[
  {
    "path": ".gradle/5.1.1/gc.properties",
    "content": ""
  },
  {
    "path": ".gradle/buildOutputCleanup/cache.properties",
    "content": "#Tue Mar 02 01:28:27 UTC 2021\ngradle.version=5.1.1\n"
  },
  {
    "path": ".gradle/vcs-1/gc.properties",
    "content": ""
  },
  {
    "path": ".idea/.gitignore",
    "content": "# Default ignored files\n/shelf/\n/workspace.xml\n"
  },
  {
    "path": ".idea/codeStyles/Project.xml",
    "content": "<component name=\"ProjectCodeStyleConfiguration\">\n  <code_scheme name=\"Project\" version=\"173\">\n    <codeStyleSettings language=\"XML\">\n      <indentOptions>\n        <option name=\"CONTINUATION_INDENT_SIZE\" value=\"4\" />\n      </indentOptions>\n      <arrangement>\n        <rules>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>xmlns:android</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>xmlns:.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*:id</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*:name</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>name</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>style</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>ANDROID_ATTRIBUTE_ORDER</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>.*</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n        </rules>\n      </arrangement>\n    </codeStyleSettings>\n  </code_scheme>\n</component>"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <bytecodeTargetLevel target=\"11\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" charset=\"UTF-8\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleMigrationSettings\" migrationVersion=\"1\" />\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"testRunner\" value=\"PLATFORM\" />\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleHome\" value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3/bin\" />\n        <option name=\"gradleJvm\" value=\"1.8\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/is-Engine.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.id=\"is-Engine\" external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$\" external.system.id=\"GRADLE\" external.system.module.group=\"\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"java-gradle\" name=\"Java-Gradle\">\n      <configuration>\n        <option name=\"BUILD_FOLDER_PATH\" value=\"$MODULE_DIR$/build\" />\n        <option name=\"BUILDABLE\" value=\"false\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <excludeFolder url=\"file://$MODULE_DIR$/.gradle\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>"
  },
  {
    "path": ".idea/jarRepositories.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RemoteRepositoriesConfiguration\">\n    <remote-repository>\n      <option name=\"id\" value=\"central\" />\n      <option name=\"name\" value=\"Maven Central repository\" />\n      <option name=\"url\" value=\"https://repo1.maven.org/maven2\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"jboss.community\" />\n      <option name=\"name\" value=\"JBoss Community repository\" />\n      <option name=\"url\" value=\"https://repository.jboss.org/nexus/content/repositories/public/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"Google\" />\n      <option name=\"name\" value=\"Google\" />\n      <option name=\"url\" value=\"https://maven.google.com/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"BintrayJCenter\" />\n      <option name=\"name\" value=\"BintrayJCenter\" />\n      <option name=\"url\" value=\"https://jcenter.bintray.com/\" />\n    </remote-repository>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_11\" default=\"false\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\" />\n</project>"
  },
  {
    "path": ".idea/modules/app/is-Engine.app.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.id=\":app\" external.linked.project.path=\"$MODULE_DIR$/../../../app\" external.root.project.path=\"$MODULE_DIR$/../../..\" external.system.id=\"GRADLE\" external.system.module.group=\"is-Engine\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"android-gradle\" name=\"Android-Gradle\">\n      <configuration>\n        <option name=\"GRADLE_PROJECT_PATH\" value=\":app\" />\n        <option name=\"LAST_SUCCESSFUL_SYNC_AGP_VERSION\" value=\"3.4.2\" />\n        <option name=\"LAST_KNOWN_AGP_VERSION\" value=\"3.4.2\" />\n      </configuration>\n    </facet>\n    <facet type=\"native-android-gradle\" name=\"Native-Android-Gradle\">\n      <configuration>\n        <option name=\"SELECTED_ABI\" />\n        <option name=\"SELECTED_VARIANT\" />\n      </configuration>\n    </facet>\n    <facet type=\"android\" name=\"Android\">\n      <configuration>\n        <option name=\"SELECTED_BUILD_VARIANT\" value=\"debug\" />\n        <option name=\"ASSEMBLE_TASK_NAME\" value=\"assembleDebug\" />\n        <option name=\"COMPILE_JAVA_TASK_NAME\" value=\"compileDebugSources\" />\n        <afterSyncTasks>\n          <task>generateDebugSources</task>\n        </afterSyncTasks>\n        <option name=\"ALLOW_USER_CONFIGURATION\" value=\"false\" />\n        <option name=\"MANIFEST_FILE_RELATIVE_PATH\" value=\"/src/main/AndroidManifest.xml\" />\n        <option name=\"RES_FOLDER_RELATIVE_PATH\" value=\"/src/main/res\" />\n        <option name=\"RES_FOLDERS_RELATIVE_PATH\" value=\"file://$MODULE_DIR$/../../../app/src/main/res;file://$MODULE_DIR$/../../../app/src/debug/res;file://$MODULE_DIR$/../../../app/build/generated/res/rs/debug;file://$MODULE_DIR$/../../../app/build/generated/res/resValues/debug\" />\n        <option name=\"TEST_RES_FOLDERS_RELATIVE_PATH\" value=\"file://$MODULE_DIR$/../../../app/src/androidTest/res;file://$MODULE_DIR$/../../../app/src/androidTestDebug/res;file://$MODULE_DIR$/../../../app/build/generated/res/rs/androidTest/debug;file://$MODULE_DIR$/../../../app/build/generated/res/resValues/androidTest/debug\" />\n        <option name=\"ASSETS_FOLDER_RELATIVE_PATH\" value=\"/src/main/assets\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" LANGUAGE_LEVEL=\"JDK_1_7\">\n    <output url=\"file://$MODULE_DIR$/../../../app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes\" />\n    <output-test url=\"file://$MODULE_DIR$/../../../app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes\" />\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$/../../../app\">\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../app/src/main/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../app/src/main/assets\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../app/src/main/res\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../app/build/generated/source/buildConfig/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../app/build/generated/res/resValues/debug\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../app/build/generated/source/apt/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../app/src/main/cpp\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/../../../app/.cxx\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/../../../app/.externalNativeBuild\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/../../../app/.gradle\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/../../../app/build\" />\n    </content>\n    <content url=\"file://$MODULE_DIR$/../../../libs\">\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../libs\" />\n    </content>\n    <orderEntry type=\"jdk\" jdkName=\"Android API 30 Platform\" jdkType=\"Android SDK\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>"
  },
  {
    "path": ".idea/modules/is-Engine.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.id=\"is-Engine\" external.linked.project.path=\"$MODULE_DIR$/../..\" external.root.project.path=\"$MODULE_DIR$/../..\" external.system.id=\"GRADLE\" external.system.module.group=\"\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"java-gradle\" name=\"Java-Gradle\">\n      <configuration>\n        <option name=\"BUILD_FOLDER_PATH\" value=\"$MODULE_DIR$/../../build\" />\n        <option name=\"BUILDABLE\" value=\"false\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" LANGUAGE_LEVEL=\"JDK_1_7\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$/../..\">\n      <excludeFolder url=\"file://$MODULE_DIR$/../../.gradle\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/is-Engine.iml\" filepath=\"$PROJECT_DIR$/.idea/is-Engine.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/app/is-Engine.app.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/app/is-Engine.app.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$/app/src/main/bin-web/_deps/freetype2-src\" vcs=\"Git\" />\n    <mapping directory=\"$PROJECT_DIR$/app/src/main/bin-web/_deps/glm-src\" vcs=\"Git\" />\n    <mapping directory=\"$PROJECT_DIR$/app/src/main/bin-web/_deps/libnyquist-src\" vcs=\"Git\" />\n    <mapping directory=\"$PROJECT_DIR$/app/src/main/bin-web/_deps/smk-src\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required (VERSION 3.1) \n\nproject(isengine)\n\nset(ISENGINE_PC true) # This confirms that we are using is::Engine to develop on PC (Windows / Linux)\nset(ISENGINE_MAIN_DIR  \"${CMAKE_CURRENT_SOURCE_DIR}/app/src/main\")\nset(ISENGINE_SRC_DIR   \"${CMAKE_CURRENT_SOURCE_DIR}/app/src/main/cpp\")\nset(ISENGINE_CMAKE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/app/src/main/cmake\")\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)\n\n# SFML on Windows OS\nif (WIN32)\n\tset (SFML_DIR \"C:/SFML/lib/cmake/SFML\")\n    set(SFML_STATIC_LIBRARIES TRUE)\n\t\n\t# OpenAL lib\n\tfile(COPY \"C:/SFML/bin/openal32.dll\" DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})\t\nendif()\n\n# Find SFML\nfind_package(SFML REQUIRED  COMPONENTS system window graphics network audio)\n\ninclude(${ISENGINE_CMAKE_DIR}/isengine.cmake)\ninclude(${ISENGINE_CMAKE_DIR}/app_src.cmake)\n\n# game resources files (image, sound, music, ...)\nfile(COPY ${ISENGINE_MAIN_DIR}/assets DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})\n\nadd_executable(isengine\n    ${isengine}\n\t${app_src}\n\t${ISENGINE_CMAKE_DIR}/resource.rc # application icon\n)\n\ntarget_include_directories(isengine PRIVATE include)\ntarget_link_libraries(isengine sfml-system sfml-window sfml-graphics sfml-network sfml-audio)\n"
  },
  {
    "path": "LICENSE.md",
    "content": "# zlib license\n\nThis software is provided 'as-is', without any express or implied warranty. In\nno event will the authors be held liable for any damages arising from the use\nof this software.\n\nPermission is granted to anyone to use this software for any purpose, including\ncommercial applications, and to alter it and redistribute it freely, subject to\nthe following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not claim\n     that you wrote the original software. If you use this software in a product,\n     an acknowledgment in the product documentation would be appreciated but is\n     not required.\n\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n\n  3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "README.md",
    "content": "![header](./images/is_Engine_logo.png)\n----------------------------\n\n# is::Engine (Infinity Solutions::Engine) 4.0.1\nOpen source C++ framework which uses the mechanisms of **SFML 2** and which also allows to develop with several libraries at the same time **(SDL 2, Emscripten)** in order to easily export your games / applications on the **Nintendo Switch, Web (HTML 5), Mobile** and **PC (Windows, Linux, macOS)**.\n\n## Contents\n- [Features](#features)\n- [What's new in this version](#whats-new-in-this-version)\n- [Extras](#extras)\n- [Game Engine User Guide and Youtube Tutorial](#game-engine-user-guide-and-youtube-tutorial)\n- [Example of a project created with the engine](#example-of-a-project-created-with-the-engine)\n- [Hello Scene Example](#hello-scene-example)\n- [Prerequisites](#prerequisites)\n- [How to use is::Engine with the different development tools](#how-to-use-isengine-with-the-different-development-tools)\n- [Description of the project structure](#description-of-the-project-structure)\n- [How to update an is::Engine project](#how-to-update-an-isengine-project)\n- [Special things to know about the engine](#special-things-to-know-about-the-engine)\n- [How to activate the use of Admob](#how-to-activate-the-use-of-admob)\n- [Contribute](#contribute)\n\n## \n\n[![SFML logo](https://www.sfml-dev.org/images/logo.png)](https://www.sfml-dev.org) [![SDL](https://i48.servimg.com/u/f48/20/16/75/27/sdl_li10.png)](https://www.libsdl.org/) ![Web](https://i48.servimg.com/u/f48/20/16/75/27/web_lo10.png) [![Box2D Logo](https://box2d.org/images/logo.svg)](https://github.com/erincatto/box2d) [![Tiled Logo](https://i.servimg.com/u/f48/20/16/75/27/tiled_10.png)](https://www.mapeditor.org) [![Admob Logo](https://i48.servimg.com/u/f48/20/16/75/27/admob_10.png)](https://admob.google.com/) [![Tiny File Dialog](https://a.fsdn.com/allura/p/tinyfiledialogs/icon?1582196333?&w=90)](https://github.com/native-toolkit/tinyfiledialogs) [![VS logo](https://i48.servimg.com/u/f48/20/16/75/27/vs_ima12.png)](https://visualstudio.microsoft.com/fr/vs/community/)\n\n## Features\n- Run SFML game / application on SDL 2 (Like an Emulator)\n- Language manager (English and French language support by default)\n- Scene System\n- Automatic management of a window\n- Multi support for development tools ([Nintendo-Switch](#-nintendo-switch),\n[Android Studio](#-android-studio), \n[Qt](#-qt), \n[CMake](#-cmake), \n[Emscripten](#-web-html-5---css-3), \n[Visual Studio Code](#-visual-studio-code), \n[Code::Block](#-codeblocks), \n[Visual Studio](#-visual-studio)\n- [is::LibConnect](#islibconnect)\n- [Web Push Notification](#-web-push-notification)\n- SDM (Step and Draw Manager)\n- GSM (Game Sound Manager)\n- GRM (Graphics Resources Manager)\n- CFF (CMake Files Fusion)\n- [TMX Lite](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-TMXLite)\n- [TMX Loader (Old version)](https://github.com/Is-Daouda/is-Engine-TMXLoader)\n- Entity system\n- Object Event System\n- [Button System](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-TinyFileDialog)\n- Background System\n- [Game Slider](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-GameSlider)\n- [Sprite Animation](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-GameSlider)\n- Basic collision engine\n- [2D physic engine (Box 2D)](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-Box2D)\n- Message Box System (Modifiable appearance via Sprites and Font)\n- Dialog Box System (as for RPG games)\n- [[Windows, Linux] Tiny File Dialogs to manage the dialog boxes of type: Message, File Save, Load File, Folder Selection](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-TinyFileDialog)\n- [Game Configuration System (sound, music, language, keyboard key, file path, ...)](./app/src/main/cpp/app_src/config/GameConfig.h)\n- Game Save System\n- [[Android] Virtual Game Pad with 6 keys (multi directional cross and A - B button)](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-VirtualGamePad)\n- [[Android] Virtual Game Pad Configuration (Adjust Position, transparency, ...)](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-VirtualGamePad)\n- [[Android] Show Ad Banner](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-Admob)\n- [[Android] Show Reward Video](https://github.com/Is-Daouda/is-Engine-Example-Pack/tree/main/is-Engine-Admob)\n\n## What's new in this version\n- [Using Visual Studio and SDL 2 to develop with SFML.](#-visual-studio-sdl-2)\n- Bug Fixes\n\n### 4.0.1\n- Nintendo Switch Support\n- The **[Demo](https://github.com/Is-Daouda/is-Engine-Demo)** and **[tutorials](https://github.com/Is-Daouda/is-Engine-Tutorial)** are compatible with the Nintendo Switch.\n- Visual Studio 2022 can be used with all projects.\n- Vertex Arrays support (Simulation with SDL 2).<br>\nWhen you want to use a texture with vertices, you must set the optional parameter **useWithVertices** to **true** in the **loadFromFile()** function, which is necessary when using SFML with SDL2.\n```cpp\n    sf::Texture texture;\n    texture.loadFromFile(\"image.png\", true);\n```\n\n## Extras\n- Here is a **Web Game : Arkanoid** created thanks to the **[game engine tutorial](https://youtu.be/wo2-ofNB7Hw)**.<br>\n**It's a Web Game so it's playable on PC and mobile.**\n\n[![Image](https://i48.servimg.com/u/f48/20/16/75/27/arkano11.png)](https://is-daouda.github.io/)\n\n- The engine comes with a **[Demo (2D Platform Game)](https://github.com/Is-Daouda/is-Engine-Demo)** that uses only the functions of the engine, in order to show you its power and how to use it. Now imagine what you can do when you use Box 2D and the other tools!\n\n[![Image](https://i48.servimg.com/u/f48/20/16/75/27/demo_s15.png)](https://github.com/Is-Daouda/is-Engine-Demo)\n\n- [Example Pack](https://github.com/Is-Daouda/is-Engine-Example-Pack) that show how to use the various features of the game engine.\n\n## Game Engine User Guide and Youtube Tutorial\n- [English version](./doc/isEngine_api_doc_eng.html)\n- [French version](./doc/isEngine_api_doc_fr.html)\n- [Youtube tutorial : How to import an SFML project into is::Engine](https://youtu.be/x_YQLHoPMbc)\n- [Youtube tutorial : How to create a game (Arkanoid) with the game engine](https://youtu.be/wo2-ofNB7Hw)\n\n## Example of a project created with the engine\n- [I Can Transform](https://www.gamepix.com/play/i-can-transform)\n- [GravytX The Gravytoid](https://www.gamepix.com/play/Gravytx-the-gravytoid)\n\n## Hello Scene Example\nHere is an example code of a Scene (the place where the game objects come to life).\n**In less than 50 lines of code, the engine allows to:**\n- Change the language of the game (English / French)\n- Display an RPG type message with interaction\n- Animate an **[object](./app/src/main/cpp/app_src/objects/HelloWorld.h)** with the possibility of interacting with it (by clicking / touching it)\n- Load resources (Textures, Music)\n- Play music\n- Display a background that scrolls vertically and horizontally with a speed\n- Manages the display depth of each object\n- Automatically manages the game window (closing confirmation, events, ...)\n- Change the background color of the window (scene color)\n\n```cpp\nclass HelloScene : public is::GameDisplay {\npublic:\n    HelloScene(is::GameSystemExtended &gameSysExt):\n        GameDisplay(gameSysExt, sf::Color::White /* => scene color*/) {}\n\n    void loadResources() {\n        m_gameSysExt.m_gameLanguage = is::lang::ENGLISH; // set default game language\n\n        // uncomment to change English language in French\n        // m_gameSysExt.m_gameLanguage = is::lang::FRANCAIS;\n\n        // load font and texture\n        GameDisplay::loadParentResources(); // allows to load system resource (very important never forgot to call him)\n        GRMaddTexture(\"hello_world\", is::GameConfig::SPRITES_DIR + \"hello_world.png\");\n        auto &texBg = GRMaddTexture(\"background\", is::GameConfig::TILES_DIR + \"background.png\");\n        auto &texDialog = GRMaddTexture(\"dialog_box\", is::GameConfig::GUI_DIR + \"dialog_box.png\");\n\n        // add a background to the position x = 0, y = 0 which will fill the scene and which will be scrolled (scrolling speed = 0.5)\n        SDMaddSceneObject(std::make_shared<is::Background>(texBg, 0.f, 0.f, this, 0.5f, -0.5f, false, false));\n\n        // add an object at position x = 0, y = 0 which will be updated and displayed in the scene\n        SDMaddSceneObject(std::make_shared<HelloWorld>(0.f, 0.f, this));\n\n        // add RPG style game dialog\n        auto gameDialog = std::make_shared<is::GameDialog>(texDialog, GRMgetFont(\"font_msg\"), this);\n        gameDialog->setDepth(-2); // the display depth (make it appear on all objects. The object with the smallest value appears on the others)\n        gameDialog->setDialog(is::GameDialog::DialogIndex::DIALOG_HELLO); // set the corresponding dialog (See GameDialog.h and GameLanguage.h for more details on creating a message for dialogue)\n        SDMaddSceneObject(gameDialog);\n\n        GSMaddSound(\"game_music\", is::GameConfig::MUSIC_DIR + \"game_music.wav\"); // add music\n        GSMplaySound(\"game_music\"); // play music\n    }\n};\n```\n\n## Prerequisites\n- [SFML Library (2.4 +)](https://www.sfml-dev.org/download.php)\n- [SDL 2 (2.0.12 +)]()\n- GCC Compiler (7.3 +)\n\n---\n\n## How to use is::Engine with the different development tools:\n## ![switch](https://i48.servimg.com/u/f48/20/16/75/27/switch10.png) Nintendo Switch\nThis project uses the template of **[carstene1ns](https://github.com/carstene1ns/switch-sdl2-demo)**.\n\n**1. Prerequisites**\n- DevkitPro with MSYS2\n\n## ![danger](https://i48.servimg.com/u/f48/20/16/75/27/icon_d10.png) Very important\n- Not affiliated with Nintendo.\n- All your source files (only .cpp or .c) must be located in the root of the **[cpp](./app/src/main/cpp/)** folder otherwise the compiler will not find them!\n- The Switch uses the same touch functions as Android.\n- The engine has been configured so that you can use the PC functions **keyIsPressed(is::GameConfig::KEY_UP)** or **keyIsPressed(is::GameConfig::KEY_A), etc.** on the Switch.\n- Some SFML functions like: **Render Texture** are not yet supported. These additions will be made soon!\n\n**2. Installation**\n##### Windows\n1. Download [devkitPro](https://github.com/devkitPro/installer/releases/download/v3.0.3/devkitProUpdater-3.0.3.exe) and install it in **C:/devkitPro/**.\n2. During installation:\n- Check \"devkitA64\" (for Switch)\n- Check \"MSYS2 Base System\"\n- Check \"portlibs\" if available\n3. Once installed, open the MSYS2 terminal (C:\\devkitPro\\msys2\\msys2.exe)\n4. Enter these commands in the console to download libraries:\n```bash\npacman -Syu\npacman -S switch-sdl2 switch-sdl2_image switch-sdl2_mixer switch-sdl2_net switch-sdl2_ttf\n```\n6. Move the **is-Engine** project to your **C:/ (C:/is-Engine)**.\n7. Run the file **[copy_assets.cmd](./app/src/main/copy_assets.cmd)** so that it transfers your resources which are in the **[assets](./app/src/main/assets) folder** to romfs (this folder will be created when executing the copy_assets.cmd file) necessary for the compilation.\n8. Enter these commands in the console:\n```bash\ncd c:/is-Engine/app/src/main/\nmake\n```\n\nIf all goes well you will have a **main.nro file** in the [main](./app/src/main/) folder that you can launch via Nintendo Switch emulators (Yuzu, Ryujinx, ...).\n\n![Image](./images/demo_screen.png)\n\n**Enjoy!**\n\n---\n\n## ![android](https://i48.servimg.com/u/f48/20/16/75/27/icon_a10.png) Android Studio\nThis project uses the template of **[Georgik](https://github.com/georgik/sdl2-android-example)** and **[Lauchmelder23](https://github.com/Lauchmelder23/SDLU)**.\n\n**1. Prerequisites**\n- Android Studio (4.0.1 +)\n- Android SDK and NDK (r20b)\n\n## ![danger](https://i48.servimg.com/u/f48/20/16/75/27/icon_d10.png) Very important\n- On Android SFML games run with SDL library. If you want to use SDL functions in your source code, use the **IS_ENGINE_SDL_2 macro**.\n- The audio format supported at the moment is **.WAV**\n- Some SFML functions like: **Render Texture** are not yet supported. These additions will be made soon!\n- **Your help to improve the engine will be welcome!**\n- [Please read this](#Contribute).\n\n**2. Installation**\n##### Windows\n1. Download [Android Studio 3.x](https://developer.android.com/studio) (recommended version 4.0.1).\n2. Download the [Android SDK](https://developer.android.com/studio) and install it in **C:/Android/SDK**.\n3. Download [Android NDK android-ndk-r20b-windows-x86_64](https://developer.android.com/ndk/downloads/older_releases.html) and create a folder on your disk as follows **C:/Android/NDK** then extract the contents of the zip in this folder.\n4. Set the environment variable **ANDROID_NDK** with the path **C:/Android/NDK**.\n6. Move the **is-Engine** project to your **C:/ (C:/is-Engine)**.\n7. Open the **is-Engine** folder with **Android Studio** and start the compilation.\n\nIf all goes well you will have a **Hello World Screen** on your **Android emulator**.\n\n![Image](./images/demo_screen.png)\n\n**Enjoy!**\n\n**2. How to replace the package name (com.author.isengine) of the application**\n- Follow these steps carefully. A single error and the application will crash wonderfully when launching on emulator / mobile!\n1. Replace this line in the [gradle.app](./app/build.gradle#L32) file.\n2. Replace this line in the [AndroidManifest.xml](./app/src/main/AndroidManifest.xml#L3) file.\n3. Replace this line in the [SDLActivity.java](./app/src/main/java/com/author/isengine/SDLActivity.java#L1) file.\n4. Replace the abresence **[com/author/isengine](./app/src/main/java/com/author/isengine/)** in which is the file [SDLActivity.java](./app/src/main/java/com/author/isengine/SDLActivity.java#L1) that you have just modified at the top by yours (example **com/yourname/yourgamename**).\n5. Replace this part **..._ com_author_isengine _...** of line [20](./app/src/main/cpp/SDL_android_main.c#L20) and [23](./app/src/main/cpp/SDL_android_main.c#L23) in the file [SDL_android_main.c](./app/src/main/cpp/SDL_android_main.c#L20) by yours (example **com_yourname_yourgamename)**.\n6. Replace this part **..._ com_author_isengine _...** on the 23 lines of the file [SDL_android.c](./libs/SDL2/src/core/android/SDL_android.c#L156) by yours (example **com_yourname_yourgamename**).\n- **I strongly advise you to use the replace function of your text editor** (on Notepad++ we use Ctrl + F + Replace option).\n7. Replace this line in the [GameConfig.h](./app/src/main/cpp/app_src/config/GameConfig.h#L148) file.\n- Note that this part is only required if you want to use the game engine data save / load functions.\n\n**3. Adding Source Files**\n- So that Android Studio can detect your source files (.cpp) you must include them in the **[app_src.cmake](./app/src/main/cmake/app_src.cmake) or [isengine.cmake](./app/src/main/cmake/isengine.cmake)** file which is located in the **[is-Engine/app/src/main/cmake](./app/src/main/cmake/)** location.\n\n**4. Application location**\n- The application can be found in **is-Engine/app/build/outputs/apk**.\n\n---\n\n## ![web](https://i48.servimg.com/u/f48/20/16/75/27/icon_w10.png) Web (HTML 5 - CSS 3)\nIf you want to make your SFML project compatible with the Web (Be able to run it in a web browser), please watch this **[video tutorial](https://youtu.be/x_YQLHoPMbc)**.<br>\n![danger](https://i48.servimg.com/u/f48/20/16/75/27/icon_d10.png) Now you can put texts and geometric shapes (Rectangle, Circle) in Outline on the Web **(It was not available in the old versions)**!\n\n**1. Prerequisites**\n- Emscripen (1.39.7 +)\n- Python (3.8.1 +)\n- CMake (3.1 +)\n- Java\n- SDL 2 **(It is downloaded with the internet connection when executing commands)**\n\n**2. Installation**\n##### Windows\n1. Download [Emscripten](https://github.com/emscripten-core/emsdk) and install it in **C:/emsdk**, define its path in the environment variable **Path**\n2. Download [Python](https://www.python.org/downloads/release/python-381/) after installation, define its path in the environment variable **Path**\n3. Download [CMake](https://cmake.org/download/) after installation, define its path in the environment variable **Path**\n4. Download [Java](https://www.oracle.com/java/technologies/javase-jre8-downloads.html) after installation, define its path in the environment variable **Path**\n5. Move the **is-Engine** project to your **C:/ (C:/is-Engine)**.\n6. Execute this command :\n```bash\ncd c:/is-Engine/app/src/main\nmkdir bin-web\ncd bin-web\nemsdk activate latest\nemcmake cmake ..\nmake -j3\npython -m http.server\n```\n7. Visit this url **localhost:8000** in your **Web Browser**.\n\nIf all goes well you will have a **Hello World Screen** on your **Web Browser**.\n\n![Image](./images/demo_screen.png)\n\n**Enjoy!**\n\n**3. Adding Source Files**\n- In order for CMake to detect your source files (.cpp) you must include them in the **[app_src.cmake](./app/src/main/cmake/app_src.cmake) or [isengine.cmake](./app/src/main/cmake/isengine.cmake)** file which is located in the **[is-Engine/app/src/main/cmake](./app/src/main/cmake/)** location.\n\n## ![danger](https://i48.servimg.com/u/f48/20/16/75/27/icon_d10.png) Very important\n- **is::Engine** works on the Web thanks to **SDL 2**.\n- These libraries: **TMXLite, TMXLoader, TinyFileDialog** are not supported in the web version of is::Engine.\n- If you want to use SDL functions in your source code, use the **IS_ENGINE_SDL_2 macro**.\n- Note that some SFML functions like: **Render Texture** are not yet supported. These additions will be made soon!\n\n---\n\n## ![Web Push Notification](https://i48.servimg.com/u/f48/20/16/75/27/notif_10.png) Web Push Notification\n- If you want to make your SFML project compatible with the Web (Be able to run it in a web browser), please watch this **[video tutorial](https://youtu.be/x_YQLHoPMbc)**.\n\n- ![danger](https://i48.servimg.com/u/f48/20/16/75/27/icon_d10.png)<br>\nBy default the web push notification has been disabled. Because to make it work you must have an internet connection. In case there is no internet access and it is not well launched, it can prevent the execution of the web program.<br>\nTo enable it, please modify these lines in **[index.html](./app/src/main/web/index.html)** : **[7](./app/src/main/web/index.html#L7), [23](./app/src/main/web/index.html#L23), [108](./app/src/main/web/index.html#L108)**\n\n#### Installation\n- This shows how to test the push notification. Note that normally to use it, you have to associate it with a database (backend). But here we will use it with the **Push Companion** site **(It will serve as a backend for us!)**.\n- For more information on Push Notification please see this [page](https://developers.google.com/web/fundamentals/codelabs/push-notifications).\n1. Web browser ([preferably Google Chrome](https://www.google.fr/chrome/?brand=CHBD&brand=XXVF&gclid=EAIaIQobChMI7a315b6c7gIVEKSyCh0O8QJjEAAYASABEgJfd_D_BwE&gclsrc=aw.ds))\n2. [Web server for Chrome](https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb) or your own web server.\n3. Define the **Application Server Keys** in the [main.js](./app/src/main/web/scripts/main.js#L25) file. You can get this keys (We will use the public key) [here](https://web-push-codelab.glitch.me/).\n4. Launch the **[web](./app/src/main/web)** or **bin-web folder (generate using emscripten)** via the web server.\n5. Click on the **\"Enable Push Messaging\" button** to activate the sending of Push Notifications. Once done you will have a code (which can be used to send you push notifications).\n6. Go to this [site](https://web-push-codelab.glitch.me/) and enter the code in the **\"Subscription to Send To\" text field** followed by your message in **\"Text to Send\" text field**. Click on the **\"Send Push Message\" button**.\n7. If all goes well you will have a push notification followed by the message you sent in the console (development tool) of your browser.\n\n![image](https://i.servimg.com/u/f48/20/16/75/27/image10.jpg)\n\n#### Configure the Push Notification\n1. To change the **information (title, details, ...)** of the Push Notification you must refer to the [sw.js](./app/src/main/web/sw.js#L28) file.\n2. To change the **Push Notification image** files, refer to the [images](./app/src/main/web/images) folder.\n3. To change the **page that is launched** when you click on the notification, refer to the [sw.js](./app/src/main/web/sw.js#L45) file.\n\n---\n\n## ![cmake](https://i48.servimg.com/u/f48/20/16/75/27/icon_c11.png) CMake\n**1. Prerequisites**\n- CMake (3.1 +)\n\n**2. Installation**\n#### Windows\n1. Compile SFML with CMake to have **static libraries** and put on **C:/ (C:/SFML)**.\n2. Move the **is-Engine** project to your **C:/ (C:/is-Engine)**.\n3. Execute this command :\n```bash\ncmake -S \"C:/is-Engine\" -B \"C:/build\"\ncd build\nmake\n```\n\n#### Linux\n1. Install SFML 2.5.1 on your machine.\n2. Move the **is-Engine** project to **/home/user/ (/home/user/is-Engine)**.\n3. Execute this command :\n```bash\nsudo cmake -S \"is-Engine\" -B \"build\"\ncd build\nsudo make\n```\n\n**3. After installation**\n- You will have a **bin** folder in which the engine demo is located.\n\n**5. Adding Source Files**\n- In order for CMake to detect your source files (.cpp) you must include them in the **[app_src.cmake](./app/src/main/cmake/app_src.cmake) or [isengine.cmake](./app/src/main/cmake/isengine.cmake)** file which is located in the **[is-Engine/app/src/main/cmake](./app/src/main/cmake/)** location.\n\n---\n\n## ![vs](https://i48.servimg.com/u/f48/20/16/75/27/vs_ima11.png) Visual Studio\n\n**1. Installation**\n#### Windows\nDownload Visual Studio Community 2022 [here](https://visualstudio.microsoft.com/fr/vs/community/) and install it.\n\n**2. Opening the project with the IDE:**\n#### Windows\nOpen the file **vs-sfml.sln** in the location **[is-Engine/app/src/main/](./app/src/main/)**\n\n---\n\n## ![vssdl](https://i48.servimg.com/u/f48/20/16/75/27/vs_ima11.png) Visual Studio SDL 2\n\n**1. Installation**\n#### Windows\n1. Download Visual Studio Community 2022 [here](https://visualstudio.microsoft.com/fr/vs/community/) and install it.\n2. Download this [file](https://github.com/GlowCheese/SDL2-Setup/releases/download/v1.1.0/SDL2.Compiler.zip) and extract it to C:\\ (**the location of the folder must be C:\\SDL2-2.26.3. Otherwise it will not work.**).\n\n**2. Opening the project with the IDE:**\n#### Windows\nOpen the file **SDL2_SFML.sln** in the location **[is-Engine/app/src/main/](./app/src/main/)**\n\n---\n\n## ![qt](https://i48.servimg.com/u/f48/20/16/75/27/qt_ico10.png) Qt\n\n**1. Installation**\n#### Windows\n1. Download Qt 5.12.9 MinGW [here](http://qtproject.mirror.liquidtelecom.com/archive/qt/5.12/5.12.9/qt-opensource-windows-x86-5.12.9.exe) and install it.\n2. Download this [version of SFML](https://github.com/Is-Daouda/SFML_Qt_MinGW) already compiled for Qt 5.12.9 and extract it in **C:/ (C:/SFML_Qt_MinGW)**.\n\n**2. Opening the project with the IDE:**\n\n#### Windows\n1. Run the file **open_qt_creator.bat** in the main directory *(Make sure you have included the path to the Qt executable in your PATH environment variable)*.\n2. Or open the file **is-Engine.pro** in the location **[is-Engine/app/src/main/qt](./app/src/main/qt/)**\n\n**3. Executable location**\n- The compiler files can be found in **is-Engine/app/src/main/bin-Qt**.\n\n---\n\n## ![vsc](https://i48.servimg.com/u/f48/20/16/75/27/icon_v10.png) Visual Studio Code\nThis project uses the template of **andrew-r-king**. For more information on this template [click here](https://github.com/andrew-r-king/sfml-vscode-boilerplate).\n\n**1. Prerequisites**\n#### Windows\n- [SFML 2.5.1 - GCC 7.3.0 MinGW (DW2) 32-bit](https://www.sfml-dev.org/files/SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit.zip)\n- [GCC 7.3.0 MinGW (DW2) 32-bit](https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.3.0/threads-posix/dwarf/i686-7.3.0-release-posix-dwarf-rt_v5-rev0.7z/download)\n- [Git Bash](https://git-scm.com/downloads)\n\n#### Linux\n- Get SFML 2.5.1 from your distro if it has it, or compile from source.\n\n**2. Installation**\n#### Windows\n1. Download & Extract SFML 2.5.1 to **C:/SFML/** where the bin/lib/include folders are contained within.\n2. Download & Extract MinGW to **C:/mingw32/** where the bin/lib/include folders are contained within.\n\n#### Linux\n1. Ensure the GCC Toolchain is installed (**sudo apt install build-essential**).\n2. Run **sudo apt install libsfml-dev**. The SFML version you got will vary depending on the distro. 2.5.1 is included in [Ubuntu 19.04 Disco Dingo](http://cdimage.ubuntu.com/daily-live/current/HEADER.html) for example.\n\n**3. Opening the project with the IDE:**\n- Rename the **Makefile-vscode** file to **Makefile** in **[is-Engine/app/src/main/](./app/src/main/)**.\n#### Windows\n1. Run the file **open_vscode.bat** in the main directory.\n\n#### Linux\n2. Execute this command in the main directory:\n```bash\ncode -n \"./app/src/main\"\n```\n\n#### All\n3. Or open the **[is-Engine/app/src/main](./app/src/main/)** folder with **Solution Explorer**.\n\n**4. Executable location**\n- The compiler files can be found in **is-Engine/app/src/main/bin-vscode**.\n\n---\n\n## ![cb](https://i48.servimg.com/u/f48/20/16/75/27/icon_c10.png) Code::Blocks\n\n**1. Installation**\n#### Windows\n1. Download Code::Blocks 20.03 MinGW [here](https://sourceforge.net/projects/codeblocks/files/Binaries/20.03/Windows/codeblocks-20.03mingw-setup.exe/download) and install it.\n2. Download this [version of SFML](https://github.com/Is-Daouda/SFML_CB_MinGW) already compiled for Code::Blocks 20.03 and extract it in **C:/ (C:/SFML_CB_MinGW)**.\n\n#### Linux\n1. Download Code::Blocks 20.03 and install it.\n2. Ensure the GCC Toolchain is installed (**sudo apt install build-essential**).\n3. Run **sudo apt install libsfml-dev**. The SFML version you got will vary depending on the distro. 2.5.1 is included in [Ubuntu 19.04 Disco Dingo](http://cdimage.ubuntu.com/daily-live/current/HEADER.html) for example.\n\n**2. Opening the project with the IDE:**\n#### Windows\n1. Run the file **open_codeblocks.bat** in the main directory *(Make sure you have included the path to the Code::Blocks executable in your PATH environment variable)*.\n2. Or open the file **is-Engine-windows.cbp** in the location **[is-Engine/app/src/main](./app/src/main/)**\n\n#### Linux\n1. Execute this command in the main directory:\n```bash\ncodeblocks \"./app/src/main/is-Engine-linux.cbp\"\n```\n2. Or open the file **is-Engine-linux.cbp** in the location **[is-Engine/app/src/main](./app/src/main/)**.\n\n**3. Executable location**\n- The compiler files can be found in **is-Engine/app/src/main/bin-codeblocks**.\n\n---\n\n## ![cb](https://i48.servimg.com/u/f48/20/16/75/27/icon_c10.png) Develop SFML games with SDL 2\n\n**1. Installation**\n#### Windows\n1. Download Code::Blocks 20.03 MinGW [here](https://sourceforge.net/projects/codeblocks/files/Binaries/20.03/Windows/codeblocks-20.03mingw-setup.exe/download) and install it.\n2. Download this [version of SDL 2](https://github.com/Is-Daouda/SDL2) and extract it in **C:/ (C:/SDL2)**.\n3. Put the **.dll files** which is in the **bin** folder of SDL2 in the **[main](./app/src/main/)** folder.\n\n#### Linux\n1. Download Code::Blocks 20.03 and install it.\n2. Ensure the GCC Toolchain is installed (**sudo apt install build-essential**).\n3. Run **sudo apt install libsdl2-2.0-0 libsdl2-gfx-1.0-0 libsdl2-image-2.0-0 libsdl2-mixer-2.0-0 libsdl2-net-2.0-0 libsdl2-ttf-2.0-0** to install all SDL 2 libraries.\n\n**2. Opening the project with the IDE:**\n#### Windows\n1. Run the file **open_codeblocks_sdl.bat** in the main directory *(Make sure you have included the path to the Code::Blocks executable in your PATH environment variable)*.\n2. Or open the file **is-Engine-windows-SDL2.cbp** in the location **[is-Engine/app/src/main](./app/src/main/)**\n\n#### Linux\n1. Execute this command in the main directory:\n```bash\ncodeblocks \"./app/src/main/is-Engine-linux-SDL2.cbp\"\n```\n2. Or open the file **is-Engine-linux-SDL2.cbp** in the location **[is-Engine/app/src/main](./app/src/main/)**.\n\n**3. Executable location**\n- The compiler files can be found in **is-Engine/app/src/main/bin-codeblocks**.\n\n## ![danger](https://i48.servimg.com/u/f48/20/16/75/27/icon_d10.png) Very important\n- If you want to use SDL functions in your source code, use the **IS_ENGINE_SDL_2 macro**.\n- Note that some SFML functions like: **Render Texture** are not yet supported. These additions will be made soon!\n\n---\n\n## ![icon](https://i48.servimg.com/u/f48/20/16/75/27/icon10.png) Change application icon:\n#### Nintendo Switch\n- To change the icon of the application you must go to the location **[is-Engine/app/src/main/](./app/src/main/)**.\n\n#### Android\n- To change the icon of the application you must go to the location **[is-Engine/app/src/main/res](./app/src/main/res/)** replace all the images (PNG) which are in the **drawable** subfolders.\n\n#### Web (HTML 5 - CSS 3)\n- To change the icon of the application you must go to the location **[is-Engine/app/src/main/web](./app/src/main/web/)**.\n\n#### Windows\n- To change the icon of the application you must go to the location **[is-Engine/app/src/main/env/windows](./app/src/main/env/windows)** replace all the images **(Attention CMake uses the same resources).**\n\n#### Linux\n- To change the icon of the application you must go to the location **[is-Engine/app/src/main/env/linux](./app/src/main/env/linux)**.\n\n---\n\n## Description of the project structure:\n![header](./images/is_Engine_structure.png)\n----------------------------\n- The source files of the project can be found in the **[is-Engine/app/src/main/cpp](./app/src/main/cpp/)** location.\n\n#### 1. [main.cpp](./app/src/main/cpp/main.cpp) file\nContains the entry point of the program, inside there are two instructions :\n- `game.play()`: Launches the engine rendering loop which allows to manage the introduction screen, main menu, level and game over.\n- `game.basicSFMLmain()` (disabled by default): Launches the display of a classic SFML window. The implementation is in the **[basicSFMLmain.cpp](./app/src/main/cpp/basicSFMLmain.cpp)** file. *Very useful if you already have a project under development and you want to associate it with the engine. You can also use it to implement your own components to the engine.*\n\n----------------------------\n#### 2. [app_src](./app/src/main/cpp/app_src/) folder\nContains the source code of the game.\nDescription of these sub-directories:\n- **[activity](./app/src/main/cpp/app_src/activity/)** : Contains the **[Activity](./app/src/main/cpp/app_src/activity/GameActivity.h)** class which allows the interaction of the different scenes of the game.\n- **[config](./app/src/main/cpp/app_src/config/)** : Contains the **[GameConfig.h](./app/src/main/cpp/app_src/config/GameConfig.h)** file which allows to define the general parameters of the game. It also contains the file **[ExtraConfig.h](./app/src/main/cpp/app_src/config/ExtraConfig.h)** which allows to activate / deactivate certain engine functionality (Engine optimization, SDM, Admob, Main Render Loop, ...).\n- **[gamesystem_ext](./app/src/main/cpp/app_src/gamesystem_ext/)** : Contains **[GameSystemExtended](./app/src/main/cpp/app_src/gamesystem_ext/GameSystemExtended.h)** a class derived from **[GameSystem](./app/src/main/cpp/isEngine/system/function/GameSystem.h)** which allows to manipulate game data (save, load, ...).\n- **[language](./app/src/main/cpp/app_src/language/)** : Contains the **[GameLanguage.h](./app/src/main/cpp/app_src/language/GameLanguage.h)** file which allows to manage everything related to game languages.\n- **[levels](./app/src/main/cpp/app_src/levels/)** : Contains game levels and the **[Level.h](./app/src/main/cpp/app_src/levels/Level.h)** file which allows to integrate them into the game.\n- **[objects](./app/src/main/cpp/app_src/objects/)** : Contains the objects that will be used in the different scenes.\n- **[scenes](./app/src/main/cpp/app_src/scenes/)** : Contains the different scenes of the game (Introduction, Main menu, ...).\n\n----------------------------\n#### 3. [assets](./app/src/main/assets/) folder\nContains game resource files (music, sound sfx, image, ...)\n\n----------------------------\n#### 4. [isEngine](./app/src/main/cpp/isEngine/) folder\nContains the source code of the game engine\n\n---\n\n## Special things to know about the engine\n### is::LibConnect\nWith the is::LibConnect you can write code for a specific library. Here is how to do it:\n```cpp\nsf::Text text;\ntext.setString(\n// on PC (Windows / Linux)\n#if define(IS_ENGINE_SFML)    \n    \"We use SFML 2 library\"\n\n// When we develop for the Nintendo Switch   \n#elif define(IS_ENGINE_SWITCH)\n    \"SFML 2 on Switch\"\n\n// on Android or when you use SDL to create SFML games on PC (only for Code::Block at the moment)    \n#elif define(IS_ENGINE_SDL_2)\n    \"Run SFML 2 with SDL 2\"\n\n// When we develop for the web (HTML 5) with Emscripten    \n#elif define(IS_ENGINE_HTML_5)\n    \"SFML 2 on Web\"\n#endif\n              );\n```\n\n#### If you have discovered another way to use the game engine, don't hesitate to share it! We will put it in this Special section so that other people can benefit from it!\n\n---\n\n## How to update an is::Engine project\n1. First of all the part of is::Engine that changes most often during updates is the [isEngine](./app/src/main/cpp/isEngine/) folder. But it also happens that these files can be modified:\n- [GameActivity.h](./app/src/main/cpp/app_src/activity/GameActivity.h)\n- [GameConfig.h](./app/src/main/cpp/app_src/language/GameLanguage.h)\n- [ExtraConfig.h](./app/src/main/cpp/app_src/config/ExtraConfig.h)\n- [GameSystemExtended.h](./app/src/main/cpp/app_src/gamesystem_ext/GameSystemExtended.h)\n- [basicSFMLmain.cpp](./app/src/main/cpp/basicSFMLmain.cpp)\n- [GameLanguage.h](./app/src/main/cpp/app_src/language/GameLanguage.h)\n- And the files which is in [cmake](./app/src/main/cmake) and [web](./app/src/main/web) folder.\n- ![danger](https://i48.servimg.com/u/f48/20/16/75/27/icon_d10.png) **So watch them carefully in case you encounter any errors during migration!**\n2. To update your old project with a new version of is::Engine: the files (.h and .cpp) you need to move are in [objects](./app/src/main/cpp/app_src/objects/) and [scenes](./app/src/main/cpp/app_src/scenes/). **Note that these folders never change whatever the version!**\n\n---\n\n## How to activate the use of Admob?\nComing soon!\n\n---\n\n## Contribute\n- If you want to participate in the development of the project to help me improve the engine, please note that you are welcome! Together we go further!\n- One of the objectives of this project is to create a large community that can work on the engine to allow many people around the world to easily realize their dream games / applications!\n\n## Contacts\n  * For any help please contact me on my [email address](mailto:isdaouda.n@gmail.com)\n  * You can follow me on Twitter for more informations on my activities [@Is Daouda Games](https://twitter.com/IsDaouda_Games)\n"
  },
  {
    "path": "app/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.4.1)\n\ninclude_directories(\n        ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2/include\n\n        # SDL_internal.h is located in src required by SDL_android_main.c bridge\n        ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2/src\n\n        ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_image/include\n        ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_gfx/include\n        ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_mixer/include\n        ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_ttf/include\n)\n\nset(ISENGINE_ANDROID true) # This confirms that we are using is::Engine to develop on Android\nset(ISENGINE_SRC_DIR   \"${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp\")\nset(ISENGINE_CMAKE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/src/main/cmake\")\n\nadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2/ ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2)\nadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_image/ ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_image)\nadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_gfx/ ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_gfx)\nadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_mixer/ ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_mixer)\nadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_ttf/ ${CMAKE_CURRENT_SOURCE_DIR}/../libs/SDL2_ttf)\n\n#include_directories(${FIREBASE_INCLUDE_DIR})\n#link_directories(\"${FIREBASE_LIBRARY_DIR}${ANDROID_ABI}/c++/\")\ninclude(${ISENGINE_CMAKE_DIR}/isengine.cmake)\ninclude(${ISENGINE_CMAKE_DIR}/app_src.cmake)\n\nadd_library(\n\t\t\t isengine\n\n             SHARED\n\t\t\t \n\t\t\t # Provides a relative path to your source file(s).\n\t\t\t ${isengine}\n\t\t\t ${app_src}\n\t\t\t )\n\nfind_library( # Sets the name of the path variable.\n              log-lib\n\n              # Specifies the name of the NDK library that\n              # you want CMake to locate.\n              log )\n\ntarget_link_libraries( # Specifies the target library.\n\t\t\t\t\t\tisengine\n                        SDL2\n                        SDL2_image\n                        SDL2_gfx\n                        SDL2_mixer\n                        SDL2_ttf\n\n                        #admob\n                        #app\n\n                        ${log-lib} )"
  },
  {
    "path": "app/build.gradle",
    "content": "buildscript {\n\n    repositories {\n        google()\n        mavenLocal()\n        maven {url 'https://maven.google.com'}\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.4.2'\n        //classpath 'com.google.gms:google-services:4.0.1'\n    }\n}\n\napply plugin: 'com.android.application'\n\n/*\ndef ndkDir = System.getenv(\"ANDROID_NDK\")\ndef propertiesFile = project.rootProject.file('local.properties')\nif (propertiesFile.exists()) {\n    Properties properties = new Properties()\n    properties.load(propertiesFile.newDataInputStream())\n    ndkDir = properties.getProperty('ndk.dir')\n}\n*/\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion '28.0.3'\n\n    defaultConfig {\n        applicationId = 'com.author.isengine'\n        //Replace this with your real package name (e.g. com.StudioName.GameName)\n        minSdkVersion 19\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n        //multiDexEnabled true\n        externalNativeBuild {\n            cmake {\n                cppFlags \"-std=c++1z -std=c++14 -std=c++17 -frtti -fexceptions\"\n                arguments \"-DANDROID_STL=c++_shared\",\n                          \"-DANDROID_TOOLCHAIN=clang\" //,\n                          //\"-DFIREBASE_INCLUDE_DIR=${ndkDir}/sources/firebase_cpp_sdk/include\",\n                          //\"-DFIREBASE_LIBRARY_DIR=${ndkDir}/sources/firebase_cpp_sdk/libs/android/\"\n                abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'\n            }\n\n        }\n    }\n    buildTypes {\n        debug {\n            minifyEnabled false\n            jniDebuggable true\n            debuggable false\n        }\n        release {\n            minifyEnabled = false\n            proguardFiles.add(file('proguard-rules.txt'))\n            //proguardFile file(\"${ndkDir}/sources/firebase_cpp_sdk/libs/android/app.pro\")\n            //proguardFile file(\"${ndkDir}/sources/firebase_cpp_sdk/libs/android/admob.pro\")\n        }\n    }\n    externalNativeBuild {\n        cmake {\n            path \"CMakeLists.txt\"\n            version \"3.10.2\"\n        }\n    }\n    /*sourceSets {\n        main {\n            // let gradle pack the shared library into apk\n            jniLibs.srcDirs = [\n                    \"${ndkDir}/sources/firebase_cpp_sdk/libs/android/\"\n            ]\n        }\n    }*/\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    //implementation 'com.android.support:multidex:1.0.3'\n}"
  },
  {
    "path": "app/src/main/.vs/vs-sfml/v17/DocumentLayout.json",
    "content": "{\n  \"Version\": 1,\n  \"WorkspaceRootPath\": \"C:\\\\is-Engine\\\\app\\\\src\\\\main\\\\\",\n  \"Documents\": [],\n  \"DocumentGroupContainers\": [\n    {\n      \"Orientation\": 0,\n      \"VerticalTabListWidth\": 256,\n      \"DocumentGroups\": []\n    }\n  ]\n}"
  },
  {
    "path": "app/src/main/.vscode/_keybindings.json",
    "content": "// Place your key bindings in this file to overwrite the defaults\n[\n\t{\n\t\t\"key\": \"f8\",\n\t\t\"command\": \"-editor.action.marker.next\",\n\t\t\"when\": \"editorFocus && !editorReadonly\"\n\t},\n\t{\n\t\t\"key\": \"f9\",\n\t\t\"command\": \"-editor.debug.action.toggleBreakpoint\",\n\t\t\"when\": \"editorTextFocus\"\n\t},\n\t{\n\t\t\"key\": \"f10\",\n\t\t\"command\": \"-workbench.action.debug.stepOver\",\n\t\t\"when\": \"inDebugMode\"\n\t},\n\t{\n\t\t\"key\": \"shift+f8\",\n\t\t\"command\": \"-editor.action.marker.prev\",\n\t\t\"when\": \"editorFocus && !editorReadonly\"\n\t},\n\t{\n\t\t\"key\": \"shift+f9\",\n\t\t\"command\": \"-editor.debug.action.toggleInlineBreakpoint\",\n\t\t\"when\": \"editorTextFocus\"\n\t},\n\t{\n\t\t\"key\": \"shift+f10\",\n\t\t\"command\": \"-editor.action.showContextMenu\",\n\t\t\"when\": \"editorTextFocus\"\n\t},\n\t{\n\t\t\"key\": \"f8\",\n\t\t\"command\": \"workbench.action.debug.selectandstart\"\n\t},\n\t{\n\t\t\"key\": \"f9\",\n\t\t\"command\": \"workbench.action.tasks.runTask\",\n\t\t\"args\": \"Build & Run: Release\"\n\t},\n\t{\n\t\t\"key\": \"shift+f9\",\n\t\t\"command\": \"workbench.action.tasks.runTask\",\n\t\t\"args\": \"Run: Release\"\n\t},\n\t{\n\t\t\"key\": \"f10\",\n\t\t\"command\": \"workbench.action.tasks.runTask\",\n\t\t\"args\": \"Build & Run: Debug\"\n\t},\n\t{\n\t\t\"key\": \"shift+f10\",\n\t\t\"command\": \"workbench.action.tasks.runTask\",\n\t\t\"args\": \"Run: Debug\"\n\t},\n]"
  },
  {
    "path": "app/src/main/.vscode/c_cpp_properties.json",
    "content": "{\n\t\"configurations\": [\n\t\t{\n\t\t\t\"name\": \"Linux\",\n\t\t\t\"intelliSenseMode\": \"gcc-x64\",\n\t\t\t\"includePath\": [\n\t\t\t\t\"${workspaceFolder}/cpp\",\n\t\t\t\t\"${workspaceFolder}/lib\",\n\t\t\t\t\"${workspaceFolder}/test\",\n\t\t\t\t\"~/SFML/include\",\n\t\t\t\t\"/usr/local/include/**\",\n\t\t\t\t\"/usr/include/**\"\n\t\t\t],\n\t\t\t\"defines\": [\n\t\t\t\t\"_DEBUG\"\n\t\t\t],\n\t\t\t\"cStandard\": \"c11\",\n\t\t\t\"cppStandard\": \"c++17\",\n\t\t\t\"forcedInclude\": [\n\t\t\t\t\"${workspaceFolder}/cpp/PCH.hpp\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Mac\",\n\t\t\t\"intelliSenseMode\": \"clang-x64\",\n\t\t\t\"compilerPath\": \"/usr/bin/clang\",\n\t\t\t\"macFrameworkPath\": [\n\t\t\t\t\"/Library/Frameworks\",\n\t\t\t\t\"/System/Library/Frameworks\"\n\t\t\t],\n\t\t\t\"includePath\": [\n\t\t\t\t\"${workspaceFolder}/cpp\",\n\t\t\t\t\"${workspaceFolder}/lib\",\n\t\t\t\t\"${workspaceFolder}/test\",\n\t\t\t\t\"/usr/local/include/**\"\n\t\t\t],\n\t\t\t\"defines\": [\n\t\t\t\t\"_DEBUG\"\n\t\t\t],\n\t\t\t\"cStandard\": \"c11\",\n\t\t\t\"cppStandard\": \"c++17\",\n\t\t\t\"forcedInclude\": [\n\t\t\t\t\"${workspaceFolder}/cpp/PCH.hpp\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Win32\",\n\t\t\t\"intelliSenseMode\": \"gcc-x64\",\n\t\t\t\"compilerPath\": \"C:/mingw32/bin/gcc.exe\",\n\t\t\t\"includePath\": [\n\t\t\t\t\"${workspaceFolder}/cpp\",\n\t\t\t\t\"${workspaceFolder}/lib\",\n\t\t\t\t\"C:/SFML/include\"\n\t\t\t],\n\t\t\t\"defines\": [\n\t\t\t\t\"_DEBUG\",\n\t\t\t\t\"UNICODE\",\n\t\t\t\t\"_UNICODE\"\n\t\t\t],\n\t\t\t\"cStandard\": \"c11\",\n\t\t\t\"cppStandard\": \"c++17\",\n\t\t\t\"forcedInclude\": [\n\t\t\t\t\"${workspaceFolder}/cpp/PCH.hpp\"\n\t\t\t]\n\t\t}\n\t],\n\t\"version\": 4\n}"
  },
  {
    "path": "app/src/main/.vscode/launch.json",
    "content": "{\n\t\"version\": \"0.2.0\",\n\t\"configurations\": [\n\t\t{\n\t\t\t\"name\": \"GDB/LLDB\",\n\t\t\t\"type\": \"cppdbg\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"program\": \"${workspaceFolder}/bin-vscode/Debug/${workspaceRootFolderName}.exe\",\n\t\t\t\"args\": [\n\t\t\t\t\"-exec info registers\"\n\t\t\t],\n\t\t\t\"stopAtEntry\": false,\n\t\t\t\"cwd\": \"${workspaceFolder}\",\n\t\t\t\"preLaunchTask\": \"Build: Debug\",\n\t\t\t\"externalConsole\": false,\n\t\t\t\"internalConsoleOptions\": \"neverOpen\",\n\t\t\t\"setupCommands\": [\n\t\t\t\t{\n\t\t\t\t\t\"description\": \"Enable pretty-printing for gdb\",\n\t\t\t\t\t\"text\": \"-enable-pretty-printing\",\n\t\t\t\t\t\"ignoreFailures\": true\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"windows\": {\n\t\t\t\t\"MIMode\": \"gdb\",\n\t\t\t\t\"miDebuggerPath\": \"C:/mingw32/bin/gdb.exe\",\n\t\t\t\t\"env\": {\n\t\t\t\t\t\"Path\": \"${config:terminal.integrated.env.windows.Path}\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"linux\": {\n\t\t\t\t\"program\": \"${workspaceFolder}/bin-vscode/Debug/${workspaceRootFolderName}\",\n\t\t\t\t\"MIMode\": \"gdb\",\n\t\t\t\t\"miDebuggerPath\": \"/usr/bin/gdb\",\n\t\t\t\t\"env\": {\n\t\t\t\t\t\"PATH\": \"${config:terminal.integrated.env.linux.PATH}\",\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"osx\": {\n\t\t\t\t\"program\": \"${workspaceFolder}/bin-vscode/Debug/${workspaceRootFolderName}\",\n\t\t\t\t\"MIMode\": \"lldb\",\n\t\t\t\t\"env\": {\n\t\t\t\t\t\"PATH\": \"${config:terminal.integrated.env.osx.PATH}\",\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t]\n}"
  },
  {
    "path": "app/src/main/.vscode/settings.json",
    "content": "{\n\t\"C_Cpp.autocomplete\": \"Default\",\n\t\"C_Cpp.intelliSenseEngine\": \"Default\",\n\t\"C_Cpp.dimInactiveRegions\": false,\n\t\"C_Cpp.preferredPathSeparator\": \"Forward Slash\",\n\t\"C_Cpp.loggingLevel\": \"Warning\",\n\t\"C_Cpp.workspaceParsingPriority\": \"highest\",\n\t\"C_Cpp.enhancedColorization\": \"Disabled\",\n\n\t\"debug.toolBarLocation\": \"docked\",\n\n\t\"editor.fontFamily\": \"'Ubuntu Mono', 'Courier Prime Code', 'Courier', 'Courier New', Consolas, monospace\",\n\t\"editor.tabSize\": 4,\n\t\"editor.insertSpaces\": false,\n\n\t\"files.encoding\": \"utf8\",\n\t\"files.trimTrailingWhitespace\": true,\n\t\"files.eol\": \"\\n\",\n\t\"files.exclude\": {\n\t\t// hide file\n\t\t\"res\": true\n\t\t\"save\": true\n\t\t\"CMakeLists.txt\": true\n\t\t\"AndroidManifest.xml\": true\n\t\t\"codeblocks\": true\n\t\t\"cmake\": true\n\t\t\"bin-codeblocks\": true\n\t\t\"bin-vscode\": true\n\t\t\"is-Engine-linux.cbp\": true\n\t\t\"is-Engine-linux.layout\": true\n\t\t\"is-Engine-linux.depend\": true\n\t\t\"is-Engine-windows.cbp\": true\n\t\t\"is-Engine-windows.layout\": true\n\t\t\"is-Engine-windows.depend\": true\n\t\t\".vscode/launch.json\": true,\n\t\t\"env/windows/*.sh\": true,\n\t\t\"env/osx/dmg.applescript\": true,\n\t\t\"Makefile\": true,\n\t\t\"build.sh\": true,\n\t\t\"gmon.out\": true,\n\t\t\"bin/\": true,\n\t\t\"build/\": true,\n\t\t\"**/*.7z\": true,\n\t\t\"**/*.rar\": true,\n\t\t\"**/Thumbs.db\": true\n\t},\n\t\"files.associations\": {\n\t\t\"*.json\": \"jsonc\",\n\t\t\"*.stats\": \"cpp\",\n\t\t\"*.desktop\": \"properties\",\n\t\t\".clang-format\": \"yaml\"\n\t},\n\n\t\"terminal.integrated.shell.windows\": \"C:/Program Files/Git/bin/bash.exe\",\n\t\"terminal.integrated.env.windows\": {\n\t\t\"Path\": \"C:/mingw32/bin;C:/SFML/bin\"\n\t},\n\t\"terminal.integrated.env.linux\": {\n\t\t\"PATH\": \"/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin\"\n\t},\n\t\"terminal.integrated.env.osx\": {\n\t\t\"PATH\": \"/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin\"\n\t},\n\n\t\"workbench.colorCustomizations\": {\n\t\t\"statusBar.background\": \"#8ac242\",\n\t\t\"statusBar.foreground\": \"#ffffff\",\n\t\t\"statusBar.debuggingBackground\": \"#5e9517\",\n\t\t\"statusBar.debuggingForeground\": \"#ffffff\",\n\t\t\"terminal.ansiBrightRed\": \"#ee3355\",\n\t\t\"terminal.ansiBrightYellow\": \"#ffcc55\",\n\t\t\"terminal.ansiBrightGreen\": \"#a5ea4f\",\n\t\t\"terminal.ansiBrightBlue\": \"#5599ff\"\n\t},\n\n\t\"[applescript]\": {\n\t\t\"files.encoding\": \"utf8\"\n\t}\n}"
  },
  {
    "path": "app/src/main/.vscode/tasks.json",
    "content": "{\n\t// See https://go.microsoft.com/fwlink/?LinkId=733558\n\t// for the documentation about the tasks.json format\n\t\"version\": \"2.0.0\",\n\t\"windows\": {\n\t\t\"options\": {\n\t\t\t\"env\": {\n\t\t\t\t\"Path\": \"${config:terminal.integrated.env.windows.Path}\"\n\t\t\t}\n\t\t}\n\t},\n\t\"linux\": {\n\t\t\"options\": {\n\t\t\t\"env\": {\n\t\t\t\t\"PATH\": \"${config:terminal.integrated.env.linux.PATH}\"\n\t\t\t}\n\t\t}\n\t},\n\t\"osx\": {\n\t\t\"options\": {\n\t\t\t\"env\": {\n\t\t\t\t\"PATH\": \"${config:terminal.integrated.env.osx.PATH}\"\n\t\t\t}\n\t\t}\n\t},\n\t\"presentation\": {\n\t\t\"echo\": false,\n\t\t\"reveal\": \"always\",\n\t\t\"focus\": true,\n\t\t\"panel\": \"shared\",\n\t\t\"clear\": false,\n\t\t\"showReuseMessage\": true\n\t},\n\t\"tasks\": [\n\t\t{\n\t\t\t\"label\": \"Build & Run: Release\",\n\t\t\t\"command\": \"bash ./build.sh buildrun Release vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Build: Release\",\n\t\t\t\"command\": \"bash ./build.sh build Release vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Run: Release\",\n\t\t\t\"command\": \"bash ./build.sh run Release vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Rebuild: Release\",\n\t\t\t\"command\": \"bash ./build.sh rebuild Release vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Build & Run: Debug\",\n\t\t\t\"command\": \"bash ./build.sh buildrun Debug vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Build: Debug\",\n\t\t\t\"command\": \"bash ./build.sh build Debug vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Run: Debug\",\n\t\t\t\"command\": \"bash ./build.sh run Debug vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Rebuild: Debug\",\n\t\t\t\"command\": \"bash ./build.sh rebuild Debug vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Profile: Debug\",\n\t\t\t\"command\": \"bash ./build.sh profile Debug vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Build & Run: Tests\",\n\t\t\t\"command\": \"bash ./build.sh buildrun Tests vscode '-w NoTests -s'\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Build: Tests\",\n\t\t\t\"command\": \"bash ./build.sh build Tests vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Run: Tests\",\n\t\t\t\"command\": \"bash ./build.sh run Tests vscode '-w NoTests -s'\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Rebuild: Tests\",\n\t\t\t\"command\": \"bash ./build.sh rebuild Tests vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"label\": \"Build: Production\",\n\t\t\t\"command\": \"bash ./build.sh buildprod Release vscode\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"group\": {\n\t\t\t\t\"kind\": \"build\",\n\t\t\t\t\"isDefault\": true\n\t\t\t},\n\t\t\t\"problemMatcher\": [\n\t\t\t\t\"$gcc\"\n\t\t\t]\n\t\t}\n\t]\n}"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.author.isengine\">\n\n  \t<!--uncomment this line if you want to use this permission-->\n    <!--uses-permission android:name=\"android.permission.DISABLE_KEYGUARD\"/-->\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\"/>\n    <uses-permission android:name=\"android.permission.VIBRATE\"/>\n\t\n\t\t<!--android:name=\"android.support.multidex.MultiDexApplication\"-->\n    <application\n\n        android:allowBackup=\"false\"\n        android:label=\"@string/app_name\"\n\t\tandroid:hasCode=\"true\"\n\t\tandroid:icon=\"@drawable/icon\"\n        android:theme=\"@android:style/Theme.NoTitleBar.Fullscreen\"\n\t\tandroid:hardwareAccelerated=\"true\">\n        <activity\n            android:name=\".SDLActivity\"\n            android:label=\"@string/app_name\"\n\t\t\tandroid:icon=\"@drawable/icon\"\n\t\t\tandroid:configChanges=\"keyboardHidden\"\n\t\t\tandroid:screenOrientation=\"sensorLandscape\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\t\t\t\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.15)\nproject(isengine)\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -Wextra\")\n\nif( ${CMAKE_SYSTEM_NAME} MATCHES \"Emscripten\")\n    set(USE_FLAGS \"-s USE_SDL=2 -s USE_SDL_IMAGE=2 -s SDL2_IMAGE_FORMATS=\\\"['png']\\\" -s -s USE_SDL_TTF=2 -s USE_SDL_MIXER=2 -s USE_OGG=1 -s USE_VORBIS=1 -s USE_FREETYPE=1\")\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${USE_FLAGS}\")\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} ${USE_FLAGS}\")\n    set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} ${USE_FLAGS}\")\nendif()\n\ninclude_directories(${CMAKE_SOURCE_DIR}/include ${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS} ${SDL2_MIXER_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS})\n\nset(ISENGINE_HTML_5 true) # This confirms that we are using is::Engine to develop on the Web\nset(ISENGINE_SRC_DIR   \"cpp\")\nset(ISENGINE_CMAKE_DIR \"cmake\")\n\nadd_compile_definitions(IS_ENGINE_HTML_5)\n\ninclude(${ISENGINE_CMAKE_DIR}/app_src.cmake)\ninclude(${ISENGINE_CMAKE_DIR}/isengine.cmake)\n\nadd_executable(isengine\n\t${app_src}\n\t${isengine}\n)\n\ntarget_link_libraries(isengine ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES} ${SDL2MIXER_LIBRARIES} ${SDL2TTF_LIBRARIES} ${FREETYPE_LIBRARIES} -lidbfs.js)\n\nset_property(TARGET isengine APPEND_STRING PROPERTY LINK_FLAGS \" -s ALLOW_MEMORY_GROWTH=1\")\nset_property(TARGET isengine APPEND_STRING PROPERTY LINK_FLAGS \" -s DISABLE_EXCEPTION_CATCHING=2\")\nset_property(TARGET isengine APPEND_STRING PROPERTY LINK_FLAGS \" -s WASM=1\")\nset_property(TARGET isengine APPEND_STRING PROPERTY LINK_FLAGS \" -s TOTAL_MEMORY=134217728\")\n\n# Release flags\nset_property(TARGET isengine APPEND_STRING PROPERTY LINK_FLAGS \" --emrun\")\nset_property(TARGET isengine APPEND_STRING PROPERTY LINK_FLAGS \" -O3\")\nset_property(TARGET isengine APPEND_STRING PROPERTY LINK_FLAGS \" --bind\")\n\n# Copy the web files\nconfigure_file(${CMAKE_CURRENT_SOURCE_DIR}/web/index.html ${CMAKE_CURRENT_BINARY_DIR}/index.html COPYONLY)\nconfigure_file(${CMAKE_CURRENT_SOURCE_DIR}/web/sw.js ${CMAKE_CURRENT_BINARY_DIR}/sw.js COPYONLY)\nfile(COPY ${CMAKE_CURRENT_SOURCE_DIR}/web/images  DESTINATION ${CMAKE_CURRENT_BINARY_DIR})\nfile(COPY ${CMAKE_CURRENT_SOURCE_DIR}/web/scripts DESTINATION ${CMAKE_CURRENT_BINARY_DIR})\nfile(COPY ${CMAKE_CURRENT_SOURCE_DIR}/web/styles  DESTINATION ${CMAKE_CURRENT_BINARY_DIR})\n\n# Allow some files to be fetched.\nfile(GLOB files \"./assets/*\" \"./assets/*/*\")\nforeach(file ${files})\n\tfile(RELATIVE_PATH relative_file ${CMAKE_SOURCE_DIR} ${file})\n\tset_property(TARGET isengine APPEND_STRING PROPERTY LINK_FLAGS  \" --preload-file ${file}@/${relative_file}\")\nendforeach()"
  },
  {
    "path": "app/src/main/Makefile",
    "content": "#---------------------------------------------------------------------------------\n.SUFFIXES:\n#---------------------------------------------------------------------------------\n\nifeq ($(strip $(DEVKITPRO)),)\n$(error \"Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>/devkitpro\")\nendif\n\nTOPDIR ?= $(CURDIR)\ninclude $(DEVKITPRO)/libnx/switch_rules\n\n#---------------------------------------------------------------------------------\n# TARGET is the name of the output\n# BUILD is the directory where object files & intermediate files will be placed\n# SOURCES is a list of directories containing source code\n# DATA is a list of directories containing data files\n# INCLUDES is a list of directories containing header files\n# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional)\n#\n# NO_ICON: if set to anything, do not use icon.\n# NO_NACP: if set to anything, no .nacp file is generated.\n# APP_TITLE is the name of the app stored in the .nacp file (Optional)\n# APP_AUTHOR is the author of the app stored in the .nacp file (Optional)\n# APP_VERSION is the version of the app stored in the .nacp file (Optional)\n# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional)\n# ICON is the filename of the icon (.jpg), relative to the project folder.\n#   If not set, it attempts to use one of the following (in this order):\n#     - <Project name>.jpg\n#     - icon.jpg\n#     - <libnx folder>/default_icon.jpg\n#\n# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder.\n#   If not set, it attempts to use one of the following (in this order):\n#     - <Project name>.json\n#     - config.json\n#   If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead\n#   of a homebrew executable (.nro). This is intended to be used for sysmodules.\n#   NACP building is skipped as well.\n#---------------------------------------------------------------------------------\nTARGET\t\t:=\t$(notdir $(CURDIR))\nBUILD\t\t:=\tbuild\nSOURCES\t\t:=\tcpp\nDATA\t\t:=\tdata\nINCLUDES\t:=\tcpp\nROMFS\t\t:=\tromfs\n\nAPP_TITLE   := is::Engine\nAPP_AUTHOR  := author\nAPP_VERSION := 1.0\nICON\t\t:= icon.jpg\nPC_LIBS     := SDL2_image SDL2_mixer SDL2_ttf sdl2\n\n#---------------------------------------------------------------------------------\n# options for code generation\n#---------------------------------------------------------------------------------\nARCH\t:=\t-march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE\n\nCFLAGS\t:=\t`$(PREFIX)pkg-config --cflags $(PC_LIBS)` \\\n\t\t\t-g -Wall -O2 -ffunction-sections \\\n\t\t\t$(ARCH) $(DEFINES)\n\nCFLAGS\t+=\t$(INCLUDE) -D__SWITCH__ -DIS_ENGINE_SWITCH\n\nCXXFLAGS\t:= $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -std=gnu++17\n\nASFLAGS\t:=\t-g $(ARCH)\nLDFLAGS\t=\t-specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)\n\nLIBS\t:=\t`$(PREFIX)pkg-config --libs $(PC_LIBS)` \\\n\t\t\t-lnx -lm -lstdc++\n\n#---------------------------------------------------------------------------------\n# list of directories containing libraries, this must be the top level containing\n# include and lib\n#---------------------------------------------------------------------------------\nLIBDIRS\t:= $(PORTLIBS) $(LIBNX)\n\n\n#---------------------------------------------------------------------------------\n# no real need to edit anything past this point unless you need to add additional\n# rules for different file extensions\n#---------------------------------------------------------------------------------\nifneq ($(BUILD),$(notdir $(CURDIR)))\n#---------------------------------------------------------------------------------\n\nexport OUTPUT\t:=\t$(CURDIR)/$(TARGET)\nexport TOPDIR\t:=\t$(CURDIR)\n\nexport VPATH\t:=\t$(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \\\n\t\t\t$(foreach dir,$(DATA),$(CURDIR)/$(dir))\n\nexport DEPSDIR\t:=\t$(CURDIR)/$(BUILD)\n\nCFILES\t\t:=\t$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))\nCPPFILES\t:=\t$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))\nSFILES\t\t:=\t$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))\nBINFILES\t:=\t$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))\n\n#---------------------------------------------------------------------------------\n# use CXX for linking C++ projects, CC for standard C\n#---------------------------------------------------------------------------------\nifeq ($(strip $(CPPFILES)),)\n#---------------------------------------------------------------------------------\n\texport LD\t:=\t$(CC)\n#---------------------------------------------------------------------------------\nelse\n#---------------------------------------------------------------------------------\n\texport LD\t:=\t$(CXX)\n#---------------------------------------------------------------------------------\nendif\n#---------------------------------------------------------------------------------\n\nexport OFILES_BIN\t:=\t$(addsuffix .o,$(BINFILES))\nexport OFILES_SRC\t:=\t$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)\nexport OFILES \t:=\t$(OFILES_BIN) $(OFILES_SRC)\nexport HFILES_BIN\t:=\t$(addsuffix .h,$(subst .,_,$(BINFILES)))\n\nexport INCLUDE\t:=\t$(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \\\n\t\t\t$(foreach dir,$(LIBDIRS),-I$(dir)/include) \\\n\t\t\t-I$(CURDIR)/$(BUILD)\n\nexport LIBPATHS\t:=\t$(foreach dir,$(LIBDIRS),-L$(dir)/lib)\n\nifeq ($(strip $(CONFIG_JSON)),)\n\tjsons := $(wildcard *.json)\n\tifneq (,$(findstring $(TARGET).json,$(jsons)))\n\t\texport APP_JSON := $(TOPDIR)/$(TARGET).json\n\telse\n\t\tifneq (,$(findstring config.json,$(jsons)))\n\t\t\texport APP_JSON := $(TOPDIR)/config.json\n\t\tendif\n\tendif\nelse\n\texport APP_JSON := $(TOPDIR)/$(CONFIG_JSON)\nendif\n\nifeq ($(strip $(ICON)),)\n\ticons := $(wildcard *.jpg)\n\tifneq (,$(findstring $(TARGET).jpg,$(icons)))\n\t\texport APP_ICON := $(TOPDIR)/$(TARGET).jpg\n\telse\n\t\tifneq (,$(findstring icon.jpg,$(icons)))\n\t\t\texport APP_ICON := $(TOPDIR)/icon.jpg\n\t\tendif\n\tendif\nelse\n\texport APP_ICON := $(TOPDIR)/$(ICON)\nendif\n\nifeq ($(strip $(NO_ICON)),)\n\texport NROFLAGS += --icon=$(APP_ICON)\nendif\n\nifeq ($(strip $(NO_NACP)),)\n\texport NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp\nendif\n\nifneq ($(APP_TITLEID),)\n\texport NACPFLAGS += --titleid=$(APP_TITLEID)\nendif\n\nifneq ($(ROMFS),)\n\texport NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS)\nendif\n\n.PHONY: $(BUILD) clean all\n\n#---------------------------------------------------------------------------------\nall: $(BUILD)\n\n$(BUILD):\n\t@[ -d $@ ] || mkdir -p $@\n\t@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile\n\n#---------------------------------------------------------------------------------\nclean:\n\t@echo clean ...\nifeq ($(strip $(APP_JSON)),)\n\t@rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf\nelse\n\t@rm -fr $(BUILD) $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf\nendif\n\n\n#---------------------------------------------------------------------------------\nelse\n.PHONY:\tall\n\nDEPENDS\t:=\t$(OFILES:.o=.d)\n\n#---------------------------------------------------------------------------------\n# main targets\n#---------------------------------------------------------------------------------\nifeq ($(strip $(APP_JSON)),)\n\nall\t:\t$(OUTPUT).nro\n\nifeq ($(strip $(NO_NACP)),)\n$(OUTPUT).nro\t:\t$(OUTPUT).elf $(OUTPUT).nacp\nelse\n$(OUTPUT).nro\t:\t$(OUTPUT).elf\nendif\n\nelse\n\nall\t:\t$(OUTPUT).nsp\n\n$(OUTPUT).nsp\t:\t$(OUTPUT).nso $(OUTPUT).npdm\n\n$(OUTPUT).nso\t:\t$(OUTPUT).elf\n\nendif\n\n$(OUTPUT).elf\t:\t$(OFILES)\n\n$(OFILES_SRC)\t: $(HFILES_BIN)\n\n#---------------------------------------------------------------------------------\n# you need a rule like this for each extension you use as binary data\n#---------------------------------------------------------------------------------\n%.bin.o\t%_bin.h :\t%.bin\n#---------------------------------------------------------------------------------\n\t@echo $(notdir $<)\n\t@$(bin2o)\n\n-include $(DEPENDS)\n\n#---------------------------------------------------------------------------------------\nendif\n#---------------------------------------------------------------------------------------\n"
  },
  {
    "path": "app/src/main/Makefile-vscode",
    "content": ".SUFFIXES:\nSUFFIXES =\n.SUFFIXES: .c .cpp .h .hpp .rc .res .inl .o .d .asm\n\n\n#==============================================================================\nMAKEFLAGS += --no-print-directory\n#==============================================================================\n# Build platform\nPLATFORM?=linux\n# Build description (Primarily uses Debug/Release)\nBUILD?=Release\n_BUILDL := $(shell echo $(BUILD) | tr A-Z a-z)\nifeq ($(BUILD),Tests)\n\t_BUILDL := release\nendif\n\n# The sub-folder containing the target source files\nSRC_TARGET?=\nifneq ($(SRC_TARGET),)\n\t_SRC_TARGET := /$(SRC_TARGET)\nendif\n\n# Maximum parallel jobs during build process\nMAX_PARALLEL_JOBS?=8\n\n# Dump assembly?\nDUMP_ASSEMBLY?=false\n\n# Clean output?\nCLEAN_OUTPUT?=true\n\n# If dll, build as a static library?\nBUILD_STATIC?=false\n\n# Platform specific environment variables\n-include env/.all.mk\n-include env/.$(_BUILDL).mk\n-include env/$(PLATFORM).all.mk\n-include env/$(PLATFORM).$(_BUILDL).mk\n\n# Target specific variables\nifneq ($(SRC_TARGET),)\n-include env/$(SRC_TARGET)/.all.mk\n-include env/$(SRC_TARGET)/.$(_BUILDL).mk\n-include env/$(SRC_TARGET)/$(PLATFORM).all.mk\n-include env/$(SRC_TARGET)/$(PLATFORM).$(_BUILDL).mk\nendif\n\n#==============================================================================\n# File/Folder dependencies for the production build recipe (makeproduction)\nPRODUCTION_DEPENDENCIES?=\n# Extensions to exclude from production builds\nPRODUCTION_EXCLUDE?=\n# Folder location (relative or absolute) to place the production build into\nPRODUCTION_FOLDER?=build\nPRODUCTION_FOLDER_RESOURCES := $(PRODUCTION_FOLDER)\n\n#==============================================================================\n# Library directories (separated by spaces)\nLIB_DIRS?=\nINCLUDE_DIRS?=\n# Link libraries (separated by spaces)\nLINK_LIBRARIES?=\n\n# Precompiled header filename (no extension)\n# This file will be excluded from Rebuild, but if the bin/(build) directory is removed, it will be as well.\nPRECOMPILED_HEADER?=\n\n# Build-specific preprocessor macros\nBUILD_MACROS?=\n# Build-specific compiler flags to be appended to the final build step (with prefix)\nBUILD_FLAGS?=\n\n# Build dependencies to copy into the bin/(build) folder - example: openal32.dll\nBUILD_DEPENDENCIES?=\n\n# NAME should always be passed as an argument from tasks.json as the root folder name, but uses a fallback of \"game.exe\"\n# This is used for the output filename (game.exe)\nNAME?=game.exe\n\n#==============================================================================\n# The source file directory\nSRC_DIR := cpp$(_SRC_TARGET)\nLIB_DIR := lib\n\n# Project .cpp or .rc files (relative to $(SRC_DIR) directory)\nSOURCE_FILES := $(patsubst $(SRC_DIR)/%,%,$(shell find $(SRC_DIR) -name '*.cpp' -o -name '*.c' -o -name '*.cc' -o -name '*.rc'))\n# Project subdirectories within $(SRC_DIR)/ that contain source files\nPROJECT_DIRS := $(patsubst $(SRC_DIR)/%,%,$(shell find $(SRC_DIR) -mindepth 1 -maxdepth 99 -type d))\n\n# Add prefixes to the above variables\n_INCLUDE_DIRS := $(patsubst %,-I%,$(SRC_DIR)/ $(LIB_DIR)/ $(INCLUDE_DIRS))\n\n_BUILD_MACROS := $(BUILD_MACROS:%=-D%)\n_LINK_LIBRARIES := $(LINK_LIBRARIES:%=-l%)\n\n#==============================================================================\n# Unit Testing\nTEST_DIR :=\nifeq ($(BUILD),Tests)\n\tTEST_DIR := test\n\tSOURCE_FILES := $(SOURCE_FILES:Main.cpp=)\n\tSOURCE_FILES := $(patsubst $(TEST_DIR)/%,.$(TEST_DIR)/%,$(shell find $(TEST_DIR) -name '*.cpp' -o -name '*.c' -o -name '*.cc' -o -name '*.rc')) $(SOURCE_FILES)\n\t_INCLUDE_DIRS := $(patsubst %,-I%,$(TEST_DIR)/) $(_INCLUDE_DIRS)\n\tPROJECT_DIRS := .$(TEST_DIR) $(PROJECT_DIRS)\n\tBUILD_FLAGS := $(BUILD_FLAGS:-mwindows=)\nendif\n\n#==============================================================================\n# Linux Specific\nPRODUCTION_LINUX_ICON?=icon\n\n# The full working directory\nifeq ($(PLATFORM),linux)\n\t_LINUX_GREP_CWD := $(shell echo $(CURDIR) | sed 's/\\//\\\\\\//g')\nendif\n\n#==============================================================================\n# MacOS Specific\nPRODUCTION_MACOS_ICON?=icon\nPRODUCTION_MACOS_BUNDLE_COMPANY?=developer\nPRODUCTION_MACOS_BUNDLE_DISPLAY_NAME?=App\nPRODUCTION_MACOS_BUNDLE_NAME?=App\nPRODUCTION_MACOS_MAKE_DMG?=true\nPRODUCTION_MACOS_BACKGROUND?=dmg-background\n\nifeq ($(PLATFORM),osx)\n\tPRODUCTION_MACOS_BUNDLE_COMPANY := '$(PRODUCTION_MACOS_BUNDLE_COMPANY)'\n\tPRODUCTION_MACOS_BUNDLE_DISPLAY_NAME := '$(PRODUCTION_MACOS_BUNDLE_DISPLAY_NAME)'\n\tPRODUCTION_MACOS_BUNDLE_NAME := '$(PRODUCTION_MACOS_BUNDLE_NAME)'\n\tPRODUCTION_FOLDER_MACOS := $(PRODUCTION_FOLDER)\n\tPRODUCTION_FOLDER := $(PRODUCTION_FOLDER)/$(PRODUCTION_MACOS_BUNDLE_NAME).app/Contents\n\tPRODUCTION_FOLDER_RESOURCES := $(PRODUCTION_FOLDER)/Resources\n\tPRODUCTION_DEPENDENCIES := $(PRODUCTION_DEPENDENCIES)\n\tPRODUCTION_MACOS_DYLIBS := $(PRODUCTION_MACOS_DYLIBS:%=%.dylib)\n\tMACOS_FRAMEWORKS?=CoreFoundation\n\tPRODUCTION_MACOS_FRAMEWORKS := $(PRODUCTION_MACOS_FRAMEWORKS:%=%.framework)\n\tPRODUCTION_MACOS_BACKGROUND := env/osx/$(PRODUCTION_MACOS_BACKGROUND)\n\tMACOS_FRAMEWORK_PATHS := $(MACOS_FRAMEWORK_PATHS:%=-F%)\n\tBUILD_FLAGS := $(BUILD_FLAGS) $(MACOS_FRAMEWORK_PATHS) $(MACOS_FRAMEWORKS:%=-framework %)\nendif\n\n#==============================================================================\n# Directories & Dependencies\nBLD_DIR := bin-vscode/$(BUILD)\nifeq ($(BUILD),Tests)\n\tBLD_DIR := bin-vscode/Release\nendif\nBLD_DIR := $(BLD_DIR:%/=%)\nTARGET := $(BLD_DIR)/$(NAME)\n_NAMENOEXT := $(NAME:.exe=)\n_NAMENOEXT := $(_NAMENOEXT:.dll=)\n\nifneq ($(SRC_TARGET),)\n\tLIB_DIRS := $(LIB_DIRS) $(BLD_DIR)\nendif\n_LIB_DIRS := $(LIB_DIR:%=-L%/) $(LIB_DIRS:%=-L%)\n\n_SOURCES_IF_RC := $(if $(filter windows,$(PLATFORM)),$(SOURCE_FILES:.rc=.res),$(SOURCE_FILES:%.rc=))\n\nOBJ_DIR := $(BLD_DIR)/obj$(_SRC_TARGET)\n_OBJS := $(_SOURCES_IF_RC:.c=.c.o)\n_OBJS := $(_OBJS:.cpp=.cpp.o)\n_OBJS := $(_OBJS:.cc=.cc.o)\nOBJS := $(_OBJS:%=$(OBJ_DIR)/%)\nOBJ_SUBDIRS := $(PROJECT_DIRS:%=$(OBJ_DIR)/%)\n\nDEP_DIR := $(BLD_DIR)/dep$(_SRC_TARGET)\n_DEPS := $(_SOURCES_IF_RC)\n_DEPS := $(_DEPS:%=%.d)\nDEPS := $(_DEPS:%=$(DEP_DIR)/%) $(DEP_DIR)/$(PRECOMPILED_HEADER).d\nDEP_SUBDIRS := $(PROJECT_DIRS:%=$(DEP_DIR)/%)\n\n_PCH_HFILE := $(shell find $(SRC_DIR) -name '$(PRECOMPILED_HEADER).hpp' -o -name '$(PRECOMPILED_HEADER).h' -o -name '$(PRECOMPILED_HEADER).hh')\n_PCH_HFILE := $(_PCH_HFILE:$(SRC_DIR)/%=%)\n_PCH_EXT := $(_PCH_HFILE:$(PRECOMPILED_HEADER).%=%)\n_PCH_COMPILER_EXT := $(if $(filter osx,$(PLATFORM)),p,g)ch\n\n_SYMBOLS := $(if $(filter osx,$(PLATFORM)),,$(if $(filter Release,$(BUILD)),-s,))\n\n\n_PCH := $(_PCH_HFILE:%=$(OBJ_DIR)/%)\nifneq ($(_PCH),)\n\t_PCH_GCH := $(_PCH).$(_PCH_COMPILER_EXT)\nendif\n\nifeq ($(DUMP_ASSEMBLY),true)\n\tASM_DIR := $(BLD_DIR)/asm$(_SRC_TARGET)\n\t_ASMS := $(_OBJS:%.res=)\n\t_ASMS := $(_ASMS:.o=.o.asm)\n\tASMS := $(_ASMS:%=$(ASM_DIR)/%)\n\tASM_SUBDIRS := $(PROJECT_DIRS:%=$(ASM_DIR)/%)\nendif\n\n_DIRECTORIES := $(sort bin-vscode $(BLD_DIR) $(OBJ_DIR) $(OBJ_SUBDIRS) $(DEP_DIR) $(DEP_SUBDIRS) $(ASM_DIR) $(ASM_SUBDIRS))\n\n_CLEAN := $(filter true,$(CLEAN_OUTPUT))\n\n# Quiet flag\n_Q := $(if $(_CLEAN),@)\n\n#==============================================================================\n# Compiler & flags\nCC?=g++\nRC?=windres.exe\nCFLAGS?=-O2 -Wall -fdiagnostics-color=always\n\nCFLAGS_DEPS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.Td\nCFLAGS_DEPS_T = -MT $@ -MMD -MP -MF $(DEP_DIR)/.$(TEST_DIR)/$*.Td\nPCH_COMPILE = $(CC) $(CFLAGS_DEPS) $(_BUILD_MACROS) $(CFLAGS) $(_INCLUDE_DIRS) -o $@ -c $<\nifneq ($(_PCH),)\n\t_INCLUDE_PCH := -include $(_PCH)\nendif\n\nOBJ_COMPILE = $(CC) $(CFLAGS_DEPS) $(_BUILD_MACROS) $(_INCLUDE_DIRS) $(_INCLUDE_PCH) $(CFLAGS) -o $@ -c $<\nOBJ_COMPILE_T = $(CC) $(CFLAGS_DEPS_T) $(_BUILD_MACROS) $(_INCLUDE_DIRS) $(_INCLUDE_PCH) $(CFLAGS) -o $@ -c $<\n\nRC_COMPILE = -$(RC) -J rc -O coff -i $< -o $@\nifeq ($(PLATFORM),osx)\n\tASM_COMPILE = otool -tvV $< | c++filt > $@\nelse\n\tASM_COMPILE = objdump -d -C -Mintel $< > $@\nendif\nPOST_COMPILE = mv -f $(DEP_DIR)/$*.Td $(DEP_DIR)/$*.d && touch $@\nPOST_COMPILE_T = mv -f $(DEP_DIR)/.$(TEST_DIR)/$*.Td $(DEP_DIR)/.$(TEST_DIR)/$*.d && touch $@\n\n#==============================================================================\n# Build Scripts\nall:\n\t@$(MAKE) makepch\n\t@$(MAKE) -j$(MAX_PARALLEL_JOBS) makebuild\n.DELETE_ON_ERROR: all\n\nrebuild: clean all\n.PHONY: rebuild\n\nbuildprod: all makeproduction\n.PHONY: buildprod\n\n#==============================================================================\n# Functions\ncolor_reset := @tput setaf 4\n\ndefine compile_with\n\t$(color_reset)\n\t$(if $(_CLEAN),@echo '   $($(2):$(OBJ_DIR)/%=%)')\n\t$(_Q)$(3) && $(4)\nendef\n\nMKDIR := $(_Q)mkdir -p\n\nmakepch: $(_PCH_GCH)\n\t@echo > /dev/null\n.PHONY: makepch\n\nmakebuild: $(TARGET)\n\t$(color_reset)\nifeq ($(SRC_TARGET),)\n\t@echo '   Target is up to date.'\nelse\n\t@echo '   $(NAME): Target is up to date.'\nendif\n.PHONY: makebuild\n\n#==============================================================================\n# Build Recipes\n$(OBJ_DIR)/%.o: $(SRC_DIR)/%\n$(OBJ_DIR)/%.o: $(SRC_DIR)/% $(_PCH_GCH) $(DEP_DIR)/%.d | $(_DIRECTORIES)\n\t$(call compile_with,@,<,$(OBJ_COMPILE),$(POST_COMPILE))\n\n$(OBJ_DIR)/.$(TEST_DIR)/%.o: $(TEST_DIR)/%\n$(OBJ_DIR)/.$(TEST_DIR)/%.o: $(TEST_DIR)/% $(_PCH_GCH) $(DEP_DIR)/.$(TEST_DIR)/%.d | $(_DIRECTORIES)\n\t$(call compile_with,@,<,$(OBJ_COMPILE_T),$(POST_COMPILE_T))\n\n$(OBJ_DIR)/%.$(_PCH_EXT).$(_PCH_COMPILER_EXT) : $(SRC_DIR)/%.$(_PCH_EXT)\n$(OBJ_DIR)/%.$(_PCH_EXT).$(_PCH_COMPILER_EXT) : $(SRC_DIR)/%.$(_PCH_EXT) $(DEP_DIR)/%.d | $(_DIRECTORIES)\n\t$(call compile_with,@,<,$(PCH_COMPILE),$(POST_COMPILE))\n\n$(OBJ_DIR)/%.res: $(SRC_DIR)/%.rc\n$(OBJ_DIR)/%.res: $(SRC_DIR)/%.rc $(DEP_DIR)/%.d | $(_DIRECTORIES)\n\t$(color_reset)\n\t$(if $(_CLEAN),@echo \"   $(<:$(OBJ_DIR)/%=%)\")\n\t$(_Q)$(RC_COMPILE)\n\n$(ASM_DIR)/%.o.asm: $(OBJ_DIR)/%.o\n\t@tput setaf 6\n\t$(if $(_CLEAN),@echo \"   $@\")\n\t$(_Q)$(ASM_COMPILE)\n\n$(TARGET): $(_PCH_GCH) $(OBJS) $(ASMS) $(TEST_DIR)\n\t$(color_reset)\n\t$(if $(_CLEAN),@echo; printf '\\xE2\\x87\\x9B'; echo '  Linking: $(TARGET)')\nifeq ($(suffix $(TARGET)),.dll)\nifeq ($(BUILD_STATIC),true)\n\t-$(_Q)rm -rf $(BLD_DIR)/lib$(_NAMENOEXT).a\n\t$(_Q)ar.exe -r -s $(BLD_DIR)/lib$(_NAMENOEXT).a $(OBJS)\nelse\n\t-$(_Q)rm -rf $(BLD_DIR)/lib$(_NAMENOEXT).def $(BLD_DIR)/lib$(_NAMENOEXT).a\n\t$(_Q)$(CC) -shared -Wl,--output-def=\"$(BLD_DIR)/lib$(_NAMENOEXT).def\" -Wl,--out-implib=\"$(BLD_DIR)/lib$(_NAMENOEXT).a\" -Wl,--dll $(_LIB_DIRS) $(OBJS) -o $@ $(_SYMBOLS) $(_LINK_LIBRARIES) $(BUILD_FLAGS)\nendif\nelse\n\t$(_Q)$(CC) $(_LIB_DIRS) $(_SYMBOLS) -o $@ $(OBJS) $(_LINK_LIBRARIES) $(BUILD_FLAGS)\nendif\n\t@echo\nifneq ($(BUILD_DEPENDENCIES),)\n\t$(foreach dep,$(BUILD_DEPENDENCIES),$(call copy_to,$(dep),$(BLD_DIR)))\nendif\n\n$(_DIRECTORIES):\n\t$(if $(_CLEAN),,$(color_reset))\n\t$(MKDIR) $@\n\t$(if $(_CLEAN),,@echo)\n\nclean:\n\t$(color_reset)\n\t$(if $(_CLEAN),@echo '   Cleaning old build files & folders...'; echo)\n\t$(_Q)$(RM) $(TARGET) $(DEPS) $(OBJS)\n.PHONY: clean\n\n#==============================================================================\n# Production recipes\n\nrmprod:\n\t$(color_reset)\n\t@echo\n\t-$(_Q)rm -rf $(if $(filter osx,$(PLATFORM)),$(PRODUCTION_FOLDER_MACOS),$(PRODUCTION_FOLDER))\nifeq ($(PLATFORM),linux)\n\t-$(_Q)rm -rf ~/.local/share/applications/$(NAME).desktop\nendif\n.PHONY: rmprod\n\nmkdirprod:\n\t$(color_reset)\n\t$(MKDIR) $(PRODUCTION_FOLDER)\n.PHONY: mkdirprod\n\ndefine do_copy_to_clean\n\t@printf \"\\xE2\\x9E\\xA6\"\n\t@echo  \"  Copying \\\"$(1)\\\" to \\\"$(CURDIR)/$(2)\\\"\"\n\t$(shell cp -r $(1) $(2))\nendef\n\ndefine do_copy_to\n\t@echo  \"cp -r $(1) $(2)\"\n\t$(shell cp -r $(1) $(2))\nendef\n\ndefine copy_to\n\t$(if $(wildcard $(2)/$(notdir $(1))),,$(if $(_CLEAN),$(call do_copy_to_clean,$(1),$(2)),$(call do_copy_to,$(1),$(2))))\nendef\n\nreleasetoprod: $(TARGET)\n\t$(color_reset)\nifeq ($(PLATFORM),osx)\n\t@echo '   Creating the MacOS application bundle...'\n\t@echo\n\t$(MKDIR) $(PRODUCTION_FOLDER)/Resources $(PRODUCTION_FOLDER)/Frameworks $(PRODUCTION_FOLDER)/MacOS\nifeq ($(shell brew ls --versions makeicns),)\n\tbrew install makeicns\n\t$(color_reset)\nendif\n\t$(_Q)makeicns -in env/osx/$(PRODUCTION_MACOS_ICON).png -out $(PRODUCTION_FOLDER)/Resources/$(PRODUCTION_MACOS_ICON).icns\n\t@echo\n\t$(_Q)plutil -convert binary1 env/osx/Info.plist.json -o $(PRODUCTION_FOLDER)/Info.plist\n\t$(_Q)plutil -replace CFBundleExecutable -string $(NAME) $(PRODUCTION_FOLDER)/Info.plist\n\t$(_Q)plutil -replace CFBundleName -string $(PRODUCTION_MACOS_BUNDLE_NAME) $(PRODUCTION_FOLDER)/Info.plist\n\t$(_Q)plutil -replace CFBundleIconFile -string $(PRODUCTION_MACOS_ICON) $(PRODUCTION_FOLDER)/Info.plist\n\t$(_Q)plutil -replace CFBundleDisplayName -string \"$(PRODUCTION_MACOS_BUNDLE_DISPLAY_NAME)\" $(PRODUCTION_FOLDER)/Info.plist\n\t$(_Q)plutil -replace CFBundleIdentifier -string com.$(PRODUCTION_MACOS_BUNDLE_DEVELOPER).$(PRODUCTION_MACOS_BUNDLE_NAME) $(PRODUCTION_FOLDER)/Info.plist\n\t$(_Q)cp $(TARGET) $(PRODUCTION_FOLDER)/MacOS\n\t$(_Q)chmod +x $(PRODUCTION_FOLDER)/MacOS/$(NAME)\nelse ifeq ($(PLATFORM),linux)\n\t$(_Q)cp $(TARGET) $(PRODUCTION_FOLDER)\n\t$(_Q)cp env/linux/$(PRODUCTION_LINUX_ICON).png $(PRODUCTION_FOLDER)/$(PRODUCTION_LINUX_ICON).png\n\t$(_Q)cp env/linux/exec.desktop $(PRODUCTION_FOLDER)/$(NAME).desktop\n\t$(_Q)sed -i 's/^Exec=.*/Exec=$(_LINUX_GREP_CWD)\\/$(PRODUCTION_FOLDER)\\/$(NAME)/' $(PRODUCTION_FOLDER)/$(NAME).desktop\n\t$(_Q)sed -i 's/^Path=.*/Path=$(_LINUX_GREP_CWD)\\/$(PRODUCTION_FOLDER)/' $(PRODUCTION_FOLDER)/$(NAME).desktop\n\t$(_Q)sed -i 's/^Name=.*/Name=$(PRODUCTION_LINUX_APP_NAME)/' $(PRODUCTION_FOLDER)/$(NAME).desktop\n\t$(_Q)sed -i 's/^Comment=.*/Comment=$(PRODUCTION_LINUX_APP_COMMENT)/' $(PRODUCTION_FOLDER)/$(NAME).desktop\n\t$(_Q)sed -i 's/^Icon=.*/Icon=$(_LINUX_GREP_CWD)\\/$(PRODUCTION_FOLDER)\\/$(PRODUCTION_LINUX_ICON).png/' $(PRODUCTION_FOLDER)/$(NAME).desktop\n\t$(_Q)chmod +x $(PRODUCTION_FOLDER)/$(NAME)\n\t$(_Q)chmod +x $(PRODUCTION_FOLDER)/$(NAME).desktop\n\t$(_Q)cp $(PRODUCTION_FOLDER)/$(NAME).desktop ~/.local/share/applications\nelse\n\t$(_Q)cp $(TARGET) $(PRODUCTION_FOLDER)\n\t$(if $(_CLEAN),,@echo)\nendif\n.PHONY: releasetoprod\n\nmakeproduction: rmprod mkdirprod releasetoprod\n\t$(color_reset)\nifneq ($(PRODUCTION_DEPENDENCIES),)\n\t@echo '   Adding dynamic libraries & project dependencies...'\n\t@echo\n\t$(foreach dep,$(PRODUCTION_DEPENDENCIES),$(call copy_to,$(dep),$(PRODUCTION_FOLDER_RESOURCES)))\n\t$(foreach excl,$(PRODUCTION_EXCLUDE),$(shell find $(PRODUCTION_FOLDER_RESOURCES) -name '$(excl)' -delete))\nendif\nifeq ($(PLATFORM),osx)\n\t$(foreach dylib,$(PRODUCTION_MACOS_DYLIBS),$(call copy_to,$(dylib),$(PRODUCTION_FOLDER)/MacOS))\n\t$(_Q)install_name_tool -add_rpath @executable_path/../Frameworks $(PRODUCTION_FOLDER)/MacOS/$(NAME)\n\t$(_Q)install_name_tool -add_rpath @loader_path/.. $(PRODUCTION_FOLDER)/MacOS/$(NAME)\n\t$(foreach dylib,$(PRODUCTION_MACOS_DYLIBS),$(shell install_name_tool -change $(notdir $(dylib)) @rpath/MacOS/$(notdir $(dylib)) $(PRODUCTION_FOLDER)/MacOS/$(NAME)))\n\t$(foreach framework,$(PRODUCTION_MACOS_FRAMEWORKS),$(call copy_to,$(framework),$(PRODUCTION_FOLDER)/Frameworks))\nifeq ($(PRODUCTION_MACOS_MAKE_DMG),true)\n\t$(shell hdiutil detach /Volumes/$(PRODUCTION_MACOS_BUNDLE_NAME)/ &> /dev/null)\n\t@echo\n\t@echo '   Creating the dmg image for the application...'\n\t@echo\n\t$(_Q)hdiutil create -megabytes 54 -fs HFS+ -volname $(PRODUCTION_MACOS_BUNDLE_NAME) $(PRODUCTION_FOLDER_MACOS)/.tmp.dmg > /dev/null\n\t$(_Q)hdiutil attach $(PRODUCTION_FOLDER_MACOS)/.tmp.dmg > /dev/null\n\t$(_Q)cp -r $(PRODUCTION_FOLDER_MACOS)/$(PRODUCTION_MACOS_BUNDLE_NAME).app /Volumes/$(PRODUCTION_MACOS_BUNDLE_NAME)/\n\t-$(_Q)rm -rf /Volumes/$(PRODUCTION_MACOS_BUNDLE_NAME)/.fseventsd\n\t$(MKDIR) /Volumes/$(PRODUCTION_MACOS_BUNDLE_NAME)/.background\n\t$(_Q)tiffutil -cathidpicheck $(PRODUCTION_MACOS_BACKGROUND).png $(PRODUCTION_MACOS_BACKGROUND)@2x.png -out /Volumes/$(PRODUCTION_MACOS_BUNDLE_NAME)/.background/background.tiff\n\t$(_Q)ln -s /Applications /Volumes/$(PRODUCTION_MACOS_BUNDLE_NAME)/Applications\n\t$(_Q)appName=$(PRODUCTION_MACOS_BUNDLE_NAME) osascript env/osx/dmg.applescript\n\t$(_Q)hdiutil detach /Volumes/$(PRODUCTION_MACOS_BUNDLE_NAME)/ > /dev/null\n\t$(_Q)hdiutil convert $(PRODUCTION_FOLDER_MACOS)/.tmp.dmg -format UDZO -o $(PRODUCTION_FOLDER_MACOS)/$(PRODUCTION_MACOS_BUNDLE_NAME).dmg > /dev/null\n\t$(_Q)rm -f $(PRODUCTION_FOLDER_MACOS)/.tmp.dmg\n\t@echo\n\t@echo '   Created $(PRODUCTION_FOLDER_MACOS)/$(PRODUCTION_MACOS_BUNDLE_NAME).dmg'\nendif\nendif\n.PHONY: makeproduction\n\n#==============================================================================\n# Dependency recipes\n$(DEP_DIR)/%.d: ;\n.PRECIOUS: $(DEP_DIR)/%.d\n\ninclude $(wildcard $(DEPS))\n"
  },
  {
    "path": "app/src/main/SDL2_SFML.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.14.36408.4 d17.14\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"SDL2_SFML\", \"SDL2_SFML.vcxproj\", \"{5F4AA128-1C3B-458F-9B6D-7E140CBE20A5}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{5F4AA128-1C3B-458F-9B6D-7E140CBE20A5}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{5F4AA128-1C3B-458F-9B6D-7E140CBE20A5}.Debug|x64.Build.0 = Debug|x64\n\t\t{5F4AA128-1C3B-458F-9B6D-7E140CBE20A5}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{5F4AA128-1C3B-458F-9B6D-7E140CBE20A5}.Debug|x86.Build.0 = Debug|Win32\n\t\t{5F4AA128-1C3B-458F-9B6D-7E140CBE20A5}.Release|x64.ActiveCfg = Release|x64\n\t\t{5F4AA128-1C3B-458F-9B6D-7E140CBE20A5}.Release|x64.Build.0 = Release|x64\n\t\t{5F4AA128-1C3B-458F-9B6D-7E140CBE20A5}.Release|x86.ActiveCfg = Release|Win32\n\t\t{5F4AA128-1C3B-458F-9B6D-7E140CBE20A5}.Release|x86.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {4BC0C116-C5DF-4722-B40C-C405E183D77F}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "app/src/main/SDL2_SFML.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <Keyword>Win32Proj</Keyword>\n    <ProjectGuid>{5f4aa128-1c3b-458f-9b6d-7e140cbe20a5}</ProjectGuid>\n    <RootNamespace>SDL2_SFML</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>IS_ENGINE_SDL_2;IS_ENGINE_VS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <LanguageStandard>stdcpp20</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>IS_ENGINE_SDL_2;IS_ENGINE_VS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <AdditionalIncludeDirectories>C:\\SDL2-2.26.3\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <LanguageStandard>stdcpp20</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>C:\\SDL2-2.26.3\\lib\\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>SDL2.lib;SDL2main.lib;SDL2_image.lib;SDL2_mixer.lib;SDL2_ttf.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"cpp\\b2BlockAllocator.cpp\" />\n    <ClCompile Include=\"cpp\\b2Body.cpp\" />\n    <ClCompile Include=\"cpp\\b2BroadPhase.cpp\" />\n    <ClCompile Include=\"cpp\\b2ChainAndCircleContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2ChainAndPolygonContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2ChainShape.cpp\" />\n    <ClCompile Include=\"cpp\\b2CircleContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2CircleShape.cpp\" />\n    <ClCompile Include=\"cpp\\b2CollideCircle.cpp\" />\n    <ClCompile Include=\"cpp\\b2CollideEdge.cpp\" />\n    <ClCompile Include=\"cpp\\b2CollidePolygon.cpp\" />\n    <ClCompile Include=\"cpp\\b2Collision.cpp\" />\n    <ClCompile Include=\"cpp\\b2Contact.cpp\" />\n    <ClCompile Include=\"cpp\\b2ContactManager.cpp\" />\n    <ClCompile Include=\"cpp\\b2ContactSolver.cpp\" />\n    <ClCompile Include=\"cpp\\b2Distance.cpp\" />\n    <ClCompile Include=\"cpp\\b2DistanceJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Draw.cpp\" />\n    <ClCompile Include=\"cpp\\b2DynamicTree.cpp\" />\n    <ClCompile Include=\"cpp\\b2EdgeAndCircleContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2EdgeAndPolygonContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2EdgeShape.cpp\" />\n    <ClCompile Include=\"cpp\\b2Fixture.cpp\" />\n    <ClCompile Include=\"cpp\\b2FrictionJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2GearJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Island.cpp\" />\n    <ClCompile Include=\"cpp\\b2Joint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Math.cpp\" />\n    <ClCompile Include=\"cpp\\b2MotorJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2MouseJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2PolygonAndCircleContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2PolygonContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2PolygonShape.cpp\" />\n    <ClCompile Include=\"cpp\\b2PrismaticJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2PulleyJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2RevoluteJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Rope.cpp\" />\n    <ClCompile Include=\"cpp\\b2RopeJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Settings.cpp\" />\n    <ClCompile Include=\"cpp\\b2StackAllocator.cpp\" />\n    <ClCompile Include=\"cpp\\b2TimeOfImpact.cpp\" />\n    <ClCompile Include=\"cpp\\b2Timer.cpp\" />\n    <ClCompile Include=\"cpp\\b2WeldJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2WheelJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2World.cpp\" />\n    <ClCompile Include=\"cpp\\b2WorldCallbacks.cpp\" />\n    <ClCompile Include=\"cpp\\basicSFMLmain.cpp\" />\n    <ClCompile Include=\"cpp\\GameDialog.cpp\" />\n    <ClCompile Include=\"cpp\\GameDisplay.cpp\" />\n    <ClCompile Include=\"cpp\\GameEngine.cpp\" />\n    <ClCompile Include=\"cpp\\GameFunction.cpp\" />\n    <ClCompile Include=\"cpp\\GameKeyData.cpp\" />\n    <ClCompile Include=\"cpp\\GameSlider.cpp\" />\n    <ClCompile Include=\"cpp\\GameSystem.cpp\" />\n    <ClCompile Include=\"cpp\\GameSystemExtended.cpp\" />\n    <ClCompile Include=\"cpp\\GameTime.cpp\" />\n    <ClCompile Include=\"cpp\\isEngineSDLWrapper.cpp\" />\n    <ClCompile Include=\"cpp\\isEngineWrapper.cpp\" />\n    <ClCompile Include=\"cpp\\main.cpp\" />\n    <ClCompile Include=\"cpp\\MainObject.cpp\" />\n    <ClCompile Include=\"cpp\\TransitionEffect.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"SDL2 Template.rc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"SDL2 Template.aps\" />\n    <None Include=\"SDL2.dll\" />\n    <None Include=\"SDL2_image.dll\" />\n    <None Include=\"SDL2_mixer.dll\" />\n    <None Include=\"SDL2_ttf.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "app/src/main/SDL2_SFML.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n    <Filter Include=\"Assets\">\n      <UniqueIdentifier>{685a88e6-fbc8-479e-8305-bfd706b9dc45}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"cpp\\b2BlockAllocator.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Body.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2BroadPhase.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ChainAndCircleContact.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ChainAndPolygonContact.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ChainShape.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CircleContact.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CircleShape.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CollideCircle.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CollideEdge.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CollidePolygon.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Collision.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Contact.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ContactManager.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ContactSolver.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Distance.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2DistanceJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Draw.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2DynamicTree.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2EdgeAndCircleContact.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2EdgeAndPolygonContact.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2EdgeShape.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Fixture.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2FrictionJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2GearJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Island.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Joint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Math.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2MotorJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2MouseJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PolygonAndCircleContact.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PolygonContact.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PolygonShape.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PrismaticJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PulleyJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2RevoluteJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Rope.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2RopeJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Settings.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2StackAllocator.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2TimeOfImpact.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Timer.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2WeldJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2WheelJoint.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2World.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2WorldCallbacks.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\basicSFMLmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameDialog.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameDisplay.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameEngine.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameFunction.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameKeyData.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameSlider.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameSystem.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameSystemExtended.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameTime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\isEngineSDLWrapper.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\isEngineWrapper.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\main.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\MainObject.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\TransitionEffect.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"SDL2 Template.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"SDL2 Template.aps\" />\n    <None Include=\"SDL2.dll\" />\n    <None Include=\"SDL2_image.dll\" />\n    <None Include=\"SDL2_mixer.dll\" />\n    <None Include=\"SDL2_ttf.dll\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "app/src/main/SDL2_SFML.vcxproj.user",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"Current\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup />\n</Project>"
  },
  {
    "path": "app/src/main/build.sh",
    "content": "#!/bin/bash\n\nCMD=$1\nBUILD=$2\nVSCODE=$3\nOPTIONS=$4\n\ncwd=${PWD##*/}\n\nexport GCC_COLORS=\"error=01;31:warning=01;33:note=01;36:locus=00;34\"\n\n#==============================================================================\n# Function declarations\n\ndisplay_styled_symbol() {\n\ttput setaf $1\n\ttput bold\n\techo \"$2  $3\"\n\ttput sgr0\n}\n\nbuild_success() {\n\techo\n\tdisplay_styled_symbol 2 \"✔\" \"Succeeded!\"\n\techo\n}\n\nlaunch() {\n\tdisplay_styled_symbol 2 \" \" \"Launching bin-vscode/$BUILD/$NAME\"\n\techo\n}\n\nbuild_success_launch() {\n\techo\n\tdisplay_styled_symbol 2 \"✔\" \"Succeeded!\"\n\tlaunch\n}\n\nbuild_fail() {\n\techo\n\tdisplay_styled_symbol 1 \"✘\" \"Failed!\"\n\tdisplay_styled_symbol 1 \" \" \"Review the compile errors above.\"\n\techo\n\ttput sgr0\n\texit 1\n}\n\nbuild_prod_error() {\n\techo\n\tdisplay_styled_symbol 1 \"⭙\" \"Error: buildprod must be run on Release build.\"\n\ttput sgr0\n\texit 1\n}\n\nprofiler_done() {\n\techo\n\tdisplay_styled_symbol 2 \"⯌\" \"Profiler Completed: View $PROF_ANALYSIS_FILE for details\"\n\techo\n}\n\nprofiler_error() {\n\techo\n\tdisplay_styled_symbol 1 \"⭙\" \"Error: Profiler must be run on Debug build.\"\n\ttput sgr0\n\texit 1\n}\n\nprofiler_osx() {\n\tdisplay_styled_symbol 1 \"⭙\" \"Error: Profiling (with gprof) is not supported on Mac OSX.\"\n\ttput sgr0\n\texit 1\n}\n\nbuildrun() {\n\tdisplay_styled_symbol 3 \"⬤\" \"Build & Run: $BUILD (target: $NAME)\"\n\techo\n\tBLD=$BUILD\n\tif [[ $BUILD == 'Tests' && $1 != 'main' ]]; then\n\t\tBLD=Release\n\tfi\n\tif $MAKE_EXEC BUILD=$BLD; then\n\t\tbuild_success_launch\n\t\tif [[ $BUILD == 'Tests' ]]; then\n\t\t\tbin-vscode/Release/$NAME $OPTIONS\n\t\telse\n\t\t\tbin-vscode/$BUILD/$NAME $OPTIONS\n\t\tfi\n\telse\n\t\tbuild_fail\n\tfi\n}\n\nbuild() {\n\tdisplay_styled_symbol 3 \"⬤\" \"Build: $BUILD (target: $NAME)\"\n\techo\n\tBLD=$BUILD\n\tif [[ $BUILD == 'Tests' && $1 != 'main' ]]; then\n\t\tBLD=Release\n\tfi\n\tif $MAKE_EXEC BUILD=$BLD; then\n\t\tbuild_success\n\telse\n\t\tbuild_fail\n\tfi\n}\n\nrebuild() {\n\tdisplay_styled_symbol 3 \"⬤\" \"Rebuild: $BUILD (target: $NAME)\"\n\techo\n\tBLD=$BUILD\n\tif [[ $BUILD == 'Tests' && $1 != 'main' ]]; then\n\t\tBLD=Release\n\tfi\n\tif $MAKE_EXEC BUILD=$BLD rebuild; then\n\t\tbuild_success\n\telse\n\t\tbuild_fail\n\tfi\n}\n\nrun() {\n\tdisplay_styled_symbol 3 \"⬤\" \"Run: $BUILD (target: $NAME)\"\n\techo\n\tlaunch\n\tif [[ $BUILD == 'Tests' ]]; then\n\t\tbin-vscode/Release/$NAME $OPTIONS\n\telse\n\t\tbin-vscode/$BUILD/$NAME $OPTIONS\n\tfi\n}\n\nbuildprod() {\n\tdisplay_styled_symbol 3 \"⬤\" \"Production Build: $BUILD (target: $NAME)\"\n\techo\n\tif [[ $BUILD == 'Release' ]]; then\n\t\tRECIPE=buildprod\n\t\tif [[ $1 != 'main' ]]; then\n\t\t\tRECIPE=\n\t\tfi\n\t\tif $MAKE_EXEC BUILD=$BUILD $RECIPE; then\n\t\t\tbuild_success\n\t\telse\n\t\t\tbuild_fail\n\t\tfi\n\telse\n\t\tbuild_prod_error\n\tfi\n}\n\nprofile() {\n\tdisplay_styled_symbol 3 \"⬤\" \"Profile: $BUILD (target: $NAME)\"\n\techo\n\tif [[ $PLATFORM == 'osx' ]]; then\n\t\tprofiler_osx\n\telif [[ $BUILD == 'Debug' ]]; then\n\t\tif $MAKE_EXEC BUILD=$BUILD; then\n\t\t\tbuild_success_launch\n\t\t\ttput sgr0\n\t\t\tbin-vscode/$BUILD/$NAME\n\t\t\ttput setaf 4\n\t\t\tgprof bin-vscode/Debug/$NAME gmon.out > $PROF_ANALYSIS_FILE 2> /dev/null\n\t\t\tprofiler_done\n\t\telse\n\t\t\tbuild_fail\n\t\tfi\n\telse\n\t\tprofiler_error\n\tfi\n}\n\n#==============================================================================\n# Environment\n\nif [[ $CMD == '' ]]; then\n\tCMD=buildprod\nfi\nif [[ $BUILD == '' ]]; then\n\tBUILD=Release\nfi\n\nif [[ $OSTYPE == 'linux-gnu'* || $OSTYPE == 'cygwin'* ]]; then\n\tif [[ $OSTYPE == 'linux-gnueabihf' ]]; then\n\t\texport PLATFORM=rpi\n\telse\n\t\texport PLATFORM=linux\n\tfi\nelif [[ $OSTYPE == 'darwin'* ]]; then\n\texport PLATFORM=osx\nelif [[ $OSTYPE == 'msys' || $OSTYPE == 'win32' ]]; then\n\texport PLATFORM=windows\nfi\n\n\nif [[ $VSCODE != 'vscode' ]]; then\n\texport PATH=\"/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin\"\n\tif [[ $PLATFORM == 'windows' ]]; then\n\t\texport PATH=\"/c/SFML/bin:/c/mingw32/bin:$PATH\"\n\telse\n\t\tif [[ $PLATFORM == 'rpi' ]]; then\n\t\t\texport PATH=\"/usr/local/gcc-8.1.0/bin:$PATH\"\n\t\tfi\n\tfi\n\techo\n\techo build.sh PATH=$PATH\n\techo\nfi\n\nexport MAKE_EXEC=make\nif [[ $PLATFORM == 'windows' ]]; then\n\tif [ $(type -P \"mingw32-make.exe\") ]; then\n\t\texport MAKE_EXEC=mingw32-make.exe\n\telif [ $(type -P \"make.exe\") ]; then\n\t\texport MAKE_EXEC=make.exe\n\tfi\nfi\n\nif [[ $BUILD != \"Release\" && $BUILD != 'Debug' && $BUILD != 'Tests' ]]; then\n\tBUILD=Release\nfi\n\nPROF_EXEC=gprof\nPROF_ANALYSIS_FILE=profiler_analysis.stats\n\n#==============================================================================\n# Main script\n\nif [[ $BUILD_TARGETS == '' ]]; then\n\tBUILD_TARGETS=main\n\tNO_SRC_TARGET=1\nfi\n\nfor target in $BUILD_TARGETS; do\n\tif [[ $PLATFORM == 'windows' ]]; then\n\t\tif [[ $target == 'main' ]]; then\n\t\t\texport NAME=$cwd.exe\n\t\t\tif [[ $BUILD == 'Tests' ]]; then\n\t\t\t\tNAME=tests_$NAME\n\t\t\tfi\n\t\telse\n\t\t\tif [[ $BUILD == 'Debug' ]]; then\n\t\t\t\texport NAME=$target-d.dll\n\t\t\telse\n\t\t\t\texport NAME=$target.dll\n\t\t\tfi\n\t\tfi\n\telse\n\t\tif [[ $target == 'main' ]]; then\n\t\t\texport NAME=$cwd\n\t\t\tif [[ $BUILD == 'Tests' ]]; then\n\t\t\t\tNAME=tests_$NAME\n\t\t\tfi\n\t\telse\n\t\t\tif [[ $BUILD == 'Debug' ]]; then\n\t\t\t\texport NAME=$target-d.so\n\t\t\telse\n\t\t\t\texport NAME=$target.so\n\t\t\tfi\n\t\tfi\n\tfi\n\n\tif [[ $NO_SRC_TARGET != 1 ]]; then\n\t\texport SRC_TARGET=$target\n\tfi\n\n\tCHILD_CMD=\"$CMD $target\"\n\tif [[ $CMD == 'buildrun' && $target != 'main' ]]; then\n\t\tCHILD_CMD=build\n\tfi\n\n\n\ttput setaf 4\n\tif $CHILD_CMD ; then\n\t\ttput sgr0\n\telse\n\t\ttput setaf 1\n\t\ttput bold\n\t\techo $dec Error: Command \\\"$CHILD_CMD\\\" not recognized. $dec\n\t\ttput sgr0\n\t\texit 1\n\tfi\n\n\tRESULT=$?\n\tif [[ $RESULT != 0 ]]; then\n\t\tbreak\n\tfi\n\ndone\n\nexit 0\n"
  },
  {
    "path": "app/src/main/cmake/app_src.cmake",
    "content": "# game source file\nset(\n    app_src\n\t\n\t# game system extended\n\t${ISENGINE_SRC_DIR}/GameSystemExtended.cpp\n\n\t# game scene\n\t# ${ISENGINE_SRC_DIR}/app_src/scenes/...\n\n\t# game level objects\n\t# ${ISENGINE_SRC_DIR}/app_src/objects/...\n\n\t# widgets\n\t${ISENGINE_SRC_DIR}/GameDialog.cpp\n)"
  },
  {
    "path": "app/src/main/cmake/isengine.cmake",
    "content": "# box 2d source file\nset(\n\tbox2d_sources\n\t\n\t${ISENGINE_SRC_DIR}/b2BroadPhase.cpp\n\t${ISENGINE_SRC_DIR}/b2CollideCircle.cpp\n\t${ISENGINE_SRC_DIR}/b2CollideEdge.cpp\n\t${ISENGINE_SRC_DIR}/b2CollidePolygon.cpp\n\t${ISENGINE_SRC_DIR}/b2Collision.cpp\n\t${ISENGINE_SRC_DIR}/b2Distance.cpp\n\t${ISENGINE_SRC_DIR}/b2DynamicTree.cpp\n\t${ISENGINE_SRC_DIR}/b2TimeOfImpact.cpp\n\t${ISENGINE_SRC_DIR}/b2CircleShape.cpp\n\t${ISENGINE_SRC_DIR}/b2EdgeShape.cpp\n\t${ISENGINE_SRC_DIR}/b2ChainShape.cpp\n\t${ISENGINE_SRC_DIR}/b2PolygonShape.cpp\n\t${ISENGINE_SRC_DIR}/b2BlockAllocator.cpp\n\t${ISENGINE_SRC_DIR}/b2Draw.cpp\n\t${ISENGINE_SRC_DIR}/b2Math.cpp\n\t${ISENGINE_SRC_DIR}/b2Settings.cpp\n\t${ISENGINE_SRC_DIR}/b2StackAllocator.cpp\n\t${ISENGINE_SRC_DIR}/b2Timer.cpp\n\t${ISENGINE_SRC_DIR}/b2Body.cpp\n\t${ISENGINE_SRC_DIR}/b2ContactManager.cpp\n\t${ISENGINE_SRC_DIR}/b2Fixture.cpp\n\t${ISENGINE_SRC_DIR}/b2Island.cpp\n\t${ISENGINE_SRC_DIR}/b2World.cpp\n\t${ISENGINE_SRC_DIR}/b2WorldCallbacks.cpp\n\t${ISENGINE_SRC_DIR}/b2CircleContact.cpp\n\t${ISENGINE_SRC_DIR}/b2Contact.cpp\n\t${ISENGINE_SRC_DIR}/b2ContactSolver.cpp\n\t${ISENGINE_SRC_DIR}/b2PolygonAndCircleContact.cpp\n\t${ISENGINE_SRC_DIR}/b2EdgeAndCircleContact.cpp\n\t${ISENGINE_SRC_DIR}/b2EdgeAndPolygonContact.cpp\n\t${ISENGINE_SRC_DIR}/b2ChainAndCircleContact.cpp\n\t${ISENGINE_SRC_DIR}/b2ChainAndPolygonContact.cpp\n\t${ISENGINE_SRC_DIR}/b2PolygonContact.cpp\n\t${ISENGINE_SRC_DIR}/b2DistanceJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2FrictionJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2GearJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2Joint.cpp\n\t${ISENGINE_SRC_DIR}/b2MotorJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2MouseJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2PrismaticJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2PulleyJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2RevoluteJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2RopeJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2WeldJoint.cpp\n\t${ISENGINE_SRC_DIR}/b2WheelJoint.cpp\n)\n\n# engine source file\nset(\n\tcommun_sources\n\t\n\t${ISENGINE_SRC_DIR}/main.cpp\n\n\t# Basic SFML rendering loop\n\t${ISENGINE_SRC_DIR}/basicSFMLmain.cpp\n\n\t# core\n\t${ISENGINE_SRC_DIR}/GameEngine.cpp\n\n\t# islibconnect\n\t${ISENGINE_SRC_DIR}/isEngineWrapper.cpp\n\t${ISENGINE_SRC_DIR}/isEngineSDLWrapper.cpp\n\t\n\t# display\n\t${ISENGINE_SRC_DIR}/GameDisplay.cpp\n\t\n\t# entity\n\t${ISENGINE_SRC_DIR}/MainObject.cpp\n\t\n\t# graphic\n\t${ISENGINE_SRC_DIR}/TransitionEffect.cpp\n\t\n\t# function\n\t${ISENGINE_SRC_DIR}/GameFunction.cpp\t\t\n\t${ISENGINE_SRC_DIR}/GameKeyData.cpp\n\t${ISENGINE_SRC_DIR}/GameSlider.cpp\n\t${ISENGINE_SRC_DIR}/GameSystem.cpp\n\t${ISENGINE_SRC_DIR}/GameTime.cpp\n\t\n\t# box 2d\n\t${box2d_sources}\n)\n\n# tmx lite\nset(\n\ttmxlite_sources\n\t\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/FreeFuncs.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/ImageLayer.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/LayerGroup.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/Map.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/Object.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/ObjectGroup.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/Property.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/TileLayer.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/Tileset.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/detail/pugixml.cpp\n\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TMXLite/miniz.c\n\t)\n\n# is::Engine Windows & Linux version\nif (DEFINED ISENGINE_PC)\n\tset(\n\t\tisengine\n\t\t${commun_sources}\n\t\t${tmxlite_sources}\n\t\t\n\t\t# tiny file dialogs\n\t\t${ISENGINE_SRC_DIR}/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.cpp\n\t\t)\n# is::Engine Android version\nelseif (DEFINED ISENGINE_ANDROID)\n\tset(\n\t\tisengine\n\t\t${commun_sources}\n\t\t${ISENGINE_SRC_DIR}/SDL_android_main.c\n\t\t#${tmxlite_sources}\n\t\t)\n# is::Engine HTML version\nelseif (DEFINED ISENGINE_HTML_5)\n\tset(\n\t\tisengine\n\t\t${commun_sources}\n\t\t)\nendif()\n"
  },
  {
    "path": "app/src/main/cmake/resource.rc",
    "content": "// application icon\nMAINICON ICON DISCARDABLE \"../env/windows/icon.ico\"\n"
  },
  {
    "path": "app/src/main/codeblocks/resource.rc",
    "content": "// application icon\nMAINICON ICON \"../env/windows/icon.ico\"\n"
  },
  {
    "path": "app/src/main/copy_assets.cmd",
    "content": "@echo off\nsetlocal ENABLEEXTENSIONS\n\nREM Define source and destination\nset \"SOURCE=assets\"\nset \"DEST=romfs\"\n\nREM Check if source exists\nif not exist \"%SOURCE%\" (\n    echo [ERROR] The folder '%SOURCE%' does not exist.\n    exit /b 1\n)\n\nREM Create destination if it doesn't exist\nif not exist \"%DEST%\" (\n    echo [INFO] The folder '%DEST%' does not exist. Creating it...\n    mkdir \"%DEST%\"\n)\n\nREM Copy the 'assets' folder itself (and all contents) into 'data'\necho [INFO] Copying the '%SOURCE%' folder into '%DEST%'...\nxcopy \"%SOURCE%\" \"%DEST%\\%SOURCE%\\\" /E /I /Y /H >nul\n\necho [SUCCESS] The folder '%SOURCE%' has been copied to '%DEST%\\%SOURCE%\\'.\npause\n"
  },
  {
    "path": "app/src/main/cpp/GameDialog.cpp",
    "content": "#include \"app_src/objects/widgets/GameDialog.h\"\n\nnamespace is\n{\nGameDialog::GameDialog(sf::Texture &tex, sf::Font &fnt, GameDisplay *m_scene) :\n    MainObject(),\n    m_scene(m_scene),\n    m_showDialog(false),\n    m_mouseInCollison(false),\n    m_dialogEnd(false),\n    m_newLine(true),\n    m_msgIndex(0),\n    m_msgIndexMax(0),\n    m_size(0),\n    m_blindTime(0.f),\n    m_dialogIndex(DIALOG_NONE)\n{\n    m_strName = \"GameDialog\"; // object name\n\n    m_imageScale = 0.f;\n    is::createText(fnt, m_txtDialog, \"\", m_x, m_y, is::GameConfig::DEFAULT_RPG_DIALOG_TEXT_COLOR, is::GameConfig::DEFAULT_RPG_DIALOG_TEXT_SIZE);\n    is::createText(fnt, m_txtSkip, is::lang::pad_dialog_skip[m_scene->getGameSystem().m_gameLanguage],\n                   m_x, m_y, is::GameConfig::DEFAULT_RPG_DIALOG_SELECTED_TEXT_COLOR, true, is::GameConfig::DEFAULT_RPG_DIALOG_BUTTON_TEXT_SIZE);\n    m_strDialog = \"\";\n    is::createSprite(tex, m_sprParent, sf::IntRect(0, 0, 480, 96), sf::Vector2f(0.f, 0.f), sf::Vector2f(240.f, 48.f));\n    is::createSprite(tex, m_sprNext, sf::IntRect(64, 96, 32, 32), sf::Vector2f(0.f, 0.f), sf::Vector2f(16.f, 16.f));\n    is::createSprite(tex, m_sprSkip, sf::IntRect(0, 96, 64, 24), sf::Vector2f(0.f, 0.f), sf::Vector2f(32.f, 12.f));\n    is::setSFMLObjScale(m_txtDialog, 0.f);\n    is::centerSFMLObj(m_txtSkip);\n    is::setSFMLObjScale(m_txtSkip, 0.f);\n    is::setSFMLObjScale(m_sprParent, 0.f);\n    is::setSFMLObjScale(m_sprNext, 0.f);\n}\n\nvoid GameDialog::step(const float &DELTA_TIME)\n{\n    if (m_showDialog)\n    {\n        if (!m_scene->getGameSystem().keyIsPressed(is::GameConfig::KEY_A) && !m_scene->getGameSystem().isPressed(is::GameSystem::MOUSE))\n            m_scene->getGameSystem().m_keyIsPressed = false;\n\n        setPosition(m_scene->getViewX(), m_scene->getViewY() + 32.f);\n\n        float const _VAL(is::getMSecond(DELTA_TIME));\n        m_time += (0.8f * is::VALUE_CONVERSION) * DELTA_TIME;\n        m_blindTime += _VAL;\n        if (m_blindTime > 30.f) m_blindTime = 0.f;\n\n        auto getDialogChar = [this](int index = -1)\n        {\n            int n = m_strDialog.length();\n            wchar_t* char_array = new wchar_t[n + 1];\n            for (int i(0); i < n; i++) char_array[i] = m_strDialog[i];\n            auto my_char = char_array[((index == -1) ? m_size + 1: index)];\n            delete[] char_array;\n            return my_char;\n        };\n\n        linkArrayToEnum();\n\n        if (m_size < static_cast<int>(m_strDialog.size()) - 1)\n        {\n            if (m_time > 1.f)\n            {\n                std::wstring tempoStr = m_txtDialog.\n                                                    #if !defined(IS_ENGINE_SFML)\n                                                    getWString();\n                                                    #else\n                                                    getString();\n                                                    #endif\n                if (m_newLine)\n                {\n                    m_scene->GSMplaySound(\"change_option\"); // We play this sound\n                    m_txtDialog.setString(getDialogChar(0));\n                    m_newLine = false;\n                }\n                else\n                {\n                    m_txtDialog.setString(tempoStr + getDialogChar());\n                    m_size++;\n                }\n                m_time = 0.f;\n            }\n        }\n\n        bool mouseInCollisonSkip(false);\n        if (m_scene->mouseCollision(m_sprSkip)) mouseInCollisonSkip = true;\n        if (m_scene->getGameSystem().isPressed(is::GameSystem::ValidationButton::MOUSE) && mouseInCollisonSkip &&\n            !m_dialogEnd)\n        {\n            m_scene->GSMplaySound(\"cancel\"); // We play this sound\n            m_scene->getGameSystem().useVibrate(60);\n            m_dialogEnd = true;\n        }\n\n        m_mouseInCollison = m_scene->mouseCollision(m_sprParent);\n        if (!m_mouseInCollison && m_scene->getGameSystem().isPressed(is::GameSystem::MOUSE))\n            m_scene->getGameSystem().m_keyIsPressed = true;\n\n        if ((m_scene->getGameSystem().keyIsPressed(is::GameConfig::KEY_A) ||\n            (m_scene->getGameSystem().isPressed(is::GameSystem::ValidationButton::MOUSE) && m_mouseInCollison)) &&\n            !m_scene->getGameSystem().m_keyIsPressed && !m_dialogEnd)\n        {\n            m_scene->getGameSystem().m_keyIsPressed = true;\n            m_scene->getGameSystem().useVibrate(60);\n\n            if (m_size < static_cast<int>(m_strDialog.size()) - 1)\n            {\n                m_txtDialog.setString(m_strDialog);\n                m_size = static_cast<int>(m_strDialog.size()) - 1;\n            }\n            else\n            {\n                m_msgIndex += 2;\n                if (m_msgIndex == m_msgIndexMax)\n                {\n                    m_scene->GSMplaySound(\"cancel\"); // We play this sound\n                    m_dialogEnd = true;\n                }\n                else\n                {\n                    m_newLine = true;\n                    m_size = 0;\n                    m_txtDialog.setString(\"\");\n                }\n            }\n        }\n\n        if (!m_dialogEnd) is::increaseVar(DELTA_TIME, m_imageScale, 0.1f, 1.f, 1.f);\n        else\n        {\n            is::decreaseVar(DELTA_TIME, m_imageScale, 0.1f, 0.f, 0.f);\n            if (m_imageScale < 0.05f) m_showDialog = false;\n        }\n\n        is::setSFMLObjX_Y(m_sprParent, m_x, m_y - 90.f);\n        is::setSFMLObjX_Y(m_txtDialog, is::getSFMLObjX(m_sprParent) - 225.f,\n                          is::getSFMLObjY(m_sprParent) - 38.f);\n        is::setSFMLObjX_Y(m_sprNext, is::getSFMLObjX(m_sprParent) + 220.f,\n                          is::getSFMLObjY(m_sprParent) + 29.f);\n\n        is::setSFMLObjX_Y(m_sprSkip, m_x, m_y + 145.f);\n        is::setSFMLObjX_Y(m_txtSkip, m_x, is::getSFMLObjY(m_sprSkip));\n    }\n\n    is::setSFMLObjScale(m_txtDialog, m_imageScale);\n    is::setSFMLObjScale(m_txtSkip, m_imageScale);\n    is::setSFMLObjScale(m_sprSkip, m_imageScale);\n    is::setSFMLObjScale(m_sprParent, m_imageScale);\n    is::setSFMLObjScale(m_sprNext, m_imageScale);\n}\n\nvoid GameDialog::setDialog(DialogIndex dialogIndex)\n{\n    m_dialogEnd = false;\n    m_msgIndex = 0;\n    m_size = 0;\n    m_dialogIndex = dialogIndex;\n    m_strDialog = \"\";\n    m_txtDialog.setString(\"\");\n    m_showDialog = true;\n    m_newLine = true;\n}\n\nvoid GameDialog::setMouseInCollison(bool val)\n{\n    m_mouseInCollison = val;\n}\n\nvoid GameDialog::draw(is::Render &surface)\n{\n    if (m_imageScale > 0.05)\n    {\n        is::draw(surface, m_sprParent);\n        is::draw(surface, m_txtDialog);\n        is::draw(surface, m_txtSkip);\n        is::draw(surface, m_sprSkip);\n        if (m_blindTime < 18.f && m_size == (static_cast<int>(m_strDialog.size()) - 1)) is::draw(surface, m_sprNext);\n    }\n}\n}\n"
  },
  {
    "path": "app/src/main/cpp/GameDisplay.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2024 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/display/GameDisplay.h\"\n#include \"app_src/language/GameLanguage.h\"\n\nnamespace is\n{\nsf::Vector2f getMapPixelToCoords(GameDisplay const *scene, sf::Vector2i pixelPos)\n{\n    return scene->getRenderWindow().mapPixelToCoords(pixelPos, scene->getView());\n}\n\nGameDisplay::GameDisplay(GameSystemExtended &gameSysExt, sf::Color bgColor) :\n        m_isClosed(false),\n        m_window(gameSysExt.m_window),\n        m_view(sf::Vector2f(is::GameConfig::VIEW_WIDTH / 2.f,\n                            is::GameConfig::VIEW_HEIGHT / 2.f),\n               sf::Vector2f(is::GameConfig::VIEW_WIDTH, is::GameConfig::VIEW_HEIGHT)),\n        m_surface(gameSysExt.m_window),\n        m_gameSysExt(gameSysExt),\n        m_timeVibrateDuration(40),\n        m_optionIndex(0),\n        m_waitTime(0),\n        m_msgWaitTime(0),\n        m_sceneWidth(is::GameConfig::VIEW_WIDTH),\n        m_sceneHeight(is::GameConfig::VIEW_HEIGHT),\n        DELTA_TIME(0.f),\n        m_viewW(is::GameConfig::VIEW_WIDTH),\n        m_viewH(is::GameConfig::VIEW_HEIGHT),\n        m_viewX(m_viewW / 2.f),\n        m_viewY(m_viewH / 2.f),\n        m_sprButtonSelectScale(1.f),\n        m_isRunning(true),\n        m_windowIsActive(true),\n        m_isPlaying(true),\n        m_sceneStart(true),\n        m_sceneEnd(false),\n        m_keyBackPressed(false),\n        m_showMsg(false),\n        m_mbYesNo(false),\n        m_msgBoxMouseInCollision(false),\n        m_mouseInCollision(false)\n{\n    setViewSize(m_viewW, m_viewH);\n    setView(m_viewX, m_viewY);\n    m_windowBgColor = bgColor;\n}\n\nGameDisplay::~GameDisplay() {}\n\nvoid GameDisplay::setOptionIndex(int optionIndexValue, bool callWhenClick, float buttonScale)\n{\n    if (m_waitTime == 0) {\n        m_gameSysExt.useVibrate(m_timeVibrateDuration);\n        GSMplaySound(\"change_option\");\n        m_sprButtonSelectScale = buttonScale;\n        if (!callWhenClick) {\n            m_optionIndex += optionIndexValue;\n            m_gameSysExt.m_keyIsPressed = true;\n        } else m_optionIndex = optionIndexValue;\n    }\n}\n\nvoid GameDisplay::setOptionIndex(int optionIndexValue)\n{\n    m_optionIndex = optionIndexValue;\n}\n\nvoid GameDisplay::setTextAnimation(sf::Text &txt, sf::Sprite &spr, int val)\n{\n    if (m_optionIndex == val)\n    {\n        is::setSFMLObjX_Y(m_sprButtonSelect, is::getSFMLObjX(spr), is::getSFMLObjY(spr));\n        is::setSFMLObjFillColor(txt, is::GameConfig::DEFAULT_SFML_SELECTED_TEXT_COLOR);\n    }\n    else is::setSFMLObjFillColor(txt, is::GameConfig::DEFAULT_SFML_TEXT_COLOR);\n}\n\nvoid GameDisplay::setSprButtonSelectScale(float val)\n{\n    m_sprButtonSelectScale = val;\n}\n\nvoid GameDisplay::setView(sf::Vector2f v)\n{\n    m_view.setCenter(v.x, v.y);\n    m_surface.setView(m_view);\n}\n\nvoid GameDisplay::setView(float x, float y)\n{\n    m_view.setCenter(x, y);\n    m_surface.setView(m_view);\n}\n\nvoid GameDisplay::setView()\n{\n    m_view.setCenter(m_viewX, m_viewY);\n    m_surface.setView(m_view);\n}\n\nvoid GameDisplay::setViewVarX(float val)\n{\n    m_viewX = val;\n}\n\nvoid GameDisplay::setViewVarY(float val)\n{\n    m_viewY = val;\n}\n\nvoid GameDisplay::setViewVarXY(float x, float y)\n{\n    m_viewX = x;\n    m_viewY = y;\n}\n\nvoid GameDisplay::setViewSize(sf::Vector2f v)\n{\n    m_view.setSize(v.x, v.y);\n}\n\nvoid GameDisplay::setViewSize(float x, float y)\n{\n    m_view.setSize(x, y);\n}\n\nvoid GameDisplay::setWindowSize(sf::Vector2u v, bool updateViewSize)\n{\n#if defined(__ANDROID__)\n    m_window.setSize(v);\n    if (updateViewSize) {\n        m_viewW = v.x;\n        m_viewH = v.y;\n        m_viewX = m_viewW / 2.f;\n        m_viewY = m_viewH / 2.f;\n        m_view.setSize(m_viewW, m_viewH);\n        m_view.setCenter(m_viewX, m_viewY);\n        m_window.setView(m_view);\n        m_surface.setView(m_view);\n    }\n#endif\n}\n\nvoid GameDisplay::setWindowTitle(const std::string &title)\n{\n    m_window.setTitle(title);\n}\n\nvoid GameDisplay::setWindowBgColor(sf::Color color)\n{\n    m_windowBgColor = color;\n}\n\nvoid GameDisplay::controlEventFocusClosing(sf::Event &event)\n{\n    // Manage the state of window\n    if (event.type == sf::Event::GainedFocus) m_windowIsActive = true;\n    if (event.type == sf::Event::LostFocus) m_windowIsActive = false;\n\n    // Closing the application\n    if (event.type == sf::Event::Closed)\n    {\n        m_isRunning = false;  // quit the main render loop\n        m_window.close();\n    }\n}\n\nvoid GameDisplay::showMessageBox(const std::string &msgBody, bool mbYesNo)\n{\n    setMessageBoxData(mbYesNo);\n    m_txtMsgBox.setString(msgBody);\n}\n\nvoid GameDisplay::showMessageBox(std::wstring const &msgBody, bool mbYesNo)\n{\n    setMessageBoxData(mbYesNo);\n    m_txtMsgBox.setString(msgBody);\n}\n\nvoid GameDisplay::setWidgetsPosition()\n{\n    setSFMLObjX_Y(m_recMsgBox, sf::Vector2f(m_view.getCenter().x, m_view.getCenter().y));\n    setSFMLObjX_Y(m_sprMsgBox, sf::Vector2f(m_view.getCenter().x, m_view.getCenter().y));\n    const float dim(6.f),\n            boxXOrigin(is::getSFMLObjOriginX(m_sprMsgBox)),\n            boxYOrigin(is::getSFMLObjOriginY(m_sprMsgBox));\n    setSFMLObjX_Y(m_sprMsgBoxButton1,\n                  is::getSFMLObjX(m_sprMsgBox) - boxXOrigin +\n                  is::getSFMLObjOriginX(m_sprMsgBoxButton1) + dim,\n                  is::getSFMLObjY(m_sprMsgBox) + boxYOrigin -\n                  is::getSFMLObjHeight(m_sprMsgBoxButton1) + dim);\n    setSFMLObjX_Y(m_sprMsgBoxButton2,\n                  is::getSFMLObjX(m_sprMsgBox) + boxXOrigin -\n                  is::getSFMLObjOriginX(m_sprMsgBoxButton2) - dim,\n                  is::getSFMLObjY(m_sprMsgBox) + boxYOrigin -\n                  is::getSFMLObjHeight(m_sprMsgBoxButton2) + dim);\n    setSFMLObjX_Y(m_sprMsgBoxButton3,\n                  is::getSFMLObjX(m_sprMsgBox),\n                  is::getSFMLObjY(m_sprMsgBox) + boxYOrigin -\n                  is::getSFMLObjHeight(m_sprMsgBoxButton1) + dim);\n    setSFMLObjX_Y(m_txtMsgBox,\n                  is::getSFMLObjX(m_sprMsgBox) - boxXOrigin + 16.f,\n                  is::getSFMLObjY(m_sprMsgBox) - boxYOrigin + 8.f);\n\n    // Adjust the text on button\n    setSFMLObjX_Y(m_txtMsgBoxYes, is::getSFMLObjX(m_sprMsgBoxButton1),\n                  is::getSFMLObjY(m_sprMsgBoxButton1)\n#if defined(IS_ENGINE_SFML)\n            - is::getSFMLObjHeight(m_txtMsgBoxYes) / 4.f\n#endif\n    );\n    setSFMLObjX_Y(m_txtMsgBoxNo, is::getSFMLObjX(m_sprMsgBoxButton2),\n                  is::getSFMLObjY(m_sprMsgBoxButton2)\n#if defined(IS_ENGINE_SFML)\n            - is::getSFMLObjHeight(m_txtMsgBoxNo) / 4.f\n#endif\n    );\n    setSFMLObjX_Y(m_txtMsgBoxOK, is::getSFMLObjX(m_sprMsgBoxButton3),\n                  is::getSFMLObjY(m_sprMsgBoxButton3)\n#if defined(IS_ENGINE_SFML)\n            - is::getSFMLObjHeight(m_txtMsgBoxOK) / 4.f\n#endif\n    );\n}\n\nvoid GameDisplay::setMessageBoxData(bool mbYesNo)\n{\n    m_showMsg = true;\n    m_mbYesNo = mbYesNo;\n    if (m_mbYesNo) m_msgAnswer = MsgAnswer::NO;\n    m_msgWaitTime = 0;\n    m_msgBoxMouseInCollision = false;\n    m_txtMsgBoxYes.setString(is::lang::pad_answer_yes[m_gameSysExt.m_gameLanguage]);\n    m_txtMsgBoxNo.setString(is::lang::pad_answer_no[m_gameSysExt.m_gameLanguage]);\n    m_txtMsgBoxOK.setString(is::lang::pad_answer_ok[m_gameSysExt.m_gameLanguage]);\n\n    centerSFMLObj(m_txtMsgBoxYes);\n    centerSFMLObj(m_txtMsgBoxNo);\n    centerSFMLObj(m_txtMsgBoxOK);\n    setView();\n\n    setWidgetsPosition();\n\n    is::setSFMLObjAlpha(m_sprMsgBoxButton1, m_msgWaitTime);\n    is::setSFMLObjAlpha(m_sprMsgBoxButton2, m_msgWaitTime);\n    is::setSFMLObjAlpha(m_sprMsgBoxButton3, m_msgWaitTime);\n    is::setSFMLObjAlpha(m_sprMsgBox, m_msgWaitTime);\n    is::setSFMLObjAlpha2(m_txtMsgBoxNo, m_msgWaitTime);\n    is::setSFMLObjAlpha2(m_txtMsgBoxYes, m_msgWaitTime);\n    is::setSFMLObjAlpha2(m_txtMsgBoxOK, m_msgWaitTime);\n    is::setSFMLObjAlpha2(m_txtMsgBox, m_msgWaitTime);\n}\n\nvoid GameDisplay::updateMsgBox(int sliderDirection, bool rightSideValidation,\n                               sf::Color textDefaultColor, sf::Color selectedTextColor)\n{\n    if (m_msgWaitTime < 240) m_msgWaitTime += static_cast<int>((8.f * is::VALUE_CONVERSION) * DELTA_TIME);\n    else m_msgWaitTime = 255;\n    if (!m_gameSysExt.isPressed()) m_gameSysExt.m_keyIsPressed = false;\n\n    // Check collision with all objects of message box\n    if (mouseCollision(m_sprMsgBoxButton1, m_mousePosCurrent) ||\n        mouseCollision(m_sprMsgBoxButton2, m_mousePosCurrent) ||\n        mouseCollision(m_sprMsgBoxButton3))\n        m_msgBoxMouseInCollision = true;\n    else m_msgBoxMouseInCollision = false;\n\n    /*\n     * sliderDirection is the enum variable found in is::GameSlider. It was not called from the instance\n     * because its use is not mandatory in a Scene. This avoids the error message which implies that the\n     * instance has not been declared because here we have implemented are not used in even if it does not exist\n     * These different values (represents the enum of the class)\n        SLIDE_NONE = 0,\n        SLIDE_UP = 1,\n        SLIDE_DOWN = 2,\n        SLIDE_RIGHT = 3,\n        SLIDE_LEFT = 4\n     */\n\n    // Avoid the long pressing button effect\n    if (!m_msgBoxMouseInCollision && sliderDirection == 0 &&\n        m_gameSysExt.isPressed(is::GameSystem::MOUSE))\n        m_gameSysExt.m_keyIsPressed = true;\n\n    if (m_msgWaitTime == 255 && m_windowIsActive)\n    {\n        // If it's YES / NO message box\n        if (m_mbYesNo)\n        {\n            if ((m_gameSysExt.keyIsPressed(is::GameConfig::KEY_LEFT) || (sliderDirection == 4) ||\n                 (mouseCollision(m_sprMsgBoxButton1, m_mousePosCurrent) && m_mousePosPrevious != m_mousePosCurrent)) &&\n                m_msgAnswer != MsgAnswer::YES)\n            {\n                if (m_msgBoxMouseInCollision) m_mousePosPrevious = m_mousePosCurrent;\n                m_gameSysExt.useVibrate(m_timeVibrateDuration);\n                GSMplaySound(\"change_option\");\n                m_msgAnswer = MsgAnswer::YES; // answer = yes\n            }\n            else if ((m_gameSysExt.keyIsPressed(is::GameConfig::KEY_RIGHT) || (sliderDirection == 3) ||\n                      (mouseCollision(m_sprMsgBoxButton2, m_mousePosCurrent) && m_mousePosPrevious != m_mousePosCurrent)) &&\n                      m_msgAnswer != MsgAnswer::NO)\n            {\n                if (m_msgBoxMouseInCollision) m_mousePosPrevious = m_mousePosCurrent;\n                m_gameSysExt.useVibrate(m_timeVibrateDuration);\n                GSMplaySound(\"change_option\");\n                m_msgAnswer = MsgAnswer::NO;  // answer = no\n            }\n            else if (m_gameSysExt.isPressed(is::GameSystem::KEYBOARD) || (rightSideValidation) ||\n                    ((mouseCollision(m_sprMsgBoxButton1, m_mousePosCurrent) ||\n                      mouseCollision(m_sprMsgBoxButton2, m_mousePosCurrent)) &&\n                      m_gameSysExt.isPressed(is::GameSystem::MOUSE) && !m_gameSysExt.m_keyIsPressed))\n            {\n                m_showMsg = false;\n                m_gameSysExt.m_keyIsPressed = true;\n            }\n            else if (m_keyBackPressed)\n            {\n                m_msgAnswer = MsgAnswer::NO; // answer = no (canceled)\n                m_showMsg = false;\n                m_keyBackPressed = false;\n            }\n\n            // Texts animations\n            if (m_msgAnswer == MsgAnswer::YES)\n            {\n                is::setSFMLObjFillColor(m_txtMsgBoxYes, selectedTextColor);\n                is::setSFMLObjFillColor(m_txtMsgBoxNo, textDefaultColor);\n            }\n            else\n            {\n                is::setSFMLObjFillColor(m_txtMsgBoxNo, selectedTextColor);\n                is::setSFMLObjFillColor(m_txtMsgBoxYes, textDefaultColor);\n            }\n        }\n        else // If it's OK message box\n        {\n            if (mouseCollision(m_sprMsgBoxButton3) && m_msgAnswer == MsgAnswer::NO)\n            {\n                m_gameSysExt.useVibrate(m_timeVibrateDuration);\n                GSMplaySound(\"change_option\");\n                m_msgAnswer = MsgAnswer::YES; // answer = OK\n                is::setSFMLObjFillColor(m_txtMsgBoxOK, selectedTextColor);\n            }\n            else if (((m_gameSysExt.isPressed(is::GameSystem::KEYBOARD) || m_keyBackPressed) &&\n                     !mouseCollision(m_sprMsgBoxButton3)) || (rightSideValidation)|| (mouseCollision(m_sprMsgBoxButton3) &&\n                     m_gameSysExt.isPressed(is::GameSystem::MOUSE) && !m_gameSysExt.m_keyIsPressed))\n            {\n                m_showMsg = false;\n                m_keyBackPressed = false;\n                m_gameSysExt.m_keyIsPressed = true;\n            }\n            else if (!mouseCollision(m_sprMsgBoxButton3) && m_msgAnswer == MsgAnswer::YES)\n            {\n                m_msgAnswer = MsgAnswer::NO; // answer = NO\n                is::setSFMLObjFillColor(m_txtMsgBoxOK, textDefaultColor);\n            }\n        }\n    }\n\n    if (m_msgWaitTime != 255)\n    {\n        if (m_mbYesNo)\n        {\n            is::setSFMLObjColor(m_sprMsgBoxButton1, sf::Color(255, 255, 255, m_msgWaitTime));\n            is::setSFMLObjColor(m_sprMsgBoxButton2, sf::Color(255, 255, 255, m_msgWaitTime));\n            is::setSFMLObjFillColor(m_txtMsgBoxNo, sf::Color(selectedTextColor.r, selectedTextColor.g, selectedTextColor.b, m_msgWaitTime));\n            is::setSFMLObjFillColor(m_txtMsgBoxYes, sf::Color(textDefaultColor.r, textDefaultColor.g, textDefaultColor.b, m_msgWaitTime));\n        }\n        else\n        {\n            is::setSFMLObjColor(m_sprMsgBoxButton3, sf::Color(255, 255, 255, m_msgWaitTime));\n            is::setSFMLObjFillColor(m_txtMsgBoxOK, sf::Color(textDefaultColor.r, textDefaultColor.g, textDefaultColor.b, m_msgWaitTime));\n        }\n    }\n    is::setSFMLObjColor(m_sprMsgBox, sf::Color(255, 255, 255, m_msgWaitTime));\n    is::setSFMLObjFillColor(m_txtMsgBox, sf::Color(textDefaultColor.r, textDefaultColor.g, textDefaultColor.b, m_msgWaitTime));\n\n    if (!m_showMsg)\n    {\n        if (m_msgAnswer == MsgAnswer::NO)\n        {\n            // If is OK message box the answer is automatically YES\n            if (!m_mbYesNo)\n            {\n                m_msgAnswer = MsgAnswer::YES;\n                GSMplaySound(\"select_option\");\n                m_gameSysExt.useVibrate(m_timeVibrateDuration);\n            }\n            else GSMplaySound(\"cancel\");\n        }\n        else\n        {\n            GSMplaySound(\"select_option\");\n            m_gameSysExt.useVibrate(m_timeVibrateDuration);\n        }\n    }\n}\n\nvoid GameDisplay::updateTimeWait()\n{\n    // Waiting time before validating an option\n    if (m_waitTime > 0)\n    {\n        m_waitTime -= is::getMSecond(DELTA_TIME);\n    }\n    else m_waitTime = 0;\n}\n\nvoid GameDisplay::drawMsgBox()\n{\n    if (m_showMsg)\n    {\n        is::draw(m_surface, m_recMsgBox);\n        is::draw(m_surface, m_sprMsgBox);\n\n        if (m_mbYesNo)\n        {\n            is::draw(m_surface, m_sprMsgBoxButton1);\n            is::draw(m_surface, m_sprMsgBoxButton2);\n            is::draw(m_surface, m_txtMsgBoxYes);\n            is::draw(m_surface, m_txtMsgBoxNo);\n        }\n        else\n        {\n            is::draw(m_surface, m_sprMsgBoxButton3);\n            is::draw(m_surface, m_txtMsgBoxOK);\n        }\n        is::draw(m_surface, m_txtMsgBox);\n    }\n}\n\nvoid GameDisplay::drawScreen()\n{\n    is::clear(m_surface, m_windowBgColor);\n    #if defined(__ANDROID__)\n    // On Android when the window is no longer active, nothing is displayed just a black screen.\n    // Its allows to optimize the application\n    if (m_windowIsActive)\n    {\n    #endif\n        draw();\n    #if defined(__ANDROID__)\n    }\n    #endif\n    is::display(m_window);\n}\n\nvoid GameDisplay::showTempLoading(float time)\n{\n    float timeToQuit(0.f);\n    sf::Sprite sprTmploading, sprTmploading2;\n    is::createSprite(GRMgetTexture(\"temp_loading\"), sprTmploading, sf::Vector2f(m_viewX, m_viewY), sf::Vector2f(320.f, 240.f));\n    is::createSprite(GRMgetTexture(\"loading_icon\"), sprTmploading2, sf::Vector2f(m_viewX, m_viewY), sf::Vector2f(16.f, 16.f));\n    while (timeToQuit < time)\n    {\n        float dTime = getDeltaTime();\n        timeToQuit += is::getMSecond(dTime);\n        sprTmploading2.rotate((5.f * is::VALUE_CONVERSION) * dTime);\n\n        sf::Event ev;\n        while (m_window.pollEvent(ev))\n        {\n            if (ev.type == sf::Event::Closed) is::closeApplication();\n        }\n\n        is::clear(m_window, sf::Color::Black);\n        is::draw(m_surface, sprTmploading);\n        is::draw(m_surface, sprTmploading2);\n        is::display(m_window);\n    }\n}\n\nvoid GameDisplay::loadParentResources()\n{\n    if (!m_gameSysExt.m_loadParentResources)\n    {\n        // Load sound\n        m_gameSysExt.GSMaddSound(\"change_option\", is::GameConfig::SFX_DIR + \"change_option\" + SND_FILE_EXTENSION);\n        m_gameSysExt.GSMaddSound(\"cancel\", is::GameConfig::SFX_DIR + \"cancel\" + SND_FILE_EXTENSION);\n        m_gameSysExt.GSMaddSound(\"select_option\", is::GameConfig::SFX_DIR + \"select_option\" + SND_FILE_EXTENSION);\n\n        // Load message box sprite\n        m_gameSysExt.GRMaddTexture(\"confirm_box\", is::GameConfig::GUI_DIR + \"confirm_box.png\");\n        m_gameSysExt.GRMaddTexture(\"confirm_box_button\", is::GameConfig::GUI_DIR + \"confirm_box_button.png\");\n\n        // Temporal loading texture\n        m_gameSysExt.GRMaddTexture(\"temp_loading\", is::GameConfig::GUI_DIR + \"temp_loading.png\");\n        m_gameSysExt.GRMaddTexture(\"loading_icon\", is::GameConfig::GUI_DIR + \"loading_icon.png\");\n\n        // Load font\n        m_gameSysExt.GRMaddFont(\"font_system\", GameConfig::FONT_DIR + \"font_system.ttf\");\n        m_gameSysExt.GRMaddFont(\"font_msg\", GameConfig::FONT_DIR + \"font_msg.ttf\");\n\n        m_gameSysExt.m_loadParentResources = true;\n    }\n\n    if (m_gameSysExt.m_loadParentResources)\n    {\n        GRMuseGameSystemFont();\n        GRMuseGameSystemTexture();\n        GSMuseGameSystemSound();\n    }\n\n    auto &texMsgButton = GRMgetTexture(\"confirm_box_button\");\n    is::createSprite(GRMgetTexture(\"confirm_box\"), m_sprMsgBox, sf::Vector2f(0.f, 0.f), sf::Vector2f(0.f, 0.f));\n    is::createSprite(texMsgButton, m_sprMsgBoxButton1, sf::Vector2f(0.f, 0.f), sf::Vector2f(0.f, 0.f));\n    is::createSprite(texMsgButton, m_sprMsgBoxButton2, sf::Vector2f(0.f, 0.f), sf::Vector2f(0.f, 0.f));\n    is::createSprite(texMsgButton, m_sprMsgBoxButton3, sf::Vector2f(0.f, 0.f), sf::Vector2f(0.f, 0.f));\n\n    is::createRectangle(m_recMsgBox, sf::Vector2f(m_viewW + 40.f, m_viewH + 40.f), sf::Color(0, 0, 0, 200), 0.f, 0.f);\n\n    is::centerSFMLObj(m_sprMsgBox);\n    is::centerSFMLObj(m_sprMsgBoxButton1);\n    is::centerSFMLObj(m_sprMsgBoxButton2);\n    is::centerSFMLObj(m_sprMsgBoxButton3);\n\n    // Load font\n    auto &fontSystem = GRMgetFont(\"font_system\");\n\n    is::createText(fontSystem, m_txtMsgBox, \"\", 0.f, 0.f, is::GameConfig::DEFAULT_MSG_BOX_TEXT_SIZE);\n#if defined(IS_ENGINE_SDL_2)\n    m_txtMsgBox.m_SDLaddTextRecWSize += 32;\n#endif\n    is::createText(fontSystem, m_txtMsgBoxYes, is::lang::pad_answer_yes[m_gameSysExt.m_gameLanguage],\n                   0.f, 0.f, true, is::GameConfig::DEFAULT_MSG_BOX_BUTTON_TEXT_SIZE);\n    is::createText(fontSystem, m_txtMsgBoxNo, is::lang::pad_answer_no[m_gameSysExt.m_gameLanguage],\n                   0.f, 0.f, true, is::GameConfig::DEFAULT_MSG_BOX_BUTTON_TEXT_SIZE);\n    is::createText(fontSystem, m_txtMsgBoxOK, is::lang::pad_answer_ok[m_gameSysExt.m_gameLanguage],\n                   0.f, 0.f, true, is::GameConfig::DEFAULT_MSG_BOX_BUTTON_TEXT_SIZE);\n\n    is::createSprite(GRMgetTexture(\"temp_loading\"), m_sprLoading, sf::Vector2f(m_viewX, m_viewY), sf::Vector2f(320.f, 240.f));\n}\n\nvoid GameDisplay::setIsRunning(bool val)\n{\n    m_isRunning = val;\n}\n\nvoid GameDisplay::setIsPlaying(bool val)\n{\n    m_isPlaying = val;\n}\n\nvoid GameDisplay::quitScene(int nextScene)\n{\n    if (nextScene != -1)\n    {\n        m_gameSysExt.m_launchOption = static_cast<is::DisplayOption>(nextScene);\n        m_isRunning = false;\n    }\n    else is::closeApplication();\n}\n\nvoid GameDisplay::setWaitTime(int val)\n{\n    m_waitTime = val;\n}\n\nvoid GameDisplay::setSceneStart(bool val)\n{\n    m_sceneStart = val;\n}\n\nvoid GameDisplay::setSceneEnd(bool val)\n{\n    m_sceneEnd = val;\n}\n\nvoid GameDisplay::setKeyBackPressed(bool val)\n{\n    m_keyBackPressed = val;\n}\n\nvoid GameDisplay::setMouseInCollision()\n{\n    if (m_mousePosCurrent != m_mousePosPrevious)\n    {\n        is::setVector2(m_mousePosPrevious, m_mousePosCurrent.x, m_mousePosCurrent.y);\n        m_mouseInCollision = true;\n    }\n}\n\nfloat GameDisplay::getDeltaTime()\n{\n    float dt = m_clock.restart().asSeconds();\n    if (dt > is::MAX_CLOCK_TIME) dt = is::MAX_CLOCK_TIME;\n    return dt;\n}\n\nsf::Vector2f GameDisplay::getCursor(unsigned int finger) const\n{\n    return is::getCursor(m_window, finger);\n}\n\nbool GameDisplay::getMouseCurrentEqualToPrevious()\n{\n    return (m_mousePosCurrent == m_mousePosPrevious);\n}\n\nbool GameDisplay::inViewRec(is::MainObject *obj, bool useTexRec)\n{\n    is::Rectangle testRec;\n    if (useTexRec)\n    {\n        testRec.m_left = obj->getX();\n        testRec.m_top = obj->getY();\n        testRec.m_right = obj->getX() + is::getSFMLObjWidth(obj->getSprite());\n        testRec.m_bottom = obj->getY() + is::getSFMLObjHeight(obj->getSprite());\n    }\n    else testRec = obj->getMask();\n\n    bool isCollision = false;\n    is::Rectangle viewRec;\n    viewRec.m_left   = getViewX() - (getViewW() / 2) - 16;\n    viewRec.m_right  = getViewX() + (getViewW() / 2) + 16;\n    viewRec.m_top    = getViewY() - (getViewH() / 2);\n    viewRec.m_bottom = getViewY() + (getViewH() / 2);\n    if (is::collisionTest(testRec, viewRec))\n    {\n        isCollision = true;\n    }\n    return isCollision;\n}\n\nbool GameDisplay::inViewRec(is::MainObject &obj, bool useTexRec)\n{\n    return (inViewRec(&obj, useTexRec));\n}\n\nbool GameDisplay::getIsRunning() const\n{\n    return m_isRunning;\n}\n\n#if defined(IS_ENGINE_USE_SDM)\nvoid GameDisplay::SDMmanageScene()\n{\n    DELTA_TIME = getDeltaTime();\n    updateTimeWait();\n\n    // even loop\n    SDMmanageSceneEvents();\n\n    // starting mechanism\n    if (m_sceneStart)\n    {\n        // window has focus\n        if (m_windowIsActive)\n        {\n            if (!m_showMsg)\n            {\n                SDMstep();\n            }\n//////////////////////////////////////////////////////////////////////////////////////////////////////\n//                                      MESSAGE BOX\n//////////////////////////////////////////////////////////////////////////////////////////////////////\n            else\n            {\n                updateMsgBox(0, false);\n\n                // when user closes message box in update function execute this instruction\n                // \"m_waitTime\" allow to disable clicks on objects during a moment when user closes message box\n                if (!m_showMsg) SDMmanageSceneMsgAnswers();\n            }\n        }\n    }\n}\n\nvoid GameDisplay::SDMmanageSceneEvents()\n{\n    sf::Event event;\n    while (m_window.pollEvent(event)) // even loop\n    {\n        controlEventFocusClosing(event);\n        if (m_gameSysExt.keyIsPressed(is::GameConfig::KEY_CANCEL))\n        {\n            if (!m_showMsg) showMessageBox(is::lang::msg_quit_game[m_gameSysExt.m_gameLanguage]);\n            else if (m_msgWaitTime == 255) /* Allows to close the message box with the Cancel key when it is visible*/ m_keyBackPressed = true;\n        }\n        SDMcallObjectsEvents(event);\n    }\n}\n\nvoid GameDisplay::SDMmanageSceneMsgAnswers()\n{\n    if (m_msgAnswer == MsgAnswer::YES) // if answers is YES close application\n    {\n        m_window.close();\n        m_isRunning = false;\n    }\n    else // if answers is NO continue execution\n    {\n        m_waitTime = 20;\n    }\n}\n\nvoid GameDisplay::SDMcallObjectsEvents(sf::Event &event)\n{\n    if (m_SDMObjectsEvent)\n    {\n        // call objects events\n        for (std::list<std::shared_ptr<MainObject>>::iterator it = m_SDMsceneObjects.begin();\n            it != m_SDMsceneObjects.end(); ++it)\n        {\n            if (is::instanceExist(*it))\n            {\n                if ((*it)->m_SDMcallEvent)\n                {\n                    (*it)->event(event);\n                }\n            }\n        }\n    }\n}\n\nvoid GameDisplay::SDMstep()\n{\n    if (m_SDMObjectsStep)\n    {\n        // update scene objects\n        for (std::list<std::shared_ptr<MainObject>>::iterator it = m_SDMsceneObjects.begin();\n            it != m_SDMsceneObjects.end(); ++it)\n        {\n            if (is::instanceExist(*it))\n            {\n                if ((*it)->m_SDMcallStep)\n                {\n                    (*it)->step(DELTA_TIME);\n                }\n                if (*it != nullptr)\n                {\n                    if ((*it)->isDestroyed())\n                    {\n                        it->reset();\n                    }\n                }\n            }\n        }\n        if (m_SDMsortArray)\n        {\n            is::sortObjArrayByDepth(m_SDMsceneObjects);\n            m_SDMsortArray = false;\n        }\n    }\n}\n\nvoid GameDisplay::SDMdraw()\n{\n    if (m_SDMObjectsDraw)\n    {\n#if defined(IS_ENGINE_SDL_2)\n        std::shared_ptr<SDMBlitSDLSprite> obj = nullptr;\n#endif\n        // draw scene objects\n        for (std::list<std::shared_ptr<MainObject>>::iterator it = m_SDMsceneObjects.begin();\n            it != m_SDMsceneObjects.end(); ++it)\n        {\n            if (is::instanceExist(*it))\n            {\n                if ((*it)->m_SDMcallDraw)\n                {\n                    if ((*it)->m_SDMblitSprTextureName != \"\")\n                    {\n#if defined(IS_ENGINE_SDL_2)\n                        if (obj.get() != nullptr)\n                        {\n                            if (obj->m_strTextureName != (*it)->m_SDMblitSprTextureName)\n                            {\n                                for (unsigned int i(0); i < m_SDMblitSDLSprite.size(); ++i)\n                                {\n                                    if (m_SDMblitSDLSprite[i]->m_strTextureName == (*it)->m_SDMblitSprTextureName)\n                                    {\n                                        obj = m_SDMblitSDLSprite[i];\n                                        break;\n                                    }\n                                }\n                            }\n                        }\n                        else\n                        {\n                            for (unsigned int i(0); i < m_SDMblitSDLSprite.size(); ++i)\n                            {\n                                if (m_SDMblitSDLSprite[i]->m_strTextureName == (*it)->m_SDMblitSprTextureName)\n                                {\n                                    obj = m_SDMblitSDLSprite[i];\n                                    break;\n                                }\n                            }\n                        }\n                        obj->m_sprBlit.setTextureRect(sf::IntRect((*it)->getSprite().getTextureRect().left,\n                                                                  (*it)->getSprite().getTextureRect().top,\n                                                                  (*it)->getSprite().getTextureRect().width,\n                                                                  (*it)->getSprite().getTextureRect().height));\n                        obj->m_sprBlit.setPosition(is::getSFMLObjX((*it)->getSprite()), is::getSFMLObjY((*it)->getSprite()));\n                        obj->m_sprBlit.setOrigin(is::getSFMLObjOriginX((*it)->getSprite()), is::getSFMLObjOriginY((*it)->getSprite()));\n                        obj->m_sprBlit.setScale(is::getSFMLObjXScale((*it)->getSprite()), is::getSFMLObjYScale((*it)->getSprite()));\n                        obj->m_sprBlit.setColor((*it)->getSprite().getColor().r, (*it)->getSprite().getColor().g,\n                                                (*it)->getSprite().getColor().b, (*it)->getSprite().getColor().a);\n#endif\n                        if (inViewRec(it->get(), true))\n                        {\n                            if ((*it)->getVisible()) m_window.draw(\n                                                                  #if defined(IS_ENGINE_SDL_2)\n                                                                  obj->m_sprBlit\n                                                                  #else\n                                                                  (*it)->getSprite()\n                                                                  #endif\n                                                                  );\n                        }\n                    }\n                    else (*it)->draw(m_surface);\n                }\n            }\n        }\n    }\n    drawMsgBox();\n}\n\nvoid GameDisplay::createSprite(const std::string &spriteName, is::MainObject &obj, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, sf::Vector2f scale, unsigned int alpha)\n{\n    auto &tex = GRMgetTexture(spriteName);\n    obj.m_SDMblitSprTextureName =\n#if !defined(IS_ENGINE_SDL_2)\n                                spriteName;\n    is::createSprite(tex, obj.getSprite(), rec, sf::Vector2f(position.x, position.y), sf::Vector2f(origin.x, origin.y), false, false);\n#else\n                                GRMgetTexture(spriteName).getFileName();\n    bool exists = false;\n    for (unsigned int i(0); i < m_SDMblitSDLSprite.size(); ++i)\n    {\n        if (m_SDMblitSDLSprite[i]->m_strTextureName == obj.m_SDMblitSprTextureName)\n        {\n            exists = true;\n            break;\n        }\n    }\n    if (!exists) m_SDMblitSDLSprite.push_back(std::make_shared<is::SDMBlitSDLSprite>(obj.m_SDMblitSprTextureName, tex));\n\n    obj.getSprite().setTextureRect(sf::IntRect(rec.left, rec.top, rec.width, rec.height));\n    obj.getSprite().setPosition(position.x, position.y);\n    obj.getSprite().setOrigin(origin.x, origin.y);\n    obj.getSprite().setScale(scale.x, scale.y);\n    obj.getSprite().setColor(255, 255, 255, alpha);\n#endif\n}\n\n#endif\n}\n"
  },
  {
    "path": "app/src/main/cpp/GameEngine.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/core/GameEngine.h\"\n\n#if defined(IS_ENGINE_HTML_5)\nstd::function<void(void)> mainLoop;\nvoid MainLoop()\n{\n    return mainLoop();\n}\n#endif\n\nnamespace is\n{\nGameEngine::GameEngine():\n    m_gameSysExt(m_window)\n{}\n\nGameEngine::~GameEngine()\n{\n#if defined(IS_ENGINE_SDL_2)\n    is::SDL2freeLib();\n#endif\n};\n\nvoid GameEngine::initEngine()\n{\n    m_gameSysExt.initSystemData();\n    m_window.create(sf::VideoMode(is::GameConfig::WINDOW_WIDTH, is::GameConfig::WINDOW_HEIGHT),\n                    is::GameConfig::GAME_NAME,\n                    is::getWindowStyle());\n\n    #if !defined(__ANDROID__)\n    #if defined(IS_ENGINE_SFML)\n    // load application icon\n    sf::Image iconTex;\n    if (iconTex.loadFromFile(is::GameConfig::GUI_DIR + \"icon.png\"))\n    \tm_window.setIcon(iconTex.getSize().x, iconTex.getSize().y, iconTex.getPixelsPtr());\n    #endif\n\n    // create saving directory\n#if (!defined(IS_ENGINE_HTML_5) && !defined(IS_ENGINE_SWITCH))\n    if (!m_gameSysExt.fileExist(is::GameConfig::CONFIG_FILE))\n    {\n#if defined(IS_ENGINE_VS)\n        _mkdir\n#else\n        mkdir\n#endif\n        (is::GameConfig::DATA_PARENT_DIR.c_str()\n                #if defined(SFML_SYSTEM_LINUX) || defined(IS_ENGINE_LINUX)\n                , S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH\n                #endif\n              );\n        m_gameSysExt.saveConfig(is::GameConfig::CONFIG_FILE);\n    }\n#endif\n    #endif // defined\n\n    setFPS(m_window, is::GameConfig::FPS);\n}\n\n#if defined(IS_ENGINE_HTML_5)\nvoid GameEngine::execMainLoop(std::function<bool(void)> loop)\n{\n    mainLoop = [myLoop = loop] {(void)myLoop();};\n    emscripten_set_main_loop(&MainLoop, -1, 1);\n}\n\nvoid GameEngine::execMainLoop(std::function<void(void)> loop)\n{\n    mainLoop = loop;\n    emscripten_set_main_loop(&MainLoop, -1, 1);\n}\n#endif\n\nbool GameEngine::play()\n{\n//////////////////////////////////////////////////////////////////////////////////////////////////////\n//                                      GAME INTILISATION\n//////////////////////////////////////////////////////////////////////////////////////////////////////\n    initEngine();\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////\n//                                         GAME STARTUP\n//////////////////////////////////////////////////////////////////////////////////////////////////////\n    std::unique_ptr<ActivityController> app = nullptr;\n#if !defined(IS_ENGINE_HTML_5)\n    while (m_window.isOpen()\n#ifdef __SWITCH__\n            && appletMainLoop()\n#endif\n           )\n#else\n    EM_ASM(console.log(\"Start successfully!\");, 0);\n    execMainLoop([&]\n    {\n    if (emscripten_run_script_int(\"Module.syncdone\") == 1)\n#endif\n    {\n        if (app == nullptr) app = std::make_unique<ActivityController>(m_gameSysExt);\n        else\n        {\n            app->update();\n            app->draw();\n        }\n    }\n#if defined(IS_ENGINE_HTML_5)\n    });\n#endif\n    return true;\n}\n}\n"
  },
  {
    "path": "app/src/main/cpp/GameFunction.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2024 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/function/GameFunction.h\"\n\n#if defined(IS_ENGINE_HTML_5)\n#include <emscripten.h>\n#include <emscripten/bind.h>\n\n// Allows to send C++ string vector in javascript code\ninline std::vector<std::string> *vectorFromIntPointer(uintptr_t vec) {\n  return reinterpret_cast<std::vector<std::string> *>(vec);\n}\nEMSCRIPTEN_BINDINGS(Wrappers) {\n  emscripten::register_vector<std::string>(\"VectorString\").constructor(&vectorFromIntPointer, emscripten::allow_raw_pointers());\n};\n#endif\n\nnamespace is\n{\nconst float MAX_CLOCK_TIME = 0.018f;\nconst float VALUE_CONVERSION = 65.f;\nconst float SECOND = 59.f;\nconst float VALUE_TIME = 1.538f;\n\nstd::string w_chart_tToStr(wchar_t const *val)\n{\n    std::wstring ws(val);\n    return (std::string(ws.begin(), ws.end()));\n}\n\nstd::wstring strToWStr(const std::string &str)\n{\n    std::wstring wsTemp(str.begin(), str.end());\n    return wsTemp;\n}\n\nint getMSecond(const float &DELTA_TIME)\n{\n    return static_cast<int>(DELTA_TIME * (VALUE_TIME * VALUE_CONVERSION));\n}\n\nstd::tm makeTime(int year, int month, int day)\n{\n    std::tm tm = {0};\n    tm.tm_year = year - 1900; // years count from 1900\n    tm.tm_mon = month - 1;    // months count from January=0\n    tm.tm_mday = day;         // days count from 1\n    return tm;\n}\n\nbool checkDateLimit(int year, int mont, int day)\n{\n    time_t currentTime = time(0);\n    std::tm tm1 = makeTime(year, mont, day);\n    std::time_t expirationDate = std::mktime(&tm1);\n    const int seconds_per_day = 60 * 60 * 24;\n    return (std::difftime(expirationDate, currentTime) / seconds_per_day < 0.f);\n}\n\nvoid showLog(const std::string& str, bool stopApplication)\n{\n    #if defined(IS_ENGINE_USE_SHOWLOG)\n    #if !defined(__ANDROID__)\n    std::cout << str.c_str() << \"\\n\";\n    #else\n    __android_log_print(ANDROID_LOG_DEBUG, \"LOG_INFO\", \"%s\\n\", str.c_str());\n    #endif\n    #endif\n    if (stopApplication) is::closeApplication();\n}\n\nbool isIn(unsigned short valNumber, const int var, int x1, int x2, int x3, int x4, int x5, int x6, int x7, int x8, int x9)\n{\n    if (var == x1) return true;\n    else if (var == x2) return true;\n    else if (var == x3) return (valNumber > 2);\n    else if (var == x4) return (valNumber > 3);\n    else if (var == x5) return (valNumber > 4);\n    else if (var == x6) return (valNumber > 5);\n    else if (var == x7) return (valNumber > 6);\n    else if (var == x8) return (valNumber > 7);\n    else if (var == x9) return (valNumber > 8);\n    return false;\n}\n\nbool isBetween(float a, float b, float c)\n{\n    if (b <= c) return (b <= a && a <= c);\n    else return (c <= a && a <= b);\n}\n\nint sign(float x)\n{\n    if (x > 0.f)      return 1;\n    else if (x < 0.f) return -1;\n    else return 0;\n}\n\nfloat pointDirection(float x1, float y1, float x2, float y2)\n{\n    return atan((y1 - y2) / (x1 - x2));\n}\n\nfloat radToDeg(float x)\n{\n    return static_cast<float>((x * 180.f) / 3.14159235f);\n}\n\nfloat degToRad(float x)\n{\n    return static_cast<float>((x * 3.14159235f) / 180.f);\n}\n\nfloat lengthDirX(float dir, float angle, bool useScreenScale)\n{\n#if defined(IS_ENGINE_SDL_2)\n    if (useScreenScale)\n    {\n        if (static_cast<int>(is::IS_ENGINE_SDL_screenXScale) != 1)\n        {\n            float tempDir(dir);\n            dir += tempDir / is::IS_ENGINE_SDL_screenXScale;\n        }\n        return (dir * std::cos(degToRad(angle))) / is::IS_ENGINE_SDL_screenXScale;\n    }\n#endif\n    return dir * std::cos(degToRad(angle));\n}\n\nfloat lengthDirY(float dir, float angle, bool useScreenScale)\n{\n#if defined(IS_ENGINE_SDL_2)\n    if (useScreenScale)\n    {\n        if (static_cast<int>(is::IS_ENGINE_SDL_screenXScale) != 1)\n        {\n            float tempDir(dir);\n            dir += tempDir / is::IS_ENGINE_SDL_screenXScale;\n            return (dir * std::sin(degToRad(angle))) / is::IS_ENGINE_SDL_screenYScale;\n        }\n    }\n#endif\n    return dir * std::sin(degToRad(angle));\n}\n\nbool collisionTest(Rectangle const &a, Rectangle const &b)\n{\n    if (a.m_bottom <= b.m_top)    return false;\n    if (a.m_top    >= b.m_bottom) return false;\n    if (a.m_right  <= b.m_left)   return false;\n    if (a.m_left   >= b.m_right)  return false;\n    return true;\n}\n\nbool collisionTest(Circle const &a, Circle const &b)\n{\n    auto distanceSquared = [](int x1, int y1, int x2, int y2)\n    {\n        int deltaX = x2 - x1;\n        int deltaY = y2 - y1;\n        return deltaX * deltaX + deltaY * deltaY;\n    };\n\n    // Calculate total radius squared\n    int totalRadiusSquared = a.m_raduis + b.m_raduis;\n    totalRadiusSquared = totalRadiusSquared * totalRadiusSquared;\n\n    // If the distance between the centers of the circles is less than the sum of their radii\n    if (distanceSquared(a.m_x, a.m_y, b.m_x, b.m_y) < totalRadiusSquared) return true; // The circles have collided\n    return false; // If not\n}\n\nbool collisionTest(Circle const &circle, Rectangle const &rec)\n{\n    // temporary variables to set edges for testing\n    float testX = circle.m_x;\n    float testY = circle.m_y;\n\n    // which edge is closest?\n    if (circle.m_x < rec.m_left) testX = rec.m_left;   // test left edge\n    else if (circle.m_x > rec.m_right)   testX = rec.m_right;  // right edge\n    if (circle.m_y < rec.m_top)  testY = rec.m_top;    // top edge\n    else if (circle.m_y > rec.m_bottom)  testY = rec.m_bottom; // bottom edge\n\n    // get distance from closest edges\n    float distX = circle.m_x - testX;\n    float distY = circle.m_y - testY;\n    float distance = sqrt((distX * distX) + (distY * distY));\n\n    // if the distance is less than the radius, collision!\n    if (distance <= circle.m_raduis) return true;\n    return false;\n}\n\nbool collisionTest(Rectangle const &rec, Circle const &circle)\n{\n    return collisionTest(circle, rec);\n}\n\nvoid setTextAnimation(sf::Text &txt, sf::Sprite &spr, sf::Sprite &sprSelected, int &var, int val)\n{\n    if (var == val)\n    {\n        is::setSFMLObjX_Y(sprSelected, is::getSFMLObjX(spr), is::getSFMLObjY(spr));\n        is::setSFMLObjFillColor(txt, is::GameConfig::DEFAULT_SFML_SELECTED_TEXT_COLOR);\n    }\n    else is::setSFMLObjFillColor(txt, is::GameConfig::DEFAULT_SFML_TEXT_COLOR);\n}\n\nvoid setTextAnimation(sf::Text &txt, int &var, int val)\n{\n    if (var == val) is::setSFMLObjFillColor(txt, is::GameConfig::DEFAULT_SFML_SELECTED_TEXT_COLOR);\n    else is::setSFMLObjFillColor(txt, is::GameConfig::DEFAULT_SFML_TEXT_COLOR);\n}\n\nvoid setFrame(sf::Sprite &sprite, float frame, int subFrame, int frameWidth, int frameHeight, int recWidth, int recHeight)\n{\n    /* Description of the image decoupage algorithm\n     * be << frame >> number of the image to get (to have it start counting images from 0 to X)\n     * either << subFrame >> number of images on one line\n     * be << frameLineIndex >> number of the line corresponding to the image\n     * (frame / subFrame) returns the number of times there is << frame >> in << subFrame >> to determine the number of the line of the image\n     * 32 * (frame - (subFrame * frameLineIndex)) returns the position (number) of the image on the X axis can return the value 0 (1st image on the line)\n     * when the value of << frame >> exceeds the number of image on the X axis (the value of << subFrame >>) then we are on a new line\n     * (32 * frameLineIndex) gives the position of the image on the Y axis its value varies according to the << frame >>\n     * example: 32 * frameLineIndex = 1 when frame > subFrame; 32 * frameLineIndex = 2 when frame > subFrame * 2; ...\n     */\n    int frameLineIndex = (frame / subFrame);\n    setSFMLObjTexRec(sprite, frameWidth * (static_cast<int>(frame) - (subFrame * frameLineIndex)), frameHeight * frameLineIndex, recWidth, recHeight);\n}\n\nvoid setFrame(sf::Sprite &sprite, float frame, int subFrame, int frameSize)\n{\n    setFrame(sprite, frame, subFrame, frameSize, frameSize, frameSize, frameSize);\n}\n\n/*\nvoid createRenderTexture(sf::RenderTexture &renderTexture, unsigned int width, unsigned int height)\n{\n    renderTexture.create(width, height);\n}*/\n\nvoid createRectangle(sf::RectangleShape &rec, sf::Vector2f recSize, sf::Color color, float x, float y, bool center)\n{\n    rec.setSize(recSize);\n    if (center) is::centerSFMLObj(rec);\n    setSFMLObjFillColor(rec, color);\n    is::setSFMLObjX_Y(rec, x, y);\n}\n\nvoid textStyleConfig(sf::Text &txt, bool underLined, bool boldText, bool italicText)\n{\n    if (underLined && boldText && italicText) txt.setStyle(sf::Text::Underlined | sf::Text::Bold | sf::Text::Italic);\n    else if (underLined && boldText)          txt.setStyle(sf::Text::Underlined | sf::Text::Bold);\n    else if (underLined && italicText)        txt.setStyle(sf::Text::Underlined | sf::Text::Italic);\n    else if (boldText && italicText)          txt.setStyle(sf::Text::Bold | sf::Text::Italic);\n    else if (underLined)                      txt.setStyle(sf::Text::Underlined);\n    else if (boldText)                        txt.setStyle(sf::Text::Bold);\n    else if (italicText)                      txt.setStyle(sf::Text::Italic);\n}\n\nvoid setSFMLTextOutlineColor(sf::Text &txt, float thickness, sf::Color color)\n{\n    txt.setOutlineColor(color);\n    txt.setOutlineThickness(thickness);\n}\n\nvoid createSprite(sf::Texture &tex, sf::Sprite &spr, sf::Vector2f position, sf::Vector2f origin, bool smooth)\n{\n    #if defined(IS_ENGINE_SFML)\n    tex.setSmooth(smooth);\n    #endif\n    spr.setTexture(tex);\n    spr.setOrigin(origin.x, origin.y);\n    is::setSFMLObjX_Y(spr, position.x, position.y);\n}\n\nvoid createSprite(sf::Texture &tex, sf::Sprite &spr, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, bool repeatTexture, bool smooth)\n{\n    createSprite(tex, spr, position, origin, smooth);\n    is::setSFMLObjTexRec(spr, rec.left, rec.top, rec.width, rec.height);\n    #if defined(IS_ENGINE_SFML)\n    if (repeatTexture) tex.setRepeated(true);\n    #endif\n}\n\nvoid createSprite(sf::Texture &tex, sf::Sprite &spr, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, sf::Vector2f scale, unsigned int alpha, bool repeatTexture, bool smooth)\n{\n    createSprite(tex, spr, rec, position, origin, repeatTexture, smooth);\n    is::setSFMLObjScaleX_Y(spr, scale.x, scale.y);\n    is::setSFMLObjAlpha(spr, alpha);\n}\n\nsf::Vector2f getCursor(sf::RenderWindow &window, unsigned int finger)\n{\n    sf::Vector2i pixelPos =\n    ((IS_ENGINE_MOBILE_OS) ?\n                            sf::Touch::getPosition(finger, window)\n    :\n                            sf::Mouse::getPosition(window)\n    );\n\n    sf::Vector2f worldPos = window.mapPixelToCoords(pixelPos, window.getView());\n\n    float dx = pointDistance(window.getView().getCenter().x, window.getView().getCenter().y,\n                             worldPos.x, window.getView().getCenter().y);\n    float dy = pointDistance(window.getView().getCenter().x, window.getView().getCenter().y,\n                             window.getView().getCenter().x, worldPos.y);\n\n    if (worldPos.x < window.getView().getCenter().x) dx *= -1;\n    if (worldPos.y < window.getView().getCenter().y) dy *= -1;\n\n    return sf::Vector2f(window.getView().getCenter().x + dx, window.getView().getCenter().y + dy);\n}\n\nshort vibrate(short duration)\n{\n    #if defined(__ANDROID__)\n    JNIEnv* env = (JNIEnv*)SDL_AndroidGetJNIEnv();\n    jobject activity = (jobject)SDL_AndroidGetActivity();\n    jclass clazz(env->GetObjectClass(activity));\n    JavaVM* vm;\n    env->GetJavaVM(&vm);\n\n    // First, attach this thread to the main thread\n    JavaVMAttachArgs attachargs;\n    attachargs.version = JNI_VERSION_1_6;\n    attachargs.name = \"NativeThread\";\n    attachargs.group = NULL;\n    jint res = vm->AttachCurrentThread(&env, &attachargs);\n\n    if (res == JNI_ERR) return EXIT_FAILURE;\n\n    // Retrieve class information\n    jclass natact = env->FindClass(\"android/app/NativeActivity\");\n    jclass context = env->FindClass(\"android/content/Context\");\n\n    // Get the value of a constant\n    jfieldID fid = env->GetStaticFieldID(context, \"VIBRATOR_SERVICE\", \"Ljava/lang/String;\");\n    jobject svcstr = env->GetStaticObjectField(context, fid);\n\n    // Get the method 'getSystemService' and call it\n    jmethodID getss = env->GetMethodID(natact, \"getSystemService\", \"(Ljava/lang/String;)Ljava/lang/Object;\");\n    jobject vib_obj = env->CallObjectMethod(activity, getss, svcstr);\n\n    // Get the object's class and retrieve the member name\n    jclass vib_cls = env->GetObjectClass(vib_obj);\n    jmethodID vibrate = env->GetMethodID(vib_cls, \"vibrate\", \"(J)V\");\n\n    // Determine the timeframe\n    jlong length = duration;\n\n    // Bzzz!\n    env->CallVoidMethod(vib_obj, vibrate, length);\n\n    // Free references\n    env->DeleteLocalRef(vib_obj);\n    env->DeleteLocalRef(vib_cls);\n    env->DeleteLocalRef(svcstr);\n    env->DeleteLocalRef(context);\n    env->DeleteLocalRef(natact);\n    env->DeleteLocalRef(clazz);\n\n    // Detach thread again\n    // this line is comment because it cause a bug\n    // vm->DetachCurrentThread();\n    #elif defined(IS_ENGINE_HTML_5)\n    EM_ASM_ARGS({\n                navigator.vibrate($0);\n                }, duration);\n    #else\n    is::showLog(\"Vibrate Called ! Time : \" + is::numToStr(duration) + \" ms\");\n    #endif\n\n    return 1; // EXIT_SUCCESS;\n}\n\nvoid openURL(const std::string& url, OpenURLAction action)\n{\n    std::string urlStr;\n    switch(action)\n    {\n        case OpenURLAction::Http: urlStr = \"http://\" + url; break;\n        case OpenURLAction::Tel: urlStr = \"tel:\" + url; break;\n        default: urlStr = \"mailto:\" + url; break;\n    }\n\n#if defined(__ANDROID__)\n    JNIEnv* env = (JNIEnv*)SDL_AndroidGetJNIEnv();\n    jobject activity = (jobject)SDL_AndroidGetActivity();\n    JavaVM* vm;\n    env->GetJavaVM(&vm);\n\n    vm->AttachCurrentThread(&env, NULL);\n\n    // Retrieve class information\n    jclass activityClass = env->FindClass(\"android/app/Activity\");\n    jclass intentClass = env->FindClass(\"android/content/Intent\");\n    jclass uriClass = env->FindClass(\"android/net/Uri\");\n\n    // convert URL std::string to jstring\n    jstring uriString = env->NewStringUTF(urlStr.c_str());\n\n    // call parse method\n    jmethodID uriParse = env->GetStaticMethodID(uriClass, \"parse\", \"(Ljava/lang/String;)Landroid/net/Uri;\");\n\n    // set URL in method\n    jobject uri = env->CallStaticObjectMethod(uriClass, uriParse, uriString);\n\n    // intent action\n    jstring actionString =\n        env->NewStringUTF((action != OpenURLAction::Tel) ? \"android.intent.action.VIEW\" : \"android.intent.action.DIAL\");\n\n    // call the intent object constructor\n    jmethodID newIntent = env->GetMethodID(intentClass, \"<init>\", \"(Ljava/lang/String;Landroid/net/Uri;)V\");\n\n    // create the intent instance\n    jobject intent = env->AllocObject(intentClass);\n\n    // set intent constructor\n    env->CallVoidMethod(intent, newIntent, actionString, uri);\n\n    jmethodID startActivity = env->GetMethodID(activityClass, \"startActivity\", \"(Landroid/content/Intent;)V\");\n    env->CallVoidMethod(activity, startActivity, intent);\n\n    env->DeleteLocalRef(activityClass);\n    env->DeleteLocalRef(intentClass);\n    env->DeleteLocalRef(uriClass);\n    env->DeleteLocalRef(intent);\n    env->DeleteLocalRef(activity);\n    //vm->DetachCurrentThread();\n#elif defined(IS_ENGINE_HTML_5)\n    std::vector<std::string> vectorArray;\n    vectorArray.push_back(urlStr);\n\n    EM_ASM_ARGS\n    ({\n        var vectorArray = new Module.VectorString($0);\n        window.open(vectorArray.get(0));\n    }, &vectorArray);\n#else\n    std::string op =\n    #if !defined(SFML_SYSTEM_LINUX)\n                     std::string(\"start \")\n    #else\n                     std::string(\"xdg-open \")\n    #endif\n        .append(urlStr);\n    system(op.c_str());\n#endif\n}\n\n#if defined(__ANDROID__)\nstd::string jstring2string(JNIEnv *env, jstring jStr)\n{\n    if (!jStr) return \"\";\n\n    const jclass stringClass = env->GetObjectClass(jStr);\n    const jmethodID getBytes = env->GetMethodID(stringClass, \"getBytes\", \"(Ljava/lang/String;)[B\");\n    const jbyteArray stringJbytes = (jbyteArray) env->CallObjectMethod(jStr, getBytes, env->NewStringUTF(\"UTF-8\"));\n\n    size_t length = (size_t) env->GetArrayLength(stringJbytes);\n    jbyte* pBytes = env->GetByteArrayElements(stringJbytes, NULL);\n\n    std::string ret = std::string((char *)pBytes, length);\n    env->ReleaseByteArrayElements(stringJbytes, pBytes, JNI_ABORT);\n\n    env->DeleteLocalRef(stringJbytes);\n    env->DeleteLocalRef(stringClass);\n    return ret;\n}\n\nstd::string getDeviceId(JNIEnv *env, ANativeActivity *activity)\n{\n    jclass classActivity = env->FindClass(\"android/app/NativeActivity\");\n    jclass context = env->FindClass(\"android/content/Context\");\n    jclass telephony = env->FindClass(\"android/telephony/TelephonyManager\");\n\n    jfieldID field = env->GetStaticFieldID(context, \"TELEPHONY_SERVICE\", \"Ljava/lang/String;\");\n    jobject staticField = env->GetStaticObjectField(context, field);\n\n    jmethodID getSS = env->GetMethodID(classActivity, \"getSystemService\", \"(Ljava/lang/String;)Ljava/lang/Object;\");\n    jobject objTel = env->CallObjectMethod(activity->clazz, getSS, staticField);\n    jmethodID getId = env->GetMethodID(telephony, \"getDeviceId\", \"()Ljava/lang/String;\");\n    jstring strId = (jstring)env->CallObjectMethod(objTel, getId);\n\n    env->DeleteLocalRef(classActivity);\n    env->DeleteLocalRef(context);\n    env->DeleteLocalRef(telephony);\n    return jstring2string(env, strId);\n}\n\n#endif\n}\n"
  },
  {
    "path": "app/src/main/cpp/GameKeyData.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2024 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/function/GameKeyData.h\"\n\nnamespace is\n{\nGameKeyData::GameKeyData(is::GameDisplay *scene) :\n    MainObject(),\n    m_keyPausePressed(false),\n    m_keyLeftPressed(false),\n    m_keyRightPressed(false),\n    m_keyUpPressed(false),\n    m_keyDownPressed(false),\n    m_keyAPressed(false),\n    m_keyBPressed(false),\n    m_keyAUsed(false),\n    m_keyBUsed(false),\n    m_keyLeftUsed(false),\n    m_keyRightUsed(false),\n    m_keyUpUsed(false),\n    m_keyDownUsed(false),\n    m_disableAllKey(false),\n    m_hideGamePad(false),\n#if defined(__ANDROID__)\n    m_moveObj(0.f),\n#endif\n    m_scene(scene)\n{\n    m_strName = \"GameKeyData\";\n\n    m_moveKeyPressed   = V_KEY_NONE;\n    m_actionKeyPressed = V_KEY_NONE;\n    m_keyboardA        = &is::GameConfig::KEY_A;\n    m_keyboardB        = &is::GameConfig::KEY_B;\n    m_keyboardLeft     = &is::GameConfig::KEY_LEFT;\n    m_keyboardRight    = &is::GameConfig::KEY_RIGHT;\n    m_keyboardUp       = &is::GameConfig::KEY_UP;\n    m_keyboardDown     = &is::GameConfig::KEY_DOWN;\n    loadResources();\n}\n\nvoid GameKeyData::loadResources(bool usePadColorBlack)\n{\n    auto &tex = m_scene->GRMaddTexture(\"game_pad\", is::GameConfig::GUI_DIR + \"game_pad.png\");\n    is::createSprite(tex, m_sprJoystick[0], sf::IntRect(0, (!usePadColorBlack) ? 0 : 134, 134, 134), sf::Vector2f(0.f, 0.f), sf::Vector2f(67.f, 67.f));\n    is::createSprite(tex, m_sprJoystick[1], sf::IntRect(134, ((!m_scene->getGameSystem().m_permutePadAB) ? 0 : 67) + ((!usePadColorBlack) ? 0 : 134), 144, 67),\n                     sf::Vector2f(0.f, 0.f), sf::Vector2f(72.f, 37.f));\n    is::setSFMLObjSize(m_recJoystickMask[0], 134.f, 134.f);\n    is::setSFMLObjSize(m_recJoystickMask[1], 144.f, 74.f);\n\n    for (int i(0); i < 2; i++)\n    {\n        is::setSFMLObjFillColor(m_recJoystickMask[i], sf::Color::Blue);\n        is::centerSFMLObj(m_recJoystickMask[i]);\n    }\n\n    const float OBJ_SIZE(40.f), _ADD_SIZE(24.f), _ADD_ACT_SIZE(24.f), _ADD_W(16.f);\n    is::setSFMLObjSize(m_recKeyLeftMask, OBJ_SIZE + _ADD_W, OBJ_SIZE + _ADD_SIZE);\n    is::setSFMLObjSize(m_recKeyRightMask, OBJ_SIZE + _ADD_W, OBJ_SIZE + _ADD_SIZE);\n    is::setSFMLObjSize(m_recKeyUpMask, OBJ_SIZE + _ADD_SIZE, OBJ_SIZE + _ADD_W);\n    is::setSFMLObjSize(m_recKeyDownMask, OBJ_SIZE + _ADD_SIZE, OBJ_SIZE + _ADD_W);\n\n    is::setSFMLObjSize(m_recKeyAMask, OBJ_SIZE + _ADD_ACT_SIZE, OBJ_SIZE + _ADD_ACT_SIZE);\n    is::setSFMLObjSize(m_recKeyBMask, OBJ_SIZE + _ADD_ACT_SIZE, OBJ_SIZE + _ADD_ACT_SIZE);\n\n    is::centerSFMLObj(m_recKeyLeftMask);\n    is::centerSFMLObj(m_recKeyRightMask);\n    is::centerSFMLObj(m_recKeyUpMask);\n    is::centerSFMLObj(m_recKeyDownMask);\n    is::centerSFMLObj(m_recKeyAMask);\n    is::centerSFMLObj(m_recKeyBMask);\n}\n\nvoid GameKeyData::step(const float &DELTA_TIME)\n{\n    if (!keyAPressed()) m_keyAUsed = false;\n    if (!keyBPressed()) m_keyBUsed = false;\n    if (!keyLeftPressed()) m_keyLeftUsed = false;\n    if (!keyRightPressed()) m_keyRightUsed = false;\n    if (!keyUpPressed()) m_keyUpUsed = false;\n    if (!keyDownPressed()) m_keyDownUsed = false;\n\n    m_keyLeftPressed = keyLeftPressed();\n    m_keyRightPressed = keyRightPressed();\n    m_keyUpPressed = keyUpPressed();\n    m_keyDownPressed = keyDownPressed();\n    m_keyAPressed = keyAPressed();\n    m_keyBPressed = keyBPressed();\n\n    if (m_keyLeftPressed)\n    {\n        m_keyRightPressed = false;\n        m_keyUpPressed = false;\n        m_keyDownPressed = false;\n        if (!IS_ENGINE_MOBILE_OS) m_moveKeyPressed = V_KEY_LEFT;\n    }\n    else if (m_keyRightPressed)\n    {\n        m_keyLeftPressed = false;\n        m_keyUpPressed = false;\n        m_keyDownPressed = false;\n        if (!IS_ENGINE_MOBILE_OS) m_moveKeyPressed = V_KEY_RIGHT;\n    }\n    else if (m_keyUpPressed)\n    {\n        m_keyLeftPressed = false;\n        m_keyRightPressed = false;\n        m_keyDownPressed = false;\n        if (!IS_ENGINE_MOBILE_OS) m_moveKeyPressed = V_KEY_UP;\n    }\n    else if (m_keyDownPressed)\n    {\n        m_keyLeftPressed = false;\n        m_keyRightPressed = false;\n        m_keyUpPressed = false;\n        if (!IS_ENGINE_MOBILE_OS) m_moveKeyPressed = V_KEY_DOWN;\n    }\n\nif (is::IS_ENGINE_MOBILE_OS)\n{\n    if (m_hideGamePad)\n    {\n        if (m_moveObj < 320.f) m_moveObj += (10.f * is::VALUE_CONVERSION) * DELTA_TIME;\n    }\n    else\n    {\n        is::decreaseVar(DELTA_TIME, m_moveObj, 8.f, 0.f, 10.f);\n    }\n    float moveMaskOnX(0.f), _LIMIT(-19.f), _POS(37.f);\n    const float _W_SIZE(48.f);\n    if (m_moveKeyPressed == V_KEY_LEFT)  moveMaskOnX = -6.f;\n    if (m_moveKeyPressed == V_KEY_RIGHT) moveMaskOnX = 6.f;\n\n    is::setSFMLObjX_Y(m_sprJoystick[0],\n                      m_scene->getViewX() + m_scene->getGameSystem().m_padDirXPos,\n                      m_scene->getViewY() + m_scene->getGameSystem().m_padDirYPos + m_moveObj);\n    is::setSFMLObjX_Y(m_sprJoystick[1],\n                      m_scene->getViewX() + m_scene->getGameSystem().m_padActionXPos,\n                      m_scene->getViewY() + m_scene->getGameSystem().m_padActionYPos + m_moveObj);\n\n    is::setSFMLObjX_Y(m_recKeyLeftMask, (is::getSFMLObjX(m_sprJoystick[0]) - _W_SIZE / 2.f) + _LIMIT,\n                      is::getSFMLObjY(m_sprJoystick[0]));\n    is::setSFMLObjX_Y(m_recKeyRightMask, (is::getSFMLObjX(m_sprJoystick[0]) + _W_SIZE / 2.f) - _LIMIT,\n                      is::getSFMLObjY(m_sprJoystick[0]));\n    is::setSFMLObjX_Y(m_recKeyUpMask, is::getSFMLObjX(m_sprJoystick[0]),\n                      (is::getSFMLObjY(m_sprJoystick[0]) - _W_SIZE / 2.f) + _LIMIT);\n    is::setSFMLObjX_Y(m_recKeyDownMask, is::getSFMLObjX(m_sprJoystick[0]),\n                      (is::getSFMLObjY(m_sprJoystick[0]) + _W_SIZE / 2.f) - _LIMIT);\n\n    is::setSFMLObjX_Y(m_recKeyAMask, is::getSFMLObjX(m_sprJoystick[1]) + (_POS * ((!m_scene->getGameSystem().m_permutePadAB) ? -1.f : 1.f)),\n                      is::getSFMLObjY(m_sprJoystick[1]));\n    is::setSFMLObjX_Y(m_recKeyBMask, is::getSFMLObjX(m_sprJoystick[1]) + (_POS * ((!m_scene->getGameSystem().m_permutePadAB) ? 1.f : -1.f)),\n                      is::getSFMLObjY(m_sprJoystick[1]));\n\n    for (int i(0); i < 2; i++)\n    {\n        is::setSFMLObjX_Y(m_recJoystickMask[i], is::getSFMLObjX(m_sprJoystick[i]) + ((i == 0) ? moveMaskOnX : 0.f), is::getSFMLObjY(m_sprJoystick[i]));\n        is::setSFMLObjAlpha(m_sprJoystick[i], m_scene->getGameSystem().m_padAlpha);\n    }\n}\nelse\n{\n    if (m_keyAPressed) m_actionKeyPressed = V_KEY_A;\n    else if (m_keyBPressed) m_actionKeyPressed = V_KEY_B;\n    else m_actionKeyPressed = V_KEY_NONE;\n    if (!m_keyLeftPressed && !m_keyRightPressed && !m_keyUpPressed && !m_keyDownPressed) m_moveKeyPressed = V_KEY_NONE;\n}\n}\n\nvoid GameKeyData::draw(is::Render &surface)\n{\nif (is::IS_ENGINE_MOBILE_OS)\n{\n    if (m_moveObj < 320.f)\n    {\n        /*\n         * This displays the virtual key mask on the screen\n         *\n        for (int i(0); i < 2; i++) surface.draw(m_recJoystickMask[i]);\n        surface.draw(m_recKeyLeftMask);\n        surface.draw(m_recKeyRightMask);\n        surface.draw(m_recKeyUpMask);\n        surface.draw(m_recKeyDownMask);\n        surface.draw(m_recKeyAMask);\n        surface.draw(m_recKeyBMask);\n         */\n        for (int i(0); i < 2; i++)\n        {\n            if (m_scene->getIsPlaying()) surface.draw(m_sprJoystick[i]);\n        }\n    }\n}\n}\n\nbool GameKeyData::checkKeyPressed(VirtualKeyIndex virtualKeyIndex, sf::Keyboard::Key *keyboardIndex)\n{\n    if (m_disableAllKey) return false;\n\n    //////////////////////////////////////////////////////////\n    // Mobile version code\n//if (is::IS_ENGINE_MOBILE_OS)\n//{\n    if (virtualKeyPressed(virtualKeyIndex)) return true;\n//}\nelse\n//{\n    if (m_scene->getGameSystem().keyIsPressed(*keyboardIndex)) return true;\n//}\n    //////////////////////////////////////////////////////////\n    return false;\n}\n\nbool GameKeyData::keyLeftPressed()\n{\n    return checkKeyPressed(V_KEY_LEFT, m_keyboardLeft);\n}\n\nbool GameKeyData::keyRightPressed()\n{\n    return checkKeyPressed(V_KEY_RIGHT, m_keyboardRight);\n}\n\nbool GameKeyData::keyUpPressed()\n{\n    return checkKeyPressed(V_KEY_UP, m_keyboardUp);\n}\n\nbool GameKeyData::keyDownPressed()\n{\n    return checkKeyPressed(V_KEY_DOWN, m_keyboardDown);\n}\n\nbool GameKeyData::keyAPressed()\n{\n    return checkKeyPressed(V_KEY_A, m_keyboardA);\n}\n\nbool GameKeyData::keyBPressed()\n{\n    return checkKeyPressed(V_KEY_B, m_keyboardB);\n}\n\nbool GameKeyData::virtualKeyPressed(VirtualKeyIndex virtualKeyIndex)\n{\n    // Joystick controller\n    bool mouseOnLJoystick(false);\n    bool mouseOnRJoystick(false);\n\n    if (virtualKeyIndex == V_KEY_LEFT || virtualKeyIndex == V_KEY_RIGHT || virtualKeyIndex == V_KEY_UP || virtualKeyIndex == V_KEY_DOWN)\n    {\n        // Check collision with left joystick\n        if (m_scene->mouseCollision(m_recJoystickMask[0]) ||\n            (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recJoystickMask[0], 1))) mouseOnLJoystick = true;\n\n        if (mouseOnLJoystick)\n        {\n            if (m_moveKeyPressed != V_KEY_NONE && m_moveKeyPressed != virtualKeyIndex)\n            {\n                if (m_scene->mouseCollision(m_recKeyLeftMask) ||\n                    (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyLeftMask, 1))) m_moveKeyPressed = V_KEY_LEFT;\n                else if (m_scene->mouseCollision(m_recKeyRightMask) ||\n                     (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyRightMask, 1))) m_moveKeyPressed = V_KEY_RIGHT;\n                else if (m_scene->mouseCollision(m_recKeyUpMask) ||\n                     (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyUpMask, 1))) m_moveKeyPressed = V_KEY_UP;\n                else if (m_scene->mouseCollision(m_recKeyDownMask) ||\n                     (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyDownMask, 1))) m_moveKeyPressed = V_KEY_DOWN;\n            }\n\n            switch (m_moveKeyPressed)\n            {\n                case V_KEY_LEFT:\n                    return (m_moveKeyPressed == virtualKeyIndex);\n                break;\n                case V_KEY_RIGHT:\n                    return (m_moveKeyPressed == virtualKeyIndex);\n                break;\n                case V_KEY_UP:\n                    return (m_moveKeyPressed == virtualKeyIndex);\n                break;\n                case V_KEY_DOWN:\n                    return (m_moveKeyPressed == virtualKeyIndex);\n                break;\n\n                default: break;\n            }\n        }\n\n        // If left joystick pressed\n        if ((m_scene->getGameSystem().isPressed() ||\n             (IS_ENGINE_MOBILE_OS && m_scene->getGameSystem().isPressed(1))) && mouseOnLJoystick)\n        {\n            switch (virtualKeyIndex)\n            {\n                case V_KEY_LEFT:\n                    if (m_scene->mouseCollision(m_recKeyLeftMask) ||\n                        (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyLeftMask, 1)))\n                    {\n                        m_moveKeyPressed = V_KEY_LEFT;\n                        // is::showLog(\"L Pressed !\");\n                        return true;\n                    }\n                break;\n                case V_KEY_RIGHT:\n                    if (m_scene->mouseCollision(m_recKeyRightMask) ||\n                        (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyRightMask, 1)))\n                    {\n                        m_moveKeyPressed = V_KEY_RIGHT;\n                        // is::showLog(\"R Pressed !\");\n                        return true;\n                    }\n                break;\n                case V_KEY_UP:\n                    if (m_scene->mouseCollision(m_recKeyUpMask) ||\n                        (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyUpMask, 1)))\n                    {\n                        m_moveKeyPressed = V_KEY_UP;\n                        // is::showLog(\"U Pressed !\");\n                        return true;\n                    }\n                break;\n                case V_KEY_DOWN:\n                    if (m_scene->mouseCollision(m_recKeyDownMask) ||\n                        (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyDownMask, 1)))\n                    {\n                        m_moveKeyPressed = V_KEY_DOWN;\n                        // is::showLog(\"D Pressed !\");\n                        return true;\n                    }\n                break;\n\n                default: break;\n            }\n\n        }\n        m_moveKeyPressed = V_KEY_NONE;\n    }\n\n    if (virtualKeyIndex == V_KEY_A || virtualKeyIndex == V_KEY_B)\n    {\n        // Check collision with right joystick\n        if (m_scene->mouseCollision(m_recJoystickMask[1]) ||\n            (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recJoystickMask[1], 1))) mouseOnRJoystick = true;\n\n        // If left joystick pressed\n        if ((m_scene->getGameSystem().isPressed() ||\n             (IS_ENGINE_MOBILE_OS && m_scene->getGameSystem().isPressed(1))) && mouseOnRJoystick)\n        {\n            switch (virtualKeyIndex)\n            {\n                case V_KEY_A:\n                    if (m_scene->mouseCollision(m_recKeyAMask) ||\n                        (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyAMask, 1)))\n                    {\n                        m_actionKeyPressed = V_KEY_A;\n                        // is::showLog(\"A Pressed !\");\n                        return true;\n                    }\n                break;\n\n                case V_KEY_B:\n                    if (m_scene->mouseCollision(m_recKeyBMask) ||\n                        (IS_ENGINE_MOBILE_OS && m_scene->mouseCollision(m_recKeyBMask, 1)))\n                    {\n                        m_actionKeyPressed = V_KEY_B;\n                        // is::showLog(\"B Pressed !\");\n                        return true;\n                    }\n                break;\n\n                default: break;\n            }\n        }\n        m_actionKeyPressed = V_KEY_NONE;\n    }\n    return false;\n}\n};\n"
  },
  {
    "path": "app/src/main/cpp/GameSlider.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2024 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/function/GameSlider.h\"\n\nnamespace is\n{\nGameSlider::GameSlider(is::GameDisplay *scene):\n    MainObject(),\n    Type(SLIDE_NONE),\n    m_scene(scene),\n    m_slideDistance(64.f)\n{\n    m_strName = \"GameSlider\";\n    #if defined(IS_ENGINE_USE_SDM)\n    m_depth = 999999999; // will update this object before all others\n    #endif\n}\n\nvoid GameSlider::step(const float &DELTA_TIME)\n{\n    if (m_scene->getGameSystem().isPressed(is::GameSystem::MOUSE))\n    {\n        sf::Vector2f cursor(m_scene->getCursor());\n        if (static_cast<int>(m_time) == 0)\n        {\n            m_xStart = cursor.x;\n            m_yStart = cursor.y;\n        }\n        m_time = 5.f;\n        m_x = cursor.x;\n        m_y = cursor.y;\n        if (m_type == SLIDE_NONE)\n        {\n            if (m_x > m_xStart + m_slideDistance) m_type = SLIDE_RIGHT;\n            else if (m_x < m_xStart - m_slideDistance) m_type = SLIDE_LEFT;\n            else if (m_y < m_yStart - m_slideDistance) m_type = SLIDE_UP;\n            else if (m_y > m_yStart + m_slideDistance) m_type = SLIDE_DOWN;\n        }\n    }\n    if (m_time > 0.f) m_time -= is::getMSecond(DELTA_TIME);\n    else\n    {\n        m_type = SLIDE_NONE;\n        m_time = 0.f;\n    }\n}\n\nGameSlider::SlideDirection GameSlider::getSlideDirection() const\n{\n    switch (m_type)\n    {\n        default: break;\n        case 1: return SLIDE_UP; break;\n        case 2: return SLIDE_DOWN; break;\n        case 3: return SLIDE_RIGHT; break;\n        case 4: return SLIDE_LEFT; break;\n    }\n    return SLIDE_NONE;\n}\n}\n"
  },
  {
    "path": "app/src/main/cpp/GameSystem.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2024 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/function/GameSystem.h\"\n\nnamespace is\n{\nconst short MOUSE = 0;\nconst short KEYBOARD = -1;\nconst short ALL_BUTTONS = -2;\n\nGameSystem::GameSystem(sf::RenderWindow &window):\n    m_window(window)\n{\n    srand((unsigned int)time(0));\n    m_gameLanguage = 0; // 0 = default language\n    m_validationMouseKey    = &GameConfig::KEY_VALIDATION_MOUSE;\n    m_validationKeyboardKey = &GameConfig::KEY_VALIDATION_KEYBOARD;\n    m_disableKey = false;\n    m_enableSound = true;\n    m_enableMusic = true;\n    m_enableVibrate = true;\n    m_loadParentResources = false;\n    m_keyIsPressed = false;\n}\n\nbool GameSystem::isPressed(int finger) const\n{\n    if (m_disableKey) return false;\n    //////////////////////////////////////////////////////////\n    // Android version code\nif (is::IS_ENGINE_MOBILE_OS)\n{\n    // Exclude the keyboard test when we are on Android\n    if (finger == -1) return false;\n\n    // When testing the mouse validation buttons on PC then consider it as a touch\n    if (finger == -2) finger = 0;\n    if (sf::Touch::isDown(finger)) return true;\n}\nelse\n{\n    //////////////////////////////////////////////////////////\n    switch (finger)\n    {\n        case MOUSE:\n            if (sf::Mouse::isButtonPressed(*m_validationMouseKey)) return true;\n        break;\n        case KEYBOARD:\n            if (sf::Keyboard::isKeyPressed(*m_validationKeyboardKey)) return true;\n        break;\n        case ALL_BUTTONS:\n            if (sf::Mouse::isButtonPressed(*m_validationMouseKey)) return true;\n            else if (sf::Keyboard::isKeyPressed(*m_validationKeyboardKey)) return true;\n        break;\n    }\n}\n    return false;\n}\n\nbool GameSystem::isPressed(ValidationButton validationButton) const\n{\n    int value = validationButton;\n    return isPressed(value);\n}\n\nbool GameSystem::keyIsPressed(sf::Keyboard::Key key) const\n{\n    if (m_disableKey) return false;\n#ifdef __SWITCH__\n    const Uint8 *state = getControllerButtonState(NULL);\n\n    if (key == is::GameConfig::KEY_VALIDATION_KEYBOARD)\n        {if (state[SDL_CONTROLLER_BUTTON_START]) return true;}\n    if (key == is::GameConfig::KEY_CANCEL)\n        {if (state[SDL_CONTROLLER_BUTTON_BACK]) return true;}\n    if (key == is::GameConfig::KEY_A)\n        {if (state[SDL_CONTROLLER_BUTTON_A]) return true;}\n    if (key == is::GameConfig::KEY_B)\n        {if (state[SDL_CONTROLLER_BUTTON_B]) return true;}\n    if (key == is::GameConfig::KEY_X)\n        {if (state[SDL_CONTROLLER_BUTTON_X]) return true;}\n    if (key == is::GameConfig::KEY_Y)\n        {if (state[SDL_CONTROLLER_BUTTON_Y]) return true;}\n    if (key == is::GameConfig::KEY_LEFT)\n        {if (state[SDL_CONTROLLER_BUTTON_DPAD_LEFT]) return true;}\n    if (key == is::GameConfig::KEY_RIGHT)\n        {if (state[SDL_CONTROLLER_BUTTON_DPAD_RIGHT]) return true;}\n    if (key == is::GameConfig::KEY_UP)\n        {if (state[SDL_CONTROLLER_BUTTON_DPAD_UP]) return true;}\n    if (key == is::GameConfig::KEY_DOWN)\n        {if (state[SDL_CONTROLLER_BUTTON_DPAD_DOWN]) return true;}\n    return false;\n#endif\n    if (sf::Keyboard::isKeyPressed(key)) return true;\n    return false;\n}\n\nbool GameSystem::keyIsPressed(sf::Mouse::Button button) const\n{\n    if (m_disableKey) return false;\n    if (sf::Mouse::isButtonPressed(button)) return true;\n    return false;\n}\n\nbool GameSystem::fileExist(const std::string &fileName)\n{\n    return is::fileExist(fileName);\n}\n\nvoid GameSystem::removeFile(const std::string &fileName)\n{\n    remove(fileName.c_str());\n#if defined(IS_ENGINE_HTML_5)\n        EM_ASM(FS.syncfs(false, function(err){console.log(err)});, 0);\n#endif\n}\n\nvoid GameSystem::playSound(sf::Sound &obj)\n{\n    if (m_enableSound) is::playSFMLSnd(obj);\n}\n\nvoid GameSystem::playSound(sf::Sound *obj)\n{\n    if (m_enableSound) is::playSFMLSnd(obj);\n}\n\nvoid GameSystem::playMusic(sf::Music &obj)\n{\n    if (m_enableMusic) is::playSFMLSnd(obj);\n}\n\nvoid GameSystem::playMusic(sf::Music *obj)\n{\n    if (m_enableMusic) is::playSFMLSnd(obj);\n}\n\nvoid GameSystem::stopSound(sf::Sound &obj)\n{\n    if (m_enableSound)\n    {\n        if (is::checkSFMLSndState(obj, SFMLSndStatus::Playing)) is::stopSFMLSnd(obj);\n    }\n}\n\nvoid GameSystem::stopMusic(sf::Music &obj)\n{\n    if (m_enableMusic)\n    {\n        if (is::checkSFMLSndState(obj, SFMLSndStatus::Playing)) is::stopSFMLSnd(obj);\n    }\n}\n\nvoid GameSystem::useVibrate(short ms)\n{\n    if (m_enableVibrate) is::vibrate(ms);\n}\n\nvoid GameSystem::saveConfig(const std::string &fileName)\n{\n    FILE *file = NULL;\n    //file = fopen(fileName.c_str(), \"wb\");\n\n    if (file != NULL)\n    {\n        fwrite(&m_enableSound, sizeof(bool), 1, file);\n        fwrite(&m_enableMusic, sizeof(bool), 1, file);\n        fwrite(&m_enableVibrate, sizeof(bool), 1, file);\n        fwrite(&m_gameLanguage, sizeof(int), 1, file);\n        fwrite(&m_firstLaunch, sizeof(bool), 1, file);\n        fclose(file);\n#if defined(IS_ENGINE_HTML_5)\n        EM_ASM(FS.syncfs(false, function(err){console.log(err)});, 0);\n#endif\n    }\n}\n\nvoid GameSystem::loadConfig(const std::string &fileName)\n{\n    FILE *file = NULL;\n    //file = fopen(fileName.c_str(), \"rb\");\n\n    if (file != NULL)\n    {\n        fread(&m_enableSound, sizeof(bool), 1, file);\n        fread(&m_enableMusic, sizeof(bool), 1, file);\n        fread(&m_enableVibrate, sizeof(bool), 1, file);\n        fread(&m_gameLanguage, sizeof(int), 1, file);\n        fread(&m_firstLaunch, sizeof(bool), 1, file);\n        fclose(file);\n    }\n}\n\nvoid GameSystem::savePadConfig(const std::string &fileName)\n{\n    FILE *file = NULL;\n    //file = fopen(fileName.c_str(), \"wb\");\n\n    if (file != NULL)\n    {\n        fwrite(&m_padDirXPos, sizeof(float), 1, file);\n        fwrite(&m_padDirYPos, sizeof(float), 1, file);\n        fwrite(&m_padActionXPos, sizeof(float), 1, file);\n        fwrite(&m_padActionYPos, sizeof(float), 1, file);\n        fwrite(&m_padAlpha, sizeof(int), 1, file);\n        fwrite(&m_permutePadAB, sizeof(bool), 1, file);\n        fclose(file);\n#if defined(IS_ENGINE_HTML_5)\n        EM_ASM(FS.syncfs(false, function(err){console.log(err)});, 0);\n#endif\n    }\n}\n\nvoid GameSystem::loadPadConfig(const std::string &fileName)\n{\n    FILE *file = NULL;\n    //file = fopen(fileName.c_str(), \"rb\");\n\n    if (file != NULL)\n    {\n        fread(&m_padDirXPos, sizeof(float), 1, file);\n        fread(&m_padDirYPos, sizeof(float), 1, file);\n        fread(&m_padActionXPos, sizeof(float), 1, file);\n        fread(&m_padActionYPos, sizeof(float), 1, file);\n        fread(&m_padAlpha, sizeof(int), 1, file);\n        fread(&m_permutePadAB, sizeof(bool), 1, file);\n        fclose(file);\n    }\n}\n\nvoid GSMplaySound(const std::string& name, std::vector<std::shared_ptr<GameSound>> &GSMsound, GameSystem &gameSystem)\n{\n    bool soundExist(false);\n    WITH(GSMsound.size())\n    {\n        if (GSMsound[_I].get() != nullptr)\n        {\n            if (GSMsound[_I]->getName() == name)\n            {\n                soundExist = true;\n                if (GSMsound[_I]->getFileIsLoaded()) gameSystem.playSound(GSMsound[_I]->getSound());\n                else is::showLog(\"ERROR: Can't play <\" + name + \"> sound!\");\n                break;\n            }\n        }\n    }\n    if (!soundExist) is::showLog(\"ERROR: Can't play <\" + name + \"> sound because sound does not exist!\");\n}\n\nvoid GSMplayMusic(const std::string& name, std::vector<std::shared_ptr<\n//#if !defined(__ANDROID__)\n                  GameMusic\n//#else\n//                  GameSound\n//#endif\n                  >> &GSMmusic, GameSystem &gameSystem)\n{\n//#if defined(__ANDROID__)\n//    GSMplaySound(name, GSMmusic, gameSystem);\n//#else\n    bool musicExist(false);\n    WITH(GSMmusic.size())\n    {\n        if (GSMmusic[_I].get() != nullptr)\n        {\n            if (GSMmusic[_I]->getName() == name)\n            {\n                musicExist = true;\n                if (GSMmusic[_I]->getFileIsLoaded()) gameSystem.playMusic(GSMmusic[_I]->getMusic());\n                else is::showLog(\"ERROR: Can't play <\" + name + \"> music!\");\n                break;\n            }\n        }\n    }\n    if (!musicExist) is::showLog(\"ERROR: Can't play <\" + name + \"> music because music does not exist!\");\n//#endif\n}\n}\n"
  },
  {
    "path": "app/src/main/cpp/GameSystemExtended.cpp",
    "content": "#include \"app_src/gamesystem_ext/GameSystemExtended.h\"\n\nnamespace is\n{\nGameSystemExtended::GameSystemExtended(sf::RenderWindow &window) :\n    GameSystem(window)\n{\n    initProgress();\n\n    // Default position of the Virtual Pad Game on the screen\n    m_defaultPadDirXPos = -250.f;\n    m_defaultPadDirYPos = 170.f;\n    m_defaultPadActionXPos = 245.f;\n    m_defaultPadActionYPos = 200.f;\n\n    // Configurable position of the Virtual Pad Game on the screen\n    m_padDirXPos = m_defaultPadDirXPos;\n    m_padDirYPos = m_defaultPadDirYPos;\n    m_padActionXPos = m_defaultPadActionXPos;\n    m_padActionYPos = m_defaultPadActionYPos;\n    m_permutePadAB = false;\n    m_padAlpha = 255;\n}\n\nvoid GameSystemExtended::initProgress()\n{\n    m_gameProgression = 0; // LEVEL 1\n    m_currentLives = 3;\n    m_currentBonus = 0;\n    m_currentLevel = 0;\n    m_currentScore = 0;\n    m_currentHiScore = 0;\n}\n\nvoid GameSystemExtended::initSystemData()\n{\n    // global variable\n    m_gameLanguage = 0;\n    m_firstLaunch = true;\n\n    // Determine the number of levels\n    // LEVEL_MAX - 1 because we count the number of levels from zero (0) as for the array)\n    m_levelNumber = is::level::LevelId::LEVEL_MAX - 1;\n\n    initProgress();\n}\n\nvoid GameSystemExtended::initData(bool clearCurrentLevel)\n{\n    if (clearCurrentLevel) m_currentLevel = 0; // LEVEL 1\n    m_currentLives = 3;\n    m_currentBonus = 0;\n    m_currentScore = 0;\n}\n\nvoid GameSystemExtended::saveData(std::string const &fileName)\n{\n    FILE *file = NULL;\n    //file = fopen(fileName.c_str(), \"wb\");\n\n    if (file != NULL)\n    {\n        fwrite(&m_gameProgression, sizeof(int), 1, file);\n        fwrite(&m_currentLives, sizeof(int), 1, file);\n        fwrite(&m_currentBonus, sizeof(int), 1, file);\n        fwrite(&m_currentHiScore, sizeof(int), 1, file);\n        fclose(file);\n#if defined(IS_ENGINE_HTML_5)\n        EM_ASM(FS.syncfs(false, function(err){console.log(err)});, 0);\n#endif\n    }\n}\n\nvoid GameSystemExtended::loadData(std::string const &fileName)\n{\n    FILE *file = NULL;\n    //file = fopen(fileName.c_str(), \"rb\");\n\n    if (file != NULL)\n    {\n        fread(&m_gameProgression, sizeof(int), 1, file);\n        fread(&m_currentLives, sizeof(int), 1, file);\n        fread(&m_currentBonus, sizeof(int), 1, file);\n        fread(&m_currentHiScore, sizeof(int), 1, file);\n        fclose(file);\n    }\n}\n}\n"
  },
  {
    "path": "app/src/main/cpp/GameTime.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2024 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/function/GameFunction.h\"\n#include \"isEngine/system/function/GameTime.h\"\n\nnamespace is\n{\nGameTime::GameTime():\n    m_minute(0),\n    m_second(0),\n    m_mSecond(0)\n{\n}\n\nGameTime::GameTime(unsigned int ms):\n    m_minute(0),\n    m_second(0),\n    m_mSecond(0)\n{\n    m_mSecond  = ms;\n    m_second  += m_mSecond / 60;\n    m_minute += m_second / 60;\n\n    m_mSecond %= 60;\n    m_second %= 60;\n}\n\nGameTime::GameTime(unsigned int m, unsigned int s, unsigned int ms):\n    m_minute(m),\n    m_second(s),\n    m_mSecond(ms)\n{\n}\n\nGameTime::~GameTime()\n{\n}\n\nvoid GameTime::step(const float &DELTA_TIME)\n{\n    if (m_mSecond > 0) m_mSecond -= static_cast<int>((is::VALUE_CONVERSION * is::VALUE_TIME) * DELTA_TIME);\n    else\n    {\n        if (m_second == 0)\n        {\n            if (m_minute > 0)\n            {\n                m_second  = 59;\n                m_mSecond = 59;\n                m_minute--;\n            }\n        }\n        else\n        {\n            m_second--;\n            m_mSecond = 59;\n        }\n    }\n}\n\nvoid GameTime::addTimeValue(int m, int s, int ms)\n{\n    m_minute  += m;\n    m_second  += s;\n    if (m_second > 59)\n    {\n        m_minute++;\n        m_second = m_second - 59;\n    }\n    m_mSecond += ms;\n}\n\nvoid GameTime::setTimeValue(int m, int s, int ms)\n{\n    m_minute  = m;\n    m_second  = s;\n    m_mSecond = ms;\n}\n\nvoid GameTime::setMSecond(int ms)\n{\n    m_second = 0;\n    m_minute = 0;\n    m_mSecond  = ms;\n    m_second  += m_mSecond / 60;\n    m_minute += m_second / 60;\n\n    m_mSecond %= 60;\n    m_second %= 60;\n}\n\nGameTime& GameTime::operator=(GameTime const &t)\n{\n    m_minute  = t.m_minute;\n    m_second  = t.m_second;\n    m_mSecond = t.m_mSecond;\n    return *this;\n}\n\nunsigned int GameTime::getTimeValue() const\n{\n    return ((m_minute * 3600) + (m_second * 60) + m_mSecond);\n}\n\nunsigned int GameTime::getMinute() const\n{\n    return m_minute;\n}\n\nunsigned int GameTime::getSecond() const\n{\n    return m_second;\n}\n\nunsigned int GameTime::getMSecond() const\n{\n    return m_mSecond;\n}\n\nbool GameTime::compareTime(unsigned int m, unsigned int s, unsigned int ms) const\n{\n    return (((m * 3600) + (s * 60) + ms) >= getTimeValue());\n}\n\nconst std::string GameTime::getTimeString() const noexcept\n{\n    std::string str;\n    str = writeZero(m_minute) + \":\" + writeZero(m_second) + \".\" + writeZero(m_mSecond);\n    return str;\n}\n\nbool operator==(GameTime const &t1, GameTime const &t2)\n{\n    return (t1.getTimeValue() == t2.getTimeValue());\n}\n\nbool operator>(GameTime const &t1, GameTime const &t2)\n{\n    return (t1.getTimeValue() > t2.getTimeValue());\n}\n\nbool operator<(GameTime const &t1, GameTime const &t2)\n{\n    return (t1.getTimeValue() < t2.getTimeValue());\n}\n\nstd::ostream& operator<<(std::ostream &flux, GameTime const &t)\n{\n    flux <<\n    t.m_minute  << \"m \"  <<\n    t.m_second  << \"s \" <<\n    t.m_mSecond << \"ms\" <<\n    std::endl;\n    return flux;\n}\n}\n"
  },
  {
    "path": "app/src/main/cpp/Main.hpp",
    "content": "#ifndef MAIN_HPP\n#define MAIN_HPP\n\n#ifdef __APPLE__\n\t#include \"vscode/MacOS/MacHelper.hpp\"\n\tMacHelper macHelper;\n#endif // __APPLE__\n\n#ifdef __linux__\n\t#include \"vscode/Linux/LinuxHelper.hpp\"\n\tLinuxHelper linuxHelper;\n#endif // __linux__\n\n#ifdef _WIN32\n\t#include \"vscode/Win32/WindowsHelper.hpp\"\n\tWindowsHelper windowsHelper;\n#endif // _WIN32\n\n//\n\n#endif // MAIN_HPP\n"
  },
  {
    "path": "app/src/main/cpp/MainObject.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2024 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/entity/MainObject.h\"\n\nnamespace is\n{\nint MainObject::instanceNumber = 0;\n\nMainObject::MainObject():\n    Name(),\n#if defined(IS_ENGINE_USE_SDM)\n    Destructible(),\n    DepthObject(DepthObject::NORMAL_DEPTH),\n    Visibility(),\n#endif\n    m_x(0.f),\n    m_y(0.f),\n    m_xStart(0.f),\n    m_yStart(0.f),\n    m_xPrevious(m_x),\n    m_yPrevious(m_y),\n    m_speed(0.f),\n    m_hsp(0.f),\n    m_vsp(0.f),\n    m_frameStart(0.f),\n    m_frameEnd(0.f),\n    m_frame(0.f),\n    m_imageXscale(1.f),\n    m_imageYscale(1.f),\n    m_imageScale(1.f),\n    m_imageAngle(0.f),\n    m_xOffset(0.f),\n    m_yOffset(0.f),\n    m_time(0.f),\n    m_w(32),\n    m_h(32),\n    m_imageAlpha(255),\n    m_imageIndex(0),\n    m_isActive(false),\n    m_isSDMSprite(false),\n    m_drawMask(false)\n{\n    updateCollisionMask();\n    instanceNumber++;\n    m_instanceId = instanceNumber;\n}\n\nMainObject::MainObject(float x, float y):\n    Name(),\n#if defined(IS_ENGINE_USE_SDM)\n    Destructible(),\n    DepthObject(DepthObject::NORMAL_DEPTH),\n    Visibility(),\n#endif\n    m_x(x),\n    m_y(y),\n    m_xStart(x),\n    m_yStart(y),\n    m_xPrevious(m_x),\n    m_yPrevious(m_y),\n    m_speed(0.f),\n    m_hsp(0.f),\n    m_vsp(0.f),\n    m_frameStart(0.f),\n    m_frameEnd(0.f),\n    m_frame(0.f),\n    m_imageXscale(1.f),\n    m_imageYscale(1.f),\n    m_imageScale(1.f),\n    m_imageAngle(0.f),\n    m_xOffset(0.f),\n    m_yOffset(0.f),\n    m_time(0.f),\n    m_w(32),\n    m_h(32),\n    m_imageAlpha(255),\n    m_imageIndex(0),\n    m_isActive(false),\n    m_isSDMSprite(false),\n    m_drawMask(false)\n{\n    updateCollisionMask();\n    instanceNumber++;\n    m_instanceId = instanceNumber;\n}\n\nMainObject::MainObject(sf::Sprite &spr, float x, float y):\n    Name(),\n#if defined(IS_ENGINE_USE_SDM)\n    Destructible(),\n    DepthObject(DepthObject::NORMAL_DEPTH),\n    Visibility(),\n#endif\n    m_x((static_cast<int>(x) == 0) ? x : spr.getPosition().x),\n    m_y((static_cast<int>(y) == 0) ? y : spr.getPosition().y),\n    m_xStart(m_x),\n    m_yStart(m_y),\n    m_xPrevious(m_x),\n    m_yPrevious(m_y),\n    m_speed(0.f),\n    m_hsp(0.f),\n    m_vsp(0.f),\n    m_frameStart(0.f),\n    m_frameEnd(0.f),\n    m_frame(0.f),\n    m_imageXscale(1.f),\n    m_imageYscale(1.f),\n    m_imageScale(1.f),\n    m_imageAngle(0.f),\n    m_xOffset(0.f),\n    m_yOffset(0.f),\n    m_time(0.f),\n    m_w(32),\n    m_h(32),\n    m_imageAlpha(255),\n    m_imageIndex(0),\n    m_isActive(false),\n    m_isSDMSprite(true),\n    m_drawMask(false),\n    m_sprParent(spr)\n{\n#if defined(IS_ENGINE_USE_SDM)\n    m_SDMcallStep = false;\n    m_SDMcallEvent = false;\n#endif\n    setRectangleMask(spr.getTexture()->getSize().x, spr.getTexture()->getSize().y);\n    updateCollisionMask();\n    updateSprite();\n    instanceNumber++;\n    m_instanceId = instanceNumber;\n}\n\nMainObject::MainObject(sf::Texture &tex, float x, float y, bool center):\n    Name(),\n#if defined(IS_ENGINE_USE_SDM)\n    Destructible(),\n    DepthObject(DepthObject::NORMAL_DEPTH),\n#endif\n    m_x(x),\n    m_y(y),\n    m_xStart(m_x),\n    m_yStart(m_y),\n    m_xPrevious(m_x),\n    m_yPrevious(m_y),\n    m_speed(0.f),\n    m_hsp(0.f),\n    m_vsp(0.f),\n    m_frameStart(0.f),\n    m_frameEnd(0.f),\n    m_frame(0.f),\n    m_imageXscale(1.f),\n    m_imageYscale(1.f),\n    m_imageScale(1.f),\n    m_imageAngle(0.f),\n    m_xOffset(0.f),\n    m_yOffset(0.f),\n    m_time(0.f),\n    m_w(32),\n    m_h(32),\n    m_imageAlpha(255),\n    m_imageIndex(0),\n    m_isActive(false),\n    m_isSDMSprite(true),\n    m_drawMask(false)\n{\n    m_centerSpr = center;\n#if defined(IS_ENGINE_USE_SDM)\n    m_SDMcallStep = false;\n    m_SDMcallEvent = false;\n#endif\n    setRectangleMask(tex.getSize().x, tex.getSize().y);\n    is::createSprite(tex, m_sprParent, sf::Vector2f(m_x, m_y), sf::Vector2f(0.f, 0.f));\n    if (!m_centerSpr) updateCollisionMask();\n    else\n    {\n        is::centerSFMLObj(m_sprParent);\n        centerCollisionMask(m_x, m_y);\n    }\n    updateSprite();\n    instanceNumber++;\n    m_instanceId = instanceNumber;\n}\n\nMainObject::~MainObject()\n{\n    instanceNumber--;\n}\n\nvoid MainObject::setPosition(float x, float y)\n{\n    m_xPrevious = m_x;\n    m_yPrevious = m_y;\n    m_x = x;\n    m_y = y;\n    updateSDMsprite();\n}\n\nvoid MainObject::setSpriteScale(float x, float y)\n{\n    is::setSFMLObjScaleX_Y(m_sprParent, x, y);\n}\n\nvoid MainObject::setXStart(float x)\n{\n    m_xStart = x;\n}\n\nvoid MainObject::setYStart(float y)\n{\n    m_yStart = y;\n}\n\nvoid MainObject::setXPrevious(float x)\n{\n    m_xPrevious = x;\n}\n\nvoid MainObject::setYPrevious(float y)\n{\n    m_yPrevious = y;\n}\n\nvoid MainObject::setStartPosition(float x, float y)\n{\n    m_xStart = x;\n    m_yStart = y;\n}\n\nvoid MainObject::setX(float x)\n{\n    setPosition(x, m_y);\n}\n\nvoid MainObject::setY(float y)\n{\n    setPosition(m_x, y);\n}\n\nvoid MainObject::moveX(float x)\n{\n    setPosition(m_x + x, m_y);\n}\n\nvoid MainObject::moveY(float y)\n{\n    setPosition(m_x, m_y + y);\n}\n\nvoid MainObject::setSpeed(float val)\n{\n    m_speed = val;\n}\n\nvoid MainObject::setHsp(float val)\n{\n    m_hsp = val;\n}\n\nvoid MainObject::setVsp(float val)\n{\n    m_vsp = val;\n}\n\nvoid MainObject::setAngularMove(const float &DELTA_TIME, float speed, float angle)\n{\n    m_x += (is::lengthDirX(speed, angle) * is::VALUE_CONVERSION) * DELTA_TIME;\n    m_y -= (is::lengthDirY(speed, angle) * is::VALUE_CONVERSION) * DELTA_TIME;\n    updateSDMsprite();\n}\n\nvoid MainObject::setFrame(float val)\n{\n    m_frame = val;\n}\n\nvoid MainObject::setFrameStart(float val)\n{\n    m_frameStart = val;\n}\n\nvoid MainObject::setFrameEnd(float val)\n{\n    m_frameEnd = val;\n}\n\nvoid MainObject::setImageXscale(float val)\n{\n    setImageScaleX_Y(val, m_imageYscale);\n}\n\nvoid MainObject::setImageYscale(float val)\n{\n    setImageScaleX_Y(m_imageXscale, val);\n}\n\nvoid MainObject::setImageScale(float val, bool updateXYscale)\n{\n    m_imageScale = val;\n    if (updateXYscale) setImageScaleX_Y(m_imageScale, m_imageScale);\n}\n\nvoid MainObject::setImageAngle(float val)\n{\n    m_imageAngle = val;\n    updateSDMsprite();\n}\n\nvoid MainObject::setXOffset(float val)\n{\n    setXYOffset(val, m_xOffset);\n}\n\nvoid MainObject::setYOffset(float val)\n{\n    setXYOffset(m_xOffset, val);\n}\n\nvoid MainObject::setXYOffset(float x, float y)\n{\n    m_xOffset = x;\n    m_yOffset = y;\n    updateSDMsprite();\n}\n\nvoid MainObject::setXYOffset()\n{\n    setXYOffset(is::getSFMLObjOriginX(m_sprParent), is::getSFMLObjOriginY(m_sprParent));\n}\n\nvoid MainObject::setImageScaleX_Y(float x, float y)\n{\n    m_imageXscale = x;\n    m_imageYscale = y;\n    updateSDMsprite();\n}\n\nvoid MainObject::setTime(float x)\n{\n    m_time = x;\n}\n\nvoid MainObject::setImageAlpha(int val)\n{\n    m_imageAlpha = val;\n    updateSDMsprite();\n}\n\nvoid MainObject::setImageIndex(int val)\n{\n    m_imageIndex = val;\n}\n\nvoid MainObject::setMaskW(int val)\n{\n    m_w = val;\n}\n\nvoid MainObject::setMaskH(int val)\n{\n    m_h = val;\n}\n\nvoid MainObject::setRectangleMask(int width, int height)\n{\n    m_w = width;\n    m_h = height;\n    m_circle.m_raduis = 0.f;\n    updateCollisionMask();\n}\n\nvoid MainObject::setCircleMask(float raduis)\n{\n    m_circle.m_raduis = raduis;\n    m_w = 0;\n    m_h = 0;\n    updateCollisionMask();\n}\n\nvoid MainObject::setIsActive(bool val)\n{\n    m_isActive = val;\n}\n\nvoid MainObject::updateCollisionMask()\n{\n    if (m_w > 0 && m_h > 0)\n    {\n        m_aabb.m_left   = static_cast<int>(m_x);\n        m_aabb.m_top    = static_cast<int>(m_y);\n        m_aabb.m_right  = static_cast<int>(m_x) + m_w;\n        m_aabb.m_bottom = static_cast<int>(m_y) + m_h;\n    }\n    else {m_circle.m_x = m_x; m_circle.m_y = m_y;}\n}\n\nvoid MainObject::updateCollisionMask(int x, int y)\n{\n    if (m_w > 0 && m_h > 0)\n    {\n        m_aabb.m_left   = static_cast<int>(x);\n        m_aabb.m_top    = static_cast<int>(y);\n        m_aabb.m_right  = static_cast<int>(x) + m_w;\n        m_aabb.m_bottom = static_cast<int>(y) + m_h;\n    }\n    else {m_circle.m_x = x; m_circle.m_y = y;}\n}\n\nvoid MainObject::centerCollisionMask(int x, int y)\n{\n    if (m_w > 0 && m_h > 0)\n    {\n        m_aabb.m_left   = static_cast<int>(x - m_w / 2.f);\n        m_aabb.m_top    = static_cast<int>(y - m_h / 2.f);\n        m_aabb.m_right  = static_cast<int>(x + m_w / 2.f);\n        m_aabb.m_bottom = static_cast<int>(y + m_h / 2.f);\n    }\n    else {m_circle.m_x = x; m_circle.m_y = y;}\n}\n\nvoid MainObject::updateSprite()\n{\n    is::setSFMLObjAlpha(m_sprParent, m_imageAlpha);\n    is::setSFMLObjAngle(m_sprParent, m_imageAngle);\n    is::setSFMLObjScaleX_Y(m_sprParent, m_imageXscale, m_imageYscale);\n    is::setSFMLObjX_Y(m_sprParent, m_x + m_xOffset, m_y + m_yOffset);\n}\n\nvoid MainObject::updateSprite(float x, float y, float angle, int alpha, float xScale, float yScale, float xOffset, float yOffset)\n{\n    is::setSFMLObjAlpha(m_sprParent, alpha);\n    is::setSFMLObjAngle(m_sprParent, angle);\n    is::setSFMLObjScaleX_Y(m_sprParent, xScale, yScale);\n    is::setSFMLObjX_Y(m_sprParent, x + xOffset, y + yOffset);\n}\n\nvoid MainObject::draw(is::Render &surface)\n{\n    is::draw(surface, m_sprParent);\n    if (m_drawMask) drawMask(surface);\n}\n\nvoid MainObject::drawMask(is::Render &surface, sf::Color color)\n{\n    // We draw the AABB (rectangle, square) mask only if it has dimensions\n    if (m_w > 0 && m_h > 0)\n    {\n        sf::RectangleShape rec(sf::Vector2f(static_cast<float>(m_w), static_cast<float>(m_h)));\n        rec.setOutlineThickness(1.f);\n        rec.setFillColor(sf::Color::Transparent);\n        rec.setOutlineColor(color);\n        is::setSFMLObjX_Y(rec, static_cast<float>(m_aabb.m_left), static_cast<float>(m_aabb.m_top));\n        is::draw(surface, rec);\n    }\n    else if (m_circle.m_raduis > 0.f) // We draw the circle mask only if it has dimensions\n    {\n        sf::CircleShape circle(m_circle.m_raduis);\n        circle.setOutlineThickness(1.f);\n        circle.setFillColor(sf::Color::Transparent);\n        circle.setOutlineColor(color);\n        is::centerSFMLObj(circle);\n        is::setSFMLObjX_Y(circle, m_circle.m_x, m_circle.m_y);\n        is::draw(surface, circle);\n    }\n}\n\nvoid MainObject::setFrameLimit(float frameStart, float frameEnd)\n{\n    if (frameEnd > -1.f)\n    {\n        if (m_frame > frameEnd) m_frame = frameStart;\n        if (m_frame < frameStart)  m_frame = frameStart;\n    }\n    else m_frame = frameStart;\n}\n\nfloat MainObject::distantToPoint(float x, float y) const\n{\n   float X = (getX() + getMaskW() / 2)  - x;\n   float Y = (getY() + getMaskH() / 2) - y;\n   return sqrt(X * X + Y * Y);\n}\n\nfloat MainObject::distantToObject(MainObject const *other, bool useSpritePosition) const\n{\n   float X = ((useSpritePosition) ? getSpriteX() - other->getSpriteX() : (getX() + (getMaskW() / 2))  - (other->getX() + (other->getMaskW() / 2)));\n   float Y = ((useSpritePosition) ? getSpriteY() - other->getSpriteY() : (getY() + (getMaskH() / 2)) - (other->getY() + (other->getMaskH() / 2)));\n   return sqrt(X * X + Y * Y);\n}\n\nfloat MainObject::distantToObject(std::shared_ptr<MainObject> const &other, bool useSpritePosition) const\n{\n   float X = ((useSpritePosition) ? getSpriteX() - other->getSpriteX() : (getX() + (getMaskW() / 2))  - (other->getX() + (other->getMaskW() / 2)));\n   float Y = ((useSpritePosition) ? getSpriteY() - other->getSpriteY() : (getY() + (getMaskH() / 2)) - (other->getY() + (other->getMaskH() / 2)));\n   return sqrt(X * X + Y * Y);\n}\n\nfloat MainObject::pointDirection(float x, float y) const\n{\n    return (is::pointDirection<float>(m_x, m_y, x, y));\n}\n\nfloat MainObject::pointDirection(std::shared_ptr<MainObject> const &other) const\n{\n    return (is::pointDirection<float>(m_x, m_y, other->getX(), other->getY()));\n}\n\nfloat MainObject::pointDirectionSprite(float x, float y) const\n{\n    return (is::pointDirection<float>(getSpriteX(), getSpriteY(), x, y));\n}\n\nfloat MainObject::pointDirectionSprite(std::shared_ptr<MainObject> const &other) const\n{\n    return (is::pointDirection<float>(getSpriteX(), getSpriteY(), other->getSpriteX(), other->getSpriteY()));\n}\n\nfloat MainObject::getSpeed() const\n{\n    return m_speed;\n}\n\nfloat MainObject::getHsp() const\n{\n    return m_hsp;\n}\n\nfloat MainObject::getVsp() const\n{\n    return m_vsp;\n}\n\nfloat MainObject::getFrame() const\n{\n    return m_frame;\n}\n\nfloat MainObject::getFrameStart() const\n{\n    return m_frameStart;\n}\n\nfloat MainObject::getFrameEnd() const\n{\n    return m_frameEnd;\n}\n\nfloat MainObject::getImageXscale() const\n{\n    return m_imageXscale;\n}\n\nfloat MainObject::getImageYscale() const\n{\n    return m_imageYscale;\n}\n\nfloat MainObject::getImageScale() const\n{\n    return m_imageScale;\n}\n\nfloat MainObject::getImageAngle() const\n{\n    return m_imageAngle;\n}\n\nfloat MainObject::getXOffset() const\n{\n    return m_xOffset;\n}\n\nfloat MainObject::getYOffset() const\n{\n    return m_yOffset;\n}\n\nfloat MainObject::getX() const\n{\n    return m_x;\n}\n\nfloat MainObject::getY() const\n{\n    return m_y;\n}\n\nfloat MainObject::getXStart() const\n{\n    return m_xStart;\n}\n\nfloat MainObject::getYStart() const\n{\n    return m_yStart;\n}\n\nfloat MainObject::getXPrevious() const\n{\n    return m_xPrevious;\n}\n\nfloat MainObject::getYPrevious() const\n{\n    return m_yPrevious;\n}\n\nfloat MainObject::getTime() const\n{\n    return m_time;\n}\n\nint MainObject::getInstanceId() const\n{\n    return m_instanceId;\n}\n\nunsigned int MainObject::getMaskW() const\n{\n    return m_w;\n}\n\nunsigned int MainObject::getMaskH() const\n{\n    return m_h;\n}\n\nbool MainObject::getIsActive() const\n{\n    return m_isActive;\n}\n\nint MainObject::getImageAlpha() const\n{\n    return m_imageAlpha;\n}\n\nint MainObject::getImageIndex() const\n{\n    return m_imageIndex;\n}\n\nint MainObject::getSpriteWidth() const\n{\n    return m_sprParent.getTextureRect().width;\n}\n\nint MainObject::getSpriteHeight() const\n{\n    return m_sprParent.getTextureRect().height;\n}\n\nfloat MainObject::getSpriteX() const\n{\n    return m_sprParent.getPosition().x;\n}\n\nfloat MainObject::getSpriteY() const\n{\n    return m_sprParent.getPosition().y;\n}\n\nint MainObject::getTextureWidth() const\n{\n    return is::getSFMLTextureWidth(m_sprParent.getTexture());\n}\n\nint MainObject::getTextureHeight() const\n{\n    return is::getSFMLTextureHeight(m_sprParent.getTexture());\n}\n\nint MainObject::getSpriteCenterX() const\n{\n    return (m_sprParent.getTextureRect().width / 2);\n}\n\nint MainObject::getSpriteCenterY() const\n{\n    return (m_sprParent.getTextureRect().height / 2);\n}\n\nint MainObject::getSpriteNumberSubImage(int subImageWidth) const\n{\n    return (m_sprParent.getTexture()->getSize().x / subImageWidth);\n}\n\nbool MainObject::placeMettingSubFunction(float x, float y, MainObject const *other) const\n{\n    is::Rectangle testRec = this->getMask();\n    testRec.m_left += x;\n    testRec.m_right += x;\n    testRec.m_top += y;\n    testRec.m_bottom += y;\n    is::Circle testCircle = this->getCircleMask();\n    testCircle.m_x += x;\n    testCircle.m_y += y;\n\n    is::Rectangle otherRectangle = other->getMask();\n    is::Circle otherCircle = other->getCircleMask();\n\n    if (m_w > 0 && m_h > 0 && other->getMaskW() > 0 && other->getMaskH() > 0)\n    {\n        return (is::collisionTest(testRec, otherRectangle));\n    }\n    else if ((m_w == 0 || m_h == 0) && other->getMaskW() > 0 && other->getMaskH() > 0)\n    {\n        return (is::collisionTest(testCircle, otherRectangle));\n    }\n    else if ((m_w > 0 && m_h > 0) && (other->getMaskW() == 0 || other->getMaskH() == 0))\n    {\n        return (is::collisionTest(testRec, otherCircle));\n    }\n    else if ((m_w == 0 || m_h == 0) && testCircle.m_raduis > 0.f &&\n             (other->getMaskW() == 0 || other->getMaskH() == 0) && otherCircle.m_raduis > 0.f)\n    {\n        return (is::collisionTest(testCircle, otherCircle));\n    }\n    else\n    {\n        is::showLog(\"ERROR: Badly defined collision masks between these objects: <\" + m_strName +\n                    \"> & <\" + other->getName() + \">\", true);\n    }\n    return false;\n}\n\nvoid MainObject::updateSDMsprite()\n{\n    if (m_isSDMSprite)\n    {\n        if (m_centerSpr) centerCollisionMask(m_x, m_y); else updateCollisionMask();\n        updateSprite();\n    }\n}\n\nbool MainObject::placeMetting(int x, int y, MainObject const *other)\n{\n    return placeMettingSubFunction(x, y, other);\n}\n\nbool MainObject::placeMetting(int x, int y, std::shared_ptr<MainObject> const &other)\n{\n    return placeMettingSubFunction(x, y, other.get());\n}\n\nbool MainObject::inViewRec(sf::View const &view, bool useTexRec)\n{\n    is::Rectangle testRec;\n    if (useTexRec)\n    {\n        testRec.m_left   = m_x;\n        testRec.m_top    = m_y;\n        testRec.m_right  = m_x + ((m_sprParent.getGlobalBounds().width  < 1) ? 32 : m_sprParent.getGlobalBounds().width);\n        testRec.m_bottom = m_y + ((m_sprParent.getGlobalBounds().height < 1) ? 32 : m_sprParent.getGlobalBounds().height);\n    }\n    else testRec = this->getMask();\n\n    is::Rectangle viewRec;\n    viewRec.m_left   = view.getCenter().x - (view.getSize().x / 2.f);\n    viewRec.m_right  = view.getCenter().x + (view.getSize().x / 2.f);\n    viewRec.m_top    = view.getCenter().y - (view.getSize().y / 2.f);\n    viewRec.m_bottom = view.getCenter().y + (view.getSize().y / 2.f);\n\n    if (is::collisionTest(testRec, viewRec)) return true;\n    return false;\n}\n\nsf::Sprite& MainObject::getSprite()\n{\n    return m_sprParent;\n}\n\nfloat COMPARE_DISTANCE(460.f);\n\nbool operator<(const MainObject *a, const MainObject &b)\n{\n    if (is::instanceExist(a)) return a->getX()  < (b.getX() - COMPARE_DISTANCE);\n    else return false;\n}\n\nbool operator<(const MainObject &b, const MainObject *a)\n{\n    if (is::instanceExist(a)) return (b.getX() + COMPARE_DISTANCE) < a->getX();\n    else return false;\n}\n\nbool operator<(std::shared_ptr<MainObject> const &a, const MainObject &b)\n{\n    if (is::instanceExist(a)) return a->getX() < (b.getX() - COMPARE_DISTANCE);\n    else return false;\n}\n\nbool operator<(const MainObject &b, std::shared_ptr<MainObject> const &a)\n{\n    if (is::instanceExist(a)) return (b.getX() + COMPARE_DISTANCE) < a->getX();\n    else return false;\n}\n}\n"
  },
  {
    "path": "app/src/main/cpp/PCH.hpp",
    "content": "#ifndef PRECOMPILED_HEADER_HPP\n#define PRECOMPILED_HEADER_HPP\n\n// Allow to use icon for Windows OS applications\n#define IS_ENGINE_VS_CODE\n\n#ifndef _DEBUG\n\t#ifndef NDEBUG\n\t\t#define NDEBUG\n\t#endif\n#endif // _DEBUG\n\n// Raspberry Pi\n#ifdef SFML_SYSTEM_LINUX\n\t#ifdef __arm__\n\t\t#define SFML_SYSTEM_PI\n\t#endif\n#endif // SFML SYSTEM_LINUX\n\n// Typical stdafx.h\n#include <algorithm>\n#include <cstdio>\n#include <deque>\n#include <fstream>\n#include <iostream>\n#include <list>\n#include <map>\n#include <memory>\n#include <set>\n#include <string>\n#include <vector>\n\n// Additional C/C++ libs\n#include <atomic>\n#include <cassert>\n#include <cmath>\n#include <cstdlib>\n#include <exception>\n#include <functional>\n#include <iomanip>\n#include <mutex>\n#include <random>\n#include <sstream>\n#include <thread>\n#include <type_traits>\n\n// Windows\n#ifdef _WIN32\n\t#ifndef UNICODE\n\t\t#define UNICODE\n\t#endif\n\n\t#ifndef _UNICODE\n\t\t#define _UNICODE\n\t#endif\n\n\t#define WIN32_LEAN_AND_MEAN\n\t#include <windows.h>\n#endif // _WIN32\n\n// Utils\n#include \"vscode/Utility/Types.hpp\"\n\n// Macros\n#define _UNUSED(x) (void)(x)\n\n#endif // PRECOMPILED_HEADER_HPP\n"
  },
  {
    "path": "app/src/main/cpp/SDL_android_main.c",
    "content": "#if !defined(IS_ENGINE_VS_CODE) && !defined(IS_ENGINE_SWITCH)\n#ifdef __ANDROID__\n/*\n    SDL_android_main.c, placed in the public domain by Sam Lantinga  3/13/14\n*/\n#include \"SDL_internal.h\"\n\n/* Include the SDL main definition header */\n#include \"SDL_main.h\"\n\n/*******************************************************************************\n                 Functions called by JNI\n*******************************************************************************/\n#include <jni.h>\n\n/* Called before SDL_main() to initialize JNI bindings in SDL library */\nextern void SDL_Android_Init(JNIEnv* env, jclass cls);\n\n/* This prototype is needed to prevent a warning about the missing prototype for global function below */\nJNIEXPORT int JNICALL Java_com_author_isengine_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobject array);\n\n/* Start up the SDL app */\nJNIEXPORT int JNICALL Java_com_author_isengine_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobject array)\n{\n    int i;\n    int argc;\n    int status;\n    int len;\n    char** argv;\n\n    /* This interface could expand with ABI negotiation, callbacks, etc. */\n    SDL_Android_Init(env, cls);\n\n    SDL_SetMainReady();\n\n    /* Prepare the arguments. */\n\n    len = (*env)->GetArrayLength(env, array);\n    argv = SDL_stack_alloc(char*, 1 + len + 1);\n    argc = 0;\n    /* Use the name \"app_process\" so PHYSFS_platformCalcBaseDir() works.\n       https://bitbucket.org/MartinFelis/love-android-sdl2/issue/23/release-build-crash-on-start\n     */\n    argv[argc++] = SDL_strdup(\"app_process\");\n    for (i = 0; i < len; ++i) {\n        const char* utf;\n        char* arg = NULL;\n        jstring string = (*env)->GetObjectArrayElement(env, array, i);\n        if (string) {\n            utf = (*env)->GetStringUTFChars(env, string, 0);\n            if (utf) {\n                arg = SDL_strdup(utf);\n                (*env)->ReleaseStringUTFChars(env, string, utf);\n            }\n            (*env)->DeleteLocalRef(env, string);\n        }\n        if (!arg) {\n            arg = SDL_strdup(\"\");\n        }\n        argv[argc++] = arg;\n    }\n    argv[argc] = NULL;\n\n\n    /* Run the application. */\n\n    status = SDL_main(argc, argv);\n\n    /* Release the arguments. */\n\n    for (i = 0; i < argc; ++i) {\n        SDL_free(argv[i]);\n    }\n    SDL_stack_free(argv);\n    /* Do not issue an exit or the whole application will terminate instead of just the SDL thread */\n    /* exit(status); */\n\n    return status;\n}\n\n#endif /* __ANDROID__ */\n\n/* vi: set ts=4 sw=4 expandtab: */\n#endif /* IS_ENGINE_VS_CODE */\n"
  },
  {
    "path": "app/src/main/cpp/TransitionEffect.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2024 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/graphic/TransitionEffect.h\"\n\nnamespace is\n{\nTransitionEffect::TransitionEffect(is::GameDisplay *scene):\n    MainObject(),\n    Type(FADE_OUT),\n    m_scene(scene),\n    m_transitionEnd(false)\n{\n    m_strName = \"TransitionEffect\";\n    m_imageAlpha = 255;\n    #if defined(IS_ENGINE_USE_SDM)\n    m_depth = -999999999;\n    #endif\n\n    // transition rectangle\n    is::createRectangle(m_recTransition, sf::Vector2f(scene->getViewW() + 10.f, scene->getViewH() + 10.f),\n                        sf::Color(0, 0, 0, m_imageAlpha), scene->getViewW() / 2.f, scene->getViewH() / 2.f);\n}\n\nvoid TransitionEffect::step(const float &DELTA_TIME)\n{\n    m_x = m_scene->getViewX();\n    m_y = m_scene->getViewY();\n\n    // transition fade out\n    if (m_type == FADE_OUT)\n    {\n        if (m_imageAlpha > 5)\n        {\n            m_imageAlpha -= static_cast<int>((5.f * is::VALUE_CONVERSION) * DELTA_TIME);\n            m_transitionEnd = false;\n        }\n        else\n        {\n            m_imageAlpha = 0;\n            m_transitionEnd = true;\n        }\n    }\n\n    // transition fade in\n    if (m_type == FADE_IN)\n    {\n        if (m_imageAlpha < 250)\n        {\n            m_imageAlpha += static_cast<int>((5.f * is::VALUE_CONVERSION) * DELTA_TIME);\n            m_transitionEnd = false;\n        }\n        else\n        {\n            m_imageAlpha = 255;\n            m_transitionEnd = true;\n        }\n    }\n    is::setSFMLObjFillColor(m_recTransition, sf::Color(0, 0, 0, m_imageAlpha));\n    is::setSFMLObjX_Y(m_recTransition, m_x, m_y);\n}\n\nvoid TransitionEffect::draw(is::Render &render)\n{\n    is::draw(render, m_recTransition);\n}\n}\n"
  },
  {
    "path": "app/src/main/cpp/app_src/activity/GameActivity.h",
    "content": "#ifndef GAMEACTIVITY_H_INCLUDED\n#define GAMEACTIVITY_H_INCLUDED\n\n#include \"../scenes/HelloScene/HelloScene.h\"\n\n// example\n// #include \"../scenes/YourScene/YourScene.h\"\n\n////////////////////////////////////////////////////////////\n/// Allows to manage the different scenes of the game\n////////////////////////////////////////////////////////////\nclass GameActivity\n{\nprivate:\n    std::shared_ptr<is::GameDisplay> m_gameScene;\n\npublic:\n    bool m_changeActivity = false;\n    GameActivity(is::GameSystemExtended &gameSysExt)\n    {\n        m_gameScene = nullptr;\n////////////////////////////////////////////////////////////\n\n        // Allows to choose the scene that will be launched\n        switch (gameSysExt.m_launchOption)\n        {\n        case is::DisplayOption::HELLO_SCENE:\n           m_gameScene = std::make_shared<HelloScene>(gameSysExt);\n        break;\n\n        /*\n         *  \t\t\t\t\t/!\\ WARNING! /!\\\n         * This constructor is no longer supported in this version of the engine. Use the one in the example.\n         *\n         * m_gameScene = std::make_shared<YourScene>(activityCtrl.getWindow(), getView(), m_surface, gameSysExt);\n         */\n\n        // example\n        // case is::DisplayOption::YOUR_SCENE:\n        // m_gameScene = std::make_shared<YourScene>(gameSysExt);\n        // break;\n\n        default:\n\t\t\tis::showLog(\"ERROR: Scene not found !\", true);\n\t\tbreak;\n        }\n        m_gameScene->loadResources();\n    }\n\n    virtual void onUpdate()\n    {\n        if (m_gameScene->getIsRunning()) m_gameScene->step();\n        else\n        {\n            if (!m_changeActivity) m_changeActivity = true;\n        }\n    }\n\n    virtual void onDraw() {m_gameScene->drawScreen();}\n\n    virtual ~GameActivity() {}\n};\n\n#endif // GAMEACTIVITY_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/app_src/config/ExtraConfig.h",
    "content": "#ifndef EXTRACONFIG_H_INCLUDED\n#define EXTRACONFIG_H_INCLUDED\n\n// Uncomment to enable this function\n// #define IS_ENGINE_USE_RENDER_TEXTURE ///< This feature coming soon !\n\n/*\n * 1) Uncomment this line (definition of the Preporcessor which is below) to use the engine's main render loop.\n * 2) But if you want to use a basic SFML render loop comment out this line.\n *    It activates the \"basicSFMLmain()\" function which launches an SFML window.\n *    Very useful if you already have an existing project and want to integrate it into the engine.\n *    The \"basicSFMLmain()\" function is implemented in the \"basicSFMLmain.cpp\" file (found in the \"cpp\" directory).\n *    It is in this file that you can associate your code with that of the engine.\n */\n#define IS_ENGINE_USE_MAIN_LOOP ///< Allows to use the engine's main render loop\n\n// Uncomment to enable SDM function\n#define IS_ENGINE_USE_SDM ///< Allows to use Step and Draw Manager\n\n#define SND_FILE_EXTENSION \".wav\"\n\n// Uncomment to enable this function\n#define IS_ENGINE_OPTIMIZE_PERF ///< Allows to activate the optimization in certain parts of the engine\n\n// Uncomment to enable SHOW LOG function\n#define IS_ENGINE_USE_SHOWLOG ///< Allows to show log in console\n\n#include <string>\n#include <fstream>\n#include <cstdio>\n#include <iostream>\n#include \"../../isEngine/system/islibconnect/isLibConnect.h\"\n\nnamespace is\n{\ninline bool fileExist(std::string const &fileName)\n{\n    std::ifstream file(fileName.c_str());\n    return !file.fail();\n}\n}\n\n#endif // EXTRACONFIG_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/app_src/config/GameConfig.h",
    "content": "#ifndef GAMECONFIG_H_INCLUDED\n#define GAMECONFIG_H_INCLUDED\n\n#include \"ExtraConfig.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// \\brief Allows to manipulate the different scenes and options\n///\n////////////////////////////////////////////////////////////\nenum DisplayOption\n{\n    HELLO_SCENE,   ///< Access the hello scene\n\n    // example\n    // YOUR_SCENE, ///< Access to your scene\n};\n\n////////////////////////////////////////////////////////////\n/// \\brief Allows to manipulate the window style\n///\n////////////////////////////////////////////////////////////\nenum WindowStyle\n{\n    NONE,       ///< No decoration at all\n    TITLEBAR,   ///< The window has a titlebar\n    RESIZE,     ///< The window can be resized and has a maximize button\n    CLOSE,      ///< The window has a close button\n    FULLSCREEN, ///< The window is shown in fullscreen mode\n    DEFAULT     ///< The default style, which is a shortcut for Titlebar | Resize | Close\n};\n\n////////////////////////////////////////////////////////////\n/// Allows to define the general parameters of the game and\n/// that the ad manager (Admob)\n////////////////////////////////////////////////////////////\nnamespace GameConfig\n{\n    static const unsigned int WINDOW_WIDTH   = 640; ///< Window width work only for PC Platform\n    static const unsigned int WINDOW_HEIGHT  = 480; ///< Window height work only for PC Platform\n    static const float        VIEW_WIDTH     = 640.f;\n    static const float        VIEW_HEIGHT    = 480.f;\n    static const float        FPS            = 60.f; ///< Game FPS\n    static const is::WindowStyle WINDOW_SETTINGS = WindowStyle::DEFAULT; ///< Window style\n\n\tstatic const DisplayOption LAUNCH_OPTION = DisplayOption::HELLO_SCENE; ///< Represents the first scene to be launched\n\n\t/// Represent the key which validates the options with the Mouse\n    static sf::Mouse::Button KEY_VALIDATION_MOUSE    = sf::Mouse::Left;\n\n    /// Represent the key which validates the options with the Keyboard\n    static sf::Keyboard::Key KEY_VALIDATION_KEYBOARD = sf::Keyboard::Return;\n\n    /// Represent the key which cancel the options with the Keyboard\n    static sf::Keyboard::Key KEY_CANCEL = sf::Keyboard::Escape;\n\n    /// Represents the button A key\n    static sf::Keyboard::Key KEY_A      = sf::Keyboard::W;\n\n    /// Represents the button B key\n    static sf::Keyboard::Key KEY_B      = sf::Keyboard::X;\n\n    /// Represents the button X key\n    static sf::Keyboard::Key KEY_X      = sf::Keyboard::Q;\n\n    /// Represents the button Y key\n    static sf::Keyboard::Key KEY_Y      = sf::Keyboard::S;\n\n    /// Represents the Left directional key\n    static sf::Keyboard::Key KEY_LEFT   = sf::Keyboard::Left;\n\n    /// Represents the Right directional key\n    static sf::Keyboard::Key KEY_RIGHT  = sf::Keyboard::Right;\n\n    /// Represents the Up directional key\n    static sf::Keyboard::Key KEY_UP     = sf::Keyboard::Up;\n\n    /// Represents the Down directional key\n    static sf::Keyboard::Key KEY_DOWN   = sf::Keyboard::Down;\n\n    ////////////////////////////////////////////////////////////\n    /// Default values that SFML texts will take when they are created\n    ////////////////////////////////////////////////////////////\n    static const int        DEFAULT_SFML_TEXT_SIZE                 = 20;\n    static const sf::Color &DEFAULT_SFML_TEXT_COLOR                = sf::Color::Blue;\n    static const sf::Color &DEFAULT_SFML_SELECTED_TEXT_COLOR       = sf::Color::White;\n    static const int        DEFAULT_MSG_BOX_TEXT_SIZE              = 20;\n    static const int        DEFAULT_MSG_BOX_BUTTON_TEXT_SIZE       = 18;\n    static const sf::Color &DEFAULT_MSG_BOX_TEXT_COLOR             = sf::Color::White;\n    static const sf::Color &DEFAULT_MSG_BOX_SELECTED_TEXT_COLOR    = sf::Color::Red;\n    static const int        DEFAULT_RPG_DIALOG_TEXT_SIZE           = 16;\n    static const int        DEFAULT_RPG_DIALOG_BUTTON_TEXT_SIZE    = 13;\n    static const sf::Color &DEFAULT_RPG_DIALOG_TEXT_COLOR          = sf::Color::White;\n    static const sf::Color &DEFAULT_RPG_DIALOG_SELECTED_TEXT_COLOR = sf::Color::Blue;\n    static const sf::Color &DEFAULT_BUTTON_TEXT_COLOR              = sf::Color::White;\n\n    static const std::string MAJOR = \"1\"; ///< Game major version\n    static const std::string MINOR = \"0\"; ///< Game minor version\n    inline std::string getGameVersion() {return MAJOR + \".\" + MINOR;} ///< return version of the game\n\n    static std::string const GAME_NAME     = \"Hello\"; ///< Windows title name\n    static std::string const GAME_AUTHOR   = \"Author\";\n\n    // parent directory\n\tstatic std::string const ASSETS_DIR =\n\t#if !defined(__ANDROID__)\n        #if defined(IS_ENGINE_QT)\n                                           (fileExist(\"assets/assets.dat\") ? \"\" : \"../../\") +\n        #endif\n                                           std::string(\"assets/\");\n    #elif defined(IS_ENGINE_HTML_5)\n                                           \"/assets/\"\n    #elif defined(IS_ENGINE_SWITCH)\n                                           \"assets/\"\n\t#else\n                                           \"\";\n\t#endif // defined\n    static std::string const GUI_DIR        = ASSETS_DIR + \"image/gui/\";     ///< Path to resource files that serve as GUI\n    static std::string const FONT_DIR       = ASSETS_DIR + \"font/\";          ///< Path to resource files that serve as Font\n    static std::string const SPRITES_DIR    = ASSETS_DIR + \"image/sprites/\"; ///< Path to resource files that serve as Sprite\n    static std::string const TILES_DIR      = ASSETS_DIR + \"image/tiles/\";   ///< Path to resource files that serve as tile and background\n    static std::string const SFX_DIR        = ASSETS_DIR + \"sound/sfx/\";     ///< Path to resource files that serve as SFX\n    static std::string const MUSIC_DIR      = ASSETS_DIR + \"sound/music/\";   ///< Path to resource files that serve as Music\n    static std::string const TMX_RSC_DIR    = ASSETS_DIR + \"maps/\";          ///< Path to TMX resource files\n\n    #if defined(__ANDROID__)\n    ////////////////////////////////////////////////////////////\n    /// \\brief game package name\n    /// Represents the place where your data will be saved on Android\n    /// Replace this with your real package name (e.g. com.StudioName.GameName)\n    /// You must apply this name for the applicationId in the build.gradle file\n    ////////////////////////////////////////////////////////////\n    static std::string const PACKAGE_NAME   = \"com.author.isengine\";\n    #endif // defined\n\n    // parent directory\n    static std::string DATA_PARENT_DIR =\n                                        #if defined(__ANDROID__)\n                                        \"/data/data/\" + PACKAGE_NAME + \"/\"\n                                        #elif defined(IS_ENGINE_HTML_5)\n                                        \"/save/\"\n                                        #else\n                                        \"save/\"\n                                        #endif\n                                        ;\n    ///< Path to save game progress file\n    static std::string const GAME_DATA_FILE = DATA_PARENT_DIR + \"game_data.bin\";\n\n    ///< Path to save game menu configuration file\n    static std::string const CONFIG_FILE    = DATA_PARENT_DIR + \"game_config.dat\";\n\n    ///< Path to save game pad configuration file\n    static std::string const GAME_PAD_FILE  = DATA_PARENT_DIR + \"game_pad_config.dat\";\n}\n}\n\n#endif // GAMECONFIG_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/app_src/gamesystem_ext/GameSystemExtended.h",
    "content": "#ifndef GAMESYSTEMEXTENDED_H_INCLUDED\n#define GAMESYSTEMEXTENDED_H_INCLUDED\n\n#include \"../../isEngine/system/function/GameSystem.h\"\n#include \"../levels/Level.h\"\n\n////////////////////////////////////////////////////////////\n/// \\brief Class derived from GameSystem to manage the\n/// different engine components\n///\n/// Allows to manage the saving / loading of game and\n/// configuration data, manipulate the data of the virtual\n/// Game Pad and act on the different scenes of the game\n////////////////////////////////////////////////////////////\nnamespace is\n{\nclass GameSystemExtended : public GameSystem\n{\npublic:\n    GameSystemExtended(sf::RenderWindow &window);\n\n    /// Initialize the data link to the game engine\n    void initSystemData();\n\n    /// Initialize game progress data\n    void initProgress();\n\n    /// Initialize game play data (bonus, score, ...)\n    void initData(bool clearCurrentLevel = true);\n\n    /// Save game play data\n    void saveData(std::string const &fileName);\n\n    /// Load game play data\n    void loadData(std::string const &fileName);\n\n    /// Allows to choose the scene that will be launched\n    is::DisplayOption m_launchOption = is::GameConfig::LAUNCH_OPTION; // Represents the first scene to be launched\n\n    int   m_gameProgression;\n    int   m_levelNumber;\n    int   m_currentLevel;\n    int   m_currentLives;\n    int   m_currentBonus;\n    int   m_currentScore;\n    int   m_currentHiScore;\n    int   m_levelTime;\n};\n}\n\n#endif // GAMESYSTEMEXTENDED_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/app_src/language/GameLanguage.h",
    "content": "﻿#ifndef GAMELANGUAGE_H_INCLUDED\n#define GAMELANGUAGE_H_INCLUDED\n\n#include \"../../isEngine/system/function/GameKeyName.h\"\n\n/*\n * This file allows you to define the languages you want to use in the game.\n * To use a language you must define a array. the first index represents the first language\n * (e.g lang_array[0] => eng) and the index following its translation (e.g lang_array[1] => fr).\n *\n * example to display several sentences in the dialog manager.\n * lang_array[] = {\"eng 1\", \"translation fr 1\", \"eng 2\", \"translation fr 2\", ...};\n * (Go to the GameDialog Class to see how we implement languages to make sentences in dialogs)\n */\n\nnamespace is\n{\n//////////////////////////////////////////////////////\n/// \\brief Access to content that allows internationalization of the game\n///\n//////////////////////////////////////////////////////\nnamespace lang\n{\n////////////////////////////////////////////////////////////\n/// \\brief Represent the index of each language\n///\n////////////////////////////////////////////////////////////\nenum GameLanguage\n{\n    ENGLISH,  ///< English language index\n    FRANCAIS, ///< French language index\n\n    // example\n    // YOUR_LANGUAGE ///< Your language index\n};\n\n// ------------------------ message box answer ------------------------\nstatic std::string pad_answer_ok[]  = {\"OK\" , \"OK\"};\nstatic std::string pad_answer_yes[] = {\"YES\", \"OUI\"};\nstatic std::string pad_answer_no[]  = {\"NO\" , \"NON\"};\n\n// ------------------------ message box sentences ------------------------\nstatic std::string msg_quit_game[] = {\"Quit Game\", \"Quitter le Jeu\"};\n\n// example\n// static std::string msg_your_message[] = {\"Message in English\", \"Message in French\"};\n\n// ------------------------ RPG dialog ------------------------\nstatic std::string pad_dialog_skip[] = {\"Skip\", \"Passer\"};\n\nstatic std::string dialog_hello[] = {\"Hello !\",\n                                          \"Salut !\",\n                                      \"Ready to make the future best game in the world!\",\n                                          \"En route pour invinter le futur meilleur jeu du monde !\"};\n\n// example\n// static std::wstring dialog_your_dialog[] = {L\"Represents the first message of the dialog in English\",\n//                                                 L\"Represents the first message of the dialog in French\",\n//                                             L\"Represents the second message of the dialog in English\",\n//                                                 L\"Represents the second message of the dialog in French\"};\n}\n}\n\n#endif // GAMELANGUAGE_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/app_src/levels/Level.h",
    "content": "#ifndef LEVEL_H_INCLUDED\n#define LEVEL_H_INCLUDED\n\n/*\n * This file allows to include the level header generated by the is::Engine\n * level editor to be able to use them with the engine components\n */\n\n// #include \"../levels/level_1.h\"\n// ...\n\nnamespace is\n{\n//////////////////////////////////////////////////////\n/// \\brief Access the content which allows to manage\n/// the integration of game levels\n///\n//////////////////////////////////////////////////////\nnamespace level\n{\n////////////////////////////////////////////////////////////\n/// \\brief Enum represents a array containing the level data\n///\n/// Allows to identify and load the corresponding level\n/// array in GameLevel\n////////////////////////////////////////////////////////////\nenum LevelId\n{\n    LEVEL_1\n    // ...\n\n    ////////////////////////////////////////////////////////////\n    // don't touch this. Add all level item before this one\n    , LEVEL_MAX ///< Allows you to know the number of levels\n    ////////////////////////////////////////////////////////////\n};\n\n////////////////////////////////////////////////////////////\n/// \\brief Returns the level array according to its index\n///\n/// It is used in @a GameLevelLoadResource() to determine the\n/// level array that will be loaded to create the game level\n////////////////////////////////////////////////////////////\ninline short const* getLevelMap(int CURRENT_LEVEL)\n{\n    switch (CURRENT_LEVEL)\n    {\n        // case LEVEL_1 : return LEVEL_1_MAP; break;\n        // ...\n        default: return 0; break;\n    }\n}\n}\n}\n\n#endif // LEVEL_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/app_src/objects/HelloWorld.h",
    "content": "#pragma once\n#include \"../../isEngine/system/display/GameDisplay.h\"\n\n//////////////////////////////////////////////////////\n/// \\brief This class allows to scroll a \"Hello world!\"\n/// on the screen and perform touch / click detection tests\n//////////////////////////////////////////////////////\nclass HelloWorld : public is::MainObject\n{\npublic:\n    HelloWorld(float x, float y, is::GameDisplay *scene):\n        is::MainObject(x ,y),\n        m_scene(scene)\n    {\n        // Create the sprite of object and center it\n        m_xOffset = 80.f; // set offset x to center the image\n        m_yOffset = 82.f; // set offset y to center the image\n        is::createSprite(scene->GRMgetTexture(\"hello_world\"), m_sprParent, sf::Vector2f(m_x, m_y), sf::Vector2f(m_xOffset, m_yOffset));\n\n        // Display depth of the object in the scene\n        m_depth = -1;\n    }\n\n    void step(float const &DELTA_TIME)\n    {\n        // When you touch (on Android) or click on the sprite of the object it moves down (in pixel)\n        if (m_scene->mouseCollision(m_sprParent)  && m_scene->getGameSystem().isPressed())\n        {\n            // VALUE_CONVERSION : allows to avoid using large values to do operations\n            // (basically it converts small values to large) and it also acts on the timing\n            // of the program\n            m_imageScale += (is::VALUE_CONVERSION * 0.05f) * DELTA_TIME; // scale the image\n            if (m_imageScale > 2.f) m_imageScale = 1.f;\n            m_imageXscale = m_imageScale;\n            m_imageYscale = m_imageScale;\n\n            m_y += (is::VALUE_CONVERSION * 1.f) * DELTA_TIME; // move (down) object on y axis\n        }\n\n        // moved the object to the right (in pixel)\n        m_x += (is::VALUE_CONVERSION * 2.f) * DELTA_TIME;\n\n        // If the object comes out to the right or at the top of the scene, bring it back\n        // to its starting position\n        // By default the size of the scene is equal to that of the window\n        if (m_x > m_scene->getSceneWidth())  m_x = m_xStart - (m_xOffset * 2.f);\n        if (m_y > m_scene->getSceneHeight() - 32.f) m_y = m_yStart - m_yOffset;\n\n        updateSprite(); // update the sprite with all object variables (x, y, angle, scale, ...)\n    }\n\nprivate:\n    is::GameDisplay *m_scene;\n};\n"
  },
  {
    "path": "app/src/main/cpp/app_src/objects/widgets/GameDialog.h",
    "content": "#ifndef GAMEDIALOG_H_INCLUDED\n#define GAMEDIALOG_H_INCLUDED\n\n#include <cstring>\n#include \"../../../isEngine/system/display/GameDisplay.h\"\n#include \"../../language/GameLanguage.h\"\n\n////////////////////////////////////////////////////////////\n/// \\brief Displays and manages game dialogs\n///\n////////////////////////////////////////////////////////////\nnamespace is\n{\nclass GameDialog : public is::MainObject\n{\npublic:\n    GameDialog(sf::Texture &tex, sf::Font &fnt, is::GameDisplay *scene);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Represents the different dialogs\n    ///\n    /// Each enum is linked to an array of string representing\n    /// a dialogs found in GameLanguage.h\n    ////////////////////////////////////////////////////////////\n    enum DialogIndex\n    {\n        DIALOG_NONE = -1,\n        DIALOG_HELLO,\n\n        // example\n        // DIALOG_YOUR_DIALOG\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Link enum to an array of string representing the\n    /// dialog in GameLanguage.h\n    ///\n    /// Each time an array of string representing a dialog is added\n    /// it must be linked to its enum to be able to launch it later\n    /// with the setDialog() method.\n    ////////////////////////////////////////////////////////////\n    void linkArrayToEnum()\n    {\n        auto setMsg = [this](std::string txt)\n        {\n            m_strDialog = txt;\n        };\n        auto checkMsg =[this, &setMsg](std::string txt[])\n        {\n            if (m_msgIndex < m_msgIndexMax) setMsg(txt[m_msgIndex + m_scene->getGameSystem().m_gameLanguage]);\n        };\n\n        // each enum with its array of string\n        switch (m_dialogIndex)\n        {\n            case DIALOG_HELLO:\n                m_msgIndexMax = is::arraySize(is::lang::dialog_hello);\n                checkMsg(is::lang::dialog_hello);\n            break;\n\n            // example\n            // case DIALOG_YOUR_DIALOG:\n            //     m_msgIndexMax = is::arraySize(is::lang::dialog_your_dialog);\n            //     checkMsg(is::lang::dialog_your_dialog);\n            // break;\n\n            default:\n            break;\n        }\n    }\n\n    void step(const float &DELTA_TIME);\n\n    /// launch a dialog based on the enumeration index\n    void setDialog(DialogIndex dialogIndex);\n    void setMouseInCollison(bool val);\n    void draw(is::Render &surface);\n\n    DialogIndex getDialogIndex() const\n    {\n        return m_dialogIndex;\n    }\n\n    bool getMouseInCollison() const\n    {\n        return m_mouseInCollison;\n    }\n\n    bool showDialog() const\n    {\n        return m_showDialog;\n    }\n\nprivate:\n    is::GameDisplay *m_scene;\n    sf::Text m_txtDialog, m_txtSkip;\n    std::string m_strDialog;\n    sf::Sprite m_sprNext, m_sprSkip;\n\n    bool m_showDialog, m_mouseInCollison, m_dialogEnd, m_newLine;\n    int m_msgIndex, m_msgIndexMax, m_size;\n    float m_blindTime;\n    DialogIndex m_dialogIndex;\n};\n}\n\n#endif // GAMEDIALOG_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/app_src/scenes/HelloScene/HelloScene.h",
    "content": "#pragma once\n#include \"../../../isEngine/system/entity/Background.h\"\n#include \"../../objects/widgets/GameDialog.h\"\n#include \"../../objects/HelloWorld.h\"\n\nclass HelloScene : public is::GameDisplay\n{\npublic:\n\n    /*  \t\t\t\t\t/!\\ WARNING! /!\\\n     * This constructor is no longer supported in this version of the engine. Use the one below.\n     *\n     * HelloScene(sf::RenderWindow &window, sf::View &view, is::Render &surface, is::GameSystemExtended &gameSysExt):\n     * GameDisplay(window, view, surface, gameSysExt, sf::Color::White) {}\n     */\n\n    HelloScene(is::GameSystemExtended &gameSysExt):\n        GameDisplay(gameSysExt, sf::Color::White /* => scene color*/) {}\n\n    void loadResources() {\n        m_gameSysExt.m_gameLanguage = is::lang::ENGLISH; // set default game language\n\n        // uncomment to change English language in French\n        // m_gameSysExt.m_gameLanguage = is::lang::FRANCAIS;\n\n        // load font and texture\n        GameDisplay::loadParentResources(); // allows to load system resource (very important never forgot to call him)\n        GRMaddTexture(\"is_engine_logo\", is::GameConfig::SPRITES_DIR + \"is_engine_logo.png\");\n        GRMaddTexture(\"hello_world\",    is::GameConfig::SPRITES_DIR + \"hello_world.png\");\n        auto &texBg = GRMaddTexture(\"background\",     is::GameConfig::TILES_DIR + \"background.png\");\n        auto &texDialog = GRMaddTexture(\"dialog_box\", is::GameConfig::GUI_DIR   + \"dialog_box.png\");\n\n        // add a background to the position x = 0, y = 0 which will fill the scene and which will be scrolled (scrolling speed = 0.5)\n        SDMaddSceneObject(std::make_shared<is::Background>(texBg, 0.f, 0.f, this, 0.5f, -0.5f, false, false));\n\n        // add an SFML sprite which will be above the background and which will have the name \"Logo\" (by default x = 0 and y = 0)\n        SDMaddSprite(GRMgetTexture(\"is_engine_logo\"), \"Logo\", 0.f, 62.f, false, -1);\n\n        // add an object at position x = 0, y = 0 which will be updated and displayed in the scene\n        SDMaddSceneObject(std::make_shared<HelloWorld>(0.f, 0.f, this));\n\n        // add RPG style game dialog\n        auto gameDialog = std::make_shared<is::GameDialog>(texDialog, GRMgetFont(\"font_msg\"), this);\n        gameDialog->setDepth(-2); // the display depth (make it appear on all objects. The object with the smallest value appears on the others)\n        gameDialog->setDialog(is::GameDialog::DialogIndex::DIALOG_HELLO); // set the corresponding dialog (See GameDialog.h and GameLanguage.h for more details on creating a message for dialogue)\n        SDMaddSceneObject(gameDialog);\n\n        // add and play music\n        GSMaddSound(\"game_music\", is::GameConfig::MUSIC_DIR + \"game_music.wav\");\n        GSMplaySound(\"game_music\");\n        GSMsetSoundLoop(\"game_music\", true);\n    }\n};\n"
  },
  {
    "path": "app/src/main/cpp/b2BlockAllocator.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n#include <limits.h>\n#include <memory.h>\n#include <stddef.h>\n#include <string.h>\n\nint32 b2BlockAllocator::s_blockSizes[b2_blockSizes] =\n{\n\t16,\t\t// 0\n\t32,\t\t// 1\n\t64,\t\t// 2\n\t96,\t\t// 3\n\t128,\t// 4\n\t160,\t// 5\n\t192,\t// 6\n\t224,\t// 7\n\t256,\t// 8\n\t320,\t// 9\n\t384,\t// 10\n\t448,\t// 11\n\t512,\t// 12\n\t640,\t// 13\n};\nuint8 b2BlockAllocator::s_blockSizeLookup[b2_maxBlockSize + 1];\nbool b2BlockAllocator::s_blockSizeLookupInitialized;\n\nstruct b2Chunk\n{\n\tint32 blockSize;\n\tb2Block* blocks;\n};\n\nstruct b2Block\n{\n\tb2Block* next;\n};\n\nb2BlockAllocator::b2BlockAllocator()\n{\n\tb2Assert(b2_blockSizes < UCHAR_MAX);\n\n\tm_chunkSpace = b2_chunkArrayIncrement;\n\tm_chunkCount = 0;\n\tm_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk));\n\n\tmemset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk));\n\tmemset(m_freeLists, 0, sizeof(m_freeLists));\n\n\tif (s_blockSizeLookupInitialized == false)\n\t{\n\t\tint32 j = 0;\n\t\tfor (int32 i = 1; i <= b2_maxBlockSize; ++i)\n\t\t{\n\t\t\tb2Assert(j < b2_blockSizes);\n\t\t\tif (i <= s_blockSizes[j])\n\t\t\t{\n\t\t\t\ts_blockSizeLookup[i] = (uint8)j;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++j;\n\t\t\t\ts_blockSizeLookup[i] = (uint8)j;\n\t\t\t}\n\t\t}\n\n\t\ts_blockSizeLookupInitialized = true;\n\t}\n}\n\nb2BlockAllocator::~b2BlockAllocator()\n{\n\tfor (int32 i = 0; i < m_chunkCount; ++i)\n\t{\n\t\tb2Free(m_chunks[i].blocks);\n\t}\n\n\tb2Free(m_chunks);\n}\n\nvoid* b2BlockAllocator::Allocate(int32 size)\n{\n\tif (size == 0)\n\t\treturn NULL;\n\n\tb2Assert(0 < size);\n\n\tif (size > b2_maxBlockSize)\n\t{\n\t\treturn b2Alloc(size);\n\t}\n\n\tint32 index = s_blockSizeLookup[size];\n\tb2Assert(0 <= index && index < b2_blockSizes);\n\n\tif (m_freeLists[index])\n\t{\n\t\tb2Block* block = m_freeLists[index];\n\t\tm_freeLists[index] = block->next;\n\t\treturn block;\n\t}\n\telse\n\t{\n\t\tif (m_chunkCount == m_chunkSpace)\n\t\t{\n\t\t\tb2Chunk* oldChunks = m_chunks;\n\t\t\tm_chunkSpace += b2_chunkArrayIncrement;\n\t\t\tm_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk));\n\t\t\tmemcpy(m_chunks, oldChunks, m_chunkCount * sizeof(b2Chunk));\n\t\t\tmemset(m_chunks + m_chunkCount, 0, b2_chunkArrayIncrement * sizeof(b2Chunk));\n\t\t\tb2Free(oldChunks);\n\t\t}\n\n\t\tb2Chunk* chunk = m_chunks + m_chunkCount;\n\t\tchunk->blocks = (b2Block*)b2Alloc(b2_chunkSize);\n#if defined(_DEBUG)\n\t\tmemset(chunk->blocks, 0xcd, b2_chunkSize);\n#endif\n\t\tint32 blockSize = s_blockSizes[index];\n\t\tchunk->blockSize = blockSize;\n\t\tint32 blockCount = b2_chunkSize / blockSize;\n\t\tb2Assert(blockCount * blockSize <= b2_chunkSize);\n\t\tfor (int32 i = 0; i < blockCount - 1; ++i)\n\t\t{\n\t\t\tb2Block* block = (b2Block*)((int8*)chunk->blocks + blockSize * i);\n\t\t\tb2Block* next = (b2Block*)((int8*)chunk->blocks + blockSize * (i + 1));\n\t\t\tblock->next = next;\n\t\t}\n\t\tb2Block* last = (b2Block*)((int8*)chunk->blocks + blockSize * (blockCount - 1));\n\t\tlast->next = NULL;\n\n\t\tm_freeLists[index] = chunk->blocks->next;\n\t\t++m_chunkCount;\n\n\t\treturn chunk->blocks;\n\t}\n}\n\nvoid b2BlockAllocator::Free(void* p, int32 size)\n{\n\tif (size == 0)\n\t{\n\t\treturn;\n\t}\n\n\tb2Assert(0 < size);\n\n\tif (size > b2_maxBlockSize)\n\t{\n\t\tb2Free(p);\n\t\treturn;\n\t}\n\n\tint32 index = s_blockSizeLookup[size];\n\tb2Assert(0 <= index && index < b2_blockSizes);\n\n#ifdef _DEBUG\n\t// Verify the memory address and size is valid.\n\tint32 blockSize = s_blockSizes[index];\n\tbool found = false;\n\tfor (int32 i = 0; i < m_chunkCount; ++i)\n\t{\n\t\tb2Chunk* chunk = m_chunks + i;\n\t\tif (chunk->blockSize != blockSize)\n\t\t{\n\t\t\tb2Assert(\t(int8*)p + blockSize <= (int8*)chunk->blocks ||\n\t\t\t\t\t\t(int8*)chunk->blocks + b2_chunkSize <= (int8*)p);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ((int8*)chunk->blocks <= (int8*)p && (int8*)p + blockSize <= (int8*)chunk->blocks + b2_chunkSize)\n\t\t\t{\n\t\t\t\tfound = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tb2Assert(found);\n\n\tmemset(p, 0xfd, blockSize);\n#endif\n\n\tb2Block* block = (b2Block*)p;\n\tblock->next = m_freeLists[index];\n\tm_freeLists[index] = block;\n}\n\nvoid b2BlockAllocator::Clear()\n{\n\tfor (int32 i = 0; i < m_chunkCount; ++i)\n\t{\n\t\tb2Free(m_chunks[i].blocks);\n\t}\n\n\tm_chunkCount = 0;\n\tmemset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk));\n\n\tmemset(m_freeLists, 0, sizeof(m_freeLists));\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Body.cpp",
    "content": "/*\n* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2World.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.h\"\n\nb2Body::b2Body(const b2BodyDef* bd, b2World* world)\n{\n\tb2Assert(bd->position.IsValid());\n\tb2Assert(bd->linearVelocity.IsValid());\n\tb2Assert(b2IsValid(bd->angle));\n\tb2Assert(b2IsValid(bd->angularVelocity));\n\tb2Assert(b2IsValid(bd->angularDamping) && bd->angularDamping >= 0.0f);\n\tb2Assert(b2IsValid(bd->linearDamping) && bd->linearDamping >= 0.0f);\n\n\tm_flags = 0;\n\n\tif (bd->bullet)\n\t{\n\t\tm_flags |= e_bulletFlag;\n\t}\n\tif (bd->fixedRotation)\n\t{\n\t\tm_flags |= e_fixedRotationFlag;\n\t}\n\tif (bd->allowSleep)\n\t{\n\t\tm_flags |= e_autoSleepFlag;\n\t}\n\tif (bd->awake)\n\t{\n\t\tm_flags |= e_awakeFlag;\n\t}\n\tif (bd->active)\n\t{\n\t\tm_flags |= e_activeFlag;\n\t}\n\n\tm_world = world;\n\n\tm_xf.p = bd->position;\n\tm_xf.q.Set(bd->angle);\n\n\tm_sweep.localCenter.SetZero();\n\tm_sweep.c0 = m_xf.p;\n\tm_sweep.c = m_xf.p;\n\tm_sweep.a0 = bd->angle;\n\tm_sweep.a = bd->angle;\n\tm_sweep.alpha0 = 0.0f;\n\n\tm_jointList = NULL;\n\tm_contactList = NULL;\n\tm_prev = NULL;\n\tm_next = NULL;\n\n\tm_linearVelocity = bd->linearVelocity;\n\tm_angularVelocity = bd->angularVelocity;\n\n\tm_linearDamping = bd->linearDamping;\n\tm_angularDamping = bd->angularDamping;\n\tm_gravityScale = bd->gravityScale;\n\n\tm_force.SetZero();\n\tm_torque = 0.0f;\n\n\tm_sleepTime = 0.0f;\n\n\tm_type = bd->type;\n\n\tif (m_type == b2_dynamicBody)\n\t{\n\t\tm_mass = 1.0f;\n\t\tm_invMass = 1.0f;\n\t}\n\telse\n\t{\n\t\tm_mass = 0.0f;\n\t\tm_invMass = 0.0f;\n\t}\n\n\tm_I = 0.0f;\n\tm_invI = 0.0f;\n\n\tm_userData = bd->userData;\n\n\tm_fixtureList = NULL;\n\tm_fixtureCount = 0;\n}\n\nb2Body::~b2Body()\n{\n\t// shapes and joints are destroyed in b2World::Destroy\n}\n\nvoid b2Body::SetType(b2BodyType type)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_type == type)\n\t{\n\t\treturn;\n\t}\n\n\tm_type = type;\n\n\tResetMassData();\n\n\tif (m_type == b2_staticBody)\n\t{\n\t\tm_linearVelocity.SetZero();\n\t\tm_angularVelocity = 0.0f;\n\t\tm_sweep.a0 = m_sweep.a;\n\t\tm_sweep.c0 = m_sweep.c;\n\t\tSynchronizeFixtures();\n\t}\n\n\tSetAwake(true);\n\n\tm_force.SetZero();\n\tm_torque = 0.0f;\n\n\t// Delete the attached contacts.\n\tb2ContactEdge* ce = m_contactList;\n\twhile (ce)\n\t{\n\t\tb2ContactEdge* ce0 = ce;\n\t\tce = ce->next;\n\t\tm_world->m_contactManager.Destroy(ce0->contact);\n\t}\n\tm_contactList = NULL;\n\n\t// Touch the proxies so that new contacts will be created (when appropriate)\n\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t{\n\t\tint32 proxyCount = f->m_proxyCount;\n\t\tfor (int32 i = 0; i < proxyCount; ++i)\n\t\t{\n\t\t\tbroadPhase->TouchProxy(f->m_proxies[i].proxyId);\n\t\t}\n\t}\n}\n\nb2Fixture* b2Body::CreateFixture(const b2FixtureDef* def)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn NULL;\n\t}\n\n\tb2BlockAllocator* allocator = &m_world->m_blockAllocator;\n\n\tvoid* memory = allocator->Allocate(sizeof(b2Fixture));\n\tb2Fixture* fixture = new (memory) b2Fixture;\n\tfixture->Create(allocator, this, def);\n\n\tif (m_flags & e_activeFlag)\n\t{\n\t\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\t\tfixture->CreateProxies(broadPhase, m_xf);\n\t}\n\n\tfixture->m_next = m_fixtureList;\n\tm_fixtureList = fixture;\n\t++m_fixtureCount;\n\n\tfixture->m_body = this;\n\n\t// Adjust mass properties if needed.\n\tif (fixture->m_density > 0.0f)\n\t{\n\t\tResetMassData();\n\t}\n\n\t// Let the world know we have a new fixture. This will cause new contacts\n\t// to be created at the beginning of the next time step.\n\tm_world->m_flags |= b2World::e_newFixture;\n\n\treturn fixture;\n}\n\nb2Fixture* b2Body::CreateFixture(const b2Shape* shape, float32 density)\n{\n\tb2FixtureDef def;\n\tdef.shape = shape;\n\tdef.density = density;\n\n\treturn CreateFixture(&def);\n}\n\nvoid b2Body::DestroyFixture(b2Fixture* fixture)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn;\n\t}\n\n\tb2Assert(fixture->m_body == this);\n\n\t// Remove the fixture from this body's singly linked list.\n\tb2Assert(m_fixtureCount > 0);\n\tb2Fixture** node = &m_fixtureList;\n\tbool found = false;\n\twhile (*node != NULL)\n\t{\n\t\tif (*node == fixture)\n\t\t{\n\t\t\t*node = fixture->m_next;\n\t\t\tfound = true;\n\t\t\tbreak;\n\t\t}\n\n\t\tnode = &(*node)->m_next;\n\t}\n\n\t// You tried to remove a shape that is not attached to this body.\n\tb2Assert(found);\n\n\t// Destroy any contacts associated with the fixture.\n\tb2ContactEdge* edge = m_contactList;\n\twhile (edge)\n\t{\n\t\tb2Contact* c = edge->contact;\n\t\tedge = edge->next;\n\n\t\tb2Fixture* fixtureA = c->GetFixtureA();\n\t\tb2Fixture* fixtureB = c->GetFixtureB();\n\n\t\tif (fixture == fixtureA || fixture == fixtureB)\n\t\t{\n\t\t\t// This destroys the contact and removes it from\n\t\t\t// this body's contact list.\n\t\t\tm_world->m_contactManager.Destroy(c);\n\t\t}\n\t}\n\n\tb2BlockAllocator* allocator = &m_world->m_blockAllocator;\n\n\tif (m_flags & e_activeFlag)\n\t{\n\t\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\t\tfixture->DestroyProxies(broadPhase);\n\t}\n\n\tfixture->Destroy(allocator);\n\tfixture->m_body = NULL;\n\tfixture->m_next = NULL;\n\tfixture->~b2Fixture();\n\tallocator->Free(fixture, sizeof(b2Fixture));\n\n\t--m_fixtureCount;\n\n\t// Reset the mass data.\n\tResetMassData();\n}\n\nvoid b2Body::ResetMassData()\n{\n\t// Compute mass data from shapes. Each shape has its own density.\n\tm_mass = 0.0f;\n\tm_invMass = 0.0f;\n\tm_I = 0.0f;\n\tm_invI = 0.0f;\n\tm_sweep.localCenter.SetZero();\n\n\t// Static and kinematic bodies have zero mass.\n\tif (m_type == b2_staticBody || m_type == b2_kinematicBody)\n\t{\n\t\tm_sweep.c0 = m_xf.p;\n\t\tm_sweep.c = m_xf.p;\n\t\tm_sweep.a0 = m_sweep.a;\n\t\treturn;\n\t}\n\n\tb2Assert(m_type == b2_dynamicBody);\n\n\t// Accumulate mass over all fixtures.\n\tb2Vec2 localCenter = b2Vec2_zero;\n\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t{\n\t\tif (f->m_density == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2MassData massData;\n\t\tf->GetMassData(&massData);\n\t\tm_mass += massData.mass;\n\t\tlocalCenter += massData.mass * massData.center;\n\t\tm_I += massData.I;\n\t}\n\n\t// Compute center of mass.\n\tif (m_mass > 0.0f)\n\t{\n\t\tm_invMass = 1.0f / m_mass;\n\t\tlocalCenter *= m_invMass;\n\t}\n\telse\n\t{\n\t\t// Force all dynamic bodies to have a positive mass.\n\t\tm_mass = 1.0f;\n\t\tm_invMass = 1.0f;\n\t}\n\n\tif (m_I > 0.0f && (m_flags & e_fixedRotationFlag) == 0)\n\t{\n\t\t// Center the inertia about the center of mass.\n\t\tm_I -= m_mass * b2Dot(localCenter, localCenter);\n\t\tb2Assert(m_I > 0.0f);\n\t\tm_invI = 1.0f / m_I;\n\n\t}\n\telse\n\t{\n\t\tm_I = 0.0f;\n\t\tm_invI = 0.0f;\n\t}\n\n\t// Move center of mass.\n\tb2Vec2 oldCenter = m_sweep.c;\n\tm_sweep.localCenter = localCenter;\n\tm_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter);\n\n\t// Update center of mass velocity.\n\tm_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter);\n}\n\nvoid b2Body::SetMassData(const b2MassData* massData)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tm_invMass = 0.0f;\n\tm_I = 0.0f;\n\tm_invI = 0.0f;\n\n\tm_mass = massData->mass;\n\tif (m_mass <= 0.0f)\n\t{\n\t\tm_mass = 1.0f;\n\t}\n\n\tm_invMass = 1.0f / m_mass;\n\n\tif (massData->I > 0.0f && (m_flags & b2Body::e_fixedRotationFlag) == 0)\n\t{\n\t\tm_I = massData->I - m_mass * b2Dot(massData->center, massData->center);\n\t\tb2Assert(m_I > 0.0f);\n\t\tm_invI = 1.0f / m_I;\n\t}\n\n\t// Move center of mass.\n\tb2Vec2 oldCenter = m_sweep.c;\n\tm_sweep.localCenter =  massData->center;\n\tm_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter);\n\n\t// Update center of mass velocity.\n\tm_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter);\n}\n\nbool b2Body::ShouldCollide(const b2Body* other) const\n{\n\t// At least one body should be dynamic.\n\tif (m_type != b2_dynamicBody && other->m_type != b2_dynamicBody)\n\t{\n\t\treturn false;\n\t}\n\n\t// Does a joint prevent collision?\n\tfor (b2JointEdge* jn = m_jointList; jn; jn = jn->next)\n\t{\n\t\tif (jn->other == other)\n\t\t{\n\t\t\tif (jn->joint->m_collideConnected == false)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n\nvoid b2Body::SetTransform(const b2Vec2& position, float32 angle)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn;\n\t}\n\n\tm_xf.q.Set(angle);\n\tm_xf.p = position;\n\n\tm_sweep.c = b2Mul(m_xf, m_sweep.localCenter);\n\tm_sweep.a = angle;\n\n\tm_sweep.c0 = m_sweep.c;\n\tm_sweep.a0 = angle;\n\n\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t{\n\t\tf->Synchronize(broadPhase, m_xf, m_xf);\n\t}\n}\n\nvoid b2Body::SynchronizeFixtures()\n{\n\tb2Transform xf1;\n\txf1.q.Set(m_sweep.a0);\n\txf1.p = m_sweep.c0 - b2Mul(xf1.q, m_sweep.localCenter);\n\n\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t{\n\t\tf->Synchronize(broadPhase, xf1, m_xf);\n\t}\n}\n\nvoid b2Body::SetActive(bool flag)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\n\tif (flag == IsActive())\n\t{\n\t\treturn;\n\t}\n\n\tif (flag)\n\t{\n\t\tm_flags |= e_activeFlag;\n\n\t\t// Create all proxies.\n\t\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\t\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t\t{\n\t\t\tf->CreateProxies(broadPhase, m_xf);\n\t\t}\n\n\t\t// Contacts are created the next time step.\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_activeFlag;\n\n\t\t// Destroy all proxies.\n\t\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\t\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t\t{\n\t\t\tf->DestroyProxies(broadPhase);\n\t\t}\n\n\t\t// Destroy the attached contacts.\n\t\tb2ContactEdge* ce = m_contactList;\n\t\twhile (ce)\n\t\t{\n\t\t\tb2ContactEdge* ce0 = ce;\n\t\t\tce = ce->next;\n\t\t\tm_world->m_contactManager.Destroy(ce0->contact);\n\t\t}\n\t\tm_contactList = NULL;\n\t}\n}\n\nvoid b2Body::SetFixedRotation(bool flag)\n{\n\tbool status = (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag;\n\tif (status == flag)\n\t{\n\t\treturn;\n\t}\n\n\tif (flag)\n\t{\n\t\tm_flags |= e_fixedRotationFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_fixedRotationFlag;\n\t}\n\n\tm_angularVelocity = 0.0f;\n\n\tResetMassData();\n}\n\nvoid b2Body::Dump()\n{\n\tint32 bodyIndex = m_islandIndex;\n\n\tb2Log(\"{\\n\");\n\tb2Log(\"  b2BodyDef bd;\\n\");\n\tb2Log(\"  bd.type = b2BodyType(%d);\\n\", m_type);\n\tb2Log(\"  bd.position.Set(%.15lef, %.15lef);\\n\", m_xf.p.x, m_xf.p.y);\n\tb2Log(\"  bd.angle = %.15lef;\\n\", m_sweep.a);\n\tb2Log(\"  bd.linearVelocity.Set(%.15lef, %.15lef);\\n\", m_linearVelocity.x, m_linearVelocity.y);\n\tb2Log(\"  bd.angularVelocity = %.15lef;\\n\", m_angularVelocity);\n\tb2Log(\"  bd.linearDamping = %.15lef;\\n\", m_linearDamping);\n\tb2Log(\"  bd.angularDamping = %.15lef;\\n\", m_angularDamping);\n\tb2Log(\"  bd.allowSleep = bool(%d);\\n\", m_flags & e_autoSleepFlag);\n\tb2Log(\"  bd.awake = bool(%d);\\n\", m_flags & e_awakeFlag);\n\tb2Log(\"  bd.fixedRotation = bool(%d);\\n\", m_flags & e_fixedRotationFlag);\n\tb2Log(\"  bd.bullet = bool(%d);\\n\", m_flags & e_bulletFlag);\n\tb2Log(\"  bd.active = bool(%d);\\n\", m_flags & e_activeFlag);\n\tb2Log(\"  bd.gravityScale = %.15lef;\\n\", m_gravityScale);\n\tb2Log(\"  bodies[%d] = m_world->CreateBody(&bd);\\n\", m_islandIndex);\n\tb2Log(\"\\n\");\n\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t{\n\t\tb2Log(\"  {\\n\");\n\t\tf->Dump(bodyIndex);\n\t\tb2Log(\"  }\\n\");\n\t}\n\tb2Log(\"}\\n\");\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2BroadPhase.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2BroadPhase.h\"\n\nb2BroadPhase::b2BroadPhase()\n{\n\tm_proxyCount = 0;\n\n\tm_pairCapacity = 16;\n\tm_pairCount = 0;\n\tm_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair));\n\n\tm_moveCapacity = 16;\n\tm_moveCount = 0;\n\tm_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32));\n}\n\nb2BroadPhase::~b2BroadPhase()\n{\n\tb2Free(m_moveBuffer);\n\tb2Free(m_pairBuffer);\n}\n\nint32 b2BroadPhase::CreateProxy(const b2AABB& aabb, void* userData)\n{\n\tint32 proxyId = m_tree.CreateProxy(aabb, userData);\n\t++m_proxyCount;\n\tBufferMove(proxyId);\n\treturn proxyId;\n}\n\nvoid b2BroadPhase::DestroyProxy(int32 proxyId)\n{\n\tUnBufferMove(proxyId);\n\t--m_proxyCount;\n\tm_tree.DestroyProxy(proxyId);\n}\n\nvoid b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement)\n{\n\tbool buffer = m_tree.MoveProxy(proxyId, aabb, displacement);\n\tif (buffer)\n\t{\n\t\tBufferMove(proxyId);\n\t}\n}\n\nvoid b2BroadPhase::TouchProxy(int32 proxyId)\n{\n\tBufferMove(proxyId);\n}\n\nvoid b2BroadPhase::BufferMove(int32 proxyId)\n{\n\tif (m_moveCount == m_moveCapacity)\n\t{\n\t\tint32* oldBuffer = m_moveBuffer;\n\t\tm_moveCapacity *= 2;\n\t\tm_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32));\n\t\tmemcpy(m_moveBuffer, oldBuffer, m_moveCount * sizeof(int32));\n\t\tb2Free(oldBuffer);\n\t}\n\n\tm_moveBuffer[m_moveCount] = proxyId;\n\t++m_moveCount;\n}\n\nvoid b2BroadPhase::UnBufferMove(int32 proxyId)\n{\n\tfor (int32 i = 0; i < m_moveCount; ++i)\n\t{\n\t\tif (m_moveBuffer[i] == proxyId)\n\t\t{\n\t\t\tm_moveBuffer[i] = e_nullProxy;\n\t\t}\n\t}\n}\n\n// This is called from b2DynamicTree::Query when we are gathering pairs.\nbool b2BroadPhase::QueryCallback(int32 proxyId)\n{\n\t// A proxy cannot form a pair with itself.\n\tif (proxyId == m_queryProxyId)\n\t{\n\t\treturn true;\n\t}\n\n\t// Grow the pair buffer as needed.\n\tif (m_pairCount == m_pairCapacity)\n\t{\n\t\tb2Pair* oldBuffer = m_pairBuffer;\n\t\tm_pairCapacity *= 2;\n\t\tm_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair));\n\t\tmemcpy(m_pairBuffer, oldBuffer, m_pairCount * sizeof(b2Pair));\n\t\tb2Free(oldBuffer);\n\t}\n\n\tm_pairBuffer[m_pairCount].proxyIdA = b2Min(proxyId, m_queryProxyId);\n\tm_pairBuffer[m_pairCount].proxyIdB = b2Max(proxyId, m_queryProxyId);\n\t++m_pairCount;\n\n\treturn true;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2ChainAndCircleContact.cpp",
    "content": "/*\n* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\"\n\n#include <new>\n\nb2Contact* b2ChainAndCircleContact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2ChainAndCircleContact));\n\treturn new (mem) b2ChainAndCircleContact(fixtureA, indexA, fixtureB, indexB);\n}\n\nvoid b2ChainAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2ChainAndCircleContact*)contact)->~b2ChainAndCircleContact();\n\tallocator->Free(contact, sizeof(b2ChainAndCircleContact));\n}\n\nb2ChainAndCircleContact::b2ChainAndCircleContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB)\n: b2Contact(fixtureA, indexA, fixtureB, indexB)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_chain);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_circle);\n}\n\nvoid b2ChainAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2ChainShape* chain = (b2ChainShape*)m_fixtureA->GetShape();\n\tb2EdgeShape edge;\n\tchain->GetChildEdge(&edge, m_indexA);\n\tb2CollideEdgeAndCircle(\tmanifold, &edge, xfA,\n\t\t\t\t\t\t\t(b2CircleShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2ChainAndPolygonContact.cpp",
    "content": "/*\n* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\"\n\n#include <new>\n\nb2Contact* b2ChainAndPolygonContact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2ChainAndPolygonContact));\n\treturn new (mem) b2ChainAndPolygonContact(fixtureA, indexA, fixtureB, indexB);\n}\n\nvoid b2ChainAndPolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2ChainAndPolygonContact*)contact)->~b2ChainAndPolygonContact();\n\tallocator->Free(contact, sizeof(b2ChainAndPolygonContact));\n}\n\nb2ChainAndPolygonContact::b2ChainAndPolygonContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB)\n: b2Contact(fixtureA, indexA, fixtureB, indexB)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_chain);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_polygon);\n}\n\nvoid b2ChainAndPolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2ChainShape* chain = (b2ChainShape*)m_fixtureA->GetShape();\n\tb2EdgeShape edge;\n\tchain->GetChildEdge(&edge, m_indexA);\n\tb2CollideEdgeAndPolygon(\tmanifold, &edge, xfA,\n\t\t\t\t\t\t\t\t(b2PolygonShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2ChainShape.cpp",
    "content": "/*\n* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\"\n#include <new>\n#include <memory.h>\n#include <string.h>\n\nb2ChainShape::~b2ChainShape()\n{\n\tb2Free(m_vertices);\n\tm_vertices = NULL;\n\tm_count = 0;\n}\n\nvoid b2ChainShape::CreateLoop(const b2Vec2* vertices, int32 count)\n{\n\tb2Assert(m_vertices == NULL && m_count == 0);\n\tb2Assert(count >= 3);\n\tfor (int32 i = 1; i < count; ++i)\n\t{\n\t\tb2Vec2 v1 = vertices[i-1];\n\t\tb2Vec2 v2 = vertices[i];\n\t\t// If the code crashes here, it means your vertices are too close together.\n\t\tb2Assert(b2DistanceSquared(v1, v2) > b2_linearSlop * b2_linearSlop);\n\t}\n\n\tm_count = count + 1;\n\tm_vertices = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));\n\tmemcpy(m_vertices, vertices, count * sizeof(b2Vec2));\n\tm_vertices[count] = m_vertices[0];\n\tm_prevVertex = m_vertices[m_count - 2];\n\tm_nextVertex = m_vertices[1];\n\tm_hasPrevVertex = true;\n\tm_hasNextVertex = true;\n}\n\nvoid b2ChainShape::CreateChain(const b2Vec2* vertices, int32 count)\n{\n\tb2Assert(m_vertices == NULL && m_count == 0);\n\tb2Assert(count >= 2);\n\tfor (int32 i = 1; i < count; ++i)\n\t{\n\t\tb2Vec2 v1 = vertices[i-1];\n\t\tb2Vec2 v2 = vertices[i];\n\t\t// If the code crashes here, it means your vertices are too close together.\n\t\tb2Assert(b2DistanceSquared(v1, v2) > b2_linearSlop * b2_linearSlop);\n\t}\n\n\tm_count = count;\n\tm_vertices = (b2Vec2*)b2Alloc(count * sizeof(b2Vec2));\n\tmemcpy(m_vertices, vertices, m_count * sizeof(b2Vec2));\n\n\tm_hasPrevVertex = false;\n\tm_hasNextVertex = false;\n\n\tm_prevVertex.SetZero();\n\tm_nextVertex.SetZero();\n}\n\nvoid b2ChainShape::SetPrevVertex(const b2Vec2& prevVertex)\n{\n\tm_prevVertex = prevVertex;\n\tm_hasPrevVertex = true;\n}\n\nvoid b2ChainShape::SetNextVertex(const b2Vec2& nextVertex)\n{\n\tm_nextVertex = nextVertex;\n\tm_hasNextVertex = true;\n}\n\nb2Shape* b2ChainShape::Clone(b2BlockAllocator* allocator) const\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2ChainShape));\n\tb2ChainShape* clone = new (mem) b2ChainShape;\n\tclone->CreateChain(m_vertices, m_count);\n\tclone->m_prevVertex = m_prevVertex;\n\tclone->m_nextVertex = m_nextVertex;\n\tclone->m_hasPrevVertex = m_hasPrevVertex;\n\tclone->m_hasNextVertex = m_hasNextVertex;\n\treturn clone;\n}\n\nint32 b2ChainShape::GetChildCount() const\n{\n\t// edge count = vertex count - 1\n\treturn m_count - 1;\n}\n\nvoid b2ChainShape::GetChildEdge(b2EdgeShape* edge, int32 index) const\n{\n\tb2Assert(0 <= index && index < m_count - 1);\n\tedge->m_type = b2Shape::e_edge;\n\tedge->m_radius = m_radius;\n\n\tedge->m_vertex1 = m_vertices[index + 0];\n\tedge->m_vertex2 = m_vertices[index + 1];\n\n\tif (index > 0)\n\t{\n\t\tedge->m_vertex0 = m_vertices[index - 1];\n\t\tedge->m_hasVertex0 = true;\n\t}\n\telse\n\t{\n\t\tedge->m_vertex0 = m_prevVertex;\n\t\tedge->m_hasVertex0 = m_hasPrevVertex;\n\t}\n\n\tif (index < m_count - 2)\n\t{\n\t\tedge->m_vertex3 = m_vertices[index + 2];\n\t\tedge->m_hasVertex3 = true;\n\t}\n\telse\n\t{\n\t\tedge->m_vertex3 = m_nextVertex;\n\t\tedge->m_hasVertex3 = m_hasNextVertex;\n\t}\n}\n\nbool b2ChainShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const\n{\n\tB2_NOT_USED(xf);\n\tB2_NOT_USED(p);\n\treturn false;\n}\n\nbool b2ChainShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\t\tconst b2Transform& xf, int32 childIndex) const\n{\n\tb2Assert(childIndex < m_count);\n\n\tb2EdgeShape edgeShape;\n\n\tint32 i1 = childIndex;\n\tint32 i2 = childIndex + 1;\n\tif (i2 == m_count)\n\t{\n\t\ti2 = 0;\n\t}\n\n\tedgeShape.m_vertex1 = m_vertices[i1];\n\tedgeShape.m_vertex2 = m_vertices[i2];\n\n\treturn edgeShape.RayCast(output, input, xf, 0);\n}\n\nvoid b2ChainShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const\n{\n\tb2Assert(childIndex < m_count);\n\n\tint32 i1 = childIndex;\n\tint32 i2 = childIndex + 1;\n\tif (i2 == m_count)\n\t{\n\t\ti2 = 0;\n\t}\n\n\tb2Vec2 v1 = b2Mul(xf, m_vertices[i1]);\n\tb2Vec2 v2 = b2Mul(xf, m_vertices[i2]);\n\n\taabb->lowerBound = b2Min(v1, v2);\n\taabb->upperBound = b2Max(v1, v2);\n}\n\nvoid b2ChainShape::ComputeMass(b2MassData* massData, float32 density) const\n{\n\tB2_NOT_USED(density);\n\n\tmassData->mass = 0.0f;\n\tmassData->center.SetZero();\n\tmassData->I = 0.0f;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2CircleContact.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h\"\n\n#include <new>\n\nb2Contact* b2CircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2CircleContact));\n\treturn new (mem) b2CircleContact(fixtureA, fixtureB);\n}\n\nvoid b2CircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2CircleContact*)contact)->~b2CircleContact();\n\tallocator->Free(contact, sizeof(b2CircleContact));\n}\n\nb2CircleContact::b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n\t: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_circle);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_circle);\n}\n\nvoid b2CircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollideCircles(manifold,\n\t\t\t\t\t(b2CircleShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t(b2CircleShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2CircleShape.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\"\n#include <new>\n\nb2Shape* b2CircleShape::Clone(b2BlockAllocator* allocator) const\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2CircleShape));\n\tb2CircleShape* clone = new (mem) b2CircleShape;\n\t*clone = *this;\n\treturn clone;\n}\n\nint32 b2CircleShape::GetChildCount() const\n{\n\treturn 1;\n}\n\nbool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) const\n{\n\tb2Vec2 center = transform.p + b2Mul(transform.q, m_p);\n\tb2Vec2 d = p - center;\n\treturn b2Dot(d, d) <= m_radius * m_radius;\n}\n\n// Collision Detection in Interactive 3D Environments by Gino van den Bergen\n// From Section 3.1.2\n// x = s + a * r\n// norm(x) = radius\nbool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\t\tconst b2Transform& transform, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\tb2Vec2 position = transform.p + b2Mul(transform.q, m_p);\n\tb2Vec2 s = input.p1 - position;\n\tfloat32 b = b2Dot(s, s) - m_radius * m_radius;\n\n\t// Solve quadratic equation.\n\tb2Vec2 r = input.p2 - input.p1;\n\tfloat32 c =  b2Dot(s, r);\n\tfloat32 rr = b2Dot(r, r);\n\tfloat32 sigma = c * c - rr * b;\n\n\t// Check for negative discriminant and short segment.\n\tif (sigma < 0.0f || rr < b2_epsilon)\n\t{\n\t\treturn false;\n\t}\n\n\t// Find the point of intersection of the line with the circle.\n\tfloat32 a = -(c + b2Sqrt(sigma));\n\n\t// Is the intersection point on the segment?\n\tif (0.0f <= a && a <= input.maxFraction * rr)\n\t{\n\t\ta /= rr;\n\t\toutput->fraction = a;\n\t\toutput->normal = s + a * r;\n\t\toutput->normal.Normalize();\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nvoid b2CircleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\tb2Vec2 p = transform.p + b2Mul(transform.q, m_p);\n\taabb->lowerBound.Set(p.x - m_radius, p.y - m_radius);\n\taabb->upperBound.Set(p.x + m_radius, p.y + m_radius);\n}\n\nvoid b2CircleShape::ComputeMass(b2MassData* massData, float32 density) const\n{\n\tmassData->mass = density * b2_pi * m_radius * m_radius;\n\tmassData->center = m_p;\n\n\t// inertia about the local origin\n\tmassData->I = massData->mass * (0.5f * m_radius * m_radius + b2Dot(m_p, m_p));\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2CollideCircle.cpp",
    "content": "/*\n* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2Collision.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\"\n\nvoid b2CollideCircles(\n\tb2Manifold* manifold,\n\tconst b2CircleShape* circleA, const b2Transform& xfA,\n\tconst b2CircleShape* circleB, const b2Transform& xfB)\n{\n\tmanifold->pointCount = 0;\n\n\tb2Vec2 pA = b2Mul(xfA, circleA->m_p);\n\tb2Vec2 pB = b2Mul(xfB, circleB->m_p);\n\n\tb2Vec2 d = pB - pA;\n\tfloat32 distSqr = b2Dot(d, d);\n\tfloat32 rA = circleA->m_radius, rB = circleB->m_radius;\n\tfloat32 radius = rA + rB;\n\tif (distSqr > radius * radius)\n\t{\n\t\treturn;\n\t}\n\n\tmanifold->type = b2Manifold::e_circles;\n\tmanifold->localPoint = circleA->m_p;\n\tmanifold->localNormal.SetZero();\n\tmanifold->pointCount = 1;\n\n\tmanifold->points[0].localPoint = circleB->m_p;\n\tmanifold->points[0].id.key = 0;\n}\n\nvoid b2CollidePolygonAndCircle(\n\tb2Manifold* manifold,\n\tconst b2PolygonShape* polygonA, const b2Transform& xfA,\n\tconst b2CircleShape* circleB, const b2Transform& xfB)\n{\n\tmanifold->pointCount = 0;\n\n\t// Compute circle position in the frame of the polygon.\n\tb2Vec2 c = b2Mul(xfB, circleB->m_p);\n\tb2Vec2 cLocal = b2MulT(xfA, c);\n\n\t// Find the min separating edge.\n\tint32 normalIndex = 0;\n\tfloat32 separation = -b2_maxFloat;\n\tfloat32 radius = polygonA->m_radius + circleB->m_radius;\n\tint32 vertexCount = polygonA->m_count;\n\tconst b2Vec2* vertices = polygonA->m_vertices;\n\tconst b2Vec2* normals = polygonA->m_normals;\n\n\tfor (int32 i = 0; i < vertexCount; ++i)\n\t{\n\t\tfloat32 s = b2Dot(normals[i], cLocal - vertices[i]);\n\n\t\tif (s > radius)\n\t\t{\n\t\t\t// Early out.\n\t\t\treturn;\n\t\t}\n\n\t\tif (s > separation)\n\t\t{\n\t\t\tseparation = s;\n\t\t\tnormalIndex = i;\n\t\t}\n\t}\n\n\t// Vertices that subtend the incident face.\n\tint32 vertIndex1 = normalIndex;\n\tint32 vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n\tb2Vec2 v1 = vertices[vertIndex1];\n\tb2Vec2 v2 = vertices[vertIndex2];\n\n\t// If the center is inside the polygon ...\n\tif (separation < b2_epsilon)\n\t{\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tmanifold->localNormal = normals[normalIndex];\n\t\tmanifold->localPoint = 0.5f * (v1 + v2);\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\tmanifold->points[0].id.key = 0;\n\t\treturn;\n\t}\n\n\t// Compute barycentric coordinates\n\tfloat32 u1 = b2Dot(cLocal - v1, v2 - v1);\n\tfloat32 u2 = b2Dot(cLocal - v2, v1 - v2);\n\tif (u1 <= 0.0f)\n\t{\n\t\tif (b2DistanceSquared(cLocal, v1) > radius * radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tmanifold->localNormal = cLocal - v1;\n\t\tmanifold->localNormal.Normalize();\n\t\tmanifold->localPoint = v1;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\tmanifold->points[0].id.key = 0;\n\t}\n\telse if (u2 <= 0.0f)\n\t{\n\t\tif (b2DistanceSquared(cLocal, v2) > radius * radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tmanifold->localNormal = cLocal - v2;\n\t\tmanifold->localNormal.Normalize();\n\t\tmanifold->localPoint = v2;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\tmanifold->points[0].id.key = 0;\n\t}\n\telse\n\t{\n\t\tb2Vec2 faceCenter = 0.5f * (v1 + v2);\n\t\tfloat32 separation = b2Dot(cLocal - faceCenter, normals[vertIndex1]);\n\t\tif (separation > radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tmanifold->localNormal = normals[vertIndex1];\n\t\tmanifold->localPoint = faceCenter;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\tmanifold->points[0].id.key = 0;\n\t}\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2CollideEdge.cpp",
    "content": "/*\n * Copyright (c) 2007-2009 Erin Catto http://www.box2d.org\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2Collision.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\"\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nvoid b2CollideEdgeAndCircle(b2Manifold* manifold,\n\t\t\t\t\t\t\tconst b2EdgeShape* edgeA, const b2Transform& xfA,\n\t\t\t\t\t\t\tconst b2CircleShape* circleB, const b2Transform& xfB)\n{\n\tmanifold->pointCount = 0;\n\n\t// Compute circle in frame of edge\n\tb2Vec2 Q = b2MulT(xfA, b2Mul(xfB, circleB->m_p));\n\n\tb2Vec2 A = edgeA->m_vertex1, B = edgeA->m_vertex2;\n\tb2Vec2 e = B - A;\n\n\t// Barycentric coordinates\n\tfloat32 u = b2Dot(e, B - Q);\n\tfloat32 v = b2Dot(e, Q - A);\n\n\tfloat32 radius = edgeA->m_radius + circleB->m_radius;\n\n\tb2ContactFeature cf;\n\tcf.indexB = 0;\n\tcf.typeB = b2ContactFeature::e_vertex;\n\n\t// Region A\n\tif (v <= 0.0f)\n\t{\n\t\tb2Vec2 P = A;\n\t\tb2Vec2 d = Q - P;\n\t\tfloat32 dd = b2Dot(d, d);\n\t\tif (dd > radius * radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Is there an edge connected to A?\n\t\tif (edgeA->m_hasVertex0)\n\t\t{\n\t\t\tb2Vec2 A1 = edgeA->m_vertex0;\n\t\t\tb2Vec2 B1 = A;\n\t\t\tb2Vec2 e1 = B1 - A1;\n\t\t\tfloat32 u1 = b2Dot(e1, B1 - Q);\n\n\t\t\t// Is the circle in Region AB of the previous edge?\n\t\t\tif (u1 > 0.0f)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tcf.indexA = 0;\n\t\tcf.typeA = b2ContactFeature::e_vertex;\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_circles;\n\t\tmanifold->localNormal.SetZero();\n\t\tmanifold->localPoint = P;\n\t\tmanifold->points[0].id.key = 0;\n\t\tmanifold->points[0].id.cf = cf;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\treturn;\n\t}\n\n\t// Region B\n\tif (u <= 0.0f)\n\t{\n\t\tb2Vec2 P = B;\n\t\tb2Vec2 d = Q - P;\n\t\tfloat32 dd = b2Dot(d, d);\n\t\tif (dd > radius * radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Is there an edge connected to B?\n\t\tif (edgeA->m_hasVertex3)\n\t\t{\n\t\t\tb2Vec2 B2 = edgeA->m_vertex3;\n\t\t\tb2Vec2 A2 = B;\n\t\t\tb2Vec2 e2 = B2 - A2;\n\t\t\tfloat32 v2 = b2Dot(e2, Q - A2);\n\n\t\t\t// Is the circle in Region AB of the next edge?\n\t\t\tif (v2 > 0.0f)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tcf.indexA = 1;\n\t\tcf.typeA = b2ContactFeature::e_vertex;\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_circles;\n\t\tmanifold->localNormal.SetZero();\n\t\tmanifold->localPoint = P;\n\t\tmanifold->points[0].id.key = 0;\n\t\tmanifold->points[0].id.cf = cf;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\treturn;\n\t}\n\n\t// Region AB\n\tfloat32 den = b2Dot(e, e);\n\tb2Assert(den > 0.0f);\n\tb2Vec2 P = (1.0f / den) * (u * A + v * B);\n\tb2Vec2 d = Q - P;\n\tfloat32 dd = b2Dot(d, d);\n\tif (dd > radius * radius)\n\t{\n\t\treturn;\n\t}\n\n\tb2Vec2 n(-e.y, e.x);\n\tif (b2Dot(n, Q - A) < 0.0f)\n\t{\n\t\tn.Set(-n.x, -n.y);\n\t}\n\tn.Normalize();\n\n\tcf.indexA = 0;\n\tcf.typeA = b2ContactFeature::e_face;\n\tmanifold->pointCount = 1;\n\tmanifold->type = b2Manifold::e_faceA;\n\tmanifold->localNormal = n;\n\tmanifold->localPoint = A;\n\tmanifold->points[0].id.key = 0;\n\tmanifold->points[0].id.cf = cf;\n\tmanifold->points[0].localPoint = circleB->m_p;\n}\n\n// This structure is used to keep track of the best separating axis.\nstruct b2EPAxis\n{\n\tenum Type\n\t{\n\t\te_unknown,\n\t\te_edgeA,\n\t\te_edgeB\n\t};\n\n\tType type;\n\tint32 index;\n\tfloat32 separation;\n};\n\n// This holds polygon B expressed in frame A.\nstruct b2TempPolygon\n{\n\tb2Vec2 vertices[b2_maxPolygonVertices];\n\tb2Vec2 normals[b2_maxPolygonVertices];\n\tint32 count;\n};\n\n// Reference face used for clipping\nstruct b2ReferenceFace\n{\n\tint32 i1, i2;\n\n\tb2Vec2 v1, v2;\n\n\tb2Vec2 normal;\n\n\tb2Vec2 sideNormal1;\n\tfloat32 sideOffset1;\n\n\tb2Vec2 sideNormal2;\n\tfloat32 sideOffset2;\n};\n\n// This class collides and edge and a polygon, taking into account edge adjacency.\nstruct b2EPCollider\n{\n\tvoid Collide(b2Manifold* manifold, const b2EdgeShape* edgeA, const b2Transform& xfA,\n\t\t\t\t const b2PolygonShape* polygonB, const b2Transform& xfB);\n\tb2EPAxis ComputeEdgeSeparation();\n\tb2EPAxis ComputePolygonSeparation();\n\n\tenum VertexType\n\t{\n\t\te_isolated,\n\t\te_concave,\n\t\te_convex\n\t};\n\n\tb2TempPolygon m_polygonB;\n\n\tb2Transform m_xf;\n\tb2Vec2 m_centroidB;\n\tb2Vec2 m_v0, m_v1, m_v2, m_v3;\n\tb2Vec2 m_normal0, m_normal1, m_normal2;\n\tb2Vec2 m_normal;\n\tVertexType m_type1, m_type2;\n\tb2Vec2 m_lowerLimit, m_upperLimit;\n\tfloat32 m_radius;\n\tbool m_front;\n};\n\n// Algorithm:\n// 1. Classify v1 and v2\n// 2. Classify polygon centroid as front or back\n// 3. Flip normal if necessary\n// 4. Initialize normal range to [-pi, pi] about face normal\n// 5. Adjust normal range according to adjacent edges\n// 6. Visit each separating axes, only accept axes within the range\n// 7. Return if _any_ axis indicates separation\n// 8. Clip\nvoid b2EPCollider::Collide(b2Manifold* manifold, const b2EdgeShape* edgeA, const b2Transform& xfA,\n\t\t\t\t\t\t   const b2PolygonShape* polygonB, const b2Transform& xfB)\n{\n\tm_xf = b2MulT(xfA, xfB);\n\n\tm_centroidB = b2Mul(m_xf, polygonB->m_centroid);\n\n\tm_v0 = edgeA->m_vertex0;\n\tm_v1 = edgeA->m_vertex1;\n\tm_v2 = edgeA->m_vertex2;\n\tm_v3 = edgeA->m_vertex3;\n\n\tbool hasVertex0 = edgeA->m_hasVertex0;\n\tbool hasVertex3 = edgeA->m_hasVertex3;\n\n\tb2Vec2 edge1 = m_v2 - m_v1;\n\tedge1.Normalize();\n\tm_normal1.Set(edge1.y, -edge1.x);\n\tfloat32 offset1 = b2Dot(m_normal1, m_centroidB - m_v1);\n\tfloat32 offset0 = 0.0f, offset2 = 0.0f;\n\tbool convex1 = false, convex2 = false;\n\n\t// Is there a preceding edge?\n\tif (hasVertex0)\n\t{\n\t\tb2Vec2 edge0 = m_v1 - m_v0;\n\t\tedge0.Normalize();\n\t\tm_normal0.Set(edge0.y, -edge0.x);\n\t\tconvex1 = b2Cross(edge0, edge1) >= 0.0f;\n\t\toffset0 = b2Dot(m_normal0, m_centroidB - m_v0);\n\t}\n\n\t// Is there a following edge?\n\tif (hasVertex3)\n\t{\n\t\tb2Vec2 edge2 = m_v3 - m_v2;\n\t\tedge2.Normalize();\n\t\tm_normal2.Set(edge2.y, -edge2.x);\n\t\tconvex2 = b2Cross(edge1, edge2) > 0.0f;\n\t\toffset2 = b2Dot(m_normal2, m_centroidB - m_v2);\n\t}\n\n\t// Determine front or back collision. Determine collision normal limits.\n\tif (hasVertex0 && hasVertex3)\n\t{\n\t\tif (convex1 && convex2)\n\t\t{\n\t\t\tm_front = offset0 >= 0.0f || offset1 >= 0.0f || offset2 >= 0.0f;\n\t\t\tif (m_front)\n\t\t\t{\n\t\t\t\tm_normal = m_normal1;\n\t\t\t\tm_lowerLimit = m_normal0;\n\t\t\t\tm_upperLimit = m_normal2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_normal = -m_normal1;\n\t\t\t\tm_lowerLimit = -m_normal1;\n\t\t\t\tm_upperLimit = -m_normal1;\n\t\t\t}\n\t\t}\n\t\telse if (convex1)\n\t\t{\n\t\t\tm_front = offset0 >= 0.0f || (offset1 >= 0.0f && offset2 >= 0.0f);\n\t\t\tif (m_front)\n\t\t\t{\n\t\t\t\tm_normal = m_normal1;\n\t\t\t\tm_lowerLimit = m_normal0;\n\t\t\t\tm_upperLimit = m_normal1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_normal = -m_normal1;\n\t\t\t\tm_lowerLimit = -m_normal2;\n\t\t\t\tm_upperLimit = -m_normal1;\n\t\t\t}\n\t\t}\n\t\telse if (convex2)\n\t\t{\n\t\t\tm_front = offset2 >= 0.0f || (offset0 >= 0.0f && offset1 >= 0.0f);\n\t\t\tif (m_front)\n\t\t\t{\n\t\t\t\tm_normal = m_normal1;\n\t\t\t\tm_lowerLimit = m_normal1;\n\t\t\t\tm_upperLimit = m_normal2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_normal = -m_normal1;\n\t\t\t\tm_lowerLimit = -m_normal1;\n\t\t\t\tm_upperLimit = -m_normal0;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_front = offset0 >= 0.0f && offset1 >= 0.0f && offset2 >= 0.0f;\n\t\t\tif (m_front)\n\t\t\t{\n\t\t\t\tm_normal = m_normal1;\n\t\t\t\tm_lowerLimit = m_normal1;\n\t\t\t\tm_upperLimit = m_normal1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_normal = -m_normal1;\n\t\t\t\tm_lowerLimit = -m_normal2;\n\t\t\t\tm_upperLimit = -m_normal0;\n\t\t\t}\n\t\t}\n\t}\n\telse if (hasVertex0)\n\t{\n\t\tif (convex1)\n\t\t{\n\t\t\tm_front = offset0 >= 0.0f || offset1 >= 0.0f;\n\t\t\tif (m_front)\n\t\t\t{\n\t\t\t\tm_normal = m_normal1;\n\t\t\t\tm_lowerLimit = m_normal0;\n\t\t\t\tm_upperLimit = -m_normal1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_normal = -m_normal1;\n\t\t\t\tm_lowerLimit = m_normal1;\n\t\t\t\tm_upperLimit = -m_normal1;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_front = offset0 >= 0.0f && offset1 >= 0.0f;\n\t\t\tif (m_front)\n\t\t\t{\n\t\t\t\tm_normal = m_normal1;\n\t\t\t\tm_lowerLimit = m_normal1;\n\t\t\t\tm_upperLimit = -m_normal1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_normal = -m_normal1;\n\t\t\t\tm_lowerLimit = m_normal1;\n\t\t\t\tm_upperLimit = -m_normal0;\n\t\t\t}\n\t\t}\n\t}\n\telse if (hasVertex3)\n\t{\n\t\tif (convex2)\n\t\t{\n\t\t\tm_front = offset1 >= 0.0f || offset2 >= 0.0f;\n\t\t\tif (m_front)\n\t\t\t{\n\t\t\t\tm_normal = m_normal1;\n\t\t\t\tm_lowerLimit = -m_normal1;\n\t\t\t\tm_upperLimit = m_normal2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_normal = -m_normal1;\n\t\t\t\tm_lowerLimit = -m_normal1;\n\t\t\t\tm_upperLimit = m_normal1;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_front = offset1 >= 0.0f && offset2 >= 0.0f;\n\t\t\tif (m_front)\n\t\t\t{\n\t\t\t\tm_normal = m_normal1;\n\t\t\t\tm_lowerLimit = -m_normal1;\n\t\t\t\tm_upperLimit = m_normal1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_normal = -m_normal1;\n\t\t\t\tm_lowerLimit = -m_normal2;\n\t\t\t\tm_upperLimit = m_normal1;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_front = offset1 >= 0.0f;\n\t\tif (m_front)\n\t\t{\n\t\t\tm_normal = m_normal1;\n\t\t\tm_lowerLimit = -m_normal1;\n\t\t\tm_upperLimit = -m_normal1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_normal = -m_normal1;\n\t\t\tm_lowerLimit = m_normal1;\n\t\t\tm_upperLimit = m_normal1;\n\t\t}\n\t}\n\n\t// Get polygonB in frameA\n\tm_polygonB.count = polygonB->m_count;\n\tfor (int32 i = 0; i < polygonB->m_count; ++i)\n\t{\n\t\tm_polygonB.vertices[i] = b2Mul(m_xf, polygonB->m_vertices[i]);\n\t\tm_polygonB.normals[i] = b2Mul(m_xf.q, polygonB->m_normals[i]);\n\t}\n\n\tm_radius = 2.0f * b2_polygonRadius;\n\n\tmanifold->pointCount = 0;\n\n\tb2EPAxis edgeAxis = ComputeEdgeSeparation();\n\n\t// If no valid normal can be found than this edge should not collide.\n\tif (edgeAxis.type == b2EPAxis::e_unknown)\n\t{\n\t\treturn;\n\t}\n\n\tif (edgeAxis.separation > m_radius)\n\t{\n\t\treturn;\n\t}\n\n\tb2EPAxis polygonAxis = ComputePolygonSeparation();\n\tif (polygonAxis.type != b2EPAxis::e_unknown && polygonAxis.separation > m_radius)\n\t{\n\t\treturn;\n\t}\n\n\t// Use hysteresis for jitter reduction.\n\tconst float32 k_relativeTol = 0.98f;\n\tconst float32 k_absoluteTol = 0.001f;\n\n\tb2EPAxis primaryAxis;\n\tif (polygonAxis.type == b2EPAxis::e_unknown)\n\t{\n\t\tprimaryAxis = edgeAxis;\n\t}\n\telse if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol)\n\t{\n\t\tprimaryAxis = polygonAxis;\n\t}\n\telse\n\t{\n\t\tprimaryAxis = edgeAxis;\n\t}\n\n\tb2ClipVertex ie[2];\n\tb2ReferenceFace rf;\n\tif (primaryAxis.type == b2EPAxis::e_edgeA)\n\t{\n\t\tmanifold->type = b2Manifold::e_faceA;\n\n\t\t// Search for the polygon normal that is most anti-parallel to the edge normal.\n\t\tint32 bestIndex = 0;\n\t\tfloat32 bestValue = b2Dot(m_normal, m_polygonB.normals[0]);\n\t\tfor (int32 i = 1; i < m_polygonB.count; ++i)\n\t\t{\n\t\t\tfloat32 value = b2Dot(m_normal, m_polygonB.normals[i]);\n\t\t\tif (value < bestValue)\n\t\t\t{\n\t\t\t\tbestValue = value;\n\t\t\t\tbestIndex = i;\n\t\t\t}\n\t\t}\n\n\t\tint32 i1 = bestIndex;\n\t\tint32 i2 = i1 + 1 < m_polygonB.count ? i1 + 1 : 0;\n\n\t\tie[0].v = m_polygonB.vertices[i1];\n\t\tie[0].id.cf.indexA = 0;\n\t\tie[0].id.cf.indexB = static_cast<uint8>(i1);\n\t\tie[0].id.cf.typeA = b2ContactFeature::e_face;\n\t\tie[0].id.cf.typeB = b2ContactFeature::e_vertex;\n\n\t\tie[1].v = m_polygonB.vertices[i2];\n\t\tie[1].id.cf.indexA = 0;\n\t\tie[1].id.cf.indexB = static_cast<uint8>(i2);\n\t\tie[1].id.cf.typeA = b2ContactFeature::e_face;\n\t\tie[1].id.cf.typeB = b2ContactFeature::e_vertex;\n\n\t\tif (m_front)\n\t\t{\n\t\t\trf.i1 = 0;\n\t\t\trf.i2 = 1;\n\t\t\trf.v1 = m_v1;\n\t\t\trf.v2 = m_v2;\n\t\t\trf.normal = m_normal1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\trf.i1 = 1;\n\t\t\trf.i2 = 0;\n\t\t\trf.v1 = m_v2;\n\t\t\trf.v2 = m_v1;\n\t\t\trf.normal = -m_normal1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tmanifold->type = b2Manifold::e_faceB;\n\n\t\tie[0].v = m_v1;\n\t\tie[0].id.cf.indexA = 0;\n\t\tie[0].id.cf.indexB = static_cast<uint8>(primaryAxis.index);\n\t\tie[0].id.cf.typeA = b2ContactFeature::e_vertex;\n\t\tie[0].id.cf.typeB = b2ContactFeature::e_face;\n\n\t\tie[1].v = m_v2;\n\t\tie[1].id.cf.indexA = 0;\n\t\tie[1].id.cf.indexB = static_cast<uint8>(primaryAxis.index);\n\t\tie[1].id.cf.typeA = b2ContactFeature::e_vertex;\n\t\tie[1].id.cf.typeB = b2ContactFeature::e_face;\n\n\t\trf.i1 = primaryAxis.index;\n\t\trf.i2 = rf.i1 + 1 < m_polygonB.count ? rf.i1 + 1 : 0;\n\t\trf.v1 = m_polygonB.vertices[rf.i1];\n\t\trf.v2 = m_polygonB.vertices[rf.i2];\n\t\trf.normal = m_polygonB.normals[rf.i1];\n\t}\n\n\trf.sideNormal1.Set(rf.normal.y, -rf.normal.x);\n\trf.sideNormal2 = -rf.sideNormal1;\n\trf.sideOffset1 = b2Dot(rf.sideNormal1, rf.v1);\n\trf.sideOffset2 = b2Dot(rf.sideNormal2, rf.v2);\n\n\t// Clip incident edge against extruded edge1 side edges.\n\tb2ClipVertex clipPoints1[2];\n\tb2ClipVertex clipPoints2[2];\n\tint32 np;\n\n\t// Clip to box side 1\n\tnp = b2ClipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n\tif (np < b2_maxManifoldPoints)\n\t{\n\t\treturn;\n\t}\n\n\t// Clip to negative box side 1\n\tnp = b2ClipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n\tif (np < b2_maxManifoldPoints)\n\t{\n\t\treturn;\n\t}\n\n\t// Now clipPoints2 contains the clipped points.\n\tif (primaryAxis.type == b2EPAxis::e_edgeA)\n\t{\n\t\tmanifold->localNormal = rf.normal;\n\t\tmanifold->localPoint = rf.v1;\n\t}\n\telse\n\t{\n\t\tmanifold->localNormal = polygonB->m_normals[rf.i1];\n\t\tmanifold->localPoint = polygonB->m_vertices[rf.i1];\n\t}\n\n\tint32 pointCount = 0;\n\tfor (int32 i = 0; i < b2_maxManifoldPoints; ++i)\n\t{\n\t\tfloat32 separation;\n\n\t\tseparation = b2Dot(rf.normal, clipPoints2[i].v - rf.v1);\n\n\t\tif (separation <= m_radius)\n\t\t{\n\t\t\tb2ManifoldPoint* cp = manifold->points + pointCount;\n\n\t\t\tif (primaryAxis.type == b2EPAxis::e_edgeA)\n\t\t\t{\n\t\t\t\tcp->localPoint = b2MulT(m_xf, clipPoints2[i].v);\n\t\t\t\tcp->id = clipPoints2[i].id;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcp->localPoint = clipPoints2[i].v;\n\t\t\t\tcp->id.cf.typeA = clipPoints2[i].id.cf.typeB;\n\t\t\t\tcp->id.cf.typeB = clipPoints2[i].id.cf.typeA;\n\t\t\t\tcp->id.cf.indexA = clipPoints2[i].id.cf.indexB;\n\t\t\t\tcp->id.cf.indexB = clipPoints2[i].id.cf.indexA;\n\t\t\t}\n\n\t\t\t++pointCount;\n\t\t}\n\t}\n\n\tmanifold->pointCount = pointCount;\n}\n\nb2EPAxis b2EPCollider::ComputeEdgeSeparation()\n{\n\tb2EPAxis axis;\n\taxis.type = b2EPAxis::e_edgeA;\n\taxis.index = m_front ? 0 : 1;\n\taxis.separation = FLT_MAX;\n\n\tfor (int32 i = 0; i < m_polygonB.count; ++i)\n\t{\n\t\tfloat32 s = b2Dot(m_normal, m_polygonB.vertices[i] - m_v1);\n\t\tif (s < axis.separation)\n\t\t{\n\t\t\taxis.separation = s;\n\t\t}\n\t}\n\n\treturn axis;\n}\n\nb2EPAxis b2EPCollider::ComputePolygonSeparation()\n{\n\tb2EPAxis axis;\n\taxis.type = b2EPAxis::e_unknown;\n\taxis.index = -1;\n\taxis.separation = -FLT_MAX;\n\n\tb2Vec2 perp(-m_normal.y, m_normal.x);\n\n\tfor (int32 i = 0; i < m_polygonB.count; ++i)\n\t{\n\t\tb2Vec2 n = -m_polygonB.normals[i];\n\n\t\tfloat32 s1 = b2Dot(n, m_polygonB.vertices[i] - m_v1);\n\t\tfloat32 s2 = b2Dot(n, m_polygonB.vertices[i] - m_v2);\n\t\tfloat32 s = b2Min(s1, s2);\n\n\t\tif (s > m_radius)\n\t\t{\n\t\t\t// No collision\n\t\t\taxis.type = b2EPAxis::e_edgeB;\n\t\t\taxis.index = i;\n\t\t\taxis.separation = s;\n\t\t\treturn axis;\n\t\t}\n\n\t\t// Adjacency\n\t\tif (b2Dot(n, perp) >= 0.0f)\n\t\t{\n\t\t\tif (b2Dot(n - m_upperLimit, m_normal) < -b2_angularSlop)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (b2Dot(n - m_lowerLimit, m_normal) < -b2_angularSlop)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (s > axis.separation)\n\t\t{\n\t\t\taxis.type = b2EPAxis::e_edgeB;\n\t\t\taxis.index = i;\n\t\t\taxis.separation = s;\n\t\t}\n\t}\n\n\treturn axis;\n}\n\nvoid b2CollideEdgeAndPolygon(\tb2Manifold* manifold,\n\t\t\t\t\t\t\t const b2EdgeShape* edgeA, const b2Transform& xfA,\n\t\t\t\t\t\t\t const b2PolygonShape* polygonB, const b2Transform& xfB)\n{\n\tb2EPCollider collider;\n\tcollider.Collide(manifold, edgeA, xfA, polygonB, xfB);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2CollidePolygon.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2Collision.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\"\n\n// Find the max separation between poly1 and poly2 using edge normals from poly1.\nstatic float32 b2FindMaxSeparation(int32* edgeIndex,\n\t\t\t\t\t\t\t\t const b2PolygonShape* poly1, const b2Transform& xf1,\n\t\t\t\t\t\t\t\t const b2PolygonShape* poly2, const b2Transform& xf2)\n{\n\tint32 count1 = poly1->m_count;\n\tint32 count2 = poly2->m_count;\n\tconst b2Vec2* n1s = poly1->m_normals;\n\tconst b2Vec2* v1s = poly1->m_vertices;\n\tconst b2Vec2* v2s = poly2->m_vertices;\n\tb2Transform xf = b2MulT(xf2, xf1);\n\n\tint32 bestIndex = 0;\n\tfloat32 maxSeparation = -b2_maxFloat;\n\tfor (int32 i = 0; i < count1; ++i)\n\t{\n\t\t// Get poly1 normal in frame2.\n\t\tb2Vec2 n = b2Mul(xf.q, n1s[i]);\n\t\tb2Vec2 v1 = b2Mul(xf, v1s[i]);\n\n\t\t// Find deepest point for normal i.\n\t\tfloat32 si = b2_maxFloat;\n\t\tfor (int32 j = 0; j < count2; ++j)\n\t\t{\n\t\t\tfloat32 sij = b2Dot(n, v2s[j] - v1);\n\t\t\tif (sij < si)\n\t\t\t{\n\t\t\t\tsi = sij;\n\t\t\t}\n\t\t}\n\n\t\tif (si > maxSeparation)\n\t\t{\n\t\t\tmaxSeparation = si;\n\t\t\tbestIndex = i;\n\t\t}\n\t}\n\n\t*edgeIndex = bestIndex;\n\treturn maxSeparation;\n}\n\nstatic void b2FindIncidentEdge(b2ClipVertex c[2],\n\t\t\t\t\t\t\t const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1,\n\t\t\t\t\t\t\t const b2PolygonShape* poly2, const b2Transform& xf2)\n{\n\tconst b2Vec2* normals1 = poly1->m_normals;\n\n\tint32 count2 = poly2->m_count;\n\tconst b2Vec2* vertices2 = poly2->m_vertices;\n\tconst b2Vec2* normals2 = poly2->m_normals;\n\n\tb2Assert(0 <= edge1 && edge1 < poly1->m_count);\n\n\t// Get the normal of the reference edge in poly2's frame.\n\tb2Vec2 normal1 = b2MulT(xf2.q, b2Mul(xf1.q, normals1[edge1]));\n\n\t// Find the incident edge on poly2.\n\tint32 index = 0;\n\tfloat32 minDot = b2_maxFloat;\n\tfor (int32 i = 0; i < count2; ++i)\n\t{\n\t\tfloat32 dot = b2Dot(normal1, normals2[i]);\n\t\tif (dot < minDot)\n\t\t{\n\t\t\tminDot = dot;\n\t\t\tindex = i;\n\t\t}\n\t}\n\n\t// Build the clip vertices for the incident edge.\n\tint32 i1 = index;\n\tint32 i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n\tc[0].v = b2Mul(xf2, vertices2[i1]);\n\tc[0].id.cf.indexA = (uint8)edge1;\n\tc[0].id.cf.indexB = (uint8)i1;\n\tc[0].id.cf.typeA = b2ContactFeature::e_face;\n\tc[0].id.cf.typeB = b2ContactFeature::e_vertex;\n\n\tc[1].v = b2Mul(xf2, vertices2[i2]);\n\tc[1].id.cf.indexA = (uint8)edge1;\n\tc[1].id.cf.indexB = (uint8)i2;\n\tc[1].id.cf.typeA = b2ContactFeature::e_face;\n\tc[1].id.cf.typeB = b2ContactFeature::e_vertex;\n}\n\n// Find edge normal of max separation on A - return if separating axis is found\n// Find edge normal of max separation on B - return if separation axis is found\n// Choose reference edge as min(minA, minB)\n// Find incident edge\n// Clip\n\n// The normal points from 1 to 2\nvoid b2CollidePolygons(b2Manifold* manifold,\n\t\t\t\t\t  const b2PolygonShape* polyA, const b2Transform& xfA,\n\t\t\t\t\t  const b2PolygonShape* polyB, const b2Transform& xfB)\n{\n\tmanifold->pointCount = 0;\n\tfloat32 totalRadius = polyA->m_radius + polyB->m_radius;\n\n\tint32 edgeA = 0;\n\tfloat32 separationA = b2FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB);\n\tif (separationA > totalRadius)\n\t\treturn;\n\n\tint32 edgeB = 0;\n\tfloat32 separationB = b2FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA);\n\tif (separationB > totalRadius)\n\t\treturn;\n\n\tconst b2PolygonShape* poly1;\t// reference polygon\n\tconst b2PolygonShape* poly2;\t// incident polygon\n\tb2Transform xf1, xf2;\n\tint32 edge1;\t\t\t\t\t// reference edge\n\tuint8 flip;\n\tconst float32 k_tol = 0.1f * b2_linearSlop;\n\n\tif (separationB > separationA + k_tol)\n\t{\n\t\tpoly1 = polyB;\n\t\tpoly2 = polyA;\n\t\txf1 = xfB;\n\t\txf2 = xfA;\n\t\tedge1 = edgeB;\n\t\tmanifold->type = b2Manifold::e_faceB;\n\t\tflip = 1;\n\t}\n\telse\n\t{\n\t\tpoly1 = polyA;\n\t\tpoly2 = polyB;\n\t\txf1 = xfA;\n\t\txf2 = xfB;\n\t\tedge1 = edgeA;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tflip = 0;\n\t}\n\n\tb2ClipVertex incidentEdge[2];\n\tb2FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n\tint32 count1 = poly1->m_count;\n\tconst b2Vec2* vertices1 = poly1->m_vertices;\n\n\tint32 iv1 = edge1;\n\tint32 iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n\tb2Vec2 v11 = vertices1[iv1];\n\tb2Vec2 v12 = vertices1[iv2];\n\n\tb2Vec2 localTangent = v12 - v11;\n\tlocalTangent.Normalize();\n\n\tb2Vec2 localNormal = b2Cross(localTangent, 1.0f);\n\tb2Vec2 planePoint = 0.5f * (v11 + v12);\n\n\tb2Vec2 tangent = b2Mul(xf1.q, localTangent);\n\tb2Vec2 normal = b2Cross(tangent, 1.0f);\n\n\tv11 = b2Mul(xf1, v11);\n\tv12 = b2Mul(xf1, v12);\n\n\t// Face offset.\n\tfloat32 frontOffset = b2Dot(normal, v11);\n\n\t// Side offsets, extended by polytope skin thickness.\n\tfloat32 sideOffset1 = -b2Dot(tangent, v11) + totalRadius;\n\tfloat32 sideOffset2 = b2Dot(tangent, v12) + totalRadius;\n\n\t// Clip incident edge against extruded edge1 side edges.\n\tb2ClipVertex clipPoints1[2];\n\tb2ClipVertex clipPoints2[2];\n\tint np;\n\n\t// Clip to box side 1\n\tnp = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1, iv1);\n\n\tif (np < 2)\n\t\treturn;\n\n\t// Clip to negative box side 1\n\tnp = b2ClipSegmentToLine(clipPoints2, clipPoints1,  tangent, sideOffset2, iv2);\n\n\tif (np < 2)\n\t{\n\t\treturn;\n\t}\n\n\t// Now clipPoints2 contains the clipped points.\n\tmanifold->localNormal = localNormal;\n\tmanifold->localPoint = planePoint;\n\n\tint32 pointCount = 0;\n\tfor (int32 i = 0; i < b2_maxManifoldPoints; ++i)\n\t{\n\t\tfloat32 separation = b2Dot(normal, clipPoints2[i].v) - frontOffset;\n\n\t\tif (separation <= totalRadius)\n\t\t{\n\t\t\tb2ManifoldPoint* cp = manifold->points + pointCount;\n\t\t\tcp->localPoint = b2MulT(xf2, clipPoints2[i].v);\n\t\t\tcp->id = clipPoints2[i].id;\n\t\t\tif (flip)\n\t\t\t{\n\t\t\t\t// Swap features\n\t\t\t\tb2ContactFeature cf = cp->id.cf;\n\t\t\t\tcp->id.cf.indexA = cf.indexB;\n\t\t\t\tcp->id.cf.indexB = cf.indexA;\n\t\t\t\tcp->id.cf.typeA = cf.typeB;\n\t\t\t\tcp->id.cf.typeB = cf.typeA;\n\t\t\t}\n\t\t\t++pointCount;\n\t\t}\n\t}\n\n\tmanifold->pointCount = pointCount;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Collision.cpp",
    "content": "/*\n* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2Collision.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2Distance.h\"\n\nvoid b2WorldManifold::Initialize(const b2Manifold* manifold,\n\t\t\t\t\t\t  const b2Transform& xfA, float32 radiusA,\n\t\t\t\t\t\t  const b2Transform& xfB, float32 radiusB)\n{\n\tif (manifold->pointCount == 0)\n\t{\n\t\treturn;\n\t}\n\n\tswitch (manifold->type)\n\t{\n\tcase b2Manifold::e_circles:\n\t\t{\n\t\t\tnormal.Set(1.0f, 0.0f);\n\t\t\tb2Vec2 pointA = b2Mul(xfA, manifold->localPoint);\n\t\t\tb2Vec2 pointB = b2Mul(xfB, manifold->points[0].localPoint);\n\t\t\tif (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon)\n\t\t\t{\n\t\t\t\tnormal = pointB - pointA;\n\t\t\t\tnormal.Normalize();\n\t\t\t}\n\n\t\t\tb2Vec2 cA = pointA + radiusA * normal;\n\t\t\tb2Vec2 cB = pointB - radiusB * normal;\n\t\t\tpoints[0] = 0.5f * (cA + cB);\n\t\t\tseparations[0] = b2Dot(cB - cA, normal);\n\t\t}\n\t\tbreak;\n\n\tcase b2Manifold::e_faceA:\n\t\t{\n\t\t\tnormal = b2Mul(xfA.q, manifold->localNormal);\n\t\t\tb2Vec2 planePoint = b2Mul(xfA, manifold->localPoint);\n\n\t\t\tfor (int32 i = 0; i < manifold->pointCount; ++i)\n\t\t\t{\n\t\t\t\tb2Vec2 clipPoint = b2Mul(xfB, manifold->points[i].localPoint);\n\t\t\t\tb2Vec2 cA = clipPoint + (radiusA - b2Dot(clipPoint - planePoint, normal)) * normal;\n\t\t\t\tb2Vec2 cB = clipPoint - radiusB * normal;\n\t\t\t\tpoints[i] = 0.5f * (cA + cB);\n\t\t\t\tseparations[i] = b2Dot(cB - cA, normal);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase b2Manifold::e_faceB:\n\t\t{\n\t\t\tnormal = b2Mul(xfB.q, manifold->localNormal);\n\t\t\tb2Vec2 planePoint = b2Mul(xfB, manifold->localPoint);\n\n\t\t\tfor (int32 i = 0; i < manifold->pointCount; ++i)\n\t\t\t{\n\t\t\t\tb2Vec2 clipPoint = b2Mul(xfA, manifold->points[i].localPoint);\n\t\t\t\tb2Vec2 cB = clipPoint + (radiusB - b2Dot(clipPoint - planePoint, normal)) * normal;\n\t\t\t\tb2Vec2 cA = clipPoint - radiusA * normal;\n\t\t\t\tpoints[i] = 0.5f * (cA + cB);\n\t\t\t\tseparations[i] = b2Dot(cA - cB, normal);\n\t\t\t}\n\n\t\t\t// Ensure normal points from A to B.\n\t\t\tnormal = -normal;\n\t\t}\n\t\tbreak;\n\t}\n}\n\nvoid b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints],\n\t\t\t\t\t  const b2Manifold* manifold1, const b2Manifold* manifold2)\n{\n\tfor (int32 i = 0; i < b2_maxManifoldPoints; ++i)\n\t{\n\t\tstate1[i] = b2_nullState;\n\t\tstate2[i] = b2_nullState;\n\t}\n\n\t// Detect persists and removes.\n\tfor (int32 i = 0; i < manifold1->pointCount; ++i)\n\t{\n\t\tb2ContactID id = manifold1->points[i].id;\n\n\t\tstate1[i] = b2_removeState;\n\n\t\tfor (int32 j = 0; j < manifold2->pointCount; ++j)\n\t\t{\n\t\t\tif (manifold2->points[j].id.key == id.key)\n\t\t\t{\n\t\t\t\tstate1[i] = b2_persistState;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Detect persists and adds.\n\tfor (int32 i = 0; i < manifold2->pointCount; ++i)\n\t{\n\t\tb2ContactID id = manifold2->points[i].id;\n\n\t\tstate2[i] = b2_addState;\n\n\t\tfor (int32 j = 0; j < manifold1->pointCount; ++j)\n\t\t{\n\t\t\tif (manifold1->points[j].id.key == id.key)\n\t\t\t{\n\t\t\t\tstate2[i] = b2_persistState;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// From Real-time Collision Detection, p179.\nbool b2AABB::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const\n{\n\tfloat32 tmin = -b2_maxFloat;\n\tfloat32 tmax = b2_maxFloat;\n\n\tb2Vec2 p = input.p1;\n\tb2Vec2 d = input.p2 - input.p1;\n\tb2Vec2 absD = b2Abs(d);\n\n\tb2Vec2 normal;\n\n\tfor (int32 i = 0; i < 2; ++i)\n\t{\n\t\tif (absD(i) < b2_epsilon)\n\t\t{\n\t\t\t// Parallel.\n\t\t\tif (p(i) < lowerBound(i) || upperBound(i) < p(i))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfloat32 inv_d = 1.0f / d(i);\n\t\t\tfloat32 t1 = (lowerBound(i) - p(i)) * inv_d;\n\t\t\tfloat32 t2 = (upperBound(i) - p(i)) * inv_d;\n\n\t\t\t// Sign of the normal vector.\n\t\t\tfloat32 s = -1.0f;\n\n\t\t\tif (t1 > t2)\n\t\t\t{\n\t\t\t\tb2Swap(t1, t2);\n\t\t\t\ts = 1.0f;\n\t\t\t}\n\n\t\t\t// Push the min up\n\t\t\tif (t1 > tmin)\n\t\t\t{\n\t\t\t\tnormal.SetZero();\n\t\t\t\tnormal(i) = s;\n\t\t\t\ttmin = t1;\n\t\t\t}\n\n\t\t\t// Pull the max down\n\t\t\ttmax = b2Min(tmax, t2);\n\n\t\t\tif (tmin > tmax)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Does the ray start inside the box?\n\t// Does the ray intersect beyond the max fraction?\n\tif (tmin < 0.0f || input.maxFraction < tmin)\n\t{\n\t\treturn false;\n\t}\n\n\t// Intersection.\n\toutput->fraction = tmin;\n\toutput->normal = normal;\n\treturn true;\n}\n\n// Sutherland-Hodgman clipping.\nint32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2],\n\t\t\t\t\t\tconst b2Vec2& normal, float32 offset, int32 vertexIndexA)\n{\n\t// Start with no output points\n\tint32 numOut = 0;\n\n\t// Calculate the distance of end points to the line\n\tfloat32 distance0 = b2Dot(normal, vIn[0].v) - offset;\n\tfloat32 distance1 = b2Dot(normal, vIn[1].v) - offset;\n\n\t// If the points are behind the plane\n\tif (distance0 <= 0.0f) vOut[numOut++] = vIn[0];\n\tif (distance1 <= 0.0f) vOut[numOut++] = vIn[1];\n\n\t// If the points are on different sides of the plane\n\tif (distance0 * distance1 < 0.0f)\n\t{\n\t\t// Find intersection point of edge and plane\n\t\tfloat32 interp = distance0 / (distance0 - distance1);\n\t\tvOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v);\n\n\t\t// VertexA is hitting edgeB.\n\t\tvOut[numOut].id.cf.indexA = static_cast<uint8>(vertexIndexA);\n\t\tvOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n\t\tvOut[numOut].id.cf.typeA = b2ContactFeature::e_vertex;\n\t\tvOut[numOut].id.cf.typeB = b2ContactFeature::e_face;\n\t\t++numOut;\n\t}\n\n\treturn numOut;\n}\n\nbool b2TestOverlap(\tconst b2Shape* shapeA, int32 indexA,\n\t\t\t\t\tconst b2Shape* shapeB, int32 indexB,\n\t\t\t\t\tconst b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2DistanceInput input;\n\tinput.proxyA.Set(shapeA, indexA);\n\tinput.proxyB.Set(shapeB, indexB);\n\tinput.transformA = xfA;\n\tinput.transformB = xfB;\n\tinput.useRadii = true;\n\n\tb2SimplexCache cache;\n\tcache.count = 0;\n\n\tb2DistanceOutput output;\n\n\tb2Distance(&output, &cache, &input);\n\n\treturn output.distance < 10.0f * b2_epsilon;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Contact.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonContact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h\"\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2Collision.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2Shape.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2World.h\"\n\nb2ContactRegister b2Contact::s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount];\nbool b2Contact::s_initialized = false;\n\nvoid b2Contact::InitializeRegisters()\n{\n\tAddType(b2CircleContact::Create, b2CircleContact::Destroy, b2Shape::e_circle, b2Shape::e_circle);\n\tAddType(b2PolygonAndCircleContact::Create, b2PolygonAndCircleContact::Destroy, b2Shape::e_polygon, b2Shape::e_circle);\n\tAddType(b2PolygonContact::Create, b2PolygonContact::Destroy, b2Shape::e_polygon, b2Shape::e_polygon);\n\tAddType(b2EdgeAndCircleContact::Create, b2EdgeAndCircleContact::Destroy, b2Shape::e_edge, b2Shape::e_circle);\n\tAddType(b2EdgeAndPolygonContact::Create, b2EdgeAndPolygonContact::Destroy, b2Shape::e_edge, b2Shape::e_polygon);\n\tAddType(b2ChainAndCircleContact::Create, b2ChainAndCircleContact::Destroy, b2Shape::e_chain, b2Shape::e_circle);\n\tAddType(b2ChainAndPolygonContact::Create, b2ChainAndPolygonContact::Destroy, b2Shape::e_chain, b2Shape::e_polygon);\n}\n\nvoid b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destoryFcn,\n\t\t\t\t\t\tb2Shape::Type type1, b2Shape::Type type2)\n{\n\tb2Assert(0 <= type1 && type1 < b2Shape::e_typeCount);\n\tb2Assert(0 <= type2 && type2 < b2Shape::e_typeCount);\n\n\ts_registers[type1][type2].createFcn = createFcn;\n\ts_registers[type1][type2].destroyFcn = destoryFcn;\n\ts_registers[type1][type2].primary = true;\n\n\tif (type1 != type2)\n\t{\n\t\ts_registers[type2][type1].createFcn = createFcn;\n\t\ts_registers[type2][type1].destroyFcn = destoryFcn;\n\t\ts_registers[type2][type1].primary = false;\n\t}\n}\n\nb2Contact* b2Contact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator)\n{\n\tif (s_initialized == false)\n\t{\n\t\tInitializeRegisters();\n\t\ts_initialized = true;\n\t}\n\n\tb2Shape::Type type1 = fixtureA->GetType();\n\tb2Shape::Type type2 = fixtureB->GetType();\n\n\tb2Assert(0 <= type1 && type1 < b2Shape::e_typeCount);\n\tb2Assert(0 <= type2 && type2 < b2Shape::e_typeCount);\n\n\tb2ContactCreateFcn* createFcn = s_registers[type1][type2].createFcn;\n\tif (createFcn)\n\t{\n\t\tif (s_registers[type1][type2].primary)\n\t\t{\n\t\t\treturn createFcn(fixtureA, indexA, fixtureB, indexB, allocator);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn createFcn(fixtureB, indexB, fixtureA, indexA, allocator);\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn NULL;\n\t}\n}\n\nvoid b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\tb2Assert(s_initialized == true);\n\n\tb2Fixture* fixtureA = contact->m_fixtureA;\n\tb2Fixture* fixtureB = contact->m_fixtureB;\n\n\tif (contact->m_manifold.pointCount > 0 &&\n\t\tfixtureA->IsSensor() == false &&\n\t\tfixtureB->IsSensor() == false)\n\t{\n\t\tfixtureA->GetBody()->SetAwake(true);\n\t\tfixtureB->GetBody()->SetAwake(true);\n\t}\n\n\tb2Shape::Type typeA = fixtureA->GetType();\n\tb2Shape::Type typeB = fixtureB->GetType();\n\n\tb2Assert(0 <= typeA && typeB < b2Shape::e_typeCount);\n\tb2Assert(0 <= typeA && typeB < b2Shape::e_typeCount);\n\n\tb2ContactDestroyFcn* destroyFcn = s_registers[typeA][typeB].destroyFcn;\n\tdestroyFcn(contact, allocator);\n}\n\nb2Contact::b2Contact(b2Fixture* fA, int32 indexA, b2Fixture* fB, int32 indexB)\n{\n\tm_flags = e_enabledFlag;\n\n\tm_fixtureA = fA;\n\tm_fixtureB = fB;\n\n\tm_indexA = indexA;\n\tm_indexB = indexB;\n\n\tm_manifold.pointCount = 0;\n\n\tm_prev = NULL;\n\tm_next = NULL;\n\n\tm_nodeA.contact = NULL;\n\tm_nodeA.prev = NULL;\n\tm_nodeA.next = NULL;\n\tm_nodeA.other = NULL;\n\n\tm_nodeB.contact = NULL;\n\tm_nodeB.prev = NULL;\n\tm_nodeB.next = NULL;\n\tm_nodeB.other = NULL;\n\n\tm_toiCount = 0;\n\n\tm_friction = b2MixFriction(m_fixtureA->m_friction, m_fixtureB->m_friction);\n\tm_restitution = b2MixRestitution(m_fixtureA->m_restitution, m_fixtureB->m_restitution);\n\n\tm_tangentSpeed = 0.0f;\n}\n\n// Update the contact manifold and touching status.\n// Note: do not assume the fixture AABBs are overlapping or are valid.\nvoid b2Contact::Update(b2ContactListener* listener)\n{\n\tb2Manifold oldManifold = m_manifold;\n\n\t// Re-enable this contact.\n\tm_flags |= e_enabledFlag;\n\n\tbool touching = false;\n\tbool wasTouching = (m_flags & e_touchingFlag) == e_touchingFlag;\n\n\tbool sensorA = m_fixtureA->IsSensor();\n\tbool sensorB = m_fixtureB->IsSensor();\n\tbool sensor = sensorA || sensorB;\n\n\tb2Body* bodyA = m_fixtureA->GetBody();\n\tb2Body* bodyB = m_fixtureB->GetBody();\n\tconst b2Transform& xfA = bodyA->GetTransform();\n\tconst b2Transform& xfB = bodyB->GetTransform();\n\n\t// Is this contact a sensor?\n\tif (sensor)\n\t{\n\t\tconst b2Shape* shapeA = m_fixtureA->GetShape();\n\t\tconst b2Shape* shapeB = m_fixtureB->GetShape();\n\t\ttouching = b2TestOverlap(shapeA, m_indexA, shapeB, m_indexB, xfA, xfB);\n\n\t\t// Sensors don't generate manifolds.\n\t\tm_manifold.pointCount = 0;\n\t}\n\telse\n\t{\n\t\tEvaluate(&m_manifold, xfA, xfB);\n\t\ttouching = m_manifold.pointCount > 0;\n\n\t\t// Match old contact ids to new contact ids and copy the\n\t\t// stored impulses to warm start the solver.\n\t\tfor (int32 i = 0; i < m_manifold.pointCount; ++i)\n\t\t{\n\t\t\tb2ManifoldPoint* mp2 = m_manifold.points + i;\n\t\t\tmp2->normalImpulse = 0.0f;\n\t\t\tmp2->tangentImpulse = 0.0f;\n\t\t\tb2ContactID id2 = mp2->id;\n\n\t\t\tfor (int32 j = 0; j < oldManifold.pointCount; ++j)\n\t\t\t{\n\t\t\t\tb2ManifoldPoint* mp1 = oldManifold.points + j;\n\n\t\t\t\tif (mp1->id.key == id2.key)\n\t\t\t\t{\n\t\t\t\t\tmp2->normalImpulse = mp1->normalImpulse;\n\t\t\t\t\tmp2->tangentImpulse = mp1->tangentImpulse;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (touching != wasTouching)\n\t\t{\n\t\t\tbodyA->SetAwake(true);\n\t\t\tbodyB->SetAwake(true);\n\t\t}\n\t}\n\n\tif (touching)\n\t{\n\t\tm_flags |= e_touchingFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_touchingFlag;\n\t}\n\n\tif (wasTouching == false && touching == true && listener)\n\t{\n\t\tlistener->BeginContact(this);\n\t}\n\n\tif (wasTouching == true && touching == false && listener)\n\t{\n\t\tlistener->EndContact(this);\n\t}\n\n\tif (sensor == false && touching && listener)\n\t{\n\t\tlistener->PreSolve(this, &oldManifold);\n\t}\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2ContactManager.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2ContactManager.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\"\n\nb2ContactFilter b2_defaultFilter;\nb2ContactListener b2_defaultListener;\n\nb2ContactManager::b2ContactManager()\n{\n\tm_contactList = NULL;\n\tm_contactCount = 0;\n\tm_contactFilter = &b2_defaultFilter;\n\tm_contactListener = &b2_defaultListener;\n\tm_allocator = NULL;\n}\n\nvoid b2ContactManager::Destroy(b2Contact* c)\n{\n\tb2Fixture* fixtureA = c->GetFixtureA();\n\tb2Fixture* fixtureB = c->GetFixtureB();\n\tb2Body* bodyA = fixtureA->GetBody();\n\tb2Body* bodyB = fixtureB->GetBody();\n\n\tif (m_contactListener && c->IsTouching())\n\t{\n\t\tm_contactListener->EndContact(c);\n\t}\n\n\t// Remove from the world.\n\tif (c->m_prev)\n\t{\n\t\tc->m_prev->m_next = c->m_next;\n\t}\n\n\tif (c->m_next)\n\t{\n\t\tc->m_next->m_prev = c->m_prev;\n\t}\n\n\tif (c == m_contactList)\n\t{\n\t\tm_contactList = c->m_next;\n\t}\n\n\t// Remove from body 1\n\tif (c->m_nodeA.prev)\n\t{\n\t\tc->m_nodeA.prev->next = c->m_nodeA.next;\n\t}\n\n\tif (c->m_nodeA.next)\n\t{\n\t\tc->m_nodeA.next->prev = c->m_nodeA.prev;\n\t}\n\n\tif (&c->m_nodeA == bodyA->m_contactList)\n\t{\n\t\tbodyA->m_contactList = c->m_nodeA.next;\n\t}\n\n\t// Remove from body 2\n\tif (c->m_nodeB.prev)\n\t{\n\t\tc->m_nodeB.prev->next = c->m_nodeB.next;\n\t}\n\n\tif (c->m_nodeB.next)\n\t{\n\t\tc->m_nodeB.next->prev = c->m_nodeB.prev;\n\t}\n\n\tif (&c->m_nodeB == bodyB->m_contactList)\n\t{\n\t\tbodyB->m_contactList = c->m_nodeB.next;\n\t}\n\n\t// Call the factory.\n\tb2Contact::Destroy(c, m_allocator);\n\t--m_contactCount;\n}\n\n// This is the top level collision call for the time step. Here\n// all the narrow phase collision is processed for the world\n// contact list.\nvoid b2ContactManager::Collide()\n{\n\t// Update awake contacts.\n\tb2Contact* c = m_contactList;\n\twhile (c)\n\t{\n\t\tb2Fixture* fixtureA = c->GetFixtureA();\n\t\tb2Fixture* fixtureB = c->GetFixtureB();\n\t\tint32 indexA = c->GetChildIndexA();\n\t\tint32 indexB = c->GetChildIndexB();\n\t\tb2Body* bodyA = fixtureA->GetBody();\n\t\tb2Body* bodyB = fixtureB->GetBody();\n\n\t\t// Is this contact flagged for filtering?\n\t\tif (c->m_flags & b2Contact::e_filterFlag)\n\t\t{\n\t\t\t// Should these bodies collide?\n\t\t\tif (bodyB->ShouldCollide(bodyA) == false)\n\t\t\t{\n\t\t\t\tb2Contact* cNuke = c;\n\t\t\t\tc = cNuke->GetNext();\n\t\t\t\tDestroy(cNuke);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check user filtering.\n\t\t\tif (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false)\n\t\t\t{\n\t\t\t\tb2Contact* cNuke = c;\n\t\t\t\tc = cNuke->GetNext();\n\t\t\t\tDestroy(cNuke);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Clear the filtering flag.\n\t\t\tc->m_flags &= ~b2Contact::e_filterFlag;\n\t\t}\n\n\t\tbool activeA = bodyA->IsAwake() && bodyA->m_type != b2_staticBody;\n\t\tbool activeB = bodyB->IsAwake() && bodyB->m_type != b2_staticBody;\n\n\t\t// At least one body must be awake and it must be dynamic or kinematic.\n\t\tif (activeA == false && activeB == false)\n\t\t{\n\t\t\tc = c->GetNext();\n\t\t\tcontinue;\n\t\t}\n\n\t\tint32 proxyIdA = fixtureA->m_proxies[indexA].proxyId;\n\t\tint32 proxyIdB = fixtureB->m_proxies[indexB].proxyId;\n\t\tbool overlap = m_broadPhase.TestOverlap(proxyIdA, proxyIdB);\n\n\t\t// Here we destroy contacts that cease to overlap in the broad-phase.\n\t\tif (overlap == false)\n\t\t{\n\t\t\tb2Contact* cNuke = c;\n\t\t\tc = cNuke->GetNext();\n\t\t\tDestroy(cNuke);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// The contact persists.\n\t\tc->Update(m_contactListener);\n\t\tc = c->GetNext();\n\t}\n}\n\nvoid b2ContactManager::FindNewContacts()\n{\n\tm_broadPhase.UpdatePairs(this);\n}\n\nvoid b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB)\n{\n\tb2FixtureProxy* proxyA = (b2FixtureProxy*)proxyUserDataA;\n\tb2FixtureProxy* proxyB = (b2FixtureProxy*)proxyUserDataB;\n\n\tb2Fixture* fixtureA = proxyA->fixture;\n\tb2Fixture* fixtureB = proxyB->fixture;\n\n\tint32 indexA = proxyA->childIndex;\n\tint32 indexB = proxyB->childIndex;\n\n\tb2Body* bodyA = fixtureA->GetBody();\n\tb2Body* bodyB = fixtureB->GetBody();\n\n\t// Are the fixtures on the same body?\n\tif (bodyA == bodyB)\n\t{\n\t\treturn;\n\t}\n\n\t// TODO_ERIN use a hash table to remove a potential bottleneck when both\n\t// bodies have a lot of contacts.\n\t// Does a contact already exist?\n\tb2ContactEdge* edge = bodyB->GetContactList();\n\twhile (edge)\n\t{\n\t\tif (edge->other == bodyA)\n\t\t{\n\t\t\tb2Fixture* fA = edge->contact->GetFixtureA();\n\t\t\tb2Fixture* fB = edge->contact->GetFixtureB();\n\t\t\tint32 iA = edge->contact->GetChildIndexA();\n\t\t\tint32 iB = edge->contact->GetChildIndexB();\n\n\t\t\tif (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB)\n\t\t\t{\n\t\t\t\t// A contact already exists.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA)\n\t\t\t{\n\t\t\t\t// A contact already exists.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tedge = edge->next;\n\t}\n\n\t// Does a joint override collision? Is at least one body dynamic?\n\tif (bodyB->ShouldCollide(bodyA) == false)\n\t{\n\t\treturn;\n\t}\n\n\t// Check user filtering.\n\tif (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false)\n\t{\n\t\treturn;\n\t}\n\n\t// Call the factory.\n\tb2Contact* c = b2Contact::Create(fixtureA, indexA, fixtureB, indexB, m_allocator);\n\tif (c == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t// Contact creation may swap fixtures.\n\tfixtureA = c->GetFixtureA();\n\tfixtureB = c->GetFixtureB();\n\tindexA = c->GetChildIndexA();\n\tindexB = c->GetChildIndexB();\n\tbodyA = fixtureA->GetBody();\n\tbodyB = fixtureB->GetBody();\n\n\t// Insert into the world.\n\tc->m_prev = NULL;\n\tc->m_next = m_contactList;\n\tif (m_contactList != NULL)\n\t{\n\t\tm_contactList->m_prev = c;\n\t}\n\tm_contactList = c;\n\n\t// Connect to island graph.\n\n\t// Connect to body A\n\tc->m_nodeA.contact = c;\n\tc->m_nodeA.other = bodyB;\n\n\tc->m_nodeA.prev = NULL;\n\tc->m_nodeA.next = bodyA->m_contactList;\n\tif (bodyA->m_contactList != NULL)\n\t{\n\t\tbodyA->m_contactList->prev = &c->m_nodeA;\n\t}\n\tbodyA->m_contactList = &c->m_nodeA;\n\n\t// Connect to body B\n\tc->m_nodeB.contact = c;\n\tc->m_nodeB.other = bodyA;\n\n\tc->m_nodeB.prev = NULL;\n\tc->m_nodeB.next = bodyB->m_contactList;\n\tif (bodyB->m_contactList != NULL)\n\t{\n\t\tbodyB->m_contactList->prev = &c->m_nodeB;\n\t}\n\tbodyB->m_contactList = &c->m_nodeB;\n\n\t// Wake up the bodies\n\tif (fixtureA->IsSensor() == false && fixtureB->IsSensor() == false)\n\t{\n\t\tbodyA->SetAwake(true);\n\t\tbodyB->SetAwake(true);\n\t}\n\n\t++m_contactCount;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2ContactSolver.cpp",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h\"\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2World.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2StackAllocator.h\"\n\n#define B2_DEBUG_SOLVER 0\n\nstruct b2ContactPositionConstraint\n{\n\tb2Vec2 localPoints[b2_maxManifoldPoints];\n\tb2Vec2 localNormal;\n\tb2Vec2 localPoint;\n\tint32 indexA;\n\tint32 indexB;\n\tfloat32 invMassA, invMassB;\n\tb2Vec2 localCenterA, localCenterB;\n\tfloat32 invIA, invIB;\n\tb2Manifold::Type type;\n\tfloat32 radiusA, radiusB;\n\tint32 pointCount;\n};\n\nb2ContactSolver::b2ContactSolver(b2ContactSolverDef* def)\n{\n\tm_step = def->step;\n\tm_allocator = def->allocator;\n\tm_count = def->count;\n\tm_positionConstraints = (b2ContactPositionConstraint*)m_allocator->Allocate(m_count * sizeof(b2ContactPositionConstraint));\n\tm_velocityConstraints = (b2ContactVelocityConstraint*)m_allocator->Allocate(m_count * sizeof(b2ContactVelocityConstraint));\n\tm_positions = def->positions;\n\tm_velocities = def->velocities;\n\tm_contacts = def->contacts;\n\n\t// Initialize position independent portions of the constraints.\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2Contact* contact = m_contacts[i];\n\n\t\tb2Fixture* fixtureA = contact->m_fixtureA;\n\t\tb2Fixture* fixtureB = contact->m_fixtureB;\n\t\tb2Shape* shapeA = fixtureA->GetShape();\n\t\tb2Shape* shapeB = fixtureB->GetShape();\n\t\tfloat32 radiusA = shapeA->m_radius;\n\t\tfloat32 radiusB = shapeB->m_radius;\n\t\tb2Body* bodyA = fixtureA->GetBody();\n\t\tb2Body* bodyB = fixtureB->GetBody();\n\t\tb2Manifold* manifold = contact->GetManifold();\n\n\t\tint32 pointCount = manifold->pointCount;\n\t\tb2Assert(pointCount > 0);\n\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\t\tvc->friction = contact->m_friction;\n\t\tvc->restitution = contact->m_restitution;\n\t\tvc->tangentSpeed = contact->m_tangentSpeed;\n\t\tvc->indexA = bodyA->m_islandIndex;\n\t\tvc->indexB = bodyB->m_islandIndex;\n\t\tvc->invMassA = bodyA->m_invMass;\n\t\tvc->invMassB = bodyB->m_invMass;\n\t\tvc->invIA = bodyA->m_invI;\n\t\tvc->invIB = bodyB->m_invI;\n\t\tvc->contactIndex = i;\n\t\tvc->pointCount = pointCount;\n\t\tvc->K.SetZero();\n\t\tvc->normalMass.SetZero();\n\n\t\tb2ContactPositionConstraint* pc = m_positionConstraints + i;\n\t\tpc->indexA = bodyA->m_islandIndex;\n\t\tpc->indexB = bodyB->m_islandIndex;\n\t\tpc->invMassA = bodyA->m_invMass;\n\t\tpc->invMassB = bodyB->m_invMass;\n\t\tpc->localCenterA = bodyA->m_sweep.localCenter;\n\t\tpc->localCenterB = bodyB->m_sweep.localCenter;\n\t\tpc->invIA = bodyA->m_invI;\n\t\tpc->invIB = bodyB->m_invI;\n\t\tpc->localNormal = manifold->localNormal;\n\t\tpc->localPoint = manifold->localPoint;\n\t\tpc->pointCount = pointCount;\n\t\tpc->radiusA = radiusA;\n\t\tpc->radiusB = radiusB;\n\t\tpc->type = manifold->type;\n\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2ManifoldPoint* cp = manifold->points + j;\n\t\t\tb2VelocityConstraintPoint* vcp = vc->points + j;\n\n\t\t\tif (m_step.warmStarting)\n\t\t\t{\n\t\t\t\tvcp->normalImpulse = m_step.dtRatio * cp->normalImpulse;\n\t\t\t\tvcp->tangentImpulse = m_step.dtRatio * cp->tangentImpulse;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvcp->normalImpulse = 0.0f;\n\t\t\t\tvcp->tangentImpulse = 0.0f;\n\t\t\t}\n\n\t\t\tvcp->rA.SetZero();\n\t\t\tvcp->rB.SetZero();\n\t\t\tvcp->normalMass = 0.0f;\n\t\t\tvcp->tangentMass = 0.0f;\n\t\t\tvcp->velocityBias = 0.0f;\n\n\t\t\tpc->localPoints[j] = cp->localPoint;\n\t\t}\n\t}\n}\n\nb2ContactSolver::~b2ContactSolver()\n{\n\tm_allocator->Free(m_velocityConstraints);\n\tm_allocator->Free(m_positionConstraints);\n}\n\n// Initialize position dependent portions of the velocity constraints.\nvoid b2ContactSolver::InitializeVelocityConstraints()\n{\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\t\tb2ContactPositionConstraint* pc = m_positionConstraints + i;\n\n\t\tfloat32 radiusA = pc->radiusA;\n\t\tfloat32 radiusB = pc->radiusB;\n\t\tb2Manifold* manifold = m_contacts[vc->contactIndex]->GetManifold();\n\n\t\tint32 indexA = vc->indexA;\n\t\tint32 indexB = vc->indexB;\n\n\t\tfloat32 mA = vc->invMassA;\n\t\tfloat32 mB = vc->invMassB;\n\t\tfloat32 iA = vc->invIA;\n\t\tfloat32 iB = vc->invIB;\n\t\tb2Vec2 localCenterA = pc->localCenterA;\n\t\tb2Vec2 localCenterB = pc->localCenterB;\n\n\t\tb2Vec2 cA = m_positions[indexA].c;\n\t\tfloat32 aA = m_positions[indexA].a;\n\t\tb2Vec2 vA = m_velocities[indexA].v;\n\t\tfloat32 wA = m_velocities[indexA].w;\n\n\t\tb2Vec2 cB = m_positions[indexB].c;\n\t\tfloat32 aB = m_positions[indexB].a;\n\t\tb2Vec2 vB = m_velocities[indexB].v;\n\t\tfloat32 wB = m_velocities[indexB].w;\n\n\t\tb2Assert(manifold->pointCount > 0);\n\n\t\tb2Transform xfA, xfB;\n\t\txfA.q.Set(aA);\n\t\txfB.q.Set(aB);\n\t\txfA.p = cA - b2Mul(xfA.q, localCenterA);\n\t\txfB.p = cB - b2Mul(xfB.q, localCenterB);\n\n\t\tb2WorldManifold worldManifold;\n\t\tworldManifold.Initialize(manifold, xfA, radiusA, xfB, radiusB);\n\n\t\tvc->normal = worldManifold.normal;\n\n\t\tint32 pointCount = vc->pointCount;\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2VelocityConstraintPoint* vcp = vc->points + j;\n\n\t\t\tvcp->rA = worldManifold.points[j] - cA;\n\t\t\tvcp->rB = worldManifold.points[j] - cB;\n\n\t\t\tfloat32 rnA = b2Cross(vcp->rA, vc->normal);\n\t\t\tfloat32 rnB = b2Cross(vcp->rB, vc->normal);\n\n\t\t\tfloat32 kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n\t\t\tvcp->normalMass = kNormal > 0.0f ? 1.0f / kNormal : 0.0f;\n\n\t\t\tb2Vec2 tangent = b2Cross(vc->normal, 1.0f);\n\n\t\t\tfloat32 rtA = b2Cross(vcp->rA, tangent);\n\t\t\tfloat32 rtB = b2Cross(vcp->rB, tangent);\n\n\t\t\tfloat32 kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n\t\t\tvcp->tangentMass = kTangent > 0.0f ? 1.0f /  kTangent : 0.0f;\n\n\t\t\t// Setup a velocity bias for restitution.\n\t\t\tvcp->velocityBias = 0.0f;\n\t\t\tfloat32 vRel = b2Dot(vc->normal, vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA));\n\t\t\tif (vRel < -b2_velocityThreshold)\n\t\t\t{\n\t\t\t\tvcp->velocityBias = -vc->restitution * vRel;\n\t\t\t}\n\t\t}\n\n\t\t// If we have two points, then prepare the block solver.\n\t\tif (vc->pointCount == 2)\n\t\t{\n\t\t\tb2VelocityConstraintPoint* vcp1 = vc->points + 0;\n\t\t\tb2VelocityConstraintPoint* vcp2 = vc->points + 1;\n\n\t\t\tfloat32 rn1A = b2Cross(vcp1->rA, vc->normal);\n\t\t\tfloat32 rn1B = b2Cross(vcp1->rB, vc->normal);\n\t\t\tfloat32 rn2A = b2Cross(vcp2->rA, vc->normal);\n\t\t\tfloat32 rn2B = b2Cross(vcp2->rB, vc->normal);\n\n\t\t\tfloat32 k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n\t\t\tfloat32 k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n\t\t\tfloat32 k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n\t\t\t// Ensure a reasonable condition number.\n\t\t\tconst float32 k_maxConditionNumber = 1000.0f;\n\t\t\tif (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12))\n\t\t\t{\n\t\t\t\t// K is safe to invert.\n\t\t\t\tvc->K.ex.Set(k11, k12);\n\t\t\t\tvc->K.ey.Set(k12, k22);\n\t\t\t\tvc->normalMass = vc->K.GetInverse();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// The constraints are redundant, just use one.\n\t\t\t\t// TODO_ERIN use deepest?\n\t\t\t\tvc->pointCount = 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid b2ContactSolver::WarmStart()\n{\n\t// Warm start.\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\n\t\tint32 indexA = vc->indexA;\n\t\tint32 indexB = vc->indexB;\n\t\tfloat32 mA = vc->invMassA;\n\t\tfloat32 iA = vc->invIA;\n\t\tfloat32 mB = vc->invMassB;\n\t\tfloat32 iB = vc->invIB;\n\t\tint32 pointCount = vc->pointCount;\n\n\t\tb2Vec2 vA = m_velocities[indexA].v;\n\t\tfloat32 wA = m_velocities[indexA].w;\n\t\tb2Vec2 vB = m_velocities[indexB].v;\n\t\tfloat32 wB = m_velocities[indexB].w;\n\n\t\tb2Vec2 normal = vc->normal;\n\t\tb2Vec2 tangent = b2Cross(normal, 1.0f);\n\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2VelocityConstraintPoint* vcp = vc->points + j;\n\t\t\tb2Vec2 P = vcp->normalImpulse * normal + vcp->tangentImpulse * tangent;\n\t\t\twA -= iA * b2Cross(vcp->rA, P);\n\t\t\tvA -= mA * P;\n\t\t\twB += iB * b2Cross(vcp->rB, P);\n\t\t\tvB += mB * P;\n\t\t}\n\n\t\tm_velocities[indexA].v = vA;\n\t\tm_velocities[indexA].w = wA;\n\t\tm_velocities[indexB].v = vB;\n\t\tm_velocities[indexB].w = wB;\n\t}\n}\n\nvoid b2ContactSolver::SolveVelocityConstraints()\n{\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\n\t\tint32 indexA = vc->indexA;\n\t\tint32 indexB = vc->indexB;\n\t\tfloat32 mA = vc->invMassA;\n\t\tfloat32 iA = vc->invIA;\n\t\tfloat32 mB = vc->invMassB;\n\t\tfloat32 iB = vc->invIB;\n\t\tint32 pointCount = vc->pointCount;\n\n\t\tb2Vec2 vA = m_velocities[indexA].v;\n\t\tfloat32 wA = m_velocities[indexA].w;\n\t\tb2Vec2 vB = m_velocities[indexB].v;\n\t\tfloat32 wB = m_velocities[indexB].w;\n\n\t\tb2Vec2 normal = vc->normal;\n\t\tb2Vec2 tangent = b2Cross(normal, 1.0f);\n\t\tfloat32 friction = vc->friction;\n\n\t\tb2Assert(pointCount == 1 || pointCount == 2);\n\n\t\t// Solve tangent constraints first because non-penetration is more important\n\t\t// than friction.\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2VelocityConstraintPoint* vcp = vc->points + j;\n\n\t\t\t// Relative velocity at contact\n\t\t\tb2Vec2 dv = vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA);\n\n\t\t\t// Compute tangent force\n\t\t\tfloat32 vt = b2Dot(dv, tangent) - vc->tangentSpeed;\n\t\t\tfloat32 lambda = vcp->tangentMass * (-vt);\n\n\t\t\t// b2Clamp the accumulated force\n\t\t\tfloat32 maxFriction = friction * vcp->normalImpulse;\n\t\t\tfloat32 newImpulse = b2Clamp(vcp->tangentImpulse + lambda, -maxFriction, maxFriction);\n\t\t\tlambda = newImpulse - vcp->tangentImpulse;\n\t\t\tvcp->tangentImpulse = newImpulse;\n\n\t\t\t// Apply contact impulse\n\t\t\tb2Vec2 P = lambda * tangent;\n\n\t\t\tvA -= mA * P;\n\t\t\twA -= iA * b2Cross(vcp->rA, P);\n\n\t\t\tvB += mB * P;\n\t\t\twB += iB * b2Cross(vcp->rB, P);\n\t\t}\n\n\t\t// Solve normal constraints\n\t\tif (vc->pointCount == 1)\n\t\t{\n\t\t\tb2VelocityConstraintPoint* vcp = vc->points + 0;\n\n\t\t\t// Relative velocity at contact\n\t\t\tb2Vec2 dv = vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA);\n\n\t\t\t// Compute normal impulse\n\t\t\tfloat32 vn = b2Dot(dv, normal);\n\t\t\tfloat32 lambda = -vcp->normalMass * (vn - vcp->velocityBias);\n\n\t\t\t// b2Clamp the accumulated impulse\n\t\t\tfloat32 newImpulse = b2Max(vcp->normalImpulse + lambda, 0.0f);\n\t\t\tlambda = newImpulse - vcp->normalImpulse;\n\t\t\tvcp->normalImpulse = newImpulse;\n\n\t\t\t// Apply contact impulse\n\t\t\tb2Vec2 P = lambda * normal;\n\t\t\tvA -= mA * P;\n\t\t\twA -= iA * b2Cross(vcp->rA, P);\n\n\t\t\tvB += mB * P;\n\t\t\twB += iB * b2Cross(vcp->rB, P);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Block solver developed in collaboration with Dirk Gregorius (back in 01/07 on Box2D_Lite).\n\t\t\t// Build the mini LCP for this contact patch\n\t\t\t//\n\t\t\t// vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = 1..2\n\t\t\t//\n\t\t\t// A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n\t\t\t// b = vn0 - velocityBias\n\t\t\t//\n\t\t\t// The system is solved using the \"Total enumeration method\" (s. Murty). The complementary constraint vn_i * x_i\n\t\t\t// implies that we must have in any solution either vn_i = 0 or x_i = 0. So for the 2D contact problem the cases\n\t\t\t// 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\n\t\t\t// solution that satisfies the problem is chosen.\n\t\t\t//\n\t\t\t// In order to account of the accumulated impulse 'a' (because of the iterative nature of the solver which only requires\n\t\t\t// that the accumulated impulse is clamped and not the incremental impulse) we change the impulse variable (x_i).\n\t\t\t//\n\t\t\t// Substitute:\n\t\t\t//\n\t\t\t// x = a + d\n\t\t\t//\n\t\t\t// a := old total impulse\n\t\t\t// x := new total impulse\n\t\t\t// d := incremental impulse\n\t\t\t//\n\t\t\t// For the current iteration we extend the formula for the incremental impulse\n\t\t\t// to compute the new total impulse:\n\t\t\t//\n\t\t\t// vn = A * d + b\n\t\t\t//    = A * (x - a) + b\n\t\t\t//    = A * x + b - A * a\n\t\t\t//    = A * x + b'\n\t\t\t// b' = b - A * a;\n\n\t\t\tb2VelocityConstraintPoint* cp1 = vc->points + 0;\n\t\t\tb2VelocityConstraintPoint* cp2 = vc->points + 1;\n\n\t\t\tb2Vec2 a(cp1->normalImpulse, cp2->normalImpulse);\n\t\t\tb2Assert(a.x >= 0.0f && a.y >= 0.0f);\n\n\t\t\t// Relative velocity at contact\n\t\t\tb2Vec2 dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA);\n\t\t\tb2Vec2 dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA);\n\n\t\t\t// Compute normal velocity\n\t\t\tfloat32 vn1 = b2Dot(dv1, normal);\n\t\t\tfloat32 vn2 = b2Dot(dv2, normal);\n\n\t\t\tb2Vec2 b;\n\t\t\tb.x = vn1 - cp1->velocityBias;\n\t\t\tb.y = vn2 - cp2->velocityBias;\n\n\t\t\t// Compute b'\n\t\t\tb -= b2Mul(vc->K, a);\n\n\t\t\tconst float32 k_errorTol = 1e-3f;\n\t\t\tB2_NOT_USED(k_errorTol);\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\t//\n\t\t\t\t// Case 1: vn = 0\n\t\t\t\t//\n\t\t\t\t// 0 = A * x + b'\n\t\t\t\t//\n\t\t\t\t// Solve for x:\n\t\t\t\t//\n\t\t\t\t// x = - inv(A) * b'\n\t\t\t\t//\n\t\t\t\tb2Vec2 x = - b2Mul(vc->normalMass, b);\n\n\t\t\t\tif (x.x >= 0.0f && x.y >= 0.0f)\n\t\t\t\t{\n\t\t\t\t\t// Get the incremental impulse\n\t\t\t\t\tb2Vec2 d = x - a;\n\n\t\t\t\t\t// Apply incremental impulse\n\t\t\t\t\tb2Vec2 P1 = d.x * normal;\n\t\t\t\t\tb2Vec2 P2 = d.y * normal;\n\t\t\t\t\tvA -= mA * (P1 + P2);\n\t\t\t\t\twA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2));\n\n\t\t\t\t\tvB += mB * (P1 + P2);\n\t\t\t\t\twB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2));\n\n\t\t\t\t\t// Accumulate\n\t\t\t\t\tcp1->normalImpulse = x.x;\n\t\t\t\t\tcp2->normalImpulse = x.y;\n\n#if B2_DEBUG_SOLVER == 1\n\t\t\t\t\t// Postconditions\n\t\t\t\t\tdv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA);\n\t\t\t\t\tdv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA);\n\n\t\t\t\t\t// Compute normal velocity\n\t\t\t\t\tvn1 = b2Dot(dv1, normal);\n\t\t\t\t\tvn2 = b2Dot(dv2, normal);\n\n\t\t\t\t\tb2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol);\n\t\t\t\t\tb2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol);\n#endif\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t//\n\t\t\t\t// Case 2: vn1 = 0 and x2 = 0\n\t\t\t\t//\n\t\t\t\t//   0 = a11 * x1 + a12 * 0 + b1'\n\t\t\t\t// vn2 = a21 * x1 + a22 * 0 + b2'\n\t\t\t\t//\n\t\t\t\tx.x = - cp1->normalMass * b.x;\n\t\t\t\tx.y = 0.0f;\n\t\t\t\tvn1 = 0.0f;\n\t\t\t\tvn2 = vc->K.ex.y * x.x + b.y;\n\n\t\t\t\tif (x.x >= 0.0f && vn2 >= 0.0f)\n\t\t\t\t{\n\t\t\t\t\t// Get the incremental impulse\n\t\t\t\t\tb2Vec2 d = x - a;\n\n\t\t\t\t\t// Apply incremental impulse\n\t\t\t\t\tb2Vec2 P1 = d.x * normal;\n\t\t\t\t\tb2Vec2 P2 = d.y * normal;\n\t\t\t\t\tvA -= mA * (P1 + P2);\n\t\t\t\t\twA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2));\n\n\t\t\t\t\tvB += mB * (P1 + P2);\n\t\t\t\t\twB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2));\n\n\t\t\t\t\t// Accumulate\n\t\t\t\t\tcp1->normalImpulse = x.x;\n\t\t\t\t\tcp2->normalImpulse = x.y;\n\n#if B2_DEBUG_SOLVER == 1\n\t\t\t\t\t// Postconditions\n\t\t\t\t\tdv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA);\n\n\t\t\t\t\t// Compute normal velocity\n\t\t\t\t\tvn1 = b2Dot(dv1, normal);\n\n\t\t\t\t\tb2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol);\n#endif\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\n\t\t\t\t//\n\t\t\t\t// Case 3: vn2 = 0 and x1 = 0\n\t\t\t\t//\n\t\t\t\t// vn1 = a11 * 0 + a12 * x2 + b1'\n\t\t\t\t//   0 = a21 * 0 + a22 * x2 + b2'\n\t\t\t\t//\n\t\t\t\tx.x = 0.0f;\n\t\t\t\tx.y = - cp2->normalMass * b.y;\n\t\t\t\tvn1 = vc->K.ey.x * x.y + b.x;\n\t\t\t\tvn2 = 0.0f;\n\n\t\t\t\tif (x.y >= 0.0f && vn1 >= 0.0f)\n\t\t\t\t{\n\t\t\t\t\t// Resubstitute for the incremental impulse\n\t\t\t\t\tb2Vec2 d = x - a;\n\n\t\t\t\t\t// Apply incremental impulse\n\t\t\t\t\tb2Vec2 P1 = d.x * normal;\n\t\t\t\t\tb2Vec2 P2 = d.y * normal;\n\t\t\t\t\tvA -= mA * (P1 + P2);\n\t\t\t\t\twA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2));\n\n\t\t\t\t\tvB += mB * (P1 + P2);\n\t\t\t\t\twB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2));\n\n\t\t\t\t\t// Accumulate\n\t\t\t\t\tcp1->normalImpulse = x.x;\n\t\t\t\t\tcp2->normalImpulse = x.y;\n\n#if B2_DEBUG_SOLVER == 1\n\t\t\t\t\t// Postconditions\n\t\t\t\t\tdv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA);\n\n\t\t\t\t\t// Compute normal velocity\n\t\t\t\t\tvn2 = b2Dot(dv2, normal);\n\n\t\t\t\t\tb2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol);\n#endif\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t//\n\t\t\t\t// Case 4: x1 = 0 and x2 = 0\n\t\t\t\t//\n\t\t\t\t// vn1 = b1\n\t\t\t\t// vn2 = b2;\n\t\t\t\tx.x = 0.0f;\n\t\t\t\tx.y = 0.0f;\n\t\t\t\tvn1 = b.x;\n\t\t\t\tvn2 = b.y;\n\n\t\t\t\tif (vn1 >= 0.0f && vn2 >= 0.0f )\n\t\t\t\t{\n\t\t\t\t\t// Resubstitute for the incremental impulse\n\t\t\t\t\tb2Vec2 d = x - a;\n\n\t\t\t\t\t// Apply incremental impulse\n\t\t\t\t\tb2Vec2 P1 = d.x * normal;\n\t\t\t\t\tb2Vec2 P2 = d.y * normal;\n\t\t\t\t\tvA -= mA * (P1 + P2);\n\t\t\t\t\twA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2));\n\n\t\t\t\t\tvB += mB * (P1 + P2);\n\t\t\t\t\twB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2));\n\n\t\t\t\t\t// Accumulate\n\t\t\t\t\tcp1->normalImpulse = x.x;\n\t\t\t\t\tcp2->normalImpulse = x.y;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// No solution, give up. This is hit sometimes, but it doesn't seem to matter.\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tm_velocities[indexA].v = vA;\n\t\tm_velocities[indexA].w = wA;\n\t\tm_velocities[indexB].v = vB;\n\t\tm_velocities[indexB].w = wB;\n\t}\n}\n\nvoid b2ContactSolver::StoreImpulses()\n{\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\t\tb2Manifold* manifold = m_contacts[vc->contactIndex]->GetManifold();\n\n\t\tfor (int32 j = 0; j < vc->pointCount; ++j)\n\t\t{\n\t\t\tmanifold->points[j].normalImpulse = vc->points[j].normalImpulse;\n\t\t\tmanifold->points[j].tangentImpulse = vc->points[j].tangentImpulse;\n\t\t}\n\t}\n}\n\nstruct b2PositionSolverManifold\n{\n\tvoid Initialize(b2ContactPositionConstraint* pc, const b2Transform& xfA, const b2Transform& xfB, int32 index)\n\t{\n\t\tb2Assert(pc->pointCount > 0);\n\n\t\tswitch (pc->type)\n\t\t{\n\t\tcase b2Manifold::e_circles:\n\t\t\t{\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, pc->localPoint);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, pc->localPoints[0]);\n\t\t\t\tnormal = pointB - pointA;\n\t\t\t\tnormal.Normalize();\n\t\t\t\tpoint = 0.5f * (pointA + pointB);\n\t\t\t\tseparation = b2Dot(pointB - pointA, normal) - pc->radiusA - pc->radiusB;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase b2Manifold::e_faceA:\n\t\t\t{\n\t\t\t\tnormal = b2Mul(xfA.q, pc->localNormal);\n\t\t\t\tb2Vec2 planePoint = b2Mul(xfA, pc->localPoint);\n\n\t\t\t\tb2Vec2 clipPoint = b2Mul(xfB, pc->localPoints[index]);\n\t\t\t\tseparation = b2Dot(clipPoint - planePoint, normal) - pc->radiusA - pc->radiusB;\n\t\t\t\tpoint = clipPoint;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase b2Manifold::e_faceB:\n\t\t\t{\n\t\t\t\tnormal = b2Mul(xfB.q, pc->localNormal);\n\t\t\t\tb2Vec2 planePoint = b2Mul(xfB, pc->localPoint);\n\n\t\t\t\tb2Vec2 clipPoint = b2Mul(xfA, pc->localPoints[index]);\n\t\t\t\tseparation = b2Dot(clipPoint - planePoint, normal) - pc->radiusA - pc->radiusB;\n\t\t\t\tpoint = clipPoint;\n\n\t\t\t\t// Ensure normal points from A to B\n\t\t\t\tnormal = -normal;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tb2Vec2 normal;\n\tb2Vec2 point;\n\tfloat32 separation;\n};\n\n// Sequential solver.\nbool b2ContactSolver::SolvePositionConstraints()\n{\n\tfloat32 minSeparation = 0.0f;\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactPositionConstraint* pc = m_positionConstraints + i;\n\n\t\tint32 indexA = pc->indexA;\n\t\tint32 indexB = pc->indexB;\n\t\tb2Vec2 localCenterA = pc->localCenterA;\n\t\tfloat32 mA = pc->invMassA;\n\t\tfloat32 iA = pc->invIA;\n\t\tb2Vec2 localCenterB = pc->localCenterB;\n\t\tfloat32 mB = pc->invMassB;\n\t\tfloat32 iB = pc->invIB;\n\t\tint32 pointCount = pc->pointCount;\n\n\t\tb2Vec2 cA = m_positions[indexA].c;\n\t\tfloat32 aA = m_positions[indexA].a;\n\n\t\tb2Vec2 cB = m_positions[indexB].c;\n\t\tfloat32 aB = m_positions[indexB].a;\n\n\t\t// Solve normal constraints\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2Transform xfA, xfB;\n\t\t\txfA.q.Set(aA);\n\t\t\txfB.q.Set(aB);\n\t\t\txfA.p = cA - b2Mul(xfA.q, localCenterA);\n\t\t\txfB.p = cB - b2Mul(xfB.q, localCenterB);\n\n\t\t\tb2PositionSolverManifold psm;\n\t\t\tpsm.Initialize(pc, xfA, xfB, j);\n\t\t\tb2Vec2 normal = psm.normal;\n\n\t\t\tb2Vec2 point = psm.point;\n\t\t\tfloat32 separation = psm.separation;\n\n\t\t\tb2Vec2 rA = point - cA;\n\t\t\tb2Vec2 rB = point - cB;\n\n\t\t\t// Track max constraint error.\n\t\t\tminSeparation = b2Min(minSeparation, separation);\n\n\t\t\t// Prevent large corrections and allow slop.\n\t\t\tfloat32 C = b2Clamp(b2_baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f);\n\n\t\t\t// Compute the effective mass.\n\t\t\tfloat32 rnA = b2Cross(rA, normal);\n\t\t\tfloat32 rnB = b2Cross(rB, normal);\n\t\t\tfloat32 K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n\t\t\t// Compute normal impulse\n\t\t\tfloat32 impulse = K > 0.0f ? - C / K : 0.0f;\n\n\t\t\tb2Vec2 P = impulse * normal;\n\n\t\t\tcA -= mA * P;\n\t\t\taA -= iA * b2Cross(rA, P);\n\n\t\t\tcB += mB * P;\n\t\t\taB += iB * b2Cross(rB, P);\n\t\t}\n\n\t\tm_positions[indexA].c = cA;\n\t\tm_positions[indexA].a = aA;\n\n\t\tm_positions[indexB].c = cB;\n\t\tm_positions[indexB].a = aB;\n\t}\n\n\t// We can't expect minSpeparation >= -b2_linearSlop because we don't\n\t// push the separation above -b2_linearSlop.\n\treturn minSeparation >= -3.0f * b2_linearSlop;\n}\n\n// Sequential position solver for position constraints.\nbool b2ContactSolver::SolveTOIPositionConstraints(int32 toiIndexA, int32 toiIndexB)\n{\n\tfloat32 minSeparation = 0.0f;\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactPositionConstraint* pc = m_positionConstraints + i;\n\n\t\tint32 indexA = pc->indexA;\n\t\tint32 indexB = pc->indexB;\n\t\tb2Vec2 localCenterA = pc->localCenterA;\n\t\tb2Vec2 localCenterB = pc->localCenterB;\n\t\tint32 pointCount = pc->pointCount;\n\n\t\tfloat32 mA = 0.0f;\n\t\tfloat32 iA = 0.0f;\n\t\tif (indexA == toiIndexA || indexA == toiIndexB)\n\t\t{\n\t\t\tmA = pc->invMassA;\n\t\t\tiA = pc->invIA;\n\t\t}\n\n\t\tfloat32 mB = 0.0f;\n\t\tfloat32 iB = 0.;\n\t\tif (indexB == toiIndexA || indexB == toiIndexB)\n\t\t{\n\t\t\tmB = pc->invMassB;\n\t\t\tiB = pc->invIB;\n\t\t}\n\n\t\tb2Vec2 cA = m_positions[indexA].c;\n\t\tfloat32 aA = m_positions[indexA].a;\n\n\t\tb2Vec2 cB = m_positions[indexB].c;\n\t\tfloat32 aB = m_positions[indexB].a;\n\n\t\t// Solve normal constraints\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2Transform xfA, xfB;\n\t\t\txfA.q.Set(aA);\n\t\t\txfB.q.Set(aB);\n\t\t\txfA.p = cA - b2Mul(xfA.q, localCenterA);\n\t\t\txfB.p = cB - b2Mul(xfB.q, localCenterB);\n\n\t\t\tb2PositionSolverManifold psm;\n\t\t\tpsm.Initialize(pc, xfA, xfB, j);\n\t\t\tb2Vec2 normal = psm.normal;\n\n\t\t\tb2Vec2 point = psm.point;\n\t\t\tfloat32 separation = psm.separation;\n\n\t\t\tb2Vec2 rA = point - cA;\n\t\t\tb2Vec2 rB = point - cB;\n\n\t\t\t// Track max constraint error.\n\t\t\tminSeparation = b2Min(minSeparation, separation);\n\n\t\t\t// Prevent large corrections and allow slop.\n\t\t\tfloat32 C = b2Clamp(b2_toiBaugarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f);\n\n\t\t\t// Compute the effective mass.\n\t\t\tfloat32 rnA = b2Cross(rA, normal);\n\t\t\tfloat32 rnB = b2Cross(rB, normal);\n\t\t\tfloat32 K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n\t\t\t// Compute normal impulse\n\t\t\tfloat32 impulse = K > 0.0f ? - C / K : 0.0f;\n\n\t\t\tb2Vec2 P = impulse * normal;\n\n\t\t\tcA -= mA * P;\n\t\t\taA -= iA * b2Cross(rA, P);\n\n\t\t\tcB += mB * P;\n\t\t\taB += iB * b2Cross(rB, P);\n\t\t}\n\n\t\tm_positions[indexA].c = cA;\n\t\tm_positions[indexA].a = aA;\n\n\t\tm_positions[indexB].c = cB;\n\t\tm_positions[indexB].a = aB;\n\t}\n\n\t// We can't expect minSpeparation >= -b2_linearSlop because we don't\n\t// push the separation above -b2_linearSlop.\n\treturn minSeparation >= -1.5f * b2_linearSlop;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Distance.cpp",
    "content": "/*\n* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2Distance.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\"\n\n// GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\nint32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters;\n\nvoid b2DistanceProxy::Set(const b2Shape* shape, int32 index)\n{\n\tswitch (shape->GetType())\n\t{\n\tcase b2Shape::e_circle:\n\t\t{\n\t\t\tconst b2CircleShape* circle = static_cast<const b2CircleShape*>(shape);\n\t\t\tm_vertices = &circle->m_p;\n\t\t\tm_count = 1;\n\t\t\tm_radius = circle->m_radius;\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_polygon:\n\t\t{\n\t\t\tconst b2PolygonShape* polygon = static_cast<const b2PolygonShape*>(shape);\n\t\t\tm_vertices = polygon->m_vertices;\n\t\t\tm_count = polygon->m_count;\n\t\t\tm_radius = polygon->m_radius;\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_chain:\n\t\t{\n\t\t\tconst b2ChainShape* chain = static_cast<const b2ChainShape*>(shape);\n\t\t\tb2Assert(0 <= index && index < chain->m_count);\n\n\t\t\tm_buffer[0] = chain->m_vertices[index];\n\t\t\tif (index + 1 < chain->m_count)\n\t\t\t{\n\t\t\t\tm_buffer[1] = chain->m_vertices[index + 1];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_buffer[1] = chain->m_vertices[0];\n\t\t\t}\n\n\t\t\tm_vertices = m_buffer;\n\t\t\tm_count = 2;\n\t\t\tm_radius = chain->m_radius;\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_edge:\n\t\t{\n\t\t\tconst b2EdgeShape* edge = static_cast<const b2EdgeShape*>(shape);\n\t\t\tm_vertices = &edge->m_vertex1;\n\t\t\tm_count = 2;\n\t\t\tm_radius = edge->m_radius;\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tb2Assert(false);\n\t}\n}\n\n\nstruct b2SimplexVertex\n{\n\tb2Vec2 wA;\t\t// support point in proxyA\n\tb2Vec2 wB;\t\t// support point in proxyB\n\tb2Vec2 w;\t\t// wB - wA\n\tfloat32 a;\t\t// barycentric coordinate for closest point\n\tint32 indexA;\t// wA index\n\tint32 indexB;\t// wB index\n};\n\nstruct b2Simplex\n{\n\tvoid ReadCache(\tconst b2SimplexCache* cache,\n\t\t\t\t\tconst b2DistanceProxy* proxyA, const b2Transform& transformA,\n\t\t\t\t\tconst b2DistanceProxy* proxyB, const b2Transform& transformB)\n\t{\n\t\tb2Assert(cache->count <= 3);\n\n\t\t// Copy data from cache.\n\t\tm_count = cache->count;\n\t\tb2SimplexVertex* vertices = &m_v1;\n\t\tfor (int32 i = 0; i < m_count; ++i)\n\t\t{\n\t\t\tb2SimplexVertex* v = vertices + i;\n\t\t\tv->indexA = cache->indexA[i];\n\t\t\tv->indexB = cache->indexB[i];\n\t\t\tb2Vec2 wALocal = proxyA->GetVertex(v->indexA);\n\t\t\tb2Vec2 wBLocal = proxyB->GetVertex(v->indexB);\n\t\t\tv->wA = b2Mul(transformA, wALocal);\n\t\t\tv->wB = b2Mul(transformB, wBLocal);\n\t\t\tv->w = v->wB - v->wA;\n\t\t\tv->a = 0.0f;\n\t\t}\n\n\t\t// Compute the new simplex metric, if it is substantially different than\n\t\t// old metric then flush the simplex.\n\t\tif (m_count > 1)\n\t\t{\n\t\t\tfloat32 metric1 = cache->metric;\n\t\t\tfloat32 metric2 = GetMetric();\n\t\t\tif (metric2 < 0.5f * metric1 || 2.0f * metric1 < metric2 || metric2 < b2_epsilon)\n\t\t\t{\n\t\t\t\t// Reset the simplex.\n\t\t\t\tm_count = 0;\n\t\t\t}\n\t\t}\n\n\t\t// If the cache is empty or invalid ...\n\t\tif (m_count == 0)\n\t\t{\n\t\t\tb2SimplexVertex* v = vertices + 0;\n\t\t\tv->indexA = 0;\n\t\t\tv->indexB = 0;\n\t\t\tb2Vec2 wALocal = proxyA->GetVertex(0);\n\t\t\tb2Vec2 wBLocal = proxyB->GetVertex(0);\n\t\t\tv->wA = b2Mul(transformA, wALocal);\n\t\t\tv->wB = b2Mul(transformB, wBLocal);\n\t\t\tv->w = v->wB - v->wA;\n\t\t\tv->a = 1.0f;\n\t\t\tm_count = 1;\n\t\t}\n\t}\n\n\tvoid WriteCache(b2SimplexCache* cache) const\n\t{\n\t\tcache->metric = GetMetric();\n\t\tcache->count = uint16(m_count);\n\t\tconst b2SimplexVertex* vertices = &m_v1;\n\t\tfor (int32 i = 0; i < m_count; ++i)\n\t\t{\n\t\t\tcache->indexA[i] = uint8(vertices[i].indexA);\n\t\t\tcache->indexB[i] = uint8(vertices[i].indexB);\n\t\t}\n\t}\n\n\tb2Vec2 GetSearchDirection() const\n\t{\n\t\tswitch (m_count)\n\t\t{\n\t\tcase 1:\n\t\t\treturn -m_v1.w;\n\n\t\tcase 2:\n\t\t\t{\n\t\t\t\tb2Vec2 e12 = m_v2.w - m_v1.w;\n\t\t\t\tfloat32 sgn = b2Cross(e12, -m_v1.w);\n\t\t\t\tif (sgn > 0.0f)\n\t\t\t\t{\n\t\t\t\t\t// Origin is left of e12.\n\t\t\t\t\treturn b2Cross(1.0f, e12);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Origin is right of e12.\n\t\t\t\t\treturn b2Cross(e12, 1.0f);\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\treturn b2Vec2_zero;\n\t\t}\n\t}\n\n\tb2Vec2 GetClosestPoint() const\n\t{\n\t\tswitch (m_count)\n\t\t{\n\t\tcase 0:\n\t\t\tb2Assert(false);\n\t\t\treturn b2Vec2_zero;\n\n\t\tcase 1:\n\t\t\treturn m_v1.w;\n\n\t\tcase 2:\n\t\t\treturn m_v1.a * m_v1.w + m_v2.a * m_v2.w;\n\n\t\tcase 3:\n\t\t\treturn b2Vec2_zero;\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\treturn b2Vec2_zero;\n\t\t}\n\t}\n\n\tvoid GetWitnessPoints(b2Vec2* pA, b2Vec2* pB) const\n\t{\n\t\tswitch (m_count)\n\t\t{\n\t\tcase 0:\n\t\t\tb2Assert(false);\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\t*pA = m_v1.wA;\n\t\t\t*pB = m_v1.wB;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\t*pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA;\n\t\t\t*pB = m_v1.a * m_v1.wB + m_v2.a * m_v2.wB;\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\t*pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA + m_v3.a * m_v3.wA;\n\t\t\t*pB = *pA;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfloat32 GetMetric() const\n\t{\n\t\tswitch (m_count)\n\t\t{\n\t\tcase 0:\n\t\t\tb2Assert(false);\n\t\t\treturn 0.0f;\n\n\t\tcase 1:\n\t\t\treturn 0.0f;\n\n\t\tcase 2:\n\t\t\treturn b2Distance(m_v1.w, m_v2.w);\n\n\t\tcase 3:\n\t\t\treturn b2Cross(m_v2.w - m_v1.w, m_v3.w - m_v1.w);\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\treturn 0.0f;\n\t\t}\n\t}\n\n\tvoid Solve2();\n\tvoid Solve3();\n\n\tb2SimplexVertex m_v1, m_v2, m_v3;\n\tint32 m_count;\n};\n\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1      1     ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 =  dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\nvoid b2Simplex::Solve2()\n{\n\tb2Vec2 w1 = m_v1.w;\n\tb2Vec2 w2 = m_v2.w;\n\tb2Vec2 e12 = w2 - w1;\n\n\t// w1 region\n\tfloat32 d12_2 = -b2Dot(w1, e12);\n\tif (d12_2 <= 0.0f)\n\t{\n\t\t// a2 <= 0, so we clamp it to 0\n\t\tm_v1.a = 1.0f;\n\t\tm_count = 1;\n\t\treturn;\n\t}\n\n\t// w2 region\n\tfloat32 d12_1 = b2Dot(w2, e12);\n\tif (d12_1 <= 0.0f)\n\t{\n\t\t// a1 <= 0, so we clamp it to 0\n\t\tm_v2.a = 1.0f;\n\t\tm_count = 1;\n\t\tm_v1 = m_v2;\n\t\treturn;\n\t}\n\n\t// Must be in e12 region.\n\tfloat32 inv_d12 = 1.0f / (d12_1 + d12_2);\n\tm_v1.a = d12_1 * inv_d12;\n\tm_v2.a = d12_2 * inv_d12;\n\tm_count = 2;\n}\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\nvoid b2Simplex::Solve3()\n{\n\tb2Vec2 w1 = m_v1.w;\n\tb2Vec2 w2 = m_v2.w;\n\tb2Vec2 w3 = m_v3.w;\n\n\t// Edge12\n\t// [1      1     ][a1] = [1]\n\t// [w1.e12 w2.e12][a2] = [0]\n\t// a3 = 0\n\tb2Vec2 e12 = w2 - w1;\n\tfloat32 w1e12 = b2Dot(w1, e12);\n\tfloat32 w2e12 = b2Dot(w2, e12);\n\tfloat32 d12_1 = w2e12;\n\tfloat32 d12_2 = -w1e12;\n\n\t// Edge13\n\t// [1      1     ][a1] = [1]\n\t// [w1.e13 w3.e13][a3] = [0]\n\t// a2 = 0\n\tb2Vec2 e13 = w3 - w1;\n\tfloat32 w1e13 = b2Dot(w1, e13);\n\tfloat32 w3e13 = b2Dot(w3, e13);\n\tfloat32 d13_1 = w3e13;\n\tfloat32 d13_2 = -w1e13;\n\n\t// Edge23\n\t// [1      1     ][a2] = [1]\n\t// [w2.e23 w3.e23][a3] = [0]\n\t// a1 = 0\n\tb2Vec2 e23 = w3 - w2;\n\tfloat32 w2e23 = b2Dot(w2, e23);\n\tfloat32 w3e23 = b2Dot(w3, e23);\n\tfloat32 d23_1 = w3e23;\n\tfloat32 d23_2 = -w2e23;\n\n\t// Triangle123\n\tfloat32 n123 = b2Cross(e12, e13);\n\n\tfloat32 d123_1 = n123 * b2Cross(w2, w3);\n\tfloat32 d123_2 = n123 * b2Cross(w3, w1);\n\tfloat32 d123_3 = n123 * b2Cross(w1, w2);\n\n\t// w1 region\n\tif (d12_2 <= 0.0f && d13_2 <= 0.0f)\n\t{\n\t\tm_v1.a = 1.0f;\n\t\tm_count = 1;\n\t\treturn;\n\t}\n\n\t// e12\n\tif (d12_1 > 0.0f && d12_2 > 0.0f && d123_3 <= 0.0f)\n\t{\n\t\tfloat32 inv_d12 = 1.0f / (d12_1 + d12_2);\n\t\tm_v1.a = d12_1 * inv_d12;\n\t\tm_v2.a = d12_2 * inv_d12;\n\t\tm_count = 2;\n\t\treturn;\n\t}\n\n\t// e13\n\tif (d13_1 > 0.0f && d13_2 > 0.0f && d123_2 <= 0.0f)\n\t{\n\t\tfloat32 inv_d13 = 1.0f / (d13_1 + d13_2);\n\t\tm_v1.a = d13_1 * inv_d13;\n\t\tm_v3.a = d13_2 * inv_d13;\n\t\tm_count = 2;\n\t\tm_v2 = m_v3;\n\t\treturn;\n\t}\n\n\t// w2 region\n\tif (d12_1 <= 0.0f && d23_2 <= 0.0f)\n\t{\n\t\tm_v2.a = 1.0f;\n\t\tm_count = 1;\n\t\tm_v1 = m_v2;\n\t\treturn;\n\t}\n\n\t// w3 region\n\tif (d13_1 <= 0.0f && d23_1 <= 0.0f)\n\t{\n\t\tm_v3.a = 1.0f;\n\t\tm_count = 1;\n\t\tm_v1 = m_v3;\n\t\treturn;\n\t}\n\n\t// e23\n\tif (d23_1 > 0.0f && d23_2 > 0.0f && d123_1 <= 0.0f)\n\t{\n\t\tfloat32 inv_d23 = 1.0f / (d23_1 + d23_2);\n\t\tm_v2.a = d23_1 * inv_d23;\n\t\tm_v3.a = d23_2 * inv_d23;\n\t\tm_count = 2;\n\t\tm_v1 = m_v3;\n\t\treturn;\n\t}\n\n\t// Must be in triangle123\n\tfloat32 inv_d123 = 1.0f / (d123_1 + d123_2 + d123_3);\n\tm_v1.a = d123_1 * inv_d123;\n\tm_v2.a = d123_2 * inv_d123;\n\tm_v3.a = d123_3 * inv_d123;\n\tm_count = 3;\n}\n\nvoid b2Distance(b2DistanceOutput* output,\n\t\t\t\tb2SimplexCache* cache,\n\t\t\t\tconst b2DistanceInput* input)\n{\n\t++b2_gjkCalls;\n\n\tconst b2DistanceProxy* proxyA = &input->proxyA;\n\tconst b2DistanceProxy* proxyB = &input->proxyB;\n\n\tb2Transform transformA = input->transformA;\n\tb2Transform transformB = input->transformB;\n\n\t// Initialize the simplex.\n\tb2Simplex simplex;\n\tsimplex.ReadCache(cache, proxyA, transformA, proxyB, transformB);\n\n\t// Get simplex vertices as an array.\n\tb2SimplexVertex* vertices = &simplex.m_v1;\n\tconst int32 k_maxIters = 20;\n\n\t// These store the vertices of the last simplex so that we\n\t// can check for duplicates and prevent cycling.\n\tint32 saveA[3], saveB[3];\n\tint32 saveCount = 0;\n\n\tfloat32 distanceSqr1 = b2_maxFloat;\n\tfloat32 distanceSqr2 = distanceSqr1;\n\n\t// Main iteration loop.\n\tint32 iter = 0;\n\twhile (iter < k_maxIters)\n\t{\n\t\t// Copy simplex so we can identify duplicates.\n\t\tsaveCount = simplex.m_count;\n\t\tfor (int32 i = 0; i < saveCount; ++i)\n\t\t{\n\t\t\tsaveA[i] = vertices[i].indexA;\n\t\t\tsaveB[i] = vertices[i].indexB;\n\t\t}\n\n\t\tswitch (simplex.m_count)\n\t\t{\n\t\tcase 1:\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tsimplex.Solve2();\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\tsimplex.Solve3();\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t}\n\n\t\t// If we have 3 points, then the origin is in the corresponding triangle.\n\t\tif (simplex.m_count == 3)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t// Compute closest point.\n\t\tb2Vec2 p = simplex.GetClosestPoint();\n\t\tdistanceSqr2 = p.LengthSquared();\n\n\t\t// Ensure progress\n\t\tif (distanceSqr2 >= distanceSqr1)\n\t\t{\n\t\t\t//break;\n\t\t}\n\t\tdistanceSqr1 = distanceSqr2;\n\n\t\t// Get search direction.\n\t\tb2Vec2 d = simplex.GetSearchDirection();\n\n\t\t// Ensure the search direction is numerically fit.\n\t\tif (d.LengthSquared() < b2_epsilon * b2_epsilon)\n\t\t{\n\t\t\t// The origin is probably contained by a line segment\n\t\t\t// or triangle. Thus the shapes are overlapped.\n\n\t\t\t// We can't return zero here even though there may be overlap.\n\t\t\t// In case the simplex is a point, segment, or triangle it is difficult\n\t\t\t// to determine if the origin is contained in the CSO or very close to it.\n\t\t\tbreak;\n\t\t}\n\n\t\t// Compute a tentative new simplex vertex using support points.\n\t\tb2SimplexVertex* vertex = vertices + simplex.m_count;\n\t\tvertex->indexA = proxyA->GetSupport(b2MulT(transformA.q, -d));\n\t\tvertex->wA = b2Mul(transformA, proxyA->GetVertex(vertex->indexA));\n\t\tb2Vec2 wBLocal;\n\t\tvertex->indexB = proxyB->GetSupport(b2MulT(transformB.q, d));\n\t\tvertex->wB = b2Mul(transformB, proxyB->GetVertex(vertex->indexB));\n\t\tvertex->w = vertex->wB - vertex->wA;\n\n\t\t// Iteration count is equated to the number of support point calls.\n\t\t++iter;\n\t\t++b2_gjkIters;\n\n\t\t// Check for duplicate support points. This is the main termination criteria.\n\t\tbool duplicate = false;\n\t\tfor (int32 i = 0; i < saveCount; ++i)\n\t\t{\n\t\t\tif (vertex->indexA == saveA[i] && vertex->indexB == saveB[i])\n\t\t\t{\n\t\t\t\tduplicate = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// If we found a duplicate support point we must exit to avoid cycling.\n\t\tif (duplicate)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t// New vertex is ok and needed.\n\t\t++simplex.m_count;\n\t}\n\n\tb2_gjkMaxIters = b2Max(b2_gjkMaxIters, iter);\n\n\t// Prepare output.\n\tsimplex.GetWitnessPoints(&output->pointA, &output->pointB);\n\toutput->distance = b2Distance(output->pointA, output->pointB);\n\toutput->iterations = iter;\n\n\t// Cache the simplex.\n\tsimplex.WriteCache(cache);\n\n\t// Apply radii if requested.\n\tif (input->useRadii)\n\t{\n\t\tfloat32 rA = proxyA->m_radius;\n\t\tfloat32 rB = proxyB->m_radius;\n\n\t\tif (output->distance > rA + rB && output->distance > b2_epsilon)\n\t\t{\n\t\t\t// Shapes are still no overlapped.\n\t\t\t// Move the witness points to the outer surface.\n\t\t\toutput->distance -= rA + rB;\n\t\t\tb2Vec2 normal = output->pointB - output->pointA;\n\t\t\tnormal.Normalize();\n\t\t\toutput->pointA += rA * normal;\n\t\t\toutput->pointB -= rB * normal;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Shapes are overlapped when radii are considered.\n\t\t\t// Move the witness points to the middle.\n\t\t\tb2Vec2 p = 0.5f * (output->pointA + output->pointB);\n\t\t\toutput->pointA = p;\n\t\t\toutput->pointB = p;\n\t\t\toutput->distance = 0.0f;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2DistanceJoint.cpp",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2DistanceJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// 1-D constrained system\n// m (v2 - v1) = lambda\n// v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n// x2 = x1 + h * v2\n\n// 1-D mass-damper-spring system\n// m (v2 - v1) + h * d * v2 + h * k *\n\n// C = norm(p2 - p1) - L\n// u = (p2 - p1) / norm(p2 - p1)\n// Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n// J = [-u -cross(r1, u) u cross(r2, u)]\n// K = J * invM * JT\n//   = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n\nvoid b2DistanceJointDef::Initialize(b2Body* b1, b2Body* b2,\n\t\t\t\t\t\t\t\t\tconst b2Vec2& anchor1, const b2Vec2& anchor2)\n{\n\tbodyA = b1;\n\tbodyB = b2;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor1);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor2);\n\tb2Vec2 d = anchor2 - anchor1;\n\tlength = d.Length();\n}\n\nb2DistanceJoint::b2DistanceJoint(const b2DistanceJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_length = def->length;\n\tm_frequencyHz = def->frequencyHz;\n\tm_dampingRatio = def->dampingRatio;\n\tm_impulse = 0.0f;\n\tm_gamma = 0.0f;\n\tm_bias = 0.0f;\n}\n\nvoid b2DistanceJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tm_u = cB + m_rB - cA - m_rA;\n\n\t// Handle singularity.\n\tfloat32 length = m_u.Length();\n\tif (length > b2_linearSlop)\n\t{\n\t\tm_u *= 1.0f / length;\n\t}\n\telse\n\t{\n\t\tm_u.Set(0.0f, 0.0f);\n\t}\n\n\tfloat32 crAu = b2Cross(m_rA, m_u);\n\tfloat32 crBu = b2Cross(m_rB, m_u);\n\tfloat32 invMass = m_invMassA + m_invIA * crAu * crAu + m_invMassB + m_invIB * crBu * crBu;\n\n\t// Compute the effective mass matrix.\n\tm_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;\n\n\tif (m_frequencyHz > 0.0f)\n\t{\n\t\tfloat32 C = length - m_length;\n\n\t\t// Frequency\n\t\tfloat32 omega = 2.0f * b2_pi * m_frequencyHz;\n\n\t\t// Damping coefficient\n\t\tfloat32 d = 2.0f * m_mass * m_dampingRatio * omega;\n\n\t\t// Spring stiffness\n\t\tfloat32 k = m_mass * omega * omega;\n\n\t\t// magic formulas\n\t\tfloat32 h = data.step.dt;\n\t\tm_gamma = h * (d + h * k);\n\t\tm_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f;\n\t\tm_bias = C * h * k * m_gamma;\n\n\t\tinvMass += m_gamma;\n\t\tm_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;\n\t}\n\telse\n\t{\n\t\tm_gamma = 0.0f;\n\t\tm_bias = 0.0f;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale the impulse to support a variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P = m_impulse * m_u;\n\t\tvA -= m_invMassA * P;\n\t\twA -= m_invIA * b2Cross(m_rA, P);\n\t\tvB += m_invMassB * P;\n\t\twB += m_invIB * b2Cross(m_rB, P);\n\t}\n\telse\n\t{\n\t\tm_impulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2DistanceJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\t// Cdot = dot(u, v + cross(w, r))\n\tb2Vec2 vpA = vA + b2Cross(wA, m_rA);\n\tb2Vec2 vpB = vB + b2Cross(wB, m_rB);\n\tfloat32 Cdot = b2Dot(m_u, vpB - vpA);\n\n\tfloat32 impulse = -m_mass * (Cdot + m_bias + m_gamma * m_impulse);\n\tm_impulse += impulse;\n\n\tb2Vec2 P = impulse * m_u;\n\tvA -= m_invMassA * P;\n\twA -= m_invIA * b2Cross(m_rA, P);\n\tvB += m_invMassB * P;\n\twB += m_invIB * b2Cross(m_rB, P);\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2DistanceJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tif (m_frequencyHz > 0.0f)\n\t{\n\t\t// There is no position correction for soft distance constraints.\n\t\treturn true;\n\t}\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 u = cB + rB - cA - rA;\n\n\tfloat32 length = u.Normalize();\n\tfloat32 C = length - m_length;\n\tC = b2Clamp(C, -b2_maxLinearCorrection, b2_maxLinearCorrection);\n\n\tfloat32 impulse = -m_mass * C;\n\tb2Vec2 P = impulse * u;\n\n\tcA -= m_invMassA * P;\n\taA -= m_invIA * b2Cross(rA, P);\n\tcB += m_invMassB * P;\n\taB += m_invIB * b2Cross(rB, P);\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn b2Abs(C) < b2_linearSlop;\n}\n\nb2Vec2 b2DistanceJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2DistanceJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2DistanceJoint::GetReactionForce(float32 inv_dt) const\n{\n\tb2Vec2 F = (inv_dt * m_impulse) * m_u;\n\treturn F;\n}\n\nfloat32 b2DistanceJoint::GetReactionTorque(float32 inv_dt) const\n{\n\tB2_NOT_USED(inv_dt);\n\treturn 0.0f;\n}\n\nvoid b2DistanceJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Log(\"  b2DistanceJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.localAnchorA.Set(%.15lef, %.15lef);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Log(\"  jd.localAnchorB.Set(%.15lef, %.15lef);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Log(\"  jd.length = %.15lef;\\n\", m_length);\n\tb2Log(\"  jd.frequencyHz = %.15lef;\\n\", m_frequencyHz);\n\tb2Log(\"  jd.dampingRatio = %.15lef;\\n\", m_dampingRatio);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Draw.cpp",
    "content": "/*\n* Copyright (c) 2011 Erin Catto http://box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Common/b2Draw.h\"\n\nb2Draw::b2Draw()\n{\n\tm_drawFlags = 0;\n}\n\nvoid b2Draw::SetFlags(uint32 flags)\n{\n\tm_drawFlags = flags;\n}\n\nuint32 b2Draw::GetFlags() const\n{\n\treturn m_drawFlags;\n}\n\nvoid b2Draw::AppendFlags(uint32 flags)\n{\n\tm_drawFlags |= flags;\n}\n\nvoid b2Draw::ClearFlags(uint32 flags)\n{\n\tm_drawFlags &= ~flags;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2DynamicTree.cpp",
    "content": "/*\n* Copyright (c) 2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2DynamicTree.h\"\n#include <memory.h>\n#include <string.h>\n\nb2DynamicTree::b2DynamicTree()\n{\n\tm_root = b2_nullNode;\n\n\tm_nodeCapacity = 16;\n\tm_nodeCount = 0;\n\tm_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode));\n\tmemset(m_nodes, 0, m_nodeCapacity * sizeof(b2TreeNode));\n\n\t// Build a linked list for the free list.\n\tfor (int32 i = 0; i < m_nodeCapacity - 1; ++i)\n\t{\n\t\tm_nodes[i].next = i + 1;\n\t\tm_nodes[i].height = -1;\n\t}\n\tm_nodes[m_nodeCapacity-1].next = b2_nullNode;\n\tm_nodes[m_nodeCapacity-1].height = -1;\n\tm_freeList = 0;\n\n\tm_path = 0;\n\n\tm_insertionCount = 0;\n}\n\nb2DynamicTree::~b2DynamicTree()\n{\n\t// This frees the entire tree in one shot.\n\tb2Free(m_nodes);\n}\n\n// Allocate a node from the pool. Grow the pool if necessary.\nint32 b2DynamicTree::AllocateNode()\n{\n\t// Expand the node pool as needed.\n\tif (m_freeList == b2_nullNode)\n\t{\n\t\tb2Assert(m_nodeCount == m_nodeCapacity);\n\n\t\t// The free list is empty. Rebuild a bigger pool.\n\t\tb2TreeNode* oldNodes = m_nodes;\n\t\tm_nodeCapacity *= 2;\n\t\tm_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode));\n\t\tmemcpy(m_nodes, oldNodes, m_nodeCount * sizeof(b2TreeNode));\n\t\tb2Free(oldNodes);\n\n\t\t// Build a linked list for the free list. The parent\n\t\t// pointer becomes the \"next\" pointer.\n\t\tfor (int32 i = m_nodeCount; i < m_nodeCapacity - 1; ++i)\n\t\t{\n\t\t\tm_nodes[i].next = i + 1;\n\t\t\tm_nodes[i].height = -1;\n\t\t}\n\t\tm_nodes[m_nodeCapacity-1].next = b2_nullNode;\n\t\tm_nodes[m_nodeCapacity-1].height = -1;\n\t\tm_freeList = m_nodeCount;\n\t}\n\n\t// Peel a node off the free list.\n\tint32 nodeId = m_freeList;\n\tm_freeList = m_nodes[nodeId].next;\n\tm_nodes[nodeId].parent = b2_nullNode;\n\tm_nodes[nodeId].child1 = b2_nullNode;\n\tm_nodes[nodeId].child2 = b2_nullNode;\n\tm_nodes[nodeId].height = 0;\n\tm_nodes[nodeId].userData = NULL;\n\t++m_nodeCount;\n\treturn nodeId;\n}\n\n// Return a node to the pool.\nvoid b2DynamicTree::FreeNode(int32 nodeId)\n{\n\tb2Assert(0 <= nodeId && nodeId < m_nodeCapacity);\n\tb2Assert(0 < m_nodeCount);\n\tm_nodes[nodeId].next = m_freeList;\n\tm_nodes[nodeId].height = -1;\n\tm_freeList = nodeId;\n\t--m_nodeCount;\n}\n\n// Create a proxy in the tree as a leaf node. We return the index\n// of the node instead of a pointer so that we can grow\n// the node pool.\nint32 b2DynamicTree::CreateProxy(const b2AABB& aabb, void* userData)\n{\n\tint32 proxyId = AllocateNode();\n\n\t// Fatten the aabb.\n\tb2Vec2 r(b2_aabbExtension, b2_aabbExtension);\n\tm_nodes[proxyId].aabb.lowerBound = aabb.lowerBound - r;\n\tm_nodes[proxyId].aabb.upperBound = aabb.upperBound + r;\n\tm_nodes[proxyId].userData = userData;\n\tm_nodes[proxyId].height = 0;\n\n\tInsertLeaf(proxyId);\n\n\treturn proxyId;\n}\n\nvoid b2DynamicTree::DestroyProxy(int32 proxyId)\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\tb2Assert(m_nodes[proxyId].IsLeaf());\n\n\tRemoveLeaf(proxyId);\n\tFreeNode(proxyId);\n}\n\nbool b2DynamicTree::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement)\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\n\tb2Assert(m_nodes[proxyId].IsLeaf());\n\n\tif (m_nodes[proxyId].aabb.Contains(aabb))\n\t{\n\t\treturn false;\n\t}\n\n\tRemoveLeaf(proxyId);\n\n\t// Extend AABB.\n\tb2AABB b = aabb;\n\tb2Vec2 r(b2_aabbExtension, b2_aabbExtension);\n\tb.lowerBound = b.lowerBound - r;\n\tb.upperBound = b.upperBound + r;\n\n\t// Predict AABB displacement.\n\tb2Vec2 d = b2_aabbMultiplier * displacement;\n\n\tif (d.x < 0.0f)\n\t{\n\t\tb.lowerBound.x += d.x;\n\t}\n\telse\n\t{\n\t\tb.upperBound.x += d.x;\n\t}\n\n\tif (d.y < 0.0f)\n\t{\n\t\tb.lowerBound.y += d.y;\n\t}\n\telse\n\t{\n\t\tb.upperBound.y += d.y;\n\t}\n\n\tm_nodes[proxyId].aabb = b;\n\n\tInsertLeaf(proxyId);\n\treturn true;\n}\n\nvoid b2DynamicTree::InsertLeaf(int32 leaf)\n{\n\t++m_insertionCount;\n\n\tif (m_root == b2_nullNode)\n\t{\n\t\tm_root = leaf;\n\t\tm_nodes[m_root].parent = b2_nullNode;\n\t\treturn;\n\t}\n\n\t// Find the best sibling for this node\n\tb2AABB leafAABB = m_nodes[leaf].aabb;\n\tint32 index = m_root;\n\twhile (m_nodes[index].IsLeaf() == false)\n\t{\n\t\tint32 child1 = m_nodes[index].child1;\n\t\tint32 child2 = m_nodes[index].child2;\n\n\t\tfloat32 area = m_nodes[index].aabb.GetPerimeter();\n\n\t\tb2AABB combinedAABB;\n\t\tcombinedAABB.Combine(m_nodes[index].aabb, leafAABB);\n\t\tfloat32 combinedArea = combinedAABB.GetPerimeter();\n\n\t\t// Cost of creating a new parent for this node and the new leaf\n\t\tfloat32 cost = 2.0f * combinedArea;\n\n\t\t// Minimum cost of pushing the leaf further down the tree\n\t\tfloat32 inheritanceCost = 2.0f * (combinedArea - area);\n\n\t\t// Cost of descending into child1\n\t\tfloat32 cost1;\n\t\tif (m_nodes[child1].IsLeaf())\n\t\t{\n\t\t\tb2AABB aabb;\n\t\t\taabb.Combine(leafAABB, m_nodes[child1].aabb);\n\t\t\tcost1 = aabb.GetPerimeter() + inheritanceCost;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tb2AABB aabb;\n\t\t\taabb.Combine(leafAABB, m_nodes[child1].aabb);\n\t\t\tfloat32 oldArea = m_nodes[child1].aabb.GetPerimeter();\n\t\t\tfloat32 newArea = aabb.GetPerimeter();\n\t\t\tcost1 = (newArea - oldArea) + inheritanceCost;\n\t\t}\n\n\t\t// Cost of descending into child2\n\t\tfloat32 cost2;\n\t\tif (m_nodes[child2].IsLeaf())\n\t\t{\n\t\t\tb2AABB aabb;\n\t\t\taabb.Combine(leafAABB, m_nodes[child2].aabb);\n\t\t\tcost2 = aabb.GetPerimeter() + inheritanceCost;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tb2AABB aabb;\n\t\t\taabb.Combine(leafAABB, m_nodes[child2].aabb);\n\t\t\tfloat32 oldArea = m_nodes[child2].aabb.GetPerimeter();\n\t\t\tfloat32 newArea = aabb.GetPerimeter();\n\t\t\tcost2 = newArea - oldArea + inheritanceCost;\n\t\t}\n\n\t\t// Descend according to the minimum cost.\n\t\tif (cost < cost1 && cost < cost2)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t// Descend\n\t\tif (cost1 < cost2)\n\t\t{\n\t\t\tindex = child1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tindex = child2;\n\t\t}\n\t}\n\n\tint32 sibling = index;\n\n\t// Create a new parent.\n\tint32 oldParent = m_nodes[sibling].parent;\n\tint32 newParent = AllocateNode();\n\tm_nodes[newParent].parent = oldParent;\n\tm_nodes[newParent].userData = NULL;\n\tm_nodes[newParent].aabb.Combine(leafAABB, m_nodes[sibling].aabb);\n\tm_nodes[newParent].height = m_nodes[sibling].height + 1;\n\n\tif (oldParent != b2_nullNode)\n\t{\n\t\t// The sibling was not the root.\n\t\tif (m_nodes[oldParent].child1 == sibling)\n\t\t{\n\t\t\tm_nodes[oldParent].child1 = newParent;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_nodes[oldParent].child2 = newParent;\n\t\t}\n\n\t\tm_nodes[newParent].child1 = sibling;\n\t\tm_nodes[newParent].child2 = leaf;\n\t\tm_nodes[sibling].parent = newParent;\n\t\tm_nodes[leaf].parent = newParent;\n\t}\n\telse\n\t{\n\t\t// The sibling was the root.\n\t\tm_nodes[newParent].child1 = sibling;\n\t\tm_nodes[newParent].child2 = leaf;\n\t\tm_nodes[sibling].parent = newParent;\n\t\tm_nodes[leaf].parent = newParent;\n\t\tm_root = newParent;\n\t}\n\n\t// Walk back up the tree fixing heights and AABBs\n\tindex = m_nodes[leaf].parent;\n\twhile (index != b2_nullNode)\n\t{\n\t\tindex = Balance(index);\n\n\t\tint32 child1 = m_nodes[index].child1;\n\t\tint32 child2 = m_nodes[index].child2;\n\n\t\tb2Assert(child1 != b2_nullNode);\n\t\tb2Assert(child2 != b2_nullNode);\n\n\t\tm_nodes[index].height = 1 + b2Max(m_nodes[child1].height, m_nodes[child2].height);\n\t\tm_nodes[index].aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb);\n\n\t\tindex = m_nodes[index].parent;\n\t}\n\n\t//Validate();\n}\n\nvoid b2DynamicTree::RemoveLeaf(int32 leaf)\n{\n\tif (leaf == m_root)\n\t{\n\t\tm_root = b2_nullNode;\n\t\treturn;\n\t}\n\n\tint32 parent = m_nodes[leaf].parent;\n\tint32 grandParent = m_nodes[parent].parent;\n\tint32 sibling;\n\tif (m_nodes[parent].child1 == leaf)\n\t{\n\t\tsibling = m_nodes[parent].child2;\n\t}\n\telse\n\t{\n\t\tsibling = m_nodes[parent].child1;\n\t}\n\n\tif (grandParent != b2_nullNode)\n\t{\n\t\t// Destroy parent and connect sibling to grandParent.\n\t\tif (m_nodes[grandParent].child1 == parent)\n\t\t{\n\t\t\tm_nodes[grandParent].child1 = sibling;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_nodes[grandParent].child2 = sibling;\n\t\t}\n\t\tm_nodes[sibling].parent = grandParent;\n\t\tFreeNode(parent);\n\n\t\t// Adjust ancestor bounds.\n\t\tint32 index = grandParent;\n\t\twhile (index != b2_nullNode)\n\t\t{\n\t\t\tindex = Balance(index);\n\n\t\t\tint32 child1 = m_nodes[index].child1;\n\t\t\tint32 child2 = m_nodes[index].child2;\n\n\t\t\tm_nodes[index].aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb);\n\t\t\tm_nodes[index].height = 1 + b2Max(m_nodes[child1].height, m_nodes[child2].height);\n\n\t\t\tindex = m_nodes[index].parent;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_root = sibling;\n\t\tm_nodes[sibling].parent = b2_nullNode;\n\t\tFreeNode(parent);\n\t}\n\n\t//Validate();\n}\n\n// Perform a left or right rotation if node A is imbalanced.\n// Returns the new root index.\nint32 b2DynamicTree::Balance(int32 iA)\n{\n\tb2Assert(iA != b2_nullNode);\n\n\tb2TreeNode* A = m_nodes + iA;\n\tif (A->IsLeaf() || A->height < 2)\n\t{\n\t\treturn iA;\n\t}\n\n\tint32 iB = A->child1;\n\tint32 iC = A->child2;\n\tb2Assert(0 <= iB && iB < m_nodeCapacity);\n\tb2Assert(0 <= iC && iC < m_nodeCapacity);\n\n\tb2TreeNode* B = m_nodes + iB;\n\tb2TreeNode* C = m_nodes + iC;\n\n\tint32 balance = C->height - B->height;\n\n\t// Rotate C up\n\tif (balance > 1)\n\t{\n\t\tint32 iF = C->child1;\n\t\tint32 iG = C->child2;\n\t\tb2TreeNode* F = m_nodes + iF;\n\t\tb2TreeNode* G = m_nodes + iG;\n\t\tb2Assert(0 <= iF && iF < m_nodeCapacity);\n\t\tb2Assert(0 <= iG && iG < m_nodeCapacity);\n\n\t\t// Swap A and C\n\t\tC->child1 = iA;\n\t\tC->parent = A->parent;\n\t\tA->parent = iC;\n\n\t\t// A's old parent should point to C\n\t\tif (C->parent != b2_nullNode)\n\t\t{\n\t\t\tif (m_nodes[C->parent].child1 == iA)\n\t\t\t{\n\t\t\t\tm_nodes[C->parent].child1 = iC;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tb2Assert(m_nodes[C->parent].child2 == iA);\n\t\t\t\tm_nodes[C->parent].child2 = iC;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_root = iC;\n\t\t}\n\n\t\t// Rotate\n\t\tif (F->height > G->height)\n\t\t{\n\t\t\tC->child2 = iF;\n\t\t\tA->child2 = iG;\n\t\t\tG->parent = iA;\n\t\t\tA->aabb.Combine(B->aabb, G->aabb);\n\t\t\tC->aabb.Combine(A->aabb, F->aabb);\n\n\t\t\tA->height = 1 + b2Max(B->height, G->height);\n\t\t\tC->height = 1 + b2Max(A->height, F->height);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tC->child2 = iG;\n\t\t\tA->child2 = iF;\n\t\t\tF->parent = iA;\n\t\t\tA->aabb.Combine(B->aabb, F->aabb);\n\t\t\tC->aabb.Combine(A->aabb, G->aabb);\n\n\t\t\tA->height = 1 + b2Max(B->height, F->height);\n\t\t\tC->height = 1 + b2Max(A->height, G->height);\n\t\t}\n\n\t\treturn iC;\n\t}\n\n\t// Rotate B up\n\tif (balance < -1)\n\t{\n\t\tint32 iD = B->child1;\n\t\tint32 iE = B->child2;\n\t\tb2TreeNode* D = m_nodes + iD;\n\t\tb2TreeNode* E = m_nodes + iE;\n\t\tb2Assert(0 <= iD && iD < m_nodeCapacity);\n\t\tb2Assert(0 <= iE && iE < m_nodeCapacity);\n\n\t\t// Swap A and B\n\t\tB->child1 = iA;\n\t\tB->parent = A->parent;\n\t\tA->parent = iB;\n\n\t\t// A's old parent should point to B\n\t\tif (B->parent != b2_nullNode)\n\t\t{\n\t\t\tif (m_nodes[B->parent].child1 == iA)\n\t\t\t{\n\t\t\t\tm_nodes[B->parent].child1 = iB;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tb2Assert(m_nodes[B->parent].child2 == iA);\n\t\t\t\tm_nodes[B->parent].child2 = iB;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_root = iB;\n\t\t}\n\n\t\t// Rotate\n\t\tif (D->height > E->height)\n\t\t{\n\t\t\tB->child2 = iD;\n\t\t\tA->child1 = iE;\n\t\t\tE->parent = iA;\n\t\t\tA->aabb.Combine(C->aabb, E->aabb);\n\t\t\tB->aabb.Combine(A->aabb, D->aabb);\n\n\t\t\tA->height = 1 + b2Max(C->height, E->height);\n\t\t\tB->height = 1 + b2Max(A->height, D->height);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tB->child2 = iE;\n\t\t\tA->child1 = iD;\n\t\t\tD->parent = iA;\n\t\t\tA->aabb.Combine(C->aabb, D->aabb);\n\t\t\tB->aabb.Combine(A->aabb, E->aabb);\n\n\t\t\tA->height = 1 + b2Max(C->height, D->height);\n\t\t\tB->height = 1 + b2Max(A->height, E->height);\n\t\t}\n\n\t\treturn iB;\n\t}\n\n\treturn iA;\n}\n\nint32 b2DynamicTree::GetHeight() const\n{\n\tif (m_root == b2_nullNode)\n\t{\n\t\treturn 0;\n\t}\n\n\treturn m_nodes[m_root].height;\n}\n\n//\nfloat32 b2DynamicTree::GetAreaRatio() const\n{\n\tif (m_root == b2_nullNode)\n\t{\n\t\treturn 0.0f;\n\t}\n\n\tconst b2TreeNode* root = m_nodes + m_root;\n\tfloat32 rootArea = root->aabb.GetPerimeter();\n\n\tfloat32 totalArea = 0.0f;\n\tfor (int32 i = 0; i < m_nodeCapacity; ++i)\n\t{\n\t\tconst b2TreeNode* node = m_nodes + i;\n\t\tif (node->height < 0)\n\t\t{\n\t\t\t// Free node in pool\n\t\t\tcontinue;\n\t\t}\n\n\t\ttotalArea += node->aabb.GetPerimeter();\n\t}\n\n\treturn totalArea / rootArea;\n}\n\n// Compute the height of a sub-tree.\nint32 b2DynamicTree::ComputeHeight(int32 nodeId) const\n{\n\tb2Assert(0 <= nodeId && nodeId < m_nodeCapacity);\n\tb2TreeNode* node = m_nodes + nodeId;\n\n\tif (node->IsLeaf())\n\t{\n\t\treturn 0;\n\t}\n\n\tint32 height1 = ComputeHeight(node->child1);\n\tint32 height2 = ComputeHeight(node->child2);\n\treturn 1 + b2Max(height1, height2);\n}\n\nint32 b2DynamicTree::ComputeHeight() const\n{\n\tint32 height = ComputeHeight(m_root);\n\treturn height;\n}\n\nvoid b2DynamicTree::ValidateStructure(int32 index) const\n{\n\tif (index == b2_nullNode)\n\t{\n\t\treturn;\n\t}\n\n\tif (index == m_root)\n\t{\n\t\tb2Assert(m_nodes[index].parent == b2_nullNode);\n\t}\n\n\tconst b2TreeNode* node = m_nodes + index;\n\n\tint32 child1 = node->child1;\n\tint32 child2 = node->child2;\n\n\tif (node->IsLeaf())\n\t{\n\t\tb2Assert(child1 == b2_nullNode);\n\t\tb2Assert(child2 == b2_nullNode);\n\t\tb2Assert(node->height == 0);\n\t\treturn;\n\t}\n\n\tb2Assert(0 <= child1 && child1 < m_nodeCapacity);\n\tb2Assert(0 <= child2 && child2 < m_nodeCapacity);\n\n\tb2Assert(m_nodes[child1].parent == index);\n\tb2Assert(m_nodes[child2].parent == index);\n\n\tValidateStructure(child1);\n\tValidateStructure(child2);\n}\n\nvoid b2DynamicTree::ValidateMetrics(int32 index) const\n{\n\tif (index == b2_nullNode)\n\t{\n\t\treturn;\n\t}\n\n\tconst b2TreeNode* node = m_nodes + index;\n\n\tint32 child1 = node->child1;\n\tint32 child2 = node->child2;\n\n\tif (node->IsLeaf())\n\t{\n\t\tb2Assert(child1 == b2_nullNode);\n\t\tb2Assert(child2 == b2_nullNode);\n\t\tb2Assert(node->height == 0);\n\t\treturn;\n\t}\n\n\tb2Assert(0 <= child1 && child1 < m_nodeCapacity);\n\tb2Assert(0 <= child2 && child2 < m_nodeCapacity);\n\n\tint32 height1 = m_nodes[child1].height;\n\tint32 height2 = m_nodes[child2].height;\n\tint32 height;\n\theight = 1 + b2Max(height1, height2);\n\tb2Assert(node->height == height);\n\n\tb2AABB aabb;\n\taabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb);\n\n\tb2Assert(aabb.lowerBound == node->aabb.lowerBound);\n\tb2Assert(aabb.upperBound == node->aabb.upperBound);\n\n\tValidateMetrics(child1);\n\tValidateMetrics(child2);\n}\n\nvoid b2DynamicTree::Validate() const\n{\n\tValidateStructure(m_root);\n\tValidateMetrics(m_root);\n\n\tint32 freeCount = 0;\n\tint32 freeIndex = m_freeList;\n\twhile (freeIndex != b2_nullNode)\n\t{\n\t\tb2Assert(0 <= freeIndex && freeIndex < m_nodeCapacity);\n\t\tfreeIndex = m_nodes[freeIndex].next;\n\t\t++freeCount;\n\t}\n\n\tb2Assert(GetHeight() == ComputeHeight());\n\n\tb2Assert(m_nodeCount + freeCount == m_nodeCapacity);\n}\n\nint32 b2DynamicTree::GetMaxBalance() const\n{\n\tint32 maxBalance = 0;\n\tfor (int32 i = 0; i < m_nodeCapacity; ++i)\n\t{\n\t\tconst b2TreeNode* node = m_nodes + i;\n\t\tif (node->height <= 1)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2Assert(node->IsLeaf() == false);\n\n\t\tint32 child1 = node->child1;\n\t\tint32 child2 = node->child2;\n\t\tint32 balance = b2Abs(m_nodes[child2].height - m_nodes[child1].height);\n\t\tmaxBalance = b2Max(maxBalance, balance);\n\t}\n\n\treturn maxBalance;\n}\n\nvoid b2DynamicTree::RebuildBottomUp()\n{\n\tint32* nodes = (int32*)b2Alloc(m_nodeCount * sizeof(int32));\n\tint32 count = 0;\n\n\t// Build array of leaves. Free the rest.\n\tfor (int32 i = 0; i < m_nodeCapacity; ++i)\n\t{\n\t\tif (m_nodes[i].height < 0)\n\t\t{\n\t\t\t// free node in pool\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (m_nodes[i].IsLeaf())\n\t\t{\n\t\t\tm_nodes[i].parent = b2_nullNode;\n\t\t\tnodes[count] = i;\n\t\t\t++count;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFreeNode(i);\n\t\t}\n\t}\n\n\twhile (count > 1)\n\t{\n\t\tfloat32 minCost = b2_maxFloat;\n\t\tint32 iMin = -1, jMin = -1;\n\t\tfor (int32 i = 0; i < count; ++i)\n\t\t{\n\t\t\tb2AABB aabbi = m_nodes[nodes[i]].aabb;\n\n\t\t\tfor (int32 j = i + 1; j < count; ++j)\n\t\t\t{\n\t\t\t\tb2AABB aabbj = m_nodes[nodes[j]].aabb;\n\t\t\t\tb2AABB b;\n\t\t\t\tb.Combine(aabbi, aabbj);\n\t\t\t\tfloat32 cost = b.GetPerimeter();\n\t\t\t\tif (cost < minCost)\n\t\t\t\t{\n\t\t\t\t\tiMin = i;\n\t\t\t\t\tjMin = j;\n\t\t\t\t\tminCost = cost;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tint32 index1 = nodes[iMin];\n\t\tint32 index2 = nodes[jMin];\n\t\tb2TreeNode* child1 = m_nodes + index1;\n\t\tb2TreeNode* child2 = m_nodes + index2;\n\n\t\tint32 parentIndex = AllocateNode();\n\t\tb2TreeNode* parent = m_nodes + parentIndex;\n\t\tparent->child1 = index1;\n\t\tparent->child2 = index2;\n\t\tparent->height = 1 + b2Max(child1->height, child2->height);\n\t\tparent->aabb.Combine(child1->aabb, child2->aabb);\n\t\tparent->parent = b2_nullNode;\n\n\t\tchild1->parent = parentIndex;\n\t\tchild2->parent = parentIndex;\n\n\t\tnodes[jMin] = nodes[count-1];\n\t\tnodes[iMin] = parentIndex;\n\t\t--count;\n\t}\n\n\tm_root = nodes[0];\n\tb2Free(nodes);\n\n\tValidate();\n}\n\nvoid b2DynamicTree::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\t// Build array of leaves. Free the rest.\n\tfor (int32 i = 0; i < m_nodeCapacity; ++i)\n\t{\n\t\tm_nodes[i].aabb.lowerBound -= newOrigin;\n\t\tm_nodes[i].aabb.upperBound -= newOrigin;\n\t}\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2EdgeAndCircleContact.cpp",
    "content": "/*\n* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n\n#include <new>\n\nb2Contact* b2EdgeAndCircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2EdgeAndCircleContact));\n\treturn new (mem) b2EdgeAndCircleContact(fixtureA, fixtureB);\n}\n\nvoid b2EdgeAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2EdgeAndCircleContact*)contact)->~b2EdgeAndCircleContact();\n\tallocator->Free(contact, sizeof(b2EdgeAndCircleContact));\n}\n\nb2EdgeAndCircleContact::b2EdgeAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_edge);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_circle);\n}\n\nvoid b2EdgeAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollideEdgeAndCircle(\tmanifold,\n\t\t\t\t\t\t\t\t(b2EdgeShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t\t\t\t(b2CircleShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2EdgeAndPolygonContact.cpp",
    "content": "/*\n* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n\n#include <new>\n\nb2Contact* b2EdgeAndPolygonContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2EdgeAndPolygonContact));\n\treturn new (mem) b2EdgeAndPolygonContact(fixtureA, fixtureB);\n}\n\nvoid b2EdgeAndPolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2EdgeAndPolygonContact*)contact)->~b2EdgeAndPolygonContact();\n\tallocator->Free(contact, sizeof(b2EdgeAndPolygonContact));\n}\n\nb2EdgeAndPolygonContact::b2EdgeAndPolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_edge);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_polygon);\n}\n\nvoid b2EdgeAndPolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollideEdgeAndPolygon(\tmanifold,\n\t\t\t\t\t\t\t\t(b2EdgeShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t\t\t\t(b2PolygonShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2EdgeShape.cpp",
    "content": "/*\n* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\"\n#include <new>\n\nvoid b2EdgeShape::Set(const b2Vec2& v1, const b2Vec2& v2)\n{\n\tm_vertex1 = v1;\n\tm_vertex2 = v2;\n\tm_hasVertex0 = false;\n\tm_hasVertex3 = false;\n}\n\nb2Shape* b2EdgeShape::Clone(b2BlockAllocator* allocator) const\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2EdgeShape));\n\tb2EdgeShape* clone = new (mem) b2EdgeShape;\n\t*clone = *this;\n\treturn clone;\n}\n\nint32 b2EdgeShape::GetChildCount() const\n{\n\treturn 1;\n}\n\nbool b2EdgeShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const\n{\n\tB2_NOT_USED(xf);\n\tB2_NOT_USED(p);\n\treturn false;\n}\n\n// p = p1 + t * d\n// v = v1 + s * e\n// p1 + t * d = v1 + s * e\n// s * e - t * d = p1 - v1\nbool b2EdgeShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\t\tconst b2Transform& xf, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\t// Put the ray into the edge's frame of reference.\n\tb2Vec2 p1 = b2MulT(xf.q, input.p1 - xf.p);\n\tb2Vec2 p2 = b2MulT(xf.q, input.p2 - xf.p);\n\tb2Vec2 d = p2 - p1;\n\n\tb2Vec2 v1 = m_vertex1;\n\tb2Vec2 v2 = m_vertex2;\n\tb2Vec2 e = v2 - v1;\n\tb2Vec2 normal(e.y, -e.x);\n\tnormal.Normalize();\n\n\t// q = p1 + t * d\n\t// dot(normal, q - v1) = 0\n\t// dot(normal, p1 - v1) + t * dot(normal, d) = 0\n\tfloat32 numerator = b2Dot(normal, v1 - p1);\n\tfloat32 denominator = b2Dot(normal, d);\n\n\tif (denominator == 0.0f)\n\t{\n\t\treturn false;\n\t}\n\n\tfloat32 t = numerator / denominator;\n\tif (t < 0.0f || input.maxFraction < t)\n\t{\n\t\treturn false;\n\t}\n\n\tb2Vec2 q = p1 + t * d;\n\n\t// q = v1 + s * r\n\t// s = dot(q - v1, r) / dot(r, r)\n\tb2Vec2 r = v2 - v1;\n\tfloat32 rr = b2Dot(r, r);\n\tif (rr == 0.0f)\n\t{\n\t\treturn false;\n\t}\n\n\tfloat32 s = b2Dot(q - v1, r) / rr;\n\tif (s < 0.0f || 1.0f < s)\n\t{\n\t\treturn false;\n\t}\n\n\toutput->fraction = t;\n\tif (numerator > 0.0f)\n\t{\n\t\toutput->normal = -b2Mul(xf.q, normal);\n\t}\n\telse\n\t{\n\t\toutput->normal = b2Mul(xf.q, normal);\n\t}\n\treturn true;\n}\n\nvoid b2EdgeShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\tb2Vec2 v1 = b2Mul(xf, m_vertex1);\n\tb2Vec2 v2 = b2Mul(xf, m_vertex2);\n\n\tb2Vec2 lower = b2Min(v1, v2);\n\tb2Vec2 upper = b2Max(v1, v2);\n\n\tb2Vec2 r(m_radius, m_radius);\n\taabb->lowerBound = lower - r;\n\taabb->upperBound = upper + r;\n}\n\nvoid b2EdgeShape::ComputeMass(b2MassData* massData, float32 density) const\n{\n\tB2_NOT_USED(density);\n\n\tmassData->mass = 0.0f;\n\tmassData->center = 0.5f * (m_vertex1 + m_vertex2);\n\tmassData->I = 0.0f;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Fixture.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2World.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2BroadPhase.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2Collision.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n\nb2Fixture::b2Fixture()\n{\n\tm_userData = NULL;\n\tm_body = NULL;\n\tm_next = NULL;\n\tm_proxies = NULL;\n\tm_proxyCount = 0;\n\tm_shape = NULL;\n\tm_density = 0.0f;\n}\n\nvoid b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def)\n{\n\tm_userData = def->userData;\n\tm_friction = def->friction;\n\tm_restitution = def->restitution;\n\n\tm_body = body;\n\tm_next = NULL;\n\n\tm_filter = def->filter;\n\n\tm_isSensor = def->isSensor;\n\n\tm_shape = def->shape->Clone(allocator);\n\n\t// Reserve proxy space\n\tint32 childCount = m_shape->GetChildCount();\n\tm_proxies = (b2FixtureProxy*)allocator->Allocate(childCount * sizeof(b2FixtureProxy));\n\tfor (int32 i = 0; i < childCount; ++i)\n\t{\n\t\tm_proxies[i].fixture = NULL;\n\t\tm_proxies[i].proxyId = b2BroadPhase::e_nullProxy;\n\t}\n\tm_proxyCount = 0;\n\n\tm_density = def->density;\n}\n\nvoid b2Fixture::Destroy(b2BlockAllocator* allocator)\n{\n\t// The proxies must be destroyed before calling this.\n\tb2Assert(m_proxyCount == 0);\n\n\t// Free the proxy array.\n\tint32 childCount = m_shape->GetChildCount();\n\tallocator->Free(m_proxies, childCount * sizeof(b2FixtureProxy));\n\tm_proxies = NULL;\n\n\t// Free the child shape.\n\tswitch (m_shape->m_type)\n\t{\n\tcase b2Shape::e_circle:\n\t\t{\n\t\t\tb2CircleShape* s = (b2CircleShape*)m_shape;\n\t\t\ts->~b2CircleShape();\n\t\t\tallocator->Free(s, sizeof(b2CircleShape));\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_edge:\n\t\t{\n\t\t\tb2EdgeShape* s = (b2EdgeShape*)m_shape;\n\t\t\ts->~b2EdgeShape();\n\t\t\tallocator->Free(s, sizeof(b2EdgeShape));\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_polygon:\n\t\t{\n\t\t\tb2PolygonShape* s = (b2PolygonShape*)m_shape;\n\t\t\ts->~b2PolygonShape();\n\t\t\tallocator->Free(s, sizeof(b2PolygonShape));\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_chain:\n\t\t{\n\t\t\tb2ChainShape* s = (b2ChainShape*)m_shape;\n\t\t\ts->~b2ChainShape();\n\t\t\tallocator->Free(s, sizeof(b2ChainShape));\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tb2Assert(false);\n\t\tbreak;\n\t}\n\n\tm_shape = NULL;\n}\n\nvoid b2Fixture::CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf)\n{\n\tb2Assert(m_proxyCount == 0);\n\n\t// Create proxies in the broad-phase.\n\tm_proxyCount = m_shape->GetChildCount();\n\n\tfor (int32 i = 0; i < m_proxyCount; ++i)\n\t{\n\t\tb2FixtureProxy* proxy = m_proxies + i;\n\t\tm_shape->ComputeAABB(&proxy->aabb, xf, i);\n\t\tproxy->proxyId = broadPhase->CreateProxy(proxy->aabb, proxy);\n\t\tproxy->fixture = this;\n\t\tproxy->childIndex = i;\n\t}\n}\n\nvoid b2Fixture::DestroyProxies(b2BroadPhase* broadPhase)\n{\n\t// Destroy proxies in the broad-phase.\n\tfor (int32 i = 0; i < m_proxyCount; ++i)\n\t{\n\t\tb2FixtureProxy* proxy = m_proxies + i;\n\t\tbroadPhase->DestroyProxy(proxy->proxyId);\n\t\tproxy->proxyId = b2BroadPhase::e_nullProxy;\n\t}\n\n\tm_proxyCount = 0;\n}\n\nvoid b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2)\n{\n\tif (m_proxyCount == 0)\n\t{\n\t\treturn;\n\t}\n\n\tfor (int32 i = 0; i < m_proxyCount; ++i)\n\t{\n\t\tb2FixtureProxy* proxy = m_proxies + i;\n\n\t\t// Compute an AABB that covers the swept shape (may miss some rotation effect).\n\t\tb2AABB aabb1, aabb2;\n\t\tm_shape->ComputeAABB(&aabb1, transform1, proxy->childIndex);\n\t\tm_shape->ComputeAABB(&aabb2, transform2, proxy->childIndex);\n\n\t\tproxy->aabb.Combine(aabb1, aabb2);\n\n\t\tb2Vec2 displacement = transform2.p - transform1.p;\n\n\t\tbroadPhase->MoveProxy(proxy->proxyId, proxy->aabb, displacement);\n\t}\n}\n\nvoid b2Fixture::SetFilterData(const b2Filter& filter)\n{\n\tm_filter = filter;\n\n\tRefilter();\n}\n\nvoid b2Fixture::Refilter()\n{\n\tif (m_body == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t// Flag associated contacts for filtering.\n\tb2ContactEdge* edge = m_body->GetContactList();\n\twhile (edge)\n\t{\n\t\tb2Contact* contact = edge->contact;\n\t\tb2Fixture* fixtureA = contact->GetFixtureA();\n\t\tb2Fixture* fixtureB = contact->GetFixtureB();\n\t\tif (fixtureA == this || fixtureB == this)\n\t\t{\n\t\t\tcontact->FlagForFiltering();\n\t\t}\n\n\t\tedge = edge->next;\n\t}\n\n\tb2World* world = m_body->GetWorld();\n\n\tif (world == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t// Touch each proxy so that new pairs may be created\n\tb2BroadPhase* broadPhase = &world->m_contactManager.m_broadPhase;\n\tfor (int32 i = 0; i < m_proxyCount; ++i)\n\t{\n\t\tbroadPhase->TouchProxy(m_proxies[i].proxyId);\n\t}\n}\n\nvoid b2Fixture::SetSensor(bool sensor)\n{\n\tif (sensor != m_isSensor)\n\t{\n\t\tm_body->SetAwake(true);\n\t\tm_isSensor = sensor;\n\t}\n}\n\nvoid b2Fixture::Dump(int32 bodyIndex)\n{\n\tb2Log(\"    b2FixtureDef fd;\\n\");\n\tb2Log(\"    fd.friction = %.15lef;\\n\", m_friction);\n\tb2Log(\"    fd.restitution = %.15lef;\\n\", m_restitution);\n\tb2Log(\"    fd.density = %.15lef;\\n\", m_density);\n\tb2Log(\"    fd.isSensor = bool(%d);\\n\", m_isSensor);\n\tb2Log(\"    fd.filter.categoryBits = uint16(%d);\\n\", m_filter.categoryBits);\n\tb2Log(\"    fd.filter.maskBits = uint16(%d);\\n\", m_filter.maskBits);\n\tb2Log(\"    fd.filter.groupIndex = int16(%d);\\n\", m_filter.groupIndex);\n\n\tswitch (m_shape->m_type)\n\t{\n\tcase b2Shape::e_circle:\n\t\t{\n\t\t\tb2CircleShape* s = (b2CircleShape*)m_shape;\n\t\t\tb2Log(\"    b2CircleShape shape;\\n\");\n\t\t\tb2Log(\"    shape.m_radius = %.15lef;\\n\", s->m_radius);\n\t\t\tb2Log(\"    shape.m_p.Set(%.15lef, %.15lef);\\n\", s->m_p.x, s->m_p.y);\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_edge:\n\t\t{\n\t\t\tb2EdgeShape* s = (b2EdgeShape*)m_shape;\n\t\t\tb2Log(\"    b2EdgeShape shape;\\n\");\n\t\t\tb2Log(\"    shape.m_radius = %.15lef;\\n\", s->m_radius);\n\t\t\tb2Log(\"    shape.m_vertex0.Set(%.15lef, %.15lef);\\n\", s->m_vertex0.x, s->m_vertex0.y);\n\t\t\tb2Log(\"    shape.m_vertex1.Set(%.15lef, %.15lef);\\n\", s->m_vertex1.x, s->m_vertex1.y);\n\t\t\tb2Log(\"    shape.m_vertex2.Set(%.15lef, %.15lef);\\n\", s->m_vertex2.x, s->m_vertex2.y);\n\t\t\tb2Log(\"    shape.m_vertex3.Set(%.15lef, %.15lef);\\n\", s->m_vertex3.x, s->m_vertex3.y);\n\t\t\tb2Log(\"    shape.m_hasVertex0 = bool(%d);\\n\", s->m_hasVertex0);\n\t\t\tb2Log(\"    shape.m_hasVertex3 = bool(%d);\\n\", s->m_hasVertex3);\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_polygon:\n\t\t{\n\t\t\tb2PolygonShape* s = (b2PolygonShape*)m_shape;\n\t\t\tb2Log(\"    b2PolygonShape shape;\\n\");\n\t\t\tb2Log(\"    b2Vec2 vs[%d];\\n\", b2_maxPolygonVertices);\n\t\t\tfor (int32 i = 0; i < s->m_count; ++i)\n\t\t\t{\n\t\t\t\tb2Log(\"    vs[%d].Set(%.15lef, %.15lef);\\n\", i, s->m_vertices[i].x, s->m_vertices[i].y);\n\t\t\t}\n\t\t\tb2Log(\"    shape.Set(vs, %d);\\n\", s->m_count);\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_chain:\n\t\t{\n\t\t\tb2ChainShape* s = (b2ChainShape*)m_shape;\n\t\t\tb2Log(\"    b2ChainShape shape;\\n\");\n\t\t\tb2Log(\"    b2Vec2 vs[%d];\\n\", s->m_count);\n\t\t\tfor (int32 i = 0; i < s->m_count; ++i)\n\t\t\t{\n\t\t\t\tb2Log(\"    vs[%d].Set(%.15lef, %.15lef);\\n\", i, s->m_vertices[i].x, s->m_vertices[i].y);\n\t\t\t}\n\t\t\tb2Log(\"    shape.CreateChain(vs, %d);\\n\", s->m_count);\n\t\t\tb2Log(\"    shape.m_prevVertex.Set(%.15lef, %.15lef);\\n\", s->m_prevVertex.x, s->m_prevVertex.y);\n\t\t\tb2Log(\"    shape.m_nextVertex.Set(%.15lef, %.15lef);\\n\", s->m_nextVertex.x, s->m_nextVertex.y);\n\t\t\tb2Log(\"    shape.m_hasPrevVertex = bool(%d);\\n\", s->m_hasPrevVertex);\n\t\t\tb2Log(\"    shape.m_hasNextVertex = bool(%d);\\n\", s->m_hasNextVertex);\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\treturn;\n\t}\n\n\tb2Log(\"\\n\");\n\tb2Log(\"    fd.shape = &shape;\\n\");\n\tb2Log(\"\\n\");\n\tb2Log(\"    bodies[%d]->CreateFixture(&fd);\\n\", bodyIndex);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2FrictionJoint.cpp",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2FrictionJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// Point-to-point constraint\n// Cdot = v2 - v1\n//      = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n// J = [-I -r1_skew I r2_skew ]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n\n// Angle constraint\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n// K = invI1 + invI2\n\nvoid b2FrictionJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n}\n\nb2FrictionJoint::b2FrictionJoint(const b2FrictionJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\n\tm_linearImpulse.SetZero();\n\tm_angularImpulse = 0.0f;\n\n\tm_maxForce = def->maxForce;\n\tm_maxTorque = def->maxTorque;\n}\n\nvoid b2FrictionJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\t// Compute the effective mass matrix.\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// J = [-I -r1_skew I r2_skew]\n\t//     [ 0       -1 0       1]\n\t// r_skew = [-ry; rx]\n\n\t// Matlab\n\t// K = [ mA+r1y^2*iA+mB+r2y^2*iB,  -r1y*iA*r1x-r2y*iB*r2x,          -r1y*iA-r2y*iB]\n\t//     [  -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB,           r1x*iA+r2x*iB]\n\t//     [          -r1y*iA-r2y*iB,           r1x*iA+r2x*iB,                   iA+iB]\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tb2Mat22 K;\n\tK.ex.x = mA + mB + iA * m_rA.y * m_rA.y + iB * m_rB.y * m_rB.y;\n\tK.ex.y = -iA * m_rA.x * m_rA.y - iB * m_rB.x * m_rB.y;\n\tK.ey.x = K.ex.y;\n\tK.ey.y = mA + mB + iA * m_rA.x * m_rA.x + iB * m_rB.x * m_rB.x;\n\n\tm_linearMass = K.GetInverse();\n\n\tm_angularMass = iA + iB;\n\tif (m_angularMass > 0.0f)\n\t{\n\t\tm_angularMass = 1.0f / m_angularMass;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support a variable time step.\n\t\tm_linearImpulse *= data.step.dtRatio;\n\t\tm_angularImpulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P(m_linearImpulse.x, m_linearImpulse.y);\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + m_angularImpulse);\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + m_angularImpulse);\n\t}\n\telse\n\t{\n\t\tm_linearImpulse.SetZero();\n\t\tm_angularImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2FrictionJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tfloat32 h = data.step.dt;\n\n\t// Solve angular friction\n\t{\n\t\tfloat32 Cdot = wB - wA;\n\t\tfloat32 impulse = -m_angularMass * Cdot;\n\n\t\tfloat32 oldImpulse = m_angularImpulse;\n\t\tfloat32 maxImpulse = h * m_maxTorque;\n\t\tm_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_angularImpulse - oldImpulse;\n\n\t\twA -= iA * impulse;\n\t\twB += iB * impulse;\n\t}\n\n\t// Solve linear friction\n\t{\n\t\tb2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA);\n\n\t\tb2Vec2 impulse = -b2Mul(m_linearMass, Cdot);\n\t\tb2Vec2 oldImpulse = m_linearImpulse;\n\t\tm_linearImpulse += impulse;\n\n\t\tfloat32 maxImpulse = h * m_maxForce;\n\n\t\tif (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse)\n\t\t{\n\t\t\tm_linearImpulse.Normalize();\n\t\t\tm_linearImpulse *= maxImpulse;\n\t\t}\n\n\t\timpulse = m_linearImpulse - oldImpulse;\n\n\t\tvA -= mA * impulse;\n\t\twA -= iA * b2Cross(m_rA, impulse);\n\n\t\tvB += mB * impulse;\n\t\twB += iB * b2Cross(m_rB, impulse);\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2FrictionJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tB2_NOT_USED(data);\n\n\treturn true;\n}\n\nb2Vec2 b2FrictionJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2FrictionJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2FrictionJoint::GetReactionForce(float32 inv_dt) const\n{\n\treturn inv_dt * m_linearImpulse;\n}\n\nfloat32 b2FrictionJoint::GetReactionTorque(float32 inv_dt) const\n{\n\treturn inv_dt * m_angularImpulse;\n}\n\nvoid b2FrictionJoint::SetMaxForce(float32 force)\n{\n\tb2Assert(b2IsValid(force) && force >= 0.0f);\n\tm_maxForce = force;\n}\n\nfloat32 b2FrictionJoint::GetMaxForce() const\n{\n\treturn m_maxForce;\n}\n\nvoid b2FrictionJoint::SetMaxTorque(float32 torque)\n{\n\tb2Assert(b2IsValid(torque) && torque >= 0.0f);\n\tm_maxTorque = torque;\n}\n\nfloat32 b2FrictionJoint::GetMaxTorque() const\n{\n\treturn m_maxTorque;\n}\n\nvoid b2FrictionJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Log(\"  b2FrictionJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.localAnchorA.Set(%.15lef, %.15lef);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Log(\"  jd.localAnchorB.Set(%.15lef, %.15lef);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Log(\"  jd.maxForce = %.15lef;\\n\", m_maxForce);\n\tb2Log(\"  jd.maxTorque = %.15lef;\\n\", m_maxTorque);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2GearJoint.cpp",
    "content": "/*\n* Copyright (c) 2007-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2GearJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// Gear Joint:\n// C0 = (coordinate1 + ratio * coordinate2)_initial\n// C = (coordinate1 + ratio * coordinate2) - C0 = 0\n// J = [J1 ratio * J2]\n// K = J * invM * JT\n//   = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n//\n// Revolute:\n// coordinate = rotation\n// Cdot = angularVelocity\n// J = [0 0 1]\n// K = J * invM * JT = invI\n//\n// Prismatic:\n// coordinate = dot(p - pg, ug)\n// Cdot = dot(v + cross(w, r), ug)\n// J = [ug cross(r, ug)]\n// K = J * invM * JT = invMass + invI * cross(r, ug)^2\n\nb2GearJoint::b2GearJoint(const b2GearJointDef* def)\n: b2Joint(def)\n{\n\tm_joint1 = def->joint1;\n\tm_joint2 = def->joint2;\n\n\tm_typeA = m_joint1->GetType();\n\tm_typeB = m_joint2->GetType();\n\n\tb2Assert(m_typeA == e_revoluteJoint || m_typeA == e_prismaticJoint);\n\tb2Assert(m_typeB == e_revoluteJoint || m_typeB == e_prismaticJoint);\n\n\tfloat32 coordinateA, coordinateB;\n\n\t// TODO_ERIN there might be some problem with the joint edges in b2Joint.\n\n\tm_bodyC = m_joint1->GetBodyA();\n\tm_bodyA = m_joint1->GetBodyB();\n\n\t// Get geometry of joint1\n\tb2Transform xfA = m_bodyA->m_xf;\n\tfloat32 aA = m_bodyA->m_sweep.a;\n\tb2Transform xfC = m_bodyC->m_xf;\n\tfloat32 aC = m_bodyC->m_sweep.a;\n\n\tif (m_typeA == e_revoluteJoint)\n\t{\n\t\tb2RevoluteJoint* revolute = (b2RevoluteJoint*)def->joint1;\n\t\tm_localAnchorC = revolute->m_localAnchorA;\n\t\tm_localAnchorA = revolute->m_localAnchorB;\n\t\tm_referenceAngleA = revolute->m_referenceAngle;\n\t\tm_localAxisC.SetZero();\n\n\t\tcoordinateA = aA - aC - m_referenceAngleA;\n\t}\n\telse\n\t{\n\t\tb2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint1;\n\t\tm_localAnchorC = prismatic->m_localAnchorA;\n\t\tm_localAnchorA = prismatic->m_localAnchorB;\n\t\tm_referenceAngleA = prismatic->m_referenceAngle;\n\t\tm_localAxisC = prismatic->m_localXAxisA;\n\n\t\tb2Vec2 pC = m_localAnchorC;\n\t\tb2Vec2 pA = b2MulT(xfC.q, b2Mul(xfA.q, m_localAnchorA) + (xfA.p - xfC.p));\n\t\tcoordinateA = b2Dot(pA - pC, m_localAxisC);\n\t}\n\n\tm_bodyD = m_joint2->GetBodyA();\n\tm_bodyB = m_joint2->GetBodyB();\n\n\t// Get geometry of joint2\n\tb2Transform xfB = m_bodyB->m_xf;\n\tfloat32 aB = m_bodyB->m_sweep.a;\n\tb2Transform xfD = m_bodyD->m_xf;\n\tfloat32 aD = m_bodyD->m_sweep.a;\n\n\tif (m_typeB == e_revoluteJoint)\n\t{\n\t\tb2RevoluteJoint* revolute = (b2RevoluteJoint*)def->joint2;\n\t\tm_localAnchorD = revolute->m_localAnchorA;\n\t\tm_localAnchorB = revolute->m_localAnchorB;\n\t\tm_referenceAngleB = revolute->m_referenceAngle;\n\t\tm_localAxisD.SetZero();\n\n\t\tcoordinateB = aB - aD - m_referenceAngleB;\n\t}\n\telse\n\t{\n\t\tb2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint2;\n\t\tm_localAnchorD = prismatic->m_localAnchorA;\n\t\tm_localAnchorB = prismatic->m_localAnchorB;\n\t\tm_referenceAngleB = prismatic->m_referenceAngle;\n\t\tm_localAxisD = prismatic->m_localXAxisA;\n\n\t\tb2Vec2 pD = m_localAnchorD;\n\t\tb2Vec2 pB = b2MulT(xfD.q, b2Mul(xfB.q, m_localAnchorB) + (xfB.p - xfD.p));\n\t\tcoordinateB = b2Dot(pB - pD, m_localAxisD);\n\t}\n\n\tm_ratio = def->ratio;\n\n\tm_constant = coordinateA + m_ratio * coordinateB;\n\n\tm_impulse = 0.0f;\n}\n\nvoid b2GearJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_indexC = m_bodyC->m_islandIndex;\n\tm_indexD = m_bodyD->m_islandIndex;\n\tm_lcA = m_bodyA->m_sweep.localCenter;\n\tm_lcB = m_bodyB->m_sweep.localCenter;\n\tm_lcC = m_bodyC->m_sweep.localCenter;\n\tm_lcD = m_bodyD->m_sweep.localCenter;\n\tm_mA = m_bodyA->m_invMass;\n\tm_mB = m_bodyB->m_invMass;\n\tm_mC = m_bodyC->m_invMass;\n\tm_mD = m_bodyD->m_invMass;\n\tm_iA = m_bodyA->m_invI;\n\tm_iB = m_bodyB->m_invI;\n\tm_iC = m_bodyC->m_invI;\n\tm_iD = m_bodyD->m_invI;\n\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tfloat32 aC = data.positions[m_indexC].a;\n\tb2Vec2 vC = data.velocities[m_indexC].v;\n\tfloat32 wC = data.velocities[m_indexC].w;\n\n\tfloat32 aD = data.positions[m_indexD].a;\n\tb2Vec2 vD = data.velocities[m_indexD].v;\n\tfloat32 wD = data.velocities[m_indexD].w;\n\n\tb2Rot qA(aA), qB(aB), qC(aC), qD(aD);\n\n\tm_mass = 0.0f;\n\n\tif (m_typeA == e_revoluteJoint)\n\t{\n\t\tm_JvAC.SetZero();\n\t\tm_JwA = 1.0f;\n\t\tm_JwC = 1.0f;\n\t\tm_mass += m_iA + m_iC;\n\t}\n\telse\n\t{\n\t\tb2Vec2 u = b2Mul(qC, m_localAxisC);\n\t\tb2Vec2 rC = b2Mul(qC, m_localAnchorC - m_lcC);\n\t\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_lcA);\n\t\tm_JvAC = u;\n\t\tm_JwC = b2Cross(rC, u);\n\t\tm_JwA = b2Cross(rA, u);\n\t\tm_mass += m_mC + m_mA + m_iC * m_JwC * m_JwC + m_iA * m_JwA * m_JwA;\n\t}\n\n\tif (m_typeB == e_revoluteJoint)\n\t{\n\t\tm_JvBD.SetZero();\n\t\tm_JwB = m_ratio;\n\t\tm_JwD = m_ratio;\n\t\tm_mass += m_ratio * m_ratio * (m_iB + m_iD);\n\t}\n\telse\n\t{\n\t\tb2Vec2 u = b2Mul(qD, m_localAxisD);\n\t\tb2Vec2 rD = b2Mul(qD, m_localAnchorD - m_lcD);\n\t\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_lcB);\n\t\tm_JvBD = m_ratio * u;\n\t\tm_JwD = m_ratio * b2Cross(rD, u);\n\t\tm_JwB = m_ratio * b2Cross(rB, u);\n\t\tm_mass += m_ratio * m_ratio * (m_mD + m_mB) + m_iD * m_JwD * m_JwD + m_iB * m_JwB * m_JwB;\n\t}\n\n\t// Compute effective mass.\n\tm_mass = m_mass > 0.0f ? 1.0f / m_mass : 0.0f;\n\n\tif (data.step.warmStarting)\n\t{\n\t\tvA += (m_mA * m_impulse) * m_JvAC;\n\t\twA += m_iA * m_impulse * m_JwA;\n\t\tvB += (m_mB * m_impulse) * m_JvBD;\n\t\twB += m_iB * m_impulse * m_JwB;\n\t\tvC -= (m_mC * m_impulse) * m_JvAC;\n\t\twC -= m_iC * m_impulse * m_JwC;\n\t\tvD -= (m_mD * m_impulse) * m_JvBD;\n\t\twD -= m_iD * m_impulse * m_JwD;\n\t}\n\telse\n\t{\n\t\tm_impulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n\tdata.velocities[m_indexC].v = vC;\n\tdata.velocities[m_indexC].w = wC;\n\tdata.velocities[m_indexD].v = vD;\n\tdata.velocities[m_indexD].w = wD;\n}\n\nvoid b2GearJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\tb2Vec2 vC = data.velocities[m_indexC].v;\n\tfloat32 wC = data.velocities[m_indexC].w;\n\tb2Vec2 vD = data.velocities[m_indexD].v;\n\tfloat32 wD = data.velocities[m_indexD].w;\n\n\tfloat32 Cdot = b2Dot(m_JvAC, vA - vC) + b2Dot(m_JvBD, vB - vD);\n\tCdot += (m_JwA * wA - m_JwC * wC) + (m_JwB * wB - m_JwD * wD);\n\n\tfloat32 impulse = -m_mass * Cdot;\n\tm_impulse += impulse;\n\n\tvA += (m_mA * impulse) * m_JvAC;\n\twA += m_iA * impulse * m_JwA;\n\tvB += (m_mB * impulse) * m_JvBD;\n\twB += m_iB * impulse * m_JwB;\n\tvC -= (m_mC * impulse) * m_JvAC;\n\twC -= m_iC * impulse * m_JwC;\n\tvD -= (m_mD * impulse) * m_JvBD;\n\twD -= m_iD * impulse * m_JwD;\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n\tdata.velocities[m_indexC].v = vC;\n\tdata.velocities[m_indexC].w = wC;\n\tdata.velocities[m_indexD].v = vD;\n\tdata.velocities[m_indexD].w = wD;\n}\n\nbool b2GearJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 cC = data.positions[m_indexC].c;\n\tfloat32 aC = data.positions[m_indexC].a;\n\tb2Vec2 cD = data.positions[m_indexD].c;\n\tfloat32 aD = data.positions[m_indexD].a;\n\n\tb2Rot qA(aA), qB(aB), qC(aC), qD(aD);\n\n\tfloat32 linearError = 0.0f;\n\n\tfloat32 coordinateA, coordinateB;\n\n\tb2Vec2 JvAC, JvBD;\n\tfloat32 JwA, JwB, JwC, JwD;\n\tfloat32 mass = 0.0f;\n\n\tif (m_typeA == e_revoluteJoint)\n\t{\n\t\tJvAC.SetZero();\n\t\tJwA = 1.0f;\n\t\tJwC = 1.0f;\n\t\tmass += m_iA + m_iC;\n\n\t\tcoordinateA = aA - aC - m_referenceAngleA;\n\t}\n\telse\n\t{\n\t\tb2Vec2 u = b2Mul(qC, m_localAxisC);\n\t\tb2Vec2 rC = b2Mul(qC, m_localAnchorC - m_lcC);\n\t\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_lcA);\n\t\tJvAC = u;\n\t\tJwC = b2Cross(rC, u);\n\t\tJwA = b2Cross(rA, u);\n\t\tmass += m_mC + m_mA + m_iC * JwC * JwC + m_iA * JwA * JwA;\n\n\t\tb2Vec2 pC = m_localAnchorC - m_lcC;\n\t\tb2Vec2 pA = b2MulT(qC, rA + (cA - cC));\n\t\tcoordinateA = b2Dot(pA - pC, m_localAxisC);\n\t}\n\n\tif (m_typeB == e_revoluteJoint)\n\t{\n\t\tJvBD.SetZero();\n\t\tJwB = m_ratio;\n\t\tJwD = m_ratio;\n\t\tmass += m_ratio * m_ratio * (m_iB + m_iD);\n\n\t\tcoordinateB = aB - aD - m_referenceAngleB;\n\t}\n\telse\n\t{\n\t\tb2Vec2 u = b2Mul(qD, m_localAxisD);\n\t\tb2Vec2 rD = b2Mul(qD, m_localAnchorD - m_lcD);\n\t\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_lcB);\n\t\tJvBD = m_ratio * u;\n\t\tJwD = m_ratio * b2Cross(rD, u);\n\t\tJwB = m_ratio * b2Cross(rB, u);\n\t\tmass += m_ratio * m_ratio * (m_mD + m_mB) + m_iD * JwD * JwD + m_iB * JwB * JwB;\n\n\t\tb2Vec2 pD = m_localAnchorD - m_lcD;\n\t\tb2Vec2 pB = b2MulT(qD, rB + (cB - cD));\n\t\tcoordinateB = b2Dot(pB - pD, m_localAxisD);\n\t}\n\n\tfloat32 C = (coordinateA + m_ratio * coordinateB) - m_constant;\n\n\tfloat32 impulse = 0.0f;\n\tif (mass > 0.0f)\n\t{\n\t\timpulse = -C / mass;\n\t}\n\n\tcA += m_mA * impulse * JvAC;\n\taA += m_iA * impulse * JwA;\n\tcB += m_mB * impulse * JvBD;\n\taB += m_iB * impulse * JwB;\n\tcC -= m_mC * impulse * JvAC;\n\taC -= m_iC * impulse * JwC;\n\tcD -= m_mD * impulse * JvBD;\n\taD -= m_iD * impulse * JwD;\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\tdata.positions[m_indexC].c = cC;\n\tdata.positions[m_indexC].a = aC;\n\tdata.positions[m_indexD].c = cD;\n\tdata.positions[m_indexD].a = aD;\n\n\t// TODO_ERIN not implemented\n\treturn linearError < b2_linearSlop;\n}\n\nb2Vec2 b2GearJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2GearJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2GearJoint::GetReactionForce(float32 inv_dt) const\n{\n\tb2Vec2 P = m_impulse * m_JvAC;\n\treturn inv_dt * P;\n}\n\nfloat32 b2GearJoint::GetReactionTorque(float32 inv_dt) const\n{\n\tfloat32 L = m_impulse * m_JwA;\n\treturn inv_dt * L;\n}\n\nvoid b2GearJoint::SetRatio(float32 ratio)\n{\n\tb2Assert(b2IsValid(ratio));\n\tm_ratio = ratio;\n}\n\nfloat32 b2GearJoint::GetRatio() const\n{\n\treturn m_ratio;\n}\n\nvoid b2GearJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tint32 index1 = m_joint1->m_index;\n\tint32 index2 = m_joint2->m_index;\n\n\tb2Log(\"  b2GearJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.joint1 = joints[%d];\\n\", index1);\n\tb2Log(\"  jd.joint2 = joints[%d];\\n\", index2);\n\tb2Log(\"  jd.ratio = %.15lef;\\n\", m_ratio);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Island.cpp",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2Distance.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Island.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2World.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2StackAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2Timer.h\"\n\n/*\nPosition Correction Notes\n=========================\nI tried the several algorithms for position correction of the 2D revolute joint.\nI looked at these systems:\n- simple pendulum (1m diameter sphere on massless 5m stick) with initial angular velocity of 100 rad/s.\n- suspension bridge with 30 1m long planks of length 1m.\n- multi-link chain with 30 1m long links.\n\nHere are the algorithms:\n\nBaumgarte - A fraction of the position error is added to the velocity error. There is no\nseparate position solver.\n\nPseudo Velocities - After the velocity solver and position integration,\nthe position error, Jacobian, and effective mass are recomputed. Then\nthe velocity constraints are solved with pseudo velocities and a fraction\nof the position error is added to the pseudo velocity error. The pseudo\nvelocities are initialized to zero and there is no warm-starting. After\nthe position solver, the pseudo velocities are added to the positions.\nThis is also called the First Order World method or the Position LCP method.\n\nModified Nonlinear Gauss-Seidel (NGS) - Like Pseudo Velocities except the\nposition error is re-computed for each constraint and the positions are updated\nafter the constraint is solved. The radius vectors (aka Jacobians) are\nre-computed too (otherwise the algorithm has horrible instability). The pseudo\nvelocity states are not needed because they are effectively zero at the beginning\nof each iteration. Since we have the current position error, we allow the\niterations to terminate early if the error becomes smaller than b2_linearSlop.\n\nFull NGS or just NGS - Like Modified NGS except the effective mass are re-computed\neach time a constraint is solved.\n\nHere are the results:\nBaumgarte - this is the cheapest algorithm but it has some stability problems,\nespecially with the bridge. The chain links separate easily close to the root\nand they jitter as they struggle to pull together. This is one of the most common\nmethods in the field. The big drawback is that the position correction artificially\naffects the momentum, thus leading to instabilities and false bounce. I used a\nbias factor of 0.2. A larger bias factor makes the bridge less stable, a smaller\nfactor makes joints and contacts more spongy.\n\nPseudo Velocities - the is more stable than the Baumgarte method. The bridge is\nstable. However, joints still separate with large angular velocities. Drag the\nsimple pendulum in a circle quickly and the joint will separate. The chain separates\neasily and does not recover. I used a bias factor of 0.2. A larger value lead to\nthe bridge collapsing when a heavy cube drops on it.\n\nModified NGS - this algorithm is better in some ways than Baumgarte and Pseudo\nVelocities, but in other ways it is worse. The bridge and chain are much more\nstable, but the simple pendulum goes unstable at high angular velocities.\n\nFull NGS - stable in all tests. The joints display good stiffness. The bridge\nstill sags, but this is better than infinite forces.\n\nRecommendations\nPseudo Velocities are not really worthwhile because the bridge and chain cannot\nrecover from joint separation. In other cases the benefit over Baumgarte is small.\n\nModified NGS is not a robust method for the revolute joint due to the violent\ninstability seen in the simple pendulum. Perhaps it is viable with other constraint\ntypes, especially scalar constraints where the effective mass is a scalar.\n\nThis leaves Baumgarte and Full NGS. Baumgarte has small, but manageable instabilities\nand is very fast. I don't think we can escape Baumgarte, especially in highly\ndemanding cases where high constraint fidelity is not needed.\n\nFull NGS is robust and easy on the eyes. I recommend this as an option for\nhigher fidelity simulation and certainly for suspension bridges and long chains.\nFull NGS might be a good choice for ragdolls, especially motorized ragdolls where\njoint separation can be problematic. The number of NGS iterations can be reduced\nfor better performance without harming robustness much.\n\nEach joint in a can be handled differently in the position solver. So I recommend\na system where the user can select the algorithm on a per joint basis. I would\nprobably default to the slower Full NGS and let the user select the faster\nBaumgarte method in performance critical scenarios.\n*/\n\n/*\nCache Performance\n\nThe Box2D solvers are dominated by cache misses. Data structures are designed\nto increase the number of cache hits. Much of misses are due to random access\nto body data. The constraint structures are iterated over linearly, which leads\nto few cache misses.\n\nThe bodies are not accessed during iteration. Instead read only data, such as\nthe mass values are stored with the constraints. The mutable data are the constraint\nimpulses and the bodies velocities/positions. The impulses are held inside the\nconstraint structures. The body velocities/positions are held in compact, temporary\narrays to increase the number of cache hits. Linear and angular velocity are\nstored in a single array since multiple arrays lead to multiple misses.\n*/\n\n/*\n2D Rotation\n\nR = [cos(theta) -sin(theta)]\n    [sin(theta) cos(theta) ]\n\nthetaDot = omega\n\nLet q1 = cos(theta), q2 = sin(theta).\nR = [q1 -q2]\n    [q2  q1]\n\nq1Dot = -thetaDot * q2\nq2Dot = thetaDot * q1\n\nq1_new = q1_old - dt * w * q2\nq2_new = q2_old + dt * w * q1\nthen normalize.\n\nThis might be faster than computing sin+cos.\nHowever, we can compute sin+cos of the same angle fast.\n*/\n\nb2Island::b2Island(\n\tint32 bodyCapacity,\n\tint32 contactCapacity,\n\tint32 jointCapacity,\n\tb2StackAllocator* allocator,\n\tb2ContactListener* listener)\n{\n\tm_bodyCapacity = bodyCapacity;\n\tm_contactCapacity = contactCapacity;\n\tm_jointCapacity\t = jointCapacity;\n\tm_bodyCount = 0;\n\tm_contactCount = 0;\n\tm_jointCount = 0;\n\n\tm_allocator = allocator;\n\tm_listener = listener;\n\n\tm_bodies = (b2Body**)m_allocator->Allocate(bodyCapacity * sizeof(b2Body*));\n\tm_contacts = (b2Contact**)m_allocator->Allocate(contactCapacity\t * sizeof(b2Contact*));\n\tm_joints = (b2Joint**)m_allocator->Allocate(jointCapacity * sizeof(b2Joint*));\n\n\tm_velocities = (b2Velocity*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Velocity));\n\tm_positions = (b2Position*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Position));\n}\n\nb2Island::~b2Island()\n{\n\t// Warning: the order should reverse the constructor order.\n\tm_allocator->Free(m_positions);\n\tm_allocator->Free(m_velocities);\n\tm_allocator->Free(m_joints);\n\tm_allocator->Free(m_contacts);\n\tm_allocator->Free(m_bodies);\n}\n\nvoid b2Island::Solve(b2Profile* profile, const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep)\n{\n\tb2Timer timer;\n\n\tfloat32 h = step.dt;\n\n\t// Integrate velocities and apply damping. Initialize the body state.\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Body* b = m_bodies[i];\n\n\t\tb2Vec2 c = b->m_sweep.c;\n\t\tfloat32 a = b->m_sweep.a;\n\t\tb2Vec2 v = b->m_linearVelocity;\n\t\tfloat32 w = b->m_angularVelocity;\n\n\t\t// Store positions for continuous collision.\n\t\tb->m_sweep.c0 = b->m_sweep.c;\n\t\tb->m_sweep.a0 = b->m_sweep.a;\n\n\t\tif (b->m_type == b2_dynamicBody)\n\t\t{\n\t\t\t// Integrate velocities.\n\t\t\tv += h * (b->m_gravityScale * gravity + b->m_invMass * b->m_force);\n\t\t\tw += h * b->m_invI * b->m_torque;\n\n\t\t\t// Apply damping.\n\t\t\t// ODE: dv/dt + c * v = 0\n\t\t\t// Solution: v(t) = v0 * exp(-c * t)\n\t\t\t// Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n\t\t\t// v2 = exp(-c * dt) * v1\n\t\t\t// Pade approximation:\n\t\t\t// v2 = v1 * 1 / (1 + c * dt)\n\t\t\tv *= 1.0f / (1.0f + h * b->m_linearDamping);\n\t\t\tw *= 1.0f / (1.0f + h * b->m_angularDamping);\n\t\t}\n\n\t\tm_positions[i].c = c;\n\t\tm_positions[i].a = a;\n\t\tm_velocities[i].v = v;\n\t\tm_velocities[i].w = w;\n\t}\n\n\ttimer.Reset();\n\n\t// Solver data\n\tb2SolverData solverData;\n\tsolverData.step = step;\n\tsolverData.positions = m_positions;\n\tsolverData.velocities = m_velocities;\n\n\t// Initialize velocity constraints.\n\tb2ContactSolverDef contactSolverDef;\n\tcontactSolverDef.step = step;\n\tcontactSolverDef.contacts = m_contacts;\n\tcontactSolverDef.count = m_contactCount;\n\tcontactSolverDef.positions = m_positions;\n\tcontactSolverDef.velocities = m_velocities;\n\tcontactSolverDef.allocator = m_allocator;\n\n\tb2ContactSolver contactSolver(&contactSolverDef);\n\tcontactSolver.InitializeVelocityConstraints();\n\n\tif (step.warmStarting)\n\t{\n\t\tcontactSolver.WarmStart();\n\t}\n\n\tfor (int32 i = 0; i < m_jointCount; ++i)\n\t{\n\t\tm_joints[i]->InitVelocityConstraints(solverData);\n\t}\n\n\tprofile->solveInit = timer.GetMilliseconds();\n\n\t// Solve velocity constraints\n\ttimer.Reset();\n\tfor (int32 i = 0; i < step.velocityIterations; ++i)\n\t{\n\t\tfor (int32 j = 0; j < m_jointCount; ++j)\n\t\t{\n\t\t\tm_joints[j]->SolveVelocityConstraints(solverData);\n\t\t}\n\n\t\tcontactSolver.SolveVelocityConstraints();\n\t}\n\n\t// Store impulses for warm starting\n\tcontactSolver.StoreImpulses();\n\tprofile->solveVelocity = timer.GetMilliseconds();\n\n\t// Integrate positions\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Vec2 c = m_positions[i].c;\n\t\tfloat32 a = m_positions[i].a;\n\t\tb2Vec2 v = m_velocities[i].v;\n\t\tfloat32 w = m_velocities[i].w;\n\n\t\t// Check for large velocities\n\t\tb2Vec2 translation = h * v;\n\t\tif (b2Dot(translation, translation) > b2_maxTranslationSquared)\n\t\t{\n\t\t\tfloat32 ratio = b2_maxTranslation / translation.Length();\n\t\t\tv *= ratio;\n\t\t}\n\n\t\tfloat32 rotation = h * w;\n\t\tif (rotation * rotation > b2_maxRotationSquared)\n\t\t{\n\t\t\tfloat32 ratio = b2_maxRotation / b2Abs(rotation);\n\t\t\tw *= ratio;\n\t\t}\n\n\t\t// Integrate\n\t\tc += h * v;\n\t\ta += h * w;\n\n\t\tm_positions[i].c = c;\n\t\tm_positions[i].a = a;\n\t\tm_velocities[i].v = v;\n\t\tm_velocities[i].w = w;\n\t}\n\n\t// Solve position constraints\n\ttimer.Reset();\n\tbool positionSolved = false;\n\tfor (int32 i = 0; i < step.positionIterations; ++i)\n\t{\n\t\tbool contactsOkay = contactSolver.SolvePositionConstraints();\n\n\t\tbool jointsOkay = true;\n\t\tfor (int32 i = 0; i < m_jointCount; ++i)\n\t\t{\n\t\t\tbool jointOkay = m_joints[i]->SolvePositionConstraints(solverData);\n\t\t\tjointsOkay = jointsOkay && jointOkay;\n\t\t}\n\n\t\tif (contactsOkay && jointsOkay)\n\t\t{\n\t\t\t// Exit early if the position errors are small.\n\t\t\tpositionSolved = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Copy state buffers back to the bodies\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Body* body = m_bodies[i];\n\t\tbody->m_sweep.c = m_positions[i].c;\n\t\tbody->m_sweep.a = m_positions[i].a;\n\t\tbody->m_linearVelocity = m_velocities[i].v;\n\t\tbody->m_angularVelocity = m_velocities[i].w;\n\t\tbody->SynchronizeTransform();\n\t}\n\n\tprofile->solvePosition = timer.GetMilliseconds();\n\n\tReport(contactSolver.m_velocityConstraints);\n\n\tif (allowSleep)\n\t{\n\t\tfloat32 minSleepTime = b2_maxFloat;\n\n\t\tconst float32 linTolSqr = b2_linearSleepTolerance * b2_linearSleepTolerance;\n\t\tconst float32 angTolSqr = b2_angularSleepTolerance * b2_angularSleepTolerance;\n\n\t\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t\t{\n\t\t\tb2Body* b = m_bodies[i];\n\t\t\tif (b->GetType() == b2_staticBody)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((b->m_flags & b2Body::e_autoSleepFlag) == 0 ||\n\t\t\t\tb->m_angularVelocity * b->m_angularVelocity > angTolSqr ||\n\t\t\t\tb2Dot(b->m_linearVelocity, b->m_linearVelocity) > linTolSqr)\n\t\t\t{\n\t\t\t\tb->m_sleepTime = 0.0f;\n\t\t\t\tminSleepTime = 0.0f;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tb->m_sleepTime += h;\n\t\t\t\tminSleepTime = b2Min(minSleepTime, b->m_sleepTime);\n\t\t\t}\n\t\t}\n\n\t\tif (minSleepTime >= b2_timeToSleep && positionSolved)\n\t\t{\n\t\t\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t\t\t{\n\t\t\t\tb2Body* b = m_bodies[i];\n\t\t\t\tb->SetAwake(false);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid b2Island::SolveTOI(const b2TimeStep& subStep, int32 toiIndexA, int32 toiIndexB)\n{\n\tb2Assert(toiIndexA < m_bodyCount);\n\tb2Assert(toiIndexB < m_bodyCount);\n\n\t// Initialize the body state.\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Body* b = m_bodies[i];\n\t\tm_positions[i].c = b->m_sweep.c;\n\t\tm_positions[i].a = b->m_sweep.a;\n\t\tm_velocities[i].v = b->m_linearVelocity;\n\t\tm_velocities[i].w = b->m_angularVelocity;\n\t}\n\n\tb2ContactSolverDef contactSolverDef;\n\tcontactSolverDef.contacts = m_contacts;\n\tcontactSolverDef.count = m_contactCount;\n\tcontactSolverDef.allocator = m_allocator;\n\tcontactSolverDef.step = subStep;\n\tcontactSolverDef.positions = m_positions;\n\tcontactSolverDef.velocities = m_velocities;\n\tb2ContactSolver contactSolver(&contactSolverDef);\n\n\t// Solve position constraints.\n\tfor (int32 i = 0; i < subStep.positionIterations; ++i)\n\t{\n\t\tbool contactsOkay = contactSolver.SolveTOIPositionConstraints(toiIndexA, toiIndexB);\n\t\tif (contactsOkay)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n#if 0\n\t// Is the new position really safe?\n\tfor (int32 i = 0; i < m_contactCount; ++i)\n\t{\n\t\tb2Contact* c = m_contacts[i];\n\t\tb2Fixture* fA = c->GetFixtureA();\n\t\tb2Fixture* fB = c->GetFixtureB();\n\n\t\tb2Body* bA = fA->GetBody();\n\t\tb2Body* bB = fB->GetBody();\n\n\t\tint32 indexA = c->GetChildIndexA();\n\t\tint32 indexB = c->GetChildIndexB();\n\n\t\tb2DistanceInput input;\n\t\tinput.proxyA.Set(fA->GetShape(), indexA);\n\t\tinput.proxyB.Set(fB->GetShape(), indexB);\n\t\tinput.transformA = bA->GetTransform();\n\t\tinput.transformB = bB->GetTransform();\n\t\tinput.useRadii = false;\n\n\t\tb2DistanceOutput output;\n\t\tb2SimplexCache cache;\n\t\tcache.count = 0;\n\t\tb2Distance(&output, &cache, &input);\n\n\t\tif (output.distance == 0 || cache.count == 3)\n\t\t{\n\t\t\tcache.count += 0;\n\t\t}\n\t}\n#endif\n\n\t// Leap of faith to new safe state.\n\tm_bodies[toiIndexA]->m_sweep.c0 = m_positions[toiIndexA].c;\n\tm_bodies[toiIndexA]->m_sweep.a0 = m_positions[toiIndexA].a;\n\tm_bodies[toiIndexB]->m_sweep.c0 = m_positions[toiIndexB].c;\n\tm_bodies[toiIndexB]->m_sweep.a0 = m_positions[toiIndexB].a;\n\n\t// No warm starting is needed for TOI events because warm\n\t// starting impulses were applied in the discrete solver.\n\tcontactSolver.InitializeVelocityConstraints();\n\n\t// Solve velocity constraints.\n\tfor (int32 i = 0; i < subStep.velocityIterations; ++i)\n\t{\n\t\tcontactSolver.SolveVelocityConstraints();\n\t}\n\n\t// Don't store the TOI contact forces for warm starting\n\t// because they can be quite large.\n\n\tfloat32 h = subStep.dt;\n\n\t// Integrate positions\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Vec2 c = m_positions[i].c;\n\t\tfloat32 a = m_positions[i].a;\n\t\tb2Vec2 v = m_velocities[i].v;\n\t\tfloat32 w = m_velocities[i].w;\n\n\t\t// Check for large velocities\n\t\tb2Vec2 translation = h * v;\n\t\tif (b2Dot(translation, translation) > b2_maxTranslationSquared)\n\t\t{\n\t\t\tfloat32 ratio = b2_maxTranslation / translation.Length();\n\t\t\tv *= ratio;\n\t\t}\n\n\t\tfloat32 rotation = h * w;\n\t\tif (rotation * rotation > b2_maxRotationSquared)\n\t\t{\n\t\t\tfloat32 ratio = b2_maxRotation / b2Abs(rotation);\n\t\t\tw *= ratio;\n\t\t}\n\n\t\t// Integrate\n\t\tc += h * v;\n\t\ta += h * w;\n\n\t\tm_positions[i].c = c;\n\t\tm_positions[i].a = a;\n\t\tm_velocities[i].v = v;\n\t\tm_velocities[i].w = w;\n\n\t\t// Sync bodies\n\t\tb2Body* body = m_bodies[i];\n\t\tbody->m_sweep.c = c;\n\t\tbody->m_sweep.a = a;\n\t\tbody->m_linearVelocity = v;\n\t\tbody->m_angularVelocity = w;\n\t\tbody->SynchronizeTransform();\n\t}\n\n\tReport(contactSolver.m_velocityConstraints);\n}\n\nvoid b2Island::Report(const b2ContactVelocityConstraint* constraints)\n{\n\tif (m_listener == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tfor (int32 i = 0; i < m_contactCount; ++i)\n\t{\n\t\tb2Contact* c = m_contacts[i];\n\n\t\tconst b2ContactVelocityConstraint* vc = constraints + i;\n\n\t\tb2ContactImpulse impulse;\n\t\timpulse.count = vc->pointCount;\n\t\tfor (int32 j = 0; j < vc->pointCount; ++j)\n\t\t{\n\t\t\timpulse.normalImpulses[j] = vc->points[j].normalImpulse;\n\t\t\timpulse.tangentImpulses[j] = vc->points[j].tangentImpulse;\n\t\t}\n\n\t\tm_listener->PostSolve(c, &impulse);\n\t}\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Joint.cpp",
    "content": "/*\n* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2DistanceJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2WheelJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2MouseJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2GearJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2WeldJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2FrictionJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2RopeJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2MotorJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2World.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n\n#include <new>\n\nb2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator)\n{\n\tb2Joint* joint = NULL;\n\n\tswitch (def->type)\n\t{\n\tcase e_distanceJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2DistanceJoint));\n\t\t\tjoint = new (mem) b2DistanceJoint(static_cast<const b2DistanceJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_mouseJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2MouseJoint));\n\t\t\tjoint = new (mem) b2MouseJoint(static_cast<const b2MouseJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_prismaticJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2PrismaticJoint));\n\t\t\tjoint = new (mem) b2PrismaticJoint(static_cast<const b2PrismaticJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_revoluteJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2RevoluteJoint));\n\t\t\tjoint = new (mem) b2RevoluteJoint(static_cast<const b2RevoluteJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_pulleyJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2PulleyJoint));\n\t\t\tjoint = new (mem) b2PulleyJoint(static_cast<const b2PulleyJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_gearJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2GearJoint));\n\t\t\tjoint = new (mem) b2GearJoint(static_cast<const b2GearJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_wheelJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2WheelJoint));\n\t\t\tjoint = new (mem) b2WheelJoint(static_cast<const b2WheelJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_weldJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2WeldJoint));\n\t\t\tjoint = new (mem) b2WeldJoint(static_cast<const b2WeldJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_frictionJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2FrictionJoint));\n\t\t\tjoint = new (mem) b2FrictionJoint(static_cast<const b2FrictionJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_ropeJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2RopeJoint));\n\t\t\tjoint = new (mem) b2RopeJoint(static_cast<const b2RopeJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_motorJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2MotorJoint));\n\t\t\tjoint = new (mem) b2MotorJoint(static_cast<const b2MotorJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tb2Assert(false);\n\t\tbreak;\n\t}\n\n\treturn joint;\n}\n\nvoid b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator)\n{\n\tjoint->~b2Joint();\n\tswitch (joint->m_type)\n\t{\n\tcase e_distanceJoint:\n\t\tallocator->Free(joint, sizeof(b2DistanceJoint));\n\t\tbreak;\n\n\tcase e_mouseJoint:\n\t\tallocator->Free(joint, sizeof(b2MouseJoint));\n\t\tbreak;\n\n\tcase e_prismaticJoint:\n\t\tallocator->Free(joint, sizeof(b2PrismaticJoint));\n\t\tbreak;\n\n\tcase e_revoluteJoint:\n\t\tallocator->Free(joint, sizeof(b2RevoluteJoint));\n\t\tbreak;\n\n\tcase e_pulleyJoint:\n\t\tallocator->Free(joint, sizeof(b2PulleyJoint));\n\t\tbreak;\n\n\tcase e_gearJoint:\n\t\tallocator->Free(joint, sizeof(b2GearJoint));\n\t\tbreak;\n\n\tcase e_wheelJoint:\n\t\tallocator->Free(joint, sizeof(b2WheelJoint));\n\t\tbreak;\n\n\tcase e_weldJoint:\n\t\tallocator->Free(joint, sizeof(b2WeldJoint));\n\t\tbreak;\n\n\tcase e_frictionJoint:\n\t\tallocator->Free(joint, sizeof(b2FrictionJoint));\n\t\tbreak;\n\n\tcase e_ropeJoint:\n\t\tallocator->Free(joint, sizeof(b2RopeJoint));\n\t\tbreak;\n\n\tcase e_motorJoint:\n\t\tallocator->Free(joint, sizeof(b2MotorJoint));\n\t\tbreak;\n\n\tdefault:\n\t\tb2Assert(false);\n\t\tbreak;\n\t}\n}\n\nb2Joint::b2Joint(const b2JointDef* def)\n{\n\tb2Assert(def->bodyA != def->bodyB);\n\n\tm_type = def->type;\n\tm_prev = NULL;\n\tm_next = NULL;\n\tm_bodyA = def->bodyA;\n\tm_bodyB = def->bodyB;\n\tm_index = 0;\n\tm_collideConnected = def->collideConnected;\n\tm_islandFlag = false;\n\tm_userData = def->userData;\n\n\tm_edgeA.joint = NULL;\n\tm_edgeA.other = NULL;\n\tm_edgeA.prev = NULL;\n\tm_edgeA.next = NULL;\n\n\tm_edgeB.joint = NULL;\n\tm_edgeB.other = NULL;\n\tm_edgeB.prev = NULL;\n\tm_edgeB.next = NULL;\n}\n\nbool b2Joint::IsActive() const\n{\n\treturn m_bodyA->IsActive() && m_bodyB->IsActive();\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Math.cpp",
    "content": "/*\n* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Common/b2Math.h\"\n\nconst b2Vec2 b2Vec2_zero(0.0f, 0.0f);\n\n/// Solve A * x = b, where b is a column vector. This is more efficient\n/// than computing the inverse in one-shot cases.\nb2Vec3 b2Mat33::Solve33(const b2Vec3& b) const\n{\n\tfloat32 det = b2Dot(ex, b2Cross(ey, ez));\n\tif (det != 0.0f)\n\t{\n\t\tdet = 1.0f / det;\n\t}\n\tb2Vec3 x;\n\tx.x = det * b2Dot(b, b2Cross(ey, ez));\n\tx.y = det * b2Dot(ex, b2Cross(b, ez));\n\tx.z = det * b2Dot(ex, b2Cross(ey, b));\n\treturn x;\n}\n\n/// Solve A * x = b, where b is a column vector. This is more efficient\n/// than computing the inverse in one-shot cases.\nb2Vec2 b2Mat33::Solve22(const b2Vec2& b) const\n{\n\tfloat32 a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y;\n\tfloat32 det = a11 * a22 - a12 * a21;\n\tif (det != 0.0f)\n\t{\n\t\tdet = 1.0f / det;\n\t}\n\tb2Vec2 x;\n\tx.x = det * (a22 * b.x - a12 * b.y);\n\tx.y = det * (a11 * b.y - a21 * b.x);\n\treturn x;\n}\n\n///\nvoid b2Mat33::GetInverse22(b2Mat33* M) const\n{\n\tfloat32 a = ex.x, b = ey.x, c = ex.y, d = ey.y;\n\tfloat32 det = a * d - b * c;\n\tif (det != 0.0f)\n\t{\n\t\tdet = 1.0f / det;\n\t}\n\n\tM->ex.x =  det * d;\tM->ey.x = -det * b; M->ex.z = 0.0f;\n\tM->ex.y = -det * c;\tM->ey.y =  det * a; M->ey.z = 0.0f;\n\tM->ez.x = 0.0f; M->ez.y = 0.0f; M->ez.z = 0.0f;\n}\n\n/// Returns the zero matrix if singular.\nvoid b2Mat33::GetSymInverse33(b2Mat33* M) const\n{\n\tfloat32 det = b2Dot(ex, b2Cross(ey, ez));\n\tif (det != 0.0f)\n\t{\n\t\tdet = 1.0f / det;\n\t}\n\n\tfloat32 a11 = ex.x, a12 = ey.x, a13 = ez.x;\n\tfloat32 a22 = ey.y, a23 = ez.y;\n\tfloat32 a33 = ez.z;\n\n\tM->ex.x = det * (a22 * a33 - a23 * a23);\n\tM->ex.y = det * (a13 * a23 - a12 * a33);\n\tM->ex.z = det * (a12 * a23 - a13 * a22);\n\n\tM->ey.x = M->ex.y;\n\tM->ey.y = det * (a11 * a33 - a13 * a13);\n\tM->ey.z = det * (a13 * a12 - a11 * a23);\n\n\tM->ez.x = M->ex.z;\n\tM->ez.y = M->ey.z;\n\tM->ez.z = det * (a11 * a22 - a12 * a12);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2MotorJoint.cpp",
    "content": "/*\n* Copyright (c) 2006-2012 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2MotorJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// Point-to-point constraint\n// Cdot = v2 - v1\n//      = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n// J = [-I -r1_skew I r2_skew ]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n\n// Angle constraint\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n// K = invI1 + invI2\n\nvoid b2MotorJointDef::Initialize(b2Body* bA, b2Body* bB)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tb2Vec2 xB = bodyB->GetPosition();\n\tlinearOffset = bodyA->GetLocalPoint(xB);\n\n\tfloat32 angleA = bodyA->GetAngle();\n\tfloat32 angleB = bodyB->GetAngle();\n\tangularOffset = angleB - angleA;\n}\n\nb2MotorJoint::b2MotorJoint(const b2MotorJointDef* def)\n: b2Joint(def)\n{\n\tm_linearOffset = def->linearOffset;\n\tm_angularOffset = def->angularOffset;\n\n\tm_linearImpulse.SetZero();\n\tm_angularImpulse = 0.0f;\n\n\tm_maxForce = def->maxForce;\n\tm_maxTorque = def->maxTorque;\n\tm_correctionFactor = def->correctionFactor;\n}\n\nvoid b2MotorJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\t// Compute the effective mass matrix.\n\tm_rA = b2Mul(qA, -m_localCenterA);\n\tm_rB = b2Mul(qB, -m_localCenterB);\n\n\t// J = [-I -r1_skew I r2_skew]\n\t//     [ 0       -1 0       1]\n\t// r_skew = [-ry; rx]\n\n\t// Matlab\n\t// K = [ mA+r1y^2*iA+mB+r2y^2*iB,  -r1y*iA*r1x-r2y*iB*r2x,          -r1y*iA-r2y*iB]\n\t//     [  -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB,           r1x*iA+r2x*iB]\n\t//     [          -r1y*iA-r2y*iB,           r1x*iA+r2x*iB,                   iA+iB]\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tb2Mat22 K;\n\tK.ex.x = mA + mB + iA * m_rA.y * m_rA.y + iB * m_rB.y * m_rB.y;\n\tK.ex.y = -iA * m_rA.x * m_rA.y - iB * m_rB.x * m_rB.y;\n\tK.ey.x = K.ex.y;\n\tK.ey.y = mA + mB + iA * m_rA.x * m_rA.x + iB * m_rB.x * m_rB.x;\n\n\tm_linearMass = K.GetInverse();\n\n\tm_angularMass = iA + iB;\n\tif (m_angularMass > 0.0f)\n\t{\n\t\tm_angularMass = 1.0f / m_angularMass;\n\t}\n\n\tm_linearError = cB + m_rB - cA - m_rA - b2Mul(qA, m_linearOffset);\n\tm_angularError = aB - aA - m_angularOffset;\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support a variable time step.\n\t\tm_linearImpulse *= data.step.dtRatio;\n\t\tm_angularImpulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P(m_linearImpulse.x, m_linearImpulse.y);\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + m_angularImpulse);\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + m_angularImpulse);\n\t}\n\telse\n\t{\n\t\tm_linearImpulse.SetZero();\n\t\tm_angularImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2MotorJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tfloat32 h = data.step.dt;\n\tfloat32 inv_h = data.step.inv_dt;\n\n\t// Solve angular friction\n\t{\n\t\tfloat32 Cdot = wB - wA + inv_h * m_correctionFactor * m_angularError;\n\t\tfloat32 impulse = -m_angularMass * Cdot;\n\n\t\tfloat32 oldImpulse = m_angularImpulse;\n\t\tfloat32 maxImpulse = h * m_maxTorque;\n\t\tm_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_angularImpulse - oldImpulse;\n\n\t\twA -= iA * impulse;\n\t\twB += iB * impulse;\n\t}\n\n\t// Solve linear friction\n\t{\n\t\tb2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA) + inv_h * m_correctionFactor * m_linearError;\n\n\t\tb2Vec2 impulse = -b2Mul(m_linearMass, Cdot);\n\t\tb2Vec2 oldImpulse = m_linearImpulse;\n\t\tm_linearImpulse += impulse;\n\n\t\tfloat32 maxImpulse = h * m_maxForce;\n\n\t\tif (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse)\n\t\t{\n\t\t\tm_linearImpulse.Normalize();\n\t\t\tm_linearImpulse *= maxImpulse;\n\t\t}\n\n\t\timpulse = m_linearImpulse - oldImpulse;\n\n\t\tvA -= mA * impulse;\n\t\twA -= iA * b2Cross(m_rA, impulse);\n\n\t\tvB += mB * impulse;\n\t\twB += iB * b2Cross(m_rB, impulse);\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2MotorJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tB2_NOT_USED(data);\n\n\treturn true;\n}\n\nb2Vec2 b2MotorJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetPosition();\n}\n\nb2Vec2 b2MotorJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetPosition();\n}\n\nb2Vec2 b2MotorJoint::GetReactionForce(float32 inv_dt) const\n{\n\treturn inv_dt * m_linearImpulse;\n}\n\nfloat32 b2MotorJoint::GetReactionTorque(float32 inv_dt) const\n{\n\treturn inv_dt * m_angularImpulse;\n}\n\nvoid b2MotorJoint::SetMaxForce(float32 force)\n{\n\tb2Assert(b2IsValid(force) && force >= 0.0f);\n\tm_maxForce = force;\n}\n\nfloat32 b2MotorJoint::GetMaxForce() const\n{\n\treturn m_maxForce;\n}\n\nvoid b2MotorJoint::SetMaxTorque(float32 torque)\n{\n\tb2Assert(b2IsValid(torque) && torque >= 0.0f);\n\tm_maxTorque = torque;\n}\n\nfloat32 b2MotorJoint::GetMaxTorque() const\n{\n\treturn m_maxTorque;\n}\n\nvoid b2MotorJoint::SetCorrectionFactor(float32 factor)\n{\n\tb2Assert(b2IsValid(factor) && 0.0f <= factor && factor <= 1.0f);\n\tm_correctionFactor = factor;\n}\n\nfloat32 b2MotorJoint::GetCorrectionFactor() const\n{\n\treturn m_correctionFactor;\n}\n\nvoid b2MotorJoint::SetLinearOffset(const b2Vec2& linearOffset)\n{\n\tif (linearOffset.x != m_linearOffset.x || linearOffset.y != m_linearOffset.y)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_linearOffset = linearOffset;\n\t}\n}\n\nconst b2Vec2& b2MotorJoint::GetLinearOffset() const\n{\n\treturn m_linearOffset;\n}\n\nvoid b2MotorJoint::SetAngularOffset(float32 angularOffset)\n{\n\tif (angularOffset != m_angularOffset)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_angularOffset = angularOffset;\n\t}\n}\n\nfloat32 b2MotorJoint::GetAngularOffset() const\n{\n\treturn m_angularOffset;\n}\n\nvoid b2MotorJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Log(\"  b2MotorJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.linearOffset.Set(%.15lef, %.15lef);\\n\", m_linearOffset.x, m_linearOffset.y);\n\tb2Log(\"  jd.angularOffset = %.15lef;\\n\", m_angularOffset);\n\tb2Log(\"  jd.maxForce = %.15lef;\\n\", m_maxForce);\n\tb2Log(\"  jd.maxTorque = %.15lef;\\n\", m_maxTorque);\n\tb2Log(\"  jd.correctionFactor = %.15lef;\\n\", m_correctionFactor);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2MouseJoint.cpp",
    "content": "/*\n* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2MouseJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// p = attached point, m = mouse point\n// C = p - m\n// Cdot = v\n//      = v + cross(w, r)\n// J = [I r_skew]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n\nb2MouseJoint::b2MouseJoint(const b2MouseJointDef* def)\n: b2Joint(def)\n{\n\tb2Assert(def->target.IsValid());\n\tb2Assert(b2IsValid(def->maxForce) && def->maxForce >= 0.0f);\n\tb2Assert(b2IsValid(def->frequencyHz) && def->frequencyHz >= 0.0f);\n\tb2Assert(b2IsValid(def->dampingRatio) && def->dampingRatio >= 0.0f);\n\n\tm_targetA = def->target;\n\tm_localAnchorB = b2MulT(m_bodyB->GetTransform(), m_targetA);\n\n\tm_maxForce = def->maxForce;\n\tm_impulse.SetZero();\n\n\tm_frequencyHz = def->frequencyHz;\n\tm_dampingRatio = def->dampingRatio;\n\n\tm_beta = 0.0f;\n\tm_gamma = 0.0f;\n}\n\nvoid b2MouseJoint::SetTarget(const b2Vec2& target)\n{\n\tif (m_bodyB->IsAwake() == false)\n\t{\n\t\tm_bodyB->SetAwake(true);\n\t}\n\tm_targetA = target;\n}\n\nconst b2Vec2& b2MouseJoint::GetTarget() const\n{\n\treturn m_targetA;\n}\n\nvoid b2MouseJoint::SetMaxForce(float32 force)\n{\n\tm_maxForce = force;\n}\n\nfloat32 b2MouseJoint::GetMaxForce() const\n{\n\treturn m_maxForce;\n}\n\nvoid b2MouseJoint::SetFrequency(float32 hz)\n{\n\tm_frequencyHz = hz;\n}\n\nfloat32 b2MouseJoint::GetFrequency() const\n{\n\treturn m_frequencyHz;\n}\n\nvoid b2MouseJoint::SetDampingRatio(float32 ratio)\n{\n\tm_dampingRatio = ratio;\n}\n\nfloat32 b2MouseJoint::GetDampingRatio() const\n{\n\treturn m_dampingRatio;\n}\n\nvoid b2MouseJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qB(aB);\n\n\tfloat32 mass = m_bodyB->GetMass();\n\n\t// Frequency\n\tfloat32 omega = 2.0f * b2_pi * m_frequencyHz;\n\n\t// Damping coefficient\n\tfloat32 d = 2.0f * mass * m_dampingRatio * omega;\n\n\t// Spring stiffness\n\tfloat32 k = mass * (omega * omega);\n\n\t// magic formulas\n\t// gamma has units of inverse mass.\n\t// beta has units of inverse time.\n\tfloat32 h = data.step.dt;\n\tb2Assert(d + h * k > b2_epsilon);\n\tm_gamma = h * (d + h * k);\n\tif (m_gamma != 0.0f)\n\t{\n\t\tm_gamma = 1.0f / m_gamma;\n\t}\n\tm_beta = h * k * m_gamma;\n\n\t// Compute the effective mass matrix.\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// K    = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * invI2 * skew(r2)]\n\t//      = [1/m1+1/m2     0    ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y -r1.x*r1.y]\n\t//        [    0     1/m1+1/m2]           [-r1.x*r1.y r1.x*r1.x]           [-r1.x*r1.y r1.x*r1.x]\n\tb2Mat22 K;\n\tK.ex.x = m_invMassB + m_invIB * m_rB.y * m_rB.y + m_gamma;\n\tK.ex.y = -m_invIB * m_rB.x * m_rB.y;\n\tK.ey.x = K.ex.y;\n\tK.ey.y = m_invMassB + m_invIB * m_rB.x * m_rB.x + m_gamma;\n\n\tm_mass = K.GetInverse();\n\n\tm_C = cB + m_rB - m_targetA;\n\tm_C *= m_beta;\n\n\t// Cheat with some damping\n\twB *= 0.98f;\n\n\tif (data.step.warmStarting)\n\t{\n\t\tm_impulse *= data.step.dtRatio;\n\t\tvB += m_invMassB * m_impulse;\n\t\twB += m_invIB * b2Cross(m_rB, m_impulse);\n\t}\n\telse\n\t{\n\t\tm_impulse.SetZero();\n\t}\n\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2MouseJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\t// Cdot = v + cross(w, r)\n\tb2Vec2 Cdot = vB + b2Cross(wB, m_rB);\n\tb2Vec2 impulse = b2Mul(m_mass, -(Cdot + m_C + m_gamma * m_impulse));\n\n\tb2Vec2 oldImpulse = m_impulse;\n\tm_impulse += impulse;\n\tfloat32 maxImpulse = data.step.dt * m_maxForce;\n\tif (m_impulse.LengthSquared() > maxImpulse * maxImpulse)\n\t{\n\t\tm_impulse *= maxImpulse / m_impulse.Length();\n\t}\n\timpulse = m_impulse - oldImpulse;\n\n\tvB += m_invMassB * impulse;\n\twB += m_invIB * b2Cross(m_rB, impulse);\n\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2MouseJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tB2_NOT_USED(data);\n\treturn true;\n}\n\nb2Vec2 b2MouseJoint::GetAnchorA() const\n{\n\treturn m_targetA;\n}\n\nb2Vec2 b2MouseJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2MouseJoint::GetReactionForce(float32 inv_dt) const\n{\n\treturn inv_dt * m_impulse;\n}\n\nfloat32 b2MouseJoint::GetReactionTorque(float32 inv_dt) const\n{\n\treturn inv_dt * 0.0f;\n}\n\nvoid b2MouseJoint::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\tm_targetA -= newOrigin;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2PolygonAndCircleContact.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n\n#include <new>\n\nb2Contact* b2PolygonAndCircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2PolygonAndCircleContact));\n\treturn new (mem) b2PolygonAndCircleContact(fixtureA, fixtureB);\n}\n\nvoid b2PolygonAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2PolygonAndCircleContact*)contact)->~b2PolygonAndCircleContact();\n\tallocator->Free(contact, sizeof(b2PolygonAndCircleContact));\n}\n\nb2PolygonAndCircleContact::b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_polygon);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_circle);\n}\n\nvoid b2PolygonAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollidePolygonAndCircle(\tmanifold,\n\t\t\t\t\t\t\t\t(b2PolygonShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t\t\t\t(b2CircleShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2PolygonContact.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonContact.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h\"\n\n#include <new>\n\nb2Contact* b2PolygonContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2PolygonContact));\n\treturn new (mem) b2PolygonContact(fixtureA, fixtureB);\n}\n\nvoid b2PolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2PolygonContact*)contact)->~b2PolygonContact();\n\tallocator->Free(contact, sizeof(b2PolygonContact));\n}\n\nb2PolygonContact::b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n\t: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_polygon);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_polygon);\n}\n\nvoid b2PolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollidePolygons(\tmanifold,\n\t\t\t\t\t\t(b2PolygonShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t\t(b2PolygonShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2PolygonShape.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\"\n#include <new>\n\nb2Shape* b2PolygonShape::Clone(b2BlockAllocator* allocator) const\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2PolygonShape));\n\tb2PolygonShape* clone = new (mem) b2PolygonShape;\n\t*clone = *this;\n\treturn clone;\n}\n\nvoid b2PolygonShape::SetAsBox(float32 hx, float32 hy)\n{\n\tm_count = 4;\n\tm_vertices[0].Set(-hx, -hy);\n\tm_vertices[1].Set( hx, -hy);\n\tm_vertices[2].Set( hx,  hy);\n\tm_vertices[3].Set(-hx,  hy);\n\tm_normals[0].Set(0.0f, -1.0f);\n\tm_normals[1].Set(1.0f, 0.0f);\n\tm_normals[2].Set(0.0f, 1.0f);\n\tm_normals[3].Set(-1.0f, 0.0f);\n\tm_centroid.SetZero();\n}\n\nvoid b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)\n{\n\tm_count = 4;\n\tm_vertices[0].Set(-hx, -hy);\n\tm_vertices[1].Set( hx, -hy);\n\tm_vertices[2].Set( hx,  hy);\n\tm_vertices[3].Set(-hx,  hy);\n\tm_normals[0].Set(0.0f, -1.0f);\n\tm_normals[1].Set(1.0f, 0.0f);\n\tm_normals[2].Set(0.0f, 1.0f);\n\tm_normals[3].Set(-1.0f, 0.0f);\n\tm_centroid = center;\n\n\tb2Transform xf;\n\txf.p = center;\n\txf.q.Set(angle);\n\n\t// Transform vertices and normals.\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tm_vertices[i] = b2Mul(xf, m_vertices[i]);\n\t\tm_normals[i] = b2Mul(xf.q, m_normals[i]);\n\t}\n}\n\nint32 b2PolygonShape::GetChildCount() const\n{\n\treturn 1;\n}\n\nstatic b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count)\n{\n\tb2Assert(count >= 3);\n\n\tb2Vec2 c; c.Set(0.0f, 0.0f);\n\tfloat32 area = 0.0f;\n\n\t// pRef is the reference point for forming triangles.\n\t// It's location doesn't change the result (except for rounding error).\n\tb2Vec2 pRef(0.0f, 0.0f);\n#if 0\n\t// This code would put the reference point inside the polygon.\n\tfor (int32 i = 0; i < count; ++i)\n\t{\n\t\tpRef += vs[i];\n\t}\n\tpRef *= 1.0f / count;\n#endif\n\n\tconst float32 inv3 = 1.0f / 3.0f;\n\n\tfor (int32 i = 0; i < count; ++i)\n\t{\n\t\t// Triangle vertices.\n\t\tb2Vec2 p1 = pRef;\n\t\tb2Vec2 p2 = vs[i];\n\t\tb2Vec2 p3 = i + 1 < count ? vs[i+1] : vs[0];\n\n\t\tb2Vec2 e1 = p2 - p1;\n\t\tb2Vec2 e2 = p3 - p1;\n\n\t\tfloat32 D = b2Cross(e1, e2);\n\n\t\tfloat32 triangleArea = 0.5f * D;\n\t\tarea += triangleArea;\n\n\t\t// Area weighted centroid\n\t\tc += triangleArea * inv3 * (p1 + p2 + p3);\n\t}\n\n\t// Centroid\n\tb2Assert(area > b2_epsilon);\n\tc *= 1.0f / area;\n\treturn c;\n}\n\nvoid b2PolygonShape::Set(const b2Vec2* vertices, int32 count)\n{\n\tb2Assert(3 <= count && count <= b2_maxPolygonVertices);\n\tif (count < 3)\n\t{\n\t\tSetAsBox(1.0f, 1.0f);\n\t\treturn;\n\t}\n\n\tint32 n = b2Min(count, b2_maxPolygonVertices);\n\n\t// Perform welding and copy vertices into local buffer.\n\tb2Vec2 ps[b2_maxPolygonVertices];\n\tint32 tempCount = 0;\n\tfor (int32 i = 0; i < n; ++i)\n\t{\n\t\tb2Vec2 v = vertices[i];\n\n\t\tbool unique = true;\n\t\tfor (int32 j = 0; j < tempCount; ++j)\n\t\t{\n\t\t\tif (b2DistanceSquared(v, ps[j]) < 0.5f * b2_linearSlop)\n\t\t\t{\n\t\t\t\tunique = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (unique)\n\t\t{\n\t\t\tps[tempCount++] = v;\n\t\t}\n\t}\n\n\tn = tempCount;\n\tif (n < 3)\n\t{\n\t\t// Polygon is degenerate.\n\t\tb2Assert(false);\n\t\tSetAsBox(1.0f, 1.0f);\n\t\treturn;\n\t}\n\n\t// Create the convex hull using the Gift wrapping algorithm\n\t// http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n\t// Find the right most point on the hull\n\tint32 i0 = 0;\n\tfloat32 x0 = ps[0].x;\n\tfor (int32 i = 1; i < n; ++i)\n\t{\n\t\tfloat32 x = ps[i].x;\n\t\tif (x > x0 || (x == x0 && ps[i].y < ps[i0].y))\n\t\t{\n\t\t\ti0 = i;\n\t\t\tx0 = x;\n\t\t}\n\t}\n\n\tint32 hull[b2_maxPolygonVertices];\n\tint32 m = 0;\n\tint32 ih = i0;\n\n\tfor (;;)\n\t{\n\t\thull[m] = ih;\n\n\t\tint32 ie = 0;\n\t\tfor (int32 j = 1; j < n; ++j)\n\t\t{\n\t\t\tif (ie == ih)\n\t\t\t{\n\t\t\t\tie = j;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tb2Vec2 r = ps[ie] - ps[hull[m]];\n\t\t\tb2Vec2 v = ps[j] - ps[hull[m]];\n\t\t\tfloat32 c = b2Cross(r, v);\n\t\t\tif (c < 0.0f)\n\t\t\t{\n\t\t\t\tie = j;\n\t\t\t}\n\n\t\t\t// Collinearity check\n\t\t\tif (c == 0.0f && v.LengthSquared() > r.LengthSquared())\n\t\t\t{\n\t\t\t\tie = j;\n\t\t\t}\n\t\t}\n\n\t\t++m;\n\t\tih = ie;\n\n\t\tif (ie == i0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tm_count = m;\n\n\t// Copy vertices.\n\tfor (int32 i = 0; i < m; ++i)\n\t{\n\t\tm_vertices[i] = ps[hull[i]];\n\t}\n\n\t// Compute normals. Ensure the edges have non-zero length.\n\tfor (int32 i = 0; i < m; ++i)\n\t{\n\t\tint32 i1 = i;\n\t\tint32 i2 = i + 1 < m ? i + 1 : 0;\n\t\tb2Vec2 edge = m_vertices[i2] - m_vertices[i1];\n\t\tb2Assert(edge.LengthSquared() > b2_epsilon * b2_epsilon);\n\t\tm_normals[i] = b2Cross(edge, 1.0f);\n\t\tm_normals[i].Normalize();\n\t}\n\n\t// Compute the polygon centroid.\n\tm_centroid = ComputeCentroid(m_vertices, m);\n}\n\nbool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const\n{\n\tb2Vec2 pLocal = b2MulT(xf.q, p - xf.p);\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tfloat32 dot = b2Dot(m_normals[i], pLocal - m_vertices[i]);\n\t\tif (dot > 0.0f)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nbool b2PolygonShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\t\t\tconst b2Transform& xf, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\t// Put the ray into the polygon's frame of reference.\n\tb2Vec2 p1 = b2MulT(xf.q, input.p1 - xf.p);\n\tb2Vec2 p2 = b2MulT(xf.q, input.p2 - xf.p);\n\tb2Vec2 d = p2 - p1;\n\n\tfloat32 lower = 0.0f, upper = input.maxFraction;\n\n\tint32 index = -1;\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\t// p = p1 + a * d\n\t\t// dot(normal, p - v) = 0\n\t\t// dot(normal, p1 - v) + a * dot(normal, d) = 0\n\t\tfloat32 numerator = b2Dot(m_normals[i], m_vertices[i] - p1);\n\t\tfloat32 denominator = b2Dot(m_normals[i], d);\n\n\t\tif (denominator == 0.0f)\n\t\t{\n\t\t\tif (numerator < 0.0f)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Note: we want this predicate without division:\n\t\t\t// lower < numerator / denominator, where denominator < 0\n\t\t\t// Since denominator < 0, we have to flip the inequality:\n\t\t\t// lower < numerator / denominator <==> denominator * lower > numerator.\n\t\t\tif (denominator < 0.0f && numerator < lower * denominator)\n\t\t\t{\n\t\t\t\t// Increase lower.\n\t\t\t\t// The segment enters this half-space.\n\t\t\t\tlower = numerator / denominator;\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t\telse if (denominator > 0.0f && numerator < upper * denominator)\n\t\t\t{\n\t\t\t\t// Decrease upper.\n\t\t\t\t// The segment exits this half-space.\n\t\t\t\tupper = numerator / denominator;\n\t\t\t}\n\t\t}\n\n\t\t// The use of epsilon here causes the assert on lower to trip\n\t\t// in some cases. Apparently the use of epsilon was to make edge\n\t\t// shapes work, but now those are handled separately.\n\t\t//if (upper < lower - b2_epsilon)\n\t\tif (upper < lower)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tb2Assert(0.0f <= lower && lower <= input.maxFraction);\n\n\tif (index >= 0)\n\t{\n\t\toutput->fraction = lower;\n\t\toutput->normal = b2Mul(xf.q, m_normals[index]);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nvoid b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\tb2Vec2 lower = b2Mul(xf, m_vertices[0]);\n\tb2Vec2 upper = lower;\n\n\tfor (int32 i = 1; i < m_count; ++i)\n\t{\n\t\tb2Vec2 v = b2Mul(xf, m_vertices[i]);\n\t\tlower = b2Min(lower, v);\n\t\tupper = b2Max(upper, v);\n\t}\n\n\tb2Vec2 r(m_radius, m_radius);\n\taabb->lowerBound = lower - r;\n\taabb->upperBound = upper + r;\n}\n\nvoid b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const\n{\n\t// Polygon mass, centroid, and inertia.\n\t// Let rho be the polygon density in mass per unit area.\n\t// Then:\n\t// mass = rho * int(dA)\n\t// centroid.x = (1/mass) * rho * int(x * dA)\n\t// centroid.y = (1/mass) * rho * int(y * dA)\n\t// I = rho * int((x*x + y*y) * dA)\n\t//\n\t// We can compute these integrals by summing all the integrals\n\t// for each triangle of the polygon. To evaluate the integral\n\t// for a single triangle, we make a change of variables to\n\t// the (u,v) coordinates of the triangle:\n\t// x = x0 + e1x * u + e2x * v\n\t// y = y0 + e1y * u + e2y * v\n\t// where 0 <= u && 0 <= v && u + v <= 1.\n\t//\n\t// We integrate u from [0,1-v] and then v from [0,1].\n\t// We also need to use the Jacobian of the transformation:\n\t// D = cross(e1, e2)\n\t//\n\t// Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n\t//\n\t// The rest of the derivation is handled by computer algebra.\n\n\tb2Assert(m_count >= 3);\n\n\tb2Vec2 center; center.Set(0.0f, 0.0f);\n\tfloat32 area = 0.0f;\n\tfloat32 I = 0.0f;\n\n\t// s is the reference point for forming triangles.\n\t// It's location doesn't change the result (except for rounding error).\n\tb2Vec2 s(0.0f, 0.0f);\n\n\t// This code would put the reference point inside the polygon.\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\ts += m_vertices[i];\n\t}\n\ts *= 1.0f / m_count;\n\n\tconst float32 k_inv3 = 1.0f / 3.0f;\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\t// Triangle vertices.\n\t\tb2Vec2 e1 = m_vertices[i] - s;\n\t\tb2Vec2 e2 = i + 1 < m_count ? m_vertices[i+1] - s : m_vertices[0] - s;\n\n\t\tfloat32 D = b2Cross(e1, e2);\n\n\t\tfloat32 triangleArea = 0.5f * D;\n\t\tarea += triangleArea;\n\n\t\t// Area weighted centroid\n\t\tcenter += triangleArea * k_inv3 * (e1 + e2);\n\n\t\tfloat32 ex1 = e1.x, ey1 = e1.y;\n\t\tfloat32 ex2 = e2.x, ey2 = e2.y;\n\n\t\tfloat32 intx2 = ex1*ex1 + ex2*ex1 + ex2*ex2;\n\t\tfloat32 inty2 = ey1*ey1 + ey2*ey1 + ey2*ey2;\n\n\t\tI += (0.25f * k_inv3 * D) * (intx2 + inty2);\n\t}\n\n\t// Total mass\n\tmassData->mass = density * area;\n\n\t// Center of mass\n\tb2Assert(area > b2_epsilon);\n\tcenter *= 1.0f / area;\n\tmassData->center = center + s;\n\n\t// Inertia tensor relative to the local origin (point s).\n\tmassData->I = density * I;\n\n\t// Shift to center of mass then to original body origin.\n\tmassData->I += massData->mass * (b2Dot(massData->center, massData->center) - b2Dot(center, center));\n}\n\nbool b2PolygonShape::Validate() const\n{\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tint32 i1 = i;\n\t\tint32 i2 = i < m_count - 1 ? i1 + 1 : 0;\n\t\tb2Vec2 p = m_vertices[i1];\n\t\tb2Vec2 e = m_vertices[i2] - p;\n\n\t\tfor (int32 j = 0; j < m_count; ++j)\n\t\t{\n\t\t\tif (j == i1 || j == i2)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tb2Vec2 v = m_vertices[j] - p;\n\t\t\tfloat32 c = b2Cross(e, v);\n\t\t\tif (c < 0.0f)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2PrismaticJoint.cpp",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// Linear constraint (point-to-line)\n// d = p2 - p1 = x2 + r2 - x1 - r1\n// C = dot(perp, d)\n// Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n//      = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + dot(cross(r2, perp), v2)\n// J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n//\n// Angular constraint\n// C = a2 - a1 + a_initial\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n//\n// K = J * invM * JT\n//\n// J = [-a -s1 a s2]\n//     [0  -1  0  1]\n// a = perp\n// s1 = cross(d + r1, a) = cross(p2 - x1, a)\n// s2 = cross(r2, a) = cross(p2 - x2, a)\n\n\n// Motor/Limit linear constraint\n// C = dot(ax1, d)\n// Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + dot(cross(r2, ax1), v2)\n// J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n// Block Solver\n// We develop a block solver that includes the joint limit. This makes the limit stiff (inelastic) even\n// when the mass has poor distribution (leading to large torques about the joint anchor points).\n//\n// The Jacobian has 3 rows:\n// J = [-uT -s1 uT s2] // linear\n//     [0   -1   0  1] // angular\n//     [-vT -a1 vT a2] // limit\n//\n// u = perp\n// v = axis\n// s1 = cross(d + r1, u), s2 = cross(r2, u)\n// a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n// M * (v2 - v1) = JT * df\n// J * v2 = bias\n//\n// v2 = v1 + invM * JT * df\n// J * (v1 + invM * JT * df) = bias\n// K * df = bias - J * v1 = -Cdot\n// K = J * invM * JT\n// Cdot = J * v1 - bias\n//\n// Now solve for f2.\n// df = f2 - f1\n// K * (f2 - f1) = -Cdot\n// f2 = invK * (-Cdot) + f1\n//\n// Clamp accumulated limit impulse.\n// lower: f2(3) = max(f2(3), 0)\n// upper: f2(3) = min(f2(3), 0)\n//\n// Solve for correct f2(1:2)\n// K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n//                       = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n// 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)\n// f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + f1(1:2)\n//\n// Now compute impulse to be applied:\n// df = f2 - f1\n\nvoid b2PrismaticJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor, const b2Vec2& axis)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n\tlocalAxisA = bodyA->GetLocalVector(axis);\n\treferenceAngle = bodyB->GetAngle() - bodyA->GetAngle();\n}\n\nb2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_localXAxisA = def->localAxisA;\n\tm_localXAxisA.Normalize();\n\tm_localYAxisA = b2Cross(1.0f, m_localXAxisA);\n\tm_referenceAngle = def->referenceAngle;\n\n\tm_impulse.SetZero();\n\tm_motorMass = 0.0f;\n\tm_motorImpulse = 0.0f;\n\n\tm_lowerTranslation = def->lowerTranslation;\n\tm_upperTranslation = def->upperTranslation;\n\tm_maxMotorForce = def->maxMotorForce;\n\tm_motorSpeed = def->motorSpeed;\n\tm_enableLimit = def->enableLimit;\n\tm_enableMotor = def->enableMotor;\n\tm_limitState = e_inactiveLimit;\n\n\tm_axis.SetZero();\n\tm_perp.SetZero();\n}\n\nvoid b2PrismaticJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\t// Compute the effective masses.\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 d = (cB - cA) + rB - rA;\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\t// Compute motor Jacobian and effective mass.\n\t{\n\t\tm_axis = b2Mul(qA, m_localXAxisA);\n\t\tm_a1 = b2Cross(d + rA, m_axis);\n\t\tm_a2 = b2Cross(rB, m_axis);\n\n\t\tm_motorMass = mA + mB + iA * m_a1 * m_a1 + iB * m_a2 * m_a2;\n\t\tif (m_motorMass > 0.0f)\n\t\t{\n\t\t\tm_motorMass = 1.0f / m_motorMass;\n\t\t}\n\t}\n\n\t// Prismatic constraint.\n\t{\n\t\tm_perp = b2Mul(qA, m_localYAxisA);\n\n\t\tm_s1 = b2Cross(d + rA, m_perp);\n\t\tm_s2 = b2Cross(rB, m_perp);\n\n\t\tfloat32 k11 = mA + mB + iA * m_s1 * m_s1 + iB * m_s2 * m_s2;\n\t\tfloat32 k12 = iA * m_s1 + iB * m_s2;\n\t\tfloat32 k13 = iA * m_s1 * m_a1 + iB * m_s2 * m_a2;\n\t\tfloat32 k22 = iA + iB;\n\t\tif (k22 == 0.0f)\n\t\t{\n\t\t\t// For bodies with fixed rotation.\n\t\t\tk22 = 1.0f;\n\t\t}\n\t\tfloat32 k23 = iA * m_a1 + iB * m_a2;\n\t\tfloat32 k33 = mA + mB + iA * m_a1 * m_a1 + iB * m_a2 * m_a2;\n\n\t\tm_K.ex.Set(k11, k12, k13);\n\t\tm_K.ey.Set(k12, k22, k23);\n\t\tm_K.ez.Set(k13, k23, k33);\n\t}\n\n\t// Compute motor and limit terms.\n\tif (m_enableLimit)\n\t{\n\t\tfloat32 jointTranslation = b2Dot(m_axis, d);\n\t\tif (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop)\n\t\t{\n\t\t\tm_limitState = e_equalLimits;\n\t\t}\n\t\telse if (jointTranslation <= m_lowerTranslation)\n\t\t{\n\t\t\tif (m_limitState != e_atLowerLimit)\n\t\t\t{\n\t\t\t\tm_limitState = e_atLowerLimit;\n\t\t\t\tm_impulse.z = 0.0f;\n\t\t\t}\n\t\t}\n\t\telse if (jointTranslation >= m_upperTranslation)\n\t\t{\n\t\t\tif (m_limitState != e_atUpperLimit)\n\t\t\t{\n\t\t\t\tm_limitState = e_atUpperLimit;\n\t\t\t\tm_impulse.z = 0.0f;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_limitState = e_inactiveLimit;\n\t\t\tm_impulse.z = 0.0f;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_limitState = e_inactiveLimit;\n\t\tm_impulse.z = 0.0f;\n\t}\n\n\tif (m_enableMotor == false)\n\t{\n\t\tm_motorImpulse = 0.0f;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Account for variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\t\tm_motorImpulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P = m_impulse.x * m_perp + (m_motorImpulse + m_impulse.z) * m_axis;\n\t\tfloat32 LA = m_impulse.x * m_s1 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a1;\n\t\tfloat32 LB = m_impulse.x * m_s2 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a2;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\telse\n\t{\n\t\tm_impulse.SetZero();\n\t\tm_motorImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2PrismaticJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\t// Solve linear motor constraint.\n\tif (m_enableMotor && m_limitState != e_equalLimits)\n\t{\n\t\tfloat32 Cdot = b2Dot(m_axis, vB - vA) + m_a2 * wB - m_a1 * wA;\n\t\tfloat32 impulse = m_motorMass * (m_motorSpeed - Cdot);\n\t\tfloat32 oldImpulse = m_motorImpulse;\n\t\tfloat32 maxImpulse = data.step.dt * m_maxMotorForce;\n\t\tm_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_motorImpulse - oldImpulse;\n\n\t\tb2Vec2 P = impulse * m_axis;\n\t\tfloat32 LA = impulse * m_a1;\n\t\tfloat32 LB = impulse * m_a2;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\n\tb2Vec2 Cdot1;\n\tCdot1.x = b2Dot(m_perp, vB - vA) + m_s2 * wB - m_s1 * wA;\n\tCdot1.y = wB - wA;\n\n\tif (m_enableLimit && m_limitState != e_inactiveLimit)\n\t{\n\t\t// Solve prismatic and limit constraint in block form.\n\t\tfloat32 Cdot2;\n\t\tCdot2 = b2Dot(m_axis, vB - vA) + m_a2 * wB - m_a1 * wA;\n\t\tb2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2);\n\n\t\tb2Vec3 f1 = m_impulse;\n\t\tb2Vec3 df =  m_K.Solve33(-Cdot);\n\t\tm_impulse += df;\n\n\t\tif (m_limitState == e_atLowerLimit)\n\t\t{\n\t\t\tm_impulse.z = b2Max(m_impulse.z, 0.0f);\n\t\t}\n\t\telse if (m_limitState == e_atUpperLimit)\n\t\t{\n\t\t\tm_impulse.z = b2Min(m_impulse.z, 0.0f);\n\t\t}\n\n\t\t// f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + f1(1:2)\n\t\tb2Vec2 b = -Cdot1 - (m_impulse.z - f1.z) * b2Vec2(m_K.ez.x, m_K.ez.y);\n\t\tb2Vec2 f2r = m_K.Solve22(b) + b2Vec2(f1.x, f1.y);\n\t\tm_impulse.x = f2r.x;\n\t\tm_impulse.y = f2r.y;\n\n\t\tdf = m_impulse - f1;\n\n\t\tb2Vec2 P = df.x * m_perp + df.z * m_axis;\n\t\tfloat32 LA = df.x * m_s1 + df.y + df.z * m_a1;\n\t\tfloat32 LB = df.x * m_s2 + df.y + df.z * m_a2;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\telse\n\t{\n\t\t// Limit is inactive, just solve the prismatic constraint in block form.\n\t\tb2Vec2 df = m_K.Solve22(-Cdot1);\n\t\tm_impulse.x += df.x;\n\t\tm_impulse.y += df.y;\n\n\t\tb2Vec2 P = df.x * m_perp;\n\t\tfloat32 LA = df.x * m_s1 + df.y;\n\t\tfloat32 LB = df.x * m_s2 + df.y;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2PrismaticJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\t// Compute fresh Jacobians\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 d = cB + rB - cA - rA;\n\n\tb2Vec2 axis = b2Mul(qA, m_localXAxisA);\n\tfloat32 a1 = b2Cross(d + rA, axis);\n\tfloat32 a2 = b2Cross(rB, axis);\n\tb2Vec2 perp = b2Mul(qA, m_localYAxisA);\n\n\tfloat32 s1 = b2Cross(d + rA, perp);\n\tfloat32 s2 = b2Cross(rB, perp);\n\n\tb2Vec3 impulse;\n\tb2Vec2 C1;\n\tC1.x = b2Dot(perp, d);\n\tC1.y = aB - aA - m_referenceAngle;\n\n\tfloat32 linearError = b2Abs(C1.x);\n\tfloat32 angularError = b2Abs(C1.y);\n\n\tbool active = false;\n\tfloat32 C2 = 0.0f;\n\tif (m_enableLimit)\n\t{\n\t\tfloat32 translation = b2Dot(axis, d);\n\t\tif (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop)\n\t\t{\n\t\t\t// Prevent large angular corrections\n\t\t\tC2 = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection);\n\t\t\tlinearError = b2Max(linearError, b2Abs(translation));\n\t\t\tactive = true;\n\t\t}\n\t\telse if (translation <= m_lowerTranslation)\n\t\t{\n\t\t\t// Prevent large linear corrections and allow some slop.\n\t\t\tC2 = b2Clamp(translation - m_lowerTranslation + b2_linearSlop, -b2_maxLinearCorrection, 0.0f);\n\t\t\tlinearError = b2Max(linearError, m_lowerTranslation - translation);\n\t\t\tactive = true;\n\t\t}\n\t\telse if (translation >= m_upperTranslation)\n\t\t{\n\t\t\t// Prevent large linear corrections and allow some slop.\n\t\t\tC2 = b2Clamp(translation - m_upperTranslation - b2_linearSlop, 0.0f, b2_maxLinearCorrection);\n\t\t\tlinearError = b2Max(linearError, translation - m_upperTranslation);\n\t\t\tactive = true;\n\t\t}\n\t}\n\n\tif (active)\n\t{\n\t\tfloat32 k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2;\n\t\tfloat32 k12 = iA * s1 + iB * s2;\n\t\tfloat32 k13 = iA * s1 * a1 + iB * s2 * a2;\n\t\tfloat32 k22 = iA + iB;\n\t\tif (k22 == 0.0f)\n\t\t{\n\t\t\t// For fixed rotation\n\t\t\tk22 = 1.0f;\n\t\t}\n\t\tfloat32 k23 = iA * a1 + iB * a2;\n\t\tfloat32 k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2;\n\n\t\tb2Mat33 K;\n\t\tK.ex.Set(k11, k12, k13);\n\t\tK.ey.Set(k12, k22, k23);\n\t\tK.ez.Set(k13, k23, k33);\n\n\t\tb2Vec3 C;\n\t\tC.x = C1.x;\n\t\tC.y = C1.y;\n\t\tC.z = C2;\n\n\t\timpulse = K.Solve33(-C);\n\t}\n\telse\n\t{\n\t\tfloat32 k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2;\n\t\tfloat32 k12 = iA * s1 + iB * s2;\n\t\tfloat32 k22 = iA + iB;\n\t\tif (k22 == 0.0f)\n\t\t{\n\t\t\tk22 = 1.0f;\n\t\t}\n\n\t\tb2Mat22 K;\n\t\tK.ex.Set(k11, k12);\n\t\tK.ey.Set(k12, k22);\n\n\t\tb2Vec2 impulse1 = K.Solve(-C1);\n\t\timpulse.x = impulse1.x;\n\t\timpulse.y = impulse1.y;\n\t\timpulse.z = 0.0f;\n\t}\n\n\tb2Vec2 P = impulse.x * perp + impulse.z * axis;\n\tfloat32 LA = impulse.x * s1 + impulse.y + impulse.z * a1;\n\tfloat32 LB = impulse.x * s2 + impulse.y + impulse.z * a2;\n\n\tcA -= mA * P;\n\taA -= iA * LA;\n\tcB += mB * P;\n\taB += iB * LB;\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn linearError <= b2_linearSlop && angularError <= b2_angularSlop;\n}\n\nb2Vec2 b2PrismaticJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2PrismaticJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2PrismaticJoint::GetReactionForce(float32 inv_dt) const\n{\n\treturn inv_dt * (m_impulse.x * m_perp + (m_motorImpulse + m_impulse.z) * m_axis);\n}\n\nfloat32 b2PrismaticJoint::GetReactionTorque(float32 inv_dt) const\n{\n\treturn inv_dt * m_impulse.y;\n}\n\nfloat32 b2PrismaticJoint::GetJointTranslation() const\n{\n\tb2Vec2 pA = m_bodyA->GetWorldPoint(m_localAnchorA);\n\tb2Vec2 pB = m_bodyB->GetWorldPoint(m_localAnchorB);\n\tb2Vec2 d = pB - pA;\n\tb2Vec2 axis = m_bodyA->GetWorldVector(m_localXAxisA);\n\n\tfloat32 translation = b2Dot(d, axis);\n\treturn translation;\n}\n\nfloat32 b2PrismaticJoint::GetJointSpeed() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\n\tb2Vec2 rA = b2Mul(bA->m_xf.q, m_localAnchorA - bA->m_sweep.localCenter);\n\tb2Vec2 rB = b2Mul(bB->m_xf.q, m_localAnchorB - bB->m_sweep.localCenter);\n\tb2Vec2 p1 = bA->m_sweep.c + rA;\n\tb2Vec2 p2 = bB->m_sweep.c + rB;\n\tb2Vec2 d = p2 - p1;\n\tb2Vec2 axis = b2Mul(bA->m_xf.q, m_localXAxisA);\n\n\tb2Vec2 vA = bA->m_linearVelocity;\n\tb2Vec2 vB = bB->m_linearVelocity;\n\tfloat32 wA = bA->m_angularVelocity;\n\tfloat32 wB = bB->m_angularVelocity;\n\n\tfloat32 speed = b2Dot(d, b2Cross(wA, axis)) + b2Dot(axis, vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA));\n\treturn speed;\n}\n\nbool b2PrismaticJoint::IsLimitEnabled() const\n{\n\treturn m_enableLimit;\n}\n\nvoid b2PrismaticJoint::EnableLimit(bool flag)\n{\n\tif (flag != m_enableLimit)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_enableLimit = flag;\n\t\tm_impulse.z = 0.0f;\n\t}\n}\n\nfloat32 b2PrismaticJoint::GetLowerLimit() const\n{\n\treturn m_lowerTranslation;\n}\n\nfloat32 b2PrismaticJoint::GetUpperLimit() const\n{\n\treturn m_upperTranslation;\n}\n\nvoid b2PrismaticJoint::SetLimits(float32 lower, float32 upper)\n{\n\tb2Assert(lower <= upper);\n\tif (lower != m_lowerTranslation || upper != m_upperTranslation)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_lowerTranslation = lower;\n\t\tm_upperTranslation = upper;\n\t\tm_impulse.z = 0.0f;\n\t}\n}\n\nbool b2PrismaticJoint::IsMotorEnabled() const\n{\n\treturn m_enableMotor;\n}\n\nvoid b2PrismaticJoint::EnableMotor(bool flag)\n{\n\tm_bodyA->SetAwake(true);\n\tm_bodyB->SetAwake(true);\n\tm_enableMotor = flag;\n}\n\nvoid b2PrismaticJoint::SetMotorSpeed(float32 speed)\n{\n\tm_bodyA->SetAwake(true);\n\tm_bodyB->SetAwake(true);\n\tm_motorSpeed = speed;\n}\n\nvoid b2PrismaticJoint::SetMaxMotorForce(float32 force)\n{\n\tm_bodyA->SetAwake(true);\n\tm_bodyB->SetAwake(true);\n\tm_maxMotorForce = force;\n}\n\nfloat32 b2PrismaticJoint::GetMotorForce(float32 inv_dt) const\n{\n\treturn inv_dt * m_motorImpulse;\n}\n\nvoid b2PrismaticJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Log(\"  b2PrismaticJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.localAnchorA.Set(%.15lef, %.15lef);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Log(\"  jd.localAnchorB.Set(%.15lef, %.15lef);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Log(\"  jd.localAxisA.Set(%.15lef, %.15lef);\\n\", m_localXAxisA.x, m_localXAxisA.y);\n\tb2Log(\"  jd.referenceAngle = %.15lef;\\n\", m_referenceAngle);\n\tb2Log(\"  jd.enableLimit = bool(%d);\\n\", m_enableLimit);\n\tb2Log(\"  jd.lowerTranslation = %.15lef;\\n\", m_lowerTranslation);\n\tb2Log(\"  jd.upperTranslation = %.15lef;\\n\", m_upperTranslation);\n\tb2Log(\"  jd.enableMotor = bool(%d);\\n\", m_enableMotor);\n\tb2Log(\"  jd.motorSpeed = %.15lef;\\n\", m_motorSpeed);\n\tb2Log(\"  jd.maxMotorForce = %.15lef;\\n\", m_maxMotorForce);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2PulleyJoint.cpp",
    "content": "/*\n* Copyright (c) 2007 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// Pulley:\n// length1 = norm(p1 - s1)\n// length2 = norm(p2 - s2)\n// C0 = (length1 + ratio * length2)_initial\n// C = C0 - (length1 + ratio * length2)\n// u1 = (p1 - s1) / norm(p1 - s1)\n// u2 = (p2 - s2) / norm(p2 - s2)\n// Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n// J = -[u1 cross(r1, u1) ratio * u2  ratio * cross(r2, u2)]\n// K = J * invM * JT\n//   = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * cross(r2, u2)^2)\n\nvoid b2PulleyJointDef::Initialize(b2Body* bA, b2Body* bB,\n\t\t\t\tconst b2Vec2& groundA, const b2Vec2& groundB,\n\t\t\t\tconst b2Vec2& anchorA, const b2Vec2& anchorB,\n\t\t\t\tfloat32 r)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tgroundAnchorA = groundA;\n\tgroundAnchorB = groundB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchorA);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchorB);\n\tb2Vec2 dA = anchorA - groundA;\n\tlengthA = dA.Length();\n\tb2Vec2 dB = anchorB - groundB;\n\tlengthB = dB.Length();\n\tratio = r;\n\tb2Assert(ratio > b2_epsilon);\n}\n\nb2PulleyJoint::b2PulleyJoint(const b2PulleyJointDef* def)\n: b2Joint(def)\n{\n\tm_groundAnchorA = def->groundAnchorA;\n\tm_groundAnchorB = def->groundAnchorB;\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\n\tm_lengthA = def->lengthA;\n\tm_lengthB = def->lengthB;\n\n\tb2Assert(def->ratio != 0.0f);\n\tm_ratio = def->ratio;\n\n\tm_constant = def->lengthA + m_ratio * def->lengthB;\n\n\tm_impulse = 0.0f;\n}\n\nvoid b2PulleyJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// Get the pulley axes.\n\tm_uA = cA + m_rA - m_groundAnchorA;\n\tm_uB = cB + m_rB - m_groundAnchorB;\n\n\tfloat32 lengthA = m_uA.Length();\n\tfloat32 lengthB = m_uB.Length();\n\n\tif (lengthA > 10.0f * b2_linearSlop)\n\t{\n\t\tm_uA *= 1.0f / lengthA;\n\t}\n\telse\n\t{\n\t\tm_uA.SetZero();\n\t}\n\n\tif (lengthB > 10.0f * b2_linearSlop)\n\t{\n\t\tm_uB *= 1.0f / lengthB;\n\t}\n\telse\n\t{\n\t\tm_uB.SetZero();\n\t}\n\n\t// Compute effective mass.\n\tfloat32 ruA = b2Cross(m_rA, m_uA);\n\tfloat32 ruB = b2Cross(m_rB, m_uB);\n\n\tfloat32 mA = m_invMassA + m_invIA * ruA * ruA;\n\tfloat32 mB = m_invMassB + m_invIB * ruB * ruB;\n\n\tm_mass = mA + m_ratio * m_ratio * mB;\n\n\tif (m_mass > 0.0f)\n\t{\n\t\tm_mass = 1.0f / m_mass;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support variable time steps.\n\t\tm_impulse *= data.step.dtRatio;\n\n\t\t// Warm starting.\n\t\tb2Vec2 PA = -(m_impulse) * m_uA;\n\t\tb2Vec2 PB = (-m_ratio * m_impulse) * m_uB;\n\n\t\tvA += m_invMassA * PA;\n\t\twA += m_invIA * b2Cross(m_rA, PA);\n\t\tvB += m_invMassB * PB;\n\t\twB += m_invIB * b2Cross(m_rB, PB);\n\t}\n\telse\n\t{\n\t\tm_impulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2PulleyJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Vec2 vpA = vA + b2Cross(wA, m_rA);\n\tb2Vec2 vpB = vB + b2Cross(wB, m_rB);\n\n\tfloat32 Cdot = -b2Dot(m_uA, vpA) - m_ratio * b2Dot(m_uB, vpB);\n\tfloat32 impulse = -m_mass * Cdot;\n\tm_impulse += impulse;\n\n\tb2Vec2 PA = -impulse * m_uA;\n\tb2Vec2 PB = -m_ratio * impulse * m_uB;\n\tvA += m_invMassA * PA;\n\twA += m_invIA * b2Cross(m_rA, PA);\n\tvB += m_invMassB * PB;\n\twB += m_invIB * b2Cross(m_rB, PB);\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2PulleyJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// Get the pulley axes.\n\tb2Vec2 uA = cA + rA - m_groundAnchorA;\n\tb2Vec2 uB = cB + rB - m_groundAnchorB;\n\n\tfloat32 lengthA = uA.Length();\n\tfloat32 lengthB = uB.Length();\n\n\tif (lengthA > 10.0f * b2_linearSlop)\n\t{\n\t\tuA *= 1.0f / lengthA;\n\t}\n\telse\n\t{\n\t\tuA.SetZero();\n\t}\n\n\tif (lengthB > 10.0f * b2_linearSlop)\n\t{\n\t\tuB *= 1.0f / lengthB;\n\t}\n\telse\n\t{\n\t\tuB.SetZero();\n\t}\n\n\t// Compute effective mass.\n\tfloat32 ruA = b2Cross(rA, uA);\n\tfloat32 ruB = b2Cross(rB, uB);\n\n\tfloat32 mA = m_invMassA + m_invIA * ruA * ruA;\n\tfloat32 mB = m_invMassB + m_invIB * ruB * ruB;\n\n\tfloat32 mass = mA + m_ratio * m_ratio * mB;\n\n\tif (mass > 0.0f)\n\t{\n\t\tmass = 1.0f / mass;\n\t}\n\n\tfloat32 C = m_constant - lengthA - m_ratio * lengthB;\n\tfloat32 linearError = b2Abs(C);\n\n\tfloat32 impulse = -mass * C;\n\n\tb2Vec2 PA = -impulse * uA;\n\tb2Vec2 PB = -m_ratio * impulse * uB;\n\n\tcA += m_invMassA * PA;\n\taA += m_invIA * b2Cross(rA, PA);\n\tcB += m_invMassB * PB;\n\taB += m_invIB * b2Cross(rB, PB);\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn linearError < b2_linearSlop;\n}\n\nb2Vec2 b2PulleyJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2PulleyJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2PulleyJoint::GetReactionForce(float32 inv_dt) const\n{\n\tb2Vec2 P = m_impulse * m_uB;\n\treturn inv_dt * P;\n}\n\nfloat32 b2PulleyJoint::GetReactionTorque(float32 inv_dt) const\n{\n\tB2_NOT_USED(inv_dt);\n\treturn 0.0f;\n}\n\nb2Vec2 b2PulleyJoint::GetGroundAnchorA() const\n{\n\treturn m_groundAnchorA;\n}\n\nb2Vec2 b2PulleyJoint::GetGroundAnchorB() const\n{\n\treturn m_groundAnchorB;\n}\n\nfloat32 b2PulleyJoint::GetLengthA() const\n{\n\treturn m_lengthA;\n}\n\nfloat32 b2PulleyJoint::GetLengthB() const\n{\n\treturn m_lengthB;\n}\n\nfloat32 b2PulleyJoint::GetRatio() const\n{\n\treturn m_ratio;\n}\n\nfloat32 b2PulleyJoint::GetCurrentLengthA() const\n{\n\tb2Vec2 p = m_bodyA->GetWorldPoint(m_localAnchorA);\n\tb2Vec2 s = m_groundAnchorA;\n\tb2Vec2 d = p - s;\n\treturn d.Length();\n}\n\nfloat32 b2PulleyJoint::GetCurrentLengthB() const\n{\n\tb2Vec2 p = m_bodyB->GetWorldPoint(m_localAnchorB);\n\tb2Vec2 s = m_groundAnchorB;\n\tb2Vec2 d = p - s;\n\treturn d.Length();\n}\n\nvoid b2PulleyJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Log(\"  b2PulleyJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.groundAnchorA.Set(%.15lef, %.15lef);\\n\", m_groundAnchorA.x, m_groundAnchorA.y);\n\tb2Log(\"  jd.groundAnchorB.Set(%.15lef, %.15lef);\\n\", m_groundAnchorB.x, m_groundAnchorB.y);\n\tb2Log(\"  jd.localAnchorA.Set(%.15lef, %.15lef);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Log(\"  jd.localAnchorB.Set(%.15lef, %.15lef);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Log(\"  jd.lengthA = %.15lef;\\n\", m_lengthA);\n\tb2Log(\"  jd.lengthB = %.15lef;\\n\", m_lengthB);\n\tb2Log(\"  jd.ratio = %.15lef;\\n\", m_ratio);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n\nvoid b2PulleyJoint::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\tm_groundAnchorA -= newOrigin;\n\tm_groundAnchorB -= newOrigin;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2RevoluteJoint.cpp",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// Point-to-point constraint\n// C = p2 - p1\n// Cdot = v2 - v1\n//      = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n// J = [-I -r1_skew I r2_skew ]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n\n// Motor constraint\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n// K = invI1 + invI2\n\nvoid b2RevoluteJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n\treferenceAngle = bodyB->GetAngle() - bodyA->GetAngle();\n}\n\nb2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_referenceAngle = def->referenceAngle;\n\n\tm_impulse.SetZero();\n\tm_motorImpulse = 0.0f;\n\n\tm_lowerAngle = def->lowerAngle;\n\tm_upperAngle = def->upperAngle;\n\tm_maxMotorTorque = def->maxMotorTorque;\n\tm_motorSpeed = def->motorSpeed;\n\tm_enableLimit = def->enableLimit;\n\tm_enableMotor = def->enableMotor;\n\tm_limitState = e_inactiveLimit;\n}\n\nvoid b2RevoluteJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// J = [-I -r1_skew I r2_skew]\n\t//     [ 0       -1 0       1]\n\t// r_skew = [-ry; rx]\n\n\t// Matlab\n\t// K = [ mA+r1y^2*iA+mB+r2y^2*iB,  -r1y*iA*r1x-r2y*iB*r2x,          -r1y*iA-r2y*iB]\n\t//     [  -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB,           r1x*iA+r2x*iB]\n\t//     [          -r1y*iA-r2y*iB,           r1x*iA+r2x*iB,                   iA+iB]\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tbool fixedRotation = (iA + iB == 0.0f);\n\n\tm_mass.ex.x = mA + mB + m_rA.y * m_rA.y * iA + m_rB.y * m_rB.y * iB;\n\tm_mass.ey.x = -m_rA.y * m_rA.x * iA - m_rB.y * m_rB.x * iB;\n\tm_mass.ez.x = -m_rA.y * iA - m_rB.y * iB;\n\tm_mass.ex.y = m_mass.ey.x;\n\tm_mass.ey.y = mA + mB + m_rA.x * m_rA.x * iA + m_rB.x * m_rB.x * iB;\n\tm_mass.ez.y = m_rA.x * iA + m_rB.x * iB;\n\tm_mass.ex.z = m_mass.ez.x;\n\tm_mass.ey.z = m_mass.ez.y;\n\tm_mass.ez.z = iA + iB;\n\n\tm_motorMass = iA + iB;\n\tif (m_motorMass > 0.0f)\n\t{\n\t\tm_motorMass = 1.0f / m_motorMass;\n\t}\n\n\tif (m_enableMotor == false || fixedRotation)\n\t{\n\t\tm_motorImpulse = 0.0f;\n\t}\n\n\tif (m_enableLimit && fixedRotation == false)\n\t{\n\t\tfloat32 jointAngle = aB - aA - m_referenceAngle;\n\t\tif (b2Abs(m_upperAngle - m_lowerAngle) < 2.0f * b2_angularSlop)\n\t\t{\n\t\t\tm_limitState = e_equalLimits;\n\t\t}\n\t\telse if (jointAngle <= m_lowerAngle)\n\t\t{\n\t\t\tif (m_limitState != e_atLowerLimit)\n\t\t\t{\n\t\t\t\tm_impulse.z = 0.0f;\n\t\t\t}\n\t\t\tm_limitState = e_atLowerLimit;\n\t\t}\n\t\telse if (jointAngle >= m_upperAngle)\n\t\t{\n\t\t\tif (m_limitState != e_atUpperLimit)\n\t\t\t{\n\t\t\t\tm_impulse.z = 0.0f;\n\t\t\t}\n\t\t\tm_limitState = e_atUpperLimit;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_limitState = e_inactiveLimit;\n\t\t\tm_impulse.z = 0.0f;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_limitState = e_inactiveLimit;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support a variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\t\tm_motorImpulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P(m_impulse.x, m_impulse.y);\n\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + m_motorImpulse + m_impulse.z);\n\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + m_motorImpulse + m_impulse.z);\n\t}\n\telse\n\t{\n\t\tm_impulse.SetZero();\n\t\tm_motorImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2RevoluteJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tbool fixedRotation = (iA + iB == 0.0f);\n\n\t// Solve motor constraint.\n\tif (m_enableMotor && m_limitState != e_equalLimits && fixedRotation == false)\n\t{\n\t\tfloat32 Cdot = wB - wA - m_motorSpeed;\n\t\tfloat32 impulse = -m_motorMass * Cdot;\n\t\tfloat32 oldImpulse = m_motorImpulse;\n\t\tfloat32 maxImpulse = data.step.dt * m_maxMotorTorque;\n\t\tm_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_motorImpulse - oldImpulse;\n\n\t\twA -= iA * impulse;\n\t\twB += iB * impulse;\n\t}\n\n\t// Solve limit constraint.\n\tif (m_enableLimit && m_limitState != e_inactiveLimit && fixedRotation == false)\n\t{\n\t\tb2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA);\n\t\tfloat32 Cdot2 = wB - wA;\n\t\tb2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2);\n\n\t\tb2Vec3 impulse = -m_mass.Solve33(Cdot);\n\n\t\tif (m_limitState == e_equalLimits)\n\t\t{\n\t\t\tm_impulse += impulse;\n\t\t}\n\t\telse if (m_limitState == e_atLowerLimit)\n\t\t{\n\t\t\tfloat32 newImpulse = m_impulse.z + impulse.z;\n\t\t\tif (newImpulse < 0.0f)\n\t\t\t{\n\t\t\t\tb2Vec2 rhs = -Cdot1 + m_impulse.z * b2Vec2(m_mass.ez.x, m_mass.ez.y);\n\t\t\t\tb2Vec2 reduced = m_mass.Solve22(rhs);\n\t\t\t\timpulse.x = reduced.x;\n\t\t\t\timpulse.y = reduced.y;\n\t\t\t\timpulse.z = -m_impulse.z;\n\t\t\t\tm_impulse.x += reduced.x;\n\t\t\t\tm_impulse.y += reduced.y;\n\t\t\t\tm_impulse.z = 0.0f;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_impulse += impulse;\n\t\t\t}\n\t\t}\n\t\telse if (m_limitState == e_atUpperLimit)\n\t\t{\n\t\t\tfloat32 newImpulse = m_impulse.z + impulse.z;\n\t\t\tif (newImpulse > 0.0f)\n\t\t\t{\n\t\t\t\tb2Vec2 rhs = -Cdot1 + m_impulse.z * b2Vec2(m_mass.ez.x, m_mass.ez.y);\n\t\t\t\tb2Vec2 reduced = m_mass.Solve22(rhs);\n\t\t\t\timpulse.x = reduced.x;\n\t\t\t\timpulse.y = reduced.y;\n\t\t\t\timpulse.z = -m_impulse.z;\n\t\t\t\tm_impulse.x += reduced.x;\n\t\t\t\tm_impulse.y += reduced.y;\n\t\t\t\tm_impulse.z = 0.0f;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_impulse += impulse;\n\t\t\t}\n\t\t}\n\n\t\tb2Vec2 P(impulse.x, impulse.y);\n\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + impulse.z);\n\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + impulse.z);\n\t}\n\telse\n\t{\n\t\t// Solve point-to-point constraint\n\t\tb2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA);\n\t\tb2Vec2 impulse = m_mass.Solve22(-Cdot);\n\n\t\tm_impulse.x += impulse.x;\n\t\tm_impulse.y += impulse.y;\n\n\t\tvA -= mA * impulse;\n\t\twA -= iA * b2Cross(m_rA, impulse);\n\n\t\tvB += mB * impulse;\n\t\twB += iB * b2Cross(m_rB, impulse);\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2RevoluteJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tfloat32 angularError = 0.0f;\n\tfloat32 positionError = 0.0f;\n\n\tbool fixedRotation = (m_invIA + m_invIB == 0.0f);\n\n\t// Solve angular limit constraint.\n\tif (m_enableLimit && m_limitState != e_inactiveLimit && fixedRotation == false)\n\t{\n\t\tfloat32 angle = aB - aA - m_referenceAngle;\n\t\tfloat32 limitImpulse = 0.0f;\n\n\t\tif (m_limitState == e_equalLimits)\n\t\t{\n\t\t\t// Prevent large angular corrections\n\t\t\tfloat32 C = b2Clamp(angle - m_lowerAngle, -b2_maxAngularCorrection, b2_maxAngularCorrection);\n\t\t\tlimitImpulse = -m_motorMass * C;\n\t\t\tangularError = b2Abs(C);\n\t\t}\n\t\telse if (m_limitState == e_atLowerLimit)\n\t\t{\n\t\t\tfloat32 C = angle - m_lowerAngle;\n\t\t\tangularError = -C;\n\n\t\t\t// Prevent large angular corrections and allow some slop.\n\t\t\tC = b2Clamp(C + b2_angularSlop, -b2_maxAngularCorrection, 0.0f);\n\t\t\tlimitImpulse = -m_motorMass * C;\n\t\t}\n\t\telse if (m_limitState == e_atUpperLimit)\n\t\t{\n\t\t\tfloat32 C = angle - m_upperAngle;\n\t\t\tangularError = C;\n\n\t\t\t// Prevent large angular corrections and allow some slop.\n\t\t\tC = b2Clamp(C - b2_angularSlop, 0.0f, b2_maxAngularCorrection);\n\t\t\tlimitImpulse = -m_motorMass * C;\n\t\t}\n\n\t\taA -= m_invIA * limitImpulse;\n\t\taB += m_invIB * limitImpulse;\n\t}\n\n\t// Solve point-to-point constraint.\n\t{\n\t\tqA.Set(aA);\n\t\tqB.Set(aB);\n\t\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\t\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t\tb2Vec2 C = cB + rB - cA - rA;\n\t\tpositionError = C.Length();\n\n\t\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\t\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\t\tb2Mat22 K;\n\t\tK.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n\t\tK.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n\t\tK.ey.x = K.ex.y;\n\t\tK.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n\t\tb2Vec2 impulse = -K.Solve(C);\n\n\t\tcA -= mA * impulse;\n\t\taA -= iA * b2Cross(rA, impulse);\n\n\t\tcB += mB * impulse;\n\t\taB += iB * b2Cross(rB, impulse);\n\t}\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn positionError <= b2_linearSlop && angularError <= b2_angularSlop;\n}\n\nb2Vec2 b2RevoluteJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2RevoluteJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2RevoluteJoint::GetReactionForce(float32 inv_dt) const\n{\n\tb2Vec2 P(m_impulse.x, m_impulse.y);\n\treturn inv_dt * P;\n}\n\nfloat32 b2RevoluteJoint::GetReactionTorque(float32 inv_dt) const\n{\n\treturn inv_dt * m_impulse.z;\n}\n\nfloat32 b2RevoluteJoint::GetJointAngle() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\treturn bB->m_sweep.a - bA->m_sweep.a - m_referenceAngle;\n}\n\nfloat32 b2RevoluteJoint::GetJointSpeed() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\treturn bB->m_angularVelocity - bA->m_angularVelocity;\n}\n\nbool b2RevoluteJoint::IsMotorEnabled() const\n{\n\treturn m_enableMotor;\n}\n\nvoid b2RevoluteJoint::EnableMotor(bool flag)\n{\n\tm_bodyA->SetAwake(true);\n\tm_bodyB->SetAwake(true);\n\tm_enableMotor = flag;\n}\n\nfloat32 b2RevoluteJoint::GetMotorTorque(float32 inv_dt) const\n{\n\treturn inv_dt * m_motorImpulse;\n}\n\nvoid b2RevoluteJoint::SetMotorSpeed(float32 speed)\n{\n\tm_bodyA->SetAwake(true);\n\tm_bodyB->SetAwake(true);\n\tm_motorSpeed = speed;\n}\n\nvoid b2RevoluteJoint::SetMaxMotorTorque(float32 torque)\n{\n\tm_bodyA->SetAwake(true);\n\tm_bodyB->SetAwake(true);\n\tm_maxMotorTorque = torque;\n}\n\nbool b2RevoluteJoint::IsLimitEnabled() const\n{\n\treturn m_enableLimit;\n}\n\nvoid b2RevoluteJoint::EnableLimit(bool flag)\n{\n\tif (flag != m_enableLimit)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_enableLimit = flag;\n\t\tm_impulse.z = 0.0f;\n\t}\n}\n\nfloat32 b2RevoluteJoint::GetLowerLimit() const\n{\n\treturn m_lowerAngle;\n}\n\nfloat32 b2RevoluteJoint::GetUpperLimit() const\n{\n\treturn m_upperAngle;\n}\n\nvoid b2RevoluteJoint::SetLimits(float32 lower, float32 upper)\n{\n\tb2Assert(lower <= upper);\n\n\tif (lower != m_lowerAngle || upper != m_upperAngle)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_impulse.z = 0.0f;\n\t\tm_lowerAngle = lower;\n\t\tm_upperAngle = upper;\n\t}\n}\n\nvoid b2RevoluteJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Log(\"  b2RevoluteJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.localAnchorA.Set(%.15lef, %.15lef);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Log(\"  jd.localAnchorB.Set(%.15lef, %.15lef);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Log(\"  jd.referenceAngle = %.15lef;\\n\", m_referenceAngle);\n\tb2Log(\"  jd.enableLimit = bool(%d);\\n\", m_enableLimit);\n\tb2Log(\"  jd.lowerAngle = %.15lef;\\n\", m_lowerAngle);\n\tb2Log(\"  jd.upperAngle = %.15lef;\\n\", m_upperAngle);\n\tb2Log(\"  jd.enableMotor = bool(%d);\\n\", m_enableMotor);\n\tb2Log(\"  jd.motorSpeed = %.15lef;\\n\", m_motorSpeed);\n\tb2Log(\"  jd.maxMotorTorque = %.15lef;\\n\", m_maxMotorTorque);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Rope.cpp",
    "content": "/*\n* Copyright (c) 2011 Erin Catto http://box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Rope/b2Rope.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2Draw.h\"\n\nb2Rope::b2Rope()\n{\n\tm_count = 0;\n\tm_ps = NULL;\n\tm_p0s = NULL;\n\tm_vs = NULL;\n\tm_ims = NULL;\n\tm_Ls = NULL;\n\tm_as = NULL;\n\tm_gravity.SetZero();\n\tm_k2 = 1.0f;\n\tm_k3 = 0.1f;\n}\n\nb2Rope::~b2Rope()\n{\n\tb2Free(m_ps);\n\tb2Free(m_p0s);\n\tb2Free(m_vs);\n\tb2Free(m_ims);\n\tb2Free(m_Ls);\n\tb2Free(m_as);\n}\n\nvoid b2Rope::Initialize(const b2RopeDef* def)\n{\n\tb2Assert(def->count >= 3);\n\tm_count = def->count;\n\tm_ps = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));\n\tm_p0s = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));\n\tm_vs = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));\n\tm_ims = (float32*)b2Alloc(m_count * sizeof(float32));\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tm_ps[i] = def->vertices[i];\n\t\tm_p0s[i] = def->vertices[i];\n\t\tm_vs[i].SetZero();\n\n\t\tfloat32 m = def->masses[i];\n\t\tif (m > 0.0f)\n\t\t{\n\t\t\tm_ims[i] = 1.0f / m;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_ims[i] = 0.0f;\n\t\t}\n\t}\n\n\tint32 count2 = m_count - 1;\n\tint32 count3 = m_count - 2;\n\tm_Ls = (float32*)b2Alloc(count2 * sizeof(float32));\n\tm_as = (float32*)b2Alloc(count3 * sizeof(float32));\n\n\tfor (int32 i = 0; i < count2; ++i)\n\t{\n\t\tb2Vec2 p1 = m_ps[i];\n\t\tb2Vec2 p2 = m_ps[i+1];\n\t\tm_Ls[i] = b2Distance(p1, p2);\n\t}\n\n\tfor (int32 i = 0; i < count3; ++i)\n\t{\n\t\tb2Vec2 p1 = m_ps[i];\n\t\tb2Vec2 p2 = m_ps[i + 1];\n\t\tb2Vec2 p3 = m_ps[i + 2];\n\n\t\tb2Vec2 d1 = p2 - p1;\n\t\tb2Vec2 d2 = p3 - p2;\n\n\t\tfloat32 a = b2Cross(d1, d2);\n\t\tfloat32 b = b2Dot(d1, d2);\n\n\t\tm_as[i] = b2Atan2(a, b);\n\t}\n\n\tm_gravity = def->gravity;\n\tm_damping = def->damping;\n\tm_k2 = def->k2;\n\tm_k3 = def->k3;\n}\n\nvoid b2Rope::Step(float32 h, int32 iterations)\n{\n\tif (h == 0.0)\n\t{\n\t\treturn;\n\t}\n\n\tfloat32 d = expf(- h * m_damping);\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tm_p0s[i] = m_ps[i];\n\t\tif (m_ims[i] > 0.0f)\n\t\t{\n\t\t\tm_vs[i] += h * m_gravity;\n\t\t}\n\t\tm_vs[i] *= d;\n\t\tm_ps[i] += h * m_vs[i];\n\n\t}\n\n\tfor (int32 i = 0; i < iterations; ++i)\n\t{\n\t\tSolveC2();\n\t\tSolveC3();\n\t\tSolveC2();\n\t}\n\n\tfloat32 inv_h = 1.0f / h;\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tm_vs[i] = inv_h * (m_ps[i] - m_p0s[i]);\n\t}\n}\n\nvoid b2Rope::SolveC2()\n{\n\tint32 count2 = m_count - 1;\n\n\tfor (int32 i = 0; i < count2; ++i)\n\t{\n\t\tb2Vec2 p1 = m_ps[i];\n\t\tb2Vec2 p2 = m_ps[i + 1];\n\n\t\tb2Vec2 d = p2 - p1;\n\t\tfloat32 L = d.Normalize();\n\n\t\tfloat32 im1 = m_ims[i];\n\t\tfloat32 im2 = m_ims[i + 1];\n\n\t\tif (im1 + im2 == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat32 s1 = im1 / (im1 + im2);\n\t\tfloat32 s2 = im2 / (im1 + im2);\n\n\t\tp1 -= m_k2 * s1 * (m_Ls[i] - L) * d;\n\t\tp2 += m_k2 * s2 * (m_Ls[i] - L) * d;\n\n\t\tm_ps[i] = p1;\n\t\tm_ps[i + 1] = p2;\n\t}\n}\n\nvoid b2Rope::SetAngle(float32 angle)\n{\n\tint32 count3 = m_count - 2;\n\tfor (int32 i = 0; i < count3; ++i)\n\t{\n\t\tm_as[i] = angle;\n\t}\n}\n\nvoid b2Rope::SolveC3()\n{\n\tint32 count3 = m_count - 2;\n\n\tfor (int32 i = 0; i < count3; ++i)\n\t{\n\t\tb2Vec2 p1 = m_ps[i];\n\t\tb2Vec2 p2 = m_ps[i + 1];\n\t\tb2Vec2 p3 = m_ps[i + 2];\n\n\t\tfloat32 m1 = m_ims[i];\n\t\tfloat32 m2 = m_ims[i + 1];\n\t\tfloat32 m3 = m_ims[i + 2];\n\n\t\tb2Vec2 d1 = p2 - p1;\n\t\tb2Vec2 d2 = p3 - p2;\n\n\t\tfloat32 L1sqr = d1.LengthSquared();\n\t\tfloat32 L2sqr = d2.LengthSquared();\n\n\t\tif (L1sqr * L2sqr == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat32 a = b2Cross(d1, d2);\n\t\tfloat32 b = b2Dot(d1, d2);\n\n\t\tfloat32 angle = b2Atan2(a, b);\n\n\t\tb2Vec2 Jd1 = (-1.0f / L1sqr) * d1.Skew();\n\t\tb2Vec2 Jd2 = (1.0f / L2sqr) * d2.Skew();\n\n\t\tb2Vec2 J1 = -Jd1;\n\t\tb2Vec2 J2 = Jd1 - Jd2;\n\t\tb2Vec2 J3 = Jd2;\n\n\t\tfloat32 mass = m1 * b2Dot(J1, J1) + m2 * b2Dot(J2, J2) + m3 * b2Dot(J3, J3);\n\t\tif (mass == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tmass = 1.0f / mass;\n\n\t\tfloat32 C = angle - m_as[i];\n\n\t\twhile (C > b2_pi)\n\t\t{\n\t\t\tangle -= 2 * b2_pi;\n\t\t\tC = angle - m_as[i];\n\t\t}\n\n\t\twhile (C < -b2_pi)\n\t\t{\n\t\t\tangle += 2.0f * b2_pi;\n\t\t\tC = angle - m_as[i];\n\t\t}\n\n\t\tfloat32 impulse = - m_k3 * mass * C;\n\n\t\tp1 += (m1 * impulse) * J1;\n\t\tp2 += (m2 * impulse) * J2;\n\t\tp3 += (m3 * impulse) * J3;\n\n\t\tm_ps[i] = p1;\n\t\tm_ps[i + 1] = p2;\n\t\tm_ps[i + 2] = p3;\n\t}\n}\n\nvoid b2Rope::Draw(b2Draw* draw) const\n{\n\tb2Color c(0.4f, 0.5f, 0.7f);\n\n\tfor (int32 i = 0; i < m_count - 1; ++i)\n\t{\n\t\tdraw->DrawSegment(m_ps[i], m_ps[i+1], c);\n\t}\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2RopeJoint.cpp",
    "content": "/*\n* Copyright (c) 2007-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2RopeJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n\n// Limit:\n// C = norm(pB - pA) - L\n// u = (pB - pA) / norm(pB - pA)\n// Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n// J = [-u -cross(rA, u) u cross(rB, u)]\n// K = J * invM * JT\n//   = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n\nb2RopeJoint::b2RopeJoint(const b2RopeJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\n\tm_maxLength = def->maxLength;\n\n\tm_mass = 0.0f;\n\tm_impulse = 0.0f;\n\tm_state = e_inactiveLimit;\n\tm_length = 0.0f;\n}\n\nvoid b2RopeJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tm_u = cB + m_rB - cA - m_rA;\n\n\tm_length = m_u.Length();\n\n\tfloat32 C = m_length - m_maxLength;\n\tif (C > 0.0f)\n\t{\n\t\tm_state = e_atUpperLimit;\n\t}\n\telse\n\t{\n\t\tm_state = e_inactiveLimit;\n\t}\n\n\tif (m_length > b2_linearSlop)\n\t{\n\t\tm_u *= 1.0f / m_length;\n\t}\n\telse\n\t{\n\t\tm_u.SetZero();\n\t\tm_mass = 0.0f;\n\t\tm_impulse = 0.0f;\n\t\treturn;\n\t}\n\n\t// Compute effective mass.\n\tfloat32 crA = b2Cross(m_rA, m_u);\n\tfloat32 crB = b2Cross(m_rB, m_u);\n\tfloat32 invMass = m_invMassA + m_invIA * crA * crA + m_invMassB + m_invIB * crB * crB;\n\n\tm_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale the impulse to support a variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P = m_impulse * m_u;\n\t\tvA -= m_invMassA * P;\n\t\twA -= m_invIA * b2Cross(m_rA, P);\n\t\tvB += m_invMassB * P;\n\t\twB += m_invIB * b2Cross(m_rB, P);\n\t}\n\telse\n\t{\n\t\tm_impulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2RopeJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\t// Cdot = dot(u, v + cross(w, r))\n\tb2Vec2 vpA = vA + b2Cross(wA, m_rA);\n\tb2Vec2 vpB = vB + b2Cross(wB, m_rB);\n\tfloat32 C = m_length - m_maxLength;\n\tfloat32 Cdot = b2Dot(m_u, vpB - vpA);\n\n\t// Predictive constraint.\n\tif (C < 0.0f)\n\t{\n\t\tCdot += data.step.inv_dt * C;\n\t}\n\n\tfloat32 impulse = -m_mass * Cdot;\n\tfloat32 oldImpulse = m_impulse;\n\tm_impulse = b2Min(0.0f, m_impulse + impulse);\n\timpulse = m_impulse - oldImpulse;\n\n\tb2Vec2 P = impulse * m_u;\n\tvA -= m_invMassA * P;\n\twA -= m_invIA * b2Cross(m_rA, P);\n\tvB += m_invMassB * P;\n\twB += m_invIB * b2Cross(m_rB, P);\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2RopeJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 u = cB + rB - cA - rA;\n\n\tfloat32 length = u.Normalize();\n\tfloat32 C = length - m_maxLength;\n\n\tC = b2Clamp(C, 0.0f, b2_maxLinearCorrection);\n\n\tfloat32 impulse = -m_mass * C;\n\tb2Vec2 P = impulse * u;\n\n\tcA -= m_invMassA * P;\n\taA -= m_invIA * b2Cross(rA, P);\n\tcB += m_invMassB * P;\n\taB += m_invIB * b2Cross(rB, P);\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn length - m_maxLength < b2_linearSlop;\n}\n\nb2Vec2 b2RopeJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2RopeJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2RopeJoint::GetReactionForce(float32 inv_dt) const\n{\n\tb2Vec2 F = (inv_dt * m_impulse) * m_u;\n\treturn F;\n}\n\nfloat32 b2RopeJoint::GetReactionTorque(float32 inv_dt) const\n{\n\tB2_NOT_USED(inv_dt);\n\treturn 0.0f;\n}\n\nfloat32 b2RopeJoint::GetMaxLength() const\n{\n\treturn m_maxLength;\n}\n\nb2LimitState b2RopeJoint::GetLimitState() const\n{\n\treturn m_state;\n}\n\nvoid b2RopeJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Log(\"  b2RopeJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.localAnchorA.Set(%.15lef, %.15lef);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Log(\"  jd.localAnchorB.Set(%.15lef, %.15lef);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Log(\"  jd.maxLength = %.15lef;\\n\", m_maxLength);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Settings.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Common/b2Settings.h\"\n#include <stdio.h>\n#include <stdarg.h>\n#include <stdlib.h>\n\nb2Version b2_version = {2, 3, 0};\n\n// Memory allocators. Modify these to use your own allocator.\nvoid* b2Alloc(int32 size)\n{\n\treturn malloc(size);\n}\n\nvoid b2Free(void* mem)\n{\n\tfree(mem);\n}\n\n// You can modify this to use your logging facility.\nvoid b2Log(const char* string, ...)\n{\n\tva_list args;\n\tva_start(args, string);\n\tvprintf(string, args);\n\tva_end(args);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2StackAllocator.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Common/b2StackAllocator.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2Math.h\"\n\nb2StackAllocator::b2StackAllocator()\n{\n\tm_index = 0;\n\tm_allocation = 0;\n\tm_maxAllocation = 0;\n\tm_entryCount = 0;\n}\n\nb2StackAllocator::~b2StackAllocator()\n{\n\tb2Assert(m_index == 0);\n\tb2Assert(m_entryCount == 0);\n}\n\nvoid* b2StackAllocator::Allocate(int32 size)\n{\n\tb2Assert(m_entryCount < b2_maxStackEntries);\n\n\tb2StackEntry* entry = m_entries + m_entryCount;\n\tentry->size = size;\n\tif (m_index + size > b2_stackSize)\n\t{\n\t\tentry->data = (char*)b2Alloc(size);\n\t\tentry->usedMalloc = true;\n\t}\n\telse\n\t{\n\t\tentry->data = m_data + m_index;\n\t\tentry->usedMalloc = false;\n\t\tm_index += size;\n\t}\n\n\tm_allocation += size;\n\tm_maxAllocation = b2Max(m_maxAllocation, m_allocation);\n\t++m_entryCount;\n\n\treturn entry->data;\n}\n\nvoid b2StackAllocator::Free(void* p)\n{\n\tb2Assert(m_entryCount > 0);\n\tb2StackEntry* entry = m_entries + m_entryCount - 1;\n\tb2Assert(p == entry->data);\n\tif (entry->usedMalloc)\n\t{\n\t\tb2Free(p);\n\t}\n\telse\n\t{\n\t\tm_index -= entry->size;\n\t}\n\tm_allocation -= entry->size;\n\t--m_entryCount;\n\n\tp = NULL;\n}\n\nint32 b2StackAllocator::GetMaxAllocation() const\n{\n\treturn m_maxAllocation;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2TimeOfImpact.cpp",
    "content": "/*\n* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Collision/b2Collision.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2Distance.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2Timer.h\"\n\n#include <stdio.h>\n\nfloat32 b2_toiTime, b2_toiMaxTime;\nint32 b2_toiCalls, b2_toiIters, b2_toiMaxIters;\nint32 b2_toiRootIters, b2_toiMaxRootIters;\n\n//\nstruct b2SeparationFunction\n{\n\tenum Type\n\t{\n\t\te_points,\n\t\te_faceA,\n\t\te_faceB\n\t};\n\n\t// TODO_ERIN might not need to return the separation\n\n\tfloat32 Initialize(const b2SimplexCache* cache,\n\t\tconst b2DistanceProxy* proxyA, const b2Sweep& sweepA,\n\t\tconst b2DistanceProxy* proxyB, const b2Sweep& sweepB,\n\t\tfloat32 t1)\n\t{\n\t\tm_proxyA = proxyA;\n\t\tm_proxyB = proxyB;\n\t\tint32 count = cache->count;\n\t\tb2Assert(0 < count && count < 3);\n\n\t\tm_sweepA = sweepA;\n\t\tm_sweepB = sweepB;\n\n\t\tb2Transform xfA, xfB;\n\t\tm_sweepA.GetTransform(&xfA, t1);\n\t\tm_sweepB.GetTransform(&xfB, t1);\n\n\t\tif (count == 1)\n\t\t{\n\t\t\tm_type = e_points;\n\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(cache->indexA[0]);\n\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);\n\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\t\t\tm_axis = pointB - pointA;\n\t\t\tfloat32 s = m_axis.Normalize();\n\t\t\treturn s;\n\t\t}\n\t\telse if (cache->indexA[0] == cache->indexA[1])\n\t\t{\n\t\t\t// Two points on B and one on A.\n\t\t\tm_type = e_faceB;\n\t\t\tb2Vec2 localPointB1 = proxyB->GetVertex(cache->indexB[0]);\n\t\t\tb2Vec2 localPointB2 = proxyB->GetVertex(cache->indexB[1]);\n\n\t\t\tm_axis = b2Cross(localPointB2 - localPointB1, 1.0f);\n\t\t\tm_axis.Normalize();\n\t\t\tb2Vec2 normal = b2Mul(xfB.q, m_axis);\n\n\t\t\tm_localPoint = 0.5f * (localPointB1 + localPointB2);\n\t\t\tb2Vec2 pointB = b2Mul(xfB, m_localPoint);\n\n\t\t\tb2Vec2 localPointA = proxyA->GetVertex(cache->indexA[0]);\n\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\n\t\t\tfloat32 s = b2Dot(pointA - pointB, normal);\n\t\t\tif (s < 0.0f)\n\t\t\t{\n\t\t\t\tm_axis = -m_axis;\n\t\t\t\ts = -s;\n\t\t\t}\n\t\t\treturn s;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Two points on A and one or two points on B.\n\t\t\tm_type = e_faceA;\n\t\t\tb2Vec2 localPointA1 = m_proxyA->GetVertex(cache->indexA[0]);\n\t\t\tb2Vec2 localPointA2 = m_proxyA->GetVertex(cache->indexA[1]);\n\n\t\t\tm_axis = b2Cross(localPointA2 - localPointA1, 1.0f);\n\t\t\tm_axis.Normalize();\n\t\t\tb2Vec2 normal = b2Mul(xfA.q, m_axis);\n\n\t\t\tm_localPoint = 0.5f * (localPointA1 + localPointA2);\n\t\t\tb2Vec2 pointA = b2Mul(xfA, m_localPoint);\n\n\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);\n\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\n\t\t\tfloat32 s = b2Dot(pointB - pointA, normal);\n\t\t\tif (s < 0.0f)\n\t\t\t{\n\t\t\t\tm_axis = -m_axis;\n\t\t\t\ts = -s;\n\t\t\t}\n\t\t\treturn s;\n\t\t}\n\t}\n\n\t//\n\tfloat32 FindMinSeparation(int32* indexA, int32* indexB, float32 t) const\n\t{\n\t\tb2Transform xfA, xfB;\n\t\tm_sweepA.GetTransform(&xfA, t);\n\t\tm_sweepB.GetTransform(&xfB, t);\n\n\t\tswitch (m_type)\n\t\t{\n\t\tcase e_points:\n\t\t\t{\n\t\t\t\tb2Vec2 axisA = b2MulT(xfA.q,  m_axis);\n\t\t\t\tb2Vec2 axisB = b2MulT(xfB.q, -m_axis);\n\n\t\t\t\t*indexA = m_proxyA->GetSupport(axisA);\n\t\t\t\t*indexB = m_proxyB->GetSupport(axisB);\n\n\t\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(*indexA);\n\t\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(*indexB);\n\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\n\t\t\t\tfloat32 separation = b2Dot(pointB - pointA, m_axis);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tcase e_faceA:\n\t\t\t{\n\t\t\t\tb2Vec2 normal = b2Mul(xfA.q, m_axis);\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, m_localPoint);\n\n\t\t\t\tb2Vec2 axisB = b2MulT(xfB.q, -normal);\n\n\t\t\t\t*indexA = -1;\n\t\t\t\t*indexB = m_proxyB->GetSupport(axisB);\n\n\t\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(*indexB);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\n\t\t\t\tfloat32 separation = b2Dot(pointB - pointA, normal);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tcase e_faceB:\n\t\t\t{\n\t\t\t\tb2Vec2 normal = b2Mul(xfB.q, m_axis);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, m_localPoint);\n\n\t\t\t\tb2Vec2 axisA = b2MulT(xfA.q, -normal);\n\n\t\t\t\t*indexB = -1;\n\t\t\t\t*indexA = m_proxyA->GetSupport(axisA);\n\n\t\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(*indexA);\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\n\t\t\t\tfloat32 separation = b2Dot(pointA - pointB, normal);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\t*indexA = -1;\n\t\t\t*indexB = -1;\n\t\t\treturn 0.0f;\n\t\t}\n\t}\n\n\t//\n\tfloat32 Evaluate(int32 indexA, int32 indexB, float32 t) const\n\t{\n\t\tb2Transform xfA, xfB;\n\t\tm_sweepA.GetTransform(&xfA, t);\n\t\tm_sweepB.GetTransform(&xfB, t);\n\n\t\tswitch (m_type)\n\t\t{\n\t\tcase e_points:\n\t\t\t{\n\t\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(indexA);\n\t\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(indexB);\n\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\t\t\t\tfloat32 separation = b2Dot(pointB - pointA, m_axis);\n\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tcase e_faceA:\n\t\t\t{\n\t\t\t\tb2Vec2 normal = b2Mul(xfA.q, m_axis);\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, m_localPoint);\n\n\t\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(indexB);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\n\t\t\t\tfloat32 separation = b2Dot(pointB - pointA, normal);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tcase e_faceB:\n\t\t\t{\n\t\t\t\tb2Vec2 normal = b2Mul(xfB.q, m_axis);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, m_localPoint);\n\n\t\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(indexA);\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\n\t\t\t\tfloat32 separation = b2Dot(pointA - pointB, normal);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\treturn 0.0f;\n\t\t}\n\t}\n\n\tconst b2DistanceProxy* m_proxyA;\n\tconst b2DistanceProxy* m_proxyB;\n\tb2Sweep m_sweepA, m_sweepB;\n\tType m_type;\n\tb2Vec2 m_localPoint;\n\tb2Vec2 m_axis;\n};\n\n// CCD via the local separating axis method. This seeks progression\n// by computing the largest time at which separation is maintained.\nvoid b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input)\n{\n\tb2Timer timer;\n\n\t++b2_toiCalls;\n\n\toutput->state = b2TOIOutput::e_unknown;\n\toutput->t = input->tMax;\n\n\tconst b2DistanceProxy* proxyA = &input->proxyA;\n\tconst b2DistanceProxy* proxyB = &input->proxyB;\n\n\tb2Sweep sweepA = input->sweepA;\n\tb2Sweep sweepB = input->sweepB;\n\n\t// Large rotations can make the root finder fail, so we normalize the\n\t// sweep angles.\n\tsweepA.Normalize();\n\tsweepB.Normalize();\n\n\tfloat32 tMax = input->tMax;\n\n\tfloat32 totalRadius = proxyA->m_radius + proxyB->m_radius;\n\tfloat32 target = b2Max(b2_linearSlop, totalRadius - 3.0f * b2_linearSlop);\n\tfloat32 tolerance = 0.25f * b2_linearSlop;\n\tb2Assert(target > tolerance);\n\n\tfloat32 t1 = 0.0f;\n\tconst int32 k_maxIterations = 20;\t// TODO_ERIN b2Settings\n\tint32 iter = 0;\n\n\t// Prepare input for distance query.\n\tb2SimplexCache cache;\n\tcache.count = 0;\n\tb2DistanceInput distanceInput;\n\tdistanceInput.proxyA = input->proxyA;\n\tdistanceInput.proxyB = input->proxyB;\n\tdistanceInput.useRadii = false;\n\n\t// The outer loop progressively attempts to compute new separating axes.\n\t// This loop terminates when an axis is repeated (no progress is made).\n\tfor(;;)\n\t{\n\t\tb2Transform xfA, xfB;\n\t\tsweepA.GetTransform(&xfA, t1);\n\t\tsweepB.GetTransform(&xfB, t1);\n\n\t\t// Get the distance between shapes. We can also use the results\n\t\t// to get a separating axis.\n\t\tdistanceInput.transformA = xfA;\n\t\tdistanceInput.transformB = xfB;\n\t\tb2DistanceOutput distanceOutput;\n\t\tb2Distance(&distanceOutput, &cache, &distanceInput);\n\n\t\t// If the shapes are overlapped, we give up on continuous collision.\n\t\tif (distanceOutput.distance <= 0.0f)\n\t\t{\n\t\t\t// Failure!\n\t\t\toutput->state = b2TOIOutput::e_overlapped;\n\t\t\toutput->t = 0.0f;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (distanceOutput.distance < target + tolerance)\n\t\t{\n\t\t\t// Victory!\n\t\t\toutput->state = b2TOIOutput::e_touching;\n\t\t\toutput->t = t1;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Initialize the separating axis.\n\t\tb2SeparationFunction fcn;\n\t\tfcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB, t1);\n#if 0\n\t\t// Dump the curve seen by the root finder\n\t\t{\n\t\t\tconst int32 N = 100;\n\t\t\tfloat32 dx = 1.0f / N;\n\t\t\tfloat32 xs[N+1];\n\t\t\tfloat32 fs[N+1];\n\n\t\t\tfloat32 x = 0.0f;\n\n\t\t\tfor (int32 i = 0; i <= N; ++i)\n\t\t\t{\n\t\t\t\tsweepA.GetTransform(&xfA, x);\n\t\t\t\tsweepB.GetTransform(&xfB, x);\n\t\t\t\tfloat32 f = fcn.Evaluate(xfA, xfB) - target;\n\n\t\t\t\tprintf(\"%g %g\\n\", x, f);\n\n\t\t\t\txs[i] = x;\n\t\t\t\tfs[i] = f;\n\n\t\t\t\tx += dx;\n\t\t\t}\n\t\t}\n#endif\n\n\t\t// Compute the TOI on the separating axis. We do this by successively\n\t\t// resolving the deepest point. This loop is bounded by the number of vertices.\n\t\tbool done = false;\n\t\tfloat32 t2 = tMax;\n\t\tint32 pushBackIter = 0;\n\t\tfor (;;)\n\t\t{\n\t\t\t// Find the deepest point at t2. Store the witness point indices.\n\t\t\tint32 indexA, indexB;\n\t\t\tfloat32 s2 = fcn.FindMinSeparation(&indexA, &indexB, t2);\n\n\t\t\t// Is the final configuration separated?\n\t\t\tif (s2 > target + tolerance)\n\t\t\t{\n\t\t\t\t// Victory!\n\t\t\t\toutput->state = b2TOIOutput::e_separated;\n\t\t\t\toutput->t = tMax;\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Has the separation reached tolerance?\n\t\t\tif (s2 > target - tolerance)\n\t\t\t{\n\t\t\t\t// Advance the sweeps\n\t\t\t\tt1 = t2;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Compute the initial separation of the witness points.\n\t\t\tfloat32 s1 = fcn.Evaluate(indexA, indexB, t1);\n\n\t\t\t// Check for initial overlap. This might happen if the root finder\n\t\t\t// runs out of iterations.\n\t\t\tif (s1 < target - tolerance)\n\t\t\t{\n\t\t\t\toutput->state = b2TOIOutput::e_failed;\n\t\t\t\toutput->t = t1;\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Check for touching\n\t\t\tif (s1 <= target + tolerance)\n\t\t\t{\n\t\t\t\t// Victory! t1 should hold the TOI (could be 0.0).\n\t\t\t\toutput->state = b2TOIOutput::e_touching;\n\t\t\t\toutput->t = t1;\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Compute 1D root of: f(x) - target = 0\n\t\t\tint32 rootIterCount = 0;\n\t\t\tfloat32 a1 = t1, a2 = t2;\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\t// Use a mix of the secant rule and bisection.\n\t\t\t\tfloat32 t;\n\t\t\t\tif (rootIterCount & 1)\n\t\t\t\t{\n\t\t\t\t\t// Secant rule to improve convergence.\n\t\t\t\t\tt = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Bisection to guarantee progress.\n\t\t\t\t\tt = 0.5f * (a1 + a2);\n\t\t\t\t}\n\n\t\t\t\t++rootIterCount;\n\t\t\t\t++b2_toiRootIters;\n\n\t\t\t\tfloat32 s = fcn.Evaluate(indexA, indexB, t);\n\n\t\t\t\tif (b2Abs(s - target) < tolerance)\n\t\t\t\t{\n\t\t\t\t\t// t2 holds a tentative value for t1\n\t\t\t\t\tt2 = t;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Ensure we continue to bracket the root.\n\t\t\t\tif (s > target)\n\t\t\t\t{\n\t\t\t\t\ta1 = t;\n\t\t\t\t\ts1 = s;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta2 = t;\n\t\t\t\t\ts2 = s;\n\t\t\t\t}\n\n\t\t\t\tif (rootIterCount == 50)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tb2_toiMaxRootIters = b2Max(b2_toiMaxRootIters, rootIterCount);\n\n\t\t\t++pushBackIter;\n\n\t\t\tif (pushBackIter == b2_maxPolygonVertices)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t++iter;\n\t\t++b2_toiIters;\n\n\t\tif (done)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tif (iter == k_maxIterations)\n\t\t{\n\t\t\t// Root finder got stuck. Semi-victory.\n\t\t\toutput->state = b2TOIOutput::e_failed;\n\t\t\toutput->t = t1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tb2_toiMaxIters = b2Max(b2_toiMaxIters, iter);\n\n\tfloat32 time = timer.GetMilliseconds();\n\tb2_toiMaxTime = b2Max(b2_toiMaxTime, time);\n\tb2_toiTime += time;\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2Timer.cpp",
    "content": "/*\n* Copyright (c) 2011 Erin Catto http://box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Common/b2Timer.h\"\n\n#if defined(_WIN32)\n\nfloat64 b2Timer::s_invFrequency = 0.0f;\n\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n\nb2Timer::b2Timer()\n{\n\tLARGE_INTEGER largeInteger;\n\n\tif (s_invFrequency == 0.0f)\n\t{\n\t\tQueryPerformanceFrequency(&largeInteger);\n\t\ts_invFrequency = float64(largeInteger.QuadPart);\n\t\tif (s_invFrequency > 0.0f)\n\t\t{\n\t\t\ts_invFrequency = 1000.0f / s_invFrequency;\n\t\t}\n\t}\n\n\tQueryPerformanceCounter(&largeInteger);\n\tm_start = float64(largeInteger.QuadPart);\n}\n\nvoid b2Timer::Reset()\n{\n\tLARGE_INTEGER largeInteger;\n\tQueryPerformanceCounter(&largeInteger);\n\tm_start = float64(largeInteger.QuadPart);\n}\n\nfloat32 b2Timer::GetMilliseconds() const\n{\n\tLARGE_INTEGER largeInteger;\n\tQueryPerformanceCounter(&largeInteger);\n\tfloat64 count = float64(largeInteger.QuadPart);\n\tfloat32 ms = float32(s_invFrequency * (count - m_start));\n\treturn ms;\n}\n\n#elif defined(__linux__) || defined (__APPLE__)\n\n#include <sys/time.h>\n\nb2Timer::b2Timer()\n{\n    Reset();\n}\n\nvoid b2Timer::Reset()\n{\n    timeval t;\n    gettimeofday(&t, 0);\n    m_start_sec = t.tv_sec;\n    m_start_usec = t.tv_usec;\n}\n\nfloat32 b2Timer::GetMilliseconds() const\n{\n    timeval t;\n    gettimeofday(&t, 0);\n    return 1000.0f * (t.tv_sec - m_start_sec) + 0.001f * (t.tv_usec - m_start_usec);\n}\n\n#else\n\nb2Timer::b2Timer()\n{\n}\n\nvoid b2Timer::Reset()\n{\n}\n\nfloat32 b2Timer::GetMilliseconds() const\n{\n\treturn 0.0f;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/b2WeldJoint.cpp",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2WeldJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// Point-to-point constraint\n// C = p2 - p1\n// Cdot = v2 - v1\n//      = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n// J = [-I -r1_skew I r2_skew ]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n\n// Angle constraint\n// C = angle2 - angle1 - referenceAngle\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n// K = invI1 + invI2\n\nvoid b2WeldJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n\treferenceAngle = bodyB->GetAngle() - bodyA->GetAngle();\n}\n\nb2WeldJoint::b2WeldJoint(const b2WeldJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_referenceAngle = def->referenceAngle;\n\tm_frequencyHz = def->frequencyHz;\n\tm_dampingRatio = def->dampingRatio;\n\n\tm_impulse.SetZero();\n}\n\nvoid b2WeldJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// J = [-I -r1_skew I r2_skew]\n\t//     [ 0       -1 0       1]\n\t// r_skew = [-ry; rx]\n\n\t// Matlab\n\t// K = [ mA+r1y^2*iA+mB+r2y^2*iB,  -r1y*iA*r1x-r2y*iB*r2x,          -r1y*iA-r2y*iB]\n\t//     [  -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB,           r1x*iA+r2x*iB]\n\t//     [          -r1y*iA-r2y*iB,           r1x*iA+r2x*iB,                   iA+iB]\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tb2Mat33 K;\n\tK.ex.x = mA + mB + m_rA.y * m_rA.y * iA + m_rB.y * m_rB.y * iB;\n\tK.ey.x = -m_rA.y * m_rA.x * iA - m_rB.y * m_rB.x * iB;\n\tK.ez.x = -m_rA.y * iA - m_rB.y * iB;\n\tK.ex.y = K.ey.x;\n\tK.ey.y = mA + mB + m_rA.x * m_rA.x * iA + m_rB.x * m_rB.x * iB;\n\tK.ez.y = m_rA.x * iA + m_rB.x * iB;\n\tK.ex.z = K.ez.x;\n\tK.ey.z = K.ez.y;\n\tK.ez.z = iA + iB;\n\n\tif (m_frequencyHz > 0.0f)\n\t{\n\t\tK.GetInverse22(&m_mass);\n\n\t\tfloat32 invM = iA + iB;\n\t\tfloat32 m = invM > 0.0f ? 1.0f / invM : 0.0f;\n\n\t\tfloat32 C = aB - aA - m_referenceAngle;\n\n\t\t// Frequency\n\t\tfloat32 omega = 2.0f * b2_pi * m_frequencyHz;\n\n\t\t// Damping coefficient\n\t\tfloat32 d = 2.0f * m * m_dampingRatio * omega;\n\n\t\t// Spring stiffness\n\t\tfloat32 k = m * omega * omega;\n\n\t\t// magic formulas\n\t\tfloat32 h = data.step.dt;\n\t\tm_gamma = h * (d + h * k);\n\t\tm_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f;\n\t\tm_bias = C * h * k * m_gamma;\n\n\t\tinvM += m_gamma;\n\t\tm_mass.ez.z = invM != 0.0f ? 1.0f / invM : 0.0f;\n\t}\n\telse\n\t{\n\t\tK.GetSymInverse33(&m_mass);\n\t\tm_gamma = 0.0f;\n\t\tm_bias = 0.0f;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support a variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P(m_impulse.x, m_impulse.y);\n\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + m_impulse.z);\n\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + m_impulse.z);\n\t}\n\telse\n\t{\n\t\tm_impulse.SetZero();\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2WeldJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tif (m_frequencyHz > 0.0f)\n\t{\n\t\tfloat32 Cdot2 = wB - wA;\n\n\t\tfloat32 impulse2 = -m_mass.ez.z * (Cdot2 + m_bias + m_gamma * m_impulse.z);\n\t\tm_impulse.z += impulse2;\n\n\t\twA -= iA * impulse2;\n\t\twB += iB * impulse2;\n\n\t\tb2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA);\n\n\t\tb2Vec2 impulse1 = -b2Mul22(m_mass, Cdot1);\n\t\tm_impulse.x += impulse1.x;\n\t\tm_impulse.y += impulse1.y;\n\n\t\tb2Vec2 P = impulse1;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * b2Cross(m_rA, P);\n\n\t\tvB += mB * P;\n\t\twB += iB * b2Cross(m_rB, P);\n\t}\n\telse\n\t{\n\t\tb2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA);\n\t\tfloat32 Cdot2 = wB - wA;\n\t\tb2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2);\n\n\t\tb2Vec3 impulse = -b2Mul(m_mass, Cdot);\n\t\tm_impulse += impulse;\n\n\t\tb2Vec2 P(impulse.x, impulse.y);\n\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + impulse.z);\n\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + impulse.z);\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2WeldJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\tfloat32 positionError, angularError;\n\n\tb2Mat33 K;\n\tK.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n\tK.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n\tK.ez.x = -rA.y * iA - rB.y * iB;\n\tK.ex.y = K.ey.x;\n\tK.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n\tK.ez.y = rA.x * iA + rB.x * iB;\n\tK.ex.z = K.ez.x;\n\tK.ey.z = K.ez.y;\n\tK.ez.z = iA + iB;\n\n\tif (m_frequencyHz > 0.0f)\n\t{\n\t\tb2Vec2 C1 =  cB + rB - cA - rA;\n\n\t\tpositionError = C1.Length();\n\t\tangularError = 0.0f;\n\n\t\tb2Vec2 P = -K.Solve22(C1);\n\n\t\tcA -= mA * P;\n\t\taA -= iA * b2Cross(rA, P);\n\n\t\tcB += mB * P;\n\t\taB += iB * b2Cross(rB, P);\n\t}\n\telse\n\t{\n\t\tb2Vec2 C1 =  cB + rB - cA - rA;\n\t\tfloat32 C2 = aB - aA - m_referenceAngle;\n\n\t\tpositionError = C1.Length();\n\t\tangularError = b2Abs(C2);\n\n\t\tb2Vec3 C(C1.x, C1.y, C2);\n\n\t\tb2Vec3 impulse = -K.Solve33(C);\n\t\tb2Vec2 P(impulse.x, impulse.y);\n\n\t\tcA -= mA * P;\n\t\taA -= iA * (b2Cross(rA, P) + impulse.z);\n\n\t\tcB += mB * P;\n\t\taB += iB * (b2Cross(rB, P) + impulse.z);\n\t}\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn positionError <= b2_linearSlop && angularError <= b2_angularSlop;\n}\n\nb2Vec2 b2WeldJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2WeldJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2WeldJoint::GetReactionForce(float32 inv_dt) const\n{\n\tb2Vec2 P(m_impulse.x, m_impulse.y);\n\treturn inv_dt * P;\n}\n\nfloat32 b2WeldJoint::GetReactionTorque(float32 inv_dt) const\n{\n\treturn inv_dt * m_impulse.z;\n}\n\nvoid b2WeldJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Log(\"  b2WeldJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.localAnchorA.Set(%.15lef, %.15lef);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Log(\"  jd.localAnchorB.Set(%.15lef, %.15lef);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Log(\"  jd.referenceAngle = %.15lef;\\n\", m_referenceAngle);\n\tb2Log(\"  jd.frequencyHz = %.15lef;\\n\", m_frequencyHz);\n\tb2Log(\"  jd.dampingRatio = %.15lef;\\n\", m_dampingRatio);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2WheelJoint.cpp",
    "content": "/*\n* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2WheelJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\"\n\n// Linear constraint (point-to-line)\n// d = pB - pA = xB + rB - xA - rA\n// C = dot(ay, d)\n// Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA, rA))\n//      = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB, ay), vB)\n// J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n// Spring linear constraint\n// C = dot(ax, d)\n// Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) + dot(cross(rB, ax), vB)\n// J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n// Motor rotational constraint\n// Cdot = wB - wA\n// J = [0 0 -1 0 0 1]\n\nvoid b2WheelJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor, const b2Vec2& axis)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n\tlocalAxisA = bodyA->GetLocalVector(axis);\n}\n\nb2WheelJoint::b2WheelJoint(const b2WheelJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_localXAxisA = def->localAxisA;\n\tm_localYAxisA = b2Cross(1.0f, m_localXAxisA);\n\n\tm_mass = 0.0f;\n\tm_impulse = 0.0f;\n\tm_motorMass = 0.0f;\n\tm_motorImpulse = 0.0f;\n\tm_springMass = 0.0f;\n\tm_springImpulse = 0.0f;\n\n\tm_maxMotorTorque = def->maxMotorTorque;\n\tm_motorSpeed = def->motorSpeed;\n\tm_enableMotor = def->enableMotor;\n\n\tm_frequencyHz = def->frequencyHz;\n\tm_dampingRatio = def->dampingRatio;\n\n\tm_bias = 0.0f;\n\tm_gamma = 0.0f;\n\n\tm_ax.SetZero();\n\tm_ay.SetZero();\n}\n\nvoid b2WheelJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\t// Compute the effective masses.\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 d = cB + rB - cA - rA;\n\n\t// Point to line constraint\n\t{\n\t\tm_ay = b2Mul(qA, m_localYAxisA);\n\t\tm_sAy = b2Cross(d + rA, m_ay);\n\t\tm_sBy = b2Cross(rB, m_ay);\n\n\t\tm_mass = mA + mB + iA * m_sAy * m_sAy + iB * m_sBy * m_sBy;\n\n\t\tif (m_mass > 0.0f)\n\t\t{\n\t\t\tm_mass = 1.0f / m_mass;\n\t\t}\n\t}\n\n\t// Spring constraint\n\tm_springMass = 0.0f;\n\tm_bias = 0.0f;\n\tm_gamma = 0.0f;\n\tif (m_frequencyHz > 0.0f)\n\t{\n\t\tm_ax = b2Mul(qA, m_localXAxisA);\n\t\tm_sAx = b2Cross(d + rA, m_ax);\n\t\tm_sBx = b2Cross(rB, m_ax);\n\n\t\tfloat32 invMass = mA + mB + iA * m_sAx * m_sAx + iB * m_sBx * m_sBx;\n\n\t\tif (invMass > 0.0f)\n\t\t{\n\t\t\tm_springMass = 1.0f / invMass;\n\n\t\t\tfloat32 C = b2Dot(d, m_ax);\n\n\t\t\t// Frequency\n\t\t\tfloat32 omega = 2.0f * b2_pi * m_frequencyHz;\n\n\t\t\t// Damping coefficient\n\t\t\tfloat32 d = 2.0f * m_springMass * m_dampingRatio * omega;\n\n\t\t\t// Spring stiffness\n\t\t\tfloat32 k = m_springMass * omega * omega;\n\n\t\t\t// magic formulas\n\t\t\tfloat32 h = data.step.dt;\n\t\t\tm_gamma = h * (d + h * k);\n\t\t\tif (m_gamma > 0.0f)\n\t\t\t{\n\t\t\t\tm_gamma = 1.0f / m_gamma;\n\t\t\t}\n\n\t\t\tm_bias = C * h * k * m_gamma;\n\n\t\t\tm_springMass = invMass + m_gamma;\n\t\t\tif (m_springMass > 0.0f)\n\t\t\t{\n\t\t\t\tm_springMass = 1.0f / m_springMass;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_springImpulse = 0.0f;\n\t}\n\n\t// Rotational motor\n\tif (m_enableMotor)\n\t{\n\t\tm_motorMass = iA + iB;\n\t\tif (m_motorMass > 0.0f)\n\t\t{\n\t\t\tm_motorMass = 1.0f / m_motorMass;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_motorMass = 0.0f;\n\t\tm_motorImpulse = 0.0f;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Account for variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\t\tm_springImpulse *= data.step.dtRatio;\n\t\tm_motorImpulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P = m_impulse * m_ay + m_springImpulse * m_ax;\n\t\tfloat32 LA = m_impulse * m_sAy + m_springImpulse * m_sAx + m_motorImpulse;\n\t\tfloat32 LB = m_impulse * m_sBy + m_springImpulse * m_sBx + m_motorImpulse;\n\n\t\tvA -= m_invMassA * P;\n\t\twA -= m_invIA * LA;\n\n\t\tvB += m_invMassB * P;\n\t\twB += m_invIB * LB;\n\t}\n\telse\n\t{\n\t\tm_impulse = 0.0f;\n\t\tm_springImpulse = 0.0f;\n\t\tm_motorImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2WheelJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tfloat32 mA = m_invMassA, mB = m_invMassB;\n\tfloat32 iA = m_invIA, iB = m_invIB;\n\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat32 wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat32 wB = data.velocities[m_indexB].w;\n\n\t// Solve spring constraint\n\t{\n\t\tfloat32 Cdot = b2Dot(m_ax, vB - vA) + m_sBx * wB - m_sAx * wA;\n\t\tfloat32 impulse = -m_springMass * (Cdot + m_bias + m_gamma * m_springImpulse);\n\t\tm_springImpulse += impulse;\n\n\t\tb2Vec2 P = impulse * m_ax;\n\t\tfloat32 LA = impulse * m_sAx;\n\t\tfloat32 LB = impulse * m_sBx;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\n\t// Solve rotational motor constraint\n\t{\n\t\tfloat32 Cdot = wB - wA - m_motorSpeed;\n\t\tfloat32 impulse = -m_motorMass * Cdot;\n\n\t\tfloat32 oldImpulse = m_motorImpulse;\n\t\tfloat32 maxImpulse = data.step.dt * m_maxMotorTorque;\n\t\tm_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_motorImpulse - oldImpulse;\n\n\t\twA -= iA * impulse;\n\t\twB += iB * impulse;\n\t}\n\n\t// Solve point to line constraint\n\t{\n\t\tfloat32 Cdot = b2Dot(m_ay, vB - vA) + m_sBy * wB - m_sAy * wA;\n\t\tfloat32 impulse = -m_mass * Cdot;\n\t\tm_impulse += impulse;\n\n\t\tb2Vec2 P = impulse * m_ay;\n\t\tfloat32 LA = impulse * m_sAy;\n\t\tfloat32 LB = impulse * m_sBy;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2WheelJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat32 aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat32 aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 d = (cB - cA) + rB - rA;\n\n\tb2Vec2 ay = b2Mul(qA, m_localYAxisA);\n\n\tfloat32 sAy = b2Cross(d + rA, ay);\n\tfloat32 sBy = b2Cross(rB, ay);\n\n\tfloat32 C = b2Dot(d, ay);\n\n\tfloat32 k = m_invMassA + m_invMassB + m_invIA * m_sAy * m_sAy + m_invIB * m_sBy * m_sBy;\n\n\tfloat32 impulse;\n\tif (k != 0.0f)\n\t{\n\t\timpulse = - C / k;\n\t}\n\telse\n\t{\n\t\timpulse = 0.0f;\n\t}\n\n\tb2Vec2 P = impulse * ay;\n\tfloat32 LA = impulse * sAy;\n\tfloat32 LB = impulse * sBy;\n\n\tcA -= m_invMassA * P;\n\taA -= m_invIA * LA;\n\tcB += m_invMassB * P;\n\taB += m_invIB * LB;\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn b2Abs(C) <= b2_linearSlop;\n}\n\nb2Vec2 b2WheelJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2WheelJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2WheelJoint::GetReactionForce(float32 inv_dt) const\n{\n\treturn inv_dt * (m_impulse * m_ay + m_springImpulse * m_ax);\n}\n\nfloat32 b2WheelJoint::GetReactionTorque(float32 inv_dt) const\n{\n\treturn inv_dt * m_motorImpulse;\n}\n\nfloat32 b2WheelJoint::GetJointTranslation() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\n\tb2Vec2 pA = bA->GetWorldPoint(m_localAnchorA);\n\tb2Vec2 pB = bB->GetWorldPoint(m_localAnchorB);\n\tb2Vec2 d = pB - pA;\n\tb2Vec2 axis = bA->GetWorldVector(m_localXAxisA);\n\n\tfloat32 translation = b2Dot(d, axis);\n\treturn translation;\n}\n\nfloat32 b2WheelJoint::GetJointSpeed() const\n{\n\tfloat32 wA = m_bodyA->m_angularVelocity;\n\tfloat32 wB = m_bodyB->m_angularVelocity;\n\treturn wB - wA;\n}\n\nbool b2WheelJoint::IsMotorEnabled() const\n{\n\treturn m_enableMotor;\n}\n\nvoid b2WheelJoint::EnableMotor(bool flag)\n{\n\tm_bodyA->SetAwake(true);\n\tm_bodyB->SetAwake(true);\n\tm_enableMotor = flag;\n}\n\nvoid b2WheelJoint::SetMotorSpeed(float32 speed)\n{\n\tm_bodyA->SetAwake(true);\n\tm_bodyB->SetAwake(true);\n\tm_motorSpeed = speed;\n}\n\nvoid b2WheelJoint::SetMaxMotorTorque(float32 torque)\n{\n\tm_bodyA->SetAwake(true);\n\tm_bodyB->SetAwake(true);\n\tm_maxMotorTorque = torque;\n}\n\nfloat32 b2WheelJoint::GetMotorTorque(float32 inv_dt) const\n{\n\treturn inv_dt * m_motorImpulse;\n}\n\nvoid b2WheelJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Log(\"  b2WheelJointDef jd;\\n\");\n\tb2Log(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Log(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Log(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Log(\"  jd.localAnchorA.Set(%.15lef, %.15lef);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Log(\"  jd.localAnchorB.Set(%.15lef, %.15lef);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Log(\"  jd.localAxisA.Set(%.15lef, %.15lef);\\n\", m_localXAxisA.x, m_localXAxisA.y);\n\tb2Log(\"  jd.enableMotor = bool(%d);\\n\", m_enableMotor);\n\tb2Log(\"  jd.motorSpeed = %.15lef;\\n\", m_motorSpeed);\n\tb2Log(\"  jd.maxMotorTorque = %.15lef;\\n\", m_maxMotorTorque);\n\tb2Log(\"  jd.frequencyHz = %.15lef;\\n\", m_frequencyHz);\n\tb2Log(\"  jd.dampingRatio = %.15lef;\\n\", m_dampingRatio);\n\tb2Log(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2World.cpp",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2World.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Body.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Island.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2Collision.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2BroadPhase.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\"\n#include \"isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2Draw.h\"\n#include \"isEngine/ext_lib/Box2D/Common/b2Timer.h\"\n#include <new>\n\nb2World::b2World(const b2Vec2& gravity)\n{\n\tm_destructionListener = NULL;\n\tm_debugDraw = NULL;\n\n\tm_bodyList = NULL;\n\tm_jointList = NULL;\n\n\tm_bodyCount = 0;\n\tm_jointCount = 0;\n\n\tm_warmStarting = true;\n\tm_continuousPhysics = true;\n\tm_subStepping = false;\n\n\tm_stepComplete = true;\n\n\tm_allowSleep = true;\n\tm_gravity = gravity;\n\n\tm_flags = e_clearForces;\n\n\tm_inv_dt0 = 0.0f;\n\n\tm_contactManager.m_allocator = &m_blockAllocator;\n\n\tmemset(&m_profile, 0, sizeof(b2Profile));\n}\n\nb2World::~b2World()\n{\n\t// Some shapes allocate using b2Alloc.\n\tb2Body* b = m_bodyList;\n\twhile (b)\n\t{\n\t\tb2Body* bNext = b->m_next;\n\n\t\tb2Fixture* f = b->m_fixtureList;\n\t\twhile (f)\n\t\t{\n\t\t\tb2Fixture* fNext = f->m_next;\n\t\t\tf->m_proxyCount = 0;\n\t\t\tf->Destroy(&m_blockAllocator);\n\t\t\tf = fNext;\n\t\t}\n\n\t\tb = bNext;\n\t}\n}\n\nvoid b2World::SetDestructionListener(b2DestructionListener* listener)\n{\n\tm_destructionListener = listener;\n}\n\nvoid b2World::SetContactFilter(b2ContactFilter* filter)\n{\n\tm_contactManager.m_contactFilter = filter;\n}\n\nvoid b2World::SetContactListener(b2ContactListener* listener)\n{\n\tm_contactManager.m_contactListener = listener;\n}\n\nvoid b2World::SetDebugDraw(b2Draw* debugDraw)\n{\n\tm_debugDraw = debugDraw;\n}\n\nb2Body* b2World::CreateBody(const b2BodyDef* def)\n{\n\tb2Assert(IsLocked() == false);\n\tif (IsLocked())\n\t{\n\t\treturn NULL;\n\t}\n\n\tvoid* mem = m_blockAllocator.Allocate(sizeof(b2Body));\n\tb2Body* b = new (mem) b2Body(def, this);\n\n\t// Add to world doubly linked list.\n\tb->m_prev = NULL;\n\tb->m_next = m_bodyList;\n\tif (m_bodyList)\n\t{\n\t\tm_bodyList->m_prev = b;\n\t}\n\tm_bodyList = b;\n\t++m_bodyCount;\n\n\treturn b;\n}\n\nvoid b2World::DestroyBody(b2Body* b)\n{\n\tb2Assert(m_bodyCount > 0);\n\tb2Assert(IsLocked() == false);\n\tif (IsLocked())\n\t{\n\t\treturn;\n\t}\n\n\t// Delete the attached joints.\n\tb2JointEdge* je = b->m_jointList;\n\twhile (je)\n\t{\n\t\tb2JointEdge* je0 = je;\n\t\tje = je->next;\n\n\t\tif (m_destructionListener)\n\t\t{\n\t\t\tm_destructionListener->SayGoodbye(je0->joint);\n\t\t}\n\n\t\tDestroyJoint(je0->joint);\n\n\t\tb->m_jointList = je;\n\t}\n\tb->m_jointList = NULL;\n\n\t// Delete the attached contacts.\n\tb2ContactEdge* ce = b->m_contactList;\n\twhile (ce)\n\t{\n\t\tb2ContactEdge* ce0 = ce;\n\t\tce = ce->next;\n\t\tm_contactManager.Destroy(ce0->contact);\n\t}\n\tb->m_contactList = NULL;\n\n\t// Delete the attached fixtures. This destroys broad-phase proxies.\n\tb2Fixture* f = b->m_fixtureList;\n\twhile (f)\n\t{\n\t\tb2Fixture* f0 = f;\n\t\tf = f->m_next;\n\n\t\tif (m_destructionListener)\n\t\t{\n\t\t\tm_destructionListener->SayGoodbye(f0);\n\t\t}\n\n\t\tf0->DestroyProxies(&m_contactManager.m_broadPhase);\n\t\tf0->Destroy(&m_blockAllocator);\n\t\tf0->~b2Fixture();\n\t\tm_blockAllocator.Free(f0, sizeof(b2Fixture));\n\n\t\tb->m_fixtureList = f;\n\t\tb->m_fixtureCount -= 1;\n\t}\n\tb->m_fixtureList = NULL;\n\tb->m_fixtureCount = 0;\n\n\t// Remove world body list.\n\tif (b->m_prev)\n\t{\n\t\tb->m_prev->m_next = b->m_next;\n\t}\n\n\tif (b->m_next)\n\t{\n\t\tb->m_next->m_prev = b->m_prev;\n\t}\n\n\tif (b == m_bodyList)\n\t{\n\t\tm_bodyList = b->m_next;\n\t}\n\n\t--m_bodyCount;\n\tb->~b2Body();\n\tm_blockAllocator.Free(b, sizeof(b2Body));\n}\n\nb2Joint* b2World::CreateJoint(const b2JointDef* def)\n{\n\tb2Assert(IsLocked() == false);\n\tif (IsLocked())\n\t{\n\t\treturn NULL;\n\t}\n\n\tb2Joint* j = b2Joint::Create(def, &m_blockAllocator);\n\n\t// Connect to the world list.\n\tj->m_prev = NULL;\n\tj->m_next = m_jointList;\n\tif (m_jointList)\n\t{\n\t\tm_jointList->m_prev = j;\n\t}\n\tm_jointList = j;\n\t++m_jointCount;\n\n\t// Connect to the bodies' doubly linked lists.\n\tj->m_edgeA.joint = j;\n\tj->m_edgeA.other = j->m_bodyB;\n\tj->m_edgeA.prev = NULL;\n\tj->m_edgeA.next = j->m_bodyA->m_jointList;\n\tif (j->m_bodyA->m_jointList) j->m_bodyA->m_jointList->prev = &j->m_edgeA;\n\tj->m_bodyA->m_jointList = &j->m_edgeA;\n\n\tj->m_edgeB.joint = j;\n\tj->m_edgeB.other = j->m_bodyA;\n\tj->m_edgeB.prev = NULL;\n\tj->m_edgeB.next = j->m_bodyB->m_jointList;\n\tif (j->m_bodyB->m_jointList) j->m_bodyB->m_jointList->prev = &j->m_edgeB;\n\tj->m_bodyB->m_jointList = &j->m_edgeB;\n\n\tb2Body* bodyA = def->bodyA;\n\tb2Body* bodyB = def->bodyB;\n\n\t// If the joint prevents collisions, then flag any contacts for filtering.\n\tif (def->collideConnected == false)\n\t{\n\t\tb2ContactEdge* edge = bodyB->GetContactList();\n\t\twhile (edge)\n\t\t{\n\t\t\tif (edge->other == bodyA)\n\t\t\t{\n\t\t\t\t// Flag the contact for filtering at the next time step (where either\n\t\t\t\t// body is awake).\n\t\t\t\tedge->contact->FlagForFiltering();\n\t\t\t}\n\n\t\t\tedge = edge->next;\n\t\t}\n\t}\n\n\t// Note: creating a joint doesn't wake the bodies.\n\n\treturn j;\n}\n\nvoid b2World::DestroyJoint(b2Joint* j)\n{\n\tb2Assert(IsLocked() == false);\n\tif (IsLocked())\n\t{\n\t\treturn;\n\t}\n\n\tbool collideConnected = j->m_collideConnected;\n\n\t// Remove from the doubly linked list.\n\tif (j->m_prev)\n\t{\n\t\tj->m_prev->m_next = j->m_next;\n\t}\n\n\tif (j->m_next)\n\t{\n\t\tj->m_next->m_prev = j->m_prev;\n\t}\n\n\tif (j == m_jointList)\n\t{\n\t\tm_jointList = j->m_next;\n\t}\n\n\t// Disconnect from island graph.\n\tb2Body* bodyA = j->m_bodyA;\n\tb2Body* bodyB = j->m_bodyB;\n\n\t// Wake up connected bodies.\n\tbodyA->SetAwake(true);\n\tbodyB->SetAwake(true);\n\n\t// Remove from body 1.\n\tif (j->m_edgeA.prev)\n\t{\n\t\tj->m_edgeA.prev->next = j->m_edgeA.next;\n\t}\n\n\tif (j->m_edgeA.next)\n\t{\n\t\tj->m_edgeA.next->prev = j->m_edgeA.prev;\n\t}\n\n\tif (&j->m_edgeA == bodyA->m_jointList)\n\t{\n\t\tbodyA->m_jointList = j->m_edgeA.next;\n\t}\n\n\tj->m_edgeA.prev = NULL;\n\tj->m_edgeA.next = NULL;\n\n\t// Remove from body 2\n\tif (j->m_edgeB.prev)\n\t{\n\t\tj->m_edgeB.prev->next = j->m_edgeB.next;\n\t}\n\n\tif (j->m_edgeB.next)\n\t{\n\t\tj->m_edgeB.next->prev = j->m_edgeB.prev;\n\t}\n\n\tif (&j->m_edgeB == bodyB->m_jointList)\n\t{\n\t\tbodyB->m_jointList = j->m_edgeB.next;\n\t}\n\n\tj->m_edgeB.prev = NULL;\n\tj->m_edgeB.next = NULL;\n\n\tb2Joint::Destroy(j, &m_blockAllocator);\n\n\tb2Assert(m_jointCount > 0);\n\t--m_jointCount;\n\n\t// If the joint prevents collisions, then flag any contacts for filtering.\n\tif (collideConnected == false)\n\t{\n\t\tb2ContactEdge* edge = bodyB->GetContactList();\n\t\twhile (edge)\n\t\t{\n\t\t\tif (edge->other == bodyA)\n\t\t\t{\n\t\t\t\t// Flag the contact for filtering at the next time step (where either\n\t\t\t\t// body is awake).\n\t\t\t\tedge->contact->FlagForFiltering();\n\t\t\t}\n\n\t\t\tedge = edge->next;\n\t\t}\n\t}\n}\n\n//\nvoid b2World::SetAllowSleeping(bool flag)\n{\n\tif (flag == m_allowSleep)\n\t{\n\t\treturn;\n\t}\n\n\tm_allowSleep = flag;\n\tif (m_allowSleep == false)\n\t{\n\t\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t\t{\n\t\t\tb->SetAwake(true);\n\t\t}\n\t}\n}\n\n// Find islands, integrate and solve constraints, solve position constraints\nvoid b2World::Solve(const b2TimeStep& step)\n{\n\tm_profile.solveInit = 0.0f;\n\tm_profile.solveVelocity = 0.0f;\n\tm_profile.solvePosition = 0.0f;\n\n\t// Size the island for the worst case.\n\tb2Island island(m_bodyCount,\n\t\t\t\t\tm_contactManager.m_contactCount,\n\t\t\t\t\tm_jointCount,\n\t\t\t\t\t&m_stackAllocator,\n\t\t\t\t\tm_contactManager.m_contactListener);\n\n\t// Clear all the island flags.\n\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t{\n\t\tb->m_flags &= ~b2Body::e_islandFlag;\n\t}\n\tfor (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next)\n\t{\n\t\tc->m_flags &= ~b2Contact::e_islandFlag;\n\t}\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tj->m_islandFlag = false;\n\t}\n\n\t// Build and simulate all awake islands.\n\tint32 stackSize = m_bodyCount;\n\tb2Body** stack = (b2Body**)m_stackAllocator.Allocate(stackSize * sizeof(b2Body*));\n\tfor (b2Body* seed = m_bodyList; seed; seed = seed->m_next)\n\t{\n\t\tif (seed->m_flags & b2Body::e_islandFlag)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (seed->IsAwake() == false || seed->IsActive() == false)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// The seed can be dynamic or kinematic.\n\t\tif (seed->GetType() == b2_staticBody)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Reset island and stack.\n\t\tisland.Clear();\n\t\tint32 stackCount = 0;\n\t\tstack[stackCount++] = seed;\n\t\tseed->m_flags |= b2Body::e_islandFlag;\n\n\t\t// Perform a depth first search (DFS) on the constraint graph.\n\t\twhile (stackCount > 0)\n\t\t{\n\t\t\t// Grab the next body off the stack and add it to the island.\n\t\t\tb2Body* b = stack[--stackCount];\n\t\t\tb2Assert(b->IsActive() == true);\n\t\t\tisland.Add(b);\n\n\t\t\t// Make sure the body is awake.\n\t\t\tb->SetAwake(true);\n\n\t\t\t// To keep islands as small as possible, we don't\n\t\t\t// propagate islands across static bodies.\n\t\t\tif (b->GetType() == b2_staticBody)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Search all contacts connected to this body.\n\t\t\tfor (b2ContactEdge* ce = b->m_contactList; ce; ce = ce->next)\n\t\t\t{\n\t\t\t\tb2Contact* contact = ce->contact;\n\n\t\t\t\t// Has this contact already been added to an island?\n\t\t\t\tif (contact->m_flags & b2Contact::e_islandFlag)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Is this contact solid and touching?\n\t\t\t\tif (contact->IsEnabled() == false ||\n\t\t\t\t\tcontact->IsTouching() == false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip sensors.\n\t\t\t\tbool sensorA = contact->m_fixtureA->m_isSensor;\n\t\t\t\tbool sensorB = contact->m_fixtureB->m_isSensor;\n\t\t\t\tif (sensorA || sensorB)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tisland.Add(contact);\n\t\t\t\tcontact->m_flags |= b2Contact::e_islandFlag;\n\n\t\t\t\tb2Body* other = ce->other;\n\n\t\t\t\t// Was the other body already added to this island?\n\t\t\t\tif (other->m_flags & b2Body::e_islandFlag)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tb2Assert(stackCount < stackSize);\n\t\t\t\tstack[stackCount++] = other;\n\t\t\t\tother->m_flags |= b2Body::e_islandFlag;\n\t\t\t}\n\n\t\t\t// Search all joints connect to this body.\n\t\t\tfor (b2JointEdge* je = b->m_jointList; je; je = je->next)\n\t\t\t{\n\t\t\t\tif (je->joint->m_islandFlag == true)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tb2Body* other = je->other;\n\n\t\t\t\t// Don't simulate joints connected to inactive bodies.\n\t\t\t\tif (other->IsActive() == false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tisland.Add(je->joint);\n\t\t\t\tje->joint->m_islandFlag = true;\n\n\t\t\t\tif (other->m_flags & b2Body::e_islandFlag)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tb2Assert(stackCount < stackSize);\n\t\t\t\tstack[stackCount++] = other;\n\t\t\t\tother->m_flags |= b2Body::e_islandFlag;\n\t\t\t}\n\t\t}\n\n\t\tb2Profile profile;\n\t\tisland.Solve(&profile, step, m_gravity, m_allowSleep);\n\t\tm_profile.solveInit += profile.solveInit;\n\t\tm_profile.solveVelocity += profile.solveVelocity;\n\t\tm_profile.solvePosition += profile.solvePosition;\n\n\t\t// Post solve cleanup.\n\t\tfor (int32 i = 0; i < island.m_bodyCount; ++i)\n\t\t{\n\t\t\t// Allow static bodies to participate in other islands.\n\t\t\tb2Body* b = island.m_bodies[i];\n\t\t\tif (b->GetType() == b2_staticBody)\n\t\t\t{\n\t\t\t\tb->m_flags &= ~b2Body::e_islandFlag;\n\t\t\t}\n\t\t}\n\t}\n\n\tm_stackAllocator.Free(stack);\n\n\t{\n\t\tb2Timer timer;\n\t\t// Synchronize fixtures, check for out of range bodies.\n\t\tfor (b2Body* b = m_bodyList; b; b = b->GetNext())\n\t\t{\n\t\t\t// If a body was not in an island then it did not move.\n\t\t\tif ((b->m_flags & b2Body::e_islandFlag) == 0)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (b->GetType() == b2_staticBody)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Update fixtures (for broad-phase).\n\t\t\tb->SynchronizeFixtures();\n\t\t}\n\n\t\t// Look for new contacts.\n\t\tm_contactManager.FindNewContacts();\n\t\tm_profile.broadphase = timer.GetMilliseconds();\n\t}\n}\n\n// Find TOI contacts and solve them.\nvoid b2World::SolveTOI(const b2TimeStep& step)\n{\n\tb2Island island(2 * b2_maxTOIContacts, b2_maxTOIContacts, 0, &m_stackAllocator, m_contactManager.m_contactListener);\n\n\tif (m_stepComplete)\n\t{\n\t\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t\t{\n\t\t\tb->m_flags &= ~b2Body::e_islandFlag;\n\t\t\tb->m_sweep.alpha0 = 0.0f;\n\t\t}\n\n\t\tfor (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next)\n\t\t{\n\t\t\t// Invalidate TOI\n\t\t\tc->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag);\n\t\t\tc->m_toiCount = 0;\n\t\t\tc->m_toi = 1.0f;\n\t\t}\n\t}\n\n\t// Find TOI events and solve them.\n\tfor (;;)\n\t{\n\t\t// Find the first TOI.\n\t\tb2Contact* minContact = NULL;\n\t\tfloat32 minAlpha = 1.0f;\n\n\t\tfor (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next)\n\t\t{\n\t\t\t// Is this contact disabled?\n\t\t\tif (c->IsEnabled() == false)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Prevent excessive sub-stepping.\n\t\t\tif (c->m_toiCount > b2_maxSubSteps)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfloat32 alpha = 1.0f;\n\t\t\tif (c->m_flags & b2Contact::e_toiFlag)\n\t\t\t{\n\t\t\t\t// This contact has a valid cached TOI.\n\t\t\t\talpha = c->m_toi;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tb2Fixture* fA = c->GetFixtureA();\n\t\t\t\tb2Fixture* fB = c->GetFixtureB();\n\n\t\t\t\t// Is there a sensor?\n\t\t\t\tif (fA->IsSensor() || fB->IsSensor())\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tb2Body* bA = fA->GetBody();\n\t\t\t\tb2Body* bB = fB->GetBody();\n\n\t\t\t\tb2BodyType typeA = bA->m_type;\n\t\t\t\tb2BodyType typeB = bB->m_type;\n\t\t\t\tb2Assert(typeA == b2_dynamicBody || typeB == b2_dynamicBody);\n\n\t\t\t\tbool activeA = bA->IsAwake() && typeA != b2_staticBody;\n\t\t\t\tbool activeB = bB->IsAwake() && typeB != b2_staticBody;\n\n\t\t\t\t// Is at least one body active (awake and dynamic or kinematic)?\n\t\t\t\tif (activeA == false && activeB == false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tbool collideA = bA->IsBullet() || typeA != b2_dynamicBody;\n\t\t\t\tbool collideB = bB->IsBullet() || typeB != b2_dynamicBody;\n\n\t\t\t\t// Are these two non-bullet dynamic bodies?\n\t\t\t\tif (collideA == false && collideB == false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Compute the TOI for this contact.\n\t\t\t\t// Put the sweeps onto the same time interval.\n\t\t\t\tfloat32 alpha0 = bA->m_sweep.alpha0;\n\n\t\t\t\tif (bA->m_sweep.alpha0 < bB->m_sweep.alpha0)\n\t\t\t\t{\n\t\t\t\t\talpha0 = bB->m_sweep.alpha0;\n\t\t\t\t\tbA->m_sweep.Advance(alpha0);\n\t\t\t\t}\n\t\t\t\telse if (bB->m_sweep.alpha0 < bA->m_sweep.alpha0)\n\t\t\t\t{\n\t\t\t\t\talpha0 = bA->m_sweep.alpha0;\n\t\t\t\t\tbB->m_sweep.Advance(alpha0);\n\t\t\t\t}\n\n\t\t\t\tb2Assert(alpha0 < 1.0f);\n\n\t\t\t\tint32 indexA = c->GetChildIndexA();\n\t\t\t\tint32 indexB = c->GetChildIndexB();\n\n\t\t\t\t// Compute the time of impact in interval [0, minTOI]\n\t\t\t\tb2TOIInput input;\n\t\t\t\tinput.proxyA.Set(fA->GetShape(), indexA);\n\t\t\t\tinput.proxyB.Set(fB->GetShape(), indexB);\n\t\t\t\tinput.sweepA = bA->m_sweep;\n\t\t\t\tinput.sweepB = bB->m_sweep;\n\t\t\t\tinput.tMax = 1.0f;\n\n\t\t\t\tb2TOIOutput output;\n\t\t\t\tb2TimeOfImpact(&output, &input);\n\n\t\t\t\t// Beta is the fraction of the remaining portion of the .\n\t\t\t\tfloat32 beta = output.t;\n\t\t\t\tif (output.state == b2TOIOutput::e_touching)\n\t\t\t\t{\n\t\t\t\t\talpha = b2Min(alpha0 + (1.0f - alpha0) * beta, 1.0f);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\talpha = 1.0f;\n\t\t\t\t}\n\n\t\t\t\tc->m_toi = alpha;\n\t\t\t\tc->m_flags |= b2Contact::e_toiFlag;\n\t\t\t}\n\n\t\t\tif (alpha < minAlpha)\n\t\t\t{\n\t\t\t\t// This is the minimum TOI found so far.\n\t\t\t\tminContact = c;\n\t\t\t\tminAlpha = alpha;\n\t\t\t}\n\t\t}\n\n\t\tif (minContact == NULL || 1.0f - 10.0f * b2_epsilon < minAlpha)\n\t\t{\n\t\t\t// No more TOI events. Done!\n\t\t\tm_stepComplete = true;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Advance the bodies to the TOI.\n\t\tb2Fixture* fA = minContact->GetFixtureA();\n\t\tb2Fixture* fB = minContact->GetFixtureB();\n\t\tb2Body* bA = fA->GetBody();\n\t\tb2Body* bB = fB->GetBody();\n\n\t\tb2Sweep backup1 = bA->m_sweep;\n\t\tb2Sweep backup2 = bB->m_sweep;\n\n\t\tbA->Advance(minAlpha);\n\t\tbB->Advance(minAlpha);\n\n\t\t// The TOI contact likely has some new contact points.\n\t\tminContact->Update(m_contactManager.m_contactListener);\n\t\tminContact->m_flags &= ~b2Contact::e_toiFlag;\n\t\t++minContact->m_toiCount;\n\n\t\t// Is the contact solid?\n\t\tif (minContact->IsEnabled() == false || minContact->IsTouching() == false)\n\t\t{\n\t\t\t// Restore the sweeps.\n\t\t\tminContact->SetEnabled(false);\n\t\t\tbA->m_sweep = backup1;\n\t\t\tbB->m_sweep = backup2;\n\t\t\tbA->SynchronizeTransform();\n\t\t\tbB->SynchronizeTransform();\n\t\t\tcontinue;\n\t\t}\n\n\t\tbA->SetAwake(true);\n\t\tbB->SetAwake(true);\n\n\t\t// Build the island\n\t\tisland.Clear();\n\t\tisland.Add(bA);\n\t\tisland.Add(bB);\n\t\tisland.Add(minContact);\n\n\t\tbA->m_flags |= b2Body::e_islandFlag;\n\t\tbB->m_flags |= b2Body::e_islandFlag;\n\t\tminContact->m_flags |= b2Contact::e_islandFlag;\n\n\t\t// Get contacts on bodyA and bodyB.\n\t\tb2Body* bodies[2] = {bA, bB};\n\t\tfor (int32 i = 0; i < 2; ++i)\n\t\t{\n\t\t\tb2Body* body = bodies[i];\n\t\t\tif (body->m_type == b2_dynamicBody)\n\t\t\t{\n\t\t\t\tfor (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next)\n\t\t\t\t{\n\t\t\t\t\tif (island.m_bodyCount == island.m_bodyCapacity)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (island.m_contactCount == island.m_contactCapacity)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tb2Contact* contact = ce->contact;\n\n\t\t\t\t\t// Has this contact already been added to the island?\n\t\t\t\t\tif (contact->m_flags & b2Contact::e_islandFlag)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only add static, kinematic, or bullet bodies.\n\t\t\t\t\tb2Body* other = ce->other;\n\t\t\t\t\tif (other->m_type == b2_dynamicBody &&\n\t\t\t\t\t\tbody->IsBullet() == false && other->IsBullet() == false)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Skip sensors.\n\t\t\t\t\tbool sensorA = contact->m_fixtureA->m_isSensor;\n\t\t\t\t\tbool sensorB = contact->m_fixtureB->m_isSensor;\n\t\t\t\t\tif (sensorA || sensorB)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Tentatively advance the body to the TOI.\n\t\t\t\t\tb2Sweep backup = other->m_sweep;\n\t\t\t\t\tif ((other->m_flags & b2Body::e_islandFlag) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tother->Advance(minAlpha);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update the contact points\n\t\t\t\t\tcontact->Update(m_contactManager.m_contactListener);\n\n\t\t\t\t\t// Was the contact disabled by the user?\n\t\t\t\t\tif (contact->IsEnabled() == false)\n\t\t\t\t\t{\n\t\t\t\t\t\tother->m_sweep = backup;\n\t\t\t\t\t\tother->SynchronizeTransform();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Are there contact points?\n\t\t\t\t\tif (contact->IsTouching() == false)\n\t\t\t\t\t{\n\t\t\t\t\t\tother->m_sweep = backup;\n\t\t\t\t\t\tother->SynchronizeTransform();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add the contact to the island\n\t\t\t\t\tcontact->m_flags |= b2Contact::e_islandFlag;\n\t\t\t\t\tisland.Add(contact);\n\n\t\t\t\t\t// Has the other body already been added to the island?\n\t\t\t\t\tif (other->m_flags & b2Body::e_islandFlag)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add the other body to the island.\n\t\t\t\t\tother->m_flags |= b2Body::e_islandFlag;\n\n\t\t\t\t\tif (other->m_type != b2_staticBody)\n\t\t\t\t\t{\n\t\t\t\t\t\tother->SetAwake(true);\n\t\t\t\t\t}\n\n\t\t\t\t\tisland.Add(other);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tb2TimeStep subStep;\n\t\tsubStep.dt = (1.0f - minAlpha) * step.dt;\n\t\tsubStep.inv_dt = 1.0f / subStep.dt;\n\t\tsubStep.dtRatio = 1.0f;\n\t\tsubStep.positionIterations = 20;\n\t\tsubStep.velocityIterations = step.velocityIterations;\n\t\tsubStep.warmStarting = false;\n\t\tisland.SolveTOI(subStep, bA->m_islandIndex, bB->m_islandIndex);\n\n\t\t// Reset island flags and synchronize broad-phase proxies.\n\t\tfor (int32 i = 0; i < island.m_bodyCount; ++i)\n\t\t{\n\t\t\tb2Body* body = island.m_bodies[i];\n\t\t\tbody->m_flags &= ~b2Body::e_islandFlag;\n\n\t\t\tif (body->m_type != b2_dynamicBody)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbody->SynchronizeFixtures();\n\n\t\t\t// Invalidate all contact TOIs on this displaced body.\n\t\t\tfor (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next)\n\t\t\t{\n\t\t\t\tce->contact->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag);\n\t\t\t}\n\t\t}\n\n\t\t// Commit fixture proxy movements to the broad-phase so that new contacts are created.\n\t\t// Also, some contacts can be destroyed.\n\t\tm_contactManager.FindNewContacts();\n\n\t\tif (m_subStepping)\n\t\t{\n\t\t\tm_stepComplete = false;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid b2World::Step(float32 dt, int32 velocityIterations, int32 positionIterations)\n{\n\tb2Timer stepTimer;\n\n\t// If new fixtures were added, we need to find the new contacts.\n\tif (m_flags & e_newFixture)\n\t{\n\t\tm_contactManager.FindNewContacts();\n\t\tm_flags &= ~e_newFixture;\n\t}\n\n\tm_flags |= e_locked;\n\n\tb2TimeStep step;\n\tstep.dt = dt;\n\tstep.velocityIterations\t= velocityIterations;\n\tstep.positionIterations = positionIterations;\n\tif (dt > 0.0f)\n\t{\n\t\tstep.inv_dt = 1.0f / dt;\n\t}\n\telse\n\t{\n\t\tstep.inv_dt = 0.0f;\n\t}\n\n\tstep.dtRatio = m_inv_dt0 * dt;\n\n\tstep.warmStarting = m_warmStarting;\n\n\t// Update contacts. This is where some contacts are destroyed.\n\t{\n\t\tb2Timer timer;\n\t\tm_contactManager.Collide();\n\t\tm_profile.collide = timer.GetMilliseconds();\n\t}\n\n\t// Integrate velocities, solve velocity constraints, and integrate positions.\n\tif (m_stepComplete && step.dt > 0.0f)\n\t{\n\t\tb2Timer timer;\n\t\tSolve(step);\n\t\tm_profile.solve = timer.GetMilliseconds();\n\t}\n\n\t// Handle TOI events.\n\tif (m_continuousPhysics && step.dt > 0.0f)\n\t{\n\t\tb2Timer timer;\n\t\tSolveTOI(step);\n\t\tm_profile.solveTOI = timer.GetMilliseconds();\n\t}\n\n\tif (step.dt > 0.0f)\n\t{\n\t\tm_inv_dt0 = step.inv_dt;\n\t}\n\n\tif (m_flags & e_clearForces)\n\t{\n\t\tClearForces();\n\t}\n\n\tm_flags &= ~e_locked;\n\n\tm_profile.step = stepTimer.GetMilliseconds();\n}\n\nvoid b2World::ClearForces()\n{\n\tfor (b2Body* body = m_bodyList; body; body = body->GetNext())\n\t{\n\t\tbody->m_force.SetZero();\n\t\tbody->m_torque = 0.0f;\n\t}\n}\n\nstruct b2WorldQueryWrapper\n{\n\tbool QueryCallback(int32 proxyId)\n\t{\n\t\tb2FixtureProxy* proxy = (b2FixtureProxy*)broadPhase->GetUserData(proxyId);\n\t\treturn callback->ReportFixture(proxy->fixture);\n\t}\n\n\tconst b2BroadPhase* broadPhase;\n\tb2QueryCallback* callback;\n};\n\nvoid b2World::QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const\n{\n\tb2WorldQueryWrapper wrapper;\n\twrapper.broadPhase = &m_contactManager.m_broadPhase;\n\twrapper.callback = callback;\n\tm_contactManager.m_broadPhase.Query(&wrapper, aabb);\n}\n\nstruct b2WorldRayCastWrapper\n{\n\tfloat32 RayCastCallback(const b2RayCastInput& input, int32 proxyId)\n\t{\n\t\tvoid* userData = broadPhase->GetUserData(proxyId);\n\t\tb2FixtureProxy* proxy = (b2FixtureProxy*)userData;\n\t\tb2Fixture* fixture = proxy->fixture;\n\t\tint32 index = proxy->childIndex;\n\t\tb2RayCastOutput output;\n\t\tbool hit = fixture->RayCast(&output, input, index);\n\n\t\tif (hit)\n\t\t{\n\t\t\tfloat32 fraction = output.fraction;\n\t\t\tb2Vec2 point = (1.0f - fraction) * input.p1 + fraction * input.p2;\n\t\t\treturn callback->ReportFixture(fixture, point, output.normal, fraction);\n\t\t}\n\n\t\treturn input.maxFraction;\n\t}\n\n\tconst b2BroadPhase* broadPhase;\n\tb2RayCastCallback* callback;\n};\n\nvoid b2World::RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const\n{\n\tb2WorldRayCastWrapper wrapper;\n\twrapper.broadPhase = &m_contactManager.m_broadPhase;\n\twrapper.callback = callback;\n\tb2RayCastInput input;\n\tinput.maxFraction = 1.0f;\n\tinput.p1 = point1;\n\tinput.p2 = point2;\n\tm_contactManager.m_broadPhase.RayCast(&wrapper, input);\n}\n\nvoid b2World::DrawShape(b2Fixture* fixture, const b2Transform& xf, const b2Color& color)\n{\n\tswitch (fixture->GetType())\n\t{\n\tcase b2Shape::e_circle:\n\t\t{\n\t\t\tb2CircleShape* circle = (b2CircleShape*)fixture->GetShape();\n\n\t\t\tb2Vec2 center = b2Mul(xf, circle->m_p);\n\t\t\tfloat32 radius = circle->m_radius;\n\t\t\tb2Vec2 axis = b2Mul(xf.q, b2Vec2(1.0f, 0.0f));\n\n\t\t\tm_debugDraw->DrawSolidCircle(center, radius, axis, color);\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_edge:\n\t\t{\n\t\t\tb2EdgeShape* edge = (b2EdgeShape*)fixture->GetShape();\n\t\t\tb2Vec2 v1 = b2Mul(xf, edge->m_vertex1);\n\t\t\tb2Vec2 v2 = b2Mul(xf, edge->m_vertex2);\n\t\t\tm_debugDraw->DrawSegment(v1, v2, color);\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_chain:\n\t\t{\n\t\t\tb2ChainShape* chain = (b2ChainShape*)fixture->GetShape();\n\t\t\tint32 count = chain->m_count;\n\t\t\tconst b2Vec2* vertices = chain->m_vertices;\n\n\t\t\tb2Vec2 v1 = b2Mul(xf, vertices[0]);\n\t\t\tfor (int32 i = 1; i < count; ++i)\n\t\t\t{\n\t\t\t\tb2Vec2 v2 = b2Mul(xf, vertices[i]);\n\t\t\t\tm_debugDraw->DrawSegment(v1, v2, color);\n\t\t\t\tm_debugDraw->DrawCircle(v1, 0.05f, color);\n\t\t\t\tv1 = v2;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_polygon:\n\t\t{\n\t\t\tb2PolygonShape* poly = (b2PolygonShape*)fixture->GetShape();\n\t\t\tint32 vertexCount = poly->m_count;\n\t\t\tb2Assert(vertexCount <= b2_maxPolygonVertices);\n\t\t\tb2Vec2 vertices[b2_maxPolygonVertices];\n\n\t\t\tfor (int32 i = 0; i < vertexCount; ++i)\n\t\t\t{\n\t\t\t\tvertices[i] = b2Mul(xf, poly->m_vertices[i]);\n\t\t\t}\n\n\t\t\tm_debugDraw->DrawSolidPolygon(vertices, vertexCount, color);\n\t\t}\n\t\tbreak;\n\n    default:\n        break;\n\t}\n}\n\nvoid b2World::DrawJoint(b2Joint* joint)\n{\n\tb2Body* bodyA = joint->GetBodyA();\n\tb2Body* bodyB = joint->GetBodyB();\n\tconst b2Transform& xf1 = bodyA->GetTransform();\n\tconst b2Transform& xf2 = bodyB->GetTransform();\n\tb2Vec2 x1 = xf1.p;\n\tb2Vec2 x2 = xf2.p;\n\tb2Vec2 p1 = joint->GetAnchorA();\n\tb2Vec2 p2 = joint->GetAnchorB();\n\n\tb2Color color(0.5f, 0.8f, 0.8f);\n\n\tswitch (joint->GetType())\n\t{\n\tcase e_distanceJoint:\n\t\tm_debugDraw->DrawSegment(p1, p2, color);\n\t\tbreak;\n\n\tcase e_pulleyJoint:\n\t\t{\n\t\t\tb2PulleyJoint* pulley = (b2PulleyJoint*)joint;\n\t\t\tb2Vec2 s1 = pulley->GetGroundAnchorA();\n\t\t\tb2Vec2 s2 = pulley->GetGroundAnchorB();\n\t\t\tm_debugDraw->DrawSegment(s1, p1, color);\n\t\t\tm_debugDraw->DrawSegment(s2, p2, color);\n\t\t\tm_debugDraw->DrawSegment(s1, s2, color);\n\t\t}\n\t\tbreak;\n\n\tcase e_mouseJoint:\n\t\t// don't draw this\n\t\tbreak;\n\n\tdefault:\n\t\tm_debugDraw->DrawSegment(x1, p1, color);\n\t\tm_debugDraw->DrawSegment(p1, p2, color);\n\t\tm_debugDraw->DrawSegment(x2, p2, color);\n\t}\n}\n\nvoid b2World::DrawDebugData()\n{\n\tif (m_debugDraw == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tuint32 flags = m_debugDraw->GetFlags();\n\n\tif (flags & b2Draw::e_shapeBit)\n\t{\n\t\tfor (b2Body* b = m_bodyList; b; b = b->GetNext())\n\t\t{\n\t\t\tconst b2Transform& xf = b->GetTransform();\n\t\t\tfor (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext())\n\t\t\t{\n\t\t\t\tif (b->IsActive() == false)\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.5f, 0.5f, 0.3f));\n\t\t\t\t}\n\t\t\t\telse if (b->GetType() == b2_staticBody)\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.5f, 0.9f, 0.5f));\n\t\t\t\t}\n\t\t\t\telse if (b->GetType() == b2_kinematicBody)\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.5f, 0.5f, 0.9f));\n\t\t\t\t}\n\t\t\t\telse if (b->IsAwake() == false)\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.6f, 0.6f, 0.6f));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.9f, 0.7f, 0.7f));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (flags & b2Draw::e_jointBit)\n\t{\n\t\tfor (b2Joint* j = m_jointList; j; j = j->GetNext())\n\t\t{\n\t\t\tDrawJoint(j);\n\t\t}\n\t}\n\n\tif (flags & b2Draw::e_pairBit)\n\t{\n\t\tb2Color color(0.3f, 0.9f, 0.9f);\n\t\tfor (b2Contact* c = m_contactManager.m_contactList; c; c = c->GetNext())\n\t\t{\n\t\t\t//b2Fixture* fixtureA = c->GetFixtureA();\n\t\t\t//b2Fixture* fixtureB = c->GetFixtureB();\n\n\t\t\t//b2Vec2 cA = fixtureA->GetAABB().GetCenter();\n\t\t\t//b2Vec2 cB = fixtureB->GetAABB().GetCenter();\n\n\t\t\t//m_debugDraw->DrawSegment(cA, cB, color);\n\t\t}\n\t}\n\n\tif (flags & b2Draw::e_aabbBit)\n\t{\n\t\tb2Color color(0.9f, 0.3f, 0.9f);\n\t\tb2BroadPhase* bp = &m_contactManager.m_broadPhase;\n\n\t\tfor (b2Body* b = m_bodyList; b; b = b->GetNext())\n\t\t{\n\t\t\tif (b->IsActive() == false)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext())\n\t\t\t{\n\t\t\t\tfor (int32 i = 0; i < f->m_proxyCount; ++i)\n\t\t\t\t{\n\t\t\t\t\tb2FixtureProxy* proxy = f->m_proxies + i;\n\t\t\t\t\tb2AABB aabb = bp->GetFatAABB(proxy->proxyId);\n\t\t\t\t\tb2Vec2 vs[4];\n\t\t\t\t\tvs[0].Set(aabb.lowerBound.x, aabb.lowerBound.y);\n\t\t\t\t\tvs[1].Set(aabb.upperBound.x, aabb.lowerBound.y);\n\t\t\t\t\tvs[2].Set(aabb.upperBound.x, aabb.upperBound.y);\n\t\t\t\t\tvs[3].Set(aabb.lowerBound.x, aabb.upperBound.y);\n\n\t\t\t\t\tm_debugDraw->DrawPolygon(vs, 4, color);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (flags & b2Draw::e_centerOfMassBit)\n\t{\n\t\tfor (b2Body* b = m_bodyList; b; b = b->GetNext())\n\t\t{\n\t\t\tb2Transform xf = b->GetTransform();\n\t\t\txf.p = b->GetWorldCenter();\n\t\t\tm_debugDraw->DrawTransform(xf);\n\t\t}\n\t}\n}\n\nint32 b2World::GetProxyCount() const\n{\n\treturn m_contactManager.m_broadPhase.GetProxyCount();\n}\n\nint32 b2World::GetTreeHeight() const\n{\n\treturn m_contactManager.m_broadPhase.GetTreeHeight();\n}\n\nint32 b2World::GetTreeBalance() const\n{\n\treturn m_contactManager.m_broadPhase.GetTreeBalance();\n}\n\nfloat32 b2World::GetTreeQuality() const\n{\n\treturn m_contactManager.m_broadPhase.GetTreeQuality();\n}\n\nvoid b2World::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\tb2Assert((m_flags & e_locked) == 0);\n\tif ((m_flags & e_locked) == e_locked)\n\t{\n\t\treturn;\n\t}\n\n\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t{\n\t\tb->m_xf.p -= newOrigin;\n\t\tb->m_sweep.c0 -= newOrigin;\n\t\tb->m_sweep.c -= newOrigin;\n\t}\n\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tj->ShiftOrigin(newOrigin);\n\t}\n\n\tm_contactManager.m_broadPhase.ShiftOrigin(newOrigin);\n}\n\nvoid b2World::Dump()\n{\n\tif ((m_flags & e_locked) == e_locked)\n\t{\n\t\treturn;\n\t}\n\n\tb2Log(\"b2Vec2 g(%.15lef, %.15lef);\\n\", m_gravity.x, m_gravity.y);\n\tb2Log(\"m_world->SetGravity(g);\\n\");\n\n\tb2Log(\"b2Body** bodies = (b2Body**)b2Alloc(%d * sizeof(b2Body*));\\n\", m_bodyCount);\n\tb2Log(\"b2Joint** joints = (b2Joint**)b2Alloc(%d * sizeof(b2Joint*));\\n\", m_jointCount);\n\tint32 i = 0;\n\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t{\n\t\tb->m_islandIndex = i;\n\t\tb->Dump();\n\t\t++i;\n\t}\n\n\ti = 0;\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tj->m_index = i;\n\t\t++i;\n\t}\n\n\t// First pass on joints, skip gear joints.\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tif (j->m_type == e_gearJoint)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2Log(\"{\\n\");\n\t\tj->Dump();\n\t\tb2Log(\"}\\n\");\n\t}\n\n\t// Second pass on joints, only gear joints.\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tif (j->m_type != e_gearJoint)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2Log(\"{\\n\");\n\t\tj->Dump();\n\t\tb2Log(\"}\\n\");\n\t}\n\n\tb2Log(\"b2Free(joints);\\n\");\n\tb2Log(\"b2Free(bodies);\\n\");\n\tb2Log(\"joints = NULL;\\n\");\n\tb2Log(\"bodies = NULL;\\n\");\n}\n"
  },
  {
    "path": "app/src/main/cpp/b2WorldCallbacks.cpp",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h\"\n#include \"isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\"\n\n// Return true if contact calculations should be performed between these two shapes.\n// If you implement your own collision filter you may want to build from this implementation.\nbool b2ContactFilter::ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB)\n{\n\tconst b2Filter& filterA = fixtureA->GetFilterData();\n\tconst b2Filter& filterB = fixtureB->GetFilterData();\n\n\tif (filterA.groupIndex == filterB.groupIndex && filterA.groupIndex != 0)\n\t{\n\t\treturn filterA.groupIndex > 0;\n\t}\n\n\tbool collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0;\n\treturn collide;\n}\n"
  },
  {
    "path": "app/src/main/cpp/basicSFMLmain.cpp",
    "content": "#include \"isEngine/core/GameEngine.h\"\n\nnamespace is\n{\nbool GameEngine::basicSFMLmain()\n{\n////////////////////////////////////////////////////////////\n//                    WINDOW CREATION\n////////////////////////////////////////////////////////////\n#if defined(__ANDROID__)\n    m_window.create(sf::VideoMode::getDesktopMode(), \"\");\n#else\n    m_window.create(sf::VideoMode(is::GameConfig::WINDOW_WIDTH,\n                                  is::GameConfig::WINDOW_HEIGHT),\n                                  is::GameConfig::GAME_NAME,\n                                  is::getWindowStyle());\n\n    // load application icon\n    sf::Image iconTex;\n    if (!iconTex.loadFromFile(is::GameConfig::GUI_DIR + \"icon.png\")) return false;\n#if !defined (IS_ENGINE_SDL_2) && !defined(IS_ENGINE_VS)\n    m_window.setIcon(32, 32, iconTex.getPixelsPtr());\n#endif\n#endif // defined\n    setFPS(m_window, is::GameConfig::FPS); // set frames per second (FPS)\n    sf::View m_view(sf::Vector2f(is::GameConfig::VIEW_WIDTH / 2.f, is::GameConfig::VIEW_HEIGHT / 2.f), sf::Vector2f(is::GameConfig::VIEW_WIDTH, is::GameConfig::VIEW_HEIGHT));\n    m_window.setView(m_view);\n\n////////////////////////////////////////////////////////////\n//                    INITIALIZATION\n////////////////////////////////////////////////////////////\n\n    // is::GameConfig::MUSIC_DIR, is::GameConfig::GUI_DIR, is::GameConfig::FONT_DIR\n    // Are variables that return the path of resources located in the \"assets\" folder\n\n    // Load music buffer\n    sf::SoundBuffer musicBuffer; // Music is played in the render loop. See line 172\n    is::loadSFMLSoundBuffer(musicBuffer, is::GameConfig::MUSIC_DIR + \"game_music.wav\");\n    sf::Sound music(musicBuffer);\n    music.play();\n\n    // Load texture\n    sf::Texture texture;\n    is::loadSFMLTexture(texture, is::GameConfig::GUI_DIR + \"icon.png\");\n\n    // Create Sprite and set Texture\n    sf::Sprite image(texture);\n    is::centerSFMLObj(image); // Allows to center the sprite\n    image.setPosition(is::GameConfig::VIEW_WIDTH / 2.f, is::GameConfig::VIEW_HEIGHT / 2.f);\n\n    // Load font\n    sf::Font font;\n    is::loadSFMLFont(font, is::GameConfig::FONT_DIR + \"font_system.ttf\", 16); // When you develop for the Web you must define\n                                                                            // the size that the texts will have with this font\n    // Create text and set font\n    sf::Text text;\n    text.setFont(font);\n    text.setString(\"Hello World !\");\n    is::centerSFMLObj(text); // Allows to center the text\n    text.setPosition(is::GameConfig::VIEW_WIDTH / 2.f, 64.f);\n\n    bool focus = true; // Doesn't work when you're on the web version\n\n////////////////////////////////////////////////////////////\n//                    RENDER LOOP                         //\n////////////////////////////////////////////////////////////\n// This starts the render loop.                           //\n// Don't touch unless you know what you're doing.         //\n#if !defined(IS_ENGINE_HTML_5)                            //\n    while (m_window.isOpen()                              //\n#ifdef __SWITCH__                   \t\t\t          //\n        && appletMainLoop()       \t                      //\n#endif                            \t\t\t\t\t\t  //\n        )                             \t\t\t\t\t  //\n#else                                                     //\n    EM_ASM(console.log(\"Start successfully!\");, 0);       //\n    execMainLoop([&]                                      //\n    {                                                     //\n    if (emscripten_run_script_int(\"Module.syncdone\") == 1)//\n#endif                                                    //\n    {                                                     //\n////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////\n//                       EVENT\n////////////////////////////////////////////////////////////\n        sf::Vector2i mousePosition(-1, -1); // Allows to get mouse or touch position\n                                            // A negative value means that no position has been recorded\n        sf::Event event;\n        while (m_window.pollEvent(event))\n        {\n            switch (event.type)\n            {\n                case sf::Event::Closed:\n                    m_window.close();\n                break;\n\n                #if (defined(__ANDROID__) || defined(__SWITCH__))\n                case sf::Event::TouchBegan:\n                    if (event.touch.finger == 0)\n                    {\n                        mousePosition.x = is::getCursor(m_window, 0).x;\n                        mousePosition.y = is::getCursor(m_window, 0).y;\n                        is::vibrate(100);\n                    }\n                break;\n                #else\n                case sf::Event::MouseButtonPressed:\n                    mousePosition.x = is::getCursor(m_window).x;\n                    mousePosition.y = is::getCursor(m_window).y;\n                break;\n                #endif // defined\n\n                case sf::Event::LostFocus:\n                focus = false;                    //don't draw, if the window is not shown\n                is::showLog(\"LOST FOCUS!\");\n                break;\n\n                case sf::Event::GainedFocus:\n                focus = true;                    //draw if the window is shown\n                is::showLog(\"GAINED FOCUS!\");\n                break;\n\n                default: break;\n            }\n        }\n\n////////////////////////////////////////////////////////////\n//                    UPDATE OBJECTS\n////////////////////////////////////////////////////////////\n\n        if (mousePosition.x != -1 && mousePosition.y != -1) image.setPosition(mousePosition.x, mousePosition.y);\n\n////////////////////////////////////////////////////////////\n//                     DRAW OBJECTS\n////////////////////////////////////////////////////////////\n        if (focus)\n        {\n            m_window.clear(sf::Color::Blue);\n            m_window.draw(text);\n            m_window.draw(image);\n            m_window.display();\n        }\n    }\n\n////////////////////////////////////////////////////////////\n// Don't touch unless you know what you're doing.         //\n    #if defined(IS_ENGINE_HTML_5)                         //\n    });                                                   //\n    #endif                                                //\n////////////////////////////////////////////////////////////\n    return true;\n}\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/core/ActivityController.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef ACTIVITYCONTROLLER_H_INCLUDED\n#define ACTIVITYCONTROLLER_H_INCLUDED\n\n#include \"../../app_src/activity/GameActivity.h\"\n\nclass ActivityController\n{\npublic:\n    ActivityController(is::GameSystemExtended &gameSysExt):\n        m_gameSysExt(gameSysExt)\n    {\n         m_gameActivity = std::make_shared<GameActivity>(m_gameSysExt);\n    }\n    void update()\n    {\n        m_gameActivity->onUpdate();\n    }\n    void draw()\n    {\n        m_gameActivity->onDraw();\n        if (m_gameActivity->m_changeActivity)\n        {\n            m_gameActivity.reset();\n            m_gameActivity = std::make_shared<GameActivity>(m_gameSysExt);\n        }\n    }\nprivate:\n    is::GameSystemExtended &m_gameSysExt;\n    std::shared_ptr<GameActivity> m_gameActivity;\n};\n\n#endif // ACTIVITYCONTROLLER_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/core/GameEngine.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMEENGINE_H_INCLUDED\n#define GAMEENGINE_H_INCLUDED\n\n#include \"ActivityController.h\"\n#include <functional>\n\n////////////////////////////////////////////////////////////\n// PC version code\n#if !defined(__ANDROID__)\n    #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_HTML_5) && !defined(IS_ENGINE_LINUX) && !defined(IS_ENGINE_SWITCH)\n#include <direct.h>\n    #else\n#include <sys/stat.h>\n    #endif // defined\n#endif // defined\n////////////////////////////////////////////////////////////\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// \\brief Class to operate the entire game system\n///\n/// It allows the interconnection of different engine components\n////////////////////////////////////////////////////////////\nclass GameEngine\n{\nprivate:\n    sf::RenderWindow m_window;\n    is::GameSystemExtended m_gameSysExt;\n\npublic:\n    GameEngine();\n\n    ~GameEngine();\n\n    /// Initialize game engine\n    void initEngine();\n\n#if defined(IS_ENGINE_HTML_5)\n    /// Allow to launch main loop\n    void execMainLoop(std::function<bool(void)> loop);\n    void execMainLoop(std::function<void(void)> loop);\n#endif\n\n    /// Starts the engine rendering loop\n    bool play();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Starts the SFML classic rendering loop\n    ///\n    /// Useful for implementing a custom rendering loop to facilitate\n    /// the integration of other projects with the engine\n    ////////////////////////////////////////////////////////////\n    bool basicSFMLmain();\n\n    /// return Render Window\n    sf::RenderWindow& getRenderWindow() {return m_window;}\n};\n}\n\n#endif // GAMEENGINE_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Box2D.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef BOX2D_H\n#define BOX2D_H\n\n/**\n\\mainpage Box2D API Documentation\n\n\\section intro_sec Getting Started\n\nFor documentation please see http://box2d.org/documentation.html\n\nFor discussion please visit http://box2d.org/forum\n*/\n\n// These include files constitute the main Box2D API\n\n#include \"Common/b2Settings.h\"\n#include \"Common/b2Draw.h\"\n#include \"Common/b2Timer.h\"\n\n#include \"Collision/Shapes/b2CircleShape.h\"\n#include \"Collision/Shapes/b2EdgeShape.h\"\n#include \"Collision/Shapes/b2ChainShape.h\"\n#include \"Collision/Shapes/b2PolygonShape.h\"\n\n#include \"Collision/b2BroadPhase.h\"\n#include \"Collision/b2Distance.h\"\n#include \"Collision/b2DynamicTree.h\"\n#include \"Collision/b2TimeOfImpact.h\"\n\n#include \"Dynamics/b2Body.h\"\n#include \"Dynamics/b2Fixture.h\"\n#include \"Dynamics/b2WorldCallbacks.h\"\n#include \"Dynamics/b2TimeStep.h\"\n#include \"Dynamics/b2World.h\"\n\n#include \"Dynamics/Contacts/b2Contact.h\"\n\n#include \"Dynamics/Joints/b2DistanceJoint.h\"\n#include \"Dynamics/Joints/b2FrictionJoint.h\"\n#include \"Dynamics/Joints/b2GearJoint.h\"\n#include \"Dynamics/Joints/b2MotorJoint.h\"\n#include \"Dynamics/Joints/b2MouseJoint.h\"\n#include \"Dynamics/Joints/b2PrismaticJoint.h\"\n#include \"Dynamics/Joints/b2PulleyJoint.h\"\n#include \"Dynamics/Joints/b2RevoluteJoint.h\"\n#include \"Dynamics/Joints/b2RopeJoint.h\"\n#include \"Dynamics/Joints/b2WeldJoint.h\"\n#include \"Dynamics/Joints/b2WheelJoint.h\"\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h",
    "content": "/*\n* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_CHAIN_SHAPE_H\n#define B2_CHAIN_SHAPE_H\n\n#include \"b2Shape.h\"\n\nclass b2EdgeShape;\n\n/// A chain shape is a free form sequence of line segments.\n/// The chain has two-sided collision, so you can use inside and outside collision.\n/// Therefore, you may use any winding order.\n/// Since there may be many vertices, they are allocated using b2Alloc.\n/// Connectivity information is used to create smooth collisions.\n/// WARNING: The chain will not collide properly if there are self-intersections.\nclass b2ChainShape : public b2Shape\n{\npublic:\n\tb2ChainShape();\n\n\t/// The destructor frees the vertices using b2Free.\n\t~b2ChainShape();\n\n\t/// Create a loop. This automatically adjusts connectivity.\n\t/// @param vertices an array of vertices, these are copied\n\t/// @param count the vertex count\n\tvoid CreateLoop(const b2Vec2* vertices, int32 count);\n\n\t/// Create a chain with isolated end vertices.\n\t/// @param vertices an array of vertices, these are copied\n\t/// @param count the vertex count\n\tvoid CreateChain(const b2Vec2* vertices, int32 count);\n\n\t/// Establish connectivity to a vertex that precedes the first vertex.\n\t/// Don't call this for loops.\n\tvoid SetPrevVertex(const b2Vec2& prevVertex);\n\n\t/// Establish connectivity to a vertex that follows the last vertex.\n\t/// Don't call this for loops.\n\tvoid SetNextVertex(const b2Vec2& nextVertex);\n\n\t/// Implement b2Shape. Vertices are cloned using b2Alloc.\n\tb2Shape* Clone(b2BlockAllocator* allocator) const;\n\n\t/// @see b2Shape::GetChildCount\n\tint32 GetChildCount() const;\n\n\t/// Get a child edge.\n\tvoid GetChildEdge(b2EdgeShape* edge, int32 index) const;\n\n\t/// This always return false.\n\t/// @see b2Shape::TestPoint\n\tbool TestPoint(const b2Transform& transform, const b2Vec2& p) const;\n\n\t/// Implement b2Shape.\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\tconst b2Transform& transform, int32 childIndex) const;\n\n\t/// @see b2Shape::ComputeAABB\n\tvoid ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const;\n\n\t/// Chains have zero mass.\n\t/// @see b2Shape::ComputeMass\n\tvoid ComputeMass(b2MassData* massData, float32 density) const;\n\n\t/// The vertices. Owned by this class.\n\tb2Vec2* m_vertices;\n\n\t/// The vertex count.\n\tint32 m_count;\n\n\tb2Vec2 m_prevVertex, m_nextVertex;\n\tbool m_hasPrevVertex, m_hasNextVertex;\n};\n\ninline b2ChainShape::b2ChainShape()\n{\n\tm_type = e_chain;\n\tm_radius = b2_polygonRadius;\n\tm_vertices = NULL;\n\tm_count = 0;\n\tm_hasPrevVertex = false;\n\tm_hasNextVertex = false;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_CIRCLE_SHAPE_H\n#define B2_CIRCLE_SHAPE_H\n\n#include \"b2Shape.h\"\n\n/// A circle shape.\nclass b2CircleShape : public b2Shape\n{\npublic:\n\tb2CircleShape();\n\n\t/// Implement b2Shape.\n\tb2Shape* Clone(b2BlockAllocator* allocator) const;\n\n\t/// @see b2Shape::GetChildCount\n\tint32 GetChildCount() const;\n\n\t/// Implement b2Shape.\n\tbool TestPoint(const b2Transform& transform, const b2Vec2& p) const;\n\n\t/// Implement b2Shape.\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\tconst b2Transform& transform, int32 childIndex) const;\n\n\t/// @see b2Shape::ComputeAABB\n\tvoid ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const;\n\n\t/// @see b2Shape::ComputeMass\n\tvoid ComputeMass(b2MassData* massData, float32 density) const;\n\n\t/// Get the supporting vertex index in the given direction.\n\tint32 GetSupport(const b2Vec2& d) const;\n\n\t/// Get the supporting vertex in the given direction.\n\tconst b2Vec2& GetSupportVertex(const b2Vec2& d) const;\n\n\t/// Get the vertex count.\n\tint32 GetVertexCount() const { return 1; }\n\n\t/// Get a vertex by index. Used by b2Distance.\n\tconst b2Vec2& GetVertex(int32 index) const;\n\n\t/// Position\n\tb2Vec2 m_p;\n};\n\ninline b2CircleShape::b2CircleShape()\n{\n\tm_type = e_circle;\n\tm_radius = 0.0f;\n\tm_p.SetZero();\n}\n\ninline int32 b2CircleShape::GetSupport(const b2Vec2 &d) const\n{\n\tB2_NOT_USED(d);\n\treturn 0;\n}\n\ninline const b2Vec2& b2CircleShape::GetSupportVertex(const b2Vec2 &d) const\n{\n\tB2_NOT_USED(d);\n\treturn m_p;\n}\n\ninline const b2Vec2& b2CircleShape::GetVertex(int32 index) const\n{\n\tB2_NOT_USED(index);\n\tb2Assert(index == 0);\n\treturn m_p;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h",
    "content": "/*\n* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_EDGE_SHAPE_H\n#define B2_EDGE_SHAPE_H\n\n#include \"b2Shape.h\"\n\n/// A line segment (edge) shape. These can be connected in chains or loops\n/// to other edge shapes. The connectivity information is used to ensure\n/// correct contact normals.\nclass b2EdgeShape : public b2Shape\n{\npublic:\n\tb2EdgeShape();\n\n\t/// Set this as an isolated edge.\n\tvoid Set(const b2Vec2& v1, const b2Vec2& v2);\n\n\t/// Implement b2Shape.\n\tb2Shape* Clone(b2BlockAllocator* allocator) const;\n\n\t/// @see b2Shape::GetChildCount\n\tint32 GetChildCount() const;\n\n\t/// @see b2Shape::TestPoint\n\tbool TestPoint(const b2Transform& transform, const b2Vec2& p) const;\n\n\t/// Implement b2Shape.\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\tconst b2Transform& transform, int32 childIndex) const;\n\n\t/// @see b2Shape::ComputeAABB\n\tvoid ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const;\n\n\t/// @see b2Shape::ComputeMass\n\tvoid ComputeMass(b2MassData* massData, float32 density) const;\n\n\t/// These are the edge vertices\n\tb2Vec2 m_vertex1, m_vertex2;\n\n\t/// Optional adjacent vertices. These are used for smooth collision.\n\tb2Vec2 m_vertex0, m_vertex3;\n\tbool m_hasVertex0, m_hasVertex3;\n};\n\ninline b2EdgeShape::b2EdgeShape()\n{\n\tm_type = e_edge;\n\tm_radius = b2_polygonRadius;\n\tm_vertex0.x = 0.0f;\n\tm_vertex0.y = 0.0f;\n\tm_vertex3.x = 0.0f;\n\tm_vertex3.y = 0.0f;\n\tm_hasVertex0 = false;\n\tm_hasVertex3 = false;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_POLYGON_SHAPE_H\n#define B2_POLYGON_SHAPE_H\n\n#include \"b2Shape.h\"\n\n/// A convex polygon. It is assumed that the interior of the polygon is to\n/// the left of each edge.\n/// Polygons have a maximum number of vertices equal to b2_maxPolygonVertices.\n/// In most cases you should not need many vertices for a convex polygon.\nclass b2PolygonShape : public b2Shape\n{\npublic:\n\tb2PolygonShape();\n\n\t/// Implement b2Shape.\n\tb2Shape* Clone(b2BlockAllocator* allocator) const;\n\n\t/// @see b2Shape::GetChildCount\n\tint32 GetChildCount() const;\n\n\t/// Create a convex hull from the given array of local points.\n\t/// The count must be in the range [3, b2_maxPolygonVertices].\n\t/// @warning the points may be re-ordered, even if they form a convex polygon\n\t/// @warning collinear points are handled but not removed. Collinear points\n\t/// may lead to poor stacking behavior.\n\tvoid Set(const b2Vec2* points, int32 count);\n\n\t/// Build vertices to represent an axis-aligned box centered on the local origin.\n\t/// @param hx the half-width.\n\t/// @param hy the half-height.\n\tvoid SetAsBox(float32 hx, float32 hy);\n\n\t/// Build vertices to represent an oriented box.\n\t/// @param hx the half-width.\n\t/// @param hy the half-height.\n\t/// @param center the center of the box in local coordinates.\n\t/// @param angle the rotation of the box in local coordinates.\n\tvoid SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle);\n\n\t/// @see b2Shape::TestPoint\n\tbool TestPoint(const b2Transform& transform, const b2Vec2& p) const;\n\n\t/// Implement b2Shape.\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\tconst b2Transform& transform, int32 childIndex) const;\n\n\t/// @see b2Shape::ComputeAABB\n\tvoid ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const;\n\n\t/// @see b2Shape::ComputeMass\n\tvoid ComputeMass(b2MassData* massData, float32 density) const;\n\n\t/// Get the vertex count.\n\tint32 GetVertexCount() const { return m_count; }\n\n\t/// Get a vertex by index.\n\tconst b2Vec2& GetVertex(int32 index) const;\n\n\t/// Validate convexity. This is a very time consuming operation.\n\t/// @returns true if valid\n\tbool Validate() const;\n\n\tb2Vec2 m_centroid;\n\tb2Vec2 m_vertices[b2_maxPolygonVertices];\n\tb2Vec2 m_normals[b2_maxPolygonVertices];\n\tint32 m_count;\n};\n\ninline b2PolygonShape::b2PolygonShape()\n{\n\tm_type = e_polygon;\n\tm_radius = b2_polygonRadius;\n\tm_count = 0;\n\tm_centroid.SetZero();\n}\n\ninline const b2Vec2& b2PolygonShape::GetVertex(int32 index) const\n{\n\tb2Assert(0 <= index && index < m_count);\n\treturn m_vertices[index];\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2Shape.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_SHAPE_H\n#define B2_SHAPE_H\n\n#include \"../../Common/b2BlockAllocator.h\"\n#include \"../../Common/b2Math.h\"\n#include \"../b2Collision.h\"\n\n/// This holds the mass data computed for a shape.\nstruct b2MassData\n{\n\t/// The mass of the shape, usually in kilograms.\n\tfloat32 mass;\n\n\t/// The position of the shape's centroid relative to the shape's origin.\n\tb2Vec2 center;\n\n\t/// The rotational inertia of the shape about the local origin.\n\tfloat32 I;\n};\n\n/// A shape is used for collision detection. You can create a shape however you like.\n/// Shapes used for simulation in b2World are created automatically when a b2Fixture\n/// is created. Shapes may encapsulate a one or more child shapes.\nclass b2Shape\n{\npublic:\n\n\tenum Type\n\t{\n\t\te_circle = 0,\n\t\te_edge = 1,\n\t\te_polygon = 2,\n\t\te_chain = 3,\n\t\te_typeCount = 4\n\t};\n\n\tvirtual ~b2Shape() {}\n\n\t/// Clone the concrete shape using the provided allocator.\n\tvirtual b2Shape* Clone(b2BlockAllocator* allocator) const = 0;\n\n\t/// Get the type of this shape. You can use this to down cast to the concrete shape.\n\t/// @return the shape type.\n\tType GetType() const;\n\n\t/// Get the number of child primitives.\n\tvirtual int32 GetChildCount() const = 0;\n\n\t/// Test a point for containment in this shape. This only works for convex shapes.\n\t/// @param xf the shape world transform.\n\t/// @param p a point in world coordinates.\n\tvirtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0;\n\n\t/// Cast a ray against a child shape.\n\t/// @param output the ray-cast results.\n\t/// @param input the ray-cast input parameters.\n\t/// @param transform the transform to be applied to the shape.\n\t/// @param childIndex the child shape index\n\tvirtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\tconst b2Transform& transform, int32 childIndex) const = 0;\n\n\t/// Given a transform, compute the associated axis aligned bounding box for a child shape.\n\t/// @param aabb returns the axis aligned box.\n\t/// @param xf the world transform of the shape.\n\t/// @param childIndex the child shape\n\tvirtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const = 0;\n\n\t/// Compute the mass properties of this shape using its dimensions and density.\n\t/// The inertia tensor is computed about the local origin.\n\t/// @param massData returns the mass data for this shape.\n\t/// @param density the density in kilograms per meter squared.\n\tvirtual void ComputeMass(b2MassData* massData, float32 density) const = 0;\n\n\tType m_type;\n\tfloat32 m_radius;\n};\n\ninline b2Shape::Type b2Shape::GetType() const\n{\n\treturn m_type;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/b2BroadPhase.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_BROAD_PHASE_H\n#define B2_BROAD_PHASE_H\n\n#include \"../Common/b2Settings.h\"\n#include \"b2Collision.h\"\n#include \"b2DynamicTree.h\"\n#include <algorithm>\n\nstruct b2Pair\n{\n\tint32 proxyIdA;\n\tint32 proxyIdB;\n};\n\n/// The broad-phase is used for computing pairs and performing volume queries and ray casts.\n/// This broad-phase does not persist pairs. Instead, this reports potentially new pairs.\n/// It is up to the client to consume the new pairs and to track subsequent overlap.\nclass b2BroadPhase\n{\npublic:\n\n\tenum\n\t{\n\t\te_nullProxy = -1\n\t};\n\n\tb2BroadPhase();\n\t~b2BroadPhase();\n\n\t/// Create a proxy with an initial AABB. Pairs are not reported until\n\t/// UpdatePairs is called.\n\tint32 CreateProxy(const b2AABB& aabb, void* userData);\n\n\t/// Destroy a proxy. It is up to the client to remove any pairs.\n\tvoid DestroyProxy(int32 proxyId);\n\n\t/// Call MoveProxy as many times as you like, then when you are done\n\t/// call UpdatePairs to finalized the proxy pairs (for your time step).\n\tvoid MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement);\n\n\t/// Call to trigger a re-processing of it's pairs on the next call to UpdatePairs.\n\tvoid TouchProxy(int32 proxyId);\n\n\t/// Get the fat AABB for a proxy.\n\tconst b2AABB& GetFatAABB(int32 proxyId) const;\n\n\t/// Get user data from a proxy. Returns NULL if the id is invalid.\n\tvoid* GetUserData(int32 proxyId) const;\n\n\t/// Test overlap of fat AABBs.\n\tbool TestOverlap(int32 proxyIdA, int32 proxyIdB) const;\n\n\t/// Get the number of proxies.\n\tint32 GetProxyCount() const;\n\n\t/// Update the pairs. This results in pair callbacks. This can only add pairs.\n\ttemplate <typename T>\n\tvoid UpdatePairs(T* callback);\n\n\t/// Query an AABB for overlapping proxies. The callback class\n\t/// is called for each proxy that overlaps the supplied AABB.\n\ttemplate <typename T>\n\tvoid Query(T* callback, const b2AABB& aabb) const;\n\n\t/// Ray-cast against the proxies in the tree. This relies on the callback\n\t/// to perform a exact ray-cast in the case were the proxy contains a shape.\n\t/// The callback also performs the any collision filtering. This has performance\n\t/// roughly equal to k * log(n), where k is the number of collisions and n is the\n\t/// number of proxies in the tree.\n\t/// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).\n\t/// @param callback a callback class that is called for each proxy that is hit by the ray.\n\ttemplate <typename T>\n\tvoid RayCast(T* callback, const b2RayCastInput& input) const;\n\n\t/// Get the height of the embedded tree.\n\tint32 GetTreeHeight() const;\n\n\t/// Get the balance of the embedded tree.\n\tint32 GetTreeBalance() const;\n\n\t/// Get the quality metric of the embedded tree.\n\tfloat32 GetTreeQuality() const;\n\n\t/// Shift the world origin. Useful for large worlds.\n\t/// The shift formula is: position -= newOrigin\n\t/// @param newOrigin the new origin with respect to the old origin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin);\n\nprivate:\n\n\tfriend class b2DynamicTree;\n\n\tvoid BufferMove(int32 proxyId);\n\tvoid UnBufferMove(int32 proxyId);\n\n\tbool QueryCallback(int32 proxyId);\n\n\tb2DynamicTree m_tree;\n\n\tint32 m_proxyCount;\n\n\tint32* m_moveBuffer;\n\tint32 m_moveCapacity;\n\tint32 m_moveCount;\n\n\tb2Pair* m_pairBuffer;\n\tint32 m_pairCapacity;\n\tint32 m_pairCount;\n\n\tint32 m_queryProxyId;\n};\n\n/// This is used to sort pairs.\ninline bool b2PairLessThan(const b2Pair& pair1, const b2Pair& pair2)\n{\n\tif (pair1.proxyIdA < pair2.proxyIdA)\n\t{\n\t\treturn true;\n\t}\n\n\tif (pair1.proxyIdA == pair2.proxyIdA)\n\t{\n\t\treturn pair1.proxyIdB < pair2.proxyIdB;\n\t}\n\n\treturn false;\n}\n\ninline void* b2BroadPhase::GetUserData(int32 proxyId) const\n{\n\treturn m_tree.GetUserData(proxyId);\n}\n\ninline bool b2BroadPhase::TestOverlap(int32 proxyIdA, int32 proxyIdB) const\n{\n\tconst b2AABB& aabbA = m_tree.GetFatAABB(proxyIdA);\n\tconst b2AABB& aabbB = m_tree.GetFatAABB(proxyIdB);\n\treturn b2TestOverlap(aabbA, aabbB);\n}\n\ninline const b2AABB& b2BroadPhase::GetFatAABB(int32 proxyId) const\n{\n\treturn m_tree.GetFatAABB(proxyId);\n}\n\ninline int32 b2BroadPhase::GetProxyCount() const\n{\n\treturn m_proxyCount;\n}\n\ninline int32 b2BroadPhase::GetTreeHeight() const\n{\n\treturn m_tree.GetHeight();\n}\n\ninline int32 b2BroadPhase::GetTreeBalance() const\n{\n\treturn m_tree.GetMaxBalance();\n}\n\ninline float32 b2BroadPhase::GetTreeQuality() const\n{\n\treturn m_tree.GetAreaRatio();\n}\n\ntemplate <typename T>\nvoid b2BroadPhase::UpdatePairs(T* callback)\n{\n\t// Reset pair buffer\n\tm_pairCount = 0;\n\n\t// Perform tree queries for all moving proxies.\n\tfor (int32 i = 0; i < m_moveCount; ++i)\n\t{\n\t\tm_queryProxyId = m_moveBuffer[i];\n\t\tif (m_queryProxyId == e_nullProxy)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// We have to query the tree with the fat AABB so that\n\t\t// we don't fail to create a pair that may touch later.\n\t\tconst b2AABB& fatAABB = m_tree.GetFatAABB(m_queryProxyId);\n\n\t\t// Query tree, create pairs and add them pair buffer.\n\t\tm_tree.Query(this, fatAABB);\n\t}\n\n\t// Reset move buffer\n\tm_moveCount = 0;\n\n\t// Sort the pair buffer to expose duplicates.\n\tstd::sort(m_pairBuffer, m_pairBuffer + m_pairCount, b2PairLessThan);\n\n\t// Send the pairs back to the client.\n\tint32 i = 0;\n\twhile (i < m_pairCount)\n\t{\n\t\tb2Pair* primaryPair = m_pairBuffer + i;\n\t\tvoid* userDataA = m_tree.GetUserData(primaryPair->proxyIdA);\n\t\tvoid* userDataB = m_tree.GetUserData(primaryPair->proxyIdB);\n\n\t\tcallback->AddPair(userDataA, userDataB);\n\t\t++i;\n\n\t\t// Skip any duplicate pairs.\n\t\twhile (i < m_pairCount)\n\t\t{\n\t\t\tb2Pair* pair = m_pairBuffer + i;\n\t\t\tif (pair->proxyIdA != primaryPair->proxyIdA || pair->proxyIdB != primaryPair->proxyIdB)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t++i;\n\t\t}\n\t}\n\n\t// Try to keep the tree balanced.\n\t//m_tree.Rebalance(4);\n}\n\ntemplate <typename T>\ninline void b2BroadPhase::Query(T* callback, const b2AABB& aabb) const\n{\n\tm_tree.Query(callback, aabb);\n}\n\ntemplate <typename T>\ninline void b2BroadPhase::RayCast(T* callback, const b2RayCastInput& input) const\n{\n\tm_tree.RayCast(callback, input);\n}\n\ninline void b2BroadPhase::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\tm_tree.ShiftOrigin(newOrigin);\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/b2Collision.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_COLLISION_H\n#define B2_COLLISION_H\n\n#include \"../Common/b2Math.h\"\n#include <limits.h>\n\n/// @file\n/// Structures and functions used for computing contact points, distance\n/// queries, and TOI queries.\n\nclass b2Shape;\nclass b2CircleShape;\nclass b2EdgeShape;\nclass b2PolygonShape;\n\nconst uint8 b2_nullFeature = UCHAR_MAX;\n\n/// The features that intersect to form the contact point\n/// This must be 4 bytes or less.\nstruct b2ContactFeature\n{\n\tenum Type\n\t{\n\t\te_vertex = 0,\n\t\te_face = 1\n\t};\n\n\tuint8 indexA;\t\t///< Feature index on shapeA\n\tuint8 indexB;\t\t///< Feature index on shapeB\n\tuint8 typeA;\t\t///< The feature type on shapeA\n\tuint8 typeB;\t\t///< The feature type on shapeB\n};\n\n/// Contact ids to facilitate warm starting.\nunion b2ContactID\n{\n\tb2ContactFeature cf;\n\tuint32 key;\t\t\t\t\t///< Used to quickly compare contact ids.\n};\n\n/// A manifold point is a contact point belonging to a contact\n/// manifold. It holds details related to the geometry and dynamics\n/// of the contact points.\n/// The local point usage depends on the manifold type:\n/// -e_circles: the local center of circleB\n/// -e_faceA: the local center of cirlceB or the clip point of polygonB\n/// -e_faceB: the clip point of polygonA\n/// This structure is stored across time steps, so we keep it small.\n/// Note: the impulses are used for internal caching and may not\n/// provide reliable contact forces, especially for high speed collisions.\nstruct b2ManifoldPoint\n{\n\tb2Vec2 localPoint;\t\t///< usage depends on manifold type\n\tfloat32 normalImpulse;\t///< the non-penetration impulse\n\tfloat32 tangentImpulse;\t///< the friction impulse\n\tb2ContactID id;\t\t\t///< uniquely identifies a contact point between two shapes\n};\n\n/// A manifold for two touching convex shapes.\n/// Box2D supports multiple types of contact:\n/// - clip point versus plane with radius\n/// - point versus point with radius (circles)\n/// The local point usage depends on the manifold type:\n/// -e_circles: the local center of circleA\n/// -e_faceA: the center of faceA\n/// -e_faceB: the center of faceB\n/// Similarly the local normal usage:\n/// -e_circles: not used\n/// -e_faceA: the normal on polygonA\n/// -e_faceB: the normal on polygonB\n/// We store contacts in this way so that position correction can\n/// account for movement, which is critical for continuous physics.\n/// All contact scenarios must be expressed in one of these types.\n/// This structure is stored across time steps, so we keep it small.\nstruct b2Manifold\n{\n\tenum Type\n\t{\n\t\te_circles,\n\t\te_faceA,\n\t\te_faceB\n\t};\n\n\tb2ManifoldPoint points[b2_maxManifoldPoints];\t///< the points of contact\n\tb2Vec2 localNormal;\t\t\t\t\t\t\t\t///< not use for Type::e_points\n\tb2Vec2 localPoint;\t\t\t\t\t\t\t\t///< usage depends on manifold type\n\tType type;\n\tint32 pointCount;\t\t\t\t\t\t\t\t///< the number of manifold points\n};\n\n/// This is used to compute the current state of a contact manifold.\nstruct b2WorldManifold\n{\n\t/// Evaluate the manifold with supplied transforms. This assumes\n\t/// modest motion from the original state. This does not change the\n\t/// point count, impulses, etc. The radii must come from the shapes\n\t/// that generated the manifold.\n\tvoid Initialize(const b2Manifold* manifold,\n\t\t\t\t\tconst b2Transform& xfA, float32 radiusA,\n\t\t\t\t\tconst b2Transform& xfB, float32 radiusB);\n\n\tb2Vec2 normal;\t\t\t\t\t\t\t\t///< world vector pointing from A to B\n\tb2Vec2 points[b2_maxManifoldPoints];\t\t///< world contact point (point of intersection)\n\tfloat32 separations[b2_maxManifoldPoints];\t///< a negative value indicates overlap, in meters\n};\n\n/// This is used for determining the state of contact points.\nenum b2PointState\n{\n\tb2_nullState,\t\t///< point does not exist\n\tb2_addState,\t\t///< point was added in the update\n\tb2_persistState,\t///< point persisted across the update\n\tb2_removeState\t\t///< point was removed in the update\n};\n\n/// Compute the point states given two manifolds. The states pertain to the transition from manifold1\n/// to manifold2. So state1 is either persist or remove while state2 is either add or persist.\nvoid b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints],\n\t\t\t\t\t  const b2Manifold* manifold1, const b2Manifold* manifold2);\n\n/// Used for computing contact manifolds.\nstruct b2ClipVertex\n{\n\tb2Vec2 v;\n\tb2ContactID id;\n};\n\n/// Ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).\nstruct b2RayCastInput\n{\n\tb2Vec2 p1, p2;\n\tfloat32 maxFraction;\n};\n\n/// Ray-cast output data. The ray hits at p1 + fraction * (p2 - p1), where p1 and p2\n/// come from b2RayCastInput.\nstruct b2RayCastOutput\n{\n\tb2Vec2 normal;\n\tfloat32 fraction;\n};\n\n/// An axis aligned bounding box.\nstruct b2AABB\n{\n\t/// Verify that the bounds are sorted.\n\tbool IsValid() const;\n\n\t/// Get the center of the AABB.\n\tb2Vec2 GetCenter() const\n\t{\n\t\treturn 0.5f * (lowerBound + upperBound);\n\t}\n\n\t/// Get the extents of the AABB (half-widths).\n\tb2Vec2 GetExtents() const\n\t{\n\t\treturn 0.5f * (upperBound - lowerBound);\n\t}\n\n\t/// Get the perimeter length\n\tfloat32 GetPerimeter() const\n\t{\n\t\tfloat32 wx = upperBound.x - lowerBound.x;\n\t\tfloat32 wy = upperBound.y - lowerBound.y;\n\t\treturn 2.0f * (wx + wy);\n\t}\n\n\t/// Combine an AABB into this one.\n\tvoid Combine(const b2AABB& aabb)\n\t{\n\t\tlowerBound = b2Min(lowerBound, aabb.lowerBound);\n\t\tupperBound = b2Max(upperBound, aabb.upperBound);\n\t}\n\n\t/// Combine two AABBs into this one.\n\tvoid Combine(const b2AABB& aabb1, const b2AABB& aabb2)\n\t{\n\t\tlowerBound = b2Min(aabb1.lowerBound, aabb2.lowerBound);\n\t\tupperBound = b2Max(aabb1.upperBound, aabb2.upperBound);\n\t}\n\n\t/// Does this aabb contain the provided AABB.\n\tbool Contains(const b2AABB& aabb) const\n\t{\n\t\tbool result = true;\n\t\tresult = result && lowerBound.x <= aabb.lowerBound.x;\n\t\tresult = result && lowerBound.y <= aabb.lowerBound.y;\n\t\tresult = result && aabb.upperBound.x <= upperBound.x;\n\t\tresult = result && aabb.upperBound.y <= upperBound.y;\n\t\treturn result;\n\t}\n\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const;\n\n\tb2Vec2 lowerBound;\t///< the lower vertex\n\tb2Vec2 upperBound;\t///< the upper vertex\n};\n\n/// Compute the collision manifold between two circles.\nvoid b2CollideCircles(b2Manifold* manifold,\n\t\t\t\t\t  const b2CircleShape* circleA, const b2Transform& xfA,\n\t\t\t\t\t  const b2CircleShape* circleB, const b2Transform& xfB);\n\n/// Compute the collision manifold between a polygon and a circle.\nvoid b2CollidePolygonAndCircle(b2Manifold* manifold,\n\t\t\t\t\t\t\t   const b2PolygonShape* polygonA, const b2Transform& xfA,\n\t\t\t\t\t\t\t   const b2CircleShape* circleB, const b2Transform& xfB);\n\n/// Compute the collision manifold between two polygons.\nvoid b2CollidePolygons(b2Manifold* manifold,\n\t\t\t\t\t   const b2PolygonShape* polygonA, const b2Transform& xfA,\n\t\t\t\t\t   const b2PolygonShape* polygonB, const b2Transform& xfB);\n\n/// Compute the collision manifold between an edge and a circle.\nvoid b2CollideEdgeAndCircle(b2Manifold* manifold,\n\t\t\t\t\t\t\t   const b2EdgeShape* polygonA, const b2Transform& xfA,\n\t\t\t\t\t\t\t   const b2CircleShape* circleB, const b2Transform& xfB);\n\n/// Compute the collision manifold between an edge and a circle.\nvoid b2CollideEdgeAndPolygon(b2Manifold* manifold,\n\t\t\t\t\t\t\t   const b2EdgeShape* edgeA, const b2Transform& xfA,\n\t\t\t\t\t\t\t   const b2PolygonShape* circleB, const b2Transform& xfB);\n\n/// Clipping for contact manifolds.\nint32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2],\n\t\t\t\t\t\t\tconst b2Vec2& normal, float32 offset, int32 vertexIndexA);\n\n/// Determine if two generic shapes overlap.\nbool b2TestOverlap(\tconst b2Shape* shapeA, int32 indexA,\n\t\t\t\t\tconst b2Shape* shapeB, int32 indexB,\n\t\t\t\t\tconst b2Transform& xfA, const b2Transform& xfB);\n\n// ---------------- Inline Functions ------------------------------------------\n\ninline bool b2AABB::IsValid() const\n{\n\tb2Vec2 d = upperBound - lowerBound;\n\tbool valid = d.x >= 0.0f && d.y >= 0.0f;\n\tvalid = valid && lowerBound.IsValid() && upperBound.IsValid();\n\treturn valid;\n}\n\ninline bool b2TestOverlap(const b2AABB& a, const b2AABB& b)\n{\n\tb2Vec2 d1, d2;\n\td1 = b.lowerBound - a.upperBound;\n\td2 = a.lowerBound - b.upperBound;\n\n\tif (d1.x > 0.0f || d1.y > 0.0f)\n\t\treturn false;\n\n\tif (d2.x > 0.0f || d2.y > 0.0f)\n\t\treturn false;\n\n\treturn true;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/b2Distance.h",
    "content": "\n/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_DISTANCE_H\n#define B2_DISTANCE_H\n\n#include \"../Common/b2Math.h\"\n\nclass b2Shape;\n\n/// A distance proxy is used by the GJK algorithm.\n/// It encapsulates any shape.\nstruct b2DistanceProxy\n{\n\tb2DistanceProxy() : m_vertices(NULL), m_count(0), m_radius(0.0f) {}\n\n\t/// Initialize the proxy using the given shape. The shape\n\t/// must remain in scope while the proxy is in use.\n\tvoid Set(const b2Shape* shape, int32 index);\n\n\t/// Get the supporting vertex index in the given direction.\n\tint32 GetSupport(const b2Vec2& d) const;\n\n\t/// Get the supporting vertex in the given direction.\n\tconst b2Vec2& GetSupportVertex(const b2Vec2& d) const;\n\n\t/// Get the vertex count.\n\tint32 GetVertexCount() const;\n\n\t/// Get a vertex by index. Used by b2Distance.\n\tconst b2Vec2& GetVertex(int32 index) const;\n\n\tb2Vec2 m_buffer[2];\n\tconst b2Vec2* m_vertices;\n\tint32 m_count;\n\tfloat32 m_radius;\n};\n\n/// Used to warm start b2Distance.\n/// Set count to zero on first call.\nstruct b2SimplexCache\n{\n\tfloat32 metric;\t\t///< length or area\n\tuint16 count;\n\tuint8 indexA[3];\t///< vertices on shape A\n\tuint8 indexB[3];\t///< vertices on shape B\n};\n\n/// Input for b2Distance.\n/// You have to option to use the shape radii\n/// in the computation. Even\nstruct b2DistanceInput\n{\n\tb2DistanceProxy proxyA;\n\tb2DistanceProxy proxyB;\n\tb2Transform transformA;\n\tb2Transform transformB;\n\tbool useRadii;\n};\n\n/// Output for b2Distance.\nstruct b2DistanceOutput\n{\n\tb2Vec2 pointA;\t\t///< closest point on shapeA\n\tb2Vec2 pointB;\t\t///< closest point on shapeB\n\tfloat32 distance;\n\tint32 iterations;\t///< number of GJK iterations used\n};\n\n/// Compute the closest points between two shapes. Supports any combination of:\n/// b2CircleShape, b2PolygonShape, b2EdgeShape. The simplex cache is input/output.\n/// On the first call set b2SimplexCache.count to zero.\nvoid b2Distance(b2DistanceOutput* output,\n\t\t\t\tb2SimplexCache* cache,\n\t\t\t\tconst b2DistanceInput* input);\n\n\n//////////////////////////////////////////////////////////////////////////\n\ninline int32 b2DistanceProxy::GetVertexCount() const\n{\n\treturn m_count;\n}\n\ninline const b2Vec2& b2DistanceProxy::GetVertex(int32 index) const\n{\n\tb2Assert(0 <= index && index < m_count);\n\treturn m_vertices[index];\n}\n\ninline int32 b2DistanceProxy::GetSupport(const b2Vec2& d) const\n{\n\tint32 bestIndex = 0;\n\tfloat32 bestValue = b2Dot(m_vertices[0], d);\n\tfor (int32 i = 1; i < m_count; ++i)\n\t{\n\t\tfloat32 value = b2Dot(m_vertices[i], d);\n\t\tif (value > bestValue)\n\t\t{\n\t\t\tbestIndex = i;\n\t\t\tbestValue = value;\n\t\t}\n\t}\n\n\treturn bestIndex;\n}\n\ninline const b2Vec2& b2DistanceProxy::GetSupportVertex(const b2Vec2& d) const\n{\n\tint32 bestIndex = 0;\n\tfloat32 bestValue = b2Dot(m_vertices[0], d);\n\tfor (int32 i = 1; i < m_count; ++i)\n\t{\n\t\tfloat32 value = b2Dot(m_vertices[i], d);\n\t\tif (value > bestValue)\n\t\t{\n\t\t\tbestIndex = i;\n\t\t\tbestValue = value;\n\t\t}\n\t}\n\n\treturn m_vertices[bestIndex];\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/b2DynamicTree.h",
    "content": "/*\n* Copyright (c) 2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_DYNAMIC_TREE_H\n#define B2_DYNAMIC_TREE_H\n\n#include \"b2Collision.h\"\n#include \"../Common/b2GrowableStack.h\"\n\n#define b2_nullNode (-1)\n\n/// A node in the dynamic tree. The client does not interact with this directly.\nstruct b2TreeNode\n{\n\tbool IsLeaf() const\n\t{\n\t\treturn child1 == b2_nullNode;\n\t}\n\n\t/// Enlarged AABB\n\tb2AABB aabb;\n\n\tvoid* userData;\n\n\tunion\n\t{\n\t\tint32 parent;\n\t\tint32 next;\n\t};\n\n\tint32 child1;\n\tint32 child2;\n\n\t// leaf = 0, free node = -1\n\tint32 height;\n};\n\n/// A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt.\n/// A dynamic tree arranges data in a binary tree to accelerate\n/// queries such as volume queries and ray casts. Leafs are proxies\n/// with an AABB. In the tree we expand the proxy AABB by b2_fatAABBFactor\n/// so that the proxy AABB is bigger than the client object. This allows the client\n/// object to move by small amounts without triggering a tree update.\n///\n/// Nodes are pooled and relocatable, so we use node indices rather than pointers.\nclass b2DynamicTree\n{\npublic:\n\t/// Constructing the tree initializes the node pool.\n\tb2DynamicTree();\n\n\t/// Destroy the tree, freeing the node pool.\n\t~b2DynamicTree();\n\n\t/// Create a proxy. Provide a tight fitting AABB and a userData pointer.\n\tint32 CreateProxy(const b2AABB& aabb, void* userData);\n\n\t/// Destroy a proxy. This asserts if the id is invalid.\n\tvoid DestroyProxy(int32 proxyId);\n\n\t/// Move a proxy with a swepted AABB. If the proxy has moved outside of its fattened AABB,\n\t/// then the proxy is removed from the tree and re-inserted. Otherwise\n\t/// the function returns immediately.\n\t/// @return true if the proxy was re-inserted.\n\tbool MoveProxy(int32 proxyId, const b2AABB& aabb1, const b2Vec2& displacement);\n\n\t/// Get proxy user data.\n\t/// @return the proxy user data or 0 if the id is invalid.\n\tvoid* GetUserData(int32 proxyId) const;\n\n\t/// Get the fat AABB for a proxy.\n\tconst b2AABB& GetFatAABB(int32 proxyId) const;\n\n\t/// Query an AABB for overlapping proxies. The callback class\n\t/// is called for each proxy that overlaps the supplied AABB.\n\ttemplate <typename T>\n\tvoid Query(T* callback, const b2AABB& aabb) const;\n\n\t/// Ray-cast against the proxies in the tree. This relies on the callback\n\t/// to perform a exact ray-cast in the case were the proxy contains a shape.\n\t/// The callback also performs the any collision filtering. This has performance\n\t/// roughly equal to k * log(n), where k is the number of collisions and n is the\n\t/// number of proxies in the tree.\n\t/// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).\n\t/// @param callback a callback class that is called for each proxy that is hit by the ray.\n\ttemplate <typename T>\n\tvoid RayCast(T* callback, const b2RayCastInput& input) const;\n\n\t/// Validate this tree. For testing.\n\tvoid Validate() const;\n\n\t/// Compute the height of the binary tree in O(N) time. Should not be\n\t/// called often.\n\tint32 GetHeight() const;\n\n\t/// Get the maximum balance of an node in the tree. The balance is the difference\n\t/// in height of the two children of a node.\n\tint32 GetMaxBalance() const;\n\n\t/// Get the ratio of the sum of the node areas to the root area.\n\tfloat32 GetAreaRatio() const;\n\n\t/// Build an optimal tree. Very expensive. For testing.\n\tvoid RebuildBottomUp();\n\n\t/// Shift the world origin. Useful for large worlds.\n\t/// The shift formula is: position -= newOrigin\n\t/// @param newOrigin the new origin with respect to the old origin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin);\n\nprivate:\n\n\tint32 AllocateNode();\n\tvoid FreeNode(int32 node);\n\n\tvoid InsertLeaf(int32 node);\n\tvoid RemoveLeaf(int32 node);\n\n\tint32 Balance(int32 index);\n\n\tint32 ComputeHeight() const;\n\tint32 ComputeHeight(int32 nodeId) const;\n\n\tvoid ValidateStructure(int32 index) const;\n\tvoid ValidateMetrics(int32 index) const;\n\n\tint32 m_root;\n\n\tb2TreeNode* m_nodes;\n\tint32 m_nodeCount;\n\tint32 m_nodeCapacity;\n\n\tint32 m_freeList;\n\n\t/// This is used to incrementally traverse the tree for re-balancing.\n\tuint32 m_path;\n\n\tint32 m_insertionCount;\n};\n\ninline void* b2DynamicTree::GetUserData(int32 proxyId) const\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\treturn m_nodes[proxyId].userData;\n}\n\ninline const b2AABB& b2DynamicTree::GetFatAABB(int32 proxyId) const\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\treturn m_nodes[proxyId].aabb;\n}\n\ntemplate <typename T>\ninline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const\n{\n\tb2GrowableStack<int32, 256> stack;\n\tstack.Push(m_root);\n\n\twhile (stack.GetCount() > 0)\n\t{\n\t\tint32 nodeId = stack.Pop();\n\t\tif (nodeId == b2_nullNode)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst b2TreeNode* node = m_nodes + nodeId;\n\n\t\tif (b2TestOverlap(node->aabb, aabb))\n\t\t{\n\t\t\tif (node->IsLeaf())\n\t\t\t{\n\t\t\t\tbool proceed = callback->QueryCallback(nodeId);\n\t\t\t\tif (proceed == false)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstack.Push(node->child1);\n\t\t\t\tstack.Push(node->child2);\n\t\t\t}\n\t\t}\n\t}\n}\n\ntemplate <typename T>\ninline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) const\n{\n\tb2Vec2 p1 = input.p1;\n\tb2Vec2 p2 = input.p2;\n\tb2Vec2 r = p2 - p1;\n\tb2Assert(r.LengthSquared() > 0.0f);\n\tr.Normalize();\n\n\t// v is perpendicular to the segment.\n\tb2Vec2 v = b2Cross(1.0f, r);\n\tb2Vec2 abs_v = b2Abs(v);\n\n\t// Separating axis for segment (Gino, p80).\n\t// |dot(v, p1 - c)| > dot(|v|, h)\n\n\tfloat32 maxFraction = input.maxFraction;\n\n\t// Build a bounding box for the segment.\n\tb2AABB segmentAABB;\n\t{\n\t\tb2Vec2 t = p1 + maxFraction * (p2 - p1);\n\t\tsegmentAABB.lowerBound = b2Min(p1, t);\n\t\tsegmentAABB.upperBound = b2Max(p1, t);\n\t}\n\n\tb2GrowableStack<int32, 256> stack;\n\tstack.Push(m_root);\n\n\twhile (stack.GetCount() > 0)\n\t{\n\t\tint32 nodeId = stack.Pop();\n\t\tif (nodeId == b2_nullNode)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst b2TreeNode* node = m_nodes + nodeId;\n\n\t\tif (b2TestOverlap(node->aabb, segmentAABB) == false)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Separating axis for segment (Gino, p80).\n\t\t// |dot(v, p1 - c)| > dot(|v|, h)\n\t\tb2Vec2 c = node->aabb.GetCenter();\n\t\tb2Vec2 h = node->aabb.GetExtents();\n\t\tfloat32 separation = b2Abs(b2Dot(v, p1 - c)) - b2Dot(abs_v, h);\n\t\tif (separation > 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (node->IsLeaf())\n\t\t{\n\t\t\tb2RayCastInput subInput;\n\t\t\tsubInput.p1 = input.p1;\n\t\t\tsubInput.p2 = input.p2;\n\t\t\tsubInput.maxFraction = maxFraction;\n\n\t\t\tfloat32 value = callback->RayCastCallback(subInput, nodeId);\n\n\t\t\tif (value == 0.0f)\n\t\t\t{\n\t\t\t\t// The client has terminated the ray cast.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (value > 0.0f)\n\t\t\t{\n\t\t\t\t// Update segment bounding box.\n\t\t\t\tmaxFraction = value;\n\t\t\t\tb2Vec2 t = p1 + maxFraction * (p2 - p1);\n\t\t\t\tsegmentAABB.lowerBound = b2Min(p1, t);\n\t\t\t\tsegmentAABB.upperBound = b2Max(p1, t);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstack.Push(node->child1);\n\t\t\tstack.Push(node->child2);\n\t\t}\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_TIME_OF_IMPACT_H\n#define B2_TIME_OF_IMPACT_H\n\n#include \"../Common/b2Math.h\"\n#include \"b2Distance.h\"\n\n/// Input parameters for b2TimeOfImpact\nstruct b2TOIInput\n{\n\tb2DistanceProxy proxyA;\n\tb2DistanceProxy proxyB;\n\tb2Sweep sweepA;\n\tb2Sweep sweepB;\n\tfloat32 tMax;\t\t// defines sweep interval [0, tMax]\n};\n\n// Output parameters for b2TimeOfImpact.\nstruct b2TOIOutput\n{\n\tenum State\n\t{\n\t\te_unknown,\n\t\te_failed,\n\t\te_overlapped,\n\t\te_touching,\n\t\te_separated\n\t};\n\n\tState state;\n\tfloat32 t;\n};\n\n/// Compute the upper bound on time before two shapes penetrate. Time is represented as\n/// a fraction between [0,tMax]. This uses a swept separating axis and may miss some intermediate,\n/// non-tunneling collision. If you change the time interval, you should call this function\n/// again.\n/// Note: use b2Distance to compute the contact point and normal at the time of impact.\nvoid b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input);\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_BLOCK_ALLOCATOR_H\n#define B2_BLOCK_ALLOCATOR_H\n\n#include \"b2Settings.h\"\n\nconst int32 b2_chunkSize = 16 * 1024;\nconst int32 b2_maxBlockSize = 640;\nconst int32 b2_blockSizes = 14;\nconst int32 b2_chunkArrayIncrement = 128;\n\nstruct b2Block;\nstruct b2Chunk;\n\n/// This is a small object allocator used for allocating small\n/// objects that persist for more than one time step.\n/// See: http://www.codeproject.com/useritems/Small_Block_Allocator.asp\nclass b2BlockAllocator\n{\npublic:\n\tb2BlockAllocator();\n\t~b2BlockAllocator();\n\n\t/// Allocate memory. This will use b2Alloc if the size is larger than b2_maxBlockSize.\n\tvoid* Allocate(int32 size);\n\n\t/// Free memory. This will use b2Free if the size is larger than b2_maxBlockSize.\n\tvoid Free(void* p, int32 size);\n\n\tvoid Clear();\n\nprivate:\n\n\tb2Chunk* m_chunks;\n\tint32 m_chunkCount;\n\tint32 m_chunkSpace;\n\n\tb2Block* m_freeLists[b2_blockSizes];\n\n\tstatic int32 s_blockSizes[b2_blockSizes];\n\tstatic uint8 s_blockSizeLookup[b2_maxBlockSize + 1];\n\tstatic bool s_blockSizeLookupInitialized;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Common/b2Draw.h",
    "content": "/*\n* Copyright (c) 2011 Erin Catto http://box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_DRAW_H\n#define B2_DRAW_H\n\n#include \"b2Math.h\"\n\n/// Color for debug drawing. Each value has the range [0,1].\nstruct b2Color\n{\n\tb2Color() {}\n\tb2Color(float32 r, float32 g, float32 b) : r(r), g(g), b(b) {}\n\tvoid Set(float32 ri, float32 gi, float32 bi) { r = ri; g = gi; b = bi; }\n\tfloat32 r, g, b;\n};\n\n/// Implement and register this class with a b2World to provide debug drawing of physics\n/// entities in your game.\nclass b2Draw\n{\npublic:\n\tb2Draw();\n\n\tvirtual ~b2Draw() {}\n\n\tenum\n\t{\n\t\te_shapeBit\t\t\t\t= 0x0001,\t///< draw shapes\n\t\te_jointBit\t\t\t\t= 0x0002,\t///< draw joint connections\n\t\te_aabbBit\t\t\t\t= 0x0004,\t///< draw axis aligned bounding boxes\n\t\te_pairBit\t\t\t\t= 0x0008,\t///< draw broad-phase pairs\n\t\te_centerOfMassBit\t\t= 0x0010\t///< draw center of mass frame\n\t};\n\n\t/// Set the drawing flags.\n\tvoid SetFlags(uint32 flags);\n\n\t/// Get the drawing flags.\n\tuint32 GetFlags() const;\n\n\t/// Append flags to the current flags.\n\tvoid AppendFlags(uint32 flags);\n\n\t/// Clear flags from the current flags.\n\tvoid ClearFlags(uint32 flags);\n\n\t/// Draw a closed polygon provided in CCW order.\n\tvirtual void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0;\n\n\t/// Draw a solid closed polygon provided in CCW order.\n\tvirtual void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0;\n\n\t/// Draw a circle.\n\tvirtual void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color) = 0;\n\n\t/// Draw a solid circle.\n\tvirtual void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) = 0;\n\n\t/// Draw a line segment.\n\tvirtual void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) = 0;\n\n\t/// Draw a transform. Choose your own length scale.\n\t/// @param xf a transform.\n\tvirtual void DrawTransform(const b2Transform& xf) = 0;\n\nprotected:\n\tuint32 m_drawFlags;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Common/b2GrowableStack.h",
    "content": "/*\n* Copyright (c) 2010 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_GROWABLE_STACK_H\n#define B2_GROWABLE_STACK_H\n#include \"b2Settings.h\"\n#include <memory.h>\n#include <string.h>\n\n/// This is a growable LIFO stack with an initial capacity of N.\n/// If the stack size exceeds the initial capacity, the heap is used\n/// to increase the size of the stack.\ntemplate <typename T, int32 N>\nclass b2GrowableStack\n{\npublic:\n\tb2GrowableStack()\n\t{\n\t\tm_stack = m_array;\n\t\tm_count = 0;\n\t\tm_capacity = N;\n\t}\n\n\t~b2GrowableStack()\n\t{\n\t\tif (m_stack != m_array)\n\t\t{\n\t\t\tb2Free(m_stack);\n\t\t\tm_stack = NULL;\n\t\t}\n\t}\n\n\tvoid Push(const T& element)\n\t{\n\t\tif (m_count == m_capacity)\n\t\t{\n\t\t\tT* old = m_stack;\n\t\t\tm_capacity *= 2;\n\t\t\tm_stack = (T*)b2Alloc(m_capacity * sizeof(T));\n\t\t\tmemcpy(m_stack, old, m_count * sizeof(T));\n\t\t\tif (old != m_array)\n\t\t\t{\n\t\t\t\tb2Free(old);\n\t\t\t}\n\t\t}\n\n\t\tm_stack[m_count] = element;\n\t\t++m_count;\n\t}\n\n\tT Pop()\n\t{\n\t\tb2Assert(m_count > 0);\n\t\t--m_count;\n\t\treturn m_stack[m_count];\n\t}\n\n\tint32 GetCount()\n\t{\n\t\treturn m_count;\n\t}\n\nprivate:\n\tT* m_stack;\n\tT m_array[N];\n\tint32 m_count;\n\tint32 m_capacity;\n};\n\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Common/b2Math.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_MATH_H\n#define B2_MATH_H\n\n#include \"b2Settings.h\"\n#include <math.h>\n\n/// This function is used to ensure that a floating point number is not a NaN or infinity.\ninline bool b2IsValid(float32 x)\n{\n\tint32 ix = *reinterpret_cast<int32*>(&x);\n\treturn (ix & 0x7f800000) != 0x7f800000;\n}\n\n/// This is a approximate yet fast inverse square-root.\ninline float32 b2InvSqrt(float32 x)\n{\n\tunion\n\t{\n\t\tfloat32 x;\n\t\tint32 i;\n\t} convert;\n\n\tconvert.x = x;\n\tfloat32 xhalf = 0.5f * x;\n\tconvert.i = 0x5f3759df - (convert.i >> 1);\n\tx = convert.x;\n\tx = x * (1.5f - xhalf * x * x);\n\treturn x;\n}\n\n#define\tb2Sqrt(x)\tsqrtf(x)\n#define\tb2Atan2(y, x)\tatan2f(y, x)\n\n/// A 2D column vector.\nstruct b2Vec2\n{\n\t/// Default constructor does nothing (for performance).\n\tb2Vec2() {}\n\n\t/// Construct using coordinates.\n\tb2Vec2(float32 x, float32 y) : x(x), y(y) {}\n\n\t/// Set this vector to all zeros.\n\tvoid SetZero() { x = 0.0f; y = 0.0f; }\n\n\t/// Set this vector to some specified coordinates.\n\tvoid Set(float32 x_, float32 y_) { x = x_; y = y_; }\n\n\t/// Negate this vector.\n\tb2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; }\n\n\t/// Read from and indexed element.\n\tfloat32 operator () (int32 i) const\n\t{\n\t\treturn (&x)[i];\n\t}\n\n\t/// Write to an indexed element.\n\tfloat32& operator () (int32 i)\n\t{\n\t\treturn (&x)[i];\n\t}\n\n\t/// Add a vector to this vector.\n\tvoid operator += (const b2Vec2& v)\n\t{\n\t\tx += v.x; y += v.y;\n\t}\n\n\t/// Subtract a vector from this vector.\n\tvoid operator -= (const b2Vec2& v)\n\t{\n\t\tx -= v.x; y -= v.y;\n\t}\n\n\t/// Multiply this vector by a scalar.\n\tvoid operator *= (float32 a)\n\t{\n\t\tx *= a; y *= a;\n\t}\n\n\t/// Get the length of this vector (the norm).\n\tfloat32 Length() const\n\t{\n\t\treturn b2Sqrt(x * x + y * y);\n\t}\n\n\t/// Get the length squared. For performance, use this instead of\n\t/// b2Vec2::Length (if possible).\n\tfloat32 LengthSquared() const\n\t{\n\t\treturn x * x + y * y;\n\t}\n\n\t/// Convert this vector into a unit vector. Returns the length.\n\tfloat32 Normalize()\n\t{\n\t\tfloat32 length = Length();\n\t\tif (length < b2_epsilon)\n\t\t{\n\t\t\treturn 0.0f;\n\t\t}\n\t\tfloat32 invLength = 1.0f / length;\n\t\tx *= invLength;\n\t\ty *= invLength;\n\n\t\treturn length;\n\t}\n\n\t/// Does this vector contain finite coordinates?\n\tbool IsValid() const\n\t{\n\t\treturn b2IsValid(x) && b2IsValid(y);\n\t}\n\n\t/// Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n\tb2Vec2 Skew() const\n\t{\n\t\treturn b2Vec2(-y, x);\n\t}\n\n\tfloat32 x, y;\n};\n\n/// A 2D column vector with 3 elements.\nstruct b2Vec3\n{\n\t/// Default constructor does nothing (for performance).\n\tb2Vec3() {}\n\n\t/// Construct using coordinates.\n\tb2Vec3(float32 x, float32 y, float32 z) : x(x), y(y), z(z) {}\n\n\t/// Set this vector to all zeros.\n\tvoid SetZero() { x = 0.0f; y = 0.0f; z = 0.0f; }\n\n\t/// Set this vector to some specified coordinates.\n\tvoid Set(float32 x_, float32 y_, float32 z_) { x = x_; y = y_; z = z_; }\n\n\t/// Negate this vector.\n\tb2Vec3 operator -() const { b2Vec3 v; v.Set(-x, -y, -z); return v; }\n\n\t/// Add a vector to this vector.\n\tvoid operator += (const b2Vec3& v)\n\t{\n\t\tx += v.x; y += v.y; z += v.z;\n\t}\n\n\t/// Subtract a vector from this vector.\n\tvoid operator -= (const b2Vec3& v)\n\t{\n\t\tx -= v.x; y -= v.y; z -= v.z;\n\t}\n\n\t/// Multiply this vector by a scalar.\n\tvoid operator *= (float32 s)\n\t{\n\t\tx *= s; y *= s; z *= s;\n\t}\n\n\tfloat32 x, y, z;\n};\n\n/// A 2-by-2 matrix. Stored in column-major order.\nstruct b2Mat22\n{\n\t/// The default constructor does nothing (for performance).\n\tb2Mat22() {}\n\n\t/// Construct this matrix using columns.\n\tb2Mat22(const b2Vec2& c1, const b2Vec2& c2)\n\t{\n\t\tex = c1;\n\t\tey = c2;\n\t}\n\n\t/// Construct this matrix using scalars.\n\tb2Mat22(float32 a11, float32 a12, float32 a21, float32 a22)\n\t{\n\t\tex.x = a11; ex.y = a21;\n\t\tey.x = a12; ey.y = a22;\n\t}\n\n\t/// Initialize this matrix using columns.\n\tvoid Set(const b2Vec2& c1, const b2Vec2& c2)\n\t{\n\t\tex = c1;\n\t\tey = c2;\n\t}\n\n\t/// Set this to the identity matrix.\n\tvoid SetIdentity()\n\t{\n\t\tex.x = 1.0f; ey.x = 0.0f;\n\t\tex.y = 0.0f; ey.y = 1.0f;\n\t}\n\n\t/// Set this matrix to all zeros.\n\tvoid SetZero()\n\t{\n\t\tex.x = 0.0f; ey.x = 0.0f;\n\t\tex.y = 0.0f; ey.y = 0.0f;\n\t}\n\n\tb2Mat22 GetInverse() const\n\t{\n\t\tfloat32 a = ex.x, b = ey.x, c = ex.y, d = ey.y;\n\t\tb2Mat22 B;\n\t\tfloat32 det = a * d - b * c;\n\t\tif (det != 0.0f)\n\t\t{\n\t\t\tdet = 1.0f / det;\n\t\t}\n\t\tB.ex.x =  det * d;\tB.ey.x = -det * b;\n\t\tB.ex.y = -det * c;\tB.ey.y =  det * a;\n\t\treturn B;\n\t}\n\n\t/// Solve A * x = b, where b is a column vector. This is more efficient\n\t/// than computing the inverse in one-shot cases.\n\tb2Vec2 Solve(const b2Vec2& b) const\n\t{\n\t\tfloat32 a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y;\n\t\tfloat32 det = a11 * a22 - a12 * a21;\n\t\tif (det != 0.0f)\n\t\t{\n\t\t\tdet = 1.0f / det;\n\t\t}\n\t\tb2Vec2 x;\n\t\tx.x = det * (a22 * b.x - a12 * b.y);\n\t\tx.y = det * (a11 * b.y - a21 * b.x);\n\t\treturn x;\n\t}\n\n\tb2Vec2 ex, ey;\n};\n\n/// A 3-by-3 matrix. Stored in column-major order.\nstruct b2Mat33\n{\n\t/// The default constructor does nothing (for performance).\n\tb2Mat33() {}\n\n\t/// Construct this matrix using columns.\n\tb2Mat33(const b2Vec3& c1, const b2Vec3& c2, const b2Vec3& c3)\n\t{\n\t\tex = c1;\n\t\tey = c2;\n\t\tez = c3;\n\t}\n\n\t/// Set this matrix to all zeros.\n\tvoid SetZero()\n\t{\n\t\tex.SetZero();\n\t\tey.SetZero();\n\t\tez.SetZero();\n\t}\n\n\t/// Solve A * x = b, where b is a column vector. This is more efficient\n\t/// than computing the inverse in one-shot cases.\n\tb2Vec3 Solve33(const b2Vec3& b) const;\n\n\t/// Solve A * x = b, where b is a column vector. This is more efficient\n\t/// than computing the inverse in one-shot cases. Solve only the upper\n\t/// 2-by-2 matrix equation.\n\tb2Vec2 Solve22(const b2Vec2& b) const;\n\n\t/// Get the inverse of this matrix as a 2-by-2.\n\t/// Returns the zero matrix if singular.\n\tvoid GetInverse22(b2Mat33* M) const;\n\n\t/// Get the symmetric inverse of this matrix as a 3-by-3.\n\t/// Returns the zero matrix if singular.\n\tvoid GetSymInverse33(b2Mat33* M) const;\n\n\tb2Vec3 ex, ey, ez;\n};\n\n/// Rotation\nstruct b2Rot\n{\n\tb2Rot() {}\n\n\t/// Initialize from an angle in radians\n\texplicit b2Rot(float32 angle)\n\t{\n\t\t/// TODO_ERIN optimize\n\t\ts = sinf(angle);\n\t\tc = cosf(angle);\n\t}\n\n\t/// Set using an angle in radians.\n\tvoid Set(float32 angle)\n\t{\n\t\t/// TODO_ERIN optimize\n\t\ts = sinf(angle);\n\t\tc = cosf(angle);\n\t}\n\n\t/// Set to the identity rotation\n\tvoid SetIdentity()\n\t{\n\t\ts = 0.0f;\n\t\tc = 1.0f;\n\t}\n\n\t/// Get the angle in radians\n\tfloat32 GetAngle() const\n\t{\n\t\treturn b2Atan2(s, c);\n\t}\n\n\t/// Get the x-axis\n\tb2Vec2 GetXAxis() const\n\t{\n\t\treturn b2Vec2(c, s);\n\t}\n\n\t/// Get the u-axis\n\tb2Vec2 GetYAxis() const\n\t{\n\t\treturn b2Vec2(-s, c);\n\t}\n\n\t/// Sine and cosine\n\tfloat32 s, c;\n};\n\n/// A transform contains translation and rotation. It is used to represent\n/// the position and orientation of rigid frames.\nstruct b2Transform\n{\n\t/// The default constructor does nothing.\n\tb2Transform() {}\n\n\t/// Initialize using a position vector and a rotation.\n\tb2Transform(const b2Vec2& position, const b2Rot& rotation) : p(position), q(rotation) {}\n\n\t/// Set this to the identity transform.\n\tvoid SetIdentity()\n\t{\n\t\tp.SetZero();\n\t\tq.SetIdentity();\n\t}\n\n\t/// Set this based on the position and angle.\n\tvoid Set(const b2Vec2& position, float32 angle)\n\t{\n\t\tp = position;\n\t\tq.Set(angle);\n\t}\n\n\tb2Vec2 p;\n\tb2Rot q;\n};\n\n/// This describes the motion of a body/shape for TOI computation.\n/// Shapes are defined with respect to the body origin, which may\n/// no coincide with the center of mass. However, to support dynamics\n/// we must interpolate the center of mass position.\nstruct b2Sweep\n{\n\t/// Get the interpolated transform at a specific time.\n\t/// @param beta is a factor in [0,1], where 0 indicates alpha0.\n\tvoid GetTransform(b2Transform* xfb, float32 beta) const;\n\n\t/// Advance the sweep forward, yielding a new initial state.\n\t/// @param alpha the new initial time.\n\tvoid Advance(float32 alpha);\n\n\t/// Normalize the angles.\n\tvoid Normalize();\n\n\tb2Vec2 localCenter;\t///< local center of mass position\n\tb2Vec2 c0, c;\t\t///< center world positions\n\tfloat32 a0, a;\t\t///< world angles\n\n\t/// Fraction of the current time step in the range [0,1]\n\t/// c0 and a0 are the positions at alpha0.\n\tfloat32 alpha0;\n};\n\n/// Useful constant\nextern const b2Vec2 b2Vec2_zero;\n\n/// Perform the dot product on two vectors.\ninline float32 b2Dot(const b2Vec2& a, const b2Vec2& b)\n{\n\treturn a.x * b.x + a.y * b.y;\n}\n\n/// Perform the cross product on two vectors. In 2D this produces a scalar.\ninline float32 b2Cross(const b2Vec2& a, const b2Vec2& b)\n{\n\treturn a.x * b.y - a.y * b.x;\n}\n\n/// Perform the cross product on a vector and a scalar. In 2D this produces\n/// a vector.\ninline b2Vec2 b2Cross(const b2Vec2& a, float32 s)\n{\n\treturn b2Vec2(s * a.y, -s * a.x);\n}\n\n/// Perform the cross product on a scalar and a vector. In 2D this produces\n/// a vector.\ninline b2Vec2 b2Cross(float32 s, const b2Vec2& a)\n{\n\treturn b2Vec2(-s * a.y, s * a.x);\n}\n\n/// Multiply a matrix times a vector. If a rotation matrix is provided,\n/// then this transforms the vector from one frame to another.\ninline b2Vec2 b2Mul(const b2Mat22& A, const b2Vec2& v)\n{\n\treturn b2Vec2(A.ex.x * v.x + A.ey.x * v.y, A.ex.y * v.x + A.ey.y * v.y);\n}\n\n/// Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n/// then this transforms the vector from one frame to another (inverse transform).\ninline b2Vec2 b2MulT(const b2Mat22& A, const b2Vec2& v)\n{\n\treturn b2Vec2(b2Dot(v, A.ex), b2Dot(v, A.ey));\n}\n\n/// Add two vectors component-wise.\ninline b2Vec2 operator + (const b2Vec2& a, const b2Vec2& b)\n{\n\treturn b2Vec2(a.x + b.x, a.y + b.y);\n}\n\n/// Subtract two vectors component-wise.\ninline b2Vec2 operator - (const b2Vec2& a, const b2Vec2& b)\n{\n\treturn b2Vec2(a.x - b.x, a.y - b.y);\n}\n\ninline b2Vec2 operator * (float32 s, const b2Vec2& a)\n{\n\treturn b2Vec2(s * a.x, s * a.y);\n}\n\ninline bool operator == (const b2Vec2& a, const b2Vec2& b)\n{\n\treturn a.x == b.x && a.y == b.y;\n}\n\ninline float32 b2Distance(const b2Vec2& a, const b2Vec2& b)\n{\n\tb2Vec2 c = a - b;\n\treturn c.Length();\n}\n\ninline float32 b2DistanceSquared(const b2Vec2& a, const b2Vec2& b)\n{\n\tb2Vec2 c = a - b;\n\treturn b2Dot(c, c);\n}\n\ninline b2Vec3 operator * (float32 s, const b2Vec3& a)\n{\n\treturn b2Vec3(s * a.x, s * a.y, s * a.z);\n}\n\n/// Add two vectors component-wise.\ninline b2Vec3 operator + (const b2Vec3& a, const b2Vec3& b)\n{\n\treturn b2Vec3(a.x + b.x, a.y + b.y, a.z + b.z);\n}\n\n/// Subtract two vectors component-wise.\ninline b2Vec3 operator - (const b2Vec3& a, const b2Vec3& b)\n{\n\treturn b2Vec3(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\n/// Perform the dot product on two vectors.\ninline float32 b2Dot(const b2Vec3& a, const b2Vec3& b)\n{\n\treturn a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\n/// Perform the cross product on two vectors.\ninline b2Vec3 b2Cross(const b2Vec3& a, const b2Vec3& b)\n{\n\treturn 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);\n}\n\ninline b2Mat22 operator + (const b2Mat22& A, const b2Mat22& B)\n{\n\treturn b2Mat22(A.ex + B.ex, A.ey + B.ey);\n}\n\n// A * B\ninline b2Mat22 b2Mul(const b2Mat22& A, const b2Mat22& B)\n{\n\treturn b2Mat22(b2Mul(A, B.ex), b2Mul(A, B.ey));\n}\n\n// A^T * B\ninline b2Mat22 b2MulT(const b2Mat22& A, const b2Mat22& B)\n{\n\tb2Vec2 c1(b2Dot(A.ex, B.ex), b2Dot(A.ey, B.ex));\n\tb2Vec2 c2(b2Dot(A.ex, B.ey), b2Dot(A.ey, B.ey));\n\treturn b2Mat22(c1, c2);\n}\n\n/// Multiply a matrix times a vector.\ninline b2Vec3 b2Mul(const b2Mat33& A, const b2Vec3& v)\n{\n\treturn v.x * A.ex + v.y * A.ey + v.z * A.ez;\n}\n\n/// Multiply a matrix times a vector.\ninline b2Vec2 b2Mul22(const b2Mat33& A, const b2Vec2& v)\n{\n\treturn b2Vec2(A.ex.x * v.x + A.ey.x * v.y, A.ex.y * v.x + A.ey.y * v.y);\n}\n\n/// Multiply two rotations: q * r\ninline b2Rot b2Mul(const b2Rot& q, const b2Rot& r)\n{\n\t// [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n\t// [qs  qc]   [rs  rc]   [qs*rc+qc*rs -qs*rs+qc*rc]\n\t// s = qs * rc + qc * rs\n\t// c = qc * rc - qs * rs\n\tb2Rot qr;\n\tqr.s = q.s * r.c + q.c * r.s;\n\tqr.c = q.c * r.c - q.s * r.s;\n\treturn qr;\n}\n\n/// Transpose multiply two rotations: qT * r\ninline b2Rot b2MulT(const b2Rot& q, const b2Rot& r)\n{\n\t// [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n\t// [-qs qc]   [rs  rc]   [-qs*rc+qc*rs qs*rs+qc*rc]\n\t// s = qc * rs - qs * rc\n\t// c = qc * rc + qs * rs\n\tb2Rot qr;\n\tqr.s = q.c * r.s - q.s * r.c;\n\tqr.c = q.c * r.c + q.s * r.s;\n\treturn qr;\n}\n\n/// Rotate a vector\ninline b2Vec2 b2Mul(const b2Rot& q, const b2Vec2& v)\n{\n\treturn b2Vec2(q.c * v.x - q.s * v.y, q.s * v.x + q.c * v.y);\n}\n\n/// Inverse rotate a vector\ninline b2Vec2 b2MulT(const b2Rot& q, const b2Vec2& v)\n{\n\treturn b2Vec2(q.c * v.x + q.s * v.y, -q.s * v.x + q.c * v.y);\n}\n\ninline b2Vec2 b2Mul(const b2Transform& T, const b2Vec2& v)\n{\n\tfloat32 x = (T.q.c * v.x - T.q.s * v.y) + T.p.x;\n\tfloat32 y = (T.q.s * v.x + T.q.c * v.y) + T.p.y;\n\n\treturn b2Vec2(x, y);\n}\n\ninline b2Vec2 b2MulT(const b2Transform& T, const b2Vec2& v)\n{\n\tfloat32 px = v.x - T.p.x;\n\tfloat32 py = v.y - T.p.y;\n\tfloat32 x = (T.q.c * px + T.q.s * py);\n\tfloat32 y = (-T.q.s * px + T.q.c * py);\n\n\treturn b2Vec2(x, y);\n}\n\n// v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n//    = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\ninline b2Transform b2Mul(const b2Transform& A, const b2Transform& B)\n{\n\tb2Transform C;\n\tC.q = b2Mul(A.q, B.q);\n\tC.p = b2Mul(A.q, B.p) + A.p;\n\treturn C;\n}\n\n// v2 = A.q' * (B.q * v1 + B.p - A.p)\n//    = A.q' * B.q * v1 + A.q' * (B.p - A.p)\ninline b2Transform b2MulT(const b2Transform& A, const b2Transform& B)\n{\n\tb2Transform C;\n\tC.q = b2MulT(A.q, B.q);\n\tC.p = b2MulT(A.q, B.p - A.p);\n\treturn C;\n}\n\ntemplate <typename T>\ninline T b2Abs(T a)\n{\n\treturn a > T(0) ? a : -a;\n}\n\ninline b2Vec2 b2Abs(const b2Vec2& a)\n{\n\treturn b2Vec2(b2Abs(a.x), b2Abs(a.y));\n}\n\ninline b2Mat22 b2Abs(const b2Mat22& A)\n{\n\treturn b2Mat22(b2Abs(A.ex), b2Abs(A.ey));\n}\n\ntemplate <typename T>\ninline T b2Min(T a, T b)\n{\n\treturn a < b ? a : b;\n}\n\ninline b2Vec2 b2Min(const b2Vec2& a, const b2Vec2& b)\n{\n\treturn b2Vec2(b2Min(a.x, b.x), b2Min(a.y, b.y));\n}\n\ntemplate <typename T>\ninline T b2Max(T a, T b)\n{\n\treturn a > b ? a : b;\n}\n\ninline b2Vec2 b2Max(const b2Vec2& a, const b2Vec2& b)\n{\n\treturn b2Vec2(b2Max(a.x, b.x), b2Max(a.y, b.y));\n}\n\ntemplate <typename T>\ninline T b2Clamp(T a, T low, T high)\n{\n\treturn b2Max(low, b2Min(a, high));\n}\n\ninline b2Vec2 b2Clamp(const b2Vec2& a, const b2Vec2& low, const b2Vec2& high)\n{\n\treturn b2Max(low, b2Min(a, high));\n}\n\ntemplate<typename T> inline void b2Swap(T& a, T& b)\n{\n\tT tmp = a;\n\ta = b;\n\tb = tmp;\n}\n\n/// \"Next Largest Power of 2\n/// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm\n/// that recursively \"folds\" the upper bits into the lower bits. This process yields a bit vector with\n/// the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next\n/// largest power of 2. For a 32-bit value:\"\ninline uint32 b2NextPowerOfTwo(uint32 x)\n{\n\tx |= (x >> 1);\n\tx |= (x >> 2);\n\tx |= (x >> 4);\n\tx |= (x >> 8);\n\tx |= (x >> 16);\n\treturn x + 1;\n}\n\ninline bool b2IsPowerOfTwo(uint32 x)\n{\n\tbool result = x > 0 && (x & (x - 1)) == 0;\n\treturn result;\n}\n\ninline void b2Sweep::GetTransform(b2Transform* xf, float32 beta) const\n{\n\txf->p = (1.0f - beta) * c0 + beta * c;\n\tfloat32 angle = (1.0f - beta) * a0 + beta * a;\n\txf->q.Set(angle);\n\n\t// Shift to origin\n\txf->p -= b2Mul(xf->q, localCenter);\n}\n\ninline void b2Sweep::Advance(float32 alpha)\n{\n\tb2Assert(alpha0 < 1.0f);\n\tfloat32 beta = (alpha - alpha0) / (1.0f - alpha0);\n\tc0 += beta * (c - c0);\n\ta0 += beta * (a - a0);\n\talpha0 = alpha;\n}\n\n/// Normalize an angle in radians to be between -pi and pi\ninline void b2Sweep::Normalize()\n{\n\tfloat32 twoPi = 2.0f * b2_pi;\n\tfloat32 d =  twoPi * floorf(a0 / twoPi);\n\ta0 -= d;\n\ta -= d;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Common/b2Settings.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_SETTINGS_H\n#define B2_SETTINGS_H\n\n#include <stddef.h>\n#include <assert.h>\n#include <float.h>\n\n#define B2_NOT_USED(x) ((void)(x))\n#define b2Assert(A) assert(A)\n\ntypedef signed char\tint8;\ntypedef signed short int16;\ntypedef signed int int32;\ntypedef unsigned char uint8;\ntypedef unsigned short uint16;\ntypedef unsigned int uint32;\ntypedef float float32;\ntypedef double float64;\n\n#define\tb2_maxFloat\t\tFLT_MAX\n#define\tb2_epsilon\t\tFLT_EPSILON\n#define b2_pi\t\t\t3.14159265359f\n\n/// @file\n/// Global tuning constants based on meters-kilograms-seconds (MKS) units.\n///\n\n// Collision\n\n/// The maximum number of contact points between two convex shapes. Do\n/// not change this value.\n#define b2_maxManifoldPoints\t2\n\n/// The maximum number of vertices on a convex polygon. You cannot increase\n/// this too much because b2BlockAllocator has a maximum object size.\n#define b2_maxPolygonVertices\t8\n\n/// This is used to fatten AABBs in the dynamic tree. This allows proxies\n/// to move by a small amount without triggering a tree adjustment.\n/// This is in meters.\n#define b2_aabbExtension\t\t0.1f\n\n/// This is used to fatten AABBs in the dynamic tree. This is used to predict\n/// the future position based on the current displacement.\n/// This is a dimensionless multiplier.\n#define b2_aabbMultiplier\t\t2.0f\n\n/// A small length used as a collision and constraint tolerance. Usually it is\n/// chosen to be numerically significant, but visually insignificant.\n#define b2_linearSlop\t\t\t0.005f\n\n/// A small angle used as a collision and constraint tolerance. Usually it is\n/// chosen to be numerically significant, but visually insignificant.\n#define b2_angularSlop\t\t\t(2.0f / 180.0f * b2_pi)\n\n/// The radius of the polygon/edge shape skin. This should not be modified. Making\n/// this smaller means polygons will have an insufficient buffer for continuous collision.\n/// Making it larger may create artifacts for vertex collision.\n#define b2_polygonRadius\t\t(2.0f * b2_linearSlop)\n\n/// Maximum number of sub-steps per contact in continuous physics simulation.\n#define b2_maxSubSteps\t\t\t8\n\n\n// Dynamics\n\n/// Maximum number of contacts to be handled to solve a TOI impact.\n#define b2_maxTOIContacts\t\t\t32\n\n/// A velocity threshold for elastic collisions. Any collision with a relative linear\n/// velocity below this threshold will be treated as inelastic.\n#define b2_velocityThreshold\t\t1.0f\n\n/// The maximum linear position correction used when solving constraints. This helps to\n/// prevent overshoot.\n#define b2_maxLinearCorrection\t\t0.2f\n\n/// The maximum angular position correction used when solving constraints. This helps to\n/// prevent overshoot.\n#define b2_maxAngularCorrection\t\t(8.0f / 180.0f * b2_pi)\n\n/// The maximum linear velocity of a body. This limit is very large and is used\n/// to prevent numerical problems. You shouldn't need to adjust this.\n#define b2_maxTranslation\t\t\t2.0f\n#define b2_maxTranslationSquared\t(b2_maxTranslation * b2_maxTranslation)\n\n/// The maximum angular velocity of a body. This limit is very large and is used\n/// to prevent numerical problems. You shouldn't need to adjust this.\n#define b2_maxRotation\t\t\t\t(0.5f * b2_pi)\n#define b2_maxRotationSquared\t\t(b2_maxRotation * b2_maxRotation)\n\n/// This scale factor controls how fast overlap is resolved. Ideally this would be 1 so\n/// that overlap is removed in one time step. However using values close to 1 often lead\n/// to overshoot.\n#define b2_baumgarte\t\t\t\t0.2f\n#define b2_toiBaugarte\t\t\t\t0.75f\n\n\n// Sleep\n\n/// The time that a body must be still before it will go to sleep.\n#define b2_timeToSleep\t\t\t\t0.5f\n\n/// A body cannot sleep if its linear velocity is above this tolerance.\n#define b2_linearSleepTolerance\t\t0.01f\n\n/// A body cannot sleep if its angular velocity is above this tolerance.\n#define b2_angularSleepTolerance\t(2.0f / 180.0f * b2_pi)\n\n// Memory Allocation\n\n/// Implement this function to use your own memory allocator.\nvoid* b2Alloc(int32 size);\n\n/// If you implement b2Alloc, you should also implement this function.\nvoid b2Free(void* mem);\n\n/// Logging function.\nvoid b2Log(const char* string, ...);\n\n/// Version numbering scheme.\n/// See http://en.wikipedia.org/wiki/Software_versioning\nstruct b2Version\n{\n\tint32 major;\t\t///< significant changes\n\tint32 minor;\t\t///< incremental changes\n\tint32 revision;\t\t///< bug fixes\n};\n\n/// Current version.\nextern b2Version b2_version;\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Common/b2StackAllocator.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_STACK_ALLOCATOR_H\n#define B2_STACK_ALLOCATOR_H\n\n#include \"b2Settings.h\"\n\nconst int32 b2_stackSize = 100 * 1024;\t// 100k\nconst int32 b2_maxStackEntries = 32;\n\nstruct b2StackEntry\n{\n\tchar* data;\n\tint32 size;\n\tbool usedMalloc;\n};\n\n// This is a stack allocator used for fast per step allocations.\n// You must nest allocate/free pairs. The code will assert\n// if you try to interleave multiple allocate/free pairs.\nclass b2StackAllocator\n{\npublic:\n\tb2StackAllocator();\n\t~b2StackAllocator();\n\n\tvoid* Allocate(int32 size);\n\tvoid Free(void* p);\n\n\tint32 GetMaxAllocation() const;\n\nprivate:\n\n\tchar m_data[b2_stackSize];\n\tint32 m_index;\n\n\tint32 m_allocation;\n\tint32 m_maxAllocation;\n\n\tb2StackEntry m_entries[b2_maxStackEntries];\n\tint32 m_entryCount;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Common/b2Timer.h",
    "content": "/*\n* Copyright (c) 2011 Erin Catto http://box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_TIMER_H\n#define B2_TIMER_H\n\n#include \"b2Settings.h\"\n\n/// Timer for profiling. This has platform specific code and may\n/// not work on every platform.\nclass b2Timer\n{\npublic:\n\n\t/// Constructor\n\tb2Timer();\n\n\t/// Reset the timer.\n\tvoid Reset();\n\n\t/// Get the time since construction or the last reset.\n\tfloat32 GetMilliseconds() const;\n\nprivate:\n\n#if defined(_WIN32)\n\tfloat64 m_start;\n\tstatic float64 s_invFrequency;\n#elif defined(__linux__) || defined (__APPLE__)\n\tunsigned long m_start_sec;\n\tunsigned long m_start_usec;\n#endif\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_CHAIN_AND_CIRCLE_CONTACT_H\n#define B2_CHAIN_AND_CIRCLE_CONTACT_H\n\n#include \"b2Contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2ChainAndCircleContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2ChainAndCircleContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB);\n\t~b2ChainAndCircleContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_CHAIN_AND_POLYGON_CONTACT_H\n#define B2_CHAIN_AND_POLYGON_CONTACT_H\n\n#include \"b2Contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2ChainAndPolygonContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2ChainAndPolygonContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB);\n\t~b2ChainAndPolygonContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_CIRCLE_CONTACT_H\n#define B2_CIRCLE_CONTACT_H\n\n#include \"b2Contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2CircleContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2CircleContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_CONTACT_H\n#define B2_CONTACT_H\n\n#include \"../../Common/b2Math.h\"\n#include \"../../Collision/b2Collision.h\"\n#include \"../../Collision/Shapes/b2Shape.h\"\n#include \"../b2Fixture.h\"\n\nclass b2Body;\nclass b2Contact;\nclass b2Fixture;\nclass b2World;\nclass b2BlockAllocator;\nclass b2StackAllocator;\nclass b2ContactListener;\n\n/// Friction mixing law. The idea is to allow either fixture to drive the restitution to zero.\n/// For example, anything slides on ice.\ninline float32 b2MixFriction(float32 friction1, float32 friction2)\n{\n\treturn b2Sqrt(friction1 * friction2);\n}\n\n/// Restitution mixing law. The idea is allow for anything to bounce off an inelastic surface.\n/// For example, a superball bounces on anything.\ninline float32 b2MixRestitution(float32 restitution1, float32 restitution2)\n{\n\treturn restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\ntypedef b2Contact* b2ContactCreateFcn(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB,\n\t\t\t\t\t\t\t\t\t\tb2BlockAllocator* allocator);\ntypedef void b2ContactDestroyFcn(b2Contact* contact, b2BlockAllocator* allocator);\n\nstruct b2ContactRegister\n{\n\tb2ContactCreateFcn* createFcn;\n\tb2ContactDestroyFcn* destroyFcn;\n\tbool primary;\n};\n\n/// A contact edge is used to connect bodies and contacts together\n/// in a contact graph where each body is a node and each contact\n/// is an edge. A contact edge belongs to a doubly linked list\n/// maintained in each attached body. Each contact has two contact\n/// nodes, one for each attached body.\nstruct b2ContactEdge\n{\n\tb2Body* other;\t\t\t///< provides quick access to the other body attached.\n\tb2Contact* contact;\t\t///< the contact\n\tb2ContactEdge* prev;\t///< the previous contact edge in the body's contact list\n\tb2ContactEdge* next;\t///< the next contact edge in the body's contact list\n};\n\n/// The class manages contact between two shapes. A contact exists for each overlapping\n/// AABB in the broad-phase (except if filtered). Therefore a contact object may exist\n/// that has no contact points.\nclass b2Contact\n{\npublic:\n\n\t/// Get the contact manifold. Do not modify the manifold unless you understand the\n\t/// internals of Box2D.\n\tb2Manifold* GetManifold();\n\tconst b2Manifold* GetManifold() const;\n\n\t/// Get the world manifold.\n\tvoid GetWorldManifold(b2WorldManifold* worldManifold) const;\n\n\t/// Is this contact touching?\n\tbool IsTouching() const;\n\n\t/// Enable/disable this contact. This can be used inside the pre-solve\n\t/// contact listener. The contact is only disabled for the current\n\t/// time step (or sub-step in continuous collisions).\n\tvoid SetEnabled(bool flag);\n\n\t/// Has this contact been disabled?\n\tbool IsEnabled() const;\n\n\t/// Get the next contact in the world's contact list.\n\tb2Contact* GetNext();\n\tconst b2Contact* GetNext() const;\n\n\t/// Get fixture A in this contact.\n\tb2Fixture* GetFixtureA();\n\tconst b2Fixture* GetFixtureA() const;\n\n\t/// Get the child primitive index for fixture A.\n\tint32 GetChildIndexA() const;\n\n\t/// Get fixture B in this contact.\n\tb2Fixture* GetFixtureB();\n\tconst b2Fixture* GetFixtureB() const;\n\n\t/// Get the child primitive index for fixture B.\n\tint32 GetChildIndexB() const;\n\n\t/// Override the default friction mixture. You can call this in b2ContactListener::PreSolve.\n\t/// This value persists until set or reset.\n\tvoid SetFriction(float32 friction);\n\n\t/// Get the friction.\n\tfloat32 GetFriction() const;\n\n\t/// Reset the friction mixture to the default value.\n\tvoid ResetFriction();\n\n\t/// Override the default restitution mixture. You can call this in b2ContactListener::PreSolve.\n\t/// The value persists until you set or reset.\n\tvoid SetRestitution(float32 restitution);\n\n\t/// Get the restitution.\n\tfloat32 GetRestitution() const;\n\n\t/// Reset the restitution to the default value.\n\tvoid ResetRestitution();\n\n\t/// Set the desired tangent speed for a conveyor belt behavior. In meters per second.\n\tvoid SetTangentSpeed(float32 speed);\n\n\t/// Get the desired tangent speed. In meters per second.\n\tfloat32 GetTangentSpeed() const;\n\n\t/// Evaluate this contact with your own manifold and transforms.\n\tvirtual void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) = 0;\n\nprotected:\n\tfriend class b2ContactManager;\n\tfriend class b2World;\n\tfriend class b2ContactSolver;\n\tfriend class b2Body;\n\tfriend class b2Fixture;\n\n\t// Flags stored in m_flags\n\tenum\n\t{\n\t\t// Used when crawling contact graph when forming islands.\n\t\te_islandFlag\t\t= 0x0001,\n\n        // Set when the shapes are touching.\n\t\te_touchingFlag\t\t= 0x0002,\n\n\t\t// This contact can be disabled (by user)\n\t\te_enabledFlag\t\t= 0x0004,\n\n\t\t// This contact needs filtering because a fixture filter was changed.\n\t\te_filterFlag\t\t= 0x0008,\n\n\t\t// This bullet contact had a TOI event\n\t\te_bulletHitFlag\t\t= 0x0010,\n\n\t\t// This contact has a valid TOI in m_toi\n\t\te_toiFlag\t\t\t= 0x0020\n\t};\n\n\t/// Flag this contact for filtering. Filtering will occur the next time step.\n\tvoid FlagForFiltering();\n\n\tstatic void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn,\n\t\t\t\t\t\tb2Shape::Type typeA, b2Shape::Type typeB);\n\tstatic void InitializeRegisters();\n\tstatic b2Contact* Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2Shape::Type typeA, b2Shape::Type typeB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2Contact() : m_fixtureA(NULL), m_fixtureB(NULL) {}\n\tb2Contact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB);\n\tvirtual ~b2Contact() {}\n\n\tvoid Update(b2ContactListener* listener);\n\n\tstatic b2ContactRegister s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount];\n\tstatic bool s_initialized;\n\n\tuint32 m_flags;\n\n\t// World pool and list pointers.\n\tb2Contact* m_prev;\n\tb2Contact* m_next;\n\n\t// Nodes for connecting bodies.\n\tb2ContactEdge m_nodeA;\n\tb2ContactEdge m_nodeB;\n\n\tb2Fixture* m_fixtureA;\n\tb2Fixture* m_fixtureB;\n\n\tint32 m_indexA;\n\tint32 m_indexB;\n\n\tb2Manifold m_manifold;\n\n\tint32 m_toiCount;\n\tfloat32 m_toi;\n\n\tfloat32 m_friction;\n\tfloat32 m_restitution;\n\n\tfloat32 m_tangentSpeed;\n};\n\ninline b2Manifold* b2Contact::GetManifold()\n{\n\treturn &m_manifold;\n}\n\ninline const b2Manifold* b2Contact::GetManifold() const\n{\n\treturn &m_manifold;\n}\n\ninline void b2Contact::GetWorldManifold(b2WorldManifold* worldManifold) const\n{\n\tconst b2Body* bodyA = m_fixtureA->GetBody();\n\tconst b2Body* bodyB = m_fixtureB->GetBody();\n\tconst b2Shape* shapeA = m_fixtureA->GetShape();\n\tconst b2Shape* shapeB = m_fixtureB->GetShape();\n\n\tworldManifold->Initialize(&m_manifold, bodyA->GetTransform(), shapeA->m_radius, bodyB->GetTransform(), shapeB->m_radius);\n}\n\ninline void b2Contact::SetEnabled(bool flag)\n{\n\tif (flag)\n\t{\n\t\tm_flags |= e_enabledFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_enabledFlag;\n\t}\n}\n\ninline bool b2Contact::IsEnabled() const\n{\n\treturn (m_flags & e_enabledFlag) == e_enabledFlag;\n}\n\ninline bool b2Contact::IsTouching() const\n{\n\treturn (m_flags & e_touchingFlag) == e_touchingFlag;\n}\n\ninline b2Contact* b2Contact::GetNext()\n{\n\treturn m_next;\n}\n\ninline const b2Contact* b2Contact::GetNext() const\n{\n\treturn m_next;\n}\n\ninline b2Fixture* b2Contact::GetFixtureA()\n{\n\treturn m_fixtureA;\n}\n\ninline const b2Fixture* b2Contact::GetFixtureA() const\n{\n\treturn m_fixtureA;\n}\n\ninline b2Fixture* b2Contact::GetFixtureB()\n{\n\treturn m_fixtureB;\n}\n\ninline int32 b2Contact::GetChildIndexA() const\n{\n\treturn m_indexA;\n}\n\ninline const b2Fixture* b2Contact::GetFixtureB() const\n{\n\treturn m_fixtureB;\n}\n\ninline int32 b2Contact::GetChildIndexB() const\n{\n\treturn m_indexB;\n}\n\ninline void b2Contact::FlagForFiltering()\n{\n\tm_flags |= e_filterFlag;\n}\n\ninline void b2Contact::SetFriction(float32 friction)\n{\n\tm_friction = friction;\n}\n\ninline float32 b2Contact::GetFriction() const\n{\n\treturn m_friction;\n}\n\ninline void b2Contact::ResetFriction()\n{\n\tm_friction = b2MixFriction(m_fixtureA->m_friction, m_fixtureB->m_friction);\n}\n\ninline void b2Contact::SetRestitution(float32 restitution)\n{\n\tm_restitution = restitution;\n}\n\ninline float32 b2Contact::GetRestitution() const\n{\n\treturn m_restitution;\n}\n\ninline void b2Contact::ResetRestitution()\n{\n\tm_restitution = b2MixRestitution(m_fixtureA->m_restitution, m_fixtureB->m_restitution);\n}\n\ninline void b2Contact::SetTangentSpeed(float32 speed)\n{\n\tm_tangentSpeed = speed;\n}\n\ninline float32 b2Contact::GetTangentSpeed() const\n{\n\treturn m_tangentSpeed;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_CONTACT_SOLVER_H\n#define B2_CONTACT_SOLVER_H\n\n#include \"../../Common/b2Math.h\"\n#include \"../../Collision/b2Collision.h\"\n#include \"../b2TimeStep.h\"\n\nclass b2Contact;\nclass b2Body;\nclass b2StackAllocator;\nstruct b2ContactPositionConstraint;\n\nstruct b2VelocityConstraintPoint\n{\n\tb2Vec2 rA;\n\tb2Vec2 rB;\n\tfloat32 normalImpulse;\n\tfloat32 tangentImpulse;\n\tfloat32 normalMass;\n\tfloat32 tangentMass;\n\tfloat32 velocityBias;\n};\n\nstruct b2ContactVelocityConstraint\n{\n\tb2VelocityConstraintPoint points[b2_maxManifoldPoints];\n\tb2Vec2 normal;\n\tb2Mat22 normalMass;\n\tb2Mat22 K;\n\tint32 indexA;\n\tint32 indexB;\n\tfloat32 invMassA, invMassB;\n\tfloat32 invIA, invIB;\n\tfloat32 friction;\n\tfloat32 restitution;\n\tfloat32 tangentSpeed;\n\tint32 pointCount;\n\tint32 contactIndex;\n};\n\nstruct b2ContactSolverDef\n{\n\tb2TimeStep step;\n\tb2Contact** contacts;\n\tint32 count;\n\tb2Position* positions;\n\tb2Velocity* velocities;\n\tb2StackAllocator* allocator;\n};\n\nclass b2ContactSolver\n{\npublic:\n\tb2ContactSolver(b2ContactSolverDef* def);\n\t~b2ContactSolver();\n\n\tvoid InitializeVelocityConstraints();\n\n\tvoid WarmStart();\n\tvoid SolveVelocityConstraints();\n\tvoid StoreImpulses();\n\n\tbool SolvePositionConstraints();\n\tbool SolveTOIPositionConstraints(int32 toiIndexA, int32 toiIndexB);\n\n\tb2TimeStep m_step;\n\tb2Position* m_positions;\n\tb2Velocity* m_velocities;\n\tb2StackAllocator* m_allocator;\n\tb2ContactPositionConstraint* m_positionConstraints;\n\tb2ContactVelocityConstraint* m_velocityConstraints;\n\tb2Contact** m_contacts;\n\tint m_count;\n};\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_EDGE_AND_CIRCLE_CONTACT_H\n#define B2_EDGE_AND_CIRCLE_CONTACT_H\n\n#include \"b2Contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2EdgeAndCircleContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2EdgeAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2EdgeAndCircleContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_EDGE_AND_POLYGON_CONTACT_H\n#define B2_EDGE_AND_POLYGON_CONTACT_H\n\n#include \"b2Contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2EdgeAndPolygonContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2EdgeAndPolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2EdgeAndPolygonContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_POLYGON_AND_CIRCLE_CONTACT_H\n#define B2_POLYGON_AND_CIRCLE_CONTACT_H\n\n#include \"b2Contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2PolygonAndCircleContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2PolygonAndCircleContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonContact.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_POLYGON_CONTACT_H\n#define B2_POLYGON_CONTACT_H\n\n#include \"b2Contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2PolygonContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2PolygonContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2DistanceJoint.h",
    "content": "/*\n* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_DISTANCE_JOINT_H\n#define B2_DISTANCE_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Distance joint definition. This requires defining an\n/// anchor point on both bodies and the non-zero length of the\n/// distance joint. The definition uses local anchor points\n/// so that the initial configuration can violate the constraint\n/// slightly. This helps when saving and loading a game.\n/// @warning Do not use a zero or short length.\nstruct b2DistanceJointDef : public b2JointDef\n{\n\tb2DistanceJointDef()\n\t{\n\t\ttype = e_distanceJoint;\n\t\tlocalAnchorA.Set(0.0f, 0.0f);\n\t\tlocalAnchorB.Set(0.0f, 0.0f);\n\t\tlength = 1.0f;\n\t\tfrequencyHz = 0.0f;\n\t\tdampingRatio = 0.0f;\n\t}\n\n\t/// Initialize the bodies, anchors, and length using the world\n\t/// anchors.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB,\n\t\t\t\t\tconst b2Vec2& anchorA, const b2Vec2& anchorB);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The natural length between the anchor points.\n\tfloat32 length;\n\n\t/// The mass-spring-damper frequency in Hertz. A value of 0\n\t/// disables softness.\n\tfloat32 frequencyHz;\n\n\t/// The damping ratio. 0 = no damping, 1 = critical damping.\n\tfloat32 dampingRatio;\n};\n\n/// A distance joint constrains two points on two bodies\n/// to remain at a fixed distance from each other. You can view\n/// this as a massless, rigid rod.\nclass b2DistanceJoint : public b2Joint\n{\npublic:\n\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\t/// Get the reaction force given the inverse time step.\n\t/// Unit is N.\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\n\t/// Get the reaction torque given the inverse time step.\n\t/// Unit is N*m. This is always zero for a distance joint.\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// Set/get the natural length.\n\t/// Manipulating the length can lead to non-physical behavior when the frequency is zero.\n\tvoid SetLength(float32 length);\n\tfloat32 GetLength() const;\n\n\t/// Set/get frequency in Hz.\n\tvoid SetFrequency(float32 hz);\n\tfloat32 GetFrequency() const;\n\n\t/// Set/get damping ratio.\n\tvoid SetDampingRatio(float32 ratio);\n\tfloat32 GetDampingRatio() const;\n\n\t/// Dump joint to dmLog\n\tvoid Dump();\n\nprotected:\n\n\tfriend class b2Joint;\n\tb2DistanceJoint(const b2DistanceJointDef* data);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\tfloat32 m_frequencyHz;\n\tfloat32 m_dampingRatio;\n\tfloat32 m_bias;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tfloat32 m_gamma;\n\tfloat32 m_impulse;\n\tfloat32 m_length;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_u;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat32 m_invMassA;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIA;\n\tfloat32 m_invIB;\n\tfloat32 m_mass;\n};\n\ninline void b2DistanceJoint::SetLength(float32 length)\n{\n\tm_length = length;\n}\n\ninline float32 b2DistanceJoint::GetLength() const\n{\n\treturn m_length;\n}\n\ninline void b2DistanceJoint::SetFrequency(float32 hz)\n{\n\tm_frequencyHz = hz;\n}\n\ninline float32 b2DistanceJoint::GetFrequency() const\n{\n\treturn m_frequencyHz;\n}\n\ninline void b2DistanceJoint::SetDampingRatio(float32 ratio)\n{\n\tm_dampingRatio = ratio;\n}\n\ninline float32 b2DistanceJoint::GetDampingRatio() const\n{\n\treturn m_dampingRatio;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2FrictionJoint.h",
    "content": "/*\n* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_FRICTION_JOINT_H\n#define B2_FRICTION_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Friction joint definition.\nstruct b2FrictionJointDef : public b2JointDef\n{\n\tb2FrictionJointDef()\n\t{\n\t\ttype = e_frictionJoint;\n\t\tlocalAnchorA.SetZero();\n\t\tlocalAnchorB.SetZero();\n\t\tmaxForce = 0.0f;\n\t\tmaxTorque = 0.0f;\n\t}\n\n\t/// Initialize the bodies, anchors, axis, and reference angle using the world\n\t/// anchor and world axis.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The maximum friction force in N.\n\tfloat32 maxForce;\n\n\t/// The maximum friction torque in N-m.\n\tfloat32 maxTorque;\n};\n\n/// Friction joint. This is used for top-down friction.\n/// It provides 2D translational friction and angular friction.\nclass b2FrictionJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// Set the maximum friction force in N.\n\tvoid SetMaxForce(float32 force);\n\n\t/// Get the maximum friction force in N.\n\tfloat32 GetMaxForce() const;\n\n\t/// Set the maximum friction torque in N*m.\n\tvoid SetMaxTorque(float32 torque);\n\n\t/// Get the maximum friction torque in N*m.\n\tfloat32 GetMaxTorque() const;\n\n\t/// Dump joint to dmLog\n\tvoid Dump();\n\nprotected:\n\n\tfriend class b2Joint;\n\n\tb2FrictionJoint(const b2FrictionJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\n\t// Solver shared\n\tb2Vec2 m_linearImpulse;\n\tfloat32 m_angularImpulse;\n\tfloat32 m_maxForce;\n\tfloat32 m_maxTorque;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat32 m_invMassA;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIA;\n\tfloat32 m_invIB;\n\tb2Mat22 m_linearMass;\n\tfloat32 m_angularMass;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2GearJoint.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_GEAR_JOINT_H\n#define B2_GEAR_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Gear joint definition. This definition requires two existing\n/// revolute or prismatic joints (any combination will work).\nstruct b2GearJointDef : public b2JointDef\n{\n\tb2GearJointDef()\n\t{\n\t\ttype = e_gearJoint;\n\t\tjoint1 = NULL;\n\t\tjoint2 = NULL;\n\t\tratio = 1.0f;\n\t}\n\n\t/// The first revolute/prismatic joint attached to the gear joint.\n\tb2Joint* joint1;\n\n\t/// The second revolute/prismatic joint attached to the gear joint.\n\tb2Joint* joint2;\n\n\t/// The gear ratio.\n\t/// @see b2GearJoint for explanation.\n\tfloat32 ratio;\n};\n\n/// A gear joint is used to connect two joints together. Either joint\n/// can be a revolute or prismatic joint. You specify a gear ratio\n/// to bind the motions together:\n/// coordinate1 + ratio * coordinate2 = constant\n/// The ratio can be negative or positive. If one joint is a revolute joint\n/// and the other joint is a prismatic joint, then the ratio will have units\n/// of length or units of 1/length.\n/// @warning You have to manually destroy the gear joint if joint1 or joint2\n/// is destroyed.\nclass b2GearJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// Get the first joint.\n\tb2Joint* GetJoint1() { return m_joint1; }\n\n\t/// Get the second joint.\n\tb2Joint* GetJoint2() { return m_joint2; }\n\n\t/// Set/Get the gear ratio.\n\tvoid SetRatio(float32 ratio);\n\tfloat32 GetRatio() const;\n\n\t/// Dump joint to dmLog\n\tvoid Dump();\n\nprotected:\n\n\tfriend class b2Joint;\n\tb2GearJoint(const b2GearJointDef* data);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\tb2Joint* m_joint1;\n\tb2Joint* m_joint2;\n\n\tb2JointType m_typeA;\n\tb2JointType m_typeB;\n\n\t// Body A is connected to body C\n\t// Body B is connected to body D\n\tb2Body* m_bodyC;\n\tb2Body* m_bodyD;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tb2Vec2 m_localAnchorC;\n\tb2Vec2 m_localAnchorD;\n\n\tb2Vec2 m_localAxisC;\n\tb2Vec2 m_localAxisD;\n\n\tfloat32 m_referenceAngleA;\n\tfloat32 m_referenceAngleB;\n\n\tfloat32 m_constant;\n\tfloat32 m_ratio;\n\n\tfloat32 m_impulse;\n\n\t// Solver temp\n\tint32 m_indexA, m_indexB, m_indexC, m_indexD;\n\tb2Vec2 m_lcA, m_lcB, m_lcC, m_lcD;\n\tfloat32 m_mA, m_mB, m_mC, m_mD;\n\tfloat32 m_iA, m_iB, m_iC, m_iD;\n\tb2Vec2 m_JvAC, m_JvBD;\n\tfloat32 m_JwA, m_JwB, m_JwC, m_JwD;\n\tfloat32 m_mass;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.h",
    "content": "/*\n* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_JOINT_H\n#define B2_JOINT_H\n\n#include \"../../Common/b2Math.h\"\n\nclass b2Body;\nclass b2Joint;\nstruct b2SolverData;\nclass b2BlockAllocator;\n\nenum b2JointType\n{\n\te_unknownJoint,\n\te_revoluteJoint,\n\te_prismaticJoint,\n\te_distanceJoint,\n\te_pulleyJoint,\n\te_mouseJoint,\n\te_gearJoint,\n\te_wheelJoint,\n    e_weldJoint,\n\te_frictionJoint,\n\te_ropeJoint,\n\te_motorJoint\n};\n\nenum b2LimitState\n{\n\te_inactiveLimit,\n\te_atLowerLimit,\n\te_atUpperLimit,\n\te_equalLimits\n};\n\nstruct b2Jacobian\n{\n\tb2Vec2 linear;\n\tfloat32 angularA;\n\tfloat32 angularB;\n};\n\n/// A joint edge is used to connect bodies and joints together\n/// in a joint graph where each body is a node and each joint\n/// is an edge. A joint edge belongs to a doubly linked list\n/// maintained in each attached body. Each joint has two joint\n/// nodes, one for each attached body.\nstruct b2JointEdge\n{\n\tb2Body* other;\t\t\t///< provides quick access to the other body attached.\n\tb2Joint* joint;\t\t\t///< the joint\n\tb2JointEdge* prev;\t\t///< the previous joint edge in the body's joint list\n\tb2JointEdge* next;\t\t///< the next joint edge in the body's joint list\n};\n\n/// Joint definitions are used to construct joints.\nstruct b2JointDef\n{\n\tb2JointDef()\n\t{\n\t\ttype = e_unknownJoint;\n\t\tuserData = NULL;\n\t\tbodyA = NULL;\n\t\tbodyB = NULL;\n\t\tcollideConnected = false;\n\t}\n\n\t/// The joint type is set automatically for concrete joint types.\n\tb2JointType type;\n\n\t/// Use this to attach application specific data to your joints.\n\tvoid* userData;\n\n\t/// The first attached body.\n\tb2Body* bodyA;\n\n\t/// The second attached body.\n\tb2Body* bodyB;\n\n\t/// Set this flag to true if the attached bodies should collide.\n\tbool collideConnected;\n};\n\n/// The base joint class. Joints are used to constraint two bodies together in\n/// various fashions. Some joints also feature limits and motors.\nclass b2Joint\n{\npublic:\n\n\t/// Get the type of the concrete joint.\n\tb2JointType GetType() const;\n\n\t/// Get the first body attached to this joint.\n\tb2Body* GetBodyA();\n\n\t/// Get the second body attached to this joint.\n\tb2Body* GetBodyB();\n\n\t/// Get the anchor point on bodyA in world coordinates.\n\tvirtual b2Vec2 GetAnchorA() const = 0;\n\n\t/// Get the anchor point on bodyB in world coordinates.\n\tvirtual b2Vec2 GetAnchorB() const = 0;\n\n\t/// Get the reaction force on bodyB at the joint anchor in Newtons.\n\tvirtual b2Vec2 GetReactionForce(float32 inv_dt) const = 0;\n\n\t/// Get the reaction torque on bodyB in N*m.\n\tvirtual float32 GetReactionTorque(float32 inv_dt) const = 0;\n\n\t/// Get the next joint the world joint list.\n\tb2Joint* GetNext();\n\tconst b2Joint* GetNext() const;\n\n\t/// Get the user data pointer.\n\tvoid* GetUserData() const;\n\n\t/// Set the user data pointer.\n\tvoid SetUserData(void* data);\n\n\t/// Short-cut function to determine if either body is inactive.\n\tbool IsActive() const;\n\n\t/// Get collide connected.\n\t/// Note: modifying the collide connect flag won't work correctly because\n\t/// the flag is only checked when fixture AABBs begin to overlap.\n\tbool GetCollideConnected() const;\n\n\t/// Dump this joint to the log file.\n\tvirtual void Dump() { b2Log(\"// Dump is not supported for this joint type.\\n\"); }\n\n\t/// Shift the origin for any points stored in world coordinates.\n\tvirtual void ShiftOrigin(const b2Vec2& newOrigin) { B2_NOT_USED(newOrigin);  }\n\nprotected:\n\tfriend class b2World;\n\tfriend class b2Body;\n\tfriend class b2Island;\n\tfriend class b2GearJoint;\n\n\tstatic b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Joint* joint, b2BlockAllocator* allocator);\n\n\tb2Joint(const b2JointDef* def);\n\tvirtual ~b2Joint() {}\n\n\tvirtual void InitVelocityConstraints(const b2SolverData& data) = 0;\n\tvirtual void SolveVelocityConstraints(const b2SolverData& data) = 0;\n\n\t// This returns true if the position errors are within tolerance.\n\tvirtual bool SolvePositionConstraints(const b2SolverData& data) = 0;\n\n\tb2JointType m_type;\n\tb2Joint* m_prev;\n\tb2Joint* m_next;\n\tb2JointEdge m_edgeA;\n\tb2JointEdge m_edgeB;\n\tb2Body* m_bodyA;\n\tb2Body* m_bodyB;\n\n\tint32 m_index;\n\n\tbool m_islandFlag;\n\tbool m_collideConnected;\n\n\tvoid* m_userData;\n};\n\ninline b2JointType b2Joint::GetType() const\n{\n\treturn m_type;\n}\n\ninline b2Body* b2Joint::GetBodyA()\n{\n\treturn m_bodyA;\n}\n\ninline b2Body* b2Joint::GetBodyB()\n{\n\treturn m_bodyB;\n}\n\ninline b2Joint* b2Joint::GetNext()\n{\n\treturn m_next;\n}\n\ninline const b2Joint* b2Joint::GetNext() const\n{\n\treturn m_next;\n}\n\ninline void* b2Joint::GetUserData() const\n{\n\treturn m_userData;\n}\n\ninline void b2Joint::SetUserData(void* data)\n{\n\tm_userData = data;\n}\n\ninline bool b2Joint::GetCollideConnected() const\n{\n\treturn m_collideConnected;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MotorJoint.h",
    "content": "/*\n* Copyright (c) 2006-2012 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_MOTOR_JOINT_H\n#define B2_MOTOR_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Motor joint definition.\nstruct b2MotorJointDef : public b2JointDef\n{\n\tb2MotorJointDef()\n\t{\n\t\ttype = e_motorJoint;\n\t\tlinearOffset.SetZero();\n\t\tangularOffset = 0.0f;\n\t\tmaxForce = 1.0f;\n\t\tmaxTorque = 1.0f;\n\t\tcorrectionFactor = 0.3f;\n\t}\n\n\t/// Initialize the bodies and offsets using the current transforms.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB);\n\n\t/// Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n\tb2Vec2 linearOffset;\n\n\t/// The bodyB angle minus bodyA angle in radians.\n\tfloat32 angularOffset;\n\n\t/// The maximum motor force in N.\n\tfloat32 maxForce;\n\n\t/// The maximum motor torque in N-m.\n\tfloat32 maxTorque;\n\n\t/// Position correction factor in the range [0,1].\n\tfloat32 correctionFactor;\n};\n\n/// A motor joint is used to control the relative motion\n/// between two bodies. A typical usage is to control the movement\n/// of a dynamic body with respect to the ground.\nclass b2MotorJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// Set/get the target linear offset, in frame A, in meters.\n\tvoid SetLinearOffset(const b2Vec2& linearOffset);\n\tconst b2Vec2& GetLinearOffset() const;\n\n\t/// Set/get the target angular offset, in radians.\n\tvoid SetAngularOffset(float32 angularOffset);\n\tfloat32 GetAngularOffset() const;\n\n\t/// Set the maximum friction force in N.\n\tvoid SetMaxForce(float32 force);\n\n\t/// Get the maximum friction force in N.\n\tfloat32 GetMaxForce() const;\n\n\t/// Set the maximum friction torque in N*m.\n\tvoid SetMaxTorque(float32 torque);\n\n\t/// Get the maximum friction torque in N*m.\n\tfloat32 GetMaxTorque() const;\n\n\t/// Set the position correction factor in the range [0,1].\n\tvoid SetCorrectionFactor(float32 factor);\n\n\t/// Get the position correction factor in the range [0,1].\n\tfloat32 GetCorrectionFactor() const;\n\n\t/// Dump to b2Log\n\tvoid Dump();\n\nprotected:\n\n\tfriend class b2Joint;\n\n\tb2MotorJoint(const b2MotorJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\t// Solver shared\n\tb2Vec2 m_linearOffset;\n\tfloat32 m_angularOffset;\n\tb2Vec2 m_linearImpulse;\n\tfloat32 m_angularImpulse;\n\tfloat32 m_maxForce;\n\tfloat32 m_maxTorque;\n\tfloat32 m_correctionFactor;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tb2Vec2 m_linearError;\n\tfloat32 m_angularError;\n\tfloat32 m_invMassA;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIA;\n\tfloat32 m_invIB;\n\tb2Mat22 m_linearMass;\n\tfloat32 m_angularMass;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MouseJoint.h",
    "content": "/*\n* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_MOUSE_JOINT_H\n#define B2_MOUSE_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Mouse joint definition. This requires a world target point,\n/// tuning parameters, and the time step.\nstruct b2MouseJointDef : public b2JointDef\n{\n\tb2MouseJointDef()\n\t{\n\t\ttype = e_mouseJoint;\n\t\ttarget.Set(0.0f, 0.0f);\n\t\tmaxForce = 0.0f;\n\t\tfrequencyHz = 5.0f;\n\t\tdampingRatio = 0.7f;\n\t}\n\n\t/// The initial world target point. This is assumed\n\t/// to coincide with the body anchor initially.\n\tb2Vec2 target;\n\n\t/// The maximum constraint force that can be exerted\n\t/// to move the candidate body. Usually you will express\n\t/// as some multiple of the weight (multiplier * mass * gravity).\n\tfloat32 maxForce;\n\n\t/// The response speed.\n\tfloat32 frequencyHz;\n\n\t/// The damping ratio. 0 = no damping, 1 = critical damping.\n\tfloat32 dampingRatio;\n};\n\n/// A mouse joint is used to make a point on a body track a\n/// specified world point. This a soft constraint with a maximum\n/// force. This allows the constraint to stretch and without\n/// applying huge forces.\n/// NOTE: this joint is not documented in the manual because it was\n/// developed to be used in the testbed. If you want to learn how to\n/// use the mouse joint, look at the testbed.\nclass b2MouseJoint : public b2Joint\n{\npublic:\n\n\t/// Implements b2Joint.\n\tb2Vec2 GetAnchorA() const;\n\n\t/// Implements b2Joint.\n\tb2Vec2 GetAnchorB() const;\n\n\t/// Implements b2Joint.\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\n\t/// Implements b2Joint.\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// Use this to update the target point.\n\tvoid SetTarget(const b2Vec2& target);\n\tconst b2Vec2& GetTarget() const;\n\n\t/// Set/get the maximum force in Newtons.\n\tvoid SetMaxForce(float32 force);\n\tfloat32 GetMaxForce() const;\n\n\t/// Set/get the frequency in Hertz.\n\tvoid SetFrequency(float32 hz);\n\tfloat32 GetFrequency() const;\n\n\t/// Set/get the damping ratio (dimensionless).\n\tvoid SetDampingRatio(float32 ratio);\n\tfloat32 GetDampingRatio() const;\n\n\t/// The mouse joint does not support dumping.\n\tvoid Dump() { b2Log(\"Mouse joint dumping is not supported.\\n\"); }\n\n\t/// Implement b2Joint::ShiftOrigin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin);\n\nprotected:\n\tfriend class b2Joint;\n\n\tb2MouseJoint(const b2MouseJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\tb2Vec2 m_localAnchorB;\n\tb2Vec2 m_targetA;\n\tfloat32 m_frequencyHz;\n\tfloat32 m_dampingRatio;\n\tfloat32 m_beta;\n\n\t// Solver shared\n\tb2Vec2 m_impulse;\n\tfloat32 m_maxForce;\n\tfloat32 m_gamma;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterB;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIB;\n\tb2Mat22 m_mass;\n\tb2Vec2 m_C;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_PRISMATIC_JOINT_H\n#define B2_PRISMATIC_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Prismatic joint definition. This requires defining a line of\n/// motion using an axis and an anchor point. The definition uses local\n/// anchor points and a local axis so that the initial configuration\n/// can violate the constraint slightly. The joint translation is zero\n/// when the local anchor points coincide in world space. Using local\n/// anchors and a local axis helps when saving and loading a game.\nstruct b2PrismaticJointDef : public b2JointDef\n{\n\tb2PrismaticJointDef()\n\t{\n\t\ttype = e_prismaticJoint;\n\t\tlocalAnchorA.SetZero();\n\t\tlocalAnchorB.SetZero();\n\t\tlocalAxisA.Set(1.0f, 0.0f);\n\t\treferenceAngle = 0.0f;\n\t\tenableLimit = false;\n\t\tlowerTranslation = 0.0f;\n\t\tupperTranslation = 0.0f;\n\t\tenableMotor = false;\n\t\tmaxMotorForce = 0.0f;\n\t\tmotorSpeed = 0.0f;\n\t}\n\n\t/// Initialize the bodies, anchors, axis, and reference angle using the world\n\t/// anchor and unit world axis.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The local translation unit axis in bodyA.\n\tb2Vec2 localAxisA;\n\n\t/// The constrained angle between the bodies: bodyB_angle - bodyA_angle.\n\tfloat32 referenceAngle;\n\n\t/// Enable/disable the joint limit.\n\tbool enableLimit;\n\n\t/// The lower translation limit, usually in meters.\n\tfloat32 lowerTranslation;\n\n\t/// The upper translation limit, usually in meters.\n\tfloat32 upperTranslation;\n\n\t/// Enable/disable the joint motor.\n\tbool enableMotor;\n\n\t/// The maximum motor torque, usually in N-m.\n\tfloat32 maxMotorForce;\n\n\t/// The desired motor speed in radians per second.\n\tfloat32 motorSpeed;\n};\n\n/// A prismatic joint. This joint provides one degree of freedom: translation\n/// along an axis fixed in bodyA. Relative rotation is prevented. You can\n/// use a joint limit to restrict the range of motion and a joint motor to\n/// drive the motion or to model joint friction.\nclass b2PrismaticJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// The local joint axis relative to bodyA.\n\tconst b2Vec2& GetLocalAxisA() const { return m_localXAxisA; }\n\n\t/// Get the reference angle.\n\tfloat32 GetReferenceAngle() const { return m_referenceAngle; }\n\n\t/// Get the current joint translation, usually in meters.\n\tfloat32 GetJointTranslation() const;\n\n\t/// Get the current joint translation speed, usually in meters per second.\n\tfloat32 GetJointSpeed() const;\n\n\t/// Is the joint limit enabled?\n\tbool IsLimitEnabled() const;\n\n\t/// Enable/disable the joint limit.\n\tvoid EnableLimit(bool flag);\n\n\t/// Get the lower joint limit, usually in meters.\n\tfloat32 GetLowerLimit() const;\n\n\t/// Get the upper joint limit, usually in meters.\n\tfloat32 GetUpperLimit() const;\n\n\t/// Set the joint limits, usually in meters.\n\tvoid SetLimits(float32 lower, float32 upper);\n\n\t/// Is the joint motor enabled?\n\tbool IsMotorEnabled() const;\n\n\t/// Enable/disable the joint motor.\n\tvoid EnableMotor(bool flag);\n\n\t/// Set the motor speed, usually in meters per second.\n\tvoid SetMotorSpeed(float32 speed);\n\n\t/// Get the motor speed, usually in meters per second.\n\tfloat32 GetMotorSpeed() const;\n\n\t/// Set the maximum motor force, usually in N.\n\tvoid SetMaxMotorForce(float32 force);\n\tfloat32 GetMaxMotorForce() const { return m_maxMotorForce; }\n\n\t/// Get the current motor force given the inverse time step, usually in N.\n\tfloat32 GetMotorForce(float32 inv_dt) const;\n\n\t/// Dump to b2Log\n\tvoid Dump();\n\nprotected:\n\tfriend class b2Joint;\n\tfriend class b2GearJoint;\n\tb2PrismaticJoint(const b2PrismaticJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tb2Vec2 m_localXAxisA;\n\tb2Vec2 m_localYAxisA;\n\tfloat32 m_referenceAngle;\n\tb2Vec3 m_impulse;\n\tfloat32 m_motorImpulse;\n\tfloat32 m_lowerTranslation;\n\tfloat32 m_upperTranslation;\n\tfloat32 m_maxMotorForce;\n\tfloat32 m_motorSpeed;\n\tbool m_enableLimit;\n\tbool m_enableMotor;\n\tb2LimitState m_limitState;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat32 m_invMassA;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIA;\n\tfloat32 m_invIB;\n\tb2Vec2 m_axis, m_perp;\n\tfloat32 m_s1, m_s2;\n\tfloat32 m_a1, m_a2;\n\tb2Mat33 m_K;\n\tfloat32 m_motorMass;\n};\n\ninline float32 b2PrismaticJoint::GetMotorSpeed() const\n{\n\treturn m_motorSpeed;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_PULLEY_JOINT_H\n#define B2_PULLEY_JOINT_H\n\n#include \"b2Joint.h\"\n\nconst float32 b2_minPulleyLength = 2.0f;\n\n/// Pulley joint definition. This requires two ground anchors,\n/// two dynamic body anchor points, and a pulley ratio.\nstruct b2PulleyJointDef : public b2JointDef\n{\n\tb2PulleyJointDef()\n\t{\n\t\ttype = e_pulleyJoint;\n\t\tgroundAnchorA.Set(-1.0f, 1.0f);\n\t\tgroundAnchorB.Set(1.0f, 1.0f);\n\t\tlocalAnchorA.Set(-1.0f, 0.0f);\n\t\tlocalAnchorB.Set(1.0f, 0.0f);\n\t\tlengthA = 0.0f;\n\t\tlengthB = 0.0f;\n\t\tratio = 1.0f;\n\t\tcollideConnected = true;\n\t}\n\n\t/// Initialize the bodies, anchors, lengths, max lengths, and ratio using the world anchors.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB,\n\t\t\t\t\tconst b2Vec2& groundAnchorA, const b2Vec2& groundAnchorB,\n\t\t\t\t\tconst b2Vec2& anchorA, const b2Vec2& anchorB,\n\t\t\t\t\tfloat32 ratio);\n\n\t/// The first ground anchor in world coordinates. This point never moves.\n\tb2Vec2 groundAnchorA;\n\n\t/// The second ground anchor in world coordinates. This point never moves.\n\tb2Vec2 groundAnchorB;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The a reference length for the segment attached to bodyA.\n\tfloat32 lengthA;\n\n\t/// The a reference length for the segment attached to bodyB.\n\tfloat32 lengthB;\n\n\t/// The pulley ratio, used to simulate a block-and-tackle.\n\tfloat32 ratio;\n};\n\n/// The pulley joint is connected to two bodies and two fixed ground points.\n/// The pulley supports a ratio such that:\n/// length1 + ratio * length2 <= constant\n/// Yes, the force transmitted is scaled by the ratio.\n/// Warning: the pulley joint can get a bit squirrelly by itself. They often\n/// work better when combined with prismatic joints. You should also cover the\n/// the anchor points with static shapes to prevent one side from going to\n/// zero length.\nclass b2PulleyJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// Get the first ground anchor.\n\tb2Vec2 GetGroundAnchorA() const;\n\n\t/// Get the second ground anchor.\n\tb2Vec2 GetGroundAnchorB() const;\n\n\t/// Get the current length of the segment attached to bodyA.\n\tfloat32 GetLengthA() const;\n\n\t/// Get the current length of the segment attached to bodyB.\n\tfloat32 GetLengthB() const;\n\n\t/// Get the pulley ratio.\n\tfloat32 GetRatio() const;\n\n\t/// Get the current length of the segment attached to bodyA.\n\tfloat32 GetCurrentLengthA() const;\n\n\t/// Get the current length of the segment attached to bodyB.\n\tfloat32 GetCurrentLengthB() const;\n\n\t/// Dump joint to dmLog\n\tvoid Dump();\n\n\t/// Implement b2Joint::ShiftOrigin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin);\n\nprotected:\n\n\tfriend class b2Joint;\n\tb2PulleyJoint(const b2PulleyJointDef* data);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\tb2Vec2 m_groundAnchorA;\n\tb2Vec2 m_groundAnchorB;\n\tfloat32 m_lengthA;\n\tfloat32 m_lengthB;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tfloat32 m_constant;\n\tfloat32 m_ratio;\n\tfloat32 m_impulse;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_uA;\n\tb2Vec2 m_uB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat32 m_invMassA;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIA;\n\tfloat32 m_invIB;\n\tfloat32 m_mass;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_REVOLUTE_JOINT_H\n#define B2_REVOLUTE_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Revolute joint definition. This requires defining an\n/// anchor point where the bodies are joined. The definition\n/// uses local anchor points so that the initial configuration\n/// can violate the constraint slightly. You also need to\n/// specify the initial relative angle for joint limits. This\n/// helps when saving and loading a game.\n/// The local anchor points are measured from the body's origin\n/// rather than the center of mass because:\n/// 1. you might not know where the center of mass will be.\n/// 2. if you add/remove shapes from a body and recompute the mass,\n///    the joints will be broken.\nstruct b2RevoluteJointDef : public b2JointDef\n{\n\tb2RevoluteJointDef()\n\t{\n\t\ttype = e_revoluteJoint;\n\t\tlocalAnchorA.Set(0.0f, 0.0f);\n\t\tlocalAnchorB.Set(0.0f, 0.0f);\n\t\treferenceAngle = 0.0f;\n\t\tlowerAngle = 0.0f;\n\t\tupperAngle = 0.0f;\n\t\tmaxMotorTorque = 0.0f;\n\t\tmotorSpeed = 0.0f;\n\t\tenableLimit = false;\n\t\tenableMotor = false;\n\t}\n\n\t/// Initialize the bodies, anchors, and reference angle using a world\n\t/// anchor point.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The bodyB angle minus bodyA angle in the reference state (radians).\n\tfloat32 referenceAngle;\n\n\t/// A flag to enable joint limits.\n\tbool enableLimit;\n\n\t/// The lower angle for the joint limit (radians).\n\tfloat32 lowerAngle;\n\n\t/// The upper angle for the joint limit (radians).\n\tfloat32 upperAngle;\n\n\t/// A flag to enable the joint motor.\n\tbool enableMotor;\n\n\t/// The desired motor speed. Usually in radians per second.\n\tfloat32 motorSpeed;\n\n\t/// The maximum motor torque used to achieve the desired motor speed.\n\t/// Usually in N-m.\n\tfloat32 maxMotorTorque;\n};\n\n/// A revolute joint constrains two bodies to share a common point while they\n/// are free to rotate about the point. The relative rotation about the shared\n/// point is the joint angle. You can limit the relative rotation with\n/// a joint limit that specifies a lower and upper angle. You can use a motor\n/// to drive the relative rotation about the shared point. A maximum motor torque\n/// is provided so that infinite forces are not generated.\nclass b2RevoluteJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// Get the reference angle.\n\tfloat32 GetReferenceAngle() const { return m_referenceAngle; }\n\n\t/// Get the current joint angle in radians.\n\tfloat32 GetJointAngle() const;\n\n\t/// Get the current joint angle speed in radians per second.\n\tfloat32 GetJointSpeed() const;\n\n\t/// Is the joint limit enabled?\n\tbool IsLimitEnabled() const;\n\n\t/// Enable/disable the joint limit.\n\tvoid EnableLimit(bool flag);\n\n\t/// Get the lower joint limit in radians.\n\tfloat32 GetLowerLimit() const;\n\n\t/// Get the upper joint limit in radians.\n\tfloat32 GetUpperLimit() const;\n\n\t/// Set the joint limits in radians.\n\tvoid SetLimits(float32 lower, float32 upper);\n\n\t/// Is the joint motor enabled?\n\tbool IsMotorEnabled() const;\n\n\t/// Enable/disable the joint motor.\n\tvoid EnableMotor(bool flag);\n\n\t/// Set the motor speed in radians per second.\n\tvoid SetMotorSpeed(float32 speed);\n\n\t/// Get the motor speed in radians per second.\n\tfloat32 GetMotorSpeed() const;\n\n\t/// Set the maximum motor torque, usually in N-m.\n\tvoid SetMaxMotorTorque(float32 torque);\n\tfloat32 GetMaxMotorTorque() const { return m_maxMotorTorque; }\n\n\t/// Get the reaction force given the inverse time step.\n\t/// Unit is N.\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\n\t/// Get the reaction torque due to the joint limit given the inverse time step.\n\t/// Unit is N*m.\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// Get the current motor torque given the inverse time step.\n\t/// Unit is N*m.\n\tfloat32 GetMotorTorque(float32 inv_dt) const;\n\n\t/// Dump to b2Log.\n\tvoid Dump();\n\nprotected:\n\n\tfriend class b2Joint;\n\tfriend class b2GearJoint;\n\n\tb2RevoluteJoint(const b2RevoluteJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tb2Vec3 m_impulse;\n\tfloat32 m_motorImpulse;\n\n\tbool m_enableMotor;\n\tfloat32 m_maxMotorTorque;\n\tfloat32 m_motorSpeed;\n\n\tbool m_enableLimit;\n\tfloat32 m_referenceAngle;\n\tfloat32 m_lowerAngle;\n\tfloat32 m_upperAngle;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat32 m_invMassA;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIA;\n\tfloat32 m_invIB;\n\tb2Mat33 m_mass;\t\t\t// effective mass for point-to-point constraint.\n\tfloat32 m_motorMass;\t// effective mass for motor/limit angular constraint.\n\tb2LimitState m_limitState;\n};\n\ninline float32 b2RevoluteJoint::GetMotorSpeed() const\n{\n\treturn m_motorSpeed;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RopeJoint.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_ROPE_JOINT_H\n#define B2_ROPE_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Rope joint definition. This requires two body anchor points and\n/// a maximum lengths.\n/// Note: by default the connected objects will not collide.\n/// see collideConnected in b2JointDef.\nstruct b2RopeJointDef : public b2JointDef\n{\n\tb2RopeJointDef()\n\t{\n\t\ttype = e_ropeJoint;\n\t\tlocalAnchorA.Set(-1.0f, 0.0f);\n\t\tlocalAnchorB.Set(1.0f, 0.0f);\n\t\tmaxLength = 0.0f;\n\t}\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The maximum length of the rope.\n\t/// Warning: this must be larger than b2_linearSlop or\n\t/// the joint will have no effect.\n\tfloat32 maxLength;\n};\n\n/// A rope joint enforces a maximum distance between two points\n/// on two bodies. It has no other effect.\n/// Warning: if you attempt to change the maximum length during\n/// the simulation you will get some non-physical behavior.\n/// A model that would allow you to dynamically modify the length\n/// would have some sponginess, so I chose not to implement it\n/// that way. See b2DistanceJoint if you want to dynamically\n/// control length.\nclass b2RopeJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// Set/Get the maximum length of the rope.\n\tvoid SetMaxLength(float32 length) { m_maxLength = length; }\n\tfloat32 GetMaxLength() const;\n\n\tb2LimitState GetLimitState() const;\n\n\t/// Dump joint to dmLog\n\tvoid Dump();\n\nprotected:\n\n\tfriend class b2Joint;\n\tb2RopeJoint(const b2RopeJointDef* data);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tfloat32 m_maxLength;\n\tfloat32 m_length;\n\tfloat32 m_impulse;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_u;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat32 m_invMassA;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIA;\n\tfloat32 m_invIB;\n\tfloat32 m_mass;\n\tb2LimitState m_state;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WeldJoint.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_WELD_JOINT_H\n#define B2_WELD_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Weld joint definition. You need to specify local anchor points\n/// where they are attached and the relative body angle. The position\n/// of the anchor points is important for computing the reaction torque.\nstruct b2WeldJointDef : public b2JointDef\n{\n\tb2WeldJointDef()\n\t{\n\t\ttype = e_weldJoint;\n\t\tlocalAnchorA.Set(0.0f, 0.0f);\n\t\tlocalAnchorB.Set(0.0f, 0.0f);\n\t\treferenceAngle = 0.0f;\n\t\tfrequencyHz = 0.0f;\n\t\tdampingRatio = 0.0f;\n\t}\n\n\t/// Initialize the bodies, anchors, and reference angle using a world\n\t/// anchor point.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The bodyB angle minus bodyA angle in the reference state (radians).\n\tfloat32 referenceAngle;\n\n\t/// The mass-spring-damper frequency in Hertz. Rotation only.\n\t/// Disable softness with a value of 0.\n\tfloat32 frequencyHz;\n\n\t/// The damping ratio. 0 = no damping, 1 = critical damping.\n\tfloat32 dampingRatio;\n};\n\n/// A weld joint essentially glues two bodies together. A weld joint may\n/// distort somewhat because the island constraint solver is approximate.\nclass b2WeldJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// Get the reference angle.\n\tfloat32 GetReferenceAngle() const { return m_referenceAngle; }\n\n\t/// Set/get frequency in Hz.\n\tvoid SetFrequency(float32 hz) { m_frequencyHz = hz; }\n\tfloat32 GetFrequency() const { return m_frequencyHz; }\n\n\t/// Set/get damping ratio.\n\tvoid SetDampingRatio(float32 ratio) { m_dampingRatio = ratio; }\n\tfloat32 GetDampingRatio() const { return m_dampingRatio; }\n\n\t/// Dump to b2Log\n\tvoid Dump();\n\nprotected:\n\n\tfriend class b2Joint;\n\n\tb2WeldJoint(const b2WeldJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\tfloat32 m_frequencyHz;\n\tfloat32 m_dampingRatio;\n\tfloat32 m_bias;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tfloat32 m_referenceAngle;\n\tfloat32 m_gamma;\n\tb2Vec3 m_impulse;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat32 m_invMassA;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIA;\n\tfloat32 m_invIB;\n\tb2Mat33 m_mass;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WheelJoint.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_WHEEL_JOINT_H\n#define B2_WHEEL_JOINT_H\n\n#include \"b2Joint.h\"\n\n/// Wheel joint definition. This requires defining a line of\n/// motion using an axis and an anchor point. The definition uses local\n/// anchor points and a local axis so that the initial configuration\n/// can violate the constraint slightly. The joint translation is zero\n/// when the local anchor points coincide in world space. Using local\n/// anchors and a local axis helps when saving and loading a game.\nstruct b2WheelJointDef : public b2JointDef\n{\n\tb2WheelJointDef()\n\t{\n\t\ttype = e_wheelJoint;\n\t\tlocalAnchorA.SetZero();\n\t\tlocalAnchorB.SetZero();\n\t\tlocalAxisA.Set(1.0f, 0.0f);\n\t\tenableMotor = false;\n\t\tmaxMotorTorque = 0.0f;\n\t\tmotorSpeed = 0.0f;\n\t\tfrequencyHz = 2.0f;\n\t\tdampingRatio = 0.7f;\n\t}\n\n\t/// Initialize the bodies, anchors, axis, and reference angle using the world\n\t/// anchor and world axis.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The local translation axis in bodyA.\n\tb2Vec2 localAxisA;\n\n\t/// Enable/disable the joint motor.\n\tbool enableMotor;\n\n\t/// The maximum motor torque, usually in N-m.\n\tfloat32 maxMotorTorque;\n\n\t/// The desired motor speed in radians per second.\n\tfloat32 motorSpeed;\n\n\t/// Suspension frequency, zero indicates no suspension\n\tfloat32 frequencyHz;\n\n\t/// Suspension damping ratio, one indicates critical damping\n\tfloat32 dampingRatio;\n};\n\n/// A wheel joint. This joint provides two degrees of freedom: translation\n/// along an axis fixed in bodyA and rotation in the plane. You can use a\n/// joint limit to restrict the range of motion and a joint motor to drive\n/// the rotation or to model rotational friction.\n/// This joint is designed for vehicle suspensions.\nclass b2WheelJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const;\n\tb2Vec2 GetAnchorB() const;\n\n\tb2Vec2 GetReactionForce(float32 inv_dt) const;\n\tfloat32 GetReactionTorque(float32 inv_dt) const;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// The local joint axis relative to bodyA.\n\tconst b2Vec2& GetLocalAxisA() const { return m_localXAxisA; }\n\n\t/// Get the current joint translation, usually in meters.\n\tfloat32 GetJointTranslation() const;\n\n\t/// Get the current joint translation speed, usually in meters per second.\n\tfloat32 GetJointSpeed() const;\n\n\t/// Is the joint motor enabled?\n\tbool IsMotorEnabled() const;\n\n\t/// Enable/disable the joint motor.\n\tvoid EnableMotor(bool flag);\n\n\t/// Set the motor speed, usually in radians per second.\n\tvoid SetMotorSpeed(float32 speed);\n\n\t/// Get the motor speed, usually in radians per second.\n\tfloat32 GetMotorSpeed() const;\n\n\t/// Set/Get the maximum motor force, usually in N-m.\n\tvoid SetMaxMotorTorque(float32 torque);\n\tfloat32 GetMaxMotorTorque() const;\n\n\t/// Get the current motor torque given the inverse time step, usually in N-m.\n\tfloat32 GetMotorTorque(float32 inv_dt) const;\n\n\t/// Set/Get the spring frequency in hertz. Setting the frequency to zero disables the spring.\n\tvoid SetSpringFrequencyHz(float32 hz);\n\tfloat32 GetSpringFrequencyHz() const;\n\n\t/// Set/Get the spring damping ratio\n\tvoid SetSpringDampingRatio(float32 ratio);\n\tfloat32 GetSpringDampingRatio() const;\n\n\t/// Dump to b2Log\n\tvoid Dump();\n\nprotected:\n\n\tfriend class b2Joint;\n\tb2WheelJoint(const b2WheelJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data);\n\tvoid SolveVelocityConstraints(const b2SolverData& data);\n\tbool SolvePositionConstraints(const b2SolverData& data);\n\n\tfloat32 m_frequencyHz;\n\tfloat32 m_dampingRatio;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tb2Vec2 m_localXAxisA;\n\tb2Vec2 m_localYAxisA;\n\n\tfloat32 m_impulse;\n\tfloat32 m_motorImpulse;\n\tfloat32 m_springImpulse;\n\n\tfloat32 m_maxMotorTorque;\n\tfloat32 m_motorSpeed;\n\tbool m_enableMotor;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat32 m_invMassA;\n\tfloat32 m_invMassB;\n\tfloat32 m_invIA;\n\tfloat32 m_invIB;\n\n\tb2Vec2 m_ax, m_ay;\n\tfloat32 m_sAx, m_sBx;\n\tfloat32 m_sAy, m_sBy;\n\n\tfloat32 m_mass;\n\tfloat32 m_motorMass;\n\tfloat32 m_springMass;\n\n\tfloat32 m_bias;\n\tfloat32 m_gamma;\n};\n\ninline float32 b2WheelJoint::GetMotorSpeed() const\n{\n\treturn m_motorSpeed;\n}\n\ninline float32 b2WheelJoint::GetMaxMotorTorque() const\n{\n\treturn m_maxMotorTorque;\n}\n\ninline void b2WheelJoint::SetSpringFrequencyHz(float32 hz)\n{\n\tm_frequencyHz = hz;\n}\n\ninline float32 b2WheelJoint::GetSpringFrequencyHz() const\n{\n\treturn m_frequencyHz;\n}\n\ninline void b2WheelJoint::SetSpringDampingRatio(float32 ratio)\n{\n\tm_dampingRatio = ratio;\n}\n\ninline float32 b2WheelJoint::GetSpringDampingRatio() const\n{\n\treturn m_dampingRatio;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/b2Body.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_BODY_H\n#define B2_BODY_H\n\n#include \"../Common/b2Math.h\"\n#include \"../Collision/Shapes/b2Shape.h\"\n#include <memory>\n\nclass b2Fixture;\nclass b2Joint;\nclass b2Contact;\nclass b2Controller;\nclass b2World;\nstruct b2FixtureDef;\nstruct b2JointEdge;\nstruct b2ContactEdge;\n\n/// The body type.\n/// static: zero mass, zero velocity, may be manually moved\n/// kinematic: zero mass, non-zero velocity set by user, moved by solver\n/// dynamic: positive mass, non-zero velocity determined by forces, moved by solver\nenum b2BodyType\n{\n\tb2_staticBody = 0,\n\tb2_kinematicBody,\n\tb2_dynamicBody\n\n\t// TODO_ERIN\n\t//b2_bulletBody,\n};\n\n/// A body definition holds all the data needed to construct a rigid body.\n/// You can safely re-use body definitions. Shapes are added to a body after construction.\nstruct b2BodyDef\n{\n\t/// This constructor sets the body definition default values.\n\tb2BodyDef()\n\t{\n\t\tuserData = NULL;\n\t\tposition.Set(0.0f, 0.0f);\n\t\tangle = 0.0f;\n\t\tlinearVelocity.Set(0.0f, 0.0f);\n\t\tangularVelocity = 0.0f;\n\t\tlinearDamping = 0.0f;\n\t\tangularDamping = 0.0f;\n\t\tallowSleep = true;\n\t\tawake = true;\n\t\tfixedRotation = false;\n\t\tbullet = false;\n\t\ttype = b2_staticBody;\n\t\tactive = true;\n\t\tgravityScale = 1.0f;\n\t}\n\n\t/// The body type: static, kinematic, or dynamic.\n\t/// Note: if a dynamic body would have zero mass, the mass is set to one.\n\tb2BodyType type;\n\n\t/// The world position of the body. Avoid creating bodies at the origin\n\t/// since this can lead to many overlapping shapes.\n\tb2Vec2 position;\n\n\t/// The world angle of the body in radians.\n\tfloat32 angle;\n\n\t/// The linear velocity of the body's origin in world co-ordinates.\n\tb2Vec2 linearVelocity;\n\n\t/// The angular velocity of the body.\n\tfloat32 angularVelocity;\n\n\t/// Linear damping is use to reduce the linear velocity. The damping parameter\n\t/// can be larger than 1.0f but the damping effect becomes sensitive to the\n\t/// time step when the damping parameter is large.\n\tfloat32 linearDamping;\n\n\t/// Angular damping is use to reduce the angular velocity. The damping parameter\n\t/// can be larger than 1.0f but the damping effect becomes sensitive to the\n\t/// time step when the damping parameter is large.\n\tfloat32 angularDamping;\n\n\t/// Set this flag to false if this body should never fall asleep. Note that\n\t/// this increases CPU usage.\n\tbool allowSleep;\n\n\t/// Is this body initially awake or sleeping?\n\tbool awake;\n\n\t/// Should this body be prevented from rotating? Useful for characters.\n\tbool fixedRotation;\n\n\t/// Is this a fast moving body that should be prevented from tunneling through\n\t/// other moving bodies? Note that all bodies are prevented from tunneling through\n\t/// kinematic and static bodies. This setting is only considered on dynamic bodies.\n\t/// @warning You should use this flag sparingly since it increases processing time.\n\tbool bullet;\n\n\t/// Does this body start out active?\n\tbool active;\n\n\t/// Use this to store application specific body data.\n\tvoid* userData;\n\n\t/// Scale the gravity applied to this body.\n\tfloat32 gravityScale;\n};\n\n/// A rigid body. These are created via b2World::CreateBody.\nclass b2Body\n{\npublic:\n\t/// Creates a fixture and attach it to this body. Use this function if you need\n\t/// to set some fixture parameters, like friction. Otherwise you can create the\n\t/// fixture directly from a shape.\n\t/// If the density is non-zero, this function automatically updates the mass of the body.\n\t/// Contacts are not created until the next time step.\n\t/// @param def the fixture definition.\n\t/// @warning This function is locked during callbacks.\n\tb2Fixture* CreateFixture(const b2FixtureDef* def);\n\n\t/// Creates a fixture from a shape and attach it to this body.\n\t/// This is a convenience function. Use b2FixtureDef if you need to set parameters\n\t/// like friction, restitution, user data, or filtering.\n\t/// If the density is non-zero, this function automatically updates the mass of the body.\n\t/// @param shape the shape to be cloned.\n\t/// @param density the shape density (set to zero for static bodies).\n\t/// @warning This function is locked during callbacks.\n\tb2Fixture* CreateFixture(const b2Shape* shape, float32 density);\n\n\t/// Destroy a fixture. This removes the fixture from the broad-phase and\n\t/// destroys all contacts associated with this fixture. This will\n\t/// automatically adjust the mass of the body if the body is dynamic and the\n\t/// fixture has positive density.\n\t/// All fixtures attached to a body are implicitly destroyed when the body is destroyed.\n\t/// @param fixture the fixture to be removed.\n\t/// @warning This function is locked during callbacks.\n\tvoid DestroyFixture(b2Fixture* fixture);\n\n\t/// Set the position of the body's origin and rotation.\n\t/// Manipulating a body's transform may cause non-physical behavior.\n\t/// Note: contacts are updated on the next call to b2World::Step.\n\t/// @param position the world position of the body's local origin.\n\t/// @param angle the world rotation in radians.\n\tvoid SetTransform(const b2Vec2& position, float32 angle);\n\n\t/// Get the body transform for the body's origin.\n\t/// @return the world transform of the body's origin.\n\tconst b2Transform& GetTransform() const;\n\n\t/// Get the world body origin position.\n\t/// @return the world position of the body's origin.\n\tconst b2Vec2& GetPosition() const;\n\n\t/// Get the angle in radians.\n\t/// @return the current world rotation angle in radians.\n\tfloat32 GetAngle() const;\n\n\t/// Get the world position of the center of mass.\n\tconst b2Vec2& GetWorldCenter() const;\n\n\t/// Get the local position of the center of mass.\n\tconst b2Vec2& GetLocalCenter() const;\n\n\t/// Set the linear velocity of the center of mass.\n\t/// @param v the new linear velocity of the center of mass.\n\tvoid SetLinearVelocity(const b2Vec2& v);\n\n\t/// Get the linear velocity of the center of mass.\n\t/// @return the linear velocity of the center of mass.\n\tconst b2Vec2& GetLinearVelocity() const;\n\n\t/// Set the angular velocity.\n\t/// @param omega the new angular velocity in radians/second.\n\tvoid SetAngularVelocity(float32 omega);\n\n\t/// Get the angular velocity.\n\t/// @return the angular velocity in radians/second.\n\tfloat32 GetAngularVelocity() const;\n\n\t/// Apply a force at a world point. If the force is not\n\t/// applied at the center of mass, it will generate a torque and\n\t/// affect the angular velocity. This wakes up the body.\n\t/// @param force the world force vector, usually in Newtons (N).\n\t/// @param point the world position of the point of application.\n\t/// @param wake also wake up the body\n\tvoid ApplyForce(const b2Vec2& force, const b2Vec2& point, bool wake);\n\n\t/// Apply a force to the center of mass. This wakes up the body.\n\t/// @param force the world force vector, usually in Newtons (N).\n\t/// @param wake also wake up the body\n\tvoid ApplyForceToCenter(const b2Vec2& force, bool wake);\n\n\t/// Apply a torque. This affects the angular velocity\n\t/// without affecting the linear velocity of the center of mass.\n\t/// This wakes up the body.\n\t/// @param torque about the z-axis (out of the screen), usually in N-m.\n\t/// @param wake also wake up the body\n\tvoid ApplyTorque(float32 torque, bool wake);\n\n\t/// Apply an impulse at a point. This immediately modifies the velocity.\n\t/// It also modifies the angular velocity if the point of application\n\t/// is not at the center of mass. This wakes up the body.\n\t/// @param impulse the world impulse vector, usually in N-seconds or kg-m/s.\n\t/// @param point the world position of the point of application.\n\t/// @param wake also wake up the body\n\tvoid ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake);\n\n\t/// Apply an angular impulse.\n\t/// @param impulse the angular impulse in units of kg*m*m/s\n\t/// @param wake also wake up the body\n\tvoid ApplyAngularImpulse(float32 impulse, bool wake);\n\n\t/// Get the total mass of the body.\n\t/// @return the mass, usually in kilograms (kg).\n\tfloat32 GetMass() const;\n\n\t/// Get the rotational inertia of the body about the local origin.\n\t/// @return the rotational inertia, usually in kg-m^2.\n\tfloat32 GetInertia() const;\n\n\t/// Get the mass data of the body.\n\t/// @return a struct containing the mass, inertia and center of the body.\n\tvoid GetMassData(b2MassData* data) const;\n\n\t/// Set the mass properties to override the mass properties of the fixtures.\n\t/// Note that this changes the center of mass position.\n\t/// Note that creating or destroying fixtures can also alter the mass.\n\t/// This function has no effect if the body isn't dynamic.\n\t/// @param massData the mass properties.\n\tvoid SetMassData(const b2MassData* data);\n\n\t/// This resets the mass properties to the sum of the mass properties of the fixtures.\n\t/// This normally does not need to be called unless you called SetMassData to override\n\t/// the mass and you later want to reset the mass.\n\tvoid ResetMassData();\n\n\t/// Get the world coordinates of a point given the local coordinates.\n\t/// @param localPoint a point on the body measured relative the the body's origin.\n\t/// @return the same point expressed in world coordinates.\n\tb2Vec2 GetWorldPoint(const b2Vec2& localPoint) const;\n\n\t/// Get the world coordinates of a vector given the local coordinates.\n\t/// @param localVector a vector fixed in the body.\n\t/// @return the same vector expressed in world coordinates.\n\tb2Vec2 GetWorldVector(const b2Vec2& localVector) const;\n\n\t/// Gets a local point relative to the body's origin given a world point.\n\t/// @param a point in world coordinates.\n\t/// @return the corresponding local point relative to the body's origin.\n\tb2Vec2 GetLocalPoint(const b2Vec2& worldPoint) const;\n\n\t/// Gets a local vector given a world vector.\n\t/// @param a vector in world coordinates.\n\t/// @return the corresponding local vector.\n\tb2Vec2 GetLocalVector(const b2Vec2& worldVector) const;\n\n\t/// Get the world linear velocity of a world point attached to this body.\n\t/// @param a point in world coordinates.\n\t/// @return the world velocity of a point.\n\tb2Vec2 GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const;\n\n\t/// Get the world velocity of a local point.\n\t/// @param a point in local coordinates.\n\t/// @return the world velocity of a point.\n\tb2Vec2 GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const;\n\n\t/// Get the linear damping of the body.\n\tfloat32 GetLinearDamping() const;\n\n\t/// Set the linear damping of the body.\n\tvoid SetLinearDamping(float32 linearDamping);\n\n\t/// Get the angular damping of the body.\n\tfloat32 GetAngularDamping() const;\n\n\t/// Set the angular damping of the body.\n\tvoid SetAngularDamping(float32 angularDamping);\n\n\t/// Get the gravity scale of the body.\n\tfloat32 GetGravityScale() const;\n\n\t/// Set the gravity scale of the body.\n\tvoid SetGravityScale(float32 scale);\n\n\t/// Set the type of this body. This may alter the mass and velocity.\n\tvoid SetType(b2BodyType type);\n\n\t/// Get the type of this body.\n\tb2BodyType GetType() const;\n\n\t/// Should this body be treated like a bullet for continuous collision detection?\n\tvoid SetBullet(bool flag);\n\n\t/// Is this body treated like a bullet for continuous collision detection?\n\tbool IsBullet() const;\n\n\t/// You can disable sleeping on this body. If you disable sleeping, the\n\t/// body will be woken.\n\tvoid SetSleepingAllowed(bool flag);\n\n\t/// Is this body allowed to sleep\n\tbool IsSleepingAllowed() const;\n\n\t/// Set the sleep state of the body. A sleeping body has very\n\t/// low CPU cost.\n\t/// @param flag set to true to wake the body, false to put it to sleep.\n\tvoid SetAwake(bool flag);\n\n\t/// Get the sleeping state of this body.\n\t/// @return true if the body is awake.\n\tbool IsAwake() const;\n\n\t/// Set the active state of the body. An inactive body is not\n\t/// simulated and cannot be collided with or woken up.\n\t/// If you pass a flag of true, all fixtures will be added to the\n\t/// broad-phase.\n\t/// If you pass a flag of false, all fixtures will be removed from\n\t/// the broad-phase and all contacts will be destroyed.\n\t/// Fixtures and joints are otherwise unaffected. You may continue\n\t/// to create/destroy fixtures and joints on inactive bodies.\n\t/// Fixtures on an inactive body are implicitly inactive and will\n\t/// not participate in collisions, ray-casts, or queries.\n\t/// Joints connected to an inactive body are implicitly inactive.\n\t/// An inactive body is still owned by a b2World object and remains\n\t/// in the body list.\n\tvoid SetActive(bool flag);\n\n\t/// Get the active state of the body.\n\tbool IsActive() const;\n\n\t/// Set this body to have fixed rotation. This causes the mass\n\t/// to be reset.\n\tvoid SetFixedRotation(bool flag);\n\n\t/// Does this body have fixed rotation?\n\tbool IsFixedRotation() const;\n\n\t/// Get the list of all fixtures attached to this body.\n\tb2Fixture* GetFixtureList();\n\tconst b2Fixture* GetFixtureList() const;\n\n\t/// Get the list of all joints attached to this body.\n\tb2JointEdge* GetJointList();\n\tconst b2JointEdge* GetJointList() const;\n\n\t/// Get the list of all contacts attached to this body.\n\t/// @warning this list changes during the time step and you may\n\t/// miss some collisions if you don't use b2ContactListener.\n\tb2ContactEdge* GetContactList();\n\tconst b2ContactEdge* GetContactList() const;\n\n\t/// Get the next body in the world's body list.\n\tb2Body* GetNext();\n\tconst b2Body* GetNext() const;\n\n\t/// Get the user data pointer that was provided in the body definition.\n\tvoid* GetUserData() const;\n\n\t/// Set the user data. Use this to store your application specific data.\n\tvoid SetUserData(void* data);\n\n\t/// Get the parent world of this body.\n\tb2World* GetWorld();\n\tconst b2World* GetWorld() const;\n\n\t/// Dump this body to a log file\n\tvoid Dump();\n\nprivate:\n\n\tfriend class b2World;\n\tfriend class b2Island;\n\tfriend class b2ContactManager;\n\tfriend class b2ContactSolver;\n\tfriend class b2Contact;\n\n\tfriend class b2DistanceJoint;\n\tfriend class b2FrictionJoint;\n\tfriend class b2GearJoint;\n\tfriend class b2MotorJoint;\n\tfriend class b2MouseJoint;\n\tfriend class b2PrismaticJoint;\n\tfriend class b2PulleyJoint;\n\tfriend class b2RevoluteJoint;\n\tfriend class b2RopeJoint;\n\tfriend class b2WeldJoint;\n\tfriend class b2WheelJoint;\n\n\t// m_flags\n\tenum\n\t{\n\t\te_islandFlag\t\t= 0x0001,\n\t\te_awakeFlag\t\t\t= 0x0002,\n\t\te_autoSleepFlag\t\t= 0x0004,\n\t\te_bulletFlag\t\t= 0x0008,\n\t\te_fixedRotationFlag\t= 0x0010,\n\t\te_activeFlag\t\t= 0x0020,\n\t\te_toiFlag\t\t\t= 0x0040\n\t};\n\n\tb2Body(const b2BodyDef* bd, b2World* world);\n\t~b2Body();\n\n\tvoid SynchronizeFixtures();\n\tvoid SynchronizeTransform();\n\n\t// This is used to prevent connected bodies from colliding.\n\t// It may lie, depending on the collideConnected flag.\n\tbool ShouldCollide(const b2Body* other) const;\n\n\tvoid Advance(float32 t);\n\n\tb2BodyType m_type;\n\n\tuint16 m_flags;\n\n\tint32 m_islandIndex;\n\n\tb2Transform m_xf;\t\t// the body origin transform\n\tb2Sweep m_sweep;\t\t// the swept motion for CCD\n\n\tb2Vec2 m_linearVelocity;\n\tfloat32 m_angularVelocity;\n\n\tb2Vec2 m_force;\n\tfloat32 m_torque;\n\n\tb2World* m_world;\n\tb2Body* m_prev;\n\tb2Body* m_next;\n\n\tb2Fixture* m_fixtureList;\n\tint32 m_fixtureCount;\n\n\tb2JointEdge* m_jointList;\n\tb2ContactEdge* m_contactList;\n\n\tfloat32 m_mass, m_invMass;\n\n\t// Rotational inertia about the center of mass.\n\tfloat32 m_I, m_invI;\n\n\tfloat32 m_linearDamping;\n\tfloat32 m_angularDamping;\n\tfloat32 m_gravityScale;\n\n\tfloat32 m_sleepTime;\n\n\tvoid* m_userData;\n};\n\ninline b2BodyType b2Body::GetType() const\n{\n\treturn m_type;\n}\n\ninline const b2Transform& b2Body::GetTransform() const\n{\n\treturn m_xf;\n}\n\ninline const b2Vec2& b2Body::GetPosition() const\n{\n\treturn m_xf.p;\n}\n\ninline float32 b2Body::GetAngle() const\n{\n\treturn m_sweep.a;\n}\n\ninline const b2Vec2& b2Body::GetWorldCenter() const\n{\n\treturn m_sweep.c;\n}\n\ninline const b2Vec2& b2Body::GetLocalCenter() const\n{\n\treturn m_sweep.localCenter;\n}\n\ninline void b2Body::SetLinearVelocity(const b2Vec2& v)\n{\n\tif (m_type == b2_staticBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (b2Dot(v,v) > 0.0f)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\tm_linearVelocity = v;\n}\n\ninline const b2Vec2& b2Body::GetLinearVelocity() const\n{\n\treturn m_linearVelocity;\n}\n\ninline void b2Body::SetAngularVelocity(float32 w)\n{\n\tif (m_type == b2_staticBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (w * w > 0.0f)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\tm_angularVelocity = w;\n}\n\ninline float32 b2Body::GetAngularVelocity() const\n{\n\treturn m_angularVelocity;\n}\n\ninline float32 b2Body::GetMass() const\n{\n\treturn m_mass;\n}\n\ninline float32 b2Body::GetInertia() const\n{\n\treturn m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);\n}\n\ninline void b2Body::GetMassData(b2MassData* data) const\n{\n\tdata->mass = m_mass;\n\tdata->I = m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);\n\tdata->center = m_sweep.localCenter;\n}\n\ninline b2Vec2 b2Body::GetWorldPoint(const b2Vec2& localPoint) const\n{\n\treturn b2Mul(m_xf, localPoint);\n}\n\ninline b2Vec2 b2Body::GetWorldVector(const b2Vec2& localVector) const\n{\n\treturn b2Mul(m_xf.q, localVector);\n}\n\ninline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const\n{\n\treturn b2MulT(m_xf, worldPoint);\n}\n\ninline b2Vec2 b2Body::GetLocalVector(const b2Vec2& worldVector) const\n{\n\treturn b2MulT(m_xf.q, worldVector);\n}\n\ninline b2Vec2 b2Body::GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const\n{\n\treturn m_linearVelocity + b2Cross(m_angularVelocity, worldPoint - m_sweep.c);\n}\n\ninline b2Vec2 b2Body::GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const\n{\n\treturn GetLinearVelocityFromWorldPoint(GetWorldPoint(localPoint));\n}\n\ninline float32 b2Body::GetLinearDamping() const\n{\n\treturn m_linearDamping;\n}\n\ninline void b2Body::SetLinearDamping(float32 linearDamping)\n{\n\tm_linearDamping = linearDamping;\n}\n\ninline float32 b2Body::GetAngularDamping() const\n{\n\treturn m_angularDamping;\n}\n\ninline void b2Body::SetAngularDamping(float32 angularDamping)\n{\n\tm_angularDamping = angularDamping;\n}\n\ninline float32 b2Body::GetGravityScale() const\n{\n\treturn m_gravityScale;\n}\n\ninline void b2Body::SetGravityScale(float32 scale)\n{\n\tm_gravityScale = scale;\n}\n\ninline void b2Body::SetBullet(bool flag)\n{\n\tif (flag)\n\t{\n\t\tm_flags |= e_bulletFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_bulletFlag;\n\t}\n}\n\ninline bool b2Body::IsBullet() const\n{\n\treturn (m_flags & e_bulletFlag) == e_bulletFlag;\n}\n\ninline void b2Body::SetAwake(bool flag)\n{\n\tif (flag)\n\t{\n\t\tif ((m_flags & e_awakeFlag) == 0)\n\t\t{\n\t\t\tm_flags |= e_awakeFlag;\n\t\t\tm_sleepTime = 0.0f;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_awakeFlag;\n\t\tm_sleepTime = 0.0f;\n\t\tm_linearVelocity.SetZero();\n\t\tm_angularVelocity = 0.0f;\n\t\tm_force.SetZero();\n\t\tm_torque = 0.0f;\n\t}\n}\n\ninline bool b2Body::IsAwake() const\n{\n\treturn (m_flags & e_awakeFlag) == e_awakeFlag;\n}\n\ninline bool b2Body::IsActive() const\n{\n\treturn (m_flags & e_activeFlag) == e_activeFlag;\n}\n\ninline bool b2Body::IsFixedRotation() const\n{\n\treturn (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag;\n}\n\ninline void b2Body::SetSleepingAllowed(bool flag)\n{\n\tif (flag)\n\t{\n\t\tm_flags |= e_autoSleepFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_autoSleepFlag;\n\t\tSetAwake(true);\n\t}\n}\n\ninline bool b2Body::IsSleepingAllowed() const\n{\n\treturn (m_flags & e_autoSleepFlag) == e_autoSleepFlag;\n}\n\ninline b2Fixture* b2Body::GetFixtureList()\n{\n\treturn m_fixtureList;\n}\n\ninline const b2Fixture* b2Body::GetFixtureList() const\n{\n\treturn m_fixtureList;\n}\n\ninline b2JointEdge* b2Body::GetJointList()\n{\n\treturn m_jointList;\n}\n\ninline const b2JointEdge* b2Body::GetJointList() const\n{\n\treturn m_jointList;\n}\n\ninline b2ContactEdge* b2Body::GetContactList()\n{\n\treturn m_contactList;\n}\n\ninline const b2ContactEdge* b2Body::GetContactList() const\n{\n\treturn m_contactList;\n}\n\ninline b2Body* b2Body::GetNext()\n{\n\treturn m_next;\n}\n\ninline const b2Body* b2Body::GetNext() const\n{\n\treturn m_next;\n}\n\ninline void b2Body::SetUserData(void* data)\n{\n\tm_userData = data;\n}\n\ninline void* b2Body::GetUserData() const\n{\n\treturn m_userData;\n}\n\ninline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate a force if the body is sleeping.\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_force += force;\n\t\tm_torque += b2Cross(point - m_sweep.c, force);\n\t}\n}\n\ninline void b2Body::ApplyForceToCenter(const b2Vec2& force, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate a force if the body is sleeping\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_force += force;\n\t}\n}\n\ninline void b2Body::ApplyTorque(float32 torque, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate a force if the body is sleeping\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_torque += torque;\n\t}\n}\n\ninline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate velocity if the body is sleeping\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_linearVelocity += m_invMass * impulse;\n\t\tm_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse);\n\t}\n}\n\ninline void b2Body::ApplyAngularImpulse(float32 impulse, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate velocity if the body is sleeping\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_angularVelocity += m_invI * impulse;\n\t}\n}\n\ninline void b2Body::SynchronizeTransform()\n{\n\tm_xf.q.Set(m_sweep.a);\n\tm_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter);\n}\n\ninline void b2Body::Advance(float32 alpha)\n{\n\t// Advance to the new safe time. This doesn't sync the broad-phase.\n\tm_sweep.Advance(alpha);\n\tm_sweep.c = m_sweep.c0;\n\tm_sweep.a = m_sweep.a0;\n\tm_xf.q.Set(m_sweep.a);\n\tm_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter);\n}\n\ninline b2World* b2Body::GetWorld()\n{\n\treturn m_world;\n}\n\ninline const b2World* b2Body::GetWorld() const\n{\n\treturn m_world;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/b2ContactManager.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_CONTACT_MANAGER_H\n#define B2_CONTACT_MANAGER_H\n\n#include \"../Collision/b2BroadPhase.h\"\n\nclass b2Contact;\nclass b2ContactFilter;\nclass b2ContactListener;\nclass b2BlockAllocator;\n\n// Delegate of b2World.\nclass b2ContactManager\n{\npublic:\n\tb2ContactManager();\n\n\t// Broad-phase callback.\n\tvoid AddPair(void* proxyUserDataA, void* proxyUserDataB);\n\n\tvoid FindNewContacts();\n\n\tvoid Destroy(b2Contact* c);\n\n\tvoid Collide();\n\n\tb2BroadPhase m_broadPhase;\n\tb2Contact* m_contactList;\n\tint32 m_contactCount;\n\tb2ContactFilter* m_contactFilter;\n\tb2ContactListener* m_contactListener;\n\tb2BlockAllocator* m_allocator;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_FIXTURE_H\n#define B2_FIXTURE_H\n\n#include \"b2Body.h\"\n#include \"../Collision/b2Collision.h\"\n#include \"../Collision/Shapes/b2Shape.h\"\n\nclass b2BlockAllocator;\nclass b2Body;\nclass b2BroadPhase;\nclass b2Fixture;\n\n/// This holds contact filtering data.\nstruct b2Filter\n{\n\tb2Filter()\n\t{\n\t\tcategoryBits = 0x0001;\n\t\tmaskBits = 0xFFFF;\n\t\tgroupIndex = 0;\n\t}\n\n\t/// The collision category bits. Normally you would just set one bit.\n\tuint16 categoryBits;\n\n\t/// The collision mask bits. This states the categories that this\n\t/// shape would accept for collision.\n\tuint16 maskBits;\n\n\t/// Collision groups allow a certain group of objects to never collide (negative)\n\t/// or always collide (positive). Zero means no collision group. Non-zero group\n\t/// filtering always wins against the mask bits.\n\tint16 groupIndex;\n};\n\n/// A fixture definition is used to create a fixture. This class defines an\n/// abstract fixture definition. You can reuse fixture definitions safely.\nstruct b2FixtureDef\n{\n\t/// The constructor sets the default fixture definition values.\n\tb2FixtureDef()\n\t{\n\t\tshape = NULL;\n\t\tuserData = NULL;\n\t\tfriction = 0.2f;\n\t\trestitution = 0.0f;\n\t\tdensity = 0.0f;\n\t\tisSensor = false;\n\t}\n\n\t/// The shape, this must be set. The shape will be cloned, so you\n\t/// can create the shape on the stack.\n\tconst b2Shape* shape;\n\n\t/// Use this to store application specific fixture data.\n\tvoid* userData;\n\n\t/// The friction coefficient, usually in the range [0,1].\n\tfloat32 friction;\n\n\t/// The restitution (elasticity) usually in the range [0,1].\n\tfloat32 restitution;\n\n\t/// The density, usually in kg/m^2.\n\tfloat32 density;\n\n\t/// A sensor shape collects contact information but never generates a collision\n\t/// response.\n\tbool isSensor;\n\n\t/// Contact filtering data.\n\tb2Filter filter;\n};\n\n/// This proxy is used internally to connect fixtures to the broad-phase.\nstruct b2FixtureProxy\n{\n\tb2AABB aabb;\n\tb2Fixture* fixture;\n\tint32 childIndex;\n\tint32 proxyId;\n};\n\n/// A fixture is used to attach a shape to a body for collision detection. A fixture\n/// inherits its transform from its parent. Fixtures hold additional non-geometric data\n/// such as friction, collision filters, etc.\n/// Fixtures are created via b2Body::CreateFixture.\n/// @warning you cannot reuse fixtures.\nclass b2Fixture\n{\npublic:\n\t/// Get the type of the child shape. You can use this to down cast to the concrete shape.\n\t/// @return the shape type.\n\tb2Shape::Type GetType() const;\n\n\t/// Get the child shape. You can modify the child shape, however you should not change the\n\t/// number of vertices because this will crash some collision caching mechanisms.\n\t/// Manipulating the shape may lead to non-physical behavior.\n\tb2Shape* GetShape();\n\tconst b2Shape* GetShape() const;\n\n\t/// Set if this fixture is a sensor.\n\tvoid SetSensor(bool sensor);\n\n\t/// Is this fixture a sensor (non-solid)?\n\t/// @return the true if the shape is a sensor.\n\tbool IsSensor() const;\n\n\t/// Set the contact filtering data. This will not update contacts until the next time\n\t/// step when either parent body is active and awake.\n\t/// This automatically calls Refilter.\n\tvoid SetFilterData(const b2Filter& filter);\n\n\t/// Get the contact filtering data.\n\tconst b2Filter& GetFilterData() const;\n\n\t/// Call this if you want to establish collision that was previously disabled by b2ContactFilter::ShouldCollide.\n\tvoid Refilter();\n\n\t/// Get the parent body of this fixture. This is NULL if the fixture is not attached.\n\t/// @return the parent body.\n\tb2Body* GetBody();\n\tconst b2Body* GetBody() const;\n\n\t/// Get the next fixture in the parent body's fixture list.\n\t/// @return the next shape.\n\tb2Fixture* GetNext();\n\tconst b2Fixture* GetNext() const;\n\n\t/// Get the user data that was assigned in the fixture definition. Use this to\n\t/// store your application specific data.\n\tvoid* GetUserData() const;\n\n\t/// Set the user data. Use this to store your application specific data.\n\tvoid SetUserData(void* data);\n\n\t/// Test a point for containment in this fixture.\n\t/// @param p a point in world coordinates.\n\tbool TestPoint(const b2Vec2& p) const;\n\n\t/// Cast a ray against this shape.\n\t/// @param output the ray-cast results.\n\t/// @param input the ray-cast input parameters.\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const;\n\n\t/// Get the mass data for this fixture. The mass data is based on the density and\n\t/// the shape. The rotational inertia is about the shape's origin. This operation\n\t/// may be expensive.\n\tvoid GetMassData(b2MassData* massData) const;\n\n\t/// Set the density of this fixture. This will _not_ automatically adjust the mass\n\t/// of the body. You must call b2Body::ResetMassData to update the body's mass.\n\tvoid SetDensity(float32 density);\n\n\t/// Get the density of this fixture.\n\tfloat32 GetDensity() const;\n\n\t/// Get the coefficient of friction.\n\tfloat32 GetFriction() const;\n\n\t/// Set the coefficient of friction. This will _not_ change the friction of\n\t/// existing contacts.\n\tvoid SetFriction(float32 friction);\n\n\t/// Get the coefficient of restitution.\n\tfloat32 GetRestitution() const;\n\n\t/// Set the coefficient of restitution. This will _not_ change the restitution of\n\t/// existing contacts.\n\tvoid SetRestitution(float32 restitution);\n\n\t/// Get the fixture's AABB. This AABB may be enlarge and/or stale.\n\t/// If you need a more accurate AABB, compute it using the shape and\n\t/// the body transform.\n\tconst b2AABB& GetAABB(int32 childIndex) const;\n\n\t/// Dump this fixture to the log file.\n\tvoid Dump(int32 bodyIndex);\n\nprotected:\n\n\tfriend class b2Body;\n\tfriend class b2World;\n\tfriend class b2Contact;\n\tfriend class b2ContactManager;\n\n\tb2Fixture();\n\n\t// We need separation create/destroy functions from the constructor/destructor because\n\t// the destructor cannot access the allocator (no destructor arguments allowed by C++).\n\tvoid Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def);\n\tvoid Destroy(b2BlockAllocator* allocator);\n\n\t// These support body activation/deactivation.\n\tvoid CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf);\n\tvoid DestroyProxies(b2BroadPhase* broadPhase);\n\n\tvoid Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2);\n\n\tfloat32 m_density;\n\n\tb2Fixture* m_next;\n\tb2Body* m_body;\n\n\tb2Shape* m_shape;\n\n\tfloat32 m_friction;\n\tfloat32 m_restitution;\n\n\tb2FixtureProxy* m_proxies;\n\tint32 m_proxyCount;\n\n\tb2Filter m_filter;\n\n\tbool m_isSensor;\n\n\tvoid* m_userData;\n};\n\ninline b2Shape::Type b2Fixture::GetType() const\n{\n\treturn m_shape->GetType();\n}\n\ninline b2Shape* b2Fixture::GetShape()\n{\n\treturn m_shape;\n}\n\ninline const b2Shape* b2Fixture::GetShape() const\n{\n\treturn m_shape;\n}\n\ninline bool b2Fixture::IsSensor() const\n{\n\treturn m_isSensor;\n}\n\ninline const b2Filter& b2Fixture::GetFilterData() const\n{\n\treturn m_filter;\n}\n\ninline void* b2Fixture::GetUserData() const\n{\n\treturn m_userData;\n}\n\ninline void b2Fixture::SetUserData(void* data)\n{\n\tm_userData = data;\n}\n\ninline b2Body* b2Fixture::GetBody()\n{\n\treturn m_body;\n}\n\ninline const b2Body* b2Fixture::GetBody() const\n{\n\treturn m_body;\n}\n\ninline b2Fixture* b2Fixture::GetNext()\n{\n\treturn m_next;\n}\n\ninline const b2Fixture* b2Fixture::GetNext() const\n{\n\treturn m_next;\n}\n\ninline void b2Fixture::SetDensity(float32 density)\n{\n\tb2Assert(b2IsValid(density) && density >= 0.0f);\n\tm_density = density;\n}\n\ninline float32 b2Fixture::GetDensity() const\n{\n\treturn m_density;\n}\n\ninline float32 b2Fixture::GetFriction() const\n{\n\treturn m_friction;\n}\n\ninline void b2Fixture::SetFriction(float32 friction)\n{\n\tm_friction = friction;\n}\n\ninline float32 b2Fixture::GetRestitution() const\n{\n\treturn m_restitution;\n}\n\ninline void b2Fixture::SetRestitution(float32 restitution)\n{\n\tm_restitution = restitution;\n}\n\ninline bool b2Fixture::TestPoint(const b2Vec2& p) const\n{\n\treturn m_shape->TestPoint(m_body->GetTransform(), p);\n}\n\ninline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const\n{\n\treturn m_shape->RayCast(output, input, m_body->GetTransform(), childIndex);\n}\n\ninline void b2Fixture::GetMassData(b2MassData* massData) const\n{\n\tm_shape->ComputeMass(massData, m_density);\n}\n\ninline const b2AABB& b2Fixture::GetAABB(int32 childIndex) const\n{\n\tb2Assert(0 <= childIndex && childIndex < m_proxyCount);\n\treturn m_proxies[childIndex].aabb;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/b2Island.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_ISLAND_H\n#define B2_ISLAND_H\n\n#include \"../Common/b2Math.h\"\n#include \"b2Body.h\"\n#include \"b2TimeStep.h\"\n\nclass b2Contact;\nclass b2Joint;\nclass b2StackAllocator;\nclass b2ContactListener;\nstruct b2ContactVelocityConstraint;\nstruct b2Profile;\n\n/// This is an internal class.\nclass b2Island\n{\npublic:\n\tb2Island(int32 bodyCapacity, int32 contactCapacity, int32 jointCapacity,\n\t\t\tb2StackAllocator* allocator, b2ContactListener* listener);\n\t~b2Island();\n\n\tvoid Clear()\n\t{\n\t\tm_bodyCount = 0;\n\t\tm_contactCount = 0;\n\t\tm_jointCount = 0;\n\t}\n\n\tvoid Solve(b2Profile* profile, const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep);\n\n\tvoid SolveTOI(const b2TimeStep& subStep, int32 toiIndexA, int32 toiIndexB);\n\n\tvoid Add(b2Body* body)\n\t{\n\t\tb2Assert(m_bodyCount < m_bodyCapacity);\n\t\tbody->m_islandIndex = m_bodyCount;\n\t\tm_bodies[m_bodyCount] = body;\n\t\t++m_bodyCount;\n\t}\n\n\tvoid Add(b2Contact* contact)\n\t{\n\t\tb2Assert(m_contactCount < m_contactCapacity);\n\t\tm_contacts[m_contactCount++] = contact;\n\t}\n\n\tvoid Add(b2Joint* joint)\n\t{\n\t\tb2Assert(m_jointCount < m_jointCapacity);\n\t\tm_joints[m_jointCount++] = joint;\n\t}\n\n\tvoid Report(const b2ContactVelocityConstraint* constraints);\n\n\tb2StackAllocator* m_allocator;\n\tb2ContactListener* m_listener;\n\n\tb2Body** m_bodies;\n\tb2Contact** m_contacts;\n\tb2Joint** m_joints;\n\n\tb2Position* m_positions;\n\tb2Velocity* m_velocities;\n\n\tint32 m_bodyCount;\n\tint32 m_jointCount;\n\tint32 m_contactCount;\n\n\tint32 m_bodyCapacity;\n\tint32 m_contactCapacity;\n\tint32 m_jointCapacity;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_TIME_STEP_H\n#define B2_TIME_STEP_H\n\n#include \"../Common/b2Math.h\"\n\n/// Profiling data. Times are in milliseconds.\nstruct b2Profile\n{\n\tfloat32 step;\n\tfloat32 collide;\n\tfloat32 solve;\n\tfloat32 solveInit;\n\tfloat32 solveVelocity;\n\tfloat32 solvePosition;\n\tfloat32 broadphase;\n\tfloat32 solveTOI;\n};\n\n/// This is an internal structure.\nstruct b2TimeStep\n{\n\tfloat32 dt;\t\t\t// time step\n\tfloat32 inv_dt;\t\t// inverse time step (0 if dt == 0).\n\tfloat32 dtRatio;\t// dt * inv_dt0\n\tint32 velocityIterations;\n\tint32 positionIterations;\n\tbool warmStarting;\n};\n\n/// This is an internal structure.\nstruct b2Position\n{\n\tb2Vec2 c;\n\tfloat32 a;\n};\n\n/// This is an internal structure.\nstruct b2Velocity\n{\n\tb2Vec2 v;\n\tfloat32 w;\n};\n\n/// Solver Data\nstruct b2SolverData\n{\n\tb2TimeStep step;\n\tb2Position* positions;\n\tb2Velocity* velocities;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/b2World.h",
    "content": "/*\n* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_WORLD_H\n#define B2_WORLD_H\n\n#include \"../Common/b2Math.h\"\n#include \"../Common/b2BlockAllocator.h\"\n#include \"../Common/b2StackAllocator.h\"\n#include \"b2ContactManager.h\"\n#include \"b2WorldCallbacks.h\"\n#include \"b2TimeStep.h\"\n\nstruct b2AABB;\nstruct b2BodyDef;\nstruct b2Color;\nstruct b2JointDef;\nclass b2Body;\nclass b2Draw;\nclass b2Fixture;\nclass b2Joint;\n\n/// The world class manages all physics entities, dynamic simulation,\n/// and asynchronous queries. The world also contains efficient memory\n/// management facilities.\nclass b2World\n{\npublic:\n\t/// Construct a world object.\n\t/// @param gravity the world gravity vector.\n\tb2World(const b2Vec2& gravity);\n\n\t/// Destruct the world. All physics entities are destroyed and all heap memory is released.\n\t~b2World();\n\n\t/// Register a destruction listener. The listener is owned by you and must\n\t/// remain in scope.\n\tvoid SetDestructionListener(b2DestructionListener* listener);\n\n\t/// Register a contact filter to provide specific control over collision.\n\t/// Otherwise the default filter is used (b2_defaultFilter). The listener is\n\t/// owned by you and must remain in scope.\n\tvoid SetContactFilter(b2ContactFilter* filter);\n\n\t/// Register a contact event listener. The listener is owned by you and must\n\t/// remain in scope.\n\tvoid SetContactListener(b2ContactListener* listener);\n\n\t/// Register a routine for debug drawing. The debug draw functions are called\n\t/// inside with b2World::DrawDebugData method. The debug draw object is owned\n\t/// by you and must remain in scope.\n\tvoid SetDebugDraw(b2Draw* debugDraw);\n\n\t/// Create a rigid body given a definition. No reference to the definition\n\t/// is retained.\n\t/// @warning This function is locked during callbacks.\n\tb2Body* CreateBody(const b2BodyDef* def);\n\n\t/// Destroy a rigid body given a definition. No reference to the definition\n\t/// is retained. This function is locked during callbacks.\n\t/// @warning This automatically deletes all associated shapes and joints.\n\t/// @warning This function is locked during callbacks.\n\tvoid DestroyBody(b2Body* body);\n\n\t/// Create a joint to constrain bodies together. No reference to the definition\n\t/// is retained. This may cause the connected bodies to cease colliding.\n\t/// @warning This function is locked during callbacks.\n\tb2Joint* CreateJoint(const b2JointDef* def);\n\n\t/// Destroy a joint. This may cause the connected bodies to begin colliding.\n\t/// @warning This function is locked during callbacks.\n\tvoid DestroyJoint(b2Joint* joint);\n\n\t/// Take a time step. This performs collision detection, integration,\n\t/// and constraint solution.\n\t/// @param timeStep the amount of time to simulate, this should not vary.\n\t/// @param velocityIterations for the velocity constraint solver.\n\t/// @param positionIterations for the position constraint solver.\n\tvoid Step(\tfloat32 timeStep,\n\t\t\t\tint32 velocityIterations,\n\t\t\t\tint32 positionIterations);\n\n\t/// Manually clear the force buffer on all bodies. By default, forces are cleared automatically\n\t/// after each call to Step. The default behavior is modified by calling SetAutoClearForces.\n\t/// The purpose of this function is to support sub-stepping. Sub-stepping is often used to maintain\n\t/// a fixed sized time step under a variable frame-rate.\n\t/// When you perform sub-stepping you will disable auto clearing of forces and instead call\n\t/// ClearForces after all sub-steps are complete in one pass of your game loop.\n\t/// @see SetAutoClearForces\n\tvoid ClearForces();\n\n\t/// Call this to draw shapes and other debug draw data. This is intentionally non-const.\n\tvoid DrawDebugData();\n\n\t/// Query the world for all fixtures that potentially overlap the\n\t/// provided AABB.\n\t/// @param callback a user implemented callback class.\n\t/// @param aabb the query box.\n\tvoid QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const;\n\n\t/// Ray-cast the world for all fixtures in the path of the ray. Your callback\n\t/// controls whether you get the closest point, any point, or n-points.\n\t/// The ray-cast ignores shapes that contain the starting point.\n\t/// @param callback a user implemented callback class.\n\t/// @param point1 the ray starting point\n\t/// @param point2 the ray ending point\n\tvoid RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const;\n\n\t/// Get the world body list. With the returned body, use b2Body::GetNext to get\n\t/// the next body in the world list. A NULL body indicates the end of the list.\n\t/// @return the head of the world body list.\n\tb2Body* GetBodyList();\n\tconst b2Body* GetBodyList() const;\n\n\t/// Get the world joint list. With the returned joint, use b2Joint::GetNext to get\n\t/// the next joint in the world list. A NULL joint indicates the end of the list.\n\t/// @return the head of the world joint list.\n\tb2Joint* GetJointList();\n\tconst b2Joint* GetJointList() const;\n\n\t/// Get the world contact list. With the returned contact, use b2Contact::GetNext to get\n\t/// the next contact in the world list. A NULL contact indicates the end of the list.\n\t/// @return the head of the world contact list.\n\t/// @warning contacts are created and destroyed in the middle of a time step.\n\t/// Use b2ContactListener to avoid missing contacts.\n\tb2Contact* GetContactList();\n\tconst b2Contact* GetContactList() const;\n\n\t/// Enable/disable sleep.\n\tvoid SetAllowSleeping(bool flag);\n\tbool GetAllowSleeping() const { return m_allowSleep; }\n\n\t/// Enable/disable warm starting. For testing.\n\tvoid SetWarmStarting(bool flag) { m_warmStarting = flag; }\n\tbool GetWarmStarting() const { return m_warmStarting; }\n\n\t/// Enable/disable continuous physics. For testing.\n\tvoid SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; }\n\tbool GetContinuousPhysics() const { return m_continuousPhysics; }\n\n\t/// Enable/disable single stepped continuous physics. For testing.\n\tvoid SetSubStepping(bool flag) { m_subStepping = flag; }\n\tbool GetSubStepping() const { return m_subStepping; }\n\n\t/// Get the number of broad-phase proxies.\n\tint32 GetProxyCount() const;\n\n\t/// Get the number of bodies.\n\tint32 GetBodyCount() const;\n\n\t/// Get the number of joints.\n\tint32 GetJointCount() const;\n\n\t/// Get the number of contacts (each may have 0 or more contact points).\n\tint32 GetContactCount() const;\n\n\t/// Get the height of the dynamic tree.\n\tint32 GetTreeHeight() const;\n\n\t/// Get the balance of the dynamic tree.\n\tint32 GetTreeBalance() const;\n\n\t/// Get the quality metric of the dynamic tree. The smaller the better.\n\t/// The minimum is 1.\n\tfloat32 GetTreeQuality() const;\n\n\t/// Change the global gravity vector.\n\tvoid SetGravity(const b2Vec2& gravity);\n\n\t/// Get the global gravity vector.\n\tb2Vec2 GetGravity() const;\n\n\t/// Is the world locked (in the middle of a time step).\n\tbool IsLocked() const;\n\n\t/// Set flag to control automatic clearing of forces after each time step.\n\tvoid SetAutoClearForces(bool flag);\n\n\t/// Get the flag that controls automatic clearing of forces after each time step.\n\tbool GetAutoClearForces() const;\n\n\t/// Shift the world origin. Useful for large worlds.\n\t/// The body shift formula is: position -= newOrigin\n\t/// @param newOrigin the new origin with respect to the old origin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin);\n\n\t/// Get the contact manager for testing.\n\tconst b2ContactManager& GetContactManager() const;\n\n\t/// Get the current profile.\n\tconst b2Profile& GetProfile() const;\n\n\t/// Dump the world into the log file.\n\t/// @warning this should be called outside of a time step.\n\tvoid Dump();\n\nprivate:\n\n\t// m_flags\n\tenum\n\t{\n\t\te_newFixture\t= 0x0001,\n\t\te_locked\t\t= 0x0002,\n\t\te_clearForces\t= 0x0004\n\t};\n\n\tfriend class b2Body;\n\tfriend class b2Fixture;\n\tfriend class b2ContactManager;\n\tfriend class b2Controller;\n\n\tvoid Solve(const b2TimeStep& step);\n\tvoid SolveTOI(const b2TimeStep& step);\n\n\tvoid DrawJoint(b2Joint* joint);\n\tvoid DrawShape(b2Fixture* shape, const b2Transform& xf, const b2Color& color);\n\n\tb2BlockAllocator m_blockAllocator;\n\tb2StackAllocator m_stackAllocator;\n\n\tint32 m_flags;\n\n\tb2ContactManager m_contactManager;\n\n\tb2Body* m_bodyList;\n\tb2Joint* m_jointList;\n\n\tint32 m_bodyCount;\n\tint32 m_jointCount;\n\n\tb2Vec2 m_gravity;\n\tbool m_allowSleep;\n\n\tb2DestructionListener* m_destructionListener;\n\tb2Draw* m_debugDraw;\n\n\t// This is used to compute the time step ratio to\n\t// support a variable time step.\n\tfloat32 m_inv_dt0;\n\n\t// These are for debugging the solver.\n\tbool m_warmStarting;\n\tbool m_continuousPhysics;\n\tbool m_subStepping;\n\n\tbool m_stepComplete;\n\n\tb2Profile m_profile;\n};\n\ninline b2Body* b2World::GetBodyList()\n{\n\treturn m_bodyList;\n}\n\ninline const b2Body* b2World::GetBodyList() const\n{\n\treturn m_bodyList;\n}\n\ninline b2Joint* b2World::GetJointList()\n{\n\treturn m_jointList;\n}\n\ninline const b2Joint* b2World::GetJointList() const\n{\n\treturn m_jointList;\n}\n\ninline b2Contact* b2World::GetContactList()\n{\n\treturn m_contactManager.m_contactList;\n}\n\ninline const b2Contact* b2World::GetContactList() const\n{\n\treturn m_contactManager.m_contactList;\n}\n\ninline int32 b2World::GetBodyCount() const\n{\n\treturn m_bodyCount;\n}\n\ninline int32 b2World::GetJointCount() const\n{\n\treturn m_jointCount;\n}\n\ninline int32 b2World::GetContactCount() const\n{\n\treturn m_contactManager.m_contactCount;\n}\n\ninline void b2World::SetGravity(const b2Vec2& gravity)\n{\n\tm_gravity = gravity;\n}\n\ninline b2Vec2 b2World::GetGravity() const\n{\n\treturn m_gravity;\n}\n\ninline bool b2World::IsLocked() const\n{\n\treturn (m_flags & e_locked) == e_locked;\n}\n\ninline void b2World::SetAutoClearForces(bool flag)\n{\n\tif (flag)\n\t{\n\t\tm_flags |= e_clearForces;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_clearForces;\n\t}\n}\n\n/// Get the flag that controls automatic clearing of forces after each time step.\ninline bool b2World::GetAutoClearForces() const\n{\n\treturn (m_flags & e_clearForces) == e_clearForces;\n}\n\ninline const b2ContactManager& b2World::GetContactManager() const\n{\n\treturn m_contactManager;\n}\n\ninline const b2Profile& b2World::GetProfile() const\n{\n\treturn m_profile;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h",
    "content": "/*\n* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_WORLD_CALLBACKS_H\n#define B2_WORLD_CALLBACKS_H\n\n#include \"../Common/b2Settings.h\"\n\nstruct b2Vec2;\nstruct b2Transform;\nclass b2Fixture;\nclass b2Body;\nclass b2Joint;\nclass b2Contact;\nstruct b2ContactResult;\nstruct b2Manifold;\n\n/// Joints and fixtures are destroyed when their associated\n/// body is destroyed. Implement this listener so that you\n/// may nullify references to these joints and shapes.\nclass b2DestructionListener\n{\npublic:\n\tvirtual ~b2DestructionListener() {}\n\n\t/// Called when any joint is about to be destroyed due\n\t/// to the destruction of one of its attached bodies.\n\tvirtual void SayGoodbye(b2Joint* joint) = 0;\n\n\t/// Called when any fixture is about to be destroyed due\n\t/// to the destruction of its parent body.\n\tvirtual void SayGoodbye(b2Fixture* fixture) = 0;\n};\n\n/// Implement this class to provide collision filtering. In other words, you can implement\n/// this class if you want finer control over contact creation.\nclass b2ContactFilter\n{\npublic:\n\tvirtual ~b2ContactFilter() {}\n\n\t/// Return true if contact calculations should be performed between these two shapes.\n\t/// @warning for performance reasons this is only called when the AABBs begin to overlap.\n\tvirtual bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB);\n};\n\n/// Contact impulses for reporting. Impulses are used instead of forces because\n/// sub-step forces may approach infinity for rigid body collisions. These\n/// match up one-to-one with the contact points in b2Manifold.\nstruct b2ContactImpulse\n{\n\tfloat32 normalImpulses[b2_maxManifoldPoints];\n\tfloat32 tangentImpulses[b2_maxManifoldPoints];\n\tint32 count;\n};\n\n/// Implement this class to get contact information. You can use these results for\n/// things like sounds and game logic. You can also get contact results by\n/// traversing the contact lists after the time step. However, you might miss\n/// some contacts because continuous physics leads to sub-stepping.\n/// Additionally you may receive multiple callbacks for the same contact in a\n/// single time step.\n/// You should strive to make your callbacks efficient because there may be\n/// many callbacks per time step.\n/// @warning You cannot create/destroy Box2D entities inside these callbacks.\nclass b2ContactListener\n{\npublic:\n\tvirtual ~b2ContactListener() {}\n\n\t/// Called when two fixtures begin to touch.\n\tvirtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); }\n\n\t/// Called when two fixtures cease to touch.\n\tvirtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); }\n\n\t/// This is called after a contact is updated. This allows you to inspect a\n\t/// contact before it goes to the solver. If you are careful, you can modify the\n\t/// contact manifold (e.g. disable contact).\n\t/// A copy of the old manifold is provided so that you can detect changes.\n\t/// Note: this is called only for awake bodies.\n\t/// Note: this is called even when the number of contact points is zero.\n\t/// Note: this is not called for sensors.\n\t/// Note: if you set the number of contact points to zero, you will not\n\t/// get an EndContact callback. However, you may get a BeginContact callback\n\t/// the next step.\n\tvirtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold)\n\t{\n\t\tB2_NOT_USED(contact);\n\t\tB2_NOT_USED(oldManifold);\n\t}\n\n\t/// This lets you inspect a contact after the solver is finished. This is useful\n\t/// for inspecting impulses.\n\t/// Note: the contact manifold does not include time of impact impulses, which can be\n\t/// arbitrarily large if the sub-step is small. Hence the impulse is provided explicitly\n\t/// in a separate data structure.\n\t/// Note: this is only called for contacts that are touching, solid, and awake.\n\tvirtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse)\n\t{\n\t\tB2_NOT_USED(contact);\n\t\tB2_NOT_USED(impulse);\n\t}\n};\n\n/// Callback class for AABB queries.\n/// See b2World::Query\nclass b2QueryCallback\n{\npublic:\n\tvirtual ~b2QueryCallback() {}\n\n\t/// Called for each fixture found in the query AABB.\n\t/// @return false to terminate the query.\n\tvirtual bool ReportFixture(b2Fixture* fixture) = 0;\n};\n\n/// Callback class for ray casts.\n/// See b2World::RayCast\nclass b2RayCastCallback\n{\npublic:\n\tvirtual ~b2RayCastCallback() {}\n\n\t/// Called for each fixture found in the query. You control how the ray cast\n\t/// proceeds by returning a float:\n\t/// return -1: ignore this fixture and continue\n\t/// return 0: terminate the ray cast\n\t/// return fraction: clip the ray to this point\n\t/// return 1: don't clip the ray and continue\n\t/// @param fixture the fixture hit by the ray\n\t/// @param point the point of initial intersection\n\t/// @param normal the normal vector at the point of intersection\n\t/// @return -1 to filter, 0 to terminate, fraction to clip the ray for\n\t/// closest hit, 1 to continue\n\tvirtual float32 ReportFixture(\tb2Fixture* fixture, const b2Vec2& point,\n\t\t\t\t\t\t\t\t\tconst b2Vec2& normal, float32 fraction) = 0;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/Box2D/Rope/b2Rope.h",
    "content": "/*\n* Copyright (c) 2011 Erin Catto http://www.box2d.org\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* 1. The origin of this software must not be misrepresented; you must not\n* claim that you wrote the original software. If you use this software\n* in a product, an acknowledgment in the product documentation would be\n* appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n* misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef B2_ROPE_H\n#define B2_ROPE_H\n\n#include \"../Common/b2Math.h\"\n\nclass b2Draw;\n\n///\nstruct b2RopeDef\n{\n\tb2RopeDef()\n\t{\n\t\tvertices = NULL;\n\t\tcount = 0;\n\t\tmasses = NULL;\n\t\tgravity.SetZero();\n\t\tdamping = 0.1f;\n\t\tk2 = 0.9f;\n\t\tk3 = 0.1f;\n\t}\n\n\t///\n\tb2Vec2* vertices;\n\n\t///\n\tint32 count;\n\n\t///\n\tfloat32* masses;\n\n\t///\n\tb2Vec2 gravity;\n\n\t///\n\tfloat32 damping;\n\n\t/// Stretching stiffness\n\tfloat32 k2;\n\n\t/// Bending stiffness. Values above 0.5 can make the simulation blow up.\n\tfloat32 k3;\n};\n\n///\nclass b2Rope\n{\npublic:\n\tb2Rope();\n\t~b2Rope();\n\n\t///\n\tvoid Initialize(const b2RopeDef* def);\n\n\t///\n\tvoid Step(float32 timeStep, int32 iterations);\n\n\t///\n\tint32 GetVertexCount() const\n\t{\n\t\treturn m_count;\n\t}\n\n\t///\n\tconst b2Vec2* GetVertices() const\n\t{\n\t\treturn m_ps;\n\t}\n\n\t///\n\tvoid Draw(b2Draw* draw) const;\n\n\t///\n\tvoid SetAngle(float32 angle);\n\nprivate:\n\n\tvoid SolveC2();\n\tvoid SolveC3();\n\n\tint32 m_count;\n\tb2Vec2* m_ps;\n\tb2Vec2* m_p0s;\n\tb2Vec2* m_vs;\n\n\tfloat32* m_ims;\n\n\tfloat32* m_Ls;\n\tfloat32* m_as;\n\n\tb2Vec2 m_gravity;\n\tfloat32 m_damping;\n\n\tfloat32 m_k2;\n\tfloat32 m_k3;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Config.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016 - 2020\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n//check which platform we're on and create export macros as necessary\n#if !defined(TMXLITE_STATIC)\n\n#if defined(_WIN32)\n\n//windows compilers need specific (and different) keywords for export\n#define TMXLITE_EXPORT_API __declspec(dllexport)\n\n//for vc compilers we also need to turn off this annoying C4251 warning\n#ifdef _MSC_VER\n#pragma warning(disable: 4251)\n#endif //_MSC_VER\n\n#else //linux, FreeBSD, Mac OS X\n\n#if __GNUC__ >= 4\n\n//gcc 4 has special keywords for showing/hiding symbols,\n//the same keyword is used for both importing and exporting\n#define TMXLITE_EXPORT_API __attribute__ ((__visibility__ (\"default\")))\n\n#else\n\n//gcc < 4 has no mechanism to explicitly hide symbols, everything's exported\n#define TMXLITE_EXPORT_API\n#endif //__GNUC__\n\n#endif //_WIN32\n\n#else\n\n//static build doesn't need import/export macros\n#define TMXLITE_EXPORT_API\n\n#endif //TMXLITE_STATIC"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/FreeFuncs.cpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#include \"FreeFuncs.hpp\"\n#include \"detail/Log.hpp\"\n#include \"miniz.h\"\n\n#include <cstring>\n\nbool tmx::decompress(const char* source, std::vector<unsigned char>& dest, std::size_t inSize, std::size_t expectedSize)\n{\n    if (!source)\n    {\n        LOG(\"Input string is empty, decompression failed.\", Logger::Type::Error);\n        return false;\n    }\n\n    int currentSize = static_cast<int>(expectedSize);\n    std::vector<unsigned char> byteArray(expectedSize / sizeof(unsigned char));\n    z_stream stream;\n    stream.zalloc = Z_NULL;\n    stream.zfree = Z_NULL;\n    stream.opaque = Z_NULL;\n    stream.next_in = (Bytef*)source;\n    stream.avail_in = static_cast<unsigned int>(inSize);\n    stream.next_out = (Bytef*)byteArray.data();\n    stream.avail_out = static_cast<unsigned int>(expectedSize);\n\n    //we'd prefer to use inflateInit2 but it appears\n    //to be incorrect in miniz. This is fine for zlib\n    //compressed data, but gzip compressed streams\n    //will fail to inflate. IMO still preferable to\n    //trying to build/link zlib\n    if (inflateInit(&stream/*, 15 + 32*/) != Z_OK)\n    {\n        LOG(\"inflate init failed\", Logger::Type::Error);\n        return false;\n    }\n\n    int result = 0;\n    do\n    {\n        result = inflate(&stream, Z_SYNC_FLUSH);\n\n        switch (result)\n        {\n        case Z_NEED_DICT:\n        case Z_STREAM_ERROR:\n            result = Z_DATA_ERROR;\n        case Z_DATA_ERROR:\n            Logger::log(\"If using gzip compression try using zlib instead\", Logger::Type::Info);\n        case Z_MEM_ERROR:\n            inflateEnd(&stream);\n            Logger::log(std::to_string(result), Logger::Type::Error);\n            return false;\n        }\n\n        if (result != Z_STREAM_END)\n        {\n            int oldSize = currentSize;\n            currentSize *= 2;\n            std::vector<unsigned char> newArray(currentSize / sizeof(unsigned char));\n            std::memcpy(newArray.data(), byteArray.data(), currentSize / 2);\n            byteArray = std::move(newArray);\n\n            stream.next_out = (Bytef*)(byteArray.data() + oldSize);\n            stream.avail_out = oldSize;\n\n        }\n    } while (result != Z_STREAM_END);\n\n    if (stream.avail_in != 0)\n    {\n        LOG(\"stream.avail_in is 0\", Logger::Type::Error);\n        LOG(\"zlib decompression failed.\", Logger::Type::Error);\n        return false;\n    }\n\n    const int outSize = currentSize - stream.avail_out;\n    inflateEnd(&stream);\n\n    std::vector<unsigned char> newArray(outSize / sizeof(unsigned char));\n    std::memcpy(newArray.data(), byteArray.data(), outSize);\n    byteArray = std::move(newArray);\n\n    //copy bytes to vector\n    dest.insert(dest.begin(), byteArray.begin(), byteArray.end());\n\n    return true;\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/FreeFuncs.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n/*********************************************************************\nbase64_decode\n\nCopyright (C) 2004-2008 René Nyffenegger\nThis source code is provided 'as-is', without any express or implied\nwarranty. In no event will the author be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this source code must not be misrepresented; you must not\nclaim that you wrote the original source code. If you use this source code\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original source code.\n3. This notice may not be removed or altered from any source distribution.\n\nRené Nyffenegger rene.nyffenegger@adp-gmbh.ch\n*********************************************************************/\n\n#pragma once\n\n#include \"detail/Android.hpp\"\n#include \"detail/Log.hpp\"\n#include \"Types.hpp\"\n\n#include <string>\n#include <sstream>\n#include <vector>\n#include <functional>\n#include <algorithm>\n\nnamespace tmx\n{\n    //using inline here just to supress unused warnings on gcc\n    bool decompress(const char* source, std::vector<unsigned char>& dest, std::size_t inSize, std::size_t expectedSize);\n\n    static inline std::string base64_decode(std::string const& encoded_string)\n    {\n        static const std::string base64_chars =\n            \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n            \"abcdefghijklmnopqrstuvwxyz\"\n            \"0123456789+/\";\n\n        std::function<bool(unsigned char)> is_base64 =\n            [](unsigned char c)->bool\n        {\n            return (isalnum(c) || (c == '+') || (c == '/'));\n        };\n\n        auto in_len = encoded_string.size();\n        int i = 0;\n        int j = 0;\n        int in_ = 0;\n        unsigned char char_array_4[4], char_array_3[3];\n        std::string ret;\n\n        while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_]))\n        {\n            char_array_4[i++] = encoded_string[in_]; in_++;\n            if (i == 4)\n            {\n                for (i = 0; i < 4; i++)\n                {\n                    char_array_4[i] = static_cast<unsigned char>(base64_chars.find(char_array_4[i]));\n                }\n                char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);\n                char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);\n                char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];\n\n                for (i = 0; (i < 3); i++)\n                {\n                    ret += char_array_3[i];\n                }\n                i = 0;\n            }\n        }\n\n        if (i)\n        {\n            for (j = i; j < 4; j++)\n            {\n                char_array_4[j] = 0;\n            }\n\n            for (j = 0; j < 4; j++)\n            {\n                char_array_4[j] = static_cast<unsigned char>(base64_chars.find(char_array_4[j]));\n            }\n\n            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);\n            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);\n            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];\n\n            for (j = 0; (j < i - 1); j++)\n            {\n                ret += char_array_3[j];\n            }\n        }\n\n        return ret;\n    }\n\n    static inline Colour colourFromString(std::string str)\n    {\n        //removes preceding #\n        auto result = str.find_last_of('#');\n        if (result != std::string::npos)\n        {\n            str = str.substr(result + 1);\n        }\n\n        if (str.size() == 6 || str.size() == 8)\n        {\n            unsigned int value, r, g, b;\n            unsigned int a = 255;\n            std::stringstream input(str);\n            input >> std::hex >> value;\n\n            r = (value >> 16) & 0xff;\n            g = (value >> 8) & 0xff;\n            b = value & 0xff;\n\n            if (str.size() == 8)\n            {\n                a = (value >> 24) & 0xff;\n            }\n\n            return{ std::uint8_t(r), std::uint8_t(g), std::uint8_t(b), std::uint8_t(a) };\n        }\n        Logger::log(str + \": not a valid colour string\", Logger::Type::Error);\n        return{};\n    }\n\n    static inline std::string resolveFilePath(std::string path, const std::string& workingDir)\n    {\n        static const std::string match(\"../\");\n        std::size_t result = path.find(match);\n        std::size_t count = 0;\n        while (result != std::string::npos)\n        {\n            count++;\n            path = path.substr(result + match.size());\n            result = path.find(match);\n        }\n\n        if (workingDir.empty()) return path;\n\n        std::string outPath = workingDir;\n        for (auto i = 0u; i < count; ++i)\n        {\n            result = outPath.find_last_of('/');\n            if (result != std::string::npos)\n            {\n                outPath = outPath.substr(0, result);\n            }\n        }\n// this does only work on windows\n#ifndef __ANDROID__\n        return std::move(outPath += '/' + path);\n#endif\n\n// todo: make resolveFilePath work with subfolders on\n// android - currently only the root folder is working\n\n#ifdef __ANDROID__\n\t\treturn std::move(outPath = path);\n#endif\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/ImageLayer.cpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#include \"ImageLayer.hpp\"\n#include \"FreeFuncs.hpp\"\n#include \"detail/pugixml.hpp\"\n#include \"detail/Log.hpp\"\n\nusing namespace tmx;\n\nImageLayer::ImageLayer(const std::string& workingDir)\n    : m_workingDir      (workingDir),\n    m_hasTransparency   (false)\n{\n\n}\n\n//public\nvoid ImageLayer::parse(const pugi::xml_node& node, Map*)\n{\n    std::string attribName = node.name();\n    if (attribName != \"imagelayer\")\n    {\n        Logger::log(\"Node not an image layer, node skipped\", Logger::Type::Error);\n        return;\n    }\n\n    setName(node.attribute(\"name\").as_string());\n    setOpacity(node.attribute(\"opacity\").as_float(1.f));\n    setVisible(node.attribute(\"visible\").as_bool(true));\n    setOffset(node.attribute(\"offsetx\").as_int(), node.attribute(\"offsety\").as_int());\n    setSize(node.attribute(\"width\").as_uint(), node.attribute(\"height\").as_uint());\n\n    for (const auto& child : node.children())\n    {\n        attribName = child.name();\n        if (attribName == \"image\")\n        {\n            attribName = child.attribute(\"source\").as_string();\n            if (attribName.empty())\n            {\n                Logger::log(\"Image Layer has missing source property\", Logger::Type::Warning);\n                return;\n            }\n\n            if (child.attribute(\"width\") &&  child.attribute(\"height\"))\n            {\n            \tm_imageSize.x = child.attribute(\"width\").as_uint();\n            \tm_imageSize.y = child.attribute(\"height\").as_uint();\n            }\n\n            m_filePath = resolveFilePath(attribName, m_workingDir);\n            if (child.attribute(\"trans\"))\n            {\n                attribName = child.attribute(\"trans\").as_string();\n                m_transparencyColour = colourFromString(attribName);\n                m_hasTransparency = true;\n            }\n        }\n        else if (attribName == \"properties\")\n        {\n            for (const auto& p : child.children())\n            {\n                addProperty(p);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/ImageLayer.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016 - 2019\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Config.hpp\"\n#include \"Layer.hpp\"\n#include \"Types.hpp\"\n\nnamespace tmx\n{\n    /*!\n    \\brief Image layers contain a single image which make up that\n    layer. The parser contains the fully resolved path to the image\n    relative to the working directory.\n    */\n    class TMXLITE_EXPORT_API ImageLayer final : public Layer\n    {\n    public:\n        explicit ImageLayer(const std::string&);\n        ~ImageLayer() = default;\n\n        Type getType() const override { return Layer::Type::Image; }\n        void parse(const pugi::xml_node&, Map*) override;\n\n        /*!\n        \\brief Returns the path, relative to the working directory,\n        of the image used by the image layer.\n        */\n        const std::string& getImagePath() const { return m_filePath; }\n        /*!\n        \\brief Returns the colour used by the image to represent transparent\n        pixels. By default this is (0, 0, 0, 0)\n        */\n        const Colour& getTransparencyColour() const { return m_transparencyColour; }\n        /*!\n        \\brief Returns true if the image used by this layer specifically states a\n        colour to use as transparency\n        */\n        bool hasTransparency() const { return m_hasTransparency; }\n        /*!\n        \\brief Returns the size of the image of the image layer in pixels.\n        */\n        const Vector2u& getImageSize() const { return m_imageSize; }\n\n    private:\n        std::string m_workingDir;\n        std::string m_filePath;\n        Colour m_transparencyColour;\n        bool m_hasTransparency;\n        Vector2u m_imageSize;\n    };\n\n    template <>\n    inline ImageLayer& Layer::getLayerAs<ImageLayer>()\n    {\n        assert(getType() == Type::Image);\n        return *dynamic_cast<ImageLayer*>(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Layer.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016 - 2019\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Config.hpp\"\n#include \"Property.hpp\"\n#include \"Types.hpp\"\n\n#include <string>\n#include <memory>\n#include <vector>\n\nnamespace pugi\n{\n    class xml_node;\n}\n\nnamespace tmx\n{\n    class Map;\n    class TileLayer;\n    class ObjectGroup;\n    class ImageLayer;\n    class LayerGroup;\n    /*!\n    \\brief Represents a layer of a tmx format tile map.\n    This is an abstract base class from which all layer\n    types are derived.\n    */\n    class TMXLITE_EXPORT_API Layer\n    {\n    public:\n        using Ptr = std::unique_ptr<Layer>;\n\n        Layer() : m_opacity(1.f), m_visible(true) {};\n        virtual ~Layer() = default;\n\n        /*!\n        \\brief Layer type as returned by getType()\n        Tile: this layer is a TileLayer type\n        Object: This layer is an ObjectGroup type\n        Image: This layer is an ImageLayer type\n        Group: This layer is a LayerGroup type\n        */\n        enum class Type\n        {\n            Tile,\n            Object,\n            Image,\n            Group\n        };\n\n        /*!\n        \\brief Returns a Type value representing the concrete type.\n        Use this when deciding which conrete layer type to use when\n        calling the templated function getLayerAs<T>()\n        */\n        virtual Type getType() const = 0;\n\n        /*!\n        \\brief Use this to get a reference to the concrete layer type\n        which this layer points to.\n        Use getType() to return the type value of this layer and determine\n        if the concrete type is TileLayer, ObjectGroup, ImageLayer, or LayerGroup\n        */\n        template <typename T>\n        T& getLayerAs();\n        /*{\n            throw(\"Not a valid layer type\");\n            return *dynamic_cast<T*>(this);\n        }*/\n\n        template <typename T>\n        const T& getLayerAs() const { return getLayerAs<T>(); }\n\n        /*!\n        \\brief Attempts to parse the specific node layer type\n        */\n        virtual void parse(const pugi::xml_node&, Map* = nullptr) = 0;\n\n        /*!\n        \\brief Returns the name of the layer\n        */\n        const std::string& getName() const { return m_name; }\n\n        /*!\n        \\brief Returns the opacity value for the layer\n        */\n        float getOpacity() const { return m_opacity; }\n\n        /*!\n        \\brief Returns whether this layer is visible or not\n        */\n        bool getVisible() const { return m_visible; }\n\n        /*!\n        \\brief Returns the offset from the top left corner\n        of the layer, in pixels\n        */\n        const Vector2i& getOffset() const { return m_offset; }\n\n        /*!\n        \\brief Returns the size of the layer, in pixels.\n        This will be the same as the map size for fixed size maps.\n        */\n        const Vector2u& getSize() const { return m_size; }\n\n        /*!\n        \\brief Returns the list of properties of this layer\n        */\n        const std::vector<Property>& getProperties() const { return m_properties; }\n\n    protected:\n\n        void setName(const std::string& name) { m_name = name; }\n        void setOpacity(float opacity) { m_opacity = opacity; }\n        void setVisible(bool visible) { m_visible = visible; }\n        void setOffset(std::int32_t x, std::int32_t y) { m_offset = Vector2i(x, y); }\n        void setSize(std::uint32_t width, std::uint32_t height) { m_size = Vector2u(width, height); }\n        void addProperty(const pugi::xml_node& node) { m_properties.emplace_back(); m_properties.back().parse(node); }\n\n    private:\n        std::string m_name;\n        float m_opacity;\n        bool m_visible;\n        Vector2i m_offset;\n        Vector2u m_size;\n\n        std::vector<Property> m_properties;\n    };\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/LayerGroup.cpp",
    "content": "/*********************************************************************\nGrant Gangi 2019\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#include \"detail/pugixml.hpp\"\n#include \"LayerGroup.hpp\"\n#include \"FreeFuncs.hpp\"\n#include \"ObjectGroup.hpp\"\n#include \"ImageLayer.hpp\"\n#include \"TileLayer.hpp\"\n#include \"detail/Log.hpp\"\n\nusing namespace tmx;\n\nLayerGroup::LayerGroup(const std::string& workingDir, const Vector2u& tileCount)\n    : m_workingDir(workingDir),\n    m_tileCount(tileCount)\n{\n}\n\n//public\nvoid LayerGroup::parse(const pugi::xml_node& node, Map* map)\n{\n    assert(map);\n    std::string attribString = node.name();\n    if (attribString != \"group\")\n    {\n        Logger::log(\"Node was not a group layer, node will be skipped.\", Logger::Type::Error);\n        return;\n    }\n\n    setName(node.attribute(\"name\").as_string());\n    setOpacity(node.attribute(\"opacity\").as_float(1.f));\n    setVisible(node.attribute(\"visible\").as_bool(true));\n    setOffset(node.attribute(\"offsetx\").as_int(), node.attribute(\"offsety\").as_int());\n    setSize(node.attribute(\"width\").as_uint(), node.attribute(\"height\").as_uint());\n\n    // parse children\n    for (const auto& child : node.children())\n    {\n        attribString = child.name();\n        if (attribString == \"properties\")\n        {\n            for (const auto& p : child.children())\n            {\n                addProperty(p);\n            }\n        }\n        else if (attribString == \"layer\")\n        {\n            m_layers.emplace_back(std::make_unique<TileLayer>(m_tileCount.x * m_tileCount.y));\n            m_layers.back()->parse(child, map);\n        }\n        else if (attribString == \"objectgroup\")\n        {\n            m_layers.emplace_back(std::make_unique<ObjectGroup>());\n            m_layers.back()->parse(child, map);\n        }\n        else if (attribString == \"imagelayer\")\n        {\n            m_layers.emplace_back(std::make_unique<ImageLayer>(m_workingDir));\n            m_layers.back()->parse(child, map);\n        }\n        else if (attribString == \"group\")\n        {\n            m_layers.emplace_back(std::make_unique<LayerGroup>(m_workingDir, m_tileCount));\n            m_layers.back()->parse(child, map);\n        }\n        else\n        {\n            LOG(\"Unidentified name \" + attribString + \": node skipped\", Logger::Type::Warning);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/LayerGroup.hpp",
    "content": "/*********************************************************************\nGrant Gangi 2019\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Config.hpp\"\n#include \"Layer.hpp\"\n#include \"Types.hpp\"\n\n#include <vector>\n\nnamespace tmx\n{\n    /*!\n    \\brief Layer groups are used to organize the layers of\n    the map in a hierarchy. They can contain all other layer\n    types including more layer groups to further nest layers.\n    */\n    class TMXLITE_EXPORT_API LayerGroup final : public Layer\n    {\n    public:\n\n        LayerGroup(const std::string& workDir, const Vector2u& tileCount);\n        ~LayerGroup() = default;\n        LayerGroup(const LayerGroup&) = delete;\n        const LayerGroup& operator = (const LayerGroup&) = delete;\n        LayerGroup(LayerGroup&&) = default;\n        LayerGroup& operator = (LayerGroup&&) = default;\n\n\n        Type getType() const override { return Layer::Type::Group; }\n        void parse(const pugi::xml_node&, Map*) override;\n\n        /*!\n        \\brief Returns a reference to the vector containing the layer data.\n        Layers are pointer-to-baseclass, the concrete type of which can be\n        found via Layer::getType()\n        \\see Layer\n        */\n        const std::vector<Layer::Ptr>& getLayers() const { return m_layers; }\n\n    private:\n\n        std::vector<Layer::Ptr> m_layers;\n\n        std::string m_workingDir;\n        Vector2u m_tileCount;\n    };\n\n    template <>\n    inline LayerGroup& Layer::getLayerAs<LayerGroup>()\n    {\n        assert(getType() == Type::Group);\n        return *dynamic_cast<LayerGroup*>(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Map.cpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n\n#include \"detail/pugixml.hpp\"\n#include \"Map.hpp\"\n#include \"FreeFuncs.hpp\"\n#include \"ObjectGroup.hpp\"\n#include \"ImageLayer.hpp\"\n#include \"TileLayer.hpp\"\n#include \"LayerGroup.hpp\"\n#include \"detail/Log.hpp\"\n#include \"detail/Android.hpp\"\n\n#include <queue>\n\nusing namespace tmx;\n\nnamespace\n{\n    std::string getFilePath(const std::string& path)\n    {\n        //TODO this doesn't actually check that there is a file at the\n        //end of the path, or that it's even a valid path...\n\n        static auto searchFunc = [](const char separator, const std::string& path)->std::string\n        {\n            std::size_t i = path.rfind(separator, path.length());\n            if (i != std::string::npos)\n            {\n                return(path.substr(0, i + 1));\n            }\n\n            return \"\";\n        };\n\n\n#ifdef _WIN32 //try windows formatted paths first\n        std::string retVal = searchFunc('\\\\', path);\n        if (!retVal.empty()) return retVal;\n#endif\n\n        return searchFunc('/', path);\n    }\n}\n\nMap::Map()\n    : m_orientation (Orientation::None),\n    m_renderOrder   (RenderOrder::None),\n    m_infinite      (false),\n    m_hexSideLength (0.f),\n    m_staggerAxis   (StaggerAxis::None),\n    m_staggerIndex  (StaggerIndex::None)\n{\n\n}\n\n//public\nbool Map::load(const std::string& path)\n{\n    reset();\n\n    //open the doc\n    pugi::xml_document doc;\n    auto result = doc.load_file(path.c_str());\n    if (!result)\n    {\n        Logger::log(\"Failed opening \" + path, Logger::Type::Error);\n        Logger::log(\"Reason: \" + std::string(result.description()), Logger::Type::Error);\n        return false;\n    }\n\n    //make sure we have consistent path separators\n    m_workingDirectory = path;\n    std::replace(m_workingDirectory.begin(), m_workingDirectory.end(), '\\\\', '/');\n    m_workingDirectory = getFilePath(m_workingDirectory);\n\n    if (!m_workingDirectory.empty() &&\n        m_workingDirectory.back() == '/')\n    {\n        m_workingDirectory.pop_back();\n    }\n\n\n    //find the map node and bail if it doesn't exist\n    auto mapNode = doc.child(\"map\");\n    if (!mapNode)\n    {\n        Logger::log(\"Failed opening map: \" + path + \", no map node found\", Logger::Type::Error);\n        return reset();\n    }\n\n    return parseMapNode(mapNode);\n}\n\nbool Map::loadFromString(const std::string& data, const std::string& workingDir)\n{\n    reset();\n\n    //open the doc\n    pugi::xml_document doc;\n    auto result = doc.load_string(data.c_str());\n    if (!result)\n    {\n        Logger::log(\"Failed opening map\", Logger::Type::Error);\n        Logger::log(\"Reason: \" + std::string(result.description()), Logger::Type::Error);\n        return false;\n    }\n\n    //make sure we have consistent path separators\n    m_workingDirectory = workingDir;\n    std::replace(m_workingDirectory.begin(), m_workingDirectory.end(), '\\\\', '/');\n    m_workingDirectory = getFilePath(m_workingDirectory);\n\n    if (!m_workingDirectory.empty() &&\n        m_workingDirectory.back() == '/')\n    {\n        m_workingDirectory.pop_back();\n    }\n\n    //find the map node and bail if it doesn't exist\n    auto mapNode = doc.child(\"map\");\n    if (!mapNode)\n    {\n        Logger::log(\"Failed opening map: no map node found\", Logger::Type::Error);\n        return reset();\n    }\n\n    return parseMapNode(mapNode);\n}\n\n//private\nbool Map::parseMapNode(const pugi::xml_node& mapNode)\n{\n    //parse map attributes\n    std::size_t pointPos = 0;\n    std::string attribString = mapNode.attribute(\"version\").as_string();\n    if (attribString.empty() || (pointPos = attribString.find('.')) == std::string::npos)\n    {\n        Logger::log(\"Invalid map version value, map not loaded.\", Logger::Type::Error);\n        return reset();\n    }\n\n    m_version.upper = STOI(attribString.substr(0, pointPos));\n    m_version.lower = STOI(attribString.substr(pointPos + 1));\n\n    attribString = mapNode.attribute(\"orientation\").as_string();\n    if (attribString.empty())\n    {\n        Logger::log(\"Missing map orientation attribute, map not loaded.\", Logger::Type::Error);\n        return reset();\n    }\n\n    if (attribString == \"orthogonal\")\n    {\n        m_orientation = Orientation::Orthogonal;\n    }\n    else if (attribString == \"isometric\")\n    {\n        m_orientation = Orientation::Isometric;\n    }\n    else if (attribString == \"staggered\")\n    {\n        m_orientation = Orientation::Staggered;\n    }\n    else if (attribString == \"hexagonal\")\n    {\n        m_orientation = Orientation::Hexagonal;\n    }\n    else\n    {\n        Logger::log(attribString + \" format maps aren't supported yet, sorry! Map not loaded\", Logger::Type::Error);\n        return reset();\n    }\n\n    attribString = mapNode.attribute(\"renderorder\").as_string();\n    //this property is optional for older version of map files\n    if (!attribString.empty())\n    {\n        if (attribString == \"right-down\")\n        {\n            m_renderOrder = RenderOrder::RightDown;\n        }\n        else if (attribString == \"right-up\")\n        {\n            m_renderOrder = RenderOrder::RightUp;\n        }\n        else if (attribString == \"left-down\")\n        {\n            m_renderOrder = RenderOrder::LeftDown;\n        }\n        else if (attribString == \"left-up\")\n        {\n            m_renderOrder = RenderOrder::LeftUp;\n        }\n        else\n        {\n            Logger::log(attribString + \": invalid render order. Map not loaded.\", Logger::Type::Error);\n            return reset();\n        }\n    }\n\n    if (mapNode.attribute(\"infinite\"))\n    {\n        m_infinite = mapNode.attribute(\"infinite\").as_int() != 0;\n    }\n\n    unsigned width = mapNode.attribute(\"width\").as_int();\n    unsigned height = mapNode.attribute(\"height\").as_int();\n    if (width && height)\n    {\n        m_tileCount = { width, height };\n    }\n    else\n    {\n        Logger::log(\"Invalid map tile count, map not loaded\", Logger::Type::Error);\n        return reset();\n    }\n\n    width = mapNode.attribute(\"tilewidth\").as_int();\n    height = mapNode.attribute(\"tileheight\").as_int();\n    if (width && height)\n    {\n        m_tileSize = { width, height };\n    }\n    else\n    {\n        Logger::log(\"Invalid tile size, map not loaded\", Logger::Type::Error);\n        return reset();\n    }\n\n    m_hexSideLength = mapNode.attribute(\"hexsidelength\").as_float();\n    if (m_orientation == Orientation::Hexagonal && m_hexSideLength <= 0)\n    {\n        Logger::log(\"Invalid he side length found, map not loaded\", Logger::Type::Error);\n        return reset();\n    }\n\n    attribString = mapNode.attribute(\"staggeraxis\").as_string();\n    if (attribString == \"x\")\n    {\n        m_staggerAxis = StaggerAxis::X;\n    }\n    else if (attribString == \"y\")\n    {\n        m_staggerAxis = StaggerAxis::Y;\n    }\n    if ((m_orientation == Orientation::Staggered || m_orientation == Orientation::Hexagonal)\n        && m_staggerAxis == StaggerAxis::None)\n    {\n        Logger::log(\"Map missing stagger axis property. Map not loaded.\", Logger::Type::Error);\n        return reset();\n    }\n\n    attribString = mapNode.attribute(\"staggerindex\").as_string();\n    if (attribString == \"odd\")\n    {\n        m_staggerIndex = StaggerIndex::Odd;\n    }\n    else if (attribString == \"even\")\n    {\n        m_staggerIndex = StaggerIndex::Even;\n    }\n    if ((m_orientation == Orientation::Staggered || m_orientation == Orientation::Hexagonal)\n        && m_staggerIndex == StaggerIndex::None)\n    {\n        Logger::log(\"Map missing stagger index property. Map not loaded.\", Logger::Type::Error);\n        return reset();\n    }\n\n\n    //colour property is optional\n    attribString = mapNode.attribute(\"backgroundcolor\").as_string();\n    if (!attribString.empty())\n    {\n        m_backgroundColour = colourFromString(attribString);\n    }\n\n    //TODO do we need next object ID? technically we won't be creating\n    //new objects outside of the scene in xygine.\n\n    //parse all child nodes\n    for (const auto& node : mapNode.children())\n    {\n        std::string name = node.name();\n        if (name == \"tileset\")\n        {\n            m_tilesets.emplace_back(m_workingDirectory);\n            m_tilesets.back().parse(node, this);\n        }\n        else if (name == \"layer\")\n        {\n            m_layers.emplace_back(std::make_unique<TileLayer>(m_tileCount.x * m_tileCount.y));\n            m_layers.back()->parse(node);\n        }\n        else if (name == \"objectgroup\")\n        {\n            m_layers.emplace_back(std::make_unique<ObjectGroup>());\n            m_layers.back()->parse(node, this);\n        }\n        else if (name == \"imagelayer\")\n        {\n            m_layers.emplace_back(std::make_unique<ImageLayer>(m_workingDirectory));\n            m_layers.back()->parse(node, this);\n        }\n        else if (name == \"properties\")\n        {\n            const auto& children = node.children();\n            for (const auto& child : children)\n            {\n                m_properties.emplace_back();\n                m_properties.back().parse(child);\n            }\n        }\n        else if (name == \"group\")\n        {\n            m_layers.emplace_back(std::make_unique<LayerGroup>(m_workingDirectory, m_tileCount));\n            m_layers.back()->parse(node, this);\n        }\n        else\n        {\n            LOG(\"Unidentified name \" + name + \": node skipped\", Logger::Type::Warning);\n        }\n    }\n    // fill animated tiles for easier lookup into map\n    for(const auto& ts : m_tilesets)\n    {\n        for(const auto& tile : ts.getTiles())\n        {\n            if (!tile.animation.frames.empty())\n            {\n                m_animTiles[tile.ID + ts.getFirstGID()] = tile;\n            }\n        }\n    }\n\n    return true;\n}\n\nbool Map::reset()\n{\n    m_orientation = Orientation::None;\n    m_renderOrder = RenderOrder::None;\n    m_tileCount = { 0u, 0u };\n    m_tileSize = { 0u, 0u };\n    m_hexSideLength = 0.f;\n    m_staggerAxis = StaggerAxis::None;\n    m_staggerIndex = StaggerIndex::None;\n    m_backgroundColour = {};\n    m_workingDirectory = \"\";\n\n    m_tilesets.clear();\n    m_layers.clear();\n    m_properties.clear();\n\n    m_templateObjects.clear();\n    m_templateTilesets.clear();\n\n    return false;\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Map.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Tileset.hpp\"\n#include \"Layer.hpp\"\n#include \"Property.hpp\"\n#include \"Types.hpp\"\n#include \"Object.hpp\"\n\n#include <string>\n#include <vector>\n#include <map>\n#include <unordered_map>\n\nnamespace tmx\n{\n    /*!\n    \\brief Holds the xml version of the loaded map\n    */\n    struct TMXLITE_EXPORT_API Version\n    {\n        //major/minor are apparently reserved by gcc\n        std::uint16_t upper;\n        std::uint16_t lower;\n        Version(std::uint16_t maj = 0, std::uint16_t min = 0)\n            : upper(maj), lower(min) {}\n    };\n\n    enum class Orientation\n    {\n        Orthogonal,\n        Isometric,\n        Staggered,\n        Hexagonal,\n        None\n    };\n\n    enum class RenderOrder\n    {\n        RightDown,\n        RightUp,\n        LeftDown,\n        LeftUp,\n        None\n    };\n\n    enum class StaggerAxis\n    {\n        X, Y, None\n    };\n\n    enum class StaggerIndex\n    {\n        Even, Odd, None\n    };\n\n    /*!\n    \\brief Parser for TMX format tile maps.\n    This class can be used to parse the XML format tile maps created\n    with the Tiled map editor, providing an interface to create drawable and\n    physics objects. Typical usage would be to create an instance of this\n    class before calling load() providing a path to the *.tmx file to be\n    loaded. Then layers or objects can be requested from the Map class\n    to be interpreted as needed.\n    */\n    class TMXLITE_EXPORT_API Map final\n    {\n    public:\n\n        Map();\n        ~Map() = default;\n        Map(const Map&) = delete;\n        Map& operator  = (const Map&) = delete;\n        Map(Map&&) = default;\n        Map& operator = (Map&&) = default;\n\n        /*!\n        \\brief Attempts to parse the tilemap at the given location.\n        \\param std::string Path to map file to try to parse\n        \\returns true if map was parsed successfully else returns false.\n        In debug mode this will attempt to log any errors to the console.\n        */\n        bool load(const std::string&);\n\n        /*!\n        \\brief Loads a map from a document stored in a string\n        \\param data A std::string containing the map data to load\n        \\param workingDir A std::string containing the working directory\n        in which to find assets such as tile sets or images\n        \\returns true if successful, else false\n        */\n        bool loadFromString(const std::string& data, const std::string& workingDir);\n\n        /*!\n        \\brief Returns the version of the tile map last parsed.\n        If no tile map has yet been parsed the version will read 0, 0\n        */\n        const Version& getVersion() const { return m_version; }\n        /*!\n        \\brief Returns the orientation of the map if one is loaded,\n        else returns None\n        */\n        Orientation getOrientation() const { return m_orientation; }\n        /*!\n        \\brief Returns the RenderOrder of the map if one is loaded,\n        else returns None\n        */\n        RenderOrder getRenderOrder() const { return m_renderOrder; }\n        /*!\n        \\brief Returns the tile count of the map in the X and Y directions\n        */\n        const Vector2u& getTileCount() const { return m_tileCount; }\n        /*!\n        \\brief Returns the size of the tile grid in this map.\n        Actual tile sizes may vary and will be extended / shrunk about\n        the bottom left corner of the tile.\n        */\n        const Vector2u& getTileSize() const { return m_tileSize; }\n        /*!\n        \\brief Returns the bounds of the map\n        */\n        FloatRect getBounds() const { return FloatRect(0.f, 0.f, static_cast<float>(m_tileCount.x * m_tileSize.x), static_cast<float>(m_tileCount.y * m_tileSize.y)); }\n        /*!\n        \\brief Returns the length of an edge of a tile if a Hexagonal\n        map is loaded.\n        The length returned is in pixels of the straight edge running\n        along the axis returned by getStaggerAxis(). If no map is loaded\n        or the loaded map is not of Hexagonal orientation this function\n        returns 0.f\n        */\n        float getHexSideLength() const { return m_hexSideLength; }\n        /*!\n        \\brief Stagger axis of the map.\n        If either a Staggered or Hexagonal tile map is loaded this returns\n        which axis the map is staggered along, else returns None.\n        */\n        StaggerAxis getStaggerAxis() const { return m_staggerAxis; }\n        /*!\n        \\brief Stagger Index of the loaded map.\n        If a Staggered or Hexagonal map is loaded this returns whether\n        the even or odd rows of tiles are staggered, otherwise it returns None.\n        */\n        StaggerIndex getStaggerIndex() const { return m_staggerIndex; }\n        /*!\n        \\brief Returns the background colour of the map.\n        */\n        const Colour& getBackgroundColour() const { return m_backgroundColour; }\n        /*!\n        \\brief Returns a reference to the vector of tile sets used by the map\n        */\n        const std::vector<Tileset>& getTilesets() const { return m_tilesets; }\n        /*!\n        \\brief Returns a reference to the vector containing the layer data.\n        Layers are pointer-to-baseclass, the concrete type of which can be\n        found via Layer::getType()\n        \\see Layer\n        */\n        const std::vector<Layer::Ptr>& getLayers() const { return m_layers; }\n        /*!\n        \\brief Returns a vector of Property objects loaded by the map\n        */\n        const std::vector<Property>& getProperties() const { return m_properties; }\n        /*!\n        \\brief Returns a Hashmap of all animated tiles accessible by TileID\n        */\n        const std::map<std::uint32_t, Tileset::Tile>& getAnimatedTiles() const { return m_animTiles; }\n\n        /*!\n        \\brief Returns the current working directory of the map. Images and\n        other resources are loaded relative to this.\n        */\n        const std::string& getWorkingDirectory() const { return m_workingDirectory; }\n\n        /*!\n        \\brief Returns an unordered_map of template objects indexed by file name\n        */\n        std::unordered_map<std::string, Object>& getTemplateObjects() { return m_templateObjects; }\n        const std::unordered_map<std::string, Object>& getTemplateObjects() const { return m_templateObjects; }\n\n        /*!\n        \\brief Returns an unordered_map of tilesets used by templated objects.\n        If Object::getTilesetName() is not empty it can be used to retreive a tileset\n        from this map. Otherwise the object's tileset can be found from in the map's\n        global tilesets returned by getTilesets().\n        */\n        std::unordered_map<std::string, Tileset>& getTemplateTilesets() { return m_templateTilesets; }\n        const std::unordered_map<std::string, Tileset>& getTemplateTilesets() const { return m_templateTilesets; }\n\n        /*!\n        \\brief Returns true if this is in infinite tile map.\n        Infinite maps store their tile data in for tile layers in chunks. If\n        this is an infinite map use TileLayer::getChunks() to get tile IDs\n        rather than TileLayer::getTiles().\n        \\see TileLayer\n        */\n        bool isInfinite() const { return m_infinite; }\n\n\n    private:\n        Version m_version;\n        Orientation m_orientation;\n        RenderOrder m_renderOrder;\n        bool m_infinite;\n\n        Vector2u m_tileCount;\n        Vector2u m_tileSize;\n\n        float m_hexSideLength;\n        StaggerAxis m_staggerAxis;\n        StaggerIndex m_staggerIndex;\n\n        Colour m_backgroundColour;\n\n        std::string m_workingDirectory;\n\n        std::vector<Tileset> m_tilesets;\n        std::vector<Layer::Ptr> m_layers;\n        std::vector<Property> m_properties;\n        std::map<std::uint32_t, Tileset::Tile> m_animTiles;\n\n        std::unordered_map<std::string, Object> m_templateObjects;\n        std::unordered_map<std::string, Tileset> m_templateTilesets;\n\n        bool parseMapNode(const pugi::xml_node&);\n\n        //always returns false so we can return this\n        //on load failure\n        bool reset();\n    };\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Object.cpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#include \"Object.hpp\"\n#include \"FreeFuncs.hpp\"\n#include \"Map.hpp\"\n#include \"Tileset.hpp\"\n#include \"detail/pugixml.hpp\"\n#include \"detail/Log.hpp\"\n\n#include <sstream>\n\nusing namespace tmx;\n\nObject::Object()\n    : m_UID     (0),\n    m_rotation  (0.f),\n    m_tileID    (0),\n    m_visible   (true),\n    m_shape     (Shape::Rectangle)\n{\n\n}\n\n//public\nvoid Object::parse(const pugi::xml_node& node, Map* map)\n{\n    std::string attribString = node.name();\n    if (attribString != \"object\")\n    {\n        Logger::log(\"This not an Object node, parsing skipped.\", Logger::Type::Error);\n        return;\n    }\n\n    m_UID = node.attribute(\"id\").as_int();\n    m_name = node.attribute(\"name\").as_string();\n    m_type = node.attribute(\"type\").as_string();\n    m_position.x = node.attribute(\"x\").as_float();\n    m_AABB.left = m_position.x;\n    m_position.y = node.attribute(\"y\").as_float();\n    m_AABB.top = m_position.y;\n    m_AABB.width = node.attribute(\"width\").as_float();\n    m_AABB.height = node.attribute(\"height\").as_float();\n    m_rotation = node.attribute(\"rotation\").as_float();\n    m_tileID = node.attribute(\"gid\").as_uint();\n    m_visible = node.attribute(\"visible\").as_bool(true);\n\n    for (const auto& child : node.children())\n    {\n        attribString = child.name();\n        if (attribString == \"properties\")\n        {\n            for (const auto& p : child.children())\n            {\n                m_properties.emplace_back();\n                m_properties.back().parse(p);\n            }\n        }\n        else if (attribString == \"ellipse\")\n        {\n            m_shape = Shape::Ellipse;\n        }\n        else if (attribString == \"point\")\n        {\n            m_shape = Shape::Point;\n        }\n        else if (attribString == \"polygon\")\n        {\n            m_shape = Shape::Polygon;\n            parsePoints(child);\n        }\n        else if (attribString == \"polyline\")\n        {\n            m_shape = Shape::Polyline;\n            parsePoints(child);\n        }\n        else if (attribString == \"text\")\n        {\n            m_shape = Shape::Text;\n            parseText(child);\n        }\n    }\n\n    //parse templates last so we know which properties\n    //ought to be overridden\n    std::string templateStr = node.attribute(\"template\").as_string();\n    if (!templateStr.empty() && map)\n    {\n        parseTemplate(templateStr, map);\n    }\n}\n\n//private\nvoid Object::parsePoints(const pugi::xml_node& node)\n{\n    if (node.attribute(\"points\"))\n    {\n        std::string pointlist = node.attribute(\"points\").as_string();\n        std::stringstream stream(pointlist);\n        std::vector<std::string> points;\n        std::string pointstring;\n        while (std::getline(stream, pointstring, ' '))\n        {\n            points.push_back(pointstring);\n        }\n\n        //parse each pair into sf::vector2f\n        for (unsigned int i = 0; i < points.size(); i++)\n        {\n            std::vector<float> coords;\n            std::stringstream coordstream(points[i]);\n\n            float j;\n            while (coordstream >> j)\n            {\n                coords.push_back(j);\n                //TODO this should really ignore anything non-numeric\n                if (coordstream.peek() == ',')\n                {\n                    coordstream.ignore();\n                }\n            }\n            m_points.emplace_back(coords[0], coords[1]);\n        }\n    }\n    else\n    {\n        Logger::log(\"Points for polygon or polyline object are missing\", Logger::Type::Warning);\n    }\n}\n\nvoid Object::parseText(const pugi::xml_node& node)\n{\n    m_textData.bold = node.attribute(\"bold\").as_bool(false);\n    m_textData.colour = colourFromString(node.attribute(\"color\").as_string(\"#FFFFFFFF\"));\n    m_textData.fontFamily = node.attribute(\"fontfamily\").as_string();\n    m_textData.italic = node.attribute(\"italic\").as_bool(false);\n    m_textData.kerning = node.attribute(\"kerning\").as_bool(true);\n    m_textData.pixelSize = node.attribute(\"pixelsize\").as_uint(16);\n    m_textData.strikethough = node.attribute(\"strikeout\").as_bool(false);\n    m_textData.underline = node.attribute(\"underline\").as_bool(false);\n    m_textData.wrap = node.attribute(\"wrap\").as_bool(false);\n\n    std::string alignment = node.attribute(\"halign\").as_string(\"left\");\n    if (alignment == \"left\")\n    {\n        m_textData.hAlign = Text::HAlign::Left;\n    }\n    else if (alignment == \"center\")\n    {\n        m_textData.hAlign = Text::HAlign::Centre;\n    }\n    else if (alignment == \"right\")\n    {\n        m_textData.hAlign = Text::HAlign::Right;\n    }\n\n    alignment = node.attribute(\"valign\").as_string(\"top\");\n    if (alignment == \"top\")\n    {\n        m_textData.vAlign = Text::VAlign::Top;\n    }\n    else if (alignment == \"center\")\n    {\n        m_textData.vAlign = Text::VAlign::Centre;\n    }\n    else if (alignment == \"bottom\")\n    {\n        m_textData.vAlign = Text::VAlign::Bottom;\n    }\n\n    m_textData.content = node.text().as_string();\n}\n\nvoid Object::parseTemplate(const std::string& path, Map* map)\n{\n    assert(map);\n\n    auto& templateObjects = map->getTemplateObjects();\n    auto& templateTilesets = map->getTemplateTilesets();\n\n    //load the template if not already loaded\n    if (templateObjects.count(path) == 0)\n    {\n        auto templatePath = map->getWorkingDirectory() + \"/\" + path;\n\n        pugi::xml_document doc;\n        if (!doc.load_file(templatePath.c_str()))\n        {\n            Logger::log(\"Failed opening template file \" + path, Logger::Type::Error);\n            return;\n        }\n\n        auto templateNode = doc.child(\"template\");\n        if (!templateNode)\n        {\n            Logger::log(\"Template node missing from \" + path, Logger::Type::Error);\n            return;\n        }\n\n        //if the template has a tileset load that (if not already loaded)\n        std::string tilesetName;\n        auto tileset = templateNode.child(\"tileset\");\n        if (tileset)\n        {\n            tilesetName = tileset.attribute(\"source\").as_string();\n            if (!tilesetName.empty() &&\n                templateTilesets.count(tilesetName) == 0)\n            {\n                templateTilesets.insert(std::make_pair(tilesetName, Tileset(map->getWorkingDirectory())));\n                templateTilesets.at(tilesetName).parse(tileset, map);\n            }\n        }\n\n        //parse the object - don't pass the map pointer here so there's\n        //no recursion if someone tried to get clever and put a template in a template\n        auto obj = templateNode.child(\"object\");\n        if (obj)\n        {\n            templateObjects.insert(std::make_pair(path, Object()));\n            templateObjects[path].parse(obj, nullptr);\n            templateObjects[path].m_tilesetName = tilesetName;\n        }\n    }\n\n    //apply any non-overridden object properties from the template\n    if (templateObjects.count(path) != 0)\n    {\n        const auto& obj = templateObjects[path];\n        if (m_AABB.width == 0)\n        {\n            m_AABB.width = obj.m_AABB.width;\n        }\n\n        if (m_AABB.height == 0)\n        {\n            m_AABB.height = obj.m_AABB.height;\n        }\n\n        m_tilesetName = obj.m_tilesetName;\n\n        if (m_name.empty())\n        {\n            m_name = obj.m_name;\n        }\n\n        if (m_type.empty())\n        {\n            m_type = obj.m_type;\n        }\n\n        if (m_rotation == 0)\n        {\n            m_rotation = obj.m_rotation;\n        }\n\n        if (m_tileID == 0)\n        {\n            m_tileID = obj.m_tileID;\n        }\n\n        if (m_shape == Shape::Rectangle)\n        {\n            m_shape = obj.m_shape;\n        }\n\n        if (m_points.empty())\n        {\n            m_points = obj.m_points;\n        }\n\n        //compare properties and only copy ones that don't exist\n        for (const auto& p : obj.m_properties)\n        {\n            auto result = std::find_if(m_properties.begin(), m_properties.end(),\n                [&p](const Property& a)\n                {\n                    return a.getName() == p.getName();\n                });\n\n            if (result == m_properties.end())\n            {\n                m_properties.push_back(p);\n            }\n        }\n\n\n        if (m_shape == Shape::Text)\n        {\n            //check each text property and update as necessary\n            //TODO this makes he assumption we prefer the template\n            //properties over the default ones - this might not\n            //actually be the case....\n            const auto& otherText = obj.m_textData;\n            if (m_textData.fontFamily.empty())\n            {\n                m_textData.fontFamily = otherText.fontFamily;\n            }\n\n            if (m_textData.pixelSize == 16)\n            {\n                m_textData.pixelSize = otherText.pixelSize;\n            }\n\n            //TODO this isn't actually right if we *want* to be false\n            //and the template is set to true...\n            if (m_textData.wrap == false)\n            {\n                m_textData.wrap = otherText.wrap;\n            }\n\n            if (m_textData.colour == Colour())\n            {\n                m_textData.colour = otherText.colour;\n            }\n\n            if (m_textData.bold == false)\n            {\n                m_textData.bold = otherText.bold;\n            }\n\n            if (m_textData.italic == false)\n            {\n                m_textData.italic = otherText.italic;\n            }\n\n            if (m_textData.underline == false)\n            {\n                m_textData.underline = otherText.underline;\n            }\n\n            if (m_textData.strikethough == false)\n            {\n                m_textData.strikethough = otherText.strikethough;\n            }\n\n            if (m_textData.kerning == true)\n            {\n                m_textData.kerning = otherText.kerning;\n            }\n\n            if (m_textData.hAlign == Text::HAlign::Left)\n            {\n                m_textData.hAlign = otherText.hAlign;\n            }\n\n            if (m_textData.vAlign == Text::VAlign::Top)\n            {\n                m_textData.vAlign = otherText.vAlign;\n            }\n\n            if (m_textData.content.empty())\n            {\n                m_textData.content = otherText.content;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Object.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016 - 2020\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Config.hpp\"\n#include \"Property.hpp\"\n#include \"Types.hpp\"\n\n#include <string>\n#include <vector>\n\nnamespace pugi\n{\n    class xml_node;\n}\n\nnamespace tmx\n{\n    class Map;\n\n    /*!\n    \\brief Contains the text information stored in a Text object.\n    */\n    struct TMXLITE_EXPORT_API Text final\n    {\n        std::string fontFamily;\n        std::uint32_t pixelSize = 16; //!< pixels, not points\n        bool wrap = false;\n        Colour colour;\n        bool bold = false;\n        bool italic = false;\n        bool underline = false;\n        bool strikethough = false;\n        bool kerning = true;\n\n        enum class HAlign\n        {\n            Left, Centre, Right\n        }hAlign = HAlign::Left;\n\n        enum class VAlign\n        {\n            Top, Centre, Bottom\n        }vAlign = VAlign::Top;\n\n        std::string content; //!< actual string content\n    };\n\n    /*!\n    \\brief Objects are stored in ObjectGroup layers.\n    Objects may be rectangular, elliptical, polygonal or\n    a polyline. Rectangular and elliptical Objects have their\n    size determined via the AABB, whereas polygon and polyline\n    shapes are defined by a list of points. Objects are\n    rectangular by default. Since version 1.0 Objects also\n    support Text nodes.\n    */\n    class TMXLITE_EXPORT_API Object final\n    {\n    public:\n        enum class Shape\n        {\n            Rectangle,\n            Ellipse,\n            Point,\n            Polygon,\n            Polyline,\n            Text\n        };\n\n        Object();\n\n        /*!\n        \\brief Attempts to parse the given xml node and\n        read the Object properties if it is valid.\n        */\n        void parse(const pugi::xml_node&, Map*);\n\n        /*!\n        \\brief Returns the unique ID of the Object\n        */\n        std::uint32_t getUID() const { return m_UID; }\n\n        /*!\n        \\brief Returns the name of the Object\n        */\n        const std::string& getName() const { return m_name; }\n\n        /*!\n        \\brief Returns the type of the Object, as defined in the editor\n        */\n        const std::string& getType() const { return m_type; }\n\n        /*!\n        \\brief Returns the position of the Object in pixels\n        */\n        const Vector2f& getPosition() const { return m_position; }\n\n        /*!\n        \\brief Returns the global Axis Aligned Bounding Box.\n        The AABB is positioned via the left and top properties, and\n        define the Object's width and height. This can be used to derive\n        the shape of the Object if it is rectangular or elliptical.\n        */\n        const FloatRect& getAABB() const { return m_AABB; }\n\n        /*!\n        \\brief Returns the rotation of the Object in degrees clockwise\n        */\n        float getRotation() const { return m_rotation; }\n\n        /*!\n        \\brief Returns the global tile ID associated with the Object\n        if there is one. This is used to draw the Object (and therefore\n        the Object must be rectangular)\n        */\n        uint32_t getTileID() const { return m_tileID; }\n\n        /*!\n        \\brief Returns whether or not the Object is visible\n        */\n        bool visible() const { return m_visible; }\n\n        /*!\n        \\brief Returns the Shape type of the Object\n        */\n        Shape getShape() const { return m_shape; }\n\n        /*!\n        \\brief Returns a reference to the vector of points which\n        make up the Object. If the Object is rectangular or elliptical\n        then the vector will be empty. Point coordinates are in pixels,\n        relative to the object position.\n        */\n        const std::vector<Vector2f>& getPoints() const { return m_points; }\n\n        /*!\n        \\brief Returns a reference to the vector of properties belonging to\n        the Object.\n        */\n        const std::vector<Property>& getProperties() const { return m_properties; }\n\n        /*!\n        \\brief Returns a Text struct containing information about any text\n        this object may have, such as font data and formatting.\n        If an object does not contain any text information this struct will\n        be populated with default values. Use getShape() to determine\n        if this object is in fact a text object.\n        */\n        const Text& getText() const { return m_textData; }\n        Text& getText() { return m_textData; }\n\n        /*!\n        \\brief Returns the tileset name used by this object if it is derived\n        from a template, else returns an empty string.\n        If the string is not empty use it to index the unordered_map returned\n        by Map::getTemplateTilesets()\n        */\n        const std::string& getTilesetName() const { return m_tilesetName; }\n\n    private:\n        std::uint32_t m_UID;\n        std::string m_name;\n        std::string m_type;\n        Vector2f m_position;\n        FloatRect m_AABB;\n        float m_rotation;\n        std::uint32_t m_tileID;\n        bool m_visible;\n\n        Shape m_shape;\n        std::vector<Vector2f> m_points;\n        std::vector<Property> m_properties;\n\n        Text m_textData;\n\n        std::string m_tilesetName;\n\n        void parsePoints(const pugi::xml_node&);\n        void parseText(const pugi::xml_node&);\n        void parseTemplate(const std::string&, Map*);\n    };\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/ObjectGroup.cpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#include \"FreeFuncs.hpp\"\n#include \"ObjectGroup.hpp\"\n#include \"detail/pugixml.hpp\"\n#include \"detail/Log.hpp\"\n\nusing namespace tmx;\n\nObjectGroup::ObjectGroup()\n    : m_colour    (127, 127, 127, 255),\n    m_drawOrder (DrawOrder::TopDown)\n{\n\n}\n\n//public\nvoid ObjectGroup::parse(const pugi::xml_node& node, Map* map)\n{\n    assert(map);\n\n    std::string attribString = node.name();\n    if (attribString != \"objectgroup\")\n    {\n        Logger::log(\"Node was not an object group, node will be skipped.\", Logger::Type::Error);\n        return;\n    }\n\n    setName(node.attribute(\"name\").as_string());\n\n    attribString = node.attribute(\"color\").as_string();\n    if (!attribString.empty())\n    {\n        m_colour = colourFromString(attribString);\n    }\n\n    setOpacity(node.attribute(\"opacity\").as_float(1.f));\n    setVisible(node.attribute(\"visible\").as_bool(true));\n    setOffset(node.attribute(\"offsetx\").as_int(), node.attribute(\"offsety\").as_int());\n    setSize(node.attribute(\"width\").as_uint(), node.attribute(\"height\").as_uint());\n\n    attribString = node.attribute(\"draworder\").as_string();\n    if (attribString == \"index\")\n    {\n        m_drawOrder = DrawOrder::Index;\n    }\n\n    for (const auto& child : node.children())\n    {\n        attribString = child.name();\n        if (attribString == \"properties\")\n        {\n            for (const auto& p : child)\n            {\n                m_properties.emplace_back();\n                m_properties.back().parse(p);\n            }\n        }\n        else if (attribString == \"object\")\n        {\n            m_objects.emplace_back();\n            m_objects.back().parse(child, map);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/ObjectGroup.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016 - 2019\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Config.hpp\"\n#include \"Layer.hpp\"\n#include \"Object.hpp\"\n\n#include <vector>\n\nnamespace tmx\n{\n    /*!\n    \\brief ObjectGroup layers contain a series of Objects\n    which may be made up of shapes or images.\n    */\n    class TMXLITE_EXPORT_API ObjectGroup final : public Layer\n    {\n    public:\n        enum class DrawOrder\n        {\n            Index, //< objects should be drawn in the order in which they appear\n            TopDown //< objects should be drawn sorted by their Y position\n        };\n\n        ObjectGroup();\n        ~ObjectGroup() = default;\n\n        Type getType() const override { return Layer::Type::Object; }\n        void parse(const pugi::xml_node&, Map*) override;\n\n        /*!\n        \\brief Returns the colour associated with this layer\n        */\n        const Colour& getColour() const { return m_colour; }\n        /*!\n        \\brief Returns the DrawOrder for the objects in this group.\n        Defaults to TopDown, where Objects are drawn sorted by Y position\n        */\n        DrawOrder getDrawOrder() const { return m_drawOrder; }\n        /*!\n        \\brief Returns a reference to the vector of properties for\n        the ObjectGroup\n        */\n        const std::vector<Property>& getProperties() const { return m_properties; }\n        /*!\n        \\brief Returns a reference to the vector of Objects which belong to the group\n        */\n        const std::vector<Object>& getObjects() const { return m_objects; }\n\n    private:\n        Colour m_colour;\n        DrawOrder m_drawOrder;\n\n        std::vector<Property> m_properties;\n        std::vector<Object> m_objects;\n    };\n\n    template <>\n    inline ObjectGroup& Layer::getLayerAs<ObjectGroup>()\n    {\n        assert(getType() == Type::Object);\n        return *dynamic_cast<ObjectGroup*>(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Property.cpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#include \"Property.hpp\"\n#include \"detail/pugixml.hpp\"\n#include \"detail/Log.hpp\"\n#include \"FreeFuncs.hpp\"\n\nusing namespace tmx;\n\nProperty::Property()\n    : m_type(Type::Undef)\n{\n}\n\n//public\nvoid Property::parse(const pugi::xml_node& node)\n{\n    std::string attribData = node.name();\n    if (attribData != \"property\")\n    {\n        Logger::log(\"Node was not a valid property, node will be skipped\", Logger::Type::Error);\n        return;\n    }\n\n    m_name = node.attribute(\"name\").as_string();\n\n    attribData = node.attribute(\"type\").as_string(\"string\");\n    if (attribData == \"bool\")\n    {\n        attribData = node.attribute(\"value\").as_string(\"false\");\n        m_boolValue = (attribData == \"true\");\n        m_type = Type::Boolean;\n        return;\n    }\n    else if (attribData == \"int\")\n    {\n        m_intValue = node.attribute(\"value\").as_int(0);\n        m_type = Type::Int;\n        return;\n    }\n    else if (attribData == \"float\")\n    {\n        m_floatValue = node.attribute(\"value\").as_float(0.f);\n        m_type = Type::Float;\n        return;\n    }\n    else if (attribData == \"string\")\n    {\n        m_stringValue = node.attribute(\"value\").as_string();\n\n        //if value is empty, try getting the child value instead\n        //as this is how multiline string properties are stored.\n        if(m_stringValue.empty())\n        {\n            m_stringValue = node.child_value();\n        }\n\n        m_type = Type::String;\n        return;\n    }\n    else if (attribData == \"color\")\n    {\n        m_colourValue = colourFromString(node.attribute(\"value\").as_string(\"#FFFFFFFF\"));\n        m_type = Type::Colour;\n        return;\n    }\n    else if (attribData == \"file\")\n    {\n        m_stringValue = node.attribute(\"value\").as_string();\n        m_type = Type::File;\n        return;\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Property.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Config.hpp\"\n#include \"Types.hpp\"\n\n#include <string>\n#include <cassert>\n\nnamespace pugi\n{\n    class xml_node;\n}\n\nnamespace tmx\n{\n    /*!\n    \\brief Represents a custom property.\n    Tiles, objects and layers of a tmx map may have custom\n    properties assigned to them. This class represents a\n    single property and provides access to its value, the\n    type of which can be determined with getType()\n    */\n    class TMXLITE_EXPORT_API Property final\n    {\n    public:\n\n        enum class Type\n        {\n            Boolean,\n            Float,\n            Int,\n            String,\n            Colour,\n            File,\n            Undef\n        };\n\n        Property();\n        ~Property() = default;\n\n        /*!\n        \\brief Attempts to parse the given node as a property\n        */\n        void parse(const pugi::xml_node&);\n        /*!\n        \\brief Returns the type of data stored in the property.\n        This should generally be called first before trying to\n        read the proprty value, as reading the incorrect type\n        will lead to undefined behaviour.\n        */\n        Type getType() const { return m_type; }\n        /*!\n        \\brief Returns the name of this property\n        */\n        const std::string& getName() const { return m_name; }\n        /*!\n        \\brief Returns the property's value as a boolean\n        */\n        bool getBoolValue() const { assert(m_type == Type::Boolean); return m_boolValue; }\n        /*!\n        \\brief Returns the property's value as a float\n        */\n        float getFloatValue() const { assert(m_type == Type::Float); return m_floatValue; }\n        /*!\n        \\brief Returns the property's value as an integer\n        */\n        int getIntValue() const { assert(m_type == Type::Int); return m_intValue; }\n        /*!\n        \\brief Returns the property's value as a string\n        */\n        const std::string& getStringValue() const { assert(m_type == Type::String); return m_stringValue; }\n        /*!\n        \\brief Returns the property's value as a Colour struct\n        */\n        const Colour& getColourValue() const { assert(m_type == Type::Colour); return m_colourValue; }\n        /*!\n        \\brief Returns the file path property as a string, relative to the map file\n        */\n        const std::string& getFileValue() const { assert(m_type == Type::File); return m_stringValue; }\n\n\n    private:\n        union\n        {\n            bool m_boolValue;\n            float m_floatValue;\n            int m_intValue;\n        };\n        std::string m_stringValue;\n        std::string m_name;\n        Colour m_colourValue;\n\n        Type m_type;\n    };\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/TileLayer.cpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#include \"FreeFuncs.hpp\"\n#include \"TileLayer.hpp\"\n#include \"detail/pugixml.hpp\"\n#include \"detail/Log.hpp\"\n\n#include <sstream>\n\nusing namespace tmx;\n\nTileLayer::TileLayer(std::size_t tileCount)\n    : m_tileCount (tileCount)\n{\n    m_tiles.reserve(tileCount);\n}\n\n//public\nvoid TileLayer::parse(const pugi::xml_node& node, Map*)\n{\n    std::string attribName = node.name();\n    if (attribName != \"layer\")\n    {\n        Logger::log(\"node not a layer node, skipped parsing\", Logger::Type::Error);\n        return;\n    }\n\n    setName(node.attribute(\"name\").as_string());\n    setOpacity(node.attribute(\"opacity\").as_float(1.f));\n    setVisible(node.attribute(\"visible\").as_bool(true));\n    setOffset(node.attribute(\"offsetx\").as_int(), node.attribute(\"offsety\").as_int());\n    setSize(node.attribute(\"width\").as_uint(), node.attribute(\"height\").as_uint());\n\n    for (const auto& child : node.children())\n    {\n        attribName = child.name();\n        if (attribName == \"data\")\n        {\n            attribName = child.attribute(\"encoding\").as_string();\n            if (attribName == \"base64\")\n            {\n                parseBase64(child);\n            }\n            else if (attribName == \"csv\")\n            {\n                parseCSV(child);\n            }\n            else\n            {\n                parseUnencoded(child);\n            }\n        }\n        else if (attribName == \"properties\")\n        {\n            for (const auto& p : child.children())\n            {\n                addProperty(p);\n            }\n        }\n    }\n\n}\n\n//private\nvoid TileLayer::parseBase64(const pugi::xml_node& node)\n{\n    auto processDataString = [](std::string dataString, std::size_t tileCount, bool compressed)->std::vector<std::uint32_t>\n    {\n        std::stringstream ss;\n        ss << dataString;\n        ss >> dataString;\n        dataString = base64_decode(dataString);\n\n        std::size_t expectedSize = tileCount * 4; //4 bytes per tile\n        std::vector<unsigned char> byteData;\n        byteData.reserve(expectedSize);\n\n        if (compressed)\n        {\n            //unzip\n            std::size_t dataSize = dataString.length() * sizeof(unsigned char);\n            if (!decompress(dataString.c_str(), byteData, dataSize, expectedSize))\n            {\n                LOG(\"Failed to decompress layer data, node skipped.\", Logger::Type::Error);\n                return {};\n            }\n        }\n        else\n        {\n            byteData.insert(byteData.end(), dataString.begin(), dataString.end());\n        }\n\n        //data stream is in bytes so we need to OR into 32 bit values\n        std::vector<std::uint32_t> IDs;\n        IDs.reserve(tileCount);\n        for (auto i = 0u; i < expectedSize - 3u; i += 4u)\n        {\n            std::uint32_t id = byteData[i] | byteData[i + 1] << 8 | byteData[i + 2] << 16 | byteData[i + 3] << 24;\n            IDs.push_back(id);\n        }\n\n        return IDs;\n    };\n\n\n    std::string data = node.text().as_string();\n    if (data.empty())\n    {\n        //check for chunk nodes\n        auto dataCount = 0;\n        for (const auto& childNode : node.children())\n        {\n            std::string childName = childNode.name();\n            if (childName == \"chunk\")\n            {\n                std::string dataString = childNode.text().as_string();\n                if (!dataString.empty())\n                {\n                    Chunk chunk;\n                    chunk.position.x = childNode.attribute(\"x\").as_int();\n                    chunk.position.y = childNode.attribute(\"y\").as_int();\n\n                    chunk.size.x = childNode.attribute(\"width\").as_int();\n                    chunk.size.y = childNode.attribute(\"height\").as_int();\n\n                    auto IDs = processDataString(dataString, (chunk.size.x * chunk.size.y), node.attribute(\"compression\"));\n\n                    if (!IDs.empty())\n                    {\n                        createTiles(IDs, chunk.tiles);\n                        m_chunks.push_back(chunk);\n                        dataCount++;\n                    }\n                }\n            }\n        }\n\n        if (dataCount == 0)\n        {\n            Logger::log(\"Layer \" + getName() + \" has no layer data. Layer skipped.\", Logger::Type::Error);\n            return;\n        }\n    }\n    else\n    {\n        auto IDs = processDataString(data, m_tileCount, node.attribute(\"compression\"));\n        createTiles(IDs, m_tiles);\n    }\n}\n\nvoid TileLayer::parseCSV(const pugi::xml_node& node)\n{\n    auto processDataString = [](const std::string dataString, std::size_t tileCount)->std::vector<std::uint32_t>\n    {\n        std::vector<std::uint32_t> IDs;\n        IDs.reserve(tileCount);\n\n        const char* ptr = dataString.c_str();\n        while (true)\n        {\n            char* end;\n            auto res = std::strtoul(ptr, &end, 10);\n            if (end == ptr) break;\n            ptr = end;\n            IDs.push_back(res);\n            if (*ptr == ',') ++ptr;\n        }\n\n        return IDs;\n    };\n\n    std::string data = node.text().as_string();\n    if (data.empty())\n    {\n        //check for chunk nodes\n        auto dataCount = 0;\n        for (const auto& childNode : node.children())\n        {\n            std::string childName = childNode.name();\n            if (childName == \"chunk\")\n            {\n                std::string dataString = childNode.text().as_string();\n                if (!dataString.empty())\n                {\n                    Chunk chunk;\n                    chunk.position.x = childNode.attribute(\"x\").as_int();\n                    chunk.position.y = childNode.attribute(\"y\").as_int();\n\n                    chunk.size.x = childNode.attribute(\"width\").as_int();\n                    chunk.size.y = childNode.attribute(\"height\").as_int();\n\n                    auto IDs = processDataString(dataString, chunk.size.x * chunk.size.y);\n\n                    if (!IDs.empty())\n                    {\n                        createTiles(IDs, chunk.tiles);\n                        m_chunks.push_back(chunk);\n                        dataCount++;\n                    }\n                }\n            }\n        }\n\n        if (dataCount == 0)\n        {\n            Logger::log(\"Layer \" + getName() + \" has no layer data. Layer skipped.\", Logger::Type::Error);\n            return;\n        }\n    }\n    else\n    {\n        createTiles(processDataString(data, m_tileCount), m_tiles);\n    }\n}\n\nvoid TileLayer::parseUnencoded(const pugi::xml_node& node)\n{\n    std::string attribName;\n    std::vector<std::uint32_t> IDs;\n    IDs.reserve(m_tileCount);\n\n    for (const auto& child : node.children())\n    {\n        attribName = child.name();\n        if (attribName == \"tile\")\n        {\n            IDs.push_back(child.attribute(\"gid\").as_uint());\n        }\n    }\n\n    createTiles(IDs, m_tiles);\n}\n\nvoid TileLayer::createTiles(const std::vector<std::uint32_t>& IDs, std::vector<Tile>& destination)\n{\n    //LOG(IDs.size() != m_tileCount, \"Layer tile count does not match expected size. Found: \"\n    //    + std::to_string(IDs.size()) + \", expected: \" + std::to_string(m_tileCount));\n\n    static const std::uint32_t mask = 0xf0000000;\n    for (const auto& id : IDs)\n    {\n        destination.emplace_back();\n        destination.back().flipFlags = ((id & mask) >> 28);\n        destination.back().ID = id & ~mask;\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/TileLayer.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016 - 2019\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Layer.hpp\"\n#include \"Types.hpp\"\n\nnamespace tmx\n{\n    /*!\n    \\brief A layer made up from a series of tile sets\n    */\n    class TMXLITE_EXPORT_API TileLayer final : public Layer\n    {\n    public:\n        /*!\n        \\brief Tile information for a layer\n        */\n        struct Tile final\n        {\n            std::uint32_t ID = 0; //!< Global ID of the tile\n            std::uint8_t flipFlags = 0; //!< Flags marking if the tile should be flipped when drawn\n        };\n\n        /*!\n        \\brief Represents a chunk of tile data, if this is an infinite map\n        */\n        struct Chunk final\n        {\n            Vector2i position; //<! coordinate in tiles, not pixels\n            Vector2i size; //!< size in tiles, not pixels\n            std::vector<Tile> tiles;\n        };\n\n        /*!\n        \\brief Flags used to tell if a tile is flipped when drawn\n        */\n        enum FlipFlag\n        {\n            Horizontal = 0x8,\n            Vertical = 0x4,\n            Diagonal = 0x2\n        };\n\n        explicit TileLayer(std::size_t);\n        ~TileLayer() = default;\n\n        Type getType() const override { return Layer::Type::Tile; }\n        void parse(const pugi::xml_node&, Map*) override;\n\n        /*!\n        \\brief Returns the list of tiles used to make up the layer\n        If this is empty then the map is most likely infinite, in\n        which case the tile data is stored in chunks.\n        \\see getChunks()\n        */\n        const std::vector<Tile>& getTiles() const { return m_tiles; }\n\n        /*!\n        \\brief Returns a vector of chunks which make up this layer\n        if the map is set to infinite. This will be empty if the map\n        is not infinite.\n        \\see getTiles()\n        */\n        const std::vector<Chunk>& getChunks() const { return m_chunks; }\n\n    private:\n        std::vector<Tile> m_tiles;\n        std::vector<Chunk> m_chunks;\n        std::size_t m_tileCount;\n\n        void parseBase64(const pugi::xml_node&);\n        void parseCSV(const pugi::xml_node&);\n        void parseUnencoded(const pugi::xml_node&);\n\n        void createTiles(const std::vector<std::uint32_t>&, std::vector<Tile>& destination);\n    };\n\n    template <>\n    inline TileLayer& Layer::getLayerAs<TileLayer>()\n    {\n        assert(getType() == Type::Tile);\n        return *dynamic_cast<TileLayer*>(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Tileset.cpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#include \"Tileset.hpp\"\n#include \"detail/pugixml.hpp\"\n#include \"FreeFuncs.hpp\"\n#include \"detail/Log.hpp\"\n\n#include <ctype.h>\n\nusing namespace tmx;\n\nTileset::Tileset(const std::string& workingDir)\n    : m_workingDir          (workingDir),\n    m_firstGID              (0),\n    m_spacing               (0),\n    m_margin                (0),\n    m_tileCount             (0),\n    m_columnCount           (0),\n    m_transparencyColour    (0, 0, 0, 0)\n{\n\n}\n\n//public\nvoid Tileset::parse(pugi::xml_node node, Map* map)\n{\n    assert(map);\n\n    std::string attribString = node.name();\n    if (attribString != \"tileset\")\n    {\n        Logger::log(attribString + \": not a tileset node! Node will be skipped.\", Logger::Type::Warning);\n        return;\n    }\n\n    m_firstGID = node.attribute(\"firstgid\").as_int();\n    if (m_firstGID == 0)\n    {\n        Logger::log(\"Invalid first GID in tileset. Tileset node skipped.\", Logger::Type::Warning);\n        return;\n    }\n\n    pugi::xml_document tsxDoc; //need to keep this in scope\n    if (node.attribute(\"source\"))\n    {\n        //parse TSX doc\n        std::string path = node.attribute(\"source\").as_string();\n        path = resolveFilePath(path, m_workingDir);\n\n        //as the TSX file now dictates the image path, the working\n        //directory is now that of the tsx file\n        auto position = path.find_last_of('/');\n        if (position != std::string::npos)\n        {\n            m_workingDir = path.substr(0, position);\n        }\n        else\n        {\n            m_workingDir = \"\";\n        }\n\n        //see if doc can be opened\n        auto result = tsxDoc.load_file(path.c_str());\n        if (!result)\n        {\n            Logger::log(\"Failed opening tsx file for tile set, tile set will be skipped\", Logger::Type::Error);\n            return reset();\n        }\n\n        //if it can then replace the current node with tsx node\n        node = tsxDoc.child(\"tileset\");\n        if (!node)\n        {\n            Logger::log(\"tsx file does not contain a tile set node, tile set will be skipped\", Logger::Type::Error);\n            return reset();\n        }\n    }\n\n    m_name = node.attribute(\"name\").as_string();\n    LOG(\"found tile set \" + m_name, Logger::Type::Info);\n\n    m_tileSize.x = node.attribute(\"tilewidth\").as_int();\n    m_tileSize.y = node.attribute(\"tileheight\").as_int();\n    if (m_tileSize.x == 0 || m_tileSize.y == 0)\n    {\n        Logger::log(\"Invalid tile size found in tile set node. Node will be skipped.\", Logger::Type::Error);\n        return reset();\n    }\n\n    m_spacing = node.attribute(\"spacing\").as_int();\n    m_margin = node.attribute(\"margin\").as_int();\n    m_tileCount = node.attribute(\"tilecount\").as_int();\n    m_columnCount = node.attribute(\"columns\").as_int();\n\n    const auto& children = node.children();\n    for (const auto& node : children)\n    {\n        std::string name = node.name();\n        if (name == \"image\")\n        {\n            //TODO this currently doesn't cover embedded images\n            //mostly because I can't figure out how to export them\n            //from the Tiled editor... but also resource handling\n            //should be handled by the renderer, not the parser.\n            attribString = node.attribute(\"source\").as_string();\n            if (attribString.empty())\n            {\n                Logger::log(\"Tileset image node has missing source property, tile set not loaded\", Logger::Type::Error);\n                return reset();\n            }\n            m_imagePath = resolveFilePath(attribString, m_workingDir);\n            if (node.attribute(\"trans\"))\n            {\n                attribString = node.attribute(\"trans\").as_string();\n                m_transparencyColour = colourFromString(attribString);\n            }\n            if (node.attribute(\"width\") && node.attribute(\"height\"))\n            {\n                m_imageSize.x = node.attribute(\"width\").as_int();\n                m_imageSize.y = node.attribute(\"height\").as_int();\n            }\n        }\n        else if (name == \"tileoffset\")\n        {\n            parseOffsetNode(node);\n        }\n        else if (name == \"properties\")\n        {\n            parsePropertyNode(node);\n        }\n        else if (name == \"terraintypes\")\n        {\n            parseTerrainNode(node);\n        }\n        else if (name == \"tile\")\n        {\n            parseTileNode(node, map);\n        }\n    }\n\n    // If the tsx file does not declare every tile, we create the missing ones\n    if (m_tiles.size() != getTileCount())\n    {\n        for (std::uint32_t ID = 0 ; ID < getTileCount() ; ID++)\n        {\n            createMissingTile(ID);\n        }\n    }\n\n    //sort these just to make sure when we request last GID we get the corrtect value\n    std::sort(m_tiles.begin(), m_tiles.end(), [](const Tile& t1, const Tile& t2) {return t1.ID < t2.ID; });\n}\n\nstd::uint32_t Tileset::getLastGID() const\n{\n    assert(!m_tiles.empty());\n    return m_firstGID + m_tiles.back().ID;\n}\n\nconst Tileset::Tile* Tileset::getTile(std::uint32_t id) const\n{\n    if (!hasTile(id))\n    {\n        return nullptr;\n    }\n\n    //corrects the ID. Indices and IDs are different.\n    id = (getLastGID() - m_firstGID) - (getLastGID() - id);\n\n    const auto itr = std::find_if(m_tiles.begin(), m_tiles.end(),\n        [id](const Tile& tile)\n    {\n            return tile.ID == id;\n    });\n\n    return (itr == m_tiles.end()) ? nullptr : &(*itr);\n}\n\n//private\nvoid Tileset::reset()\n{\n    m_firstGID = 0;\n    m_source = \"\";\n    m_name = \"\";\n    m_tileSize = { 0,0 };\n    m_spacing = 0;\n    m_margin = 0;\n    m_tileCount = 0;\n    m_columnCount = 0;\n    m_tileOffset = { 0,0 };\n    m_properties.clear();\n    m_imagePath = \"\";\n    m_transparencyColour = { 0, 0, 0, 0 };\n    m_terrainTypes.clear();\n    m_tiles.clear();\n}\n\nvoid Tileset::parseOffsetNode(const pugi::xml_node& node)\n{\n    m_tileOffset.x = node.attribute(\"x\").as_int();\n    m_tileOffset.y = node.attribute(\"y\").as_int();\n}\n\nvoid Tileset::parsePropertyNode(const pugi::xml_node& node)\n{\n    const auto& children = node.children();\n    for (const auto& child : children)\n    {\n        m_properties.emplace_back();\n        m_properties.back().parse(child);\n    }\n}\n\nvoid Tileset::parseTerrainNode(const pugi::xml_node& node)\n{\n    const auto& children = node.children();\n    for (const auto& child : children)\n    {\n        std::string name = child.name();\n        if (name == \"terrain\")\n        {\n            m_terrainTypes.emplace_back();\n            auto& terrain = m_terrainTypes.back();\n            terrain.name = child.attribute(\"name\").as_string();\n            terrain.tileID = child.attribute(\"tile\").as_int();\n            auto properties = child.child(\"properties\");\n            if (properties)\n            {\n                for (const auto& p : properties)\n                {\n                    name = p.name();\n                    if (name == \"property\")\n                    {\n                        terrain.properties.emplace_back();\n                        terrain.properties.back().parse(p);\n                    }\n                }\n            }\n        }\n    }\n}\n\nvoid Tileset::parseTileNode(const pugi::xml_node& node, Map* map)\n{\n    assert(map);\n\n    Tile tile;\n    tile.ID = node.attribute(\"id\").as_int();\n    if (node.attribute(\"terrain\"))\n    {\n        std::string data = node.attribute(\"terrain\").as_string();\n        bool lastWasChar = true;\n        std::size_t idx = 0u;\n        for (auto i = 0u; i < data.size() && idx < tile.terrainIndices.size(); ++i)\n        {\n            if (isdigit(data[i]))\n            {\n                tile.terrainIndices[idx++] = std::atoi(&data[i]);\n                lastWasChar = false;\n            }\n            else\n            {\n                if (!lastWasChar)\n                {\n                    lastWasChar = true;\n                }\n                else\n                {\n                    tile.terrainIndices[idx++] = -1;\n                    lastWasChar = false;\n                }\n            }\n        }\n        if (lastWasChar)\n        {\n            tile.terrainIndices[idx] = -1;\n        }\n    }\n\n    tile.probability = node.attribute(\"probability\").as_int(100);\n    tile.type = node.attribute(\"type\").as_string();\n\n    //by default we set the tile's values as in an Image tileset\n    tile.imagePath = m_imagePath;\n    tile.imageSize = m_tileSize;\n\n    if (m_columnCount != 0)\n    {\n        std::int32_t rowIndex = tile.ID % m_columnCount;\n        std::int32_t columnIndex = tile.ID / m_columnCount;\n        tile.imagePosition.x = m_margin + rowIndex * (m_tileSize.x + m_spacing);\n        tile.imagePosition.y = m_margin + columnIndex * (m_tileSize.y + m_spacing);\n    }\n\n    const auto& children = node.children();\n    for (const auto& child : children)\n    {\n        std::string name = child.name();\n        if (name == \"properties\")\n        {\n            for (const auto& prop : child.children())\n            {\n                tile.properties.emplace_back();\n                tile.properties.back().parse(prop);\n            }\n        }\n        else if (name == \"objectgroup\")\n        {\n            tile.objectGroup.parse(child, map);\n        }\n        else if (name == \"image\")\n        {\n            std::string attribString = child.attribute(\"source\").as_string();\n            if (attribString.empty())\n            {\n                Logger::log(\"Tile image path missing\", Logger::Type::Warning);\n                continue;\n            }\n            tile.imagePath = resolveFilePath(attribString, m_workingDir);\n\n            tile.imagePosition = tmx::Vector2u(0, 0);\n\n            if (child.attribute(\"trans\"))\n            {\n                attribString = child.attribute(\"trans\").as_string();\n                m_transparencyColour = colourFromString(attribString);\n            }\n            if (child.attribute(\"width\"))\n            {\n                tile.imageSize.x = child.attribute(\"width\").as_uint();\n            }\n            if (child.attribute(\"height\"))\n            {\n                tile.imageSize.y = child.attribute(\"height\").as_uint();\n            }\n        }\n        else if (name == \"animation\")\n        {\n            for (const auto& frameNode : child.children())\n            {\n                Tile::Animation::Frame frame;\n                frame.duration = frameNode.attribute(\"duration\").as_int();\n                frame.tileID = frameNode.attribute(\"tileid\").as_int() + m_firstGID;\n                tile.animation.frames.push_back(frame);\n            }\n        }\n    }\n    m_tiles.push_back(tile);\n}\n\nvoid Tileset::createMissingTile(std::uint32_t ID)\n{\n    // First, we check if the tile does not yet exist\n    for (auto &tile : m_tiles)\n    {\n        if (tile.ID == ID)\n            return;\n    }\n\n    Tile tile;\n    tile.ID = ID;\n    tile.imagePath = m_imagePath;\n    tile.imageSize = m_tileSize;\n\n    std::int32_t rowIndex = ID % m_columnCount;\n    std::int32_t columnIndex = ID / m_columnCount;\n    tile.imagePosition.x = m_margin + rowIndex * (m_tileSize.x + m_spacing);\n    tile.imagePosition.y = m_margin + columnIndex * (m_tileSize.y + m_spacing);\n\n    m_tiles.push_back(tile);\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Tileset.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Config.hpp\"\n#include \"Property.hpp\"\n#include \"ObjectGroup.hpp\"\n\n#include <string>\n#include <vector>\n#include <array>\n\nnamespace pugi\n{\n    class xml_node;\n}\n\nnamespace tmx\n{\n    class Map;\n\n    /*!\n    \\brief Represents a Tileset node as loaded\n    from a *.tmx format tile map via the tmx::Map\n    class.\n    */\n    class TMXLITE_EXPORT_API Tileset final\n    {\n    public:\n        explicit Tileset(const std::string& workingDir);\n        ~Tileset() = default;\n\n        /*!\n        \\brief Any tiles within a tile set which have special\n        data associated with them such as animation or terrain\n        information will have one of these stored in the tile set.\n        */\n        struct Tile final\n        {\n            std::uint32_t ID = 0;\n            std::array<std::int32_t, 4u> terrainIndices{};\n            std::uint32_t probability = 100;\n\n            /*!\n            \\brief a group of frames which make up an animation\n            */\n            struct Animation final\n            {\n                /*!\n                \\brief A frame within an animation\n                */\n                struct Frame final\n                {\n                    std::uint32_t tileID = 0;\n                    std::uint32_t duration = 0;\n\n                    bool operator == (const Frame& other) const\n                    {\n                        return (this == &other) ||\n                            (tileID == other.tileID && duration == other.duration);\n                    }\n\n                    bool operator != (const Frame& other) const\n                    {\n                        return !(*this == other);\n                    }\n                };\n                std::vector<Frame> frames;\n            }animation;\n            std::vector<Property> properties;\n            ObjectGroup objectGroup;\n            std::string imagePath;\n            Vector2u imageSize;\n            /*!\n            \\brief The position of the tile within the image.\n            */\n            Vector2u imagePosition;\n            std::string type;\n        };\n\n        /*!\n        \\brief Terrain information with which one\n        or more tiles may be associated.\n        */\n        struct Terrain final\n        {\n            std::string name;\n            std::uint32_t tileID = -1;\n            std::vector<Property> properties;\n        };\n\n        /*!\n        \\brief Attempts to parse the given xml node.\n        If node parsing fails an error is printed in the console\n        and the Tileset remains in an uninitialised state.\n        */\n        void parse(pugi::xml_node, Map*);\n        /*!\n        \\brief Returns the first GID of this tile set.\n        This the ID of the first tile in the tile set, so that\n        each tile set guarantees a unique set of IDs\n        */\n        std::uint32_t getFirstGID() const { return m_firstGID; }\n        /*!\n        \\brief Returns the last GID of this tile set.\n        This is the ID of the last tile in the tile set.\n        */\n        std::uint32_t getLastGID() const;\n        /*!\n        \\brief Returns the name of this tile set.\n        */\n        const std::string& getName() const { return m_name; }\n        /*!\n        \\brief Returns the width and height of a tile in the\n        tile set, in pixels.\n        */\n        const Vector2u& getTileSize() const { return m_tileSize; }\n        /*!\n        \\brief Returns the spacing, in pixels, between each tile in the set\n        */\n        std::uint32_t getSpacing() const { return m_spacing; }\n        /*!\n        \\brief Returns the margin, in pixels, around each tile in the set\n        */\n        std::uint32_t getMargin() const { return m_margin; }\n        /*!\n        \\brief Returns the number of tiles in the tile set\n        */\n        std::uint32_t getTileCount() const { return m_tileCount; }\n        /*!\n        \\brief Returns the number of columns which make up the tile set.\n        This is used when rendering collection of images sets\n        */\n        std::uint32_t getColumnCount() const { return m_columnCount; }\n        /*!\n        \\brief Returns the tile offset in pixels.\n        Tile will draw tiles offset from the top left using this value.\n        */\n        const Vector2u& getTileOffset() const { return m_tileOffset; }\n        /*!\n        \\brief Returns a reference to the list of Property objects for this\n        tile set\n        */\n        const std::vector<Property>& getProperties() const { return m_properties; }\n        /*!\n        \\brief Returns the file path to the tile set image, relative to the\n        working directory. Use this to load the texture required by whichever\n        method you choose to render the map.\n        */\n        const std::string getImagePath() const { return m_imagePath; }\n        /*!\n        \\brief Returns the size of the tile set image in pixels.\n         */\n        const Vector2u& getImageSize() const { return m_imageSize; }\n        /*!\n        \\brief Returns the colour used by the tile map image to represent transparency.\n        By default this is a transparent colour (0, 0, 0, 0)\n        */\n        const Colour& getTransparencyColour() const { return m_transparencyColour; }\n        /*!\n        \\brief Returns true if the image used by this tileset specifically requests\n        a colour to use as transparency.\n        */\n        bool hasTransparency() const { return m_hasTransparency; }\n        /*!\n        \\brief Returns a vector of Terrain types associated with one\n        or more tiles within this tile set\n        */\n        const std::vector<Terrain>& getTerrainTypes() const { return m_terrainTypes; }\n        /*!\n        \\brief Returns a reference to the vector of tile data used by\n        tiles which make up this tile set.\n        */\n        const std::vector<Tile>& getTiles() const { return m_tiles; }\n\n        /*!\n         \\brief Checks if a tiled ID is in the range of the first ID and the last ID\n         \\param id Tile ID\n         \\return\n         */\n        bool hasTile(std::uint32_t id) const { return id >= m_firstGID && id <= getLastGID(); };\n\n\n        /*!\n         \\brief queries tiles and returns a tile with the given ID. Checks if the TileID is part of the Tileset with `hasTile(id)`\n         \\param id Tile ID. The Tile ID will be corrected internally.\n         \\return In case of a success it returns the correct tile. In terms of failure it will return a nullptr.\n         */\n        const Tile* getTile(std::uint32_t id) const;\n\n    private:\n\n        std::string m_workingDir;\n\n        std::uint32_t m_firstGID;\n        std::string m_source;\n        std::string m_name;\n        Vector2u m_tileSize;\n        std::uint32_t m_spacing;\n        std::uint32_t m_margin;\n        std::uint32_t m_tileCount;\n        std::uint32_t m_columnCount;\n        Vector2u m_tileOffset;\n\n        std::vector<Property> m_properties;\n        std::string m_imagePath;\n        Vector2u m_imageSize;\n        Colour m_transparencyColour;\n        bool m_hasTransparency;\n\n        std::vector<Terrain> m_terrainTypes;\n        std::vector<Tile> m_tiles;\n\n        void reset();\n\n        void parseOffsetNode(const pugi::xml_node&);\n        void parsePropertyNode(const pugi::xml_node&);\n        void parseTerrainNode(const pugi::xml_node&);\n        void parseTileNode(const pugi::xml_node&, Map*);\n        void createMissingTile(std::uint32_t ID);\n    };\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Types.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#pragma once\n\n#include \"Config.hpp\"\n\n#include <cstdint>\n\nnamespace tmx\n{\n    /*!\n    \\brief Two dimensional vector used to store points and positions\n    */\n    template <class T>\n    struct Vector2 final\n    {\n        Vector2() : x(0), y(0) {}\n        Vector2(T x, T y) :x(x), y(y) {}\n        T x, y;\n    };\n\n    using Vector2f = Vector2<float>;\n    using Vector2i = Vector2<int>;\n    using Vector2u = Vector2<unsigned>;\n\n    template <typename T>\n    Vector2<T> operator + (const Vector2<T>& l, const Vector2<T>& r);\n\n    template <typename T>\n    Vector2<T>& operator += (Vector2<T>& l, const Vector2<T>& r);\n\n    template <typename T>\n    Vector2<T> operator - (const Vector2<T>& l, const Vector2<T>& r);\n\n    template <typename T>\n    Vector2<T>& operator -= (Vector2<T>& l, const Vector2<T>& r);\n\n    template <typename T>\n    Vector2<T> operator * (const Vector2<T>& l, const Vector2<T>& r);\n\n    template <typename T>\n    Vector2<T>& operator *= (Vector2<T>& l, const Vector2<T>& r);\n\n    template <typename T>\n    Vector2<T> operator * (const Vector2<T>& l, T r);\n\n    template <typename T>\n    Vector2<T>& operator *= (Vector2<T>& l, T r);\n\n    template <typename T>\n    Vector2<T> operator / (const Vector2<T>& l, const Vector2<T>& r);\n\n    template <typename T>\n    Vector2<T>& operator /= (Vector2<T>& l, const Vector2<T>& r);\n\n    template <typename T>\n    Vector2<T> operator / (const Vector2<T>& l, T r);\n\n    template <typename T>\n    Vector2<T>& operator /= (Vector2<T>& l, T r);\n\n#include \"Types.inl\"\n\n    /*!\n    \\brief Describes a rectangular area, such as an AABB (axis aligned bounding box)\n    */\n    template <class T>\n    struct Rectangle final\n    {\n        Rectangle() : left(0), top(0), width(0), height(0) {}\n        Rectangle(T l, T t, T w, T h) : left(l), top(t), width(w), height(h) {}\n        Rectangle(Vector2<T> position, Vector2<T> size) : left(position.x), top(position.y), width(size.x), height(size.y) {}\n        T left, top, width, height;\n    };\n\n    using FloatRect = Rectangle<float>;\n    using IntRect = Rectangle<int>;\n\n    /*!\n    \\brief Contains the red, green, blue and alpha values of a colour\n    in the range 0 - 255.\n    */\n    struct TMXLITE_EXPORT_API Colour final\n    {\n        Colour(std::uint8_t red = 0, std::uint8_t green = 0, std::uint8_t blue = 0, std::uint8_t alpha = 255)\n            : r(red), g(green), b(blue), a(alpha) {}\n        std::uint8_t r, g, b, a;\n\n        bool operator == (const Colour& other)\n        {\n            return other.r == r\n                && other.g == g\n                && other.b == b\n                && other.a == a;\n        }\n\n        bool operator != (const Colour& other)\n        {\n            return !(*this == other);\n        }\n    };\n}\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/Types.inl",
    "content": "/*********************************************************************\nMatt Marchant 2016-2017\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\ntemplate <typename T>\nVector2<T> operator + (const Vector2<T>& l, const Vector2<T>& r)\n{\n    return { l.x + r.x, l.y + r.y };\n}\n\ntemplate <typename T>\nVector2<T>& operator += (Vector2<T>& l, const Vector2<T>& r)\n{\n    l.x += r.x;\n    l.y += r.y;\n    return l;\n}\n\ntemplate <typename T>\nVector2<T> operator - (const Vector2<T>& l, const Vector2<T>& r)\n{\n    return { l.x - r.x, l.y - r.y };\n}\n\ntemplate <typename T>\nVector2<T>& operator -= (Vector2<T>& l, const Vector2<T>& r)\n{\n    l.x -= r.x;\n    l.y -= r.y;\n    return l;\n}\n\ntemplate <typename T>\nVector2<T> operator * (const Vector2<T>& l, const Vector2<T>& r)\n{\n    return { l.x * r.x, l.y * r.y };\n}\n\ntemplate <typename T>\nVector2<T>& operator *= (Vector2<T>& l, const Vector2<T>& r)\n{\n    l.x *= r.x;\n    l.y *= r.y;\n    return l;\n}\n\ntemplate <typename T>\nVector2<T> operator * (const Vector2<T>& l, T r)\n{\n    return { l.x * r, l.y * r };\n}\n\ntemplate <typename T>\nVector2<T>& operator *= (Vector2<T>& l, T r)\n{\n    l.x *= r;\n    l.y *= r;\n    return l;\n}\n\ntemplate <typename T>\nVector2<T> operator / (const Vector2<T>& l, const Vector2<T>& r)\n{\n    return { l.x / r.x, l.y / r.y };\n}\n\ntemplate <typename T>\nVector2<T>& operator /= (Vector2<T>& l, const Vector2<T>& r)\n{\n    l.x /= r.x;\n    l.y /= r.y;\n    return l;\n}\n\ntemplate <typename T>\nVector2<T> operator / (const Vector2<T>& l, T r)\n{\n    return { l.x / r, l.y / r };\n}\n\ntemplate <typename T>\nVector2<T>& operator /= (Vector2<T>& l, T r)\n{\n    l.x /= r;\n    l.y /= r;\n    return l;\n}"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/detail/Android.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n#ifndef ANDROID_INC_HPP_\n#define ANDROID_INC_HPP_\n#ifdef __ANDROID__\n\n#include <string>\n#include <sstream>\n\n#include <cstdlib>\n\nnamespace std\n{\n\ttemplate <typename T>\n\tstd::string to_string(T value)\n\t{\n\t\tstd::ostringstream os;\n\t\tos << value;\n\t\treturn os.str();\n\t}\n}\n\n#define STOI(str) std::strtol(str.c_str(), 0, 10)\n#else\n#define STOI(str) std::stoi(str)\n\n#endif // __ANDROID__\n#endif // ANDROID_INC_HPP_\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/detail/Log.hpp",
    "content": "/*********************************************************************\nMatt Marchant 2016\nhttp://trederia.blogspot.com\n\ntmxlite - Zlib license.\n\nThis software is provided 'as-is', without any express or\nimplied warranty. In no event will the authors be held\nliable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\nyou must not claim that you wrote the original software.\nIf you use this software in a product, an acknowledgment\nin the product documentation would be appreciated but\nis not required.\n\n2. Altered source versions must be plainly marked as such,\nand must not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any\nsource distribution.\n*********************************************************************/\n\n//flexible logging class, based on code at https://github.com/fallahn/xygine\n\n#ifndef TMXLITE_LOGGER_HPP_\n#define TMXLITE_LOGGER_HPP_\n\n#include <string>\n#include <iostream>\n#include <iomanip>\n#include <fstream>\n#include <sstream>\n#include <list>\n#include <ctime>\n\n#ifdef _MSC_VER\n#define NOMINMAX\n#include <Windows.h>\n#endif //_MSC_VER\n\n\n#ifdef __ANDROID__\n\t#include <android/log.h>\n\n\n\t#define  LOG_TAG    \"TMXlite-Debug\" \n\t//#define  ALOG(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)\n\n\t#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)\n\t#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)\n#endif // __ANDROID__\n\nnamespace tmx\n{\n    /*!\n    \\brief Class allowing messages to be logged to a combination\n    of one or more destinations such as the console, log file or\n    output window in Visual Studio\n    */\n    class Logger final\n    {\n    public:\n        enum class Output\n        {\n            Console,\n            File,\n            All\n        };\n\n        enum class Type\n        {\n            Info,\n            Warning,\n            Error\n        };\n        /*!\n        \\brief Logs a message to a given destination.\n        \\param message Message to log\n        \\param type Whether this message gets tagged as information, a warning or an error\n        \\param output Destination for the message. Can be the console via cout, a log file on disk, or both\n        */\n        static void log(const std::string& message, Type type = Type::Info, Output output = Output::Console)\n        {\n            std::string outstring;\n            switch (type)\n            {\n            case Type::Info:\n            default:\n                outstring = \"INFO: \" + message;\n                break;\n            case Type::Error:\n                outstring = \"ERROR: \" + message;\n                break;\n            case Type::Warning:\n                outstring = \"WARNING: \" + message;\n                break;\n            }\n\n            if (output == Output::Console || output == Output::All)\n            {\n                if (type == Type::Error) {\n#ifdef __ANDROID__\t\n\t\t\t\t\t\n\t\t\t\t\tint outstringLength = outstring.length();\n\t\t\t\t\tchar outstring_chararray[outstringLength+1];\n\t\t\t\t\tstrcpy(outstring_chararray, outstring.c_str()); \n\t\t\t\t\tLOGE(\"%s\",outstring_chararray);\n#endif\n                    std::cerr << outstring << std::endl;\n\t\t\t\t}else{\n#ifdef __ANDROID__\n\t\t\t\t\tint outstringLength = outstring.length();\n\t\t\t\t\tchar outstring_chararray[outstringLength+1];\n\t\t\t\t\tstrcpy(outstring_chararray, outstring.c_str()); \n\t\t\t\t\tLOGI(\"%s\", outstring_chararray);\n#endif\n                    std::cout << outstring << std::endl;\n                }\n                const std::size_t maxBuffer = 30;\n                buffer().push_back(outstring);\n                if (buffer().size() > maxBuffer)buffer().pop_front(); //no majick here pl0x\n                updateOutString(maxBuffer);\n\n#ifdef _MSC_VER\n                outstring += \"\\n\";\n                OutputDebugStringA(outstring.c_str());\n#endif //_MSC_VER\n            }\n            if (output == Output::File || output == Output::All)\n            {\n                //output to a log file\n                std::ofstream file(\"output.log\", std::ios::app);\n                if (file.good())\n                {\n#ifndef __ANDROID__\n                    std::time_t time = std::time(nullptr);\n                    auto tm = *std::localtime(&time);\n\t\t\t\t\t//put_time isn't implemented by the ndk versions of the stl\n                    file.imbue(std::locale());\n                    file << std::put_time(&tm, \"%d/%m/%y-%H:%M:%S: \");\n#endif //__ANDROID__\n                    file << outstring << std::endl;\n                    file.close();\n                }\n                else\n                {\n                    log(message, type, Output::Console);\n                    log(\"Above message was intended for log file. Opening file probably failed.\", Type::Warning, Output::Console);\n                }\n            }\n        }\n\n        static const std::string& bufferString(){ return stringOutput(); }\n\n    private:\n        static std::list<std::string>& buffer(){ static std::list<std::string> buffer; return buffer; }\n        static std::string& stringOutput() { static std::string output; return output; }\n        static void updateOutString(std::size_t maxBuffer)\n        {\n            static size_t count = 0;\n            stringOutput().append(buffer().back());\n            stringOutput().append(\"\\n\");\n            count++;\n\n            if (count > maxBuffer)\n            {\n                stringOutput() = stringOutput().substr(stringOutput().find_first_of('\\n') + 1, stringOutput().size());\n                count--;\n            }\n        }\n    };\n}\n#ifndef _DEBUG_\n#define LOG(message, type)\n#else\n#define LOG(message, type) {\\\nstd::stringstream ss; \\\nss << message << \" (\" << __FILE__ << \", \" << __LINE__ << \")\"; \\\ntmx::Logger::log(ss.str(), type);}\n#endif //_DEBUG_\n\n#endif //TMXLITE_LOGGER_HPP_"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/detail/pugiconfig.hpp",
    "content": "/**\n * pugixml parser - version 1.7\n * --------------------------------------------------------\n * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\n * Report bugs and download new versions at http://pugixml.org/\n *\n * This library is distributed under the MIT License. See notice at the end\n * of this file.\n *\n * This work is based on the pugxml parser, which is:\n * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)\n */\n\n#ifndef HEADER_PUGICONFIG_HPP\n#define HEADER_PUGICONFIG_HPP\n\n// Uncomment this to enable wchar_t mode\n// #define PUGIXML_WCHAR_MODE\n\n// Uncomment this to enable compact mode\n// #define PUGIXML_COMPACT\n\n// Uncomment this to disable XPath\n// #define PUGIXML_NO_XPATH\n\n#ifdef __ANDROID__\n// Uncomment this to disable STL\n#define PUGIXML_NO_STL\n\n// Uncomment this to disable exceptions\n#define PUGIXML_NO_EXCEPTIONS\n#endif //__ANDROID__\n// Set this to control attributes for public classes/functions, i.e.:\n// #define PUGIXML_API __declspec(dllexport) // to export all public symbols from DLL\n// #define PUGIXML_CLASS __declspec(dllimport) // to import all classes from DLL\n// #define PUGIXML_FUNCTION __fastcall // to set calling conventions to all public functions to fastcall\n// In absence of PUGIXML_CLASS/PUGIXML_FUNCTION definitions PUGIXML_API is used instead\n\n// Tune these constants to adjust memory-related behavior\n// #define PUGIXML_MEMORY_PAGE_SIZE 32768\n// #define PUGIXML_MEMORY_OUTPUT_STACK 10240\n// #define PUGIXML_MEMORY_XPATH_PAGE_SIZE 4096\n\n// Uncomment this to switch to header-only version\n//#define PUGIXML_HEADER_ONLY\n\n// Uncomment this to enable long long support\n// #define PUGIXML_HAS_LONG_LONG\n\n#endif\n\n/**\n * Copyright (c) 2006-2015 Arseny Kapoulkine\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/detail/pugixml.LICENSE",
    "content": "/**\n * pugixml parser - version 1.7\n * --------------------------------------------------------\n * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\n * Report bugs and download new versions at http://pugixml.org/\n *\n * This library is distributed under the MIT License.\n *\n * This work is based on the pugxml parser, which is:\n * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)\n *\n *\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/detail/pugixml.cpp",
    "content": "/**\n * pugixml parser - version 1.7\n * --------------------------------------------------------\n * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\n * Report bugs and download new versions at http://pugixml.org/\n *\n * This library is distributed under the MIT License. See notice at the end\n * of this file.\n *\n * This work is based on the pugxml parser, which is:\n * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)\n */\n\n#ifndef SOURCE_PUGIXML_CPP\n#define SOURCE_PUGIXML_CPP\n\n#include \"pugixml.hpp\"\n#include \"Android.hpp\"\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <assert.h>\n#include <limits.h>\n\n// Fix for mingw, even if it should be in limits.h\n#ifndef LLONG_MIN\n#define LLONG_MIN  (-9223372036854775807LL - 1)\n#define LLONG_MAX  9223372036854775807LL\n#define ULLONG_MAX 18446744073709551615ULL\n#endif\n\n#ifdef PUGIXML_WCHAR_MODE\n#\tinclude <wchar.h>\n#endif\n\n#ifndef PUGIXML_NO_XPATH\n#\tinclude <math.h>\n#\tinclude <float.h>\n#\tifdef PUGIXML_NO_EXCEPTIONS\n#\t\tinclude <setjmp.h>\n#\tendif\n#endif\n\n#ifndef PUGIXML_NO_STL\n#\tinclude <istream>\n#\tinclude <ostream>\n#\tinclude <string>\n#endif\n\n// For placement new\n#include <new>\n\n#ifdef _MSC_VER\n#\tpragma warning(push)\n#\tpragma warning(disable: 4127) // conditional expression is constant\n#\tpragma warning(disable: 4324) // structure was padded due to __declspec(align())\n#\tpragma warning(disable: 4611) // interaction between '_setjmp' and C++ object destruction is non-portable\n#\tpragma warning(disable: 4702) // unreachable code\n#\tpragma warning(disable: 4996) // this function or variable may be unsafe\n#\tpragma warning(disable: 4793) // function compiled as native: presence of '_setjmp' makes a function unmanaged\n#endif\n\n#ifdef __INTEL_COMPILER\n#\tpragma warning(disable: 177) // function was declared but never referenced\n#\tpragma warning(disable: 279) // controlling expression is constant\n#\tpragma warning(disable: 1478 1786) // function was declared \"deprecated\"\n#\tpragma warning(disable: 1684) // conversion from pointer to same-sized integral type\n#endif\n\n#if defined(__BORLANDC__) && defined(PUGIXML_HEADER_ONLY)\n#\tpragma warn -8080 // symbol is declared but never used; disabling this inside push/pop bracket does not make the warning go away\n#endif\n\n#ifdef __BORLANDC__\n#\tpragma option push\n#\tpragma warn -8008 // condition is always false\n#\tpragma warn -8066 // unreachable code\n#endif\n\n#ifdef __SNC__\n// Using diag_push/diag_pop does not disable the warnings inside templates due to a compiler bug\n#\tpragma diag_suppress=178 // function was declared but never referenced\n#\tpragma diag_suppress=237 // controlling expression is constant\n#endif\n\n// Inlining controls\n#if defined(_MSC_VER) && _MSC_VER >= 1300\n#\tdefine PUGI__NO_INLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#\tdefine PUGI__NO_INLINE __attribute__((noinline))\n#else\n#\tdefine PUGI__NO_INLINE\n#endif\n\n// Branch weight controls\n#if defined(__GNUC__)\n#\tdefine PUGI__UNLIKELY(cond) __builtin_expect(cond, 0)\n#else\n#\tdefine PUGI__UNLIKELY(cond) (cond)\n#endif\n\n// Simple static assertion\n#define PUGI__STATIC_ASSERT(cond) { static const char condition_failed[(cond) ? 1 : -1] = {0}; (void)condition_failed[0]; }\n\n// Digital Mars C++ bug workaround for passing char loaded from memory via stack\n#ifdef __DMC__\n#\tdefine PUGI__DMC_VOLATILE volatile\n#else\n#\tdefine PUGI__DMC_VOLATILE\n#endif\n\n// Borland C++ bug workaround for not defining ::memcpy depending on header include order (can't always use std::memcpy because some compilers don't have it at all)\n#if defined(__BORLANDC__) && !defined(__MEM_H_USING_LIST)\nusing std::memcpy;\nusing std::memmove;\n#endif\n\n// In some environments MSVC is a compiler but the CRT lacks certain MSVC-specific features\n#if defined(_MSC_VER) && !defined(__S3E__)\n#\tdefine PUGI__MSVC_CRT_VERSION _MSC_VER\n#endif\n\n#ifdef PUGIXML_HEADER_ONLY\n#\tdefine PUGI__NS_BEGIN namespace pugi { namespace impl {\n#\tdefine PUGI__NS_END } }\n#\tdefine PUGI__FN inline\n#\tdefine PUGI__FN_NO_INLINE inline\n#else\n#\tif defined(_MSC_VER) && _MSC_VER < 1300 // MSVC6 seems to have an amusing bug with anonymous namespaces inside namespaces\n#\t\tdefine PUGI__NS_BEGIN namespace pugi { namespace impl {\n#\t\tdefine PUGI__NS_END } }\n#\telse\n#\t\tdefine PUGI__NS_BEGIN namespace pugi { namespace impl { namespace {\n#\t\tdefine PUGI__NS_END } } }\n#\tendif\n#\tdefine PUGI__FN\n#\tdefine PUGI__FN_NO_INLINE PUGI__NO_INLINE\n#endif\n\n// uintptr_t\n#if !defined(_MSC_VER) || _MSC_VER >= 1600\n#\tinclude <stdint.h>\n#else\nnamespace pugi\n{\n#\tifndef _UINTPTR_T_DEFINED\n\ttypedef size_t uintptr_t;\n#\tendif\n\n\ttypedef unsigned __int8 uint8_t;\n\ttypedef unsigned __int16 uint16_t;\n\ttypedef unsigned __int32 uint32_t;\n}\n#endif\n\n// Memory allocation\nPUGI__NS_BEGIN\n\tPUGI__FN void* default_allocate(size_t size)\n\t{\n\t\treturn malloc(size);\n\t}\n\n\tPUGI__FN void default_deallocate(void* ptr)\n\t{\n\t\tfree(ptr);\n\t}\n\n\ttemplate <typename T>\n\tstruct xml_memory_management_function_storage\n\t{\n\t\tstatic allocation_function allocate;\n\t\tstatic deallocation_function deallocate;\n\t};\n\n\t// Global allocation functions are stored in class statics so that in header mode linker deduplicates them\n\t// Without a template<> we'll get multiple definitions of the same static\n\ttemplate <typename T> allocation_function xml_memory_management_function_storage<T>::allocate = default_allocate;\n\ttemplate <typename T> deallocation_function xml_memory_management_function_storage<T>::deallocate = default_deallocate;\n\n\ttypedef xml_memory_management_function_storage<int> xml_memory;\nPUGI__NS_END\n\n// String utilities\nPUGI__NS_BEGIN\n\t// Get string length\n\tPUGI__FN size_t strlength(const char_t* s)\n\t{\n\t\tassert(s);\n\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\treturn wcslen(s);\n\t#else\n\t\treturn strlen(s);\n\t#endif\n\t}\n\n\t// Compare two strings\n\tPUGI__FN bool strequal(const char_t* src, const char_t* dst)\n\t{\n\t\tassert(src && dst);\n\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\treturn wcscmp(src, dst) == 0;\n\t#else\n\t\treturn strcmp(src, dst) == 0;\n\t#endif\n\t}\n\n\t// Compare lhs with [rhs_begin, rhs_end)\n\tPUGI__FN bool strequalrange(const char_t* lhs, const char_t* rhs, size_t count)\n\t{\n\t\tfor (size_t i = 0; i < count; ++i)\n\t\t\tif (lhs[i] != rhs[i])\n\t\t\t\treturn false;\n\n\t\treturn lhs[count] == 0;\n\t}\n\n\t// Get length of wide string, even if CRT lacks wide character support\n\tPUGI__FN size_t strlength_wide(const wchar_t* s)\n\t{\n\t\tassert(s);\n\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\treturn wcslen(s);\n\t#else\n\t\tconst wchar_t* end = s;\n\t\twhile (*end) end++;\n\t\treturn static_cast<size_t>(end - s);\n\t#endif\n\t}\nPUGI__NS_END\n\n// auto_ptr-like object for exception recovery\nPUGI__NS_BEGIN\n\ttemplate <typename T, typename D = void(*)(T*)> struct auto_deleter\n\t{\n\t\tT* data;\n\t\tD deleter;\n\n\t\tauto_deleter(T* data_, D deleter_): data(data_), deleter(deleter_)\n\t\t{\n\t\t}\n\n\t\t~auto_deleter()\n\t\t{\n\t\t\tif (data) deleter(data);\n\t\t}\n\n\t\tT* release()\n\t\t{\n\t\t\tT* result = data;\n\t\t\tdata = 0;\n\t\t\treturn result;\n\t\t}\n\t};\nPUGI__NS_END\n\n#ifdef PUGIXML_COMPACT\nPUGI__NS_BEGIN\n\tclass compact_hash_table\n\t{\n\tpublic:\n\t\tcompact_hash_table(): _items(0), _capacity(0), _count(0)\n\t\t{\n\t\t}\n\n\t\tvoid clear()\n\t\t{\n\t\t\tif (_items)\n\t\t\t{\n\t\t\t\txml_memory::deallocate(_items);\n\t\t\t\t_items = 0;\n\t\t\t\t_capacity = 0;\n\t\t\t\t_count = 0;\n\t\t\t}\n\t\t}\n\n\t\tvoid** find(const void* key)\n\t\t{\n\t\t\tassert(key);\n\n\t\t\tif (_capacity == 0) return 0;\n\n\t\t\tsize_t hashmod = _capacity - 1;\n\t\t\tsize_t bucket = hash(key) & hashmod;\n\n\t\t\tfor (size_t probe = 0; probe <= hashmod; ++probe)\n\t\t\t{\n\t\t\t\titem_t& probe_item = _items[bucket];\n\n\t\t\t\tif (probe_item.key == key)\n\t\t\t\t\treturn &probe_item.value;\n\n\t\t\t\tif (probe_item.key == 0)\n\t\t\t\t\treturn 0;\n\n\t\t\t\t// hash collision, quadratic probing\n\t\t\t\tbucket = (bucket + probe + 1) & hashmod;\n\t\t\t}\n\n\t\t\tassert(!\"Hash table is full\");\n\t\t\treturn 0;\n\t\t}\n\n\t\tvoid** insert(const void* key)\n\t\t{\n\t\t\tassert(key);\n\t\t\tassert(_count < _capacity * 3 / 4);\n\n\t\t\tsize_t hashmod = _capacity - 1;\n\t\t\tsize_t bucket = hash(key) & hashmod;\n\n\t\t\tfor (size_t probe = 0; probe <= hashmod; ++probe)\n\t\t\t{\n\t\t\t\titem_t& probe_item = _items[bucket];\n\n\t\t\t\tif (probe_item.key == 0)\n\t\t\t\t{\n\t\t\t\t\tprobe_item.key = key;\n\t\t\t\t\t_count++;\n\t\t\t\t\treturn &probe_item.value;\n\t\t\t\t}\n\n\t\t\t\tif (probe_item.key == key)\n\t\t\t\t\treturn &probe_item.value;\n\n\t\t\t\t// hash collision, quadratic probing\n\t\t\t\tbucket = (bucket + probe + 1) & hashmod;\n\t\t\t}\n\n\t\t\tassert(!\"Hash table is full\");\n\t\t\treturn 0;\n\t\t}\n\n\t\tbool reserve()\n\t\t{\n\t\t\tif (_count + 16 >= _capacity - _capacity / 4)\n\t\t\t\treturn rehash();\n\n\t\t\treturn true;\n\t\t}\n\n\tprivate:\n\t\tstruct item_t\n\t\t{\n\t\t\tconst void* key;\n\t\t\tvoid* value;\n\t\t};\n\n\t\titem_t* _items;\n\t\tsize_t _capacity;\n\n\t\tsize_t _count;\n\n\t\tbool rehash();\n\n\t\tstatic unsigned int hash(const void* key)\n\t\t{\n\t\t\tunsigned int h = static_cast<unsigned int>(reinterpret_cast<uintptr_t>(key));\n\n\t\t\t// MurmurHash3 32-bit finalizer\n\t\t\th ^= h >> 16;\n\t\t\th *= 0x85ebca6bu;\n\t\t\th ^= h >> 13;\n\t\t\th *= 0xc2b2ae35u;\n\t\t\th ^= h >> 16;\n\n\t\t\treturn h;\n\t\t}\n\t};\n\n\tPUGI__FN_NO_INLINE bool compact_hash_table::rehash()\n\t{\n\t\tcompact_hash_table rt;\n\t\trt._capacity = (_capacity == 0) ? 32 : _capacity * 2;\n\t\trt._items = static_cast<item_t*>(xml_memory::allocate(sizeof(item_t) * rt._capacity));\n\n\t\tif (!rt._items)\n\t\t\treturn false;\n\n\t\tmemset(rt._items, 0, sizeof(item_t) * rt._capacity);\n\n\t\tfor (size_t i = 0; i < _capacity; ++i)\n\t\t\tif (_items[i].key)\n\t\t\t\t*rt.insert(_items[i].key) = _items[i].value;\n\n\t\tif (_items)\n\t\t\txml_memory::deallocate(_items);\n\n\t\t_capacity = rt._capacity;\n\t\t_items = rt._items;\n\n\t\treturn true;\n\t}\n\nPUGI__NS_END\n#endif\n\nPUGI__NS_BEGIN\n\tstatic const size_t xml_memory_page_size =\n\t#ifdef PUGIXML_MEMORY_PAGE_SIZE\n\t\tPUGIXML_MEMORY_PAGE_SIZE\n\t#else\n\t\t32768\n\t#endif\n\t\t;\n\n#ifdef PUGIXML_COMPACT\n\tstatic const uintptr_t xml_memory_block_alignment = 4;\n\n\tstatic const uintptr_t xml_memory_page_alignment = sizeof(void*);\n#else\n\tstatic const uintptr_t xml_memory_block_alignment = sizeof(void*);\n\n\tstatic const uintptr_t xml_memory_page_alignment = 64;\n\tstatic const uintptr_t xml_memory_page_pointer_mask = ~(xml_memory_page_alignment - 1);\n#endif\n\n\t// extra metadata bits\n\tstatic const uintptr_t xml_memory_page_contents_shared_mask = 32;\n\tstatic const uintptr_t xml_memory_page_name_allocated_mask = 16;\n\tstatic const uintptr_t xml_memory_page_value_allocated_mask = 8;\n\tstatic const uintptr_t xml_memory_page_type_mask = 7;\n\n\t// combined masks for string uniqueness\n\tstatic const uintptr_t xml_memory_page_name_allocated_or_shared_mask = xml_memory_page_name_allocated_mask | xml_memory_page_contents_shared_mask;\n\tstatic const uintptr_t xml_memory_page_value_allocated_or_shared_mask = xml_memory_page_value_allocated_mask | xml_memory_page_contents_shared_mask;\n\n#ifdef PUGIXML_COMPACT\n\t#define PUGI__GETPAGE_IMPL(header) (header).get_page()\n#else\n\t#define PUGI__GETPAGE_IMPL(header) reinterpret_cast<impl::xml_memory_page*>((header) & impl::xml_memory_page_pointer_mask)\n#endif\n\n\t#define PUGI__GETPAGE(n) PUGI__GETPAGE_IMPL((n)->header)\n\t#define PUGI__NODETYPE(n) static_cast<xml_node_type>(((n)->header & impl::xml_memory_page_type_mask) + 1)\n\n\tstruct xml_allocator;\n\n\tstruct xml_memory_page\n\t{\n\t\tstatic xml_memory_page* construct(void* memory)\n\t\t{\n\t\t\txml_memory_page* result = static_cast<xml_memory_page*>(memory);\n\n\t\t\tresult->allocator = 0;\n\t\t\tresult->prev = 0;\n\t\t\tresult->next = 0;\n\t\t\tresult->busy_size = 0;\n\t\t\tresult->freed_size = 0;\n\n\t\t#ifdef PUGIXML_COMPACT\n\t\t\tresult->compact_string_base = 0;\n\t\t\tresult->compact_shared_parent = 0;\n\t\t\tresult->compact_page_marker = 0;\n\t\t#endif\n\n\t\t\treturn result;\n\t\t}\n\n\t\txml_allocator* allocator;\n\n\t\txml_memory_page* prev;\n\t\txml_memory_page* next;\n\n\t\tsize_t busy_size;\n\t\tsize_t freed_size;\n\n\t#ifdef PUGIXML_COMPACT\n\t\tchar_t* compact_string_base;\n\t\tvoid* compact_shared_parent;\n\t\tuint32_t* compact_page_marker;\n\t#endif\n\t};\n\n\tstruct xml_memory_string_header\n\t{\n\t\tuint16_t page_offset; // offset from page->data\n\t\tuint16_t full_size; // 0 if string occupies whole page\n\t};\n\n\tstruct xml_allocator\n\t{\n\t\txml_allocator(xml_memory_page* root): _root(root), _busy_size(root->busy_size)\n\t\t{\n\t\t#ifdef PUGIXML_COMPACT\n\t\t\t_hash = 0;\n\t\t#endif\n\t\t}\n\n\t\txml_memory_page* allocate_page(size_t data_size)\n\t\t{\n\t\t\tsize_t size = sizeof(xml_memory_page) + data_size;\n\n\t\t\t// allocate block with some alignment, leaving memory for worst-case padding\n\t\t\tvoid* memory = xml_memory::allocate(size + xml_memory_page_alignment);\n\t\t\tif (!memory) return 0;\n\n\t\t\t// align to next page boundary (note: this guarantees at least 1 usable byte before the page)\n\t\t\tchar* page_memory = reinterpret_cast<char*>((reinterpret_cast<uintptr_t>(memory) + xml_memory_page_alignment) & ~(xml_memory_page_alignment - 1));\n\n\t\t\t// prepare page structure\n\t\t\txml_memory_page* page = xml_memory_page::construct(page_memory);\n\t\t\tassert(page);\n\n\t\t\tpage->allocator = _root->allocator;\n\n\t\t\t// record the offset for freeing the memory block\n\t\t\tassert(page_memory > memory && page_memory - static_cast<char*>(memory) <= 127);\n\t\t\tpage_memory[-1] = static_cast<char>(page_memory - static_cast<char*>(memory));\n\n\t\t\treturn page;\n\t\t}\n\n\t\tstatic void deallocate_page(xml_memory_page* page)\n\t\t{\n\t\t\tchar* page_memory = reinterpret_cast<char*>(page);\n\n\t\t\txml_memory::deallocate(page_memory - page_memory[-1]);\n\t\t}\n\n\t\tvoid* allocate_memory_oob(size_t size, xml_memory_page*& out_page);\n\n\t\tvoid* allocate_memory(size_t size, xml_memory_page*& out_page)\n\t\t{\n\t\t\tif (PUGI__UNLIKELY(_busy_size + size > xml_memory_page_size))\n\t\t\t\treturn allocate_memory_oob(size, out_page);\n\n\t\t\tvoid* buf = reinterpret_cast<char*>(_root) + sizeof(xml_memory_page) + _busy_size;\n\n\t\t\t_busy_size += size;\n\n\t\t\tout_page = _root;\n\n\t\t\treturn buf;\n\t\t}\n\n\t#ifdef PUGIXML_COMPACT\n\t\tvoid* allocate_object(size_t size, xml_memory_page*& out_page)\n\t\t{\n\t\t\tvoid* result = allocate_memory(size + sizeof(uint32_t), out_page);\n\t\t\tif (!result) return 0;\n\n\t\t\t// adjust for marker\n\t\t\tptrdiff_t offset = static_cast<char*>(result) - reinterpret_cast<char*>(out_page->compact_page_marker);\n\n\t\t\tif (PUGI__UNLIKELY(static_cast<uintptr_t>(offset) >= 256 * xml_memory_block_alignment))\n\t\t\t{\n\t\t\t\t// insert new marker\n\t\t\t\tuint32_t* marker = static_cast<uint32_t*>(result);\n\n\t\t\t\t*marker = static_cast<uint32_t>(reinterpret_cast<char*>(marker) - reinterpret_cast<char*>(out_page));\n\t\t\t\tout_page->compact_page_marker = marker;\n\n\t\t\t\t// since we don't reuse the page space until we reallocate it, we can just pretend that we freed the marker block\n\t\t\t\t// this will make sure deallocate_memory correctly tracks the size\n\t\t\t\tout_page->freed_size += sizeof(uint32_t);\n\n\t\t\t\treturn marker + 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// roll back uint32_t part\n\t\t\t\t_busy_size -= sizeof(uint32_t);\n\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t#else\n\t\tvoid* allocate_object(size_t size, xml_memory_page*& out_page)\n\t\t{\n\t\t\treturn allocate_memory(size, out_page);\n\t\t}\n\t#endif\n\n\t\tvoid deallocate_memory(void* ptr, size_t size, xml_memory_page* page)\n\t\t{\n\t\t\tif (page == _root) page->busy_size = _busy_size;\n\n\t\t\tassert(ptr >= reinterpret_cast<char*>(page) + sizeof(xml_memory_page) && ptr < reinterpret_cast<char*>(page) + sizeof(xml_memory_page) + page->busy_size);\n\t\t\t(void)!ptr;\n\n\t\t\tpage->freed_size += size;\n\t\t\tassert(page->freed_size <= page->busy_size);\n\n\t\t\tif (page->freed_size == page->busy_size)\n\t\t\t{\n\t\t\t\tif (page->next == 0)\n\t\t\t\t{\n\t\t\t\t\tassert(_root == page);\n\n\t\t\t\t\t// top page freed, just reset sizes\n\t\t\t\t\tpage->busy_size = 0;\n\t\t\t\t\tpage->freed_size = 0;\n\n\t\t\t\t#ifdef PUGIXML_COMPACT\n\t\t\t\t\t// reset compact state to maximize efficiency\n\t\t\t\t\tpage->compact_string_base = 0;\n\t\t\t\t\tpage->compact_shared_parent = 0;\n\t\t\t\t\tpage->compact_page_marker = 0;\n\t\t\t\t#endif\n\n\t\t\t\t\t_busy_size = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tassert(_root != page);\n\t\t\t\t\tassert(page->prev);\n\n\t\t\t\t\t// remove from the list\n\t\t\t\t\tpage->prev->next = page->next;\n\t\t\t\t\tpage->next->prev = page->prev;\n\n\t\t\t\t\t// deallocate\n\t\t\t\t\tdeallocate_page(page);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tchar_t* allocate_string(size_t length)\n\t\t{\n\t\t\tstatic const size_t max_encoded_offset = (1 << 16) * xml_memory_block_alignment;\n\n\t\t\tPUGI__STATIC_ASSERT(xml_memory_page_size <= max_encoded_offset);\n\n\t\t\t// allocate memory for string and header block\n\t\t\tsize_t size = sizeof(xml_memory_string_header) + length * sizeof(char_t);\n\n\t\t\t// round size up to block alignment boundary\n\t\t\tsize_t full_size = (size + (xml_memory_block_alignment - 1)) & ~(xml_memory_block_alignment - 1);\n\n\t\t\txml_memory_page* page;\n\t\t\txml_memory_string_header* header = static_cast<xml_memory_string_header*>(allocate_memory(full_size, page));\n\n\t\t\tif (!header) return 0;\n\n\t\t\t// setup header\n\t\t\tptrdiff_t page_offset = reinterpret_cast<char*>(header) - reinterpret_cast<char*>(page) - sizeof(xml_memory_page);\n\n\t\t\tassert(page_offset % xml_memory_block_alignment == 0);\n\t\t\tassert(page_offset >= 0 && static_cast<size_t>(page_offset) < max_encoded_offset);\n\t\t\theader->page_offset = static_cast<uint16_t>(static_cast<size_t>(page_offset) / xml_memory_block_alignment);\n\n\t\t\t// full_size == 0 for large strings that occupy the whole page\n\t\t\tassert(full_size % xml_memory_block_alignment == 0);\n\t\t\tassert(full_size < max_encoded_offset || (page->busy_size == full_size && page_offset == 0));\n\t\t\theader->full_size = static_cast<uint16_t>(full_size < max_encoded_offset ? full_size / xml_memory_block_alignment : 0);\n\n\t\t\t// round-trip through void* to avoid 'cast increases required alignment of target type' warning\n\t\t\t// header is guaranteed a pointer-sized alignment, which should be enough for char_t\n\t\t\treturn static_cast<char_t*>(static_cast<void*>(header + 1));\n\t\t}\n\n\t\tvoid deallocate_string(char_t* string)\n\t\t{\n\t\t\t// this function casts pointers through void* to avoid 'cast increases required alignment of target type' warnings\n\t\t\t// we're guaranteed the proper (pointer-sized) alignment on the input string if it was allocated via allocate_string\n\n\t\t\t// get header\n\t\t\txml_memory_string_header* header = static_cast<xml_memory_string_header*>(static_cast<void*>(string)) - 1;\n\t\t\tassert(header);\n\n\t\t\t// deallocate\n\t\t\tsize_t page_offset = sizeof(xml_memory_page) + header->page_offset * xml_memory_block_alignment;\n\t\t\txml_memory_page* page = reinterpret_cast<xml_memory_page*>(static_cast<void*>(reinterpret_cast<char*>(header) - page_offset));\n\n\t\t\t// if full_size == 0 then this string occupies the whole page\n\t\t\tsize_t full_size = header->full_size == 0 ? page->busy_size : header->full_size * xml_memory_block_alignment;\n\n\t\t\tdeallocate_memory(header, full_size, page);\n\t\t}\n\n\t\tbool reserve()\n\t\t{\n\t\t#ifdef PUGIXML_COMPACT\n\t\t\treturn _hash->reserve();\n\t\t#else\n\t\t\treturn true;\n\t\t#endif\n\t\t}\n\n\t\txml_memory_page* _root;\n\t\tsize_t _busy_size;\n\n\t#ifdef PUGIXML_COMPACT\n\t\tcompact_hash_table* _hash;\n\t#endif\n\t};\n\n\tPUGI__FN_NO_INLINE void* xml_allocator::allocate_memory_oob(size_t size, xml_memory_page*& out_page)\n\t{\n\t\tconst size_t large_allocation_threshold = xml_memory_page_size / 4;\n\n\t\txml_memory_page* page = allocate_page(size <= large_allocation_threshold ? xml_memory_page_size : size);\n\t\tout_page = page;\n\n\t\tif (!page) return 0;\n\n\t\tif (size <= large_allocation_threshold)\n\t\t{\n\t\t\t_root->busy_size = _busy_size;\n\n\t\t\t// insert page at the end of linked list\n\t\t\tpage->prev = _root;\n\t\t\t_root->next = page;\n\t\t\t_root = page;\n\n\t\t\t_busy_size = size;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// insert page before the end of linked list, so that it is deleted as soon as possible\n\t\t\t// the last page is not deleted even if it's empty (see deallocate_memory)\n\t\t\tassert(_root->prev);\n\n\t\t\tpage->prev = _root->prev;\n\t\t\tpage->next = _root;\n\n\t\t\t_root->prev->next = page;\n\t\t\t_root->prev = page;\n\n\t\t\tpage->busy_size = size;\n\t\t}\n\n\t\treturn reinterpret_cast<char*>(page) + sizeof(xml_memory_page);\n\t}\nPUGI__NS_END\n\n#ifdef PUGIXML_COMPACT\nPUGI__NS_BEGIN\n\tstatic const uintptr_t compact_alignment_log2 = 2;\n\tstatic const uintptr_t compact_alignment = 1 << compact_alignment_log2;\n\n\tclass compact_header\n\t{\n\tpublic:\n\t\tcompact_header(xml_memory_page* page, unsigned int flags)\n\t\t{\n\t\t\tPUGI__STATIC_ASSERT(xml_memory_block_alignment == compact_alignment);\n\n\t\t\tptrdiff_t offset = (reinterpret_cast<char*>(this) - reinterpret_cast<char*>(page->compact_page_marker));\n\t\t\tassert(offset % compact_alignment == 0 && static_cast<uintptr_t>(offset) < 256 * compact_alignment);\n\n\t\t\t_page = static_cast<unsigned char>(offset >> compact_alignment_log2);\n\t\t\t_flags = static_cast<unsigned char>(flags);\n\t\t}\n\n\t\tvoid operator&=(uintptr_t mod)\n\t\t{\n\t\t\t_flags &= mod;\n\t\t}\n\n\t\tvoid operator|=(uintptr_t mod)\n\t\t{\n\t\t\t_flags |= mod;\n\t\t}\n\n\t\tuintptr_t operator&(uintptr_t mod) const\n\t\t{\n\t\t\treturn _flags & mod;\n\t\t}\n\n\t\txml_memory_page* get_page() const\n\t\t{\n\t\t\tconst char* page_marker = reinterpret_cast<const char*>(this) - (_page << compact_alignment_log2);\n\t\t\tconst char* page = page_marker - *reinterpret_cast<const uint32_t*>(page_marker);\n\n\t\t\treturn const_cast<xml_memory_page*>(reinterpret_cast<const xml_memory_page*>(page));\n\t\t}\n\n\tprivate:\n\t\tunsigned char _page;\n\t\tunsigned char _flags;\n\t};\n\n\tPUGI__FN xml_memory_page* compact_get_page(const void* object, int header_offset)\n\t{\n\t\tconst compact_header* header = reinterpret_cast<const compact_header*>(static_cast<const char*>(object) - header_offset);\n\n\t\treturn header->get_page();\n\t}\n\n\ttemplate <int header_offset, typename T> PUGI__FN_NO_INLINE T* compact_get_value(const void* object)\n\t{\n\t\treturn static_cast<T*>(*compact_get_page(object, header_offset)->allocator->_hash->find(object));\n\t}\n\n\ttemplate <int header_offset, typename T> PUGI__FN_NO_INLINE void compact_set_value(const void* object, T* value)\n\t{\n\t\t*compact_get_page(object, header_offset)->allocator->_hash->insert(object) = value;\n\t}\n\n\ttemplate <typename T, int header_offset, int start = -126> class compact_pointer\n\t{\n\tpublic:\n\t\tcompact_pointer(): _data(0)\n\t\t{\n\t\t}\n\n\t\tvoid operator=(const compact_pointer& rhs)\n\t\t{\n\t\t\t*this = rhs + 0;\n\t\t}\n\n\t\tvoid operator=(T* value)\n\t\t{\n\t\t\tif (value)\n\t\t\t{\n\t\t\t\t// value is guaranteed to be compact-aligned; 'this' is not\n\t\t\t\t// our decoding is based on 'this' aligned to compact alignment downwards (see operator T*)\n\t\t\t\t// so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to\n\t\t\t\t// compensate for arithmetic shift rounding for negative values\n\t\t\t\tptrdiff_t diff = reinterpret_cast<char*>(value) - reinterpret_cast<char*>(this);\n\t\t\t\tptrdiff_t offset = ((diff + int(compact_alignment - 1)) >> compact_alignment_log2) - start;\n\n\t\t\t\tif (static_cast<uintptr_t>(offset) <= 253)\n\t\t\t\t\t_data = static_cast<unsigned char>(offset + 1);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcompact_set_value<header_offset>(this, value);\n\n\t\t\t\t\t_data = 255;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\t_data = 0;\n\t\t}\n\n\t\toperator T*() const\n\t\t{\n\t\t\tif (_data)\n\t\t\t{\n\t\t\t\tif (_data < 255)\n\t\t\t\t{\n\t\t\t\t\tuintptr_t base = reinterpret_cast<uintptr_t>(this) & ~(compact_alignment - 1);\n\n\t\t\t\t\treturn reinterpret_cast<T*>(base + ((_data - 1 + start) << compact_alignment_log2));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn compact_get_value<header_offset, T>(this);\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\n\t\tT* operator->() const\n\t\t{\n\t\t\treturn operator T*();\n\t\t}\n\n\tprivate:\n\t\tunsigned char _data;\n\t};\n\n\ttemplate <typename T, int header_offset> class compact_pointer_parent\n\t{\n\tpublic:\n\t\tcompact_pointer_parent(): _data(0)\n\t\t{\n\t\t}\n\n\t\tvoid operator=(const compact_pointer_parent& rhs)\n\t\t{\n\t\t\t*this = rhs + 0;\n\t\t}\n\n\t\tvoid operator=(T* value)\n\t\t{\n\t\t\tif (value)\n\t\t\t{\n\t\t\t\t// value is guaranteed to be compact-aligned; 'this' is not\n\t\t\t\t// our decoding is based on 'this' aligned to compact alignment downwards (see operator T*)\n\t\t\t\t// so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to\n\t\t\t\t// compensate for arithmetic shift behavior for negative values\n\t\t\t\tptrdiff_t diff = reinterpret_cast<char*>(value) - reinterpret_cast<char*>(this);\n\t\t\t\tptrdiff_t offset = ((diff + int(compact_alignment - 1)) >> compact_alignment_log2) + 65533;\n\n\t\t\t\tif (static_cast<uintptr_t>(offset) <= 65533)\n\t\t\t\t{\n\t\t\t\t\t_data = static_cast<unsigned short>(offset + 1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\txml_memory_page* page = compact_get_page(this, header_offset);\n\n\t\t\t\t\tif (PUGI__UNLIKELY(page->compact_shared_parent == 0))\n\t\t\t\t\t\tpage->compact_shared_parent = value;\n\n\t\t\t\t\tif (page->compact_shared_parent == value)\n\t\t\t\t\t{\n\t\t\t\t\t\t_data = 65534;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tcompact_set_value<header_offset>(this, value);\n\n\t\t\t\t\t\t_data = 65535;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_data = 0;\n\t\t\t}\n\t\t}\n\n\t\toperator T*() const\n\t\t{\n\t\t\tif (_data)\n\t\t\t{\n\t\t\t\tif (_data < 65534)\n\t\t\t\t{\n\t\t\t\t\tuintptr_t base = reinterpret_cast<uintptr_t>(this) & ~(compact_alignment - 1);\n\n\t\t\t\t\treturn reinterpret_cast<T*>(base + ((_data - 1 - 65533) << compact_alignment_log2));\n\t\t\t\t}\n\t\t\t\telse if (_data == 65534)\n\t\t\t\t\treturn static_cast<T*>(compact_get_page(this, header_offset)->compact_shared_parent);\n\t\t\t\telse\n\t\t\t\t\treturn compact_get_value<header_offset, T>(this);\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\n\t\tT* operator->() const\n\t\t{\n\t\t\treturn operator T*();\n\t\t}\n\n\tprivate:\n\t\tuint16_t _data;\n\t};\n\n\ttemplate <int header_offset, int base_offset> class compact_string\n\t{\n\tpublic:\n\t\tcompact_string(): _data(0)\n\t\t{\n\t\t}\n\n\t\tvoid operator=(const compact_string& rhs)\n\t\t{\n\t\t\t*this = rhs + 0;\n\t\t}\n\n\t\tvoid operator=(char_t* value)\n\t\t{\n\t\t\tif (value)\n\t\t\t{\n\t\t\t\txml_memory_page* page = compact_get_page(this, header_offset);\n\n\t\t\t\tif (PUGI__UNLIKELY(page->compact_string_base == 0))\n\t\t\t\t\tpage->compact_string_base = value;\n\n\t\t\t\tptrdiff_t offset = value - page->compact_string_base;\n\n\t\t\t\tif (static_cast<uintptr_t>(offset) < (65535 << 7))\n\t\t\t\t{\n\t\t\t\t\tuint16_t* base = reinterpret_cast<uint16_t*>(reinterpret_cast<char*>(this) - base_offset);\n\n\t\t\t\t\tif (*base == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t*base = static_cast<uint16_t>((offset >> 7) + 1);\n\t\t\t\t\t\t_data = static_cast<unsigned char>((offset & 127) + 1);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tptrdiff_t remainder = offset - ((*base - 1) << 7);\n\n\t\t\t\t\t\tif (static_cast<uintptr_t>(remainder) <= 253)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_data = static_cast<unsigned char>(remainder + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcompact_set_value<header_offset>(this, value);\n\n\t\t\t\t\t\t\t_data = 255;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcompact_set_value<header_offset>(this, value);\n\n\t\t\t\t\t_data = 255;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_data = 0;\n\t\t\t}\n\t\t}\n\n\t\toperator char_t*() const\n\t\t{\n\t\t\tif (_data)\n\t\t\t{\n\t\t\t\tif (_data < 255)\n\t\t\t\t{\n\t\t\t\t\txml_memory_page* page = compact_get_page(this, header_offset);\n\n\t\t\t\t\tconst uint16_t* base = reinterpret_cast<const uint16_t*>(reinterpret_cast<const char*>(this) - base_offset);\n\t\t\t\t\tassert(*base);\n\n\t\t\t\t\tptrdiff_t offset = ((*base - 1) << 7) + (_data - 1);\n\n\t\t\t\t\treturn page->compact_string_base + offset;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn compact_get_value<header_offset, char_t>(this);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\n\tprivate:\n\t\tunsigned char _data;\n\t};\nPUGI__NS_END\n#endif\n\n#ifdef PUGIXML_COMPACT\nnamespace pugi\n{\n\tstruct xml_attribute_struct\n\t{\n\t\txml_attribute_struct(impl::xml_memory_page* page): header(page, 0), namevalue_base(0)\n\t\t{\n\t\t\tPUGI__STATIC_ASSERT(sizeof(xml_attribute_struct) == 8);\n\t\t}\n\n\t\timpl::compact_header header;\n\n\t\tuint16_t namevalue_base;\n\n\t\timpl::compact_string<4, 2> name;\n\t\timpl::compact_string<5, 3> value;\n\n\t\timpl::compact_pointer<xml_attribute_struct, 6> prev_attribute_c;\n\t\timpl::compact_pointer<xml_attribute_struct, 7, 0> next_attribute;\n\t};\n\n\tstruct xml_node_struct\n\t{\n\t\txml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(page, type - 1), namevalue_base(0)\n\t\t{\n\t\t\tPUGI__STATIC_ASSERT(sizeof(xml_node_struct) == 12);\n\t\t}\n\n\t\timpl::compact_header header;\n\n\t\tuint16_t namevalue_base;\n\n\t\timpl::compact_string<4, 2> name;\n\t\timpl::compact_string<5, 3> value;\n\n\t\timpl::compact_pointer_parent<xml_node_struct, 6> parent;\n\n\t\timpl::compact_pointer<xml_node_struct, 8, 0> first_child;\n\n\t\timpl::compact_pointer<xml_node_struct,  9>    prev_sibling_c;\n\t\timpl::compact_pointer<xml_node_struct, 10, 0> next_sibling;\n\n\t\timpl::compact_pointer<xml_attribute_struct, 11, 0> first_attribute;\n\t};\n}\n#else\nnamespace pugi\n{\n\tstruct xml_attribute_struct\n\t{\n\t\txml_attribute_struct(impl::xml_memory_page* page): header(reinterpret_cast<uintptr_t>(page)), name(0), value(0), prev_attribute_c(0), next_attribute(0)\n\t\t{\n\t\t}\n\n\t\tuintptr_t header;\n\n\t\tchar_t*\tname;\n\t\tchar_t*\tvalue;\n\n\t\txml_attribute_struct* prev_attribute_c;\n\t\txml_attribute_struct* next_attribute;\n\t};\n\n\tstruct xml_node_struct\n\t{\n\t\txml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(reinterpret_cast<uintptr_t>(page) | (type - 1)), name(0), value(0), parent(0), first_child(0), prev_sibling_c(0), next_sibling(0), first_attribute(0)\n\t\t{\n\t\t}\n\n\t\tuintptr_t header;\n\n\t\tchar_t* name;\n\t\tchar_t* value;\n\n\t\txml_node_struct* parent;\n\n\t\txml_node_struct* first_child;\n\n\t\txml_node_struct* prev_sibling_c;\n\t\txml_node_struct* next_sibling;\n\n\t\txml_attribute_struct* first_attribute;\n\t};\n}\n#endif\n\nPUGI__NS_BEGIN\n\tstruct xml_extra_buffer\n\t{\n\t\tchar_t* buffer;\n\t\txml_extra_buffer* next;\n\t};\n\n\tstruct xml_document_struct: public xml_node_struct, public xml_allocator\n\t{\n\t\txml_document_struct(xml_memory_page* page): xml_node_struct(page, node_document), xml_allocator(page), buffer(0), extra_buffers(0)\n\t\t{\n\t\t#ifdef PUGIXML_COMPACT\n\t\t\t_hash = &hash;\n\t\t#endif\n\t\t}\n\n\t\tconst char_t* buffer;\n\n\t\txml_extra_buffer* extra_buffers;\n\n\t#ifdef PUGIXML_COMPACT\n\t\tcompact_hash_table hash;\n\t#endif\n\t};\n\n\ttemplate <typename Object> inline xml_allocator& get_allocator(const Object* object)\n\t{\n\t\tassert(object);\n\n\t\treturn *PUGI__GETPAGE(object)->allocator;\n\t}\n\n\ttemplate <typename Object> inline xml_document_struct& get_document(const Object* object)\n\t{\n\t\tassert(object);\n\n\t\treturn *static_cast<xml_document_struct*>(PUGI__GETPAGE(object)->allocator);\n\t}\nPUGI__NS_END\n\n// Low-level DOM operations\nPUGI__NS_BEGIN\n\tinline xml_attribute_struct* allocate_attribute(xml_allocator& alloc)\n\t{\n\t\txml_memory_page* page;\n\t\tvoid* memory = alloc.allocate_object(sizeof(xml_attribute_struct), page);\n\t\tif (!memory) return 0;\n\n\t\treturn new (memory) xml_attribute_struct(page);\n\t}\n\n\tinline xml_node_struct* allocate_node(xml_allocator& alloc, xml_node_type type)\n\t{\n\t\txml_memory_page* page;\n\t\tvoid* memory = alloc.allocate_object(sizeof(xml_node_struct), page);\n\t\tif (!memory) return 0;\n\n\t\treturn new (memory) xml_node_struct(page, type);\n\t}\n\n\tinline void destroy_attribute(xml_attribute_struct* a, xml_allocator& alloc)\n\t{\n\t\tif (a->header & impl::xml_memory_page_name_allocated_mask)\n\t\t\talloc.deallocate_string(a->name);\n\n\t\tif (a->header & impl::xml_memory_page_value_allocated_mask)\n\t\t\talloc.deallocate_string(a->value);\n\n\t\talloc.deallocate_memory(a, sizeof(xml_attribute_struct), PUGI__GETPAGE(a));\n\t}\n\n\tinline void destroy_node(xml_node_struct* n, xml_allocator& alloc)\n\t{\n\t\tif (n->header & impl::xml_memory_page_name_allocated_mask)\n\t\t\talloc.deallocate_string(n->name);\n\n\t\tif (n->header & impl::xml_memory_page_value_allocated_mask)\n\t\t\talloc.deallocate_string(n->value);\n\n\t\tfor (xml_attribute_struct* attr = n->first_attribute; attr; )\n\t\t{\n\t\t\txml_attribute_struct* next = attr->next_attribute;\n\n\t\t\tdestroy_attribute(attr, alloc);\n\n\t\t\tattr = next;\n\t\t}\n\n\t\tfor (xml_node_struct* child = n->first_child; child; )\n\t\t{\n\t\t\txml_node_struct* next = child->next_sibling;\n\n\t\t\tdestroy_node(child, alloc);\n\n\t\t\tchild = next;\n\t\t}\n\n\t\talloc.deallocate_memory(n, sizeof(xml_node_struct), PUGI__GETPAGE(n));\n\t}\n\n\tinline void append_node(xml_node_struct* child, xml_node_struct* node)\n\t{\n\t\tchild->parent = node;\n\n\t\txml_node_struct* head = node->first_child;\n\n\t\tif (head)\n\t\t{\n\t\t\txml_node_struct* tail = head->prev_sibling_c;\n\n\t\t\ttail->next_sibling = child;\n\t\t\tchild->prev_sibling_c = tail;\n\t\t\thead->prev_sibling_c = child;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnode->first_child = child;\n\t\t\tchild->prev_sibling_c = child;\n\t\t}\n\t}\n\n\tinline void prepend_node(xml_node_struct* child, xml_node_struct* node)\n\t{\n\t\tchild->parent = node;\n\n\t\txml_node_struct* head = node->first_child;\n\n\t\tif (head)\n\t\t{\n\t\t\tchild->prev_sibling_c = head->prev_sibling_c;\n\t\t\thead->prev_sibling_c = child;\n\t\t}\n\t\telse\n\t\t\tchild->prev_sibling_c = child;\n\n\t\tchild->next_sibling = head;\n\t\tnode->first_child = child;\n\t}\n\n\tinline void insert_node_after(xml_node_struct* child, xml_node_struct* node)\n\t{\n\t\txml_node_struct* parent = node->parent;\n\n\t\tchild->parent = parent;\n\n\t\tif (node->next_sibling)\n\t\t\tnode->next_sibling->prev_sibling_c = child;\n\t\telse\n\t\t\tparent->first_child->prev_sibling_c = child;\n\n\t\tchild->next_sibling = node->next_sibling;\n\t\tchild->prev_sibling_c = node;\n\n\t\tnode->next_sibling = child;\n\t}\n\n\tinline void insert_node_before(xml_node_struct* child, xml_node_struct* node)\n\t{\n\t\txml_node_struct* parent = node->parent;\n\n\t\tchild->parent = parent;\n\n\t\tif (node->prev_sibling_c->next_sibling)\n\t\t\tnode->prev_sibling_c->next_sibling = child;\n\t\telse\n\t\t\tparent->first_child = child;\n\n\t\tchild->prev_sibling_c = node->prev_sibling_c;\n\t\tchild->next_sibling = node;\n\n\t\tnode->prev_sibling_c = child;\n\t}\n\n\tinline void remove_node(xml_node_struct* node)\n\t{\n\t\txml_node_struct* parent = node->parent;\n\n\t\tif (node->next_sibling)\n\t\t\tnode->next_sibling->prev_sibling_c = node->prev_sibling_c;\n\t\telse\n\t\t\tparent->first_child->prev_sibling_c = node->prev_sibling_c;\n\n\t\tif (node->prev_sibling_c->next_sibling)\n\t\t\tnode->prev_sibling_c->next_sibling = node->next_sibling;\n\t\telse\n\t\t\tparent->first_child = node->next_sibling;\n\n\t\tnode->parent = 0;\n\t\tnode->prev_sibling_c = 0;\n\t\tnode->next_sibling = 0;\n\t}\n\n\tinline void append_attribute(xml_attribute_struct* attr, xml_node_struct* node)\n\t{\n\t\txml_attribute_struct* head = node->first_attribute;\n\n\t\tif (head)\n\t\t{\n\t\t\txml_attribute_struct* tail = head->prev_attribute_c;\n\n\t\t\ttail->next_attribute = attr;\n\t\t\tattr->prev_attribute_c = tail;\n\t\t\thead->prev_attribute_c = attr;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnode->first_attribute = attr;\n\t\t\tattr->prev_attribute_c = attr;\n\t\t}\n\t}\n\n\tinline void prepend_attribute(xml_attribute_struct* attr, xml_node_struct* node)\n\t{\n\t\txml_attribute_struct* head = node->first_attribute;\n\n\t\tif (head)\n\t\t{\n\t\t\tattr->prev_attribute_c = head->prev_attribute_c;\n\t\t\thead->prev_attribute_c = attr;\n\t\t}\n\t\telse\n\t\t\tattr->prev_attribute_c = attr;\n\n\t\tattr->next_attribute = head;\n\t\tnode->first_attribute = attr;\n\t}\n\n\tinline void insert_attribute_after(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node)\n\t{\n\t\tif (place->next_attribute)\n\t\t\tplace->next_attribute->prev_attribute_c = attr;\n\t\telse\n\t\t\tnode->first_attribute->prev_attribute_c = attr;\n\n\t\tattr->next_attribute = place->next_attribute;\n\t\tattr->prev_attribute_c = place;\n\t\tplace->next_attribute = attr;\n\t}\n\n\tinline void insert_attribute_before(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node)\n\t{\n\t\tif (place->prev_attribute_c->next_attribute)\n\t\t\tplace->prev_attribute_c->next_attribute = attr;\n\t\telse\n\t\t\tnode->first_attribute = attr;\n\n\t\tattr->prev_attribute_c = place->prev_attribute_c;\n\t\tattr->next_attribute = place;\n\t\tplace->prev_attribute_c = attr;\n\t}\n\n\tinline void remove_attribute(xml_attribute_struct* attr, xml_node_struct* node)\n\t{\n\t\tif (attr->next_attribute)\n\t\t\tattr->next_attribute->prev_attribute_c = attr->prev_attribute_c;\n\t\telse\n\t\t\tnode->first_attribute->prev_attribute_c = attr->prev_attribute_c;\n\n\t\tif (attr->prev_attribute_c->next_attribute)\n\t\t\tattr->prev_attribute_c->next_attribute = attr->next_attribute;\n\t\telse\n\t\t\tnode->first_attribute = attr->next_attribute;\n\n\t\tattr->prev_attribute_c = 0;\n\t\tattr->next_attribute = 0;\n\t}\n\n\tPUGI__FN_NO_INLINE xml_node_struct* append_new_node(xml_node_struct* node, xml_allocator& alloc, xml_node_type type = node_element)\n\t{\n\t\tif (!alloc.reserve()) return 0;\n\n\t\txml_node_struct* child = allocate_node(alloc, type);\n\t\tif (!child) return 0;\n\n\t\tappend_node(child, node);\n\n\t\treturn child;\n\t}\n\n\tPUGI__FN_NO_INLINE xml_attribute_struct* append_new_attribute(xml_node_struct* node, xml_allocator& alloc)\n\t{\n\t\tif (!alloc.reserve()) return 0;\n\n\t\txml_attribute_struct* attr = allocate_attribute(alloc);\n\t\tif (!attr) return 0;\n\n\t\tappend_attribute(attr, node);\n\n\t\treturn attr;\n\t}\nPUGI__NS_END\n\n// Helper classes for code generation\nPUGI__NS_BEGIN\n\tstruct opt_false\n\t{\n\t\tenum { value = 0 };\n\t};\n\n\tstruct opt_true\n\t{\n\t\tenum { value = 1 };\n\t};\nPUGI__NS_END\n\n// Unicode utilities\nPUGI__NS_BEGIN\n\tinline uint16_t endian_swap(uint16_t value)\n\t{\n\t\treturn static_cast<uint16_t>(((value & 0xff) << 8) | (value >> 8));\n\t}\n\n\tinline uint32_t endian_swap(uint32_t value)\n\t{\n\t\treturn ((value & 0xff) << 24) | ((value & 0xff00) << 8) | ((value & 0xff0000) >> 8) | (value >> 24);\n\t}\n\n\tstruct utf8_counter\n\t{\n\t\ttypedef size_t value_type;\n\n\t\tstatic value_type low(value_type result, uint32_t ch)\n\t\t{\n\t\t\t// U+0000..U+007F\n\t\t\tif (ch < 0x80) return result + 1;\n\t\t\t// U+0080..U+07FF\n\t\t\telse if (ch < 0x800) return result + 2;\n\t\t\t// U+0800..U+FFFF\n\t\t\telse return result + 3;\n\t\t}\n\n\t\tstatic value_type high(value_type result, uint32_t)\n\t\t{\n\t\t\t// U+10000..U+10FFFF\n\t\t\treturn result + 4;\n\t\t}\n\t};\n\n\tstruct utf8_writer\n\t{\n\t\ttypedef uint8_t* value_type;\n\n\t\tstatic value_type low(value_type result, uint32_t ch)\n\t\t{\n\t\t\t// U+0000..U+007F\n\t\t\tif (ch < 0x80)\n\t\t\t{\n\t\t\t\t*result = static_cast<uint8_t>(ch);\n\t\t\t\treturn result + 1;\n\t\t\t}\n\t\t\t// U+0080..U+07FF\n\t\t\telse if (ch < 0x800)\n\t\t\t{\n\t\t\t\tresult[0] = static_cast<uint8_t>(0xC0 | (ch >> 6));\n\t\t\t\tresult[1] = static_cast<uint8_t>(0x80 | (ch & 0x3F));\n\t\t\t\treturn result + 2;\n\t\t\t}\n\t\t\t// U+0800..U+FFFF\n\t\t\telse\n\t\t\t{\n\t\t\t\tresult[0] = static_cast<uint8_t>(0xE0 | (ch >> 12));\n\t\t\t\tresult[1] = static_cast<uint8_t>(0x80 | ((ch >> 6) & 0x3F));\n\t\t\t\tresult[2] = static_cast<uint8_t>(0x80 | (ch & 0x3F));\n\t\t\t\treturn result + 3;\n\t\t\t}\n\t\t}\n\n\t\tstatic value_type high(value_type result, uint32_t ch)\n\t\t{\n\t\t\t// U+10000..U+10FFFF\n\t\t\tresult[0] = static_cast<uint8_t>(0xF0 | (ch >> 18));\n\t\t\tresult[1] = static_cast<uint8_t>(0x80 | ((ch >> 12) & 0x3F));\n\t\t\tresult[2] = static_cast<uint8_t>(0x80 | ((ch >> 6) & 0x3F));\n\t\t\tresult[3] = static_cast<uint8_t>(0x80 | (ch & 0x3F));\n\t\t\treturn result + 4;\n\t\t}\n\n\t\tstatic value_type any(value_type result, uint32_t ch)\n\t\t{\n\t\t\treturn (ch < 0x10000) ? low(result, ch) : high(result, ch);\n\t\t}\n\t};\n\n\tstruct utf16_counter\n\t{\n\t\ttypedef size_t value_type;\n\n\t\tstatic value_type low(value_type result, uint32_t)\n\t\t{\n\t\t\treturn result + 1;\n\t\t}\n\n\t\tstatic value_type high(value_type result, uint32_t)\n\t\t{\n\t\t\treturn result + 2;\n\t\t}\n\t};\n\n\tstruct utf16_writer\n\t{\n\t\ttypedef uint16_t* value_type;\n\n\t\tstatic value_type low(value_type result, uint32_t ch)\n\t\t{\n\t\t\t*result = static_cast<uint16_t>(ch);\n\n\t\t\treturn result + 1;\n\t\t}\n\n\t\tstatic value_type high(value_type result, uint32_t ch)\n\t\t{\n\t\t\tuint32_t msh = static_cast<uint32_t>(ch - 0x10000) >> 10;\n\t\t\tuint32_t lsh = static_cast<uint32_t>(ch - 0x10000) & 0x3ff;\n\n\t\t\tresult[0] = static_cast<uint16_t>(0xD800 + msh);\n\t\t\tresult[1] = static_cast<uint16_t>(0xDC00 + lsh);\n\n\t\t\treturn result + 2;\n\t\t}\n\n\t\tstatic value_type any(value_type result, uint32_t ch)\n\t\t{\n\t\t\treturn (ch < 0x10000) ? low(result, ch) : high(result, ch);\n\t\t}\n\t};\n\n\tstruct utf32_counter\n\t{\n\t\ttypedef size_t value_type;\n\n\t\tstatic value_type low(value_type result, uint32_t)\n\t\t{\n\t\t\treturn result + 1;\n\t\t}\n\n\t\tstatic value_type high(value_type result, uint32_t)\n\t\t{\n\t\t\treturn result + 1;\n\t\t}\n\t};\n\n\tstruct utf32_writer\n\t{\n\t\ttypedef uint32_t* value_type;\n\n\t\tstatic value_type low(value_type result, uint32_t ch)\n\t\t{\n\t\t\t*result = ch;\n\n\t\t\treturn result + 1;\n\t\t}\n\n\t\tstatic value_type high(value_type result, uint32_t ch)\n\t\t{\n\t\t\t*result = ch;\n\n\t\t\treturn result + 1;\n\t\t}\n\n\t\tstatic value_type any(value_type result, uint32_t ch)\n\t\t{\n\t\t\t*result = ch;\n\n\t\t\treturn result + 1;\n\t\t}\n\t};\n\n\tstruct latin1_writer\n\t{\n\t\ttypedef uint8_t* value_type;\n\n\t\tstatic value_type low(value_type result, uint32_t ch)\n\t\t{\n\t\t\t*result = static_cast<uint8_t>(ch > 255 ? '?' : ch);\n\n\t\t\treturn result + 1;\n\t\t}\n\n\t\tstatic value_type high(value_type result, uint32_t ch)\n\t\t{\n\t\t\t(void)ch;\n\n\t\t\t*result = '?';\n\n\t\t\treturn result + 1;\n\t\t}\n\t};\n\n\tstruct utf8_decoder\n\t{\n\t\ttypedef uint8_t type;\n\n\t\ttemplate <typename Traits> static inline typename Traits::value_type process(const uint8_t* data, size_t size, typename Traits::value_type result, Traits)\n\t\t{\n\t\t\tconst uint8_t utf8_byte_mask = 0x3f;\n\n\t\t\twhile (size)\n\t\t\t{\n\t\t\t\tuint8_t lead = *data;\n\n\t\t\t\t// 0xxxxxxx -> U+0000..U+007F\n\t\t\t\tif (lead < 0x80)\n\t\t\t\t{\n\t\t\t\t\tresult = Traits::low(result, lead);\n\t\t\t\t\tdata += 1;\n\t\t\t\t\tsize -= 1;\n\n\t\t\t\t\t// process aligned single-byte (ascii) blocks\n\t\t\t\t\tif ((reinterpret_cast<uintptr_t>(data) & 3) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t// round-trip through void* to silence 'cast increases required alignment of target type' warnings\n\t\t\t\t\t\twhile (size >= 4 && (*static_cast<const uint32_t*>(static_cast<const void*>(data)) & 0x80808080) == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult = Traits::low(result, data[0]);\n\t\t\t\t\t\t\tresult = Traits::low(result, data[1]);\n\t\t\t\t\t\t\tresult = Traits::low(result, data[2]);\n\t\t\t\t\t\t\tresult = Traits::low(result, data[3]);\n\t\t\t\t\t\t\tdata += 4;\n\t\t\t\t\t\t\tsize -= 4;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 110xxxxx -> U+0080..U+07FF\n\t\t\t\telse if (static_cast<unsigned int>(lead - 0xC0) < 0x20 && size >= 2 && (data[1] & 0xc0) == 0x80)\n\t\t\t\t{\n\t\t\t\t\tresult = Traits::low(result, ((lead & ~0xC0) << 6) | (data[1] & utf8_byte_mask));\n\t\t\t\t\tdata += 2;\n\t\t\t\t\tsize -= 2;\n\t\t\t\t}\n\t\t\t\t// 1110xxxx -> U+0800-U+FFFF\n\t\t\t\telse if (static_cast<unsigned int>(lead - 0xE0) < 0x10 && size >= 3 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80)\n\t\t\t\t{\n\t\t\t\t\tresult = Traits::low(result, ((lead & ~0xE0) << 12) | ((data[1] & utf8_byte_mask) << 6) | (data[2] & utf8_byte_mask));\n\t\t\t\t\tdata += 3;\n\t\t\t\t\tsize -= 3;\n\t\t\t\t}\n\t\t\t\t// 11110xxx -> U+10000..U+10FFFF\n\t\t\t\telse if (static_cast<unsigned int>(lead - 0xF0) < 0x08 && size >= 4 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80 && (data[3] & 0xc0) == 0x80)\n\t\t\t\t{\n\t\t\t\t\tresult = Traits::high(result, ((lead & ~0xF0) << 18) | ((data[1] & utf8_byte_mask) << 12) | ((data[2] & utf8_byte_mask) << 6) | (data[3] & utf8_byte_mask));\n\t\t\t\t\tdata += 4;\n\t\t\t\t\tsize -= 4;\n\t\t\t\t}\n\t\t\t\t// 10xxxxxx or 11111xxx -> invalid\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdata += 1;\n\t\t\t\t\tsize -= 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate <typename opt_swap> struct utf16_decoder\n\t{\n\t\ttypedef uint16_t type;\n\n\t\ttemplate <typename Traits> static inline typename Traits::value_type process(const uint16_t* data, size_t size, typename Traits::value_type result, Traits)\n\t\t{\n\t\t\twhile (size)\n\t\t\t{\n\t\t\t\tuint16_t lead = opt_swap::value ? endian_swap(*data) : *data;\n\n\t\t\t\t// U+0000..U+D7FF\n\t\t\t\tif (lead < 0xD800)\n\t\t\t\t{\n\t\t\t\t\tresult = Traits::low(result, lead);\n\t\t\t\t\tdata += 1;\n\t\t\t\t\tsize -= 1;\n\t\t\t\t}\n\t\t\t\t// U+E000..U+FFFF\n\t\t\t\telse if (static_cast<unsigned int>(lead - 0xE000) < 0x2000)\n\t\t\t\t{\n\t\t\t\t\tresult = Traits::low(result, lead);\n\t\t\t\t\tdata += 1;\n\t\t\t\t\tsize -= 1;\n\t\t\t\t}\n\t\t\t\t// surrogate pair lead\n\t\t\t\telse if (static_cast<unsigned int>(lead - 0xD800) < 0x400 && size >= 2)\n\t\t\t\t{\n\t\t\t\t\tuint16_t next = opt_swap::value ? endian_swap(data[1]) : data[1];\n\n\t\t\t\t\tif (static_cast<unsigned int>(next - 0xDC00) < 0x400)\n\t\t\t\t\t{\n\t\t\t\t\t\tresult = Traits::high(result, 0x10000 + ((lead & 0x3ff) << 10) + (next & 0x3ff));\n\t\t\t\t\t\tdata += 2;\n\t\t\t\t\t\tsize -= 2;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdata += 1;\n\t\t\t\t\t\tsize -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdata += 1;\n\t\t\t\t\tsize -= 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate <typename opt_swap> struct utf32_decoder\n\t{\n\t\ttypedef uint32_t type;\n\n\t\ttemplate <typename Traits> static inline typename Traits::value_type process(const uint32_t* data, size_t size, typename Traits::value_type result, Traits)\n\t\t{\n\t\t\twhile (size)\n\t\t\t{\n\t\t\t\tuint32_t lead = opt_swap::value ? endian_swap(*data) : *data;\n\n\t\t\t\t// U+0000..U+FFFF\n\t\t\t\tif (lead < 0x10000)\n\t\t\t\t{\n\t\t\t\t\tresult = Traits::low(result, lead);\n\t\t\t\t\tdata += 1;\n\t\t\t\t\tsize -= 1;\n\t\t\t\t}\n\t\t\t\t// U+10000..U+10FFFF\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tresult = Traits::high(result, lead);\n\t\t\t\t\tdata += 1;\n\t\t\t\t\tsize -= 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tstruct latin1_decoder\n\t{\n\t\ttypedef uint8_t type;\n\n\t\ttemplate <typename Traits> static inline typename Traits::value_type process(const uint8_t* data, size_t size, typename Traits::value_type result, Traits)\n\t\t{\n\t\t\twhile (size)\n\t\t\t{\n\t\t\t\tresult = Traits::low(result, *data);\n\t\t\t\tdata += 1;\n\t\t\t\tsize -= 1;\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate <size_t size> struct wchar_selector;\n\n\ttemplate <> struct wchar_selector<2>\n\t{\n\t\ttypedef uint16_t type;\n\t\ttypedef utf16_counter counter;\n\t\ttypedef utf16_writer writer;\n\t\ttypedef utf16_decoder<opt_false> decoder;\n\t};\n\n\ttemplate <> struct wchar_selector<4>\n\t{\n\t\ttypedef uint32_t type;\n\t\ttypedef utf32_counter counter;\n\t\ttypedef utf32_writer writer;\n\t\ttypedef utf32_decoder<opt_false> decoder;\n\t};\n\n\ttypedef wchar_selector<sizeof(wchar_t)>::counter wchar_counter;\n\ttypedef wchar_selector<sizeof(wchar_t)>::writer wchar_writer;\n\n\tstruct wchar_decoder\n\t{\n\t\ttypedef wchar_t type;\n\n\t\ttemplate <typename Traits> static inline typename Traits::value_type process(const wchar_t* data, size_t size, typename Traits::value_type result, Traits traits)\n\t\t{\n\t\t\ttypedef wchar_selector<sizeof(wchar_t)>::decoder decoder;\n\n\t\t\treturn decoder::process(reinterpret_cast<const typename decoder::type*>(data), size, result, traits);\n\t\t}\n\t};\n\n#ifdef PUGIXML_WCHAR_MODE\n\tPUGI__FN void convert_wchar_endian_swap(wchar_t* result, const wchar_t* data, size_t length)\n\t{\n\t\tfor (size_t i = 0; i < length; ++i)\n\t\t\tresult[i] = static_cast<wchar_t>(endian_swap(static_cast<wchar_selector<sizeof(wchar_t)>::type>(data[i])));\n\t}\n#endif\nPUGI__NS_END\n\nPUGI__NS_BEGIN\n\tenum chartype_t\n\t{\n\t\tct_parse_pcdata = 1,\t// \\0, &, \\r, <\n\t\tct_parse_attr = 2,\t\t// \\0, &, \\r, ', \"\n\t\tct_parse_attr_ws = 4,\t// \\0, &, \\r, ', \", \\n, tab\n\t\tct_space = 8,\t\t\t// \\r, \\n, space, tab\n\t\tct_parse_cdata = 16,\t// \\0, ], >, \\r\n\t\tct_parse_comment = 32,\t// \\0, -, >, \\r\n\t\tct_symbol = 64,\t\t\t// Any symbol > 127, a-z, A-Z, 0-9, _, :, -, .\n\t\tct_start_symbol = 128\t// Any symbol > 127, a-z, A-Z, _, :\n\t};\n\n\tstatic const unsigned char chartype_table[256] =\n\t{\n\t\t55,  0,   0,   0,   0,   0,   0,   0,      0,   12,  12,  0,   0,   63,  0,   0,   // 0-15\n\t\t0,   0,   0,   0,   0,   0,   0,   0,      0,   0,   0,   0,   0,   0,   0,   0,   // 16-31\n\t\t8,   0,   6,   0,   0,   0,   7,   6,      0,   0,   0,   0,   0,   96,  64,  0,   // 32-47\n\t\t64,  64,  64,  64,  64,  64,  64,  64,     64,  64,  192, 0,   1,   0,   48,  0,   // 48-63\n\t\t0,   192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192, // 64-79\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 0,   0,   16,  0,   192, // 80-95\n\t\t0,   192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192, // 96-111\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 0, 0, 0, 0, 0,           // 112-127\n\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192, // 128+\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,\n\t\t192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192\n\t};\n\n\tenum chartypex_t\n\t{\n\t\tctx_special_pcdata = 1,   // Any symbol >= 0 and < 32 (except \\t, \\r, \\n), &, <, >\n\t\tctx_special_attr = 2,     // Any symbol >= 0 and < 32 (except \\t), &, <, >, \"\n\t\tctx_start_symbol = 4,\t  // Any symbol > 127, a-z, A-Z, _\n\t\tctx_digit = 8,\t\t\t  // 0-9\n\t\tctx_symbol = 16\t\t\t  // Any symbol > 127, a-z, A-Z, 0-9, _, -, .\n\t};\n\n\tstatic const unsigned char chartypex_table[256] =\n\t{\n\t\t3,  3,  3,  3,  3,  3,  3,  3,     3,  0,  2,  3,  3,  2,  3,  3,     // 0-15\n\t\t3,  3,  3,  3,  3,  3,  3,  3,     3,  3,  3,  3,  3,  3,  3,  3,     // 16-31\n\t\t0,  0,  2,  0,  0,  0,  3,  0,     0,  0,  0,  0,  0, 16, 16,  0,     // 32-47\n\t\t24, 24, 24, 24, 24, 24, 24, 24,    24, 24, 0,  0,  3,  0,  3,  0,     // 48-63\n\n\t\t0,  20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,    // 64-79\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 0,  0,  0,  0,  20,    // 80-95\n\t\t0,  20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,    // 96-111\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 0,  0,  0,  0,  0,     // 112-127\n\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,    // 128+\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,\n\t\t20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20\n\t};\n\n#ifdef PUGIXML_WCHAR_MODE\n\t#define PUGI__IS_CHARTYPE_IMPL(c, ct, table) ((static_cast<unsigned int>(c) < 128 ? table[static_cast<unsigned int>(c)] : table[128]) & (ct))\n#else\n\t#define PUGI__IS_CHARTYPE_IMPL(c, ct, table) (table[static_cast<unsigned char>(c)] & (ct))\n#endif\n\n\t#define PUGI__IS_CHARTYPE(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartype_table)\n\t#define PUGI__IS_CHARTYPEX(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartypex_table)\n\n\tPUGI__FN bool is_little_endian()\n\t{\n\t\tunsigned int ui = 1;\n\n\t\treturn *reinterpret_cast<unsigned char*>(&ui) == 1;\n\t}\n\n\tPUGI__FN xml_encoding get_wchar_encoding()\n\t{\n\t\tPUGI__STATIC_ASSERT(sizeof(wchar_t) == 2 || sizeof(wchar_t) == 4);\n\n\t\tif (sizeof(wchar_t) == 2)\n\t\t\treturn is_little_endian() ? encoding_utf16_le : encoding_utf16_be;\n\t\telse\n\t\t\treturn is_little_endian() ? encoding_utf32_le : encoding_utf32_be;\n\t}\n\n\tPUGI__FN xml_encoding guess_buffer_encoding(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)\n\t{\n\t\t// look for BOM in first few bytes\n\t\tif (d0 == 0 && d1 == 0 && d2 == 0xfe && d3 == 0xff) return encoding_utf32_be;\n\t\tif (d0 == 0xff && d1 == 0xfe && d2 == 0 && d3 == 0) return encoding_utf32_le;\n\t\tif (d0 == 0xfe && d1 == 0xff) return encoding_utf16_be;\n\t\tif (d0 == 0xff && d1 == 0xfe) return encoding_utf16_le;\n\t\tif (d0 == 0xef && d1 == 0xbb && d2 == 0xbf) return encoding_utf8;\n\n\t\t// look for <, <? or <?xm in various encodings\n\t\tif (d0 == 0 && d1 == 0 && d2 == 0 && d3 == 0x3c) return encoding_utf32_be;\n\t\tif (d0 == 0x3c && d1 == 0 && d2 == 0 && d3 == 0) return encoding_utf32_le;\n\t\tif (d0 == 0 && d1 == 0x3c && d2 == 0 && d3 == 0x3f) return encoding_utf16_be;\n\t\tif (d0 == 0x3c && d1 == 0 && d2 == 0x3f && d3 == 0) return encoding_utf16_le;\n\t\tif (d0 == 0x3c && d1 == 0x3f && d2 == 0x78 && d3 == 0x6d) return encoding_utf8;\n\n\t\t// look for utf16 < followed by node name (this may fail, but is better than utf8 since it's zero terminated so early)\n\t\tif (d0 == 0 && d1 == 0x3c) return encoding_utf16_be;\n\t\tif (d0 == 0x3c && d1 == 0) return encoding_utf16_le;\n\n\t\t// no known BOM detected, assume utf8\n\t\treturn encoding_utf8;\n\t}\n\n\tPUGI__FN xml_encoding get_buffer_encoding(xml_encoding encoding, const void* contents, size_t size)\n\t{\n\t\t// replace wchar encoding with utf implementation\n\t\tif (encoding == encoding_wchar) return get_wchar_encoding();\n\n\t\t// replace utf16 encoding with utf16 with specific endianness\n\t\tif (encoding == encoding_utf16) return is_little_endian() ? encoding_utf16_le : encoding_utf16_be;\n\n\t\t// replace utf32 encoding with utf32 with specific endianness\n\t\tif (encoding == encoding_utf32) return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;\n\n\t\t// only do autodetection if no explicit encoding is requested\n\t\tif (encoding != encoding_auto) return encoding;\n\n\t\t// skip encoding autodetection if input buffer is too small\n\t\tif (size < 4) return encoding_utf8;\n\n\t\t// try to guess encoding (based on XML specification, Appendix F.1)\n\t\tconst uint8_t* data = static_cast<const uint8_t*>(contents);\n\n\t\tPUGI__DMC_VOLATILE uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3];\n\n\t\treturn guess_buffer_encoding(d0, d1, d2, d3);\n\t}\n\n\tPUGI__FN bool get_mutable_buffer(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)\n\t{\n\t\tsize_t length = size / sizeof(char_t);\n\n\t\tif (is_mutable)\n\t\t{\n\t\t\tout_buffer = static_cast<char_t*>(const_cast<void*>(contents));\n\t\t\tout_length = length;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tchar_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));\n\t\t\tif (!buffer) return false;\n\n\t\t\tif (contents)\n\t\t\t\tmemcpy(buffer, contents, length * sizeof(char_t));\n\t\t\telse\n\t\t\t\tassert(length == 0);\n\n\t\t\tbuffer[length] = 0;\n\n\t\t\tout_buffer = buffer;\n\t\t\tout_length = length + 1;\n\t\t}\n\n\t\treturn true;\n\t}\n\n#ifdef PUGIXML_WCHAR_MODE\n\tPUGI__FN bool need_endian_swap_utf(xml_encoding le, xml_encoding re)\n\t{\n\t\treturn (le == encoding_utf16_be && re == encoding_utf16_le) || (le == encoding_utf16_le && re == encoding_utf16_be) ||\n\t\t\t   (le == encoding_utf32_be && re == encoding_utf32_le) || (le == encoding_utf32_le && re == encoding_utf32_be);\n\t}\n\n\tPUGI__FN bool convert_buffer_endian_swap(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)\n\t{\n\t\tconst char_t* data = static_cast<const char_t*>(contents);\n\t\tsize_t length = size / sizeof(char_t);\n\n\t\tif (is_mutable)\n\t\t{\n\t\t\tchar_t* buffer = const_cast<char_t*>(data);\n\n\t\t\tconvert_wchar_endian_swap(buffer, data, length);\n\n\t\t\tout_buffer = buffer;\n\t\t\tout_length = length;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tchar_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));\n\t\t\tif (!buffer) return false;\n\n\t\t\tconvert_wchar_endian_swap(buffer, data, length);\n\t\t\tbuffer[length] = 0;\n\n\t\t\tout_buffer = buffer;\n\t\t\tout_length = length + 1;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttemplate <typename D> PUGI__FN bool convert_buffer_generic(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, D)\n\t{\n\t\tconst typename D::type* data = static_cast<const typename D::type*>(contents);\n\t\tsize_t data_length = size / sizeof(typename D::type);\n\n\t\t// first pass: get length in wchar_t units\n\t\tsize_t length = D::process(data, data_length, 0, wchar_counter());\n\n\t\t// allocate buffer of suitable length\n\t\tchar_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));\n\t\tif (!buffer) return false;\n\n\t\t// second pass: convert utf16 input to wchar_t\n\t\twchar_writer::value_type obegin = reinterpret_cast<wchar_writer::value_type>(buffer);\n\t\twchar_writer::value_type oend = D::process(data, data_length, obegin, wchar_writer());\n\n\t\tassert(oend == obegin + length);\n\t\t*oend = 0;\n\n\t\tout_buffer = buffer;\n\t\tout_length = length + 1;\n\n\t\treturn true;\n\t}\n\n\tPUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable)\n\t{\n\t\t// get native encoding\n\t\txml_encoding wchar_encoding = get_wchar_encoding();\n\n\t\t// fast path: no conversion required\n\t\tif (encoding == wchar_encoding)\n\t\t\treturn get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable);\n\n\t\t// only endian-swapping is required\n\t\tif (need_endian_swap_utf(encoding, wchar_encoding))\n\t\t\treturn convert_buffer_endian_swap(out_buffer, out_length, contents, size, is_mutable);\n\n\t\t// source encoding is utf8\n\t\tif (encoding == encoding_utf8)\n\t\t\treturn convert_buffer_generic(out_buffer, out_length, contents, size, utf8_decoder());\n\n\t\t// source encoding is utf16\n\t\tif (encoding == encoding_utf16_be || encoding == encoding_utf16_le)\n\t\t{\n\t\t\txml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;\n\n\t\t\treturn (native_encoding == encoding) ?\n\t\t\t\tconvert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder<opt_false>()) :\n\t\t\t\tconvert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder<opt_true>());\n\t\t}\n\n\t\t// source encoding is utf32\n\t\tif (encoding == encoding_utf32_be || encoding == encoding_utf32_le)\n\t\t{\n\t\t\txml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;\n\n\t\t\treturn (native_encoding == encoding) ?\n\t\t\t\tconvert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder<opt_false>()) :\n\t\t\t\tconvert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder<opt_true>());\n\t\t}\n\n\t\t// source encoding is latin1\n\t\tif (encoding == encoding_latin1)\n\t\t\treturn convert_buffer_generic(out_buffer, out_length, contents, size, latin1_decoder());\n\n\t\tassert(!\"Invalid encoding\");\n\t\treturn false;\n\t}\n#else\n\ttemplate <typename D> PUGI__FN bool convert_buffer_generic(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, D)\n\t{\n\t\tconst typename D::type* data = static_cast<const typename D::type*>(contents);\n\t\tsize_t data_length = size / sizeof(typename D::type);\n\n\t\t// first pass: get length in utf8 units\n\t\tsize_t length = D::process(data, data_length, 0, utf8_counter());\n\n\t\t// allocate buffer of suitable length\n\t\tchar_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));\n\t\tif (!buffer) return false;\n\n\t\t// second pass: convert utf16 input to utf8\n\t\tuint8_t* obegin = reinterpret_cast<uint8_t*>(buffer);\n\t\tuint8_t* oend = D::process(data, data_length, obegin, utf8_writer());\n\n\t\tassert(oend == obegin + length);\n\t\t*oend = 0;\n\n\t\tout_buffer = buffer;\n\t\tout_length = length + 1;\n\n\t\treturn true;\n\t}\n\n\tPUGI__FN size_t get_latin1_7bit_prefix_length(const uint8_t* data, size_t size)\n\t{\n\t\tfor (size_t i = 0; i < size; ++i)\n\t\t\tif (data[i] > 127)\n\t\t\t\treturn i;\n\n\t\treturn size;\n\t}\n\n\tPUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)\n\t{\n\t\tconst uint8_t* data = static_cast<const uint8_t*>(contents);\n\t\tsize_t data_length = size;\n\n\t\t// get size of prefix that does not need utf8 conversion\n\t\tsize_t prefix_length = get_latin1_7bit_prefix_length(data, data_length);\n\t\tassert(prefix_length <= data_length);\n\n\t\tconst uint8_t* postfix = data + prefix_length;\n\t\tsize_t postfix_length = data_length - prefix_length;\n\n\t\t// if no conversion is needed, just return the original buffer\n\t\tif (postfix_length == 0) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable);\n\n\t\t// first pass: get length in utf8 units\n\t\tsize_t length = prefix_length + latin1_decoder::process(postfix, postfix_length, 0, utf8_counter());\n\n\t\t// allocate buffer of suitable length\n\t\tchar_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));\n\t\tif (!buffer) return false;\n\n\t\t// second pass: convert latin1 input to utf8\n\t\tmemcpy(buffer, data, prefix_length);\n\n\t\tuint8_t* obegin = reinterpret_cast<uint8_t*>(buffer);\n\t\tuint8_t* oend = latin1_decoder::process(postfix, postfix_length, obegin + prefix_length, utf8_writer());\n\n\t\tassert(oend == obegin + length);\n\t\t*oend = 0;\n\n\t\tout_buffer = buffer;\n\t\tout_length = length + 1;\n\n\t\treturn true;\n\t}\n\n\tPUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable)\n\t{\n\t\t// fast path: no conversion required\n\t\tif (encoding == encoding_utf8)\n\t\t\treturn get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable);\n\n\t\t// source encoding is utf16\n\t\tif (encoding == encoding_utf16_be || encoding == encoding_utf16_le)\n\t\t{\n\t\t\txml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;\n\n\t\t\treturn (native_encoding == encoding) ?\n\t\t\t\tconvert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder<opt_false>()) :\n\t\t\t\tconvert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder<opt_true>());\n\t\t}\n\n\t\t// source encoding is utf32\n\t\tif (encoding == encoding_utf32_be || encoding == encoding_utf32_le)\n\t\t{\n\t\t\txml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;\n\n\t\t\treturn (native_encoding == encoding) ?\n\t\t\t\tconvert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder<opt_false>()) :\n\t\t\t\tconvert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder<opt_true>());\n\t\t}\n\n\t\t// source encoding is latin1\n\t\tif (encoding == encoding_latin1)\n\t\t\treturn convert_buffer_latin1(out_buffer, out_length, contents, size, is_mutable);\n\n\t\tassert(!\"Invalid encoding\");\n\t\treturn false;\n\t}\n#endif\n\n\tPUGI__FN size_t as_utf8_begin(const wchar_t* str, size_t length)\n\t{\n\t\t// get length in utf8 characters\n\t\treturn wchar_decoder::process(str, length, 0, utf8_counter());\n\t}\n\n\tPUGI__FN void as_utf8_end(char* buffer, size_t size, const wchar_t* str, size_t length)\n\t{\n\t\t// convert to utf8\n\t\tuint8_t* begin = reinterpret_cast<uint8_t*>(buffer);\n\t\tuint8_t* end = wchar_decoder::process(str, length, begin, utf8_writer());\n\n\t\tassert(begin + size == end);\n\t\t(void)!end;\n\t\t(void)!size;\n\t}\n\n#ifndef PUGIXML_NO_STL\n\tPUGI__FN std::string as_utf8_impl(const wchar_t* str, size_t length)\n\t{\n\t\t// first pass: get length in utf8 characters\n\t\tsize_t size = as_utf8_begin(str, length);\n\n\t\t// allocate resulting string\n\t\tstd::string result;\n\t\tresult.resize(size);\n\n\t\t// second pass: convert to utf8\n\t\tif (size > 0) as_utf8_end(&result[0], size, str, length);\n\n\t\treturn result;\n\t}\n\n\tPUGI__FN std::basic_string<wchar_t> as_wide_impl(const char* str, size_t size)\n\t{\n\t\tconst uint8_t* data = reinterpret_cast<const uint8_t*>(str);\n\n\t\t// first pass: get length in wchar_t units\n\t\tsize_t length = utf8_decoder::process(data, size, 0, wchar_counter());\n\n\t\t// allocate resulting string\n\t\tstd::basic_string<wchar_t> result;\n\t\tresult.resize(length);\n\n\t\t// second pass: convert to wchar_t\n\t\tif (length > 0)\n\t\t{\n\t\t\twchar_writer::value_type begin = reinterpret_cast<wchar_writer::value_type>(&result[0]);\n\t\t\twchar_writer::value_type end = utf8_decoder::process(data, size, begin, wchar_writer());\n\n\t\t\tassert(begin + length == end);\n\t\t\t(void)!end;\n\t\t}\n\n\t\treturn result;\n\t}\n#endif\n\n\ttemplate <typename Header>\n\tinline bool strcpy_insitu_allow(size_t length, const Header& header, uintptr_t header_mask, char_t* target)\n\t{\n\t\t// never reuse shared memory\n\t\tif (header & xml_memory_page_contents_shared_mask) return false;\n\n\t\tsize_t target_length = strlength(target);\n\n\t\t// always reuse document buffer memory if possible\n\t\tif ((header & header_mask) == 0) return target_length >= length;\n\n\t\t// reuse heap memory if waste is not too great\n\t\tconst size_t reuse_threshold = 32;\n\n\t\treturn target_length >= length && (target_length < reuse_threshold || target_length - length < target_length / 2);\n\t}\n\n\ttemplate <typename String, typename Header>\n\tPUGI__FN bool strcpy_insitu(String& dest, Header& header, uintptr_t header_mask, const char_t* source, size_t source_length)\n\t{\n\t\tif (source_length == 0)\n\t\t{\n\t\t\t// empty string and null pointer are equivalent, so just deallocate old memory\n\t\t\txml_allocator* alloc = PUGI__GETPAGE_IMPL(header)->allocator;\n\n\t\t\tif (header & header_mask) alloc->deallocate_string(dest);\n\n\t\t\t// mark the string as not allocated\n\t\t\tdest = 0;\n\t\t\theader &= ~header_mask;\n\n\t\t\treturn true;\n\t\t}\n\t\telse if (dest && strcpy_insitu_allow(source_length, header, header_mask, dest))\n\t\t{\n\t\t\t// we can reuse old buffer, so just copy the new data (including zero terminator)\n\t\t\tmemcpy(dest, source, source_length * sizeof(char_t));\n\t\t\tdest[source_length] = 0;\n\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\txml_allocator* alloc = PUGI__GETPAGE_IMPL(header)->allocator;\n\n\t\t\tif (!alloc->reserve()) return false;\n\n\t\t\t// allocate new buffer\n\t\t\tchar_t* buf = alloc->allocate_string(source_length + 1);\n\t\t\tif (!buf) return false;\n\n\t\t\t// copy the string (including zero terminator)\n\t\t\tmemcpy(buf, source, source_length * sizeof(char_t));\n\t\t\tbuf[source_length] = 0;\n\n\t\t\t// deallocate old buffer (*after* the above to protect against overlapping memory and/or allocation failures)\n\t\t\tif (header & header_mask) alloc->deallocate_string(dest);\n\n\t\t\t// the string is now allocated, so set the flag\n\t\t\tdest = buf;\n\t\t\theader |= header_mask;\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tstruct gap\n\t{\n\t\tchar_t* end;\n\t\tsize_t size;\n\n\t\tgap(): end(0), size(0)\n\t\t{\n\t\t}\n\n\t\t// Push new gap, move s count bytes further (skipping the gap).\n\t\t// Collapse previous gap.\n\t\tvoid push(char_t*& s, size_t count)\n\t\t{\n\t\t\tif (end) // there was a gap already; collapse it\n\t\t\t{\n\t\t\t\t// Move [old_gap_end, new_gap_start) to [old_gap_start, ...)\n\t\t\t\tassert(s >= end);\n\t\t\t\tmemmove(end - size, end, reinterpret_cast<char*>(s) - reinterpret_cast<char*>(end));\n\t\t\t}\n\n\t\t\ts += count; // end of current gap\n\n\t\t\t// \"merge\" two gaps\n\t\t\tend = s;\n\t\t\tsize += count;\n\t\t}\n\n\t\t// Collapse all gaps, return past-the-end pointer\n\t\tchar_t* flush(char_t* s)\n\t\t{\n\t\t\tif (end)\n\t\t\t{\n\t\t\t\t// Move [old_gap_end, current_pos) to [old_gap_start, ...)\n\t\t\t\tassert(s >= end);\n\t\t\t\tmemmove(end - size, end, reinterpret_cast<char*>(s) - reinterpret_cast<char*>(end));\n\n\t\t\t\treturn s - size;\n\t\t\t}\n\t\t\telse return s;\n\t\t}\n\t};\n\n\tPUGI__FN char_t* strconv_escape(char_t* s, gap& g)\n\t{\n\t\tchar_t* stre = s + 1;\n\n\t\tswitch (*stre)\n\t\t{\n\t\t\tcase '#':\t// &#...\n\t\t\t{\n\t\t\t\tunsigned int ucsc = 0;\n\n\t\t\t\tif (stre[1] == 'x') // &#x... (hex code)\n\t\t\t\t{\n\t\t\t\t\tstre += 2;\n\n\t\t\t\t\tchar_t ch = *stre;\n\n\t\t\t\t\tif (ch == ';') return stre;\n\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (static_cast<unsigned int>(ch - '0') <= 9)\n\t\t\t\t\t\t\tucsc = 16 * ucsc + (ch - '0');\n\t\t\t\t\t\telse if (static_cast<unsigned int>((ch | ' ') - 'a') <= 5)\n\t\t\t\t\t\t\tucsc = 16 * ucsc + ((ch | ' ') - 'a' + 10);\n\t\t\t\t\t\telse if (ch == ';')\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\telse // cancel\n\t\t\t\t\t\t\treturn stre;\n\n\t\t\t\t\t\tch = *++stre;\n\t\t\t\t\t}\n\n\t\t\t\t\t++stre;\n\t\t\t\t}\n\t\t\t\telse\t// &#... (dec code)\n\t\t\t\t{\n\t\t\t\t\tchar_t ch = *++stre;\n\n\t\t\t\t\tif (ch == ';') return stre;\n\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (static_cast<unsigned int>(static_cast<unsigned int>(ch) - '0') <= 9)\n\t\t\t\t\t\t\tucsc = 10 * ucsc + (ch - '0');\n\t\t\t\t\t\telse if (ch == ';')\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\telse // cancel\n\t\t\t\t\t\t\treturn stre;\n\n\t\t\t\t\t\tch = *++stre;\n\t\t\t\t\t}\n\n\t\t\t\t\t++stre;\n\t\t\t\t}\n\n\t\t\t#ifdef PUGIXML_WCHAR_MODE\n\t\t\t\ts = reinterpret_cast<char_t*>(wchar_writer::any(reinterpret_cast<wchar_writer::value_type>(s), ucsc));\n\t\t\t#else\n\t\t\t\ts = reinterpret_cast<char_t*>(utf8_writer::any(reinterpret_cast<uint8_t*>(s), ucsc));\n\t\t\t#endif\n\n\t\t\t\tg.push(s, stre - s);\n\t\t\t\treturn stre;\n\t\t\t}\n\n\t\t\tcase 'a':\t// &a\n\t\t\t{\n\t\t\t\t++stre;\n\n\t\t\t\tif (*stre == 'm') // &am\n\t\t\t\t{\n\t\t\t\t\tif (*++stre == 'p' && *++stre == ';') // &amp;\n\t\t\t\t\t{\n\t\t\t\t\t\t*s++ = '&';\n\t\t\t\t\t\t++stre;\n\n\t\t\t\t\t\tg.push(s, stre - s);\n\t\t\t\t\t\treturn stre;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (*stre == 'p') // &ap\n\t\t\t\t{\n\t\t\t\t\tif (*++stre == 'o' && *++stre == 's' && *++stre == ';') // &apos;\n\t\t\t\t\t{\n\t\t\t\t\t\t*s++ = '\\'';\n\t\t\t\t\t\t++stre;\n\n\t\t\t\t\t\tg.push(s, stre - s);\n\t\t\t\t\t\treturn stre;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'g': // &g\n\t\t\t{\n\t\t\t\tif (*++stre == 't' && *++stre == ';') // &gt;\n\t\t\t\t{\n\t\t\t\t\t*s++ = '>';\n\t\t\t\t\t++stre;\n\n\t\t\t\t\tg.push(s, stre - s);\n\t\t\t\t\treturn stre;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'l': // &l\n\t\t\t{\n\t\t\t\tif (*++stre == 't' && *++stre == ';') // &lt;\n\t\t\t\t{\n\t\t\t\t\t*s++ = '<';\n\t\t\t\t\t++stre;\n\n\t\t\t\t\tg.push(s, stre - s);\n\t\t\t\t\treturn stre;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'q': // &q\n\t\t\t{\n\t\t\t\tif (*++stre == 'u' && *++stre == 'o' && *++stre == 't' && *++stre == ';') // &quot;\n\t\t\t\t{\n\t\t\t\t\t*s++ = '\"';\n\t\t\t\t\t++stre;\n\n\t\t\t\t\tg.push(s, stre - s);\n\t\t\t\t\treturn stre;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn stre;\n\t}\n\n\t// Parser utilities\n\t#define PUGI__ENDSWITH(c, e)        ((c) == (e) || ((c) == 0 && endch == (e)))\n\t#define PUGI__SKIPWS()              { while (PUGI__IS_CHARTYPE(*s, ct_space)) ++s; }\n\t#define PUGI__OPTSET(OPT)           ( optmsk & (OPT) )\n\t#define PUGI__PUSHNODE(TYPE)        { cursor = append_new_node(cursor, alloc, TYPE); if (!cursor) PUGI__THROW_ERROR(status_out_of_memory, s); }\n\t#define PUGI__POPNODE()             { cursor = cursor->parent; }\n\t#define PUGI__SCANFOR(X)            { while (*s != 0 && !(X)) ++s; }\n\t#define PUGI__SCANWHILE(X)          { while (X) ++s; }\n\t#define PUGI__SCANWHILE_UNROLL(X)   { for (;;) { char_t ss = s[0]; if (PUGI__UNLIKELY(!(X))) { break; } ss = s[1]; if (PUGI__UNLIKELY(!(X))) { s += 1; break; } ss = s[2]; if (PUGI__UNLIKELY(!(X))) { s += 2; break; } ss = s[3]; if (PUGI__UNLIKELY(!(X))) { s += 3; break; } s += 4; } }\n\t#define PUGI__ENDSEG()              { ch = *s; *s = 0; ++s; }\n\t#define PUGI__THROW_ERROR(err, m)   return error_offset = m, error_status = err, static_cast<char_t*>(0)\n\t#define PUGI__CHECK_ERROR(err, m)   { if (*s == 0) PUGI__THROW_ERROR(err, m); }\n\n\tPUGI__FN char_t* strconv_comment(char_t* s, char_t endch)\n\t{\n\t\tgap g;\n\n\t\twhile (true)\n\t\t{\n\t\t\tPUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_comment));\n\n\t\t\tif (*s == '\\r') // Either a single 0x0d or 0x0d 0x0a pair\n\t\t\t{\n\t\t\t\t*s++ = '\\n'; // replace first one with 0x0a\n\n\t\t\t\tif (*s == '\\n') g.push(s, 1);\n\t\t\t}\n\t\t\telse if (s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>')) // comment ends here\n\t\t\t{\n\t\t\t\t*g.flush(s) = 0;\n\n\t\t\t\treturn s + (s[2] == '>' ? 3 : 2);\n\t\t\t}\n\t\t\telse if (*s == 0)\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse ++s;\n\t\t}\n\t}\n\n\tPUGI__FN char_t* strconv_cdata(char_t* s, char_t endch)\n\t{\n\t\tgap g;\n\n\t\twhile (true)\n\t\t{\n\t\t\tPUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_cdata));\n\n\t\t\tif (*s == '\\r') // Either a single 0x0d or 0x0d 0x0a pair\n\t\t\t{\n\t\t\t\t*s++ = '\\n'; // replace first one with 0x0a\n\n\t\t\t\tif (*s == '\\n') g.push(s, 1);\n\t\t\t}\n\t\t\telse if (s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')) // CDATA ends here\n\t\t\t{\n\t\t\t\t*g.flush(s) = 0;\n\n\t\t\t\treturn s + 1;\n\t\t\t}\n\t\t\telse if (*s == 0)\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse ++s;\n\t\t}\n\t}\n\n\ttypedef char_t* (*strconv_pcdata_t)(char_t*);\n\n\ttemplate <typename opt_trim, typename opt_eol, typename opt_escape> struct strconv_pcdata_impl\n\t{\n\t\tstatic char_t* parse(char_t* s)\n\t\t{\n\t\t\tgap g;\n\n\t\t\tchar_t* begin = s;\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tPUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_pcdata));\n\n\t\t\t\tif (*s == '<') // PCDATA ends here\n\t\t\t\t{\n\t\t\t\t\tchar_t* end = g.flush(s);\n\n\t\t\t\t\tif (opt_trim::value)\n\t\t\t\t\t\twhile (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space))\n\t\t\t\t\t\t\t--end;\n\n\t\t\t\t\t*end = 0;\n\n\t\t\t\t\treturn s + 1;\n\t\t\t\t}\n\t\t\t\telse if (opt_eol::value && *s == '\\r') // Either a single 0x0d or 0x0d 0x0a pair\n\t\t\t\t{\n\t\t\t\t\t*s++ = '\\n'; // replace first one with 0x0a\n\n\t\t\t\t\tif (*s == '\\n') g.push(s, 1);\n\t\t\t\t}\n\t\t\t\telse if (opt_escape::value && *s == '&')\n\t\t\t\t{\n\t\t\t\t\ts = strconv_escape(s, g);\n\t\t\t\t}\n\t\t\t\telse if (*s == 0)\n\t\t\t\t{\n\t\t\t\t\tchar_t* end = g.flush(s);\n\n\t\t\t\t\tif (opt_trim::value)\n\t\t\t\t\t\twhile (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space))\n\t\t\t\t\t\t\t--end;\n\n\t\t\t\t\t*end = 0;\n\n\t\t\t\t\treturn s;\n\t\t\t\t}\n\t\t\t\telse ++s;\n\t\t\t}\n\t\t}\n\t};\n\n\tPUGI__FN strconv_pcdata_t get_strconv_pcdata(unsigned int optmask)\n\t{\n\t\tPUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_trim_pcdata == 0x0800);\n\n\t\tswitch (((optmask >> 4) & 3) | ((optmask >> 9) & 4)) // get bitmask for flags (eol escapes trim)\n\t\t{\n\t\tcase 0: return strconv_pcdata_impl<opt_false, opt_false, opt_false>::parse;\n\t\tcase 1: return strconv_pcdata_impl<opt_false, opt_false, opt_true>::parse;\n\t\tcase 2: return strconv_pcdata_impl<opt_false, opt_true, opt_false>::parse;\n\t\tcase 3: return strconv_pcdata_impl<opt_false, opt_true, opt_true>::parse;\n\t\tcase 4: return strconv_pcdata_impl<opt_true, opt_false, opt_false>::parse;\n\t\tcase 5: return strconv_pcdata_impl<opt_true, opt_false, opt_true>::parse;\n\t\tcase 6: return strconv_pcdata_impl<opt_true, opt_true, opt_false>::parse;\n\t\tcase 7: return strconv_pcdata_impl<opt_true, opt_true, opt_true>::parse;\n\t\tdefault: assert(false); return 0; // should not get here\n\t\t}\n\t}\n\n\ttypedef char_t* (*strconv_attribute_t)(char_t*, char_t);\n\n\ttemplate <typename opt_escape> struct strconv_attribute_impl\n\t{\n\t\tstatic char_t* parse_wnorm(char_t* s, char_t end_quote)\n\t\t{\n\t\t\tgap g;\n\n\t\t\t// trim leading whitespaces\n\t\t\tif (PUGI__IS_CHARTYPE(*s, ct_space))\n\t\t\t{\n\t\t\t\tchar_t* str = s;\n\n\t\t\t\tdo ++str;\n\t\t\t\twhile (PUGI__IS_CHARTYPE(*str, ct_space));\n\n\t\t\t\tg.push(s, str - s);\n\t\t\t}\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tPUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws | ct_space));\n\n\t\t\t\tif (*s == end_quote)\n\t\t\t\t{\n\t\t\t\t\tchar_t* str = g.flush(s);\n\n\t\t\t\t\tdo *str-- = 0;\n\t\t\t\t\twhile (PUGI__IS_CHARTYPE(*str, ct_space));\n\n\t\t\t\t\treturn s + 1;\n\t\t\t\t}\n\t\t\t\telse if (PUGI__IS_CHARTYPE(*s, ct_space))\n\t\t\t\t{\n\t\t\t\t\t*s++ = ' ';\n\n\t\t\t\t\tif (PUGI__IS_CHARTYPE(*s, ct_space))\n\t\t\t\t\t{\n\t\t\t\t\t\tchar_t* str = s + 1;\n\t\t\t\t\t\twhile (PUGI__IS_CHARTYPE(*str, ct_space)) ++str;\n\n\t\t\t\t\t\tg.push(s, str - s);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opt_escape::value && *s == '&')\n\t\t\t\t{\n\t\t\t\t\ts = strconv_escape(s, g);\n\t\t\t\t}\n\t\t\t\telse if (!*s)\n\t\t\t\t{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse ++s;\n\t\t\t}\n\t\t}\n\n\t\tstatic char_t* parse_wconv(char_t* s, char_t end_quote)\n\t\t{\n\t\t\tgap g;\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tPUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws));\n\n\t\t\t\tif (*s == end_quote)\n\t\t\t\t{\n\t\t\t\t\t*g.flush(s) = 0;\n\n\t\t\t\t\treturn s + 1;\n\t\t\t\t}\n\t\t\t\telse if (PUGI__IS_CHARTYPE(*s, ct_space))\n\t\t\t\t{\n\t\t\t\t\tif (*s == '\\r')\n\t\t\t\t\t{\n\t\t\t\t\t\t*s++ = ' ';\n\n\t\t\t\t\t\tif (*s == '\\n') g.push(s, 1);\n\t\t\t\t\t}\n\t\t\t\t\telse *s++ = ' ';\n\t\t\t\t}\n\t\t\t\telse if (opt_escape::value && *s == '&')\n\t\t\t\t{\n\t\t\t\t\ts = strconv_escape(s, g);\n\t\t\t\t}\n\t\t\t\telse if (!*s)\n\t\t\t\t{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse ++s;\n\t\t\t}\n\t\t}\n\n\t\tstatic char_t* parse_eol(char_t* s, char_t end_quote)\n\t\t{\n\t\t\tgap g;\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tPUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr));\n\n\t\t\t\tif (*s == end_quote)\n\t\t\t\t{\n\t\t\t\t\t*g.flush(s) = 0;\n\n\t\t\t\t\treturn s + 1;\n\t\t\t\t}\n\t\t\t\telse if (*s == '\\r')\n\t\t\t\t{\n\t\t\t\t\t*s++ = '\\n';\n\n\t\t\t\t\tif (*s == '\\n') g.push(s, 1);\n\t\t\t\t}\n\t\t\t\telse if (opt_escape::value && *s == '&')\n\t\t\t\t{\n\t\t\t\t\ts = strconv_escape(s, g);\n\t\t\t\t}\n\t\t\t\telse if (!*s)\n\t\t\t\t{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse ++s;\n\t\t\t}\n\t\t}\n\n\t\tstatic char_t* parse_simple(char_t* s, char_t end_quote)\n\t\t{\n\t\t\tgap g;\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tPUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr));\n\n\t\t\t\tif (*s == end_quote)\n\t\t\t\t{\n\t\t\t\t\t*g.flush(s) = 0;\n\n\t\t\t\t\treturn s + 1;\n\t\t\t\t}\n\t\t\t\telse if (opt_escape::value && *s == '&')\n\t\t\t\t{\n\t\t\t\t\ts = strconv_escape(s, g);\n\t\t\t\t}\n\t\t\t\telse if (!*s)\n\t\t\t\t{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse ++s;\n\t\t\t}\n\t\t}\n\t};\n\n\tPUGI__FN strconv_attribute_t get_strconv_attribute(unsigned int optmask)\n\t{\n\t\tPUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_wconv_attribute == 0x40 && parse_wnorm_attribute == 0x80);\n\n\t\tswitch ((optmask >> 4) & 15) // get bitmask for flags (wconv wnorm eol escapes)\n\t\t{\n\t\tcase 0:  return strconv_attribute_impl<opt_false>::parse_simple;\n\t\tcase 1:  return strconv_attribute_impl<opt_true>::parse_simple;\n\t\tcase 2:  return strconv_attribute_impl<opt_false>::parse_eol;\n\t\tcase 3:  return strconv_attribute_impl<opt_true>::parse_eol;\n\t\tcase 4:  return strconv_attribute_impl<opt_false>::parse_wconv;\n\t\tcase 5:  return strconv_attribute_impl<opt_true>::parse_wconv;\n\t\tcase 6:  return strconv_attribute_impl<opt_false>::parse_wconv;\n\t\tcase 7:  return strconv_attribute_impl<opt_true>::parse_wconv;\n\t\tcase 8:  return strconv_attribute_impl<opt_false>::parse_wnorm;\n\t\tcase 9:  return strconv_attribute_impl<opt_true>::parse_wnorm;\n\t\tcase 10: return strconv_attribute_impl<opt_false>::parse_wnorm;\n\t\tcase 11: return strconv_attribute_impl<opt_true>::parse_wnorm;\n\t\tcase 12: return strconv_attribute_impl<opt_false>::parse_wnorm;\n\t\tcase 13: return strconv_attribute_impl<opt_true>::parse_wnorm;\n\t\tcase 14: return strconv_attribute_impl<opt_false>::parse_wnorm;\n\t\tcase 15: return strconv_attribute_impl<opt_true>::parse_wnorm;\n\t\tdefault: assert(false); return 0; // should not get here\n\t\t}\n\t}\n\n\tinline xml_parse_result make_parse_result(xml_parse_status status, ptrdiff_t offset = 0)\n\t{\n\t\txml_parse_result result;\n\t\tresult.status = status;\n\t\tresult.offset = offset;\n\n\t\treturn result;\n\t}\n\n\tstruct xml_parser\n\t{\n\t\txml_allocator alloc;\n\t\txml_allocator* alloc_state;\n\t\tchar_t* error_offset;\n\t\txml_parse_status error_status;\n\n\t\txml_parser(xml_allocator* alloc_): alloc(*alloc_), alloc_state(alloc_), error_offset(0), error_status(status_ok)\n\t\t{\n\t\t}\n\n\t\t~xml_parser()\n\t\t{\n\t\t\t*alloc_state = alloc;\n\t\t}\n\n\t\t// DOCTYPE consists of nested sections of the following possible types:\n\t\t// <!-- ... -->, <? ... ?>, \"...\", '...'\n\t\t// <![...]]>\n\t\t// <!...>\n\t\t// First group can not contain nested groups\n\t\t// Second group can contain nested groups of the same type\n\t\t// Third group can contain all other groups\n\t\tchar_t* parse_doctype_primitive(char_t* s)\n\t\t{\n\t\t\tif (*s == '\"' || *s == '\\'')\n\t\t\t{\n\t\t\t\t// quoted string\n\t\t\t\tchar_t ch = *s++;\n\t\t\t\tPUGI__SCANFOR(*s == ch);\n\t\t\t\tif (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);\n\n\t\t\t\ts++;\n\t\t\t}\n\t\t\telse if (s[0] == '<' && s[1] == '?')\n\t\t\t{\n\t\t\t\t// <? ... ?>\n\t\t\t\ts += 2;\n\t\t\t\tPUGI__SCANFOR(s[0] == '?' && s[1] == '>'); // no need for ENDSWITH because ?> can't terminate proper doctype\n\t\t\t\tif (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);\n\n\t\t\t\ts += 2;\n\t\t\t}\n\t\t\telse if (s[0] == '<' && s[1] == '!' && s[2] == '-' && s[3] == '-')\n\t\t\t{\n\t\t\t\ts += 4;\n\t\t\t\tPUGI__SCANFOR(s[0] == '-' && s[1] == '-' && s[2] == '>'); // no need for ENDSWITH because --> can't terminate proper doctype\n\t\t\t\tif (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);\n\n\t\t\t\ts += 3;\n\t\t\t}\n\t\t\telse PUGI__THROW_ERROR(status_bad_doctype, s);\n\n\t\t\treturn s;\n\t\t}\n\n\t\tchar_t* parse_doctype_ignore(char_t* s)\n\t\t{\n\t\t\tsize_t depth = 0;\n\n\t\t\tassert(s[0] == '<' && s[1] == '!' && s[2] == '[');\n\t\t\ts += 3;\n\n\t\t\twhile (*s)\n\t\t\t{\n\t\t\t\tif (s[0] == '<' && s[1] == '!' && s[2] == '[')\n\t\t\t\t{\n\t\t\t\t\t// nested ignore section\n\t\t\t\t\ts += 3;\n\t\t\t\t\tdepth++;\n\t\t\t\t}\n\t\t\t\telse if (s[0] == ']' && s[1] == ']' && s[2] == '>')\n\t\t\t\t{\n\t\t\t\t\t// ignore section end\n\t\t\t\t\ts += 3;\n\n\t\t\t\t\tif (depth == 0)\n\t\t\t\t\t\treturn s;\n\n\t\t\t\t\tdepth--;\n\t\t\t\t}\n\t\t\t\telse s++;\n\t\t\t}\n\n\t\t\tPUGI__THROW_ERROR(status_bad_doctype, s);\n\t\t}\n\n\t\tchar_t* parse_doctype_group(char_t* s, char_t endch)\n\t\t{\n\t\t\tsize_t depth = 0;\n\n\t\t\tassert((s[0] == '<' || s[0] == 0) && s[1] == '!');\n\t\t\ts += 2;\n\n\t\t\twhile (*s)\n\t\t\t{\n\t\t\t\tif (s[0] == '<' && s[1] == '!' && s[2] != '-')\n\t\t\t\t{\n\t\t\t\t\tif (s[2] == '[')\n\t\t\t\t\t{\n\t\t\t\t\t\t// ignore\n\t\t\t\t\t\ts = parse_doctype_ignore(s);\n\t\t\t\t\t\tif (!s) return s;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// some control group\n\t\t\t\t\t\ts += 2;\n\t\t\t\t\t\tdepth++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (s[0] == '<' || s[0] == '\"' || s[0] == '\\'')\n\t\t\t\t{\n\t\t\t\t\t// unknown tag (forbidden), or some primitive group\n\t\t\t\t\ts = parse_doctype_primitive(s);\n\t\t\t\t\tif (!s) return s;\n\t\t\t\t}\n\t\t\t\telse if (*s == '>')\n\t\t\t\t{\n\t\t\t\t\tif (depth == 0)\n\t\t\t\t\t\treturn s;\n\n\t\t\t\t\tdepth--;\n\t\t\t\t\ts++;\n\t\t\t\t}\n\t\t\t\telse s++;\n\t\t\t}\n\n\t\t\tif (depth != 0 || endch != '>') PUGI__THROW_ERROR(status_bad_doctype, s);\n\n\t\t\treturn s;\n\t\t}\n\n\t\tchar_t* parse_exclamation(char_t* s, xml_node_struct* cursor, unsigned int optmsk, char_t endch)\n\t\t{\n\t\t\t// parse node contents, starting with exclamation mark\n\t\t\t++s;\n\n\t\t\tif (*s == '-') // '<!-...'\n\t\t\t{\n\t\t\t\t++s;\n\n\t\t\t\tif (*s == '-') // '<!--...'\n\t\t\t\t{\n\t\t\t\t\t++s;\n\n\t\t\t\t\tif (PUGI__OPTSET(parse_comments))\n\t\t\t\t\t{\n\t\t\t\t\t\tPUGI__PUSHNODE(node_comment); // Append a new node on the tree.\n\t\t\t\t\t\tcursor->value = s; // Save the offset.\n\t\t\t\t\t}\n\n\t\t\t\t\tif (PUGI__OPTSET(parse_eol) && PUGI__OPTSET(parse_comments))\n\t\t\t\t\t{\n\t\t\t\t\t\ts = strconv_comment(s, endch);\n\n\t\t\t\t\t\tif (!s) PUGI__THROW_ERROR(status_bad_comment, cursor->value);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Scan for terminating '-->'.\n\t\t\t\t\t\tPUGI__SCANFOR(s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>'));\n\t\t\t\t\t\tPUGI__CHECK_ERROR(status_bad_comment, s);\n\n\t\t\t\t\t\tif (PUGI__OPTSET(parse_comments))\n\t\t\t\t\t\t\t*s = 0; // Zero-terminate this segment at the first terminating '-'.\n\n\t\t\t\t\t\ts += (s[2] == '>' ? 3 : 2); // Step over the '\\0->'.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse PUGI__THROW_ERROR(status_bad_comment, s);\n\t\t\t}\n\t\t\telse if (*s == '[')\n\t\t\t{\n\t\t\t\t// '<![CDATA[...'\n\t\t\t\tif (*++s=='C' && *++s=='D' && *++s=='A' && *++s=='T' && *++s=='A' && *++s == '[')\n\t\t\t\t{\n\t\t\t\t\t++s;\n\n\t\t\t\t\tif (PUGI__OPTSET(parse_cdata))\n\t\t\t\t\t{\n\t\t\t\t\t\tPUGI__PUSHNODE(node_cdata); // Append a new node on the tree.\n\t\t\t\t\t\tcursor->value = s; // Save the offset.\n\n\t\t\t\t\t\tif (PUGI__OPTSET(parse_eol))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ts = strconv_cdata(s, endch);\n\n\t\t\t\t\t\t\tif (!s) PUGI__THROW_ERROR(status_bad_cdata, cursor->value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Scan for terminating ']]>'.\n\t\t\t\t\t\t\tPUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>'));\n\t\t\t\t\t\t\tPUGI__CHECK_ERROR(status_bad_cdata, s);\n\n\t\t\t\t\t\t\t*s++ = 0; // Zero-terminate this segment.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse // Flagged for discard, but we still have to scan for the terminator.\n\t\t\t\t\t{\n\t\t\t\t\t\t// Scan for terminating ']]>'.\n\t\t\t\t\t\tPUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>'));\n\t\t\t\t\t\tPUGI__CHECK_ERROR(status_bad_cdata, s);\n\n\t\t\t\t\t\t++s;\n\t\t\t\t\t}\n\n\t\t\t\t\ts += (s[1] == '>' ? 2 : 1); // Step over the last ']>'.\n\t\t\t\t}\n\t\t\t\telse PUGI__THROW_ERROR(status_bad_cdata, s);\n\t\t\t}\n\t\t\telse if (s[0] == 'D' && s[1] == 'O' && s[2] == 'C' && s[3] == 'T' && s[4] == 'Y' && s[5] == 'P' && PUGI__ENDSWITH(s[6], 'E'))\n\t\t\t{\n\t\t\t\ts -= 2;\n\n\t\t\t\tif (cursor->parent) PUGI__THROW_ERROR(status_bad_doctype, s);\n\n\t\t\t\tchar_t* mark = s + 9;\n\n\t\t\t\ts = parse_doctype_group(s, endch);\n\t\t\t\tif (!s) return s;\n\n\t\t\t\tassert((*s == 0 && endch == '>') || *s == '>');\n\t\t\t\tif (*s) *s++ = 0;\n\n\t\t\t\tif (PUGI__OPTSET(parse_doctype))\n\t\t\t\t{\n\t\t\t\t\twhile (PUGI__IS_CHARTYPE(*mark, ct_space)) ++mark;\n\n\t\t\t\t\tPUGI__PUSHNODE(node_doctype);\n\n\t\t\t\t\tcursor->value = mark;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (*s == 0 && endch == '-') PUGI__THROW_ERROR(status_bad_comment, s);\n\t\t\telse if (*s == 0 && endch == '[') PUGI__THROW_ERROR(status_bad_cdata, s);\n\t\t\telse PUGI__THROW_ERROR(status_unrecognized_tag, s);\n\n\t\t\treturn s;\n\t\t}\n\n\t\tchar_t* parse_question(char_t* s, xml_node_struct*& ref_cursor, unsigned int optmsk, char_t endch)\n\t\t{\n\t\t\t// load into registers\n\t\t\txml_node_struct* cursor = ref_cursor;\n\t\t\tchar_t ch = 0;\n\n\t\t\t// parse node contents, starting with question mark\n\t\t\t++s;\n\n\t\t\t// read PI target\n\t\t\tchar_t* target = s;\n\n\t\t\tif (!PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_pi, s);\n\n\t\t\tPUGI__SCANWHILE(PUGI__IS_CHARTYPE(*s, ct_symbol));\n\t\t\tPUGI__CHECK_ERROR(status_bad_pi, s);\n\n\t\t\t// determine node type; stricmp / strcasecmp is not portable\n\t\t\tbool declaration = (target[0] | ' ') == 'x' && (target[1] | ' ') == 'm' && (target[2] | ' ') == 'l' && target + 3 == s;\n\n\t\t\tif (declaration ? PUGI__OPTSET(parse_declaration) : PUGI__OPTSET(parse_pi))\n\t\t\t{\n\t\t\t\tif (declaration)\n\t\t\t\t{\n\t\t\t\t\t// disallow non top-level declarations\n\t\t\t\t\tif (cursor->parent) PUGI__THROW_ERROR(status_bad_pi, s);\n\n\t\t\t\t\tPUGI__PUSHNODE(node_declaration);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tPUGI__PUSHNODE(node_pi);\n\t\t\t\t}\n\n\t\t\t\tcursor->name = target;\n\n\t\t\t\tPUGI__ENDSEG();\n\n\t\t\t\t// parse value/attributes\n\t\t\t\tif (ch == '?')\n\t\t\t\t{\n\t\t\t\t\t// empty node\n\t\t\t\t\tif (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_pi, s);\n\t\t\t\t\ts += (*s == '>');\n\n\t\t\t\t\tPUGI__POPNODE();\n\t\t\t\t}\n\t\t\t\telse if (PUGI__IS_CHARTYPE(ch, ct_space))\n\t\t\t\t{\n\t\t\t\t\tPUGI__SKIPWS();\n\n\t\t\t\t\t// scan for tag end\n\t\t\t\t\tchar_t* value = s;\n\n\t\t\t\t\tPUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>'));\n\t\t\t\t\tPUGI__CHECK_ERROR(status_bad_pi, s);\n\n\t\t\t\t\tif (declaration)\n\t\t\t\t\t{\n\t\t\t\t\t\t// replace ending ? with / so that 'element' terminates properly\n\t\t\t\t\t\t*s = '/';\n\n\t\t\t\t\t\t// we exit from this function with cursor at node_declaration, which is a signal to parse() to go to LOC_ATTRIBUTES\n\t\t\t\t\t\ts = value;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// store value and step over >\n\t\t\t\t\t\tcursor->value = value;\n\n\t\t\t\t\t\tPUGI__POPNODE();\n\n\t\t\t\t\t\tPUGI__ENDSEG();\n\n\t\t\t\t\t\ts += (*s == '>');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse PUGI__THROW_ERROR(status_bad_pi, s);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// scan for tag end\n\t\t\t\tPUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>'));\n\t\t\t\tPUGI__CHECK_ERROR(status_bad_pi, s);\n\n\t\t\t\ts += (s[1] == '>' ? 2 : 1);\n\t\t\t}\n\n\t\t\t// store from registers\n\t\t\tref_cursor = cursor;\n\n\t\t\treturn s;\n\t\t}\n\n\t\tchar_t* parse_tree(char_t* s, xml_node_struct* root, unsigned int optmsk, char_t endch)\n\t\t{\n\t\t\tstrconv_attribute_t strconv_attribute = get_strconv_attribute(optmsk);\n\t\t\tstrconv_pcdata_t strconv_pcdata = get_strconv_pcdata(optmsk);\n\n\t\t\tchar_t ch = 0;\n\t\t\txml_node_struct* cursor = root;\n\t\t\tchar_t* mark = s;\n\n\t\t\twhile (*s != 0)\n\t\t\t{\n\t\t\t\tif (*s == '<')\n\t\t\t\t{\n\t\t\t\t\t++s;\n\n\t\t\t\tLOC_TAG:\n\t\t\t\t\tif (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // '<#...'\n\t\t\t\t\t{\n\t\t\t\t\t\tPUGI__PUSHNODE(node_element); // Append a new node to the tree.\n\n\t\t\t\t\t\tcursor->name = s;\n\n\t\t\t\t\t\tPUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator.\n\t\t\t\t\t\tPUGI__ENDSEG(); // Save char in 'ch', terminate & step over.\n\n\t\t\t\t\t\tif (ch == '>')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// end of tag\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (PUGI__IS_CHARTYPE(ch, ct_space))\n\t\t\t\t\t\t{\n\t\t\t\t\t\tLOC_ATTRIBUTES:\n\t\t\t\t\t\t\twhile (true)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPUGI__SKIPWS(); // Eat any whitespace.\n\n\t\t\t\t\t\t\t\tif (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // <... #...\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\txml_attribute_struct* a = append_new_attribute(cursor, alloc); // Make space for this attribute.\n\t\t\t\t\t\t\t\t\tif (!a) PUGI__THROW_ERROR(status_out_of_memory, s);\n\n\t\t\t\t\t\t\t\t\ta->name = s; // Save the offset.\n\n\t\t\t\t\t\t\t\t\tPUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator.\n\t\t\t\t\t\t\t\t\tPUGI__ENDSEG(); // Save char in 'ch', terminate & step over.\n\n\t\t\t\t\t\t\t\t\tif (PUGI__IS_CHARTYPE(ch, ct_space))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tPUGI__SKIPWS(); // Eat any whitespace.\n\n\t\t\t\t\t\t\t\t\t\tch = *s;\n\t\t\t\t\t\t\t\t\t\t++s;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (ch == '=') // '<... #=...'\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tPUGI__SKIPWS(); // Eat any whitespace.\n\n\t\t\t\t\t\t\t\t\t\tif (*s == '\"' || *s == '\\'') // '<... #=\"...'\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tch = *s; // Save quote char to avoid breaking on \"''\" -or- '\"\"'.\n\t\t\t\t\t\t\t\t\t\t\t++s; // Step over the quote.\n\t\t\t\t\t\t\t\t\t\t\ta->value = s; // Save the offset.\n\n\t\t\t\t\t\t\t\t\t\t\ts = strconv_attribute(s, ch);\n\n\t\t\t\t\t\t\t\t\t\t\tif (!s) PUGI__THROW_ERROR(status_bad_attribute, a->value);\n\n\t\t\t\t\t\t\t\t\t\t\t// After this line the loop continues from the start;\n\t\t\t\t\t\t\t\t\t\t\t// Whitespaces, / and > are ok, symbols and EOF are wrong,\n\t\t\t\t\t\t\t\t\t\t\t// everything else will be detected\n\t\t\t\t\t\t\t\t\t\t\tif (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_attribute, s);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse PUGI__THROW_ERROR(status_bad_attribute, s);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse PUGI__THROW_ERROR(status_bad_attribute, s);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (*s == '/')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t++s;\n\n\t\t\t\t\t\t\t\t\tif (*s == '>')\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tPUGI__POPNODE();\n\t\t\t\t\t\t\t\t\t\ts++;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (*s == 0 && endch == '>')\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tPUGI__POPNODE();\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse PUGI__THROW_ERROR(status_bad_start_element, s);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (*s == '>')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t++s;\n\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (*s == 0 && endch == '>')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse PUGI__THROW_ERROR(status_bad_start_element, s);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// !!!\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (ch == '/') // '<#.../'\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_start_element, s);\n\n\t\t\t\t\t\t\tPUGI__POPNODE(); // Pop.\n\n\t\t\t\t\t\t\ts += (*s == '>');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (ch == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// we stepped over null terminator, backtrack & handle closing tag\n\t\t\t\t\t\t\t--s;\n\n\t\t\t\t\t\t\tif (endch != '>') PUGI__THROW_ERROR(status_bad_start_element, s);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse PUGI__THROW_ERROR(status_bad_start_element, s);\n\t\t\t\t\t}\n\t\t\t\t\telse if (*s == '/')\n\t\t\t\t\t{\n\t\t\t\t\t\t++s;\n\n\t\t\t\t\t\tchar_t* name = cursor->name;\n\t\t\t\t\t\tif (!name) PUGI__THROW_ERROR(status_end_element_mismatch, s);\n\n\t\t\t\t\t\twhile (PUGI__IS_CHARTYPE(*s, ct_symbol))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (*s++ != *name++) PUGI__THROW_ERROR(status_end_element_mismatch, s);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (*name)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (*s == 0 && name[0] == endch && name[1] == 0) PUGI__THROW_ERROR(status_bad_end_element, s);\n\t\t\t\t\t\t\telse PUGI__THROW_ERROR(status_end_element_mismatch, s);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tPUGI__POPNODE(); // Pop.\n\n\t\t\t\t\t\tPUGI__SKIPWS();\n\n\t\t\t\t\t\tif (*s == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (endch != '>') PUGI__THROW_ERROR(status_bad_end_element, s);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (*s != '>') PUGI__THROW_ERROR(status_bad_end_element, s);\n\t\t\t\t\t\t\t++s;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (*s == '?') // '<?...'\n\t\t\t\t\t{\n\t\t\t\t\t\ts = parse_question(s, cursor, optmsk, endch);\n\t\t\t\t\t\tif (!s) return s;\n\n\t\t\t\t\t\tassert(cursor);\n\t\t\t\t\t\tif (PUGI__NODETYPE(cursor) == node_declaration) goto LOC_ATTRIBUTES;\n\t\t\t\t\t}\n\t\t\t\t\telse if (*s == '!') // '<!...'\n\t\t\t\t\t{\n\t\t\t\t\t\ts = parse_exclamation(s, cursor, optmsk, endch);\n\t\t\t\t\t\tif (!s) return s;\n\t\t\t\t\t}\n\t\t\t\t\telse if (*s == 0 && endch == '?') PUGI__THROW_ERROR(status_bad_pi, s);\n\t\t\t\t\telse PUGI__THROW_ERROR(status_unrecognized_tag, s);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmark = s; // Save this offset while searching for a terminator.\n\n\t\t\t\t\tPUGI__SKIPWS(); // Eat whitespace if no genuine PCDATA here.\n\n\t\t\t\t\tif (*s == '<' || !*s)\n\t\t\t\t\t{\n\t\t\t\t\t\t// We skipped some whitespace characters because otherwise we would take the tag branch instead of PCDATA one\n\t\t\t\t\t\tassert(mark != s);\n\n\t\t\t\t\t\tif (!PUGI__OPTSET(parse_ws_pcdata | parse_ws_pcdata_single) || PUGI__OPTSET(parse_trim_pcdata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (PUGI__OPTSET(parse_ws_pcdata_single))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (s[0] != '<' || s[1] != '/' || cursor->first_child) continue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!PUGI__OPTSET(parse_trim_pcdata))\n\t\t\t\t\t\ts = mark;\n\n\t\t\t\t\tif (cursor->parent || PUGI__OPTSET(parse_fragment))\n\t\t\t\t\t{\n\t\t\t\t\t\tPUGI__PUSHNODE(node_pcdata); // Append a new node on the tree.\n\t\t\t\t\t\tcursor->value = s; // Save the offset.\n\n\t\t\t\t\t\ts = strconv_pcdata(s);\n\n\t\t\t\t\t\tPUGI__POPNODE(); // Pop since this is a standalone.\n\n\t\t\t\t\t\tif (!*s) break;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tPUGI__SCANFOR(*s == '<'); // '...<'\n\t\t\t\t\t\tif (!*s) break;\n\n\t\t\t\t\t\t++s;\n\t\t\t\t\t}\n\n\t\t\t\t\t// We're after '<'\n\t\t\t\t\tgoto LOC_TAG;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// check that last tag is closed\n\t\t\tif (cursor != root) PUGI__THROW_ERROR(status_end_element_mismatch, s);\n\n\t\t\treturn s;\n\t\t}\n\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\tstatic char_t* parse_skip_bom(char_t* s)\n\t\t{\n\t\t\tunsigned int bom = 0xfeff;\n\t\t\treturn (s[0] == static_cast<wchar_t>(bom)) ? s + 1 : s;\n\t\t}\n\t#else\n\t\tstatic char_t* parse_skip_bom(char_t* s)\n\t\t{\n\t\t\treturn (s[0] == '\\xef' && s[1] == '\\xbb' && s[2] == '\\xbf') ? s + 3 : s;\n\t\t}\n\t#endif\n\n\t\tstatic bool has_element_node_siblings(xml_node_struct* node)\n\t\t{\n\t\t\twhile (node)\n\t\t\t{\n\t\t\t\tif (PUGI__NODETYPE(node) == node_element) return true;\n\n\t\t\t\tnode = node->next_sibling;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tstatic xml_parse_result parse(char_t* buffer, size_t length, xml_document_struct* xmldoc, xml_node_struct* root, unsigned int optmsk)\n\t\t{\n\t\t\t// early-out for empty documents\n\t\t\tif (length == 0)\n\t\t\t\treturn make_parse_result(PUGI__OPTSET(parse_fragment) ? status_ok : status_no_document_element);\n\n\t\t\t// get last child of the root before parsing\n\t\t\txml_node_struct* last_root_child = root->first_child ? root->first_child->prev_sibling_c + 0 : 0;\n\n\t\t\t// create parser on stack\n\t\t\txml_parser parser(static_cast<xml_allocator*>(xmldoc));\n\n\t\t\t// save last character and make buffer zero-terminated (speeds up parsing)\n\t\t\tchar_t endch = buffer[length - 1];\n\t\t\tbuffer[length - 1] = 0;\n\n\t\t\t// skip BOM to make sure it does not end up as part of parse output\n\t\t\tchar_t* buffer_data = parse_skip_bom(buffer);\n\n\t\t\t// perform actual parsing\n\t\t\tparser.parse_tree(buffer_data, root, optmsk, endch);\n\n\t\t\txml_parse_result result = make_parse_result(parser.error_status, parser.error_offset ? parser.error_offset - buffer : 0);\n\t\t\tassert(result.offset >= 0 && static_cast<size_t>(result.offset) <= length);\n\n\t\t\tif (result)\n\t\t\t{\n\t\t\t\t// since we removed last character, we have to handle the only possible false positive (stray <)\n\t\t\t\tif (endch == '<')\n\t\t\t\t\treturn make_parse_result(status_unrecognized_tag, length - 1);\n\n\t\t\t\t// check if there are any element nodes parsed\n\t\t\t\txml_node_struct* first_root_child_parsed = last_root_child ? last_root_child->next_sibling + 0 : root->first_child;\n\n\t\t\t\tif (!PUGI__OPTSET(parse_fragment) && !has_element_node_siblings(first_root_child_parsed))\n\t\t\t\t\treturn make_parse_result(status_no_document_element, length - 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// roll back offset if it occurs on a null terminator in the source buffer\n\t\t\t\tif (result.offset > 0 && static_cast<size_t>(result.offset) == length - 1 && endch == 0)\n\t\t\t\t\tresult.offset--;\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\t// Output facilities\n\tPUGI__FN xml_encoding get_write_native_encoding()\n\t{\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\treturn get_wchar_encoding();\n\t#else\n\t\treturn encoding_utf8;\n\t#endif\n\t}\n\n\tPUGI__FN xml_encoding get_write_encoding(xml_encoding encoding)\n\t{\n\t\t// replace wchar encoding with utf implementation\n\t\tif (encoding == encoding_wchar) return get_wchar_encoding();\n\n\t\t// replace utf16 encoding with utf16 with specific endianness\n\t\tif (encoding == encoding_utf16) return is_little_endian() ? encoding_utf16_le : encoding_utf16_be;\n\n\t\t// replace utf32 encoding with utf32 with specific endianness\n\t\tif (encoding == encoding_utf32) return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;\n\n\t\t// only do autodetection if no explicit encoding is requested\n\t\tif (encoding != encoding_auto) return encoding;\n\n\t\t// assume utf8 encoding\n\t\treturn encoding_utf8;\n\t}\n\n\ttemplate <typename D, typename T> PUGI__FN size_t convert_buffer_output_generic(typename T::value_type dest, const char_t* data, size_t length, D, T)\n\t{\n\t\tPUGI__STATIC_ASSERT(sizeof(char_t) == sizeof(typename D::type));\n\n\t\ttypename T::value_type end = D::process(reinterpret_cast<const typename D::type*>(data), length, dest, T());\n\n\t\treturn static_cast<size_t>(end - dest) * sizeof(*dest);\n\t}\n\n\ttemplate <typename D, typename T> PUGI__FN size_t convert_buffer_output_generic(typename T::value_type dest, const char_t* data, size_t length, D, T, bool opt_swap)\n\t{\n\t\tPUGI__STATIC_ASSERT(sizeof(char_t) == sizeof(typename D::type));\n\n\t\ttypename T::value_type end = D::process(reinterpret_cast<const typename D::type*>(data), length, dest, T());\n\n\t\tif (opt_swap)\n\t\t{\n\t\t\tfor (typename T::value_type i = dest; i != end; ++i)\n\t\t\t\t*i = endian_swap(*i);\n\t\t}\n\n\t\treturn static_cast<size_t>(end - dest) * sizeof(*dest);\n\t}\n\n#ifdef PUGIXML_WCHAR_MODE\n\tPUGI__FN size_t get_valid_length(const char_t* data, size_t length)\n\t{\n\t\tif (length < 1) return 0;\n\n\t\t// discard last character if it's the lead of a surrogate pair\n\t\treturn (sizeof(wchar_t) == 2 && static_cast<unsigned int>(static_cast<uint16_t>(data[length - 1]) - 0xD800) < 0x400) ? length - 1 : length;\n\t}\n\n\tPUGI__FN size_t convert_buffer_output(char_t* r_char, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding)\n\t{\n\t\t// only endian-swapping is required\n\t\tif (need_endian_swap_utf(encoding, get_wchar_encoding()))\n\t\t{\n\t\t\tconvert_wchar_endian_swap(r_char, data, length);\n\n\t\t\treturn length * sizeof(char_t);\n\t\t}\n\n\t\t// convert to utf8\n\t\tif (encoding == encoding_utf8)\n\t\t\treturn convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), utf8_writer());\n\n\t\t// convert to utf16\n\t\tif (encoding == encoding_utf16_be || encoding == encoding_utf16_le)\n\t\t{\n\t\t\txml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;\n\n\t\t\treturn convert_buffer_output_generic(r_u16, data, length, wchar_decoder(), utf16_writer(), native_encoding != encoding);\n\t\t}\n\n\t\t// convert to utf32\n\t\tif (encoding == encoding_utf32_be || encoding == encoding_utf32_le)\n\t\t{\n\t\t\txml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;\n\n\t\t\treturn convert_buffer_output_generic(r_u32, data, length, wchar_decoder(), utf32_writer(), native_encoding != encoding);\n\t\t}\n\n\t\t// convert to latin1\n\t\tif (encoding == encoding_latin1)\n\t\t\treturn convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), latin1_writer());\n\n\t\tassert(!\"Invalid encoding\");\n\t\treturn 0;\n\t}\n#else\n\tPUGI__FN size_t get_valid_length(const char_t* data, size_t length)\n\t{\n\t\tif (length < 5) return 0;\n\n\t\tfor (size_t i = 1; i <= 4; ++i)\n\t\t{\n\t\t\tuint8_t ch = static_cast<uint8_t>(data[length - i]);\n\n\t\t\t// either a standalone character or a leading one\n\t\t\tif ((ch & 0xc0) != 0x80) return length - i;\n\t\t}\n\n\t\t// there are four non-leading characters at the end, sequence tail is broken so might as well process the whole chunk\n\t\treturn length;\n\t}\n\n\tPUGI__FN size_t convert_buffer_output(char_t* /* r_char */, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding)\n\t{\n\t\tif (encoding == encoding_utf16_be || encoding == encoding_utf16_le)\n\t\t{\n\t\t\txml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;\n\n\t\t\treturn convert_buffer_output_generic(r_u16, data, length, utf8_decoder(), utf16_writer(), native_encoding != encoding);\n\t\t}\n\n\t\tif (encoding == encoding_utf32_be || encoding == encoding_utf32_le)\n\t\t{\n\t\t\txml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;\n\n\t\t\treturn convert_buffer_output_generic(r_u32, data, length, utf8_decoder(), utf32_writer(), native_encoding != encoding);\n\t\t}\n\n\t\tif (encoding == encoding_latin1)\n\t\t\treturn convert_buffer_output_generic(r_u8, data, length, utf8_decoder(), latin1_writer());\n\n\t\tassert(!\"Invalid encoding\");\n\t\treturn 0;\n\t}\n#endif\n\n\tclass xml_buffered_writer\n\t{\n\t\txml_buffered_writer(const xml_buffered_writer&);\n\t\txml_buffered_writer& operator=(const xml_buffered_writer&);\n\n\tpublic:\n\t\txml_buffered_writer(xml_writer& writer_, xml_encoding user_encoding): writer(writer_), bufsize(0), encoding(get_write_encoding(user_encoding))\n\t\t{\n\t\t\tPUGI__STATIC_ASSERT(bufcapacity >= 8);\n\t\t}\n\n\t\tsize_t flush()\n\t\t{\n\t\t\tflush(buffer, bufsize);\n\t\t\tbufsize = 0;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvoid flush(const char_t* data, size_t size)\n\t\t{\n\t\t\tif (size == 0) return;\n\n\t\t\t// fast path, just write data\n\t\t\tif (encoding == get_write_native_encoding())\n\t\t\t\twriter.write(data, size * sizeof(char_t));\n\t\t\telse\n\t\t\t{\n\t\t\t\t// convert chunk\n\t\t\t\tsize_t result = convert_buffer_output(scratch.data_char, scratch.data_u8, scratch.data_u16, scratch.data_u32, data, size, encoding);\n\t\t\t\tassert(result <= sizeof(scratch));\n\n\t\t\t\t// write data\n\t\t\t\twriter.write(scratch.data_u8, result);\n\t\t\t}\n\t\t}\n\n\t\tvoid write_direct(const char_t* data, size_t length)\n\t\t{\n\t\t\t// flush the remaining buffer contents\n\t\t\tflush();\n\n\t\t\t// handle large chunks\n\t\t\tif (length > bufcapacity)\n\t\t\t{\n\t\t\t\tif (encoding == get_write_native_encoding())\n\t\t\t\t{\n\t\t\t\t\t// fast path, can just write data chunk\n\t\t\t\t\twriter.write(data, length * sizeof(char_t));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// need to convert in suitable chunks\n\t\t\t\twhile (length > bufcapacity)\n\t\t\t\t{\n\t\t\t\t\t// get chunk size by selecting such number of characters that are guaranteed to fit into scratch buffer\n\t\t\t\t\t// and form a complete codepoint sequence (i.e. discard start of last codepoint if necessary)\n\t\t\t\t\tsize_t chunk_size = get_valid_length(data, bufcapacity);\n\t\t\t\t\tassert(chunk_size);\n\n\t\t\t\t\t// convert chunk and write\n\t\t\t\t\tflush(data, chunk_size);\n\n\t\t\t\t\t// iterate\n\t\t\t\t\tdata += chunk_size;\n\t\t\t\t\tlength -= chunk_size;\n\t\t\t\t}\n\n\t\t\t\t// small tail is copied below\n\t\t\t\tbufsize = 0;\n\t\t\t}\n\n\t\t\tmemcpy(buffer + bufsize, data, length * sizeof(char_t));\n\t\t\tbufsize += length;\n\t\t}\n\n\t\tvoid write_buffer(const char_t* data, size_t length)\n\t\t{\n\t\t\tsize_t offset = bufsize;\n\n\t\t\tif (offset + length <= bufcapacity)\n\t\t\t{\n\t\t\t\tmemcpy(buffer + offset, data, length * sizeof(char_t));\n\t\t\t\tbufsize = offset + length;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twrite_direct(data, length);\n\t\t\t}\n\t\t}\n\n\t\tvoid write_string(const char_t* data)\n\t\t{\n\t\t\t// write the part of the string that fits in the buffer\n\t\t\tsize_t offset = bufsize;\n\n\t\t\twhile (*data && offset < bufcapacity)\n\t\t\t\tbuffer[offset++] = *data++;\n\n\t\t\t// write the rest\n\t\t\tif (offset < bufcapacity)\n\t\t\t{\n\t\t\t\tbufsize = offset;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// backtrack a bit if we have split the codepoint\n\t\t\t\tsize_t length = offset - bufsize;\n\t\t\t\tsize_t extra = length - get_valid_length(data - length, length);\n\n\t\t\t\tbufsize = offset - extra;\n\n\t\t\t\twrite_direct(data - extra, strlength(data) + extra);\n\t\t\t}\n\t\t}\n\n\t\tvoid write(char_t d0)\n\t\t{\n\t\t\tsize_t offset = bufsize;\n\t\t\tif (offset > bufcapacity - 1) offset = flush();\n\n\t\t\tbuffer[offset + 0] = d0;\n\t\t\tbufsize = offset + 1;\n\t\t}\n\n\t\tvoid write(char_t d0, char_t d1)\n\t\t{\n\t\t\tsize_t offset = bufsize;\n\t\t\tif (offset > bufcapacity - 2) offset = flush();\n\n\t\t\tbuffer[offset + 0] = d0;\n\t\t\tbuffer[offset + 1] = d1;\n\t\t\tbufsize = offset + 2;\n\t\t}\n\n\t\tvoid write(char_t d0, char_t d1, char_t d2)\n\t\t{\n\t\t\tsize_t offset = bufsize;\n\t\t\tif (offset > bufcapacity - 3) offset = flush();\n\n\t\t\tbuffer[offset + 0] = d0;\n\t\t\tbuffer[offset + 1] = d1;\n\t\t\tbuffer[offset + 2] = d2;\n\t\t\tbufsize = offset + 3;\n\t\t}\n\n\t\tvoid write(char_t d0, char_t d1, char_t d2, char_t d3)\n\t\t{\n\t\t\tsize_t offset = bufsize;\n\t\t\tif (offset > bufcapacity - 4) offset = flush();\n\n\t\t\tbuffer[offset + 0] = d0;\n\t\t\tbuffer[offset + 1] = d1;\n\t\t\tbuffer[offset + 2] = d2;\n\t\t\tbuffer[offset + 3] = d3;\n\t\t\tbufsize = offset + 4;\n\t\t}\n\n\t\tvoid write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4)\n\t\t{\n\t\t\tsize_t offset = bufsize;\n\t\t\tif (offset > bufcapacity - 5) offset = flush();\n\n\t\t\tbuffer[offset + 0] = d0;\n\t\t\tbuffer[offset + 1] = d1;\n\t\t\tbuffer[offset + 2] = d2;\n\t\t\tbuffer[offset + 3] = d3;\n\t\t\tbuffer[offset + 4] = d4;\n\t\t\tbufsize = offset + 5;\n\t\t}\n\n\t\tvoid write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4, char_t d5)\n\t\t{\n\t\t\tsize_t offset = bufsize;\n\t\t\tif (offset > bufcapacity - 6) offset = flush();\n\n\t\t\tbuffer[offset + 0] = d0;\n\t\t\tbuffer[offset + 1] = d1;\n\t\t\tbuffer[offset + 2] = d2;\n\t\t\tbuffer[offset + 3] = d3;\n\t\t\tbuffer[offset + 4] = d4;\n\t\t\tbuffer[offset + 5] = d5;\n\t\t\tbufsize = offset + 6;\n\t\t}\n\n\t\t// utf8 maximum expansion: x4 (-> utf32)\n\t\t// utf16 maximum expansion: x2 (-> utf32)\n\t\t// utf32 maximum expansion: x1\n\t\tenum\n\t\t{\n\t\t\tbufcapacitybytes =\n\t\t\t#ifdef PUGIXML_MEMORY_OUTPUT_STACK\n\t\t\t\tPUGIXML_MEMORY_OUTPUT_STACK\n\t\t\t#else\n\t\t\t\t10240\n\t\t\t#endif\n\t\t\t,\n\t\t\tbufcapacity = bufcapacitybytes / (sizeof(char_t) + 4)\n\t\t};\n\n\t\tchar_t buffer[bufcapacity];\n\n\t\tunion\n\t\t{\n\t\t\tuint8_t data_u8[4 * bufcapacity];\n\t\t\tuint16_t data_u16[2 * bufcapacity];\n\t\t\tuint32_t data_u32[bufcapacity];\n\t\t\tchar_t data_char[bufcapacity];\n\t\t} scratch;\n\n\t\txml_writer& writer;\n\t\tsize_t bufsize;\n\t\txml_encoding encoding;\n\t};\n\n\tPUGI__FN void text_output_escaped(xml_buffered_writer& writer, const char_t* s, chartypex_t type)\n\t{\n\t\twhile (*s)\n\t\t{\n\t\t\tconst char_t* prev = s;\n\n\t\t\t// While *s is a usual symbol\n\t\t\tPUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPEX(ss, type));\n\n\t\t\twriter.write_buffer(prev, static_cast<size_t>(s - prev));\n\n\t\t\tswitch (*s)\n\t\t\t{\n\t\t\t\tcase 0: break;\n\t\t\t\tcase '&':\n\t\t\t\t\twriter.write('&', 'a', 'm', 'p', ';');\n\t\t\t\t\t++s;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '<':\n\t\t\t\t\twriter.write('&', 'l', 't', ';');\n\t\t\t\t\t++s;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '>':\n\t\t\t\t\twriter.write('&', 'g', 't', ';');\n\t\t\t\t\t++s;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\"':\n\t\t\t\t\twriter.write('&', 'q', 'u', 'o', 't', ';');\n\t\t\t\t\t++s;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: // s is not a usual symbol\n\t\t\t\t{\n\t\t\t\t\tunsigned int ch = static_cast<unsigned int>(*s++);\n\t\t\t\t\tassert(ch < 32);\n\n\t\t\t\t\twriter.write('&', '#', static_cast<char_t>((ch / 10) + '0'), static_cast<char_t>((ch % 10) + '0'), ';');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tPUGI__FN void text_output(xml_buffered_writer& writer, const char_t* s, chartypex_t type, unsigned int flags)\n\t{\n\t\tif (flags & format_no_escapes)\n\t\t\twriter.write_string(s);\n\t\telse\n\t\t\ttext_output_escaped(writer, s, type);\n\t}\n\n\tPUGI__FN void text_output_cdata(xml_buffered_writer& writer, const char_t* s)\n\t{\n\t\tdo\n\t\t{\n\t\t\twriter.write('<', '!', '[', 'C', 'D');\n\t\t\twriter.write('A', 'T', 'A', '[');\n\n\t\t\tconst char_t* prev = s;\n\n\t\t\t// look for ]]> sequence - we can't output it as is since it terminates CDATA\n\t\t\twhile (*s && !(s[0] == ']' && s[1] == ']' && s[2] == '>')) ++s;\n\n\t\t\t// skip ]] if we stopped at ]]>, > will go to the next CDATA section\n\t\t\tif (*s) s += 2;\n\n\t\t\twriter.write_buffer(prev, static_cast<size_t>(s - prev));\n\n\t\t\twriter.write(']', ']', '>');\n\t\t}\n\t\twhile (*s);\n\t}\n\n\tPUGI__FN void text_output_indent(xml_buffered_writer& writer, const char_t* indent, size_t indent_length, unsigned int depth)\n\t{\n\t\tswitch (indent_length)\n\t\t{\n\t\tcase 1:\n\t\t{\n\t\t\tfor (unsigned int i = 0; i < depth; ++i)\n\t\t\t\twriter.write(indent[0]);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 2:\n\t\t{\n\t\t\tfor (unsigned int i = 0; i < depth; ++i)\n\t\t\t\twriter.write(indent[0], indent[1]);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 3:\n\t\t{\n\t\t\tfor (unsigned int i = 0; i < depth; ++i)\n\t\t\t\twriter.write(indent[0], indent[1], indent[2]);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 4:\n\t\t{\n\t\t\tfor (unsigned int i = 0; i < depth; ++i)\n\t\t\t\twriter.write(indent[0], indent[1], indent[2], indent[3]);\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t{\n\t\t\tfor (unsigned int i = 0; i < depth; ++i)\n\t\t\t\twriter.write_buffer(indent, indent_length);\n\t\t}\n\t\t}\n\t}\n\n\tPUGI__FN void node_output_comment(xml_buffered_writer& writer, const char_t* s)\n\t{\n\t\twriter.write('<', '!', '-', '-');\n\n\t\twhile (*s)\n\t\t{\n\t\t\tconst char_t* prev = s;\n\n\t\t\t// look for -\\0 or -- sequence - we can't output it since -- is illegal in comment body\n\t\t\twhile (*s && !(s[0] == '-' && (s[1] == '-' || s[1] == 0))) ++s;\n\n\t\t\twriter.write_buffer(prev, static_cast<size_t>(s - prev));\n\n\t\t\tif (*s)\n\t\t\t{\n\t\t\t\tassert(*s == '-');\n\n\t\t\t\twriter.write('-', ' ');\n\t\t\t\t++s;\n\t\t\t}\n\t\t}\n\n\t\twriter.write('-', '-', '>');\n\t}\n\n\tPUGI__FN void node_output_pi_value(xml_buffered_writer& writer, const char_t* s)\n\t{\n\t\twhile (*s)\n\t\t{\n\t\t\tconst char_t* prev = s;\n\n\t\t\t// look for ?> sequence - we can't output it since ?> terminates PI\n\t\t\twhile (*s && !(s[0] == '?' && s[1] == '>')) ++s;\n\n\t\t\twriter.write_buffer(prev, static_cast<size_t>(s - prev));\n\n\t\t\tif (*s)\n\t\t\t{\n\t\t\t\tassert(s[0] == '?' && s[1] == '>');\n\n\t\t\t\twriter.write('?', ' ', '>');\n\t\t\t\ts += 2;\n\t\t\t}\n\t\t}\n\t}\n\n\tPUGI__FN void node_output_attributes(xml_buffered_writer& writer, xml_node_struct* node, const char_t* indent, size_t indent_length, unsigned int flags, unsigned int depth)\n\t{\n\t\tconst char_t* default_name = PUGIXML_TEXT(\":anonymous\");\n\n\t\tfor (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute)\n\t\t{\n\t\t\tif ((flags & (format_indent_attributes | format_raw)) == format_indent_attributes)\n\t\t\t{\n\t\t\t\twriter.write('\\n');\n\n\t\t\t\ttext_output_indent(writer, indent, indent_length, depth + 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twriter.write(' ');\n\t\t\t}\n\n\t\t\twriter.write_string(a->name ? a->name : default_name);\n\t\t\twriter.write('=', '\"');\n\n\t\t\tif (a->value)\n\t\t\t\ttext_output(writer, a->value, ctx_special_attr, flags);\n\n\t\t\twriter.write('\"');\n\t\t}\n\t}\n\n\tPUGI__FN bool node_output_start(xml_buffered_writer& writer, xml_node_struct* node, const char_t* indent, size_t indent_length, unsigned int flags, unsigned int depth)\n\t{\n\t\tconst char_t* default_name = PUGIXML_TEXT(\":anonymous\");\n\t\tconst char_t* name = node->name ? node->name : default_name;\n\n\t\twriter.write('<');\n\t\twriter.write_string(name);\n\n\t\tif (node->first_attribute)\n\t\t\tnode_output_attributes(writer, node, indent, indent_length, flags, depth);\n\n\t\tif (!node->first_child)\n\t\t{\n\t\t\twriter.write(' ', '/', '>');\n\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\twriter.write('>');\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tPUGI__FN void node_output_end(xml_buffered_writer& writer, xml_node_struct* node)\n\t{\n\t\tconst char_t* default_name = PUGIXML_TEXT(\":anonymous\");\n\t\tconst char_t* name = node->name ? node->name : default_name;\n\n\t\twriter.write('<', '/');\n\t\twriter.write_string(name);\n\t\twriter.write('>');\n\t}\n\n\tPUGI__FN void node_output_simple(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags)\n\t{\n\t\tconst char_t* default_name = PUGIXML_TEXT(\":anonymous\");\n\n\t\tswitch (PUGI__NODETYPE(node))\n\t\t{\n\t\t\tcase node_pcdata:\n\t\t\t\ttext_output(writer, node->value ? node->value + 0 : PUGIXML_TEXT(\"\"), ctx_special_pcdata, flags);\n\t\t\t\tbreak;\n\n\t\t\tcase node_cdata:\n\t\t\t\ttext_output_cdata(writer, node->value ? node->value + 0 : PUGIXML_TEXT(\"\"));\n\t\t\t\tbreak;\n\n\t\t\tcase node_comment:\n\t\t\t\tnode_output_comment(writer, node->value ? node->value + 0 : PUGIXML_TEXT(\"\"));\n\t\t\t\tbreak;\n\n\t\t\tcase node_pi:\n\t\t\t\twriter.write('<', '?');\n\t\t\t\twriter.write_string(node->name ? node->name : default_name);\n\n\t\t\t\tif (node->value)\n\t\t\t\t{\n\t\t\t\t\twriter.write(' ');\n\t\t\t\t\tnode_output_pi_value(writer, node->value);\n\t\t\t\t}\n\n\t\t\t\twriter.write('?', '>');\n\t\t\t\tbreak;\n\n\t\t\tcase node_declaration:\n\t\t\t\twriter.write('<', '?');\n\t\t\t\twriter.write_string(node->name ? node->name : default_name);\n\t\t\t\tnode_output_attributes(writer, node, PUGIXML_TEXT(\"\"), 0, flags | format_raw, 0);\n\t\t\t\twriter.write('?', '>');\n\t\t\t\tbreak;\n\n\t\t\tcase node_doctype:\n\t\t\t\twriter.write('<', '!', 'D', 'O', 'C');\n\t\t\t\twriter.write('T', 'Y', 'P', 'E');\n\n\t\t\t\tif (node->value)\n\t\t\t\t{\n\t\t\t\t\twriter.write(' ');\n\t\t\t\t\twriter.write_string(node->value);\n\t\t\t\t}\n\n\t\t\t\twriter.write('>');\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tassert(!\"Invalid node type\");\n\t\t}\n\t}\n\n\tenum indent_flags_t\n\t{\n\t\tindent_newline = 1,\n\t\tindent_indent = 2\n\t};\n\n\tPUGI__FN void node_output(xml_buffered_writer& writer, xml_node_struct* root, const char_t* indent, unsigned int flags, unsigned int depth)\n\t{\n\t\tsize_t indent_length = ((flags & (format_indent | format_indent_attributes)) && (flags & format_raw) == 0) ? strlength(indent) : 0;\n\t\tunsigned int indent_flags = indent_indent;\n\n\t\txml_node_struct* node = root;\n\n\t\tdo\n\t\t{\n\t\t\tassert(node);\n\n\t\t\t// begin writing current node\n\t\t\tif (PUGI__NODETYPE(node) == node_pcdata || PUGI__NODETYPE(node) == node_cdata)\n\t\t\t{\n\t\t\t\tnode_output_simple(writer, node, flags);\n\n\t\t\t\tindent_flags = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ((indent_flags & indent_newline) && (flags & format_raw) == 0)\n\t\t\t\t\twriter.write('\\n');\n\n\t\t\t\tif ((indent_flags & indent_indent) && indent_length)\n\t\t\t\t\ttext_output_indent(writer, indent, indent_length, depth);\n\n\t\t\t\tif (PUGI__NODETYPE(node) == node_element)\n\t\t\t\t{\n\t\t\t\t\tindent_flags = indent_newline | indent_indent;\n\n\t\t\t\t\tif (node_output_start(writer, node, indent, indent_length, flags, depth))\n\t\t\t\t\t{\n\t\t\t\t\t\tnode = node->first_child;\n\t\t\t\t\t\tdepth++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (PUGI__NODETYPE(node) == node_document)\n\t\t\t\t{\n\t\t\t\t\tindent_flags = indent_indent;\n\n\t\t\t\t\tif (node->first_child)\n\t\t\t\t\t{\n\t\t\t\t\t\tnode = node->first_child;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnode_output_simple(writer, node, flags);\n\n\t\t\t\t\tindent_flags = indent_newline | indent_indent;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// continue to the next node\n\t\t\twhile (node != root)\n\t\t\t{\n\t\t\t\tif (node->next_sibling)\n\t\t\t\t{\n\t\t\t\t\tnode = node->next_sibling;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tnode = node->parent;\n\n\t\t\t\t// write closing node\n\t\t\t\tif (PUGI__NODETYPE(node) == node_element)\n\t\t\t\t{\n\t\t\t\t\tdepth--;\n\n\t\t\t\t\tif ((indent_flags & indent_newline) && (flags & format_raw) == 0)\n\t\t\t\t\t\twriter.write('\\n');\n\n\t\t\t\t\tif ((indent_flags & indent_indent) && indent_length)\n\t\t\t\t\t\ttext_output_indent(writer, indent, indent_length, depth);\n\n\t\t\t\t\tnode_output_end(writer, node);\n\n\t\t\t\t\tindent_flags = indent_newline | indent_indent;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\twhile (node != root);\n\n\t\tif ((indent_flags & indent_newline) && (flags & format_raw) == 0)\n\t\t\twriter.write('\\n');\n\t}\n\n\tPUGI__FN bool has_declaration(xml_node_struct* node)\n\t{\n\t\tfor (xml_node_struct* child = node->first_child; child; child = child->next_sibling)\n\t\t{\n\t\t\txml_node_type type = PUGI__NODETYPE(child);\n\n\t\t\tif (type == node_declaration) return true;\n\t\t\tif (type == node_element) return false;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tPUGI__FN bool is_attribute_of(xml_attribute_struct* attr, xml_node_struct* node)\n\t{\n\t\tfor (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute)\n\t\t\tif (a == attr)\n\t\t\t\treturn true;\n\n\t\treturn false;\n\t}\n\n\tPUGI__FN bool allow_insert_attribute(xml_node_type parent)\n\t{\n\t\treturn parent == node_element || parent == node_declaration;\n\t}\n\n\tPUGI__FN bool allow_insert_child(xml_node_type parent, xml_node_type child)\n\t{\n\t\tif (parent != node_document && parent != node_element) return false;\n\t\tif (child == node_document || child == node_null) return false;\n\t\tif (parent != node_document && (child == node_declaration || child == node_doctype)) return false;\n\n\t\treturn true;\n\t}\n\n\tPUGI__FN bool allow_move(xml_node parent, xml_node child)\n\t{\n\t\t// check that child can be a child of parent\n\t\tif (!allow_insert_child(parent.type(), child.type()))\n\t\t\treturn false;\n\n\t\t// check that node is not moved between documents\n\t\tif (parent.root() != child.root())\n\t\t\treturn false;\n\n\t\t// check that new parent is not in the child subtree\n\t\txml_node cur = parent;\n\n\t\twhile (cur)\n\t\t{\n\t\t\tif (cur == child)\n\t\t\t\treturn false;\n\n\t\t\tcur = cur.parent();\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttemplate <typename String, typename Header>\n\tPUGI__FN void node_copy_string(String& dest, Header& header, uintptr_t header_mask, char_t* source, Header& source_header, xml_allocator* alloc)\n\t{\n\t\tassert(!dest && (header & header_mask) == 0);\n\n\t\tif (source)\n\t\t{\n\t\t\tif (alloc && (source_header & header_mask) == 0)\n\t\t\t{\n\t\t\t\tdest = source;\n\n\t\t\t\t// since strcpy_insitu can reuse document buffer memory we need to mark both source and dest as shared\n\t\t\t\theader |= xml_memory_page_contents_shared_mask;\n\t\t\t\tsource_header |= xml_memory_page_contents_shared_mask;\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrcpy_insitu(dest, header, header_mask, source, strlength(source));\n\t\t}\n\t}\n\n\tPUGI__FN void node_copy_contents(xml_node_struct* dn, xml_node_struct* sn, xml_allocator* shared_alloc)\n\t{\n\t\tnode_copy_string(dn->name, dn->header, xml_memory_page_name_allocated_mask, sn->name, sn->header, shared_alloc);\n\t\tnode_copy_string(dn->value, dn->header, xml_memory_page_value_allocated_mask, sn->value, sn->header, shared_alloc);\n\n\t\tfor (xml_attribute_struct* sa = sn->first_attribute; sa; sa = sa->next_attribute)\n\t\t{\n\t\t\txml_attribute_struct* da = append_new_attribute(dn, get_allocator(dn));\n\n\t\t\tif (da)\n\t\t\t{\n\t\t\t\tnode_copy_string(da->name, da->header, xml_memory_page_name_allocated_mask, sa->name, sa->header, shared_alloc);\n\t\t\t\tnode_copy_string(da->value, da->header, xml_memory_page_value_allocated_mask, sa->value, sa->header, shared_alloc);\n\t\t\t}\n\t\t}\n\t}\n\n\tPUGI__FN void node_copy_tree(xml_node_struct* dn, xml_node_struct* sn)\n\t{\n\t\txml_allocator& alloc = get_allocator(dn);\n\t\txml_allocator* shared_alloc = (&alloc == &get_allocator(sn)) ? &alloc : 0;\n\n\t\tnode_copy_contents(dn, sn, shared_alloc);\n\n\t\txml_node_struct* dit = dn;\n\t\txml_node_struct* sit = sn->first_child;\n\n\t\twhile (sit && sit != sn)\n\t\t{\n\t\t\tif (sit != dn)\n\t\t\t{\n\t\t\t\txml_node_struct* copy = append_new_node(dit, alloc, PUGI__NODETYPE(sit));\n\n\t\t\t\tif (copy)\n\t\t\t\t{\n\t\t\t\t\tnode_copy_contents(copy, sit, shared_alloc);\n\n\t\t\t\t\tif (sit->first_child)\n\t\t\t\t\t{\n\t\t\t\t\t\tdit = copy;\n\t\t\t\t\t\tsit = sit->first_child;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// continue to the next node\n\t\t\tdo\n\t\t\t{\n\t\t\t\tif (sit->next_sibling)\n\t\t\t\t{\n\t\t\t\t\tsit = sit->next_sibling;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tsit = sit->parent;\n\t\t\t\tdit = dit->parent;\n\t\t\t}\n\t\t\twhile (sit != sn);\n\t\t}\n\t}\n\n\tPUGI__FN void node_copy_attribute(xml_attribute_struct* da, xml_attribute_struct* sa)\n\t{\n\t\txml_allocator& alloc = get_allocator(da);\n\t\txml_allocator* shared_alloc = (&alloc == &get_allocator(sa)) ? &alloc : 0;\n\n\t\tnode_copy_string(da->name, da->header, xml_memory_page_name_allocated_mask, sa->name, sa->header, shared_alloc);\n\t\tnode_copy_string(da->value, da->header, xml_memory_page_value_allocated_mask, sa->value, sa->header, shared_alloc);\n\t}\n\n\tinline bool is_text_node(xml_node_struct* node)\n\t{\n\t\txml_node_type type = PUGI__NODETYPE(node);\n\n\t\treturn type == node_pcdata || type == node_cdata;\n\t}\n\n\t// get value with conversion functions\n\ttemplate <typename U> U string_to_integer(const char_t* value, U minneg, U maxpos)\n\t{\n\t\tU result = 0;\n\t\tconst char_t* s = value;\n\n\t\twhile (PUGI__IS_CHARTYPE(*s, ct_space))\n\t\t\ts++;\n\n\t\tbool negative = (*s == '-');\n\n\t\ts += (*s == '+' || *s == '-');\n\n\t\tbool overflow = false;\n\n\t\tif (s[0] == '0' && (s[1] | ' ') == 'x')\n\t\t{\n\t\t\ts += 2;\n\n\t\t\tconst char_t* start = s;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tif (static_cast<unsigned>(*s - '0') < 10)\n\t\t\t\t\tresult = result * 16 + (*s - '0');\n\t\t\t\telse if (static_cast<unsigned>((*s | ' ') - 'a') < 6)\n\t\t\t\t\tresult = result * 16 + ((*s | ' ') - 'a' + 10);\n\t\t\t\telse\n\t\t\t\t\tbreak;\n\n\t\t\t\ts++;\n\t\t\t}\n\n\t\t\tsize_t digits = static_cast<size_t>(s - start);\n\n\t\t\toverflow = digits > sizeof(U) * 2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst char_t* start = s;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tif (static_cast<unsigned>(*s - '0') < 10)\n\t\t\t\t\tresult = result * 10 + (*s - '0');\n\t\t\t\telse\n\t\t\t\t\tbreak;\n\n\t\t\t\ts++;\n\t\t\t}\n\n\t\t\tsize_t digits = static_cast<size_t>(s - start);\n\n\t\t\tPUGI__STATIC_ASSERT(sizeof(U) == 8 || sizeof(U) == 4 || sizeof(U) == 2);\n\n\t\t\tconst size_t max_digits10 = sizeof(U) == 8 ? 20 : sizeof(U) == 4 ? 10 : 5;\n\t\t\tconst char max_lead = sizeof(U) == 8 ? '1' : sizeof(U) == 4 ? '4' : '6';\n\t\t\tconst size_t high_bit = sizeof(U) * 8 - 1;\n\n\t\t\toverflow = digits >= max_digits10 && !(digits == max_digits10 && (*start < max_lead || (*start == max_lead && result >> high_bit)));\n\t\t}\n\n\t\tif (negative)\n\t\t\treturn (overflow || result > minneg) ? 0 - minneg : 0 - result;\n\t\telse\n\t\t\treturn (overflow || result > maxpos) ? maxpos : result;\n\t}\n\n\tPUGI__FN int get_value_int(const char_t* value)\n\t{\n\t\treturn string_to_integer<unsigned int>(value, static_cast<unsigned int>(INT_MIN), INT_MAX);\n\t}\n\n\tPUGI__FN unsigned int get_value_uint(const char_t* value)\n\t{\n\t\treturn string_to_integer<unsigned int>(value, 0, UINT_MAX);\n\t}\n\n\tPUGI__FN double get_value_double(const char_t* value)\n\t{\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\treturn wcstod(value, 0);\n\t#else\n\t\treturn strtod(value, 0);\n\t#endif\n\t}\n\n\tPUGI__FN float get_value_float(const char_t* value)\n\t{\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\treturn static_cast<float>(wcstod(value, 0));\n\t#else\n\t\treturn static_cast<float>(strtod(value, 0));\n\t#endif\n\t}\n\n\tPUGI__FN bool get_value_bool(const char_t* value)\n\t{\n\t\t// only look at first char\n\t\tchar_t first = *value;\n\n\t\t// 1*, t* (true), T* (True), y* (yes), Y* (YES)\n\t\treturn (first == '1' || first == 't' || first == 'T' || first == 'y' || first == 'Y');\n\t}\n\n#ifdef PUGIXML_HAS_LONG_LONG\n\tPUGI__FN long long get_value_llong(const char_t* value)\n\t{\n\t\treturn string_to_integer<unsigned long long>(value, static_cast<unsigned long long>(LLONG_MIN), LLONG_MAX);\n\t}\n\n\tPUGI__FN unsigned long long get_value_ullong(const char_t* value)\n\t{\n\t\treturn string_to_integer<unsigned long long>(value, 0, ULLONG_MAX);\n\t}\n#endif\n\n\ttemplate <typename U>\n\tPUGI__FN char_t* integer_to_string(char_t* begin, char_t* end, U value, bool negative)\n\t{\n\t\tchar_t* result = end - 1;\n\t\tU rest = negative ? 0 - value : value;\n\n\t\tdo\n\t\t{\n\t\t\t*result-- = static_cast<char_t>('0' + (rest % 10));\n\t\t\trest /= 10;\n\t\t}\n\t\twhile (rest);\n\n\t\tassert(result >= begin);\n\t\t(void)begin;\n\n\t\t*result = '-';\n\n\t\treturn result + !negative;\n\t}\n\n\t// set value with conversion functions\n\ttemplate <typename String, typename Header>\n\tPUGI__FN bool set_value_ascii(String& dest, Header& header, uintptr_t header_mask, char (&buf)[128])\n\t{\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\tchar_t wbuf[128];\n\n\t\tsize_t offset = 0;\n\t\tfor (; buf[offset]; ++offset) wbuf[offset] = buf[offset];\n\n\t\treturn strcpy_insitu(dest, header, header_mask, wbuf, offset);\n\t#else\n\t\treturn strcpy_insitu(dest, header, header_mask, buf, strlength(buf));\n\t#endif\n\t}\n\n\ttemplate <typename String, typename Header>\n\tPUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, int value)\n\t{\n\t\tchar_t buf[64];\n\t\tchar_t* end = buf + sizeof(buf) / sizeof(buf[0]);\n\t\tchar_t* begin = integer_to_string<unsigned int>(buf, end, value, value < 0);\n\n\t\treturn strcpy_insitu(dest, header, header_mask, begin, end - begin);\n\t}\n\n\ttemplate <typename String, typename Header>\n\tPUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, unsigned int value)\n\t{\n\t\tchar_t buf[64];\n\t\tchar_t* end = buf + sizeof(buf) / sizeof(buf[0]);\n\t\tchar_t* begin = integer_to_string<unsigned int>(buf, end, value, false);\n\n\t\treturn strcpy_insitu(dest, header, header_mask, begin, end - begin);\n\t}\n\n\ttemplate <typename String, typename Header>\n\tPUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, float value)\n\t{\n\t\tchar buf[128];\n\t\tsprintf(buf, \"%.9g\", value);\n\n\t\treturn set_value_ascii(dest, header, header_mask, buf);\n\t}\n\n\ttemplate <typename String, typename Header>\n\tPUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, double value)\n\t{\n\t\tchar buf[128];\n\t\tsprintf(buf, \"%.17g\", value);\n\n\t\treturn set_value_ascii(dest, header, header_mask, buf);\n\t}\n\n\ttemplate <typename String, typename Header>\n\tPUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, bool value)\n\t{\n\t\treturn strcpy_insitu(dest, header, header_mask, value ? PUGIXML_TEXT(\"true\") : PUGIXML_TEXT(\"false\"), value ? 4 : 5);\n\t}\n\n#ifdef PUGIXML_HAS_LONG_LONG\n\ttemplate <typename String, typename Header>\n\tPUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, long long value)\n\t{\n\t\tchar_t buf[64];\n\t\tchar_t* end = buf + sizeof(buf) / sizeof(buf[0]);\n\t\tchar_t* begin = integer_to_string<unsigned long long>(buf, end, value, value < 0);\n\n\t\treturn strcpy_insitu(dest, header, header_mask, begin, end - begin);\n\t}\n\n\ttemplate <typename String, typename Header>\n\tPUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, unsigned long long value)\n\t{\n\t\tchar_t buf[64];\n\t\tchar_t* end = buf + sizeof(buf) / sizeof(buf[0]);\n\t\tchar_t* begin = integer_to_string<unsigned long long>(buf, end, value, false);\n\n\t\treturn strcpy_insitu(dest, header, header_mask, begin, end - begin);\n\t}\n#endif\n\n\tPUGI__FN xml_parse_result load_buffer_impl(xml_document_struct* doc, xml_node_struct* root, void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own, char_t** out_buffer)\n\t{\n\t\t// check input buffer\n\t\tif (!contents && size) return make_parse_result(status_io_error);\n\n\t\t// get actual encoding\n\t\txml_encoding buffer_encoding = impl::get_buffer_encoding(encoding, contents, size);\n\n\t\t// get private buffer\n\t\tchar_t* buffer = 0;\n\t\tsize_t length = 0;\n\n\t\tif (!impl::convert_buffer(buffer, length, buffer_encoding, contents, size, is_mutable)) return impl::make_parse_result(status_out_of_memory);\n\n\t\t// delete original buffer if we performed a conversion\n\t\tif (own && buffer != contents && contents) impl::xml_memory::deallocate(contents);\n\n\t\t// grab onto buffer if it's our buffer, user is responsible for deallocating contents himself\n\t\tif (own || buffer != contents) *out_buffer = buffer;\n\n\t\t// store buffer for offset_debug\n\t\tdoc->buffer = buffer;\n\n\t\t// parse\n\t\txml_parse_result res = impl::xml_parser::parse(buffer, length, doc, root, options);\n\n\t\t// remember encoding\n\t\tres.encoding = buffer_encoding;\n\n\t\treturn res;\n\t}\n\n\t// we need to get length of entire file to load it in memory; the only (relatively) sane way to do it is via seek/tell trick\n\tPUGI__FN xml_parse_status get_file_size(FILE* file, size_t& out_result)\n\t{\n\t#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE)\n\t\t// there are 64-bit versions of fseek/ftell, let's use them\n\t\ttypedef __int64 length_type;\n\n\t\t_fseeki64(file, 0, SEEK_END);\n\t\tlength_type length = _ftelli64(file);\n\t\t_fseeki64(file, 0, SEEK_SET);\n\t#elif defined(__MINGW32__) && !defined(__NO_MINGW_LFS) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR))\n\t\t// there are 64-bit versions of fseek/ftell, let's use them\n\t\ttypedef off64_t length_type;\n\n\t\tfseeko64(file, 0, SEEK_END);\n\t\tlength_type length = ftello64(file);\n\t\tfseeko64(file, 0, SEEK_SET);\n\t#else\n\t\t// if this is a 32-bit OS, long is enough; if this is a unix system, long is 64-bit, which is enough; otherwise we can't do anything anyway.\n\t\ttypedef long length_type;\n\n\t\tfseek(file, 0, SEEK_END);\n\t\tlength_type length = ftell(file);\n\t\tfseek(file, 0, SEEK_SET);\n\t#endif\n\n\t\t// check for I/O errors\n\t\tif (length < 0) return status_io_error;\n\n\t\t// check for overflow\n\t\tsize_t result = static_cast<size_t>(length);\n\n\t\tif (static_cast<length_type>(result) != length) return status_out_of_memory;\n\n\t\t// finalize\n\t\tout_result = result;\n\n\t\treturn status_ok;\n\t}\n\n\t// This function assumes that buffer has extra sizeof(char_t) writable bytes after size\n\tPUGI__FN size_t zero_terminate_buffer(void* buffer, size_t size, xml_encoding encoding)\n\t{\n\t\t// We only need to zero-terminate if encoding conversion does not do it for us\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\txml_encoding wchar_encoding = get_wchar_encoding();\n\n\t\tif (encoding == wchar_encoding || need_endian_swap_utf(encoding, wchar_encoding))\n\t\t{\n\t\t\tsize_t length = size / sizeof(char_t);\n\n\t\t\tstatic_cast<char_t*>(buffer)[length] = 0;\n\t\t\treturn (length + 1) * sizeof(char_t);\n\t\t}\n\t#else\n\t\tif (encoding == encoding_utf8)\n\t\t{\n\t\t\tstatic_cast<char*>(buffer)[size] = 0;\n\t\t\treturn size + 1;\n\t\t}\n\t#endif\n\n\t\treturn size;\n\t}\n\n\tPUGI__FN xml_parse_result load_file_impl(xml_document_struct* doc, FILE* file, unsigned int options, xml_encoding encoding, char_t** out_buffer)\n\t{\n\t\tif (!file) return make_parse_result(status_file_not_found);\n\n\t\t// get file size (can result in I/O errors)\n\t\tsize_t size = 0;\n\t\txml_parse_status size_status = get_file_size(file, size);\n\t\tif (size_status != status_ok) return make_parse_result(size_status);\n\n\t\tsize_t max_suffix_size = sizeof(char_t);\n\n\t\t// allocate buffer for the whole file\n\t\tchar* contents = static_cast<char*>(xml_memory::allocate(size + max_suffix_size));\n\t\tif (!contents) return make_parse_result(status_out_of_memory);\n\n\t\t// read file in memory\n\t\tsize_t read_size = fread(contents, 1, size, file);\n\n\t\tif (read_size != size)\n\t\t{\n\t\t\txml_memory::deallocate(contents);\n\t\t\treturn make_parse_result(status_io_error);\n\t\t}\n\n\t\txml_encoding real_encoding = get_buffer_encoding(encoding, contents, size);\n\n\t\treturn load_buffer_impl(doc, doc, contents, zero_terminate_buffer(contents, size, real_encoding), options, real_encoding, true, true, out_buffer);\n\t}\n\n#ifndef PUGIXML_NO_STL\n\ttemplate <typename T> struct xml_stream_chunk\n\t{\n\t\tstatic xml_stream_chunk* create()\n\t\t{\n\t\t\tvoid* memory = xml_memory::allocate(sizeof(xml_stream_chunk));\n\t\t\tif (!memory) return 0;\n\n\t\t\treturn new (memory) xml_stream_chunk();\n\t\t}\n\n\t\tstatic void destroy(xml_stream_chunk* chunk)\n\t\t{\n\t\t\t// free chunk chain\n\t\t\twhile (chunk)\n\t\t\t{\n\t\t\t\txml_stream_chunk* next_ = chunk->next;\n\n\t\t\t\txml_memory::deallocate(chunk);\n\n\t\t\t\tchunk = next_;\n\t\t\t}\n\t\t}\n\n\t\txml_stream_chunk(): next(0), size(0)\n\t\t{\n\t\t}\n\n\t\txml_stream_chunk* next;\n\t\tsize_t size;\n\n\t\tT data[xml_memory_page_size / sizeof(T)];\n\t};\n\n\ttemplate <typename T> PUGI__FN xml_parse_status load_stream_data_noseek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size)\n\t{\n\t\tauto_deleter<xml_stream_chunk<T> > chunks(0, xml_stream_chunk<T>::destroy);\n\n\t\t// read file to a chunk list\n\t\tsize_t total = 0;\n\t\txml_stream_chunk<T>* last = 0;\n\n\t\twhile (!stream.eof())\n\t\t{\n\t\t\t// allocate new chunk\n\t\t\txml_stream_chunk<T>* chunk = xml_stream_chunk<T>::create();\n\t\t\tif (!chunk) return status_out_of_memory;\n\n\t\t\t// append chunk to list\n\t\t\tif (last) last = last->next = chunk;\n\t\t\telse chunks.data = last = chunk;\n\n\t\t\t// read data to chunk\n\t\t\tstream.read(chunk->data, static_cast<std::streamsize>(sizeof(chunk->data) / sizeof(T)));\n\t\t\tchunk->size = static_cast<size_t>(stream.gcount()) * sizeof(T);\n\n\t\t\t// read may set failbit | eofbit in case gcount() is less than read length, so check for other I/O errors\n\t\t\tif (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error;\n\n\t\t\t// guard against huge files (chunk size is small enough to make this overflow check work)\n\t\t\tif (total + chunk->size < total) return status_out_of_memory;\n\t\t\ttotal += chunk->size;\n\t\t}\n\n\t\tsize_t max_suffix_size = sizeof(char_t);\n\n\t\t// copy chunk list to a contiguous buffer\n\t\tchar* buffer = static_cast<char*>(xml_memory::allocate(total + max_suffix_size));\n\t\tif (!buffer) return status_out_of_memory;\n\n\t\tchar* write = buffer;\n\n\t\tfor (xml_stream_chunk<T>* chunk = chunks.data; chunk; chunk = chunk->next)\n\t\t{\n\t\t\tassert(write + chunk->size <= buffer + total);\n\t\t\tmemcpy(write, chunk->data, chunk->size);\n\t\t\twrite += chunk->size;\n\t\t}\n\n\t\tassert(write == buffer + total);\n\n\t\t// return buffer\n\t\t*out_buffer = buffer;\n\t\t*out_size = total;\n\n\t\treturn status_ok;\n\t}\n\n\ttemplate <typename T> PUGI__FN xml_parse_status load_stream_data_seek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size)\n\t{\n\t\t// get length of remaining data in stream\n\t\ttypename std::basic_istream<T>::pos_type pos = stream.tellg();\n\t\tstream.seekg(0, std::ios::end);\n\t\tstd::streamoff length = stream.tellg() - pos;\n\t\tstream.seekg(pos);\n\n\t\tif (stream.fail() || pos < 0) return status_io_error;\n\n\t\t// guard against huge files\n\t\tsize_t read_length = static_cast<size_t>(length);\n\n\t\tif (static_cast<std::streamsize>(read_length) != length || length < 0) return status_out_of_memory;\n\n\t\tsize_t max_suffix_size = sizeof(char_t);\n\n\t\t// read stream data into memory (guard against stream exceptions with buffer holder)\n\t\tauto_deleter<void> buffer(xml_memory::allocate(read_length * sizeof(T) + max_suffix_size), xml_memory::deallocate);\n\t\tif (!buffer.data) return status_out_of_memory;\n\n\t\tstream.read(static_cast<T*>(buffer.data), static_cast<std::streamsize>(read_length));\n\n\t\t// read may set failbit | eofbit in case gcount() is less than read_length (i.e. line ending conversion), so check for other I/O errors\n\t\tif (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error;\n\n\t\t// return buffer\n\t\tsize_t actual_length = static_cast<size_t>(stream.gcount());\n\t\tassert(actual_length <= read_length);\n\n\t\t*out_buffer = buffer.release();\n\t\t*out_size = actual_length * sizeof(T);\n\n\t\treturn status_ok;\n\t}\n\n\ttemplate <typename T> PUGI__FN xml_parse_result load_stream_impl(xml_document_struct* doc, std::basic_istream<T>& stream, unsigned int options, xml_encoding encoding, char_t** out_buffer)\n\t{\n\t\tvoid* buffer = 0;\n\t\tsize_t size = 0;\n\t\txml_parse_status status = status_ok;\n\n\t\t// if stream has an error bit set, bail out (otherwise tellg() can fail and we'll clear error bits)\n\t\tif (stream.fail()) return make_parse_result(status_io_error);\n\n\t\t// load stream to memory (using seek-based implementation if possible, since it's faster and takes less memory)\n\t\tif (stream.tellg() < 0)\n\t\t{\n\t\t\tstream.clear(); // clear error flags that could be set by a failing tellg\n\t\t\tstatus = load_stream_data_noseek(stream, &buffer, &size);\n\t\t}\n\t\telse\n\t\t\tstatus = load_stream_data_seek(stream, &buffer, &size);\n\n\t\tif (status != status_ok) return make_parse_result(status);\n\n\t\txml_encoding real_encoding = get_buffer_encoding(encoding, buffer, size);\n\n\t\treturn load_buffer_impl(doc, doc, buffer, zero_terminate_buffer(buffer, size, real_encoding), options, real_encoding, true, true, out_buffer);\n\t}\n#endif\n\n#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) || (defined(__MINGW32__) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR)))\n\tPUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode)\n\t{\n\t\treturn _wfopen(path, mode);\n\t}\n#else\n\tPUGI__FN char* convert_path_heap(const wchar_t* str)\n\t{\n\t\tassert(str);\n\n\t\t// first pass: get length in utf8 characters\n\t\tsize_t length = strlength_wide(str);\n\t\tsize_t size = as_utf8_begin(str, length);\n\n\t\t// allocate resulting string\n\t\tchar* result = static_cast<char*>(xml_memory::allocate(size + 1));\n\t\tif (!result) return 0;\n\n\t\t// second pass: convert to utf8\n\t\tas_utf8_end(result, size, str, length);\n\n\t\t// zero-terminate\n\t\tresult[size] = 0;\n\n\t\treturn result;\n\t}\n\n\tPUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode)\n\t{\n\t\t// there is no standard function to open wide paths, so our best bet is to try utf8 path\n\t\tchar* path_utf8 = convert_path_heap(path);\n\t\tif (!path_utf8) return 0;\n\n\t\t// convert mode to ASCII (we mirror _wfopen interface)\n\t\tchar mode_ascii[4] = {0};\n\t\tfor (size_t i = 0; mode[i]; ++i) mode_ascii[i] = static_cast<char>(mode[i]);\n\n\t\t// try to open the utf8 path\n\t\tFILE* result = fopen(path_utf8, mode_ascii);\n\n\t\t// free dummy buffer\n\t\txml_memory::deallocate(path_utf8);\n\n\t\treturn result;\n\t}\n#endif\n\n\tPUGI__FN bool save_file_impl(const xml_document& doc, FILE* file, const char_t* indent, unsigned int flags, xml_encoding encoding)\n\t{\n\t\tif (!file) return false;\n\n\t\txml_writer_file writer(file);\n\t\tdoc.save(writer, indent, flags, encoding);\n\n\t\treturn ferror(file) == 0;\n\t}\nPUGI__NS_END\n\nnamespace pugi\n{\n\tPUGI__FN xml_writer_file::xml_writer_file(void* file_): file(file_)\n\t{\n\t}\n\n\tPUGI__FN void xml_writer_file::write(const void* data, size_t size)\n\t{\n\t\tsize_t result = fwrite(data, 1, size, static_cast<FILE*>(file));\n\t\t(void)!result; // unfortunately we can't do proper error handling here\n\t}\n\n#ifndef PUGIXML_NO_STL\n\tPUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream): narrow_stream(&stream), wide_stream(0)\n\t{\n\t}\n\n\tPUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream): narrow_stream(0), wide_stream(&stream)\n\t{\n\t}\n\n\tPUGI__FN void xml_writer_stream::write(const void* data, size_t size)\n\t{\n\t\tif (narrow_stream)\n\t\t{\n\t\t\tassert(!wide_stream);\n\t\t\tnarrow_stream->write(reinterpret_cast<const char*>(data), static_cast<std::streamsize>(size));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tassert(wide_stream);\n\t\t\tassert(size % sizeof(wchar_t) == 0);\n\n\t\t\twide_stream->write(reinterpret_cast<const wchar_t*>(data), static_cast<std::streamsize>(size / sizeof(wchar_t)));\n\t\t}\n\t}\n#endif\n\n\tPUGI__FN xml_tree_walker::xml_tree_walker(): _depth(0)\n\t{\n\t}\n\n\tPUGI__FN xml_tree_walker::~xml_tree_walker()\n\t{\n\t}\n\n\tPUGI__FN int xml_tree_walker::depth() const\n\t{\n\t\treturn _depth;\n\t}\n\n\tPUGI__FN bool xml_tree_walker::begin(xml_node&)\n\t{\n\t\treturn true;\n\t}\n\n\tPUGI__FN bool xml_tree_walker::end(xml_node&)\n\t{\n\t\treturn true;\n\t}\n\n\tPUGI__FN xml_attribute::xml_attribute(): _attr(0)\n\t{\n\t}\n\n\tPUGI__FN xml_attribute::xml_attribute(xml_attribute_struct* attr): _attr(attr)\n\t{\n\t}\n\n\tPUGI__FN static void unspecified_bool_xml_attribute(xml_attribute***)\n\t{\n\t}\n\n\tPUGI__FN xml_attribute::operator xml_attribute::unspecified_bool_type() const\n\t{\n\t\treturn _attr ? unspecified_bool_xml_attribute : 0;\n\t}\n\n\tPUGI__FN bool xml_attribute::operator!() const\n\t{\n\t\treturn !_attr;\n\t}\n\n\tPUGI__FN bool xml_attribute::operator==(const xml_attribute& r) const\n\t{\n\t\treturn (_attr == r._attr);\n\t}\n\n\tPUGI__FN bool xml_attribute::operator!=(const xml_attribute& r) const\n\t{\n\t\treturn (_attr != r._attr);\n\t}\n\n\tPUGI__FN bool xml_attribute::operator<(const xml_attribute& r) const\n\t{\n\t\treturn (_attr < r._attr);\n\t}\n\n\tPUGI__FN bool xml_attribute::operator>(const xml_attribute& r) const\n\t{\n\t\treturn (_attr > r._attr);\n\t}\n\n\tPUGI__FN bool xml_attribute::operator<=(const xml_attribute& r) const\n\t{\n\t\treturn (_attr <= r._attr);\n\t}\n\n\tPUGI__FN bool xml_attribute::operator>=(const xml_attribute& r) const\n\t{\n\t\treturn (_attr >= r._attr);\n\t}\n\n\tPUGI__FN xml_attribute xml_attribute::next_attribute() const\n\t{\n\t\treturn _attr ? xml_attribute(_attr->next_attribute) : xml_attribute();\n\t}\n\n\tPUGI__FN xml_attribute xml_attribute::previous_attribute() const\n\t{\n\t\treturn _attr && _attr->prev_attribute_c->next_attribute ? xml_attribute(_attr->prev_attribute_c) : xml_attribute();\n\t}\n\n\tPUGI__FN const char_t* xml_attribute::as_string(const char_t* def) const\n\t{\n\t\treturn (_attr && _attr->value) ? _attr->value : def;\n\t}\n\n\tPUGI__FN int xml_attribute::as_int(int def) const\n\t{\n\t\treturn (_attr && _attr->value) ? impl::get_value_int(_attr->value) : def;\n\t}\n\n\tPUGI__FN unsigned int xml_attribute::as_uint(unsigned int def) const\n\t{\n\t\treturn (_attr && _attr->value) ? impl::get_value_uint(_attr->value) : def;\n\t}\n\n\tPUGI__FN double xml_attribute::as_double(double def) const\n\t{\n\t\treturn (_attr && _attr->value) ? impl::get_value_double(_attr->value) : def;\n\t}\n\n\tPUGI__FN float xml_attribute::as_float(float def) const\n\t{\n\t\treturn (_attr && _attr->value) ? impl::get_value_float(_attr->value) : def;\n\t}\n\n\tPUGI__FN bool xml_attribute::as_bool(bool def) const\n\t{\n\t\treturn (_attr && _attr->value) ? impl::get_value_bool(_attr->value) : def;\n\t}\n\n#ifdef PUGIXML_HAS_LONG_LONG\n\tPUGI__FN long long xml_attribute::as_llong(long long def) const\n\t{\n\t\treturn (_attr && _attr->value) ? impl::get_value_llong(_attr->value) : def;\n\t}\n\n\tPUGI__FN unsigned long long xml_attribute::as_ullong(unsigned long long def) const\n\t{\n\t\treturn (_attr && _attr->value) ? impl::get_value_ullong(_attr->value) : def;\n\t}\n#endif\n\n\tPUGI__FN bool xml_attribute::empty() const\n\t{\n\t\treturn !_attr;\n\t}\n\n\tPUGI__FN const char_t* xml_attribute::name() const\n\t{\n\t\treturn (_attr && _attr->name) ? _attr->name + 0 : PUGIXML_TEXT(\"\");\n\t}\n\n\tPUGI__FN const char_t* xml_attribute::value() const\n\t{\n\t\treturn (_attr && _attr->value) ? _attr->value + 0 : PUGIXML_TEXT(\"\");\n\t}\n\n\tPUGI__FN size_t xml_attribute::hash_value() const\n\t{\n\t\treturn static_cast<size_t>(reinterpret_cast<uintptr_t>(_attr) / sizeof(xml_attribute_struct));\n\t}\n\n\tPUGI__FN xml_attribute_struct* xml_attribute::internal_object() const\n\t{\n\t\treturn _attr;\n\t}\n\n\tPUGI__FN xml_attribute& xml_attribute::operator=(const char_t* rhs)\n\t{\n\t\tset_value(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_attribute& xml_attribute::operator=(int rhs)\n\t{\n\t\tset_value(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_attribute& xml_attribute::operator=(unsigned int rhs)\n\t{\n\t\tset_value(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_attribute& xml_attribute::operator=(double rhs)\n\t{\n\t\tset_value(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_attribute& xml_attribute::operator=(float rhs)\n\t{\n\t\tset_value(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_attribute& xml_attribute::operator=(bool rhs)\n\t{\n\t\tset_value(rhs);\n\t\treturn *this;\n\t}\n\n#ifdef PUGIXML_HAS_LONG_LONG\n\tPUGI__FN xml_attribute& xml_attribute::operator=(long long rhs)\n\t{\n\t\tset_value(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_attribute& xml_attribute::operator=(unsigned long long rhs)\n\t{\n\t\tset_value(rhs);\n\t\treturn *this;\n\t}\n#endif\n\n\tPUGI__FN bool xml_attribute::set_name(const char_t* rhs)\n\t{\n\t\tif (!_attr) return false;\n\n\t\treturn impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs));\n\t}\n\n\tPUGI__FN bool xml_attribute::set_value(const char_t* rhs)\n\t{\n\t\tif (!_attr) return false;\n\n\t\treturn impl::strcpy_insitu(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs));\n\t}\n\n\tPUGI__FN bool xml_attribute::set_value(int rhs)\n\t{\n\t\tif (!_attr) return false;\n\n\t\treturn impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);\n\t}\n\n\tPUGI__FN bool xml_attribute::set_value(unsigned int rhs)\n\t{\n\t\tif (!_attr) return false;\n\n\t\treturn impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);\n\t}\n\n\tPUGI__FN bool xml_attribute::set_value(double rhs)\n\t{\n\t\tif (!_attr) return false;\n\n\t\treturn impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);\n\t}\n\n\tPUGI__FN bool xml_attribute::set_value(float rhs)\n\t{\n\t\tif (!_attr) return false;\n\n\t\treturn impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);\n\t}\n\n\tPUGI__FN bool xml_attribute::set_value(bool rhs)\n\t{\n\t\tif (!_attr) return false;\n\n\t\treturn impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);\n\t}\n\n#ifdef PUGIXML_HAS_LONG_LONG\n\tPUGI__FN bool xml_attribute::set_value(long long rhs)\n\t{\n\t\tif (!_attr) return false;\n\n\t\treturn impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);\n\t}\n\n\tPUGI__FN bool xml_attribute::set_value(unsigned long long rhs)\n\t{\n\t\tif (!_attr) return false;\n\n\t\treturn impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);\n\t}\n#endif\n\n#ifdef __BORLANDC__\n\tPUGI__FN bool operator&&(const xml_attribute& lhs, bool rhs)\n\t{\n\t\treturn (bool)lhs && rhs;\n\t}\n\n\tPUGI__FN bool operator||(const xml_attribute& lhs, bool rhs)\n\t{\n\t\treturn (bool)lhs || rhs;\n\t}\n#endif\n\n\tPUGI__FN xml_node::xml_node(): _root(0)\n\t{\n\t}\n\n\tPUGI__FN xml_node::xml_node(xml_node_struct* p): _root(p)\n\t{\n\t}\n\n\tPUGI__FN static void unspecified_bool_xml_node(xml_node***)\n\t{\n\t}\n\n\tPUGI__FN xml_node::operator xml_node::unspecified_bool_type() const\n\t{\n\t\treturn _root ? unspecified_bool_xml_node : 0;\n\t}\n\n\tPUGI__FN bool xml_node::operator!() const\n\t{\n\t\treturn !_root;\n\t}\n\n\tPUGI__FN xml_node::iterator xml_node::begin() const\n\t{\n\t\treturn iterator(_root ? _root->first_child + 0 : 0, _root);\n\t}\n\n\tPUGI__FN xml_node::iterator xml_node::end() const\n\t{\n\t\treturn iterator(0, _root);\n\t}\n\n\tPUGI__FN xml_node::attribute_iterator xml_node::attributes_begin() const\n\t{\n\t\treturn attribute_iterator(_root ? _root->first_attribute + 0 : 0, _root);\n\t}\n\n\tPUGI__FN xml_node::attribute_iterator xml_node::attributes_end() const\n\t{\n\t\treturn attribute_iterator(0, _root);\n\t}\n\n\tPUGI__FN xml_object_range<xml_node_iterator> xml_node::children() const\n\t{\n\t\treturn xml_object_range<xml_node_iterator>(begin(), end());\n\t}\n\n\tPUGI__FN xml_object_range<xml_named_node_iterator> xml_node::children(const char_t* name_) const\n\t{\n\t\treturn xml_object_range<xml_named_node_iterator>(xml_named_node_iterator(child(name_)._root, _root, name_), xml_named_node_iterator(0, _root, name_));\n\t}\n\n\tPUGI__FN xml_object_range<xml_attribute_iterator> xml_node::attributes() const\n\t{\n\t\treturn xml_object_range<xml_attribute_iterator>(attributes_begin(), attributes_end());\n\t}\n\n\tPUGI__FN bool xml_node::operator==(const xml_node& r) const\n\t{\n\t\treturn (_root == r._root);\n\t}\n\n\tPUGI__FN bool xml_node::operator!=(const xml_node& r) const\n\t{\n\t\treturn (_root != r._root);\n\t}\n\n\tPUGI__FN bool xml_node::operator<(const xml_node& r) const\n\t{\n\t\treturn (_root < r._root);\n\t}\n\n\tPUGI__FN bool xml_node::operator>(const xml_node& r) const\n\t{\n\t\treturn (_root > r._root);\n\t}\n\n\tPUGI__FN bool xml_node::operator<=(const xml_node& r) const\n\t{\n\t\treturn (_root <= r._root);\n\t}\n\n\tPUGI__FN bool xml_node::operator>=(const xml_node& r) const\n\t{\n\t\treturn (_root >= r._root);\n\t}\n\n\tPUGI__FN bool xml_node::empty() const\n\t{\n\t\treturn !_root;\n\t}\n\n\tPUGI__FN const char_t* xml_node::name() const\n\t{\n\t\treturn (_root && _root->name) ? _root->name + 0 : PUGIXML_TEXT(\"\");\n\t}\n\n\tPUGI__FN xml_node_type xml_node::type() const\n\t{\n\t\treturn _root ? PUGI__NODETYPE(_root) : node_null;\n\t}\n\n\tPUGI__FN const char_t* xml_node::value() const\n\t{\n\t\treturn (_root && _root->value) ? _root->value + 0 : PUGIXML_TEXT(\"\");\n\t}\n\n\tPUGI__FN xml_node xml_node::child(const char_t* name_) const\n\t{\n\t\tif (!_root) return xml_node();\n\n\t\tfor (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)\n\t\t\tif (i->name && impl::strequal(name_, i->name)) return xml_node(i);\n\n\t\treturn xml_node();\n\t}\n\n\tPUGI__FN xml_attribute xml_node::attribute(const char_t* name_) const\n\t{\n\t\tif (!_root) return xml_attribute();\n\n\t\tfor (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute)\n\t\t\tif (i->name && impl::strequal(name_, i->name))\n\t\t\t\treturn xml_attribute(i);\n\n\t\treturn xml_attribute();\n\t}\n\n\tPUGI__FN xml_node xml_node::next_sibling(const char_t* name_) const\n\t{\n\t\tif (!_root) return xml_node();\n\n\t\tfor (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling)\n\t\t\tif (i->name && impl::strequal(name_, i->name)) return xml_node(i);\n\n\t\treturn xml_node();\n\t}\n\n\tPUGI__FN xml_node xml_node::next_sibling() const\n\t{\n\t\treturn _root ? xml_node(_root->next_sibling) : xml_node();\n\t}\n\n\tPUGI__FN xml_node xml_node::previous_sibling(const char_t* name_) const\n\t{\n\t\tif (!_root) return xml_node();\n\n\t\tfor (xml_node_struct* i = _root->prev_sibling_c; i->next_sibling; i = i->prev_sibling_c)\n\t\t\tif (i->name && impl::strequal(name_, i->name)) return xml_node(i);\n\n\t\treturn xml_node();\n\t}\n\n\tPUGI__FN xml_attribute xml_node::attribute(const char_t* name_, xml_attribute& hint_) const\n\t{\n\t\txml_attribute_struct* hint = hint_._attr;\n\n\t\t// if hint is not an attribute of node, behavior is not defined\n\t\tassert(!hint || (_root && impl::is_attribute_of(hint, _root)));\n\n\t\tif (!_root) return xml_attribute();\n\n\t\t// optimistically search from hint up until the end\n\t\tfor (xml_attribute_struct* i = hint; i; i = i->next_attribute)\n\t\t\tif (i->name && impl::strequal(name_, i->name))\n\t\t\t{\n\t\t\t\t// update hint to maximize efficiency of searching for consecutive attributes\n\t\t\t\thint_._attr = i->next_attribute;\n\n\t\t\t\treturn xml_attribute(i);\n\t\t\t}\n\n\t\t// wrap around and search from the first attribute until the hint\n\t\t// 'j' null pointer check is technically redundant, but it prevents a crash in case the assertion above fails\n\t\tfor (xml_attribute_struct* j = _root->first_attribute; j && j != hint; j = j->next_attribute)\n\t\t\tif (j->name && impl::strequal(name_, j->name))\n\t\t\t{\n\t\t\t\t// update hint to maximize efficiency of searching for consecutive attributes\n\t\t\t\thint_._attr = j->next_attribute;\n\n\t\t\t\treturn xml_attribute(j);\n\t\t\t}\n\n\t\treturn xml_attribute();\n\t}\n\n\tPUGI__FN xml_node xml_node::previous_sibling() const\n\t{\n\t\tif (!_root) return xml_node();\n\n\t\tif (_root->prev_sibling_c->next_sibling) return xml_node(_root->prev_sibling_c);\n\t\telse return xml_node();\n\t}\n\n\tPUGI__FN xml_node xml_node::parent() const\n\t{\n\t\treturn _root ? xml_node(_root->parent) : xml_node();\n\t}\n\n\tPUGI__FN xml_node xml_node::root() const\n\t{\n\t\treturn _root ? xml_node(&impl::get_document(_root)) : xml_node();\n\t}\n\n\tPUGI__FN xml_text xml_node::text() const\n\t{\n\t\treturn xml_text(_root);\n\t}\n\n\tPUGI__FN const char_t* xml_node::child_value() const\n\t{\n\t\tif (!_root) return PUGIXML_TEXT(\"\");\n\n\t\tfor (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)\n\t\t\tif (impl::is_text_node(i) && i->value)\n\t\t\t\treturn i->value;\n\n\t\treturn PUGIXML_TEXT(\"\");\n\t}\n\n\tPUGI__FN const char_t* xml_node::child_value(const char_t* name_) const\n\t{\n\t\treturn child(name_).child_value();\n\t}\n\n\tPUGI__FN xml_attribute xml_node::first_attribute() const\n\t{\n\t\treturn _root ? xml_attribute(_root->first_attribute) : xml_attribute();\n\t}\n\n\tPUGI__FN xml_attribute xml_node::last_attribute() const\n\t{\n\t\treturn _root && _root->first_attribute ? xml_attribute(_root->first_attribute->prev_attribute_c) : xml_attribute();\n\t}\n\n\tPUGI__FN xml_node xml_node::first_child() const\n\t{\n\t\treturn _root ? xml_node(_root->first_child) : xml_node();\n\t}\n\n\tPUGI__FN xml_node xml_node::last_child() const\n\t{\n\t\treturn _root && _root->first_child ? xml_node(_root->first_child->prev_sibling_c) : xml_node();\n\t}\n\n\tPUGI__FN bool xml_node::set_name(const char_t* rhs)\n\t{\n\t\tstatic const bool has_name[] = { false, false, true, false, false, false, true, true, false };\n\n\t\tif (!_root || !has_name[PUGI__NODETYPE(_root)])\n\t\t\treturn false;\n\n\t\treturn impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs));\n\t}\n\n\tPUGI__FN bool xml_node::set_value(const char_t* rhs)\n\t{\n\t\tstatic const bool has_value[] = { false, false, false, true, true, true, true, false, true };\n\n\t\tif (!_root || !has_value[PUGI__NODETYPE(_root)])\n\t\t\treturn false;\n\n\t\treturn impl::strcpy_insitu(_root->value, _root->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs));\n\t}\n\n\tPUGI__FN xml_attribute xml_node::append_attribute(const char_t* name_)\n\t{\n\t\tif (!impl::allow_insert_attribute(type())) return xml_attribute();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_attribute();\n\n\t\txml_attribute a(impl::allocate_attribute(alloc));\n\t\tif (!a) return xml_attribute();\n\n\t\timpl::append_attribute(a._attr, _root);\n\n\t\ta.set_name(name_);\n\n\t\treturn a;\n\t}\n\n\tPUGI__FN xml_attribute xml_node::prepend_attribute(const char_t* name_)\n\t{\n\t\tif (!impl::allow_insert_attribute(type())) return xml_attribute();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_attribute();\n\n\t\txml_attribute a(impl::allocate_attribute(alloc));\n\t\tif (!a) return xml_attribute();\n\n\t\timpl::prepend_attribute(a._attr, _root);\n\n\t\ta.set_name(name_);\n\n\t\treturn a;\n\t}\n\n\tPUGI__FN xml_attribute xml_node::insert_attribute_after(const char_t* name_, const xml_attribute& attr)\n\t{\n\t\tif (!impl::allow_insert_attribute(type())) return xml_attribute();\n\t\tif (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_attribute();\n\n\t\txml_attribute a(impl::allocate_attribute(alloc));\n\t\tif (!a) return xml_attribute();\n\n\t\timpl::insert_attribute_after(a._attr, attr._attr, _root);\n\n\t\ta.set_name(name_);\n\n\t\treturn a;\n\t}\n\n\tPUGI__FN xml_attribute xml_node::insert_attribute_before(const char_t* name_, const xml_attribute& attr)\n\t{\n\t\tif (!impl::allow_insert_attribute(type())) return xml_attribute();\n\t\tif (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_attribute();\n\n\t\txml_attribute a(impl::allocate_attribute(alloc));\n\t\tif (!a) return xml_attribute();\n\n\t\timpl::insert_attribute_before(a._attr, attr._attr, _root);\n\n\t\ta.set_name(name_);\n\n\t\treturn a;\n\t}\n\n\tPUGI__FN xml_attribute xml_node::append_copy(const xml_attribute& proto)\n\t{\n\t\tif (!proto) return xml_attribute();\n\t\tif (!impl::allow_insert_attribute(type())) return xml_attribute();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_attribute();\n\n\t\txml_attribute a(impl::allocate_attribute(alloc));\n\t\tif (!a) return xml_attribute();\n\n\t\timpl::append_attribute(a._attr, _root);\n\t\timpl::node_copy_attribute(a._attr, proto._attr);\n\n\t\treturn a;\n\t}\n\n\tPUGI__FN xml_attribute xml_node::prepend_copy(const xml_attribute& proto)\n\t{\n\t\tif (!proto) return xml_attribute();\n\t\tif (!impl::allow_insert_attribute(type())) return xml_attribute();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_attribute();\n\n\t\txml_attribute a(impl::allocate_attribute(alloc));\n\t\tif (!a) return xml_attribute();\n\n\t\timpl::prepend_attribute(a._attr, _root);\n\t\timpl::node_copy_attribute(a._attr, proto._attr);\n\n\t\treturn a;\n\t}\n\n\tPUGI__FN xml_attribute xml_node::insert_copy_after(const xml_attribute& proto, const xml_attribute& attr)\n\t{\n\t\tif (!proto) return xml_attribute();\n\t\tif (!impl::allow_insert_attribute(type())) return xml_attribute();\n\t\tif (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_attribute();\n\n\t\txml_attribute a(impl::allocate_attribute(alloc));\n\t\tif (!a) return xml_attribute();\n\n\t\timpl::insert_attribute_after(a._attr, attr._attr, _root);\n\t\timpl::node_copy_attribute(a._attr, proto._attr);\n\n\t\treturn a;\n\t}\n\n\tPUGI__FN xml_attribute xml_node::insert_copy_before(const xml_attribute& proto, const xml_attribute& attr)\n\t{\n\t\tif (!proto) return xml_attribute();\n\t\tif (!impl::allow_insert_attribute(type())) return xml_attribute();\n\t\tif (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_attribute();\n\n\t\txml_attribute a(impl::allocate_attribute(alloc));\n\t\tif (!a) return xml_attribute();\n\n\t\timpl::insert_attribute_before(a._attr, attr._attr, _root);\n\t\timpl::node_copy_attribute(a._attr, proto._attr);\n\n\t\treturn a;\n\t}\n\n\tPUGI__FN xml_node xml_node::append_child(xml_node_type type_)\n\t{\n\t\tif (!impl::allow_insert_child(type(), type_)) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\txml_node n(impl::allocate_node(alloc, type_));\n\t\tif (!n) return xml_node();\n\n\t\timpl::append_node(n._root, _root);\n\n\t\tif (type_ == node_declaration) n.set_name(PUGIXML_TEXT(\"xml\"));\n\n\t\treturn n;\n\t}\n\n\tPUGI__FN xml_node xml_node::prepend_child(xml_node_type type_)\n\t{\n\t\tif (!impl::allow_insert_child(type(), type_)) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\txml_node n(impl::allocate_node(alloc, type_));\n\t\tif (!n) return xml_node();\n\n\t\timpl::prepend_node(n._root, _root);\n\n\t\tif (type_ == node_declaration) n.set_name(PUGIXML_TEXT(\"xml\"));\n\n\t\treturn n;\n\t}\n\n\tPUGI__FN xml_node xml_node::insert_child_before(xml_node_type type_, const xml_node& node)\n\t{\n\t\tif (!impl::allow_insert_child(type(), type_)) return xml_node();\n\t\tif (!node._root || node._root->parent != _root) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\txml_node n(impl::allocate_node(alloc, type_));\n\t\tif (!n) return xml_node();\n\n\t\timpl::insert_node_before(n._root, node._root);\n\n\t\tif (type_ == node_declaration) n.set_name(PUGIXML_TEXT(\"xml\"));\n\n\t\treturn n;\n\t}\n\n\tPUGI__FN xml_node xml_node::insert_child_after(xml_node_type type_, const xml_node& node)\n\t{\n\t\tif (!impl::allow_insert_child(type(), type_)) return xml_node();\n\t\tif (!node._root || node._root->parent != _root) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\txml_node n(impl::allocate_node(alloc, type_));\n\t\tif (!n) return xml_node();\n\n\t\timpl::insert_node_after(n._root, node._root);\n\n\t\tif (type_ == node_declaration) n.set_name(PUGIXML_TEXT(\"xml\"));\n\n\t\treturn n;\n\t}\n\n\tPUGI__FN xml_node xml_node::append_child(const char_t* name_)\n\t{\n\t\txml_node result = append_child(node_element);\n\n\t\tresult.set_name(name_);\n\n\t\treturn result;\n\t}\n\n\tPUGI__FN xml_node xml_node::prepend_child(const char_t* name_)\n\t{\n\t\txml_node result = prepend_child(node_element);\n\n\t\tresult.set_name(name_);\n\n\t\treturn result;\n\t}\n\n\tPUGI__FN xml_node xml_node::insert_child_after(const char_t* name_, const xml_node& node)\n\t{\n\t\txml_node result = insert_child_after(node_element, node);\n\n\t\tresult.set_name(name_);\n\n\t\treturn result;\n\t}\n\n\tPUGI__FN xml_node xml_node::insert_child_before(const char_t* name_, const xml_node& node)\n\t{\n\t\txml_node result = insert_child_before(node_element, node);\n\n\t\tresult.set_name(name_);\n\n\t\treturn result;\n\t}\n\n\tPUGI__FN xml_node xml_node::append_copy(const xml_node& proto)\n\t{\n\t\txml_node_type type_ = proto.type();\n\t\tif (!impl::allow_insert_child(type(), type_)) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\txml_node n(impl::allocate_node(alloc, type_));\n\t\tif (!n) return xml_node();\n\n\t\timpl::append_node(n._root, _root);\n\t\timpl::node_copy_tree(n._root, proto._root);\n\n\t\treturn n;\n\t}\n\n\tPUGI__FN xml_node xml_node::prepend_copy(const xml_node& proto)\n\t{\n\t\txml_node_type type_ = proto.type();\n\t\tif (!impl::allow_insert_child(type(), type_)) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\txml_node n(impl::allocate_node(alloc, type_));\n\t\tif (!n) return xml_node();\n\n\t\timpl::prepend_node(n._root, _root);\n\t\timpl::node_copy_tree(n._root, proto._root);\n\n\t\treturn n;\n\t}\n\n\tPUGI__FN xml_node xml_node::insert_copy_after(const xml_node& proto, const xml_node& node)\n\t{\n\t\txml_node_type type_ = proto.type();\n\t\tif (!impl::allow_insert_child(type(), type_)) return xml_node();\n\t\tif (!node._root || node._root->parent != _root) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\txml_node n(impl::allocate_node(alloc, type_));\n\t\tif (!n) return xml_node();\n\n\t\timpl::insert_node_after(n._root, node._root);\n\t\timpl::node_copy_tree(n._root, proto._root);\n\n\t\treturn n;\n\t}\n\n\tPUGI__FN xml_node xml_node::insert_copy_before(const xml_node& proto, const xml_node& node)\n\t{\n\t\txml_node_type type_ = proto.type();\n\t\tif (!impl::allow_insert_child(type(), type_)) return xml_node();\n\t\tif (!node._root || node._root->parent != _root) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\txml_node n(impl::allocate_node(alloc, type_));\n\t\tif (!n) return xml_node();\n\n\t\timpl::insert_node_before(n._root, node._root);\n\t\timpl::node_copy_tree(n._root, proto._root);\n\n\t\treturn n;\n\t}\n\n\tPUGI__FN xml_node xml_node::append_move(const xml_node& moved)\n\t{\n\t\tif (!impl::allow_move(*this, moved)) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\t// disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers\n\t\timpl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;\n\n\t\timpl::remove_node(moved._root);\n\t\timpl::append_node(moved._root, _root);\n\n\t\treturn moved;\n\t}\n\n\tPUGI__FN xml_node xml_node::prepend_move(const xml_node& moved)\n\t{\n\t\tif (!impl::allow_move(*this, moved)) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\t// disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers\n\t\timpl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;\n\n\t\timpl::remove_node(moved._root);\n\t\timpl::prepend_node(moved._root, _root);\n\n\t\treturn moved;\n\t}\n\n\tPUGI__FN xml_node xml_node::insert_move_after(const xml_node& moved, const xml_node& node)\n\t{\n\t\tif (!impl::allow_move(*this, moved)) return xml_node();\n\t\tif (!node._root || node._root->parent != _root) return xml_node();\n\t\tif (moved._root == node._root) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\t// disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers\n\t\timpl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;\n\n\t\timpl::remove_node(moved._root);\n\t\timpl::insert_node_after(moved._root, node._root);\n\n\t\treturn moved;\n\t}\n\n\tPUGI__FN xml_node xml_node::insert_move_before(const xml_node& moved, const xml_node& node)\n\t{\n\t\tif (!impl::allow_move(*this, moved)) return xml_node();\n\t\tif (!node._root || node._root->parent != _root) return xml_node();\n\t\tif (moved._root == node._root) return xml_node();\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return xml_node();\n\n\t\t// disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers\n\t\timpl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;\n\n\t\timpl::remove_node(moved._root);\n\t\timpl::insert_node_before(moved._root, node._root);\n\n\t\treturn moved;\n\t}\n\n\tPUGI__FN bool xml_node::remove_attribute(const char_t* name_)\n\t{\n\t\treturn remove_attribute(attribute(name_));\n\t}\n\n\tPUGI__FN bool xml_node::remove_attribute(const xml_attribute& a)\n\t{\n\t\tif (!_root || !a._attr) return false;\n\t\tif (!impl::is_attribute_of(a._attr, _root)) return false;\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return false;\n\n\t\timpl::remove_attribute(a._attr, _root);\n\t\timpl::destroy_attribute(a._attr, alloc);\n\n\t\treturn true;\n\t}\n\n\tPUGI__FN bool xml_node::remove_child(const char_t* name_)\n\t{\n\t\treturn remove_child(child(name_));\n\t}\n\n\tPUGI__FN bool xml_node::remove_child(const xml_node& n)\n\t{\n\t\tif (!_root || !n._root || n._root->parent != _root) return false;\n\n\t\timpl::xml_allocator& alloc = impl::get_allocator(_root);\n\t\tif (!alloc.reserve()) return false;\n\n\t\timpl::remove_node(n._root);\n\t\timpl::destroy_node(n._root, alloc);\n\n\t\treturn true;\n\t}\n\n\tPUGI__FN xml_parse_result xml_node::append_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding)\n\t{\n\t\t// append_buffer is only valid for elements/documents\n\t\tif (!impl::allow_insert_child(type(), node_element)) return impl::make_parse_result(status_append_invalid_root);\n\n\t\t// get document node\n\t\timpl::xml_document_struct* doc = &impl::get_document(_root);\n\n\t\t// disable document_buffer_order optimization since in a document with multiple buffers comparing buffer pointers does not make sense\n\t\tdoc->header |= impl::xml_memory_page_contents_shared_mask;\n\n\t\t// get extra buffer element (we'll store the document fragment buffer there so that we can deallocate it later)\n\t\timpl::xml_memory_page* page = 0;\n\t\timpl::xml_extra_buffer* extra = static_cast<impl::xml_extra_buffer*>(doc->allocate_memory(sizeof(impl::xml_extra_buffer), page));\n\t\t(void)page;\n\n\t\tif (!extra) return impl::make_parse_result(status_out_of_memory);\n\n\t\t// add extra buffer to the list\n\t\textra->buffer = 0;\n\t\textra->next = doc->extra_buffers;\n\t\tdoc->extra_buffers = extra;\n\n\t\t// name of the root has to be NULL before parsing - otherwise closing node mismatches will not be detected at the top level\n\t\tstruct name_sentry\n\t\t{\n\t\t\txml_node_struct* node;\n\t\t\tchar_t* name;\n\n\t\t\t~name_sentry() { node->name = name; }\n\t\t};\n\n\t\tname_sentry sentry = { _root, _root->name };\n\n\t\tsentry.node->name = 0;\n\n\t\treturn impl::load_buffer_impl(doc, _root, const_cast<void*>(contents), size, options, encoding, false, false, &extra->buffer);\n\t}\n\n\tPUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* name_, const char_t* attr_name, const char_t* attr_value) const\n\t{\n\t\tif (!_root) return xml_node();\n\n\t\tfor (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)\n\t\t\tif (i->name && impl::strequal(name_, i->name))\n\t\t\t{\n\t\t\t\tfor (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute)\n\t\t\t\t\tif (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value + 0 : PUGIXML_TEXT(\"\")))\n\t\t\t\t\t\treturn xml_node(i);\n\t\t\t}\n\n\t\treturn xml_node();\n\t}\n\n\tPUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const\n\t{\n\t\tif (!_root) return xml_node();\n\n\t\tfor (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)\n\t\t\tfor (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute)\n\t\t\t\tif (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value + 0 : PUGIXML_TEXT(\"\")))\n\t\t\t\t\treturn xml_node(i);\n\n\t\treturn xml_node();\n\t}\n\n#ifndef PUGIXML_NO_STL\n\tPUGI__FN string_t xml_node::path(char_t delimiter) const\n\t{\n\t\tif (!_root) return string_t();\n\n\t\tsize_t offset = 0;\n\n\t\tfor (xml_node_struct* i = _root; i; i = i->parent)\n\t\t{\n\t\t\toffset += (i != _root);\n\t\t\toffset += i->name ? impl::strlength(i->name) : 0;\n\t\t}\n\n\t\tstring_t result;\n\t\tresult.resize(offset);\n\n\t\tfor (xml_node_struct* j = _root; j; j = j->parent)\n\t\t{\n\t\t\tif (j != _root)\n\t\t\t\tresult[--offset] = delimiter;\n\n\t\t\tif (j->name && *j->name)\n\t\t\t{\n\t\t\t\tsize_t length = impl::strlength(j->name);\n\n\t\t\t\toffset -= length;\n\t\t\t\tmemcpy(&result[offset], j->name, length * sizeof(char_t));\n\t\t\t}\n\t\t}\n\n\t\tassert(offset == 0);\n\n\t\treturn result;\n\t}\n#endif\n\n\tPUGI__FN xml_node xml_node::first_element_by_path(const char_t* path_, char_t delimiter) const\n\t{\n\t\txml_node found = *this; // Current search context.\n\n\t\tif (!_root || !path_ || !path_[0]) return found;\n\n\t\tif (path_[0] == delimiter)\n\t\t{\n\t\t\t// Absolute path; e.g. '/foo/bar'\n\t\t\tfound = found.root();\n\t\t\t++path_;\n\t\t}\n\n\t\tconst char_t* path_segment = path_;\n\n\t\twhile (*path_segment == delimiter) ++path_segment;\n\n\t\tconst char_t* path_segment_end = path_segment;\n\n\t\twhile (*path_segment_end && *path_segment_end != delimiter) ++path_segment_end;\n\n\t\tif (path_segment == path_segment_end) return found;\n\n\t\tconst char_t* next_segment = path_segment_end;\n\n\t\twhile (*next_segment == delimiter) ++next_segment;\n\n\t\tif (*path_segment == '.' && path_segment + 1 == path_segment_end)\n\t\t\treturn found.first_element_by_path(next_segment, delimiter);\n\t\telse if (*path_segment == '.' && *(path_segment+1) == '.' && path_segment + 2 == path_segment_end)\n\t\t\treturn found.parent().first_element_by_path(next_segment, delimiter);\n\t\telse\n\t\t{\n\t\t\tfor (xml_node_struct* j = found._root->first_child; j; j = j->next_sibling)\n\t\t\t{\n\t\t\t\tif (j->name && impl::strequalrange(j->name, path_segment, static_cast<size_t>(path_segment_end - path_segment)))\n\t\t\t\t{\n\t\t\t\t\txml_node subsearch = xml_node(j).first_element_by_path(next_segment, delimiter);\n\n\t\t\t\t\tif (subsearch) return subsearch;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn xml_node();\n\t\t}\n\t}\n\n\tPUGI__FN bool xml_node::traverse(xml_tree_walker& walker)\n\t{\n\t\twalker._depth = -1;\n\n\t\txml_node arg_begin = *this;\n\t\tif (!walker.begin(arg_begin)) return false;\n\n\t\txml_node cur = first_child();\n\n\t\tif (cur)\n\t\t{\n\t\t\t++walker._depth;\n\n\t\t\tdo\n\t\t\t{\n\t\t\t\txml_node arg_for_each = cur;\n\t\t\t\tif (!walker.for_each(arg_for_each))\n\t\t\t\t\treturn false;\n\n\t\t\t\tif (cur.first_child())\n\t\t\t\t{\n\t\t\t\t\t++walker._depth;\n\t\t\t\t\tcur = cur.first_child();\n\t\t\t\t}\n\t\t\t\telse if (cur.next_sibling())\n\t\t\t\t\tcur = cur.next_sibling();\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Borland C++ workaround\n\t\t\t\t\twhile (!cur.next_sibling() && cur != *this && !cur.parent().empty())\n\t\t\t\t\t{\n\t\t\t\t\t\t--walker._depth;\n\t\t\t\t\t\tcur = cur.parent();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (cur != *this)\n\t\t\t\t\t\tcur = cur.next_sibling();\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (cur && cur != *this);\n\t\t}\n\n\t\tassert(walker._depth == -1);\n\n\t\txml_node arg_end = *this;\n\t\treturn walker.end(arg_end);\n\t}\n\n\tPUGI__FN size_t xml_node::hash_value() const\n\t{\n\t\treturn static_cast<size_t>(reinterpret_cast<uintptr_t>(_root) / sizeof(xml_node_struct));\n\t}\n\n\tPUGI__FN xml_node_struct* xml_node::internal_object() const\n\t{\n\t\treturn _root;\n\t}\n\n\tPUGI__FN void xml_node::print(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const\n\t{\n\t\tif (!_root) return;\n\n\t\timpl::xml_buffered_writer buffered_writer(writer, encoding);\n\n\t\timpl::node_output(buffered_writer, _root, indent, flags, depth);\n\n\t\tbuffered_writer.flush();\n\t}\n\n#ifndef PUGIXML_NO_STL\n\tPUGI__FN void xml_node::print(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const\n\t{\n\t\txml_writer_stream writer(stream);\n\n\t\tprint(writer, indent, flags, encoding, depth);\n\t}\n\n\tPUGI__FN void xml_node::print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags, unsigned int depth) const\n\t{\n\t\txml_writer_stream writer(stream);\n\n\t\tprint(writer, indent, flags, encoding_wchar, depth);\n\t}\n#endif\n\n\tPUGI__FN ptrdiff_t xml_node::offset_debug() const\n\t{\n\t\tif (!_root) return -1;\n\n\t\timpl::xml_document_struct& doc = impl::get_document(_root);\n\n\t\t// we can determine the offset reliably only if there is exactly once parse buffer\n\t\tif (!doc.buffer || doc.extra_buffers) return -1;\n\n\t\tswitch (type())\n\t\t{\n\t\tcase node_document:\n\t\t\treturn 0;\n\n\t\tcase node_element:\n\t\tcase node_declaration:\n\t\tcase node_pi:\n\t\t\treturn _root->name && (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0 ? _root->name - doc.buffer : -1;\n\n\t\tcase node_pcdata:\n\t\tcase node_cdata:\n\t\tcase node_comment:\n\t\tcase node_doctype:\n\t\t\treturn _root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0 ? _root->value - doc.buffer : -1;\n\n\t\tdefault:\n\t\t\treturn -1;\n\t\t}\n\t}\n\n#ifdef __BORLANDC__\n\tPUGI__FN bool operator&&(const xml_node& lhs, bool rhs)\n\t{\n\t\treturn (bool)lhs && rhs;\n\t}\n\n\tPUGI__FN bool operator||(const xml_node& lhs, bool rhs)\n\t{\n\t\treturn (bool)lhs || rhs;\n\t}\n#endif\n\n\tPUGI__FN xml_text::xml_text(xml_node_struct* root): _root(root)\n\t{\n\t}\n\n\tPUGI__FN xml_node_struct* xml_text::_data() const\n\t{\n\t\tif (!_root || impl::is_text_node(_root)) return _root;\n\n\t\tfor (xml_node_struct* node = _root->first_child; node; node = node->next_sibling)\n\t\t\tif (impl::is_text_node(node))\n\t\t\t\treturn node;\n\n\t\treturn 0;\n\t}\n\n\tPUGI__FN xml_node_struct* xml_text::_data_new()\n\t{\n\t\txml_node_struct* d = _data();\n\t\tif (d) return d;\n\n\t\treturn xml_node(_root).append_child(node_pcdata).internal_object();\n\t}\n\n\tPUGI__FN xml_text::xml_text(): _root(0)\n\t{\n\t}\n\n\tPUGI__FN static void unspecified_bool_xml_text(xml_text***)\n\t{\n\t}\n\n\tPUGI__FN xml_text::operator xml_text::unspecified_bool_type() const\n\t{\n\t\treturn _data() ? unspecified_bool_xml_text : 0;\n\t}\n\n\tPUGI__FN bool xml_text::operator!() const\n\t{\n\t\treturn !_data();\n\t}\n\n\tPUGI__FN bool xml_text::empty() const\n\t{\n\t\treturn _data() == 0;\n\t}\n\n\tPUGI__FN const char_t* xml_text::get() const\n\t{\n\t\txml_node_struct* d = _data();\n\n\t\treturn (d && d->value) ? d->value + 0 : PUGIXML_TEXT(\"\");\n\t}\n\n\tPUGI__FN const char_t* xml_text::as_string(const char_t* def) const\n\t{\n\t\txml_node_struct* d = _data();\n\n\t\treturn (d && d->value) ? d->value : def;\n\t}\n\n\tPUGI__FN int xml_text::as_int(int def) const\n\t{\n\t\txml_node_struct* d = _data();\n\n\t\treturn (d && d->value) ? impl::get_value_int(d->value) : def;\n\t}\n\n\tPUGI__FN unsigned int xml_text::as_uint(unsigned int def) const\n\t{\n\t\txml_node_struct* d = _data();\n\n\t\treturn (d && d->value) ? impl::get_value_uint(d->value) : def;\n\t}\n\n\tPUGI__FN double xml_text::as_double(double def) const\n\t{\n\t\txml_node_struct* d = _data();\n\n\t\treturn (d && d->value) ? impl::get_value_double(d->value) : def;\n\t}\n\n\tPUGI__FN float xml_text::as_float(float def) const\n\t{\n\t\txml_node_struct* d = _data();\n\n\t\treturn (d && d->value) ? impl::get_value_float(d->value) : def;\n\t}\n\n\tPUGI__FN bool xml_text::as_bool(bool def) const\n\t{\n\t\txml_node_struct* d = _data();\n\n\t\treturn (d && d->value) ? impl::get_value_bool(d->value) : def;\n\t}\n\n#ifdef PUGIXML_HAS_LONG_LONG\n\tPUGI__FN long long xml_text::as_llong(long long def) const\n\t{\n\t\txml_node_struct* d = _data();\n\n\t\treturn (d && d->value) ? impl::get_value_llong(d->value) : def;\n\t}\n\n\tPUGI__FN unsigned long long xml_text::as_ullong(unsigned long long def) const\n\t{\n\t\txml_node_struct* d = _data();\n\n\t\treturn (d && d->value) ? impl::get_value_ullong(d->value) : def;\n\t}\n#endif\n\n\tPUGI__FN bool xml_text::set(const char_t* rhs)\n\t{\n\t\txml_node_struct* dn = _data_new();\n\n\t\treturn dn ? impl::strcpy_insitu(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)) : false;\n\t}\n\n\tPUGI__FN bool xml_text::set(int rhs)\n\t{\n\t\txml_node_struct* dn = _data_new();\n\n\t\treturn dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;\n\t}\n\n\tPUGI__FN bool xml_text::set(unsigned int rhs)\n\t{\n\t\txml_node_struct* dn = _data_new();\n\n\t\treturn dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;\n\t}\n\n\tPUGI__FN bool xml_text::set(float rhs)\n\t{\n\t\txml_node_struct* dn = _data_new();\n\n\t\treturn dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;\n\t}\n\n\tPUGI__FN bool xml_text::set(double rhs)\n\t{\n\t\txml_node_struct* dn = _data_new();\n\n\t\treturn dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;\n\t}\n\n\tPUGI__FN bool xml_text::set(bool rhs)\n\t{\n\t\txml_node_struct* dn = _data_new();\n\n\t\treturn dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;\n\t}\n\n#ifdef PUGIXML_HAS_LONG_LONG\n\tPUGI__FN bool xml_text::set(long long rhs)\n\t{\n\t\txml_node_struct* dn = _data_new();\n\n\t\treturn dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;\n\t}\n\n\tPUGI__FN bool xml_text::set(unsigned long long rhs)\n\t{\n\t\txml_node_struct* dn = _data_new();\n\n\t\treturn dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;\n\t}\n#endif\n\n\tPUGI__FN xml_text& xml_text::operator=(const char_t* rhs)\n\t{\n\t\tset(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_text& xml_text::operator=(int rhs)\n\t{\n\t\tset(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_text& xml_text::operator=(unsigned int rhs)\n\t{\n\t\tset(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_text& xml_text::operator=(double rhs)\n\t{\n\t\tset(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_text& xml_text::operator=(float rhs)\n\t{\n\t\tset(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_text& xml_text::operator=(bool rhs)\n\t{\n\t\tset(rhs);\n\t\treturn *this;\n\t}\n\n#ifdef PUGIXML_HAS_LONG_LONG\n\tPUGI__FN xml_text& xml_text::operator=(long long rhs)\n\t{\n\t\tset(rhs);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_text& xml_text::operator=(unsigned long long rhs)\n\t{\n\t\tset(rhs);\n\t\treturn *this;\n\t}\n#endif\n\n\tPUGI__FN xml_node xml_text::data() const\n\t{\n\t\treturn xml_node(_data());\n\t}\n\n#ifdef __BORLANDC__\n\tPUGI__FN bool operator&&(const xml_text& lhs, bool rhs)\n\t{\n\t\treturn (bool)lhs && rhs;\n\t}\n\n\tPUGI__FN bool operator||(const xml_text& lhs, bool rhs)\n\t{\n\t\treturn (bool)lhs || rhs;\n\t}\n#endif\n\n\tPUGI__FN xml_node_iterator::xml_node_iterator()\n\t{\n\t}\n\n\tPUGI__FN xml_node_iterator::xml_node_iterator(const xml_node& node): _wrap(node), _parent(node.parent())\n\t{\n\t}\n\n\tPUGI__FN xml_node_iterator::xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent)\n\t{\n\t}\n\n\tPUGI__FN bool xml_node_iterator::operator==(const xml_node_iterator& rhs) const\n\t{\n\t\treturn _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root;\n\t}\n\n\tPUGI__FN bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const\n\t{\n\t\treturn _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root;\n\t}\n\n\tPUGI__FN xml_node& xml_node_iterator::operator*() const\n\t{\n\t\tassert(_wrap._root);\n\t\treturn _wrap;\n\t}\n\n\tPUGI__FN xml_node* xml_node_iterator::operator->() const\n\t{\n\t\tassert(_wrap._root);\n\t\treturn const_cast<xml_node*>(&_wrap); // BCC32 workaround\n\t}\n\n\tPUGI__FN const xml_node_iterator& xml_node_iterator::operator++()\n\t{\n\t\tassert(_wrap._root);\n\t\t_wrap._root = _wrap._root->next_sibling;\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_node_iterator xml_node_iterator::operator++(int)\n\t{\n\t\txml_node_iterator temp = *this;\n\t\t++*this;\n\t\treturn temp;\n\t}\n\n\tPUGI__FN const xml_node_iterator& xml_node_iterator::operator--()\n\t{\n\t\t_wrap = _wrap._root ? _wrap.previous_sibling() : _parent.last_child();\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_node_iterator xml_node_iterator::operator--(int)\n\t{\n\t\txml_node_iterator temp = *this;\n\t\t--*this;\n\t\treturn temp;\n\t}\n\n\tPUGI__FN xml_attribute_iterator::xml_attribute_iterator()\n\t{\n\t}\n\n\tPUGI__FN xml_attribute_iterator::xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent): _wrap(attr), _parent(parent)\n\t{\n\t}\n\n\tPUGI__FN xml_attribute_iterator::xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent)\n\t{\n\t}\n\n\tPUGI__FN bool xml_attribute_iterator::operator==(const xml_attribute_iterator& rhs) const\n\t{\n\t\treturn _wrap._attr == rhs._wrap._attr && _parent._root == rhs._parent._root;\n\t}\n\n\tPUGI__FN bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const\n\t{\n\t\treturn _wrap._attr != rhs._wrap._attr || _parent._root != rhs._parent._root;\n\t}\n\n\tPUGI__FN xml_attribute& xml_attribute_iterator::operator*() const\n\t{\n\t\tassert(_wrap._attr);\n\t\treturn _wrap;\n\t}\n\n\tPUGI__FN xml_attribute* xml_attribute_iterator::operator->() const\n\t{\n\t\tassert(_wrap._attr);\n\t\treturn const_cast<xml_attribute*>(&_wrap); // BCC32 workaround\n\t}\n\n\tPUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator++()\n\t{\n\t\tassert(_wrap._attr);\n\t\t_wrap._attr = _wrap._attr->next_attribute;\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_attribute_iterator xml_attribute_iterator::operator++(int)\n\t{\n\t\txml_attribute_iterator temp = *this;\n\t\t++*this;\n\t\treturn temp;\n\t}\n\n\tPUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator--()\n\t{\n\t\t_wrap = _wrap._attr ? _wrap.previous_attribute() : _parent.last_attribute();\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_attribute_iterator xml_attribute_iterator::operator--(int)\n\t{\n\t\txml_attribute_iterator temp = *this;\n\t\t--*this;\n\t\treturn temp;\n\t}\n\n\tPUGI__FN xml_named_node_iterator::xml_named_node_iterator(): _name(0)\n\t{\n\t}\n\n\tPUGI__FN xml_named_node_iterator::xml_named_node_iterator(const xml_node& node, const char_t* name): _wrap(node), _parent(node.parent()), _name(name)\n\t{\n\t}\n\n\tPUGI__FN xml_named_node_iterator::xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name): _wrap(ref), _parent(parent), _name(name)\n\t{\n\t}\n\n\tPUGI__FN bool xml_named_node_iterator::operator==(const xml_named_node_iterator& rhs) const\n\t{\n\t\treturn _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root;\n\t}\n\n\tPUGI__FN bool xml_named_node_iterator::operator!=(const xml_named_node_iterator& rhs) const\n\t{\n\t\treturn _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root;\n\t}\n\n\tPUGI__FN xml_node& xml_named_node_iterator::operator*() const\n\t{\n\t\tassert(_wrap._root);\n\t\treturn _wrap;\n\t}\n\n\tPUGI__FN xml_node* xml_named_node_iterator::operator->() const\n\t{\n\t\tassert(_wrap._root);\n\t\treturn const_cast<xml_node*>(&_wrap); // BCC32 workaround\n\t}\n\n\tPUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator++()\n\t{\n\t\tassert(_wrap._root);\n\t\t_wrap = _wrap.next_sibling(_name);\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_named_node_iterator xml_named_node_iterator::operator++(int)\n\t{\n\t\txml_named_node_iterator temp = *this;\n\t\t++*this;\n\t\treturn temp;\n\t}\n\n\tPUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator--()\n\t{\n\t\tif (_wrap._root)\n\t\t\t_wrap = _wrap.previous_sibling(_name);\n\t\telse\n\t\t{\n\t\t\t_wrap = _parent.last_child();\n\n\t\t\tif (!impl::strequal(_wrap.name(), _name))\n\t\t\t\t_wrap = _wrap.previous_sibling(_name);\n\t\t}\n\n\t\treturn *this;\n\t}\n\n\tPUGI__FN xml_named_node_iterator xml_named_node_iterator::operator--(int)\n\t{\n\t\txml_named_node_iterator temp = *this;\n\t\t--*this;\n\t\treturn temp;\n\t}\n\n\tPUGI__FN xml_parse_result::xml_parse_result(): status(status_internal_error), offset(0), encoding(encoding_auto)\n\t{\n\t}\n\n\tPUGI__FN xml_parse_result::operator bool() const\n\t{\n\t\treturn status == status_ok;\n\t}\n\n\tPUGI__FN const char* xml_parse_result::description() const\n\t{\n\t\tswitch (status)\n\t\t{\n\t\tcase status_ok: return \"No error\";\n\n\t\tcase status_file_not_found: return \"File was not found\";\n\t\tcase status_io_error: return \"Error reading from file/stream\";\n\t\tcase status_out_of_memory: return \"Could not allocate memory\";\n\t\tcase status_internal_error: return \"Internal error occurred\";\n\n\t\tcase status_unrecognized_tag: return \"Could not determine tag type\";\n\n\t\tcase status_bad_pi: return \"Error parsing document declaration/processing instruction\";\n\t\tcase status_bad_comment: return \"Error parsing comment\";\n\t\tcase status_bad_cdata: return \"Error parsing CDATA section\";\n\t\tcase status_bad_doctype: return \"Error parsing document type declaration\";\n\t\tcase status_bad_pcdata: return \"Error parsing PCDATA section\";\n\t\tcase status_bad_start_element: return \"Error parsing start element tag\";\n\t\tcase status_bad_attribute: return \"Error parsing element attribute\";\n\t\tcase status_bad_end_element: return \"Error parsing end element tag\";\n\t\tcase status_end_element_mismatch: return \"Start-end tags mismatch\";\n\n\t\tcase status_append_invalid_root: return \"Unable to append nodes: root is not an element or document\";\n\n\t\tcase status_no_document_element: return \"No document element found\";\n\n\t\tdefault: return \"Unknown error\";\n\t\t}\n\t}\n\n\tPUGI__FN xml_document::xml_document(): _buffer(0)\n\t{\n\t\tcreate();\n\t}\n\n\tPUGI__FN xml_document::~xml_document()\n\t{\n\t\tdestroy();\n\t}\n\n\tPUGI__FN void xml_document::reset()\n\t{\n\t\tdestroy();\n\t\tcreate();\n\t}\n\n\tPUGI__FN void xml_document::reset(const xml_document& proto)\n\t{\n\t\treset();\n\n\t\tfor (xml_node cur = proto.first_child(); cur; cur = cur.next_sibling())\n\t\t\tappend_copy(cur);\n\t}\n\n\tPUGI__FN void xml_document::create()\n\t{\n\t\tassert(!_root);\n\n\t#ifdef PUGIXML_COMPACT\n\t\tconst size_t page_offset = sizeof(uint32_t);\n\t#else\n\t\tconst size_t page_offset = 0;\n\t#endif\n\n\t\t// initialize sentinel page\n\t\tPUGI__STATIC_ASSERT(sizeof(impl::xml_memory_page) + sizeof(impl::xml_document_struct) + impl::xml_memory_page_alignment - sizeof(void*) + page_offset <= sizeof(_memory));\n\n\t\t// align upwards to page boundary\n\t\tvoid* page_memory = reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(_memory) + (impl::xml_memory_page_alignment - 1)) & ~(impl::xml_memory_page_alignment - 1));\n\n\t\t// prepare page structure\n\t\timpl::xml_memory_page* page = impl::xml_memory_page::construct(page_memory);\n\t\tassert(page);\n\n\t\tpage->busy_size = impl::xml_memory_page_size;\n\n\t\t// setup first page marker\n\t#ifdef PUGIXML_COMPACT\n\t\tpage->compact_page_marker = reinterpret_cast<uint32_t*>(reinterpret_cast<char*>(page) + sizeof(impl::xml_memory_page));\n\t\t*page->compact_page_marker = sizeof(impl::xml_memory_page);\n\t#endif\n\n\t\t// allocate new root\n\t\t_root = new (reinterpret_cast<char*>(page) + sizeof(impl::xml_memory_page) + page_offset) impl::xml_document_struct(page);\n\t\t_root->prev_sibling_c = _root;\n\n\t\t// setup sentinel page\n\t\tpage->allocator = static_cast<impl::xml_document_struct*>(_root);\n\n\t\t// verify the document allocation\n\t\tassert(reinterpret_cast<char*>(_root) + sizeof(impl::xml_document_struct) <= _memory + sizeof(_memory));\n\t}\n\n\tPUGI__FN void xml_document::destroy()\n\t{\n\t\tassert(_root);\n\n\t\t// destroy static storage\n\t\tif (_buffer)\n\t\t{\n\t\t\timpl::xml_memory::deallocate(_buffer);\n\t\t\t_buffer = 0;\n\t\t}\n\n\t\t// destroy extra buffers (note: no need to destroy linked list nodes, they're allocated using document allocator)\n\t\tfor (impl::xml_extra_buffer* extra = static_cast<impl::xml_document_struct*>(_root)->extra_buffers; extra; extra = extra->next)\n\t\t{\n\t\t\tif (extra->buffer) impl::xml_memory::deallocate(extra->buffer);\n\t\t}\n\n\t\t// destroy dynamic storage, leave sentinel page (it's in static memory)\n\t\timpl::xml_memory_page* root_page = PUGI__GETPAGE(_root);\n\t\tassert(root_page && !root_page->prev);\n\t\tassert(reinterpret_cast<char*>(root_page) >= _memory && reinterpret_cast<char*>(root_page) < _memory + sizeof(_memory));\n\n\t\tfor (impl::xml_memory_page* page = root_page->next; page; )\n\t\t{\n\t\t\timpl::xml_memory_page* next = page->next;\n\n\t\t\timpl::xml_allocator::deallocate_page(page);\n\n\t\t\tpage = next;\n\t\t}\n\n\t#ifdef PUGIXML_COMPACT\n\t\t// destroy hash table\n\t\tstatic_cast<impl::xml_document_struct*>(_root)->hash.clear();\n\t#endif\n\n\t\t_root = 0;\n\t}\n\n#ifndef PUGIXML_NO_STL\n\tPUGI__FN xml_parse_result xml_document::load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options, xml_encoding encoding)\n\t{\n\t\treset();\n\n\t\treturn impl::load_stream_impl(static_cast<impl::xml_document_struct*>(_root), stream, options, encoding, &_buffer);\n\t}\n\n\tPUGI__FN xml_parse_result xml_document::load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options)\n\t{\n\t\treset();\n\n\t\treturn impl::load_stream_impl(static_cast<impl::xml_document_struct*>(_root), stream, options, encoding_wchar, &_buffer);\n\t}\n#endif\n\n\tPUGI__FN xml_parse_result xml_document::load_string(const char_t* contents, unsigned int options)\n\t{\n\t\t// Force native encoding (skip autodetection)\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\txml_encoding encoding = encoding_wchar;\n\t#else\n\t\txml_encoding encoding = encoding_utf8;\n\t#endif\n\n\t\treturn load_buffer(contents, impl::strlength(contents) * sizeof(char_t), options, encoding);\n\t}\n\n\tPUGI__FN xml_parse_result xml_document::load(const char_t* contents, unsigned int options)\n\t{\n\t\treturn load_string(contents, options);\n\t}\n\n\tPUGI__FN xml_parse_result xml_document::load_file(const char* path_, unsigned int options, xml_encoding encoding)\n\t{\n\t\treset();\n\n\t\tusing impl::auto_deleter; // MSVC7 workaround\n\t\tauto_deleter<FILE, int(*)(FILE*)> file(fopen(path_, \"rb\"), fclose);\n\n\t\treturn impl::load_file_impl(static_cast<impl::xml_document_struct*>(_root), file.data, options, encoding, &_buffer);\n\t}\n\n\tPUGI__FN xml_parse_result xml_document::load_file(const wchar_t* path_, unsigned int options, xml_encoding encoding)\n\t{\n\t\treset();\n\n\t\tusing impl::auto_deleter; // MSVC7 workaround\n\t\tauto_deleter<FILE, int(*)(FILE*)> file(impl::open_file_wide(path_, L\"rb\"), fclose);\n\n\t\treturn impl::load_file_impl(static_cast<impl::xml_document_struct*>(_root), file.data, options, encoding, &_buffer);\n\t}\n\n\tPUGI__FN xml_parse_result xml_document::load_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding)\n\t{\n\t\treset();\n\n\t\treturn impl::load_buffer_impl(static_cast<impl::xml_document_struct*>(_root), _root, const_cast<void*>(contents), size, options, encoding, false, false, &_buffer);\n\t}\n\n\tPUGI__FN xml_parse_result xml_document::load_buffer_inplace(void* contents, size_t size, unsigned int options, xml_encoding encoding)\n\t{\n\t\treset();\n\n\t\treturn impl::load_buffer_impl(static_cast<impl::xml_document_struct*>(_root), _root, contents, size, options, encoding, true, false, &_buffer);\n\t}\n\n\tPUGI__FN xml_parse_result xml_document::load_buffer_inplace_own(void* contents, size_t size, unsigned int options, xml_encoding encoding)\n\t{\n\t\treset();\n\n\t\treturn impl::load_buffer_impl(static_cast<impl::xml_document_struct*>(_root), _root, contents, size, options, encoding, true, true, &_buffer);\n\t}\n\n\tPUGI__FN void xml_document::save(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding) const\n\t{\n\t\timpl::xml_buffered_writer buffered_writer(writer, encoding);\n\n\t\tif ((flags & format_write_bom) && encoding != encoding_latin1)\n\t\t{\n\t\t\t// BOM always represents the codepoint U+FEFF, so just write it in native encoding\n\t\t#ifdef PUGIXML_WCHAR_MODE\n\t\t\tunsigned int bom = 0xfeff;\n\t\t\tbuffered_writer.write(static_cast<wchar_t>(bom));\n\t\t#else\n\t\t\tbuffered_writer.write('\\xef', '\\xbb', '\\xbf');\n\t\t#endif\n\t\t}\n\n\t\tif (!(flags & format_no_declaration) && !impl::has_declaration(_root))\n\t\t{\n\t\t\tbuffered_writer.write_string(PUGIXML_TEXT(\"<?xml version=\\\"1.0\\\"\"));\n\t\t\tif (encoding == encoding_latin1) buffered_writer.write_string(PUGIXML_TEXT(\" encoding=\\\"ISO-8859-1\\\"\"));\n\t\t\tbuffered_writer.write('?', '>');\n\t\t\tif (!(flags & format_raw)) buffered_writer.write('\\n');\n\t\t}\n\n\t\timpl::node_output(buffered_writer, _root, indent, flags, 0);\n\n\t\tbuffered_writer.flush();\n\t}\n\n#ifndef PUGIXML_NO_STL\n\tPUGI__FN void xml_document::save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding) const\n\t{\n\t\txml_writer_stream writer(stream);\n\n\t\tsave(writer, indent, flags, encoding);\n\t}\n\n\tPUGI__FN void xml_document::save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags) const\n\t{\n\t\txml_writer_stream writer(stream);\n\n\t\tsave(writer, indent, flags, encoding_wchar);\n\t}\n#endif\n\n\tPUGI__FN bool xml_document::save_file(const char* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const\n\t{\n\t\tusing impl::auto_deleter; // MSVC7 workaround\n\t\tauto_deleter<FILE, int(*)(FILE*)> file(fopen(path_, (flags & format_save_file_text) ? \"w\" : \"wb\"), fclose);\n\n\t\treturn impl::save_file_impl(*this, file.data, indent, flags, encoding);\n\t}\n\n\tPUGI__FN bool xml_document::save_file(const wchar_t* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const\n\t{\n\t\tusing impl::auto_deleter; // MSVC7 workaround\n\t\tauto_deleter<FILE, int(*)(FILE*)> file(impl::open_file_wide(path_, (flags & format_save_file_text) ? L\"w\" : L\"wb\"), fclose);\n\n\t\treturn impl::save_file_impl(*this, file.data, indent, flags, encoding);\n\t}\n\n\tPUGI__FN xml_node xml_document::document_element() const\n\t{\n\t\tassert(_root);\n\n\t\tfor (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)\n\t\t\tif (PUGI__NODETYPE(i) == node_element)\n\t\t\t\treturn xml_node(i);\n\n\t\treturn xml_node();\n\t}\n\n#ifndef PUGIXML_NO_STL\n\tPUGI__FN std::string PUGIXML_FUNCTION as_utf8(const wchar_t* str)\n\t{\n\t\tassert(str);\n\n\t\treturn impl::as_utf8_impl(str, impl::strlength_wide(str));\n\t}\n\n\tPUGI__FN std::string PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t>& str)\n\t{\n\t\treturn impl::as_utf8_impl(str.c_str(), str.size());\n\t}\n\n\tPUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const char* str)\n\t{\n\t\tassert(str);\n\n\t\treturn impl::as_wide_impl(str, strlen(str));\n\t}\n\n\tPUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const std::string& str)\n\t{\n\t\treturn impl::as_wide_impl(str.c_str(), str.size());\n\t}\n#endif\n\n\tPUGI__FN void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate)\n\t{\n\t\timpl::xml_memory::allocate = allocate;\n\t\timpl::xml_memory::deallocate = deallocate;\n\t}\n\n\tPUGI__FN allocation_function PUGIXML_FUNCTION get_memory_allocation_function()\n\t{\n\t\treturn impl::xml_memory::allocate;\n\t}\n\n\tPUGI__FN deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function()\n\t{\n\t\treturn impl::xml_memory::deallocate;\n\t}\n}\n\n#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))\nnamespace std\n{\n\t// Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier)\n\tPUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_node_iterator&)\n\t{\n\t\treturn std::bidirectional_iterator_tag();\n\t}\n\n\tPUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_attribute_iterator&)\n\t{\n\t\treturn std::bidirectional_iterator_tag();\n\t}\n\n\tPUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_named_node_iterator&)\n\t{\n\t\treturn std::bidirectional_iterator_tag();\n\t}\n}\n#endif\n\n#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)\nnamespace std\n{\n\t// Workarounds for (non-standard) iterator category detection\n\tPUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&)\n\t{\n\t\treturn std::bidirectional_iterator_tag();\n\t}\n\n\tPUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&)\n\t{\n\t\treturn std::bidirectional_iterator_tag();\n\t}\n\n\tPUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_named_node_iterator&)\n\t{\n\t\treturn std::bidirectional_iterator_tag();\n\t}\n}\n#endif\n\n#ifndef PUGIXML_NO_XPATH\n// STL replacements\nPUGI__NS_BEGIN\n\tstruct equal_to\n\t{\n\t\ttemplate <typename T> bool operator()(const T& lhs, const T& rhs) const\n\t\t{\n\t\t\treturn lhs == rhs;\n\t\t}\n\t};\n\n\tstruct not_equal_to\n\t{\n\t\ttemplate <typename T> bool operator()(const T& lhs, const T& rhs) const\n\t\t{\n\t\t\treturn lhs != rhs;\n\t\t}\n\t};\n\n\tstruct less\n\t{\n\t\ttemplate <typename T> bool operator()(const T& lhs, const T& rhs) const\n\t\t{\n\t\t\treturn lhs < rhs;\n\t\t}\n\t};\n\n\tstruct less_equal\n\t{\n\t\ttemplate <typename T> bool operator()(const T& lhs, const T& rhs) const\n\t\t{\n\t\t\treturn lhs <= rhs;\n\t\t}\n\t};\n\n\ttemplate <typename T> void swap(T& lhs, T& rhs)\n\t{\n\t\tT temp = lhs;\n\t\tlhs = rhs;\n\t\trhs = temp;\n\t}\n\n\ttemplate <typename I, typename Pred> I min_element(I begin, I end, const Pred& pred)\n\t{\n\t\tI result = begin;\n\n\t\tfor (I it = begin + 1; it != end; ++it)\n\t\t\tif (pred(*it, *result))\n\t\t\t\tresult = it;\n\n\t\treturn result;\n\t}\n\n\ttemplate <typename I> void reverse(I begin, I end)\n\t{\n\t\twhile (end - begin > 1) swap(*begin++, *--end);\n\t}\n\n\ttemplate <typename I> I unique(I begin, I end)\n\t{\n\t\t// fast skip head\n\t\twhile (end - begin > 1 && *begin != *(begin + 1)) begin++;\n\n\t\tif (begin == end) return begin;\n\n\t\t// last written element\n\t\tI write = begin++;\n\n\t\t// merge unique elements\n\t\twhile (begin != end)\n\t\t{\n\t\t\tif (*begin != *write)\n\t\t\t\t*++write = *begin++;\n\t\t\telse\n\t\t\t\tbegin++;\n\t\t}\n\n\t\t// past-the-end (write points to live element)\n\t\treturn write + 1;\n\t}\n\n\ttemplate <typename I> void copy_backwards(I begin, I end, I target)\n\t{\n\t\twhile (begin != end) *--target = *--end;\n\t}\n\n\ttemplate <typename I, typename Pred, typename T> void insertion_sort(I begin, I end, const Pred& pred, T*)\n\t{\n\t\tassert(begin != end);\n\n\t\tfor (I it = begin + 1; it != end; ++it)\n\t\t{\n\t\t\tT val = *it;\n\n\t\t\tif (pred(val, *begin))\n\t\t\t{\n\t\t\t\t// move to front\n\t\t\t\tcopy_backwards(begin, it, it + 1);\n\t\t\t\t*begin = val;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tI hole = it;\n\n\t\t\t\t// move hole backwards\n\t\t\t\twhile (pred(val, *(hole - 1)))\n\t\t\t\t{\n\t\t\t\t\t*hole = *(hole - 1);\n\t\t\t\t\thole--;\n\t\t\t\t}\n\n\t\t\t\t// fill hole with element\n\t\t\t\t*hole = val;\n\t\t\t}\n\t\t}\n\t}\n\n\t// std variant for elements with ==\n\ttemplate <typename I, typename Pred> void partition(I begin, I middle, I end, const Pred& pred, I* out_eqbeg, I* out_eqend)\n\t{\n\t\tI eqbeg = middle, eqend = middle + 1;\n\n\t\t// expand equal range\n\t\twhile (eqbeg != begin && *(eqbeg - 1) == *eqbeg) --eqbeg;\n\t\twhile (eqend != end && *eqend == *eqbeg) ++eqend;\n\n\t\t// process outer elements\n\t\tI ltend = eqbeg, gtbeg = eqend;\n\n\t\tfor (;;)\n\t\t{\n\t\t\t// find the element from the right side that belongs to the left one\n\t\t\tfor (; gtbeg != end; ++gtbeg)\n\t\t\t\tif (!pred(*eqbeg, *gtbeg))\n\t\t\t\t{\n\t\t\t\t\tif (*gtbeg == *eqbeg) swap(*gtbeg, *eqend++);\n\t\t\t\t\telse break;\n\t\t\t\t}\n\n\t\t\t// find the element from the left side that belongs to the right one\n\t\t\tfor (; ltend != begin; --ltend)\n\t\t\t\tif (!pred(*(ltend - 1), *eqbeg))\n\t\t\t\t{\n\t\t\t\t\tif (*eqbeg == *(ltend - 1)) swap(*(ltend - 1), *--eqbeg);\n\t\t\t\t\telse break;\n\t\t\t\t}\n\n\t\t\t// scanned all elements\n\t\t\tif (gtbeg == end && ltend == begin)\n\t\t\t{\n\t\t\t\t*out_eqbeg = eqbeg;\n\t\t\t\t*out_eqend = eqend;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// make room for elements by moving equal area\n\t\t\tif (gtbeg == end)\n\t\t\t{\n\t\t\t\tif (--ltend != --eqbeg) swap(*ltend, *eqbeg);\n\t\t\t\tswap(*eqbeg, *--eqend);\n\t\t\t}\n\t\t\telse if (ltend == begin)\n\t\t\t{\n\t\t\t\tif (eqend != gtbeg) swap(*eqbeg, *eqend);\n\t\t\t\t++eqend;\n\t\t\t\tswap(*gtbeg++, *eqbeg++);\n\t\t\t}\n\t\t\telse swap(*gtbeg++, *--ltend);\n\t\t}\n\t}\n\n\ttemplate <typename I, typename Pred> void median3(I first, I middle, I last, const Pred& pred)\n\t{\n\t\tif (pred(*middle, *first)) swap(*middle, *first);\n\t\tif (pred(*last, *middle)) swap(*last, *middle);\n\t\tif (pred(*middle, *first)) swap(*middle, *first);\n\t}\n\n\ttemplate <typename I, typename Pred> void median(I first, I middle, I last, const Pred& pred)\n\t{\n\t\tif (last - first <= 40)\n\t\t{\n\t\t\t// median of three for small chunks\n\t\t\tmedian3(first, middle, last, pred);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// median of nine\n\t\t\tsize_t step = (last - first + 1) / 8;\n\n\t\t\tmedian3(first, first + step, first + 2 * step, pred);\n\t\t\tmedian3(middle - step, middle, middle + step, pred);\n\t\t\tmedian3(last - 2 * step, last - step, last, pred);\n\t\t\tmedian3(first + step, middle, last - step, pred);\n\t\t}\n\t}\n\n\ttemplate <typename I, typename Pred> void sort(I begin, I end, const Pred& pred)\n\t{\n\t\t// sort large chunks\n\t\twhile (end - begin > 32)\n\t\t{\n\t\t\t// find median element\n\t\t\tI middle = begin + (end - begin) / 2;\n\t\t\tmedian(begin, middle, end - 1, pred);\n\n\t\t\t// partition in three chunks (< = >)\n\t\t\tI eqbeg, eqend;\n\t\t\tpartition(begin, middle, end, pred, &eqbeg, &eqend);\n\n\t\t\t// loop on larger half\n\t\t\tif (eqbeg - begin > end - eqend)\n\t\t\t{\n\t\t\t\tsort(eqend, end, pred);\n\t\t\t\tend = eqbeg;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsort(begin, eqbeg, pred);\n\t\t\t\tbegin = eqend;\n\t\t\t}\n\t\t}\n\n\t\t// insertion sort small chunk\n\t\tif (begin != end) insertion_sort(begin, end, pred, &*begin);\n\t}\nPUGI__NS_END\n\n// Allocator used for AST and evaluation stacks\nPUGI__NS_BEGIN\n\tstatic const size_t xpath_memory_page_size =\n\t#ifdef PUGIXML_MEMORY_XPATH_PAGE_SIZE\n\t\tPUGIXML_MEMORY_XPATH_PAGE_SIZE\n\t#else\n\t\t4096\n\t#endif\n\t\t;\n\n\tstatic const uintptr_t xpath_memory_block_alignment = sizeof(double) > sizeof(void*) ? sizeof(double) : sizeof(void*);\n\n\tstruct xpath_memory_block\n\t{\n\t\txpath_memory_block* next;\n\t\tsize_t capacity;\n\n\t\tunion\n\t\t{\n\t\t\tchar data[xpath_memory_page_size];\n\t\t\tdouble alignment;\n\t\t};\n\t};\n\n\tclass xpath_allocator\n\t{\n\t\txpath_memory_block* _root;\n\t\tsize_t _root_size;\n\n\tpublic:\n\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\tjmp_buf* error_handler;\n\t#endif\n\n\t\txpath_allocator(xpath_memory_block* root, size_t root_size = 0): _root(root), _root_size(root_size)\n\t\t{\n\t\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\t\terror_handler = 0;\n\t\t#endif\n\t\t}\n\n\t\tvoid* allocate_nothrow(size_t size)\n\t\t{\n\t\t\t// round size up to block alignment boundary\n\t\t\tsize = (size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1);\n\n\t\t\tif (_root_size + size <= _root->capacity)\n\t\t\t{\n\t\t\t\tvoid* buf = &_root->data[0] + _root_size;\n\t\t\t\t_root_size += size;\n\t\t\t\treturn buf;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// make sure we have at least 1/4th of the page free after allocation to satisfy subsequent allocation requests\n\t\t\t\tsize_t block_capacity_base = sizeof(_root->data);\n\t\t\t\tsize_t block_capacity_req = size + block_capacity_base / 4;\n\t\t\t\tsize_t block_capacity = (block_capacity_base > block_capacity_req) ? block_capacity_base : block_capacity_req;\n\n\t\t\t\tsize_t block_size = block_capacity + offsetof(xpath_memory_block, data);\n\n\t\t\t\txpath_memory_block* block = static_cast<xpath_memory_block*>(xml_memory::allocate(block_size));\n\t\t\t\tif (!block) return 0;\n\n\t\t\t\tblock->next = _root;\n\t\t\t\tblock->capacity = block_capacity;\n\n\t\t\t\t_root = block;\n\t\t\t\t_root_size = size;\n\n\t\t\t\treturn block->data;\n\t\t\t}\n\t\t}\n\n\t\tvoid* allocate(size_t size)\n\t\t{\n\t\t\tvoid* result = allocate_nothrow(size);\n\n\t\t\tif (!result)\n\t\t\t{\n\t\t\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\t\t\tassert(error_handler);\n\t\t\t\tlongjmp(*error_handler, 1);\n\t\t\t#else\n\t\t\t\tthrow std::bad_alloc();\n\t\t\t#endif\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tvoid* reallocate(void* ptr, size_t old_size, size_t new_size)\n\t\t{\n\t\t\t// round size up to block alignment boundary\n\t\t\told_size = (old_size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1);\n\t\t\tnew_size = (new_size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1);\n\n\t\t\t// we can only reallocate the last object\n\t\t\tassert(ptr == 0 || static_cast<char*>(ptr) + old_size == &_root->data[0] + _root_size);\n\n\t\t\t// adjust root size so that we have not allocated the object at all\n\t\t\tbool only_object = (_root_size == old_size);\n\n\t\t\tif (ptr) _root_size -= old_size;\n\n\t\t\t// allocate a new version (this will obviously reuse the memory if possible)\n\t\t\tvoid* result = allocate(new_size);\n\t\t\tassert(result);\n\n\t\t\t// we have a new block\n\t\t\tif (result != ptr && ptr)\n\t\t\t{\n\t\t\t\t// copy old data\n\t\t\t\tassert(new_size >= old_size);\n\t\t\t\tmemcpy(result, ptr, old_size);\n\n\t\t\t\t// free the previous page if it had no other objects\n\t\t\t\tif (only_object)\n\t\t\t\t{\n\t\t\t\t\tassert(_root->data == result);\n\t\t\t\t\tassert(_root->next);\n\n\t\t\t\t\txpath_memory_block* next = _root->next->next;\n\n\t\t\t\t\tif (next)\n\t\t\t\t\t{\n\t\t\t\t\t\t// deallocate the whole page, unless it was the first one\n\t\t\t\t\t\txml_memory::deallocate(_root->next);\n\t\t\t\t\t\t_root->next = next;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tvoid revert(const xpath_allocator& state)\n\t\t{\n\t\t\t// free all new pages\n\t\t\txpath_memory_block* cur = _root;\n\n\t\t\twhile (cur != state._root)\n\t\t\t{\n\t\t\t\txpath_memory_block* next = cur->next;\n\n\t\t\t\txml_memory::deallocate(cur);\n\n\t\t\t\tcur = next;\n\t\t\t}\n\n\t\t\t// restore state\n\t\t\t_root = state._root;\n\t\t\t_root_size = state._root_size;\n\t\t}\n\n\t\tvoid release()\n\t\t{\n\t\t\txpath_memory_block* cur = _root;\n\t\t\tassert(cur);\n\n\t\t\twhile (cur->next)\n\t\t\t{\n\t\t\t\txpath_memory_block* next = cur->next;\n\n\t\t\t\txml_memory::deallocate(cur);\n\n\t\t\t\tcur = next;\n\t\t\t}\n\t\t}\n\t};\n\n\tstruct xpath_allocator_capture\n\t{\n\t\txpath_allocator_capture(xpath_allocator* alloc): _target(alloc), _state(*alloc)\n\t\t{\n\t\t}\n\n\t\t~xpath_allocator_capture()\n\t\t{\n\t\t\t_target->revert(_state);\n\t\t}\n\n\t\txpath_allocator* _target;\n\t\txpath_allocator _state;\n\t};\n\n\tstruct xpath_stack\n\t{\n\t\txpath_allocator* result;\n\t\txpath_allocator* temp;\n\t};\n\n\tstruct xpath_stack_data\n\t{\n\t\txpath_memory_block blocks[2];\n\t\txpath_allocator result;\n\t\txpath_allocator temp;\n\t\txpath_stack stack;\n\n\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\tjmp_buf error_handler;\n\t#endif\n\n\t\txpath_stack_data(): result(blocks + 0), temp(blocks + 1)\n\t\t{\n\t\t\tblocks[0].next = blocks[1].next = 0;\n\t\t\tblocks[0].capacity = blocks[1].capacity = sizeof(blocks[0].data);\n\n\t\t\tstack.result = &result;\n\t\t\tstack.temp = &temp;\n\n\t\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\t\tresult.error_handler = temp.error_handler = &error_handler;\n\t\t#endif\n\t\t}\n\n\t\t~xpath_stack_data()\n\t\t{\n\t\t\tresult.release();\n\t\t\ttemp.release();\n\t\t}\n\t};\nPUGI__NS_END\n\n// String class\nPUGI__NS_BEGIN\n\tclass xpath_string\n\t{\n\t\tconst char_t* _buffer;\n\t\tbool _uses_heap;\n\t\tsize_t _length_heap;\n\n\t\tstatic char_t* duplicate_string(const char_t* string, size_t length, xpath_allocator* alloc)\n\t\t{\n\t\t\tchar_t* result = static_cast<char_t*>(alloc->allocate((length + 1) * sizeof(char_t)));\n\t\t\tassert(result);\n\n\t\t\tmemcpy(result, string, length * sizeof(char_t));\n\t\t\tresult[length] = 0;\n\n\t\t\treturn result;\n\t\t}\n\n\t\txpath_string(const char_t* buffer, bool uses_heap_, size_t length_heap): _buffer(buffer), _uses_heap(uses_heap_), _length_heap(length_heap)\n\t\t{\n\t\t}\n\n\tpublic:\n\t\tstatic xpath_string from_const(const char_t* str)\n\t\t{\n\t\t\treturn xpath_string(str, false, 0);\n\t\t}\n\n\t\tstatic xpath_string from_heap_preallocated(const char_t* begin, const char_t* end)\n\t\t{\n\t\t\tassert(begin <= end && *end == 0);\n\n\t\t\treturn xpath_string(begin, true, static_cast<size_t>(end - begin));\n\t\t}\n\n\t\tstatic xpath_string from_heap(const char_t* begin, const char_t* end, xpath_allocator* alloc)\n\t\t{\n\t\t\tassert(begin <= end);\n\n\t\t\tsize_t length = static_cast<size_t>(end - begin);\n\n\t\t\treturn length == 0 ? xpath_string() : xpath_string(duplicate_string(begin, length, alloc), true, length);\n\t\t}\n\n\t\txpath_string(): _buffer(PUGIXML_TEXT(\"\")), _uses_heap(false), _length_heap(0)\n\t\t{\n\t\t}\n\n\t\tvoid append(const xpath_string& o, xpath_allocator* alloc)\n\t\t{\n\t\t\t// skip empty sources\n\t\t\tif (!*o._buffer) return;\n\n\t\t\t// fast append for constant empty target and constant source\n\t\t\tif (!*_buffer && !_uses_heap && !o._uses_heap)\n\t\t\t{\n\t\t\t\t_buffer = o._buffer;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// need to make heap copy\n\t\t\t\tsize_t target_length = length();\n\t\t\t\tsize_t source_length = o.length();\n\t\t\t\tsize_t result_length = target_length + source_length;\n\n\t\t\t\t// allocate new buffer\n\t\t\t\tchar_t* result = static_cast<char_t*>(alloc->reallocate(_uses_heap ? const_cast<char_t*>(_buffer) : 0, (target_length + 1) * sizeof(char_t), (result_length + 1) * sizeof(char_t)));\n\t\t\t\tassert(result);\n\n\t\t\t\t// append first string to the new buffer in case there was no reallocation\n\t\t\t\tif (!_uses_heap) memcpy(result, _buffer, target_length * sizeof(char_t));\n\n\t\t\t\t// append second string to the new buffer\n\t\t\t\tmemcpy(result + target_length, o._buffer, source_length * sizeof(char_t));\n\t\t\t\tresult[result_length] = 0;\n\n\t\t\t\t// finalize\n\t\t\t\t_buffer = result;\n\t\t\t\t_uses_heap = true;\n\t\t\t\t_length_heap = result_length;\n\t\t\t}\n\t\t}\n\n\t\tconst char_t* c_str() const\n\t\t{\n\t\t\treturn _buffer;\n\t\t}\n\n\t\tsize_t length() const\n\t\t{\n\t\t\treturn _uses_heap ? _length_heap : strlength(_buffer);\n\t\t}\n\n\t\tchar_t* data(xpath_allocator* alloc)\n\t\t{\n\t\t\t// make private heap copy\n\t\t\tif (!_uses_heap)\n\t\t\t{\n\t\t\t\tsize_t length_ = strlength(_buffer);\n\n\t\t\t\t_buffer = duplicate_string(_buffer, length_, alloc);\n\t\t\t\t_uses_heap = true;\n\t\t\t\t_length_heap = length_;\n\t\t\t}\n\n\t\t\treturn const_cast<char_t*>(_buffer);\n\t\t}\n\n\t\tbool empty() const\n\t\t{\n\t\t\treturn *_buffer == 0;\n\t\t}\n\n\t\tbool operator==(const xpath_string& o) const\n\t\t{\n\t\t\treturn strequal(_buffer, o._buffer);\n\t\t}\n\n\t\tbool operator!=(const xpath_string& o) const\n\t\t{\n\t\t\treturn !strequal(_buffer, o._buffer);\n\t\t}\n\n\t\tbool uses_heap() const\n\t\t{\n\t\t\treturn _uses_heap;\n\t\t}\n\t};\nPUGI__NS_END\n\nPUGI__NS_BEGIN\n\tPUGI__FN bool starts_with(const char_t* string, const char_t* pattern)\n\t{\n\t\twhile (*pattern && *string == *pattern)\n\t\t{\n\t\t\tstring++;\n\t\t\tpattern++;\n\t\t}\n\n\t\treturn *pattern == 0;\n\t}\n\n\tPUGI__FN const char_t* find_char(const char_t* s, char_t c)\n\t{\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\treturn wcschr(s, c);\n\t#else\n\t\treturn strchr(s, c);\n\t#endif\n\t}\n\n\tPUGI__FN const char_t* find_substring(const char_t* s, const char_t* p)\n\t{\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\t// MSVC6 wcsstr bug workaround (if s is empty it always returns 0)\n\t\treturn (*p == 0) ? s : wcsstr(s, p);\n\t#else\n\t\treturn strstr(s, p);\n\t#endif\n\t}\n\n\t// Converts symbol to lower case, if it is an ASCII one\n\tPUGI__FN char_t tolower_ascii(char_t ch)\n\t{\n\t\treturn static_cast<unsigned int>(ch - 'A') < 26 ? static_cast<char_t>(ch | ' ') : ch;\n\t}\n\n\tPUGI__FN xpath_string string_value(const xpath_node& na, xpath_allocator* alloc)\n\t{\n\t\tif (na.attribute())\n\t\t\treturn xpath_string::from_const(na.attribute().value());\n\t\telse\n\t\t{\n\t\t\txml_node n = na.node();\n\n\t\t\tswitch (n.type())\n\t\t\t{\n\t\t\tcase node_pcdata:\n\t\t\tcase node_cdata:\n\t\t\tcase node_comment:\n\t\t\tcase node_pi:\n\t\t\t\treturn xpath_string::from_const(n.value());\n\n\t\t\tcase node_document:\n\t\t\tcase node_element:\n\t\t\t{\n\t\t\t\txpath_string result;\n\n\t\t\t\txml_node cur = n.first_child();\n\n\t\t\t\twhile (cur && cur != n)\n\t\t\t\t{\n\t\t\t\t\tif (cur.type() == node_pcdata || cur.type() == node_cdata)\n\t\t\t\t\t\tresult.append(xpath_string::from_const(cur.value()), alloc);\n\n\t\t\t\t\tif (cur.first_child())\n\t\t\t\t\t\tcur = cur.first_child();\n\t\t\t\t\telse if (cur.next_sibling())\n\t\t\t\t\t\tcur = cur.next_sibling();\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\twhile (!cur.next_sibling() && cur != n)\n\t\t\t\t\t\t\tcur = cur.parent();\n\n\t\t\t\t\t\tif (cur != n) cur = cur.next_sibling();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn xpath_string();\n\t\t\t}\n\t\t}\n\t}\n\n\tPUGI__FN bool node_is_before_sibling(xml_node_struct* ln, xml_node_struct* rn)\n\t{\n\t\tassert(ln->parent == rn->parent);\n\n\t\t// there is no common ancestor (the shared parent is null), nodes are from different documents\n\t\tif (!ln->parent) return ln < rn;\n\n\t\t// determine sibling order\n\t\txml_node_struct* ls = ln;\n\t\txml_node_struct* rs = rn;\n\n\t\twhile (ls && rs)\n\t\t{\n\t\t\tif (ls == rn) return true;\n\t\t\tif (rs == ln) return false;\n\n\t\t\tls = ls->next_sibling;\n\t\t\trs = rs->next_sibling;\n\t\t}\n\n\t\t// if rn sibling chain ended ln must be before rn\n\t\treturn !rs;\n\t}\n\n\tPUGI__FN bool node_is_before(xml_node_struct* ln, xml_node_struct* rn)\n\t{\n\t\t// find common ancestor at the same depth, if any\n\t\txml_node_struct* lp = ln;\n\t\txml_node_struct* rp = rn;\n\n\t\twhile (lp && rp && lp->parent != rp->parent)\n\t\t{\n\t\t\tlp = lp->parent;\n\t\t\trp = rp->parent;\n\t\t}\n\n\t\t// parents are the same!\n\t\tif (lp && rp) return node_is_before_sibling(lp, rp);\n\n\t\t// nodes are at different depths, need to normalize heights\n\t\tbool left_higher = !lp;\n\n\t\twhile (lp)\n\t\t{\n\t\t\tlp = lp->parent;\n\t\t\tln = ln->parent;\n\t\t}\n\n\t\twhile (rp)\n\t\t{\n\t\t\trp = rp->parent;\n\t\t\trn = rn->parent;\n\t\t}\n\n\t\t// one node is the ancestor of the other\n\t\tif (ln == rn) return left_higher;\n\n\t\t// find common ancestor... again\n\t\twhile (ln->parent != rn->parent)\n\t\t{\n\t\t\tln = ln->parent;\n\t\t\trn = rn->parent;\n\t\t}\n\n\t\treturn node_is_before_sibling(ln, rn);\n\t}\n\n\tPUGI__FN bool node_is_ancestor(xml_node_struct* parent, xml_node_struct* node)\n\t{\n\t\twhile (node && node != parent) node = node->parent;\n\n\t\treturn parent && node == parent;\n\t}\n\n\tPUGI__FN const void* document_buffer_order(const xpath_node& xnode)\n\t{\n\t\txml_node_struct* node = xnode.node().internal_object();\n\n\t\tif (node)\n\t\t{\n\t\t\tif ((get_document(node).header & xml_memory_page_contents_shared_mask) == 0)\n\t\t\t{\n\t\t\t\tif (node->name && (node->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return node->name;\n\t\t\t\tif (node->value && (node->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return node->value;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\txml_attribute_struct* attr = xnode.attribute().internal_object();\n\n\t\tif (attr)\n\t\t{\n\t\t\tif ((get_document(attr).header & xml_memory_page_contents_shared_mask) == 0)\n\t\t\t{\n\t\t\t\tif ((attr->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return attr->name;\n\t\t\t\tif ((attr->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return attr->value;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tstruct document_order_comparator\n\t{\n\t\tbool operator()(const xpath_node& lhs, const xpath_node& rhs) const\n\t\t{\n\t\t\t// optimized document order based check\n\t\t\tconst void* lo = document_buffer_order(lhs);\n\t\t\tconst void* ro = document_buffer_order(rhs);\n\n\t\t\tif (lo && ro) return lo < ro;\n\n\t\t\t// slow comparison\n\t\t\txml_node ln = lhs.node(), rn = rhs.node();\n\n\t\t\t// compare attributes\n\t\t\tif (lhs.attribute() && rhs.attribute())\n\t\t\t{\n\t\t\t\t// shared parent\n\t\t\t\tif (lhs.parent() == rhs.parent())\n\t\t\t\t{\n\t\t\t\t\t// determine sibling order\n\t\t\t\t\tfor (xml_attribute a = lhs.attribute(); a; a = a.next_attribute())\n\t\t\t\t\t\tif (a == rhs.attribute())\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// compare attribute parents\n\t\t\t\tln = lhs.parent();\n\t\t\t\trn = rhs.parent();\n\t\t\t}\n\t\t\telse if (lhs.attribute())\n\t\t\t{\n\t\t\t\t// attributes go after the parent element\n\t\t\t\tif (lhs.parent() == rhs.node()) return false;\n\n\t\t\t\tln = lhs.parent();\n\t\t\t}\n\t\t\telse if (rhs.attribute())\n\t\t\t{\n\t\t\t\t// attributes go after the parent element\n\t\t\t\tif (rhs.parent() == lhs.node()) return true;\n\n\t\t\t\trn = rhs.parent();\n\t\t\t}\n\n\t\t\tif (ln == rn) return false;\n\n\t\t\tif (!ln || !rn) return ln < rn;\n\n\t\t\treturn node_is_before(ln.internal_object(), rn.internal_object());\n\t\t}\n\t};\n\n\tstruct duplicate_comparator\n\t{\n\t\tbool operator()(const xpath_node& lhs, const xpath_node& rhs) const\n\t\t{\n\t\t\tif (lhs.attribute()) return rhs.attribute() ? lhs.attribute() < rhs.attribute() : true;\n\t\t\telse return rhs.attribute() ? false : lhs.node() < rhs.node();\n\t\t}\n\t};\n\n\tPUGI__FN double gen_nan()\n\t{\n\t#if defined(__STDC_IEC_559__) || ((FLT_RADIX - 0 == 2) && (FLT_MAX_EXP - 0 == 128) && (FLT_MANT_DIG - 0 == 24))\n\t\tunion { float f; uint32_t i; } u[sizeof(float) == sizeof(uint32_t) ? 1 : -1];\n\t\tu[0].i = 0x7fc00000;\n\t\treturn u[0].f;\n\t#else\n\t\t// fallback\n\t\tconst volatile double zero = 0.0;\n\t\treturn zero / zero;\n\t#endif\n\t}\n\n\tPUGI__FN bool is_nan(double value)\n\t{\n\t#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__)\n\t\treturn !!_isnan(value);\n\t#elif defined(fpclassify) && defined(FP_NAN)\n\t\treturn fpclassify(value) == FP_NAN;\n\t#else\n\t\t// fallback\n\t\tconst volatile double v = value;\n\t\treturn v != v;\n\t#endif\n\t}\n\n\tPUGI__FN const char_t* convert_number_to_string_special(double value)\n\t{\n\t#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__)\n\t\tif (_finite(value)) return (value == 0) ? PUGIXML_TEXT(\"0\") : 0;\n\t\tif (_isnan(value)) return PUGIXML_TEXT(\"NaN\");\n\t\treturn value > 0 ? PUGIXML_TEXT(\"Infinity\") : PUGIXML_TEXT(\"-Infinity\");\n\t#elif defined(fpclassify) && defined(FP_NAN) && defined(FP_INFINITE) && defined(FP_ZERO)\n\t\tswitch (fpclassify(value))\n\t\t{\n\t\tcase FP_NAN:\n\t\t\treturn PUGIXML_TEXT(\"NaN\");\n\n\t\tcase FP_INFINITE:\n\t\t\treturn value > 0 ? PUGIXML_TEXT(\"Infinity\") : PUGIXML_TEXT(\"-Infinity\");\n\n\t\tcase FP_ZERO:\n\t\t\treturn PUGIXML_TEXT(\"0\");\n\n\t\tdefault:\n\t\t\treturn 0;\n\t\t}\n\t#else\n\t\t// fallback\n\t\tconst volatile double v = value;\n\n\t\tif (v == 0) return PUGIXML_TEXT(\"0\");\n\t\tif (v != v) return PUGIXML_TEXT(\"NaN\");\n\t\tif (v * 2 == v) return value > 0 ? PUGIXML_TEXT(\"Infinity\") : PUGIXML_TEXT(\"-Infinity\");\n\t\treturn 0;\n\t#endif\n\t}\n\n\tPUGI__FN bool convert_number_to_boolean(double value)\n\t{\n\t\treturn (value != 0 && !is_nan(value));\n\t}\n\n\tPUGI__FN void truncate_zeros(char* begin, char* end)\n\t{\n\t\twhile (begin != end && end[-1] == '0') end--;\n\n\t\t*end = 0;\n\t}\n\n\t// gets mantissa digits in the form of 0.xxxxx with 0. implied and the exponent\n#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE)\n\tPUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent)\n\t{\n\t\t// get base values\n\t\tint sign, exponent;\n\t\t_ecvt_s(buffer, buffer_size, value, DBL_DIG + 1, &exponent, &sign);\n\n\t\t// truncate redundant zeros\n\t\ttruncate_zeros(buffer, buffer + strlen(buffer));\n\n\t\t// fill results\n\t\t*out_mantissa = buffer;\n\t\t*out_exponent = exponent;\n\t}\n#else\n\tPUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent)\n\t{\n\t\t// get a scientific notation value with IEEE DBL_DIG decimals\n\t\tsprintf(buffer, \"%.*e\", DBL_DIG, value);\n\t\tassert(strlen(buffer) < buffer_size);\n\t\t(void)!buffer_size;\n\n\t\t// get the exponent (possibly negative)\n\t\tchar* exponent_string = strchr(buffer, 'e');\n\t\tassert(exponent_string);\n\n\t\tint exponent = atoi(exponent_string + 1);\n\n\t\t// extract mantissa string: skip sign\n\t\tchar* mantissa = buffer[0] == '-' ? buffer + 1 : buffer;\n\t\tassert(mantissa[0] != '0' && mantissa[1] == '.');\n\n\t\t// divide mantissa by 10 to eliminate integer part\n\t\tmantissa[1] = mantissa[0];\n\t\tmantissa++;\n\t\texponent++;\n\n\t\t// remove extra mantissa digits and zero-terminate mantissa\n\t\ttruncate_zeros(mantissa, exponent_string);\n\n\t\t// fill results\n\t\t*out_mantissa = mantissa;\n\t\t*out_exponent = exponent;\n\t}\n#endif\n\n\tPUGI__FN xpath_string convert_number_to_string(double value, xpath_allocator* alloc)\n\t{\n\t\t// try special number conversion\n\t\tconst char_t* special = convert_number_to_string_special(value);\n\t\tif (special) return xpath_string::from_const(special);\n\n\t\t// get mantissa + exponent form\n\t\tchar mantissa_buffer[32];\n\n\t\tchar* mantissa;\n\t\tint exponent;\n\t\tconvert_number_to_mantissa_exponent(value, mantissa_buffer, sizeof(mantissa_buffer), &mantissa, &exponent);\n\n\t\t// allocate a buffer of suitable length for the number\n\t\tsize_t result_size = strlen(mantissa_buffer) + (exponent > 0 ? exponent : -exponent) + 4;\n\t\tchar_t* result = static_cast<char_t*>(alloc->allocate(sizeof(char_t) * result_size));\n\t\tassert(result);\n\n\t\t// make the number!\n\t\tchar_t* s = result;\n\n\t\t// sign\n\t\tif (value < 0) *s++ = '-';\n\n\t\t// integer part\n\t\tif (exponent <= 0)\n\t\t{\n\t\t\t*s++ = '0';\n\t\t}\n\t\telse\n\t\t{\n\t\t\twhile (exponent > 0)\n\t\t\t{\n\t\t\t\tassert(*mantissa == 0 || static_cast<unsigned int>(static_cast<unsigned int>(*mantissa) - '0') <= 9);\n\t\t\t\t*s++ = *mantissa ? *mantissa++ : '0';\n\t\t\t\texponent--;\n\t\t\t}\n\t\t}\n\n\t\t// fractional part\n\t\tif (*mantissa)\n\t\t{\n\t\t\t// decimal point\n\t\t\t*s++ = '.';\n\n\t\t\t// extra zeroes from negative exponent\n\t\t\twhile (exponent < 0)\n\t\t\t{\n\t\t\t\t*s++ = '0';\n\t\t\t\texponent++;\n\t\t\t}\n\n\t\t\t// extra mantissa digits\n\t\t\twhile (*mantissa)\n\t\t\t{\n\t\t\t\tassert(static_cast<unsigned int>(*mantissa - '0') <= 9);\n\t\t\t\t*s++ = *mantissa++;\n\t\t\t}\n\t\t}\n\n\t\t// zero-terminate\n\t\tassert(s < result + result_size);\n\t\t*s = 0;\n\n\t\treturn xpath_string::from_heap_preallocated(result, s);\n\t}\n\n\tPUGI__FN bool check_string_to_number_format(const char_t* string)\n\t{\n\t\t// parse leading whitespace\n\t\twhile (PUGI__IS_CHARTYPE(*string, ct_space)) ++string;\n\n\t\t// parse sign\n\t\tif (*string == '-') ++string;\n\n\t\tif (!*string) return false;\n\n\t\t// if there is no integer part, there should be a decimal part with at least one digit\n\t\tif (!PUGI__IS_CHARTYPEX(string[0], ctx_digit) && (string[0] != '.' || !PUGI__IS_CHARTYPEX(string[1], ctx_digit))) return false;\n\n\t\t// parse integer part\n\t\twhile (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string;\n\n\t\t// parse decimal part\n\t\tif (*string == '.')\n\t\t{\n\t\t\t++string;\n\n\t\t\twhile (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string;\n\t\t}\n\n\t\t// parse trailing whitespace\n\t\twhile (PUGI__IS_CHARTYPE(*string, ct_space)) ++string;\n\n\t\treturn *string == 0;\n\t}\n\n\tPUGI__FN double convert_string_to_number(const char_t* string)\n\t{\n\t\t// check string format\n\t\tif (!check_string_to_number_format(string)) return gen_nan();\n\n\t\t// parse string\n\t#ifdef PUGIXML_WCHAR_MODE\n\t\treturn wcstod(string, 0);\n\t#else\n\t\treturn strtod(string, 0);\n\t#endif\n\t}\n\n\tPUGI__FN bool convert_string_to_number_scratch(char_t (&buffer)[32], const char_t* begin, const char_t* end, double* out_result)\n\t{\n\t\tsize_t length = static_cast<size_t>(end - begin);\n\t\tchar_t* scratch = buffer;\n\n\t\tif (length >= sizeof(buffer) / sizeof(buffer[0]))\n\t\t{\n\t\t\t// need to make dummy on-heap copy\n\t\t\tscratch = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));\n\t\t\tif (!scratch) return false;\n\t\t}\n\n\t\t// copy string to zero-terminated buffer and perform conversion\n\t\tmemcpy(scratch, begin, length * sizeof(char_t));\n\t\tscratch[length] = 0;\n\n\t\t*out_result = convert_string_to_number(scratch);\n\n\t\t// free dummy buffer\n\t\tif (scratch != buffer) xml_memory::deallocate(scratch);\n\n\t\treturn true;\n\t}\n\n\tPUGI__FN double round_nearest(double value)\n\t{\n\t\treturn floor(value + 0.5);\n\t}\n\n\tPUGI__FN double round_nearest_nzero(double value)\n\t{\n\t\t// same as round_nearest, but returns -0 for [-0.5, -0]\n\t\t// ceil is used to differentiate between +0 and -0 (we return -0 for [-0.5, -0] and +0 for +0)\n\t\treturn (value >= -0.5 && value <= 0) ? ceil(value) : floor(value + 0.5);\n\t}\n\n\tPUGI__FN const char_t* qualified_name(const xpath_node& node)\n\t{\n\t\treturn node.attribute() ? node.attribute().name() : node.node().name();\n\t}\n\n\tPUGI__FN const char_t* local_name(const xpath_node& node)\n\t{\n\t\tconst char_t* name = qualified_name(node);\n\t\tconst char_t* p = find_char(name, ':');\n\n\t\treturn p ? p + 1 : name;\n\t}\n\n\tstruct namespace_uri_predicate\n\t{\n\t\tconst char_t* prefix;\n\t\tsize_t prefix_length;\n\n\t\tnamespace_uri_predicate(const char_t* name)\n\t\t{\n\t\t\tconst char_t* pos = find_char(name, ':');\n\n\t\t\tprefix = pos ? name : 0;\n\t\t\tprefix_length = pos ? static_cast<size_t>(pos - name) : 0;\n\t\t}\n\n\t\tbool operator()(xml_attribute a) const\n\t\t{\n\t\t\tconst char_t* name = a.name();\n\n\t\t\tif (!starts_with(name, PUGIXML_TEXT(\"xmlns\"))) return false;\n\n\t\t\treturn prefix ? name[5] == ':' && strequalrange(name + 6, prefix, prefix_length) : name[5] == 0;\n\t\t}\n\t};\n\n\tPUGI__FN const char_t* namespace_uri(xml_node node)\n\t{\n\t\tnamespace_uri_predicate pred = node.name();\n\n\t\txml_node p = node;\n\n\t\twhile (p)\n\t\t{\n\t\t\txml_attribute a = p.find_attribute(pred);\n\n\t\t\tif (a) return a.value();\n\n\t\t\tp = p.parent();\n\t\t}\n\n\t\treturn PUGIXML_TEXT(\"\");\n\t}\n\n\tPUGI__FN const char_t* namespace_uri(xml_attribute attr, xml_node parent)\n\t{\n\t\tnamespace_uri_predicate pred = attr.name();\n\n\t\t// Default namespace does not apply to attributes\n\t\tif (!pred.prefix) return PUGIXML_TEXT(\"\");\n\n\t\txml_node p = parent;\n\n\t\twhile (p)\n\t\t{\n\t\t\txml_attribute a = p.find_attribute(pred);\n\n\t\t\tif (a) return a.value();\n\n\t\t\tp = p.parent();\n\t\t}\n\n\t\treturn PUGIXML_TEXT(\"\");\n\t}\n\n\tPUGI__FN const char_t* namespace_uri(const xpath_node& node)\n\t{\n\t\treturn node.attribute() ? namespace_uri(node.attribute(), node.parent()) : namespace_uri(node.node());\n\t}\n\n\tPUGI__FN char_t* normalize_space(char_t* buffer)\n\t{\n\t\tchar_t* write = buffer;\n\n\t\tfor (char_t* it = buffer; *it; )\n\t\t{\n\t\t\tchar_t ch = *it++;\n\n\t\t\tif (PUGI__IS_CHARTYPE(ch, ct_space))\n\t\t\t{\n\t\t\t\t// replace whitespace sequence with single space\n\t\t\t\twhile (PUGI__IS_CHARTYPE(*it, ct_space)) it++;\n\n\t\t\t\t// avoid leading spaces\n\t\t\t\tif (write != buffer) *write++ = ' ';\n\t\t\t}\n\t\t\telse *write++ = ch;\n\t\t}\n\n\t\t// remove trailing space\n\t\tif (write != buffer && PUGI__IS_CHARTYPE(write[-1], ct_space)) write--;\n\n\t\t// zero-terminate\n\t\t*write = 0;\n\n\t\treturn write;\n\t}\n\n\tPUGI__FN char_t* translate(char_t* buffer, const char_t* from, const char_t* to, size_t to_length)\n\t{\n\t\tchar_t* write = buffer;\n\n\t\twhile (*buffer)\n\t\t{\n\t\t\tPUGI__DMC_VOLATILE char_t ch = *buffer++;\n\n\t\t\tconst char_t* pos = find_char(from, ch);\n\n\t\t\tif (!pos)\n\t\t\t\t*write++ = ch; // do not process\n\t\t\telse if (static_cast<size_t>(pos - from) < to_length)\n\t\t\t\t*write++ = to[pos - from]; // replace\n\t\t}\n\n\t\t// zero-terminate\n\t\t*write = 0;\n\n\t\treturn write;\n\t}\n\n\tPUGI__FN unsigned char* translate_table_generate(xpath_allocator* alloc, const char_t* from, const char_t* to)\n\t{\n\t\tunsigned char table[128] = {0};\n\n\t\twhile (*from)\n\t\t{\n\t\t\tunsigned int fc = static_cast<unsigned int>(*from);\n\t\t\tunsigned int tc = static_cast<unsigned int>(*to);\n\n\t\t\tif (fc >= 128 || tc >= 128)\n\t\t\t\treturn 0;\n\n\t\t\t// code=128 means \"skip character\"\n\t\t\tif (!table[fc])\n\t\t\t\ttable[fc] = static_cast<unsigned char>(tc ? tc : 128);\n\n\t\t\tfrom++;\n\t\t\tif (tc) to++;\n\t\t}\n\n\t\tfor (int i = 0; i < 128; ++i)\n\t\t\tif (!table[i])\n\t\t\t\ttable[i] = static_cast<unsigned char>(i);\n\n\t\tvoid* result = alloc->allocate_nothrow(sizeof(table));\n\n\t\tif (result)\n\t\t{\n\t\t\tmemcpy(result, table, sizeof(table));\n\t\t}\n\n\t\treturn static_cast<unsigned char*>(result);\n\t}\n\n\tPUGI__FN char_t* translate_table(char_t* buffer, const unsigned char* table)\n\t{\n\t\tchar_t* write = buffer;\n\n\t\twhile (*buffer)\n\t\t{\n\t\t\tchar_t ch = *buffer++;\n\t\t\tunsigned int index = static_cast<unsigned int>(ch);\n\n\t\t\tif (index < 128)\n\t\t\t{\n\t\t\t\tunsigned char code = table[index];\n\n\t\t\t\t// code=128 means \"skip character\" (table size is 128 so 128 can be a special value)\n\t\t\t\t// this code skips these characters without extra branches\n\t\t\t\t*write = static_cast<char_t>(code);\n\t\t\t\twrite += 1 - (code >> 7);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*write++ = ch;\n\t\t\t}\n\t\t}\n\n\t\t// zero-terminate\n\t\t*write = 0;\n\n\t\treturn write;\n\t}\n\n\tinline bool is_xpath_attribute(const char_t* name)\n\t{\n\t\treturn !(starts_with(name, PUGIXML_TEXT(\"xmlns\")) && (name[5] == 0 || name[5] == ':'));\n\t}\n\n\tstruct xpath_variable_boolean: xpath_variable\n\t{\n\t\txpath_variable_boolean(): xpath_variable(xpath_type_boolean), value(false)\n\t\t{\n\t\t}\n\n\t\tbool value;\n\t\tchar_t name[1];\n\t};\n\n\tstruct xpath_variable_number: xpath_variable\n\t{\n\t\txpath_variable_number(): xpath_variable(xpath_type_number), value(0)\n\t\t{\n\t\t}\n\n\t\tdouble value;\n\t\tchar_t name[1];\n\t};\n\n\tstruct xpath_variable_string: xpath_variable\n\t{\n\t\txpath_variable_string(): xpath_variable(xpath_type_string), value(0)\n\t\t{\n\t\t}\n\n\t\t~xpath_variable_string()\n\t\t{\n\t\t\tif (value) xml_memory::deallocate(value);\n\t\t}\n\n\t\tchar_t* value;\n\t\tchar_t name[1];\n\t};\n\n\tstruct xpath_variable_node_set: xpath_variable\n\t{\n\t\txpath_variable_node_set(): xpath_variable(xpath_type_node_set)\n\t\t{\n\t\t}\n\n\t\txpath_node_set value;\n\t\tchar_t name[1];\n\t};\n\n\tstatic const xpath_node_set dummy_node_set;\n\n\tPUGI__FN unsigned int hash_string(const char_t* str)\n\t{\n\t\t// Jenkins one-at-a-time hash (http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time)\n\t\tunsigned int result = 0;\n\n\t\twhile (*str)\n\t\t{\n\t\t\tresult += static_cast<unsigned int>(*str++);\n\t\t\tresult += result << 10;\n\t\t\tresult ^= result >> 6;\n\t\t}\n\n\t\tresult += result << 3;\n\t\tresult ^= result >> 11;\n\t\tresult += result << 15;\n\n\t\treturn result;\n\t}\n\n\ttemplate <typename T> PUGI__FN T* new_xpath_variable(const char_t* name)\n\t{\n\t\tsize_t length = strlength(name);\n\t\tif (length == 0) return 0; // empty variable names are invalid\n\n\t\t// $$ we can't use offsetof(T, name) because T is non-POD, so we just allocate additional length characters\n\t\tvoid* memory = xml_memory::allocate(sizeof(T) + length * sizeof(char_t));\n\t\tif (!memory) return 0;\n\n\t\tT* result = new (memory) T();\n\n\t\tmemcpy(result->name, name, (length + 1) * sizeof(char_t));\n\n\t\treturn result;\n\t}\n\n\tPUGI__FN xpath_variable* new_xpath_variable(xpath_value_type type, const char_t* name)\n\t{\n\t\tswitch (type)\n\t\t{\n\t\tcase xpath_type_node_set:\n\t\t\treturn new_xpath_variable<xpath_variable_node_set>(name);\n\n\t\tcase xpath_type_number:\n\t\t\treturn new_xpath_variable<xpath_variable_number>(name);\n\n\t\tcase xpath_type_string:\n\t\t\treturn new_xpath_variable<xpath_variable_string>(name);\n\n\t\tcase xpath_type_boolean:\n\t\t\treturn new_xpath_variable<xpath_variable_boolean>(name);\n\n\t\tdefault:\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\ttemplate <typename T> PUGI__FN void delete_xpath_variable(T* var)\n\t{\n\t\tvar->~T();\n\t\txml_memory::deallocate(var);\n\t}\n\n\tPUGI__FN void delete_xpath_variable(xpath_value_type type, xpath_variable* var)\n\t{\n\t\tswitch (type)\n\t\t{\n\t\tcase xpath_type_node_set:\n\t\t\tdelete_xpath_variable(static_cast<xpath_variable_node_set*>(var));\n\t\t\tbreak;\n\n\t\tcase xpath_type_number:\n\t\t\tdelete_xpath_variable(static_cast<xpath_variable_number*>(var));\n\t\t\tbreak;\n\n\t\tcase xpath_type_string:\n\t\t\tdelete_xpath_variable(static_cast<xpath_variable_string*>(var));\n\t\t\tbreak;\n\n\t\tcase xpath_type_boolean:\n\t\t\tdelete_xpath_variable(static_cast<xpath_variable_boolean*>(var));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tassert(!\"Invalid variable type\");\n\t\t}\n\t}\n\n\tPUGI__FN bool copy_xpath_variable(xpath_variable* lhs, const xpath_variable* rhs)\n\t{\n\t\tswitch (rhs->type())\n\t\t{\n\t\tcase xpath_type_node_set:\n\t\t\treturn lhs->set(static_cast<const xpath_variable_node_set*>(rhs)->value);\n\n\t\tcase xpath_type_number:\n\t\t\treturn lhs->set(static_cast<const xpath_variable_number*>(rhs)->value);\n\n\t\tcase xpath_type_string:\n\t\t\treturn lhs->set(static_cast<const xpath_variable_string*>(rhs)->value);\n\n\t\tcase xpath_type_boolean:\n\t\t\treturn lhs->set(static_cast<const xpath_variable_boolean*>(rhs)->value);\n\n\t\tdefault:\n\t\t\tassert(!\"Invalid variable type\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tPUGI__FN bool get_variable_scratch(char_t (&buffer)[32], xpath_variable_set* set, const char_t* begin, const char_t* end, xpath_variable** out_result)\n\t{\n\t\tsize_t length = static_cast<size_t>(end - begin);\n\t\tchar_t* scratch = buffer;\n\n\t\tif (length >= sizeof(buffer) / sizeof(buffer[0]))\n\t\t{\n\t\t\t// need to make dummy on-heap copy\n\t\t\tscratch = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));\n\t\t\tif (!scratch) return false;\n\t\t}\n\n\t\t// copy string to zero-terminated buffer and perform lookup\n\t\tmemcpy(scratch, begin, length * sizeof(char_t));\n\t\tscratch[length] = 0;\n\n\t\t*out_result = set->get(scratch);\n\n\t\t// free dummy buffer\n\t\tif (scratch != buffer) xml_memory::deallocate(scratch);\n\n\t\treturn true;\n\t}\nPUGI__NS_END\n\n// Internal node set class\nPUGI__NS_BEGIN\n\tPUGI__FN xpath_node_set::type_t xpath_get_order(const xpath_node* begin, const xpath_node* end)\n\t{\n\t\tif (end - begin < 2)\n\t\t\treturn xpath_node_set::type_sorted;\n\n\t\tdocument_order_comparator cmp;\n\n\t\tbool first = cmp(begin[0], begin[1]);\n\n\t\tfor (const xpath_node* it = begin + 1; it + 1 < end; ++it)\n\t\t\tif (cmp(it[0], it[1]) != first)\n\t\t\t\treturn xpath_node_set::type_unsorted;\n\n\t\treturn first ? xpath_node_set::type_sorted : xpath_node_set::type_sorted_reverse;\n\t}\n\n\tPUGI__FN xpath_node_set::type_t xpath_sort(xpath_node* begin, xpath_node* end, xpath_node_set::type_t type, bool rev)\n\t{\n\t\txpath_node_set::type_t order = rev ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted;\n\n\t\tif (type == xpath_node_set::type_unsorted)\n\t\t{\n\t\t\txpath_node_set::type_t sorted = xpath_get_order(begin, end);\n\n\t\t\tif (sorted == xpath_node_set::type_unsorted)\n\t\t\t{\n\t\t\t\tsort(begin, end, document_order_comparator());\n\n\t\t\t\ttype = xpath_node_set::type_sorted;\n\t\t\t}\n\t\t\telse\n\t\t\t\ttype = sorted;\n\t\t}\n\n\t\tif (type != order) reverse(begin, end);\n\n\t\treturn order;\n\t}\n\n\tPUGI__FN xpath_node xpath_first(const xpath_node* begin, const xpath_node* end, xpath_node_set::type_t type)\n\t{\n\t\tif (begin == end) return xpath_node();\n\n\t\tswitch (type)\n\t\t{\n\t\tcase xpath_node_set::type_sorted:\n\t\t\treturn *begin;\n\n\t\tcase xpath_node_set::type_sorted_reverse:\n\t\t\treturn *(end - 1);\n\n\t\tcase xpath_node_set::type_unsorted:\n\t\t\treturn *min_element(begin, end, document_order_comparator());\n\n\t\tdefault:\n\t\t\tassert(!\"Invalid node set type\");\n\t\t\treturn xpath_node();\n\t\t}\n\t}\n\n\tclass xpath_node_set_raw\n\t{\n\t\txpath_node_set::type_t _type;\n\n\t\txpath_node* _begin;\n\t\txpath_node* _end;\n\t\txpath_node* _eos;\n\n\tpublic:\n\t\txpath_node_set_raw(): _type(xpath_node_set::type_unsorted), _begin(0), _end(0), _eos(0)\n\t\t{\n\t\t}\n\n\t\txpath_node* begin() const\n\t\t{\n\t\t\treturn _begin;\n\t\t}\n\n\t\txpath_node* end() const\n\t\t{\n\t\t\treturn _end;\n\t\t}\n\n\t\tbool empty() const\n\t\t{\n\t\t\treturn _begin == _end;\n\t\t}\n\n\t\tsize_t size() const\n\t\t{\n\t\t\treturn static_cast<size_t>(_end - _begin);\n\t\t}\n\n\t\txpath_node first() const\n\t\t{\n\t\t\treturn xpath_first(_begin, _end, _type);\n\t\t}\n\n\t\tvoid push_back_grow(const xpath_node& node, xpath_allocator* alloc);\n\n\t\tvoid push_back(const xpath_node& node, xpath_allocator* alloc)\n\t\t{\n\t\t\tif (_end != _eos)\n\t\t\t\t*_end++ = node;\n\t\t\telse\n\t\t\t\tpush_back_grow(node, alloc);\n\t\t}\n\n\t\tvoid append(const xpath_node* begin_, const xpath_node* end_, xpath_allocator* alloc)\n\t\t{\n\t\t\tif (begin_ == end_) return;\n\n\t\t\tsize_t size_ = static_cast<size_t>(_end - _begin);\n\t\t\tsize_t capacity = static_cast<size_t>(_eos - _begin);\n\t\t\tsize_t count = static_cast<size_t>(end_ - begin_);\n\n\t\t\tif (size_ + count > capacity)\n\t\t\t{\n\t\t\t\t// reallocate the old array or allocate a new one\n\t\t\t\txpath_node* data = static_cast<xpath_node*>(alloc->reallocate(_begin, capacity * sizeof(xpath_node), (size_ + count) * sizeof(xpath_node)));\n\t\t\t\tassert(data);\n\n\t\t\t\t// finalize\n\t\t\t\t_begin = data;\n\t\t\t\t_end = data + size_;\n\t\t\t\t_eos = data + size_ + count;\n\t\t\t}\n\n\t\t\tmemcpy(_end, begin_, count * sizeof(xpath_node));\n\t\t\t_end += count;\n\t\t}\n\n\t\tvoid sort_do()\n\t\t{\n\t\t\t_type = xpath_sort(_begin, _end, _type, false);\n\t\t}\n\n\t\tvoid truncate(xpath_node* pos)\n\t\t{\n\t\t\tassert(_begin <= pos && pos <= _end);\n\n\t\t\t_end = pos;\n\t\t}\n\n\t\tvoid remove_duplicates()\n\t\t{\n\t\t\tif (_type == xpath_node_set::type_unsorted)\n\t\t\t\tsort(_begin, _end, duplicate_comparator());\n\n\t\t\t_end = unique(_begin, _end);\n\t\t}\n\n\t\txpath_node_set::type_t type() const\n\t\t{\n\t\t\treturn _type;\n\t\t}\n\n\t\tvoid set_type(xpath_node_set::type_t value)\n\t\t{\n\t\t\t_type = value;\n\t\t}\n\t};\n\n\tPUGI__FN_NO_INLINE void xpath_node_set_raw::push_back_grow(const xpath_node& node, xpath_allocator* alloc)\n\t{\n\t\tsize_t capacity = static_cast<size_t>(_eos - _begin);\n\n\t\t// get new capacity (1.5x rule)\n\t\tsize_t new_capacity = capacity + capacity / 2 + 1;\n\n\t\t// reallocate the old array or allocate a new one\n\t\txpath_node* data = static_cast<xpath_node*>(alloc->reallocate(_begin, capacity * sizeof(xpath_node), new_capacity * sizeof(xpath_node)));\n\t\tassert(data);\n\n\t\t// finalize\n\t\t_begin = data;\n\t\t_end = data + capacity;\n\t\t_eos = data + new_capacity;\n\n\t\t// push\n\t\t*_end++ = node;\n\t}\nPUGI__NS_END\n\nPUGI__NS_BEGIN\n\tstruct xpath_context\n\t{\n\t\txpath_node n;\n\t\tsize_t position, size;\n\n\t\txpath_context(const xpath_node& n_, size_t position_, size_t size_): n(n_), position(position_), size(size_)\n\t\t{\n\t\t}\n\t};\n\n\tenum lexeme_t\n\t{\n\t\tlex_none = 0,\n\t\tlex_equal,\n\t\tlex_not_equal,\n\t\tlex_less,\n\t\tlex_greater,\n\t\tlex_less_or_equal,\n\t\tlex_greater_or_equal,\n\t\tlex_plus,\n\t\tlex_minus,\n\t\tlex_multiply,\n\t\tlex_union,\n\t\tlex_var_ref,\n\t\tlex_open_brace,\n\t\tlex_close_brace,\n\t\tlex_quoted_string,\n\t\tlex_number,\n\t\tlex_slash,\n\t\tlex_double_slash,\n\t\tlex_open_square_brace,\n\t\tlex_close_square_brace,\n\t\tlex_string,\n\t\tlex_comma,\n\t\tlex_axis_attribute,\n\t\tlex_dot,\n\t\tlex_double_dot,\n\t\tlex_double_colon,\n\t\tlex_eof\n\t};\n\n\tstruct xpath_lexer_string\n\t{\n\t\tconst char_t* begin;\n\t\tconst char_t* end;\n\n\t\txpath_lexer_string(): begin(0), end(0)\n\t\t{\n\t\t}\n\n\t\tbool operator==(const char_t* other) const\n\t\t{\n\t\t\tsize_t length = static_cast<size_t>(end - begin);\n\n\t\t\treturn strequalrange(other, begin, length);\n\t\t}\n\t};\n\n\tclass xpath_lexer\n\t{\n\t\tconst char_t* _cur;\n\t\tconst char_t* _cur_lexeme_pos;\n\t\txpath_lexer_string _cur_lexeme_contents;\n\n\t\tlexeme_t _cur_lexeme;\n\n\tpublic:\n\t\texplicit xpath_lexer(const char_t* query): _cur(query)\n\t\t{\n\t\t\tnext();\n\t\t}\n\n\t\tconst char_t* state() const\n\t\t{\n\t\t\treturn _cur;\n\t\t}\n\n\t\tvoid next()\n\t\t{\n\t\t\tconst char_t* cur = _cur;\n\n\t\t\twhile (PUGI__IS_CHARTYPE(*cur, ct_space)) ++cur;\n\n\t\t\t// save lexeme position for error reporting\n\t\t\t_cur_lexeme_pos = cur;\n\n\t\t\tswitch (*cur)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\t_cur_lexeme = lex_eof;\n\t\t\t\tbreak;\n\n\t\t\tcase '>':\n\t\t\t\tif (*(cur+1) == '=')\n\t\t\t\t{\n\t\t\t\t\tcur += 2;\n\t\t\t\t\t_cur_lexeme = lex_greater_or_equal;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcur += 1;\n\t\t\t\t\t_cur_lexeme = lex_greater;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '<':\n\t\t\t\tif (*(cur+1) == '=')\n\t\t\t\t{\n\t\t\t\t\tcur += 2;\n\t\t\t\t\t_cur_lexeme = lex_less_or_equal;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcur += 1;\n\t\t\t\t\t_cur_lexeme = lex_less;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '!':\n\t\t\t\tif (*(cur+1) == '=')\n\t\t\t\t{\n\t\t\t\t\tcur += 2;\n\t\t\t\t\t_cur_lexeme = lex_not_equal;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_cur_lexeme = lex_none;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '=':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_equal;\n\n\t\t\t\tbreak;\n\n\t\t\tcase '+':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_plus;\n\n\t\t\t\tbreak;\n\n\t\t\tcase '-':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_minus;\n\n\t\t\t\tbreak;\n\n\t\t\tcase '*':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_multiply;\n\n\t\t\t\tbreak;\n\n\t\t\tcase '|':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_union;\n\n\t\t\t\tbreak;\n\n\t\t\tcase '$':\n\t\t\t\tcur += 1;\n\n\t\t\t\tif (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol))\n\t\t\t\t{\n\t\t\t\t\t_cur_lexeme_contents.begin = cur;\n\n\t\t\t\t\twhile (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;\n\n\t\t\t\t\tif (cur[0] == ':' && PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // qname\n\t\t\t\t\t{\n\t\t\t\t\t\tcur++; // :\n\n\t\t\t\t\t\twhile (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;\n\t\t\t\t\t}\n\n\t\t\t\t\t_cur_lexeme_contents.end = cur;\n\n\t\t\t\t\t_cur_lexeme = lex_var_ref;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_cur_lexeme = lex_none;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase '(':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_open_brace;\n\n\t\t\t\tbreak;\n\n\t\t\tcase ')':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_close_brace;\n\n\t\t\t\tbreak;\n\n\t\t\tcase '[':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_open_square_brace;\n\n\t\t\t\tbreak;\n\n\t\t\tcase ']':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_close_square_brace;\n\n\t\t\t\tbreak;\n\n\t\t\tcase ',':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_comma;\n\n\t\t\t\tbreak;\n\n\t\t\tcase '/':\n\t\t\t\tif (*(cur+1) == '/')\n\t\t\t\t{\n\t\t\t\t\tcur += 2;\n\t\t\t\t\t_cur_lexeme = lex_double_slash;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcur += 1;\n\t\t\t\t\t_cur_lexeme = lex_slash;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '.':\n\t\t\t\tif (*(cur+1) == '.')\n\t\t\t\t{\n\t\t\t\t\tcur += 2;\n\t\t\t\t\t_cur_lexeme = lex_double_dot;\n\t\t\t\t}\n\t\t\t\telse if (PUGI__IS_CHARTYPEX(*(cur+1), ctx_digit))\n\t\t\t\t{\n\t\t\t\t\t_cur_lexeme_contents.begin = cur; // .\n\n\t\t\t\t\t++cur;\n\n\t\t\t\t\twhile (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;\n\n\t\t\t\t\t_cur_lexeme_contents.end = cur;\n\n\t\t\t\t\t_cur_lexeme = lex_number;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcur += 1;\n\t\t\t\t\t_cur_lexeme = lex_dot;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '@':\n\t\t\t\tcur += 1;\n\t\t\t\t_cur_lexeme = lex_axis_attribute;\n\n\t\t\t\tbreak;\n\n\t\t\tcase '\"':\n\t\t\tcase '\\'':\n\t\t\t{\n\t\t\t\tchar_t terminator = *cur;\n\n\t\t\t\t++cur;\n\n\t\t\t\t_cur_lexeme_contents.begin = cur;\n\t\t\t\twhile (*cur && *cur != terminator) cur++;\n\t\t\t\t_cur_lexeme_contents.end = cur;\n\n\t\t\t\tif (!*cur)\n\t\t\t\t\t_cur_lexeme = lex_none;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcur += 1;\n\t\t\t\t\t_cur_lexeme = lex_quoted_string;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ':':\n\t\t\t\tif (*(cur+1) == ':')\n\t\t\t\t{\n\t\t\t\t\tcur += 2;\n\t\t\t\t\t_cur_lexeme = lex_double_colon;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_cur_lexeme = lex_none;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tif (PUGI__IS_CHARTYPEX(*cur, ctx_digit))\n\t\t\t\t{\n\t\t\t\t\t_cur_lexeme_contents.begin = cur;\n\n\t\t\t\t\twhile (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;\n\n\t\t\t\t\tif (*cur == '.')\n\t\t\t\t\t{\n\t\t\t\t\t\tcur++;\n\n\t\t\t\t\t\twhile (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;\n\t\t\t\t\t}\n\n\t\t\t\t\t_cur_lexeme_contents.end = cur;\n\n\t\t\t\t\t_cur_lexeme = lex_number;\n\t\t\t\t}\n\t\t\t\telse if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol))\n\t\t\t\t{\n\t\t\t\t\t_cur_lexeme_contents.begin = cur;\n\n\t\t\t\t\twhile (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;\n\n\t\t\t\t\tif (cur[0] == ':')\n\t\t\t\t\t{\n\t\t\t\t\t\tif (cur[1] == '*') // namespace test ncname:*\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcur += 2; // :*\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // namespace test qname\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcur++; // :\n\n\t\t\t\t\t\t\twhile (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t_cur_lexeme_contents.end = cur;\n\n\t\t\t\t\t_cur_lexeme = lex_string;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_cur_lexeme = lex_none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_cur = cur;\n\t\t}\n\n\t\tlexeme_t current() const\n\t\t{\n\t\t\treturn _cur_lexeme;\n\t\t}\n\n\t\tconst char_t* current_pos() const\n\t\t{\n\t\t\treturn _cur_lexeme_pos;\n\t\t}\n\n\t\tconst xpath_lexer_string& contents() const\n\t\t{\n\t\t\tassert(_cur_lexeme == lex_var_ref || _cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string);\n\n\t\t\treturn _cur_lexeme_contents;\n\t\t}\n\t};\n\n\tenum ast_type_t\n\t{\n\t\tast_unknown,\n\t\tast_op_or,\t\t\t\t\t\t// left or right\n\t\tast_op_and,\t\t\t\t\t\t// left and right\n\t\tast_op_equal,\t\t\t\t\t// left = right\n\t\tast_op_not_equal,\t\t\t\t// left != right\n\t\tast_op_less,\t\t\t\t\t// left < right\n\t\tast_op_greater,\t\t\t\t\t// left > right\n\t\tast_op_less_or_equal,\t\t\t// left <= right\n\t\tast_op_greater_or_equal,\t\t// left >= right\n\t\tast_op_add,\t\t\t\t\t\t// left + right\n\t\tast_op_subtract,\t\t\t\t// left - right\n\t\tast_op_multiply,\t\t\t\t// left * right\n\t\tast_op_divide,\t\t\t\t\t// left / right\n\t\tast_op_mod,\t\t\t\t\t\t// left % right\n\t\tast_op_negate,\t\t\t\t\t// left - right\n\t\tast_op_union,\t\t\t\t\t// left | right\n\t\tast_predicate,\t\t\t\t\t// apply predicate to set; next points to next predicate\n\t\tast_filter,\t\t\t\t\t\t// select * from left where right\n\t\tast_string_constant,\t\t\t// string constant\n\t\tast_number_constant,\t\t\t// number constant\n\t\tast_variable,\t\t\t\t\t// variable\n\t\tast_func_last,\t\t\t\t\t// last()\n\t\tast_func_position,\t\t\t\t// position()\n\t\tast_func_count,\t\t\t\t\t// count(left)\n\t\tast_func_id,\t\t\t\t\t// id(left)\n\t\tast_func_local_name_0,\t\t\t// local-name()\n\t\tast_func_local_name_1,\t\t\t// local-name(left)\n\t\tast_func_namespace_uri_0,\t\t// namespace-uri()\n\t\tast_func_namespace_uri_1,\t\t// namespace-uri(left)\n\t\tast_func_name_0,\t\t\t\t// name()\n\t\tast_func_name_1,\t\t\t\t// name(left)\n\t\tast_func_string_0,\t\t\t\t// string()\n\t\tast_func_string_1,\t\t\t\t// string(left)\n\t\tast_func_concat,\t\t\t\t// concat(left, right, siblings)\n\t\tast_func_starts_with,\t\t\t// starts_with(left, right)\n\t\tast_func_contains,\t\t\t\t// contains(left, right)\n\t\tast_func_substring_before,\t\t// substring-before(left, right)\n\t\tast_func_substring_after,\t\t// substring-after(left, right)\n\t\tast_func_substring_2,\t\t\t// substring(left, right)\n\t\tast_func_substring_3,\t\t\t// substring(left, right, third)\n\t\tast_func_string_length_0,\t\t// string-length()\n\t\tast_func_string_length_1,\t\t// string-length(left)\n\t\tast_func_normalize_space_0,\t\t// normalize-space()\n\t\tast_func_normalize_space_1,\t\t// normalize-space(left)\n\t\tast_func_translate,\t\t\t\t// translate(left, right, third)\n\t\tast_func_boolean,\t\t\t\t// boolean(left)\n\t\tast_func_not,\t\t\t\t\t// not(left)\n\t\tast_func_true,\t\t\t\t\t// true()\n\t\tast_func_false,\t\t\t\t\t// false()\n\t\tast_func_lang,\t\t\t\t\t// lang(left)\n\t\tast_func_number_0,\t\t\t\t// number()\n\t\tast_func_number_1,\t\t\t\t// number(left)\n\t\tast_func_sum,\t\t\t\t\t// sum(left)\n\t\tast_func_floor,\t\t\t\t\t// floor(left)\n\t\tast_func_ceiling,\t\t\t\t// ceiling(left)\n\t\tast_func_round,\t\t\t\t\t// round(left)\n\t\tast_step,\t\t\t\t\t\t// process set left with step\n\t\tast_step_root,\t\t\t\t\t// select root node\n\n\t\tast_opt_translate_table,\t\t// translate(left, right, third) where right/third are constants\n\t\tast_opt_compare_attribute\t\t// @name = 'string'\n\t};\n\n\tenum axis_t\n\t{\n\t\taxis_ancestor,\n\t\taxis_ancestor_or_self,\n\t\taxis_attribute,\n\t\taxis_child,\n\t\taxis_descendant,\n\t\taxis_descendant_or_self,\n\t\taxis_following,\n\t\taxis_following_sibling,\n\t\taxis_namespace,\n\t\taxis_parent,\n\t\taxis_preceding,\n\t\taxis_preceding_sibling,\n\t\taxis_self\n\t};\n\n\tenum nodetest_t\n\t{\n\t\tnodetest_none,\n\t\tnodetest_name,\n\t\tnodetest_type_node,\n\t\tnodetest_type_comment,\n\t\tnodetest_type_pi,\n\t\tnodetest_type_text,\n\t\tnodetest_pi,\n\t\tnodetest_all,\n\t\tnodetest_all_in_namespace\n\t};\n\n\tenum predicate_t\n\t{\n\t\tpredicate_default,\n\t\tpredicate_posinv,\n\t\tpredicate_constant,\n\t\tpredicate_constant_one\n\t};\n\n\tenum nodeset_eval_t\n\t{\n\t\tnodeset_eval_all,\n\t\tnodeset_eval_any,\n\t\tnodeset_eval_first\n\t};\n\n\ttemplate <axis_t N> struct axis_to_type\n\t{\n\t\tstatic const axis_t axis;\n\t};\n\n\ttemplate <axis_t N> const axis_t axis_to_type<N>::axis = N;\n\n\tclass xpath_ast_node\n\t{\n\tprivate:\n\t\t// node type\n\t\tchar _type;\n\t\tchar _rettype;\n\n\t\t// for ast_step\n\t\tchar _axis;\n\n\t\t// for ast_step/ast_predicate/ast_filter\n\t\tchar _test;\n\n\t\t// tree node structure\n\t\txpath_ast_node* _left;\n\t\txpath_ast_node* _right;\n\t\txpath_ast_node* _next;\n\n\t\tunion\n\t\t{\n\t\t\t// value for ast_string_constant\n\t\t\tconst char_t* string;\n\t\t\t// value for ast_number_constant\n\t\t\tdouble number;\n\t\t\t// variable for ast_variable\n\t\t\txpath_variable* variable;\n\t\t\t// node test for ast_step (node name/namespace/node type/pi target)\n\t\t\tconst char_t* nodetest;\n\t\t\t// table for ast_opt_translate_table\n\t\t\tconst unsigned char* table;\n\t\t} _data;\n\n\t\txpath_ast_node(const xpath_ast_node&);\n\t\txpath_ast_node& operator=(const xpath_ast_node&);\n\n\t\ttemplate <class Comp> static bool compare_eq(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp)\n\t\t{\n\t\t\txpath_value_type lt = lhs->rettype(), rt = rhs->rettype();\n\n\t\t\tif (lt != xpath_type_node_set && rt != xpath_type_node_set)\n\t\t\t{\n\t\t\t\tif (lt == xpath_type_boolean || rt == xpath_type_boolean)\n\t\t\t\t\treturn comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack));\n\t\t\t\telse if (lt == xpath_type_number || rt == xpath_type_number)\n\t\t\t\t\treturn comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack));\n\t\t\t\telse if (lt == xpath_type_string || rt == xpath_type_string)\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\t\txpath_string ls = lhs->eval_string(c, stack);\n\t\t\t\t\txpath_string rs = rhs->eval_string(c, stack);\n\n\t\t\t\t\treturn comp(ls, rs);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (lt == xpath_type_node_set && rt == xpath_type_node_set)\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\txpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all);\n\t\t\t\txpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);\n\n\t\t\t\tfor (const xpath_node* li = ls.begin(); li != ls.end(); ++li)\n\t\t\t\t\tfor (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)\n\t\t\t\t\t{\n\t\t\t\t\t\txpath_allocator_capture cri(stack.result);\n\n\t\t\t\t\t\tif (comp(string_value(*li, stack.result), string_value(*ri, stack.result)))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (lt == xpath_type_node_set)\n\t\t\t\t{\n\t\t\t\t\tswap(lhs, rhs);\n\t\t\t\t\tswap(lt, rt);\n\t\t\t\t}\n\n\t\t\t\tif (lt == xpath_type_boolean)\n\t\t\t\t\treturn comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack));\n\t\t\t\telse if (lt == xpath_type_number)\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\t\tdouble l = lhs->eval_number(c, stack);\n\t\t\t\t\txpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);\n\n\t\t\t\t\tfor (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)\n\t\t\t\t\t{\n\t\t\t\t\t\txpath_allocator_capture cri(stack.result);\n\n\t\t\t\t\t\tif (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str())))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (lt == xpath_type_string)\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\t\txpath_string l = lhs->eval_string(c, stack);\n\t\t\t\t\txpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);\n\n\t\t\t\t\tfor (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)\n\t\t\t\t\t{\n\t\t\t\t\t\txpath_allocator_capture cri(stack.result);\n\n\t\t\t\t\t\tif (comp(l, string_value(*ri, stack.result)))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tassert(!\"Wrong types\");\n\t\t\treturn false;\n\t\t}\n\n\t\tstatic bool eval_once(xpath_node_set::type_t type, nodeset_eval_t eval)\n\t\t{\n\t\t\treturn type == xpath_node_set::type_sorted ? eval != nodeset_eval_all : eval == nodeset_eval_any;\n\t\t}\n\n\t\ttemplate <class Comp> static bool compare_rel(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp)\n\t\t{\n\t\t\txpath_value_type lt = lhs->rettype(), rt = rhs->rettype();\n\n\t\t\tif (lt != xpath_type_node_set && rt != xpath_type_node_set)\n\t\t\t\treturn comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack));\n\t\t\telse if (lt == xpath_type_node_set && rt == xpath_type_node_set)\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\txpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all);\n\t\t\t\txpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);\n\n\t\t\t\tfor (const xpath_node* li = ls.begin(); li != ls.end(); ++li)\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cri(stack.result);\n\n\t\t\t\t\tdouble l = convert_string_to_number(string_value(*li, stack.result).c_str());\n\n\t\t\t\t\tfor (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)\n\t\t\t\t\t{\n\t\t\t\t\t\txpath_allocator_capture crii(stack.result);\n\n\t\t\t\t\t\tif (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str())))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (lt != xpath_type_node_set && rt == xpath_type_node_set)\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\tdouble l = lhs->eval_number(c, stack);\n\t\t\t\txpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);\n\n\t\t\t\tfor (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cri(stack.result);\n\n\t\t\t\t\tif (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str())))\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (lt == xpath_type_node_set && rt != xpath_type_node_set)\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\txpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all);\n\t\t\t\tdouble r = rhs->eval_number(c, stack);\n\n\t\t\t\tfor (const xpath_node* li = ls.begin(); li != ls.end(); ++li)\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cri(stack.result);\n\n\t\t\t\t\tif (comp(convert_string_to_number(string_value(*li, stack.result).c_str()), r))\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tassert(!\"Wrong types\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tstatic void apply_predicate_boolean(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once)\n\t\t{\n\t\t\tassert(ns.size() >= first);\n\t\t\tassert(expr->rettype() != xpath_type_number);\n\n\t\t\tsize_t i = 1;\n\t\t\tsize_t size = ns.size() - first;\n\n\t\t\txpath_node* last = ns.begin() + first;\n\n\t\t\t// remove_if... or well, sort of\n\t\t\tfor (xpath_node* it = last; it != ns.end(); ++it, ++i)\n\t\t\t{\n\t\t\t\txpath_context c(*it, i, size);\n\n\t\t\t\tif (expr->eval_boolean(c, stack))\n\t\t\t\t{\n\t\t\t\t\t*last++ = *it;\n\n\t\t\t\t\tif (once) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tns.truncate(last);\n\t\t}\n\n\t\tstatic void apply_predicate_number(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once)\n\t\t{\n\t\t\tassert(ns.size() >= first);\n\t\t\tassert(expr->rettype() == xpath_type_number);\n\n\t\t\tsize_t i = 1;\n\t\t\tsize_t size = ns.size() - first;\n\n\t\t\txpath_node* last = ns.begin() + first;\n\n\t\t\t// remove_if... or well, sort of\n\t\t\tfor (xpath_node* it = last; it != ns.end(); ++it, ++i)\n\t\t\t{\n\t\t\t\txpath_context c(*it, i, size);\n\n\t\t\t\tif (expr->eval_number(c, stack) == i)\n\t\t\t\t{\n\t\t\t\t\t*last++ = *it;\n\n\t\t\t\t\tif (once) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tns.truncate(last);\n\t\t}\n\n\t\tstatic void apply_predicate_number_const(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack)\n\t\t{\n\t\t\tassert(ns.size() >= first);\n\t\t\tassert(expr->rettype() == xpath_type_number);\n\n\t\t\tsize_t size = ns.size() - first;\n\n\t\t\txpath_node* last = ns.begin() + first;\n\n\t\t\txpath_context c(xpath_node(), 1, size);\n\n\t\t\tdouble er = expr->eval_number(c, stack);\n\n\t\t\tif (er >= 1.0 && er <= size)\n\t\t\t{\n\t\t\t\tsize_t eri = static_cast<size_t>(er);\n\n\t\t\t\tif (er == eri)\n\t\t\t\t{\n\t\t\t\t\txpath_node r = last[eri - 1];\n\n\t\t\t\t\t*last++ = r;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tns.truncate(last);\n\t\t}\n\n\t\tvoid apply_predicate(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, bool once)\n\t\t{\n\t\t\tif (ns.size() == first) return;\n\n\t\t\tassert(_type == ast_filter || _type == ast_predicate);\n\n\t\t\tif (_test == predicate_constant || _test == predicate_constant_one)\n\t\t\t\tapply_predicate_number_const(ns, first, _right, stack);\n\t\t\telse if (_right->rettype() == xpath_type_number)\n\t\t\t\tapply_predicate_number(ns, first, _right, stack, once);\n\t\t\telse\n\t\t\t\tapply_predicate_boolean(ns, first, _right, stack, once);\n\t\t}\n\n\t\tvoid apply_predicates(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, nodeset_eval_t eval)\n\t\t{\n\t\t\tif (ns.size() == first) return;\n\n\t\t\tbool last_once = eval_once(ns.type(), eval);\n\n\t\t\tfor (xpath_ast_node* pred = _right; pred; pred = pred->_next)\n\t\t\t\tpred->apply_predicate(ns, first, stack, !pred->_next && last_once);\n\t\t}\n\n\t\tbool step_push(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* parent, xpath_allocator* alloc)\n\t\t{\n\t\t\tassert(a);\n\n\t\t\tconst char_t* name = a->name ? a->name + 0 : PUGIXML_TEXT(\"\");\n\n\t\t\tswitch (_test)\n\t\t\t{\n\t\t\tcase nodetest_name:\n\t\t\t\tif (strequal(name, _data.nodetest) && is_xpath_attribute(name))\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase nodetest_type_node:\n\t\t\tcase nodetest_all:\n\t\t\t\tif (is_xpath_attribute(name))\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase nodetest_all_in_namespace:\n\t\t\t\tif (starts_with(name, _data.nodetest) && is_xpath_attribute(name))\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tbool step_push(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc)\n\t\t{\n\t\t\tassert(n);\n\n\t\t\txml_node_type type = PUGI__NODETYPE(n);\n\n\t\t\tswitch (_test)\n\t\t\t{\n\t\t\tcase nodetest_name:\n\t\t\t\tif (type == node_element && n->name && strequal(n->name, _data.nodetest))\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xml_node(n), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase nodetest_type_node:\n\t\t\t\tns.push_back(xml_node(n), alloc);\n\t\t\t\treturn true;\n\n\t\t\tcase nodetest_type_comment:\n\t\t\t\tif (type == node_comment)\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xml_node(n), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase nodetest_type_text:\n\t\t\t\tif (type == node_pcdata || type == node_cdata)\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xml_node(n), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase nodetest_type_pi:\n\t\t\t\tif (type == node_pi)\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xml_node(n), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase nodetest_pi:\n\t\t\t\tif (type == node_pi && n->name && strequal(n->name, _data.nodetest))\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xml_node(n), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase nodetest_all:\n\t\t\t\tif (type == node_element)\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xml_node(n), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase nodetest_all_in_namespace:\n\t\t\t\tif (type == node_element && n->name && starts_with(n->name, _data.nodetest))\n\t\t\t\t{\n\t\t\t\t\tns.push_back(xml_node(n), alloc);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tassert(!\"Unknown axis\");\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\ttemplate <class T> void step_fill(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc, bool once, T)\n\t\t{\n\t\t\tconst axis_t axis = T::axis;\n\n\t\t\tswitch (axis)\n\t\t\t{\n\t\t\tcase axis_attribute:\n\t\t\t{\n\t\t\t\tfor (xml_attribute_struct* a = n->first_attribute; a; a = a->next_attribute)\n\t\t\t\t\tif (step_push(ns, a, n, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_child:\n\t\t\t{\n\t\t\t\tfor (xml_node_struct* c = n->first_child; c; c = c->next_sibling)\n\t\t\t\t\tif (step_push(ns, c, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_descendant:\n\t\t\tcase axis_descendant_or_self:\n\t\t\t{\n\t\t\t\tif (axis == axis_descendant_or_self)\n\t\t\t\t\tif (step_push(ns, n, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\txml_node_struct* cur = n->first_child;\n\n\t\t\t\twhile (cur)\n\t\t\t\t{\n\t\t\t\t\tif (step_push(ns, cur, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif (cur->first_child)\n\t\t\t\t\t\tcur = cur->first_child;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\twhile (!cur->next_sibling)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcur = cur->parent;\n\n\t\t\t\t\t\t\tif (cur == n) return;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcur = cur->next_sibling;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_following_sibling:\n\t\t\t{\n\t\t\t\tfor (xml_node_struct* c = n->next_sibling; c; c = c->next_sibling)\n\t\t\t\t\tif (step_push(ns, c, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_preceding_sibling:\n\t\t\t{\n\t\t\t\tfor (xml_node_struct* c = n->prev_sibling_c; c->next_sibling; c = c->prev_sibling_c)\n\t\t\t\t\tif (step_push(ns, c, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_following:\n\t\t\t{\n\t\t\t\txml_node_struct* cur = n;\n\n\t\t\t\t// exit from this node so that we don't include descendants\n\t\t\t\twhile (!cur->next_sibling)\n\t\t\t\t{\n\t\t\t\t\tcur = cur->parent;\n\n\t\t\t\t\tif (!cur) return;\n\t\t\t\t}\n\n\t\t\t\tcur = cur->next_sibling;\n\n\t\t\t\twhile (cur)\n\t\t\t\t{\n\t\t\t\t\tif (step_push(ns, cur, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif (cur->first_child)\n\t\t\t\t\t\tcur = cur->first_child;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\twhile (!cur->next_sibling)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcur = cur->parent;\n\n\t\t\t\t\t\t\tif (!cur) return;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcur = cur->next_sibling;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_preceding:\n\t\t\t{\n\t\t\t\txml_node_struct* cur = n;\n\n\t\t\t\t// exit from this node so that we don't include descendants\n\t\t\t\twhile (!cur->prev_sibling_c->next_sibling)\n\t\t\t\t{\n\t\t\t\t\tcur = cur->parent;\n\n\t\t\t\t\tif (!cur) return;\n\t\t\t\t}\n\n\t\t\t\tcur = cur->prev_sibling_c;\n\n\t\t\t\twhile (cur)\n\t\t\t\t{\n\t\t\t\t\tif (cur->first_child)\n\t\t\t\t\t\tcur = cur->first_child->prev_sibling_c;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// leaf node, can't be ancestor\n\t\t\t\t\t\tif (step_push(ns, cur, alloc) & once)\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\twhile (!cur->prev_sibling_c->next_sibling)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcur = cur->parent;\n\n\t\t\t\t\t\t\tif (!cur) return;\n\n\t\t\t\t\t\t\tif (!node_is_ancestor(cur, n))\n\t\t\t\t\t\t\t\tif (step_push(ns, cur, alloc) & once)\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcur = cur->prev_sibling_c;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_ancestor:\n\t\t\tcase axis_ancestor_or_self:\n\t\t\t{\n\t\t\t\tif (axis == axis_ancestor_or_self)\n\t\t\t\t\tif (step_push(ns, n, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\txml_node_struct* cur = n->parent;\n\n\t\t\t\twhile (cur)\n\t\t\t\t{\n\t\t\t\t\tif (step_push(ns, cur, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcur = cur->parent;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_self:\n\t\t\t{\n\t\t\t\tstep_push(ns, n, alloc);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_parent:\n\t\t\t{\n\t\t\t\tif (n->parent)\n\t\t\t\t\tstep_push(ns, n->parent, alloc);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassert(!\"Unimplemented axis\");\n\t\t\t}\n\t\t}\n\n\t\ttemplate <class T> void step_fill(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* p, xpath_allocator* alloc, bool once, T v)\n\t\t{\n\t\t\tconst axis_t axis = T::axis;\n\n\t\t\tswitch (axis)\n\t\t\t{\n\t\t\tcase axis_ancestor:\n\t\t\tcase axis_ancestor_or_self:\n\t\t\t{\n\t\t\t\tif (axis == axis_ancestor_or_self && _test == nodetest_type_node) // reject attributes based on principal node type test\n\t\t\t\t\tif (step_push(ns, a, p, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\txml_node_struct* cur = p;\n\n\t\t\t\twhile (cur)\n\t\t\t\t{\n\t\t\t\t\tif (step_push(ns, cur, alloc) & once)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcur = cur->parent;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_descendant_or_self:\n\t\t\tcase axis_self:\n\t\t\t{\n\t\t\t\tif (_test == nodetest_type_node) // reject attributes based on principal node type test\n\t\t\t\t\tstep_push(ns, a, p, alloc);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_following:\n\t\t\t{\n\t\t\t\txml_node_struct* cur = p;\n\n\t\t\t\twhile (cur)\n\t\t\t\t{\n\t\t\t\t\tif (cur->first_child)\n\t\t\t\t\t\tcur = cur->first_child;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\twhile (!cur->next_sibling)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcur = cur->parent;\n\n\t\t\t\t\t\t\tif (!cur) return;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcur = cur->next_sibling;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (step_push(ns, cur, alloc) & once)\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_parent:\n\t\t\t{\n\t\t\t\tstep_push(ns, p, alloc);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase axis_preceding:\n\t\t\t{\n\t\t\t\t// preceding:: axis does not include attribute nodes and attribute ancestors (they are the same as parent's ancestors), so we can reuse node preceding\n\t\t\t\tstep_fill(ns, p, alloc, once, v);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassert(!\"Unimplemented axis\");\n\t\t\t}\n\t\t}\n\n\t\ttemplate <class T> void step_fill(xpath_node_set_raw& ns, const xpath_node& xn, xpath_allocator* alloc, bool once, T v)\n\t\t{\n\t\t\tconst axis_t axis = T::axis;\n\t\t\tconst bool axis_has_attributes = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_descendant_or_self || axis == axis_following || axis == axis_parent || axis == axis_preceding || axis == axis_self);\n\n\t\t\tif (xn.node())\n\t\t\t\tstep_fill(ns, xn.node().internal_object(), alloc, once, v);\n\t\t\telse if (axis_has_attributes && xn.attribute() && xn.parent())\n\t\t\t\tstep_fill(ns, xn.attribute().internal_object(), xn.parent().internal_object(), alloc, once, v);\n\t\t}\n\n\t\ttemplate <class T> xpath_node_set_raw step_do(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval, T v)\n\t\t{\n\t\t\tconst axis_t axis = T::axis;\n\t\t\tconst bool axis_reverse = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_preceding || axis == axis_preceding_sibling);\n\t\t\tconst xpath_node_set::type_t axis_type = axis_reverse ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted;\n\n\t\t\tbool once =\n\t\t\t\t(axis == axis_attribute && _test == nodetest_name) ||\n\t\t\t\t(!_right && eval_once(axis_type, eval)) ||\n\t\t\t\t(_right && !_right->_next && _right->_test == predicate_constant_one);\n\n\t\t\txpath_node_set_raw ns;\n\t\t\tns.set_type(axis_type);\n\n\t\t\tif (_left)\n\t\t\t{\n\t\t\t\txpath_node_set_raw s = _left->eval_node_set(c, stack, nodeset_eval_all);\n\n\t\t\t\t// self axis preserves the original order\n\t\t\t\tif (axis == axis_self) ns.set_type(s.type());\n\n\t\t\t\tfor (const xpath_node* it = s.begin(); it != s.end(); ++it)\n\t\t\t\t{\n\t\t\t\t\tsize_t size = ns.size();\n\n\t\t\t\t\t// in general, all axes generate elements in a particular order, but there is no order guarantee if axis is applied to two nodes\n\t\t\t\t\tif (axis != axis_self && size != 0) ns.set_type(xpath_node_set::type_unsorted);\n\n\t\t\t\t\tstep_fill(ns, *it, stack.result, once, v);\n\t\t\t\t\tif (_right) apply_predicates(ns, size, stack, eval);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstep_fill(ns, c.n, stack.result, once, v);\n\t\t\t\tif (_right) apply_predicates(ns, 0, stack, eval);\n\t\t\t}\n\n\t\t\t// child, attribute and self axes always generate unique set of nodes\n\t\t\t// for other axis, if the set stayed sorted, it stayed unique because the traversal algorithms do not visit the same node twice\n\t\t\tif (axis != axis_child && axis != axis_attribute && axis != axis_self && ns.type() == xpath_node_set::type_unsorted)\n\t\t\t\tns.remove_duplicates();\n\n\t\t\treturn ns;\n\t\t}\n\n\tpublic:\n\t\txpath_ast_node(ast_type_t type, xpath_value_type rettype_, const char_t* value):\n\t\t\t_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)\n\t\t{\n\t\t\tassert(type == ast_string_constant);\n\t\t\t_data.string = value;\n\t\t}\n\n\t\txpath_ast_node(ast_type_t type, xpath_value_type rettype_, double value):\n\t\t\t_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)\n\t\t{\n\t\t\tassert(type == ast_number_constant);\n\t\t\t_data.number = value;\n\t\t}\n\n\t\txpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_variable* value):\n\t\t\t_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)\n\t\t{\n\t\t\tassert(type == ast_variable);\n\t\t\t_data.variable = value;\n\t\t}\n\n\t\txpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_ast_node* left = 0, xpath_ast_node* right = 0):\n\t\t\t_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(left), _right(right), _next(0)\n\t\t{\n\t\t}\n\n\t\txpath_ast_node(ast_type_t type, xpath_ast_node* left, axis_t axis, nodetest_t test, const char_t* contents):\n\t\t\t_type(static_cast<char>(type)), _rettype(xpath_type_node_set), _axis(static_cast<char>(axis)), _test(static_cast<char>(test)), _left(left), _right(0), _next(0)\n\t\t{\n\t\t\tassert(type == ast_step);\n\t\t\t_data.nodetest = contents;\n\t\t}\n\n\t\txpath_ast_node(ast_type_t type, xpath_ast_node* left, xpath_ast_node* right, predicate_t test):\n\t\t\t_type(static_cast<char>(type)), _rettype(xpath_type_node_set), _axis(0), _test(static_cast<char>(test)), _left(left), _right(right), _next(0)\n\t\t{\n\t\t\tassert(type == ast_filter || type == ast_predicate);\n\t\t}\n\n\t\tvoid set_next(xpath_ast_node* value)\n\t\t{\n\t\t\t_next = value;\n\t\t}\n\n\t\tvoid set_right(xpath_ast_node* value)\n\t\t{\n\t\t\t_right = value;\n\t\t}\n\n\t\tbool eval_boolean(const xpath_context& c, const xpath_stack& stack)\n\t\t{\n\t\t\tswitch (_type)\n\t\t\t{\n\t\t\tcase ast_op_or:\n\t\t\t\treturn _left->eval_boolean(c, stack) || _right->eval_boolean(c, stack);\n\n\t\t\tcase ast_op_and:\n\t\t\t\treturn _left->eval_boolean(c, stack) && _right->eval_boolean(c, stack);\n\n\t\t\tcase ast_op_equal:\n\t\t\t\treturn compare_eq(_left, _right, c, stack, equal_to());\n\n\t\t\tcase ast_op_not_equal:\n\t\t\t\treturn compare_eq(_left, _right, c, stack, not_equal_to());\n\n\t\t\tcase ast_op_less:\n\t\t\t\treturn compare_rel(_left, _right, c, stack, less());\n\n\t\t\tcase ast_op_greater:\n\t\t\t\treturn compare_rel(_right, _left, c, stack, less());\n\n\t\t\tcase ast_op_less_or_equal:\n\t\t\t\treturn compare_rel(_left, _right, c, stack, less_equal());\n\n\t\t\tcase ast_op_greater_or_equal:\n\t\t\t\treturn compare_rel(_right, _left, c, stack, less_equal());\n\n\t\t\tcase ast_func_starts_with:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\txpath_string lr = _left->eval_string(c, stack);\n\t\t\t\txpath_string rr = _right->eval_string(c, stack);\n\n\t\t\t\treturn starts_with(lr.c_str(), rr.c_str());\n\t\t\t}\n\n\t\t\tcase ast_func_contains:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\txpath_string lr = _left->eval_string(c, stack);\n\t\t\t\txpath_string rr = _right->eval_string(c, stack);\n\n\t\t\t\treturn find_substring(lr.c_str(), rr.c_str()) != 0;\n\t\t\t}\n\n\t\t\tcase ast_func_boolean:\n\t\t\t\treturn _left->eval_boolean(c, stack);\n\n\t\t\tcase ast_func_not:\n\t\t\t\treturn !_left->eval_boolean(c, stack);\n\n\t\t\tcase ast_func_true:\n\t\t\t\treturn true;\n\n\t\t\tcase ast_func_false:\n\t\t\t\treturn false;\n\n\t\t\tcase ast_func_lang:\n\t\t\t{\n\t\t\t\tif (c.n.attribute()) return false;\n\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\txpath_string lang = _left->eval_string(c, stack);\n\n\t\t\t\tfor (xml_node n = c.n.node(); n; n = n.parent())\n\t\t\t\t{\n\t\t\t\t\txml_attribute a = n.attribute(PUGIXML_TEXT(\"xml:lang\"));\n\n\t\t\t\t\tif (a)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst char_t* value = a.value();\n\n\t\t\t\t\t\t// strnicmp / strncasecmp is not portable\n\t\t\t\t\t\tfor (const char_t* lit = lang.c_str(); *lit; ++lit)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (tolower_ascii(*lit) != tolower_ascii(*value)) return false;\n\t\t\t\t\t\t\t++value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn *value == 0 || *value == '-';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tcase ast_opt_compare_attribute:\n\t\t\t{\n\t\t\t\tconst char_t* value = (_right->_type == ast_string_constant) ? _right->_data.string : _right->_data.variable->get_string();\n\n\t\t\t\txml_attribute attr = c.n.node().attribute(_left->_data.nodetest);\n\n\t\t\t\treturn attr && strequal(attr.value(), value) && is_xpath_attribute(attr.name());\n\t\t\t}\n\n\t\t\tcase ast_variable:\n\t\t\t{\n\t\t\t\tassert(_rettype == _data.variable->type());\n\n\t\t\t\tif (_rettype == xpath_type_boolean)\n\t\t\t\t\treturn _data.variable->get_boolean();\n\n\t\t\t\t// fallthrough to type conversion\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tswitch (_rettype)\n\t\t\t\t{\n\t\t\t\tcase xpath_type_number:\n\t\t\t\t\treturn convert_number_to_boolean(eval_number(c, stack));\n\n\t\t\t\tcase xpath_type_string:\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\t\treturn !eval_string(c, stack).empty();\n\t\t\t\t}\n\n\t\t\t\tcase xpath_type_node_set:\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\t\treturn !eval_node_set(c, stack, nodeset_eval_any).empty();\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tassert(!\"Wrong expression for return type boolean\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdouble eval_number(const xpath_context& c, const xpath_stack& stack)\n\t\t{\n\t\t\tswitch (_type)\n\t\t\t{\n\t\t\tcase ast_op_add:\n\t\t\t\treturn _left->eval_number(c, stack) + _right->eval_number(c, stack);\n\n\t\t\tcase ast_op_subtract:\n\t\t\t\treturn _left->eval_number(c, stack) - _right->eval_number(c, stack);\n\n\t\t\tcase ast_op_multiply:\n\t\t\t\treturn _left->eval_number(c, stack) * _right->eval_number(c, stack);\n\n\t\t\tcase ast_op_divide:\n\t\t\t\treturn _left->eval_number(c, stack) / _right->eval_number(c, stack);\n\n\t\t\tcase ast_op_mod:\n\t\t\t\treturn fmod(_left->eval_number(c, stack), _right->eval_number(c, stack));\n\n\t\t\tcase ast_op_negate:\n\t\t\t\treturn -_left->eval_number(c, stack);\n\n\t\t\tcase ast_number_constant:\n\t\t\t\treturn _data.number;\n\n\t\t\tcase ast_func_last:\n\t\t\t\treturn static_cast<double>(c.size);\n\n\t\t\tcase ast_func_position:\n\t\t\t\treturn static_cast<double>(c.position);\n\n\t\t\tcase ast_func_count:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\treturn static_cast<double>(_left->eval_node_set(c, stack, nodeset_eval_all).size());\n\t\t\t}\n\n\t\t\tcase ast_func_string_length_0:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\treturn static_cast<double>(string_value(c.n, stack.result).length());\n\t\t\t}\n\n\t\t\tcase ast_func_string_length_1:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\treturn static_cast<double>(_left->eval_string(c, stack).length());\n\t\t\t}\n\n\t\t\tcase ast_func_number_0:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\treturn convert_string_to_number(string_value(c.n, stack.result).c_str());\n\t\t\t}\n\n\t\t\tcase ast_func_number_1:\n\t\t\t\treturn _left->eval_number(c, stack);\n\n\t\t\tcase ast_func_sum:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\tdouble r = 0;\n\n\t\t\t\txpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_all);\n\n\t\t\t\tfor (const xpath_node* it = ns.begin(); it != ns.end(); ++it)\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cri(stack.result);\n\n\t\t\t\t\tr += convert_string_to_number(string_value(*it, stack.result).c_str());\n\t\t\t\t}\n\n\t\t\t\treturn r;\n\t\t\t}\n\n\t\t\tcase ast_func_floor:\n\t\t\t{\n\t\t\t\tdouble r = _left->eval_number(c, stack);\n\n\t\t\t\treturn r == r ? floor(r) : r;\n\t\t\t}\n\n\t\t\tcase ast_func_ceiling:\n\t\t\t{\n\t\t\t\tdouble r = _left->eval_number(c, stack);\n\n\t\t\t\treturn r == r ? ceil(r) : r;\n\t\t\t}\n\n\t\t\tcase ast_func_round:\n\t\t\t\treturn round_nearest_nzero(_left->eval_number(c, stack));\n\n\t\t\tcase ast_variable:\n\t\t\t{\n\t\t\t\tassert(_rettype == _data.variable->type());\n\n\t\t\t\tif (_rettype == xpath_type_number)\n\t\t\t\t\treturn _data.variable->get_number();\n\n\t\t\t\t// fallthrough to type conversion\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tswitch (_rettype)\n\t\t\t\t{\n\t\t\t\tcase xpath_type_boolean:\n\t\t\t\t\treturn eval_boolean(c, stack) ? 1 : 0;\n\n\t\t\t\tcase xpath_type_string:\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\t\treturn convert_string_to_number(eval_string(c, stack).c_str());\n\t\t\t\t}\n\n\t\t\t\tcase xpath_type_node_set:\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\t\treturn convert_string_to_number(eval_string(c, stack).c_str());\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tassert(!\"Wrong expression for return type number\");\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\txpath_string eval_string_concat(const xpath_context& c, const xpath_stack& stack)\n\t\t{\n\t\t\tassert(_type == ast_func_concat);\n\n\t\t\txpath_allocator_capture ct(stack.temp);\n\n\t\t\t// count the string number\n\t\t\tsize_t count = 1;\n\t\t\tfor (xpath_ast_node* nc = _right; nc; nc = nc->_next) count++;\n\n\t\t\t// gather all strings\n\t\t\txpath_string static_buffer[4];\n\t\t\txpath_string* buffer = static_buffer;\n\n\t\t\t// allocate on-heap for large concats\n\t\t\tif (count > sizeof(static_buffer) / sizeof(static_buffer[0]))\n\t\t\t{\n\t\t\t\tbuffer = static_cast<xpath_string*>(stack.temp->allocate(count * sizeof(xpath_string)));\n\t\t\t\tassert(buffer);\n\t\t\t}\n\n\t\t\t// evaluate all strings to temporary stack\n\t\t\txpath_stack swapped_stack = {stack.temp, stack.result};\n\n\t\t\tbuffer[0] = _left->eval_string(c, swapped_stack);\n\n\t\t\tsize_t pos = 1;\n\t\t\tfor (xpath_ast_node* n = _right; n; n = n->_next, ++pos) buffer[pos] = n->eval_string(c, swapped_stack);\n\t\t\tassert(pos == count);\n\n\t\t\t// get total length\n\t\t\tsize_t length = 0;\n\t\t\tfor (size_t i = 0; i < count; ++i) length += buffer[i].length();\n\n\t\t\t// create final string\n\t\t\tchar_t* result = static_cast<char_t*>(stack.result->allocate((length + 1) * sizeof(char_t)));\n\t\t\tassert(result);\n\n\t\t\tchar_t* ri = result;\n\n\t\t\tfor (size_t j = 0; j < count; ++j)\n\t\t\t\tfor (const char_t* bi = buffer[j].c_str(); *bi; ++bi)\n\t\t\t\t\t*ri++ = *bi;\n\n\t\t\t*ri = 0;\n\n\t\t\treturn xpath_string::from_heap_preallocated(result, ri);\n\t\t}\n\n\t\txpath_string eval_string(const xpath_context& c, const xpath_stack& stack)\n\t\t{\n\t\t\tswitch (_type)\n\t\t\t{\n\t\t\tcase ast_string_constant:\n\t\t\t\treturn xpath_string::from_const(_data.string);\n\n\t\t\tcase ast_func_local_name_0:\n\t\t\t{\n\t\t\t\txpath_node na = c.n;\n\n\t\t\t\treturn xpath_string::from_const(local_name(na));\n\t\t\t}\n\n\t\t\tcase ast_func_local_name_1:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\txpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);\n\t\t\t\txpath_node na = ns.first();\n\n\t\t\t\treturn xpath_string::from_const(local_name(na));\n\t\t\t}\n\n\t\t\tcase ast_func_name_0:\n\t\t\t{\n\t\t\t\txpath_node na = c.n;\n\n\t\t\t\treturn xpath_string::from_const(qualified_name(na));\n\t\t\t}\n\n\t\t\tcase ast_func_name_1:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\txpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);\n\t\t\t\txpath_node na = ns.first();\n\n\t\t\t\treturn xpath_string::from_const(qualified_name(na));\n\t\t\t}\n\n\t\t\tcase ast_func_namespace_uri_0:\n\t\t\t{\n\t\t\t\txpath_node na = c.n;\n\n\t\t\t\treturn xpath_string::from_const(namespace_uri(na));\n\t\t\t}\n\n\t\t\tcase ast_func_namespace_uri_1:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.result);\n\n\t\t\t\txpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);\n\t\t\t\txpath_node na = ns.first();\n\n\t\t\t\treturn xpath_string::from_const(namespace_uri(na));\n\t\t\t}\n\n\t\t\tcase ast_func_string_0:\n\t\t\t\treturn string_value(c.n, stack.result);\n\n\t\t\tcase ast_func_string_1:\n\t\t\t\treturn _left->eval_string(c, stack);\n\n\t\t\tcase ast_func_concat:\n\t\t\t\treturn eval_string_concat(c, stack);\n\n\t\t\tcase ast_func_substring_before:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.temp);\n\n\t\t\t\txpath_stack swapped_stack = {stack.temp, stack.result};\n\n\t\t\t\txpath_string s = _left->eval_string(c, swapped_stack);\n\t\t\t\txpath_string p = _right->eval_string(c, swapped_stack);\n\n\t\t\t\tconst char_t* pos = find_substring(s.c_str(), p.c_str());\n\n\t\t\t\treturn pos ? xpath_string::from_heap(s.c_str(), pos, stack.result) : xpath_string();\n\t\t\t}\n\n\t\t\tcase ast_func_substring_after:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.temp);\n\n\t\t\t\txpath_stack swapped_stack = {stack.temp, stack.result};\n\n\t\t\t\txpath_string s = _left->eval_string(c, swapped_stack);\n\t\t\t\txpath_string p = _right->eval_string(c, swapped_stack);\n\n\t\t\t\tconst char_t* pos = find_substring(s.c_str(), p.c_str());\n\t\t\t\tif (!pos) return xpath_string();\n\n\t\t\t\tconst char_t* rbegin = pos + p.length();\n\t\t\t\tconst char_t* rend = s.c_str() + s.length();\n\n\t\t\t\treturn s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin);\n\t\t\t}\n\n\t\t\tcase ast_func_substring_2:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.temp);\n\n\t\t\t\txpath_stack swapped_stack = {stack.temp, stack.result};\n\n\t\t\t\txpath_string s = _left->eval_string(c, swapped_stack);\n\t\t\t\tsize_t s_length = s.length();\n\n\t\t\t\tdouble first = round_nearest(_right->eval_number(c, stack));\n\n\t\t\t\tif (is_nan(first)) return xpath_string(); // NaN\n\t\t\t\telse if (first >= s_length + 1) return xpath_string();\n\n\t\t\t\tsize_t pos = first < 1 ? 1 : static_cast<size_t>(first);\n\t\t\t\tassert(1 <= pos && pos <= s_length + 1);\n\n\t\t\t\tconst char_t* rbegin = s.c_str() + (pos - 1);\n\t\t\t\tconst char_t* rend = s.c_str() + s.length();\n\n\t\t\t\treturn s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin);\n\t\t\t}\n\n\t\t\tcase ast_func_substring_3:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.temp);\n\n\t\t\t\txpath_stack swapped_stack = {stack.temp, stack.result};\n\n\t\t\t\txpath_string s = _left->eval_string(c, swapped_stack);\n\t\t\t\tsize_t s_length = s.length();\n\n\t\t\t\tdouble first = round_nearest(_right->eval_number(c, stack));\n\t\t\t\tdouble last = first + round_nearest(_right->_next->eval_number(c, stack));\n\n\t\t\t\tif (is_nan(first) || is_nan(last)) return xpath_string();\n\t\t\t\telse if (first >= s_length + 1) return xpath_string();\n\t\t\t\telse if (first >= last) return xpath_string();\n\t\t\t\telse if (last < 1) return xpath_string();\n\n\t\t\t\tsize_t pos = first < 1 ? 1 : static_cast<size_t>(first);\n\t\t\t\tsize_t end = last >= s_length + 1 ? s_length + 1 : static_cast<size_t>(last);\n\n\t\t\t\tassert(1 <= pos && pos <= end && end <= s_length + 1);\n\t\t\t\tconst char_t* rbegin = s.c_str() + (pos - 1);\n\t\t\t\tconst char_t* rend = s.c_str() + (end - 1);\n\n\t\t\t\treturn (end == s_length + 1 && !s.uses_heap()) ? xpath_string::from_const(rbegin) : xpath_string::from_heap(rbegin, rend, stack.result);\n\t\t\t}\n\n\t\t\tcase ast_func_normalize_space_0:\n\t\t\t{\n\t\t\t\txpath_string s = string_value(c.n, stack.result);\n\n\t\t\t\tchar_t* begin = s.data(stack.result);\n\t\t\t\tchar_t* end = normalize_space(begin);\n\n\t\t\t\treturn xpath_string::from_heap_preallocated(begin, end);\n\t\t\t}\n\n\t\t\tcase ast_func_normalize_space_1:\n\t\t\t{\n\t\t\t\txpath_string s = _left->eval_string(c, stack);\n\n\t\t\t\tchar_t* begin = s.data(stack.result);\n\t\t\t\tchar_t* end = normalize_space(begin);\n\n\t\t\t\treturn xpath_string::from_heap_preallocated(begin, end);\n\t\t\t}\n\n\t\t\tcase ast_func_translate:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.temp);\n\n\t\t\t\txpath_stack swapped_stack = {stack.temp, stack.result};\n\n\t\t\t\txpath_string s = _left->eval_string(c, stack);\n\t\t\t\txpath_string from = _right->eval_string(c, swapped_stack);\n\t\t\t\txpath_string to = _right->_next->eval_string(c, swapped_stack);\n\n\t\t\t\tchar_t* begin = s.data(stack.result);\n\t\t\t\tchar_t* end = translate(begin, from.c_str(), to.c_str(), to.length());\n\n\t\t\t\treturn xpath_string::from_heap_preallocated(begin, end);\n\t\t\t}\n\n\t\t\tcase ast_opt_translate_table:\n\t\t\t{\n\t\t\t\txpath_string s = _left->eval_string(c, stack);\n\n\t\t\t\tchar_t* begin = s.data(stack.result);\n\t\t\t\tchar_t* end = translate_table(begin, _data.table);\n\n\t\t\t\treturn xpath_string::from_heap_preallocated(begin, end);\n\t\t\t}\n\n\t\t\tcase ast_variable:\n\t\t\t{\n\t\t\t\tassert(_rettype == _data.variable->type());\n\n\t\t\t\tif (_rettype == xpath_type_string)\n\t\t\t\t\treturn xpath_string::from_const(_data.variable->get_string());\n\n\t\t\t\t// fallthrough to type conversion\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tswitch (_rettype)\n\t\t\t\t{\n\t\t\t\tcase xpath_type_boolean:\n\t\t\t\t\treturn xpath_string::from_const(eval_boolean(c, stack) ? PUGIXML_TEXT(\"true\") : PUGIXML_TEXT(\"false\"));\n\n\t\t\t\tcase xpath_type_number:\n\t\t\t\t\treturn convert_number_to_string(eval_number(c, stack), stack.result);\n\n\t\t\t\tcase xpath_type_node_set:\n\t\t\t\t{\n\t\t\t\t\txpath_allocator_capture cr(stack.temp);\n\n\t\t\t\t\txpath_stack swapped_stack = {stack.temp, stack.result};\n\n\t\t\t\t\txpath_node_set_raw ns = eval_node_set(c, swapped_stack, nodeset_eval_first);\n\t\t\t\t\treturn ns.empty() ? xpath_string() : string_value(ns.first(), stack.result);\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tassert(!\"Wrong expression for return type string\");\n\t\t\t\t\treturn xpath_string();\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\txpath_node_set_raw eval_node_set(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval)\n\t\t{\n\t\t\tswitch (_type)\n\t\t\t{\n\t\t\tcase ast_op_union:\n\t\t\t{\n\t\t\t\txpath_allocator_capture cr(stack.temp);\n\n\t\t\t\txpath_stack swapped_stack = {stack.temp, stack.result};\n\n\t\t\t\txpath_node_set_raw ls = _left->eval_node_set(c, swapped_stack, eval);\n\t\t\t\txpath_node_set_raw rs = _right->eval_node_set(c, stack, eval);\n\n\t\t\t\t// we can optimize merging two sorted sets, but this is a very rare operation, so don't bother\n\t\t\t\trs.set_type(xpath_node_set::type_unsorted);\n\n\t\t\t\trs.append(ls.begin(), ls.end(), stack.result);\n\t\t\t\trs.remove_duplicates();\n\n\t\t\t\treturn rs;\n\t\t\t}\n\n\t\t\tcase ast_filter:\n\t\t\t{\n\t\t\t\txpath_node_set_raw set = _left->eval_node_set(c, stack, _test == predicate_constant_one ? nodeset_eval_first : nodeset_eval_all);\n\n\t\t\t\t// either expression is a number or it contains position() call; sort by document order\n\t\t\t\tif (_test != predicate_posinv) set.sort_do();\n\n\t\t\t\tbool once = eval_once(set.type(), eval);\n\n\t\t\t\tapply_predicate(set, 0, stack, once);\n\n\t\t\t\treturn set;\n\t\t\t}\n\n\t\t\tcase ast_func_id:\n\t\t\t\treturn xpath_node_set_raw();\n\n\t\t\tcase ast_step:\n\t\t\t{\n\t\t\t\tswitch (_axis)\n\t\t\t\t{\n\t\t\t\tcase axis_ancestor:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_ancestor>());\n\n\t\t\t\tcase axis_ancestor_or_self:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_ancestor_or_self>());\n\n\t\t\t\tcase axis_attribute:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_attribute>());\n\n\t\t\t\tcase axis_child:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_child>());\n\n\t\t\t\tcase axis_descendant:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_descendant>());\n\n\t\t\t\tcase axis_descendant_or_self:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_descendant_or_self>());\n\n\t\t\t\tcase axis_following:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_following>());\n\n\t\t\t\tcase axis_following_sibling:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_following_sibling>());\n\n\t\t\t\tcase axis_namespace:\n\t\t\t\t\t// namespaced axis is not supported\n\t\t\t\t\treturn xpath_node_set_raw();\n\n\t\t\t\tcase axis_parent:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_parent>());\n\n\t\t\t\tcase axis_preceding:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_preceding>());\n\n\t\t\t\tcase axis_preceding_sibling:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_preceding_sibling>());\n\n\t\t\t\tcase axis_self:\n\t\t\t\t\treturn step_do(c, stack, eval, axis_to_type<axis_self>());\n\n\t\t\t\tdefault:\n\t\t\t\t\tassert(!\"Unknown axis\");\n\t\t\t\t\treturn xpath_node_set_raw();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase ast_step_root:\n\t\t\t{\n\t\t\t\tassert(!_right); // root step can't have any predicates\n\n\t\t\t\txpath_node_set_raw ns;\n\n\t\t\t\tns.set_type(xpath_node_set::type_sorted);\n\n\t\t\t\tif (c.n.node()) ns.push_back(c.n.node().root(), stack.result);\n\t\t\t\telse if (c.n.attribute()) ns.push_back(c.n.parent().root(), stack.result);\n\n\t\t\t\treturn ns;\n\t\t\t}\n\n\t\t\tcase ast_variable:\n\t\t\t{\n\t\t\t\tassert(_rettype == _data.variable->type());\n\n\t\t\t\tif (_rettype == xpath_type_node_set)\n\t\t\t\t{\n\t\t\t\t\tconst xpath_node_set& s = _data.variable->get_node_set();\n\n\t\t\t\t\txpath_node_set_raw ns;\n\n\t\t\t\t\tns.set_type(s.type());\n\t\t\t\t\tns.append(s.begin(), s.end(), stack.result);\n\n\t\t\t\t\treturn ns;\n\t\t\t\t}\n\n\t\t\t\t// fallthrough to type conversion\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassert(!\"Wrong expression for return type node set\");\n\t\t\t\treturn xpath_node_set_raw();\n\t\t\t}\n\t\t}\n\n\t\tvoid optimize(xpath_allocator* alloc)\n\t\t{\n\t\t\tif (_left) _left->optimize(alloc);\n\t\t\tif (_right) _right->optimize(alloc);\n\t\t\tif (_next) _next->optimize(alloc);\n\n\t\t\toptimize_self(alloc);\n\t\t}\n\n\t\tvoid optimize_self(xpath_allocator* alloc)\n\t\t{\n\t\t\t// Rewrite [position()=expr] with [expr]\n\t\t\t// Note that this step has to go before classification to recognize [position()=1]\n\t\t\tif ((_type == ast_filter || _type == ast_predicate) &&\n\t\t\t\t_right->_type == ast_op_equal && _right->_left->_type == ast_func_position && _right->_right->_rettype == xpath_type_number)\n\t\t\t{\n\t\t\t\t_right = _right->_right;\n\t\t\t}\n\n\t\t\t// Classify filter/predicate ops to perform various optimizations during evaluation\n\t\t\tif (_type == ast_filter || _type == ast_predicate)\n\t\t\t{\n\t\t\t\tassert(_test == predicate_default);\n\n\t\t\t\tif (_right->_type == ast_number_constant && _right->_data.number == 1.0)\n\t\t\t\t\t_test = predicate_constant_one;\n\t\t\t\telse if (_right->_rettype == xpath_type_number && (_right->_type == ast_number_constant || _right->_type == ast_variable || _right->_type == ast_func_last))\n\t\t\t\t\t_test = predicate_constant;\n\t\t\t\telse if (_right->_rettype != xpath_type_number && _right->is_posinv_expr())\n\t\t\t\t\t_test = predicate_posinv;\n\t\t\t}\n\n\t\t\t// Rewrite descendant-or-self::node()/child::foo with descendant::foo\n\t\t\t// The former is a full form of //foo, the latter is much faster since it executes the node test immediately\n\t\t\t// Do a similar kind of rewrite for self/descendant/descendant-or-self axes\n\t\t\t// Note that we only rewrite positionally invariant steps (//foo[1] != /descendant::foo[1])\n\t\t\tif (_type == ast_step && (_axis == axis_child || _axis == axis_self || _axis == axis_descendant || _axis == axis_descendant_or_self) && _left &&\n\t\t\t\t_left->_type == ast_step && _left->_axis == axis_descendant_or_self && _left->_test == nodetest_type_node && !_left->_right &&\n\t\t\t\tis_posinv_step())\n\t\t\t{\n\t\t\t\tif (_axis == axis_child || _axis == axis_descendant)\n\t\t\t\t\t_axis = axis_descendant;\n\t\t\t\telse\n\t\t\t\t\t_axis = axis_descendant_or_self;\n\n\t\t\t\t_left = _left->_left;\n\t\t\t}\n\n\t\t\t// Use optimized lookup table implementation for translate() with constant arguments\n\t\t\tif (_type == ast_func_translate && _right->_type == ast_string_constant && _right->_next->_type == ast_string_constant)\n\t\t\t{\n\t\t\t\tunsigned char* table = translate_table_generate(alloc, _right->_data.string, _right->_next->_data.string);\n\n\t\t\t\tif (table)\n\t\t\t\t{\n\t\t\t\t\t_type = ast_opt_translate_table;\n\t\t\t\t\t_data.table = table;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Use optimized path for @attr = 'value' or @attr = $value\n\t\t\tif (_type == ast_op_equal &&\n\t\t\t\t_left->_type == ast_step && _left->_axis == axis_attribute && _left->_test == nodetest_name && !_left->_left && !_left->_right &&\n\t\t\t\t(_right->_type == ast_string_constant || (_right->_type == ast_variable && _right->_rettype == xpath_type_string)))\n\t\t\t{\n\t\t\t\t_type = ast_opt_compare_attribute;\n\t\t\t}\n\t\t}\n\n\t\tbool is_posinv_expr() const\n\t\t{\n\t\t\tswitch (_type)\n\t\t\t{\n\t\t\tcase ast_func_position:\n\t\t\tcase ast_func_last:\n\t\t\t\treturn false;\n\n\t\t\tcase ast_string_constant:\n\t\t\tcase ast_number_constant:\n\t\t\tcase ast_variable:\n\t\t\t\treturn true;\n\n\t\t\tcase ast_step:\n\t\t\tcase ast_step_root:\n\t\t\t\treturn true;\n\n\t\t\tcase ast_predicate:\n\t\t\tcase ast_filter:\n\t\t\t\treturn true;\n\n\t\t\tdefault:\n\t\t\t\tif (_left && !_left->is_posinv_expr()) return false;\n\n\t\t\t\tfor (xpath_ast_node* n = _right; n; n = n->_next)\n\t\t\t\t\tif (!n->is_posinv_expr()) return false;\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tbool is_posinv_step() const\n\t\t{\n\t\t\tassert(_type == ast_step);\n\n\t\t\tfor (xpath_ast_node* n = _right; n; n = n->_next)\n\t\t\t{\n\t\t\t\tassert(n->_type == ast_predicate);\n\n\t\t\t\tif (n->_test != predicate_posinv)\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\txpath_value_type rettype() const\n\t\t{\n\t\t\treturn static_cast<xpath_value_type>(_rettype);\n\t\t}\n\t};\n\n\tstruct xpath_parser\n\t{\n\t\txpath_allocator* _alloc;\n\t\txpath_lexer _lexer;\n\n\t\tconst char_t* _query;\n\t\txpath_variable_set* _variables;\n\n\t\txpath_parse_result* _result;\n\n\t\tchar_t _scratch[32];\n\n\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\tjmp_buf _error_handler;\n\t#endif\n\n\t\tvoid throw_error(const char* message)\n\t\t{\n\t\t\t_result->error = message;\n\t\t\t_result->offset = _lexer.current_pos() - _query;\n\n\t\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\t\tlongjmp(_error_handler, 1);\n\t\t#else\n\t\t\tthrow xpath_exception(*_result);\n\t\t#endif\n\t\t}\n\n\t\tvoid throw_error_oom()\n\t\t{\n\t\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\t\tthrow_error(\"Out of memory\");\n\t\t#else\n\t\t\tthrow std::bad_alloc();\n\t\t#endif\n\t\t}\n\n\t\tvoid* alloc_node()\n\t\t{\n\t\t\tvoid* result = _alloc->allocate_nothrow(sizeof(xpath_ast_node));\n\n\t\t\tif (!result) throw_error_oom();\n\n\t\t\treturn result;\n\t\t}\n\n\t\tconst char_t* alloc_string(const xpath_lexer_string& value)\n\t\t{\n\t\t\tif (value.begin)\n\t\t\t{\n\t\t\t\tsize_t length = static_cast<size_t>(value.end - value.begin);\n\n\t\t\t\tchar_t* c = static_cast<char_t*>(_alloc->allocate_nothrow((length + 1) * sizeof(char_t)));\n\t\t\t\tif (!c) throw_error_oom();\n\t\t\t\tassert(c); // workaround for clang static analysis\n\n\t\t\t\tmemcpy(c, value.begin, length * sizeof(char_t));\n\t\t\t\tc[length] = 0;\n\n\t\t\t\treturn c;\n\t\t\t}\n\t\t\telse return 0;\n\t\t}\n\n\t\txpath_ast_node* parse_function_helper(ast_type_t type0, ast_type_t type1, size_t argc, xpath_ast_node* args[2])\n\t\t{\n\t\t\tassert(argc <= 1);\n\n\t\t\tif (argc == 1 && args[0]->rettype() != xpath_type_node_set) throw_error(\"Function has to be applied to node set\");\n\n\t\t\treturn new (alloc_node()) xpath_ast_node(argc == 0 ? type0 : type1, xpath_type_string, args[0]);\n\t\t}\n\n\t\txpath_ast_node* parse_function(const xpath_lexer_string& name, size_t argc, xpath_ast_node* args[2])\n\t\t{\n\t\t\tswitch (name.begin[0])\n\t\t\t{\n\t\t\tcase 'b':\n\t\t\t\tif (name == PUGIXML_TEXT(\"boolean\") && argc == 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_boolean, xpath_type_boolean, args[0]);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'c':\n\t\t\t\tif (name == PUGIXML_TEXT(\"count\") && argc == 1)\n\t\t\t\t{\n\t\t\t\t\tif (args[0]->rettype() != xpath_type_node_set) throw_error(\"Function has to be applied to node set\");\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_count, xpath_type_number, args[0]);\n\t\t\t\t}\n\t\t\t\telse if (name == PUGIXML_TEXT(\"contains\") && argc == 2)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_contains, xpath_type_boolean, args[0], args[1]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"concat\") && argc >= 2)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_concat, xpath_type_string, args[0], args[1]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"ceiling\") && argc == 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_ceiling, xpath_type_number, args[0]);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'f':\n\t\t\t\tif (name == PUGIXML_TEXT(\"false\") && argc == 0)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_false, xpath_type_boolean);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"floor\") && argc == 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_floor, xpath_type_number, args[0]);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'i':\n\t\t\t\tif (name == PUGIXML_TEXT(\"id\") && argc == 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_id, xpath_type_node_set, args[0]);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'l':\n\t\t\t\tif (name == PUGIXML_TEXT(\"last\") && argc == 0)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_last, xpath_type_number);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"lang\") && argc == 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_lang, xpath_type_boolean, args[0]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"local-name\") && argc <= 1)\n\t\t\t\t\treturn parse_function_helper(ast_func_local_name_0, ast_func_local_name_1, argc, args);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'n':\n\t\t\t\tif (name == PUGIXML_TEXT(\"name\") && argc <= 1)\n\t\t\t\t\treturn parse_function_helper(ast_func_name_0, ast_func_name_1, argc, args);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"namespace-uri\") && argc <= 1)\n\t\t\t\t\treturn parse_function_helper(ast_func_namespace_uri_0, ast_func_namespace_uri_1, argc, args);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"normalize-space\") && argc <= 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_normalize_space_0 : ast_func_normalize_space_1, xpath_type_string, args[0], args[1]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"not\") && argc == 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_not, xpath_type_boolean, args[0]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"number\") && argc <= 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_number_0 : ast_func_number_1, xpath_type_number, args[0]);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'p':\n\t\t\t\tif (name == PUGIXML_TEXT(\"position\") && argc == 0)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_position, xpath_type_number);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'r':\n\t\t\t\tif (name == PUGIXML_TEXT(\"round\") && argc == 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_round, xpath_type_number, args[0]);\n\n\t\t\t\tbreak;\n\n\t\t\tcase 's':\n\t\t\t\tif (name == PUGIXML_TEXT(\"string\") && argc <= 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_0 : ast_func_string_1, xpath_type_string, args[0]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"string-length\") && argc <= 1)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_length_0 : ast_func_string_length_1, xpath_type_number, args[0]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"starts-with\") && argc == 2)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_starts_with, xpath_type_boolean, args[0], args[1]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"substring-before\") && argc == 2)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_substring_before, xpath_type_string, args[0], args[1]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"substring-after\") && argc == 2)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_substring_after, xpath_type_string, args[0], args[1]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"substring\") && (argc == 2 || argc == 3))\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(argc == 2 ? ast_func_substring_2 : ast_func_substring_3, xpath_type_string, args[0], args[1]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"sum\") && argc == 1)\n\t\t\t\t{\n\t\t\t\t\tif (args[0]->rettype() != xpath_type_node_set) throw_error(\"Function has to be applied to node set\");\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_sum, xpath_type_number, args[0]);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 't':\n\t\t\t\tif (name == PUGIXML_TEXT(\"translate\") && argc == 3)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_translate, xpath_type_string, args[0], args[1]);\n\t\t\t\telse if (name == PUGIXML_TEXT(\"true\") && argc == 0)\n\t\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_func_true, xpath_type_boolean);\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow_error(\"Unrecognized function or wrong parameter count\");\n\n\t\t\treturn 0;\n\t\t}\n\n\t\taxis_t parse_axis_name(const xpath_lexer_string& name, bool& specified)\n\t\t{\n\t\t\tspecified = true;\n\n\t\t\tswitch (name.begin[0])\n\t\t\t{\n\t\t\tcase 'a':\n\t\t\t\tif (name == PUGIXML_TEXT(\"ancestor\"))\n\t\t\t\t\treturn axis_ancestor;\n\t\t\t\telse if (name == PUGIXML_TEXT(\"ancestor-or-self\"))\n\t\t\t\t\treturn axis_ancestor_or_self;\n\t\t\t\telse if (name == PUGIXML_TEXT(\"attribute\"))\n\t\t\t\t\treturn axis_attribute;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'c':\n\t\t\t\tif (name == PUGIXML_TEXT(\"child\"))\n\t\t\t\t\treturn axis_child;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'd':\n\t\t\t\tif (name == PUGIXML_TEXT(\"descendant\"))\n\t\t\t\t\treturn axis_descendant;\n\t\t\t\telse if (name == PUGIXML_TEXT(\"descendant-or-self\"))\n\t\t\t\t\treturn axis_descendant_or_self;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'f':\n\t\t\t\tif (name == PUGIXML_TEXT(\"following\"))\n\t\t\t\t\treturn axis_following;\n\t\t\t\telse if (name == PUGIXML_TEXT(\"following-sibling\"))\n\t\t\t\t\treturn axis_following_sibling;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'n':\n\t\t\t\tif (name == PUGIXML_TEXT(\"namespace\"))\n\t\t\t\t\treturn axis_namespace;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'p':\n\t\t\t\tif (name == PUGIXML_TEXT(\"parent\"))\n\t\t\t\t\treturn axis_parent;\n\t\t\t\telse if (name == PUGIXML_TEXT(\"preceding\"))\n\t\t\t\t\treturn axis_preceding;\n\t\t\t\telse if (name == PUGIXML_TEXT(\"preceding-sibling\"))\n\t\t\t\t\treturn axis_preceding_sibling;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 's':\n\t\t\t\tif (name == PUGIXML_TEXT(\"self\"))\n\t\t\t\t\treturn axis_self;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tspecified = false;\n\t\t\treturn axis_child;\n\t\t}\n\n\t\tnodetest_t parse_node_test_type(const xpath_lexer_string& name)\n\t\t{\n\t\t\tswitch (name.begin[0])\n\t\t\t{\n\t\t\tcase 'c':\n\t\t\t\tif (name == PUGIXML_TEXT(\"comment\"))\n\t\t\t\t\treturn nodetest_type_comment;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'n':\n\t\t\t\tif (name == PUGIXML_TEXT(\"node\"))\n\t\t\t\t\treturn nodetest_type_node;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'p':\n\t\t\t\tif (name == PUGIXML_TEXT(\"processing-instruction\"))\n\t\t\t\t\treturn nodetest_type_pi;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 't':\n\t\t\t\tif (name == PUGIXML_TEXT(\"text\"))\n\t\t\t\t\treturn nodetest_type_text;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn nodetest_none;\n\t\t}\n\n\t\t// PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall\n\t\txpath_ast_node* parse_primary_expression()\n\t\t{\n\t\t\tswitch (_lexer.current())\n\t\t\t{\n\t\t\tcase lex_var_ref:\n\t\t\t{\n\t\t\t\txpath_lexer_string name = _lexer.contents();\n\n\t\t\t\tif (!_variables)\n\t\t\t\t\tthrow_error(\"Unknown variable: variable set is not provided\");\n\n\t\t\t\txpath_variable* var = 0;\n\t\t\t\tif (!get_variable_scratch(_scratch, _variables, name.begin, name.end, &var))\n\t\t\t\t\tthrow_error_oom();\n\n\t\t\t\tif (!var)\n\t\t\t\t\tthrow_error(\"Unknown variable: variable set does not contain the given name\");\n\n\t\t\t\t_lexer.next();\n\n\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_variable, var->type(), var);\n\t\t\t}\n\n\t\t\tcase lex_open_brace:\n\t\t\t{\n\t\t\t\t_lexer.next();\n\n\t\t\t\txpath_ast_node* n = parse_expression();\n\n\t\t\t\tif (_lexer.current() != lex_close_brace)\n\t\t\t\t\tthrow_error(\"Unmatched braces\");\n\n\t\t\t\t_lexer.next();\n\n\t\t\t\treturn n;\n\t\t\t}\n\n\t\t\tcase lex_quoted_string:\n\t\t\t{\n\t\t\t\tconst char_t* value = alloc_string(_lexer.contents());\n\n\t\t\t\txpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_string_constant, xpath_type_string, value);\n\t\t\t\t_lexer.next();\n\n\t\t\t\treturn n;\n\t\t\t}\n\n\t\t\tcase lex_number:\n\t\t\t{\n\t\t\t\tdouble value = 0;\n\n\t\t\t\tif (!convert_string_to_number_scratch(_scratch, _lexer.contents().begin, _lexer.contents().end, &value))\n\t\t\t\t\tthrow_error_oom();\n\n\t\t\t\txpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_number_constant, xpath_type_number, value);\n\t\t\t\t_lexer.next();\n\n\t\t\t\treturn n;\n\t\t\t}\n\n\t\t\tcase lex_string:\n\t\t\t{\n\t\t\t\txpath_ast_node* args[2] = {0};\n\t\t\t\tsize_t argc = 0;\n\n\t\t\t\txpath_lexer_string function = _lexer.contents();\n\t\t\t\t_lexer.next();\n\n\t\t\t\txpath_ast_node* last_arg = 0;\n\n\t\t\t\tif (_lexer.current() != lex_open_brace)\n\t\t\t\t\tthrow_error(\"Unrecognized function call\");\n\t\t\t\t_lexer.next();\n\n\t\t\t\tif (_lexer.current() != lex_close_brace)\n\t\t\t\t\targs[argc++] = parse_expression();\n\n\t\t\t\twhile (_lexer.current() != lex_close_brace)\n\t\t\t\t{\n\t\t\t\t\tif (_lexer.current() != lex_comma)\n\t\t\t\t\t\tthrow_error(\"No comma between function arguments\");\n\t\t\t\t\t_lexer.next();\n\n\t\t\t\t\txpath_ast_node* n = parse_expression();\n\n\t\t\t\t\tif (argc < 2) args[argc] = n;\n\t\t\t\t\telse last_arg->set_next(n);\n\n\t\t\t\t\targc++;\n\t\t\t\t\tlast_arg = n;\n\t\t\t\t}\n\n\t\t\t\t_lexer.next();\n\n\t\t\t\treturn parse_function(function, argc, args);\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tthrow_error(\"Unrecognizable primary expression\");\n\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\t// FilterExpr ::= PrimaryExpr | FilterExpr Predicate\n\t\t// Predicate ::= '[' PredicateExpr ']'\n\t\t// PredicateExpr ::= Expr\n\t\txpath_ast_node* parse_filter_expression()\n\t\t{\n\t\t\txpath_ast_node* n = parse_primary_expression();\n\n\t\t\twhile (_lexer.current() == lex_open_square_brace)\n\t\t\t{\n\t\t\t\t_lexer.next();\n\n\t\t\t\txpath_ast_node* expr = parse_expression();\n\n\t\t\t\tif (n->rettype() != xpath_type_node_set) throw_error(\"Predicate has to be applied to node set\");\n\n\t\t\t\tn = new (alloc_node()) xpath_ast_node(ast_filter, n, expr, predicate_default);\n\n\t\t\t\tif (_lexer.current() != lex_close_square_brace)\n\t\t\t\t\tthrow_error(\"Unmatched square brace\");\n\n\t\t\t\t_lexer.next();\n\t\t\t}\n\n\t\t\treturn n;\n\t\t}\n\n\t\t// Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep\n\t\t// AxisSpecifier ::= AxisName '::' | '@'?\n\t\t// NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')'\n\t\t// NameTest ::= '*' | NCName ':' '*' | QName\n\t\t// AbbreviatedStep ::= '.' | '..'\n\t\txpath_ast_node* parse_step(xpath_ast_node* set)\n\t\t{\n\t\t\tif (set && set->rettype() != xpath_type_node_set)\n\t\t\t\tthrow_error(\"Step has to be applied to node set\");\n\n\t\t\tbool axis_specified = false;\n\t\t\taxis_t axis = axis_child; // implied child axis\n\n\t\t\tif (_lexer.current() == lex_axis_attribute)\n\t\t\t{\n\t\t\t\taxis = axis_attribute;\n\t\t\t\taxis_specified = true;\n\n\t\t\t\t_lexer.next();\n\t\t\t}\n\t\t\telse if (_lexer.current() == lex_dot)\n\t\t\t{\n\t\t\t\t_lexer.next();\n\n\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_step, set, axis_self, nodetest_type_node, 0);\n\t\t\t}\n\t\t\telse if (_lexer.current() == lex_double_dot)\n\t\t\t{\n\t\t\t\t_lexer.next();\n\n\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_step, set, axis_parent, nodetest_type_node, 0);\n\t\t\t}\n\n\t\t\tnodetest_t nt_type = nodetest_none;\n\t\t\txpath_lexer_string nt_name;\n\n\t\t\tif (_lexer.current() == lex_string)\n\t\t\t{\n\t\t\t\t// node name test\n\t\t\t\tnt_name = _lexer.contents();\n\t\t\t\t_lexer.next();\n\n\t\t\t\t// was it an axis name?\n\t\t\t\tif (_lexer.current() == lex_double_colon)\n\t\t\t\t{\n\t\t\t\t\t// parse axis name\n\t\t\t\t\tif (axis_specified) throw_error(\"Two axis specifiers in one step\");\n\n\t\t\t\t\taxis = parse_axis_name(nt_name, axis_specified);\n\n\t\t\t\t\tif (!axis_specified) throw_error(\"Unknown axis\");\n\n\t\t\t\t\t// read actual node test\n\t\t\t\t\t_lexer.next();\n\n\t\t\t\t\tif (_lexer.current() == lex_multiply)\n\t\t\t\t\t{\n\t\t\t\t\t\tnt_type = nodetest_all;\n\t\t\t\t\t\tnt_name = xpath_lexer_string();\n\t\t\t\t\t\t_lexer.next();\n\t\t\t\t\t}\n\t\t\t\t\telse if (_lexer.current() == lex_string)\n\t\t\t\t\t{\n\t\t\t\t\t\tnt_name = _lexer.contents();\n\t\t\t\t\t\t_lexer.next();\n\t\t\t\t\t}\n\t\t\t\t\telse throw_error(\"Unrecognized node test\");\n\t\t\t\t}\n\n\t\t\t\tif (nt_type == nodetest_none)\n\t\t\t\t{\n\t\t\t\t\t// node type test or processing-instruction\n\t\t\t\t\tif (_lexer.current() == lex_open_brace)\n\t\t\t\t\t{\n\t\t\t\t\t\t_lexer.next();\n\n\t\t\t\t\t\tif (_lexer.current() == lex_close_brace)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_lexer.next();\n\n\t\t\t\t\t\t\tnt_type = parse_node_test_type(nt_name);\n\n\t\t\t\t\t\t\tif (nt_type == nodetest_none) throw_error(\"Unrecognized node type\");\n\n\t\t\t\t\t\t\tnt_name = xpath_lexer_string();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (nt_name == PUGIXML_TEXT(\"processing-instruction\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (_lexer.current() != lex_quoted_string)\n\t\t\t\t\t\t\t\tthrow_error(\"Only literals are allowed as arguments to processing-instruction()\");\n\n\t\t\t\t\t\t\tnt_type = nodetest_pi;\n\t\t\t\t\t\t\tnt_name = _lexer.contents();\n\t\t\t\t\t\t\t_lexer.next();\n\n\t\t\t\t\t\t\tif (_lexer.current() != lex_close_brace)\n\t\t\t\t\t\t\t\tthrow_error(\"Unmatched brace near processing-instruction()\");\n\t\t\t\t\t\t\t_lexer.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow_error(\"Unmatched brace near node type test\");\n\n\t\t\t\t\t}\n\t\t\t\t\t// QName or NCName:*\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (nt_name.end - nt_name.begin > 2 && nt_name.end[-2] == ':' && nt_name.end[-1] == '*') // NCName:*\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnt_name.end--; // erase *\n\n\t\t\t\t\t\t\tnt_type = nodetest_all_in_namespace;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse nt_type = nodetest_name;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (_lexer.current() == lex_multiply)\n\t\t\t{\n\t\t\t\tnt_type = nodetest_all;\n\t\t\t\t_lexer.next();\n\t\t\t}\n\t\t\telse throw_error(\"Unrecognized node test\");\n\n\t\t\txpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step, set, axis, nt_type, alloc_string(nt_name));\n\n\t\t\txpath_ast_node* last = 0;\n\n\t\t\twhile (_lexer.current() == lex_open_square_brace)\n\t\t\t{\n\t\t\t\t_lexer.next();\n\n\t\t\t\txpath_ast_node* expr = parse_expression();\n\n\t\t\t\txpath_ast_node* pred = new (alloc_node()) xpath_ast_node(ast_predicate, 0, expr, predicate_default);\n\n\t\t\t\tif (_lexer.current() != lex_close_square_brace)\n\t\t\t\t\tthrow_error(\"Unmatched square brace\");\n\t\t\t\t_lexer.next();\n\n\t\t\t\tif (last) last->set_next(pred);\n\t\t\t\telse n->set_right(pred);\n\n\t\t\t\tlast = pred;\n\t\t\t}\n\n\t\t\treturn n;\n\t\t}\n\n\t\t// RelativeLocationPath ::= Step | RelativeLocationPath '/' Step | RelativeLocationPath '//' Step\n\t\txpath_ast_node* parse_relative_location_path(xpath_ast_node* set)\n\t\t{\n\t\t\txpath_ast_node* n = parse_step(set);\n\n\t\t\twhile (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash)\n\t\t\t{\n\t\t\t\tlexeme_t l = _lexer.current();\n\t\t\t\t_lexer.next();\n\n\t\t\t\tif (l == lex_double_slash)\n\t\t\t\t\tn = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);\n\n\t\t\t\tn = parse_step(n);\n\t\t\t}\n\n\t\t\treturn n;\n\t\t}\n\n\t\t// LocationPath ::= RelativeLocationPath | AbsoluteLocationPath\n\t\t// AbsoluteLocationPath ::= '/' RelativeLocationPath? | '//' RelativeLocationPath\n\t\txpath_ast_node* parse_location_path()\n\t\t{\n\t\t\tif (_lexer.current() == lex_slash)\n\t\t\t{\n\t\t\t\t_lexer.next();\n\n\t\t\t\txpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set);\n\n\t\t\t\t// relative location path can start from axis_attribute, dot, double_dot, multiply and string lexemes; any other lexeme means standalone root path\n\t\t\t\tlexeme_t l = _lexer.current();\n\n\t\t\t\tif (l == lex_string || l == lex_axis_attribute || l == lex_dot || l == lex_double_dot || l == lex_multiply)\n\t\t\t\t\treturn parse_relative_location_path(n);\n\t\t\t\telse\n\t\t\t\t\treturn n;\n\t\t\t}\n\t\t\telse if (_lexer.current() == lex_double_slash)\n\t\t\t{\n\t\t\t\t_lexer.next();\n\n\t\t\t\txpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set);\n\t\t\t\tn = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);\n\n\t\t\t\treturn parse_relative_location_path(n);\n\t\t\t}\n\n\t\t\t// else clause moved outside of if because of bogus warning 'control may reach end of non-void function being inlined' in gcc 4.0.1\n\t\t\treturn parse_relative_location_path(0);\n\t\t}\n\n\t\t// PathExpr ::= LocationPath\n\t\t//\t\t\t\t| FilterExpr\n\t\t//\t\t\t\t| FilterExpr '/' RelativeLocationPath\n\t\t//\t\t\t\t| FilterExpr '//' RelativeLocationPath\n\t\t// UnionExpr ::= PathExpr | UnionExpr '|' PathExpr\n\t\t// UnaryExpr ::= UnionExpr | '-' UnaryExpr\n\t\txpath_ast_node* parse_path_or_unary_expression()\n\t\t{\n\t\t\t// Clarification.\n\t\t\t// PathExpr begins with either LocationPath or FilterExpr.\n\t\t\t// FilterExpr begins with PrimaryExpr\n\t\t\t// PrimaryExpr begins with '$' in case of it being a variable reference,\n\t\t\t// '(' in case of it being an expression, string literal, number constant or\n\t\t\t// function call.\n\n\t\t\tif (_lexer.current() == lex_var_ref || _lexer.current() == lex_open_brace ||\n\t\t\t\t_lexer.current() == lex_quoted_string || _lexer.current() == lex_number ||\n\t\t\t\t_lexer.current() == lex_string)\n\t\t\t{\n\t\t\t\tif (_lexer.current() == lex_string)\n\t\t\t\t{\n\t\t\t\t\t// This is either a function call, or not - if not, we shall proceed with location path\n\t\t\t\t\tconst char_t* state = _lexer.state();\n\n\t\t\t\t\twhile (PUGI__IS_CHARTYPE(*state, ct_space)) ++state;\n\n\t\t\t\t\tif (*state != '(') return parse_location_path();\n\n\t\t\t\t\t// This looks like a function call; however this still can be a node-test. Check it.\n\t\t\t\t\tif (parse_node_test_type(_lexer.contents()) != nodetest_none) return parse_location_path();\n\t\t\t\t}\n\n\t\t\t\txpath_ast_node* n = parse_filter_expression();\n\n\t\t\t\tif (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash)\n\t\t\t\t{\n\t\t\t\t\tlexeme_t l = _lexer.current();\n\t\t\t\t\t_lexer.next();\n\n\t\t\t\t\tif (l == lex_double_slash)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (n->rettype() != xpath_type_node_set) throw_error(\"Step has to be applied to node set\");\n\n\t\t\t\t\t\tn = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\t// select from location path\n\t\t\t\t\treturn parse_relative_location_path(n);\n\t\t\t\t}\n\n\t\t\t\treturn n;\n\t\t\t}\n\t\t\telse if (_lexer.current() == lex_minus)\n\t\t\t{\n\t\t\t\t_lexer.next();\n\n\t\t\t\t// precedence 7+ - only parses union expressions\n\t\t\t\txpath_ast_node* expr = parse_expression_rec(parse_path_or_unary_expression(), 7);\n\n\t\t\t\treturn new (alloc_node()) xpath_ast_node(ast_op_negate, xpath_type_number, expr);\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn parse_location_path();\n\t\t}\n\n\t\tstruct binary_op_t\n\t\t{\n\t\t\tast_type_t asttype;\n\t\t\txpath_value_type rettype;\n\t\t\tint precedence;\n\n\t\t\tbinary_op_t(): asttype(ast_unknown), rettype(xpath_type_none), precedence(0)\n\t\t\t{\n\t\t\t}\n\n\t\t\tbinary_op_t(ast_type_t asttype_, xpath_value_type rettype_, int precedence_): asttype(asttype_), rettype(rettype_), precedence(precedence_)\n\t\t\t{\n\t\t\t}\n\n\t\t\tstatic binary_op_t parse(xpath_lexer& lexer)\n\t\t\t{\n\t\t\t\tswitch (lexer.current())\n\t\t\t\t{\n\t\t\t\tcase lex_string:\n\t\t\t\t\tif (lexer.contents() == PUGIXML_TEXT(\"or\"))\n\t\t\t\t\t\treturn binary_op_t(ast_op_or, xpath_type_boolean, 1);\n\t\t\t\t\telse if (lexer.contents() == PUGIXML_TEXT(\"and\"))\n\t\t\t\t\t\treturn binary_op_t(ast_op_and, xpath_type_boolean, 2);\n\t\t\t\t\telse if (lexer.contents() == PUGIXML_TEXT(\"div\"))\n\t\t\t\t\t\treturn binary_op_t(ast_op_divide, xpath_type_number, 6);\n\t\t\t\t\telse if (lexer.contents() == PUGIXML_TEXT(\"mod\"))\n\t\t\t\t\t\treturn binary_op_t(ast_op_mod, xpath_type_number, 6);\n\t\t\t\t\telse\n\t\t\t\t\t\treturn binary_op_t();\n\n\t\t\t\tcase lex_equal:\n\t\t\t\t\treturn binary_op_t(ast_op_equal, xpath_type_boolean, 3);\n\n\t\t\t\tcase lex_not_equal:\n\t\t\t\t\treturn binary_op_t(ast_op_not_equal, xpath_type_boolean, 3);\n\n\t\t\t\tcase lex_less:\n\t\t\t\t\treturn binary_op_t(ast_op_less, xpath_type_boolean, 4);\n\n\t\t\t\tcase lex_greater:\n\t\t\t\t\treturn binary_op_t(ast_op_greater, xpath_type_boolean, 4);\n\n\t\t\t\tcase lex_less_or_equal:\n\t\t\t\t\treturn binary_op_t(ast_op_less_or_equal, xpath_type_boolean, 4);\n\n\t\t\t\tcase lex_greater_or_equal:\n\t\t\t\t\treturn binary_op_t(ast_op_greater_or_equal, xpath_type_boolean, 4);\n\n\t\t\t\tcase lex_plus:\n\t\t\t\t\treturn binary_op_t(ast_op_add, xpath_type_number, 5);\n\n\t\t\t\tcase lex_minus:\n\t\t\t\t\treturn binary_op_t(ast_op_subtract, xpath_type_number, 5);\n\n\t\t\t\tcase lex_multiply:\n\t\t\t\t\treturn binary_op_t(ast_op_multiply, xpath_type_number, 6);\n\n\t\t\t\tcase lex_union:\n\t\t\t\t\treturn binary_op_t(ast_op_union, xpath_type_node_set, 7);\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn binary_op_t();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txpath_ast_node* parse_expression_rec(xpath_ast_node* lhs, int limit)\n\t\t{\n\t\t\tbinary_op_t op = binary_op_t::parse(_lexer);\n\n\t\t\twhile (op.asttype != ast_unknown && op.precedence >= limit)\n\t\t\t{\n\t\t\t\t_lexer.next();\n\n\t\t\t\txpath_ast_node* rhs = parse_path_or_unary_expression();\n\n\t\t\t\tbinary_op_t nextop = binary_op_t::parse(_lexer);\n\n\t\t\t\twhile (nextop.asttype != ast_unknown && nextop.precedence > op.precedence)\n\t\t\t\t{\n\t\t\t\t\trhs = parse_expression_rec(rhs, nextop.precedence);\n\n\t\t\t\t\tnextop = binary_op_t::parse(_lexer);\n\t\t\t\t}\n\n\t\t\t\tif (op.asttype == ast_op_union && (lhs->rettype() != xpath_type_node_set || rhs->rettype() != xpath_type_node_set))\n\t\t\t\t\tthrow_error(\"Union operator has to be applied to node sets\");\n\n\t\t\t\tlhs = new (alloc_node()) xpath_ast_node(op.asttype, op.rettype, lhs, rhs);\n\n\t\t\t\top = binary_op_t::parse(_lexer);\n\t\t\t}\n\n\t\t\treturn lhs;\n\t\t}\n\n\t\t// Expr ::= OrExpr\n\t\t// OrExpr ::= AndExpr | OrExpr 'or' AndExpr\n\t\t// AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr\n\t\t// EqualityExpr ::= RelationalExpr\n\t\t//\t\t\t\t\t| EqualityExpr '=' RelationalExpr\n\t\t//\t\t\t\t\t| EqualityExpr '!=' RelationalExpr\n\t\t// RelationalExpr ::= AdditiveExpr\n\t\t//\t\t\t\t\t  | RelationalExpr '<' AdditiveExpr\n\t\t//\t\t\t\t\t  | RelationalExpr '>' AdditiveExpr\n\t\t//\t\t\t\t\t  | RelationalExpr '<=' AdditiveExpr\n\t\t//\t\t\t\t\t  | RelationalExpr '>=' AdditiveExpr\n\t\t// AdditiveExpr ::= MultiplicativeExpr\n\t\t//\t\t\t\t\t| AdditiveExpr '+' MultiplicativeExpr\n\t\t//\t\t\t\t\t| AdditiveExpr '-' MultiplicativeExpr\n\t\t// MultiplicativeExpr ::= UnaryExpr\n\t\t//\t\t\t\t\t\t  | MultiplicativeExpr '*' UnaryExpr\n\t\t//\t\t\t\t\t\t  | MultiplicativeExpr 'div' UnaryExpr\n\t\t//\t\t\t\t\t\t  | MultiplicativeExpr 'mod' UnaryExpr\n\t\txpath_ast_node* parse_expression()\n\t\t{\n\t\t\treturn parse_expression_rec(parse_path_or_unary_expression(), 0);\n\t\t}\n\n\t\txpath_parser(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result): _alloc(alloc), _lexer(query), _query(query), _variables(variables), _result(result)\n\t\t{\n\t\t}\n\n\t\txpath_ast_node* parse()\n\t\t{\n\t\t\txpath_ast_node* result = parse_expression();\n\n\t\t\tif (_lexer.current() != lex_eof)\n\t\t\t{\n\t\t\t\t// there are still unparsed tokens left, error\n\t\t\t\tthrow_error(\"Incorrect query\");\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tstatic xpath_ast_node* parse(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result)\n\t\t{\n\t\t\txpath_parser parser(query, variables, alloc, result);\n\n\t\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\t\tint error = setjmp(parser._error_handler);\n\n\t\t\treturn (error == 0) ? parser.parse() : 0;\n\t\t#else\n\t\t\treturn parser.parse();\n\t\t#endif\n\t\t}\n\t};\n\n\tstruct xpath_query_impl\n\t{\n\t\tstatic xpath_query_impl* create()\n\t\t{\n\t\t\tvoid* memory = xml_memory::allocate(sizeof(xpath_query_impl));\n\t\t\tif (!memory) return 0;\n\n\t\t\treturn new (memory) xpath_query_impl();\n\t\t}\n\n\t\tstatic void destroy(xpath_query_impl* impl)\n\t\t{\n\t\t\t// free all allocated pages\n\t\t\timpl->alloc.release();\n\n\t\t\t// free allocator memory (with the first page)\n\t\t\txml_memory::deallocate(impl);\n\t\t}\n\n\t\txpath_query_impl(): root(0), alloc(&block)\n\t\t{\n\t\t\tblock.next = 0;\n\t\t\tblock.capacity = sizeof(block.data);\n\t\t}\n\n\t\txpath_ast_node* root;\n\t\txpath_allocator alloc;\n\t\txpath_memory_block block;\n\t};\n\n\tPUGI__FN xpath_string evaluate_string_impl(xpath_query_impl* impl, const xpath_node& n, xpath_stack_data& sd)\n\t{\n\t\tif (!impl) return xpath_string();\n\n\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\tif (setjmp(sd.error_handler)) return xpath_string();\n\t#endif\n\n\t\txpath_context c(n, 1, 1);\n\n\t\treturn impl->root->eval_string(c, sd.stack);\n\t}\n\n\tPUGI__FN impl::xpath_ast_node* evaluate_node_set_prepare(xpath_query_impl* impl)\n\t{\n\t\tif (!impl) return 0;\n\n\t\tif (impl->root->rettype() != xpath_type_node_set)\n\t\t{\n\t\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\t\treturn 0;\n\t\t#else\n\t\t\txpath_parse_result res;\n\t\t\tres.error = \"Expression does not evaluate to node set\";\n\n\t\t\tthrow xpath_exception(res);\n\t\t#endif\n\t\t}\n\n\t\treturn impl->root;\n\t}\nPUGI__NS_END\n\nnamespace pugi\n{\n#ifndef PUGIXML_NO_EXCEPTIONS\n\tPUGI__FN xpath_exception::xpath_exception(const xpath_parse_result& result_): _result(result_)\n\t{\n\t\tassert(_result.error);\n\t}\n\n\tPUGI__FN const char* xpath_exception::what() const throw()\n\t{\n\t\treturn _result.error;\n\t}\n\n\tPUGI__FN const xpath_parse_result& xpath_exception::result() const\n\t{\n\t\treturn _result;\n\t}\n#endif\n\n\tPUGI__FN xpath_node::xpath_node()\n\t{\n\t}\n\n\tPUGI__FN xpath_node::xpath_node(const xml_node& node_): _node(node_)\n\t{\n\t}\n\n\tPUGI__FN xpath_node::xpath_node(const xml_attribute& attribute_, const xml_node& parent_): _node(attribute_ ? parent_ : xml_node()), _attribute(attribute_)\n\t{\n\t}\n\n\tPUGI__FN xml_node xpath_node::node() const\n\t{\n\t\treturn _attribute ? xml_node() : _node;\n\t}\n\n\tPUGI__FN xml_attribute xpath_node::attribute() const\n\t{\n\t\treturn _attribute;\n\t}\n\n\tPUGI__FN xml_node xpath_node::parent() const\n\t{\n\t\treturn _attribute ? _node : _node.parent();\n\t}\n\n\tPUGI__FN static void unspecified_bool_xpath_node(xpath_node***)\n\t{\n\t}\n\n\tPUGI__FN xpath_node::operator xpath_node::unspecified_bool_type() const\n\t{\n\t\treturn (_node || _attribute) ? unspecified_bool_xpath_node : 0;\n\t}\n\n\tPUGI__FN bool xpath_node::operator!() const\n\t{\n\t\treturn !(_node || _attribute);\n\t}\n\n\tPUGI__FN bool xpath_node::operator==(const xpath_node& n) const\n\t{\n\t\treturn _node == n._node && _attribute == n._attribute;\n\t}\n\n\tPUGI__FN bool xpath_node::operator!=(const xpath_node& n) const\n\t{\n\t\treturn _node != n._node || _attribute != n._attribute;\n\t}\n\n#ifdef __BORLANDC__\n\tPUGI__FN bool operator&&(const xpath_node& lhs, bool rhs)\n\t{\n\t\treturn (bool)lhs && rhs;\n\t}\n\n\tPUGI__FN bool operator||(const xpath_node& lhs, bool rhs)\n\t{\n\t\treturn (bool)lhs || rhs;\n\t}\n#endif\n\n\tPUGI__FN void xpath_node_set::_assign(const_iterator begin_, const_iterator end_, type_t type_)\n\t{\n\t\tassert(begin_ <= end_);\n\n\t\tsize_t size_ = static_cast<size_t>(end_ - begin_);\n\n\t\tif (size_ <= 1)\n\t\t{\n\t\t\t// deallocate old buffer\n\t\t\tif (_begin != &_storage) impl::xml_memory::deallocate(_begin);\n\n\t\t\t// use internal buffer\n\t\t\tif (begin_ != end_) _storage = *begin_;\n\n\t\t\t_begin = &_storage;\n\t\t\t_end = &_storage + size_;\n\t\t\t_type = type_;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// make heap copy\n\t\t\txpath_node* storage = static_cast<xpath_node*>(impl::xml_memory::allocate(size_ * sizeof(xpath_node)));\n\n\t\t\tif (!storage)\n\t\t\t{\n\t\t\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\t\t\treturn;\n\t\t\t#else\n\t\t\t\tthrow std::bad_alloc();\n\t\t\t#endif\n\t\t\t}\n\n\t\t\tmemcpy(storage, begin_, size_ * sizeof(xpath_node));\n\n\t\t\t// deallocate old buffer\n\t\t\tif (_begin != &_storage) impl::xml_memory::deallocate(_begin);\n\n\t\t\t// finalize\n\t\t\t_begin = storage;\n\t\t\t_end = storage + size_;\n\t\t\t_type = type_;\n\t\t}\n\t}\n\n#if __cplusplus >= 201103\n\tPUGI__FN void xpath_node_set::_move(xpath_node_set& rhs)\n\t{\n\t\t_type = rhs._type;\n\t\t_storage = rhs._storage;\n\t\t_begin = (rhs._begin == &rhs._storage) ? &_storage : rhs._begin;\n\t\t_end = _begin + (rhs._end - rhs._begin);\n\n\t\trhs._type = type_unsorted;\n\t\trhs._begin = &rhs._storage;\n\t\trhs._end = rhs._begin;\n\t}\n#endif\n\n\tPUGI__FN xpath_node_set::xpath_node_set(): _type(type_unsorted), _begin(&_storage), _end(&_storage)\n\t{\n\t}\n\n\tPUGI__FN xpath_node_set::xpath_node_set(const_iterator begin_, const_iterator end_, type_t type_): _type(type_unsorted), _begin(&_storage), _end(&_storage)\n\t{\n\t\t_assign(begin_, end_, type_);\n\t}\n\n\tPUGI__FN xpath_node_set::~xpath_node_set()\n\t{\n\t\tif (_begin != &_storage)\n\t\t\timpl::xml_memory::deallocate(_begin);\n\t}\n\n\tPUGI__FN xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(type_unsorted), _begin(&_storage), _end(&_storage)\n\t{\n\t\t_assign(ns._begin, ns._end, ns._type);\n\t}\n\n\tPUGI__FN xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns)\n\t{\n\t\tif (this == &ns) return *this;\n\n\t\t_assign(ns._begin, ns._end, ns._type);\n\n\t\treturn *this;\n\t}\n\n#if __cplusplus >= 201103\n\tPUGI__FN xpath_node_set::xpath_node_set(xpath_node_set&& rhs): _type(type_unsorted), _begin(&_storage), _end(&_storage)\n\t{\n\t\t_move(rhs);\n\t}\n\n\tPUGI__FN xpath_node_set& xpath_node_set::operator=(xpath_node_set&& rhs)\n\t{\n\t\tif (this == &rhs) return *this;\n\n\t\tif (_begin != &_storage)\n\t\t\timpl::xml_memory::deallocate(_begin);\n\n\t\t_move(rhs);\n\n\t\treturn *this;\n\t}\n#endif\n\n\tPUGI__FN xpath_node_set::type_t xpath_node_set::type() const\n\t{\n\t\treturn _type;\n\t}\n\n\tPUGI__FN size_t xpath_node_set::size() const\n\t{\n\t\treturn _end - _begin;\n\t}\n\n\tPUGI__FN bool xpath_node_set::empty() const\n\t{\n\t\treturn _begin == _end;\n\t}\n\n\tPUGI__FN const xpath_node& xpath_node_set::operator[](size_t index) const\n\t{\n\t\tassert(index < size());\n\t\treturn _begin[index];\n\t}\n\n\tPUGI__FN xpath_node_set::const_iterator xpath_node_set::begin() const\n\t{\n\t\treturn _begin;\n\t}\n\n\tPUGI__FN xpath_node_set::const_iterator xpath_node_set::end() const\n\t{\n\t\treturn _end;\n\t}\n\n\tPUGI__FN void xpath_node_set::sort(bool reverse)\n\t{\n\t\t_type = impl::xpath_sort(_begin, _end, _type, reverse);\n\t}\n\n\tPUGI__FN xpath_node xpath_node_set::first() const\n\t{\n\t\treturn impl::xpath_first(_begin, _end, _type);\n\t}\n\n\tPUGI__FN xpath_parse_result::xpath_parse_result(): error(\"Internal error\"), offset(0)\n\t{\n\t}\n\n\tPUGI__FN xpath_parse_result::operator bool() const\n\t{\n\t\treturn error == 0;\n\t}\n\n\tPUGI__FN const char* xpath_parse_result::description() const\n\t{\n\t\treturn error ? error : \"No error\";\n\t}\n\n\tPUGI__FN xpath_variable::xpath_variable(xpath_value_type type_): _type(type_), _next(0)\n\t{\n\t}\n\n\tPUGI__FN const char_t* xpath_variable::name() const\n\t{\n\t\tswitch (_type)\n\t\t{\n\t\tcase xpath_type_node_set:\n\t\t\treturn static_cast<const impl::xpath_variable_node_set*>(this)->name;\n\n\t\tcase xpath_type_number:\n\t\t\treturn static_cast<const impl::xpath_variable_number*>(this)->name;\n\n\t\tcase xpath_type_string:\n\t\t\treturn static_cast<const impl::xpath_variable_string*>(this)->name;\n\n\t\tcase xpath_type_boolean:\n\t\t\treturn static_cast<const impl::xpath_variable_boolean*>(this)->name;\n\n\t\tdefault:\n\t\t\tassert(!\"Invalid variable type\");\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tPUGI__FN xpath_value_type xpath_variable::type() const\n\t{\n\t\treturn _type;\n\t}\n\n\tPUGI__FN bool xpath_variable::get_boolean() const\n\t{\n\t\treturn (_type == xpath_type_boolean) ? static_cast<const impl::xpath_variable_boolean*>(this)->value : false;\n\t}\n\n\tPUGI__FN double xpath_variable::get_number() const\n\t{\n\t\treturn (_type == xpath_type_number) ? static_cast<const impl::xpath_variable_number*>(this)->value : impl::gen_nan();\n\t}\n\n\tPUGI__FN const char_t* xpath_variable::get_string() const\n\t{\n\t\tconst char_t* value = (_type == xpath_type_string) ? static_cast<const impl::xpath_variable_string*>(this)->value : 0;\n\t\treturn value ? value : PUGIXML_TEXT(\"\");\n\t}\n\n\tPUGI__FN const xpath_node_set& xpath_variable::get_node_set() const\n\t{\n\t\treturn (_type == xpath_type_node_set) ? static_cast<const impl::xpath_variable_node_set*>(this)->value : impl::dummy_node_set;\n\t}\n\n\tPUGI__FN bool xpath_variable::set(bool value)\n\t{\n\t\tif (_type != xpath_type_boolean) return false;\n\n\t\tstatic_cast<impl::xpath_variable_boolean*>(this)->value = value;\n\t\treturn true;\n\t}\n\n\tPUGI__FN bool xpath_variable::set(double value)\n\t{\n\t\tif (_type != xpath_type_number) return false;\n\n\t\tstatic_cast<impl::xpath_variable_number*>(this)->value = value;\n\t\treturn true;\n\t}\n\n\tPUGI__FN bool xpath_variable::set(const char_t* value)\n\t{\n\t\tif (_type != xpath_type_string) return false;\n\n\t\timpl::xpath_variable_string* var = static_cast<impl::xpath_variable_string*>(this);\n\n\t\t// duplicate string\n\t\tsize_t size = (impl::strlength(value) + 1) * sizeof(char_t);\n\n\t\tchar_t* copy = static_cast<char_t*>(impl::xml_memory::allocate(size));\n\t\tif (!copy) return false;\n\n\t\tmemcpy(copy, value, size);\n\n\t\t// replace old string\n\t\tif (var->value) impl::xml_memory::deallocate(var->value);\n\t\tvar->value = copy;\n\n\t\treturn true;\n\t}\n\n\tPUGI__FN bool xpath_variable::set(const xpath_node_set& value)\n\t{\n\t\tif (_type != xpath_type_node_set) return false;\n\n\t\tstatic_cast<impl::xpath_variable_node_set*>(this)->value = value;\n\t\treturn true;\n\t}\n\n\tPUGI__FN xpath_variable_set::xpath_variable_set()\n\t{\n\t\tfor (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)\n\t\t\t_data[i] = 0;\n\t}\n\n\tPUGI__FN xpath_variable_set::~xpath_variable_set()\n\t{\n\t\tfor (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)\n\t\t\t_destroy(_data[i]);\n\t}\n\n\tPUGI__FN xpath_variable_set::xpath_variable_set(const xpath_variable_set& rhs)\n\t{\n\t\tfor (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)\n\t\t\t_data[i] = 0;\n\n\t\t_assign(rhs);\n\t}\n\n\tPUGI__FN xpath_variable_set& xpath_variable_set::operator=(const xpath_variable_set& rhs)\n\t{\n\t\tif (this == &rhs) return *this;\n\n\t\t_assign(rhs);\n\n\t\treturn *this;\n\t}\n\n#if __cplusplus >= 201103\n\tPUGI__FN xpath_variable_set::xpath_variable_set(xpath_variable_set&& rhs)\n\t{\n\t\tfor (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)\n\t\t{\n\t\t\t_data[i] = rhs._data[i];\n\t\t\trhs._data[i] = 0;\n\t\t}\n\t}\n\n\tPUGI__FN xpath_variable_set& xpath_variable_set::operator=(xpath_variable_set&& rhs)\n\t{\n\t\tfor (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)\n\t\t{\n\t\t\t_destroy(_data[i]);\n\n\t\t\t_data[i] = rhs._data[i];\n\t\t\trhs._data[i] = 0;\n\t\t}\n\n\t\treturn *this;\n\t}\n#endif\n\n\tPUGI__FN void xpath_variable_set::_assign(const xpath_variable_set& rhs)\n\t{\n\t\txpath_variable_set temp;\n\n\t\tfor (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)\n\t\t\tif (rhs._data[i] && !_clone(rhs._data[i], &temp._data[i]))\n\t\t\t\treturn;\n\n\t\t_swap(temp);\n\t}\n\n\tPUGI__FN void xpath_variable_set::_swap(xpath_variable_set& rhs)\n\t{\n\t\tfor (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)\n\t\t{\n\t\t\txpath_variable* chain = _data[i];\n\n\t\t\t_data[i] = rhs._data[i];\n\t\t\trhs._data[i] = chain;\n\t\t}\n\t}\n\n\tPUGI__FN xpath_variable* xpath_variable_set::_find(const char_t* name) const\n\t{\n\t\tconst size_t hash_size = sizeof(_data) / sizeof(_data[0]);\n\t\tsize_t hash = impl::hash_string(name) % hash_size;\n\n\t\t// look for existing variable\n\t\tfor (xpath_variable* var = _data[hash]; var; var = var->_next)\n\t\t\tif (impl::strequal(var->name(), name))\n\t\t\t\treturn var;\n\n\t\treturn 0;\n\t}\n\n\tPUGI__FN bool xpath_variable_set::_clone(xpath_variable* var, xpath_variable** out_result)\n\t{\n\t\txpath_variable* last = 0;\n\n\t\twhile (var)\n\t\t{\n\t\t\t// allocate storage for new variable\n\t\t\txpath_variable* nvar = impl::new_xpath_variable(var->_type, var->name());\n\t\t\tif (!nvar) return false;\n\n\t\t\t// link the variable to the result immediately to handle failures gracefully\n\t\t\tif (last)\n\t\t\t\tlast->_next = nvar;\n\t\t\telse\n\t\t\t\t*out_result = nvar;\n\n\t\t\tlast = nvar;\n\n\t\t\t// copy the value; this can fail due to out-of-memory conditions\n\t\t\tif (!impl::copy_xpath_variable(nvar, var)) return false;\n\n\t\t\tvar = var->_next;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tPUGI__FN void xpath_variable_set::_destroy(xpath_variable* var)\n\t{\n\t\twhile (var)\n\t\t{\n\t\t\txpath_variable* next = var->_next;\n\n\t\t\timpl::delete_xpath_variable(var->_type, var);\n\n\t\t\tvar = next;\n\t\t}\n\t}\n\n\tPUGI__FN xpath_variable* xpath_variable_set::add(const char_t* name, xpath_value_type type)\n\t{\n\t\tconst size_t hash_size = sizeof(_data) / sizeof(_data[0]);\n\t\tsize_t hash = impl::hash_string(name) % hash_size;\n\n\t\t// look for existing variable\n\t\tfor (xpath_variable* var = _data[hash]; var; var = var->_next)\n\t\t\tif (impl::strequal(var->name(), name))\n\t\t\t\treturn var->type() == type ? var : 0;\n\n\t\t// add new variable\n\t\txpath_variable* result = impl::new_xpath_variable(type, name);\n\n\t\tif (result)\n\t\t{\n\t\t\tresult->_next = _data[hash];\n\n\t\t\t_data[hash] = result;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tPUGI__FN bool xpath_variable_set::set(const char_t* name, bool value)\n\t{\n\t\txpath_variable* var = add(name, xpath_type_boolean);\n\t\treturn var ? var->set(value) : false;\n\t}\n\n\tPUGI__FN bool xpath_variable_set::set(const char_t* name, double value)\n\t{\n\t\txpath_variable* var = add(name, xpath_type_number);\n\t\treturn var ? var->set(value) : false;\n\t}\n\n\tPUGI__FN bool xpath_variable_set::set(const char_t* name, const char_t* value)\n\t{\n\t\txpath_variable* var = add(name, xpath_type_string);\n\t\treturn var ? var->set(value) : false;\n\t}\n\n\tPUGI__FN bool xpath_variable_set::set(const char_t* name, const xpath_node_set& value)\n\t{\n\t\txpath_variable* var = add(name, xpath_type_node_set);\n\t\treturn var ? var->set(value) : false;\n\t}\n\n\tPUGI__FN xpath_variable* xpath_variable_set::get(const char_t* name)\n\t{\n\t\treturn _find(name);\n\t}\n\n\tPUGI__FN const xpath_variable* xpath_variable_set::get(const char_t* name) const\n\t{\n\t\treturn _find(name);\n\t}\n\n\tPUGI__FN xpath_query::xpath_query(const char_t* query, xpath_variable_set* variables): _impl(0)\n\t{\n\t\timpl::xpath_query_impl* qimpl = impl::xpath_query_impl::create();\n\n\t\tif (!qimpl)\n\t\t{\n\t\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\t\t_result.error = \"Out of memory\";\n\t\t#else\n\t\t\tthrow std::bad_alloc();\n\t\t#endif\n\t\t}\n\t\telse\n\t\t{\n\t\t\tusing impl::auto_deleter; // MSVC7 workaround\n\t\t\tauto_deleter<impl::xpath_query_impl> impl(qimpl, impl::xpath_query_impl::destroy);\n\n\t\t\tqimpl->root = impl::xpath_parser::parse(query, variables, &qimpl->alloc, &_result);\n\n\t\t\tif (qimpl->root)\n\t\t\t{\n\t\t\t\tqimpl->root->optimize(&qimpl->alloc);\n\n\t\t\t\t_impl = impl.release();\n\t\t\t\t_result.error = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tPUGI__FN xpath_query::xpath_query(): _impl(0)\n\t{\n\t}\n\n\tPUGI__FN xpath_query::~xpath_query()\n\t{\n\t\tif (_impl)\n\t\t\timpl::xpath_query_impl::destroy(static_cast<impl::xpath_query_impl*>(_impl));\n\t}\n\n#if __cplusplus >= 201103\n\tPUGI__FN xpath_query::xpath_query(xpath_query&& rhs)\n\t{\n\t\t_impl = rhs._impl;\n\t\trhs._impl = 0;\n\t}\n\n\tPUGI__FN xpath_query& xpath_query::operator=(xpath_query&& rhs)\n\t{\n\t\tif (this == &rhs) return *this;\n\n\t\tif (_impl)\n\t\t\timpl::xpath_query_impl::destroy(static_cast<impl::xpath_query_impl*>(_impl));\n\n\t\t_impl = rhs._impl;\n\t\trhs._impl = 0;\n\n\t\treturn *this;\n\t}\n#endif\n\n\tPUGI__FN xpath_value_type xpath_query::return_type() const\n\t{\n\t\tif (!_impl) return xpath_type_none;\n\n\t\treturn static_cast<impl::xpath_query_impl*>(_impl)->root->rettype();\n\t}\n\n\tPUGI__FN bool xpath_query::evaluate_boolean(const xpath_node& n) const\n\t{\n\t\tif (!_impl) return false;\n\n\t\timpl::xpath_context c(n, 1, 1);\n\t\timpl::xpath_stack_data sd;\n\n\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\tif (setjmp(sd.error_handler)) return false;\n\t#endif\n\n\t\treturn static_cast<impl::xpath_query_impl*>(_impl)->root->eval_boolean(c, sd.stack);\n\t}\n\n\tPUGI__FN double xpath_query::evaluate_number(const xpath_node& n) const\n\t{\n\t\tif (!_impl) return impl::gen_nan();\n\n\t\timpl::xpath_context c(n, 1, 1);\n\t\timpl::xpath_stack_data sd;\n\n\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\tif (setjmp(sd.error_handler)) return impl::gen_nan();\n\t#endif\n\n\t\treturn static_cast<impl::xpath_query_impl*>(_impl)->root->eval_number(c, sd.stack);\n\t}\n\n#ifndef PUGIXML_NO_STL\n\tPUGI__FN string_t xpath_query::evaluate_string(const xpath_node& n) const\n\t{\n\t\timpl::xpath_stack_data sd;\n\n\t\timpl::xpath_string r = impl::evaluate_string_impl(static_cast<impl::xpath_query_impl*>(_impl), n, sd);\n\n\t\treturn string_t(r.c_str(), r.length());\n\t}\n#endif\n\n\tPUGI__FN size_t xpath_query::evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const\n\t{\n\t\timpl::xpath_stack_data sd;\n\n\t\timpl::xpath_string r = impl::evaluate_string_impl(static_cast<impl::xpath_query_impl*>(_impl), n, sd);\n\n\t\tsize_t full_size = r.length() + 1;\n\n\t\tif (capacity > 0)\n\t\t{\n\t\t\tsize_t size = (full_size < capacity) ? full_size : capacity;\n\t\t\tassert(size > 0);\n\n\t\t\tmemcpy(buffer, r.c_str(), (size - 1) * sizeof(char_t));\n\t\t\tbuffer[size - 1] = 0;\n\t\t}\n\n\t\treturn full_size;\n\t}\n\n\tPUGI__FN xpath_node_set xpath_query::evaluate_node_set(const xpath_node& n) const\n\t{\n\t\timpl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast<impl::xpath_query_impl*>(_impl));\n\t\tif (!root) return xpath_node_set();\n\n\t\timpl::xpath_context c(n, 1, 1);\n\t\timpl::xpath_stack_data sd;\n\n\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\tif (setjmp(sd.error_handler)) return xpath_node_set();\n\t#endif\n\n\t\timpl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_all);\n\n\t\treturn xpath_node_set(r.begin(), r.end(), r.type());\n\t}\n\n\tPUGI__FN xpath_node xpath_query::evaluate_node(const xpath_node& n) const\n\t{\n\t\timpl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast<impl::xpath_query_impl*>(_impl));\n\t\tif (!root) return xpath_node();\n\n\t\timpl::xpath_context c(n, 1, 1);\n\t\timpl::xpath_stack_data sd;\n\n\t#ifdef PUGIXML_NO_EXCEPTIONS\n\t\tif (setjmp(sd.error_handler)) return xpath_node();\n\t#endif\n\n\t\timpl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_first);\n\n\t\treturn r.first();\n\t}\n\n\tPUGI__FN const xpath_parse_result& xpath_query::result() const\n\t{\n\t\treturn _result;\n\t}\n\n\tPUGI__FN static void unspecified_bool_xpath_query(xpath_query***)\n\t{\n\t}\n\n\tPUGI__FN xpath_query::operator xpath_query::unspecified_bool_type() const\n\t{\n\t\treturn _impl ? unspecified_bool_xpath_query : 0;\n\t}\n\n\tPUGI__FN bool xpath_query::operator!() const\n\t{\n\t\treturn !_impl;\n\t}\n\n\tPUGI__FN xpath_node xml_node::select_node(const char_t* query, xpath_variable_set* variables) const\n\t{\n\t\txpath_query q(query, variables);\n\t\treturn select_node(q);\n\t}\n\n\tPUGI__FN xpath_node xml_node::select_node(const xpath_query& query) const\n\t{\n\t\treturn query.evaluate_node(*this);\n\t}\n\n\tPUGI__FN xpath_node_set xml_node::select_nodes(const char_t* query, xpath_variable_set* variables) const\n\t{\n\t\txpath_query q(query, variables);\n\t\treturn select_nodes(q);\n\t}\n\n\tPUGI__FN xpath_node_set xml_node::select_nodes(const xpath_query& query) const\n\t{\n\t\treturn query.evaluate_node_set(*this);\n\t}\n\n\tPUGI__FN xpath_node xml_node::select_single_node(const char_t* query, xpath_variable_set* variables) const\n\t{\n\t\txpath_query q(query, variables);\n\t\treturn select_single_node(q);\n\t}\n\n\tPUGI__FN xpath_node xml_node::select_single_node(const xpath_query& query) const\n\t{\n\t\treturn query.evaluate_node(*this);\n\t}\n}\n\n#endif\n\n#ifdef __BORLANDC__\n#\tpragma option pop\n#endif\n\n// Intel C++ does not properly keep warning state for function templates,\n// so popping warning state at the end of translation unit leads to warnings in the middle.\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n#\tpragma warning(pop)\n#endif\n\n// Undefine all local macros (makes sure we're not leaking macros in header-only mode)\n#undef PUGI__NO_INLINE\n#undef PUGI__UNLIKELY\n#undef PUGI__STATIC_ASSERT\n#undef PUGI__DMC_VOLATILE\n#undef PUGI__MSVC_CRT_VERSION\n#undef PUGI__NS_BEGIN\n#undef PUGI__NS_END\n#undef PUGI__FN\n#undef PUGI__FN_NO_INLINE\n#undef PUGI__GETPAGE_IMPL\n#undef PUGI__GETPAGE\n#undef PUGI__NODETYPE\n#undef PUGI__IS_CHARTYPE_IMPL\n#undef PUGI__IS_CHARTYPE\n#undef PUGI__IS_CHARTYPEX\n#undef PUGI__ENDSWITH\n#undef PUGI__SKIPWS\n#undef PUGI__OPTSET\n#undef PUGI__PUSHNODE\n#undef PUGI__POPNODE\n#undef PUGI__SCANFOR\n#undef PUGI__SCANWHILE\n#undef PUGI__SCANWHILE_UNROLL\n#undef PUGI__ENDSEG\n#undef PUGI__THROW_ERROR\n#undef PUGI__CHECK_ERROR\n\n#endif\n\n/**\n * Copyright (c) 2006-2015 Arseny Kapoulkine\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/detail/pugixml.hpp",
    "content": "/**\n * pugixml parser - version 1.7\n * --------------------------------------------------------\n * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\n * Report bugs and download new versions at http://pugixml.org/\n *\n * This library is distributed under the MIT License. See notice at the end\n * of this file.\n *\n * This work is based on the pugxml parser, which is:\n * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)\n */\n\n#ifndef PUGIXML_VERSION\n// Define version macro; evaluates to major * 100 + minor so that it's safe to use in less-than comparisons\n#\tdefine PUGIXML_VERSION 170\n#endif\n\n// Include user configuration file (this can define various configuration macros)\n#include \"pugiconfig.hpp\"\n\n#ifndef HEADER_PUGIXML_HPP\n#define HEADER_PUGIXML_HPP\n\n// Include stddef.h for size_t and ptrdiff_t\n#include <stddef.h>\n\n// Include exception header for XPath\n#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)\n#\tinclude <exception>\n#endif\n\n// Include STL headers\n#ifndef PUGIXML_NO_STL\n#\tinclude <iterator>\n#\tinclude <iosfwd>\n#\tinclude <string>\n#endif\n\n// Macro for deprecated features\n#ifndef PUGIXML_DEPRECATED\n#\tif defined(__GNUC__)\n#\t\tdefine PUGIXML_DEPRECATED __attribute__((deprecated))\n#\telif defined(_MSC_VER) && _MSC_VER >= 1300\n#\t\tdefine PUGIXML_DEPRECATED __declspec(deprecated)\n#\telse\n#\t\tdefine PUGIXML_DEPRECATED\n#\tendif\n#endif\n\n// If no API is defined, assume default\n#ifndef PUGIXML_API\n#\tdefine PUGIXML_API\n#endif\n\n// If no API for classes is defined, assume default\n#ifndef PUGIXML_CLASS\n#\tdefine PUGIXML_CLASS PUGIXML_API\n#endif\n\n// If no API for functions is defined, assume default\n#ifndef PUGIXML_FUNCTION\n#\tdefine PUGIXML_FUNCTION PUGIXML_API\n#endif\n\n// If the platform is known to have long long support, enable long long functions\n#ifndef PUGIXML_HAS_LONG_LONG\n#\tif __cplusplus >= 201103\n#\t\tdefine PUGIXML_HAS_LONG_LONG\n#\telif defined(_MSC_VER) && _MSC_VER >= 1400\n#\t\tdefine PUGIXML_HAS_LONG_LONG\n#\tendif\n#endif\n\n// Character interface macros\n#ifdef PUGIXML_WCHAR_MODE\n#\tdefine PUGIXML_TEXT(t) L ## t\n#\tdefine PUGIXML_CHAR wchar_t\n#else\n#\tdefine PUGIXML_TEXT(t) t\n#\tdefine PUGIXML_CHAR char\n#endif\n\nnamespace pugi\n{\n\t// Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE\n\ttypedef PUGIXML_CHAR char_t;\n\n#ifndef PUGIXML_NO_STL\n\t// String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE\n\ttypedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>, std::allocator<PUGIXML_CHAR> > string_t;\n#endif\n}\n\n// The PugiXML namespace\nnamespace pugi\n{\n\t// Tree node types\n\tenum xml_node_type\n\t{\n\t\tnode_null,\t\t\t// Empty (null) node handle\n\t\tnode_document,\t\t// A document tree's absolute root\n\t\tnode_element,\t\t// Element tag, i.e. '<node/>'\n\t\tnode_pcdata,\t\t// Plain character data, i.e. 'text'\n\t\tnode_cdata,\t\t\t// Character data, i.e. '<![CDATA[text]]>'\n\t\tnode_comment,\t\t// Comment tag, i.e. '<!-- text -->'\n\t\tnode_pi,\t\t\t// Processing instruction, i.e. '<?name?>'\n\t\tnode_declaration,\t// Document declaration, i.e. '<?xml version=\"1.0\"?>'\n\t\tnode_doctype\t\t// Document type declaration, i.e. '<!DOCTYPE doc>'\n\t};\n\n\t// Parsing options\n\n\t// Minimal parsing mode (equivalent to turning all other flags off).\n\t// Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed.\n\tconst unsigned int parse_minimal = 0x0000;\n\n\t// This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default.\n\tconst unsigned int parse_pi = 0x0001;\n\n\t// This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default.\n\tconst unsigned int parse_comments = 0x0002;\n\n\t// This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default.\n\tconst unsigned int parse_cdata = 0x0004;\n\n\t// This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree.\n\t// This flag is off by default; turning it on usually results in slower parsing and more memory consumption.\n\tconst unsigned int parse_ws_pcdata = 0x0008;\n\n\t// This flag determines if character and entity references are expanded during parsing. This flag is on by default.\n\tconst unsigned int parse_escapes = 0x0010;\n\n\t// This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default.\n\tconst unsigned int parse_eol = 0x0020;\n\t\n\t// This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default.\n\tconst unsigned int parse_wconv_attribute = 0x0040;\n\n\t// This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default.\n\tconst unsigned int parse_wnorm_attribute = 0x0080;\n\t\n\t// This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default.\n\tconst unsigned int parse_declaration = 0x0100;\n\n\t// This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default.\n\tconst unsigned int parse_doctype = 0x0200;\n\n\t// This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only\n\t// of whitespace is added to the DOM tree.\n\t// This flag is off by default; turning it on may result in slower parsing and more memory consumption.\n\tconst unsigned int parse_ws_pcdata_single = 0x0400;\n\n\t// This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default.\n\tconst unsigned int parse_trim_pcdata = 0x0800;\n\n\t// This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document\n\t// is a valid document. This flag is off by default.\n\tconst unsigned int parse_fragment = 0x1000;\n\n\t// The default parsing mode.\n\t// Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded,\n\t// End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.\n\tconst unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;\n\n\t// The full parsing mode.\n\t// Nodes of all types are added to the DOM tree, character/reference entities are expanded,\n\t// End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.\n\tconst unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype;\n\n\t// These flags determine the encoding of input data for XML document\n\tenum xml_encoding\n\t{\n\t\tencoding_auto,\t\t// Auto-detect input encoding using BOM or < / <? detection; use UTF8 if BOM is not found\n\t\tencoding_utf8,\t\t// UTF8 encoding\n\t\tencoding_utf16_le,\t// Little-endian UTF16\n\t\tencoding_utf16_be,\t// Big-endian UTF16\n\t\tencoding_utf16,\t\t// UTF16 with native endianness\n\t\tencoding_utf32_le,\t// Little-endian UTF32\n\t\tencoding_utf32_be,\t// Big-endian UTF32\n\t\tencoding_utf32,\t\t// UTF32 with native endianness\n\t\tencoding_wchar,\t\t// The same encoding wchar_t has (either UTF16 or UTF32)\n\t\tencoding_latin1\n\t};\n\n\t// Formatting flags\n\t\n\t// Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree. This flag is on by default.\n\tconst unsigned int format_indent = 0x01;\n\t\n\t// Write encoding-specific BOM to the output stream. This flag is off by default.\n\tconst unsigned int format_write_bom = 0x02;\n\n\t// Use raw output mode (no indentation and no line breaks are written). This flag is off by default.\n\tconst unsigned int format_raw = 0x04;\n\t\n\t// Omit default XML declaration even if there is no declaration in the document. This flag is off by default.\n\tconst unsigned int format_no_declaration = 0x08;\n\n\t// Don't escape attribute values and PCDATA contents. This flag is off by default.\n\tconst unsigned int format_no_escapes = 0x10;\n\n\t// Open file using text mode in xml_document::save_file. This enables special character (i.e. new-line) conversions on some systems. This flag is off by default.\n\tconst unsigned int format_save_file_text = 0x20;\n\n\t// Write every attribute on a new line with appropriate indentation. This flag is off by default.\n\tconst unsigned int format_indent_attributes = 0x40;\n\n\t// The default set of formatting flags.\n\t// Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none.\n\tconst unsigned int format_default = format_indent;\n\n\t// Forward declarations\n\tstruct xml_attribute_struct;\n\tstruct xml_node_struct;\n\n\tclass xml_node_iterator;\n\tclass xml_attribute_iterator;\n\tclass xml_named_node_iterator;\n\n\tclass xml_tree_walker;\n\n\tstruct xml_parse_result;\n\n\tclass xml_node;\n\n\tclass xml_text;\n\t\n\t#ifndef PUGIXML_NO_XPATH\n\tclass xpath_node;\n\tclass xpath_node_set;\n\tclass xpath_query;\n\tclass xpath_variable_set;\n\t#endif\n\n\t// Range-based for loop support\n\ttemplate <typename It> class xml_object_range\n\t{\n\tpublic:\n\t\ttypedef It const_iterator;\n\t\ttypedef It iterator;\n\n\t\txml_object_range(It b, It e): _begin(b), _end(e)\n\t\t{\n\t\t}\n\n\t\tIt begin() const { return _begin; }\n\t\tIt end() const { return _end; }\n\n\tprivate:\n\t\tIt _begin, _end;\n\t};\n\n\t// Writer interface for node printing (see xml_node::print)\n\tclass PUGIXML_CLASS xml_writer\n\t{\n\tpublic:\n\t\tvirtual ~xml_writer() {}\n\n\t\t// Write memory chunk into stream/file/whatever\n\t\tvirtual void write(const void* data, size_t size) = 0;\n\t};\n\n\t// xml_writer implementation for FILE*\n\tclass PUGIXML_CLASS xml_writer_file: public xml_writer\n\t{\n\tpublic:\n\t\t// Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio\n\t\txml_writer_file(void* file);\n\n\t\tvirtual void write(const void* data, size_t size);\n\n\tprivate:\n\t\tvoid* file;\n\t};\n\n\t#ifndef PUGIXML_NO_STL\n\t// xml_writer implementation for streams\n\tclass PUGIXML_CLASS xml_writer_stream: public xml_writer\n\t{\n\tpublic:\n\t\t// Construct writer from an output stream object\n\t\txml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream);\n\t\txml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream);\n\n\t\tvirtual void write(const void* data, size_t size);\n\n\tprivate:\n\t\tstd::basic_ostream<char, std::char_traits<char> >* narrow_stream;\n\t\tstd::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream;\n\t};\n\t#endif\n\n\t// A light-weight handle for manipulating attributes in DOM tree\n\tclass PUGIXML_CLASS xml_attribute\n\t{\n\t\tfriend class xml_attribute_iterator;\n\t\tfriend class xml_node;\n\n\tprivate:\n\t\txml_attribute_struct* _attr;\n\t\n\t\ttypedef void (*unspecified_bool_type)(xml_attribute***);\n\n\tpublic:\n\t\t// Default constructor. Constructs an empty attribute.\n\t\txml_attribute();\n\t\t\n\t\t// Constructs attribute from internal pointer\n\t\texplicit xml_attribute(xml_attribute_struct* attr);\n\n\t\t// Safe bool conversion operator\n\t\toperator unspecified_bool_type() const;\n\n\t\t// Borland C++ workaround\n\t\tbool operator!() const;\n\n\t\t// Comparison operators (compares wrapped attribute pointers)\n\t\tbool operator==(const xml_attribute& r) const;\n\t\tbool operator!=(const xml_attribute& r) const;\n\t\tbool operator<(const xml_attribute& r) const;\n\t\tbool operator>(const xml_attribute& r) const;\n\t\tbool operator<=(const xml_attribute& r) const;\n\t\tbool operator>=(const xml_attribute& r) const;\n\n\t\t// Check if attribute is empty\n\t\tbool empty() const;\n\n\t\t// Get attribute name/value, or \"\" if attribute is empty\n\t\tconst char_t* name() const;\n\t\tconst char_t* value() const;\n\n\t\t// Get attribute value, or the default value if attribute is empty\n\t\tconst char_t* as_string(const char_t* def = PUGIXML_TEXT(\"\")) const;\n\n\t\t// Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty\n\t\tint as_int(int def = 0) const;\n\t\tunsigned int as_uint(unsigned int def = 0) const;\n\t\tdouble as_double(double def = 0) const;\n\t\tfloat as_float(float def = 0) const;\n\n\t#ifdef PUGIXML_HAS_LONG_LONG\n\t\tlong long as_llong(long long def = 0) const;\n\t\tunsigned long long as_ullong(unsigned long long def = 0) const;\n\t#endif\n\n\t\t// Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty\n\t\tbool as_bool(bool def = false) const;\n\n\t\t// Set attribute name/value (returns false if attribute is empty or there is not enough memory)\n\t\tbool set_name(const char_t* rhs);\n\t\tbool set_value(const char_t* rhs);\n\n\t\t// Set attribute value with type conversion (numbers are converted to strings, boolean is converted to \"true\"/\"false\")\n\t\tbool set_value(int rhs);\n\t\tbool set_value(unsigned int rhs);\n\t\tbool set_value(double rhs);\n\t\tbool set_value(float rhs);\n\t\tbool set_value(bool rhs);\n\n\t#ifdef PUGIXML_HAS_LONG_LONG\n\t\tbool set_value(long long rhs);\n\t\tbool set_value(unsigned long long rhs);\n\t#endif\n\n\t\t// Set attribute value (equivalent to set_value without error checking)\n\t\txml_attribute& operator=(const char_t* rhs);\n\t\txml_attribute& operator=(int rhs);\n\t\txml_attribute& operator=(unsigned int rhs);\n\t\txml_attribute& operator=(double rhs);\n\t\txml_attribute& operator=(float rhs);\n\t\txml_attribute& operator=(bool rhs);\n\n\t#ifdef PUGIXML_HAS_LONG_LONG\n\t\txml_attribute& operator=(long long rhs);\n\t\txml_attribute& operator=(unsigned long long rhs);\n\t#endif\n\n\t\t// Get next/previous attribute in the attribute list of the parent node\n\t\txml_attribute next_attribute() const;\n\t\txml_attribute previous_attribute() const;\n\n\t\t// Get hash value (unique for handles to the same object)\n\t\tsize_t hash_value() const;\n\n\t\t// Get internal pointer\n\t\txml_attribute_struct* internal_object() const;\n\t};\n\n#ifdef __BORLANDC__\n\t// Borland C++ workaround\n\tbool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs);\n\tbool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs);\n#endif\n\n\t// A light-weight handle for manipulating nodes in DOM tree\n\tclass PUGIXML_CLASS xml_node\n\t{\n\t\tfriend class xml_attribute_iterator;\n\t\tfriend class xml_node_iterator;\n\t\tfriend class xml_named_node_iterator;\n\n\tprotected:\n\t\txml_node_struct* _root;\n\n\t\ttypedef void (*unspecified_bool_type)(xml_node***);\n\n\tpublic:\n\t\t// Default constructor. Constructs an empty node.\n\t\txml_node();\n\n\t\t// Constructs node from internal pointer\n\t\texplicit xml_node(xml_node_struct* p);\n\n\t\t// Safe bool conversion operator\n\t\toperator unspecified_bool_type() const;\n\n\t\t// Borland C++ workaround\n\t\tbool operator!() const;\n\t\n\t\t// Comparison operators (compares wrapped node pointers)\n\t\tbool operator==(const xml_node& r) const;\n\t\tbool operator!=(const xml_node& r) const;\n\t\tbool operator<(const xml_node& r) const;\n\t\tbool operator>(const xml_node& r) const;\n\t\tbool operator<=(const xml_node& r) const;\n\t\tbool operator>=(const xml_node& r) const;\n\n\t\t// Check if node is empty.\n\t\tbool empty() const;\n\n\t\t// Get node type\n\t\txml_node_type type() const;\n\n\t\t// Get node name, or \"\" if node is empty or it has no name\n\t\tconst char_t* name() const;\n\n\t\t// Get node value, or \"\" if node is empty or it has no value\n\t\t// Note: For <node>text</node> node.value() does not return \"text\"! Use child_value() or text() methods to access text inside nodes.\n\t\tconst char_t* value() const;\n\t\n\t\t// Get attribute list\n\t\txml_attribute first_attribute() const;\n\t\txml_attribute last_attribute() const;\n\n\t\t// Get children list\n\t\txml_node first_child() const;\n\t\txml_node last_child() const;\n\n\t\t// Get next/previous sibling in the children list of the parent node\n\t\txml_node next_sibling() const;\n\t\txml_node previous_sibling() const;\n\t\t\n\t\t// Get parent node\n\t\txml_node parent() const;\n\n\t\t// Get root of DOM tree this node belongs to\n\t\txml_node root() const;\n\n\t\t// Get text object for the current node\n\t\txml_text text() const;\n\n\t\t// Get child, attribute or next/previous sibling with the specified name\n\t\txml_node child(const char_t* name) const;\n\t\txml_attribute attribute(const char_t* name) const;\n\t\txml_node next_sibling(const char_t* name) const;\n\t\txml_node previous_sibling(const char_t* name) const;\n\n\t\t// Get attribute, starting the search from a hint (and updating hint so that searching for a sequence of attributes is fast)\n\t\txml_attribute attribute(const char_t* name, xml_attribute& hint) const;\n\n\t\t// Get child value of current node; that is, value of the first child node of type PCDATA/CDATA\n\t\tconst char_t* child_value() const;\n\n\t\t// Get child value of child with specified name. Equivalent to child(name).child_value().\n\t\tconst char_t* child_value(const char_t* name) const;\n\n\t\t// Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value)\n\t\tbool set_name(const char_t* rhs);\n\t\tbool set_value(const char_t* rhs);\n\t\t\n\t\t// Add attribute with specified name. Returns added attribute, or empty attribute on errors.\n\t\txml_attribute append_attribute(const char_t* name);\n\t\txml_attribute prepend_attribute(const char_t* name);\n\t\txml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr);\n\t\txml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr);\n\n\t\t// Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors.\n\t\txml_attribute append_copy(const xml_attribute& proto);\n\t\txml_attribute prepend_copy(const xml_attribute& proto);\n\t\txml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr);\n\t\txml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr);\n\n\t\t// Add child node with specified type. Returns added node, or empty node on errors.\n\t\txml_node append_child(xml_node_type type = node_element);\n\t\txml_node prepend_child(xml_node_type type = node_element);\n\t\txml_node insert_child_after(xml_node_type type, const xml_node& node);\n\t\txml_node insert_child_before(xml_node_type type, const xml_node& node);\n\n\t\t// Add child element with specified name. Returns added node, or empty node on errors.\n\t\txml_node append_child(const char_t* name);\n\t\txml_node prepend_child(const char_t* name);\n\t\txml_node insert_child_after(const char_t* name, const xml_node& node);\n\t\txml_node insert_child_before(const char_t* name, const xml_node& node);\n\n\t\t// Add a copy of the specified node as a child. Returns added node, or empty node on errors.\n\t\txml_node append_copy(const xml_node& proto);\n\t\txml_node prepend_copy(const xml_node& proto);\n\t\txml_node insert_copy_after(const xml_node& proto, const xml_node& node);\n\t\txml_node insert_copy_before(const xml_node& proto, const xml_node& node);\n\n\t\t// Move the specified node to become a child of this node. Returns moved node, or empty node on errors.\n\t\txml_node append_move(const xml_node& moved);\n\t\txml_node prepend_move(const xml_node& moved);\n\t\txml_node insert_move_after(const xml_node& moved, const xml_node& node);\n\t\txml_node insert_move_before(const xml_node& moved, const xml_node& node);\n\n\t\t// Remove specified attribute\n\t\tbool remove_attribute(const xml_attribute& a);\n\t\tbool remove_attribute(const char_t* name);\n\n\t\t// Remove specified child\n\t\tbool remove_child(const xml_node& n);\n\t\tbool remove_child(const char_t* name);\n\n\t\t// Parses buffer as an XML document fragment and appends all nodes as children of the current node.\n\t\t// Copies/converts the buffer, so it may be deleted or changed after the function returns.\n\t\t// Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory.\n\t\txml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);\n\n\t\t// Find attribute using predicate. Returns first attribute for which predicate returned true.\n\t\ttemplate <typename Predicate> xml_attribute find_attribute(Predicate pred) const\n\t\t{\n\t\t\tif (!_root) return xml_attribute();\n\t\t\t\n\t\t\tfor (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())\n\t\t\t\tif (pred(attrib))\n\t\t\t\t\treturn attrib;\n\t\t\n\t\t\treturn xml_attribute();\n\t\t}\n\n\t\t// Find child node using predicate. Returns first child for which predicate returned true.\n\t\ttemplate <typename Predicate> xml_node find_child(Predicate pred) const\n\t\t{\n\t\t\tif (!_root) return xml_node();\n\t\n\t\t\tfor (xml_node node = first_child(); node; node = node.next_sibling())\n\t\t\t\tif (pred(node))\n\t\t\t\t\treturn node;\n\t\t\n\t\t\treturn xml_node();\n\t\t}\n\n\t\t// Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true.\n\t\ttemplate <typename Predicate> xml_node find_node(Predicate pred) const\n\t\t{\n\t\t\tif (!_root) return xml_node();\n\n\t\t\txml_node cur = first_child();\n\t\t\t\n\t\t\twhile (cur._root && cur._root != _root)\n\t\t\t{\n\t\t\t\tif (pred(cur)) return cur;\n\n\t\t\t\tif (cur.first_child()) cur = cur.first_child();\n\t\t\t\telse if (cur.next_sibling()) cur = cur.next_sibling();\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\twhile (!cur.next_sibling() && cur._root != _root) cur = cur.parent();\n\n\t\t\t\t\tif (cur._root != _root) cur = cur.next_sibling();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn xml_node();\n\t\t}\n\n\t\t// Find child node by attribute name/value\n\t\txml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const;\n\t\txml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const;\n\n\t#ifndef PUGIXML_NO_STL\n\t\t// Get the absolute node path from root as a text string.\n\t\tstring_t path(char_t delimiter = '/') const;\n\t#endif\n\n\t\t// Search for a node by path consisting of node names and . or .. elements.\n\t\txml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const;\n\n\t\t// Recursively traverse subtree with xml_tree_walker\n\t\tbool traverse(xml_tree_walker& walker);\n\t\n\t#ifndef PUGIXML_NO_XPATH\n\t\t// Select single node by evaluating XPath query. Returns first node from the resulting node set.\n\t\txpath_node select_node(const char_t* query, xpath_variable_set* variables = 0) const;\n\t\txpath_node select_node(const xpath_query& query) const;\n\n\t\t// Select node set by evaluating XPath query\n\t\txpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = 0) const;\n\t\txpath_node_set select_nodes(const xpath_query& query) const;\n\n\t\t// (deprecated: use select_node instead) Select single node by evaluating XPath query.\n\t\txpath_node select_single_node(const char_t* query, xpath_variable_set* variables = 0) const;\n\t\txpath_node select_single_node(const xpath_query& query) const;\n\n\t#endif\n\t\t\n\t\t// Print subtree using a writer object\n\t\tvoid print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT(\"\\t\"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;\n\n\t#ifndef PUGIXML_NO_STL\n\t\t// Print subtree to stream\n\t\tvoid print(std::basic_ostream<char, std::char_traits<char> >& os, const char_t* indent = PUGIXML_TEXT(\"\\t\"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;\n\t\tvoid print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& os, const char_t* indent = PUGIXML_TEXT(\"\\t\"), unsigned int flags = format_default, unsigned int depth = 0) const;\n\t#endif\n\n\t\t// Child nodes iterators\n\t\ttypedef xml_node_iterator iterator;\n\n\t\titerator begin() const;\n\t\titerator end() const;\n\n\t\t// Attribute iterators\n\t\ttypedef xml_attribute_iterator attribute_iterator;\n\n\t\tattribute_iterator attributes_begin() const;\n\t\tattribute_iterator attributes_end() const;\n\n\t\t// Range-based for support\n\t\txml_object_range<xml_node_iterator> children() const;\n\t\txml_object_range<xml_named_node_iterator> children(const char_t* name) const;\n\t\txml_object_range<xml_attribute_iterator> attributes() const;\n\n\t\t// Get node offset in parsed file/string (in char_t units) for debugging purposes\n\t\tptrdiff_t offset_debug() const;\n\n\t\t// Get hash value (unique for handles to the same object)\n\t\tsize_t hash_value() const;\n\n\t\t// Get internal pointer\n\t\txml_node_struct* internal_object() const;\n\t};\n\n#ifdef __BORLANDC__\n\t// Borland C++ workaround\n\tbool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs);\n\tbool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs);\n#endif\n\n\t// A helper for working with text inside PCDATA nodes\n\tclass PUGIXML_CLASS xml_text\n\t{\n\t\tfriend class xml_node;\n\n\t\txml_node_struct* _root;\n\n\t\ttypedef void (*unspecified_bool_type)(xml_text***);\n\n\t\texplicit xml_text(xml_node_struct* root);\n\n\t\txml_node_struct* _data_new();\n\t\txml_node_struct* _data() const;\n\n\tpublic:\n\t\t// Default constructor. Constructs an empty object.\n\t\txml_text();\n\n\t\t// Safe bool conversion operator\n\t\toperator unspecified_bool_type() const;\n\n\t\t// Borland C++ workaround\n\t\tbool operator!() const;\n\n\t\t// Check if text object is empty\n\t\tbool empty() const;\n\n\t\t// Get text, or \"\" if object is empty\n\t\tconst char_t* get() const;\n\n\t\t// Get text, or the default value if object is empty\n\t\tconst char_t* as_string(const char_t* def = PUGIXML_TEXT(\"\")) const;\n\n\t\t// Get text as a number, or the default value if conversion did not succeed or object is empty\n\t\tint as_int(int def = 0) const;\n\t\tunsigned int as_uint(unsigned int def = 0) const;\n\t\tdouble as_double(double def = 0) const;\n\t\tfloat as_float(float def = 0) const;\n\n\t#ifdef PUGIXML_HAS_LONG_LONG\n\t\tlong long as_llong(long long def = 0) const;\n\t\tunsigned long long as_ullong(unsigned long long def = 0) const;\n\t#endif\n\n\t\t// Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty\n\t\tbool as_bool(bool def = false) const;\n\n\t\t// Set text (returns false if object is empty or there is not enough memory)\n\t\tbool set(const char_t* rhs);\n\n\t\t// Set text with type conversion (numbers are converted to strings, boolean is converted to \"true\"/\"false\")\n\t\tbool set(int rhs);\n\t\tbool set(unsigned int rhs);\n\t\tbool set(double rhs);\n\t\tbool set(float rhs);\n\t\tbool set(bool rhs);\n\n\t#ifdef PUGIXML_HAS_LONG_LONG\n\t\tbool set(long long rhs);\n\t\tbool set(unsigned long long rhs);\n\t#endif\n\n\t\t// Set text (equivalent to set without error checking)\n\t\txml_text& operator=(const char_t* rhs);\n\t\txml_text& operator=(int rhs);\n\t\txml_text& operator=(unsigned int rhs);\n\t\txml_text& operator=(double rhs);\n\t\txml_text& operator=(float rhs);\n\t\txml_text& operator=(bool rhs);\n\n\t#ifdef PUGIXML_HAS_LONG_LONG\n\t\txml_text& operator=(long long rhs);\n\t\txml_text& operator=(unsigned long long rhs);\n\t#endif\n\n\t\t// Get the data node (node_pcdata or node_cdata) for this object\n\t\txml_node data() const;\n\t};\n\n#ifdef __BORLANDC__\n\t// Borland C++ workaround\n\tbool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs);\n\tbool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs);\n#endif\n\n\t// Child node iterator (a bidirectional iterator over a collection of xml_node)\n\tclass PUGIXML_CLASS xml_node_iterator\n\t{\n\t\tfriend class xml_node;\n\n\tprivate:\n\t\tmutable xml_node _wrap;\n\t\txml_node _parent;\n\n\t\txml_node_iterator(xml_node_struct* ref, xml_node_struct* parent);\n\n\tpublic:\n\t\t// Iterator traits\n\t\ttypedef ptrdiff_t difference_type;\n\t\ttypedef xml_node value_type;\n\t\ttypedef xml_node* pointer;\n\t\ttypedef xml_node& reference;\n\n\t#ifndef PUGIXML_NO_STL\n\t\ttypedef std::bidirectional_iterator_tag iterator_category;\n\t#endif\n\n\t\t// Default constructor\n\t\txml_node_iterator();\n\n\t\t// Construct an iterator which points to the specified node\n\t\txml_node_iterator(const xml_node& node);\n\n\t\t// Iterator operators\n\t\tbool operator==(const xml_node_iterator& rhs) const;\n\t\tbool operator!=(const xml_node_iterator& rhs) const;\n\n\t\txml_node& operator*() const;\n\t\txml_node* operator->() const;\n\n\t\tconst xml_node_iterator& operator++();\n\t\txml_node_iterator operator++(int);\n\n\t\tconst xml_node_iterator& operator--();\n\t\txml_node_iterator operator--(int);\n\t};\n\n\t// Attribute iterator (a bidirectional iterator over a collection of xml_attribute)\n\tclass PUGIXML_CLASS xml_attribute_iterator\n\t{\n\t\tfriend class xml_node;\n\n\tprivate:\n\t\tmutable xml_attribute _wrap;\n\t\txml_node _parent;\n\n\t\txml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent);\n\n\tpublic:\n\t\t// Iterator traits\n\t\ttypedef ptrdiff_t difference_type;\n\t\ttypedef xml_attribute value_type;\n\t\ttypedef xml_attribute* pointer;\n\t\ttypedef xml_attribute& reference;\n\n\t#ifndef PUGIXML_NO_STL\n\t\ttypedef std::bidirectional_iterator_tag iterator_category;\n\t#endif\n\n\t\t// Default constructor\n\t\txml_attribute_iterator();\n\n\t\t// Construct an iterator which points to the specified attribute\n\t\txml_attribute_iterator(const xml_attribute& attr, const xml_node& parent);\n\n\t\t// Iterator operators\n\t\tbool operator==(const xml_attribute_iterator& rhs) const;\n\t\tbool operator!=(const xml_attribute_iterator& rhs) const;\n\n\t\txml_attribute& operator*() const;\n\t\txml_attribute* operator->() const;\n\n\t\tconst xml_attribute_iterator& operator++();\n\t\txml_attribute_iterator operator++(int);\n\n\t\tconst xml_attribute_iterator& operator--();\n\t\txml_attribute_iterator operator--(int);\n\t};\n\n\t// Named node range helper\n\tclass PUGIXML_CLASS xml_named_node_iterator\n\t{\n\t\tfriend class xml_node;\n\n\tpublic:\n\t\t// Iterator traits\n\t\ttypedef ptrdiff_t difference_type;\n\t\ttypedef xml_node value_type;\n\t\ttypedef xml_node* pointer;\n\t\ttypedef xml_node& reference;\n\n\t#ifndef PUGIXML_NO_STL\n\t\ttypedef std::bidirectional_iterator_tag iterator_category;\n\t#endif\n\n\t\t// Default constructor\n\t\txml_named_node_iterator();\n\n\t\t// Construct an iterator which points to the specified node\n\t\txml_named_node_iterator(const xml_node& node, const char_t* name);\n\n\t\t// Iterator operators\n\t\tbool operator==(const xml_named_node_iterator& rhs) const;\n\t\tbool operator!=(const xml_named_node_iterator& rhs) const;\n\n\t\txml_node& operator*() const;\n\t\txml_node* operator->() const;\n\n\t\tconst xml_named_node_iterator& operator++();\n\t\txml_named_node_iterator operator++(int);\n\n\t\tconst xml_named_node_iterator& operator--();\n\t\txml_named_node_iterator operator--(int);\n\n\tprivate:\n\t\tmutable xml_node _wrap;\n\t\txml_node _parent;\n\t\tconst char_t* _name;\n\n\t\txml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name);\n\t};\n\n\t// Abstract tree walker class (see xml_node::traverse)\n\tclass PUGIXML_CLASS xml_tree_walker\n\t{\n\t\tfriend class xml_node;\n\n\tprivate:\n\t\tint _depth;\n\t\n\tprotected:\n\t\t// Get current traversal depth\n\t\tint depth() const;\n\t\n\tpublic:\n\t\txml_tree_walker();\n\t\tvirtual ~xml_tree_walker();\n\n\t\t// Callback that is called when traversal begins\n\t\tvirtual bool begin(xml_node& node);\n\n\t\t// Callback that is called for each node traversed\n\t\tvirtual bool for_each(xml_node& node) = 0;\n\n\t\t// Callback that is called when traversal ends\n\t\tvirtual bool end(xml_node& node);\n\t};\n\n\t// Parsing status, returned as part of xml_parse_result object\n\tenum xml_parse_status\n\t{\n\t\tstatus_ok = 0,\t\t\t\t// No error\n\n\t\tstatus_file_not_found,\t\t// File was not found during load_file()\n\t\tstatus_io_error,\t\t\t// Error reading from file/stream\n\t\tstatus_out_of_memory,\t\t// Could not allocate memory\n\t\tstatus_internal_error,\t\t// Internal error occurred\n\n\t\tstatus_unrecognized_tag,\t// Parser could not determine tag type\n\n\t\tstatus_bad_pi,\t\t\t\t// Parsing error occurred while parsing document declaration/processing instruction\n\t\tstatus_bad_comment,\t\t\t// Parsing error occurred while parsing comment\n\t\tstatus_bad_cdata,\t\t\t// Parsing error occurred while parsing CDATA section\n\t\tstatus_bad_doctype,\t\t\t// Parsing error occurred while parsing document type declaration\n\t\tstatus_bad_pcdata,\t\t\t// Parsing error occurred while parsing PCDATA section\n\t\tstatus_bad_start_element,\t// Parsing error occurred while parsing start element tag\n\t\tstatus_bad_attribute,\t\t// Parsing error occurred while parsing element attribute\n\t\tstatus_bad_end_element,\t\t// Parsing error occurred while parsing end element tag\n\t\tstatus_end_element_mismatch,// There was a mismatch of start-end tags (closing tag had incorrect name, some tag was not closed or there was an excessive closing tag)\n\n\t\tstatus_append_invalid_root,\t// Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer)\n\n\t\tstatus_no_document_element\t// Parsing resulted in a document without element nodes\n\t};\n\n\t// Parsing result\n\tstruct PUGIXML_CLASS xml_parse_result\n\t{\n\t\t// Parsing status (see xml_parse_status)\n\t\txml_parse_status status;\n\n\t\t// Last parsed offset (in char_t units from start of input data)\n\t\tptrdiff_t offset;\n\n\t\t// Source document encoding\n\t\txml_encoding encoding;\n\n\t\t// Default constructor, initializes object to failed state\n\t\txml_parse_result();\n\n\t\t// Cast to bool operator\n\t\toperator bool() const;\n\n\t\t// Get error description\n\t\tconst char* description() const;\n\t};\n\n\t// Document class (DOM tree root)\n\tclass PUGIXML_CLASS xml_document: public xml_node\n\t{\n\tprivate:\n\t\tchar_t* _buffer;\n\n\t\tchar _memory[192];\n\t\t\n\t\t// Non-copyable semantics\n\t\txml_document(const xml_document&);\n\t\txml_document& operator=(const xml_document&);\n\n\t\tvoid create();\n\t\tvoid destroy();\n\n\tpublic:\n\t\t// Default constructor, makes empty document\n\t\txml_document();\n\n\t\t// Destructor, invalidates all node/attribute handles to this document\n\t\t~xml_document();\n\n\t\t// Removes all nodes, leaving the empty document\n\t\tvoid reset();\n\n\t\t// Removes all nodes, then copies the entire contents of the specified document\n\t\tvoid reset(const xml_document& proto);\n\n\t#ifndef PUGIXML_NO_STL\n\t\t// Load document from stream.\n\t\txml_parse_result load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);\n\t\txml_parse_result load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options = parse_default);\n\t#endif\n\n\t\t// (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied.\n\t\txml_parse_result load(const char_t* contents, unsigned int options = parse_default);\n\n\t\t// Load document from zero-terminated string. No encoding conversions are applied.\n\t\txml_parse_result load_string(const char_t* contents, unsigned int options = parse_default);\n\n\t\t// Load document from file\n\t\txml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);\n\t\txml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);\n\n\t\t// Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns.\n\t\txml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);\n\n\t\t// Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).\n\t\t// You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed.\n\t\txml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);\n\n\t\t// Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).\n\t\t// You should allocate the buffer with pugixml allocation function; document will free the buffer when it is no longer needed (you can't use it anymore).\n\t\txml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);\n\n\t\t// Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details).\n\t\tvoid save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT(\"\\t\"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;\n\n\t#ifndef PUGIXML_NO_STL\n\t\t// Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details).\n\t\tvoid save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent = PUGIXML_TEXT(\"\\t\"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;\n\t\tvoid save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent = PUGIXML_TEXT(\"\\t\"), unsigned int flags = format_default) const;\n\t#endif\n\n\t\t// Save XML to file\n\t\tbool save_file(const char* path, const char_t* indent = PUGIXML_TEXT(\"\\t\"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;\n\t\tbool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT(\"\\t\"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;\n\n\t\t// Get document element\n\t\txml_node document_element() const;\n\t};\n\n#ifndef PUGIXML_NO_XPATH\n\t// XPath query return type\n\tenum xpath_value_type\n\t{\n\t\txpath_type_none,\t  // Unknown type (query failed to compile)\n\t\txpath_type_node_set,  // Node set (xpath_node_set)\n\t\txpath_type_number,\t  // Number\n\t\txpath_type_string,\t  // String\n\t\txpath_type_boolean\t  // Boolean\n\t};\n\n\t// XPath parsing result\n\tstruct PUGIXML_CLASS xpath_parse_result\n\t{\n\t\t// Error message (0 if no error)\n\t\tconst char* error;\n\n\t\t// Last parsed offset (in char_t units from string start)\n\t\tptrdiff_t offset;\n\n\t\t// Default constructor, initializes object to failed state\n\t\txpath_parse_result();\n\n\t\t// Cast to bool operator\n\t\toperator bool() const;\n\n\t\t// Get error description\n\t\tconst char* description() const;\n\t};\n\n\t// A single XPath variable\n\tclass PUGIXML_CLASS xpath_variable\n\t{\n\t\tfriend class xpath_variable_set;\n\n\tprotected:\n\t\txpath_value_type _type;\n\t\txpath_variable* _next;\n\n\t\txpath_variable(xpath_value_type type);\n\n\t\t// Non-copyable semantics\n\t\txpath_variable(const xpath_variable&);\n\t\txpath_variable& operator=(const xpath_variable&);\n\t\t\n\tpublic:\n\t\t// Get variable name\n\t\tconst char_t* name() const;\n\n\t\t// Get variable type\n\t\txpath_value_type type() const;\n\n\t\t// Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error\n\t\tbool get_boolean() const;\n\t\tdouble get_number() const;\n\t\tconst char_t* get_string() const;\n\t\tconst xpath_node_set& get_node_set() const;\n\n\t\t// Set variable value; no type conversion is performed, false is returned on type mismatch error\n\t\tbool set(bool value);\n\t\tbool set(double value);\n\t\tbool set(const char_t* value);\n\t\tbool set(const xpath_node_set& value);\n\t};\n\n\t// A set of XPath variables\n\tclass PUGIXML_CLASS xpath_variable_set\n\t{\n\tprivate:\n\t\txpath_variable* _data[64];\n\n\t\tvoid _assign(const xpath_variable_set& rhs);\n\t\tvoid _swap(xpath_variable_set& rhs);\n\n\t\txpath_variable* _find(const char_t* name) const;\n\n\t\tstatic bool _clone(xpath_variable* var, xpath_variable** out_result);\n\t\tstatic void _destroy(xpath_variable* var);\n\n\tpublic:\n\t\t// Default constructor/destructor\n\t\txpath_variable_set();\n\t\t~xpath_variable_set();\n\n\t\t// Copy constructor/assignment operator\n\t\txpath_variable_set(const xpath_variable_set& rhs);\n\t\txpath_variable_set& operator=(const xpath_variable_set& rhs);\n\n\t#if __cplusplus >= 201103\n\t\t// Move semantics support\n\t\txpath_variable_set(xpath_variable_set&& rhs);\n\t\txpath_variable_set& operator=(xpath_variable_set&& rhs);\n\t#endif\n\n\t\t// Add a new variable or get the existing one, if the types match\n\t\txpath_variable* add(const char_t* name, xpath_value_type type);\n\n\t\t// Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch\n\t\tbool set(const char_t* name, bool value);\n\t\tbool set(const char_t* name, double value);\n\t\tbool set(const char_t* name, const char_t* value);\n\t\tbool set(const char_t* name, const xpath_node_set& value);\n\n\t\t// Get existing variable by name\n\t\txpath_variable* get(const char_t* name);\n\t\tconst xpath_variable* get(const char_t* name) const;\n\t};\n\n\t// A compiled XPath query object\n\tclass PUGIXML_CLASS xpath_query\n\t{\n\tprivate:\n\t\tvoid* _impl;\n\t\txpath_parse_result _result;\n\n\t\ttypedef void (*unspecified_bool_type)(xpath_query***);\n\n\t\t// Non-copyable semantics\n\t\txpath_query(const xpath_query&);\n\t\txpath_query& operator=(const xpath_query&);\n\n\tpublic:\n\t\t// Construct a compiled object from XPath expression.\n\t\t// If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors.\n\t\texplicit xpath_query(const char_t* query, xpath_variable_set* variables = 0);\n\n\t\t// Constructor\n\t\txpath_query();\n\n\t\t// Destructor\n\t\t~xpath_query();\n\n\t#if __cplusplus >= 201103\n\t\t// Move semantics support\n\t\txpath_query(xpath_query&& rhs);\n\t\txpath_query& operator=(xpath_query&& rhs);\n\t#endif\n\n\t\t// Get query expression return type\n\t\txpath_value_type return_type() const;\n\t\t\n\t\t// Evaluate expression as boolean value in the specified context; performs type conversion if necessary.\n\t\t// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.\n\t\tbool evaluate_boolean(const xpath_node& n) const;\n\t\t\n\t\t// Evaluate expression as double value in the specified context; performs type conversion if necessary.\n\t\t// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.\n\t\tdouble evaluate_number(const xpath_node& n) const;\n\t\t\n\t#ifndef PUGIXML_NO_STL\n\t\t// Evaluate expression as string value in the specified context; performs type conversion if necessary.\n\t\t// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.\n\t\tstring_t evaluate_string(const xpath_node& n) const;\n\t#endif\n\t\t\n\t\t// Evaluate expression as string value in the specified context; performs type conversion if necessary.\n\t\t// At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero).\n\t\t// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.\n\t\t// If PUGIXML_NO_EXCEPTIONS is defined, returns empty  set instead.\n\t\tsize_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const;\n\n\t\t// Evaluate expression as node set in the specified context.\n\t\t// If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.\n\t\t// If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead.\n\t\txpath_node_set evaluate_node_set(const xpath_node& n) const;\n\n\t\t// Evaluate expression as node set in the specified context.\n\t\t// Return first node in document order, or empty node if node set is empty.\n\t\t// If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.\n\t\t// If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead.\n\t\txpath_node evaluate_node(const xpath_node& n) const;\n\n\t\t// Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode)\n\t\tconst xpath_parse_result& result() const;\n\n\t\t// Safe bool conversion operator\n\t\toperator unspecified_bool_type() const;\n\n\t\t// Borland C++ workaround\n\t\tbool operator!() const;\n\t};\n\t\n\t#ifndef PUGIXML_NO_EXCEPTIONS\n\t// XPath exception class\n\tclass PUGIXML_CLASS xpath_exception: public std::exception\n\t{\n\tprivate:\n\t\txpath_parse_result _result;\n\n\tpublic:\n\t\t// Construct exception from parse result\n\t\texplicit xpath_exception(const xpath_parse_result& result);\n\n\t\t// Get error message\n\t\tvirtual const char* what() const throw();\n\n\t\t// Get parse result\n\t\tconst xpath_parse_result& result() const;\n\t};\n\t#endif\n\t\n\t// XPath node class (either xml_node or xml_attribute)\n\tclass PUGIXML_CLASS xpath_node\n\t{\n\tprivate:\n\t\txml_node _node;\n\t\txml_attribute _attribute;\n\t\n\t\ttypedef void (*unspecified_bool_type)(xpath_node***);\n\n\tpublic:\n\t\t// Default constructor; constructs empty XPath node\n\t\txpath_node();\n\t\t\n\t\t// Construct XPath node from XML node/attribute\n\t\txpath_node(const xml_node& node);\n\t\txpath_node(const xml_attribute& attribute, const xml_node& parent);\n\n\t\t// Get node/attribute, if any\n\t\txml_node node() const;\n\t\txml_attribute attribute() const;\n\t\t\n\t\t// Get parent of contained node/attribute\n\t\txml_node parent() const;\n\n\t\t// Safe bool conversion operator\n\t\toperator unspecified_bool_type() const;\n\t\t\n\t\t// Borland C++ workaround\n\t\tbool operator!() const;\n\n\t\t// Comparison operators\n\t\tbool operator==(const xpath_node& n) const;\n\t\tbool operator!=(const xpath_node& n) const;\n\t};\n\n#ifdef __BORLANDC__\n\t// Borland C++ workaround\n\tbool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs);\n\tbool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs);\n#endif\n\n\t// A fixed-size collection of XPath nodes\n\tclass PUGIXML_CLASS xpath_node_set\n\t{\n\tpublic:\n\t\t// Collection type\n\t\tenum type_t\n\t\t{\n\t\t\ttype_unsorted,\t\t\t// Not ordered\n\t\t\ttype_sorted,\t\t\t// Sorted by document order (ascending)\n\t\t\ttype_sorted_reverse\t\t// Sorted by document order (descending)\n\t\t};\n\t\t\n\t\t// Constant iterator type\n\t\ttypedef const xpath_node* const_iterator;\n\n\t\t// We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work\n\t\ttypedef const xpath_node* iterator;\n\t\n\t\t// Default constructor. Constructs empty set.\n\t\txpath_node_set();\n\n\t\t// Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful\n\t\txpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted);\n\n\t\t// Destructor\n\t\t~xpath_node_set();\n\t\t\n\t\t// Copy constructor/assignment operator\n\t\txpath_node_set(const xpath_node_set& ns);\n\t\txpath_node_set& operator=(const xpath_node_set& ns);\n\n\t#if __cplusplus >= 201103\n\t\t// Move semantics support\n\t\txpath_node_set(xpath_node_set&& rhs);\n\t\txpath_node_set& operator=(xpath_node_set&& rhs);\n\t#endif\n\n\t\t// Get collection type\n\t\ttype_t type() const;\n\t\t\n\t\t// Get collection size\n\t\tsize_t size() const;\n\n\t\t// Indexing operator\n\t\tconst xpath_node& operator[](size_t index) const;\n\t\t\n\t\t// Collection iterators\n\t\tconst_iterator begin() const;\n\t\tconst_iterator end() const;\n\n\t\t// Sort the collection in ascending/descending order by document order\n\t\tvoid sort(bool reverse = false);\n\t\t\n\t\t// Get first node in the collection by document order\n\t\txpath_node first() const;\n\t\t\n\t\t// Check if collection is empty\n\t\tbool empty() const;\n\t\n\tprivate:\n\t\ttype_t _type;\n\t\t\n\t\txpath_node _storage;\n\t\t\n\t\txpath_node* _begin;\n\t\txpath_node* _end;\n\n\t\tvoid _assign(const_iterator begin, const_iterator end, type_t type);\n\t\tvoid _move(xpath_node_set& rhs);\n\t};\n#endif\n\n#ifndef PUGIXML_NO_STL\n\t// Convert wide string to UTF8\n\tstd::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str);\n\tstd::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >& str);\n\t\n\t// Convert UTF8 to wide string\n\tstd::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str);\n\tstd::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >& str);\n#endif\n\n\t// Memory allocation function interface; returns pointer to allocated memory or NULL on failure\n\ttypedef void* (*allocation_function)(size_t size);\n\t\n\t// Memory deallocation function interface\n\ttypedef void (*deallocation_function)(void* ptr);\n\n\t// Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions.\n\tvoid PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate);\n\t\n\t// Get current memory management functions\n\tallocation_function PUGIXML_FUNCTION get_memory_allocation_function();\n\tdeallocation_function PUGIXML_FUNCTION get_memory_deallocation_function();\n}\n\n#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))\nnamespace std\n{\n\t// Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier)\n\tstd::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&);\n\tstd::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&);\n\tstd::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&);\n}\n#endif\n\n#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)\nnamespace std\n{\n\t// Workarounds for (non-standard) iterator category detection\n\tstd::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&);\n\tstd::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&);\n\tstd::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&);\n}\n#endif\n\n#endif\n\n// Make sure implementation is included in header-only mode\n// Use macro expansion in #include to work around QMake (QTBUG-11923)\n#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE)\n#\tdefine PUGIXML_SOURCE \"pugixml.cpp\"\n#\tinclude PUGIXML_SOURCE\n#endif\n\n/**\n * Copyright (c) 2006-2015 Arseny Kapoulkine\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/miniz.c",
    "content": "/* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing\n   See \"unlicense\" statement at the end of this file.\n   Rich Geldreich <richgel99@gmail.com>, last updated Oct. 13, 2013\n   Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt\n\n   Most API's defined in miniz.c are optional. For example, to disable the archive related functions just define\n   MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO (see the list below for more macros).\n\n   * Change History\n     10/13/13 v1.15 r4 - Interim bugfix release while I work on the next major release with Zip64 support (almost there!):\n       - Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug (thanks kahmyong.moon@hp.com) which could cause locate files to not find files. This bug\n        would only have occured in earlier versions if you explicitly used this flag, OR if you used mz_zip_extract_archive_file_to_heap() or mz_zip_add_mem_to_archive_file_in_place()\n        (which used this flag). If you can't switch to v1.15 but want to fix this bug, just remove the uses of this flag from both helper funcs (and of course don't use the flag).\n       - Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when pUser_read_buf is not NULL and compressed size is > uncompressed size\n       - Fixing mz_zip_reader_extract_*() funcs so they don't try to extract compressed data from directory entries, to account for weird zipfiles which contain zero-size compressed data on dir entries.\n         Hopefully this fix won't cause any issues on weird zip archives, because it assumes the low 16-bits of zip external attributes are DOS attributes (which I believe they always are in practice).\n       - Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the internal attributes, just the filename and external attributes\n       - mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed\n       - Added cmake support for Linux builds which builds all the examples, tested with clang v3.3 and gcc v4.6.\n       - Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti\n       - Merged MZ_FORCEINLINE fix from hdeanclark\n       - Fix <time.h> include before config #ifdef, thanks emil.brink\n       - Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping (super useful for OpenGL apps), and explicit control over the compression level (so you can\n        set it to 1 for real-time compression).\n       - Merged in some compiler fixes from paulharris's github repro.\n       - Retested this build under Windows (VS 2010, including static analysis), tcc  0.9.26, gcc v4.6 and clang v3.3.\n       - Added example6.c, which dumps an image of the mandelbrot set to a PNG file.\n       - Modified example2 to help test the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more.\n       - In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix possible src file fclose() leak if alignment bytes+local header file write faiiled\n\t\t - In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader(): Was pushing the wrong central dir header offset, appears harmless in this release, but it became a problem in the zip64 branch\n     5/20/12 v1.14 - MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE, #include <time.h> (thanks fermtect).\n     5/19/12 v1.13 - From jason@cornsyrup.org and kelwert@mtu.edu - Fix mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit.\n       - Temporarily/locally slammed in \"typedef unsigned long mz_ulong\" and re-ran a randomized regression test on ~500k files.\n       - Eliminated a bunch of warnings when compiling with GCC 32-bit/64.\n       - Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze (static analysis) option and fixed all warnings (except for the silly\n        \"Use of the comma-operator in a tested expression..\" analysis warning, which I purposely use to work around a MSVC compiler warning).\n       - Created 32-bit and 64-bit Codeblocks projects/workspace. Built and tested Linux executables. The codeblocks workspace is compatible with Linux+Win32/x64.\n       - Added miniz_tester solution/project, which is a useful little app derived from LZHAM's tester app that I use as part of the regression test.\n       - Ran miniz.c and tinfl.c through another series of regression testing on ~500,000 files and archives.\n       - Modified example5.c so it purposely disables a bunch of high-level functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the MINIZ_NO_STDIO bug report.)\n       - Fix ftell() usage in examples so they exit with an error on files which are too large (a limitation of the examples, not miniz itself).\n     4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple minor level_and_flags issues in the archive API's.\n      level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce Dawson <bruced@valvesoftware.com> for the feedback/bug report.\n     5/28/11 v1.11 - Added statement from unlicense.org\n     5/27/11 v1.10 - Substantial compressor optimizations:\n      - Level 1 is now ~4x faster than before. The L1 compressor's throughput now varies between 70-110MB/sec. on a\n      - Core i7 (actual throughput varies depending on the type of data, and x64 vs. x86).\n      - Improved baseline L2-L9 compression perf. Also, greatly improved compression perf. issues on some file types.\n      - Refactored the compression code for better readability and maintainability.\n      - Added level 10 compression level (L10 has slightly better ratio than level 9, but could have a potentially large\n       drop in throughput on some files).\n     5/15/11 v1.09 - Initial stable release.\n\n   * Low-level Deflate/Inflate implementation notes:\n\n     Compression: Use the \"tdefl\" API's. The compressor supports raw, static, and dynamic blocks, lazy or\n     greedy parsing, match length filtering, RLE-only, and Huffman-only streams. It performs and compresses\n     approximately as well as zlib.\n\n     Decompression: Use the \"tinfl\" API's. The entire decompressor is implemented as a single function\n     coroutine: see tinfl_decompress(). It supports decompression into a 32KB (or larger power of 2) wrapping buffer, or into a memory\n     block large enough to hold the entire file.\n\n     The low-level tdefl/tinfl API's do not make any use of dynamic memory allocation.\n\n   * zlib-style API notes:\n\n     miniz.c implements a fairly large subset of zlib. There's enough functionality present for it to be a drop-in\n     zlib replacement in many apps:\n        The z_stream struct, optional memory allocation callbacks\n        deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound\n        inflateInit/inflateInit2/inflate/inflateEnd\n        compress, compress2, compressBound, uncompress\n        CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly routines.\n        Supports raw deflate streams or standard zlib streams with adler-32 checking.\n\n     Limitations:\n      The callback API's are not implemented yet. No support for gzip headers or zlib static dictionaries.\n      I've tried to closely emulate zlib's various flavors of stream flushing and return status codes, but\n      there are no guarantees that miniz.c pulls this off perfectly.\n\n   * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function, originally written by\n     Alex Evans. Supports 1-4 bytes/pixel images.\n\n   * ZIP archive API notes:\n\n     The ZIP archive API's where designed with simplicity and efficiency in mind, with just enough abstraction to\n     get the job done with minimal fuss. There are simple API's to retrieve file information, read files from\n     existing archives, create new archives, append new files to existing archives, or clone archive data from\n     one archive to another. It supports archives located in memory or the heap, on disk (using stdio.h),\n     or you can specify custom file read/write callbacks.\n\n     - Archive reading: Just call this function to read a single file from a disk archive:\n\n      void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name,\n        size_t *pSize, mz_uint zip_flags);\n\n     For more complex cases, use the \"mz_zip_reader\" functions. Upon opening an archive, the entire central\n     directory is located and read as-is into memory, and subsequent file access only occurs when reading individual files.\n\n     - Archives file scanning: The simple way is to use this function to scan a loaded archive for a specific file:\n\n     int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags);\n\n     The locate operation can optionally check file comments too, which (as one example) can be used to identify\n     multiple versions of the same file in an archive. This function uses a simple linear search through the central\n     directory, so it's not very fast.\n\n     Alternately, you can iterate through all the files in an archive (using mz_zip_reader_get_num_files()) and\n     retrieve detailed info on each file by calling mz_zip_reader_file_stat().\n\n     - Archive creation: Use the \"mz_zip_writer\" functions. The ZIP writer immediately writes compressed file data\n     to disk and builds an exact image of the central directory in memory. The central directory image is written\n     all at once at the end of the archive file when the archive is finalized.\n\n     The archive writer can optionally align each file's local header and file data to any power of 2 alignment,\n     which can be useful when the archive will be read from optical media. Also, the writer supports placing\n     arbitrary data blobs at the very beginning of ZIP archives. Archives written using either feature are still\n     readable by any ZIP tool.\n\n     - Archive appending: The simple way to add a single file to an archive is to call this function:\n\n      mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name,\n        const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);\n\n     The archive will be created if it doesn't already exist, otherwise it'll be appended to.\n     Note the appending is done in-place and is not an atomic operation, so if something goes wrong\n     during the operation it's possible the archive could be left without a central directory (although the local\n     file headers and file data will be fine, so the archive will be recoverable).\n\n     For more complex archive modification scenarios:\n     1. The safest way is to use a mz_zip_reader to read the existing archive, cloning only those bits you want to\n     preserve into a new archive using using the mz_zip_writer_add_from_zip_reader() function (which compiles the\n     compressed file data as-is). When you're done, delete the old archive and rename the newly written archive, and\n     you're done. This is safe but requires a bunch of temporary disk space or heap memory.\n\n     2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using mz_zip_writer_init_from_reader(),\n     append new files as needed, then finalize the archive which will write an updated central directory to the\n     original archive. (This is basically what mz_zip_add_mem_to_archive_file_in_place() does.) There's a\n     possibility that the archive's central directory could be lost with this method if anything goes wrong, though.\n\n     - ZIP archive support limitations:\n     No zip64 or spanning support. Extraction functions can only handle unencrypted, stored or deflated files.\n     Requires streams capable of seeking.\n\n   * This is a header file library, like stb_image.c. To get only a header file, either cut and paste the\n     below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then include miniz.c from it.\n\n   * Important: For best perf. be sure to customize the below macros for your target platform:\n     #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1\n     #define MINIZ_LITTLE_ENDIAN 1\n     #define MINIZ_HAS_64BIT_REGISTERS 1\n\n   * On platforms using glibc, Be sure to \"#define _LARGEFILE64_SOURCE 1\" before including miniz.c to ensure miniz\n     uses the 64-bit variants: fopen64(), stat64(), etc. Otherwise you won't be able to process large files\n     (i.e. 32-bit stat() fails for me on files > 0x7FFFFFFF bytes).\n*/\n\n#ifndef MINIZ_HEADER_INCLUDED\n#define MINIZ_HEADER_INCLUDED\n\n#include <stdlib.h>\n\n// Defines to completely disable specific portions of miniz.c:\n// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl.\n\n// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O.\n#define MINIZ_NO_STDIO\n\n// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or\n// get/set file times, and the C run-time funcs that get/set times won't be called.\n// The current downside is the times written to your archives will be from 1979.\n#define MINIZ_NO_TIME\n\n// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's.\n#define MINIZ_NO_ARCHIVE_APIS\n\n// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's.\n#define MINIZ_NO_ARCHIVE_WRITING_APIS\n\n// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's.\n//#define MINIZ_NO_ZLIB_APIS\n\n// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib.\n//#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES\n\n// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc.\n// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc\n// callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user\n// functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work.\n//#define MINIZ_NO_MALLOC\n\n#if defined(__TINYC__) && (defined(__linux) || defined(__linux__))\n  // TODO: Work around \"error: include file 'sys\\utime.h' when compiling with tcc on Linux\n  #define MINIZ_NO_TIME\n#endif\n\n#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS)\n  #include <time.h>\n#endif\n\n#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__)\n// MINIZ_X86_OR_X64_CPU is only used to help set the below macros.\n#define MINIZ_X86_OR_X64_CPU 1\n#endif\n\n#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU\n// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian.\n#define MINIZ_LITTLE_ENDIAN 1\n#endif\n\n#if MINIZ_X86_OR_X64_CPU\n// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses.\n#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1\n#endif\n\n#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__)\n// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions).\n#define MINIZ_HAS_64BIT_REGISTERS 1\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// ------------------- zlib-style API Definitions.\n\n// For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits!\ntypedef unsigned long mz_ulong;\n\n// mz_free() internally uses the MZ_FREE() macro (which by default calls free() unless you've modified the MZ_MALLOC macro) to release a block allocated from the heap.\nvoid mz_free(void *p);\n\n#define MZ_ADLER32_INIT (1)\n// mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL.\nmz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len);\n\n#define MZ_CRC32_INIT (0)\n// mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL.\nmz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len);\n\n// Compression strategies.\nenum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 };\n\n// Method\n#define MZ_DEFLATED 8\n\n#ifndef MINIZ_NO_ZLIB_APIS\n\n// Heap allocation callbacks.\n// Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long.\ntypedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size);\ntypedef void (*mz_free_func)(void *opaque, void *address);\ntypedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size);\n\n#define MZ_VERSION          \"9.1.15\"\n#define MZ_VERNUM           0x91F0\n#define MZ_VER_MAJOR        9\n#define MZ_VER_MINOR        1\n#define MZ_VER_REVISION     15\n#define MZ_VER_SUBREVISION  0\n\n// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs).\nenum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 };\n\n// Return status codes. MZ_PARAM_ERROR is non-standard.\nenum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 };\n\n// Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL.\nenum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 };\n\n// Window bits\n#define MZ_DEFAULT_WINDOW_BITS 15\n\nstruct mz_internal_state;\n\n// Compression/decompression stream struct.\ntypedef struct mz_stream_s\n{\n  const unsigned char *next_in;     // pointer to next byte to read\n  unsigned int avail_in;            // number of bytes available at next_in\n  mz_ulong total_in;                // total number of bytes consumed so far\n\n  unsigned char *next_out;          // pointer to next byte to write\n  unsigned int avail_out;           // number of bytes that can be written to next_out\n  mz_ulong total_out;               // total number of bytes produced so far\n\n  char *msg;                        // error msg (unused)\n  struct mz_internal_state *state;  // internal state, allocated by zalloc/zfree\n\n  mz_alloc_func zalloc;             // optional heap allocation function (defaults to malloc)\n  mz_free_func zfree;               // optional heap free function (defaults to free)\n  void *opaque;                     // heap alloc function user pointer\n\n  int data_type;                    // data_type (unused)\n  mz_ulong adler;                   // adler32 of the source or uncompressed data\n  mz_ulong reserved;                // not used\n} mz_stream;\n\ntypedef mz_stream *mz_streamp;\n\n// Returns the version string of miniz.c.\nconst char *mz_version(void);\n\n// mz_deflateInit() initializes a compressor with default options:\n// Parameters:\n//  pStream must point to an initialized mz_stream struct.\n//  level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION].\n//  level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio.\n//  (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.)\n// Return values:\n//  MZ_OK on success.\n//  MZ_STREAM_ERROR if the stream is bogus.\n//  MZ_PARAM_ERROR if the input parameters are bogus.\n//  MZ_MEM_ERROR on out of memory.\nint mz_deflateInit(mz_streamp pStream, int level);\n\n// mz_deflateInit2() is like mz_deflate(), except with more control:\n// Additional parameters:\n//   method must be MZ_DEFLATED\n//   window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer)\n//   mem_level must be between [1, 9] (it's checked but ignored by miniz.c)\nint mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy);\n\n// Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2().\nint mz_deflateReset(mz_streamp pStream);\n\n// mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible.\n// Parameters:\n//   pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members.\n//   flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH.\n// Return values:\n//   MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full).\n//   MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore.\n//   MZ_STREAM_ERROR if the stream is bogus.\n//   MZ_PARAM_ERROR if one of the parameters is invalid.\n//   MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.)\nint mz_deflate(mz_streamp pStream, int flush);\n\n// mz_deflateEnd() deinitializes a compressor:\n// Return values:\n//  MZ_OK on success.\n//  MZ_STREAM_ERROR if the stream is bogus.\nint mz_deflateEnd(mz_streamp pStream);\n\n// mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH.\nmz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len);\n\n// Single-call compression functions mz_compress() and mz_compress2():\n// Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure.\nint mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len);\nint mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level);\n\n// mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress().\nmz_ulong mz_compressBound(mz_ulong source_len);\n\n// Initializes a decompressor.\nint mz_inflateInit(mz_streamp pStream);\n\n// mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer:\n// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate).\nint mz_inflateInit2(mz_streamp pStream, int window_bits);\n\n// Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible.\n// Parameters:\n//   pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members.\n//   flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH.\n//   On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster).\n//   MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data.\n// Return values:\n//   MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full.\n//   MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified.\n//   MZ_STREAM_ERROR if the stream is bogus.\n//   MZ_DATA_ERROR if the deflate stream is invalid.\n//   MZ_PARAM_ERROR if one of the parameters is invalid.\n//   MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again\n//   with more input data, or with more room in the output buffer (except when using single call decompression, described above).\nint mz_inflate(mz_streamp pStream, int flush);\n\n// Deinitializes a decompressor.\nint mz_inflateEnd(mz_streamp pStream);\n\n// Single-call decompression.\n// Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure.\nint mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len);\n\n// Returns a string description of the specified error code, or NULL if the error code is invalid.\nconst char *mz_error(int err);\n\n// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports.\n// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project.\n#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES\n  typedef unsigned char Byte;\n  typedef unsigned int uInt;\n  typedef mz_ulong uLong;\n  typedef Byte Bytef;\n  typedef uInt uIntf;\n  typedef char charf;\n  typedef int intf;\n  typedef void *voidpf;\n  typedef uLong uLongf;\n  typedef void *voidp;\n  typedef void *const voidpc;\n  #define Z_NULL                0\n  #define Z_NO_FLUSH            MZ_NO_FLUSH\n  #define Z_PARTIAL_FLUSH       MZ_PARTIAL_FLUSH\n  #define Z_SYNC_FLUSH          MZ_SYNC_FLUSH\n  #define Z_FULL_FLUSH          MZ_FULL_FLUSH\n  #define Z_FINISH              MZ_FINISH\n  #define Z_BLOCK               MZ_BLOCK\n  #define Z_OK                  MZ_OK\n  #define Z_STREAM_END          MZ_STREAM_END\n  #define Z_NEED_DICT           MZ_NEED_DICT\n  #define Z_ERRNO               MZ_ERRNO\n  #define Z_STREAM_ERROR        MZ_STREAM_ERROR\n  #define Z_DATA_ERROR          MZ_DATA_ERROR\n  #define Z_MEM_ERROR           MZ_MEM_ERROR\n  #define Z_BUF_ERROR           MZ_BUF_ERROR\n  #define Z_VERSION_ERROR       MZ_VERSION_ERROR\n  #define Z_PARAM_ERROR         MZ_PARAM_ERROR\n  #define Z_NO_COMPRESSION      MZ_NO_COMPRESSION\n  #define Z_BEST_SPEED          MZ_BEST_SPEED\n  #define Z_BEST_COMPRESSION    MZ_BEST_COMPRESSION\n  #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION\n  #define Z_DEFAULT_STRATEGY    MZ_DEFAULT_STRATEGY\n  #define Z_FILTERED            MZ_FILTERED\n  #define Z_HUFFMAN_ONLY        MZ_HUFFMAN_ONLY\n  #define Z_RLE                 MZ_RLE\n  #define Z_FIXED               MZ_FIXED\n  #define Z_DEFLATED            MZ_DEFLATED\n  #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS\n  #define alloc_func            mz_alloc_func\n  #define free_func             mz_free_func\n  #define internal_state        mz_internal_state\n  #define z_stream              mz_stream\n  #define deflateInit           mz_deflateInit\n  #define deflateInit2          mz_deflateInit2\n  #define deflateReset          mz_deflateReset\n  #define deflate               mz_deflate\n  #define deflateEnd            mz_deflateEnd\n  #define deflateBound          mz_deflateBound\n  #define compress              mz_compress\n  #define compress2             mz_compress2\n  #define compressBound         mz_compressBound\n  #define inflateInit           mz_inflateInit\n  #define inflateInit2          mz_inflateInit2\n  #define inflate               mz_inflate\n  #define inflateEnd            mz_inflateEnd\n  #define uncompress            mz_uncompress\n  #define crc32                 mz_crc32\n  #define adler32               mz_adler32\n  #define MAX_WBITS             15\n  #define MAX_MEM_LEVEL         9\n  #define zError                mz_error\n  #define ZLIB_VERSION          MZ_VERSION\n  #define ZLIB_VERNUM           MZ_VERNUM\n  #define ZLIB_VER_MAJOR        MZ_VER_MAJOR\n  #define ZLIB_VER_MINOR        MZ_VER_MINOR\n  #define ZLIB_VER_REVISION     MZ_VER_REVISION\n  #define ZLIB_VER_SUBREVISION  MZ_VER_SUBREVISION\n  #define zlibVersion           mz_version\n  #define zlib_version          mz_version()\n#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES\n\n#endif // MINIZ_NO_ZLIB_APIS\n\n// ------------------- Types and macros\n\ntypedef unsigned char mz_uint8;\ntypedef signed short mz_int16;\ntypedef unsigned short mz_uint16;\ntypedef unsigned int mz_uint32;\ntypedef unsigned int mz_uint;\ntypedef long long mz_int64;\ntypedef unsigned long long mz_uint64;\ntypedef int mz_bool;\n\n#define MZ_FALSE (0)\n#define MZ_TRUE (1)\n\n// An attempt to work around MSVC's spammy \"warning C4127: conditional expression is constant\" message.\n#ifdef _MSC_VER\n   #define MZ_MACRO_END while (0, 0)\n#else\n   #define MZ_MACRO_END while (0)\n#endif\n\n// ------------------- ZIP archive reading/writing\n\n#ifndef MINIZ_NO_ARCHIVE_APIS\n\nenum\n{\n  MZ_ZIP_MAX_IO_BUF_SIZE = 64*1024,\n  MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260,\n  MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256\n};\n\ntypedef struct\n{\n  mz_uint32 m_file_index;\n  mz_uint32 m_central_dir_ofs;\n  mz_uint16 m_version_made_by;\n  mz_uint16 m_version_needed;\n  mz_uint16 m_bit_flag;\n  mz_uint16 m_method;\n#ifndef MINIZ_NO_TIME\n  time_t m_time;\n#endif\n  mz_uint32 m_crc32;\n  mz_uint64 m_comp_size;\n  mz_uint64 m_uncomp_size;\n  mz_uint16 m_internal_attr;\n  mz_uint32 m_external_attr;\n  mz_uint64 m_local_header_ofs;\n  mz_uint32 m_comment_size;\n  char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE];\n  char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE];\n} mz_zip_archive_file_stat;\n\ntypedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n);\ntypedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n);\n\nstruct mz_zip_internal_state_tag;\ntypedef struct mz_zip_internal_state_tag mz_zip_internal_state;\n\ntypedef enum\n{\n  MZ_ZIP_MODE_INVALID = 0,\n  MZ_ZIP_MODE_READING = 1,\n  MZ_ZIP_MODE_WRITING = 2,\n  MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3\n} mz_zip_mode;\n\ntypedef struct mz_zip_archive_tag\n{\n  mz_uint64 m_archive_size;\n  mz_uint64 m_central_directory_file_ofs;\n  mz_uint m_total_files;\n  mz_zip_mode m_zip_mode;\n\n  mz_uint m_file_offset_alignment;\n\n  mz_alloc_func m_pAlloc;\n  mz_free_func m_pFree;\n  mz_realloc_func m_pRealloc;\n  void *m_pAlloc_opaque;\n\n  mz_file_read_func m_pRead;\n  mz_file_write_func m_pWrite;\n  void *m_pIO_opaque;\n\n  mz_zip_internal_state *m_pState;\n\n} mz_zip_archive;\n\ntypedef enum\n{\n  MZ_ZIP_FLAG_CASE_SENSITIVE                = 0x0100,\n  MZ_ZIP_FLAG_IGNORE_PATH                   = 0x0200,\n  MZ_ZIP_FLAG_COMPRESSED_DATA               = 0x0400,\n  MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800\n} mz_zip_flags;\n\n// ZIP archive reading\n\n// Inits a ZIP archive reader.\n// These functions read and validate the archive's central directory.\nmz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags);\nmz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags);\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags);\n#endif\n\n// Returns the total number of files in the archive.\nmz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip);\n\n// Returns detailed information about an archive file entry.\nmz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat);\n\n// Determines if an archive file entry is a directory entry.\nmz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index);\nmz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index);\n\n// Retrieves the filename of an archive file entry.\n// Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function returns the number of bytes needed to fully store the filename.\nmz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size);\n\n// Attempts to locates a file in the archive's central directory.\n// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH\n// Returns -1 if the file cannot be found.\nint mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags);\n\n// Extracts a archive file to a memory buffer using no memory allocation.\nmz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);\nmz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);\n\n// Extracts a archive file to a memory buffer.\nmz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags);\nmz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags);\n\n// Extracts a archive file to a dynamically allocated heap buffer.\nvoid *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags);\nvoid *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags);\n\n// Extracts a archive file using a callback function to output the file's data.\nmz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags);\nmz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags);\n\n#ifndef MINIZ_NO_STDIO\n// Extracts a archive file to a disk file and sets its last accessed and modified times.\n// This function only extracts files, not archive directory records.\nmz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags);\nmz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags);\n#endif\n\n// Ends archive reading, freeing all allocations, and closing the input archive file if mz_zip_reader_init_file() was used.\nmz_bool mz_zip_reader_end(mz_zip_archive *pZip);\n\n// ZIP archive writing\n\n#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\n// Inits a ZIP archive writer.\nmz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size);\nmz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size);\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning);\n#endif\n\n// Converts a ZIP archive reader object into a writer object, to allow efficient in-place file appends to occur on an existing archive.\n// For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called.\n// For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the realloc callback (which defaults to realloc unless you've overridden it).\n// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided m_pWrite function cannot be NULL.\n// Note: In-place archive modification is not recommended unless you know what you're doing, because if execution stops or something goes wrong before\n// the archive is finalized the file's central directory will be hosed.\nmz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename);\n\n// Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive.\n// To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer.\n// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION.\nmz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags);\nmz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32);\n\n#ifndef MINIZ_NO_STDIO\n// Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive.\n// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION.\nmz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);\n#endif\n\n// Adds a file to an archive by fully cloning the data from another archive.\n// This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data, and comment fields.\nmz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index);\n\n// Finalizes the archive by writing the central directory records followed by the end of central directory record.\n// After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end().\n// An archive must be manually finalized by calling this function for it to be valid.\nmz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip);\nmz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize);\n\n// Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used.\n// Note for the archive to be valid, it must have been finalized before ending.\nmz_bool mz_zip_writer_end(mz_zip_archive *pZip);\n\n// Misc. high-level helper functions:\n\n// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob to a ZIP archive.\n// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION.\nmz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);\n\n// Reads a single file from an archive into a heap block.\n// Returns NULL on failure.\nvoid *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags);\n\n#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\n#endif // #ifndef MINIZ_NO_ARCHIVE_APIS\n\n// ------------------- Low-level Decompression API Definitions\n\n// Decompression flags used by tinfl_decompress().\n// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream.\n// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input.\n// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB).\n// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes.\nenum\n{\n  TINFL_FLAG_PARSE_ZLIB_HEADER = 1,\n  TINFL_FLAG_HAS_MORE_INPUT = 2,\n  TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4,\n  TINFL_FLAG_COMPUTE_ADLER32 = 8\n};\n\n// High level decompression functions:\n// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc().\n// On entry:\n//  pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress.\n// On return:\n//  Function returns a pointer to the decompressed data, or NULL on failure.\n//  *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data.\n//  The caller must call mz_free() on the returned block when it's no longer needed.\nvoid *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);\n\n// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory.\n// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success.\n#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1))\nsize_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);\n\n// tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer.\n// Returns 1 on success or 0 on failure.\ntypedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser);\nint tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);\n\nstruct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor;\n\n// Max size of LZ dictionary.\n#define TINFL_LZ_DICT_SIZE 32768\n\n// Return status.\ntypedef enum\n{\n  TINFL_STATUS_BAD_PARAM = -3,\n  TINFL_STATUS_ADLER32_MISMATCH = -2,\n  TINFL_STATUS_FAILED = -1,\n  TINFL_STATUS_DONE = 0,\n  TINFL_STATUS_NEEDS_MORE_INPUT = 1,\n  TINFL_STATUS_HAS_MORE_OUTPUT = 2\n} tinfl_status;\n\n// Initializes the decompressor to its initial state.\n#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END\n#define tinfl_get_adler32(r) (r)->m_check_adler32\n\n// Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability.\n// This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output.\ntinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags);\n\n// Internal/private bits follow.\nenum\n{\n  TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19,\n  TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS\n};\n\ntypedef struct\n{\n  mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];\n  mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];\n} tinfl_huff_table;\n\n#if MINIZ_HAS_64BIT_REGISTERS\n  #define TINFL_USE_64BIT_BITBUF 1\n#endif\n\n#if TINFL_USE_64BIT_BITBUF\n  typedef mz_uint64 tinfl_bit_buf_t;\n  #define TINFL_BITBUF_SIZE (64)\n#else\n  typedef mz_uint32 tinfl_bit_buf_t;\n  #define TINFL_BITBUF_SIZE (32)\n#endif\n\nstruct tinfl_decompressor_tag\n{\n  mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES];\n  tinfl_bit_buf_t m_bit_buf;\n  size_t m_dist_from_out_buf_start;\n  tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];\n  mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];\n};\n\n// ------------------- Low-level Compression API Definitions\n\n// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently).\n#define TDEFL_LESS_MEMORY 0\n\n// tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search):\n// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression).\nenum\n{\n  TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF\n};\n\n// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data.\n// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers).\n// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing.\n// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory).\n// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1)\n// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled.\n// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables.\n// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks.\n// The low 12 bits are reserved to control the max # of hash probes per dictionary lookup (see TDEFL_MAX_PROBES_MASK).\nenum\n{\n  TDEFL_WRITE_ZLIB_HEADER             = 0x01000,\n  TDEFL_COMPUTE_ADLER32               = 0x02000,\n  TDEFL_GREEDY_PARSING_FLAG           = 0x04000,\n  TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000,\n  TDEFL_RLE_MATCHES                   = 0x10000,\n  TDEFL_FILTER_MATCHES                = 0x20000,\n  TDEFL_FORCE_ALL_STATIC_BLOCKS       = 0x40000,\n  TDEFL_FORCE_ALL_RAW_BLOCKS          = 0x80000\n};\n\n// High level compression functions:\n// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc().\n// On entry:\n//  pSrc_buf, src_buf_len: Pointer and size of source block to compress.\n//  flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression.\n// On return:\n//  Function returns a pointer to the compressed data, or NULL on failure.\n//  *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data.\n//  The caller must free() the returned block when it's no longer needed.\nvoid *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);\n\n// tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory.\n// Returns 0 on failure.\nsize_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);\n\n// Compresses an image to a compressed PNG file in memory.\n// On entry:\n//  pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. \n//  The image pitch in bytes per scanline will be w*num_chans. The leftmost pixel on the top scanline is stored first in memory.\n//  level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL\n//  If flip is true, the image will be flipped on the Y axis (useful for OpenGL apps).\n// On return:\n//  Function returns a pointer to the compressed data, or NULL on failure.\n//  *pLen_out will be set to the size of the PNG image file.\n//  The caller must mz_free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed.\nvoid *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip);\nvoid *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out);\n\n// Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time.\ntypedef mz_bool (*tdefl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser);\n\n// tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally.\nmz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);\n\nenum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 };\n\n// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes).\n#if TDEFL_LESS_MEMORY\nenum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS };\n#else\nenum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS };\n#endif\n\n// The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions.\ntypedef enum\n{\n  TDEFL_STATUS_BAD_PARAM = -2,\n  TDEFL_STATUS_PUT_BUF_FAILED = -1,\n  TDEFL_STATUS_OKAY = 0,\n  TDEFL_STATUS_DONE = 1,\n} tdefl_status;\n\n// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums\ntypedef enum\n{\n  TDEFL_NO_FLUSH = 0,\n  TDEFL_SYNC_FLUSH = 2,\n  TDEFL_FULL_FLUSH = 3,\n  TDEFL_FINISH = 4\n} tdefl_flush;\n\n// tdefl's compression state structure.\ntypedef struct\n{\n  tdefl_put_buf_func_ptr m_pPut_buf_func;\n  void *m_pPut_buf_user;\n  mz_uint m_flags, m_max_probes[2];\n  int m_greedy_parsing;\n  mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size;\n  mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end;\n  mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer;\n  mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish;\n  tdefl_status m_prev_return_status;\n  const void *m_pIn_buf;\n  void *m_pOut_buf;\n  size_t *m_pIn_buf_size, *m_pOut_buf_size;\n  tdefl_flush m_flush;\n  const mz_uint8 *m_pSrc;\n  size_t m_src_buf_left, m_out_buf_ofs;\n  mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1];\n  mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];\n  mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];\n  mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];\n  mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE];\n  mz_uint16 m_next[TDEFL_LZ_DICT_SIZE];\n  mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE];\n  mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE];\n} tdefl_compressor;\n\n// Initializes the compressor.\n// There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory.\n// pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression.\n// If pBut_buf_func is NULL the user should always call the tdefl_compress() API.\n// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.)\ntdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);\n\n// Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible.\ntdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush);\n\n// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr.\n// tdefl_compress_buffer() always consumes the entire input buffer.\ntdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush);\n\ntdefl_status tdefl_get_prev_return_status(tdefl_compressor *d);\nmz_uint32 tdefl_get_adler32(tdefl_compressor *d);\n\n// Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't defined, because it uses some of its macros.\n#ifndef MINIZ_NO_ZLIB_APIS\n// Create tdefl_compress() flags given zlib-style compression parameters.\n// level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files)\n// window_bits may be -15 (raw deflate) or 15 (zlib)\n// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED\nmz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy);\n#endif // #ifndef MINIZ_NO_ZLIB_APIS\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // MINIZ_HEADER_INCLUDED\n\n// ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.)\n\n#ifndef MINIZ_HEADER_FILE_ONLY\n\ntypedef unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 : -1];\ntypedef unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 : -1];\ntypedef unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 : -1];\n\n#include <string.h>\n#include <assert.h>\n\n#define MZ_ASSERT(x) assert(x)\n\n#ifdef MINIZ_NO_MALLOC\n  #define MZ_MALLOC(x) NULL\n  #define MZ_FREE(x) (void)x, ((void)0)\n  #define MZ_REALLOC(p, x) NULL\n#else\n  #define MZ_MALLOC(x) malloc(x)\n  #define MZ_FREE(x) free(x)\n  #define MZ_REALLOC(p, x) realloc(p, x)\n#endif\n\n#define MZ_MAX(a,b) (((a)>(b))?(a):(b))\n#define MZ_MIN(a,b) (((a)<(b))?(a):(b))\n#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n  #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))\n  #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))\n#else\n  #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))\n  #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))\n#endif\n\n#ifdef _MSC_VER\n  #define MZ_FORCEINLINE __forceinline\n#elif defined(__GNUC__)\n  #define MZ_FORCEINLINE inline __attribute__((__always_inline__))\n#else\n  #define MZ_FORCEINLINE inline\n#endif\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n// ------------------- zlib-style API's\n\nmz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len)\n{\n  mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); size_t block_len = buf_len % 5552;\n  if (!ptr) return MZ_ADLER32_INIT;\n  while (buf_len) {\n    for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {\n      s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;\n      s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;\n    }\n    for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;\n    s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;\n  }\n  return (s2 << 16) + s1;\n}\n\n// Karl Malbrain's compact CRC-32. See \"A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed\": http://www.geocities.com/malbrain/\nmz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len)\n{\n  static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,\n    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c };\n  mz_uint32 crcu32 = (mz_uint32)crc;\n  if (!ptr) return MZ_CRC32_INIT;\n  crcu32 = ~crcu32; while (buf_len--) { mz_uint8 b = *ptr++; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; }\n  return ~crcu32;\n}\n\nvoid mz_free(void *p)\n{\n  MZ_FREE(p);\n}\n\n#ifndef MINIZ_NO_ZLIB_APIS\n\nstatic void *def_alloc_func(void *opaque, size_t items, size_t size) { (void)opaque, (void)items, (void)size; return MZ_MALLOC(items * size); }\nstatic void def_free_func(void *opaque, void *address) { (void)opaque, (void)address; MZ_FREE(address); }\nstatic void *def_realloc_func(void *opaque, void *address, size_t items, size_t size) { (void)opaque, (void)address, (void)items, (void)size; return MZ_REALLOC(address, items * size); }\n\nconst char *mz_version(void)\n{\n  return MZ_VERSION;\n}\n\nint mz_deflateInit(mz_streamp pStream, int level)\n{\n  return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY);\n}\n\nint mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy)\n{\n  tdefl_compressor *pComp;\n  mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy);\n\n  if (!pStream) return MZ_STREAM_ERROR;\n  if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) return MZ_PARAM_ERROR;\n\n  pStream->data_type = 0;\n  pStream->adler = MZ_ADLER32_INIT;\n  pStream->msg = NULL;\n  pStream->reserved = 0;\n  pStream->total_in = 0;\n  pStream->total_out = 0;\n  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;\n  if (!pStream->zfree) pStream->zfree = def_free_func;\n\n  pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor));\n  if (!pComp)\n    return MZ_MEM_ERROR;\n\n  pStream->state = (struct mz_internal_state *)pComp;\n\n  if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY)\n  {\n    mz_deflateEnd(pStream);\n    return MZ_PARAM_ERROR;\n  }\n\n  return MZ_OK;\n}\n\nint mz_deflateReset(mz_streamp pStream)\n{\n  if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) return MZ_STREAM_ERROR;\n  pStream->total_in = pStream->total_out = 0;\n  tdefl_init((tdefl_compressor*)pStream->state, NULL, NULL, ((tdefl_compressor*)pStream->state)->m_flags);\n  return MZ_OK;\n}\n\nint mz_deflate(mz_streamp pStream, int flush)\n{\n  size_t in_bytes, out_bytes;\n  mz_ulong orig_total_in, orig_total_out;\n  int mz_status = MZ_OK;\n\n  if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) return MZ_STREAM_ERROR;\n  if (!pStream->avail_out) return MZ_BUF_ERROR;\n\n  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;\n\n  if (((tdefl_compressor*)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE)\n    return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR;\n\n  orig_total_in = pStream->total_in; orig_total_out = pStream->total_out;\n  for ( ; ; )\n  {\n    tdefl_status defl_status;\n    in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;\n\n    defl_status = tdefl_compress((tdefl_compressor*)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush);\n    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;\n    pStream->total_in += (mz_uint)in_bytes; pStream->adler = tdefl_get_adler32((tdefl_compressor*)pStream->state);\n\n    pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes;\n    pStream->total_out += (mz_uint)out_bytes;\n\n    if (defl_status < 0)\n    {\n      mz_status = MZ_STREAM_ERROR;\n      break;\n    }\n    else if (defl_status == TDEFL_STATUS_DONE)\n    {\n      mz_status = MZ_STREAM_END;\n      break;\n    }\n    else if (!pStream->avail_out)\n      break;\n    else if ((!pStream->avail_in) && (flush != MZ_FINISH))\n    {\n      if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out))\n        break;\n      return MZ_BUF_ERROR; // Can't make forward progress without some input.\n    }\n  }\n  return mz_status;\n}\n\nint mz_deflateEnd(mz_streamp pStream)\n{\n  if (!pStream) return MZ_STREAM_ERROR;\n  if (pStream->state)\n  {\n    pStream->zfree(pStream->opaque, pStream->state);\n    pStream->state = NULL;\n  }\n  return MZ_OK;\n}\n\nmz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len)\n{\n  (void)pStream;\n  // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.)\n  return MZ_MAX(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5);\n}\n\nint mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level)\n{\n  int status;\n  mz_stream stream;\n  memset(&stream, 0, sizeof(stream));\n\n  // In case mz_ulong is 64-bits (argh I hate longs).\n  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;\n\n  stream.next_in = pSource;\n  stream.avail_in = (mz_uint32)source_len;\n  stream.next_out = pDest;\n  stream.avail_out = (mz_uint32)*pDest_len;\n\n  status = mz_deflateInit(&stream, level);\n  if (status != MZ_OK) return status;\n\n  status = mz_deflate(&stream, MZ_FINISH);\n  if (status != MZ_STREAM_END)\n  {\n    mz_deflateEnd(&stream);\n    return (status == MZ_OK) ? MZ_BUF_ERROR : status;\n  }\n\n  *pDest_len = stream.total_out;\n  return mz_deflateEnd(&stream);\n}\n\nint mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)\n{\n  return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION);\n}\n\nmz_ulong mz_compressBound(mz_ulong source_len)\n{\n  return mz_deflateBound(NULL, source_len);\n}\n\ntypedef struct\n{\n  tinfl_decompressor m_decomp;\n  mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits;\n  mz_uint8 m_dict[TINFL_LZ_DICT_SIZE];\n  tinfl_status m_last_status;\n} inflate_state;\n\nint mz_inflateInit2(mz_streamp pStream, int window_bits)\n{\n  inflate_state *pDecomp;\n  if (!pStream) return MZ_STREAM_ERROR;\n  if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR;\n\n  pStream->data_type = 0;\n  pStream->adler = 0;\n  pStream->msg = NULL;\n  pStream->total_in = 0;\n  pStream->total_out = 0;\n  pStream->reserved = 0;\n  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;\n  if (!pStream->zfree) pStream->zfree = def_free_func;\n\n  pDecomp = (inflate_state*)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state));\n  if (!pDecomp) return MZ_MEM_ERROR;\n\n  pStream->state = (struct mz_internal_state *)pDecomp;\n\n  tinfl_init(&pDecomp->m_decomp);\n  pDecomp->m_dict_ofs = 0;\n  pDecomp->m_dict_avail = 0;\n  pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT;\n  pDecomp->m_first_call = 1;\n  pDecomp->m_has_flushed = 0;\n  pDecomp->m_window_bits = window_bits;\n\n  return MZ_OK;\n}\n\nint mz_inflateInit(mz_streamp pStream)\n{\n   return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS);\n}\n\nint mz_inflate(mz_streamp pStream, int flush)\n{\n  inflate_state* pState;\n  mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32;\n  size_t in_bytes, out_bytes, orig_avail_in;\n  tinfl_status status;\n\n  if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR;\n  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;\n  if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;\n\n  pState = (inflate_state*)pStream->state;\n  if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER;\n  orig_avail_in = pStream->avail_in;\n\n  first_call = pState->m_first_call; pState->m_first_call = 0;\n  if (pState->m_last_status < 0) return MZ_DATA_ERROR;\n\n  if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;\n  pState->m_has_flushed |= (flush == MZ_FINISH);\n\n  if ((flush == MZ_FINISH) && (first_call))\n  {\n    // MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file.\n    decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF;\n    in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;\n    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags);\n    pState->m_last_status = status;\n    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes;\n    pStream->adler = tinfl_get_adler32(&pState->m_decomp);\n    pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes;\n\n    if (status < 0)\n      return MZ_DATA_ERROR;\n    else if (status != TINFL_STATUS_DONE)\n    {\n      pState->m_last_status = TINFL_STATUS_FAILED;\n      return MZ_BUF_ERROR;\n    }\n    return MZ_STREAM_END;\n  }\n  // flush != MZ_FINISH then we must assume there's more input.\n  if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT;\n\n  if (pState->m_dict_avail)\n  {\n    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);\n    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);\n    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;\n    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);\n    return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;\n  }\n\n  for ( ; ; )\n  {\n    in_bytes = pStream->avail_in;\n    out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs;\n\n    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags);\n    pState->m_last_status = status;\n\n    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;\n    pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp);\n\n    pState->m_dict_avail = (mz_uint)out_bytes;\n\n    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);\n    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);\n    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;\n    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);\n\n    if (status < 0)\n       return MZ_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well).\n    else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in))\n      return MZ_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH.\n    else if (flush == MZ_FINISH)\n    {\n       // The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH.\n       if (status == TINFL_STATUS_DONE)\n          return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END;\n       // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong.\n       else if (!pStream->avail_out)\n          return MZ_BUF_ERROR;\n    }\n    else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail))\n      break;\n  }\n\n  return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;\n}\n\nint mz_inflateEnd(mz_streamp pStream)\n{\n  if (!pStream)\n    return MZ_STREAM_ERROR;\n  if (pStream->state)\n  {\n    pStream->zfree(pStream->opaque, pStream->state);\n    pStream->state = NULL;\n  }\n  return MZ_OK;\n}\n\nint mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)\n{\n  mz_stream stream;\n  int status;\n  memset(&stream, 0, sizeof(stream));\n\n  // In case mz_ulong is 64-bits (argh I hate longs).\n  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;\n\n  stream.next_in = pSource;\n  stream.avail_in = (mz_uint32)source_len;\n  stream.next_out = pDest;\n  stream.avail_out = (mz_uint32)*pDest_len;\n\n  status = mz_inflateInit(&stream);\n  if (status != MZ_OK)\n    return status;\n\n  status = mz_inflate(&stream, MZ_FINISH);\n  if (status != MZ_STREAM_END)\n  {\n    mz_inflateEnd(&stream);\n    return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status;\n  }\n  *pDest_len = stream.total_out;\n\n  return mz_inflateEnd(&stream);\n}\n\nconst char *mz_error(int err)\n{\n  static struct { int m_err; const char *m_pDesc; } s_error_descs[] =\n  {\n    { MZ_OK, \"\" }, { MZ_STREAM_END, \"stream end\" }, { MZ_NEED_DICT, \"need dictionary\" }, { MZ_ERRNO, \"file error\" }, { MZ_STREAM_ERROR, \"stream error\" },\n    { MZ_DATA_ERROR, \"data error\" }, { MZ_MEM_ERROR, \"out of memory\" }, { MZ_BUF_ERROR, \"buf error\" }, { MZ_VERSION_ERROR, \"version error\" }, { MZ_PARAM_ERROR, \"parameter error\" }\n  };\n  mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc;\n  return NULL;\n}\n\n#endif //MINIZ_NO_ZLIB_APIS\n\n// ------------------- Low-level Decompression (completely independent from all compression API's)\n\n#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)\n#define TINFL_MEMSET(p, c, l) memset(p, c, l)\n\n#define TINFL_CR_BEGIN switch(r->m_state) { case 0:\n#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END\n#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END\n#define TINFL_CR_FINISH }\n\n// TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never\n// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario.\n#define TINFL_GET_BYTE(state_index, c) do { \\\n  if (pIn_buf_cur >= pIn_buf_end) { \\\n    for ( ; ; ) { \\\n      if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \\\n        TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \\\n        if (pIn_buf_cur < pIn_buf_end) { \\\n          c = *pIn_buf_cur++; \\\n          break; \\\n        } \\\n      } else { \\\n        c = 0; \\\n        break; \\\n      } \\\n    } \\\n  } else c = *pIn_buf_cur++; } MZ_MACRO_END\n\n#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n))\n#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END\n#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END\n\n// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2.\n// It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a\n// Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the\n// bit buffer contains >=15 bits (deflate's max. Huffman code size).\n#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \\\n  do { \\\n    temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \\\n    if (temp >= 0) { \\\n      code_len = temp >> 9; \\\n      if ((code_len) && (num_bits >= code_len)) \\\n      break; \\\n    } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \\\n       code_len = TINFL_FAST_LOOKUP_BITS; \\\n       do { \\\n          temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \\\n       } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \\\n    } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \\\n  } while (num_bits < 15);\n\n// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read\n// beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully\n// decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32.\n// The slow path is only executed at the very end of the input buffer.\n#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \\\n  int temp; mz_uint code_len, c; \\\n  if (num_bits < 15) { \\\n    if ((pIn_buf_end - pIn_buf_cur) < 2) { \\\n       TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \\\n    } else { \\\n       bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \\\n    } \\\n  } \\\n  if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \\\n    code_len = temp >> 9, temp &= 511; \\\n  else { \\\n    code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \\\n  } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END\n\ntinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)\n{\n  static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 };\n  static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };\n  static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};\n  static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\n  static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };\n  static const int s_min_table_sizes[3] = { 257, 1, 4 };\n\n  tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf;\n  const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;\n  mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;\n  size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;\n\n  // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter).\n  if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; }\n\n  num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start;\n  TINFL_CR_BEGIN\n\n  bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1;\n  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)\n  {\n    TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1);\n    counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));\n    if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))));\n    if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }\n  }\n\n  do\n  {\n    TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1;\n    if (r->m_type == 0)\n    {\n      TINFL_SKIP_BITS(5, num_bits & 7);\n      for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); }\n      if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); }\n      while ((counter) && (num_bits))\n      {\n        TINFL_GET_BITS(51, dist, 8);\n        while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); }\n        *pOut_buf_cur++ = (mz_uint8)dist;\n        counter--;\n      }\n      while (counter)\n      {\n        size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); }\n        while (pIn_buf_cur >= pIn_buf_end)\n        {\n          if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT)\n          {\n            TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT);\n          }\n          else\n          {\n            TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED);\n          }\n        }\n        n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter);\n        TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n;\n      }\n    }\n    else if (r->m_type == 3)\n    {\n      TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);\n    }\n    else\n    {\n      if (r->m_type == 1)\n      {\n        mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i;\n        r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);\n        for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8;\n      }\n      else\n      {\n        for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], \"\\05\\05\\04\"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; }\n        MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; }\n        r->m_table_sizes[2] = 19;\n      }\n      for ( ; (int)r->m_type >= 0; r->m_type--)\n      {\n        int tree_next, tree_cur; tinfl_huff_table *pTable;\n        mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree);\n        for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++;\n        used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;\n        for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }\n        if ((65536 != total) && (used_syms > 1))\n        {\n          TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);\n        }\n        for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)\n        {\n          mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue;\n          cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);\n          if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; }\n          if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }\n          rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);\n          for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)\n          {\n            tree_cur -= ((rev_code >>= 1) & 1);\n            if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1];\n          }\n          tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;\n        }\n        if (r->m_type == 2)\n        {\n          for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); )\n          {\n            mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; }\n            if ((dist == 16) && (!counter))\n            {\n              TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);\n            }\n            num_extra = \"\\02\\03\\07\"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += \"\\03\\03\\013\"[dist - 16];\n            TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s;\n          }\n          if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter)\n          {\n            TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);\n          }\n          TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);\n        }\n      }\n      for ( ; ; )\n      {\n        mz_uint8 *pSrc;\n        for ( ; ; )\n        {\n          if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))\n          {\n            TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);\n            if (counter >= 256)\n              break;\n            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); }\n            *pOut_buf_cur++ = (mz_uint8)counter;\n          }\n          else\n          {\n            int sym2; mz_uint code_len;\n#if TINFL_USE_64BIT_BITBUF\n            if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; }\n#else\n            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }\n#endif\n            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)\n              code_len = sym2 >> 9;\n            else\n            {\n              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);\n            }\n            counter = sym2; bit_buf >>= code_len; num_bits -= code_len;\n            if (counter & 256)\n              break;\n\n#if !TINFL_USE_64BIT_BITBUF\n            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }\n#endif\n            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)\n              code_len = sym2 >> 9;\n            else\n            {\n              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);\n            }\n            bit_buf >>= code_len; num_bits -= code_len;\n\n            pOut_buf_cur[0] = (mz_uint8)counter;\n            if (sym2 & 256)\n            {\n              pOut_buf_cur++;\n              counter = sym2;\n              break;\n            }\n            pOut_buf_cur[1] = (mz_uint8)sym2;\n            pOut_buf_cur += 2;\n          }\n        }\n        if ((counter &= 511) == 256) break;\n\n        num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];\n        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }\n\n        TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);\n        num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];\n        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }\n\n        dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;\n        if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))\n        {\n          TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);\n        }\n\n        pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);\n\n        if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end)\n        {\n          while (counter--)\n          {\n            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); }\n            *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];\n          }\n          continue;\n        }\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n        else if ((counter >= 9) && (counter <= dist))\n        {\n          const mz_uint8 *pSrc_end = pSrc + (counter & ~7);\n          do\n          {\n            ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];\n            ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];\n            pOut_buf_cur += 8;\n          } while ((pSrc += 8) < pSrc_end);\n          if ((counter &= 7) < 3)\n          {\n            if (counter)\n            {\n              pOut_buf_cur[0] = pSrc[0];\n              if (counter > 1)\n                pOut_buf_cur[1] = pSrc[1];\n              pOut_buf_cur += counter;\n            }\n            continue;\n          }\n        }\n#endif\n        do\n        {\n          pOut_buf_cur[0] = pSrc[0];\n          pOut_buf_cur[1] = pSrc[1];\n          pOut_buf_cur[2] = pSrc[2];\n          pOut_buf_cur += 3; pSrc += 3;\n        } while ((int)(counter -= 3) > 2);\n        if ((int)counter > 0)\n        {\n          pOut_buf_cur[0] = pSrc[0];\n          if ((int)counter > 1)\n            pOut_buf_cur[1] = pSrc[1];\n          pOut_buf_cur += counter;\n        }\n      }\n    }\n  } while (!(r->m_final & 1));\n  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)\n  {\n    TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; }\n  }\n  TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);\n  TINFL_CR_FINISH\n\ncommon_exit:\n  r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start;\n  *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;\n  if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0))\n  {\n    const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size;\n    mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552;\n    while (buf_len)\n    {\n      for (i = 0; i + 7 < block_len; i += 8, ptr += 8)\n      {\n        s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;\n        s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;\n      }\n      for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;\n      s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;\n    }\n    r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH;\n  }\n  return status;\n}\n\n// Higher level helper functions.\nvoid *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)\n{\n  tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0;\n  *pOut_len = 0;\n  tinfl_init(&decomp);\n  for ( ; ; )\n  {\n    size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;\n    tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size,\n      (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);\n    if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT))\n    {\n      MZ_FREE(pBuf); *pOut_len = 0; return NULL;\n    }\n    src_buf_ofs += src_buf_size;\n    *pOut_len += dst_buf_size;\n    if (status == TINFL_STATUS_DONE) break;\n    new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128;\n    pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity);\n    if (!pNew_buf)\n    {\n      MZ_FREE(pBuf); *pOut_len = 0; return NULL;\n    }\n    pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity;\n  }\n  return pBuf;\n}\n\nsize_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)\n{\n  tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp);\n  status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);\n  return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len;\n}\n\nint tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)\n{\n  int result = 0;\n  tinfl_decompressor decomp;\n  mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0;\n  if (!pDict)\n    return TINFL_STATUS_FAILED;\n  tinfl_init(&decomp);\n  for ( ; ; )\n  {\n    size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs;\n    tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,\n      (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));\n    in_buf_ofs += in_buf_size;\n    if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))\n      break;\n    if (status != TINFL_STATUS_HAS_MORE_OUTPUT)\n    {\n      result = (status == TINFL_STATUS_DONE);\n      break;\n    }\n    dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1);\n  }\n  MZ_FREE(pDict);\n  *pIn_buf_size = in_buf_ofs;\n  return result;\n}\n\n// ------------------- Low-level Compression (independent from all decompression API's)\n\n// Purposely making these tables static for faster init and thread safety.\nstatic const mz_uint16 s_tdefl_len_sym[256] = {\n  257,258,259,260,261,262,263,264,265,265,266,266,267,267,268,268,269,269,269,269,270,270,270,270,271,271,271,271,272,272,272,272,\n  273,273,273,273,273,273,273,273,274,274,274,274,274,274,274,274,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,276,\n  277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,\n  279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,\n  281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,\n  282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,\n  283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,\n  284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,285 };\n\nstatic const mz_uint8 s_tdefl_len_extra[256] = {\n  0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,\n  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\n  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,\n  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0 };\n\nstatic const mz_uint8 s_tdefl_small_dist_sym[512] = {\n  0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,\n  11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,\n  13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,\n  14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,\n  14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,\n  15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,\n  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17 };\n\nstatic const mz_uint8 s_tdefl_small_dist_extra[512] = {\n  0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,\n  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7 };\n\nstatic const mz_uint8 s_tdefl_large_dist_sym[128] = {\n  0,0,18,19,20,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,\n  26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,\n  28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29 };\n\nstatic const mz_uint8 s_tdefl_large_dist_extra[128] = {\n  0,0,8,8,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,\n  12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,\n  13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 };\n\n// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values.\ntypedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq;\nstatic tdefl_sym_freq* tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq* pSyms0, tdefl_sym_freq* pSyms1)\n{\n  mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; tdefl_sym_freq* pCur_syms = pSyms0, *pNew_syms = pSyms1; MZ_CLEAR_OBJ(hist);\n  for (i = 0; i < num_syms; i++) { mz_uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; }\n  while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--;\n  for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8)\n  {\n    const mz_uint32* pHist = &hist[pass << 8];\n    mz_uint offsets[256], cur_ofs = 0;\n    for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; }\n    for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i];\n    { tdefl_sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; }\n  }\n  return pCur_syms;\n}\n\n// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996.\nstatic void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n)\n{\n  int root, leaf, next, avbl, used, dpth;\n  if (n==0) return; else if (n==1) { A[0].m_key = 1; return; }\n  A[0].m_key += A[1].m_key; root = 0; leaf = 2;\n  for (next=1; next < n-1; next++)\n  {\n    if (leaf>=n || A[root].m_key<A[leaf].m_key) { A[next].m_key = A[root].m_key; A[root++].m_key = (mz_uint16)next; } else A[next].m_key = A[leaf++].m_key;\n    if (leaf>=n || (root<next && A[root].m_key<A[leaf].m_key)) { A[next].m_key = (mz_uint16)(A[next].m_key + A[root].m_key); A[root++].m_key = (mz_uint16)next; } else A[next].m_key = (mz_uint16)(A[next].m_key + A[leaf++].m_key);\n  }\n  A[n-2].m_key = 0; for (next=n-3; next>=0; next--) A[next].m_key = A[A[next].m_key].m_key+1;\n  avbl = 1; used = dpth = 0; root = n-2; next = n-1;\n  while (avbl>0)\n  {\n    while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; }\n    while (avbl>used) { A[next--].m_key = (mz_uint16)(dpth); avbl--; }\n    avbl = 2*used; dpth++; used = 0;\n  }\n}\n\n// Limits canonical Huffman code table's max code size.\nenum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 };\nstatic void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size)\n{\n  int i; mz_uint32 total = 0; if (code_list_len <= 1) return;\n  for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i];\n  for (i = max_code_size; i > 0; i--) total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i));\n  while (total != (1UL << max_code_size))\n  {\n    pNum_codes[max_code_size]--;\n    for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; }\n    total--;\n  }\n}\n\nstatic void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table)\n{\n  int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; MZ_CLEAR_OBJ(num_codes);\n  if (static_table)\n  {\n    for (i = 0; i < table_len; i++) num_codes[d->m_huff_code_sizes[table_num][i]]++;\n  }\n  else\n  {\n    tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], *pSyms;\n    int num_used_syms = 0;\n    const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0];\n    for (i = 0; i < table_len; i++) if (pSym_count[i]) { syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; syms0[num_used_syms++].m_sym_index = (mz_uint16)i; }\n\n    pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms);\n\n    for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++;\n\n    tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit);\n\n    MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); MZ_CLEAR_OBJ(d->m_huff_codes[table_num]);\n    for (i = 1, j = num_used_syms; i <= code_size_limit; i++)\n      for (l = num_codes[i]; l > 0; l--) d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i);\n  }\n\n  next_code[1] = 0; for (j = 0, i = 2; i <= code_size_limit; i++) next_code[i] = j = ((j + num_codes[i - 1]) << 1);\n\n  for (i = 0; i < table_len; i++)\n  {\n    mz_uint rev_code = 0, code, code_size; if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue;\n    code = next_code[code_size]++; for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1);\n    d->m_huff_codes[table_num][i] = (mz_uint16)rev_code;\n  }\n}\n\n#define TDEFL_PUT_BITS(b, l) do { \\\n  mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \\\n  d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \\\n  while (d->m_bits_in >= 8) { \\\n    if (d->m_pOutput_buf < d->m_pOutput_buf_end) \\\n      *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \\\n      d->m_bit_buffer >>= 8; \\\n      d->m_bits_in -= 8; \\\n  } \\\n} MZ_MACRO_END\n\n#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \\\n  if (rle_repeat_count < 3) { \\\n    d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \\\n    while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \\\n  } else { \\\n    d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \\\n} rle_repeat_count = 0; } }\n\n#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \\\n  if (rle_z_count < 3) { \\\n    d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \\\n  } else if (rle_z_count <= 10) { \\\n    d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \\\n  } else { \\\n    d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \\\n} rle_z_count = 0; } }\n\nstatic mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };\n\nstatic void tdefl_start_dynamic_block(tdefl_compressor *d)\n{\n  int num_lit_codes, num_dist_codes, num_bit_lengths; mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index;\n  mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF;\n\n  d->m_huff_count[0][256] = 1;\n\n  tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE);\n  tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE);\n\n  for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break;\n  for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break;\n\n  memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes);\n  memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes);\n  total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0;\n\n  memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2);\n  for (i = 0; i < total_code_sizes_to_pack; i++)\n  {\n    mz_uint8 code_size = code_sizes_to_pack[i];\n    if (!code_size)\n    {\n      TDEFL_RLE_PREV_CODE_SIZE();\n      if (++rle_z_count == 138) { TDEFL_RLE_ZERO_CODE_SIZE(); }\n    }\n    else\n    {\n      TDEFL_RLE_ZERO_CODE_SIZE();\n      if (code_size != prev_code_size)\n      {\n        TDEFL_RLE_PREV_CODE_SIZE();\n        d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); packed_code_sizes[num_packed_code_sizes++] = code_size;\n      }\n      else if (++rle_repeat_count == 6)\n      {\n        TDEFL_RLE_PREV_CODE_SIZE();\n      }\n    }\n    prev_code_size = code_size;\n  }\n  if (rle_repeat_count) { TDEFL_RLE_PREV_CODE_SIZE(); } else { TDEFL_RLE_ZERO_CODE_SIZE(); }\n\n  tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE);\n\n  TDEFL_PUT_BITS(2, 2);\n\n  TDEFL_PUT_BITS(num_lit_codes - 257, 5);\n  TDEFL_PUT_BITS(num_dist_codes - 1, 5);\n\n  for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) break;\n  num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); TDEFL_PUT_BITS(num_bit_lengths - 4, 4);\n  for (i = 0; (int)i < num_bit_lengths; i++) TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3);\n\n  for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; )\n  {\n    mz_uint code = packed_code_sizes[packed_code_sizes_index++]; MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2);\n    TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]);\n    if (code >= 16) TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], \"\\02\\03\\07\"[code - 16]);\n  }\n}\n\nstatic void tdefl_start_static_block(tdefl_compressor *d)\n{\n  mz_uint i;\n  mz_uint8 *p = &d->m_huff_code_sizes[0][0];\n\n  for (i = 0; i <= 143; ++i) *p++ = 8;\n  for ( ; i <= 255; ++i) *p++ = 9;\n  for ( ; i <= 279; ++i) *p++ = 7;\n  for ( ; i <= 287; ++i) *p++ = 8;\n\n  memset(d->m_huff_code_sizes[1], 5, 32);\n\n  tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE);\n  tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE);\n\n  TDEFL_PUT_BITS(1, 2);\n}\n\nstatic const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS\nstatic mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)\n{\n  mz_uint flags;\n  mz_uint8 *pLZ_codes;\n  mz_uint8 *pOutput_buf = d->m_pOutput_buf;\n  mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf;\n  mz_uint64 bit_buffer = d->m_bit_buffer;\n  mz_uint bits_in = d->m_bits_in;\n\n#define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); }\n\n  flags = 1;\n  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1)\n  {\n    if (flags == 1)\n      flags = *pLZ_codes++ | 0x100;\n\n    if (flags & 1)\n    {\n      mz_uint s0, s1, n0, n1, sym, num_extra_bits;\n      mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3;\n\n      MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);\n\n      // This sequence coaxes MSVC into using cmov's vs. jmp's.\n      s0 = s_tdefl_small_dist_sym[match_dist & 511];\n      n0 = s_tdefl_small_dist_extra[match_dist & 511];\n      s1 = s_tdefl_large_dist_sym[match_dist >> 8];\n      n1 = s_tdefl_large_dist_extra[match_dist >> 8];\n      sym = (match_dist < 512) ? s0 : s1;\n      num_extra_bits = (match_dist < 512) ? n0 : n1;\n\n      MZ_ASSERT(d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);\n    }\n    else\n    {\n      mz_uint lit = *pLZ_codes++;\n      MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n      TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);\n\n      if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end))\n      {\n        flags >>= 1;\n        lit = *pLZ_codes++;\n        MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n        TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);\n\n        if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end))\n        {\n          flags >>= 1;\n          lit = *pLZ_codes++;\n          MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n          TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);\n        }\n      }\n    }\n\n    if (pOutput_buf >= d->m_pOutput_buf_end)\n      return MZ_FALSE;\n\n    *(mz_uint64*)pOutput_buf = bit_buffer;\n    pOutput_buf += (bits_in >> 3);\n    bit_buffer >>= (bits_in & ~7);\n    bits_in &= 7;\n  }\n\n#undef TDEFL_PUT_BITS_FAST\n\n  d->m_pOutput_buf = pOutput_buf;\n  d->m_bits_in = 0;\n  d->m_bit_buffer = 0;\n\n  while (bits_in)\n  {\n    mz_uint32 n = MZ_MIN(bits_in, 16);\n    TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n);\n    bit_buffer >>= n;\n    bits_in -= n;\n  }\n\n  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);\n\n  return (d->m_pOutput_buf < d->m_pOutput_buf_end);\n}\n#else\nstatic mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)\n{\n  mz_uint flags;\n  mz_uint8 *pLZ_codes;\n\n  flags = 1;\n  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1)\n  {\n    if (flags == 1)\n      flags = *pLZ_codes++ | 0x100;\n    if (flags & 1)\n    {\n      mz_uint sym, num_extra_bits;\n      mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3;\n\n      MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);\n\n      if (match_dist < 512)\n      {\n        sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist];\n      }\n      else\n      {\n        sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8];\n      }\n      MZ_ASSERT(d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);\n    }\n    else\n    {\n      mz_uint lit = *pLZ_codes++;\n      MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n      TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);\n    }\n  }\n\n  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);\n\n  return (d->m_pOutput_buf < d->m_pOutput_buf_end);\n}\n#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS\n\nstatic mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block)\n{\n  if (static_block)\n    tdefl_start_static_block(d);\n  else\n    tdefl_start_dynamic_block(d);\n  return tdefl_compress_lz_codes(d);\n}\n\nstatic int tdefl_flush_block(tdefl_compressor *d, int flush)\n{\n  mz_uint saved_bit_buf, saved_bits_in;\n  mz_uint8 *pSaved_output_buf;\n  mz_bool comp_block_succeeded = MZ_FALSE;\n  int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size;\n  mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf;\n\n  d->m_pOutput_buf = pOutput_buf_start;\n  d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16;\n\n  MZ_ASSERT(!d->m_output_flush_remaining);\n  d->m_output_flush_ofs = 0;\n  d->m_output_flush_remaining = 0;\n\n  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left);\n  d->m_pLZ_code_buf -= (d->m_num_flags_left == 8);\n\n  if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index))\n  {\n    TDEFL_PUT_BITS(0x78, 8); TDEFL_PUT_BITS(0x01, 8);\n  }\n\n  TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1);\n\n  pSaved_output_buf = d->m_pOutput_buf; saved_bit_buf = d->m_bit_buffer; saved_bits_in = d->m_bits_in;\n\n  if (!use_raw_block)\n    comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48));\n\n  // If the block gets expanded, forget the current contents of the output buffer and send a raw block instead.\n  if ( ((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) &&\n       ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size) )\n  {\n    mz_uint i; d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;\n    TDEFL_PUT_BITS(0, 2);\n    if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); }\n    for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF)\n    {\n      TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16);\n    }\n    for (i = 0; i < d->m_total_lz_bytes; ++i)\n    {\n      TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8);\n    }\n  }\n  // Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes.\n  else if (!comp_block_succeeded)\n  {\n    d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;\n    tdefl_compress_block(d, MZ_TRUE);\n  }\n\n  if (flush)\n  {\n    if (flush == TDEFL_FINISH)\n    {\n      if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); }\n      if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { mz_uint i, a = d->m_adler32; for (i = 0; i < 4; i++) { TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); a <<= 8; } }\n    }\n    else\n    {\n      mz_uint i, z = 0; TDEFL_PUT_BITS(0, 3); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, z ^= 0xFFFF) { TDEFL_PUT_BITS(z & 0xFFFF, 16); }\n    }\n  }\n\n  MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end);\n\n  memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);\n  memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);\n\n  d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; d->m_total_lz_bytes = 0; d->m_block_index++;\n\n  if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0)\n  {\n    if (d->m_pPut_buf_func)\n    {\n      *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;\n      if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user))\n        return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED);\n    }\n    else if (pOutput_buf_start == d->m_output_buf)\n    {\n      int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs));\n      memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy);\n      d->m_out_buf_ofs += bytes_to_copy;\n      if ((n -= bytes_to_copy) != 0)\n      {\n        d->m_output_flush_ofs = bytes_to_copy;\n        d->m_output_flush_remaining = n;\n      }\n    }\n    else\n    {\n      d->m_out_buf_ofs += n;\n    }\n  }\n\n  return d->m_output_flush_remaining;\n}\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p)\nstatic MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)\n{\n  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;\n  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];\n  const mz_uint16 *s = (const mz_uint16*)(d->m_dict + pos), *p, *q;\n  mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s);\n  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return;\n  for ( ; ; )\n  {\n    for ( ; ; )\n    {\n      if (--num_probes_left == 0) return;\n      #define TDEFL_PROBE \\\n        next_probe_pos = d->m_next[probe_pos]; \\\n        if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \\\n        probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \\\n        if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break;\n      TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE;\n    }\n    if (!dist) break; q = (const mz_uint16*)(d->m_dict + probe_pos); if (TDEFL_READ_UNALIGNED_WORD(q) != s01) continue; p = s; probe_len = 32;\n    do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&\n                   (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) );\n    if (!probe_len)\n    {\n      *pMatch_dist = dist; *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); break;\n    }\n    else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8*)p == *(const mz_uint8*)q)) > match_len)\n    {\n      *pMatch_dist = dist; if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) break;\n      c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]);\n    }\n  }\n}\n#else\nstatic MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)\n{\n  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;\n  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];\n  const mz_uint8 *s = d->m_dict + pos, *p, *q;\n  mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1];\n  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return;\n  for ( ; ; )\n  {\n    for ( ; ; )\n    {\n      if (--num_probes_left == 0) return;\n      #define TDEFL_PROBE \\\n        next_probe_pos = d->m_next[probe_pos]; \\\n        if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \\\n        probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \\\n        if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break;\n      TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE;\n    }\n    if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break;\n    if (probe_len > match_len)\n    {\n      *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return;\n      c0 = d->m_dict[pos + match_len]; c1 = d->m_dict[pos + match_len - 1];\n    }\n  }\n}\n#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\nstatic mz_bool tdefl_compress_fast(tdefl_compressor *d)\n{\n  // Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio.\n  mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left;\n  mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags;\n  mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;\n\n  while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size)))\n  {\n    const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096;\n    mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;\n    mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size);\n    d->m_src_buf_left -= num_bytes_to_process;\n    lookahead_size += num_bytes_to_process;\n\n    while (num_bytes_to_process)\n    {\n      mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process);\n      memcpy(d->m_dict + dst_pos, d->m_pSrc, n);\n      if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))\n        memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos));\n      d->m_pSrc += n;\n      dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK;\n      num_bytes_to_process -= n;\n    }\n\n    dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size);\n    if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) break;\n\n    while (lookahead_size >= 4)\n    {\n      mz_uint cur_match_dist, cur_match_len = 1;\n      mz_uint8 *pCur_dict = d->m_dict + cur_pos;\n      mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF;\n      mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK;\n      mz_uint probe_pos = d->m_hash[hash];\n      d->m_hash[hash] = (mz_uint16)lookahead_pos;\n\n      if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram))\n      {\n        const mz_uint16 *p = (const mz_uint16 *)pCur_dict;\n        const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos);\n        mz_uint32 probe_len = 32;\n        do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&\n          (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) );\n        cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q);\n        if (!probe_len)\n          cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0;\n\n        if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)))\n        {\n          cur_match_len = 1;\n          *pLZ_code_buf++ = (mz_uint8)first_trigram;\n          *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);\n          d->m_huff_count[0][(mz_uint8)first_trigram]++;\n        }\n        else\n        {\n          mz_uint32 s0, s1;\n          cur_match_len = MZ_MIN(cur_match_len, lookahead_size);\n\n          MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE));\n\n          cur_match_dist--;\n\n          pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN);\n          *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist;\n          pLZ_code_buf += 3;\n          *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80);\n\n          s0 = s_tdefl_small_dist_sym[cur_match_dist & 511];\n          s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8];\n          d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++;\n\n          d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++;\n        }\n      }\n      else\n      {\n        *pLZ_code_buf++ = (mz_uint8)first_trigram;\n        *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);\n        d->m_huff_count[0][(mz_uint8)first_trigram]++;\n      }\n\n      if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }\n\n      total_lz_bytes += cur_match_len;\n      lookahead_pos += cur_match_len;\n      dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE);\n      cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK;\n      MZ_ASSERT(lookahead_size >= cur_match_len);\n      lookahead_size -= cur_match_len;\n\n      if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8])\n      {\n        int n;\n        d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;\n        d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;\n        if ((n = tdefl_flush_block(d, 0)) != 0)\n          return (n < 0) ? MZ_FALSE : MZ_TRUE;\n        total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left;\n      }\n    }\n\n    while (lookahead_size)\n    {\n      mz_uint8 lit = d->m_dict[cur_pos];\n\n      total_lz_bytes++;\n      *pLZ_code_buf++ = lit;\n      *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);\n      if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }\n\n      d->m_huff_count[0][lit]++;\n\n      lookahead_pos++;\n      dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE);\n      cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK;\n      lookahead_size--;\n\n      if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8])\n      {\n        int n;\n        d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;\n        d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;\n        if ((n = tdefl_flush_block(d, 0)) != 0)\n          return (n < 0) ? MZ_FALSE : MZ_TRUE;\n        total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left;\n      }\n    }\n  }\n\n  d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;\n  d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;\n  return MZ_TRUE;\n}\n#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n\nstatic MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit)\n{\n  d->m_total_lz_bytes++;\n  *d->m_pLZ_code_buf++ = lit;\n  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; }\n  d->m_huff_count[0][lit]++;\n}\n\nstatic MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist)\n{\n  mz_uint32 s0, s1;\n\n  MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE));\n\n  d->m_total_lz_bytes += match_len;\n\n  d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN);\n\n  match_dist -= 1;\n  d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF);\n  d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); d->m_pLZ_code_buf += 3;\n\n  *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; }\n\n  s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127];\n  d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++;\n\n  if (match_len >= TDEFL_MIN_MATCH_LEN) d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++;\n}\n\nstatic mz_bool tdefl_compress_normal(tdefl_compressor *d)\n{\n  const mz_uint8 *pSrc = d->m_pSrc; size_t src_buf_left = d->m_src_buf_left;\n  tdefl_flush flush = d->m_flush;\n\n  while ((src_buf_left) || ((flush) && (d->m_lookahead_size)))\n  {\n    mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos;\n    // Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN.\n    if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1))\n    {\n      mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2;\n      mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK];\n      mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size);\n      const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process;\n      src_buf_left -= num_bytes_to_process;\n      d->m_lookahead_size += num_bytes_to_process;\n      while (pSrc != pSrc_end)\n      {\n        mz_uint8 c = *pSrc++; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;\n        hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);\n        d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos);\n        dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; ins_pos++;\n      }\n    }\n    else\n    {\n      while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN))\n      {\n        mz_uint8 c = *pSrc++;\n        mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;\n        src_buf_left--;\n        d->m_dict[dst_pos] = c;\n        if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))\n          d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;\n        if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN)\n        {\n          mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2;\n          mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);\n          d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos);\n        }\n      }\n    }\n    d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size);\n    if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN))\n      break;\n\n    // Simple lazy/greedy parsing state machine.\n    len_to_move = 1; cur_match_dist = 0; cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;\n    if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS))\n    {\n      if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS)))\n      {\n        mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK];\n        cur_match_len = 0; while (cur_match_len < d->m_lookahead_size) { if (d->m_dict[cur_pos + cur_match_len] != c) break; cur_match_len++; }\n        if (cur_match_len < TDEFL_MIN_MATCH_LEN) cur_match_len = 0; else cur_match_dist = 1;\n      }\n    }\n    else\n    {\n      tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len);\n    }\n    if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5)))\n    {\n      cur_match_dist = cur_match_len = 0;\n    }\n    if (d->m_saved_match_len)\n    {\n      if (cur_match_len > d->m_saved_match_len)\n      {\n        tdefl_record_literal(d, (mz_uint8)d->m_saved_lit);\n        if (cur_match_len >= 128)\n        {\n          tdefl_record_match(d, cur_match_len, cur_match_dist);\n          d->m_saved_match_len = 0; len_to_move = cur_match_len;\n        }\n        else\n        {\n          d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len;\n        }\n      }\n      else\n      {\n        tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist);\n        len_to_move = d->m_saved_match_len - 1; d->m_saved_match_len = 0;\n      }\n    }\n    else if (!cur_match_dist)\n      tdefl_record_literal(d, d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]);\n    else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128))\n    {\n      tdefl_record_match(d, cur_match_len, cur_match_dist);\n      len_to_move = cur_match_len;\n    }\n    else\n    {\n      d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len;\n    }\n    // Move the lookahead forward by len_to_move bytes.\n    d->m_lookahead_pos += len_to_move;\n    MZ_ASSERT(d->m_lookahead_size >= len_to_move);\n    d->m_lookahead_size -= len_to_move;\n    d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, TDEFL_LZ_DICT_SIZE);\n    // Check if it's time to flush the current LZ codes to the internal output buffer.\n    if ( (d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) ||\n         ( (d->m_total_lz_bytes > 31*1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) )\n    {\n      int n;\n      d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left;\n      if ((n = tdefl_flush_block(d, 0)) != 0)\n        return (n < 0) ? MZ_FALSE : MZ_TRUE;\n    }\n  }\n\n  d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left;\n  return MZ_TRUE;\n}\n\nstatic tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d)\n{\n  if (d->m_pIn_buf_size)\n  {\n    *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;\n  }\n\n  if (d->m_pOut_buf_size)\n  {\n    size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining);\n    memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n);\n    d->m_output_flush_ofs += (mz_uint)n;\n    d->m_output_flush_remaining -= (mz_uint)n;\n    d->m_out_buf_ofs += n;\n\n    *d->m_pOut_buf_size = d->m_out_buf_ofs;\n  }\n\n  return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY;\n}\n\ntdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush)\n{\n  if (!d)\n  {\n    if (pIn_buf_size) *pIn_buf_size = 0;\n    if (pOut_buf_size) *pOut_buf_size = 0;\n    return TDEFL_STATUS_BAD_PARAM;\n  }\n\n  d->m_pIn_buf = pIn_buf; d->m_pIn_buf_size = pIn_buf_size;\n  d->m_pOut_buf = pOut_buf; d->m_pOut_buf_size = pOut_buf_size;\n  d->m_pSrc = (const mz_uint8 *)(pIn_buf); d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0;\n  d->m_out_buf_ofs = 0;\n  d->m_flush = flush;\n\n  if ( ((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) ||\n        (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf) )\n  {\n    if (pIn_buf_size) *pIn_buf_size = 0;\n    if (pOut_buf_size) *pOut_buf_size = 0;\n    return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM);\n  }\n  d->m_wants_to_finish |= (flush == TDEFL_FINISH);\n\n  if ((d->m_output_flush_remaining) || (d->m_finished))\n    return (d->m_prev_return_status = tdefl_flush_output_buffer(d));\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n  if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) &&\n      ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) &&\n      ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | TDEFL_RLE_MATCHES)) == 0))\n  {\n    if (!tdefl_compress_fast(d))\n      return d->m_prev_return_status;\n  }\n  else\n#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n  {\n    if (!tdefl_compress_normal(d))\n      return d->m_prev_return_status;\n  }\n\n  if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf))\n    d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf);\n\n  if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining))\n  {\n    if (tdefl_flush_block(d, flush) < 0)\n      return d->m_prev_return_status;\n    d->m_finished = (flush == TDEFL_FINISH);\n    if (flush == TDEFL_FULL_FLUSH) { MZ_CLEAR_OBJ(d->m_hash); MZ_CLEAR_OBJ(d->m_next); d->m_dict_size = 0; }\n  }\n\n  return (d->m_prev_return_status = tdefl_flush_output_buffer(d));\n}\n\ntdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush)\n{\n  MZ_ASSERT(d->m_pPut_buf_func); return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush);\n}\n\ntdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)\n{\n  d->m_pPut_buf_func = pPut_buf_func; d->m_pPut_buf_user = pPut_buf_user;\n  d->m_flags = (mz_uint)(flags); d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0;\n  d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3;\n  if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash);\n  d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0;\n  d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0;\n  d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8;\n  d->m_pOutput_buf = d->m_output_buf; d->m_pOutput_buf_end = d->m_output_buf; d->m_prev_return_status = TDEFL_STATUS_OKAY;\n  d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; d->m_adler32 = 1;\n  d->m_pIn_buf = NULL; d->m_pOut_buf = NULL;\n  d->m_pIn_buf_size = NULL; d->m_pOut_buf_size = NULL;\n  d->m_flush = TDEFL_NO_FLUSH; d->m_pSrc = NULL; d->m_src_buf_left = 0; d->m_out_buf_ofs = 0;\n  memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);\n  memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);\n  return TDEFL_STATUS_OKAY;\n}\n\ntdefl_status tdefl_get_prev_return_status(tdefl_compressor *d)\n{\n  return d->m_prev_return_status;\n}\n\nmz_uint32 tdefl_get_adler32(tdefl_compressor *d)\n{\n  return d->m_adler32;\n}\n\nmz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)\n{\n  tdefl_compressor *pComp; mz_bool succeeded; if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE;\n  pComp = (tdefl_compressor*)MZ_MALLOC(sizeof(tdefl_compressor)); if (!pComp) return MZ_FALSE;\n  succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY);\n  succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE);\n  MZ_FREE(pComp); return succeeded;\n}\n\ntypedef struct\n{\n  size_t m_size, m_capacity;\n  mz_uint8 *m_pBuf;\n  mz_bool m_expandable;\n} tdefl_output_buffer;\n\nstatic mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser)\n{\n  tdefl_output_buffer *p = (tdefl_output_buffer *)pUser;\n  size_t new_size = p->m_size + len;\n  if (new_size > p->m_capacity)\n  {\n    size_t new_capacity = p->m_capacity; mz_uint8 *pNew_buf; if (!p->m_expandable) return MZ_FALSE;\n    do { new_capacity = MZ_MAX(128U, new_capacity << 1U); } while (new_size > new_capacity);\n    pNew_buf = (mz_uint8*)MZ_REALLOC(p->m_pBuf, new_capacity); if (!pNew_buf) return MZ_FALSE;\n    p->m_pBuf = pNew_buf; p->m_capacity = new_capacity;\n  }\n  memcpy((mz_uint8*)p->m_pBuf + p->m_size, pBuf, len); p->m_size = new_size;\n  return MZ_TRUE;\n}\n\nvoid *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)\n{\n  tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf);\n  if (!pOut_len) return MZ_FALSE; else *pOut_len = 0;\n  out_buf.m_expandable = MZ_TRUE;\n  if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return NULL;\n  *pOut_len = out_buf.m_size; return out_buf.m_pBuf;\n}\n\nsize_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)\n{\n  tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf);\n  if (!pOut_buf) return 0;\n  out_buf.m_pBuf = (mz_uint8*)pOut_buf; out_buf.m_capacity = out_buf_len;\n  if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return 0;\n  return out_buf.m_size;\n}\n\n#ifndef MINIZ_NO_ZLIB_APIS\nstatic const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32,  16, 32, 128, 256,  512, 768, 1500 };\n\n// level may actually range from [0,10] (10 is a \"hidden\" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files).\nmz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy)\n{\n  mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0);\n  if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER;\n\n  if (!level) comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS;\n  else if (strategy == MZ_FILTERED) comp_flags |= TDEFL_FILTER_MATCHES;\n  else if (strategy == MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK;\n  else if (strategy == MZ_FIXED) comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS;\n  else if (strategy == MZ_RLE) comp_flags |= TDEFL_RLE_MATCHES;\n\n  return comp_flags;\n}\n#endif //MINIZ_NO_ZLIB_APIS\n\n#ifdef _MSC_VER\n#pragma warning (push)\n#pragma warning (disable:4204) // nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal)\n#endif\n\n// Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at\n// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/.\n// This is actually a modification of Alex's original code so PNG files generated by this function pass pngcheck.\nvoid *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip)\n{\n  // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was defined.\n  static const mz_uint s_tdefl_png_num_probes[11] = { 0, 1, 6, 32,  16, 32, 128, 256,  512, 768, 1500 };\n  tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); tdefl_output_buffer out_buf; int i, bpl = w * num_chans, y, z; mz_uint32 c; *pLen_out = 0;\n  if (!pComp) return NULL;\n  MZ_CLEAR_OBJ(out_buf); out_buf.m_expandable = MZ_TRUE; out_buf.m_capacity = 57+MZ_MAX(64, (1+bpl)*h); if (NULL == (out_buf.m_pBuf = (mz_uint8*)MZ_MALLOC(out_buf.m_capacity))) { MZ_FREE(pComp); return NULL; }\n  // write dummy header\n  for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf);\n  // compress image data\n  tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER);\n  for (y = 0; y < h; ++y) { tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); tdefl_compress_buffer(pComp, (mz_uint8*)pImage + (flip ? (h - 1 - y) : y) * bpl, bpl, TDEFL_NO_FLUSH); }\n  if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; }\n  // write real header\n  *pLen_out = out_buf.m_size-41;\n  {\n    static const mz_uint8 chans[] = {0x00, 0x00, 0x04, 0x02, 0x06};\n    mz_uint8 pnghdr[41]={0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,\n      0,0,(mz_uint8)(w>>8),(mz_uint8)w,0,0,(mz_uint8)(h>>8),(mz_uint8)h,8,chans[num_chans],0,0,0,0,0,0,0,\n      (mz_uint8)(*pLen_out>>24),(mz_uint8)(*pLen_out>>16),(mz_uint8)(*pLen_out>>8),(mz_uint8)*pLen_out,0x49,0x44,0x41,0x54};\n    c=(mz_uint32)mz_crc32(MZ_CRC32_INIT,pnghdr+12,17); for (i=0; i<4; ++i, c<<=8) ((mz_uint8*)(pnghdr+29))[i]=(mz_uint8)(c>>24);\n    memcpy(out_buf.m_pBuf, pnghdr, 41);\n  }\n  // write footer (IDAT CRC-32, followed by IEND chunk)\n  if (!tdefl_output_buffer_putter(\"\\0\\0\\0\\0\\0\\0\\0\\0\\x49\\x45\\x4e\\x44\\xae\\x42\\x60\\x82\", 16, &out_buf)) { *pLen_out = 0; MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; }\n  c = (mz_uint32)mz_crc32(MZ_CRC32_INIT,out_buf.m_pBuf+41-4, *pLen_out+4); for (i=0; i<4; ++i, c<<=8) (out_buf.m_pBuf+out_buf.m_size-16)[i] = (mz_uint8)(c >> 24);\n  // compute final size of file, grab compressed data buffer and return\n  *pLen_out += 57; MZ_FREE(pComp); return out_buf.m_pBuf;\n}\nvoid *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out)\n{\n  // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's where #defined out)\n  return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, pLen_out, 6, MZ_FALSE);\n}\n\n#ifdef _MSC_VER\n#pragma warning (pop)\n#endif\n\n// ------------------- .ZIP archive reading\n\n#ifndef MINIZ_NO_ARCHIVE_APIS\n\n#ifdef MINIZ_NO_STDIO\n  #define MZ_FILE void *\n#else\n  #include <stdio.h>\n  #include <sys/stat.h>\n\n  #if defined(_MSC_VER) || defined(__MINGW64__)\n    static FILE *mz_fopen(const char *pFilename, const char *pMode)\n    {\n      FILE* pFile = NULL;\n      fopen_s(&pFile, pFilename, pMode);\n      return pFile;\n    }\n    static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream)\n    {\n      FILE* pFile = NULL;\n      if (freopen_s(&pFile, pPath, pMode, pStream))\n        return NULL;\n      return pFile;\n    }\n    #ifndef MINIZ_NO_TIME\n      #include <sys/utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN mz_fopen\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 _ftelli64\n    #define MZ_FSEEK64 _fseeki64\n    #define MZ_FILE_STAT_STRUCT _stat\n    #define MZ_FILE_STAT _stat\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN mz_freopen\n    #define MZ_DELETE_FILE remove\n  #elif defined(__MINGW32__)\n    #ifndef MINIZ_NO_TIME\n      #include <sys/utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN(f, m) fopen(f, m)\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 ftello64\n    #define MZ_FSEEK64 fseeko64\n    #define MZ_FILE_STAT_STRUCT _stat\n    #define MZ_FILE_STAT _stat\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN(f, m, s) freopen(f, m, s)\n    #define MZ_DELETE_FILE remove\n  #elif defined(__TINYC__)\n    #ifndef MINIZ_NO_TIME\n      #include <sys/utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN(f, m) fopen(f, m)\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 ftell\n    #define MZ_FSEEK64 fseek\n    #define MZ_FILE_STAT_STRUCT stat\n    #define MZ_FILE_STAT stat\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN(f, m, s) freopen(f, m, s)\n    #define MZ_DELETE_FILE remove\n  #elif defined(__GNUC__) && _LARGEFILE64_SOURCE\n    #ifndef MINIZ_NO_TIME\n      #include <utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN(f, m) fopen64(f, m)\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 ftello64\n    #define MZ_FSEEK64 fseeko64\n    #define MZ_FILE_STAT_STRUCT stat64\n    #define MZ_FILE_STAT stat64\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN(p, m, s) freopen64(p, m, s)\n    #define MZ_DELETE_FILE remove\n  #else\n    #ifndef MINIZ_NO_TIME\n      #include <utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN(f, m) fopen(f, m)\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 ftello\n    #define MZ_FSEEK64 fseeko\n    #define MZ_FILE_STAT_STRUCT stat\n    #define MZ_FILE_STAT stat\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN(f, m, s) freopen(f, m, s)\n    #define MZ_DELETE_FILE remove\n  #endif // #ifdef _MSC_VER\n#endif // #ifdef MINIZ_NO_STDIO\n\n#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c))\n\n// Various ZIP archive enums. To completely avoid cross platform compiler alignment and platform endian issues, miniz.c doesn't use structs for any of this stuff.\nenum\n{\n  // ZIP archive identifiers and record sizes\n  MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50, MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50, MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50,\n  MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22,\n  // Central directory header record offsets\n  MZ_ZIP_CDH_SIG_OFS = 0, MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6, MZ_ZIP_CDH_BIT_FLAG_OFS = 8,\n  MZ_ZIP_CDH_METHOD_OFS = 10, MZ_ZIP_CDH_FILE_TIME_OFS = 12, MZ_ZIP_CDH_FILE_DATE_OFS = 14, MZ_ZIP_CDH_CRC32_OFS = 16,\n  MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20, MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24, MZ_ZIP_CDH_FILENAME_LEN_OFS = 28, MZ_ZIP_CDH_EXTRA_LEN_OFS = 30,\n  MZ_ZIP_CDH_COMMENT_LEN_OFS = 32, MZ_ZIP_CDH_DISK_START_OFS = 34, MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36, MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38, MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42,\n  // Local directory header offsets\n  MZ_ZIP_LDH_SIG_OFS = 0, MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4, MZ_ZIP_LDH_BIT_FLAG_OFS = 6, MZ_ZIP_LDH_METHOD_OFS = 8, MZ_ZIP_LDH_FILE_TIME_OFS = 10,\n  MZ_ZIP_LDH_FILE_DATE_OFS = 12, MZ_ZIP_LDH_CRC32_OFS = 14, MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18, MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22,\n  MZ_ZIP_LDH_FILENAME_LEN_OFS = 26, MZ_ZIP_LDH_EXTRA_LEN_OFS = 28,\n  // End of central directory offsets\n  MZ_ZIP_ECDH_SIG_OFS = 0, MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4, MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6, MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8,\n  MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10, MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20,\n};\n\ntypedef struct\n{\n  void *m_p;\n  size_t m_size, m_capacity;\n  mz_uint m_element_size;\n} mz_zip_array;\n\nstruct mz_zip_internal_state_tag\n{\n  mz_zip_array m_central_dir;\n  mz_zip_array m_central_dir_offsets;\n  mz_zip_array m_sorted_central_dir_offsets;\n  MZ_FILE *m_pFile;\n  void *m_pMem;\n  size_t m_mem_size;\n  size_t m_mem_capacity;\n};\n\n#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) (array_ptr)->m_element_size = element_size\n#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[index]\n\nstatic MZ_FORCEINLINE void mz_zip_array_clear(mz_zip_archive *pZip, mz_zip_array *pArray)\n{\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p);\n  memset(pArray, 0, sizeof(mz_zip_array));\n}\n\nstatic mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip, mz_zip_array *pArray, size_t min_new_capacity, mz_uint growing)\n{\n  void *pNew_p; size_t new_capacity = min_new_capacity; MZ_ASSERT(pArray->m_element_size); if (pArray->m_capacity >= min_new_capacity) return MZ_TRUE;\n  if (growing) { new_capacity = MZ_MAX(1, pArray->m_capacity); while (new_capacity < min_new_capacity) new_capacity *= 2; }\n  if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p, pArray->m_element_size, new_capacity))) return MZ_FALSE;\n  pArray->m_p = pNew_p; pArray->m_capacity = new_capacity;\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_reserve(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_capacity, mz_uint growing)\n{\n  if (new_capacity > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing)) return MZ_FALSE; }\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_resize(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_size, mz_uint growing)\n{\n  if (new_size > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing)) return MZ_FALSE; }\n  pArray->m_size = new_size;\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip, mz_zip_array *pArray, size_t n)\n{\n  return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE);\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, mz_zip_array *pArray, const void *pElements, size_t n)\n{\n  size_t orig_size = pArray->m_size; if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) return MZ_FALSE;\n  memcpy((mz_uint8*)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size);\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_TIME\nstatic time_t mz_zip_dos_to_time_t(int dos_time, int dos_date)\n{\n  struct tm tm;\n  memset(&tm, 0, sizeof(tm)); tm.tm_isdst = -1;\n  tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; tm.tm_mon = ((dos_date >> 5) & 15) - 1; tm.tm_mday = dos_date & 31;\n  tm.tm_hour = (dos_time >> 11) & 31; tm.tm_min = (dos_time >> 5) & 63; tm.tm_sec = (dos_time << 1) & 62;\n  return mktime(&tm);\n}\n\nstatic void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date)\n{\n#ifdef _MSC_VER\n  struct tm tm_struct;\n  struct tm *tm = &tm_struct;\n  errno_t err = localtime_s(tm, &time);\n  if (err)\n  {\n    *pDOS_date = 0; *pDOS_time = 0;\n    return;\n  }\n#else\n  struct tm *tm = localtime(&time);\n#endif\n  *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1));\n  *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday);\n}\n#endif\n\n#ifndef MINIZ_NO_STDIO\nstatic mz_bool mz_zip_get_file_modified_time(const char *pFilename, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date)\n{\n#ifdef MINIZ_NO_TIME\n  (void)pFilename; *pDOS_date = *pDOS_time = 0;\n#else\n  struct MZ_FILE_STAT_STRUCT file_stat;\n  // On Linux with x86 glibc, this call will fail on large files (>= 0x80000000 bytes) unless you compiled with _LARGEFILE64_SOURCE. Argh.\n  if (MZ_FILE_STAT(pFilename, &file_stat) != 0)\n    return MZ_FALSE;\n  mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date);\n#endif // #ifdef MINIZ_NO_TIME\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_TIME\nstatic mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time, time_t modified_time)\n{\n  struct utimbuf t; t.actime = access_time; t.modtime = modified_time;\n  return !utime(pFilename, &t);\n}\n#endif // #ifndef MINIZ_NO_TIME\n#endif // #ifndef MINIZ_NO_STDIO\n\nstatic mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, mz_uint32 flags)\n{\n  (void)flags;\n  if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))\n    return MZ_FALSE;\n\n  if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func;\n  if (!pZip->m_pFree) pZip->m_pFree = def_free_func;\n  if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func;\n\n  pZip->m_zip_mode = MZ_ZIP_MODE_READING;\n  pZip->m_archive_size = 0;\n  pZip->m_central_directory_file_ofs = 0;\n  pZip->m_total_files = 0;\n\n  if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))\n    return MZ_FALSE;\n  memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32));\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, mz_uint r_index)\n{\n  const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE;\n  const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index));\n  mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS), r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  mz_uint8 l = 0, r = 0;\n  pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n  pE = pL + MZ_MIN(l_len, r_len);\n  while (pL < pE)\n  {\n    if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR)))\n      break;\n    pL++; pR++;\n  }\n  return (pL == pE) ? (l_len < r_len) : (l < r);\n}\n\n#define MZ_SWAP_UINT32(a, b) do { mz_uint32 t = a; a = b; b = t; } MZ_MACRO_END\n\n// Heap sort of lowercased filenames, used to help accelerate plain central directory searches by mz_zip_reader_locate_file(). (Could also use qsort(), but it could allocate memory.)\nstatic void mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip)\n{\n  mz_zip_internal_state *pState = pZip->m_pState;\n  const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;\n  const mz_zip_array *pCentral_dir = &pState->m_central_dir;\n  mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0);\n  const int size = pZip->m_total_files;\n  int start = (size - 2) >> 1, end;\n  while (start >= 0)\n  {\n    int child, root = start;\n    for ( ; ; )\n    {\n      if ((child = (root << 1) + 1) >= size)\n        break;\n      child += (((child + 1) < size) && (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1])));\n      if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child]))\n        break;\n      MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child;\n    }\n    start--;\n  }\n\n  end = size - 1;\n  while (end > 0)\n  {\n    int child, root = 0;\n    MZ_SWAP_UINT32(pIndices[end], pIndices[0]);\n    for ( ; ; )\n    {\n      if ((child = (root << 1) + 1) >= end)\n        break;\n      child += (((child + 1) < end) && mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1]));\n      if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child]))\n        break;\n      MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child;\n    }\n    end--;\n  }\n}\n\nstatic mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint32 flags)\n{\n  mz_uint cdir_size, num_this_disk, cdir_disk_index;\n  mz_uint64 cdir_ofs;\n  mz_int64 cur_file_ofs;\n  const mz_uint8 *p;\n  mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; mz_uint8 *pBuf = (mz_uint8 *)buf_u32;\n  mz_bool sort_central_dir = ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0);\n  // Basic sanity checks - reject files which are too small, and check the first 4 bytes of the file to make sure a local header is there.\n  if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  // Find the end of central directory record by scanning the file from the end towards the beginning.\n  cur_file_ofs = MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0);\n  for ( ; ; )\n  {\n    int i, n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs);\n    if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n)\n      return MZ_FALSE;\n    for (i = n - 4; i >= 0; --i)\n      if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG)\n        break;\n    if (i >= 0)\n    {\n      cur_file_ofs += i;\n      break;\n    }\n    if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)))\n      return MZ_FALSE;\n    cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0);\n  }\n  // Read and verify the end of central directory record.\n  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) ||\n      ((pZip->m_total_files = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) != MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS)))\n    return MZ_FALSE;\n\n  num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS);\n  cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS);\n  if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1)))\n    return MZ_FALSE;\n\n  if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n\n  cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS);\n  if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size)\n    return MZ_FALSE;\n\n  pZip->m_central_directory_file_ofs = cdir_ofs;\n\n  if (pZip->m_total_files)\n  {\n     mz_uint i, n;\n\n    // Read the entire central directory into a heap block, and allocate another heap block to hold the unsorted central dir file record offsets, and another to hold the sorted indices.\n    if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, MZ_FALSE)) ||\n        (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, pZip->m_total_files, MZ_FALSE)))\n      return MZ_FALSE;\n\n    if (sort_central_dir)\n    {\n      if (!mz_zip_array_resize(pZip, &pZip->m_pState->m_sorted_central_dir_offsets, pZip->m_total_files, MZ_FALSE))\n        return MZ_FALSE;\n    }\n\n    if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, pZip->m_pState->m_central_dir.m_p, cdir_size) != cdir_size)\n      return MZ_FALSE;\n\n    // Now create an index into the central directory file records, do some basic sanity checking on each record, and check for zip64 entries (which are not yet supported).\n    p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p;\n    for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i)\n    {\n      mz_uint total_header_size, comp_size, decomp_size, disk_index;\n      if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG))\n        return MZ_FALSE;\n      MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, i) = (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p);\n      if (sort_central_dir)\n        MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, mz_uint32, i) = i;\n      comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n      decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);\n      if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && (decomp_size != comp_size)) || (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || (comp_size == 0xFFFFFFFF))\n        return MZ_FALSE;\n      disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS);\n      if ((disk_index != num_this_disk) && (disk_index != 1))\n        return MZ_FALSE;\n      if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size)\n        return MZ_FALSE;\n      if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > n)\n        return MZ_FALSE;\n      n -= total_header_size; p += total_header_size;\n    }\n  }\n\n  if (sort_central_dir)\n    mz_zip_reader_sort_central_dir_offsets_by_filename(pZip);\n\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags)\n{\n  if ((!pZip) || (!pZip->m_pRead))\n    return MZ_FALSE;\n  if (!mz_zip_reader_init_internal(pZip, flags))\n    return MZ_FALSE;\n  pZip->m_archive_size = size;\n  if (!mz_zip_reader_read_central_dir(pZip, flags))\n  {\n    mz_zip_reader_end(pZip);\n    return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n\nstatic size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n)\n{\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  size_t s = (file_ofs >= pZip->m_archive_size) ? 0 : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n);\n  memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s);\n  return s;\n}\n\nmz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags)\n{\n  if (!mz_zip_reader_init_internal(pZip, flags))\n    return MZ_FALSE;\n  pZip->m_archive_size = size;\n  pZip->m_pRead = mz_zip_mem_read_func;\n  pZip->m_pIO_opaque = pZip;\n#ifdef __cplusplus\n  pZip->m_pState->m_pMem = const_cast<void *>(pMem);\n#else\n  pZip->m_pState->m_pMem = (void *)pMem;\n#endif\n  pZip->m_pState->m_mem_size = size;\n  if (!mz_zip_reader_read_central_dir(pZip, flags))\n  {\n    mz_zip_reader_end(pZip);\n    return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nstatic size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n)\n{\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);\n  if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))\n    return 0;\n  return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile);\n}\n\nmz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags)\n{\n  mz_uint64 file_size;\n  MZ_FILE *pFile = MZ_FOPEN(pFilename, \"rb\");\n  if (!pFile)\n    return MZ_FALSE;\n  if (MZ_FSEEK64(pFile, 0, SEEK_END))\n  {\n    MZ_FCLOSE(pFile);\n    return MZ_FALSE;\n  }\n  file_size = MZ_FTELL64(pFile);\n  if (!mz_zip_reader_init_internal(pZip, flags))\n  {\n    MZ_FCLOSE(pFile);\n    return MZ_FALSE;\n  }\n  pZip->m_pRead = mz_zip_file_read_func;\n  pZip->m_pIO_opaque = pZip;\n  pZip->m_pState->m_pFile = pFile;\n  pZip->m_archive_size = file_size;\n  if (!mz_zip_reader_read_central_dir(pZip, flags))\n  {\n    mz_zip_reader_end(pZip);\n    return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n#endif // #ifndef MINIZ_NO_STDIO\n\nmz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip)\n{\n  return pZip ? pZip->m_total_files : 0;\n}\n\nstatic MZ_FORCEINLINE const mz_uint8 *mz_zip_reader_get_cdh(mz_zip_archive *pZip, mz_uint file_index)\n{\n  if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return NULL;\n  return &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index));\n}\n\nmz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index)\n{\n  mz_uint m_bit_flag;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if (!p)\n    return MZ_FALSE;\n  m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);\n  return (m_bit_flag & 1);\n}\n\nmz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index)\n{\n  mz_uint filename_len, external_attr;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if (!p)\n    return MZ_FALSE;\n\n  // First see if the filename ends with a '/' character.\n  filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  if (filename_len)\n  {\n    if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/')\n      return MZ_TRUE;\n  }\n\n  // Bugfix: This code was also checking if the internal attribute was non-zero, which wasn't correct.\n  // Most/all zip writers (hopefully) set DOS file/directory attributes in the low 16-bits, so check for the DOS directory flag and ignore the source OS ID in the created by field.\n  // FIXME: Remove this check? Is it necessary - we already check the filename.\n  external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);\n  if ((external_attr & 0x10) != 0)\n    return MZ_TRUE;\n\n  return MZ_FALSE;\n}\n\nmz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat)\n{\n  mz_uint n;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if ((!p) || (!pStat))\n    return MZ_FALSE;\n\n  // Unpack the central directory record.\n  pStat->m_file_index = file_index;\n  pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index);\n  pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS);\n  pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS);\n  pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);\n  pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS);\n#ifndef MINIZ_NO_TIME\n  pStat->m_time = mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS));\n#endif\n  pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS);\n  pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n  pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);\n  pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS);\n  pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);\n  pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS);\n\n  // Copy as much of the filename and comment as possible.\n  n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1);\n  memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); pStat->m_filename[n] = '\\0';\n\n  n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1);\n  pStat->m_comment_size = n;\n  memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); pStat->m_comment[n] = '\\0';\n\n  return MZ_TRUE;\n}\n\nmz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size)\n{\n  mz_uint n;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if (!p) { if (filename_buf_size) pFilename[0] = '\\0'; return 0; }\n  n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  if (filename_buf_size)\n  {\n    n = MZ_MIN(n, filename_buf_size - 1);\n    memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n);\n    pFilename[n] = '\\0';\n  }\n  return n + 1;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_reader_string_equal(const char *pA, const char *pB, mz_uint len, mz_uint flags)\n{\n  mz_uint i;\n  if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE)\n    return 0 == memcmp(pA, pB, len);\n  for (i = 0; i < len; ++i)\n    if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i]))\n      return MZ_FALSE;\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE int mz_zip_reader_filename_compare(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR, mz_uint r_len)\n{\n  const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE;\n  mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  mz_uint8 l = 0, r = 0;\n  pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n  pE = pL + MZ_MIN(l_len, r_len);\n  while (pL < pE)\n  {\n    if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR)))\n      break;\n    pL++; pR++;\n  }\n  return (pL == pE) ? (int)(l_len - r_len) : (l - r);\n}\n\nstatic int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip, const char *pFilename)\n{\n  mz_zip_internal_state *pState = pZip->m_pState;\n  const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;\n  const mz_zip_array *pCentral_dir = &pState->m_central_dir;\n  mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0);\n  const int size = pZip->m_total_files;\n  const mz_uint filename_len = (mz_uint)strlen(pFilename);\n  int l = 0, h = size - 1;\n  while (l <= h)\n  {\n    int m = (l + h) >> 1, file_index = pIndices[m], comp = mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len);\n    if (!comp)\n      return file_index;\n    else if (comp < 0)\n      l = m + 1;\n    else\n      h = m - 1;\n  }\n  return -1;\n}\n\nint mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags)\n{\n  mz_uint file_index; size_t name_len, comment_len;\n  if ((!pZip) || (!pZip->m_pState) || (!pName) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return -1;\n  if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) && (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_size))\n    return mz_zip_reader_locate_file_binary_search(pZip, pName);\n  name_len = strlen(pName); if (name_len > 0xFFFF) return -1;\n  comment_len = pComment ? strlen(pComment) : 0; if (comment_len > 0xFFFF) return -1;\n  for (file_index = 0; file_index < pZip->m_total_files; file_index++)\n  {\n    const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index));\n    mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n    const char *pFilename = (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n    if (filename_len < name_len)\n      continue;\n    if (comment_len)\n    {\n      mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS), file_comment_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS);\n      const char *pFile_comment = pFilename + filename_len + file_extra_len;\n      if ((file_comment_len != comment_len) || (!mz_zip_reader_string_equal(pComment, pFile_comment, file_comment_len, flags)))\n        continue;\n    }\n    if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len))\n    {\n      int ofs = filename_len - 1;\n      do\n      {\n        if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\\\') || (pFilename[ofs] == ':'))\n          break;\n      } while (--ofs >= 0);\n      ofs++;\n      pFilename += ofs; filename_len -= ofs;\n    }\n    if ((filename_len == name_len) && (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags)))\n      return file_index;\n  }\n  return -1;\n}\n\nmz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)\n{\n  int status = TINFL_STATUS_DONE;\n  mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail;\n  mz_zip_archive_file_stat file_stat;\n  void *pRead_buf;\n  mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;\n  tinfl_decompressor inflator;\n\n  if ((buf_size) && (!pBuf))\n    return MZ_FALSE;\n\n  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))\n    return MZ_FALSE;\n\n  // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes)\n  if (!file_stat.m_comp_size)\n    return MZ_TRUE;\n\n  // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers).\n  // I'm torn how to handle this case - should it fail instead?\n  if (mz_zip_reader_is_file_a_directory(pZip, file_index))\n    return MZ_TRUE;\n\n  // Encryption and patch files are not supported.\n  if (file_stat.m_bit_flag & (1 | 32))\n    return MZ_FALSE;\n\n  // This function only supports stored and deflate.\n  if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED))\n    return MZ_FALSE;\n\n  // Ensure supplied output buffer is large enough.\n  needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size : file_stat.m_uncomp_size;\n  if (buf_size < needed_size)\n    return MZ_FALSE;\n\n  // Read and parse the local directory entry.\n  cur_file_ofs = file_stat.m_local_header_ofs;\n  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)\n    return MZ_FALSE;\n\n  cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);\n  if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)\n    return MZ_FALSE;\n\n  if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method))\n  {\n    // The file is stored or the caller has requested the compressed data.\n    if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, (size_t)needed_size) != needed_size)\n      return MZ_FALSE;\n    return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32);\n  }\n\n  // Decompress the file either directly from memory or from a file input buffer.\n  tinfl_init(&inflator);\n\n  if (pZip->m_pState->m_pMem)\n  {\n    // Read directly from the archive in memory.\n    pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;\n    read_buf_size = read_buf_avail = file_stat.m_comp_size;\n    comp_remaining = 0;\n  }\n  else if (pUser_read_buf)\n  {\n    // Use a user provided read buffer.\n    if (!user_read_buf_size)\n      return MZ_FALSE;\n    pRead_buf = (mz_uint8 *)pUser_read_buf;\n    read_buf_size = user_read_buf_size;\n    read_buf_avail = 0;\n    comp_remaining = file_stat.m_comp_size;\n  }\n  else\n  {\n    // Temporarily allocate a read buffer.\n    read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE);\n#ifdef _MSC_VER\n    if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF))\n#else\n    if (((sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF))\n#endif\n      return MZ_FALSE;\n    if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size)))\n      return MZ_FALSE;\n    read_buf_avail = 0;\n    comp_remaining = file_stat.m_comp_size;\n  }\n\n  do\n  {\n    size_t in_buf_size, out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs);\n    if ((!read_buf_avail) && (!pZip->m_pState->m_pMem))\n    {\n      read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);\n      if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)\n      {\n        status = TINFL_STATUS_FAILED;\n        break;\n      }\n      cur_file_ofs += read_buf_avail;\n      comp_remaining -= read_buf_avail;\n      read_buf_ofs = 0;\n    }\n    in_buf_size = (size_t)read_buf_avail;\n    status = tinfl_decompress(&inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF | (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0));\n    read_buf_avail -= in_buf_size;\n    read_buf_ofs += in_buf_size;\n    out_buf_ofs += out_buf_size;\n  } while (status == TINFL_STATUS_NEEDS_MORE_INPUT);\n\n  if (status == TINFL_STATUS_DONE)\n  {\n    // Make sure the entire file was decompressed, and check its CRC.\n    if ((out_buf_ofs != file_stat.m_uncomp_size) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32))\n      status = TINFL_STATUS_FAILED;\n  }\n\n  if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf))\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n\n  return status == TINFL_STATUS_DONE;\n}\n\nmz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)\n{\n  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);\n  if (file_index < 0)\n    return MZ_FALSE;\n  return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size);\n}\n\nmz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags)\n{\n  return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, NULL, 0);\n}\n\nmz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags)\n{\n  return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf, buf_size, flags, NULL, 0);\n}\n\nvoid *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags)\n{\n  mz_uint64 comp_size, uncomp_size, alloc_size;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  void *pBuf;\n\n  if (pSize)\n    *pSize = 0;\n  if (!p)\n    return NULL;\n\n  comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n  uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);\n\n  alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size;\n#ifdef _MSC_VER\n  if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))\n#else\n  if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))\n#endif\n    return NULL;\n  if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size)))\n    return NULL;\n\n  if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, flags))\n  {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n    return NULL;\n  }\n\n  if (pSize) *pSize = (size_t)alloc_size;\n  return pBuf;\n}\n\nvoid *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags)\n{\n  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);\n  if (file_index < 0)\n  {\n    if (pSize) *pSize = 0;\n    return MZ_FALSE;\n  }\n  return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags);\n}\n\nmz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags)\n{\n  int status = TINFL_STATUS_DONE; mz_uint file_crc32 = MZ_CRC32_INIT;\n  mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, out_buf_ofs = 0, cur_file_ofs;\n  mz_zip_archive_file_stat file_stat;\n  void *pRead_buf = NULL; void *pWrite_buf = NULL;\n  mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;\n\n  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))\n    return MZ_FALSE;\n\n  // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes)\n  if (!file_stat.m_comp_size)\n    return MZ_TRUE;\n\n  // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers).\n  // I'm torn how to handle this case - should it fail instead?\n  if (mz_zip_reader_is_file_a_directory(pZip, file_index))\n    return MZ_TRUE;\n\n  // Encryption and patch files are not supported.\n  if (file_stat.m_bit_flag & (1 | 32))\n    return MZ_FALSE;\n\n  // This function only supports stored and deflate.\n  if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED))\n    return MZ_FALSE;\n\n  // Read and parse the local directory entry.\n  cur_file_ofs = file_stat.m_local_header_ofs;\n  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)\n    return MZ_FALSE;\n\n  cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);\n  if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)\n    return MZ_FALSE;\n\n  // Decompress the file either directly from memory or from a file input buffer.\n  if (pZip->m_pState->m_pMem)\n  {\n    pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;\n    read_buf_size = read_buf_avail = file_stat.m_comp_size;\n    comp_remaining = 0;\n  }\n  else\n  {\n    read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE);\n    if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size)))\n      return MZ_FALSE;\n    read_buf_avail = 0;\n    comp_remaining = file_stat.m_comp_size;\n  }\n\n  if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method))\n  {\n    // The file is stored or the caller has requested the compressed data.\n    if (pZip->m_pState->m_pMem)\n    {\n#ifdef _MSC_VER\n      if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF))\n#else\n      if (((sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF))\n#endif\n        return MZ_FALSE;\n      if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)file_stat.m_comp_size) != file_stat.m_comp_size)\n        status = TINFL_STATUS_FAILED;\n      else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))\n        file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)file_stat.m_comp_size);\n      cur_file_ofs += file_stat.m_comp_size;\n      out_buf_ofs += file_stat.m_comp_size;\n      comp_remaining = 0;\n    }\n    else\n    {\n      while (comp_remaining)\n      {\n        read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);\n        if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)\n        {\n          status = TINFL_STATUS_FAILED;\n          break;\n        }\n\n        if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))\n          file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail);\n\n        if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)\n        {\n          status = TINFL_STATUS_FAILED;\n          break;\n        }\n        cur_file_ofs += read_buf_avail;\n        out_buf_ofs += read_buf_avail;\n        comp_remaining -= read_buf_avail;\n      }\n    }\n  }\n  else\n  {\n    tinfl_decompressor inflator;\n    tinfl_init(&inflator);\n\n    if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, TINFL_LZ_DICT_SIZE)))\n      status = TINFL_STATUS_FAILED;\n    else\n    {\n      do\n      {\n        mz_uint8 *pWrite_buf_cur = (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));\n        size_t in_buf_size, out_buf_size = TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));\n        if ((!read_buf_avail) && (!pZip->m_pState->m_pMem))\n        {\n          read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);\n          if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)\n          {\n            status = TINFL_STATUS_FAILED;\n            break;\n          }\n          cur_file_ofs += read_buf_avail;\n          comp_remaining -= read_buf_avail;\n          read_buf_ofs = 0;\n        }\n\n        in_buf_size = (size_t)read_buf_avail;\n        status = tinfl_decompress(&inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size, comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0);\n        read_buf_avail -= in_buf_size;\n        read_buf_ofs += in_buf_size;\n\n        if (out_buf_size)\n        {\n          if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != out_buf_size)\n          {\n            status = TINFL_STATUS_FAILED;\n            break;\n          }\n          file_crc32 = (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size);\n          if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size)\n          {\n            status = TINFL_STATUS_FAILED;\n            break;\n          }\n        }\n      } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) || (status == TINFL_STATUS_HAS_MORE_OUTPUT));\n    }\n  }\n\n  if ((status == TINFL_STATUS_DONE) && (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)))\n  {\n    // Make sure the entire file was decompressed, and check its CRC.\n    if ((out_buf_ofs != file_stat.m_uncomp_size) || (file_crc32 != file_stat.m_crc32))\n      status = TINFL_STATUS_FAILED;\n  }\n\n  if (!pZip->m_pState->m_pMem)\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n  if (pWrite_buf)\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf);\n\n  return status == TINFL_STATUS_DONE;\n}\n\nmz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags)\n{\n  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);\n  if (file_index < 0)\n    return MZ_FALSE;\n  return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque, flags);\n}\n\n#ifndef MINIZ_NO_STDIO\nstatic size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs, const void *pBuf, size_t n)\n{\n  (void)ofs; return MZ_FWRITE(pBuf, 1, n, (MZ_FILE*)pOpaque);\n}\n\nmz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags)\n{\n  mz_bool status;\n  mz_zip_archive_file_stat file_stat;\n  MZ_FILE *pFile;\n  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))\n    return MZ_FALSE;\n  pFile = MZ_FOPEN(pDst_filename, \"wb\");\n  if (!pFile)\n    return MZ_FALSE;\n  status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags);\n  if (MZ_FCLOSE(pFile) == EOF)\n    return MZ_FALSE;\n#ifndef MINIZ_NO_TIME\n  if (status)\n    mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time);\n#endif\n  return status;\n}\n#endif // #ifndef MINIZ_NO_STDIO\n\nmz_bool mz_zip_reader_end(mz_zip_archive *pZip)\n{\n  if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return MZ_FALSE;\n\n  if (pZip->m_pState)\n  {\n    mz_zip_internal_state *pState = pZip->m_pState; pZip->m_pState = NULL;\n    mz_zip_array_clear(pZip, &pState->m_central_dir);\n    mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);\n    mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);\n\n#ifndef MINIZ_NO_STDIO\n    if (pState->m_pFile)\n    {\n      MZ_FCLOSE(pState->m_pFile);\n      pState->m_pFile = NULL;\n    }\n#endif // #ifndef MINIZ_NO_STDIO\n\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pState);\n  }\n  pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;\n\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags)\n{\n  int file_index = mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags);\n  if (file_index < 0)\n    return MZ_FALSE;\n  return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags);\n}\n#endif\n\n// ------------------- .ZIP archive writing\n\n#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\nstatic void mz_write_le16(mz_uint8 *p, mz_uint16 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); }\nstatic void mz_write_le32(mz_uint8 *p, mz_uint32 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); p[2] = (mz_uint8)(v >> 16); p[3] = (mz_uint8)(v >> 24); }\n#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v))\n#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v))\n\nmz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size)\n{\n  if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))\n    return MZ_FALSE;\n\n  if (pZip->m_file_offset_alignment)\n  {\n    // Ensure user specified file offset alignment is a power of 2.\n    if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1))\n      return MZ_FALSE;\n  }\n\n  if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func;\n  if (!pZip->m_pFree) pZip->m_pFree = def_free_func;\n  if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func;\n\n  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;\n  pZip->m_archive_size = existing_size;\n  pZip->m_central_directory_file_ofs = 0;\n  pZip->m_total_files = 0;\n\n  if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))\n    return MZ_FALSE;\n  memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32));\n  return MZ_TRUE;\n}\n\nstatic size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n)\n{\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  mz_zip_internal_state *pState = pZip->m_pState;\n  mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size);\n#ifdef _MSC_VER\n  if ((!n) || ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))\n#else\n  if ((!n) || ((sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))\n#endif\n    return 0;\n  if (new_size > pState->m_mem_capacity)\n  {\n    void *pNew_block;\n    size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity); while (new_capacity < new_size) new_capacity *= 2;\n    if (NULL == (pNew_block = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity)))\n      return 0;\n    pState->m_pMem = pNew_block; pState->m_mem_capacity = new_capacity;\n  }\n  memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n);\n  pState->m_mem_size = (size_t)new_size;\n  return n;\n}\n\nmz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size)\n{\n  pZip->m_pWrite = mz_zip_heap_write_func;\n  pZip->m_pIO_opaque = pZip;\n  if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning))\n    return MZ_FALSE;\n  if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size, size_to_reserve_at_beginning)))\n  {\n    if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, initial_allocation_size)))\n    {\n      mz_zip_writer_end(pZip);\n      return MZ_FALSE;\n    }\n    pZip->m_pState->m_mem_capacity = initial_allocation_size;\n  }\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nstatic size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n)\n{\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);\n  if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))\n    return 0;\n  return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile);\n}\n\nmz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning)\n{\n  MZ_FILE *pFile;\n  pZip->m_pWrite = mz_zip_file_write_func;\n  pZip->m_pIO_opaque = pZip;\n  if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning))\n    return MZ_FALSE;\n  if (NULL == (pFile = MZ_FOPEN(pFilename, \"wb\")))\n  {\n    mz_zip_writer_end(pZip);\n    return MZ_FALSE;\n  }\n  pZip->m_pState->m_pFile = pFile;\n  if (size_to_reserve_at_beginning)\n  {\n    mz_uint64 cur_ofs = 0; char buf[4096]; MZ_CLEAR_OBJ(buf);\n    do\n    {\n      size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning);\n      if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n)\n      {\n        mz_zip_writer_end(pZip);\n        return MZ_FALSE;\n      }\n      cur_ofs += n; size_to_reserve_at_beginning -= n;\n    } while (size_to_reserve_at_beginning);\n  }\n  return MZ_TRUE;\n}\n#endif // #ifndef MINIZ_NO_STDIO\n\nmz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename)\n{\n  mz_zip_internal_state *pState;\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return MZ_FALSE;\n  // No sense in trying to write to an archive that's already at the support max size\n  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n\n  if (pState->m_pFile)\n  {\n#ifdef MINIZ_NO_STDIO\n    pFilename; return MZ_FALSE;\n#else\n    // Archive is being read from stdio - try to reopen as writable.\n    if (pZip->m_pIO_opaque != pZip)\n      return MZ_FALSE;\n    if (!pFilename)\n      return MZ_FALSE;\n    pZip->m_pWrite = mz_zip_file_write_func;\n    if (NULL == (pState->m_pFile = MZ_FREOPEN(pFilename, \"r+b\", pState->m_pFile)))\n    {\n      // The mz_zip_archive is now in a bogus state because pState->m_pFile is NULL, so just close it.\n      mz_zip_reader_end(pZip);\n      return MZ_FALSE;\n    }\n#endif // #ifdef MINIZ_NO_STDIO\n  }\n  else if (pState->m_pMem)\n  {\n    // Archive lives in a memory block. Assume it's from the heap that we can resize using the realloc callback.\n    if (pZip->m_pIO_opaque != pZip)\n      return MZ_FALSE;\n    pState->m_mem_capacity = pState->m_mem_size;\n    pZip->m_pWrite = mz_zip_heap_write_func;\n  }\n  // Archive is being read via a user provided read function - make sure the user has specified a write function too.\n  else if (!pZip->m_pWrite)\n    return MZ_FALSE;\n\n  // Start writing new files at the archive's current central directory location.\n  pZip->m_archive_size = pZip->m_central_directory_file_ofs;\n  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;\n  pZip->m_central_directory_file_ofs = 0;\n\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags)\n{\n  return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0);\n}\n\ntypedef struct\n{\n  mz_zip_archive *m_pZip;\n  mz_uint64 m_cur_archive_file_ofs;\n  mz_uint64 m_comp_size;\n} mz_zip_writer_add_state;\n\nstatic mz_bool mz_zip_writer_add_put_buf_callback(const void* pBuf, int len, void *pUser)\n{\n  mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser;\n  if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque, pState->m_cur_archive_file_ofs, pBuf, len) != len)\n    return MZ_FALSE;\n  pState->m_cur_archive_file_ofs += len;\n  pState->m_comp_size += len;\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_create_local_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date)\n{\n  (void)pZip;\n  memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size);\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_create_central_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes)\n{\n  (void)pZip;\n  memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs);\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_add_to_central_dir(mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size, const void *pExtra, mz_uint16 extra_size, const void *pComment, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes)\n{\n  mz_zip_internal_state *pState = pZip->m_pState;\n  mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size;\n  size_t orig_central_dir_size = pState->m_central_dir.m_size;\n  mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];\n\n  // No zip64 support yet\n  if ((local_header_ofs > 0xFFFFFFFF) || (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + comment_size) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes))\n    return MZ_FALSE;\n\n  if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename, filename_size)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra, extra_size)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment, comment_size)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &central_dir_ofs, 1)))\n  {\n    // Try to push the central directory array back into its original state.\n    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE);\n    return MZ_FALSE;\n  }\n\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name)\n{\n  // Basic ZIP archive filename validity checks: Valid filenames cannot start with a forward slash, cannot contain a drive letter, and cannot use DOS-style backward slashes.\n  if (*pArchive_name == '/')\n    return MZ_FALSE;\n  while (*pArchive_name)\n  {\n    if ((*pArchive_name == '\\\\') || (*pArchive_name == ':'))\n      return MZ_FALSE;\n    pArchive_name++;\n  }\n  return MZ_TRUE;\n}\n\nstatic mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip)\n{\n  mz_uint32 n;\n  if (!pZip->m_file_offset_alignment)\n    return 0;\n  n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1));\n  return (pZip->m_file_offset_alignment - n) & (pZip->m_file_offset_alignment - 1);\n}\n\nstatic mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, mz_uint64 cur_file_ofs, mz_uint32 n)\n{\n  char buf[4096];\n  memset(buf, 0, MZ_MIN(sizeof(buf), n));\n  while (n)\n  {\n    mz_uint32 s = MZ_MIN(sizeof(buf), n);\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s)\n      return MZ_FALSE;\n    cur_file_ofs += s; n -= s;\n  }\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32)\n{\n  mz_uint16 method = 0, dos_time = 0, dos_date = 0;\n  mz_uint level, ext_attributes = 0, num_alignment_padding_bytes;\n  mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0;\n  size_t archive_name_size;\n  mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];\n  tdefl_compressor *pComp = NULL;\n  mz_bool store_data_uncompressed;\n  mz_zip_internal_state *pState;\n\n  if ((int)level_and_flags < 0)\n    level_and_flags = MZ_DEFAULT_LEVEL;\n  level = level_and_flags & 0xF;\n  store_data_uncompressed = ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA));\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) || (!pArchive_name) || ((comment_size) && (!pComment)) || (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n\n  if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size))\n    return MZ_FALSE;\n  // No zip64 support yet\n  if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF))\n    return MZ_FALSE;\n  if (!mz_zip_writer_validate_archive_name(pArchive_name))\n    return MZ_FALSE;\n\n#ifndef MINIZ_NO_TIME\n  {\n    time_t cur_time; time(&cur_time);\n    mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date);\n  }\n#endif // #ifndef MINIZ_NO_TIME\n\n  archive_name_size = strlen(pArchive_name);\n  if (archive_name_size > 0xFFFF)\n    return MZ_FALSE;\n\n  num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);\n\n  // no zip64 support yet\n  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/'))\n  {\n    // Set DOS Subdirectory attribute bit.\n    ext_attributes |= 0x10;\n    // Subdirectories cannot contain data.\n    if ((buf_size) || (uncomp_size))\n      return MZ_FALSE;\n  }\n\n  // Try to do any allocations before writing to the archive, so if an allocation fails the file remains unmodified. (A good idea if we're doing an in-place modification.)\n  if ((!mz_zip_array_ensure_room(pZip, &pState->m_central_dir, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size)) || (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1)))\n    return MZ_FALSE;\n\n  if ((!store_data_uncompressed) && (buf_size))\n  {\n    if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor))))\n      return MZ_FALSE;\n  }\n\n  if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header)))\n  {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n    return MZ_FALSE;\n  }\n  local_dir_header_ofs += num_alignment_padding_bytes;\n  if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); }\n  cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header);\n\n  MZ_CLEAR_OBJ(local_dir_header);\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size)\n  {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n    return MZ_FALSE;\n  }\n  cur_archive_file_ofs += archive_name_size;\n\n  if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA))\n  {\n    uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8*)pBuf, buf_size);\n    uncomp_size = buf_size;\n    if (uncomp_size <= 3)\n    {\n      level = 0;\n      store_data_uncompressed = MZ_TRUE;\n    }\n  }\n\n  if (store_data_uncompressed)\n  {\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf, buf_size) != buf_size)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n      return MZ_FALSE;\n    }\n\n    cur_archive_file_ofs += buf_size;\n    comp_size = buf_size;\n\n    if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)\n      method = MZ_DEFLATED;\n  }\n  else if (buf_size)\n  {\n    mz_zip_writer_add_state state;\n\n    state.m_pZip = pZip;\n    state.m_cur_archive_file_ofs = cur_archive_file_ofs;\n    state.m_comp_size = 0;\n\n    if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) ||\n        (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) != TDEFL_STATUS_DONE))\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n      return MZ_FALSE;\n    }\n\n    comp_size = state.m_comp_size;\n    cur_archive_file_ofs = state.m_cur_archive_file_ofs;\n\n    method = MZ_DEFLATED;\n  }\n\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n  pComp = NULL;\n\n  // no zip64 support yet\n  if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date))\n    return MZ_FALSE;\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes))\n    return MZ_FALSE;\n\n  pZip->m_total_files++;\n  pZip->m_archive_size = cur_archive_file_ofs;\n\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags)\n{\n  mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes;\n  mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0;\n  mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0;\n  size_t archive_name_size;\n  mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];\n  MZ_FILE *pSrc_file = NULL;\n\n  if ((int)level_and_flags < 0)\n    level_and_flags = MZ_DEFAULT_LEVEL;\n  level = level_and_flags & 0xF;\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION))\n    return MZ_FALSE;\n  if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)\n    return MZ_FALSE;\n  if (!mz_zip_writer_validate_archive_name(pArchive_name))\n    return MZ_FALSE;\n\n  archive_name_size = strlen(pArchive_name);\n  if (archive_name_size > 0xFFFF)\n    return MZ_FALSE;\n\n  num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);\n\n  // no zip64 support yet\n  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date))\n    return MZ_FALSE;\n    \n  pSrc_file = MZ_FOPEN(pSrc_filename, \"rb\");\n  if (!pSrc_file)\n    return MZ_FALSE;\n  MZ_FSEEK64(pSrc_file, 0, SEEK_END);\n  uncomp_size = MZ_FTELL64(pSrc_file);\n  MZ_FSEEK64(pSrc_file, 0, SEEK_SET);\n\n  if (uncomp_size > 0xFFFFFFFF)\n  {\n    // No zip64 support yet\n    MZ_FCLOSE(pSrc_file);\n    return MZ_FALSE;\n  }\n  if (uncomp_size <= 3)\n    level = 0;\n\n  if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header)))\n  {\n    MZ_FCLOSE(pSrc_file);\n    return MZ_FALSE;\n  }\n  local_dir_header_ofs += num_alignment_padding_bytes;\n  if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); }\n  cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header);\n\n  MZ_CLEAR_OBJ(local_dir_header);\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size)\n  {\n    MZ_FCLOSE(pSrc_file);\n    return MZ_FALSE;\n  }\n  cur_archive_file_ofs += archive_name_size;\n\n  if (uncomp_size)\n  {\n    mz_uint64 uncomp_remaining = uncomp_size;\n    void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE);\n    if (!pRead_buf)\n    {\n      MZ_FCLOSE(pSrc_file);\n      return MZ_FALSE;\n    }\n\n    if (!level)\n    {\n      while (uncomp_remaining)\n      {\n        mz_uint n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining);\n        if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n))\n        {\n          pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n          MZ_FCLOSE(pSrc_file);\n          return MZ_FALSE;\n        }\n        uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n);\n        uncomp_remaining -= n;\n        cur_archive_file_ofs += n;\n      }\n      comp_size = uncomp_size;\n    }\n    else\n    {\n      mz_bool result = MZ_FALSE;\n      mz_zip_writer_add_state state;\n      tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor));\n      if (!pComp)\n      {\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n        MZ_FCLOSE(pSrc_file);\n        return MZ_FALSE;\n      }\n\n      state.m_pZip = pZip;\n      state.m_cur_archive_file_ofs = cur_archive_file_ofs;\n      state.m_comp_size = 0;\n\n      if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY)\n      {\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n        MZ_FCLOSE(pSrc_file);\n        return MZ_FALSE;\n      }\n\n      for ( ; ; )\n      {\n        size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, MZ_ZIP_MAX_IO_BUF_SIZE);\n        tdefl_status status;\n\n        if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size)\n          break;\n\n        uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size);\n        uncomp_remaining -= in_buf_size;\n\n        status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH);\n        if (status == TDEFL_STATUS_DONE)\n        {\n          result = MZ_TRUE;\n          break;\n        }\n        else if (status != TDEFL_STATUS_OKAY)\n          break;\n      }\n\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n\n      if (!result)\n      {\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n        MZ_FCLOSE(pSrc_file);\n        return MZ_FALSE;\n      }\n\n      comp_size = state.m_comp_size;\n      cur_archive_file_ofs = state.m_cur_archive_file_ofs;\n\n      method = MZ_DEFLATED;\n    }\n\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n  }\n\n  MZ_FCLOSE(pSrc_file); pSrc_file = NULL;\n\n  // no zip64 support yet\n  if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date))\n    return MZ_FALSE;\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes))\n    return MZ_FALSE;\n\n  pZip->m_total_files++;\n  pZip->m_archive_size = cur_archive_file_ofs;\n\n  return MZ_TRUE;\n}\n#endif // #ifndef MINIZ_NO_STDIO\n\nmz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index)\n{\n  mz_uint n, bit_flags, num_alignment_padding_bytes;\n  mz_uint64 comp_bytes_remaining, local_dir_header_ofs;\n  mz_uint64 cur_src_file_ofs, cur_dst_file_ofs;\n  mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;\n  mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];\n  size_t orig_central_dir_size;\n  mz_zip_internal_state *pState;\n  void *pBuf; const mz_uint8 *pSrc_central_header;\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))\n    return MZ_FALSE;\n  if (NULL == (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index)))\n    return MZ_FALSE;\n  pState = pZip->m_pState;\n\n  num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);\n\n  // no zip64 support yet\n  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  cur_src_file_ofs = MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS);\n  cur_dst_file_ofs = pZip->m_archive_size;\n\n  if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)\n    return MZ_FALSE;\n  cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;\n\n  if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, num_alignment_padding_bytes))\n    return MZ_FALSE;\n  cur_dst_file_ofs += num_alignment_padding_bytes;\n  local_dir_header_ofs = cur_dst_file_ofs;\n  if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); }\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;\n\n  n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);\n  comp_bytes_remaining = n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n\n  if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)MZ_MAX(sizeof(mz_uint32) * 4, MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining)))))\n    return MZ_FALSE;\n\n  while (comp_bytes_remaining)\n  {\n    n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining);\n    if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, n) != n)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n    cur_src_file_ofs += n;\n\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n    cur_dst_file_ofs += n;\n\n    comp_bytes_remaining -= n;\n  }\n\n  bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS);\n  if (bit_flags & 8)\n  {\n    // Copy data descriptor\n    if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n\n    n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3);\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n\n    cur_src_file_ofs += n;\n    cur_dst_file_ofs += n;\n  }\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n\n  // no zip64 support yet\n  if (cur_dst_file_ofs > 0xFFFFFFFF)\n    return MZ_FALSE;\n\n  orig_central_dir_size = pState->m_central_dir.m_size;\n\n  memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);\n  MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_dir_header_ofs);\n  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE))\n    return MZ_FALSE;\n\n  n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS);\n  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n))\n  {\n    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE);\n    return MZ_FALSE;\n  }\n\n  if (pState->m_central_dir.m_size > 0xFFFFFFFF)\n    return MZ_FALSE;\n  n = (mz_uint32)orig_central_dir_size;\n  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1))\n  {\n    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE);\n    return MZ_FALSE;\n  }\n\n  pZip->m_total_files++;\n  pZip->m_archive_size = cur_dst_file_ofs;\n\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip)\n{\n  mz_zip_internal_state *pState;\n  mz_uint64 central_dir_ofs, central_dir_size;\n  mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE];\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n\n  // no zip64 support yet\n  if ((pZip->m_total_files > 0xFFFF) || ((pZip->m_archive_size + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  central_dir_ofs = 0;\n  central_dir_size = 0;\n  if (pZip->m_total_files)\n  {\n    // Write central directory\n    central_dir_ofs = pZip->m_archive_size;\n    central_dir_size = pState->m_central_dir.m_size;\n    pZip->m_central_directory_file_ofs = central_dir_ofs;\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs, pState->m_central_dir.m_p, (size_t)central_dir_size) != central_dir_size)\n      return MZ_FALSE;\n    pZip->m_archive_size += central_dir_size;\n  }\n\n  // Write end of central directory record\n  MZ_CLEAR_OBJ(hdr);\n  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG);\n  MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, pZip->m_total_files);\n  MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files);\n  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size);\n  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs);\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, sizeof(hdr)) != sizeof(hdr))\n    return MZ_FALSE;\n#ifndef MINIZ_NO_STDIO\n  if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF))\n    return MZ_FALSE;\n#endif // #ifndef MINIZ_NO_STDIO\n\n  pZip->m_archive_size += sizeof(hdr);\n\n  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED;\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize)\n{\n  if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize))\n    return MZ_FALSE;\n  if (pZip->m_pWrite != mz_zip_heap_write_func)\n    return MZ_FALSE;\n  if (!mz_zip_writer_finalize_archive(pZip))\n    return MZ_FALSE;\n\n  *pBuf = pZip->m_pState->m_pMem;\n  *pSize = pZip->m_pState->m_mem_size;\n  pZip->m_pState->m_pMem = NULL;\n  pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0;\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_end(mz_zip_archive *pZip)\n{\n  mz_zip_internal_state *pState;\n  mz_bool status = MZ_TRUE;\n  if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) && (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED)))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n  pZip->m_pState = NULL;\n  mz_zip_array_clear(pZip, &pState->m_central_dir);\n  mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);\n  mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);\n\n#ifndef MINIZ_NO_STDIO\n  if (pState->m_pFile)\n  {\n    MZ_FCLOSE(pState->m_pFile);\n    pState->m_pFile = NULL;\n  }\n#endif // #ifndef MINIZ_NO_STDIO\n\n  if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem))\n  {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem);\n    pState->m_pMem = NULL;\n  }\n\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pState);\n  pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;\n  return status;\n}\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags)\n{\n  mz_bool status, created_new_archive = MZ_FALSE;\n  mz_zip_archive zip_archive;\n  struct MZ_FILE_STAT_STRUCT file_stat;\n  MZ_CLEAR_OBJ(zip_archive);\n  if ((int)level_and_flags < 0)\n     level_and_flags = MZ_DEFAULT_LEVEL;\n  if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || ((comment_size) && (!pComment)) || ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION))\n    return MZ_FALSE;\n  if (!mz_zip_writer_validate_archive_name(pArchive_name))\n    return MZ_FALSE;\n  if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0)\n  {\n    // Create a new archive.\n    if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0))\n      return MZ_FALSE;\n    created_new_archive = MZ_TRUE;\n  }\n  else\n  {\n    // Append to an existing archive.\n    if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))\n      return MZ_FALSE;\n    if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename))\n    {\n      mz_zip_reader_end(&zip_archive);\n      return MZ_FALSE;\n    }\n  }\n  status = mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, 0, 0);\n  // Always finalize, even if adding failed for some reason, so we have a valid central directory. (This may not always succeed, but we can try.)\n  if (!mz_zip_writer_finalize_archive(&zip_archive))\n    status = MZ_FALSE;\n  if (!mz_zip_writer_end(&zip_archive))\n    status = MZ_FALSE;\n  if ((!status) && (created_new_archive))\n  {\n    // It's a new archive and something went wrong, so just delete it.\n    int ignoredStatus = MZ_DELETE_FILE(pZip_filename);\n    (void)ignoredStatus;\n  }\n  return status;\n}\n\nvoid *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint flags)\n{\n  int file_index;\n  mz_zip_archive zip_archive;\n  void *p = NULL;\n\n  if (pSize)\n    *pSize = 0;\n\n  if ((!pZip_filename) || (!pArchive_name))\n    return NULL;\n\n  MZ_CLEAR_OBJ(zip_archive);\n  if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))\n    return NULL;\n\n  if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL, flags)) >= 0)\n    p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags);\n\n  mz_zip_reader_end(&zip_archive);\n  return p;\n}\n\n#endif // #ifndef MINIZ_NO_STDIO\n\n#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\n#endif // #ifndef MINIZ_NO_ARCHIVE_APIS\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // MINIZ_HEADER_FILE_ONLY\n\n/*\n  This is free and unencumbered software released into the public domain.\n\n  Anyone is free to copy, modify, publish, use, compile, sell, or\n  distribute this software, either in source code form or as a compiled\n  binary, for any purpose, commercial or non-commercial, and by any\n  means.\n\n  In jurisdictions that recognize copyright laws, the author or authors\n  of this software dedicate any and all copyright interest in the\n  software to the public domain. We make this dedication for the benefit\n  of the public at large and to the detriment of our heirs and\n  successors. We intend this dedication to be an overt act of\n  relinquishment in perpetuity of all present and future rights to this\n  software under copyright law.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n  OTHER DEALINGS IN THE SOFTWARE.\n\n  For more information, please refer to <http://unlicense.org/>\n*/\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TMXLite/miniz.h",
    "content": "/*\nminiz public domain replacement for zlib. See miniz.c\nfor more information.\n*/\n#ifndef MINIZ_HEADER_FILE_ONLY\n#define MINIZ_HEADER_FILE_ONLY\n#include \"miniz.c\"\n#endif //MINIZ_HEADER_FILE_ONLY"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TinyFileDialogs/TinyDialogBox.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2021 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef TINYDIALOGBOX_H_INCLUDED\n#define TINYDIALOGBOX_H_INCLUDED\n\n#if !defined(__ANDROID__)\n#include \"../../ext_lib/TinyFileDialogs/tinyfiledialogs.h\"\n#include \"../../system/function/GameFunction.h\"\n\n////////////////////////////////////////////////////////////\n/// tinyString is a custom type it changes depending on the target platform (windows / linux)\n/// on windows it becomes @a wchar_t @a const* and on linux @a char @a const*\n////////////////////////////////////////////////////////////\n#if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\ntypedef wchar_t const* tinyString;\n#else\ntypedef char const* tinyString;\n#endif\n\nnamespace is\n{\n    /// return file path\n    static tinyString TINY_FILE_DIALOGBOX_PATH;\n\n    /// \\brief allow use tinyfiledialog lib to show windows diaglog box\n    class TinyDialogBox\n    {\n    public:\n        enum FileDialogType\n        {\n            SAVE_FILE,\n            LOAD_FILE\n        };\n        enum DialogType\n        {\n            OK,\n            OKCANCEL,\n            YESNO\n        };\n        enum IconType\n        {\n            INFO,\n            WARNING,\n            ERROR_ICO,\n            QUESTION\n        };\n\n        static tinyString const enumDialogTypeToStr(DialogType val)\n        {\n            switch (val)\n            {\n                case DialogType::OKCANCEL :\n                    return (\n                            #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                            L\"okcancel\"\n                            #else\n                            \"okcancel\"\n                            #endif\n                            );\n                break;\n                case DialogType::YESNO :\n                    return (\n                            #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                            L\"yesno\"\n                            #else\n                            \"yesno\"\n                            #endif\n                            );\n                break;\n                default :\n                    return (\n                            #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                            L\"ok\"\n                            #else\n                            \"ok\"\n                            #endif\n                            );\n                break;\n            }\n        }\n        static tinyString const enumIconTypeToStr(IconType val)\n        {\n            switch (val)\n            {\n                case IconType::QUESTION :\n                    return (\n                            #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                            L\"question\"\n                            #else\n                            \"question\"\n                            #endif\n                            );\n                break;\n                case IconType::ERROR_ICO :\n                    return (\n                            #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                            L\"error\"\n                            #else\n                            \"error\"\n                            #endif\n                            );\n                break;\n                case IconType::WARNING :\n                    return (\n                            #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                            L\"warning\"\n                            #else\n                            \"warning\"\n                            #endif\n                            );\n                break;\n                default :\n                    return (\n                            #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                            L\"info\"\n                            #else\n                            \"info\"\n                            #endif\n                            );\n                break;\n            }\n        }\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief show windows dialog\n        ///\n        /// \\param saveFile true to display a file save dialog box, false to display a load file dialog box\n        ///\n        /// \\return @a 1 when user click on @a OK button and @a 0 when @a CANCEL or @a NO button is clicked\n        ///\n        ////////////////////////////////////////////////////////////\n        static int showDialogBox(const std::string& title,\n                                 const std::string& msg,\n                                 DialogType dialogType,\n                                 IconType iconType\n                                 )\n        {\n            tinyString const _dialogType = enumDialogTypeToStr(dialogType);\n            tinyString const _iconType = enumIconTypeToStr(iconType);\n            return (\n                    #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                    tinyfd_messageBoxW(is::strToWStr(title).c_str(), is::strToWStr(msg).c_str(), _dialogType, _iconType, 1)\n                    #else\n                    tinyfd_messageBox(title.c_str(), msg.c_str(), _dialogType, _iconType, 1)\n                    #endif\n                    );\n        }\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief show windows file dialog\n        ///\n        /// \\param saveFile @a true to display a file save dialog box, @a false to display a load file dialog box\n        ///\n        /// \\return file path if the function succeeded and @a \"\" (empty string) is faliled\n        ///\n        ////////////////////////////////////////////////////////////\n        static std::string showFileDialogBox(FileDialogType type,\n                                             const std::string& title,\n                                             tinyString filterPatterns[],\n                                             const std::string& fileName = \"file\",\n                                             const std::string& msgError = \"Unable to access file!\",\n                                             const std::string& errTitle = \"Error\"\n                                             )\n        {\n            if (type == FileDialogType::SAVE_FILE)\n            {\n                TINY_FILE_DIALOGBOX_PATH =\n                                            #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                                            tinyfd_saveFileDialogW(is::strToWStr(title).c_str(), is::strToWStr(fileName).c_str(), 2, filterPatterns, NULL);\n                                            #else\n                                            tinyfd_saveFileDialog(title.c_str(), fileName.c_str(), 2, filterPatterns, NULL);\n                                            #endif\n            }\n            else\n            {\n                TINY_FILE_DIALOGBOX_PATH =\n                                            #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                                            tinyfd_openFileDialogW(is::strToWStr(title).c_str(), L\"\", 2, filterPatterns, NULL, 0);\n                                            #else\n                                            tinyfd_openFileDialog(title.c_str(), \"\", 2, filterPatterns, NULL, 0);\n                                            #endif\n            }\n            if (!TINY_FILE_DIALOGBOX_PATH)\n            {\n                showDialogBox(errTitle, msgError, DialogType::OK, IconType::ERROR_ICO);\n            }\n            else\n            {\n                return (\n                        #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                        is::w_chart_tToStr(TINY_FILE_DIALOGBOX_PATH)\n                        #else\n                        TINY_FILE_DIALOGBOX_PATH\n                        #endif\n                        );\n            }\n            return \"\";\n        }\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief show windows select folder dialog\n        ///\n        /// \\return directory path if the function succeeded and @a \"\" (empty string) is faliled\n        ///\n        ////////////////////////////////////////////////////////////\n        static std::string showFolderDialogBox(const std::string& title,\n                                               const std::string& defaultPath\n                                               #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                                                = \"C:\\\\\",\n                                               #else\n                                                = \"/usr/local\",\n                                               #endif\n                                               const std::string& msgError = \"Unable to access folder!\",\n                                               const std::string& errTitle = \"Error\"\n                                               )\n        {\n            TINY_FILE_DIALOGBOX_PATH =\n                                        #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                                        tinyfd_selectFolderDialogW(is::strToWStr(title).c_str(), is::strToWStr(defaultPath).c_str());\n                                        #else\n                                        tinyfd_selectFolderDialog(title.c_str(), defaultPath.c_str());\n                                        #endif\n            if (!TINY_FILE_DIALOGBOX_PATH)\n            {\n                showDialogBox(errTitle, msgError, DialogType::OK, IconType::ERROR_ICO);\n            }\n            else\n            {\n                return (\n                        #if !defined(SFML_SYSTEM_LINUX) && !defined(IS_ENGINE_LINUX)\n                        is::w_chart_tToStr(TINY_FILE_DIALOGBOX_PATH)\n                        #else\n                        TINY_FILE_DIALOGBOX_PATH\n                        #endif\n                        );\n            }\n            return \"\";\n        }\n\n    };\n}\n#endif // defined\n\n#endif // TINYDIALOGBOX_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.cpp",
    "content": "/*_________\n /         \\ tinyfiledialogs.c v3.4.3 [Dec 8, 2019] zlib licence\n |tiny file| Unique code file created [November 9, 2014]\n | dialogs | Copyright (c) 2014 - 2018 Guillaume Vareille http://ysengrin.com\n \\____  ___/ http://tinyfiledialogs.sourceforge.net\n      \\|     git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd\n         ____________________________________________\n        |                                            |\n        |   email: tinyfiledialogs at ysengrin.com   |\n        |____________________________________________|\n         ___________________________________________________________________\n        |                                                                   |\n        | the windows only wchar_t UTF-16 prototypes are in the header file |\n        |___________________________________________________________________|\n\nPlease upvote my stackoverflow answer https://stackoverflow.com/a/47651444\n\ntiny file dialogs (cross-platform C C++)\nInputBox PasswordBox MessageBox ColorPicker\nOpenFileDialog SaveFileDialog SelectFolderDialog\nNative dialog library for WINDOWS MAC OSX GTK+ QT CONSOLE & more\nSSH supported via automatic switch to console mode or X11 forwarding\n\none C file + a header (add them to your C or C++ project) with 8 functions:\n- beep\n- notify popup (tray)\n- message & question\n- input & password\n- save file\n- open file(s)\n- select folder\n- color picker\n\nComplements OpenGL Vulkan GLFW GLUT GLUI VTK SFML TGUI\nSDL Ogre Unity3d ION OpenCV CEGUI MathGL GLM CPW GLOW\nOpen3D IMGUI MyGUI GLT NGL STB & GUI less programs\n\nNO INIT\nNO MAIN LOOP\nNO LINKING\nNO INCLUDE\n\nThe dialogs can be forced into console mode\n\nWindows (XP to 10) ASCII MBCS UTF-8 UTF-16\n- native code & vbs create the graphic dialogs\n- enhanced console mode can use dialog.exe from\nhttp://andrear.altervista.org/home/cdialog.php\n- basic console input\n\nUnix (command line calls) ASCII UTF-8\n- applescript, kdialog, zenity\n- python (2 or 3) + tkinter + python-dbus (optional)\n- dialog (opens a console if needed)\n- basic console input\nThe same executable can run across desktops & distributions\n\nC89 & C++98 compliant: tested with C & C++ compilers\nVisualStudio MinGW-gcc GCC Clang TinyCC OpenWatcom-v2 BorlandC SunCC ZapCC\non Windows Mac Linux Bsd Solaris Minix Raspbian\nusing Gnome Kde Enlightenment Mate Cinnamon Budgie Unity Lxde Lxqt Xfce\nWindowMaker IceWm Cde Jds OpenBox Awesome Jwm Xdm\n\nBindings for LUA and C# dll, Haskell\nIncluded in LWJGL(java), Rust, Allegrobasic\n\nThanks for contributions, bug corrections & thorough testing to:\n- Don Heyse http://ldglite.sf.net for bug corrections & thorough testing!\n- Paul Rouget\n\n- License -\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software.  If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n*/\n\n// allows to deactivate the execution of certain codes because it does not support c++11\n#define AVOID_EXECUTION\n\n#ifndef __sun\n#define _POSIX_C_SOURCE 2 /* to accept POSIX 2 in old ANSI C standards */\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <sys/stat.h>\n#include <cwchar>\n\n#include \"tinyfiledialogs.h\"\n/* #define TINYFD_NOLIB */\n\n#ifdef _WIN32\n #ifdef __BORLANDC__\n  #define _getch getch\n #endif\n #ifndef _WIN32_WINNT\n  #define _WIN32_WINNT 0x0500\n #endif\n #ifndef TINYFD_NOLIB\n  #include <windows.h>\n  /*#define TINYFD_NOSELECTFOLDERWIN*/\n  #ifndef TINYFD_NOSELECTFOLDERWIN\n   #include <shlobj.h>\n  #endif /*TINYFD_NOSELECTFOLDERWIN*/\n #endif\n #include <conio.h>\n #include <commdlg.h>\n #define TINYFD_NOCCSUNICODE\n #define SLASH \"\\\\\"\n int tinyfd_winUtf8 = 0 ; /* on windows string char can be 0:MBCS or 1:UTF-8 */\n#else\n #include <limits.h>\n #include <unistd.h>\n #include <dirent.h> /* on old systems try <sys/dir.h> instead */\n #include <termios.h>\n #include <sys/utsname.h>\n #include <signal.h> /* on old systems try <sys/signal.h> instead */\n #define SLASH \"/\"\n#endif /* _WIN32 */\n\n#define MAX_PATH_OR_CMD 1024 /* _MAX_PATH or MAX_PATH */\n#define MAX_MULTIPLE_FILES 32\n\nchar const tinyfd_version [8] = \"3.4.3\";\n\nint tinyfd_verbose = 0 ; /* on unix: prints the command line calls */\nint tinyfd_silent = 1 ; /* 1 (default) or 0 : on unix,\n                        hide errors and warnings from called dialog*/\n\n#if defined(TINYFD_NOLIB) && defined(_WIN32)\nint tinyfd_forceConsole = 1 ;\n#else\nint tinyfd_forceConsole = 0 ; /* 0 (default) or 1 */\n#endif\n/* for unix & windows: 0 (graphic mode) or 1 (console mode).\n0: try to use a graphic solution, if it fails then it uses console mode.\n1: forces all dialogs into console mode even when the X server is present,\n  if the package dialog (and a console is present) or dialog.exe is installed.\n  on windows it only make sense for console applications */\n\nchar tinyfd_response[1024];\n/* if you pass \"tinyfd_query\" as aTitle,\nthe functions will not display the dialogs\nbut and return 0 for console mode, 1 for graphic mode.\ntinyfd_response is then filled with the retain solution.\npossible values for tinyfd_response are (all lowercase)\nfor graphic mode:\n  windows_wchar windows\n  applescript kdialog zenity zenity3 matedialog qarma\n  python2-tkinter python3-tkinter python-dbus perl-dbus\n  gxmessage gmessage xmessage xdialog gdialog\nfor console mode:\n  dialog whiptail basicinput no_solution */\n\n#if defined(TINYFD_NOLIB) && defined(_WIN32)\nstatic int gWarningDisplayed = 1 ;\n#else\nstatic int gWarningDisplayed = 0 ;\n#endif\n\nstatic char const gTitle[]=\"missing software! (we will try basic console input)\";\n\n#ifdef _WIN32\nchar const tinyfd_needs[] = \"\\\n ___________\\n\\\n/           \\\\ \\n\\\n| tiny file |\\n\\\n|  dialogs  |\\n\\\n\\\\_____  ____/\\n\\\n      \\\\|\\\n\\ntiny file dialogs on Windows needs:\\\n\\n   a graphic display\\\n\\nor dialog.exe (enhanced console mode)\\\n\\nor a console for basic input\";\n#else\nchar const tinyfd_needs[] = \"\\\n ___________\\n\\\n/           \\\\ \\n\\\n| tiny file |\\n\\\n|  dialogs  |\\n\\\n\\\\_____  ____/\\n\\\n      \\\\|\\\n\\ntiny file dialogs on UNIX needs:\\\n\\n   applescript\\\n\\nor kdialog\\\n\\nor zenity (or matedialog or qarma)\\\n\\nor python (2 or 3)\\\n\\n + tkinter + python-dbus (optional)\\\n\\nor dialog (opens console if needed)\\\n\\nor xterm + bash\\\n\\n   (opens console for basic input)\\\n\\nor existing console for basic input\";\n#endif\n\n#ifdef _MSC_VER\n#pragma warning(disable:4996) /* allows usage of strncpy, strcpy, strcat, sprintf, fopen */\n#pragma warning(disable:4100) /* allows usage of strncpy, strcpy, strcat, sprintf, fopen */\n#pragma warning(disable:4706) /* allows usage of strncpy, strcpy, strcat, sprintf, fopen */\n#endif\n\nstatic char * getPathWithoutFinalSlash(\n        char * const aoDestination, /* make sure it is allocated, use _MAX_PATH */\n        char const * const aSource) /* aoDestination and aSource can be the same */\n{\n        char const * lTmp ;\n        if ( aSource )\n        {\n                lTmp = strrchr(aSource, '/');\n                if (!lTmp)\n                {\n                        lTmp = strrchr(aSource, '\\\\');\n                }\n                if (lTmp)\n                {\n                        strncpy(aoDestination, aSource, lTmp - aSource );\n                        aoDestination[lTmp - aSource] = '\\0';\n                }\n                else\n                {\n                        * aoDestination = '\\0';\n                }\n        }\n        else\n        {\n                * aoDestination = '\\0';\n        }\n        return aoDestination;\n}\n\n\nstatic char * getLastName(\n        char * const aoDestination, /* make sure it is allocated */\n        char const * const aSource)\n{\n        /* copy the last name after '/' or '\\' */\n        char const * lTmp ;\n        if ( aSource )\n        {\n                lTmp = strrchr(aSource, '/');\n                if (!lTmp)\n                {\n                        lTmp = strrchr(aSource, '\\\\');\n                }\n                if (lTmp)\n                {\n                        strcpy(aoDestination, lTmp + 1);\n                }\n                else\n                {\n                        strcpy(aoDestination, aSource);\n                }\n        }\n        else\n        {\n                * aoDestination = '\\0';\n        }\n        return aoDestination;\n}\n\n\nstatic void ensureFinalSlash( char * const aioString )\n{\n        if ( aioString && strlen( aioString ) )\n        {\n                char * lastcar = aioString + strlen( aioString ) - 1 ;\n                if ( strncmp( lastcar , SLASH , 1 ) )\n                {\n                        strcat( lastcar , SLASH ) ;\n                }\n        }\n}\n\n\nstatic void Hex2RGB( char const aHexRGB [8] ,\n                                         unsigned char aoResultRGB [3] )\n{\n        char lColorChannel [8] ;\n        if ( aoResultRGB )\n        {\n                if ( aHexRGB )\n                {\n                        strcpy(lColorChannel, aHexRGB ) ;\n                        aoResultRGB[2] = (unsigned char)strtoul(lColorChannel+5,NULL,16);\n                        lColorChannel[5] = '\\0';\n                        aoResultRGB[1] = (unsigned char)strtoul(lColorChannel+3,NULL,16);\n                        lColorChannel[3] = '\\0';\n                        aoResultRGB[0] = (unsigned char)strtoul(lColorChannel+1,NULL,16);\n/* printf(\"%d %d %d\\n\", aoResultRGB[0], aoResultRGB[1], aoResultRGB[2]); */\n                }\n                else\n                {\n                        aoResultRGB[0]=0;\n                        aoResultRGB[1]=0;\n                        aoResultRGB[2]=0;\n                }\n        }\n}\n\nstatic void RGB2Hex( unsigned char const aRGB [3] ,\n                                         char aoResultHexRGB [8] )\n{\n        if ( aoResultHexRGB )\n        {\n                if ( aRGB )\n                {\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n    sprintf(aoResultHexRGB, \"#%02hhx%02hhx%02hhx\", aRGB[0], aRGB[1], aRGB[2]);\n#else\n    sprintf(aoResultHexRGB, \"#%02hx%02hx%02hx\", aRGB[0], aRGB[1], aRGB[2]);\n#endif\n                         /*printf(\"aoResultHexRGB %s\\n\", aoResultHexRGB);*/\n                }\n                else\n                {\n                        aoResultHexRGB[0]=0;\n                        aoResultHexRGB[1]=0;\n                        aoResultHexRGB[2]=0;\n                }\n        }\n}\n\n\nstatic void replaceSubStr( char const * const aSource ,\n                                                   char const * const aOldSubStr ,\n                                                   char const * const aNewSubStr ,\n                                                   char * const aoDestination )\n{\n        char const * pOccurence ;\n        char const * p ;\n        char const * lNewSubStr = \"\" ;\n        size_t lOldSubLen = strlen( aOldSubStr ) ;\n\n        if ( ! aSource )\n        {\n                * aoDestination = '\\0' ;\n                return ;\n        }\n        if ( ! aOldSubStr )\n        {\n                strcpy( aoDestination , aSource ) ;\n                return ;\n        }\n        if ( aNewSubStr )\n        {\n                lNewSubStr = aNewSubStr ;\n        }\n        p = aSource ;\n        * aoDestination = '\\0' ;\n        while ( ( pOccurence = strstr( p , aOldSubStr ) ) != NULL )\n        {\n                strncat( aoDestination , p , pOccurence - p ) ;\n                strcat( aoDestination , lNewSubStr ) ;\n                p = pOccurence + lOldSubLen ;\n        }\n        strcat( aoDestination , p ) ;\n}\n\n\nstatic int filenameValid( char const * const aFileNameWithoutPath )\n{\n        if ( ! aFileNameWithoutPath\n          || ! strlen(aFileNameWithoutPath)\n          || strpbrk(aFileNameWithoutPath , \"\\\\/:*?\\\"<>|\") )\n        {\n                return 0 ;\n        }\n        return 1 ;\n}\n\n#ifndef _WIN32\n\nstatic int fileExists( char const * const aFilePathAndName )\n{\n        FILE * lIn ;\n        if ( ! aFilePathAndName || ! strlen(aFilePathAndName) )\n        {\n                return 0 ;\n        }\n        lIn = fopen( aFilePathAndName , \"r\" ) ;\n        if ( ! lIn )\n        {\n                return 0 ;\n        }\n        fclose( lIn ) ;\n        return 1 ;\n}\n\n#elif defined(TINYFD_NOLIB)\n\nstatic int fileExists( char const * const aFilePathAndName )\n{\n        FILE * lIn ;\n        if ( ! aFilePathAndName || ! strlen(aFilePathAndName) )\n        {\n                return 0 ;\n        }\n\n        if ( tinyfd_winUtf8 )\n                return 1; /* we cannot test */\n\n        lIn = fopen( aFilePathAndName , \"r\" ) ;\n        if ( ! lIn )\n        {\n                return 0 ;\n        }\n        fclose( lIn ) ;\n        return 1 ;\n}\n\n#endif\n\n\nstatic void wipefile(char const * const aFilename)\n{\n        int i;\n        struct stat st;\n        FILE * lIn;\n\n        if (stat(aFilename, &st) == 0)\n        {\n                if ((lIn = fopen(aFilename, \"w\")))\n                {\n                        for (i = 0; i < st.st_size; i++)\n                        {\n                                fputc('A', lIn);\n                        }\n                }\n                fclose(lIn);\n        }\n}\n\n\n#ifdef _WIN32\n\nstatic int replaceChr( char * const aString ,\n                                           char const aOldChr ,\n                                           char const aNewChr )\n{\n        char * p ;\n        int lRes = 0 ;\n\n        if ( ! aString )\n        {\n                return 0 ;\n        }\n\n        if ( aOldChr == aNewChr )\n        {\n                return 0 ;\n        }\n\n        p = aString ;\n        while ( (p = strchr( p , aOldChr )) )\n        {\n                * p = aNewChr ;\n                p ++ ;\n                lRes = 1 ;\n        }\n        return lRes ;\n}\n\n#ifdef TINYFD_NOLIB\n\nstatic int dirExists(char const * const aDirPath)\n{\n        struct stat lInfo;\n\n        if (!aDirPath || !strlen(aDirPath))\n                return 0;\n        if (stat(aDirPath, &lInfo) != 0)\n                return 0;\n        else if ( tinyfd_winUtf8 )\n                return 1; /* we cannot test */\n        else if (lInfo.st_mode & S_IFDIR)\n                return 1;\n        else\n                return 0;\n}\n\n\nvoid tinyfd_beep(void)\n{\n        printf(\"\\a\");\n}\n\n#else /* ndef TINYFD_NOLIB */\n\nvoid tinyfd_beep(void)\n{\n        Beep(440,300);\n}\n\n\nstatic void wipefileW(wchar_t const * const aFilename)\n{\n        int i;\n        struct _stat st;\n        FILE * lIn;\n\n        if (_wstat(aFilename, &st) == 0)\n        {\n                if ((lIn = _wfopen(aFilename, L\"w\")))\n                {\n                        for (i = 0; i < st.st_size; i++)\n                        {\n                                fputc('A', lIn);\n                        }\n                }\n                fclose(lIn);\n        }\n}\n\n\nstatic wchar_t * getPathWithoutFinalSlashW(\n        wchar_t * const aoDestination, /* make sure it is allocated, use _MAX_PATH */\n        wchar_t const * const aSource) /* aoDestination and aSource can be the same */\n{\n        wchar_t const * lTmp;\n        if (aSource)\n        {\n                lTmp = wcsrchr(aSource, L'/');\n                if (!lTmp)\n                {\n                        lTmp = wcsrchr(aSource, L'\\\\');\n                }\n                if (lTmp)\n                {\n                        wcsncpy(aoDestination, aSource, lTmp - aSource);\n                        aoDestination[lTmp - aSource] = L'\\0';\n                }\n                else\n                {\n                        *aoDestination = L'\\0';\n                }\n        }\n        else\n        {\n                *aoDestination = L'\\0';\n        }\n        return aoDestination;\n}\n\n\nstatic wchar_t * getLastNameW(\n        wchar_t * const aoDestination, /* make sure it is allocated */\n        wchar_t const * const aSource)\n{\n        /* copy the last name after '/' or '\\' */\n        wchar_t const * lTmp;\n        if (aSource)\n        {\n                lTmp = wcsrchr(aSource, L'/');\n                if (!lTmp)\n                {\n                        lTmp = wcsrchr(aSource, L'\\\\');\n                }\n                if (lTmp)\n                {\n                        wcscpy(aoDestination, lTmp + 1);\n                }\n                else\n                {\n                        wcscpy(aoDestination, aSource);\n                }\n        }\n        else\n        {\n                *aoDestination = L'\\0';\n        }\n        return aoDestination;\n}\n\n\nstatic void Hex2RGBW(wchar_t const aHexRGB[8],\n        unsigned char aoResultRGB[3])\n{\n        wchar_t lColorChannel[8];\n        if (aoResultRGB)\n        {\n                if (aHexRGB)\n                {\n                        wcscpy(lColorChannel, aHexRGB);\n                        aoResultRGB[2] = (unsigned char)wcstoul(lColorChannel + 5, NULL, 16);\n                        lColorChannel[5] = '\\0';\n                        aoResultRGB[1] = (unsigned char)wcstoul(lColorChannel + 3, NULL, 16);\n                        lColorChannel[3] = '\\0';\n                        aoResultRGB[0] = (unsigned char)wcstoul(lColorChannel + 1, NULL, 16);\n                        /* printf(\"%d %d %d\\n\", aoResultRGB[0], aoResultRGB[1], aoResultRGB[2]); */\n                }\n                else\n                {\n                        aoResultRGB[0] = 0;\n                        aoResultRGB[1] = 0;\n                        aoResultRGB[2] = 0;\n                }\n        }\n}\n\n\nstatic void RGB2HexW(\n        unsigned char const aRGB[3],\n        wchar_t aoResultHexRGB[8])\n{\n        if (aoResultHexRGB)\n        {\n                if (aRGB)\n                {\n                        /* wprintf(L\"aoResultHexRGB %s\\n\", aoResultHexRGB); */\n#if !defined(AVOID_EXECUTION)\n                        swprintf(aoResultHexRGB,\n#if !defined(__BORLANDC__) && !defined(__TINYC__) && ( !defined(__GNUC__) || (__GNUC__) >= 5 )\n                                8,\n#endif\n\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n\t\t\t\t\t\t\t\tL\"#%02hhx%02hhx%02hhx\", aRGB[0], aRGB[1], aRGB[2]);\n#else\n\t\t\t\t\t\t\t\tL\"#%02hx%02hx%02hx\", aRGB[0], aRGB[1], aRGB[2]);\n#endif\n#endif\n                }\n                else\n                {\n                        aoResultHexRGB[0] = 0;\n                        aoResultHexRGB[1] = 0;\n                        aoResultHexRGB[2] = 0;\n                }\n        }\n}\n\n\n#if !defined(WC_ERR_INVALID_CHARS)\n/* undefined prior to Vista, so not yet in MINGW header file */\n#define WC_ERR_INVALID_CHARS 0x00000080\n#endif\n\n\nstatic int sizeUtf16(char const * const aUtf8string)\n{\n        return MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,\n                                        aUtf8string, -1, NULL, 0);\n}\n\n\nstatic int sizeUtf8(wchar_t const * const aUtf16string)\n{\n        return WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS,\n                aUtf16string, -1, NULL, 0, NULL, NULL);\n}\n\n\nstatic int sizeMbcs(wchar_t const * const aMbcsString)\n{\n        int lRes = WideCharToMultiByte(CP_ACP, 0,\n                aMbcsString, -1, NULL, 0, NULL, NULL);\n        /* DWORD licic = GetLastError(); */\n        return lRes;\n}\n\n\nstatic wchar_t * utf8to16(char const * const aUtf8string)\n{\n        wchar_t * lUtf16string ;\n        int lSize = sizeUtf16(aUtf8string);\n        lUtf16string = (wchar_t *) malloc( lSize * sizeof(wchar_t) );\n        lSize = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,\n                                        aUtf8string, -1, lUtf16string, lSize);\n        if (lSize == 0)\n        {\n                free(lUtf16string);\n                return NULL;\n        }\n        return lUtf16string;\n}\n\n\nstatic wchar_t * mbcsTo16(char const * const aMbcsString)\n{\n        wchar_t * lMbcsString;\n        int lSize = sizeUtf16(aMbcsString);\n        lMbcsString = (wchar_t *)malloc(lSize * sizeof(wchar_t));\n        lSize = MultiByteToWideChar(CP_ACP, 0,\n                aMbcsString, -1, lMbcsString, lSize);\n        if (lSize == 0)\n        {\n                free(lMbcsString);\n                return NULL;\n        }\n        return lMbcsString;\n}\n\n\nstatic char * utf16to8(wchar_t const * const aUtf16string)\n{\n        char * lUtf8string ;\n        int lSize = sizeUtf8(aUtf16string);\n        lUtf8string = (char *) malloc( lSize );\n        lSize = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS,\n                aUtf16string, -1, lUtf8string, lSize, NULL, NULL);\n        if (lSize == 0)\n        {\n                free(lUtf8string);\n                return NULL;\n        }\n        return lUtf8string;\n}\n\n\nstatic char * utf16toMbcs(wchar_t const * const aUtf16string)\n{\n        char * lMbcsString;\n        int lSize = sizeMbcs(aUtf16string);\n        lMbcsString = (char *)malloc(lSize);\n        lSize = WideCharToMultiByte(CP_ACP, 0,\n                aUtf16string, -1, lMbcsString, lSize, NULL, NULL);\n        if (lSize == 0)\n        {\n                free(lMbcsString);\n                return NULL;\n        }\n        return lMbcsString;\n}\n\n\nstatic int dirExists(char const * const aDirPath)\n{\n        struct _stat lInfo;\n        wchar_t * lTmpWChar;\n        int lStatRet;\n\t\tint lDirLen;\n\n\t\tif (!aDirPath)\n\t\t\treturn 0;\n\t\tlDirLen = strlen(aDirPath);\n\t\tif (!lDirLen)\n\t\t\treturn 1;\n\t\tif ( (lDirLen == 2) && (aDirPath[1] == ':') )\n\t\t\treturn 1;\n\n        if (tinyfd_winUtf8)\n        {\n                lTmpWChar = utf8to16(aDirPath);\n                lStatRet = _wstat(lTmpWChar, &lInfo);\n                free(lTmpWChar);\n                if (lStatRet != 0)\n                        return 0;\n                else if (lInfo.st_mode & S_IFDIR)\n                        return 1;\n                else\n                        return 0;\n        }\n        else if (_stat(aDirPath, &lInfo) != 0)\n                return 0;\n        else if (lInfo.st_mode & S_IFDIR)\n                return 1;\n        else\n                return 0;\n}\n\n\nstatic int fileExists(char const * const aFilePathAndName)\n{\n        struct _stat lInfo;\n        wchar_t * lTmpWChar;\n        int lStatRet;\n        FILE * lIn;\n\n        if (!aFilePathAndName || !strlen(aFilePathAndName))\n        {\n                return 0;\n        }\n\n        if (tinyfd_winUtf8)\n        {\n                lTmpWChar = utf8to16(aFilePathAndName);\n                lStatRet = _wstat(lTmpWChar, &lInfo);\n                free(lTmpWChar);\n                if (lStatRet != 0)\n                        return 0;\n                else if (lInfo.st_mode & _S_IFREG)\n                        return 1;\n                else\n                        return 0;\n        }\n        else\n        {\n                lIn = fopen(aFilePathAndName, \"r\");\n                if (!lIn)\n                {\n                        return 0;\n                }\n                fclose(lIn);\n                return 1;\n        }\n}\n\nstatic int replaceWchar(wchar_t * const aString,\n\twchar_t const aOldChr,\n\twchar_t const aNewChr)\n{\n\twchar_t * p;\n\tint lRes = 0;\n\n\tif (!aString)\n\t{\n\t\treturn 0;\n\t}\n\n\tif (aOldChr == aNewChr)\n\t{\n\t\treturn 0;\n\t}\n\n\tp = aString;\n\twhile ((p = wcsrchr(p, aOldChr)))\n\t{\n\t\t*p = aNewChr;\n#ifdef TINYFD_NOCCSUNICODE\n\t\tp++;\n#endif\n\t\tp++;\n\t\tlRes = 1;\n\t}\n\treturn lRes;\n}\n\n#endif /* TINYFD_NOLIB */\n#endif /* _WIN32 */\n\n/* source and destination can be the same or ovelap*/\nstatic char const * ensureFilesExist(char * const aDestination,\n        char const * const aSourcePathsAndNames)\n{\n        char * lDestination = aDestination;\n        char const * p;\n        char const * p2;\n        size_t lLen;\n\n        if (!aSourcePathsAndNames)\n        {\n                return NULL;\n        }\n        lLen = strlen(aSourcePathsAndNames);\n        if (!lLen)\n        {\n                return NULL;\n        }\n\n        p = aSourcePathsAndNames;\n        while ((p2 = strchr(p, '|')) != NULL)\n        {\n                lLen = p2 - p;\n                memmove(lDestination, p, lLen);\n                lDestination[lLen] = '\\0';\n                if (fileExists(lDestination))\n                {\n                        lDestination += lLen;\n                        *lDestination = '|';\n                        lDestination++;\n                }\n                p = p2 + 1;\n        }\n        if (fileExists(p))\n        {\n                lLen = strlen(p);\n                memmove(lDestination, p, lLen);\n                lDestination[lLen] = '\\0';\n        }\n        else\n        {\n                *(lDestination - 1) = '\\0';\n        }\n        return aDestination;\n}\n\n#ifdef _WIN32\n#ifndef TINYFD_NOLIB\n\nstatic int __stdcall EnumThreadWndProc(HWND hwnd, LPARAM lParam)\n{\n        wchar_t lTitleName[MAX_PATH];\n        GetWindowTextW(hwnd, lTitleName, MAX_PATH);\n        /* wprintf(L\"lTitleName %ls \\n\", lTitleName);  */\n        if (wcscmp(L\"tinyfiledialogsTopWindow\", lTitleName) == 0)\n        {\n                SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);\n                return 0;\n        }\n        return 1;\n}\n\n\nstatic void hiddenConsoleW(wchar_t const * const aString, wchar_t const * const aDialogTitle, int const aInFront)\n{\n        STARTUPINFOW StartupInfo;\n        PROCESS_INFORMATION ProcessInfo;\n\n        if (!aString || !wcslen(aString) ) return;\n\n        memset(&StartupInfo, 0, sizeof(StartupInfo));\n        StartupInfo.cb = sizeof(STARTUPINFOW);\n        StartupInfo.dwFlags = STARTF_USESHOWWINDOW;\n        StartupInfo.wShowWindow = SW_HIDE;\n\n        if (!CreateProcessW(NULL, (LPWSTR)aString, NULL, NULL, FALSE,\n                                CREATE_NEW_CONSOLE, NULL, NULL,\n                                &StartupInfo, &ProcessInfo))\n        {\n                return; /* GetLastError(); */\n        }\n\n        WaitForInputIdle(ProcessInfo.hProcess, INFINITE);\n        if (aInFront)\n        {\n                while (EnumWindows(EnumThreadWndProc, (LPARAM)NULL)) {}\n                SetWindowTextW(GetForegroundWindow(), aDialogTitle);\n        }\n        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);\n        CloseHandle(ProcessInfo.hThread);\n        CloseHandle(ProcessInfo.hProcess);\n}\n\n\nint tinyfd_messageBoxW(\n        wchar_t const * const aTitle, /* NULL or \"\" */\n        wchar_t const * const aMessage, /* NULL or \"\"  may contain \\n and \\t */\n        wchar_t const * const aDialogType, /* \"ok\" \"okcancel\" \"yesno\" \"yesnocancel\" */\n        wchar_t const * const aIconType, /* \"info\" \"warning\" \"error\" \"question\" */\n        int const aDefaultButton) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */\n{\n        int lBoxReturnValue;\n        UINT aCode;\n\n        if (aTitle&&!wcscmp(aTitle, L\"tinyfd_query\")){ strcpy(tinyfd_response, \"windows_wchar\"); return 1; }\n\n        if (aIconType && !wcscmp(L\"warning\", aIconType))\n        {\n                aCode = MB_ICONWARNING;\n        }\n        else if (aIconType && !wcscmp(L\"error\", aIconType))\n        {\n                aCode = MB_ICONERROR;\n        }\n        else if (aIconType && !wcscmp(L\"question\", aIconType))\n        {\n                aCode = MB_ICONQUESTION;\n        }\n        else\n        {\n                aCode = MB_ICONINFORMATION;\n        }\n\n        if (aDialogType && !wcscmp(L\"okcancel\", aDialogType))\n        {\n                aCode += MB_OKCANCEL;\n                if (!aDefaultButton)\n                {\n                        aCode += MB_DEFBUTTON2;\n                }\n        }\n        else if (aDialogType && !wcscmp(L\"yesno\", aDialogType))\n        {\n                aCode += MB_YESNO;\n                if (!aDefaultButton)\n                {\n                        aCode += MB_DEFBUTTON2;\n                }\n        }\n        else\n        {\n                aCode += MB_OK;\n        }\n\n        aCode += MB_TOPMOST;\n\n        lBoxReturnValue = MessageBoxW(GetForegroundWindow(), aMessage, aTitle, aCode);\n        if (((aDialogType\n                && wcscmp(L\"okcancel\", aDialogType)\n                && wcscmp(L\"yesno\", aDialogType)))\n                || (lBoxReturnValue == IDOK)\n                || (lBoxReturnValue == IDYES))\n        {\n                return 1;\n        }\n        else\n        {\n                return 0;\n        }\n}\n\n\nstatic int messageBoxWinGui8(\n        char const * const aTitle, /* NULL or \"\" */\n        char const * const aMessage, /* NULL or \"\"  may contain \\n and \\t */\n        char const * const aDialogType, /* \"ok\" \"okcancel\" \"yesno\" \"yesnocancel\" */\n        char const * const aIconType, /* \"info\" \"warning\" \"error\" \"question\" */\n        int const aDefaultButton) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */\n{\n        int lIntRetVal;\n        wchar_t * lTitle;\n        wchar_t * lMessage;\n        wchar_t * lDialogType;\n        wchar_t * lIconType;\n\n        lTitle = utf8to16(aTitle);\n        lMessage = utf8to16(aMessage);\n        lDialogType = utf8to16(aDialogType);\n        lIconType = utf8to16(aIconType);\n\n        lIntRetVal = tinyfd_messageBoxW(lTitle, lMessage,\n                                                                lDialogType, lIconType, aDefaultButton );\n\n        free(lTitle);\n        free(lMessage);\n        free(lDialogType);\n        free(lIconType);\n\n        return lIntRetVal ;\n}\n\n\n/* return has only meaning for tinyfd_query */\nint tinyfd_notifyPopupW(\n        wchar_t const * const aTitle, /* NULL or L\"\" */\n        wchar_t const * const aMessage, /* NULL or L\"\" may contain \\n \\t */\n        wchar_t const * const aIconType) /* L\"info\" L\"warning\" L\"error\" */\n{\n        wchar_t * lDialogString;\n        size_t lTitleLen;\n        size_t lMessageLen;\n        size_t lDialogStringLen;\n\n        if (aTitle&&!wcscmp(aTitle, L\"tinyfd_query\")){ strcpy(tinyfd_response, \"windows_wchar\"); return 1; }\n\n        lTitleLen = aTitle ? wcslen(aTitle) : 0;\n        lMessageLen = aMessage ? wcslen(aMessage) : 0;\n        lDialogStringLen = 3 * MAX_PATH_OR_CMD + lTitleLen + lMessageLen;\n        lDialogString = (wchar_t *)malloc(2 * lDialogStringLen);\n\n        wcscpy(lDialogString, L\"powershell.exe -command \\\"\\\nfunction Show-BalloonTip {\\\n[cmdletbinding()] \\\nparam( \\\n[string]$Title = ' ', \\\n[string]$Message = ' ', \\\n[ValidateSet('info', 'warning', 'error')] \\\n[string]$IconType = 'info');\\\n[system.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null ; \\\n$balloon = New-Object System.Windows.Forms.NotifyIcon ; \\\n$path = Get-Process -id $pid | Select-Object -ExpandProperty Path ; \\\n$icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path) ;\");\n\n        wcscat(lDialogString, L\"\\\n$balloon.Icon = $icon ; \\\n$balloon.BalloonTipIcon = $IconType ; \\\n$balloon.BalloonTipText = $Message ; \\\n$balloon.BalloonTipTitle = $Title ; \\\n$balloon.Text = 'lalala' ; \\\n$balloon.Visible = $true ; \\\n$balloon.ShowBalloonTip(5000)};\\\nShow-BalloonTip\");\n\n        if (aTitle && wcslen(aTitle))\n        {\n                wcscat(lDialogString, L\" -Title '\");\n                wcscat(lDialogString, aTitle);\n                wcscat(lDialogString, L\"'\");\n        }\n        if (aMessage && wcslen(aMessage))\n        {\n                wcscat(lDialogString, L\" -Message '\");\n                wcscat(lDialogString, aMessage);\n                wcscat(lDialogString, L\"'\");\n        }\n        if (aMessage && wcslen(aIconType))\n        {\n                wcscat(lDialogString, L\" -IconType '\");\n                wcscat(lDialogString, aIconType);\n                wcscat(lDialogString, L\"'\");\n        }\n        wcscat(lDialogString, L\"\\\"\");\n\n        /* wprintf ( L\"lDialogString: %ls\\n\" , lDialogString ) ; */\n\n        hiddenConsoleW(lDialogString, aTitle, 0);\n        free(lDialogString);\n        return 1;\n}\n\n\nstatic int notifyWinGui(\n        char const * const aTitle, /* NULL or \"\" */\n        char const * const aMessage, /* NULL or \"\" may NOT contain \\n nor \\t */\n        char const * const aIconType)\n{\n        wchar_t * lTitle;\n        wchar_t * lMessage;\n        wchar_t * lIconType;\n\n        if (tinyfd_winUtf8)\n        {\n                lTitle = utf8to16(aTitle);\n                lMessage = utf8to16(aMessage);\n                lIconType = utf8to16(aIconType);\n        }\n        else\n        {\n                lTitle = mbcsTo16(aTitle);\n                lMessage = mbcsTo16(aMessage);\n                lIconType = mbcsTo16(aIconType);\n        }\n\n        tinyfd_notifyPopupW( lTitle,    lMessage, lIconType);\n\n        free(lTitle);\n        free(lMessage);\n        free(lIconType);\n        return 1;\n}\n\n\nwchar_t const * tinyfd_inputBoxW(\n        wchar_t const * const aTitle, /* NULL or L\"\" */\n        wchar_t const * const aMessage, /* NULL or L\"\" may NOT contain \\n nor \\t */\n        wchar_t const * const aDefaultInput) /* L\"\" , if NULL it's a passwordBox */\n{\n        static wchar_t lBuff[MAX_PATH_OR_CMD];\n        wchar_t * lDialogString;\n        FILE * lIn;\n        FILE * lFile;\n        int lResult;\n        size_t lTitleLen;\n        size_t lMessageLen;\n        size_t lDialogStringLen;\n\n        if (aTitle&&!wcscmp(aTitle, L\"tinyfd_query\")){ strcpy(tinyfd_response, \"windows_wchar\"); return (wchar_t const *)1; }\n\n        lTitleLen =  aTitle ? wcslen(aTitle) : 0 ;\n        lMessageLen =  aMessage ? wcslen(aMessage) : 0 ;\n        lDialogStringLen = 3 * MAX_PATH_OR_CMD + lTitleLen + lMessageLen;\n        lDialogString = (wchar_t *)malloc(2 * lDialogStringLen);\n\n        if (aDefaultInput)\n        {\n#if !defined(AVOID_EXECUTION)\n\t\t\tswprintf(lDialogString,\n#if !defined(__BORLANDC__) && !defined(__TINYC__) && ( !defined(__GNUC__) || (__GNUC__) >= 5 )\n                lDialogStringLen,\n#endif\n                L\"%ls\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.vbs\", _wgetenv(L\"USERPROFILE\"));\n#endif\n        }\n        else\n        {\n#if !defined(AVOID_EXECUTION)\n                swprintf(lDialogString,\n#if !defined(__BORLANDC__) && !defined(__TINYC__) && ( !defined(__GNUC__) || (__GNUC__) >= 5 )\n                        lDialogStringLen,\n#endif\n                        L\"%ls\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.hta\", _wgetenv(L\"USERPROFILE\"));\n#endif\n        }\n        lIn = _wfopen(lDialogString, L\"w\");\n        if (!lIn)\n        {\n                free(lDialogString);\n                return NULL;\n        }\n\n        if ( aDefaultInput )\n        {\n                wcscpy(lDialogString, L\"Dim result:result=InputBox(\\\"\");\n                if (aMessage && wcslen(aMessage))\n                {\n\t\t\t\t\twcscpy(lBuff, aMessage);\n\t\t\t\t\treplaceWchar(lBuff, L'\\n', L' ');\n\t\t\t\t\twcscat(lDialogString, lBuff);\n                }\n                wcscat(lDialogString, L\"\\\",\\\"tinyfiledialogsTopWindow\\\",\\\"\");\n                if (aDefaultInput && wcslen(aDefaultInput))\n                {\n\t\t\t\t\twcscpy(lBuff, aDefaultInput);\n\t\t\t\t\treplaceWchar(lBuff, L'\\n', L' ');\n\t\t\t\t\twcscat(lDialogString, lBuff);\n                }\n                wcscat(lDialogString, L\"\\\"):If IsEmpty(result) then:WScript.Echo 0\");\n                wcscat(lDialogString, L\":Else: WScript.Echo \\\"1\\\" & result : End If\");\n        }\n        else\n        {\n                wcscpy(lDialogString, L\"\\n\\\n<html>\\n\\\n<head>\\n\\\n<title>\");\n\n                wcscat(lDialogString, L\"tinyfiledialogsTopWindow\");\n                wcscat(lDialogString, L\"</title>\\n\\\n<HTA:APPLICATION\\n\\\nID = 'tinyfdHTA'\\n\\\nAPPLICATIONNAME = 'tinyfd_inputBox'\\n\\\nMINIMIZEBUTTON = 'no'\\n\\\nMAXIMIZEBUTTON = 'no'\\n\\\nBORDER = 'dialog'\\n\\\nSCROLL = 'no'\\n\\\nSINGLEINSTANCE = 'yes'\\n\\\nWINDOWSTATE = 'hidden'>\\n\\\n\\n\\\n<script language = 'VBScript'>\\n\\\n\\n\\\nintWidth = Screen.Width/4\\n\\\nintHeight = Screen.Height/6\\n\\\nResizeTo intWidth, intHeight\\n\\\nMoveTo((Screen.Width/2)-(intWidth/2)),((Screen.Height/2)-(intHeight/2))\\n\\\nresult = 0\\n\\\n\\n\\\nSub Window_onLoad\\n\\\ntxt_input.Focus\\n\\\nEnd Sub\\n\\\n\\n\");\n\n                wcscat(lDialogString, L\"\\\nSub Window_onUnload\\n\\\nSet objFSO = CreateObject(\\\"Scripting.FileSystemObject\\\")\\n\\\nSet oShell = CreateObject(\\\"WScript.Shell\\\")\\n\\\nstrHomeFolder = oShell.ExpandEnvironmentStrings(\\\"%USERPROFILE%\\\")\\n\\\nSet objFile = objFSO.CreateTextFile(strHomeFolder & \\\"\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\\\",True,True)\\n\\\nIf result = 1 Then\\n\\\nobjFile.Write 1 & txt_input.Value\\n\\\nElse\\n\\\nobjFile.Write 0\\n\\\nEnd If\\n\\\nobjFile.Close\\n\\\nEnd Sub\\n\\\n\\n\\\nSub Run_ProgramOK\\n\\\nresult = 1\\n\\\nwindow.Close\\n\\\nEnd Sub\\n\\\n\\n\\\nSub Run_ProgramCancel\\n\\\nwindow.Close\\n\\\nEnd Sub\\n\\\n\\n\");\n\n                wcscat(lDialogString, L\"Sub Default_Buttons\\n\\\nIf Window.Event.KeyCode = 13 Then\\n\\\nbtn_OK.Click\\n\\\nElseIf Window.Event.KeyCode = 27 Then\\n\\\nbtn_Cancel.Click\\n\\\nEnd If\\n\\\nEnd Sub\\n\\\n\\n\\\n</script>\\n\\\n</head>\\n\\\n<body style = 'background-color:#EEEEEE' onkeypress = 'vbs:Default_Buttons' align = 'top'>\\n\\\n<table width = '100%' height = '80%' align = 'center' border = '0'>\\n\\\n<tr border = '0'>\\n\\\n<td align = 'left' valign = 'middle' style='Font-Family:Arial'>\\n\");\n\n                wcscat(lDialogString, aMessage ? aMessage : L\"\");\n\n                wcscat(lDialogString, L\"\\n\\\n</td>\\n\\\n<td align = 'right' valign = 'middle' style = 'margin-top: 0em'>\\n\\\n<table  align = 'right' style = 'margin-right: 0em;'>\\n\\\n<tr align = 'right' style = 'margin-top: 5em;'>\\n\\\n<input type = 'button' value = 'OK' name = 'btn_OK' onClick = 'vbs:Run_ProgramOK' style = 'width: 5em; margin-top: 2em;'><br>\\n\\\n<input type = 'button' value = 'Cancel' name = 'btn_Cancel' onClick = 'vbs:Run_ProgramCancel' style = 'width: 5em;'><br><br>\\n\\\n</tr>\\n\\\n</table>\\n\\\n</td>\\n\\\n</tr>\\n\\\n</table>\\n\");\n\n                wcscat(lDialogString, L\"<table width = '100%' height = '100%' align = 'center' border = '0'>\\n\\\n<tr>\\n\\\n<td align = 'left' valign = 'top'>\\n\\\n<input type = 'password' id = 'txt_input'\\n\\\nname = 'txt_input' value = '' style = 'float:left;width:100%' ><BR>\\n\\\n</td>\\n\\\n</tr>\\n\\\n</table>\\n\\\n</body>\\n\\\n</html>\\n\\\n\"               ) ;\n        }\n        fputws(lDialogString, lIn);\n        fclose(lIn);\n\n        if (aDefaultInput)\n        {\n#if !defined(AVOID_EXECUTION)\n                swprintf(lDialogString,\n#if !defined(__BORLANDC__) && !defined(__TINYC__) && ( !defined(__GNUC__) || (__GNUC__) >= 5 )\n                        lDialogStringLen,\n#endif\n                        L\"%ls\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\",_wgetenv(L\"USERPROFILE\"));\n#endif\n#ifdef TINYFD_NOCCSUNICODE\n\t\t\t\tlFile = _wfopen(lDialogString, L\"w\");\n\t\t\t\tfputc(0xFF, lFile);\n\t\t\t\tfputc(0xFE, lFile);\n#else\n\t\t\t\tlFile = _wfopen(lDialogString, L\"wt, ccs=UNICODE\"); /*or ccs=UTF-16LE*/\n#endif\n\t\t\t\tfclose(lFile);\n\n                wcscpy(lDialogString, L\"cmd.exe /c cscript.exe //U //Nologo \");\n                wcscat(lDialogString, L\"\\\"%USERPROFILE%\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.vbs\\\" \");\n                wcscat(lDialogString, L\">> \\\"%USERPROFILE%\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\\\"\");\n        }\n        else\n        {\n                wcscpy(lDialogString,\n                        L\"cmd.exe /c mshta.exe \\\"%USERPROFILE%\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.hta\\\"\");\n        }\n\n        /* wprintf ( \"lDialogString: %ls\\n\" , lDialogString ) ; */\n\n        hiddenConsoleW(lDialogString, aTitle, 1);\n#if !defined(AVOID_EXECUTION)\n        swprintf(lDialogString,\n#if !defined(__BORLANDC__) && !defined(__TINYC__) && ( !defined(__GNUC__) || (__GNUC__) >= 5 )\n                lDialogStringLen,\n#endif\n\t\t\t\tL\"%ls\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\", _wgetenv(L\"USERPROFILE\"));\n\t\t/* wprintf(L\"lDialogString: %ls\\n\", lDialogString); */\n#endif\n#ifdef TINYFD_NOCCSUNICODE\n\t\tif (!(lIn = _wfopen(lDialogString, L\"r\")))\n#else\n\t\tif (!(lIn = _wfopen(lDialogString, L\"rt, ccs=UNICODE\"))) /*or ccs=UTF-16LE*/\n#endif\n\t\t{\n                _wremove(lDialogString);\n                free(lDialogString);\n                return NULL;\n        }\n\n\t\tmemset(lBuff, 0, MAX_PATH_OR_CMD * sizeof(wchar_t) );\n\n#ifdef TINYFD_NOCCSUNICODE\n\t\tfgets((char *)lBuff, 2*MAX_PATH_OR_CMD, lIn);\n#else\n\t\tfgetws(lBuff, MAX_PATH_OR_CMD, lIn);\n#endif\n\t\tfclose(lIn);\n\t\twipefileW(lDialogString);\n\t\t_wremove(lDialogString);\n\n\t\tif (aDefaultInput)\n\t\t{\n#if !defined(AVOID_EXECUTION)\n\t\t\tswprintf(lDialogString,\n#if !defined(__BORLANDC__) && !defined(__TINYC__) && ( !defined(__GNUC__) || (__GNUC__) >= 5 )\n                        lDialogStringLen,\n#endif\n                        L\"%ls\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.vbs\",\n                        _wgetenv(L\"USERPROFILE\"));\n#endif\n        }\n        else\n        {\n#if !defined(AVOID_EXECUTION)\n                swprintf(lDialogString,\n#if !defined(__BORLANDC__) && !defined(__TINYC__) && ( !defined(__GNUC__) || (__GNUC__) >= 5 )\n                        lDialogStringLen,\n#endif\n                        L\"%ls\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.hta\",\n                        _wgetenv(L\"USERPROFILE\"));\n#endif\n        }\n        _wremove(lDialogString);\n        free(lDialogString);\n        /* wprintf( L\"lBuff: %ls\\n\" , lBuff ) ; */\n#ifdef TINYFD_NOCCSUNICODE\n\t\tlResult = !wcsncmp(lBuff+1, L\"1\", 1);\n#else\n\t\tlResult = !wcsncmp(lBuff, L\"1\", 1);\n#endif\n\n        /* printf( \"lResult: %d \\n\" , lResult ) ; */\n        if (!lResult)\n        {\n            return NULL ;\n        }\n\n        /* wprintf( \"lBuff+1: %ls\\n\" , lBuff+1 ) ; */\n\n#ifdef TINYFD_NOCCSUNICODE\n\t\tif (aDefaultInput)\n\t\t{\n\t\t\tlDialogStringLen = wcslen(lBuff) ;\n\t\t\tlBuff[lDialogStringLen - 1] = L'\\0';\n\t\t\tlBuff[lDialogStringLen - 2] = L'\\0';\n\t\t}\n\t\treturn lBuff + 2;\n#else\n\t\tif (aDefaultInput) lBuff[wcslen(lBuff) - 1] = L'\\0';\n\t\treturn lBuff + 1;\n#endif\n}\n\n\nstatic char const * inputBoxWinGui(\n        char * const aoBuff,\n        char const * const aTitle, /* NULL or \"\" */\n        char const * const aMessage, /* NULL or \"\" may NOT contain \\n nor \\t */\n        char const * const aDefaultInput) /* \"\" , if NULL it's a passwordBox */\n{\n        wchar_t * lTitle;\n        wchar_t * lMessage;\n        wchar_t * lDefaultInput;\n        wchar_t const * lTmpWChar;\n        char * lTmpChar;\n\n        if (tinyfd_winUtf8)\n        {\n                lTitle = utf8to16(aTitle);\n                lMessage = utf8to16(aMessage);\n                lDefaultInput = utf8to16(aDefaultInput);\n        }\n        else\n        {\n                lTitle = mbcsTo16(aTitle);\n                lMessage = mbcsTo16(aMessage);\n                lDefaultInput = mbcsTo16(aDefaultInput);\n        }\n\n        lTmpWChar = tinyfd_inputBoxW( lTitle, lMessage, lDefaultInput);\n\n        free(lTitle);\n        free(lMessage);\n        free(lDefaultInput);\n\n        if (!lTmpWChar)\n        {\n                return NULL;\n        }\n\n        if (tinyfd_winUtf8)\n        {\n                lTmpChar = utf16to8(lTmpWChar);\n        }\n        else\n        {\n                lTmpChar = utf16toMbcs(lTmpWChar);\n        }\n        strcpy(aoBuff, lTmpChar);\n        free(lTmpChar);\n\n        return aoBuff;\n}\n\n\nwchar_t const * tinyfd_saveFileDialogW(\n        wchar_t const * const aTitle, /* NULL or \"\" */\n        wchar_t const * const aDefaultPathAndFile, /* NULL or \"\" */\n        int const aNumOfFilterPatterns, /* 0 */\n        wchar_t const * const * const aFilterPatterns, /* NULL or {\"*.jpg\",\"*.png\"} */\n        wchar_t const * const aSingleFilterDescription) /* NULL or \"image files\" */\n{\n        static wchar_t lBuff[MAX_PATH_OR_CMD];\n        wchar_t lDirname[MAX_PATH_OR_CMD];\n        wchar_t lDialogString[MAX_PATH_OR_CMD];\n        wchar_t lFilterPatterns[MAX_PATH_OR_CMD] = L\"\";\n        wchar_t * p;\n        wchar_t * lRetval;\n\t\twchar_t const * ldefExt = NULL;\n\t\tint i;\n        HRESULT lHResult;\n        OPENFILENAMEW ofn = {0};\n\n        if (aTitle&&!wcscmp(aTitle, L\"tinyfd_query\")){ strcpy(tinyfd_response, \"windows_wchar\"); return (wchar_t const *)1; }\n\n        lHResult = CoInitializeEx(NULL, 0);\n\n        getPathWithoutFinalSlashW(lDirname, aDefaultPathAndFile);\n        getLastNameW(lBuff, aDefaultPathAndFile);\n\n        if (aNumOfFilterPatterns > 0)\n        {\n\t\t\tldefExt = aFilterPatterns[0];\n\n                if (aSingleFilterDescription && wcslen(aSingleFilterDescription))\n                {\n                        wcscpy(lFilterPatterns, aSingleFilterDescription);\n                        wcscat(lFilterPatterns, L\"\\n\");\n                }\n                wcscat(lFilterPatterns, aFilterPatterns[0]);\n                for (i = 1; i < aNumOfFilterPatterns; i++)\n                {\n                        wcscat(lFilterPatterns, L\";\");\n                        wcscat(lFilterPatterns, aFilterPatterns[i]);\n                }\n                wcscat(lFilterPatterns, L\"\\n\");\n                if (!(aSingleFilterDescription && wcslen(aSingleFilterDescription)))\n                {\n                        wcscpy(lDialogString, lFilterPatterns);\n                        wcscat(lFilterPatterns, lDialogString);\n                }\n                wcscat(lFilterPatterns, L\"All Files\\n*.*\\n\");\n                p = lFilterPatterns;\n                while ((p = wcschr(p, L'\\n')) != NULL)\n                {\n                        *p = L'\\0';\n                        p++;\n                }\n        }\n\n        ofn.lStructSize = sizeof(OPENFILENAMEW);\n        ofn.hwndOwner = GetForegroundWindow();\n        ofn.hInstance = 0;\n        ofn.lpstrFilter = wcslen(lFilterPatterns) ? lFilterPatterns : NULL;\n        ofn.lpstrCustomFilter = NULL;\n        ofn.nMaxCustFilter = 0;\n        ofn.nFilterIndex = 1;\n        ofn.lpstrFile = lBuff;\n\n        ofn.nMaxFile = MAX_PATH_OR_CMD;\n        ofn.lpstrFileTitle = NULL;\n        ofn.nMaxFileTitle = MAX_PATH_OR_CMD/2;\n        ofn.lpstrInitialDir = wcslen(lDirname) ? lDirname : NULL;\n        ofn.lpstrTitle = aTitle && wcslen(aTitle) ? aTitle : NULL;\n        ofn.Flags = OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST ;\n        ofn.nFileOffset = 0;\n        ofn.nFileExtension = 0;\n\t\tofn.lpstrDefExt = ldefExt;\n        ofn.lCustData = 0L;\n        ofn.lpfnHook = NULL;\n        ofn.lpTemplateName = NULL;\n\n        if (GetSaveFileNameW(&ofn) == 0)\n        {\n                lRetval = NULL;\n        }\n        else\n        {\n                lRetval = lBuff;\n        }\n\n        if (lHResult == S_OK || lHResult == S_FALSE)\n        {\n                CoUninitialize();\n        }\n        return lRetval;\n}\n\n\nstatic char const * saveFileDialogWinGui8(\n        char * const aoBuff,\n        char const * const aTitle, /* NULL or \"\" */\n        char const * const aDefaultPathAndFile, /* NULL or \"\" */\n        int const aNumOfFilterPatterns, /* 0 */\n        char const * const * const aFilterPatterns, /* NULL or {\"*.jpg\",\"*.png\"} */\n        char const * const aSingleFilterDescription) /* NULL or \"image files\" */\n{\n        wchar_t * lTitle;\n        wchar_t * lDefaultPathAndFile;\n        wchar_t * lSingleFilterDescription;\n        wchar_t * * lFilterPatterns;\n        wchar_t const * lTmpWChar;\n        char * lTmpChar;\n        int i ;\n\n        lFilterPatterns = (wchar_t **) malloc(aNumOfFilterPatterns*sizeof(wchar_t *));\n        for (i = 0; i < aNumOfFilterPatterns; i++)\n        {\n                lFilterPatterns[i]  = utf8to16(aFilterPatterns[i]);\n        }\n\n        lTitle = utf8to16(aTitle);\n        lDefaultPathAndFile = utf8to16(aDefaultPathAndFile);\n        lSingleFilterDescription = utf8to16(aSingleFilterDescription);\n\n        lTmpWChar = tinyfd_saveFileDialogW(\n                                        lTitle,\n                                        lDefaultPathAndFile,\n                                        aNumOfFilterPatterns,\n                                        (wchar_t const** ) /*stupid cast for gcc*/\n                                        lFilterPatterns,\n                                        lSingleFilterDescription);\n\n        free(lTitle);\n        free(lDefaultPathAndFile);\n        free(lSingleFilterDescription);\n        for (i = 0; i < aNumOfFilterPatterns; i++)\n        {\n                free(lFilterPatterns[i]);\n        }\n        free(lFilterPatterns);\n\n        if (!lTmpWChar)\n        {\n                return NULL;\n        }\n\n        lTmpChar = utf16to8(lTmpWChar);\n        strcpy(aoBuff, lTmpChar);\n        free(lTmpChar);\n\n        return aoBuff;\n}\n\n\nwchar_t const * tinyfd_openFileDialogW(\n        wchar_t const * const aTitle, /* NULL or \"\" */\n        wchar_t const * const aDefaultPathAndFile, /* NULL or \"\" */\n        int const aNumOfFilterPatterns, /* 0 */\n        wchar_t const * const * const aFilterPatterns, /* NULL or {\"*.jpg\",\"*.png\"} */\n        wchar_t const * const aSingleFilterDescription, /* NULL or \"image files\" */\n        int const aAllowMultipleSelects) /* 0 or 1 */\n{\n        static wchar_t lBuff[MAX_MULTIPLE_FILES*MAX_PATH_OR_CMD];\n\n        size_t lLengths[MAX_MULTIPLE_FILES];\n        wchar_t lDirname[MAX_PATH_OR_CMD];\n        wchar_t lFilterPatterns[MAX_PATH_OR_CMD] = L\"\";\n        wchar_t lDialogString[MAX_PATH_OR_CMD];\n        wchar_t * lPointers[MAX_MULTIPLE_FILES];\n        wchar_t * lRetval, * p;\n        int i, j;\n        size_t lBuffLen;\n        HRESULT lHResult;\n        OPENFILENAMEW ofn = { 0 };\n\n        if (aTitle&&!wcscmp(aTitle, L\"tinyfd_query\")){ strcpy(tinyfd_response, \"windows_wchar\"); return (wchar_t const *)1; }\n\n        lHResult = CoInitializeEx(NULL, 0);\n\n        getPathWithoutFinalSlashW(lDirname, aDefaultPathAndFile);\n        getLastNameW(lBuff, aDefaultPathAndFile);\n\n        if (aNumOfFilterPatterns > 0)\n        {\n                if (aSingleFilterDescription && wcslen(aSingleFilterDescription))\n                {\n                        wcscpy(lFilterPatterns, aSingleFilterDescription);\n                        wcscat(lFilterPatterns, L\"\\n\");\n                }\n                wcscat(lFilterPatterns, aFilterPatterns[0]);\n                for (i = 1; i < aNumOfFilterPatterns; i++)\n                {\n                        wcscat(lFilterPatterns, L\";\");\n                        wcscat(lFilterPatterns, aFilterPatterns[i]);\n                }\n                wcscat(lFilterPatterns, L\"\\n\");\n                if (!(aSingleFilterDescription && wcslen(aSingleFilterDescription)))\n                {\n                        wcscpy(lDialogString, lFilterPatterns);\n                        wcscat(lFilterPatterns, lDialogString);\n                }\n                wcscat(lFilterPatterns, L\"All Files\\n*.*\\n\");\n                p = lFilterPatterns;\n                while ((p = wcschr(p, L'\\n')) != NULL)\n                {\n                        *p = L'\\0';\n                        p++;\n                }\n        }\n\n        ofn.lStructSize = sizeof(OPENFILENAME);\n        ofn.hwndOwner = GetForegroundWindow();\n        ofn.hInstance = 0;\n        ofn.lpstrFilter = wcslen(lFilterPatterns) ? lFilterPatterns : NULL;\n        ofn.lpstrCustomFilter = NULL;\n        ofn.nMaxCustFilter = 0;\n        ofn.nFilterIndex = 1;\n        ofn.lpstrFile = lBuff;\n        ofn.nMaxFile = MAX_PATH_OR_CMD;\n        ofn.lpstrFileTitle = NULL;\n        ofn.nMaxFileTitle = MAX_PATH_OR_CMD / 2;\n        ofn.lpstrInitialDir = wcslen(lDirname) ? lDirname : NULL;\n        ofn.lpstrTitle = aTitle && wcslen(aTitle) ? aTitle : NULL;\n        ofn.Flags = OFN_EXPLORER | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;\n        ofn.nFileOffset = 0;\n        ofn.nFileExtension = 0;\n        ofn.lpstrDefExt = NULL;\n        ofn.lCustData = 0L;\n        ofn.lpfnHook = NULL;\n        ofn.lpTemplateName = NULL;\n\n        if (aAllowMultipleSelects)\n        {\n                ofn.Flags |= OFN_ALLOWMULTISELECT;\n        }\n\n        if (GetOpenFileNameW(&ofn) == 0)\n        {\n                lRetval = NULL;\n        }\n        else\n        {\n                lBuffLen = wcslen(lBuff);\n                lPointers[0] = lBuff + lBuffLen + 1;\n                if (!aAllowMultipleSelects || (lPointers[0][0] == L'\\0'))\n                {\n                        lRetval = lBuff;\n                }\n                else\n                {\n                        i = 0;\n                        do\n                        {\n                                lLengths[i] = wcslen(lPointers[i]);\n                                lPointers[i + 1] = lPointers[i] + lLengths[i] + 1;\n                                i++;\n                        } while (lPointers[i][0] != L'\\0');\n                        i--;\n                        p = lBuff + MAX_MULTIPLE_FILES*MAX_PATH_OR_CMD - 1;\n                        *p = L'\\0';\n                        for (j = i; j >= 0; j--)\n                        {\n                                p -= lLengths[j];\n                                memmove(p, lPointers[j], lLengths[j]*sizeof(wchar_t));\n                                p--;\n                                *p = L'\\\\';\n                                p -= lBuffLen;\n                                memmove(p, lBuff, lBuffLen*sizeof(wchar_t));\n                                p--;\n                                *p = L'|';\n                        }\n                        p++;\n                        lRetval = p;\n                }\n        }\n\n        if (lHResult == S_OK || lHResult == S_FALSE)\n        {\n                CoUninitialize();\n        }\n        return lRetval;\n}\n\n\nstatic char const * openFileDialogWinGui8(\n        char * const aoBuff,\n        char const * const aTitle, /*  NULL or \"\" */\n        char const * const aDefaultPathAndFile, /*  NULL or \"\" */\n        int const aNumOfFilterPatterns, /* 0 */\n        char const * const * const aFilterPatterns, /* NULL or {\"*.jpg\",\"*.png\"} */\n        char const * const aSingleFilterDescription, /* NULL or \"image files\" */\n        int const aAllowMultipleSelects) /* 0 or 1 */\n{\n        wchar_t * lTitle;\n        wchar_t * lDefaultPathAndFile;\n        wchar_t * lSingleFilterDescription;\n        wchar_t * * lFilterPatterns;\n        wchar_t const * lTmpWChar;\n        char * lTmpChar;\n        int i;\n\n        lFilterPatterns = (wchar_t * *) malloc(aNumOfFilterPatterns*sizeof(wchar_t *));\n        for (i = 0; i < aNumOfFilterPatterns; i++)\n        {\n                lFilterPatterns[i] = utf8to16(aFilterPatterns[i]);\n        }\n\n        lTitle = utf8to16(aTitle);\n        lDefaultPathAndFile = utf8to16(aDefaultPathAndFile);\n        lSingleFilterDescription = utf8to16(aSingleFilterDescription);\n\n        lTmpWChar = tinyfd_openFileDialogW(\n                lTitle,\n                lDefaultPathAndFile,\n                aNumOfFilterPatterns,\n                (wchar_t const**) /*stupid cast for gcc*/\n                lFilterPatterns,\n                lSingleFilterDescription,\n                aAllowMultipleSelects);\n\n        free(lTitle);\n        free(lDefaultPathAndFile);\n        free(lSingleFilterDescription);\n        for (i = 0; i < aNumOfFilterPatterns; i++)\n        {\n                free(lFilterPatterns[i]);\n        }\n        free(lFilterPatterns);\n\n        if (!lTmpWChar)\n        {\n                return NULL;\n        }\n\n        lTmpChar = utf16to8(lTmpWChar);\n        strcpy(aoBuff, lTmpChar);\n        free(lTmpChar);\n\n        return aoBuff;\n}\n\n#ifndef TINYFD_NOSELECTFOLDERWIN\n\nBOOL CALLBACK BrowseCallbackProc_enum(HWND hWndChild, LPARAM lParam)\n{\n\tchar buf[255];\n\tGetClassNameA(hWndChild, buf, sizeof(buf));\n\tif (strcmp(buf, \"SysTreeView32\") == 0) {\n\t\tHTREEITEM hNode = TreeView_GetSelection(hWndChild);\n\t\tTreeView_EnsureVisible(hWndChild, hNode);\n\t\treturn FALSE;\n\t}\n\treturn TRUE;\n}\n\n\n\nBOOL CALLBACK BrowseCallbackProcW_enum(HWND hWndChild, LPARAM lParam)\n{\n    wchar_t buf[255];\n    GetClassNameW(hWndChild, buf, sizeof(buf));\n    if (wcscmp(buf, L\"SysTreeView32\") == 0) {\n        HTREEITEM hNode = TreeView_GetSelection(hWndChild);\n        TreeView_EnsureVisible(hWndChild, hNode);\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic int __stdcall BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData)\n{\n\tswitch (uMsg) {\n\tcase BFFM_INITIALIZED:\n\t\tSendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);\n\t\tbreak;\n\tcase BFFM_SELCHANGED:\n\t\tEnumChildWindows(hwnd, BrowseCallbackProc_enum, 0);\n\t}\n\treturn 0;\n}\n\n\nstatic int __stdcall BrowseCallbackProcW(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData)\n{\n    switch (uMsg) {\n        case BFFM_INITIALIZED:\n            SendMessage(hwnd, BFFM_SETSELECTIONW, TRUE, (LPARAM)pData);\n            break;\n        case BFFM_SELCHANGED:\n            EnumChildWindows(hwnd, BrowseCallbackProcW_enum, 0);\n    }\n    return 0;\n}\n\nwchar_t const * tinyfd_selectFolderDialogW(\n        wchar_t const * const aTitle, /* NULL or \"\" */\n        wchar_t const * const aDefaultPath) /* NULL or \"\" */\n{\n        static wchar_t lBuff[MAX_PATH_OR_CMD];\n\t\twchar_t * lRetval;\n\n        BROWSEINFOW bInfo;\n        LPITEMIDLIST lpItem;\n        HRESULT lHResult;\n\n        if (aTitle&&!wcscmp(aTitle, L\"tinyfd_query\")){ strcpy(tinyfd_response, \"windows_wchar\"); return (wchar_t const *)1; }\n\n        lHResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);\n\n        bInfo.hwndOwner = GetForegroundWindow();\n        bInfo.pidlRoot = NULL;\n        bInfo.pszDisplayName = lBuff;\n        bInfo.lpszTitle = aTitle && wcslen(aTitle) ? aTitle : NULL;\n        if (lHResult == S_OK || lHResult == S_FALSE)\n        {\n                bInfo.ulFlags = BIF_USENEWUI;\n        }\n        bInfo.lpfn = BrowseCallbackProcW;\n        bInfo.lParam = (LPARAM)aDefaultPath;\n        bInfo.iImage = -1;\n\n        lpItem = SHBrowseForFolderW(&bInfo);\n        if (!lpItem)\n\t\t{\n\t\t\tlRetval = NULL;\n\t\t}\n\t\telse\n        {\n                SHGetPathFromIDListW(lpItem, lBuff);\n\t\t\t\tlRetval = lBuff ;\n        }\n\n        if (lHResult == S_OK || lHResult == S_FALSE)\n        {\n                CoUninitialize();\n        }\n\t\treturn lRetval;\n}\n\n\nstatic char const * selectFolderDialogWinGui8(\n        char * const aoBuff ,\n        char const * const aTitle , /*  NULL or \"\" */\n        char const * const aDefaultPath ) /* NULL or \"\" */\n{\n        wchar_t * lTitle;\n        wchar_t * lDefaultPath;\n        wchar_t const * lTmpWChar;\n        char * lTmpChar;\n\n        lTitle = utf8to16(aTitle);\n        lDefaultPath = utf8to16(aDefaultPath);\n\n        lTmpWChar = tinyfd_selectFolderDialogW(\n                lTitle,\n                lDefaultPath);\n\n        free(lTitle);\n        free(lDefaultPath);\n        if (!lTmpWChar)\n        {\n                return NULL;\n        }\n\n        lTmpChar = utf16to8(lTmpWChar);\n        strcpy(aoBuff, lTmpChar);\n        free(lTmpChar);\n\n        return aoBuff;\n}\n#endif /*TINYFD_NOSELECTFOLDERWIN*/\n\n\nwchar_t const * tinyfd_colorChooserW(\n        wchar_t const * const aTitle, /* NULL or \"\" */\n        wchar_t const * const aDefaultHexRGB, /* NULL or \"#FF0000\"*/\n        unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */\n        unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */\n{\n        static wchar_t lResultHexRGB[8];\n        CHOOSECOLORW cc;\n        COLORREF crCustColors[16];\n        unsigned char lDefaultRGB[3];\n        int lRet;\n\n        HRESULT lHResult;\n\n        if (aTitle&&!wcscmp(aTitle, L\"tinyfd_query\")){ strcpy(tinyfd_response, \"windows_wchar\"); return (wchar_t const *)1; }\n\n        lHResult = CoInitializeEx(NULL, 0);\n\n        if (aDefaultHexRGB)\n        {\n                Hex2RGBW(aDefaultHexRGB, lDefaultRGB);\n        }\n        else\n        {\n                lDefaultRGB[0] = aDefaultRGB[0];\n                lDefaultRGB[1] = aDefaultRGB[1];\n                lDefaultRGB[2] = aDefaultRGB[2];\n        }\n\n        /* we can't use aTitle */\n        cc.lStructSize = sizeof(CHOOSECOLOR);\n        cc.hwndOwner = GetForegroundWindow();\n        cc.hInstance = NULL;\n        cc.rgbResult = RGB(lDefaultRGB[0], lDefaultRGB[1], lDefaultRGB[2]);\n        cc.lpCustColors = crCustColors;\n        cc.Flags = CC_RGBINIT | CC_FULLOPEN | CC_ANYCOLOR ;\n        cc.lCustData = 0;\n        cc.lpfnHook = NULL;\n        cc.lpTemplateName = NULL;\n\n        lRet = ChooseColorW(&cc);\n\n        if (!lRet)\n        {\n                return NULL;\n        }\n\n        aoResultRGB[0] = GetRValue(cc.rgbResult);\n        aoResultRGB[1] = GetGValue(cc.rgbResult);\n        aoResultRGB[2] = GetBValue(cc.rgbResult);\n\n        RGB2HexW(aoResultRGB, lResultHexRGB);\n\n        if (lHResult == S_OK || lHResult == S_FALSE)\n        {\n                CoUninitialize();\n        }\n\n        return lResultHexRGB;\n}\n\n\nstatic char const * colorChooserWinGui8(\n        char const * const aTitle, /* NULL or \"\" */\n        char const * const aDefaultHexRGB, /* NULL or \"#FF0000\"*/\n        unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */\n        unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */\n{\n        static char lResultHexRGB[8];\n\n        wchar_t * lTitle;\n        wchar_t * lDefaultHexRGB;\n        wchar_t const * lTmpWChar;\n        char * lTmpChar;\n\n        lTitle = utf8to16(aTitle);\n        lDefaultHexRGB = utf8to16(aDefaultHexRGB);\n\n        lTmpWChar = tinyfd_colorChooserW(\n                lTitle,\n                lDefaultHexRGB,\n                aDefaultRGB,\n                aoResultRGB );\n\n        free(lTitle);\n        free(lDefaultHexRGB);\n        if (!lTmpWChar)\n        {\n                return NULL;\n        }\n\n        lTmpChar = utf16to8(lTmpWChar);\n        strcpy(lResultHexRGB, lTmpChar);\n        free(lTmpChar);\n\n        return lResultHexRGB;\n}\n\n\nstatic int messageBoxWinGuiA(\n    char const * const aTitle , /* NULL or \"\" */\n    char const * const aMessage , /* NULL or \"\"  may contain \\n and \\t */\n    char const * const aDialogType , /* \"ok\" \"okcancel\" \"yesno\" \"yesnocancel\" */\n    char const * const aIconType , /* \"info\" \"warning\" \"error\" \"question\" */\n    int const aDefaultButton ) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */\n{\n\tint lBoxReturnValue;\n\tUINT aCode ;\n\n        if ( aIconType && ! strcmp( \"warning\" , aIconType ) )\n        {\n                aCode = MB_ICONWARNING ;\n        }\n        else if ( aIconType && ! strcmp(\"error\", aIconType))\n        {\n                aCode = MB_ICONERROR ;\n        }\n        else if ( aIconType && ! strcmp(\"question\", aIconType))\n        {\n                aCode = MB_ICONQUESTION ;\n        }\n        else\n        {\n                aCode = MB_ICONINFORMATION ;\n        }\n\n        if ( aDialogType && ! strcmp( \"okcancel\" , aDialogType ) )\n        {\n                aCode += MB_OKCANCEL ;\n                if ( ! aDefaultButton )\n                {\n                        aCode += MB_DEFBUTTON2 ;\n                }\n        }\n        else if ( aDialogType && ! strcmp( \"yesno\" , aDialogType ) )\n        {\n                aCode += MB_YESNO ;\n                if ( ! aDefaultButton )\n                {\n                        aCode += MB_DEFBUTTON2 ;\n                }\n        }\n        else if (aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n        {\n                aCode += MB_YESNOCANCEL;\n                if (!aDefaultButton)\n                {\n                        aCode += MB_DEFBUTTON3;\n                }\n                else if (aDefaultButton == 2)\n                {\n                        aCode += MB_DEFBUTTON2;\n                }\n        }\n        else\n        {\n                aCode += MB_OK ;\n        }\n\n        aCode += MB_TOPMOST;\n\n        lBoxReturnValue = MessageBoxA(GetForegroundWindow(), aMessage, aTitle, aCode);\n\n        if (((aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n                && (lBoxReturnValue == IDNO)))\n        {\n                return 2;\n        }\n\n        if ( ( ( aDialogType\n                && strcmp(\"yesnocancel\", aDialogType)\n                && strcmp(\"okcancel\", aDialogType)\n                && strcmp(\"yesno\", aDialogType)))\n                || (lBoxReturnValue == IDOK)\n                || (lBoxReturnValue == IDYES) )\n        {\n                return 1 ;\n        }\n        else\n        {\n                return 0 ;\n        }\n}\n\n\nstatic char const * saveFileDialogWinGuiA(\n        char * const aoBuff ,\n    char const * const aTitle , /* NULL or \"\" */\n    char const * const aDefaultPathAndFile , /* NULL or \"\" */\n    int const aNumOfFilterPatterns , /* 0 */\n    char const * const * const aFilterPatterns , /* NULL or {\"*.jpg\",\"*.png\"} */\n    char const * const aSingleFilterDescription ) /* NULL or \"image files\" */\n{\n        char lDirname [MAX_PATH_OR_CMD] ;\n        char lDialogString[MAX_PATH_OR_CMD];\n        char lFilterPatterns[MAX_PATH_OR_CMD] = \"\";\n        int i ;\n        char * p;\n        char * lRetval;\n        HRESULT lHResult;\n\t\tchar const * ldefExt = NULL;\n        OPENFILENAMEA ofn = { 0 };\n\n        lHResult = CoInitializeEx(NULL,0);\n\n        getPathWithoutFinalSlash(lDirname, aDefaultPathAndFile);\n        getLastName(aoBuff, aDefaultPathAndFile);\n\n        if (aNumOfFilterPatterns > 0)\n        {\n\t\t\tldefExt = aFilterPatterns[0];\n\n                if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                {\n                        strcpy(lFilterPatterns, aSingleFilterDescription);\n                        strcat(lFilterPatterns, \"\\n\");\n                }\n                strcat(lFilterPatterns, aFilterPatterns[0]);\n                for (i = 1; i < aNumOfFilterPatterns; i++)\n                {\n                        strcat(lFilterPatterns, \";\");\n                        strcat(lFilterPatterns, aFilterPatterns[i]);\n                }\n                strcat(lFilterPatterns, \"\\n\");\n                if ( ! (aSingleFilterDescription && strlen(aSingleFilterDescription) ) )\n                {\n                        strcpy(lDialogString, lFilterPatterns);\n                        strcat(lFilterPatterns, lDialogString);\n                }\n                strcat(lFilterPatterns, \"All Files\\n*.*\\n\");\n                p = lFilterPatterns;\n                while ((p = strchr(p, '\\n')) != NULL)\n                {\n                        *p = '\\0';\n                        p ++ ;\n                }\n        }\n\n        ofn.lStructSize     = sizeof(OPENFILENAME) ;\n        ofn.hwndOwner           = GetForegroundWindow();\n        ofn.hInstance       = 0 ;\n        ofn.lpstrFilter         = strlen(lFilterPatterns) ? lFilterPatterns : NULL;\n        ofn.lpstrCustomFilter = NULL ;\n        ofn.nMaxCustFilter  = 0 ;\n        ofn.nFilterIndex    = 1 ;\n        ofn.lpstrFile           = aoBuff;\n\n        ofn.nMaxFile        = MAX_PATH_OR_CMD ;\n        ofn.lpstrFileTitle  = NULL ;\n        ofn.nMaxFileTitle       = MAX_PATH_OR_CMD / 2;\n        ofn.lpstrInitialDir = strlen(lDirname) ? lDirname : NULL;\n        ofn.lpstrTitle          = aTitle && strlen(aTitle) ? aTitle : NULL;\n        ofn.Flags           = OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR ;\n        ofn.nFileOffset     = 0 ;\n        ofn.nFileExtension  = 0 ;\n\t\tofn.lpstrDefExt\t\t= ldefExt;\n        ofn.lCustData       = 0L ;\n        ofn.lpfnHook        = NULL ;\n        ofn.lpTemplateName  = NULL ;\n\n        if ( GetSaveFileNameA ( & ofn ) == 0 )\n        {\n                lRetval = NULL ;\n        }\n        else\n        {\n                lRetval = aoBuff ;\n        }\n\n        if (lHResult==S_OK || lHResult==S_FALSE)\n        {\n                CoUninitialize();\n        }\n        return lRetval ;\n}\n\n\nstatic char const * openFileDialogWinGuiA(\n        char * const aoBuff ,\n    char const * const aTitle , /*  NULL or \"\" */\n    char const * const aDefaultPathAndFile , /*  NULL or \"\" */\n    int const aNumOfFilterPatterns , /* 0 */\n    char const * const * const aFilterPatterns , /* NULL or {\"*.jpg\",\"*.png\"} */\n    char const * const aSingleFilterDescription , /* NULL or \"image files\" */\n    int const aAllowMultipleSelects ) /* 0 or 1 */\n{\n        char lDirname [MAX_PATH_OR_CMD] ;\n        char lFilterPatterns[MAX_PATH_OR_CMD] = \"\";\n        char lDialogString[MAX_PATH_OR_CMD] ;\n        char * lPointers[MAX_MULTIPLE_FILES];\n        size_t lLengths[MAX_MULTIPLE_FILES];\n        int i , j ;\n        char * p;\n        size_t lBuffLen ;\n        char * lRetval;\n        HRESULT lHResult;\n        OPENFILENAMEA ofn = {0};\n\n        lHResult = CoInitializeEx(NULL,0);\n\n        getPathWithoutFinalSlash(lDirname, aDefaultPathAndFile);\n        getLastName(aoBuff, aDefaultPathAndFile);\n\n        if (aNumOfFilterPatterns > 0)\n        {\n                if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                {\n                        strcpy(lFilterPatterns, aSingleFilterDescription);\n                        strcat(lFilterPatterns, \"\\n\");\n                }\n                strcat(lFilterPatterns, aFilterPatterns[0]);\n                for (i = 1; i < aNumOfFilterPatterns; i++)\n                {\n                        strcat(lFilterPatterns, \";\");\n                        strcat(lFilterPatterns, aFilterPatterns[i]);\n                }\n                strcat(lFilterPatterns, \"\\n\");\n                if ( ! (aSingleFilterDescription && strlen(aSingleFilterDescription) ) )\n                {\n                        strcpy(lDialogString, lFilterPatterns);\n                        strcat(lFilterPatterns, lDialogString);\n                }\n                strcat(lFilterPatterns, \"All Files\\n*.*\\n\");\n                p = lFilterPatterns;\n                while ((p = strchr(p, '\\n')) != NULL)\n                {\n                        *p = '\\0';\n                        p ++ ;\n                }\n        }\n\n        ofn.lStructSize     = sizeof( OPENFILENAME ) ;\n        ofn.hwndOwner           = GetForegroundWindow();\n        ofn.hInstance       = 0 ;\n        ofn.lpstrFilter         = strlen(lFilterPatterns) ? lFilterPatterns : NULL;\n        ofn.lpstrCustomFilter = NULL ;\n        ofn.nMaxCustFilter  = 0 ;\n        ofn.nFilterIndex    = 1 ;\n        ofn.lpstrFile           = aoBuff ;\n        ofn.nMaxFile        = MAX_PATH_OR_CMD ;\n        ofn.lpstrFileTitle  = NULL ;\n        ofn.nMaxFileTitle       = MAX_PATH_OR_CMD / 2;\n        ofn.lpstrInitialDir = strlen(lDirname) ? lDirname : NULL;\n        ofn.lpstrTitle          = aTitle && strlen(aTitle) ? aTitle : NULL;\n        ofn.Flags                       = OFN_EXPLORER  | OFN_NOCHANGEDIR ;\n        ofn.nFileOffset     = 0 ;\n        ofn.nFileExtension  = 0 ;\n        ofn.lpstrDefExt     = NULL ;\n        ofn.lCustData       = 0L ;\n        ofn.lpfnHook        = NULL ;\n        ofn.lpTemplateName  = NULL ;\n\n        if ( aAllowMultipleSelects )\n        {\n                ofn.Flags |= OFN_ALLOWMULTISELECT;\n        }\n\n        if ( GetOpenFileNameA( & ofn ) == 0 )\n        {\n                lRetval = NULL ;\n        }\n        else\n        {\n                lBuffLen = strlen(aoBuff) ;\n                lPointers[0] = aoBuff + lBuffLen + 1 ;\n                if ( !aAllowMultipleSelects || (lPointers[0][0] == '\\0')  )\n                {\n                        lRetval = aoBuff ;\n                }\n                else\n                {\n                        i = 0 ;\n                        do\n                        {\n                                lLengths[i] = strlen(lPointers[i]);\n                                lPointers[i+1] = lPointers[i] + lLengths[i] + 1 ;\n                                i ++ ;\n                        }\n                        while ( lPointers[i][0] != '\\0' );\n                        i--;\n                        p = aoBuff + MAX_MULTIPLE_FILES*MAX_PATH_OR_CMD - 1 ;\n                        * p = '\\0';\n                        for ( j = i ; j >=0 ; j-- )\n                        {\n                                p -= lLengths[j];\n                                memmove(p, lPointers[j], lLengths[j]);\n                                p--;\n                                *p = '\\\\';\n                                p -= lBuffLen ;\n                                memmove(p, aoBuff, lBuffLen);\n                                p--;\n                                *p = '|';\n                        }\n                        p++;\n                        lRetval = p ;\n                }\n        }\n\n        if (lHResult==S_OK || lHResult==S_FALSE)\n        {\n                CoUninitialize();\n        }\n        return lRetval;\n}\n\n#ifndef TINYFD_NOSELECTFOLDERWIN\nstatic char const * selectFolderDialogWinGuiA(\n        char * const aoBuff ,\n        char const * const aTitle , /*  NULL or \"\" */\n        char const * const aDefaultPath ) /* NULL or \"\" */\n{\n        BROWSEINFOA bInfo ;\n        LPITEMIDLIST lpItem ;\n        HRESULT lHResult ;\n\t\tchar * lRetval = NULL ;\n\n        lHResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);\n\n        /* we can't use aDefaultPath */\n        bInfo.hwndOwner = GetForegroundWindow();\n        bInfo.pidlRoot = NULL ;\n        bInfo.pszDisplayName = aoBuff ;\n        bInfo.lpszTitle = aTitle && strlen(aTitle) ? aTitle : NULL;\n        if (lHResult == S_OK || lHResult == S_FALSE)\n        {\n                bInfo.ulFlags = BIF_USENEWUI;\n        }\n        bInfo.lpfn = BrowseCallbackProc;\n        bInfo.lParam = (LPARAM)aDefaultPath;\n        bInfo.iImage = -1 ;\n\n        lpItem = SHBrowseForFolderA( & bInfo ) ;\n        if ( lpItem )\n        {\n                SHGetPathFromIDListA( lpItem , aoBuff ) ;\n\t\t\t\tlRetval = aoBuff;\n        }\n\n        if (lHResult==S_OK || lHResult==S_FALSE)\n        {\n                CoUninitialize();\n        }\n\t\treturn lRetval;\n}\n#endif /*TINYFD_NOSELECTFOLDERWIN*/\n\n\nstatic char const * colorChooserWinGuiA(\n        char const * const aTitle, /* NULL or \"\" */\n        char const * const aDefaultHexRGB, /* NULL or \"#FF0000\"*/\n        unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */\n        unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */\n{\n        static char lResultHexRGB[8];\n\n        CHOOSECOLORA cc;\n        COLORREF crCustColors[16];\n        unsigned char lDefaultRGB[3];\n        int lRet;\n\n        if ( aDefaultHexRGB )\n        {\n                Hex2RGB(aDefaultHexRGB, lDefaultRGB);\n        }\n        else\n        {\n                lDefaultRGB[0]=aDefaultRGB[0];\n                lDefaultRGB[1]=aDefaultRGB[1];\n                lDefaultRGB[2]=aDefaultRGB[2];\n        }\n\n        /* we can't use aTitle */\n        cc.lStructSize = sizeof( CHOOSECOLOR ) ;\n        cc.hwndOwner = GetForegroundWindow();\n        cc.hInstance = NULL ;\n        cc.rgbResult = RGB(lDefaultRGB[0], lDefaultRGB[1], lDefaultRGB[2]);\n        cc.lpCustColors = crCustColors;\n        cc.Flags = CC_RGBINIT | CC_FULLOPEN;\n        cc.lCustData = 0;\n        cc.lpfnHook = NULL;\n        cc.lpTemplateName = NULL;\n\n        lRet = ChooseColorA(&cc);\n\n        if ( ! lRet )\n        {\n                return NULL;\n        }\n\n        aoResultRGB[0] = GetRValue(cc.rgbResult);\n        aoResultRGB[1] = GetGValue(cc.rgbResult);\n        aoResultRGB[2] = GetBValue(cc.rgbResult);\n\n        RGB2Hex(aoResultRGB, lResultHexRGB);\n\n        return lResultHexRGB;\n}\n\n#endif /* TINYFD_NOLIB */\n\nstatic int dialogPresent(void)\n{\n        static int lDialogPresent = -1 ;\n        char lBuff [MAX_PATH_OR_CMD] ;\n        FILE * lIn ;\n        char const * lString = \"dialog.exe\";\n        if ( lDialogPresent < 0 )\n        {\n#if !defined(AVOID_EXECUTION)\n                if (!(lIn = _popen(\"where dialog.exe\",\"r\")))\n                {\n                        lDialogPresent = 0 ;\n                        return 0 ;\n                }\n                while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n                {}\n                _pclose( lIn ) ;\n#endif\n                if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n                {\n                        lBuff[strlen( lBuff ) -1] = '\\0' ;\n                }\n                if ( strcmp(lBuff+strlen(lBuff)-strlen(lString),lString) )\n                {\n                        lDialogPresent = 0 ;\n                }\n                else\n                {\n                        lDialogPresent = 1 ;\n                }\n        }\n        return lDialogPresent;\n}\n\n\nstatic int messageBoxWinConsole(\n    char const * const aTitle , /* NULL or \"\" */\n    char const * const aMessage , /* NULL or \"\"  may contain \\n and \\t */\n    char const * const aDialogType , /* \"ok\" \"okcancel\" \"yesno\" \"yesnocancel\" */\n    char const * const aIconType , /* \"info\" \"warning\" \"error\" \"question\" */\n    int const aDefaultButton ) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */\n{\n        char lDialogString[MAX_PATH_OR_CMD];\n        char lDialogFile[MAX_PATH_OR_CMD];\n        FILE * lIn;\n        char lBuff [MAX_PATH_OR_CMD] = \"\";\n\n        strcpy( lDialogString , \"dialog \" ) ;\n        if ( aTitle && strlen(aTitle) )\n        {\n                strcat(lDialogString, \"--title \\\"\") ;\n                strcat(lDialogString, aTitle) ;\n                strcat(lDialogString, \"\\\" \") ;\n        }\n\n        if ( aDialogType && ( !strcmp( \"okcancel\" , aDialogType )\n                || !strcmp(\"yesno\", aDialogType) || !strcmp(\"yesnocancel\", aDialogType) ) )\n        {\n                strcat(lDialogString, \"--backtitle \\\"\") ;\n                strcat(lDialogString, \"tab: move focus\") ;\n                strcat(lDialogString, \"\\\" \") ;\n        }\n\n        if ( aDialogType && ! strcmp( \"okcancel\" , aDialogType ) )\n        {\n                if ( ! aDefaultButton )\n                {\n                        strcat( lDialogString , \"--defaultno \" ) ;\n                }\n                strcat( lDialogString ,\n                                \"--yes-label \\\"Ok\\\" --no-label \\\"Cancel\\\" --yesno \" ) ;\n        }\n        else if ( aDialogType && ! strcmp( \"yesno\" , aDialogType ) )\n        {\n                if ( ! aDefaultButton )\n                {\n                        strcat( lDialogString , \"--defaultno \" ) ;\n                }\n                strcat( lDialogString , \"--yesno \" ) ;\n        }\n        else if (aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n        {\n                if (!aDefaultButton)\n                {\n                        strcat(lDialogString, \"--defaultno \");\n                }\n                strcat(lDialogString, \"--menu \");\n        }\n        else\n        {\n                strcat( lDialogString , \"--msgbox \" ) ;\n        }\n\n        strcat( lDialogString , \"\\\"\" ) ;\n        if ( aMessage && strlen(aMessage) )\n        {\n                replaceSubStr( aMessage , \"\\n\" , \"\\\\n\" , lBuff ) ;\n                strcat(lDialogString, lBuff) ;\n                lBuff[0]='\\0';\n        }\n        strcat(lDialogString, \"\\\" \");\n\n        if (aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n        {\n                strcat(lDialogString, \"0 60 0 Yes \\\"\\\" No \\\"\\\"\");\n                strcat(lDialogString, \"2>>\");\n        }\n        else\n        {\n                strcat(lDialogString, \"10 60\");\n                strcat(lDialogString, \" && echo 1 > \");\n        }\n\n        strcpy(lDialogFile, getenv(\"USERPROFILE\"));\n        strcat(lDialogFile, \"\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\");\n        strcat(lDialogString, lDialogFile);\n\n        /*if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;*/\n        system( lDialogString ) ;\n\n        if (!(lIn = fopen(lDialogFile, \"r\")))\n        {\n                remove(lDialogFile);\n                return 0 ;\n        }\n        while (fgets(lBuff, sizeof(lBuff), lIn) != NULL)\n        {}\n        fclose(lIn);\n        remove(lDialogFile);\n    if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n    {\n        lBuff[strlen( lBuff ) -1] = '\\0' ;\n    }\n\n        /* if (tinyfd_verbose) printf(\"lBuff: %s\\n\", lBuff); */\n        if ( ! strlen(lBuff) )\n        {\n                return 0;\n        }\n\n        if (aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n        {\n                if (lBuff[0] == 'Y') return 1;\n                else return 2;\n        }\n\n        return 1;\n}\n\n\nstatic char const * inputBoxWinConsole(\n        char * const aoBuff ,\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aMessage , /* NULL or \"\" may NOT contain \\n nor \\t */\n        char const * const aDefaultInput ) /* \"\" , if NULL it's a passwordBox */\n{\n        char lDialogString[MAX_PATH_OR_CMD];\n        char lDialogFile[MAX_PATH_OR_CMD];\n        FILE * lIn;\n        int lResult;\n\n        strcpy(lDialogFile, getenv(\"USERPROFILE\"));\n        strcat(lDialogFile, \"\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\");\n        strcpy(lDialogString , \"echo|set /p=1 >\" ) ;\n        strcat(lDialogString, lDialogFile);\n        strcat( lDialogString , \" & \" ) ;\n\n        strcat( lDialogString , \"dialog \" ) ;\n        if ( aTitle && strlen(aTitle) )\n        {\n                strcat(lDialogString, \"--title \\\"\") ;\n                strcat(lDialogString, aTitle) ;\n                strcat(lDialogString, \"\\\" \") ;\n        }\n\n        strcat(lDialogString, \"--backtitle \\\"\") ;\n        strcat(lDialogString, \"tab: move focus\") ;\n        if ( ! aDefaultInput )\n        {\n                strcat(lDialogString, \" (sometimes nothing, no blink nor star, is shown in text field)\") ;\n        }\n\n        strcat(lDialogString, \"\\\" \") ;\n\n        if ( ! aDefaultInput )\n        {\n                strcat( lDialogString , \"--insecure --passwordbox\" ) ;\n        }\n        else\n        {\n                strcat( lDialogString , \"--inputbox\" ) ;\n        }\n        strcat( lDialogString , \" \\\"\" ) ;\n        if ( aMessage && strlen(aMessage) )\n        {\n                strcat(lDialogString, aMessage) ;\n        }\n        strcat(lDialogString,\"\\\" 10 60 \") ;\n        if ( aDefaultInput && strlen(aDefaultInput) )\n        {\n                strcat(lDialogString, \"\\\"\") ;\n                strcat(lDialogString, aDefaultInput) ;\n                strcat(lDialogString, \"\\\" \") ;\n        }\n\n        strcat(lDialogString, \"2>>\");\n        strcpy(lDialogFile, getenv(\"USERPROFILE\"));\n        strcat(lDialogFile, \"\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\");\n        strcat(lDialogString, lDialogFile);\n        strcat(lDialogString, \" || echo 0 > \");\n        strcat(lDialogString, lDialogFile);\n\n        /* printf( \"lDialogString: %s\\n\" , lDialogString ) ; */\n        system( lDialogString ) ;\n\n        if (!(lIn = fopen(lDialogFile, \"r\")))\n        {\n                remove(lDialogFile);\n                return 0 ;\n        }\n        while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL)\n        {}\n        fclose(lIn);\n\n        wipefile(lDialogFile);\n        remove(lDialogFile);\n    if ( aoBuff[strlen( aoBuff ) -1] == '\\n' )\n    {\n        aoBuff[strlen( aoBuff ) -1] = '\\0' ;\n    }\n        /* printf( \"aoBuff: %s\\n\" , aoBuff ) ; */\n\n        /* printf( \"aoBuff: %s len: %lu \\n\" , aoBuff , strlen(aoBuff) ) ; */\n    lResult =  strncmp( aoBuff , \"1\" , 1) ? 0 : 1 ;\n        /* printf( \"lResult: %d \\n\" , lResult ) ; */\n    if ( ! lResult )\n    {\n                return NULL ;\n        }\n        /* printf( \"aoBuff+1: %s\\n\" , aoBuff+1 ) ; */\n        return aoBuff+3 ;\n}\n\n\nstatic char const * saveFileDialogWinConsole(\n        char * const aoBuff ,\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aDefaultPathAndFile ) /* NULL or \"\" */\n{\n        char lDialogString[MAX_PATH_OR_CMD];\n        char lPathAndFile[MAX_PATH_OR_CMD] = \"\";\n        FILE * lIn;\n\n        strcpy( lDialogString , \"dialog \" ) ;\n        if ( aTitle && strlen(aTitle) )\n        {\n                strcat(lDialogString, \"--title \\\"\") ;\n                strcat(lDialogString, aTitle) ;\n                strcat(lDialogString, \"\\\" \") ;\n        }\n\n        strcat(lDialogString, \"--backtitle \\\"\") ;\n        strcat(lDialogString,\n                \"tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY\") ;\n        strcat(lDialogString, \"\\\" \") ;\n\n        strcat( lDialogString , \"--fselect \\\"\" ) ;\n        if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n        {\n                /* dialog.exe uses unix separators even on windows */\n                strcpy(lPathAndFile, aDefaultPathAndFile);\n                replaceChr( lPathAndFile , '\\\\' , '/' ) ;\n        }\n\n        /* dialog.exe needs at least one separator */\n        if ( ! strchr(lPathAndFile, '/') )\n        {\n                strcat(lDialogString, \"./\") ;\n        }\n        strcat(lDialogString, lPathAndFile) ;\n        strcat(lDialogString, \"\\\" 0 60 2>\");\n        strcpy(lPathAndFile, getenv(\"USERPROFILE\"));\n        strcat(lPathAndFile, \"\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\");\n        strcat(lDialogString, lPathAndFile);\n\n        /* printf( \"lDialogString: %s\\n\" , lDialogString ) ; */\n        system( lDialogString ) ;\n\n        if (!(lIn = fopen(lPathAndFile, \"r\")))\n        {\n                remove(lPathAndFile);\n                return NULL;\n        }\n        while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL)\n        {}\n        fclose(lIn);\n        remove(lPathAndFile);\n        replaceChr( aoBuff , '/' , '\\\\' ) ;\n        /* printf( \"aoBuff: %s\\n\" , aoBuff ) ; */\n        getLastName(lDialogString,aoBuff);\n        if ( ! strlen(lDialogString) )\n        {\n                return NULL;\n        }\n        return aoBuff;\n}\n\n\nstatic char const * openFileDialogWinConsole(\n        char * const aoBuff ,\n        char const * const aTitle , /*  NULL or \"\" */\n        char const * const aDefaultPathAndFile , /*  NULL or \"\" */\n        int const aAllowMultipleSelects ) /* 0 or 1 */\n{\n        char lFilterPatterns[MAX_PATH_OR_CMD] = \"\";\n        char lDialogString[MAX_PATH_OR_CMD] ;\n        FILE * lIn;\n\n        strcpy( lDialogString , \"dialog \" ) ;\n        if ( aTitle && strlen(aTitle) )\n        {\n                strcat(lDialogString, \"--title \\\"\") ;\n                strcat(lDialogString, aTitle) ;\n                strcat(lDialogString, \"\\\" \") ;\n        }\n\n        strcat(lDialogString, \"--backtitle \\\"\") ;\n        strcat(lDialogString,\n                \"tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY\") ;\n        strcat(lDialogString, \"\\\" \") ;\n\n        strcat( lDialogString , \"--fselect \\\"\" ) ;\n        if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n        {\n                /* dialog.exe uses unix separators even on windows */\n                strcpy(lFilterPatterns, aDefaultPathAndFile);\n                replaceChr( lFilterPatterns , '\\\\' , '/' ) ;\n        }\n\n        /* dialog.exe needs at least one separator */\n        if ( ! strchr(lFilterPatterns, '/') )\n        {\n                strcat(lDialogString, \"./\") ;\n        }\n        strcat(lDialogString, lFilterPatterns) ;\n        strcat(lDialogString, \"\\\" 0 60 2>\");\n        strcpy(lFilterPatterns, getenv(\"USERPROFILE\"));\n        strcat(lFilterPatterns, \"\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\");\n        strcat(lDialogString, lFilterPatterns);\n\n        /* printf( \"lDialogString: %s\\n\" , lDialogString ) ; */\n        system( lDialogString ) ;\n\n        if (!(lIn = fopen(lFilterPatterns, \"r\")))\n        {\n                remove(lFilterPatterns);\n                return NULL;\n        }\n        while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL)\n        {}\n        fclose(lIn);\n        remove(lFilterPatterns);\n        replaceChr( aoBuff , '/' , '\\\\' ) ;\n        /* printf( \"aoBuff: %s\\n\" , aoBuff ) ; */\n        return aoBuff;\n}\n\n\nstatic char const * selectFolderDialogWinConsole(\n        char * const aoBuff ,\n        char const * const aTitle , /*  NULL or \"\" */\n        char const * const aDefaultPath ) /* NULL or \"\" */\n{\n        char lDialogString [MAX_PATH_OR_CMD] ;\n        char lString [MAX_PATH_OR_CMD] ;\n        FILE * lIn ;\n\n        strcpy( lDialogString , \"dialog \" ) ;\n        if ( aTitle && strlen(aTitle) )\n        {\n                strcat(lDialogString, \"--title \\\"\") ;\n                strcat(lDialogString, aTitle) ;\n                strcat(lDialogString, \"\\\" \") ;\n        }\n\n        strcat(lDialogString, \"--backtitle \\\"\") ;\n        strcat(lDialogString,\n                \"tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY\") ;\n        strcat(lDialogString, \"\\\" \") ;\n\n        strcat( lDialogString , \"--dselect \\\"\" ) ;\n        if ( aDefaultPath && strlen(aDefaultPath) )\n        {\n                /* dialog.exe uses unix separators even on windows */\n                strcpy(lString, aDefaultPath) ;\n                ensureFinalSlash(lString);\n                replaceChr( lString , '\\\\' , '/' ) ;\n                strcat(lDialogString, lString) ;\n        }\n        else\n        {\n                /* dialog.exe needs at least one separator */\n                strcat(lDialogString, \"./\") ;\n        }\n        strcat(lDialogString, \"\\\" 0 60 2>\");\n        strcpy(lString, getenv(\"USERPROFILE\"));\n        strcat(lString, \"\\\\AppData\\\\Local\\\\Temp\\\\tinyfd.txt\");\n        strcat(lDialogString, lString);\n\n        /* printf( \"lDialogString: %s\\n\" , lDialogString ) ; */\n        system( lDialogString ) ;\n\n        if (!(lIn = fopen(lString, \"r\")))\n        {\n                remove(lString);\n                return NULL;\n        }\n        while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL)\n        {}\n        fclose(lIn);\n        remove(lString);\n        replaceChr( aoBuff , '/' , '\\\\' ) ;\n        /* printf( \"aoBuff: %s\\n\" , aoBuff ) ; */\n        return aoBuff;\n}\n\n\nint tinyfd_messageBox(\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aMessage , /* NULL or \"\"  may contain \\n and \\t */\n        char const * const aDialogType , /* \"ok\" \"okcancel\" \"yesno\" \"yesnocancel\" */\n        char const * const aIconType , /* \"info\" \"warning\" \"error\" \"question\" */\n        int const aDefaultButton ) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */\n{\n        char lChar ;\n\n#ifndef TINYFD_NOLIB\n        if ((!tinyfd_forceConsole || !(GetConsoleWindow() || dialogPresent()))\n                && (!getenv(\"SSH_CLIENT\") || getenv(\"DISPLAY\")))\n        {\n                if (aTitle&&!strcmp(aTitle, \"tinyfd_query\")){ strcpy(tinyfd_response, \"windows\"); return 1; }\n                if (tinyfd_winUtf8)\n                {\n                        return messageBoxWinGui8(\n                                aTitle, aMessage, aDialogType, aIconType, aDefaultButton);\n                }\n                else\n                {\n                        return messageBoxWinGuiA(\n                                aTitle, aMessage, aDialogType, aIconType, aDefaultButton);\n                }\n        }\n        else\n#endif /* TINYFD_NOLIB */\n        if ( dialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return 0;}\n                return messageBoxWinConsole(\n                                        aTitle,aMessage,aDialogType,aIconType,aDefaultButton);\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"basicinput\");return 0;}\n                if (!gWarningDisplayed && !tinyfd_forceConsole )\n                {\n                        gWarningDisplayed = 1;\n                        printf(\"\\n\\n%s\\n\", gTitle);\n                        printf(\"%s\\n\\n\", tinyfd_needs);\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        printf(\"\\n%s\\n\\n\", aTitle);\n                }\n                if ( aDialogType && !strcmp(\"yesno\",aDialogType) )\n                {\n                        do\n                        {\n                                if ( aMessage && strlen(aMessage) )\n                                {\n                                        printf(\"%s\\n\",aMessage);\n                                }\n                                printf(\"y/n: \");\n                                lChar = (char) tolower( _getch() ) ;\n                                printf(\"\\n\\n\");\n                        }\n                        while ( lChar != 'y' && lChar != 'n' ) ;\n                        return lChar == 'y' ? 1 : 0 ;\n                }\n                else if ( aDialogType && !strcmp(\"okcancel\",aDialogType) )\n                {\n                        do\n                        {\n                                if ( aMessage && strlen(aMessage) )\n                                {\n                                        printf(\"%s\\n\",aMessage);\n                                }\n                                printf(\"[O]kay/[C]ancel: \");\n                                lChar = (char) tolower( _getch() ) ;\n                                printf(\"\\n\\n\");\n                        }\n                        while ( lChar != 'o' && lChar != 'c' ) ;\n                        return lChar == 'o' ? 1 : 0 ;\n                }\n                else if (aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n                {\n                        do\n                        {\n                                if (aMessage && strlen(aMessage))\n                                {\n                                        printf(\"%s\\n\", aMessage);\n                                }\n                                printf(\"[Y]es/[N]o/[C]ancel: \");\n                                lChar = (char)tolower(_getch());\n                                printf(\"\\n\\n\");\n                        } while (lChar != 'y' && lChar != 'n' && lChar != 'c');\n                        return (lChar == 'y') ? 1 : (lChar == 'n') ? 2 : 0 ;\n                }\n                else\n                {\n                        if ( aMessage && strlen(aMessage) )\n                        {\n                                printf(\"%s\\n\\n\",aMessage);\n                        }\n                        printf(\"press enter to continue \");\n                        lChar = (char) _getch() ;\n                        printf(\"\\n\\n\");\n                        return 1 ;\n                }\n        }\n}\n\n\n/* return has only meaning for tinyfd_query */\nint tinyfd_notifyPopup(\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aMessage , /* NULL or \"\" may contain \\n \\t */\n        char const * const aIconType ) /* \"info\" \"warning\" \"error\" */\n{\n#ifndef TINYFD_NOLIB\n        if ((!tinyfd_forceConsole || !(\n                GetConsoleWindow() ||\n                dialogPresent()))\n                && ( !getenv(\"SSH_CLIENT\") || getenv(\"DISPLAY\") ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"windows\");return 1;}\n                return notifyWinGui(aTitle, aMessage, aIconType);\n        }\n        else\n#endif /* TINYFD_NOLIB */\n        {\n                return tinyfd_messageBox(aTitle, aMessage, \"ok\" , aIconType, 0);\n        }\n}\n\n\n/* returns NULL on cancel */\nchar const * tinyfd_inputBox(\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aMessage , /* NULL or \"\" may NOT contain \\n nor \\t */\n        char const * const aDefaultInput ) /* \"\" , if NULL it's a passwordBox */\n{\n        static char lBuff [MAX_PATH_OR_CMD] ;\n        char * lEOF;\n\n#ifndef TINYFD_NOLIB\n        DWORD mode = 0;\n        HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);\n\n        if ((!tinyfd_forceConsole || !(\n                GetConsoleWindow() ||\n                dialogPresent()))\n                && ( !getenv(\"SSH_CLIENT\") || getenv(\"DISPLAY\") ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"windows\");return (char const *)1;}\n                lBuff[0]='\\0';\n                return inputBoxWinGui(lBuff, aTitle, aMessage, aDefaultInput);\n        }\n        else\n#endif /* TINYFD_NOLIB */\n        if ( dialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                lBuff[0]='\\0';\n                return inputBoxWinConsole(lBuff,aTitle,aMessage,aDefaultInput);\n        }\n        else\n        {\n      if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"basicinput\");return (char const *)0;}\n      lBuff[0]='\\0';\n      if (!gWarningDisplayed && !tinyfd_forceConsole)\n      {\n          gWarningDisplayed = 1 ;\n          printf(\"\\n\\n%s\\n\", gTitle);\n          printf(\"%s\\n\\n\", tinyfd_needs);\n      }\n      if ( aTitle && strlen(aTitle) )\n      {\n          printf(\"\\n%s\\n\\n\", aTitle);\n      }\n      if ( aMessage && strlen(aMessage) )\n      {\n          printf(\"%s\\n\",aMessage);\n      }\n      printf(\"(ctrl-Z + enter to cancel): \");\n#ifndef TINYFD_NOLIB\n      if ( ! aDefaultInput )\n      {\n          GetConsoleMode(hStdin,&mode);\n          SetConsoleMode(hStdin,mode & (~ENABLE_ECHO_INPUT) );\n      }\n#endif /* TINYFD_NOLIB */\n      lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin);\n      if ( ! lEOF )\n      {\n          return NULL;\n      }\n#ifndef TINYFD_NOLIB\n      if ( ! aDefaultInput )\n      {\n          SetConsoleMode(hStdin,mode);\n          printf(\"\\n\");\n      }\n#endif /* TINYFD_NOLIB */\n      printf(\"\\n\");\n      if ( strchr(lBuff,27) )\n      {\n          return NULL ;\n      }\n      if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n      {\n          lBuff[strlen( lBuff ) -1] = '\\0' ;\n      }\n      return lBuff ;\n  }\n}\n\n\nchar const * tinyfd_saveFileDialog(\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aDefaultPathAndFile , /* NULL or \"\" */\n        int const aNumOfFilterPatterns , /* 0 */\n        char const * const * const aFilterPatterns , /* NULL or {\"*.jpg\",\"*.png\"} */\n        char const * const aSingleFilterDescription ) /* NULL or \"image files\" */\n{\n        static char lBuff [MAX_PATH_OR_CMD] ;\n        char lString[MAX_PATH_OR_CMD] ;\n        char const * p ;\n        lBuff[0]='\\0';\n#ifndef TINYFD_NOLIB\n        if ( ( !tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent() ) )\n          && ( !getenv(\"SSH_CLIENT\") || getenv(\"DISPLAY\") ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"windows\");return (char const *)1;}\n                if (tinyfd_winUtf8)\n                {\n                        p = saveFileDialogWinGui8(lBuff,\n                                aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription);\n                }\n                else\n                {\n                        p = saveFileDialogWinGuiA(lBuff,\n                                aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription);\n                }\n        }\n        else\n#endif /* TINYFD_NOLIB */\n        if ( dialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                p = saveFileDialogWinConsole(lBuff,aTitle,aDefaultPathAndFile);\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"basicinput\");return (char const *)0;}\n                p = tinyfd_inputBox(aTitle, \"Save file\",\"\");\n        }\n\n        if ( ! p || ! strlen( p )  )\n        {\n                return NULL;\n        }\n        getPathWithoutFinalSlash( lString , p ) ;\n        if ( strlen( lString ) && ! dirExists( lString ) )\n        {\n                return NULL ;\n        }\n        getLastName(lString,p);\n        if ( ! filenameValid(lString) )\n        {\n                return NULL;\n        }\n        return p ;\n}\n\n\n/* in case of multiple files, the separator is | */\nchar const * tinyfd_openFileDialog(\n    char const * const aTitle , /* NULL or \"\" */\n    char const * const aDefaultPathAndFile , /* NULL or \"\" */\n    int const aNumOfFilterPatterns , /* 0 */\n    char const * const * const aFilterPatterns , /* NULL or {\"*.jpg\",\"*.png\"} */\n    char const * const aSingleFilterDescription , /* NULL or \"image files\" */\n    int const aAllowMultipleSelects ) /* 0 or 1 */\n{\n        static char lBuff[MAX_MULTIPLE_FILES*MAX_PATH_OR_CMD];\n        char const * p ;\n#ifndef TINYFD_NOLIB\n        if ( ( !tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent() ) )\n          && ( !getenv(\"SSH_CLIENT\") || getenv(\"DISPLAY\") ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"windows\");return (char const *)1;}\n                if (tinyfd_winUtf8)\n                {\n                        p = openFileDialogWinGui8(lBuff,\n                                aTitle, aDefaultPathAndFile, aNumOfFilterPatterns,\n                                aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects);\n                }\n                else\n                {\n                        p = openFileDialogWinGuiA(lBuff,\n                                aTitle, aDefaultPathAndFile, aNumOfFilterPatterns,\n                                aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects);\n                }\n        }\n        else\n#endif /* TINYFD_NOLIB */\n        if ( dialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                p = openFileDialogWinConsole(lBuff,\n                                aTitle,aDefaultPathAndFile,aAllowMultipleSelects);\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"basicinput\");return (char const *)0;}\n                p = tinyfd_inputBox(aTitle, \"Open file\",\"\");\n        }\n\n        if ( ! p || ! strlen( p )  )\n        {\n                return NULL;\n        }\n        if ( aAllowMultipleSelects && strchr(p, '|') )\n        {\n                p = ensureFilesExist( lBuff , p ) ;\n        }\n        else if ( ! fileExists(p) )\n        {\n                return NULL ;\n        }\n        /* printf( \"lBuff3: %s\\n\" , p ) ; */\n        return p ;\n}\n\n\nchar const * tinyfd_selectFolderDialog(\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aDefaultPath ) /* NULL or \"\" */\n{\n    static char lBuff [MAX_PATH_OR_CMD] ;\n        char const * p ;\n#ifndef TINYFD_NOLIB\n        if ( ( !tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent() ) )\n          && ( !getenv(\"SSH_CLIENT\") || getenv(\"DISPLAY\") ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"windows\");return (char const *)1;}\n                if (tinyfd_winUtf8)\n                {\n#ifndef TINYFD_NOSELECTFOLDERWIN\n                        p = selectFolderDialogWinGui8(lBuff, aTitle, aDefaultPath);\n                }\n                else\n                {\n                        p = selectFolderDialogWinGuiA(lBuff, aTitle, aDefaultPath);\n#endif /*TINYFD_NOSELECTFOLDERWIN*/\n                }\n        }\n        else\n#endif /* TINYFD_NOLIB */\n        if ( dialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                p = selectFolderDialogWinConsole(lBuff,aTitle,aDefaultPath);\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"basicinput\");return (char const *)0;}\n                p = tinyfd_inputBox(aTitle, \"Select folder\",\"\");\n        }\n\n        if ( ! p || ! strlen( p ) || ! dirExists( p ) )\n        {\n                return NULL ;\n        }\n        return p ;\n}\n\n\n/* returns the hexcolor as a string \"#FF0000\" */\n/* aoResultRGB also contains the result */\n/* aDefaultRGB is used only if aDefaultHexRGB is NULL */\n/* aDefaultRGB and aoResultRGB can be the same array */\nchar const * tinyfd_colorChooser(\n        char const * const aTitle, /* NULL or \"\" */\n        char const * const aDefaultHexRGB, /* NULL or \"#FF0000\"*/\n        unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */\n        unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */\n{\n        char lDefaultHexRGB[8];\n        char * lpDefaultHexRGB;\n        int i;\n        char const * p ;\n\n#ifndef TINYFD_NOLIB\n        if ( (!tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent()) )\n          && (!getenv(\"SSH_CLIENT\") || getenv(\"DISPLAY\")) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"windows\");return (char const *)1;}\n                if (tinyfd_winUtf8)\n                {\n                        return colorChooserWinGui8(\n                                aTitle, aDefaultHexRGB, aDefaultRGB, aoResultRGB);\n                }\n                else\n                {\n                        return colorChooserWinGuiA(\n                                aTitle, aDefaultHexRGB, aDefaultRGB, aoResultRGB);\n                }\n        }\n        else\n#endif /* TINYFD_NOLIB */\n        if ( aDefaultHexRGB )\n        {\n                lpDefaultHexRGB = (char *) aDefaultHexRGB ;\n        }\n        else\n        {\n                RGB2Hex( aDefaultRGB , lDefaultHexRGB ) ;\n                lpDefaultHexRGB = (char *) lDefaultHexRGB ;\n        }\n        p = tinyfd_inputBox(aTitle,\n                        \"Enter hex rgb color (i.e. #f5ca20)\",lpDefaultHexRGB);\n        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")) return p;\n\n        if ( !p || (strlen(p) != 7) || (p[0] != '#') )\n        {\n                return NULL ;\n        }\n        for ( i = 1 ; i < 7 ; i ++ )\n        {\n                if ( ! isxdigit( p[i] ) )\n                {\n                        return NULL ;\n                }\n        }\n        Hex2RGB(p,aoResultRGB);\n        return p ;\n}\n\n\n#else /* unix */\n\nstatic char gPython2Name[16];\nstatic char gPython3Name[16];\nstatic char gPythonName[16];\n\nstatic int isDarwin(void)\n{\n        static int lsIsDarwin = -1 ;\n        struct utsname lUtsname ;\n        if ( lsIsDarwin < 0 )\n        {\n                lsIsDarwin = !uname(&lUtsname) && !strcmp(lUtsname.sysname,\"Darwin\") ;\n        }\n        return lsIsDarwin ;\n}\n\n\nstatic int dirExists( char const * const aDirPath )\n{\n        DIR * lDir ;\n        if ( ! aDirPath || ! strlen( aDirPath ) )\n                return 0 ;\n        lDir = opendir( aDirPath ) ;\n        if ( ! lDir )\n        {\n                return 0 ;\n        }\n        closedir( lDir ) ;\n        return 1 ;\n}\n\n\nstatic int detectPresence( char const * const aExecutable )\n{\n        char lBuff [MAX_PATH_OR_CMD] ;\n        char lTestedString [MAX_PATH_OR_CMD] = \"which \" ;\n        FILE * lIn ;\n\n    strcat( lTestedString , aExecutable ) ;\n        strcat( lTestedString, \" 2>/dev/null \");\n    lIn = popen( lTestedString , \"r\" ) ;\n    if ( ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n                && ( ! strchr( lBuff , ':' ) )\n                && ( strncmp(lBuff, \"no \", 3) ) )\n    {   /* present */\n        pclose( lIn ) ;\n        if (tinyfd_verbose) printf(\"detectPresence %s %d\\n\", aExecutable, 1);\n        return 1 ;\n    }\n    else\n    {\n        pclose( lIn ) ;\n        if (tinyfd_verbose) printf(\"detectPresence %s %d\\n\", aExecutable, 0);\n        return 0 ;\n    }\n}\n\n\nstatic char const * getVersion( char const * const aExecutable ) /*version must be first numeral*/\n{\n\tstatic char lBuff [MAX_PATH_OR_CMD] ;\n\tchar lTestedString [MAX_PATH_OR_CMD] ;\n\tFILE * lIn ;\n\tchar * lTmp ;\n\n    strcpy( lTestedString , aExecutable ) ;\n    strcat( lTestedString , \" --version\" ) ;\n\n    lIn = popen( lTestedString , \"r\" ) ;\n        lTmp = fgets( lBuff , sizeof( lBuff ) , lIn ) ;\n        pclose( lIn ) ;\n\n\tlTmp += strcspn(lTmp,\"0123456789\");\n\t/* printf(\"lTmp:%s\\n\", lTmp); */\n\treturn lTmp ;\n}\n\n\nstatic int * const getMajorMinorPatch( char const * const aExecutable )\n{\n\tstatic int lArray [3] ;\n\tchar * lTmp ;\n\n\tlTmp = (char *) getVersion(aExecutable);\n\tlArray[0] = atoi( strtok(lTmp,\" ,.-\") ) ;\n\t/* printf(\"lArray0 %d\\n\", lArray[0]); */\n\tlArray[1] = atoi( strtok(0,\" ,.-\") ) ;\n\t/* printf(\"lArray1 %d\\n\", lArray[1]); */\n\tlArray[2] = atoi( strtok(0,\" ,.-\") ) ;\n\t/* printf(\"lArray2 %d\\n\", lArray[2]); */\n\n\tif ( !lArray[0] && !lArray[1] && !lArray[2] ) return NULL;\n\treturn lArray ;\n}\n\n\nstatic int tryCommand( char const * const aCommand )\n{\n        char lBuff [MAX_PATH_OR_CMD] ;\n        FILE * lIn ;\n\n        lIn = popen( aCommand , \"r\" ) ;\n        if ( fgets( lBuff , sizeof( lBuff ) , lIn ) == NULL )\n        {       /* present */\n                pclose( lIn ) ;\n                return 1 ;\n        }\n        else\n        {\n                pclose( lIn ) ;\n                return 0 ;\n        }\n\n}\n\n\nstatic int isTerminalRunning(void)\n{\n\tstatic int lIsTerminalRunning = -1 ;\n\tif ( lIsTerminalRunning < 0 )\n\t{\n\t\tlIsTerminalRunning = isatty(1);\n\t\tif (tinyfd_verbose) printf(\"isTerminalRunning %d\\n\", lIsTerminalRunning );\n\t}\n\treturn lIsTerminalRunning;\n}\n\n\nstatic char const * dialogNameOnly(void)\n{\n\tstatic char lDialogName[128] = \"*\" ;\n\tif ( lDialogName[0] == '*' )\n\t{\n\t\tif ( isDarwin() && * strcpy(lDialogName , \"/opt/local/bin/dialog\" )\n\t\t\t&& detectPresence( lDialogName ) )\n\t\t{}\n\t\telse if ( * strcpy(lDialogName , \"dialog\" )\n\t\t\t&& detectPresence( lDialogName ) )\n\t\t{}\n\t\telse\n\t\t{\n\t\t\tstrcpy(lDialogName , \"\" );\n\t\t}\n\t}\n\treturn lDialogName ;\n}\n\n\nint isDialogVersionBetter09b(void)\n{\n        char const * lDialogName ;\n        char * lVersion ;\n        int lMajor ;\n        int lMinor ;\n        int lDate ;\n        int lResult ;\n        char * lMinorP ;\n        char * lLetter ;\n        char lBuff[128] ;\n\n        /*char lTest[128] = \" 0.9b-20031126\" ;*/\n\n        lDialogName = dialogNameOnly() ;\n        if ( ! strlen(lDialogName) || !(lVersion = (char *) getVersion(lDialogName)) ) return 0 ;\n        /*lVersion = lTest ;*/\n        /*printf(\"lVersion %s\\n\", lVersion);*/\n        strcpy(lBuff,lVersion);\n        lMajor = atoi( strtok(lVersion,\" ,.-\") ) ;\n        /*printf(\"lMajor %d\\n\", lMajor);*/\n        lMinorP = strtok(0,\" ,.-abcdefghijklmnopqrstuvxyz\");\n        lMinor = atoi( lMinorP ) ;\n        /*printf(\"lMinor %d\\n\", lMinor );*/\n        lDate = atoi( strtok(0,\" ,.-\") ) ;\n        if (lDate<0) lDate = - lDate;\n        /*printf(\"lDate %d\\n\", lDate);*/\n        lLetter = lMinorP + strlen(lMinorP) ;\n        strcpy(lVersion,lBuff);\n        strtok(lLetter,\" ,.-\");\n        /*printf(\"lLetter %s\\n\", lLetter);*/\n        lResult = (lMajor > 0) || ( ( lMinor == 9 ) && (*lLetter == 'b') && (lDate >= 20031126) );\n        /*printf(\"lResult %d\\n\", lResult);*/\n        return lResult;\n}\n\n\nstatic int whiptailPresentOnly(void)\n{\n        static int lWhiptailPresent = -1 ;\n        if ( lWhiptailPresent < 0 )\n        {\n                lWhiptailPresent = detectPresence( \"whiptail\" ) ;\n        }\n        return lWhiptailPresent ;\n}\n\n\nstatic char const * terminalName(void)\n{\n        static char lTerminalName[128] = \"*\" ;\n        char lShellName[64] = \"*\" ;\n        int * lArray;\n\n        if ( lTerminalName[0] == '*' )\n        {\n                if ( detectPresence( \"bash\" ) )\n                {\n                        strcpy(lShellName , \"bash -c \" ) ; /*good for basic input*/\n                }\n\t\t\t\telse if ( strlen(dialogNameOnly()) || whiptailPresentOnly() )\n\t\t\t\t{\n\t\t\t\t\t\tstrcpy(lShellName , \"sh -c \" ) ; /*good enough for dialog & whiptail*/\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstrcpy(lTerminalName , \"\" ) ;\n\t\t\t\t\treturn NULL ;\n\t\t\t\t}\n\n                if ( isDarwin() )\n                {\n\t\t\t\t\tif ( * strcpy(lTerminalName , \"/opt/X11/bin/xterm\" )\n                      && detectPresence( lTerminalName ) )\n                        {\n                                strcat(lTerminalName , \" -fa 'DejaVu Sans Mono' -fs 10 -title tinyfiledialogs -e \" ) ;\n                                strcat(lTerminalName , lShellName ) ;\n                        }\n                        else\n                        {\n                                strcpy(lTerminalName , \"\" ) ;\n                        }\n                }\n                else if ( * strcpy(lTerminalName,\"xterm\") /*good (small without parameters)*/\n                        && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -fa 'DejaVu Sans Mono' -fs 10 -title tinyfiledialogs -e \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"terminator\") /*good*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -x \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"lxterminal\") /*good*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -e \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"konsole\") /*good*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -e \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"kterm\") /*good*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -e \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"tilix\") /*good*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -e \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"xfce4-terminal\") /*good*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -x \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"mate-terminal\") /*good*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -x \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"Eterm\") /*good*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -e \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"evilvte\") /*good*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -e \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else if ( * strcpy(lTerminalName,\"pterm\") /*good (only letters)*/\n                          && detectPresence(lTerminalName) )\n                {\n                        strcat(lTerminalName , \" -e \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n\t\t\t\telse if ( * strcpy(lTerminalName,\"gnome-terminal\")\n                && detectPresence(lTerminalName) && (lArray = getMajorMinorPatch(lTerminalName))\n\t\t\t\t&& ((lArray[0]<3) || (lArray[0]==3 && lArray[1]<=6)) )\n                {\n                        strcat(lTerminalName , \" --disable-factory -x \" ) ;\n                        strcat(lTerminalName , lShellName ) ;\n                }\n                else\n                {\n                        strcpy(lTerminalName , \"\" ) ;\n                }\n                /* bad: koi rxterm guake tilda vala-terminal qterminal\n                aterm Terminal terminology sakura lilyterm weston-terminal\n                roxterm termit xvt rxvt mrxvt urxvt */\n        }\n        if ( strlen(lTerminalName) )\n        {\n                return lTerminalName ;\n        }\n        else\n        {\n                return NULL ;\n        }\n}\n\n\nstatic char const * dialogName(void)\n{\n    char const * lDialogName ;\n    lDialogName = dialogNameOnly( ) ;\n        if ( strlen(lDialogName) && ( isTerminalRunning() || terminalName() ) )\n        {\n                return lDialogName ;\n        }\n        else\n        {\n                return NULL ;\n        }\n}\n\n\nstatic int whiptailPresent(void)\n{\n        int lWhiptailPresent ;\n    lWhiptailPresent = whiptailPresentOnly( ) ;\n        if ( lWhiptailPresent && ( isTerminalRunning() || terminalName() ) )\n        {\n                return lWhiptailPresent ;\n        }\n        else\n        {\n                return 0 ;\n        }\n}\n\n\n\nstatic int graphicMode(void)\n{\n        return !( tinyfd_forceConsole && (isTerminalRunning() || terminalName()) )\n          && ( getenv(\"DISPLAY\")\n            || (isDarwin() && (!getenv(\"SSH_TTY\") || getenv(\"DISPLAY\") ) ) ) ;\n}\n\n\nstatic int pactlPresent(void)\n{\n        static int lPactlPresent = -1 ;\n        if ( lPactlPresent < 0 )\n        {\n                lPactlPresent = detectPresence(\"pactl\") ;\n        }\n        return lPactlPresent ;\n}\n\n\nstatic int speakertestPresent(void)\n{\n        static int lSpeakertestPresent = -1 ;\n        if ( lSpeakertestPresent < 0 )\n        {\n                lSpeakertestPresent = detectPresence(\"speaker-test\") ;\n        }\n        return lSpeakertestPresent ;\n}\n\n\nstatic int beepexePresent(void)\n{\n        static int lBeepexePresent = -1 ;\n        if ( lBeepexePresent < 0 )\n        {\n                lBeepexePresent = detectPresence(\"beep.exe\") ;\n        }\n        return lBeepexePresent ;\n}\n\n\nstatic int xmessagePresent(void)\n{\n        static int lXmessagePresent = -1 ;\n        if ( lXmessagePresent < 0 )\n        {\n                lXmessagePresent = detectPresence(\"xmessage\");/*if not tty,not on osxpath*/\n        }\n        return lXmessagePresent && graphicMode( ) ;\n}\n\n\nstatic int gxmessagePresent(void)\n{\n    static int lGxmessagePresent = -1 ;\n    if ( lGxmessagePresent < 0 )\n    {\n        lGxmessagePresent = detectPresence(\"gxmessage\") ;\n    }\n    return lGxmessagePresent && graphicMode( ) ;\n}\n\n\nstatic int gmessagePresent(void)\n{\n        static int lGmessagePresent = -1 ;\n        if ( lGmessagePresent < 0 )\n        {\n                lGmessagePresent = detectPresence(\"gmessage\") ;\n        }\n        return lGmessagePresent && graphicMode( ) ;\n}\n\n\nstatic int notifysendPresent(void)\n{\n    static int lNotifysendPresent = -1 ;\n    if ( lNotifysendPresent < 0 )\n    {\n        lNotifysendPresent = detectPresence(\"notify-send\") ;\n    }\n    return lNotifysendPresent && graphicMode( ) ;\n}\n\n\nstatic int perlPresent(void)\n{\n        static int lPerlPresent = -1 ;\n        char lBuff [MAX_PATH_OR_CMD] ;\n        FILE * lIn ;\n\n        if ( lPerlPresent < 0 )\n        {\n                lPerlPresent = detectPresence(\"perl\") ;\n                if ( lPerlPresent )\n                {\n                        lIn = popen( \"perl -MNet::DBus -e \\\"Net::DBus->session->get_service('org.freedesktop.Notifications')\\\" 2>&1\" , \"r\" ) ;\n                        if ( fgets( lBuff , sizeof( lBuff ) , lIn ) == NULL )\n                        {\n                                lPerlPresent = 2 ;\n                        }\n                        pclose( lIn ) ;\n                        if (tinyfd_verbose) printf(\"perl-dbus %d\\n\", lPerlPresent);\n                }\n    }\n    return graphicMode() ? lPerlPresent : 0 ;\n}\n\n\nstatic int afplayPresent(void)\n{\n        static int lAfplayPresent = -1 ;\n        char lBuff [MAX_PATH_OR_CMD] ;\n        FILE * lIn ;\n\n        if ( lAfplayPresent < 0 )\n        {\n                lAfplayPresent = detectPresence(\"afplay\") ;\n                if ( lAfplayPresent )\n                {\n                        lIn = popen( \"test -e /System/Library/Sounds/Ping.aiff || echo Ping\" , \"r\" ) ;\n                        if ( fgets( lBuff , sizeof( lBuff ) , lIn ) == NULL )\n                        {\n                                lAfplayPresent = 2 ;\n                        }\n                        pclose( lIn ) ;\n                        if (tinyfd_verbose) printf(\"afplay %d\\n\", lAfplayPresent);\n                }\n        }\n        return graphicMode() ? lAfplayPresent : 0 ;\n}\n\n\nstatic int xdialogPresent(void)\n{\n    static int lXdialogPresent = -1 ;\n    if ( lXdialogPresent < 0 )\n    {\n        lXdialogPresent = detectPresence(\"Xdialog\") ;\n    }\n    return lXdialogPresent && graphicMode( ) ;\n}\n\n\nstatic int gdialogPresent(void)\n{\n    static int lGdialoglPresent = -1 ;\n    if ( lGdialoglPresent < 0 )\n    {\n        lGdialoglPresent = detectPresence( \"gdialog\" ) ;\n    }\n    return lGdialoglPresent && graphicMode( ) ;\n}\n\n\nstatic int osascriptPresent(void)\n{\n    static int lOsascriptPresent = -1 ;\n    if ( lOsascriptPresent < 0 )\n    {\n                gWarningDisplayed |= !!getenv(\"SSH_TTY\");\n                lOsascriptPresent = detectPresence( \"osascript\" ) ;\n    }\n        return lOsascriptPresent && graphicMode() && !getenv(\"SSH_TTY\") ;\n}\n\n\nstatic int qarmaPresent(void)\n{\n        static int lQarmaPresent = -1 ;\n        if ( lQarmaPresent < 0 )\n        {\n                lQarmaPresent = detectPresence(\"qarma\") ;\n        }\n        return lQarmaPresent && graphicMode( ) ;\n}\n\n\nstatic int matedialogPresent(void)\n{\n        static int lMatedialogPresent = -1 ;\n        if ( lMatedialogPresent < 0 )\n        {\n                lMatedialogPresent = detectPresence(\"matedialog\") ;\n        }\n        return lMatedialogPresent && graphicMode( ) ;\n}\n\n\nstatic int shellementaryPresent(void)\n{\n        static int lShellementaryPresent = -1 ;\n        if ( lShellementaryPresent < 0 )\n        {\n                lShellementaryPresent = 0 ; /*detectPresence(\"shellementary\"); shellementary is not ready yet */\n        }\n        return lShellementaryPresent && graphicMode( ) ;\n}\n\n\nstatic int zenityPresent(void)\n{\n        static int lZenityPresent = -1 ;\n        if ( lZenityPresent < 0 )\n        {\n                lZenityPresent = detectPresence(\"zenity\") ;\n        }\n        return lZenityPresent && graphicMode( ) ;\n}\n\n\nstatic int zenity3Present(void)\n{\n        static int lZenity3Present = -1 ;\n        char lBuff [MAX_PATH_OR_CMD] ;\n        FILE * lIn ;\n\t\tint lIntTmp ;\n\n        if ( lZenity3Present < 0 )\n        {\n                lZenity3Present = 0 ;\n                if ( zenityPresent() )\n                {\n                        lIn = popen( \"zenity --version\" , \"r\" ) ;\n                        if ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n                        {\n                                if ( atoi(lBuff) >= 3 )\n                                {\n                                        lZenity3Present = 3 ;\n\t\t\t\t\t\t\t\t\t\tlIntTmp = atoi(strtok(lBuff,\".\")+2 ) ;\n\t\t\t\t\t\t\t\t\t\tif ( lIntTmp >= 18 )\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tlZenity3Present = 5 ;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if ( lIntTmp >= 10 )\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tlZenity3Present = 4 ;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n                                else if ( ( atoi(lBuff) == 2 ) && ( atoi(strtok(lBuff,\".\")+2 ) >= 32 ) )\n                                {\n                                        lZenity3Present = 2 ;\n                                }\n                                if (tinyfd_verbose) printf(\"zenity %d\\n\", lZenity3Present);\n                        }\n                        pclose( lIn ) ;\n                }\n        }\n        return graphicMode() ? lZenity3Present : 0 ;\n}\n\n\nstatic int kdialogPresent(void)\n{\n\tstatic int lKdialogPresent = -1 ;\n\tchar lBuff [MAX_PATH_OR_CMD] ;\n\tFILE * lIn ;\n\tchar * lDesktop;\n\n\tif ( lKdialogPresent < 0 )\n\t{\n\t\tif ( zenityPresent() )\n\t\t{\n\t\t\tlDesktop = getenv(\"XDG_SESSION_DESKTOP\");\n\t\t\tif ( !lDesktop  || ( strcmp(lDesktop, \"KDE\") && strcmp(lDesktop, \"lxqt\") ) )\n\t\t\t{\n\t\t\t\tlKdialogPresent = 0 ;\n\t\t\t\treturn lKdialogPresent ;\n\t\t\t}\n\t\t}\n\n\t\tlKdialogPresent = detectPresence(\"kdialog\") ;\n\t\tif ( lKdialogPresent && !getenv(\"SSH_TTY\") )\n\t\t{\n\t\t\tlIn = popen( \"kdialog --attach 2>&1\" , \"r\" ) ;\n\t\t\tif ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n\t\t\t{\n\t\t\t\tif ( ! strstr( \"Unknown\" , lBuff ) )\n\t\t\t\t{\n\t\t\t\t\tlKdialogPresent = 2 ;\n\t\t\t\t\tif (tinyfd_verbose) printf(\"kdialog-attach %d\\n\", lKdialogPresent);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpclose( lIn ) ;\n\n\t\t\tif (lKdialogPresent == 2)\n\t\t\t{\n\t\t\t\tlKdialogPresent = 1 ;\n\t\t\t\tlIn = popen( \"kdialog --passivepopup 2>&1\" , \"r\" ) ;\n\t\t\t\tif ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n\t\t\t\t{\n\t\t\t\t\tif ( ! strstr( \"Unknown\" , lBuff ) )\n\t\t\t\t\t{\n\t\t\t\t\t\tlKdialogPresent = 2 ;\n\t\t\t\t\t\tif (tinyfd_verbose) printf(\"kdialog-popup %d\\n\", lKdialogPresent);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpclose( lIn ) ;\n\t\t\t}\n\t\t}\n\t}\n\treturn graphicMode() ? lKdialogPresent : 0 ;\n}\n\n\nstatic int osx9orBetter(void)\n{\n        static int lOsx9orBetter = -1 ;\n        char lBuff [MAX_PATH_OR_CMD] ;\n        FILE * lIn ;\n        int V,v;\n\n        if ( lOsx9orBetter < 0 )\n        {\n                lOsx9orBetter = 0 ;\n                lIn = popen( \"osascript -e 'set osver to system version of (system info)'\" , \"r\" ) ;\n                if ( ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n                        && ( 2 == sscanf(lBuff, \"%d.%d\", &V, &v) ) )\n                {\n                        V = V * 100 + v;\n                        if ( V >= 1009 )\n                        {\n                                lOsx9orBetter = 1 ;\n                        }\n                }\n                pclose( lIn ) ;\n                if (tinyfd_verbose) printf(\"Osx10 = %d, %d = %s\\n\", lOsx9orBetter, V, lBuff) ;\n        }\n        return lOsx9orBetter ;\n}\n\n\nstatic int python2Present(void)\n{\n    static int lPython2Present = -1 ;\n        int i;\n\n        if ( lPython2Present < 0 )\n        {\n                lPython2Present = 0 ;\n                strcpy(gPython2Name , \"python2\" ) ;\n                if ( detectPresence(gPython2Name) ) lPython2Present = 1;\n                else\n                {\n                        for ( i = 9 ; i >= 0 ; i -- )\n                        {\n                                sprintf( gPython2Name , \"python2.%d\" , i ) ;\n                                if ( detectPresence(gPython2Name) )\n                                {\n                                        lPython2Present = 1;\n                                        break;\n                                }\n                        }\n                        /*if ( ! lPython2Present )\n                        {\n                                strcpy(gPython2Name , \"python\" ) ;\n                                if ( detectPresence(gPython2Name) ) lPython2Present = 1;\n                        }*/\n                }\n                if (tinyfd_verbose) printf(\"lPython2Present %d\\n\", lPython2Present) ;\n                if (tinyfd_verbose) printf(\"gPython2Name %s\\n\", gPython2Name) ;\n        }\n        return lPython2Present ;\n}\n\n\nstatic int python3Present(void)\n{\n        static int lPython3Present = -1 ;\n        int i;\n\n        if ( lPython3Present < 0 )\n        {\n                lPython3Present = 0 ;\n                strcpy(gPython3Name , \"python3\" ) ;\n                if ( detectPresence(gPython3Name) ) lPython3Present = 1;\n                else\n                {\n                        for ( i = 9 ; i >= 0 ; i -- )\n                        {\n                                sprintf( gPython3Name , \"python3.%d\" , i ) ;\n                                if ( detectPresence(gPython3Name) )\n                                {\n                                        lPython3Present = 1;\n                                        break;\n                                }\n                        }\n                        /*if ( ! lPython3Present )\n                        {\n                                strcpy(gPython3Name , \"python\" ) ;\n                                if ( detectPresence(gPython3Name) ) lPython3Present = 1;\n                        }*/\n                }\n                if (tinyfd_verbose) printf(\"lPython3Present %d\\n\", lPython3Present) ;\n                if (tinyfd_verbose) printf(\"gPython3Name %s\\n\", gPython3Name) ;\n        }\n        return lPython3Present ;\n}\n\n\nstatic int tkinter2Present(void)\n{\n    static int lTkinter2Present = -1 ;\n        char lPythonCommand[256];\n        char lPythonParams[128] =\n\"-S -c \\\"try:\\n\\timport Tkinter;\\nexcept:\\n\\tprint 0;\\\"\";\n\n\n        if ( lTkinter2Present < 0 )\n        {\n                lTkinter2Present = 0 ;\n                if ( python2Present() )\n        {\n                    sprintf( lPythonCommand , \"%s %s\" , gPython2Name , lPythonParams ) ;\n                    lTkinter2Present = tryCommand(lPythonCommand) ;\n                }\n                if (tinyfd_verbose) printf(\"lTkinter2Present %d\\n\", lTkinter2Present) ;\n        }\n        return lTkinter2Present && graphicMode() && !(isDarwin() && getenv(\"SSH_TTY\") );\n}\n\n\nstatic int tkinter3Present(void)\n{\n        static int lTkinter3Present = -1 ;\n        char lPythonCommand[256];\n        char lPythonParams[128] =\n                \"-S -c \\\"try:\\n\\timport tkinter;\\nexcept:\\n\\tprint(0);\\\"\";\n\n        if ( lTkinter3Present < 0 )\n        {\n                lTkinter3Present = 0 ;\n                if ( python3Present() )\n                {\n                        sprintf( lPythonCommand , \"%s %s\" , gPython3Name , lPythonParams ) ;\n                        lTkinter3Present = tryCommand(lPythonCommand) ;\n                }\n                if (tinyfd_verbose) printf(\"lTkinter3Present %d\\n\", lTkinter3Present) ;\n        }\n        return lTkinter3Present && graphicMode() && !(isDarwin() && getenv(\"SSH_TTY\") );\n}\n\n\nstatic int pythonDbusPresent(void)\n{\n    static int lDbusPresent = -1 ;\n        char lPythonCommand[384];\n        char lPythonParams[256] =\n\"-c \\\"try:\\n\\timport dbus;bus=dbus.SessionBus();\\\nnotif=bus.get_object('org.freedesktop.Notifications','/org/freedesktop/Notifications');\\\nnotify=dbus.Interface(notif,'org.freedesktop.Notifications');\\nexcept:\\n\\tprint(0);\\\"\";\n\n        if ( lDbusPresent < 0 )\n        {\n                lDbusPresent = 0 ;\n                if ( python2Present() )\n                {\n                        strcpy(gPythonName , gPython2Name ) ;\n                        sprintf( lPythonCommand , \"%s %s\" , gPythonName , lPythonParams ) ;\n                        lDbusPresent = tryCommand(lPythonCommand) ;\n                }\n\n                if ( ! lDbusPresent && python3Present() )\n                {\n                        strcpy(gPythonName , gPython3Name ) ;\n                        sprintf( lPythonCommand , \"%s %s\" , gPythonName , lPythonParams ) ;\n                        lDbusPresent = tryCommand(lPythonCommand) ;\n                }\n\n                if (tinyfd_verbose) printf(\"lDbusPresent %d\\n\", lDbusPresent) ;\n                if (tinyfd_verbose) printf(\"gPythonName %s\\n\", gPythonName) ;\n        }\n        return lDbusPresent && graphicMode() && !(isDarwin() && getenv(\"SSH_TTY\") );\n}\n\n\nstatic void sigHandler(int sig)\n{\n        FILE * lIn ;\n        if ( ( lIn = popen( \"pactl unload-module module-sine\" , \"r\" ) ) )\n        {\n                pclose( lIn ) ;\n        }\n}\n\nvoid tinyfd_beep(void)\n{\n        char lDialogString [256] ;\n        FILE * lIn ;\n\n        if ( osascriptPresent() )\n        {\n                if ( afplayPresent() >= 2 )\n                {\n                        strcpy( lDialogString , \"afplay /System/Library/Sounds/Ping.aiff\") ;\n                }\n                else\n                {\n                        strcpy( lDialogString , \"osascript -e 'tell application \\\"System Events\\\" to beep'\") ;\n                }\n        }\n        else if ( pactlPresent() )\n        {\n                signal(SIGINT, sigHandler);\n                /*strcpy( lDialogString , \"pactl load-module module-sine frequency=440;sleep .3;pactl unload-module module-sine\" ) ;*/\n                strcpy( lDialogString , \"thnum=$(pactl load-module module-sine frequency=440);sleep .3;pactl unload-module $thnum\" ) ;\n        }\n        else if ( speakertestPresent() )\n        {\n                /*strcpy( lDialogString , \"timeout -k .3 .3 speaker-test --frequency 440 --test sine > /dev/tty\" ) ;*/\n                strcpy( lDialogString , \"( speaker-test -t sine -f 440 > /dev/tty )& pid=$!;sleep .3; kill -9 $pid\" ) ;\n        }\n        else if ( beepexePresent() )\n        {\n                strcpy( lDialogString , \"beep.exe 440 300\" ) ;\n        }\n        else\n        {\n                strcpy( lDialogString , \"printf '\\a' > /dev/tty\" ) ;\n        }\n\n        if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;\n\n        if ( ( lIn = popen( lDialogString , \"r\" ) ) )\n        {\n                pclose( lIn ) ;\n        }\n\n        if ( pactlPresent() )\n        {\n                signal(SIGINT, SIG_DFL);\n        }\n}\n\n\nint tinyfd_messageBox(\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aMessage , /* NULL or \"\"  may contain \\n and \\t */\n        char const * const aDialogType , /* \"ok\" \"okcancel\" \"yesno\" \"yesnocancel\" */\n        char const * const aIconType , /* \"info\" \"warning\" \"error\" \"question\" */\n        int const aDefaultButton ) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */\n{\n        char lBuff [MAX_PATH_OR_CMD] ;\n        char * lDialogString = NULL ;\n        char * lpDialogString;\n        FILE * lIn ;\n        int lWasGraphicDialog = 0 ;\n        int lWasXterm = 0 ;\n        int lResult ;\n        char lChar ;\n        struct termios infoOri;\n        struct termios info;\n        size_t lTitleLen ;\n        size_t lMessageLen ;\n\n        lBuff[0]='\\0';\n\n        lTitleLen =  aTitle ? strlen(aTitle) : 0 ;\n        lMessageLen =  aMessage ? strlen(aMessage) : 0 ;\n        if ( !aTitle || strcmp(aTitle,\"tinyfd_query\") )\n        {\n                lDialogString = (char *) malloc( MAX_PATH_OR_CMD + lTitleLen + lMessageLen );\n        }\n\n        if ( osascriptPresent( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"applescript\");return 1;}\n\n                strcpy( lDialogString , \"osascript \");\n                if ( ! osx9orBetter() ) strcat( lDialogString , \" -e 'tell application \\\"System Events\\\"' -e 'Activate'\");\n                strcat( lDialogString , \" -e 'try' -e 'set {vButton} to {button returned} of ( display dialog \\\"\") ;\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, aMessage) ;\n                }\n                strcat(lDialogString, \"\\\" \") ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"with title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n                strcat(lDialogString, \"with icon \") ;\n                if ( aIconType && ! strcmp( \"error\" , aIconType ) )\n                {\n                        strcat(lDialogString, \"stop \" ) ;\n                }\n                else if ( aIconType && ! strcmp( \"warning\" , aIconType ) )\n                {\n                        strcat(lDialogString, \"caution \" ) ;\n                }\n                else /* question or info */\n                {\n                        strcat(lDialogString, \"note \" ) ;\n                }\n                if ( aDialogType && ! strcmp( \"okcancel\" , aDialogType ) )\n                {\n                        if ( ! aDefaultButton )\n                        {\n                                strcat( lDialogString ,\"default button \\\"Cancel\\\" \" ) ;\n                        }\n                }\n                else if ( aDialogType && ! strcmp( \"yesno\" , aDialogType ) )\n                {\n                        strcat( lDialogString ,\"buttons {\\\"No\\\", \\\"Yes\\\"} \" ) ;\n                        if (aDefaultButton)\n                        {\n                                strcat( lDialogString ,\"default button \\\"Yes\\\" \" ) ;\n                        }\n                        else\n                        {\n                                strcat( lDialogString ,\"default button \\\"No\\\" \" ) ;\n                        }\n                        strcat( lDialogString ,\"cancel button \\\"No\\\"\" ) ;\n                }\n                else if ( aDialogType && ! strcmp( \"yesnocancel\" , aDialogType ) )\n                {\n                        strcat( lDialogString ,\"buttons {\\\"No\\\", \\\"Yes\\\", \\\"Cancel\\\"} \" ) ;\n                        switch (aDefaultButton)\n                        {\n                                case 1: strcat( lDialogString ,\"default button \\\"Yes\\\" \" ) ; break;\n                                case 2: strcat( lDialogString ,\"default button \\\"No\\\" \" ) ; break;\n                                case 0: strcat( lDialogString ,\"default button \\\"Cancel\\\" \" ) ; break;\n                        }\n                        strcat( lDialogString ,\"cancel button \\\"Cancel\\\"\" ) ;\n                }\n                else\n                {\n                        strcat( lDialogString ,\"buttons {\\\"OK\\\"} \" ) ;\n                        strcat( lDialogString ,\"default button \\\"OK\\\" \" ) ;\n                }\n                strcat( lDialogString, \")' \") ;\n\n                strcat( lDialogString,\n\"-e 'if vButton is \\\"Yes\\\" then' -e 'return 1'\\\n -e 'else if vButton is \\\"OK\\\" then' -e 'return 1'\\\n -e 'else if vButton is \\\"No\\\" then' -e 'return 2'\\\n -e 'else' -e 'return 0' -e 'end if' \" );\n\n                strcat( lDialogString, \"-e 'on error number -128' \" ) ;\n                strcat( lDialogString, \"-e '0' \" );\n\n                strcat( lDialogString, \"-e 'end try'\") ;\n                if ( ! osx9orBetter() ) strcat( lDialogString, \" -e 'end tell'\") ;\n        }\n        else if ( kdialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"kdialog\");return 1;}\n\n                strcpy( lDialogString , \"kdialog\" ) ;\n                if ( kdialogPresent() == 2 )\n                {\n                        strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                }\n\n                strcat( lDialogString , \" --\" ) ;\n                if ( aDialogType && ( ! strcmp( \"okcancel\" , aDialogType )\n                        || ! strcmp( \"yesno\" , aDialogType ) || ! strcmp( \"yesnocancel\" , aDialogType ) ) )\n                {\n                        if ( aIconType && ( ! strcmp( \"warning\" , aIconType )\n                                || ! strcmp( \"error\" , aIconType ) ) )\n                        {\n                                strcat( lDialogString , \"warning\" ) ;\n                        }\n                        if ( ! strcmp( \"yesnocancel\" , aDialogType ) )\n                        {\n                                strcat( lDialogString , \"yesnocancel\" ) ;\n                        }\n                        else\n                        {\n                                strcat( lDialogString , \"yesno\" ) ;\n                        }\n                }\n                else if ( aIconType && ! strcmp( \"error\" , aIconType ) )\n                {\n                        strcat( lDialogString , \"error\" ) ;\n                }\n                else if ( aIconType && ! strcmp( \"warning\" , aIconType ) )\n                {\n                        strcat( lDialogString , \"sorry\" ) ;\n                }\n                else\n                {\n                        strcat( lDialogString , \"msgbox\" ) ;\n                }\n                strcat( lDialogString , \" \\\"\" ) ;\n                if ( aMessage )\n                {\n                        strcat( lDialogString , aMessage ) ;\n                }\n                strcat( lDialogString , \"\\\"\" ) ;\n                if ( aDialogType && ! strcmp( \"okcancel\" , aDialogType ) )\n                {\n                        strcat( lDialogString ,\n                                \" --yes-label Ok --no-label Cancel\" ) ;\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n\n                if ( ! strcmp( \"yesnocancel\" , aDialogType ) )\n                {\n                        strcat( lDialogString , \"; x=$? ;if [ $x = 0 ] ;then echo 1;elif [ $x = 1 ] ;then echo 2;else echo 0;fi\");\n                }\n                else\n                {\n                        strcat( lDialogString , \";if [ $? = 0 ];then echo 1;else echo 0;fi\");\n                }\n        }\n        else if ( zenityPresent() || matedialogPresent() || shellementaryPresent() || qarmaPresent() )\n        {\n                if ( zenityPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"zenity\");return 1;}\n                        strcpy( lDialogString , \"szAnswer=$(zenity\" ) ;\n                        if ( (zenity3Present() >= 4) && !getenv(\"SSH_TTY\") )\n                        {\n                                strcat(lDialogString, \" --attach=$(sleep .01;xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                else if ( matedialogPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"matedialog\");return 1;}\n                        strcpy( lDialogString , \"szAnswer=$(matedialog\" ) ;\n                }\n                else if ( shellementaryPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"shellementary\");return 1;}\n                        strcpy( lDialogString , \"szAnswer=$(shellementary\" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"qarma\");return 1;}\n                        strcpy( lDialogString , \"szAnswer=$(qarma\" ) ;\n                        if ( !getenv(\"SSH_TTY\") )\n                        {\n                                strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                strcat(lDialogString, \" --\");\n\n                if ( aDialogType && ! strcmp( \"okcancel\" , aDialogType ) )\n                {\n                                strcat( lDialogString ,\n                                                \"question --ok-label=Ok --cancel-label=Cancel\" ) ;\n                }\n                else if ( aDialogType && ! strcmp( \"yesno\" , aDialogType ) )\n                {\n                                strcat( lDialogString , \"question\" ) ;\n                }\n                else if ( aDialogType && ! strcmp( \"yesnocancel\" , aDialogType ) )\n                {\n                        strcat( lDialogString , \"list --column \\\"\\\" --hide-header \\\"Yes\\\" \\\"No\\\"\" ) ;\n                }\n                else if ( aIconType && ! strcmp( \"error\" , aIconType ) )\n                {\n                    strcat( lDialogString , \"error\" ) ;\n                }\n                else if ( aIconType && ! strcmp( \"warning\" , aIconType ) )\n                {\n                    strcat( lDialogString , \"warning\" ) ;\n                }\n                else\n                {\n                    strcat( lDialogString , \"info\" ) ;\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title=\\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, \" --no-wrap --text=\\\"\") ;\n                        strcat(lDialogString, aMessage) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if ( (zenity3Present() >= 3) || (!zenityPresent() && (shellementaryPresent() || qarmaPresent()) ) )\n                {\n                        strcat( lDialogString , \" --icon-name=dialog-\" ) ;\n                        if ( aIconType && (! strcmp( \"question\" , aIconType )\n                          || ! strcmp( \"error\" , aIconType )\n                          || ! strcmp( \"warning\" , aIconType ) ) )\n                        {\n                                strcat( lDialogString , aIconType ) ;\n                        }\n                        else\n                        {\n                                strcat( lDialogString , \"information\" ) ;\n                        }\n                }\n\n                if (tinyfd_silent) strcat( lDialogString , \" 2>/dev/null \");\n\n                if ( ! strcmp( \"yesnocancel\" , aDialogType ) )\n                {\n                        strcat( lDialogString ,\n\");if [ $? = 1 ];then echo 0;elif [ $szAnswer = \\\"No\\\" ];then echo 2;else echo 1;fi\");\n                }\n                else\n                {\n                        strcat( lDialogString , \");if [ $? = 0 ];then echo 1;else echo 0;fi\");\n                }\n        }\n        else if ( !gxmessagePresent() && !gmessagePresent() && !gdialogPresent() && !xdialogPresent() && tkinter2Present() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python2-tkinter\");return 1;}\n\n                strcpy( lDialogString , gPython2Name ) ;\n                if ( ! isTerminalRunning( ) && isDarwin( ) )\n                {\n                        strcat( lDialogString , \" -i\" ) ;  /* for osx without console */\n                }\n\n                strcat( lDialogString ,\n\" -S -c \\\"import Tkinter,tkMessageBox;root=Tkinter.Tk();root.withdraw();\");\n\n                if ( isDarwin( ) )\n                {\n                        strcat( lDialogString ,\n\"import os;os.system('''/usr/bin/osascript -e 'tell app \\\\\\\"Finder\\\\\\\" to set \\\nfrontmost of process \\\\\\\"Python\\\\\\\" to true' ''');\");\n                }\n\n                strcat( lDialogString ,\"res=tkMessageBox.\" ) ;\n                if ( aDialogType && ! strcmp( \"okcancel\" , aDialogType ) )\n                {\n                  strcat( lDialogString , \"askokcancel(\" ) ;\n                  if ( aDefaultButton )\n                        {\n                                strcat( lDialogString , \"default=tkMessageBox.OK,\" ) ;\n                        }\n                        else\n                        {\n                                strcat( lDialogString , \"default=tkMessageBox.CANCEL,\" ) ;\n                        }\n                }\n                else if ( aDialogType && ! strcmp( \"yesno\" , aDialogType ) )\n                {\n                        strcat( lDialogString , \"askyesno(\" ) ;\n                        if ( aDefaultButton )\n                        {\n                                strcat( lDialogString , \"default=tkMessageBox.YES,\" ) ;\n                        }\n                        else\n                        {\n                                strcat( lDialogString , \"default=tkMessageBox.NO,\" ) ;\n                        }\n                }\n                else if ( aDialogType && ! strcmp( \"yesnocancel\" , aDialogType ) )\n                {\n                        strcat( lDialogString , \"askyesnocancel(\" ) ;\n                        switch ( aDefaultButton )\n                        {\n                                case 1: strcat( lDialogString , \"default=tkMessageBox.YES,\" ); break;\n                                case 2: strcat( lDialogString , \"default=tkMessageBox.NO,\" ); break;\n                                case 0: strcat( lDialogString , \"default=tkMessageBox.CANCEL,\" ); break;\n                        }\n                }\n                else\n                {\n                                strcat( lDialogString , \"showinfo(\" ) ;\n                }\n\n                strcat( lDialogString , \"icon='\" ) ;\n                if ( aIconType && (! strcmp( \"question\" , aIconType )\n                  || ! strcmp( \"error\" , aIconType )\n                  || ! strcmp( \"warning\" , aIconType ) ) )\n                {\n                                strcat( lDialogString , aIconType ) ;\n                }\n                else\n                {\n                                strcat( lDialogString , \"info\" ) ;\n                }\n\n                strcat(lDialogString, \"',\") ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                                strcat(lDialogString, \"title='\") ;\n                                strcat(lDialogString, aTitle) ;\n                                strcat(lDialogString, \"',\") ;\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, \"message='\") ;\n                        lpDialogString = lDialogString + strlen(lDialogString);\n                        replaceSubStr( aMessage , \"\\n\" , \"\\\\n\" , lpDialogString ) ;\n                        strcat(lDialogString, \"'\") ;\n                }\n\n                if ( aDialogType && ! strcmp( \"yesnocancel\" , aDialogType ) )\n                {\n                        strcat(lDialogString, \");\\n\\\nif res is None :\\n\\tprint 0\\n\\\nelif res is False :\\n\\tprint 2\\n\\\nelse :\\n\\tprint 1\\n\\\"\" ) ;\n                }\n                else\n                {\n                        strcat(lDialogString, \");\\n\\\nif res is False :\\n\\tprint 0\\n\\\nelse :\\n\\tprint 1\\n\\\"\" ) ;\n                }\n    }\n        else if ( !gxmessagePresent() && !gmessagePresent() && !gdialogPresent() && !xdialogPresent() && tkinter3Present() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python3-tkinter\");return 1;}\n\n                strcpy( lDialogString , gPython3Name ) ;\n                strcat( lDialogString ,\n                        \" -S -c \\\"import tkinter;from tkinter import messagebox;root=tkinter.Tk();root.withdraw();\");\n\n                strcat( lDialogString ,\"res=messagebox.\" ) ;\n                if ( aDialogType && ! strcmp( \"okcancel\" , aDialogType ) )\n                {\n                        strcat( lDialogString , \"askokcancel(\" ) ;\n                        if ( aDefaultButton )\n                        {\n                                strcat( lDialogString , \"default=messagebox.OK,\" ) ;\n                        }\n                        else\n                        {\n                                strcat( lDialogString , \"default=messagebox.CANCEL,\" ) ;\n                        }\n                }\n                else if ( aDialogType && ! strcmp( \"yesno\" , aDialogType ) )\n                {\n                        strcat( lDialogString , \"askyesno(\" ) ;\n                        if ( aDefaultButton )\n                        {\n                                strcat( lDialogString , \"default=messagebox.YES,\" ) ;\n                        }\n                        else\n                        {\n                                strcat( lDialogString , \"default=messagebox.NO,\" ) ;\n                        }\n                }\n                else if ( aDialogType && ! strcmp( \"yesnocancel\" , aDialogType ) )\n                {\n                        strcat( lDialogString , \"askyesnocancel(\" ) ;\n                        switch ( aDefaultButton )\n                        {\n                        case 1: strcat( lDialogString , \"default=messagebox.YES,\" ); break;\n                        case 2: strcat( lDialogString , \"default=messagebox.NO,\" ); break;\n                        case 0: strcat( lDialogString , \"default=messagebox.CANCEL,\" ); break;\n                        }\n                }\n                else\n                {\n                        strcat( lDialogString , \"showinfo(\" ) ;\n                }\n\n                strcat( lDialogString , \"icon='\" ) ;\n                if ( aIconType && (! strcmp( \"question\" , aIconType )\n                        || ! strcmp( \"error\" , aIconType )\n                        || ! strcmp( \"warning\" , aIconType ) ) )\n                {\n                        strcat( lDialogString , aIconType ) ;\n                }\n                else\n                {\n                        strcat( lDialogString , \"info\" ) ;\n                }\n\n                strcat(lDialogString, \"',\") ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"',\") ;\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, \"message='\") ;\n                        lpDialogString = lDialogString + strlen(lDialogString);\n                        replaceSubStr( aMessage , \"\\n\" , \"\\\\n\" , lpDialogString ) ;\n                        strcat(lDialogString, \"'\") ;\n                }\n\n                if ( aDialogType && ! strcmp( \"yesnocancel\" , aDialogType ) )\n                {\n                        strcat(lDialogString, \");\\n\\\nif res is None :\\n\\tprint(0)\\n\\\nelif res is False :\\n\\tprint(2)\\n\\\nelse :\\n\\tprint 1\\n\\\"\" ) ;\n                }\n                else\n                {\n                        strcat(lDialogString, \");\\n\\\nif res is False :\\n\\tprint(0)\\n\\\nelse :\\n\\tprint(1)\\n\\\"\" ) ;\n                }\n        }\n        else if ( gxmessagePresent() || gmessagePresent() || (!gdialogPresent() && !xdialogPresent() && xmessagePresent()) )\n        {\n                if ( gxmessagePresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"gxmessage\");return 1;}\n                        strcpy( lDialogString , \"gxmessage\");\n                }\n                else if ( gmessagePresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"gmessage\");return 1;}\n                        strcpy( lDialogString , \"gmessage\");\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"xmessage\");return 1;}\n                        strcpy( lDialogString , \"xmessage\");\n                }\n\n                if ( aDialogType && ! strcmp(\"okcancel\" , aDialogType) )\n                {\n                        strcat( lDialogString , \" -buttons Ok:1,Cancel:0\");\n                        switch ( aDefaultButton )\n                        {\n                                case 1: strcat( lDialogString , \" -default Ok\"); break;\n                                case 0: strcat( lDialogString , \" -default Cancel\"); break;\n                        }\n                }\n                else if ( aDialogType && ! strcmp(\"yesno\" , aDialogType) )\n                {\n                        strcat( lDialogString , \" -buttons Yes:1,No:0\");\n                        switch ( aDefaultButton )\n                        {\n                                case 1: strcat( lDialogString , \" -default Yes\"); break;\n                                case 0: strcat( lDialogString , \" -default No\"); break;\n                        }\n                }\n                else if ( aDialogType && ! strcmp(\"yesnocancel\" , aDialogType) )\n                {\n                        strcat( lDialogString , \" -buttons Yes:1,No:2,Cancel:0\");\n                        switch ( aDefaultButton )\n                        {\n                                case 1: strcat( lDialogString , \" -default Yes\"); break;\n                                case 2: strcat( lDialogString , \" -default No\"); break;\n                                case 0: strcat( lDialogString , \" -default Cancel\"); break;\n                        }\n                }\n                else\n                {\n                        strcat( lDialogString , \" -buttons Ok:1\");\n                        strcat( lDialogString , \" -default Ok\");\n                }\n\n                strcat( lDialogString , \" -center \\\"\");\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat( lDialogString , aMessage ) ;\n                }\n                strcat(lDialogString, \"\\\"\" ) ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat( lDialogString , \" -title  \\\"\");\n                        strcat( lDialogString , aTitle ) ;\n                        strcat( lDialogString, \"\\\"\" ) ;\n                }\n                strcat( lDialogString , \" ; echo $? \");\n        }\n        else if ( xdialogPresent() || gdialogPresent() || dialogName() || whiptailPresent() )\n        {\n                if ( gdialogPresent( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"gdialog\");return 1;}\n                        lWasGraphicDialog = 1 ;\n                        strcpy( lDialogString , \"(gdialog \" ) ;\n                }\n                else if ( xdialogPresent( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"xdialog\");return 1;}\n                        lWasGraphicDialog = 1 ;\n                        strcpy( lDialogString , \"(Xdialog \" ) ;\n                }\n                else if ( dialogName( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return 0;}\n                        if ( isTerminalRunning( ) )\n                        {\n                                strcpy( lDialogString , \"(dialog \" ) ;\n                        }\n                        else\n                        {\n                                lWasXterm = 1 ;\n                                strcpy( lDialogString , terminalName() ) ;\n                                strcat( lDialogString , \"'(\" ) ;\n                                strcat( lDialogString , dialogName() ) ;\n                                strcat( lDialogString , \" \" ) ;\n                        }\n                }\n                else if ( isTerminalRunning( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"whiptail\");return 0;}\n                        strcpy( lDialogString , \"(whiptail \" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"whiptail\");return 0;}\n                        lWasXterm = 1 ;\n                        strcpy( lDialogString , terminalName() ) ;\n                        strcat( lDialogString , \"'(whiptail \" ) ;\n                }\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"--title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                if ( !xdialogPresent() && !gdialogPresent() )\n                {\n                        if ( aDialogType && ( !strcmp( \"okcancel\" , aDialogType ) || !strcmp( \"yesno\" , aDialogType )\n                                || !strcmp( \"yesnocancel\" , aDialogType ) ) )\n                        {\n                                strcat(lDialogString, \"--backtitle \\\"\") ;\n                                strcat(lDialogString, \"tab: move focus\") ;\n                                strcat(lDialogString, \"\\\" \") ;\n                        }\n                }\n\n                if ( aDialogType && ! strcmp( \"okcancel\" , aDialogType ) )\n                {\n                        if ( ! aDefaultButton )\n                        {\n                                strcat( lDialogString , \"--defaultno \" ) ;\n                        }\n                        strcat( lDialogString ,\n                                        \"--yes-label \\\"Ok\\\" --no-label \\\"Cancel\\\" --yesno \" ) ;\n                }\n                else if ( aDialogType && ! strcmp( \"yesno\" , aDialogType ) )\n                {\n                        if ( ! aDefaultButton )\n                        {\n                                strcat( lDialogString , \"--defaultno \" ) ;\n                        }\n                        strcat( lDialogString , \"--yesno \" ) ;\n                }\n                else if (aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n                {\n                        if (!aDefaultButton)\n                        {\n                                strcat(lDialogString, \"--defaultno \");\n                        }\n                        strcat(lDialogString, \"--menu \");\n                }\n                else\n                {\n                        strcat( lDialogString , \"--msgbox \" ) ;\n\n                }\n                strcat( lDialogString , \"\\\"\" ) ;\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, aMessage) ;\n                }\n                strcat(lDialogString, \"\\\" \");\n\n                if ( lWasGraphicDialog )\n                {\n                        if (aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n                        {\n                                strcat(lDialogString,\"0 60 0 Yes \\\"\\\" No \\\"\\\") 2>/tmp/tinyfd.txt;\\\nif [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\\\ntinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes\") ;\n                        }\n                        else\n                        {\n                                strcat(lDialogString,\n                                   \"10 60 ) 2>&1;if [ $? = 0 ];then echo 1;else echo 0;fi\");\n                        }\n                }\n                else\n                {\n                        if (aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n                        {\n                                strcat(lDialogString,\"0 60 0 Yes \\\"\\\" No \\\"\\\" >/dev/tty ) 2>/tmp/tinyfd.txt;\\\n                if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\\\n                tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes\") ;\n\n                                if ( lWasXterm )\n                                {\n                                        strcat(lDialogString,\" >/tmp/tinyfd0.txt';cat /tmp/tinyfd0.txt\");\n                                }\n                                else\n                                {\n                                        strcat(lDialogString, \"; clear >/dev/tty\") ;\n                                }\n                        }\n                        else\n                        {\n                                strcat(lDialogString, \"10 60 >/dev/tty) 2>&1;if [ $? = 0 ];\");\n                                if ( lWasXterm )\n                                {\n                                        strcat( lDialogString ,\n\"then\\n\\techo 1\\nelse\\n\\techo 0\\nfi >/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt\");\n                                }\n                                else\n                                {\n                                   strcat(lDialogString,\n                                                  \"then echo 1;else echo 0;fi;clear >/dev/tty\");\n                                }\n                        }\n                }\n        }\n        else if (  !isTerminalRunning() && terminalName() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"basicinput\");return 0;}\n                strcpy( lDialogString , terminalName() ) ;\n                strcat( lDialogString , \"'\" ) ;\n                if ( !gWarningDisplayed && !tinyfd_forceConsole)\n                {\n                        gWarningDisplayed = 1 ;\n                        strcat( lDialogString , \"echo \\\"\" ) ;\n                        strcat( lDialogString, gTitle) ;\n                        strcat( lDialogString , \"\\\";\" ) ;\n                        strcat( lDialogString , \"echo \\\"\" ) ;\n                        strcat( lDialogString, tinyfd_needs) ;\n                        strcat( lDialogString , \"\\\";echo;echo;\" ) ;\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat( lDialogString , \"echo \\\"\" ) ;\n                        strcat( lDialogString, aTitle) ;\n                        strcat( lDialogString , \"\\\";echo;\" ) ;\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat( lDialogString , \"echo \\\"\" ) ;\n                        strcat( lDialogString, aMessage) ;\n                        strcat( lDialogString , \"\\\"; \" ) ;\n                }\n                if ( aDialogType && !strcmp(\"yesno\",aDialogType) )\n                {\n                        strcat( lDialogString , \"echo -n \\\"y/n: \\\"; \" ) ;\n                        strcat( lDialogString , \"stty sane -echo;\" ) ;\n                        strcat( lDialogString ,\n                                \"answer=$( while ! head -c 1 | grep -i [ny];do true ;done);\");\n                        strcat( lDialogString ,\n                                \"if echo \\\"$answer\\\" | grep -iq \\\"^y\\\";then\\n\");\n                        strcat( lDialogString , \"\\techo 1\\nelse\\n\\techo 0\\nfi\" ) ;\n                }\n                else if ( aDialogType && !strcmp(\"okcancel\",aDialogType) )\n                {\n                        strcat( lDialogString , \"echo -n \\\"[O]kay/[C]ancel: \\\"; \" ) ;\n                        strcat( lDialogString , \"stty sane -echo;\" ) ;\n                        strcat( lDialogString ,\n                                \"answer=$( while ! head -c 1 | grep -i [oc];do true ;done);\");\n                        strcat( lDialogString ,\n                                \"if echo \\\"$answer\\\" | grep -iq \\\"^o\\\";then\\n\");\n                        strcat( lDialogString , \"\\techo 1\\nelse\\n\\techo 0\\nfi\" ) ;\n                }\n                else if ( aDialogType && !strcmp(\"yesnocancel\",aDialogType) )\n                {\n                        strcat( lDialogString , \"echo -n \\\"[Y]es/[N]o/[C]ancel: \\\"; \" ) ;\n                        strcat( lDialogString , \"stty sane -echo;\" ) ;\n                        strcat( lDialogString ,\n                                \"answer=$( while ! head -c 1 | grep -i [nyc];do true ;done);\");\n                        strcat( lDialogString ,\n                                \"if echo \\\"$answer\\\" | grep -iq \\\"^y\\\";then\\n\\techo 1\\n\");\n                        strcat( lDialogString , \"elif echo \\\"$answer\\\" | grep -iq \\\"^n\\\";then\\n\\techo 2\\n\" ) ;\n                        strcat( lDialogString , \"else\\n\\techo 0\\nfi\" ) ;\n                }\n                else\n                {\n                        strcat(lDialogString , \"echo -n \\\"press enter to continue \\\"; \");\n                        strcat( lDialogString , \"stty sane -echo;\" ) ;\n                        strcat( lDialogString ,\n                                \"answer=$( while ! head -c 1;do true ;done);echo 1\");\n                }\n                strcat( lDialogString ,\n                        \" >/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt\");\n        }\n        else if ( !isTerminalRunning() && pythonDbusPresent() && !strcmp(\"ok\" , aDialogType) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python-dbus\");return 1;}\n                strcpy( lDialogString , gPythonName ) ;\n                strcat( lDialogString ,\" -c \\\"import dbus;bus=dbus.SessionBus();\");\n                strcat( lDialogString ,\"notif=bus.get_object('org.freedesktop.Notifications','/org/freedesktop/Notifications');\" ) ;\n                strcat( lDialogString ,\"notify=dbus.Interface(notif,'org.freedesktop.Notifications');\" ) ;\n                strcat( lDialogString ,\"notify.Notify('',0,'\" ) ;\n                if ( aIconType && strlen(aIconType) )\n                {\n                        strcat( lDialogString , aIconType ) ;\n                }\n                strcat(lDialogString, \"','\") ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, aTitle) ;\n                }\n                strcat(lDialogString, \"','\") ;\n                if ( aMessage && strlen(aMessage) )\n                {\n                        lpDialogString = lDialogString + strlen(lDialogString);\n                        replaceSubStr( aMessage , \"\\n\" , \"\\\\n\" , lpDialogString ) ;\n                }\n                strcat(lDialogString, \"','','',5000)\\\"\") ;\n        }\n        else if ( !isTerminalRunning() && (perlPresent() >= 2)  && !strcmp(\"ok\" , aDialogType) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"perl-dbus\");return 1;}\n\n\t\t\t\tstrcpy( lDialogString ,  \"perl -e \\\"use Net::DBus;\\\nmy \\\\$sessionBus = Net::DBus->session;\\\nmy \\\\$notificationsService = \\\\$sessionBus->get_service('org.freedesktop.Notifications');\\\nmy \\\\$notificationsObject = \\\\$notificationsService->get_object('/org/freedesktop/Notifications',\\\n'org.freedesktop.Notifications');\");\n\n\t\t\t\tsprintf( lDialogString + strlen(lDialogString),\n\"my \\\\$notificationId;\\\\$notificationId = \\\\$notificationsObject->Notify(shift, 0, '%s', '%s', '%s', [], {}, -1);\\\" \",\n\t\t\t\t\t\t\taIconType?aIconType:\"\", aTitle?aTitle:\"\", aMessage?aMessage:\"\" ) ;\n        }\n        else if ( !isTerminalRunning() && notifysendPresent() && !strcmp(\"ok\" , aDialogType) )\n        {\n\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"notifysend\");return 1;}\n                strcpy( lDialogString , \"notify-send\" ) ;\n                if ( aIconType && strlen(aIconType) )\n                {\n                        strcat( lDialogString , \" -i '\" ) ;\n                        strcat( lDialogString , aIconType ) ;\n                        strcat( lDialogString , \"'\" ) ;\n                }\n        strcat( lDialogString , \" \\\"\" ) ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, aTitle) ;\n                        strcat( lDialogString , \" | \" ) ;\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n            replaceSubStr( aMessage , \"\\n\\t\" , \" |  \" , lBuff ) ;\n            replaceSubStr( aMessage , \"\\n\" , \" | \" , lBuff ) ;\n            replaceSubStr( aMessage , \"\\t\" , \"  \" , lBuff ) ;\n                        strcat(lDialogString, lBuff) ;\n                }\n                strcat( lDialogString , \"\\\"\" ) ;\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"basicinput\");return 0;}\n                if ( !gWarningDisplayed && !tinyfd_forceConsole)\n                {\n                        gWarningDisplayed = 1 ;\n                        printf(\"\\n\\n%s\\n\", gTitle);\n                        printf(\"%s\\n\\n\", tinyfd_needs);\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        printf(\"\\n%s\\n\", aTitle);\n                }\n\n                tcgetattr(0, &infoOri);\n                tcgetattr(0, &info);\n                info.c_lflag &= ~ICANON;\n                info.c_cc[VMIN] = 1;\n                info.c_cc[VTIME] = 0;\n                tcsetattr(0, TCSANOW, &info);\n                if ( aDialogType && !strcmp(\"yesno\",aDialogType) )\n                {\n                        do\n                        {\n                                if ( aMessage && strlen(aMessage) )\n                                {\n                                        printf(\"\\n%s\\n\",aMessage);\n                                }\n                                printf(\"y/n: \"); fflush(stdout);\n                                lChar = tolower( getchar() ) ;\n                                printf(\"\\n\\n\");\n                        }\n                        while ( lChar != 'y' && lChar != 'n' );\n                        lResult = lChar == 'y' ? 1 : 0 ;\n                }\n                else if ( aDialogType && !strcmp(\"okcancel\",aDialogType) )\n                {\n                        do\n                        {\n                                if ( aMessage && strlen(aMessage) )\n                                {\n                                        printf(\"\\n%s\\n\",aMessage);\n                                }\n                                printf(\"[O]kay/[C]ancel: \"); fflush(stdout);\n                                lChar = tolower( getchar() ) ;\n                                printf(\"\\n\\n\");\n                        }\n                        while ( lChar != 'o' && lChar != 'c' );\n                        lResult = lChar == 'o' ? 1 : 0 ;\n                }\n                else if ( aDialogType && !strcmp(\"yesnocancel\",aDialogType) )\n                {\n                        do\n                        {\n                                if ( aMessage && strlen(aMessage) )\n                                {\n                                        printf(\"\\n%s\\n\",aMessage);\n                                }\n                                printf(\"[Y]es/[N]o/[C]ancel: \"); fflush(stdout);\n                                lChar = tolower( getchar() ) ;\n                                printf(\"\\n\\n\");\n                        }\n                        while ( lChar != 'y' && lChar != 'n' && lChar != 'c' );\n                        lResult = (lChar == 'y') ? 1 : (lChar == 'n') ? 2 : 0 ;\n                }\n                else\n                {\n                        if ( aMessage && strlen(aMessage) )\n                        {\n                                printf(\"\\n%s\\n\\n\",aMessage);\n                        }\n                        printf(\"press enter to continue \"); fflush(stdout);\n                        getchar() ;\n                        printf(\"\\n\\n\");\n                        lResult = 1 ;\n                }\n                tcsetattr(0, TCSANOW, &infoOri);\n                free(lDialogString);\n                return lResult ;\n        }\n\n        if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;\n\n        if ( ! ( lIn = popen( lDialogString , \"r\" ) ) )\n        {\n                free(lDialogString);\n                return 0 ;\n        }\n        while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n        {}\n\n        pclose( lIn ) ;\n\n        /* printf( \"lBuff: %s len: %lu \\n\" , lBuff , strlen(lBuff) ) ; */\n        if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n        {\n                lBuff[strlen( lBuff ) -1] = '\\0' ;\n        }\n        /* printf( \"lBuff1: %s len: %lu \\n\" , lBuff , strlen(lBuff) ) ; */\n\n        if (aDialogType && !strcmp(\"yesnocancel\", aDialogType))\n        {\n                if ( lBuff[0]=='1' )\n                {\n                        if ( !strcmp( lBuff+1 , \"Yes\" )) strcpy(lBuff,\"1\");\n                        else if ( !strcmp( lBuff+1 , \"No\" )) strcpy(lBuff,\"2\");\n                }\n        }\n        /* printf( \"lBuff2: %s len: %lu \\n\" , lBuff , strlen(lBuff) ) ; */\n\n        lResult =  !strcmp( lBuff , \"2\" ) ? 2 : !strcmp( lBuff , \"1\" ) ? 1 : 0;\n\n        /* printf( \"lResult: %d\\n\" , lResult ) ; */\n        free(lDialogString);\n        return lResult ;\n}\n\n\n/* return has only meaning for tinyfd_query */\nint tinyfd_notifyPopup(\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aMessage , /* NULL or \"\"  may contain \\n and \\t */\n        char const * const aIconType ) /* \"info\" \"warning\" \"error\" */\n{\n    char lBuff[MAX_PATH_OR_CMD];\n        char * lDialogString = NULL ;\n    char * lpDialogString ;\n        FILE * lIn ;\n        size_t lTitleLen ;\n        size_t lMessageLen ;\n\n        if ( getenv(\"SSH_TTY\") )\n        {\n                return tinyfd_messageBox(aTitle, aMessage, \"ok\", aIconType, 0);\n        }\n\n        lTitleLen =  aTitle ? strlen(aTitle) : 0 ;\n        lMessageLen =  aMessage ? strlen(aMessage) : 0 ;\n        if ( !aTitle || strcmp(aTitle,\"tinyfd_query\") )\n        {\n                lDialogString = (char *) malloc( MAX_PATH_OR_CMD + lTitleLen + lMessageLen );\n        }\n\n        if ( osascriptPresent( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"applescript\");return 1;}\n\n                strcpy( lDialogString , \"osascript \");\n                if ( ! osx9orBetter() ) strcat( lDialogString , \" -e 'tell application \\\"System Events\\\"' -e 'Activate'\");\n                strcat( lDialogString , \" -e 'try' -e 'display notification \\\"\") ;\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, aMessage) ;\n                }\n                strcat(lDialogString, \" \\\" \") ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"with title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                strcat( lDialogString, \"' -e 'end try'\") ;\n                if ( ! osx9orBetter() ) strcat( lDialogString, \" -e 'end tell'\") ;\n        }\n        else if ( kdialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"kdialog\");return 1;}\n                strcpy( lDialogString , \"kdialog\" ) ;\n\n                if ( aIconType && strlen(aIconType) )\n                {\n                        strcat( lDialogString , \" --icon '\" ) ;\n                        strcat( lDialogString , aIconType ) ;\n                        strcat( lDialogString , \"'\" ) ;\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat( lDialogString , \" --title \\\"\" ) ;\n                        strcat( lDialogString , aTitle ) ;\n                        strcat( lDialogString , \"\\\"\" ) ;\n                }\n\n                strcat( lDialogString , \" --passivepopup\" ) ;\n                strcat( lDialogString , \" \\\"\" ) ;\n                if ( aMessage )\n                {\n                        strcat( lDialogString , aMessage ) ;\n                }\n                strcat( lDialogString , \" \\\" 5\" ) ;\n        }\n        else if ( (zenity3Present()>=5) || matedialogPresent() || shellementaryPresent() || qarmaPresent() )\n        {\n                /* zenity 2.32 & 3.14 has the notification but with a bug: it doesnt return from it */\n                /* zenity 3.8 show the notification as an alert ok cancel box */\n                if ( zenity3Present()>=5 )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"zenity\");return 1;}\n                        strcpy( lDialogString , \"zenity\" ) ;\n                }\n                else if ( matedialogPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"matedialog\");return 1;}\n                        strcpy( lDialogString , \"matedialog\" ) ;\n                }\n                else if ( shellementaryPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"shellementary\");return 1;}\n                        strcpy( lDialogString , \"shellementary\" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"qarma\");return 1;}\n                        strcpy( lDialogString , \"qarma\" ) ;\n                }\n\n                strcat( lDialogString , \" --notification\");\n\n                if ( aIconType && strlen( aIconType ) )\n                {\n                        strcat( lDialogString , \" --window-icon '\");\n                        strcat( lDialogString , aIconType ) ;\n                        strcat( lDialogString , \"'\" ) ;\n                }\n\n                strcat( lDialogString , \" --text \\\"\" ) ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\n\") ;\n                }\n                if ( aMessage && strlen( aMessage ) )\n                {\n                        strcat( lDialogString , aMessage ) ;\n                }\n                strcat( lDialogString , \" \\\"\" ) ;\n        }\n        else if ( perlPresent() >= 2 )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"perl-dbus\");return 1;}\n\n\t\t\t\tstrcpy( lDialogString , \"perl -e \\\"use Net::DBus;\\\nmy \\\\$sessionBus = Net::DBus->session;\\\nmy \\\\$notificationsService = \\\\$sessionBus->get_service('org.freedesktop.Notifications');\\\nmy \\\\$notificationsObject = \\\\$notificationsService->get_object('/org/freedesktop/Notifications',\\\n'org.freedesktop.Notifications');\");\n\n\t\t\t\tsprintf( lDialogString + strlen(lDialogString) ,\n\"my \\\\$notificationId;\\\\$notificationId = \\\\$notificationsObject->Notify(shift, 0, '%s', '%s', '%s', [], {}, -1);\\\" \",\naIconType?aIconType:\"\", aTitle?aTitle:\"\", aMessage?aMessage:\"\" ) ;\n        }\n        else if ( pythonDbusPresent( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python-dbus\");return 1;}\n                strcpy( lDialogString , gPythonName ) ;\n                strcat( lDialogString ,\" -c \\\"import dbus;bus=dbus.SessionBus();\");\n                strcat( lDialogString ,\"notif=bus.get_object('org.freedesktop.Notifications','/org/freedesktop/Notifications');\" ) ;\n                strcat( lDialogString ,\"notify=dbus.Interface(notif,'org.freedesktop.Notifications');\" ) ;\n                strcat( lDialogString ,\"notify.Notify('',0,'\" ) ;\n                if ( aIconType && strlen(aIconType) )\n                {\n                        strcat( lDialogString , aIconType ) ;\n                }\n                strcat(lDialogString, \"','\") ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, aTitle) ;\n                }\n                strcat(lDialogString, \"','\") ;\n                if ( aMessage && strlen(aMessage) )\n                {\n                        lpDialogString = lDialogString + strlen(lDialogString);\n                        replaceSubStr( aMessage , \"\\n\" , \"\\\\n\" , lpDialogString ) ;\n                }\n                strcat(lDialogString, \"','','',5000)\\\"\") ;\n        }\n        else if ( notifysendPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"notifysend\");return 1;}\n                strcpy( lDialogString , \"notify-send\" ) ;\n                if ( aIconType && strlen(aIconType) )\n                {\n                        strcat( lDialogString , \" -i '\" ) ;\n                        strcat( lDialogString , aIconType ) ;\n                        strcat( lDialogString , \"'\" ) ;\n                }\n        strcat( lDialogString , \" \\\"\" ) ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, aTitle) ;\n                        strcat( lDialogString , \" | \" ) ;\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n            replaceSubStr( aMessage , \"\\n\\t\" , \" |  \" , lBuff ) ;\n            replaceSubStr( aMessage , \"\\n\" , \" | \" , lBuff ) ;\n            replaceSubStr( aMessage , \"\\t\" , \"  \" , lBuff ) ;\n                        strcat(lDialogString, lBuff) ;\n                }\n                strcat( lDialogString , \"\\\"\" ) ;\n        }\n        else\n        {\n                return tinyfd_messageBox(aTitle, aMessage, \"ok\", aIconType, 0);\n        }\n\n        if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;\n\n        if ( ! ( lIn = popen( lDialogString , \"r\" ) ) )\n        {\n                free(lDialogString);\n                return 0 ;\n        }\n\n        pclose( lIn ) ;\n        free(lDialogString);\n        return 1;\n}\n\n\n/* returns NULL on cancel */\nchar const * tinyfd_inputBox(\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aMessage , /* NULL or \"\" may NOT contain \\n nor \\t */\n        char const * const aDefaultInput ) /* \"\" , if NULL it's a passwordBox */\n{\n        static char lBuff[MAX_PATH_OR_CMD];\n        char * lDialogString = NULL;\n        char * lpDialogString;\n        FILE * lIn ;\n        int lResult ;\n        int lWasGdialog = 0 ;\n        int lWasGraphicDialog = 0 ;\n        int lWasXterm = 0 ;\n        int lWasBasicXterm = 0 ;\n        struct termios oldt ;\n        struct termios newt ;\n        char * lEOF;\n        size_t lTitleLen ;\n        size_t lMessageLen ;\n\n        lBuff[0]='\\0';\n\n        lTitleLen =  aTitle ? strlen(aTitle) : 0 ;\n        lMessageLen =  aMessage ? strlen(aMessage) : 0 ;\n        if ( !aTitle || strcmp(aTitle,\"tinyfd_query\") )\n        {\n                lDialogString = (char *) malloc( MAX_PATH_OR_CMD + lTitleLen + lMessageLen );\n        }\n\n        if ( osascriptPresent( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"applescript\");return (char const *)1;}\n                strcpy( lDialogString , \"osascript \");\n                if ( ! osx9orBetter() ) strcat( lDialogString , \" -e 'tell application \\\"System Events\\\"' -e 'Activate'\");\n                strcat( lDialogString , \" -e 'try' -e 'display dialog \\\"\") ;\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, aMessage) ;\n                }\n                strcat(lDialogString, \"\\\" \") ;\n                strcat(lDialogString, \"default answer \\\"\") ;\n                if ( aDefaultInput && strlen(aDefaultInput) )\n                {\n                        strcat(lDialogString, aDefaultInput) ;\n                }\n                strcat(lDialogString, \"\\\" \") ;\n                if ( ! aDefaultInput )\n                {\n                        strcat(lDialogString, \"hidden answer true \") ;\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"with title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n                strcat(lDialogString, \"with icon note' \") ;\n                strcat(lDialogString, \"-e '\\\"1\\\" & text returned of result' \" );\n                strcat(lDialogString, \"-e 'on error number -128' \" ) ;\n                strcat(lDialogString, \"-e '0' \" );\n                strcat(lDialogString, \"-e 'end try'\") ;\n                if ( ! osx9orBetter() ) strcat(lDialogString, \" -e 'end tell'\") ;\n        }\n        else if ( kdialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"kdialog\");return (char const *)1;}\n                strcpy( lDialogString , \"szAnswer=$(kdialog\" ) ;\n\n                if ( kdialogPresent() == 2 )\n                {\n                        strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                }\n\n                if ( ! aDefaultInput )\n                {\n                        strcat(lDialogString, \" --password \") ;\n                }\n                else\n                {\n                        strcat(lDialogString, \" --inputbox \") ;\n\n                }\n                strcat(lDialogString, \"\\\"\") ;\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, aMessage ) ;\n                }\n                strcat(lDialogString , \"\\\" \\\"\" ) ;\n                if ( aDefaultInput && strlen(aDefaultInput) )\n                {\n                        strcat(lDialogString, aDefaultInput ) ;\n                }\n                strcat(lDialogString , \"\\\"\" ) ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                strcat( lDialogString ,\n                        \");if [ $? = 0 ];then echo 1$szAnswer;else echo 0$szAnswer;fi\");\n        }\n        else if ( zenityPresent() || matedialogPresent() || shellementaryPresent() || qarmaPresent() )\n        {\n                if ( zenityPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"zenity\");return (char const *)1;}\n                        strcpy( lDialogString , \"szAnswer=$(zenity\" ) ;\n                        if ( (zenity3Present() >= 4) && !getenv(\"SSH_TTY\") )\n                        {\n                                strcat( lDialogString, \" --attach=$(sleep .01;xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                else if ( matedialogPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"matedialog\");return (char const *)1;}\n                        strcpy( lDialogString ,  \"szAnswer=$(matedialog\" ) ;\n                }\n                else if ( shellementaryPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"shellementary\");return (char const *)1;}\n                        strcpy( lDialogString , \"szAnswer=$(shellementary\" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"qarma\");return (char const *)1;}\n                        strcpy( lDialogString ,  \"szAnswer=$(qarma\" ) ;\n                        if ( !getenv(\"SSH_TTY\") )\n                        {\n                                strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                strcat( lDialogString ,\" --entry\" ) ;\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title=\\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, \" --text=\\\"\") ;\n                        strcat(lDialogString, aMessage) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if ( aDefaultInput && strlen(aDefaultInput) )\n                {\n                        strcat(lDialogString, \" --entry-text=\\\"\") ;\n                        strcat(lDialogString, aDefaultInput) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                else\n                {\n                        strcat(lDialogString, \" --hide-text\") ;\n                }\n                if (tinyfd_silent) strcat( lDialogString , \" 2>/dev/null \");\n                strcat( lDialogString ,\n                                \");if [ $? = 0 ];then echo 1$szAnswer;else echo 0$szAnswer;fi\");\n        }\n        else if ( gxmessagePresent() || gmessagePresent() )\n        {\n                if ( gxmessagePresent() ) {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"gxmessage\");return (char const *)1;}\n                        strcpy( lDialogString , \"szAnswer=$(gxmessage -buttons Ok:1,Cancel:0 -center \\\"\");\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"gmessage\");return (char const *)1;}\n                        strcpy( lDialogString , \"szAnswer=$(gmessage -buttons Ok:1,Cancel:0 -center \\\"\");\n                }\n\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat( lDialogString , aMessage ) ;\n                }\n                strcat(lDialogString, \"\\\"\" ) ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat( lDialogString , \" -title  \\\"\");\n                        strcat( lDialogString , aTitle ) ;\n                        strcat(lDialogString, \"\\\" \" ) ;\n                }\n                strcat(lDialogString, \" -entrytext \\\"\" ) ;\n                if ( aDefaultInput && strlen(aDefaultInput) )\n                {\n                        strcat( lDialogString , aDefaultInput ) ;\n                }\n                strcat(lDialogString, \"\\\"\" ) ;\n                strcat( lDialogString , \");echo $?$szAnswer\");\n        }\n        else if ( !gdialogPresent() && !xdialogPresent() && tkinter2Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python2-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython2Name ) ;\n                if ( ! isTerminalRunning( ) && isDarwin( ) )\n                {\n                strcat( lDialogString , \" -i\" ) ;  /* for osx without console */\n                }\n\n                strcat( lDialogString ,\n\" -S -c \\\"import Tkinter,tkSimpleDialog;root=Tkinter.Tk();root.withdraw();\");\n\n                if ( isDarwin( ) )\n                {\n                        strcat( lDialogString ,\n\"import os;os.system('''/usr/bin/osascript -e 'tell app \\\\\\\"Finder\\\\\\\" to set \\\nfrontmost of process \\\\\\\"Python\\\\\\\" to true' ''');\");\n                }\n\n                strcat( lDialogString ,\"res=tkSimpleDialog.askstring(\" ) ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"',\") ;\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n\n                        strcat(lDialogString, \"prompt='\") ;\n                        lpDialogString = lDialogString + strlen(lDialogString);\n                        replaceSubStr( aMessage , \"\\n\" , \"\\\\n\" , lpDialogString ) ;\n                        strcat(lDialogString, \"',\") ;\n                }\n                if ( aDefaultInput )\n                {\n                        if ( strlen(aDefaultInput) )\n                        {\n                                strcat(lDialogString, \"initialvalue='\") ;\n                                strcat(lDialogString, aDefaultInput) ;\n                                strcat(lDialogString, \"',\") ;\n                        }\n                }\n                else\n                {\n                        strcat(lDialogString, \"show='*'\") ;\n                }\n                strcat(lDialogString, \");\\nif res is None :\\n\\tprint 0\");\n                strcat(lDialogString, \"\\nelse :\\n\\tprint '1'+res\\n\\\"\" ) ;\n        }\n        else if ( !gdialogPresent() && !xdialogPresent() && tkinter3Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python3-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython3Name ) ;\n                strcat( lDialogString ,\n                        \" -S -c \\\"import tkinter; from tkinter import simpledialog;root=tkinter.Tk();root.withdraw();\");\n                strcat( lDialogString ,\"res=simpledialog.askstring(\" ) ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"',\") ;\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n\n                        strcat(lDialogString, \"prompt='\") ;\n                        lpDialogString = lDialogString + strlen(lDialogString);\n                        replaceSubStr( aMessage , \"\\n\" , \"\\\\n\" , lpDialogString ) ;\n                        strcat(lDialogString, \"',\") ;\n                }\n                if ( aDefaultInput )\n                {\n                        if ( strlen(aDefaultInput) )\n                        {\n                                strcat(lDialogString, \"initialvalue='\") ;\n                                strcat(lDialogString, aDefaultInput) ;\n                                strcat(lDialogString, \"',\") ;\n                        }\n                }\n                else\n                {\n                        strcat(lDialogString, \"show='*'\") ;\n                }\n                strcat(lDialogString, \");\\nif res is None :\\n\\tprint(0)\");\n                strcat(lDialogString, \"\\nelse :\\n\\tprint('1'+res)\\n\\\"\" ) ;\n        }\n        else if ( gdialogPresent() || xdialogPresent() || dialogName() || whiptailPresent() )\n        {\n                if ( gdialogPresent( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"gdialog\");return (char const *)1;}\n                        lWasGraphicDialog = 1 ;\n                        lWasGdialog = 1 ;\n                        strcpy( lDialogString , \"(gdialog \" ) ;\n                }\n                else if ( xdialogPresent( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"xdialog\");return (char const *)1;}\n                        lWasGraphicDialog = 1 ;\n                        strcpy( lDialogString , \"(Xdialog \" ) ;\n                }\n                else if ( dialogName( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                        if ( isTerminalRunning( ) )\n                        {\n                                strcpy( lDialogString , \"(dialog \" ) ;\n                        }\n                        else\n                        {\n                                lWasXterm = 1 ;\n                                strcpy( lDialogString , terminalName() ) ;\n                                strcat( lDialogString , \"'(\" ) ;\n                                strcat( lDialogString , dialogName() ) ;\n                                strcat( lDialogString , \" \" ) ;\n                        }\n                }\n                else if ( isTerminalRunning( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"whiptail\");return (char const *)0;}\n                        strcpy( lDialogString , \"(whiptail \" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"whiptail\");return (char const *)0;}\n                        lWasXterm = 1 ;\n                        strcpy( lDialogString , terminalName() ) ;\n                        strcat( lDialogString , \"'(whiptail \" ) ;\n                }\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"--title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                if ( !xdialogPresent() && !gdialogPresent() )\n                {\n                        strcat(lDialogString, \"--backtitle \\\"\") ;\n                        strcat(lDialogString, \"tab: move focus\") ;\n                        if ( ! aDefaultInput && !lWasGdialog )\n                        {\n                                strcat(lDialogString, \" (sometimes nothing, no blink nor star, is shown in text field)\") ;\n                        }\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                if ( aDefaultInput || lWasGdialog )\n                {\n                        strcat( lDialogString , \"--inputbox\" ) ;\n                }\n                else\n                {\n                        if ( !lWasGraphicDialog && dialogName() && isDialogVersionBetter09b() )\n                        {\n                                strcat( lDialogString , \"--insecure \" ) ;\n                        }\n                        strcat( lDialogString , \"--passwordbox\" ) ;\n                }\n                strcat( lDialogString , \" \\\"\" ) ;\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat(lDialogString, aMessage) ;\n                }\n                strcat(lDialogString,\"\\\" 10 60 \") ;\n                if ( aDefaultInput && strlen(aDefaultInput) )\n                {\n                        strcat(lDialogString, \"\\\"\") ;\n                        strcat(lDialogString, aDefaultInput) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n                if ( lWasGraphicDialog )\n                {\n                        strcat(lDialogString,\") 2>/tmp/tinyfd.txt;\\\n        if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\\\n        tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes\") ;\n                }\n                else\n                {\n                        strcat(lDialogString,\">/dev/tty ) 2>/tmp/tinyfd.txt;\\\n        if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\\\n        tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes\") ;\n\n                        if ( lWasXterm )\n                        {\n                strcat(lDialogString,\" >/tmp/tinyfd0.txt';cat /tmp/tinyfd0.txt\");\n                        }\n                        else\n                        {\n                                strcat(lDialogString, \"; clear >/dev/tty\") ;\n                        }\n                }\n        }\n        else if ( ! isTerminalRunning( ) && terminalName() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"basicinput\");return (char const *)0;}\n                lWasBasicXterm = 1 ;\n                strcpy( lDialogString , terminalName() ) ;\n                strcat( lDialogString , \"'\" ) ;\n                if ( !gWarningDisplayed && !tinyfd_forceConsole)\n                {\n\t\t\t\t\tgWarningDisplayed = 1 ;\n\t\t\t\t\ttinyfd_messageBox(gTitle,tinyfd_needs,\"ok\",\"warning\",0);\n                }\n                if ( aTitle && strlen(aTitle) && !tinyfd_forceConsole)\n                {\n                        strcat( lDialogString , \"echo \\\"\" ) ;\n                        strcat( lDialogString, aTitle) ;\n                        strcat( lDialogString , \"\\\";echo;\" ) ;\n                }\n\n                strcat( lDialogString , \"echo \\\"\" ) ;\n                if ( aMessage && strlen(aMessage) )\n                {\n                        strcat( lDialogString, aMessage) ;\n                }\n                strcat( lDialogString , \"\\\";read \" ) ;\n                if ( ! aDefaultInput )\n                {\n                        strcat( lDialogString , \"-s \" ) ;\n                }\n                strcat( lDialogString , \"-p \\\"\" ) ;\n                strcat( lDialogString , \"(esc+enter to cancel): \\\" ANSWER \" ) ;\n                strcat( lDialogString , \";echo 1$ANSWER >/tmp/tinyfd.txt';\" ) ;\n                strcat( lDialogString , \"cat -v /tmp/tinyfd.txt\");\n        }\n        else if ( !gWarningDisplayed && ! isTerminalRunning( ) && ! terminalName() ) {\n\t\t\tgWarningDisplayed = 1 ;\n\t\t\ttinyfd_messageBox(gTitle,tinyfd_needs,\"ok\",\"warning\",0);\n\t\t\tif (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"no_solution\");return (char const *)0;}\n\t\t\treturn NULL;\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"basicinput\");return (char const *)0;}\n                if ( !gWarningDisplayed && !tinyfd_forceConsole)\n                {\n                        gWarningDisplayed = 1 ;\n                        tinyfd_messageBox(gTitle,tinyfd_needs,\"ok\",\"warning\",0);\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        printf(\"\\n%s\\n\", aTitle);\n                }\n                if ( aMessage && strlen(aMessage) )\n                {\n                        printf(\"\\n%s\\n\",aMessage);\n                }\n                printf(\"(esc+enter to cancel): \"); fflush(stdout);\n                if ( ! aDefaultInput )\n                {\n                        tcgetattr(STDIN_FILENO, & oldt) ;\n                        newt = oldt ;\n                        newt.c_lflag &= ~ECHO ;\n                        tcsetattr(STDIN_FILENO, TCSANOW, & newt);\n                }\n\n                lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin);\n                /* printf(\"lbuff<%c><%d>\\n\",lBuff[0],lBuff[0]); */\n                if ( ! lEOF  || (lBuff[0] == '\\0') )\n                {\n                        free(lDialogString);\n                        return NULL;\n                }\n\n                if ( lBuff[0] == '\\n' )\n                {\n                        lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin);\n                        /* printf(\"lbuff<%c><%d>\\n\",lBuff[0],lBuff[0]); */\n                        if ( ! lEOF  || (lBuff[0] == '\\0') )\n                        {\n                                free(lDialogString);\n                                return NULL;\n                        }\n                }\n\n                if ( ! aDefaultInput )\n                {\n                        tcsetattr(STDIN_FILENO, TCSANOW, & oldt);\n                        printf(\"\\n\");\n                }\n                printf(\"\\n\");\n                if ( strchr(lBuff,27) )\n                {\n                        free(lDialogString);\n                        return NULL ;\n                }\n                if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n                {\n                        lBuff[strlen( lBuff ) -1] = '\\0' ;\n                }\n                free(lDialogString);\n                return lBuff ;\n        }\n\n        if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;\n        lIn = popen( lDialogString , \"r\" );\n        if ( ! lIn  )\n        {\n                if ( fileExists(\"/tmp/tinyfd.txt\") )\n                {\n                        wipefile(\"/tmp/tinyfd.txt\");\n                        remove(\"/tmp/tinyfd.txt\");\n                }\n                if ( fileExists(\"/tmp/tinyfd0.txt\") )\n                {\n                        wipefile(\"/tmp/tinyfd0.txt\");\n                        remove(\"/tmp/tinyfd0.txt\");\n                }\n                free(lDialogString);\n                return NULL ;\n        }\n        while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n        {}\n\n        pclose( lIn ) ;\n\n        if ( fileExists(\"/tmp/tinyfd.txt\") )\n        {\n                wipefile(\"/tmp/tinyfd.txt\");\n                remove(\"/tmp/tinyfd.txt\");\n        }\n        if ( fileExists(\"/tmp/tinyfd0.txt\") )\n        {\n                wipefile(\"/tmp/tinyfd0.txt\");\n                remove(\"/tmp/tinyfd0.txt\");\n        }\n\n        /* printf( \"len Buff: %lu\\n\" , strlen(lBuff) ) ; */\n        /* printf( \"lBuff0: %s\\n\" , lBuff ) ; */\n        if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n        {\n                lBuff[strlen( lBuff ) -1] = '\\0' ;\n        }\n        /* printf( \"lBuff1: %s len: %lu \\n\" , lBuff , strlen(lBuff) ) ; */\n        if ( lWasBasicXterm )\n        {\n                if ( strstr(lBuff,\"^[\") ) /* esc was pressed */\n                {\n                        free(lDialogString);\n                        return NULL ;\n                }\n        }\n\n        lResult =  strncmp( lBuff , \"1\" , 1) ? 0 : 1 ;\n        /* printf( \"lResult: %d \\n\" , lResult ) ; */\n        if ( ! lResult )\n        {\n                free(lDialogString);\n                return NULL ;\n        }\n        /* printf( \"lBuff+1: %s\\n\" , lBuff+1 ) ; */\n        free(lDialogString);\n\n        return lBuff+1 ;\n}\n\n\nchar const * tinyfd_saveFileDialog(\n    char const * const aTitle , /* NULL or \"\" */\n    char const * const aDefaultPathAndFile , /* NULL or \"\" */\n    int const aNumOfFilterPatterns , /* 0 */\n    char const * const * const aFilterPatterns , /* NULL or {\"*.jpg\",\"*.png\"} */\n    char const * const aSingleFilterDescription ) /* NULL or \"image files\" */\n{\n\n        static char lBuff [MAX_PATH_OR_CMD] ;\n        char lDialogString [MAX_PATH_OR_CMD] ;\n        char lString [MAX_PATH_OR_CMD] ;\n        int i ;\n        int lWasGraphicDialog = 0 ;\n        int lWasXterm = 0 ;\n        char const * p ;\n        FILE * lIn ;\n        lBuff[0]='\\0';\n\n        if ( osascriptPresent( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"applescript\");return (char const *)1;}\n                strcpy( lDialogString , \"osascript \");\n                if ( ! osx9orBetter() ) strcat( lDialogString , \" -e 'tell application \\\"Finder\\\"' -e 'Activate'\");\n                strcat( lDialogString , \" -e 'try' -e 'POSIX path of ( choose file name \" );\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"with prompt \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n                getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ;\n                if ( strlen(lString) )\n                {\n                        strcat(lDialogString, \"default location \\\"\") ;\n                        strcat(lDialogString, lString ) ;\n                        strcat(lDialogString , \"\\\" \" ) ;\n                }\n                getLastName( lString , aDefaultPathAndFile ) ;\n                if ( strlen(lString) )\n                {\n                        strcat(lDialogString, \"default name \\\"\") ;\n                        strcat(lDialogString, lString ) ;\n                        strcat(lDialogString , \"\\\" \" ) ;\n                }\n                strcat( lDialogString , \")' \" ) ;\n                strcat(lDialogString, \"-e 'on error number -128' \" ) ;\n                strcat(lDialogString, \"-e 'end try'\") ;\n                if ( ! osx9orBetter() ) strcat( lDialogString, \" -e 'end tell'\") ;\n        }\n        else if ( kdialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"kdialog\");return (char const *)1;}\n\n                strcpy( lDialogString , \"kdialog\" ) ;\n                if ( kdialogPresent() == 2 )\n                {\n                        strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                }\n                strcat( lDialogString , \" --getsavefilename \" ) ;\n\n                if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n                {\n                        if ( aDefaultPathAndFile[0] != '/' )\n                        {\n                                strcat(lDialogString, \"$PWD/\") ;\n                        }\n                        strcat(lDialogString, \"\\\"\") ;\n                        strcat(lDialogString, aDefaultPathAndFile ) ;\n                        strcat(lDialogString , \"\\\"\" ) ;\n                }\n                else\n                {\n                        strcat(lDialogString, \"$PWD/\") ;\n                }\n\n                if ( aNumOfFilterPatterns > 0 )\n                {\n                        strcat(lDialogString , \" \\\"\" ) ;\n                        for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ )\n                        {\n                                strcat( lDialogString , aFilterPatterns [i] ) ;\n                                strcat( lDialogString , \" \" ) ;\n                        }\n                        if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                        {\n                                strcat( lDialogString , \" | \" ) ;\n                                strcat( lDialogString , aSingleFilterDescription ) ;\n                        }\n                        strcat( lDialogString , \"\\\"\" ) ;\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n        }\n        else if ( zenityPresent() || matedialogPresent() || shellementaryPresent() || qarmaPresent() )\n        {\n                if ( zenityPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"zenity\");return (char const *)1;}\n                        strcpy( lDialogString , \"zenity\" ) ;\n                        if ( (zenity3Present() >= 4) && !getenv(\"SSH_TTY\") )\n                        {\n                                strcat( lDialogString, \" --attach=$(sleep .01;xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                else if ( matedialogPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"matedialog\");return (char const *)1;}\n                        strcpy( lDialogString , \"matedialog\" ) ;\n                }\n                else if ( shellementaryPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"shellementary\");return (char const *)1;}\n                        strcpy( lDialogString , \"shellementary\" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"qarma\");return (char const *)1;}\n                        strcpy( lDialogString , \"qarma\" ) ;\n                        if ( !getenv(\"SSH_TTY\") )\n                        {\n                                strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                strcat(lDialogString, \" --file-selection --save --confirm-overwrite\" ) ;\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title=\\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n                {\n                        strcat(lDialogString, \" --filename=\\\"\") ;\n                        strcat(lDialogString, aDefaultPathAndFile) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if ( aNumOfFilterPatterns > 0 )\n                {\n                        strcat( lDialogString , \" --file-filter='\" ) ;\n                        if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                        {\n                                strcat( lDialogString , aSingleFilterDescription ) ;\n                                strcat( lDialogString , \" | \" ) ;\n                        }\n                        for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ )\n                        {\n                                strcat( lDialogString , aFilterPatterns [i] ) ;\n                                strcat( lDialogString , \" \" ) ;\n                        }\n                        strcat( lDialogString , \"' --file-filter='All files | *'\" ) ;\n                }\n                if (tinyfd_silent) strcat( lDialogString , \" 2>/dev/null \");\n        }\n        else if ( !xdialogPresent() && tkinter2Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python2-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython2Name ) ;\n                if ( ! isTerminalRunning( ) && isDarwin( ))\n                {\n                strcat( lDialogString , \" -i\" ) ;  /* for osx without console */\n                }\n            strcat( lDialogString ,\n\" -S -c \\\"import Tkinter,tkFileDialog;root=Tkinter.Tk();root.withdraw();\");\n\n        if ( isDarwin( ) )\n        {\n                        strcat( lDialogString ,\n\"import os;os.system('''/usr/bin/osascript -e 'tell app \\\\\\\"Finder\\\\\\\" to set\\\n frontmost of process \\\\\\\"Python\\\\\\\" to true' ''');\");\n                }\n\n                strcat( lDialogString , \"print tkFileDialog.asksaveasfilename(\");\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"',\") ;\n                }\n            if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n            {\n                        getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ;\n                        if ( strlen(lString) )\n                        {\n                                strcat(lDialogString, \"initialdir='\") ;\n                                strcat(lDialogString, lString ) ;\n                                strcat(lDialogString , \"',\" ) ;\n                        }\n                        getLastName( lString , aDefaultPathAndFile ) ;\n                        if ( strlen(lString) )\n                        {\n                                strcat(lDialogString, \"initialfile='\") ;\n                                strcat(lDialogString, lString ) ;\n                                strcat(lDialogString , \"',\" ) ;\n                        }\n                }\n            if ( ( aNumOfFilterPatterns > 1 )\n                  || ( (aNumOfFilterPatterns == 1) /* test because poor osx behaviour */\n                        && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) )\n            {\n                        strcat(lDialogString , \"filetypes=(\" ) ;\n                        strcat( lDialogString , \"('\" ) ;\n                        if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                        {\n                                strcat( lDialogString , aSingleFilterDescription ) ;\n                        }\n                        strcat( lDialogString , \"',(\" ) ;\n                        for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ )\n                        {\n                                strcat( lDialogString , \"'\" ) ;\n                                strcat( lDialogString , aFilterPatterns [i] ) ;\n                                strcat( lDialogString , \"',\" ) ;\n                        }\n                        strcat( lDialogString , \")),\" ) ;\n                        strcat( lDialogString , \"('All files','*'))\" ) ;\n            }\n                strcat( lDialogString , \")\\\"\" ) ;\n        }\n        else if ( !xdialogPresent() && tkinter3Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python3-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython3Name ) ;\n                strcat( lDialogString ,\n                        \" -S -c \\\"import tkinter;from tkinter import filedialog;root=tkinter.Tk();root.withdraw();\");\n                strcat( lDialogString , \"print( filedialog.asksaveasfilename(\");\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"',\") ;\n                }\n                if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n                {\n                        getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ;\n                        if ( strlen(lString) )\n                        {\n                                strcat(lDialogString, \"initialdir='\") ;\n                                strcat(lDialogString, lString ) ;\n                                strcat(lDialogString , \"',\" ) ;\n                        }\n                        getLastName( lString , aDefaultPathAndFile ) ;\n                        if ( strlen(lString) )\n                        {\n                                strcat(lDialogString, \"initialfile='\") ;\n                                strcat(lDialogString, lString ) ;\n                                strcat(lDialogString , \"',\" ) ;\n                        }\n                }\n                if ( ( aNumOfFilterPatterns > 1 )\n                        || ( (aNumOfFilterPatterns == 1) /* test because poor osx behaviour */\n                        && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) )\n                {\n                        strcat(lDialogString , \"filetypes=(\" ) ;\n                        strcat( lDialogString , \"('\" ) ;\n                        if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                        {\n                                strcat( lDialogString , aSingleFilterDescription ) ;\n                        }\n                        strcat( lDialogString , \"',(\" ) ;\n                        for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ )\n                        {\n                                strcat( lDialogString , \"'\" ) ;\n                                strcat( lDialogString , aFilterPatterns [i] ) ;\n                                strcat( lDialogString , \"',\" ) ;\n                        }\n                        strcat( lDialogString , \")),\" ) ;\n                        strcat( lDialogString , \"('All files','*'))\" ) ;\n                }\n                strcat( lDialogString , \"))\\\"\" ) ;\n        }\n        else if ( xdialogPresent() || dialogName() )\n        {\n                if ( xdialogPresent( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"xdialog\");return (char const *)1;}\n                        lWasGraphicDialog = 1 ;\n                        strcpy( lDialogString , \"(Xdialog \" ) ;\n                }\n                else if ( isTerminalRunning( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                        strcpy( lDialogString , \"(dialog \" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                        lWasXterm = 1 ;\n                        strcpy( lDialogString , terminalName() ) ;\n                        strcat( lDialogString , \"'(\" ) ;\n                        strcat( lDialogString , dialogName() ) ;\n                        strcat( lDialogString , \" \" ) ;\n                }\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"--title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                if ( !xdialogPresent() && !gdialogPresent() )\n                {\n                        strcat(lDialogString, \"--backtitle \\\"\") ;\n                        strcat(lDialogString,\n                                \"tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY\") ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                strcat( lDialogString , \"--fselect \\\"\" ) ;\n                if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n                {\n                        if ( ! strchr(aDefaultPathAndFile, '/') )\n                        {\n                                strcat(lDialogString, \"./\") ;\n                        }\n                        strcat(lDialogString, aDefaultPathAndFile) ;\n                }\n                else if ( ! isTerminalRunning( ) && !lWasGraphicDialog )\n                {\n                        strcat(lDialogString, getenv(\"HOME\")) ;\n                        strcat(lDialogString, \"/\") ;\n                }\n                else\n                {\n                        strcat(lDialogString, \"./\") ;\n                }\n\n                if ( lWasGraphicDialog )\n                {\n                        strcat(lDialogString, \"\\\" 0 60 ) 2>&1 \") ;\n                }\n                else\n                {\n                        strcat(lDialogString, \"\\\" 0 60  >/dev/tty) \") ;\n                        if ( lWasXterm )\n                        {\n                          strcat( lDialogString ,\n                                \"2>/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt\");\n                        }\n                        else\n                        {\n                                strcat(lDialogString, \"2>&1 ; clear >/dev/tty\") ;\n                        }\n                }\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){return tinyfd_inputBox(aTitle,NULL,NULL);}\n                p = tinyfd_inputBox( aTitle , \"Save file\" , \"\" ) ;\n                getPathWithoutFinalSlash( lString , p ) ;\n                if ( strlen( lString ) && ! dirExists( lString ) )\n                {\n                        return NULL ;\n                }\n                getLastName(lString,p);\n                if ( ! strlen(lString) )\n                {\n                        return NULL;\n                }\n                return p ;\n        }\n\n        if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;\n    if ( ! ( lIn = popen( lDialogString , \"r\" ) ) )\n    {\n        return NULL ;\n    }\n    while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n    {}\n    pclose( lIn ) ;\n    if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n    {\n        lBuff[strlen( lBuff ) -1] = '\\0' ;\n    }\n        /* printf( \"lBuff: %s\\n\" , lBuff ) ; */\n        if ( ! strlen(lBuff) )\n        {\n                return NULL;\n        }\n    getPathWithoutFinalSlash( lString , lBuff ) ;\n    if ( strlen( lString ) && ! dirExists( lString ) )\n    {\n        return NULL ;\n    }\n        getLastName(lString,lBuff);\n        if ( ! filenameValid(lString) )\n        {\n                return NULL;\n        }\n    return lBuff ;\n}\n\n\n/* in case of multiple files, the separator is | */\nchar const * tinyfd_openFileDialog(\n    char const * const aTitle , /* NULL or \"\" */\n    char const * const aDefaultPathAndFile , /* NULL or \"\" */\n    int const aNumOfFilterPatterns , /* 0 */\n    char const * const * const aFilterPatterns , /* NULL or {\"*.jpg\",\"*.png\"} */\n    char const * const aSingleFilterDescription , /* NULL or \"image files\" */\n    int const aAllowMultipleSelects ) /* 0 or 1 */\n{\n        static char lBuff [MAX_MULTIPLE_FILES*MAX_PATH_OR_CMD] ;\n        char lDialogString [MAX_PATH_OR_CMD] ;\n        char lString [MAX_PATH_OR_CMD] ;\n        int i ;\n        FILE * lIn ;\n        char * p ;\n        char const * p2 ;\n        int lWasKdialog = 0 ;\n        int lWasGraphicDialog = 0 ;\n        int lWasXterm = 0 ;\n        lBuff[0]='\\0';\n\n        if ( osascriptPresent( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"applescript\");return (char const *)1;}\n                strcpy( lDialogString , \"osascript \");\n                if ( ! osx9orBetter() ) strcat( lDialogString , \" -e 'tell application \\\"System Events\\\"' -e 'Activate'\");\n                strcat( lDialogString , \" -e 'try' -e '\" );\n    if ( ! aAllowMultipleSelects )\n    {\n\n\n                        strcat( lDialogString , \"POSIX path of ( \" );\n                }\n                else\n                {\n                        strcat( lDialogString , \"set mylist to \" );\n                }\n                strcat( lDialogString , \"choose file \" );\n            if ( aTitle && strlen(aTitle) )\n            {\n                        strcat(lDialogString, \"with prompt \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n            }\n                getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ;\n                if ( strlen(lString) )\n                {\n                        strcat(lDialogString, \"default location \\\"\") ;\n                        strcat(lDialogString, lString ) ;\n                        strcat(lDialogString , \"\\\" \" ) ;\n                }\n                if ( aNumOfFilterPatterns > 0 )\n                {\n                        strcat(lDialogString , \"of type {\\\"\" );\n                        strcat( lDialogString , aFilterPatterns [0] + 2 ) ;\n                        strcat( lDialogString , \"\\\"\" ) ;\n                        for ( i = 1 ; i < aNumOfFilterPatterns ; i ++ )\n                        {\n                                strcat( lDialogString , \",\\\"\" ) ;\n                                strcat( lDialogString , aFilterPatterns [i] + 2) ;\n                                strcat( lDialogString , \"\\\"\" ) ;\n                        }\n                        strcat( lDialogString , \"} \" ) ;\n                }\n                if ( aAllowMultipleSelects )\n                {\n                        strcat( lDialogString , \"multiple selections allowed true ' \" ) ;\n                        strcat( lDialogString ,\n                                        \"-e 'set mystring to POSIX path of item 1 of mylist' \" );\n                        strcat( lDialogString ,\n                                        \"-e 'repeat with  i from 2 to the count of mylist' \" );\n                        strcat( lDialogString , \"-e 'set mystring to mystring & \\\"|\\\"' \" );\n                        strcat( lDialogString ,\n                        \"-e 'set mystring to mystring & POSIX path of item i of mylist' \" );\n                        strcat( lDialogString , \"-e 'end repeat' \" );\n                        strcat( lDialogString , \"-e 'mystring' \" );\n                }\n                else\n                {\n                        strcat( lDialogString , \")' \" ) ;\n                }\n                strcat(lDialogString, \"-e 'on error number -128' \" ) ;\n                strcat(lDialogString, \"-e 'end try'\") ;\n                if ( ! osx9orBetter() ) strcat( lDialogString, \" -e 'end tell'\") ;\n        }\n        else if ( kdialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"kdialog\");return (char const *)1;}\n                lWasKdialog = 1 ;\n\n                strcpy( lDialogString , \"kdialog\" ) ;\n                if ( kdialogPresent() == 2 )\n                {\n                        strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                }\n                strcat( lDialogString , \" --getopenfilename \" ) ;\n\n                if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n                {\n                        if ( aDefaultPathAndFile[0] != '/' )\n                        {\n                                strcat(lDialogString, \"$PWD/\") ;\n                        }\n                        strcat(lDialogString, \"\\\"\") ;\n                        strcat(lDialogString, aDefaultPathAndFile ) ;\n                        strcat(lDialogString , \"\\\"\" ) ;\n                }\n                else\n                {\n                        strcat(lDialogString, \"$PWD/\") ;\n                }\n\n                if ( aNumOfFilterPatterns > 0 )\n                {\n                        strcat(lDialogString , \" \\\"\" ) ;\n                        for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ )\n                        {\n                                strcat( lDialogString , aFilterPatterns [i] ) ;\n                                strcat( lDialogString , \" \" ) ;\n                        }\n                        if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                        {\n                                strcat( lDialogString , \" | \" ) ;\n                                strcat( lDialogString , aSingleFilterDescription ) ;\n                        }\n                        strcat( lDialogString , \"\\\"\" ) ;\n                }\n                if ( aAllowMultipleSelects )\n                {\n                        strcat( lDialogString , \" --multiple --separate-output\" ) ;\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n        }\n        else if ( zenityPresent() || matedialogPresent() || shellementaryPresent() || qarmaPresent() )\n        {\n                if ( zenityPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"zenity\");return (char const *)1;}\n                        strcpy( lDialogString , \"zenity\" ) ;\n                        if ( (zenity3Present() >= 4) && !getenv(\"SSH_TTY\") )\n                        {\n                                strcat( lDialogString, \" --attach=$(sleep .01;xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                else if ( matedialogPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"matedialog\");return (char const *)1;}\n                        strcpy( lDialogString , \"matedialog\" ) ;\n                }\n                else if ( shellementaryPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"shellementary\");return (char const *)1;}\n                        strcpy( lDialogString , \"shellementary\" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"qarma\");return (char const *)1;}\n                        strcpy( lDialogString , \"qarma\" ) ;\n                        if ( !getenv(\"SSH_TTY\") )\n                        {\n                                strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                strcat( lDialogString , \" --file-selection\" ) ;\n\n                if ( aAllowMultipleSelects )\n                {\n                        strcat( lDialogString , \" --multiple\" ) ;\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title=\\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n                {\n                        strcat(lDialogString, \" --filename=\\\"\") ;\n                        strcat(lDialogString, aDefaultPathAndFile) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if ( aNumOfFilterPatterns > 0 )\n                {\n                        strcat( lDialogString , \" --file-filter='\" ) ;\n                        if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                        {\n                                strcat( lDialogString , aSingleFilterDescription ) ;\n                                strcat( lDialogString , \" | \" ) ;\n                        }\n                        for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ )\n                        {\n                                strcat( lDialogString , aFilterPatterns [i] ) ;\n                                strcat( lDialogString , \" \" ) ;\n                        }\n                        strcat( lDialogString , \"' --file-filter='All files | *'\" ) ;\n                }\n                if (tinyfd_silent) strcat( lDialogString , \" 2>/dev/null \");\n        }\n        else if ( tkinter2Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python2-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython2Name ) ;\n                if ( ! isTerminalRunning( ) && isDarwin( ) )\n                {\n                strcat( lDialogString , \" -i\" ) ;  /* for osx without console */\n                }\n                strcat( lDialogString ,\n\" -S -c \\\"import Tkinter,tkFileDialog;root=Tkinter.Tk();root.withdraw();\");\n\n        if ( isDarwin( ) )\n        {\n                        strcat( lDialogString ,\n\"import os;os.system('''/usr/bin/osascript -e 'tell app \\\\\\\"Finder\\\\\\\" to set \\\nfrontmost of process \\\\\\\"Python\\\\\\\" to true' ''');\");\n                }\n                strcat( lDialogString , \"lFiles=tkFileDialog.askopenfilename(\");\n    if ( aAllowMultipleSelects )\n    {\n                        strcat( lDialogString , \"multiple=1,\" ) ;\n    }\n    if ( aTitle && strlen(aTitle) )\n    {\n                        strcat(lDialogString, \"title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"',\") ;\n    }\n    if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n    {\n                        getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ;\n                        if ( strlen(lString) )\n                        {\n                                strcat(lDialogString, \"initialdir='\") ;\n                                strcat(lDialogString, lString ) ;\n                                strcat(lDialogString , \"',\" ) ;\n                        }\n                        getLastName( lString , aDefaultPathAndFile ) ;\n                        if ( strlen(lString) )\n                        {\n                                strcat(lDialogString, \"initialfile='\") ;\n                                strcat(lDialogString, lString ) ;\n                                strcat(lDialogString , \"',\" ) ;\n                        }\n                }\n                if ( ( aNumOfFilterPatterns > 1 )\n                        || ( ( aNumOfFilterPatterns == 1 ) /*test because poor osx behaviour*/\n                                && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) )\n                {\n                        strcat(lDialogString , \"filetypes=(\" ) ;\n                        strcat( lDialogString , \"('\" ) ;\n                        if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                        {\n                                strcat( lDialogString , aSingleFilterDescription ) ;\n                        }\n                        strcat( lDialogString , \"',(\" ) ;\n                        for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ )\n                        {\n                                strcat( lDialogString , \"'\" ) ;\n                                strcat( lDialogString , aFilterPatterns [i] ) ;\n                                strcat( lDialogString , \"',\" ) ;\n                        }\n                        strcat( lDialogString , \")),\" ) ;\n                        strcat( lDialogString , \"('All files','*'))\" ) ;\n                }\n                strcat( lDialogString , \");\\\n\\nif not isinstance(lFiles, tuple):\\n\\tprint lFiles\\nelse:\\\n\\n\\tlFilesString=''\\n\\tfor lFile in lFiles:\\n\\t\\tlFilesString+=str(lFile)+'|'\\\n\\n\\tprint lFilesString[:-1]\\n\\\"\" ) ;\n        }\n        else if ( tkinter3Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python3-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython3Name ) ;\n                strcat( lDialogString ,\n                        \" -S -c \\\"import tkinter;from tkinter import filedialog;root=tkinter.Tk();root.withdraw();\");\n                strcat( lDialogString , \"lFiles=filedialog.askopenfilename(\");\n                if ( aAllowMultipleSelects )\n                {\n                        strcat( lDialogString , \"multiple=1,\" ) ;\n                }\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"',\") ;\n                }\n                if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n                {\n                        getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ;\n                        if ( strlen(lString) )\n                        {\n                                strcat(lDialogString, \"initialdir='\") ;\n                                strcat(lDialogString, lString ) ;\n                                strcat(lDialogString , \"',\" ) ;\n                        }\n                        getLastName( lString , aDefaultPathAndFile ) ;\n                        if ( strlen(lString) )\n                        {\n                                strcat(lDialogString, \"initialfile='\") ;\n                                strcat(lDialogString, lString ) ;\n                                strcat(lDialogString , \"',\" ) ;\n                        }\n                }\n                if ( ( aNumOfFilterPatterns > 1 )\n                        || ( ( aNumOfFilterPatterns == 1 ) /*test because poor osx behaviour*/\n                        && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) )\n                {\n                        strcat(lDialogString , \"filetypes=(\" ) ;\n                        strcat( lDialogString , \"('\" ) ;\n                        if ( aSingleFilterDescription && strlen(aSingleFilterDescription) )\n                        {\n                                strcat( lDialogString , aSingleFilterDescription ) ;\n                        }\n                        strcat( lDialogString , \"',(\" ) ;\n                        for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ )\n                        {\n                                strcat( lDialogString , \"'\" ) ;\n                                strcat( lDialogString , aFilterPatterns [i] ) ;\n                                strcat( lDialogString , \"',\" ) ;\n                        }\n                        strcat( lDialogString , \")),\" ) ;\n                        strcat( lDialogString , \"('All files','*'))\" ) ;\n                }\n                strcat( lDialogString , \");\\\n\\nif not isinstance(lFiles, tuple):\\n\\tprint(lFiles)\\nelse:\\\n\\n\\tlFilesString=''\\n\\tfor lFile in lFiles:\\n\\t\\tlFilesString+=str(lFile)+'|'\\\n\\n\\tprint(lFilesString[:-1])\\n\\\"\" ) ;\n        }\n        else if ( xdialogPresent() || dialogName() )\n        {\n                if ( xdialogPresent( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"xdialog\");return (char const *)1;}\n                        lWasGraphicDialog = 1 ;\n                        strcpy( lDialogString , \"(Xdialog \" ) ;\n                }\n                else if ( isTerminalRunning( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                        strcpy( lDialogString , \"(dialog \" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                        lWasXterm = 1 ;\n                        strcpy( lDialogString , terminalName() ) ;\n                        strcat( lDialogString , \"'(\" ) ;\n                        strcat( lDialogString , dialogName() ) ;\n                        strcat( lDialogString , \" \" ) ;\n                }\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"--title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                if ( !xdialogPresent() && !gdialogPresent() )\n                {\n                        strcat(lDialogString, \"--backtitle \\\"\") ;\n                        strcat(lDialogString,\n                                \"tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY\") ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                strcat( lDialogString , \"--fselect \\\"\" ) ;\n                if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) )\n                {\n                        if ( ! strchr(aDefaultPathAndFile, '/') )\n                        {\n                                strcat(lDialogString, \"./\") ;\n                        }\n                        strcat(lDialogString, aDefaultPathAndFile) ;\n                }\n                else if ( ! isTerminalRunning( ) && !lWasGraphicDialog )\n                {\n                        strcat(lDialogString, getenv(\"HOME\")) ;\n                        strcat(lDialogString, \"/\");\n                }\n                else\n                {\n                        strcat(lDialogString, \"./\") ;\n                }\n\n                if ( lWasGraphicDialog )\n                {\n                        strcat(lDialogString, \"\\\" 0 60 ) 2>&1 \") ;\n                }\n                else\n                {\n                        strcat(lDialogString, \"\\\" 0 60  >/dev/tty) \") ;\n                        if ( lWasXterm )\n                        {\n                                strcat( lDialogString ,\n                                \"2>/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt\");\n                        }\n                        else\n                        {\n                                strcat(lDialogString, \"2>&1 ; clear >/dev/tty\") ;\n                        }\n                }\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){return tinyfd_inputBox(aTitle,NULL,NULL);}\n                p2 = tinyfd_inputBox(aTitle, \"Open file\",\"\");\n                if ( ! fileExists(p2) )\n                {\n                        return NULL ;\n                }\n                return p2 ;\n        }\n\n    if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;\n    if ( ! ( lIn = popen( lDialogString , \"r\" ) ) )\n    {\n        return NULL ;\n    }\n        lBuff[0]='\\0';\n        p=lBuff;\n        while ( fgets( p , sizeof( lBuff ) , lIn ) != NULL )\n        {\n                p += strlen( p );\n        }\n    pclose( lIn ) ;\n    if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n    {\n        lBuff[strlen( lBuff ) -1] = '\\0' ;\n    }\n    /* printf( \"lBuff: %s\\n\" , lBuff ) ; */\n        if ( lWasKdialog && aAllowMultipleSelects )\n        {\n                p = lBuff ;\n                while ( ( p = strchr( p , '\\n' ) ) )\n                        * p = '|' ;\n        }\n        /* printf( \"lBuff2: %s\\n\" , lBuff ) ; */\n        if ( ! strlen( lBuff )  )\n        {\n                return NULL;\n        }\n        if ( aAllowMultipleSelects && strchr(lBuff, '|') )\n        {\n                p2 = ensureFilesExist( lBuff , lBuff ) ;\n        }\n        else if ( fileExists(lBuff) )\n        {\n                p2 = lBuff ;\n        }\n        else\n        {\n                return NULL ;\n        }\n        /* printf( \"lBuff3: %s\\n\" , p2 ) ; */\n\n        return p2 ;\n}\n\n\nchar const * tinyfd_selectFolderDialog(\n        char const * const aTitle , /* \"\" */\n        char const * const aDefaultPath ) /* \"\" */\n{\n        static char lBuff [MAX_PATH_OR_CMD] ;\n        char lDialogString [MAX_PATH_OR_CMD] ;\n        FILE * lIn ;\n        char const * p ;\n        int lWasGraphicDialog = 0 ;\n        int lWasXterm = 0 ;\n        lBuff[0]='\\0';\n\n        if ( osascriptPresent( ))\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"applescript\");return (char const *)1;}\n                strcpy( lDialogString , \"osascript \");\n                if ( ! osx9orBetter() ) strcat( lDialogString , \" -e 'tell application \\\"System Events\\\"' -e 'Activate'\");\n                strcat( lDialogString , \" -e 'try' -e 'POSIX path of ( choose folder \");\n                if ( aTitle && strlen(aTitle) )\n                {\n                strcat(lDialogString, \"with prompt \\\"\") ;\n                strcat(lDialogString, aTitle) ;\n                strcat(lDialogString, \"\\\" \") ;\n                }\n                if ( aDefaultPath && strlen(aDefaultPath) )\n                {\n                        strcat(lDialogString, \"default location \\\"\") ;\n                        strcat(lDialogString, aDefaultPath ) ;\n                        strcat(lDialogString , \"\\\" \" ) ;\n                }\n                strcat( lDialogString , \")' \" ) ;\n                strcat(lDialogString, \"-e 'on error number -128' \" ) ;\n                strcat(lDialogString, \"-e 'end try'\") ;\n                if ( ! osx9orBetter() ) strcat( lDialogString, \" -e 'end tell'\") ;\n        }\n        else if ( kdialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"kdialog\");return (char const *)1;}\n                strcpy( lDialogString , \"kdialog\" ) ;\n                if ( kdialogPresent() == 2 )\n                {\n                        strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                }\n                strcat( lDialogString , \" --getexistingdirectory \" ) ;\n\n                if ( aDefaultPath && strlen(aDefaultPath) )\n                {\n                        if ( aDefaultPath[0] != '/' )\n                        {\n                                strcat(lDialogString, \"$PWD/\") ;\n                        }\n                        strcat(lDialogString, \"\\\"\") ;\n                        strcat(lDialogString, aDefaultPath ) ;\n                        strcat(lDialogString , \"\\\"\" ) ;\n                }\n                else\n                {\n                        strcat(lDialogString, \"$PWD/\") ;\n                }\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n        }\n        else if ( zenityPresent() || matedialogPresent() || shellementaryPresent() || qarmaPresent() )\n        {\n                if ( zenityPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"zenity\");return (char const *)1;}\n                        strcpy( lDialogString , \"zenity\" ) ;\n                        if ( (zenity3Present() >= 4) && !getenv(\"SSH_TTY\") )\n                        {\n                                strcat( lDialogString, \" --attach=$(sleep .01;xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                else if ( matedialogPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"matedialog\");return (char const *)1;}\n                        strcpy( lDialogString , \"matedialog\" ) ;\n                }\n                else if ( shellementaryPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"shellementary\");return (char const *)1;}\n                        strcpy( lDialogString , \"shellementary\" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"qarma\");return (char const *)1;}\n                        strcpy( lDialogString , \"qarma\" ) ;\n                        if ( !getenv(\"SSH_TTY\") )\n                        {\n                                strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                strcat( lDialogString , \" --file-selection --directory\" ) ;\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title=\\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if ( aDefaultPath && strlen(aDefaultPath) )\n                {\n                        strcat(lDialogString, \" --filename=\\\"\") ;\n                        strcat(lDialogString, aDefaultPath) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if (tinyfd_silent) strcat( lDialogString , \" 2>/dev/null \");\n        }\n        else if ( !xdialogPresent() && tkinter2Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python2-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython2Name ) ;\n                if ( ! isTerminalRunning( ) && isDarwin( ) )\n                {\n                strcat( lDialogString , \" -i\" ) ;  /* for osx without console */\n                }\n        strcat( lDialogString ,\n\" -S -c \\\"import Tkinter,tkFileDialog;root=Tkinter.Tk();root.withdraw();\");\n\n        if ( isDarwin( ) )\n        {\n                        strcat( lDialogString ,\n\"import os;os.system('''/usr/bin/osascript -e 'tell app \\\\\\\"Finder\\\\\\\" to set \\\nfrontmost of process \\\\\\\"Python\\\\\\\" to true' ''');\");\n                }\n\n                strcat( lDialogString , \"print tkFileDialog.askdirectory(\");\n            if ( aTitle && strlen(aTitle) )\n            {\n                        strcat(lDialogString, \"title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"',\") ;\n            }\n        if ( aDefaultPath && strlen(aDefaultPath) )\n        {\n                                strcat(lDialogString, \"initialdir='\") ;\n                                strcat(lDialogString, aDefaultPath ) ;\n                                strcat(lDialogString , \"'\" ) ;\n                }\n                strcat( lDialogString , \")\\\"\" ) ;\n        }\n        else if ( !xdialogPresent() && tkinter3Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python3-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython3Name ) ;\n                strcat( lDialogString ,\n                        \" -S -c \\\"import tkinter;from tkinter import filedialog;root=tkinter.Tk();root.withdraw();\");\n                strcat( lDialogString , \"print( filedialog.askdirectory(\");\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"',\") ;\n                }\n                if ( aDefaultPath && strlen(aDefaultPath) )\n                {\n                        strcat(lDialogString, \"initialdir='\") ;\n                        strcat(lDialogString, aDefaultPath ) ;\n                        strcat(lDialogString , \"'\" ) ;\n                }\n                strcat( lDialogString , \") )\\\"\" ) ;\n        }\n        else if ( xdialogPresent() || dialogName() )\n        {\n                if ( xdialogPresent( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"xdialog\");return (char const *)1;}\n                        lWasGraphicDialog = 1 ;\n                        strcpy( lDialogString , \"(Xdialog \" ) ;\n                }\n                else if ( isTerminalRunning( ) )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                        strcpy( lDialogString , \"(dialog \" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"dialog\");return (char const *)0;}\n                        lWasXterm = 1 ;\n                        strcpy( lDialogString , terminalName() ) ;\n                        strcat( lDialogString , \"'(\" ) ;\n                        strcat( lDialogString , dialogName() ) ;\n                        strcat( lDialogString , \" \" ) ;\n                }\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \"--title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                if ( !xdialogPresent() && !gdialogPresent() )\n                {\n                        strcat(lDialogString, \"--backtitle \\\"\") ;\n                        strcat(lDialogString,\n                                \"tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY\") ;\n                        strcat(lDialogString, \"\\\" \") ;\n                }\n\n                strcat( lDialogString , \"--dselect \\\"\" ) ;\n                if ( aDefaultPath && strlen(aDefaultPath) )\n                {\n                        strcat(lDialogString, aDefaultPath) ;\n                        ensureFinalSlash(lDialogString);\n                }\n                else if ( ! isTerminalRunning( ) && !lWasGraphicDialog )\n                {\n                        strcat(lDialogString, getenv(\"HOME\")) ;\n                        strcat(lDialogString, \"/\");\n                }\n                else\n                {\n                        strcat(lDialogString, \"./\") ;\n                }\n\n                if ( lWasGraphicDialog )\n                {\n                        strcat(lDialogString, \"\\\" 0 60 ) 2>&1 \") ;\n                }\n                else\n                {\n                        strcat(lDialogString, \"\\\" 0 60  >/dev/tty) \") ;\n                        if ( lWasXterm )\n                        {\n                          strcat( lDialogString ,\n                                \"2>/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt\");\n                        }\n                        else\n                        {\n                                strcat(lDialogString, \"2>&1 ; clear >/dev/tty\") ;\n                        }\n                }\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){return tinyfd_inputBox(aTitle,NULL,NULL);}\n                p = tinyfd_inputBox(aTitle, \"Select folder\",\"\");\n                if ( !p || ! strlen( p ) || ! dirExists( p ) )\n                {\n                        return NULL ;\n                }\n                return p ;\n        }\n    if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;\n    if ( ! ( lIn = popen( lDialogString , \"r\" ) ) )\n    {\n        return NULL ;\n    }\n        while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n        {}\n        pclose( lIn ) ;\n    if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n    {\n        lBuff[strlen( lBuff ) -1] = '\\0' ;\n    }\n        /* printf( \"lBuff: %s\\n\" , lBuff ) ; */\n        if ( ! strlen( lBuff ) || ! dirExists( lBuff ) )\n        {\n                return NULL ;\n        }\n        return lBuff ;\n}\n\n\n/* returns the hexcolor as a string \"#FF0000\" */\n/* aoResultRGB also contains the result */\n/* aDefaultRGB is used only if aDefaultHexRGB is NULL */\n/* aDefaultRGB and aoResultRGB can be the same array */\nchar const * tinyfd_colorChooser(\n        char const * const aTitle , /* NULL or \"\" */\n        char const * const aDefaultHexRGB , /* NULL or \"#FF0000\"*/\n        unsigned char const aDefaultRGB[3] , /* { 0 , 255 , 255 } */\n        unsigned char aoResultRGB[3] ) /* { 0 , 0 , 0 } */\n{\n        static char lBuff [128] ;\n        char lTmp [128] ;\n#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L\n       char * lTmp2 ;\n#endif\n        char lDialogString [MAX_PATH_OR_CMD] ;\n        char lDefaultHexRGB[8];\n        char * lpDefaultHexRGB;\n        unsigned char lDefaultRGB[3];\n        char const * p;\n        FILE * lIn ;\n        int i ;\n        int lWasZenity3 = 0 ;\n        int lWasOsascript = 0 ;\n        int lWasXdialog = 0 ;\n        lBuff[0]='\\0';\n\n        if ( aDefaultHexRGB )\n        {\n                Hex2RGB( aDefaultHexRGB , lDefaultRGB ) ;\n                lpDefaultHexRGB = (char *) aDefaultHexRGB ;\n        }\n        else\n        {\n                lDefaultRGB[0]=aDefaultRGB[0];\n                lDefaultRGB[1]=aDefaultRGB[1];\n                lDefaultRGB[2]=aDefaultRGB[2];\n                RGB2Hex( aDefaultRGB , lDefaultHexRGB ) ;\n                lpDefaultHexRGB = (char *) lDefaultHexRGB ;\n        }\n\n        if ( osascriptPresent( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"applescript\");return (char const *)1;}\n                lWasOsascript = 1 ;\n                strcpy( lDialogString , \"osascript\");\n\n                if ( ! osx9orBetter() )\n                {\n                        strcat( lDialogString , \" -e 'tell application \\\"System Events\\\"' -e 'Activate'\");\n                        strcat( lDialogString , \" -e 'try' -e 'set mycolor to choose color default color {\");\n                }\n                else\n                {\n                        strcat( lDialogString ,\n\" -e 'try' -e 'tell app (path to frontmost application as Unicode text) \\\nto set mycolor to choose color default color {\");\n                }\n\n                sprintf(lTmp, \"%d\", 256 * lDefaultRGB[0] ) ;\n                strcat(lDialogString, lTmp ) ;\n                strcat(lDialogString, \",\" ) ;\n                sprintf(lTmp, \"%d\", 256 * lDefaultRGB[1] ) ;\n                strcat(lDialogString, lTmp ) ;\n                strcat(lDialogString, \",\" ) ;\n                sprintf(lTmp, \"%d\", 256 * lDefaultRGB[2] ) ;\n                strcat(lDialogString, lTmp ) ;\n                strcat(lDialogString, \"}' \" ) ;\n                strcat( lDialogString ,\n\"-e 'set mystring to ((item 1 of mycolor) div 256 as integer) as string' \" );\n                strcat( lDialogString ,\n\"-e 'repeat with i from 2 to the count of mycolor' \" );\n                strcat( lDialogString ,\n\"-e 'set mystring to mystring & \\\" \\\" & ((item i of mycolor) div 256 as integer) as string' \" );\n                strcat( lDialogString , \"-e 'end repeat' \" );\n                strcat( lDialogString , \"-e 'mystring' \");\n                strcat(lDialogString, \"-e 'on error number -128' \" ) ;\n                strcat(lDialogString, \"-e 'end try'\") ;\n                if ( ! osx9orBetter() ) strcat( lDialogString, \" -e 'end tell'\") ;\n        }\n        else if ( kdialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"kdialog\");return (char const *)1;}\n                strcpy( lDialogString , \"kdialog\" ) ;\n                if ( kdialogPresent() == 2 )\n                {\n                        strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                }\n                sprintf( lDialogString + strlen(lDialogString) , \" --getcolor --default '%s'\" , lpDefaultHexRGB ) ;\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title \\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n        }\n        else if ( zenity3Present() || matedialogPresent() || shellementaryPresent() || qarmaPresent() )\n        {\n                lWasZenity3 = 1 ;\n                if ( zenity3Present() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"zenity3\");return (char const *)1;}\n                        strcpy( lDialogString , \"zenity\" );\n                        if ( (zenity3Present() >= 4) && !getenv(\"SSH_TTY\") )\n                        {\n                                strcat( lDialogString, \" --attach=$(sleep .01;xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                else if ( matedialogPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"matedialog\");return (char const *)1;}\n                        strcpy( lDialogString , \"matedialog\" ) ;\n                }\n                else if ( shellementaryPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"shellementary\");return (char const *)1;}\n                        strcpy( lDialogString , \"shellementary\" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"qarma\");return (char const *)1;}\n                        strcpy( lDialogString , \"qarma\" ) ;\n                        if ( !getenv(\"SSH_TTY\") )\n                        {\n                                strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                strcat( lDialogString , \" --color-selection --show-palette\" ) ;\n                sprintf( lDialogString + strlen(lDialogString), \" --color=%s\" , lpDefaultHexRGB ) ;\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title=\\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n                if (tinyfd_silent) strcat( lDialogString , \" 2>/dev/null \");\n        }\n        else if ( xdialogPresent() )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"xdialog\");return (char const *)1;}\n                lWasXdialog = 1 ;\n                strcpy( lDialogString , \"Xdialog --colorsel \\\"\" ) ;\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, aTitle) ;\n                }\n                strcat(lDialogString, \"\\\" 0 60 \") ;\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n                sprintf(lTmp,\"%hhu %hhu %hhu\",lDefaultRGB[0],lDefaultRGB[1],lDefaultRGB[2]);\n#else\n                sprintf(lTmp,\"%hu %hu %hu\",lDefaultRGB[0],lDefaultRGB[1],lDefaultRGB[2]);\n#endif\n                strcat(lDialogString, lTmp) ;\n                strcat(lDialogString, \" 2>&1\");\n        }\n        else if ( tkinter2Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python2-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython2Name ) ;\n                if ( ! isTerminalRunning( ) && isDarwin( ) )\n                {\n                strcat( lDialogString , \" -i\" ) ;  /* for osx without console */\n                }\n\n                strcat( lDialogString ,\n\" -S -c \\\"import Tkinter,tkColorChooser;root=Tkinter.Tk();root.withdraw();\");\n\n                if ( isDarwin( ) )\n                {\n                        strcat( lDialogString ,\n\"import os;os.system('''osascript -e 'tell app \\\\\\\"Finder\\\\\\\" to set \\\nfrontmost of process \\\\\\\"Python\\\\\\\" to true' ''');\");\n                }\n\n                strcat( lDialogString , \"res=tkColorChooser.askcolor(color='\" ) ;\n                strcat(lDialogString, lpDefaultHexRGB ) ;\n                strcat(lDialogString, \"'\") ;\n\n\n            if ( aTitle && strlen(aTitle) )\n            {\n                        strcat(lDialogString, \",title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"'\") ;\n            }\n                strcat( lDialogString , \");\\\n\\nif res[1] is not None:\\n\\tprint res[1]\\\"\" ) ;\n        }\n        else if ( tkinter3Present( ) )\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"python3-tkinter\");return (char const *)1;}\n                strcpy( lDialogString , gPython3Name ) ;\n                strcat( lDialogString ,\n                        \" -S -c \\\"import tkinter;from tkinter import colorchooser;root=tkinter.Tk();root.withdraw();\");\n                strcat( lDialogString , \"res=colorchooser.askcolor(color='\" ) ;\n                strcat(lDialogString, lpDefaultHexRGB ) ;\n                strcat(lDialogString, \"'\") ;\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \",title='\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"'\") ;\n                }\n                strcat( lDialogString , \");\\\n\\nif res[1] is not None:\\n\\tprint(res[1])\\\"\" ) ;\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){return tinyfd_inputBox(aTitle,NULL,NULL);}\n                p = tinyfd_inputBox(aTitle,\n                                \"Enter hex rgb color (i.e. #f5ca20)\",lpDefaultHexRGB);\n                if ( !p || (strlen(p) != 7) || (p[0] != '#') )\n                {\n                        return NULL ;\n                }\n                for ( i = 1 ; i < 7 ; i ++ )\n                {\n                        if ( ! isxdigit( p[i] ) )\n                        {\n                                return NULL ;\n                        }\n                }\n                Hex2RGB(p,aoResultRGB);\n                return p ;\n        }\n\n        if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;\n        if ( ! ( lIn = popen( lDialogString , \"r\" ) ) )\n        {\n                return NULL ;\n    }\n        while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n        {\n        }\n        pclose( lIn ) ;\n    if ( ! strlen( lBuff ) )\n    {\n        return NULL ;\n    }\n        /* printf( \"len Buff: %lu\\n\" , strlen(lBuff) ) ; */\n        /* printf( \"lBuff0: %s\\n\" , lBuff ) ; */\n    if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n    {\n        lBuff[strlen( lBuff ) -1] = '\\0' ;\n    }\n\n        if ( lWasZenity3 )\n    {\n                if ( lBuff[0] == '#' )\n                {\n                        if ( strlen(lBuff)>7 )\n                        {\n                                lBuff[3]=lBuff[5];\n                                lBuff[4]=lBuff[6];\n                                lBuff[5]=lBuff[9];\n                                lBuff[6]=lBuff[10];\n                                lBuff[7]='\\0';\n                        }\n                Hex2RGB(lBuff,aoResultRGB);\n                }\n                else if ( lBuff[3] == '(' ) {\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n    sscanf(lBuff,\"rgb(%hhu,%hhu,%hhu\", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]);\n#else\n    aoResultRGB[0] = strtol(lBuff+4, & lTmp2, 10 );\n    aoResultRGB[1] = strtol(lTmp2+1, & lTmp2, 10 );\n    aoResultRGB[2] = strtol(lTmp2+1, NULL, 10 );\n#endif\n    RGB2Hex(aoResultRGB,lBuff);\n                }\n                else if ( lBuff[4] == '(' ) {\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n    sscanf(lBuff,\"rgba(%hhu,%hhu,%hhu\",  & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]);\n#else\n    aoResultRGB[0] = strtol(lBuff+5, & lTmp2, 10 );\n    aoResultRGB[1] = strtol(lTmp2+1, & lTmp2, 10 );\n    aoResultRGB[2] = strtol(lTmp2+1, NULL, 10 );\n#endif\n    RGB2Hex(aoResultRGB,lBuff);\n                }\n    }\n    else if ( lWasOsascript || lWasXdialog )\n    {\n                /* printf( \"lBuff: %s\\n\" , lBuff ) ; */\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n    sscanf(lBuff,\"%hhu %hhu %hhu\", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]);\n#else\n    aoResultRGB[0] = strtol(lBuff, & lTmp2, 10 );\n    aoResultRGB[1] = strtol(lTmp2+1, & lTmp2, 10 );\n    aoResultRGB[2] = strtol(lTmp2+1, NULL, 10 );\n#endif\n    RGB2Hex(aoResultRGB,lBuff);\n    }\n    else\n    {\n                Hex2RGB(lBuff,aoResultRGB);\n        }\n        /* printf(\"%d %d %d\\n\", aoResultRGB[0],aoResultRGB[1],aoResultRGB[2]); */\n        /* printf( \"lBuff: %s\\n\" , lBuff ) ; */\n        return lBuff ;\n}\n\n\n/* not cross platform - zenity only */\n/* contributed by Attila Dusnoki */\nchar const * tinyfd_arrayDialog(\n        char const * const aTitle , /* \"\" */\n        int const aNumOfColumns , /* 2 */\n        char const * const * const aColumns , /* {\"Column 1\",\"Column 2\"} */\n        int const aNumOfRows , /* 2 */\n        char const * const * const aCells )\n                /* {\"Row1 Col1\",\"Row1 Col2\",\"Row2 Col1\",\"Row2 Col2\"} */\n{\n        static char lBuff [MAX_PATH_OR_CMD] ;\n        char lDialogString [MAX_PATH_OR_CMD] ;\n        FILE * lIn ;\n        int i ;\n\n        lBuff[0]='\\0';\n\n        if ( zenityPresent() || matedialogPresent() || shellementaryPresent() || qarmaPresent() )\n        {\n                if ( zenityPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"zenity\");return (char const *)1;}\n                        strcpy( lDialogString , \"zenity\" ) ;\n                        if ( (zenity3Present() >= 4) && !getenv(\"SSH_TTY\") )\n                        {\n                                strcat( lDialogString, \" --attach=$(sleep .01;xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                else if ( matedialogPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"matedialog\");return (char const *)1;}\n                        strcpy( lDialogString , \"matedialog\" ) ;\n                }\n                else if ( shellementaryPresent() )\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"shellementary\");return (char const *)1;}\n                        strcpy( lDialogString , \"shellementary\" ) ;\n                }\n                else\n                {\n                        if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"qarma\");return (char const *)1;}\n                        strcpy( lDialogString , \"qarma\" ) ;\n                        if ( !getenv(\"SSH_TTY\") )\n                        {\n                                strcat(lDialogString, \" --attach=$(xprop -root 32x '\\t$0' _NET_ACTIVE_WINDOW | cut -f 2)\"); /* contribution: Paul Rouget */\n                        }\n                }\n                strcat( lDialogString , \" --list --print-column=ALL\" ) ;\n\n                if ( aTitle && strlen(aTitle) )\n                {\n                        strcat(lDialogString, \" --title=\\\"\") ;\n                        strcat(lDialogString, aTitle) ;\n                        strcat(lDialogString, \"\\\"\") ;\n                }\n\n                if ( aColumns && (aNumOfColumns > 0) )\n                {\n                        for ( i = 0 ; i < aNumOfColumns ; i ++ )\n                        {\n                                strcat( lDialogString , \" --column=\\\"\" ) ;\n                                strcat( lDialogString , aColumns [i] ) ;\n                                strcat( lDialogString , \"\\\"\" ) ;\n                        }\n                }\n\n                if ( aCells && (aNumOfRows > 0) )\n                {\n                        strcat( lDialogString , \" \" ) ;\n                        for ( i = 0 ; i < aNumOfRows*aNumOfColumns ; i ++ )\n                        {\n                                strcat( lDialogString , \"\\\"\" ) ;\n                                strcat( lDialogString , aCells [i] ) ;\n                                strcat( lDialogString , \"\\\" \" ) ;\n                        }\n                }\n        }\n        else\n        {\n                if (aTitle&&!strcmp(aTitle,\"tinyfd_query\")){strcpy(tinyfd_response,\"\");return (char const *)0;}\n                return NULL ;\n        }\n\n        if (tinyfd_verbose) printf( \"lDialogString: %s\\n\" , lDialogString ) ;\n        if ( ! ( lIn = popen( lDialogString , \"r\" ) ) )\n        {\n                return NULL ;\n        }\n        while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL )\n        {}\n        pclose( lIn ) ;\n        if ( lBuff[strlen( lBuff ) -1] == '\\n' )\n        {\n                lBuff[strlen( lBuff ) -1] = '\\0' ;\n        }\n        /* printf( \"lBuff: %s\\n\" , lBuff ) ; */\n        if ( ! strlen( lBuff ) )\n        {\n                return NULL ;\n        }\n        return lBuff ;\n}\n#endif /* _WIN32 */\n\n\n/*\nint main( int argc , char * argv[] )\n{\nchar const * lTmp;\nchar const * lTheSaveFileName;\nchar const * lTheOpenFileName;\nchar const * lTheSelectFolderName;\nchar const * lTheHexColor;\nchar const * lWillBeGraphicMode;\nunsigned char lRgbColor[3];\nFILE * lIn;\nchar lBuffer[1024];\nchar lString[1024];\nchar const * lFilterPatterns[2] = { \"*.txt\", \"*.text\" };\n\ntinyfd_verbose = argc - 1;\ntinyfd_silent = 1;\n\nlWillBeGraphicMode = tinyfd_inputBox(\"tinyfd_query\", NULL, NULL);\n\nstrcpy(lBuffer, \"v\");\nstrcat(lBuffer, tinyfd_version);\nif (lWillBeGraphicMode)\n{\n    strcat(lBuffer, \"\\ngraphic mode: \");\n}\nelse\n{\n    strcat(lBuffer, \"\\nconsole mode: \");\n}\nstrcat(lBuffer, tinyfd_response);\nstrcat(lBuffer, \"\\n\");\nstrcat(lBuffer, tinyfd_needs+78);\nstrcpy(lString, \"tinyfiledialogs\");\ntinyfd_messageBox(lString, lBuffer, \"ok\", \"info\", 0);\n\ntinyfd_notifyPopup(\"the title\", \"the message\\n\\tfrom outer-space\", \"info\");\n\nif (lWillBeGraphicMode && !tinyfd_forceConsole)\n{\n        tinyfd_forceConsole = ! tinyfd_messageBox(\"Hello World\",\n                \"graphic dialogs [yes] / console mode [no]?\",\n                \"yesno\", \"question\", 1);\n}\n\nlTmp = tinyfd_inputBox(\n        \"a password box\", \"your password will be revealed\", NULL);\n\nif (!lTmp) return 1;\n\nstrcpy(lString, lTmp);\n\nlTheSaveFileName = tinyfd_saveFileDialog(\n        \"let us save this password\",\n        \"passwordFile.txt\",\n        2,\n        lFilterPatterns,\n        NULL);\n\nif (!lTheSaveFileName)\n{\n        tinyfd_messageBox(\n                \"Error\",\n                \"Save file name is NULL\",\n                \"ok\",\n                \"error\",\n                1);\n        return 1;\n}\n\nlIn = fopen(lTheSaveFileName, \"w\");\nif (!lIn)\n{\n        tinyfd_messageBox(\n                \"Error\",\n                \"Can not open this file in write mode\",\n                \"ok\",\n                \"error\",\n                1);\n        return 1;\n}\nfputs(lString, lIn);\nfclose(lIn);\n\nlTheOpenFileName = tinyfd_openFileDialog(\n        \"let us read the password back\",\n        \"\",\n        2,\n        lFilterPatterns,\n        NULL,\n        0);\n\nif (!lTheOpenFileName)\n{\n        tinyfd_messageBox(\n                \"Error\",\n                \"Open file name is NULL\",\n                \"ok\",\n                \"error\",\n                1);\n        return 1;\n}\n\nlIn = fopen(lTheOpenFileName, \"r\");\n\nif (!lIn)\n{\n        tinyfd_messageBox(\n                \"Error\",\n                \"Can not open this file in read mode\",\n                \"ok\",\n                \"error\",\n                1);\n        return(1);\n}\nlBuffer[0] = '\\0';\nfgets(lBuffer, sizeof(lBuffer), lIn);\nfclose(lIn);\n\ntinyfd_messageBox(\"your password is\",\n        lBuffer, \"ok\", \"info\", 1);\n\nlTheSelectFolderName = tinyfd_selectFolderDialog(\n        \"let us just select a directory\", NULL);\n\nif (!lTheSelectFolderName)\n{\n        tinyfd_messageBox(\n                \"Error\",\n                \"Select folder name is NULL\",\n                \"ok\",\n                \"error\",\n                1);\n        return 1;\n}\n\ntinyfd_messageBox(\"The selected folder is\",\n        lTheSelectFolderName, \"ok\", \"info\", 1);\n\nlTheHexColor = tinyfd_colorChooser(\n        \"choose a nice color\",\n        \"#FF0077\",\n        lRgbColor,\n        lRgbColor);\n\nif (!lTheHexColor)\n{\n        tinyfd_messageBox(\n                \"Error\",\n                \"hexcolor is NULL\",\n                \"ok\",\n                \"error\",\n                1);\n        return 1;\n}\n\ntinyfd_messageBox(\"The selected hexcolor is\",\n        lTheHexColor, \"ok\", \"info\", 1);\n\n        tinyfd_beep();\n\n        return 0;\n}\n*/\n\n#ifdef _MSC_VER\n#pragma warning(default:4996)\n#pragma warning(default:4100)\n#pragma warning(default:4706)\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.h",
    "content": "/*_________\n /         \\ tinyfiledialogs.h v3.4.3 [Dec 8, 2019] zlib licence\n |tiny file| Unique header file created [November 9, 2014]\n | dialogs | Copyright (c) 2014 - 2018 Guillaume Vareille http://ysengrin.com\n \\____  ___/ http://tinyfiledialogs.sourceforge.net\n      \\|     git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd\n\t\t ____________________________________________\n\t\t|                                            |\n\t\t|   email: tinyfiledialogs at ysengrin.com   |\n\t\t|____________________________________________|\n         ________________________________________________________________________\n        |                                                                        |\n        | the windows only wchar_t UTF-16 prototypes are at the end of this file |\n        |________________________________________________________________________|\n\nPlease upvote my stackoverflow answer https://stackoverflow.com/a/47651444\n\ntiny file dialogs (cross-platform C C++)\nInputBox PasswordBox MessageBox ColorPicker\nOpenFileDialog SaveFileDialog SelectFolderDialog\nNative dialog library for WINDOWS MAC OSX GTK+ QT CONSOLE & more\nSSH supported via automatic switch to console mode or X11 forwarding\n\none C file + a header (add them to your C or C++ project) with 8 functions:\n- beep\n- notify popup (tray)\n- message & question\n- input & password\n- save file\n- open file(s)\n- select folder\n- color picker\n\nComplements OpenGL Vulkan GLFW GLUT GLUI VTK SFML TGUI\nSDL Ogre Unity3d ION OpenCV CEGUI MathGL GLM CPW GLOW\nOpen3D IMGUI MyGUI GLT NGL STB & GUI less programs\n\nNO INIT\nNO MAIN LOOP\nNO LINKING\nNO INCLUDE\n\nThe dialogs can be forced into console mode\n\nWindows (XP to 10) ASCII MBCS UTF-8 UTF-16\n- native code & vbs create the graphic dialogs\n- enhanced console mode can use dialog.exe from\nhttp://andrear.altervista.org/home/cdialog.php\n- basic console input\n\nUnix (command line calls) ASCII UTF-8\n- applescript, kdialog, zenity\n- python (2 or 3) + tkinter + python-dbus (optional)\n- dialog (opens a console if needed)\n- basic console input\nThe same executable can run across desktops & distributions\n\nC89 & C++98 compliant: tested with C & C++ compilers\nVisualStudio MinGW-gcc GCC Clang TinyCC OpenWatcom-v2 BorlandC SunCC ZapCC\non Windows Mac Linux Bsd Solaris Minix Raspbian\nusing Gnome Kde Enlightenment Mate Cinnamon Budgie Unity Lxde Lxqt Xfce\nWindowMaker IceWm Cde Jds OpenBox Awesome Jwm Xdm\n\nBindings for LUA and C# dll, Haskell\nIncluded in LWJGL(java), Rust, Allegrobasic\n\n- License -\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software.  If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef TINYFILEDIALOGS_H\n#define TINYFILEDIALOGS_H\n\n/* #define TINYFD_NOLIB */\n/* On windows, define TINYFD_NOLIB here\nif you don't want to include the code creating the graphic dialogs.\nThen you won't need to link against Comdlg32.lib and Ole32.lib */\n\n/* if tinydialogs.c is compiled as C++ code rather than C code,\nyou may need to comment out:\nextern \"C\" {\nand the corresponding closing bracket near the end of this file:\n}\n*/\n#ifdef\t__cplusplus\nextern \"C\" {\n#endif\n\nextern char const tinyfd_version[8]; /* contains tinyfd current version number */\nextern char const tinyfd_needs[]; /* info about requirements */\nextern int tinyfd_verbose; /* 0 (default) or 1 : on unix, prints the command line calls */\nextern int tinyfd_silent; /* 1 (default) or 0 : on unix,\n                          hide errors and warnings from called dialog*/\n\n#ifdef _WIN32\n/* for UTF-16 use the functions at the end of this files */\nextern int tinyfd_winUtf8; /* 0 (default MBCS) or 1 (UTF-8)*/\n/* on windows string char can be 0:MBCS or 1:UTF-8\nunless your code is really prepared for UTF-8 on windows, leave this on MBSC.\nOr you can use the UTF-16 (wchar) prototypes at the end of ths file.*/\n#endif\n\nextern int tinyfd_forceConsole;  /* 0 (default) or 1 */\n/* for unix & windows: 0 (graphic mode) or 1 (console mode).\n0: try to use a graphic solution, if it fails then it uses console mode.\n1: forces all dialogs into console mode even when an X server is present,\n  if the package dialog (and a console is present) or dialog.exe is installed.\n  on windows it only make sense for console applications */\n\nextern char tinyfd_response[1024];\n/* if you pass \"tinyfd_query\" as aTitle,\nthe functions will not display the dialogs\nbut will return 0 for console mode, 1 for graphic mode.\ntinyfd_response is then filled with the retain solution.\npossible values for tinyfd_response are (all lowercase)\nfor graphic mode:\n  windows_wchar windows\n  applescript kdialog zenity zenity3 matedialog qarma\n  python2-tkinter python3-tkinter python-dbus perl-dbus\n  gxmessage gmessage xmessage xdialog gdialog\nfor console mode:\n  dialog whiptail basicinput no_solution */\n\nvoid tinyfd_beep(void);\n\nint tinyfd_notifyPopup(\n\tchar const * const aTitle, /* NULL or \"\" */\n\tchar const * const aMessage, /* NULL or \"\" may contain \\n \\t */\n\tchar const * const aIconType); /* \"info\" \"warning\" \"error\" */\n\t\t/* return has only meaning for tinyfd_query */\n\nint tinyfd_messageBox(\n\tchar const * const aTitle , /* NULL or \"\" */\n\tchar const * const aMessage , /* NULL or \"\" may contain \\n \\t */\n\tchar const * const aDialogType , /* \"ok\" \"okcancel\" \"yesno\" \"yesnocancel\" */\n\tchar const * const aIconType , /* \"info\" \"warning\" \"error\" \"question\" */\n\tint const aDefaultButton ) ;\n\t\t/* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */\n\nchar const * tinyfd_inputBox(\n\tchar const * const aTitle , /* NULL or \"\" */\n\tchar const * const aMessage , /* NULL or \"\" may NOT contain \\n \\t on windows */\n\tchar const * const aDefaultInput ) ;  /* \"\" , if NULL it's a passwordBox */\n\t\t/* returns NULL on cancel */\n\nchar const * tinyfd_saveFileDialog(\n\tchar const * const aTitle , /* NULL or \"\" */\n\tchar const * const aDefaultPathAndFile , /* NULL or \"\" */\n\tint const aNumOfFilterPatterns , /* 0 */\n\tchar const * const * const aFilterPatterns , /* NULL | {\"*.jpg\",\"*.png\"} */\n\tchar const * const aSingleFilterDescription ) ; /* NULL | \"text files\" */\n\t\t/* returns NULL on cancel */\n\nchar const * tinyfd_openFileDialog(\n\tchar const * const aTitle , /* NULL or \"\" */\n\tchar const * const aDefaultPathAndFile , /* NULL or \"\" */\n\tint const aNumOfFilterPatterns , /* 0 */\n\tchar const * const * const aFilterPatterns , /* NULL | {\"*.jpg\",\"*.png\"} */\n\tchar const * const aSingleFilterDescription , /* NULL | \"image files\" */\n\tint const aAllowMultipleSelects ) ; /* 0 or 1 */\n\t\t/* in case of multiple files, the separator is | */\n\t\t/* returns NULL on cancel */\n\nchar const * tinyfd_selectFolderDialog(\n\tchar const * const aTitle , /* NULL or \"\" */\n\tchar const * const aDefaultPath ) ; /* NULL or \"\" */\n\t\t/* returns NULL on cancel */\n\nchar const * tinyfd_colorChooser(\n\tchar const * const aTitle , /* NULL or \"\" */\n\tchar const * const aDefaultHexRGB , /* NULL or \"#FF0000\" */\n\tunsigned char const aDefaultRGB[3] , /* { 0 , 255 , 255 } */\n\tunsigned char aoResultRGB[3] ) ; /* { 0 , 0 , 0 } */\n\t\t/* returns the hexcolor as a string \"#FF0000\" */\n\t\t/* aoResultRGB also contains the result */\n\t\t/* aDefaultRGB is used only if aDefaultHexRGB is NULL */\n\t\t/* aDefaultRGB and aoResultRGB can be the same array */\n\t\t/* returns NULL on cancel */\n\n\n/************ NOT CROSS PLATFORM SECTION STARTS HERE ************************/\n#ifdef _WIN32\n#ifndef TINYFD_NOLIB\n\n/* windows only - utf-16 version */\nint tinyfd_notifyPopupW(\n\twchar_t const * const aTitle, /* NULL or L\"\" */\n\twchar_t const * const aMessage, /* NULL or L\"\" may contain \\n \\t */\n\twchar_t const * const aIconType); /* L\"info\" L\"warning\" L\"error\" */\n\n/* windows only - utf-16 version */\nint tinyfd_messageBoxW(\n\twchar_t const * const aTitle , /* NULL or L\"\" */\n\twchar_t const * const aMessage, /* NULL or L\"\" may contain \\n \\t */\n\twchar_t const * const aDialogType, /* L\"ok\" L\"okcancel\" L\"yesno\" */\n\twchar_t const * const aIconType, /* L\"info\" L\"warning\" L\"error\" L\"question\" */\n\tint const aDefaultButton ); /* 0 for cancel/no , 1 for ok/yes */\n\t\t/* returns 0 for cancel/no , 1 for ok/yes */\n\n/* windows only - utf-16 version */\nwchar_t const * tinyfd_inputBoxW(\n\twchar_t const * const aTitle, /* NULL or L\"\" */\n\twchar_t const * const aMessage, /* NULL or L\"\" may NOT contain \\n nor \\t */\n\twchar_t const * const aDefaultInput ); /* L\"\" , if NULL it's a passwordBox */\n\n/* windows only - utf-16 version */\nwchar_t const * tinyfd_saveFileDialogW(\n\twchar_t const * const aTitle, /* NULL or L\"\" */\n\twchar_t const * const aDefaultPathAndFile, /* NULL or L\"\" */\n\tint const aNumOfFilterPatterns, /* 0 */\n\twchar_t const * const * const aFilterPatterns, /* NULL or {L\"*.jpg\",L\"*.png\"} */\n\twchar_t const * const aSingleFilterDescription); /* NULL or L\"image files\" */\n\t\t/* returns NULL on cancel */\n\n/* windows only - utf-16 version */\nwchar_t const * tinyfd_openFileDialogW(\n\twchar_t const * const aTitle, /* NULL or L\"\" */\n\twchar_t const * const aDefaultPathAndFile, /* NULL or L\"\" */\n\tint const aNumOfFilterPatterns , /* 0 */\n\twchar_t const * const * const aFilterPatterns, /* NULL {L\"*.jpg\",L\"*.png\"} */\n\twchar_t const * const aSingleFilterDescription, /* NULL or L\"image files\" */\n\tint const aAllowMultipleSelects ) ; /* 0 or 1 */\n\t\t/* in case of multiple files, the separator is | */\n\t\t/* returns NULL on cancel */\n\n/* windows only - utf-16 version */\nwchar_t const * tinyfd_selectFolderDialogW(\n\twchar_t const * const aTitle, /* NULL or L\"\" */\n\twchar_t const * const aDefaultPath); /* NULL or L\"\" */\n\t\t/* returns NULL on cancel */\n\n/* windows only - utf-16 version */\nwchar_t const * tinyfd_colorChooserW(\n\twchar_t const * const aTitle, /* NULL or L\"\" */\n\twchar_t const * const aDefaultHexRGB, /* NULL or L\"#FF0000\" */\n\tunsigned char const aDefaultRGB[3] , /* { 0 , 255 , 255 } */\n\tunsigned char aoResultRGB[3] ) ; /* { 0 , 0 , 0 } */\n\t\t/* returns the hexcolor as a string L\"#FF0000\" */\n\t\t/* aoResultRGB also contains the result */\n\t\t/* aDefaultRGB is used only if aDefaultHexRGB is NULL */\n\t\t/* aDefaultRGB and aoResultRGB can be the same array */\n\t\t/* returns NULL on cancel */\n\n\n#endif /*TINYFD_NOLIB*/\n#else /*_WIN32*/\n\n/* unix zenity only */\nchar const * tinyfd_arrayDialog(\n\tchar const * const aTitle , /* NULL or \"\" */\n\tint const aNumOfColumns , /* 2 */\n\tchar const * const * const aColumns, /* {\"Column 1\",\"Column 2\"} */\n\tint const aNumOfRows, /* 2 */\n\tchar const * const * const aCells);\n\t\t/* {\"Row1 Col1\",\"Row1 Col2\",\"Row2 Col1\",\"Row2 Col2\"} */\n\n#endif /*_WIN32 */\n\n#ifdef\t__cplusplus\n}\n#endif\n\n#endif /* TINYFILEDIALOGS_H */\n\n/*\n- This is not for android nor ios.\n- The code is pure C, perfectly compatible with C++.\n- the windows only wchar_t (utf-16) prototypes are in the header file\n- windows is fully supported from XP to 10 (maybe even older versions)\n- C# & LUA via dll, see example files\n- OSX supported from 10.4 to latest (maybe even older versions)\n- Avoid using \" and ' in titles and messages.\n- There's one file filter only, it may contain several patterns.\n- If no filter description is provided,\n  the list of patterns will become the description.\n- char const * filterPatterns[3] = { \"*.obj\" , \"*.stl\" , \"*.dxf\" } ;\n- On windows char defaults to MBCS, set tinyfd_winUtf8=1 to use UTF-8\n- On windows link against Comdlg32.lib and Ole32.lib\n  This linking is not compulsary for console mode (see above).\n- On unix: it tries command line calls, so no such need.\n- On unix you need one of the following:\n  applescript, kdialog, zenity, matedialog, shellementary, qarma,\n  python (2 or 3)/tkinter/python-dbus (optional), Xdialog\n  or dialog (opens terminal if running without console) or xterm.\n- One of those is already included on most (if not all) desktops.\n- In the absence of those it will use gdialog, gxmessage or whiptail\n  with a textinputbox.\n- If nothing is found, it switches to basic console input,\n  it opens a console if needed (requires xterm + bash).\n- Use windows separators on windows and unix separators on unix.\n- String memory is preallocated statically for all the returned values.\n- File and path names are tested before return, they are valid.\n- If you pass only a path instead of path + filename,\n  make sure it ends with a separator.\n- tinyfd_forceConsole=1; at run time, forces dialogs into console mode.\n- On windows, console mode only make sense for console applications.\n- On windows, Console mode is not implemented for wchar_T UTF-16.\n- Mutiple selects are not allowed in console mode.\n- The package dialog must be installed to run in enhanced console mode.\n  It is already installed on most unix systems.\n- On osx, the package dialog can be installed via\n  http://macappstore.org/dialog or http://macports.org\n- On windows, for enhanced console mode,\n  dialog.exe should be copied somewhere on your executable path.\n  It can be found at the bottom of the following page:\n  http://andrear.altervista.org/home/cdialog.php\n- If dialog is missing, it will switch to basic console input.\n- You can query the type of dialog that will be use (pass \"tinyfd_query\" as aTitle)\n*/\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/display/GameDisplay.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMEDISPLAY_H_INCLUDED\n#define GAMEDISPLAY_H_INCLUDED\n\n#include \"../../../app_src/gamesystem_ext/GameSystemExtended.h\"\n\n#if defined(IS_ENGINE_USE_SDM)\n#include \"SDM.h\"\n#else\n#include \"../entity/MainObject.h\"\n#endif\n\n#include \"../sound/GSM.h\"\n#include \"../graphic/GRM.h\"\n\nnamespace is\n{\nclass GameDisplay;\nsf::Vector2f getMapPixelToCoords(GameDisplay const *scene, sf::Vector2i pixelPos);\n\n//////////////////////////////////////////////////////\n/// \\brief Class for manage game scene\n///\n//////////////////////////////////////////////////////\nclass GameDisplay\n#if defined(IS_ENGINE_USE_SDM)\n    : public SDM, public GSM, public GRM\n#else\n    : public GSM, public GRM\n#endif\n{\npublic:\n    bool m_isClosed;\n\n    /*  \t\t\t\t\t/!\\ WARNING! /!\\\n     * This constructor is no longer supported in this version of the engine. Use the one below.\n     *\n     * GameDisplay(sf::RenderWindow &window, sf::View &view, is::Render &surface, GameSystemExtended &gameSysExt, sf::Color bgColor);\n     */\n    GameDisplay(GameSystemExtended &gameSysExt, sf::Color bgColor);\n    virtual ~GameDisplay();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update scene behavior\n    ///\n    /// When the SDM is activated and the user does not overload\n    /// this function the SDM takes care of calling this method to\n    /// automatically update the objects of the scene and the\n    /// events of the window.\n    ////////////////////////////////////////////////////////////\n    virtual void step()\n    #if !defined(IS_ENGINE_USE_SDM)\n     = 0;\n    #else\n    {\n        SDMmanageScene(); // Let SDM manage the scene\n    }\n    #endif\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Method to implement drawing code\n    ///\n    /// When the SDM is activated and the user does not overload\n    /// this function the SDM takes care of calling this method to\n    /// automatically draw the objects of the scene.\n    ////////////////////////////////////////////////////////////\n    virtual void draw()\n    #if !defined(IS_ENGINE_USE_SDM)\n    = 0;\n    #else\n    {\n        SDMdraw(); // Let SDM manage the display of objects\n    }\n    #endif\n\n    /// Draw scene\n    virtual void drawScreen();\n\n    /// Draw temporal loading (simulation)\n    virtual void showTempLoading(float time = 3.f * is::SECOND);\n\n    /// Allows to change an option by playing a sound and making an animation\n    virtual void setOptionIndex(int optionIndexValue, bool callWhenClick, float buttonScale = 1.3f);\n\n    /// Set option index\n    virtual void setOptionIndex(int optionIndexValue);\n\n    /// Allows to animate SFML text and sprite in relation to a option\n    virtual void setTextAnimation(sf::Text &txt, sf::Sprite &spr, int val);\n\n    /// Set sprButtonSelectScale\n    virtual void setSprButtonSelectScale(float val);\n\n    /// Update view position\n    virtual void setView(sf::Vector2f v);\n\n    /// Update view position\n    virtual void setView(float x, float y);\n\n    /// Update view position\n    virtual void setView();\n\n    /// Set view x variable\n    virtual void setViewVarX(float val);\n\n    /// Set view y variable\n    virtual void setViewVarY(float val);\n\n    /// Set view x and y variable\n    virtual void setViewVarXY(float x, float y);\n\n    /// Set view size\n    virtual void setViewSize(sf::Vector2f v);\n\n    /// Set view size\n    virtual void setViewSize(float x, float y);\n\n    /// Set window size\n    virtual void setWindowSize(sf::Vector2u v, bool updateViewSize = false);\n\n    /// Set window title\n    virtual void setWindowTitle(const std::string &title);\n\n    /// Set background color\n    virtual void setWindowBgColor(sf::Color color);\n\n    /// Load message box resource and fonts\n    virtual void loadParentResources();\n\n    /// Load scene resources\n    virtual void loadResources() = 0;\n\n    /// Set is running\n    virtual void setIsRunning(bool val);\n\n    /// Set is playing\n    virtual void setIsPlaying(bool val);\n\n    /// Allows access to another scene. If no scene is entered the application stops.\n    virtual void quitScene(int nextScene = -1);\n\n    /// Set wait time\n    virtual void setWaitTime(int val);\n\n    /// Set scene start\n    virtual void setSceneStart(bool val);\n\n    /// Set scene end\n    virtual void setSceneEnd(bool val);\n\n    /// Set key back (CANCEL) state\n    virtual void setKeyBackPressed(bool val);\n\n    /// Set mouse in collision\n    virtual void setMouseInCollision();\n\n    /// Check if scene is running\n    virtual bool getIsRunning() const;\n\n    /// Return m_isPlaying\n    virtual bool getIsPlaying() const {return m_isPlaying;}\n\n    /// Return scene start\n    virtual bool getSceneStart() const {return m_sceneStart;}\n\n    /// Return scene end\n    virtual bool getSceneEnd() const {return m_sceneEnd;}\n\n    /// Return window focus state\n    virtual bool getWindowIsActive() const {return m_windowIsActive;}\n\n    /// Return key back (CANCEL) state\n    virtual bool getKeyBackPressed() const {return m_keyBackPressed;}\n\n    /// Return scene view\n    virtual const sf::View& getView() const noexcept {return m_view;}\n\n    /// Return current mouse position\n    virtual sf::Vector2f& getMousePosCurrent() {return m_mousePosCurrent;}\n\n    /// Return previous mouse position\n    virtual sf::Vector2f& getMousePosPrevious() {return m_mousePosPrevious;}\n\n    /// Return render window\n    virtual sf::RenderWindow& getRenderWindow() const {return m_window;}\n\n    /// Return render texture\n    virtual is::Render& getRenderTexture() const {return m_surface;}\n\n    /// Return game system controller\n    virtual GameSystemExtended& getGameSystem() {return m_gameSysExt;}\n\n    /// Return font system\n    virtual sf::Font& getFontSystem() {return m_gameSysExt.GRMgetFont(\"font_system\");}\n\n    /// Return font msg\n    virtual sf::Font& getFontMsg() {return m_gameSysExt.GRMgetFont(\"font_msg\");}\n\n    /// Return Button Select sprite\n    virtual sf::Sprite& getSprButtonSelect() {return m_sprButtonSelect;}\n\n    /// Return option index\n    virtual int getOptionIndex() const {return m_optionIndex;}\n\n    /// Return wait time\n    virtual int getWaitTime() const {return m_waitTime;}\n\n    /// Return scene width\n    virtual unsigned int getSceneWidth() const {return m_sceneWidth;}\n\n    /// Return scene height\n    virtual unsigned int getSceneHeight() const {return m_sceneHeight;}\n\n    /// Return vibrate time duration\n    virtual short getVibrateTimeDuration() const {return m_timeVibrateDuration;}\n\n    /// Return the delta time elapsed independent of the main rendering loop\n    virtual float getDeltaTime();\n\n    /// Return DELTA_TIME variable\n    virtual float getDELTA_TIME() const {return DELTA_TIME;}\n\n    /// Return sprButtonSelectScale variable\n    virtual float& getSprButtonSelectScale() {return m_sprButtonSelectScale;}\n\n    /// Return view X\n    virtual float getViewX() const {return m_viewX;}\n\n    /// Return view Y\n    virtual float getViewY() const {return m_viewY;}\n\n    /// Return view W\n    virtual float getViewW() const {return m_viewW;}\n\n    /// Return view H\n    virtual float getViewH() const {return m_viewH;}\n\n    /// Return Cursor Position\n    virtual sf::Vector2f getCursor(unsigned int finger = 0) const;\n\n    /// Get mouse in collision\n    bool getMouseInCollision() {return m_mouseInCollision;}\n\n    /// Check if mouse current position is equal to previous position\n    bool getMouseCurrentEqualToPrevious();\n\n    /// Return the scene background color\n    virtual sf::Color& getBgColor() {return m_windowBgColor;}\n\n    /// Check if the scene object is in view surface\n    virtual bool inViewRec(is::MainObject *obj, bool useTexRec = true);\n\n    /// Check if the scene object is in view surface\n    virtual bool inViewRec(is::MainObject &obj, bool useTexRec = true);\n\n    //////////////////////////////////////////////////////\n    /// \\brief Test the collision of the SFML objects which are in the\n    /// scene with the mouse cursor on PC platform / touch on mobile\n    ///\n    /// \\param obj SFML object with which we want to test\n    /// \\param finger Finger index (on Android)\n    //////////////////////////////////////////////////////\n    template <class T>\n    bool mouseCollision(T const &obj, unsigned int finger = 0)\n    {\n        return is::mouseCollision(m_window, obj, finger);\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Test the collision of the SFML objects which are in the\n    /// scene with the mouse cursor on PC platform / touch on mobile\n    ///\n    /// \\param obj SFML object with which we want to test\n    /// \\param position Allows to get the position of the collision point\n    /// \\param finger Finger index (on Android)\n    //////////////////////////////////////////////////////\n    template <class T>\n    bool mouseCollision(T const &obj, sf::Vector2f &position, unsigned int finger = 0)\n    {\n        return is::mouseCollision(m_window, obj, position, finger);\n    }\n\n    #if defined(IS_ENGINE_USE_SDM)\n    /// Allows to manage all the parts of the scene (event, update, display, dialog box)\n    virtual void SDMmanageScene();\n\n    /// Allows to define the way in which the SDM will manage the events\n    /// To change the mechanism override this method\n    virtual void SDMmanageSceneEvents();\n\n    /// Allows to define how the answers of the dialog box will be handled\n    /// To change the mechanism override this method\n    virtual void SDMmanageSceneMsgAnswers();\n\n    /// Method to call objects events\n    virtual void SDMcallObjectsEvents(sf::Event &event);\n\n    /// Method to update scene objects\n    virtual void SDMstep();\n\n    /// Method to draw scene objects\n    virtual void SDMdraw();\n\n    /// Allows to create a sprite by associating a texture to it.\n    /// It is also used to blit sprites but only works with SDL.\n    virtual void createSprite(const std::string &spriteName, is::MainObject &obj, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, sf::Vector2f scale = sf::Vector2f(1.f, 1.f), unsigned int alpha = 255);\n    #endif\n\n    /// Allows to play sound in container by his name if the option is activated\n    virtual void GSMplaySound(const std::string& name)\n    {\n        is::GSMplaySound(name, m_GSMsound, m_gameSysExt);\n    }\n\n    /// Allows to play music in container by his name if the option is activated\n    virtual void GSMplayMusic(const std::string& name)\n    {\n        is::GSMplayMusic(name,\n//#if !defined(__ANDROID__)\n                         m_GSMmusic\n//#else\n//                      m_GSMsound\n//#endif\n                         , m_gameSysExt);\n    }\n\n    /// Allows to use Game System font in scene\n    virtual void GRMuseGameSystemFont()\n    {\n        WITH(m_gameSysExt.m_GRMfont.size()) GRMaddFontObject(m_gameSysExt.m_GRMfont[_I]);\n    }\n\n    /// Allows to use Game System texture in scene\n    virtual void GRMuseGameSystemTexture()\n    {\n        WITH(m_gameSysExt.m_GRMtexture.size()) GRMaddTextureObject(m_gameSysExt.m_GRMtexture[_I]);\n    }\n\n    /// Allows to use Game System sound in scene\n    virtual void GSMuseGameSystemSound()\n    {\n        WITH(m_gameSysExt.m_GSMsound.size()) GSMaddSoundObject(m_gameSysExt.m_GSMsound[_I]);\n    }\n\n    /// Allows to use Game System music in scene\n    virtual void GSMuseGameSystemMusic()\n    {\n//#if !defined(__ANDROID__)\n        WITH(m_gameSysExt.m_GSMmusic.size()) GSMaddMusicObject(m_gameSysExt.m_GSMmusic[_I]);\n//#else\n//        GSMuseGameSystemSound();\n//#endif\n    }\n\n    /// Allows to use all Game System resources (Font, Texture, Sound, Music) in scene\n    virtual void GRMuseGameSystemResources()\n    {\n        GRMuseGameSystemFont();\n        GRMuseGameSystemTexture();\n        GSMuseGameSystemSound();\n        GSMuseGameSystemMusic();\n    }\n\n////////////////////////////////////////////////////////////\n/// These methods below have the same role as those above.\n/// The difference here is that their name starting with GSM\n/// is replaced by GRM (Game Resource Manager).\n////////////////////////////////////////////////////////////\n\n    /// Allows to play sound in container by his name if the option is activated\n    virtual void GRMplaySound(const std::string& name)\n    {\n        GSMplaySound(name);\n    }\n\n    /// Allows to play music in container by his name if the option is activated\n    virtual void GRMplayMusic(const std::string& name)\n    {\n        GSMplayMusic(name);\n    }\n\n    /// Allows to use Game System sound in scene\n    virtual void GRMuseGameSystemSound()\n    {\n        GSMuseGameSystemSound();\n    }\n\n    /// Allows to use Game System music in scene\n    virtual void GRMuseGameSystemMusic()\n    {\n        GSMuseGameSystemMusic();\n    }\n\n////////////////////////////////////////////////////////////\n///\n////////////////////////////////////////////////////////////\n\n    /// Show message box according to type\n    void showMessageBox(const std::string &msgBody, bool mbYesNo = true);\n\n    /// Show message box according to type\n    void showMessageBox(std::wstring const &msgBody, bool mbYesNo = true);\n\n    /// Allows to manage focus and closing events\n    virtual void controlEventFocusClosing(sf::Event &event);\n\nprotected:\n    /// Represent the answers return by message box\n    enum MsgAnswer\n    {\n        QUIT = -1,\n        YES = 1,\n        NO = 0\n    };\n\n    /// Set Message box components position\n    void setWidgetsPosition();\n\n    /// Set message box data\n    void setMessageBoxData(bool mbYesNo);\n\n    /// Update message box components\n    void updateMsgBox(int sliderDirection = 0, bool rightSideValidation = false,\n                      sf::Color textDefaultColor = is::GameConfig::DEFAULT_MSG_BOX_TEXT_COLOR,\n                      sf::Color selectedTextColor = is::GameConfig::DEFAULT_MSG_BOX_SELECTED_TEXT_COLOR);\n\n    /// Update time wait\n    void updateTimeWait();\n\n    /// Show message box\n    void drawMsgBox();\n\n    sf::RenderWindow &m_window;\n    sf::View m_view;\n    sf::Vector2f m_mousePosPrevious, m_mousePosCurrent;\n\n    is::Render &m_surface;\n    GameSystemExtended &m_gameSysExt;\n\n    sf::Sprite m_sprButtonSelect;\n    sf::Clock m_clock;\n    sf::Color m_windowBgColor;\n\n    short const m_timeVibrateDuration; ///< Represent the time of vibration (ms)\n\n    int m_optionIndex;\n    int m_waitTime, m_msgWaitTime;\n    unsigned int m_sceneWidth, m_sceneHeight;\n    float DELTA_TIME;\n    float m_viewW, m_viewH, m_viewX, m_viewY, m_sprButtonSelectScale;\n    MsgAnswer m_msgAnswer;\n\n    bool m_isRunning;\n    bool m_windowIsActive;\n    bool m_isPlaying, m_sceneStart, m_sceneEnd;\n    bool m_keyBackPressed;\n    bool m_showMsg, m_mbYesNo, m_msgBoxMouseInCollision, m_mouseInCollision;\n\n    sf::Sprite m_sprMsgBox, m_sprMsgBoxButton1, m_sprMsgBoxButton2, m_sprMsgBoxButton3;\n    sf::Sprite m_sprLoading;\n    sf::Text m_txtMsgBox, m_txtMsgBoxYes, m_txtMsgBoxNo, m_txtMsgBoxOK;\n    sf::RectangleShape m_recMsgBox;\n};\n}\n\n#endif // GAMEDISPLAY_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/display/SDM.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef SDM_H_INCLUDED\n#define SDM_H_INCLUDED\n\n#include \"../entity/MainObject.h\"\n#if defined(IS_ENGINE_SDL_2)\n#include \"SDMBlitSDLSprite.h\"\n#endif\n#include <list>\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class that automatically updates and displays objects in\n/// a scene. It also allows you to manage the display depth\n/// of objects in a scene.\n////////////////////////////////////////////////////////////\nclass SDM\n{\npublic:\n    /// Scene objects container\n    std::list<std::shared_ptr<MainObject>> m_SDMsceneObjects;\n#if defined(IS_ENGINE_SDL_2)\n    /// Blit sprite container\n    std::vector<std::shared_ptr<is::SDMBlitSDLSprite>> m_SDMblitSDLSprite;\n#endif\n\n    /// Allows to get object in container by his name\n    MainObject* SDMgetObject(const std::string& name)\n    {\n        // update scene objects\n        for (std::list<std::shared_ptr<MainObject>>::iterator it = m_SDMsceneObjects.begin();\n            it != m_SDMsceneObjects.end(); ++it)\n        {\n            if (is::instanceExist(*it))\n            {\n                if (it->get()->getName() == name)\n                {\n                    return it->get();\n                }\n            }\n        }\n        return nullptr;\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add object in SDM container\n    ///\n    /// \\param obj object (MainObject) of the scene to add\n    /// \\param callStepFunction lets tell SDM if it can use the object's Step function\n    /// \\param callDrawFunction lets tell SDM if it can use the object's Draw function\n    //////////////////////////////////////////////////////\n    template <class T>\n    void SDMaddSceneObject(std::shared_ptr<T> obj, bool callStepFunction = true, bool callDrawFunction = true, const std::string& name = \"null\", bool callEventFunction = false)\n    {\n        obj->m_SDMcallStep  = callStepFunction;\n        obj->m_SDMcallDraw  = callDrawFunction;\n        if (!obj->m_SDMcallEvent) obj->m_SDMcallEvent = callEventFunction;\n        if (name != \"null\" && name != \"\") obj->setName(name);\n        m_SDMsceneObjects.push_back(obj);\n        if (!m_SDMObjectsStep  && obj->m_SDMcallStep)  m_SDMObjectsStep  = true;\n        if (!m_SDMObjectsDraw  && obj->m_SDMcallDraw)  m_SDMObjectsDraw  = true;\n        if (!m_SDMObjectsEvent && obj->m_SDMcallEvent) m_SDMObjectsEvent = true;\n        m_SDMsortArray = true;\n    }\n\n    /*\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add SFML Sprite in SDM container\n    ///\n    /// \\param spr SFML Sprite to add\n    /// \\param name of sprite which will be used to identify it in the container in order to be able to access it\n    /// \\param depth display depth\n    //////////////////////////////////////////////////////\n    virtual void SDMaddSprite(sf::Sprite spr, const std::string& name, float x = 0.f, float y = 0.f, int depth = DepthObject::NORMAL_DEPTH)\n    {\n        auto obj = std::make_shared<MainObject>(spr, x, y);\n        obj->setName(name);\n        obj->setDepth(depth);\n        m_SDMsceneObjects.push_back(obj);\n        m_SDMObjectsDraw = true;\n        m_SDMsortArray = true;\n    }\n    */\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add SFML Sprite in SDM container\n    ///\n    /// \\param tex Texture of sprite\n    /// \\param name of sprite which will be used to identify it in the container in order to be able to access it\n    /// \\param center allows you to center the Sprite in relation to its position\n    /// \\param depth display depth\n    //////////////////////////////////////////////////////\n    virtual void SDMaddSprite(sf::Texture &tex, const std::string& name, float x, float y, bool center = false, int depth = DepthObject::NORMAL_DEPTH)\n    {\n        auto obj = std::make_shared<MainObject>(tex, x, y, center);\n        obj->setName(name);\n        obj->setDepth(depth);\n        m_SDMsceneObjects.push_back(obj);\n        m_SDMObjectsDraw = true;\n        m_SDMsortArray = true;\n    }\n\n    /// change the display depth of an object by his name\n    virtual void SDMsetObjDepth(const std::string& name, int depth)\n    {\n        if (auto obj = SDMgetObject(name); obj != nullptr)\n        {\n            obj->setDepth(depth);\n            m_SDMsortArray = true;\n        }\n        else is::showLog(\"ERROR: Can't change depth because object <\" + name + \"> not found !\");\n    }\n\n    /// change the display depth of an object\n    virtual void SDMsetObjDepth(MainObject *obj, int depth)\n    {\n        if (obj->getDepth() != depth)\n        {\n            obj->setDepth(depth);\n            m_SDMsortArray = true;\n        }\n    }\n\nprotected:\n    bool m_SDMsortArray    = false;\n    bool m_SDMObjectsStep  = false;\n    bool m_SDMObjectsDraw  = false;\n    bool m_SDMObjectsEvent = true;\n};\n}\n\n#endif // SDM_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/display/SDMBlitSDLSprite.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2022 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef SDMBLITSDLSPRITE_H_INCLUDED\n#define SDMBLITSDLSPRITE_H_INCLUDED\n\n#if defined(IS_ENGINE_SDL_2)\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class which allows to blit SDL sprites\n////////////////////////////////////////////////////////////\nclass SDMBlitSDLSprite\n{\npublic:\n    SDMBlitSDLSprite(std::string name, sf::Texture &tex):\n        m_strTextureName(name)\n    {\n        m_sprBlit.setTexture(tex);\n    }\n    sf::Sprite m_sprBlit;\n    std::string m_strTextureName;\n};\n}\n#endif\n\n#endif // SDMBLITSDLSPRITE_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/Background.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef BACKGROUND_H_INCLUDED\n#define BACKGROUND_H_INCLUDED\n\n#include \"../display/GameDisplay.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for drawing a background that fills a scene and\n/// that we can scroll vertically and horizontally with a speed\n////////////////////////////////////////////////////////////\nclass Background : public MainObject\n{\npublic:\n    float m_xGrid = 32.f;\n    float m_yGrid = 32.f;\n\n    Background(sf::Texture &tex, float x, float y, GameDisplay *scene, float hSpeed = 0.f, float vSpeed = 0.f,\n               bool fillHorizontal = true, bool fillVertical = true):\n        MainObject(x ,y)\n    {\n        m_strName = \"Background\"; // object name\n\n        m_hsp = hSpeed;\n        m_vsp = vSpeed;\n        int bgW = (fillHorizontal) ? scene->getSceneWidth()  + tex.getSize().x : tex.getSize().x;\n        int bgH = (fillVertical)   ? scene->getSceneHeight() + tex.getSize().y : tex.getSize().y;\n        is::createSprite(tex, m_sprParent, sf::IntRect(0, 0, bgW, bgH), sf::Vector2f(m_x, m_y), sf::Vector2f(0.f, 0.f), true);\n        if (m_hsp > 0.f)\n        {\n            m_x -= m_xGrid;\n            m_xStart = m_x;\n        }\n        if (m_vsp > 0.f)\n        {\n            m_y -= m_yGrid;\n            m_yStart = m_y;\n        }\n    }\n\n    void step(const float &DELTA_TIME)\n    {\n        m_x += m_hsp;\n        m_y += m_vsp;\n        if (m_hsp > 0.f)\n        {\n            if (m_x > m_xStart + m_xGrid) m_x = m_xStart;\n        }\n        if (m_hsp < 0.f)\n        {\n            if (m_x < m_xStart - m_xGrid) m_x = m_xStart;\n        }\n        if (m_vsp > 0.f)\n        {\n            if (m_y > m_yStart + m_yGrid) m_y = m_yStart;\n        }\n        if (m_vsp < 0.f)\n        {\n            if (m_y < m_yStart - m_yGrid) m_y = m_yStart;\n        }\n        updateSprite();\n    }\n};\n}\n\n#endif // BACKGROUND_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/Button.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef BUTTON_H_INCLUDED\n#define BUTTON_H_INCLUDED\n\n#include \"../display/GameDisplay.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class which allows to use a Button in a scene. It\n/// supports hover and click events.\n////////////////////////////////////////////////////////////\nclass Button : public MainObject\n{\npublic:\n    Button(sf::Texture &tex, float x, float y, const std::string &title, const std::string &name, bool center, GameDisplay *scene):\n        MainObject(x ,y),\n        m_scene(scene),\n        m_isInCollision(false)\n    {\n        m_strName = std::string((name == \"\" || name == \" \") ? \"Button_\" + is::numToStr(MainObject::instanceNumber) : name); // object name\n        m_w = tex.getSize().x / 2;\n        m_h = tex.getSize().y;\n        if (!center)\n        {\n            m_xOffset = m_w / 2.f;\n            m_yOffset = m_h / 2.f;\n        }\n        is::createSprite(tex, m_sprParent, sf::IntRect(0, 0, m_w, m_h),\n                         sf::Vector2f(m_x, m_y), sf::Vector2f(m_w / 2.f, m_h / 2.f));\n        is::createText(scene->getFontSystem(), m_txtTitle, title, m_x, m_y, is::GameConfig::DEFAULT_BUTTON_TEXT_COLOR, true, m_h / 2);\n        m_SDMcallEvent = true;\n    }\n\n    Button(sf::Texture &tex, sf::Font &font, float x, float y, const std::string &title, const std::string &name, bool center, int textSize, GameDisplay *scene):\n        MainObject(x ,y),\n        m_scene(scene),\n        m_isInCollision(false)\n    {\n        m_strName = std::string((name == \"\" || name == \" \") ? \"Button_\" + is::numToStr(MainObject::instanceNumber) : name); // object name\n        m_w = tex.getSize().x / 2;\n        m_h = tex.getSize().y;\n        if (!center)\n        {\n            m_xOffset = m_w / 2.f;\n            m_yOffset = m_h / 2.f;\n        }\n        is::createSprite(tex, m_sprParent, sf::IntRect(0, 0, m_w, m_h),\n                         sf::Vector2f(m_x, m_y), sf::Vector2f(m_w / 2.f, m_h / 2.f));\n        is::createText(font, m_txtTitle, title, m_x, m_y, is::GameConfig::DEFAULT_BUTTON_TEXT_COLOR, true, textSize);\n        m_SDMcallEvent = true;\n    }\n\n    /// Set the button text title\n    virtual void setTitle(const std::string &title)\n    {\n        m_txtTitle.setString(title);\n        is::centerSFMLObj(m_txtTitle);\n    }\n\n    /// Triggers when the button is clicked\n    /// This method must be overloaded\n    virtual void onClick() = 0;\n\n    /// Triggers when the user hovers over the button\n    /// This method must be overloaded\n    virtual void onMouseOver()\n    {\n        // is::showLog(\"WARNING: Button::onMouseOver() method must be overloaded!\");\n    }\n\n    virtual void mouseAction(sf::Event &event)\n    {\n        if (m_isInCollision)\n        {\n            auto functionClick = [this]()\n            {\n                onClick();\n                m_imageScale = ((!is::IS_ENGINE_MOBILE_OS) ? 1.2f : 1.f);\n            };\n            if (event.type == sf::Event::MouseButtonPressed)\n            {\n                if (event.key.code == is::GameConfig::KEY_VALIDATION_MOUSE) functionClick();\n            }\n            if (is::IS_ENGINE_MOBILE_OS)\n            {\n                if (event.type == sf::Event::TouchEnded)\n                {\n                    if (event.touch.finger == 0)\n                    {\n                        functionClick();\n                    }\n                }\n            }\n        }\n    }\n\n    virtual void event(sf::Event &event)\n    {\n        mouseAction(event);\n    }\n\n    virtual void step(const float &DELTA_TIME)\n    {\n        bool tempCollision(m_scene->mouseCollision(m_sprParent));\n        if (tempCollision && !m_isInCollision)\n        {\n            onMouseOver();\n            m_imageScale = ((!is::IS_ENGINE_MOBILE_OS) ? 1.1f : 0.92f);\n            m_isInCollision = true;\n        }\n        is::setSFMLObjTexRec(m_sprParent, ((m_isInCollision) ? 1 : 0) * m_w, 0, m_w, m_h);\n        if (!tempCollision)\n        {\n            m_isInCollision = false;\n            if (is::IS_ENGINE_MOBILE_OS) m_imageScale = 1.f;\n        }\n        if (!is::IS_ENGINE_MOBILE_OS) is::scaleAnimation(DELTA_TIME, m_imageScale, m_sprParent);\n\n        updateSprite(m_x, m_y, m_imageAngle, m_imageAlpha, m_imageScale, m_imageScale, m_xOffset, m_yOffset);\n        is::setSFMLObjProperties(m_txtTitle, is::getSFMLObjX(m_sprParent),\n                                 is::getSFMLObjY(m_sprParent)\n#if defined(IS_ENGINE_SFML)\n                                 - is::getSFMLObjHeight(m_txtTitle) / 4.f\n#endif\n                                 ,\n                                 m_imageAngle, m_imageAlpha, m_imageScale, m_imageScale);\n    }\n\n    virtual void draw(is::Render &surface)\n    {\n        surface.draw(m_sprParent);\n        surface.draw(m_txtTitle);\n    }\n\n    /// Return the SFML text object\n    virtual sf::Text &getText()\n    {\n        return m_txtTitle;\n    }\n\n    /// Check if mouse or finger (on Android) is in collision with the Button\n    virtual bool getIsInCollision() const\n    {\n        return m_isInCollision;\n    }\n\nprotected:\n    GameDisplay *m_scene;\n    sf::Text m_txtTitle;\n    bool m_isInCollision;\n};\n}\n\n#endif // BUTTON_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/Form.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef FORME_H_INCLUDED\n#define FORME_H_INCLUDED\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// \\brief Class to manage rectangle collision\n///\n////////////////////////////////////////////////////////////\nclass Rectangle\n{\npublic:\n    Rectangle():\n        m_left(0),\n        m_top(0),\n        m_right(0),\n        m_bottom(0)\n    {}\n    int m_left, m_top, m_right, m_bottom;\n};\n\n////////////////////////////////////////////////////////////\n/// \\brief Class to manage circle collision\n///\n////////////////////////////////////////////////////////////\nclass Circle\n{\npublic:\n    Circle():\n        m_x(0.f),\n        m_y(0.f),\n        m_raduis(0.f)\n    {}\n    float m_x, m_y, m_raduis;\n};\n}\n\n#endif // FORME_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/MainObject.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef MAINOBJECT_H_INCLUDED\n#define MAINOBJECT_H_INCLUDED\n\n#include <memory>\n#include <list>\n\n#include \"Form.h\"\n#include \"parents/Name.h\"\n#include \"../function/GameFunction.h\"\n\n#if defined(IS_ENGINE_USE_SDM)\n#include \"parents/Destructible.h\"\n#include \"parents/DepthObject.h\"\n#include \"parents/Visibilty.h\"\n#endif\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// \\brief Main Class for all game play objects\n////////////////////////////////////////////////////////////\nclass MainObject : public Name\n#if defined(IS_ENGINE_USE_SDM)\n                 , public Destructible, public DepthObject, public is::Visibility\n#endif\n{\npublic:\n    explicit MainObject();\n    MainObject(float x, float y);\n    MainObject(sf::Sprite &spr, float x = 0.f, float y = 0.f);\n    MainObject(sf::Texture &tex, float x, float y, bool center = false);\n    virtual ~MainObject();\n\n    /// Return the instance number\n    static int instanceNumber;\n\n#if defined(IS_ENGINE_USE_SDM)\n    /// on SDL it allows to blit sprites.\n    /// Also prevents the object's sprite from being drawn outside the view (works on SDL and SFML).\n    std::string m_SDMblitSprTextureName = \"\";\n\n    /// lets SDM know if it can call its Step method (update function)\n    bool m_SDMcallStep = true;\n\n    /// lets SDM know if it can call its Draw method\n    bool m_SDMcallDraw = true;\n\n    /// lets SDM know if it can call its Event method\n    bool m_SDMcallEvent = false;\n\n    /// Allows to update object, to overload if necessary\n    virtual void step(const float &DELTA_TIME)\n    {\n        updateCollisionMask();\n    }\n\n    /// Allows to use object event\n    virtual void event(sf::Event &ev)\n    {\n        is::showLog(\"WARNING: MainObject event called in object <\" + m_strName + \">! This method must be overloaded!\");\n    }\n#endif\n\n    /// Set x initial position\n    virtual void setXStart(float x);\n\n    /// Set y initial position\n    virtual void setYStart(float y);\n\n    /// Set x preview position\n    virtual void setXPrevious(float x);\n\n    /// Set y preview position\n    virtual void setYPrevious(float y);\n\n    /// Set x, y initial position\n    virtual void setStartPosition(float x, float y);\n\n    /// Set x position\n    virtual void setX(float x);\n\n    /// Set y position\n    virtual void setY(float y);\n\n    /// Move object on x axis\n    virtual void moveX(float x);\n\n    /// Move object on y axis\n    virtual void moveY(float y);\n\n    /// Set x, y position\n    virtual void setPosition(float x, float y);\n\n    /// Set x, y scale of main sprite\n    virtual void setSpriteScale(float x, float y);\n\n    /// Set speed\n    virtual void setSpeed(float val);\n\n    /// Set horizontal speed\n    virtual void setHsp(float val);\n\n    /// Set vertical speed\n    virtual void setVsp(float val);\n\n    /// Set angular move\n    virtual void setAngularMove(const float &DELTA_TIME, float speed, float angle);\n\n    /// Set image frame\n    virtual void setFrame(float val);\n\n    /// Set image frame start\n    virtual void setFrameStart(float val);\n\n    /// Set image frame end\n    virtual void setFrameEnd(float val);\n\n    /// Set the x scale\n    virtual void setImageXscale(float val);\n\n    /// Set the y scale\n    virtual void setImageYscale(float val);\n\n    /// Set the scale\n    virtual void setImageScale(float val, bool updateXYscale = false);\n\n    /// Set the angle\n    virtual void setImageAngle(float val);\n\n    /// Set the x offset\n    virtual void setXOffset(float val);\n\n    /// Set the y offset\n    virtual void setYOffset(float val);\n\n    /// Set the x, y offset\n    virtual void setXYOffset(float x, float y);\n\n    /// Set the x, y offset in relation to parent sprite origin\n    virtual void setXYOffset();\n\n    /// Set image scale\n    virtual void setImageScaleX_Y(float x, float y);\n\n    /// Set time\n    virtual void setTime(float x);\n\n    /// Set alpha\n    virtual void setImageAlpha(int val);\n\n    /// Set image index\n    virtual void setImageIndex(int val);\n\n    /// Set mask width\n    virtual void setMaskW(int val);\n\n    /// Set mask height\n    virtual void setMaskH(int val);\n\n    /// Set the size of the Rectangle mask and use it as the object's default mask\n    virtual void setRectangleMask(int width, int height);\n\n    /// Set the radius of the Circle mask and use it as the object's default mask\n    virtual void setCircleMask(float raduis);\n\n    /// Set active\n    virtual void setIsActive(bool val);\n\n    /// Update the collision mask\n    virtual void updateCollisionMask();\n\n    /// Update the collision mask with independent x, y point\n    virtual void updateCollisionMask(int x, int y);\n\n    /// Update the collision mask by centering it in relation to the position of the object\n    virtual void centerCollisionMask(int x, int y);\n\n    /// Update object main sprite\n    virtual void updateSprite();\n\n    /// Update object main sprite with external parameter\n    virtual void updateSprite(float x, float y, float angle = 0.f, int alpha = 255, float xScale = 1.f, float yScale = 1.f, float xOffset = 0.f, float yOffset = 0.f);\n\n    /// Draw the main sprite of object\n    virtual void draw(is::Render &surface);\n\n    /// Draw the collision mask\n    virtual void drawMask(is::Render &surface, sf::Color color = sf::Color::Blue);\n\n    /// Return the rectangle (default) mask\n    virtual const Rectangle& getMask() const noexcept {return m_aabb;}\n\n    /// Return the circle mask\n    virtual const Circle& getCircleMask() const noexcept {return m_circle;}\n\n    /// Return the x position\n    virtual float getX() const;\n\n    /// Return the y position\n    virtual float getY() const;\n\n    /// Return the x initial position\n    virtual float getXStart() const;\n\n    /// Return the y initial position\n    virtual float getYStart() const;\n\n    /// Return the x previous position\n    virtual float getXPrevious() const;\n\n    /// Return the y previous position\n    virtual float getYPrevious() const;\n\n    /// Return the distance between this object and point (x, y)\n    virtual float distantToPoint(float x, float y) const;\n\n    /// Return the distance between this object and another\n    virtual float distantToObject(MainObject const *other, bool useSpritePosition) const;\n\n    /// Return the distance between this object and another\n    virtual float distantToObject(std::shared_ptr<MainObject> const &other, bool useSpritePosition) const;\n\n    /// Return the angle between this object and point (x, y)\n    virtual float pointDirection(float x, float y) const;\n\n    /// Return the angle between this object and another\n    virtual float pointDirection(std::shared_ptr<MainObject> const &other) const;\n\n    /// Return the angle between this object main sprite and point (x, y)\n    virtual float pointDirectionSprite(float x, float y) const;\n\n    /// Return the angle between this object main sprite and another object\n    virtual float pointDirectionSprite(std::shared_ptr<MainObject> const &other) const;\n\n    /// Return the speed\n    virtual float getSpeed() const;\n\n    /// Return the horizontal speed\n    virtual float getHsp() const;\n\n    /// Return the vertical speed\n    virtual float getVsp() const;\n\n    /// Return frame\n    virtual float getFrame() const;\n\n    /// Return frame start\n    virtual float getFrameStart() const;\n\n    /// Return frame end\n    virtual float getFrameEnd() const;\n\n    /// Return the x scale\n    virtual float getImageXscale() const;\n\n    /// Return the y scale\n    virtual float getImageYscale() const;\n\n    /// Return the x scale\n    virtual float getImageScale() const;\n\n    /// Return the angle\n    virtual float getImageAngle() const;\n\n    /// Return x offset\n    virtual float getXOffset() const;\n\n    /// Return y offset\n    virtual float getYOffset() const;\n\n    /// Return object timing variable\n    virtual float getTime() const;\n\n    /// Return x of main sprite\n    virtual float getSpriteX() const;\n\n    /// Return y of main sprite\n    virtual float getSpriteY() const;\n\n    /// Return the sprite texture width\n    virtual int getTextureWidth() const;\n\n    /// Return the sprite texture height\n    virtual int getTextureHeight() const;\n\n    /// Return the ID of object (instance number)\n    virtual int getInstanceId() const;\n\n    /// Return the width of collision mask\n    virtual unsigned int getMaskW() const;\n\n    /// Return the height of collision mask\n    virtual unsigned int getMaskH() const;\n\n    /// Return image alpha\n    virtual int getImageAlpha() const;\n\n    /// Return image index\n    virtual int getImageIndex() const;\n\n    /// Return the width of main sprite\n    virtual int getSpriteWidth() const;\n\n    /// Return the height of main sprite\n    virtual int getSpriteHeight() const;\n\n    /// Return the x center of main sprite\n    virtual int getSpriteCenterX() const;\n\n    /// Return the y center of main sprite\n    virtual int getSpriteCenterY() const;\n\n    /// Return the number of sub-images according to the width of the sprite\n    virtual int getSpriteNumberSubImage(int subImageWidth) const;\n\n    /// Return the active value\n    virtual bool getIsActive() const;\n\n    /// Test collision in comparison with another\n    bool placeMetting(int x, int y, MainObject const *other);\n\n    /// Test collision in comparison with another\n    bool placeMetting(int x, int y, std::shared_ptr<MainObject> const &other);\n\n    /// Test if object is in view rectangle (vision)\n    bool inViewRec(sf::View const &view, bool useTexRec = true);\n\n    /// Return the sprite of object\n    virtual sf::Sprite& getSprite();\n\nprotected:\n\n    /// Set frame limit\n    virtual void setFrameLimit(float frameStart, float frameEnd = -1.f);\n\n    /// Sub function of placeMeting method\n    bool placeMettingSubFunction(float x, float y, MainObject const *other) const;\n\n    /// Allows to update sprite when step function is disabled\n    void updateSDMsprite();\n\n    float m_x, m_y, m_xStart, m_yStart, m_xPrevious, m_yPrevious;\n    float m_speed, m_hsp, m_vsp;\n    float m_frameStart, m_frameEnd, m_frame, m_imageXscale, m_imageYscale, m_imageScale, m_imageAngle;\n    float m_xOffset, m_yOffset;\n    float m_time;\n    unsigned int m_w, m_h;\n    int m_instanceId, m_imageAlpha, m_imageIndex;\n    bool m_isActive, m_isSDMSprite;\n\n    /// Allows to draw collision mask\n    bool m_drawMask;\n    bool m_centerSpr = false;\n    is::Rectangle m_aabb;\n    is::Circle m_circle;\n    sf::Sprite m_sprParent;\n};\n\n/// Check if instance exists\ntemplate<class T>\nbool instanceExist(std::shared_ptr<T> const &obj)\n{\n    return (obj.get() != nullptr);\n}\n\n/// Check if instance exists\ntemplate<class T>\nbool instanceExist(std::unique_ptr<T> const &obj)\n{\n    return (obj.get() != nullptr);\n}\n\n/// Check if instance exists\ntemplate<class T>\nbool instanceExist(T const *obj)\n{\n    return (obj != nullptr);\n}\n\n/// destroye instance\ntemplate<class T>\nvoid instanceDestroy(T *obj)\n{\n    if (is::instanceExist(obj))\n    {\n        delete obj;\n        obj = nullptr;\n    }\n}\n\n/// Functor for compare the x position of objects\nextern float COMPARE_DISTANCE;\n\nclass CompareX\n{\npublic:\n    bool operator()(std::shared_ptr<MainObject> const &a, std::shared_ptr<MainObject> const &b) const\n    {\n        float xA = ((is::instanceExist(a)) ? a->getX() : 0.f);\n        float xB = ((is::instanceExist(b)) ? b->getX() : 0.f);\n        return (xA < xB);\n    }\n    bool operator()(MainObject const *a, MainObject const *b) const\n    {\n        float xA = ((is::instanceExist(a)) ? a->getX() : 0.f);\n        float xB = ((is::instanceExist(b)) ? b->getX() : 0.f);\n        return (xA < xB);\n    }\n};\nbool operator<(const MainObject *a, const MainObject &b);\nbool operator<(const MainObject &b, const MainObject *a);\nbool operator<(std::shared_ptr<MainObject> const &a, const MainObject &b);\nbool operator<(const MainObject &b, std::shared_ptr<MainObject> const &a);\n\n/// Sort object array by x position\ntemplate<class T>\nvoid sortObjArrayByX(std::list<std::shared_ptr<T>> &v)\n{\n    std::sort(v.begin(), v.end(), is::CompareX());\n}\n\n/// Sort object array by x position\ntemplate<class T>\nvoid sortObjArrayByX(std::list<T*> &v)\n{\n    std::sort(v.begin(), v.end(), is::CompareX());\n}\n\n/// Sort object array by x position\ntemplate<class T>\nvoid sortObjArrayByX(std::vector<std::shared_ptr<T>> &v)\n{\n    std::sort(v.begin(), v.end(), is::CompareX());\n}\n\n/// Sort object array by x position\ntemplate<class T>\nvoid sortObjArrayByX(std::vector<T*> &v)\n{\n    std::sort(v.begin(), v.end(), is::CompareX());\n}\n\n#if defined(IS_ENGINE_USE_SDM)\n/// Functor for compare the depth of objects\nclass CompareDepth\n{\npublic:\n    bool operator()(std::shared_ptr<MainObject> const &a, std::shared_ptr<MainObject> const &b) const\n    {\n        int depthA = ((is::instanceExist(a)) ? a->getDepth() : DepthObject::VERY_BIG_DEPTH + 1);\n        int depthB = ((is::instanceExist(b)) ? b->getDepth() : DepthObject::VERY_BIG_DEPTH + 1);\n        return (depthA > depthB);\n    }\n};\n\n/// Sort object array by depth\ntemplate<class T>\nvoid sortObjArrayByDepth(std::list<std::shared_ptr<T>> &v)\n{\n    v.sort(is::CompareDepth());\n}\n#endif\n}\n\n#endif // MAINOBJECT_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/DepthObject.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef DepthOBJECT_H_INCLUDED\n#define DepthOBJECT_H_INCLUDED\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for manage the depth of drawing object\n////////////////////////////////////////////////////////////\nclass DepthObject\n{\npublic:\n    enum Depth\n    {\n        VERY_BIG_DEPTH = 99999,\n        BIG_DEPTH = 999,\n        NORMAL_DEPTH = 0,\n        SMALL_DEPTH = -999,\n        VERY_SMALL_DEPTH = -99999,\n    };\n\n    DepthObject(int depth) :\n        m_depth(depth)\n    {}\n\n    virtual void setDepth(int val)\n    {\n        m_depth = val;\n    }\n\n    virtual int getDepth() const\n    {\n        return m_depth;\n    }\n\nprotected:\n    int m_depth;\n};\n}\n#endif // DepthOBJECT_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/Destructible.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef DESTRUCTIBLE_H_INCLUDED\n#define DESTRUCTIBLE_H_INCLUDED\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class to manage the destructible object\n////////////////////////////////////////////////////////////\nclass Destructible\n{\npublic:\n    Destructible() :\n        m_destroy(false)\n    {}\n\n    virtual void setDestroyed()\n    {\n        m_destroy = true;\n    }\n\n    virtual bool isDestroyed() const\n    {\n        return m_destroy;\n    }\n\nprotected:\n    bool m_destroy;\n};\n}\n\n#endif // DESTRUCTIBLE_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/FilePath.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef FILEPATH_H_INCLUDED\n#define FILEPATH_H_INCLUDED\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// class to manage the path of a file\n////////////////////////////////////////////////////////////\nclass FilePath\n{\npublic:\n    FilePath(const std::string& filePath):\n        m_strFilePath(filePath),\n        m_fileIsLoaded(false)\n    {}\n\n    /// Set file path\n    virtual void setFilePath(const std::string& filePath) {m_strFilePath = filePath;}\n\n    /// Return file path\n    virtual const std::string& getFilePath() const noexcept {return m_strFilePath;}\n\n    /// Allows to know if file is loaded\n    virtual bool getFileIsLoaded() const {return m_fileIsLoaded;}\n\nprotected:\n    std::string m_strFilePath;\n    bool m_fileIsLoaded;\n};\n}\n\n#endif // FILEPATH_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/Health.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef HEALTH_H_INCLUDED\n#define HEALTH_H_INCLUDED\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Provides methods and attributes to manage the health of\n/// a character\n////////////////////////////////////////////////////////////\nclass Health\n{\npublic:\n    Health(int health):\n        m_health(health),\n        m_maxHealth(health)\n    {}\n\n    Health(int health, int maxHealth):\n        m_health(health),\n        m_maxHealth(maxHealth)\n    {}\n\n    virtual void setHealth(int val)\n    {\n        m_health = val;\n        if (m_health < 0) m_health = 0;\n        if (m_health > m_maxHealth) m_health = m_maxHealth;\n    }\n\n    virtual void setMaxHealth(int val)\n    {\n        m_maxHealth = val;\n        if (m_maxHealth < 1) m_maxHealth = 1;\n    }\n\n    virtual void addHealth(int val = 1)\n    {\n        m_health += val;\n        if (m_health < 0) m_health = 0;\n        if (m_health > m_maxHealth) m_health = m_maxHealth;\n    }\n\n    virtual int getHealth() const\n    {\n        return m_health;\n    }\n\n    virtual int getMaxHealth() const\n    {\n        return m_maxHealth;\n    }\n\nprotected:\n    int m_health, m_maxHealth;\n};\n}\n#endif // HEALTH_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/HurtEffect.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef HURTEFFECT_H_INCLUDED\n#define HURTEFFECT_H_INCLUDED\n\n#include \"../MainObject.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Provides methods to make a blind effect on a character\n////////////////////////////////////////////////////////////\nclass HurtEffect\n{\npublic:\n    HurtEffect(sf::Sprite &sprParent) :\n        m_spr(sprParent),\n        m_isHurtTime(0.f)\n    {}\n\n    virtual void hurtStep(const float &DELTA_TIME)\n    {\n        if (m_isHurtTime > 0.f)\n        {\n            m_isHurtTime -= is::getMSecond(DELTA_TIME);\n            is::setSFMLObjAlpha(m_spr, is::choose(5, 25, 200, 100, 25, 150));\n        }\n        else\n        {\n            m_isHurtTime = 0.f;\n            is::setSFMLObjAlpha(m_spr, 255);\n        }\n    }\n\n    virtual void setIsHurt(float duration = 100.f)\n    {\n        m_isHurtTime = duration;\n    }\n\n    virtual bool getIsHurt() const\n    {\n        return (m_isHurtTime > 0.f);\n    }\n\nprotected:\n    sf::Sprite &m_spr;\n    float m_isHurtTime;\n};\n}\n#endif // HURTEFFECT_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/Name.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef NAME_H_INCLUDED\n#define NAME_H_INCLUDED\n\n#include <string>\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for manage the name of object\n////////////////////////////////////////////////////////////\nclass Name\n{\npublic:\n    explicit Name(const std::string& name = \"Unknown\"):\n        m_strName(name)\n    {}\n\n    /// Set name\n    virtual void setName(const std::string& name) {m_strName = name;}\n\n    /// Return name\n    virtual const std::string& getName() const noexcept {return m_strName;}\n\nprotected:\n    std::string m_strName;\n};\n}\n\n#endif // NAME_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/ScorePoint.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef SCOREPOINT_H_INCLUDED\n#define SCOREPOINT_H_INCLUDED\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Provides methods to assign a score point to a character\n////////////////////////////////////////////////////////////\nclass ScorePoint\n{\npublic:\n    explicit ScorePoint(int point = 0) :\n        m_scorePoint(point)\n    {}\n\n    virtual void setScorePoint(int point)\n    {\n        m_scorePoint = point;\n    }\n\n    virtual int getScorePoint() const\n    {\n        return m_scorePoint;\n    }\n\nprotected:\n    int m_scorePoint;\n};\n}\n#endif // SCOREPOINT_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/Step.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef STEP_H_INCLUDED\n#define STEP_H_INCLUDED\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Provides methods to manage the step of an object mechanism\n////////////////////////////////////////////////////////////\nclass Step\n{\npublic:\n    Step() :\n        m_step(0)\n    {}\n\n    Step(int step) :\n        m_step(step)\n    {}\n\n    virtual void setStep(int val)\n    {\n        m_step = val;\n    }\n\n    virtual void addStep()\n    {\n        m_step++;\n    }\n\n    virtual void reduceStep()\n    {\n        m_step--;\n    }\n\n    virtual int getStep() const\n    {\n        return m_step;\n    }\n\nprotected:\n    int m_step;\n};\n}\n#endif // STEP_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/Type.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef TYPE_H_INCLUDED\n#define TYPE_H_INCLUDED\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class which allows to manage object types based on an\n/// enum list\n////////////////////////////////////////////////////////////\nclass Type\n{\npublic:\n    Type(int type):\n        m_type(type)\n    {}\n\n    virtual void setType(int type)\n    {\n        m_type = type;\n    }\n\n    virtual int getType() const\n    {\n        return m_type;\n    }\n\nprotected:\n    int m_type;\n};\n}\n\n\n#endif // TYPE_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/entity/parents/Visibilty.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef VISIBILTY_H_INCLUDED\n#define VISIBILTY_H_INCLUDED\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for manage the visibility of object\n////////////////////////////////////////////////////////////\nclass Visibility\n{\npublic:\n    explicit Visibility(bool defaultVisibility = true) :\n        m_visible(defaultVisibility)\n    {}\n\n    virtual void setVisible(bool value)\n    {\n        m_visible = value;\n    }\n\n    virtual bool getVisible() const\n    {\n        return m_visible;\n    }\n\nprotected:\n    bool m_visible;\n};\n}\n\n#endif // VISIBILTY_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/function/GameFunction.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAME_FONCTION_H_INCLUDED\n#define GAME_FONCTION_H_INCLUDED\n\n#include <cmath>\n#include <ctime>\n#include <sstream>\n#include <string>\n#include <iostream>\n\n#include \"../entity/Form.h\"\n#include \"../../../app_src/config/GameConfig.h\"\n\n/// Allows to browse object container (std::vector, ...)\n#define WITH(_SIZE) for(unsigned int _I = 0; _I < _SIZE; ++_I)\n\n#if defined(__ANDROID__)\n// These headers are only needed for direct NDK/JDK interaction\n#include <jni.h>\n#include <android/native_activity.h>\n#include <android/log.h>\n\n#if !defined(IS_ENGINE_SDL_2)\n// Since we want to get the native activity from SFML, we'll have to use an\n// extra header here:\n#include <SFML/System/NativeActivity.hpp>\n#endif\n\n#endif\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n// Do not touch these variables unless you know what you are doing\nextern const float MAX_CLOCK_TIME; ///< game execution timing variables\nextern const float VALUE_CONVERSION; ///< game execution timing variables\nextern const float SECOND;           ///< represent third value in second\nextern const float VALUE_TIME;     ///< game execution timing variables\n////////////////////////////////////////////////////////////\n\nstatic const float PI(3.14159f);\n\n////////////////////////////////////////////////////////////\n/// \\brief SFML Sound or Music state\n///\n////////////////////////////////////////////////////////////\nenum SFMLSndStatus\n{\n    Stopped,\n    Playing,\n    Paused\n};\n\n/// Convert number to string\ntemplate <typename T>\nint enumToNum(T val)\n{\n    return static_cast<int>(val);\n}\n\n/// Convert wchart_t to string\nstd::string w_chart_tToStr(wchar_t const *str);\n\n/// Convert string to wstring\nstd::wstring strToWStr(const std::string &str);\n\n/// Convert number to string\ntemplate <typename T>\nstd::string numToStr(T val)\n{\n    std::ostringstream s;\n    s << val;\n    return s.str();\n}\n\n/// Convert string to number\ntemplate <typename T>\nT strToNum(const std::string &str)\n{\n    T val;\n    std::istringstream iss(str);\n    iss >> val;\n    return val;\n}\n\n/// Convert number to wstring\ntemplate <typename T>\nstd::wstring numToWStr(T val)\n{\n    std::wostringstream ws;\n    ws << val;\n    const std::wstring s(ws.str());\n    return s;\n}\n\n/// Draw zero behind a number\ntemplate <typename T>\nstd::string writeZero(T val, int zeroNumber = 1)\n{\n    std::string str;\n    for (int i(0); i < zeroNumber; i++)\n        if (val < std::pow(10, (i + 1))) str += \"0\";\n    return (str + is::numToStr(val));\n}\n\n/// Return game execution time in millisecond\nint getMSecond(const float &DELTA_TIME);\n\n/// Make a tm structure representing this date\nstd::tm makeTime(int year, int month, int day);\n\n/// Check date limit according to system date\nbool checkDateLimit(int year, int mont, int day);\n\n/// Show log message\nvoid showLog(const std::string& str, bool stopApplication = false);\n\n/// Get array size\ntemplate <size_t SIZE, class T>\ninline size_t arraySize(T (&arr)[SIZE])\n{\n    return SIZE;\n}\n\n/// Return a random value\n/// \\param valNumber Number of values to test\ntemplate <typename T>\nT choose(unsigned short valNumber, T x1, T x2, T x3 = 0, T x4 = 0, T x5 = 0, T x6 = 0, T x7 = 0, T x8 = 0, T x9 = 0)\n{\n    unsigned int randVal = rand() % valNumber;\n\n    switch(randVal)\n    {\n        case 1 : return x2; break;\n        case 2 : return x3; break;\n        case 3 : return x4; break;\n        case 4 : return x5; break;\n        case 5 : return x6; break;\n        case 6 : return x7; break;\n        case 7 : return x8; break;\n        case 8 : return x9; break;\n        default : break;\n    }\n    return x1;\n}\n\n/// Return a random value\ninline int random(unsigned int limit)\n{\n    return (rand() % limit);\n}\n\n/// Set variable limit\ntemplate <typename T>\nvoid setVarLimit(T &var, T valMin, T valMax)\n{\n    if (var < valMin) var = valMin;\n    if (var > valMax) var = valMin;\n}\n\n/// Test many values in comparison with a variable\n/// \\param valNumber number of values to test\nbool isIn(unsigned short valNumber, const int var, int x1, int x2, int x3 = 0, int x4 = 0, int x5 = 0, int x6 = 0, int x7 = 0, int x8 = 0, int x9 = 0);\n\n/// Return if a is in [b,c]\nbool isBetween(float a, float b, float c);\n\n/// Return if [l1,r1] intersect [l2,r2]\nbool isCrossing(float l1, float r1, float l2, float r2);\n\n/// Return sign of x\nint sign(float x);\n\n/// Return angle between two points (x1, y1) and (x2, y2)\ntemplate <typename T>\nT pointDirection(float x1, float y1, float x2, float y2)\n{\n    if (static_cast<int>(x1) == static_cast<int>(x2))\n    {\n        if (y2 > y1) return (0.5f * PI);\n        else return (1.5f * PI);\n    }\n    float result = std::atan((y2 - y1) / (x2 - x1));\n    if (x2 < x1) result += PI;\n    if (result < 0.f) result += 2.f * PI;\n    result *= 180.f / PI;\n    return result;\n}\n\n/// Convert radian to grade\nfloat radToDeg(float x);\n\n/// Convert grade to radian\nfloat degToRad(float x);\n\n/// Return x component of the vector\n/// \\param useScreenScale allows to take into account the scale of the screen during calculations\nfloat lengthDirX(float dir, float angle, bool useScreenScale = false);\n\n/// Return y component of the vector\n/// \\param useScreenScale allows to take into account the scale of the screen during calculations\nfloat lengthDirY(float dir, float angle, bool useScreenScale = false);\n\n/// Allows to increment a variable while controlling the upper limit\n/// \\param increaseValue Will be multiplied later by @a is::VALUE_CONVERSION\ntemplate <typename T>\nvoid increaseVar(const float &DELTA_TIME, T &var, T increaseValue, T varFinal, T varMax)\n{\n    if (var < varMax) var += ((increaseValue * is::VALUE_CONVERSION) * DELTA_TIME);\n    else var = varFinal;\n}\n\n/// Allows to decrement a variable while controlling the lower limit\n/// \\param decreasingValue Will be multiplied later by @a is::VALUE_CONVERSION\ntemplate <typename T>\nvoid decreaseVar(const float &DELTA_TIME, T &var, T decreaseValue, T varFinal = 0, T varMin = 0)\n{\n    if (var > varMin) var -= ((decreaseValue * is::VALUE_CONVERSION) * DELTA_TIME);\n    else var = varFinal;\n}\n\n/// Test collision between two rectangles\nbool collisionTest(Rectangle const &a, Rectangle const &b);\n\n/// Test collision between two circles\nbool collisionTest(Circle const &a, Circle const &b);\n\n/// Test collision between rectangle and circle\nbool collisionTest(Circle const &circle, Rectangle const &rec);\n\n/// Test collision between rectangle and circle\nbool collisionTest(Rectangle const &rec, Circle const &circle);\n\n////////////////////////////////////////////////////////////\n//                      WARNING !!!\n// Below this comment all the functions that will be defined\n// will be linked to the SFML library.\n////////////////////////////////////////////////////////////\n\n/// Return the angle of SFML object\ntemplate <class T>\nfloat getSFMLObjAngle(T &obj)\n{\n    return obj.getRotation();\n}\n\n/// Return the angle of SFML object\ntemplate <class T>\nfloat getSFMLObjAngle(T *obj)\n{\n    return obj->getRotation();\n}\n\n/// Return the x scale size of SFML object\ntemplate <class T>\nfloat getSFMLObjXScale(T &obj)\n{\n    return obj.getScale().x;\n}\n\n/// Return the x scale size of SFML object\ntemplate <class T>\nfloat getSFMLObjXScale(T *obj)\n{\n    return obj->getScale().x;\n}\n\n/// Return the scale size of SFML object\ntemplate <class T>\nfloat getSFMLObjYScale(T &obj)\n{\n    return obj.getScale().y;\n}\n\n/// Return the scale size of SFML object\ntemplate <class T>\nfloat getSFMLObjYScale(T *obj)\n{\n    return obj->getScale().y;\n}\n\n/// Return the width of SFML object\ntemplate <class T>\nfloat getSFMLObjWidth(T &obj)\n{\n    return obj.getGlobalBounds().width;\n}\n\n/// Return the width of SFML object\ntemplate <class T>\nfloat getSFMLObjWidth(T *obj)\n{\n    return obj->getGlobalBounds().width;\n}\n\n/// Return the y height of SFML object\ntemplate <class T>\nfloat getSFMLObjHeight(T &obj)\n{\n    return obj.getGlobalBounds().height;\n}\n\n/// Return the y height of SFML object\ntemplate <class T>\nfloat getSFMLObjHeight(T *obj)\n{\n    return obj->getGlobalBounds().height;\n}\n\n/// Return the width of SFML texture\ninline int getSFMLTextureWidth(sf::Texture const &obj)\n{\n    return obj.getSize().x;\n}\n\n/// Return the width of SFML texture\ninline int getSFMLTextureWidth(sf::Texture const *obj)\n{\n    return obj->getSize().x;\n}\n\n/// Return the height of SFML texture\ninline int getSFMLTextureHeight(sf::Texture const &obj)\n{\n    return obj.getSize().y;\n}\n\n/// Return the height of SFML texture\ninline int getSFMLTextureHeight(sf::Texture const *obj)\n{\n    return obj->getSize().y;\n}\n\n/// Return the x origin of SFML object\ntemplate <class T>\nfloat getSFMLObjOriginX(T &obj)\n{\n    return obj.getOrigin().x;\n}\n\n/// Return the y origin of SFML object\ntemplate <class T>\nfloat getSFMLObjOriginY(T &obj)\n{\n    return obj.getOrigin().y;\n}\n\n/// Return the x position of SFML object\ntemplate <class T>\nfloat getSFMLObjX(T &obj)\n{\n    return obj.getPosition().x;\n}\n\n/// Return the x position of SFML object\ntemplate <class T>\nfloat getSFMLObjX(T *obj)\n{\n    return obj->getPosition().x;\n}\n\n/// Return the y position of SFML object\ntemplate <class T>\nfloat getSFMLObjY(T &obj)\n{\n    return obj.getPosition().y;\n}\n\n/// Return the y position of SFML object\ntemplate <class T>\nfloat getSFMLObjY(T *obj)\n{\n    return obj->getPosition().y;\n}\n\n/// Return the alpha of SFML object\ntemplate <class T>\nunsigned int getSFMLObjAlpha(T &obj)\n{\n    return obj.getColor().a;\n}\n\n/// Return the alpha of SFML object\ntemplate <class T>\nunsigned int getSFMLObjAlpha(T *obj)\n{\n    return obj->getColor().a;\n}\n\n/// Set the angle of SFML object\ntemplate <class T>\nvoid setSFMLObjAngle(T &obj, float angle)\n{\n    obj.setRotation(angle);\n}\n\n/// Set the angle of SFML object\ntemplate <class T>\nvoid setSFMLObjAngle(T *obj, float angle)\n{\n    obj->setRotation(angle);\n}\n\n/// Set rotation of SFML object\ntemplate <class T>\nvoid setSFMLObjRotate(T &obj, float rotationSpeed)\n{\n    obj.rotate(rotationSpeed);\n}\n\n/// Set rotation of SFML object\ntemplate <class T>\nvoid setSFMLObjRotate(T *obj, float rotationSpeed)\n{\n    obj->rotate(rotationSpeed);\n}\n\n/// Set the x scale of SFML object\ntemplate <class T>\nvoid setSFMLObjXScale(T &obj, float x)\n{\n    obj.setScale(x, obj.getScale().y);\n}\n\n/// Set the x scale of SFML object\ntemplate <class T>\nvoid setSFMLObjXScale(T *obj, float x)\n{\n    obj->setScale(x, obj->getScale().y);\n}\n\n/// Set the y scale of SFML object\ntemplate <class T>\nvoid setSFMLObjYScale(T &obj, float y)\n{\n    obj.setScale(obj.getScale().x, y);\n}\n\n/// Set the y scale of SFML object\ntemplate <class T>\nvoid setSFMLObjYScale(T *obj, float y)\n{\n    obj->setScale(obj->getScale().x, y);\n}\n\n/// Set the x, y scale of SFML object\ntemplate <class T>\nvoid setSFMLObjScaleX_Y(T &obj, float x, float y)\n{\n    obj.setScale(x, y);\n}\n\n/// Set the x, y scale of SFML object\ntemplate <class T>\nvoid setSFMLObjScaleX_Y(T *obj, float x, float y)\n{\n    obj->setScale(x, y);\n}\n\n/// Set the scale of SFML object\ntemplate <class T>\nvoid setSFMLObjScale(T &obj, float scale)\n{\n    obj.setScale(scale, scale);\n}\n\n/// Set the scale of SFML object\ntemplate <class T>\nvoid setSFMLObjScale(T *obj, float scale)\n{\n    obj->setScale(scale, scale);\n}\n\n/// Set origin of SFML object\ntemplate <class T>\nvoid setSFMLObjOrigin(T &obj, float x, float y)\n{\n    obj.setOrigin(x, y);\n}\n\n/// Set origin of SFML object\ntemplate <class T>\nvoid setSFMLObjOrigin(T *obj, float x, float y)\n{\n    obj->setOrigin(x, y);\n}\n\n/// Set x position of SFML object\ntemplate <class T>\nvoid setSFMLObjX(T &obj, float x)\n{\n    obj.setPosition(x, obj.getPosition().y);\n}\n\n/// Set x position of SFML object\ntemplate <class T>\nvoid setSFMLObjX(T *obj, float x)\n{\n    obj->setPosition(x, obj->getPosition().y);\n}\n\n/// Set y position of SFML object\ntemplate <class T>\nvoid setSFMLObjY(T &obj, float y)\n{\n    obj.setPosition(obj.getPosition().x, y);\n}\n\n/// Set y position of SFML object\ntemplate <class T>\nvoid setSFMLObjY(T *obj, float y)\n{\n    obj->setPosition(obj->getPosition().x, y);\n}\n\n/// Set x, y position of SFML object\ntemplate <class T>\nvoid setSFMLObjX_Y(T &obj, float x, float y)\n{\n    obj.setPosition(x, y);\n}\n\n/// Set x, y position of SFML object\ntemplate <class T>\nvoid setSFMLObjX_Y(T *obj, float x, float y)\n{\n    obj->setPosition(x, y);\n}\n\n/// Set x, y position of SFML object\ntemplate <class T>\nvoid setSFMLObjX_Y(T &obj, sf::Vector2f position)\n{\n    obj.setPosition(position.x, position.y);\n}\n\n/// Set x, y position of SFML object\ntemplate <class T>\nvoid setSFMLObjX_Y(T *obj, sf::Vector2f position)\n{\n    obj->setPosition(position.x, position.y);\n}\n\n/// Move SFML object on x axis\ntemplate <class T>\nvoid moveSFMLObjX(T &obj, float speed)\n{\n    obj.setPosition(obj.getPosition().x + speed, obj.getPosition().y);\n}\n\n/// Move SFML object on x axis\ntemplate <class T>\nvoid moveSFMLObjX(T *obj, float speed)\n{\n    obj->setPosition(obj->getPosition().x + speed, obj->getPosition().y);\n}\n\n/// Move SFML object on y axis\ntemplate <class T>\nvoid moveSFMLObjY(T &obj, float speed)\n{\n    obj.setPosition(obj.getPosition().x, obj.getPosition().y + speed);\n}\n\n/// Move SFML object on y axis\ntemplate <class T>\nvoid moveSFMLObjY(T *obj, float speed)\n{\n    obj->setPosition(obj->getPosition().x, obj->getPosition().y + speed);\n}\n\n/// Set SFML object size\ntemplate <class T>\nvoid setSFMLObjSize(T &obj, float x, float y)\n{\n    obj.setSize(sf::Vector2f(x, y));\n}\n\n/// Set SFML object size\ntemplate <class T>\nvoid setSFMLObjSize(T *obj, float x, float y)\n{\n    obj->setSize(sf::Vector2f(x, y));\n}\n\n/// Set SFML object size\ntemplate <class T>\nvoid setSFMLObjSize(T &obj, sf::Vector2f v)\n{\n    setSFMLObjSize(obj, v.x, v.y);\n}\n\n/// Set SFML object size\ntemplate <class T>\nvoid setSFMLObjSize(T *obj, sf::Vector2f v)\n{\n    setSFMLObjSize(obj, v.x, v.y);\n}\n\n/// Set the alpha of SFML object\ntemplate <class T>\nvoid setSFMLObjAlpha(T &obj, unsigned int alpha)\n{\n    obj.setColor(sf::Color(obj.getColor().r, obj.getColor().g, obj.getColor().b, alpha));\n}\n\n/// Set the alpha of SFML object\ntemplate <class T>\nvoid setSFMLObjAlpha(T *obj, unsigned int alpha)\n{\n    obj->setColor(sf::Color(obj->getColor().r, obj->getColor().g, obj->getColor().b, alpha));\n}\n\n/// Set the alpha of SFML shape or text object\ntemplate <class T>\nvoid setSFMLObjAlpha2(T &obj, unsigned int alpha)\n{\n    obj.setFillColor(sf::Color(obj.getFillColor().r, obj.getFillColor().g, obj.getFillColor().b, alpha));\n}\n\n/// Set the alpha of SFML shape or text object\ntemplate <class T>\nvoid setSFMLObjAlpha2(T *obj, unsigned int alpha)\n{\n    obj->setFillColor(sf::Color(obj->getFillColor().r, obj->getFillColor().g, obj->getFillColor().b, alpha));\n}\n\n/// Set the alpha and uniform RGB color of SFML object\ntemplate <class T>\nvoid setSFMLObjAlpha(T &obj, unsigned int alpha, sf::Uint8 rgb)\n{\n    obj.setColor(sf::Color(rgb, rgb, rgb, alpha));\n}\n\n/// Set the alpha and uniform RGB color of SFML object\ntemplate <class T>\nvoid setSFMLObjAlpha(T *obj, unsigned int alpha, sf::Uint8 rgb)\n{\n    obj->setColor(sf::Color(rgb, rgb, rgb, alpha));\n}\n\n/// Set the alpha and RGB distinct color of SFML object\ntemplate <class T>\nvoid setSFMLObjAlpha(T &obj, unsigned int alpha, int r, int g, int b)\n{\n    obj.setColor(sf::Color(r, g, b, alpha));\n}\n\n/// Set the alpha and RGB distinct color of SFML object\ntemplate <class T>\nvoid setSFMLObjAlpha(T *obj, unsigned int alpha, int r, int g, int b)\n{\n    obj->setColor(sf::Color(r, g, b, alpha));\n}\n\n/// Set the color of SFML object\ntemplate <class T>\nvoid setSFMLObjColor(T &obj, sf::Color color)\n{\n    obj.setColor(color);\n}\n\n/// Set the color of SFML object\ntemplate <class T>\nvoid setSFMLObjColor(T *obj, sf::Color color)\n{\n    obj->setColor(color);\n}\n\n/// Set the color of SFML shape\ntemplate <class T>\nvoid setSFMLObjFillColor(T &obj, sf::Color color)\n{\n    obj.setFillColor(color);\n}\n\n/// Set the color of SFML shape\ntemplate <class T>\nvoid setSFMLObjFillColor(T *obj, sf::Color color)\n{\n    obj->setFillColor(color);\n}\n\n/// Allows to make scale animation\ntemplate <class T>\nvoid scaleAnimation(const float &DELTA_TIME, float &var, T &obj, short varSign = 1, float scaleSize = 1.f)\n{\n    if (var > scaleSize) var -= ((0.05f * is::VALUE_CONVERSION) * DELTA_TIME);\n    else var = scaleSize;\n    setSFMLObjScale(obj, varSign * var);\n}\n\n/// Allows to make scale animation\ntemplate <class T>\nvoid scaleAnimation(const float &DELTA_TIME, float &var, T *obj, short varSign = 1, float scaleSize = 1.f)\n{\n    scaleAnimation(DELTA_TIME, var, *obj, varSign, scaleSize);\n}\n\n/// Allows to animate SFML text in relation to a option\nvoid setTextAnimation(sf::Text &txt, int &var, int val);\n\n/// Allows to animate SFML text in relation to a option\ninline void setTextAnimation(sf::Text *txt, int &var, int val)\n{\n    setTextAnimation(*txt, var, val);\n}\n\n/// Allows to animate SFML text and sprites in relation to a option\nvoid setTextAnimation(sf::Text &txt, sf::Sprite &spr, sf::Sprite &sprSelected, int &var, int val);\n\n/// Allows to animate SFML text and sprites in relation to a option\ninline void setTextAnimation(sf::Text *txt, sf::Sprite *spr, sf::Sprite *sprSelected, int &var, int val)\n{\n    setTextAnimation(*txt, *spr, *sprSelected, var, val);\n}\n\n/// Set the sprite frame with different size (e.g 64x32)\nvoid setFrame(sf::Sprite &sprite, float frame, int subFrame, int frameWidth, int frameHeight, int recWidth, int recHeight);\n\n/// Set the sprite frame with different size (e.g 64x32)\ninline void setFrame(sf::Sprite *sprite, float frame, int subFrame, int frameWidth, int frameHeight, int recWidth, int recHeight)\n{\n    setFrame(*sprite, frame, subFrame, frameWidth, frameHeight, recWidth, recHeight);\n}\n\n/// Set the sprite frame with the same size (e.g 64x64)\nvoid setFrame(sf::Sprite &sprite, float frame, int subFrame, int frameSize);\n\n/// Set the sprite frame with the same size (e.g 64x64)\ninline void setFrame(sf::Sprite *sprite, float frame, int subFrame, int frameSize)\n{\n    setFrame(*sprite, frame, subFrame, frameSize);\n}\n\n/// Set the outline thickness and color of SFML object\ntemplate <class T>\nvoid setSFMLObjOutlineColor(T &obj, sf::Color color, float thickness = 1.f)\n{\n    obj.setOutlineThickness(thickness);\n    obj.setOutlineColor(color);\n}\n\n/// Set the outline thickness and color of SFML object\ntemplate <class T>\nvoid setSFMLObjOutlineColor(T *obj, sf::Color color, float thickness = 1.f)\n{\n    setSFMLObjOutlineColor(*obj, color, thickness);\n}\n\n/// Set Texture Rec of SFML object\ntemplate <class T>\nvoid setSFMLObjTexRec(T &obj, int x, int y, int w, int h)\n{\n    obj.setTextureRect(sf::IntRect(x, y, w, h));\n}\n\n/// Set Texture Rec of SFML object\ntemplate <class T>\nvoid setSFMLObjTexRec(T *obj, int x, int y, int w, int h)\n{\n    obj->setTextureRect(sf::IntRect(x, y, w, h));\n}\n\n/// Set the properties of SFML Sprite\ninline void setSFMLObjProperties(sf::Sprite &obj, float x, float y, float angle = 0.f, int alpha = 255, float xScale = 1.f, float yScale = 1.f)\n{\n    is::setSFMLObjAlpha(obj, alpha);\n    is::setSFMLObjAngle(obj, angle);\n    is::setSFMLObjScaleX_Y(obj, xScale, yScale);\n    is::setSFMLObjX_Y(obj, x, y);\n}\n\n/// Set the properties of SFML Sprite\ninline void setSFMLObjProperties(sf::Sprite *obj, float x, float y, float angle = 0.f, int alpha = 255, float xScale = 1.f, float yScale = 1.f)\n{\n    setSFMLObjProperties(*obj, x, y, angle, alpha, xScale, yScale);\n}\n\n/// Set the properties of SFML Text\ninline void setSFMLObjProperties(sf::Text &obj, float x, float y, float angle = 0.f, int alpha = 255, float xScale = 1.f, float yScale = 1.f)\n{\n    is::setSFMLObjAlpha2(obj, alpha);\n    is::setSFMLObjAngle(obj, angle);\n    is::setSFMLObjScaleX_Y(obj, xScale, yScale);\n    is::setSFMLObjX_Y(obj, x, y);\n}\n\n/// Set the properties of SFML Text\ninline void setSFMLObjProperties(sf::Text *obj, float x, float y, float angle = 0.f, int alpha = 255, float xScale = 1.f, float yScale = 1.f)\n{\n    setSFMLObjProperties(*obj, x, y, angle, alpha, xScale, yScale);\n}\n\n/// Set the properties of SFML Rectangle\ninline void setSFMLObjProperties(sf::RectangleShape &obj, float x, float y, float angle = 0.f, int alpha = 255, float xScale = 1.f, float yScale = 1.f)\n{\n    is::setSFMLObjAlpha2(obj, alpha);\n    is::setSFMLObjAngle(obj, angle);\n    is::setSFMLObjScaleX_Y(obj, xScale, yScale);\n    is::setSFMLObjX_Y(obj, x, y);\n}\n\n/// Set the properties of SFML Rectangle\ninline void setSFMLObjProperties(sf::RectangleShape *obj, float x, float y, float angle = 0.f, int alpha = 255, float xScale = 1.f, float yScale = 1.f)\n{\n    setSFMLObjProperties(*obj, x, y, angle, alpha, xScale, yScale);\n}\n\n/// Set the properties of SFML Circle\ninline void setSFMLObjProperties(sf::CircleShape &obj, float x, float y, float angle = 0.f, int alpha = 255, float xScale = 1.f, float yScale = 1.f)\n{\n    is::setSFMLObjAlpha2(obj, alpha);\n    is::setSFMLObjAngle(obj, angle);\n    is::setSFMLObjScaleX_Y(obj, xScale, yScale);\n    is::setSFMLObjX_Y(obj, x, y);\n}\n\n/// Set the properties of SFML Circle\ninline void setSFMLObjProperties(sf::CircleShape *obj, float x, float y, float angle = 0.f, int alpha = 255, float xScale = 1.f, float yScale = 1.f)\n{\n    setSFMLObjProperties(*obj, x, y, angle, alpha, xScale, yScale);\n}\n\n/// Center SFML object\ntemplate <class T>\nvoid centerSFMLObj(T &obj)\n{\n    obj.setOrigin(\n#if !defined(IS_ENGINE_SFML)\n    obj.getTextureRect().width / 2, obj.getTextureRect().height / 2\n#else\n    obj.getGlobalBounds().width / 2, obj.getGlobalBounds().height / 2\n#endif\n    );\n}\n\n/// Center SFML object\ntemplate <class T>\nvoid centerSFMLObj(T *obj)\n{\n    centerSFMLObj(*obj);\n}\n\n/// Center SFML object X\ntemplate <class T>\nvoid centerSFMLObjX(T &obj)\n{\n    obj.setOrigin(\n#if !defined(IS_ENGINE_SFML)\n                  obj.getTextureRect().width / 2\n#else\n                  obj.getGlobalBounds().width / 2\n#endif\n                  , obj.getOrigin().y);\n}\n\n/// Center SFML object X\ntemplate <class T>\nvoid centerSFMLObjX(T *obj)\n{\n    centerSFMLObjX(*obj);\n}\n\n/// Center SFML object Y\ntemplate <class T>\nvoid centerSFMLObjY(T &obj)\n{\n    obj.setOrigin(obj.getOrigin().x,\n#if !defined(IS_ENGINE_SFML)\n                  obj.getTextureRect().height / 2\n#else\n                  obj.getGlobalBounds().height / 2\n#endif\n                  );\n}\n\n/// Center SFML object Y\ntemplate <class T>\nvoid centerSFMLObjY(T *obj)\n{\n    centerSFMLObjY(*obj);\n}\n\n/// Load SFML Texture Resource\ninline void loadSFMLTexture(sf::Texture &obj, const std::string& filePath)\n{\n    obj.loadFromFile(filePath);\n}\n\n/// Load SFML Texture Resource\ninline void loadSFMLTexture(sf::Texture *obj, const std::string& filePath)\n{\n    obj->loadFromFile(filePath);\n}\n\n/// Load SFML Font Resource\ninline void loadSFMLFont(sf::Font &obj, const std::string& filePath, int fontDefaultSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE)\n{\n#if !defined(IS_ENGINE_SFML)\n    obj.setSDLFontSize(fontDefaultSize);\n#endif\n    obj.loadFromFile(filePath);\n}\n\n/// Load SFML Font Resource\ninline void loadSFMLFont(sf::Font *obj, const std::string& filePath, int fontDefaultSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE)\n{\n    loadSFMLFont(*obj, filePath, fontDefaultSize);\n}\n\n/// Load SFML Sound Buffer Resource\ninline void loadSFMLSoundBuffer(sf::SoundBuffer &obj, const std::string& filePath)\n{\n    obj.loadFromFile(filePath);\n}\n\n/// Load SFML Sound Buffer Resource\ninline void loadSFMLSoundBuffer(sf::SoundBuffer *obj, const std::string& filePath)\n{\n    obj->loadFromFile(filePath);\n}\n\n/// Load SFML Sound Buffer Resource and define it with the Sound\ninline void loadSFMLSoundBufferWithSnd(sf::SoundBuffer &sb, sf::Sound &snd, const std::string& filePath)\n{\n    if (sb.loadFromFile(filePath)) snd.setBuffer(sb);\n    else showLog(\"ERROR: Can't load Sound Buffer : \" + filePath + \" with sound\");\n}\n\n/// Load SFML Sound Buffer Resource and define it with the Sound\ninline void loadSFMLSoundBufferWithSnd(sf::SoundBuffer *sb, sf::Sound *snd, const std::string& filePath)\n{\n    loadSFMLSoundBufferWithSnd(*sb, *snd, filePath);\n}\n\n/// Load SFML Music Resource\ninline void loadSFMLMusic(sf::Music &obj, const std::string& filePath)\n{\n    obj.openFromFile(filePath);\n}\n\n/// Load SFML Music Resource\ninline void loadSFMLMusic(sf::Music *obj, const std::string& filePath)\n{\n    obj->openFromFile(filePath);\n}\n\n/// Check SFML Sound state\ntemplate <class T>\nbool checkSFMLSndState(T &obj, SFMLSndStatus state)\n{\n    switch (state)\n    {\n        case SFMLSndStatus::Playing:\n            return (obj.getStatus() == sf::Sound::Status::Playing);\n        break;\n        case SFMLSndStatus::Stopped:\n            return (obj.getStatus() == sf::Sound::Status::Stopped);\n        break;\n        case SFMLSndStatus::Paused:\n            return (obj.getStatus() == sf::Sound::Status::Paused);\n        break;\n    }\n    return false;\n}\n\n/// Check SFML Sound state\ntemplate <class T>\nbool checkSFMLSndState(T *obj, SFMLSndStatus state) {\n    if (obj != nullptr)\n    {\n        switch (state)\n        {\n        case SFMLSndStatus::Playing:\n            return (obj->getStatus() == sf::Sound::Status::Playing);\n        case SFMLSndStatus::Stopped:\n            return (obj->getStatus() == sf::Sound::Status::Stopped);\n        case SFMLSndStatus::Paused:\n            return (obj->getStatus() == sf::Sound::Status::Paused);\n        }\n    }\n    return false;\n}\n\n/// Allows to play SFML Sound or Music\ntemplate <class T>\nvoid playSFMLSnd(T &obj)\n{\n    obj.play();\n}\n\n/// Allows to play SFML Sound or Music\ntemplate <class T>\nvoid playSFMLSnd(T *obj)\n{\n    if (obj != nullptr) obj->play();\n}\n\n/// Allows to stop SFML Sound or Music\ntemplate <class T>\nvoid stopSFMLSnd(T &obj)\n{\n    obj.stop();\n}\n\n/// Allows to stop SFML Sound or Music\ntemplate <class T>\nvoid stopSFMLSnd(T *obj)\n{\n    if (obj != nullptr) obj->stop();\n}\n\n/// Allows to pause SFML Sound or Music\ntemplate <class T>\nvoid pauseSFMLSnd(T &obj)\n{\n    obj.pause();\n}\n\n/// Allows to pause SFML Sound or Music\ntemplate <class T>\nvoid pauseSFMLSnd(T *obj)\n{\n    if (obj != nullptr) obj->pause();\n}\n\n/// Allows to set SFML Sound or Music loop\ntemplate <class T>\nvoid loopSFMLSnd(T &obj, bool val)\n{\n    obj.loop(val);\n}\n\n/// Allows to set SFML Sound or Music loop\ntemplate <class T>\nvoid loopSFMLSnd(T *obj, bool val)\n{\n    if (obj != nullptr) obj->loop(val);\n}\n\n/// Test collision between SFML object\ntemplate <class A, class B>\nbool collisionTestSFML(A const &objA, B const &objB)\n{\n    return (objB.getGlobalBounds().intersects(objA.getGlobalBounds()));\n}\n\n/// Test collision between SFML object\ntemplate <class A, class B>\nbool collisionTestSFML(A const *objA, B const *objB)\n{\n    return (objB->getGlobalBounds().intersects(objA->getGlobalBounds()));\n}\n\n/// Create SFML Render Texture\n//void createRenderTexture(sf::RenderTexture &renderTexture, unsigned int width, unsigned int height);\n\n/// Create SFML rectangle\nvoid createRectangle(sf::RectangleShape &rec, sf::Vector2f recSize, sf::Color color, float x = 0.f, float y = 0.f, bool center = true);\n\n/// Create SFML rectangle\ninline void createRectangle(sf::RectangleShape *rec, sf::Vector2f recSize, sf::Color color, float x = 0.f, float y = 0.f, bool center = true)\n{\n    createRectangle(*rec, recSize, color, x, y, center);\n}\n\n/// Set SFML Text style\nvoid textStyleConfig(sf::Text &txt, bool underLined, bool boldText, bool italicText);\n\n/// Set SFML Text style\ninline void textStyleConfig(sf::Text *txt, bool underLined, bool boldText, bool italicText)\n{\n    textStyleConfig(*txt, underLined, boldText, italicText);\n}\n\n/// Set SFML Text outline color\nvoid setSFMLTextOutlineColor(sf::Text &txt, float thickness, sf::Color color);\n\n/// Set SFML Text outline color\ninline void setSFMLTextOutlineColor(sf::Text *txt, float thickness, sf::Color color)\n{\n    setSFMLTextOutlineColor(*txt, thickness, color);\n}\n\n/// Create SFML text\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, T const &text, float x, float y,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    txt.setFont(fnt);\n    if (txtSize > 0) txt.setCharacterSize(txtSize);\n    else txt.setCharacterSize(is::GameConfig::DEFAULT_SFML_TEXT_SIZE);\n    textStyleConfig(txt, underLined, boldText, italicText);\n    txt.setString(text);\n    is::setSFMLObjX_Y(txt, x, y);\n    is::setSFMLObjFillColor(txt, is::GameConfig::DEFAULT_SFML_TEXT_COLOR);\n}\n\n/// Create SFML text with center parameter\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, T const &text, float x, float y, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, text, x, y, txtSize, underLined, boldText, italicText);\n    if (centerText) is::centerSFMLObj(txt);\n    is::setSFMLObjX_Y(txt, x, y);\n}\n\n/// Create SFML text with color and size\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, T const &text, float x, float y, sf::Color color,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, text, x, y, txtSize, underLined, boldText, italicText);\n    is::setSFMLObjFillColor(txt, color);\n}\n\n/// Create SFML text with color, size and center\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, T const &text, float x, float y, sf::Color color, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, text, x, y, centerText, txtSize, underLined, boldText, italicText);\n    is::setSFMLObjFillColor(txt, color);\n}\n\n/// Create SFML text outline with color and size\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, T const &text, float x, float y,\n                 sf::Color color, sf::Color outlineColor, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE, float outlineThickness = 1.f,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, text, x, y, color, centerText, txtSize, underLined, boldText, italicText);\n    txt.setOutlineColor(outlineColor);\n    txt.setOutlineThickness(outlineThickness);\n}\n\n/// Create SFML text in Vector\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, std::vector<sf::Text*> &txt, T const &text, float x, float y,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    txt.push_back(new sf::Text());\n    createText(fnt, *txt[txt.size() - 1], text, x, y, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with center parameter in Vector\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, std::vector<sf::Text*> &txt, T const &text, float x, float y, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    txt.push_back(new sf::Text());\n    createText(fnt, *txt[txt.size() - 1], text, x, y, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color and size in Vector\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, std::vector<sf::Text*> &txt, T const &text, float x, float y, sf::Color color,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    txt.push_back(new sf::Text());\n    createText(fnt, *txt[txt.size() - 1], text, x, y, color, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color, size and center in Vector\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, std::vector<sf::Text*> &txt, T const &text, float x, float y, sf::Color color, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    txt.push_back(new sf::Text());\n    createText(fnt, *txt[txt.size() - 1], text, x, y, color, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text outline with color and size in Vector\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, std::vector<sf::Text*> &txt, T const &text, float x, float y,\n                 sf::Color color, sf::Color outlineColor, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE, float outlineThickness = 1.f,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    txt.push_back(new sf::Text());\n    createText(fnt, *txt[txt.size() - 1], text, x, y, color, outlineColor, centerText, txtSize, outlineThickness, underLined, boldText, italicText);\n}\n\n/// Create SFML text\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, T const &text, float x, float y,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, text, x, y, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with center parameter\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, T const &text, float x, float y, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, text, x, y, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color and size\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, T const &text, float x, float y, sf::Color color,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, text, x, y, color, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color, size and center\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, T const &text, float x, float y, sf::Color color, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, text, x, y, color, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text outline with color and size\ntemplate<class T>\nvoid createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, T const &text, float x, float y,\n                 sf::Color color, sf::Color outlineColor, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE, float outlineThickness = 1.f,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, text, x, y, color, outlineColor, centerText, txtSize, outlineThickness, underLined, boldText, italicText);\n}\n\n/// Create SFML text\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const int value, float x, float y,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with center parameter\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const int value, float x, float y, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color and size\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const int value, float x, float y, sf::Color color,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, color, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color, size and center\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const int value, float x, float y, sf::Color color, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, color, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text outline with color and size\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const int value, float x, float y,\n                 sf::Color color, sf::Color outlineColor, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE, float outlineThickness = 1.f,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, color, outlineColor, centerText, txtSize, outlineThickness, underLined, boldText, italicText);\n}\n\n/// Create SFML text\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const int value, float x, float y,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with center parameter\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const int value, float x, float y, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color and size\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const int value, float x, float y, sf::Color color,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, color, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color, size and center\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const int value, float x, float y, sf::Color color, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, color, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text outline with color and size\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const int value, float x, float y,\n                 sf::Color color, sf::Color outlineColor, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE, float outlineThickness = 1.f,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, color, outlineColor, centerText, txtSize, outlineThickness, underLined, boldText, italicText);\n}\n\n/// Create SFML text\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const float value, float x, float y,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with center parameter\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const float value, float x, float y, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color and size\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const float value, float x, float y, sf::Color color,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, color, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color, size and center\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const float value, float x, float y, sf::Color color, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, color, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text outline with color and size\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text &txt, const float value, float x, float y,\n                 sf::Color color, sf::Color outlineColor, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE, float outlineThickness = 1.f,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, txt, numToStr(value), x, y, color, outlineColor, centerText, txtSize, outlineThickness, underLined, boldText, italicText);\n}\n\n/// Create SFML text\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const float value, float x, float y,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with center parameter\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const float value, float x, float y, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color and size\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const float value, float x, float y, sf::Color color,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, color, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text with color, size and center\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const float value, float x, float y, sf::Color color, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, color, centerText, txtSize, underLined, boldText, italicText);\n}\n\n/// Create SFML text outline with color and size\ninline void createText(sf::Font\n                 #if defined(IS_ENGINE_SFML)\n                 const\n                 #endif\n                 &fnt, sf::Text *txt, const float value, float x, float y,\n                 sf::Color color, sf::Color outlineColor, bool centerText,\n                 int txtSize = is::GameConfig::DEFAULT_SFML_TEXT_SIZE, float outlineThickness = 1.f,\n                 bool underLined = false, bool boldText = false, bool italicText = false)\n{\n    createText(fnt, *txt, numToStr(value), x, y, color, outlineColor, centerText, txtSize, outlineThickness, underLined, boldText, italicText);\n}\n\n/// Create SFML sprites without IntRec\nvoid createSprite(sf::Texture &tex, sf::Sprite &spr, sf::Vector2f position, sf::Vector2f origin, bool smooth = true);\n\n/// Create SFML sprites without IntRec\ninline void createSprite(sf::Texture &tex, sf::Sprite *spr, sf::Vector2f position, sf::Vector2f origin, bool smooth = true)\n{\n    createSprite(tex, *spr, position, origin, smooth);\n}\n\n/// Create SFML sprites center without IntRec\ninline void createSprite(sf::Texture &tex, sf::Sprite &spr, sf::Vector2f position, bool center, bool smooth = true)\n{\n    createSprite(tex, spr, position, sf::Vector2f(tex.getSize().x / 2.f, tex.getSize().y / 2.f), smooth);\n}\n\n/// Create SFML sprites center without IntRec\ninline void createSprite(sf::Texture &tex, sf::Sprite *spr, sf::Vector2f position, bool center, bool smooth = true)\n{\n    createSprite(tex, *spr, position, center, smooth);\n}\n\n/// Create SFML sprites with IntRec\nvoid createSprite(sf::Texture &tex, sf::Sprite &spr, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, bool repeatTexture = false, bool smooth = true);\n\n/// Create SFML sprites with IntRec\ninline void createSprite(sf::Texture &tex, sf::Sprite *spr, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, bool repeatTexture = false, bool smooth = true)\n{\n    createSprite(tex, *spr, rec, position, origin, repeatTexture, smooth);\n}\n\n/// Create SFML sprites center with IntRec\ninline void createSprite(sf::Texture &tex, sf::Sprite &spr, sf::IntRect rec, sf::Vector2f position, bool center, bool repeatTexture = false, bool smooth = true)\n{\n    createSprite(tex, spr, rec, position, sf::Vector2f(rec.width / 2.f, rec.height / 2.f), repeatTexture, smooth);\n}\n\n/// Create SFML sprites center with IntRec\ninline void createSprite(sf::Texture &tex, sf::Sprite *spr, sf::IntRect rec, sf::Vector2f position, bool center, bool repeatTexture = false, bool smooth = true)\n{\n    createSprite(tex, *spr, rec, position, center, repeatTexture, smooth);\n}\n\n/// Create SFML sprites advanced\nvoid createSprite(sf::Texture &tex, sf::Sprite &spr, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, sf::Vector2f scale, unsigned int alpha = 255, bool repeatTexture = false, bool smooth = true);\n\n/// Create SFML sprites advanced\ninline void createSprite(sf::Texture &tex, sf::Sprite *spr, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, sf::Vector2f scale, unsigned int alpha = 255, bool repeatTexture = false, bool smooth = true)\n{\n    createSprite(tex, *spr, rec, position, origin, scale, alpha, repeatTexture, smooth);\n}\n\n/// Create SFML sprites without IntRec in Vector\ninline void createSprite(sf::Texture &tex, std::vector<sf::Sprite*> &spr, sf::Vector2f position, sf::Vector2f origin, bool smooth = true)\n{\n    spr.push_back(new sf::Sprite());\n    createSprite(tex, spr[spr.size() - 1], position, origin, smooth);\n}\n\n/// Create SFML sprites with IntRec in Vector\ninline void createSprite(sf::Texture &tex, std::vector<sf::Sprite*> &spr, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, bool repeatTexture = false, bool smooth = true)\n{\n    spr.push_back(new sf::Sprite());\n    createSprite(tex, spr[spr.size() - 1], rec, position, origin, repeatTexture, smooth);\n}\n\n/// Create SFML sprites advanced in Vector\ninline void createSprite(sf::Texture &tex, std::vector<sf::Sprite*> &spr, sf::IntRect rec, sf::Vector2f position, sf::Vector2f origin, sf::Vector2f scale, unsigned int alpha = 255, bool repeatTexture = false, bool smooth = true)\n{\n    spr.push_back(new sf::Sprite());\n    createSprite(tex, spr[spr.size() - 1], rec, position, origin, scale, alpha, repeatTexture, smooth);\n}\n\n//////////////////////////////////////////////////////\n/// \\brief Return Cursor Position\n/// the mouse on PC platform / touch on mobile\n///\n/// \\param finger Finger index (on Android)\n//////////////////////////////////////////////////////\nsf::Vector2f getCursor(sf::RenderWindow &window , unsigned int finger = 0);\n\n//////////////////////////////////////////////////////\n/// \\brief Return Cursor Position\n/// the mouse on PC platform / touch on mobile\n///\n/// \\param finger Finger index (on Android)\n//////////////////////////////////////////////////////\ninline sf::Vector2f getCursor(sf::RenderWindow *window , unsigned int finger = 0)\n{\n    return getCursor(*window, finger);\n}\n\n//////////////////////////////////////////////////////\n/// \\brief Test the collision of the SFML objects\n/// with the mouse cursor on PC platform / touch on mobile\n///\n/// \\param obj SFML object with which we want to test\n/// \\param finger Finger index (on Android)\n//////////////////////////////////////////////////////\ntemplate <class T>\nbool mouseCollision(sf::RenderWindow &window, T const &obj, unsigned int finger = 0)\n{\n    sf::Vector2f cursorPos = is::getCursor(window, finger);\n\n    // A rectangle that will allow to test with the SFML object\n    sf::RectangleShape recCursor(sf::Vector2f(6.f, 6.f));\n    is::setSFMLObjX_Y(recCursor, cursorPos.x - 3.f, cursorPos.y - 3.f);\n    if (obj.getGlobalBounds().intersects(recCursor.getGlobalBounds())) return true;\n    return false;\n}\n\n//////////////////////////////////////////////////////\n/// \\brief Test the collision of the SFML objects\n/// with the mouse cursor on PC platform / touch on mobile\n///\n/// \\param obj SFML object with which we want to test\n/// \\param finger Finger index (on Android)\n//////////////////////////////////////////////////////\ntemplate <class T>\nbool mouseCollision(sf::RenderWindow *window, T const *obj, unsigned int finger = 0)\n{\n    return mouseCollision(*window, *obj, finger);\n}\n\n//////////////////////////////////////////////////////\n/// \\brief Test the collision of the SFML objects\n/// with the mouse cursor on PC platform / touch on mobile\n///\n/// \\param obj SFML object with which we want to test\n/// \\param position Allows to get the position of the collision point\n/// \\param finger Finger index (on Android)\n//////////////////////////////////////////////////////\ntemplate <class T>\nbool mouseCollision(sf::RenderWindow &window, T const &obj, sf::Vector2f &position, unsigned int finger = 0)\n{\n    sf::Vector2f cursorPos = is::getCursor(window, finger);\n    setVector2(position, cursorPos.x, cursorPos.y);\n\n    // A rectangle that will allow to test with the SFML object\n    sf::RectangleShape recCursor(sf::Vector2f(6.f, 6.f));\n    is::setSFMLObjX_Y(recCursor, position.x - 3.f, position.y - 3.f);\n    if (obj.getGlobalBounds().intersects(recCursor.getGlobalBounds())) return true;\n    return false;\n}\n\n//////////////////////////////////////////////////////\n/// \\brief Test the collision of the SFML objects\n/// with the mouse cursor on PC platform / touch on mobile\n///\n/// \\param obj SFML object with which we want to test\n/// \\param position Allows to get the position of the collision point\n/// \\param finger Finger index (on Android)\n//////////////////////////////////////////////////////\ntemplate <class T>\nbool mouseCollision(sf::RenderWindow *window, T const *obj, sf::Vector2f &position, unsigned int finger = 0)\n{\n    return mouseCollision(*window, *obj, position, finger);\n}\n\n/// Do not touch this function it allows to manage the style of the window\ninline int getWindowStyle()\n{\n    switch (GameConfig::WINDOW_SETTINGS)\n    {\n        case WindowStyle::NONE : return sf::Style::None; break;\n        case WindowStyle::TITLEBAR : return sf::Style::Titlebar; break;\n        case WindowStyle::RESIZE : return sf::Style::Resize; break;\n        case WindowStyle::CLOSE : return sf::Style::Close; break;\n        case WindowStyle::FULLSCREEN : return sf::Style::Fullscreen; break;\n        default: return sf::Style::Default; break;\n    }\n}\n\n/// Allows to set frame per second\ntemplate <class T>\nvoid setFPS(T &render, float fps)\n{\n    render.setFramerateLimit(fps);\n}\n\n/// Allows to set frame per second\ntemplate <class T>\nvoid setFPS(T *render, float fps)\n{\n    render->setFramerateLimit(fps);\n}\n\n/// Allows to use Android vibrate\nshort vibrate(short duration);\n\n////////////////////////////////////////////////////////////\n/// \\brief Type of action to perform for the openURL function\n///\n////////////////////////////////////////////////////////////\nenum OpenURLAction\n{\n    Http,\n    Email,\n    Tel\n};\n\n/// Open URL in default navigator\n/// \\param urlStr represent the web url (e.g www.website.com)\nvoid openURL(const std::string& url, OpenURLAction action);\n\n#if defined(__ANDROID__)\n/// Convert JNI String to std::string\nstatic std::string jstring2string(JNIEnv *env, jstring jStr);\n\n/// Return Android terminal device\nstatic std::string getDeviceId(JNIEnv *env, ANativeActivity *activity);\n#endif\n}\n\n#endif // GAME_FONCTION_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/function/GameKeyData.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMEKEYDATA_H_INCLUDED\n#define GAMEKEYDATA_H_INCLUDED\n\n#include \"../display/GameDisplay.h\"\n\nnamespace is\n{\n//////////////////////////////////////////////////////\n/// \\brief Class for manage game command\n/// (Keyboard / Virtual Game Pad for Android)\n///\n//////////////////////////////////////////////////////\nclass GameKeyData : public MainObject\n{\npublic:\n    //////////////////////////////////////////////////////\n    /// \\brief Represent game command key\n    ///\n    //////////////////////////////////////////////////////\n    enum VirtualKeyIndex\n    {\n        V_KEY_LEFT,  ///< Represents the Left directional button\n        V_KEY_RIGHT, ///< Represents the Right directional button\n        V_KEY_UP,    ///< Represents the Up directional button\n        V_KEY_DOWN,  ///< Represents the Down directional button\n        V_KEY_A,     ///< Represents the A button\n        V_KEY_B,     ///< Represents the B button\n        V_KEY_NONE   ///< Represents no button press\n    };\n\n    bool m_keyPausePressed,\n         m_keyLeftPressed,\n         m_keyRightPressed,\n         m_keyUpPressed,\n         m_keyDownPressed,\n         m_keyAPressed,\n         m_keyBPressed,\n         m_keyAUsed,\n         m_keyBUsed,\n         m_keyLeftUsed,\n         m_keyRightUsed,\n         m_keyUpUsed,\n         m_keyDownUsed,\n         m_disableAllKey,\n         m_hideGamePad;\n\n    sf::Keyboard::Key *m_keyboardA = nullptr,\n        *m_keyboardB = nullptr,\n        *m_keyboardLeft = nullptr,\n        *m_keyboardRight = nullptr,\n        *m_keyboardUp = nullptr,\n        *m_keyboardDown = nullptr;\n\n    VirtualKeyIndex m_moveKeyPressed,   ///< Used to find out whether a directional key is pressed\n                    m_actionKeyPressed; ///< Used to find out whether a action key (A or B) is pressed\n\n    GameKeyData(is::GameDisplay *scene);\n\n    /// Load the image that will serve as Virtual Game Pad (only for Android)\n    ///\n    /// \\param usePadColorBlack change the Pad sprite color\n    virtual void loadResources(bool usePadColorBlack = false);\n\n    /// Manages the positioning of the Virtual Game Pad relative to the screen (only for Android)\n    virtual void step(const float &DELTA_TIME);\n\n    /// Draw the Virtual Game Pad on the screen (only for Android)\n    virtual void draw(is::Render &surface);\n\n    /// Check if the Left directional button is pressed\n    virtual bool keyLeftPressed();\n\n    /// Check if the Right directional button is pressed\n    virtual bool keyRightPressed();\n\n    /// Check if the Up directional button is pressed\n    virtual bool keyUpPressed();\n\n    /// Check if the Down directional button is pressed\n    virtual bool keyDownPressed();\n\n    /// Check if the A button is pressed\n    virtual bool keyAPressed();\n\n    /// Check if the B button is pressed\n    virtual bool keyBPressed();\n\nprivate:\n    bool virtualKeyPressed(VirtualKeyIndex virtualKeyIndex);\n    bool checkKeyPressed(VirtualKeyIndex virtualKeyIndex, sf::Keyboard::Key *keyboardIndex);\n    float m_moveObj;\n    is::GameDisplay *m_scene;\n\n    sf::Sprite m_sprJoystick[2];\n    sf::RectangleShape m_recJoystickMask[2];\n    sf::RectangleShape m_recKeyLeftMask, m_recKeyRightMask, m_recKeyUpMask, m_recKeyDownMask, m_recKeyAMask, m_recKeyBMask;\n};\n};\n\n#endif // GAMEKEYDATA_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/function/GameKeyName.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMEKEYNAME_H_INCLUDED\n#define GAMEKEYNAME_H_INCLUDED\n\n#include \"../islibconnect/isLibConnect.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// \\brief Returns the name of the keyboard key according to the value\n///\n/// Credit : BlackHC on SFML forum\n////////////////////////////////////////////////////////////\ninline const char *getKeyName(const sf::Keyboard::Key key)\n{\n    switch(key)\n    {\n        default:\n        case sf::Keyboard::Unknown:\n                return \"Unknown\";\n        case sf::Keyboard::A:\n                return \"A\";\n        case sf::Keyboard::B:\n                return \"B\";\n        case sf::Keyboard::C:\n                return \"C\";\n        case sf::Keyboard::D:\n                return \"D\";\n        case sf::Keyboard::E:\n                return \"E\";\n        case sf::Keyboard::F:\n                return \"F\";\n        case sf::Keyboard::G:\n                return \"G\";\n        case sf::Keyboard::H:\n                return \"H\";\n        case sf::Keyboard::I:\n                return \"I\";\n        case sf::Keyboard::J:\n                return \"J\";\n        case sf::Keyboard::K:\n                return \"K\";\n        case sf::Keyboard::L:\n                return \"L\";\n        case sf::Keyboard::M:\n                return \"M\";\n        case sf::Keyboard::N:\n                return \"N\";\n        case sf::Keyboard::O:\n                return \"O\";\n        case sf::Keyboard::P:\n                return \"P\";\n        case sf::Keyboard::Q:\n                return \"Q\";\n        case sf::Keyboard::R:\n                return \"R\";\n        case sf::Keyboard::S:\n                return \"S\";\n        case sf::Keyboard::T:\n                return \"T\";\n        case sf::Keyboard::U:\n                return \"U\";\n        case sf::Keyboard::V:\n                return \"V\";\n        case sf::Keyboard::W:\n                return \"W\";\n        case sf::Keyboard::X:\n                return \"X\";\n        case sf::Keyboard::Y:\n                return \"Y\";\n        case sf::Keyboard::Z:\n                return \"Z\";\n        case sf::Keyboard::Num0:\n                return \"Num0\";\n        case sf::Keyboard::Num1:\n                return \"Num1\";\n        case sf::Keyboard::Num2:\n                return \"Num2\";\n        case sf::Keyboard::Num3:\n                return \"Num3\";\n        case sf::Keyboard::Num4:\n                return \"Num4\";\n        case sf::Keyboard::Num5:\n                return \"Num5\";\n        case sf::Keyboard::Num6:\n                return \"Num6\";\n        case sf::Keyboard::Num7:\n                return \"Num7\";\n        case sf::Keyboard::Num8:\n                return \"Num8\";\n        case sf::Keyboard::Num9:\n                return \"Num9\";\n        case sf::Keyboard::Escape:\n                return \"Escape\";\n        case sf::Keyboard::LControl:\n                return \"LControl\";\n        case sf::Keyboard::LShift:\n                return \"LShift\";\n        case sf::Keyboard::LAlt:\n                return \"LAlt\";\n        case sf::Keyboard::RControl:\n                return \"RControl\";\n        case sf::Keyboard::RShift:\n                return \"RShift\";\n        case sf::Keyboard::RAlt:\n                return \"RAlt\";\n        case sf::Keyboard::Menu:\n                return \"Menu\";\n        case sf::Keyboard::LBracket:\n                return \"LBracket\";\n        case sf::Keyboard::RBracket:\n                return \"RBracket\";\n        case sf::Keyboard::SemiColon:\n                return \"SemiColon\";\n        case sf::Keyboard::Comma:\n                return \"Comma\";\n        case sf::Keyboard::Period:\n                return \"Period\";\n        case sf::Keyboard::Slash:\n                return \"Slash\";\n        case sf::Keyboard::BackSlash:\n                return \"BackSlash\";\n        case sf::Keyboard::Equal:\n                return \"Equal\";\n        case sf::Keyboard::Space:\n                return \"Space\";\n        case sf::Keyboard::Return:\n                return \"Return\";\n        case sf::Keyboard::BackSpace:\n                return \"BackSpace\";\n        case sf::Keyboard::Tab:\n                return \"Tab\";\n        case sf::Keyboard::PageUp:\n                return \"PageUp\";\n        case sf::Keyboard::PageDown:\n                return \"PageDown\";\n        case sf::Keyboard::End:\n                return \"End\";\n        case sf::Keyboard::Home:\n                return \"Home\";\n        case sf::Keyboard::Insert:\n                return \"Insert\";\n        case sf::Keyboard::Delete:\n                return \"Delete\";\n        case sf::Keyboard::Multiply:\n                return \"Multiply\";\n        case sf::Keyboard::Divide:\n                return \"Divide\";\n        case sf::Keyboard::Left:\n                return \"Left\";\n        case sf::Keyboard::Right:\n                return \"Right\";\n        case sf::Keyboard::Up:\n                return \"Up\";\n        case sf::Keyboard::Down:\n                return \"Down\";\n        case sf::Keyboard::F1:\n                return \"F1\";\n        case sf::Keyboard::F2:\n                return \"F2\";\n        case sf::Keyboard::F3:\n                return \"F3\";\n        case sf::Keyboard::F4:\n                return \"F4\";\n        case sf::Keyboard::F5:\n                return \"F5\";\n        case sf::Keyboard::F6:\n                return \"F6\";\n        case sf::Keyboard::F7:\n                return \"F7\";\n        case sf::Keyboard::F8:\n                return \"F8\";\n        case sf::Keyboard::F9:\n                return \"F9\";\n        case sf::Keyboard::F10:\n                return \"F10\";\n        case sf::Keyboard::F11:\n                return \"F11\";\n        case sf::Keyboard::F12:\n                return \"F12\";\n        case sf::Keyboard::F13:\n                return \"F13\";\n        case sf::Keyboard::F14:\n                return \"F14\";\n        case sf::Keyboard::F15:\n                return \"F15\";\n        case sf::Keyboard::Pause:\n                return \"Pause\";\n\n#if defined(IS_ENGINE_SFML)\n        case sf::Keyboard::LSystem:\n                return \"LSystem\";\n        case sf::Keyboard::RSystem:\n                return \"RSystem\";\n        case sf::Keyboard::Quote:\n                return \"Quote\";\n        case sf::Keyboard::Tilde:\n                return \"Tilde\";\n        case sf::Keyboard::Dash:\n                return \"Dash\";\n        case sf::Keyboard::Add:\n                return \"Add\";\n        case sf::Keyboard::Subtract:\n                return \"Subtract\";\n        case sf::Keyboard::Numpad0:\n                return \"Numpad0\";\n        case sf::Keyboard::Numpad1:\n                return \"Numpad1\";\n        case sf::Keyboard::Numpad2:\n                return \"Numpad2\";\n        case sf::Keyboard::Numpad3:\n                return \"Numpad3\";\n        case sf::Keyboard::Numpad4:\n                return \"Numpad4\";\n        case sf::Keyboard::Numpad5:\n                return \"Numpad5\";\n        case sf::Keyboard::Numpad6:\n                return \"Numpad6\";\n        case sf::Keyboard::Numpad7:\n                return \"Numpad7\";\n        case sf::Keyboard::Numpad8:\n                return \"Numpad8\";\n        case sf::Keyboard::Numpad9:\n                return \"Numpad9\";\n#endif\n    }\n    return \"\";\n}\n\n////////////////////////////////////////////////////////////\n/// \\brief Returns the name of the keyboard key according to the value\n///\n/// Credit : BlackHC on SFML forum\n////////////////////////////////////////////////////////////\ninline std::wstring getKeyWName(const sf::Keyboard::Key key)\n{\n    switch(key)\n    {\n        default:\n        case sf::Keyboard::Unknown:\n                return L\"Unknown\";\n        case sf::Keyboard::A:\n                return L\"A\";\n        case sf::Keyboard::B:\n                return L\"B\";\n        case sf::Keyboard::C:\n                return L\"C\";\n        case sf::Keyboard::D:\n                return L\"D\";\n        case sf::Keyboard::E:\n                return L\"E\";\n        case sf::Keyboard::F:\n                return L\"F\";\n        case sf::Keyboard::G:\n                return L\"G\";\n        case sf::Keyboard::H:\n                return L\"H\";\n        case sf::Keyboard::I:\n                return L\"I\";\n        case sf::Keyboard::J:\n                return L\"J\";\n        case sf::Keyboard::K:\n                return L\"K\";\n        case sf::Keyboard::L:\n                return L\"L\";\n        case sf::Keyboard::M:\n                return L\"M\";\n        case sf::Keyboard::N:\n                return L\"N\";\n        case sf::Keyboard::O:\n                return L\"O\";\n        case sf::Keyboard::P:\n                return L\"P\";\n        case sf::Keyboard::Q:\n                return L\"Q\";\n        case sf::Keyboard::R:\n                return L\"R\";\n        case sf::Keyboard::S:\n                return L\"S\";\n        case sf::Keyboard::T:\n                return L\"T\";\n        case sf::Keyboard::U:\n                return L\"U\";\n        case sf::Keyboard::V:\n                return L\"V\";\n        case sf::Keyboard::W:\n                return L\"W\";\n        case sf::Keyboard::X:\n                return L\"X\";\n        case sf::Keyboard::Y:\n                return L\"Y\";\n        case sf::Keyboard::Z:\n                return L\"Z\";\n        case sf::Keyboard::Num0:\n                return L\"Num0\";\n        case sf::Keyboard::Num1:\n                return L\"Num1\";\n        case sf::Keyboard::Num2:\n                return L\"Num2\";\n        case sf::Keyboard::Num3:\n                return L\"Num3\";\n        case sf::Keyboard::Num4:\n                return L\"Num4\";\n        case sf::Keyboard::Num5:\n                return L\"Num5\";\n        case sf::Keyboard::Num6:\n                return L\"Num6\";\n        case sf::Keyboard::Num7:\n                return L\"Num7\";\n        case sf::Keyboard::Num8:\n                return L\"Num8\";\n        case sf::Keyboard::Num9:\n                return L\"Num9\";\n        case sf::Keyboard::Escape:\n                return L\"Escape\";\n        case sf::Keyboard::LControl:\n                return L\"LControl\";\n        case sf::Keyboard::LShift:\n                return L\"LShift\";\n        case sf::Keyboard::LAlt:\n                return L\"LAlt\";\n        case sf::Keyboard::RControl:\n                return L\"RControl\";\n        case sf::Keyboard::RShift:\n                return L\"RShift\";\n        case sf::Keyboard::RAlt:\n                return L\"RAlt\";\n        case sf::Keyboard::Menu:\n                return L\"Menu\";\n        case sf::Keyboard::LBracket:\n                return L\"LBracket\";\n        case sf::Keyboard::RBracket:\n                return L\"RBracket\";\n        case sf::Keyboard::SemiColon:\n                return L\"SemiColon\";\n        case sf::Keyboard::Comma:\n                return L\"Comma\";\n        case sf::Keyboard::Period:\n                return L\"Period\";\n        case sf::Keyboard::Slash:\n                return L\"Slash\";\n        case sf::Keyboard::BackSlash:\n                return L\"BackSlash\";\n        case sf::Keyboard::Equal:\n                return L\"Equal\";\n        case sf::Keyboard::Space:\n                return L\"Space\";\n        case sf::Keyboard::Return:\n                return L\"Return\";\n        case sf::Keyboard::BackSpace:\n                return L\"BackSpace\";\n        case sf::Keyboard::Tab:\n                return L\"Tab\";\n        case sf::Keyboard::PageUp:\n                return L\"PageUp\";\n        case sf::Keyboard::PageDown:\n                return L\"PageDown\";\n        case sf::Keyboard::End:\n                return L\"End\";\n        case sf::Keyboard::Home:\n                return L\"Home\";\n        case sf::Keyboard::Insert:\n                return L\"Insert\";\n        case sf::Keyboard::Delete:\n                return L\"Delete\";\n        case sf::Keyboard::Multiply:\n                return L\"Multiply\";\n        case sf::Keyboard::Divide:\n                return L\"Divide\";\n        case sf::Keyboard::Left:\n                return L\"Left\";\n        case sf::Keyboard::Right:\n                return L\"Right\";\n        case sf::Keyboard::Up:\n                return L\"Up\";\n        case sf::Keyboard::Down:\n                return L\"Down\";\n        case sf::Keyboard::F1:\n                return L\"F1\";\n        case sf::Keyboard::F2:\n                return L\"F2\";\n        case sf::Keyboard::F3:\n                return L\"F3\";\n        case sf::Keyboard::F4:\n                return L\"F4\";\n        case sf::Keyboard::F5:\n                return L\"F5\";\n        case sf::Keyboard::F6:\n                return L\"F6\";\n        case sf::Keyboard::F7:\n                return L\"F7\";\n        case sf::Keyboard::F8:\n                return L\"F8\";\n        case sf::Keyboard::F9:\n                return L\"F9\";\n        case sf::Keyboard::F10:\n                return L\"F10\";\n        case sf::Keyboard::F11:\n                return L\"F11\";\n        case sf::Keyboard::F12:\n                return L\"F12\";\n        case sf::Keyboard::F13:\n                return L\"F13\";\n        case sf::Keyboard::F14:\n                return L\"F14\";\n        case sf::Keyboard::F15:\n                return L\"F15\";\n        case sf::Keyboard::Pause:\n                return L\"Pause\";\n\n#if defined(IS_ENGINE_SFML)\n        case sf::Keyboard::LSystem:\n                return L\"LSystem\";\n        case sf::Keyboard::RSystem:\n                return L\"RSystem\";\n        case sf::Keyboard::Quote:\n                return L\"Quote\";\n        case sf::Keyboard::Tilde:\n                return L\"Tilde\";\n        case sf::Keyboard::Dash:\n                return L\"Dash\";\n        case sf::Keyboard::Add:\n                return L\"Add\";\n        case sf::Keyboard::Subtract:\n                return L\"Subtract\";\n        case sf::Keyboard::Numpad0:\n                return L\"Numpad0\";\n        case sf::Keyboard::Numpad1:\n                return L\"Numpad1\";\n        case sf::Keyboard::Numpad2:\n                return L\"Numpad2\";\n        case sf::Keyboard::Numpad3:\n                return L\"Numpad3\";\n        case sf::Keyboard::Numpad4:\n                return L\"Numpad4\";\n        case sf::Keyboard::Numpad5:\n                return L\"Numpad5\";\n        case sf::Keyboard::Numpad6:\n                return L\"Numpad6\";\n        case sf::Keyboard::Numpad7:\n                return L\"Numpad7\";\n        case sf::Keyboard::Numpad8:\n                return L\"Numpad8\";\n        case sf::Keyboard::Numpad9:\n                return L\"Numpad9\";\n#endif\n    }\n    return L\"\";\n}\n}\n\n#endif // GAMEKEYNAME_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/function/GameSlider.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMESLIDER_H_INCLUDED\n#define GAMESLIDER_H_INCLUDED\n\n#include \"../display/GameDisplay.h\"\n#include \"../entity/parents/Type.h\"\n\nnamespace is\n{\nclass GameSlider : public is::MainObject, public is::Type\n{\npublic:\n    enum SlideDirection\n    {\n        SLIDE_NONE,\n        SLIDE_UP,\n        SLIDE_DOWN,\n        SLIDE_RIGHT,\n        SLIDE_LEFT\n    };\n    GameSlider(is::GameDisplay *scene);\n\n    void step(const float &DELTA_TIME);\n    SlideDirection getSlideDirection() const;\n\nprivate:\n    is::GameDisplay *m_scene;\n    float m_slideDistance;\n};\n}\n\n#endif // GAMESLIDER_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/function/GameSystem.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMESYSTEM_H_INCLUDED\n#define GAMESYSTEM_H_INCLUDED\n\n#include \"GameFunction.h\"\n#include \"../graphic/GRM.h\"\n#include \"../sound/GSM.h\"\n\n//////////////////////////////////////////////////////\n// is::Engine version\n//////////////////////////////////////////////////////\n#define IS_ENGINE_VERSION_MAJOR 4\n#define IS_ENGINE_VERSION_MINOR 0\n#define IS_ENGINE_VERSION_PATCH 2\n\nnamespace is\n{\nclass GameSystem;\n\n/// Allows to play sound in container by his name if the option is activated\nvoid GSMplaySound(const std::string& name, std::vector<std::shared_ptr<GameSound>>&GSMsound, GameSystem &gameSystem);\n\n/// Allows to play music in container by his name if the option is activated\nvoid GSMplayMusic(const std::string& name, std::vector<std::shared_ptr<\n//#if !defined(__ANDROID__)\n                  GameMusic\n//#else\n//                  GameSound\n//#endif\n                  >> &GSMmusic, GameSystem &gameSystem);\n\n//////////////////////////////////////////////////////\n/// \\brief Class for manage game system\n///\n//////////////////////////////////////////////////////\nclass GameSystem : public GSM, public GRM\n{\npublic:\n    //////////////////////////////////////////////////////\n    /// \\brief Represent validation key on PC Platform\n    ///\n    /// It is used to know that button will be used for\n    /// validation during a test\n    //////////////////////////////////////////////////////\n    enum ValidationButton\n    {\n        ALL_BUTTONS = 0, ///< Represent Mouse and Keyboard validation button (If it is used then it becomes touch action on android)\n        KEYBOARD = -1,   ///< Represent Keyboard validation button\n        MOUSE = -2       ///< Represent Mouse validation button (If it is used then it becomes touch action on android)\n    };\n    GameSystem(sf::RenderWindow &window);\n\n    //////////////////////////////////////////////////////\n    /// On PC Platform check if mouse / keyboard validation key button is pressed\n    /// On Android check if user touch screen\n    /// validation key is set in GameConfig.h\n    ///\n    /// \\param finger Finger index (on Android)\n    /// \\param validationButton Represents the validation button to use to take the test\n    //////////////////////////////////////////////////////\n    virtual bool isPressed(int finger = 0) const;\n    virtual bool isPressed(ValidationButton validationButton) const;\n\n    //////////////////////////////////////////////////////\n    /// \\brief Check if key is pressed\n    ///\n    /// \\return true if key is pressed false if not\n    //////////////////////////////////////////////////////\n    virtual bool keyIsPressed(sf::Keyboard::Key key) const;\n\n    /*\n     * When using is::Engine to develop on HTML 5 the keyboard and mouse keys are represented\n     * by integers. They are no longer differentiated by an enum, so this function is no longer\n     * useful when using the SDK which allows to develop on the web.\n     */\n    //////////////////////////////////////////////////////\n    /// \\brief Check if mouse button is pressed\n    ///\n    /// \\return true if button is pressed false if not\n    //////////////////////////////////////////////////////\n    virtual bool keyIsPressed(sf::Mouse::Button button) const;\n\n    //////////////////////////////////////////////////////\n    /// \\brief Check if file exist\n    ///\n    /// \\return true is file is found false if not\n    //////////////////////////////////////////////////////\n    static bool fileExist(const std::string &fileName);\n\n    /// Allows to remove file\n    static void removeFile(const std::string &fileName);\n\n    /// Allows to play a sound if the option is activated\n    virtual void playSound(sf::Sound &obj);\n\n    /// Allows to play a sound if the option is activated\n    virtual void playSound(sf::Sound *obj);\n\n    /// Allows to play sound in container by his name if the option is activated\n    virtual void GSMplaySound(const std::string& name)\n    {\n        is::GSMplaySound(name, m_GSMsound, *this);\n    }\n\n    /// Allows to play a music if the option is activated\n    virtual void playMusic(sf::Music &obj);\n\n    /// Allows to play a music if the option is activated\n    virtual void playMusic(sf::Music *obj);\n\n    /// Allows to play music in container by his name if the option is activated\n    virtual void GSMplayMusic(const std::string& name)\n    {\n        is::GSMplayMusic(name,\n//#if !defined(__ANDROID__)\n                         m_GSMmusic\n//#else\n//                         m_GSMsound\n//#endif\n                         , *this);\n    }\n\n    /// Allows to stop a sound\n    virtual void stopSound(sf::Sound &obj);\n\n    /// Allows to stop a music\n    virtual void stopMusic(sf::Music &obj);\n\n////////////////////////////////////////////////////////////\n/// These methods below have the same role as those above.\n/// The difference here is that their name starting with GSM\n/// is replaced by GRM (Game Resource Manager).\n////////////////////////////////////////////////////////////\n\n    /// Allows to play sound in container by his name if the option is activated\n    virtual void GRMplaySound(const std::string& name)\n    {\n        GSMplaySound(name);\n    }\n\n    /// Allows to play music in container by his name if the option is activated\n    virtual void GRMplayMusic(const std::string& name)\n    {\n        GSMplayMusic(name);\n    }\n\n////////////////////////////////////////////////////////////\n///\n////////////////////////////////////////////////////////////\n\n    /// Allows to use vibrate if the option is activated (only for Android)\n    /// \\param ms representing the duration of the vibrator in millisecond\n    virtual void useVibrate(short ms);\n\n    /// Save game configuration data\n    virtual void saveConfig(const std::string &fileName);\n\n    /// Load game configuration data\n    virtual void loadConfig(const std::string &fileName);\n\n    /// Save virtual game pad configuration data\n    virtual void savePadConfig(const std::string &fileName);\n\n    /// Load virtual game pad configuration data\n    virtual void loadPadConfig(const std::string &fileName);\n\n    ////////////////////////////////////////////////////////////\n    // Do not touch these variables unless you know what you are doing\n    bool  m_disableKey;    ///< If it is @a true all the engine functions that manage the inputs are deactivated (keyboard, mouse, touch)\n    bool  m_enableSound;   ///< Used to find out if sound is enabled in option\n    bool  m_enableMusic;   ///< Used to find out if music is enabled in option\n    bool  m_enableVibrate; ///< Used to find out if vibrate is enabled in option\n    bool  m_keyIsPressed;  ///< Used to find out if a key / button has been pressed\n    bool  m_firstLaunch;   ///< Lets check if the game has been launched once\n    bool  m_loadParentResources; ///< Allows to load parents resources once\n\n    /// Represent the variable that stores the option validation key with the Mouse\n    sf::Mouse::Button *m_validationMouseKey = nullptr;\n\n    /// Represent the variable that stores the option validation key with the Keyboard\n    sf::Keyboard::Key *m_validationKeyboardKey = nullptr;\n\n    int m_gameLanguage; ///< Represents the index of the chosen language\n    int m_padAlpha;     ///< Use to change the transparency of the Virtual Game Pad\n\n    // These variable allows to position the Virtual Game Pad\n    float m_padDirXPos, m_padDirYPos, m_padActionXPos, m_padActionYPos;\n    float m_defaultPadDirXPos, m_defaultPadDirYPos, m_defaultPadActionXPos, m_defaultPadActionYPos;\n    bool  m_permutePadAB;\n\n    /// Application\n    sf::RenderWindow &m_window;\n    ////////////////////////////////////////////////////////////\n};\n}\n\n#endif // GAMESYSTEM_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/function/GameTime.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMETIME_H_INCLUDED\n#define GAMETIME_H_INCLUDED\n\n#include <string>\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// \\brief Class to manage the time of the game like a stopwatch\n///\n/// To use it you define a time (minute, second, third) with the\n/// constructor or a method then apply its step() method which\n/// allows you to start the countdown until the minutes, seconds\n/// and thirds reach zero (0)\n////////////////////////////////////////////////////////////\nclass GameTime\n{\npublic:\n    GameTime();\n\n    ////////////////////////////////////////////////////////////\n    /// Constructor to initialize the time with the milliseconds\n    /// which are distributed in minutes and seconds\n    ////////////////////////////////////////////////////////////\n    GameTime(unsigned int ms);\n\n    ////////////////////////////////////////////////////////////\n    /// Constructor to initialize the time with the minutes\n    /// seconds and milliseconds\n    ////////////////////////////////////////////////////////////\n    GameTime(unsigned int m, unsigned int s, unsigned int ms = 0);\n\n    ~GameTime();\n\n    /// Start the countdown of time so that it stops at zero (0)\n    void step(const float &DELTA_TIME);\n\n    /// Add the minute, second and millisecond to the current time\n    void addTimeValue(int m, int s, int ms);\n\n    /// Set a new minute, second and millisecond to the current time\n    void setTimeValue(int m, int s, int ms);\n\n    /// Set the milliseconds which are distributed in minutes and seconds\n    void setMSecond(int ms);\n\n    /// Returns current time in the form of a string (e.g 00:00.00)\n    const std::string getTimeString() const noexcept;\n\n    /// Returns time in milliseconds\n    unsigned int getTimeValue() const;\n\n    /// Returns the minute\n    unsigned int getMinute() const;\n\n    /// Returns the second\n    unsigned int getSecond() const;\n\n    /// Returns the millisecond\n    unsigned int getMSecond() const;\n\n    /// Compare the entered time and the time of the object\n    /// \\return true if the time entered is greater than the time of the object false if not\n    bool compareTime(unsigned int m, unsigned int s = 0, unsigned int ms = 0) const;\n\n    /// Equality comparison operator\n    GameTime& operator=(GameTime const &t);\n\n    /// Operator to display the time with std::cout\n    friend std::ostream& operator<<(std::ostream &flux, GameTime const &t);\n\nprotected:\n    unsigned int m_minute, m_second, m_mSecond;\n};\n\nbool operator==(GameTime const &t1, GameTime const &t2);\nbool operator>(GameTime const &t1, GameTime const &t2);\nbool operator<(GameTime const &t1, GameTime const &t2);\n}\n\n#endif // GAMETIME_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/graphic/GRM.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GRM_H_INCLUDED\n#define GRM_H_INCLUDED\n\n#include \"GameFont.h\"\n#include \"GameTexture.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for manage SFML Font and Texture without using an\n/// SFML object\n////////////////////////////////////////////////////////////\nclass GRM\n{\npublic:\n    /// Game Font container\n    std::vector<std::shared_ptr<GameFont>> m_GRMfont;\n\n    /// Game Texture container\n    std::vector<std::shared_ptr<GameTexture>> m_GRMtexture;\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add SFML Font in GRM container\n    ///\n    /// \\param name of font which will be used to identify\n    /// it in the container in order to be able to access it\n    /// \\param filePath path of the font file to add\n    //////////////////////////////////////////////////////\n    virtual sf::Font& GRMaddFont(const std::string& name, const std::string& filePath)\n    {\n        auto obj = fontFileExists(filePath);\n        if (obj == nullptr)\n        {\n            auto newObj = std::make_shared<GameFont>(name, filePath);\n            m_GRMfont.push_back(newObj);\n            return newObj->getFont();\n        }\n        else is::showLog(\"WARNING: <\" + name + \"> font has already been added!\");\n        return obj->getFont();\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add existing font in GRM container\n    ///\n    /// \\param font object\n    //////////////////////////////////////////////////////\n    void GRMaddFontObject(std::shared_ptr<GameFont> font, bool showError = true)\n    {\n        if (!fontFileExists(font->getFilePath())) m_GRMfont.push_back(font);\n        else\n        {\n            if (showError) is::showLog(\"WARNING: <\" + font->getName() + \"> font has already been added!\");\n        }\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add SFML Texture in GRM container\n    ///\n    /// \\param name of texture which will be used to identify\n    /// it in the container in order to be able to access it\n    /// \\param filePath path of the texture file to add\n    //////////////////////////////////////////////////////\n    virtual sf::Texture& GRMaddTexture(const std::string& name, const std::string& filePath)\n    {\n        auto obj = textureFileExists(filePath);\n        if (obj == nullptr)\n        {\n            auto newObj = std::make_shared<GameTexture>(name, filePath);\n            m_GRMtexture.push_back(newObj);\n            return newObj->getTexture();\n        }\n        else is::showLog(\"WARNING: <\" + name + \"> texture has already been added!\");\n        return obj->getTexture();\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add existing texture in GRM container\n    ///\n    /// \\param texture object\n    //////////////////////////////////////////////////////\n    void GRMaddTextureObject(std::shared_ptr<GameTexture> texture, bool showError = true)\n    {\n        if (textureFileExists(texture->getFilePath()) == nullptr) m_GRMtexture.push_back(texture);\n        else\n        {\n            if (showError) is::showLog(\"WARNING: <\" + texture->getName() + \"> texture has already been added!\");\n        }\n    }\n\n    /// Allows to get font as a reference in container by his name\n    virtual sf::Font& GRMgetFont(const std::string& name)       {return *GRMgetFontPtr(name);}\n\n    /// Allows to get texture as a reference in container by his name\n    virtual sf::Texture& GRMgetTexture(const std::string& name) {return *GRMgetTexturePtr(name);}\n\n    /// Allows to get font as a pointer in container by his name\n    virtual sf::Font* GRMgetFontPtr(const std::string& name)\n    {\n        WITH(m_GRMfont.size())\n        {\n            if (m_GRMfont[_I].get() != nullptr)\n            {\n                if (m_GRMfont[_I]->getName() == name && m_GRMfont[_I]->getFileIsLoaded())\n                {\n                    return &m_GRMfont[_I]->getFont();\n                }\n            }\n        }\n        is::showLog(\"ERROR: <\" + name + \"> font does not exist!\");\n        return nullptr;\n    }\n\n    /// Allows to get texture as a pointer in container by his name\n    virtual sf::Texture* GRMgetTexturePtr(const std::string& name)\n    {\n        WITH(m_GRMtexture.size())\n        {\n            if (m_GRMtexture[_I].get() != nullptr)\n            {\n                if (m_GRMtexture[_I]->getName() == name && m_GRMtexture[_I]->getFileIsLoaded())\n                {\n                    return &m_GRMtexture[_I]->getTexture();\n                }\n            }\n        }\n        is::showLog(\"ERROR: <\" + name + \"> texture does not exist!\");\n        return nullptr;\n    }\n\n    /// Allows to delete font in container by his name\n    void GRMdeleteFont(const std::string& name)\n    {\n        int fontId(-1);\n        WITH(m_GRMfont.size())\n        {\n            if (m_GRMfont[_I].get() != nullptr)\n            {\n                if (m_GRMfont[_I]->getName() == name)\n                {\n                    fontId = _I;\n                    break;\n                }\n            }\n        }\n        if (fontId == -1) is::showLog(\"ERROR: Can't delete <\" + name + \"> font because font does not exist!\");\n        else\n        {\n            m_GRMfont[fontId].reset();\n            m_GRMfont[fontId] = nullptr;\n        }\n    }\n\n    /// Allows to delete texture in container by his name\n    void GRMdeleteTexture(const std::string& name)\n    {\n        int textureId(-1);\n        WITH(m_GRMtexture.size())\n        {\n            if (m_GRMtexture[_I].get() != nullptr)\n            {\n                if (m_GRMtexture[_I]->getName() == name)\n                {\n                    textureId = _I;\n                    break;\n                }\n            }\n        }\n        if (textureId == -1) is::showLog(\"ERROR: Can't delete <\" + name + \"> texture because texture does not exist!\");\n        else\n        {\n            m_GRMtexture[textureId].reset();\n            m_GRMtexture[textureId] = nullptr;\n        }\n    }\n\nprivate:\n    GameTexture* textureFileExists(const std::string& filePath) const\n    {\n        WITH(m_GRMtexture.size())\n        {\n            if (m_GRMtexture[_I].get() != nullptr)\n            {\n                if (m_GRMtexture[_I]->getFilePath() == filePath) return m_GRMtexture[_I].get();\n            }\n        }\n        return nullptr;\n    }\n\n    GameFont* fontFileExists(const std::string& filePath) const\n    {\n        WITH(m_GRMfont.size())\n        {\n            if (m_GRMfont[_I].get() != nullptr)\n            {\n                if (m_GRMfont[_I]->getFilePath() == filePath) return m_GRMfont[_I].get();\n            }\n        }\n        return nullptr;\n    }\n};\n}\n#endif // GRM_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/graphic/GameFont.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMEFONT_H_INCLUDED\n#define GAMEFONT_H_INCLUDED\n\n#include \"../islibconnect/isLibConnect.h\"\n#include \"../entity/parents/Name.h\"\n#include \"../entity/parents/FilePath.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for manage SFML Font\n////////////////////////////////////////////////////////////\nclass GameFont : public is::Name, public is::FilePath\n{\npublic:\n    GameFont(const std::string& fontName, const std::string& filePath):\n        Name(fontName),\n        FilePath(filePath)\n    {\n        if (m_font.loadFromFile(m_strFilePath)) m_fileIsLoaded = true;\n        //else showLog(\"ERROR: Can't load font : \" + filePath);\n    }\n\n    virtual ~GameFont() {}\n\n    void loadResources(const std::string& filePath)\n    {\n        if (m_font.loadFromFile(filePath))\n        {\n            m_strFilePath = filePath;\n            m_fileIsLoaded = true;\n        }\n        else\n        {\n            m_fileIsLoaded = false;\n            //showLog(\"ERROR: Can't load font : \" + filePath);\n        }\n    }\n\n    /// Return font\n    sf::Font& getFont() {return m_font;}\n\nprivate:\n    sf::Font m_font;\n};\n}\n\n#endif // GAMEFONT_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/graphic/GameTexture.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMETEXTURE_H_INCLUDED\n#define GAMETEXTURE_H_INCLUDED\n\n#include \"../islibconnect/isLibConnect.h\"\n#include \"../entity/parents/Name.h\"\n#include \"../entity/parents/FilePath.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for manage SFML Texture\n////////////////////////////////////////////////////////////\nclass GameTexture : public is::Name, public is::FilePath\n{\npublic:\n    GameTexture(const std::string& textureName, const std::string& filePath):\n        Name(textureName),\n        FilePath(filePath)\n    {\n        if (m_tex.loadFromFile(m_strFilePath)) m_fileIsLoaded = true;\n        //else showLog(\"ERROR: Can't load texture : \" + filePath);\n    }\n\n    virtual ~GameTexture() {}\n\n    void loadResources(const std::string& filePath)\n    {\n        if (m_tex.loadFromFile(filePath))\n        {\n            m_strFilePath = filePath;\n            m_fileIsLoaded = true;\n        }\n        else\n        {\n            m_fileIsLoaded = false;\n            //showLog(\"ERROR: Can't load texture : \" + filePath);\n        }\n    }\n\n    /// Return texture\n    sf::Texture& getTexture() {return m_tex;}\n\nprivate:\n    sf::Texture m_tex;\n};\n}\n\n#endif // GAMETEXTURE_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/graphic/TransitionEffect.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef TRANSITIONEFFECT_H_INCLUDED\n#define TRANSITIONEFFECT_H_INCLUDED\n\n#include \"../display/GameDisplay.h\"\n#include \"../entity/parents/Type.h\"\n\nnamespace is\n{\nclass TransitionEffect : public is::MainObject, public is::Type\n{\npublic:\n    enum Transition\n    {\n        FADE_IN,\n        FADE_OUT\n    };\n    TransitionEffect(is::GameDisplay *scene);\n    void step(const float &DELTA_TIME);\n    void draw(is::Render &render);\n    void setType(int type)\n    {\n        if ((m_type == FADE_OUT && type == FADE_IN) || (m_type == FADE_IN && type == FADE_OUT))\n            m_transitionEnd = false;\n        m_type = type;\n    }\n    bool getTransitionEnd(int type) const {return (m_transitionEnd && m_type == type);}\n    sf::RectangleShape& getRecTransition() {return m_recTransition;}\n\nprivate:\n    is::GameDisplay *m_scene;\n    sf::RectangleShape m_recTransition;\n    bool m_transitionEnd;\n};\n}\n\n#endif // TRANSITIONEFFECT_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/islibconnect/isEngineSDLWrapper.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef ISENGINESDLWRAPPER_H_INCLUDED\n#define ISENGINESDLWRAPPER_H_INCLUDED\n\n#include \"isEngineWrapper.h\"\n\n#if defined(IS_ENGINE_SDL_2)\n\n#if defined(__ANDROID__)\n#include <jni.h>\n#include <android/native_activity.h>\n#endif\n\n#if defined(IS_ENGINE_HTML_5)\n#include <emscripten.h>\n#endif\n\n#include <exception>\n#include <string>\n#include <iostream>\n#include <vector>\n#include <chrono>\n\n#include <SDL.h>\n#include <SDL_image.h>\n#include <SDL_ttf.h>\n#include <SDL_mixer.h>\n\n#if defined(IS_ENGINE_SWITCH)\n#include <switch.h>\n#endif\n\n#define NUM_BUTTONS SDL_CONTROLLER_BUTTON_MAX\n\nnamespace is\n{\nextern SDL_Window *IS_ENGINE_SDL_window;\nextern SDL_Renderer *IS_ENGINE_SDL_renderer;\nextern SDL_DisplayMode IS_ENGINE_SDL_displayMode; // Used to determine the size of a window\n\n/// Allows to use touch functions\nextern bool IS_ENGINE_MOBILE_OS;\n\n/// Allow to avoid bug\nstatic bool IS_ENGINE_SDL_closeWindow = false;\n\n/// These variables are used to store the scale of the screen in order to\n/// resize the images on Android (Sprite, Text, ...)\nextern float IS_ENGINE_SDL_screenXScale, IS_ENGINE_SDL_screenYScale;\n\n/// Max SDL Sound Channel\nstatic const short IS_ENGINE_SDL_CHANNEL_MAX = 60;\n\n/// Allow to avoid duplicates\nextern short IS_ENGINE_SDL_channel[IS_ENGINE_SDL_CHANNEL_MAX];\n\n/// Class that allows to manage touchdowns\nclass TouchData\n{\npublic:\n    bool m_SDLtouchDown;\n    int m_SDLtouchX;\n    int m_SDLtouchY;\n};\n\n/// Maximum number of fingers to have on the screen\nstatic const short IS_ENGINE_SDL_TOUCH_ID_COUNT_MAX = 2;\n\n/// Stores the different fingers used on the screen\nextern TouchData IS_ENGINE_SDL_touchData[IS_ENGINE_SDL_TOUCH_ID_COUNT_MAX];\n\n/// Table simulating the state of the \"keys\"\nextern Uint8 IS_ENGINE_SDL_buttonState[NUM_BUTTONS];\n\n/// Pointer to the active controller\nextern SDL_GameController *IS_ENGINE_SDL_SDL_GameController;\n\n/// Function to call every frame to update the state of the buttons\nvoid updateButtonState();\n\n/// Function simulating SDL_GetKeyboardState but for gamepad buttons\nconst Uint8* getControllerButtonState(int *numButtons);\n\n/// Allows to initialize the resources of the SDL library\nbool SDL2initLib();\n\n/// Allows to free the resources of the SDL library at the end of the program\nvoid SDL2freeLib();\n}\n\nnamespace sf\n{\nclass Color\n{\npublic:\n    int r, g, b, a;\n    Color(): r(255), g(255), b(255), a(255) {}\n\n    Color(int red, int green, int blue, int alpha): r(red), g(green), b(blue), a(alpha) {}\n    Color(int red, int green, int blue): r(red), g(green), b(blue), a(255) {}\n\n    static Color White; ///< White\n    static Color Black; ///< Black\n    static Color Grey; ///< Grey\n    static Color Red; ///< Red\n    static Color Green; ///< Green\n    static Color Blue; ///< Blue\n    static Color Yellow; ///< Yellow\n    static Color Magenta; ///< Magenta\n    static Color Cyan; ///< Cyan\n    static Color Transparent; ///< Transparent\n\n    void operator =(const Color &color)\n    {\n        r = color.r;\n        g = color.g;\n        b = color.b;\n        a = color.a;\n    }\n};\n\nclass Texture\n{\npublic:\n    Texture() {}\n\n    Texture(const std::string& filename, bool useWithVertices = false) {loadSurface(filename, useWithVertices);}\n\n    Texture(SDL_Texture* tex, int w, int h) : m_texture(tex)\n    {\n        m_size.x = w;\n        m_size.y = h;\n    }\n\n    ~Texture();\n\n    const Vector2u& getSize() const noexcept\n    {\n        return m_size;\n    }\n\n    bool loadFromFile(const std::string& filename, bool useWithVertices = false)\n    {\n        return loadSurface(filename, useWithVertices);\n    }\n\n    SDL_Surface* getSDLSurface() const {return m_SDLsurface;}\n\n    const std::string &getFileName() const noexcept\n    {\n        return m_filename;\n    }\n\n    SDL_Texture* getSDLTexture() const {return m_texture;}\n/*\n    void loadFromImage()  {functionNotSupported(\"Texture\", \"loadFromImage\", \"loadSFMLTexture\");}\n    void loadFromMemory() {functionNotSupported(\"Texture\", \"loadFromMemory\", \"loadSFMLTexture\");}\n    void loadFromStream() {functionNotSupported(\"Texture\", \"loadFromStream\", \"loadSFMLTexture\");}\n*/\n    SDL_Texture* m_texture;\n\nprivate:\n    SDL_Surface *m_SDLsurface = NULL;\n    Vector2u m_size;\n    std::string m_filename = \"\";\n    bool loadSurface(const std::string& filePath, bool useWithVertices = false);\n};\n\nclass Font\n{\npublic:\n    Font() {}\n\n    Font(const std::string& filename, int size): m_size(size) {loadFont(filename);}\n\n    ~Font();\n\n    int m_SDLoutlineFontSize = 0;\n    Uint32 m_SDLFontStyle = TTF_STYLE_NORMAL;\n\n    void setSDLFontSize(int size) {m_size = size;}\n\n    const std::string& getFileName() const noexcept {return m_filename;}\n\n    int getSize() const {return m_size;}\n\n    bool loadFromFile(const std::string& filename) {return loadFont(filename);}\n\n    TTF_Font* getSDLFont() const {return m_SDLfont;}\n\n/*  void loadFromMemory() {functionNotSupported(\"Font\", \"loadFromMemory\", \"loadSFMLFont\");}\n    void loadFromStream() {functionNotSupported(\"Font\", \"loadFromStream\", \"loadSFMLFont\");}\n*/\nprivate:\n    TTF_Font *m_SDLfont = NULL;\n    int m_size = 20;\n    std::string m_filename = \"\";\n\n    bool loadFont(const std::string& filename);\n};\n}\n\nnamespace is\n{\n/// auto generate font container\n/// Allows to store fonts that will be used to manipulate the\n/// size of texts\nextern std::vector<sf::Font*> IS_ENGINE_SDL_AUTO_GENERATE_FONT;\n}\n\nnamespace sf\n{\nclass Transformable\n{\npublic:\n    Transformable();\n\n    Transformable(Texture &texture);\n\n    void setPosition(float x, float y)\n    {\n        is::setVector2(m_position, x, y);\n    }\n\n    void setPosition(const Vector2f &v)\n    {\n        setPosition(v.x, v.y);\n    }\n\n    void move(const Vector2f &v)\n    {\n        move(v.x, v.y);\n    }\n\n    void move(float x, float y)\n    {\n        setPosition(m_position.x + x, m_position.y + y);\n    }\n\n    void setScale(float x, float y)\n    {\n        is::setVector2(m_scale, x, y);\n    }\n\n    void setScale(const Vector2f &v)\n    {\n        setScale(v.x, v.y);\n    }\n\n    void scale(float x, float y)\n    {\n        is::setVector2(m_scale, m_scale.x + x, m_scale.y + y);\n    }\n\n    void scale(const Vector2f &v)\n    {\n        setScale(v.x, v.y);\n    }\n\n    virtual void setSize(float x, float y)\n    {\n        is::setVector2(m_size, x, y);\n        m_textureRec.width = x;\n        m_textureRec.height = y;\n    }\n\n    virtual void setSize(const Vector2f &size)\n    {\n        setSize(size.x, size.y);\n    }\n\n    void setOrigin(float x, float y)\n    {\n        is::setVector2(m_origin, x, y);\n    }\n\n    void setOrigin(const Vector2f &v)\n    {\n        setOrigin(v.x, v.y);\n    }\n\n    void setRotation(float angle);\n\n    void rotate(float angle)\n    {\n        setRotation(m_rotation + angle);\n    }\n\n    virtual void setColor(int r, int g, int b, int a);\n\n    virtual void setColor(Color const &color)\n    {\n        setColor(color.r, color.g, color.b, color.a);\n    }\n\n    virtual void setFillColor(Color const &color)\n    {\n        setColor(color.r, color.g, color.b, color.a);\n    }\n\n    virtual const Vector2f& getPosition() const noexcept {return m_position;}\n\n    virtual const Vector2f& getScale() const noexcept {return m_scale;}\n\n    virtual const Vector2f& getSize() const noexcept {return m_size;}\n\n    virtual const Vector2f& getOrigin() const noexcept {return m_origin;}\n\n    virtual float getRotation() const {return m_rotation;}\n\n    virtual Rect getGlobalBounds() const {return functionGetGlobalBounds(m_position, m_origin, m_size);}\n\n    virtual const Color& getColor() const noexcept {return m_color;}\n\n    virtual const Color& getFillColor() const noexcept {return getColor();}\n\n    Texture* getTexture() const {return m_texture;}\n\n    virtual const Rect getTextureRect() const noexcept {return m_textureRec;}\n\n    virtual const SDL_Color& getSDLColor(bool getAlpha);\n\nprotected:\n    SDL_Color m_SDLcolor;\n    Rect m_textureRec;\n    Texture *m_texture = nullptr;\n    float m_rotation = 0.f;\n    Vector2f m_position;\n    Vector2f m_scale;\n    Vector2f m_size;\n    Vector2f m_origin;\n    Color m_color;\n};\n\n/// Class that allows to create SDL textures in order to use it to\n/// create SFML Sprites, Image and Texts.\n/// On SDL texts are created using textures and surfaces\nclass SDLTexture : public Transformable\n{\npublic:\n    SDL_RendererFlip m_SDLFlip = SDL_FLIP_NONE;\n    bool m_multiLines = false;\n    bool m_circleShape = true;\n    Rect m_SDLoutlineTextureRec;\n\n    enum SDLTextureType\n    {\n        IS_ENGINE_SDL_SPRITE,\n        IS_ENGINE_SDL_TEXT\n    };\n\n    SDLTextureType m_SDLTextureType = IS_ENGINE_SDL_SPRITE;\n\n    SDLTexture() : Transformable() {}\n\n    SDLTexture(Texture &texture) : Transformable(texture) {}\n\n    ~SDLTexture();\n\n    void setTextureRect(IntRect rec);\n\n    SDL_Texture* getSDLTexture() const {return m_SDLtexture;}\n\n    SDL_Texture* getSDLOutlineTexture() const {return m_SDLoutlineTexture;}\n\nprotected:\n    SDL_Texture *m_SDLtexture = NULL;\n    SDL_Texture *m_SDLoutlineTexture = NULL;\n};\n\nclass Sprite : public SDLTexture\n{\npublic:\n    Sprite() : SDLTexture() {}\n    virtual ~Sprite() {}\n    Sprite(Texture &texture) : SDLTexture(texture) {setSDLTexture();}\n\n    //-->Sprite(RenderTexture &renderTexture) : Transformable(renderTexture) {setSDLTexture();}\n\n    void setTexture(sf::Texture& texture);\n\nprotected:\n    void setSDLTexture();\n};\n\nclass Image : public SDLTexture\n{\npublic:\n    Image() : SDLTexture() {}\n\n    ~Image();\n\n    bool loadFromFile(const std::string& filename);\n\n    const Uint8* getPixelsPtr() const;\n};\n\nclass Text : public SDLTexture\n{\npublic:\n    enum Style\n    {\n        Regular       = TTF_STYLE_NORMAL, ///< Regular characters, no style\n        Bold          = TTF_STYLE_BOLD, ///< Bold characters\n        Italic        = TTF_STYLE_ITALIC, ///< Italic characters\n        Underlined    = TTF_STYLE_UNDERLINE, ///< Underlined characters\n        StrikeThrough = TTF_STYLE_STRIKETHROUGH ///< Strike through characters\n    };\n\n    bool m_SDLcontainMultiSpaces = false;\n    short m_SDLaddTextRecWSize = 3;\n    Text(): SDLTexture() {m_SDLTextureType = IS_ENGINE_SDL_TEXT;}\n\n    Text(sf::Font& font);\n\n    Text(sf::Font& font, const std::string& text);\n\n    Text(sf::Font& font, const std::wstring& text);\n\n    ~Text();\n\n    void setFont(sf::Font &font);\n\n    void setString(const std::wstring& text);\n\n    void setString(const wchar_t& text);\n\n    void setString(const std::string& text);\n\n    void setString(const char& text);\n\n    void setColor(int r, int g, int b, int a);\n\n    void setOrigin(float x, float y);\n\n    void setColor(Color const &color)\n    {\n        setColor(color.r, color.g, color.b, color.a);\n    }\n\n    void setFillColor(Color const &color)\n    {\n        setColor(color.r, color.g, color.b, color.a);\n    }\n\n    void setCharacterSize(int size);\n\n    void setStyle(Uint32 style);\n\n    void setOutlineColor(const Color& color);\n\n    void setOutlineThickness(float thickness);\n\n    Font *getFont() const {return m_font;}\n\n    const std::string &getString() const noexcept\n    {\n        return m_string;\n    }\n\n    const std::wstring &getWString() const noexcept\n    {\n        return m_wstring;\n    }\n\n    int getCharacterSize() {return m_characterSize;}\n\n    Uint32 getStyle() const {return m_style;}\n\n    const Color& getOutlineColor() const {return m_outlineColor;}\n\n    float getOutlineThickness() const {return m_outlineThickness;}\n\nprivate:\n    SDL_Surface *m_SDLsurface = NULL;\n    Font *m_font = nullptr;\n\n    SDL_Surface *m_SDLoutlineSurface = NULL;\n    Font *m_outlineFont = nullptr;\n    SDL_Color m_SDLoutlineColor;\n\n    const SDL_Color& getSDLOutlineColor()\n    {\n        m_SDLoutlineColor.r = m_outlineColor.r;\n        m_SDLoutlineColor.g = m_outlineColor.g;\n        m_SDLoutlineColor.b = m_outlineColor.b;\n        m_SDLoutlineColor.a = m_outlineColor.a;\n        return m_SDLoutlineColor;\n    }\n\n    std::string m_string = \"\";\n    std::string m_tempString = \"\";\n    std::wstring m_wstring = L\"\";\n    std::wstring m_tempWstring = L\"\";\n    int m_characterSize = 0;\n    int m_currentCharSize = 0;\n    char *m_SDLtext = nullptr;\n\n    Uint32 m_style;\n    Color m_outlineColor;\n    int m_outlineThickness = 0;\n\n    void setObjectText(const std::string& text);\n    void setObjectText(const std::wstring& text);\n\n    /// Used to create a text with a Texture, Surface and a font.\n    bool setSDLText();\n};\n\nclass View\n{\npublic:\n    View();\n\n    View(const Vector2f& center, const Vector2f& size);\n\n    void setCenter(float x, float y);\n\n    void setCenter(const Vector2f& center)\n    {\n        setCenter(center.x, center.y);\n    }\n\n    void setSize(float width, float height);\n\n    void setSize(const Vector2f& size)\n    {\n        setSize(size.x, size.y);\n    }\n\n    const Vector2f& getSize() const noexcept {return m_size;}\n\n    const Vector2f& getCenter() const noexcept;\n\nprivate:\n    sf::Vector2f m_size;\n    sf::Vector2f m_center;\n};\n\nclass Shape : public Transformable\n{\npublic:\n    Shape() : Transformable() {}\n\n    void setOutlineColor(const Color& color) {m_outlineColor = color;}\n\n    void setOutlineThickness(float thickness) {m_outlineThickness = thickness;}\n\n    virtual void draw(View const &view) = 0;\n\n    const Color& getOutlineColor() const {return m_outlineColor;}\n\n    float getOutlineThickness() const {return m_outlineThickness;}\n\nprotected:\n    Color m_outlineColor;\n    float m_outlineThickness = 0.f;\n};\n\nclass RectangleShape : public Shape\n{\npublic:\n    RectangleShape() : Shape() {}\n\n    virtual ~RectangleShape() {}\n\n    RectangleShape(float width, float height) : Shape() {setSize(width, height);}\n\n    RectangleShape(const Vector2f &size) : Shape() {setSize(size.x, size.y);}\n\n    void draw(View const &view);\n};\n\nclass CircleShape : public Shape\n{\npublic:\n    CircleShape(): Shape() {}\n\n    CircleShape(float raduis) : Shape() {setRadius(raduis);}\n\n    void setRadius(float raduis) {setSize(raduis, raduis);}\n\n    float getRadius() {return m_size.x;}\n\n    void draw(View const &view);\n};\n\n//--- New SFML Classes Simulation\n// sf::PrimitiveType\nenum class PrimitiveType {\n    Points,\n    Lines,\n    LineStrip,\n    Triangles,\n    TriangleStrip,\n    TriangleFan,\n    Quads\n};\n\n// sf::Vertex\nstruct Vertex {\n    Vector2f position;\n    Color color;\n    Vector2f texCoords;\n    Vertex(const Vector2f& pos = Vector2f(), const Color& col = Color(), const Vector2f& tex = Vector2f())\n        : position(pos), color(col), texCoords(tex) {}\n};\n\n// sf::Transform\nclass Transform {\npublic:\n    Transform() {\n        matrix[0] = 1.0f; matrix[1] = 0.0f; matrix[2] = 0.0f;\n        matrix[3] = 0.0f; matrix[4] = 1.0f; matrix[5] = 0.0f;\n        matrix[6] = 0.0f; matrix[7] = 0.0f; matrix[8] = 1.0f;\n    }\n\n    Transform translate(float x, float y) const {\n        Transform t;\n        t.matrix[2] = x;\n        t.matrix[5] = y;\n        return combine(t);\n    }\n\n    Transform rotate(float angle, float centerX = 0.0f, float centerY = 0.0f) const {\n        float rad = angle * 3.1415926535f / 180.0f;\n        float cosA = std::cos(rad);\n        float sinA = std::sin(rad);\n        Transform t;\n        t.matrix[0] = cosA;\n        t.matrix[1] = sinA;\n        t.matrix[3] = -sinA;\n        t.matrix[4] = cosA;\n        t.matrix[2] = centerX * (1 - cosA) + centerY * sinA;\n        t.matrix[5] = centerY * (1 - cosA) - centerX * sinA;\n        return combine(t);\n    }\n\n    Transform scale(float scaleX, float scaleY, float centerX = 0.0f, float centerY = 0.0f) const {\n        Transform t;\n        t.matrix[0] = scaleX;\n        t.matrix[4] = scaleY;\n        t.matrix[2] = centerX * (1 - scaleX);\n        t.matrix[5] = centerY * (1 - scaleY);\n        return combine(t);\n    }\n\n    Vector2f transformPoint(const Vector2f& point) const {\n        return Vector2f(\n            point.x * matrix[0] + point.y * matrix[3] + matrix[2],\n            point.x * matrix[1] + point.y * matrix[4] + matrix[5]\n        );\n    }\n\n    Transform combine(const Transform& other) const {\n        Transform result;\n        result.matrix[0] = matrix[0] * other.matrix[0] + matrix[3] * other.matrix[1];\n        result.matrix[1] = matrix[1] * other.matrix[0] + matrix[4] * other.matrix[1];\n        result.matrix[2] = matrix[2] * other.matrix[0] + matrix[5] * other.matrix[1] + other.matrix[2];\n        result.matrix[3] = matrix[0] * other.matrix[3] + matrix[3] * other.matrix[4];\n        result.matrix[4] = matrix[1] * other.matrix[3] + matrix[4] * other.matrix[4];\n        result.matrix[5] = matrix[2] * other.matrix[3] + matrix[5] * other.matrix[4] + other.matrix[5];\n        result.matrix[6] = matrix[0] * other.matrix[6] + matrix[3] * other.matrix[7] + matrix[6];\n        result.matrix[7] = matrix[1] * other.matrix[6] + matrix[4] * other.matrix[7] + matrix[7];\n        result.matrix[8] = matrix[2] * other.matrix[6] + matrix[5] * other.matrix[7] + matrix[8];\n        return result;\n    }\n\nprivate:\n    float matrix[9]; // 3x3 matrix: [a b tx; c d ty; 0 0 1]\n};\n\n// sf::RenderStates\nstruct RenderStates {\n    const Texture* texture;\n    Transform transform;\n\n    RenderStates(const Texture* tex = nullptr) : texture(tex) {}\n    RenderStates(const Transform& t) : texture(nullptr), transform(t) {}\n    RenderStates(const Texture* tex, const Transform& t) : texture(tex), transform(t) {}\n};\n\n// sf::VertexArray\nclass VertexArray {\npublic:\n    VertexArray(PrimitiveType type = PrimitiveType::Points, size_t vertexCount = 0)\n        : primitiveType(type), vertices(vertexCount) {}\n\n    void append(const Vertex& vertex) {\n        vertices.push_back(vertex);\n    }\n\n    void insert(size_t index, const Vertex& vertex) {\n        if (index > vertices.size()) {\n            throw std::out_of_range(\"Vertex index out of range\");\n        }\n        vertices.insert(vertices.begin() + index, vertex);\n    }\n\n    void remove(size_t index) {\n        if (index >= vertices.size()) {\n            throw std::out_of_range(\"Vertex index out of range\");\n        }\n        vertices.erase(vertices.begin() + index);\n    }\n\n    void clear() {\n        vertices.clear();\n    }\n\n    size_t getVertexCount() const {\n        return vertices.size();\n    }\n\n    void reserve(size_t count) {\n        vertices.reserve(count);\n    }\n\n    Vertex& operator[](size_t index) {\n        if (index >= vertices.size()) {\n            throw std::out_of_range(\"Vertex index out of range\");\n        }\n        return vertices[index];\n    }\n\n    const Vertex& operator[](size_t index) const {\n        if (index >= vertices.size()) {\n            throw std::out_of_range(\"Vertex index out of range\");\n        }\n        return vertices[index];\n    }\n\n    void resize(size_t vertexCount) {\n        vertices.resize(vertexCount);\n    }\n\n    PrimitiveType getPrimitiveType() const {\n        return primitiveType;\n    }\n\n    void setPrimitiveType(PrimitiveType type) {\n        primitiveType = type;\n    }\n\n    FloatRect getBounds() const {\n        if (vertices.empty()) {\n            return FloatRect();\n        }\n\n        float left = vertices[0].position.x;\n        float top = vertices[0].position.y;\n        float right = left;\n        float bottom = top;\n\n        for (const auto& vertex : vertices) {\n            left = std::min(left, vertex.position.x);\n            right = std::max(right, vertex.position.x);\n            top = std::min(top, vertex.position.y);\n            bottom = std::max(bottom, vertex.position.y);\n        }\n\n        return FloatRect(left, top, right - left, bottom - top);\n    }\n\n    FloatRect getTransformedBounds() const {\n        if (vertices.empty()) {\n            return FloatRect();\n        }\n\n        Vector2f transformed[4];\n        for (size_t i = 0; i < vertices.size(); ++i) {\n            transformed[i] = transform.transformPoint(vertices[i].position);\n        }\n\n        float left = transformed[0].x;\n        float top = transformed[0].y;\n        float right = left;\n        float bottom = top;\n\n        for (const auto& pos : transformed) {\n            left = std::min(left, pos.x);\n            right = std::max(right, pos.x);\n            top = std::min(top, pos.y);\n            bottom = std::max(bottom, pos.y);\n        }\n\n        return FloatRect(left, top, right - left, bottom - top);\n    }\n\n    void setTransform(const Transform& t) {\n        transform = t;\n    }\n\n    const Transform& getTransform() const {\n        return transform;\n    }\n\n    void draw(SDL_Renderer* renderer, const RenderStates& states = RenderStates()) const {\n        Transform combinedTransform = states.transform.combine(transform);\n\n        switch (primitiveType) {\n            case PrimitiveType::Points:\n                for (const auto& vertex : vertices) {\n                    Vector2f pos = combinedTransform.transformPoint(vertex.position);\n                    SDL_SetRenderDrawColor(renderer, vertex.color.r, vertex.color.g, vertex.color.b, vertex.color.a);\n                    SDL_RenderDrawPoint(renderer, static_cast<int>(pos.x), static_cast<int>(pos.y));\n                }\n                break;\n\n            case PrimitiveType::Lines:\n                for (size_t i = 0; i + 1 < vertices.size(); i += 2) {\n                    Vector2f pos1 = combinedTransform.transformPoint(vertices[i].position);\n                    Vector2f pos2 = combinedTransform.transformPoint(vertices[i + 1].position);\n                    SDL_SetRenderDrawColor(renderer, vertices[i].color.r, vertices[i].color.g, vertices[i].color.b, vertices[i].color.a);\n                    SDL_RenderDrawLine(renderer,\n                                       static_cast<int>(pos1.x), static_cast<int>(pos1.y),\n                                       static_cast<int>(pos2.x), static_cast<int>(pos2.y));\n                }\n                break;\n\n            case PrimitiveType::LineStrip:\n                for (size_t i = 0; i + 1 < vertices.size(); ++i) {\n                    Vector2f pos1 = combinedTransform.transformPoint(vertices[i].position);\n                    Vector2f pos2 = combinedTransform.transformPoint(vertices[i + 1].position);\n                    SDL_SetRenderDrawColor(renderer, vertices[i].color.r, vertices[i].color.g, vertices[i].color.b, vertices[i].color.a);\n                    SDL_RenderDrawLine(renderer,\n                                       static_cast<int>(pos1.x), static_cast<int>(pos1.y),\n                                       static_cast<int>(pos2.x), static_cast<int>(pos2.y));\n                }\n                break;\n\n            case PrimitiveType::Triangles:\n                if (states.texture) {\n                    for (size_t i = 0; i + 2 < vertices.size(); i += 3) {\n                        Vector2f pos[3];\n                        for (int j = 0; j < 3; ++j) {\n                            pos[j] = combinedTransform.transformPoint(vertices[i + j].position);\n                        }\n                        float minX = std::min(std::min(pos[0].x, pos[1].x), pos[2].x);\n                        float minY = std::min(std::min(pos[0].y, pos[1].y), pos[2].y);\n                        float maxX = std::max(std::max(pos[0].x, pos[1].x), pos[2].x);\n                        float maxY = std::max(std::max(pos[0].y, pos[1].y), pos[2].y);\n                        SDL_Rect dest = { static_cast<int>(minX), static_cast<int>(minY),\n                                          static_cast<int>(maxX - minX), static_cast<int>(maxY - minY) };\n                        SDL_Rect src = { static_cast<int>(vertices[i].texCoords.x), static_cast<int>(vertices[i].texCoords.y),\n                                         static_cast<int>(states.texture->getSize().x), static_cast<int>(states.texture->getSize().y) };\n                        SDL_SetTextureColorMod(states.texture->getSDLTexture(), vertices[i].color.r, vertices[i].color.g, vertices[i].color.b);\n                        SDL_SetTextureAlphaMod(states.texture->getSDLTexture(), vertices[i].color.a);\n                        SDL_RenderCopy(renderer, states.texture->getSDLTexture(), &src, &dest);\n                    }\n                } else {\n                    for (size_t i = 0; i + 2 < vertices.size(); i += 3) {\n                        Vector2f pos[3];\n                        for (int j = 0; j < 3; ++j) {\n                            pos[j] = combinedTransform.transformPoint(vertices[i + j].position);\n                        }\n                        SDL_SetRenderDrawColor(renderer, vertices[i].color.r, vertices[i].color.g, vertices[i].color.b, vertices[i].color.a);\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[0].x), static_cast<int>(pos[0].y),\n                                           static_cast<int>(pos[1].x), static_cast<int>(pos[1].y));\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[1].x), static_cast<int>(pos[1].y),\n                                           static_cast<int>(pos[2].x), static_cast<int>(pos[2].y));\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[2].x), static_cast<int>(pos[2].y),\n                                           static_cast<int>(pos[0].x), static_cast<int>(pos[0].y));\n                    }\n                }\n                break;\n\n            case PrimitiveType::TriangleStrip:\n                if (states.texture) {\n                    for (size_t i = 0; i + 2 < vertices.size(); ++i) {\n                        Vector2f pos[3];\n                        for (int j = 0; j < 3; ++j) {\n                            pos[j] = combinedTransform.transformPoint(vertices[i + j].position);\n                        }\n                        float minX = std::min(std::min(pos[0].x, pos[1].x), pos[2].x);\n                        float minY = std::min(std::min(pos[0].y, pos[1].y), pos[2].y);\n                        float maxX = std::max(std::max(pos[0].x, pos[1].x), pos[2].x);\n                        float maxY = std::max(std::max(pos[0].y, pos[1].y), pos[2].y);\n                        SDL_Rect dest = { static_cast<int>(minX), static_cast<int>(minY),\n                                          static_cast<int>(maxX - minX), static_cast<int>(maxY - minY) };\n                        SDL_Rect src = { static_cast<int>(vertices[i].texCoords.x), static_cast<int>(vertices[i].texCoords.y),\n                                         static_cast<int>(states.texture->getSize().x), static_cast<int>(states.texture->getSize().y) };\n                        SDL_SetTextureColorMod(states.texture->getSDLTexture(), vertices[i].color.r, vertices[i].color.g, vertices[i].color.b);\n                        SDL_SetTextureAlphaMod(states.texture->getSDLTexture(), vertices[i].color.a);\n                        SDL_RenderCopy(renderer, states.texture->getSDLTexture(), &src, &dest);\n                    }\n                } else {\n                    for (size_t i = 0; i + 2 < vertices.size(); ++i) {\n                        Vector2f pos[3];\n                        for (int j = 0; j < 3; ++j) {\n                            pos[j] = combinedTransform.transformPoint(vertices[i + j].position);\n                        }\n                        SDL_SetRenderDrawColor(renderer, vertices[i].color.r, vertices[i].color.g, vertices[i].color.b, vertices[i].color.a);\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[0].x), static_cast<int>(pos[0].y),\n                                           static_cast<int>(pos[1].x), static_cast<int>(pos[1].y));\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[1].x), static_cast<int>(pos[1].y),\n                                           static_cast<int>(pos[2].x), static_cast<int>(pos[2].y));\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[2].x), static_cast<int>(pos[2].y),\n                                           static_cast<int>(pos[0].x), static_cast<int>(pos[0].y));\n                    }\n                }\n                break;\n\n            case PrimitiveType::TriangleFan:\n                if (states.texture) {\n                    for (size_t i = 1; i + 1 < vertices.size(); ++i) {\n                        Vector2f pos[3];\n                        pos[0] = combinedTransform.transformPoint(vertices[0].position);\n                        pos[1] = combinedTransform.transformPoint(vertices[i].position);\n                        pos[2] = combinedTransform.transformPoint(vertices[i + 1].position);\n                        float minX = std::min(std::min(pos[0].x, pos[1].x), pos[2].x);\n                        float minY = std::min(std::min(pos[0].y, pos[1].y), pos[2].y);\n                        float maxX = std::max(std::max(pos[0].x, pos[1].x), pos[2].x);\n                        float maxY = std::max(std::max(pos[0].y, pos[1].y), pos[2].y);\n                        SDL_Rect dest = { static_cast<int>(minX), static_cast<int>(minY),\n                                          static_cast<int>(maxX - minX), static_cast<int>(maxY - minY) };\n                        SDL_Rect src = { static_cast<int>(vertices[0].texCoords.x), static_cast<int>(vertices[0].texCoords.y),\n                                         static_cast<int>(states.texture->getSize().x), static_cast<int>(states.texture->getSize().y) };\n                        SDL_SetTextureColorMod(states.texture->getSDLTexture(), vertices[0].color.r, vertices[0].color.g, vertices[0].color.b);\n                        SDL_SetTextureAlphaMod(states.texture->getSDLTexture(), vertices[0].color.a);\n                        SDL_RenderCopy(renderer, states.texture->getSDLTexture(), &src, &dest);\n                    }\n                } else {\n                    for (size_t i = 1; i + 1 < vertices.size(); ++i) {\n                        Vector2f pos[3];\n                        pos[0] = combinedTransform.transformPoint(vertices[0].position);\n                        pos[1] = combinedTransform.transformPoint(vertices[i].position);\n                        pos[2] = combinedTransform.transformPoint(vertices[i + 1].position);\n                        SDL_SetRenderDrawColor(renderer, vertices[0].color.r, vertices[0].color.g, vertices[0].color.b, vertices[0].color.a);\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[0].x), static_cast<int>(pos[0].y),\n                                           static_cast<int>(pos[1].x), static_cast<int>(pos[1].y));\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[1].x), static_cast<int>(pos[1].y),\n                                           static_cast<int>(pos[2].x), static_cast<int>(pos[2].y));\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[2].x), static_cast<int>(pos[2].y),\n                                           static_cast<int>(pos[0].x), static_cast<int>(pos[0].y));\n                    }\n                }\n                break;\n\n            case PrimitiveType::Quads:\n                if (states.texture) {\n                    for (size_t i = 0; i + 3 < vertices.size(); i += 4) {\n                        Vector2f pos[4];\n                        for (int j = 0; j < 4; ++j) {\n                            pos[j] = combinedTransform.transformPoint(vertices[i + j].position);\n                        }\n                        float minX = std::min(std::min(std::min(pos[0].x, pos[1].x), pos[2].x), pos[3].x);\n                        float minY = std::min(std::min(std::min(pos[0].y, pos[1].y), pos[2].y), pos[3].y);\n                        float maxX = std::max(std::max(std::max(pos[0].x, pos[1].x), pos[2].x), pos[3].x);\n                        float maxY = std::max(std::max(std::max(pos[0].y, pos[1].y), pos[2].y), pos[3].y);\n                        SDL_Rect dest = { static_cast<int>(minX), static_cast<int>(minY),\n                                          static_cast<int>(maxX - minX), static_cast<int>(maxY - minY) };\n                        SDL_Rect src = { static_cast<int>(vertices[i].texCoords.x), static_cast<int>(vertices[i].texCoords.y),\n                                         static_cast<int>(states.texture->getSize().x), static_cast<int>(states.texture->getSize().y) };\n                        SDL_SetTextureColorMod(states.texture->getSDLTexture(), vertices[i].color.r, vertices[i].color.g, vertices[i].color.b);\n                        SDL_SetTextureAlphaMod(states.texture->getSDLTexture(), vertices[i].color.a);\n                        SDL_RenderCopy(renderer, states.texture->getSDLTexture(), &src, &dest);\n                    }\n                } else {\n                    for (size_t i = 0; i + 3 < vertices.size(); i += 4) {\n                        Vector2f pos[4];\n                        for (int j = 0; j < 4; ++j) {\n                            pos[j] = combinedTransform.transformPoint(vertices[i + j].position);\n                        }\n                        SDL_SetRenderDrawColor(renderer, vertices[i].color.r, vertices[i].color.g, vertices[i].color.b, vertices[i].color.a);\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[0].x), static_cast<int>(pos[0].y),\n                                           static_cast<int>(pos[1].x), static_cast<int>(pos[1].y));\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[1].x), static_cast<int>(pos[1].y),\n                                           static_cast<int>(pos[2].x), static_cast<int>(pos[2].y));\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[2].x), static_cast<int>(pos[2].y),\n                                           static_cast<int>(pos[3].x), static_cast<int>(pos[3].y));\n                        SDL_RenderDrawLine(renderer,\n                                           static_cast<int>(pos[3].x), static_cast<int>(pos[3].y),\n                                           static_cast<int>(pos[0].x), static_cast<int>(pos[0].y));\n                    }\n                }\n                break;\n        }\n    }\n\nprivate:\n    PrimitiveType primitiveType;\n    std::vector<Vertex> vertices;\n    Transform transform;\n};\n\n// sf::RenderTexture\nclass RenderTexture {\npublic:\n    RenderTexture() : texture(nullptr), renderer(nullptr), ownsRenderer(false) {}\n    ~RenderTexture() {\n        if (texture) SDL_DestroyTexture(texture);\n        if (ownsRenderer && renderer) SDL_DestroyRenderer(renderer);\n    }\n\n    bool create(unsigned int width, unsigned int height) {\n        if (!renderer) {\n            renderer = SDL_CreateRenderer(nullptr, -1, SDL_RENDERER_ACCELERATED);\n            if (!renderer) {\n                throw std::runtime_error(\"Failed to create renderer: \" + std::string(SDL_GetError()));\n            }\n            ownsRenderer = true;\n        }\n        texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, width, height);\n        if (!texture) {\n            if (ownsRenderer) SDL_DestroyRenderer(renderer);\n            throw std::runtime_error(\"Failed to create render texture: \" + std::string(SDL_GetError()));\n        }\n        textureWidth = width;\n        textureHeight = height;\n        internalTexture = Texture(texture, width, height);\n        return true;\n    }\n\n    void clear(const Color& color = Color(0, 0, 0, 255)) {\n        if (!texture) return;\n        SDL_SetRenderTarget(renderer, texture);\n        SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a);\n        SDL_RenderClear(renderer);\n        SDL_SetRenderTarget(renderer, nullptr);\n    }\n\n    void draw(const VertexArray& vertexArray, const RenderStates& states = RenderStates()) {\n        if (!this->texture) return;\n        SDL_SetRenderTarget(renderer, this->texture);\n        vertexArray.draw(renderer, states);\n        SDL_SetRenderTarget(renderer, nullptr);\n    }\n\n    void display() {}\n\n    const Texture& getTexture() const {\n        if (!texture) {\n            throw std::runtime_error(\"No texture available\");\n        }\n        return internalTexture;\n    }\n\n    void setRenderer(SDL_Renderer* rend) {\n        if (ownsRenderer && renderer) {\n            SDL_DestroyRenderer(renderer);\n        }\n        renderer = rend;\n        ownsRenderer = false;\n        internalTexture = Texture(texture, textureWidth, textureHeight);\n    }\n\nprivate:\n    SDL_Texture* texture;\n    SDL_Renderer* renderer;\n    bool ownsRenderer;\n    Texture internalTexture;\n    int textureWidth = 0, textureHeight = 0;\n};\n//---\n\nclass ViewManager\n{\npublic:\n    const View& getView() {return m_view;}\n\n    const View& getDefaultView() {return m_view;}\n\n    const Vector2u& getSize() const noexcept {return m_size;}\n\nprotected:\n    Vector2u m_size;\n    View m_view;\n};\n\nclass Keyboard\n{\npublic:\n    enum Key\n    {\n        Unknown = -1,                  ///< Unhandled key\n        A = SDLK_a,                    ///< The A key\n        B = SDLK_b,                    ///< The B key\n        C = SDLK_c,                    ///< The C key\n        D = SDLK_d,                    ///< The D key\n        E = SDLK_e,                    ///< The E key\n        F = SDLK_f,                    ///< The F key\n        G = SDLK_g,                    ///< The G key\n        H = SDLK_h,                    ///< The H key\n        I = SDLK_i,                    ///< The I key\n        J = SDLK_j,                    ///< The J key\n        K = SDLK_k,                    ///< The K key\n        L = SDLK_l,                    ///< The L key\n        M = SDLK_m,                    ///< The M key\n        N = SDLK_n,                    ///< The N key\n        O = SDLK_o,                    ///< The O key\n        P = SDLK_p,                    ///< The P key\n        Q = SDLK_q,                    ///< The Q key\n        R = SDLK_r,                    ///< The R key\n        S = SDLK_s,                    ///< The S key\n        T = SDLK_t,                    ///< The T key\n        U = SDLK_u,                    ///< The U key\n        V = SDLK_v,                    ///< The V key\n        W = SDLK_w,                    ///< The W key\n        X = SDLK_x,                    ///< The X key\n        Y = SDLK_y,                    ///< The Y key\n        Z = SDLK_z,                    ///< The Z key\n        Num0 = SDLK_0,                 ///< The 0 key\n        Num1 = SDLK_1,                 ///< The 1 key\n        Num2 = SDLK_2,                 ///< The 2 key\n        Num3 = SDLK_3,                 ///< The 3 key\n        Num4 = SDLK_4,                 ///< The 4 key\n        Num5 = SDLK_5,                 ///< The 5 key\n        Num6 = SDLK_6,                 ///< The 6 key\n        Num7 = SDLK_7,                 ///< The 7 key\n        Num8 = SDLK_8,                 ///< The 8 key\n        Num9 = SDLK_9,                 ///< The 9 key\n        Escape =\n#if !defined(__ANDROID__)\n                SDLK_ESCAPE            ///< The Escape key\n#else\n                SDLK_AC_BACK           ///< The Back key Android\n#endif\n        ,\n        LControl = SDLK_LCTRL,         ///< The left Control key\n        LShift = SDLK_LSHIFT,          ///< The left Shift key\n        LAlt = SDLK_LALT,              ///< The left Alt key\n        //LSystem = SDLK_LEFT_SUPER,     ///< The left OS specific key: window (Windows and Linux), apple (MacOS X), ...\n        RControl = SDLK_RCTRL,         ///< The right Control key\n        RShift = SDLK_RSHIFT,          ///< The right Shift key\n        RAlt = SDLK_RALT,              ///< The right Alt key\n        //RSystem = SDLK_RIGHT_SUPER,    ///< The right OS specific key: window (Windows and Linux), apple (MacOS X), ...\n        Menu = SDLK_MENU,              ///< The Menu key\n        LBracket = SDLK_LEFTBRACKET,   ///< The [ key\n        RBracket = SDLK_RIGHTBRACKET,  ///< The ] key\n        Semicolon = SDLK_SEMICOLON,    ///< The ; key\n        Comma = SDLK_COMMA,            ///< The , key\n        Period = SDLK_PERIOD,          ///< The . key\n        Slash = SDLK_SLASH,            ///< The / key\n        Backslash = SDLK_BACKSLASH,    ///< The \\ key\n        Equal = SDLK_EQUALS,           ///< The = key\n        Space = SDLK_SPACE,            ///< The Space key\n        Enter = SDLK_RETURN,           ///< The Enter/Return keys\n        Backspace = SDLK_BACKSPACE,    ///< The Backspace key\n        Tab = SDLK_TAB,                ///< The Tabulation key\n        PageUp = SDLK_PAGEUP,          ///< The Page up key\n        PageDown = SDLK_PAGEDOWN,      ///< The Page down key\n        End = SDLK_END,                ///< The End key\n        Home = SDLK_HOME,              ///< The Home key\n        Insert = SDLK_INSERT,          ///< The Insert key\n        Delete = SDLK_DELETE,          ///< The Delete key\n        //Add = SDLK_KP_ADD,             ///< The + key\n        //Subtract = SDLK_KP_SUBTRACT,   ///< The - key (minus, usually from numpad)\n        Multiply = SDLK_KP_MULTIPLY,   ///< The * key\n        Divide = SDLK_KP_DIVIDE,       ///< The / key\n        Left = SDLK_LEFT,              ///< Left arrow\n        Right = SDLK_RIGHT,            ///< Right arrow\n        Up = SDLK_UP,                  ///< Up arrow\n        Down = SDLK_DOWN,              ///< Down arrow\n        Numpad0 = SDLK_0,              ///< The numpad 0 key\n        Numpad1 = SDLK_1,              ///< The numpad 1 key\n        Numpad2 = SDLK_2,              ///< The numpad 2 key\n        Numpad3 = SDLK_3,              ///< The numpad 3 key\n        Numpad4 = SDLK_4,              ///< The numpad 4 key\n        Numpad5 = SDLK_5,              ///< The numpad 5 key\n        Numpad6 = SDLK_6,              ///< The numpad 6 key\n        Numpad7 = SDLK_7,              ///< The numpad 7 key\n        Numpad8 = SDLK_8,              ///< The numpad 8 key\n        Numpad9 = SDLK_9,              ///< The numpad 9 key\n        F1 = SDLK_F1,                  ///< The F1 key\n        F2 = SDLK_F2,                  ///< The F2 key\n        F3 = SDLK_F3,                  ///< The F3 key\n        F4 = SDLK_F4,                  ///< The F4 key\n        F5 = SDLK_F5,                  ///< The F5 key\n        F6 = SDLK_F6,                  ///< The F6 key\n        F7 = SDLK_F7,                  ///< The F7 key\n        F8 = SDLK_F8,                  ///< The F8 key\n        F9 = SDLK_F9,                  ///< The F9 key\n        F10 = SDLK_F10,                ///< The F10 key\n        F11 = SDLK_F11,                ///< The F11 key\n        F12 = SDLK_F12,                ///< The F12 key\n        F13 = SDLK_F13,                ///< The F13 key\n        F14 = SDLK_F14,                ///< The F14 key\n        F15 = SDLK_F15,                ///< The F15 key\n        Pause = SDLK_PAUSE,            ///< The Pause key\n\n        BackSpace = SDLK_BACKSPACE,    ///< \\deprecated Use Backspace instead\n        BackSlash = SDLK_BACKSLASH,    ///< \\deprecated Use Backslash instead\n        SemiColon = SDLK_SEMICOLON,    ///< \\deprecated Use Semicolon instead\n        Return    = Enter,             ///< \\deprecated Use Enter instead\n\n        Underscore = SDLK_UNDERSCORE   ///< \\deprecated The Underscore (Only for SDL 2)\n    };\n\n    static bool isKeyPressed(Key key);\n};\n\nclass Event\n{\npublic:\n    SDL_Event m_event;\n\n    struct SizeEvent\n    {\n        unsigned int width;\n        unsigned int height;\n    };\n\n    struct MouseWheelEvent\n    {\n        int delta; ///< Number of ticks the wheel has moved (positive is up, negative is down)\n    };\n\n    struct KeyEvent\n    {\n        int code;\n    };\n\n    struct TouchEvent\n    {\n        unsigned int finger;\n        int x;\n        int y;\n    };\n\n    enum EventType\n    {\n        Closed = SDL_QUIT,\n        Resized = SDL_WINDOWEVENT_RESIZED,\n        LostFocus = -2,\n        GainedFocus = -1,\n        MouseButtonPressed = SDL_MOUSEBUTTONDOWN,\n        MouseButtonReleased = SDL_MOUSEBUTTONUP,\n        MouseWheelMoved = SDL_MOUSEWHEEL,\n        KeyPressed = SDL_KEYDOWN,\n        KeyReleased = SDL_KEYUP,\n        TouchBegan = SDL_FINGERDOWN,\n        TouchMoved = SDL_FINGERMOTION,\n        TouchEnded = SDL_FINGERUP,\n    };\n\n    int type;\n\n    union\n    {\n        SizeEvent size;\n        KeyEvent key;\n        TouchEvent touch;\n        MouseWheelEvent mouseWheel;\n    };\n};\n\nclass VideoMode\n{\npublic:\n    VideoMode() {}\n\n    VideoMode(unsigned int modeWidth, unsigned int modeHeight, unsigned int modeBitsPerPixel = 32):\n        width(modeWidth),\n        height(modeHeight),\n        bitsPerPixel(modeBitsPerPixel)\n        {}\n    static VideoMode getDesktopMode();\n\n    unsigned int width;\n    unsigned int height;\n    unsigned int bitsPerPixel;\n};\n\nclass RenderWindow : public ViewManager\n{\npublic:\n    RenderWindow():\n        m_title(\"\"),\n        m_windowFrameLimit(1000 / 30)\n     {}\n\n    ~RenderWindow();\n\n    void create(VideoMode videoMode, const std::string& title, int style = Style::Default);\n\n    void setFramerateLimit(int fps);\n\n    void setSize(const Vector2u& size);\n\n    void setTitle(const std::string& text);\n\n    void setView(const View& view);\n\n    void setPosition(Vector2i position);\n\n    void setPosition(int x, int y);\n\n    void setVerticalSyncEnabled(bool vsync);\n\n    void setIcon(Uint32 width, Uint32 height, const Uint8* pixels);\n\n    void clear(sf::Color const &color);\n\n    void clear() {clear(sf::Color::Black);}\n\n    void draw(SDLTexture &obj);\n\n    void draw(Shape &obj) {obj.draw(m_view);}\n\n    void draw(const VertexArray& vertexArray, const RenderStates& states = RenderStates()) {\n        vertexArray.draw(is::IS_ENGINE_SDL_renderer, states);\n    }\n\n    void display();\n\n    void close()\n    {\n        is::IS_ENGINE_SDL_closeWindow = true;\n        m_isOpen = false;\n    }\n\n    bool pollEvent(Event &event);\n\n    bool waitEvent(Event &event);\n\n    bool isOpen() const {return m_isOpen;}\n\n    Vector2i getPosition() const;\n\n    Vector2f mapPixelToCoords(const Vector2i& point, const View& view) const;\n\nprivate:\n    SDL_Surface* m_SDLiconSurface = NULL;\n    std::string m_title;\n    unsigned int m_windowFrameLimit;\n    int m_style;\n    bool m_isOpen = true;\n    float m_tempScreenXScale, m_tempScreenYScale;\n    std::chrono::steady_clock::time_point m_timeSinceLastDisplay; ///< The timepoint at which Display() was last called\n};\n\ntypedef sf::RenderWindow Render;\n\nclass SoundBuffer\n{\npublic:\n    static int SDL_sndChannel;\n\n    SoundBuffer();\n\n    SoundBuffer(const std::string filename);\n\n    ~SoundBuffer();\n\n    const std::string& getFileName() const noexcept {return m_filename;}\n\n    bool loadFromFile(const std::string& filePath)\n    {\n        m_filename = filePath;\n        return loadSound(m_filename);\n    }\n\n/*  void loadFromMemory()  {functionNotSupported(\"SoundBuffer\", \"loadFromMemory\", \"loadSFMLSoundBuffer\");}\n    void loadFromStream()  {functionNotSupported(\"SoundBuffer\", \"loadFromStream\", \"loadSFMLSoundBuffer\");}\n    void loadFromSamples() {functionNotSupported(\"SoundBuffer\", \"loadFromSamples\", \"loadSFMLSoundBuffer\");}\n*/\n    Mix_Chunk* getSDLChunk() const {return m_SDLsound;}\n\n    int getSDLChannel() const {return m_channel;}\n\nprivate:\n    Mix_Chunk *m_SDLsound = NULL;\n    int m_channel;\n    std::string m_filename = \"\";\n    bool loadSound(const std::string& filePath);\n    void setChannelId();\n};\n\nclass Sound : public SoundSource\n{\npublic:\n    Sound() : SoundSource() {}\n\n    Sound(SoundBuffer& buffer) :\n        SoundSource(),\n        m_SDLsoundBuffer(&buffer)\n        {}\n\n    Status getStatus();\n\n    void play();\n\n    void setPitch(float speed);\n\n    void pause()\n    {\n        Mix_Pause(m_SDLsoundBuffer->getSDLChannel());\n        m_status = Status::Paused;\n    }\n\n    void stop()\n    {\n        Mix_HaltChannel(m_SDLsoundBuffer->getSDLChannel());\n        m_status = Status::Stopped;\n    }\n\n    void setLoop(bool loop)\n    {\n        m_loop = loop;\n    }\n\n    void setVolume(float volume);\n\n    void setBuffer(SoundBuffer &soundBuffer)\n    {\n        m_SDLsoundBuffer = &soundBuffer;\n    }\n\n#if !defined(__ANDROID__)\nprivate:\n#else\nprotected:\n#endif\n    SoundBuffer *m_SDLsoundBuffer = nullptr;\n    bool m_loop = false;\n};\n\nclass Music : public\n#if !defined(__ANDROID__)\n        SoundSource\n#else\n        Sound\n#endif\n{\npublic:\n    Music();\n\n    ~Music();\n\n    Status getStatus();\n#if !defined(__ANDROID__)\n    void play();\n\n    void setPitch(float speed);\n\n    void pause()\n    {\n        Mix_PauseMusic();\n        m_status = Status::Paused;\n    }\n\n    void stop()\n    {\n        Mix_HaltMusic();\n        m_status = Status::Stopped;\n    }\n\n    void setLoop(bool loop)\n    {\n        m_loop = loop;\n    }\n\n    void setVolume(float volume);\n#endif\n    bool openFromFile(const std::string& filePath);\n    /*\n    bool openFromMemory() {functionNotSupported(\"Music\", \"openFromMemory\", \"loadSFMLMusic\");}\n    bool openFromStream() {functionNotSupported(\"Music\", \"openFromStream\", \"loadSFMLMusic\");}\n    */\n#if !defined(__ANDROID__)\nprivate:\n    Mix_Music *m_music = NULL;\n    bool m_loop = false;\n#endif\n};\n\nclass Mouse\n{\npublic:\n    enum Button {\n        Left = SDL_BUTTON_LEFT,\n        Right = SDL_BUTTON_RIGHT,\n        Middle = SDL_BUTTON_MIDDLE,\n        XButton1 = SDL_BUTTON_X1,\n        XButton2 = SDL_BUTTON_X2\n    };\n\n    static bool isButtonPressed(Button button);\n\n    static Vector2i getPosition();\n\n    static Vector2i getPosition(const RenderWindow& relativeTo);\n\n    static void setPosition(const Vector2i& position);\n\n    static void setPosition(const Vector2i& position, const RenderWindow& relativeTo);\n\nprivate:\n    static Uint32 getSDLButtonState();\n};\n\nclass Touch\n{\npublic:\n    // define array which will save different touch id\n    static bool isDown(unsigned int finger);\n\n    static Vector2i getPosition(unsigned int finger);\n\n    static Vector2i getPosition(unsigned int finger, const RenderWindow& relativeTo);\n};\n}\n#endif\n\n#endif // ISENGINESDLWRAPPER_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/islibconnect/isEngineVector2Wrapper.inl",
    "content": "#ifndef ISENGINEVECTOR2WRAPPER_INL_INCLUDED\n#define ISENGINEVECTOR2WRAPPER_INL_INCLUDED\n\n////////////////////////////////////////////////////////////\n//                  Vector2 Operator\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T> operator -(const Vector2<T>& right) {return Vector2<T>(-right.x, -right.y);}\n\ntemplate <typename T>\ninline Vector2<T>& operator +=(Vector2<T>& left, const Vector2<T>& right)\n{\n    left.x += right.x;\n    left.y += right.y;\n    return left;\n}\n\ntemplate <typename T>\ninline Vector2<T>& operator -=(Vector2<T>& left, const Vector2<T>& right)\n{\n    left.x -= right.x;\n    left.y -= right.y;\n    return left;\n}\n\ntemplate <typename T>\ninline Vector2<T> operator +(const Vector2<T>& left, const Vector2<T>& right) {return Vector2<T>(left.x + right.x, left.y + right.y);}\n\ntemplate <typename T>\ninline Vector2<T> operator -(const Vector2<T>& left, const Vector2<T>& right) {return Vector2<T>(left.x - right.x, left.y - right.y);}\n\ntemplate <typename T>\ninline Vector2<T> operator *(const Vector2<T>& left, T right) {return Vector2<T>(left.x * right, left.y * right);}\n\ntemplate <typename T>\ninline Vector2<T> operator *(T left, const Vector2<T>& right) {return Vector2<T>(right.x * left, right.y * left);}\n\ntemplate <typename T>\ninline Vector2<T>& operator *=(Vector2<T>& left, T right)\n{\n    left.x *= right;\n    left.y *= right;\n    return left;\n}\n\ntemplate <typename T>\ninline Vector2<T> operator /(const Vector2<T>& left, T right) {return Vector2<T>(left.x / right, left.y / right);}\n\ntemplate <typename T>\ninline Vector2<T>& operator /=(Vector2<T>& left, T right)\n{\n    left.x /= right;\n    left.y /= right;\n    return left;\n}\n\ntemplate <typename T>\ninline bool operator ==(const Vector2<T>& left, const Vector2<T>& right) {return (left.x == right.x) && (left.y == right.y);}\n\ntemplate <typename T>\ninline bool operator !=(const Vector2<T>& left, const Vector2<T>& right) {return (left.x != right.x) || (left.y != right.y);}\n\n#endif // ISENGINEVECTOR2WRAPPER_INL_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/islibconnect/isEngineWrapper.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef ISENGINEWRAPPER_H_INCLUDED\n#define ISENGINEWRAPPER_H_INCLUDED\n\n#include <memory>\n#include <algorithm>\n#include <cmath>\n\n#if (defined(__ANDROID__) || defined(IS_ENGINE_HTML_5) || defined(IS_ENGINE_SWITCH))\n#define IS_ENGINE_SDL_2\n#endif\n\nnamespace is\n{\n/// Allows to close application\ninline void closeApplication()\n{\n    std::terminate();\n}\n\n/// Return distance between two points (x1, y1) and (x2, y2)\ninline float pointDistance(float x1, float y1, float x2, float y2)\n{\n    float X = x1 - x2;\n    float Y = y1 - y2;\n    return sqrt(X * X + Y * Y);\n}\n\ntemplate <class T1, typename T2>\nvoid setVector2(T1 &v, T2 x, T2 y)\n{\n    v.x = x;\n    v.y = y;\n};\n\n/// Clear render\ntemplate <class T1, class T2>\nvoid clear(T1 &render, T2 const &color)\n{\n    render.clear(color);\n}\n\ntemplate <class T1>\nvoid clear(T1 &render)\n{\n    render.clear();\n}\n\n/// Display Render\ntemplate <class T>\nvoid display(T &render)\n{\n    render.display();\n}\n}\n\n#if defined(IS_ENGINE_SDL_2)\nnamespace sf\n{\n/*\n// Allows to display an error message in the console when there is not a similar function of SFML in SMK\ninline void functionNotSupported(const std::string &className, const std::string &functionName, const std::string &suitableFunction = \"\")\n{\n    std::cout << \"\\n\" + ((className != \"\") ? className + \"::\" : \"\") + functionName + \"() is not supported on the SMK library\\n\";\n    if (suitableFunction != \"\") std::cout << \"Use this function instead is::\" + suitableFunction + \"()\\n\";\n    is::closeApplication();\n}\n*/\n\ntypedef char Int8;\ntypedef short Int16;\ntypedef int Int32;\ntypedef long Int64;\n\ntypedef unsigned char Uint8;\ntypedef unsigned short Uint16;\ntypedef unsigned int Uint32;\ntypedef unsigned long Uint64;\n\ntemplate <typename T>\nclass Vector2\n{\npublic:\n    Vector2() {}\n    Vector2(T X, T Y) :\n        x(X),\n        y(Y) {}\n    T x;\n    T y;\n};\n\n#include \"isEngineVector2Wrapper.inl\"\n\ntypedef Vector2<int>          Vector2i;\ntypedef Vector2<unsigned int> Vector2u;\ntypedef Vector2<float>        Vector2f;\n\nclass Rect\n{\npublic:\n    int left;\n    int top;\n    int width;\n    int height;\n\n    Rect() :\n        left(0),\n        top(0),\n        width(0),\n        height(0) {}\n\n    Rect(int _left, int _top, int _width, int _height) :\n        left(_left),\n        top(_top),\n        width(_width),\n        height(_height) {}\n\n    bool intersects(Rect const &rec) const;\n    bool intersects(Rect const &rec1, Rect const &rec2) const;\n\n    template<typename T>\n    bool contains(T x, T y) const\n    {\n        T minX = static_cast<T>(left);\n        T maxX = static_cast<T>(left + width);\n        T minY = static_cast<T>(top);\n        T maxY = static_cast<T>(top + height);\n        return (x >= minX) && (x < maxX) && (y >= minY) && (y < maxY);\n    }\n    template<typename T>\n    bool contains(const Vector2<T>& point) const\n    {\n        return contains(point.x, point.y);\n    }\n};\n\ntypedef Rect IntRect;\ntypedef Rect FloatRect;\n\n//class String : public std::string {};\n\nRect functionGetGlobalBounds(const Vector2f &position, const Vector2f &origin, const Vector2f &size);\n//Color functionGetColor(Color &color);\n\nclass Time\n{\npublic:\n    Time() : m_microseconds(0.f) {};\n    float asSeconds()      const {return m_microseconds / 1000000.f;}\n    Int32 asMilliseconds() const {return static_cast<Int32>(m_microseconds / 1000);}\n    Int64 asMicroseconds() const {return m_microseconds;}\n\n    static const Time Zero;\n    bool operator>(const Time& time) const {return asMicroseconds() > time.asMicroseconds();}\n    bool operator<(const Time& time) const {return asMicroseconds() < time.asMicroseconds();}\n\nprivate:\n    friend Time seconds(float);\n    friend Time milliseconds(Int32);\n    friend Time microseconds(Int64);\n    explicit Time(Int64 microseconds) : m_microseconds(microseconds){}\n    Int64 m_microseconds;\n};\n\nTime seconds(float amount);\nTime milliseconds(Int32 amount);\nTime microseconds(Int64 amount);\n\nclass Clock\n{\npublic:\n    Clock();\n    const Time getElapsedTime();\n    Time restart();\n\nprivate:\n    Time m_startTime;\n};\n\nclass SoundSource\n{\npublic:\n    enum Status\n    {\n        Stopped,\n        Playing,\n        Paused\n    };\n    SoundSource() : m_status(Stopped) {}\n\nprotected:\n    Status m_status = Stopped;\n};\n\nenum Style\n{\n    None,\n    Titlebar,\n    Resize,\n    Close,\n    Fullscreen,\n    Default\n};\n}\n\n#endif\n\n#endif // ISENGINEWRAPPER_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/islibconnect/isLibConnect.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef ISLIBCONNECT_H_INCLUDED\n#define ISLIBCONNECT_H_INCLUDED\n\n#if (defined(IS_ENGINE_SDL_2) || defined(IS_ENGINE_HTML_5) || defined(__ANDROID__) || defined(IS_ENGINE_SWITCH))\n    #include \"isEngineSDLWrapper.h\"\n#else\n    #include <SFML/Audio.hpp>\n    #include <SFML/Network.hpp>\n    #include <SFML/Graphics.hpp>\n    #include <SFML/Window.hpp>\n    #include <SFML/System.hpp>\n    #include \"isEngineWrapper.h\"\nnamespace is\n{\nstatic bool IS_ENGINE_MOBILE_OS(\n                         #if defined(__ANDROID__)\n                         true\n                         #else\n                         false\n                         #endif\n                         );\n}\n#endif\n\n#if !defined(IS_ENGINE_SDL_2)\n#define IS_ENGINE_SFML\n#endif\n\nnamespace is\n{\n#if defined(IS_ENGINE_SDL_2)\n/// Draw on render\ninline void draw(sf::RenderWindow &render, sf::SDLTexture &obj) {render.draw(obj);}\ninline void draw(sf::RenderWindow &render, sf::SDLTexture *obj) {render.draw(*obj);}\ninline void draw(sf::RenderWindow &render, sf::Shape &obj) {render.draw(obj);}\ninline void draw(sf::RenderWindow &render, sf::Shape *obj) {render.draw(*obj);}\n#else\ntemplate <class T1, class T2>\nvoid draw(T1 &render, T2 &obj) {render.draw(obj);}\ntemplate <class T1, class T2>\nvoid draw(T1 &render, T2 *obj) {render.draw(&obj);}\n#endif\ntypedef sf::RenderWindow Render;\n}\n\n#endif // ISLIBCONNECT_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/sound/GSM.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GSM_H_INCLUDED\n#define GSM_H_INCLUDED\n\n#include \"../sound/GameSound.h\"\n#include \"../sound/GameMusic.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for manage SFML Sound and Music without using an\n/// SFML object\n////////////////////////////////////////////////////////////\nclass GSM\n{\npublic:\n    /// Game Sound container\n    std::vector<std::shared_ptr<GameSound>> m_GSMsound;\n\n//#if !defined(__ANDROID__)\n    /// Game Music container\n    std::vector<std::shared_ptr<GameMusic>> m_GSMmusic;\n//#endif\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add SFML Sound in container\n    ///\n    /// \\param name of sound which will be used to identify\n    /// it in the container in order to be able to access it\n    /// \\param filePath path of the sound file to add\n    //////////////////////////////////////////////////////\n    virtual void GSMaddSound(const std::string& name, const std::string& filePath)\n    {\n        if (!soundFileExists(filePath))\n        {\n            auto obj = std::make_shared<GameSound>(name, filePath);\n            m_GSMsound.push_back(obj);\n        }\n        else is::showLog(\"WARNING: <\" + name + \"> sound has already been added!\");\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add existing sound in container\n    ///\n    /// \\param sound object\n    //////////////////////////////////////////////////////\n    void GSMaddSoundObject(std::shared_ptr<GameSound> sound, bool showError = true)\n    {\n        if (!soundFileExists(sound->getFilePath())) m_GSMsound.push_back(sound);\n        else\n        {\n            if (showError) is::showLog(\"WARNING: <\" + sound->getName() + \"> sound has already been added!\");\n        }\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add SFML Music in container\n    ///\n    /// \\param name of music which will be used to identify\n    /// it in the container in order to be able to access it\n    /// \\param filePath path of the music file to add\n    //////////////////////////////////////////////////////\n    virtual void GSMaddMusic(const std::string& name, const std::string& filePath)\n    {\n//#if defined(__ANDROID__)\n//        GSMaddSound(name, filePath);\n//#else\n        if (!musicFileExists(filePath))\n        {\n            auto obj = std::make_shared<GameMusic>(name, filePath);\n            m_GSMmusic.push_back(obj);\n        }\n        else is::showLog(\"WARNING: <\" + name + \"> music has already been added!\");\n//#endif\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add existing music in container\n    ///\n    /// \\param music object\n    //////////////////////////////////////////////////////\n    void GSMaddMusicObject(std::shared_ptr<\n//#if defined(__ANDROID__)\n//                           GameSound\n//#else\n                           GameMusic\n//#endif\n                           >music, bool showError = true)\n    {\n//#if defined(__ANDROID__)\n//        GSMaddSoundObject(music);\n//#else\n        if (!musicFileExists(music->getFilePath())) m_GSMmusic.push_back(music);\n        else\n        {\n            if (showError) is::showLog(\"WARNING: <\" + music->getName() + \"> music has already been added!\");\n        }\n//#endif\n    }\n\n    /// Allows to set sound loop\n    virtual void GSMsetSoundLoop(const std::string& name, bool loop)\n    {\n        WITH(m_GSMsound.size())\n        {\n            if (m_GSMsound[_I].get() != nullptr)\n            {\n                if (m_GSMsound[_I]->getName() == name && m_GSMsound[_I]->getFileIsLoaded())\n                {\n                    m_GSMsound[_I]->getSound().setLoop(loop);\n                    return;\n                }\n            }\n        }\n        is::showLog(\"ERROR: Can't loop <\" + name + \"> sound because sound does not exist!\");\n    }\n\n    /// Allows to set music loop\n    virtual void GSMsetMusicLoop(const std::string& name, bool loop)\n    {\n//#if defined(__ANDROID__)\n//        GSMsetSoundLoop(name, loop);\n//#else\n        WITH(m_GSMmusic.size())\n        {\n            if (m_GSMmusic[_I].get() != nullptr)\n            {\n                if (m_GSMmusic[_I]->getName() == name && m_GSMmusic[_I]->getFileIsLoaded())\n                {\n                    m_GSMmusic[_I]->getMusic().setLoop(loop);\n                    return;\n                }\n            }\n        }\n        is::showLog(\"ERROR: Can't loop <\" + name + \"> music because music does not exist!\");\n//#endif\n    }\n\n    /// Allows to get sound in container by his name\n    virtual sf::Sound* GSMgetSound(const std::string& name, bool showError = true)\n    {\n        WITH(m_GSMsound.size())\n        {\n            if (m_GSMsound[_I].get() != nullptr)\n            {\n                if (m_GSMsound[_I]->getName() == name && m_GSMsound[_I]->getFileIsLoaded())\n                {\n                    return &m_GSMsound[_I]->getSound();\n                }\n            }\n        }\n        if (showError) is::showLog(\"ERROR: <\" + name + \"> sound does not exist!\");\n        return nullptr;\n    }\n\n    /// Allows to get music in container by his name\n    virtual\n//#if defined(__ANDROID__)\n//    sf::Sound*\n//#else\n    sf::Music*\n//#endif\n    GSMgetMusic(const std::string& name, bool showError = true)\n    {\n        WITH(\n//#if defined(__ANDROID__)\n//                m_GSMsound.size()\n//#else\n                m_GSMmusic.size()\n//#endif\n                )\n        {\n            if (\n//#if defined(__ANDROID__)\n//                m_GSMsound[_I].get() != nullptr\n//#else\n                m_GSMmusic[_I].get() != nullptr\n//#endif\n                )\n            {\n                if (\n//#if defined(__ANDROID__)\n//                    m_GSMsound[_I]->getName() == name && m_GSMsound[_I]->getFileIsLoaded()\n//#else\n                    m_GSMmusic[_I]->getName() == name && m_GSMmusic[_I]->getFileIsLoaded()\n//#endif\n                    )\n                {\n                    return\n//#if defined(__ANDROID__)\n//                        &m_GSMsound[_I]->getSound();\n//#else\n                        &m_GSMmusic[_I]->getMusic();\n//#endif\n                }\n            }\n        }\n        if (showError) is::showLog(\"ERROR: <\" + name + \"> music does not exist!\");\n        return nullptr;\n    }\n\n    /// Allows to pause sound in container by his name\n    virtual void GSMpauseSound(const std::string& name)\n    {\n        bool soundExist(false);\n        WITH(m_GSMsound.size())\n        {\n            if (m_GSMsound[_I].get() != nullptr)\n            {\n                if (m_GSMsound[_I]->getName() == name)\n                {\n                    soundExist = true;\n                    if (m_GSMsound[_I]->getFileIsLoaded())\n                    {\n                        if (is::checkSFMLSndState(m_GSMsound[_I]->getSound(), is::SFMLSndStatus::Playing)) m_GSMsound[_I]->getSound().pause();\n                    }\n                    else is::showLog(\"ERROR: Can't pause <\" + name + \"> sound!\");\n                    break;\n                }\n            }\n        }\n        if (!soundExist) is::showLog(\"ERROR: Can't pause <\" + name + \"> sound because sound does not exist!\");\n    }\n\n    /// Allows to stop sound in container by his name\n    virtual void GSMstopSound(const std::string& name)\n    {\n        bool soundExist(false);\n        WITH(m_GSMsound.size())\n        {\n            if (m_GSMsound[_I].get() != nullptr)\n            {\n                if (m_GSMsound[_I]->getName() == name)\n                {\n                    soundExist = true;\n                    if (m_GSMsound[_I]->getFileIsLoaded())\n                    {\n                        if (is::checkSFMLSndState(m_GSMsound[_I]->getSound(), is::SFMLSndStatus::Playing)) m_GSMsound[_I]->getSound().stop();\n                    }\n                    else is::showLog(\"ERROR: Can't stop <\" + name + \"> sound!\");\n                    break;\n                }\n            }\n        }\n        if (!soundExist) is::showLog(\"ERROR: Can't stop <\" + name + \"> sound because sound does not exist!\");\n    }\n\n    /// Allows to pause music in container by his name\n    virtual void GSMpauseMusic(const std::string& name)\n    {\n//    #if defined(__ANDROID__)\n//        GSMpauseSound(name);\n//    #else\n        bool musicExist(false);\n        WITH(m_GSMmusic.size())\n        {\n            if (m_GSMmusic[_I].get() != nullptr)\n            {\n                if (m_GSMmusic[_I]->getName() == name)\n                {\n                    musicExist = true;\n                    if (m_GSMmusic[_I]->getFileIsLoaded())\n                    {\n                        if (is::checkSFMLSndState(m_GSMmusic[_I]->getMusic(), is::SFMLSndStatus::Playing)) m_GSMmusic[_I]->getMusic().pause();\n                    }\n                    else is::showLog(\"ERROR: Can't pause <\" + name + \"> music!\");\n                    break;\n                }\n            }\n        }\n        if (!musicExist) is::showLog(\"ERROR: Can't pause <\" + name + \"> music because music does not exist!\");\n//    #endif\n    }\n\n    /// Allows to stop music in container by his name\n    virtual void GSMstopMusic(const std::string& name)\n    {\n//    #if defined(__ANDROID__)\n//        GSMstopSound(name);\n//    #else\n        bool musicExist(false);\n        WITH(m_GSMmusic.size())\n        {\n            if (m_GSMmusic[_I].get() != nullptr)\n            {\n                if (m_GSMmusic[_I]->getName() == name)\n                {\n                    musicExist = true;\n                    if (m_GSMmusic[_I]->getFileIsLoaded())\n                    {\n                        if (is::checkSFMLSndState(m_GSMmusic[_I]->getMusic(), is::SFMLSndStatus::Playing)) m_GSMmusic[_I]->getMusic().stop();\n                    }\n                    else is::showLog(\"ERROR: Can't stop <\" + name + \"> music!\");\n                    break;\n                }\n            }\n        }\n        if (!musicExist) is::showLog(\"ERROR: Can't stop <\" + name + \"> music because music does not exist!\");\n//    #endif\n    }\n\n    /// Allows to delete sound in container by his name\n    virtual void GSMdeleteSound(const std::string& name)\n    {\n        int soundId(-1);\n        WITH(m_GSMsound.size())\n        {\n            if (m_GSMsound[_I].get() != nullptr)\n            {\n                if (m_GSMsound[_I]->getName() == name)\n                {\n                    soundId = _I;\n                    break;\n                }\n            }\n        }\n        if (soundId == -1) is::showLog(\"ERROR: Can't delete <\" + name + \"> sound because sound does not exist!\");\n        else\n        {\n            m_GSMsound[soundId].reset();\n            m_GSMsound[soundId] = nullptr;\n        }\n    }\n\n    /// Allows to delete music in container by his name\n    virtual void GSMdeleteMusic(const std::string& name)\n    {\n//    #if defined(__ANDROID__)\n//        GSMdeleteSound(name);\n//    #else\n        int musicId(-1);\n        WITH(m_GSMmusic.size())\n        {\n            if (m_GSMmusic[_I].get() != nullptr)\n            {\n                if (m_GSMmusic[_I]->getName() == name)\n                {\n                    musicId = _I;\n                    break;\n                }\n            }\n        }\n        if (musicId == -1) is::showLog(\"ERROR: Can't delete <\" + name + \"> music because music does not exist!\");\n        else\n        {\n            m_GSMmusic[musicId].reset();\n            m_GSMmusic[musicId] = nullptr;\n        }\n//    #endif\n    }\n\n////////////////////////////////////////////////////////////\n/// These methods below have the same role as those above.\n/// The difference here is that their name starting with GSM\n/// is replaced by GRM (Game Resource Manager).\n////////////////////////////////////////////////////////////\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add SFML Sound in container\n    ///\n    /// \\param name of sound which will be used to identify\n    /// it in the container in order to be able to access it\n    /// \\param filePath path of the sound file to add\n    //////////////////////////////////////////////////////\n    virtual void GRMaddSound(const std::string& name, const std::string& filePath)\n    {\n        GSMaddSound(name, filePath);\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add existing sound in container\n    ///\n    /// \\param sound object\n    //////////////////////////////////////////////////////\n    void GRMaddSoundObject(std::shared_ptr<GameSound> sound, bool showError = true)\n    {\n        GSMaddSoundObject(sound, showError);\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add SFML Music in container\n    ///\n    /// \\param name of music which will be used to identify\n    /// it in the container in order to be able to access it\n    /// \\param filePath path of the music file to add\n    //////////////////////////////////////////////////////\n    virtual void GRMaddMusic(const std::string& name, const std::string& filePath)\n    {\n//#if defined(__ANDROID__)\n//        GSMaddSound(name, filePath);\n//#else\n        GSMaddMusic(name, filePath);\n//#endif\n    }\n\n    //////////////////////////////////////////////////////\n    /// \\brief Allows to add existing music in container\n    ///\n    /// \\param music object\n    //////////////////////////////////////////////////////\n    void GRMaddMusicObject(std::shared_ptr<\n//#if defined(__ANDROID__)\n//                           GameSound\n//#else\n                           GameMusic\n//#endif\n                           >music, bool showError = true)\n    {\n//#if defined(__ANDROID__)\n//        GSMaddSoundObject(music, showError);\n//#else\n        GSMaddMusicObject(music, showError);\n//#endif\n    }\n\n    /// Allows to set sound loop\n    virtual void GRMsetSoundLoop(const std::string& name, bool loop)\n    {\n        GSMsetSoundLoop(name, loop);\n    }\n\n    /// Allows to set music loop\n    virtual void GRMsetMusicLoop(const std::string& name, bool loop)\n    {\n//#if defined(__ANDROID__)\n//        GSMsetSoundLoop(name, loop);\n//#else\n        GSMsetMusicLoop(name, loop);\n//#endif\n    }\n\n    /// Allows to get sound in container by his name\n    virtual sf::Sound* GRMgetSound(const std::string& name, bool showError = true)\n    {\n        return GSMgetSound(name, showError);\n    }\n\n    /// Allows to get music in container by his name\n    virtual\n//#if defined(__ANDROID__)\n//    sf::Sound*\n//#else\n    sf::Music*\n//#endif\n    GRMgetMusic(const std::string& name, bool showError = true)\n    {\n        return\n//#if defined(__ANDROID__)\n//            GSMgetSound(name, showError);\n//#else\n            GSMgetMusic(name, showError);\n//#endif\n    }\n\n    /// Allows to pause sound in container by his name\n    virtual void GRMpauseSound(const std::string& name)\n    {\n        GSMpauseSound(name);\n    }\n\n    /// Allows to stop sound in container by his name\n    virtual void GRMstopSound(const std::string& name)\n    {\n        GSMstopSound(name);\n    }\n\n    /// Allows to pause music in container by his name\n    virtual void GRMpauseMusic(const std::string& name)\n    {\n//    #if defined(__ANDROID__)\n//        GSMpauseSound(name);\n//    #else\n        GSMpauseMusic(name);\n//    #endif\n    }\n\n    /// Allows to stop music in container by his name\n    virtual void GRMstopMusic(const std::string& name)\n    {\n//    #if defined(__ANDROID__)\n//        GSMstopSound(name);\n//    #else\n        GSMstopMusic(name);\n//    #endif\n    }\n\n    /// Allows to delete sound in container by his name\n    virtual void GRMdeleteSound(const std::string& name)\n    {\n        GSMdeleteSound(name);\n    }\n\n    /// Allows to delete music in container by his name\n    virtual void GRMdeleteMusic(const std::string& name)\n    {\n//    #if defined(__ANDROID__)\n//        GSMdeleteSound(name);\n//    #else\n        GSMdeleteMusic(name);\n//    #endif\n    }\n\nprivate:\n    bool soundFileExists(const std::string& filePath) const\n    {\n        WITH(m_GSMsound.size())\n        {\n            if (m_GSMsound[_I].get() != nullptr)\n            {\n                if (m_GSMsound[_I]->getFilePath() == filePath) return true;\n            }\n        }\n        return false;\n    }\n\n//#if !defined(__ANDROID__)\n    bool musicFileExists(const std::string& filePath) const\n    {\n        WITH(m_GSMmusic.size())\n        {\n            if (m_GSMmusic[_I].get() != nullptr)\n            {\n                if (m_GSMmusic[_I]->getFilePath() == filePath) return true;\n            }\n        }\n        return false;\n    }\n//#endif\n};\n}\n#endif // GSM_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/sound/GameMusic.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMEMUSIC_H_INCLUDED\n#define GAMEMUSIC_H_INCLUDED\n\n#include \"../islibconnect/isLibConnect.h\"\n#include \"../entity/parents/Name.h\"\n#include \"../entity/parents/FilePath.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for manage SFML Music\n////////////////////////////////////////////////////////////\nclass GameMusic : public is::Name, public is::FilePath\n{\npublic:\n    GameMusic(const std::string& musicName, const std::string& filePath):\n        Name(musicName),\n        FilePath(filePath)\n    {\n        if (m_music.openFromFile(m_strFilePath)) m_fileIsLoaded = true;\n        //else showLog(\"ERROR: Can't load music : \" + filePath);\n    }\n\n    virtual ~GameMusic() {}\n\n    void loadResources(const std::string&filePath)\n    {\n        if (m_music.openFromFile(filePath))\n        {\n            m_strFilePath = filePath;\n            m_fileIsLoaded = true;\n        }\n        else\n        {\n            m_fileIsLoaded = false;\n            //showLog(\"ERROR: Can't load music : \" + filePath);\n        }\n    }\n\n    /// Return music object\n    sf::Music& getMusic()\n    {\n        return m_music;\n    }\n\nprivate:\n    sf::Music m_music;\n};\n}\n\n#endif // GAMEMUSIC_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngine/system/sound/GameSound.h",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef GAMESOUND_H_INCLUDED\n#define GAMESOUND_H_INCLUDED\n\n#include \"../islibconnect/isLibConnect.h\"\n#include \"../entity/parents/Name.h\"\n#include \"../entity/parents/FilePath.h\"\n\nnamespace is\n{\n////////////////////////////////////////////////////////////\n/// Class for manage SFML Sound\n////////////////////////////////////////////////////////////\nclass GameSound : public is::Name, public is::FilePath\n{\npublic:\n    GameSound(const std::string& soundName, const std::string& filePath):\n        Name(soundName),\n        FilePath(filePath)\n    {\n        if (m_sb.loadFromFile(m_strFilePath))\n        {\n            m_snd.setBuffer(m_sb);\n            m_fileIsLoaded = true;\n        }\n        //else showLog(\"ERROR: Can't load sound : \" + filePath);\n    }\n\n    virtual ~GameSound() {}\n\n    void loadResources(const std::string& filePath)\n    {\n        if (m_sb.loadFromFile(filePath))\n        {\n            m_strFilePath = filePath;\n            m_snd.setBuffer(m_sb);\n            m_fileIsLoaded = true;\n        }\n        else\n        {\n            m_fileIsLoaded = false;\n            //showLog(\"ERROR: Can't load sound : \" + filePath);\n        }\n    }\n\n    /// Return sound buffer\n    sf::SoundBuffer& getSoundBuffer() {return m_sb;}\n\n    /// Return sound object\n    sf::Sound& getSound() {return m_snd;}\n\nprivate:\n    sf::SoundBuffer m_sb;\n    sf::Sound m_snd;\n};\n}\n\n#endif // GAMESOUND_H_INCLUDED\n"
  },
  {
    "path": "app/src/main/cpp/isEngineSDLWrapper.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/islibconnect/isEngineSDLWrapper.h\"\n\n#if defined(IS_ENGINE_SDL_2)\n\nnamespace is\n{\nSDL_Window *IS_ENGINE_SDL_window = NULL;\nSDL_Renderer *IS_ENGINE_SDL_renderer = NULL;\nSDL_DisplayMode IS_ENGINE_SDL_displayMode;\n\nbool IS_ENGINE_MOBILE_OS(false);\n\nfloat IS_ENGINE_SDL_screenXScale(1.f);\nfloat IS_ENGINE_SDL_screenYScale(1.f);\n\nshort IS_ENGINE_SDL_channel[IS_ENGINE_SDL_CHANNEL_MAX] = {-1};\n\nTouchData IS_ENGINE_SDL_touchData[IS_ENGINE_SDL_TOUCH_ID_COUNT_MAX];\nbool IS_ENGINE_SDL_enableFINGERMOTION = true;\nshort IS_ENGINE_SDL_touchIdLast = 0;\nshort IS_ENGINE_SDL_touchIdCount = 0;\n\nstd::vector<sf::Font*> IS_ENGINE_SDL_AUTO_GENERATE_FONT;\n\nUint8 IS_ENGINE_SDL_buttonState[NUM_BUTTONS] = {0};\n\nSDL_GameController *IS_ENGINE_SDL_controller = NULL;\n\nvoid updateButtonState() {\n    for (int i = 0; i < NUM_BUTTONS; ++i) {\n        IS_ENGINE_SDL_buttonState[i] = SDL_GameControllerGetButton(IS_ENGINE_SDL_controller, (SDL_GameControllerButton)i);\n    }\n}\n\nconst Uint8* getControllerButtonState(int *numButtons) {\n    if (numButtons) *numButtons = NUM_BUTTONS;\n    return IS_ENGINE_SDL_buttonState;\n}\n\nbool SDL2initLib()\n{\n    if (IS_ENGINE_SDL_window == NULL || IS_ENGINE_SDL_renderer == NULL)\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"init Windows / Renderer : %s\\n\", SDL_GetError());\n        return false;\n    }\n\n    if (SDL_GetCurrentDisplayMode( 0, &IS_ENGINE_SDL_displayMode) != 0)\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Display Mode : %s\\n\", SDL_GetError());\n    }\n\n    SDL_SetRenderDrawBlendMode(IS_ENGINE_SDL_renderer, SDL_BLENDMODE_BLEND);\n\n    int imgFlags = IMG_INIT_PNG;\n    if (!(IMG_Init(imgFlags) & imgFlags))\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"init Image : %s\\n\", IMG_GetError());\n        return false;\n    }\n\n    if (TTF_Init() < 0)\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"init Font : %s\\n\", TTF_GetError());\n        return false;\n    }\n\n    // On Android, the use of .wav type music files is not yet supported\n#if !defined(__ANDROID__)\n    int audioFlags = MIX_INIT_OGG;\n    if ((Mix_Init(audioFlags) & audioFlags) != audioFlags)\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"init Mix : %s\\n\", Mix_GetError());\n        return false;\n    }\n#endif\n\n    const int frequency =\n#if defined(IS_ENGINE_HTML_5)\n    EM_ASM_INT_V({\n        var context;\n        try\n        {\n            context = new AudioContext();\n        }\n        catch(e)\n        {\n            context = new webkitAudioContext();\n        }\n        return context.sampleRate;\n    });\n\n    // Check if it is mobile platform\n    int tempBoolToInt = EM_ASM_INT\n    (\n        let ua = navigator.userAgent ;\n        if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {\n            return 1;\n        }\n        else if (/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(ua)) {\n            return 1;\n        }\n        return 0;\n    );\n    IS_ENGINE_MOBILE_OS = (tempBoolToInt == 1) ? true : false;\n#elif defined(IS_ENGINE_SWITCH)\n        48000;\n\n    // The Switch has the same features as a mobile (smartphone), so we define it as a mobile.\n    IS_ENGINE_MOBILE_OS = true;\n#else\n        22050; //44100;\n#endif\n#if defined(__SWITCH__)\n    SDL_InitSubSystem(SDL_INIT_AUDIO);\n#endif\n    if (Mix_OpenAudio(frequency,\n#if defined(__SWITCH__)\n        AUDIO_S16\n#else\n        MIX_DEFAULT_FORMAT\n#endif\n        , 2, 4096) == -1)\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"init OpenAudio : %s\\n\", Mix_GetError());\n    }\n    Mix_AllocateChannels(IS_ENGINE_SDL_CHANNEL_MAX);\n    return true;\n}\n\nvoid SDL2freeLib()\n{\n    Mix_CloseAudio();\n    Mix_Quit();\n\n    SDL_DestroyWindow(IS_ENGINE_SDL_window);\n    is::IS_ENGINE_SDL_window = NULL;\n    SDL_DestroyRenderer(IS_ENGINE_SDL_renderer);\n    is::IS_ENGINE_SDL_renderer = NULL;\n\n    IMG_Quit();\n\n    for (unsigned int _I(0); _I < IS_ENGINE_SDL_AUTO_GENERATE_FONT.size(); _I++)\n    {\n        delete IS_ENGINE_SDL_AUTO_GENERATE_FONT[_I];\n        IS_ENGINE_SDL_AUTO_GENERATE_FONT[_I] = 0;\n    }\n    TTF_Quit();\n#ifdef __SWITCH__\n    romfsExit();\n#endif\n}\n}\n\nnamespace sf\n{\nint SoundBuffer::SDL_sndChannel = 0; // Represents the channel of each sound\n\nsf::Color Color::White       = sf::Color(255, 255, 255, 255);\nsf::Color Color::Black       = sf::Color(0, 0, 0, 255);\nsf::Color Color::Grey        = sf::Color(127, 127, 127, 255);\nsf::Color Color::Red         = sf::Color(255, 0, 0, 255);\nsf::Color Color::Green       = sf::Color(0, 255, 0, 255);\nsf::Color Color::Blue        = sf::Color(0, 0, 255, 255);\nsf::Color Color::Yellow      = sf::Color(255, 255, 0, 255);\nsf::Color Color::Magenta     = sf::Color(255, 0, 255, 255);\nsf::Color Color::Cyan        = sf::Color(0, 255, 255, 255);\nsf::Color Color::Transparent = sf::Color(0, 0, 0, 0);\n\nTexture::~Texture()\n{\n    if (m_SDLsurface != NULL)\n    {\n        SDL_FreeSurface(m_SDLsurface);\n        m_SDLsurface = NULL;\n    }\n    if (m_texture) SDL_DestroyTexture(m_texture);\n}\n\nbool Texture::loadSurface(const std::string& filePath, bool useWithVertices)\n{\n    m_filename = filePath;\n    m_SDLsurface = IMG_Load(m_filename.c_str());\n    if (m_SDLsurface != NULL)\n    {\n        m_size.x = m_SDLsurface->w;\n        m_size.y = m_SDLsurface->h;\n\n        if (useWithVertices)\n        {\n            m_texture = SDL_CreateTextureFromSurface(is::IS_ENGINE_SDL_renderer, m_SDLsurface);\n            if (!m_texture) {\n                throw std::runtime_error(\"Failed to create texture: \" + std::string(SDL_GetError()));\n            }\n        }\n    }\n    else\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Texture : %s\\n \\\"%s\\\"\", SDL_GetError(), m_filename.c_str());\n        return false;\n    }\n    return true;\n}\n\nFont::~Font()\n{\n    if (m_SDLfont != NULL)\n    {\n        TTF_CloseFont(m_SDLfont);\n        m_SDLfont = NULL;\n    }\n}\n\nbool Font::loadFont(const std::string& filename)\n{\n    m_filename = filename;\n    m_SDLfont = TTF_OpenFont(m_filename.c_str(), m_size);\n    if (m_SDLfont == NULL)\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Font : %s \\\"%s\\\"\\n\", TTF_GetError(), filename.c_str());\n        return false;\n    }\n    return true;\n}\n\nTransformable::Transformable()\n{\n    is::setVector2(m_size, 0.f, 0.f);\n    is::setVector2(m_scale, 1.f, 1.f);\n    is::setVector2(m_origin, 0.f, 0.f);\n}\n\nTransformable::Transformable(Texture &texture) :\n    m_texture(&(texture))\n{\n    is::setVector2(m_size, m_texture->getSize().x, m_texture->getSize().y);\n    is::setVector2(m_scale, 1.f, 1.f);\n    is::setVector2(m_origin, 0.f, 0.f);\n}\n\nvoid Transformable::setRotation(float angle)\n{\n    m_rotation = static_cast<float>(fmod(angle, 360));\n    if (m_rotation < 0)\n        m_rotation += 360.f;\n}\n\nvoid Transformable::setColor(int r, int g, int b, int a)\n{\n    m_color.r = r;\n    m_color.g = g;\n    m_color.b = b;\n    if (a >= 0 && a <= 255) m_color.a = a;\n\n}\n\nconst SDL_Color& Transformable::getSDLColor(bool getAlpha)\n{\n    m_SDLcolor.r = m_color.r;\n    m_SDLcolor.g = m_color.g;\n    m_SDLcolor.b = m_color.b;\n    m_SDLcolor.a = ((getAlpha) ? m_color.a : 0);\n    return m_SDLcolor;\n}\n\nSDLTexture::~SDLTexture()\n{\n    if (m_SDLtexture != NULL)\n    {\n        SDL_DestroyTexture(m_SDLtexture);\n        m_SDLtexture = NULL;\n    }\n    if (m_SDLoutlineTexture != NULL)\n    {\n        SDL_DestroyTexture(m_SDLoutlineTexture);\n        m_SDLoutlineTexture = NULL;\n    }\n}\n\nvoid SDLTexture::setTextureRect(IntRect rec)\n{\n    m_textureRec.left = rec.left;\n    m_textureRec.top = rec.top;\n    m_textureRec.width = rec.width;\n    m_textureRec.height = rec.height;\n    is::setVector2(m_size, m_textureRec.width, m_textureRec.height);\n}\n\nvoid Sprite::setTexture(sf::Texture& texture)\n{\n    m_texture = &texture;\n    setSDLTexture();\n}\n\nvoid Sprite::setSDLTexture()\n{\n    if (m_texture->getSDLSurface() != NULL)\n    {\n        if (m_SDLtexture != NULL)\n        {\n            SDL_DestroyTexture(m_SDLtexture);\n            m_SDLtexture = NULL;\n        }\n        m_SDLtexture = SDL_CreateTextureFromSurface(is::IS_ENGINE_SDL_renderer, m_texture->getSDLSurface());\n        setTextureRect({0, 0, (int)m_texture->getSize().x, (int)m_texture->getSize().y});\n    }\n}\n\nImage::~Image()\n{\n    if (m_texture != nullptr)\n    {\n        delete m_texture;\n        m_texture = nullptr;\n    }\n}\n\nbool Image::loadFromFile(const std::string& filename)\n{\n    if (m_texture != nullptr)\n    {\n        delete m_texture;\n        m_texture = nullptr;\n    }\n    m_texture = new Texture(filename);\n    if (m_texture == nullptr) return false;\n    if (m_texture->getSDLSurface() != NULL)\n    {\n        m_SDLtexture = SDL_CreateTextureFromSurface(is::IS_ENGINE_SDL_renderer, m_texture->getSDLSurface());\n        setSize(m_texture->getSize().x, m_texture->getSize().y);\n    }\n    return true;\n}\n\nconst Uint8* Image::getPixelsPtr() const\n{\n    int pitch;\n    void *pixels;\n    SDL_LockTexture(m_SDLtexture, NULL, &pixels, &pitch);\n    Uint8 *upixels = (Uint8*) pixels;\n    memcpy(pixels, upixels, (pitch / 4) * m_texture->getSize().y);\n    SDL_UnlockTexture(m_SDLtexture);\n    return upixels;\n}\n\nText::Text(sf::Font& font) :\n    SDLTexture()\n{\n    m_SDLTextureType = IS_ENGINE_SDL_TEXT;\n    m_font = &font;\n    m_characterSize = m_font->getSize();\n    m_style = m_font->m_SDLFontStyle;\n    m_outlineFont = m_font;\n}\n\nText::Text(sf::Font& font, const std::string& text) :\n    SDLTexture()\n{\n    m_SDLTextureType = IS_ENGINE_SDL_TEXT;\n    m_font = &font;\n    m_characterSize = m_font->getSize();\n    m_style = m_font->m_SDLFontStyle;\n    m_outlineFont = m_font;\n    setObjectText(text);\n}\n\nText::Text(sf::Font& font, const std::wstring& text):\n    SDLTexture()\n{\n    m_SDLTextureType = IS_ENGINE_SDL_TEXT;\n    m_font = &font;\n    m_characterSize = m_font->getSize();\n    m_style = m_font->m_SDLFontStyle;\n    m_outlineFont = m_font;\n    setObjectText(text);\n}\n\nText::~Text()\n{\n    if (m_SDLtexture != NULL)\n    {\n        SDL_DestroyTexture(m_SDLtexture);\n        m_SDLtexture = NULL;\n    }\n    if (m_SDLtext != nullptr)\n    {\n        delete m_SDLtext;\n        m_SDLtext = nullptr;\n    }\n}\n\nvoid Text::setFont(sf::Font &font)\n{\n    m_font = &font;\n    m_characterSize = m_font->getSize();\n    m_style = m_font->m_SDLFontStyle;\n    if (m_outlineFont == nullptr) m_outlineFont = m_font;\n    setSDLText();\n}\n\nvoid Text::setString(const std::wstring& text)\n{\n    setObjectText(text);\n}\n\nvoid Text::setString(const wchar_t& text)\n{\n    m_tempWstring = text;\n    setObjectText(m_tempWstring);\n}\n\nvoid Text::setString(const std::string& text)\n{\n    setObjectText(text);\n}\n\nvoid Text::setString(const char& text)\n{\n    m_tempString = text;\n    setObjectText(m_tempString);\n}\n\nvoid Text::setColor(int r, int g, int b, int a)\n{\n    if (a >= 0 && a <= 255) m_color.a = a;\n    if (m_color.r != r || m_color.g != g || m_color.b != b)\n    {\n        m_color.r = r;\n        m_color.g = g;\n        m_color.b = b;\n        setSDLText();\n    }\n}\n\nvoid Text::setOrigin(float x, float y)\n{\n    is::setVector2(m_origin, x, y);\n}\n\nvoid Text::setCharacterSize(int size)\n{\n    if (m_characterSize != size)\n    {\n        m_characterSize = size;\n        setSDLText();\n    }\n}\n\nvoid Text::setStyle(Uint32 style)\n{\n    if (m_style != style)\n    {\n        m_style = style;\n        setSDLText();\n    }\n}\n\nvoid Text::setOutlineColor(const Color& color)\n{\n    if (m_outlineColor.r != color.r || m_outlineColor.g != color.g || m_outlineColor.b != color.b ||\n        m_outlineColor.a != color.a)\n    {\n        m_outlineColor = color;\n        setSDLText();\n    }\n}\n\nvoid Text::setOutlineThickness(float thickness)\n{\n    if (m_outlineThickness != thickness)\n    {\n        m_outlineThickness = thickness;\n        setSDLText();\n    }\n}\n\nvoid Text::setObjectText(const std::string& text)\n{\n    if (text != m_string)\n    {\n        m_string = text;\n        if (m_SDLtext != nullptr)\n        {\n            delete m_SDLtext;\n            m_SDLtext = nullptr;\n        }\n        m_currentCharSize = text.length() + 1;\n        m_SDLtext = new char[m_currentCharSize];\n        strcpy(m_SDLtext, text.c_str());\n        m_SDLtext[m_currentCharSize - 1] = '\\0';\n        setSDLText();\n    }\n}\n\nvoid Text::setObjectText(const std::wstring& text)\n{\n    if (text != m_wstring)\n    {\n        m_wstring = text;\n        if (m_SDLtext != nullptr)\n        {\n            delete m_SDLtext;\n            m_SDLtext = nullptr;\n        }\n        m_currentCharSize = text.length() + 1;\n        m_SDLtext = new char[m_currentCharSize];\n        std::wcstombs(m_SDLtext, text.c_str(), text.size());\n        m_SDLtext[m_currentCharSize - 1] = L'\\0';\n        setSDLText();\n    }\n}\n\nbool Text::setSDLText()\n{\n    if (m_string == \"\" && m_wstring == L\"\") return false;\n\n    auto checkFontParam = [this](sf::Font *font, bool normalText)\n    {\n        if (m_characterSize != font->getSize() ||\n            m_style != font->m_SDLFontStyle ||\n            (!normalText && m_outlineThickness != font->m_SDLoutlineFontSize))\n        {\n            bool fontExists(false);\n            for (unsigned int _I(0); _I < is::IS_ENGINE_SDL_AUTO_GENERATE_FONT.size(); _I++)\n            {\n                if (is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[_I]->getFileName() == font->getFileName() &&\n                    is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[_I]->getSize() == m_characterSize &&\n                    is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[_I]->m_SDLFontStyle == m_style &&\n                    is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[_I]->m_SDLoutlineFontSize == m_outlineThickness)\n                {\n                    if (normalText) m_font = is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[_I];\n                    else m_outlineFont = is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[_I];\n                    fontExists = true;\n                    break;\n                }\n            }\n            if (!fontExists)\n            {\n                is::IS_ENGINE_SDL_AUTO_GENERATE_FONT.push_back(new Font(font->getFileName(), m_characterSize));\n                is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[is::IS_ENGINE_SDL_AUTO_GENERATE_FONT.size() - 1]->m_SDLFontStyle = m_style;\n                TTF_SetFontStyle(is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[is::IS_ENGINE_SDL_AUTO_GENERATE_FONT.size() - 1]->getSDLFont(), m_style);\n                if (!normalText)\n                {\n                    is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[is::IS_ENGINE_SDL_AUTO_GENERATE_FONT.size() - 1]->m_SDLoutlineFontSize = m_outlineThickness;\n                    TTF_SetFontOutline(is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[is::IS_ENGINE_SDL_AUTO_GENERATE_FONT.size() - 1]->getSDLFont(), m_outlineThickness);\n                    m_outlineFont = is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[is::IS_ENGINE_SDL_AUTO_GENERATE_FONT.size() - 1];\n                }\n                else m_font = is::IS_ENGINE_SDL_AUTO_GENERATE_FONT[is::IS_ENGINE_SDL_AUTO_GENERATE_FONT.size() - 1];\n            }\n        }\n    };\n    checkFontParam(m_font, true);\n    if (m_outlineThickness > 0.f) checkFontParam(m_outlineFont, false);\n\n    if (m_SDLtext == nullptr) return false;\n    m_multiLines = false;\n    short line(0), maxCaracter(0), caracter(0);\n    char currentStr[100];\n    char finalStr[100];\n    for (size_t i(0); i < strlen(m_SDLtext); i++)\n    {\n        if (m_SDLtext[i] != '\\n')\n        {\n            if (m_SDLtext[i] == '.') currentStr[caracter] = '-';\n            else if (m_SDLtext[i] == ' ' && m_SDLcontainMultiSpaces) currentStr[caracter] = '_';\n            else currentStr[caracter] = m_SDLtext[i];\n        }\n        caracter++;\n        if (m_SDLtext[i] == '\\n' || (i == strlen(m_SDLtext) - 1 && m_multiLines))\n        {\n            currentStr[caracter - 1] = '\\0';\n            if (caracter > maxCaracter)\n            {\n                strcpy(finalStr, currentStr);\n                maxCaracter = caracter;\n                m_multiLines = true;\n            }\n            caracter = 0;\n            line++;\n        }\n    }\n\n    int w(0), h(0);\n    if (line > 0)\n    {\n        if (TTF_SizeText((m_outlineThickness == 0) ? m_font->getSDLFont() : m_outlineFont->getSDLFont(), finalStr, &w, &h)) {/* allow to show error */}\n        w += ((m_characterSize > 30) ? 6 : 0) + m_SDLaddTextRecWSize;\n    }\n\n    auto createTexture = [this, &line, &w, &h](SDL_Surface *surface, bool normalText)\n    {\n        surface = NULL;\n        surface = TTF_RenderText_Blended_Wrapped((normalText) ? m_font->getSDLFont() : m_outlineFont->getSDLFont(),\n                                                      m_SDLtext,\n                                                      (normalText) ? getSDLColor(false) : getSDLOutlineColor(),\n                                                      ((line == 0) ? 1280 : w));\n        if (surface != NULL)\n        {\n            SDL_Texture *texture = NULL;\n            if (normalText)\n            {\n                if (m_SDLtexture != NULL)\n                {\n                    SDL_DestroyTexture(m_SDLtexture);\n                    m_SDLtexture = NULL;\n                }\n                m_SDLtexture = SDL_CreateTextureFromSurface(is::IS_ENGINE_SDL_renderer, surface);\n                texture = m_SDLtexture;\n            }\n            else\n            {\n                if (m_SDLoutlineTexture != NULL)\n                {\n                    SDL_DestroyTexture(m_SDLoutlineTexture);\n                    m_SDLoutlineTexture = NULL;\n                }\n                m_SDLoutlineTexture = SDL_CreateTextureFromSurface(is::IS_ENGINE_SDL_renderer, surface);\n                texture = m_SDLoutlineTexture;\n            }\n            if (texture != NULL)\n            {\n                if (normalText) setSize(surface->w, surface->h);\n                {\n                    m_SDLoutlineTextureRec.width = surface->w;\n                    m_SDLoutlineTextureRec.height = surface->h;\n                }\n                /*if (m_multiLines)\n                {\n                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,\n                        \"Text: w: %f h: %f \\n<%s> line: %d char: %d\\n\",\n                        m_size.x, m_size.y, finalStr, line, maxCaracter);\n                }*/\n                SDL_FreeSurface(surface);\n                surface = NULL;\n            }\n            else\n            {\n                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Texture Text (\\\"%s\\\") : %s\\n\", m_SDLtext, SDL_GetError());\n                return false;\n            }\n        }\n        else\n        {\n            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Surface Text (\\\"%s\\\") : %s\\n\", m_SDLtext, TTF_GetError());\n            return false;\n        }\n        return true;\n    };\n\n    bool createdSuccessfully = createTexture(m_SDLsurface, true);\n    if (m_outlineThickness > 0) createdSuccessfully = createTexture(m_SDLsurface, false);\n    return createdSuccessfully;\n}\n\nView::View()\n{\n    setSize(640.f, 480.f);\n    setCenter(320.f, 240.f);\n}\n\nView::View(const Vector2f& center, const Vector2f& size)\n{\n    setSize(size.x, size.y);\n    setCenter(center.x, center.y);\n}\n\nvoid View::setCenter(float x, float y)\n{\n    is::setVector2(m_center, x, y);\n}\n\nvoid View::setSize(float width, float height)\n{\n    is::setVector2(m_size, width, height);\n}\n\nconst Vector2f& View::getCenter() const noexcept\n{\n    return m_center;\n}\n\nvoid RectangleShape::draw(View const &view)\n{\n    SDL_Rect rec;\n    SDL_SetRenderDrawColor(is::IS_ENGINE_SDL_renderer, m_color.r, m_color.g, m_color.b, m_color.a);\n    rec.x = ((m_position.x - m_origin.x) - (view.getCenter().x - (view.getSize().x / 2.f))) * is::IS_ENGINE_SDL_screenXScale;\n    rec.y = ((m_position.y - m_origin.y) - (view.getCenter().y - (view.getSize().y / 2.f))) * is::IS_ENGINE_SDL_screenYScale;\n    rec.w = (m_size.x * std::abs(m_scale.x)) * is::IS_ENGINE_SDL_screenXScale;\n    rec.h = (m_size.y * std::abs(m_scale.y)) * is::IS_ENGINE_SDL_screenYScale;\n    SDL_RenderFillRect(is::IS_ENGINE_SDL_renderer, &rec);\n\n    if (m_outlineThickness > 0.f)\n    {\n        for (int i(0); i < static_cast<int>(m_outlineThickness); i++)\n        {\n            SDL_Rect recOutline;\n            SDL_SetRenderDrawColor(is::IS_ENGINE_SDL_renderer, m_outlineColor.r, m_outlineColor.g, m_outlineColor.b, m_outlineColor.a);\n            recOutline.x = rec.x + i;\n            recOutline.y = rec.y + i;\n            recOutline.w = rec.w - i * 2;\n            recOutline.h = rec.h - i * 2;\n            SDL_RenderDrawRect(is::IS_ENGINE_SDL_renderer, &recOutline);\n        }\n    }\n}\n\nvoid CircleShape::draw(View const &view)\n{\n    auto drawCircle = [this, &view](sf::Color const &color, int size)\n    {\n        SDL_SetRenderDrawColor(is::IS_ENGINE_SDL_renderer, color.r, color.g, color.b, color.a);\n        for (int w = 0; w < size * 2; w++)\n        {\n            for (int h = 0; h < size * 2; h++)\n            {\n                int dx = size - w; // horizontal offset\n                int dy = size - h; // vertical offset\n                if ((dx * dx + dy * dy) <= (size * size))\n                {\n                    SDL_RenderDrawPoint(is::IS_ENGINE_SDL_renderer,\n                                        ((m_position.x - m_origin.x) - (view.getCenter().x - (view.getSize().x / 2.f))) * is::IS_ENGINE_SDL_screenXScale + dx,\n                                        ((m_position.y - m_origin.y) - (view.getCenter().y - (view.getSize().y / 2.f))) * is::IS_ENGINE_SDL_screenYScale + dy);\n                }\n            }\n        }\n    };\n    if (m_outlineThickness > 0.f) drawCircle(m_outlineColor, m_size.x);\n    drawCircle(m_color, m_size.x - static_cast<int>(m_outlineThickness));\n}\n\nbool Keyboard::isKeyPressed(Key key)\n{\n    const Uint8 *state = SDL_GetKeyboardState(NULL);\n\n    // These keys have the same ID\n    if (key == Return) key = Enter;\n    if (key == Numpad0) key = Num0;\n    if (key == Numpad1) key = Num1;\n    if (key == Numpad2) key = Num2;\n    if (key == Numpad3) key = Num3;\n    if (key == Numpad4) key = Num4;\n    if (key == Numpad5) key = Num5;\n    if (key == Numpad6) key = Num6;\n    if (key == Numpad7) key = Num7;\n    if (key == Numpad8) key = Num8;\n    if (key == Numpad9) key = Num9;\n    if (key == Numpad9) key = Num9;\n    if (key == BackSpace) key = Backspace;\n    if (key == BackSlash) key = Backslash;\n    if (key == SemiColon) key = Semicolon;\n\n    switch (key)\n    {\n    case A: if(state[SDL_SCANCODE_A]) return true; break;\n    case B: if(state[SDL_SCANCODE_B]) return true; break;\n    case C: if(state[SDL_SCANCODE_C]) return true; break;\n    case D: if(state[SDL_SCANCODE_D]) return true; break;\n    case E: if(state[SDL_SCANCODE_E]) return true; break;\n    case F: if(state[SDL_SCANCODE_F]) return true; break;\n    case G: if(state[SDL_SCANCODE_G]) return true; break;\n    case H: if(state[SDL_SCANCODE_H]) return true; break;\n    case I: if(state[SDL_SCANCODE_I]) return true; break;\n    case J: if(state[SDL_SCANCODE_J]) return true; break;\n    case K: if(state[SDL_SCANCODE_K]) return true; break;\n    case L: if(state[SDL_SCANCODE_L]) return true; break;\n    case M: if(state[SDL_SCANCODE_M]) return true; break;\n    case N: if(state[SDL_SCANCODE_N]) return true; break;\n    case O: if(state[SDL_SCANCODE_O]) return true; break;\n    case P: if(state[SDL_SCANCODE_P]) return true; break;\n    case Q: if(state[SDL_SCANCODE_Q]) return true; break;\n    case R: if(state[SDL_SCANCODE_R]) return true; break;\n    case S: if(state[SDL_SCANCODE_S]) return true; break;\n    case T: if(state[SDL_SCANCODE_T]) return true; break;\n    case U: if(state[SDL_SCANCODE_U]) return true; break;\n    case V: if(state[SDL_SCANCODE_V]) return true; break;\n    case W: if(state[SDL_SCANCODE_W]) return true; break;\n    case X: if(state[SDL_SCANCODE_X]) return true; break;\n    case Y: if(state[SDL_SCANCODE_Y]) return true; break;\n    case Z: if(state[SDL_SCANCODE_Z]) return true; break;\n    case Num0: if(state[SDL_SCANCODE_0]) return true; break;\n    case Num1: if(state[SDL_SCANCODE_1]) return true; break;\n    case Num2: if(state[SDL_SCANCODE_2]) return true; break;\n    case Num3: if(state[SDL_SCANCODE_3]) return true; break;\n    case Num4: if(state[SDL_SCANCODE_4]) return true; break;\n    case Num5: if(state[SDL_SCANCODE_5]) return true; break;\n    case Num6: if(state[SDL_SCANCODE_6]) return true; break;\n    case Num7: if(state[SDL_SCANCODE_7]) return true; break;\n    case Num8: if(state[SDL_SCANCODE_8]) return true; break;\n    case Num9: if(state[SDL_SCANCODE_9]) return true; break;\n    case Escape: if(state[SDL_SCANCODE_ESCAPE]) return true; break;\n    case LControl: if(state[SDL_SCANCODE_LCTRL]) return true; break;\n    case LShift: if(state[SDL_SCANCODE_LSHIFT]) return true; break;\n    case LAlt: if(state[SDL_SCANCODE_LALT]) return true; break;\n    //case LSystem: if(state[SDL_SCANCODE_LEFT_SUPER]) return true; break;\n    case RControl: if(state[SDL_SCANCODE_RCTRL]) return true; break;\n    case RShift: if(state[SDL_SCANCODE_RSHIFT]) return true; break;\n    case RAlt: if(state[SDL_SCANCODE_RALT]) return true; break;\n    //case RSystem: if(state[SDL_SCANCODE_RIGHT_SUPER]) return true; break;\n    case Menu: if(state[SDL_SCANCODE_MENU]) return true; break;\n    case LBracket: if(state[SDL_SCANCODE_LEFTBRACKET]) return true; break;\n    case RBracket: if(state[SDL_SCANCODE_RIGHTBRACKET]) return true; break;\n    case Semicolon: if(state[SDL_SCANCODE_SEMICOLON]) return true; break;\n    case Comma: if(state[SDL_SCANCODE_COMMA]) return true; break;\n    case Period: if(state[SDL_SCANCODE_PERIOD]) return true; break;\n    case Slash: if(state[SDL_SCANCODE_SLASH]) return true; break;\n    case Backslash: if(state[SDL_SCANCODE_BACKSLASH]) return true; break;\n    case Equal: if(state[SDL_SCANCODE_EQUALS]) return true; break;\n    case Space: if(state[SDL_SCANCODE_SPACE]) return true; break;\n    case Enter:\n    // case Return: same value as Enter\n        if(state[SDL_SCANCODE_RETURN]) return true;\n    break;\n    case Backspace: if(state[SDL_SCANCODE_BACKSPACE]) return true; break;\n    case Tab: if(state[SDL_SCANCODE_TAB]) return true; break;\n    case PageUp: if(state[SDL_SCANCODE_PAGEUP]) return true; break;\n    case PageDown: if(state[SDL_SCANCODE_PAGEDOWN]) return true; break;\n    case End: if(state[SDL_SCANCODE_END]) return true; break;\n    case Home: if(state[SDL_SCANCODE_HOME]) return true; break;\n    case Insert: if(state[SDL_SCANCODE_INSERT]) return true; break;\n    case Delete: if(state[SDL_SCANCODE_DELETE]) return true; break;\n    //case Add: if(state[SDL_SCANCODE_KP_ADD]) return true; break;\n    //case Subtract: if(state[SDL_SCANCODE_KP_SUBTRACT]) return true; break;\n    case Multiply: if(state[SDL_SCANCODE_KP_MULTIPLY]) return true; break;\n    case Divide: if(state[SDL_SCANCODE_KP_DIVIDE]) return true; break;\n    case Left: if(state[SDL_SCANCODE_LEFT]) return true; break;\n    case Right: if(state[SDL_SCANCODE_RIGHT]) return true; break;\n    case Up: if(state[SDL_SCANCODE_UP]) return true; break;\n    case Down: if(state[SDL_SCANCODE_DOWN]) return true; break;\n    /*\n    case Numpad0: if(state[SDL_SCANCODE_0]) return true; break;\n    case Numpad1: if(state[SDL_SCANCODE_1]) return true; break;\n    case Numpad2: if(state[SDL_SCANCODE_2]) return true; break;\n    case Numpad3: if(state[SDL_SCANCODE_3]) return true; break;\n    case Numpad4: if(state[SDL_SCANCODE_4]) return true; break;\n    case Numpad5: if(state[SDL_SCANCODE_5]) return true; break;\n    case Numpad6: if(state[SDL_SCANCODE_6]) return true; break;\n    case Numpad7: if(state[SDL_SCANCODE_7]) return true; break;\n    case Numpad8: if(state[SDL_SCANCODE_8]) return true; break;\n    case Numpad9: if(state[SDL_SCANCODE_9]) return true; break;\n    */\n    case F1: if(state[SDL_SCANCODE_F1]) return true; break;\n    case F2: if(state[SDL_SCANCODE_F2]) return true; break;\n    case F3: if(state[SDL_SCANCODE_F3]) return true; break;\n    case F4: if(state[SDL_SCANCODE_F4]) return true; break;\n    case F5: if(state[SDL_SCANCODE_F5]) return true; break;\n    case F6: if(state[SDL_SCANCODE_F6]) return true; break;\n    case F7: if(state[SDL_SCANCODE_F7]) return true; break;\n    case F8: if(state[SDL_SCANCODE_F8]) return true; break;\n    case F9: if(state[SDL_SCANCODE_F9]) return true; break;\n    case F10: if(state[SDL_SCANCODE_F10]) return true; break;\n    case F11: if(state[SDL_SCANCODE_F11]) return true; break;\n    case F12: if(state[SDL_SCANCODE_F12]) return true; break;\n    case F13: if(state[SDL_SCANCODE_F13]) return true; break;\n    case F14: if(state[SDL_SCANCODE_F14]) return true; break;\n    case F15: if(state[SDL_SCANCODE_F15]) return true; break;\n    case Pause: if(state[SDL_SCANCODE_PAUSE]) return true; break;\n    /*\n    case BackSpace: if(state[SDL_SCANCODE_BACKSPACE]) return true; break;\n    case BackSlash: if(state[SDL_SCANCODE_BACKSLASH]) return true; break;\n    case SemiColon: if(state[SDL_SCANCODE_SEMICOLON]) return true; break;\n    */\n    default: return false; break;\n    }\n    return false;\n}\n\nVideoMode VideoMode::getDesktopMode()\n{\n    VideoMode videoMode;\n    videoMode.width = is::IS_ENGINE_SDL_displayMode.w;\n    videoMode.height = is::IS_ENGINE_SDL_displayMode.h;\n    return videoMode;\n}\n\nRenderWindow::~RenderWindow()\n{\n    if (m_SDLiconSurface != NULL)\n    {\n        SDL_FreeSurface(m_SDLiconSurface);\n        m_SDLiconSurface = NULL;\n    }\n}\n\nvoid RenderWindow::create(VideoMode videoMode, const std::string& title, int style)\n{\n    is::setVector2(m_size, videoMode.width, videoMode.height);\n    m_view.setSize(videoMode.width, videoMode.height);\n    m_title = title;\n    m_style = style;\n\n    int w, h;\n#if (defined(__ANDROID__))\n    w = is::IS_ENGINE_SDL_displayMode.w;\n    h = is::IS_ENGINE_SDL_displayMode.h;\n#else\n    SDL_GetWindowSize(is::IS_ENGINE_SDL_window, &w, &h);\n#endif\n\n    if (SDL_Init(SDL_INIT_VIDEO\n#if defined(__SWITCH__)\n                 | SDL_INIT_GAMECONTROLLER\n#endif\n                 ) < 0)\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"init SDL Video : %s\\n\", SDL_GetError());\n        is::closeApplication();\n    }\n\n    // Allows to calculate the scale of the screen\n    is::IS_ENGINE_SDL_screenXScale = w / m_view.getSize().x;\n    is::IS_ENGINE_SDL_screenYScale = h / m_view.getSize().y;\n\n    is::IS_ENGINE_SDL_window = SDL_CreateWindow(m_title.c_str(),\n#if !defined(__ANDROID__)\n            SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, m_size.x, m_size.y, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL\n#else\n             SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, m_size.x, m_size.y, SDL_WINDOW_OPENGL\n#endif\n            );\n    is::IS_ENGINE_SDL_renderer = SDL_CreateRenderer(is::IS_ENGINE_SDL_window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);\n#if defined(__SWITCH__)\n    if (SDL_NumJoysticks() > 0 && SDL_IsGameController(0)) {\n        is::IS_ENGINE_SDL_controller = SDL_GameControllerOpen(0);\n    }\n#endif\n    if (!is::SDL2initLib()) is::closeApplication();\n}\n\nvoid RenderWindow::setFramerateLimit(int fps)\n{\n    // m_windowFrameLimit = 1000 / fps;\n    m_windowFrameLimit = (fps * 50) / 60;\n}\n\nvoid RenderWindow::setSize(const Vector2u& size)\n{\n    is::setVector2(m_size, size.x, size.y);\n    SDL_SetWindowSize(is::IS_ENGINE_SDL_window, size.x, size.y);\n}\n\nvoid RenderWindow::setTitle(const std::string& text)\n{\n    m_title = text;\n    SDL_SetWindowTitle(is::IS_ENGINE_SDL_window, m_title.c_str());\n}\n\nvoid RenderWindow::setView(const View& view)\n{\n    m_view = view;\n\n    // When we change the size of the view we recalculate the scale of the screen\n    int w, h;\n#if (defined(__ANDROID__))\n    w = is::IS_ENGINE_SDL_displayMode.w;\n    h = is::IS_ENGINE_SDL_displayMode.h;\n#else\n    SDL_GetWindowSize(is::IS_ENGINE_SDL_window, &w, &h);\n#endif\n\n    is::IS_ENGINE_SDL_screenXScale = w / m_view.getSize().x;\n    is::IS_ENGINE_SDL_screenYScale = h / m_view.getSize().y;\n}\n\nvoid RenderWindow::setPosition(Vector2i position)\n{\n    SDL_SetWindowPosition(is::IS_ENGINE_SDL_window, position.x, position.y);\n}\n\nvoid RenderWindow::setPosition(int x, int y)\n{\n    SDL_SetWindowPosition(is::IS_ENGINE_SDL_window, x, y);\n}\n\nvoid RenderWindow::setVerticalSyncEnabled(bool vsync)\n{\n    SDL_GL_SetSwapInterval(vsync);\n}\n\nvoid RenderWindow::setIcon(Uint32 width, Uint32 height, const Uint8* pixels)\n{\n    // This part is automatically managed when we define the icon in the \"resource.rc\" file\n}\n\nvoid RenderWindow::clear(sf::Color const &color)\n{\n    SDL_SetRenderDrawColor(is::IS_ENGINE_SDL_renderer, color.r, color.g, color.b, color.a);\n    SDL_RenderClear(is::IS_ENGINE_SDL_renderer);\n}\n\nvoid RenderWindow::draw(SDLTexture &obj)\n{\n    if (obj.getSDLTexture() == NULL) return;\n\n    SDL_Rect rec;\n    SDL_Rect recSrc;\n    SDL_Point point;\n\n    // We keep the value of the origin x and y of the object to be drawn.\n    // This allows to keep the value of the original variables intact during recalculations.\n    float objOriginX((obj.getScale().x < 0.f /*&& static_cast<int>(obj.getOrigin().y) == 0*/ &&\n                      static_cast<int>(obj.getOrigin().x) == 0) ? obj.getTextureRect().width : obj.getOrigin().x);\n    float objOriginY((obj.getScale().y < 0.f /*&& static_cast<int>(obj.getOrigin().x) == 0*/ &&\n                      static_cast<int>(obj.getOrigin().y) == 0) ? obj.getTextureRect().height : obj.getOrigin().y);\n    float xOrigin(objOriginX);\n    float yOrigin(objOriginY);\n\n    // Image angle\n    float rotation(obj.getRotation());\n\n    // Use to stretch the image of the object to make a scale effect\n    rec.w = obj.getTextureRect().width * std::abs(obj.getScale().x);\n    rec.h = obj.getTextureRect().height * std::abs(obj.getScale().y);\n\n    // Each time the image is scale, the origin of the object is recalculated\n    if (std::abs(obj.getScale().x) > 1.001f || std::abs(obj.getScale().x) < 0.999f)\n        xOrigin = rec.w / (obj.getTextureRect().width / objOriginX);\n    if (std::abs(obj.getScale().y) > 1.001f || std::abs(obj.getScale().y) < 0.999f)\n        yOrigin = rec.h / (obj.getTextureRect().height / objOriginY);\n\n    // We do a corresponding flip according to the sign of the variables x scale and y scale\n    if (obj.getScale().x < 0.f && obj.getScale().y < 0.f)\n    {\n        obj.m_SDLFlip = (SDL_RendererFlip)(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL);\n        if (static_cast<int>(obj.getOrigin().x) != static_cast<int>(obj.getTextureRect().width / 2) &&\n            static_cast<int>(obj.getOrigin().x) != 0)\n            xOrigin += obj.getTextureRect().width;\n        if (static_cast<int>(obj.getOrigin().y) != static_cast<int>(obj.getTextureRect().height / 2) &&\n            static_cast<int>(obj.getOrigin().y) != 0)\n            yOrigin -= obj.getTextureRect().height;\n    }\n    else if (obj.getScale().x < 0.f)\n    {\n        obj.m_SDLFlip = SDL_FLIP_HORIZONTAL;\n        if (static_cast<int>(obj.getOrigin().x) != static_cast<int>(obj.getTextureRect().width / 2) &&\n            static_cast<int>(obj.getOrigin().x) != 0) xOrigin += obj.getTextureRect().width;\n    }\n    else if (obj.getScale().y < 0.f)\n    {\n        obj.m_SDLFlip = SDL_FLIP_VERTICAL;\n        if (static_cast<int>(obj.getOrigin().y) != static_cast<int>(obj.getTextureRect().height / 2) &&\n            static_cast<int>(obj.getOrigin().y) != 0)\n            yOrigin -= obj.getTextureRect().height;\n    }\n    else obj.m_SDLFlip = SDL_FLIP_NONE;\n\n    // Move the object according to the position of the camera\n    rec.x = (obj.getPosition().x - xOrigin) - (m_view.getCenter().x - (m_view.getSize().x / 2.f));\n    rec.y = (obj.getPosition().y - yOrigin) - (m_view.getCenter().y - (m_view.getSize().y / 2.f));\n\n    // We apply the scale of the screen to the object in order to resize it in relation to the screen\n    rec.x *= is::IS_ENGINE_SDL_screenXScale;\n    rec.y *= is::IS_ENGINE_SDL_screenYScale;\n    rec.w *= is::IS_ENGINE_SDL_screenXScale;\n    rec.h *= is::IS_ENGINE_SDL_screenYScale;\n    recSrc.x = obj.getTextureRect().left;\n    recSrc.y = obj.getTextureRect().top;\n    recSrc.w = obj.getTextureRect().width;\n    recSrc.h = obj.getTextureRect().height;\n    point.x = xOrigin * is::IS_ENGINE_SDL_screenXScale;\n    point.y = yOrigin * is::IS_ENGINE_SDL_screenYScale;\n\n    if (obj.getTextureRect().width == obj.getTextureRect().height && rec.w != rec.h &&\n        obj.m_circleShape && std::abs(obj.getRotation()) > 0 &&\n        std::abs(obj.getScale().x) == std::abs(obj.getScale().y))\n    {\n        auto redimImg = [this](int &destSize, int &destPos, int &destOrigin, float &origin,\n                               const int &srcSize, const int &size, const float &objOrigin)\n        {\n            destPos += (destSize - srcSize) / 2;\n            destSize = srcSize;\n            if (std::abs(objOrigin) > 0.f) origin = destSize / (size / objOrigin);\n            destOrigin = origin;\n        };\n        if (rec.w > rec.h) redimImg(rec.w, rec.x, point.x, xOrigin,\n                                    rec.h, obj.getTextureRect().width, objOriginX);\n        else redimImg(rec.h, rec.y, point.y, yOrigin,\n                      rec.w, obj.getTextureRect().height, objOriginY);\n    }\n\n    if (obj.m_SDLTextureType == SDLTexture::SDLTextureType::IS_ENGINE_SDL_TEXT)\n    {\n        if (obj.getSDLOutlineTexture() != NULL)\n        {\n            SDL_SetTextureBlendMode(obj.getSDLOutlineTexture(), SDL_BLENDMODE_BLEND);\n            SDL_SetTextureAlphaMod(obj.getSDLOutlineTexture(), obj.getColor().a);\n\n            SDL_Rect SDLoutlineTextureRec, outlineTextureRecSrc;\n            SDLoutlineTextureRec.x = rec.x;\n            SDLoutlineTextureRec.y = rec.y;\n            SDLoutlineTextureRec.w = obj.m_SDLoutlineTextureRec.width * std::abs(obj.getScale().x);\n            SDLoutlineTextureRec.h = obj.m_SDLoutlineTextureRec.height * std::abs(obj.getScale().y);\n            SDLoutlineTextureRec.w *= is::IS_ENGINE_SDL_screenXScale;\n            SDLoutlineTextureRec.h *= is::IS_ENGINE_SDL_screenYScale;\n\n            outlineTextureRecSrc.x = obj.getTextureRect().left;\n            outlineTextureRecSrc.y = obj.getTextureRect().top;\n            outlineTextureRecSrc.w = obj.m_SDLoutlineTextureRec.width;\n            outlineTextureRecSrc.h = obj.m_SDLoutlineTextureRec.height;\n\n            SDL_RenderCopyEx(is::IS_ENGINE_SDL_renderer, obj.getSDLOutlineTexture(),\n                             &outlineTextureRecSrc, &SDLoutlineTextureRec, rotation, &point, obj.m_SDLFlip);\n        }\n    }\n    SDL_SetTextureBlendMode(obj.getSDLTexture(), SDL_BLENDMODE_BLEND);\n    SDL_SetTextureAlphaMod(obj.getSDLTexture(), obj.getColor().a);\n    SDL_SetTextureColorMod(obj.getSDLTexture(), obj.getColor().r, obj.getColor().g, obj.getColor().b);\n    SDL_RenderCopyEx(is::IS_ENGINE_SDL_renderer, obj.getSDLTexture(), &recSrc, &rec, rotation, &point, obj.m_SDLFlip);\n}\n\nvoid RenderWindow::display()\n{\n    SDL_RenderPresent(is::IS_ENGINE_SDL_renderer);\n    SDL_UpdateWindowSurface(is::IS_ENGINE_SDL_window);\n    if (m_windowFrameLimit != 0)\n    {\n        Uint64 diff = std::chrono::duration_cast<std::chrono::milliseconds>(\n                std::chrono::steady_clock::now() - m_timeSinceLastDisplay).count();\n\n        if (diff < 1000 / m_windowFrameLimit)\n        {\n            SDL_Delay(static_cast<Uint32>(1000 / m_windowFrameLimit - diff));\n        }\n    }\n    m_timeSinceLastDisplay = std::chrono::steady_clock::now();\n}\n\nbool RenderWindow::pollEvent(Event &event)\n{\n    int pollEvenValue = SDL_PollEvent(&event.m_event);\n    event.type = event.m_event.type;\n    event.key.code = event.m_event.key.keysym.sym;\n    if (event.type == sf::Event::MouseButtonPressed || event.type == sf::Event::MouseButtonReleased)\n    {\n        switch(event.m_event.button.button)\n        {\n        case SDL_BUTTON_LEFT: event.key.code = sf::Mouse::Left; break;\n        case SDL_BUTTON_RIGHT: event.key.code = sf::Mouse::Right; break;\n        case SDL_BUTTON_MIDDLE: event.key.code = sf::Mouse::Middle; break;\n        case SDL_BUTTON_X1: event.key.code = sf::Mouse::XButton1; break;\n        case SDL_BUTTON_X2: event.key.code = sf::Mouse::XButton2; break;\n        }\n    }\n    if (event.type == sf::Event::MouseWheelMoved)\n    {\n        if (event.m_event.wheel.y > 0) // scroll up\n        {\n             event.mouseWheel.delta++;\n        }\n        else if (event.m_event.wheel.y < 0) // scroll down\n        {\n             event.mouseWheel.delta--;\n        }\n    }\n\n#ifdef __SWITCH__\n    is::updateButtonState();\n#endif\n\nif (is::IS_ENGINE_MOBILE_OS)\n{\n    if (pollEvenValue == 1)\n    {\n        m_tempScreenXScale = is::IS_ENGINE_SDL_screenXScale;\n        m_tempScreenYScale = is::IS_ENGINE_SDL_screenYScale;\n#if (defined(IS_ENGINE_HTML_5) || defined(__SWITCH__))\n        if (is::IS_ENGINE_MOBILE_OS)\n        {\n            m_tempScreenXScale = is::IS_ENGINE_SDL_displayMode.w / m_view.getSize().x;\n            m_tempScreenYScale = is::IS_ENGINE_SDL_displayMode.h / m_view.getSize().y;\n        }\n#endif\n        switch (event.m_event.type)\n        {\n            case SDL_FINGERDOWN:\n            {\n                if (is::IS_ENGINE_SDL_touchIdCount < is::IS_ENGINE_SDL_TOUCH_ID_COUNT_MAX)\n                {\n                    int tempTouchId = is::IS_ENGINE_SDL_touchIdCount;\n                    if (is::IS_ENGINE_SDL_touchData[1].m_SDLtouchDown && !is::IS_ENGINE_SDL_touchData[0].m_SDLtouchDown) tempTouchId = 0;\n                    is::IS_ENGINE_SDL_touchData[tempTouchId].m_SDLtouchX = (event.m_event.tfinger.x * is::IS_ENGINE_SDL_displayMode.w) / m_tempScreenXScale;\n                    is::IS_ENGINE_SDL_touchData[tempTouchId].m_SDLtouchY = (event.m_event.tfinger.y * is::IS_ENGINE_SDL_displayMode.h) / m_tempScreenYScale;\n                    is::IS_ENGINE_SDL_touchData[tempTouchId].m_SDLtouchDown = true;\n                    is::IS_ENGINE_SDL_touchIdCount++;\n                    if (is::IS_ENGINE_SDL_touchIdCount == 2) is::IS_ENGINE_SDL_touchIdLast = tempTouchId;\n                }\n            }\n            break;\n\n            case SDL_FINGERMOTION:\n            {\n                if (is::IS_ENGINE_SDL_enableFINGERMOTION)\n                {\n                    if (is::IS_ENGINE_SDL_touchIdCount == 1)\n                    {\n                        int tempTouchId = 0;\n                        if (is::IS_ENGINE_SDL_touchData[1].m_SDLtouchDown && !is::IS_ENGINE_SDL_touchData[0].m_SDLtouchDown) tempTouchId = 1;\n                        is::IS_ENGINE_SDL_touchData[tempTouchId].m_SDLtouchX = (event.m_event.tfinger.x * is::IS_ENGINE_SDL_displayMode.w) / m_tempScreenXScale;\n                        is::IS_ENGINE_SDL_touchData[tempTouchId].m_SDLtouchY = (event.m_event.tfinger.y * is::IS_ENGINE_SDL_displayMode.h) / m_tempScreenYScale;\n                    }\n                    if (is::IS_ENGINE_SDL_touchIdCount == 2)\n                    {\n                        is::IS_ENGINE_SDL_touchData[is::IS_ENGINE_SDL_touchIdLast].m_SDLtouchX = (event.m_event.tfinger.x * is::IS_ENGINE_SDL_displayMode.w) / m_tempScreenXScale;\n                        is::IS_ENGINE_SDL_touchData[is::IS_ENGINE_SDL_touchIdLast].m_SDLtouchY = (event.m_event.tfinger.y * is::IS_ENGINE_SDL_displayMode.h) / m_tempScreenYScale;\n                    }\n                }\n            }\n            break;\n\n            case SDL_FINGERUP:\n            {\n                if (is::IS_ENGINE_SDL_touchIdCount > 0)\n                {\n                    int releaseTouchX = (event.m_event.tfinger.x * is::IS_ENGINE_SDL_displayMode.w) / m_tempScreenXScale;\n                    int releaseTouchY = (event.m_event.tfinger.y * is::IS_ENGINE_SDL_displayMode.h) / m_tempScreenYScale;\n\n                    int nearTouchId = 0;\n                    if (is::IS_ENGINE_SDL_touchIdCount == 2)\n                    {\n                        float disTouch0 = is::pointDistance(releaseTouchX, releaseTouchY, is::IS_ENGINE_SDL_touchData[0].m_SDLtouchX, is::IS_ENGINE_SDL_touchData[0].m_SDLtouchY);\n                        float disTouch1 = is::pointDistance(releaseTouchX, releaseTouchY, is::IS_ENGINE_SDL_touchData[1].m_SDLtouchX, is::IS_ENGINE_SDL_touchData[1].m_SDLtouchY);\n                        nearTouchId = ((disTouch0 > disTouch1) ? 1 : 0);\n                    }\n                    else if (is::IS_ENGINE_SDL_touchData[1].m_SDLtouchDown) nearTouchId = 1;\n\n                    is::IS_ENGINE_SDL_touchData[nearTouchId].m_SDLtouchX = 0;\n                    is::IS_ENGINE_SDL_touchData[nearTouchId].m_SDLtouchY = 0;\n                    is::IS_ENGINE_SDL_touchData[nearTouchId].m_SDLtouchDown = false;\n                    is::IS_ENGINE_SDL_touchIdCount--;\n                }\n            }\n            break;\n            case SDL_WINDOWEVENT_RESIZED:\n                event.size.width = event.m_event.window.data1;\n                event.size.height = event.m_event.window.data2;\n            break;\n        }\n    }\n}\n    if (event.type == 0 || event.type == 512 || event.type == 1024)\n        event.type = ((SDL_GetWindowFlags(is::IS_ENGINE_SDL_window) & SDL_WINDOW_INPUT_FOCUS) ? -1 : -2);\n    return ((pollEvenValue == 1) ? true : false);\n}\n\nbool RenderWindow::waitEvent(Event &event)\n{\n    while (!pollEvent(event)) continue;\n    return true;\n}\n\nVector2i RenderWindow::getPosition() const\n{\n    int x = 0, y = 0;\n    SDL_GetWindowPosition(is::IS_ENGINE_SDL_window, &x, &y);\n    return Vector2i(x, y);\n}\n\nVector2f RenderWindow::mapPixelToCoords(const Vector2i& point, const View& view) const\n{\n    Vector2f pos{static_cast<float>((point.x\n#if (!defined(__ANDROID__))\n            / is::IS_ENGINE_SDL_screenXScale\n#endif\n            ) + (view.getCenter().x - (view.getSize().x / 2.f))),\n            static_cast<float>((point.y\n#if (!defined(__ANDROID__))\n            / is::IS_ENGINE_SDL_screenYScale\n#endif\n            ) + (view.getCenter().y - (view.getSize().y / 2.f)))};\n    return pos;\n}\n\nvoid SoundBuffer::setChannelId()\n{\n    m_channel = SDL_sndChannel++;\n    for (int i(0); i < is::IS_ENGINE_SDL_CHANNEL_MAX; i++)\n    {\n        if (is::IS_ENGINE_SDL_channel[i] == m_channel)\n        {\n            m_channel = 0;\n            break;\n        }\n    }\n    for (int i(0); i < is::IS_ENGINE_SDL_CHANNEL_MAX; i++)\n    {\n        if (is::IS_ENGINE_SDL_channel[i] == m_channel) m_channel++; else break;\n    }\n    is::IS_ENGINE_SDL_channel[m_channel] = m_channel;\n}\n\nSoundBuffer::SoundBuffer()\n{\n    setChannelId();\n}\n\nSoundBuffer::SoundBuffer(const std::string filename):\n    m_filename(filename)\n{\n    setChannelId();\n    loadSound(m_filename);\n}\n\nSoundBuffer::~SoundBuffer()\n{\n    SDL_sndChannel--;\n    is::IS_ENGINE_SDL_channel[m_channel] = -1;\n    Mix_FreeChunk(m_SDLsound);\n    m_SDLsound = NULL;\n}\n\nbool SoundBuffer::loadSound(const std::string& filePath)\n{\n    m_SDLsound = Mix_LoadWAV(filePath.c_str());\n    if (m_SDLsound == NULL)\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Can't load SoundBuffer : %s \\\"%s\\\"\\n\", Mix_GetError(), filePath.c_str());\n        return false;\n    }\n    return true;\n}\n\nSound::Status Sound::getStatus()\n{\n    if (m_status != Status::Paused)\n    {\n        if (Mix_Playing(m_SDLsoundBuffer->getSDLChannel()) == 0) m_status = Stopped;\n    }\n    return m_status;\n}\n\nvoid Sound::play()\n{\n    if (m_status != Status::Paused)\n    {\n        Mix_PlayChannel(m_SDLsoundBuffer->getSDLChannel(), m_SDLsoundBuffer->getSDLChunk(), ((m_loop) ? -1 : 0));\n    }\n    else\n    {\n        Mix_Resume(m_SDLsoundBuffer->getSDLChannel());\n    }\n    m_status = Status::Playing;\n}\n\nvoid Sound::setPitch(float speed)\n{\n    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"This function is not yet implemented!\");\n}\n\nvoid Sound::setVolume(float volume)\n{\n    if (static_cast<int>(volume) >= 0 && static_cast<int>(volume) <= 100) Mix_VolumeChunk(m_SDLsoundBuffer->getSDLChunk(), volume * MIX_MAX_VOLUME / 100);\n}\n\nMusic::Music() :\n#if !defined(__ANDROID__)\n    SoundSource()\n{\n    Mix_VolumeMusic(MIX_MAX_VOLUME);\n#else\n    Sound()\n{\n#endif\n}\n\nMusic::~Music()\n{\n#if defined(__ANDROID__)\n    if (m_SDLsoundBuffer != nullptr)\n    {\n        delete m_SDLsoundBuffer;\n        m_SDLsoundBuffer = nullptr;\n    }\n#else\n    Mix_FreeMusic(m_music);\n    m_music = NULL;\n#endif\n}\n\nMusic::Status Music::getStatus()\n{\n    if (m_status != Status::Paused)\n    {\n#if !defined(__ANDROID__)\n        if (Mix_PlayingMusic() == 0) m_status = Stopped;\n#else\n        if (Mix_Playing(m_SDLsoundBuffer->getSDLChannel()) == 0) m_status = Stopped;\n#endif\n    }\n    return m_status;\n}\n\n#if !defined(__ANDROID__)\nvoid Music::play()\n{\n    if (m_status != Status::Paused)\n    {\n        Mix_PlayMusic(m_music, ((m_loop) ? -1 : 0));\n    }\n    else\n    {\n        Mix_ResumeMusic();\n    }\n    m_status = Status::Playing;\n}\n\nvoid Music::setPitch(float speed)\n{\n    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"This function is not yet implemented!\");\n}\n\nvoid Music::setVolume(float volume)\n{\n    if (static_cast<int>(volume) >= 0 && static_cast<int>(volume) <= 100) Mix_VolumeMusic(volume * MIX_MAX_VOLUME / 100);\n}\n#endif\nbool Music::openFromFile(const std::string& filePath)\n{\n#if defined(__ANDROID__)\n    if (m_SDLsoundBuffer != nullptr)\n    {\n        delete m_SDLsoundBuffer;\n        m_SDLsoundBuffer = nullptr;\n    }\n    m_SDLsoundBuffer = new SoundBuffer();\n    return m_SDLsoundBuffer->loadFromFile(filePath.c_str());\n#else\n    m_music = Mix_LoadMUS(filePath.c_str());\n    if (m_music == NULL)\n    {\n        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Can't load Music : %s \\\"%s\\\"\\n\", Mix_GetError(), filePath.c_str());\n        return false;\n    }\n    return true;\n#endif\n}\n\nbool Mouse::isButtonPressed(Button button)\n{\n    return (getSDLButtonState() & SDL_BUTTON(button));\n}\n\nVector2i Mouse::getPosition()\n{\n    int x = 0, y = 0;\n#if !defined(IS_ENGINE_HTML_5)\n    SDL_GetGlobalMouseState\n#else\n    SDL_GetMouseState\n#endif\n        (&x, &y);\n    return Vector2i(x, y);\n}\n\nVector2i Mouse::getPosition(const RenderWindow& relativeTo)\n{\n    return getPosition()\n#if !defined(IS_ENGINE_HTML_5)\n        - relativeTo.getPosition()\n#endif\n     ;\n}\n\nvoid Mouse::setPosition(const Vector2i& position)\n{\n    SDL_WarpMouseGlobal(position.x, position.y);\n}\n\nvoid Mouse::setPosition(const Vector2i& position, const RenderWindow& relativeTo)\n{\n    SDL_WarpMouseInWindow(is::IS_ENGINE_SDL_window, position.x, position.y);\n}\n\nUint32 Mouse::getSDLButtonState()\n{\n    return SDL_GetMouseState(NULL, NULL);\n}\n\nbool Touch::isDown(unsigned int finger)\n{\n    if (finger <= is::IS_ENGINE_SDL_TOUCH_ID_COUNT_MAX)\n    {\n        return is::IS_ENGINE_SDL_touchData[finger].m_SDLtouchDown;\n    }\n    return false;\n}\n\nVector2i Touch::getPosition(unsigned int finger)\n{\n    Vector2i pos{0, 0};\n    if (finger <= is::IS_ENGINE_SDL_TOUCH_ID_COUNT_MAX)\n    {\n        pos.x = is::IS_ENGINE_SDL_touchData[finger].m_SDLtouchX;\n        pos.y = is::IS_ENGINE_SDL_touchData[finger].m_SDLtouchY;\n    }\n    return pos;\n}\n\nVector2i Touch::getPosition(unsigned int finger, const RenderWindow& relativeTo)\n{\n    return getPosition(finger);\n}\n}\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/isEngineWrapper.cpp",
    "content": "/*\n  is::Engine (Infinity Solutions Engine)\n  Copyright (C) 2018-2024 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"isEngine/system/islibconnect/isEngineWrapper.h\"\n\n#if defined(IS_ENGINE_SDL_2)\nnamespace sf\n{\nbool Rect::intersects(Rect const &rec) const\n{\n    int x1Other = rec.left;\n    int x2Other = rec.left + rec.width;\n    int y1Other = rec.top;\n    int y2Other = rec.top + rec.height;\n\n    int x1 = left;\n    int x2 = left + width;\n    int y1 = top;\n    int y2 = top + height;\n\n    if (y2 <= y1Other) return false;\n    if (y1 >= y2Other) return false;\n    if (x2 <= x1Other) return false;\n    if (x1 >= x2Other) return false;\n    return true;\n}\n\nbool Rect::intersects(Rect const &rec1, Rect const &rec2) const\n{\n    return rec1.intersects(rec2);\n}\n\nRect functionGetGlobalBounds(const Vector2f &position, const Vector2f &origin, const Vector2f &size)\n{\n    Rect aabb;\n    aabb.left   = position.x - origin.x;\n    aabb.top    = position.y - origin.y;\n    aabb.width  = size.x;\n    aabb.height = size.y;\n    return aabb;\n}\n\nClock::Clock() : m_startTime(seconds(0.018f)) {}\n\nconst Time Clock::getElapsedTime()\n{\n    return m_startTime;\n}\n\nTime Clock::restart()\n{\n    return m_startTime;\n}\n\n////////////////////////////////////////////////////////////\n//              Time Operator and Function\n////////////////////////////////////////////////////////////\nconst Time Time::Zero;\n\n// functions\nTime seconds(float amount)\n{\n    // Special case: allows the SMK timer to have the same behavior as that of the SFML Pong example\n    if (amount > 0.09f && amount < 0.101f)\n    {\n        sf::Clock dTime;\n        amount = dTime.getElapsedTime().asSeconds() - 0.01f;\n    }\n    return Time(static_cast<Int64>(amount * 1000000));\n}\nTime milliseconds(Int32 amount) {return Time(static_cast<Int64>(amount) * 1000);}\nTime microseconds(Int64 amount) {return Time(amount);}\n\n// operator\ninline bool operator ==(Time left, Time right) {return left.asMicroseconds() == right.asMicroseconds();}\n\ninline bool operator !=(Time left, Time right) {return left.asMicroseconds() != right.asMicroseconds();}\n\ninline bool operator <(Time left, Time right) {return left.asMicroseconds() < right.asMicroseconds();}\n\ninline bool operator >(Time left, Time right) {return left.asMicroseconds() > right.asMicroseconds();}\n\ninline bool operator <=(Time left, Time right){return left.asMicroseconds() <= right.asMicroseconds();}\n\ninline bool operator >=(Time left, Time right){return left.asMicroseconds() >= right.asMicroseconds();}\n\ninline Time operator -(Time right) {return microseconds(-right.asMicroseconds());}\n\ninline Time operator +(Time left, Time right) {return microseconds(left.asMicroseconds() + right.asMicroseconds());}\n\ninline Time& operator +=(Time& left, Time right) {return left = left + right;}\n\ninline Time operator -(Time left, Time right) {return microseconds(left.asMicroseconds() - right.asMicroseconds());}\n\ninline Time& operator -=(Time& left, Time right) {return left = left - right;}\n\ninline Time operator *(Time left, float right) {return seconds(left.asSeconds() * right);}\n\ninline Time operator *(Time left, Int64 right) {return microseconds(left.asMicroseconds() * right);}\n\ninline Time operator *(float left, Time right) {return right * left;}\n\ninline Time operator *(Int64 left, Time right) {return right * left;}\n\ninline Time& operator *=(Time& left, float right) {return left = left * right;}\n\ninline Time& operator *=(Time& left, Int64 right) {return left = left * right;}\n\ninline Time operator /(Time left, float right) {return seconds(left.asSeconds() / right);}\n\ninline Time operator /(Time left, Int64 right) {return microseconds(left.asMicroseconds() / right);}\n\ninline Time& operator /=(Time& left, float right) {return left = left / right;}\n\ninline Time& operator /=(Time& left, Int64 right) {return left = left / right;}\n\ninline float operator /(Time left, Time right) {return left.asSeconds() / right.asSeconds();}\n\ninline Time operator %(Time left, Time right) {return microseconds(left.asMicroseconds() % right.asMicroseconds());}\n\ninline Time& operator %=(Time& left, Time right) {return left = left % right;}\n}\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/main.cpp",
    "content": "/*\n  is::Engine (Infinity Solution Engine)\n  Copyright (C) 2018-2025 Is Daouda <isdaouda.n@gmail.com>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if defined(IS_ENGINE_VS_CODE)\n#include \"Main.hpp\"\n#endif\n#include \"isEngine/core/GameEngine.h\"\n\n////////////////////////////////////////////////////////////\n/// \\brief application entry point\n////////////////////////////////////////////////////////////\nint main(int argc, char * argv[])\n{\n#if defined(IS_ENGINE_HTML_5)\n    EM_ASM(\n        FS.mkdir(\"save\");\n        FS.mount(IDBFS, {}, \"save\");\n        Module.print(\"Start file sync...\");\n        Module.syncdone = 0;\n        FS.syncfs(true, function(err){\n                Module.print(\"End file sync..\");\n                Module.syncdone = 1;\n                });\n        );\n#elif defined(IS_ENGINE_SWITCH)\n    romfsInit();\n    chdir(\"romfs:/\");\n#endif\n\n#if !defined(IS_ENGINE_HTML_5)\n    is::GameEngine game;\n#else\n    is::GameEngine *game = new is::GameEngine();\n#endif\n#if defined(IS_ENGINE_VS_CODE)\n#if defined(_DEBUG)\n\t// Display a text in the console to inform that we are in Debug mode on Visual Studio Code\n\tis::showLog(\"Debug Mode Start!\");\n#endif\n#ifdef SFML_SYSTEM_WINDOWS\n\t// Allows to create the icon for the application when developing with Visual Studio Code\n\twindowsHelper.setIcon(game.getRenderWindow().getSystemHandle());\n#endif\n#endif\n#if !defined(IS_ENGINE_HTML_5)\n    game.\n#else\n    game->\n#endif\n#if defined(IS_ENGINE_USE_MAIN_LOOP)\n        play\n#else\n        basicSFMLmain\n#endif\n        ();\n#if defined(IS_ENGINE_HTML_5)\n    delete game;\n    game = nullptr;\n#endif\n#if defined(IS_ENGINE_SDL_2)\n    is::SDL2freeLib();\n#endif\n#if defined (__ANDROID__)\n    std::terminate(); // close application\n#else\n#ifdef __SWITCH__\n    romfsExit();\n#endif\n    return 0;\n#endif\n}\n"
  },
  {
    "path": "app/src/main/cpp/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by SDL2 Template.rc\n\n// Next default values for new objects\n// \n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        101\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/vscode/Linux/LinuxHelper.cpp",
    "content": "#ifdef __linux__\n#include \"LinuxHelper.hpp\"\n\n#include <X11/Xlib.h>\n\n/******************************************************************************\n *\n *****************************************************************************/\nLinuxHelper::LinuxHelper()\n{\n\tXInitThreads();\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/vscode/Linux/LinuxHelper.hpp",
    "content": "#ifndef LINUX_HELPER_HPP\n#define LINUX_HELPER_HPP\n\nclass LinuxHelper\n{\npublic:\n\tLinuxHelper();\n};\n\n#endif // LINUX_HELPER_HPP\n"
  },
  {
    "path": "app/src/main/cpp/vscode/MacOS/MacHelper.cpp",
    "content": "#ifdef __APPLE__\n#include \"MacHelper.hpp\"\n\n#include \"CoreFoundation/CoreFoundation.h\"\n\n/******************************************************************************\n *\n *****************************************************************************/\nMacHelper::MacHelper()\n{\n\t// This function ensures the working directory is set inside of the bundle if in production mode\n\tCFBundleRef mainBundle = CFBundleGetMainBundle();\n\tCFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle);\n\tchar path[PATH_MAX];\n\tbool pathSet = CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8*)path, PATH_MAX);\n\n\t// This is a copy, so we release it here\n\tCFRelease(resourcesURL);\n\n\t// Actually do the check here\n\tif (pathSet)\n\t{\n\t\tstd::string pathStr = path;\n\t\tif (pathStr.find(\".app\") != std::string::npos)\n\t\t\tchdir(path);\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/vscode/MacOS/MacHelper.hpp",
    "content": "#ifndef MACOS_HELPER_HPP\n#define MACOS_HELPER_HPP\n\nclass MacHelper\n{\npublic:\n\tMacHelper();\n};\n\n#endif // MACOS_HELPER_HPP\n"
  },
  {
    "path": "app/src/main/cpp/vscode/Utility/Types.hpp",
    "content": "#ifndef UTIL_TYPES_HPP\n#define UTIL_TYPES_HPP\n\n#include <cstdint>\n\ntypedef std::uint8_t uchar;\ntypedef std::uint16_t ushort;\ntypedef std::uint32_t uint;\ntypedef std::uint64_t ullong;\n\ntypedef std::int64_t llong;\n\n#endif // UTIL_TYPES_HPP\n"
  },
  {
    "path": "app/src/main/cpp/vscode/Win32/Icon.h",
    "content": "#ifndef ICON_H\n#define ICON_H\n\n#define WIN32_ICON_MAIN 1\n\n#endif // ICON_H\n\n"
  },
  {
    "path": "app/src/main/cpp/vscode/Win32/Icon.rc",
    "content": "#ifdef _WIN32\n#include \"Icon.h\"\n\nWIN32_ICON_MAIN ICON \"env/windows/icon.ico\"\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/vscode/Win32/WindowsHelper.cpp",
    "content": "#ifdef _WIN32\n#include \"WindowsHelper.hpp\"\n\n#include \"Icon.h\"\n\n/******************************************************************************\n *\n *****************************************************************************/\nWindowsHelper::WindowsHelper()\n{\n\t// Get the icon directory\n\tPBYTE iconDirectory = getIconDirectory(WIN32_ICON_MAIN);\n\n\t// Store each icon\n\tm_hIcon32 = getIconFromIconDirectory(iconDirectory, 32);\n\tm_hIcon16 = getIconFromIconDirectory(iconDirectory, 16);\n}\n\n/******************************************************************************\n * The window handle uses 32x32 (ICON_BIG) & 16x16 (ICON_SMALL) sized icons.\n * This should be called any time the SFML window is create/recreated\n *****************************************************************************/\nvoid WindowsHelper::setIcon(const HWND& inHandle)\n{\n\tif (m_hIcon32)\n\t\tSendMessage(inHandle, WM_SETICON, ICON_BIG, (LPARAM)m_hIcon32);\n\tif (m_hIcon16)\n\t\tSendMessage(inHandle, WM_SETICON, ICON_SMALL, (LPARAM)m_hIcon16);\n}\n\n/******************************************************************************\n * Loads a .ico file from The application's resources, and can contain multiple\n * sizes (for instance 16x16, 32x32 & 64x64). This is referred to as an\n * \"Icon Directory\". Additionally, it can have a single icon\n *****************************************************************************/\nPBYTE WindowsHelper::getIconDirectory(const int& inResourceId)\n{\n\tHMODULE hModule = GetModuleHandle(nullptr);\n\tHRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(inResourceId), RT_GROUP_ICON);\n\n\tHGLOBAL hData = LoadResource(hModule, hResource);\n\tPBYTE data = (PBYTE)LockResource(hData);\n\n\treturn data;\n}\n\n/******************************************************************************\n * This will attempt to load a single icon from an icon directory\n * If the requested size isn't found, the first one is returned\n *****************************************************************************/\nHICON WindowsHelper::getIconFromIconDirectory(const PBYTE& inIconDirectory, const uint& inSize)\n{\n\tHMODULE hModule = GetModuleHandle(nullptr);\n\tint resourceId = LookupIconIdFromDirectoryEx(inIconDirectory, TRUE, inSize, inSize, LR_DEFAULTCOLOR);\n\tHRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(resourceId), RT_ICON);\n\n\tHGLOBAL hData = LoadResource(hModule, hResource);\n\tPBYTE data = (PBYTE)LockResource(hData);\n\tDWORD sizeofData = SizeofResource(hModule, hResource);\n\n\tHICON icon = CreateIconFromResourceEx(data, sizeofData, TRUE, 0x00030000, inSize, inSize, LR_DEFAULTCOLOR);\n\treturn icon;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/cpp/vscode/Win32/WindowsHelper.hpp",
    "content": "#ifndef WINDOWS_HELPER_HPP\n#define WINDOWS_HELPER_HPP\n\nclass WindowsHelper\n{\npublic:\n\tWindowsHelper();\n\n\tvoid setIcon(const HWND& inHandle);\n\nprivate:\n\tPBYTE getIconDirectory(const int& inResourceId);\n\tHICON getIconFromIconDirectory(const PBYTE& inIconDirectory, const uint& inSize);\n\n\tHICON m_hIcon32;\n\tHICON m_hIcon16;\n\n};\n\n#endif // WINDOWS_HELPER_HPP\n"
  },
  {
    "path": "app/src/main/env/.all.mk",
    "content": "MAX_PARALLEL_JOBS := 8\nCLEAN_OUTPUT := true\nDUMP_ASSEMBLY := false\n\n_CFLAGS_STD := -std=c++17\n_CFLAGS_WARNINGS := -Wall\n_CFLAGS_OTHER := -fdiagnostics-color=always\nCFLAGS := $(_CFLAGS_STD) $(_CFLAGS_WARNINGS) $(_CFLAGS_OTHER)\n\nLINK_LIBRARIES := \\\n\tsfml-graphics \\\n\tsfml-audio \\\n\tsfml-network \\\n\tsfml-window \\\n\tsfml-system\n\nPRECOMPILED_HEADER := PCH\n\nPRODUCTION_FOLDER := build\n\nPRODUCTION_EXCLUDE := \\\n\t*.psd \\\n\t*.rar \\\n\t*.7z \\\n\tThumbs.db \\\n\t.DS_Store\n\nPRODUCTION_DEPENDENCIES := \\\n\tassets\n\n"
  },
  {
    "path": "app/src/main/env/.debug.mk",
    "content": "CFLAGS := -g -Og $(CFLAGS) -pg\n\nBUILD_FLAGS := \\\n\t-pg\n\nBUILD_MACROS := \\\n\t_DEBUG"
  },
  {
    "path": "app/src/main/env/.release.mk",
    "content": "CFLAGS := -O2 $(CFLAGS)\n"
  },
  {
    "path": "app/src/main/env/linux/exec.desktop",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nCategories=Game;Application;\nTerminal=false\nExec=${NAME}\nPath=${Path}\nName=${PRODUCTION_LINUX_APP_NAME}\nComment=${PRODUCTION_LINUX_APP_COMMENT}\nIcon=${PRODUCTION_LINUX_ICON}"
  },
  {
    "path": "app/src/main/env/linux.all.mk",
    "content": "CC := g++\n\nLIB_DIRS := \\\n\t/usr/local/lib\n\nINCLUDE_DIRS := \\\n\t/usr/local/include\n\nBUILD_FLAGS := \\\n\t$(BUILD_FLAGS) \\\n\t-pthread\n\nLINK_LIBRARIES := \\\n\t$(LINK_LIBRARIES) \\\n\tX11\n\nPRODUCTION_LINUX_ICON := icon\n\nPRODUCTION_LINUX_APP_NAME := Game\nPRODUCTION_LINUX_APP_COMMENT := Game\n"
  },
  {
    "path": "app/src/main/env/osx/Info.plist.json",
    "content": "{\n\t\"CFBundleName\": \"${PRODUCTION_MACOS_BUNDLE_NAME}\",\n\t\"CFBundleDisplayName\": \"${PRODUCTION_MACOS_BUNDLE_DISPLAY_NAME}\",\n\t\"CFBundleIdentifier\": \"com.${PRODUCTION_MACOS_BUNDLE_DEVELOPER}.${PRODUCTION_MACOS_BUNDLE_NAME}\",\n\t\"CFBundleVersion\": \"0.0.1.1\",\n\t\"CFBundleDevelopmentRegion\": \"en\",\n\t\"CFBundleInfoDictionaryVersion\": \"6.0\",\n\t\"CFBundlePackageType\": \"APPL\",\n\t\"CFBundleSignature\": \"????\",\n\t\"CFBundleExecutable\": \"${NAME}\",\n\t\"CFBundleIconFile\": \"${MACOS_ICON}\",\n\t\"NSHighResolutionCapable\": true\n}"
  },
  {
    "path": "app/src/main/env/osx/dmg.applescript",
    "content": "set appName to system attribute \"appName\"\nset appNameExt to appName & \".app\"\n\ntell application \"Finder\"\n\ttell disk appName\n\t\topen\n\t\tset current view of container window to icon view\n\t\tset toolbar visible of container window to false\n\t\tset statusbar visible of container window to false\n\t\tset the bounds of container window to {400, 100, 1060, 500}\n\t\tset viewOptions to the icon view options of container window\n\t\tset arrangement of viewOptions to not arranged\n\t\tset icon size of viewOptions to 168\n\t\tset background picture of viewOptions to file \".background:background.tiff\"\n\t\tset position of item appNameExt of container window to {180, 182}\n\t\tset position of item \"Applications\" of container window to {480, 182}\n\t\tset position of item \".background\" of container window to {180, 582}\n\t\t-- set position of item \".fseventsd\" of container window to {480, 582}\n\t\tclose\n\t\tupdate without registering applications\n\t\tdelay 2\n\tend tell\nend tell"
  },
  {
    "path": "app/src/main/env/osx.all.mk",
    "content": "CC := clang++\nCFLAGS := $(CFLAGS:-s=)\n\nLIB_DIRS := \\\n\t/usr/local/lib\n\nINCLUDE_DIRS := \\\n\t/usr/local/include\n\nBUILD_FLAGS :=\n\nMACOS_FRAMEWORK_PATHS := \\\n\t/Library/Frameworks\n\n# Name, no extension (eg. CoreFoundation, ogg)\nMACOS_FRAMEWORKS := \\\n\tCoreFoundation\n\n# Icon .png\nPRODUCTION_MACOS_ICON := icon\n\nPRODUCTION_DEPENDENCIES := \\\n\t$(PRODUCTION_DEPENDENCIES)\n\nPRODUCTION_MACOS_BUNDLE_DEVELOPER := developer\nPRODUCTION_MACOS_BUNDLE_DISPLAY_NAME := Game\nPRODUCTION_MACOS_BUNDLE_NAME := Game\nPRODUCTION_MACOS_MAKE_DMG := true\nPRODUCTION_MACOS_BACKGROUND := dmg-background\n\nPRODUCTION_MACOS_DYLIBS := \\\n\t/usr/local/lib/libsfml-graphics.2.5 \\\n\t/usr/local/lib/libsfml-audio.2.5 \\\n\t/usr/local/lib/libsfml-network.2.5 \\\n\t/usr/local/lib/libsfml-window.2.5 \\\n\t/usr/local/lib/libsfml-system.2.5\n\n# Path, no extension (eg. /Library/Frameworks/ogg)\nPRODUCTION_MACOS_FRAMEWORKS :=\n"
  },
  {
    "path": "app/src/main/env/osx.debug.mk",
    "content": "CFLAGS := -g $(_CFLAGS_STD) $(_CFLAGS_WARNINGS) $(_CFLAGS_OTHER)\n\nBUILD_FLAGS := $(BUILD_FLAGS:-pg=)"
  },
  {
    "path": "app/src/main/env/rpi.release.mk",
    "content": "CC := g++-8.1.0\nMAX_PARALLEL_JOBS := 4\n\nLIB_DIRS := \\\n\t/usr/local/gcc-8.1.0/lib \\\n\t/usr/local/lib\n\nINCLUDE_DIRS := \\\n\t/usr/local/gcc-8.1.0/include \\\n\t/usr/local/include\n\nBUILD_DEPENDENCIES :=\n\nLINK_LIBRARIES := \\\n\t$(LINK_LIBRARIES) \\\n\tX11\n\nBUILD_FLAGS := \\\n\t-pthread\n"
  },
  {
    "path": "app/src/main/env/windows/win-make_icon_from256.sh",
    "content": "#!/bin/bash\necho\n\nif [[ $OSTYPE == 'msys' || $OSTYPE == 'win32' ]]; then\n\tif hash magick 2>/dev/null; then\n\t\tread -p \"Icon Prefix (\\\"icon_256\\\"): \"  icon_prefix\n\t\tif [[ $icon_prefix == '' ]]; then\n\t\t\ticon_prefix='icon_256'\n\t\tfi\n\n\t\toutput_file=app\n\t\tcmd=\"magick convert ${icon_prefix}.png -define icon:auto-resize=256,96,64,48,32,24,20,16 icon.ico\"\n\t\techo \"$cmd\"\n\t\t$cmd\n\n\t\techo\n\t\techo \"Successfully created $output_file.ico!\"\n\telse\n\t\techo 'This script requires the \"ImageMagick\" command-line utility'\n\t\techo 'Download from: https://www.imagemagick.org/script/download.php#windows'\n\t\techo '(Install to default location)'\n\tfi\nelse\n\techo 'This script should only run in win32'\nfi\n\necho\nread -rsn1 -p\"Press any key to continue\";echo"
  },
  {
    "path": "app/src/main/env/windows/win-make_icon_from_all.sh",
    "content": "#!/bin/bash\necho\n\nif [[ $OSTYPE == 'msys' || $OSTYPE == 'win32' ]]; then\n\tif hash magick 2>/dev/null; then\n\t\tread -p \"Icon Prefix (\\\"icon\\\"): \"  icon_prefix\n\t\tif [[ $icon_prefix == '' ]]; then\n\t\t\ticon_prefix='icon'\n\t\tfi\n\n\t\toutput_file=icon\n\t\tcmd=\"magick convert ${icon_prefix}_256.png ${icon_prefix}_48.png ${icon_prefix}_32.png ${icon_prefix}_16.png $output_file.ico\"\n\t\techo \"$cmd\"\n\t\t$cmd\n\n\t\techo\n\t\techo \"Successfully created $output_file.ico!\"\n\telse\n\t\techo 'This script requires the \"ImageMagick\" command-line utility'\n\t\techo 'Download from: https://www.imagemagick.org/script/download.php#windows'\n\t\techo '(Install to default location)'\n\tfi\nelse\n\techo 'This script should only run in win32'\nfi\n\necho\nread -rsn1 -p\"Press any key to continue\";echo"
  },
  {
    "path": "app/src/main/env/windows.all.mk",
    "content": "CC := g++.exe\n\n_MINGW := C:/mingw32/bin\n_SFML := C:/SFML\n_SFML_BIN := $(_SFML)/bin\n\nLIB_DIRS := \\\n\t$(_SFML)/lib\n\nINCLUDE_DIRS := \\\n\t$(_SFML)/include\n\nBUILD_DEPENDENCIES := \\\n\t$(_SFML_BIN)/openal32.dll\n\nPRODUCTION_DEPENDENCIES := \\\n\t$(PRODUCTION_DEPENDENCIES) \\\n\t$(_MINGW)/libgcc_s_dw2-1.dll \\\n\t$(_MINGW)/libstdc++-6.dll \\\n\t$(_MINGW)/libwinpthread-1.dll \\\n\t$(_SFML_BIN)/openal32.dll \\\n\t$(_SFML_BIN)/sfml-audio-2.dll \\\n\t$(_SFML_BIN)/sfml-graphics-2.dll \\\n\t$(_SFML_BIN)/sfml-network-2.dll \\\n\t$(_SFML_BIN)/sfml-system-2.dll \\\n\t$(_SFML_BIN)/sfml-window-2.dll\n"
  },
  {
    "path": "app/src/main/env/windows.debug.mk",
    "content": "LINK_LIBRARIES := \\\n\tOle32 \\\n\tcomdlg32 \\\n\tsfml-graphics-d \\\n\tsfml-audio-d \\\n\tsfml-network-d \\\n\tsfml-window-d \\\n\tsfml-system-d"
  },
  {
    "path": "app/src/main/env/windows.release.mk",
    "content": "BUILD_FLAGS := \\\n\t-mwindows\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/AlResource.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_ALRESOURCE_HPP\n#define SFML_ALRESOURCE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Base class for classes that require an OpenAL context\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API AlResource\n{\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    AlResource();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~AlResource();\n};\n\n} // namespace sf\n\n\n#endif // SFML_ALRESOURCE_HPP\n\n////////////////////////////////////////////////////////////\n/// \\class sf::AlResource\n/// \\ingroup audio\n///\n/// This class is for internal use only, it must be the base\n/// of every class that requires a valid OpenAL context in\n/// order to work.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/Export.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_AUDIO_EXPORT_HPP\n#define SFML_AUDIO_EXPORT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n\n////////////////////////////////////////////////////////////\n// Define portable import / export macros\n////////////////////////////////////////////////////////////\n#if defined(SFML_AUDIO_EXPORTS)\n\n    #define SFML_AUDIO_API SFML_API_EXPORT\n\n#else\n\n    #define SFML_AUDIO_API SFML_API_IMPORT\n\n#endif\n\n\n#endif // SFML_AUDIO_EXPORT_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/InputSoundFile.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_INPUTSOUNDFILE_HPP\n#define SFML_INPUTSOUNDFILE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <SFML/System/Time.hpp>\n#include <string>\n#include <cstddef>\n\n\nnamespace sf\n{\nclass InputStream;\nclass SoundFileReader;\n\n////////////////////////////////////////////////////////////\n/// \\brief Provide read access to sound files\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API InputSoundFile : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    InputSoundFile();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~InputSoundFile();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open a sound file from the disk for reading\n    ///\n    /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC, MP3.\n    /// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit.\n    ///\n    /// Because of minimp3_ex limitation, for MP3 files with big (>16kb) APEv2 tag,\n    /// it may not be properly removed, tag data will be treated as MP3 data\n    /// and there is a low chance of garbage decoded at the end of file.\n    /// See also: https://github.com/lieff/minimp3\n    ///\n    /// \\param filename Path of the sound file to load\n    ///\n    /// \\return True if the file was successfully opened\n    ///\n    ////////////////////////////////////////////////////////////\n    bool openFromFile(const std::string& filename);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open a sound file in memory for reading\n    ///\n    /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC.\n    /// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit.\n    ///\n    /// \\param data        Pointer to the file data in memory\n    /// \\param sizeInBytes Size of the data to load, in bytes\n    ///\n    /// \\return True if the file was successfully opened\n    ///\n    ////////////////////////////////////////////////////////////\n    bool openFromMemory(const void* data, std::size_t sizeInBytes);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open a sound file from a custom stream for reading\n    ///\n    /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC.\n    /// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit.\n    ///\n    /// \\param stream Source stream to read from\n    ///\n    /// \\return True if the file was successfully opened\n    ///\n    ////////////////////////////////////////////////////////////\n    bool openFromStream(InputStream& stream);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the total number of audio samples in the file\n    ///\n    /// \\return Number of samples\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint64 getSampleCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the number of channels used by the sound\n    ///\n    /// \\return Number of channels (1 = mono, 2 = stereo)\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getChannelCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the sample rate of the sound\n    ///\n    /// \\return Sample rate, in samples per second\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getSampleRate() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the total duration of the sound file\n    ///\n    /// This function is provided for convenience, the duration is\n    /// deduced from the other sound file attributes.\n    ///\n    /// \\return Duration of the sound file\n    ///\n    ////////////////////////////////////////////////////////////\n    Time getDuration() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the read offset of the file in time\n    ///\n    /// \\return Time position\n    ///\n    ////////////////////////////////////////////////////////////\n    Time getTimeOffset() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the read offset of the file in samples\n    ///\n    /// \\return Sample position\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint64 getSampleOffset() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current read position to the given sample offset\n    ///\n    /// This function takes a sample offset to provide maximum\n    /// precision. If you need to jump to a given time, use the\n    /// other overload.\n    ///\n    /// The sample offset takes the channels into account.\n    /// If you have a time offset instead, you can easily find\n    /// the corresponding sample offset with the following formula:\n    /// `timeInSeconds * sampleRate * channelCount`\n    /// If the given offset exceeds to total number of samples,\n    /// this function jumps to the end of the sound file.\n    ///\n    /// \\param sampleOffset Index of the sample to jump to, relative to the beginning\n    ///\n    ////////////////////////////////////////////////////////////\n    void seek(Uint64 sampleOffset);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current read position to the given time offset\n    ///\n    /// Using a time offset is handy but imprecise. If you need an accurate\n    /// result, consider using the overload which takes a sample offset.\n    ///\n    /// If the given time exceeds to total duration, this function jumps\n    /// to the end of the sound file.\n    ///\n    /// \\param timeOffset Time to jump to, relative to the beginning\n    ///\n    ////////////////////////////////////////////////////////////\n    void seek(Time timeOffset);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Read audio samples from the open file\n    ///\n    /// \\param samples  Pointer to the sample array to fill\n    /// \\param maxCount Maximum number of samples to read\n    ///\n    /// \\return Number of samples actually read (may be less than \\a maxCount)\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint64 read(Int16* samples, Uint64 maxCount);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Close the current file\n    ///\n    ////////////////////////////////////////////////////////////\n    void close();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    SoundFileReader* m_reader;       //!< Reader that handles I/O on the file's format\n    InputStream*     m_stream;       //!< Input stream used to access the file's data\n    bool             m_streamOwned;  //!< Is the stream internal or external?\n    Uint64           m_sampleOffset; //!< Sample Read Position\n    Uint64           m_sampleCount;  //!< Total number of samples in the file\n    unsigned int     m_channelCount; //!< Number of channels of the sound\n    unsigned int     m_sampleRate;   //!< Number of samples per second\n};\n\n} // namespace sf\n\n\n#endif // SFML_INPUTSOUNDFILE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::InputSoundFile\n/// \\ingroup audio\n///\n/// This class decodes audio samples from a sound file. It is\n/// used internally by higher-level classes such as sf::SoundBuffer\n/// and sf::Music, but can also be useful if you want to process\n/// or analyze audio files without playing them, or if you want to\n/// implement your own version of sf::Music with more specific\n/// features.\n///\n/// Usage example:\n/// \\code\n/// // Open a sound file\n/// sf::InputSoundFile file;\n/// if (!file.openFromFile(\"music.ogg\"))\n///     /* error */;\n///\n/// // Print the sound attributes\n/// std::cout << \"duration: \" << file.getDuration().asSeconds() << std::endl;\n/// std::cout << \"channels: \" << file.getChannelCount() << std::endl;\n/// std::cout << \"sample rate: \" << file.getSampleRate() << std::endl;\n/// std::cout << \"sample count: \" << file.getSampleCount() << std::endl;\n///\n/// // Read and process batches of samples until the end of file is reached\n/// sf::Int16 samples[1024];\n/// sf::Uint64 count;\n/// do\n/// {\n///     count = file.read(samples, 1024);\n///\n///     // process, analyze, play, convert, or whatever\n///     // you want to do with the samples...\n/// }\n/// while (count > 0);\n/// \\endcode\n///\n/// \\see sf::SoundFileReader, sf::OutputSoundFile\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/Listener.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_LISTENER_HPP\n#define SFML_LISTENER_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/System/Vector3.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief The audio listener is the point in the scene\n///        from where all the sounds are heard\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API Listener\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the global volume of all the sounds and musics\n    ///\n    /// The volume is a number between 0 and 100; it is combined with\n    /// the individual volume of each sound / music.\n    /// The default value for the volume is 100 (maximum).\n    ///\n    /// \\param volume New global volume, in the range [0, 100]\n    ///\n    /// \\see getGlobalVolume\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setGlobalVolume(float volume);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current value of the global volume\n    ///\n    /// \\return Current global volume, in the range [0, 100]\n    ///\n    /// \\see setGlobalVolume\n    ///\n    ////////////////////////////////////////////////////////////\n    static float getGlobalVolume();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the position of the listener in the scene\n    ///\n    /// The default listener's position is (0, 0, 0).\n    ///\n    /// \\param x X coordinate of the listener's position\n    /// \\param y Y coordinate of the listener's position\n    /// \\param z Z coordinate of the listener's position\n    ///\n    /// \\see getPosition, setDirection\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setPosition(float x, float y, float z);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the position of the listener in the scene\n    ///\n    /// The default listener's position is (0, 0, 0).\n    ///\n    /// \\param position New listener's position\n    ///\n    /// \\see getPosition, setDirection\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setPosition(const Vector3f& position);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current position of the listener in the scene\n    ///\n    /// \\return Listener's position\n    ///\n    /// \\see setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    static Vector3f getPosition();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the forward vector of the listener in the scene\n    ///\n    /// The direction (also called \"at vector\") is the vector\n    /// pointing forward from the listener's perspective. Together\n    /// with the up vector, it defines the 3D orientation of the\n    /// listener in the scene. The direction vector doesn't\n    /// have to be normalized.\n    /// The default listener's direction is (0, 0, -1).\n    ///\n    /// \\param x X coordinate of the listener's direction\n    /// \\param y Y coordinate of the listener's direction\n    /// \\param z Z coordinate of the listener's direction\n    ///\n    /// \\see getDirection, setUpVector, setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setDirection(float x, float y, float z);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the forward vector of the listener in the scene\n    ///\n    /// The direction (also called \"at vector\") is the vector\n    /// pointing forward from the listener's perspective. Together\n    /// with the up vector, it defines the 3D orientation of the\n    /// listener in the scene. The direction vector doesn't\n    /// have to be normalized.\n    /// The default listener's direction is (0, 0, -1).\n    ///\n    /// \\param direction New listener's direction\n    ///\n    /// \\see getDirection, setUpVector, setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setDirection(const Vector3f& direction);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current forward vector of the listener in the scene\n    ///\n    /// \\return Listener's forward vector (not normalized)\n    ///\n    /// \\see setDirection\n    ///\n    ////////////////////////////////////////////////////////////\n    static Vector3f getDirection();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the upward vector of the listener in the scene\n    ///\n    /// The up vector is the vector that points upward from the\n    /// listener's perspective. Together with the direction, it\n    /// defines the 3D orientation of the listener in the scene.\n    /// The up vector doesn't have to be normalized.\n    /// The default listener's up vector is (0, 1, 0). It is usually\n    /// not necessary to change it, especially in 2D scenarios.\n    ///\n    /// \\param x X coordinate of the listener's up vector\n    /// \\param y Y coordinate of the listener's up vector\n    /// \\param z Z coordinate of the listener's up vector\n    ///\n    /// \\see getUpVector, setDirection, setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setUpVector(float x, float y, float z);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the upward vector of the listener in the scene\n    ///\n    /// The up vector is the vector that points upward from the\n    /// listener's perspective. Together with the direction, it\n    /// defines the 3D orientation of the listener in the scene.\n    /// The up vector doesn't have to be normalized.\n    /// The default listener's up vector is (0, 1, 0). It is usually\n    /// not necessary to change it, especially in 2D scenarios.\n    ///\n    /// \\param upVector New listener's up vector\n    ///\n    /// \\see getUpVector, setDirection, setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setUpVector(const Vector3f& upVector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current upward vector of the listener in the scene\n    ///\n    /// \\return Listener's upward vector (not normalized)\n    ///\n    /// \\see setUpVector\n    ///\n    ////////////////////////////////////////////////////////////\n    static Vector3f getUpVector();\n};\n\n} // namespace sf\n\n\n#endif // SFML_LISTENER_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Listener\n/// \\ingroup audio\n///\n/// The audio listener defines the global properties of the\n/// audio environment, it defines where and how sounds and musics\n/// are heard. If sf::View is the eyes of the user, then sf::Listener\n/// is his ears (by the way, they are often linked together --\n/// same position, orientation, etc.).\n///\n/// sf::Listener is a simple interface, which allows to setup the\n/// listener in the 3D audio environment (position, direction and\n/// up vector), and to adjust the global volume.\n///\n/// Because the listener is unique in the scene, sf::Listener only\n/// contains static functions and doesn't have to be instantiated.\n///\n/// Usage example:\n/// \\code\n/// // Move the listener to the position (1, 0, -5)\n/// sf::Listener::setPosition(1, 0, -5);\n///\n/// // Make it face the right axis (1, 0, 0)\n/// sf::Listener::setDirection(1, 0, 0);\n///\n/// // Reduce the global volume\n/// sf::Listener::setGlobalVolume(50);\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/Music.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_MUSIC_HPP\n#define SFML_MUSIC_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/Audio/SoundStream.hpp>\n#include <SFML/Audio/InputSoundFile.hpp>\n#include <SFML/System/Mutex.hpp>\n#include <SFML/System/Time.hpp>\n#include <string>\n#include <vector>\n\n\nnamespace sf\n{\nclass InputStream;\n\n////////////////////////////////////////////////////////////\n/// \\brief Streamed music played from an audio file\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API Music : public SoundStream\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Structure defining a time range using the template type\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename T>\n    struct Span\n    {\n        ////////////////////////////////////////////////////////////\n        /// \\brief Default constructor\n        ///\n        ////////////////////////////////////////////////////////////\n        Span()\n        {\n\n        }\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Initialization constructor\n        ///\n        /// \\param off Initial Offset\n        /// \\param len Initial Length\n        ///\n        ////////////////////////////////////////////////////////////\n        Span(T off, T len):\n        offset(off),\n        length(len)\n        {\n\n        }\n\n        T offset; //!< The beginning offset of the time range\n        T length; //!< The length of the time range\n    };\n\n    // Define the relevant Span types\n    typedef Span<Time> TimeSpan;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    Music();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Music();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open a music from an audio file\n    ///\n    /// This function doesn't start playing the music (call play()\n    /// to do so).\n    /// See the documentation of sf::InputSoundFile for the list\n    /// of supported formats.\n    ///\n    /// \\warning Since the music is not loaded at once but rather\n    /// streamed continuously, the file must remain accessible until\n    /// the sf::Music object loads a new music or is destroyed.\n    ///\n    /// \\param filename Path of the music file to open\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see openFromMemory, openFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool openFromFile(const std::string& filename);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open a music from an audio file in memory\n    ///\n    /// This function doesn't start playing the music (call play()\n    /// to do so).\n    /// See the documentation of sf::InputSoundFile for the list\n    /// of supported formats.\n    ///\n    /// \\warning Since the music is not loaded at once but rather streamed\n    /// continuously, the \\a data buffer must remain accessible until\n    /// the sf::Music object loads a new music or is destroyed. That is,\n    /// you can't deallocate the buffer right after calling this function.\n    ///\n    /// \\param data        Pointer to the file data in memory\n    /// \\param sizeInBytes Size of the data to load, in bytes\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see openFromFile, openFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool openFromMemory(const void* data, std::size_t sizeInBytes);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open a music from an audio file in a custom stream\n    ///\n    /// This function doesn't start playing the music (call play()\n    /// to do so).\n    /// See the documentation of sf::InputSoundFile for the list\n    /// of supported formats.\n    ///\n    /// \\warning Since the music is not loaded at once but rather\n    /// streamed continuously, the \\a stream must remain accessible\n    /// until the sf::Music object loads a new music or is destroyed.\n    ///\n    /// \\param stream Source stream to read from\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see openFromFile, openFromMemory\n    ///\n    ////////////////////////////////////////////////////////////\n    bool openFromStream(InputStream& stream);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the total duration of the music\n    ///\n    /// \\return Music duration\n    ///\n    ////////////////////////////////////////////////////////////\n    Time getDuration() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the positions of the of the sound's looping sequence\n    ///\n    /// \\return Loop Time position class.\n    ///\n    /// \\warning Since setLoopPoints() performs some adjustments on the\n    /// provided values and rounds them to internal samples, a call to\n    /// getLoopPoints() is not guaranteed to return the same times passed\n    /// into a previous call to setLoopPoints(). However, it is guaranteed\n    /// to return times that will map to the valid internal samples of\n    /// this Music if they are later passed to setLoopPoints().\n    ///\n    /// \\see setLoopPoints\n    ///\n    ////////////////////////////////////////////////////////////\n    TimeSpan getLoopPoints() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Sets the beginning and duration of the sound's looping sequence using sf::Time\n    ///\n    /// setLoopPoints() allows for specifying the beginning offset and the duration of the loop such that, when the music\n    /// is enabled for looping, it will seamlessly seek to the beginning whenever it\n    /// encounters the end of the duration. Valid ranges for timePoints.offset and timePoints.length are\n    /// [0, Dur) and (0, Dur-offset] respectively, where Dur is the value returned by getDuration().\n    /// Note that the EOF \"loop point\" from the end to the beginning of the stream is still honored,\n    /// in case the caller seeks to a point after the end of the loop range. This function can be\n    /// safely called at any point after a stream is opened, and will be applied to a playing sound\n    /// without affecting the current playing offset.\n    ///\n    /// \\warning Setting the loop points while the stream's status is Paused\n    /// will set its status to Stopped. The playing offset will be unaffected.\n    ///\n    /// \\param timePoints The definition of the loop. Can be any time points within the sound's length\n    ///\n    /// \\see getLoopPoints\n    ///\n    ////////////////////////////////////////////////////////////\n    void setLoopPoints(TimeSpan timePoints);\n\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Request a new chunk of audio samples from the stream source\n    ///\n    /// This function fills the chunk from the next samples\n    /// to read from the audio file.\n    ///\n    /// \\param data Chunk of data to fill\n    ///\n    /// \\return True to continue playback, false to stop\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool onGetData(Chunk& data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current playing position in the stream source\n    ///\n    /// \\param timeOffset New playing position, from the beginning of the music\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void onSeek(Time timeOffset);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current playing position in the stream source to the loop offset\n    ///\n    /// This is called by the underlying SoundStream whenever it needs us to reset\n    /// the seek position for a loop. We then determine whether we are looping on a\n    /// loop point or the end-of-file, perform the seek, and return the new position.\n    ///\n    /// \\return The seek position after looping (or -1 if there's no loop)\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 onLoop();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Initialize the internal state after loading a new music\n    ///\n    ////////////////////////////////////////////////////////////\n    void initialize();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Helper to convert an sf::Time to a sample position\n    ///\n    /// \\param position Time to convert to samples\n    ///\n    /// \\return The number of samples elapsed at the given time\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint64 timeToSamples(Time position) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Helper to convert a sample position to an sf::Time\n    ///\n    /// \\param samples Sample count to convert to Time\n    ///\n    /// \\return The Time position of the given sample\n    ///\n    ////////////////////////////////////////////////////////////\n    Time samplesToTime(Uint64 samples) const;\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    InputSoundFile     m_file;     //!< The streamed music file\n    std::vector<Int16> m_samples;  //!< Temporary buffer of samples\n    Mutex              m_mutex;    //!< Mutex protecting the data\n    Span<Uint64>       m_loopSpan; //!< Loop Range Specifier\n};\n\n} // namespace sf\n\n\n#endif // SFML_MUSIC_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Music\n/// \\ingroup audio\n///\n/// Musics are sounds that are streamed rather than completely\n/// loaded in memory. This is especially useful for compressed\n/// musics that usually take hundreds of MB when they are\n/// uncompressed: by streaming it instead of loading it entirely,\n/// you avoid saturating the memory and have almost no loading delay.\n/// This implies that the underlying resource (file, stream or\n/// memory buffer) must remain valid for the lifetime of the\n/// sf::Music object.\n///\n/// Apart from that, a sf::Music has almost the same features as\n/// the sf::SoundBuffer / sf::Sound pair: you can play/pause/stop\n/// it, request its parameters (channels, sample rate), change\n/// the way it is played (pitch, volume, 3D position, ...), etc.\n///\n/// As a sound stream, a music is played in its own thread in order\n/// not to block the rest of the program. This means that you can\n/// leave the music alone after calling play(), it will manage itself\n/// very well.\n///\n/// Usage example:\n/// \\code\n/// // Declare a new music\n/// sf::Music music;\n///\n/// // Open it from an audio file\n/// if (!music.openFromFile(\"music.ogg\"))\n/// {\n///     // error...\n/// }\n///\n/// // Change some parameters\n/// music.setPosition(0, 1, 10); // change its 3D position\n/// music.setPitch(2);           // increase the pitch\n/// music.setVolume(50);         // reduce the volume\n/// music.setLoop(true);         // make it loop\n///\n/// // Play it\n/// music.play();\n/// \\endcode\n///\n/// \\see sf::Sound, sf::SoundStream\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/OutputSoundFile.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_OUTPUTSOUNDFILE_HPP\n#define SFML_OUTPUTSOUNDFILE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <string>\n\n\nnamespace sf\n{\nclass SoundFileWriter;\n\n////////////////////////////////////////////////////////////\n/// \\brief Provide write access to sound files\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API OutputSoundFile : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    OutputSoundFile();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// Closes the file if it was still open.\n    ///\n    ////////////////////////////////////////////////////////////\n    ~OutputSoundFile();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open the sound file from the disk for writing\n    ///\n    /// The supported audio formats are: WAV, OGG/Vorbis, FLAC.\n    ///\n    /// \\param filename     Path of the sound file to write\n    /// \\param sampleRate   Sample rate of the sound\n    /// \\param channelCount Number of channels in the sound\n    ///\n    /// \\return True if the file was successfully opened\n    ///\n    ////////////////////////////////////////////////////////////\n    bool openFromFile(const std::string& filename, unsigned int sampleRate, unsigned int channelCount);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Write audio samples to the file\n    ///\n    /// \\param samples     Pointer to the sample array to write\n    /// \\param count       Number of samples to write\n    ///\n    ////////////////////////////////////////////////////////////\n    void write(const Int16* samples, Uint64 count);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Close the current file\n    ///\n    ////////////////////////////////////////////////////////////\n    void close();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    SoundFileWriter* m_writer; //!< Writer that handles I/O on the file's format\n};\n\n} // namespace sf\n\n\n#endif // SFML_OUTPUTSOUNDFILE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::OutputSoundFile\n/// \\ingroup audio\n///\n/// This class encodes audio samples to a sound file. It is\n/// used internally by higher-level classes such as sf::SoundBuffer,\n/// but can also be useful if you want to create audio files from\n/// custom data sources, like generated audio samples.\n///\n/// Usage example:\n/// \\code\n/// // Create a sound file, ogg/vorbis format, 44100 Hz, stereo\n/// sf::OutputSoundFile file;\n/// if (!file.openFromFile(\"music.ogg\", 44100, 2))\n///     /* error */;\n///\n/// while (...)\n/// {\n///     // Read or generate audio samples from your custom source\n///     std::vector<sf::Int16> samples = ...;\n///\n///     // Write them to the file\n///     file.write(samples.data(), samples.size());\n/// }\n/// \\endcode\n///\n/// \\see sf::SoundFileWriter, sf::InputSoundFile\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/Sound.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOUND_HPP\n#define SFML_SOUND_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/Audio/SoundSource.hpp>\n#include <SFML/System/Time.hpp>\n#include <cstdlib>\n\n\nnamespace sf\n{\nclass SoundBuffer;\n\n////////////////////////////////////////////////////////////\n/// \\brief Regular sound that can be played in the audio environment\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API Sound : public SoundSource\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    Sound();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the sound with a buffer\n    ///\n    /// \\param buffer Sound buffer containing the audio data to play with the sound\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit Sound(const SoundBuffer& buffer);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy constructor\n    ///\n    /// \\param copy Instance to copy\n    ///\n    ////////////////////////////////////////////////////////////\n    Sound(const Sound& copy);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Sound();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Start or resume playing the sound\n    ///\n    /// This function starts the stream if it was stopped, resumes\n    /// it if it was paused, and restarts it from beginning if it\n    /// was it already playing.\n    /// This function uses its own thread so that it doesn't block\n    /// the rest of the program while the sound is played.\n    ///\n    /// \\see pause, stop\n    ///\n    ////////////////////////////////////////////////////////////\n    void play();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Pause the sound\n    ///\n    /// This function pauses the sound if it was playing,\n    /// otherwise (sound already paused or stopped) it has no effect.\n    ///\n    /// \\see play, stop\n    ///\n    ////////////////////////////////////////////////////////////\n    void pause();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief stop playing the sound\n    ///\n    /// This function stops the sound if it was playing or paused,\n    /// and does nothing if it was already stopped.\n    /// It also resets the playing position (unlike pause()).\n    ///\n    /// \\see play, pause\n    ///\n    ////////////////////////////////////////////////////////////\n    void stop();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the source buffer containing the audio data to play\n    ///\n    /// It is important to note that the sound buffer is not copied,\n    /// thus the sf::SoundBuffer instance must remain alive as long\n    /// as it is attached to the sound.\n    ///\n    /// \\param buffer Sound buffer to attach to the sound\n    ///\n    /// \\see getBuffer\n    ///\n    ////////////////////////////////////////////////////////////\n    void setBuffer(const SoundBuffer& buffer);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set whether or not the sound should loop after reaching the end\n    ///\n    /// If set, the sound will restart from beginning after\n    /// reaching the end and so on, until it is stopped or\n    /// setLoop(false) is called.\n    /// The default looping state for sound is false.\n    ///\n    /// \\param loop True to play in loop, false to play once\n    ///\n    /// \\see getLoop\n    ///\n    ////////////////////////////////////////////////////////////\n    void setLoop(bool loop);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current playing position of the sound\n    ///\n    /// The playing position can be changed when the sound is\n    /// either paused or playing. Changing the playing position\n    /// when the sound is stopped has no effect, since playing\n    /// the sound will reset its position.\n    ///\n    /// \\param timeOffset New playing position, from the beginning of the sound\n    ///\n    /// \\see getPlayingOffset\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPlayingOffset(Time timeOffset);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the audio buffer attached to the sound\n    ///\n    /// \\return Sound buffer attached to the sound (can be NULL)\n    ///\n    ////////////////////////////////////////////////////////////\n    const SoundBuffer* getBuffer() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether or not the sound is in loop mode\n    ///\n    /// \\return True if the sound is looping, false otherwise\n    ///\n    /// \\see setLoop\n    ///\n    ////////////////////////////////////////////////////////////\n    bool getLoop() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current playing position of the sound\n    ///\n    /// \\return Current playing position, from the beginning of the sound\n    ///\n    /// \\see setPlayingOffset\n    ///\n    ////////////////////////////////////////////////////////////\n    Time getPlayingOffset() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current status of the sound (stopped, paused, playing)\n    ///\n    /// \\return Current status of the sound\n    ///\n    ////////////////////////////////////////////////////////////\n    Status getStatus() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of assignment operator\n    ///\n    /// \\param right Instance to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    Sound& operator =(const Sound& right);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Reset the internal buffer of the sound\n    ///\n    /// This function is for internal use only, you don't have\n    /// to use it. It is called by the sf::SoundBuffer that\n    /// this sound uses, when it is destroyed in order to prevent\n    /// the sound from using a dead buffer.\n    ///\n    ////////////////////////////////////////////////////////////\n    void resetBuffer();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    const SoundBuffer* m_buffer; //!< Sound buffer bound to the source\n};\n\n} // namespace sf\n\n\n#endif // SFML_SOUND_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Sound\n/// \\ingroup audio\n///\n/// sf::Sound is the class to use to play sounds.\n/// It provides:\n/// \\li Control (play, pause, stop)\n/// \\li Ability to modify output parameters in real-time (pitch, volume, ...)\n/// \\li 3D spatial features (position, attenuation, ...).\n///\n/// sf::Sound is perfect for playing short sounds that can\n/// fit in memory and require no latency, like foot steps or\n/// gun shots. For longer sounds, like background musics\n/// or long speeches, rather see sf::Music (which is based\n/// on streaming).\n///\n/// In order to work, a sound must be given a buffer of audio\n/// data to play. Audio data (samples) is stored in sf::SoundBuffer,\n/// and attached to a sound with the setBuffer() function.\n/// The buffer object attached to a sound must remain alive\n/// as long as the sound uses it. Note that multiple sounds\n/// can use the same sound buffer at the same time.\n///\n/// Usage example:\n/// \\code\n/// sf::SoundBuffer buffer;\n/// buffer.loadFromFile(\"sound.wav\");\n///\n/// sf::Sound sound;\n/// sound.setBuffer(buffer);\n/// sound.play();\n/// \\endcode\n///\n/// \\see sf::SoundBuffer, sf::Music\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/SoundBuffer.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOUNDBUFFER_HPP\n#define SFML_SOUNDBUFFER_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/Audio/AlResource.hpp>\n#include <SFML/System/Time.hpp>\n#include <string>\n#include <vector>\n#include <set>\n\n\nnamespace sf\n{\nclass Sound;\nclass InputSoundFile;\nclass InputStream;\n\n////////////////////////////////////////////////////////////\n/// \\brief Storage for audio samples defining a sound\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API SoundBuffer : AlResource\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    SoundBuffer();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy constructor\n    ///\n    /// \\param copy Instance to copy\n    ///\n    ////////////////////////////////////////////////////////////\n    SoundBuffer(const SoundBuffer& copy);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~SoundBuffer();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the sound buffer from a file\n    ///\n    /// See the documentation of sf::InputSoundFile for the list\n    /// of supported formats.\n    ///\n    /// \\param filename Path of the sound file to load\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromMemory, loadFromStream, loadFromSamples, saveToFile\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromFile(const std::string& filename);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the sound buffer from a file in memory\n    ///\n    /// See the documentation of sf::InputSoundFile for the list\n    /// of supported formats.\n    ///\n    /// \\param data        Pointer to the file data in memory\n    /// \\param sizeInBytes Size of the data to load, in bytes\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromStream, loadFromSamples\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromMemory(const void* data, std::size_t sizeInBytes);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the sound buffer from a custom stream\n    ///\n    /// See the documentation of sf::InputSoundFile for the list\n    /// of supported formats.\n    ///\n    /// \\param stream Source stream to read from\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromMemory, loadFromSamples\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromStream(InputStream& stream);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the sound buffer from an array of audio samples\n    ///\n    /// The assumed format of the audio samples is 16 bits signed integer\n    /// (sf::Int16).\n    ///\n    /// \\param samples      Pointer to the array of samples in memory\n    /// \\param sampleCount  Number of samples in the array\n    /// \\param channelCount Number of channels (1 = mono, 2 = stereo, ...)\n    /// \\param sampleRate   Sample rate (number of samples to play per second)\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromMemory, saveToFile\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromSamples(const Int16* samples, Uint64 sampleCount, unsigned int channelCount, unsigned int sampleRate);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Save the sound buffer to an audio file\n    ///\n    /// See the documentation of sf::OutputSoundFile for the list\n    /// of supported formats.\n    ///\n    /// \\param filename Path of the sound file to write\n    ///\n    /// \\return True if saving succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromMemory, loadFromSamples\n    ///\n    ////////////////////////////////////////////////////////////\n    bool saveToFile(const std::string& filename) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the array of audio samples stored in the buffer\n    ///\n    /// The format of the returned samples is 16 bits signed integer\n    /// (sf::Int16). The total number of samples in this array\n    /// is given by the getSampleCount() function.\n    ///\n    /// \\return Read-only pointer to the array of sound samples\n    ///\n    /// \\see getSampleCount\n    ///\n    ////////////////////////////////////////////////////////////\n    const Int16* getSamples() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the number of samples stored in the buffer\n    ///\n    /// The array of samples can be accessed with the getSamples()\n    /// function.\n    ///\n    /// \\return Number of samples\n    ///\n    /// \\see getSamples\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint64 getSampleCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the sample rate of the sound\n    ///\n    /// The sample rate is the number of samples played per second.\n    /// The higher, the better the quality (for example, 44100\n    /// samples/s is CD quality).\n    ///\n    /// \\return Sample rate (number of samples per second)\n    ///\n    /// \\see getChannelCount, getDuration\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getSampleRate() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the number of channels used by the sound\n    ///\n    /// If the sound is mono then the number of channels will\n    /// be 1, 2 for stereo, etc.\n    ///\n    /// \\return Number of channels\n    ///\n    /// \\see getSampleRate, getDuration\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getChannelCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the total duration of the sound\n    ///\n    /// \\return Sound duration\n    ///\n    /// \\see getSampleRate, getChannelCount\n    ///\n    ////////////////////////////////////////////////////////////\n    Time getDuration() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of assignment operator\n    ///\n    /// \\param right Instance to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    SoundBuffer& operator =(const SoundBuffer& right);\n\nprivate:\n\n    friend class Sound;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Initialize the internal state after loading a new sound\n    ///\n    /// \\param file Sound file providing access to the new loaded sound\n    ///\n    /// \\return True on successful initialization, false on failure\n    ///\n    ////////////////////////////////////////////////////////////\n    bool initialize(InputSoundFile& file);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the internal buffer with the cached audio samples\n    ///\n    /// \\param channelCount Number of channels\n    /// \\param sampleRate   Sample rate (number of samples per second)\n    ///\n    /// \\return True on success, false if any error happened\n    ///\n    ////////////////////////////////////////////////////////////\n    bool update(unsigned int channelCount, unsigned int sampleRate);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Add a sound to the list of sounds that use this buffer\n    ///\n    /// \\param sound Sound instance to attach\n    ///\n    ////////////////////////////////////////////////////////////\n    void attachSound(Sound* sound) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Remove a sound from the list of sounds that use this buffer\n    ///\n    /// \\param sound Sound instance to detach\n    ///\n    ////////////////////////////////////////////////////////////\n    void detachSound(Sound* sound) const;\n\n    ////////////////////////////////////////////////////////////\n    // Types\n    ////////////////////////////////////////////////////////////\n    typedef std::set<Sound*> SoundList; //!< Set of unique sound instances\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    unsigned int       m_buffer;   //!< OpenAL buffer identifier\n    std::vector<Int16> m_samples;  //!< Samples buffer\n    Time               m_duration; //!< Sound duration\n    mutable SoundList  m_sounds;   //!< List of sounds that are using this buffer\n};\n\n} // namespace sf\n\n\n#endif // SFML_SOUNDBUFFER_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::SoundBuffer\n/// \\ingroup audio\n///\n/// A sound buffer holds the data of a sound, which is\n/// an array of audio samples. A sample is a 16 bits signed integer\n/// that defines the amplitude of the sound at a given time.\n/// The sound is then reconstituted by playing these samples at\n/// a high rate (for example, 44100 samples per second is the\n/// standard rate used for playing CDs). In short, audio samples\n/// are like texture pixels, and a sf::SoundBuffer is similar to\n/// a sf::Texture.\n///\n/// A sound buffer can be loaded from a file (see loadFromFile()\n/// for the complete list of supported formats), from memory, from\n/// a custom stream (see sf::InputStream) or directly from an array\n/// of samples. It can also be saved back to a file.\n///\n/// Sound buffers alone are not very useful: they hold the audio data\n/// but cannot be played. To do so, you need to use the sf::Sound class,\n/// which provides functions to play/pause/stop the sound as well as\n/// changing the way it is outputted (volume, pitch, 3D position, ...).\n/// This separation allows more flexibility and better performances:\n/// indeed a sf::SoundBuffer is a heavy resource, and any operation on it\n/// is slow (often too slow for real-time applications). On the other\n/// side, a sf::Sound is a lightweight object, which can use the audio data\n/// of a sound buffer and change the way it is played without actually\n/// modifying that data. Note that it is also possible to bind\n/// several sf::Sound instances to the same sf::SoundBuffer.\n///\n/// It is important to note that the sf::Sound instance doesn't\n/// copy the buffer that it uses, it only keeps a reference to it.\n/// Thus, a sf::SoundBuffer must not be destructed while it is\n/// used by a sf::Sound (i.e. never write a function that\n/// uses a local sf::SoundBuffer instance for loading a sound).\n///\n/// Usage example:\n/// \\code\n/// // Declare a new sound buffer\n/// sf::SoundBuffer buffer;\n///\n/// // Load it from a file\n/// if (!buffer.loadFromFile(\"sound.wav\"))\n/// {\n///     // error...\n/// }\n///\n/// // Create a sound source and bind it to the buffer\n/// sf::Sound sound1;\n/// sound1.setBuffer(buffer);\n///\n/// // Play the sound\n/// sound1.play();\n///\n/// // Create another sound source bound to the same buffer\n/// sf::Sound sound2;\n/// sound2.setBuffer(buffer);\n///\n/// // Play it with a higher pitch -- the first sound remains unchanged\n/// sound2.setPitch(2);\n/// sound2.play();\n/// \\endcode\n///\n/// \\see sf::Sound, sf::SoundBufferRecorder\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/SoundBufferRecorder.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOUNDBUFFERRECORDER_HPP\n#define SFML_SOUNDBUFFERRECORDER_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/Audio/SoundBuffer.hpp>\n#include <SFML/Audio/SoundRecorder.hpp>\n#include <vector>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Specialized SoundRecorder which stores the captured\n///        audio data into a sound buffer\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API SoundBufferRecorder : public SoundRecorder\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~SoundBufferRecorder();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the sound buffer containing the captured audio data\n    ///\n    /// The sound buffer is valid only after the capture has ended.\n    /// This function provides a read-only access to the internal\n    /// sound buffer, but it can be copied if you need to\n    /// make any modification to it.\n    ///\n    /// \\return Read-only access to the sound buffer\n    ///\n    ////////////////////////////////////////////////////////////\n    const SoundBuffer& getBuffer() const;\n\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Start capturing audio data\n    ///\n    /// \\return True to start the capture, or false to abort it\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool onStart();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Process a new chunk of recorded samples\n    ///\n    /// \\param samples     Pointer to the new chunk of recorded samples\n    /// \\param sampleCount Number of samples pointed by \\a samples\n    ///\n    /// \\return True to continue the capture, or false to stop it\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool onProcessSamples(const Int16* samples, std::size_t sampleCount);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Stop capturing audio data\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void onStop();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    std::vector<Int16> m_samples; //!< Temporary sample buffer to hold the recorded data\n    SoundBuffer        m_buffer;  //!< Sound buffer that will contain the recorded data\n};\n\n} // namespace sf\n\n#endif // SFML_SOUNDBUFFERRECORDER_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::SoundBufferRecorder\n/// \\ingroup audio\n///\n/// sf::SoundBufferRecorder allows to access a recorded sound\n/// through a sf::SoundBuffer, so that it can be played, saved\n/// to a file, etc.\n///\n/// It has the same simple interface as its base class (start(), stop())\n/// and adds a function to retrieve the recorded sound buffer\n/// (getBuffer()).\n///\n/// As usual, don't forget to call the isAvailable() function\n/// before using this class (see sf::SoundRecorder for more details\n/// about this).\n///\n/// Usage example:\n/// \\code\n/// if (sf::SoundBufferRecorder::isAvailable())\n/// {\n///     // Record some audio data\n///     sf::SoundBufferRecorder recorder;\n///     recorder.start();\n///     ...\n///     recorder.stop();\n///\n///     // Get the buffer containing the captured audio data\n///     const sf::SoundBuffer& buffer = recorder.getBuffer();\n///\n///     // Save it to a file (for example...)\n///     buffer.saveToFile(\"my_record.ogg\");\n/// }\n/// \\endcode\n///\n/// \\see sf::SoundRecorder\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/SoundFileFactory.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOUNDFILEFACTORY_HPP\n#define SFML_SOUNDFILEFACTORY_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <string>\n#include <vector>\n\n\nnamespace sf\n{\nclass InputStream;\nclass SoundFileReader;\nclass SoundFileWriter;\n\n////////////////////////////////////////////////////////////\n/// \\brief Manages and instantiates sound file readers and writers\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API SoundFileFactory\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Register a new reader\n    ///\n    /// \\see unregisterReader\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename T>\n    static void registerReader();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Unregister a reader\n    ///\n    /// \\see registerReader\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename T>\n    static void unregisterReader();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Register a new writer\n    ///\n    /// \\see unregisterWriter\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename T>\n    static void registerWriter();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Unregister a writer\n    ///\n    /// \\see registerWriter\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename T>\n    static void unregisterWriter();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Instantiate the right reader for the given file on disk\n    ///\n    /// It's up to the caller to release the returned reader\n    ///\n    /// \\param filename Path of the sound file\n    ///\n    /// \\return A new sound file reader that can read the given file, or null if no reader can handle it\n    ///\n    /// \\see createReaderFromMemory, createReaderFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    static SoundFileReader* createReaderFromFilename(const std::string& filename);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Instantiate the right codec for the given file in memory\n    ///\n    /// It's up to the caller to release the returned reader\n    ///\n    /// \\param data        Pointer to the file data in memory\n    /// \\param sizeInBytes Total size of the file data, in bytes\n    ///\n    /// \\return A new sound file codec that can read the given file, or null if no codec can handle it\n    ///\n    /// \\see createReaderFromFilename, createReaderFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    static SoundFileReader* createReaderFromMemory(const void* data, std::size_t sizeInBytes);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Instantiate the right codec for the given file in stream\n    ///\n    /// It's up to the caller to release the returned reader\n    ///\n    /// \\param stream Source stream to read from\n    ///\n    /// \\return A new sound file codec that can read the given file, or null if no codec can handle it\n    ///\n    /// \\see createReaderFromFilename, createReaderFromMemory\n    ///\n    ////////////////////////////////////////////////////////////\n    static SoundFileReader* createReaderFromStream(InputStream& stream);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Instantiate the right writer for the given file on disk\n    ///\n    /// It's up to the caller to release the returned writer\n    ///\n    /// \\param filename Path of the sound file\n    ///\n    /// \\return A new sound file writer that can write given file, or null if no writer can handle it\n    ///\n    ////////////////////////////////////////////////////////////\n    static SoundFileWriter* createWriterFromFilename(const std::string& filename);\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Types\n    ////////////////////////////////////////////////////////////\n    struct ReaderFactory\n    {\n        bool (*check)(InputStream&);\n        SoundFileReader* (*create)();\n    };\n    typedef std::vector<ReaderFactory> ReaderFactoryArray;\n\n    struct WriterFactory\n    {\n        bool (*check)(const std::string&);\n        SoundFileWriter* (*create)();\n    };\n    typedef std::vector<WriterFactory> WriterFactoryArray;\n\n    ////////////////////////////////////////////////////////////\n    // Static member data\n    ////////////////////////////////////////////////////////////\n    static ReaderFactoryArray s_readers; //!< List of all registered readers\n    static WriterFactoryArray s_writers; //!< List of all registered writers\n};\n\n} // namespace sf\n\n#include <SFML/Audio/SoundFileFactory.inl>\n\n#endif // SFML_SOUNDFILEFACTORY_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::SoundFileFactory\n/// \\ingroup audio\n///\n/// This class is where all the sound file readers and writers are\n/// registered. You should normally only need to use its registration\n/// and unregistration functions; readers/writers creation and manipulation\n/// are wrapped into the higher-level classes sf::InputSoundFile and\n/// sf::OutputSoundFile.\n///\n/// To register a new reader (writer) use the sf::SoundFileFactory::registerReader\n/// (registerWriter) static function. You don't have to call the unregisterReader\n/// (unregisterWriter) function, unless you want to unregister a format before your\n/// application ends (typically, when a plugin is unloaded).\n///\n/// Usage example:\n/// \\code\n/// sf::SoundFileFactory::registerReader<MySoundFileReader>();\n/// sf::SoundFileFactory::registerWriter<MySoundFileWriter>();\n/// \\endcode\n///\n/// \\see sf::InputSoundFile, sf::OutputSoundFile, sf::SoundFileReader, sf::SoundFileWriter\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/SoundFileFactory.inl",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n\n\nnamespace sf\n{\nnamespace priv\n{\n    template <typename T> SoundFileReader* createReader() {return new T;}\n    template <typename T> SoundFileWriter* createWriter() {return new T;}\n}\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nvoid SoundFileFactory::registerReader()\n{\n    // Make sure the same class won't be registered twice\n    unregisterReader<T>();\n\n    // Create a new factory with the functions provided by the class\n    ReaderFactory factory;\n    factory.check = &T::check;\n    factory.create = &priv::createReader<T>;\n\n    // Add it\n    s_readers.push_back(factory);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nvoid SoundFileFactory::unregisterReader()\n{\n    // Remove the instance(s) of the reader from the array of factories\n    for (ReaderFactoryArray::iterator it = s_readers.begin(); it != s_readers.end(); )\n    {\n        if (it->create == &priv::createReader<T>)\n            it = s_readers.erase(it);\n        else\n            ++it;\n    }\n}\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nvoid SoundFileFactory::registerWriter()\n{\n    // Make sure the same class won't be registered twice\n    unregisterWriter<T>();\n\n    // Create a new factory with the functions provided by the class\n    WriterFactory factory;\n    factory.check = &T::check;\n    factory.create = &priv::createWriter<T>;\n\n    // Add it\n    s_writers.push_back(factory);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nvoid SoundFileFactory::unregisterWriter()\n{\n    // Remove the instance(s) of the writer from the array of factories\n    for (WriterFactoryArray::iterator it = s_writers.begin(); it != s_writers.end(); )\n    {\n        if (it->create == &priv::createWriter<T>)\n            it = s_writers.erase(it);\n        else\n            ++it;\n    }\n}\n\n} // namespace sf\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/SoundFileReader.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOUNDFILEREADER_HPP\n#define SFML_SOUNDFILEREADER_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <string>\n\n\nnamespace sf\n{\nclass InputStream;\n\n////////////////////////////////////////////////////////////\n/// \\brief Abstract base class for sound file decoding\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API SoundFileReader\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Structure holding the audio properties of a sound file\n    ///\n    ////////////////////////////////////////////////////////////\n    struct Info\n    {\n        Uint64       sampleCount;  //!< Total number of samples in the file\n        unsigned int channelCount; //!< Number of channels of the sound\n        unsigned int sampleRate;   //!< Samples rate of the sound, in samples per second\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Virtual destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~SoundFileReader() {}\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open a sound file for reading\n    ///\n    /// The provided stream reference is valid as long as the\n    /// SoundFileReader is alive, so it is safe to use/store it\n    /// during the whole lifetime of the reader.\n    ///\n    /// \\param stream Source stream to read from\n    /// \\param info   Structure to fill with the properties of the loaded sound\n    ///\n    /// \\return True if the file was successfully opened\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool open(InputStream& stream, Info& info) = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current read position to the given sample offset\n    ///\n    /// The sample offset takes the channels into account.\n    /// If you have a time offset instead, you can easily find\n    /// the corresponding sample offset with the following formula:\n    /// `timeInSeconds * sampleRate * channelCount`\n    /// If the given offset exceeds to total number of samples,\n    /// this function must jump to the end of the file.\n    ///\n    /// \\param sampleOffset Index of the sample to jump to, relative to the beginning\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void seek(Uint64 sampleOffset) = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Read audio samples from the open file\n    ///\n    /// \\param samples  Pointer to the sample array to fill\n    /// \\param maxCount Maximum number of samples to read\n    ///\n    /// \\return Number of samples actually read (may be less than \\a maxCount)\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Uint64 read(Int16* samples, Uint64 maxCount) = 0;\n};\n\n} // namespace sf\n\n\n#endif // SFML_SOUNDFILEREADER_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::SoundFileReader\n/// \\ingroup audio\n///\n/// This class allows users to read audio file formats not natively\n/// supported by SFML, and thus extend the set of supported readable\n/// audio formats.\n///\n/// A valid sound file reader must override the open, seek and write functions,\n/// as well as providing a static check function; the latter is used by\n/// SFML to find a suitable writer for a given input file.\n///\n/// To register a new reader, use the sf::SoundFileFactory::registerReader\n/// template function.\n///\n/// Usage example:\n/// \\code\n/// class MySoundFileReader : public sf::SoundFileReader\n/// {\n/// public:\n///\n///     static bool check(sf::InputStream& stream)\n///     {\n///         // typically, read the first few header bytes and check fields that identify the format\n///         // return true if the reader can handle the format\n///     }\n///\n///     virtual bool open(sf::InputStream& stream, Info& info)\n///     {\n///         // read the sound file header and fill the sound attributes\n///         // (channel count, sample count and sample rate)\n///         // return true on success\n///     }\n///\n///     virtual void seek(sf::Uint64 sampleOffset)\n///     {\n///         // advance to the sampleOffset-th sample from the beginning of the sound\n///     }\n///\n///     virtual sf::Uint64 read(sf::Int16* samples, sf::Uint64 maxCount)\n///     {\n///         // read up to 'maxCount' samples into the 'samples' array,\n///         // convert them (for example from normalized float) if they are not stored\n///         // as 16-bits signed integers in the file\n///         // return the actual number of samples read\n///     }\n/// };\n///\n/// sf::SoundFileFactory::registerReader<MySoundFileReader>();\n/// \\endcode\n///\n/// \\see sf::InputSoundFile, sf::SoundFileFactory, sf::SoundFileWriter\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/SoundFileWriter.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOUNDFILEWRITER_HPP\n#define SFML_SOUNDFILEWRITER_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <string>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Abstract base class for sound file encoding\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API SoundFileWriter\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Virtual destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~SoundFileWriter() {}\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open a sound file for writing\n    ///\n    /// \\param filename     Path of the file to open\n    /// \\param sampleRate   Sample rate of the sound\n    /// \\param channelCount Number of channels of the sound\n    ///\n    /// \\return True if the file was successfully opened\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool open(const std::string& filename, unsigned int sampleRate, unsigned int channelCount) = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Write audio samples to the open file\n    ///\n    /// \\param samples Pointer to the sample array to write\n    /// \\param count   Number of samples to write\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void write(const Int16* samples, Uint64 count) = 0;\n};\n\n} // namespace sf\n\n\n#endif // SFML_SOUNDFILEWRITER_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::SoundFileWriter\n/// \\ingroup audio\n///\n/// This class allows users to write audio file formats not natively\n/// supported by SFML, and thus extend the set of supported writable\n/// audio formats.\n///\n/// A valid sound file writer must override the open and write functions,\n/// as well as providing a static check function; the latter is used by\n/// SFML to find a suitable writer for a given filename.\n///\n/// To register a new writer, use the sf::SoundFileFactory::registerWriter\n/// template function.\n///\n/// Usage example:\n/// \\code\n/// class MySoundFileWriter : public sf::SoundFileWriter\n/// {\n/// public:\n///\n///     static bool check(const std::string& filename)\n///     {\n///         // typically, check the extension\n///         // return true if the writer can handle the format\n///     }\n///\n///     virtual bool open(const std::string& filename, unsigned int sampleRate, unsigned int channelCount)\n///     {\n///         // open the file 'filename' for writing,\n///         // write the given sample rate and channel count to the file header\n///         // return true on success\n///     }\n///\n///     virtual void write(const sf::Int16* samples, sf::Uint64 count)\n///     {\n///         // write 'count' samples stored at address 'samples',\n///         // convert them (for example to normalized float) if the format requires it\n///     }\n/// };\n///\n/// sf::SoundFileFactory::registerWriter<MySoundFileWriter>();\n/// \\endcode\n///\n/// \\see sf::OutputSoundFile, sf::SoundFileFactory, sf::SoundFileReader\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/SoundRecorder.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOUNDRECORDER_HPP\n#define SFML_SOUNDRECORDER_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/Audio/AlResource.hpp>\n#include <SFML/System/Thread.hpp>\n#include <SFML/System/Time.hpp>\n#include <vector>\n#include <string>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Abstract base class for capturing sound data\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API SoundRecorder : AlResource\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~SoundRecorder();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Start the capture\n    ///\n    /// The \\a sampleRate parameter defines the number of audio samples\n    /// captured per second. The higher, the better the quality\n    /// (for example, 44100 samples/sec is CD quality).\n    /// This function uses its own thread so that it doesn't block\n    /// the rest of the program while the capture runs.\n    /// Please note that only one capture can happen at the same time.\n    /// You can select which capture device will be used, by passing\n    /// the name to the setDevice() method. If none was selected\n    /// before, the default capture device will be used. You can get a\n    /// list of the names of all available capture devices by calling\n    /// getAvailableDevices().\n    ///\n    /// \\param sampleRate Desired capture rate, in number of samples per second\n    ///\n    /// \\return True, if start of capture was successful\n    ///\n    /// \\see stop, getAvailableDevices\n    ///\n    ////////////////////////////////////////////////////////////\n    bool start(unsigned int sampleRate = 44100);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Stop the capture\n    ///\n    /// \\see start\n    ///\n    ////////////////////////////////////////////////////////////\n    void stop();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the sample rate\n    ///\n    /// The sample rate defines the number of audio samples\n    /// captured per second. The higher, the better the quality\n    /// (for example, 44100 samples/sec is CD quality).\n    ///\n    /// \\return Sample rate, in samples per second\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getSampleRate() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a list of the names of all available audio capture devices\n    ///\n    /// This function returns a vector of strings, containing\n    /// the names of all available audio capture devices.\n    ///\n    /// \\return A vector of strings containing the names\n    ///\n    ////////////////////////////////////////////////////////////\n    static std::vector<std::string> getAvailableDevices();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the name of the default audio capture device\n    ///\n    /// This function returns the name of the default audio\n    /// capture device. If none is available, an empty string\n    /// is returned.\n    ///\n    /// \\return The name of the default audio capture device\n    ///\n    ////////////////////////////////////////////////////////////\n    static std::string getDefaultDevice();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the audio capture device\n    ///\n    /// This function sets the audio capture device to the device\n    /// with the given \\a name. It can be called on the fly (i.e:\n    /// while recording). If you do so while recording and\n    /// opening the device fails, it stops the recording.\n    ///\n    /// \\param name The name of the audio capture device\n    ///\n    /// \\return True, if it was able to set the requested device\n    ///\n    /// \\see getAvailableDevices, getDefaultDevice\n    ///\n    ////////////////////////////////////////////////////////////\n    bool setDevice(const std::string& name);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the name of the current audio capture device\n    ///\n    /// \\return The name of the current audio capture device\n    ///\n    ////////////////////////////////////////////////////////////\n    const std::string& getDevice() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the channel count of the audio capture device\n    ///\n    /// This method allows you to specify the number of channels\n    /// used for recording. Currently only 16-bit mono and\n    /// 16-bit stereo are supported.\n    ///\n    /// \\param channelCount Number of channels. Currently only\n    ///                     mono (1) and stereo (2) are supported.\n    ///\n    /// \\see getChannelCount\n    ///\n    ////////////////////////////////////////////////////////////\n    void setChannelCount(unsigned int channelCount);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the number of channels used by this recorder\n    ///\n    /// Currently only mono and stereo are supported, so the\n    /// value is either 1 (for mono) or 2 (for stereo).\n    ///\n    /// \\return Number of channels\n    ///\n    /// \\see setChannelCount\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getChannelCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if the system supports audio capture\n    ///\n    /// This function should always be called before using\n    /// the audio capture features. If it returns false, then\n    /// any attempt to use sf::SoundRecorder or one of its derived\n    /// classes will fail.\n    ///\n    /// \\return True if audio capture is supported, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isAvailable();\n\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor is only meant to be called by derived classes.\n    ///\n    ////////////////////////////////////////////////////////////\n    SoundRecorder();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the processing interval\n    ///\n    /// The processing interval controls the period\n    /// between calls to the onProcessSamples function. You may\n    /// want to use a small interval if you want to process the\n    /// recorded data in real time, for example.\n    ///\n    /// Note: this is only a hint, the actual period may vary.\n    /// So don't rely on this parameter to implement precise timing.\n    ///\n    /// The default processing interval is 100 ms.\n    ///\n    /// \\param interval Processing interval\n    ///\n    ////////////////////////////////////////////////////////////\n    void setProcessingInterval(Time interval);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Start capturing audio data\n    ///\n    /// This virtual function may be overridden by a derived class\n    /// if something has to be done every time a new capture\n    /// starts. If not, this function can be ignored; the default\n    /// implementation does nothing.\n    ///\n    /// \\return True to start the capture, or false to abort it\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool onStart();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Process a new chunk of recorded samples\n    ///\n    /// This virtual function is called every time a new chunk of\n    /// recorded data is available. The derived class can then do\n    /// whatever it wants with it (storing it, playing it, sending\n    /// it over the network, etc.).\n    ///\n    /// \\param samples     Pointer to the new chunk of recorded samples\n    /// \\param sampleCount Number of samples pointed by \\a samples\n    ///\n    /// \\return True to continue the capture, or false to stop it\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool onProcessSamples(const Int16* samples, std::size_t sampleCount) = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Stop capturing audio data\n    ///\n    /// This virtual function may be overridden by a derived class\n    /// if something has to be done every time the capture\n    /// ends. If not, this function can be ignored; the default\n    /// implementation does nothing.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void onStop();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Function called as the entry point of the thread\n    ///\n    /// This function starts the recording loop, and returns\n    /// only when the capture is stopped.\n    ///\n    ////////////////////////////////////////////////////////////\n    void record();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the new available audio samples and process them\n    ///\n    /// This function is called continuously during the\n    /// capture loop. It retrieves the captured samples and\n    /// forwards them to the derived class.\n    ///\n    ////////////////////////////////////////////////////////////\n    void processCapturedSamples();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Clean up the recorder's internal resources\n    ///\n    /// This function is called when the capture stops.\n    ///\n    ////////////////////////////////////////////////////////////\n    void cleanup();\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Thread             m_thread;             //!< Thread running the background recording task\n    std::vector<Int16> m_samples;            //!< Buffer to store captured samples\n    unsigned int       m_sampleRate;         //!< Sample rate\n    Time               m_processingInterval; //!< Time period between calls to onProcessSamples\n    bool               m_isCapturing;        //!< Capturing state\n    std::string        m_deviceName;         //!< Name of the audio capture device\n    unsigned int       m_channelCount;       //!< Number of recording channels\n};\n\n} // namespace sf\n\n\n#endif // SFML_SOUNDRECORDER_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::SoundRecorder\n/// \\ingroup audio\n///\n/// sf::SoundBuffer provides a simple interface to access\n/// the audio recording capabilities of the computer\n/// (the microphone). As an abstract base class, it only cares\n/// about capturing sound samples, the task of making something\n/// useful with them is left to the derived class. Note that\n/// SFML provides a built-in specialization for saving the\n/// captured data to a sound buffer (see sf::SoundBufferRecorder).\n///\n/// A derived class has only one virtual function to override:\n/// \\li onProcessSamples provides the new chunks of audio samples while the capture happens\n///\n/// Moreover, two additional virtual functions can be overridden\n/// as well if necessary:\n/// \\li onStart is called before the capture happens, to perform custom initializations\n/// \\li onStop is called after the capture ends, to perform custom cleanup\n///\n/// A derived class can also control the frequency of the onProcessSamples\n/// calls, with the setProcessingInterval protected function. The default\n/// interval is chosen so that recording thread doesn't consume too much\n/// CPU, but it can be changed to a smaller value if you need to process\n/// the recorded data in real time, for example.\n///\n/// The audio capture feature may not be supported or activated\n/// on every platform, thus it is recommended to check its\n/// availability with the isAvailable() function. If it returns\n/// false, then any attempt to use an audio recorder will fail.\n///\n/// If you have multiple sound input devices connected to your\n/// computer (for example: microphone, external soundcard, webcam mic, ...)\n/// you can get a list of all available devices through the\n/// getAvailableDevices() function. You can then select a device\n/// by calling setDevice() with the appropriate device. Otherwise\n/// the default capturing device will be used.\n///\n/// By default the recording is in 16-bit mono. Using the\n/// setChannelCount method you can change the number of channels\n/// used by the audio capture device to record. Note that you\n/// have to decide whether you want to record in mono or stereo\n/// before starting the recording.\n///\n/// It is important to note that the audio capture happens in a\n/// separate thread, so that it doesn't block the rest of the\n/// program. In particular, the onProcessSamples virtual function\n/// (but not onStart and not onStop) will be called\n/// from this separate thread. It is important to keep this in\n/// mind, because you may have to take care of synchronization\n/// issues if you share data between threads.\n/// Another thing to bear in mind is that you must call stop()\n/// in the destructor of your derived class, so that the recording\n/// thread finishes before your object is destroyed.\n///\n/// Usage example:\n/// \\code\n/// class CustomRecorder : public sf::SoundRecorder\n/// {\n/// public:\n///     ~CustomRecorder()\n///     {\n///         // Make sure to stop the recording thread\n///         stop();\n///     }\n///\n/// private:\n///     virtual bool onStart() // optional\n///     {\n///         // Initialize whatever has to be done before the capture starts\n///         ...\n///\n///         // Return true to start playing\n///         return true;\n///     }\n///\n///     virtual bool onProcessSamples(const sf::Int16* samples, std::size_t sampleCount)\n///     {\n///         // Do something with the new chunk of samples (store them, send them, ...)\n///         ...\n///\n///         // Return true to continue playing\n///         return true;\n///     }\n///\n///     virtual void onStop() // optional\n///     {\n///         // Clean up whatever has to be done after the capture ends\n///         ...\n///     }\n/// };\n///\n/// // Usage\n/// if (CustomRecorder::isAvailable())\n/// {\n///     CustomRecorder recorder;\n///\n///     if (!recorder.start())\n///         return -1;\n///\n///     ...\n///     recorder.stop();\n/// }\n/// \\endcode\n///\n/// \\see sf::SoundBufferRecorder\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/SoundSource.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOUNDSOURCE_HPP\n#define SFML_SOUNDSOURCE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/Audio/AlResource.hpp>\n#include <SFML/System/Vector3.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Base class defining a sound's properties\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API SoundSource : AlResource\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enumeration of the sound source states\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Status\n    {\n        Stopped, //!< Sound is not playing\n        Paused,  //!< Sound is paused\n        Playing  //!< Sound is playing\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy constructor\n    ///\n    /// \\param copy Instance to copy\n    ///\n    ////////////////////////////////////////////////////////////\n    SoundSource(const SoundSource& copy);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~SoundSource();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the pitch of the sound\n    ///\n    /// The pitch represents the perceived fundamental frequency\n    /// of a sound; thus you can make a sound more acute or grave\n    /// by changing its pitch. A side effect of changing the pitch\n    /// is to modify the playing speed of the sound as well.\n    /// The default value for the pitch is 1.\n    ///\n    /// \\param pitch New pitch to apply to the sound\n    ///\n    /// \\see getPitch\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPitch(float pitch);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the volume of the sound\n    ///\n    /// The volume is a value between 0 (mute) and 100 (full volume).\n    /// The default value for the volume is 100.\n    ///\n    /// \\param volume Volume of the sound\n    ///\n    /// \\see getVolume\n    ///\n    ////////////////////////////////////////////////////////////\n    void setVolume(float volume);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the 3D position of the sound in the audio scene\n    ///\n    /// Only sounds with one channel (mono sounds) can be\n    /// spatialized.\n    /// The default position of a sound is (0, 0, 0).\n    ///\n    /// \\param x X coordinate of the position of the sound in the scene\n    /// \\param y Y coordinate of the position of the sound in the scene\n    /// \\param z Z coordinate of the position of the sound in the scene\n    ///\n    /// \\see getPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPosition(float x, float y, float z);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the 3D position of the sound in the audio scene\n    ///\n    /// Only sounds with one channel (mono sounds) can be\n    /// spatialized.\n    /// The default position of a sound is (0, 0, 0).\n    ///\n    /// \\param position Position of the sound in the scene\n    ///\n    /// \\see getPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPosition(const Vector3f& position);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Make the sound's position relative to the listener or absolute\n    ///\n    /// Making a sound relative to the listener will ensure that it will always\n    /// be played the same way regardless of the position of the listener.\n    /// This can be useful for non-spatialized sounds, sounds that are\n    /// produced by the listener, or sounds attached to it.\n    /// The default value is false (position is absolute).\n    ///\n    /// \\param relative True to set the position relative, false to set it absolute\n    ///\n    /// \\see isRelativeToListener\n    ///\n    ////////////////////////////////////////////////////////////\n    void setRelativeToListener(bool relative);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the minimum distance of the sound\n    ///\n    /// The \"minimum distance\" of a sound is the maximum\n    /// distance at which it is heard at its maximum volume. Further\n    /// than the minimum distance, it will start to fade out according\n    /// to its attenuation factor. A value of 0 (\"inside the head\n    /// of the listener\") is an invalid value and is forbidden.\n    /// The default value of the minimum distance is 1.\n    ///\n    /// \\param distance New minimum distance of the sound\n    ///\n    /// \\see getMinDistance, setAttenuation\n    ///\n    ////////////////////////////////////////////////////////////\n    void setMinDistance(float distance);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the attenuation factor of the sound\n    ///\n    /// The attenuation is a multiplicative factor which makes\n    /// the sound more or less loud according to its distance\n    /// from the listener. An attenuation of 0 will produce a\n    /// non-attenuated sound, i.e. its volume will always be the same\n    /// whether it is heard from near or from far. On the other hand,\n    /// an attenuation value such as 100 will make the sound fade out\n    /// very quickly as it gets further from the listener.\n    /// The default value of the attenuation is 1.\n    ///\n    /// \\param attenuation New attenuation factor of the sound\n    ///\n    /// \\see getAttenuation, setMinDistance\n    ///\n    ////////////////////////////////////////////////////////////\n    void setAttenuation(float attenuation);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the pitch of the sound\n    ///\n    /// \\return Pitch of the sound\n    ///\n    /// \\see setPitch\n    ///\n    ////////////////////////////////////////////////////////////\n    float getPitch() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the volume of the sound\n    ///\n    /// \\return Volume of the sound, in the range [0, 100]\n    ///\n    /// \\see setVolume\n    ///\n    ////////////////////////////////////////////////////////////\n    float getVolume() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the 3D position of the sound in the audio scene\n    ///\n    /// \\return Position of the sound\n    ///\n    /// \\see setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector3f getPosition() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether the sound's position is relative to the\n    ///        listener or is absolute\n    ///\n    /// \\return True if the position is relative, false if it's absolute\n    ///\n    /// \\see setRelativeToListener\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isRelativeToListener() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the minimum distance of the sound\n    ///\n    /// \\return Minimum distance of the sound\n    ///\n    /// \\see setMinDistance, getAttenuation\n    ///\n    ////////////////////////////////////////////////////////////\n    float getMinDistance() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the attenuation factor of the sound\n    ///\n    /// \\return Attenuation factor of the sound\n    ///\n    /// \\see setAttenuation, getMinDistance\n    ///\n    ////////////////////////////////////////////////////////////\n    float getAttenuation() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of assignment operator\n    ///\n    /// \\param right Instance to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    SoundSource& operator =(const SoundSource& right);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Start or resume playing the sound source\n    ///\n    /// This function starts the source if it was stopped, resumes\n    /// it if it was paused, and restarts it from the beginning if\n    /// it was already playing.\n    ///\n    /// \\see pause, stop\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void play() = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Pause the sound source\n    ///\n    /// This function pauses the source if it was playing,\n    /// otherwise (source already paused or stopped) it has no effect.\n    ///\n    /// \\see play, stop\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void pause() = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Stop playing the sound source\n    ///\n    /// This function stops the source if it was playing or paused,\n    /// and does nothing if it was already stopped.\n    /// It also resets the playing position (unlike pause()).\n    ///\n    /// \\see play, pause\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void stop() = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current status of the sound (stopped, paused, playing)\n    ///\n    /// \\return Current status of the sound\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Status getStatus() const;\n\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor is meant to be called by derived classes only.\n    ///\n    ////////////////////////////////////////////////////////////\n    SoundSource();\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    unsigned int m_source; //!< OpenAL source identifier\n};\n\n} // namespace sf\n\n\n#endif // SFML_SOUNDSOURCE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::SoundSource\n/// \\ingroup audio\n///\n/// sf::SoundSource is not meant to be used directly, it\n/// only serves as a common base for all audio objects\n/// that can live in the audio environment.\n///\n/// It defines several properties for the sound: pitch,\n/// volume, position, attenuation, etc. All of them can be\n/// changed at any time with no impact on performances.\n///\n/// \\see sf::Sound, sf::SoundStream\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio/SoundStream.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOUNDSTREAM_HPP\n#define SFML_SOUNDSTREAM_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Audio/Export.hpp>\n#include <SFML/Audio/SoundSource.hpp>\n#include <SFML/System/Thread.hpp>\n#include <SFML/System/Time.hpp>\n#include <SFML/System/Mutex.hpp>\n#include <cstdlib>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Abstract base class for streamed audio sources\n///\n////////////////////////////////////////////////////////////\nclass SFML_AUDIO_API SoundStream : public SoundSource\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Structure defining a chunk of audio data to stream\n    ///\n    ////////////////////////////////////////////////////////////\n    struct Chunk\n    {\n        const Int16* samples;     //!< Pointer to the audio samples\n        std::size_t  sampleCount; //!< Number of samples pointed by Samples\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~SoundStream();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Start or resume playing the audio stream\n    ///\n    /// This function starts the stream if it was stopped, resumes\n    /// it if it was paused, and restarts it from the beginning if\n    /// it was already playing.\n    /// This function uses its own thread so that it doesn't block\n    /// the rest of the program while the stream is played.\n    ///\n    /// \\see pause, stop\n    ///\n    ////////////////////////////////////////////////////////////\n    void play();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Pause the audio stream\n    ///\n    /// This function pauses the stream if it was playing,\n    /// otherwise (stream already paused or stopped) it has no effect.\n    ///\n    /// \\see play, stop\n    ///\n    ////////////////////////////////////////////////////////////\n    void pause();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Stop playing the audio stream\n    ///\n    /// This function stops the stream if it was playing or paused,\n    /// and does nothing if it was already stopped.\n    /// It also resets the playing position (unlike pause()).\n    ///\n    /// \\see play, pause\n    ///\n    ////////////////////////////////////////////////////////////\n    void stop();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the number of channels of the stream\n    ///\n    /// 1 channel means a mono sound, 2 means stereo, etc.\n    ///\n    /// \\return Number of channels\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getChannelCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the stream sample rate of the stream\n    ///\n    /// The sample rate is the number of audio samples played per\n    /// second. The higher, the better the quality.\n    ///\n    /// \\return Sample rate, in number of samples per second\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getSampleRate() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current status of the stream (stopped, paused, playing)\n    ///\n    /// \\return Current status\n    ///\n    ////////////////////////////////////////////////////////////\n    Status getStatus() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current playing position of the stream\n    ///\n    /// The playing position can be changed when the stream is\n    /// either paused or playing. Changing the playing position\n    /// when the stream is stopped has no effect, since playing\n    /// the stream would reset its position.\n    ///\n    /// \\param timeOffset New playing position, from the beginning of the stream\n    ///\n    /// \\see getPlayingOffset\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPlayingOffset(Time timeOffset);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current playing position of the stream\n    ///\n    /// \\return Current playing position, from the beginning of the stream\n    ///\n    /// \\see setPlayingOffset\n    ///\n    ////////////////////////////////////////////////////////////\n    Time getPlayingOffset() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set whether or not the stream should loop after reaching the end\n    ///\n    /// If set, the stream will restart from beginning after\n    /// reaching the end and so on, until it is stopped or\n    /// setLoop(false) is called.\n    /// The default looping state for streams is false.\n    ///\n    /// \\param loop True to play in loop, false to play once\n    ///\n    /// \\see getLoop\n    ///\n    ////////////////////////////////////////////////////////////\n    void setLoop(bool loop);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether or not the stream is in loop mode\n    ///\n    /// \\return True if the stream is looping, false otherwise\n    ///\n    /// \\see setLoop\n    ///\n    ////////////////////////////////////////////////////////////\n    bool getLoop() const;\n\nprotected:\n\n    enum\n    {\n        NoLoop = -1 //!< \"Invalid\" endSeeks value, telling us to continue uninterrupted\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor is only meant to be called by derived classes.\n    ///\n    ////////////////////////////////////////////////////////////\n    SoundStream();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Define the audio stream parameters\n    ///\n    /// This function must be called by derived classes as soon\n    /// as they know the audio settings of the stream to play.\n    /// Any attempt to manipulate the stream (play(), ...) before\n    /// calling this function will fail.\n    /// It can be called multiple times if the settings of the\n    /// audio stream change, but only when the stream is stopped.\n    ///\n    /// \\param channelCount Number of channels of the stream\n    /// \\param sampleRate   Sample rate, in samples per second\n    ///\n    ////////////////////////////////////////////////////////////\n    void initialize(unsigned int channelCount, unsigned int sampleRate);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Request a new chunk of audio samples from the stream source\n    ///\n    /// This function must be overridden by derived classes to provide\n    /// the audio samples to play. It is called continuously by the\n    /// streaming loop, in a separate thread.\n    /// The source can choose to stop the streaming loop at any time, by\n    /// returning false to the caller.\n    /// If you return true (i.e. continue streaming) it is important that\n    /// the returned array of samples is not empty; this would stop the stream\n    /// due to an internal limitation.\n    ///\n    /// \\param data Chunk of data to fill\n    ///\n    /// \\return True to continue playback, false to stop\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool onGetData(Chunk& data) = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current playing position in the stream source\n    ///\n    /// This function must be overridden by derived classes to\n    /// allow random seeking into the stream source.\n    ///\n    /// \\param timeOffset New playing position, relative to the beginning of the stream\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void onSeek(Time timeOffset) = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current playing position in the stream source to the beginning of the loop\n    ///\n    /// This function can be overridden by derived classes to\n    /// allow implementation of custom loop points. Otherwise,\n    /// it just calls onSeek(Time::Zero) and returns 0.\n    ///\n    /// \\return The seek position after looping (or -1 if there's no loop)\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 onLoop();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the processing interval\n    ///\n    /// The processing interval controls the period at which the\n    /// audio buffers are filled by calls to onGetData. A smaller\n    /// interval may be useful for low-latency streams. Note that\n    /// the given period is only a hint and the actual period may\n    /// vary. The default processing interval is 10 ms.\n    ///\n    /// \\param interval Processing interval\n    ///\n    ////////////////////////////////////////////////////////////\n    void setProcessingInterval(Time interval);\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Function called as the entry point of the thread\n    ///\n    /// This function starts the streaming loop, and returns\n    /// only when the sound is stopped.\n    ///\n    ////////////////////////////////////////////////////////////\n    void streamData();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Fill a new buffer with audio samples, and append\n    ///        it to the playing queue\n    ///\n    /// This function is called as soon as a buffer has been fully\n    /// consumed; it fills it again and inserts it back into the\n    /// playing queue.\n    ///\n    /// \\param bufferNum Number of the buffer to fill (in [0, BufferCount])\n    /// \\param immediateLoop Treat empty buffers as spent, and act on loops immediately\n    ///\n    /// \\return True if the stream source has requested to stop, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    bool fillAndPushBuffer(unsigned int bufferNum, bool immediateLoop = false);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Fill the audio buffers and put them all into the playing queue\n    ///\n    /// This function is called when playing starts and the\n    /// playing queue is empty.\n    ///\n    /// \\return True if the derived class has requested to stop, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    bool fillQueue();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Clear all the audio buffers and empty the playing queue\n    ///\n    /// This function is called when the stream is stopped.\n    ///\n    ////////////////////////////////////////////////////////////\n    void clearQueue();\n\n    enum\n    {\n        BufferCount = 3,    //!< Number of audio buffers used by the streaming loop\n        BufferRetries = 2   //!< Number of retries (excluding initial try) for onGetData()\n    };\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Thread        m_thread;                   //!< Thread running the background tasks\n    mutable Mutex m_threadMutex;              //!< Thread mutex\n    Status        m_threadStartState;         //!< State the thread starts in (Playing, Paused, Stopped)\n    bool          m_isStreaming;              //!< Streaming state (true = playing, false = stopped)\n    unsigned int  m_buffers[BufferCount];     //!< Sound buffers used to store temporary audio data\n    unsigned int  m_channelCount;             //!< Number of channels (1 = mono, 2 = stereo, ...)\n    unsigned int  m_sampleRate;               //!< Frequency (samples / second)\n    Int32         m_format;                   //!< Format of the internal sound buffers\n    bool          m_loop;                     //!< Loop flag (true to loop, false to play once)\n    Uint64        m_samplesProcessed;         //!< Number of samples processed since beginning of the stream\n    Int64         m_bufferSeeks[BufferCount]; //!< If buffer is an \"end buffer\", holds next seek position, else NoLoop. For play offset calculation.\n    Time          m_processingInterval;       //!< Interval for checking and filling the internal sound buffers.\n};\n\n} // namespace sf\n\n\n#endif // SFML_SOUNDSTREAM_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::SoundStream\n/// \\ingroup audio\n///\n/// Unlike audio buffers (see sf::SoundBuffer), audio streams\n/// are never completely loaded in memory. Instead, the audio\n/// data is acquired continuously while the stream is playing.\n/// This behavior allows to play a sound with no loading delay,\n/// and keeps the memory consumption very low.\n///\n/// Sound sources that need to be streamed are usually big files\n/// (compressed audio musics that would eat hundreds of MB in memory)\n/// or files that would take a lot of time to be received\n/// (sounds played over the network).\n///\n/// sf::SoundStream is a base class that doesn't care about the\n/// stream source, which is left to the derived class. SFML provides\n/// a built-in specialization for big files (see sf::Music).\n/// No network stream source is provided, but you can write your own\n/// by combining this class with the network module.\n///\n/// A derived class has to override two virtual functions:\n/// \\li onGetData fills a new chunk of audio data to be played\n/// \\li onSeek changes the current playing position in the source\n///\n/// It is important to note that each SoundStream is played in its\n/// own separate thread, so that the streaming loop doesn't block the\n/// rest of the program. In particular, the OnGetData and OnSeek\n/// virtual functions may sometimes be called from this separate thread.\n/// It is important to keep this in mind, because you may have to take\n/// care of synchronization issues if you share data between threads.\n///\n/// Usage example:\n/// \\code\n/// class CustomStream : public sf::SoundStream\n/// {\n/// public:\n///\n///     bool open(const std::string& location)\n///     {\n///         // Open the source and get audio settings\n///         ...\n///         unsigned int channelCount = ...;\n///         unsigned int sampleRate = ...;\n///\n///         // Initialize the stream -- important!\n///         initialize(channelCount, sampleRate);\n///     }\n///\n/// private:\n///\n///     virtual bool onGetData(Chunk& data)\n///     {\n///         // Fill the chunk with audio data from the stream source\n///         // (note: must not be empty if you want to continue playing)\n///         data.samples = ...;\n///         data.sampleCount = ...;\n///\n///         // Return true to continue playing\n///         return true;\n///     }\n///\n///     virtual void onSeek(sf::Time timeOffset)\n///     {\n///         // Change the current position in the stream source\n///         ...\n///     }\n/// };\n///\n/// // Usage\n/// CustomStream stream;\n/// stream.open(\"path/to/stream\");\n/// stream.play();\n/// \\endcode\n///\n/// \\see sf::Music\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Audio.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_AUDIO_HPP\n#define SFML_AUDIO_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n\n#include <SFML/System.hpp>\n#include <SFML/Audio/InputSoundFile.hpp>\n#include <SFML/Audio/Listener.hpp>\n#include <SFML/Audio/Music.hpp>\n#include <SFML/Audio/OutputSoundFile.hpp>\n#include <SFML/Audio/Sound.hpp>\n#include <SFML/Audio/SoundBuffer.hpp>\n#include <SFML/Audio/SoundBufferRecorder.hpp>\n#include <SFML/Audio/SoundFileFactory.hpp>\n#include <SFML/Audio/SoundFileReader.hpp>\n#include <SFML/Audio/SoundFileWriter.hpp>\n#include <SFML/Audio/SoundRecorder.hpp>\n#include <SFML/Audio/SoundSource.hpp>\n#include <SFML/Audio/SoundStream.hpp>\n\n\n#endif // SFML_AUDIO_HPP\n\n////////////////////////////////////////////////////////////\n/// \\defgroup audio Audio module\n///\n/// Sounds, streaming (musics or custom sources), recording,\n/// spatialization.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Config.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_CONFIG_HPP\n#define SFML_CONFIG_HPP\n\n\n////////////////////////////////////////////////////////////\n// Define the SFML version\n////////////////////////////////////////////////////////////\n#define SFML_VERSION_MAJOR 2\n#define SFML_VERSION_MINOR 6\n#define SFML_VERSION_PATCH 1\n\n\n////////////////////////////////////////////////////////////\n// Identify the operating system\n// see https://sourceforge.net/p/predef/wiki/Home/\n////////////////////////////////////////////////////////////\n#if defined(_WIN32)\n\n    // Windows\n    #define SFML_SYSTEM_WINDOWS\n    #ifndef NOMINMAX\n        #define NOMINMAX\n    #endif\n\n#elif defined(__APPLE__) && defined(__MACH__)\n\n    // Apple platform, see which one it is\n    #include \"TargetConditionals.h\"\n\n    #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR\n\n        // iOS\n        #define SFML_SYSTEM_IOS\n\n    #elif TARGET_OS_MAC\n\n        // MacOS\n        #define SFML_SYSTEM_MACOS\n\n    #else\n\n        // Unsupported Apple system\n        #error This Apple operating system is not supported by SFML library\n\n    #endif\n\n#elif defined(__unix__)\n\n    // UNIX system, see which one it is\n    #if defined(__ANDROID__)\n\n        // Android\n        #define SFML_SYSTEM_ANDROID\n\n    #elif defined(__linux__)\n\n         // Linux\n        #define SFML_SYSTEM_LINUX\n\n    #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n\n        // FreeBSD\n        #define SFML_SYSTEM_FREEBSD\n\n    #elif defined(__OpenBSD__)\n\n        // OpenBSD\n        #define SFML_SYSTEM_OPENBSD\n\n    #elif defined(__NetBSD__)\n\n        // NetBSD\n        #define SFML_SYSTEM_NETBSD\n\n    #else\n\n        // Unsupported UNIX system\n        #error This UNIX operating system is not supported by SFML library\n\n    #endif\n\n#else\n\n    // Unsupported system\n    #error This operating system is not supported by SFML library\n\n#endif\n\n\n////////////////////////////////////////////////////////////\n// Define a portable debug macro\n////////////////////////////////////////////////////////////\n#if !defined(NDEBUG)\n\n    #define SFML_DEBUG\n\n#endif\n\n\n////////////////////////////////////////////////////////////\n// Define helpers to create portable import / export macros for each module\n////////////////////////////////////////////////////////////\n#if !defined(SFML_STATIC)\n\n    #if defined(SFML_SYSTEM_WINDOWS)\n\n        // Windows compilers need specific (and different) keywords for export and import\n        #define SFML_API_EXPORT __declspec(dllexport)\n        #define SFML_API_IMPORT __declspec(dllimport)\n\n        // For Visual C++ compilers, we also need to turn off this annoying C4251 warning\n        #ifdef _MSC_VER\n\n            #pragma warning(disable: 4251)\n\n        #endif\n\n    #else // Linux, FreeBSD, Mac OS X\n\n        #if __GNUC__ >= 4\n\n            // GCC 4 has special keywords for showing/hidding symbols,\n            // the same keyword is used for both importing and exporting\n            #define SFML_API_EXPORT __attribute__ ((__visibility__ (\"default\")))\n            #define SFML_API_IMPORT __attribute__ ((__visibility__ (\"default\")))\n\n        #else\n\n            // GCC < 4 has no mechanism to explicitely hide symbols, everything's exported\n            #define SFML_API_EXPORT\n            #define SFML_API_IMPORT\n\n        #endif\n\n    #endif\n\n#else\n\n    // Static build doesn't need import/export macros\n    #define SFML_API_EXPORT\n    #define SFML_API_IMPORT\n\n#endif\n\n\n////////////////////////////////////////////////////////////\n// Cross-platform warning for deprecated functions and classes\n//\n// Usage:\n// class SFML_DEPRECATED MyClass\n// {\n//     SFML_DEPRECATED void memberFunc();\n// };\n//\n// SFML_DEPRECATED void globalFunc();\n////////////////////////////////////////////////////////////\n#if defined(SFML_NO_DEPRECATED_WARNINGS)\n\n    // User explicitly requests to disable deprecation warnings\n    #define SFML_DEPRECATED\n\n#elif defined(_MSC_VER)\n\n    // Microsoft C++ compiler\n    // Note: On newer MSVC versions, using deprecated functions causes a compiler error. In order to\n    // trigger a warning instead of an error, the compiler flag /sdl- (instead of /sdl) must be specified.\n    #define SFML_DEPRECATED __declspec(deprecated)\n\n#elif defined(__GNUC__)\n\n    // g++ and Clang\n    #define SFML_DEPRECATED __attribute__ ((deprecated))\n\n#else\n\n    // Other compilers are not supported, leave class or function as-is.\n    // With a bit of luck, the #pragma directive works, otherwise users get a warning (no error!) for unrecognized #pragma.\n    #pragma message(\"SFML_DEPRECATED is not supported for your compiler, please contact the SFML team\")\n    #define SFML_DEPRECATED\n\n#endif\n\n\n////////////////////////////////////////////////////////////\n// Define portable fixed-size types\n////////////////////////////////////////////////////////////\nnamespace sf\n{\n    // All \"common\" platforms use the same size for char, short and int\n    // (basically there are 3 types for 3 sizes, so no other match is possible),\n    // we can use them without doing any kind of check\n\n    // 8 bits integer types\n    typedef signed   char Int8;\n    typedef unsigned char Uint8;\n\n    // 16 bits integer types\n    typedef signed   short Int16;\n    typedef unsigned short Uint16;\n\n    // 32 bits integer types\n    typedef signed   int Int32;\n    typedef unsigned int Uint32;\n\n    // 64 bits integer types\n    #if defined(_MSC_VER)\n        typedef signed   __int64 Int64;\n        typedef unsigned __int64 Uint64;\n    #else\n        #if defined(__clang__)\n            #pragma clang diagnostic push\n            #pragma clang diagnostic ignored \"-Wc++11-long-long\"\n        #endif\n        typedef signed   long long Int64;\n        typedef unsigned long long Uint64;\n        #if defined(__clang__)\n            #pragma clang diagnostic pop\n        #endif\n    #endif\n\n} // namespace sf\n\n\n#endif // SFML_CONFIG_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/GpuPreference.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_GPUPREFERENCE_HPP\n#define SFML_GPUPREFERENCE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n\n////////////////////////////////////////////////////////////\n/// \\file\n///\n/// \\brief File containing SFML_DEFINE_DISCRETE_GPU_PREFERENCE\n///\n////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////\n/// \\def SFML_DEFINE_DISCRETE_GPU_PREFERENCE\n///\n/// \\brief A macro to encourage usage of the discrete GPU\n///\n/// In order to inform the Nvidia/AMD driver that an SFML\n/// application could benefit from using the more powerful\n/// discrete GPU, special symbols have to be publicly\n/// exported from the final executable.\n///\n/// SFML defines a helper macro to easily do this.\n///\n/// Place SFML_DEFINE_DISCRETE_GPU_PREFERENCE in the\n/// global scope of a source file that will be linked into\n/// the final executable. Typically it is best to place it\n/// where the main function is also defined.\n///\n////////////////////////////////////////////////////////////\n#if defined(SFML_SYSTEM_WINDOWS)\n\n    #define SFML_DEFINE_DISCRETE_GPU_PREFERENCE \\\n                extern \"C\" __declspec(dllexport) unsigned long NvOptimusEnablement = 1; \\\n                extern \"C\" __declspec(dllexport) unsigned long AmdPowerXpressRequestHighPerformance = 1;\n\n#else\n\n    #define SFML_DEFINE_DISCRETE_GPU_PREFERENCE\n\n#endif\n\n\n#endif // SFML_GPUPREFERENCE_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/BlendMode.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_BLENDMODE_HPP\n#define SFML_BLENDMODE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n\n\nnamespace sf\n{\n\n////////////////////////////////////////////////////////////\n/// \\brief Blending modes for drawing\n///\n////////////////////////////////////////////////////////////\nstruct SFML_GRAPHICS_API BlendMode\n{\n    ////////////////////////////////////////////////////////\n    /// \\brief Enumeration of the blending factors\n    ///\n    /// The factors are mapped directly to their OpenGL equivalents,\n    /// specified by glBlendFunc() or glBlendFuncSeparate().\n    ////////////////////////////////////////////////////////\n    enum Factor\n    {\n        Zero,             //!< (0, 0, 0, 0)\n        One,              //!< (1, 1, 1, 1)\n        SrcColor,         //!< (src.r, src.g, src.b, src.a)\n        OneMinusSrcColor, //!< (1, 1, 1, 1) - (src.r, src.g, src.b, src.a)\n        DstColor,         //!< (dst.r, dst.g, dst.b, dst.a)\n        OneMinusDstColor, //!< (1, 1, 1, 1) - (dst.r, dst.g, dst.b, dst.a)\n        SrcAlpha,         //!< (src.a, src.a, src.a, src.a)\n        OneMinusSrcAlpha, //!< (1, 1, 1, 1) - (src.a, src.a, src.a, src.a)\n        DstAlpha,         //!< (dst.a, dst.a, dst.a, dst.a)\n        OneMinusDstAlpha  //!< (1, 1, 1, 1) - (dst.a, dst.a, dst.a, dst.a)\n    };\n\n    ////////////////////////////////////////////////////////\n    /// \\brief Enumeration of the blending equations\n    ///\n    /// The equations are mapped directly to their OpenGL equivalents,\n    /// specified by glBlendEquation() or glBlendEquationSeparate().\n    ////////////////////////////////////////////////////////\n    enum Equation\n    {\n        Add,             //!< Pixel = Src * SrcFactor + Dst * DstFactor\n        Subtract,        //!< Pixel = Src * SrcFactor - Dst * DstFactor\n        ReverseSubtract, //!< Pixel = Dst * DstFactor - Src * SrcFactor\n        Min,             //!< Pixel = min(Dst, Src)\n        Max              //!< Pixel = max(Dst, Src)\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Constructs a blending mode that does alpha blending.\n    ///\n    ////////////////////////////////////////////////////////////\n    BlendMode();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the blend mode given the factors and equation.\n    ///\n    /// This constructor uses the same factors and equation for both\n    /// color and alpha components. It also defaults to the Add equation.\n    ///\n    /// \\param sourceFactor      Specifies how to compute the source factor for the color and alpha channels.\n    /// \\param destinationFactor Specifies how to compute the destination factor for the color and alpha channels.\n    /// \\param blendEquation     Specifies how to combine the source and destination colors and alpha.\n    ///\n    ////////////////////////////////////////////////////////////\n    BlendMode(Factor sourceFactor, Factor destinationFactor, Equation blendEquation = Add);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the blend mode given the factors and equation.\n    ///\n    /// \\param colorSourceFactor      Specifies how to compute the source factor for the color channels.\n    /// \\param colorDestinationFactor Specifies how to compute the destination factor for the color channels.\n    /// \\param colorBlendEquation     Specifies how to combine the source and destination colors.\n    /// \\param alphaSourceFactor      Specifies how to compute the source factor.\n    /// \\param alphaDestinationFactor Specifies how to compute the destination factor.\n    /// \\param alphaBlendEquation     Specifies how to combine the source and destination alphas.\n    ///\n    ////////////////////////////////////////////////////////////\n    BlendMode(Factor colorSourceFactor, Factor colorDestinationFactor,\n              Equation colorBlendEquation, Factor alphaSourceFactor,\n              Factor alphaDestinationFactor, Equation alphaBlendEquation);\n\n    ////////////////////////////////////////////////////////////\n    // Member Data\n    ////////////////////////////////////////////////////////////\n    Factor   colorSrcFactor; //!< Source blending factor for the color channels\n    Factor   colorDstFactor; //!< Destination blending factor for the color channels\n    Equation colorEquation;  //!< Blending equation for the color channels\n    Factor   alphaSrcFactor; //!< Source blending factor for the alpha channel\n    Factor   alphaDstFactor; //!< Destination blending factor for the alpha channel\n    Equation alphaEquation;  //!< Blending equation for the alpha channel\n};\n\n////////////////////////////////////////////////////////////\n/// \\relates BlendMode\n/// \\brief Overload of the == operator\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return True if blending modes are equal, false if they are different\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API bool operator ==(const BlendMode& left, const BlendMode& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates BlendMode\n/// \\brief Overload of the != operator\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return True if blending modes are different, false if they are equal\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API bool operator !=(const BlendMode& left, const BlendMode& right);\n\n////////////////////////////////////////////////////////////\n// Commonly used blending modes\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API extern const BlendMode BlendAlpha;    //!< Blend source and dest according to dest alpha\nSFML_GRAPHICS_API extern const BlendMode BlendAdd;      //!< Add source to dest\nSFML_GRAPHICS_API extern const BlendMode BlendMultiply; //!< Multiply source and dest\nSFML_GRAPHICS_API extern const BlendMode BlendMin;      //!< Take minimum between source and dest\nSFML_GRAPHICS_API extern const BlendMode BlendMax;      //!< Take maximum between source and dest\nSFML_GRAPHICS_API extern const BlendMode BlendNone;     //!< Overwrite dest with source\n\n} // namespace sf\n\n\n#endif // SFML_BLENDMODE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::BlendMode\n/// \\ingroup graphics\n///\n/// sf::BlendMode is a class that represents a blend mode. A blend\n/// mode determines how the colors of an object you draw are\n/// mixed with the colors that are already in the buffer.\n///\n/// The class is composed of 6 components, each of which has its\n/// own public member variable:\n/// \\li %Color Source Factor (@ref colorSrcFactor)\n/// \\li %Color Destination Factor (@ref colorDstFactor)\n/// \\li %Color Blend Equation (@ref colorEquation)\n/// \\li Alpha Source Factor (@ref alphaSrcFactor)\n/// \\li Alpha Destination Factor (@ref alphaDstFactor)\n/// \\li Alpha Blend Equation (@ref alphaEquation)\n///\n/// The source factor specifies how the pixel you are drawing contributes\n/// to the final color. The destination factor specifies how the pixel\n/// already drawn in the buffer contributes to the final color.\n///\n/// The color channels RGB (red, green, blue; simply referred to as\n/// color) and A (alpha; the transparency) can be treated separately. This\n/// separation can be useful for specific blend modes, but most often you\n/// won't need it and will simply treat the color as a single unit.\n///\n/// The blend factors and equations correspond to their OpenGL equivalents.\n/// In general, the color of the resulting pixel is calculated according\n/// to the following formula (\\a src is the color of the source pixel, \\a dst\n/// the color of the destination pixel, the other variables correspond to the\n/// public members, with the equations being + or - operators):\n/// \\code\n/// dst.rgb = colorSrcFactor * src.rgb (colorEquation) colorDstFactor * dst.rgb\n/// dst.a   = alphaSrcFactor * src.a   (alphaEquation) alphaDstFactor * dst.a\n/// \\endcode\n/// All factors and colors are represented as floating point numbers between\n/// 0 and 1. Where necessary, the result is clamped to fit in that range.\n///\n/// The most common blending modes are defined as constants\n/// in the sf namespace:\n///\n/// \\code\n/// sf::BlendMode alphaBlending          = sf::BlendAlpha;\n/// sf::BlendMode additiveBlending       = sf::BlendAdd;\n/// sf::BlendMode multiplicativeBlending = sf::BlendMultiply;\n/// sf::BlendMode noBlending             = sf::BlendNone;\n/// \\endcode\n///\n/// In SFML, a blend mode can be specified every time you draw a sf::Drawable\n/// object to a render target. It is part of the sf::RenderStates compound\n/// that is passed to the member function sf::RenderTarget::draw().\n///\n/// \\see sf::RenderStates, sf::RenderTarget\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/CircleShape.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_CIRCLESHAPE_HPP\n#define SFML_CIRCLESHAPE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Shape.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Specialized shape representing a circle\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API CircleShape : public Shape\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// \\param radius     Radius of the circle\n    /// \\param pointCount Number of points composing the circle\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit CircleShape(float radius = 0, std::size_t pointCount = 30);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the radius of the circle\n    ///\n    /// \\param radius New radius of the circle\n    ///\n    /// \\see getRadius\n    ///\n    ////////////////////////////////////////////////////////////\n    void setRadius(float radius);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the radius of the circle\n    ///\n    /// \\return Radius of the circle\n    ///\n    /// \\see setRadius\n    ///\n    ////////////////////////////////////////////////////////////\n    float getRadius() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the number of points of the circle\n    ///\n    /// \\param count New number of points of the circle\n    ///\n    /// \\see getPointCount\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPointCount(std::size_t count);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the number of points of the circle\n    ///\n    /// \\return Number of points of the circle\n    ///\n    /// \\see setPointCount\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual std::size_t getPointCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a point of the circle\n    ///\n    /// The returned point is in local coordinates, that is,\n    /// the shape's transforms (position, rotation, scale) are\n    /// not taken into account.\n    /// The result is undefined if \\a index is out of the valid range.\n    ///\n    /// \\param index Index of the point to get, in range [0 .. getPointCount() - 1]\n    ///\n    /// \\return index-th point of the shape\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Vector2f getPoint(std::size_t index) const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    float       m_radius;     //!< Radius of the circle\n    std::size_t m_pointCount; //!< Number of points composing the circle\n};\n\n} // namespace sf\n\n\n#endif // SFML_CIRCLESHAPE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::CircleShape\n/// \\ingroup graphics\n///\n/// This class inherits all the functions of sf::Transformable\n/// (position, rotation, scale, bounds, ...) as well as the\n/// functions of sf::Shape (outline, color, texture, ...).\n///\n/// Usage example:\n/// \\code\n/// sf::CircleShape circle;\n/// circle.setRadius(150);\n/// circle.setOutlineColor(sf::Color::Red);\n/// circle.setOutlineThickness(5);\n/// circle.setPosition(10, 20);\n/// ...\n/// window.draw(circle);\n/// \\endcode\n///\n/// Since the graphics card can't draw perfect circles, we have to\n/// fake them with multiple triangles connected to each other. The\n/// \"points count\" property of sf::CircleShape defines how many of these\n/// triangles to use, and therefore defines the quality of the circle.\n///\n/// The number of points can also be used for another purpose; with\n/// small numbers you can create any regular polygon shape:\n/// equilateral triangle, square, pentagon, hexagon, ...\n///\n/// \\see sf::Shape, sf::RectangleShape, sf::ConvexShape\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Color.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_COLOR_HPP\n#define SFML_COLOR_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Utility class for manipulating RGBA colors\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Color\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Constructs an opaque black color. It is equivalent to\n    /// sf::Color(0, 0, 0, 255).\n    ///\n    ////////////////////////////////////////////////////////////\n    Color();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the color from its 4 RGBA components\n    ///\n    /// \\param red   Red component (in the range [0, 255])\n    /// \\param green Green component (in the range [0, 255])\n    /// \\param blue  Blue component (in the range [0, 255])\n    /// \\param alpha Alpha (opacity) component (in the range [0, 255])\n    ///\n    ////////////////////////////////////////////////////////////\n    Color(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha = 255);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the color from 32-bit unsigned integer\n    ///\n    /// \\param color Number containing the RGBA components (in that order)\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit Color(Uint32 color);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Retrieve the color as a 32-bit unsigned integer\n    ///\n    /// \\return Color represented as a 32-bit unsigned integer\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint32 toInteger() const;\n\n    ////////////////////////////////////////////////////////////\n    // Static member data\n    ////////////////////////////////////////////////////////////\n    static const Color Black;       //!< Black predefined color\n    static const Color White;       //!< White predefined color\n    static const Color Red;         //!< Red predefined color\n    static const Color Green;       //!< Green predefined color\n    static const Color Blue;        //!< Blue predefined color\n    static const Color Yellow;      //!< Yellow predefined color\n    static const Color Magenta;     //!< Magenta predefined color\n    static const Color Cyan;        //!< Cyan predefined color\n    static const Color Transparent; //!< Transparent (black) predefined color\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Uint8 r; //!< Red component\n    Uint8 g; //!< Green component\n    Uint8 b; //!< Blue component\n    Uint8 a; //!< Alpha (opacity) component\n};\n\n////////////////////////////////////////////////////////////\n/// \\relates Color\n/// \\brief Overload of the == operator\n///\n/// This operator compares two colors and check if they are equal.\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return True if colors are equal, false if they are different\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API bool operator ==(const Color& left, const Color& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Color\n/// \\brief Overload of the != operator\n///\n/// This operator compares two colors and check if they are different.\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return True if colors are different, false if they are equal\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API bool operator !=(const Color& left, const Color& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Color\n/// \\brief Overload of the binary + operator\n///\n/// This operator returns the component-wise sum of two colors.\n/// Components that exceed 255 are clamped to 255.\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return Result of \\a left + \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API Color operator +(const Color& left, const Color& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Color\n/// \\brief Overload of the binary - operator\n///\n/// This operator returns the component-wise subtraction of two colors.\n/// Components below 0 are clamped to 0.\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return Result of \\a left - \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API Color operator -(const Color& left, const Color& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Color\n/// \\brief Overload of the binary * operator\n///\n/// This operator returns the component-wise multiplication\n/// (also called \"modulation\") of two colors.\n/// Components are then divided by 255 so that the result is\n/// still in the range [0, 255].\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return Result of \\a left * \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API Color operator *(const Color& left, const Color& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Color\n/// \\brief Overload of the binary += operator\n///\n/// This operator computes the component-wise sum of two colors,\n/// and assigns the result to the left operand.\n/// Components that exceed 255 are clamped to 255.\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API Color& operator +=(Color& left, const Color& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Color\n/// \\brief Overload of the binary -= operator\n///\n/// This operator computes the component-wise subtraction of two colors,\n/// and assigns the result to the left operand.\n/// Components below 0 are clamped to 0.\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API Color& operator -=(Color& left, const Color& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Color\n/// \\brief Overload of the binary *= operator\n///\n/// This operator returns the component-wise multiplication\n/// (also called \"modulation\") of two colors, and assigns\n/// the result to the left operand.\n/// Components are then divided by 255 so that the result is\n/// still in the range [0, 255].\n///\n/// \\param left  Left operand\n/// \\param right Right operand\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API Color& operator *=(Color& left, const Color& right);\n\n} // namespace sf\n\n\n#endif // SFML_COLOR_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Color\n/// \\ingroup graphics\n///\n/// sf::Color is a simple color class composed of 4 components:\n/// \\li Red\n/// \\li Green\n/// \\li Blue\n/// \\li Alpha (opacity)\n///\n/// Each component is a public member, an unsigned integer in\n/// the range [0, 255]. Thus, colors can be constructed and\n/// manipulated very easily:\n///\n/// \\code\n/// sf::Color color(255, 0, 0); // red\n/// color.r = 0;                // make it black\n/// color.b = 128;              // make it dark blue\n/// \\endcode\n///\n/// The fourth component of colors, named \"alpha\", represents\n/// the opacity of the color. A color with an alpha value of\n/// 255 will be fully opaque, while an alpha value of 0 will\n/// make a color fully transparent, whatever the value of the\n/// other components is.\n///\n/// The most common colors are already defined as static variables:\n/// \\code\n/// sf::Color black       = sf::Color::Black;\n/// sf::Color white       = sf::Color::White;\n/// sf::Color red         = sf::Color::Red;\n/// sf::Color green       = sf::Color::Green;\n/// sf::Color blue        = sf::Color::Blue;\n/// sf::Color yellow      = sf::Color::Yellow;\n/// sf::Color magenta     = sf::Color::Magenta;\n/// sf::Color cyan        = sf::Color::Cyan;\n/// sf::Color transparent = sf::Color::Transparent;\n/// \\endcode\n///\n/// Colors can also be added and modulated (multiplied) using the\n/// overloaded operators + and *.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/ConvexShape.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_CONVEXSHAPE_HPP\n#define SFML_CONVEXSHAPE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Shape.hpp>\n#include <vector>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Specialized shape representing a convex polygon\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API ConvexShape : public Shape\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// \\param pointCount Number of points of the polygon\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit ConvexShape(std::size_t pointCount = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the number of points of the polygon\n    ///\n    /// \\a count must be greater than 2 to define a valid shape.\n    ///\n    /// \\param count New number of points of the polygon\n    ///\n    /// \\see getPointCount\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPointCount(std::size_t count);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the number of points of the polygon\n    ///\n    /// \\return Number of points of the polygon\n    ///\n    /// \\see setPointCount\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual std::size_t getPointCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the position of a point\n    ///\n    /// Don't forget that the polygon must remain convex, and\n    /// the points need to stay ordered!\n    /// setPointCount must be called first in order to set the total\n    /// number of points. The result is undefined if \\a index is out\n    /// of the valid range.\n    ///\n    /// \\param index Index of the point to change, in range [0 .. getPointCount() - 1]\n    /// \\param point New position of the point\n    ///\n    /// \\see getPoint\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPoint(std::size_t index, const Vector2f& point);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the position of a point\n    ///\n    /// The returned point is in local coordinates, that is,\n    /// the shape's transforms (position, rotation, scale) are\n    /// not taken into account.\n    /// The result is undefined if \\a index is out of the valid range.\n    ///\n    /// \\param index Index of the point to get, in range [0 .. getPointCount() - 1]\n    ///\n    /// \\return Position of the index-th point of the polygon\n    ///\n    /// \\see setPoint\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Vector2f getPoint(std::size_t index) const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    std::vector<Vector2f> m_points; //!< Points composing the convex polygon\n};\n\n} // namespace sf\n\n\n#endif // SFML_CONVEXSHAPE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::ConvexShape\n/// \\ingroup graphics\n///\n/// This class inherits all the functions of sf::Transformable\n/// (position, rotation, scale, bounds, ...) as well as the\n/// functions of sf::Shape (outline, color, texture, ...).\n///\n/// It is important to keep in mind that a convex shape must\n/// always be... convex, otherwise it may not be drawn correctly.\n/// Moreover, the points must be defined in order; using a random\n/// order would result in an incorrect shape.\n///\n/// Usage example:\n/// \\code\n/// sf::ConvexShape polygon;\n/// polygon.setPointCount(3);\n/// polygon.setPoint(0, sf::Vector2f(0, 0));\n/// polygon.setPoint(1, sf::Vector2f(0, 10));\n/// polygon.setPoint(2, sf::Vector2f(25, 5));\n/// polygon.setOutlineColor(sf::Color::Red);\n/// polygon.setOutlineThickness(5);\n/// polygon.setPosition(10, 20);\n/// ...\n/// window.draw(polygon);\n/// \\endcode\n///\n/// \\see sf::Shape, sf::RectangleShape, sf::CircleShape\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Drawable.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_DRAWABLE_HPP\n#define SFML_DRAWABLE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/RenderStates.hpp>\n\n\nnamespace sf\n{\nclass RenderTarget;\n\n////////////////////////////////////////////////////////////\n/// \\brief Abstract base class for objects that can be drawn\n///        to a render target\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Drawable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Virtual destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~Drawable() {}\n\nprotected:\n\n    friend class RenderTarget;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw the object to a render target\n    ///\n    /// This is a pure virtual function that has to be implemented\n    /// by the derived class to define how the drawable should be\n    /// drawn.\n    ///\n    /// \\param target Render target to draw to\n    /// \\param states Current render states\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void draw(RenderTarget& target, RenderStates states) const = 0;\n};\n\n} // namespace sf\n\n\n#endif // SFML_DRAWABLE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Drawable\n/// \\ingroup graphics\n///\n/// sf::Drawable is a very simple base class that allows objects\n/// of derived classes to be drawn to a sf::RenderTarget.\n///\n/// All you have to do in your derived class is to override the\n/// draw virtual function.\n///\n/// Note that inheriting from sf::Drawable is not mandatory,\n/// but it allows this nice syntax \"window.draw(object)\" rather\n/// than \"object.draw(window)\", which is more consistent with other\n/// SFML classes.\n///\n/// Example:\n/// \\code\n/// class MyDrawable : public sf::Drawable\n/// {\n/// public:\n///\n///    ...\n///\n/// private:\n///\n///     virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const\n///     {\n///         // You can draw other high-level objects\n///         target.draw(m_sprite, states);\n///\n///         // ... or use the low-level API\n///         states.texture = &m_texture;\n///         target.draw(m_vertices, states);\n///\n///         // ... or draw with OpenGL directly\n///         glBegin(GL_QUADS);\n///         ...\n///         glEnd();\n///     }\n///\n///     sf::Sprite m_sprite;\n///     sf::Texture m_texture;\n///     sf::VertexArray m_vertices;\n/// };\n/// \\endcode\n///\n/// \\see sf::RenderTarget\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Export.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_GRAPHICS_EXPORT_HPP\n#define SFML_GRAPHICS_EXPORT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n\n////////////////////////////////////////////////////////////\n// Define portable import / export macros\n////////////////////////////////////////////////////////////\n#if defined(SFML_GRAPHICS_EXPORTS)\n\n    #define SFML_GRAPHICS_API SFML_API_EXPORT\n\n#else\n\n    #define SFML_GRAPHICS_API SFML_API_IMPORT\n\n#endif\n\n\n#endif // SFML_GRAPHICS_EXPORT_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Font.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_FONT_HPP\n#define SFML_FONT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Glyph.hpp>\n#include <SFML/Graphics/Texture.hpp>\n#include <SFML/Graphics/Rect.hpp>\n#include <map>\n#include <string>\n#include <vector>\n\n\nnamespace sf\n{\nclass InputStream;\n\n////////////////////////////////////////////////////////////\n/// \\brief Class for loading and manipulating character fonts\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Font\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Holds various information about a font\n    ///\n    ////////////////////////////////////////////////////////////\n    struct Info\n    {\n        std::string family; //!< The font family\n    };\n\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor defines an empty font\n    ///\n    ////////////////////////////////////////////////////////////\n    Font();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy constructor\n    ///\n    /// \\param copy Instance to copy\n    ///\n    ////////////////////////////////////////////////////////////\n    Font(const Font& copy);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// Cleans up all the internal resources used by the font\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Font();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the font from a file\n    ///\n    /// The supported font formats are: TrueType, Type 1, CFF,\n    /// OpenType, SFNT, X11 PCF, Windows FNT, BDF, PFR and Type 42.\n    /// Note that this function knows nothing about the standard\n    /// fonts installed on the user's system, thus you can't\n    /// load them directly.\n    ///\n    /// \\warning SFML cannot preload all the font data in this\n    /// function, so the file has to remain accessible until\n    /// the sf::Font object loads a new font or is destroyed.\n    ///\n    /// \\param filename Path of the font file to load\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromMemory, loadFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromFile(const std::string& filename);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the font from a file in memory\n    ///\n    /// The supported font formats are: TrueType, Type 1, CFF,\n    /// OpenType, SFNT, X11 PCF, Windows FNT, BDF, PFR and Type 42.\n    ///\n    /// \\warning SFML cannot preload all the font data in this\n    /// function, so the buffer pointed by \\a data has to remain\n    /// valid until the sf::Font object loads a new font or\n    /// is destroyed.\n    ///\n    /// \\param data        Pointer to the file data in memory\n    /// \\param sizeInBytes Size of the data to load, in bytes\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromMemory(const void* data, std::size_t sizeInBytes);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the font from a custom stream\n    ///\n    /// The supported font formats are: TrueType, Type 1, CFF,\n    /// OpenType, SFNT, X11 PCF, Windows FNT, BDF, PFR and Type 42.\n    /// Warning: SFML cannot preload all the font data in this\n    /// function, so the contents of \\a stream have to remain\n    /// valid as long as the font is used.\n    ///\n    /// \\warning SFML cannot preload all the font data in this\n    /// function, so the stream has to remain accessible until\n    /// the sf::Font object loads a new font or is destroyed.\n    ///\n    /// \\param stream Source stream to read from\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromMemory\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromStream(InputStream& stream);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the font information\n    ///\n    /// \\return A structure that holds the font information\n    ///\n    ////////////////////////////////////////////////////////////\n    const Info& getInfo() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Retrieve a glyph of the font\n    ///\n    /// If the font is a bitmap font, not all character sizes\n    /// might be available. If the glyph is not available at the\n    /// requested size, an empty glyph is returned.\n    ///\n    /// You may want to use \\ref hasGlyph to determine if the\n    /// glyph exists before requesting it. If the glyph does not\n    /// exist, a font specific default is returned.\n    ///\n    /// Be aware that using a negative value for the outline\n    /// thickness will cause distorted rendering.\n    ///\n    /// \\param codePoint        Unicode code point of the character to get\n    /// \\param characterSize    Reference character size\n    /// \\param bold             Retrieve the bold version or the regular one?\n    /// \\param outlineThickness Thickness of outline (when != 0 the glyph will not be filled)\n    ///\n    /// \\return The glyph corresponding to \\a codePoint and \\a characterSize\n    ///\n    ////////////////////////////////////////////////////////////\n    const Glyph& getGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, float outlineThickness = 0) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Determine if this font has a glyph representing the requested code point\n    ///\n    /// Most fonts only include a very limited selection of glyphs from\n    /// specific Unicode subsets, like Latin, Cyrillic, or Asian characters.\n    ///\n    /// While code points without representation will return a font specific\n    /// default character, it might be useful to verify whether specific\n    /// code points are included to determine whether a font is suited\n    /// to display text in a specific language.\n    ///\n    /// \\param codePoint Unicode code point to check\n    ///\n    /// \\return True if the codepoint has a glyph representation, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    bool hasGlyph(Uint32 codePoint) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the kerning offset of two glyphs\n    ///\n    /// The kerning is an extra offset (negative) to apply between two\n    /// glyphs when rendering them, to make the pair look more \"natural\".\n    /// For example, the pair \"AV\" have a special kerning to make them\n    /// closer than other characters. Most of the glyphs pairs have a\n    /// kerning offset of zero, though.\n    ///\n    /// \\param first         Unicode code point of the first character\n    /// \\param second        Unicode code point of the second character\n    /// \\param characterSize Reference character size\n    ///\n    /// \\return Kerning value for \\a first and \\a second, in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    float getKerning(Uint32 first, Uint32 second, unsigned int characterSize, bool bold = false) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the line spacing\n    ///\n    /// Line spacing is the vertical offset to apply between two\n    /// consecutive lines of text.\n    ///\n    /// \\param characterSize Reference character size\n    ///\n    /// \\return Line spacing, in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    float getLineSpacing(unsigned int characterSize) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the position of the underline\n    ///\n    /// Underline position is the vertical offset to apply between the\n    /// baseline and the underline.\n    ///\n    /// \\param characterSize Reference character size\n    ///\n    /// \\return Underline position, in pixels\n    ///\n    /// \\see getUnderlineThickness\n    ///\n    ////////////////////////////////////////////////////////////\n    float getUnderlinePosition(unsigned int characterSize) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the thickness of the underline\n    ///\n    /// Underline thickness is the vertical size of the underline.\n    ///\n    /// \\param characterSize Reference character size\n    ///\n    /// \\return Underline thickness, in pixels\n    ///\n    /// \\see getUnderlinePosition\n    ///\n    ////////////////////////////////////////////////////////////\n    float getUnderlineThickness(unsigned int characterSize) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Retrieve the texture containing the loaded glyphs of a certain size\n    ///\n    /// The contents of the returned texture changes as more glyphs\n    /// are requested, thus it is not very relevant. It is mainly\n    /// used internally by sf::Text.\n    ///\n    /// \\param characterSize Reference character size\n    ///\n    /// \\return Texture containing the glyphs of the requested size\n    ///\n    ////////////////////////////////////////////////////////////\n    const Texture& getTexture(unsigned int characterSize) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enable or disable the smooth filter\n    ///\n    /// When the filter is activated, the font appears smoother\n    /// so that pixels are less noticeable. However if you want\n    /// the font to look exactly the same as its source file,\n    /// you should disable it.\n    /// The smooth filter is enabled by default.\n    ///\n    /// \\param smooth True to enable smoothing, false to disable it\n    ///\n    /// \\see isSmooth\n    ///\n    ////////////////////////////////////////////////////////////\n    void setSmooth(bool smooth);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether the smooth filter is enabled or not\n    ///\n    /// \\return True if smoothing is enabled, false if it is disabled\n    ///\n    /// \\see setSmooth\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isSmooth() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of assignment operator\n    ///\n    /// \\param right Instance to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    Font& operator =(const Font& right);\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Structure defining a row of glyphs\n    ///\n    ////////////////////////////////////////////////////////////\n    struct Row\n    {\n        Row(unsigned int rowTop, unsigned int rowHeight) : width(0), top(rowTop), height(rowHeight) {}\n\n        unsigned int width;  //!< Current width of the row\n        unsigned int top;    //!< Y position of the row into the texture\n        unsigned int height; //!< Height of the row\n    };\n\n    ////////////////////////////////////////////////////////////\n    // Types\n    ////////////////////////////////////////////////////////////\n    typedef std::map<Uint64, Glyph> GlyphTable; //!< Table mapping a codepoint to its glyph\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Structure defining a page of glyphs\n    ///\n    ////////////////////////////////////////////////////////////\n    struct Page\n    {\n        explicit Page(bool smooth);\n\n        GlyphTable       glyphs;  //!< Table mapping code points to their corresponding glyph\n        Texture          texture; //!< Texture containing the pixels of the glyphs\n        unsigned int     nextRow; //!< Y position of the next new row in the texture\n        std::vector<Row> rows;    //!< List containing the position of all the existing rows\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Free all the internal resources\n    ///\n    ////////////////////////////////////////////////////////////\n    void cleanup();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Find or create the glyphs page corresponding to the given character size\n    ///\n    /// \\param characterSize Reference character size\n    ///\n    /// \\return The glyphs page corresponding to \\a characterSize\n    ///\n    ////////////////////////////////////////////////////////////\n    Page& loadPage(unsigned int characterSize) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load a new glyph and store it in the cache\n    ///\n    /// \\param codePoint        Unicode code point of the character to load\n    /// \\param characterSize    Reference character size\n    /// \\param bold             Retrieve the bold version or the regular one?\n    /// \\param outlineThickness Thickness of outline (when != 0 the glyph will not be filled)\n    ///\n    /// \\return The glyph corresponding to \\a codePoint and \\a characterSize\n    ///\n    ////////////////////////////////////////////////////////////\n    Glyph loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, float outlineThickness) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Find a suitable rectangle within the texture for a glyph\n    ///\n    /// \\param page   Page of glyphs to search in\n    /// \\param width  Width of the rectangle\n    /// \\param height Height of the rectangle\n    ///\n    /// \\return Found rectangle within the texture\n    ///\n    ////////////////////////////////////////////////////////////\n    IntRect findGlyphRect(Page& page, unsigned int width, unsigned int height) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Make sure that the given size is the current one\n    ///\n    /// \\param characterSize Reference character size\n    ///\n    /// \\return True on success, false if any error happened\n    ///\n    ////////////////////////////////////////////////////////////\n    bool setCurrentSize(unsigned int characterSize) const;\n\n    ////////////////////////////////////////////////////////////\n    // Types\n    ////////////////////////////////////////////////////////////\n    typedef std::map<unsigned int, Page> PageTable; //!< Table mapping a character size to its page (texture)\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    void*                      m_library;     //!< Pointer to the internal library interface (it is typeless to avoid exposing implementation details)\n    void*                      m_face;        //!< Pointer to the internal font face (it is typeless to avoid exposing implementation details)\n    void*                      m_streamRec;   //!< Pointer to the stream rec instance (it is typeless to avoid exposing implementation details)\n    void*                      m_stroker;     //!< Pointer to the stroker (it is typeless to avoid exposing implementation details)\n    int*                       m_refCount;    //!< Reference counter used by implicit sharing\n    bool                       m_isSmooth;    //!< Status of the smooth filter\n    Info                       m_info;        //!< Information about the font\n    mutable PageTable          m_pages;       //!< Table containing the glyphs pages by character size\n    mutable std::vector<Uint8> m_pixelBuffer; //!< Pixel buffer holding a glyph's pixels before being written to the texture\n    #ifdef SFML_SYSTEM_ANDROID\n    void*                      m_stream; //!< Asset file streamer (if loaded from file)\n    #endif\n};\n\n} // namespace sf\n\n\n#endif // SFML_FONT_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Font\n/// \\ingroup graphics\n///\n/// Fonts can be loaded from a file, from memory or from a custom\n/// stream, and supports the most common types of fonts. See\n/// the loadFromFile function for the complete list of supported formats.\n///\n/// Once it is loaded, a sf::Font instance provides three\n/// types of information about the font:\n/// \\li Global metrics, such as the line spacing\n/// \\li Per-glyph metrics, such as bounding box or kerning\n/// \\li Pixel representation of glyphs\n///\n/// Fonts alone are not very useful: they hold the font data\n/// but cannot make anything useful of it. To do so you need to\n/// use the sf::Text class, which is able to properly output text\n/// with several options such as character size, style, color,\n/// position, rotation, etc.\n/// This separation allows more flexibility and better performances:\n/// indeed a sf::Font is a heavy resource, and any operation on it\n/// is slow (often too slow for real-time applications). On the other\n/// side, a sf::Text is a lightweight object which can combine the\n/// glyphs data and metrics of a sf::Font to display any text on a\n/// render target.\n/// Note that it is also possible to bind several sf::Text instances\n/// to the same sf::Font.\n///\n/// It is important to note that the sf::Text instance doesn't\n/// copy the font that it uses, it only keeps a reference to it.\n/// Thus, a sf::Font must not be destructed while it is\n/// used by a sf::Text (i.e. never write a function that\n/// uses a local sf::Font instance for creating a text).\n///\n/// Usage example:\n/// \\code\n/// // Declare a new font\n/// sf::Font font;\n///\n/// // Load it from a file\n/// if (!font.loadFromFile(\"arial.ttf\"))\n/// {\n///     // error...\n/// }\n///\n/// // Create a text which uses our font\n/// sf::Text text1;\n/// text1.setFont(font);\n/// text1.setCharacterSize(30);\n/// text1.setStyle(sf::Text::Regular);\n///\n/// // Create another text using the same font, but with different parameters\n/// sf::Text text2;\n/// text2.setFont(font);\n/// text2.setCharacterSize(50);\n/// text2.setStyle(sf::Text::Italic);\n/// \\endcode\n///\n/// Apart from loading font files, and passing them to instances\n/// of sf::Text, you should normally not have to deal directly\n/// with this class. However, it may be useful to access the\n/// font metrics or rasterized glyphs for advanced usage.\n///\n/// Note that if the font is a bitmap font, it is not scalable,\n/// thus not all requested sizes will be available to use. This\n/// needs to be taken into consideration when using sf::Text.\n/// If you need to display text of a certain size, make sure the\n/// corresponding bitmap font that supports that size is used.\n///\n/// \\see sf::Text\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Glsl.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_GLSL_HPP\n#define SFML_GLSL_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Transform.hpp>\n#include <SFML/Graphics/Color.hpp>\n#include <SFML/System/Vector2.hpp>\n#include <SFML/System/Vector3.hpp>\n\n\nnamespace sf\n{\nnamespace priv\n{\n    // Forward declarations\n    template <std::size_t Columns, std::size_t Rows>\n    struct Matrix;\n\n    template <typename T>\n    struct Vector4;\n\n#include <SFML/Graphics/Glsl.inl>\n\n} // namespace priv\n\n\n////////////////////////////////////////////////////////////\n/// \\brief Namespace with GLSL types\n///\n////////////////////////////////////////////////////////////\nnamespace Glsl\n{\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 2D float vector (\\p vec2 in GLSL)\n    ///\n    ////////////////////////////////////////////////////////////\n    typedef Vector2<float> Vec2;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 2D int vector (\\p ivec2 in GLSL)\n    ///\n    ////////////////////////////////////////////////////////////\n    typedef Vector2<int> Ivec2;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 2D bool vector (\\p bvec2 in GLSL)\n    ///\n    ////////////////////////////////////////////////////////////\n    typedef Vector2<bool> Bvec2;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 3D float vector (\\p vec3 in GLSL)\n    ///\n    ////////////////////////////////////////////////////////////\n    typedef Vector3<float> Vec3;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 3D int vector (\\p ivec3 in GLSL)\n    ///\n    ////////////////////////////////////////////////////////////\n    typedef Vector3<int> Ivec3;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 3D bool vector (\\p bvec3 in GLSL)\n    ///\n    ////////////////////////////////////////////////////////////\n    typedef Vector3<bool> Bvec3;\n\n#ifdef SFML_DOXYGEN\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 4D float vector (\\p vec4 in GLSL)\n    ///\n    /// 4D float vectors can be implicitly converted from sf::Color\n    /// instances. Each color channel is normalized from integers\n    /// in [0, 255] to floating point values in [0, 1].\n    /// \\code\n    /// sf::Glsl::Vec4 zeroVector;\n    /// sf::Glsl::Vec4 vector(1.f, 2.f, 3.f, 4.f);\n    /// sf::Glsl::Vec4 color = sf::Color::Cyan;\n    /// \\endcode\n    ////////////////////////////////////////////////////////////\n    typedef implementation-defined Vec4;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 4D int vector (\\p ivec4 in GLSL)\n    ///\n    /// 4D int vectors can be implicitly converted from sf::Color\n    /// instances. Each color channel remains unchanged inside\n    /// the integer interval [0, 255].\n    /// \\code\n    /// sf::Glsl::Ivec4 zeroVector;\n    /// sf::Glsl::Ivec4 vector(1, 2, 3, 4);\n    /// sf::Glsl::Ivec4 color = sf::Color::Cyan;\n    /// \\endcode\n    ////////////////////////////////////////////////////////////\n    typedef implementation-defined Ivec4;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 4D bool vector (\\p bvec4 in GLSL)\n    ///\n    ////////////////////////////////////////////////////////////\n    typedef implementation-defined Bvec4;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 3x3 float matrix (\\p mat3 in GLSL)\n    ///\n    /// The matrix can be constructed from an array with 3x3\n    /// elements, aligned in column-major order. For example,\n    /// a translation by (x, y) looks as follows:\n    /// \\code\n    /// float array[9] =\n    /// {\n    ///     1, 0, 0,\n    ///     0, 1, 0,\n    ///     x, y, 1\n    /// };\n    ///\n    /// sf::Glsl::Mat3 matrix(array);\n    /// \\endcode\n    ///\n    /// Mat3 can also be implicitly converted from sf::Transform:\n    /// \\code\n    /// sf::Transform transform;\n    /// sf::Glsl::Mat3 matrix = transform;\n    /// \\endcode\n    ////////////////////////////////////////////////////////////\n    typedef implementation-defined Mat3;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief 4x4 float matrix (\\p mat4 in GLSL)\n    ///\n    /// The matrix can be constructed from an array with 4x4\n    /// elements, aligned in column-major order. For example,\n    /// a translation by (x, y, z) looks as follows:\n    /// \\code\n    /// float array[16] =\n    /// {\n    ///     1, 0, 0, 0,\n    ///     0, 1, 0, 0,\n    ///     0, 0, 1, 0,\n    ///     x, y, z, 1\n    /// };\n    ///\n    /// sf::Glsl::Mat4 matrix(array);\n    /// \\endcode\n    ///\n    /// Mat4 can also be implicitly converted from sf::Transform:\n    /// \\code\n    /// sf::Transform transform;\n    /// sf::Glsl::Mat4 matrix = transform;\n    /// \\endcode\n    ////////////////////////////////////////////////////////////\n    typedef implementation-defined Mat4;\n\n#else // SFML_DOXYGEN\n\n    typedef priv::Vector4<float> Vec4;\n    typedef priv::Vector4<int> Ivec4;\n    typedef priv::Vector4<bool> Bvec4;\n    typedef priv::Matrix<3, 3> Mat3;\n    typedef priv::Matrix<4, 4> Mat4;\n\n#endif // SFML_DOXYGEN\n\n} // namespace Glsl\n} // namespace sf\n\n#endif // SFML_GLSL_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\namespace sf::Glsl\n/// \\ingroup graphics\n///\n/// \\details The sf::Glsl namespace contains types that match\n/// their equivalents in GLSL, the OpenGL shading language.\n/// These types are exclusively used by the sf::Shader class.\n///\n/// Types that already exist in SFML, such as \\ref sf::Vector2<T>\n/// and \\ref sf::Vector3<T>, are reused as typedefs, so you can use\n/// the types in this namespace as well as the original ones.\n/// Others are newly defined, such as Glsl::Vec4 or Glsl::Mat3. Their\n/// actual type is an implementation detail and should not be used.\n///\n/// All vector types support a default constructor that\n/// initializes every component to zero, in addition to a\n/// constructor with one parameter for each component.\n/// The components are stored in member variables called\n/// x, y, z, and w.\n///\n/// All matrix types support a constructor with a float*\n/// parameter that points to a float array of the appropriate\n/// size (that is, 9 in a 3x3 matrix, 16 in a 4x4 matrix).\n/// Furthermore, they can be converted from sf::Transform\n/// objects.\n///\n/// \\see sf::Shader\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Glsl.inl",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////\n/// \\brief Helper functions to copy sf::Transform to sf::Glsl::Mat3/4\n///\n////////////////////////////////////////////////////////////\nvoid SFML_GRAPHICS_API copyMatrix(const Transform& source, Matrix<3, 3>& dest);\nvoid SFML_GRAPHICS_API copyMatrix(const Transform& source, Matrix<4, 4>& dest);\n\n////////////////////////////////////////////////////////////\n/// \\brief Copy array-based matrix with given number of elements\n///\n/// Indirection to std::copy() to avoid inclusion of\n/// <algorithm> and MSVC's annoying 4996 warning in header\n///\n////////////////////////////////////////////////////////////\nvoid SFML_GRAPHICS_API copyMatrix(const float* source, std::size_t elements, float* dest);\n\n////////////////////////////////////////////////////////////\n/// \\brief Helper functions to copy sf::Color to sf::Glsl::Vec4/Ivec4\n///\n////////////////////////////////////////////////////////////\nvoid SFML_GRAPHICS_API copyVector(const Color& source, Vector4<float>& dest);\nvoid SFML_GRAPHICS_API copyVector(const Color& source, Vector4<int>& dest);\n\n\n////////////////////////////////////////////////////////////\n/// \\brief Matrix type, used to set uniforms in GLSL\n///\n////////////////////////////////////////////////////////////\ntemplate <std::size_t Columns, std::size_t Rows>\nstruct Matrix\n{\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from raw data\n    ///\n    /// \\param pointer Points to the beginning of an array that\n    ///                has the size of the matrix. The elements\n    ///                are copied to the instance.\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit Matrix(const float* pointer)\n    {\n        copyMatrix(pointer, Columns * Rows, array);\n    }\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct implicitly from SFML transform\n    ///\n    /// This constructor is only supported for 3x3 and 4x4\n    /// matrices.\n    ///\n    /// \\param transform Object containing a transform.\n    ///\n    ////////////////////////////////////////////////////////////\n    Matrix(const Transform& transform)\n    {\n        copyMatrix(transform, *this);\n    }\n\n    float array[Columns * Rows]; //!< Array holding matrix data\n};\n\n////////////////////////////////////////////////////////////\n/// \\brief 4D vector type, used to set uniforms in GLSL\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nstruct Vector4\n{\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor, creates a zero vector\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector4() :\n    x(0),\n    y(0),\n    z(0),\n    w(0)\n    {\n    }\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from 4 vector components\n    ///\n    /// \\param X Component of the 4D vector\n    /// \\param Y Component of the 4D vector\n    /// \\param Z Component of the 4D vector\n    /// \\param W Component of the 4D vector\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector4(T X, T Y, T Z, T W) :\n    x(X),\n    y(Y),\n    z(Z),\n    w(W)\n    {\n    }\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Conversion constructor\n    ///\n    /// \\param other 4D vector of different type\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename U>\n    explicit Vector4(const Vector4<U>& other) :\n    x(static_cast<T>(other.x)),\n    y(static_cast<T>(other.y)),\n    z(static_cast<T>(other.z)),\n    w(static_cast<T>(other.w))\n    {\n    }\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct float vector implicitly from color\n    ///\n    /// \\param color Color instance. Is normalized to [0, 1]\n    ///              for floats, and left as-is for ints.\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector4(const Color& color)\n    // uninitialized\n    {\n        copyVector(color, *this);\n    }\n\n    T x; //!< 1st component (X) of the 4D vector\n    T y; //!< 2nd component (Y) of the 4D vector\n    T z; //!< 3rd component (Z) of the 4D vector\n    T w; //!< 4th component (W) of the 4D vector\n};\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Glyph.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_GLYPH_HPP\n#define SFML_GLYPH_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Rect.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Structure describing a glyph\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Glyph\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    Glyph() : advance(0) {}\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    float     advance;     //!< Offset to move horizontally to the next character\n    int       lsbDelta;    //!< Left offset after forced autohint. Internally used by getKerning()\n    int       rsbDelta;    //!< Right offset after forced autohint. Internally used by getKerning()\n    FloatRect bounds;      //!< Bounding rectangle of the glyph, in coordinates relative to the baseline\n    IntRect   textureRect; //!< Texture coordinates of the glyph inside the font's texture\n};\n\n} // namespace sf\n\n\n#endif // SFML_GLYPH_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Glyph\n/// \\ingroup graphics\n///\n/// A glyph is the visual representation of a character.\n///\n/// The sf::Glyph structure provides the information needed\n/// to handle the glyph:\n/// \\li its coordinates in the font's texture\n/// \\li its bounding rectangle\n/// \\li the offset to apply to get the starting position of the next glyph\n///\n/// \\see sf::Font\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Image.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_IMAGE_HPP\n#define SFML_IMAGE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Color.hpp>\n#include <SFML/Graphics/Rect.hpp>\n#include <string>\n#include <vector>\n\n\nnamespace sf\n{\nclass InputStream;\n\n////////////////////////////////////////////////////////////\n/// \\brief Class for loading, manipulating and saving images\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Image\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates an empty image.\n    ///\n    ////////////////////////////////////////////////////////////\n    Image();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Image();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create the image and fill it with a unique color\n    ///\n    /// \\param width  Width of the image\n    /// \\param height Height of the image\n    /// \\param color  Fill color\n    ///\n    ////////////////////////////////////////////////////////////\n    void create(unsigned int width, unsigned int height, const Color& color = Color(0, 0, 0));\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create the image from an array of pixels\n    ///\n    /// The \\a pixel array is assumed to contain 32-bits RGBA pixels,\n    /// and have the given \\a width and \\a height. If not, this is\n    /// an undefined behavior.\n    /// If \\a pixels is null, an empty image is created.\n    ///\n    /// \\param width  Width of the image\n    /// \\param height Height of the image\n    /// \\param pixels Array of pixels to copy to the image\n    ///\n    ////////////////////////////////////////////////////////////\n    void create(unsigned int width, unsigned int height, const Uint8* pixels);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the image from a file on disk\n    ///\n    /// The supported image formats are bmp, png, tga, jpg, gif,\n    /// psd, hdr, pic and pnm. Some format options are not supported,\n    /// like jpeg with arithmetic coding or ASCII pnm.\n    /// If this function fails, the image is left unchanged.\n    ///\n    /// \\param filename Path of the image file to load\n    ///\n    /// \\return True if loading was successful\n    ///\n    /// \\see loadFromMemory, loadFromStream, saveToFile\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromFile(const std::string& filename);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the image from a file in memory\n    ///\n    /// The supported image formats are bmp, png, tga, jpg, gif,\n    /// psd, hdr, pic and pnm. Some format options are not supported,\n    /// like jpeg with arithmetic coding or ASCII pnm.\n    /// If this function fails, the image is left unchanged.\n    ///\n    /// \\param data Pointer to the file data in memory\n    /// \\param size Size of the data to load, in bytes\n    ///\n    /// \\return True if loading was successful\n    ///\n    /// \\see loadFromFile, loadFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromMemory(const void* data, std::size_t size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the image from a custom stream\n    ///\n    /// The supported image formats are bmp, png, tga, jpg, gif,\n    /// psd, hdr, pic and pnm. Some format options are not supported,\n    /// like jpeg with arithmetic coding or ASCII pnm.\n    /// If this function fails, the image is left unchanged.\n    ///\n    /// \\param stream Source stream to read from\n    ///\n    /// \\return True if loading was successful\n    ///\n    /// \\see loadFromFile, loadFromMemory\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromStream(InputStream& stream);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Save the image to a file on disk\n    ///\n    /// The format of the image is automatically deduced from\n    /// the extension. The supported image formats are bmp, png,\n    /// tga and jpg. The destination file is overwritten\n    /// if it already exists. This function fails if the image is empty.\n    ///\n    /// \\param filename Path of the file to save\n    ///\n    /// \\return True if saving was successful\n    ///\n    /// \\see create, loadFromFile, loadFromMemory\n    ///\n    ////////////////////////////////////////////////////////////\n    bool saveToFile(const std::string& filename) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Save the image to a buffer in memory\n    ///\n    /// The format of the image must be specified.\n    /// The supported image formats are bmp, png, tga and jpg.\n    /// This function fails if the image is empty, or if\n    /// the format was invalid.\n    ///\n    /// \\param output Buffer to fill with encoded data\n    /// \\param format Encoding format to use\n    ///\n    /// \\return True if saving was successful\n    ///\n    /// \\see create, loadFromFile, loadFromMemory, saveToFile\n    ///\n    ////////////////////////////////////////////////////////////\n    bool saveToMemory(std::vector<sf::Uint8>& output, const std::string& format) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the size (width and height) of the image\n    ///\n    /// \\return Size of the image, in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2u getSize() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create a transparency mask from a specified color-key\n    ///\n    /// This function sets the alpha value of every pixel matching\n    /// the given color to \\a alpha (0 by default), so that they\n    /// become transparent.\n    ///\n    /// \\param color Color to make transparent\n    /// \\param alpha Alpha value to assign to transparent pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    void createMaskFromColor(const Color& color, Uint8 alpha = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy pixels from another image onto this one\n    ///\n    /// This function does a slow pixel copy and should not be\n    /// used intensively. It can be used to prepare a complex\n    /// static image from several others, but if you need this\n    /// kind of feature in real-time you'd better use sf::RenderTexture.\n    ///\n    /// If \\a sourceRect is empty, the whole image is copied.\n    /// If \\a applyAlpha is set to true, alpha blending is\n    /// applied from the source pixels to the destination pixels\n    /// using the \\b over operator. If it is false, the source\n    /// pixels are copied unchanged with their alpha value.\n    ///\n    /// See https://en.wikipedia.org/wiki/Alpha_compositing for\n    /// details on the \\b over operator.\n    ///\n    /// \\param source     Source image to copy\n    /// \\param destX      X coordinate of the destination position\n    /// \\param destY      Y coordinate of the destination position\n    /// \\param sourceRect Sub-rectangle of the source image to copy\n    /// \\param applyAlpha Should the copy take into account the source transparency?\n    ///\n    ////////////////////////////////////////////////////////////\n    void copy(const Image& source, unsigned int destX, unsigned int destY, const IntRect& sourceRect = IntRect(0, 0, 0, 0), bool applyAlpha = false);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the color of a pixel\n    ///\n    /// This function doesn't check the validity of the pixel\n    /// coordinates, using out-of-range values will result in\n    /// an undefined behavior.\n    ///\n    /// \\param x     X coordinate of pixel to change\n    /// \\param y     Y coordinate of pixel to change\n    /// \\param color New color of the pixel\n    ///\n    /// \\see getPixel\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPixel(unsigned int x, unsigned int y, const Color& color);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the color of a pixel\n    ///\n    /// This function doesn't check the validity of the pixel\n    /// coordinates, using out-of-range values will result in\n    /// an undefined behavior.\n    ///\n    /// \\param x X coordinate of pixel to get\n    /// \\param y Y coordinate of pixel to get\n    ///\n    /// \\return Color of the pixel at coordinates (x, y)\n    ///\n    /// \\see setPixel\n    ///\n    ////////////////////////////////////////////////////////////\n    Color getPixel(unsigned int x, unsigned int y) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a read-only pointer to the array of pixels\n    ///\n    /// The returned value points to an array of RGBA pixels made of\n    /// 8 bits integers components. The size of the array is\n    /// width * height * 4 (getSize().x * getSize().y * 4).\n    /// Warning: the returned pointer may become invalid if you\n    /// modify the image, so you should never store it for too long.\n    /// If the image is empty, a null pointer is returned.\n    ///\n    /// \\return Read-only pointer to the array of pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    const Uint8* getPixelsPtr() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Flip the image horizontally (left <-> right)\n    ///\n    ////////////////////////////////////////////////////////////\n    void flipHorizontally();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Flip the image vertically (top <-> bottom)\n    ///\n    ////////////////////////////////////////////////////////////\n    void flipVertically();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Vector2u           m_size;   //!< Image size\n    std::vector<Uint8> m_pixels; //!< Pixels of the image\n};\n\n} // namespace sf\n\n\n#endif // SFML_IMAGE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Image\n/// \\ingroup graphics\n///\n/// sf::Image is an abstraction to manipulate images\n/// as bidimensional arrays of pixels. The class provides\n/// functions to load, read, write and save pixels, as well\n/// as many other useful functions.\n///\n/// sf::Image can handle a unique internal representation of\n/// pixels, which is RGBA 32 bits. This means that a pixel\n/// must be composed of 8 bits red, green, blue and alpha\n/// channels -- just like a sf::Color.\n/// All the functions that return an array of pixels follow\n/// this rule, and all parameters that you pass to sf::Image\n/// functions (such as loadFromMemory) must use this\n/// representation as well.\n///\n/// A sf::Image can be copied, but it is a heavy resource and\n/// if possible you should always use [const] references to\n/// pass or return them to avoid useless copies.\n///\n/// Usage example:\n/// \\code\n/// // Load an image file from a file\n/// sf::Image background;\n/// if (!background.loadFromFile(\"background.jpg\"))\n///     return -1;\n///\n/// // Create a 20x20 image filled with black color\n/// sf::Image image;\n/// image.create(20, 20, sf::Color::Black);\n///\n/// // Copy image1 on image2 at position (10, 10)\n/// image.copy(background, 10, 10);\n///\n/// // Make the top-left pixel transparent\n/// sf::Color color = image.getPixel(0, 0);\n/// color.a = 0;\n/// image.setPixel(0, 0, color);\n///\n/// // Save the image to a file\n/// if (!image.saveToFile(\"result.png\"))\n///     return -1;\n/// \\endcode\n///\n/// \\see sf::Texture\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/PrimitiveType.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_PRIMITIVETYPE_HPP\n#define SFML_PRIMITIVETYPE_HPP\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\ingroup graphics\n/// \\brief Types of primitives that a sf::VertexArray can render\n///\n/// Points and lines have no area, therefore their thickness\n/// will always be 1 pixel, regardless the current transform\n/// and view.\n///\n////////////////////////////////////////////////////////////\nenum PrimitiveType\n{\n    Points,        //!< List of individual points\n    Lines,         //!< List of individual lines\n    LineStrip,     //!< List of connected lines, a point uses the previous point to form a line\n    Triangles,     //!< List of individual triangles\n    TriangleStrip, //!< List of connected triangles, a point uses the two previous points to form a triangle\n    TriangleFan,   //!< List of connected triangles, a point uses the common center and the previous point to form a triangle\n    Quads,         //!< List of individual quads (deprecated, don't work with OpenGL ES)\n\n    // Deprecated names\n    LinesStrip     = LineStrip,     //!< \\deprecated Use LineStrip instead\n    TrianglesStrip = TriangleStrip, //!< \\deprecated Use TriangleStrip instead\n    TrianglesFan   = TriangleFan    //!< \\deprecated Use TriangleFan instead\n};\n\n} // namespace sf\n\n\n#endif // SFML_PRIMITIVETYPE_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Rect.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_RECT_HPP\n#define SFML_RECT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Vector2.hpp>\n#include <algorithm>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Utility class for manipulating 2D axis aligned rectangles\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nclass Rect\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates an empty rectangle (it is equivalent to calling\n    /// Rect(0, 0, 0, 0)).\n    ///\n    ////////////////////////////////////////////////////////////\n    Rect();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the rectangle from its coordinates\n    ///\n    /// Be careful, the last two parameters are the width\n    /// and height, not the right and bottom coordinates!\n    ///\n    /// \\param rectLeft   Left coordinate of the rectangle\n    /// \\param rectTop    Top coordinate of the rectangle\n    /// \\param rectWidth  Width of the rectangle\n    /// \\param rectHeight Height of the rectangle\n    ///\n    ////////////////////////////////////////////////////////////\n    Rect(T rectLeft, T rectTop, T rectWidth, T rectHeight);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the rectangle from position and size\n    ///\n    /// Be careful, the last parameter is the size,\n    /// not the bottom-right corner!\n    ///\n    /// \\param position Position of the top-left corner of the rectangle\n    /// \\param size     Size of the rectangle\n    ///\n    ////////////////////////////////////////////////////////////\n    Rect(const Vector2<T>& position, const Vector2<T>& size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the rectangle from another type of rectangle\n    ///\n    /// This constructor doesn't replace the copy constructor,\n    /// it's called only when U != T.\n    /// A call to this constructor will fail to compile if U\n    /// is not convertible to T.\n    ///\n    /// \\param rectangle Rectangle to convert\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename U>\n    explicit Rect(const Rect<U>& rectangle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a point is inside the rectangle's area\n    ///\n    /// This check is non-inclusive. If the point lies on the\n    /// edge of the rectangle, this function will return false.\n    ///\n    /// \\param x X coordinate of the point to test\n    /// \\param y Y coordinate of the point to test\n    ///\n    /// \\return True if the point is inside, false otherwise\n    ///\n    /// \\see intersects\n    ///\n    ////////////////////////////////////////////////////////////\n    bool contains(T x, T y) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a point is inside the rectangle's area\n    ///\n    /// This check is non-inclusive. If the point lies on the\n    /// edge of the rectangle, this function will return false.\n    ///\n    /// \\param point Point to test\n    ///\n    /// \\return True if the point is inside, false otherwise\n    ///\n    /// \\see intersects\n    ///\n    ////////////////////////////////////////////////////////////\n    bool contains(const Vector2<T>& point) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check the intersection between two rectangles\n    ///\n    /// \\param rectangle Rectangle to test\n    ///\n    /// \\return True if rectangles overlap, false otherwise\n    ///\n    /// \\see contains\n    ///\n    ////////////////////////////////////////////////////////////\n    bool intersects(const Rect<T>& rectangle) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check the intersection between two rectangles\n    ///\n    /// This overload returns the overlapped rectangle in the\n    /// \\a intersection parameter.\n    ///\n    /// \\param rectangle    Rectangle to test\n    /// \\param intersection Rectangle to be filled with the intersection\n    ///\n    /// \\return True if rectangles overlap, false otherwise\n    ///\n    /// \\see contains\n    ///\n    ////////////////////////////////////////////////////////////\n    bool intersects(const Rect<T>& rectangle, Rect<T>& intersection) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the position of the rectangle's top-left corner\n    ///\n    /// \\return Position of rectangle\n    ///\n    /// \\see getSize\n    ///\n    ////////////////////////////////////////////////////////////\n    sf::Vector2<T> getPosition() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the size of the rectangle\n    ///\n    /// \\return Size of rectangle\n    ///\n    /// \\see getPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    sf::Vector2<T> getSize() const;\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    T left;   //!< Left coordinate of the rectangle\n    T top;    //!< Top coordinate of the rectangle\n    T width;  //!< Width of the rectangle\n    T height; //!< Height of the rectangle\n};\n\n////////////////////////////////////////////////////////////\n/// \\relates Rect\n/// \\brief Overload of binary operator ==\n///\n/// This operator compares strict equality between two rectangles.\n///\n/// \\param left  Left operand (a rectangle)\n/// \\param right Right operand (a rectangle)\n///\n/// \\return True if \\a left is equal to \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool operator ==(const Rect<T>& left, const Rect<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Rect\n/// \\brief Overload of binary operator !=\n///\n/// This operator compares strict difference between two rectangles.\n///\n/// \\param left  Left operand (a rectangle)\n/// \\param right Right operand (a rectangle)\n///\n/// \\return True if \\a left is not equal to \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool operator !=(const Rect<T>& left, const Rect<T>& right);\n\n#include <SFML/Graphics/Rect.inl>\n\n// Create typedefs for the most common types\ntypedef Rect<int>   IntRect;\ntypedef Rect<float> FloatRect;\n\n} // namespace sf\n\n\n#endif // SFML_RECT_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Rect\n/// \\ingroup graphics\n///\n/// A rectangle is defined by its top-left corner and its size.\n/// It is a very simple class defined for convenience, so\n/// its member variables (left, top, width and height) are public\n/// and can be accessed directly, just like the vector classes\n/// (Vector2 and Vector3).\n///\n/// To keep things simple, sf::Rect doesn't define\n/// functions to emulate the properties that are not directly\n/// members (such as right, bottom, center, etc.), it rather\n/// only provides intersection functions.\n///\n/// sf::Rect uses the usual rules for its boundaries:\n/// \\li The left and top edges are included in the rectangle's area\n/// \\li The right (left + width) and bottom (top + height) edges are excluded from the rectangle's area\n///\n/// This means that sf::IntRect(0, 0, 1, 1) and sf::IntRect(1, 1, 1, 1)\n/// don't intersect.\n///\n/// sf::Rect is a template and may be used with any numeric type, but\n/// for simplicity the instantiations used by SFML are typedef'd:\n/// \\li sf::Rect<int> is sf::IntRect\n/// \\li sf::Rect<float> is sf::FloatRect\n///\n/// So that you don't have to care about the template syntax.\n///\n/// Usage example:\n/// \\code\n/// // Define a rectangle, located at (0, 0) with a size of 20x5\n/// sf::IntRect r1(0, 0, 20, 5);\n///\n/// // Define another rectangle, located at (4, 2) with a size of 18x10\n/// sf::Vector2i position(4, 2);\n/// sf::Vector2i size(18, 10);\n/// sf::IntRect r2(position, size);\n///\n/// // Test intersections with the point (3, 1)\n/// bool b1 = r1.contains(3, 1); // true\n/// bool b2 = r2.contains(3, 1); // false\n///\n/// // Test the intersection between r1 and r2\n/// sf::IntRect result;\n/// bool b3 = r1.intersects(r2, result); // true\n/// // result == (4, 2, 16, 3)\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Rect.inl",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nRect<T>::Rect() :\nleft  (0),\ntop   (0),\nwidth (0),\nheight(0)\n{\n\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nRect<T>::Rect(T rectLeft, T rectTop, T rectWidth, T rectHeight) :\nleft  (rectLeft),\ntop   (rectTop),\nwidth (rectWidth),\nheight(rectHeight)\n{\n\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nRect<T>::Rect(const Vector2<T>& position, const Vector2<T>& size) :\nleft  (position.x),\ntop   (position.y),\nwidth (size.x),\nheight(size.y)\n{\n\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ntemplate <typename U>\nRect<T>::Rect(const Rect<U>& rectangle) :\nleft  (static_cast<T>(rectangle.left)),\ntop   (static_cast<T>(rectangle.top)),\nwidth (static_cast<T>(rectangle.width)),\nheight(static_cast<T>(rectangle.height))\n{\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool Rect<T>::contains(T x, T y) const\n{\n    // Rectangles with negative dimensions are allowed, so we must handle them correctly\n\n    // Compute the real min and max of the rectangle on both axes\n    T minX = std::min(left, static_cast<T>(left + width));\n    T maxX = std::max(left, static_cast<T>(left + width));\n    T minY = std::min(top, static_cast<T>(top + height));\n    T maxY = std::max(top, static_cast<T>(top + height));\n\n    return (x >= minX) && (x < maxX) && (y >= minY) && (y < maxY);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool Rect<T>::contains(const Vector2<T>& point) const\n{\n    return contains(point.x, point.y);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool Rect<T>::intersects(const Rect<T>& rectangle) const\n{\n    Rect<T> intersection;\n    return intersects(rectangle, intersection);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool Rect<T>::intersects(const Rect<T>& rectangle, Rect<T>& intersection) const\n{\n    // Rectangles with negative dimensions are allowed, so we must handle them correctly\n\n    // Compute the min and max of the first rectangle on both axes\n    T r1MinX = std::min(left, static_cast<T>(left + width));\n    T r1MaxX = std::max(left, static_cast<T>(left + width));\n    T r1MinY = std::min(top, static_cast<T>(top + height));\n    T r1MaxY = std::max(top, static_cast<T>(top + height));\n\n    // Compute the min and max of the second rectangle on both axes\n    T r2MinX = std::min(rectangle.left, static_cast<T>(rectangle.left + rectangle.width));\n    T r2MaxX = std::max(rectangle.left, static_cast<T>(rectangle.left + rectangle.width));\n    T r2MinY = std::min(rectangle.top, static_cast<T>(rectangle.top + rectangle.height));\n    T r2MaxY = std::max(rectangle.top, static_cast<T>(rectangle.top + rectangle.height));\n\n    // Compute the intersection boundaries\n    T interLeft   = std::max(r1MinX, r2MinX);\n    T interTop    = std::max(r1MinY, r2MinY);\n    T interRight  = std::min(r1MaxX, r2MaxX);\n    T interBottom = std::min(r1MaxY, r2MaxY);\n\n    // If the intersection is valid (positive non zero area), then there is an intersection\n    if ((interLeft < interRight) && (interTop < interBottom))\n    {\n        intersection = Rect<T>(interLeft, interTop, interRight - interLeft, interBottom - interTop);\n        return true;\n    }\n    else\n    {\n        intersection = Rect<T>(0, 0, 0, 0);\n        return false;\n    }\n}\n\ntemplate <typename T>\nsf::Vector2<T> Rect<T>::getPosition() const\n{\n    return sf::Vector2<T>(left, top);\n}\n\ntemplate <typename T>\nsf::Vector2<T> Rect<T>::getSize() const\n{\n    return sf::Vector2<T>(width, height);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline bool operator ==(const Rect<T>& left, const Rect<T>& right)\n{\n    return (left.left == right.left) && (left.width == right.width) &&\n           (left.top == right.top) && (left.height == right.height);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline bool operator !=(const Rect<T>& left, const Rect<T>& right)\n{\n    return !(left == right);\n}\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/RectangleShape.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_RECTANGLESHAPE_HPP\n#define SFML_RECTANGLESHAPE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Shape.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Specialized shape representing a rectangle\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API RectangleShape : public Shape\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// \\param size Size of the rectangle\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit RectangleShape(const Vector2f& size = Vector2f(0, 0));\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the size of the rectangle\n    ///\n    /// \\param size New size of the rectangle\n    ///\n    /// \\see getSize\n    ///\n    ////////////////////////////////////////////////////////////\n    void setSize(const Vector2f& size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the size of the rectangle\n    ///\n    /// \\return Size of the rectangle\n    ///\n    /// \\see setSize\n    ///\n    ////////////////////////////////////////////////////////////\n    const Vector2f& getSize() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the number of points defining the shape\n    ///\n    /// \\return Number of points of the shape. For rectangle\n    ///         shapes, this number is always 4.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual std::size_t getPointCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a point of the rectangle\n    ///\n    /// The returned point is in local coordinates, that is,\n    /// the shape's transforms (position, rotation, scale) are\n    /// not taken into account.\n    /// The result is undefined if \\a index is out of the valid range.\n    ///\n    /// \\param index Index of the point to get, in range [0 .. 3]\n    ///\n    /// \\return index-th point of the shape\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Vector2f getPoint(std::size_t index) const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Vector2f m_size; //!< Size of the rectangle\n};\n\n} // namespace sf\n\n\n#endif // SFML_RECTANGLESHAPE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::RectangleShape\n/// \\ingroup graphics\n///\n/// This class inherits all the functions of sf::Transformable\n/// (position, rotation, scale, bounds, ...) as well as the\n/// functions of sf::Shape (outline, color, texture, ...).\n///\n/// Usage example:\n/// \\code\n/// sf::RectangleShape rectangle;\n/// rectangle.setSize(sf::Vector2f(100, 50));\n/// rectangle.setOutlineColor(sf::Color::Red);\n/// rectangle.setOutlineThickness(5);\n/// rectangle.setPosition(10, 20);\n/// ...\n/// window.draw(rectangle);\n/// \\endcode\n///\n/// \\see sf::Shape, sf::CircleShape, sf::ConvexShape\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/RenderStates.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_RENDERSTATES_HPP\n#define SFML_RENDERSTATES_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/BlendMode.hpp>\n#include <SFML/Graphics/Transform.hpp>\n\n\nnamespace sf\n{\nclass Shader;\nclass Texture;\n\n////////////////////////////////////////////////////////////\n/// \\brief Define the states used for drawing to a RenderTarget\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API RenderStates\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Constructing a default set of render states is equivalent\n    /// to using sf::RenderStates::Default.\n    /// The default set defines:\n    /// \\li the BlendAlpha blend mode\n    /// \\li the identity transform\n    /// \\li a null texture\n    /// \\li a null shader\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderStates();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a default set of render states with a custom blend mode\n    ///\n    /// \\param theBlendMode Blend mode to use\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderStates(const BlendMode& theBlendMode);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a default set of render states with a custom transform\n    ///\n    /// \\param theTransform Transform to use\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderStates(const Transform& theTransform);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a default set of render states with a custom texture\n    ///\n    /// \\param theTexture Texture to use\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderStates(const Texture* theTexture);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a default set of render states with a custom shader\n    ///\n    /// \\param theShader Shader to use\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderStates(const Shader* theShader);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a set of render states with all its attributes\n    ///\n    /// \\param theBlendMode Blend mode to use\n    /// \\param theTransform Transform to use\n    /// \\param theTexture   Texture to use\n    /// \\param theShader    Shader to use\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderStates(const BlendMode& theBlendMode, const Transform& theTransform,\n                 const Texture* theTexture, const Shader* theShader);\n\n    ////////////////////////////////////////////////////////////\n    // Static member data\n    ////////////////////////////////////////////////////////////\n    static const RenderStates Default; //!< Special instance holding the default render states\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    BlendMode      blendMode; //!< Blending mode\n    Transform      transform; //!< Transform\n    const Texture* texture;   //!< Texture\n    const Shader*  shader;    //!< Shader\n};\n\n} // namespace sf\n\n\n#endif // SFML_RENDERSTATES_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::RenderStates\n/// \\ingroup graphics\n///\n/// There are four global states that can be applied to\n/// the drawn objects:\n/// \\li the blend mode: how pixels of the object are blended with the background\n/// \\li the transform: how the object is positioned/rotated/scaled\n/// \\li the texture: what image is mapped to the object\n/// \\li the shader: what custom effect is applied to the object\n///\n/// High-level objects such as sprites or text force some of\n/// these states when they are drawn. For example, a sprite\n/// will set its own texture, so that you don't have to care\n/// about it when drawing the sprite.\n///\n/// The transform is a special case: sprites, texts and shapes\n/// (and it's a good idea to do it with your own drawable classes\n/// too) combine their transform with the one that is passed in the\n/// RenderStates structure. So that you can use a \"global\" transform\n/// on top of each object's transform.\n///\n/// Most objects, especially high-level drawables, can be drawn\n/// directly without defining render states explicitly -- the\n/// default set of states is ok in most cases.\n/// \\code\n/// window.draw(sprite);\n/// \\endcode\n///\n/// If you want to use a single specific render state,\n/// for example a shader, you can pass it directly to the Draw\n/// function: sf::RenderStates has an implicit one-argument\n/// constructor for each state.\n/// \\code\n/// window.draw(sprite, shader);\n/// \\endcode\n///\n/// When you're inside the Draw function of a drawable\n/// object (inherited from sf::Drawable), you can\n/// either pass the render states unmodified, or change\n/// some of them.\n/// For example, a transformable object will combine the\n/// current transform with its own transform. A sprite will\n/// set its texture. Etc.\n///\n/// \\see sf::RenderTarget, sf::Drawable\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/RenderTarget.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_RENDERTARGET_HPP\n#define SFML_RENDERTARGET_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Color.hpp>\n#include <SFML/Graphics/Rect.hpp>\n#include <SFML/Graphics/View.hpp>\n#include <SFML/Graphics/Transform.hpp>\n#include <SFML/Graphics/BlendMode.hpp>\n#include <SFML/Graphics/RenderStates.hpp>\n#include <SFML/Graphics/PrimitiveType.hpp>\n#include <SFML/Graphics/Vertex.hpp>\n#include <SFML/System/NonCopyable.hpp>\n\n\nnamespace sf\n{\nclass Drawable;\nclass VertexBuffer;\n\n////////////////////////////////////////////////////////////\n/// \\brief Base class for all render targets (window, texture, ...)\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API RenderTarget : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~RenderTarget();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Clear the entire target with a single color\n    ///\n    /// This function is usually called once every frame,\n    /// to clear the previous contents of the target.\n    ///\n    /// \\param color Fill color to use to clear the render target\n    ///\n    ////////////////////////////////////////////////////////////\n    void clear(const Color& color = Color(0, 0, 0, 255));\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current active view\n    ///\n    /// The view is like a 2D camera, it controls which part of\n    /// the 2D scene is visible, and how it is viewed in the\n    /// render target.\n    /// The new view will affect everything that is drawn, until\n    /// another view is set.\n    /// The render target keeps its own copy of the view object,\n    /// so it is not necessary to keep the original one alive\n    /// after calling this function.\n    /// To restore the original view of the target, you can pass\n    /// the result of getDefaultView() to this function.\n    ///\n    /// \\param view New view to use\n    ///\n    /// \\see getView, getDefaultView\n    ///\n    ////////////////////////////////////////////////////////////\n    void setView(const View& view);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the view currently in use in the render target\n    ///\n    /// \\return The view object that is currently used\n    ///\n    /// \\see setView, getDefaultView\n    ///\n    ////////////////////////////////////////////////////////////\n    const View& getView() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the default view of the render target\n    ///\n    /// The default view has the initial size of the render target,\n    /// and never changes after the target has been created.\n    ///\n    /// \\return The default view of the render target\n    ///\n    /// \\see setView, getView\n    ///\n    ////////////////////////////////////////////////////////////\n    const View& getDefaultView() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the viewport of a view, applied to this render target\n    ///\n    /// The viewport is defined in the view as a ratio, this function\n    /// simply applies this ratio to the current dimensions of the\n    /// render target to calculate the pixels rectangle that the viewport\n    /// actually covers in the target.\n    ///\n    /// \\param view The view for which we want to compute the viewport\n    ///\n    /// \\return Viewport rectangle, expressed in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    IntRect getViewport(const View& view) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a point from target coordinates to world\n    ///        coordinates, using the current view\n    ///\n    /// This function is an overload of the mapPixelToCoords\n    /// function that implicitly uses the current view.\n    /// It is equivalent to:\n    /// \\code\n    /// target.mapPixelToCoords(point, target.getView());\n    /// \\endcode\n    ///\n    /// \\param point Pixel to convert\n    ///\n    /// \\return The converted point, in \"world\" coordinates\n    ///\n    /// \\see mapCoordsToPixel\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2f mapPixelToCoords(const Vector2i& point) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a point from target coordinates to world coordinates\n    ///\n    /// This function finds the 2D position that matches the\n    /// given pixel of the render target. In other words, it does\n    /// the inverse of what the graphics card does, to find the\n    /// initial position of a rendered pixel.\n    ///\n    /// Initially, both coordinate systems (world units and target pixels)\n    /// match perfectly. But if you define a custom view or resize your\n    /// render target, this assertion is not true anymore, i.e. a point\n    /// located at (10, 50) in your render target may map to the point\n    /// (150, 75) in your 2D world -- if the view is translated by (140, 25).\n    ///\n    /// For render-windows, this function is typically used to find\n    /// which point (or object) is located below the mouse cursor.\n    ///\n    /// This version uses a custom view for calculations, see the other\n    /// overload of the function if you want to use the current view of the\n    /// render target.\n    ///\n    /// \\param point Pixel to convert\n    /// \\param view The view to use for converting the point\n    ///\n    /// \\return The converted point, in \"world\" units\n    ///\n    /// \\see mapCoordsToPixel\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2f mapPixelToCoords(const Vector2i& point, const View& view) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a point from world coordinates to target\n    ///        coordinates, using the current view\n    ///\n    /// This function is an overload of the mapCoordsToPixel\n    /// function that implicitly uses the current view.\n    /// It is equivalent to:\n    /// \\code\n    /// target.mapCoordsToPixel(point, target.getView());\n    /// \\endcode\n    ///\n    /// \\param point Point to convert\n    ///\n    /// \\return The converted point, in target coordinates (pixels)\n    ///\n    /// \\see mapPixelToCoords\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2i mapCoordsToPixel(const Vector2f& point) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a point from world coordinates to target coordinates\n    ///\n    /// This function finds the pixel of the render target that matches\n    /// the given 2D point. In other words, it goes through the same process\n    /// as the graphics card, to compute the final position of a rendered point.\n    ///\n    /// Initially, both coordinate systems (world units and target pixels)\n    /// match perfectly. But if you define a custom view or resize your\n    /// render target, this assertion is not true anymore, i.e. a point\n    /// located at (150, 75) in your 2D world may map to the pixel\n    /// (10, 50) of your render target -- if the view is translated by (140, 25).\n    ///\n    /// This version uses a custom view for calculations, see the other\n    /// overload of the function if you want to use the current view of the\n    /// render target.\n    ///\n    /// \\param point Point to convert\n    /// \\param view The view to use for converting the point\n    ///\n    /// \\return The converted point, in target coordinates (pixels)\n    ///\n    /// \\see mapPixelToCoords\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2i mapCoordsToPixel(const Vector2f& point, const View& view) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw a drawable object to the render target\n    ///\n    /// \\param drawable Object to draw\n    /// \\param states   Render states to use for drawing\n    ///\n    ////////////////////////////////////////////////////////////\n    void draw(const Drawable& drawable, const RenderStates& states = RenderStates::Default);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw primitives defined by an array of vertices\n    ///\n    /// \\param vertices    Pointer to the vertices\n    /// \\param vertexCount Number of vertices in the array\n    /// \\param type        Type of primitives to draw\n    /// \\param states      Render states to use for drawing\n    ///\n    ////////////////////////////////////////////////////////////\n    void draw(const Vertex* vertices, std::size_t vertexCount,\n              PrimitiveType type, const RenderStates& states = RenderStates::Default);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw primitives defined by a vertex buffer\n    ///\n    /// \\param vertexBuffer Vertex buffer\n    /// \\param states       Render states to use for drawing\n    ///\n    ////////////////////////////////////////////////////////////\n    void draw(const VertexBuffer& vertexBuffer, const RenderStates& states = RenderStates::Default);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw primitives defined by a vertex buffer\n    ///\n    /// \\param vertexBuffer Vertex buffer\n    /// \\param firstVertex  Index of the first vertex to render\n    /// \\param vertexCount  Number of vertices to render\n    /// \\param states       Render states to use for drawing\n    ///\n    ////////////////////////////////////////////////////////////\n    void draw(const VertexBuffer& vertexBuffer, std::size_t firstVertex, std::size_t vertexCount, const RenderStates& states = RenderStates::Default);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the size of the rendering region of the target\n    ///\n    /// \\return Size in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Vector2u getSize() const = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell if the render target will use sRGB encoding when drawing on it\n    ///\n    /// \\return True if the render target use sRGB encoding, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool isSrgb() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Activate or deactivate the render target for rendering\n    ///\n    /// This function makes the render target's context current for\n    /// future OpenGL rendering operations (so you shouldn't care\n    /// about it if you're not doing direct OpenGL stuff).\n    /// A render target's context is active only on the current thread,\n    /// if you want to make it active on another thread you have\n    /// to deactivate it on the previous thread first if it was active.\n    /// Only one context can be current in a thread, so if you\n    /// want to draw OpenGL geometry to another render target\n    /// don't forget to activate it again. Activating a render\n    /// target will automatically deactivate the previously active\n    /// context (if any).\n    ///\n    /// \\param active True to activate, false to deactivate\n    ///\n    /// \\return True if operation was successful, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool setActive(bool active = true);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Save the current OpenGL render states and matrices\n    ///\n    /// This function can be used when you mix SFML drawing\n    /// and direct OpenGL rendering. Combined with popGLStates,\n    /// it ensures that:\n    /// \\li SFML's internal states are not messed up by your OpenGL code\n    /// \\li your OpenGL states are not modified by a call to a SFML function\n    ///\n    /// More specifically, it must be used around code that\n    /// calls Draw functions. Example:\n    /// \\code\n    /// // OpenGL code here...\n    /// window.pushGLStates();\n    /// window.draw(...);\n    /// window.draw(...);\n    /// window.popGLStates();\n    /// // OpenGL code here...\n    /// \\endcode\n    ///\n    /// Note that this function is quite expensive: it saves all the\n    /// possible OpenGL states and matrices, even the ones you\n    /// don't care about. Therefore it should be used wisely.\n    /// It is provided for convenience, but the best results will\n    /// be achieved if you handle OpenGL states yourself (because\n    /// you know which states have really changed, and need to be\n    /// saved and restored). Take a look at the resetGLStates\n    /// function if you do so.\n    ///\n    /// \\see popGLStates\n    ///\n    ////////////////////////////////////////////////////////////\n    void pushGLStates();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Restore the previously saved OpenGL render states and matrices\n    ///\n    /// See the description of pushGLStates to get a detailed\n    /// description of these functions.\n    ///\n    /// \\see pushGLStates\n    ///\n    ////////////////////////////////////////////////////////////\n    void popGLStates();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Reset the internal OpenGL states so that the target is ready for drawing\n    ///\n    /// This function can be used when you mix SFML drawing\n    /// and direct OpenGL rendering, if you choose not to use\n    /// pushGLStates/popGLStates. It makes sure that all OpenGL\n    /// states needed by SFML are set, so that subsequent draw()\n    /// calls will work as expected.\n    ///\n    /// Example:\n    /// \\code\n    /// // OpenGL code here...\n    /// glPushAttrib(...);\n    /// window.resetGLStates();\n    /// window.draw(...);\n    /// window.draw(...);\n    /// glPopAttrib(...);\n    /// // OpenGL code here...\n    /// \\endcode\n    ///\n    ////////////////////////////////////////////////////////////\n    void resetGLStates();\n\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderTarget();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Performs the common initialization step after creation\n    ///\n    /// The derived classes must call this function after the\n    /// target is created and ready for drawing.\n    ///\n    ////////////////////////////////////////////////////////////\n    void initialize();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Apply the current view\n    ///\n    ////////////////////////////////////////////////////////////\n    void applyCurrentView();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Apply a new blending mode\n    ///\n    /// \\param mode Blending mode to apply\n    ///\n    ////////////////////////////////////////////////////////////\n    void applyBlendMode(const BlendMode& mode);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Apply a new transform\n    ///\n    /// \\param transform Transform to apply\n    ///\n    ////////////////////////////////////////////////////////////\n    void applyTransform(const Transform& transform);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Apply a new texture\n    ///\n    /// \\param texture Texture to apply\n    ///\n    ////////////////////////////////////////////////////////////\n    void applyTexture(const Texture* texture);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Apply a new shader\n    ///\n    /// \\param shader Shader to apply\n    ///\n    ////////////////////////////////////////////////////////////\n    void applyShader(const Shader* shader);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Setup environment for drawing\n    ///\n    /// \\param useVertexCache Are we going to use the vertex cache?\n    /// \\param states         Render states to use for drawing\n    ///\n    ////////////////////////////////////////////////////////////\n    void setupDraw(bool useVertexCache, const RenderStates& states);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw the primitives\n    ///\n    /// \\param type        Type of primitives to draw\n    /// \\param firstVertex Index of the first vertex to use when drawing\n    /// \\param vertexCount Number of vertices to use when drawing\n    ///\n    ////////////////////////////////////////////////////////////\n    void drawPrimitives(PrimitiveType type, std::size_t firstVertex, std::size_t vertexCount);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Clean up environment after drawing\n    ///\n    /// \\param states Render states used for drawing\n    ///\n    ////////////////////////////////////////////////////////////\n    void cleanupDraw(const RenderStates& states);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Render states cache\n    ///\n    ////////////////////////////////////////////////////////////\n    struct StatesCache\n    {\n        enum {VertexCacheSize = 4};\n\n        bool      enable;         //!< Is the cache enabled?\n        bool      glStatesSet;    //!< Are our internal GL states set yet?\n        bool      viewChanged;    //!< Has the current view changed since last draw?\n        BlendMode lastBlendMode;  //!< Cached blending mode\n        Uint64    lastTextureId;  //!< Cached texture\n        bool      texCoordsArrayEnabled; //!< Is GL_TEXTURE_COORD_ARRAY client state enabled?\n        bool      useVertexCache; //!< Did we previously use the vertex cache?\n        Vertex    vertexCache[VertexCacheSize]; //!< Pre-transformed vertices cache\n    };\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    View        m_defaultView; //!< Default view\n    View        m_view;        //!< Current view\n    StatesCache m_cache;       //!< Render states cache\n    Uint64      m_id;          //!< Unique number that identifies the RenderTarget\n};\n\n} // namespace sf\n\n\n#endif // SFML_RENDERTARGET_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::RenderTarget\n/// \\ingroup graphics\n///\n/// sf::RenderTarget defines the common behavior of all the\n/// 2D render targets usable in the graphics module. It makes\n/// it possible to draw 2D entities like sprites, shapes, text\n/// without using any OpenGL command directly.\n///\n/// A sf::RenderTarget is also able to use views (sf::View),\n/// which are a kind of 2D cameras. With views you can globally\n/// scroll, rotate or zoom everything that is drawn,\n/// without having to transform every single entity. See the\n/// documentation of sf::View for more details and sample pieces of\n/// code about this class.\n///\n/// On top of that, render targets are still able to render direct\n/// OpenGL stuff. It is even possible to mix together OpenGL calls\n/// and regular SFML drawing commands. When doing so, make sure that\n/// OpenGL states are not messed up by calling the\n/// pushGLStates/popGLStates functions.\n///\n/// \\see sf::RenderWindow, sf::RenderTexture, sf::View\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/RenderTexture.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_RENDERTEXTURE_HPP\n#define SFML_RENDERTEXTURE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Texture.hpp>\n#include <SFML/Graphics/RenderTarget.hpp>\n#include <SFML/Window/ContextSettings.hpp>\n\n\nnamespace sf\n{\nnamespace priv\n{\n    class RenderTextureImpl;\n}\n\n////////////////////////////////////////////////////////////\n/// \\brief Target for off-screen 2D rendering into a texture\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API RenderTexture : public RenderTarget\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Constructs an empty, invalid render-texture. You must\n    /// call create to have a valid render-texture.\n    ///\n    /// \\see create\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderTexture();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~RenderTexture();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create the render-texture\n    ///\n    /// Before calling this function, the render-texture is in\n    /// an invalid state, thus it is mandatory to call it before\n    /// doing anything with the render-texture.\n    /// The last parameter, \\a depthBuffer, is useful if you want\n    /// to use the render-texture for 3D OpenGL rendering that requires\n    /// a depth buffer. Otherwise it is unnecessary, and you should\n    /// leave this parameter to false (which is its default value).\n    ///\n    /// \\param width       Width of the render-texture\n    /// \\param height      Height of the render-texture\n    /// \\param depthBuffer Do you want this render-texture to have a depth buffer?\n    ///\n    /// \\return True if creation has been successful\n    ///\n    /// \\deprecated Use create(unsigned int, unsigned int, const ContextSettings&) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED bool create(unsigned int width, unsigned int height, bool depthBuffer);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create the render-texture\n    ///\n    /// Before calling this function, the render-texture is in\n    /// an invalid state, thus it is mandatory to call it before\n    /// doing anything with the render-texture.\n    /// The last parameter, \\a settings, is useful if you want to enable\n    /// multi-sampling or use the render-texture for OpenGL rendering that\n    /// requires a depth or stencil buffer. Otherwise it is unnecessary, and\n    /// you should leave this parameter at its default value.\n    ///\n    /// \\param width    Width of the render-texture\n    /// \\param height   Height of the render-texture\n    /// \\param settings Additional settings for the underlying OpenGL texture and context\n    ///\n    /// \\return True if creation has been successful\n    ///\n    ////////////////////////////////////////////////////////////\n    bool create(unsigned int width, unsigned int height, const ContextSettings& settings = ContextSettings());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the maximum anti-aliasing level supported by the system\n    ///\n    /// \\return The maximum anti-aliasing level supported by the system\n    ///\n    ////////////////////////////////////////////////////////////\n    static unsigned int getMaximumAntialiasingLevel();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enable or disable texture smoothing\n    ///\n    /// This function is similar to Texture::setSmooth.\n    /// This parameter is disabled by default.\n    ///\n    /// \\param smooth True to enable smoothing, false to disable it\n    ///\n    /// \\see isSmooth\n    ///\n    ////////////////////////////////////////////////////////////\n    void setSmooth(bool smooth);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether the smooth filtering is enabled or not\n    ///\n    /// \\return True if texture smoothing is enabled\n    ///\n    /// \\see setSmooth\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isSmooth() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enable or disable texture repeating\n    ///\n    /// This function is similar to Texture::setRepeated.\n    /// This parameter is disabled by default.\n    ///\n    /// \\param repeated True to enable repeating, false to disable it\n    ///\n    /// \\see isRepeated\n    ///\n    ////////////////////////////////////////////////////////////\n    void setRepeated(bool repeated);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether the texture is repeated or not\n    ///\n    /// \\return True if texture is repeated\n    ///\n    /// \\see setRepeated\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isRepeated() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Generate a mipmap using the current texture data\n    ///\n    /// This function is similar to Texture::generateMipmap and operates\n    /// on the texture used as the target for drawing.\n    /// Be aware that any draw operation may modify the base level image data.\n    /// For this reason, calling this function only makes sense after all\n    /// drawing is completed and display has been called. Not calling display\n    /// after subsequent drawing will lead to undefined behavior if a mipmap\n    /// had been previously generated.\n    ///\n    /// \\return True if mipmap generation was successful, false if unsuccessful\n    ///\n    ////////////////////////////////////////////////////////////\n    bool generateMipmap();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Activate or deactivate the render-texture for rendering\n    ///\n    /// This function makes the render-texture's context current for\n    /// future OpenGL rendering operations (so you shouldn't care\n    /// about it if you're not doing direct OpenGL stuff).\n    /// Only one context can be current in a thread, so if you\n    /// want to draw OpenGL geometry to another render target\n    /// (like a RenderWindow) don't forget to activate it again.\n    ///\n    /// \\param active True to activate, false to deactivate\n    ///\n    /// \\return True if operation was successful, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    bool setActive(bool active = true);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the contents of the target texture\n    ///\n    /// This function updates the target texture with what\n    /// has been drawn so far. Like for windows, calling this\n    /// function is mandatory at the end of rendering. Not calling\n    /// it may leave the texture in an undefined state.\n    ///\n    ////////////////////////////////////////////////////////////\n    void display();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the size of the rendering region of the texture\n    ///\n    /// The returned value is the size that you passed to\n    /// the create function.\n    ///\n    /// \\return Size in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Vector2u getSize() const;\n\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell if the render-texture will use sRGB encoding when drawing on it\n    ///\n    /// You can request sRGB encoding for a render-texture\n    /// by having the sRgbCapable flag set for the context parameter of create() method\n    ///\n    /// \\return True if the render-texture use sRGB encoding, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool isSrgb() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a read-only reference to the target texture\n    ///\n    /// After drawing to the render-texture and calling Display,\n    /// you can retrieve the updated texture using this function,\n    /// and draw it using a sprite (for example).\n    /// The internal sf::Texture of a render-texture is always the\n    /// same instance, so that it is possible to call this function\n    /// once and keep a reference to the texture even after it is\n    /// modified.\n    ///\n    /// \\return Const reference to the texture\n    ///\n    ////////////////////////////////////////////////////////////\n    const Texture& getTexture() const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    priv::RenderTextureImpl* m_impl;    //!< Platform/hardware specific implementation\n    Texture                  m_texture; //!< Target texture to draw on\n};\n\n} // namespace sf\n\n\n#endif // SFML_RENDERTEXTURE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::RenderTexture\n/// \\ingroup graphics\n///\n/// sf::RenderTexture is the little brother of sf::RenderWindow.\n/// It implements the same 2D drawing and OpenGL-related functions\n/// (see their base class sf::RenderTarget for more details),\n/// the difference is that the result is stored in an off-screen\n/// texture rather than being show in a window.\n///\n/// Rendering to a texture can be useful in a variety of situations:\n/// \\li precomputing a complex static texture (like a level's background from multiple tiles)\n/// \\li applying post-effects to the whole scene with shaders\n/// \\li creating a sprite from a 3D object rendered with OpenGL\n/// \\li etc.\n///\n/// Usage example:\n///\n/// \\code\n/// // Create a new render-window\n/// sf::RenderWindow window(sf::VideoMode(800, 600), \"SFML window\");\n///\n/// // Create a new render-texture\n/// sf::RenderTexture texture;\n/// if (!texture.create(500, 500))\n///     return -1;\n///\n/// // The main loop\n/// while (window.isOpen())\n/// {\n///    // Event processing\n///    // ...\n///\n///    // Clear the whole texture with red color\n///    texture.clear(sf::Color::Red);\n///\n///    // Draw stuff to the texture\n///    texture.draw(sprite);  // sprite is a sf::Sprite\n///    texture.draw(shape);   // shape is a sf::Shape\n///    texture.draw(text);    // text is a sf::Text\n///\n///    // We're done drawing to the texture\n///    texture.display();\n///\n///    // Now we start rendering to the window, clear it first\n///    window.clear();\n///\n///    // Draw the texture\n///    sf::Sprite sprite(texture.getTexture());\n///    window.draw(sprite);\n///\n///    // End the current frame and display its contents on screen\n///    window.display();\n/// }\n/// \\endcode\n///\n/// Like sf::RenderWindow, sf::RenderTexture is still able to render direct\n/// OpenGL stuff. It is even possible to mix together OpenGL calls\n/// and regular SFML drawing commands. If you need a depth buffer for\n/// 3D rendering, don't forget to request it when calling RenderTexture::create.\n///\n/// \\see sf::RenderTarget, sf::RenderWindow, sf::View, sf::Texture\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/RenderWindow.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_RENDERWINDOW_HPP\n#define SFML_RENDERWINDOW_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/RenderTarget.hpp>\n#include <SFML/Graphics/Image.hpp>\n#include <SFML/Window/Window.hpp>\n#include <string>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Window that can serve as a target for 2D drawing\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API RenderWindow : public Window, public RenderTarget\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor doesn't actually create the window,\n    /// use the other constructors or call create() to do so.\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderWindow();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a new window\n    ///\n    /// This constructor creates the window with the size and pixel\n    /// depth defined in \\a mode. An optional style can be passed to\n    /// customize the look and behavior of the window (borders,\n    /// title bar, resizable, closable, ...).\n    ///\n    /// The fourth parameter is an optional structure specifying\n    /// advanced OpenGL context settings such as antialiasing,\n    /// depth-buffer bits, etc. You shouldn't care about these\n    /// parameters for a regular usage of the graphics module.\n    ///\n    /// \\param mode     Video mode to use (defines the width, height and depth of the rendering area of the window)\n    /// \\param title    Title of the window\n    /// \\param style    %Window style, a bitwise OR combination of sf::Style enumerators\n    /// \\param settings Additional settings for the underlying OpenGL context\n    ///\n    ////////////////////////////////////////////////////////////\n    RenderWindow(VideoMode mode, const String& title, Uint32 style = Style::Default, const ContextSettings& settings = ContextSettings());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the window from an existing control\n    ///\n    /// Use this constructor if you want to create an SFML\n    /// rendering area into an already existing control.\n    ///\n    /// The second parameter is an optional structure specifying\n    /// advanced OpenGL context settings such as antialiasing,\n    /// depth-buffer bits, etc. You shouldn't care about these\n    /// parameters for a regular usage of the graphics module.\n    ///\n    /// \\param handle   Platform-specific handle of the control (\\a HWND on\n    ///                 Windows, \\a %Window on Linux/FreeBSD, \\a NSWindow on OS X)\n    /// \\param settings Additional settings for the underlying OpenGL context\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit RenderWindow(WindowHandle handle, const ContextSettings& settings = ContextSettings());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// Closes the window and frees all the resources attached to it.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~RenderWindow();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the size of the rendering region of the window\n    ///\n    /// The size doesn't include the titlebar and borders\n    /// of the window.\n    ///\n    /// \\return Size in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Vector2u getSize() const;\n\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell if the window will use sRGB encoding when drawing on it\n    ///\n    /// You can request sRGB encoding for a window by having the sRgbCapable flag set in the ContextSettings\n    ///\n    /// \\return True if the window use sRGB encoding, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual bool isSrgb() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Activate or deactivate the window as the current target\n    ///        for OpenGL rendering\n    ///\n    /// A window is active only on the current thread, if you want to\n    /// make it active on another thread you have to deactivate it\n    /// on the previous thread first if it was active.\n    /// Only one window can be active on a thread at a time, thus\n    /// the window previously active (if any) automatically gets deactivated.\n    /// This is not to be confused with requestFocus().\n    ///\n    /// \\param active True to activate, false to deactivate\n    ///\n    /// \\return True if operation was successful, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    bool setActive(bool active = true);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy the current contents of the window to an image\n    ///\n    /// \\deprecated\n    /// Use a sf::Texture and its sf::Texture::update(const Window&)\n    /// function and copy its contents into an sf::Image instead.\n    /// \\code\n    /// sf::Vector2u windowSize = window.getSize();\n    /// sf::Texture texture;\n    /// texture.create(windowSize.x, windowSize.y);\n    /// texture.update(window);\n    /// sf::Image screenshot = texture.copyToImage();\n    /// \\endcode\n    ///\n    /// This is a slow operation, whose main purpose is to make\n    /// screenshots of the application. If you want to update an\n    /// image with the contents of the window and then use it for\n    /// drawing, you should rather use a sf::Texture and its\n    /// update(Window&) function.\n    /// You can also draw things directly to a texture with the\n    /// sf::RenderTexture class.\n    ///\n    /// \\return Image containing the captured contents\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED Image capture() const;\n\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Function called after the window has been created\n    ///\n    /// This function is called so that derived classes can\n    /// perform their own specific initialization as soon as\n    /// the window is created.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void onCreate();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Function called after the window has been resized\n    ///\n    /// This function is called so that derived classes can\n    /// perform custom actions when the size of the window changes.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void onResize();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    unsigned int m_defaultFrameBuffer; //!< Framebuffer to bind when targeting this window\n};\n\n} // namespace sf\n\n\n#endif // SFML_RENDERWINDOW_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::RenderWindow\n/// \\ingroup graphics\n///\n/// sf::RenderWindow is the main class of the Graphics module.\n/// It defines an OS window that can be painted using the other\n/// classes of the graphics module.\n///\n/// sf::RenderWindow is derived from sf::Window, thus it inherits\n/// all its features: events, window management, OpenGL rendering,\n/// etc. See the documentation of sf::Window for a more complete\n/// description of all these features, as well as code examples.\n///\n/// On top of that, sf::RenderWindow adds more features related to\n/// 2D drawing with the graphics module (see its base class\n/// sf::RenderTarget for more details).\n/// Here is a typical rendering and event loop with a sf::RenderWindow:\n///\n/// \\code\n/// // Declare and create a new render-window\n/// sf::RenderWindow window(sf::VideoMode(800, 600), \"SFML window\");\n///\n/// // Limit the framerate to 60 frames per second (this step is optional)\n/// window.setFramerateLimit(60);\n///\n/// // The main loop - ends as soon as the window is closed\n/// while (window.isOpen())\n/// {\n///    // Event processing\n///    sf::Event event;\n///    while (window.pollEvent(event))\n///    {\n///        // Request for closing the window\n///        if (event.type == sf::Event::Closed)\n///            window.close();\n///    }\n///\n///    // Clear the whole window before rendering a new frame\n///    window.clear();\n///\n///    // Draw some graphical entities\n///    window.draw(sprite);\n///    window.draw(circle);\n///    window.draw(text);\n///\n///    // End the current frame and display its contents on screen\n///    window.display();\n/// }\n/// \\endcode\n///\n/// Like sf::Window, sf::RenderWindow is still able to render direct\n/// OpenGL stuff. It is even possible to mix together OpenGL calls\n/// and regular SFML drawing commands.\n///\n/// \\code\n/// // Create the render window\n/// sf::RenderWindow window(sf::VideoMode(800, 600), \"SFML OpenGL\");\n///\n/// // Create a sprite and a text to display\n/// sf::Sprite sprite;\n/// sf::Text text;\n/// ...\n///\n/// // Perform OpenGL initializations\n/// glMatrixMode(GL_PROJECTION);\n/// ...\n///\n/// // Start the rendering loop\n/// while (window.isOpen())\n/// {\n///     // Process events\n///     ...\n///\n///     // Draw a background sprite\n///     window.pushGLStates();\n///     window.draw(sprite);\n///     window.popGLStates();\n///\n///     // Draw a 3D object using OpenGL\n///     glBegin(GL_QUADS);\n///         glVertex3f(...);\n///         ...\n///     glEnd();\n///\n///     // Draw text on top of the 3D object\n///     window.pushGLStates();\n///     window.draw(text);\n///     window.popGLStates();\n///\n///     // Finally, display the rendered frame on screen\n///     window.display();\n/// }\n/// \\endcode\n///\n/// \\see sf::Window, sf::RenderTarget, sf::RenderTexture, sf::View\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Shader.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SHADER_HPP\n#define SFML_SHADER_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Glsl.hpp>\n#include <SFML/Window/GlResource.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <SFML/System/Vector2.hpp>\n#include <SFML/System/Vector3.hpp>\n#include <map>\n#include <string>\n\n\nnamespace sf\n{\nclass Color;\nclass InputStream;\nclass Texture;\nclass Transform;\n\n////////////////////////////////////////////////////////////\n/// \\brief Shader class (vertex, geometry and fragment)\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Shader : GlResource, NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Types of shaders\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Type\n    {\n        Vertex,   //!< %Vertex shader\n        Geometry, //!< Geometry shader\n        Fragment  //!< Fragment (pixel) shader\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Special type that can be passed to setUniform(),\n    ///        and that represents the texture of the object being drawn\n    ///\n    /// \\see setUniform(const std::string&, CurrentTextureType)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct CurrentTextureType {};\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Represents the texture of the object being drawn\n    ///\n    /// \\see setUniform(const std::string&, CurrentTextureType)\n    ///\n    ////////////////////////////////////////////////////////////\n    static CurrentTextureType CurrentTexture;\n\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor creates an invalid shader.\n    ///\n    ////////////////////////////////////////////////////////////\n    Shader();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Shader();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the vertex, geometry or fragment shader from a file\n    ///\n    /// This function loads a single shader, vertex, geometry or\n    /// fragment, identified by the second argument.\n    /// The source must be a text file containing a valid\n    /// shader in GLSL language. GLSL is a C-like language\n    /// dedicated to OpenGL shaders; you'll probably need to\n    /// read a good documentation for it before writing your\n    /// own shaders.\n    ///\n    /// \\param filename Path of the vertex, geometry or fragment shader file to load\n    /// \\param type     Type of shader (vertex, geometry or fragment)\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromMemory, loadFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromFile(const std::string& filename, Type type);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load both the vertex and fragment shaders from files\n    ///\n    /// This function loads both the vertex and the fragment\n    /// shaders. If one of them fails to load, the shader is left\n    /// empty (the valid shader is unloaded).\n    /// The sources must be text files containing valid shaders\n    /// in GLSL language. GLSL is a C-like language dedicated to\n    /// OpenGL shaders; you'll probably need to read a good documentation\n    /// for it before writing your own shaders.\n    ///\n    /// \\param vertexShaderFilename   Path of the vertex shader file to load\n    /// \\param fragmentShaderFilename Path of the fragment shader file to load\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromMemory, loadFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromFile(const std::string& vertexShaderFilename, const std::string& fragmentShaderFilename);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the vertex, geometry and fragment shaders from files\n    ///\n    /// This function loads the vertex, geometry and fragment\n    /// shaders. If one of them fails to load, the shader is left\n    /// empty (the valid shader is unloaded).\n    /// The sources must be text files containing valid shaders\n    /// in GLSL language. GLSL is a C-like language dedicated to\n    /// OpenGL shaders; you'll probably need to read a good documentation\n    /// for it before writing your own shaders.\n    ///\n    /// \\param vertexShaderFilename   Path of the vertex shader file to load\n    /// \\param geometryShaderFilename Path of the geometry shader file to load\n    /// \\param fragmentShaderFilename Path of the fragment shader file to load\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromMemory, loadFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromFile(const std::string& vertexShaderFilename, const std::string& geometryShaderFilename, const std::string& fragmentShaderFilename);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the vertex, geometry or fragment shader from a source code in memory\n    ///\n    /// This function loads a single shader, vertex, geometry\n    /// or fragment, identified by the second argument.\n    /// The source code must be a valid shader in GLSL language.\n    /// GLSL is a C-like language dedicated to OpenGL shaders;\n    /// you'll probably need to read a good documentation for\n    /// it before writing your own shaders.\n    ///\n    /// \\param shader String containing the source code of the shader\n    /// \\param type   Type of shader (vertex, geometry or fragment)\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromMemory(const std::string& shader, Type type);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load both the vertex and fragment shaders from source codes in memory\n    ///\n    /// This function loads both the vertex and the fragment\n    /// shaders. If one of them fails to load, the shader is left\n    /// empty (the valid shader is unloaded).\n    /// The sources must be valid shaders in GLSL language. GLSL is\n    /// a C-like language dedicated to OpenGL shaders; you'll\n    /// probably need to read a good documentation for it before\n    /// writing your own shaders.\n    ///\n    /// \\param vertexShader   String containing the source code of the vertex shader\n    /// \\param fragmentShader String containing the source code of the fragment shader\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromMemory(const std::string& vertexShader, const std::string& fragmentShader);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the vertex, geometry and fragment shaders from source codes in memory\n    ///\n    /// This function loads the vertex, geometry and fragment\n    /// shaders. If one of them fails to load, the shader is left\n    /// empty (the valid shader is unloaded).\n    /// The sources must be valid shaders in GLSL language. GLSL is\n    /// a C-like language dedicated to OpenGL shaders; you'll\n    /// probably need to read a good documentation for it before\n    /// writing your own shaders.\n    ///\n    /// \\param vertexShader   String containing the source code of the vertex shader\n    /// \\param geometryShader String containing the source code of the geometry shader\n    /// \\param fragmentShader String containing the source code of the fragment shader\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromStream\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromMemory(const std::string& vertexShader, const std::string& geometryShader, const std::string& fragmentShader);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the vertex, geometry or fragment shader from a custom stream\n    ///\n    /// This function loads a single shader, vertex, geometry\n    /// or fragment, identified by the second argument.\n    /// The source code must be a valid shader in GLSL language.\n    /// GLSL is a C-like language dedicated to OpenGL shaders;\n    /// you'll probably need to read a good documentation for it\n    /// before writing your own shaders.\n    ///\n    /// \\param stream Source stream to read from\n    /// \\param type   Type of shader (vertex, geometry or fragment)\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromMemory\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromStream(InputStream& stream, Type type);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load both the vertex and fragment shaders from custom streams\n    ///\n    /// This function loads both the vertex and the fragment\n    /// shaders. If one of them fails to load, the shader is left\n    /// empty (the valid shader is unloaded).\n    /// The source codes must be valid shaders in GLSL language.\n    /// GLSL is a C-like language dedicated to OpenGL shaders;\n    /// you'll probably need to read a good documentation for\n    /// it before writing your own shaders.\n    ///\n    /// \\param vertexShaderStream   Source stream to read the vertex shader from\n    /// \\param fragmentShaderStream Source stream to read the fragment shader from\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromMemory\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromStream(InputStream& vertexShaderStream, InputStream& fragmentShaderStream);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the vertex, geometry and fragment shaders from custom streams\n    ///\n    /// This function loads the vertex, geometry and fragment\n    /// shaders. If one of them fails to load, the shader is left\n    /// empty (the valid shader is unloaded).\n    /// The source codes must be valid shaders in GLSL language.\n    /// GLSL is a C-like language dedicated to OpenGL shaders;\n    /// you'll probably need to read a good documentation for\n    /// it before writing your own shaders.\n    ///\n    /// \\param vertexShaderStream   Source stream to read the vertex shader from\n    /// \\param geometryShaderStream Source stream to read the geometry shader from\n    /// \\param fragmentShaderStream Source stream to read the fragment shader from\n    ///\n    /// \\return True if loading succeeded, false if it failed\n    ///\n    /// \\see loadFromFile, loadFromMemory\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromStream(InputStream& vertexShaderStream, InputStream& geometryShaderStream, InputStream& fragmentShaderStream);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p float uniform\n    ///\n    /// \\param name Name of the uniform variable in GLSL\n    /// \\param x    Value of the float scalar\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, float x);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p vec2 uniform\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param vector Value of the vec2 vector\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Vec2& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p vec3 uniform\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param vector Value of the vec3 vector\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Vec3& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p vec4 uniform\n    ///\n    /// This overload can also be called with sf::Color objects\n    /// that are converted to sf::Glsl::Vec4.\n    ///\n    /// It is important to note that the components of the color are\n    /// normalized before being passed to the shader. Therefore,\n    /// they are converted from range [0 .. 255] to range [0 .. 1].\n    /// For example, a sf::Color(255, 127, 0, 255) will be transformed\n    /// to a vec4(1.0, 0.5, 0.0, 1.0) in the shader.\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param vector Value of the vec4 vector\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Vec4& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p int uniform\n    ///\n    /// \\param name Name of the uniform variable in GLSL\n    /// \\param x    Value of the int scalar\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, int x);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p ivec2 uniform\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param vector Value of the ivec2 vector\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Ivec2& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p ivec3 uniform\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param vector Value of the ivec3 vector\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Ivec3& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p ivec4 uniform\n    ///\n    /// This overload can also be called with sf::Color objects\n    /// that are converted to sf::Glsl::Ivec4.\n    ///\n    /// If color conversions are used, the ivec4 uniform in GLSL\n    /// will hold the same values as the original sf::Color\n    /// instance. For example, sf::Color(255, 127, 0, 255) is\n    /// mapped to ivec4(255, 127, 0, 255).\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param vector Value of the ivec4 vector\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Ivec4& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p bool uniform\n    ///\n    /// \\param name Name of the uniform variable in GLSL\n    /// \\param x    Value of the bool scalar\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, bool x);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p bvec2 uniform\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param vector Value of the bvec2 vector\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Bvec2& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p bvec3 uniform\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param vector Value of the bvec3 vector\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Bvec3& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p bvec4 uniform\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param vector Value of the bvec4 vector\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Bvec4& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p mat3 matrix\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param matrix Value of the mat3 matrix\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Mat3& matrix);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify value for \\p mat4 matrix\n    ///\n    /// \\param name   Name of the uniform variable in GLSL\n    /// \\param matrix Value of the mat4 matrix\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Glsl::Mat4& matrix);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify a texture as \\p sampler2D uniform\n    ///\n    /// \\a name is the name of the variable to change in the shader.\n    /// The corresponding parameter in the shader must be a 2D texture\n    /// (\\p sampler2D GLSL type).\n    ///\n    /// Example:\n    /// \\code\n    /// uniform sampler2D the_texture; // this is the variable in the shader\n    /// \\endcode\n    /// \\code\n    /// sf::Texture texture;\n    /// ...\n    /// shader.setUniform(\"the_texture\", texture);\n    /// \\endcode\n    /// It is important to note that \\a texture must remain alive as long\n    /// as the shader uses it, no copy is made internally.\n    ///\n    /// To use the texture of the object being drawn, which cannot be\n    /// known in advance, you can pass the special value\n    /// sf::Shader::CurrentTexture:\n    /// \\code\n    /// shader.setUniform(\"the_texture\", sf::Shader::CurrentTexture).\n    /// \\endcode\n    ///\n    /// \\param name    Name of the texture in the shader\n    /// \\param texture Texture to assign\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, const Texture& texture);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify current texture as \\p sampler2D uniform\n    ///\n    /// This overload maps a shader texture variable to the\n    /// texture of the object being drawn, which cannot be\n    /// known in advance. The second argument must be\n    /// sf::Shader::CurrentTexture.\n    /// The corresponding parameter in the shader must be a 2D texture\n    /// (\\p sampler2D GLSL type).\n    ///\n    /// Example:\n    /// \\code\n    /// uniform sampler2D current; // this is the variable in the shader\n    /// \\endcode\n    /// \\code\n    /// shader.setUniform(\"current\", sf::Shader::CurrentTexture);\n    /// \\endcode\n    ///\n    /// \\param name Name of the texture in the shader\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniform(const std::string& name, CurrentTextureType);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify values for \\p float[] array uniform\n    ///\n    /// \\param name        Name of the uniform variable in GLSL\n    /// \\param scalarArray pointer to array of \\p float values\n    /// \\param length      Number of elements in the array\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniformArray(const std::string& name, const float* scalarArray, std::size_t length);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify values for \\p vec2[] array uniform\n    ///\n    /// \\param name        Name of the uniform variable in GLSL\n    /// \\param vectorArray pointer to array of \\p vec2 values\n    /// \\param length      Number of elements in the array\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniformArray(const std::string& name, const Glsl::Vec2* vectorArray, std::size_t length);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify values for \\p vec3[] array uniform\n    ///\n    /// \\param name        Name of the uniform variable in GLSL\n    /// \\param vectorArray pointer to array of \\p vec3 values\n    /// \\param length      Number of elements in the array\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniformArray(const std::string& name, const Glsl::Vec3* vectorArray, std::size_t length);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify values for \\p vec4[] array uniform\n    ///\n    /// \\param name        Name of the uniform variable in GLSL\n    /// \\param vectorArray pointer to array of \\p vec4 values\n    /// \\param length      Number of elements in the array\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniformArray(const std::string& name, const Glsl::Vec4* vectorArray, std::size_t length);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify values for \\p mat3[] array uniform\n    ///\n    /// \\param name        Name of the uniform variable in GLSL\n    /// \\param matrixArray pointer to array of \\p mat3 values\n    /// \\param length      Number of elements in the array\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniformArray(const std::string& name, const Glsl::Mat3* matrixArray, std::size_t length);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specify values for \\p mat4[] array uniform\n    ///\n    /// \\param name        Name of the uniform variable in GLSL\n    /// \\param matrixArray pointer to array of \\p mat4 values\n    /// \\param length      Number of elements in the array\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUniformArray(const std::string& name, const Glsl::Mat4* matrixArray, std::size_t length);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a float parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, float) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, float x);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a 2-components vector parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, const Glsl::Vec2&) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, float x, float y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a 3-components vector parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, const Glsl::Vec3&) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, float x, float y, float z);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a 4-components vector parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, const Glsl::Vec4&) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, float x, float y, float z, float w);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a 2-components vector parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, const Glsl::Vec2&) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, const Vector2f& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a 3-components vector parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, const Glsl::Vec3&) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, const Vector3f& vector);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a color parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, const Glsl::Vec4&) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, const Color& color);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a matrix parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, const Glsl::Mat4&) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, const Transform& transform);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a texture parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, const Texture&) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, const Texture& texture);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change a texture parameter of the shader\n    ///\n    /// \\deprecated Use setUniform(const std::string&, CurrentTextureType) instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setParameter(const std::string& name, CurrentTextureType);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the underlying OpenGL handle of the shader.\n    ///\n    /// You shouldn't need to use this function, unless you have\n    /// very specific stuff to implement that SFML doesn't support,\n    /// or implement a temporary workaround until a bug is fixed.\n    ///\n    /// \\return OpenGL handle of the shader or 0 if not yet loaded\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getNativeHandle() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Bind a shader for rendering\n    ///\n    /// This function is not part of the graphics API, it mustn't be\n    /// used when drawing SFML entities. It must be used only if you\n    /// mix sf::Shader with OpenGL code.\n    ///\n    /// \\code\n    /// sf::Shader s1, s2;\n    /// ...\n    /// sf::Shader::bind(&s1);\n    /// // draw OpenGL stuff that use s1...\n    /// sf::Shader::bind(&s2);\n    /// // draw OpenGL stuff that use s2...\n    /// sf::Shader::bind(NULL);\n    /// // draw OpenGL stuff that use no shader...\n    /// \\endcode\n    ///\n    /// \\param shader Shader to bind, can be null to use no shader\n    ///\n    ////////////////////////////////////////////////////////////\n    static void bind(const Shader* shader);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether or not the system supports shaders\n    ///\n    /// This function should always be called before using\n    /// the shader features. If it returns false, then\n    /// any attempt to use sf::Shader will fail.\n    ///\n    /// \\return True if shaders are supported, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isAvailable();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether or not the system supports geometry shaders\n    ///\n    /// This function should always be called before using\n    /// the geometry shader features. If it returns false, then\n    /// any attempt to use sf::Shader geometry shader features will fail.\n    ///\n    /// This function can only return true if isAvailable() would also\n    /// return true, since shaders in general have to be supported in\n    /// order for geometry shaders to be supported as well.\n    ///\n    /// Note: The first call to this function, whether by your\n    /// code or SFML will result in a context switch.\n    ///\n    /// \\return True if geometry shaders are supported, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isGeometryAvailable();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Compile the shader(s) and create the program\n    ///\n    /// If one of the arguments is NULL, the corresponding shader\n    /// is not created.\n    ///\n    /// \\param vertexShaderCode   Source code of the vertex shader\n    /// \\param geometryShaderCode Source code of the geometry shader\n    /// \\param fragmentShaderCode Source code of the fragment shader\n    ///\n    /// \\return True on success, false if any error happened\n    ///\n    ////////////////////////////////////////////////////////////\n    bool compile(const char* vertexShaderCode, const char* geometryShaderCode, const char* fragmentShaderCode);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Bind all the textures used by the shader\n    ///\n    /// This function each texture to a different unit, and\n    /// updates the corresponding variables in the shader accordingly.\n    ///\n    ////////////////////////////////////////////////////////////\n    void bindTextures() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the location ID of a shader uniform\n    ///\n    /// \\param name Name of the uniform variable to search\n    ///\n    /// \\return Location ID of the uniform, or -1 if not found\n    ///\n    ////////////////////////////////////////////////////////////\n    int getUniformLocation(const std::string& name);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief RAII object to save and restore the program\n    ///        binding while uniforms are being set\n    ///\n    /// Implementation is private in the .cpp file.\n    ///\n    ////////////////////////////////////////////////////////////\n    struct UniformBinder;\n\n    ////////////////////////////////////////////////////////////\n    // Types\n    ////////////////////////////////////////////////////////////\n    typedef std::map<int, const Texture*> TextureTable;\n    typedef std::map<std::string, int> UniformTable;\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    unsigned int m_shaderProgram;  //!< OpenGL identifier for the program\n    int          m_currentTexture; //!< Location of the current texture in the shader\n    TextureTable m_textures;       //!< Texture variables in the shader, mapped to their location\n    UniformTable m_uniforms;       //!< Parameters location cache\n};\n\n} // namespace sf\n\n\n#endif // SFML_SHADER_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Shader\n/// \\ingroup graphics\n///\n/// Shaders are programs written using a specific language,\n/// executed directly by the graphics card and allowing\n/// to apply real-time operations to the rendered entities.\n///\n/// There are three kinds of shaders:\n/// \\li %Vertex shaders, that process vertices\n/// \\li Geometry shaders, that process primitives\n/// \\li Fragment (pixel) shaders, that process pixels\n///\n/// A sf::Shader can be composed of either a vertex shader\n/// alone, a geometry shader alone, a fragment shader alone,\n/// or any combination of them. (see the variants of the\n/// load functions).\n///\n/// Shaders are written in GLSL, which is a C-like\n/// language dedicated to OpenGL shaders. You'll probably\n/// need to learn its basics before writing your own shaders\n/// for SFML.\n///\n/// Like any C/C++ program, a GLSL shader has its own variables\n/// called \\a uniforms that you can set from your C++ application.\n/// sf::Shader handles different types of uniforms:\n/// \\li scalars: \\p float, \\p int, \\p bool\n/// \\li vectors (2, 3 or 4 components)\n/// \\li matrices (3x3 or 4x4)\n/// \\li samplers (textures)\n///\n/// Some SFML-specific types can be converted:\n/// \\li sf::Color as a 4D vector (\\p vec4)\n/// \\li sf::Transform as matrices (\\p mat3 or \\p mat4)\n///\n/// Every uniform variable in a shader can be set through one of the\n/// setUniform() or setUniformArray() overloads. For example, if you\n/// have a shader with the following uniforms:\n/// \\code\n/// uniform float offset;\n/// uniform vec3 point;\n/// uniform vec4 color;\n/// uniform mat4 matrix;\n/// uniform sampler2D overlay;\n/// uniform sampler2D current;\n/// \\endcode\n/// You can set their values from C++ code as follows, using the types\n/// defined in the sf::Glsl namespace:\n/// \\code\n/// shader.setUniform(\"offset\", 2.f);\n/// shader.setUniform(\"point\", sf::Vector3f(0.5f, 0.8f, 0.3f));\n/// shader.setUniform(\"color\", sf::Glsl::Vec4(color));          // color is a sf::Color\n/// shader.setUniform(\"matrix\", sf::Glsl::Mat4(transform));     // transform is a sf::Transform\n/// shader.setUniform(\"overlay\", texture);                      // texture is a sf::Texture\n/// shader.setUniform(\"current\", sf::Shader::CurrentTexture);\n/// \\endcode\n///\n/// The old setParameter() overloads are deprecated and will be removed in a\n/// future version. You should use their setUniform() equivalents instead.\n///\n/// The special Shader::CurrentTexture argument maps the\n/// given \\p sampler2D uniform to the current texture of the\n/// object being drawn (which cannot be known in advance).\n///\n/// To apply a shader to a drawable, you must pass it as an\n/// additional parameter to the \\ref RenderWindow::draw function:\n/// \\code\n/// window.draw(sprite, &shader);\n/// \\endcode\n///\n/// ... which is in fact just a shortcut for this:\n/// \\code\n/// sf::RenderStates states;\n/// states.shader = &shader;\n/// window.draw(sprite, states);\n/// \\endcode\n///\n/// In the code above we pass a pointer to the shader, because it may\n/// be null (which means \"no shader\").\n///\n/// Shaders can be used on any drawable, but some combinations are\n/// not interesting. For example, using a vertex shader on a sf::Sprite\n/// is limited because there are only 4 vertices, the sprite would\n/// have to be subdivided in order to apply wave effects.\n/// Another bad example is a fragment shader with sf::Text: the texture\n/// of the text is not the actual text that you see on screen, it is\n/// a big texture containing all the characters of the font in an\n/// arbitrary order; thus, texture lookups on pixels other than the\n/// current one may not give you the expected result.\n///\n/// Shaders can also be used to apply global post-effects to the\n/// current contents of the target (like the old sf::PostFx class\n/// in SFML 1). This can be done in two different ways:\n/// \\li draw everything to a sf::RenderTexture, then draw it to\n///     the main target using the shader\n/// \\li draw everything directly to the main target, then use\n///     sf::Texture::update(Window&) to copy its contents to a texture\n///     and draw it to the main target using the shader\n///\n/// The first technique is more optimized because it doesn't involve\n/// retrieving the target's pixels to system memory, but the\n/// second one doesn't impact the rendering process and can be\n/// easily inserted anywhere without impacting all the code.\n///\n/// Like sf::Texture that can be used as a raw OpenGL texture,\n/// sf::Shader can also be used directly as a raw shader for\n/// custom OpenGL geometry.\n/// \\code\n/// sf::Shader::bind(&shader);\n/// ... render OpenGL geometry ...\n/// sf::Shader::bind(NULL);\n/// \\endcode\n///\n/// \\see sf::Glsl\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Shape.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SHAPE_HPP\n#define SFML_SHAPE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Drawable.hpp>\n#include <SFML/Graphics/Transformable.hpp>\n#include <SFML/Graphics/VertexArray.hpp>\n#include <SFML/System/Vector2.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Base class for textured shapes with outline\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Shape : public Drawable, public Transformable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Virtual destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~Shape();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the source texture of the shape\n    ///\n    /// The \\a texture argument refers to a texture that must\n    /// exist as long as the shape uses it. Indeed, the shape\n    /// doesn't store its own copy of the texture, but rather keeps\n    /// a pointer to the one that you passed to this function.\n    /// If the source texture is destroyed and the shape tries to\n    /// use it, the behavior is undefined.\n    /// \\a texture can be NULL to disable texturing.\n    /// If \\a resetRect is true, the TextureRect property of\n    /// the shape is automatically adjusted to the size of the new\n    /// texture. If it is false, the texture rect is left unchanged.\n    ///\n    /// \\param texture   New texture\n    /// \\param resetRect Should the texture rect be reset to the size of the new texture?\n    ///\n    /// \\see getTexture, setTextureRect\n    ///\n    ////////////////////////////////////////////////////////////\n    void setTexture(const Texture* texture, bool resetRect = false);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the sub-rectangle of the texture that the shape will display\n    ///\n    /// The texture rect is useful when you don't want to display\n    /// the whole texture, but rather a part of it.\n    /// By default, the texture rect covers the entire texture.\n    ///\n    /// \\param rect Rectangle defining the region of the texture to display\n    ///\n    /// \\see getTextureRect, setTexture\n    ///\n    ////////////////////////////////////////////////////////////\n    void setTextureRect(const IntRect& rect);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the fill color of the shape\n    ///\n    /// This color is modulated (multiplied) with the shape's\n    /// texture if any. It can be used to colorize the shape,\n    /// or change its global opacity.\n    /// You can use sf::Color::Transparent to make the inside of\n    /// the shape transparent, and have the outline alone.\n    /// By default, the shape's fill color is opaque white.\n    ///\n    /// \\param color New color of the shape\n    ///\n    /// \\see getFillColor, setOutlineColor\n    ///\n    ////////////////////////////////////////////////////////////\n    void setFillColor(const Color& color);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the outline color of the shape\n    ///\n    /// By default, the shape's outline color is opaque white.\n    ///\n    /// \\param color New outline color of the shape\n    ///\n    /// \\see getOutlineColor, setFillColor\n    ///\n    ////////////////////////////////////////////////////////////\n    void setOutlineColor(const Color& color);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the thickness of the shape's outline\n    ///\n    /// Note that negative values are allowed (so that the outline\n    /// expands towards the center of the shape), and using zero\n    /// disables the outline.\n    /// By default, the outline thickness is 0.\n    ///\n    /// \\param thickness New outline thickness\n    ///\n    /// \\see getOutlineThickness\n    ///\n    ////////////////////////////////////////////////////////////\n    void setOutlineThickness(float thickness);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the source texture of the shape\n    ///\n    /// If the shape has no source texture, a NULL pointer is returned.\n    /// The returned pointer is const, which means that you can't\n    /// modify the texture when you retrieve it with this function.\n    ///\n    /// \\return Pointer to the shape's texture\n    ///\n    /// \\see setTexture\n    ///\n    ////////////////////////////////////////////////////////////\n    const Texture* getTexture() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the sub-rectangle of the texture displayed by the shape\n    ///\n    /// \\return Texture rectangle of the shape\n    ///\n    /// \\see setTextureRect\n    ///\n    ////////////////////////////////////////////////////////////\n    const IntRect& getTextureRect() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the fill color of the shape\n    ///\n    /// \\return Fill color of the shape\n    ///\n    /// \\see setFillColor\n    ///\n    ////////////////////////////////////////////////////////////\n    const Color& getFillColor() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the outline color of the shape\n    ///\n    /// \\return Outline color of the shape\n    ///\n    /// \\see setOutlineColor\n    ///\n    ////////////////////////////////////////////////////////////\n    const Color& getOutlineColor() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the outline thickness of the shape\n    ///\n    /// \\return Outline thickness of the shape\n    ///\n    /// \\see setOutlineThickness\n    ///\n    ////////////////////////////////////////////////////////////\n    float getOutlineThickness() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the total number of points of the shape\n    ///\n    /// \\return Number of points of the shape\n    ///\n    /// \\see getPoint\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual std::size_t getPointCount() const = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a point of the shape\n    ///\n    /// The returned point is in local coordinates, that is,\n    /// the shape's transforms (position, rotation, scale) are\n    /// not taken into account.\n    /// The result is undefined if \\a index is out of the valid range.\n    ///\n    /// \\param index Index of the point to get, in range [0 .. getPointCount() - 1]\n    ///\n    /// \\return index-th point of the shape\n    ///\n    /// \\see getPointCount\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Vector2f getPoint(std::size_t index) const = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the local bounding rectangle of the entity\n    ///\n    /// The returned rectangle is in local coordinates, which means\n    /// that it ignores the transformations (translation, rotation,\n    /// scale, ...) that are applied to the entity.\n    /// In other words, this function returns the bounds of the\n    /// entity in the entity's coordinate system.\n    ///\n    /// \\return Local bounding rectangle of the entity\n    ///\n    ////////////////////////////////////////////////////////////\n    FloatRect getLocalBounds() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the global (non-minimal) bounding rectangle of the entity\n    ///\n    /// The returned rectangle is in global coordinates, which means\n    /// that it takes into account the transformations (translation,\n    /// rotation, scale, ...) that are applied to the entity.\n    /// In other words, this function returns the bounds of the\n    /// shape in the global 2D world's coordinate system.\n    ///\n    /// This function does not necessarily return the \\a minimal\n    /// bounding rectangle. It merely ensures that the returned\n    /// rectangle covers all the vertices (but possibly more).\n    /// This allows for a fast approximation of the bounds as a\n    /// first check; you may want to use more precise checks\n    /// on top of that.\n    ///\n    /// \\return Global bounding rectangle of the entity\n    ///\n    ////////////////////////////////////////////////////////////\n    FloatRect getGlobalBounds() const;\n\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    Shape();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Recompute the internal geometry of the shape\n    ///\n    /// This function must be called by the derived class everytime\n    /// the shape's points change (i.e. the result of either\n    /// getPointCount or getPoint is different).\n    ///\n    ////////////////////////////////////////////////////////////\n    void update();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw the shape to a render target\n    ///\n    /// \\param target Render target to draw to\n    /// \\param states Current render states\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void draw(RenderTarget& target, RenderStates states) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the fill vertices' color\n    ///\n    ////////////////////////////////////////////////////////////\n    void updateFillColors();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the fill vertices' texture coordinates\n    ///\n    ////////////////////////////////////////////////////////////\n    void updateTexCoords();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the outline vertices' position\n    ///\n    ////////////////////////////////////////////////////////////\n    void updateOutline();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the outline vertices' color\n    ///\n    ////////////////////////////////////////////////////////////\n    void updateOutlineColors();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    const Texture* m_texture;          //!< Texture of the shape\n    IntRect        m_textureRect;      //!< Rectangle defining the area of the source texture to display\n    Color          m_fillColor;        //!< Fill color\n    Color          m_outlineColor;     //!< Outline color\n    float          m_outlineThickness; //!< Thickness of the shape's outline\n    VertexArray    m_vertices;         //!< Vertex array containing the fill geometry\n    VertexArray    m_outlineVertices;  //!< Vertex array containing the outline geometry\n    FloatRect      m_insideBounds;     //!< Bounding rectangle of the inside (fill)\n    FloatRect      m_bounds;           //!< Bounding rectangle of the whole shape (outline + fill)\n};\n\n} // namespace sf\n\n\n#endif // SFML_SHAPE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Shape\n/// \\ingroup graphics\n///\n/// sf::Shape is a drawable class that allows to define and\n/// display a custom convex shape on a render target.\n/// It's only an abstract base, it needs to be specialized for\n/// concrete types of shapes (circle, rectangle, convex polygon,\n/// star, ...).\n///\n/// In addition to the attributes provided by the specialized\n/// shape classes, a shape always has the following attributes:\n/// \\li a texture\n/// \\li a texture rectangle\n/// \\li a fill color\n/// \\li an outline color\n/// \\li an outline thickness\n///\n/// Each feature is optional, and can be disabled easily:\n/// \\li the texture can be null\n/// \\li the fill/outline colors can be sf::Color::Transparent\n/// \\li the outline thickness can be zero\n///\n/// You can write your own derived shape class, there are only\n/// two virtual functions to override:\n/// \\li getPointCount must return the number of points of the shape\n/// \\li getPoint must return the points of the shape\n///\n/// \\see sf::RectangleShape, sf::CircleShape, sf::ConvexShape, sf::Transformable\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Sprite.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SPRITE_HPP\n#define SFML_SPRITE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Drawable.hpp>\n#include <SFML/Graphics/Transformable.hpp>\n#include <SFML/Graphics/Vertex.hpp>\n#include <SFML/Graphics/Rect.hpp>\n\n\nnamespace sf\n{\nclass Texture;\n\n////////////////////////////////////////////////////////////\n/// \\brief Drawable representation of a texture, with its\n///        own transformations, color, etc.\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Sprite : public Drawable, public Transformable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates an empty sprite with no source texture.\n    ///\n    ////////////////////////////////////////////////////////////\n    Sprite();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the sprite from a source texture\n    ///\n    /// \\param texture Source texture\n    ///\n    /// \\see setTexture\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit Sprite(const Texture& texture);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the sprite from a sub-rectangle of a source texture\n    ///\n    /// \\param texture   Source texture\n    /// \\param rectangle Sub-rectangle of the texture to assign to the sprite\n    ///\n    /// \\see setTexture, setTextureRect\n    ///\n    ////////////////////////////////////////////////////////////\n    Sprite(const Texture& texture, const IntRect& rectangle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the source texture of the sprite\n    ///\n    /// The \\a texture argument refers to a texture that must\n    /// exist as long as the sprite uses it. Indeed, the sprite\n    /// doesn't store its own copy of the texture, but rather keeps\n    /// a pointer to the one that you passed to this function.\n    /// If the source texture is destroyed and the sprite tries to\n    /// use it, the behavior is undefined.\n    /// If \\a resetRect is true, the TextureRect property of\n    /// the sprite is automatically adjusted to the size of the new\n    /// texture. If it is false, the texture rect is left unchanged.\n    ///\n    /// \\param texture   New texture\n    /// \\param resetRect Should the texture rect be reset to the size of the new texture?\n    ///\n    /// \\see getTexture, setTextureRect\n    ///\n    ////////////////////////////////////////////////////////////\n    void setTexture(const Texture& texture, bool resetRect = false);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the sub-rectangle of the texture that the sprite will display\n    ///\n    /// The texture rect is useful when you don't want to display\n    /// the whole texture, but rather a part of it.\n    /// By default, the texture rect covers the entire texture.\n    ///\n    /// \\param rectangle Rectangle defining the region of the texture to display\n    ///\n    /// \\see getTextureRect, setTexture\n    ///\n    ////////////////////////////////////////////////////////////\n    void setTextureRect(const IntRect& rectangle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the global color of the sprite\n    ///\n    /// This color is modulated (multiplied) with the sprite's\n    /// texture. It can be used to colorize the sprite, or change\n    /// its global opacity.\n    /// By default, the sprite's color is opaque white.\n    ///\n    /// \\param color New color of the sprite\n    ///\n    /// \\see getColor\n    ///\n    ////////////////////////////////////////////////////////////\n    void setColor(const Color& color);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the source texture of the sprite\n    ///\n    /// If the sprite has no source texture, a NULL pointer is returned.\n    /// The returned pointer is const, which means that you can't\n    /// modify the texture when you retrieve it with this function.\n    ///\n    /// \\return Pointer to the sprite's texture\n    ///\n    /// \\see setTexture\n    ///\n    ////////////////////////////////////////////////////////////\n    const Texture* getTexture() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the sub-rectangle of the texture displayed by the sprite\n    ///\n    /// \\return Texture rectangle of the sprite\n    ///\n    /// \\see setTextureRect\n    ///\n    ////////////////////////////////////////////////////////////\n    const IntRect& getTextureRect() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the global color of the sprite\n    ///\n    /// \\return Global color of the sprite\n    ///\n    /// \\see setColor\n    ///\n    ////////////////////////////////////////////////////////////\n    const Color& getColor() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the local bounding rectangle of the entity\n    ///\n    /// The returned rectangle is in local coordinates, which means\n    /// that it ignores the transformations (translation, rotation,\n    /// scale, ...) that are applied to the entity.\n    /// In other words, this function returns the bounds of the\n    /// entity in the entity's coordinate system.\n    ///\n    /// \\return Local bounding rectangle of the entity\n    ///\n    ////////////////////////////////////////////////////////////\n    FloatRect getLocalBounds() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the global bounding rectangle of the entity\n    ///\n    /// The returned rectangle is in global coordinates, which means\n    /// that it takes into account the transformations (translation,\n    /// rotation, scale, ...) that are applied to the entity.\n    /// In other words, this function returns the bounds of the\n    /// sprite in the global 2D world's coordinate system.\n    ///\n    /// \\return Global bounding rectangle of the entity\n    ///\n    ////////////////////////////////////////////////////////////\n    FloatRect getGlobalBounds() const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw the sprite to a render target\n    ///\n    /// \\param target Render target to draw to\n    /// \\param states Current render states\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void draw(RenderTarget& target, RenderStates states) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the vertices' positions\n    ///\n    ////////////////////////////////////////////////////////////\n    void updatePositions();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the vertices' texture coordinates\n    ///\n    ////////////////////////////////////////////////////////////\n    void updateTexCoords();\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Vertex         m_vertices[4]; //!< Vertices defining the sprite's geometry\n    const Texture* m_texture;     //!< Texture of the sprite\n    IntRect        m_textureRect; //!< Rectangle defining the area of the source texture to display\n};\n\n} // namespace sf\n\n\n#endif // SFML_SPRITE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Sprite\n/// \\ingroup graphics\n///\n/// sf::Sprite is a drawable class that allows to easily display\n/// a texture (or a part of it) on a render target.\n///\n/// It inherits all the functions from sf::Transformable:\n/// position, rotation, scale, origin. It also adds sprite-specific\n/// properties such as the texture to use, the part of it to display,\n/// and some convenience functions to change the overall color of the\n/// sprite, or to get its bounding rectangle.\n///\n/// sf::Sprite works in combination with the sf::Texture class, which\n/// loads and provides the pixel data of a given texture.\n///\n/// The separation of sf::Sprite and sf::Texture allows more flexibility\n/// and better performances: indeed a sf::Texture is a heavy resource,\n/// and any operation on it is slow (often too slow for real-time\n/// applications). On the other side, a sf::Sprite is a lightweight\n/// object which can use the pixel data of a sf::Texture and draw\n/// it with its own transformation/color/blending attributes.\n///\n/// It is important to note that the sf::Sprite instance doesn't\n/// copy the texture that it uses, it only keeps a reference to it.\n/// Thus, a sf::Texture must not be destroyed while it is\n/// used by a sf::Sprite (i.e. never write a function that\n/// uses a local sf::Texture instance for creating a sprite).\n///\n/// See also the note on coordinates and undistorted rendering in sf::Transformable.\n///\n/// Usage example:\n/// \\code\n/// // Declare and load a texture\n/// sf::Texture texture;\n/// texture.loadFromFile(\"texture.png\");\n///\n/// // Create a sprite\n/// sf::Sprite sprite;\n/// sprite.setTexture(texture);\n/// sprite.setTextureRect(sf::IntRect(10, 10, 50, 30));\n/// sprite.setColor(sf::Color(255, 255, 255, 200));\n/// sprite.setPosition(100, 25);\n///\n/// // Draw it\n/// window.draw(sprite);\n/// \\endcode\n///\n/// \\see sf::Texture, sf::Transformable\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Text.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_TEXT_HPP\n#define SFML_TEXT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Drawable.hpp>\n#include <SFML/Graphics/Transformable.hpp>\n#include <SFML/Graphics/Font.hpp>\n#include <SFML/Graphics/Rect.hpp>\n#include <SFML/Graphics/VertexArray.hpp>\n#include <SFML/System/String.hpp>\n#include <string>\n#include <vector>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Graphical text that can be drawn to a render target\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Text : public Drawable, public Transformable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enumeration of the string drawing styles\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Style\n    {\n        Regular       = 0,      //!< Regular characters, no style\n        Bold          = 1 << 0, //!< Bold characters\n        Italic        = 1 << 1, //!< Italic characters\n        Underlined    = 1 << 2, //!< Underlined characters\n        StrikeThrough = 1 << 3  //!< Strike through characters\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates an empty text.\n    ///\n    ////////////////////////////////////////////////////////////\n    Text();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the text from a string, font and size\n    ///\n    /// Note that if the used font is a bitmap font, it is not\n    /// scalable, thus not all requested sizes will be available\n    /// to use. This needs to be taken into consideration when\n    /// setting the character size. If you need to display text\n    /// of a certain size, make sure the corresponding bitmap\n    /// font that supports that size is used.\n    ///\n    /// \\param string         Text assigned to the string\n    /// \\param font           Font used to draw the string\n    /// \\param characterSize  Base size of characters, in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    Text(const String& string, const Font& font, unsigned int characterSize = 30);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the text's string\n    ///\n    /// The \\a string argument is a sf::String, which can\n    /// automatically be constructed from standard string types.\n    /// So, the following calls are all valid:\n    /// \\code\n    /// text.setString(\"hello\");\n    /// text.setString(L\"hello\");\n    /// text.setString(std::string(\"hello\"));\n    /// text.setString(std::wstring(L\"hello\"));\n    /// \\endcode\n    /// A text's string is empty by default.\n    ///\n    /// \\param string New string\n    ///\n    /// \\see getString\n    ///\n    ////////////////////////////////////////////////////////////\n    void setString(const String& string);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the text's font\n    ///\n    /// The \\a font argument refers to a font that must\n    /// exist as long as the text uses it. Indeed, the text\n    /// doesn't store its own copy of the font, but rather keeps\n    /// a pointer to the one that you passed to this function.\n    /// If the font is destroyed and the text tries to\n    /// use it, the behavior is undefined.\n    ///\n    /// \\param font New font\n    ///\n    /// \\see getFont\n    ///\n    ////////////////////////////////////////////////////////////\n    void setFont(const Font& font);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the character size\n    ///\n    /// The default size is 30.\n    ///\n    /// Note that if the used font is a bitmap font, it is not\n    /// scalable, thus not all requested sizes will be available\n    /// to use. This needs to be taken into consideration when\n    /// setting the character size. If you need to display text\n    /// of a certain size, make sure the corresponding bitmap\n    /// font that supports that size is used.\n    ///\n    /// \\param size New character size, in pixels\n    ///\n    /// \\see getCharacterSize\n    ///\n    ////////////////////////////////////////////////////////////\n    void setCharacterSize(unsigned int size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the line spacing factor\n    ///\n    /// The default spacing between lines is defined by the font.\n    /// This method enables you to set a factor for the spacing\n    /// between lines. By default the line spacing factor is 1.\n    ///\n    /// \\param spacingFactor New line spacing factor\n    ///\n    /// \\see getLineSpacing\n    ///\n    ////////////////////////////////////////////////////////////\n    void setLineSpacing(float spacingFactor);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the letter spacing factor\n    ///\n    /// The default spacing between letters is defined by the font.\n    /// This factor doesn't directly apply to the existing\n    /// spacing between each character, it rather adds a fixed\n    /// space between them which is calculated from the font\n    /// metrics and the character size.\n    /// Note that factors below 1 (including negative numbers) bring\n    /// characters closer to each other.\n    /// By default the letter spacing factor is 1.\n    ///\n    /// \\param spacingFactor New letter spacing factor\n    ///\n    /// \\see getLetterSpacing\n    ///\n    ////////////////////////////////////////////////////////////\n    void setLetterSpacing(float spacingFactor);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the text's style\n    ///\n    /// You can pass a combination of one or more styles, for\n    /// example sf::Text::Bold | sf::Text::Italic.\n    /// The default style is sf::Text::Regular.\n    ///\n    /// \\param style New style\n    ///\n    /// \\see getStyle\n    ///\n    ////////////////////////////////////////////////////////////\n    void setStyle(Uint32 style);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the fill color of the text\n    ///\n    /// By default, the text's fill color is opaque white.\n    /// Setting the fill color to a transparent color with an outline\n    /// will cause the outline to be displayed in the fill area of the text.\n    ///\n    /// \\param color New fill color of the text\n    ///\n    /// \\see getFillColor\n    ///\n    /// \\deprecated There is now fill and outline colors instead\n    /// of a single global color.\n    /// Use setFillColor() or setOutlineColor() instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED void setColor(const Color& color);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the fill color of the text\n    ///\n    /// By default, the text's fill color is opaque white.\n    /// Setting the fill color to a transparent color with an outline\n    /// will cause the outline to be displayed in the fill area of the text.\n    ///\n    /// \\param color New fill color of the text\n    ///\n    /// \\see getFillColor\n    ///\n    ////////////////////////////////////////////////////////////\n    void setFillColor(const Color& color);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the outline color of the text\n    ///\n    /// By default, the text's outline color is opaque black.\n    ///\n    /// \\param color New outline color of the text\n    ///\n    /// \\see getOutlineColor\n    ///\n    ////////////////////////////////////////////////////////////\n    void setOutlineColor(const Color& color);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the thickness of the text's outline\n    ///\n    /// By default, the outline thickness is 0.\n    ///\n    /// Be aware that using a negative value for the outline\n    /// thickness will cause distorted rendering.\n    ///\n    /// \\param thickness New outline thickness, in pixels\n    ///\n    /// \\see getOutlineThickness\n    ///\n    ////////////////////////////////////////////////////////////\n    void setOutlineThickness(float thickness);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the text's string\n    ///\n    /// The returned string is a sf::String, which can automatically\n    /// be converted to standard string types. So, the following\n    /// lines of code are all valid:\n    /// \\code\n    /// sf::String   s1 = text.getString();\n    /// std::string  s2 = text.getString();\n    /// std::wstring s3 = text.getString();\n    /// \\endcode\n    ///\n    /// \\return Text's string\n    ///\n    /// \\see setString\n    ///\n    ////////////////////////////////////////////////////////////\n    const String& getString() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the text's font\n    ///\n    /// If the text has no font attached, a NULL pointer is returned.\n    /// The returned pointer is const, which means that you\n    /// cannot modify the font when you get it from this function.\n    ///\n    /// \\return Pointer to the text's font\n    ///\n    /// \\see setFont\n    ///\n    ////////////////////////////////////////////////////////////\n    const Font* getFont() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the character size\n    ///\n    /// \\return Size of the characters, in pixels\n    ///\n    /// \\see setCharacterSize\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getCharacterSize() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the size of the letter spacing factor\n    ///\n    /// \\return Size of the letter spacing factor\n    ///\n    /// \\see setLetterSpacing\n    ///\n    ////////////////////////////////////////////////////////////\n    float getLetterSpacing() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the size of the line spacing factor\n    ///\n    /// \\return Size of the line spacing factor\n    ///\n    /// \\see setLineSpacing\n    ///\n    ////////////////////////////////////////////////////////////\n    float getLineSpacing() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the text's style\n    ///\n    /// \\return Text's style\n    ///\n    /// \\see setStyle\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint32 getStyle() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the fill color of the text\n    ///\n    /// \\return Fill color of the text\n    ///\n    /// \\see setFillColor\n    ///\n    /// \\deprecated There is now fill and outline colors instead\n    /// of a single global color.\n    /// Use getFillColor() or getOutlineColor() instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    SFML_DEPRECATED const Color& getColor() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the fill color of the text\n    ///\n    /// \\return Fill color of the text\n    ///\n    /// \\see setFillColor\n    ///\n    ////////////////////////////////////////////////////////////\n    const Color& getFillColor() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the outline color of the text\n    ///\n    /// \\return Outline color of the text\n    ///\n    /// \\see setOutlineColor\n    ///\n    ////////////////////////////////////////////////////////////\n    const Color& getOutlineColor() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the outline thickness of the text\n    ///\n    /// \\return Outline thickness of the text, in pixels\n    ///\n    /// \\see setOutlineThickness\n    ///\n    ////////////////////////////////////////////////////////////\n    float getOutlineThickness() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the position of the \\a index-th character\n    ///\n    /// This function computes the visual position of a character\n    /// from its index in the string. The returned position is\n    /// in global coordinates (translation, rotation, scale and\n    /// origin are applied).\n    /// If \\a index is out of range, the position of the end of\n    /// the string is returned.\n    ///\n    /// \\param index Index of the character\n    ///\n    /// \\return Position of the character\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2f findCharacterPos(std::size_t index) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the local bounding rectangle of the entity\n    ///\n    /// The returned rectangle is in local coordinates, which means\n    /// that it ignores the transformations (translation, rotation,\n    /// scale, ...) that are applied to the entity.\n    /// In other words, this function returns the bounds of the\n    /// entity in the entity's coordinate system.\n    ///\n    /// \\return Local bounding rectangle of the entity\n    ///\n    ////////////////////////////////////////////////////////////\n    FloatRect getLocalBounds() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the global bounding rectangle of the entity\n    ///\n    /// The returned rectangle is in global coordinates, which means\n    /// that it takes into account the transformations (translation,\n    /// rotation, scale, ...) that are applied to the entity.\n    /// In other words, this function returns the bounds of the\n    /// text in the global 2D world's coordinate system.\n    ///\n    /// \\return Global bounding rectangle of the entity\n    ///\n    ////////////////////////////////////////////////////////////\n    FloatRect getGlobalBounds() const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw the text to a render target\n    ///\n    /// \\param target Render target to draw to\n    /// \\param states Current render states\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void draw(RenderTarget& target, RenderStates states) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Make sure the text's geometry is updated\n    ///\n    /// All the attributes related to rendering are cached, such\n    /// that the geometry is only updated when necessary.\n    ///\n    ////////////////////////////////////////////////////////////\n    void ensureGeometryUpdate() const;\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    String              m_string;              //!< String to display\n    const Font*         m_font;                //!< Font used to display the string\n    unsigned int        m_characterSize;       //!< Base size of characters, in pixels\n    float               m_letterSpacingFactor; //!< Spacing factor between letters\n    float               m_lineSpacingFactor;   //!< Spacing factor between lines\n    Uint32              m_style;               //!< Text style (see Style enum)\n    Color               m_fillColor;           //!< Text fill color\n    Color               m_outlineColor;        //!< Text outline color\n    float               m_outlineThickness;    //!< Thickness of the text's outline\n    mutable VertexArray m_vertices;            //!< Vertex array containing the fill geometry\n    mutable VertexArray m_outlineVertices;     //!< Vertex array containing the outline geometry\n    mutable FloatRect   m_bounds;              //!< Bounding rectangle of the text (in local coordinates)\n    mutable bool        m_geometryNeedUpdate;  //!< Does the geometry need to be recomputed?\n    mutable Uint64      m_fontTextureId;       //!< The font texture id\n};\n\n} // namespace sf\n\n\n#endif // SFML_TEXT_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Text\n/// \\ingroup graphics\n///\n/// sf::Text is a drawable class that allows to easily display\n/// some text with custom style and color on a render target.\n///\n/// It inherits all the functions from sf::Transformable:\n/// position, rotation, scale, origin. It also adds text-specific\n/// properties such as the font to use, the character size,\n/// the font style (bold, italic, underlined and strike through), the\n/// text color, the outline thickness, the outline color, the character\n/// spacing, the line spacing and the text to display of course.\n/// It also provides convenience functions to calculate the\n/// graphical size of the text, or to get the global position\n/// of a given character.\n///\n/// sf::Text works in combination with the sf::Font class, which\n/// loads and provides the glyphs (visual characters) of a given font.\n///\n/// The separation of sf::Font and sf::Text allows more flexibility\n/// and better performances: indeed a sf::Font is a heavy resource,\n/// and any operation on it is slow (often too slow for real-time\n/// applications). On the other side, a sf::Text is a lightweight\n/// object which can combine the glyphs data and metrics of a sf::Font\n/// to display any text on a render target.\n///\n/// It is important to note that the sf::Text instance doesn't\n/// copy the font that it uses, it only keeps a reference to it.\n/// Thus, a sf::Font must not be destructed while it is\n/// used by a sf::Text (i.e. never write a function that\n/// uses a local sf::Font instance for creating a text).\n///\n/// See also the note on coordinates and undistorted rendering in sf::Transformable.\n///\n/// Usage example:\n/// \\code\n/// // Declare and load a font\n/// sf::Font font;\n/// font.loadFromFile(\"arial.ttf\");\n///\n/// // Create a text\n/// sf::Text text(\"hello\", font);\n/// text.setCharacterSize(30);\n/// text.setStyle(sf::Text::Bold);\n/// text.setFillColor(sf::Color::Red);\n///\n/// // Draw it\n/// window.draw(text);\n/// \\endcode\n///\n/// \\see sf::Font, sf::Transformable\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Texture.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_TEXTURE_HPP\n#define SFML_TEXTURE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Image.hpp>\n#include <SFML/Window/GlResource.hpp>\n\n\nnamespace sf\n{\nclass InputStream;\nclass RenderTarget;\nclass RenderTexture;\nclass Text;\nclass Window;\n\n////////////////////////////////////////////////////////////\n/// \\brief Image living on the graphics card that can be used for drawing\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Texture : GlResource\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Types of texture coordinates that can be used for rendering\n    ///\n    ////////////////////////////////////////////////////////////\n    enum CoordinateType\n    {\n        Normalized, //!< Texture coordinates in range [0 .. 1]\n        Pixels      //!< Texture coordinates in range [0 .. size]\n    };\n\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates an empty texture.\n    ///\n    ////////////////////////////////////////////////////////////\n    Texture();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy constructor\n    ///\n    /// \\param copy instance to copy\n    ///\n    ////////////////////////////////////////////////////////////\n    Texture(const Texture& copy);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Texture();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create the texture\n    ///\n    /// If this function fails, the texture is left unchanged.\n    ///\n    /// \\param width  Width of the texture\n    /// \\param height Height of the texture\n    ///\n    /// \\return True if creation was successful\n    ///\n    ////////////////////////////////////////////////////////////\n    bool create(unsigned int width, unsigned int height);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the texture from a file on disk\n    ///\n    /// This function is a shortcut for the following code:\n    /// \\code\n    /// sf::Image image;\n    /// image.loadFromFile(filename);\n    /// texture.loadFromImage(image, area);\n    /// \\endcode\n    ///\n    /// The \\a area argument can be used to load only a sub-rectangle\n    /// of the whole image. If you want the entire image then leave\n    /// the default value (which is an empty IntRect).\n    /// If the \\a area rectangle crosses the bounds of the image, it\n    /// is adjusted to fit the image size.\n    ///\n    /// The maximum size for a texture depends on the graphics\n    /// driver and can be retrieved with the getMaximumSize function.\n    ///\n    /// If this function fails, the texture is left unchanged.\n    ///\n    /// \\param filename Path of the image file to load\n    /// \\param area     Area of the image to load\n    ///\n    /// \\return True if loading was successful\n    ///\n    /// \\see loadFromMemory, loadFromStream, loadFromImage\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromFile(const std::string& filename, const IntRect& area = IntRect());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the texture from a file in memory\n    ///\n    /// This function is a shortcut for the following code:\n    /// \\code\n    /// sf::Image image;\n    /// image.loadFromMemory(data, size);\n    /// texture.loadFromImage(image, area);\n    /// \\endcode\n    ///\n    /// The \\a area argument can be used to load only a sub-rectangle\n    /// of the whole image. If you want the entire image then leave\n    /// the default value (which is an empty IntRect).\n    /// If the \\a area rectangle crosses the bounds of the image, it\n    /// is adjusted to fit the image size.\n    ///\n    /// The maximum size for a texture depends on the graphics\n    /// driver and can be retrieved with the getMaximumSize function.\n    ///\n    /// If this function fails, the texture is left unchanged.\n    ///\n    /// \\param data Pointer to the file data in memory\n    /// \\param size Size of the data to load, in bytes\n    /// \\param area Area of the image to load\n    ///\n    /// \\return True if loading was successful\n    ///\n    /// \\see loadFromFile, loadFromStream, loadFromImage\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromMemory(const void* data, std::size_t size, const IntRect& area = IntRect());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the texture from a custom stream\n    ///\n    /// This function is a shortcut for the following code:\n    /// \\code\n    /// sf::Image image;\n    /// image.loadFromStream(stream);\n    /// texture.loadFromImage(image, area);\n    /// \\endcode\n    ///\n    /// The \\a area argument can be used to load only a sub-rectangle\n    /// of the whole image. If you want the entire image then leave\n    /// the default value (which is an empty IntRect).\n    /// If the \\a area rectangle crosses the bounds of the image, it\n    /// is adjusted to fit the image size.\n    ///\n    /// The maximum size for a texture depends on the graphics\n    /// driver and can be retrieved with the getMaximumSize function.\n    ///\n    /// If this function fails, the texture is left unchanged.\n    ///\n    /// \\param stream Source stream to read from\n    /// \\param area   Area of the image to load\n    ///\n    /// \\return True if loading was successful\n    ///\n    /// \\see loadFromFile, loadFromMemory, loadFromImage\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromStream(InputStream& stream, const IntRect& area = IntRect());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Load the texture from an image\n    ///\n    /// The \\a area argument can be used to load only a sub-rectangle\n    /// of the whole image. If you want the entire image then leave\n    /// the default value (which is an empty IntRect).\n    /// If the \\a area rectangle crosses the bounds of the image, it\n    /// is adjusted to fit the image size.\n    ///\n    /// The maximum size for a texture depends on the graphics\n    /// driver and can be retrieved with the getMaximumSize function.\n    ///\n    /// If this function fails, the texture is left unchanged.\n    ///\n    /// \\param image Image to load into the texture\n    /// \\param area  Area of the image to load\n    ///\n    /// \\return True if loading was successful\n    ///\n    /// \\see loadFromFile, loadFromMemory\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromImage(const Image& image, const IntRect& area = IntRect());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the size of the texture\n    ///\n    /// \\return Size in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2u getSize() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy the texture pixels to an image\n    ///\n    /// This function performs a slow operation that downloads\n    /// the texture's pixels from the graphics card and copies\n    /// them to a new image, potentially applying transformations\n    /// to pixels if necessary (texture may be padded or flipped).\n    ///\n    /// \\return Image containing the texture's pixels\n    ///\n    /// \\see loadFromImage\n    ///\n    ////////////////////////////////////////////////////////////\n    Image copyToImage() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the whole texture from an array of pixels\n    ///\n    /// The \\a pixel array is assumed to have the same size as\n    /// the \\a area rectangle, and to contain 32-bits RGBA pixels.\n    ///\n    /// No additional check is performed on the size of the pixel\n    /// array, passing invalid arguments will lead to an undefined\n    /// behavior.\n    ///\n    /// This function does nothing if \\a pixels is null or if the\n    /// texture was not previously created.\n    ///\n    /// \\param pixels Array of pixels to copy to the texture\n    ///\n    ////////////////////////////////////////////////////////////\n    void update(const Uint8* pixels);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update a part of the texture from an array of pixels\n    ///\n    /// The size of the \\a pixel array must match the \\a width and\n    /// \\a height arguments, and it must contain 32-bits RGBA pixels.\n    ///\n    /// No additional check is performed on the size of the pixel\n    /// array or the bounds of the area to update, passing invalid\n    /// arguments will lead to an undefined behavior.\n    ///\n    /// This function does nothing if \\a pixels is null or if the\n    /// texture was not previously created.\n    ///\n    /// \\param pixels Array of pixels to copy to the texture\n    /// \\param width  Width of the pixel region contained in \\a pixels\n    /// \\param height Height of the pixel region contained in \\a pixels\n    /// \\param x      X offset in the texture where to copy the source pixels\n    /// \\param y      Y offset in the texture where to copy the source pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    void update(const Uint8* pixels, unsigned int width, unsigned int height, unsigned int x, unsigned int y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update a part of this texture from another texture\n    ///\n    /// Although the source texture can be smaller than this texture,\n    /// this function is usually used for updating the whole texture.\n    /// The other overload, which has (x, y) additional arguments,\n    /// is more convenient for updating a sub-area of this texture.\n    ///\n    /// No additional check is performed on the size of the passed\n    /// texture, passing a texture bigger than this texture\n    /// will lead to an undefined behavior.\n    ///\n    /// This function does nothing if either texture was not\n    /// previously created.\n    ///\n    /// \\param texture Source texture to copy to this texture\n    ///\n    ////////////////////////////////////////////////////////////\n    void update(const Texture& texture);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update a part of this texture from another texture\n    ///\n    /// No additional check is performed on the size of the texture,\n    /// passing an invalid combination of texture size and offset\n    /// will lead to an undefined behavior.\n    ///\n    /// This function does nothing if either texture was not\n    /// previously created.\n    ///\n    /// \\param texture Source texture to copy to this texture\n    /// \\param x       X offset in this texture where to copy the source texture\n    /// \\param y       Y offset in this texture where to copy the source texture\n    ///\n    ////////////////////////////////////////////////////////////\n    void update(const Texture& texture, unsigned int x, unsigned int y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the texture from an image\n    ///\n    /// Although the source image can be smaller than the texture,\n    /// this function is usually used for updating the whole texture.\n    /// The other overload, which has (x, y) additional arguments,\n    /// is more convenient for updating a sub-area of the texture.\n    ///\n    /// No additional check is performed on the size of the image,\n    /// passing an image bigger than the texture will lead to an\n    /// undefined behavior.\n    ///\n    /// This function does nothing if the texture was not\n    /// previously created.\n    ///\n    /// \\param image Image to copy to the texture\n    ///\n    ////////////////////////////////////////////////////////////\n    void update(const Image& image);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update a part of the texture from an image\n    ///\n    /// No additional check is performed on the size of the image,\n    /// passing an invalid combination of image size and offset\n    /// will lead to an undefined behavior.\n    ///\n    /// This function does nothing if the texture was not\n    /// previously created.\n    ///\n    /// \\param image Image to copy to the texture\n    /// \\param x     X offset in the texture where to copy the source image\n    /// \\param y     Y offset in the texture where to copy the source image\n    ///\n    ////////////////////////////////////////////////////////////\n    void update(const Image& image, unsigned int x, unsigned int y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the texture from the contents of a window\n    ///\n    /// Although the source window can be smaller than the texture,\n    /// this function is usually used for updating the whole texture.\n    /// The other overload, which has (x, y) additional arguments,\n    /// is more convenient for updating a sub-area of the texture.\n    ///\n    /// No additional check is performed on the size of the window,\n    /// passing a window bigger than the texture will lead to an\n    /// undefined behavior.\n    ///\n    /// This function does nothing if either the texture or the window\n    /// was not previously created.\n    ///\n    /// \\param window Window to copy to the texture\n    ///\n    ////////////////////////////////////////////////////////////\n    void update(const Window& window);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update a part of the texture from the contents of a window\n    ///\n    /// No additional check is performed on the size of the window,\n    /// passing an invalid combination of window size and offset\n    /// will lead to an undefined behavior.\n    ///\n    /// This function does nothing if either the texture or the window\n    /// was not previously created.\n    ///\n    /// \\param window Window to copy to the texture\n    /// \\param x      X offset in the texture where to copy the source window\n    /// \\param y      Y offset in the texture where to copy the source window\n    ///\n    ////////////////////////////////////////////////////////////\n    void update(const Window& window, unsigned int x, unsigned int y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enable or disable the smooth filter\n    ///\n    /// When the filter is activated, the texture appears smoother\n    /// so that pixels are less noticeable. However if you want\n    /// the texture to look exactly the same as its source file,\n    /// you should leave it disabled.\n    /// The smooth filter is disabled by default.\n    ///\n    /// \\param smooth True to enable smoothing, false to disable it\n    ///\n    /// \\see isSmooth\n    ///\n    ////////////////////////////////////////////////////////////\n    void setSmooth(bool smooth);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether the smooth filter is enabled or not\n    ///\n    /// \\return True if smoothing is enabled, false if it is disabled\n    ///\n    /// \\see setSmooth\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isSmooth() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enable or disable conversion from sRGB\n    ///\n    /// When providing texture data from an image file or memory, it can\n    /// either be stored in a linear color space or an sRGB color space.\n    /// Most digital images account for gamma correction already, so they\n    /// would need to be \"uncorrected\" back to linear color space before\n    /// being processed by the hardware. The hardware can automatically\n    /// convert it from the sRGB color space to a linear color space when\n    /// it gets sampled. When the rendered image gets output to the final\n    /// framebuffer, it gets converted back to sRGB.\n    ///\n    /// After enabling or disabling sRGB conversion, make sure to reload\n    /// the texture data in order for the setting to take effect.\n    ///\n    /// This option is only useful in conjunction with an sRGB capable\n    /// framebuffer. This can be requested during window creation.\n    ///\n    /// \\param sRgb True to enable sRGB conversion, false to disable it\n    ///\n    /// \\see isSrgb\n    ///\n    ////////////////////////////////////////////////////////////\n    void setSrgb(bool sRgb);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether the texture source is converted from sRGB or not\n    ///\n    /// \\return True if the texture source is converted from sRGB, false if not\n    ///\n    /// \\see setSrgb\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isSrgb() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enable or disable repeating\n    ///\n    /// Repeating is involved when using texture coordinates\n    /// outside the texture rectangle [0, 0, width, height].\n    /// In this case, if repeat mode is enabled, the whole texture\n    /// will be repeated as many times as needed to reach the\n    /// coordinate (for example, if the X texture coordinate is\n    /// 3 * width, the texture will be repeated 3 times).\n    /// If repeat mode is disabled, the \"extra space\" will instead\n    /// be filled with border pixels.\n    /// Warning: on very old graphics cards, white pixels may appear\n    /// when the texture is repeated. With such cards, repeat mode\n    /// can be used reliably only if the texture has power-of-two\n    /// dimensions (such as 256x128).\n    /// Repeating is disabled by default.\n    ///\n    /// \\param repeated True to repeat the texture, false to disable repeating\n    ///\n    /// \\see isRepeated\n    ///\n    ////////////////////////////////////////////////////////////\n    void setRepeated(bool repeated);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether the texture is repeated or not\n    ///\n    /// \\return True if repeat mode is enabled, false if it is disabled\n    ///\n    /// \\see setRepeated\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isRepeated() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Generate a mipmap using the current texture data\n    ///\n    /// Mipmaps are pre-computed chains of optimized textures. Each\n    /// level of texture in a mipmap is generated by halving each of\n    /// the previous level's dimensions. This is done until the final\n    /// level has the size of 1x1. The textures generated in this process may\n    /// make use of more advanced filters which might improve the visual quality\n    /// of textures when they are applied to objects much smaller than they are.\n    /// This is known as minification. Because fewer texels (texture elements)\n    /// have to be sampled from when heavily minified, usage of mipmaps\n    /// can also improve rendering performance in certain scenarios.\n    ///\n    /// Mipmap generation relies on the necessary OpenGL extension being\n    /// available. If it is unavailable or generation fails due to another\n    /// reason, this function will return false. Mipmap data is only valid from\n    /// the time it is generated until the next time the base level image is\n    /// modified, at which point this function will have to be called again to\n    /// regenerate it.\n    ///\n    /// \\return True if mipmap generation was successful, false if unsuccessful\n    ///\n    ////////////////////////////////////////////////////////////\n    bool generateMipmap();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of assignment operator\n    ///\n    /// \\param right Instance to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    Texture& operator =(const Texture& right);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Swap the contents of this texture with those of another\n    ///\n    /// \\param right Instance to swap with\n    ///\n    ////////////////////////////////////////////////////////////\n    void swap(Texture& right);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the underlying OpenGL handle of the texture.\n    ///\n    /// You shouldn't need to use this function, unless you have\n    /// very specific stuff to implement that SFML doesn't support,\n    /// or implement a temporary workaround until a bug is fixed.\n    ///\n    /// \\return OpenGL handle of the texture or 0 if not yet created\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getNativeHandle() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Bind a texture for rendering\n    ///\n    /// This function is not part of the graphics API, it mustn't be\n    /// used when drawing SFML entities. It must be used only if you\n    /// mix sf::Texture with OpenGL code.\n    ///\n    /// \\code\n    /// sf::Texture t1, t2;\n    /// ...\n    /// sf::Texture::bind(&t1);\n    /// // draw OpenGL stuff that use t1...\n    /// sf::Texture::bind(&t2);\n    /// // draw OpenGL stuff that use t2...\n    /// sf::Texture::bind(NULL);\n    /// // draw OpenGL stuff that use no texture...\n    /// \\endcode\n    ///\n    /// The \\a coordinateType argument controls how texture\n    /// coordinates will be interpreted. If Normalized (the default), they\n    /// must be in range [0 .. 1], which is the default way of handling\n    /// texture coordinates with OpenGL. If Pixels, they must be given\n    /// in pixels (range [0 .. size]). This mode is used internally by\n    /// the graphics classes of SFML, it makes the definition of texture\n    /// coordinates more intuitive for the high-level API, users don't need\n    /// to compute normalized values.\n    ///\n    /// \\param texture Pointer to the texture to bind, can be null to use no texture\n    /// \\param coordinateType Type of texture coordinates to use\n    ///\n    ////////////////////////////////////////////////////////////\n    static void bind(const Texture* texture, CoordinateType coordinateType = Normalized);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the maximum texture size allowed\n    ///\n    /// This maximum size is defined by the graphics driver.\n    /// You can expect a value of 512 pixels for low-end graphics\n    /// card, and up to 8192 pixels or more for newer hardware.\n    ///\n    /// \\return Maximum size allowed for textures, in pixels\n    ///\n    ////////////////////////////////////////////////////////////\n    static unsigned int getMaximumSize();\n\nprivate:\n\n    friend class Text;\n    friend class RenderTexture;\n    friend class RenderTarget;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a valid image size according to hardware support\n    ///\n    /// This function checks whether the graphics driver supports\n    /// non power of two sizes or not, and adjusts the size\n    /// accordingly.\n    /// The returned size is greater than or equal to the original size.\n    ///\n    /// \\param size size to convert\n    ///\n    /// \\return Valid nearest size (greater than or equal to specified size)\n    ///\n    ////////////////////////////////////////////////////////////\n    static unsigned int getValidSize(unsigned int size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Invalidate the mipmap if one exists\n    ///\n    /// This also resets the texture's minifying function.\n    /// This function is mainly for internal use by RenderTexture.\n    ///\n    ////////////////////////////////////////////////////////////\n    void invalidateMipmap();\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Vector2u     m_size;          //!< Public texture size\n    Vector2u     m_actualSize;    //!< Actual texture size (can be greater than public size because of padding)\n    unsigned int m_texture;       //!< Internal texture identifier\n    bool         m_isSmooth;      //!< Status of the smooth filter\n    bool         m_sRgb;          //!< Should the texture source be converted from sRGB?\n    bool         m_isRepeated;    //!< Is the texture in repeat mode?\n    mutable bool m_pixelsFlipped; //!< To work around the inconsistency in Y orientation\n    bool         m_fboAttachment; //!< Is this texture owned by a framebuffer object?\n    bool         m_hasMipmap;     //!< Has the mipmap been generated?\n    Uint64       m_cacheId;       //!< Unique number that identifies the texture to the render target's cache\n};\n\n} // namespace sf\n\n\n#endif // SFML_TEXTURE_HPP\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Texture\n/// \\ingroup graphics\n///\n/// sf::Texture stores pixels that can be drawn, with a sprite\n/// for example. A texture lives in the graphics card memory,\n/// therefore it is very fast to draw a texture to a render target,\n/// or copy a render target to a texture (the graphics card can\n/// access both directly).\n///\n/// Being stored in the graphics card memory has some drawbacks.\n/// A texture cannot be manipulated as freely as a sf::Image,\n/// you need to prepare the pixels first and then upload them\n/// to the texture in a single operation (see Texture::update).\n///\n/// sf::Texture makes it easy to convert from/to sf::Image, but\n/// keep in mind that these calls require transfers between\n/// the graphics card and the central memory, therefore they are\n/// slow operations.\n///\n/// A texture can be loaded from an image, but also directly\n/// from a file/memory/stream. The necessary shortcuts are defined\n/// so that you don't need an image first for the most common cases.\n/// However, if you want to perform some modifications on the pixels\n/// before creating the final texture, you can load your file to a\n/// sf::Image, do whatever you need with the pixels, and then call\n/// Texture::loadFromImage.\n///\n/// Since they live in the graphics card memory, the pixels of a texture\n/// cannot be accessed without a slow copy first. And they cannot be\n/// accessed individually. Therefore, if you need to read the texture's\n/// pixels (like for pixel-perfect collisions), it is recommended to\n/// store the collision information separately, for example in an array\n/// of booleans.\n///\n/// Like sf::Image, sf::Texture can handle a unique internal\n/// representation of pixels, which is RGBA 32 bits. This means\n/// that a pixel must be composed of 8 bits red, green, blue and\n/// alpha channels -- just like a sf::Color.\n///\n/// Usage example:\n/// \\code\n/// // This example shows the most common use of sf::Texture:\n/// // drawing a sprite\n///\n/// // Load a texture from a file\n/// sf::Texture texture;\n/// if (!texture.loadFromFile(\"texture.png\"))\n///     return -1;\n///\n/// // Assign it to a sprite\n/// sf::Sprite sprite;\n/// sprite.setTexture(texture);\n///\n/// // Draw the textured sprite\n/// window.draw(sprite);\n/// \\endcode\n///\n/// \\code\n/// // This example shows another common use of sf::Texture:\n/// // streaming real-time data, like video frames\n///\n/// // Create an empty texture\n/// sf::Texture texture;\n/// if (!texture.create(640, 480))\n///     return -1;\n///\n/// // Create a sprite that will display the texture\n/// sf::Sprite sprite(texture);\n///\n/// while (...) // the main loop\n/// {\n///     ...\n///\n///     // update the texture\n///     sf::Uint8* pixels = ...; // get a fresh chunk of pixels (the next frame of a movie, for example)\n///     texture.update(pixels);\n///\n///     // draw it\n///     window.draw(sprite);\n///\n///     ...\n/// }\n///\n/// \\endcode\n///\n/// Like sf::Shader that can be used as a raw OpenGL shader,\n/// sf::Texture can also be used directly as a raw texture for\n/// custom OpenGL geometry.\n/// \\code\n/// sf::Texture::bind(&texture);\n/// ... render OpenGL geometry ...\n/// sf::Texture::bind(NULL);\n/// \\endcode\n///\n/// \\see sf::Sprite, sf::Image, sf::RenderTexture\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Transform.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_TRANSFORM_HPP\n#define SFML_TRANSFORM_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Rect.hpp>\n#include <SFML/System/Vector2.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Define a 3x3 transform matrix\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Transform\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates an identity transform (a transform that does nothing).\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a transform from a 3x3 matrix\n    ///\n    /// \\param a00 Element (0, 0) of the matrix\n    /// \\param a01 Element (0, 1) of the matrix\n    /// \\param a02 Element (0, 2) of the matrix\n    /// \\param a10 Element (1, 0) of the matrix\n    /// \\param a11 Element (1, 1) of the matrix\n    /// \\param a12 Element (1, 2) of the matrix\n    /// \\param a20 Element (2, 0) of the matrix\n    /// \\param a21 Element (2, 1) of the matrix\n    /// \\param a22 Element (2, 2) of the matrix\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform(float a00, float a01, float a02,\n              float a10, float a11, float a12,\n              float a20, float a21, float a22);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the transform as a 4x4 matrix\n    ///\n    /// This function returns a pointer to an array of 16 floats\n    /// containing the transform elements as a 4x4 matrix, which\n    /// is directly compatible with OpenGL functions.\n    ///\n    /// \\code\n    /// sf::Transform transform = ...;\n    /// glLoadMatrixf(transform.getMatrix());\n    /// \\endcode\n    ///\n    /// \\return Pointer to a 4x4 matrix\n    ///\n    ////////////////////////////////////////////////////////////\n    const float* getMatrix() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the inverse of the transform\n    ///\n    /// If the inverse cannot be computed, an identity transform\n    /// is returned.\n    ///\n    /// \\return A new transform which is the inverse of self\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform getInverse() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Transform a 2D point\n    ///\n    /// These two statements are equivalent:\n    /// \\code\n    /// sf::Vector2f transformedPoint = matrix.transformPoint(x, y);\n    /// sf::Vector2f transformedPoint = matrix * sf::Vector2f(x, y);\n    /// \\endcode\n    ///\n    /// \\param x X coordinate of the point to transform\n    /// \\param y Y coordinate of the point to transform\n    ///\n    /// \\return Transformed point\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2f transformPoint(float x, float y) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Transform a 2D point\n    ///\n    /// These two statements are equivalent:\n    /// \\code\n    /// sf::Vector2f transformedPoint = matrix.transformPoint(point);\n    /// sf::Vector2f transformedPoint = matrix * point;\n    /// \\endcode\n    ///\n    /// \\param point Point to transform\n    ///\n    /// \\return Transformed point\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2f transformPoint(const Vector2f& point) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Transform a rectangle\n    ///\n    /// Since SFML doesn't provide support for oriented rectangles,\n    /// the result of this function is always an axis-aligned\n    /// rectangle. Which means that if the transform contains a\n    /// rotation, the bounding rectangle of the transformed rectangle\n    /// is returned.\n    ///\n    /// \\param rectangle Rectangle to transform\n    ///\n    /// \\return Transformed rectangle\n    ///\n    ////////////////////////////////////////////////////////////\n    FloatRect transformRect(const FloatRect& rectangle) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with another one\n    ///\n    /// The result is a transform that is equivalent to applying\n    /// \\a transform followed by *this. Mathematically, it is\n    /// equivalent to a matrix multiplication (*this) * transform.\n    ///\n    /// These two statements are equivalent:\n    /// \\code\n    /// left.combine(right);\n    /// left *= right;\n    /// \\endcode\n    ///\n    /// \\param transform Transform to combine with this transform\n    ///\n    /// \\return Reference to *this\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& combine(const Transform& transform);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with a translation\n    ///\n    /// This function returns a reference to *this, so that calls\n    /// can be chained.\n    /// \\code\n    /// sf::Transform transform;\n    /// transform.translate(100, 200).rotate(45);\n    /// \\endcode\n    ///\n    /// \\param x Offset to apply on X axis\n    /// \\param y Offset to apply on Y axis\n    ///\n    /// \\return Reference to *this\n    ///\n    /// \\see rotate, scale\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& translate(float x, float y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with a translation\n    ///\n    /// This function returns a reference to *this, so that calls\n    /// can be chained.\n    /// \\code\n    /// sf::Transform transform;\n    /// transform.translate(sf::Vector2f(100, 200)).rotate(45);\n    /// \\endcode\n    ///\n    /// \\param offset Translation offset to apply\n    ///\n    /// \\return Reference to *this\n    ///\n    /// \\see rotate, scale\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& translate(const Vector2f& offset);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with a rotation\n    ///\n    /// This function returns a reference to *this, so that calls\n    /// can be chained.\n    /// \\code\n    /// sf::Transform transform;\n    /// transform.rotate(90).translate(50, 20);\n    /// \\endcode\n    ///\n    /// \\param angle Rotation angle, in degrees\n    ///\n    /// \\return Reference to *this\n    ///\n    /// \\see translate, scale\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& rotate(float angle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with a rotation\n    ///\n    /// The center of rotation is provided for convenience as a second\n    /// argument, so that you can build rotations around arbitrary points\n    /// more easily (and efficiently) than the usual\n    /// translate(-center).rotate(angle).translate(center).\n    ///\n    /// This function returns a reference to *this, so that calls\n    /// can be chained.\n    /// \\code\n    /// sf::Transform transform;\n    /// transform.rotate(90, 8, 3).translate(50, 20);\n    /// \\endcode\n    ///\n    /// \\param angle Rotation angle, in degrees\n    /// \\param centerX X coordinate of the center of rotation\n    /// \\param centerY Y coordinate of the center of rotation\n    ///\n    /// \\return Reference to *this\n    ///\n    /// \\see translate, scale\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& rotate(float angle, float centerX, float centerY);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with a rotation\n    ///\n    /// The center of rotation is provided for convenience as a second\n    /// argument, so that you can build rotations around arbitrary points\n    /// more easily (and efficiently) than the usual\n    /// translate(-center).rotate(angle).translate(center).\n    ///\n    /// This function returns a reference to *this, so that calls\n    /// can be chained.\n    /// \\code\n    /// sf::Transform transform;\n    /// transform.rotate(90, sf::Vector2f(8, 3)).translate(sf::Vector2f(50, 20));\n    /// \\endcode\n    ///\n    /// \\param angle Rotation angle, in degrees\n    /// \\param center Center of rotation\n    ///\n    /// \\return Reference to *this\n    ///\n    /// \\see translate, scale\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& rotate(float angle, const Vector2f& center);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with a scaling\n    ///\n    /// This function returns a reference to *this, so that calls\n    /// can be chained.\n    /// \\code\n    /// sf::Transform transform;\n    /// transform.scale(2, 1).rotate(45);\n    /// \\endcode\n    ///\n    /// \\param scaleX Scaling factor on the X axis\n    /// \\param scaleY Scaling factor on the Y axis\n    ///\n    /// \\return Reference to *this\n    ///\n    /// \\see translate, rotate\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& scale(float scaleX, float scaleY);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with a scaling\n    ///\n    /// The center of scaling is provided for convenience as a second\n    /// argument, so that you can build scaling around arbitrary points\n    /// more easily (and efficiently) than the usual\n    /// translate(-center).scale(factors).translate(center).\n    ///\n    /// This function returns a reference to *this, so that calls\n    /// can be chained.\n    /// \\code\n    /// sf::Transform transform;\n    /// transform.scale(2, 1, 8, 3).rotate(45);\n    /// \\endcode\n    ///\n    /// \\param scaleX Scaling factor on X axis\n    /// \\param scaleY Scaling factor on Y axis\n    /// \\param centerX X coordinate of the center of scaling\n    /// \\param centerY Y coordinate of the center of scaling\n    ///\n    /// \\return Reference to *this\n    ///\n    /// \\see translate, rotate\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& scale(float scaleX, float scaleY, float centerX, float centerY);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with a scaling\n    ///\n    /// This function returns a reference to *this, so that calls\n    /// can be chained.\n    /// \\code\n    /// sf::Transform transform;\n    /// transform.scale(sf::Vector2f(2, 1)).rotate(45);\n    /// \\endcode\n    ///\n    /// \\param factors Scaling factors\n    ///\n    /// \\return Reference to *this\n    ///\n    /// \\see translate, rotate\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& scale(const Vector2f& factors);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Combine the current transform with a scaling\n    ///\n    /// The center of scaling is provided for convenience as a second\n    /// argument, so that you can build scaling around arbitrary points\n    /// more easily (and efficiently) than the usual\n    /// translate(-center).scale(factors).translate(center).\n    ///\n    /// This function returns a reference to *this, so that calls\n    /// can be chained.\n    /// \\code\n    /// sf::Transform transform;\n    /// transform.scale(sf::Vector2f(2, 1), sf::Vector2f(8, 3)).rotate(45);\n    /// \\endcode\n    ///\n    /// \\param factors Scaling factors\n    /// \\param center Center of scaling\n    ///\n    /// \\return Reference to *this\n    ///\n    /// \\see translate, rotate\n    ///\n    ////////////////////////////////////////////////////////////\n    Transform& scale(const Vector2f& factors, const Vector2f& center);\n\n    ////////////////////////////////////////////////////////////\n    // Static member data\n    ////////////////////////////////////////////////////////////\n    static const Transform Identity; //!< The identity transform (does nothing)\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    float m_matrix[16]; //!< 4x4 matrix defining the transformation\n};\n\n////////////////////////////////////////////////////////////\n/// \\relates sf::Transform\n/// \\brief Overload of binary operator * to combine two transforms\n///\n/// This call is equivalent to calling Transform(left).combine(right).\n///\n/// \\param left Left operand (the first transform)\n/// \\param right Right operand (the second transform)\n///\n/// \\return New combined transform\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API Transform operator *(const Transform& left, const Transform& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates sf::Transform\n/// \\brief Overload of binary operator *= to combine two transforms\n///\n/// This call is equivalent to calling left.combine(right).\n///\n/// \\param left Left operand (the first transform)\n/// \\param right Right operand (the second transform)\n///\n/// \\return The combined transform\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API Transform& operator *=(Transform& left, const Transform& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates sf::Transform\n/// \\brief Overload of binary operator * to transform a point\n///\n/// This call is equivalent to calling left.transformPoint(right).\n///\n/// \\param left Left operand (the transform)\n/// \\param right Right operand (the point to transform)\n///\n/// \\return New transformed point\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API Vector2f operator *(const Transform& left, const Vector2f& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates sf::Transform\n/// \\brief Overload of binary operator == to compare two transforms\n///\n/// Performs an element-wise comparison of the elements of the\n/// left transform with the elements of the right transform.\n///\n/// \\param left Left operand (the first transform)\n/// \\param right Right operand (the second transform)\n///\n/// \\return true if the transforms are equal, false otherwise\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API bool operator ==(const Transform& left, const Transform& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates sf::Transform\n/// \\brief Overload of binary operator != to compare two transforms\n///\n/// This call is equivalent to !(left == right).\n///\n/// \\param left Left operand (the first transform)\n/// \\param right Right operand (the second transform)\n///\n/// \\return true if the transforms are not equal, false otherwise\n///\n////////////////////////////////////////////////////////////\nSFML_GRAPHICS_API bool operator !=(const Transform& left, const Transform& right);\n\n} // namespace sf\n\n\n#endif // SFML_TRANSFORM_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Transform\n/// \\ingroup graphics\n///\n/// A sf::Transform specifies how to translate, rotate, scale,\n/// shear, project, whatever things. In mathematical terms, it defines\n/// how to transform a coordinate system into another.\n///\n/// For example, if you apply a rotation transform to a sprite, the\n/// result will be a rotated sprite. And anything that is transformed\n/// by this rotation transform will be rotated the same way, according\n/// to its initial position.\n///\n/// Transforms are typically used for drawing. But they can also be\n/// used for any computation that requires to transform points between\n/// the local and global coordinate systems of an entity (like collision\n/// detection).\n///\n/// Example:\n/// \\code\n/// // define a translation transform\n/// sf::Transform translation;\n/// translation.translate(20, 50);\n///\n/// // define a rotation transform\n/// sf::Transform rotation;\n/// rotation.rotate(45);\n///\n/// // combine them\n/// sf::Transform transform = translation * rotation;\n///\n/// // use the result to transform stuff...\n/// sf::Vector2f point = transform.transformPoint(10, 20);\n/// sf::FloatRect rect = transform.transformRect(sf::FloatRect(0, 0, 10, 100));\n/// \\endcode\n///\n/// \\see sf::Transformable, sf::RenderStates\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Transformable.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_TRANSFORMABLE_HPP\n#define SFML_TRANSFORMABLE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Transform.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Decomposed transform defined by a position, a rotation and a scale\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Transformable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    Transformable();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Virtual destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~Transformable();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief set the position of the object\n    ///\n    /// This function completely overwrites the previous position.\n    /// See the move function to apply an offset based on the previous position instead.\n    /// The default position of a transformable object is (0, 0).\n    ///\n    /// \\param x X coordinate of the new position\n    /// \\param y Y coordinate of the new position\n    ///\n    /// \\see move, getPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPosition(float x, float y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief set the position of the object\n    ///\n    /// This function completely overwrites the previous position.\n    /// See the move function to apply an offset based on the previous position instead.\n    /// The default position of a transformable object is (0, 0).\n    ///\n    /// \\param position New position\n    ///\n    /// \\see move, getPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPosition(const Vector2f& position);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief set the orientation of the object\n    ///\n    /// This function completely overwrites the previous rotation.\n    /// See the rotate function to add an angle based on the previous rotation instead.\n    /// The default rotation of a transformable object is 0.\n    ///\n    /// \\param angle New rotation, in degrees\n    ///\n    /// \\see rotate, getRotation\n    ///\n    ////////////////////////////////////////////////////////////\n    void setRotation(float angle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief set the scale factors of the object\n    ///\n    /// This function completely overwrites the previous scale.\n    /// See the scale function to add a factor based on the previous scale instead.\n    /// The default scale of a transformable object is (1, 1).\n    ///\n    /// \\param factorX New horizontal scale factor\n    /// \\param factorY New vertical scale factor\n    ///\n    /// \\see scale, getScale\n    ///\n    ////////////////////////////////////////////////////////////\n    void setScale(float factorX, float factorY);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief set the scale factors of the object\n    ///\n    /// This function completely overwrites the previous scale.\n    /// See the scale function to add a factor based on the previous scale instead.\n    /// The default scale of a transformable object is (1, 1).\n    ///\n    /// \\param factors New scale factors\n    ///\n    /// \\see scale, getScale\n    ///\n    ////////////////////////////////////////////////////////////\n    void setScale(const Vector2f& factors);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief set the local origin of the object\n    ///\n    /// The origin of an object defines the center point for\n    /// all transformations (position, scale, rotation).\n    /// The coordinates of this point must be relative to the\n    /// top-left corner of the object, and ignore all\n    /// transformations (position, scale, rotation).\n    /// The default origin of a transformable object is (0, 0).\n    ///\n    /// \\param x X coordinate of the new origin\n    /// \\param y Y coordinate of the new origin\n    ///\n    /// \\see getOrigin\n    ///\n    ////////////////////////////////////////////////////////////\n    void setOrigin(float x, float y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief set the local origin of the object\n    ///\n    /// The origin of an object defines the center point for\n    /// all transformations (position, scale, rotation).\n    /// The coordinates of this point must be relative to the\n    /// top-left corner of the object, and ignore all\n    /// transformations (position, scale, rotation).\n    /// The default origin of a transformable object is (0, 0).\n    ///\n    /// \\param origin New origin\n    ///\n    /// \\see getOrigin\n    ///\n    ////////////////////////////////////////////////////////////\n    void setOrigin(const Vector2f& origin);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief get the position of the object\n    ///\n    /// \\return Current position\n    ///\n    /// \\see setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    const Vector2f& getPosition() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief get the orientation of the object\n    ///\n    /// The rotation is always in the range [0, 360].\n    ///\n    /// \\return Current rotation, in degrees\n    ///\n    /// \\see setRotation\n    ///\n    ////////////////////////////////////////////////////////////\n    float getRotation() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief get the current scale of the object\n    ///\n    /// \\return Current scale factors\n    ///\n    /// \\see setScale\n    ///\n    ////////////////////////////////////////////////////////////\n    const Vector2f& getScale() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief get the local origin of the object\n    ///\n    /// \\return Current origin\n    ///\n    /// \\see setOrigin\n    ///\n    ////////////////////////////////////////////////////////////\n    const Vector2f& getOrigin() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Move the object by a given offset\n    ///\n    /// This function adds to the current position of the object,\n    /// unlike setPosition which overwrites it.\n    /// Thus, it is equivalent to the following code:\n    /// \\code\n    /// sf::Vector2f pos = object.getPosition();\n    /// object.setPosition(pos.x + offsetX, pos.y + offsetY);\n    /// \\endcode\n    ///\n    /// \\param offsetX X offset\n    /// \\param offsetY Y offset\n    ///\n    /// \\see setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    void move(float offsetX, float offsetY);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Move the object by a given offset\n    ///\n    /// This function adds to the current position of the object,\n    /// unlike setPosition which overwrites it.\n    /// Thus, it is equivalent to the following code:\n    /// \\code\n    /// object.setPosition(object.getPosition() + offset);\n    /// \\endcode\n    ///\n    /// \\param offset Offset\n    ///\n    /// \\see setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    void move(const Vector2f& offset);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Rotate the object\n    ///\n    /// This function adds to the current rotation of the object,\n    /// unlike setRotation which overwrites it.\n    /// Thus, it is equivalent to the following code:\n    /// \\code\n    /// object.setRotation(object.getRotation() + angle);\n    /// \\endcode\n    ///\n    /// \\param angle Angle of rotation, in degrees\n    ///\n    ////////////////////////////////////////////////////////////\n    void rotate(float angle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Scale the object\n    ///\n    /// This function multiplies the current scale of the object,\n    /// unlike setScale which overwrites it.\n    /// Thus, it is equivalent to the following code:\n    /// \\code\n    /// sf::Vector2f scale = object.getScale();\n    /// object.setScale(scale.x * factorX, scale.y * factorY);\n    /// \\endcode\n    ///\n    /// \\param factorX Horizontal scale factor\n    /// \\param factorY Vertical scale factor\n    ///\n    /// \\see setScale\n    ///\n    ////////////////////////////////////////////////////////////\n    void scale(float factorX, float factorY);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Scale the object\n    ///\n    /// This function multiplies the current scale of the object,\n    /// unlike setScale which overwrites it.\n    /// Thus, it is equivalent to the following code:\n    /// \\code\n    /// sf::Vector2f scale = object.getScale();\n    /// object.setScale(scale.x * factor.x, scale.y * factor.y);\n    /// \\endcode\n    ///\n    /// \\param factor Scale factors\n    ///\n    /// \\see setScale\n    ///\n    ////////////////////////////////////////////////////////////\n    void scale(const Vector2f& factor);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief get the combined transform of the object\n    ///\n    /// \\return Transform combining the position/rotation/scale/origin of the object\n    ///\n    /// \\see getInverseTransform\n    ///\n    ////////////////////////////////////////////////////////////\n    const Transform& getTransform() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief get the inverse of the combined transform of the object\n    ///\n    /// \\return Inverse of the combined transformations applied to the object\n    ///\n    /// \\see getTransform\n    ///\n    ////////////////////////////////////////////////////////////\n    const Transform& getInverseTransform() const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Vector2f          m_origin;                     //!< Origin of translation/rotation/scaling of the object\n    Vector2f          m_position;                   //!< Position of the object in the 2D world\n    float             m_rotation;                   //!< Orientation of the object, in degrees\n    Vector2f          m_scale;                      //!< Scale of the object\n    mutable Transform m_transform;                  //!< Combined transformation of the object\n    mutable bool      m_transformNeedUpdate;        //!< Does the transform need to be recomputed?\n    mutable Transform m_inverseTransform;           //!< Combined transformation of the object\n    mutable bool      m_inverseTransformNeedUpdate; //!< Does the transform need to be recomputed?\n};\n\n} // namespace sf\n\n\n#endif // SFML_TRANSFORMABLE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Transformable\n/// \\ingroup graphics\n///\n/// This class is provided for convenience, on top of sf::Transform.\n///\n/// sf::Transform, as a low-level class, offers a great level of\n/// flexibility but it is not always convenient to manage. Indeed,\n/// one can easily combine any kind of operation, such as a translation\n/// followed by a rotation followed by a scaling, but once the result\n/// transform is built, there's no way to go backward and, let's say,\n/// change only the rotation without modifying the translation and scaling.\n/// The entire transform must be recomputed, which means that you\n/// need to retrieve the initial translation and scale factors as\n/// well, and combine them the same way you did before updating the\n/// rotation. This is a tedious operation, and it requires to store\n/// all the individual components of the final transform.\n///\n/// That's exactly what sf::Transformable was written for: it hides\n/// these variables and the composed transform behind an easy to use\n/// interface. You can set or get any of the individual components\n/// without worrying about the others. It also provides the composed\n/// transform (as a sf::Transform), and keeps it up-to-date.\n///\n/// In addition to the position, rotation and scale, sf::Transformable\n/// provides an \"origin\" component, which represents the local origin\n/// of the three other components. Let's take an example with a 10x10\n/// pixels sprite. By default, the sprite is positioned/rotated/scaled\n/// relatively to its top-left corner, because it is the local point\n/// (0, 0). But if we change the origin to be (5, 5), the sprite will\n/// be positioned/rotated/scaled around its center instead. And if\n/// we set the origin to (10, 10), it will be transformed around its\n/// bottom-right corner.\n///\n/// To keep the sf::Transformable class simple, there's only one\n/// origin for all the components. You cannot position the sprite\n/// relatively to its top-left corner while rotating it around its\n/// center, for example. To do such things, use sf::Transform directly.\n///\n/// sf::Transformable can be used as a base class. It is often\n/// combined with sf::Drawable -- that's what SFML's sprites,\n/// texts and shapes do.\n/// \\code\n/// class MyEntity : public sf::Transformable, public sf::Drawable\n/// {\n///     virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const\n///     {\n///         states.transform *= getTransform();\n///         target.draw(..., states);\n///     }\n/// };\n///\n/// MyEntity entity;\n/// entity.setPosition(10, 20);\n/// entity.setRotation(45);\n/// window.draw(entity);\n/// \\endcode\n///\n/// It can also be used as a member, if you don't want to use\n/// its API directly (because you don't need all its functions,\n/// or you have different naming conventions for example).\n/// \\code\n/// class MyEntity\n/// {\n/// public:\n///     void SetPosition(const MyVector& v)\n///     {\n///         myTransform.setPosition(v.x(), v.y());\n///     }\n///\n///     void Draw(sf::RenderTarget& target) const\n///     {\n///         target.draw(..., myTransform.getTransform());\n///     }\n///\n/// private:\n///     sf::Transformable myTransform;\n/// };\n/// \\endcode\n///\n/// A note on coordinates and undistorted rendering: \\n\n/// By default, SFML (or more exactly, OpenGL) may interpolate drawable objects\n/// such as sprites or texts when rendering. While this allows transitions\n/// like slow movements or rotations to appear smoothly, it can lead to\n/// unwanted results in some cases, for example blurred or distorted objects.\n/// In order to render a sf::Drawable object pixel-perfectly, make sure\n/// the involved coordinates allow a 1:1 mapping of pixels in the window\n/// to texels (pixels in the texture). More specifically, this means:\n/// * The object's position, origin and scale have no fractional part\n/// * The object's and the view's rotation are a multiple of 90 degrees\n/// * The view's center and size have no fractional part\n///\n/// \\see sf::Transform\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/Vertex.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_VERTEX_HPP\n#define SFML_VERTEX_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Color.hpp>\n#include <SFML/System/Vector2.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Define a point with color and texture coordinates\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API Vertex\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    Vertex();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the vertex from its position\n    ///\n    /// The vertex color is white and texture coordinates are (0, 0).\n    ///\n    /// \\param thePosition Vertex position\n    ///\n    ////////////////////////////////////////////////////////////\n    Vertex(const Vector2f& thePosition);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the vertex from its position and color\n    ///\n    /// The texture coordinates are (0, 0).\n    ///\n    /// \\param thePosition Vertex position\n    /// \\param theColor    Vertex color\n    ///\n    ////////////////////////////////////////////////////////////\n    Vertex(const Vector2f& thePosition, const Color& theColor);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the vertex from its position and texture coordinates\n    ///\n    /// The vertex color is white.\n    ///\n    /// \\param thePosition  Vertex position\n    /// \\param theTexCoords Vertex texture coordinates\n    ///\n    ////////////////////////////////////////////////////////////\n    Vertex(const Vector2f& thePosition, const Vector2f& theTexCoords);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the vertex from its position, color and texture coordinates\n    ///\n    /// \\param thePosition  Vertex position\n    /// \\param theColor     Vertex color\n    /// \\param theTexCoords Vertex texture coordinates\n    ///\n    ////////////////////////////////////////////////////////////\n    Vertex(const Vector2f& thePosition, const Color& theColor, const Vector2f& theTexCoords);\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Vector2f  position;  //!< 2D position of the vertex\n    Color     color;     //!< Color of the vertex\n    Vector2f  texCoords; //!< Coordinates of the texture's pixel to map to the vertex\n};\n\n} // namespace sf\n\n\n#endif // SFML_VERTEX_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Vertex\n/// \\ingroup graphics\n///\n/// A vertex is an improved point. It has a position and other\n/// extra attributes that will be used for drawing: in SFML,\n/// vertices also have a color and a pair of texture coordinates.\n///\n/// The vertex is the building block of drawing. Everything which\n/// is visible on screen is made of vertices. They are grouped\n/// as 2D primitives (triangles, quads, ...), and these primitives\n/// are grouped to create even more complex 2D entities such as\n/// sprites, texts, etc.\n///\n/// If you use the graphical entities of SFML (sprite, text, shape)\n/// you won't have to deal with vertices directly. But if you want\n/// to define your own 2D entities, such as tiled maps or particle\n/// systems, using vertices will allow you to get maximum performances.\n///\n/// Example:\n/// \\code\n/// // define a 100x100 square, red, with a 10x10 texture mapped on it\n/// sf::Vertex vertices[] =\n/// {\n///     sf::Vertex(sf::Vector2f(  0,   0), sf::Color::Red, sf::Vector2f( 0,  0)),\n///     sf::Vertex(sf::Vector2f(  0, 100), sf::Color::Red, sf::Vector2f( 0, 10)),\n///     sf::Vertex(sf::Vector2f(100, 100), sf::Color::Red, sf::Vector2f(10, 10)),\n///     sf::Vertex(sf::Vector2f(100,   0), sf::Color::Red, sf::Vector2f(10,  0))\n/// };\n///\n/// // draw it\n/// window.draw(vertices, 4, sf::Quads);\n/// \\endcode\n///\n/// Note: although texture coordinates are supposed to be an integer\n/// amount of pixels, their type is float because of some buggy graphics\n/// drivers that are not able to process integer coordinates correctly.\n///\n/// \\see sf::VertexArray\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/VertexArray.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_VERTEXARRAY_HPP\n#define SFML_VERTEXARRAY_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Vertex.hpp>\n#include <SFML/Graphics/PrimitiveType.hpp>\n#include <SFML/Graphics/Rect.hpp>\n#include <SFML/Graphics/Drawable.hpp>\n#include <vector>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Define a set of one or more 2D primitives\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API VertexArray : public Drawable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates an empty vertex array.\n    ///\n    ////////////////////////////////////////////////////////////\n    VertexArray();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the vertex array with a type and an initial number of vertices\n    ///\n    /// \\param type        Type of primitives\n    /// \\param vertexCount Initial number of vertices in the array\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit VertexArray(PrimitiveType type, std::size_t vertexCount = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the vertex count\n    ///\n    /// \\return Number of vertices in the array\n    ///\n    ////////////////////////////////////////////////////////////\n    std::size_t getVertexCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a read-write access to a vertex by its index\n    ///\n    /// This function doesn't check \\a index, it must be in range\n    /// [0, getVertexCount() - 1]. The behavior is undefined\n    /// otherwise.\n    ///\n    /// \\param index Index of the vertex to get\n    ///\n    /// \\return Reference to the index-th vertex\n    ///\n    /// \\see getVertexCount\n    ///\n    ////////////////////////////////////////////////////////////\n    Vertex& operator [](std::size_t index);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a read-only access to a vertex by its index\n    ///\n    /// This function doesn't check \\a index, it must be in range\n    /// [0, getVertexCount() - 1]. The behavior is undefined\n    /// otherwise.\n    ///\n    /// \\param index Index of the vertex to get\n    ///\n    /// \\return Const reference to the index-th vertex\n    ///\n    /// \\see getVertexCount\n    ///\n    ////////////////////////////////////////////////////////////\n    const Vertex& operator [](std::size_t index) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Clear the vertex array\n    ///\n    /// This function removes all the vertices from the array.\n    /// It doesn't deallocate the corresponding memory, so that\n    /// adding new vertices after clearing doesn't involve\n    /// reallocating all the memory.\n    ///\n    ////////////////////////////////////////////////////////////\n    void clear();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Resize the vertex array\n    ///\n    /// If \\a vertexCount is greater than the current size, the previous\n    /// vertices are kept and new (default-constructed) vertices are\n    /// added.\n    /// If \\a vertexCount is less than the current size, existing vertices\n    /// are removed from the array.\n    ///\n    /// \\param vertexCount New size of the array (number of vertices)\n    ///\n    ////////////////////////////////////////////////////////////\n    void resize(std::size_t vertexCount);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Add a vertex to the array\n    ///\n    /// \\param vertex Vertex to add\n    ///\n    ////////////////////////////////////////////////////////////\n    void append(const Vertex& vertex);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the type of primitives to draw\n    ///\n    /// This function defines how the vertices must be interpreted\n    /// when it's time to draw them:\n    /// \\li As points\n    /// \\li As lines\n    /// \\li As triangles\n    /// \\li As quads\n    /// The default primitive type is sf::Points.\n    ///\n    /// \\param type Type of primitive\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPrimitiveType(PrimitiveType type);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the type of primitives drawn by the vertex array\n    ///\n    /// \\return Primitive type\n    ///\n    ////////////////////////////////////////////////////////////\n    PrimitiveType getPrimitiveType() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Compute the bounding rectangle of the vertex array\n    ///\n    /// This function returns the minimal axis-aligned rectangle\n    /// that contains all the vertices of the array.\n    ///\n    /// \\return Bounding rectangle of the vertex array\n    ///\n    ////////////////////////////////////////////////////////////\n    FloatRect getBounds() const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw the vertex array to a render target\n    ///\n    /// \\param target Render target to draw to\n    /// \\param states Current render states\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void draw(RenderTarget& target, RenderStates states) const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    std::vector<Vertex> m_vertices;      //!< Vertices contained in the array\n    PrimitiveType       m_primitiveType; //!< Type of primitives to draw\n};\n\n} // namespace sf\n\n\n#endif // SFML_VERTEXARRAY_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::VertexArray\n/// \\ingroup graphics\n///\n/// sf::VertexArray is a very simple wrapper around a dynamic\n/// array of vertices and a primitives type.\n///\n/// It inherits sf::Drawable, but unlike other drawables it\n/// is not transformable.\n///\n/// Example:\n/// \\code\n/// sf::VertexArray lines(sf::LineStrip, 4);\n/// lines[0].position = sf::Vector2f(10, 0);\n/// lines[1].position = sf::Vector2f(20, 0);\n/// lines[2].position = sf::Vector2f(30, 5);\n/// lines[3].position = sf::Vector2f(40, 2);\n///\n/// window.draw(lines);\n/// \\endcode\n///\n/// \\see sf::Vertex\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/VertexBuffer.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_VERTEXBUFFER_HPP\n#define SFML_VERTEXBUFFER_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/PrimitiveType.hpp>\n#include <SFML/Graphics/Drawable.hpp>\n#include <SFML/Window/GlResource.hpp>\n\n\nnamespace sf\n{\nclass RenderTarget;\nclass Vertex;\n\n////////////////////////////////////////////////////////////\n/// \\brief Vertex buffer storage for one or more 2D primitives\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API VertexBuffer : public Drawable, private GlResource\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Usage specifiers\n    ///\n    /// If data is going to be updated once or more every frame,\n    /// set the usage to Stream. If data is going to be set once\n    /// and used for a long time without being modified, set the\n    /// usage to Static. For everything else Dynamic should be a\n    /// good compromise.\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Usage\n    {\n        Stream,  //!< Constantly changing data\n        Dynamic, //!< Occasionally changing data\n        Static   //!< Rarely changing data\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates an empty vertex buffer.\n    ///\n    ////////////////////////////////////////////////////////////\n    VertexBuffer();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a VertexBuffer with a specific PrimitiveType\n    ///\n    /// Creates an empty vertex buffer and sets its primitive type to \\p type.\n    ///\n    /// \\param type Type of primitive\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit VertexBuffer(PrimitiveType type);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a VertexBuffer with a specific usage specifier\n    ///\n    /// Creates an empty vertex buffer and sets its usage to \\p usage.\n    ///\n    /// \\param usage Usage specifier\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit VertexBuffer(Usage usage);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a VertexBuffer with a specific PrimitiveType and usage specifier\n    ///\n    /// Creates an empty vertex buffer and sets its primitive type\n    /// to \\p type and usage to \\p usage.\n    ///\n    /// \\param type  Type of primitive\n    /// \\param usage Usage specifier\n    ///\n    ////////////////////////////////////////////////////////////\n    VertexBuffer(PrimitiveType type, Usage usage);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy constructor\n    ///\n    /// \\param copy instance to copy\n    ///\n    ////////////////////////////////////////////////////////////\n    VertexBuffer(const VertexBuffer& copy);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~VertexBuffer();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create the vertex buffer\n    ///\n    /// Creates the vertex buffer and allocates enough graphics\n    /// memory to hold \\p vertexCount vertices. Any previously\n    /// allocated memory is freed in the process.\n    ///\n    /// In order to deallocate previously allocated memory pass 0\n    /// as \\p vertexCount. Don't forget to recreate with a non-zero\n    /// value when graphics memory should be allocated again.\n    ///\n    /// \\param vertexCount Number of vertices worth of memory to allocate\n    ///\n    /// \\return True if creation was successful\n    ///\n    ////////////////////////////////////////////////////////////\n    bool create(std::size_t vertexCount);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the vertex count\n    ///\n    /// \\return Number of vertices in the vertex buffer\n    ///\n    ////////////////////////////////////////////////////////////\n    std::size_t getVertexCount() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the whole buffer from an array of vertices\n    ///\n    /// The \\a vertex array is assumed to have the same size as\n    /// the \\a created buffer.\n    ///\n    /// No additional check is performed on the size of the vertex\n    /// array, passing invalid arguments will lead to undefined\n    /// behavior.\n    ///\n    /// This function does nothing if \\a vertices is null or if the\n    /// buffer was not previously created.\n    ///\n    /// \\param vertices Array of vertices to copy to the buffer\n    ///\n    /// \\return True if the update was successful\n    ///\n    ////////////////////////////////////////////////////////////\n    bool update(const Vertex* vertices);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update a part of the buffer from an array of vertices\n    ///\n    /// \\p offset is specified as the number of vertices to skip\n    /// from the beginning of the buffer.\n    ///\n    /// If \\p offset is 0 and \\p vertexCount is equal to the size of\n    /// the currently created buffer, its whole contents are replaced.\n    ///\n    /// If \\p offset is 0 and \\p vertexCount is greater than the\n    /// size of the currently created buffer, a new buffer is created\n    /// containing the vertex data.\n    ///\n    /// If \\p offset is 0 and \\p vertexCount is less than the size of\n    /// the currently created buffer, only the corresponding region\n    /// is updated.\n    ///\n    /// If \\p offset is not 0 and \\p offset + \\p vertexCount is greater\n    /// than the size of the currently created buffer, the update fails.\n    ///\n    /// No additional check is performed on the size of the vertex\n    /// array, passing invalid arguments will lead to undefined\n    /// behavior.\n    ///\n    /// \\param vertices    Array of vertices to copy to the buffer\n    /// \\param vertexCount Number of vertices to copy\n    /// \\param offset      Offset in the buffer to copy to\n    ///\n    /// \\return True if the update was successful\n    ///\n    ////////////////////////////////////////////////////////////\n    bool update(const Vertex* vertices, std::size_t vertexCount, unsigned int offset);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy the contents of another buffer into this buffer\n    ///\n    /// \\param vertexBuffer Vertex buffer whose contents to copy into this vertex buffer\n    ///\n    /// \\return True if the copy was successful\n    ///\n    ////////////////////////////////////////////////////////////\n    bool update(const VertexBuffer& vertexBuffer);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of assignment operator\n    ///\n    /// \\param right Instance to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    VertexBuffer& operator =(const VertexBuffer& right);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Swap the contents of this vertex buffer with those of another\n    ///\n    /// \\param right Instance to swap with\n    ///\n    ////////////////////////////////////////////////////////////\n    void swap(VertexBuffer& right);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the underlying OpenGL handle of the vertex buffer.\n    ///\n    /// You shouldn't need to use this function, unless you have\n    /// very specific stuff to implement that SFML doesn't support,\n    /// or implement a temporary workaround until a bug is fixed.\n    ///\n    /// \\return OpenGL handle of the vertex buffer or 0 if not yet created\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned int getNativeHandle() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the type of primitives to draw\n    ///\n    /// This function defines how the vertices must be interpreted\n    /// when it's time to draw them.\n    ///\n    /// The default primitive type is sf::Points.\n    ///\n    /// \\param type Type of primitive\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPrimitiveType(PrimitiveType type);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the type of primitives drawn by the vertex buffer\n    ///\n    /// \\return Primitive type\n    ///\n    ////////////////////////////////////////////////////////////\n    PrimitiveType getPrimitiveType() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the usage specifier of this vertex buffer\n    ///\n    /// This function provides a hint about how this vertex buffer is\n    /// going to be used in terms of data update frequency.\n    ///\n    /// After changing the usage specifier, the vertex buffer has\n    /// to be updated with new data for the usage specifier to\n    /// take effect.\n    ///\n    /// The default primitive type is sf::VertexBuffer::Stream.\n    ///\n    /// \\param usage Usage specifier\n    ///\n    ////////////////////////////////////////////////////////////\n    void setUsage(Usage usage);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the usage specifier of this vertex buffer\n    ///\n    /// \\return Usage specifier\n    ///\n    ////////////////////////////////////////////////////////////\n    Usage getUsage() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Bind a vertex buffer for rendering\n    ///\n    /// This function is not part of the graphics API, it mustn't be\n    /// used when drawing SFML entities. It must be used only if you\n    /// mix sf::VertexBuffer with OpenGL code.\n    ///\n    /// \\code\n    /// sf::VertexBuffer vb1, vb2;\n    /// ...\n    /// sf::VertexBuffer::bind(&vb1);\n    /// // draw OpenGL stuff that use vb1...\n    /// sf::VertexBuffer::bind(&vb2);\n    /// // draw OpenGL stuff that use vb2...\n    /// sf::VertexBuffer::bind(NULL);\n    /// // draw OpenGL stuff that use no vertex buffer...\n    /// \\endcode\n    ///\n    /// \\param vertexBuffer Pointer to the vertex buffer to bind, can be null to use no vertex buffer\n    ///\n    ////////////////////////////////////////////////////////////\n    static void bind(const VertexBuffer* vertexBuffer);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether or not the system supports vertex buffers\n    ///\n    /// This function should always be called before using\n    /// the vertex buffer features. If it returns false, then\n    /// any attempt to use sf::VertexBuffer will fail.\n    ///\n    /// \\return True if vertex buffers are supported, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isAvailable();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Draw the vertex buffer to a render target\n    ///\n    /// \\param target Render target to draw to\n    /// \\param states Current render states\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void draw(RenderTarget& target, RenderStates states) const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    unsigned int  m_buffer;        //!< Internal buffer identifier\n    std::size_t   m_size;          //!< Size in Vertexes of the currently allocated buffer\n    PrimitiveType m_primitiveType; //!< Type of primitives to draw\n    Usage         m_usage;         //!< How this vertex buffer is to be used\n};\n\n} // namespace sf\n\n\n#endif // SFML_VERTEXBUFFER_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::VertexBuffer\n/// \\ingroup graphics\n///\n/// sf::VertexBuffer is a simple wrapper around a dynamic\n/// buffer of vertices and a primitives type.\n///\n/// Unlike sf::VertexArray, the vertex data is stored in\n/// graphics memory.\n///\n/// In situations where a large amount of vertex data would\n/// have to be transferred from system memory to graphics memory\n/// every frame, using sf::VertexBuffer can help. By using a\n/// sf::VertexBuffer, data that has not been changed between frames\n/// does not have to be re-transferred from system to graphics\n/// memory as would be the case with sf::VertexArray. If data transfer\n/// is a bottleneck, this can lead to performance gains.\n///\n/// Using sf::VertexBuffer, the user also has the ability to only modify\n/// a portion of the buffer in graphics memory. This way, a large buffer\n/// can be allocated at the start of the application and only the\n/// applicable portions of it need to be updated during the course of\n/// the application. This allows the user to take full control of data\n/// transfers between system and graphics memory if they need to.\n///\n/// In special cases, the user can make use of multiple threads to update\n/// vertex data in multiple distinct regions of the buffer simultaneously.\n/// This might make sense when e.g. the position of multiple objects has to\n/// be recalculated very frequently. The computation load can be spread\n/// across multiple threads as long as there are no other data dependencies.\n///\n/// Simultaneous updates to the vertex buffer are not guaranteed to be\n/// carried out by the driver in any specific order. Updating the same\n/// region of the buffer from multiple threads will not cause undefined\n/// behaviour, however the final state of the buffer will be unpredictable.\n///\n/// Simultaneous updates of distinct non-overlapping regions of the buffer\n/// are also not guaranteed to complete in a specific order. However, in\n/// this case the user can make sure to synchronize the writer threads at\n/// well-defined points in their code. The driver will make sure that all\n/// pending data transfers complete before the vertex buffer is sourced\n/// by the rendering pipeline.\n///\n/// It inherits sf::Drawable, but unlike other drawables it\n/// is not transformable.\n///\n/// Example:\n/// \\code\n/// sf::Vertex vertices[15];\n/// ...\n/// sf::VertexBuffer triangles(sf::Triangles);\n/// triangles.create(15);\n/// triangles.update(vertices);\n/// ...\n/// window.draw(triangles);\n/// \\endcode\n///\n/// \\see sf::Vertex, sf::VertexArray\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics/View.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_VIEW_HPP\n#define SFML_VIEW_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Graphics/Export.hpp>\n#include <SFML/Graphics/Rect.hpp>\n#include <SFML/Graphics/Transform.hpp>\n#include <SFML/System/Vector2.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief 2D camera that defines what region is shown on screen\n///\n////////////////////////////////////////////////////////////\nclass SFML_GRAPHICS_API View\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor creates a default view of (0, 0, 1000, 1000)\n    ///\n    ////////////////////////////////////////////////////////////\n    View();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the view from a rectangle\n    ///\n    /// \\param rectangle Rectangle defining the zone to display\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit View(const FloatRect& rectangle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the view from its center and size\n    ///\n    /// \\param center Center of the zone to display\n    /// \\param size   Size of zone to display\n    ///\n    ////////////////////////////////////////////////////////////\n    View(const Vector2f& center, const Vector2f& size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the center of the view\n    ///\n    /// \\param x X coordinate of the new center\n    /// \\param y Y coordinate of the new center\n    ///\n    /// \\see setSize, getCenter\n    ///\n    ////////////////////////////////////////////////////////////\n    void setCenter(float x, float y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the center of the view\n    ///\n    /// \\param center New center\n    ///\n    /// \\see setSize, getCenter\n    ///\n    ////////////////////////////////////////////////////////////\n    void setCenter(const Vector2f& center);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the size of the view\n    ///\n    /// \\param width  New width of the view\n    /// \\param height New height of the view\n    ///\n    /// \\see setCenter, getCenter\n    ///\n    ////////////////////////////////////////////////////////////\n    void setSize(float width, float height);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the size of the view\n    ///\n    /// \\param size New size\n    ///\n    /// \\see setCenter, getCenter\n    ///\n    ////////////////////////////////////////////////////////////\n    void setSize(const Vector2f& size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the orientation of the view\n    ///\n    /// The default rotation of a view is 0 degree.\n    ///\n    /// \\param angle New angle, in degrees\n    ///\n    /// \\see getRotation\n    ///\n    ////////////////////////////////////////////////////////////\n    void setRotation(float angle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the target viewport\n    ///\n    /// The viewport is the rectangle into which the contents of the\n    /// view are displayed, expressed as a factor (between 0 and 1)\n    /// of the size of the RenderTarget to which the view is applied.\n    /// For example, a view which takes the left side of the target would\n    /// be defined with View.setViewport(sf::FloatRect(0, 0, 0.5, 1)).\n    /// By default, a view has a viewport which covers the entire target.\n    ///\n    /// \\param viewport New viewport rectangle\n    ///\n    /// \\see getViewport\n    ///\n    ////////////////////////////////////////////////////////////\n    void setViewport(const FloatRect& viewport);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Reset the view to the given rectangle\n    ///\n    /// Note that this function resets the rotation angle to 0.\n    ///\n    /// \\param rectangle Rectangle defining the zone to display\n    ///\n    /// \\see setCenter, setSize, setRotation\n    ///\n    ////////////////////////////////////////////////////////////\n    void reset(const FloatRect& rectangle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the center of the view\n    ///\n    /// \\return Center of the view\n    ///\n    /// \\see getSize, setCenter\n    ///\n    ////////////////////////////////////////////////////////////\n    const Vector2f& getCenter() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the size of the view\n    ///\n    /// \\return Size of the view\n    ///\n    /// \\see getCenter, setSize\n    ///\n    ////////////////////////////////////////////////////////////\n    const Vector2f& getSize() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current orientation of the view\n    ///\n    /// \\return Rotation angle of the view, in degrees\n    ///\n    /// \\see setRotation\n    ///\n    ////////////////////////////////////////////////////////////\n    float getRotation() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the target viewport rectangle of the view\n    ///\n    /// \\return Viewport rectangle, expressed as a factor of the target size\n    ///\n    /// \\see setViewport\n    ///\n    ////////////////////////////////////////////////////////////\n    const FloatRect& getViewport() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Move the view relatively to its current position\n    ///\n    /// \\param offsetX X coordinate of the move offset\n    /// \\param offsetY Y coordinate of the move offset\n    ///\n    /// \\see setCenter, rotate, zoom\n    ///\n    ////////////////////////////////////////////////////////////\n    void move(float offsetX, float offsetY);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Move the view relatively to its current position\n    ///\n    /// \\param offset Move offset\n    ///\n    /// \\see setCenter, rotate, zoom\n    ///\n    ////////////////////////////////////////////////////////////\n    void move(const Vector2f& offset);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Rotate the view relatively to its current orientation\n    ///\n    /// \\param angle Angle to rotate, in degrees\n    ///\n    /// \\see setRotation, move, zoom\n    ///\n    ////////////////////////////////////////////////////////////\n    void rotate(float angle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Resize the view rectangle relatively to its current size\n    ///\n    /// Resizing the view simulates a zoom, as the zone displayed on\n    /// screen grows or shrinks.\n    /// \\a factor is a multiplier:\n    /// \\li 1 keeps the size unchanged\n    /// \\li > 1 makes the view bigger (objects appear smaller)\n    /// \\li < 1 makes the view smaller (objects appear bigger)\n    ///\n    /// \\param factor Zoom factor to apply\n    ///\n    /// \\see setSize, move, rotate\n    ///\n    ////////////////////////////////////////////////////////////\n    void zoom(float factor);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the projection transform of the view\n    ///\n    /// This function is meant for internal use only.\n    ///\n    /// \\return Projection transform defining the view\n    ///\n    /// \\see getInverseTransform\n    ///\n    ////////////////////////////////////////////////////////////\n    const Transform& getTransform() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the inverse projection transform of the view\n    ///\n    /// This function is meant for internal use only.\n    ///\n    /// \\return Inverse of the projection transform defining the view\n    ///\n    /// \\see getTransform\n    ///\n    ////////////////////////////////////////////////////////////\n    const Transform& getInverseTransform() const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Vector2f          m_center;              //!< Center of the view, in scene coordinates\n    Vector2f          m_size;                //!< Size of the view, in scene coordinates\n    float             m_rotation;            //!< Angle of rotation of the view rectangle, in degrees\n    FloatRect         m_viewport;            //!< Viewport rectangle, expressed as a factor of the render-target's size\n    mutable Transform m_transform;           //!< Precomputed projection transform corresponding to the view\n    mutable Transform m_inverseTransform;    //!< Precomputed inverse projection transform corresponding to the view\n    mutable bool      m_transformUpdated;    //!< Internal state telling if the transform needs to be updated\n    mutable bool      m_invTransformUpdated; //!< Internal state telling if the inverse transform needs to be updated\n};\n\n} // namespace sf\n\n\n#endif // SFML_VIEW_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::View\n/// \\ingroup graphics\n///\n/// sf::View defines a camera in the 2D scene. This is a\n/// very powerful concept: you can scroll, rotate or zoom\n/// the entire scene without altering the way that your\n/// drawable objects are drawn.\n///\n/// A view is composed of a source rectangle, which defines\n/// what part of the 2D scene is shown, and a target viewport,\n/// which defines where the contents of the source rectangle\n/// will be displayed on the render target (window or texture).\n///\n/// The viewport allows to map the scene to a custom part\n/// of the render target, and can be used for split-screen\n/// or for displaying a minimap, for example. If the source\n/// rectangle doesn't have the same size as the viewport, its\n/// contents will be stretched to fit in.\n///\n/// To apply a view, you have to assign it to the render target.\n/// Then, objects drawn in this render target will be\n/// affected by the view until you use another view.\n///\n/// Usage example:\n/// \\code\n/// sf::RenderWindow window;\n/// sf::View view;\n///\n/// // Initialize the view to a rectangle located at (100, 100) and with a size of 400x200\n/// view.reset(sf::FloatRect(100, 100, 400, 200));\n///\n/// // Rotate it by 45 degrees\n/// view.rotate(45);\n///\n/// // Set its target viewport to be half of the window\n/// view.setViewport(sf::FloatRect(0.f, 0.f, 0.5f, 1.f));\n///\n/// // Apply it\n/// window.setView(view);\n///\n/// // Render stuff\n/// window.draw(someSprite);\n///\n/// // Set the default view back\n/// window.setView(window.getDefaultView());\n///\n/// // Render stuff not affected by the view\n/// window.draw(someText);\n/// \\endcode\n///\n/// See also the note on coordinates and undistorted rendering in sf::Transformable.\n///\n/// \\see sf::RenderWindow, sf::RenderTexture\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Graphics.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_GRAPHICS_HPP\n#define SFML_GRAPHICS_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n\n#include <SFML/Window.hpp>\n#include <SFML/Graphics/BlendMode.hpp>\n#include <SFML/Graphics/CircleShape.hpp>\n#include <SFML/Graphics/Color.hpp>\n#include <SFML/Graphics/ConvexShape.hpp>\n#include <SFML/Graphics/Drawable.hpp>\n#include <SFML/Graphics/Font.hpp>\n#include <SFML/Graphics/Glyph.hpp>\n#include <SFML/Graphics/Image.hpp>\n#include <SFML/Graphics/PrimitiveType.hpp>\n#include <SFML/Graphics/Rect.hpp>\n#include <SFML/Graphics/RectangleShape.hpp>\n#include <SFML/Graphics/RenderStates.hpp>\n#include <SFML/Graphics/RenderTarget.hpp>\n#include <SFML/Graphics/RenderTexture.hpp>\n#include <SFML/Graphics/RenderWindow.hpp>\n#include <SFML/Graphics/Shader.hpp>\n#include <SFML/Graphics/Shape.hpp>\n#include <SFML/Graphics/Sprite.hpp>\n#include <SFML/Graphics/Text.hpp>\n#include <SFML/Graphics/Texture.hpp>\n#include <SFML/Graphics/Transform.hpp>\n#include <SFML/Graphics/Transformable.hpp>\n#include <SFML/Graphics/Vertex.hpp>\n#include <SFML/Graphics/VertexArray.hpp>\n#include <SFML/Graphics/VertexBuffer.hpp>\n#include <SFML/Graphics/View.hpp>\n\n\n#endif // SFML_GRAPHICS_HPP\n\n////////////////////////////////////////////////////////////\n/// \\defgroup graphics Graphics module\n///\n/// 2D graphics module: sprites, text, shapes, ...\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Main.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_MAIN_HPP\n#define SFML_MAIN_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n\n#if defined(SFML_SYSTEM_IOS)\n\n    // On iOS, we have no choice but to have our own main,\n    // so we need to rename the user one and call it later\n    #define main sfmlMain\n\n#endif\n\n\n#endif // SFML_MAIN_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/Export.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_NETWORK_EXPORT_HPP\n#define SFML_NETWORK_EXPORT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n\n////////////////////////////////////////////////////////////\n// Define portable import / export macros\n////////////////////////////////////////////////////////////\n#if defined(SFML_NETWORK_EXPORTS)\n\n    #define SFML_NETWORK_API SFML_API_EXPORT\n\n#else\n\n    #define SFML_NETWORK_API SFML_API_IMPORT\n\n#endif\n\n\n#endif // SFML_NETWORK_EXPORT_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/Ftp.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_FTP_HPP\n#define SFML_FTP_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Network/Export.hpp>\n#include <SFML/Network/TcpSocket.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <SFML/System/Time.hpp>\n#include <string>\n#include <vector>\n\n\nnamespace sf\n{\nclass IpAddress;\n\n////////////////////////////////////////////////////////////\n/// \\brief A FTP client\n///\n////////////////////////////////////////////////////////////\nclass SFML_NETWORK_API Ftp : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enumeration of transfer modes\n    ///\n    ////////////////////////////////////////////////////////////\n    enum TransferMode\n    {\n        Binary, //!< Binary mode (file is transfered as a sequence of bytes)\n        Ascii,  //!< Text mode using ASCII encoding\n        Ebcdic  //!< Text mode using EBCDIC encoding\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Define a FTP response\n    ///\n    ////////////////////////////////////////////////////////////\n    class SFML_NETWORK_API Response\n    {\n    public:\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Status codes possibly returned by a FTP response\n        ///\n        ////////////////////////////////////////////////////////////\n        enum Status\n        {\n            // 1xx: the requested action is being initiated,\n            // expect another reply before proceeding with a new command\n            RestartMarkerReply          = 110, //!< Restart marker reply\n            ServiceReadySoon            = 120, //!< Service ready in N minutes\n            DataConnectionAlreadyOpened = 125, //!< Data connection already opened, transfer starting\n            OpeningDataConnection       = 150, //!< File status ok, about to open data connection\n\n            // 2xx: the requested action has been successfully completed\n            Ok                    = 200, //!< Command ok\n            PointlessCommand      = 202, //!< Command not implemented\n            SystemStatus          = 211, //!< System status, or system help reply\n            DirectoryStatus       = 212, //!< Directory status\n            FileStatus            = 213, //!< File status\n            HelpMessage           = 214, //!< Help message\n            SystemType            = 215, //!< NAME system type, where NAME is an official system name from the list in the Assigned Numbers document\n            ServiceReady          = 220, //!< Service ready for new user\n            ClosingConnection     = 221, //!< Service closing control connection\n            DataConnectionOpened  = 225, //!< Data connection open, no transfer in progress\n            ClosingDataConnection = 226, //!< Closing data connection, requested file action successful\n            EnteringPassiveMode   = 227, //!< Entering passive mode\n            LoggedIn              = 230, //!< User logged in, proceed. Logged out if appropriate\n            FileActionOk          = 250, //!< Requested file action ok\n            DirectoryOk           = 257, //!< PATHNAME created\n\n            // 3xx: the command has been accepted, but the requested action\n            // is dormant, pending receipt of further information\n            NeedPassword       = 331, //!< User name ok, need password\n            NeedAccountToLogIn = 332, //!< Need account for login\n            NeedInformation    = 350, //!< Requested file action pending further information\n\n            // 4xx: the command was not accepted and the requested action did not take place,\n            // but the error condition is temporary and the action may be requested again\n            ServiceUnavailable        = 421, //!< Service not available, closing control connection\n            DataConnectionUnavailable = 425, //!< Can't open data connection\n            TransferAborted           = 426, //!< Connection closed, transfer aborted\n            FileActionAborted         = 450, //!< Requested file action not taken\n            LocalError                = 451, //!< Requested action aborted, local error in processing\n            InsufficientStorageSpace  = 452, //!< Requested action not taken; insufficient storage space in system, file unavailable\n\n            // 5xx: the command was not accepted and\n            // the requested action did not take place\n            CommandUnknown          = 500, //!< Syntax error, command unrecognized\n            ParametersUnknown       = 501, //!< Syntax error in parameters or arguments\n            CommandNotImplemented   = 502, //!< Command not implemented\n            BadCommandSequence      = 503, //!< Bad sequence of commands\n            ParameterNotImplemented = 504, //!< Command not implemented for that parameter\n            NotLoggedIn             = 530, //!< Not logged in\n            NeedAccountToStore      = 532, //!< Need account for storing files\n            FileUnavailable         = 550, //!< Requested action not taken, file unavailable\n            PageTypeUnknown         = 551, //!< Requested action aborted, page type unknown\n            NotEnoughMemory         = 552, //!< Requested file action aborted, exceeded storage allocation\n            FilenameNotAllowed      = 553, //!< Requested action not taken, file name not allowed\n\n            // 10xx: SFML custom codes\n            InvalidResponse  = 1000, //!< Not part of the FTP standard, generated by SFML when a received response cannot be parsed\n            ConnectionFailed = 1001, //!< Not part of the FTP standard, generated by SFML when the low-level socket connection with the server fails\n            ConnectionClosed = 1002, //!< Not part of the FTP standard, generated by SFML when the low-level socket connection is unexpectedly closed\n            InvalidFile      = 1003  //!< Not part of the FTP standard, generated by SFML when a local file cannot be read or written\n        };\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Default constructor\n        ///\n        /// This constructor is used by the FTP client to build\n        /// the response.\n        ///\n        /// \\param code    Response status code\n        /// \\param message Response message\n        ///\n        ////////////////////////////////////////////////////////////\n        explicit Response(Status code = InvalidResponse, const std::string& message = \"\");\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Check if the status code means a success\n        ///\n        /// This function is defined for convenience, it is\n        /// equivalent to testing if the status code is < 400.\n        ///\n        /// \\return True if the status is a success, false if it is a failure\n        ///\n        ////////////////////////////////////////////////////////////\n        bool isOk() const;\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Get the status code of the response\n        ///\n        /// \\return Status code\n        ///\n        ////////////////////////////////////////////////////////////\n        Status getStatus() const;\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Get the full message contained in the response\n        ///\n        /// \\return The response message\n        ///\n        ////////////////////////////////////////////////////////////\n        const std::string& getMessage() const;\n\n    private:\n\n        ////////////////////////////////////////////////////////////\n        // Member data\n        ////////////////////////////////////////////////////////////\n        Status      m_status;  //!< Status code returned from the server\n        std::string m_message; //!< Last message received from the server\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specialization of FTP response returning a directory\n    ///\n    ////////////////////////////////////////////////////////////\n    class SFML_NETWORK_API DirectoryResponse : public Response\n    {\n    public:\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Default constructor\n        ///\n        /// \\param response Source response\n        ///\n        ////////////////////////////////////////////////////////////\n        DirectoryResponse(const Response& response);\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Get the directory returned in the response\n        ///\n        /// \\return Directory name\n        ///\n        ////////////////////////////////////////////////////////////\n        const std::string& getDirectory() const;\n\n    private:\n\n        ////////////////////////////////////////////////////////////\n        // Member data\n        ////////////////////////////////////////////////////////////\n        std::string m_directory; //!< Directory extracted from the response message\n    };\n\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Specialization of FTP response returning a\n    ///        filename listing\n    ////////////////////////////////////////////////////////////\n    class SFML_NETWORK_API ListingResponse : public Response\n    {\n    public:\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Default constructor\n        ///\n        /// \\param response  Source response\n        /// \\param data      Data containing the raw listing\n        ///\n        ////////////////////////////////////////////////////////////\n        ListingResponse(const Response& response, const std::string& data);\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Return the array of directory/file names\n        ///\n        /// \\return Array containing the requested listing\n        ///\n        ////////////////////////////////////////////////////////////\n        const std::vector<std::string>& getListing() const;\n\n    private:\n\n        ////////////////////////////////////////////////////////////\n        // Member data\n        ////////////////////////////////////////////////////////////\n        std::vector<std::string> m_listing; //!< Directory/file names extracted from the data\n    };\n\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// Automatically closes the connection with the server if\n    /// it is still opened.\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Ftp();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Connect to the specified FTP server\n    ///\n    /// The port has a default value of 21, which is the standard\n    /// port used by the FTP protocol. You shouldn't use a different\n    /// value, unless you really know what you do.\n    /// This function tries to connect to the server so it may take\n    /// a while to complete, especially if the server is not\n    /// reachable. To avoid blocking your application for too long,\n    /// you can use a timeout. The default value, Time::Zero, means that the\n    /// system timeout will be used (which is usually pretty long).\n    ///\n    /// \\param server  Name or address of the FTP server to connect to\n    /// \\param port    Port used for the connection\n    /// \\param timeout Maximum time to wait\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see disconnect\n    ///\n    ////////////////////////////////////////////////////////////\n    Response connect(const IpAddress& server, unsigned short port = 21, Time timeout = Time::Zero);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Close the connection with the server\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see connect\n    ///\n    ////////////////////////////////////////////////////////////\n    Response disconnect();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Log in using an anonymous account\n    ///\n    /// Logging in is mandatory after connecting to the server.\n    /// Users that are not logged in cannot perform any operation.\n    ///\n    /// \\return Server response to the request\n    ///\n    ////////////////////////////////////////////////////////////\n    Response login();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Log in using a username and a password\n    ///\n    /// Logging in is mandatory after connecting to the server.\n    /// Users that are not logged in cannot perform any operation.\n    ///\n    /// \\param name     User name\n    /// \\param password Password\n    ///\n    /// \\return Server response to the request\n    ///\n    ////////////////////////////////////////////////////////////\n    Response login(const std::string& name, const std::string& password);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Send a null command to keep the connection alive\n    ///\n    /// This command is useful because the server may close the\n    /// connection automatically if no command is sent.\n    ///\n    /// \\return Server response to the request\n    ///\n    ////////////////////////////////////////////////////////////\n    Response keepAlive();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current working directory\n    ///\n    /// The working directory is the root path for subsequent\n    /// operations involving directories and/or filenames.\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see getDirectoryListing, changeDirectory, parentDirectory\n    ///\n    ////////////////////////////////////////////////////////////\n    DirectoryResponse getWorkingDirectory();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the contents of the given directory\n    ///\n    /// This function retrieves the sub-directories and files\n    /// contained in the given directory. It is not recursive.\n    /// The \\a directory parameter is relative to the current\n    /// working directory.\n    ///\n    /// \\param directory Directory to list\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see getWorkingDirectory, changeDirectory, parentDirectory\n    ///\n    ////////////////////////////////////////////////////////////\n    ListingResponse getDirectoryListing(const std::string& directory = \"\");\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current working directory\n    ///\n    /// The new directory must be relative to the current one.\n    ///\n    /// \\param directory New working directory\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see getWorkingDirectory, getDirectoryListing, parentDirectory\n    ///\n    ////////////////////////////////////////////////////////////\n    Response changeDirectory(const std::string& directory);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Go to the parent directory of the current one\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see getWorkingDirectory, getDirectoryListing, changeDirectory\n    ///\n    ////////////////////////////////////////////////////////////\n    Response parentDirectory();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create a new directory\n    ///\n    /// The new directory is created as a child of the current\n    /// working directory.\n    ///\n    /// \\param name Name of the directory to create\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see deleteDirectory\n    ///\n    ////////////////////////////////////////////////////////////\n    Response createDirectory(const std::string& name);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Remove an existing directory\n    ///\n    /// The directory to remove must be relative to the\n    /// current working directory.\n    /// Use this function with caution, the directory will\n    /// be removed permanently!\n    ///\n    /// \\param name Name of the directory to remove\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see createDirectory\n    ///\n    ////////////////////////////////////////////////////////////\n    Response deleteDirectory(const std::string& name);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Rename an existing file\n    ///\n    /// The filenames must be relative to the current working\n    /// directory.\n    ///\n    /// \\param file    File to rename\n    /// \\param newName New name of the file\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see deleteFile\n    ///\n    ////////////////////////////////////////////////////////////\n    Response renameFile(const std::string& file, const std::string& newName);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Remove an existing file\n    ///\n    /// The file name must be relative to the current working\n    /// directory.\n    /// Use this function with caution, the file will be\n    /// removed permanently!\n    ///\n    /// \\param name File to remove\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see renameFile\n    ///\n    ////////////////////////////////////////////////////////////\n    Response deleteFile(const std::string& name);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Download a file from the server\n    ///\n    /// The filename of the distant file is relative to the\n    /// current working directory of the server, and the local\n    /// destination path is relative to the current directory\n    /// of your application.\n    /// If a file with the same filename as the distant file\n    /// already exists in the local destination path, it will\n    /// be overwritten.\n    ///\n    /// \\param remoteFile Filename of the distant file to download\n    /// \\param localPath  The directory in which to put the file on the local computer\n    /// \\param mode       Transfer mode\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see upload\n    ///\n    ////////////////////////////////////////////////////////////\n    Response download(const std::string& remoteFile, const std::string& localPath, TransferMode mode = Binary);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Upload a file to the server\n    ///\n    /// The name of the local file is relative to the current\n    /// working directory of your application, and the\n    /// remote path is relative to the current directory of the\n    /// FTP server.\n    ///\n    /// The append parameter controls whether the remote file is\n    /// appended to or overwritten if it already exists.\n    ///\n    /// \\param localFile  Path of the local file to upload\n    /// \\param remotePath The directory in which to put the file on the server\n    /// \\param mode       Transfer mode\n    /// \\param append     Pass true to append to or false to overwrite the remote file if it already exists\n    ///\n    /// \\return Server response to the request\n    ///\n    /// \\see download\n    ///\n    ////////////////////////////////////////////////////////////\n    Response upload(const std::string& localFile, const std::string& remotePath, TransferMode mode = Binary, bool append = false);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Send a command to the FTP server\n    ///\n    /// While the most often used commands are provided as member\n    /// functions in the sf::Ftp class, this method can be used\n    /// to send any FTP command to the server. If the command\n    /// requires one or more parameters, they can be specified\n    /// in \\a parameter. If the server returns information, you\n    /// can extract it from the response using Response::getMessage().\n    ///\n    /// \\param command   Command to send\n    /// \\param parameter Command parameter\n    ///\n    /// \\return Server response to the request\n    ///\n    ////////////////////////////////////////////////////////////\n    Response sendCommand(const std::string& command, const std::string& parameter = \"\");\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Receive a response from the server\n    ///\n    /// This function must be called after each call to\n    /// sendCommand that expects a response.\n    ///\n    /// \\return Server response to the request\n    ///\n    ////////////////////////////////////////////////////////////\n    Response getResponse();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Utility class for exchanging datas with the server\n    ///        on the data channel\n    ///\n    ////////////////////////////////////////////////////////////\n    class DataChannel;\n\n    friend class DataChannel;\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    TcpSocket   m_commandSocket; //!< Socket holding the control connection with the server\n    std::string m_receiveBuffer; //!< Received command data that is yet to be processed\n};\n\n} // namespace sf\n\n\n#endif // SFML_FTP_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Ftp\n/// \\ingroup network\n///\n/// sf::Ftp is a very simple FTP client that allows you\n/// to communicate with a FTP server. The FTP protocol allows\n/// you to manipulate a remote file system (list files,\n/// upload, download, create, remove, ...).\n///\n/// Using the FTP client consists of 4 parts:\n/// \\li Connecting to the FTP server\n/// \\li Logging in (either as a registered user or anonymously)\n/// \\li Sending commands to the server\n/// \\li Disconnecting (this part can be done implicitly by the destructor)\n///\n/// Every command returns a FTP response, which contains the\n/// status code as well as a message from the server. Some\n/// commands such as getWorkingDirectory() and getDirectoryListing()\n/// return additional data, and use a class derived from\n/// sf::Ftp::Response to provide this data. The most often used\n/// commands are directly provided as member functions, but it is\n/// also possible to use specific commands with the sendCommand() function.\n///\n/// Note that response statuses >= 1000 are not part of the FTP standard,\n/// they are generated by SFML when an internal error occurs.\n///\n/// All commands, especially upload and download, may take some\n/// time to complete. This is important to know if you don't want\n/// to block your application while the server is completing\n/// the task.\n///\n/// Usage example:\n/// \\code\n/// // Create a new FTP client\n/// sf::Ftp ftp;\n///\n/// // Connect to the server\n/// sf::Ftp::Response response = ftp.connect(\"ftp://ftp.myserver.com\");\n/// if (response.isOk())\n///     std::cout << \"Connected\" << std::endl;\n///\n/// // Log in\n/// response = ftp.login(\"laurent\", \"dF6Zm89D\");\n/// if (response.isOk())\n///     std::cout << \"Logged in\" << std::endl;\n///\n/// // Print the working directory\n/// sf::Ftp::DirectoryResponse directory = ftp.getWorkingDirectory();\n/// if (directory.isOk())\n///     std::cout << \"Working directory: \" << directory.getDirectory() << std::endl;\n///\n/// // Create a new directory\n/// response = ftp.createDirectory(\"files\");\n/// if (response.isOk())\n///     std::cout << \"Created new directory\" << std::endl;\n///\n/// // Upload a file to this new directory\n/// response = ftp.upload(\"local-path/file.txt\", \"files\", sf::Ftp::Ascii);\n/// if (response.isOk())\n///     std::cout << \"File uploaded\" << std::endl;\n///\n/// // Send specific commands (here: FEAT to list supported FTP features)\n/// response = ftp.sendCommand(\"FEAT\");\n/// if (response.isOk())\n///     std::cout << \"Feature list:\\n\" << response.getMessage() << std::endl;\n///\n/// // Disconnect from the server (optional)\n/// ftp.disconnect();\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/Http.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_HTTP_HPP\n#define SFML_HTTP_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Network/Export.hpp>\n#include <SFML/Network/IpAddress.hpp>\n#include <SFML/Network/TcpSocket.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <SFML/System/Time.hpp>\n#include <map>\n#include <string>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief A HTTP client\n///\n////////////////////////////////////////////////////////////\nclass SFML_NETWORK_API Http : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Define a HTTP request\n    ///\n    ////////////////////////////////////////////////////////////\n    class SFML_NETWORK_API Request\n    {\n    public:\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Enumerate the available HTTP methods for a request\n        ///\n        ////////////////////////////////////////////////////////////\n        enum Method\n        {\n            Get,   //!< Request in get mode, standard method to retrieve a page\n            Post,  //!< Request in post mode, usually to send data to a page\n            Head,  //!< Request a page's header only\n            Put,   //!< Request in put mode, useful for a REST API\n            Delete //!< Request in delete mode, useful for a REST API\n        };\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Default constructor\n        ///\n        /// This constructor creates a GET request, with the root\n        /// URI (\"/\") and an empty body.\n        ///\n        /// \\param uri    Target URI\n        /// \\param method Method to use for the request\n        /// \\param body   Content of the request's body\n        ///\n        ////////////////////////////////////////////////////////////\n        Request(const std::string& uri = \"/\", Method method = Get, const std::string& body = \"\");\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Set the value of a field\n        ///\n        /// The field is created if it doesn't exist. The name of\n        /// the field is case-insensitive.\n        /// By default, a request doesn't contain any field (but the\n        /// mandatory fields are added later by the HTTP client when\n        /// sending the request).\n        ///\n        /// \\param field Name of the field to set\n        /// \\param value Value of the field\n        ///\n        ////////////////////////////////////////////////////////////\n        void setField(const std::string& field, const std::string& value);\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Set the request method\n        ///\n        /// See the Method enumeration for a complete list of all\n        /// the availale methods.\n        /// The method is Http::Request::Get by default.\n        ///\n        /// \\param method Method to use for the request\n        ///\n        ////////////////////////////////////////////////////////////\n        void setMethod(Method method);\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Set the requested URI\n        ///\n        /// The URI is the resource (usually a web page or a file)\n        /// that you want to get or post.\n        /// The URI is \"/\" (the root page) by default.\n        ///\n        /// \\param uri URI to request, relative to the host\n        ///\n        ////////////////////////////////////////////////////////////\n        void setUri(const std::string& uri);\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Set the HTTP version for the request\n        ///\n        /// The HTTP version is 1.0 by default.\n        ///\n        /// \\param major Major HTTP version number\n        /// \\param minor Minor HTTP version number\n        ///\n        ////////////////////////////////////////////////////////////\n        void setHttpVersion(unsigned int major, unsigned int minor);\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Set the body of the request\n        ///\n        /// The body of a request is optional and only makes sense\n        /// for POST requests. It is ignored for all other methods.\n        /// The body is empty by default.\n        ///\n        /// \\param body Content of the body\n        ///\n        ////////////////////////////////////////////////////////////\n        void setBody(const std::string& body);\n\n    private:\n\n        friend class Http;\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Prepare the final request to send to the server\n        ///\n        /// This is used internally by Http before sending the\n        /// request to the web server.\n        ///\n        /// \\return String containing the request, ready to be sent\n        ///\n        ////////////////////////////////////////////////////////////\n        std::string prepare() const;\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Check if the request defines a field\n        ///\n        /// This function uses case-insensitive comparisons.\n        ///\n        /// \\param field Name of the field to test\n        ///\n        /// \\return True if the field exists, false otherwise\n        ///\n        ////////////////////////////////////////////////////////////\n        bool hasField(const std::string& field) const;\n\n        ////////////////////////////////////////////////////////////\n        // Types\n        ////////////////////////////////////////////////////////////\n        typedef std::map<std::string, std::string> FieldTable;\n\n        ////////////////////////////////////////////////////////////\n        // Member data\n        ////////////////////////////////////////////////////////////\n        FieldTable   m_fields;       //!< Fields of the header associated to their value\n        Method       m_method;       //!< Method to use for the request\n        std::string  m_uri;          //!< Target URI of the request\n        unsigned int m_majorVersion; //!< Major HTTP version\n        unsigned int m_minorVersion; //!< Minor HTTP version\n        std::string  m_body;         //!< Body of the request\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Define a HTTP response\n    ///\n    ////////////////////////////////////////////////////////////\n    class SFML_NETWORK_API Response\n    {\n    public:\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Enumerate all the valid status codes for a response\n        ///\n        ////////////////////////////////////////////////////////////\n        enum Status\n        {\n            // 2xx: success\n            Ok             = 200, //!< Most common code returned when operation was successful\n            Created        = 201, //!< The resource has successfully been created\n            Accepted       = 202, //!< The request has been accepted, but will be processed later by the server\n            NoContent      = 204, //!< The server didn't send any data in return\n            ResetContent   = 205, //!< The server informs the client that it should clear the view (form) that caused the request to be sent\n            PartialContent = 206, //!< The server has sent a part of the resource, as a response to a partial GET request\n\n            // 3xx: redirection\n            MultipleChoices  = 300, //!< The requested page can be accessed from several locations\n            MovedPermanently = 301, //!< The requested page has permanently moved to a new location\n            MovedTemporarily = 302, //!< The requested page has temporarily moved to a new location\n            NotModified      = 304, //!< For conditional requests, means the requested page hasn't changed and doesn't need to be refreshed\n\n            // 4xx: client error\n            BadRequest          = 400, //!< The server couldn't understand the request (syntax error)\n            Unauthorized        = 401, //!< The requested page needs an authentication to be accessed\n            Forbidden           = 403, //!< The requested page cannot be accessed at all, even with authentication\n            NotFound            = 404, //!< The requested page doesn't exist\n            RangeNotSatisfiable = 407, //!< The server can't satisfy the partial GET request (with a \"Range\" header field)\n\n            // 5xx: server error\n            InternalServerError = 500, //!< The server encountered an unexpected error\n            NotImplemented      = 501, //!< The server doesn't implement a requested feature\n            BadGateway          = 502, //!< The gateway server has received an error from the source server\n            ServiceNotAvailable = 503, //!< The server is temporarily unavailable (overloaded, in maintenance, ...)\n            GatewayTimeout      = 504, //!< The gateway server couldn't receive a response from the source server\n            VersionNotSupported = 505, //!< The server doesn't support the requested HTTP version\n\n            // 10xx: SFML custom codes\n            InvalidResponse  = 1000, //!< Response is not a valid HTTP one\n            ConnectionFailed = 1001  //!< Connection with server failed\n        };\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Default constructor\n        ///\n        /// Constructs an empty response.\n        ///\n        ////////////////////////////////////////////////////////////\n        Response();\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Get the value of a field\n        ///\n        /// If the field \\a field is not found in the response header,\n        /// the empty string is returned. This function uses\n        /// case-insensitive comparisons.\n        ///\n        /// \\param field Name of the field to get\n        ///\n        /// \\return Value of the field, or empty string if not found\n        ///\n        ////////////////////////////////////////////////////////////\n        const std::string& getField(const std::string& field) const;\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Get the response status code\n        ///\n        /// The status code should be the first thing to be checked\n        /// after receiving a response, it defines whether it is a\n        /// success, a failure or anything else (see the Status\n        /// enumeration).\n        ///\n        /// \\return Status code of the response\n        ///\n        ////////////////////////////////////////////////////////////\n        Status getStatus() const;\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Get the major HTTP version number of the response\n        ///\n        /// \\return Major HTTP version number\n        ///\n        /// \\see getMinorHttpVersion\n        ///\n        ////////////////////////////////////////////////////////////\n        unsigned int getMajorHttpVersion() const;\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Get the minor HTTP version number of the response\n        ///\n        /// \\return Minor HTTP version number\n        ///\n        /// \\see getMajorHttpVersion\n        ///\n        ////////////////////////////////////////////////////////////\n        unsigned int getMinorHttpVersion() const;\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Get the body of the response\n        ///\n        /// The body of a response may contain:\n        /// \\li the requested page (for GET requests)\n        /// \\li a response from the server (for POST requests)\n        /// \\li nothing (for HEAD requests)\n        /// \\li an error message (in case of an error)\n        ///\n        /// \\return The response body\n        ///\n        ////////////////////////////////////////////////////////////\n        const std::string& getBody() const;\n\n    private:\n\n        friend class Http;\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Construct the header from a response string\n        ///\n        /// This function is used by Http to build the response\n        /// of a request.\n        ///\n        /// \\param data Content of the response to parse\n        ///\n        ////////////////////////////////////////////////////////////\n        void parse(const std::string& data);\n\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Read values passed in the answer header\n        ///\n        /// This function is used by Http to extract values passed\n        /// in the response.\n        ///\n        /// \\param in String stream containing the header values\n        ///\n        ////////////////////////////////////////////////////////////\n        void parseFields(std::istream &in);\n\n        ////////////////////////////////////////////////////////////\n        // Types\n        ////////////////////////////////////////////////////////////\n        typedef std::map<std::string, std::string> FieldTable;\n\n        ////////////////////////////////////////////////////////////\n        // Member data\n        ////////////////////////////////////////////////////////////\n        FieldTable   m_fields;       //!< Fields of the header\n        Status       m_status;       //!< Status code\n        unsigned int m_majorVersion; //!< Major HTTP version\n        unsigned int m_minorVersion; //!< Minor HTTP version\n        std::string  m_body;         //!< Body of the response\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    Http();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the HTTP client with the target host\n    ///\n    /// This is equivalent to calling setHost(host, port).\n    /// The port has a default value of 0, which means that the\n    /// HTTP client will use the right port according to the\n    /// protocol used (80 for HTTP). You should leave it like\n    /// this unless you really need a port other than the\n    /// standard one, or use an unknown protocol.\n    ///\n    /// \\param host Web server to connect to\n    /// \\param port Port to use for connection\n    ///\n    ////////////////////////////////////////////////////////////\n    Http(const std::string& host, unsigned short port = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the target host\n    ///\n    /// This function just stores the host address and port, it\n    /// doesn't actually connect to it until you send a request.\n    /// The port has a default value of 0, which means that the\n    /// HTTP client will use the right port according to the\n    /// protocol used (80 for HTTP). You should leave it like\n    /// this unless you really need a port other than the\n    /// standard one, or use an unknown protocol.\n    ///\n    /// \\param host Web server to connect to\n    /// \\param port Port to use for connection\n    ///\n    ////////////////////////////////////////////////////////////\n    void setHost(const std::string& host, unsigned short port = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Send a HTTP request and return the server's response.\n    ///\n    /// You must have a valid host before sending a request (see setHost).\n    /// Any missing mandatory header field in the request will be added\n    /// with an appropriate value.\n    /// Warning: this function waits for the server's response and may\n    /// not return instantly; use a thread if you don't want to block your\n    /// application, or use a timeout to limit the time to wait. A value\n    /// of Time::Zero means that the client will use the system default timeout\n    /// (which is usually pretty long).\n    ///\n    /// \\param request Request to send\n    /// \\param timeout Maximum time to wait\n    ///\n    /// \\return Server's response\n    ///\n    ////////////////////////////////////////////////////////////\n    Response sendRequest(const Request& request, Time timeout = Time::Zero);\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    TcpSocket      m_connection; //!< Connection to the host\n    IpAddress      m_host;       //!< Web host address\n    std::string    m_hostName;   //!< Web host name\n    unsigned short m_port;       //!< Port used for connection with host\n};\n\n} // namespace sf\n\n\n#endif // SFML_HTTP_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Http\n/// \\ingroup network\n///\n/// sf::Http is a very simple HTTP client that allows you\n/// to communicate with a web server. You can retrieve\n/// web pages, send data to an interactive resource,\n/// download a remote file, etc. The HTTPS protocol is\n/// not supported.\n///\n/// The HTTP client is split into 3 classes:\n/// \\li sf::Http::Request\n/// \\li sf::Http::Response\n/// \\li sf::Http\n///\n/// sf::Http::Request builds the request that will be\n/// sent to the server. A request is made of:\n/// \\li a method (what you want to do)\n/// \\li a target URI (usually the name of the web page or file)\n/// \\li one or more header fields (options that you can pass to the server)\n/// \\li an optional body (for POST requests)\n///\n/// sf::Http::Response parse the response from the web server\n/// and provides getters to read them. The response contains:\n/// \\li a status code\n/// \\li header fields (that may be answers to the ones that you requested)\n/// \\li a body, which contains the contents of the requested resource\n///\n/// sf::Http provides a simple function, SendRequest, to send a\n/// sf::Http::Request and return the corresponding sf::Http::Response\n/// from the server.\n///\n/// Usage example:\n/// \\code\n/// // Create a new HTTP client\n/// sf::Http http;\n///\n/// // We'll work on http://www.sfml-dev.org\n/// http.setHost(\"http://www.sfml-dev.org\");\n///\n/// // Prepare a request to get the 'features.php' page\n/// sf::Http::Request request(\"features.php\");\n///\n/// // Send the request\n/// sf::Http::Response response = http.sendRequest(request);\n///\n/// // Check the status code and display the result\n/// sf::Http::Response::Status status = response.getStatus();\n/// if (status == sf::Http::Response::Ok)\n/// {\n///     std::cout << response.getBody() << std::endl;\n/// }\n/// else\n/// {\n///     std::cout << \"Error \" << status << std::endl;\n/// }\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/IpAddress.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_IPADDRESS_HPP\n#define SFML_IPADDRESS_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Network/Export.hpp>\n#include <SFML/System/Time.hpp>\n#include <istream>\n#include <ostream>\n#include <string>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Encapsulate an IPv4 network address\n///\n////////////////////////////////////////////////////////////\nclass SFML_NETWORK_API IpAddress\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor creates an empty (invalid) address\n    ///\n    ////////////////////////////////////////////////////////////\n    IpAddress();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the address from a string\n    ///\n    /// Here \\a address can be either a decimal address\n    /// (ex: \"192.168.1.56\") or a network name (ex: \"localhost\").\n    ///\n    /// \\param address IP address or network name\n    ///\n    ////////////////////////////////////////////////////////////\n    IpAddress(const std::string& address);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the address from a string\n    ///\n    /// Here \\a address can be either a decimal address\n    /// (ex: \"192.168.1.56\") or a network name (ex: \"localhost\").\n    /// This is equivalent to the constructor taking a std::string\n    /// parameter, it is defined for convenience so that the\n    /// implicit conversions from literal strings to IpAddress work.\n    ///\n    /// \\param address IP address or network name\n    ///\n    ////////////////////////////////////////////////////////////\n    IpAddress(const char* address);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the address from 4 bytes\n    ///\n    /// Calling IpAddress(a, b, c, d) is equivalent to calling\n    /// IpAddress(\"a.b.c.d\"), but safer as it doesn't have to\n    /// parse a string to get the address components.\n    ///\n    /// \\param byte0 First byte of the address\n    /// \\param byte1 Second byte of the address\n    /// \\param byte2 Third byte of the address\n    /// \\param byte3 Fourth byte of the address\n    ///\n    ////////////////////////////////////////////////////////////\n    IpAddress(Uint8 byte0, Uint8 byte1, Uint8 byte2, Uint8 byte3);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the address from a 32-bits integer\n    ///\n    /// This constructor uses the internal representation of\n    /// the address directly. It should be used for optimization\n    /// purposes, and only if you got that representation from\n    /// IpAddress::toInteger().\n    ///\n    /// \\param address 4 bytes of the address packed into a 32-bits integer\n    ///\n    /// \\see toInteger\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit IpAddress(Uint32 address);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a string representation of the address\n    ///\n    /// The returned string is the decimal representation of the\n    /// IP address (like \"192.168.1.56\"), even if it was constructed\n    /// from a host name.\n    ///\n    /// \\return String representation of the address\n    ///\n    /// \\see toInteger\n    ///\n    ////////////////////////////////////////////////////////////\n    std::string toString() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get an integer representation of the address\n    ///\n    /// The returned number is the internal representation of the\n    /// address, and should be used for optimization purposes only\n    /// (like sending the address through a socket).\n    /// The integer produced by this function can then be converted\n    /// back to a sf::IpAddress with the proper constructor.\n    ///\n    /// \\return 32-bits unsigned integer representation of the address\n    ///\n    /// \\see toString\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint32 toInteger() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the computer's local address\n    ///\n    /// The local address is the address of the computer from the\n    /// LAN point of view, i.e. something like 192.168.1.56. It is\n    /// meaningful only for communications over the local network.\n    /// Unlike getPublicAddress, this function is fast and may be\n    /// used safely anywhere.\n    ///\n    /// \\return Local IP address of the computer\n    ///\n    /// \\see getPublicAddress\n    ///\n    ////////////////////////////////////////////////////////////\n    static IpAddress getLocalAddress();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the computer's public address\n    ///\n    /// The public address is the address of the computer from the\n    /// internet point of view, i.e. something like 89.54.1.169.\n    /// It is necessary for communications over the world wide web.\n    /// The only way to get a public address is to ask it to a\n    /// distant website; as a consequence, this function depends on\n    /// both your network connection and the server, and may be\n    /// very slow. You should use it as few as possible. Because\n    /// this function depends on the network connection and on a distant\n    /// server, you may use a time limit if you don't want your program\n    /// to be possibly stuck waiting in case there is a problem; this\n    /// limit is deactivated by default.\n    ///\n    /// \\param timeout Maximum time to wait\n    ///\n    /// \\return Public IP address of the computer\n    ///\n    /// \\see getLocalAddress\n    ///\n    ////////////////////////////////////////////////////////////\n    static IpAddress getPublicAddress(Time timeout = Time::Zero);\n\n    ////////////////////////////////////////////////////////////\n    // Static member data\n    ////////////////////////////////////////////////////////////\n    static const IpAddress None;      //!< Value representing an empty/invalid address\n    static const IpAddress Any;       //!< Value representing any address (0.0.0.0)\n    static const IpAddress LocalHost; //!< The \"localhost\" address (for connecting a computer to itself locally)\n    static const IpAddress Broadcast; //!< The \"broadcast\" address (for sending UDP messages to everyone on a local network)\n\nprivate:\n\n    friend SFML_NETWORK_API bool operator <(const IpAddress& left, const IpAddress& right);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Resolve the given address string\n    ///\n    /// \\param address Address string\n    ///\n    ////////////////////////////////////////////////////////////\n    void resolve(const std::string& address);\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Uint32 m_address; //!< Address stored as an unsigned 32 bits integer\n    bool   m_valid;   //!< Is the address valid?\n};\n\n////////////////////////////////////////////////////////////\n/// \\brief Overload of == operator to compare two IP addresses\n///\n/// \\param left  Left operand (a IP address)\n/// \\param right Right operand (a IP address)\n///\n/// \\return True if both addresses are equal\n///\n////////////////////////////////////////////////////////////\nSFML_NETWORK_API bool operator ==(const IpAddress& left, const IpAddress& right);\n\n////////////////////////////////////////////////////////////\n/// \\brief Overload of != operator to compare two IP addresses\n///\n/// \\param left  Left operand (a IP address)\n/// \\param right Right operand (a IP address)\n///\n/// \\return True if both addresses are different\n///\n////////////////////////////////////////////////////////////\nSFML_NETWORK_API bool operator !=(const IpAddress& left, const IpAddress& right);\n\n////////////////////////////////////////////////////////////\n/// \\brief Overload of < operator to compare two IP addresses\n///\n/// \\param left  Left operand (a IP address)\n/// \\param right Right operand (a IP address)\n///\n/// \\return True if \\a left is lesser than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_NETWORK_API bool operator <(const IpAddress& left, const IpAddress& right);\n\n////////////////////////////////////////////////////////////\n/// \\brief Overload of > operator to compare two IP addresses\n///\n/// \\param left  Left operand (a IP address)\n/// \\param right Right operand (a IP address)\n///\n/// \\return True if \\a left is greater than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_NETWORK_API bool operator >(const IpAddress& left, const IpAddress& right);\n\n////////////////////////////////////////////////////////////\n/// \\brief Overload of <= operator to compare two IP addresses\n///\n/// \\param left  Left operand (a IP address)\n/// \\param right Right operand (a IP address)\n///\n/// \\return True if \\a left is lesser or equal than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_NETWORK_API bool operator <=(const IpAddress& left, const IpAddress& right);\n\n////////////////////////////////////////////////////////////\n/// \\brief Overload of >= operator to compare two IP addresses\n///\n/// \\param left  Left operand (a IP address)\n/// \\param right Right operand (a IP address)\n///\n/// \\return True if \\a left is greater or equal than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_NETWORK_API bool operator >=(const IpAddress& left, const IpAddress& right);\n\n////////////////////////////////////////////////////////////\n/// \\brief Overload of >> operator to extract an IP address from an input stream\n///\n/// \\param stream  Input stream\n/// \\param address IP address to extract\n///\n/// \\return Reference to the input stream\n///\n////////////////////////////////////////////////////////////\nSFML_NETWORK_API std::istream& operator >>(std::istream& stream, IpAddress& address);\n\n////////////////////////////////////////////////////////////\n/// \\brief Overload of << operator to print an IP address to an output stream\n///\n/// \\param stream  Output stream\n/// \\param address IP address to print\n///\n/// \\return Reference to the output stream\n///\n////////////////////////////////////////////////////////////\nSFML_NETWORK_API std::ostream& operator <<(std::ostream& stream, const IpAddress& address);\n\n} // namespace sf\n\n\n#endif // SFML_IPADDRESS_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::IpAddress\n/// \\ingroup network\n///\n/// sf::IpAddress is a utility class for manipulating network\n/// addresses. It provides a set a implicit constructors and\n/// conversion functions to easily build or transform an IP\n/// address from/to various representations.\n///\n/// Usage example:\n/// \\code\n/// sf::IpAddress a0;                                     // an invalid address\n/// sf::IpAddress a1 = sf::IpAddress::None;               // an invalid address (same as a0)\n/// sf::IpAddress a2(\"127.0.0.1\");                        // the local host address\n/// sf::IpAddress a3 = sf::IpAddress::Broadcast;          // the broadcast address\n/// sf::IpAddress a4(192, 168, 1, 56);                    // a local address\n/// sf::IpAddress a5(\"my_computer\");                      // a local address created from a network name\n/// sf::IpAddress a6(\"89.54.1.169\");                      // a distant address\n/// sf::IpAddress a7(\"www.google.com\");                   // a distant address created from a network name\n/// sf::IpAddress a8 = sf::IpAddress::getLocalAddress();  // my address on the local network\n/// sf::IpAddress a9 = sf::IpAddress::getPublicAddress(); // my address on the internet\n/// \\endcode\n///\n/// Note that sf::IpAddress currently doesn't support IPv6\n/// nor other types of network addresses.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/Packet.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_PACKET_HPP\n#define SFML_PACKET_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Network/Export.hpp>\n#include <string>\n#include <vector>\n\n\nnamespace sf\n{\nclass String;\nclass TcpSocket;\nclass UdpSocket;\n\n////////////////////////////////////////////////////////////\n/// \\brief Utility class to build blocks of data to transfer\n///        over the network\n///\n////////////////////////////////////////////////////////////\nclass SFML_NETWORK_API Packet\n{\n    // A bool-like type that cannot be converted to integer or pointer types\n    typedef bool (Packet::*BoolType)(std::size_t);\n\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates an empty packet.\n    ///\n    ////////////////////////////////////////////////////////////\n    Packet();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Virtual destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~Packet();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Append data to the end of the packet\n    ///\n    /// \\param data        Pointer to the sequence of bytes to append\n    /// \\param sizeInBytes Number of bytes to append\n    ///\n    /// \\see clear\n    /// \\see getReadPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    void append(const void* data, std::size_t sizeInBytes);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current reading position in the packet\n    ///\n    /// The next read operation will read data from this position\n    ///\n    /// \\return The byte offset of the current read position\n    ///\n    /// \\see append\n    ///\n    ////////////////////////////////////////////////////////////\n    std::size_t getReadPosition() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Clear the packet\n    ///\n    /// After calling Clear, the packet is empty.\n    ///\n    /// \\see append\n    ///\n    ////////////////////////////////////////////////////////////\n    void clear();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a pointer to the data contained in the packet\n    ///\n    /// Warning: the returned pointer may become invalid after\n    /// you append data to the packet, therefore it should never\n    /// be stored.\n    /// The return pointer is NULL if the packet is empty.\n    ///\n    /// \\return Pointer to the data\n    ///\n    /// \\see getDataSize\n    ///\n    ////////////////////////////////////////////////////////////\n    const void* getData() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the size of the data contained in the packet\n    ///\n    /// This function returns the number of bytes pointed to by\n    /// what getData returns.\n    ///\n    /// \\return Data size, in bytes\n    ///\n    /// \\see getData\n    ///\n    ////////////////////////////////////////////////////////////\n    std::size_t getDataSize() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell if the reading position has reached the\n    ///        end of the packet\n    ///\n    /// This function is useful to know if there is some data\n    /// left to be read, without actually reading it.\n    ///\n    /// \\return True if all data was read, false otherwise\n    ///\n    /// \\see operator bool\n    ///\n    ////////////////////////////////////////////////////////////\n    bool endOfPacket() const;\n\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Test the validity of the packet, for reading\n    ///\n    /// This operator allows to test the packet as a boolean\n    /// variable, to check if a reading operation was successful.\n    ///\n    /// A packet will be in an invalid state if it has no more\n    /// data to read.\n    ///\n    /// This behavior is the same as standard C++ streams.\n    ///\n    /// Usage example:\n    /// \\code\n    /// float x;\n    /// packet >> x;\n    /// if (packet)\n    /// {\n    ///    // ok, x was extracted successfully\n    /// }\n    ///\n    /// // -- or --\n    ///\n    /// float x;\n    /// if (packet >> x)\n    /// {\n    ///    // ok, x was extracted successfully\n    /// }\n    /// \\endcode\n    ///\n    /// Don't focus on the return type, it's equivalent to bool but\n    /// it disallows unwanted implicit conversions to integer or\n    /// pointer types.\n    ///\n    /// \\return True if last data extraction from packet was successful\n    ///\n    /// \\see endOfPacket\n    ///\n    ////////////////////////////////////////////////////////////\n    operator BoolType() const;\n\n    ////////////////////////////////////////////////////////////\n    /// Overload of operator >> to read data from the packet\n    ///\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(bool&         data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(Int8&         data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(Uint8&        data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(Int16&        data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(Uint16&       data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(Int32&        data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(Uint32&       data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(Int64&        data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(Uint64&       data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(float&        data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(double&       data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(char*         data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(std::string&  data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(wchar_t*      data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(std::wstring& data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator >>(String&       data);\n\n    ////////////////////////////////////////////////////////////\n    /// Overload of operator << to write data into the packet\n    ///\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(bool                data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(Int8                data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(Uint8               data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(Int16               data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(Uint16              data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(Int32               data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(Uint32              data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(Int64               data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(Uint64              data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(float               data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(double              data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(const char*         data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(const std::string&  data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(const wchar_t*      data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(const std::wstring& data);\n\n    ////////////////////////////////////////////////////////////\n    /// \\overload\n    ////////////////////////////////////////////////////////////\n    Packet& operator <<(const String&       data);\n\nprotected:\n\n    friend class TcpSocket;\n    friend class UdpSocket;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Called before the packet is sent over the network\n    ///\n    /// This function can be defined by derived classes to\n    /// transform the data before it is sent; this can be\n    /// used for compression, encryption, etc.\n    /// The function must return a pointer to the modified data,\n    /// as well as the number of bytes pointed.\n    /// The default implementation provides the packet's data\n    /// without transforming it.\n    ///\n    /// \\param size Variable to fill with the size of data to send\n    ///\n    /// \\return Pointer to the array of bytes to send\n    ///\n    /// \\see onReceive\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual const void* onSend(std::size_t& size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Called after the packet is received over the network\n    ///\n    /// This function can be defined by derived classes to\n    /// transform the data after it is received; this can be\n    /// used for decompression, decryption, etc.\n    /// The function receives a pointer to the received data,\n    /// and must fill the packet with the transformed bytes.\n    /// The default implementation fills the packet directly\n    /// without transforming the data.\n    ///\n    /// \\param data Pointer to the received bytes\n    /// \\param size Number of bytes\n    ///\n    /// \\see onSend\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void onReceive(const void* data, std::size_t size);\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// Disallow comparisons between packets\n    ///\n    ////////////////////////////////////////////////////////////\n    bool operator ==(const Packet& right) const;\n    bool operator !=(const Packet& right) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if the packet can extract a given number of bytes\n    ///\n    /// This function updates accordingly the state of the packet.\n    ///\n    /// \\param size Size to check\n    ///\n    /// \\return True if \\a size bytes can be read from the packet\n    ///\n    ////////////////////////////////////////////////////////////\n    bool checkSize(std::size_t size);\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    std::vector<char> m_data;    //!< Data stored in the packet\n    std::size_t       m_readPos; //!< Current reading position in the packet\n    std::size_t       m_sendPos; //!< Current send position in the packet (for handling partial sends)\n    bool              m_isValid; //!< Reading state of the packet\n};\n\n} // namespace sf\n\n\n#endif // SFML_PACKET_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Packet\n/// \\ingroup network\n///\n/// Packets provide a safe and easy way to serialize data,\n/// in order to send it over the network using sockets\n/// (sf::TcpSocket, sf::UdpSocket).\n///\n/// Packets solve 2 fundamental problems that arise when\n/// transferring data over the network:\n/// \\li data is interpreted correctly according to the endianness\n/// \\li the bounds of the packet are preserved (one send == one receive)\n///\n/// The sf::Packet class provides both input and output modes.\n/// It is designed to follow the behavior of standard C++ streams,\n/// using operators >> and << to extract and insert data.\n///\n/// It is recommended to use only fixed-size types (like sf::Int32, etc.),\n/// to avoid possible differences between the sender and the receiver.\n/// Indeed, the native C++ types may have different sizes on two platforms\n/// and your data may be corrupted if that happens.\n///\n/// Usage example:\n/// \\code\n/// sf::Uint32 x = 24;\n/// std::string s = \"hello\";\n/// double d = 5.89;\n///\n/// // Group the variables to send into a packet\n/// sf::Packet packet;\n/// packet << x << s << d;\n///\n/// // Send it over the network (socket is a valid sf::TcpSocket)\n/// socket.send(packet);\n///\n/// -----------------------------------------------------------------\n///\n/// // Receive the packet at the other end\n/// sf::Packet packet;\n/// socket.receive(packet);\n///\n/// // Extract the variables contained in the packet\n/// sf::Uint32 x;\n/// std::string s;\n/// double d;\n/// if (packet >> x >> s >> d)\n/// {\n///     // Data extracted successfully...\n/// }\n/// \\endcode\n///\n/// Packets have built-in operator >> and << overloads for\n/// standard types:\n/// \\li bool\n/// \\li fixed-size integer types (sf::Int8/16/32, sf::Uint8/16/32)\n/// \\li floating point numbers (float, double)\n/// \\li string types (char*, wchar_t*, std::string, std::wstring, sf::String)\n///\n/// Like standard streams, it is also possible to define your own\n/// overloads of operators >> and << in order to handle your\n/// custom types.\n///\n/// \\code\n/// struct MyStruct\n/// {\n///     float       number;\n///     sf::Int8    integer;\n///     std::string str;\n/// };\n///\n/// sf::Packet& operator <<(sf::Packet& packet, const MyStruct& m)\n/// {\n///     return packet << m.number << m.integer << m.str;\n/// }\n///\n/// sf::Packet& operator >>(sf::Packet& packet, MyStruct& m)\n/// {\n///     return packet >> m.number >> m.integer >> m.str;\n/// }\n/// \\endcode\n///\n/// Packets also provide an extra feature that allows to apply\n/// custom transformations to the data before it is sent,\n/// and after it is received. This is typically used to\n/// handle automatic compression or encryption of the data.\n/// This is achieved by inheriting from sf::Packet, and overriding\n/// the onSend and onReceive functions.\n///\n/// Here is an example:\n/// \\code\n/// class ZipPacket : public sf::Packet\n/// {\n///     virtual const void* onSend(std::size_t& size)\n///     {\n///         const void* srcData = getData();\n///         std::size_t srcSize = getDataSize();\n///\n///         return MySuperZipFunction(srcData, srcSize, &size);\n///     }\n///\n///     virtual void onReceive(const void* data, std::size_t size)\n///     {\n///         std::size_t dstSize;\n///         const void* dstData = MySuperUnzipFunction(data, size, &dstSize);\n///\n///         append(dstData, dstSize);\n///     }\n/// };\n///\n/// // Use like regular packets:\n/// ZipPacket packet;\n/// packet << x << s << d;\n/// ...\n/// \\endcode\n///\n/// \\see sf::TcpSocket, sf::UdpSocket\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/Socket.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOCKET_HPP\n#define SFML_SOCKET_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Network/Export.hpp>\n#include <SFML/Network/SocketHandle.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <vector>\n\n\nnamespace sf\n{\nclass SocketSelector;\n\n////////////////////////////////////////////////////////////\n/// \\brief Base class for all the socket types\n///\n////////////////////////////////////////////////////////////\nclass SFML_NETWORK_API Socket : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Status codes that may be returned by socket functions\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Status\n    {\n        Done,         //!< The socket has sent / received the data\n        NotReady,     //!< The socket is not ready to send / receive data yet\n        Partial,      //!< The socket sent a part of the data\n        Disconnected, //!< The TCP socket has been disconnected\n        Error         //!< An unexpected error happened\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Some special values used by sockets\n    ///\n    ////////////////////////////////////////////////////////////\n    enum\n    {\n        AnyPort = 0 //!< Special value that tells the system to pick any available port\n    };\n\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~Socket();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the blocking state of the socket\n    ///\n    /// In blocking mode, calls will not return until they have\n    /// completed their task. For example, a call to Receive in\n    /// blocking mode won't return until some data was actually\n    /// received.\n    /// In non-blocking mode, calls will always return immediately,\n    /// using the return code to signal whether there was data\n    /// available or not.\n    /// By default, all sockets are blocking.\n    ///\n    /// \\param blocking True to set the socket as blocking, false for non-blocking\n    ///\n    /// \\see isBlocking\n    ///\n    ////////////////////////////////////////////////////////////\n    void setBlocking(bool blocking);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether the socket is in blocking or non-blocking mode\n    ///\n    /// \\return True if the socket is blocking, false otherwise\n    ///\n    /// \\see setBlocking\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isBlocking() const;\n\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Types of protocols that the socket can use\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Type\n    {\n        Tcp, //!< TCP protocol\n        Udp  //!< UDP protocol\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor can only be accessed by derived classes.\n    ///\n    /// \\param type Type of the socket (TCP or UDP)\n    ///\n    ////////////////////////////////////////////////////////////\n    Socket(Type type);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the internal handle of the socket\n    ///\n    /// The returned handle may be invalid if the socket\n    /// was not created yet (or already destroyed).\n    /// This function can only be accessed by derived classes.\n    ///\n    /// \\return The internal (OS-specific) handle of the socket\n    ///\n    ////////////////////////////////////////////////////////////\n    SocketHandle getHandle() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create the internal representation of the socket\n    ///\n    /// This function can only be accessed by derived classes.\n    ///\n    ////////////////////////////////////////////////////////////\n    void create();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create the internal representation of the socket\n    ///        from a socket handle\n    ///\n    /// This function can only be accessed by derived classes.\n    ///\n    /// \\param handle OS-specific handle of the socket to wrap\n    ///\n    ////////////////////////////////////////////////////////////\n    void create(SocketHandle handle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Close the socket gracefully\n    ///\n    /// This function can only be accessed by derived classes.\n    ///\n    ////////////////////////////////////////////////////////////\n    void close();\n\nprivate:\n\n    friend class SocketSelector;\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Type         m_type;       //!< Type of the socket (TCP or UDP)\n    SocketHandle m_socket;     //!< Socket descriptor\n    bool         m_isBlocking; //!< Current blocking mode of the socket\n};\n\n} // namespace sf\n\n\n#endif // SFML_SOCKET_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Socket\n/// \\ingroup network\n///\n/// This class mainly defines internal stuff to be used by\n/// derived classes.\n///\n/// The only public features that it defines, and which\n/// is therefore common to all the socket classes, is the\n/// blocking state. All sockets can be set as blocking or\n/// non-blocking.\n///\n/// In blocking mode, socket functions will hang until\n/// the operation completes, which means that the entire\n/// program (well, in fact the current thread if you use\n/// multiple ones) will be stuck waiting for your socket\n/// operation to complete.\n///\n/// In non-blocking mode, all the socket functions will\n/// return immediately. If the socket is not ready to complete\n/// the requested operation, the function simply returns\n/// the proper status code (Socket::NotReady).\n///\n/// The default mode, which is blocking, is the one that is\n/// generally used, in combination with threads or selectors.\n/// The non-blocking mode is rather used in real-time\n/// applications that run an endless loop that can poll\n/// the socket often enough, and cannot afford blocking\n/// this loop.\n///\n/// \\see sf::TcpListener, sf::TcpSocket, sf::UdpSocket\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/SocketHandle.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOCKETHANDLE_HPP\n#define SFML_SOCKETHANDLE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n#if defined(SFML_SYSTEM_WINDOWS)\n    #include <basetsd.h>\n#endif\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n// Define the low-level socket handle type, specific to\n// each platform\n////////////////////////////////////////////////////////////\n#if defined(SFML_SYSTEM_WINDOWS)\n\n    typedef UINT_PTR SocketHandle;\n\n#else\n\n    typedef int SocketHandle;\n\n#endif\n\n} // namespace sf\n\n\n#endif // SFML_SOCKETHANDLE_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/SocketSelector.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SOCKETSELECTOR_HPP\n#define SFML_SOCKETSELECTOR_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Network/Export.hpp>\n#include <SFML/System/Time.hpp>\n\n\nnamespace sf\n{\nclass Socket;\n\n////////////////////////////////////////////////////////////\n/// \\brief Multiplexer that allows to read from multiple sockets\n///\n////////////////////////////////////////////////////////////\nclass SFML_NETWORK_API SocketSelector\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    SocketSelector();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy constructor\n    ///\n    /// \\param copy Instance to copy\n    ///\n    ////////////////////////////////////////////////////////////\n    SocketSelector(const SocketSelector& copy);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~SocketSelector();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Add a new socket to the selector\n    ///\n    /// This function keeps a weak reference to the socket,\n    /// so you have to make sure that the socket is not destroyed\n    /// while it is stored in the selector.\n    /// This function does nothing if the socket is not valid.\n    ///\n    /// \\param socket Reference to the socket to add\n    ///\n    /// \\see remove, clear\n    ///\n    ////////////////////////////////////////////////////////////\n    void add(Socket& socket);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Remove a socket from the selector\n    ///\n    /// This function doesn't destroy the socket, it simply\n    /// removes the reference that the selector has to it.\n    ///\n    /// \\param socket Reference to the socket to remove\n    ///\n    /// \\see add, clear\n    ///\n    ////////////////////////////////////////////////////////////\n    void remove(Socket& socket);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Remove all the sockets stored in the selector\n    ///\n    /// This function doesn't destroy any instance, it simply\n    /// removes all the references that the selector has to\n    /// external sockets.\n    ///\n    /// \\see add, remove\n    ///\n    ////////////////////////////////////////////////////////////\n    void clear();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Wait until one or more sockets are ready to receive\n    ///\n    /// This function returns as soon as at least one socket has\n    /// some data available to be received. To know which sockets are\n    /// ready, use the isReady function.\n    /// If you use a timeout and no socket is ready before the timeout\n    /// is over, the function returns false.\n    ///\n    /// \\param timeout Maximum time to wait, (use Time::Zero for infinity)\n    ///\n    /// \\return True if there are sockets ready, false otherwise\n    ///\n    /// \\see isReady\n    ///\n    ////////////////////////////////////////////////////////////\n    bool wait(Time timeout = Time::Zero);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Test a socket to know if it is ready to receive data\n    ///\n    /// This function must be used after a call to Wait, to know\n    /// which sockets are ready to receive data. If a socket is\n    /// ready, a call to receive will never block because we know\n    /// that there is data available to read.\n    /// Note that if this function returns true for a TcpListener,\n    /// this means that it is ready to accept a new connection.\n    ///\n    /// \\param socket Socket to test\n    ///\n    /// \\return True if the socket is ready to read, false otherwise\n    ///\n    /// \\see isReady\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isReady(Socket& socket) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of assignment operator\n    ///\n    /// \\param right Instance to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    SocketSelector& operator =(const SocketSelector& right);\n\nprivate:\n\n    struct SocketSelectorImpl;\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    SocketSelectorImpl* m_impl; //!< Opaque pointer to the implementation (which requires OS-specific types)\n};\n\n} // namespace sf\n\n\n#endif // SFML_SOCKETSELECTOR_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::SocketSelector\n/// \\ingroup network\n///\n/// Socket selectors provide a way to wait until some data is\n/// available on a set of sockets, instead of just one. This\n/// is convenient when you have multiple sockets that may\n/// possibly receive data, but you don't know which one will\n/// be ready first. In particular, it avoids to use a thread\n/// for each socket; with selectors, a single thread can handle\n/// all the sockets.\n///\n/// All types of sockets can be used in a selector:\n/// \\li sf::TcpListener\n/// \\li sf::TcpSocket\n/// \\li sf::UdpSocket\n///\n/// A selector doesn't store its own copies of the sockets\n/// (socket classes are not copyable anyway), it simply keeps\n/// a reference to the original sockets that you pass to the\n/// \"add\" function. Therefore, you can't use the selector as a\n/// socket container, you must store them outside and make sure\n/// that they are alive as long as they are used in the selector.\n///\n/// Using a selector is simple:\n/// \\li populate the selector with all the sockets that you want to observe\n/// \\li make it wait until there is data available on any of the sockets\n/// \\li test each socket to find out which ones are ready\n///\n/// Usage example:\n/// \\code\n/// // Create a socket to listen to new connections\n/// sf::TcpListener listener;\n/// listener.listen(55001);\n///\n/// // Create a list to store the future clients\n/// std::list<sf::TcpSocket*> clients;\n///\n/// // Create a selector\n/// sf::SocketSelector selector;\n///\n/// // Add the listener to the selector\n/// selector.add(listener);\n///\n/// // Endless loop that waits for new connections\n/// while (running)\n/// {\n///     // Make the selector wait for data on any socket\n///     if (selector.wait())\n///     {\n///         // Test the listener\n///         if (selector.isReady(listener))\n///         {\n///             // The listener is ready: there is a pending connection\n///             sf::TcpSocket* client = new sf::TcpSocket;\n///             if (listener.accept(*client) == sf::Socket::Done)\n///             {\n///                 // Add the new client to the clients list\n///                 clients.push_back(client);\n///\n///                 // Add the new client to the selector so that we will\n///                 // be notified when he sends something\n///                 selector.add(*client);\n///             }\n///             else\n///             {\n///                 // Error, we won't get a new connection, delete the socket\n///                 delete client;\n///             }\n///         }\n///         else\n///         {\n///             // The listener socket is not ready, test all other sockets (the clients)\n///             for (std::list<sf::TcpSocket*>::iterator it = clients.begin(); it != clients.end(); ++it)\n///             {\n///                 sf::TcpSocket& client = **it;\n///                 if (selector.isReady(client))\n///                 {\n///                     // The client has sent some data, we can receive it\n///                     sf::Packet packet;\n///                     if (client.receive(packet) == sf::Socket::Done)\n///                     {\n///                         ...\n///                     }\n///                 }\n///             }\n///         }\n///     }\n/// }\n/// \\endcode\n///\n/// \\see sf::Socket\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/TcpListener.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_TCPLISTENER_HPP\n#define SFML_TCPLISTENER_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Network/Export.hpp>\n#include <SFML/Network/Socket.hpp>\n#include <SFML/Network/IpAddress.hpp>\n\n\nnamespace sf\n{\nclass TcpSocket;\n\n////////////////////////////////////////////////////////////\n/// \\brief Socket that listens to new TCP connections\n///\n////////////////////////////////////////////////////////////\nclass SFML_NETWORK_API TcpListener : public Socket\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    TcpListener();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the port to which the socket is bound locally\n    ///\n    /// If the socket is not listening to a port, this function\n    /// returns 0.\n    ///\n    /// \\return Port to which the socket is bound\n    ///\n    /// \\see listen\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned short getLocalPort() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Start listening for incoming connection attempts\n    ///\n    /// This function makes the socket start listening on the\n    /// specified port, waiting for incoming connection attempts.\n    ///\n    /// If the socket is already listening on a port when this\n    /// function is called, it will stop listening on the old\n    /// port before starting to listen on the new port.\n    ///\n    /// When providing sf::Socket::AnyPort as port, the listener\n    /// will request an available port from the system.\n    /// The chosen port can be retrieved by calling getLocalPort().\n    ///\n    /// \\param port    Port to listen on for incoming connection attempts\n    /// \\param address Address of the interface to listen on\n    ///\n    /// \\return Status code\n    ///\n    /// \\see accept, close\n    ///\n    ////////////////////////////////////////////////////////////\n    Status listen(unsigned short port, const IpAddress& address = IpAddress::Any);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Stop listening and close the socket\n    ///\n    /// This function gracefully stops the listener. If the\n    /// socket is not listening, this function has no effect.\n    ///\n    /// \\see listen\n    ///\n    ////////////////////////////////////////////////////////////\n    void close();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Accept a new connection\n    ///\n    /// If the socket is in blocking mode, this function will\n    /// not return until a connection is actually received.\n    ///\n    /// \\param socket Socket that will hold the new connection\n    ///\n    /// \\return Status code\n    ///\n    /// \\see listen\n    ///\n    ////////////////////////////////////////////////////////////\n    Status accept(TcpSocket& socket);\n};\n\n\n} // namespace sf\n\n\n#endif // SFML_TCPLISTENER_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::TcpListener\n/// \\ingroup network\n///\n/// A listener socket is a special type of socket that listens to\n/// a given port and waits for connections on that port.\n/// This is all it can do.\n///\n/// When a new connection is received, you must call accept and\n/// the listener returns a new instance of sf::TcpSocket that\n/// is properly initialized and can be used to communicate with\n/// the new client.\n///\n/// Listener sockets are specific to the TCP protocol,\n/// UDP sockets are connectionless and can therefore communicate\n/// directly. As a consequence, a listener socket will always\n/// return the new connections as sf::TcpSocket instances.\n///\n/// A listener is automatically closed on destruction, like all\n/// other types of socket. However if you want to stop listening\n/// before the socket is destroyed, you can call its close()\n/// function.\n///\n/// Usage example:\n/// \\code\n/// // Create a listener socket and make it wait for new\n/// // connections on port 55001\n/// sf::TcpListener listener;\n/// listener.listen(55001);\n///\n/// // Endless loop that waits for new connections\n/// while (running)\n/// {\n///     sf::TcpSocket client;\n///     if (listener.accept(client) == sf::Socket::Done)\n///     {\n///         // A new client just connected!\n///         std::cout << \"New connection received from \" << client.getRemoteAddress() << std::endl;\n///         doSomethingWith(client);\n///     }\n/// }\n/// \\endcode\n///\n/// \\see sf::TcpSocket, sf::Socket\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/TcpSocket.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_TCPSOCKET_HPP\n#define SFML_TCPSOCKET_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Network/Export.hpp>\n#include <SFML/Network/Socket.hpp>\n#include <SFML/System/Time.hpp>\n\n\nnamespace sf\n{\nclass TcpListener;\nclass IpAddress;\nclass Packet;\n\n////////////////////////////////////////////////////////////\n/// \\brief Specialized socket using the TCP protocol\n///\n////////////////////////////////////////////////////////////\nclass SFML_NETWORK_API TcpSocket : public Socket\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    TcpSocket();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the port to which the socket is bound locally\n    ///\n    /// If the socket is not connected, this function returns 0.\n    ///\n    /// \\return Port to which the socket is bound\n    ///\n    /// \\see connect, getRemotePort\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned short getLocalPort() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the address of the connected peer\n    ///\n    /// If the socket is not connected, this function returns\n    /// sf::IpAddress::None.\n    ///\n    /// \\return Address of the remote peer\n    ///\n    /// \\see getRemotePort\n    ///\n    ////////////////////////////////////////////////////////////\n    IpAddress getRemoteAddress() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the port of the connected peer to which\n    ///        the socket is connected\n    ///\n    /// If the socket is not connected, this function returns 0.\n    ///\n    /// \\return Remote port to which the socket is connected\n    ///\n    /// \\see getRemoteAddress\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned short getRemotePort() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Connect the socket to a remote peer\n    ///\n    /// In blocking mode, this function may take a while, especially\n    /// if the remote peer is not reachable. The last parameter allows\n    /// you to stop trying to connect after a given timeout.\n    /// If the socket is already connected, the connection is\n    /// forcibly disconnected before attempting to connect again.\n    ///\n    /// \\param remoteAddress Address of the remote peer\n    /// \\param remotePort    Port of the remote peer\n    /// \\param timeout       Optional maximum time to wait\n    ///\n    /// \\return Status code\n    ///\n    /// \\see disconnect\n    ///\n    ////////////////////////////////////////////////////////////\n    Status connect(const IpAddress& remoteAddress, unsigned short remotePort, Time timeout = Time::Zero);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Disconnect the socket from its remote peer\n    ///\n    /// This function gracefully closes the connection. If the\n    /// socket is not connected, this function has no effect.\n    ///\n    /// \\see connect\n    ///\n    ////////////////////////////////////////////////////////////\n    void disconnect();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Send raw data to the remote peer\n    ///\n    /// To be able to handle partial sends over non-blocking\n    /// sockets, use the send(const void*, std::size_t, std::size_t&)\n    /// overload instead.\n    /// This function will fail if the socket is not connected.\n    ///\n    /// \\param data Pointer to the sequence of bytes to send\n    /// \\param size Number of bytes to send\n    ///\n    /// \\return Status code\n    ///\n    /// \\see receive\n    ///\n    ////////////////////////////////////////////////////////////\n    Status send(const void* data, std::size_t size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Send raw data to the remote peer\n    ///\n    /// This function will fail if the socket is not connected.\n    ///\n    /// \\param data Pointer to the sequence of bytes to send\n    /// \\param size Number of bytes to send\n    /// \\param sent The number of bytes sent will be written here\n    ///\n    /// \\return Status code\n    ///\n    /// \\see receive\n    ///\n    ////////////////////////////////////////////////////////////\n    Status send(const void* data, std::size_t size, std::size_t& sent);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Receive raw data from the remote peer\n    ///\n    /// In blocking mode, this function will wait until some\n    /// bytes are actually received.\n    /// This function will fail if the socket is not connected.\n    ///\n    /// \\param data     Pointer to the array to fill with the received bytes\n    /// \\param size     Maximum number of bytes that can be received\n    /// \\param received This variable is filled with the actual number of bytes received\n    ///\n    /// \\return Status code\n    ///\n    /// \\see send\n    ///\n    ////////////////////////////////////////////////////////////\n    Status receive(void* data, std::size_t size, std::size_t& received);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Send a formatted packet of data to the remote peer\n    ///\n    /// In non-blocking mode, if this function returns sf::Socket::Partial,\n    /// you \\em must retry sending the same unmodified packet before sending\n    /// anything else in order to guarantee the packet arrives at the remote\n    /// peer uncorrupted.\n    /// This function will fail if the socket is not connected.\n    ///\n    /// \\param packet Packet to send\n    ///\n    /// \\return Status code\n    ///\n    /// \\see receive\n    ///\n    ////////////////////////////////////////////////////////////\n    Status send(Packet& packet);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Receive a formatted packet of data from the remote peer\n    ///\n    /// In blocking mode, this function will wait until the whole packet\n    /// has been received.\n    /// This function will fail if the socket is not connected.\n    ///\n    /// \\param packet Packet to fill with the received data\n    ///\n    /// \\return Status code\n    ///\n    /// \\see send\n    ///\n    ////////////////////////////////////////////////////////////\n    Status receive(Packet& packet);\n\nprivate:\n\n    friend class TcpListener;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Structure holding the data of a pending packet\n    ///\n    ////////////////////////////////////////////////////////////\n    struct PendingPacket\n    {\n        PendingPacket();\n\n        Uint32            Size;         //!< Data of packet size\n        std::size_t       SizeReceived; //!< Number of size bytes received so far\n        std::vector<char> Data;         //!< Data of the packet\n    };\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    PendingPacket m_pendingPacket; //!< Temporary data of the packet currently being received\n};\n\n} // namespace sf\n\n\n#endif // SFML_TCPSOCKET_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::TcpSocket\n/// \\ingroup network\n///\n/// TCP is a connected protocol, which means that a TCP\n/// socket can only communicate with the host it is connected\n/// to. It can't send or receive anything if it is not connected.\n///\n/// The TCP protocol is reliable but adds a slight overhead.\n/// It ensures that your data will always be received in order\n/// and without errors (no data corrupted, lost or duplicated).\n///\n/// When a socket is connected to a remote host, you can\n/// retrieve informations about this host with the\n/// getRemoteAddress and getRemotePort functions. You can\n/// also get the local port to which the socket is bound\n/// (which is automatically chosen when the socket is connected),\n/// with the getLocalPort function.\n///\n/// Sending and receiving data can use either the low-level\n/// or the high-level functions. The low-level functions\n/// process a raw sequence of bytes, and cannot ensure that\n/// one call to Send will exactly match one call to Receive\n/// at the other end of the socket.\n///\n/// The high-level interface uses packets (see sf::Packet),\n/// which are easier to use and provide more safety regarding\n/// the data that is exchanged. You can look at the sf::Packet\n/// class to get more details about how they work.\n///\n/// The socket is automatically disconnected when it is destroyed,\n/// but if you want to explicitly close the connection while\n/// the socket instance is still alive, you can call disconnect.\n///\n/// Usage example:\n/// \\code\n/// // ----- The client -----\n///\n/// // Create a socket and connect it to 192.168.1.50 on port 55001\n/// sf::TcpSocket socket;\n/// socket.connect(\"192.168.1.50\", 55001);\n///\n/// // Send a message to the connected host\n/// std::string message = \"Hi, I am a client\";\n/// socket.send(message.c_str(), message.size() + 1);\n///\n/// // Receive an answer from the server\n/// char buffer[1024];\n/// std::size_t received = 0;\n/// socket.receive(buffer, sizeof(buffer), received);\n/// std::cout << \"The server said: \" << buffer << std::endl;\n///\n/// // ----- The server -----\n///\n/// // Create a listener to wait for incoming connections on port 55001\n/// sf::TcpListener listener;\n/// listener.listen(55001);\n///\n/// // Wait for a connection\n/// sf::TcpSocket socket;\n/// listener.accept(socket);\n/// std::cout << \"New client connected: \" << socket.getRemoteAddress() << std::endl;\n///\n/// // Receive a message from the client\n/// char buffer[1024];\n/// std::size_t received = 0;\n/// socket.receive(buffer, sizeof(buffer), received);\n/// std::cout << \"The client said: \" << buffer << std::endl;\n///\n/// // Send an answer\n/// std::string message = \"Welcome, client\";\n/// socket.send(message.c_str(), message.size() + 1);\n/// \\endcode\n///\n/// \\see sf::Socket, sf::UdpSocket, sf::Packet\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network/UdpSocket.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_UDPSOCKET_HPP\n#define SFML_UDPSOCKET_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Network/Export.hpp>\n#include <SFML/Network/Socket.hpp>\n#include <SFML/Network/IpAddress.hpp>\n#include <vector>\n\n\nnamespace sf\n{\nclass Packet;\n\n////////////////////////////////////////////////////////////\n/// \\brief Specialized socket using the UDP protocol\n///\n////////////////////////////////////////////////////////////\nclass SFML_NETWORK_API UdpSocket : public Socket\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    // Constants\n    ////////////////////////////////////////////////////////////\n    enum\n    {\n        MaxDatagramSize = 65507 //!< The maximum number of bytes that can be sent in a single UDP datagram\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    UdpSocket();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the port to which the socket is bound locally\n    ///\n    /// If the socket is not bound to a port, this function\n    /// returns 0.\n    ///\n    /// \\return Port to which the socket is bound\n    ///\n    /// \\see bind\n    ///\n    ////////////////////////////////////////////////////////////\n    unsigned short getLocalPort() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Bind the socket to a specific port\n    ///\n    /// Binding the socket to a port is necessary for being\n    /// able to receive data on that port.\n    ///\n    /// When providing sf::Socket::AnyPort as port, the listener\n    /// will request an available port from the system.\n    /// The chosen port can be retrieved by calling getLocalPort().\n    ///\n    /// Since the socket can only be bound to a single port at\n    /// any given moment, if it is already bound when this\n    /// function is called, it will be unbound from the previous\n    /// port before being bound to the new one.\n    ///\n    /// \\param port    Port to bind the socket to\n    /// \\param address Address of the interface to bind to\n    ///\n    /// \\return Status code\n    ///\n    /// \\see unbind, getLocalPort\n    ///\n    ////////////////////////////////////////////////////////////\n    Status bind(unsigned short port, const IpAddress& address = IpAddress::Any);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Unbind the socket from the local port to which it is bound\n    ///\n    /// The port that the socket was previously bound to is immediately\n    /// made available to the operating system after this function is called.\n    /// This means that a subsequent call to bind() will be able to re-bind\n    /// the port if no other process has done so in the mean time.\n    /// If the socket is not bound to a port, this function has no effect.\n    ///\n    /// \\see bind\n    ///\n    ////////////////////////////////////////////////////////////\n    void unbind();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Send raw data to a remote peer\n    ///\n    /// Make sure that \\a size is not greater than\n    /// UdpSocket::MaxDatagramSize, otherwise this function will\n    /// fail and no data will be sent.\n    ///\n    /// \\param data          Pointer to the sequence of bytes to send\n    /// \\param size          Number of bytes to send\n    /// \\param remoteAddress Address of the receiver\n    /// \\param remotePort    Port of the receiver to send the data to\n    ///\n    /// \\return Status code\n    ///\n    /// \\see receive\n    ///\n    ////////////////////////////////////////////////////////////\n    Status send(const void* data, std::size_t size, const IpAddress& remoteAddress, unsigned short remotePort);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Receive raw data from a remote peer\n    ///\n    /// In blocking mode, this function will wait until some\n    /// bytes are actually received.\n    /// Be careful to use a buffer which is large enough for\n    /// the data that you intend to receive, if it is too small\n    /// then an error will be returned and *all* the data will\n    /// be lost.\n    ///\n    /// \\param data          Pointer to the array to fill with the received bytes\n    /// \\param size          Maximum number of bytes that can be received\n    /// \\param received      This variable is filled with the actual number of bytes received\n    /// \\param remoteAddress Address of the peer that sent the data\n    /// \\param remotePort    Port of the peer that sent the data\n    ///\n    /// \\return Status code\n    ///\n    /// \\see send\n    ///\n    ////////////////////////////////////////////////////////////\n    Status receive(void* data, std::size_t size, std::size_t& received, IpAddress& remoteAddress, unsigned short& remotePort);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Send a formatted packet of data to a remote peer\n    ///\n    /// Make sure that the packet size is not greater than\n    /// UdpSocket::MaxDatagramSize, otherwise this function will\n    /// fail and no data will be sent.\n    ///\n    /// \\param packet        Packet to send\n    /// \\param remoteAddress Address of the receiver\n    /// \\param remotePort    Port of the receiver to send the data to\n    ///\n    /// \\return Status code\n    ///\n    /// \\see receive\n    ///\n    ////////////////////////////////////////////////////////////\n    Status send(Packet& packet, const IpAddress& remoteAddress, unsigned short remotePort);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Receive a formatted packet of data from a remote peer\n    ///\n    /// In blocking mode, this function will wait until the whole packet\n    /// has been received.\n    ///\n    /// \\param packet        Packet to fill with the received data\n    /// \\param remoteAddress Address of the peer that sent the data\n    /// \\param remotePort    Port of the peer that sent the data\n    ///\n    /// \\return Status code\n    ///\n    /// \\see send\n    ///\n    ////////////////////////////////////////////////////////////\n    Status receive(Packet& packet, IpAddress& remoteAddress, unsigned short& remotePort);\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    std::vector<char> m_buffer; //!< Temporary buffer holding the received data in Receive(Packet)\n};\n\n} // namespace sf\n\n\n#endif // SFML_UDPSOCKET_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::UdpSocket\n/// \\ingroup network\n///\n/// A UDP socket is a connectionless socket. Instead of\n/// connecting once to a remote host, like TCP sockets,\n/// it can send to and receive from any host at any time.\n///\n/// It is a datagram protocol: bounded blocks of data (datagrams)\n/// are transfered over the network rather than a continuous\n/// stream of data (TCP). Therefore, one call to send will always\n/// match one call to receive (if the datagram is not lost),\n/// with the same data that was sent.\n///\n/// The UDP protocol is lightweight but unreliable. Unreliable\n/// means that datagrams may be duplicated, be lost or\n/// arrive reordered. However, if a datagram arrives, its\n/// data is guaranteed to be valid.\n///\n/// UDP is generally used for real-time communication\n/// (audio or video streaming, real-time games, etc.) where\n/// speed is crucial and lost data doesn't matter much.\n///\n/// Sending and receiving data can use either the low-level\n/// or the high-level functions. The low-level functions\n/// process a raw sequence of bytes, whereas the high-level\n/// interface uses packets (see sf::Packet), which are easier\n/// to use and provide more safety regarding the data that is\n/// exchanged. You can look at the sf::Packet class to get\n/// more details about how they work.\n///\n/// It is important to note that UdpSocket is unable to send\n/// datagrams bigger than MaxDatagramSize. In this case, it\n/// returns an error and doesn't send anything. This applies\n/// to both raw data and packets. Indeed, even packets are\n/// unable to split and recompose data, due to the unreliability\n/// of the protocol (dropped, mixed or duplicated datagrams may\n/// lead to a big mess when trying to recompose a packet).\n///\n/// If the socket is bound to a port, it is automatically\n/// unbound from it when the socket is destroyed. However,\n/// you can unbind the socket explicitly with the Unbind\n/// function if necessary, to stop receiving messages or\n/// make the port available for other sockets.\n///\n/// Usage example:\n/// \\code\n/// // ----- The client -----\n///\n/// // Create a socket and bind it to the port 55001\n/// sf::UdpSocket socket;\n/// socket.bind(55001);\n///\n/// // Send a message to 192.168.1.50 on port 55002\n/// std::string message = \"Hi, I am \" + sf::IpAddress::getLocalAddress().toString();\n/// socket.send(message.c_str(), message.size() + 1, \"192.168.1.50\", 55002);\n///\n/// // Receive an answer (most likely from 192.168.1.50, but could be anyone else)\n/// char buffer[1024];\n/// std::size_t received = 0;\n/// sf::IpAddress sender;\n/// unsigned short port;\n/// socket.receive(buffer, sizeof(buffer), received, sender, port);\n/// std::cout << sender.ToString() << \" said: \" << buffer << std::endl;\n///\n/// // ----- The server -----\n///\n/// // Create a socket and bind it to the port 55002\n/// sf::UdpSocket socket;\n/// socket.bind(55002);\n///\n/// // Receive a message from anyone\n/// char buffer[1024];\n/// std::size_t received = 0;\n/// sf::IpAddress sender;\n/// unsigned short port;\n/// socket.receive(buffer, sizeof(buffer), received, sender, port);\n/// std::cout << sender.ToString() << \" said: \" << buffer << std::endl;\n///\n/// // Send an answer\n/// std::string message = \"Welcome \" + sender.toString();\n/// socket.send(message.c_str(), message.size() + 1, sender, port);\n/// \\endcode\n///\n/// \\see sf::Socket, sf::TcpSocket, sf::Packet\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Network.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_NETWORK_HPP\n#define SFML_NETWORK_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n\n#include <SFML/System.hpp>\n#include <SFML/Network/Ftp.hpp>\n#include <SFML/Network/Http.hpp>\n#include <SFML/Network/IpAddress.hpp>\n#include <SFML/Network/Packet.hpp>\n#include <SFML/Network/Socket.hpp>\n#include <SFML/Network/SocketHandle.hpp>\n#include <SFML/Network/SocketSelector.hpp>\n#include <SFML/Network/TcpListener.hpp>\n#include <SFML/Network/TcpSocket.hpp>\n#include <SFML/Network/UdpSocket.hpp>\n\n\n#endif // SFML_NETWORK_HPP\n\n////////////////////////////////////////////////////////////\n/// \\defgroup network Network module\n///\n/// Socket-based communication, utilities and higher-level\n/// network protocols (HTTP, FTP).\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/OpenGL.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_OPENGL_HPP\n#define SFML_OPENGL_HPP\n\n\n////////////////////////////////////////////////////////////\n/// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n\n////////////////////////////////////////////////////////////\n/// This file just includes the OpenGL headers,\n/// which have actually different paths on each system\n////////////////////////////////////////////////////////////\n#if defined(SFML_SYSTEM_WINDOWS)\n\n    // The Visual C++ version of gl.h uses WINGDIAPI and APIENTRY but doesn't define them\n    #ifdef _MSC_VER\n        #include <windows.h>\n    #endif\n\n    #include <GL/gl.h>\n\n#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)\n\n    #if defined(SFML_OPENGL_ES)\n        #include <GLES/gl.h>\n        #include <GLES/glext.h>\n    #else\n        #include <GL/gl.h>\n    #endif\n\n#elif defined(SFML_SYSTEM_MACOS)\n\n    #include <OpenGL/gl.h>\n\n#elif defined (SFML_SYSTEM_IOS)\n\n    #include <OpenGLES/ES1/gl.h>\n    #include <OpenGLES/ES1/glext.h>\n\n#elif defined (SFML_SYSTEM_ANDROID)\n\n    #include <GLES/gl.h>\n    #include <GLES/glext.h>\n    \n    // We're not using OpenGL ES 2+ yet, but we can use the sRGB extension\n    #include <GLES2/gl2platform.h>\n    #include <GLES2/gl2ext.h>\n\n#endif\n\n\n#endif // SFML_OPENGL_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Clock.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_CLOCK_HPP\n#define SFML_CLOCK_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n#include <SFML/System/Time.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Utility class that measures the elapsed time\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API Clock\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// The clock starts automatically after being constructed.\n    ///\n    ////////////////////////////////////////////////////////////\n    Clock();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the elapsed time\n    ///\n    /// This function returns the time elapsed since the last call\n    /// to restart() (or the construction of the instance if restart()\n    /// has not been called).\n    ///\n    /// \\return Time elapsed\n    ///\n    ////////////////////////////////////////////////////////////\n    Time getElapsedTime() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Restart the clock\n    ///\n    /// This function puts the time counter back to zero.\n    /// It also returns the time elapsed since the clock was started.\n    ///\n    /// \\return Time elapsed\n    ///\n    ////////////////////////////////////////////////////////////\n    Time restart();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Time m_startTime; //!< Time of last reset, in microseconds\n};\n\n} // namespace sf\n\n\n#endif // SFML_CLOCK_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Clock\n/// \\ingroup system\n///\n/// sf::Clock is a lightweight class for measuring time.\n///\n/// Its provides the most precise time that the underlying\n/// OS can achieve (generally microseconds or nanoseconds).\n/// It also ensures monotonicity, which means that the returned\n/// time can never go backward, even if the system time is\n/// changed.\n///\n/// Usage example:\n/// \\code\n/// sf::Clock clock;\n/// ...\n/// Time time1 = clock.getElapsedTime();\n/// ...\n/// Time time2 = clock.restart();\n/// \\endcode\n///\n/// The sf::Time value returned by the clock can then be\n/// converted to a number of seconds, milliseconds or even\n/// microseconds.\n///\n/// \\see sf::Time\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Err.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_ERR_HPP\n#define SFML_ERR_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n#include <ostream>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Standard stream used by SFML to output warnings and errors\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API std::ostream& err();\n\n} // namespace sf\n\n\n#endif // SFML_ERR_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\fn sf::err\n/// \\ingroup system\n///\n/// By default, sf::err() outputs to the same location as std::cerr,\n/// (-> the stderr descriptor) which is the console if there's\n/// one available.\n///\n/// It is a standard std::ostream instance, so it supports all the\n/// insertion operations defined by the STL\n/// (operator <<, manipulators, etc.).\n///\n/// sf::err() can be redirected to write to another output, independently\n/// of std::cerr, by using the rdbuf() function provided by the\n/// std::ostream class.\n///\n/// Example:\n/// \\code\n/// // Redirect to a file\n/// std::ofstream file(\"sfml-log.txt\");\n/// std::streambuf* previous = sf::err().rdbuf(file.rdbuf());\n///\n/// // Redirect to nothing\n/// sf::err().rdbuf(NULL);\n///\n/// // Restore the original output\n/// sf::err().rdbuf(previous);\n/// \\endcode\n///\n/// \\return Reference to std::ostream representing the SFML error stream\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Export.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SYSTEM_EXPORT_HPP\n#define SFML_SYSTEM_EXPORT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n\n////////////////////////////////////////////////////////////\n// Define portable import / export macros\n////////////////////////////////////////////////////////////\n#if defined(SFML_SYSTEM_EXPORTS)\n\n    #define SFML_SYSTEM_API SFML_API_EXPORT\n\n#else\n\n    #define SFML_SYSTEM_API SFML_API_IMPORT\n\n#endif\n\n\n#endif // SFML_SYSTEM_EXPORT_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/FileInputStream.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_FILEINPUTSTREAM_HPP\n#define SFML_FILEINPUTSTREAM_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n#include <SFML/System/Export.hpp>\n#include <SFML/System/InputStream.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <cstdio>\n#include <string>\n\n#ifdef SFML_SYSTEM_ANDROID\nnamespace sf\n{\nnamespace priv\n{\nclass SFML_SYSTEM_API ResourceStream;\n}\n}\n#endif\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Implementation of input stream based on a file\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API FileInputStream : public InputStream, NonCopyable\n{\npublic:\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    FileInputStream();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~FileInputStream();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open the stream from a file path\n    ///\n    /// \\param filename Name of the file to open\n    ///\n    /// \\return True on success, false on error\n    ///\n    ////////////////////////////////////////////////////////////\n    bool open(const std::string& filename);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Read data from the stream\n    ///\n    /// After reading, the stream's reading position must be\n    /// advanced by the amount of bytes read.\n    ///\n    /// \\param data Buffer where to copy the read data\n    /// \\param size Desired number of bytes to read\n    ///\n    /// \\return The number of bytes actually read, or -1 on error\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 read(void* data, Int64 size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current reading position\n    ///\n    /// \\param position The position to seek to, from the beginning\n    ///\n    /// \\return The position actually sought to, or -1 on error\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 seek(Int64 position);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current reading position in the stream\n    ///\n    /// \\return The current position, or -1 on error.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 tell();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the size of the stream\n    ///\n    /// \\return The total number of bytes available in the stream, or -1 on error\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 getSize();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n#ifdef SFML_SYSTEM_ANDROID\n    priv::ResourceStream* m_file;\n#else\n    std::FILE* m_file; //!< stdio file stream\n#endif\n};\n\n} // namespace sf\n\n\n#endif // SFML_FILEINPUTSTREAM_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::FileInputStream\n/// \\ingroup system\n///\n/// This class is a specialization of InputStream that\n/// reads from a file on disk.\n///\n/// It wraps a file in the common InputStream interface\n/// and therefore allows to use generic classes or functions\n/// that accept such a stream, with a file on disk as the data\n/// source.\n///\n/// In addition to the virtual functions inherited from\n/// InputStream, FileInputStream adds a function to\n/// specify the file to open.\n///\n/// SFML resource classes can usually be loaded directly from\n/// a filename, so this class shouldn't be useful to you unless\n/// you create your own algorithms that operate on an InputStream.\n///\n/// Usage example:\n/// \\code\n/// void process(InputStream& stream);\n///\n/// FileInputStream stream;\n/// if (stream.open(\"some_file.dat\"))\n///    process(stream);\n/// \\endcode\n///\n/// InputStream, MemoryInputStream\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/InputStream.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_INPUTSTREAM_HPP\n#define SFML_INPUTSTREAM_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n#include <SFML/System/Export.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Abstract class for custom file input streams\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API InputStream\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Virtual destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~InputStream() {}\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Read data from the stream\n    ///\n    /// After reading, the stream's reading position must be\n    /// advanced by the amount of bytes read.\n    ///\n    /// \\param data Buffer where to copy the read data\n    /// \\param size Desired number of bytes to read\n    ///\n    /// \\return The number of bytes actually read, or -1 on error\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 read(void* data, Int64 size) = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current reading position\n    ///\n    /// \\param position The position to seek to, from the beginning\n    ///\n    /// \\return The position actually sought to, or -1 on error\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 seek(Int64 position) = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current reading position in the stream\n    ///\n    /// \\return The current position, or -1 on error.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 tell() = 0;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the size of the stream\n    ///\n    /// \\return The total number of bytes available in the stream, or -1 on error\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 getSize() = 0;\n};\n\n} // namespace sf\n\n\n#endif // SFML_INPUTSTREAM_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::InputStream\n/// \\ingroup system\n///\n/// This class allows users to define their own file input sources\n/// from which SFML can load resources.\n///\n/// SFML resource classes like sf::Texture and\n/// sf::SoundBuffer provide loadFromFile and loadFromMemory functions,\n/// which read data from conventional sources. However, if you\n/// have data coming from a different source (over a network,\n/// embedded, encrypted, compressed, etc) you can derive your\n/// own class from sf::InputStream and load SFML resources with\n/// their loadFromStream function.\n///\n/// Usage example:\n/// \\code\n/// // custom stream class that reads from inside a zip file\n/// class ZipStream : public sf::InputStream\n/// {\n/// public:\n///\n///     ZipStream(std::string archive);\n///\n///     bool open(std::string filename);\n///\n///     Int64 read(void* data, Int64 size);\n///\n///     Int64 seek(Int64 position);\n///\n///     Int64 tell();\n///\n///     Int64 getSize();\n///\n/// private:\n///\n///     ...\n/// };\n///\n/// // now you can load textures...\n/// sf::Texture texture;\n/// ZipStream stream(\"resources.zip\");\n/// stream.open(\"images/img.png\");\n/// texture.loadFromStream(stream);\n///\n/// // musics...\n/// sf::Music music;\n/// ZipStream stream(\"resources.zip\");\n/// stream.open(\"musics/msc.ogg\");\n/// music.openFromStream(stream);\n///\n/// // etc.\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Lock.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_LOCK_HPP\n#define SFML_LOCK_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n#include <SFML/System/NonCopyable.hpp>\n\n\nnamespace sf\n{\nclass Mutex;\n\n////////////////////////////////////////////////////////////\n/// \\brief Automatic wrapper for locking and unlocking mutexes\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API Lock : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the lock with a target mutex\n    ///\n    /// The mutex passed to sf::Lock is automatically locked.\n    ///\n    /// \\param mutex Mutex to lock\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit Lock(Mutex& mutex);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// The destructor of sf::Lock automatically unlocks its mutex.\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Lock();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Mutex& m_mutex; //!< Mutex to lock / unlock\n};\n\n} // namespace sf\n\n\n#endif // SFML_LOCK_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Lock\n/// \\ingroup system\n///\n/// sf::Lock is a RAII wrapper for sf::Mutex. By unlocking\n/// it in its destructor, it ensures that the mutex will\n/// always be released when the current scope (most likely\n/// a function) ends.\n/// This is even more important when an exception or an early\n/// return statement can interrupt the execution flow of the\n/// function.\n///\n/// For maximum robustness, sf::Lock should always be used\n/// to lock/unlock a mutex.\n///\n/// Usage example:\n/// \\code\n/// sf::Mutex mutex;\n///\n/// void function()\n/// {\n///     sf::Lock lock(mutex); // mutex is now locked\n///\n///     functionThatMayThrowAnException(); // mutex is unlocked if this function throws\n///\n///     if (someCondition)\n///         return; // mutex is unlocked\n///\n/// } // mutex is unlocked\n/// \\endcode\n///\n/// Because the mutex is not explicitly unlocked in the code,\n/// it may remain locked longer than needed. If the region\n/// of the code that needs to be protected by the mutex is\n/// not the entire function, a good practice is to create a\n/// smaller, inner scope so that the lock is limited to this\n/// part of the code.\n///\n/// \\code\n/// sf::Mutex mutex;\n///\n/// void function()\n/// {\n///     {\n///       sf::Lock lock(mutex);\n///       codeThatRequiresProtection();\n///\n///     } // mutex is unlocked here\n///\n///     codeThatDoesntCareAboutTheMutex();\n/// }\n/// \\endcode\n///\n/// Having a mutex locked longer than required is a bad practice\n/// which can lead to bad performances. Don't forget that when\n/// a mutex is locked, other threads may be waiting doing nothing\n/// until it is released.\n///\n/// \\see sf::Mutex\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/MemoryInputStream.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_MEMORYINPUTSTREAM_HPP\n#define SFML_MEMORYINPUTSTREAM_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n#include <SFML/System/InputStream.hpp>\n#include <SFML/System/Export.hpp>\n#include <cstdlib>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Implementation of input stream based on a memory chunk\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API MemoryInputStream : public InputStream\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    MemoryInputStream();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Open the stream from its data\n    ///\n    /// \\param data        Pointer to the data in memory\n    /// \\param sizeInBytes Size of the data, in bytes\n    ///\n    ////////////////////////////////////////////////////////////\n    void open(const void* data, std::size_t sizeInBytes);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Read data from the stream\n    ///\n    /// After reading, the stream's reading position must be\n    /// advanced by the amount of bytes read.\n    ///\n    /// \\param data Buffer where to copy the read data\n    /// \\param size Desired number of bytes to read\n    ///\n    /// \\return The number of bytes actually read, or -1 on error\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 read(void* data, Int64 size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the current reading position\n    ///\n    /// \\param position The position to seek to, from the beginning\n    ///\n    /// \\return The position actually sought to, or -1 on error\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 seek(Int64 position);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current reading position in the stream\n    ///\n    /// \\return The current position, or -1 on error.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 tell();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the size of the stream\n    ///\n    /// \\return The total number of bytes available in the stream, or -1 on error\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual Int64 getSize();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    const char* m_data;   //!< Pointer to the data in memory\n    Int64       m_size;   //!< Total size of the data\n    Int64       m_offset; //!< Current reading position\n};\n\n} // namespace sf\n\n\n#endif // SFML_MEMORYINPUTSTREAM_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::MemoryInputStream\n/// \\ingroup system\n///\n/// This class is a specialization of InputStream that\n/// reads from data in memory.\n///\n/// It wraps a memory chunk in the common InputStream interface\n/// and therefore allows to use generic classes or functions\n/// that accept such a stream, with content already loaded in memory.\n///\n/// In addition to the virtual functions inherited from\n/// InputStream, MemoryInputStream adds a function to\n/// specify the pointer and size of the data in memory.\n///\n/// SFML resource classes can usually be loaded directly from\n/// memory, so this class shouldn't be useful to you unless\n/// you create your own algorithms that operate on an InputStream.\n///\n/// Usage example:\n/// \\code\n/// void process(InputStream& stream);\n///\n/// MemoryInputStream stream;\n/// stream.open(thePtr, theSize);\n/// process(stream);\n/// \\endcode\n///\n/// InputStream, FileInputStream\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Mutex.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_MUTEX_HPP\n#define SFML_MUTEX_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n#include <SFML/System/NonCopyable.hpp>\n\n\nnamespace sf\n{\nnamespace priv\n{\n    class MutexImpl;\n}\n\n////////////////////////////////////////////////////////////\n/// \\brief Blocks concurrent access to shared resources\n///        from multiple threads\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API Mutex : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    Mutex();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Mutex();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Lock the mutex\n    ///\n    /// If the mutex is already locked in another thread,\n    /// this call will block the execution until the mutex\n    /// is released.\n    ///\n    /// \\see unlock\n    ///\n    ////////////////////////////////////////////////////////////\n    void lock();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Unlock the mutex\n    ///\n    /// \\see lock\n    ///\n    ////////////////////////////////////////////////////////////\n    void unlock();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    priv::MutexImpl* m_mutexImpl; //!< OS-specific implementation\n};\n\n} // namespace sf\n\n\n#endif // SFML_MUTEX_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Mutex\n/// \\ingroup system\n///\n/// Mutex stands for \"MUTual EXclusion\". A mutex is a\n/// synchronization object, used when multiple threads are involved.\n///\n/// When you want to protect a part of the code from being accessed\n/// simultaneously by multiple threads, you typically use a\n/// mutex. When a thread is locked by a mutex, any other thread\n/// trying to lock it will be blocked until the mutex is released\n/// by the thread that locked it. This way, you can allow only\n/// one thread at a time to access a critical region of your code.\n///\n/// Usage example:\n/// \\code\n/// Database database; // this is a critical resource that needs some protection\n/// sf::Mutex mutex;\n///\n/// void thread1()\n/// {\n///     mutex.lock(); // this call will block the thread if the mutex is already locked by thread2\n///     database.write(...);\n///     mutex.unlock(); // if thread2 was waiting, it will now be unblocked\n/// }\n///\n/// void thread2()\n/// {\n///     mutex.lock(); // this call will block the thread if the mutex is already locked by thread1\n///     database.write(...);\n///     mutex.unlock(); // if thread1 was waiting, it will now be unblocked\n/// }\n/// \\endcode\n///\n/// Be very careful with mutexes. A bad usage can lead to bad problems,\n/// like deadlocks (two threads are waiting for each other and the\n/// application is globally stuck).\n///\n/// To make the usage of mutexes more robust, particularly in\n/// environments where exceptions can be thrown, you should\n/// use the helper class sf::Lock to lock/unlock mutexes.\n///\n/// SFML mutexes are recursive, which means that you can lock\n/// a mutex multiple times in the same thread without creating\n/// a deadlock. In this case, the first call to lock() behaves\n/// as usual, and the following ones have no effect.\n/// However, you must call unlock() exactly as many times as you\n/// called lock(). If you don't, the mutex won't be released.\n///\n/// \\see sf::Lock\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/NativeActivity.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_NATIVEACTIVITY_HPP\n#define SFML_NATIVEACTIVITY_HPP\n\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n\n\n#if !defined(SFML_SYSTEM_ANDROID)\n#error NativeActivity.hpp: This header is Android only.\n#endif\n\n\nstruct ANativeActivity;\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\ingroup system\n/// \\brief Return a pointer to the Android native activity\n///\n/// You shouldn't have to use this function, unless you want\n/// to implement very specific details, that SFML doesn't\n/// support, or to use a workaround for a known issue.\n///\n/// \\return Pointer to Android native activity structure\n///\n/// \\sfplatform{Android,SFML/System/NativeActivity.hpp}\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API ANativeActivity* getNativeActivity();\n\n} // namespace sf\n\n\n#endif // SFML_NATIVEACTIVITY_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/NonCopyable.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_NONCOPYABLE_HPP\n#define SFML_NONCOPYABLE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Utility class that makes any derived\n///        class non-copyable\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API NonCopyable\n{\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Because this class has a copy constructor, the compiler\n    /// will not automatically generate the default constructor.\n    /// That's why we must define it explicitly.\n    ///\n    ////////////////////////////////////////////////////////////\n    NonCopyable() {}\n    \n    ////////////////////////////////////////////////////////////\n    /// \\brief Default destructor\n    ///\n    /// By declaring a protected destructor it's impossible to\n    /// call delete on a pointer of sf::NonCopyable, thus\n    /// preventing possible resource leaks.\n    ///\n    ////////////////////////////////////////////////////////////\n    ~NonCopyable() {}\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Disabled copy constructor\n    ///\n    /// By making the copy constructor private, the compiler will\n    /// trigger an error if anyone outside tries to use it.\n    /// To prevent NonCopyable or friend classes from using it,\n    /// we also give no definition, so that the linker will\n    /// produce an error if the first protection was inefficient.\n    ///\n    ////////////////////////////////////////////////////////////\n    NonCopyable(const NonCopyable&);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Disabled assignment operator\n    ///\n    /// By making the assignment operator private, the compiler will\n    /// trigger an error if anyone outside tries to use it.\n    /// To prevent NonCopyable or friend classes from using it,\n    /// we also give no definition, so that the linker will\n    /// produce an error if the first protection was inefficient.\n    ///\n    ////////////////////////////////////////////////////////////\n    NonCopyable& operator =(const NonCopyable&);\n};\n\n} // namespace sf\n\n\n#endif // SFML_NONCOPYABLE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::NonCopyable\n/// \\ingroup system\n///\n/// This class makes its instances non-copyable, by explicitly\n/// disabling its copy constructor and its assignment operator.\n///\n/// To create a non-copyable class, simply inherit from\n/// sf::NonCopyable.\n///\n/// The type of inheritance (public or private) doesn't matter,\n/// the copy constructor and assignment operator are declared private\n/// in sf::NonCopyable so they will end up being inaccessible in both\n/// cases. Thus you can use a shorter syntax for inheriting from it\n/// (see below).\n///\n/// Usage example:\n/// \\code\n/// class MyNonCopyableClass : sf::NonCopyable\n/// {\n///     ...\n/// };\n/// \\endcode\n///\n/// Deciding whether the instances of a class can be copied\n/// or not is a very important design choice. You are strongly\n/// encouraged to think about it before writing a class,\n/// and to use sf::NonCopyable when necessary to prevent\n/// many potential future errors when using it. This is also\n/// a very important indication to users of your class.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Sleep.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SLEEP_HPP\n#define SFML_SLEEP_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n#include <SFML/System/Time.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\ingroup system\n/// \\brief Make the current thread sleep for a given duration\n///\n/// sf::sleep is the best way to block a program or one of its\n/// threads, as it doesn't consume any CPU power.\n///\n/// \\param duration Time to sleep\n///\n////////////////////////////////////////////////////////////\nvoid SFML_SYSTEM_API sleep(Time duration);\n\n} // namespace sf\n\n\n#endif // SFML_SLEEP_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/String.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_STRING_HPP\n#define SFML_STRING_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n#include <SFML/System/Utf.hpp>\n#include <iterator>\n#include <locale>\n#include <string>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Utility string class that automatically handles\n///        conversions between types and encodings\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API String\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    // Types\n    ////////////////////////////////////////////////////////////\n    typedef std::basic_string<Uint32>::iterator       Iterator;      //!< Iterator type\n    typedef std::basic_string<Uint32>::const_iterator ConstIterator; //!< Read-only iterator type\n\n    ////////////////////////////////////////////////////////////\n    // Static member data\n    ////////////////////////////////////////////////////////////\n    static const std::size_t InvalidPos; //!< Represents an invalid position in the string\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor creates an empty string.\n    ///\n    ////////////////////////////////////////////////////////////\n    String();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from a single ANSI character and a locale\n    ///\n    /// The source character is converted to UTF-32 according\n    /// to the given locale.\n    ///\n    /// \\param ansiChar ANSI character to convert\n    /// \\param locale   Locale to use for conversion\n    ///\n    ////////////////////////////////////////////////////////////\n    String(char ansiChar, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from single wide character\n    ///\n    /// \\param wideChar Wide character to convert\n    ///\n    ////////////////////////////////////////////////////////////\n    String(wchar_t wideChar);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from single UTF-32 character\n    ///\n    /// \\param utf32Char UTF-32 character to convert\n    ///\n    ////////////////////////////////////////////////////////////\n    String(Uint32 utf32Char);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from a null-terminated C-style ANSI string and a locale\n    ///\n    /// The source string is converted to UTF-32 according\n    /// to the given locale.\n    ///\n    /// \\param ansiString ANSI string to convert\n    /// \\param locale     Locale to use for conversion\n    ///\n    ////////////////////////////////////////////////////////////\n    String(const char* ansiString, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from an ANSI string and a locale\n    ///\n    /// The source string is converted to UTF-32 according\n    /// to the given locale.\n    ///\n    /// \\param ansiString ANSI string to convert\n    /// \\param locale     Locale to use for conversion\n    ///\n    ////////////////////////////////////////////////////////////\n    String(const std::string& ansiString, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from null-terminated C-style wide string\n    ///\n    /// \\param wideString Wide string to convert\n    ///\n    ////////////////////////////////////////////////////////////\n    String(const wchar_t* wideString);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from a wide string\n    ///\n    /// \\param wideString Wide string to convert\n    ///\n    ////////////////////////////////////////////////////////////\n    String(const std::wstring& wideString);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from a null-terminated C-style UTF-32 string\n    ///\n    /// \\param utf32String UTF-32 string to assign\n    ///\n    ////////////////////////////////////////////////////////////\n    String(const Uint32* utf32String);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from an UTF-32 string\n    ///\n    /// \\param utf32String UTF-32 string to assign\n    ///\n    ////////////////////////////////////////////////////////////\n    String(const std::basic_string<Uint32>& utf32String);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Copy constructor\n    ///\n    /// \\param copy Instance to copy\n    ///\n    ////////////////////////////////////////////////////////////\n    String(const String& copy);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create a new sf::String from a UTF-8 encoded string\n    ///\n    /// \\param begin Forward iterator to the beginning of the UTF-8 sequence\n    /// \\param end   Forward iterator to the end of the UTF-8 sequence\n    ///\n    /// \\return A sf::String containing the source string\n    ///\n    /// \\see fromUtf16, fromUtf32\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename T>\n    static String fromUtf8(T begin, T end);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create a new sf::String from a UTF-16 encoded string\n    ///\n    /// \\param begin Forward iterator to the beginning of the UTF-16 sequence\n    /// \\param end   Forward iterator to the end of the UTF-16 sequence\n    ///\n    /// \\return A sf::String containing the source string\n    ///\n    /// \\see fromUtf8, fromUtf32\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename T>\n    static String fromUtf16(T begin, T end);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create a new sf::String from a UTF-32 encoded string\n    ///\n    /// This function is provided for consistency, it is equivalent to\n    /// using the constructors that takes a const sf::Uint32* or\n    /// a std::basic_string<sf::Uint32>.\n    ///\n    /// \\param begin Forward iterator to the beginning of the UTF-32 sequence\n    /// \\param end   Forward iterator to the end of the UTF-32 sequence\n    ///\n    /// \\return A sf::String containing the source string\n    ///\n    /// \\see fromUtf8, fromUtf16\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename T>\n    static String fromUtf32(T begin, T end);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Implicit conversion operator to std::string (ANSI string)\n    ///\n    /// The current global locale is used for conversion. If you\n    /// want to explicitly specify a locale, see toAnsiString.\n    /// Characters that do not fit in the target encoding are\n    /// discarded from the returned string.\n    /// This operator is defined for convenience, and is equivalent\n    /// to calling toAnsiString().\n    ///\n    /// \\return Converted ANSI string\n    ///\n    /// \\see toAnsiString, operator std::wstring\n    ///\n    ////////////////////////////////////////////////////////////\n    operator std::string() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Implicit conversion operator to std::wstring (wide string)\n    ///\n    /// Characters that do not fit in the target encoding are\n    /// discarded from the returned string.\n    /// This operator is defined for convenience, and is equivalent\n    /// to calling toWideString().\n    ///\n    /// \\return Converted wide string\n    ///\n    /// \\see toWideString, operator std::string\n    ///\n    ////////////////////////////////////////////////////////////\n    operator std::wstring() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert the Unicode string to an ANSI string\n    ///\n    /// The UTF-32 string is converted to an ANSI string in\n    /// the encoding defined by \\a locale.\n    /// Characters that do not fit in the target encoding are\n    /// discarded from the returned string.\n    ///\n    /// \\param locale Locale to use for conversion\n    ///\n    /// \\return Converted ANSI string\n    ///\n    /// \\see toWideString, operator std::string\n    ///\n    ////////////////////////////////////////////////////////////\n    std::string toAnsiString(const std::locale& locale = std::locale()) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert the Unicode string to a wide string\n    ///\n    /// Characters that do not fit in the target encoding are\n    /// discarded from the returned string.\n    ///\n    /// \\return Converted wide string\n    ///\n    /// \\see toAnsiString, operator std::wstring\n    ///\n    ////////////////////////////////////////////////////////////\n    std::wstring toWideString() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert the Unicode string to a UTF-8 string\n    ///\n    /// \\return Converted UTF-8 string\n    ///\n    /// \\see toUtf16, toUtf32\n    ///\n    ////////////////////////////////////////////////////////////\n    std::basic_string<Uint8> toUtf8() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert the Unicode string to a UTF-16 string\n    ///\n    /// \\return Converted UTF-16 string\n    ///\n    /// \\see toUtf8, toUtf32\n    ///\n    ////////////////////////////////////////////////////////////\n    std::basic_string<Uint16> toUtf16() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert the Unicode string to a UTF-32 string\n    ///\n    /// This function doesn't perform any conversion, since the\n    /// string is already stored as UTF-32 internally.\n    ///\n    /// \\return Converted UTF-32 string\n    ///\n    /// \\see toUtf8, toUtf16\n    ///\n    ////////////////////////////////////////////////////////////\n    std::basic_string<Uint32> toUtf32() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of assignment operator\n    ///\n    /// \\param right Instance to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    String& operator =(const String& right);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of += operator to append an UTF-32 string\n    ///\n    /// \\param right String to append\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    String& operator +=(const String& right);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of [] operator to access a character by its position\n    ///\n    /// This function provides read-only access to characters.\n    /// Note: the behavior is undefined if \\a index is out of range.\n    ///\n    /// \\param index Index of the character to get\n    ///\n    /// \\return Character at position \\a index\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint32 operator [](std::size_t index) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of [] operator to access a character by its position\n    ///\n    /// This function provides read and write access to characters.\n    /// Note: the behavior is undefined if \\a index is out of range.\n    ///\n    /// \\param index Index of the character to get\n    ///\n    /// \\return Reference to the character at position \\a index\n    ///\n    ////////////////////////////////////////////////////////////\n    Uint32& operator [](std::size_t index);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Clear the string\n    ///\n    /// This function removes all the characters from the string.\n    ///\n    /// \\see isEmpty, erase\n    ///\n    ////////////////////////////////////////////////////////////\n    void clear();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the size of the string\n    ///\n    /// \\return Number of characters in the string\n    ///\n    /// \\see isEmpty\n    ///\n    ////////////////////////////////////////////////////////////\n    std::size_t getSize() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check whether the string is empty or not\n    ///\n    /// \\return True if the string is empty (i.e. contains no character)\n    ///\n    /// \\see clear, getSize\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isEmpty() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Erase one or more characters from the string\n    ///\n    /// This function removes a sequence of \\a count characters\n    /// starting from \\a position.\n    ///\n    /// \\param position Position of the first character to erase\n    /// \\param count    Number of characters to erase\n    ///\n    ////////////////////////////////////////////////////////////\n    void erase(std::size_t position, std::size_t count = 1);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Insert one or more characters into the string\n    ///\n    /// This function inserts the characters of \\a str\n    /// into the string, starting from \\a position.\n    ///\n    /// \\param position Position of insertion\n    /// \\param str      Characters to insert\n    ///\n    ////////////////////////////////////////////////////////////\n    void insert(std::size_t position, const String& str);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Find a sequence of one or more characters in the string\n    ///\n    /// This function searches for the characters of \\a str\n    /// in the string, starting from \\a start.\n    ///\n    /// \\param str   Characters to find\n    /// \\param start Where to begin searching\n    ///\n    /// \\return Position of \\a str in the string, or String::InvalidPos if not found\n    ///\n    ////////////////////////////////////////////////////////////\n    std::size_t find(const String& str, std::size_t start = 0) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Replace a substring with another string\n    ///\n    /// This function replaces the substring that starts at index \\a position\n    /// and spans \\a length characters with the string \\a replaceWith.\n    ///\n    /// \\param position    Index of the first character to be replaced\n    /// \\param length      Number of characters to replace. You can pass InvalidPos to\n    ///                    replace all characters until the end of the string.\n    /// \\param replaceWith String that replaces the given substring.\n    ///\n    ////////////////////////////////////////////////////////////\n    void replace(std::size_t position, std::size_t length, const String& replaceWith);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Replace all occurrences of a substring with a replacement string\n    ///\n    /// This function replaces all occurrences of \\a searchFor in this string\n    /// with the string \\a replaceWith.\n    ///\n    /// \\param searchFor   The value being searched for\n    /// \\param replaceWith The value that replaces found \\a searchFor values\n    ///\n    ////////////////////////////////////////////////////////////\n    void replace(const String& searchFor, const String& replaceWith);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return a part of the string\n    ///\n    /// This function returns the substring that starts at index \\a position\n    /// and spans \\a length characters.\n    ///\n    /// \\param position Index of the first character\n    /// \\param length   Number of characters to include in the substring (if\n    ///                 the string is shorter, as many characters as possible\n    ///                 are included). \\ref InvalidPos can be used to include all\n    ///                 characters until the end of the string.\n    ///\n    /// \\return String object containing a substring of this object\n    ///\n    ////////////////////////////////////////////////////////////\n    String substring(std::size_t position, std::size_t length = InvalidPos) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get a pointer to the C-style array of characters\n    ///\n    /// This functions provides a read-only access to a\n    /// null-terminated C-style representation of the string.\n    /// The returned pointer is temporary and is meant only for\n    /// immediate use, thus it is not recommended to store it.\n    ///\n    /// \\return Read-only pointer to the array of characters\n    ///\n    ////////////////////////////////////////////////////////////\n    const Uint32* getData() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return an iterator to the beginning of the string\n    ///\n    /// \\return Read-write iterator to the beginning of the string characters\n    ///\n    /// \\see end\n    ///\n    ////////////////////////////////////////////////////////////\n    Iterator begin();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return an iterator to the beginning of the string\n    ///\n    /// \\return Read-only iterator to the beginning of the string characters\n    ///\n    /// \\see end\n    ///\n    ////////////////////////////////////////////////////////////\n    ConstIterator begin() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return an iterator to the end of the string\n    ///\n    /// The end iterator refers to 1 position past the last character;\n    /// thus it represents an invalid character and should never be\n    /// accessed.\n    ///\n    /// \\return Read-write iterator to the end of the string characters\n    ///\n    /// \\see begin\n    ///\n    ////////////////////////////////////////////////////////////\n    Iterator end();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return an iterator to the end of the string\n    ///\n    /// The end iterator refers to 1 position past the last character;\n    /// thus it represents an invalid character and should never be\n    /// accessed.\n    ///\n    /// \\return Read-only iterator to the end of the string characters\n    ///\n    /// \\see begin\n    ///\n    ////////////////////////////////////////////////////////////\n    ConstIterator end() const;\n\nprivate:\n\n    friend SFML_SYSTEM_API bool operator ==(const String& left, const String& right);\n    friend SFML_SYSTEM_API bool operator <(const String& left, const String& right);\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    std::basic_string<Uint32> m_string; //!< Internal string of UTF-32 characters\n};\n\n////////////////////////////////////////////////////////////\n/// \\relates String\n/// \\brief Overload of == operator to compare two UTF-32 strings\n///\n/// \\param left  Left operand (a string)\n/// \\param right Right operand (a string)\n///\n/// \\return True if both strings are equal\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator ==(const String& left, const String& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates String\n/// \\brief Overload of != operator to compare two UTF-32 strings\n///\n/// \\param left  Left operand (a string)\n/// \\param right Right operand (a string)\n///\n/// \\return True if both strings are different\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator !=(const String& left, const String& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates String\n/// \\brief Overload of < operator to compare two UTF-32 strings\n///\n/// \\param left  Left operand (a string)\n/// \\param right Right operand (a string)\n///\n/// \\return True if \\a left is lexicographically before \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator <(const String& left, const String& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates String\n/// \\brief Overload of > operator to compare two UTF-32 strings\n///\n/// \\param left  Left operand (a string)\n/// \\param right Right operand (a string)\n///\n/// \\return True if \\a left is lexicographically after \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator >(const String& left, const String& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates String\n/// \\brief Overload of <= operator to compare two UTF-32 strings\n///\n/// \\param left  Left operand (a string)\n/// \\param right Right operand (a string)\n///\n/// \\return True if \\a left is lexicographically before or equivalent to \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator <=(const String& left, const String& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates String\n/// \\brief Overload of >= operator to compare two UTF-32 strings\n///\n/// \\param left  Left operand (a string)\n/// \\param right Right operand (a string)\n///\n/// \\return True if \\a left is lexicographically after or equivalent to \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator >=(const String& left, const String& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates String\n/// \\brief Overload of binary + operator to concatenate two strings\n///\n/// \\param left  Left operand (a string)\n/// \\param right Right operand (a string)\n///\n/// \\return Concatenated string\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API String operator +(const String& left, const String& right);\n\n#include <SFML/System/String.inl>\n\n} // namespace sf\n\n\n#endif // SFML_STRING_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::String\n/// \\ingroup system\n///\n/// sf::String is a utility string class defined mainly for\n/// convenience. It is a Unicode string (implemented using\n/// UTF-32), thus it can store any character in the world\n/// (European, Chinese, Arabic, Hebrew, etc.).\n///\n/// It automatically handles conversions from/to ANSI and\n/// wide strings, so that you can work with standard string\n/// classes and still be compatible with functions taking a\n/// sf::String.\n///\n/// \\code\n/// sf::String s;\n///\n/// std::string s1 = s;  // automatically converted to ANSI string\n/// std::wstring s2 = s; // automatically converted to wide string\n/// s = \"hello\";         // automatically converted from ANSI string\n/// s = L\"hello\";        // automatically converted from wide string\n/// s += 'a';            // automatically converted from ANSI string\n/// s += L'a';           // automatically converted from wide string\n/// \\endcode\n///\n/// Conversions involving ANSI strings use the default user locale. However\n/// it is possible to use a custom locale if necessary:\n/// \\code\n/// std::locale locale;\n/// sf::String s;\n/// ...\n/// std::string s1 = s.toAnsiString(locale);\n/// s = sf::String(\"hello\", locale);\n/// \\endcode\n///\n/// sf::String defines the most important functions of the\n/// standard std::string class: removing, random access, iterating,\n/// appending, comparing, etc. However it is a simple class\n/// provided for convenience, and you may have to consider using\n/// a more optimized class if your program requires complex string\n/// handling. The automatic conversion functions will then take\n/// care of converting your string to sf::String whenever SFML\n/// requires it.\n///\n/// Please note that SFML also defines a low-level, generic\n/// interface for Unicode handling, see the sf::Utf classes.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/String.inl",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nString String::fromUtf8(T begin, T end)\n{\n    String string;\n    Utf8::toUtf32(begin, end, std::back_inserter(string.m_string));\n    return string;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nString String::fromUtf16(T begin, T end)\n{\n    String string;\n    Utf16::toUtf32(begin, end, std::back_inserter(string.m_string));\n    return string;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nString String::fromUtf32(T begin, T end)\n{\n    String string;\n    string.m_string.assign(begin, end);\n    return string;\n}\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Thread.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_THREAD_HPP\n#define SFML_THREAD_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <cstdlib>\n\n\nnamespace sf\n{\nnamespace priv\n{\n    class ThreadImpl;\n    struct ThreadFunc;\n}\n\n////////////////////////////////////////////////////////////\n/// \\brief Utility class to manipulate threads\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API Thread : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the thread from a functor with no argument\n    ///\n    /// This constructor works for function objects, as well\n    /// as free functions.\n    ///\n    /// Use this constructor for this kind of function:\n    /// \\code\n    /// void function();\n    ///\n    /// // --- or ----\n    ///\n    /// struct Functor\n    /// {\n    ///     void operator()();\n    /// };\n    /// \\endcode\n    /// Note: this does *not* run the thread, use launch().\n    ///\n    /// \\param function Functor or free function to use as the entry point of the thread\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename F>\n    Thread(F function);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the thread from a functor with an argument\n    ///\n    /// This constructor works for function objects, as well\n    /// as free functions.\n    /// It is a template, which means that the argument can\n    /// have any type (int, std::string, void*, Toto, ...).\n    ///\n    /// Use this constructor for this kind of function:\n    /// \\code\n    /// void function(int arg);\n    ///\n    /// // --- or ----\n    ///\n    /// struct Functor\n    /// {\n    ///     void operator()(std::string arg);\n    /// };\n    /// \\endcode\n    /// Note: this does *not* run the thread, use launch().\n    ///\n    /// \\param function Functor or free function to use as the entry point of the thread\n    /// \\param argument argument to forward to the function\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename F, typename A>\n    Thread(F function, A argument);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the thread from a member function and an object\n    ///\n    /// This constructor is a template, which means that you can\n    /// use it with any class.\n    /// Use this constructor for this kind of function:\n    /// \\code\n    /// class MyClass\n    /// {\n    /// public:\n    ///\n    ///     void function();\n    /// };\n    /// \\endcode\n    /// Note: this does *not* run the thread, use launch().\n    ///\n    /// \\param function Entry point of the thread\n    /// \\param object Pointer to the object to use\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename C>\n    Thread(void(C::*function)(), C* object);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// This destructor calls wait(), so that the internal thread\n    /// cannot survive after its sf::Thread instance is destroyed.\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Thread();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Run the thread\n    ///\n    /// This function starts the entry point passed to the\n    /// thread's constructor, and returns immediately.\n    /// After this function returns, the thread's function is\n    /// running in parallel to the calling code.\n    ///\n    ////////////////////////////////////////////////////////////\n    void launch();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Wait until the thread finishes\n    ///\n    /// This function will block the execution until the\n    /// thread's function ends.\n    /// Warning: if the thread function never ends, the calling\n    /// thread will block forever.\n    /// If this function is called from its owner thread, it\n    /// returns without doing anything.\n    ///\n    ////////////////////////////////////////////////////////////\n    void wait();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Terminate the thread\n    ///\n    /// This function immediately stops the thread, without waiting\n    /// for its function to finish.\n    /// Terminating a thread with this function is not safe,\n    /// and can lead to local variables not being destroyed\n    /// on some operating systems. You should rather try to make\n    /// the thread function terminate by itself.\n    ///\n    ////////////////////////////////////////////////////////////\n    void terminate();\n\nprivate:\n\n    friend class priv::ThreadImpl;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Internal entry point of the thread\n    ///\n    /// This function is called by the thread implementation.\n    ///\n    ////////////////////////////////////////////////////////////\n    void run();\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    priv::ThreadImpl* m_impl;       //!< OS-specific implementation of the thread\n    priv::ThreadFunc* m_entryPoint; //!< Abstraction of the function to run\n};\n\n#include <SFML/System/Thread.inl>\n\n} // namespace sf\n\n#endif // SFML_THREAD_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Thread\n/// \\ingroup system\n///\n/// Threads provide a way to run multiple parts of the code\n/// in parallel. When you launch a new thread, the execution\n/// is split and both the new thread and the caller run\n/// in parallel.\n///\n/// To use a sf::Thread, you construct it directly with the\n/// function to execute as the entry point of the thread.\n/// sf::Thread has multiple template constructors, which means\n/// that you can use several types of entry points:\n/// \\li non-member functions with no argument\n/// \\li non-member functions with one argument of any type\n/// \\li functors with no argument (this one is particularly useful for compatibility with boost/std::%bind)\n/// \\li functors with one argument of any type\n/// \\li member functions from any class with no argument\n///\n/// The function argument, if any, is copied in the sf::Thread\n/// instance, as well as the functor (if the corresponding\n/// constructor is used). Class instances, however, are passed\n/// by pointer so you must make sure that the object won't be\n/// destroyed while the thread is still using it.\n///\n/// The thread ends when its function is terminated. If the\n/// owner sf::Thread instance is destroyed before the\n/// thread is finished, the destructor will wait (see wait())\n///\n/// Usage examples:\n/// \\code\n/// // example 1: non member function with one argument\n///\n/// void threadFunc(int argument)\n/// {\n///     ...\n/// }\n///\n/// sf::Thread thread(&threadFunc, 5);\n/// thread.launch(); // start the thread (internally calls threadFunc(5))\n/// \\endcode\n///\n/// \\code\n/// // example 2: member function\n///\n/// class Task\n/// {\n/// public:\n///     void run()\n///     {\n///         ...\n///     }\n/// };\n///\n/// Task task;\n/// sf::Thread thread(&Task::run, &task);\n/// thread.launch(); // start the thread (internally calls task.run())\n/// \\endcode\n///\n/// \\code\n/// // example 3: functor\n///\n/// struct Task\n/// {\n///     void operator()()\n///     {\n///         ...\n///     }\n/// };\n///\n/// sf::Thread thread(Task());\n/// thread.launch(); // start the thread (internally calls operator() on the Task instance)\n/// \\endcode\n///\n/// Creating parallel threads of execution can be dangerous:\n/// all threads inside the same process share the same memory space,\n/// which means that you may end up accessing the same variable\n/// from multiple threads at the same time. To prevent this\n/// kind of situations, you can use mutexes (see sf::Mutex).\n///\n/// \\see sf::Mutex\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Thread.inl",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\nnamespace priv\n{\n// Base class for abstract thread functions\nstruct ThreadFunc\n{\n    virtual ~ThreadFunc() {}\n    virtual void run() = 0;\n};\n\n// Specialization using a functor (including free functions) with no argument\ntemplate <typename T>\nstruct ThreadFunctor : ThreadFunc\n{\n    ThreadFunctor(T functor) : m_functor(functor) {}\n    virtual void run() {m_functor();}\n    T m_functor;\n};\n\n// Specialization using a functor (including free functions) with one argument\ntemplate <typename F, typename A>\nstruct ThreadFunctorWithArg : ThreadFunc\n{\n    ThreadFunctorWithArg(F function, A arg) : m_function(function), m_arg(arg) {}\n    virtual void run() {m_function(m_arg);}\n    F m_function;\n    A m_arg;\n};\n\n// Specialization using a member function\ntemplate <typename C>\nstruct ThreadMemberFunc : ThreadFunc\n{\n    ThreadMemberFunc(void(C::*function)(), C* object) : m_function(function), m_object(object) {}\n    virtual void run() {(m_object->*m_function)();}\n    void(C::*m_function)();\n    C* m_object;\n};\n\n} // namespace priv\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename F>\nThread::Thread(F functor) :\nm_impl      (NULL),\nm_entryPoint(new priv::ThreadFunctor<F>(functor))\n{\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename F, typename A>\nThread::Thread(F function, A argument) :\nm_impl      (NULL),\nm_entryPoint(new priv::ThreadFunctorWithArg<F, A>(function, argument))\n{\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename C>\nThread::Thread(void(C::*function)(), C* object) :\nm_impl      (NULL),\nm_entryPoint(new priv::ThreadMemberFunc<C>(function, object))\n{\n}\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/ThreadLocal.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_THREADLOCAL_HPP\n#define SFML_THREADLOCAL_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <cstdlib>\n\n\nnamespace sf\n{\nnamespace priv\n{\n    class ThreadLocalImpl;\n}\n\n////////////////////////////////////////////////////////////\n/// \\brief Defines variables with thread-local storage\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API ThreadLocal : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// \\param value Optional value to initialize the variable\n    ///\n    ////////////////////////////////////////////////////////////\n    ThreadLocal(void* value = NULL);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~ThreadLocal();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the thread-specific value of the variable\n    ///\n    /// \\param value Value of the variable for the current thread\n    ///\n    ////////////////////////////////////////////////////////////\n    void setValue(void* value);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Retrieve the thread-specific value of the variable\n    ///\n    /// \\return Value of the variable for the current thread\n    ///\n    ////////////////////////////////////////////////////////////\n    void* getValue() const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    priv::ThreadLocalImpl* m_impl; //!< Pointer to the OS specific implementation\n};\n\n} // namespace sf\n\n\n#endif // SFML_THREADLOCAL_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::ThreadLocal\n/// \\ingroup system\n///\n/// This class manipulates void* parameters and thus is not\n/// appropriate for strongly-typed variables. You should rather\n/// use the sf::ThreadLocalPtr template class.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/ThreadLocalPtr.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_THREADLOCALPTR_HPP\n#define SFML_THREADLOCALPTR_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/ThreadLocal.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Pointer to a thread-local variable\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nclass ThreadLocalPtr : private ThreadLocal\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// \\param value Optional value to initialize the variable\n    ///\n    ////////////////////////////////////////////////////////////\n    ThreadLocalPtr(T* value = NULL);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of unary operator *\n    ///\n    /// Like raw pointers, applying the * operator returns a\n    /// reference to the pointed-to object.\n    ///\n    /// \\return Reference to the thread-local variable\n    ///\n    ////////////////////////////////////////////////////////////\n    T& operator *() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Overload of operator ->\n    ///\n    /// Similarly to raw pointers, applying the -> operator\n    /// returns the pointed-to object.\n    ///\n    /// \\return Pointer to the thread-local variable\n    ///\n    ////////////////////////////////////////////////////////////\n    T* operator ->() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Conversion operator to implicitly convert the\n    ///        pointer to its raw pointer type (T*)\n    ///\n    /// \\return Pointer to the actual object\n    ///\n    ////////////////////////////////////////////////////////////\n    operator T*() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Assignment operator for a raw pointer parameter\n    ///\n    /// \\param value Pointer to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    ThreadLocalPtr<T>& operator =(T* value);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Assignment operator for a ThreadLocalPtr parameter\n    ///\n    /// \\param right ThreadLocalPtr to assign\n    ///\n    /// \\return Reference to self\n    ///\n    ////////////////////////////////////////////////////////////\n    ThreadLocalPtr<T>& operator =(const ThreadLocalPtr<T>& right);\n};\n\n} // namespace sf\n\n#include <SFML/System/ThreadLocalPtr.inl>\n\n\n#endif // SFML_THREADLOCALPTR_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::ThreadLocalPtr\n/// \\ingroup system\n///\n/// sf::ThreadLocalPtr is a type-safe wrapper for storing\n/// pointers to thread-local variables. A thread-local\n/// variable holds a different value for each different\n/// thread, unlike normal variables that are shared.\n///\n/// Its usage is completely transparent, so that it is similar\n/// to manipulating the raw pointer directly (like any smart pointer).\n///\n/// Usage example:\n/// \\code\n/// MyClass object1;\n/// MyClass object2;\n/// sf::ThreadLocalPtr<MyClass> objectPtr;\n///\n/// void thread1()\n/// {\n///     objectPtr = &object1; // doesn't impact thread2\n///     ...\n/// }\n///\n/// void thread2()\n/// {\n///     objectPtr = &object2; // doesn't impact thread1\n///     ...\n/// }\n///\n/// int main()\n/// {\n///     // Create and launch the two threads\n///     sf::Thread t1(&thread1);\n///     sf::Thread t2(&thread2);\n///     t1.launch();\n///     t2.launch();\n///\n///     return 0;\n/// }\n/// \\endcode\n///\n/// ThreadLocalPtr is designed for internal use; however you\n/// can use it if you feel like it fits well your implementation.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/ThreadLocalPtr.inl",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nThreadLocalPtr<T>::ThreadLocalPtr(T* value) :\nThreadLocal(value)\n{\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nT& ThreadLocalPtr<T>::operator *() const\n{\n    return *static_cast<T*>(getValue());\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nT* ThreadLocalPtr<T>::operator ->() const\n{\n    return static_cast<T*>(getValue());\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nThreadLocalPtr<T>::operator T*() const\n{\n    return static_cast<T*>(getValue());\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nThreadLocalPtr<T>& ThreadLocalPtr<T>::operator =(T* value)\n{\n    setValue(value);\n    return *this;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nThreadLocalPtr<T>& ThreadLocalPtr<T>::operator =(const ThreadLocalPtr<T>& right)\n{\n    setValue(right.getValue());\n    return *this;\n}\n\n} // namespace sf\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Time.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_TIME_HPP\n#define SFML_TIME_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/System/Export.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Represents a time value\n///\n////////////////////////////////////////////////////////////\nclass SFML_SYSTEM_API Time\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Sets the time value to zero.\n    ///\n    ////////////////////////////////////////////////////////////\n    Time();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the time value as a number of seconds\n    ///\n    /// \\return Time in seconds\n    ///\n    /// \\see asMilliseconds, asMicroseconds\n    ///\n    ////////////////////////////////////////////////////////////\n    float asSeconds() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the time value as a number of milliseconds\n    ///\n    /// \\return Time in milliseconds\n    ///\n    /// \\see asSeconds, asMicroseconds\n    ///\n    ////////////////////////////////////////////////////////////\n    Int32 asMilliseconds() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the time value as a number of microseconds\n    ///\n    /// \\return Time in microseconds\n    ///\n    /// \\see asSeconds, asMilliseconds\n    ///\n    ////////////////////////////////////////////////////////////\n    Int64 asMicroseconds() const;\n\n    ////////////////////////////////////////////////////////////\n    // Static member data\n    ////////////////////////////////////////////////////////////\n    static const Time Zero; //!< Predefined \"zero\" time value\n\nprivate:\n\n    friend SFML_SYSTEM_API Time seconds(float);\n    friend SFML_SYSTEM_API Time milliseconds(Int32);\n    friend SFML_SYSTEM_API Time microseconds(Int64);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct from a number of microseconds\n    ///\n    /// This function is internal. To construct time values,\n    /// use sf::seconds, sf::milliseconds or sf::microseconds instead.\n    ///\n    /// \\param microseconds Number of microseconds\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit Time(Int64 microseconds);\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    Int64 m_microseconds; //!< Time value stored as microseconds\n};\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Construct a time value from a number of seconds\n///\n/// \\param amount Number of seconds\n///\n/// \\return Time value constructed from the amount of seconds\n///\n/// \\see milliseconds, microseconds\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time seconds(float amount);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Construct a time value from a number of milliseconds\n///\n/// \\param amount Number of milliseconds\n///\n/// \\return Time value constructed from the amount of milliseconds\n///\n/// \\see seconds, microseconds\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time milliseconds(Int32 amount);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Construct a time value from a number of microseconds\n///\n/// \\param amount Number of microseconds\n///\n/// \\return Time value constructed from the amount of microseconds\n///\n/// \\see seconds, milliseconds\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time microseconds(Int64 amount);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of == operator to compare two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return True if both time values are equal\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator ==(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of != operator to compare two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return True if both time values are different\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator !=(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of < operator to compare two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return True if \\a left is lesser than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator <(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of > operator to compare two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return True if \\a left is greater than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator >(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of <= operator to compare two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return True if \\a left is lesser or equal than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator <=(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of >= operator to compare two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return True if \\a left is greater or equal than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API bool operator >=(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of unary - operator to negate a time value\n///\n/// \\param right Right operand (a time)\n///\n/// \\return Opposite of the time value\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator -(Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary + operator to add two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return Sum of the two times values\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator +(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary += operator to add/assign two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return Sum of the two times values\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time& operator +=(Time& left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary - operator to subtract two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return Difference of the two times values\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator -(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary -= operator to subtract/assign two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return Difference of the two times values\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time& operator -=(Time& left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary * operator to scale a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a number)\n///\n/// \\return \\a left multiplied by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator *(Time left, float right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary * operator to scale a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a number)\n///\n/// \\return \\a left multiplied by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator *(Time left, Int64 right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary * operator to scale a time value\n///\n/// \\param left  Left operand (a number)\n/// \\param right Right operand (a time)\n///\n/// \\return \\a left multiplied by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator *(float left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary * operator to scale a time value\n///\n/// \\param left  Left operand (a number)\n/// \\param right Right operand (a time)\n///\n/// \\return \\a left multiplied by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator *(Int64 left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary *= operator to scale/assign a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a number)\n///\n/// \\return \\a left multiplied by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time& operator *=(Time& left, float right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary *= operator to scale/assign a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a number)\n///\n/// \\return \\a left multiplied by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time& operator *=(Time& left, Int64 right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary / operator to scale a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a number)\n///\n/// \\return \\a left divided by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator /(Time left, float right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary / operator to scale a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a number)\n///\n/// \\return \\a left divided by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator /(Time left, Int64 right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary /= operator to scale/assign a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a number)\n///\n/// \\return \\a left divided by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time& operator /=(Time& left, float right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary /= operator to scale/assign a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a number)\n///\n/// \\return \\a left divided by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time& operator /=(Time& left, Int64 right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary / operator to compute the ratio of two time values\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return \\a left divided by \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API float operator /(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary % operator to compute remainder of a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return \\a left modulo \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time operator %(Time left, Time right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Time\n/// \\brief Overload of binary %= operator to compute/assign remainder of a time value\n///\n/// \\param left  Left operand (a time)\n/// \\param right Right operand (a time)\n///\n/// \\return \\a left modulo \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_SYSTEM_API Time& operator %=(Time& left, Time right);\n\n} // namespace sf\n\n\n#endif // SFML_TIME_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Time\n/// \\ingroup system\n///\n/// sf::Time encapsulates a time value in a flexible way.\n/// It allows to define a time value either as a number of\n/// seconds, milliseconds or microseconds. It also works the\n/// other way round: you can read a time value as either\n/// a number of seconds, milliseconds or microseconds.\n///\n/// By using such a flexible interface, the API doesn't\n/// impose any fixed type or resolution for time values,\n/// and let the user choose its own favorite representation.\n///\n/// Time values support the usual mathematical operations:\n/// you can add or subtract two times, multiply or divide\n/// a time by a number, compare two times, etc.\n///\n/// Since they represent a time span and not an absolute time\n/// value, times can also be negative.\n///\n/// Usage example:\n/// \\code\n/// sf::Time t1 = sf::seconds(0.1f);\n/// Int32 milli = t1.asMilliseconds(); // 100\n///\n/// sf::Time t2 = sf::milliseconds(30);\n/// Int64 micro = t2.asMicroseconds(); // 30000\n///\n/// sf::Time t3 = sf::microseconds(-800000);\n/// float sec = t3.asSeconds(); // -0.8\n/// \\endcode\n///\n/// \\code\n/// void update(sf::Time elapsed)\n/// {\n///    position += speed * elapsed.asSeconds();\n/// }\n///\n/// update(sf::milliseconds(100));\n/// \\endcode\n///\n/// \\see sf::Clock\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Utf.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_UTF_HPP\n#define SFML_UTF_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n#include <algorithm>\n#include <locale>\n#include <string>\n#include <cstdlib>\n\n\nnamespace sf\n{\ntemplate <unsigned int N>\nclass Utf;\n\n////////////////////////////////////////////////////////////\n/// \\brief Specialization of the Utf template for UTF-8\n///\n////////////////////////////////////////////////////////////\ntemplate <>\nclass Utf<8>\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Decode a single UTF-8 character\n    ///\n    /// Decoding a character means finding its unique 32-bits\n    /// code (called the codepoint) in the Unicode standard.\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Codepoint of the decoded UTF-8 character\n    /// \\param replacement Replacement character to use in case the UTF-8 sequence is invalid\n    ///\n    /// \\return Iterator pointing to one past the last read element of the input sequence\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static In decode(In begin, In end, Uint32& output, Uint32 replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Encode a single UTF-8 character\n    ///\n    /// Encoding a character means converting a unique 32-bits\n    /// code (called the codepoint) in the target encoding, UTF-8.\n    ///\n    /// \\param input       Codepoint to encode as UTF-8\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to UTF-8 (use 0 to skip them)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename Out>\n    static Out encode(Uint32 input, Out output, Uint8 replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Advance to the next UTF-8 character\n    ///\n    /// This function is necessary for multi-elements encodings, as\n    /// a single character may use more than 1 storage element.\n    ///\n    /// \\param begin Iterator pointing to the beginning of the input sequence\n    /// \\param end   Iterator pointing to the end of the input sequence\n    ///\n    /// \\return Iterator pointing to one past the last read element of the input sequence\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static In next(In begin, In end);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Count the number of characters of a UTF-8 sequence\n    ///\n    /// This function is necessary for multi-elements encodings, as\n    /// a single character may use more than 1 storage element, thus the\n    /// total size can be different from (begin - end).\n    ///\n    /// \\param begin Iterator pointing to the beginning of the input sequence\n    /// \\param end   Iterator pointing to the end of the input sequence\n    ///\n    /// \\return Iterator pointing to one past the last read element of the input sequence\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static std::size_t count(In begin, In end);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an ANSI characters range to UTF-8\n    ///\n    /// The current global locale will be used by default, unless you\n    /// pass a custom one in the \\a locale parameter.\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    /// \\param locale Locale to use for conversion\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out fromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a wide characters range to UTF-8\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out fromWide(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a latin-1 (ISO-5589-1) characters range to UTF-8\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out fromLatin1(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an UTF-8 characters range to ANSI characters\n    ///\n    /// The current global locale will be used by default, unless you\n    /// pass a custom one in the \\a locale parameter.\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to ANSI (use 0 to skip them)\n    /// \\param locale      Locale to use for conversion\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an UTF-8 characters range to wide characters\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to wide (use 0 to skip them)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toWide(In begin, In end, Out output, wchar_t replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an UTF-8 characters range to latin-1 (ISO-5589-1) characters\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to wide (use 0 to skip them)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toLatin1(In begin, In end, Out output, char replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a UTF-8 characters range to UTF-8\n    ///\n    /// This functions does nothing more than a direct copy;\n    /// it is defined only to provide the same interface as other\n    /// specializations of the sf::Utf<> template, and allow\n    /// generic code to be written on top of it.\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toUtf8(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a UTF-8 characters range to UTF-16\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toUtf16(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a UTF-8 characters range to UTF-32\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toUtf32(In begin, In end, Out output);\n};\n\n////////////////////////////////////////////////////////////\n/// \\brief Specialization of the Utf template for UTF-16\n///\n////////////////////////////////////////////////////////////\ntemplate <>\nclass Utf<16>\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Decode a single UTF-16 character\n    ///\n    /// Decoding a character means finding its unique 32-bits\n    /// code (called the codepoint) in the Unicode standard.\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Codepoint of the decoded UTF-16 character\n    /// \\param replacement Replacement character to use in case the UTF-8 sequence is invalid\n    ///\n    /// \\return Iterator pointing to one past the last read element of the input sequence\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static In decode(In begin, In end, Uint32& output, Uint32 replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Encode a single UTF-16 character\n    ///\n    /// Encoding a character means converting a unique 32-bits\n    /// code (called the codepoint) in the target encoding, UTF-16.\n    ///\n    /// \\param input       Codepoint to encode as UTF-16\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to UTF-16 (use 0 to skip them)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename Out>\n    static Out encode(Uint32 input, Out output, Uint16 replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Advance to the next UTF-16 character\n    ///\n    /// This function is necessary for multi-elements encodings, as\n    /// a single character may use more than 1 storage element.\n    ///\n    /// \\param begin Iterator pointing to the beginning of the input sequence\n    /// \\param end   Iterator pointing to the end of the input sequence\n    ///\n    /// \\return Iterator pointing to one past the last read element of the input sequence\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static In next(In begin, In end);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Count the number of characters of a UTF-16 sequence\n    ///\n    /// This function is necessary for multi-elements encodings, as\n    /// a single character may use more than 1 storage element, thus the\n    /// total size can be different from (begin - end).\n    ///\n    /// \\param begin Iterator pointing to the beginning of the input sequence\n    /// \\param end   Iterator pointing to the end of the input sequence\n    ///\n    /// \\return Iterator pointing to one past the last read element of the input sequence\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static std::size_t count(In begin, In end);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an ANSI characters range to UTF-16\n    ///\n    /// The current global locale will be used by default, unless you\n    /// pass a custom one in the \\a locale parameter.\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    /// \\param locale Locale to use for conversion\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out fromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a wide characters range to UTF-16\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out fromWide(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a latin-1 (ISO-5589-1) characters range to UTF-16\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out fromLatin1(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an UTF-16 characters range to ANSI characters\n    ///\n    /// The current global locale will be used by default, unless you\n    /// pass a custom one in the \\a locale parameter.\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to ANSI (use 0 to skip them)\n    /// \\param locale      Locale to use for conversion\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an UTF-16 characters range to wide characters\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to wide (use 0 to skip them)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toWide(In begin, In end, Out output, wchar_t replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an UTF-16 characters range to latin-1 (ISO-5589-1) characters\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to wide (use 0 to skip them)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toLatin1(In begin, In end, Out output, char replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a UTF-16 characters range to UTF-8\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toUtf8(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a UTF-16 characters range to UTF-16\n    ///\n    /// This functions does nothing more than a direct copy;\n    /// it is defined only to provide the same interface as other\n    /// specializations of the sf::Utf<> template, and allow\n    /// generic code to be written on top of it.\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toUtf16(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a UTF-16 characters range to UTF-32\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toUtf32(In begin, In end, Out output);\n};\n\n////////////////////////////////////////////////////////////\n/// \\brief Specialization of the Utf template for UTF-32\n///\n////////////////////////////////////////////////////////////\ntemplate <>\nclass Utf<32>\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Decode a single UTF-32 character\n    ///\n    /// Decoding a character means finding its unique 32-bits\n    /// code (called the codepoint) in the Unicode standard.\n    /// For UTF-32, the character value is the same as the codepoint.\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Codepoint of the decoded UTF-32 character\n    /// \\param replacement Replacement character to use in case the UTF-8 sequence is invalid\n    ///\n    /// \\return Iterator pointing to one past the last read element of the input sequence\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static In decode(In begin, In end, Uint32& output, Uint32 replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Encode a single UTF-32 character\n    ///\n    /// Encoding a character means converting a unique 32-bits\n    /// code (called the codepoint) in the target encoding, UTF-32.\n    /// For UTF-32, the codepoint is the same as the character value.\n    ///\n    /// \\param input       Codepoint to encode as UTF-32\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to UTF-32 (use 0 to skip them)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename Out>\n    static Out encode(Uint32 input, Out output, Uint32 replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Advance to the next UTF-32 character\n    ///\n    /// This function is trivial for UTF-32, which can store\n    /// every character in a single storage element.\n    ///\n    /// \\param begin Iterator pointing to the beginning of the input sequence\n    /// \\param end   Iterator pointing to the end of the input sequence\n    ///\n    /// \\return Iterator pointing to one past the last read element of the input sequence\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static In next(In begin, In end);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Count the number of characters of a UTF-32 sequence\n    ///\n    /// This function is trivial for UTF-32, which can store\n    /// every character in a single storage element.\n    ///\n    /// \\param begin Iterator pointing to the beginning of the input sequence\n    /// \\param end   Iterator pointing to the end of the input sequence\n    ///\n    /// \\return Iterator pointing to one past the last read element of the input sequence\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static std::size_t count(In begin, In end);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an ANSI characters range to UTF-32\n    ///\n    /// The current global locale will be used by default, unless you\n    /// pass a custom one in the \\a locale parameter.\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    /// \\param locale Locale to use for conversion\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out fromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a wide characters range to UTF-32\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out fromWide(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a latin-1 (ISO-5589-1) characters range to UTF-32\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out fromLatin1(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an UTF-32 characters range to ANSI characters\n    ///\n    /// The current global locale will be used by default, unless you\n    /// pass a custom one in the \\a locale parameter.\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to ANSI (use 0 to skip them)\n    /// \\param locale      Locale to use for conversion\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an UTF-32 characters range to wide characters\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to wide (use 0 to skip them)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toWide(In begin, In end, Out output, wchar_t replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert an UTF-16 characters range to latin-1 (ISO-5589-1) characters\n    ///\n    /// \\param begin       Iterator pointing to the beginning of the input sequence\n    /// \\param end         Iterator pointing to the end of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement for characters not convertible to wide (use 0 to skip them)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toLatin1(In begin, In end, Out output, char replacement = 0);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a UTF-32 characters range to UTF-8\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toUtf8(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a UTF-32 characters range to UTF-16\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toUtf16(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Convert a UTF-32 characters range to UTF-32\n    ///\n    /// This functions does nothing more than a direct copy;\n    /// it is defined only to provide the same interface as other\n    /// specializations of the sf::Utf<> template, and allow\n    /// generic code to be written on top of it.\n    ///\n    /// \\param begin  Iterator pointing to the beginning of the input sequence\n    /// \\param end    Iterator pointing to the end of the input sequence\n    /// \\param output Iterator pointing to the beginning of the output sequence\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In, typename Out>\n    static Out toUtf32(In begin, In end, Out output);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Decode a single ANSI character to UTF-32\n    ///\n    /// This function does not exist in other specializations\n    /// of sf::Utf<>, it is defined for convenience (it is used by\n    /// several other conversion functions).\n    ///\n    /// \\param input  Input ANSI character\n    /// \\param locale Locale to use for conversion\n    ///\n    /// \\return Converted character\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static Uint32 decodeAnsi(In input, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Decode a single wide character to UTF-32\n    ///\n    /// This function does not exist in other specializations\n    /// of sf::Utf<>, it is defined for convenience (it is used by\n    /// several other conversion functions).\n    ///\n    /// \\param input Input wide character\n    ///\n    /// \\return Converted character\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename In>\n    static Uint32 decodeWide(In input);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Encode a single UTF-32 character to ANSI\n    ///\n    /// This function does not exist in other specializations\n    /// of sf::Utf<>, it is defined for convenience (it is used by\n    /// several other conversion functions).\n    ///\n    /// \\param codepoint   Iterator pointing to the beginning of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement if the input character is not convertible to ANSI (use 0 to skip it)\n    /// \\param locale      Locale to use for conversion\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename Out>\n    static Out encodeAnsi(Uint32 codepoint, Out output, char replacement = 0, const std::locale& locale = std::locale());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Encode a single UTF-32 character to wide\n    ///\n    /// This function does not exist in other specializations\n    /// of sf::Utf<>, it is defined for convenience (it is used by\n    /// several other conversion functions).\n    ///\n    /// \\param codepoint   Iterator pointing to the beginning of the input sequence\n    /// \\param output      Iterator pointing to the beginning of the output sequence\n    /// \\param replacement Replacement if the input character is not convertible to wide (use 0 to skip it)\n    ///\n    /// \\return Iterator to the end of the output sequence which has been written\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename Out>\n    static Out encodeWide(Uint32 codepoint, Out output, wchar_t replacement = 0);\n};\n\n#include <SFML/System/Utf.inl>\n\n// Make typedefs to get rid of the template syntax\ntypedef Utf<8>  Utf8;\ntypedef Utf<16> Utf16;\ntypedef Utf<32> Utf32;\n\n} // namespace sf\n\n\n#endif // SFML_UTF_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Utf\n/// \\ingroup system\n///\n/// Utility class providing generic functions for UTF conversions.\n///\n/// sf::Utf is a low-level, generic interface for counting, iterating,\n/// encoding and decoding Unicode characters and strings. It is able\n/// to handle ANSI, wide, latin-1, UTF-8, UTF-16 and UTF-32 encodings.\n///\n/// sf::Utf<X> functions are all static, these classes are not meant to\n/// be instantiated. All the functions are template, so that you\n/// can use any character / string type for a given encoding.\n///\n/// It has 3 specializations:\n/// \\li sf::Utf<8> (typedef'd to sf::Utf8)\n/// \\li sf::Utf<16> (typedef'd to sf::Utf16)\n/// \\li sf::Utf<32> (typedef'd to sf::Utf32)\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Utf.inl",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////\n// References:\n//\n// https://www.unicode.org/\n// https://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.c\n// https://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.h\n// https://people.w3.org/rishida/scripts/uniview/conversion\n//\n////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nIn Utf<8>::decode(In begin, In end, Uint32& output, Uint32 replacement)\n{\n    // Some useful precomputed data\n    static const int trailing[256] =\n    {\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5\n    };\n    static const Uint32 offsets[6] =\n    {\n        0x00000000, 0x00003080, 0x000E2080, 0x03C82080, 0xFA082080, 0x82082080\n    };\n\n    // decode the character\n    int trailingBytes = trailing[static_cast<Uint8>(*begin)];\n    if (begin + trailingBytes < end)\n    {\n        output = 0;\n        switch (trailingBytes)\n        {\n            case 5: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough\n            case 4: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough\n            case 3: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough\n            case 2: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough\n            case 1: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough\n            case 0: output += static_cast<Uint8>(*begin++);\n        }\n        output -= offsets[trailingBytes];\n    }\n    else\n    {\n        // Incomplete character\n        begin = end;\n        output = replacement;\n    }\n\n    return begin;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename Out>\nOut Utf<8>::encode(Uint32 input, Out output, Uint8 replacement)\n{\n    // Some useful precomputed data\n    static const Uint8 firstBytes[7] =\n    {\n        0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC\n    };\n\n    // encode the character\n    if ((input > 0x0010FFFF) || ((input >= 0xD800) && (input <= 0xDBFF)))\n    {\n        // Invalid character\n        if (replacement)\n            output = std::copy(&replacement, &replacement + 1, output);\n    }\n    else\n    {\n        // Valid character\n\n        // Get the number of bytes to write\n        std::size_t bytestoWrite = 1;\n        if      (input <  0x80)       bytestoWrite = 1;\n        else if (input <  0x800)      bytestoWrite = 2;\n        else if (input <  0x10000)    bytestoWrite = 3;\n        else if (input <= 0x0010FFFF) bytestoWrite = 4;\n\n        // Extract the bytes to write\n        Uint8 bytes[4];\n        switch (bytestoWrite)\n        {\n            case 4: bytes[3] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6; // fallthrough\n            case 3: bytes[2] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6; // fallthrough\n            case 2: bytes[1] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6; // fallthrough\n            case 1: bytes[0] = static_cast<Uint8> (input | firstBytes[bytestoWrite]);\n        }\n\n        // Add them to the output\n        output = std::copy(bytes, bytes + bytestoWrite, output);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nIn Utf<8>::next(In begin, In end)\n{\n    Uint32 codepoint;\n    return decode(begin, end, codepoint);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nstd::size_t Utf<8>::count(In begin, In end)\n{\n    std::size_t length = 0;\n    while (begin < end)\n    {\n        begin = next(begin, end);\n        ++length;\n    }\n\n    return length;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<8>::fromAnsi(In begin, In end, Out output, const std::locale& locale)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint = Utf<32>::decodeAnsi(*begin++, locale);\n        output = encode(codepoint, output);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<8>::fromWide(In begin, In end, Out output)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint = Utf<32>::decodeWide(*begin++);\n        output = encode(codepoint, output);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<8>::fromLatin1(In begin, In end, Out output)\n{\n    // Latin-1 is directly compatible with Unicode encodings,\n    // and can thus be treated as (a sub-range of) UTF-32\n    while (begin < end)\n        output = encode(*begin++, output);\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<8>::toAnsi(In begin, In end, Out output, char replacement, const std::locale& locale)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint;\n        begin = decode(begin, end, codepoint);\n        output = Utf<32>::encodeAnsi(codepoint, output, replacement, locale);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<8>::toWide(In begin, In end, Out output, wchar_t replacement)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint;\n        begin = decode(begin, end, codepoint);\n        output = Utf<32>::encodeWide(codepoint, output, replacement);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<8>::toLatin1(In begin, In end, Out output, char replacement)\n{\n    // Latin-1 is directly compatible with Unicode encodings,\n    // and can thus be treated as (a sub-range of) UTF-32\n    while (begin < end)\n    {\n        Uint32 codepoint;\n        begin = decode(begin, end, codepoint);\n        *output++ = codepoint < 256 ? static_cast<char>(codepoint) : replacement;\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<8>::toUtf8(In begin, In end, Out output)\n{\n    return std::copy(begin, end, output);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<8>::toUtf16(In begin, In end, Out output)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint;\n        begin = decode(begin, end, codepoint);\n        output = Utf<16>::encode(codepoint, output);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<8>::toUtf32(In begin, In end, Out output)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint;\n        begin = decode(begin, end, codepoint);\n        *output++ = codepoint;\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nIn Utf<16>::decode(In begin, In end, Uint32& output, Uint32 replacement)\n{\n    Uint16 first = *begin++;\n\n    // If it's a surrogate pair, first convert to a single UTF-32 character\n    if ((first >= 0xD800) && (first <= 0xDBFF))\n    {\n        if (begin < end)\n        {\n            Uint32 second = *begin++;\n            if ((second >= 0xDC00) && (second <= 0xDFFF))\n            {\n                // The second element is valid: convert the two elements to a UTF-32 character\n                output = ((first - 0xD800u) << 10) + (second - 0xDC00) + 0x0010000;\n            }\n            else\n            {\n                // Invalid character\n                output = replacement;\n            }\n        }\n        else\n        {\n            // Invalid character\n            begin = end;\n            output = replacement;\n        }\n    }\n    else\n    {\n        // We can make a direct copy\n        output = first;\n    }\n\n    return begin;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename Out>\nOut Utf<16>::encode(Uint32 input, Out output, Uint16 replacement)\n{\n    if (input <= 0xFFFF)\n    {\n        // The character can be copied directly, we just need to check if it's in the valid range\n        if ((input >= 0xD800) && (input <= 0xDFFF))\n        {\n            // Invalid character (this range is reserved)\n            if (replacement)\n                *output++ = replacement;\n        }\n        else\n        {\n            // Valid character directly convertible to a single UTF-16 character\n            *output++ = static_cast<Uint16>(input);\n        }\n    }\n    else if (input > 0x0010FFFF)\n    {\n        // Invalid character (greater than the maximum Unicode value)\n        if (replacement)\n            *output++ = replacement;\n    }\n    else\n    {\n        // The input character will be converted to two UTF-16 elements\n        input -= 0x0010000;\n        *output++ = static_cast<Uint16>((input >> 10)     + 0xD800);\n        *output++ = static_cast<Uint16>((input & 0x3FFUL) + 0xDC00);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nIn Utf<16>::next(In begin, In end)\n{\n    Uint32 codepoint;\n    return decode(begin, end, codepoint);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nstd::size_t Utf<16>::count(In begin, In end)\n{\n    std::size_t length = 0;\n    while (begin < end)\n    {\n        begin = next(begin, end);\n        ++length;\n    }\n\n    return length;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<16>::fromAnsi(In begin, In end, Out output, const std::locale& locale)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint = Utf<32>::decodeAnsi(*begin++, locale);\n        output = encode(codepoint, output);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<16>::fromWide(In begin, In end, Out output)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint = Utf<32>::decodeWide(*begin++);\n        output = encode(codepoint, output);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<16>::fromLatin1(In begin, In end, Out output)\n{\n    // Latin-1 is directly compatible with Unicode encodings,\n    // and can thus be treated as (a sub-range of) UTF-32\n    return std::copy(begin, end, output);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<16>::toAnsi(In begin, In end, Out output, char replacement, const std::locale& locale)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint;\n        begin = decode(begin, end, codepoint);\n        output = Utf<32>::encodeAnsi(codepoint, output, replacement, locale);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<16>::toWide(In begin, In end, Out output, wchar_t replacement)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint;\n        begin = decode(begin, end, codepoint);\n        output = Utf<32>::encodeWide(codepoint, output, replacement);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<16>::toLatin1(In begin, In end, Out output, char replacement)\n{\n    // Latin-1 is directly compatible with Unicode encodings,\n    // and can thus be treated as (a sub-range of) UTF-32\n    while (begin < end)\n    {\n        *output++ = *begin < 256 ? static_cast<char>(*begin) : replacement;\n        begin++;\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<16>::toUtf8(In begin, In end, Out output)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint;\n        begin = decode(begin, end, codepoint);\n        output = Utf<8>::encode(codepoint, output);\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<16>::toUtf16(In begin, In end, Out output)\n{\n    return std::copy(begin, end, output);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<16>::toUtf32(In begin, In end, Out output)\n{\n    while (begin < end)\n    {\n        Uint32 codepoint;\n        begin = decode(begin, end, codepoint);\n        *output++ = codepoint;\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nIn Utf<32>::decode(In begin, In /*end*/, Uint32& output, Uint32 /*replacement*/)\n{\n    output = *begin++;\n    return begin;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename Out>\nOut Utf<32>::encode(Uint32 input, Out output, Uint32 /*replacement*/)\n{\n    *output++ = input;\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nIn Utf<32>::next(In begin, In /*end*/)\n{\n    return ++begin;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nstd::size_t Utf<32>::count(In begin, In end)\n{\n    return begin - end;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<32>::fromAnsi(In begin, In end, Out output, const std::locale& locale)\n{\n    while (begin < end)\n        *output++ = decodeAnsi(*begin++, locale);\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<32>::fromWide(In begin, In end, Out output)\n{\n    while (begin < end)\n        *output++ = decodeWide(*begin++);\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<32>::fromLatin1(In begin, In end, Out output)\n{\n    // Latin-1 is directly compatible with Unicode encodings,\n    // and can thus be treated as (a sub-range of) UTF-32\n    return std::copy(begin, end, output);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<32>::toAnsi(In begin, In end, Out output, char replacement, const std::locale& locale)\n{\n    while (begin < end)\n        output = encodeAnsi(*begin++, output, replacement, locale);\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<32>::toWide(In begin, In end, Out output, wchar_t replacement)\n{\n    while (begin < end)\n        output = encodeWide(*begin++, output, replacement);\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<32>::toLatin1(In begin, In end, Out output, char replacement)\n{\n    // Latin-1 is directly compatible with Unicode encodings,\n    // and can thus be treated as (a sub-range of) UTF-32\n    while (begin < end)\n    {\n        *output++ = *begin < 256 ? static_cast<char>(*begin) : replacement;\n        begin++;\n    }\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<32>::toUtf8(In begin, In end, Out output)\n{\n    while (begin < end)\n        output = Utf<8>::encode(*begin++, output);\n\n    return output;\n}\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<32>::toUtf16(In begin, In end, Out output)\n{\n    while (begin < end)\n        output = Utf<16>::encode(*begin++, output);\n\n    return output;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In, typename Out>\nOut Utf<32>::toUtf32(In begin, In end, Out output)\n{\n    return std::copy(begin, end, output);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nUint32 Utf<32>::decodeAnsi(In input, const std::locale& locale)\n{\n    // On Windows, GCC's standard library (glibc++) has almost\n    // no support for Unicode stuff. As a consequence, in this\n    // context we can only use the default locale and ignore\n    // the one passed as parameter.\n\n    #if defined(SFML_SYSTEM_WINDOWS) &&                       /* if Windows ... */                          \\\n       (defined(__GLIBCPP__) || defined (__GLIBCXX__)) &&     /* ... and standard library is glibc++ ... */ \\\n      !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) /* ... and STLPort is not used on top of it */\n\n        (void)locale; // to avoid warnings\n\n        wchar_t character = 0;\n        mbtowc(&character, &input, 1);\n        return static_cast<Uint32>(character);\n\n    #else\n\n        // Get the facet of the locale which deals with character conversion\n        const std::ctype<wchar_t>& facet = std::use_facet< std::ctype<wchar_t> >(locale);\n\n        // Use the facet to convert each character of the input string\n        return static_cast<Uint32>(facet.widen(input));\n\n    #endif\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename In>\nUint32 Utf<32>::decodeWide(In input)\n{\n    // The encoding of wide characters is not well defined and is left to the system;\n    // however we can safely assume that it is UCS-2 on Windows and\n    // UCS-4 on Unix systems.\n    // In both cases, a simple copy is enough (UCS-2 is a subset of UCS-4,\n    // and UCS-4 *is* UTF-32).\n\n    return static_cast<Uint32>(input);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename Out>\nOut Utf<32>::encodeAnsi(Uint32 codepoint, Out output, char replacement, const std::locale& locale)\n{\n    // On Windows, gcc's standard library (glibc++) has almost\n    // no support for Unicode stuff. As a consequence, in this\n    // context we can only use the default locale and ignore\n    // the one passed as parameter.\n\n    #if defined(SFML_SYSTEM_WINDOWS) &&                       /* if Windows ... */                          \\\n       (defined(__GLIBCPP__) || defined (__GLIBCXX__)) &&     /* ... and standard library is glibc++ ... */ \\\n      !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) /* ... and STLPort is not used on top of it */\n\n        (void)locale; // to avoid warnings\n\n        char character = 0;\n        if (wctomb(&character, static_cast<wchar_t>(codepoint)) >= 0)\n            *output++ = character;\n        else if (replacement)\n            *output++ = replacement;\n\n        return output;\n\n    #else\n\n        // Get the facet of the locale which deals with character conversion\n        const std::ctype<wchar_t>& facet = std::use_facet< std::ctype<wchar_t> >(locale);\n\n        // Use the facet to convert each character of the input string\n        *output++ = facet.narrow(static_cast<wchar_t>(codepoint), replacement);\n\n        return output;\n\n    #endif\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename Out>\nOut Utf<32>::encodeWide(Uint32 codepoint, Out output, wchar_t replacement)\n{\n    // The encoding of wide characters is not well defined and is left to the system;\n    // however we can safely assume that it is UCS-2 on Windows and\n    // UCS-4 on Unix systems.\n    // For UCS-2 we need to check if the source characters fits in (UCS-2 is a subset of UCS-4).\n    // For UCS-4 we can do a direct copy (UCS-4 *is* UTF-32).\n\n    switch (sizeof(wchar_t))\n    {\n        case 4:\n        {\n            *output++ = static_cast<wchar_t>(codepoint);\n            break;\n        }\n\n        default:\n        {\n            if ((codepoint <= 0xFFFF) && ((codepoint < 0xD800) || (codepoint > 0xDFFF)))\n            {\n                *output++ = static_cast<wchar_t>(codepoint);\n            }\n            else if (replacement)\n            {\n                *output++ = replacement;\n            }\n            break;\n        }\n    }\n\n    return output;\n}\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Vector2.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_VECTOR2_HPP\n#define SFML_VECTOR2_HPP\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Utility template class for manipulating\n///        2-dimensional vectors\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nclass Vector2\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates a Vector2(0, 0).\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the vector from its coordinates\n    ///\n    /// \\param X X coordinate\n    /// \\param Y Y coordinate\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2(T X, T Y);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the vector from another type of vector\n    ///\n    /// This constructor doesn't replace the copy constructor,\n    /// it's called only when U != T.\n    /// A call to this constructor will fail to compile if U\n    /// is not convertible to T.\n    ///\n    /// \\param vector Vector to convert\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename U>\n    explicit Vector2(const Vector2<U>& vector);\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    T x; //!< X coordinate of the vector\n    T y; //!< Y coordinate of the vector\n};\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of unary operator -\n///\n/// \\param right Vector to negate\n///\n/// \\return Memberwise opposite of the vector\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T> operator -(const Vector2<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator +=\n///\n/// This operator performs a memberwise addition of both vectors,\n/// and assigns the result to \\a left.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T>& operator +=(Vector2<T>& left, const Vector2<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator -=\n///\n/// This operator performs a memberwise subtraction of both vectors,\n/// and assigns the result to \\a left.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T>& operator -=(Vector2<T>& left, const Vector2<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator +\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return Memberwise addition of both vectors\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T> operator +(const Vector2<T>& left, const Vector2<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator -\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return Memberwise subtraction of both vectors\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T> operator -(const Vector2<T>& left, const Vector2<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator *\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a scalar value)\n///\n/// \\return Memberwise multiplication by \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T> operator *(const Vector2<T>& left, T right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator *\n///\n/// \\param left  Left operand (a scalar value)\n/// \\param right Right operand (a vector)\n///\n/// \\return Memberwise multiplication by \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T> operator *(T left, const Vector2<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator *=\n///\n/// This operator performs a memberwise multiplication by \\a right,\n/// and assigns the result to \\a left.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a scalar value)\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T>& operator *=(Vector2<T>& left, T right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator /\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a scalar value)\n///\n/// \\return Memberwise division by \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T> operator /(const Vector2<T>& left, T right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator /=\n///\n/// This operator performs a memberwise division by \\a right,\n/// and assigns the result to \\a left.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a scalar value)\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector2<T>& operator /=(Vector2<T>& left, T right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator ==\n///\n/// This operator compares strict equality between two vectors.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return True if \\a left is equal to \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool operator ==(const Vector2<T>& left, const Vector2<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector2\n/// \\brief Overload of binary operator !=\n///\n/// This operator compares strict difference between two vectors.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return True if \\a left is not equal to \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool operator !=(const Vector2<T>& left, const Vector2<T>& right);\n\n#include <SFML/System/Vector2.inl>\n\n// Define the most common types\ntypedef Vector2<int>          Vector2i;\ntypedef Vector2<unsigned int> Vector2u;\ntypedef Vector2<float>        Vector2f;\n\n} // namespace sf\n\n\n#endif // SFML_VECTOR2_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Vector2\n/// \\ingroup system\n///\n/// sf::Vector2 is a simple class that defines a mathematical\n/// vector with two coordinates (x and y). It can be used to\n/// represent anything that has two dimensions: a size, a point,\n/// a velocity, etc.\n///\n/// The template parameter T is the type of the coordinates. It\n/// can be any type that supports arithmetic operations (+, -, /, *)\n/// and comparisons (==, !=), for example int or float.\n///\n/// You generally don't have to care about the templated form (sf::Vector2<T>),\n/// the most common specializations have special typedefs:\n/// \\li sf::Vector2<float> is sf::Vector2f\n/// \\li sf::Vector2<int> is sf::Vector2i\n/// \\li sf::Vector2<unsigned int> is sf::Vector2u\n///\n/// The sf::Vector2 class has a small and simple interface, its x and y members\n/// can be accessed directly (there are no accessors like setX(), getX()) and it\n/// contains no mathematical function like dot product, cross product, length, etc.\n///\n/// Usage example:\n/// \\code\n/// sf::Vector2f v1(16.5f, 24.f);\n/// v1.x = 18.2f;\n/// float y = v1.y;\n///\n/// sf::Vector2f v2 = v1 * 5.f;\n/// sf::Vector2f v3;\n/// v3 = v1 + v2;\n///\n/// bool different = (v2 != v3);\n/// \\endcode\n///\n/// Note: for 3-dimensional vectors, see sf::Vector3.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Vector2.inl",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T>::Vector2() :\nx(0),\ny(0)\n{\n\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T>::Vector2(T X, T Y) :\nx(X),\ny(Y)\n{\n\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ntemplate <typename U>\ninline Vector2<T>::Vector2(const Vector2<U>& vector) :\nx(static_cast<T>(vector.x)),\ny(static_cast<T>(vector.y))\n{\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T> operator -(const Vector2<T>& right)\n{\n    return Vector2<T>(-right.x, -right.y);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T>& operator +=(Vector2<T>& left, const Vector2<T>& right)\n{\n    left.x += right.x;\n    left.y += right.y;\n\n    return left;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T>& operator -=(Vector2<T>& left, const Vector2<T>& right)\n{\n    left.x -= right.x;\n    left.y -= right.y;\n\n    return left;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T> operator +(const Vector2<T>& left, const Vector2<T>& right)\n{\n    return Vector2<T>(left.x + right.x, left.y + right.y);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T> operator -(const Vector2<T>& left, const Vector2<T>& right)\n{\n    return Vector2<T>(left.x - right.x, left.y - right.y);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T> operator *(const Vector2<T>& left, T right)\n{\n    return Vector2<T>(left.x * right, left.y * right);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T> operator *(T left, const Vector2<T>& right)\n{\n    return Vector2<T>(right.x * left, right.y * left);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T>& operator *=(Vector2<T>& left, T right)\n{\n    left.x *= right;\n    left.y *= right;\n\n    return left;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T> operator /(const Vector2<T>& left, T right)\n{\n    return Vector2<T>(left.x / right, left.y / right);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector2<T>& operator /=(Vector2<T>& left, T right)\n{\n    left.x /= right;\n    left.y /= right;\n\n    return left;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline bool operator ==(const Vector2<T>& left, const Vector2<T>& right)\n{\n    return (left.x == right.x) && (left.y == right.y);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline bool operator !=(const Vector2<T>& left, const Vector2<T>& right)\n{\n    return (left.x != right.x) || (left.y != right.y);\n}\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Vector3.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_VECTOR3_HPP\n#define SFML_VECTOR3_HPP\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Utility template class for manipulating\n///        3-dimensional vectors\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nclass Vector3\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// Creates a Vector3(0, 0, 0).\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector3();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the vector from its coordinates\n    ///\n    /// \\param X X coordinate\n    /// \\param Y Y coordinate\n    /// \\param Z Z coordinate\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector3(T X, T Y, T Z);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the vector from another type of vector\n    ///\n    /// This constructor doesn't replace the copy constructor,\n    /// it's called only when U != T.\n    /// A call to this constructor will fail to compile if U\n    /// is not convertible to T.\n    ///\n    /// \\param vector Vector to convert\n    ///\n    ////////////////////////////////////////////////////////////\n    template <typename U>\n    explicit Vector3(const Vector3<U>& vector);\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    T x; //!< X coordinate of the vector\n    T y; //!< Y coordinate of the vector\n    T z; //!< Z coordinate of the vector\n};\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of unary operator -\n///\n/// \\param left Vector to negate\n///\n/// \\return Memberwise opposite of the vector\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T> operator -(const Vector3<T>& left);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator +=\n///\n/// This operator performs a memberwise addition of both vectors,\n/// and assigns the result to \\a left.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T>& operator +=(Vector3<T>& left, const Vector3<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator -=\n///\n/// This operator performs a memberwise subtraction of both vectors,\n/// and assigns the result to \\a left.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T>& operator -=(Vector3<T>& left, const Vector3<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator +\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return Memberwise addition of both vectors\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T> operator +(const Vector3<T>& left, const Vector3<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator -\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return Memberwise subtraction of both vectors\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T> operator -(const Vector3<T>& left, const Vector3<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator *\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a scalar value)\n///\n/// \\return Memberwise multiplication by \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T> operator *(const Vector3<T>& left, T right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator *\n///\n/// \\param left  Left operand (a scalar value)\n/// \\param right Right operand (a vector)\n///\n/// \\return Memberwise multiplication by \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T> operator *(T left, const Vector3<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator *=\n///\n/// This operator performs a memberwise multiplication by \\a right,\n/// and assigns the result to \\a left.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a scalar value)\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T>& operator *=(Vector3<T>& left, T right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator /\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a scalar value)\n///\n/// \\return Memberwise division by \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T> operator /(const Vector3<T>& left, T right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator /=\n///\n/// This operator performs a memberwise division by \\a right,\n/// and assigns the result to \\a left.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a scalar value)\n///\n/// \\return Reference to \\a left\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nVector3<T>& operator /=(Vector3<T>& left, T right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator ==\n///\n/// This operator compares strict equality between two vectors.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return True if \\a left is equal to \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool operator ==(const Vector3<T>& left, const Vector3<T>& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates Vector3\n/// \\brief Overload of binary operator !=\n///\n/// This operator compares strict difference between two vectors.\n///\n/// \\param left  Left operand (a vector)\n/// \\param right Right operand (a vector)\n///\n/// \\return True if \\a left is not equal to \\a right\n///\n////////////////////////////////////////////////////////////\ntemplate <typename T>\nbool operator !=(const Vector3<T>& left, const Vector3<T>& right);\n\n#include <SFML/System/Vector3.inl>\n\n// Define the most common types\ntypedef Vector3<int>   Vector3i;\ntypedef Vector3<float> Vector3f;\n\n} // namespace sf\n\n\n#endif // SFML_VECTOR3_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Vector3\n/// \\ingroup system\n///\n/// sf::Vector3 is a simple class that defines a mathematical\n/// vector with three coordinates (x, y and z). It can be used to\n/// represent anything that has three dimensions: a size, a point,\n/// a velocity, etc.\n///\n/// The template parameter T is the type of the coordinates. It\n/// can be any type that supports arithmetic operations (+, -, /, *)\n/// and comparisons (==, !=), for example int or float.\n///\n/// You generally don't have to care about the templated form (sf::Vector3<T>),\n/// the most common specializations have special typedefs:\n/// \\li sf::Vector3<float> is sf::Vector3f\n/// \\li sf::Vector3<int> is sf::Vector3i\n///\n/// The sf::Vector3 class has a small and simple interface, its x and y members\n/// can be accessed directly (there are no accessors like setX(), getX()) and it\n/// contains no mathematical function like dot product, cross product, length, etc.\n///\n/// Usage example:\n/// \\code\n/// sf::Vector3f v1(16.5f, 24.f, -8.2f);\n/// v1.x = 18.2f;\n/// float y = v1.y;\n/// float z = v1.z;\n///\n/// sf::Vector3f v2 = v1 * 5.f;\n/// sf::Vector3f v3;\n/// v3 = v1 + v2;\n///\n/// bool different = (v2 != v3);\n/// \\endcode\n///\n/// Note: for 2-dimensional vectors, see sf::Vector2.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System/Vector3.inl",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T>::Vector3() :\nx(0),\ny(0),\nz(0)\n{\n\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T>::Vector3(T X, T Y, T Z) :\nx(X),\ny(Y),\nz(Z)\n{\n\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ntemplate <typename U>\ninline Vector3<T>::Vector3(const Vector3<U>& vector) :\nx(static_cast<T>(vector.x)),\ny(static_cast<T>(vector.y)),\nz(static_cast<T>(vector.z))\n{\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T> operator -(const Vector3<T>& left)\n{\n    return Vector3<T>(-left.x, -left.y, -left.z);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T>& operator +=(Vector3<T>& left, const Vector3<T>& right)\n{\n    left.x += right.x;\n    left.y += right.y;\n    left.z += right.z;\n\n    return left;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T>& operator -=(Vector3<T>& left, const Vector3<T>& right)\n{\n    left.x -= right.x;\n    left.y -= right.y;\n    left.z -= right.z;\n\n    return left;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T> operator +(const Vector3<T>& left, const Vector3<T>& right)\n{\n    return Vector3<T>(left.x + right.x, left.y + right.y, left.z + right.z);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T> operator -(const Vector3<T>& left, const Vector3<T>& right)\n{\n    return Vector3<T>(left.x - right.x, left.y - right.y, left.z - right.z);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T> operator *(const Vector3<T>& left, T right)\n{\n    return Vector3<T>(left.x * right, left.y * right, left.z * right);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T> operator *(T left, const Vector3<T>& right)\n{\n    return Vector3<T>(right.x * left, right.y * left, right.z * left);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T>& operator *=(Vector3<T>& left, T right)\n{\n    left.x *= right;\n    left.y *= right;\n    left.z *= right;\n\n    return left;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T> operator /(const Vector3<T>& left, T right)\n{\n    return Vector3<T>(left.x / right, left.y / right, left.z / right);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline Vector3<T>& operator /=(Vector3<T>& left, T right)\n{\n    left.x /= right;\n    left.y /= right;\n    left.z /= right;\n\n    return left;\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline bool operator ==(const Vector3<T>& left, const Vector3<T>& right)\n{\n    return (left.x == right.x) && (left.y == right.y) && (left.z == right.z);\n}\n\n\n////////////////////////////////////////////////////////////\ntemplate <typename T>\ninline bool operator !=(const Vector3<T>& left, const Vector3<T>& right)\n{\n    return (left.x != right.x) || (left.y != right.y) || (left.z != right.z);\n}\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/System.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SYSTEM_HPP\n#define SFML_SYSTEM_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n\n#include <SFML/Config.hpp>\n#include <SFML/System/Clock.hpp>\n#include <SFML/System/Err.hpp>\n#include <SFML/System/FileInputStream.hpp>\n#include <SFML/System/InputStream.hpp>\n#include <SFML/System/Lock.hpp>\n#include <SFML/System/MemoryInputStream.hpp>\n#include <SFML/System/Mutex.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <SFML/System/Sleep.hpp>\n#include <SFML/System/String.hpp>\n#include <SFML/System/Thread.hpp>\n#include <SFML/System/ThreadLocal.hpp>\n#include <SFML/System/ThreadLocalPtr.hpp>\n#include <SFML/System/Time.hpp>\n#include <SFML/System/Utf.hpp>\n#include <SFML/System/Vector2.hpp>\n#include <SFML/System/Vector3.hpp>\n\n#endif // SFML_SYSTEM_HPP\n\n////////////////////////////////////////////////////////////\n/// \\defgroup system System module\n///\n/// Base module of SFML, defining various utilities. It provides\n/// vector classes, Unicode strings and conversion functions,\n/// threads and mutexes, timing classes.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Clipboard.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_CLIPBOARD_HPP\n#define SFML_CLIPBOARD_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <SFML/System/String.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Give access to the system clipboard\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Clipboard\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the content of the clipboard as string data\n    ///\n    /// This function returns the content of the clipboard\n    /// as a string. If the clipboard does not contain string\n    /// it returns an empty sf::String object.\n    ///\n    /// \\return Clipboard contents as sf::String object\n    ///\n    ////////////////////////////////////////////////////////////\n    static String getString();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the content of the clipboard as string data\n    ///\n    /// This function sets the content of the clipboard as a\n    /// string.\n    ///\n    /// \\warning Due to limitations on some operating systems,\n    ///          setting the clipboard contents is only\n    ///          guaranteed to work if there is currently an\n    ///          open window for which events are being handled.\n    ///\n    /// \\param text sf::String containing the data to be sent\n    /// to the clipboard\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setString(const String& text);\n};\n\n} // namespace sf\n\n\n#endif // SFML_CLIPBOARD_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Clipboard\n/// \\ingroup window\n///\n/// sf::Clipboard provides an interface for getting and\n/// setting the contents of the system clipboard.\n///\n/// It is important to note that due to limitations on some\n/// operating systems, setting the clipboard contents is\n/// only guaranteed to work if there is currently an open\n/// window for which events are being handled.\n///\n/// Usage example:\n/// \\code\n/// // get the clipboard content as a string\n/// sf::String string = sf::Clipboard::getString();\n///\n/// // or use it in the event loop\n/// sf::Event event;\n/// while(window.pollEvent(event))\n/// {\n///     if(event.type == sf::Event::Closed)\n///         window.close();\n///     if(event.type == sf::Event::KeyPressed)\n///     {\n///         // Using Ctrl + V to paste a string into SFML\n///         if(event.key.control && event.key.code == sf::Keyboard::V)\n///             string = sf::Clipboard::getString();\n///\n///         // Using Ctrl + C to copy a string out of SFML\n///         if(event.key.control && event.key.code == sf::Keyboard::C)\n///             sf::Clipboard::setString(\"Hello World!\");\n///     }\n/// }\n/// \\endcode\n///\n/// \\see sf::String, sf::Event\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Context.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_CONTEXT_HPP\n#define SFML_CONTEXT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <SFML/Window/GlResource.hpp>\n#include <SFML/Window/ContextSettings.hpp>\n#include <SFML/System/NonCopyable.hpp>\n\n\nnamespace sf\n{\nnamespace priv\n{\n    class GlContext;\n}\n\ntypedef void (*GlFunctionPointer)();\n\n////////////////////////////////////////////////////////////\n/// \\brief Class holding a valid drawing context\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Context : GlResource, NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// The constructor creates and activates the context\n    ///\n    ////////////////////////////////////////////////////////////\n    Context();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// The destructor deactivates and destroys the context\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Context();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Activate or deactivate explicitly the context\n    ///\n    /// \\param active True to activate, false to deactivate\n    ///\n    /// \\return True on success, false on failure\n    ///\n    ////////////////////////////////////////////////////////////\n    bool setActive(bool active);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the settings of the context\n    ///\n    /// Note that these settings may be different than the ones\n    /// passed to the constructor; they are indeed adjusted if the\n    /// original settings are not directly supported by the system.\n    ///\n    /// \\return Structure containing the settings\n    ///\n    ////////////////////////////////////////////////////////////\n    const ContextSettings& getSettings() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check whether a given OpenGL extension is available\n    ///\n    /// \\param name Name of the extension to check for\n    ///\n    /// \\return True if available, false if unavailable\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isExtensionAvailable(const char* name);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the address of an OpenGL function\n    ///\n    /// \\param name Name of the function to get the address of\n    ///\n    /// \\return Address of the OpenGL function, 0 on failure\n    ///\n    ////////////////////////////////////////////////////////////\n    static GlFunctionPointer getFunction(const char* name);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the currently active context\n    ///\n    /// This function will only return sf::Context objects.\n    /// Contexts created e.g. by RenderTargets or for internal\n    /// use will not be returned by this function.\n    ///\n    /// \\return The currently active context or NULL if none is active\n    ///\n    ////////////////////////////////////////////////////////////\n    static const Context* getActiveContext();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the currently active context's ID\n    ///\n    /// The context ID is used to identify contexts when\n    /// managing unshareable OpenGL resources.\n    ///\n    /// \\return The active context's ID or 0 if no context is currently active\n    ///\n    ////////////////////////////////////////////////////////////\n    static Uint64 getActiveContextId();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a in-memory context\n    ///\n    /// This constructor is for internal use, you don't need\n    /// to bother with it.\n    ///\n    /// \\param settings Creation parameters\n    /// \\param width    Back buffer width\n    /// \\param height   Back buffer height\n    ///\n    ////////////////////////////////////////////////////////////\n    Context(const ContextSettings& settings, unsigned int width, unsigned int height);\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    priv::GlContext* m_context; //!< Internal OpenGL context\n};\n\n} // namespace sf\n\n\n#endif // SFML_CONTEXT_HPP\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Context\n/// \\ingroup window\n///\n/// If you need to make OpenGL calls without having an\n/// active window (like in a thread), you can use an\n/// instance of this class to get a valid context.\n///\n/// Having a valid context is necessary for *every* OpenGL call.\n///\n/// Note that a context is only active in its current thread,\n/// if you create a new thread it will have no valid context\n/// by default.\n///\n/// To use a sf::Context instance, just construct it and let it\n/// live as long as you need a valid context. No explicit activation\n/// is needed, all it has to do is to exist. Its destructor\n/// will take care of deactivating and freeing all the attached\n/// resources.\n///\n/// Usage example:\n/// \\code\n/// void threadFunction(void*)\n/// {\n///    sf::Context context;\n///    // from now on, you have a valid context\n///\n///    // you can make OpenGL calls\n///    glClear(GL_DEPTH_BUFFER_BIT);\n/// }\n/// // the context is automatically deactivated and destroyed\n/// // by the sf::Context destructor\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/ContextSettings.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_CONTEXTSETTINGS_HPP\n#define SFML_CONTEXTSETTINGS_HPP\n\n#include <SFML/Config.hpp>\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Structure defining the settings of the OpenGL\n///        context attached to a window\n///\n////////////////////////////////////////////////////////////\nstruct ContextSettings\n{\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enumeration of the context attribute flags\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Attribute\n    {\n        Default = 0,      //!< Non-debug, compatibility context (this and the core attribute are mutually exclusive)\n        Core    = 1 << 0, //!< Core attribute\n        Debug   = 1 << 2  //!< Debug attribute\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// \\param depth        Depth buffer bits\n    /// \\param stencil      Stencil buffer bits\n    /// \\param antialiasing Antialiasing level\n    /// \\param major        Major number of the context version\n    /// \\param minor        Minor number of the context version\n    /// \\param attributes   Attribute flags of the context\n    /// \\param sRgb         sRGB capable framebuffer\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit ContextSettings(unsigned int depth = 0, unsigned int stencil = 0, unsigned int antialiasing = 0, unsigned int major = 1, unsigned int minor = 1, unsigned int attributes = Default, bool sRgb = false) :\n    depthBits        (depth),\n    stencilBits      (stencil),\n    antialiasingLevel(antialiasing),\n    majorVersion     (major),\n    minorVersion     (minor),\n    attributeFlags   (attributes),\n    sRgbCapable      (sRgb)\n    {\n    }\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    unsigned int depthBits;         //!< Bits of the depth buffer\n    unsigned int stencilBits;       //!< Bits of the stencil buffer\n    unsigned int antialiasingLevel; //!< Level of antialiasing\n    unsigned int majorVersion;      //!< Major number of the context version to create\n    unsigned int minorVersion;      //!< Minor number of the context version to create\n    Uint32       attributeFlags;    //!< The attribute flags to create the context with\n    bool         sRgbCapable;       //!< Whether the context framebuffer is sRGB capable\n};\n\n} // namespace sf\n\n\n#endif // SFML_CONTEXTSETTINGS_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::ContextSettings\n/// \\ingroup window\n///\n/// ContextSettings allows to define several advanced settings\n/// of the OpenGL context attached to a window. All these\n/// settings with the exception of the compatibility flag\n/// and anti-aliasing level have no impact on the regular\n/// SFML rendering (graphics module), so you may need to use\n/// this structure only if you're using SFML as a windowing\n/// system for custom OpenGL rendering.\n///\n/// The depthBits and stencilBits members define the number\n/// of bits per pixel requested for the (respectively) depth\n/// and stencil buffers.\n///\n/// antialiasingLevel represents the requested number of\n/// multisampling levels for anti-aliasing.\n///\n/// majorVersion and minorVersion define the version of the\n/// OpenGL context that you want. Only versions greater or\n/// equal to 3.0 are relevant; versions lesser than 3.0 are\n/// all handled the same way (i.e. you can use any version\n/// < 3.0 if you don't want an OpenGL 3 context).\n///\n/// When requesting a context with a version greater or equal\n/// to 3.2, you have the option of specifying whether the\n/// context should follow the core or compatibility profile\n/// of all newer (>= 3.2) OpenGL specifications. For versions\n/// 3.0 and 3.1 there is only the core profile. By default\n/// a compatibility context is created. You only need to specify\n/// the core flag if you want a core profile context to use with\n/// your own OpenGL rendering.\n/// <b>Warning: The graphics module will not function if you\n/// request a core profile context. Make sure the attributes are\n/// set to Default if you want to use the graphics module.</b>\n///\n/// Setting the debug attribute flag will request a context with\n/// additional debugging features enabled. Depending on the\n/// system, this might be required for advanced OpenGL debugging.\n/// OpenGL debugging is disabled by default.\n///\n/// <b>Special Note for OS X:</b>\n/// Apple only supports choosing between either a legacy context\n/// (OpenGL 2.1) or a core context (OpenGL version depends on the\n/// operating system version but is at least 3.2). Compatibility\n/// contexts are not supported. Further information is available on the\n/// <a href=\"https://developer.apple.com/opengl/capabilities/index.html\">\n/// OpenGL Capabilities Tables</a> page. OS X also currently does\n/// not support debug contexts.\n///\n/// Please note that these values are only a hint.\n/// No failure will be reported if one or more of these values\n/// are not supported by the system; instead, SFML will try to\n/// find the closest valid match. You can then retrieve the\n/// settings that the window actually used to create its context,\n/// with Window::getSettings().\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Cursor.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_CURSOR_HPP\n#define SFML_CURSOR_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <SFML/System/Vector2.hpp>\n\nnamespace sf\n{\nnamespace priv\n{\n    class CursorImpl;\n}\n\n////////////////////////////////////////////////////////////\n/// \\brief Cursor defines the appearance of a system cursor\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Cursor : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enumeration of the native system cursor types\n    ///\n    /// Refer to the following table to determine which cursor\n    /// is available on which platform.\n    ///\n    ///  Type                               | Linux | Mac OS X | Windows  |\n    /// ------------------------------------|:-----:|:--------:|:--------:|\n    ///  sf::Cursor::Arrow                  |  yes  |    yes   |   yes    |\n    ///  sf::Cursor::ArrowWait              |  no   |    no    |   yes    |\n    ///  sf::Cursor::Wait                   |  yes  |    no    |   yes    |\n    ///  sf::Cursor::Text                   |  yes  |    yes   |   yes    |\n    ///  sf::Cursor::Hand                   |  yes  |    yes   |   yes    |\n    ///  sf::Cursor::SizeHorizontal         |  yes  |    yes   |   yes    |\n    ///  sf::Cursor::SizeVertical           |  yes  |    yes   |   yes    |\n    ///  sf::Cursor::SizeTopLeftBottomRight |  no   |    yes*  |   yes    |\n    ///  sf::Cursor::SizeBottomLeftTopRight |  no   |    yes*  |   yes    |\n    ///  sf::Cursor::SizeLeft               |  yes  |    yes** |   yes**  |\n    ///  sf::Cursor::SizeRight              |  yes  |    yes** |   yes**  |\n    ///  sf::Cursor::SizeTop                |  yes  |    yes** |   yes**  |\n    ///  sf::Cursor::SizeBottom             |  yes  |    yes** |   yes**  |\n    ///  sf::Cursor::SizeTopLeft            |  yes  |    yes** |   yes**  |\n    ///  sf::Cursor::SizeTopRight           |  yes  |    yes** |   yes**  |\n    ///  sf::Cursor::SizeBottomLeft         |  yes  |    yes** |   yes**  |\n    ///  sf::Cursor::SizeBottomRight        |  yes  |    yes** |   yes**  |\n    ///  sf::Cursor::SizeAll                |  yes  |    no    |   yes    |\n    ///  sf::Cursor::Cross                  |  yes  |    yes   |   yes    |\n    ///  sf::Cursor::Help                   |  yes  |    yes*  |   yes    |\n    ///  sf::Cursor::NotAllowed             |  yes  |    yes   |   yes    |\n    ///\n    ///  * These cursor types are undocumented so may not\n    ///    be available on all versions, but have been tested on 10.13\n    ///\n    ///  ** On Windows and macOS, double-headed arrows are used\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Type\n    {\n        Arrow,                  //!< Arrow cursor (default)\n        ArrowWait,              //!< Busy arrow cursor\n        Wait,                   //!< Busy cursor\n        Text,                   //!< I-beam, cursor when hovering over a field allowing text entry\n        Hand,                   //!< Pointing hand cursor\n        SizeHorizontal,         //!< Horizontal double arrow cursor\n        SizeVertical,           //!< Vertical double arrow cursor\n        SizeTopLeftBottomRight, //!< Double arrow cursor going from top-left to bottom-right\n        SizeBottomLeftTopRight, //!< Double arrow cursor going from bottom-left to top-right\n        SizeLeft,               //!< Left arrow cursor on Linux, same as SizeHorizontal on other platforms\n        SizeRight,              //!< Right arrow cursor on Linux, same as SizeHorizontal on other platforms\n        SizeTop,                //!< Up arrow cursor on Linux, same as SizeVertical on other platforms\n        SizeBottom,             //!< Down arrow cursor on Linux, same as SizeVertical on other platforms\n        SizeTopLeft,            //!< Top-left arrow cursor on Linux, same as SizeTopLeftBottomRight on other platforms\n        SizeBottomRight,        //!< Bottom-right arrow cursor on Linux, same as SizeTopLeftBottomRight on other platforms\n        SizeBottomLeft,         //!< Bottom-left arrow cursor on Linux, same as SizeBottomLeftTopRight on other platforms\n        SizeTopRight,           //!< Top-right arrow cursor on Linux, same as SizeBottomLeftTopRight on other platforms\n        SizeAll,                //!< Combination of SizeHorizontal and SizeVertical\n        Cross,                  //!< Crosshair cursor\n        Help,                   //!< Help cursor\n        NotAllowed              //!< Action not allowed cursor\n    };\n\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor doesn't actually create the cursor;\n    /// initially the new instance is invalid and must not be\n    /// used until either loadFromPixels() or loadFromSystem()\n    /// is called and successfully created a cursor.\n    ///\n    ////////////////////////////////////////////////////////////\n    Cursor();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// This destructor releases the system resources\n    /// associated with this cursor, if any.\n    ///\n    ////////////////////////////////////////////////////////////\n    ~Cursor();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create a cursor with the provided image\n    ///\n    /// \\a pixels must be an array of \\a width by \\a height pixels\n    /// in 32-bit RGBA format. If not, this will cause undefined behavior.\n    ///\n    /// If \\a pixels is null or either \\a width or \\a height are 0,\n    /// the current cursor is left unchanged and the function will\n    /// return false.\n    ///\n    /// In addition to specifying the pixel data, you can also\n    /// specify the location of the hotspot of the cursor. The\n    /// hotspot is the pixel coordinate within the cursor image\n    /// which will be located exactly where the mouse pointer\n    /// position is. Any mouse actions that are performed will\n    /// return the window/screen location of the hotspot.\n    ///\n    /// \\warning On Unix platforms which do not support colored\n    ///          cursors, the pixels are mapped into a monochrome\n    ///          bitmap: pixels with an alpha channel to 0 are\n    ///          transparent, black if the RGB channel are close\n    ///          to zero, and white otherwise.\n    ///\n    /// \\param pixels   Array of pixels of the image\n    /// \\param size     Width and height of the image\n    /// \\param hotspot  (x,y) location of the hotspot\n    /// \\return true if the cursor was successfully loaded;\n    ///         false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create a native system cursor\n    ///\n    /// Refer to the list of cursor available on each system\n    /// (see sf::Cursor::Type) to know whether a given cursor is\n    /// expected to load successfully or is not supported by\n    /// the operating system.\n    ///\n    /// \\param type Native system cursor type\n    /// \\return true if and only if the corresponding cursor is\n    ///         natively supported by the operating system;\n    ///         false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    bool loadFromSystem(Type type);\n\nprivate:\n\n    friend class WindowBase;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get access to the underlying implementation\n    ///\n    /// This is primarily designed for sf::Window::setMouseCursor,\n    /// hence the friendship.\n    ///\n    /// \\return a reference to the OS-specific implementation\n    ///\n    ////////////////////////////////////////////////////////////\n    const priv::CursorImpl& getImpl() const;\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    priv::CursorImpl* m_impl; //!< Platform-specific implementation of the cursor\n};\n\n} // namespace sf\n\n\n#endif // SFML_CURSOR_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Cursor\n/// \\ingroup window\n///\n/// \\warning Features related to Cursor are not supported on\n///          iOS and Android.\n///\n/// This class abstracts the operating system resources\n/// associated with either a native system cursor or a custom\n/// cursor.\n///\n/// After loading the cursor the graphical appearance\n/// with either loadFromPixels() or loadFromSystem(), the\n/// cursor can be changed with sf::Window::setMouseCursor().\n///\n/// The behaviour is undefined if the cursor is destroyed while\n/// in use by the window.\n///\n/// Usage example:\n/// \\code\n/// sf::Window window;\n///\n/// // ... create window as usual ...\n///\n/// sf::Cursor cursor;\n/// if (cursor.loadFromSystem(sf::Cursor::Hand))\n///     window.setMouseCursor(cursor);\n/// \\endcode\n///\n/// \\see sf::Window::setMouseCursor\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Event.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_EVENT_HPP\n#define SFML_EVENT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n#include <SFML/Window/Joystick.hpp>\n#include <SFML/Window/Keyboard.hpp>\n#include <SFML/Window/Mouse.hpp>\n#include <SFML/Window/Sensor.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Defines a system event and its parameters\n///\n////////////////////////////////////////////////////////////\nclass Event\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Size events parameters (Resized)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct SizeEvent\n    {\n        unsigned int width;  //!< New width, in pixels\n        unsigned int height; //!< New height, in pixels\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Keyboard event parameters (KeyPressed, KeyReleased)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct KeyEvent\n    {\n        Keyboard::Key code;          //!< Code of the key that has been pressed\n        Keyboard::Scancode scancode; //!< Physical code of the key that has been pressed\n        bool          alt;           //!< Is the Alt key pressed?\n        bool          control;       //!< Is the Control key pressed?\n        bool          shift;         //!< Is the Shift key pressed?\n        bool          system;        //!< Is the System key pressed?\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Text event parameters (TextEntered)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct TextEvent\n    {\n        Uint32 unicode; //!< UTF-32 Unicode value of the character\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Mouse move event parameters (MouseMoved)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct MouseMoveEvent\n    {\n        int x; //!< X position of the mouse pointer, relative to the left of the owner window\n        int y; //!< Y position of the mouse pointer, relative to the top of the owner window\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Mouse buttons events parameters\n    ///        (MouseButtonPressed, MouseButtonReleased)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct MouseButtonEvent\n    {\n        Mouse::Button button; //!< Code of the button that has been pressed\n        int           x;      //!< X position of the mouse pointer, relative to the left of the owner window\n        int           y;      //!< Y position of the mouse pointer, relative to the top of the owner window\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Mouse wheel events parameters (MouseWheelMoved)\n    ///\n    /// \\deprecated This event is deprecated and potentially inaccurate.\n    ///             Use MouseWheelScrollEvent instead.\n    ///\n    ////////////////////////////////////////////////////////////\n    struct MouseWheelEvent\n    {\n        int delta; //!< Number of ticks the wheel has moved (positive is up, negative is down)\n        int x;     //!< X position of the mouse pointer, relative to the left of the owner window\n        int y;     //!< Y position of the mouse pointer, relative to the top of the owner window\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Mouse wheel events parameters (MouseWheelScrolled)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct MouseWheelScrollEvent\n    {\n        Mouse::Wheel wheel; //!< Which wheel (for mice with multiple ones)\n        float        delta; //!< Wheel offset (positive is up/left, negative is down/right). High-precision mice may use non-integral offsets.\n        int          x;     //!< X position of the mouse pointer, relative to the left of the owner window\n        int          y;     //!< Y position of the mouse pointer, relative to the top of the owner window\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Joystick connection events parameters\n    ///        (JoystickConnected, JoystickDisconnected)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct JoystickConnectEvent\n    {\n        unsigned int joystickId; //!< Index of the joystick (in range [0 .. Joystick::Count - 1])\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Joystick axis move event parameters (JoystickMoved)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct JoystickMoveEvent\n    {\n        unsigned int   joystickId; //!< Index of the joystick (in range [0 .. Joystick::Count - 1])\n        Joystick::Axis axis;       //!< Axis on which the joystick moved\n        float          position;   //!< New position on the axis (in range [-100 .. 100])\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Joystick buttons events parameters\n    ///        (JoystickButtonPressed, JoystickButtonReleased)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct JoystickButtonEvent\n    {\n        unsigned int joystickId; //!< Index of the joystick (in range [0 .. Joystick::Count - 1])\n        unsigned int button;     //!< Index of the button that has been pressed (in range [0 .. Joystick::ButtonCount - 1])\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Touch events parameters (TouchBegan, TouchMoved, TouchEnded)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct TouchEvent\n    {\n        unsigned int finger; //!< Index of the finger in case of multi-touch events\n        int x;               //!< X position of the touch, relative to the left of the owner window\n        int y;               //!< Y position of the touch, relative to the top of the owner window\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Sensor event parameters (SensorChanged)\n    ///\n    ////////////////////////////////////////////////////////////\n    struct SensorEvent\n    {\n        Sensor::Type type; //!< Type of the sensor\n        float x;           //!< Current value of the sensor on X axis\n        float y;           //!< Current value of the sensor on Y axis\n        float z;           //!< Current value of the sensor on Z axis\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enumeration of the different types of events\n    ///\n    ////////////////////////////////////////////////////////////\n    enum EventType\n    {\n        Closed,                 //!< The window requested to be closed (no data)\n        Resized,                //!< The window was resized (data in event.size)\n        LostFocus,              //!< The window lost the focus (no data)\n        GainedFocus,            //!< The window gained the focus (no data)\n        TextEntered,            //!< A character was entered (data in event.text)\n        KeyPressed,             //!< A key was pressed (data in event.key)\n        KeyReleased,            //!< A key was released (data in event.key)\n        MouseWheelMoved,        //!< The mouse wheel was scrolled (data in event.mouseWheel) (deprecated)\n        MouseWheelScrolled,     //!< The mouse wheel was scrolled (data in event.mouseWheelScroll)\n        MouseButtonPressed,     //!< A mouse button was pressed (data in event.mouseButton)\n        MouseButtonReleased,    //!< A mouse button was released (data in event.mouseButton)\n        MouseMoved,             //!< The mouse cursor moved (data in event.mouseMove)\n        MouseEntered,           //!< The mouse cursor entered the area of the window (no data)\n        MouseLeft,              //!< The mouse cursor left the area of the window (no data)\n        JoystickButtonPressed,  //!< A joystick button was pressed (data in event.joystickButton)\n        JoystickButtonReleased, //!< A joystick button was released (data in event.joystickButton)\n        JoystickMoved,          //!< The joystick moved along an axis (data in event.joystickMove)\n        JoystickConnected,      //!< A joystick was connected (data in event.joystickConnect)\n        JoystickDisconnected,   //!< A joystick was disconnected (data in event.joystickConnect)\n        TouchBegan,             //!< A touch event began (data in event.touch)\n        TouchMoved,             //!< A touch moved (data in event.touch)\n        TouchEnded,             //!< A touch event ended (data in event.touch)\n        SensorChanged,          //!< A sensor value changed (data in event.sensor)\n\n        Count                   //!< Keep last -- the total number of event types\n    };\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    EventType type; //!< Type of the event\n\n    union\n    {\n        SizeEvent             size;              //!< Size event parameters (Event::Resized)\n        KeyEvent              key;               //!< Key event parameters (Event::KeyPressed, Event::KeyReleased)\n        TextEvent             text;              //!< Text event parameters (Event::TextEntered)\n        MouseMoveEvent        mouseMove;         //!< Mouse move event parameters (Event::MouseMoved)\n        MouseButtonEvent      mouseButton;       //!< Mouse button event parameters (Event::MouseButtonPressed, Event::MouseButtonReleased)\n        MouseWheelEvent       mouseWheel;        //!< Mouse wheel event parameters (Event::MouseWheelMoved) (deprecated)\n        MouseWheelScrollEvent mouseWheelScroll;  //!< Mouse wheel event parameters (Event::MouseWheelScrolled)\n        JoystickMoveEvent     joystickMove;      //!< Joystick move event parameters (Event::JoystickMoved)\n        JoystickButtonEvent   joystickButton;    //!< Joystick button event parameters (Event::JoystickButtonPressed, Event::JoystickButtonReleased)\n        JoystickConnectEvent  joystickConnect;   //!< Joystick (dis)connect event parameters (Event::JoystickConnected, Event::JoystickDisconnected)\n        TouchEvent            touch;             //!< Touch events parameters (Event::TouchBegan, Event::TouchMoved, Event::TouchEnded)\n        SensorEvent           sensor;            //!< Sensor event parameters (Event::SensorChanged)\n    };\n};\n\n} // namespace sf\n\n\n#endif // SFML_EVENT_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Event\n/// \\ingroup window\n///\n/// sf::Event holds all the informations about a system event\n/// that just happened. Events are retrieved using the\n/// sf::Window::pollEvent and sf::Window::waitEvent functions.\n///\n/// A sf::Event instance contains the type of the event\n/// (mouse moved, key pressed, window closed, ...) as well\n/// as the details about this particular event. Please note that\n/// the event parameters are defined in a union, which means that\n/// only the member matching the type of the event will be properly\n/// filled; all other members will have undefined values and must not\n/// be read if the type of the event doesn't match. For example,\n/// if you received a KeyPressed event, then you must read the\n/// event.key member, all other members such as event.mouseMove\n/// or event.text will have undefined values.\n///\n/// Usage example:\n/// \\code\n/// sf::Event event;\n/// while (window.pollEvent(event))\n/// {\n///     // Request for closing the window\n///     if (event.type == sf::Event::Closed)\n///         window.close();\n///\n///     // The escape key was pressed\n///     if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))\n///         window.close();\n///\n///     // The window was resized\n///     if (event.type == sf::Event::Resized)\n///         doSomethingWithTheNewSize(event.size.width, event.size.height);\n///\n///     // etc ...\n/// }\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Export.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_WINDOW_EXPORT_HPP\n#define SFML_WINDOW_EXPORT_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n\n////////////////////////////////////////////////////////////\n// Define portable import / export macros\n////////////////////////////////////////////////////////////\n#if defined(SFML_WINDOW_EXPORTS)\n\n    #define SFML_WINDOW_API SFML_API_EXPORT\n\n#else\n\n    #define SFML_WINDOW_API SFML_API_IMPORT\n\n#endif\n\n\n#endif // SFML_WINDOW_EXPORT_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/GlResource.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_GLRESOURCE_HPP\n#define SFML_GLRESOURCE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <SFML/System/NonCopyable.hpp>\n\n\nnamespace sf\n{\n\nclass Context;\n\ntypedef void(*ContextDestroyCallback)(void*);\n\n////////////////////////////////////////////////////////////\n/// \\brief Base class for classes that require an OpenGL context\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API GlResource\n{\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    ////////////////////////////////////////////////////////////\n    GlResource();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    ////////////////////////////////////////////////////////////\n    ~GlResource();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Register a function to be called when a context is destroyed\n    ///\n    /// This is used for internal purposes in order to properly\n    /// clean up OpenGL resources that cannot be shared between\n    /// contexts.\n    ///\n    /// \\param callback Function to be called when a context is destroyed\n    /// \\param arg      Argument to pass when calling the function\n    ///\n    ////////////////////////////////////////////////////////////\n    static void registerContextDestroyCallback(ContextDestroyCallback callback, void* arg);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief RAII helper class to temporarily lock an available context for use\n    ///\n    ////////////////////////////////////////////////////////////\n    class SFML_WINDOW_API TransientContextLock : NonCopyable\n    {\n    public:\n        ////////////////////////////////////////////////////////////\n        /// \\brief Default constructor\n        ///\n        ////////////////////////////////////////////////////////////\n        TransientContextLock();\n\n        ////////////////////////////////////////////////////////////\n        /// \\brief Destructor\n        ///\n        ////////////////////////////////////////////////////////////\n        ~TransientContextLock();\n    };\n};\n\n} // namespace sf\n\n\n#endif // SFML_GLRESOURCE_HPP\n\n////////////////////////////////////////////////////////////\n/// \\class sf::GlResource\n/// \\ingroup window\n///\n/// This class is for internal use only, it must be the base\n/// of every class that requires a valid OpenGL context in\n/// order to work.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Joystick.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_JOYSTICK_HPP\n#define SFML_JOYSTICK_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <SFML/System/String.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Give access to the real-time state of the joysticks\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Joystick\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Constants related to joysticks capabilities\n    ///\n    ////////////////////////////////////////////////////////////\n    enum\n    {\n        Count       = 8,  //!< Maximum number of supported joysticks\n        ButtonCount = 32, //!< Maximum number of supported buttons\n        AxisCount   = 8   //!< Maximum number of supported axes\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Axes supported by SFML joysticks\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Axis\n    {\n        X,    //!< The X axis\n        Y,    //!< The Y axis\n        Z,    //!< The Z axis\n        R,    //!< The R axis\n        U,    //!< The U axis\n        V,    //!< The V axis\n        PovX, //!< The X axis of the point-of-view hat\n        PovY  //!< The Y axis of the point-of-view hat\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Structure holding a joystick's identification\n    ///\n    ////////////////////////////////////////////////////////////\n    struct SFML_WINDOW_API Identification\n    {\n        Identification();\n\n        String       name;      //!< Name of the joystick\n        unsigned int vendorId;  //!< Manufacturer identifier\n        unsigned int productId; //!< Product identifier\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a joystick is connected\n    ///\n    /// \\param joystick Index of the joystick to check\n    ///\n    /// \\return True if the joystick is connected, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isConnected(unsigned int joystick);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Return the number of buttons supported by a joystick\n    ///\n    /// If the joystick is not connected, this function returns 0.\n    ///\n    /// \\param joystick Index of the joystick\n    ///\n    /// \\return Number of buttons supported by the joystick\n    ///\n    ////////////////////////////////////////////////////////////\n    static unsigned int getButtonCount(unsigned int joystick);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a joystick supports a given axis\n    ///\n    /// If the joystick is not connected, this function returns false.\n    ///\n    /// \\param joystick Index of the joystick\n    /// \\param axis     Axis to check\n    ///\n    /// \\return True if the joystick supports the axis, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool hasAxis(unsigned int joystick, Axis axis);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a joystick button is pressed\n    ///\n    /// If the joystick is not connected, this function returns false.\n    ///\n    /// \\param joystick Index of the joystick\n    /// \\param button   Button to check\n    ///\n    /// \\return True if the button is pressed, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isButtonPressed(unsigned int joystick, unsigned int button);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current position of a joystick axis\n    ///\n    /// If the joystick is not connected, this function returns 0.\n    ///\n    /// \\param joystick Index of the joystick\n    /// \\param axis     Axis to check\n    ///\n    /// \\return Current position of the axis, in range [-100 .. 100]\n    ///\n    ////////////////////////////////////////////////////////////\n    static float getAxisPosition(unsigned int joystick, Axis axis);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the joystick information\n    ///\n    /// \\param joystick Index of the joystick\n    ///\n    /// \\return Structure containing joystick information.\n    ///\n    ////////////////////////////////////////////////////////////\n    static Identification getIdentification(unsigned int joystick);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Update the states of all joysticks\n    ///\n    /// This function is used internally by SFML, so you normally\n    /// don't have to call it explicitly. However, you may need to\n    /// call it if you have no window yet (or no window at all):\n    /// in this case the joystick states are not updated automatically.\n    ///\n    ////////////////////////////////////////////////////////////\n    static void update();\n};\n\n} // namespace sf\n\n\n#endif // SFML_JOYSTICK_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Joystick\n/// \\ingroup window\n///\n/// sf::Joystick provides an interface to the state of the\n/// joysticks. It only contains static functions, so it's not\n/// meant to be instantiated. Instead, each joystick is identified\n/// by an index that is passed to the functions of this class.\n///\n/// This class allows users to query the state of joysticks at any\n/// time and directly, without having to deal with a window and\n/// its events. Compared to the JoystickMoved, JoystickButtonPressed\n/// and JoystickButtonReleased events, sf::Joystick can retrieve the\n/// state of axes and buttons of joysticks at any time\n/// (you don't need to store and update a boolean on your side\n/// in order to know if a button is pressed or released), and you\n/// always get the real state of joysticks, even if they are\n/// moved, pressed or released when your window is out of focus\n/// and no event is triggered.\n///\n/// SFML supports:\n/// \\li 8 joysticks (sf::Joystick::Count)\n/// \\li 32 buttons per joystick (sf::Joystick::ButtonCount)\n/// \\li 8 axes per joystick (sf::Joystick::AxisCount)\n///\n/// Unlike the keyboard or mouse, the state of joysticks is sometimes\n/// not directly available (depending on the OS), therefore an update()\n/// function must be called in order to update the current state of\n/// joysticks. When you have a window with event handling, this is done\n/// automatically, you don't need to call anything. But if you have no\n/// window, or if you want to check joysticks state before creating one,\n/// you must call sf::Joystick::update explicitly.\n///\n/// Usage example:\n/// \\code\n/// // Is joystick #0 connected?\n/// bool connected = sf::Joystick::isConnected(0);\n///\n/// // How many buttons does joystick #0 support?\n/// unsigned int buttons = sf::Joystick::getButtonCount(0);\n///\n/// // Does joystick #0 define a X axis?\n/// bool hasX = sf::Joystick::hasAxis(0, sf::Joystick::X);\n///\n/// // Is button #2 pressed on joystick #0?\n/// bool pressed = sf::Joystick::isButtonPressed(0, 2);\n///\n/// // What's the current position of the Y axis on joystick #0?\n/// float position = sf::Joystick::getAxisPosition(0, sf::Joystick::Y);\n/// \\endcode\n///\n/// \\see sf::Keyboard, sf::Mouse\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Keyboard.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_KEYBOARD_HPP\n#define SFML_KEYBOARD_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n\n\nnamespace sf\n{\nclass String;\n\n////////////////////////////////////////////////////////////\n/// \\brief Give access to the real-time state of the keyboard\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Keyboard\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Key codes\n    ///\n    /// The enumerators refer to the \"localized\" key; i.e. depending\n    /// on the layout set by the operating system, a key can be mapped\n    /// to `Y` or `Z`.\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Key\n    {\n        Unknown = -1, //!< Unhandled key\n        A = 0,        //!< The A key\n        B,            //!< The B key\n        C,            //!< The C key\n        D,            //!< The D key\n        E,            //!< The E key\n        F,            //!< The F key\n        G,            //!< The G key\n        H,            //!< The H key\n        I,            //!< The I key\n        J,            //!< The J key\n        K,            //!< The K key\n        L,            //!< The L key\n        M,            //!< The M key\n        N,            //!< The N key\n        O,            //!< The O key\n        P,            //!< The P key\n        Q,            //!< The Q key\n        R,            //!< The R key\n        S,            //!< The S key\n        T,            //!< The T key\n        U,            //!< The U key\n        V,            //!< The V key\n        W,            //!< The W key\n        X,            //!< The X key\n        Y,            //!< The Y key\n        Z,            //!< The Z key\n        Num0,         //!< The 0 key\n        Num1,         //!< The 1 key\n        Num2,         //!< The 2 key\n        Num3,         //!< The 3 key\n        Num4,         //!< The 4 key\n        Num5,         //!< The 5 key\n        Num6,         //!< The 6 key\n        Num7,         //!< The 7 key\n        Num8,         //!< The 8 key\n        Num9,         //!< The 9 key\n        Escape,       //!< The Escape key\n        LControl,     //!< The left Control key\n        LShift,       //!< The left Shift key\n        LAlt,         //!< The left Alt key\n        LSystem,      //!< The left OS specific key: window (Windows and Linux), apple (macOS), ...\n        RControl,     //!< The right Control key\n        RShift,       //!< The right Shift key\n        RAlt,         //!< The right Alt key\n        RSystem,      //!< The right OS specific key: window (Windows and Linux), apple (macOS), ...\n        Menu,         //!< The Menu key\n        LBracket,     //!< The [ key\n        RBracket,     //!< The ] key\n        Semicolon,    //!< The ; key\n        Comma,        //!< The , key\n        Period,       //!< The . key\n        Apostrophe,   //!< The ' key\n        Slash,        //!< The / key\n        Backslash,    //!< The \\ key\n        Grave,        //!< The ` key\n        Equal,        //!< The = key\n        Hyphen,       //!< The - key (hyphen)\n        Space,        //!< The Space key\n        Enter,        //!< The Enter/Return keys\n        Backspace,    //!< The Backspace key\n        Tab,          //!< The Tabulation key\n        PageUp,       //!< The Page up key\n        PageDown,     //!< The Page down key\n        End,          //!< The End key\n        Home,         //!< The Home key\n        Insert,       //!< The Insert key\n        Delete,       //!< The Delete key\n        Add,          //!< The + key\n        Subtract,     //!< The - key (minus, usually from numpad)\n        Multiply,     //!< The * key\n        Divide,       //!< The / key\n        Left,         //!< Left arrow\n        Right,        //!< Right arrow\n        Up,           //!< Up arrow\n        Down,         //!< Down arrow\n        Numpad0,      //!< The numpad 0 key\n        Numpad1,      //!< The numpad 1 key\n        Numpad2,      //!< The numpad 2 key\n        Numpad3,      //!< The numpad 3 key\n        Numpad4,      //!< The numpad 4 key\n        Numpad5,      //!< The numpad 5 key\n        Numpad6,      //!< The numpad 6 key\n        Numpad7,      //!< The numpad 7 key\n        Numpad8,      //!< The numpad 8 key\n        Numpad9,      //!< The numpad 9 key\n        F1,           //!< The F1 key\n        F2,           //!< The F2 key\n        F3,           //!< The F3 key\n        F4,           //!< The F4 key\n        F5,           //!< The F5 key\n        F6,           //!< The F6 key\n        F7,           //!< The F7 key\n        F8,           //!< The F8 key\n        F9,           //!< The F9 key\n        F10,          //!< The F10 key\n        F11,          //!< The F11 key\n        F12,          //!< The F12 key\n        F13,          //!< The F13 key\n        F14,          //!< The F14 key\n        F15,          //!< The F15 key\n        Pause,        //!< The Pause key\n\n        KeyCount,     //!< Keep last -- the total number of keyboard keys\n\n        // Deprecated values:\n\n        Tilde     = Grave,     //!< \\deprecated Use Grave instead\n        Dash      = Hyphen,    //!< \\deprecated Use Hyphen instead\n        BackSpace = Backspace, //!< \\deprecated Use Backspace instead\n        BackSlash = Backslash, //!< \\deprecated Use Backslash instead\n        SemiColon = Semicolon, //!< \\deprecated Use Semicolon instead\n        Return    = Enter,     //!< \\deprecated Use Enter instead\n        Quote     = Apostrophe //!< \\deprecated Use Apostrophe instead\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Scancodes\n    ///\n    /// The enumerators are bound to a physical key and do not depend on\n    /// the keyboard layout used by the operating system. Usually, the AT-101\n    /// keyboard can be used as reference for the physical position of the keys.\n    ///\n    ////////////////////////////////////////////////////////////\n    struct Scan\n    {\n        // TODO: replace with enum class in SFML 3.\n        // Clang warns us rightfully that Scancode names shadow Key names.\n        // A safer solution would be to use a C++11 scoped enumeration (enum class),\n        // but it is not possible in SFML 2 which uses C++03.\n        // For now, we just ignore those warnings.\n        #if defined(__clang__)\n            #pragma clang diagnostic push\n            #pragma clang diagnostic ignored \"-Wshadow\"\n        #endif\n\n        enum Scancode\n        {\n            Unknown = -1,       //!< Represents any scancode not present in this enum\n            A = 0,              //!< Keyboard a and A key\n            B,                  //!< Keyboard b and B key\n            C,                  //!< Keyboard c and C key\n            D,                  //!< Keyboard d and D key\n            E,                  //!< Keyboard e and E key\n            F,                  //!< Keyboard f and F key\n            G,                  //!< Keyboard g and G key\n            H,                  //!< Keyboard h and H key\n            I,                  //!< Keyboard i and I key\n            J,                  //!< Keyboard j and J key\n            K,                  //!< Keyboard k and K key\n            L,                  //!< Keyboard l and L key\n            M,                  //!< Keyboard m and M key\n            N,                  //!< Keyboard n and N key\n            O,                  //!< Keyboard o and O key\n            P,                  //!< Keyboard p and P key\n            Q,                  //!< Keyboard q and Q key\n            R,                  //!< Keyboard r and R key\n            S,                  //!< Keyboard s and S key\n            T,                  //!< Keyboard t and T key\n            U,                  //!< Keyboard u and U key\n            V,                  //!< Keyboard v and V key\n            W,                  //!< Keyboard w and W key\n            X,                  //!< Keyboard x and X key\n            Y,                  //!< Keyboard y and Y key\n            Z,                  //!< Keyboard z and Z key\n            Num1,               //!< Keyboard 1 and ! key\n            Num2,               //!< Keyboard 2 and @ key\n            Num3,               //!< Keyboard 3 and # key\n            Num4,               //!< Keyboard 4 and $ key\n            Num5,               //!< Keyboard 5 and % key\n            Num6,               //!< Keyboard 6 and ^ key\n            Num7,               //!< Keyboard 7 and & key\n            Num8,               //!< Keyboard 8 and * key\n            Num9,               //!< Keyboard 9 and ) key\n            Num0,               //!< Keyboard 0 and ) key\n            Enter,              //!< Keyboard Enter/Return key\n            Escape,             //!< Keyboard Escape key\n            Backspace,          //!< Keyboard Backspace key\n            Tab,                //!< Keyboard Tab key\n            Space,              //!< Keyboard Space key\n            Hyphen,             //!< Keyboard - and _ key\n            Equal,              //!< Keyboard = and +\n            LBracket,           //!< Keyboard [ and { key\n            RBracket,           //!< Keyboard ] and } key\n            // For US keyboards mapped to key 29 (Microsoft Keyboard Scan Code Specification)\n            // For Non-US keyboards mapped to key 42 (Microsoft Keyboard Scan Code Specification)\n            // Typical language mappings: Belg:£µ` FrCa:<>} Dan:*' Dutch:`´ Fren:µ* Ger:'# Ital:§ù LatAm:[}` Nor:*@ Span:ç} Swed:*' Swiss:$£} UK:~# Brazil:}]\n            Backslash,          //!< Keyboard \\ and | key OR various keys for Non-US keyboards\n            Semicolon,          //!< Keyboard ; and : key\n            Apostrophe,         //!< Keyboard ' and \" key\n            Grave,              //!< Keyboard ` and ~ key\n            Comma,              //!< Keyboard , and < key\n            Period,             //!< Keyboard . and > key\n            Slash,              //!< Keyboard / and ? key\n            F1,                 //!< Keyboard F1 key\n            F2,                 //!< Keyboard F2 key\n            F3,                 //!< Keyboard F3 key\n            F4,                 //!< Keyboard F4 key\n            F5,                 //!< Keyboard F5 key\n            F6,                 //!< Keyboard F6 key\n            F7,                 //!< Keyboard F7 key\n            F8,                 //!< Keyboard F8 key\n            F9,                 //!< Keyboard F9 key\n            F10,                //!< Keyboard F10 key\n            F11,                //!< Keyboard F11 key\n            F12,                //!< Keyboard F12 key\n            F13,                //!< Keyboard F13 key\n            F14,                //!< Keyboard F14 key\n            F15,                //!< Keyboard F15 key\n            F16,                //!< Keyboard F16 key\n            F17,                //!< Keyboard F17 key\n            F18,                //!< Keyboard F18 key\n            F19,                //!< Keyboard F19 key\n            F20,                //!< Keyboard F20 key\n            F21,                //!< Keyboard F21 key\n            F22,                //!< Keyboard F22 key\n            F23,                //!< Keyboard F23 key\n            F24,                //!< Keyboard F24 key\n            CapsLock,           //!< Keyboard Caps %Lock key\n            PrintScreen,        //!< Keyboard Print Screen key\n            ScrollLock,         //!< Keyboard Scroll %Lock key\n            Pause,              //!< Keyboard Pause key\n            Insert,             //!< Keyboard Insert key\n            Home,               //!< Keyboard Home key\n            PageUp,             //!< Keyboard Page Up key\n            Delete,             //!< Keyboard Delete Forward key\n            End,                //!< Keyboard End key\n            PageDown,           //!< Keyboard Page Down key\n            Right,              //!< Keyboard Right Arrow key\n            Left,               //!< Keyboard Left Arrow key\n            Down,               //!< Keyboard Down Arrow key\n            Up,                 //!< Keyboard Up Arrow key\n            NumLock,            //!< Keypad Num %Lock and Clear key\n            NumpadDivide,       //!< Keypad / key\n            NumpadMultiply,     //!< Keypad * key\n            NumpadMinus,        //!< Keypad - key\n            NumpadPlus,         //!< Keypad + key\n            NumpadEqual,        //!< keypad = key\n            NumpadEnter,        //!< Keypad Enter/Return key\n            NumpadDecimal,      //!< Keypad . and Delete key\n            Numpad1,            //!< Keypad 1 and End key\n            Numpad2,            //!< Keypad 2 and Down Arrow key\n            Numpad3,            //!< Keypad 3 and Page Down key\n            Numpad4,            //!< Keypad 4 and Left Arrow key\n            Numpad5,            //!< Keypad 5 key\n            Numpad6,            //!< Keypad 6 and Right Arrow key\n            Numpad7,            //!< Keypad 7 and Home key\n            Numpad8,            //!< Keypad 8 and Up Arrow key\n            Numpad9,            //!< Keypad 9 and Page Up key\n            Numpad0,            //!< Keypad 0 and Insert key\n            // For US keyboards doesn't exist\n            // For Non-US keyboards mapped to key 45 (Microsoft Keyboard Scan Code Specification)\n            // Typical language mappings: Belg:<\\> FrCa:«°» Dan:<\\> Dutch:]|[ Fren:<> Ger:<|> Ital:<> LatAm:<> Nor:<> Span:<> Swed:<|> Swiss:<\\> UK:\\| Brazil: \\|.\n            NonUsBackslash,     //!< Keyboard Non-US \\ and | key\n            Application,        //!< Keyboard Application key\n            Execute,            //!< Keyboard Execute key\n            ModeChange,         //!< Keyboard Mode Change key\n            Help,               //!< Keyboard Help key\n            Menu,               //!< Keyboard Menu key\n            Select,             //!< Keyboard Select key\n            Redo,               //!< Keyboard Redo key\n            Undo,               //!< Keyboard Undo key\n            Cut,                //!< Keyboard Cut key\n            Copy,               //!< Keyboard Copy key\n            Paste,              //!< Keyboard Paste key\n            VolumeMute,         //!< Keyboard Volume Mute key\n            VolumeUp,           //!< Keyboard Volume Up key\n            VolumeDown,         //!< Keyboard Volume Down key\n            MediaPlayPause,     //!< Keyboard Media Play Pause key\n            MediaStop,          //!< Keyboard Media Stop key\n            MediaNextTrack,     //!< Keyboard Media Next Track key\n            MediaPreviousTrack, //!< Keyboard Media Previous Track key\n            LControl,           //!< Keyboard Left Control key\n            LShift,             //!< Keyboard Left Shift key\n            LAlt,               //!< Keyboard Left Alt key\n            LSystem,            //!< Keyboard Left System key\n            RControl,           //!< Keyboard Right Control key\n            RShift,             //!< Keyboard Right Shift key\n            RAlt,               //!< Keyboard Right Alt key\n            RSystem,            //!< Keyboard Right System key\n            Back,               //!< Keyboard Back key\n            Forward,            //!< Keyboard Forward key\n            Refresh,            //!< Keyboard Refresh key\n            Stop,               //!< Keyboard Stop key\n            Search,             //!< Keyboard Search key\n            Favorites,          //!< Keyboard Favorites key\n            HomePage,           //!< Keyboard Home Page key\n            LaunchApplication1, //!< Keyboard Launch Application 1 key\n            LaunchApplication2, //!< Keyboard Launch Application 2 key\n            LaunchMail,         //!< Keyboard Launch Mail key\n            LaunchMediaSelect,  //!< Keyboard Launch Media Select key\n\n            ScancodeCount       //!< Keep last -- the total number of scancodes\n        };\n\n        #if defined(__clang__)\n            #pragma clang diagnostic pop\n        #endif\n    };\n\n    typedef Scan::Scancode Scancode;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a key is pressed\n    ///\n    /// \\param key Key to check\n    ///\n    /// \\return True if the key is pressed, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isKeyPressed(Key key);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a key is pressed\n    ///\n    /// \\param code Scancode to check\n    ///\n    /// \\return True if the physical key is pressed, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isKeyPressed(Scancode code);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Localize a physical key to a logical one\n    ///\n    /// \\param code Scancode to localize\n    ///\n    /// \\return The key corresponding to the scancode under the current\n    ///         keyboard layout used by the operating system, or\n    ///         sf::Keyboard::Unknown when the scancode cannot be mapped\n    ///         to a Key.\n    ///\n    /// \\see delocalize\n    ///\n    ////////////////////////////////////////////////////////////\n    static Key localize(Scancode code);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Identify the physical key corresponding to a logical one\n    ///\n    /// \\param key Key to \"delocalize\"\n    ///\n    /// \\return The scancode corresponding to the key under the current\n    ///         keyboard layout used by the operating system, or\n    ///         sf::Keyboard::Scan::Unknown when the key cannot be mapped\n    ///         to a sf::Keyboard::Scancode.\n    ///\n    /// \\see localize\n    ///\n    ////////////////////////////////////////////////////////////\n    static Scancode delocalize(Key key);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Provide a string representation for a given scancode\n    ///\n    /// The returned string is a short, non-technical description of\n    /// the key represented with the given scancode. Most effectively\n    /// used in user interfaces, as the description for the key takes\n    /// the users keyboard layout into consideration.\n    ///\n    /// \\warning The result is OS-dependent: for example, sf::Keyboard::Scan::LSystem\n    ///          is \"Left Meta\" on Linux, \"Left Windows\" on Windows and\n    ///          \"Left Command\" on macOS.\n    ///\n    /// The current keyboard layout set by the operating system is used to\n    /// interpret the scancode: for example, sf::Keyboard::Semicolon is\n    /// mapped to \";\" for layout and to \"é\" for others.\n    ///\n    /// \\return The localized description of the code\n    ///\n    ////////////////////////////////////////////////////////////\n    static String getDescription(Scancode code);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Show or hide the virtual keyboard\n    ///\n    /// \\warning The virtual keyboard is not supported on all\n    ///          systems. It will typically be implemented on mobile OSes\n    ///          (Android, iOS) but not on desktop OSes (Windows, Linux, ...).\n    ///\n    /// If the virtual keyboard is not available, this function does\n    /// nothing.\n    ///\n    /// \\param visible True to show, false to hide\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setVirtualKeyboardVisible(bool visible);\n};\n\n} // namespace sf\n\n\n#endif // SFML_KEYBOARD_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Keyboard\n/// \\ingroup window\n///\n/// sf::Keyboard provides an interface to the state of the\n/// keyboard. It only contains static functions (a single\n/// keyboard is assumed), so it's not meant to be instantiated.\n///\n/// This class allows users to query the keyboard state at any\n/// time and directly, without having to deal with a window and\n/// its events. Compared to the KeyPressed and KeyReleased events,\n/// sf::Keyboard can retrieve the state of a key at any time\n/// (you don't need to store and update a boolean on your side\n/// in order to know if a key is pressed or released), and you\n/// always get the real state of the keyboard, even if keys are\n/// pressed or released when your window is out of focus and no\n/// event is triggered.\n///\n/// Usage example:\n/// \\code\n/// if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))\n/// {\n///     // move left...\n/// }\n/// else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))\n/// {\n///     // move right...\n/// }\n/// else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))\n/// {\n///     // quit...\n/// }\n/// else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Scan::Grave))\n/// {\n///     // open in-game command line (if it's not already open)\n/// }\n/// \\endcode\n///\n/// \\see sf::Joystick, sf::Mouse, sf::Touch\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Mouse.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_MOUSE_HPP\n#define SFML_MOUSE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <SFML/System/Vector2.hpp>\n\n\nnamespace sf\n{\nclass WindowBase;\n\n////////////////////////////////////////////////////////////\n/// \\brief Give access to the real-time state of the mouse\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Mouse\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Mouse buttons\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Button\n    {\n        Left,       //!< The left mouse button\n        Right,      //!< The right mouse button\n        Middle,     //!< The middle (wheel) mouse button\n        XButton1,   //!< The first extra mouse button\n        XButton2,   //!< The second extra mouse button\n\n        ButtonCount //!< Keep last -- the total number of mouse buttons\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Mouse wheels\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Wheel\n    {\n        VerticalWheel,  //!< The vertical mouse wheel\n        HorizontalWheel //!< The horizontal mouse wheel\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a mouse button is pressed\n    ///\n    /// \\warning Checking the state of buttons Mouse::XButton1 and\n    /// Mouse::XButton2 is not supported on Linux with X11.\n    ///\n    /// \\param button Button to check\n    ///\n    /// \\return True if the button is pressed, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isButtonPressed(Button button);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current position of the mouse in desktop coordinates\n    ///\n    /// This function returns the global position of the mouse\n    /// cursor on the desktop.\n    ///\n    /// \\return Current position of the mouse\n    ///\n    ////////////////////////////////////////////////////////////\n    static Vector2i getPosition();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current position of the mouse in window coordinates\n    ///\n    /// This function returns the current position of the mouse\n    /// cursor, relative to the given window.\n    ///\n    /// \\param relativeTo Reference window\n    ///\n    /// \\return Current position of the mouse\n    ///\n    ////////////////////////////////////////////////////////////\n    static Vector2i getPosition(const WindowBase& relativeTo);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the current position of the mouse in desktop coordinates\n    ///\n    /// This function sets the global position of the mouse\n    /// cursor on the desktop.\n    ///\n    /// \\param position New position of the mouse\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setPosition(const Vector2i& position);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the current position of the mouse in window coordinates\n    ///\n    /// This function sets the current position of the mouse\n    /// cursor, relative to the given window.\n    ///\n    /// \\param position New position of the mouse\n    /// \\param relativeTo Reference window\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setPosition(const Vector2i& position, const WindowBase& relativeTo);\n};\n\n} // namespace sf\n\n\n#endif // SFML_MOUSE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Mouse\n/// \\ingroup window\n///\n/// sf::Mouse provides an interface to the state of the\n/// mouse. It only contains static functions (a single\n/// mouse is assumed), so it's not meant to be instantiated.\n///\n/// This class allows users to query the mouse state at any\n/// time and directly, without having to deal with a window and\n/// its events. Compared to the MouseMoved, MouseButtonPressed\n/// and MouseButtonReleased events, sf::Mouse can retrieve the\n/// state of the cursor and the buttons at any time\n/// (you don't need to store and update a boolean on your side\n/// in order to know if a button is pressed or released), and you\n/// always get the real state of the mouse, even if it is\n/// moved, pressed or released when your window is out of focus\n/// and no event is triggered.\n///\n/// The setPosition and getPosition functions can be used to change\n/// or retrieve the current position of the mouse pointer. There are\n/// two versions: one that operates in global coordinates (relative\n/// to the desktop) and one that operates in window coordinates\n/// (relative to a specific window).\n///\n/// Usage example:\n/// \\code\n/// if (sf::Mouse::isButtonPressed(sf::Mouse::Left))\n/// {\n///     // left click...\n/// }\n///\n/// // get global mouse position\n/// sf::Vector2i position = sf::Mouse::getPosition();\n///\n/// // set mouse position relative to a window\n/// sf::Mouse::setPosition(sf::Vector2i(100, 200), window);\n/// \\endcode\n///\n/// \\see sf::Joystick, sf::Keyboard, sf::Touch\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Sensor.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SENSOR_HPP\n#define SFML_SENSOR_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <SFML/System/Vector3.hpp>\n#include <SFML/System/Time.hpp>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief Give access to the real-time state of the sensors\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Sensor\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Sensor type\n    ///\n    ////////////////////////////////////////////////////////////\n    enum Type\n    {\n        Accelerometer,    //!< Measures the raw acceleration (m/s^2)\n        Gyroscope,        //!< Measures the raw rotation rates (degrees/s)\n        Magnetometer,     //!< Measures the ambient magnetic field (micro-teslas)\n        Gravity,          //!< Measures the direction and intensity of gravity, independent of device acceleration (m/s^2)\n        UserAcceleration, //!< Measures the direction and intensity of device acceleration, independent of the gravity (m/s^2)\n        Orientation,      //!< Measures the absolute 3D orientation (degrees)\n\n        Count             //!< Keep last -- the total number of sensor types\n    };\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a sensor is available on the underlying platform\n    ///\n    /// \\param sensor Sensor to check\n    ///\n    /// \\return True if the sensor is available, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isAvailable(Type sensor);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enable or disable a sensor\n    ///\n    /// All sensors are disabled by default, to avoid consuming too\n    /// much battery power. Once a sensor is enabled, it starts\n    /// sending events of the corresponding type.\n    ///\n    /// This function does nothing if the sensor is unavailable.\n    ///\n    /// \\param sensor  Sensor to enable\n    /// \\param enabled True to enable, false to disable\n    ///\n    ////////////////////////////////////////////////////////////\n    static void setEnabled(Type sensor, bool enabled);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current sensor value\n    ///\n    /// \\param sensor Sensor to read\n    ///\n    /// \\return The current sensor value\n    ///\n    ////////////////////////////////////////////////////////////\n    static Vector3f getValue(Type sensor);\n};\n\n} // namespace sf\n\n\n#endif // SFML_SENSOR_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Sensor\n/// \\ingroup window\n///\n/// sf::Sensor provides an interface to the state of the\n/// various sensors that a device provides. It only contains static\n/// functions, so it's not meant to be instantiated.\n///\n/// This class allows users to query the sensors values at any\n/// time and directly, without having to deal with a window and\n/// its events. Compared to the SensorChanged event, sf::Sensor\n/// can retrieve the state of a sensor at any time (you don't need to\n/// store and update its current value on your side).\n///\n/// Depending on the OS and hardware of the device (phone, tablet, ...),\n/// some sensor types may not be available. You should always check\n/// the availability of a sensor before trying to read it, with the\n/// sf::Sensor::isAvailable function.\n///\n/// You may wonder why some sensor types look so similar, for example\n/// Accelerometer and Gravity / UserAcceleration. The first one\n/// is the raw measurement of the acceleration, and takes into account\n/// both the earth gravity and the user movement. The others are\n/// more precise: they provide these components separately, which is\n/// usually more useful. In fact they are not direct sensors, they\n/// are computed internally based on the raw acceleration and other sensors.\n/// This is exactly the same for Gyroscope vs Orientation.\n///\n/// Because sensors consume a non-negligible amount of current, they are\n/// all disabled by default. You must call sf::Sensor::setEnabled for each\n/// sensor in which you are interested.\n///\n/// Usage example:\n/// \\code\n/// if (sf::Sensor::isAvailable(sf::Sensor::Gravity))\n/// {\n///     // gravity sensor is available\n/// }\n///\n/// // enable the gravity sensor\n/// sf::Sensor::setEnabled(sf::Sensor::Gravity, true);\n///\n/// // get the current value of gravity\n/// sf::Vector3f gravity = sf::Sensor::getValue(sf::Sensor::Gravity);\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Touch.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_TOUCH_HPP\n#define SFML_TOUCH_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <SFML/System/Vector2.hpp>\n\n\nnamespace sf\n{\nclass WindowBase;\n\n////////////////////////////////////////////////////////////\n/// \\brief Give access to the real-time state of the touches\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Touch\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check if a touch event is currently down\n    ///\n    /// \\param finger Finger index\n    ///\n    /// \\return True if \\a finger is currently touching the screen, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isDown(unsigned int finger);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current position of a touch in desktop coordinates\n    ///\n    /// This function returns the current touch position\n    /// in global (desktop) coordinates.\n    ///\n    /// \\param finger Finger index\n    ///\n    /// \\return Current position of \\a finger, or undefined if it's not down\n    ///\n    ////////////////////////////////////////////////////////////\n    static Vector2i getPosition(unsigned int finger);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current position of a touch in window coordinates\n    ///\n    /// This function returns the current touch position\n    /// relative to the given window.\n    ///\n    /// \\param finger Finger index\n    /// \\param relativeTo Reference window\n    ///\n    /// \\return Current position of \\a finger, or undefined if it's not down\n    ///\n    ////////////////////////////////////////////////////////////\n    static Vector2i getPosition(unsigned int finger, const WindowBase& relativeTo);\n};\n\n} // namespace sf\n\n\n#endif // SFML_TOUCH_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Touch\n/// \\ingroup window\n///\n/// sf::Touch provides an interface to the state of the\n/// touches. It only contains static functions, so it's not\n/// meant to be instantiated.\n///\n/// This class allows users to query the touches state at any\n/// time and directly, without having to deal with a window and\n/// its events. Compared to the TouchBegan, TouchMoved\n/// and TouchEnded events, sf::Touch can retrieve the\n/// state of the touches at any time (you don't need to store and\n/// update a boolean on your side in order to know if a touch is down),\n/// and you always get the real state of the touches, even if they\n/// happen when your window is out of focus and no event is triggered.\n///\n/// The getPosition function can be used to retrieve the current\n/// position of a touch. There are two versions: one that operates\n/// in global coordinates (relative to the desktop) and one that\n/// operates in window coordinates (relative to a specific window).\n///\n/// Touches are identified by an index (the \"finger\"), so that in\n/// multi-touch events, individual touches can be tracked correctly.\n/// As long as a finger touches the screen, it will keep the same index\n/// even if other fingers start or stop touching the screen in the\n/// meantime. As a consequence, active touch indices may not always be\n/// sequential (i.e. touch number 0 may be released while touch number 1\n/// is still down).\n///\n/// Usage example:\n/// \\code\n/// if (sf::Touch::isDown(0))\n/// {\n///     // touch 0 is down\n/// }\n///\n/// // get global position of touch 1\n/// sf::Vector2i globalPos = sf::Touch::getPosition(1);\n///\n/// // get position of touch 1 relative to a window\n/// sf::Vector2i relativePos = sf::Touch::getPosition(1, window);\n/// \\endcode\n///\n/// \\see sf::Joystick, sf::Keyboard, sf::Mouse\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/VideoMode.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_VIDEOMODE_HPP\n#define SFML_VIDEOMODE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <vector>\n\n\nnamespace sf\n{\n////////////////////////////////////////////////////////////\n/// \\brief VideoMode defines a video mode (width, height, bpp)\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API VideoMode\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructors initializes all members to 0.\n    ///\n    ////////////////////////////////////////////////////////////\n    VideoMode();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the video mode with its attributes\n    ///\n    /// \\param modeWidth        Width in pixels\n    /// \\param modeHeight       Height in pixels\n    /// \\param modeBitsPerPixel Pixel depths in bits per pixel\n    ///\n    ////////////////////////////////////////////////////////////\n    VideoMode(unsigned int modeWidth, unsigned int modeHeight, unsigned int modeBitsPerPixel = 32);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the current desktop video mode\n    ///\n    /// \\return Current desktop video mode\n    ///\n    ////////////////////////////////////////////////////////////\n    static VideoMode getDesktopMode();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Retrieve all the video modes supported in fullscreen mode\n    ///\n    /// When creating a fullscreen window, the video mode is restricted\n    /// to be compatible with what the graphics driver and monitor\n    /// support. This function returns the complete list of all video\n    /// modes that can be used in fullscreen mode.\n    /// The returned array is sorted from best to worst, so that\n    /// the first element will always give the best mode (higher\n    /// width, height and bits-per-pixel).\n    ///\n    /// \\return Array containing all the supported fullscreen modes\n    ///\n    ////////////////////////////////////////////////////////////\n    static const std::vector<VideoMode>& getFullscreenModes();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether or not the video mode is valid\n    ///\n    /// The validity of video modes is only relevant when using\n    /// fullscreen windows; otherwise any video mode can be used\n    /// with no restriction.\n    ///\n    /// \\return True if the video mode is valid for fullscreen mode\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isValid() const;\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    unsigned int width;        //!< Video mode width, in pixels\n    unsigned int height;       //!< Video mode height, in pixels\n    unsigned int bitsPerPixel; //!< Video mode pixel depth, in bits per pixels\n};\n\n////////////////////////////////////////////////////////////\n/// \\relates VideoMode\n/// \\brief Overload of == operator to compare two video modes\n///\n/// \\param left  Left operand (a video mode)\n/// \\param right Right operand (a video mode)\n///\n/// \\return True if modes are equal\n///\n////////////////////////////////////////////////////////////\nSFML_WINDOW_API bool operator ==(const VideoMode& left, const VideoMode& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates VideoMode\n/// \\brief Overload of != operator to compare two video modes\n///\n/// \\param left  Left operand (a video mode)\n/// \\param right Right operand (a video mode)\n///\n/// \\return True if modes are different\n///\n////////////////////////////////////////////////////////////\nSFML_WINDOW_API bool operator !=(const VideoMode& left, const VideoMode& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates VideoMode\n/// \\brief Overload of < operator to compare video modes\n///\n/// \\param left  Left operand (a video mode)\n/// \\param right Right operand (a video mode)\n///\n/// \\return True if \\a left is lesser than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_WINDOW_API bool operator <(const VideoMode& left, const VideoMode& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates VideoMode\n/// \\brief Overload of > operator to compare video modes\n///\n/// \\param left  Left operand (a video mode)\n/// \\param right Right operand (a video mode)\n///\n/// \\return True if \\a left is greater than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_WINDOW_API bool operator >(const VideoMode& left, const VideoMode& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates VideoMode\n/// \\brief Overload of <= operator to compare video modes\n///\n/// \\param left  Left operand (a video mode)\n/// \\param right Right operand (a video mode)\n///\n/// \\return True if \\a left is lesser or equal than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_WINDOW_API bool operator <=(const VideoMode& left, const VideoMode& right);\n\n////////////////////////////////////////////////////////////\n/// \\relates VideoMode\n/// \\brief Overload of >= operator to compare video modes\n///\n/// \\param left  Left operand (a video mode)\n/// \\param right Right operand (a video mode)\n///\n/// \\return True if \\a left is greater or equal than \\a right\n///\n////////////////////////////////////////////////////////////\nSFML_WINDOW_API bool operator >=(const VideoMode& left, const VideoMode& right);\n\n} // namespace sf\n\n\n#endif // SFML_VIDEOMODE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::VideoMode\n/// \\ingroup window\n///\n/// A video mode is defined by a width and a height (in pixels)\n/// and a depth (in bits per pixel). Video modes are used to\n/// setup windows (sf::Window) at creation time.\n///\n/// The main usage of video modes is for fullscreen mode:\n/// indeed you must use one of the valid video modes\n/// allowed by the OS (which are defined by what the monitor\n/// and the graphics card support), otherwise your window\n/// creation will just fail.\n///\n/// sf::VideoMode provides a static function for retrieving\n/// the list of all the video modes supported by the system:\n/// getFullscreenModes().\n///\n/// A custom video mode can also be checked directly for\n/// fullscreen compatibility with its isValid() function.\n///\n/// Additionally, sf::VideoMode provides a static function\n/// to get the mode currently used by the desktop: getDesktopMode().\n/// This allows to build windows with the same size or pixel\n/// depth as the current resolution.\n///\n/// Usage example:\n/// \\code\n/// // Display the list of all the video modes available for fullscreen\n/// std::vector<sf::VideoMode> modes = sf::VideoMode::getFullscreenModes();\n/// for (std::size_t i = 0; i < modes.size(); ++i)\n/// {\n///     sf::VideoMode mode = modes[i];\n///     std::cout << \"Mode #\" << i << \": \"\n///               << mode.width << \"x\" << mode.height << \" - \"\n///               << mode.bitsPerPixel << \" bpp\" << std::endl;\n/// }\n///\n/// // Create a window with the same pixel depth as the desktop\n/// sf::VideoMode desktop = sf::VideoMode::getDesktopMode();\n/// window.create(sf::VideoMode(1024, 768, desktop.bitsPerPixel), \"SFML window\");\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Vulkan.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_VULKAN_HPP\n#define SFML_VULKAN_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Export.hpp>\n#include <SFML/Window/WindowHandle.hpp>\n#include <vector>\n#include <cstddef>\n#include <stdint.h>\n\n\ntypedef struct VkInstance_T* VkInstance;\n\n#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)\n\ntypedef struct VkSurfaceKHR_T* VkSurfaceKHR;\n\n#else\n\ntypedef uint64_t VkSurfaceKHR;\n\n#endif\n\nstruct VkAllocationCallbacks;\n\n\nnamespace sf\n{\n\ntypedef void (*VulkanFunctionPointer)();\n\n////////////////////////////////////////////////////////////\n/// \\brief Vulkan helper functions\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Vulkan\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether or not the system supports Vulkan\n    ///\n    /// This function should always be called before using\n    /// the Vulkan features. If it returns false, then\n    /// any attempt to use Vulkan will fail.\n    ///\n    /// If only compute is required, set \\a requireGraphics\n    /// to false to skip checking for the extensions necessary\n    /// for graphics rendering.\n    ///\n    /// \\param requireGraphics\n    ///\n    /// \\return True if Vulkan is supported, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    static bool isAvailable(bool requireGraphics = true);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the address of a Vulkan function\n    ///\n    /// \\param name Name of the function to get the address of\n    ///\n    /// \\return Address of the Vulkan function, 0 on failure\n    ///\n    ////////////////////////////////////////////////////////////\n    static VulkanFunctionPointer getFunction(const char* name);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get Vulkan instance extensions required for graphics\n    ///\n    /// \\return Vulkan instance extensions required for graphics\n    ///\n    ////////////////////////////////////////////////////////////\n    static const std::vector<const char*>& getGraphicsRequiredInstanceExtensions();\n};\n\n} // namespace sf\n\n\n#endif // SFML_VULKAN_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Vulkan\n/// \\ingroup window\n///\n/// \n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/Window.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_WINDOW_HPP\n#define SFML_WINDOW_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/ContextSettings.hpp>\n#include <SFML/Window/GlResource.hpp>\n#include <SFML/Window/WindowBase.hpp>\n\n\nnamespace sf\n{\nnamespace priv\n{\n    class GlContext;\n}\n\nclass Event;\n\n////////////////////////////////////////////////////////////\n/// \\brief Window that serves as a target for OpenGL rendering\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API Window : public WindowBase, GlResource\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor doesn't actually create the window,\n    /// use the other constructors or call create() to do so.\n    ///\n    ////////////////////////////////////////////////////////////\n    Window();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a new window\n    ///\n    /// This constructor creates the window with the size and pixel\n    /// depth defined in \\a mode. An optional style can be passed to\n    /// customize the look and behavior of the window (borders,\n    /// title bar, resizable, closable, ...). If \\a style contains\n    /// Style::Fullscreen, then \\a mode must be a valid video mode.\n    ///\n    /// The fourth parameter is an optional structure specifying\n    /// advanced OpenGL context settings such as antialiasing,\n    /// depth-buffer bits, etc.\n    ///\n    /// \\param mode     Video mode to use (defines the width, height and depth of the rendering area of the window)\n    /// \\param title    Title of the window\n    /// \\param style    %Window style, a bitwise OR combination of sf::Style enumerators\n    /// \\param settings Additional settings for the underlying OpenGL context\n    ///\n    ////////////////////////////////////////////////////////////\n    Window(VideoMode mode, const String& title, Uint32 style = Style::Default, const ContextSettings& settings = ContextSettings());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the window from an existing control\n    ///\n    /// Use this constructor if you want to create an OpenGL\n    /// rendering area into an already existing control.\n    ///\n    /// The second parameter is an optional structure specifying\n    /// advanced OpenGL context settings such as antialiasing,\n    /// depth-buffer bits, etc.\n    ///\n    /// \\param handle   Platform-specific handle of the control\n    /// \\param settings Additional settings for the underlying OpenGL context\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit Window(WindowHandle handle, const ContextSettings& settings = ContextSettings());\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// Closes the window and frees all the resources attached to it.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~Window();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create (or recreate) the window\n    ///\n    /// If the window was already created, it closes it first.\n    /// If \\a style contains Style::Fullscreen, then \\a mode\n    /// must be a valid video mode.\n    ///\n    /// \\param mode     Video mode to use (defines the width, height and depth of the rendering area of the window)\n    /// \\param title    Title of the window\n    /// \\param style    %Window style, a bitwise OR combination of sf::Style enumerators\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void create(VideoMode mode, const String& title, Uint32 style = Style::Default);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create (or recreate) the window\n    ///\n    /// If the window was already created, it closes it first.\n    /// If \\a style contains Style::Fullscreen, then \\a mode\n    /// must be a valid video mode.\n    ///\n    /// The fourth parameter is an optional structure specifying\n    /// advanced OpenGL context settings such as antialiasing,\n    /// depth-buffer bits, etc.\n    ///\n    /// \\param mode     Video mode to use (defines the width, height and depth of the rendering area of the window)\n    /// \\param title    Title of the window\n    /// \\param style    %Window style, a bitwise OR combination of sf::Style enumerators\n    /// \\param settings Additional settings for the underlying OpenGL context\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void create(VideoMode mode, const String& title, Uint32 style, const ContextSettings& settings);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create (or recreate) the window from an existing control\n    ///\n    /// Use this function if you want to create an OpenGL\n    /// rendering area into an already existing control.\n    /// If the window was already created, it closes it first.\n    ///\n    /// \\param handle   Platform-specific handle of the control\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void create(WindowHandle handle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create (or recreate) the window from an existing control\n    ///\n    /// Use this function if you want to create an OpenGL\n    /// rendering area into an already existing control.\n    /// If the window was already created, it closes it first.\n    ///\n    /// The second parameter is an optional structure specifying\n    /// advanced OpenGL context settings such as antialiasing,\n    /// depth-buffer bits, etc.\n    ///\n    /// \\param handle   Platform-specific handle of the control\n    /// \\param settings Additional settings for the underlying OpenGL context\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void create(WindowHandle handle, const ContextSettings& settings);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Close the window and destroy all the attached resources\n    ///\n    /// After calling this function, the sf::Window instance remains\n    /// valid and you can call create() to recreate the window.\n    /// All other functions such as pollEvent() or display() will\n    /// still work (i.e. you don't have to test isOpen() every time),\n    /// and will have no effect on closed windows.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void close();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the settings of the OpenGL context of the window\n    ///\n    /// Note that these settings may be different from what was\n    /// passed to the constructor or the create() function,\n    /// if one or more settings were not supported. In this case,\n    /// SFML chose the closest match.\n    ///\n    /// \\return Structure containing the OpenGL context settings\n    ///\n    ////////////////////////////////////////////////////////////\n    const ContextSettings& getSettings() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enable or disable vertical synchronization\n    ///\n    /// Activating vertical synchronization will limit the number\n    /// of frames displayed to the refresh rate of the monitor.\n    /// This can avoid some visual artifacts, and limit the framerate\n    /// to a good value (but not constant across different computers).\n    ///\n    /// Vertical synchronization is disabled by default.\n    ///\n    /// \\param enabled True to enable v-sync, false to deactivate it\n    ///\n    ////////////////////////////////////////////////////////////\n    void setVerticalSyncEnabled(bool enabled);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Limit the framerate to a maximum fixed frequency\n    ///\n    /// If a limit is set, the window will use a small delay after\n    /// each call to display() to ensure that the current frame\n    /// lasted long enough to match the framerate limit.\n    /// SFML will try to match the given limit as much as it can,\n    /// but since it internally uses sf::sleep, whose precision\n    /// depends on the underlying OS, the results may be a little\n    /// unprecise as well (for example, you can get 65 FPS when\n    /// requesting 60).\n    ///\n    /// \\param limit Framerate limit, in frames per seconds (use 0 to disable limit)\n    ///\n    ////////////////////////////////////////////////////////////\n    void setFramerateLimit(unsigned int limit);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Activate or deactivate the window as the current target\n    ///        for OpenGL rendering\n    ///\n    /// A window is active only on the current thread, if you want to\n    /// make it active on another thread you have to deactivate it\n    /// on the previous thread first if it was active.\n    /// Only one window can be active on a thread at a time, thus\n    /// the window previously active (if any) automatically gets deactivated.\n    /// This is not to be confused with requestFocus().\n    ///\n    /// \\param active True to activate, false to deactivate\n    ///\n    /// \\return True if operation was successful, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    bool setActive(bool active = true) const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Display on screen what has been rendered to the window so far\n    ///\n    /// This function is typically called after all OpenGL rendering\n    /// has been done for the current frame, in order to show\n    /// it on screen.\n    ///\n    ////////////////////////////////////////////////////////////\n    void display();\n\nprivate:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Processes an event before it is sent to the user\n    ///\n    /// This function is called every time an event is received\n    /// from the internal window (through pollEvent or waitEvent).\n    /// It filters out unwanted events, and performs whatever internal\n    /// stuff the window needs before the event is returned to the\n    /// user.\n    ///\n    /// \\param event Event to filter\n    ///\n    ////////////////////////////////////////////////////////////\n    bool filterEvent(const Event& event);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Perform some common internal initializations\n    ///\n    ////////////////////////////////////////////////////////////\n    void initialize();\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    priv::GlContext*  m_context;        //!< Platform-specific implementation of the OpenGL context\n    Clock             m_clock;          //!< Clock for measuring the elapsed time between frames\n    Time              m_frameTimeLimit; //!< Current framerate limit\n};\n\n} // namespace sf\n\n\n#endif // SFML_WINDOW_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::Window\n/// \\ingroup window\n///\n/// sf::Window is the main class of the Window module. It defines\n/// an OS window that is able to receive an OpenGL rendering.\n///\n/// A sf::Window can create its own new window, or be embedded into\n/// an already existing control using the create(handle) function.\n/// This can be useful for embedding an OpenGL rendering area into\n/// a view which is part of a bigger GUI with existing windows,\n/// controls, etc. It can also serve as embedding an OpenGL rendering\n/// area into a window created by another (probably richer) GUI library\n/// like Qt or wxWidgets.\n///\n/// The sf::Window class provides a simple interface for manipulating\n/// the window: move, resize, show/hide, control mouse cursor, etc.\n/// It also provides event handling through its pollEvent() and waitEvent()\n/// functions.\n///\n/// Note that OpenGL experts can pass their own parameters (antialiasing\n/// level, bits for the depth and stencil buffers, etc.) to the\n/// OpenGL context attached to the window, with the sf::ContextSettings\n/// structure which is passed as an optional argument when creating the\n/// window.\n///\n/// On dual-graphics systems consisting of a low-power integrated GPU\n/// and a powerful discrete GPU, the driver picks which GPU will run an\n/// SFML application. In order to inform the driver that an SFML application\n/// can benefit from being run on the more powerful discrete GPU,\n/// #SFML_DEFINE_DISCRETE_GPU_PREFERENCE can be placed in a source file\n/// that is compiled and linked into the final application. The macro\n/// should be placed outside of any scopes in the global namespace.\n///\n/// Usage example:\n/// \\code\n/// // Declare and create a new window\n/// sf::Window window(sf::VideoMode(800, 600), \"SFML window\");\n///\n/// // Limit the framerate to 60 frames per second (this step is optional)\n/// window.setFramerateLimit(60);\n///\n/// // The main loop - ends as soon as the window is closed\n/// while (window.isOpen())\n/// {\n///    // Event processing\n///    sf::Event event;\n///    while (window.pollEvent(event))\n///    {\n///        // Request for closing the window\n///        if (event.type == sf::Event::Closed)\n///            window.close();\n///    }\n///\n///    // Activate the window for OpenGL rendering\n///    window.setActive();\n///\n///    // OpenGL drawing commands go here...\n///\n///    // End the current frame and display its contents on screen\n///    window.display();\n/// }\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/WindowBase.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_WINDOWBASE_HPP\n#define SFML_WINDOWBASE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Window/Cursor.hpp>\n#include <SFML/Window/Export.hpp>\n#include <SFML/Window/VideoMode.hpp>\n#include <SFML/Window/Vulkan.hpp>\n#include <SFML/Window/WindowHandle.hpp>\n#include <SFML/Window/WindowStyle.hpp>\n#include <SFML/System/Clock.hpp>\n#include <SFML/System/NonCopyable.hpp>\n#include <SFML/System/String.hpp>\n#include <SFML/System/Vector2.hpp>\n\n\nnamespace sf\n{\nnamespace priv\n{\n    class WindowImpl;\n}\n\nclass Event;\n\n////////////////////////////////////////////////////////////\n/// \\brief Window that serves as a base for other windows\n///\n////////////////////////////////////////////////////////////\nclass SFML_WINDOW_API WindowBase : NonCopyable\n{\npublic:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Default constructor\n    ///\n    /// This constructor doesn't actually create the window,\n    /// use the other constructors or call create() to do so.\n    ///\n    ////////////////////////////////////////////////////////////\n    WindowBase();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct a new window\n    ///\n    /// This constructor creates the window with the size and pixel\n    /// depth defined in \\a mode. An optional style can be passed to\n    /// customize the look and behavior of the window (borders,\n    /// title bar, resizable, closable, ...). If \\a style contains\n    /// Style::Fullscreen, then \\a mode must be a valid video mode.\n    ///\n    /// \\param mode  Video mode to use (defines the width, height and depth of the rendering area of the window)\n    /// \\param title Title of the window\n    /// \\param style %Window style, a bitwise OR combination of sf::Style enumerators\n    ///\n    ////////////////////////////////////////////////////////////\n    WindowBase(VideoMode mode, const String& title, Uint32 style = Style::Default);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Construct the window from an existing control\n    ///\n    /// \\param handle Platform-specific handle of the control\n    ///\n    ////////////////////////////////////////////////////////////\n    explicit WindowBase(WindowHandle handle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Destructor\n    ///\n    /// Closes the window and frees all the resources attached to it.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual ~WindowBase();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create (or recreate) the window\n    ///\n    /// If the window was already created, it closes it first.\n    /// If \\a style contains Style::Fullscreen, then \\a mode\n    /// must be a valid video mode.\n    ///\n    /// \\param mode  Video mode to use (defines the width, height and depth of the rendering area of the window)\n    /// \\param title Title of the window\n    /// \\param style %Window style, a bitwise OR combination of sf::Style enumerators\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void create(VideoMode mode, const String& title, Uint32 style = Style::Default);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create (or recreate) the window from an existing control\n    ///\n    /// \\param handle Platform-specific handle of the control\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void create(WindowHandle handle);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Close the window and destroy all the attached resources\n    ///\n    /// After calling this function, the sf::Window instance remains\n    /// valid and you can call create() to recreate the window.\n    /// All other functions such as pollEvent() or display() will\n    /// still work (i.e. you don't have to test isOpen() every time),\n    /// and will have no effect on closed windows.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void close();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Tell whether or not the window is open\n    ///\n    /// This function returns whether or not the window exists.\n    /// Note that a hidden window (setVisible(false)) is open\n    /// (therefore this function would return true).\n    ///\n    /// \\return True if the window is open, false if it has been closed\n    ///\n    ////////////////////////////////////////////////////////////\n    bool isOpen() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Pop the event on top of the event queue, if any, and return it\n    ///\n    /// This function is not blocking: if there's no pending event then\n    /// it will return false and leave \\a event unmodified.\n    /// Note that more than one event may be present in the event queue,\n    /// thus you should always call this function in a loop\n    /// to make sure that you process every pending event.\n    /// \\code\n    /// sf::Event event;\n    /// while (window.pollEvent(event))\n    /// {\n    ///    // process event...\n    /// }\n    /// \\endcode\n    ///\n    /// \\param event Event to be returned\n    ///\n    /// \\return True if an event was returned, or false if the event queue was empty\n    ///\n    /// \\see waitEvent\n    ///\n    ////////////////////////////////////////////////////////////\n    bool pollEvent(Event& event);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Wait for an event and return it\n    ///\n    /// This function is blocking: if there's no pending event then\n    /// it will wait until an event is received.\n    /// After this function returns (and no error occurred),\n    /// the \\a event object is always valid and filled properly.\n    /// This function is typically used when you have a thread that\n    /// is dedicated to events handling: you want to make this thread\n    /// sleep as long as no new event is received.\n    /// \\code\n    /// sf::Event event;\n    /// if (window.waitEvent(event))\n    /// {\n    ///    // process event...\n    /// }\n    /// \\endcode\n    ///\n    /// \\param event Event to be returned\n    ///\n    /// \\return False if any error occurred\n    ///\n    /// \\see pollEvent\n    ///\n    ////////////////////////////////////////////////////////////\n    bool waitEvent(Event& event);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the position of the window\n    ///\n    /// \\return Position of the window, in pixels\n    ///\n    /// \\see setPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2i getPosition() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the position of the window on screen\n    ///\n    /// This function only works for top-level windows\n    /// (i.e. it will be ignored for windows created from\n    /// the handle of a child window/control).\n    ///\n    /// \\param position New position, in pixels\n    ///\n    /// \\see getPosition\n    ///\n    ////////////////////////////////////////////////////////////\n    void setPosition(const Vector2i& position);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the size of the rendering region of the window\n    ///\n    /// The size doesn't include the titlebar and borders\n    /// of the window.\n    ///\n    /// \\return Size in pixels\n    ///\n    /// \\see setSize\n    ///\n    ////////////////////////////////////////////////////////////\n    Vector2u getSize() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the size of the rendering region of the window\n    ///\n    /// \\param size New size, in pixels\n    ///\n    /// \\see getSize\n    ///\n    ////////////////////////////////////////////////////////////\n    void setSize(const Vector2u& size);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the title of the window\n    ///\n    /// \\param title New title\n    ///\n    /// \\see setIcon\n    ///\n    ////////////////////////////////////////////////////////////\n    void setTitle(const String& title);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the window's icon\n    ///\n    /// \\a pixels must be an array of \\a width x \\a height pixels\n    /// in 32-bits RGBA format.\n    ///\n    /// The OS default icon is used by default.\n    ///\n    /// \\param width  Icon's width, in pixels\n    /// \\param height Icon's height, in pixels\n    /// \\param pixels Pointer to the array of pixels in memory. The\n    ///               pixels are copied, so you need not keep the\n    ///               source alive after calling this function.\n    ///\n    /// \\see setTitle\n    ///\n    ////////////////////////////////////////////////////////////\n    void setIcon(unsigned int width, unsigned int height, const Uint8* pixels);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Show or hide the window\n    ///\n    /// The window is shown by default.\n    ///\n    /// \\param visible True to show the window, false to hide it\n    ///\n    ////////////////////////////////////////////////////////////\n    void setVisible(bool visible);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Show or hide the mouse cursor\n    ///\n    /// The mouse cursor is visible by default.\n    ///\n    /// \\param visible True to show the mouse cursor, false to hide it\n    ///\n    ////////////////////////////////////////////////////////////\n    void setMouseCursorVisible(bool visible);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Grab or release the mouse cursor\n    ///\n    /// If set, grabs the mouse cursor inside this window's client\n    /// area so it may no longer be moved outside its bounds.\n    /// Note that grabbing is only active while the window has\n    /// focus.\n    ///\n    /// \\param grabbed True to enable, false to disable\n    ///\n    ////////////////////////////////////////////////////////////\n    void setMouseCursorGrabbed(bool grabbed);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set the displayed cursor to a native system cursor\n    ///\n    /// Upon window creation, the arrow cursor is used by default.\n    ///\n    /// \\warning The cursor must not be destroyed while in use by\n    ///          the window.\n    ///\n    /// \\warning Features related to Cursor are not supported on\n    ///          iOS and Android.\n    ///\n    /// \\param cursor Native system cursor type to display\n    ///\n    /// \\see sf::Cursor::loadFromSystem\n    /// \\see sf::Cursor::loadFromPixels\n    ///\n    ////////////////////////////////////////////////////////////\n    void setMouseCursor(const Cursor& cursor);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Enable or disable automatic key-repeat\n    ///\n    /// If key repeat is enabled, you will receive repeated\n    /// KeyPressed events while keeping a key pressed. If it is disabled,\n    /// you will only get a single event when the key is pressed.\n    ///\n    /// Key repeat is enabled by default.\n    ///\n    /// \\param enabled True to enable, false to disable\n    ///\n    ////////////////////////////////////////////////////////////\n    void setKeyRepeatEnabled(bool enabled);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Change the joystick threshold\n    ///\n    /// The joystick threshold is the value below which\n    /// no JoystickMoved event will be generated.\n    ///\n    /// The threshold value is 0.1 by default.\n    ///\n    /// \\param threshold New threshold, in the range [0, 100]\n    ///\n    ////////////////////////////////////////////////////////////\n    void setJoystickThreshold(float threshold);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Request the current window to be made the active\n    ///        foreground window\n    ///\n    /// At any given time, only one window may have the input focus\n    /// to receive input events such as keystrokes or mouse events.\n    /// If a window requests focus, it only hints to the operating\n    /// system, that it would like to be focused. The operating system\n    /// is free to deny the request.\n    /// This is not to be confused with setActive().\n    ///\n    /// \\see hasFocus\n    ///\n    ////////////////////////////////////////////////////////////\n    void requestFocus();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Check whether the window has the input focus\n    ///\n    /// At any given time, only one window may have the input focus\n    /// to receive input events such as keystrokes or most mouse\n    /// events.\n    ///\n    /// \\return True if window has focus, false otherwise\n    /// \\see requestFocus\n    ///\n    ////////////////////////////////////////////////////////////\n    bool hasFocus() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the OS-specific handle of the window\n    ///\n    /// The type of the returned handle is sf::WindowHandle,\n    /// which is a typedef to the handle type defined by the OS.\n    /// You shouldn't need to use this function, unless you have\n    /// very specific stuff to implement that SFML doesn't support,\n    /// or implement a temporary workaround until a bug is fixed.\n    ///\n    /// \\return System handle of the window\n    ///\n    ////////////////////////////////////////////////////////////\n    WindowHandle getSystemHandle() const;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Create a Vulkan rendering surface\n    ///\n    /// \\param instance  Vulkan instance\n    /// \\param surface   Created surface\n    /// \\param allocator Allocator to use\n    ///\n    /// \\return True if surface creation was successful, false otherwise\n    ///\n    ////////////////////////////////////////////////////////////\n    bool createVulkanSurface(const VkInstance& instance, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator = 0);\n\nprotected:\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Function called after the window has been created\n    ///\n    /// This function is called so that derived classes can\n    /// perform their own specific initialization as soon as\n    /// the window is created.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void onCreate();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Function called after the window has been resized\n    ///\n    /// This function is called so that derived classes can\n    /// perform custom actions when the size of the window changes.\n    ///\n    ////////////////////////////////////////////////////////////\n    virtual void onResize();\n\nprivate:\n\n    friend class Window;\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Processes an event before it is sent to the user\n    ///\n    /// This function is called every time an event is received\n    /// from the internal window (through pollEvent or waitEvent).\n    /// It filters out unwanted events, and performs whatever internal\n    /// stuff the window needs before the event is returned to the\n    /// user.\n    ///\n    /// \\param event Event to filter\n    ///\n    ////////////////////////////////////////////////////////////\n    bool filterEvent(const Event& event);\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Perform some common internal initializations\n    ///\n    ////////////////////////////////////////////////////////////\n    void initialize();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Get the fullscreen window\n    ///\n    /// \\return The fullscreen window or NULL if there is none\n    ///\n    ////////////////////////////////////////////////////////////\n    const WindowBase* getFullscreenWindow();\n\n    ////////////////////////////////////////////////////////////\n    /// \\brief Set a window as the fullscreen window\n    ///\n    /// \\param window Window to set as fullscreen window\n    ///\n    ////////////////////////////////////////////////////////////\n    void setFullscreenWindow(const WindowBase* window);\n\n    ////////////////////////////////////////////////////////////\n    // Member data\n    ////////////////////////////////////////////////////////////\n    priv::WindowImpl* m_impl;           //!< Platform-specific implementation of the window\n    Vector2u          m_size;           //!< Current size of the window\n};\n\n} // namespace sf\n\n\n#endif // SFML_WINDOWBASE_HPP\n\n\n////////////////////////////////////////////////////////////\n/// \\class sf::WindowBase\n/// \\ingroup window\n///\n/// sf::WindowBase serves as the base class for all Windows.\n///\n/// A sf::WindowBase can create its own new window, or be embedded into\n/// an already existing control using the create(handle) function.\n///\n/// The sf::WindowBase class provides a simple interface for manipulating\n/// the window: move, resize, show/hide, control mouse cursor, etc.\n/// It also provides event handling through its pollEvent() and waitEvent()\n/// functions.\n///\n/// Usage example:\n/// \\code\n/// // Declare and create a new window\n/// sf::WindowBase window(sf::VideoMode(800, 600), \"SFML window\");\n///\n/// // The main loop - ends as soon as the window is closed\n/// while (window.isOpen())\n/// {\n///    // Event processing\n///    sf::Event event;\n///    while (window.pollEvent(event))\n///    {\n///        // Request for closing the window\n///        if (event.type == sf::Event::Closed)\n///            window.close();\n///    }\n///\n///    // Do things with the window here...\n/// }\n/// \\endcode\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/WindowHandle.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_WINDOWHANDLE_HPP\n#define SFML_WINDOWHANDLE_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n#include <SFML/Config.hpp>\n\n// Windows' HWND is a typedef on struct HWND__*\n#if defined(SFML_SYSTEM_WINDOWS)\n    struct HWND__;\n#endif\n\nnamespace sf\n{\n#if defined(SFML_SYSTEM_WINDOWS)\n\n    // Window handle is HWND (HWND__*) on Windows\n    typedef HWND__* WindowHandle;\n\n#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)\n\n    // Window handle is Window (unsigned long) on Unix - X11\n    typedef unsigned long WindowHandle;\n\n#elif defined(SFML_SYSTEM_MACOS)\n\n    // Window handle is NSWindow or NSView (void*) on Mac OS X - Cocoa\n    typedef void* WindowHandle;\n\n#elif defined(SFML_SYSTEM_IOS)\n\n    // Window handle is UIWindow (void*) on iOS - UIKit\n    typedef void* WindowHandle;\n\n#elif defined(SFML_SYSTEM_ANDROID)\n\n    // Window handle is ANativeWindow* (void*) on Android\n    typedef void* WindowHandle;\n\n#elif defined(SFML_DOXYGEN)\n\n    // Define typedef symbol so that Doxygen can attach some documentation to it\n    typedef \"platform-specific\" WindowHandle;\n\n#endif\n\n} // namespace sf\n\n\n#endif // SFML_WINDOWHANDLE_HPP\n\n////////////////////////////////////////////////////////////\n/// \\typedef sf::WindowHandle\n/// \\ingroup window\n///\n/// Define a low-level window handle type, specific to\n/// each platform.\n///\n/// Platform        | Type\n/// ----------------|------------------------------------------------------------\n/// Windows         | \\p HWND\n/// Linux/FreeBSD   | \\p %Window\n/// Mac OS X        | either \\p NSWindow* or \\p NSView*, disguised as \\p void*\n/// iOS             | \\p UIWindow*\n/// Android         | \\p ANativeWindow*\n///\n/// \\par Mac OS X Specification\n///\n/// On Mac OS X, a sf::Window can be created either from an\n/// existing \\p NSWindow* or an \\p NSView*. When the window\n/// is created from a window, SFML will use its content view\n/// as the OpenGL area. sf::Window::getSystemHandle() will\n/// return the handle that was used to create the window,\n/// which is a \\p NSWindow* by default.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window/WindowStyle.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_WINDOWSTYLE_HPP\n#define SFML_WINDOWSTYLE_HPP\n\n\nnamespace sf\n{\nnamespace Style\n{\n    ////////////////////////////////////////////////////////////\n    /// \\ingroup window\n    /// \\brief Enumeration of the window styles\n    ///\n    ////////////////////////////////////////////////////////////\n    enum\n    {\n        None       = 0,      //!< No border / title bar (this flag and all others are mutually exclusive)\n        Titlebar   = 1 << 0, //!< Title bar + fixed border\n        Resize     = 1 << 1, //!< Title bar + resizable border + maximize button\n        Close      = 1 << 2, //!< Title bar + close button\n        Fullscreen = 1 << 3, //!< Fullscreen mode (this flag and all others are mutually exclusive)\n\n        Default = Titlebar | Resize | Close //!< Default window style\n    };\n}\n\n} // namespace sf\n\n\n#endif // SFML_WINDOWSTYLE_HPP\n"
  },
  {
    "path": "app/src/main/external/SFML/include/SFML/Window.hpp",
    "content": "////////////////////////////////////////////////////////////\n//\n// SFML - Simple and Fast Multimedia Library\n// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it freely,\n// subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented;\n//    you must not claim that you wrote the original software.\n//    If you use this software in a product, an acknowledgment\n//    in the product documentation would be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such,\n//    and must not be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n//\n////////////////////////////////////////////////////////////\n\n#ifndef SFML_SFML_WINDOW_HPP\n#define SFML_SFML_WINDOW_HPP\n\n////////////////////////////////////////////////////////////\n// Headers\n////////////////////////////////////////////////////////////\n\n#include <SFML/System.hpp>\n#include <SFML/Window/Clipboard.hpp>\n#include <SFML/Window/Context.hpp>\n#include <SFML/Window/ContextSettings.hpp>\n#include <SFML/Window/Cursor.hpp>\n#include <SFML/Window/Event.hpp>\n#include <SFML/Window/Joystick.hpp>\n#include <SFML/Window/Keyboard.hpp>\n#include <SFML/Window/Mouse.hpp>\n#include <SFML/Window/Sensor.hpp>\n#include <SFML/Window/Touch.hpp>\n#include <SFML/Window/VideoMode.hpp>\n#include <SFML/Window/Window.hpp>\n#include <SFML/Window/WindowHandle.hpp>\n#include <SFML/Window/WindowStyle.hpp>\n\n\n\n#endif // SFML_SFML_WINDOW_HPP\n\n////////////////////////////////////////////////////////////\n/// \\defgroup window Window module\n///\n/// Provides OpenGL-based windows, and abstractions for\n/// events and input handling.\n///\n////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/external/SFML/lib/cmake/SFML/SFMLConfig.cmake",
    "content": "# This script provides the SFML libraries as imported targets\n# ------------------------------------\n#\n# Usage\n# -----\n#\n# When you try to locate the SFML libraries, you must specify which modules you want to use (system, window, graphics, network, audio, main).\n# If none is given, no imported target will be created and you won't be able to link to SFML libraries.\n# example:\n#   find_package(SFML COMPONENTS graphics window system) # find the graphics, window and system modules\n#\n# You can enforce a specific version, either MAJOR.MINOR or only MAJOR.\n# If nothing is specified, the version won't be checked (i.e. any version will be accepted).\n# example:\n#   find_package(SFML COMPONENTS ...)     # no specific version required\n#   find_package(SFML 2 COMPONENTS ...)   # any 2.x version\n#   find_package(SFML 2.6 COMPONENTS ...) # version 2.6 or greater\n#\n# By default, the dynamic libraries of SFML will be found. To find the static ones instead,\n# you must set the SFML_STATIC_LIBRARIES variable to TRUE before calling find_package(SFML ...).\n# You don't need to deal with SFML's dependencies when linking your targets against SFML libraries,\n# they will all be configured automatically, even if you use SFML static libraries.\n# example:\n#   set(SFML_STATIC_LIBRARIES TRUE)\n#   find_package(SFML 2 COMPONENTS network system)\n#\n# On macOS by default CMake will search for frameworks. If you want to use static libraries and have installed\n# both SFML frameworks and SFML static libraries, your must set CMAKE_FIND_FRAMEWORK to \"NEVER\" or \"LAST\"\n# in addition to setting SFML_STATIC_LIBRARIES to TRUE. Otherwise CMake will check the frameworks bundle config and\n# fail after finding out that it does not provide static libraries. Please refer to CMake documentation for more details.\n#\n# Additionally, keep in mind that SFML frameworks are only available as release libraries unlike dylibs which\n# are available for both release and debug modes.\n#\n# If SFML is not installed in a standard path, you can use the SFML_DIR CMake variable\n# to tell CMake where SFML's config file is located (PREFIX/lib/cmake/SFML for a library-based installation,\n# and PREFIX/SFML.framework/Resources/CMake on macOS for a framework-based installation).\n#\n# Output\n# ------\n#\n# This script defines the following variables:\n# - For each specified module XXX (system, window, graphics, network, audio, main):\n#   - SFML_XXX_FOUND:  true if either the debug or release library of the xxx module is found\n# - SFML_FOUND:        true if all the required modules are found\n#\n# And the following targets:\n# - For each specified module XXX (system, window, graphics, network, audio, main):\n#   - sfml-XXX\n# The SFML targets are the same for both Debug and Release build configurations and will automatically provide\n# correct settings based on your currently active build configuration. The SFML targets name also do not change\n# when using dynamic or static SFML libraries.\n#\n# When linking against a SFML target, you do not need to specify indirect dependencies. For example, linking\n# against sfml-graphics will also automatically link against sfml-window and sfml-system.\n#\n# example:\n#   find_package(SFML 2 COMPONENTS graphics audio REQUIRED)\n#   add_executable(myapp ...)\n#   target_link_libraries(myapp sfml-graphics sfml-audio)\n\nif (NOT SFML_FIND_COMPONENTS)\n    message(FATAL_ERROR \"find_package(SFML) called with no component\")\nendif()\n\nset(FIND_SFML_PATHS\n    \"${CMAKE_CURRENT_LIST_DIR}/../..\"\n    ${SFML_ROOT}\n    $ENV{SFML_ROOT}\n    ~/Library/Frameworks\n    /Library/Frameworks\n    /usr/local\n    /usr\n    /sw\n    /opt/local\n    /opt/csw\n    /opt)\n\nfind_path(SFML_DOC_DIR SFML.tag\n          PATH_SUFFIXES SFML/doc share/doc/SFML\n          PATHS ${FIND_SFML_PATHS})\n\n\n# Update requested components (eg. request window component if graphics component was requested)\nset(FIND_SFML_SYSTEM_DEPENDENCIES \"\")\nset(FIND_SFML_MAIN_DEPENDENCIES \"\")\nset(FIND_SFML_AUDIO_DEPENDENCIES system)\nset(FIND_SFML_NETWORK_DEPENDENCIES system)\nset(FIND_SFML_WINDOW_DEPENDENCIES system)\nset(FIND_SFML_GRAPHICS_DEPENDENCIES window system)\nset(FIND_SFML_ADDITIONAL_COMPONENTS \"\")\nforeach(component ${SFML_FIND_COMPONENTS})\n    string(TOUPPER \"${component}\" UPPER_COMPONENT)\n    list(APPEND FIND_SFML_ADDITIONAL_COMPONENTS ${FIND_SFML_${UPPER_COMPONENT}_DEPENDENCIES})\nendforeach()\nlist(APPEND SFML_FIND_COMPONENTS ${FIND_SFML_ADDITIONAL_COMPONENTS})\nlist(REMOVE_DUPLICATES SFML_FIND_COMPONENTS)\n\n# Choose which target definitions must be imported\nif (SFML_STATIC_LIBRARIES)\n\tset(SFML_IS_FRAMEWORK_INSTALL \"\")\n    if (SFML_IS_FRAMEWORK_INSTALL)\n        message(WARNING \"Static frameworks are not supported by SFML. Clear SFML_DIR cache entry, \\\nand either change SFML_STATIC_LIBRARIES or CMAKE_FIND_FRAMEWORK before calling find_package(SFML)\")\n    endif()\n    set(config_name \"Static\")\nelse()\n    set(config_name \"Shared\")\nendif()\nset(targets_config_file \"${CMAKE_CURRENT_LIST_DIR}/SFML${config_name}Targets.cmake\")\n\n# Generate imported targets for SFML and its dependencies\nif (EXISTS \"${targets_config_file}\")\n    # Set SFML_FOUND to TRUE by default, may be overwritten by one of the includes below\n    set(SFML_FOUND TRUE)\n    include(\"${targets_config_file}\")\n    include(\"${CMAKE_CURRENT_LIST_DIR}/SFMLConfigDependencies.cmake\")\n\n    if (SFML_FOUND)\n        foreach (component ${SFML_FIND_COMPONENTS})\n            string(TOUPPER \"${component}\" UPPER_COMPONENT)\n            if (TARGET sfml-${component})\n                set(SFML_${UPPER_COMPONENT}_FOUND TRUE)\n            else()\n                set(FIND_SFML_ERROR \"Found SFML but requested component '${component}' is missing in the config defined in ${SFML_DIR}.\")\n                set(SFML_${UPPER_COMPONENT}_FOUND FALSE)\n                set(SFML_FOUND FALSE)\n            endif()\n        endforeach()\n    endif()\nelse()\n    set(FIND_SFML_ERROR \"Requested SFML configuration (${config_name}) was not found\")\n    set(SFML_FOUND FALSE)\nendif()\n\nif (NOT SFML_FOUND)\n    if(SFML_FIND_REQUIRED)\n        # fatal error\n        message(FATAL_ERROR \"${FIND_SFML_ERROR}\")\n    elseif(NOT SFML_FIND_QUIETLY)\n        # error but continue\n        message(STATUS \"${FIND_SFML_ERROR}\")\n    endif()\nendif()\n\nif (SFML_FOUND AND NOT SFML_FIND_QUIETLY)\n    message(STATUS \"Found SFML 2.6.1 in ${CMAKE_CURRENT_LIST_DIR}\")\nendif()\n"
  },
  {
    "path": "app/src/main/external/SFML/lib/cmake/SFML/SFMLConfigDependencies.cmake",
    "content": "\nif (CMAKE_VERSION VERSION_LESS 3.5.2)\n    include(CMakeParseArguments)\nendif()\n\n# in case of static linking, we must also define the list of all the dependencies of SFML libraries\nif(SFML_STATIC_LIBRARIES)\n    # detect the OS\n    if(${CMAKE_SYSTEM_NAME} MATCHES \"Windows\")\n        set(FIND_SFML_OS_WINDOWS 1)\n    elseif(${CMAKE_SYSTEM_NAME} MATCHES \"Linux\")\n        set(FIND_SFML_OS_LINUX 1)\n\n        if()\n            set(FIND_SFML_USE_DRM 1)\n        endif()\n    elseif(${CMAKE_SYSTEM_NAME} MATCHES \"FreeBSD\")\n        set(FIND_SFML_OS_FREEBSD 1)\n    elseif(${CMAKE_SYSTEM_NAME} MATCHES \"Darwin\")\n        if (DEFINED IOS)\n            set(FIND_SFML_OS_IOS 1)\n        else()\n            set(FIND_SFML_OS_MACOSX 1)\n        endif()\n    endif()\n\n    # start with an empty list\n    set(FIND_SFML_DEPENDENCIES_NOTFOUND)\n\n    # macro that searches for a 3rd-party library\n    function(sfml_bind_dependency)\n        cmake_parse_arguments(THIS \"\" \"TARGET;FRIENDLY_NAME\" \"SEARCH_NAMES\" ${ARGN})\n        if (THIS_UNPARSED_ARGUMENTS)\n            message(FATAL_ERROR \"Unknown arguments when calling sfml_bind_dependency: ${THIS_UNPARSED_ARGUMENTS}\")\n        endif()\n\n        # No lookup in environment variables (PATH on Windows), as they may contain wrong library versions\n        find_library(${THIS_FRIENDLY_NAME}_LIB NAMES ${THIS_SEARCH_NAMES}\n                     PATHS ${FIND_SFML_PATHS} PATH_SUFFIXES lib NO_SYSTEM_ENVIRONMENT_PATH)\n        mark_as_advanced(${THIS_FRIENDLY_NAME}_LIB)\n        if(${THIS_FRIENDLY_NAME}_LIB)\n            set_property(TARGET ${THIS_TARGET} APPEND PROPERTY INTERFACE_LINK_LIBRARIES \"${${THIS_FRIENDLY_NAME}_LIB}\")\n        else()\n            set(FIND_SFML_DEPENDENCIES_NOTFOUND \"${FIND_SFML_DEPENDENCIES_NOTFOUND} ${THIS_FRIENDLY_NAME}\" PARENT_SCOPE)\n        endif()\n    endfunction()\n\n    # sfml-window\n    list(FIND SFML_FIND_COMPONENTS \"window\" FIND_SFML_WINDOW_COMPONENT_INDEX)\n    if(FIND_SFML_WINDOW_COMPONENT_INDEX GREATER -1)\n        if(FIND_SFML_USE_DRM)\n            sfml_bind_dependency(TARGET DRM FRIENDLY_NAME \"drm\" SEARCH_NAMES \"drm\")\n            sfml_bind_dependency(TARGET GBM FRIENDLY_NAME \"gbm\" SEARCH_NAMES \"gbm\")\n        elseif(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD)\n            sfml_bind_dependency(TARGET X11 FRIENDLY_NAME \"X11\" SEARCH_NAMES \"X11\")\n            sfml_bind_dependency(TARGET X11 FRIENDLY_NAME \"Xrandr\" SEARCH_NAMES \"Xrandr\")\n            sfml_bind_dependency(TARGET X11 FRIENDLY_NAME \"Xcursor\" SEARCH_NAMES \"Xcursor\")\n        endif()\n\n        if(FIND_SFML_OS_LINUX)\n            sfml_bind_dependency(TARGET UDev FRIENDLY_NAME \"UDev\" SEARCH_NAMES \"udev\" \"libudev\")\n        endif()\n\n        if (FIND_SFML_OS_WINDOWS)\n            set_property(TARGET OpenGL APPEND PROPERTY INTERFACE_LINK_LIBRARIES \"OpenGL32\")\n        elseif(NOT FIND_SFML_OS_IOS)\n            sfml_bind_dependency(TARGET OpenGL FRIENDLY_NAME \"OpenGL\" SEARCH_NAMES \"OpenGL\" \"GL\")\n        endif()\n    endif()\n\n    # sfml-graphics\n    list(FIND SFML_FIND_COMPONENTS \"graphics\" FIND_SFML_GRAPHICS_COMPONENT_INDEX)\n    if(FIND_SFML_GRAPHICS_COMPONENT_INDEX GREATER -1)\n        sfml_bind_dependency(TARGET Freetype FRIENDLY_NAME \"FreeType\" SEARCH_NAMES \"freetype\")\n    endif()\n\n    # sfml-audio\n    list(FIND SFML_FIND_COMPONENTS \"audio\" FIND_SFML_AUDIO_COMPONENT_INDEX)\n    if(FIND_SFML_AUDIO_COMPONENT_INDEX GREATER -1)\n        sfml_bind_dependency(TARGET OpenAL FRIENDLY_NAME \"OpenAL\" SEARCH_NAMES \"OpenAL\" \"openal\" \"openal32\")\n        if (NOT FIND_SFML_OS_IOS)\n            sfml_bind_dependency(TARGET VORBIS FRIENDLY_NAME \"VorbisFile\" SEARCH_NAMES \"vorbisfile\")\n            sfml_bind_dependency(TARGET VORBIS FRIENDLY_NAME \"VorbisEnc\" SEARCH_NAMES \"vorbisenc\")\n        endif()\n        sfml_bind_dependency(TARGET VORBIS FRIENDLY_NAME \"Vorbis\" SEARCH_NAMES \"vorbis\")\n        sfml_bind_dependency(TARGET VORBIS FRIENDLY_NAME \"Ogg\" SEARCH_NAMES \"ogg\")\n        sfml_bind_dependency(TARGET FLAC FRIENDLY_NAME \"FLAC\" SEARCH_NAMES \"FLAC\")\n    endif()\n\n    if (FIND_SFML_DEPENDENCIES_NOTFOUND)\n        set(FIND_SFML_ERROR \"SFML found but some of its dependencies are missing (${FIND_SFML_DEPENDENCIES_NOTFOUND})\")\n        set(SFML_FOUND FALSE)\n    endif()\nendif()\n"
  },
  {
    "path": "app/src/main/external/SFML/lib/cmake/SFML/SFMLConfigVersion.cmake",
    "content": "# This is a basic version file for the Config-mode of find_package().\n# It is used by write_basic_package_version_file() as input file for configure_file()\n# to create a version-file which can be installed along a config.cmake file.\n#\n# The created file sets PACKAGE_VERSION_EXACT if the current version string and\n# the requested version string are exactly the same and it sets\n# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version,\n# but only if the requested major version is the same as the current one.\n# The variable CVF_VERSION must be set before calling configure_file().\n\n\nset(PACKAGE_VERSION \"2.6.1\")\n\nif(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)\n  set(PACKAGE_VERSION_COMPATIBLE FALSE)\nelse()\n\n  if(\"2.6.1\" MATCHES \"^([0-9]+)\\\\.\")\n    set(CVF_VERSION_MAJOR \"${CMAKE_MATCH_1}\")\n    if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0)\n      string(REGEX REPLACE \"^0+\" \"\" CVF_VERSION_MAJOR \"${CVF_VERSION_MAJOR}\")\n    endif()\n  else()\n    set(CVF_VERSION_MAJOR \"2.6.1\")\n  endif()\n\n  if(PACKAGE_FIND_VERSION_RANGE)\n    # both endpoints of the range must have the expected major version\n    math (EXPR CVF_VERSION_MAJOR_NEXT \"${CVF_VERSION_MAJOR} + 1\")\n    if (NOT PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR\n        OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL \"INCLUDE\" AND NOT PACKAGE_FIND_VERSION_MAX_MAJOR STREQUAL CVF_VERSION_MAJOR)\n          OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL \"EXCLUDE\" AND NOT PACKAGE_FIND_VERSION_MAX VERSION_LESS_EQUAL CVF_VERSION_MAJOR_NEXT)))\n      set(PACKAGE_VERSION_COMPATIBLE FALSE)\n    elseif(PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR\n        AND ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL \"INCLUDE\" AND PACKAGE_VERSION VERSION_LESS_EQUAL PACKAGE_FIND_VERSION_MAX)\n        OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL \"EXCLUDE\" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MAX)))\n      set(PACKAGE_VERSION_COMPATIBLE TRUE)\n    else()\n      set(PACKAGE_VERSION_COMPATIBLE FALSE)\n    endif()\n  else()\n    if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR)\n      set(PACKAGE_VERSION_COMPATIBLE TRUE)\n    else()\n      set(PACKAGE_VERSION_COMPATIBLE FALSE)\n    endif()\n\n    if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)\n      set(PACKAGE_VERSION_EXACT TRUE)\n    endif()\n  endif()\nendif()\n\n\n# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it:\nif(\"${CMAKE_SIZEOF_VOID_P}\" STREQUAL \"\" OR \"4\" STREQUAL \"\")\n  return()\nendif()\n\n# check that the installed version has the same 32/64bit-ness as the one which is currently searching:\nif(NOT CMAKE_SIZEOF_VOID_P STREQUAL \"4\")\n  math(EXPR installedBits \"4 * 8\")\n  set(PACKAGE_VERSION \"${PACKAGE_VERSION} (${installedBits}bit)\")\n  set(PACKAGE_VERSION_UNSUITABLE TRUE)\nendif()\n"
  },
  {
    "path": "app/src/main/external/SFML/lib/cmake/SFML/SFMLSharedTargets-debug.cmake",
    "content": "#----------------------------------------------------------------\n# Generated CMake target import file for configuration \"Debug\".\n#----------------------------------------------------------------\n\n# Commands may need to know the format version.\nset(CMAKE_IMPORT_FILE_VERSION 1)\n\n# Import target \"sfml-system\" for configuration \"Debug\"\nset_property(TARGET sfml-system APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-system PROPERTIES\n  IMPORTED_IMPLIB_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-system-d.lib\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/bin/sfml-system-d-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-system )\nlist(APPEND _cmake_import_check_files_for_sfml-system \"${_IMPORT_PREFIX}/lib/sfml-system-d.lib\" \"${_IMPORT_PREFIX}/bin/sfml-system-d-2.dll\" )\n\n# Import target \"sfml-main\" for configuration \"Debug\"\nset_property(TARGET sfml-main APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-main PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG \"CXX\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-main-d.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-main )\nlist(APPEND _cmake_import_check_files_for_sfml-main \"${_IMPORT_PREFIX}/lib/sfml-main-d.lib\" )\n\n# Import target \"sfml-window\" for configuration \"Debug\"\nset_property(TARGET sfml-window APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-window PROPERTIES\n  IMPORTED_IMPLIB_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-window-d.lib\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/bin/sfml-window-d-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-window )\nlist(APPEND _cmake_import_check_files_for_sfml-window \"${_IMPORT_PREFIX}/lib/sfml-window-d.lib\" \"${_IMPORT_PREFIX}/bin/sfml-window-d-2.dll\" )\n\n# Import target \"sfml-network\" for configuration \"Debug\"\nset_property(TARGET sfml-network APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-network PROPERTIES\n  IMPORTED_IMPLIB_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-network-d.lib\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/bin/sfml-network-d-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-network )\nlist(APPEND _cmake_import_check_files_for_sfml-network \"${_IMPORT_PREFIX}/lib/sfml-network-d.lib\" \"${_IMPORT_PREFIX}/bin/sfml-network-d-2.dll\" )\n\n# Import target \"sfml-graphics\" for configuration \"Debug\"\nset_property(TARGET sfml-graphics APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-graphics PROPERTIES\n  IMPORTED_IMPLIB_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-graphics-d.lib\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/bin/sfml-graphics-d-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-graphics )\nlist(APPEND _cmake_import_check_files_for_sfml-graphics \"${_IMPORT_PREFIX}/lib/sfml-graphics-d.lib\" \"${_IMPORT_PREFIX}/bin/sfml-graphics-d-2.dll\" )\n\n# Import target \"sfml-audio\" for configuration \"Debug\"\nset_property(TARGET sfml-audio APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-audio PROPERTIES\n  IMPORTED_IMPLIB_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-audio-d.lib\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/bin/sfml-audio-d-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-audio )\nlist(APPEND _cmake_import_check_files_for_sfml-audio \"${_IMPORT_PREFIX}/lib/sfml-audio-d.lib\" \"${_IMPORT_PREFIX}/bin/sfml-audio-d-2.dll\" )\n\n# Commands beyond this point should not need to know the version.\nset(CMAKE_IMPORT_FILE_VERSION)\n"
  },
  {
    "path": "app/src/main/external/SFML/lib/cmake/SFML/SFMLSharedTargets-release.cmake",
    "content": "#----------------------------------------------------------------\n# Generated CMake target import file for configuration \"Release\".\n#----------------------------------------------------------------\n\n# Commands may need to know the format version.\nset(CMAKE_IMPORT_FILE_VERSION 1)\n\n# Import target \"sfml-system\" for configuration \"Release\"\nset_property(TARGET sfml-system APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-system PROPERTIES\n  IMPORTED_IMPLIB_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-system.lib\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/bin/sfml-system-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-system )\nlist(APPEND _cmake_import_check_files_for_sfml-system \"${_IMPORT_PREFIX}/lib/sfml-system.lib\" \"${_IMPORT_PREFIX}/bin/sfml-system-2.dll\" )\n\n# Import target \"sfml-main\" for configuration \"Release\"\nset_property(TARGET sfml-main APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-main PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE \"CXX\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-main.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-main )\nlist(APPEND _cmake_import_check_files_for_sfml-main \"${_IMPORT_PREFIX}/lib/sfml-main.lib\" )\n\n# Import target \"sfml-window\" for configuration \"Release\"\nset_property(TARGET sfml-window APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-window PROPERTIES\n  IMPORTED_IMPLIB_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-window.lib\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/bin/sfml-window-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-window )\nlist(APPEND _cmake_import_check_files_for_sfml-window \"${_IMPORT_PREFIX}/lib/sfml-window.lib\" \"${_IMPORT_PREFIX}/bin/sfml-window-2.dll\" )\n\n# Import target \"sfml-network\" for configuration \"Release\"\nset_property(TARGET sfml-network APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-network PROPERTIES\n  IMPORTED_IMPLIB_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-network.lib\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/bin/sfml-network-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-network )\nlist(APPEND _cmake_import_check_files_for_sfml-network \"${_IMPORT_PREFIX}/lib/sfml-network.lib\" \"${_IMPORT_PREFIX}/bin/sfml-network-2.dll\" )\n\n# Import target \"sfml-graphics\" for configuration \"Release\"\nset_property(TARGET sfml-graphics APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-graphics PROPERTIES\n  IMPORTED_IMPLIB_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-graphics.lib\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/bin/sfml-graphics-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-graphics )\nlist(APPEND _cmake_import_check_files_for_sfml-graphics \"${_IMPORT_PREFIX}/lib/sfml-graphics.lib\" \"${_IMPORT_PREFIX}/bin/sfml-graphics-2.dll\" )\n\n# Import target \"sfml-audio\" for configuration \"Release\"\nset_property(TARGET sfml-audio APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-audio PROPERTIES\n  IMPORTED_IMPLIB_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-audio.lib\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/bin/sfml-audio-2.dll\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-audio )\nlist(APPEND _cmake_import_check_files_for_sfml-audio \"${_IMPORT_PREFIX}/lib/sfml-audio.lib\" \"${_IMPORT_PREFIX}/bin/sfml-audio-2.dll\" )\n\n# Commands beyond this point should not need to know the version.\nset(CMAKE_IMPORT_FILE_VERSION)\n"
  },
  {
    "path": "app/src/main/external/SFML/lib/cmake/SFML/SFMLSharedTargets.cmake",
    "content": "# Generated by CMake\n\nif(\"${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}\" LESS 2.8)\n   message(FATAL_ERROR \"CMake >= 2.8.0 required\")\nendif()\nif(CMAKE_VERSION VERSION_LESS \"2.8.3\")\n   message(FATAL_ERROR \"CMake >= 2.8.3 required\")\nendif()\ncmake_policy(PUSH)\ncmake_policy(VERSION 2.8.3...3.25)\n#----------------------------------------------------------------\n# Generated CMake target import file.\n#----------------------------------------------------------------\n\n# Commands may need to know the format version.\nset(CMAKE_IMPORT_FILE_VERSION 1)\n\n# Protect against multiple inclusion, which would fail when already imported targets are added once more.\nset(_cmake_targets_defined \"\")\nset(_cmake_targets_not_defined \"\")\nset(_cmake_expected_targets \"\")\nforeach(_cmake_expected_target IN ITEMS sfml-system sfml-main sfml-window OpenGL sfml-network sfml-graphics Freetype OpenAL VORBIS FLAC sfml-audio)\n  list(APPEND _cmake_expected_targets \"${_cmake_expected_target}\")\n  if(TARGET \"${_cmake_expected_target}\")\n    list(APPEND _cmake_targets_defined \"${_cmake_expected_target}\")\n  else()\n    list(APPEND _cmake_targets_not_defined \"${_cmake_expected_target}\")\n  endif()\nendforeach()\nunset(_cmake_expected_target)\nif(_cmake_targets_defined STREQUAL _cmake_expected_targets)\n  unset(_cmake_targets_defined)\n  unset(_cmake_targets_not_defined)\n  unset(_cmake_expected_targets)\n  unset(CMAKE_IMPORT_FILE_VERSION)\n  cmake_policy(POP)\n  return()\nendif()\nif(NOT _cmake_targets_defined STREQUAL \"\")\n  string(REPLACE \";\" \", \" _cmake_targets_defined_text \"${_cmake_targets_defined}\")\n  string(REPLACE \";\" \", \" _cmake_targets_not_defined_text \"${_cmake_targets_not_defined}\")\n  message(FATAL_ERROR \"Some (but not all) targets in this export set were already defined.\\nTargets Defined: ${_cmake_targets_defined_text}\\nTargets not yet defined: ${_cmake_targets_not_defined_text}\\n\")\nendif()\nunset(_cmake_targets_defined)\nunset(_cmake_targets_not_defined)\nunset(_cmake_expected_targets)\n\n\n# Compute the installation prefix relative to this file.\nget_filename_component(_IMPORT_PREFIX \"${CMAKE_CURRENT_LIST_FILE}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"${_IMPORT_PREFIX}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"${_IMPORT_PREFIX}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"${_IMPORT_PREFIX}\" PATH)\nif(_IMPORT_PREFIX STREQUAL \"/\")\n  set(_IMPORT_PREFIX \"\")\nendif()\n\n# Create imported target sfml-system\nadd_library(sfml-system SHARED IMPORTED)\n\nset_target_properties(sfml-system PROPERTIES\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n)\n\n# Create imported target sfml-main\nadd_library(sfml-main STATIC IMPORTED)\n\nset_target_properties(sfml-main PROPERTIES\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n)\n\n# Create imported target sfml-window\nadd_library(sfml-window SHARED IMPORTED)\n\nset_target_properties(sfml-window PROPERTIES\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n  INTERFACE_LINK_LIBRARIES \"sfml-system\"\n)\n\n# Create imported target OpenGL\nadd_library(OpenGL INTERFACE IMPORTED)\n\n# Create imported target sfml-network\nadd_library(sfml-network SHARED IMPORTED)\n\nset_target_properties(sfml-network PROPERTIES\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n  INTERFACE_LINK_LIBRARIES \"sfml-system\"\n)\n\n# Create imported target sfml-graphics\nadd_library(sfml-graphics SHARED IMPORTED)\n\nset_target_properties(sfml-graphics PROPERTIES\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n  INTERFACE_LINK_LIBRARIES \"sfml-window\"\n)\n\n# Create imported target Freetype\nadd_library(Freetype INTERFACE IMPORTED)\n\n# Create imported target OpenAL\nadd_library(OpenAL INTERFACE IMPORTED)\n\n# Create imported target VORBIS\nadd_library(VORBIS INTERFACE IMPORTED)\n\nset_target_properties(VORBIS PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"OV_EXCLUDE_STATIC_CALLBACKS\"\n)\n\n# Create imported target FLAC\nadd_library(FLAC INTERFACE IMPORTED)\n\nset_target_properties(FLAC PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"FLAC__NO_DLL\"\n)\n\n# Create imported target sfml-audio\nadd_library(sfml-audio SHARED IMPORTED)\n\nset_target_properties(sfml-audio PROPERTIES\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n  INTERFACE_LINK_LIBRARIES \"sfml-system\"\n)\n\nif(CMAKE_VERSION VERSION_LESS 3.0.0)\n  message(FATAL_ERROR \"This file relies on consumers using CMake 3.0.0 or greater.\")\nendif()\n\n# Load information for each installed configuration.\nfile(GLOB _cmake_config_files \"${CMAKE_CURRENT_LIST_DIR}/SFMLSharedTargets-*.cmake\")\nforeach(_cmake_config_file IN LISTS _cmake_config_files)\n  include(\"${_cmake_config_file}\")\nendforeach()\nunset(_cmake_config_file)\nunset(_cmake_config_files)\n\n# Cleanup temporary variables.\nset(_IMPORT_PREFIX)\n\n# Loop over all imported files and verify that they actually exist\nforeach(_cmake_target IN LISTS _cmake_import_check_targets)\n  foreach(_cmake_file IN LISTS \"_cmake_import_check_files_for_${_cmake_target}\")\n    if(NOT EXISTS \"${_cmake_file}\")\n      message(FATAL_ERROR \"The imported target \\\"${_cmake_target}\\\" references the file\n   \\\"${_cmake_file}\\\"\nbut this file does not exist.  Possible reasons include:\n* The file was deleted, renamed, or moved to another location.\n* An install or uninstall procedure did not complete successfully.\n* The installation package was faulty and contained\n   \\\"${CMAKE_CURRENT_LIST_FILE}\\\"\nbut not all the files it references.\n\")\n    endif()\n  endforeach()\n  unset(_cmake_file)\n  unset(\"_cmake_import_check_files_for_${_cmake_target}\")\nendforeach()\nunset(_cmake_target)\nunset(_cmake_import_check_targets)\n\n# This file does not depend on other imported targets which have\n# been exported from the same project but in a separate export set.\n\n# Commands beyond this point should not need to know the version.\nset(CMAKE_IMPORT_FILE_VERSION)\ncmake_policy(POP)\n"
  },
  {
    "path": "app/src/main/external/SFML/lib/cmake/SFML/SFMLStaticTargets-debug.cmake",
    "content": "#----------------------------------------------------------------\n# Generated CMake target import file for configuration \"Debug\".\n#----------------------------------------------------------------\n\n# Commands may need to know the format version.\nset(CMAKE_IMPORT_FILE_VERSION 1)\n\n# Import target \"sfml-system\" for configuration \"Debug\"\nset_property(TARGET sfml-system APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-system PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG \"CXX\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-system-s-d.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-system )\nlist(APPEND _cmake_import_check_files_for_sfml-system \"${_IMPORT_PREFIX}/lib/sfml-system-s-d.lib\" )\n\n# Import target \"sfml-main\" for configuration \"Debug\"\nset_property(TARGET sfml-main APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-main PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG \"CXX\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-main-d.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-main )\nlist(APPEND _cmake_import_check_files_for_sfml-main \"${_IMPORT_PREFIX}/lib/sfml-main-d.lib\" )\n\n# Import target \"sfml-window\" for configuration \"Debug\"\nset_property(TARGET sfml-window APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-window PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG \"CXX\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-window-s-d.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-window )\nlist(APPEND _cmake_import_check_files_for_sfml-window \"${_IMPORT_PREFIX}/lib/sfml-window-s-d.lib\" )\n\n# Import target \"sfml-network\" for configuration \"Debug\"\nset_property(TARGET sfml-network APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-network PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG \"CXX\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-network-s-d.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-network )\nlist(APPEND _cmake_import_check_files_for_sfml-network \"${_IMPORT_PREFIX}/lib/sfml-network-s-d.lib\" )\n\n# Import target \"sfml-graphics\" for configuration \"Debug\"\nset_property(TARGET sfml-graphics APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-graphics PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG \"CXX\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-graphics-s-d.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-graphics )\nlist(APPEND _cmake_import_check_files_for_sfml-graphics \"${_IMPORT_PREFIX}/lib/sfml-graphics-s-d.lib\" )\n\n# Import target \"sfml-audio\" for configuration \"Debug\"\nset_property(TARGET sfml-audio APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)\nset_target_properties(sfml-audio PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG \"CXX\"\n  IMPORTED_LOCATION_DEBUG \"${_IMPORT_PREFIX}/lib/sfml-audio-s-d.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-audio )\nlist(APPEND _cmake_import_check_files_for_sfml-audio \"${_IMPORT_PREFIX}/lib/sfml-audio-s-d.lib\" )\n\n# Commands beyond this point should not need to know the version.\nset(CMAKE_IMPORT_FILE_VERSION)\n"
  },
  {
    "path": "app/src/main/external/SFML/lib/cmake/SFML/SFMLStaticTargets-release.cmake",
    "content": "#----------------------------------------------------------------\n# Generated CMake target import file for configuration \"Release\".\n#----------------------------------------------------------------\n\n# Commands may need to know the format version.\nset(CMAKE_IMPORT_FILE_VERSION 1)\n\n# Import target \"sfml-system\" for configuration \"Release\"\nset_property(TARGET sfml-system APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-system PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE \"CXX\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-system-s.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-system )\nlist(APPEND _cmake_import_check_files_for_sfml-system \"${_IMPORT_PREFIX}/lib/sfml-system-s.lib\" )\n\n# Import target \"sfml-main\" for configuration \"Release\"\nset_property(TARGET sfml-main APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-main PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE \"CXX\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-main.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-main )\nlist(APPEND _cmake_import_check_files_for_sfml-main \"${_IMPORT_PREFIX}/lib/sfml-main.lib\" )\n\n# Import target \"sfml-window\" for configuration \"Release\"\nset_property(TARGET sfml-window APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-window PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE \"CXX\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-window-s.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-window )\nlist(APPEND _cmake_import_check_files_for_sfml-window \"${_IMPORT_PREFIX}/lib/sfml-window-s.lib\" )\n\n# Import target \"sfml-network\" for configuration \"Release\"\nset_property(TARGET sfml-network APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-network PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE \"CXX\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-network-s.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-network )\nlist(APPEND _cmake_import_check_files_for_sfml-network \"${_IMPORT_PREFIX}/lib/sfml-network-s.lib\" )\n\n# Import target \"sfml-graphics\" for configuration \"Release\"\nset_property(TARGET sfml-graphics APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-graphics PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE \"CXX\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-graphics-s.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-graphics )\nlist(APPEND _cmake_import_check_files_for_sfml-graphics \"${_IMPORT_PREFIX}/lib/sfml-graphics-s.lib\" )\n\n# Import target \"sfml-audio\" for configuration \"Release\"\nset_property(TARGET sfml-audio APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)\nset_target_properties(sfml-audio PROPERTIES\n  IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE \"CXX\"\n  IMPORTED_LOCATION_RELEASE \"${_IMPORT_PREFIX}/lib/sfml-audio-s.lib\"\n  )\n\nlist(APPEND _cmake_import_check_targets sfml-audio )\nlist(APPEND _cmake_import_check_files_for_sfml-audio \"${_IMPORT_PREFIX}/lib/sfml-audio-s.lib\" )\n\n# Commands beyond this point should not need to know the version.\nset(CMAKE_IMPORT_FILE_VERSION)\n"
  },
  {
    "path": "app/src/main/external/SFML/lib/cmake/SFML/SFMLStaticTargets.cmake",
    "content": "# Generated by CMake\n\nif(\"${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}\" LESS 2.8)\n   message(FATAL_ERROR \"CMake >= 2.8.0 required\")\nendif()\nif(CMAKE_VERSION VERSION_LESS \"2.8.3\")\n   message(FATAL_ERROR \"CMake >= 2.8.3 required\")\nendif()\ncmake_policy(PUSH)\ncmake_policy(VERSION 2.8.3...3.25)\n#----------------------------------------------------------------\n# Generated CMake target import file.\n#----------------------------------------------------------------\n\n# Commands may need to know the format version.\nset(CMAKE_IMPORT_FILE_VERSION 1)\n\n# Protect against multiple inclusion, which would fail when already imported targets are added once more.\nset(_cmake_targets_defined \"\")\nset(_cmake_targets_not_defined \"\")\nset(_cmake_expected_targets \"\")\nforeach(_cmake_expected_target IN ITEMS sfml-system sfml-main sfml-window OpenGL sfml-network sfml-graphics Freetype OpenAL VORBIS FLAC sfml-audio)\n  list(APPEND _cmake_expected_targets \"${_cmake_expected_target}\")\n  if(TARGET \"${_cmake_expected_target}\")\n    list(APPEND _cmake_targets_defined \"${_cmake_expected_target}\")\n  else()\n    list(APPEND _cmake_targets_not_defined \"${_cmake_expected_target}\")\n  endif()\nendforeach()\nunset(_cmake_expected_target)\nif(_cmake_targets_defined STREQUAL _cmake_expected_targets)\n  unset(_cmake_targets_defined)\n  unset(_cmake_targets_not_defined)\n  unset(_cmake_expected_targets)\n  unset(CMAKE_IMPORT_FILE_VERSION)\n  cmake_policy(POP)\n  return()\nendif()\nif(NOT _cmake_targets_defined STREQUAL \"\")\n  string(REPLACE \";\" \", \" _cmake_targets_defined_text \"${_cmake_targets_defined}\")\n  string(REPLACE \";\" \", \" _cmake_targets_not_defined_text \"${_cmake_targets_not_defined}\")\n  message(FATAL_ERROR \"Some (but not all) targets in this export set were already defined.\\nTargets Defined: ${_cmake_targets_defined_text}\\nTargets not yet defined: ${_cmake_targets_not_defined_text}\\n\")\nendif()\nunset(_cmake_targets_defined)\nunset(_cmake_targets_not_defined)\nunset(_cmake_expected_targets)\n\n\n# Compute the installation prefix relative to this file.\nget_filename_component(_IMPORT_PREFIX \"${CMAKE_CURRENT_LIST_FILE}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"${_IMPORT_PREFIX}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"${_IMPORT_PREFIX}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"${_IMPORT_PREFIX}\" PATH)\nif(_IMPORT_PREFIX STREQUAL \"/\")\n  set(_IMPORT_PREFIX \"\")\nendif()\n\n# Create imported target sfml-system\nadd_library(sfml-system STATIC IMPORTED)\n\nset_target_properties(sfml-system PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"SFML_STATIC\"\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n  INTERFACE_LINK_LIBRARIES \"\\$<LINK_ONLY:winmm>\"\n)\n\n# Create imported target sfml-main\nadd_library(sfml-main STATIC IMPORTED)\n\nset_target_properties(sfml-main PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"SFML_STATIC\"\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n)\n\n# Create imported target sfml-window\nadd_library(sfml-window STATIC IMPORTED)\n\nset_target_properties(sfml-window PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"SFML_STATIC\"\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n  INTERFACE_LINK_LIBRARIES \"sfml-system;\\$<LINK_ONLY:OpenGL>;\\$<LINK_ONLY:winmm>;\\$<LINK_ONLY:gdi32>\"\n)\n\n# Create imported target OpenGL\nadd_library(OpenGL INTERFACE IMPORTED)\n\n# Create imported target sfml-network\nadd_library(sfml-network STATIC IMPORTED)\n\nset_target_properties(sfml-network PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"SFML_STATIC\"\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n  INTERFACE_LINK_LIBRARIES \"sfml-system;\\$<LINK_ONLY:ws2_32>\"\n)\n\n# Create imported target sfml-graphics\nadd_library(sfml-graphics STATIC IMPORTED)\n\nset_target_properties(sfml-graphics PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"SFML_STATIC\"\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n  INTERFACE_LINK_LIBRARIES \"sfml-window;\\$<LINK_ONLY:legacy_stdio_definitions.lib>;\\$<LINK_ONLY:Freetype>\"\n)\n\n# Create imported target Freetype\nadd_library(Freetype INTERFACE IMPORTED)\n\n# Create imported target OpenAL\nadd_library(OpenAL INTERFACE IMPORTED)\n\n# Create imported target VORBIS\nadd_library(VORBIS INTERFACE IMPORTED)\n\nset_target_properties(VORBIS PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"OV_EXCLUDE_STATIC_CALLBACKS\"\n)\n\n# Create imported target FLAC\nadd_library(FLAC INTERFACE IMPORTED)\n\nset_target_properties(FLAC PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"FLAC__NO_DLL\"\n)\n\n# Create imported target sfml-audio\nadd_library(sfml-audio STATIC IMPORTED)\n\nset_target_properties(sfml-audio PROPERTIES\n  INTERFACE_COMPILE_DEFINITIONS \"SFML_STATIC\"\n  INTERFACE_INCLUDE_DIRECTORIES \"${_IMPORT_PREFIX}/include\"\n  INTERFACE_LINK_LIBRARIES \"\\$<LINK_ONLY:OpenAL>;sfml-system;\\$<LINK_ONLY:VORBIS>;\\$<LINK_ONLY:FLAC>\"\n)\n\nif(CMAKE_VERSION VERSION_LESS 3.0.0)\n  message(FATAL_ERROR \"This file relies on consumers using CMake 3.0.0 or greater.\")\nendif()\n\n# Load information for each installed configuration.\nfile(GLOB _cmake_config_files \"${CMAKE_CURRENT_LIST_DIR}/SFMLStaticTargets-*.cmake\")\nforeach(_cmake_config_file IN LISTS _cmake_config_files)\n  include(\"${_cmake_config_file}\")\nendforeach()\nunset(_cmake_config_file)\nunset(_cmake_config_files)\n\n# Cleanup temporary variables.\nset(_IMPORT_PREFIX)\n\n# Loop over all imported files and verify that they actually exist\nforeach(_cmake_target IN LISTS _cmake_import_check_targets)\n  foreach(_cmake_file IN LISTS \"_cmake_import_check_files_for_${_cmake_target}\")\n    if(NOT EXISTS \"${_cmake_file}\")\n      message(FATAL_ERROR \"The imported target \\\"${_cmake_target}\\\" references the file\n   \\\"${_cmake_file}\\\"\nbut this file does not exist.  Possible reasons include:\n* The file was deleted, renamed, or moved to another location.\n* An install or uninstall procedure did not complete successfully.\n* The installation package was faulty and contained\n   \\\"${CMAKE_CURRENT_LIST_FILE}\\\"\nbut not all the files it references.\n\")\n    endif()\n  endforeach()\n  unset(_cmake_file)\n  unset(\"_cmake_import_check_files_for_${_cmake_target}\")\nendforeach()\nunset(_cmake_target)\nunset(_cmake_import_check_targets)\n\n# This file does not depend on other imported targets which have\n# been exported from the same project but in a separate export set.\n\n# Commands beyond this point should not need to know the version.\nset(CMAKE_IMPORT_FILE_VERSION)\ncmake_policy(POP)\n"
  },
  {
    "path": "app/src/main/is-Engine-linux-SDL2.cbp",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<CodeBlocks_project_file>\n\t<FileVersion major=\"1\" minor=\"6\" />\n\t<Project>\n\t\t<Option title=\"is-Engine-linux-SDL2\" />\n\t\t<Option pch_mode=\"2\" />\n\t\t<Option compiler=\"gcc\" />\n\t\t<Build>\n\t\t\t<Target title=\"Debug\">\n\t\t\t\t<Option output=\"bin-codeblocks/Debug/is-Engine-linux-SDL2\" prefix_auto=\"1\" extension_auto=\"1\" />\n\t\t\t\t<Option object_output=\"bin-codeblocks/Debug/\" />\n\t\t\t\t<Option type=\"1\" />\n\t\t\t\t<Option compiler=\"gcc\" />\n\t\t\t\t<Compiler>\n\t\t\t\t\t<Add option=\"-g\" />\n\t\t\t\t</Compiler>\n\t\t\t</Target>\n\t\t\t<Target title=\"Release\">\n\t\t\t\t<Option output=\"bin-codeblocks/Release/is-Engine-linux-SDL2\" prefix_auto=\"1\" extension_auto=\"1\" />\n\t\t\t\t<Option object_output=\"bin-codeblocks/Release/\" />\n\t\t\t\t<Option type=\"0\" />\n\t\t\t\t<Option compiler=\"gcc\" />\n\t\t\t\t<Compiler>\n\t\t\t\t\t<Add option=\"-O2\" />\n\t\t\t\t</Compiler>\n\t\t\t\t<Linker>\n\t\t\t\t\t<Add option=\"-s\" />\n\t\t\t\t</Linker>\n\t\t\t</Target>\n\t\t</Build>\n\t\t<Compiler>\n\t\t\t<Add option=\"-Wall\" />\n\t\t\t<Add option=\"-std=c++17\" />\n\t\t\t<Add option=\"`sdl2-config --cflags`\" />\n\t\t\t<Add option=\"-DIS_ENGINE_SDL_2\" />\n\t\t\t<Add option=\"-DIS_ENGINE_LINUX\" />\n\t\t</Compiler>\n\t\t<Linker>\n\t\t\t<Add option=\"`sdl2-config --libs`\" />\n\t\t\t<Add library=\"SDL2_image\" />\n\t\t\t<Add library=\"SDL2_mixer\" />\n\t\t\t<Add library=\"SDL2_ttf\" />\n\t\t</Linker>\n<Unit filename=\"cpp/GameDialog.cpp\" />\n\t\t<Unit filename=\"cpp/GameDisplay.cpp\" />\n\t\t<Unit filename=\"cpp/GameEngine.cpp\" />\n\t\t<Unit filename=\"cpp/GameFunction.cpp\" />\n\t\t<Unit filename=\"cpp/GameKeyData.cpp\" />\n\t\t<Unit filename=\"cpp/GameSlider.cpp\" />\n\t\t<Unit filename=\"cpp/GameSystem.cpp\" />\n\t\t<Unit filename=\"cpp/GameSystemExtended.cpp\" />\n\t\t<Unit filename=\"cpp/GameTime.cpp\" />\n\t\t<Unit filename=\"cpp/MainObject.cpp\" />\n\t\t<Unit filename=\"cpp/SDL_android_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/TransitionEffect.cpp\" />\n\t\t<Unit filename=\"cpp/app_src/activity/GameActivity.h\" />\n\t\t<Unit filename=\"cpp/app_src/config/ExtraConfig.h\" />\n\t\t<Unit filename=\"cpp/app_src/config/GameConfig.h\" />\n\t\t<Unit filename=\"cpp/app_src/gamesystem_ext/GameSystemExtended.h\" />\n\t\t<Unit filename=\"cpp/app_src/language/GameLanguage.h\" />\n\t\t<Unit filename=\"cpp/app_src/levels/Level.h\" />\n\t\t<Unit filename=\"cpp/app_src/objects/HelloWorld.h\" />\n\t\t<Unit filename=\"cpp/app_src/objects/widgets/GameDialog.h\" />\n\t\t<Unit filename=\"cpp/app_src/scenes/CRTEffect.h\" />\n\t\t<Unit filename=\"cpp/app_src/scenes/HelloScene/HelloScene.h\" />\n\t\t<Unit filename=\"cpp/b2BlockAllocator.cpp\" />\n\t\t<Unit filename=\"cpp/b2Body.cpp\" />\n\t\t<Unit filename=\"cpp/b2BroadPhase.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainAndPolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2CircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2CircleShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollideCircle.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollideEdge.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollidePolygon.cpp\" />\n\t\t<Unit filename=\"cpp/b2Collision.cpp\" />\n\t\t<Unit filename=\"cpp/b2Contact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ContactManager.cpp\" />\n\t\t<Unit filename=\"cpp/b2ContactSolver.cpp\" />\n\t\t<Unit filename=\"cpp/b2Distance.cpp\" />\n\t\t<Unit filename=\"cpp/b2DistanceJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Draw.cpp\" />\n\t\t<Unit filename=\"cpp/b2DynamicTree.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeAndPolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2Fixture.cpp\" />\n\t\t<Unit filename=\"cpp/b2FrictionJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2GearJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Island.cpp\" />\n\t\t<Unit filename=\"cpp/b2Joint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Math.cpp\" />\n\t\t<Unit filename=\"cpp/b2MotorJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2MouseJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2PrismaticJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2PulleyJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2RevoluteJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Rope.cpp\" />\n\t\t<Unit filename=\"cpp/b2RopeJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Settings.cpp\" />\n\t\t<Unit filename=\"cpp/b2StackAllocator.cpp\" />\n\t\t<Unit filename=\"cpp/b2TimeOfImpact.cpp\" />\n\t\t<Unit filename=\"cpp/b2Timer.cpp\" />\n\t\t<Unit filename=\"cpp/b2WeldJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2WheelJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2World.cpp\" />\n\t\t<Unit filename=\"cpp/b2WorldCallbacks.cpp\" />\n\t\t<Unit filename=\"cpp/basicSFMLmain.cpp\" />\n\t\t<Unit filename=\"cpp/isEngineSDLWrapper.cpp\" />\n\t\t<Unit filename=\"cpp/isEngineWrapper.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/core/ActivityController.h\" />\n\t\t<Unit filename=\"cpp/isEngine/core/GameEngine.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Box2D.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2Shape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2BroadPhase.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2Collision.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2Distance.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2DynamicTree.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Draw.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2GrowableStack.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Math.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Settings.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2StackAllocator.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Timer.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2DistanceJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2FrictionJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2GearJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MotorJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MouseJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RopeJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WeldJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WheelJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Body.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2ContactManager.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Island.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2World.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Rope/b2Rope.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Config.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/FreeFuncs.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/FreeFuncs.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ImageLayer.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ImageLayer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Layer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/LayerGroup.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/LayerGroup.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Map.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Map.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Object.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Object.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ObjectGroup.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ObjectGroup.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Property.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Property.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/TileLayer.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/TileLayer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Tileset.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Tileset.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Types.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/Android.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/Log.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugiconfig.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugixml.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugixml.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/miniz.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/miniz.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/TinyDialogBox.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/GameDisplay.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/SDM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/SDMBlitSDLSprite.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Background.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Button.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Form.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/MainObject.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/DepthObject.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Destructible.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/FilePath.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Health.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/HurtEffect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Name.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/ScorePoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Step.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Type.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Visibilty.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameFunction.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameKeyData.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameKeyName.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameSlider.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameSystem.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameTime.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GRM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GameFont.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GameTexture.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/TransitionEffect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isEngineSDLWrapper.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isEngineWrapper.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isLibConnect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GSM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GameMusic.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GameSound.h\" />\n\t\t<Unit filename=\"cpp/main.cpp\" />\n\t\t<Extensions />\n\t</Project>\n</CodeBlocks_project_file>\n"
  },
  {
    "path": "app/src/main/is-Engine-linux.cbp",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<CodeBlocks_project_file>\n\t<FileVersion major=\"1\" minor=\"6\" />\n\t<Project>\n\t\t<Option title=\"is-Engine-linux\" />\n\t\t<Option pch_mode=\"2\" />\n\t\t<Option compiler=\"gcc\" />\n\t\t<Build>\n\t\t\t<Target title=\"Debug\">\n\t\t\t\t<Option output=\"bin-codeblocks/Debug/is-Engine-linux\" prefix_auto=\"1\" extension_auto=\"1\" />\n\t\t\t\t<Option object_output=\"bin-codeblocks/Debug/\" />\n\t\t\t\t<Option type=\"1\" />\n\t\t\t\t<Option compiler=\"gcc\" />\n\t\t\t\t<Compiler>\n\t\t\t\t\t<Add option=\"-std=c++17\" />\n\t\t\t\t\t<Add option=\"-g\" />\n\t\t\t\t</Compiler>\n\t\t\t\t<Linker>\n\t\t\t\t\t<Add library=\"sfml-audio\" />\n\t\t\t\t\t<Add library=\"sfml-network\" />\n\t\t\t\t\t<Add library=\"sfml-graphics\" />\n\t\t\t\t\t<Add library=\"sfml-window\" />\n\t\t\t\t\t<Add library=\"sfml-system\" />\n\t\t\t\t</Linker>\n\t\t\t</Target>\n\t\t\t<Target title=\"Release\">\n\t\t\t\t<Option output=\"bin-codeblocks/Release/is-Engine-linux\" prefix_auto=\"1\" extension_auto=\"1\" />\n\t\t\t\t<Option object_output=\"bin-codeblocks/Release/\" />\n\t\t\t\t<Option type=\"0\" />\n\t\t\t\t<Option compiler=\"gcc\" />\n\t\t\t\t<Compiler>\n\t\t\t\t\t<Add option=\"-O2\" />\n\t\t\t\t\t<Add option=\"-std=c++17\" />\n\t\t\t\t</Compiler>\n\t\t\t\t<Linker>\n\t\t\t\t\t<Add option=\"-s\" />\n\t\t\t\t\t<Add library=\"sfml-audio\" />\n\t\t\t\t\t<Add library=\"sfml-network\" />\n\t\t\t\t\t<Add library=\"sfml-graphics\" />\n\t\t\t\t\t<Add library=\"sfml-window\" />\n\t\t\t\t\t<Add library=\"sfml-system\" />\n\t\t\t\t</Linker>\n\t\t\t</Target>\n\t\t</Build>\n\t\t<Compiler>\n\t\t\t<Add option=\"-Wall\" />\n\t\t\t<Add option=\"-std=c++17\" />\n\t\t</Compiler>\n\t\t<Unit filename=\"cpp/GameDialog.cpp\" />\n\t\t<Unit filename=\"cpp/GameDisplay.cpp\" />\n\t\t<Unit filename=\"cpp/GameEngine.cpp\" />\n\t\t<Unit filename=\"cpp/GameFunction.cpp\" />\n\t\t<Unit filename=\"cpp/GameKeyData.cpp\" />\n\t\t<Unit filename=\"cpp/GameSlider.cpp\" />\n\t\t<Unit filename=\"cpp/GameSystem.cpp\" />\n\t\t<Unit filename=\"cpp/GameSystemExtended.cpp\" />\n\t\t<Unit filename=\"cpp/GameTime.cpp\" />\n\t\t<Unit filename=\"cpp/MainObject.cpp\" />\n\t\t<Unit filename=\"cpp/SDL_android_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/TransitionEffect.cpp\" />\n\t\t<Unit filename=\"cpp/app_src/activity/GameActivity.h\" />\n\t\t<Unit filename=\"cpp/app_src/config/ExtraConfig.h\" />\n\t\t<Unit filename=\"cpp/app_src/config/GameConfig.h\" />\n\t\t<Unit filename=\"cpp/app_src/gamesystem_ext/GameSystemExtended.h\" />\n\t\t<Unit filename=\"cpp/app_src/language/GameLanguage.h\" />\n\t\t<Unit filename=\"cpp/app_src/levels/Level.h\" />\n\t\t<Unit filename=\"cpp/app_src/objects/HelloWorld.h\" />\n\t\t<Unit filename=\"cpp/app_src/objects/widgets/GameDialog.h\" />\n\t\t<Unit filename=\"cpp/app_src/scenes/CRTEffect.h\" />\n\t\t<Unit filename=\"cpp/app_src/scenes/HelloScene/HelloScene.h\" />\n\t\t<Unit filename=\"cpp/b2BlockAllocator.cpp\" />\n\t\t<Unit filename=\"cpp/b2Body.cpp\" />\n\t\t<Unit filename=\"cpp/b2BroadPhase.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainAndPolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2CircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2CircleShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollideCircle.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollideEdge.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollidePolygon.cpp\" />\n\t\t<Unit filename=\"cpp/b2Collision.cpp\" />\n\t\t<Unit filename=\"cpp/b2Contact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ContactManager.cpp\" />\n\t\t<Unit filename=\"cpp/b2ContactSolver.cpp\" />\n\t\t<Unit filename=\"cpp/b2Distance.cpp\" />\n\t\t<Unit filename=\"cpp/b2DistanceJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Draw.cpp\" />\n\t\t<Unit filename=\"cpp/b2DynamicTree.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeAndPolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2Fixture.cpp\" />\n\t\t<Unit filename=\"cpp/b2FrictionJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2GearJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Island.cpp\" />\n\t\t<Unit filename=\"cpp/b2Joint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Math.cpp\" />\n\t\t<Unit filename=\"cpp/b2MotorJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2MouseJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2PrismaticJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2PulleyJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2RevoluteJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Rope.cpp\" />\n\t\t<Unit filename=\"cpp/b2RopeJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Settings.cpp\" />\n\t\t<Unit filename=\"cpp/b2StackAllocator.cpp\" />\n\t\t<Unit filename=\"cpp/b2TimeOfImpact.cpp\" />\n\t\t<Unit filename=\"cpp/b2Timer.cpp\" />\n\t\t<Unit filename=\"cpp/b2WeldJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2WheelJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2World.cpp\" />\n\t\t<Unit filename=\"cpp/b2WorldCallbacks.cpp\" />\n\t\t<Unit filename=\"cpp/basicSFMLmain.cpp\" />\n\t\t<Unit filename=\"cpp/isEngineSDLWrapper.cpp\" />\n\t\t<Unit filename=\"cpp/isEngineWrapper.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/core/ActivityController.h\" />\n\t\t<Unit filename=\"cpp/isEngine/core/GameEngine.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Box2D.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2Shape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2BroadPhase.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2Collision.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2Distance.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2DynamicTree.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Draw.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2GrowableStack.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Math.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Settings.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2StackAllocator.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Timer.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2DistanceJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2FrictionJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2GearJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MotorJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MouseJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RopeJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WeldJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WheelJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Body.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2ContactManager.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Island.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2World.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Rope/b2Rope.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Config.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/FreeFuncs.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/FreeFuncs.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ImageLayer.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ImageLayer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Layer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/LayerGroup.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/LayerGroup.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Map.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Map.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Object.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Object.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ObjectGroup.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ObjectGroup.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Property.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Property.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/TileLayer.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/TileLayer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Tileset.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Tileset.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Types.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/Android.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/Log.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugiconfig.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugixml.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugixml.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/miniz.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/miniz.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/TinyDialogBox.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/GameDisplay.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/SDM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/SDMBlitSDLSprite.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Background.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Button.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Form.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/MainObject.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/DepthObject.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Destructible.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/FilePath.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Health.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/HurtEffect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Name.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/ScorePoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Step.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Type.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Visibilty.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameFunction.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameKeyData.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameKeyName.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameSlider.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameSystem.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameTime.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GRM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GameFont.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GameTexture.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/TransitionEffect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isEngineSDLWrapper.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isEngineWrapper.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isLibConnect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GSM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GameMusic.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GameSound.h\" />\n\t\t<Unit filename=\"cpp/main.cpp\" />\n\t\t<Extensions />\n\t</Project>\n</CodeBlocks_project_file>\n"
  },
  {
    "path": "app/src/main/is-Engine-windows-SDL2.cbp",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<CodeBlocks_project_file>\n\t<FileVersion major=\"1\" minor=\"6\" />\n\t<Project>\n\t\t<Option title=\"is-Engine-windows\" />\n\t\t<Option pch_mode=\"2\" />\n\t\t<Option compiler=\"gcc\" />\n\t\t<Build>\n\t\t\t<Target title=\"Debug\">\n\t\t\t\t<Option output=\"bin-codeblocks/Debug/is-Engine-windows\" prefix_auto=\"1\" extension_auto=\"1\" />\n\t\t\t\t<Option object_output=\"bin-codeblocks/obj/Debug/\" />\n\t\t\t\t<Option type=\"1\" />\n\t\t\t\t<Option compiler=\"gcc\" />\n\t\t\t\t<Compiler>\n\t\t\t\t\t<Add option=\"-g\" />\n\t\t\t\t</Compiler>\n\t\t\t</Target>\n\t\t\t<Target title=\"Release\">\n\t\t\t\t<Option output=\"bin-codeblocks/Release/is-Engine-windows\" prefix_auto=\"1\" extension_auto=\"1\" />\n\t\t\t\t<Option object_output=\"bin-codeblocks/obj/Release/\" />\n\t\t\t\t<Option type=\"0\" />\n\t\t\t\t<Option compiler=\"gcc\" />\n\t\t\t\t<Compiler>\n\t\t\t\t\t<Add option=\"-O2\" />\n\t\t\t\t</Compiler>\n\t\t\t\t<Linker>\n\t\t\t\t\t<Add option=\"-s\" />\n\t\t\t\t</Linker>\n\t\t\t</Target>\n\t\t</Build>\n\t\t<Compiler>\n\t\t\t<Add option=\"-Wall\" />\n\t\t\t<Add option=\"-DIS_ENGINE_SDL_2\" />\n\t\t\t<Add directory=\"C:/SDL2/x86_64-w64-mingw32/include/SDL2\" />\n\t\t</Compiler>\n\t\t<Linker>\n\t\t\t<Add library=\"mingw32\" />\n\t\t\t<Add library=\"user32\" />\n\t\t\t<Add library=\"gdi32\" />\n\t\t\t<Add library=\"winmm\" />\n\t\t\t<Add library=\"dxguid\" />\n\t\t\t<Add library=\"kernel32\" />\n\t\t\t<Add library=\"comctl32\" />\n\t\t\t<Add library=\"Ole32\" />\n\t\t\t<Add library=\"comdlg32\" />\n\t\t\t<Add library=\"SDL2main\" />\n\t\t\t<Add library=\"SDL2.dll\" />\n\t\t\t<Add library=\"SDL2_image.dll\" />\n\t\t\t<Add library=\"SDL2_image\" />\n\t\t\t<Add library=\"SDL2_mixer.dll\" />\n\t\t\t<Add library=\"SDL2_mixer\" />\n\t\t\t<Add library=\"SDL2_ttf.dll\" />\n\t\t\t<Add library=\"SDL2_ttf\" />\n\t\t\t<Add directory=\"C:/SDL2/x86_64-w64-mingw32/lib\" />\n\t\t</Linker>\n\t\t<ExtraCommands>\n\t\t\t<Add after=\"XCOPY $(#sdl2)\\bin\\*.dll $(TARGET_OUTPUT_DIR) /D /Y\" />\n\t\t</ExtraCommands>\n\t\t<Unit filename=\"codeblocks/resource.rc\">\n\t\t\t<Option compilerVar=\"WINDRES\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/GameDialog.cpp\" />\n\t\t<Unit filename=\"cpp/GameDisplay.cpp\" />\n\t\t<Unit filename=\"cpp/GameEngine.cpp\" />\n\t\t<Unit filename=\"cpp/GameFunction.cpp\" />\n\t\t<Unit filename=\"cpp/GameKeyData.cpp\" />\n\t\t<Unit filename=\"cpp/GameSlider.cpp\" />\n\t\t<Unit filename=\"cpp/GameSystem.cpp\" />\n\t\t<Unit filename=\"cpp/GameSystemExtended.cpp\" />\n\t\t<Unit filename=\"cpp/GameTime.cpp\" />\n\t\t<Unit filename=\"cpp/MainObject.cpp\" />\n\t\t<Unit filename=\"cpp/SDL_android_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/TransitionEffect.cpp\" />\n\t\t<Unit filename=\"cpp/app_src/activity/GameActivity.h\" />\n\t\t<Unit filename=\"cpp/app_src/config/ExtraConfig.h\" />\n\t\t<Unit filename=\"cpp/app_src/config/GameConfig.h\" />\n\t\t<Unit filename=\"cpp/app_src/gamesystem_ext/GameSystemExtended.h\" />\n\t\t<Unit filename=\"cpp/app_src/language/GameLanguage.h\" />\n\t\t<Unit filename=\"cpp/app_src/levels/Level.h\" />\n\t\t<Unit filename=\"cpp/app_src/objects/HelloWorld.h\" />\n\t\t<Unit filename=\"cpp/app_src/objects/widgets/GameDialog.h\" />\n\t\t<Unit filename=\"cpp/app_src/scenes/HelloScene/HelloScene.h\" />\n\t\t<Unit filename=\"cpp/b2BlockAllocator.cpp\" />\n\t\t<Unit filename=\"cpp/b2Body.cpp\" />\n\t\t<Unit filename=\"cpp/b2BroadPhase.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainAndPolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2CircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2CircleShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollideCircle.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollideEdge.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollidePolygon.cpp\" />\n\t\t<Unit filename=\"cpp/b2Collision.cpp\" />\n\t\t<Unit filename=\"cpp/b2Contact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ContactManager.cpp\" />\n\t\t<Unit filename=\"cpp/b2ContactSolver.cpp\" />\n\t\t<Unit filename=\"cpp/b2Distance.cpp\" />\n\t\t<Unit filename=\"cpp/b2DistanceJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Draw.cpp\" />\n\t\t<Unit filename=\"cpp/b2DynamicTree.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeAndPolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2Fixture.cpp\" />\n\t\t<Unit filename=\"cpp/b2FrictionJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2GearJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Island.cpp\" />\n\t\t<Unit filename=\"cpp/b2Joint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Math.cpp\" />\n\t\t<Unit filename=\"cpp/b2MotorJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2MouseJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2PrismaticJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2PulleyJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2RevoluteJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Rope.cpp\" />\n\t\t<Unit filename=\"cpp/b2RopeJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Settings.cpp\" />\n\t\t<Unit filename=\"cpp/b2StackAllocator.cpp\" />\n\t\t<Unit filename=\"cpp/b2TimeOfImpact.cpp\" />\n\t\t<Unit filename=\"cpp/b2Timer.cpp\" />\n\t\t<Unit filename=\"cpp/b2WeldJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2WheelJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2World.cpp\" />\n\t\t<Unit filename=\"cpp/b2WorldCallbacks.cpp\" />\n\t\t<Unit filename=\"cpp/basicSFMLmain.cpp\" />\n\t\t<Unit filename=\"cpp/isEngineSDLWrapper.cpp\" />\n\t\t<Unit filename=\"cpp/isEngineWrapper.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/core/ActivityController.h\" />\n\t\t<Unit filename=\"cpp/isEngine/core/GameEngine.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Box2D.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2Shape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2BroadPhase.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2Collision.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2Distance.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2DynamicTree.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Draw.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2GrowableStack.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Math.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Settings.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2StackAllocator.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Timer.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2DistanceJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2FrictionJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2GearJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MotorJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MouseJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RopeJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WeldJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WheelJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Body.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2ContactManager.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Island.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2World.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Rope/b2Rope.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Config.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/FreeFuncs.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/FreeFuncs.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ImageLayer.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ImageLayer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Layer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/LayerGroup.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/LayerGroup.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Map.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Map.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Object.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Object.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ObjectGroup.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ObjectGroup.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Property.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Property.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/TileLayer.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/TileLayer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Tileset.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Tileset.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Types.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/Android.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/Log.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugiconfig.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugixml.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugixml.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/miniz.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/miniz.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/TinyDialogBox.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/GameDisplay.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/SDM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/SDMBlitSDLSprite.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Background.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Button.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Form.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/MainObject.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/DepthObject.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Destructible.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/FilePath.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Health.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/HurtEffect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Name.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/ScorePoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Step.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Type.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Visibilty.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameFunction.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameKeyData.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameKeyName.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameSlider.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameSystem.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameTime.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GRM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GameFont.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GameTexture.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/TransitionEffect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isEngineSDLWrapper.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isEngineWrapper.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isLibConnect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GSM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GameMusic.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GameSound.h\" />\n\t\t<Unit filename=\"cpp/main.cpp\" />\n\t\t<Extensions>\n\t\t\t<lib_finder disable_auto=\"1\" />\n\t\t</Extensions>\n\t</Project>\n</CodeBlocks_project_file>\n"
  },
  {
    "path": "app/src/main/is-Engine-windows.cbp",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<CodeBlocks_project_file>\n\t<FileVersion major=\"1\" minor=\"6\" />\n\t<Project>\n\t\t<Option title=\"is-Engine-windows\" />\n\t\t<Option pch_mode=\"2\" />\n\t\t<Option compiler=\"gcc\" />\n\t\t<Build>\n\t\t\t<Target title=\"Debug\">\n\t\t\t\t<Option output=\"bin-codeblocks/Debug/is-Engine-windows\" prefix_auto=\"1\" extension_auto=\"1\" />\n\t\t\t\t<Option object_output=\"bin-codeblocks/obj/Debug/\" />\n\t\t\t\t<Option type=\"1\" />\n\t\t\t\t<Option compiler=\"gcc\" />\n\t\t\t\t<Compiler>\n\t\t\t\t\t<Add option=\"-g\" />\n\t\t\t\t</Compiler>\n\t\t\t\t<Linker>\n\t\t\t\t\t<Add library=\"sfml-audio-d\" />\n\t\t\t\t\t<Add library=\"sfml-network-d\" />\n\t\t\t\t\t<Add library=\"sfml-graphics-d\" />\n\t\t\t\t\t<Add library=\"sfml-window-d\" />\n\t\t\t\t\t<Add library=\"sfml-system-d\" />\n\t\t\t\t</Linker>\n\t\t\t</Target>\n\t\t\t<Target title=\"Release\">\n\t\t\t\t<Option output=\"bin-codeblocks/Release/is-Engine-windows\" prefix_auto=\"1\" extension_auto=\"1\" />\n\t\t\t\t<Option object_output=\"bin-codeblocks/obj/Release/\" />\n\t\t\t\t<Option type=\"0\" />\n\t\t\t\t<Option compiler=\"gcc\" />\n\t\t\t\t<Compiler>\n\t\t\t\t\t<Add option=\"-O2\" />\n\t\t\t\t</Compiler>\n\t\t\t\t<Linker>\n\t\t\t\t\t<Add option=\"-s\" />\n\t\t\t\t\t<Add library=\"sfml-audio\" />\n\t\t\t\t\t<Add library=\"sfml-network-d\" />\n\t\t\t\t\t<Add library=\"sfml-graphics\" />\n\t\t\t\t\t<Add library=\"sfml-window\" />\n\t\t\t\t\t<Add library=\"sfml-system\" />\n\t\t\t\t</Linker>\n\t\t\t</Target>\n\t\t</Build>\n\t\t<Compiler>\n\t\t\t<Add option=\"-Wall\" />\n\t\t\t<Add option=\"-std=gnu++17\" />\n\t\t\t<Add option=\"-std=c17\" />\n\t\t\t<Add directory=\"C:/SFML_CB_MinGW/include\" />\n\t\t</Compiler>\n\t\t<Linker>\n\t\t\t<Add library=\"mingw32\" />\n\t\t\t<Add library=\"user32\" />\n\t\t\t<Add library=\"gdi32\" />\n\t\t\t<Add library=\"winmm\" />\n\t\t\t<Add library=\"dxguid\" />\n\t\t\t<Add library=\"kernel32\" />\n\t\t\t<Add library=\"comctl32\" />\n\t\t\t<Add library=\"Ole32\" />\n\t\t\t<Add library=\"comdlg32\" />\n\t\t\t<Add directory=\"C:/SFML_CB_MinGW/lib\" />\n\t\t</Linker>\n\t\t<Unit filename=\"codeblocks/resource.rc\">\n\t\t\t<Option compilerVar=\"WINDRES\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/GameDialog.cpp\" />\n\t\t<Unit filename=\"cpp/GameDisplay.cpp\" />\n\t\t<Unit filename=\"cpp/GameEngine.cpp\" />\n\t\t<Unit filename=\"cpp/GameFunction.cpp\" />\n\t\t<Unit filename=\"cpp/GameKeyData.cpp\" />\n\t\t<Unit filename=\"cpp/GameSlider.cpp\" />\n\t\t<Unit filename=\"cpp/GameSystem.cpp\" />\n\t\t<Unit filename=\"cpp/GameSystemExtended.cpp\" />\n\t\t<Unit filename=\"cpp/GameTime.cpp\" />\n\t\t<Unit filename=\"cpp/MainObject.cpp\" />\n\t\t<Unit filename=\"cpp/SDL_android_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/TransitionEffect.cpp\" />\n\t\t<Unit filename=\"cpp/app_src/activity/GameActivity.h\" />\n\t\t<Unit filename=\"cpp/app_src/config/ExtraConfig.h\" />\n\t\t<Unit filename=\"cpp/app_src/config/GameConfig.h\" />\n\t\t<Unit filename=\"cpp/app_src/gamesystem_ext/GameSystemExtended.h\" />\n\t\t<Unit filename=\"cpp/app_src/language/GameLanguage.h\" />\n\t\t<Unit filename=\"cpp/app_src/levels/Level.h\" />\n\t\t<Unit filename=\"cpp/app_src/objects/HelloWorld.h\" />\n\t\t<Unit filename=\"cpp/app_src/objects/widgets/GameDialog.h\" />\n\t\t<Unit filename=\"cpp/app_src/scenes/CRTEffect.h\" />\n\t\t<Unit filename=\"cpp/app_src/scenes/HelloScene/HelloScene.h\" />\n\t\t<Unit filename=\"cpp/b2BlockAllocator.cpp\" />\n\t\t<Unit filename=\"cpp/b2Body.cpp\" />\n\t\t<Unit filename=\"cpp/b2BroadPhase.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainAndPolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ChainShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2CircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2CircleShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollideCircle.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollideEdge.cpp\" />\n\t\t<Unit filename=\"cpp/b2CollidePolygon.cpp\" />\n\t\t<Unit filename=\"cpp/b2Collision.cpp\" />\n\t\t<Unit filename=\"cpp/b2Contact.cpp\" />\n\t\t<Unit filename=\"cpp/b2ContactManager.cpp\" />\n\t\t<Unit filename=\"cpp/b2ContactSolver.cpp\" />\n\t\t<Unit filename=\"cpp/b2Distance.cpp\" />\n\t\t<Unit filename=\"cpp/b2DistanceJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Draw.cpp\" />\n\t\t<Unit filename=\"cpp/b2DynamicTree.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeAndPolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2EdgeShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2Fixture.cpp\" />\n\t\t<Unit filename=\"cpp/b2FrictionJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2GearJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Island.cpp\" />\n\t\t<Unit filename=\"cpp/b2Joint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Math.cpp\" />\n\t\t<Unit filename=\"cpp/b2MotorJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2MouseJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonAndCircleContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonContact.cpp\" />\n\t\t<Unit filename=\"cpp/b2PolygonShape.cpp\" />\n\t\t<Unit filename=\"cpp/b2PrismaticJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2PulleyJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2RevoluteJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Rope.cpp\" />\n\t\t<Unit filename=\"cpp/b2RopeJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2Settings.cpp\" />\n\t\t<Unit filename=\"cpp/b2StackAllocator.cpp\" />\n\t\t<Unit filename=\"cpp/b2TimeOfImpact.cpp\" />\n\t\t<Unit filename=\"cpp/b2Timer.cpp\" />\n\t\t<Unit filename=\"cpp/b2WeldJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2WheelJoint.cpp\" />\n\t\t<Unit filename=\"cpp/b2World.cpp\" />\n\t\t<Unit filename=\"cpp/b2WorldCallbacks.cpp\" />\n\t\t<Unit filename=\"cpp/basicSFMLmain.cpp\" />\n\t\t<Unit filename=\"cpp/isEngineSDLWrapper.cpp\" />\n\t\t<Unit filename=\"cpp/isEngineWrapper.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/core/ActivityController.h\" />\n\t\t<Unit filename=\"cpp/isEngine/core/GameEngine.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Box2D.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2Shape.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2BroadPhase.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2Collision.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2Distance.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2DynamicTree.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Draw.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2GrowableStack.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Math.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Settings.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2StackAllocator.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Common/b2Timer.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonContact.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2DistanceJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2FrictionJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2GearJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MotorJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MouseJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RopeJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WeldJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WheelJoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Body.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2ContactManager.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2Island.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2World.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/Box2D/Rope/b2Rope.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Config.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/FreeFuncs.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/FreeFuncs.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ImageLayer.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ImageLayer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Layer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/LayerGroup.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/LayerGroup.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Map.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Map.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Object.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Object.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ObjectGroup.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/ObjectGroup.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Property.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Property.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/TileLayer.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/TileLayer.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Tileset.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Tileset.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/Types.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/Android.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/Log.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugiconfig.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugixml.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/detail/pugixml.hpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/miniz.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TMXLite/miniz.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/TinyDialogBox.h\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.cpp\" />\n\t\t<Unit filename=\"cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/GameDisplay.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/SDM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/display/SDMBlitSDLSprite.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Background.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Button.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/Form.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/MainObject.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/DepthObject.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Destructible.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/FilePath.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Health.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/HurtEffect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Name.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/ScorePoint.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Step.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Type.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/entity/parents/Visibilty.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameFunction.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameKeyData.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameKeyName.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameSlider.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameSystem.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/function/GameTime.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GRM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GameFont.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/GameTexture.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/graphic/TransitionEffect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isEngineSDLWrapper.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isEngineWrapper.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/islibconnect/isLibConnect.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GSM.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GameMusic.h\" />\n\t\t<Unit filename=\"cpp/isEngine/system/sound/GameSound.h\" />\n\t\t<Unit filename=\"cpp/main.cpp\" />\n\t\t<Extensions>\n\t\t\t<lib_finder disable_auto=\"1\" />\n\t\t</Extensions>\n\t</Project>\n</CodeBlocks_project_file>\n"
  },
  {
    "path": "app/src/main/java/com/author/isengine/SDLActivity.java",
    "content": "package com.author.isengine;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.lang.reflect.Method;\n\nimport android.app.*;\nimport android.content.*;\nimport android.text.InputType;\nimport android.view.*;\nimport android.view.inputmethod.BaseInputConnection;\nimport android.view.inputmethod.EditorInfo;\nimport android.view.inputmethod.InputConnection;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.RelativeLayout;\nimport android.widget.Button;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\nimport android.os.*;\nimport android.util.Log;\nimport android.util.SparseArray;\nimport android.graphics.*;\nimport android.graphics.drawable.Drawable;\nimport android.media.*;\nimport android.hardware.*;\nimport android.content.pm.ActivityInfo;\n\n/**\n    SDL Activity\n*/\npublic class SDLActivity extends Activity {\n    private static final String TAG = \"SDL\";\n\n    // Keep track of the paused state\n    public static boolean mIsPaused, mIsSurfaceReady, mHasFocus;\n    public static boolean mExitCalledFromJava;\n\n    /** If shared libraries (e.g. SDL or the native application) could not be loaded. */\n    public static boolean mBrokenLibraries;\n\n    // If we want to separate mouse and touch events.\n    //  This is only toggled in native code when a hint is set!\n    public static boolean mSeparateMouseAndTouch;\n\n    // Main components\n    protected static SDLActivity mSingleton;\n    protected static SDLSurface mSurface;\n    protected static View mTextEdit;\n    protected static ViewGroup mLayout;\n    protected static SDLJoystickHandler mJoystickHandler;\n\n    // This is what SDL runs in. It invokes SDL_main(), eventually\n    protected static Thread mSDLThread;\n\n    // Audio\n    protected static AudioTrack mAudioTrack;\n    protected static AudioRecord mAudioRecord;\n\n    /**\n     * This method is called by SDL before loading the native shared libraries.\n     * It can be overridden to provide names of shared libraries to be loaded.\n     * The default implementation returns the defaults. It never returns null.\n     * An array returned by a new implementation must at least contain \"SDL2\".\n     * Also keep in mind that the order the libraries are loaded may matter.\n     * @return names of shared libraries to be loaded (e.g. \"SDL2\", \"main\").\n     */\n    protected String[] getLibraries() {\n        return new String[] {\n            \"SDL2\",\n            // \"SDL2_image\",\n            // \"SDL2_mixer\",\n            // \"SDL2_net\",\n            // \"SDL2_ttf\",\n            \"isengine\"\n        };\n    }\n\n    // Load the .so\n    public void loadLibraries() {\n       for (String lib : getLibraries()) {\n          System.loadLibrary(lib);\n       }\n    }\n\n    /**\n     * This method is called by SDL before starting the native application thread.\n     * It can be overridden to provide the arguments after the application name.\n     * The default implementation returns an empty array. It never returns null.\n     * @return arguments for the native application.\n     */\n    protected String[] getArguments() {\n        return new String[0];\n    }\n\n    public static void initialize() {\n        // The static nature of the singleton and Android quirkyness force us to initialize everything here\n        // Otherwise, when exiting the app and returning to it, these variables *keep* their pre exit values\n        mSingleton = null;\n        mSurface = null;\n        mTextEdit = null;\n        mLayout = null;\n        mJoystickHandler = null;\n        mSDLThread = null;\n        mAudioTrack = null;\n        mAudioRecord = null;\n        mExitCalledFromJava = false;\n        mBrokenLibraries = false;\n        mIsPaused = false;\n        mIsSurfaceReady = false;\n        mHasFocus = true;\n    }\n\n    // Setup\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        Log.v(TAG, \"Device: \" + android.os.Build.DEVICE);\n        Log.v(TAG, \"Model: \" + android.os.Build.MODEL);\n        Log.v(TAG, \"onCreate(): \" + mSingleton);\n        super.onCreate(savedInstanceState);\n\n        SDLActivity.initialize();\n        // So we can call stuff from static callbacks\n        mSingleton = this;\n\n        // Load shared libraries\n        String errorMsgBrokenLib = \"\";\n        try {\n            loadLibraries();\n        } catch(UnsatisfiedLinkError e) {\n            System.err.println(e.getMessage());\n            mBrokenLibraries = true;\n            errorMsgBrokenLib = e.getMessage();\n        } catch(Exception e) {\n            System.err.println(e.getMessage());\n            mBrokenLibraries = true;\n            errorMsgBrokenLib = e.getMessage();\n        }\n\n        if (mBrokenLibraries)\n        {\n            AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(this);\n            dlgAlert.setMessage(\"An error occurred while trying to start the application. Please try again and/or reinstall.\"\n                  + System.getProperty(\"line.separator\")\n                  + System.getProperty(\"line.separator\")\n                  + \"Error: \" + errorMsgBrokenLib);\n            dlgAlert.setTitle(\"SDL Error\");\n            dlgAlert.setPositiveButton(\"Exit\",\n                new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog,int id) {\n                        // if this button is clicked, close current activity\n                        SDLActivity.mSingleton.finish();\n                    }\n                });\n           dlgAlert.setCancelable(false);\n           dlgAlert.create().show();\n\n           return;\n        }\n\n        // Set up the surface\n        mSurface = new SDLSurface(getApplication());\n\n        if(Build.VERSION.SDK_INT >= 12) {\n            mJoystickHandler = new SDLJoystickHandler_API12();\n        }\n        else {\n            mJoystickHandler = new SDLJoystickHandler();\n        }\n\n        mLayout = new RelativeLayout(this);\n        mLayout.addView(mSurface);\n\n        setContentView(mLayout);\n        \n        // Get filename from \"Open with\" of another application\n        Intent intent = getIntent();\n\n        if (intent != null && intent.getData() != null) {\n            String filename = intent.getData().getPath();\n            if (filename != null) {\n                Log.v(TAG, \"Got filename: \" + filename);\n                SDLActivity.onNativeDropFile(filename);\n            }\n        }\n    }\n\n    // Events\n    @Override\n    protected void onPause() {\n        Log.v(TAG, \"onPause()\");\n        super.onPause();\n\n        if (SDLActivity.mBrokenLibraries) {\n           return;\n        }\n\n        SDLActivity.handlePause();\n    }\n\n    @Override\n    protected void onResume() {\n        Log.v(TAG, \"onResume()\");\n        super.onResume();\n\n        if (SDLActivity.mBrokenLibraries) {\n           return;\n        }\n\n        SDLActivity.handleResume();\n    }\n\n\n    @Override\n    public void onWindowFocusChanged(boolean hasFocus) {\n        super.onWindowFocusChanged(hasFocus);\n        Log.v(TAG, \"onWindowFocusChanged(): \" + hasFocus);\n\n        if (SDLActivity.mBrokenLibraries) {\n           return;\n        }\n\n        SDLActivity.mHasFocus = hasFocus;\n        if (hasFocus) {\n            SDLActivity.handleResume();\n        }\n    }\n\n    @Override\n    public void onLowMemory() {\n        Log.v(TAG, \"onLowMemory()\");\n        super.onLowMemory();\n\n        if (SDLActivity.mBrokenLibraries) {\n           return;\n        }\n\n        SDLActivity.nativeLowMemory();\n    }\n\n    @Override\n    protected void onDestroy() {\n        Log.v(TAG, \"onDestroy()\");\n\n        if (SDLActivity.mBrokenLibraries) {\n           super.onDestroy();\n           // Reset everything in case the user re opens the app\n           SDLActivity.initialize();\n           return;\n        }\n\n        // Send a quit message to the application\n        SDLActivity.mExitCalledFromJava = true;\n        SDLActivity.nativeQuit();\n\n        // Now wait for the SDL thread to quit\n        if (SDLActivity.mSDLThread != null) {\n            try {\n                SDLActivity.mSDLThread.join();\n            } catch(Exception e) {\n                Log.v(TAG, \"Problem stopping thread: \" + e);\n            }\n            SDLActivity.mSDLThread = null;\n\n            //Log.v(TAG, \"Finished waiting for SDL thread\");\n        }\n\n        super.onDestroy();\n        // Reset everything in case the user re opens the app\n        SDLActivity.initialize();\n    }\n\n    @Override\n    public boolean dispatchKeyEvent(KeyEvent event) {\n\n        if (SDLActivity.mBrokenLibraries) {\n           return false;\n        }\n\n        int keyCode = event.getKeyCode();\n        // Ignore certain special keys so they're handled by Android\n        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||\n            keyCode == KeyEvent.KEYCODE_VOLUME_UP ||\n            keyCode == KeyEvent.KEYCODE_CAMERA ||\n            keyCode == 168 || /* API 11: KeyEvent.KEYCODE_ZOOM_IN */\n            keyCode == 169 /* API 11: KeyEvent.KEYCODE_ZOOM_OUT */\n            ) {\n            return false;\n        }\n        return super.dispatchKeyEvent(event);\n    }\n\n    /** Called by onPause or surfaceDestroyed. Even if surfaceDestroyed\n     *  is the first to be called, mIsSurfaceReady should still be set\n     *  to 'true' during the call to onPause (in a usual scenario).\n     */\n    public static void handlePause() {\n        if (!SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady) {\n            SDLActivity.mIsPaused = true;\n            SDLActivity.nativePause();\n            mSurface.handlePause();\n        }\n    }\n\n    /** Called by onResume or surfaceCreated. An actual resume should be done only when the surface is ready.\n     * Note: Some Android variants may send multiple surfaceChanged events, so we don't need to resume\n     * every time we get one of those events, only if it comes after surfaceDestroyed\n     */\n    public static void handleResume() {\n        if (SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady && SDLActivity.mHasFocus) {\n            SDLActivity.mIsPaused = false;\n            SDLActivity.nativeResume();\n            mSurface.handleResume();\n        }\n    }\n\n    /* The native thread has finished */\n    public static void handleNativeExit() {\n        SDLActivity.mSDLThread = null;\n        mSingleton.finish();\n    }\n\n\n    // Messages from the SDLMain thread\n    static final int COMMAND_CHANGE_TITLE = 1;\n    static final int COMMAND_UNUSED = 2;\n    static final int COMMAND_TEXTEDIT_HIDE = 3;\n    static final int COMMAND_SET_KEEP_SCREEN_ON = 5;\n\n    protected static final int COMMAND_USER = 0x8000;\n\n    /**\n     * This method is called by SDL if SDL did not handle a message itself.\n     * This happens if a received message contains an unsupported command.\n     * Method can be overwritten to handle Messages in a different class.\n     * @param command the command of the message.\n     * @param param the parameter of the message. May be null.\n     * @return if the message was handled in overridden method.\n     */\n    protected boolean onUnhandledMessage(int command, Object param) {\n        return false;\n    }\n\n    /**\n     * A Handler class for Messages from native SDL applications.\n     * It uses current Activities as target (e.g. for the title).\n     * static to prevent implicit references to enclosing object.\n     */\n    protected static class SDLCommandHandler extends Handler {\n        @Override\n        public void handleMessage(Message msg) {\n            Context context = getContext();\n            if (context == null) {\n                Log.e(TAG, \"error handling message, getContext() returned null\");\n                return;\n            }\n            switch (msg.arg1) {\n            case COMMAND_CHANGE_TITLE:\n                if (context instanceof Activity) {\n                    ((Activity) context).setTitle((String)msg.obj);\n                } else {\n                    Log.e(TAG, \"error handling message, getContext() returned no Activity\");\n                }\n                break;\n            case COMMAND_TEXTEDIT_HIDE:\n                if (mTextEdit != null) {\n                    // Note: On some devices setting view to GONE creates a flicker in landscape.\n                    // Setting the View's sizes to 0 is similar to GONE but without the flicker.\n                    // The sizes will be set to useful values when the keyboard is shown again.\n                    mTextEdit.setLayoutParams(new RelativeLayout.LayoutParams(0, 0));\n\n                    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);\n                    imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0);\n                }\n                break;\n            case COMMAND_SET_KEEP_SCREEN_ON:\n            {\n                Window window = ((Activity) context).getWindow();\n                if (window != null) {\n                    if ((msg.obj instanceof Integer) && (((Integer) msg.obj).intValue() != 0)) {\n                        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n                    } else {\n                        window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n                    }\n                }\n                break;\n            }\n            default:\n                if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) {\n                    Log.e(TAG, \"error handling message, command is \" + msg.arg1);\n                }\n            }\n        }\n    }\n\n    // Handler for the messages\n    Handler commandHandler = new SDLCommandHandler();\n\n    // Send a message from the SDLMain thread\n    boolean sendCommand(int command, Object data) {\n        Message msg = commandHandler.obtainMessage();\n        msg.arg1 = command;\n        msg.obj = data;\n        return commandHandler.sendMessage(msg);\n    }\n\n    // C functions we call\n    public static native int nativeInit(Object arguments);\n    public static native void nativeLowMemory();\n    public static native void nativeQuit();\n    public static native void nativePause();\n    public static native void nativeResume();\n    public static native void onNativeDropFile(String filename);\n    public static native void onNativeResize(int x, int y, int format, float rate);\n    public static native int onNativePadDown(int device_id, int keycode);\n    public static native int onNativePadUp(int device_id, int keycode);\n    public static native void onNativeJoy(int device_id, int axis,\n                                          float value);\n    public static native void onNativeHat(int device_id, int hat_id,\n                                          int x, int y);\n    public static native void onNativeKeyDown(int keycode);\n    public static native void onNativeKeyUp(int keycode);\n    public static native void onNativeKeyboardFocusLost();\n    public static native void onNativeMouse(int button, int action, float x, float y);\n    public static native void onNativeTouch(int touchDevId, int pointerFingerId,\n                                            int action, float x,\n                                            float y, float p);\n    public static native void onNativeAccel(float x, float y, float z);\n    public static native void onNativeSurfaceChanged();\n    public static native void onNativeSurfaceDestroyed();\n    public static native int nativeAddJoystick(int device_id, String name,\n                                               int is_accelerometer, int nbuttons,\n                                               int naxes, int nhats, int nballs);\n    public static native int nativeRemoveJoystick(int device_id);\n    public static native String nativeGetHint(String name);\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean setActivityTitle(String title) {\n        // Called from SDLMain() thread and can't directly affect the view\n        return mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean sendMessage(int command, int param) {\n        return mSingleton.sendCommand(command, Integer.valueOf(param));\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static Context getContext() {\n        return mSingleton;\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     * @return result of getSystemService(name) but executed on UI thread.\n     */\n    public Object getSystemServiceFromUiThread(final String name) {\n        final Object lock = new Object();\n        final Object[] results = new Object[2]; // array for writable variables\n        synchronized (lock) {\n            runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (lock) {\n                        results[0] = getSystemService(name);\n                        results[1] = Boolean.TRUE;\n                        lock.notify();\n                    }\n                }\n            });\n            if (results[1] == null) {\n                try {\n                    lock.wait();\n                } catch (InterruptedException ex) {\n                    ex.printStackTrace();\n                }\n            }\n        }\n        return results[0];\n    }\n\n    static class ShowTextInputTask implements Runnable {\n        /*\n         * This is used to regulate the pan&scan method to have some offset from\n         * the bottom edge of the input region and the top edge of an input\n         * method (soft keyboard)\n         */\n        static final int HEIGHT_PADDING = 15;\n\n        public int x, y, w, h;\n\n        public ShowTextInputTask(int x, int y, int w, int h) {\n            this.x = x;\n            this.y = y;\n            this.w = w;\n            this.h = h;\n        }\n\n        @Override\n        public void run() {\n            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(w, h + HEIGHT_PADDING);\n            params.leftMargin = x;\n            params.topMargin = y;\n\n            if (mTextEdit == null) {\n                mTextEdit = new DummyEdit(getContext());\n\n                mLayout.addView(mTextEdit, params);\n            } else {\n                mTextEdit.setLayoutParams(params);\n            }\n\n            mTextEdit.setVisibility(View.VISIBLE);\n            mTextEdit.requestFocus();\n\n            InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);\n            imm.showSoftInput(mTextEdit, 0);\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean showTextInput(int x, int y, int w, int h) {\n        // Transfer the task to the main thread as a Runnable\n        return mSingleton.commandHandler.post(new ShowTextInputTask(x, y, w, h));\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static Surface getNativeSurface() {\n        return SDLActivity.mSurface.getNativeSurface();\n    }\n\n    // Audio\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static int audioOpen(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {\n        int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;\n        int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;\n        int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1);\n\n        Log.v(TAG, \"SDL audio: wanted \" + (isStereo ? \"stereo\" : \"mono\") + \" \" + (is16Bit ? \"16-bit\" : \"8-bit\") + \" \" + (sampleRate / 1000f) + \"kHz, \" + desiredFrames + \" frames buffer\");\n\n        // Let the user pick a larger buffer if they really want -- but ye\n        // gods they probably shouldn't, the minimums are horrifyingly high\n        // latency already\n        desiredFrames = Math.max(desiredFrames, (AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize);\n\n        if (mAudioTrack == null) {\n            mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,\n                    channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM);\n\n            // Instantiating AudioTrack can \"succeed\" without an exception and the track may still be invalid\n            // Ref: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/AudioTrack.java\n            // Ref: http://developer.android.com/reference/android/media/AudioTrack.html#getState()\n\n            if (mAudioTrack.getState() != AudioTrack.STATE_INITIALIZED) {\n                Log.e(TAG, \"Failed during initialization of Audio Track\");\n                mAudioTrack = null;\n                return -1;\n            }\n\n            mAudioTrack.play();\n        }\n\n        Log.v(TAG, \"SDL audio: got \" + ((mAudioTrack.getChannelCount() >= 2) ? \"stereo\" : \"mono\") + \" \" + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? \"16-bit\" : \"8-bit\") + \" \" + (mAudioTrack.getSampleRate() / 1000f) + \"kHz, \" + desiredFrames + \" frames buffer\");\n\n        return 0;\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void audioWriteShortBuffer(short[] buffer) {\n        for (int i = 0; i < buffer.length; ) {\n            int result = mAudioTrack.write(buffer, i, buffer.length - i);\n            if (result > 0) {\n                i += result;\n            } else if (result == 0) {\n                try {\n                    Thread.sleep(1);\n                } catch(InterruptedException e) {\n                    // Nom nom\n                }\n            } else {\n                Log.w(TAG, \"SDL audio: error return from write(short)\");\n                return;\n            }\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void audioWriteByteBuffer(byte[] buffer) {\n        for (int i = 0; i < buffer.length; ) {\n            int result = mAudioTrack.write(buffer, i, buffer.length - i);\n            if (result > 0) {\n                i += result;\n            } else if (result == 0) {\n                try {\n                    Thread.sleep(1);\n                } catch(InterruptedException e) {\n                    // Nom nom\n                }\n            } else {\n                Log.w(TAG, \"SDL audio: error return from write(byte)\");\n                return;\n            }\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static int captureOpen(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {\n        int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;\n        int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;\n        int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1);\n\n        Log.v(TAG, \"SDL capture: wanted \" + (isStereo ? \"stereo\" : \"mono\") + \" \" + (is16Bit ? \"16-bit\" : \"8-bit\") + \" \" + (sampleRate / 1000f) + \"kHz, \" + desiredFrames + \" frames buffer\");\n\n        // Let the user pick a larger buffer if they really want -- but ye\n        // gods they probably shouldn't, the minimums are horrifyingly high\n        // latency already\n        desiredFrames = Math.max(desiredFrames, (AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize);\n\n        if (mAudioRecord == null) {\n            mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, sampleRate,\n                    channelConfig, audioFormat, desiredFrames * frameSize);\n\n            // see notes about AudioTrack state in audioOpen(), above. Probably also applies here.\n            if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) {\n                Log.e(TAG, \"Failed during initialization of AudioRecord\");\n                mAudioRecord.release();\n                mAudioRecord = null;\n                return -1;\n            }\n\n            mAudioRecord.startRecording();\n        }\n\n        Log.v(TAG, \"SDL capture: got \" + ((mAudioRecord.getChannelCount() >= 2) ? \"stereo\" : \"mono\") + \" \" + ((mAudioRecord.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? \"16-bit\" : \"8-bit\") + \" \" + (mAudioRecord.getSampleRate() / 1000f) + \"kHz, \" + desiredFrames + \" frames buffer\");\n\n        return 0;\n    }\n\n    /** This method is called by SDL using JNI. */\n    public static int captureReadShortBuffer(short[] buffer, boolean blocking) {\n        // !!! FIXME: this is available in API Level 23. Until then, we always block.  :(\n        //return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING);\n        return mAudioRecord.read(buffer, 0, buffer.length);\n    }\n\n    /** This method is called by SDL using JNI. */\n    public static int captureReadByteBuffer(byte[] buffer, boolean blocking) {\n        // !!! FIXME: this is available in API Level 23. Until then, we always block.  :(\n        //return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING);\n        return mAudioRecord.read(buffer, 0, buffer.length);\n    }\n\n\n    /** This method is called by SDL using JNI. */\n    public static void audioClose() {\n        if (mAudioTrack != null) {\n            mAudioTrack.stop();\n            mAudioTrack.release();\n            mAudioTrack = null;\n        }\n    }\n\n    /** This method is called by SDL using JNI. */\n    public static void captureClose() {\n        if (mAudioRecord != null) {\n            mAudioRecord.stop();\n            mAudioRecord.release();\n            mAudioRecord = null;\n        }\n    }\n\n\n    // Input\n\n    /**\n     * This method is called by SDL using JNI.\n     * @return an array which may be empty but is never null.\n     */\n    public static int[] inputGetInputDeviceIds(int sources) {\n        int[] ids = InputDevice.getDeviceIds();\n        int[] filtered = new int[ids.length];\n        int used = 0;\n        for (int i = 0; i < ids.length; ++i) {\n            InputDevice device = InputDevice.getDevice(ids[i]);\n            if ((device != null) && ((device.getSources() & sources) != 0)) {\n                filtered[used++] = device.getId();\n            }\n        }\n        return Arrays.copyOf(filtered, used);\n    }\n\n    // Joystick glue code, just a series of stubs that redirect to the SDLJoystickHandler instance\n    public static boolean handleJoystickMotionEvent(MotionEvent event) {\n        return mJoystickHandler.handleMotionEvent(event);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void pollInputDevices() {\n        if (SDLActivity.mSDLThread != null) {\n            mJoystickHandler.pollInputDevices();\n        }\n    }\n\n    // Check if a given device is considered a possible SDL joystick\n    public static boolean isDeviceSDLJoystick(int deviceId) {\n        InputDevice device = InputDevice.getDevice(deviceId);\n        // We cannot use InputDevice.isVirtual before API 16, so let's accept\n        // only nonnegative device ids (VIRTUAL_KEYBOARD equals -1)\n        if ((device == null) || (deviceId < 0)) {\n            return false;\n        }\n        int sources = device.getSources();\n        return (((sources & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) ||\n                ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) ||\n                ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD)\n        );\n    }\n\n    // APK expansion files support\n\n    /** com.android.vending.expansion.zipfile.ZipResourceFile object or null. */\n    private Object expansionFile;\n\n    /** com.android.vending.expansion.zipfile.ZipResourceFile's getInputStream() or null. */\n    private Method expansionFileMethod;\n\n    /**\n     * This method is called by SDL using JNI.\n     * @return an InputStream on success or null if no expansion file was used.\n     * @throws IOException on errors. Message is set for the SDL error message.\n     */\n    public InputStream openAPKExpansionInputStream(String fileName) throws IOException {\n        // Get a ZipResourceFile representing a merger of both the main and patch files\n        if (expansionFile == null) {\n            String mainHint = nativeGetHint(\"SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION\");\n            if (mainHint == null) {\n                return null; // no expansion use if no main version was set\n            }\n            String patchHint = nativeGetHint(\"SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION\");\n            if (patchHint == null) {\n                return null; // no expansion use if no patch version was set\n            }\n\n            Integer mainVersion;\n            Integer patchVersion;\n            try {\n                mainVersion = Integer.valueOf(mainHint);\n                patchVersion = Integer.valueOf(patchHint);\n            } catch (NumberFormatException ex) {\n                ex.printStackTrace();\n                throw new IOException(\"No valid file versions set for APK expansion files\", ex);\n            }\n\n            try {\n                // To avoid direct dependency on Google APK expansion library that is\n                // not a part of Android SDK we access it using reflection\n                expansionFile = Class.forName(\"com.android.vending.expansion.zipfile.APKExpansionSupport\")\n                    .getMethod(\"getAPKExpansionZipFile\", Context.class, int.class, int.class)\n                    .invoke(null, this, mainVersion, patchVersion);\n\n                expansionFileMethod = expansionFile.getClass()\n                    .getMethod(\"getInputStream\", String.class);\n            } catch (Exception ex) {\n                ex.printStackTrace();\n                expansionFile = null;\n                expansionFileMethod = null;\n                throw new IOException(\"Could not access APK expansion support library\", ex);\n            }\n        }\n\n        // Get an input stream for a known file inside the expansion file ZIPs\n        InputStream fileStream;\n        try {\n            fileStream = (InputStream)expansionFileMethod.invoke(expansionFile, fileName);\n        } catch (Exception ex) {\n            // calling \"getInputStream\" failed\n            ex.printStackTrace();\n            throw new IOException(\"Could not open stream from APK expansion file\", ex);\n        }\n\n        if (fileStream == null) {\n            // calling \"getInputStream\" was successful but null was returned\n            throw new IOException(\"Could not find path in APK expansion file\");\n        }\n\n        return fileStream;\n    }\n\n    // Messagebox\n\n    /** Result of current messagebox. Also used for blocking the calling thread. */\n    protected final int[] messageboxSelection = new int[1];\n\n    /** Id of current dialog. */\n    protected int dialogs = 0;\n\n    /**\n     * This method is called by SDL using JNI.\n     * Shows the messagebox from UI thread and block calling thread.\n     * buttonFlags, buttonIds and buttonTexts must have same length.\n     * @param buttonFlags array containing flags for every button.\n     * @param buttonIds array containing id for every button.\n     * @param buttonTexts array containing text for every button.\n     * @param colors null for default or array of length 5 containing colors.\n     * @return button id or -1.\n     */\n    public int messageboxShowMessageBox(\n            final int flags,\n            final String title,\n            final String message,\n            final int[] buttonFlags,\n            final int[] buttonIds,\n            final String[] buttonTexts,\n            final int[] colors) {\n\n        messageboxSelection[0] = -1;\n\n        // sanity checks\n\n        if ((buttonFlags.length != buttonIds.length) && (buttonIds.length != buttonTexts.length)) {\n            return -1; // implementation broken\n        }\n\n        // collect arguments for Dialog\n\n        final Bundle args = new Bundle();\n        args.putInt(\"flags\", flags);\n        args.putString(\"title\", title);\n        args.putString(\"message\", message);\n        args.putIntArray(\"buttonFlags\", buttonFlags);\n        args.putIntArray(\"buttonIds\", buttonIds);\n        args.putStringArray(\"buttonTexts\", buttonTexts);\n        args.putIntArray(\"colors\", colors);\n\n        // trigger Dialog creation on UI thread\n\n        runOnUiThread(new Runnable() {\n            @Override\n            public void run() {\n                showDialog(dialogs++, args);\n            }\n        });\n\n        // block the calling thread\n\n        synchronized (messageboxSelection) {\n            try {\n                messageboxSelection.wait();\n            } catch (InterruptedException ex) {\n                ex.printStackTrace();\n                return -1;\n            }\n        }\n\n        // return selected value\n\n        return messageboxSelection[0];\n    }\n\n    @Override\n    protected Dialog onCreateDialog(int ignore, Bundle args) {\n\n        // TODO set values from \"flags\" to messagebox dialog\n\n        // get colors\n\n        int[] colors = args.getIntArray(\"colors\");\n        int backgroundColor;\n        int textColor;\n        int buttonBorderColor;\n        int buttonBackgroundColor;\n        int buttonSelectedColor;\n        if (colors != null) {\n            int i = -1;\n            backgroundColor = colors[++i];\n            textColor = colors[++i];\n            buttonBorderColor = colors[++i];\n            buttonBackgroundColor = colors[++i];\n            buttonSelectedColor = colors[++i];\n        } else {\n            backgroundColor = Color.TRANSPARENT;\n            textColor = Color.TRANSPARENT;\n            buttonBorderColor = Color.TRANSPARENT;\n            buttonBackgroundColor = Color.TRANSPARENT;\n            buttonSelectedColor = Color.TRANSPARENT;\n        }\n\n        // create dialog with title and a listener to wake up calling thread\n\n        final Dialog dialog = new Dialog(this);\n        dialog.setTitle(args.getString(\"title\"));\n        dialog.setCancelable(false);\n        dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {\n            @Override\n            public void onDismiss(DialogInterface unused) {\n                synchronized (messageboxSelection) {\n                    messageboxSelection.notify();\n                }\n            }\n        });\n\n        // create text\n\n        TextView message = new TextView(this);\n        message.setGravity(Gravity.CENTER);\n        message.setText(args.getString(\"message\"));\n        if (textColor != Color.TRANSPARENT) {\n            message.setTextColor(textColor);\n        }\n\n        // create buttons\n\n        int[] buttonFlags = args.getIntArray(\"buttonFlags\");\n        int[] buttonIds = args.getIntArray(\"buttonIds\");\n        String[] buttonTexts = args.getStringArray(\"buttonTexts\");\n\n        final SparseArray<Button> mapping = new SparseArray<Button>();\n\n        LinearLayout buttons = new LinearLayout(this);\n        buttons.setOrientation(LinearLayout.HORIZONTAL);\n        buttons.setGravity(Gravity.CENTER);\n        for (int i = 0; i < buttonTexts.length; ++i) {\n            Button button = new Button(this);\n            final int id = buttonIds[i];\n            button.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    messageboxSelection[0] = id;\n                    dialog.dismiss();\n                }\n            });\n            if (buttonFlags[i] != 0) {\n                // see SDL_messagebox.h\n                if ((buttonFlags[i] & 0x00000001) != 0) {\n                    mapping.put(KeyEvent.KEYCODE_ENTER, button);\n                }\n                if ((buttonFlags[i] & 0x00000002) != 0) {\n                    mapping.put(111, button); /* API 11: KeyEvent.KEYCODE_ESCAPE */\n                }\n            }\n            button.setText(buttonTexts[i]);\n            if (textColor != Color.TRANSPARENT) {\n                button.setTextColor(textColor);\n            }\n            if (buttonBorderColor != Color.TRANSPARENT) {\n                // TODO set color for border of messagebox button\n            }\n            if (buttonBackgroundColor != Color.TRANSPARENT) {\n                Drawable drawable = button.getBackground();\n                if (drawable == null) {\n                    // setting the color this way removes the style\n                    button.setBackgroundColor(buttonBackgroundColor);\n                } else {\n                    // setting the color this way keeps the style (gradient, padding, etc.)\n                    drawable.setColorFilter(buttonBackgroundColor, PorterDuff.Mode.MULTIPLY);\n                }\n            }\n            if (buttonSelectedColor != Color.TRANSPARENT) {\n                // TODO set color for selected messagebox button\n            }\n            buttons.addView(button);\n        }\n\n        // create content\n\n        LinearLayout content = new LinearLayout(this);\n        content.setOrientation(LinearLayout.VERTICAL);\n        content.addView(message);\n        content.addView(buttons);\n        if (backgroundColor != Color.TRANSPARENT) {\n            content.setBackgroundColor(backgroundColor);\n        }\n\n        // add content to dialog and return\n\n        dialog.setContentView(content);\n        dialog.setOnKeyListener(new Dialog.OnKeyListener() {\n            @Override\n            public boolean onKey(DialogInterface d, int keyCode, KeyEvent event) {\n                Button button = mapping.get(keyCode);\n                if (button != null) {\n                    if (event.getAction() == KeyEvent.ACTION_UP) {\n                        button.performClick();\n                    }\n                    return true; // also for ignored actions\n                }\n                return false;\n            }\n        });\n\n        return dialog;\n    }\n}\n\n/**\n    Simple nativeInit() runnable\n*/\nclass SDLMain implements Runnable {\n    @Override\n    public void run() {\n        // Runs SDL_main()\n        SDLActivity.nativeInit(SDLActivity.mSingleton.getArguments());\n\n        //Log.v(\"SDL\", \"SDL thread terminated\");\n    }\n}\n\n\n/**\n    SDLSurface. This is what we draw on, so we need to know when it's created\n    in order to do anything useful.\n\n    Because of this, that's where we set up the SDL thread\n*/\nclass SDLSurface extends SurfaceView implements SurfaceHolder.Callback,\n    View.OnKeyListener, View.OnTouchListener, SensorEventListener  {\n\n    // Sensors\n    protected static SensorManager mSensorManager;\n    protected static Display mDisplay;\n\n    // Keep track of the surface size to normalize touch events\n    protected static float mWidth, mHeight;\n\n    // Startup\n    public SDLSurface(Context context) {\n        super(context);\n        getHolder().addCallback(this);\n\n        setFocusable(true);\n        setFocusableInTouchMode(true);\n        requestFocus();\n        setOnKeyListener(this);\n        setOnTouchListener(this);\n\n        mDisplay = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();\n        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);\n\n        if(Build.VERSION.SDK_INT >= 12) {\n            setOnGenericMotionListener(new SDLGenericMotionListener_API12());\n        }\n\n        // Some arbitrary defaults to avoid a potential division by zero\n        mWidth = 1.0f;\n        mHeight = 1.0f;\n    }\n\n    public void handlePause() {\n        enableSensor(Sensor.TYPE_ACCELEROMETER, false);\n    }\n\n    public void handleResume() {\n        setFocusable(true);\n        setFocusableInTouchMode(true);\n        requestFocus();\n        setOnKeyListener(this);\n        setOnTouchListener(this);\n        enableSensor(Sensor.TYPE_ACCELEROMETER, true);\n    }\n\n    public Surface getNativeSurface() {\n        return getHolder().getSurface();\n    }\n\n    // Called when we have a valid drawing surface\n    @Override\n    public void surfaceCreated(SurfaceHolder holder) {\n        Log.v(\"SDL\", \"surfaceCreated()\");\n        holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);\n    }\n\n    // Called when we lose the surface\n    @Override\n    public void surfaceDestroyed(SurfaceHolder holder) {\n        Log.v(\"SDL\", \"surfaceDestroyed()\");\n        // Call this *before* setting mIsSurfaceReady to 'false'\n        SDLActivity.handlePause();\n        SDLActivity.mIsSurfaceReady = false;\n        SDLActivity.onNativeSurfaceDestroyed();\n    }\n\n    // Called when the surface is resized\n    @Override\n    public void surfaceChanged(SurfaceHolder holder,\n                               int format, int width, int height) {\n        Log.v(\"SDL\", \"surfaceChanged()\");\n\n        int sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565 by default\n        switch (format) {\n        case PixelFormat.A_8:\n            Log.v(\"SDL\", \"pixel format A_8\");\n            break;\n        case PixelFormat.LA_88:\n            Log.v(\"SDL\", \"pixel format LA_88\");\n            break;\n        case PixelFormat.L_8:\n            Log.v(\"SDL\", \"pixel format L_8\");\n            break;\n        case PixelFormat.RGBA_4444:\n            Log.v(\"SDL\", \"pixel format RGBA_4444\");\n            sdlFormat = 0x15421002; // SDL_PIXELFORMAT_RGBA4444\n            break;\n        case PixelFormat.RGBA_5551:\n            Log.v(\"SDL\", \"pixel format RGBA_5551\");\n            sdlFormat = 0x15441002; // SDL_PIXELFORMAT_RGBA5551\n            break;\n        case PixelFormat.RGBA_8888:\n            Log.v(\"SDL\", \"pixel format RGBA_8888\");\n            sdlFormat = 0x16462004; // SDL_PIXELFORMAT_RGBA8888\n            break;\n        case PixelFormat.RGBX_8888:\n            Log.v(\"SDL\", \"pixel format RGBX_8888\");\n            sdlFormat = 0x16261804; // SDL_PIXELFORMAT_RGBX8888\n            break;\n        case PixelFormat.RGB_332:\n            Log.v(\"SDL\", \"pixel format RGB_332\");\n            sdlFormat = 0x14110801; // SDL_PIXELFORMAT_RGB332\n            break;\n        case PixelFormat.RGB_565:\n            Log.v(\"SDL\", \"pixel format RGB_565\");\n            sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565\n            break;\n        case PixelFormat.RGB_888:\n            Log.v(\"SDL\", \"pixel format RGB_888\");\n            // Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?\n            sdlFormat = 0x16161804; // SDL_PIXELFORMAT_RGB888\n            break;\n        default:\n            Log.v(\"SDL\", \"pixel format unknown \" + format);\n            break;\n        }\n\n        mWidth = width;\n        mHeight = height;\n        SDLActivity.onNativeResize(width, height, sdlFormat, mDisplay.getRefreshRate());\n        Log.v(\"SDL\", \"Window size: \" + width + \"x\" + height);\n\n \n        boolean skip = false;\n        int requestedOrientation = SDLActivity.mSingleton.getRequestedOrientation();\n\n        if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)\n        {\n            // Accept any\n        }\n        else if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)\n        {\n            if (mWidth > mHeight) {\n               skip = true;\n            }\n        } else if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {\n            if (mWidth < mHeight) {\n               skip = true;\n            }\n        }\n\n        // Special Patch for Square Resolution: Black Berry Passport\n        if (skip) {\n           double min = Math.min(mWidth, mHeight);\n           double max = Math.max(mWidth, mHeight);\n           \n           if (max / min < 1.20) {\n              Log.v(\"SDL\", \"Don't skip on such aspect-ratio. Could be a square resolution.\");\n              skip = false;\n           }\n        }\n\n        if (skip) {\n           Log.v(\"SDL\", \"Skip .. Surface is not ready.\");\n           return;\n        }\n\n\n        // Set mIsSurfaceReady to 'true' *before* making a call to handleResume\n        SDLActivity.mIsSurfaceReady = true;\n        SDLActivity.onNativeSurfaceChanged();\n\n\n        if (SDLActivity.mSDLThread == null) {\n            // This is the entry point to the C app.\n            // Start up the C app thread and enable sensor input for the first time\n\n            final Thread sdlThread = new Thread(new SDLMain(), \"SDLThread\");\n            enableSensor(Sensor.TYPE_ACCELEROMETER, true);\n            sdlThread.start();\n\n            // Set up a listener thread to catch when the native thread ends\n            SDLActivity.mSDLThread = new Thread(new Runnable(){\n                @Override\n                public void run(){\n                    try {\n                        sdlThread.join();\n                    }\n                    catch(Exception e){}\n                    finally{\n                        // Native thread has finished\n                        if (! SDLActivity.mExitCalledFromJava) {\n                            SDLActivity.handleNativeExit();\n                        }\n                    }\n                }\n            }, \"SDLThreadListener\");\n            SDLActivity.mSDLThread.start();\n        }\n\n        if (SDLActivity.mHasFocus) {\n            SDLActivity.handleResume();\n        }\n    }\n\n    // Key events\n    @Override\n    public boolean onKey(View  v, int keyCode, KeyEvent event) {\n        // Dispatch the different events depending on where they come from\n        // Some SOURCE_JOYSTICK, SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD\n        // So, we try to process them as JOYSTICK/DPAD/GAMEPAD events first, if that fails we try them as KEYBOARD\n        //\n        // Furthermore, it's possible a game controller has SOURCE_KEYBOARD and\n        // SOURCE_JOYSTICK, while its key events arrive from the keyboard source\n        // So, retrieve the device itself and check all of its sources\n        if (SDLActivity.isDeviceSDLJoystick(event.getDeviceId())) {\n            // Note that we process events with specific key codes here\n            if (event.getAction() == KeyEvent.ACTION_DOWN) {\n                if (SDLActivity.onNativePadDown(event.getDeviceId(), keyCode) == 0) {\n                    return true;\n                }\n            } else if (event.getAction() == KeyEvent.ACTION_UP) {\n                if (SDLActivity.onNativePadUp(event.getDeviceId(), keyCode) == 0) {\n                    return true;\n                }\n            }\n        }\n\n        if ((event.getSource() & InputDevice.SOURCE_KEYBOARD) != 0) {\n            if (event.getAction() == KeyEvent.ACTION_DOWN) {\n                //Log.v(\"SDL\", \"key down: \" + keyCode);\n                SDLActivity.onNativeKeyDown(keyCode);\n                return true;\n            }\n            else if (event.getAction() == KeyEvent.ACTION_UP) {\n                //Log.v(\"SDL\", \"key up: \" + keyCode);\n                SDLActivity.onNativeKeyUp(keyCode);\n                return true;\n            }\n        }\n\n        if ((event.getSource() & InputDevice.SOURCE_MOUSE) != 0) {\n            // on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses\n            // they are ignored here because sending them as mouse input to SDL is messy\n            if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) {\n                switch (event.getAction()) {\n                case KeyEvent.ACTION_DOWN:\n                case KeyEvent.ACTION_UP:\n                    // mark the event as handled or it will be handled by system\n                    // handling KEYCODE_BACK by system will call onBackPressed()\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    // Touch events\n    @Override\n    public boolean onTouch(View v, MotionEvent event) {\n        /* Ref: http://developer.android.com/training/gestures/multi.html */\n        final int touchDevId = event.getDeviceId();\n        final int pointerCount = event.getPointerCount();\n        int action = event.getActionMasked();\n        int pointerFingerId;\n        int mouseButton;\n        int i = -1;\n        float x,y,p;\n\n        // !!! FIXME: dump this SDK check after 2.0.4 ships and require API14.\n        if (event.getSource() == InputDevice.SOURCE_MOUSE && SDLActivity.mSeparateMouseAndTouch) {\n            if (Build.VERSION.SDK_INT < 14) {\n                mouseButton = 1; // all mouse buttons are the left button\n            } else {\n                try {\n                    mouseButton = (Integer) event.getClass().getMethod(\"getButtonState\").invoke(event);\n                } catch(Exception e) {\n                    mouseButton = 1;    // oh well.\n                }\n            }\n            SDLActivity.onNativeMouse(mouseButton, action, event.getX(0), event.getY(0));\n        } else {\n            switch(action) {\n                case MotionEvent.ACTION_MOVE:\n                    for (i = 0; i < pointerCount; i++) {\n                        pointerFingerId = event.getPointerId(i);\n                        x = event.getX(i) / mWidth;\n                        y = event.getY(i) / mHeight;\n                        p = event.getPressure(i);\n                        if (p > 1.0f) {\n                            // may be larger than 1.0f on some devices\n                            // see the documentation of getPressure(i)\n                            p = 1.0f;\n                        }\n                        SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);\n                    }\n                    break;\n\n                case MotionEvent.ACTION_UP:\n                case MotionEvent.ACTION_DOWN:\n                    // Primary pointer up/down, the index is always zero\n                    i = 0;\n                case MotionEvent.ACTION_POINTER_UP:\n                case MotionEvent.ACTION_POINTER_DOWN:\n                    // Non primary pointer up/down\n                    if (i == -1) {\n                        i = event.getActionIndex();\n                    }\n\n                    pointerFingerId = event.getPointerId(i);\n                    x = event.getX(i) / mWidth;\n                    y = event.getY(i) / mHeight;\n                    p = event.getPressure(i);\n                    if (p > 1.0f) {\n                        // may be larger than 1.0f on some devices\n                        // see the documentation of getPressure(i)\n                        p = 1.0f;\n                    }\n                    SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);\n                    break;\n\n                case MotionEvent.ACTION_CANCEL:\n                    for (i = 0; i < pointerCount; i++) {\n                        pointerFingerId = event.getPointerId(i);\n                        x = event.getX(i) / mWidth;\n                        y = event.getY(i) / mHeight;\n                        p = event.getPressure(i);\n                        if (p > 1.0f) {\n                            // may be larger than 1.0f on some devices\n                            // see the documentation of getPressure(i)\n                            p = 1.0f;\n                        }\n                        SDLActivity.onNativeTouch(touchDevId, pointerFingerId, MotionEvent.ACTION_UP, x, y, p);\n                    }\n                    break;\n\n                default:\n                    break;\n            }\n        }\n\n        return true;\n   }\n\n    // Sensor events\n    public void enableSensor(int sensortype, boolean enabled) {\n        // TODO: This uses getDefaultSensor - what if we have >1 accels?\n        if (enabled) {\n            mSensorManager.registerListener(this,\n                            mSensorManager.getDefaultSensor(sensortype),\n                            SensorManager.SENSOR_DELAY_GAME, null);\n        } else {\n            mSensorManager.unregisterListener(this,\n                            mSensorManager.getDefaultSensor(sensortype));\n        }\n    }\n\n    @Override\n    public void onAccuracyChanged(Sensor sensor, int accuracy) {\n        // TODO\n    }\n\n    @Override\n    public void onSensorChanged(SensorEvent event) {\n        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {\n            float x, y;\n            switch (mDisplay.getRotation()) {\n                case Surface.ROTATION_90:\n                    x = -event.values[1];\n                    y = event.values[0];\n                    break;\n                case Surface.ROTATION_270:\n                    x = event.values[1];\n                    y = -event.values[0];\n                    break;\n                case Surface.ROTATION_180:\n                    x = -event.values[1];\n                    y = -event.values[0];\n                    break;\n                default:\n                    x = event.values[0];\n                    y = event.values[1];\n                    break;\n            }\n            SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH,\n                                      y / SensorManager.GRAVITY_EARTH,\n                                      event.values[2] / SensorManager.GRAVITY_EARTH);\n        }\n    }\n}\n\n/* This is a fake invisible editor view that receives the input and defines the\n * pan&scan region\n */\nclass DummyEdit extends View implements View.OnKeyListener {\n    InputConnection ic;\n\n    public DummyEdit(Context context) {\n        super(context);\n        setFocusableInTouchMode(true);\n        setFocusable(true);\n        setOnKeyListener(this);\n    }\n\n    @Override\n    public boolean onCheckIsTextEditor() {\n        return true;\n    }\n\n    @Override\n    public boolean onKey(View v, int keyCode, KeyEvent event) {\n\n        // This handles the hardware keyboard input\n        if (event.isPrintingKey() || keyCode == KeyEvent.KEYCODE_SPACE) {\n            if (event.getAction() == KeyEvent.ACTION_DOWN) {\n                ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);\n            }\n            return true;\n        }\n\n        if (event.getAction() == KeyEvent.ACTION_DOWN) {\n            SDLActivity.onNativeKeyDown(keyCode);\n            return true;\n        } else if (event.getAction() == KeyEvent.ACTION_UP) {\n            SDLActivity.onNativeKeyUp(keyCode);\n            return true;\n        }\n\n        return false;\n    }\n\n    //\n    @Override\n    public boolean onKeyPreIme (int keyCode, KeyEvent event) {\n        // As seen on StackOverflow: http://stackoverflow.com/questions/7634346/keyboard-hide-event\n        // FIXME: Discussion at http://bugzilla.libsdl.org/show_bug.cgi?id=1639\n        // FIXME: This is not a 100% effective solution to the problem of detecting if the keyboard is showing or not\n        // FIXME: A more effective solution would be to assume our Layout to be RelativeLayout or LinearLayout\n        // FIXME: And determine the keyboard presence doing this: http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android\n        // FIXME: An even more effective way would be if Android provided this out of the box, but where would the fun be in that :)\n        if (event.getAction()==KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {\n            if (SDLActivity.mTextEdit != null && SDLActivity.mTextEdit.getVisibility() == View.VISIBLE) {\n                SDLActivity.onNativeKeyboardFocusLost();\n            }\n        }\n        return super.onKeyPreIme(keyCode, event);\n    }\n\n    @Override\n    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {\n        ic = new SDLInputConnection(this, true);\n\n        outAttrs.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;\n        outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI\n                | 33554432 /* API 11: EditorInfo.IME_FLAG_NO_FULLSCREEN */;\n\n        return ic;\n    }\n}\n\nclass SDLInputConnection extends BaseInputConnection {\n\n    public SDLInputConnection(View targetView, boolean fullEditor) {\n        super(targetView, fullEditor);\n\n    }\n\n    @Override\n    public boolean sendKeyEvent(KeyEvent event) {\n\n        /*\n         * This handles the keycodes from soft keyboard (and IME-translated\n         * input from hardkeyboard)\n         */\n        int keyCode = event.getKeyCode();\n        if (event.getAction() == KeyEvent.ACTION_DOWN) {\n            if (event.isPrintingKey() || keyCode == KeyEvent.KEYCODE_SPACE) {\n                commitText(String.valueOf((char) event.getUnicodeChar()), 1);\n            }\n            SDLActivity.onNativeKeyDown(keyCode);\n            return true;\n        } else if (event.getAction() == KeyEvent.ACTION_UP) {\n\n            SDLActivity.onNativeKeyUp(keyCode);\n            return true;\n        }\n        return super.sendKeyEvent(event);\n    }\n\n    @Override\n    public boolean commitText(CharSequence text, int newCursorPosition) {\n\n        nativeCommitText(text.toString(), newCursorPosition);\n\n        return super.commitText(text, newCursorPosition);\n    }\n\n    @Override\n    public boolean setComposingText(CharSequence text, int newCursorPosition) {\n\n        nativeSetComposingText(text.toString(), newCursorPosition);\n\n        return super.setComposingText(text, newCursorPosition);\n    }\n\n    public native void nativeCommitText(String text, int newCursorPosition);\n\n    public native void nativeSetComposingText(String text, int newCursorPosition);\n\n    @Override\n    public boolean deleteSurroundingText(int beforeLength, int afterLength) {\n        // Workaround to capture backspace key. Ref: http://stackoverflow.com/questions/14560344/android-backspace-in-webview-baseinputconnection\n        if (beforeLength == 1 && afterLength == 0) {\n            // backspace\n            return super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))\n                && super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));\n        }\n\n        return super.deleteSurroundingText(beforeLength, afterLength);\n    }\n}\n\n/* A null joystick handler for API level < 12 devices (the accelerometer is handled separately) */\nclass SDLJoystickHandler {\n\n    /**\n     * Handles given MotionEvent.\n     * @param event the event to be handled.\n     * @return if given event was processed.\n     */\n    public boolean handleMotionEvent(MotionEvent event) {\n        return false;\n    }\n\n    /**\n     * Handles adding and removing of input devices.\n     */\n    public void pollInputDevices() {\n    }\n}\n\n/* Actual joystick functionality available for API >= 12 devices */\nclass SDLJoystickHandler_API12 extends SDLJoystickHandler {\n\n    static class SDLJoystick {\n        public int device_id;\n        public String name;\n        public ArrayList<InputDevice.MotionRange> axes;\n        public ArrayList<InputDevice.MotionRange> hats;\n    }\n    static class RangeComparator implements Comparator<InputDevice.MotionRange> {\n        @Override\n        public int compare(InputDevice.MotionRange arg0, InputDevice.MotionRange arg1) {\n            return arg0.getAxis() - arg1.getAxis();\n        }\n    }\n\n    private ArrayList<SDLJoystick> mJoysticks;\n\n    public SDLJoystickHandler_API12() {\n\n        mJoysticks = new ArrayList<SDLJoystick>();\n    }\n\n    @Override\n    public void pollInputDevices() {\n        int[] deviceIds = InputDevice.getDeviceIds();\n        // It helps processing the device ids in reverse order\n        // For example, in the case of the XBox 360 wireless dongle,\n        // so the first controller seen by SDL matches what the receiver\n        // considers to be the first controller\n\n        for(int i=deviceIds.length-1; i>-1; i--) {\n            SDLJoystick joystick = getJoystick(deviceIds[i]);\n            if (joystick == null) {\n                joystick = new SDLJoystick();\n                InputDevice joystickDevice = InputDevice.getDevice(deviceIds[i]);\n                if (SDLActivity.isDeviceSDLJoystick(deviceIds[i])) {\n                    joystick.device_id = deviceIds[i];\n                    joystick.name = joystickDevice.getName();\n                    joystick.axes = new ArrayList<InputDevice.MotionRange>();\n                    joystick.hats = new ArrayList<InputDevice.MotionRange>();\n\n                    List<InputDevice.MotionRange> ranges = joystickDevice.getMotionRanges();\n                    Collections.sort(ranges, new RangeComparator());\n                    for (InputDevice.MotionRange range : ranges ) {\n                        if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {\n                            if (range.getAxis() == MotionEvent.AXIS_HAT_X ||\n                                range.getAxis() == MotionEvent.AXIS_HAT_Y) {\n                                joystick.hats.add(range);\n                            }\n                            else {\n                                joystick.axes.add(range);\n                            }\n                        }\n                    }\n\n                    mJoysticks.add(joystick);\n                    SDLActivity.nativeAddJoystick(joystick.device_id, joystick.name, 0, -1,\n                                                  joystick.axes.size(), joystick.hats.size()/2, 0);\n                }\n            }\n        }\n\n        /* Check removed devices */\n        ArrayList<Integer> removedDevices = new ArrayList<Integer>();\n        for(int i=0; i < mJoysticks.size(); i++) {\n            int device_id = mJoysticks.get(i).device_id;\n            int j;\n            for (j=0; j < deviceIds.length; j++) {\n                if (device_id == deviceIds[j]) break;\n            }\n            if (j == deviceIds.length) {\n                removedDevices.add(Integer.valueOf(device_id));\n            }\n        }\n\n        for(int i=0; i < removedDevices.size(); i++) {\n            int device_id = removedDevices.get(i).intValue();\n            SDLActivity.nativeRemoveJoystick(device_id);\n            for (int j=0; j < mJoysticks.size(); j++) {\n                if (mJoysticks.get(j).device_id == device_id) {\n                    mJoysticks.remove(j);\n                    break;\n                }\n            }\n        }\n    }\n\n    protected SDLJoystick getJoystick(int device_id) {\n        for(int i=0; i < mJoysticks.size(); i++) {\n            if (mJoysticks.get(i).device_id == device_id) {\n                return mJoysticks.get(i);\n            }\n        }\n        return null;\n    }\n\n    @Override\n    public boolean handleMotionEvent(MotionEvent event) {\n        if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) != 0) {\n            int actionPointerIndex = event.getActionIndex();\n            int action = event.getActionMasked();\n            switch(action) {\n                case MotionEvent.ACTION_MOVE:\n                    SDLJoystick joystick = getJoystick(event.getDeviceId());\n                    if ( joystick != null ) {\n                        for (int i = 0; i < joystick.axes.size(); i++) {\n                            InputDevice.MotionRange range = joystick.axes.get(i);\n                            /* Normalize the value to -1...1 */\n                            float value = ( event.getAxisValue( range.getAxis(), actionPointerIndex) - range.getMin() ) / range.getRange() * 2.0f - 1.0f;\n                            SDLActivity.onNativeJoy(joystick.device_id, i, value );\n                        }\n                        for (int i = 0; i < joystick.hats.size(); i+=2) {\n                            int hatX = Math.round(event.getAxisValue( joystick.hats.get(i).getAxis(), actionPointerIndex ) );\n                            int hatY = Math.round(event.getAxisValue( joystick.hats.get(i+1).getAxis(), actionPointerIndex ) );\n                            SDLActivity.onNativeHat(joystick.device_id, i/2, hatX, hatY );\n                        }\n                    }\n                    break;\n                default:\n                    break;\n            }\n        }\n        return true;\n    }\n}\n\nclass SDLGenericMotionListener_API12 implements View.OnGenericMotionListener {\n    // Generic Motion (mouse hover, joystick...) events go here\n    @Override\n    public boolean onGenericMotion(View v, MotionEvent event) {\n        float x, y;\n        int action;\n\n        switch ( event.getSource() ) {\n            case InputDevice.SOURCE_JOYSTICK:\n            case InputDevice.SOURCE_GAMEPAD:\n            case InputDevice.SOURCE_DPAD:\n                return SDLActivity.handleJoystickMotionEvent(event);\n\n            case InputDevice.SOURCE_MOUSE:\n                action = event.getActionMasked();\n                switch (action) {\n                    case MotionEvent.ACTION_SCROLL:\n                        x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0);\n                        y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0);\n                        SDLActivity.onNativeMouse(0, action, x, y);\n                        return true;\n\n                    case MotionEvent.ACTION_HOVER_MOVE:\n                        x = event.getX(0);\n                        y = event.getY(0);\n\n                        SDLActivity.onNativeMouse(0, action, x, y);\n                        return true;\n\n                    default:\n                        break;\n                }\n                break;\n\n            default:\n                break;\n        }\n\n        // Event was not managed\n        return false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/lib/catch2/catch.hpp",
    "content": "/*\n *  Catch v2.9.1\n *  Generated: 2019-06-17 11:59:24.363643\n *  ----------------------------------------------------------\n *  This file has been merged from multiple headers. Please don't edit it directly\n *  Copyright (c) 2019 Two Blue Cubes Ltd. All rights reserved.\n *\n *  Distributed under the Boost Software License, Version 1.0. (See accompanying\n *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n */\n#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n// start catch.hpp\n\n\n#define CATCH_VERSION_MAJOR 2\n#define CATCH_VERSION_MINOR 9\n#define CATCH_VERSION_PATCH 1\n\n#ifdef __clang__\n#    pragma clang system_header\n#elif defined __GNUC__\n#    pragma GCC system_header\n#endif\n\n// start catch_suppress_warnings.h\n\n#ifdef __clang__\n#   ifdef __ICC // icpc defines the __clang__ macro\n#       pragma warning(push)\n#       pragma warning(disable: 161 1682)\n#   else // __ICC\n#       pragma clang diagnostic push\n#       pragma clang diagnostic ignored \"-Wpadded\"\n#       pragma clang diagnostic ignored \"-Wswitch-enum\"\n#       pragma clang diagnostic ignored \"-Wcovered-switch-default\"\n#    endif\n#elif defined __GNUC__\n     // Because REQUIREs trigger GCC's -Wparentheses, and because still\n     // supported version of g++ have only buggy support for _Pragmas,\n     // Wparentheses have to be suppressed globally.\n#    pragma GCC diagnostic ignored \"-Wparentheses\" // See #674 for details\n\n#    pragma GCC diagnostic push\n#    pragma GCC diagnostic ignored \"-Wunused-variable\"\n#    pragma GCC diagnostic ignored \"-Wpadded\"\n#endif\n// end catch_suppress_warnings.h\n#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)\n#  define CATCH_IMPL\n#  define CATCH_CONFIG_ALL_PARTS\n#endif\n\n// In the impl file, we want to have access to all parts of the headers\n// Can also be used to sanely support PCHs\n#if defined(CATCH_CONFIG_ALL_PARTS)\n#  define CATCH_CONFIG_EXTERNAL_INTERFACES\n#  if defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#    undef CATCH_CONFIG_DISABLE_MATCHERS\n#  endif\n#  if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)\n#    define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n#  endif\n#endif\n\n#if !defined(CATCH_CONFIG_IMPL_ONLY)\n// start catch_platform.h\n\n#ifdef __APPLE__\n# include <TargetConditionals.h>\n# if TARGET_OS_OSX == 1\n#  define CATCH_PLATFORM_MAC\n# elif TARGET_OS_IPHONE == 1\n#  define CATCH_PLATFORM_IPHONE\n# endif\n\n#elif defined(linux) || defined(__linux) || defined(__linux__)\n#  define CATCH_PLATFORM_LINUX\n\n#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__)\n#  define CATCH_PLATFORM_WINDOWS\n#endif\n\n// end catch_platform.h\n\n#ifdef CATCH_IMPL\n#  ifndef CLARA_CONFIG_MAIN\n#    define CLARA_CONFIG_MAIN_NOT_DEFINED\n#    define CLARA_CONFIG_MAIN\n#  endif\n#endif\n\n// start catch_user_interfaces.h\n\nnamespace Catch {\n    unsigned int rngSeed();\n}\n\n// end catch_user_interfaces.h\n// start catch_tag_alias_autoregistrar.h\n\n// start catch_common.h\n\n// start catch_compiler_capabilities.h\n\n// Detect a number of compiler features - by compiler\n// The following features are defined:\n//\n// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?\n// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported?\n// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported?\n// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled?\n// ****************\n// Note to maintainers: if new toggles are added please document them\n// in configuration.md, too\n// ****************\n\n// In general each macro has a _NO_<feature name> form\n// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature.\n// Many features, at point of detection, define an _INTERNAL_ macro, so they\n// can be combined, en-mass, with the _NO_ forms later.\n\n#ifdef __cplusplus\n\n#  if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)\n#    define CATCH_CPP14_OR_GREATER\n#  endif\n\n#  if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)\n#    define CATCH_CPP17_OR_GREATER\n#  endif\n\n#endif\n\n#if defined(CATCH_CPP17_OR_GREATER)\n#  define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS\n#endif\n\n#ifdef __clang__\n\n#       define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n            _Pragma( \"clang diagnostic push\" ) \\\n            _Pragma( \"clang diagnostic ignored \\\"-Wexit-time-destructors\\\"\" ) \\\n            _Pragma( \"clang diagnostic ignored \\\"-Wglobal-constructors\\\"\")\n#       define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \\\n            _Pragma( \"clang diagnostic pop\" )\n\n#       define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \\\n            _Pragma( \"clang diagnostic push\" ) \\\n            _Pragma( \"clang diagnostic ignored \\\"-Wparentheses\\\"\" )\n#       define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \\\n            _Pragma( \"clang diagnostic pop\" )\n\n#       define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \\\n            _Pragma( \"clang diagnostic push\" ) \\\n            _Pragma( \"clang diagnostic ignored \\\"-Wunused-variable\\\"\" )\n#       define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS \\\n            _Pragma( \"clang diagnostic pop\" )\n\n#       define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \\\n            _Pragma( \"clang diagnostic push\" ) \\\n            _Pragma( \"clang diagnostic ignored \\\"-Wgnu-zero-variadic-macro-arguments\\\"\" )\n#       define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \\\n            _Pragma( \"clang diagnostic pop\" )\n\n#endif // __clang__\n\n////////////////////////////////////////////////////////////////////////////////\n// Assume that non-Windows platforms support posix signals by default\n#if !defined(CATCH_PLATFORM_WINDOWS)\n    #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// We know some environments not to support full POSIX signals\n#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__)\n    #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS\n#endif\n\n#ifdef __OS400__\n#       define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS\n#       define CATCH_CONFIG_COLOUR_NONE\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// Android somehow still does not support std::to_string\n#if defined(__ANDROID__)\n#    define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// Not all Windows environments support SEH properly\n#if defined(__MINGW32__)\n#    define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// PS4\n#if defined(__ORBIS__)\n#    define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// Cygwin\n#ifdef __CYGWIN__\n\n// Required for some versions of Cygwin to declare gettimeofday\n// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin\n#   define _BSD_SOURCE\n// some versions of cygwin (most) do not support std::to_string. Use the libstd check.\n// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813\n# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \\\n           && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))\n\n#    define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING\n\n# endif\n#endif // __CYGWIN__\n\n////////////////////////////////////////////////////////////////////////////////\n// Visual C++\n#ifdef _MSC_VER\n\n#  if _MSC_VER >= 1900 // Visual Studio 2015 or newer\n#    define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS\n#  endif\n\n// Universal Windows platform does not support SEH\n// Or console colours (or console at all...)\n#  if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)\n#    define CATCH_CONFIG_COLOUR_NONE\n#  else\n#    define CATCH_INTERNAL_CONFIG_WINDOWS_SEH\n#  endif\n\n// MSVC traditional preprocessor needs some workaround for __VA_ARGS__\n// _MSVC_TRADITIONAL == 0 means new conformant preprocessor\n// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor\n#  if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)\n#    define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#  endif\n#endif // _MSC_VER\n\n#if defined(_REENTRANT) || defined(_MSC_VER)\n// Enable async processing, as -pthread is specified or no additional linking is required\n# define CATCH_INTERNAL_CONFIG_USE_ASYNC\n#endif // _MSC_VER\n\n////////////////////////////////////////////////////////////////////////////////\n// Check if we are compiled with -fno-exceptions or equivalent\n#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND)\n#  define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// DJGPP\n#ifdef __DJGPP__\n#  define CATCH_INTERNAL_CONFIG_NO_WCHAR\n#endif // __DJGPP__\n\n////////////////////////////////////////////////////////////////////////////////\n// Embarcadero C++Build\n#if defined(__BORLANDC__)\n    #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Use of __COUNTER__ is suppressed during code analysis in\n// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly\n// handled by it.\n// Otherwise all supported compilers support COUNTER macro,\n// but user still might want to turn it off\n#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L )\n    #define CATCH_INTERNAL_CONFIG_COUNTER\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// Check if string_view is available and usable\n// The check is split apart to work around v140 (VS2015) preprocessor issue...\n#if defined(__has_include)\n#if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)\n#    define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW\n#endif\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// Check if optional is available and usable\n#if defined(__has_include)\n#  if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)\n#    define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL\n#  endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)\n#endif // __has_include\n\n////////////////////////////////////////////////////////////////////////////////\n// Check if variant is available and usable\n#if defined(__has_include)\n#  if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)\n#    if defined(__clang__) && (__clang_major__ < 8)\n       // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852\n       // fix should be in clang 8, workaround in libstdc++ 8.2\n#      include <ciso646>\n#      if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)\n#        define CATCH_CONFIG_NO_CPP17_VARIANT\n#      else\n#        define CATCH_INTERNAL_CONFIG_CPP17_VARIANT\n#      endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)\n#    else\n#      define CATCH_INTERNAL_CONFIG_CPP17_VARIANT\n#    endif // defined(__clang__) && (__clang_major__ < 8)\n#  endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)\n#endif // __has_include\n\n#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER)\n#   define CATCH_CONFIG_COUNTER\n#endif\n#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH)\n#   define CATCH_CONFIG_WINDOWS_SEH\n#endif\n// This is set by default, because we assume that unix compilers are posix-signal-compatible by default.\n#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS)\n#   define CATCH_CONFIG_POSIX_SIGNALS\n#endif\n// This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions.\n#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR)\n#   define CATCH_CONFIG_WCHAR\n#endif\n\n#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING)\n#    define CATCH_CONFIG_CPP11_TO_STRING\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL)\n#  define CATCH_CONFIG_CPP17_OPTIONAL\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)\n#  define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW)\n#  define CATCH_CONFIG_CPP17_STRING_VIEW\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT)\n#  define CATCH_CONFIG_CPP17_VARIANT\n#endif\n\n#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)\n#  define CATCH_INTERNAL_CONFIG_NEW_CAPTURE\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE)\n#  define CATCH_CONFIG_NEW_CAPTURE\n#endif\n\n#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n#  define CATCH_CONFIG_DISABLE_EXCEPTIONS\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN)\n#  define CATCH_CONFIG_POLYFILL_ISNAN\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC)  && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC)\n#  define CATCH_CONFIG_USE_ASYNC\n#endif\n\n#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS\n#   define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS\n#endif\n#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS\n#   define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\n#endif\n#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS\n#   define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS\n#endif\n#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS\n#   define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS\n#endif\n\n#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n#define CATCH_TRY if ((true))\n#define CATCH_CATCH_ALL if ((false))\n#define CATCH_CATCH_ANON(type) if ((false))\n#else\n#define CATCH_TRY try\n#define CATCH_CATCH_ALL catch (...)\n#define CATCH_CATCH_ANON(type) catch (type)\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR)\n#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#endif\n\n// end catch_compiler_capabilities.h\n#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line\n#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )\n#ifdef CATCH_CONFIG_COUNTER\n#  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )\n#else\n#  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )\n#endif\n\n#include <iosfwd>\n#include <string>\n#include <cstdint>\n\n// We need a dummy global operator<< so we can bring it into Catch namespace later\nstruct Catch_global_namespace_dummy {};\nstd::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy);\n\nnamespace Catch {\n\n    struct CaseSensitive { enum Choice {\n        Yes,\n        No\n    }; };\n\n    class NonCopyable {\n        NonCopyable( NonCopyable const& )              = delete;\n        NonCopyable( NonCopyable && )                  = delete;\n        NonCopyable& operator = ( NonCopyable const& ) = delete;\n        NonCopyable& operator = ( NonCopyable && )     = delete;\n\n    protected:\n        NonCopyable();\n        virtual ~NonCopyable();\n    };\n\n    struct SourceLineInfo {\n\n        SourceLineInfo() = delete;\n        SourceLineInfo( char const* _file, std::size_t _line ) noexcept\n        :   file( _file ),\n            line( _line )\n        {}\n\n        SourceLineInfo( SourceLineInfo const& other )            = default;\n        SourceLineInfo& operator = ( SourceLineInfo const& )     = default;\n        SourceLineInfo( SourceLineInfo&& )              noexcept = default;\n        SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default;\n\n        bool empty() const noexcept;\n        bool operator == ( SourceLineInfo const& other ) const noexcept;\n        bool operator < ( SourceLineInfo const& other ) const noexcept;\n\n        char const* file;\n        std::size_t line;\n    };\n\n    std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );\n\n    // Bring in operator<< from global namespace into Catch namespace\n    // This is necessary because the overload of operator<< above makes\n    // lookup stop at namespace Catch\n    using ::operator<<;\n\n    // Use this in variadic streaming macros to allow\n    //    >> +StreamEndStop\n    // as well as\n    //    >> stuff +StreamEndStop\n    struct StreamEndStop {\n        std::string operator+() const;\n    };\n    template<typename T>\n    T const& operator + ( T const& value, StreamEndStop ) {\n        return value;\n    }\n}\n\n#define CATCH_INTERNAL_LINEINFO \\\n    ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )\n\n// end catch_common.h\nnamespace Catch {\n\n    struct RegistrarForTagAliases {\n        RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo );\n    };\n\n} // end namespace Catch\n\n#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \\\n    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n    namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \\\n    CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\n\n// end catch_tag_alias_autoregistrar.h\n// start catch_test_registry.h\n\n// start catch_interfaces_testcase.h\n\n#include <vector>\n\nnamespace Catch {\n\n    class TestSpec;\n\n    struct ITestInvoker {\n        virtual void invoke () const = 0;\n        virtual ~ITestInvoker();\n    };\n\n    class TestCase;\n    struct IConfig;\n\n    struct ITestCaseRegistry {\n        virtual ~ITestCaseRegistry();\n        virtual std::vector<TestCase> const& getAllTests() const = 0;\n        virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0;\n    };\n\n    bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );\n    std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );\n    std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );\n\n}\n\n// end catch_interfaces_testcase.h\n// start catch_stringref.h\n\n#include <cstddef>\n#include <string>\n#include <iosfwd>\n\nnamespace Catch {\n\n    /// A non-owning string class (similar to the forthcoming std::string_view)\n    /// Note that, because a StringRef may be a substring of another string,\n    /// it may not be null terminated. c_str() must return a null terminated\n    /// string, however, and so the StringRef will internally take ownership\n    /// (taking a copy), if necessary. In theory this ownership is not externally\n    /// visible - but it does mean (substring) StringRefs should not be shared between\n    /// threads.\n    class StringRef {\n    public:\n        using size_type = std::size_t;\n\n    private:\n        friend struct StringRefTestAccess;\n\n        char const* m_start;\n        size_type m_size;\n\n        char* m_data = nullptr;\n\n        void takeOwnership();\n\n        static constexpr char const* const s_empty = \"\";\n\n    public: // construction/ assignment\n        StringRef() noexcept\n        :   StringRef( s_empty, 0 )\n        {}\n\n        StringRef( StringRef const& other ) noexcept\n        :   m_start( other.m_start ),\n            m_size( other.m_size )\n        {}\n\n        StringRef( StringRef&& other ) noexcept\n        :   m_start( other.m_start ),\n            m_size( other.m_size ),\n            m_data( other.m_data )\n        {\n            other.m_data = nullptr;\n        }\n\n        StringRef( char const* rawChars ) noexcept;\n\n        StringRef( char const* rawChars, size_type size ) noexcept\n        :   m_start( rawChars ),\n            m_size( size )\n        {}\n\n        StringRef( std::string const& stdString ) noexcept\n        :   m_start( stdString.c_str() ),\n            m_size( stdString.size() )\n        {}\n\n        ~StringRef() noexcept {\n            delete[] m_data;\n        }\n\n        auto operator = ( StringRef const &other ) noexcept -> StringRef& {\n            delete[] m_data;\n            m_data = nullptr;\n            m_start = other.m_start;\n            m_size = other.m_size;\n            return *this;\n        }\n\n        operator std::string() const;\n\n        void swap( StringRef& other ) noexcept;\n\n    public: // operators\n        auto operator == ( StringRef const& other ) const noexcept -> bool;\n        auto operator != ( StringRef const& other ) const noexcept -> bool;\n\n        auto operator[] ( size_type index ) const noexcept -> char;\n\n    public: // named queries\n        auto empty() const noexcept -> bool {\n            return m_size == 0;\n        }\n        auto size() const noexcept -> size_type {\n            return m_size;\n        }\n\n        auto numberOfCharacters() const noexcept -> size_type;\n        auto c_str() const -> char const*;\n\n    public: // substrings and searches\n        auto substr( size_type start, size_type size ) const noexcept -> StringRef;\n\n        // Returns the current start pointer.\n        // Note that the pointer can change when if the StringRef is a substring\n        auto currentData() const noexcept -> char const*;\n\n    private: // ownership queries - may not be consistent between calls\n        auto isOwned() const noexcept -> bool;\n        auto isSubstring() const noexcept -> bool;\n    };\n\n    auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string;\n    auto operator + ( StringRef const& lhs, char const* rhs ) -> std::string;\n    auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string;\n\n    auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&;\n    auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&;\n\n    inline auto operator \"\" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef {\n        return StringRef( rawChars, size );\n    }\n\n} // namespace Catch\n\ninline auto operator \"\" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef {\n    return Catch::StringRef( rawChars, size );\n}\n\n// end catch_stringref.h\n// start catch_type_traits.hpp\n\n\n#include <type_traits>\n\nnamespace Catch{\n\n#ifdef CATCH_CPP17_OR_GREATER\n\ttemplate <typename...>\n\tinline constexpr auto is_unique = std::true_type{};\n\n\ttemplate <typename T, typename... Rest>\n\tinline constexpr auto is_unique<T, Rest...> = std::bool_constant<\n\t\t(!std::is_same_v<T, Rest> && ...) && is_unique<Rest...>\n\t>{};\n#else\n\ntemplate <typename...>\nstruct is_unique : std::true_type{};\n\ntemplate <typename T0, typename T1, typename... Rest>\nstruct is_unique<T0, T1, Rest...> : std::integral_constant\n<bool,\n     !std::is_same<T0, T1>::value\n     && is_unique<T0, Rest...>::value\n     && is_unique<T1, Rest...>::value\n>{};\n\n#endif\n}\n\n// end catch_type_traits.hpp\n// start catch_preprocessor.hpp\n\n\n#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__\n#define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__)))\n#define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__)))\n#define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__)))\n#define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__)))\n#define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__)))\n\n#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__\n// MSVC needs more evaluations\n#define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__)))\n#define CATCH_RECURSE(...)  CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__))\n#else\n#define CATCH_RECURSE(...)  CATCH_RECURSION_LEVEL5(__VA_ARGS__)\n#endif\n\n#define CATCH_REC_END(...)\n#define CATCH_REC_OUT\n\n#define CATCH_EMPTY()\n#define CATCH_DEFER(id) id CATCH_EMPTY()\n\n#define CATCH_REC_GET_END2() 0, CATCH_REC_END\n#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2\n#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1\n#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT\n#define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0)\n#define CATCH_REC_NEXT(test, next)  CATCH_REC_NEXT1(CATCH_REC_GET_END test, next)\n\n#define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ )\n#define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ )\n#define CATCH_REC_LIST2(f, x, peek, ...)   f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ )\n\n#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ )\n#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD) ) ( f, userdata, peek, __VA_ARGS__ )\n#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...)   f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ )\n\n// Applies the function macro `f` to each of the remaining parameters, inserts commas between the results,\n// and passes userdata as the first parameter to each invocation,\n// e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a), f(x, b), f(x, c)\n#define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))\n\n#define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))\n\n#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param)\n#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__\n#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__\n#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF\n#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__)\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__\n#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param))\n#else\n// MSVC is adding extra space and needs another indirection to expand INTERNAL_CATCH_NOINTERNAL_CATCH_DEF\n#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__)\n#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__\n#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1)\n#endif\n\n#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__\n#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name)\n\n#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__)\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>())\n#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))\n#else\n#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>()))\n#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)))\n#endif\n\n#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\\\n    CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__)\n\n#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0)\n#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1)\n#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2)\n#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3)\n#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4)\n#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5)\n#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _4, _5, _6)\n#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7)\n#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8)\n#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9)\n#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10)\n\n#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N\n\n#define INTERNAL_CATCH_TYPE_GEN\\\n    template<typename...> struct TypeList {};\\\n    template<typename...Ts>\\\n    constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\\\n    \\\n    template<template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2> \\\n    constexpr auto append(L1<E1...>, L2<E2...>) noexcept -> L1<E1...,E2...> { return {}; }\\\n    template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\\\n    constexpr auto append(L1<E1...>, L2<E2...>, Rest...) noexcept -> decltype(append(L1<E1...,E2...>{}, Rest{}...)) { return {}; }\\\n    template< template<typename...> class L1, typename...E1, typename...Rest>\\\n    constexpr auto append(L1<E1...>, TypeList<mpl_::na>, Rest...) noexcept -> L1<E1...> { return {}; }\\\n    \\\n    template< template<typename...> class Container, template<typename...> class List, typename...elems>\\\n    constexpr auto rewrap(List<elems...>) noexcept -> TypeList<Container<elems...>> { return {}; }\\\n    template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\\\n    constexpr auto rewrap(List<Elems...>,Elements...) noexcept -> decltype(append(TypeList<Container<Elems...>>{}, rewrap<Container>(Elements{}...))) { return {}; }\\\n    \\\n    template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\\\n    constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; }\\\n    template<template <typename...> class Final, template <typename...> class List, typename...Ts>\\\n    constexpr auto convert(List<Ts...>) noexcept -> decltype(append(Final<>{},TypeList<Ts>{}...)) { return {}; }\n\n#define INTERNAL_CATCH_NTTP_1(signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \\\n    \\\n    template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    constexpr auto rewrap(List<__VA_ARGS__>) noexcept -> TypeList<Container<__VA_ARGS__>> { return {}; }\\\n    template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\\\n    constexpr auto rewrap(List<__VA_ARGS__>,Elements...elems) noexcept -> decltype(append(TypeList<Container<__VA_ARGS__>>{}, rewrap<Container>(elems...))) { return {}; }\\\n    template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\\\n    constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; }\n\n#define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName)\n#define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    static void TestName()\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_X(TestName, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    static void TestName()\n\n#define INTERNAL_CATCH_DEFINE_SIG_TEST0(TestName)\n#define INTERNAL_CATCH_DEFINE_SIG_TEST1(TestName, signature)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    static void TestName()\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_X(TestName, signature,...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    static void TestName()\n\n#define INTERNAL_CATCH_NTTP_REGISTER0(TestFunc, signature)\\\n    template<typename Type>\\\n    void reg_test(TypeList<Type>, Catch::NameAndTags nameAndTags)\\\n    {\\\n        Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<Type>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\\\n    }\n\n#define INTERNAL_CATCH_NTTP_REGISTER(TestFunc, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    void reg_test(Nttp<__VA_ARGS__>, Catch::NameAndTags nameAndTags)\\\n    {\\\n        Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<__VA_ARGS__>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\\\n    }\n\n#define INTERNAL_CATCH_NTTP_REGISTER_METHOD0(TestName, signature, ...)\\\n    template<typename Type>\\\n    void reg_test(TypeList<Type>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\\\n    {\\\n        Catch::AutoReg( Catch::makeTestInvoker(&TestName<Type>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\\\n    }\n\n#define INTERNAL_CATCH_NTTP_REGISTER_METHOD(TestName, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    void reg_test(Nttp<__VA_ARGS__>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\\\n    {\\\n        Catch::AutoReg( Catch::makeTestInvoker(&TestName<__VA_ARGS__>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\\\n    }\n\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0(TestName, ClassName)\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1(TestName, ClassName, signature)\\\n    template<typename TestType> \\\n    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<TestType> { \\\n        void test();\\\n    }\n\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X(TestName, ClassName, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \\\n    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<__VA_ARGS__> { \\\n        void test();\\\n    }\n\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0(TestName)\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1(TestName, signature)\\\n    template<typename TestType> \\\n    void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<TestType>::test()\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X(TestName, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \\\n    void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<__VA_ARGS__>::test()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define INTERNAL_CATCH_NTTP_0\n#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__),INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_0)\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__)\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__)\n#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__)\n#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__)\n#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__)\n#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__)\n#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__)\n#else\n#define INTERNAL_CATCH_NTTP_0(signature)\n#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1,INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_0)( __VA_ARGS__))\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__))\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__))\n#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__))\n#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__))\n#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__))\n#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__))\n#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__))\n#endif\n\n// end catch_preprocessor.hpp\n// start catch_meta.hpp\n\n\n#include <type_traits>\n\nnamespace Catch {\ntemplate<typename T>\nstruct always_false : std::false_type {};\n\ntemplate <typename> struct true_given : std::true_type {};\nstruct is_callable_tester {\n    template <typename Fun, typename... Args>\n    true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int);\n    template <typename...>\n    std::false_type static test(...);\n};\n\ntemplate <typename T>\nstruct is_callable;\n\ntemplate <typename Fun, typename... Args>\nstruct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {};\n\n} // namespace Catch\n\nnamespace mpl_{\n    struct na;\n}\n\n// end catch_meta.hpp\nnamespace Catch {\n\ntemplate<typename C>\nclass TestInvokerAsMethod : public ITestInvoker {\n    void (C::*m_testAsMethod)();\npublic:\n    TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {}\n\n    void invoke() const override {\n        C obj;\n        (obj.*m_testAsMethod)();\n    }\n};\n\nauto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker*;\n\ntemplate<typename C>\nauto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInvoker* {\n    return new(std::nothrow) TestInvokerAsMethod<C>( testAsMethod );\n}\n\nstruct NameAndTags {\n    NameAndTags( StringRef const& name_ = StringRef(), StringRef const& tags_ = StringRef() ) noexcept;\n    StringRef name;\n    StringRef tags;\n};\n\nstruct AutoReg : NonCopyable {\n    AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept;\n    ~AutoReg();\n};\n\n} // end namespace Catch\n\n#if defined(CATCH_CONFIG_DISABLE)\n    #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \\\n        static void TestName()\n    #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \\\n        namespace{                        \\\n            struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \\\n                void test();              \\\n            };                            \\\n        }                                 \\\n        void TestName::test()\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( TestName, TestFunc, Name, Tags, Signature, ... )  \\\n        INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... )    \\\n        namespace{                                                                                  \\\n            namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                      \\\n            INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\\\n        }                                                                                           \\\n        }                                                                                           \\\n        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\n\n    #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \\\n            INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ )\n    #else\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \\\n            INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) )\n    #endif\n\n    #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \\\n            INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ )\n    #else\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \\\n            INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) )\n    #endif\n\n    #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \\\n            INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ )\n    #else\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \\\n            INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) )\n    #endif\n\n    #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \\\n            INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ )\n    #else\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \\\n            INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) )\n    #endif\n#endif\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \\\n        static void TestName(); \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \\\n        static void TestName()\n    #define INTERNAL_CATCH_TESTCASE( ... ) \\\n        INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ )\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, \"&\" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        namespace{ \\\n            struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \\\n                void test(); \\\n            }; \\\n            Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \\\n        } \\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \\\n        void TestName::test()\n    #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \\\n        INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ )\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \\\n        INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));\\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\\\n            INTERNAL_CATCH_TYPE_GEN\\\n            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            INTERNAL_CATCH_NTTP_REG_GEN(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            template<typename...Types> \\\n            struct TestName{\\\n                TestName(){\\\n                    int index = 0;                                    \\\n                    constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\\\n                    using expander = int[];\\\n                    (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name \" - \" + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \\\n                }\\\n            };\\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\\\n            TestName<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\\\n            return 0;\\\n        }();\\\n        }\\\n        }\\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \\\n        INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \\\n        INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) )\n#endif\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \\\n        INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) )\n#endif\n\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                      \\\n        CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                \\\n        template<typename TestType> static void TestFuncName();       \\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                     \\\n            INTERNAL_CATCH_TYPE_GEN                                                  \\\n            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))         \\\n            template<typename... Types>                               \\\n            struct TestName {                                         \\\n                void reg_tests() {                                          \\\n                    int index = 0;                                    \\\n                    using expander = int[];                           \\\n                    constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\\\n                    constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\\\n                    constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\\\n                    (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name \" - \" + std::string(tmpl_types[index / num_types]) + \"<\" + std::string(types_list[index % num_types]) + \">\", Tags } ), index++, 0)... };/* NOLINT */\\\n                }                                                     \\\n            };                                                        \\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \\\n                using TestInit = decltype(create<TestName, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{})); \\\n                TestInit t;                                           \\\n                t.reg_tests();                                        \\\n                return 0;                                             \\\n            }();                                                      \\\n        }                                                             \\\n        }                                                             \\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS                    \\\n        CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS              \\\n        template<typename TestType>                                   \\\n        static void TestFuncName()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\\\n        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T,__VA_ARGS__)\n#else\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T, __VA_ARGS__ ) )\n#endif\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\\\n        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__)\n#else\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) )\n#endif\n\n    #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        template<typename TestType> static void TestFunc();       \\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\\\n        INTERNAL_CATCH_TYPE_GEN\\\n        template<typename... Types>                               \\\n        struct TestName {                                         \\\n            void reg_tests() {                                          \\\n                int index = 0;                                    \\\n                using expander = int[];                           \\\n                (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name \" - \" + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + \" - \" + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */\\\n            }                                                     \\\n        };\\\n        static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \\\n                using TestInit = decltype(convert<TestName>(TmplList {})); \\\n                TestInit t;                                           \\\n                t.reg_tests();                                        \\\n                return 0;                                             \\\n            }();                                                        \\\n        }}\\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS                    \\\n        template<typename TestType>                                   \\\n        static void TestFunc()\n\n    #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \\\n        INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, TmplList )\n\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \\\n            INTERNAL_CATCH_TYPE_GEN\\\n            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\\\n            INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            template<typename...Types> \\\n            struct TestNameClass{\\\n                TestNameClass(){\\\n                    int index = 0;                                    \\\n                    constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\\\n                    using expander = int[];\\\n                    (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name \" - \" + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \\\n                }\\\n            };\\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\\\n                TestNameClass<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\\\n                return 0;\\\n        }();\\\n        }\\\n        }\\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\\\n        CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS\\\n        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \\\n        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) )\n#endif\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \\\n        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) )\n#endif\n\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \\\n        template<typename TestType> \\\n            struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \\\n                void test();\\\n            };\\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestNameClass) {\\\n            INTERNAL_CATCH_TYPE_GEN                  \\\n            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            template<typename...Types>\\\n            struct TestNameClass{\\\n                void reg_tests(){\\\n                    int index = 0;\\\n                    using expander = int[];\\\n                    constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\\\n                    constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\\\n                    constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\\\n                    (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name \" - \" + std::string(tmpl_types[index / num_types]) + \"<\" + std::string(types_list[index % num_types]) + \">\", Tags } ), index++, 0)... };/* NOLINT */ \\\n                }\\\n            };\\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\\\n                using TestInit = decltype(create<TestNameClass, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{}));\\\n                TestInit t;\\\n                t.reg_tests();\\\n                return 0;\\\n            }(); \\\n        }\\\n        }\\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \\\n        template<typename TestType> \\\n        void TestName<TestType>::test()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\\\n        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T,__VA_ARGS__ ) )\n#endif\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\\\n        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) )\n#endif\n\n    #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        template<typename TestType> \\\n        struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \\\n            void test();\\\n        };\\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \\\n            INTERNAL_CATCH_TYPE_GEN\\\n            template<typename...Types>\\\n            struct TestNameClass{\\\n                void reg_tests(){\\\n                    int index = 0;\\\n                    using expander = int[];\\\n                    (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name \" - \" + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + \" - \" + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */ \\\n                }\\\n            };\\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\\\n                using TestInit = decltype(convert<TestNameClass>(TmplList {}));\\\n                TestInit t;\\\n                t.reg_tests();\\\n                return 0;\\\n            }(); \\\n        }}\\\n        CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \\\n        template<typename TestType> \\\n        void TestName<TestType>::test()\n\n#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \\\n        INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, TmplList )\n\n// end catch_test_registry.h\n// start catch_capture.hpp\n\n// start catch_assertionhandler.h\n\n// start catch_assertioninfo.h\n\n// start catch_result_type.h\n\nnamespace Catch {\n\n    // ResultWas::OfType enum\n    struct ResultWas { enum OfType {\n        Unknown = -1,\n        Ok = 0,\n        Info = 1,\n        Warning = 2,\n\n        FailureBit = 0x10,\n\n        ExpressionFailed = FailureBit | 1,\n        ExplicitFailure = FailureBit | 2,\n\n        Exception = 0x100 | FailureBit,\n\n        ThrewException = Exception | 1,\n        DidntThrowException = Exception | 2,\n\n        FatalErrorCondition = 0x200 | FailureBit\n\n    }; };\n\n    bool isOk( ResultWas::OfType resultType );\n    bool isJustInfo( int flags );\n\n    // ResultDisposition::Flags enum\n    struct ResultDisposition { enum Flags {\n        Normal = 0x01,\n\n        ContinueOnFailure = 0x02,   // Failures fail test, but execution continues\n        FalseTest = 0x04,           // Prefix expression with !\n        SuppressFail = 0x08         // Failures are reported but do not fail the test\n    }; };\n\n    ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs );\n\n    bool shouldContinueOnFailure( int flags );\n    inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; }\n    bool shouldSuppressFailure( int flags );\n\n} // end namespace Catch\n\n// end catch_result_type.h\nnamespace Catch {\n\n    struct AssertionInfo\n    {\n        StringRef macroName;\n        SourceLineInfo lineInfo;\n        StringRef capturedExpression;\n        ResultDisposition::Flags resultDisposition;\n\n        // We want to delete this constructor but a compiler bug in 4.8 means\n        // the struct is then treated as non-aggregate\n        //AssertionInfo() = delete;\n    };\n\n} // end namespace Catch\n\n// end catch_assertioninfo.h\n// start catch_decomposer.h\n\n// start catch_tostring.h\n\n#include <vector>\n#include <cstddef>\n#include <type_traits>\n#include <string>\n// start catch_stream.h\n\n#include <iosfwd>\n#include <cstddef>\n#include <ostream>\n\nnamespace Catch {\n\n    std::ostream& cout();\n    std::ostream& cerr();\n    std::ostream& clog();\n\n    class StringRef;\n\n    struct IStream {\n        virtual ~IStream();\n        virtual std::ostream& stream() const = 0;\n    };\n\n    auto makeStream( StringRef const &filename ) -> IStream const*;\n\n    class ReusableStringStream {\n        std::size_t m_index;\n        std::ostream* m_oss;\n    public:\n        ReusableStringStream();\n        ~ReusableStringStream();\n\n        auto str() const -> std::string;\n\n        template<typename T>\n        auto operator << ( T const& value ) -> ReusableStringStream& {\n            *m_oss << value;\n            return *this;\n        }\n        auto get() -> std::ostream& { return *m_oss; }\n    };\n}\n\n// end catch_stream.h\n// start catch_interfaces_enum_values_registry.h\n\n#include <vector>\n\nnamespace Catch {\n\n    namespace Detail {\n        struct EnumInfo {\n            StringRef m_name;\n            std::vector<std::pair<int, std::string>> m_values;\n\n            ~EnumInfo();\n\n            StringRef lookup( int value ) const;\n        };\n    } // namespace Detail\n\n    struct IMutableEnumValuesRegistry {\n        virtual ~IMutableEnumValuesRegistry();\n\n        virtual Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values ) = 0;\n\n        template<typename E>\n        Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::initializer_list<E> values ) {\n            std::vector<int> intValues;\n            intValues.reserve( values.size() );\n            for( auto enumValue : values )\n                intValues.push_back( static_cast<int>( enumValue ) );\n            return registerEnum( enumName, allEnums, intValues );\n        }\n    };\n\n} // Catch\n\n// end catch_interfaces_enum_values_registry.h\n\n#ifdef CATCH_CONFIG_CPP17_STRING_VIEW\n#include <string_view>\n#endif\n\n#ifdef __OBJC__\n// start catch_objc_arc.hpp\n\n#import <Foundation/Foundation.h>\n\n#ifdef __has_feature\n#define CATCH_ARC_ENABLED __has_feature(objc_arc)\n#else\n#define CATCH_ARC_ENABLED 0\n#endif\n\nvoid arcSafeRelease( NSObject* obj );\nid performOptionalSelector( id obj, SEL sel );\n\n#if !CATCH_ARC_ENABLED\ninline void arcSafeRelease( NSObject* obj ) {\n    [obj release];\n}\ninline id performOptionalSelector( id obj, SEL sel ) {\n    if( [obj respondsToSelector: sel] )\n        return [obj performSelector: sel];\n    return nil;\n}\n#define CATCH_UNSAFE_UNRETAINED\n#define CATCH_ARC_STRONG\n#else\ninline void arcSafeRelease( NSObject* ){}\ninline id performOptionalSelector( id obj, SEL sel ) {\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Warc-performSelector-leaks\"\n#endif\n    if( [obj respondsToSelector: sel] )\n        return [obj performSelector: sel];\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n    return nil;\n}\n#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained\n#define CATCH_ARC_STRONG __strong\n#endif\n\n// end catch_objc_arc.hpp\n#endif\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable:4180) // We attempt to stream a function (address) by const&, which MSVC complains about but is harmless\n#endif\n\nnamespace Catch {\n    namespace Detail {\n\n        extern const std::string unprintableString;\n\n        std::string rawMemoryToString( const void *object, std::size_t size );\n\n        template<typename T>\n        std::string rawMemoryToString( const T& object ) {\n          return rawMemoryToString( &object, sizeof(object) );\n        }\n\n        template<typename T>\n        class IsStreamInsertable {\n            template<typename SS, typename TT>\n            static auto test(int)\n                -> decltype(std::declval<SS&>() << std::declval<TT>(), std::true_type());\n\n            template<typename, typename>\n            static auto test(...)->std::false_type;\n\n        public:\n            static const bool value = decltype(test<std::ostream, const T&>(0))::value;\n        };\n\n        template<typename E>\n        std::string convertUnknownEnumToString( E e );\n\n        template<typename T>\n        typename std::enable_if<\n            !std::is_enum<T>::value && !std::is_base_of<std::exception, T>::value,\n        std::string>::type convertUnstreamable( T const& ) {\n            return Detail::unprintableString;\n        }\n        template<typename T>\n        typename std::enable_if<\n            !std::is_enum<T>::value && std::is_base_of<std::exception, T>::value,\n         std::string>::type convertUnstreamable(T const& ex) {\n            return ex.what();\n        }\n\n        template<typename T>\n        typename std::enable_if<\n            std::is_enum<T>::value\n        , std::string>::type convertUnstreamable( T const& value ) {\n            return convertUnknownEnumToString( value );\n        }\n\n#if defined(_MANAGED)\n        //! Convert a CLR string to a utf8 std::string\n        template<typename T>\n        std::string clrReferenceToString( T^ ref ) {\n            if (ref == nullptr)\n                return std::string(\"null\");\n            auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString());\n            cli::pin_ptr<System::Byte> p = &bytes[0];\n            return std::string(reinterpret_cast<char const *>(p), bytes->Length);\n        }\n#endif\n\n    } // namespace Detail\n\n    // If we decide for C++14, change these to enable_if_ts\n    template <typename T, typename = void>\n    struct StringMaker {\n        template <typename Fake = T>\n        static\n        typename std::enable_if<::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type\n            convert(const Fake& value) {\n                ReusableStringStream rss;\n                // NB: call using the function-like syntax to avoid ambiguity with\n                // user-defined templated operator<< under clang.\n                rss.operator<<(value);\n                return rss.str();\n        }\n\n        template <typename Fake = T>\n        static\n        typename std::enable_if<!::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type\n            convert( const Fake& value ) {\n#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)\n            return Detail::convertUnstreamable(value);\n#else\n            return CATCH_CONFIG_FALLBACK_STRINGIFIER(value);\n#endif\n        }\n    };\n\n    namespace Detail {\n\n        // This function dispatches all stringification requests inside of Catch.\n        // Should be preferably called fully qualified, like ::Catch::Detail::stringify\n        template <typename T>\n        std::string stringify(const T& e) {\n            return ::Catch::StringMaker<typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(e);\n        }\n\n        template<typename E>\n        std::string convertUnknownEnumToString( E e ) {\n            return ::Catch::Detail::stringify(static_cast<typename std::underlying_type<E>::type>(e));\n        }\n\n#if defined(_MANAGED)\n        template <typename T>\n        std::string stringify( T^ e ) {\n            return ::Catch::StringMaker<T^>::convert(e);\n        }\n#endif\n\n    } // namespace Detail\n\n    // Some predefined specializations\n\n    template<>\n    struct StringMaker<std::string> {\n        static std::string convert(const std::string& str);\n    };\n\n#ifdef CATCH_CONFIG_CPP17_STRING_VIEW\n    template<>\n    struct StringMaker<std::string_view> {\n        static std::string convert(std::string_view str);\n    };\n#endif\n\n    template<>\n    struct StringMaker<char const *> {\n        static std::string convert(char const * str);\n    };\n    template<>\n    struct StringMaker<char *> {\n        static std::string convert(char * str);\n    };\n\n#ifdef CATCH_CONFIG_WCHAR\n    template<>\n    struct StringMaker<std::wstring> {\n        static std::string convert(const std::wstring& wstr);\n    };\n\n# ifdef CATCH_CONFIG_CPP17_STRING_VIEW\n    template<>\n    struct StringMaker<std::wstring_view> {\n        static std::string convert(std::wstring_view str);\n    };\n# endif\n\n    template<>\n    struct StringMaker<wchar_t const *> {\n        static std::string convert(wchar_t const * str);\n    };\n    template<>\n    struct StringMaker<wchar_t *> {\n        static std::string convert(wchar_t * str);\n    };\n#endif\n\n    // TBD: Should we use `strnlen` to ensure that we don't go out of the buffer,\n    //      while keeping string semantics?\n    template<int SZ>\n    struct StringMaker<char[SZ]> {\n        static std::string convert(char const* str) {\n            return ::Catch::Detail::stringify(std::string{ str });\n        }\n    };\n    template<int SZ>\n    struct StringMaker<signed char[SZ]> {\n        static std::string convert(signed char const* str) {\n            return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) });\n        }\n    };\n    template<int SZ>\n    struct StringMaker<unsigned char[SZ]> {\n        static std::string convert(unsigned char const* str) {\n            return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) });\n        }\n    };\n\n    template<>\n    struct StringMaker<int> {\n        static std::string convert(int value);\n    };\n    template<>\n    struct StringMaker<long> {\n        static std::string convert(long value);\n    };\n    template<>\n    struct StringMaker<long long> {\n        static std::string convert(long long value);\n    };\n    template<>\n    struct StringMaker<unsigned int> {\n        static std::string convert(unsigned int value);\n    };\n    template<>\n    struct StringMaker<unsigned long> {\n        static std::string convert(unsigned long value);\n    };\n    template<>\n    struct StringMaker<unsigned long long> {\n        static std::string convert(unsigned long long value);\n    };\n\n    template<>\n    struct StringMaker<bool> {\n        static std::string convert(bool b);\n    };\n\n    template<>\n    struct StringMaker<char> {\n        static std::string convert(char c);\n    };\n    template<>\n    struct StringMaker<signed char> {\n        static std::string convert(signed char c);\n    };\n    template<>\n    struct StringMaker<unsigned char> {\n        static std::string convert(unsigned char c);\n    };\n\n    template<>\n    struct StringMaker<std::nullptr_t> {\n        static std::string convert(std::nullptr_t);\n    };\n\n    template<>\n    struct StringMaker<float> {\n        static std::string convert(float value);\n        static int precision;\n    };\n\n    template<>\n    struct StringMaker<double> {\n        static std::string convert(double value);\n        static int precision;\n    };\n\n    template <typename T>\n    struct StringMaker<T*> {\n        template <typename U>\n        static std::string convert(U* p) {\n            if (p) {\n                return ::Catch::Detail::rawMemoryToString(p);\n            } else {\n                return \"nullptr\";\n            }\n        }\n    };\n\n    template <typename R, typename C>\n    struct StringMaker<R C::*> {\n        static std::string convert(R C::* p) {\n            if (p) {\n                return ::Catch::Detail::rawMemoryToString(p);\n            } else {\n                return \"nullptr\";\n            }\n        }\n    };\n\n#if defined(_MANAGED)\n    template <typename T>\n    struct StringMaker<T^> {\n        static std::string convert( T^ ref ) {\n            return ::Catch::Detail::clrReferenceToString(ref);\n        }\n    };\n#endif\n\n    namespace Detail {\n        template<typename InputIterator>\n        std::string rangeToString(InputIterator first, InputIterator last) {\n            ReusableStringStream rss;\n            rss << \"{ \";\n            if (first != last) {\n                rss << ::Catch::Detail::stringify(*first);\n                for (++first; first != last; ++first)\n                    rss << \", \" << ::Catch::Detail::stringify(*first);\n            }\n            rss << \" }\";\n            return rss.str();\n        }\n    }\n\n#ifdef __OBJC__\n    template<>\n    struct StringMaker<NSString*> {\n        static std::string convert(NSString * nsstring) {\n            if (!nsstring)\n                return \"nil\";\n            return std::string(\"@\") + [nsstring UTF8String];\n        }\n    };\n    template<>\n    struct StringMaker<NSObject*> {\n        static std::string convert(NSObject* nsObject) {\n            return ::Catch::Detail::stringify([nsObject description]);\n        }\n\n    };\n    namespace Detail {\n        inline std::string stringify( NSString* nsstring ) {\n            return StringMaker<NSString*>::convert( nsstring );\n        }\n\n    } // namespace Detail\n#endif // __OBJC__\n\n} // namespace Catch\n\n//////////////////////////////////////////////////////\n// Separate std-lib types stringification, so it can be selectively enabled\n// This means that we do not bring in\n\n#if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS)\n#  define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER\n#  define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER\n#  define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER\n#  define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n#  define CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER\n#endif\n\n// Separate std::pair specialization\n#if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER)\n#include <utility>\nnamespace Catch {\n    template<typename T1, typename T2>\n    struct StringMaker<std::pair<T1, T2> > {\n        static std::string convert(const std::pair<T1, T2>& pair) {\n            ReusableStringStream rss;\n            rss << \"{ \"\n                << ::Catch::Detail::stringify(pair.first)\n                << \", \"\n                << ::Catch::Detail::stringify(pair.second)\n                << \" }\";\n            return rss.str();\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER\n\n#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL)\n#include <optional>\nnamespace Catch {\n    template<typename T>\n    struct StringMaker<std::optional<T> > {\n        static std::string convert(const std::optional<T>& optional) {\n            ReusableStringStream rss;\n            if (optional.has_value()) {\n                rss << ::Catch::Detail::stringify(*optional);\n            } else {\n                rss << \"{ }\";\n            }\n            return rss.str();\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER\n\n// Separate std::tuple specialization\n#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER)\n#include <tuple>\nnamespace Catch {\n    namespace Detail {\n        template<\n            typename Tuple,\n            std::size_t N = 0,\n            bool = (N < std::tuple_size<Tuple>::value)\n            >\n            struct TupleElementPrinter {\n            static void print(const Tuple& tuple, std::ostream& os) {\n                os << (N ? \", \" : \" \")\n                    << ::Catch::Detail::stringify(std::get<N>(tuple));\n                TupleElementPrinter<Tuple, N + 1>::print(tuple, os);\n            }\n        };\n\n        template<\n            typename Tuple,\n            std::size_t N\n        >\n            struct TupleElementPrinter<Tuple, N, false> {\n            static void print(const Tuple&, std::ostream&) {}\n        };\n\n    }\n\n    template<typename ...Types>\n    struct StringMaker<std::tuple<Types...>> {\n        static std::string convert(const std::tuple<Types...>& tuple) {\n            ReusableStringStream rss;\n            rss << '{';\n            Detail::TupleElementPrinter<std::tuple<Types...>>::print(tuple, rss.get());\n            rss << \" }\";\n            return rss.str();\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER\n\n#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT)\n#include <variant>\nnamespace Catch {\n    template<>\n    struct StringMaker<std::monostate> {\n        static std::string convert(const std::monostate&) {\n            return \"{ }\";\n        }\n    };\n\n    template<typename... Elements>\n    struct StringMaker<std::variant<Elements...>> {\n        static std::string convert(const std::variant<Elements...>& variant) {\n            if (variant.valueless_by_exception()) {\n                return \"{valueless variant}\";\n            } else {\n                return std::visit(\n                    [](const auto& value) {\n                        return ::Catch::Detail::stringify(value);\n                    },\n                    variant\n                );\n            }\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER\n\nnamespace Catch {\n    struct not_this_one {}; // Tag type for detecting which begin/ end are being selected\n\n    // Import begin/ end from std here so they are considered alongside the fallback (...) overloads in this namespace\n    using std::begin;\n    using std::end;\n\n    not_this_one begin( ... );\n    not_this_one end( ... );\n\n    template <typename T>\n    struct is_range {\n        static const bool value =\n            !std::is_same<decltype(begin(std::declval<T>())), not_this_one>::value &&\n            !std::is_same<decltype(end(std::declval<T>())), not_this_one>::value;\n    };\n\n#if defined(_MANAGED) // Managed types are never ranges\n    template <typename T>\n    struct is_range<T^> {\n        static const bool value = false;\n    };\n#endif\n\n    template<typename Range>\n    std::string rangeToString( Range const& range ) {\n        return ::Catch::Detail::rangeToString( begin( range ), end( range ) );\n    }\n\n    // Handle vector<bool> specially\n    template<typename Allocator>\n    std::string rangeToString( std::vector<bool, Allocator> const& v ) {\n        ReusableStringStream rss;\n        rss << \"{ \";\n        bool first = true;\n        for( bool b : v ) {\n            if( first )\n                first = false;\n            else\n                rss << \", \";\n            rss << ::Catch::Detail::stringify( b );\n        }\n        rss << \" }\";\n        return rss.str();\n    }\n\n    template<typename R>\n    struct StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> {\n        static std::string convert( R const& range ) {\n            return rangeToString( range );\n        }\n    };\n\n    template <typename T, int SZ>\n    struct StringMaker<T[SZ]> {\n        static std::string convert(T const(&arr)[SZ]) {\n            return rangeToString(arr);\n        }\n    };\n\n} // namespace Catch\n\n// Separate std::chrono::duration specialization\n#if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)\n#include <ctime>\n#include <ratio>\n#include <chrono>\n\nnamespace Catch {\n\ntemplate <class Ratio>\nstruct ratio_string {\n    static std::string symbol();\n};\n\ntemplate <class Ratio>\nstd::string ratio_string<Ratio>::symbol() {\n    Catch::ReusableStringStream rss;\n    rss << '[' << Ratio::num << '/'\n        << Ratio::den << ']';\n    return rss.str();\n}\ntemplate <>\nstruct ratio_string<std::atto> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::femto> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::pico> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::nano> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::micro> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::milli> {\n    static std::string symbol();\n};\n\n    ////////////\n    // std::chrono::duration specializations\n    template<typename Value, typename Ratio>\n    struct StringMaker<std::chrono::duration<Value, Ratio>> {\n        static std::string convert(std::chrono::duration<Value, Ratio> const& duration) {\n            ReusableStringStream rss;\n            rss << duration.count() << ' ' << ratio_string<Ratio>::symbol() << 's';\n            return rss.str();\n        }\n    };\n    template<typename Value>\n    struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> {\n        static std::string convert(std::chrono::duration<Value, std::ratio<1>> const& duration) {\n            ReusableStringStream rss;\n            rss << duration.count() << \" s\";\n            return rss.str();\n        }\n    };\n    template<typename Value>\n    struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> {\n        static std::string convert(std::chrono::duration<Value, std::ratio<60>> const& duration) {\n            ReusableStringStream rss;\n            rss << duration.count() << \" m\";\n            return rss.str();\n        }\n    };\n    template<typename Value>\n    struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> {\n        static std::string convert(std::chrono::duration<Value, std::ratio<3600>> const& duration) {\n            ReusableStringStream rss;\n            rss << duration.count() << \" h\";\n            return rss.str();\n        }\n    };\n\n    ////////////\n    // std::chrono::time_point specialization\n    // Generic time_point cannot be specialized, only std::chrono::time_point<system_clock>\n    template<typename Clock, typename Duration>\n    struct StringMaker<std::chrono::time_point<Clock, Duration>> {\n        static std::string convert(std::chrono::time_point<Clock, Duration> const& time_point) {\n            return ::Catch::Detail::stringify(time_point.time_since_epoch()) + \" since epoch\";\n        }\n    };\n    // std::chrono::time_point<system_clock> specialization\n    template<typename Duration>\n    struct StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> {\n        static std::string convert(std::chrono::time_point<std::chrono::system_clock, Duration> const& time_point) {\n            auto converted = std::chrono::system_clock::to_time_t(time_point);\n\n#ifdef _MSC_VER\n            std::tm timeInfo = {};\n            gmtime_s(&timeInfo, &converted);\n#else\n            std::tm* timeInfo = std::gmtime(&converted);\n#endif\n\n            auto const timeStampSize = sizeof(\"2017-01-16T17:06:45Z\");\n            char timeStamp[timeStampSize];\n            const char * const fmt = \"%Y-%m-%dT%H:%M:%SZ\";\n\n#ifdef _MSC_VER\n            std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);\n#else\n            std::strftime(timeStamp, timeStampSize, fmt, timeInfo);\n#endif\n            return std::string(timeStamp);\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n\n#define INTERNAL_CATCH_REGISTER_ENUM( enumName, ... ) \\\nnamespace Catch { \\\n    template<> struct StringMaker<enumName> { \\\n        static std::string convert( enumName value ) { \\\n            static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( #enumName, #__VA_ARGS__, { __VA_ARGS__ } ); \\\n            return enumInfo.lookup( static_cast<int>( value ) ); \\\n        } \\\n    }; \\\n}\n\n#define CATCH_REGISTER_ENUM( enumName, ... ) INTERNAL_CATCH_REGISTER_ENUM( enumName, __VA_ARGS__ )\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\n// end catch_tostring.h\n#include <iosfwd>\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable:4389) // '==' : signed/unsigned mismatch\n#pragma warning(disable:4018) // more \"signed/unsigned mismatch\"\n#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform)\n#pragma warning(disable:4180) // qualifier applied to function type has no meaning\n#pragma warning(disable:4800) // Forcing result to true or false\n#endif\n\nnamespace Catch {\n\n    struct ITransientExpression {\n        auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }\n        auto getResult() const -> bool { return m_result; }\n        virtual void streamReconstructedExpression( std::ostream &os ) const = 0;\n\n        ITransientExpression( bool isBinaryExpression, bool result )\n        :   m_isBinaryExpression( isBinaryExpression ),\n            m_result( result )\n        {}\n\n        // We don't actually need a virtual destructor, but many static analysers\n        // complain if it's not here :-(\n        virtual ~ITransientExpression();\n\n        bool m_isBinaryExpression;\n        bool m_result;\n\n    };\n\n    void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs );\n\n    template<typename LhsT, typename RhsT>\n    class BinaryExpr  : public ITransientExpression {\n        LhsT m_lhs;\n        StringRef m_op;\n        RhsT m_rhs;\n\n        void streamReconstructedExpression( std::ostream &os ) const override {\n            formatReconstructedExpression\n                    ( os, Catch::Detail::stringify( m_lhs ), m_op, Catch::Detail::stringify( m_rhs ) );\n        }\n\n    public:\n        BinaryExpr( bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs )\n        :   ITransientExpression{ true, comparisonResult },\n            m_lhs( lhs ),\n            m_op( op ),\n            m_rhs( rhs )\n        {}\n\n        template<typename T>\n        auto operator && ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator || ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator == ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator != ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator > ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator < ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator >= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator <= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n    };\n\n    template<typename LhsT>\n    class UnaryExpr : public ITransientExpression {\n        LhsT m_lhs;\n\n        void streamReconstructedExpression( std::ostream &os ) const override {\n            os << Catch::Detail::stringify( m_lhs );\n        }\n\n    public:\n        explicit UnaryExpr( LhsT lhs )\n        :   ITransientExpression{ false, static_cast<bool>(lhs) },\n            m_lhs( lhs )\n        {}\n    };\n\n    // Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int)\n    template<typename LhsT, typename RhsT>\n    auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast<bool>(lhs == rhs); }\n    template<typename T>\n    auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); }\n    template<typename T>\n    auto compareEqual( T* const& lhs, long rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); }\n    template<typename T>\n    auto compareEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; }\n    template<typename T>\n    auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; }\n\n    template<typename LhsT, typename RhsT>\n    auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast<bool>(lhs != rhs); }\n    template<typename T>\n    auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); }\n    template<typename T>\n    auto compareNotEqual( T* const& lhs, long rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); }\n    template<typename T>\n    auto compareNotEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; }\n    template<typename T>\n    auto compareNotEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; }\n\n    template<typename LhsT>\n    class ExprLhs {\n        LhsT m_lhs;\n    public:\n        explicit ExprLhs( LhsT lhs ) : m_lhs( lhs ) {}\n\n        template<typename RhsT>\n        auto operator == ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { compareEqual( m_lhs, rhs ), m_lhs, \"==\", rhs };\n        }\n        auto operator == ( bool rhs ) -> BinaryExpr<LhsT, bool> const {\n            return { m_lhs == rhs, m_lhs, \"==\", rhs };\n        }\n\n        template<typename RhsT>\n        auto operator != ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { compareNotEqual( m_lhs, rhs ), m_lhs, \"!=\", rhs };\n        }\n        auto operator != ( bool rhs ) -> BinaryExpr<LhsT, bool> const {\n            return { m_lhs != rhs, m_lhs, \"!=\", rhs };\n        }\n\n        template<typename RhsT>\n        auto operator > ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs > rhs), m_lhs, \">\", rhs };\n        }\n        template<typename RhsT>\n        auto operator < ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs < rhs), m_lhs, \"<\", rhs };\n        }\n        template<typename RhsT>\n        auto operator >= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs >= rhs), m_lhs, \">=\", rhs };\n        }\n        template<typename RhsT>\n        auto operator <= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs <= rhs), m_lhs, \"<=\", rhs };\n        }\n\n        template<typename RhsT>\n        auto operator && ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<RhsT>::value,\n            \"operator&& is not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename RhsT>\n        auto operator || ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<RhsT>::value,\n            \"operator|| is not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        auto makeUnaryExpr() const -> UnaryExpr<LhsT> {\n            return UnaryExpr<LhsT>{ m_lhs };\n        }\n    };\n\n    void handleExpression( ITransientExpression const& expr );\n\n    template<typename T>\n    void handleExpression( ExprLhs<T> const& expr ) {\n        handleExpression( expr.makeUnaryExpr() );\n    }\n\n    struct Decomposer {\n        template<typename T>\n        auto operator <= ( T const& lhs ) -> ExprLhs<T const&> {\n            return ExprLhs<T const&>{ lhs };\n        }\n\n        auto operator <=( bool value ) -> ExprLhs<bool> {\n            return ExprLhs<bool>{ value };\n        }\n    };\n\n} // end namespace Catch\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\n// end catch_decomposer.h\n// start catch_interfaces_capture.h\n\n#include <string>\n#include <chrono>\n\nnamespace Catch {\n\n    class AssertionResult;\n    struct AssertionInfo;\n    struct SectionInfo;\n    struct SectionEndInfo;\n    struct MessageInfo;\n    struct MessageBuilder;\n    struct Counts;\n    struct AssertionReaction;\n    struct SourceLineInfo;\n\n    struct ITransientExpression;\n    struct IGeneratorTracker;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    struct BenchmarkInfo;\n    template <typename Duration = std::chrono::duration<double, std::nano>>\n    struct BenchmarkStats;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    struct IResultCapture {\n\n        virtual ~IResultCapture();\n\n        virtual bool sectionStarted(    SectionInfo const& sectionInfo,\n                                        Counts& assertions ) = 0;\n        virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0;\n        virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0;\n\n        virtual auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        virtual void benchmarkPreparing( std::string const& name ) = 0;\n        virtual void benchmarkStarting( BenchmarkInfo const& info ) = 0;\n        virtual void benchmarkEnded( BenchmarkStats<> const& stats ) = 0;\n        virtual void benchmarkFailed( std::string const& error ) = 0;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        virtual void pushScopedMessage( MessageInfo const& message ) = 0;\n        virtual void popScopedMessage( MessageInfo const& message ) = 0;\n\n        virtual void emplaceUnscopedMessage( MessageBuilder const& builder ) = 0;\n\n        virtual void handleFatalErrorCondition( StringRef message ) = 0;\n\n        virtual void handleExpr\n                (   AssertionInfo const& info,\n                    ITransientExpression const& expr,\n                    AssertionReaction& reaction ) = 0;\n        virtual void handleMessage\n                (   AssertionInfo const& info,\n                    ResultWas::OfType resultType,\n                    StringRef const& message,\n                    AssertionReaction& reaction ) = 0;\n        virtual void handleUnexpectedExceptionNotThrown\n                (   AssertionInfo const& info,\n                    AssertionReaction& reaction ) = 0;\n        virtual void handleUnexpectedInflightException\n                (   AssertionInfo const& info,\n                    std::string const& message,\n                    AssertionReaction& reaction ) = 0;\n        virtual void handleIncomplete\n                (   AssertionInfo const& info ) = 0;\n        virtual void handleNonExpr\n                (   AssertionInfo const &info,\n                    ResultWas::OfType resultType,\n                    AssertionReaction &reaction ) = 0;\n\n        virtual bool lastAssertionPassed() = 0;\n        virtual void assertionPassed() = 0;\n\n        // Deprecated, do not use:\n        virtual std::string getCurrentTestName() const = 0;\n        virtual const AssertionResult* getLastResult() const = 0;\n        virtual void exceptionEarlyReported() = 0;\n    };\n\n    IResultCapture& getResultCapture();\n}\n\n// end catch_interfaces_capture.h\nnamespace Catch {\n\n    struct TestFailureException{};\n    struct AssertionResultData;\n    struct IResultCapture;\n    class RunContext;\n\n    class LazyExpression {\n        friend class AssertionHandler;\n        friend struct AssertionStats;\n        friend class RunContext;\n\n        ITransientExpression const* m_transientExpression = nullptr;\n        bool m_isNegated;\n    public:\n        LazyExpression( bool isNegated );\n        LazyExpression( LazyExpression const& other );\n        LazyExpression& operator = ( LazyExpression const& ) = delete;\n\n        explicit operator bool() const;\n\n        friend auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream&;\n    };\n\n    struct AssertionReaction {\n        bool shouldDebugBreak = false;\n        bool shouldThrow = false;\n    };\n\n    class AssertionHandler {\n        AssertionInfo m_assertionInfo;\n        AssertionReaction m_reaction;\n        bool m_completed = false;\n        IResultCapture& m_resultCapture;\n\n    public:\n        AssertionHandler\n            (   StringRef const& macroName,\n                SourceLineInfo const& lineInfo,\n                StringRef capturedExpression,\n                ResultDisposition::Flags resultDisposition );\n        ~AssertionHandler() {\n            if ( !m_completed ) {\n                m_resultCapture.handleIncomplete( m_assertionInfo );\n            }\n        }\n\n        template<typename T>\n        void handleExpr( ExprLhs<T> const& expr ) {\n            handleExpr( expr.makeUnaryExpr() );\n        }\n        void handleExpr( ITransientExpression const& expr );\n\n        void handleMessage(ResultWas::OfType resultType, StringRef const& message);\n\n        void handleExceptionThrownAsExpected();\n        void handleUnexpectedExceptionNotThrown();\n        void handleExceptionNotThrownAsExpected();\n        void handleThrowingCallSkipped();\n        void handleUnexpectedInflightException();\n\n        void complete();\n        void setCompleted();\n\n        // query\n        auto allowThrows() const -> bool;\n    };\n\n    void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString );\n\n} // namespace Catch\n\n// end catch_assertionhandler.h\n// start catch_message.h\n\n#include <string>\n#include <vector>\n\nnamespace Catch {\n\n    struct MessageInfo {\n        MessageInfo(    StringRef const& _macroName,\n                        SourceLineInfo const& _lineInfo,\n                        ResultWas::OfType _type );\n\n        StringRef macroName;\n        std::string message;\n        SourceLineInfo lineInfo;\n        ResultWas::OfType type;\n        unsigned int sequence;\n\n        bool operator == ( MessageInfo const& other ) const;\n        bool operator < ( MessageInfo const& other ) const;\n    private:\n        static unsigned int globalCount;\n    };\n\n    struct MessageStream {\n\n        template<typename T>\n        MessageStream& operator << ( T const& value ) {\n            m_stream << value;\n            return *this;\n        }\n\n        ReusableStringStream m_stream;\n    };\n\n    struct MessageBuilder : MessageStream {\n        MessageBuilder( StringRef const& macroName,\n                        SourceLineInfo const& lineInfo,\n                        ResultWas::OfType type );\n\n        template<typename T>\n        MessageBuilder& operator << ( T const& value ) {\n            m_stream << value;\n            return *this;\n        }\n\n        MessageInfo m_info;\n    };\n\n    class ScopedMessage {\n    public:\n        explicit ScopedMessage( MessageBuilder const& builder );\n        ScopedMessage( ScopedMessage& duplicate ) = delete;\n        ScopedMessage( ScopedMessage&& old );\n        ~ScopedMessage();\n\n        MessageInfo m_info;\n        bool m_moved;\n    };\n\n    class Capturer {\n        std::vector<MessageInfo> m_messages;\n        IResultCapture& m_resultCapture = getResultCapture();\n        size_t m_captured = 0;\n    public:\n        Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names );\n        ~Capturer();\n\n        void captureValue( size_t index, std::string const& value );\n\n        template<typename T>\n        void captureValues( size_t index, T const& value ) {\n            captureValue( index, Catch::Detail::stringify( value ) );\n        }\n\n        template<typename T, typename... Ts>\n        void captureValues( size_t index, T const& value, Ts const&... values ) {\n            captureValue( index, Catch::Detail::stringify(value) );\n            captureValues( index+1, values... );\n        }\n    };\n\n} // end namespace Catch\n\n// end catch_message.h\n#if !defined(CATCH_CONFIG_DISABLE)\n\n#if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION)\n  #define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__\n#else\n  #define CATCH_INTERNAL_STRINGIFY(...) \"Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION\"\n#endif\n\n#if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n\n///////////////////////////////////////////////////////////////////////////////\n// Another way to speed-up compilation is to omit local try-catch for REQUIRE*\n// macros.\n#define INTERNAL_CATCH_TRY\n#define INTERNAL_CATCH_CATCH( capturer )\n\n#else // CATCH_CONFIG_FAST_COMPILE\n\n#define INTERNAL_CATCH_TRY try\n#define INTERNAL_CATCH_CATCH( handler ) catch(...) { handler.handleUnexpectedInflightException(); }\n\n#endif\n\n#define INTERNAL_CATCH_REACT( handler ) handler.complete();\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \\\n        INTERNAL_CATCH_TRY { \\\n            CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \\\n            catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \\\n            CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \\\n        } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look\n    // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \\\n    INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \\\n    if( Catch::getResultCapture().lastAssertionPassed() )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, ... ) \\\n    INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \\\n    if( !Catch::getResultCapture().lastAssertionPassed() )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \\\n        try { \\\n            static_cast<void>(__VA_ARGS__); \\\n            catchAssertionHandler.handleExceptionNotThrownAsExpected(); \\\n        } \\\n        catch( ... ) { \\\n            catchAssertionHandler.handleUnexpectedInflightException(); \\\n        } \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition); \\\n        if( catchAssertionHandler.allowThrows() ) \\\n            try { \\\n                static_cast<void>(__VA_ARGS__); \\\n                catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \\\n            } \\\n            catch( ... ) { \\\n                catchAssertionHandler.handleExceptionThrownAsExpected(); \\\n            } \\\n        else \\\n            catchAssertionHandler.handleThrowingCallSkipped(); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr) \", \" CATCH_INTERNAL_STRINGIFY(exceptionType), resultDisposition ); \\\n        if( catchAssertionHandler.allowThrows() ) \\\n            try { \\\n                static_cast<void>(expr); \\\n                catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \\\n            } \\\n            catch( exceptionType const& ) { \\\n                catchAssertionHandler.handleExceptionThrownAsExpected(); \\\n            } \\\n            catch( ... ) { \\\n                catchAssertionHandler.handleUnexpectedInflightException(); \\\n            } \\\n        else \\\n            catchAssertionHandler.handleThrowingCallSkipped(); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \\\n        catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \\\n    auto varName = Catch::Capturer( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__ ); \\\n    varName.captureValues( 0, __VA_ARGS__ )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_INFO( macroName, log ) \\\n    Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log );\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_UNSCOPED_INFO( macroName, log ) \\\n    Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )\n\n///////////////////////////////////////////////////////////////////////////////\n// Although this is matcher-based, it can be used with just a string\n#define INTERNAL_CATCH_THROWS_STR_MATCHES( macroName, resultDisposition, matcher, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) \", \" CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \\\n        if( catchAssertionHandler.allowThrows() ) \\\n            try { \\\n                static_cast<void>(__VA_ARGS__); \\\n                catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \\\n            } \\\n            catch( ... ) { \\\n                Catch::handleExceptionMatchExpr( catchAssertionHandler, matcher, #matcher##_catch_sr ); \\\n            } \\\n        else \\\n            catchAssertionHandler.handleThrowingCallSkipped(); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n#endif // CATCH_CONFIG_DISABLE\n\n// end catch_capture.hpp\n// start catch_section.h\n\n// start catch_section_info.h\n\n// start catch_totals.h\n\n#include <cstddef>\n\nnamespace Catch {\n\n    struct Counts {\n        Counts operator - ( Counts const& other ) const;\n        Counts& operator += ( Counts const& other );\n\n        std::size_t total() const;\n        bool allPassed() const;\n        bool allOk() const;\n\n        std::size_t passed = 0;\n        std::size_t failed = 0;\n        std::size_t failedButOk = 0;\n    };\n\n    struct Totals {\n\n        Totals operator - ( Totals const& other ) const;\n        Totals& operator += ( Totals const& other );\n\n        Totals delta( Totals const& prevTotals ) const;\n\n        int error = 0;\n        Counts assertions;\n        Counts testCases;\n    };\n}\n\n// end catch_totals.h\n#include <string>\n\nnamespace Catch {\n\n    struct SectionInfo {\n        SectionInfo\n            (   SourceLineInfo const& _lineInfo,\n                std::string const& _name );\n\n        // Deprecated\n        SectionInfo\n            (   SourceLineInfo const& _lineInfo,\n                std::string const& _name,\n                std::string const& ) : SectionInfo( _lineInfo, _name ) {}\n\n        std::string name;\n        std::string description; // !Deprecated: this will always be empty\n        SourceLineInfo lineInfo;\n    };\n\n    struct SectionEndInfo {\n        SectionInfo sectionInfo;\n        Counts prevAssertions;\n        double durationInSeconds;\n    };\n\n} // end namespace Catch\n\n// end catch_section_info.h\n// start catch_timer.h\n\n#include <cstdint>\n\nnamespace Catch {\n\n    auto getCurrentNanosecondsSinceEpoch() -> uint64_t;\n    auto getEstimatedClockResolution() -> uint64_t;\n\n    class Timer {\n        uint64_t m_nanoseconds = 0;\n    public:\n        void start();\n        auto getElapsedNanoseconds() const -> uint64_t;\n        auto getElapsedMicroseconds() const -> uint64_t;\n        auto getElapsedMilliseconds() const -> unsigned int;\n        auto getElapsedSeconds() const -> double;\n    };\n\n} // namespace Catch\n\n// end catch_timer.h\n#include <string>\n\nnamespace Catch {\n\n    class Section : NonCopyable {\n    public:\n        Section( SectionInfo const& info );\n        ~Section();\n\n        // This indicates whether the section should be executed or not\n        explicit operator bool() const;\n\n    private:\n        SectionInfo m_info;\n\n        std::string m_name;\n        Counts m_assertions;\n        bool m_sectionIncluded;\n        Timer m_timer;\n    };\n\n} // end namespace Catch\n\n#define INTERNAL_CATCH_SECTION( ... ) \\\n    CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \\\n    if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \\\n    CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS\n\n#define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \\\n    CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \\\n    if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \\\n    CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS\n\n// end catch_section.h\n// start catch_interfaces_exception.h\n\n// start catch_interfaces_registry_hub.h\n\n#include <string>\n#include <memory>\n\nnamespace Catch {\n\n    class TestCase;\n    struct ITestCaseRegistry;\n    struct IExceptionTranslatorRegistry;\n    struct IExceptionTranslator;\n    struct IReporterRegistry;\n    struct IReporterFactory;\n    struct ITagAliasRegistry;\n    struct IMutableEnumValuesRegistry;\n\n    class StartupExceptionRegistry;\n\n    using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;\n\n    struct IRegistryHub {\n        virtual ~IRegistryHub();\n\n        virtual IReporterRegistry const& getReporterRegistry() const = 0;\n        virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;\n        virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0;\n        virtual IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const = 0;\n\n        virtual StartupExceptionRegistry const& getStartupExceptionRegistry() const = 0;\n    };\n\n    struct IMutableRegistryHub {\n        virtual ~IMutableRegistryHub();\n        virtual void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) = 0;\n        virtual void registerListener( IReporterFactoryPtr const& factory ) = 0;\n        virtual void registerTest( TestCase const& testInfo ) = 0;\n        virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;\n        virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0;\n        virtual void registerStartupException() noexcept = 0;\n        virtual IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() = 0;\n    };\n\n    IRegistryHub const& getRegistryHub();\n    IMutableRegistryHub& getMutableRegistryHub();\n    void cleanUp();\n    std::string translateActiveException();\n\n}\n\n// end catch_interfaces_registry_hub.h\n#if defined(CATCH_CONFIG_DISABLE)\n    #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \\\n        static std::string translatorName( signature )\n#endif\n\n#include <exception>\n#include <string>\n#include <vector>\n\nnamespace Catch {\n    using exceptionTranslateFunction = std::string(*)();\n\n    struct IExceptionTranslator;\n    using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>;\n\n    struct IExceptionTranslator {\n        virtual ~IExceptionTranslator();\n        virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0;\n    };\n\n    struct IExceptionTranslatorRegistry {\n        virtual ~IExceptionTranslatorRegistry();\n\n        virtual std::string translateActiveException() const = 0;\n    };\n\n    class ExceptionTranslatorRegistrar {\n        template<typename T>\n        class ExceptionTranslator : public IExceptionTranslator {\n        public:\n\n            ExceptionTranslator( std::string(*translateFunction)( T& ) )\n            : m_translateFunction( translateFunction )\n            {}\n\n            std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override {\n                try {\n                    if( it == itEnd )\n                        std::rethrow_exception(std::current_exception());\n                    else\n                        return (*it)->translate( it+1, itEnd );\n                }\n                catch( T& ex ) {\n                    return m_translateFunction( ex );\n                }\n            }\n\n        protected:\n            std::string(*m_translateFunction)( T& );\n        };\n\n    public:\n        template<typename T>\n        ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {\n            getMutableRegistryHub().registerTranslator\n                ( new ExceptionTranslator<T>( translateFunction ) );\n        }\n    };\n}\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \\\n    static std::string translatorName( signature ); \\\n    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n    namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \\\n    CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \\\n    static std::string translatorName( signature )\n\n#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )\n\n// end catch_interfaces_exception.h\n// start catch_approx.h\n\n#include <type_traits>\n\nnamespace Catch {\nnamespace Detail {\n\n    class Approx {\n    private:\n        bool equalityComparisonImpl(double other) const;\n        // Validates the new margin (margin >= 0)\n        // out-of-line to avoid including stdexcept in the header\n        void setMargin(double margin);\n        // Validates the new epsilon (0 < epsilon < 1)\n        // out-of-line to avoid including stdexcept in the header\n        void setEpsilon(double epsilon);\n\n    public:\n        explicit Approx ( double value );\n\n        static Approx custom();\n\n        Approx operator-() const;\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        Approx operator()( T const& value ) {\n            Approx approx( static_cast<double>(value) );\n            approx.m_epsilon = m_epsilon;\n            approx.m_margin = m_margin;\n            approx.m_scale = m_scale;\n            return approx;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        explicit Approx( T const& value ): Approx(static_cast<double>(value))\n        {}\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator == ( const T& lhs, Approx const& rhs ) {\n            auto lhs_v = static_cast<double>(lhs);\n            return rhs.equalityComparisonImpl(lhs_v);\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator == ( Approx const& lhs, const T& rhs ) {\n            return operator==( rhs, lhs );\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator != ( T const& lhs, Approx const& rhs ) {\n            return !operator==( lhs, rhs );\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator != ( Approx const& lhs, T const& rhs ) {\n            return !operator==( rhs, lhs );\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator <= ( T const& lhs, Approx const& rhs ) {\n            return static_cast<double>(lhs) < rhs.m_value || lhs == rhs;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator <= ( Approx const& lhs, T const& rhs ) {\n            return lhs.m_value < static_cast<double>(rhs) || lhs == rhs;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator >= ( T const& lhs, Approx const& rhs ) {\n            return static_cast<double>(lhs) > rhs.m_value || lhs == rhs;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator >= ( Approx const& lhs, T const& rhs ) {\n            return lhs.m_value > static_cast<double>(rhs) || lhs == rhs;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        Approx& epsilon( T const& newEpsilon ) {\n            double epsilonAsDouble = static_cast<double>(newEpsilon);\n            setEpsilon(epsilonAsDouble);\n            return *this;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        Approx& margin( T const& newMargin ) {\n            double marginAsDouble = static_cast<double>(newMargin);\n            setMargin(marginAsDouble);\n            return *this;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        Approx& scale( T const& newScale ) {\n            m_scale = static_cast<double>(newScale);\n            return *this;\n        }\n\n        std::string toString() const;\n\n    private:\n        double m_epsilon;\n        double m_margin;\n        double m_scale;\n        double m_value;\n    };\n} // end namespace Detail\n\nnamespace literals {\n    Detail::Approx operator \"\" _a(long double val);\n    Detail::Approx operator \"\" _a(unsigned long long val);\n} // end namespace literals\n\ntemplate<>\nstruct StringMaker<Catch::Detail::Approx> {\n    static std::string convert(Catch::Detail::Approx const& value);\n};\n\n} // end namespace Catch\n\n// end catch_approx.h\n// start catch_string_manip.h\n\n#include <string>\n#include <iosfwd>\n#include <vector>\n\nnamespace Catch {\n\n    bool startsWith( std::string const& s, std::string const& prefix );\n    bool startsWith( std::string const& s, char prefix );\n    bool endsWith( std::string const& s, std::string const& suffix );\n    bool endsWith( std::string const& s, char suffix );\n    bool contains( std::string const& s, std::string const& infix );\n    void toLowerInPlace( std::string& s );\n    std::string toLower( std::string const& s );\n    std::string trim( std::string const& str );\n\n    // !!! Be aware, returns refs into original string - make sure original string outlives them\n    std::vector<StringRef> splitStringRef( StringRef str, char delimiter );\n    bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis );\n\n    struct pluralise {\n        pluralise( std::size_t count, std::string const& label );\n\n        friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser );\n\n        std::size_t m_count;\n        std::string m_label;\n    };\n}\n\n// end catch_string_manip.h\n#ifndef CATCH_CONFIG_DISABLE_MATCHERS\n// start catch_capture_matchers.h\n\n// start catch_matchers.h\n\n#include <string>\n#include <vector>\n\nnamespace Catch {\nnamespace Matchers {\n    namespace Impl {\n\n        template<typename ArgT> struct MatchAllOf;\n        template<typename ArgT> struct MatchAnyOf;\n        template<typename ArgT> struct MatchNotOf;\n\n        class MatcherUntypedBase {\n        public:\n            MatcherUntypedBase() = default;\n            MatcherUntypedBase ( MatcherUntypedBase const& ) = default;\n            MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = delete;\n            std::string toString() const;\n\n        protected:\n            virtual ~MatcherUntypedBase();\n            virtual std::string describe() const = 0;\n            mutable std::string m_cachedToString;\n        };\n\n#ifdef __clang__\n#    pragma clang diagnostic push\n#    pragma clang diagnostic ignored \"-Wnon-virtual-dtor\"\n#endif\n\n        template<typename ObjectT>\n        struct MatcherMethod {\n            virtual bool match( ObjectT const& arg ) const = 0;\n        };\n\n#ifdef __clang__\n#    pragma clang diagnostic pop\n#endif\n\n        template<typename T>\n        struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {\n\n            MatchAllOf<T> operator && ( MatcherBase const& other ) const;\n            MatchAnyOf<T> operator || ( MatcherBase const& other ) const;\n            MatchNotOf<T> operator ! () const;\n        };\n\n        template<typename ArgT>\n        struct MatchAllOf : MatcherBase<ArgT> {\n            bool match( ArgT const& arg ) const override {\n                for( auto matcher : m_matchers ) {\n                    if (!matcher->match(arg))\n                        return false;\n                }\n                return true;\n            }\n            std::string describe() const override {\n                std::string description;\n                description.reserve( 4 + m_matchers.size()*32 );\n                description += \"( \";\n                bool first = true;\n                for( auto matcher : m_matchers ) {\n                    if( first )\n                        first = false;\n                    else\n                        description += \" and \";\n                    description += matcher->toString();\n                }\n                description += \" )\";\n                return description;\n            }\n\n            MatchAllOf<ArgT>& operator && ( MatcherBase<ArgT> const& other ) {\n                m_matchers.push_back( &other );\n                return *this;\n            }\n\n            std::vector<MatcherBase<ArgT> const*> m_matchers;\n        };\n        template<typename ArgT>\n        struct MatchAnyOf : MatcherBase<ArgT> {\n\n            bool match( ArgT const& arg ) const override {\n                for( auto matcher : m_matchers ) {\n                    if (matcher->match(arg))\n                        return true;\n                }\n                return false;\n            }\n            std::string describe() const override {\n                std::string description;\n                description.reserve( 4 + m_matchers.size()*32 );\n                description += \"( \";\n                bool first = true;\n                for( auto matcher : m_matchers ) {\n                    if( first )\n                        first = false;\n                    else\n                        description += \" or \";\n                    description += matcher->toString();\n                }\n                description += \" )\";\n                return description;\n            }\n\n            MatchAnyOf<ArgT>& operator || ( MatcherBase<ArgT> const& other ) {\n                m_matchers.push_back( &other );\n                return *this;\n            }\n\n            std::vector<MatcherBase<ArgT> const*> m_matchers;\n        };\n\n        template<typename ArgT>\n        struct MatchNotOf : MatcherBase<ArgT> {\n\n            MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {}\n\n            bool match( ArgT const& arg ) const override {\n                return !m_underlyingMatcher.match( arg );\n            }\n\n            std::string describe() const override {\n                return \"not \" + m_underlyingMatcher.toString();\n            }\n            MatcherBase<ArgT> const& m_underlyingMatcher;\n        };\n\n        template<typename T>\n        MatchAllOf<T> MatcherBase<T>::operator && ( MatcherBase const& other ) const {\n            return MatchAllOf<T>() && *this && other;\n        }\n        template<typename T>\n        MatchAnyOf<T> MatcherBase<T>::operator || ( MatcherBase const& other ) const {\n            return MatchAnyOf<T>() || *this || other;\n        }\n        template<typename T>\n        MatchNotOf<T> MatcherBase<T>::operator ! () const {\n            return MatchNotOf<T>( *this );\n        }\n\n    } // namespace Impl\n\n} // namespace Matchers\n\nusing namespace Matchers;\nusing Matchers::Impl::MatcherBase;\n\n} // namespace Catch\n\n// end catch_matchers.h\n// start catch_matchers_floating.h\n\n#include <type_traits>\n#include <cmath>\n\nnamespace Catch {\nnamespace Matchers {\n\n    namespace Floating {\n\n        enum class FloatingPointKind : uint8_t;\n\n        struct WithinAbsMatcher : MatcherBase<double> {\n            WithinAbsMatcher(double target, double margin);\n            bool match(double const& matchee) const override;\n            std::string describe() const override;\n        private:\n            double m_target;\n            double m_margin;\n        };\n\n        struct WithinUlpsMatcher : MatcherBase<double> {\n            WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType);\n            bool match(double const& matchee) const override;\n            std::string describe() const override;\n        private:\n            double m_target;\n            int m_ulps;\n            FloatingPointKind m_type;\n        };\n\n    } // namespace Floating\n\n    // The following functions create the actual matcher objects.\n    // This allows the types to be inferred\n    Floating::WithinUlpsMatcher WithinULP(double target, int maxUlpDiff);\n    Floating::WithinUlpsMatcher WithinULP(float target, int maxUlpDiff);\n    Floating::WithinAbsMatcher WithinAbs(double target, double margin);\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_floating.h\n// start catch_matchers_generic.hpp\n\n#include <functional>\n#include <string>\n\nnamespace Catch {\nnamespace Matchers {\nnamespace Generic {\n\nnamespace Detail {\n    std::string finalizeDescription(const std::string& desc);\n}\n\ntemplate <typename T>\nclass PredicateMatcher : public MatcherBase<T> {\n    std::function<bool(T const&)> m_predicate;\n    std::string m_description;\npublic:\n\n    PredicateMatcher(std::function<bool(T const&)> const& elem, std::string const& descr)\n        :m_predicate(std::move(elem)),\n        m_description(Detail::finalizeDescription(descr))\n    {}\n\n    bool match( T const& item ) const override {\n        return m_predicate(item);\n    }\n\n    std::string describe() const override {\n        return m_description;\n    }\n};\n\n} // namespace Generic\n\n    // The following functions create the actual matcher objects.\n    // The user has to explicitly specify type to the function, because\n    // inferring std::function<bool(T const&)> is hard (but possible) and\n    // requires a lot of TMP.\n    template<typename T>\n    Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate, std::string const& description = \"\") {\n        return Generic::PredicateMatcher<T>(predicate, description);\n    }\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_generic.hpp\n// start catch_matchers_string.h\n\n#include <string>\n\nnamespace Catch {\nnamespace Matchers {\n\n    namespace StdString {\n\n        struct CasedString\n        {\n            CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity );\n            std::string adjustString( std::string const& str ) const;\n            std::string caseSensitivitySuffix() const;\n\n            CaseSensitive::Choice m_caseSensitivity;\n            std::string m_str;\n        };\n\n        struct StringMatcherBase : MatcherBase<std::string> {\n            StringMatcherBase( std::string const& operation, CasedString const& comparator );\n            std::string describe() const override;\n\n            CasedString m_comparator;\n            std::string m_operation;\n        };\n\n        struct EqualsMatcher : StringMatcherBase {\n            EqualsMatcher( CasedString const& comparator );\n            bool match( std::string const& source ) const override;\n        };\n        struct ContainsMatcher : StringMatcherBase {\n            ContainsMatcher( CasedString const& comparator );\n            bool match( std::string const& source ) const override;\n        };\n        struct StartsWithMatcher : StringMatcherBase {\n            StartsWithMatcher( CasedString const& comparator );\n            bool match( std::string const& source ) const override;\n        };\n        struct EndsWithMatcher : StringMatcherBase {\n            EndsWithMatcher( CasedString const& comparator );\n            bool match( std::string const& source ) const override;\n        };\n\n        struct RegexMatcher : MatcherBase<std::string> {\n            RegexMatcher( std::string regex, CaseSensitive::Choice caseSensitivity );\n            bool match( std::string const& matchee ) const override;\n            std::string describe() const override;\n\n        private:\n            std::string m_regex;\n            CaseSensitive::Choice m_caseSensitivity;\n        };\n\n    } // namespace StdString\n\n    // The following functions create the actual matcher objects.\n    // This allows the types to be inferred\n\n    StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n    StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n    StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n    StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n    StdString::RegexMatcher Matches( std::string const& regex, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_string.h\n// start catch_matchers_vector.h\n\n#include <algorithm>\n\nnamespace Catch {\nnamespace Matchers {\n\n    namespace Vector {\n        template<typename T>\n        struct ContainsElementMatcher : MatcherBase<std::vector<T>> {\n\n            ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {}\n\n            bool match(std::vector<T> const &v) const override {\n                for (auto const& el : v) {\n                    if (el == m_comparator) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n\n            std::string describe() const override {\n                return \"Contains: \" + ::Catch::Detail::stringify( m_comparator );\n            }\n\n            T const& m_comparator;\n        };\n\n        template<typename T>\n        struct ContainsMatcher : MatcherBase<std::vector<T>> {\n\n            ContainsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {}\n\n            bool match(std::vector<T> const &v) const override {\n                // !TBD: see note in EqualsMatcher\n                if (m_comparator.size() > v.size())\n                    return false;\n                for (auto const& comparator : m_comparator) {\n                    auto present = false;\n                    for (const auto& el : v) {\n                        if (el == comparator) {\n                            present = true;\n                            break;\n                        }\n                    }\n                    if (!present) {\n                        return false;\n                    }\n                }\n                return true;\n            }\n            std::string describe() const override {\n                return \"Contains: \" + ::Catch::Detail::stringify( m_comparator );\n            }\n\n            std::vector<T> const& m_comparator;\n        };\n\n        template<typename T>\n        struct EqualsMatcher : MatcherBase<std::vector<T>> {\n\n            EqualsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {}\n\n            bool match(std::vector<T> const &v) const override {\n                // !TBD: This currently works if all elements can be compared using !=\n                // - a more general approach would be via a compare template that defaults\n                // to using !=. but could be specialised for, e.g. std::vector<T> etc\n                // - then just call that directly\n                if (m_comparator.size() != v.size())\n                    return false;\n                for (std::size_t i = 0; i < v.size(); ++i)\n                    if (m_comparator[i] != v[i])\n                        return false;\n                return true;\n            }\n            std::string describe() const override {\n                return \"Equals: \" + ::Catch::Detail::stringify( m_comparator );\n            }\n            std::vector<T> const& m_comparator;\n        };\n\n        template<typename T>\n        struct ApproxMatcher : MatcherBase<std::vector<T>> {\n\n            ApproxMatcher(std::vector<T> const& comparator) : m_comparator( comparator ) {}\n\n            bool match(std::vector<T> const &v) const override {\n                if (m_comparator.size() != v.size())\n                    return false;\n                for (std::size_t i = 0; i < v.size(); ++i)\n                    if (m_comparator[i] != approx(v[i]))\n                        return false;\n                return true;\n            }\n            std::string describe() const override {\n                return \"is approx: \" + ::Catch::Detail::stringify( m_comparator );\n            }\n            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n            ApproxMatcher& epsilon( T const& newEpsilon ) {\n                approx.epsilon(newEpsilon);\n                return *this;\n            }\n            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n            ApproxMatcher& margin( T const& newMargin ) {\n                approx.margin(newMargin);\n                return *this;\n            }\n            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n            ApproxMatcher& scale( T const& newScale ) {\n                approx.scale(newScale);\n                return *this;\n            }\n\n            std::vector<T> const& m_comparator;\n            mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom();\n        };\n\n        template<typename T>\n        struct UnorderedEqualsMatcher : MatcherBase<std::vector<T>> {\n            UnorderedEqualsMatcher(std::vector<T> const& target) : m_target(target) {}\n            bool match(std::vector<T> const& vec) const override {\n                // Note: This is a reimplementation of std::is_permutation,\n                //       because I don't want to include <algorithm> inside the common path\n                if (m_target.size() != vec.size()) {\n                    return false;\n                }\n                return std::is_permutation(m_target.begin(), m_target.end(), vec.begin());\n            }\n\n            std::string describe() const override {\n                return \"UnorderedEquals: \" + ::Catch::Detail::stringify(m_target);\n            }\n        private:\n            std::vector<T> const& m_target;\n        };\n\n    } // namespace Vector\n\n    // The following functions create the actual matcher objects.\n    // This allows the types to be inferred\n\n    template<typename T>\n    Vector::ContainsMatcher<T> Contains( std::vector<T> const& comparator ) {\n        return Vector::ContainsMatcher<T>( comparator );\n    }\n\n    template<typename T>\n    Vector::ContainsElementMatcher<T> VectorContains( T const& comparator ) {\n        return Vector::ContainsElementMatcher<T>( comparator );\n    }\n\n    template<typename T>\n    Vector::EqualsMatcher<T> Equals( std::vector<T> const& comparator ) {\n        return Vector::EqualsMatcher<T>( comparator );\n    }\n\n    template<typename T>\n    Vector::ApproxMatcher<T> Approx( std::vector<T> const& comparator ) {\n        return Vector::ApproxMatcher<T>( comparator );\n    }\n\n    template<typename T>\n    Vector::UnorderedEqualsMatcher<T> UnorderedEquals(std::vector<T> const& target) {\n        return Vector::UnorderedEqualsMatcher<T>(target);\n    }\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_vector.h\nnamespace Catch {\n\n    template<typename ArgT, typename MatcherT>\n    class MatchExpr : public ITransientExpression {\n        ArgT const& m_arg;\n        MatcherT m_matcher;\n        StringRef m_matcherString;\n    public:\n        MatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString )\n        :   ITransientExpression{ true, matcher.match( arg ) },\n            m_arg( arg ),\n            m_matcher( matcher ),\n            m_matcherString( matcherString )\n        {}\n\n        void streamReconstructedExpression( std::ostream &os ) const override {\n            auto matcherAsString = m_matcher.toString();\n            os << Catch::Detail::stringify( m_arg ) << ' ';\n            if( matcherAsString == Detail::unprintableString )\n                os << m_matcherString;\n            else\n                os << matcherAsString;\n        }\n    };\n\n    using StringMatcher = Matchers::Impl::MatcherBase<std::string>;\n\n    void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString  );\n\n    template<typename ArgT, typename MatcherT>\n    auto makeMatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString  ) -> MatchExpr<ArgT, MatcherT> {\n        return MatchExpr<ArgT, MatcherT>( arg, matcher, matcherString );\n    }\n\n} // namespace Catch\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) \", \" CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \\\n        INTERNAL_CATCH_TRY { \\\n            catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher, #matcher##_catch_sr ) ); \\\n        } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_THROWS_MATCHES( macroName, exceptionType, resultDisposition, matcher, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) \", \" CATCH_INTERNAL_STRINGIFY(exceptionType) \", \" CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \\\n        if( catchAssertionHandler.allowThrows() ) \\\n            try { \\\n                static_cast<void>(__VA_ARGS__ ); \\\n                catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \\\n            } \\\n            catch( exceptionType const& ex ) { \\\n                catchAssertionHandler.handleExpr( Catch::makeMatchExpr( ex, matcher, #matcher##_catch_sr ) ); \\\n            } \\\n            catch( ... ) { \\\n                catchAssertionHandler.handleUnexpectedInflightException(); \\\n            } \\\n        else \\\n            catchAssertionHandler.handleThrowingCallSkipped(); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n// end catch_capture_matchers.h\n#endif\n// start catch_generators.hpp\n\n// start catch_interfaces_generatortracker.h\n\n\n#include <memory>\n\nnamespace Catch {\n\n    namespace Generators {\n        class GeneratorUntypedBase {\n        public:\n            GeneratorUntypedBase() = default;\n            virtual ~GeneratorUntypedBase();\n            // Attempts to move the generator to the next element\n             //\n             // Returns true iff the move succeeded (and a valid element\n             // can be retrieved).\n            virtual bool next() = 0;\n        };\n        using GeneratorBasePtr = std::unique_ptr<GeneratorUntypedBase>;\n\n    } // namespace Generators\n\n    struct IGeneratorTracker {\n        virtual ~IGeneratorTracker();\n        virtual auto hasGenerator() const -> bool = 0;\n        virtual auto getGenerator() const -> Generators::GeneratorBasePtr const& = 0;\n        virtual void setGenerator( Generators::GeneratorBasePtr&& generator ) = 0;\n    };\n\n} // namespace Catch\n\n// end catch_interfaces_generatortracker.h\n// start catch_enforce.h\n\n#include <exception>\n\nnamespace Catch {\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n    template <typename Ex>\n    [[noreturn]]\n    void throw_exception(Ex const& e) {\n        throw e;\n    }\n#else // ^^ Exceptions are enabled //  Exceptions are disabled vv\n    [[noreturn]]\n    void throw_exception(std::exception const& e);\n#endif\n\n    [[noreturn]]\n    void throw_logic_error(std::string const& msg);\n    [[noreturn]]\n    void throw_domain_error(std::string const& msg);\n    [[noreturn]]\n    void throw_runtime_error(std::string const& msg);\n\n} // namespace Catch;\n\n#define CATCH_MAKE_MSG(...) \\\n    (Catch::ReusableStringStream() << __VA_ARGS__).str()\n\n#define CATCH_INTERNAL_ERROR(...) \\\n    Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << \": Internal Catch2 error: \" << __VA_ARGS__));\n\n#define CATCH_ERROR(...) \\\n    Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ ));\n\n#define CATCH_RUNTIME_ERROR(...) \\\n    Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ ));\n\n#define CATCH_ENFORCE( condition, ... ) \\\n    do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false)\n\n// end catch_enforce.h\n#include <memory>\n#include <vector>\n#include <cassert>\n\n#include <utility>\n#include <exception>\n\nnamespace Catch {\n\nclass GeneratorException : public std::exception {\n    const char* const m_msg = \"\";\n\npublic:\n    GeneratorException(const char* msg):\n        m_msg(msg)\n    {}\n\n    const char* what() const noexcept override final;\n};\n\nnamespace Generators {\n\n    // !TBD move this into its own location?\n    namespace pf{\n        template<typename T, typename... Args>\n        std::unique_ptr<T> make_unique( Args&&... args ) {\n            return std::unique_ptr<T>(new T(std::forward<Args>(args)...));\n        }\n    }\n\n    template<typename T>\n    struct IGenerator : GeneratorUntypedBase {\n        virtual ~IGenerator() = default;\n\n        // Returns the current element of the generator\n        //\n        // \\Precondition The generator is either freshly constructed,\n        // or the last call to `next()` returned true\n        virtual T const& get() const = 0;\n        using type = T;\n    };\n\n    template<typename T>\n    class SingleValueGenerator final : public IGenerator<T> {\n        T m_value;\n    public:\n        SingleValueGenerator(T const& value) : m_value( value ) {}\n        SingleValueGenerator(T&& value) : m_value(std::move(value)) {}\n\n        T const& get() const override {\n            return m_value;\n        }\n        bool next() override {\n            return false;\n        }\n    };\n\n    template<typename T>\n    class FixedValuesGenerator final : public IGenerator<T> {\n        std::vector<T> m_values;\n        size_t m_idx = 0;\n    public:\n        FixedValuesGenerator( std::initializer_list<T> values ) : m_values( values ) {}\n\n        T const& get() const override {\n            return m_values[m_idx];\n        }\n        bool next() override {\n            ++m_idx;\n            return m_idx < m_values.size();\n        }\n    };\n\n    template <typename T>\n    class GeneratorWrapper final {\n        std::unique_ptr<IGenerator<T>> m_generator;\n    public:\n        GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator):\n            m_generator(std::move(generator))\n        {}\n        T const& get() const {\n            return m_generator->get();\n        }\n        bool next() {\n            return m_generator->next();\n        }\n    };\n\n    template <typename T>\n    GeneratorWrapper<T> value(T&& value) {\n        return GeneratorWrapper<T>(pf::make_unique<SingleValueGenerator<T>>(std::forward<T>(value)));\n    }\n    template <typename T>\n    GeneratorWrapper<T> values(std::initializer_list<T> values) {\n        return GeneratorWrapper<T>(pf::make_unique<FixedValuesGenerator<T>>(values));\n    }\n\n    template<typename T>\n    class Generators : public IGenerator<T> {\n        std::vector<GeneratorWrapper<T>> m_generators;\n        size_t m_current = 0;\n\n        void populate(GeneratorWrapper<T>&& generator) {\n            m_generators.emplace_back(std::move(generator));\n        }\n        void populate(T&& val) {\n            m_generators.emplace_back(value(std::move(val)));\n        }\n        template<typename U>\n        void populate(U&& val) {\n            populate(T(std::move(val)));\n        }\n        template<typename U, typename... Gs>\n        void populate(U&& valueOrGenerator, Gs... moreGenerators) {\n            populate(std::forward<U>(valueOrGenerator));\n            populate(std::forward<Gs>(moreGenerators)...);\n        }\n\n    public:\n        template <typename... Gs>\n        Generators(Gs... moreGenerators) {\n            m_generators.reserve(sizeof...(Gs));\n            populate(std::forward<Gs>(moreGenerators)...);\n        }\n\n        T const& get() const override {\n            return m_generators[m_current].get();\n        }\n\n        bool next() override {\n            if (m_current >= m_generators.size()) {\n                return false;\n            }\n            const bool current_status = m_generators[m_current].next();\n            if (!current_status) {\n                ++m_current;\n            }\n            return m_current < m_generators.size();\n        }\n    };\n\n    template<typename... Ts>\n    GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std::tuple<typename std::decay<Ts>::type...>> tuples ) {\n        return values<std::tuple<Ts...>>( tuples );\n    }\n\n    // Tag type to signal that a generator sequence should convert arguments to a specific type\n    template <typename T>\n    struct as {};\n\n    template<typename T, typename... Gs>\n    auto makeGenerators( GeneratorWrapper<T>&& generator, Gs... moreGenerators ) -> Generators<T> {\n        return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...);\n    }\n    template<typename T>\n    auto makeGenerators( GeneratorWrapper<T>&& generator ) -> Generators<T> {\n        return Generators<T>(std::move(generator));\n    }\n    template<typename T, typename... Gs>\n    auto makeGenerators( T&& val, Gs... moreGenerators ) -> Generators<T> {\n        return makeGenerators( value( std::forward<T>( val ) ), std::forward<Gs>( moreGenerators )... );\n    }\n    template<typename T, typename U, typename... Gs>\n    auto makeGenerators( as<T>, U&& val, Gs... moreGenerators ) -> Generators<T> {\n        return makeGenerators( value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... );\n    }\n\n    auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker&;\n\n    template<typename L>\n    // Note: The type after -> is weird, because VS2015 cannot parse\n    //       the expression used in the typedef inside, when it is in\n    //       return type. Yeah.\n    auto generate( SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) {\n        using UnderlyingType = typename decltype(generatorExpression())::type;\n\n        IGeneratorTracker& tracker = acquireGeneratorTracker( lineInfo );\n        if (!tracker.hasGenerator()) {\n            tracker.setGenerator(pf::make_unique<Generators<UnderlyingType>>(generatorExpression()));\n        }\n\n        auto const& generator = static_cast<IGenerator<UnderlyingType> const&>( *tracker.getGenerator() );\n        return generator.get();\n    }\n\n} // namespace Generators\n} // namespace Catch\n\n#define GENERATE( ... ) \\\n    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )\n#define GENERATE_COPY( ... ) \\\n    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )\n#define GENERATE_REF( ... ) \\\n    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )\n\n// end catch_generators.hpp\n// start catch_generators_generic.hpp\n\nnamespace Catch {\nnamespace Generators {\n\n    template <typename T>\n    class TakeGenerator : public IGenerator<T> {\n        GeneratorWrapper<T> m_generator;\n        size_t m_returned = 0;\n        size_t m_target;\n    public:\n        TakeGenerator(size_t target, GeneratorWrapper<T>&& generator):\n            m_generator(std::move(generator)),\n            m_target(target)\n        {\n            assert(target != 0 && \"Empty generators are not allowed\");\n        }\n        T const& get() const override {\n            return m_generator.get();\n        }\n        bool next() override {\n            ++m_returned;\n            if (m_returned >= m_target) {\n                return false;\n            }\n\n            const auto success = m_generator.next();\n            // If the underlying generator does not contain enough values\n            // then we cut short as well\n            if (!success) {\n                m_returned = m_target;\n            }\n            return success;\n        }\n    };\n\n    template <typename T>\n    GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) {\n        return GeneratorWrapper<T>(pf::make_unique<TakeGenerator<T>>(target, std::move(generator)));\n    }\n\n    template <typename T, typename Predicate>\n    class FilterGenerator : public IGenerator<T> {\n        GeneratorWrapper<T> m_generator;\n        Predicate m_predicate;\n    public:\n        template <typename P = Predicate>\n        FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator):\n            m_generator(std::move(generator)),\n            m_predicate(std::forward<P>(pred))\n        {\n            if (!m_predicate(m_generator.get())) {\n                // It might happen that there are no values that pass the\n                // filter. In that case we throw an exception.\n                auto has_initial_value = next();\n                if (!has_initial_value) {\n                    Catch::throw_exception(GeneratorException(\"No valid value found in filtered generator\"));\n                }\n            }\n        }\n\n        T const& get() const override {\n            return m_generator.get();\n        }\n\n        bool next() override {\n            bool success = m_generator.next();\n            if (!success) {\n                return false;\n            }\n            while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true);\n            return success;\n        }\n    };\n\n    template <typename T, typename Predicate>\n    GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) {\n        return GeneratorWrapper<T>(std::unique_ptr<IGenerator<T>>(pf::make_unique<FilterGenerator<T, Predicate>>(std::forward<Predicate>(pred), std::move(generator))));\n    }\n\n    template <typename T>\n    class RepeatGenerator : public IGenerator<T> {\n        GeneratorWrapper<T> m_generator;\n        mutable std::vector<T> m_returned;\n        size_t m_target_repeats;\n        size_t m_current_repeat = 0;\n        size_t m_repeat_index = 0;\n    public:\n        RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):\n            m_generator(std::move(generator)),\n            m_target_repeats(repeats)\n        {\n            assert(m_target_repeats > 0 && \"Repeat generator must repeat at least once\");\n        }\n\n        T const& get() const override {\n            if (m_current_repeat == 0) {\n                m_returned.push_back(m_generator.get());\n                return m_returned.back();\n            }\n            return m_returned[m_repeat_index];\n        }\n\n        bool next() override {\n            // There are 2 basic cases:\n            // 1) We are still reading the generator\n            // 2) We are reading our own cache\n\n            // In the first case, we need to poke the underlying generator.\n            // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache\n            if (m_current_repeat == 0) {\n                const auto success = m_generator.next();\n                if (!success) {\n                    ++m_current_repeat;\n                }\n                return m_current_repeat < m_target_repeats;\n            }\n\n            // In the second case, we need to move indices forward and check that we haven't run up against the end\n            ++m_repeat_index;\n            if (m_repeat_index == m_returned.size()) {\n                m_repeat_index = 0;\n                ++m_current_repeat;\n            }\n            return m_current_repeat < m_target_repeats;\n        }\n    };\n\n    template <typename T>\n    GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) {\n        return GeneratorWrapper<T>(pf::make_unique<RepeatGenerator<T>>(repeats, std::move(generator)));\n    }\n\n    template <typename T, typename U, typename Func>\n    class MapGenerator : public IGenerator<T> {\n        // TBD: provide static assert for mapping function, for friendly error message\n        GeneratorWrapper<U> m_generator;\n        Func m_function;\n        // To avoid returning dangling reference, we have to save the values\n        T m_cache;\n    public:\n        template <typename F2 = Func>\n        MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :\n            m_generator(std::move(generator)),\n            m_function(std::forward<F2>(function)),\n            m_cache(m_function(m_generator.get()))\n        {}\n\n        T const& get() const override {\n            return m_cache;\n        }\n        bool next() override {\n            const auto success = m_generator.next();\n            if (success) {\n                m_cache = m_function(m_generator.get());\n            }\n            return success;\n        }\n    };\n\n#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703\n    // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is\n    // replaced with std::invoke_result here. Also *_t format is preferred over\n    // typename *::type format.\n    template <typename Func, typename U>\n    using MapFunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>;\n#else\n    template <typename Func, typename U>\n    using MapFunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type;\n#endif\n\n    template <typename Func, typename U, typename T = MapFunctionReturnType<Func, U>>\n    GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {\n        return GeneratorWrapper<T>(\n            pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))\n        );\n    }\n\n    template <typename T, typename U, typename Func>\n    GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {\n        return GeneratorWrapper<T>(\n            pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))\n        );\n    }\n\n    template <typename T>\n    class ChunkGenerator final : public IGenerator<std::vector<T>> {\n        std::vector<T> m_chunk;\n        size_t m_chunk_size;\n        GeneratorWrapper<T> m_generator;\n        bool m_used_up = false;\n    public:\n        ChunkGenerator(size_t size, GeneratorWrapper<T> generator) :\n            m_chunk_size(size), m_generator(std::move(generator))\n        {\n            m_chunk.reserve(m_chunk_size);\n            m_chunk.push_back(m_generator.get());\n            for (size_t i = 1; i < m_chunk_size; ++i) {\n                if (!m_generator.next()) {\n                    Catch::throw_exception(GeneratorException(\"Not enough values to initialize the first chunk\"));\n                }\n                m_chunk.push_back(m_generator.get());\n            }\n        }\n        std::vector<T> const& get() const override {\n            return m_chunk;\n        }\n        bool next() override {\n            m_chunk.clear();\n            for (size_t idx = 0; idx < m_chunk_size; ++idx) {\n                if (!m_generator.next()) {\n                    return false;\n                }\n                m_chunk.push_back(m_generator.get());\n            }\n            return true;\n        }\n    };\n\n    template <typename T>\n    GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper<T>&& generator) {\n        return GeneratorWrapper<std::vector<T>>(\n            pf::make_unique<ChunkGenerator<T>>(size, std::move(generator))\n        );\n    }\n\n} // namespace Generators\n} // namespace Catch\n\n// end catch_generators_generic.hpp\n// start catch_generators_specific.hpp\n\n// start catch_context.h\n\n#include <memory>\n\nnamespace Catch {\n\n    struct IResultCapture;\n    struct IRunner;\n    struct IConfig;\n    struct IMutableContext;\n\n    using IConfigPtr = std::shared_ptr<IConfig const>;\n\n    struct IContext\n    {\n        virtual ~IContext();\n\n        virtual IResultCapture* getResultCapture() = 0;\n        virtual IRunner* getRunner() = 0;\n        virtual IConfigPtr const& getConfig() const = 0;\n    };\n\n    struct IMutableContext : IContext\n    {\n        virtual ~IMutableContext();\n        virtual void setResultCapture( IResultCapture* resultCapture ) = 0;\n        virtual void setRunner( IRunner* runner ) = 0;\n        virtual void setConfig( IConfigPtr const& config ) = 0;\n\n    private:\n        static IMutableContext *currentContext;\n        friend IMutableContext& getCurrentMutableContext();\n        friend void cleanUpContext();\n        static void createContext();\n    };\n\n    inline IMutableContext& getCurrentMutableContext()\n    {\n        if( !IMutableContext::currentContext )\n            IMutableContext::createContext();\n        return *IMutableContext::currentContext;\n    }\n\n    inline IContext& getCurrentContext()\n    {\n        return getCurrentMutableContext();\n    }\n\n    void cleanUpContext();\n}\n\n// end catch_context.h\n// start catch_interfaces_config.h\n\n// start catch_option.hpp\n\nnamespace Catch {\n\n    // An optional type\n    template<typename T>\n    class Option {\n    public:\n        Option() : nullableValue( nullptr ) {}\n        Option( T const& _value )\n        : nullableValue( new( storage ) T( _value ) )\n        {}\n        Option( Option const& _other )\n        : nullableValue( _other ? new( storage ) T( *_other ) : nullptr )\n        {}\n\n        ~Option() {\n            reset();\n        }\n\n        Option& operator= ( Option const& _other ) {\n            if( &_other != this ) {\n                reset();\n                if( _other )\n                    nullableValue = new( storage ) T( *_other );\n            }\n            return *this;\n        }\n        Option& operator = ( T const& _value ) {\n            reset();\n            nullableValue = new( storage ) T( _value );\n            return *this;\n        }\n\n        void reset() {\n            if( nullableValue )\n                nullableValue->~T();\n            nullableValue = nullptr;\n        }\n\n        T& operator*() { return *nullableValue; }\n        T const& operator*() const { return *nullableValue; }\n        T* operator->() { return nullableValue; }\n        const T* operator->() const { return nullableValue; }\n\n        T valueOr( T const& defaultValue ) const {\n            return nullableValue ? *nullableValue : defaultValue;\n        }\n\n        bool some() const { return nullableValue != nullptr; }\n        bool none() const { return nullableValue == nullptr; }\n\n        bool operator !() const { return nullableValue == nullptr; }\n        explicit operator bool() const {\n            return some();\n        }\n\n    private:\n        T *nullableValue;\n        alignas(alignof(T)) char storage[sizeof(T)];\n    };\n\n} // end namespace Catch\n\n// end catch_option.hpp\n#include <iosfwd>\n#include <string>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    enum class Verbosity {\n        Quiet = 0,\n        Normal,\n        High\n    };\n\n    struct WarnAbout { enum What {\n        Nothing = 0x00,\n        NoAssertions = 0x01,\n        NoTests = 0x02\n    }; };\n\n    struct ShowDurations { enum OrNot {\n        DefaultForReporter,\n        Always,\n        Never\n    }; };\n    struct RunTests { enum InWhatOrder {\n        InDeclarationOrder,\n        InLexicographicalOrder,\n        InRandomOrder\n    }; };\n    struct UseColour { enum YesOrNo {\n        Auto,\n        Yes,\n        No\n    }; };\n    struct WaitForKeypress { enum When {\n        Never,\n        BeforeStart = 1,\n        BeforeExit = 2,\n        BeforeStartAndExit = BeforeStart | BeforeExit\n    }; };\n\n    class TestSpec;\n\n    struct IConfig : NonCopyable {\n\n        virtual ~IConfig();\n\n        virtual bool allowThrows() const = 0;\n        virtual std::ostream& stream() const = 0;\n        virtual std::string name() const = 0;\n        virtual bool includeSuccessfulResults() const = 0;\n        virtual bool shouldDebugBreak() const = 0;\n        virtual bool warnAboutMissingAssertions() const = 0;\n        virtual bool warnAboutNoTests() const = 0;\n        virtual int abortAfter() const = 0;\n        virtual bool showInvisibles() const = 0;\n        virtual ShowDurations::OrNot showDurations() const = 0;\n        virtual TestSpec const& testSpec() const = 0;\n        virtual bool hasTestFilters() const = 0;\n        virtual std::vector<std::string> const& getTestsOrTags() const = 0;\n        virtual RunTests::InWhatOrder runOrder() const = 0;\n        virtual unsigned int rngSeed() const = 0;\n        virtual UseColour::YesOrNo useColour() const = 0;\n        virtual std::vector<std::string> const& getSectionsToRun() const = 0;\n        virtual Verbosity verbosity() const = 0;\n\n        virtual bool benchmarkNoAnalysis() const = 0;\n        virtual int benchmarkSamples() const = 0;\n        virtual double benchmarkConfidenceInterval() const = 0;\n        virtual unsigned int benchmarkResamples() const = 0;\n    };\n\n    using IConfigPtr = std::shared_ptr<IConfig const>;\n}\n\n// end catch_interfaces_config.h\n#include <random>\n\nnamespace Catch {\nnamespace Generators {\n\ntemplate <typename Float>\nclass RandomFloatingGenerator final : public IGenerator<Float> {\n    // FIXME: What is the right seed?\n    std::minstd_rand m_rand;\n    std::uniform_real_distribution<Float> m_dist;\n    Float m_current_number;\npublic:\n\n    RandomFloatingGenerator(Float a, Float b):\n        m_rand(getCurrentContext().getConfig()->rngSeed()),\n        m_dist(a, b) {\n        static_cast<void>(next());\n    }\n\n    Float const& get() const override {\n        return m_current_number;\n    }\n    bool next() override {\n        m_current_number = m_dist(m_rand);\n        return true;\n    }\n};\n\ntemplate <typename Integer>\nclass RandomIntegerGenerator final : public IGenerator<Integer> {\n    std::minstd_rand m_rand;\n    std::uniform_int_distribution<Integer> m_dist;\n    Integer m_current_number;\npublic:\n\n    RandomIntegerGenerator(Integer a, Integer b):\n        m_rand(getCurrentContext().getConfig()->rngSeed()),\n        m_dist(a, b) {\n        static_cast<void>(next());\n    }\n\n    Integer const& get() const override {\n        return m_current_number;\n    }\n    bool next() override {\n        m_current_number = m_dist(m_rand);\n        return true;\n    }\n};\n\n// TODO: Ideally this would be also constrained against the various char types,\n//       but I don't expect users to run into that in practice.\ntemplate <typename T>\ntypename std::enable_if<std::is_integral<T>::value && !std::is_same<T, bool>::value,\nGeneratorWrapper<T>>::type\nrandom(T a, T b) {\n    return GeneratorWrapper<T>(\n        pf::make_unique<RandomIntegerGenerator<T>>(a, b)\n    );\n}\n\ntemplate <typename T>\ntypename std::enable_if<std::is_floating_point<T>::value,\nGeneratorWrapper<T>>::type\nrandom(T a, T b) {\n    return GeneratorWrapper<T>(\n        pf::make_unique<RandomFloatingGenerator<T>>(a, b)\n    );\n}\n\ntemplate <typename T>\nclass RangeGenerator final : public IGenerator<T> {\n    T m_current;\n    T m_end;\n    T m_step;\n    bool m_positive;\n\npublic:\n    RangeGenerator(T const& start, T const& end, T const& step):\n        m_current(start),\n        m_end(end),\n        m_step(step),\n        m_positive(m_step > T(0))\n    {\n        assert(m_current != m_end && \"Range start and end cannot be equal\");\n        assert(m_step != T(0) && \"Step size cannot be zero\");\n        assert(((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) && \"Step moves away from end\");\n    }\n\n    RangeGenerator(T const& start, T const& end):\n        RangeGenerator(start, end, (start < end) ? T(1) : T(-1))\n    {}\n\n    T const& get() const override {\n        return m_current;\n    }\n\n    bool next() override {\n        m_current += m_step;\n        return (m_positive) ? (m_current < m_end) : (m_current > m_end);\n    }\n};\n\ntemplate <typename T>\nGeneratorWrapper<T> range(T const& start, T const& end, T const& step) {\n    static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, \"Type must be an integer\");\n    return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step));\n}\n\ntemplate <typename T>\nGeneratorWrapper<T> range(T const& start, T const& end) {\n    static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, \"Type must be an integer\");\n    return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end));\n}\n\n} // namespace Generators\n} // namespace Catch\n\n// end catch_generators_specific.hpp\n\n// These files are included here so the single_include script doesn't put them\n// in the conditionally compiled sections\n// start catch_test_case_info.h\n\n#include <string>\n#include <vector>\n#include <memory>\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\nnamespace Catch {\n\n    struct ITestInvoker;\n\n    struct TestCaseInfo {\n        enum SpecialProperties{\n            None = 0,\n            IsHidden = 1 << 1,\n            ShouldFail = 1 << 2,\n            MayFail = 1 << 3,\n            Throws = 1 << 4,\n            NonPortable = 1 << 5,\n            Benchmark = 1 << 6\n        };\n\n        TestCaseInfo(   std::string const& _name,\n                        std::string const& _className,\n                        std::string const& _description,\n                        std::vector<std::string> const& _tags,\n                        SourceLineInfo const& _lineInfo );\n\n        friend void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags );\n\n        bool isHidden() const;\n        bool throws() const;\n        bool okToFail() const;\n        bool expectedToFail() const;\n\n        std::string tagsAsString() const;\n\n        std::string name;\n        std::string className;\n        std::string description;\n        std::vector<std::string> tags;\n        std::vector<std::string> lcaseTags;\n        SourceLineInfo lineInfo;\n        SpecialProperties properties;\n    };\n\n    class TestCase : public TestCaseInfo {\n    public:\n\n        TestCase( ITestInvoker* testCase, TestCaseInfo&& info );\n\n        TestCase withName( std::string const& _newName ) const;\n\n        void invoke() const;\n\n        TestCaseInfo const& getTestCaseInfo() const;\n\n        bool operator == ( TestCase const& other ) const;\n        bool operator < ( TestCase const& other ) const;\n\n    private:\n        std::shared_ptr<ITestInvoker> test;\n    };\n\n    TestCase makeTestCase(  ITestInvoker* testCase,\n                            std::string const& className,\n                            NameAndTags const& nameAndTags,\n                            SourceLineInfo const& lineInfo );\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// end catch_test_case_info.h\n// start catch_interfaces_runner.h\n\nnamespace Catch {\n\n    struct IRunner {\n        virtual ~IRunner();\n        virtual bool aborting() const = 0;\n    };\n}\n\n// end catch_interfaces_runner.h\n\n#ifdef __OBJC__\n// start catch_objc.hpp\n\n#import <objc/runtime.h>\n\n#include <string>\n\n// NB. Any general catch headers included here must be included\n// in catch.hpp first to make sure they are included by the single\n// header for non obj-usage\n\n///////////////////////////////////////////////////////////////////////////////\n// This protocol is really only here for (self) documenting purposes, since\n// all its methods are optional.\n@protocol OcFixture\n\n@optional\n\n-(void) setUp;\n-(void) tearDown;\n\n@end\n\nnamespace Catch {\n\n    class OcMethod : public ITestInvoker {\n\n    public:\n        OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {}\n\n        virtual void invoke() const {\n            id obj = [[m_cls alloc] init];\n\n            performOptionalSelector( obj, @selector(setUp)  );\n            performOptionalSelector( obj, m_sel );\n            performOptionalSelector( obj, @selector(tearDown)  );\n\n            arcSafeRelease( obj );\n        }\n    private:\n        virtual ~OcMethod() {}\n\n        Class m_cls;\n        SEL m_sel;\n    };\n\n    namespace Detail{\n\n        inline std::string getAnnotation(   Class cls,\n                                            std::string const& annotationName,\n                                            std::string const& testCaseName ) {\n            NSString* selStr = [[NSString alloc] initWithFormat:@\"Catch_%s_%s\", annotationName.c_str(), testCaseName.c_str()];\n            SEL sel = NSSelectorFromString( selStr );\n            arcSafeRelease( selStr );\n            id value = performOptionalSelector( cls, sel );\n            if( value )\n                return [(NSString*)value UTF8String];\n            return \"\";\n        }\n    }\n\n    inline std::size_t registerTestMethods() {\n        std::size_t noTestMethods = 0;\n        int noClasses = objc_getClassList( nullptr, 0 );\n\n        Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses);\n        objc_getClassList( classes, noClasses );\n\n        for( int c = 0; c < noClasses; c++ ) {\n            Class cls = classes[c];\n            {\n                u_int count;\n                Method* methods = class_copyMethodList( cls, &count );\n                for( u_int m = 0; m < count ; m++ ) {\n                    SEL selector = method_getName(methods[m]);\n                    std::string methodName = sel_getName(selector);\n                    if( startsWith( methodName, \"Catch_TestCase_\" ) ) {\n                        std::string testCaseName = methodName.substr( 15 );\n                        std::string name = Detail::getAnnotation( cls, \"Name\", testCaseName );\n                        std::string desc = Detail::getAnnotation( cls, \"Description\", testCaseName );\n                        const char* className = class_getName( cls );\n\n                        getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, NameAndTags( name.c_str(), desc.c_str() ), SourceLineInfo(\"\",0) ) );\n                        noTestMethods++;\n                    }\n                }\n                free(methods);\n            }\n        }\n        return noTestMethods;\n    }\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n\n    namespace Matchers {\n        namespace Impl {\n        namespace NSStringMatchers {\n\n            struct StringHolder : MatcherBase<NSString*>{\n                StringHolder( NSString* substr ) : m_substr( [substr copy] ){}\n                StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){}\n                StringHolder() {\n                    arcSafeRelease( m_substr );\n                }\n\n                bool match( NSString* const& str ) const override {\n                    return false;\n                }\n\n                NSString* CATCH_ARC_STRONG m_substr;\n            };\n\n            struct Equals : StringHolder {\n                Equals( NSString* substr ) : StringHolder( substr ){}\n\n                bool match( NSString* const& str ) const override {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str isEqualToString:m_substr];\n                }\n\n                std::string describe() const override {\n                    return \"equals string: \" + Catch::Detail::stringify( m_substr );\n                }\n            };\n\n            struct Contains : StringHolder {\n                Contains( NSString* substr ) : StringHolder( substr ){}\n\n                bool match( NSString* const& str ) const override {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str rangeOfString:m_substr].location != NSNotFound;\n                }\n\n                std::string describe() const override {\n                    return \"contains string: \" + Catch::Detail::stringify( m_substr );\n                }\n            };\n\n            struct StartsWith : StringHolder {\n                StartsWith( NSString* substr ) : StringHolder( substr ){}\n\n                bool match( NSString* const& str ) const override {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str rangeOfString:m_substr].location == 0;\n                }\n\n                std::string describe() const override {\n                    return \"starts with: \" + Catch::Detail::stringify( m_substr );\n                }\n            };\n            struct EndsWith : StringHolder {\n                EndsWith( NSString* substr ) : StringHolder( substr ){}\n\n                bool match( NSString* const& str ) const override {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str rangeOfString:m_substr].location == [str length] - [m_substr length];\n                }\n\n                std::string describe() const override {\n                    return \"ends with: \" + Catch::Detail::stringify( m_substr );\n                }\n            };\n\n        } // namespace NSStringMatchers\n        } // namespace Impl\n\n        inline Impl::NSStringMatchers::Equals\n            Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); }\n\n        inline Impl::NSStringMatchers::Contains\n            Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); }\n\n        inline Impl::NSStringMatchers::StartsWith\n            StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); }\n\n        inline Impl::NSStringMatchers::EndsWith\n            EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); }\n\n    } // namespace Matchers\n\n    using namespace Matchers;\n\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n} // namespace Catch\n\n///////////////////////////////////////////////////////////////////////////////\n#define OC_MAKE_UNIQUE_NAME( root, uniqueSuffix ) root##uniqueSuffix\n#define OC_TEST_CASE2( name, desc, uniqueSuffix ) \\\n+(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Name_test_, uniqueSuffix ) \\\n{ \\\nreturn @ name; \\\n} \\\n+(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Description_test_, uniqueSuffix ) \\\n{ \\\nreturn @ desc; \\\n} \\\n-(void) OC_MAKE_UNIQUE_NAME( Catch_TestCase_test_, uniqueSuffix )\n\n#define OC_TEST_CASE( name, desc ) OC_TEST_CASE2( name, desc, __LINE__ )\n\n// end catch_objc.hpp\n#endif\n\n// Benchmarking needs the externally-facing parts of reporters to work\n#if defined(CATCH_CONFIG_EXTERNAL_INTERFACES) || defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n// start catch_external_interfaces.h\n\n// start catch_reporter_bases.hpp\n\n// start catch_interfaces_reporter.h\n\n// start catch_config.hpp\n\n// start catch_test_spec_parser.h\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\n// start catch_test_spec.h\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\n// start catch_wildcard_pattern.h\n\nnamespace Catch\n{\n    class WildcardPattern {\n        enum WildcardPosition {\n            NoWildcard = 0,\n            WildcardAtStart = 1,\n            WildcardAtEnd = 2,\n            WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd\n        };\n\n    public:\n\n        WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity );\n        virtual ~WildcardPattern() = default;\n        virtual bool matches( std::string const& str ) const;\n\n    private:\n        std::string adjustCase( std::string const& str ) const;\n        CaseSensitive::Choice m_caseSensitivity;\n        WildcardPosition m_wildcard = NoWildcard;\n        std::string m_pattern;\n    };\n}\n\n// end catch_wildcard_pattern.h\n#include <string>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    class TestSpec {\n        struct Pattern {\n            virtual ~Pattern();\n            virtual bool matches( TestCaseInfo const& testCase ) const = 0;\n        };\n        using PatternPtr = std::shared_ptr<Pattern>;\n\n        class NamePattern : public Pattern {\n        public:\n            NamePattern( std::string const& name );\n            virtual ~NamePattern();\n            bool matches( TestCaseInfo const& testCase ) const override;\n        private:\n            WildcardPattern m_wildcardPattern;\n        };\n\n        class TagPattern : public Pattern {\n        public:\n            TagPattern( std::string const& tag );\n            virtual ~TagPattern();\n            bool matches( TestCaseInfo const& testCase ) const override;\n        private:\n            std::string m_tag;\n        };\n\n        class ExcludedPattern : public Pattern {\n        public:\n            ExcludedPattern( PatternPtr const& underlyingPattern );\n            virtual ~ExcludedPattern();\n            bool matches( TestCaseInfo const& testCase ) const override;\n        private:\n            PatternPtr m_underlyingPattern;\n        };\n\n        struct Filter {\n            std::vector<PatternPtr> m_patterns;\n\n            bool matches( TestCaseInfo const& testCase ) const;\n        };\n\n    public:\n        bool hasFilters() const;\n        bool matches( TestCaseInfo const& testCase ) const;\n\n    private:\n        std::vector<Filter> m_filters;\n\n        friend class TestSpecParser;\n    };\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// end catch_test_spec.h\n// start catch_interfaces_tag_alias_registry.h\n\n#include <string>\n\nnamespace Catch {\n\n    struct TagAlias;\n\n    struct ITagAliasRegistry {\n        virtual ~ITagAliasRegistry();\n        // Nullptr if not present\n        virtual TagAlias const* find( std::string const& alias ) const = 0;\n        virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0;\n\n        static ITagAliasRegistry const& get();\n    };\n\n} // end namespace Catch\n\n// end catch_interfaces_tag_alias_registry.h\nnamespace Catch {\n\n    class TestSpecParser {\n        enum Mode{ None, Name, QuotedName, Tag, EscapedName };\n        Mode m_mode = None;\n        bool m_exclusion = false;\n        std::size_t m_start = std::string::npos, m_pos = 0;\n        std::string m_arg;\n        std::vector<std::size_t> m_escapeChars;\n        TestSpec::Filter m_currentFilter;\n        TestSpec m_testSpec;\n        ITagAliasRegistry const* m_tagAliases = nullptr;\n\n    public:\n        TestSpecParser( ITagAliasRegistry const& tagAliases );\n\n        TestSpecParser& parse( std::string const& arg );\n        TestSpec testSpec();\n\n    private:\n        void visitChar( char c );\n        void startNewMode( Mode mode, std::size_t start );\n        void escape();\n        std::string subString() const;\n\n        template<typename T>\n        void addPattern() {\n            std::string token = subString();\n            for( std::size_t i = 0; i < m_escapeChars.size(); ++i )\n                token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 );\n            m_escapeChars.clear();\n            if( startsWith( token, \"exclude:\" ) ) {\n                m_exclusion = true;\n                token = token.substr( 8 );\n            }\n            if( !token.empty() ) {\n                TestSpec::PatternPtr pattern = std::make_shared<T>( token );\n                if( m_exclusion )\n                    pattern = std::make_shared<TestSpec::ExcludedPattern>( pattern );\n                m_currentFilter.m_patterns.push_back( pattern );\n            }\n            m_exclusion = false;\n            m_mode = None;\n        }\n\n        void addFilter();\n    };\n    TestSpec parseTestSpec( std::string const& arg );\n\n} // namespace Catch\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// end catch_test_spec_parser.h\n// Libstdc++ doesn't like incomplete classes for unique_ptr\n\n#include <memory>\n#include <vector>\n#include <string>\n\n#ifndef CATCH_CONFIG_CONSOLE_WIDTH\n#define CATCH_CONFIG_CONSOLE_WIDTH 80\n#endif\n\nnamespace Catch {\n\n    struct IStream;\n\n    struct ConfigData {\n        bool listTests = false;\n        bool listTags = false;\n        bool listReporters = false;\n        bool listTestNamesOnly = false;\n\n        bool showSuccessfulTests = false;\n        bool shouldDebugBreak = false;\n        bool noThrow = false;\n        bool showHelp = false;\n        bool showInvisibles = false;\n        bool filenamesAsTags = false;\n        bool libIdentify = false;\n\n        int abortAfter = -1;\n        unsigned int rngSeed = 0;\n\n        bool benchmarkNoAnalysis = false;\n        unsigned int benchmarkSamples = 100;\n        double benchmarkConfidenceInterval = 0.95;\n        unsigned int benchmarkResamples = 100000;\n\n        Verbosity verbosity = Verbosity::Normal;\n        WarnAbout::What warnings = WarnAbout::Nothing;\n        ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter;\n        RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder;\n        UseColour::YesOrNo useColour = UseColour::Auto;\n        WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;\n\n        std::string outputFilename;\n        std::string name;\n        std::string processName;\n#ifndef CATCH_CONFIG_DEFAULT_REPORTER\n#define CATCH_CONFIG_DEFAULT_REPORTER \"console\"\n#endif\n        std::string reporterName = CATCH_CONFIG_DEFAULT_REPORTER;\n#undef CATCH_CONFIG_DEFAULT_REPORTER\n\n        std::vector<std::string> testsOrTags;\n        std::vector<std::string> sectionsToRun;\n    };\n\n    class Config : public IConfig {\n    public:\n\n        Config() = default;\n        Config( ConfigData const& data );\n        virtual ~Config() = default;\n\n        std::string const& getFilename() const;\n\n        bool listTests() const;\n        bool listTestNamesOnly() const;\n        bool listTags() const;\n        bool listReporters() const;\n\n        std::string getProcessName() const;\n        std::string const& getReporterName() const;\n\n        std::vector<std::string> const& getTestsOrTags() const override;\n        std::vector<std::string> const& getSectionsToRun() const override;\n\n        TestSpec const& testSpec() const override;\n        bool hasTestFilters() const override;\n\n        bool showHelp() const;\n\n        // IConfig interface\n        bool allowThrows() const override;\n        std::ostream& stream() const override;\n        std::string name() const override;\n        bool includeSuccessfulResults() const override;\n        bool warnAboutMissingAssertions() const override;\n        bool warnAboutNoTests() const override;\n        ShowDurations::OrNot showDurations() const override;\n        RunTests::InWhatOrder runOrder() const override;\n        unsigned int rngSeed() const override;\n        UseColour::YesOrNo useColour() const override;\n        bool shouldDebugBreak() const override;\n        int abortAfter() const override;\n        bool showInvisibles() const override;\n        Verbosity verbosity() const override;\n        bool benchmarkNoAnalysis() const override;\n        int benchmarkSamples() const override;\n        double benchmarkConfidenceInterval() const override;\n        unsigned int benchmarkResamples() const override;\n\n    private:\n\n        IStream const* openStream();\n        ConfigData m_data;\n\n        std::unique_ptr<IStream const> m_stream;\n        TestSpec m_testSpec;\n        bool m_hasTestFilters = false;\n    };\n\n} // end namespace Catch\n\n// end catch_config.hpp\n// start catch_assertionresult.h\n\n#include <string>\n\nnamespace Catch {\n\n    struct AssertionResultData\n    {\n        AssertionResultData() = delete;\n\n        AssertionResultData( ResultWas::OfType _resultType, LazyExpression const& _lazyExpression );\n\n        std::string message;\n        mutable std::string reconstructedExpression;\n        LazyExpression lazyExpression;\n        ResultWas::OfType resultType;\n\n        std::string reconstructExpression() const;\n    };\n\n    class AssertionResult {\n    public:\n        AssertionResult() = delete;\n        AssertionResult( AssertionInfo const& info, AssertionResultData const& data );\n\n        bool isOk() const;\n        bool succeeded() const;\n        ResultWas::OfType getResultType() const;\n        bool hasExpression() const;\n        bool hasMessage() const;\n        std::string getExpression() const;\n        std::string getExpressionInMacro() const;\n        bool hasExpandedExpression() const;\n        std::string getExpandedExpression() const;\n        std::string getMessage() const;\n        SourceLineInfo getSourceInfo() const;\n        StringRef getTestMacroName() const;\n\n    //protected:\n        AssertionInfo m_info;\n        AssertionResultData m_resultData;\n    };\n\n} // end namespace Catch\n\n// end catch_assertionresult.h\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n// start catch_estimate.hpp\n\n // Statistics estimates\n\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration>\n        struct Estimate {\n            Duration point;\n            Duration lower_bound;\n            Duration upper_bound;\n            double confidence_interval;\n\n            template <typename Duration2>\n            operator Estimate<Duration2>() const {\n                return { point, lower_bound, upper_bound, confidence_interval };\n            }\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_estimate.hpp\n// start catch_outlier_classification.hpp\n\n// Outlier information\n\nnamespace Catch {\n    namespace Benchmark {\n        struct OutlierClassification {\n            int samples_seen = 0;\n            int low_severe = 0;     // more than 3 times IQR below Q1\n            int low_mild = 0;       // 1.5 to 3 times IQR below Q1\n            int high_mild = 0;      // 1.5 to 3 times IQR above Q3\n            int high_severe = 0;    // more than 3 times IQR above Q3\n\n            int total() const {\n                return low_severe + low_mild + high_mild + high_severe;\n            }\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_outlier_classification.hpp\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n#include <string>\n#include <iosfwd>\n#include <map>\n#include <set>\n#include <memory>\n#include <algorithm>\n\nnamespace Catch {\n\n    struct ReporterConfig {\n        explicit ReporterConfig( IConfigPtr const& _fullConfig );\n\n        ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream );\n\n        std::ostream& stream() const;\n        IConfigPtr fullConfig() const;\n\n    private:\n        std::ostream* m_stream;\n        IConfigPtr m_fullConfig;\n    };\n\n    struct ReporterPreferences {\n        bool shouldRedirectStdOut = false;\n        bool shouldReportAllAssertions = false;\n    };\n\n    template<typename T>\n    struct LazyStat : Option<T> {\n        LazyStat& operator=( T const& _value ) {\n            Option<T>::operator=( _value );\n            used = false;\n            return *this;\n        }\n        void reset() {\n            Option<T>::reset();\n            used = false;\n        }\n        bool used = false;\n    };\n\n    struct TestRunInfo {\n        TestRunInfo( std::string const& _name );\n        std::string name;\n    };\n    struct GroupInfo {\n        GroupInfo(  std::string const& _name,\n                    std::size_t _groupIndex,\n                    std::size_t _groupsCount );\n\n        std::string name;\n        std::size_t groupIndex;\n        std::size_t groupsCounts;\n    };\n\n    struct AssertionStats {\n        AssertionStats( AssertionResult const& _assertionResult,\n                        std::vector<MessageInfo> const& _infoMessages,\n                        Totals const& _totals );\n\n        AssertionStats( AssertionStats const& )              = default;\n        AssertionStats( AssertionStats && )                  = default;\n        AssertionStats& operator = ( AssertionStats const& ) = delete;\n        AssertionStats& operator = ( AssertionStats && )     = delete;\n        virtual ~AssertionStats();\n\n        AssertionResult assertionResult;\n        std::vector<MessageInfo> infoMessages;\n        Totals totals;\n    };\n\n    struct SectionStats {\n        SectionStats(   SectionInfo const& _sectionInfo,\n                        Counts const& _assertions,\n                        double _durationInSeconds,\n                        bool _missingAssertions );\n        SectionStats( SectionStats const& )              = default;\n        SectionStats( SectionStats && )                  = default;\n        SectionStats& operator = ( SectionStats const& ) = default;\n        SectionStats& operator = ( SectionStats && )     = default;\n        virtual ~SectionStats();\n\n        SectionInfo sectionInfo;\n        Counts assertions;\n        double durationInSeconds;\n        bool missingAssertions;\n    };\n\n    struct TestCaseStats {\n        TestCaseStats(  TestCaseInfo const& _testInfo,\n                        Totals const& _totals,\n                        std::string const& _stdOut,\n                        std::string const& _stdErr,\n                        bool _aborting );\n\n        TestCaseStats( TestCaseStats const& )              = default;\n        TestCaseStats( TestCaseStats && )                  = default;\n        TestCaseStats& operator = ( TestCaseStats const& ) = default;\n        TestCaseStats& operator = ( TestCaseStats && )     = default;\n        virtual ~TestCaseStats();\n\n        TestCaseInfo testInfo;\n        Totals totals;\n        std::string stdOut;\n        std::string stdErr;\n        bool aborting;\n    };\n\n    struct TestGroupStats {\n        TestGroupStats( GroupInfo const& _groupInfo,\n                        Totals const& _totals,\n                        bool _aborting );\n        TestGroupStats( GroupInfo const& _groupInfo );\n\n        TestGroupStats( TestGroupStats const& )              = default;\n        TestGroupStats( TestGroupStats && )                  = default;\n        TestGroupStats& operator = ( TestGroupStats const& ) = default;\n        TestGroupStats& operator = ( TestGroupStats && )     = default;\n        virtual ~TestGroupStats();\n\n        GroupInfo groupInfo;\n        Totals totals;\n        bool aborting;\n    };\n\n    struct TestRunStats {\n        TestRunStats(   TestRunInfo const& _runInfo,\n                        Totals const& _totals,\n                        bool _aborting );\n\n        TestRunStats( TestRunStats const& )              = default;\n        TestRunStats( TestRunStats && )                  = default;\n        TestRunStats& operator = ( TestRunStats const& ) = default;\n        TestRunStats& operator = ( TestRunStats && )     = default;\n        virtual ~TestRunStats();\n\n        TestRunInfo runInfo;\n        Totals totals;\n        bool aborting;\n    };\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    struct BenchmarkInfo {\n        std::string name;\n        double estimatedDuration;\n        int iterations;\n        int samples;\n        unsigned int resamples;\n        double clockResolution;\n        double clockCost;\n    };\n\n    template <class Duration>\n    struct BenchmarkStats {\n        BenchmarkInfo info;\n\n        std::vector<Duration> samples;\n        Benchmark::Estimate<Duration> mean;\n        Benchmark::Estimate<Duration> standardDeviation;\n        Benchmark::OutlierClassification outliers;\n        double outlierVariance;\n\n        template <typename Duration2>\n        operator BenchmarkStats<Duration2>() const {\n            std::vector<Duration2> samples2;\n            samples2.reserve(samples.size());\n            std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); });\n            return {\n                info,\n                std::move(samples2),\n                mean,\n                standardDeviation,\n                outliers,\n                outlierVariance,\n            };\n        }\n    };\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    struct IStreamingReporter {\n        virtual ~IStreamingReporter() = default;\n\n        // Implementing class must also provide the following static methods:\n        // static std::string getDescription();\n        // static std::set<Verbosity> getSupportedVerbosities()\n\n        virtual ReporterPreferences getPreferences() const = 0;\n\n        virtual void noMatchingTestCases( std::string const& spec ) = 0;\n\n        virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;\n        virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;\n\n        virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;\n        virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        virtual void benchmarkPreparing( std::string const& ) {}\n        virtual void benchmarkStarting( BenchmarkInfo const& ) {}\n        virtual void benchmarkEnded( BenchmarkStats<> const& ) {}\n        virtual void benchmarkFailed( std::string const& ) {}\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;\n\n        // The return value indicates if the messages buffer should be cleared:\n        virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0;\n\n        virtual void sectionEnded( SectionStats const& sectionStats ) = 0;\n        virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;\n        virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;\n        virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;\n\n        virtual void skipTest( TestCaseInfo const& testInfo ) = 0;\n\n        // Default empty implementation provided\n        virtual void fatalErrorEncountered( StringRef name );\n\n        virtual bool isMulti() const;\n    };\n    using IStreamingReporterPtr = std::unique_ptr<IStreamingReporter>;\n\n    struct IReporterFactory {\n        virtual ~IReporterFactory();\n        virtual IStreamingReporterPtr create( ReporterConfig const& config ) const = 0;\n        virtual std::string getDescription() const = 0;\n    };\n    using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;\n\n    struct IReporterRegistry {\n        using FactoryMap = std::map<std::string, IReporterFactoryPtr>;\n        using Listeners = std::vector<IReporterFactoryPtr>;\n\n        virtual ~IReporterRegistry();\n        virtual IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const = 0;\n        virtual FactoryMap const& getFactories() const = 0;\n        virtual Listeners const& getListeners() const = 0;\n    };\n\n} // end namespace Catch\n\n// end catch_interfaces_reporter.h\n#include <algorithm>\n#include <cstring>\n#include <cfloat>\n#include <cstdio>\n#include <cassert>\n#include <memory>\n#include <ostream>\n\nnamespace Catch {\n    void prepareExpandedExpression(AssertionResult& result);\n\n    // Returns double formatted as %.3f (format expected on output)\n    std::string getFormattedDuration( double duration );\n\n    std::string serializeFilters( std::vector<std::string> const& container );\n\n    template<typename DerivedT>\n    struct StreamingReporterBase : IStreamingReporter {\n\n        StreamingReporterBase( ReporterConfig const& _config )\n        :   m_config( _config.fullConfig() ),\n            stream( _config.stream() )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = false;\n            if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) )\n                CATCH_ERROR( \"Verbosity level not supported by this reporter\" );\n        }\n\n        ReporterPreferences getPreferences() const override {\n            return m_reporterPrefs;\n        }\n\n        static std::set<Verbosity> getSupportedVerbosities() {\n            return { Verbosity::Normal };\n        }\n\n        ~StreamingReporterBase() override = default;\n\n        void noMatchingTestCases(std::string const&) override {}\n\n        void testRunStarting(TestRunInfo const& _testRunInfo) override {\n            currentTestRunInfo = _testRunInfo;\n        }\n\n        void testGroupStarting(GroupInfo const& _groupInfo) override {\n            currentGroupInfo = _groupInfo;\n        }\n\n        void testCaseStarting(TestCaseInfo const& _testInfo) override  {\n            currentTestCaseInfo = _testInfo;\n        }\n        void sectionStarting(SectionInfo const& _sectionInfo) override {\n            m_sectionStack.push_back(_sectionInfo);\n        }\n\n        void sectionEnded(SectionStats const& /* _sectionStats */) override {\n            m_sectionStack.pop_back();\n        }\n        void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override {\n            currentTestCaseInfo.reset();\n        }\n        void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override {\n            currentGroupInfo.reset();\n        }\n        void testRunEnded(TestRunStats const& /* _testRunStats */) override {\n            currentTestCaseInfo.reset();\n            currentGroupInfo.reset();\n            currentTestRunInfo.reset();\n        }\n\n        void skipTest(TestCaseInfo const&) override {\n            // Don't do anything with this by default.\n            // It can optionally be overridden in the derived class.\n        }\n\n        IConfigPtr m_config;\n        std::ostream& stream;\n\n        LazyStat<TestRunInfo> currentTestRunInfo;\n        LazyStat<GroupInfo> currentGroupInfo;\n        LazyStat<TestCaseInfo> currentTestCaseInfo;\n\n        std::vector<SectionInfo> m_sectionStack;\n        ReporterPreferences m_reporterPrefs;\n    };\n\n    template<typename DerivedT>\n    struct CumulativeReporterBase : IStreamingReporter {\n        template<typename T, typename ChildNodeT>\n        struct Node {\n            explicit Node( T const& _value ) : value( _value ) {}\n            virtual ~Node() {}\n\n            using ChildNodes = std::vector<std::shared_ptr<ChildNodeT>>;\n            T value;\n            ChildNodes children;\n        };\n        struct SectionNode {\n            explicit SectionNode(SectionStats const& _stats) : stats(_stats) {}\n            virtual ~SectionNode() = default;\n\n            bool operator == (SectionNode const& other) const {\n                return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;\n            }\n            bool operator == (std::shared_ptr<SectionNode> const& other) const {\n                return operator==(*other);\n            }\n\n            SectionStats stats;\n            using ChildSections = std::vector<std::shared_ptr<SectionNode>>;\n            using Assertions = std::vector<AssertionStats>;\n            ChildSections childSections;\n            Assertions assertions;\n            std::string stdOut;\n            std::string stdErr;\n        };\n\n        struct BySectionInfo {\n            BySectionInfo( SectionInfo const& other ) : m_other( other ) {}\n            BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}\n            bool operator() (std::shared_ptr<SectionNode> const& node) const {\n                return ((node->stats.sectionInfo.name == m_other.name) &&\n                        (node->stats.sectionInfo.lineInfo == m_other.lineInfo));\n            }\n            void operator=(BySectionInfo const&) = delete;\n\n        private:\n            SectionInfo const& m_other;\n        };\n\n        using TestCaseNode = Node<TestCaseStats, SectionNode>;\n        using TestGroupNode = Node<TestGroupStats, TestCaseNode>;\n        using TestRunNode = Node<TestRunStats, TestGroupNode>;\n\n        CumulativeReporterBase( ReporterConfig const& _config )\n        :   m_config( _config.fullConfig() ),\n            stream( _config.stream() )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = false;\n            if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) )\n                CATCH_ERROR( \"Verbosity level not supported by this reporter\" );\n        }\n        ~CumulativeReporterBase() override = default;\n\n        ReporterPreferences getPreferences() const override {\n            return m_reporterPrefs;\n        }\n\n        static std::set<Verbosity> getSupportedVerbosities() {\n            return { Verbosity::Normal };\n        }\n\n        void testRunStarting( TestRunInfo const& ) override {}\n        void testGroupStarting( GroupInfo const& ) override {}\n\n        void testCaseStarting( TestCaseInfo const& ) override {}\n\n        void sectionStarting( SectionInfo const& sectionInfo ) override {\n            SectionStats incompleteStats( sectionInfo, Counts(), 0, false );\n            std::shared_ptr<SectionNode> node;\n            if( m_sectionStack.empty() ) {\n                if( !m_rootSection )\n                    m_rootSection = std::make_shared<SectionNode>( incompleteStats );\n                node = m_rootSection;\n            }\n            else {\n                SectionNode& parentNode = *m_sectionStack.back();\n                auto it =\n                    std::find_if(   parentNode.childSections.begin(),\n                                    parentNode.childSections.end(),\n                                    BySectionInfo( sectionInfo ) );\n                if( it == parentNode.childSections.end() ) {\n                    node = std::make_shared<SectionNode>( incompleteStats );\n                    parentNode.childSections.push_back( node );\n                }\n                else\n                    node = *it;\n            }\n            m_sectionStack.push_back( node );\n            m_deepestSection = std::move(node);\n        }\n\n        void assertionStarting(AssertionInfo const&) override {}\n\n        bool assertionEnded(AssertionStats const& assertionStats) override {\n            assert(!m_sectionStack.empty());\n            // AssertionResult holds a pointer to a temporary DecomposedExpression,\n            // which getExpandedExpression() calls to build the expression string.\n            // Our section stack copy of the assertionResult will likely outlive the\n            // temporary, so it must be expanded or discarded now to avoid calling\n            // a destroyed object later.\n            prepareExpandedExpression(const_cast<AssertionResult&>( assertionStats.assertionResult ) );\n            SectionNode& sectionNode = *m_sectionStack.back();\n            sectionNode.assertions.push_back(assertionStats);\n            return true;\n        }\n        void sectionEnded(SectionStats const& sectionStats) override {\n            assert(!m_sectionStack.empty());\n            SectionNode& node = *m_sectionStack.back();\n            node.stats = sectionStats;\n            m_sectionStack.pop_back();\n        }\n        void testCaseEnded(TestCaseStats const& testCaseStats) override {\n            auto node = std::make_shared<TestCaseNode>(testCaseStats);\n            assert(m_sectionStack.size() == 0);\n            node->children.push_back(m_rootSection);\n            m_testCases.push_back(node);\n            m_rootSection.reset();\n\n            assert(m_deepestSection);\n            m_deepestSection->stdOut = testCaseStats.stdOut;\n            m_deepestSection->stdErr = testCaseStats.stdErr;\n        }\n        void testGroupEnded(TestGroupStats const& testGroupStats) override {\n            auto node = std::make_shared<TestGroupNode>(testGroupStats);\n            node->children.swap(m_testCases);\n            m_testGroups.push_back(node);\n        }\n        void testRunEnded(TestRunStats const& testRunStats) override {\n            auto node = std::make_shared<TestRunNode>(testRunStats);\n            node->children.swap(m_testGroups);\n            m_testRuns.push_back(node);\n            testRunEndedCumulative();\n        }\n        virtual void testRunEndedCumulative() = 0;\n\n        void skipTest(TestCaseInfo const&) override {}\n\n        IConfigPtr m_config;\n        std::ostream& stream;\n        std::vector<AssertionStats> m_assertions;\n        std::vector<std::vector<std::shared_ptr<SectionNode>>> m_sections;\n        std::vector<std::shared_ptr<TestCaseNode>> m_testCases;\n        std::vector<std::shared_ptr<TestGroupNode>> m_testGroups;\n\n        std::vector<std::shared_ptr<TestRunNode>> m_testRuns;\n\n        std::shared_ptr<SectionNode> m_rootSection;\n        std::shared_ptr<SectionNode> m_deepestSection;\n        std::vector<std::shared_ptr<SectionNode>> m_sectionStack;\n        ReporterPreferences m_reporterPrefs;\n    };\n\n    template<char C>\n    char const* getLineOfChars() {\n        static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};\n        if( !*line ) {\n            std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 );\n            line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0;\n        }\n        return line;\n    }\n\n    struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> {\n        TestEventListenerBase( ReporterConfig const& _config );\n\n        static std::set<Verbosity> getSupportedVerbosities();\n\n        void assertionStarting(AssertionInfo const&) override;\n        bool assertionEnded(AssertionStats const&) override;\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_bases.hpp\n// start catch_console_colour.h\n\nnamespace Catch {\n\n    struct Colour {\n        enum Code {\n            None = 0,\n\n            White,\n            Red,\n            Green,\n            Blue,\n            Cyan,\n            Yellow,\n            Grey,\n\n            Bright = 0x10,\n\n            BrightRed = Bright | Red,\n            BrightGreen = Bright | Green,\n            LightGrey = Bright | Grey,\n            BrightWhite = Bright | White,\n            BrightYellow = Bright | Yellow,\n\n            // By intention\n            FileName = LightGrey,\n            Warning = BrightYellow,\n            ResultError = BrightRed,\n            ResultSuccess = BrightGreen,\n            ResultExpectedFailure = Warning,\n\n            Error = BrightRed,\n            Success = Green,\n\n            OriginalExpression = Cyan,\n            ReconstructedExpression = BrightYellow,\n\n            SecondaryText = LightGrey,\n            Headers = White\n        };\n\n        // Use constructed object for RAII guard\n        Colour( Code _colourCode );\n        Colour( Colour&& other ) noexcept;\n        Colour& operator=( Colour&& other ) noexcept;\n        ~Colour();\n\n        // Use static method for one-shot changes\n        static void use( Code _colourCode );\n\n    private:\n        bool m_moved = false;\n    };\n\n    std::ostream& operator << ( std::ostream& os, Colour const& );\n\n} // end namespace Catch\n\n// end catch_console_colour.h\n// start catch_reporter_registrars.hpp\n\n\nnamespace Catch {\n\n    template<typename T>\n    class ReporterRegistrar {\n\n        class ReporterFactory : public IReporterFactory {\n\n            IStreamingReporterPtr create( ReporterConfig const& config ) const override {\n                return std::unique_ptr<T>( new T( config ) );\n            }\n\n            std::string getDescription() const override {\n                return T::getDescription();\n            }\n        };\n\n    public:\n\n        explicit ReporterRegistrar( std::string const& name ) {\n            getMutableRegistryHub().registerReporter( name, std::make_shared<ReporterFactory>() );\n        }\n    };\n\n    template<typename T>\n    class ListenerRegistrar {\n\n        class ListenerFactory : public IReporterFactory {\n\n            IStreamingReporterPtr create( ReporterConfig const& config ) const override {\n                return std::unique_ptr<T>( new T( config ) );\n            }\n            std::string getDescription() const override {\n                return std::string();\n            }\n        };\n\n    public:\n\n        ListenerRegistrar() {\n            getMutableRegistryHub().registerListener( std::make_shared<ListenerFactory>() );\n        }\n    };\n}\n\n#if !defined(CATCH_CONFIG_DISABLE)\n\n#define CATCH_REGISTER_REPORTER( name, reporterType ) \\\n    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS          \\\n    namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } \\\n    CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\n\n#define CATCH_REGISTER_LISTENER( listenerType ) \\\n     CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS   \\\n     namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } \\\n     CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS\n#else // CATCH_CONFIG_DISABLE\n\n#define CATCH_REGISTER_REPORTER(name, reporterType)\n#define CATCH_REGISTER_LISTENER(listenerType)\n\n#endif // CATCH_CONFIG_DISABLE\n\n// end catch_reporter_registrars.hpp\n// Allow users to base their work off existing reporters\n// start catch_reporter_compact.h\n\nnamespace Catch {\n\n    struct CompactReporter : StreamingReporterBase<CompactReporter> {\n\n        using StreamingReporterBase::StreamingReporterBase;\n\n        ~CompactReporter() override;\n\n        static std::string getDescription();\n\n        ReporterPreferences getPreferences() const override;\n\n        void noMatchingTestCases(std::string const& spec) override;\n\n        void assertionStarting(AssertionInfo const&) override;\n\n        bool assertionEnded(AssertionStats const& _assertionStats) override;\n\n        void sectionEnded(SectionStats const& _sectionStats) override;\n\n        void testRunEnded(TestRunStats const& _testRunStats) override;\n\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_compact.h\n// start catch_reporter_console.h\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch\n                              // Note that 4062 (not all labels are handled\n                              // and default is missing) is enabled\n#endif\n\nnamespace Catch {\n    // Fwd decls\n    struct SummaryColumn;\n    class TablePrinter;\n\n    struct ConsoleReporter : StreamingReporterBase<ConsoleReporter> {\n        std::unique_ptr<TablePrinter> m_tablePrinter;\n\n        ConsoleReporter(ReporterConfig const& config);\n        ~ConsoleReporter() override;\n        static std::string getDescription();\n\n        void noMatchingTestCases(std::string const& spec) override;\n\n        void assertionStarting(AssertionInfo const&) override;\n\n        bool assertionEnded(AssertionStats const& _assertionStats) override;\n\n        void sectionStarting(SectionInfo const& _sectionInfo) override;\n        void sectionEnded(SectionStats const& _sectionStats) override;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        void benchmarkPreparing(std::string const& name) override;\n        void benchmarkStarting(BenchmarkInfo const& info) override;\n        void benchmarkEnded(BenchmarkStats<> const& stats) override;\n        void benchmarkFailed(std::string const& error) override;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        void testCaseEnded(TestCaseStats const& _testCaseStats) override;\n        void testGroupEnded(TestGroupStats const& _testGroupStats) override;\n        void testRunEnded(TestRunStats const& _testRunStats) override;\n        void testRunStarting(TestRunInfo const& _testRunInfo) override;\n    private:\n\n        void lazyPrint();\n\n        void lazyPrintWithoutClosingBenchmarkTable();\n        void lazyPrintRunInfo();\n        void lazyPrintGroupInfo();\n        void printTestCaseAndSectionHeader();\n\n        void printClosedHeader(std::string const& _name);\n        void printOpenHeader(std::string const& _name);\n\n        // if string has a : in first line will set indent to follow it on\n        // subsequent lines\n        void printHeaderString(std::string const& _string, std::size_t indent = 0);\n\n        void printTotals(Totals const& totals);\n        void printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row);\n\n        void printTotalsDivider(Totals const& totals);\n        void printSummaryDivider();\n        void printTestFilters();\n\n    private:\n        bool m_headerPrinted = false;\n    };\n\n} // end namespace Catch\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\n// end catch_reporter_console.h\n// start catch_reporter_junit.h\n\n// start catch_xmlwriter.h\n\n#include <vector>\n\nnamespace Catch {\n\n    class XmlEncode {\n    public:\n        enum ForWhat { ForTextNodes, ForAttributes };\n\n        XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes );\n\n        void encodeTo( std::ostream& os ) const;\n\n        friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode );\n\n    private:\n        std::string m_str;\n        ForWhat m_forWhat;\n    };\n\n    class XmlWriter {\n    public:\n\n        class ScopedElement {\n        public:\n            ScopedElement( XmlWriter* writer );\n\n            ScopedElement( ScopedElement&& other ) noexcept;\n            ScopedElement& operator=( ScopedElement&& other ) noexcept;\n\n            ~ScopedElement();\n\n            ScopedElement& writeText( std::string const& text, bool indent = true );\n\n            template<typename T>\n            ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {\n                m_writer->writeAttribute( name, attribute );\n                return *this;\n            }\n\n        private:\n            mutable XmlWriter* m_writer = nullptr;\n        };\n\n        XmlWriter( std::ostream& os = Catch::cout() );\n        ~XmlWriter();\n\n        XmlWriter( XmlWriter const& ) = delete;\n        XmlWriter& operator=( XmlWriter const& ) = delete;\n\n        XmlWriter& startElement( std::string const& name );\n\n        ScopedElement scopedElement( std::string const& name );\n\n        XmlWriter& endElement();\n\n        XmlWriter& writeAttribute( std::string const& name, std::string const& attribute );\n\n        XmlWriter& writeAttribute( std::string const& name, bool attribute );\n\n        template<typename T>\n        XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {\n            ReusableStringStream rss;\n            rss << attribute;\n            return writeAttribute( name, rss.str() );\n        }\n\n        XmlWriter& writeText( std::string const& text, bool indent = true );\n\n        XmlWriter& writeComment( std::string const& text );\n\n        void writeStylesheetRef( std::string const& url );\n\n        XmlWriter& writeBlankLine();\n\n        void ensureTagClosed();\n\n    private:\n\n        void writeDeclaration();\n\n        void newlineIfNecessary();\n\n        bool m_tagIsOpen = false;\n        bool m_needsNewline = false;\n        std::vector<std::string> m_tags;\n        std::string m_indent;\n        std::ostream& m_os;\n    };\n\n}\n\n// end catch_xmlwriter.h\nnamespace Catch {\n\n    class JunitReporter : public CumulativeReporterBase<JunitReporter> {\n    public:\n        JunitReporter(ReporterConfig const& _config);\n\n        ~JunitReporter() override;\n\n        static std::string getDescription();\n\n        void noMatchingTestCases(std::string const& /*spec*/) override;\n\n        void testRunStarting(TestRunInfo const& runInfo) override;\n\n        void testGroupStarting(GroupInfo const& groupInfo) override;\n\n        void testCaseStarting(TestCaseInfo const& testCaseInfo) override;\n        bool assertionEnded(AssertionStats const& assertionStats) override;\n\n        void testCaseEnded(TestCaseStats const& testCaseStats) override;\n\n        void testGroupEnded(TestGroupStats const& testGroupStats) override;\n\n        void testRunEndedCumulative() override;\n\n        void writeGroup(TestGroupNode const& groupNode, double suiteTime);\n\n        void writeTestCase(TestCaseNode const& testCaseNode);\n\n        void writeSection(std::string const& className,\n                          std::string const& rootName,\n                          SectionNode const& sectionNode);\n\n        void writeAssertions(SectionNode const& sectionNode);\n        void writeAssertion(AssertionStats const& stats);\n\n        XmlWriter xml;\n        Timer suiteTimer;\n        std::string stdOutForSuite;\n        std::string stdErrForSuite;\n        unsigned int unexpectedExceptions = 0;\n        bool m_okToFail = false;\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_junit.h\n// start catch_reporter_xml.h\n\nnamespace Catch {\n    class XmlReporter : public StreamingReporterBase<XmlReporter> {\n    public:\n        XmlReporter(ReporterConfig const& _config);\n\n        ~XmlReporter() override;\n\n        static std::string getDescription();\n\n        virtual std::string getStylesheetRef() const;\n\n        void writeSourceInfo(SourceLineInfo const& sourceInfo);\n\n    public: // StreamingReporterBase\n\n        void noMatchingTestCases(std::string const& s) override;\n\n        void testRunStarting(TestRunInfo const& testInfo) override;\n\n        void testGroupStarting(GroupInfo const& groupInfo) override;\n\n        void testCaseStarting(TestCaseInfo const& testInfo) override;\n\n        void sectionStarting(SectionInfo const& sectionInfo) override;\n\n        void assertionStarting(AssertionInfo const&) override;\n\n        bool assertionEnded(AssertionStats const& assertionStats) override;\n\n        void sectionEnded(SectionStats const& sectionStats) override;\n\n        void testCaseEnded(TestCaseStats const& testCaseStats) override;\n\n        void testGroupEnded(TestGroupStats const& testGroupStats) override;\n\n        void testRunEnded(TestRunStats const& testRunStats) override;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        void benchmarkStarting(BenchmarkInfo const&) override;\n        void benchmarkEnded(BenchmarkStats<> const&) override;\n        void benchmarkFailed(std::string const&) override;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    private:\n        Timer m_testCaseTimer;\n        XmlWriter m_xml;\n        int m_sectionDepth = 0;\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_xml.h\n\n// end catch_external_interfaces.h\n#endif\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n// start catch_benchmark.hpp\n\n // Benchmark\n\n// start catch_chronometer.hpp\n\n// User-facing chronometer\n\n\n// start catch_clock.hpp\n\n// Clocks\n\n\n#include <chrono>\n#include <ratio>\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Clock>\n        using ClockDuration = typename Clock::duration;\n        template <typename Clock>\n        using FloatDuration = std::chrono::duration<double, typename Clock::period>;\n\n        template <typename Clock>\n        using TimePoint = typename Clock::time_point;\n\n        using default_clock = std::chrono::steady_clock;\n\n        template <typename Clock>\n        struct now {\n            TimePoint<Clock> operator()() const {\n                return Clock::now();\n            }\n        };\n\n        using fp_seconds = std::chrono::duration<double, std::ratio<1>>;\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_clock.hpp\n// start catch_optimizer.hpp\n\n // Hinting the optimizer\n\n\n#if defined(_MSC_VER)\n#   include <atomic> // atomic_thread_fence\n#endif\n\nnamespace Catch {\n    namespace Benchmark {\n#if defined(__GNUC__) || defined(__clang__)\n        template <typename T>\n        inline void keep_memory(T* p) {\n            asm volatile(\"\" : : \"g\"(p) : \"memory\");\n        }\n        inline void keep_memory() {\n            asm volatile(\"\" : : : \"memory\");\n        }\n\n        namespace Detail {\n            inline void optimizer_barrier() { keep_memory(); }\n        } // namespace Detail\n#elif defined(_MSC_VER)\n\n#pragma optimize(\"\", off)\n        template <typename T>\n        inline void keep_memory(T* p) {\n            // thanks @milleniumbug\n            *reinterpret_cast<char volatile*>(p) = *reinterpret_cast<char const volatile*>(p);\n        }\n        // TODO equivalent keep_memory()\n#pragma optimize(\"\", on)\n\n        namespace Detail {\n            inline void optimizer_barrier() {\n                std::atomic_thread_fence(std::memory_order_seq_cst);\n            }\n        } // namespace Detail\n\n#endif\n\n        template <typename T>\n        inline void deoptimize_value(T&& x) {\n            keep_memory(&x);\n        }\n\n        template <typename Fn, typename... Args>\n        inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<!std::is_same<void, decltype(fn(args...))>::value>::type {\n            deoptimize_value(std::forward<Fn>(fn) (std::forward<Args...>(args...)));\n        }\n\n        template <typename Fn, typename... Args>\n        inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<std::is_same<void, decltype(fn(args...))>::value>::type {\n            std::forward<Fn>(fn) (std::forward<Args...>(args...));\n        }\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_optimizer.hpp\n// start catch_complete_invoke.hpp\n\n// Invoke with a special case for void\n\n\n#include <type_traits>\n#include <utility>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename T>\n            struct CompleteType { using type = T; };\n            template <>\n            struct CompleteType<void> { struct type {}; };\n\n            template <typename T>\n            using CompleteType_t = typename CompleteType<T>::type;\n\n            template <typename Result>\n            struct CompleteInvoker {\n                template <typename Fun, typename... Args>\n                static Result invoke(Fun&& fun, Args&&... args) {\n                    return std::forward<Fun>(fun)(std::forward<Args>(args)...);\n                }\n            };\n            template <>\n            struct CompleteInvoker<void> {\n                template <typename Fun, typename... Args>\n                static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) {\n                    std::forward<Fun>(fun)(std::forward<Args>(args)...);\n                    return {};\n                }\n            };\n            template <typename Sig>\n            using ResultOf_t = typename std::result_of<Sig>::type;\n\n            // invoke and not return void :(\n            template <typename Fun, typename... Args>\n            CompleteType_t<ResultOf_t<Fun(Args...)>> complete_invoke(Fun&& fun, Args&&... args) {\n                return CompleteInvoker<ResultOf_t<Fun(Args...)>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...);\n            }\n\n            const std::string benchmarkErrorMsg = \"a benchmark failed to run successfully\";\n        } // namespace Detail\n\n        template <typename Fun>\n        Detail::CompleteType_t<Detail::ResultOf_t<Fun()>> user_code(Fun&& fun) {\n            CATCH_TRY{\n                return Detail::complete_invoke(std::forward<Fun>(fun));\n            } CATCH_CATCH_ALL{\n                getResultCapture().benchmarkFailed(translateActiveException());\n                CATCH_RUNTIME_ERROR(Detail::benchmarkErrorMsg);\n            }\n        }\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_complete_invoke.hpp\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            struct ChronometerConcept {\n                virtual void start() = 0;\n                virtual void finish() = 0;\n                virtual ~ChronometerConcept() = default;\n            };\n            template <typename Clock>\n            struct ChronometerModel final : public ChronometerConcept {\n                void start() override { started = Clock::now(); }\n                void finish() override { finished = Clock::now(); }\n\n                ClockDuration<Clock> elapsed() const { return finished - started; }\n\n                TimePoint<Clock> started;\n                TimePoint<Clock> finished;\n            };\n        } // namespace Detail\n\n        struct Chronometer {\n        public:\n            template <typename Fun>\n            void measure(Fun&& fun) { measure(std::forward<Fun>(fun), is_callable<Fun(int)>()); }\n\n            int runs() const { return k; }\n\n            Chronometer(Detail::ChronometerConcept& meter, int k)\n                : impl(&meter)\n                , k(k) {}\n\n        private:\n            template <typename Fun>\n            void measure(Fun&& fun, std::false_type) {\n                measure([&fun](int) { return fun(); }, std::true_type());\n            }\n\n            template <typename Fun>\n            void measure(Fun&& fun, std::true_type) {\n                Detail::optimizer_barrier();\n                impl->start();\n                for (int i = 0; i < k; ++i) invoke_deoptimized(fun, i);\n                impl->finish();\n                Detail::optimizer_barrier();\n            }\n\n            Detail::ChronometerConcept* impl;\n            int k;\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_chronometer.hpp\n// start catch_environment.hpp\n\n// Environment information\n\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration>\n        struct EnvironmentEstimate {\n            Duration mean;\n            OutlierClassification outliers;\n\n            template <typename Duration2>\n            operator EnvironmentEstimate<Duration2>() const {\n                return { mean, outliers };\n            }\n        };\n        template <typename Clock>\n        struct Environment {\n            using clock_type = Clock;\n            EnvironmentEstimate<FloatDuration<Clock>> clock_resolution;\n            EnvironmentEstimate<FloatDuration<Clock>> clock_cost;\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_environment.hpp\n// start catch_execution_plan.hpp\n\n // Execution plan\n\n\n// start catch_benchmark_function.hpp\n\n // Dumb std::function implementation for consistent call overhead\n\n\n#include <cassert>\n#include <type_traits>\n#include <utility>\n#include <memory>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename T>\n            using Decay = typename std::decay<T>::type;\n            template <typename T, typename U>\n            struct is_related\n                : std::is_same<Decay<T>, Decay<U>> {};\n\n            /// We need to reinvent std::function because every piece of code that might add overhead\n            /// in a measurement context needs to have consistent performance characteristics so that we\n            /// can account for it in the measurement.\n            /// Implementations of std::function with optimizations that aren't always applicable, like\n            /// small buffer optimizations, are not uncommon.\n            /// This is effectively an implementation of std::function without any such optimizations;\n            /// it may be slow, but it is consistently slow.\n            struct BenchmarkFunction {\n            private:\n                struct callable {\n                    virtual void call(Chronometer meter) const = 0;\n                    virtual callable* clone() const = 0;\n                    virtual ~callable() = default;\n                };\n                template <typename Fun>\n                struct model : public callable {\n                    model(Fun&& fun) : fun(std::move(fun)) {}\n                    model(Fun const& fun) : fun(fun) {}\n\n                    model<Fun>* clone() const override { return new model<Fun>(*this); }\n\n                    void call(Chronometer meter) const override {\n                        call(meter, is_callable<Fun(Chronometer)>());\n                    }\n                    void call(Chronometer meter, std::true_type) const {\n                        fun(meter);\n                    }\n                    void call(Chronometer meter, std::false_type) const {\n                        meter.measure(fun);\n                    }\n\n                    Fun fun;\n                };\n\n                struct do_nothing { void operator()() const {} };\n\n                template <typename T>\n                BenchmarkFunction(model<T>* c) : f(c) {}\n\n            public:\n                BenchmarkFunction()\n                    : f(new model<do_nothing>{ {} }) {}\n\n                template <typename Fun,\n                    typename std::enable_if<!is_related<Fun, BenchmarkFunction>::value, int>::type = 0>\n                    BenchmarkFunction(Fun&& fun)\n                    : f(new model<typename std::decay<Fun>::type>(std::forward<Fun>(fun))) {}\n\n                BenchmarkFunction(BenchmarkFunction&& that)\n                    : f(std::move(that.f)) {}\n\n                BenchmarkFunction(BenchmarkFunction const& that)\n                    : f(that.f->clone()) {}\n\n                BenchmarkFunction& operator=(BenchmarkFunction&& that) {\n                    f = std::move(that.f);\n                    return *this;\n                }\n\n                BenchmarkFunction& operator=(BenchmarkFunction const& that) {\n                    f.reset(that.f->clone());\n                    return *this;\n                }\n\n                void operator()(Chronometer meter) const { f->call(meter); }\n\n            private:\n                std::unique_ptr<callable> f;\n            };\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_benchmark_function.hpp\n// start catch_repeat.hpp\n\n// repeat algorithm\n\n\n#include <type_traits>\n#include <utility>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Fun>\n            struct repeater {\n                void operator()(int k) const {\n                    for (int i = 0; i < k; ++i) {\n                        fun();\n                    }\n                }\n                Fun fun;\n            };\n            template <typename Fun>\n            repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) {\n                return { std::forward<Fun>(fun) };\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_repeat.hpp\n// start catch_run_for_at_least.hpp\n\n// Run a function for a minimum amount of time\n\n\n// start catch_measure.hpp\n\n// Measure\n\n\n// start catch_timing.hpp\n\n// Timing\n\n\n#include <tuple>\n#include <type_traits>\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration, typename Result>\n        struct Timing {\n            Duration elapsed;\n            Result result;\n            int iterations;\n        };\n        template <typename Clock, typename Sig>\n        using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<Detail::ResultOf_t<Sig>>>;\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_timing.hpp\n#include <utility>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Clock, typename Fun, typename... Args>\n            TimingOf<Clock, Fun(Args...)> measure(Fun&& fun, Args&&... args) {\n                auto start = Clock::now();\n                auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...);\n                auto end = Clock::now();\n                auto delta = end - start;\n                return { delta, std::forward<decltype(r)>(r), 1 };\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_measure.hpp\n#include <utility>\n#include <type_traits>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Clock, typename Fun>\n            TimingOf<Clock, Fun(int)> measure_one(Fun&& fun, int iters, std::false_type) {\n                return Detail::measure<Clock>(fun, iters);\n            }\n            template <typename Clock, typename Fun>\n            TimingOf<Clock, Fun(Chronometer)> measure_one(Fun&& fun, int iters, std::true_type) {\n                Detail::ChronometerModel<Clock> meter;\n                auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters));\n\n                return { meter.elapsed(), std::move(result), iters };\n            }\n\n            template <typename Clock, typename Fun>\n            using run_for_at_least_argument_t = typename std::conditional<is_callable<Fun(Chronometer)>::value, Chronometer, int>::type;\n\n            struct optimized_away_error : std::exception {\n                const char* what() const noexcept override {\n                    return \"could not measure benchmark, maybe it was optimized away\";\n                }\n            };\n\n            template <typename Clock, typename Fun>\n            TimingOf<Clock, Fun(run_for_at_least_argument_t<Clock, Fun>)> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) {\n                auto iters = seed;\n                while (iters < (1 << 30)) {\n                    auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>());\n\n                    if (Timing.elapsed >= how_long) {\n                        return { Timing.elapsed, std::move(Timing.result), iters };\n                    }\n                    iters *= 2;\n                }\n                throw optimized_away_error{};\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_run_for_at_least.hpp\n#include <algorithm>\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration>\n        struct ExecutionPlan {\n            int iterations_per_sample;\n            Duration estimated_duration;\n            Detail::BenchmarkFunction benchmark;\n            Duration warmup_time;\n            int warmup_iterations;\n\n            template <typename Duration2>\n            operator ExecutionPlan<Duration2>() const {\n                return { iterations_per_sample, estimated_duration, benchmark, warmup_time, warmup_iterations };\n            }\n\n            template <typename Clock>\n            std::vector<FloatDuration<Clock>> run(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const {\n                // warmup a bit\n                Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_iterations, Detail::repeat(now<Clock>{}));\n\n                std::vector<FloatDuration<Clock>> times;\n                times.reserve(cfg.benchmarkSamples());\n                std::generate_n(std::back_inserter(times), cfg.benchmarkSamples(), [this, env] {\n                    Detail::ChronometerModel<Clock> model;\n                    this->benchmark(Chronometer(model, iterations_per_sample));\n                    auto sample_time = model.elapsed() - env.clock_cost.mean;\n                    if (sample_time < FloatDuration<Clock>::zero()) sample_time = FloatDuration<Clock>::zero();\n                    return sample_time / iterations_per_sample;\n                });\n                return times;\n            }\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_execution_plan.hpp\n// start catch_estimate_clock.hpp\n\n // Environment measurement\n\n\n// start catch_stats.hpp\n\n// Statistical analysis tools\n\n\n#include <algorithm>\n#include <functional>\n#include <vector>\n#include <numeric>\n#include <tuple>\n#include <cmath>\n#include <utility>\n#include <cstddef>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            using sample = std::vector<double>;\n\n            double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last);\n\n            template <typename Iterator>\n            OutlierClassification classify_outliers(Iterator first, Iterator last) {\n                std::vector<double> copy(first, last);\n\n                auto q1 = weighted_average_quantile(1, 4, copy.begin(), copy.end());\n                auto q3 = weighted_average_quantile(3, 4, copy.begin(), copy.end());\n                auto iqr = q3 - q1;\n                auto los = q1 - (iqr * 3.);\n                auto lom = q1 - (iqr * 1.5);\n                auto him = q3 + (iqr * 1.5);\n                auto his = q3 + (iqr * 3.);\n\n                OutlierClassification o;\n                for (; first != last; ++first) {\n                    auto&& t = *first;\n                    if (t < los) ++o.low_severe;\n                    else if (t < lom) ++o.low_mild;\n                    else if (t > his) ++o.high_severe;\n                    else if (t > him) ++o.high_mild;\n                    ++o.samples_seen;\n                }\n                return o;\n            }\n\n            template <typename Iterator>\n            double mean(Iterator first, Iterator last) {\n                auto count = last - first;\n                double sum = std::accumulate(first, last, 0.);\n                return sum / count;\n            }\n\n            template <typename URng, typename Iterator, typename Estimator>\n            sample resample(URng& rng, int resamples, Iterator first, Iterator last, Estimator& estimator) {\n                auto n = last - first;\n                std::uniform_int_distribution<decltype(n)> dist(0, n - 1);\n\n                sample out;\n                out.reserve(resamples);\n                std::generate_n(std::back_inserter(out), resamples, [n, first, &estimator, &dist, &rng] {\n                    std::vector<double> resampled;\n                    resampled.reserve(n);\n                    std::generate_n(std::back_inserter(resampled), n, [first, &dist, &rng] { return first[dist(rng)]; });\n                    return estimator(resampled.begin(), resampled.end());\n                });\n                std::sort(out.begin(), out.end());\n                return out;\n            }\n\n            template <typename Estimator, typename Iterator>\n            sample jackknife(Estimator&& estimator, Iterator first, Iterator last) {\n                auto n = last - first;\n                auto second = std::next(first);\n                sample results;\n                results.reserve(n);\n\n                for (auto it = first; it != last; ++it) {\n                    std::iter_swap(it, first);\n                    results.push_back(estimator(second, last));\n                }\n\n                return results;\n            }\n\n            inline double normal_cdf(double x) {\n                return std::erfc(-x / std::sqrt(2.0)) / 2.0;\n            }\n\n            double erfc_inv(double x);\n\n            double normal_quantile(double p);\n\n            template <typename Iterator, typename Estimator>\n            Estimate<double> bootstrap(double confidence_level, Iterator first, Iterator last, sample const& resample, Estimator&& estimator) {\n                auto n_samples = last - first;\n\n                double point = estimator(first, last);\n                // Degenerate case with a single sample\n                if (n_samples == 1) return { point, point, point, confidence_level };\n\n                sample jack = jackknife(estimator, first, last);\n                double jack_mean = mean(jack.begin(), jack.end());\n                double sum_squares, sum_cubes;\n                std::tie(sum_squares, sum_cubes) = std::accumulate(jack.begin(), jack.end(), std::make_pair(0., 0.), [jack_mean](std::pair<double, double> sqcb, double x) -> std::pair<double, double> {\n                    auto d = jack_mean - x;\n                    auto d2 = d * d;\n                    auto d3 = d2 * d;\n                    return { sqcb.first + d2, sqcb.second + d3 };\n                });\n\n                double accel = sum_cubes / (6 * std::pow(sum_squares, 1.5));\n                int n = static_cast<int>(resample.size());\n                double prob_n = std::count_if(resample.begin(), resample.end(), [point](double x) { return x < point; }) / (double)n;\n                // degenerate case with uniform samples\n                if (prob_n == 0) return { point, point, point, confidence_level };\n\n                double bias = normal_quantile(prob_n);\n                double z1 = normal_quantile((1. - confidence_level) / 2.);\n\n                auto cumn = [n](double x) -> int {\n                    return std::lround(normal_cdf(x) * n); };\n                auto a = [bias, accel](double b) { return bias + b / (1. - accel * b); };\n                double b1 = bias + z1;\n                double b2 = bias - z1;\n                double a1 = a(b1);\n                double a2 = a(b2);\n                auto lo = std::max(cumn(a1), 0);\n                auto hi = std::min(cumn(a2), n - 1);\n\n                return { point, resample[lo], resample[hi], confidence_level };\n            }\n\n            double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n);\n\n            struct bootstrap_analysis {\n                Estimate<double> mean;\n                Estimate<double> standard_deviation;\n                double outlier_variance;\n            };\n\n            bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last);\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_stats.hpp\n#include <algorithm>\n#include <iterator>\n#include <tuple>\n#include <vector>\n#include <cmath>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Clock>\n            std::vector<double> resolution(int k) {\n                std::vector<TimePoint<Clock>> times;\n                times.reserve(k + 1);\n                std::generate_n(std::back_inserter(times), k + 1, now<Clock>{});\n\n                std::vector<double> deltas;\n                deltas.reserve(k);\n                std::transform(std::next(times.begin()), times.end(), times.begin(),\n                    std::back_inserter(deltas),\n                    [](TimePoint<Clock> a, TimePoint<Clock> b) { return static_cast<double>((a - b).count()); });\n\n                return deltas;\n            }\n\n            const auto warmup_iterations = 10000;\n            const auto warmup_time = std::chrono::milliseconds(100);\n            const auto minimum_ticks = 1000;\n            const auto warmup_seed = 10000;\n            const auto clock_resolution_estimation_time = std::chrono::milliseconds(500);\n            const auto clock_cost_estimation_time_limit = std::chrono::seconds(1);\n            const auto clock_cost_estimation_tick_limit = 100000;\n            const auto clock_cost_estimation_time = std::chrono::milliseconds(10);\n            const auto clock_cost_estimation_iterations = 10000;\n\n            template <typename Clock>\n            int warmup() {\n                return run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_seed, &resolution<Clock>)\n                    .iterations;\n            }\n            template <typename Clock>\n            EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolution(int iterations) {\n                auto r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_resolution_estimation_time), iterations, &resolution<Clock>)\n                    .result;\n                return {\n                    FloatDuration<Clock>(mean(r.begin(), r.end())),\n                    classify_outliers(r.begin(), r.end()),\n                };\n            }\n            template <typename Clock>\n            EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_cost(FloatDuration<Clock> resolution) {\n                auto time_limit = std::min(resolution * clock_cost_estimation_tick_limit, FloatDuration<Clock>(clock_cost_estimation_time_limit));\n                auto time_clock = [](int k) {\n                    return Detail::measure<Clock>([k] {\n                        for (int i = 0; i < k; ++i) {\n                            volatile auto ignored = Clock::now();\n                            (void)ignored;\n                        }\n                    }).elapsed;\n                };\n                time_clock(1);\n                int iters = clock_cost_estimation_iterations;\n                auto&& r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_cost_estimation_time), iters, time_clock);\n                std::vector<double> times;\n                int nsamples = static_cast<int>(std::ceil(time_limit / r.elapsed));\n                times.reserve(nsamples);\n                std::generate_n(std::back_inserter(times), nsamples, [time_clock, &r] {\n                    return static_cast<double>((time_clock(r.iterations) / r.iterations).count());\n                });\n                return {\n                    FloatDuration<Clock>(mean(times.begin(), times.end())),\n                    classify_outliers(times.begin(), times.end()),\n                };\n            }\n\n            template <typename Clock>\n            Environment<FloatDuration<Clock>> measure_environment() {\n                static Environment<FloatDuration<Clock>>* env = nullptr;\n                if (env) {\n                    return *env;\n                }\n\n                auto iters = Detail::warmup<Clock>();\n                auto resolution = Detail::estimate_clock_resolution<Clock>(iters);\n                auto cost = Detail::estimate_clock_cost<Clock>(resolution.mean);\n\n                env = new Environment<FloatDuration<Clock>>{ resolution, cost };\n                return *env;\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_estimate_clock.hpp\n// start catch_analyse.hpp\n\n // Run and analyse one benchmark\n\n\n// start catch_sample_analysis.hpp\n\n// Benchmark results\n\n\n#include <algorithm>\n#include <vector>\n#include <string>\n#include <iterator>\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration>\n        struct SampleAnalysis {\n            std::vector<Duration> samples;\n            Estimate<Duration> mean;\n            Estimate<Duration> standard_deviation;\n            OutlierClassification outliers;\n            double outlier_variance;\n\n            template <typename Duration2>\n            operator SampleAnalysis<Duration2>() const {\n                std::vector<Duration2> samples2;\n                samples2.reserve(samples.size());\n                std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); });\n                return {\n                    std::move(samples2),\n                    mean,\n                    standard_deviation,\n                    outliers,\n                    outlier_variance,\n                };\n            }\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_sample_analysis.hpp\n#include <algorithm>\n#include <iterator>\n#include <vector>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Duration, typename Iterator>\n            SampleAnalysis<Duration> analyse(const IConfig &cfg, Environment<Duration>, Iterator first, Iterator last) {\n                if (!cfg.benchmarkNoAnalysis()) {\n                    std::vector<double> samples;\n                    samples.reserve(last - first);\n                    std::transform(first, last, std::back_inserter(samples), [](Duration d) { return d.count(); });\n\n                    auto analysis = Catch::Benchmark::Detail::analyse_samples(cfg.benchmarkConfidenceInterval(), cfg.benchmarkResamples(), samples.begin(), samples.end());\n                    auto outliers = Catch::Benchmark::Detail::classify_outliers(samples.begin(), samples.end());\n\n                    auto wrap_estimate = [](Estimate<double> e) {\n                        return Estimate<Duration> {\n                            Duration(e.point),\n                                Duration(e.lower_bound),\n                                Duration(e.upper_bound),\n                                e.confidence_interval,\n                        };\n                    };\n                    std::vector<Duration> samples2;\n                    samples2.reserve(samples.size());\n                    std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](double d) { return Duration(d); });\n                    return {\n                        std::move(samples2),\n                        wrap_estimate(analysis.mean),\n                        wrap_estimate(analysis.standard_deviation),\n                        outliers,\n                        analysis.outlier_variance,\n                    };\n                } else {\n                    std::vector<Duration> samples;\n                    samples.reserve(last - first);\n\n                    Duration mean = Duration(0);\n                    int i = 0;\n                    for (auto it = first; it < last; ++it, ++i) {\n                        samples.push_back(Duration(*it));\n                        mean += Duration(*it);\n                    }\n                    mean /= i;\n\n                    return {\n                        std::move(samples),\n                        Estimate<Duration>{mean, mean, mean, 0.0},\n                        Estimate<Duration>{Duration(0), Duration(0), Duration(0), 0.0},\n                        OutlierClassification{},\n                        0.0\n                    };\n                }\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_analyse.hpp\n#include <algorithm>\n#include <functional>\n#include <string>\n#include <vector>\n#include <cmath>\n\nnamespace Catch {\n    namespace Benchmark {\n        struct Benchmark {\n            Benchmark(std::string &&name)\n                : name(std::move(name)) {}\n\n            template <class FUN>\n            Benchmark(std::string &&name, FUN &&func)\n                : fun(std::move(func)), name(std::move(name)) {}\n\n            template <typename Clock>\n            ExecutionPlan<FloatDuration<Clock>> prepare(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const {\n                auto min_time = env.clock_resolution.mean * Detail::minimum_ticks;\n                auto run_time = std::max(min_time, std::chrono::duration_cast<decltype(min_time)>(Detail::warmup_time));\n                auto&& test = Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun);\n                int new_iters = static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed));\n                return { new_iters, test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(), fun, std::chrono::duration_cast<FloatDuration<Clock>>(Detail::warmup_time), Detail::warmup_iterations };\n            }\n\n            template <typename Clock = default_clock>\n            void run() {\n                IConfigPtr cfg = getCurrentContext().getConfig();\n\n                auto env = Detail::measure_environment<Clock>();\n\n                getResultCapture().benchmarkPreparing(name);\n                CATCH_TRY{\n                    auto plan = user_code([&] {\n                        return prepare<Clock>(*cfg, env);\n                    });\n\n                    BenchmarkInfo info {\n                        name,\n                        plan.estimated_duration.count(),\n                        plan.iterations_per_sample,\n                        cfg->benchmarkSamples(),\n                        cfg->benchmarkResamples(),\n                        env.clock_resolution.mean.count(),\n                        env.clock_cost.mean.count()\n                    };\n\n                    getResultCapture().benchmarkStarting(info);\n\n                    auto samples = user_code([&] {\n                        return plan.template run<Clock>(*cfg, env);\n                    });\n\n                    auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end());\n                    BenchmarkStats<std::chrono::duration<double, std::nano>> stats{ info, analysis.samples, analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance };\n                    getResultCapture().benchmarkEnded(stats);\n\n                } CATCH_CATCH_ALL{\n                    if (translateActiveException() != Detail::benchmarkErrorMsg) // benchmark errors have been reported, otherwise rethrow.\n                        std::rethrow_exception(std::current_exception());\n                }\n            }\n\n            // sets lambda to be used in fun *and* executes benchmark!\n            template <typename Fun,\n                typename std::enable_if<!Detail::is_related<Fun, Benchmark>::value, int>::type = 0>\n                Benchmark & operator=(Fun func) {\n                fun = Detail::BenchmarkFunction(func);\n                run();\n                return *this;\n            }\n\n            explicit operator bool() {\n                return true;\n            }\n\n        private:\n            Detail::BenchmarkFunction fun;\n            std::string name;\n        };\n    }\n} // namespace Catch\n\n#define INTERNAL_CATCH_GET_1_ARG(arg1, arg2, ...) arg1\n#define INTERNAL_CATCH_GET_2_ARG(arg1, arg2, ...) arg2\n\n#define INTERNAL_CATCH_BENCHMARK(BenchmarkName, name, benchmarkIndex)\\\n    if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \\\n        BenchmarkName = [&](int benchmarkIndex)\n\n#define INTERNAL_CATCH_BENCHMARK_ADVANCED(BenchmarkName, name)\\\n    if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \\\n        BenchmarkName = [&]\n\n// end catch_benchmark.hpp\n#endif\n\n#endif // ! CATCH_CONFIG_IMPL_ONLY\n\n#ifdef CATCH_IMPL\n// start catch_impl.hpp\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wweak-vtables\"\n#endif\n\n// Keep these here for external reporters\n// start catch_test_case_tracker.h\n\n#include <string>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\nnamespace TestCaseTracking {\n\n    struct NameAndLocation {\n        std::string name;\n        SourceLineInfo location;\n\n        NameAndLocation( std::string const& _name, SourceLineInfo const& _location );\n    };\n\n    struct ITracker;\n\n    using ITrackerPtr = std::shared_ptr<ITracker>;\n\n    struct ITracker {\n        virtual ~ITracker();\n\n        // static queries\n        virtual NameAndLocation const& nameAndLocation() const = 0;\n\n        // dynamic queries\n        virtual bool isComplete() const = 0; // Successfully completed or failed\n        virtual bool isSuccessfullyCompleted() const = 0;\n        virtual bool isOpen() const = 0; // Started but not complete\n        virtual bool hasChildren() const = 0;\n\n        virtual ITracker& parent() = 0;\n\n        // actions\n        virtual void close() = 0; // Successfully complete\n        virtual void fail() = 0;\n        virtual void markAsNeedingAnotherRun() = 0;\n\n        virtual void addChild( ITrackerPtr const& child ) = 0;\n        virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0;\n        virtual void openChild() = 0;\n\n        // Debug/ checking\n        virtual bool isSectionTracker() const = 0;\n        virtual bool isGeneratorTracker() const = 0;\n    };\n\n    class TrackerContext {\n\n        enum RunState {\n            NotStarted,\n            Executing,\n            CompletedCycle\n        };\n\n        ITrackerPtr m_rootTracker;\n        ITracker* m_currentTracker = nullptr;\n        RunState m_runState = NotStarted;\n\n    public:\n\n        ITracker& startRun();\n        void endRun();\n\n        void startCycle();\n        void completeCycle();\n\n        bool completedCycle() const;\n        ITracker& currentTracker();\n        void setCurrentTracker( ITracker* tracker );\n    };\n\n    class TrackerBase : public ITracker {\n    protected:\n        enum CycleState {\n            NotStarted,\n            Executing,\n            ExecutingChildren,\n            NeedsAnotherRun,\n            CompletedSuccessfully,\n            Failed\n        };\n\n        using Children = std::vector<ITrackerPtr>;\n        NameAndLocation m_nameAndLocation;\n        TrackerContext& m_ctx;\n        ITracker* m_parent;\n        Children m_children;\n        CycleState m_runState = NotStarted;\n\n    public:\n        TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );\n\n        NameAndLocation const& nameAndLocation() const override;\n        bool isComplete() const override;\n        bool isSuccessfullyCompleted() const override;\n        bool isOpen() const override;\n        bool hasChildren() const override;\n\n        void addChild( ITrackerPtr const& child ) override;\n\n        ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) override;\n        ITracker& parent() override;\n\n        void openChild() override;\n\n        bool isSectionTracker() const override;\n        bool isGeneratorTracker() const override;\n\n        void open();\n\n        void close() override;\n        void fail() override;\n        void markAsNeedingAnotherRun() override;\n\n    private:\n        void moveToParent();\n        void moveToThis();\n    };\n\n    class SectionTracker : public TrackerBase {\n        std::vector<std::string> m_filters;\n    public:\n        SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );\n\n        bool isSectionTracker() const override;\n\n        bool isComplete() const override;\n\n        static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation );\n\n        void tryOpen();\n\n        void addInitialFilters( std::vector<std::string> const& filters );\n        void addNextFilters( std::vector<std::string> const& filters );\n    };\n\n} // namespace TestCaseTracking\n\nusing TestCaseTracking::ITracker;\nusing TestCaseTracking::TrackerContext;\nusing TestCaseTracking::SectionTracker;\n\n} // namespace Catch\n\n// end catch_test_case_tracker.h\n\n// start catch_leak_detector.h\n\nnamespace Catch {\n\n    struct LeakDetector {\n        LeakDetector();\n        ~LeakDetector();\n    };\n\n}\n// end catch_leak_detector.h\n// Cpp files will be included in the single-header file here\n// start catch_stats.cpp\n\n// Statistical analysis tools\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n\n#include <cassert>\n#include <random>\n\n#if defined(CATCH_CONFIG_USE_ASYNC)\n#include <future>\n#endif\n\nnamespace {\n    double erf_inv(double x) {\n        // Code accompanying the article \"Approximating the erfinv function\" in GPU Computing Gems, Volume 2\n        double w, p;\n\n        w = -log((1.0 - x) * (1.0 + x));\n\n        if (w < 6.250000) {\n            w = w - 3.125000;\n            p = -3.6444120640178196996e-21;\n            p = -1.685059138182016589e-19 + p * w;\n            p = 1.2858480715256400167e-18 + p * w;\n            p = 1.115787767802518096e-17 + p * w;\n            p = -1.333171662854620906e-16 + p * w;\n            p = 2.0972767875968561637e-17 + p * w;\n            p = 6.6376381343583238325e-15 + p * w;\n            p = -4.0545662729752068639e-14 + p * w;\n            p = -8.1519341976054721522e-14 + p * w;\n            p = 2.6335093153082322977e-12 + p * w;\n            p = -1.2975133253453532498e-11 + p * w;\n            p = -5.4154120542946279317e-11 + p * w;\n            p = 1.051212273321532285e-09 + p * w;\n            p = -4.1126339803469836976e-09 + p * w;\n            p = -2.9070369957882005086e-08 + p * w;\n            p = 4.2347877827932403518e-07 + p * w;\n            p = -1.3654692000834678645e-06 + p * w;\n            p = -1.3882523362786468719e-05 + p * w;\n            p = 0.0001867342080340571352 + p * w;\n            p = -0.00074070253416626697512 + p * w;\n            p = -0.0060336708714301490533 + p * w;\n            p = 0.24015818242558961693 + p * w;\n            p = 1.6536545626831027356 + p * w;\n        } else if (w < 16.000000) {\n            w = sqrt(w) - 3.250000;\n            p = 2.2137376921775787049e-09;\n            p = 9.0756561938885390979e-08 + p * w;\n            p = -2.7517406297064545428e-07 + p * w;\n            p = 1.8239629214389227755e-08 + p * w;\n            p = 1.5027403968909827627e-06 + p * w;\n            p = -4.013867526981545969e-06 + p * w;\n            p = 2.9234449089955446044e-06 + p * w;\n            p = 1.2475304481671778723e-05 + p * w;\n            p = -4.7318229009055733981e-05 + p * w;\n            p = 6.8284851459573175448e-05 + p * w;\n            p = 2.4031110387097893999e-05 + p * w;\n            p = -0.0003550375203628474796 + p * w;\n            p = 0.00095328937973738049703 + p * w;\n            p = -0.0016882755560235047313 + p * w;\n            p = 0.0024914420961078508066 + p * w;\n            p = -0.0037512085075692412107 + p * w;\n            p = 0.005370914553590063617 + p * w;\n            p = 1.0052589676941592334 + p * w;\n            p = 3.0838856104922207635 + p * w;\n        } else {\n            w = sqrt(w) - 5.000000;\n            p = -2.7109920616438573243e-11;\n            p = -2.5556418169965252055e-10 + p * w;\n            p = 1.5076572693500548083e-09 + p * w;\n            p = -3.7894654401267369937e-09 + p * w;\n            p = 7.6157012080783393804e-09 + p * w;\n            p = -1.4960026627149240478e-08 + p * w;\n            p = 2.9147953450901080826e-08 + p * w;\n            p = -6.7711997758452339498e-08 + p * w;\n            p = 2.2900482228026654717e-07 + p * w;\n            p = -9.9298272942317002539e-07 + p * w;\n            p = 4.5260625972231537039e-06 + p * w;\n            p = -1.9681778105531670567e-05 + p * w;\n            p = 7.5995277030017761139e-05 + p * w;\n            p = -0.00021503011930044477347 + p * w;\n            p = -0.00013871931833623122026 + p * w;\n            p = 1.0103004648645343977 + p * w;\n            p = 4.8499064014085844221 + p * w;\n        }\n        return p * x;\n    }\n\n    double standard_deviation(std::vector<double>::iterator first, std::vector<double>::iterator last) {\n        auto m = Catch::Benchmark::Detail::mean(first, last);\n        double variance = std::accumulate(first, last, 0., [m](double a, double b) {\n            double diff = b - m;\n            return a + diff * diff;\n            }) / (last - first);\n            return std::sqrt(variance);\n    }\n\n}\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n\n            double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last) {\n                auto count = last - first;\n                double idx = (count - 1) * k / static_cast<double>(q);\n                int j = static_cast<int>(idx);\n                double g = idx - j;\n                std::nth_element(first, first + j, last);\n                auto xj = first[j];\n                if (g == 0) return xj;\n\n                auto xj1 = *std::min_element(first + (j + 1), last);\n                return xj + g * (xj1 - xj);\n            }\n\n            double erfc_inv(double x) {\n                return erf_inv(1.0 - x);\n            }\n\n            double normal_quantile(double p) {\n                static const double ROOT_TWO = std::sqrt(2.0);\n\n                double result = 0.0;\n                assert(p >= 0 && p <= 1);\n                if (p < 0 || p > 1) {\n                    return result;\n                }\n\n                result = -erfc_inv(2.0 * p);\n                // result *= normal distribution standard deviation (1.0) * sqrt(2)\n                result *= /*sd * */ ROOT_TWO;\n                // result += normal disttribution mean (0)\n                return result;\n            }\n\n            double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n) {\n                double sb = stddev.point;\n                double mn = mean.point / n;\n                double mg_min = mn / 2.;\n                double sg = std::min(mg_min / 4., sb / std::sqrt(n));\n                double sg2 = sg * sg;\n                double sb2 = sb * sb;\n\n                auto c_max = [n, mn, sb2, sg2](double x) -> double {\n                    double k = mn - x;\n                    double d = k * k;\n                    double nd = n * d;\n                    double k0 = -n * nd;\n                    double k1 = sb2 - n * sg2 + nd;\n                    double det = k1 * k1 - 4 * sg2 * k0;\n                    return (int)(-2. * k0 / (k1 + std::sqrt(det)));\n                };\n\n                auto var_out = [n, sb2, sg2](double c) {\n                    double nc = n - c;\n                    return (nc / n) * (sb2 - nc * sg2);\n                };\n\n                return std::min(var_out(1), var_out(std::min(c_max(0.), c_max(mg_min)))) / sb2;\n            }\n\n            bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last) {\n                CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS\n                static std::random_device entropy;\n                CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\n\n                auto n = static_cast<int>(last - first); // seriously, one can't use integral types without hell in C++\n\n                auto mean = &Detail::mean<std::vector<double>::iterator>;\n                auto stddev = &standard_deviation;\n\n#if defined(CATCH_CONFIG_USE_ASYNC)\n                auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {\n                    auto seed = entropy();\n                    return std::async(std::launch::async, [=] {\n                        std::mt19937 rng(seed);\n                        auto resampled = resample(rng, n_resamples, first, last, f);\n                        return bootstrap(confidence_level, first, last, resampled, f);\n                    });\n                };\n\n                auto mean_future = Estimate(mean);\n                auto stddev_future = Estimate(stddev);\n\n                auto mean_estimate = mean_future.get();\n                auto stddev_estimate = stddev_future.get();\n#else\n                auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {\n                    auto seed = entropy();\n                    std::mt19937 rng(seed);\n                    auto resampled = resample(rng, n_resamples, first, last, f);\n                    return bootstrap(confidence_level, first, last, resampled, f);\n                };\n\n                auto mean_estimate = Estimate(mean);\n                auto stddev_estimate = Estimate(stddev);\n#endif // CATCH_USE_ASYNC\n\n                double outlier_variance = Detail::outlier_variance(mean_estimate, stddev_estimate, n);\n\n                return { mean_estimate, stddev_estimate, outlier_variance };\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n// end catch_stats.cpp\n// start catch_approx.cpp\n\n#include <cmath>\n#include <limits>\n\nnamespace {\n\n// Performs equivalent check of std::fabs(lhs - rhs) <= margin\n// But without the subtraction to allow for INFINITY in comparison\nbool marginComparison(double lhs, double rhs, double margin) {\n    return (lhs + margin >= rhs) && (rhs + margin >= lhs);\n}\n\n}\n\nnamespace Catch {\nnamespace Detail {\n\n    Approx::Approx ( double value )\n    :   m_epsilon( std::numeric_limits<float>::epsilon()*100 ),\n        m_margin( 0.0 ),\n        m_scale( 0.0 ),\n        m_value( value )\n    {}\n\n    Approx Approx::custom() {\n        return Approx( 0 );\n    }\n\n    Approx Approx::operator-() const {\n        auto temp(*this);\n        temp.m_value = -temp.m_value;\n        return temp;\n    }\n\n    std::string Approx::toString() const {\n        ReusableStringStream rss;\n        rss << \"Approx( \" << ::Catch::Detail::stringify( m_value ) << \" )\";\n        return rss.str();\n    }\n\n    bool Approx::equalityComparisonImpl(const double other) const {\n        // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value\n        // Thanks to Richard Harris for his help refining the scaled margin value\n        return marginComparison(m_value, other, m_margin) || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(m_value)));\n    }\n\n    void Approx::setMargin(double newMargin) {\n        CATCH_ENFORCE(newMargin >= 0,\n            \"Invalid Approx::margin: \" << newMargin << '.'\n            << \" Approx::Margin has to be non-negative.\");\n        m_margin = newMargin;\n    }\n\n    void Approx::setEpsilon(double newEpsilon) {\n        CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0,\n            \"Invalid Approx::epsilon: \" << newEpsilon << '.'\n            << \" Approx::epsilon has to be in [0, 1]\");\n        m_epsilon = newEpsilon;\n    }\n\n} // end namespace Detail\n\nnamespace literals {\n    Detail::Approx operator \"\" _a(long double val) {\n        return Detail::Approx(val);\n    }\n    Detail::Approx operator \"\" _a(unsigned long long val) {\n        return Detail::Approx(val);\n    }\n} // end namespace literals\n\nstd::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) {\n    return value.toString();\n}\n\n} // end namespace Catch\n// end catch_approx.cpp\n// start catch_assertionhandler.cpp\n\n// start catch_debugger.h\n\nnamespace Catch {\n    bool isDebuggerActive();\n}\n\n#ifdef CATCH_PLATFORM_MAC\n\n    #define CATCH_TRAP() __asm__(\"int $3\\n\" : : ) /* NOLINT */\n\n#elif defined(CATCH_PLATFORM_LINUX)\n    // If we can use inline assembler, do it because this allows us to break\n    // directly at the location of the failing check instead of breaking inside\n    // raise() called from it, i.e. one stack frame below.\n    #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))\n        #define CATCH_TRAP() asm volatile (\"int $3\") /* NOLINT */\n    #else // Fall back to the generic way.\n        #include <signal.h>\n\n        #define CATCH_TRAP() raise(SIGTRAP)\n    #endif\n#elif defined(_MSC_VER)\n    #define CATCH_TRAP() __debugbreak()\n#elif defined(__MINGW32__)\n    extern \"C\" __declspec(dllimport) void __stdcall DebugBreak();\n    #define CATCH_TRAP() DebugBreak()\n#endif\n\n#ifdef CATCH_TRAP\n    #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }()\n#else\n    #define CATCH_BREAK_INTO_DEBUGGER() []{}()\n#endif\n\n// end catch_debugger.h\n// start catch_run_context.h\n\n// start catch_fatal_condition.h\n\n// start catch_windows_h_proxy.h\n\n\n#if defined(CATCH_PLATFORM_WINDOWS)\n\n#if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX)\n#  define CATCH_DEFINED_NOMINMAX\n#  define NOMINMAX\n#endif\n#if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN)\n#  define CATCH_DEFINED_WIN32_LEAN_AND_MEAN\n#  define WIN32_LEAN_AND_MEAN\n#endif\n\n#ifdef __AFXDLL\n#include <AfxWin.h>\n#else\n#include <windows.h>\n#endif\n\n#ifdef CATCH_DEFINED_NOMINMAX\n#  undef NOMINMAX\n#endif\n#ifdef CATCH_DEFINED_WIN32_LEAN_AND_MEAN\n#  undef WIN32_LEAN_AND_MEAN\n#endif\n\n#endif // defined(CATCH_PLATFORM_WINDOWS)\n\n// end catch_windows_h_proxy.h\n#if defined( CATCH_CONFIG_WINDOWS_SEH )\n\nnamespace Catch {\n\n    struct FatalConditionHandler {\n\n        static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo);\n        FatalConditionHandler();\n        static void reset();\n        ~FatalConditionHandler();\n\n    private:\n        static bool isSet;\n        static ULONG guaranteeSize;\n        static PVOID exceptionHandlerHandle;\n    };\n\n} // namespace Catch\n\n#elif defined ( CATCH_CONFIG_POSIX_SIGNALS )\n\n#include <signal.h>\n\nnamespace Catch {\n\n    struct FatalConditionHandler {\n\n        static bool isSet;\n        static struct sigaction oldSigActions[];\n        static stack_t oldSigStack;\n        static char altStackMem[];\n\n        static void handleSignal( int sig );\n\n        FatalConditionHandler();\n        ~FatalConditionHandler();\n        static void reset();\n    };\n\n} // namespace Catch\n\n#else\n\nnamespace Catch {\n    struct FatalConditionHandler {\n        void reset();\n    };\n}\n\n#endif\n\n// end catch_fatal_condition.h\n#include <string>\n\nnamespace Catch {\n\n    struct IMutableContext;\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class RunContext : public IResultCapture, public IRunner {\n\n    public:\n        RunContext( RunContext const& ) = delete;\n        RunContext& operator =( RunContext const& ) = delete;\n\n        explicit RunContext( IConfigPtr const& _config, IStreamingReporterPtr&& reporter );\n\n        ~RunContext() override;\n\n        void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount );\n        void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount );\n\n        Totals runTest(TestCase const& testCase);\n\n        IConfigPtr config() const;\n        IStreamingReporter& reporter() const;\n\n    public: // IResultCapture\n\n        // Assertion handlers\n        void handleExpr\n                (   AssertionInfo const& info,\n                    ITransientExpression const& expr,\n                    AssertionReaction& reaction ) override;\n        void handleMessage\n                (   AssertionInfo const& info,\n                    ResultWas::OfType resultType,\n                    StringRef const& message,\n                    AssertionReaction& reaction ) override;\n        void handleUnexpectedExceptionNotThrown\n                (   AssertionInfo const& info,\n                    AssertionReaction& reaction ) override;\n        void handleUnexpectedInflightException\n                (   AssertionInfo const& info,\n                    std::string const& message,\n                    AssertionReaction& reaction ) override;\n        void handleIncomplete\n                (   AssertionInfo const& info ) override;\n        void handleNonExpr\n                (   AssertionInfo const &info,\n                    ResultWas::OfType resultType,\n                    AssertionReaction &reaction ) override;\n\n        bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) override;\n\n        void sectionEnded( SectionEndInfo const& endInfo ) override;\n        void sectionEndedEarly( SectionEndInfo const& endInfo ) override;\n\n        auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        void benchmarkPreparing( std::string const& name ) override;\n        void benchmarkStarting( BenchmarkInfo const& info ) override;\n        void benchmarkEnded( BenchmarkStats<> const& stats ) override;\n        void benchmarkFailed( std::string const& error ) override;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        void pushScopedMessage( MessageInfo const& message ) override;\n        void popScopedMessage( MessageInfo const& message ) override;\n\n        void emplaceUnscopedMessage( MessageBuilder const& builder ) override;\n\n        std::string getCurrentTestName() const override;\n\n        const AssertionResult* getLastResult() const override;\n\n        void exceptionEarlyReported() override;\n\n        void handleFatalErrorCondition( StringRef message ) override;\n\n        bool lastAssertionPassed() override;\n\n        void assertionPassed() override;\n\n    public:\n        // !TBD We need to do this another way!\n        bool aborting() const final;\n\n    private:\n\n        void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr );\n        void invokeActiveTestCase();\n\n        void resetAssertionInfo();\n        bool testForMissingAssertions( Counts& assertions );\n\n        void assertionEnded( AssertionResult const& result );\n        void reportExpr\n                (   AssertionInfo const &info,\n                    ResultWas::OfType resultType,\n                    ITransientExpression const *expr,\n                    bool negated );\n\n        void populateReaction( AssertionReaction& reaction );\n\n    private:\n\n        void handleUnfinishedSections();\n\n        TestRunInfo m_runInfo;\n        IMutableContext& m_context;\n        TestCase const* m_activeTestCase = nullptr;\n        ITracker* m_testCaseTracker = nullptr;\n        Option<AssertionResult> m_lastResult;\n\n        IConfigPtr m_config;\n        Totals m_totals;\n        IStreamingReporterPtr m_reporter;\n        std::vector<MessageInfo> m_messages;\n        std::vector<ScopedMessage> m_messageScopes; /* Keeps owners of so-called unscoped messages. */\n        AssertionInfo m_lastAssertionInfo;\n        std::vector<SectionEndInfo> m_unfinishedSections;\n        std::vector<ITracker*> m_activeSections;\n        TrackerContext m_trackerContext;\n        bool m_lastAssertionPassed = false;\n        bool m_shouldReportUnexpected = true;\n        bool m_includeSuccessfulResults;\n    };\n\n} // end namespace Catch\n\n// end catch_run_context.h\nnamespace Catch {\n\n    namespace {\n        auto operator <<( std::ostream& os, ITransientExpression const& expr ) -> std::ostream& {\n            expr.streamReconstructedExpression( os );\n            return os;\n        }\n    }\n\n    LazyExpression::LazyExpression( bool isNegated )\n    :   m_isNegated( isNegated )\n    {}\n\n    LazyExpression::LazyExpression( LazyExpression const& other ) : m_isNegated( other.m_isNegated ) {}\n\n    LazyExpression::operator bool() const {\n        return m_transientExpression != nullptr;\n    }\n\n    auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream& {\n        if( lazyExpr.m_isNegated )\n            os << \"!\";\n\n        if( lazyExpr ) {\n            if( lazyExpr.m_isNegated && lazyExpr.m_transientExpression->isBinaryExpression() )\n                os << \"(\" << *lazyExpr.m_transientExpression << \")\";\n            else\n                os << *lazyExpr.m_transientExpression;\n        }\n        else {\n            os << \"{** error - unchecked empty expression requested **}\";\n        }\n        return os;\n    }\n\n    AssertionHandler::AssertionHandler\n        (   StringRef const& macroName,\n            SourceLineInfo const& lineInfo,\n            StringRef capturedExpression,\n            ResultDisposition::Flags resultDisposition )\n    :   m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition },\n        m_resultCapture( getResultCapture() )\n    {}\n\n    void AssertionHandler::handleExpr( ITransientExpression const& expr ) {\n        m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );\n    }\n    void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const& message) {\n        m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction );\n    }\n\n    auto AssertionHandler::allowThrows() const -> bool {\n        return getCurrentContext().getConfig()->allowThrows();\n    }\n\n    void AssertionHandler::complete() {\n        setCompleted();\n        if( m_reaction.shouldDebugBreak ) {\n\n            // If you find your debugger stopping you here then go one level up on the\n            // call-stack for the code that caused it (typically a failed assertion)\n\n            // (To go back to the test and change execution, jump over the throw, next)\n            CATCH_BREAK_INTO_DEBUGGER();\n        }\n        if (m_reaction.shouldThrow) {\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n            throw Catch::TestFailureException();\n#else\n            CATCH_ERROR( \"Test failure requires aborting test!\" );\n#endif\n        }\n    }\n    void AssertionHandler::setCompleted() {\n        m_completed = true;\n    }\n\n    void AssertionHandler::handleUnexpectedInflightException() {\n        m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction );\n    }\n\n    void AssertionHandler::handleExceptionThrownAsExpected() {\n        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);\n    }\n    void AssertionHandler::handleExceptionNotThrownAsExpected() {\n        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);\n    }\n\n    void AssertionHandler::handleUnexpectedExceptionNotThrown() {\n        m_resultCapture.handleUnexpectedExceptionNotThrown( m_assertionInfo, m_reaction );\n    }\n\n    void AssertionHandler::handleThrowingCallSkipped() {\n        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);\n    }\n\n    // This is the overload that takes a string and infers the Equals matcher from it\n    // The more general overload, that takes any string matcher, is in catch_capture_matchers.cpp\n    void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString  ) {\n        handleExceptionMatchExpr( handler, Matchers::Equals( str ), matcherString );\n    }\n\n} // namespace Catch\n// end catch_assertionhandler.cpp\n// start catch_assertionresult.cpp\n\nnamespace Catch {\n    AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression):\n        lazyExpression(_lazyExpression),\n        resultType(_resultType) {}\n\n    std::string AssertionResultData::reconstructExpression() const {\n\n        if( reconstructedExpression.empty() ) {\n            if( lazyExpression ) {\n                ReusableStringStream rss;\n                rss << lazyExpression;\n                reconstructedExpression = rss.str();\n            }\n        }\n        return reconstructedExpression;\n    }\n\n    AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )\n    :   m_info( info ),\n        m_resultData( data )\n    {}\n\n    // Result was a success\n    bool AssertionResult::succeeded() const {\n        return Catch::isOk( m_resultData.resultType );\n    }\n\n    // Result was a success, or failure is suppressed\n    bool AssertionResult::isOk() const {\n        return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition );\n    }\n\n    ResultWas::OfType AssertionResult::getResultType() const {\n        return m_resultData.resultType;\n    }\n\n    bool AssertionResult::hasExpression() const {\n        return m_info.capturedExpression[0] != 0;\n    }\n\n    bool AssertionResult::hasMessage() const {\n        return !m_resultData.message.empty();\n    }\n\n    std::string AssertionResult::getExpression() const {\n        if( isFalseTest( m_info.resultDisposition ) )\n            return \"!(\" + m_info.capturedExpression + \")\";\n        else\n            return m_info.capturedExpression;\n    }\n\n    std::string AssertionResult::getExpressionInMacro() const {\n        std::string expr;\n        if( m_info.macroName[0] == 0 )\n            expr = m_info.capturedExpression;\n        else {\n            expr.reserve( m_info.macroName.size() + m_info.capturedExpression.size() + 4 );\n            expr += m_info.macroName;\n            expr += \"( \";\n            expr += m_info.capturedExpression;\n            expr += \" )\";\n        }\n        return expr;\n    }\n\n    bool AssertionResult::hasExpandedExpression() const {\n        return hasExpression() && getExpandedExpression() != getExpression();\n    }\n\n    std::string AssertionResult::getExpandedExpression() const {\n        std::string expr = m_resultData.reconstructExpression();\n        return expr.empty()\n                ? getExpression()\n                : expr;\n    }\n\n    std::string AssertionResult::getMessage() const {\n        return m_resultData.message;\n    }\n    SourceLineInfo AssertionResult::getSourceInfo() const {\n        return m_info.lineInfo;\n    }\n\n    StringRef AssertionResult::getTestMacroName() const {\n        return m_info.macroName;\n    }\n\n} // end namespace Catch\n// end catch_assertionresult.cpp\n// start catch_capture_matchers.cpp\n\nnamespace Catch {\n\n    using StringMatcher = Matchers::Impl::MatcherBase<std::string>;\n\n    // This is the general overload that takes a any string matcher\n    // There is another overload, in catch_assertionhandler.h/.cpp, that only takes a string and infers\n    // the Equals matcher (so the header does not mention matchers)\n    void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString  ) {\n        std::string exceptionMessage = Catch::translateActiveException();\n        MatchExpr<std::string, StringMatcher const&> expr( exceptionMessage, matcher, matcherString );\n        handler.handleExpr( expr );\n    }\n\n} // namespace Catch\n// end catch_capture_matchers.cpp\n// start catch_commandline.cpp\n\n// start catch_commandline.h\n\n// start catch_clara.h\n\n// Use Catch's value for console width (store Clara's off to the side, if present)\n#ifdef CLARA_CONFIG_CONSOLE_WIDTH\n#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH\n#undef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH\n#endif\n#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH-1\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wweak-vtables\"\n#pragma clang diagnostic ignored \"-Wexit-time-destructors\"\n#pragma clang diagnostic ignored \"-Wshadow\"\n#endif\n\n// start clara.hpp\n// Copyright 2017 Two Blue Cubes Ltd. All rights reserved.\n//\n// Distributed under the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// See https://github.com/philsquared/Clara for more details\n\n// Clara v1.1.5\n\n\n#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH\n#define CATCH_CLARA_CONFIG_CONSOLE_WIDTH 80\n#endif\n\n#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH\n#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CLARA_CONFIG_CONSOLE_WIDTH\n#endif\n\n#ifndef CLARA_CONFIG_OPTIONAL_TYPE\n#ifdef __has_include\n#if __has_include(<optional>) && __cplusplus >= 201703L\n#include <optional>\n#define CLARA_CONFIG_OPTIONAL_TYPE std::optional\n#endif\n#endif\n#endif\n\n// ----------- #included from clara_textflow.hpp -----------\n\n// TextFlowCpp\n//\n// A single-header library for wrapping and laying out basic text, by Phil Nash\n//\n// Distributed under the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// This project is hosted at https://github.com/philsquared/textflowcpp\n\n\n#include <cassert>\n#include <ostream>\n#include <sstream>\n#include <vector>\n\n#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH\n#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH 80\n#endif\n\nnamespace Catch {\nnamespace clara {\nnamespace TextFlow {\n\ninline auto isWhitespace(char c) -> bool {\n\tstatic std::string chars = \" \\t\\n\\r\";\n\treturn chars.find(c) != std::string::npos;\n}\ninline auto isBreakableBefore(char c) -> bool {\n\tstatic std::string chars = \"[({<|\";\n\treturn chars.find(c) != std::string::npos;\n}\ninline auto isBreakableAfter(char c) -> bool {\n\tstatic std::string chars = \"])}>.,:;*+-=&/\\\\\";\n\treturn chars.find(c) != std::string::npos;\n}\n\nclass Columns;\n\nclass Column {\n\tstd::vector<std::string> m_strings;\n\tsize_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH;\n\tsize_t m_indent = 0;\n\tsize_t m_initialIndent = std::string::npos;\n\npublic:\n\tclass iterator {\n\t\tfriend Column;\n\n\t\tColumn const& m_column;\n\t\tsize_t m_stringIndex = 0;\n\t\tsize_t m_pos = 0;\n\n\t\tsize_t m_len = 0;\n\t\tsize_t m_end = 0;\n\t\tbool m_suffix = false;\n\n\t\titerator(Column const& column, size_t stringIndex)\n\t\t\t: m_column(column),\n\t\t\tm_stringIndex(stringIndex) {}\n\n\t\tauto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; }\n\n\t\tauto isBoundary(size_t at) const -> bool {\n\t\t\tassert(at > 0);\n\t\t\tassert(at <= line().size());\n\n\t\t\treturn at == line().size() ||\n\t\t\t\t(isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) ||\n\t\t\t\tisBreakableBefore(line()[at]) ||\n\t\t\t\tisBreakableAfter(line()[at - 1]);\n\t\t}\n\n\t\tvoid calcLength() {\n\t\t\tassert(m_stringIndex < m_column.m_strings.size());\n\n\t\t\tm_suffix = false;\n\t\t\tauto width = m_column.m_width - indent();\n\t\t\tm_end = m_pos;\n\t\t\tif (line()[m_pos] == '\\n') {\n\t\t\t\t++m_end;\n\t\t\t}\n\t\t\twhile (m_end < line().size() && line()[m_end] != '\\n')\n\t\t\t\t++m_end;\n\n\t\t\tif (m_end < m_pos + width) {\n\t\t\t\tm_len = m_end - m_pos;\n\t\t\t} else {\n\t\t\t\tsize_t len = width;\n\t\t\t\twhile (len > 0 && !isBoundary(m_pos + len))\n\t\t\t\t\t--len;\n\t\t\t\twhile (len > 0 && isWhitespace(line()[m_pos + len - 1]))\n\t\t\t\t\t--len;\n\n\t\t\t\tif (len > 0) {\n\t\t\t\t\tm_len = len;\n\t\t\t\t} else {\n\t\t\t\t\tm_suffix = true;\n\t\t\t\t\tm_len = width - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tauto indent() const -> size_t {\n\t\t\tauto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos;\n\t\t\treturn initial == std::string::npos ? m_column.m_indent : initial;\n\t\t}\n\n\t\tauto addIndentAndSuffix(std::string const &plain) const -> std::string {\n\t\t\treturn std::string(indent(), ' ') + (m_suffix ? plain + \"-\" : plain);\n\t\t}\n\n\tpublic:\n\t\tusing difference_type = std::ptrdiff_t;\n\t\tusing value_type = std::string;\n\t\tusing pointer = value_type * ;\n\t\tusing reference = value_type & ;\n\t\tusing iterator_category = std::forward_iterator_tag;\n\n\t\texplicit iterator(Column const& column) : m_column(column) {\n\t\t\tassert(m_column.m_width > m_column.m_indent);\n\t\t\tassert(m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent);\n\t\t\tcalcLength();\n\t\t\tif (m_len == 0)\n\t\t\t\tm_stringIndex++; // Empty string\n\t\t}\n\n\t\tauto operator *() const -> std::string {\n\t\t\tassert(m_stringIndex < m_column.m_strings.size());\n\t\t\tassert(m_pos <= m_end);\n\t\t\treturn addIndentAndSuffix(line().substr(m_pos, m_len));\n\t\t}\n\n\t\tauto operator ++() -> iterator& {\n\t\t\tm_pos += m_len;\n\t\t\tif (m_pos < line().size() && line()[m_pos] == '\\n')\n\t\t\t\tm_pos += 1;\n\t\t\telse\n\t\t\t\twhile (m_pos < line().size() && isWhitespace(line()[m_pos]))\n\t\t\t\t\t++m_pos;\n\n\t\t\tif (m_pos == line().size()) {\n\t\t\t\tm_pos = 0;\n\t\t\t\t++m_stringIndex;\n\t\t\t}\n\t\t\tif (m_stringIndex < m_column.m_strings.size())\n\t\t\t\tcalcLength();\n\t\t\treturn *this;\n\t\t}\n\t\tauto operator ++(int) -> iterator {\n\t\t\titerator prev(*this);\n\t\t\toperator++();\n\t\t\treturn prev;\n\t\t}\n\n\t\tauto operator ==(iterator const& other) const -> bool {\n\t\t\treturn\n\t\t\t\tm_pos == other.m_pos &&\n\t\t\t\tm_stringIndex == other.m_stringIndex &&\n\t\t\t\t&m_column == &other.m_column;\n\t\t}\n\t\tauto operator !=(iterator const& other) const -> bool {\n\t\t\treturn !operator==(other);\n\t\t}\n\t};\n\tusing const_iterator = iterator;\n\n\texplicit Column(std::string const& text) { m_strings.push_back(text); }\n\n\tauto width(size_t newWidth) -> Column& {\n\t\tassert(newWidth > 0);\n\t\tm_width = newWidth;\n\t\treturn *this;\n\t}\n\tauto indent(size_t newIndent) -> Column& {\n\t\tm_indent = newIndent;\n\t\treturn *this;\n\t}\n\tauto initialIndent(size_t newIndent) -> Column& {\n\t\tm_initialIndent = newIndent;\n\t\treturn *this;\n\t}\n\n\tauto width() const -> size_t { return m_width; }\n\tauto begin() const -> iterator { return iterator(*this); }\n\tauto end() const -> iterator { return { *this, m_strings.size() }; }\n\n\tinline friend std::ostream& operator << (std::ostream& os, Column const& col) {\n\t\tbool first = true;\n\t\tfor (auto line : col) {\n\t\t\tif (first)\n\t\t\t\tfirst = false;\n\t\t\telse\n\t\t\t\tos << \"\\n\";\n\t\t\tos << line;\n\t\t}\n\t\treturn os;\n\t}\n\n\tauto operator + (Column const& other)->Columns;\n\n\tauto toString() const -> std::string {\n\t\tstd::ostringstream oss;\n\t\toss << *this;\n\t\treturn oss.str();\n\t}\n};\n\nclass Spacer : public Column {\n\npublic:\n\texplicit Spacer(size_t spaceWidth) : Column(\"\") {\n\t\twidth(spaceWidth);\n\t}\n};\n\nclass Columns {\n\tstd::vector<Column> m_columns;\n\npublic:\n\n\tclass iterator {\n\t\tfriend Columns;\n\t\tstruct EndTag {};\n\n\t\tstd::vector<Column> const& m_columns;\n\t\tstd::vector<Column::iterator> m_iterators;\n\t\tsize_t m_activeIterators;\n\n\t\titerator(Columns const& columns, EndTag)\n\t\t\t: m_columns(columns.m_columns),\n\t\t\tm_activeIterators(0) {\n\t\t\tm_iterators.reserve(m_columns.size());\n\n\t\t\tfor (auto const& col : m_columns)\n\t\t\t\tm_iterators.push_back(col.end());\n\t\t}\n\n\tpublic:\n\t\tusing difference_type = std::ptrdiff_t;\n\t\tusing value_type = std::string;\n\t\tusing pointer = value_type * ;\n\t\tusing reference = value_type & ;\n\t\tusing iterator_category = std::forward_iterator_tag;\n\n\t\texplicit iterator(Columns const& columns)\n\t\t\t: m_columns(columns.m_columns),\n\t\t\tm_activeIterators(m_columns.size()) {\n\t\t\tm_iterators.reserve(m_columns.size());\n\n\t\t\tfor (auto const& col : m_columns)\n\t\t\t\tm_iterators.push_back(col.begin());\n\t\t}\n\n\t\tauto operator ==(iterator const& other) const -> bool {\n\t\t\treturn m_iterators == other.m_iterators;\n\t\t}\n\t\tauto operator !=(iterator const& other) const -> bool {\n\t\t\treturn m_iterators != other.m_iterators;\n\t\t}\n\t\tauto operator *() const -> std::string {\n\t\t\tstd::string row, padding;\n\n\t\t\tfor (size_t i = 0; i < m_columns.size(); ++i) {\n\t\t\t\tauto width = m_columns[i].width();\n\t\t\t\tif (m_iterators[i] != m_columns[i].end()) {\n\t\t\t\t\tstd::string col = *m_iterators[i];\n\t\t\t\t\trow += padding + col;\n\t\t\t\t\tif (col.size() < width)\n\t\t\t\t\t\tpadding = std::string(width - col.size(), ' ');\n\t\t\t\t\telse\n\t\t\t\t\t\tpadding = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tpadding += std::string(width, ' ');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn row;\n\t\t}\n\t\tauto operator ++() -> iterator& {\n\t\t\tfor (size_t i = 0; i < m_columns.size(); ++i) {\n\t\t\t\tif (m_iterators[i] != m_columns[i].end())\n\t\t\t\t\t++m_iterators[i];\n\t\t\t}\n\t\t\treturn *this;\n\t\t}\n\t\tauto operator ++(int) -> iterator {\n\t\t\titerator prev(*this);\n\t\t\toperator++();\n\t\t\treturn prev;\n\t\t}\n\t};\n\tusing const_iterator = iterator;\n\n\tauto begin() const -> iterator { return iterator(*this); }\n\tauto end() const -> iterator { return { *this, iterator::EndTag() }; }\n\n\tauto operator += (Column const& col) -> Columns& {\n\t\tm_columns.push_back(col);\n\t\treturn *this;\n\t}\n\tauto operator + (Column const& col) -> Columns {\n\t\tColumns combined = *this;\n\t\tcombined += col;\n\t\treturn combined;\n\t}\n\n\tinline friend std::ostream& operator << (std::ostream& os, Columns const& cols) {\n\n\t\tbool first = true;\n\t\tfor (auto line : cols) {\n\t\t\tif (first)\n\t\t\t\tfirst = false;\n\t\t\telse\n\t\t\t\tos << \"\\n\";\n\t\t\tos << line;\n\t\t}\n\t\treturn os;\n\t}\n\n\tauto toString() const -> std::string {\n\t\tstd::ostringstream oss;\n\t\toss << *this;\n\t\treturn oss.str();\n\t}\n};\n\ninline auto Column::operator + (Column const& other) -> Columns {\n\tColumns cols;\n\tcols += *this;\n\tcols += other;\n\treturn cols;\n}\n}\n\n}\n}\n\n// ----------- end of #include from clara_textflow.hpp -----------\n// ........... back in clara.hpp\n\n#include <cctype>\n#include <string>\n#include <memory>\n#include <set>\n#include <algorithm>\n\n#if !defined(CATCH_PLATFORM_WINDOWS) && ( defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) )\n#define CATCH_PLATFORM_WINDOWS\n#endif\n\nnamespace Catch { namespace clara {\nnamespace detail {\n\n    // Traits for extracting arg and return type of lambdas (for single argument lambdas)\n    template<typename L>\n    struct UnaryLambdaTraits : UnaryLambdaTraits<decltype( &L::operator() )> {};\n\n    template<typename ClassT, typename ReturnT, typename... Args>\n    struct UnaryLambdaTraits<ReturnT( ClassT::* )( Args... ) const> {\n        static const bool isValid = false;\n    };\n\n    template<typename ClassT, typename ReturnT, typename ArgT>\n    struct UnaryLambdaTraits<ReturnT( ClassT::* )( ArgT ) const> {\n        static const bool isValid = true;\n        using ArgType = typename std::remove_const<typename std::remove_reference<ArgT>::type>::type;\n        using ReturnType = ReturnT;\n    };\n\n    class TokenStream;\n\n    // Transport for raw args (copied from main args, or supplied via init list for testing)\n    class Args {\n        friend TokenStream;\n        std::string m_exeName;\n        std::vector<std::string> m_args;\n\n    public:\n        Args( int argc, char const* const* argv )\n            : m_exeName(argv[0]),\n              m_args(argv + 1, argv + argc) {}\n\n        Args( std::initializer_list<std::string> args )\n        :   m_exeName( *args.begin() ),\n            m_args( args.begin()+1, args.end() )\n        {}\n\n        auto exeName() const -> std::string {\n            return m_exeName;\n        }\n    };\n\n    // Wraps a token coming from a token stream. These may not directly correspond to strings as a single string\n    // may encode an option + its argument if the : or = form is used\n    enum class TokenType {\n        Option, Argument\n    };\n    struct Token {\n        TokenType type;\n        std::string token;\n    };\n\n    inline auto isOptPrefix( char c ) -> bool {\n        return c == '-'\n#ifdef CATCH_PLATFORM_WINDOWS\n            || c == '/'\n#endif\n        ;\n    }\n\n    // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled\n    class TokenStream {\n        using Iterator = std::vector<std::string>::const_iterator;\n        Iterator it;\n        Iterator itEnd;\n        std::vector<Token> m_tokenBuffer;\n\n        void loadBuffer() {\n            m_tokenBuffer.resize( 0 );\n\n            // Skip any empty strings\n            while( it != itEnd && it->empty() )\n                ++it;\n\n            if( it != itEnd ) {\n                auto const &next = *it;\n                if( isOptPrefix( next[0] ) ) {\n                    auto delimiterPos = next.find_first_of( \" :=\" );\n                    if( delimiterPos != std::string::npos ) {\n                        m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } );\n                        m_tokenBuffer.push_back( { TokenType::Argument, next.substr( delimiterPos + 1 ) } );\n                    } else {\n                        if( next[1] != '-' && next.size() > 2 ) {\n                            std::string opt = \"- \";\n                            for( size_t i = 1; i < next.size(); ++i ) {\n                                opt[1] = next[i];\n                                m_tokenBuffer.push_back( { TokenType::Option, opt } );\n                            }\n                        } else {\n                            m_tokenBuffer.push_back( { TokenType::Option, next } );\n                        }\n                    }\n                } else {\n                    m_tokenBuffer.push_back( { TokenType::Argument, next } );\n                }\n            }\n        }\n\n    public:\n        explicit TokenStream( Args const &args ) : TokenStream( args.m_args.begin(), args.m_args.end() ) {}\n\n        TokenStream( Iterator it, Iterator itEnd ) : it( it ), itEnd( itEnd ) {\n            loadBuffer();\n        }\n\n        explicit operator bool() const {\n            return !m_tokenBuffer.empty() || it != itEnd;\n        }\n\n        auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); }\n\n        auto operator*() const -> Token {\n            assert( !m_tokenBuffer.empty() );\n            return m_tokenBuffer.front();\n        }\n\n        auto operator->() const -> Token const * {\n            assert( !m_tokenBuffer.empty() );\n            return &m_tokenBuffer.front();\n        }\n\n        auto operator++() -> TokenStream & {\n            if( m_tokenBuffer.size() >= 2 ) {\n                m_tokenBuffer.erase( m_tokenBuffer.begin() );\n            } else {\n                if( it != itEnd )\n                    ++it;\n                loadBuffer();\n            }\n            return *this;\n        }\n    };\n\n    class ResultBase {\n    public:\n        enum Type {\n            Ok, LogicError, RuntimeError\n        };\n\n    protected:\n        ResultBase( Type type ) : m_type( type ) {}\n        virtual ~ResultBase() = default;\n\n        virtual void enforceOk() const = 0;\n\n        Type m_type;\n    };\n\n    template<typename T>\n    class ResultValueBase : public ResultBase {\n    public:\n        auto value() const -> T const & {\n            enforceOk();\n            return m_value;\n        }\n\n    protected:\n        ResultValueBase( Type type ) : ResultBase( type ) {}\n\n        ResultValueBase( ResultValueBase const &other ) : ResultBase( other ) {\n            if( m_type == ResultBase::Ok )\n                new( &m_value ) T( other.m_value );\n        }\n\n        ResultValueBase( Type, T const &value ) : ResultBase( Ok ) {\n            new( &m_value ) T( value );\n        }\n\n        auto operator=( ResultValueBase const &other ) -> ResultValueBase & {\n            if( m_type == ResultBase::Ok )\n                m_value.~T();\n            ResultBase::operator=(other);\n            if( m_type == ResultBase::Ok )\n                new( &m_value ) T( other.m_value );\n            return *this;\n        }\n\n        ~ResultValueBase() override {\n            if( m_type == Ok )\n                m_value.~T();\n        }\n\n        union {\n            T m_value;\n        };\n    };\n\n    template<>\n    class ResultValueBase<void> : public ResultBase {\n    protected:\n        using ResultBase::ResultBase;\n    };\n\n    template<typename T = void>\n    class BasicResult : public ResultValueBase<T> {\n    public:\n        template<typename U>\n        explicit BasicResult( BasicResult<U> const &other )\n        :   ResultValueBase<T>( other.type() ),\n            m_errorMessage( other.errorMessage() )\n        {\n            assert( type() != ResultBase::Ok );\n        }\n\n        template<typename U>\n        static auto ok( U const &value ) -> BasicResult { return { ResultBase::Ok, value }; }\n        static auto ok() -> BasicResult { return { ResultBase::Ok }; }\n        static auto logicError( std::string const &message ) -> BasicResult { return { ResultBase::LogicError, message }; }\n        static auto runtimeError( std::string const &message ) -> BasicResult { return { ResultBase::RuntimeError, message }; }\n\n        explicit operator bool() const { return m_type == ResultBase::Ok; }\n        auto type() const -> ResultBase::Type { return m_type; }\n        auto errorMessage() const -> std::string { return m_errorMessage; }\n\n    protected:\n        void enforceOk() const override {\n\n            // Errors shouldn't reach this point, but if they do\n            // the actual error message will be in m_errorMessage\n            assert( m_type != ResultBase::LogicError );\n            assert( m_type != ResultBase::RuntimeError );\n            if( m_type != ResultBase::Ok )\n                std::abort();\n        }\n\n        std::string m_errorMessage; // Only populated if resultType is an error\n\n        BasicResult( ResultBase::Type type, std::string const &message )\n        :   ResultValueBase<T>(type),\n            m_errorMessage(message)\n        {\n            assert( m_type != ResultBase::Ok );\n        }\n\n        using ResultValueBase<T>::ResultValueBase;\n        using ResultBase::m_type;\n    };\n\n    enum class ParseResultType {\n        Matched, NoMatch, ShortCircuitAll, ShortCircuitSame\n    };\n\n    class ParseState {\n    public:\n\n        ParseState( ParseResultType type, TokenStream const &remainingTokens )\n        : m_type(type),\n          m_remainingTokens( remainingTokens )\n        {}\n\n        auto type() const -> ParseResultType { return m_type; }\n        auto remainingTokens() const -> TokenStream { return m_remainingTokens; }\n\n    private:\n        ParseResultType m_type;\n        TokenStream m_remainingTokens;\n    };\n\n    using Result = BasicResult<void>;\n    using ParserResult = BasicResult<ParseResultType>;\n    using InternalParseResult = BasicResult<ParseState>;\n\n    struct HelpColumns {\n        std::string left;\n        std::string right;\n    };\n\n    template<typename T>\n    inline auto convertInto( std::string const &source, T& target ) -> ParserResult {\n        std::stringstream ss;\n        ss << source;\n        ss >> target;\n        if( ss.fail() )\n            return ParserResult::runtimeError( \"Unable to convert '\" + source + \"' to destination type\" );\n        else\n            return ParserResult::ok( ParseResultType::Matched );\n    }\n    inline auto convertInto( std::string const &source, std::string& target ) -> ParserResult {\n        target = source;\n        return ParserResult::ok( ParseResultType::Matched );\n    }\n    inline auto convertInto( std::string const &source, bool &target ) -> ParserResult {\n        std::string srcLC = source;\n        std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( char c ) { return static_cast<char>( std::tolower(c) ); } );\n        if (srcLC == \"y\" || srcLC == \"1\" || srcLC == \"true\" || srcLC == \"yes\" || srcLC == \"on\")\n            target = true;\n        else if (srcLC == \"n\" || srcLC == \"0\" || srcLC == \"false\" || srcLC == \"no\" || srcLC == \"off\")\n            target = false;\n        else\n            return ParserResult::runtimeError( \"Expected a boolean value but did not recognise: '\" + source + \"'\" );\n        return ParserResult::ok( ParseResultType::Matched );\n    }\n#ifdef CLARA_CONFIG_OPTIONAL_TYPE\n    template<typename T>\n    inline auto convertInto( std::string const &source, CLARA_CONFIG_OPTIONAL_TYPE<T>& target ) -> ParserResult {\n        T temp;\n        auto result = convertInto( source, temp );\n        if( result )\n            target = std::move(temp);\n        return result;\n    }\n#endif // CLARA_CONFIG_OPTIONAL_TYPE\n\n    struct NonCopyable {\n        NonCopyable() = default;\n        NonCopyable( NonCopyable const & ) = delete;\n        NonCopyable( NonCopyable && ) = delete;\n        NonCopyable &operator=( NonCopyable const & ) = delete;\n        NonCopyable &operator=( NonCopyable && ) = delete;\n    };\n\n    struct BoundRef : NonCopyable {\n        virtual ~BoundRef() = default;\n        virtual auto isContainer() const -> bool { return false; }\n        virtual auto isFlag() const -> bool { return false; }\n    };\n    struct BoundValueRefBase : BoundRef {\n        virtual auto setValue( std::string const &arg ) -> ParserResult = 0;\n    };\n    struct BoundFlagRefBase : BoundRef {\n        virtual auto setFlag( bool flag ) -> ParserResult = 0;\n        virtual auto isFlag() const -> bool { return true; }\n    };\n\n    template<typename T>\n    struct BoundValueRef : BoundValueRefBase {\n        T &m_ref;\n\n        explicit BoundValueRef( T &ref ) : m_ref( ref ) {}\n\n        auto setValue( std::string const &arg ) -> ParserResult override {\n            return convertInto( arg, m_ref );\n        }\n    };\n\n    template<typename T>\n    struct BoundValueRef<std::vector<T>> : BoundValueRefBase {\n        std::vector<T> &m_ref;\n\n        explicit BoundValueRef( std::vector<T> &ref ) : m_ref( ref ) {}\n\n        auto isContainer() const -> bool override { return true; }\n\n        auto setValue( std::string const &arg ) -> ParserResult override {\n            T temp;\n            auto result = convertInto( arg, temp );\n            if( result )\n                m_ref.push_back( temp );\n            return result;\n        }\n    };\n\n    struct BoundFlagRef : BoundFlagRefBase {\n        bool &m_ref;\n\n        explicit BoundFlagRef( bool &ref ) : m_ref( ref ) {}\n\n        auto setFlag( bool flag ) -> ParserResult override {\n            m_ref = flag;\n            return ParserResult::ok( ParseResultType::Matched );\n        }\n    };\n\n    template<typename ReturnType>\n    struct LambdaInvoker {\n        static_assert( std::is_same<ReturnType, ParserResult>::value, \"Lambda must return void or clara::ParserResult\" );\n\n        template<typename L, typename ArgType>\n        static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult {\n            return lambda( arg );\n        }\n    };\n\n    template<>\n    struct LambdaInvoker<void> {\n        template<typename L, typename ArgType>\n        static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult {\n            lambda( arg );\n            return ParserResult::ok( ParseResultType::Matched );\n        }\n    };\n\n    template<typename ArgType, typename L>\n    inline auto invokeLambda( L const &lambda, std::string const &arg ) -> ParserResult {\n        ArgType temp{};\n        auto result = convertInto( arg, temp );\n        return !result\n           ? result\n           : LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( lambda, temp );\n    }\n\n    template<typename L>\n    struct BoundLambda : BoundValueRefBase {\n        L m_lambda;\n\n        static_assert( UnaryLambdaTraits<L>::isValid, \"Supplied lambda must take exactly one argument\" );\n        explicit BoundLambda( L const &lambda ) : m_lambda( lambda ) {}\n\n        auto setValue( std::string const &arg ) -> ParserResult override {\n            return invokeLambda<typename UnaryLambdaTraits<L>::ArgType>( m_lambda, arg );\n        }\n    };\n\n    template<typename L>\n    struct BoundFlagLambda : BoundFlagRefBase {\n        L m_lambda;\n\n        static_assert( UnaryLambdaTraits<L>::isValid, \"Supplied lambda must take exactly one argument\" );\n        static_assert( std::is_same<typename UnaryLambdaTraits<L>::ArgType, bool>::value, \"flags must be boolean\" );\n\n        explicit BoundFlagLambda( L const &lambda ) : m_lambda( lambda ) {}\n\n        auto setFlag( bool flag ) -> ParserResult override {\n            return LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( m_lambda, flag );\n        }\n    };\n\n    enum class Optionality { Optional, Required };\n\n    struct Parser;\n\n    class ParserBase {\n    public:\n        virtual ~ParserBase() = default;\n        virtual auto validate() const -> Result { return Result::ok(); }\n        virtual auto parse( std::string const& exeName, TokenStream const &tokens) const -> InternalParseResult  = 0;\n        virtual auto cardinality() const -> size_t { return 1; }\n\n        auto parse( Args const &args ) const -> InternalParseResult {\n            return parse( args.exeName(), TokenStream( args ) );\n        }\n    };\n\n    template<typename DerivedT>\n    class ComposableParserImpl : public ParserBase {\n    public:\n        template<typename T>\n        auto operator|( T const &other ) const -> Parser;\n\n\t\ttemplate<typename T>\n        auto operator+( T const &other ) const -> Parser;\n    };\n\n    // Common code and state for Args and Opts\n    template<typename DerivedT>\n    class ParserRefImpl : public ComposableParserImpl<DerivedT> {\n    protected:\n        Optionality m_optionality = Optionality::Optional;\n        std::shared_ptr<BoundRef> m_ref;\n        std::string m_hint;\n        std::string m_description;\n\n        explicit ParserRefImpl( std::shared_ptr<BoundRef> const &ref ) : m_ref( ref ) {}\n\n    public:\n        template<typename T>\n        ParserRefImpl( T &ref, std::string const &hint )\n        :   m_ref( std::make_shared<BoundValueRef<T>>( ref ) ),\n            m_hint( hint )\n        {}\n\n        template<typename LambdaT>\n        ParserRefImpl( LambdaT const &ref, std::string const &hint )\n        :   m_ref( std::make_shared<BoundLambda<LambdaT>>( ref ) ),\n            m_hint(hint)\n        {}\n\n        auto operator()( std::string const &description ) -> DerivedT & {\n            m_description = description;\n            return static_cast<DerivedT &>( *this );\n        }\n\n        auto optional() -> DerivedT & {\n            m_optionality = Optionality::Optional;\n            return static_cast<DerivedT &>( *this );\n        };\n\n        auto required() -> DerivedT & {\n            m_optionality = Optionality::Required;\n            return static_cast<DerivedT &>( *this );\n        };\n\n        auto isOptional() const -> bool {\n            return m_optionality == Optionality::Optional;\n        }\n\n        auto cardinality() const -> size_t override {\n            if( m_ref->isContainer() )\n                return 0;\n            else\n                return 1;\n        }\n\n        auto hint() const -> std::string { return m_hint; }\n    };\n\n    class ExeName : public ComposableParserImpl<ExeName> {\n        std::shared_ptr<std::string> m_name;\n        std::shared_ptr<BoundValueRefBase> m_ref;\n\n        template<typename LambdaT>\n        static auto makeRef(LambdaT const &lambda) -> std::shared_ptr<BoundValueRefBase> {\n            return std::make_shared<BoundLambda<LambdaT>>( lambda) ;\n        }\n\n    public:\n        ExeName() : m_name( std::make_shared<std::string>( \"<executable>\" ) ) {}\n\n        explicit ExeName( std::string &ref ) : ExeName() {\n            m_ref = std::make_shared<BoundValueRef<std::string>>( ref );\n        }\n\n        template<typename LambdaT>\n        explicit ExeName( LambdaT const& lambda ) : ExeName() {\n            m_ref = std::make_shared<BoundLambda<LambdaT>>( lambda );\n        }\n\n        // The exe name is not parsed out of the normal tokens, but is handled specially\n        auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override {\n            return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) );\n        }\n\n        auto name() const -> std::string { return *m_name; }\n        auto set( std::string const& newName ) -> ParserResult {\n\n            auto lastSlash = newName.find_last_of( \"\\\\/\" );\n            auto filename = ( lastSlash == std::string::npos )\n                    ? newName\n                    : newName.substr( lastSlash+1 );\n\n            *m_name = filename;\n            if( m_ref )\n                return m_ref->setValue( filename );\n            else\n                return ParserResult::ok( ParseResultType::Matched );\n        }\n    };\n\n    class Arg : public ParserRefImpl<Arg> {\n    public:\n        using ParserRefImpl::ParserRefImpl;\n\n        auto parse( std::string const &, TokenStream const &tokens ) const -> InternalParseResult override {\n            auto validationResult = validate();\n            if( !validationResult )\n                return InternalParseResult( validationResult );\n\n            auto remainingTokens = tokens;\n            auto const &token = *remainingTokens;\n            if( token.type != TokenType::Argument )\n                return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) );\n\n            assert( !m_ref->isFlag() );\n            auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() );\n\n            auto result = valueRef->setValue( remainingTokens->token );\n            if( !result )\n                return InternalParseResult( result );\n            else\n                return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) );\n        }\n    };\n\n    inline auto normaliseOpt( std::string const &optName ) -> std::string {\n#ifdef CATCH_PLATFORM_WINDOWS\n        if( optName[0] == '/' )\n            return \"-\" + optName.substr( 1 );\n        else\n#endif\n            return optName;\n    }\n\n    class Opt : public ParserRefImpl<Opt> {\n    protected:\n        std::vector<std::string> m_optNames;\n\n    public:\n        template<typename LambdaT>\n        explicit Opt( LambdaT const &ref ) : ParserRefImpl( std::make_shared<BoundFlagLambda<LambdaT>>( ref ) ) {}\n\n        explicit Opt( bool &ref ) : ParserRefImpl( std::make_shared<BoundFlagRef>( ref ) ) {}\n\n        template<typename LambdaT>\n        Opt( LambdaT const &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {}\n\n        template<typename T>\n        Opt( T &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {}\n\n        auto operator[]( std::string const &optName ) -> Opt & {\n            m_optNames.push_back( optName );\n            return *this;\n        }\n\n        auto getHelpColumns() const -> std::vector<HelpColumns> {\n            std::ostringstream oss;\n            bool first = true;\n            for( auto const &opt : m_optNames ) {\n                if (first)\n                    first = false;\n                else\n                    oss << \", \";\n                oss << opt;\n            }\n            if( !m_hint.empty() )\n                oss << \" <\" << m_hint << \">\";\n            return { { oss.str(), m_description } };\n        }\n\n        auto isMatch( std::string const &optToken ) const -> bool {\n            auto normalisedToken = normaliseOpt( optToken );\n            for( auto const &name : m_optNames ) {\n                if( normaliseOpt( name ) == normalisedToken )\n                    return true;\n            }\n            return false;\n        }\n\n        using ParserBase::parse;\n\n        auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override {\n            auto validationResult = validate();\n            if( !validationResult )\n                return InternalParseResult( validationResult );\n\n            auto remainingTokens = tokens;\n            if( remainingTokens && remainingTokens->type == TokenType::Option ) {\n                auto const &token = *remainingTokens;\n                if( isMatch(token.token ) ) {\n                    if( m_ref->isFlag() ) {\n                        auto flagRef = static_cast<detail::BoundFlagRefBase*>( m_ref.get() );\n                        auto result = flagRef->setFlag( true );\n                        if( !result )\n                            return InternalParseResult( result );\n                        if( result.value() == ParseResultType::ShortCircuitAll )\n                            return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) );\n                    } else {\n                        auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() );\n                        ++remainingTokens;\n                        if( !remainingTokens )\n                            return InternalParseResult::runtimeError( \"Expected argument following \" + token.token );\n                        auto const &argToken = *remainingTokens;\n                        if( argToken.type != TokenType::Argument )\n                            return InternalParseResult::runtimeError( \"Expected argument following \" + token.token );\n                        auto result = valueRef->setValue( argToken.token );\n                        if( !result )\n                            return InternalParseResult( result );\n                        if( result.value() == ParseResultType::ShortCircuitAll )\n                            return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) );\n                    }\n                    return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) );\n                }\n            }\n            return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) );\n        }\n\n        auto validate() const -> Result override {\n            if( m_optNames.empty() )\n                return Result::logicError( \"No options supplied to Opt\" );\n            for( auto const &name : m_optNames ) {\n                if( name.empty() )\n                    return Result::logicError( \"Option name cannot be empty\" );\n#ifdef CATCH_PLATFORM_WINDOWS\n                if( name[0] != '-' && name[0] != '/' )\n                    return Result::logicError( \"Option name must begin with '-' or '/'\" );\n#else\n                if( name[0] != '-' )\n                    return Result::logicError( \"Option name must begin with '-'\" );\n#endif\n            }\n            return ParserRefImpl::validate();\n        }\n    };\n\n    struct Help : Opt {\n        Help( bool &showHelpFlag )\n        :   Opt([&]( bool flag ) {\n                showHelpFlag = flag;\n                return ParserResult::ok( ParseResultType::ShortCircuitAll );\n            })\n        {\n            static_cast<Opt &>( *this )\n                    (\"display usage information\")\n                    [\"-?\"][\"-h\"][\"--help\"]\n                    .optional();\n        }\n    };\n\n    struct Parser : ParserBase {\n\n        mutable ExeName m_exeName;\n        std::vector<Opt> m_options;\n        std::vector<Arg> m_args;\n\n        auto operator|=( ExeName const &exeName ) -> Parser & {\n            m_exeName = exeName;\n            return *this;\n        }\n\n        auto operator|=( Arg const &arg ) -> Parser & {\n            m_args.push_back(arg);\n            return *this;\n        }\n\n        auto operator|=( Opt const &opt ) -> Parser & {\n            m_options.push_back(opt);\n            return *this;\n        }\n\n        auto operator|=( Parser const &other ) -> Parser & {\n            m_options.insert(m_options.end(), other.m_options.begin(), other.m_options.end());\n            m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end());\n            return *this;\n        }\n\n        template<typename T>\n        auto operator|( T const &other ) const -> Parser {\n            return Parser( *this ) |= other;\n        }\n\n        // Forward deprecated interface with '+' instead of '|'\n        template<typename T>\n        auto operator+=( T const &other ) -> Parser & { return operator|=( other ); }\n        template<typename T>\n        auto operator+( T const &other ) const -> Parser { return operator|( other ); }\n\n        auto getHelpColumns() const -> std::vector<HelpColumns> {\n            std::vector<HelpColumns> cols;\n            for (auto const &o : m_options) {\n                auto childCols = o.getHelpColumns();\n                cols.insert( cols.end(), childCols.begin(), childCols.end() );\n            }\n            return cols;\n        }\n\n        void writeToStream( std::ostream &os ) const {\n            if (!m_exeName.name().empty()) {\n                os << \"usage:\\n\" << \"  \" << m_exeName.name() << \" \";\n                bool required = true, first = true;\n                for( auto const &arg : m_args ) {\n                    if (first)\n                        first = false;\n                    else\n                        os << \" \";\n                    if( arg.isOptional() && required ) {\n                        os << \"[\";\n                        required = false;\n                    }\n                    os << \"<\" << arg.hint() << \">\";\n                    if( arg.cardinality() == 0 )\n                        os << \" ... \";\n                }\n                if( !required )\n                    os << \"]\";\n                if( !m_options.empty() )\n                    os << \" options\";\n                os << \"\\n\\nwhere options are:\" << std::endl;\n            }\n\n            auto rows = getHelpColumns();\n            size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH;\n            size_t optWidth = 0;\n            for( auto const &cols : rows )\n                optWidth = (std::max)(optWidth, cols.left.size() + 2);\n\n            optWidth = (std::min)(optWidth, consoleWidth/2);\n\n            for( auto const &cols : rows ) {\n                auto row =\n                        TextFlow::Column( cols.left ).width( optWidth ).indent( 2 ) +\n                        TextFlow::Spacer(4) +\n                        TextFlow::Column( cols.right ).width( consoleWidth - 7 - optWidth );\n                os << row << std::endl;\n            }\n        }\n\n        friend auto operator<<( std::ostream &os, Parser const &parser ) -> std::ostream& {\n            parser.writeToStream( os );\n            return os;\n        }\n\n        auto validate() const -> Result override {\n            for( auto const &opt : m_options ) {\n                auto result = opt.validate();\n                if( !result )\n                    return result;\n            }\n            for( auto const &arg : m_args ) {\n                auto result = arg.validate();\n                if( !result )\n                    return result;\n            }\n            return Result::ok();\n        }\n\n        using ParserBase::parse;\n\n        auto parse( std::string const& exeName, TokenStream const &tokens ) const -> InternalParseResult override {\n\n            struct ParserInfo {\n                ParserBase const* parser = nullptr;\n                size_t count = 0;\n            };\n            const size_t totalParsers = m_options.size() + m_args.size();\n            assert( totalParsers < 512 );\n            // ParserInfo parseInfos[totalParsers]; // <-- this is what we really want to do\n            ParserInfo parseInfos[512];\n\n            {\n                size_t i = 0;\n                for (auto const &opt : m_options) parseInfos[i++].parser = &opt;\n                for (auto const &arg : m_args) parseInfos[i++].parser = &arg;\n            }\n\n            m_exeName.set( exeName );\n\n            auto result = InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) );\n            while( result.value().remainingTokens() ) {\n                bool tokenParsed = false;\n\n                for( size_t i = 0; i < totalParsers; ++i ) {\n                    auto&  parseInfo = parseInfos[i];\n                    if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) {\n                        result = parseInfo.parser->parse(exeName, result.value().remainingTokens());\n                        if (!result)\n                            return result;\n                        if (result.value().type() != ParseResultType::NoMatch) {\n                            tokenParsed = true;\n                            ++parseInfo.count;\n                            break;\n                        }\n                    }\n                }\n\n                if( result.value().type() == ParseResultType::ShortCircuitAll )\n                    return result;\n                if( !tokenParsed )\n                    return InternalParseResult::runtimeError( \"Unrecognised token: \" + result.value().remainingTokens()->token );\n            }\n            // !TBD Check missing required options\n            return result;\n        }\n    };\n\n    template<typename DerivedT>\n    template<typename T>\n    auto ComposableParserImpl<DerivedT>::operator|( T const &other ) const -> Parser {\n        return Parser() | static_cast<DerivedT const &>( *this ) | other;\n    }\n} // namespace detail\n\n// A Combined parser\nusing detail::Parser;\n\n// A parser for options\nusing detail::Opt;\n\n// A parser for arguments\nusing detail::Arg;\n\n// Wrapper for argc, argv from main()\nusing detail::Args;\n\n// Specifies the name of the executable\nusing detail::ExeName;\n\n// Convenience wrapper for option parser that specifies the help option\nusing detail::Help;\n\n// enum of result types from a parse\nusing detail::ParseResultType;\n\n// Result type for parser operation\nusing detail::ParserResult;\n\n}} // namespace Catch::clara\n\n// end clara.hpp\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// Restore Clara's value for console width, if present\n#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH\n#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH\n#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH\n#endif\n\n// end catch_clara.h\nnamespace Catch {\n\n    clara::Parser makeCommandLineParser( ConfigData& config );\n\n} // end namespace Catch\n\n// end catch_commandline.h\n#include <fstream>\n#include <ctime>\n\nnamespace Catch {\n\n    clara::Parser makeCommandLineParser( ConfigData& config ) {\n\n        using namespace clara;\n\n        auto const setWarning = [&]( std::string const& warning ) {\n                auto warningSet = [&]() {\n                    if( warning == \"NoAssertions\" )\n                        return WarnAbout::NoAssertions;\n\n                    if ( warning == \"NoTests\" )\n                        return WarnAbout::NoTests;\n\n                    return WarnAbout::Nothing;\n                }();\n\n                if (warningSet == WarnAbout::Nothing)\n                    return ParserResult::runtimeError( \"Unrecognised warning: '\" + warning + \"'\" );\n                config.warnings = static_cast<WarnAbout::What>( config.warnings | warningSet );\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const loadTestNamesFromFile = [&]( std::string const& filename ) {\n                std::ifstream f( filename.c_str() );\n                if( !f.is_open() )\n                    return ParserResult::runtimeError( \"Unable to load input file: '\" + filename + \"'\" );\n\n                std::string line;\n                while( std::getline( f, line ) ) {\n                    line = trim(line);\n                    if( !line.empty() && !startsWith( line, '#' ) ) {\n                        if( !startsWith( line, '\"' ) )\n                            line = '\"' + line + '\"';\n                        config.testsOrTags.push_back( line + ',' );\n                    }\n                }\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setTestOrder = [&]( std::string const& order ) {\n                if( startsWith( \"declared\", order ) )\n                    config.runOrder = RunTests::InDeclarationOrder;\n                else if( startsWith( \"lexical\", order ) )\n                    config.runOrder = RunTests::InLexicographicalOrder;\n                else if( startsWith( \"random\", order ) )\n                    config.runOrder = RunTests::InRandomOrder;\n                else\n                    return clara::ParserResult::runtimeError( \"Unrecognised ordering: '\" + order + \"'\" );\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setRngSeed = [&]( std::string const& seed ) {\n                if( seed != \"time\" )\n                    return clara::detail::convertInto( seed, config.rngSeed );\n                config.rngSeed = static_cast<unsigned int>( std::time(nullptr) );\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setColourUsage = [&]( std::string const& useColour ) {\n                    auto mode = toLower( useColour );\n\n                    if( mode == \"yes\" )\n                        config.useColour = UseColour::Yes;\n                    else if( mode == \"no\" )\n                        config.useColour = UseColour::No;\n                    else if( mode == \"auto\" )\n                        config.useColour = UseColour::Auto;\n                    else\n                        return ParserResult::runtimeError( \"colour mode must be one of: auto, yes or no. '\" + useColour + \"' not recognised\" );\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setWaitForKeypress = [&]( std::string const& keypress ) {\n                auto keypressLc = toLower( keypress );\n                if( keypressLc == \"start\" )\n                    config.waitForKeypress = WaitForKeypress::BeforeStart;\n                else if( keypressLc == \"exit\" )\n                    config.waitForKeypress = WaitForKeypress::BeforeExit;\n                else if( keypressLc == \"both\" )\n                    config.waitForKeypress = WaitForKeypress::BeforeStartAndExit;\n                else\n                    return ParserResult::runtimeError( \"keypress argument must be one of: start, exit or both. '\" + keypress + \"' not recognised\" );\n            return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setVerbosity = [&]( std::string const& verbosity ) {\n            auto lcVerbosity = toLower( verbosity );\n            if( lcVerbosity == \"quiet\" )\n                config.verbosity = Verbosity::Quiet;\n            else if( lcVerbosity == \"normal\" )\n                config.verbosity = Verbosity::Normal;\n            else if( lcVerbosity == \"high\" )\n                config.verbosity = Verbosity::High;\n            else\n                return ParserResult::runtimeError( \"Unrecognised verbosity, '\" + verbosity + \"'\" );\n            return ParserResult::ok( ParseResultType::Matched );\n        };\n        auto const setReporter = [&]( std::string const& reporter ) {\n            IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();\n\n            auto lcReporter = toLower( reporter );\n            auto result = factories.find( lcReporter );\n\n            if( factories.end() != result )\n                config.reporterName = lcReporter;\n            else\n                return ParserResult::runtimeError( \"Unrecognized reporter, '\" + reporter + \"'. Check available with --list-reporters\" );\n            return ParserResult::ok( ParseResultType::Matched );\n        };\n\n        auto cli\n            = ExeName( config.processName )\n            | Help( config.showHelp )\n            | Opt( config.listTests )\n                [\"-l\"][\"--list-tests\"]\n                ( \"list all/matching test cases\" )\n            | Opt( config.listTags )\n                [\"-t\"][\"--list-tags\"]\n                ( \"list all/matching tags\" )\n            | Opt( config.showSuccessfulTests )\n                [\"-s\"][\"--success\"]\n                ( \"include successful tests in output\" )\n            | Opt( config.shouldDebugBreak )\n                [\"-b\"][\"--break\"]\n                ( \"break into debugger on failure\" )\n            | Opt( config.noThrow )\n                [\"-e\"][\"--nothrow\"]\n                ( \"skip exception tests\" )\n            | Opt( config.showInvisibles )\n                [\"-i\"][\"--invisibles\"]\n                ( \"show invisibles (tabs, newlines)\" )\n            | Opt( config.outputFilename, \"filename\" )\n                [\"-o\"][\"--out\"]\n                ( \"output filename\" )\n            | Opt( setReporter, \"name\" )\n                [\"-r\"][\"--reporter\"]\n                ( \"reporter to use (defaults to console)\" )\n            | Opt( config.name, \"name\" )\n                [\"-n\"][\"--name\"]\n                ( \"suite name\" )\n            | Opt( [&]( bool ){ config.abortAfter = 1; } )\n                [\"-a\"][\"--abort\"]\n                ( \"abort at first failure\" )\n            | Opt( [&]( int x ){ config.abortAfter = x; }, \"no. failures\" )\n                [\"-x\"][\"--abortx\"]\n                ( \"abort after x failures\" )\n            | Opt( setWarning, \"warning name\" )\n                [\"-w\"][\"--warn\"]\n                ( \"enable warnings\" )\n            | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, \"yes|no\" )\n                [\"-d\"][\"--durations\"]\n                ( \"show test durations\" )\n            | Opt( loadTestNamesFromFile, \"filename\" )\n                [\"-f\"][\"--input-file\"]\n                ( \"load test names to run from a file\" )\n            | Opt( config.filenamesAsTags )\n                [\"-#\"][\"--filenames-as-tags\"]\n                ( \"adds a tag for the filename\" )\n            | Opt( config.sectionsToRun, \"section name\" )\n                [\"-c\"][\"--section\"]\n                ( \"specify section to run\" )\n            | Opt( setVerbosity, \"quiet|normal|high\" )\n                [\"-v\"][\"--verbosity\"]\n                ( \"set output verbosity\" )\n            | Opt( config.listTestNamesOnly )\n                [\"--list-test-names-only\"]\n                ( \"list all/matching test cases names only\" )\n            | Opt( config.listReporters )\n                [\"--list-reporters\"]\n                ( \"list all reporters\" )\n            | Opt( setTestOrder, \"decl|lex|rand\" )\n                [\"--order\"]\n                ( \"test case order (defaults to decl)\" )\n            | Opt( setRngSeed, \"'time'|number\" )\n                [\"--rng-seed\"]\n                ( \"set a specific seed for random numbers\" )\n            | Opt( setColourUsage, \"yes|no\" )\n                [\"--use-colour\"]\n                ( \"should output be colourised\" )\n            | Opt( config.libIdentify )\n                [\"--libidentify\"]\n                ( \"report name and version according to libidentify standard\" )\n            | Opt( setWaitForKeypress, \"start|exit|both\" )\n                [\"--wait-for-keypress\"]\n                ( \"waits for a keypress before exiting\" )\n            | Opt( config.benchmarkSamples, \"samples\" )\n                [\"--benchmark-samples\"]\n                ( \"number of samples to collect (default: 100)\" )\n            | Opt( config.benchmarkResamples, \"resamples\" )\n                [\"--benchmark-resamples\"]\n                ( \"number of resamples for the bootstrap (default: 100000)\" )\n            | Opt( config.benchmarkConfidenceInterval, \"confidence interval\" )\n                [\"--benchmark-confidence-interval\"]\n                ( \"confidence interval for the bootstrap (between 0 and 1, default: 0.95)\" )\n            | Opt( config.benchmarkNoAnalysis )\n                [\"--benchmark-no-analysis\"]\n                ( \"perform only measurements; do not perform any analysis\" )\n\t\t\t| Arg( config.testsOrTags, \"test name|pattern|tags\" )\n                ( \"which test or tests to use\" );\n\n        return cli;\n    }\n\n} // end namespace Catch\n// end catch_commandline.cpp\n// start catch_common.cpp\n\n#include <cstring>\n#include <ostream>\n\nnamespace Catch {\n\n    bool SourceLineInfo::empty() const noexcept {\n        return file[0] == '\\0';\n    }\n    bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const noexcept {\n        return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0);\n    }\n    bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const noexcept {\n        // We can assume that the same file will usually have the same pointer.\n        // Thus, if the pointers are the same, there is no point in calling the strcmp\n        return line < other.line || ( line == other.line && file != other.file && (std::strcmp(file, other.file) < 0));\n    }\n\n    std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) {\n#ifndef __GNUG__\n        os << info.file << '(' << info.line << ')';\n#else\n        os << info.file << ':' << info.line;\n#endif\n        return os;\n    }\n\n    std::string StreamEndStop::operator+() const {\n        return std::string();\n    }\n\n    NonCopyable::NonCopyable() = default;\n    NonCopyable::~NonCopyable() = default;\n\n}\n// end catch_common.cpp\n// start catch_config.cpp\n\nnamespace Catch {\n\n    Config::Config( ConfigData const& data )\n    :   m_data( data ),\n        m_stream( openStream() )\n    {\n        TestSpecParser parser(ITagAliasRegistry::get());\n        if (!data.testsOrTags.empty()) {\n            m_hasTestFilters = true;\n            for( auto const& testOrTags : data.testsOrTags )\n                parser.parse( testOrTags );\n        }\n        m_testSpec = parser.testSpec();\n    }\n\n    std::string const& Config::getFilename() const {\n        return m_data.outputFilename ;\n    }\n\n    bool Config::listTests() const          { return m_data.listTests; }\n    bool Config::listTestNamesOnly() const  { return m_data.listTestNamesOnly; }\n    bool Config::listTags() const           { return m_data.listTags; }\n    bool Config::listReporters() const      { return m_data.listReporters; }\n\n    std::string Config::getProcessName() const { return m_data.processName; }\n    std::string const& Config::getReporterName() const { return m_data.reporterName; }\n\n    std::vector<std::string> const& Config::getTestsOrTags() const { return m_data.testsOrTags; }\n    std::vector<std::string> const& Config::getSectionsToRun() const { return m_data.sectionsToRun; }\n\n    TestSpec const& Config::testSpec() const { return m_testSpec; }\n    bool Config::hasTestFilters() const { return m_hasTestFilters; }\n\n    bool Config::showHelp() const { return m_data.showHelp; }\n\n    // IConfig interface\n    bool Config::allowThrows() const                   { return !m_data.noThrow; }\n    std::ostream& Config::stream() const               { return m_stream->stream(); }\n    std::string Config::name() const                   { return m_data.name.empty() ? m_data.processName : m_data.name; }\n    bool Config::includeSuccessfulResults() const      { return m_data.showSuccessfulTests; }\n    bool Config::warnAboutMissingAssertions() const    { return !!(m_data.warnings & WarnAbout::NoAssertions); }\n    bool Config::warnAboutNoTests() const              { return !!(m_data.warnings & WarnAbout::NoTests); }\n    ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; }\n    RunTests::InWhatOrder Config::runOrder() const     { return m_data.runOrder; }\n    unsigned int Config::rngSeed() const               { return m_data.rngSeed; }\n    UseColour::YesOrNo Config::useColour() const       { return m_data.useColour; }\n    bool Config::shouldDebugBreak() const              { return m_data.shouldDebugBreak; }\n    int Config::abortAfter() const                     { return m_data.abortAfter; }\n    bool Config::showInvisibles() const                { return m_data.showInvisibles; }\n    Verbosity Config::verbosity() const                { return m_data.verbosity; }\n\n    bool Config::benchmarkNoAnalysis() const           { return m_data.benchmarkNoAnalysis; }\n    int Config::benchmarkSamples() const               { return m_data.benchmarkSamples; }\n    double Config::benchmarkConfidenceInterval() const { return m_data.benchmarkConfidenceInterval; }\n    unsigned int Config::benchmarkResamples() const    { return m_data.benchmarkResamples; }\n\n    IStream const* Config::openStream() {\n        return Catch::makeStream(m_data.outputFilename);\n    }\n\n} // end namespace Catch\n// end catch_config.cpp\n// start catch_console_colour.cpp\n\n#if defined(__clang__)\n#    pragma clang diagnostic push\n#    pragma clang diagnostic ignored \"-Wexit-time-destructors\"\n#endif\n\n// start catch_errno_guard.h\n\nnamespace Catch {\n\n    class ErrnoGuard {\n    public:\n        ErrnoGuard();\n        ~ErrnoGuard();\n    private:\n        int m_oldErrno;\n    };\n\n}\n\n// end catch_errno_guard.h\n#include <sstream>\n\nnamespace Catch {\n    namespace {\n\n        struct IColourImpl {\n            virtual ~IColourImpl() = default;\n            virtual void use( Colour::Code _colourCode ) = 0;\n        };\n\n        struct NoColourImpl : IColourImpl {\n            void use( Colour::Code ) {}\n\n            static IColourImpl* instance() {\n                static NoColourImpl s_instance;\n                return &s_instance;\n            }\n        };\n\n    } // anon namespace\n} // namespace Catch\n\n#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI )\n#   ifdef CATCH_PLATFORM_WINDOWS\n#       define CATCH_CONFIG_COLOUR_WINDOWS\n#   else\n#       define CATCH_CONFIG_COLOUR_ANSI\n#   endif\n#endif\n\n#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) /////////////////////////////////////////\n\nnamespace Catch {\nnamespace {\n\n    class Win32ColourImpl : public IColourImpl {\n    public:\n        Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) )\n        {\n            CONSOLE_SCREEN_BUFFER_INFO csbiInfo;\n            GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo );\n            originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY );\n            originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );\n        }\n\n        void use( Colour::Code _colourCode ) override {\n            switch( _colourCode ) {\n                case Colour::None:      return setTextAttribute( originalForegroundAttributes );\n                case Colour::White:     return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );\n                case Colour::Red:       return setTextAttribute( FOREGROUND_RED );\n                case Colour::Green:     return setTextAttribute( FOREGROUND_GREEN );\n                case Colour::Blue:      return setTextAttribute( FOREGROUND_BLUE );\n                case Colour::Cyan:      return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN );\n                case Colour::Yellow:    return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN );\n                case Colour::Grey:      return setTextAttribute( 0 );\n\n                case Colour::LightGrey:     return setTextAttribute( FOREGROUND_INTENSITY );\n                case Colour::BrightRed:     return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED );\n                case Colour::BrightGreen:   return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN );\n                case Colour::BrightWhite:   return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );\n                case Colour::BrightYellow:  return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN );\n\n                case Colour::Bright: CATCH_INTERNAL_ERROR( \"not a colour\" );\n\n                default:\n                    CATCH_ERROR( \"Unknown colour requested\" );\n            }\n        }\n\n    private:\n        void setTextAttribute( WORD _textAttribute ) {\n            SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes );\n        }\n        HANDLE stdoutHandle;\n        WORD originalForegroundAttributes;\n        WORD originalBackgroundAttributes;\n    };\n\n    IColourImpl* platformColourInstance() {\n        static Win32ColourImpl s_instance;\n\n        IConfigPtr config = getCurrentContext().getConfig();\n        UseColour::YesOrNo colourMode = config\n            ? config->useColour()\n            : UseColour::Auto;\n        if( colourMode == UseColour::Auto )\n            colourMode = UseColour::Yes;\n        return colourMode == UseColour::Yes\n            ? &s_instance\n            : NoColourImpl::instance();\n    }\n\n} // end anon namespace\n} // end namespace Catch\n\n#elif defined( CATCH_CONFIG_COLOUR_ANSI ) //////////////////////////////////////\n\n#include <unistd.h>\n\nnamespace Catch {\nnamespace {\n\n    // use POSIX/ ANSI console terminal codes\n    // Thanks to Adam Strzelecki for original contribution\n    // (http://github.com/nanoant)\n    // https://github.com/philsquared/Catch/pull/131\n    class PosixColourImpl : public IColourImpl {\n    public:\n        void use( Colour::Code _colourCode ) override {\n            switch( _colourCode ) {\n                case Colour::None:\n                case Colour::White:     return setColour( \"[0m\" );\n                case Colour::Red:       return setColour( \"[0;31m\" );\n                case Colour::Green:     return setColour( \"[0;32m\" );\n                case Colour::Blue:      return setColour( \"[0;34m\" );\n                case Colour::Cyan:      return setColour( \"[0;36m\" );\n                case Colour::Yellow:    return setColour( \"[0;33m\" );\n                case Colour::Grey:      return setColour( \"[1;30m\" );\n\n                case Colour::LightGrey:     return setColour( \"[0;37m\" );\n                case Colour::BrightRed:     return setColour( \"[1;31m\" );\n                case Colour::BrightGreen:   return setColour( \"[1;32m\" );\n                case Colour::BrightWhite:   return setColour( \"[1;37m\" );\n                case Colour::BrightYellow:  return setColour( \"[1;33m\" );\n\n                case Colour::Bright: CATCH_INTERNAL_ERROR( \"not a colour\" );\n                default: CATCH_INTERNAL_ERROR( \"Unknown colour requested\" );\n            }\n        }\n        static IColourImpl* instance() {\n            static PosixColourImpl s_instance;\n            return &s_instance;\n        }\n\n    private:\n        void setColour( const char* _escapeCode ) {\n            getCurrentContext().getConfig()->stream()\n                << '\\033' << _escapeCode;\n        }\n    };\n\n    bool useColourOnPlatform() {\n        return\n#ifdef CATCH_PLATFORM_MAC\n            !isDebuggerActive() &&\n#endif\n#if !(defined(__DJGPP__) && defined(__STRICT_ANSI__))\n            isatty(STDOUT_FILENO)\n#else\n            false\n#endif\n            ;\n    }\n    IColourImpl* platformColourInstance() {\n        ErrnoGuard guard;\n        IConfigPtr config = getCurrentContext().getConfig();\n        UseColour::YesOrNo colourMode = config\n            ? config->useColour()\n            : UseColour::Auto;\n        if( colourMode == UseColour::Auto )\n            colourMode = useColourOnPlatform()\n                ? UseColour::Yes\n                : UseColour::No;\n        return colourMode == UseColour::Yes\n            ? PosixColourImpl::instance()\n            : NoColourImpl::instance();\n    }\n\n} // end anon namespace\n} // end namespace Catch\n\n#else  // not Windows or ANSI ///////////////////////////////////////////////\n\nnamespace Catch {\n\n    static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }\n\n} // end namespace Catch\n\n#endif // Windows/ ANSI/ None\n\nnamespace Catch {\n\n    Colour::Colour( Code _colourCode ) { use( _colourCode ); }\n    Colour::Colour( Colour&& rhs ) noexcept {\n        m_moved = rhs.m_moved;\n        rhs.m_moved = true;\n    }\n    Colour& Colour::operator=( Colour&& rhs ) noexcept {\n        m_moved = rhs.m_moved;\n        rhs.m_moved  = true;\n        return *this;\n    }\n\n    Colour::~Colour(){ if( !m_moved ) use( None ); }\n\n    void Colour::use( Code _colourCode ) {\n        static IColourImpl* impl = platformColourInstance();\n        // Strictly speaking, this cannot possibly happen.\n        // However, under some conditions it does happen (see #1626),\n        // and this change is small enough that we can let practicality\n        // triumph over purity in this case.\n        if (impl != NULL) {\n            impl->use( _colourCode );\n        }\n    }\n\n    std::ostream& operator << ( std::ostream& os, Colour const& ) {\n        return os;\n    }\n\n} // end namespace Catch\n\n#if defined(__clang__)\n#    pragma clang diagnostic pop\n#endif\n\n// end catch_console_colour.cpp\n// start catch_context.cpp\n\nnamespace Catch {\n\n    class Context : public IMutableContext, NonCopyable {\n\n    public: // IContext\n        IResultCapture* getResultCapture() override {\n            return m_resultCapture;\n        }\n        IRunner* getRunner() override {\n            return m_runner;\n        }\n\n        IConfigPtr const& getConfig() const override {\n            return m_config;\n        }\n\n        ~Context() override;\n\n    public: // IMutableContext\n        void setResultCapture( IResultCapture* resultCapture ) override {\n            m_resultCapture = resultCapture;\n        }\n        void setRunner( IRunner* runner ) override {\n            m_runner = runner;\n        }\n        void setConfig( IConfigPtr const& config ) override {\n            m_config = config;\n        }\n\n        friend IMutableContext& getCurrentMutableContext();\n\n    private:\n        IConfigPtr m_config;\n        IRunner* m_runner = nullptr;\n        IResultCapture* m_resultCapture = nullptr;\n    };\n\n    IMutableContext *IMutableContext::currentContext = nullptr;\n\n    void IMutableContext::createContext()\n    {\n        currentContext = new Context();\n    }\n\n    void cleanUpContext() {\n        delete IMutableContext::currentContext;\n        IMutableContext::currentContext = nullptr;\n    }\n    IContext::~IContext() = default;\n    IMutableContext::~IMutableContext() = default;\n    Context::~Context() = default;\n}\n// end catch_context.cpp\n// start catch_debug_console.cpp\n\n// start catch_debug_console.h\n\n#include <string>\n\nnamespace Catch {\n    void writeToDebugConsole( std::string const& text );\n}\n\n// end catch_debug_console.h\n#ifdef CATCH_PLATFORM_WINDOWS\n\n    namespace Catch {\n        void writeToDebugConsole( std::string const& text ) {\n            ::OutputDebugStringA( text.c_str() );\n        }\n    }\n\n#else\n\n    namespace Catch {\n        void writeToDebugConsole( std::string const& text ) {\n            // !TBD: Need a version for Mac/ XCode and other IDEs\n            Catch::cout() << text;\n        }\n    }\n\n#endif // Platform\n// end catch_debug_console.cpp\n// start catch_debugger.cpp\n\n#ifdef CATCH_PLATFORM_MAC\n\n#  include <assert.h>\n#  include <stdbool.h>\n#  include <sys/types.h>\n#  include <unistd.h>\n#  include <cstddef>\n#  include <ostream>\n\n#ifdef __apple_build_version__\n    // These headers will only compile with AppleClang (XCode)\n    // For other compilers (Clang, GCC, ... ) we need to exclude them\n#  include <sys/sysctl.h>\n#endif\n\n    namespace Catch {\n        #ifdef __apple_build_version__\n        // The following function is taken directly from the following technical note:\n        // https://developer.apple.com/library/archive/qa/qa1361/_index.html\n\n        // Returns true if the current process is being debugged (either\n        // running under the debugger or has a debugger attached post facto).\n        bool isDebuggerActive(){\n            int                 mib[4];\n            struct kinfo_proc   info;\n            std::size_t         size;\n\n            // Initialize the flags so that, if sysctl fails for some bizarre\n            // reason, we get a predictable result.\n\n            info.kp_proc.p_flag = 0;\n\n            // Initialize mib, which tells sysctl the info we want, in this case\n            // we're looking for information about a specific process ID.\n\n            mib[0] = CTL_KERN;\n            mib[1] = KERN_PROC;\n            mib[2] = KERN_PROC_PID;\n            mib[3] = getpid();\n\n            // Call sysctl.\n\n            size = sizeof(info);\n            if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0) != 0 ) {\n                Catch::cerr() << \"\\n** Call to sysctl failed - unable to determine if debugger is active **\\n\" << std::endl;\n                return false;\n            }\n\n            // We're being debugged if the P_TRACED flag is set.\n\n            return ( (info.kp_proc.p_flag & P_TRACED) != 0 );\n        }\n        #else\n        bool isDebuggerActive() {\n            // We need to find another way to determine this for non-appleclang compilers on macOS\n            return false;\n        }\n        #endif\n    } // namespace Catch\n\n#elif defined(CATCH_PLATFORM_LINUX)\n    #include <fstream>\n    #include <string>\n\n    namespace Catch{\n        // The standard POSIX way of detecting a debugger is to attempt to\n        // ptrace() the process, but this needs to be done from a child and not\n        // this process itself to still allow attaching to this process later\n        // if wanted, so is rather heavy. Under Linux we have the PID of the\n        // \"debugger\" (which doesn't need to be gdb, of course, it could also\n        // be strace, for example) in /proc/$PID/status, so just get it from\n        // there instead.\n        bool isDebuggerActive(){\n            // Libstdc++ has a bug, where std::ifstream sets errno to 0\n            // This way our users can properly assert over errno values\n            ErrnoGuard guard;\n            std::ifstream in(\"/proc/self/status\");\n            for( std::string line; std::getline(in, line); ) {\n                static const int PREFIX_LEN = 11;\n                if( line.compare(0, PREFIX_LEN, \"TracerPid:\\t\") == 0 ) {\n                    // We're traced if the PID is not 0 and no other PID starts\n                    // with 0 digit, so it's enough to check for just a single\n                    // character.\n                    return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';\n                }\n            }\n\n            return false;\n        }\n    } // namespace Catch\n#elif defined(_MSC_VER)\n    extern \"C\" __declspec(dllimport) int __stdcall IsDebuggerPresent();\n    namespace Catch {\n        bool isDebuggerActive() {\n            return IsDebuggerPresent() != 0;\n        }\n    }\n#elif defined(__MINGW32__)\n    extern \"C\" __declspec(dllimport) int __stdcall IsDebuggerPresent();\n    namespace Catch {\n        bool isDebuggerActive() {\n            return IsDebuggerPresent() != 0;\n        }\n    }\n#else\n    namespace Catch {\n       bool isDebuggerActive() { return false; }\n    }\n#endif // Platform\n// end catch_debugger.cpp\n// start catch_decomposer.cpp\n\nnamespace Catch {\n\n    ITransientExpression::~ITransientExpression() = default;\n\n    void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ) {\n        if( lhs.size() + rhs.size() < 40 &&\n                lhs.find('\\n') == std::string::npos &&\n                rhs.find('\\n') == std::string::npos )\n            os << lhs << \" \" << op << \" \" << rhs;\n        else\n            os << lhs << \"\\n\" << op << \"\\n\" << rhs;\n    }\n}\n// end catch_decomposer.cpp\n// start catch_enforce.cpp\n\n#include <stdexcept>\n\nnamespace Catch {\n#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER)\n    [[noreturn]]\n    void throw_exception(std::exception const& e) {\n        Catch::cerr() << \"Catch will terminate because it needed to throw an exception.\\n\"\n                      << \"The message was: \" << e.what() << '\\n';\n        std::terminate();\n    }\n#endif\n\n    [[noreturn]]\n    void throw_logic_error(std::string const& msg) {\n        throw_exception(std::logic_error(msg));\n    }\n\n    [[noreturn]]\n    void throw_domain_error(std::string const& msg) {\n        throw_exception(std::domain_error(msg));\n    }\n\n    [[noreturn]]\n    void throw_runtime_error(std::string const& msg) {\n        throw_exception(std::runtime_error(msg));\n    }\n\n} // namespace Catch;\n// end catch_enforce.cpp\n// start catch_enum_values_registry.cpp\n// start catch_enum_values_registry.h\n\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    namespace Detail {\n\n        std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values );\n\n        class EnumValuesRegistry : public IMutableEnumValuesRegistry {\n\n            std::vector<std::unique_ptr<EnumInfo>> m_enumInfos;\n\n            EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values) override;\n        };\n\n        std::vector<std::string> parseEnums( StringRef enums );\n\n    } // Detail\n\n} // Catch\n\n// end catch_enum_values_registry.h\n\n#include <map>\n#include <cassert>\n\nnamespace Catch {\n\n    IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {}\n\n    namespace Detail {\n\n        std::vector<std::string> parseEnums( StringRef enums ) {\n            auto enumValues = splitStringRef( enums, ',' );\n            std::vector<std::string> parsed;\n            parsed.reserve( enumValues.size() );\n            for( auto const& enumValue : enumValues ) {\n                auto identifiers = splitStringRef( enumValue, ':' );\n                parsed.push_back( Catch::trim( identifiers.back() ) );\n            }\n            return parsed;\n        }\n\n        EnumInfo::~EnumInfo() {}\n\n        StringRef EnumInfo::lookup( int value ) const {\n            for( auto const& valueToName : m_values ) {\n                if( valueToName.first == value )\n                    return valueToName.second;\n            }\n            return \"{** unexpected enum value **}\";\n        }\n\n        std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {\n            std::unique_ptr<EnumInfo> enumInfo( new EnumInfo );\n            enumInfo->m_name = enumName;\n            enumInfo->m_values.reserve( values.size() );\n\n            const auto valueNames = Catch::Detail::parseEnums( allValueNames );\n            assert( valueNames.size() == values.size() );\n            std::size_t i = 0;\n            for( auto value : values )\n                enumInfo->m_values.push_back({ value, valueNames[i++] });\n\n            return enumInfo;\n        }\n\n        EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {\n            auto enumInfo = makeEnumInfo( enumName, allValueNames, values );\n            EnumInfo* raw = enumInfo.get();\n            m_enumInfos.push_back( std::move( enumInfo ) );\n            return *raw;\n        }\n\n    } // Detail\n} // Catch\n\n// end catch_enum_values_registry.cpp\n// start catch_errno_guard.cpp\n\n#include <cerrno>\n\nnamespace Catch {\n        ErrnoGuard::ErrnoGuard():m_oldErrno(errno){}\n        ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; }\n}\n// end catch_errno_guard.cpp\n// start catch_exception_translator_registry.cpp\n\n// start catch_exception_translator_registry.h\n\n#include <vector>\n#include <string>\n#include <memory>\n\nnamespace Catch {\n\n    class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {\n    public:\n        ~ExceptionTranslatorRegistry();\n        virtual void registerTranslator( const IExceptionTranslator* translator );\n        std::string translateActiveException() const override;\n        std::string tryTranslators() const;\n\n    private:\n        std::vector<std::unique_ptr<IExceptionTranslator const>> m_translators;\n    };\n}\n\n// end catch_exception_translator_registry.h\n#ifdef __OBJC__\n#import \"Foundation/Foundation.h\"\n#endif\n\nnamespace Catch {\n\n    ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() {\n    }\n\n    void ExceptionTranslatorRegistry::registerTranslator( const IExceptionTranslator* translator ) {\n        m_translators.push_back( std::unique_ptr<const IExceptionTranslator>( translator ) );\n    }\n\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n    std::string ExceptionTranslatorRegistry::translateActiveException() const {\n        try {\n#ifdef __OBJC__\n            // In Objective-C try objective-c exceptions first\n            @try {\n                return tryTranslators();\n            }\n            @catch (NSException *exception) {\n                return Catch::Detail::stringify( [exception description] );\n            }\n#else\n            // Compiling a mixed mode project with MSVC means that CLR\n            // exceptions will be caught in (...) as well. However, these\n            // do not fill-in std::current_exception and thus lead to crash\n            // when attempting rethrow.\n            // /EHa switch also causes structured exceptions to be caught\n            // here, but they fill-in current_exception properly, so\n            // at worst the output should be a little weird, instead of\n            // causing a crash.\n            if (std::current_exception() == nullptr) {\n                return \"Non C++ exception. Possibly a CLR exception.\";\n            }\n            return tryTranslators();\n#endif\n        }\n        catch( TestFailureException& ) {\n            std::rethrow_exception(std::current_exception());\n        }\n        catch( std::exception& ex ) {\n            return ex.what();\n        }\n        catch( std::string& msg ) {\n            return msg;\n        }\n        catch( const char* msg ) {\n            return msg;\n        }\n        catch(...) {\n            return \"Unknown exception\";\n        }\n    }\n\n    std::string ExceptionTranslatorRegistry::tryTranslators() const {\n        if (m_translators.empty()) {\n            std::rethrow_exception(std::current_exception());\n        } else {\n            return m_translators[0]->translate(m_translators.begin() + 1, m_translators.end());\n        }\n    }\n\n#else // ^^ Exceptions are enabled // Exceptions are disabled vv\n    std::string ExceptionTranslatorRegistry::translateActiveException() const {\n        CATCH_INTERNAL_ERROR(\"Attempted to translate active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!\");\n    }\n\n    std::string ExceptionTranslatorRegistry::tryTranslators() const {\n        CATCH_INTERNAL_ERROR(\"Attempted to use exception translators under CATCH_CONFIG_DISABLE_EXCEPTIONS!\");\n    }\n#endif\n\n}\n// end catch_exception_translator_registry.cpp\n// start catch_fatal_condition.cpp\n\n#if defined(__GNUC__)\n#    pragma GCC diagnostic push\n#    pragma GCC diagnostic ignored \"-Wmissing-field-initializers\"\n#endif\n\n#if defined( CATCH_CONFIG_WINDOWS_SEH ) || defined( CATCH_CONFIG_POSIX_SIGNALS )\n\nnamespace {\n    // Report the error condition\n    void reportFatal( char const * const message ) {\n        Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition( message );\n    }\n}\n\n#endif // signals/SEH handling\n\n#if defined( CATCH_CONFIG_WINDOWS_SEH )\n\nnamespace Catch {\n    struct SignalDefs { DWORD id; const char* name; };\n\n    // There is no 1-1 mapping between signals and windows exceptions.\n    // Windows can easily distinguish between SO and SigSegV,\n    // but SigInt, SigTerm, etc are handled differently.\n    static SignalDefs signalDefs[] = {\n        { static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION),  \"SIGILL - Illegal instruction signal\" },\n        { static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), \"SIGSEGV - Stack overflow\" },\n        { static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), \"SIGSEGV - Segmentation violation signal\" },\n        { static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), \"Divide by zero error\" },\n    };\n\n    LONG CALLBACK FatalConditionHandler::handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {\n        for (auto const& def : signalDefs) {\n            if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) {\n                reportFatal(def.name);\n            }\n        }\n        // If its not an exception we care about, pass it along.\n        // This stops us from eating debugger breaks etc.\n        return EXCEPTION_CONTINUE_SEARCH;\n    }\n\n    FatalConditionHandler::FatalConditionHandler() {\n        isSet = true;\n        // 32k seems enough for Catch to handle stack overflow,\n        // but the value was found experimentally, so there is no strong guarantee\n        guaranteeSize = 32 * 1024;\n        exceptionHandlerHandle = nullptr;\n        // Register as first handler in current chain\n        exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException);\n        // Pass in guarantee size to be filled\n        SetThreadStackGuarantee(&guaranteeSize);\n    }\n\n    void FatalConditionHandler::reset() {\n        if (isSet) {\n            RemoveVectoredExceptionHandler(exceptionHandlerHandle);\n            SetThreadStackGuarantee(&guaranteeSize);\n            exceptionHandlerHandle = nullptr;\n            isSet = false;\n        }\n    }\n\n    FatalConditionHandler::~FatalConditionHandler() {\n        reset();\n    }\n\nbool FatalConditionHandler::isSet = false;\nULONG FatalConditionHandler::guaranteeSize = 0;\nPVOID FatalConditionHandler::exceptionHandlerHandle = nullptr;\n\n} // namespace Catch\n\n#elif defined( CATCH_CONFIG_POSIX_SIGNALS )\n\nnamespace Catch {\n\n    struct SignalDefs {\n        int id;\n        const char* name;\n    };\n\n    // 32kb for the alternate stack seems to be sufficient. However, this value\n    // is experimentally determined, so that's not guaranteed.\n    constexpr static std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ;\n\n    static SignalDefs signalDefs[] = {\n        { SIGINT,  \"SIGINT - Terminal interrupt signal\" },\n        { SIGILL,  \"SIGILL - Illegal instruction signal\" },\n        { SIGFPE,  \"SIGFPE - Floating point error signal\" },\n        { SIGSEGV, \"SIGSEGV - Segmentation violation signal\" },\n        { SIGTERM, \"SIGTERM - Termination request signal\" },\n        { SIGABRT, \"SIGABRT - Abort (abnormal termination) signal\" }\n    };\n\n    void FatalConditionHandler::handleSignal( int sig ) {\n        char const * name = \"<unknown signal>\";\n        for (auto const& def : signalDefs) {\n            if (sig == def.id) {\n                name = def.name;\n                break;\n            }\n        }\n        reset();\n        reportFatal(name);\n        raise( sig );\n    }\n\n    FatalConditionHandler::FatalConditionHandler() {\n        isSet = true;\n        stack_t sigStack;\n        sigStack.ss_sp = altStackMem;\n        sigStack.ss_size = sigStackSize;\n        sigStack.ss_flags = 0;\n        sigaltstack(&sigStack, &oldSigStack);\n        struct sigaction sa = { };\n\n        sa.sa_handler = handleSignal;\n        sa.sa_flags = SA_ONSTACK;\n        for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) {\n            sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);\n        }\n    }\n\n    FatalConditionHandler::~FatalConditionHandler() {\n        reset();\n    }\n\n    void FatalConditionHandler::reset() {\n        if( isSet ) {\n            // Set signals back to previous values -- hopefully nobody overwrote them in the meantime\n            for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) {\n                sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);\n            }\n            // Return the old stack\n            sigaltstack(&oldSigStack, nullptr);\n            isSet = false;\n        }\n    }\n\n    bool FatalConditionHandler::isSet = false;\n    struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {};\n    stack_t FatalConditionHandler::oldSigStack = {};\n    char FatalConditionHandler::altStackMem[sigStackSize] = {};\n\n} // namespace Catch\n\n#else\n\nnamespace Catch {\n    void FatalConditionHandler::reset() {}\n}\n\n#endif // signals/SEH handling\n\n#if defined(__GNUC__)\n#    pragma GCC diagnostic pop\n#endif\n// end catch_fatal_condition.cpp\n// start catch_generators.cpp\n\n// start catch_random_number_generator.h\n\n#include <algorithm>\n#include <random>\n\nnamespace Catch {\n\n    struct IConfig;\n\n    std::mt19937& rng();\n    void seedRng( IConfig const& config );\n    unsigned int rngSeed();\n\n}\n\n// end catch_random_number_generator.h\n#include <limits>\n#include <set>\n\nnamespace Catch {\n\nIGeneratorTracker::~IGeneratorTracker() {}\n\nconst char* GeneratorException::what() const noexcept {\n    return m_msg;\n}\n\nnamespace Generators {\n\n    GeneratorUntypedBase::~GeneratorUntypedBase() {}\n\n    auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {\n        return getResultCapture().acquireGeneratorTracker( lineInfo );\n    }\n\n} // namespace Generators\n} // namespace Catch\n// end catch_generators.cpp\n// start catch_interfaces_capture.cpp\n\nnamespace Catch {\n    IResultCapture::~IResultCapture() = default;\n}\n// end catch_interfaces_capture.cpp\n// start catch_interfaces_config.cpp\n\nnamespace Catch {\n    IConfig::~IConfig() = default;\n}\n// end catch_interfaces_config.cpp\n// start catch_interfaces_exception.cpp\n\nnamespace Catch {\n    IExceptionTranslator::~IExceptionTranslator() = default;\n    IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default;\n}\n// end catch_interfaces_exception.cpp\n// start catch_interfaces_registry_hub.cpp\n\nnamespace Catch {\n    IRegistryHub::~IRegistryHub() = default;\n    IMutableRegistryHub::~IMutableRegistryHub() = default;\n}\n// end catch_interfaces_registry_hub.cpp\n// start catch_interfaces_reporter.cpp\n\n// start catch_reporter_listening.h\n\nnamespace Catch {\n\n    class ListeningReporter : public IStreamingReporter {\n        using Reporters = std::vector<IStreamingReporterPtr>;\n        Reporters m_listeners;\n        IStreamingReporterPtr m_reporter = nullptr;\n        ReporterPreferences m_preferences;\n\n    public:\n        ListeningReporter();\n\n        void addListener( IStreamingReporterPtr&& listener );\n        void addReporter( IStreamingReporterPtr&& reporter );\n\n    public: // IStreamingReporter\n\n        ReporterPreferences getPreferences() const override;\n\n        void noMatchingTestCases( std::string const& spec ) override;\n\n        static std::set<Verbosity> getSupportedVerbosities();\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        void benchmarkPreparing(std::string const& name) override;\n        void benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) override;\n        void benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) override;\n        void benchmarkFailed(std::string const&) override;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        void testRunStarting( TestRunInfo const& testRunInfo ) override;\n        void testGroupStarting( GroupInfo const& groupInfo ) override;\n        void testCaseStarting( TestCaseInfo const& testInfo ) override;\n        void sectionStarting( SectionInfo const& sectionInfo ) override;\n        void assertionStarting( AssertionInfo const& assertionInfo ) override;\n\n        // The return value indicates if the messages buffer should be cleared:\n        bool assertionEnded( AssertionStats const& assertionStats ) override;\n        void sectionEnded( SectionStats const& sectionStats ) override;\n        void testCaseEnded( TestCaseStats const& testCaseStats ) override;\n        void testGroupEnded( TestGroupStats const& testGroupStats ) override;\n        void testRunEnded( TestRunStats const& testRunStats ) override;\n\n        void skipTest( TestCaseInfo const& testInfo ) override;\n        bool isMulti() const override;\n\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_listening.h\nnamespace Catch {\n\n    ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig )\n    :   m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {}\n\n    ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream )\n    :   m_stream( &_stream ), m_fullConfig( _fullConfig ) {}\n\n    std::ostream& ReporterConfig::stream() const { return *m_stream; }\n    IConfigPtr ReporterConfig::fullConfig() const { return m_fullConfig; }\n\n    TestRunInfo::TestRunInfo( std::string const& _name ) : name( _name ) {}\n\n    GroupInfo::GroupInfo(  std::string const& _name,\n                           std::size_t _groupIndex,\n                           std::size_t _groupsCount )\n    :   name( _name ),\n        groupIndex( _groupIndex ),\n        groupsCounts( _groupsCount )\n    {}\n\n     AssertionStats::AssertionStats( AssertionResult const& _assertionResult,\n                                     std::vector<MessageInfo> const& _infoMessages,\n                                     Totals const& _totals )\n    :   assertionResult( _assertionResult ),\n        infoMessages( _infoMessages ),\n        totals( _totals )\n    {\n        assertionResult.m_resultData.lazyExpression.m_transientExpression = _assertionResult.m_resultData.lazyExpression.m_transientExpression;\n\n        if( assertionResult.hasMessage() ) {\n            // Copy message into messages list.\n            // !TBD This should have been done earlier, somewhere\n            MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() );\n            builder << assertionResult.getMessage();\n            builder.m_info.message = builder.m_stream.str();\n\n            infoMessages.push_back( builder.m_info );\n        }\n    }\n\n     AssertionStats::~AssertionStats() = default;\n\n    SectionStats::SectionStats(  SectionInfo const& _sectionInfo,\n                                 Counts const& _assertions,\n                                 double _durationInSeconds,\n                                 bool _missingAssertions )\n    :   sectionInfo( _sectionInfo ),\n        assertions( _assertions ),\n        durationInSeconds( _durationInSeconds ),\n        missingAssertions( _missingAssertions )\n    {}\n\n    SectionStats::~SectionStats() = default;\n\n    TestCaseStats::TestCaseStats(  TestCaseInfo const& _testInfo,\n                                   Totals const& _totals,\n                                   std::string const& _stdOut,\n                                   std::string const& _stdErr,\n                                   bool _aborting )\n    : testInfo( _testInfo ),\n        totals( _totals ),\n        stdOut( _stdOut ),\n        stdErr( _stdErr ),\n        aborting( _aborting )\n    {}\n\n    TestCaseStats::~TestCaseStats() = default;\n\n    TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo,\n                                    Totals const& _totals,\n                                    bool _aborting )\n    :   groupInfo( _groupInfo ),\n        totals( _totals ),\n        aborting( _aborting )\n    {}\n\n    TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo )\n    :   groupInfo( _groupInfo ),\n        aborting( false )\n    {}\n\n    TestGroupStats::~TestGroupStats() = default;\n\n    TestRunStats::TestRunStats(   TestRunInfo const& _runInfo,\n                    Totals const& _totals,\n                    bool _aborting )\n    :   runInfo( _runInfo ),\n        totals( _totals ),\n        aborting( _aborting )\n    {}\n\n    TestRunStats::~TestRunStats() = default;\n\n    void IStreamingReporter::fatalErrorEncountered( StringRef ) {}\n    bool IStreamingReporter::isMulti() const { return false; }\n\n    IReporterFactory::~IReporterFactory() = default;\n    IReporterRegistry::~IReporterRegistry() = default;\n\n} // end namespace Catch\n// end catch_interfaces_reporter.cpp\n// start catch_interfaces_runner.cpp\n\nnamespace Catch {\n    IRunner::~IRunner() = default;\n}\n// end catch_interfaces_runner.cpp\n// start catch_interfaces_testcase.cpp\n\nnamespace Catch {\n    ITestInvoker::~ITestInvoker() = default;\n    ITestCaseRegistry::~ITestCaseRegistry() = default;\n}\n// end catch_interfaces_testcase.cpp\n// start catch_leak_detector.cpp\n\n#ifdef CATCH_CONFIG_WINDOWS_CRTDBG\n#include <crtdbg.h>\n\nnamespace Catch {\n\n    LeakDetector::LeakDetector() {\n        int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);\n        flag |= _CRTDBG_LEAK_CHECK_DF;\n        flag |= _CRTDBG_ALLOC_MEM_DF;\n        _CrtSetDbgFlag(flag);\n        _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);\n        _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);\n        // Change this to leaking allocation's number to break there\n        _CrtSetBreakAlloc(-1);\n    }\n}\n\n#else\n\n    Catch::LeakDetector::LeakDetector() {}\n\n#endif\n\nCatch::LeakDetector::~LeakDetector() {\n    Catch::cleanUp();\n}\n// end catch_leak_detector.cpp\n// start catch_list.cpp\n\n// start catch_list.h\n\n#include <set>\n\nnamespace Catch {\n\n    std::size_t listTests( Config const& config );\n\n    std::size_t listTestsNamesOnly( Config const& config );\n\n    struct TagInfo {\n        void add( std::string const& spelling );\n        std::string all() const;\n\n        std::set<std::string> spellings;\n        std::size_t count = 0;\n    };\n\n    std::size_t listTags( Config const& config );\n\n    std::size_t listReporters();\n\n    Option<std::size_t> list( std::shared_ptr<Config> const& config );\n\n} // end namespace Catch\n\n// end catch_list.h\n// start catch_text.h\n\nnamespace Catch {\n    using namespace clara::TextFlow;\n}\n\n// end catch_text.h\n#include <limits>\n#include <algorithm>\n#include <iomanip>\n\nnamespace Catch {\n\n    std::size_t listTests( Config const& config ) {\n        TestSpec testSpec = config.testSpec();\n        if( config.hasTestFilters() )\n            Catch::cout() << \"Matching test cases:\\n\";\n        else {\n            Catch::cout() << \"All available test cases:\\n\";\n        }\n\n        auto matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );\n        for( auto const& testCaseInfo : matchedTestCases ) {\n            Colour::Code colour = testCaseInfo.isHidden()\n                ? Colour::SecondaryText\n                : Colour::None;\n            Colour colourGuard( colour );\n\n            Catch::cout() << Column( testCaseInfo.name ).initialIndent( 2 ).indent( 4 ) << \"\\n\";\n            if( config.verbosity() >= Verbosity::High ) {\n                Catch::cout() << Column( Catch::Detail::stringify( testCaseInfo.lineInfo ) ).indent(4) << std::endl;\n                std::string description = testCaseInfo.description;\n                if( description.empty() )\n                    description = \"(NO DESCRIPTION)\";\n                Catch::cout() << Column( description ).indent(4) << std::endl;\n            }\n            if( !testCaseInfo.tags.empty() )\n                Catch::cout() << Column( testCaseInfo.tagsAsString() ).indent( 6 ) << \"\\n\";\n        }\n\n        if( !config.hasTestFilters() )\n            Catch::cout() << pluralise( matchedTestCases.size(), \"test case\" ) << '\\n' << std::endl;\n        else\n            Catch::cout() << pluralise( matchedTestCases.size(), \"matching test case\" ) << '\\n' << std::endl;\n        return matchedTestCases.size();\n    }\n\n    std::size_t listTestsNamesOnly( Config const& config ) {\n        TestSpec testSpec = config.testSpec();\n        std::size_t matchedTests = 0;\n        std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );\n        for( auto const& testCaseInfo : matchedTestCases ) {\n            matchedTests++;\n            if( startsWith( testCaseInfo.name, '#' ) )\n               Catch::cout() << '\"' << testCaseInfo.name << '\"';\n            else\n               Catch::cout() << testCaseInfo.name;\n            if ( config.verbosity() >= Verbosity::High )\n                Catch::cout() << \"\\t@\" << testCaseInfo.lineInfo;\n            Catch::cout() << std::endl;\n        }\n        return matchedTests;\n    }\n\n    void TagInfo::add( std::string const& spelling ) {\n        ++count;\n        spellings.insert( spelling );\n    }\n\n    std::string TagInfo::all() const {\n        std::string out;\n        for( auto const& spelling : spellings )\n            out += \"[\" + spelling + \"]\";\n        return out;\n    }\n\n    std::size_t listTags( Config const& config ) {\n        TestSpec testSpec = config.testSpec();\n        if( config.hasTestFilters() )\n            Catch::cout() << \"Tags for matching test cases:\\n\";\n        else {\n            Catch::cout() << \"All available tags:\\n\";\n        }\n\n        std::map<std::string, TagInfo> tagCounts;\n\n        std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );\n        for( auto const& testCase : matchedTestCases ) {\n            for( auto const& tagName : testCase.getTestCaseInfo().tags ) {\n                std::string lcaseTagName = toLower( tagName );\n                auto countIt = tagCounts.find( lcaseTagName );\n                if( countIt == tagCounts.end() )\n                    countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first;\n                countIt->second.add( tagName );\n            }\n        }\n\n        for( auto const& tagCount : tagCounts ) {\n            ReusableStringStream rss;\n            rss << \"  \" << std::setw(2) << tagCount.second.count << \"  \";\n            auto str = rss.str();\n            auto wrapper = Column( tagCount.second.all() )\n                                                    .initialIndent( 0 )\n                                                    .indent( str.size() )\n                                                    .width( CATCH_CONFIG_CONSOLE_WIDTH-10 );\n            Catch::cout() << str << wrapper << '\\n';\n        }\n        Catch::cout() << pluralise( tagCounts.size(), \"tag\" ) << '\\n' << std::endl;\n        return tagCounts.size();\n    }\n\n    std::size_t listReporters() {\n        Catch::cout() << \"Available reporters:\\n\";\n        IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();\n        std::size_t maxNameLen = 0;\n        for( auto const& factoryKvp : factories )\n            maxNameLen = (std::max)( maxNameLen, factoryKvp.first.size() );\n\n        for( auto const& factoryKvp : factories ) {\n            Catch::cout()\n                    << Column( factoryKvp.first + \":\" )\n                            .indent(2)\n                            .width( 5+maxNameLen )\n                    +  Column( factoryKvp.second->getDescription() )\n                            .initialIndent(0)\n                            .indent(2)\n                            .width( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 )\n                    << \"\\n\";\n        }\n        Catch::cout() << std::endl;\n        return factories.size();\n    }\n\n    Option<std::size_t> list( std::shared_ptr<Config> const& config ) {\n        Option<std::size_t> listedCount;\n        getCurrentMutableContext().setConfig( config );\n        if( config->listTests() )\n            listedCount = listedCount.valueOr(0) + listTests( *config );\n        if( config->listTestNamesOnly() )\n            listedCount = listedCount.valueOr(0) + listTestsNamesOnly( *config );\n        if( config->listTags() )\n            listedCount = listedCount.valueOr(0) + listTags( *config );\n        if( config->listReporters() )\n            listedCount = listedCount.valueOr(0) + listReporters();\n        return listedCount;\n    }\n\n} // end namespace Catch\n// end catch_list.cpp\n// start catch_matchers.cpp\n\nnamespace Catch {\nnamespace Matchers {\n    namespace Impl {\n\n        std::string MatcherUntypedBase::toString() const {\n            if( m_cachedToString.empty() )\n                m_cachedToString = describe();\n            return m_cachedToString;\n        }\n\n        MatcherUntypedBase::~MatcherUntypedBase() = default;\n\n    } // namespace Impl\n} // namespace Matchers\n\nusing namespace Matchers;\nusing Matchers::Impl::MatcherBase;\n\n} // namespace Catch\n// end catch_matchers.cpp\n// start catch_matchers_floating.cpp\n\n// start catch_polyfills.hpp\n\nnamespace Catch {\n    bool isnan(float f);\n    bool isnan(double d);\n}\n\n// end catch_polyfills.hpp\n// start catch_to_string.hpp\n\n#include <string>\n\nnamespace Catch {\n    template <typename T>\n    std::string to_string(T const& t) {\n#if defined(CATCH_CONFIG_CPP11_TO_STRING)\n        return std::to_string(t);\n#else\n        ReusableStringStream rss;\n        rss << t;\n        return rss.str();\n#endif\n    }\n} // end namespace Catch\n\n// end catch_to_string.hpp\n#include <cstdlib>\n#include <cstdint>\n#include <cstring>\n#include <sstream>\n#include <iomanip>\n#include <limits>\n\nnamespace Catch {\nnamespace Matchers {\nnamespace Floating {\nenum class FloatingPointKind : uint8_t {\n    Float,\n    Double\n};\n}\n}\n}\n\nnamespace {\n\ntemplate <typename T>\nstruct Converter;\n\ntemplate <>\nstruct Converter<float> {\n    static_assert(sizeof(float) == sizeof(int32_t), \"Important ULP matcher assumption violated\");\n    Converter(float f) {\n        std::memcpy(&i, &f, sizeof(f));\n    }\n    int32_t i;\n};\n\ntemplate <>\nstruct Converter<double> {\n    static_assert(sizeof(double) == sizeof(int64_t), \"Important ULP matcher assumption violated\");\n    Converter(double d) {\n        std::memcpy(&i, &d, sizeof(d));\n    }\n    int64_t i;\n};\n\ntemplate <typename T>\nauto convert(T t) -> Converter<T> {\n    return Converter<T>(t);\n}\n\ntemplate <typename FP>\nbool almostEqualUlps(FP lhs, FP rhs, int maxUlpDiff) {\n    // Comparison with NaN should always be false.\n    // This way we can rule it out before getting into the ugly details\n    if (Catch::isnan(lhs) || Catch::isnan(rhs)) {\n        return false;\n    }\n\n    auto lc = convert(lhs);\n    auto rc = convert(rhs);\n\n    if ((lc.i < 0) != (rc.i < 0)) {\n        // Potentially we can have +0 and -0\n        return lhs == rhs;\n    }\n\n    auto ulpDiff = std::abs(lc.i - rc.i);\n    return ulpDiff <= maxUlpDiff;\n}\n\ntemplate <typename FP>\nFP step(FP start, FP direction, int steps) {\n    for (int i = 0; i < steps; ++i) {\n        start = std::nextafter(start, direction);\n    }\n    return start;\n}\n\n} // end anonymous namespace\n\nnamespace Catch {\nnamespace Matchers {\nnamespace Floating {\n    WithinAbsMatcher::WithinAbsMatcher(double target, double margin)\n        :m_target{ target }, m_margin{ margin } {\n        CATCH_ENFORCE(margin >= 0, \"Invalid margin: \" << margin << '.'\n            << \" Margin has to be non-negative.\");\n    }\n\n    // Performs equivalent check of std::fabs(lhs - rhs) <= margin\n    // But without the subtraction to allow for INFINITY in comparison\n    bool WithinAbsMatcher::match(double const& matchee) const {\n        return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee);\n    }\n\n    std::string WithinAbsMatcher::describe() const {\n        return \"is within \" + ::Catch::Detail::stringify(m_margin) + \" of \" + ::Catch::Detail::stringify(m_target);\n    }\n\n    WithinUlpsMatcher::WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType)\n        :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } {\n        CATCH_ENFORCE(ulps >= 0, \"Invalid ULP setting: \" << ulps << '.'\n            << \" ULPs have to be non-negative.\");\n    }\n\n#if defined(__clang__)\n#pragma clang diagnostic push\n// Clang <3.5 reports on the default branch in the switch below\n#pragma clang diagnostic ignored \"-Wunreachable-code\"\n#endif\n\n    bool WithinUlpsMatcher::match(double const& matchee) const {\n        switch (m_type) {\n        case FloatingPointKind::Float:\n            return almostEqualUlps<float>(static_cast<float>(matchee), static_cast<float>(m_target), m_ulps);\n        case FloatingPointKind::Double:\n            return almostEqualUlps<double>(matchee, m_target, m_ulps);\n        default:\n            CATCH_INTERNAL_ERROR( \"Unknown FloatingPointKind value\" );\n        }\n    }\n\n#if defined(__clang__)\n#pragma clang diagnostic pop\n#endif\n\n    std::string WithinUlpsMatcher::describe() const {\n        std::stringstream ret;\n\n        ret << \"is within \" << m_ulps << \" ULPs of \" << ::Catch::Detail::stringify(m_target);\n\n        if (m_type == FloatingPointKind::Float) {\n            ret << 'f';\n        }\n\n        ret << \" ([\";\n        ret << std::fixed << std::setprecision(std::numeric_limits<double>::max_digits10);\n        if (m_type == FloatingPointKind::Double) {\n            ret << step(m_target, static_cast<double>(-INFINITY), m_ulps)\n                << \", \"\n                << step(m_target, static_cast<double>(INFINITY), m_ulps);\n        } else {\n            ret << step<float>(static_cast<float>(m_target), -INFINITY, m_ulps)\n                << \", \"\n                << step<float>(static_cast<float>(m_target), INFINITY, m_ulps);\n        }\n        ret << \"])\";\n\n        return ret.str();\n        //return \"is within \" + Catch::to_string(m_ulps) + \" ULPs of \" + ::Catch::Detail::stringify(m_target) + ((m_type == FloatingPointKind::Float)? \"f\" : \"\");\n    }\n\n}// namespace Floating\n\nFloating::WithinUlpsMatcher WithinULP(double target, int maxUlpDiff) {\n    return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double);\n}\n\nFloating::WithinUlpsMatcher WithinULP(float target, int maxUlpDiff) {\n    return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float);\n}\n\nFloating::WithinAbsMatcher WithinAbs(double target, double margin) {\n    return Floating::WithinAbsMatcher(target, margin);\n}\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_floating.cpp\n// start catch_matchers_generic.cpp\n\nstd::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::string& desc) {\n    if (desc.empty()) {\n        return \"matches undescribed predicate\";\n    } else {\n        return \"matches predicate: \\\"\" + desc + '\"';\n    }\n}\n// end catch_matchers_generic.cpp\n// start catch_matchers_string.cpp\n\n#include <regex>\n\nnamespace Catch {\nnamespace Matchers {\n\n    namespace StdString {\n\n        CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity )\n        :   m_caseSensitivity( caseSensitivity ),\n            m_str( adjustString( str ) )\n        {}\n        std::string CasedString::adjustString( std::string const& str ) const {\n            return m_caseSensitivity == CaseSensitive::No\n                   ? toLower( str )\n                   : str;\n        }\n        std::string CasedString::caseSensitivitySuffix() const {\n            return m_caseSensitivity == CaseSensitive::No\n                   ? \" (case insensitive)\"\n                   : std::string();\n        }\n\n        StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator )\n        : m_comparator( comparator ),\n          m_operation( operation ) {\n        }\n\n        std::string StringMatcherBase::describe() const {\n            std::string description;\n            description.reserve(5 + m_operation.size() + m_comparator.m_str.size() +\n                                        m_comparator.caseSensitivitySuffix().size());\n            description += m_operation;\n            description += \": \\\"\";\n            description += m_comparator.m_str;\n            description += \"\\\"\";\n            description += m_comparator.caseSensitivitySuffix();\n            return description;\n        }\n\n        EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( \"equals\", comparator ) {}\n\n        bool EqualsMatcher::match( std::string const& source ) const {\n            return m_comparator.adjustString( source ) == m_comparator.m_str;\n        }\n\n        ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( \"contains\", comparator ) {}\n\n        bool ContainsMatcher::match( std::string const& source ) const {\n            return contains( m_comparator.adjustString( source ), m_comparator.m_str );\n        }\n\n        StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( \"starts with\", comparator ) {}\n\n        bool StartsWithMatcher::match( std::string const& source ) const {\n            return startsWith( m_comparator.adjustString( source ), m_comparator.m_str );\n        }\n\n        EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( \"ends with\", comparator ) {}\n\n        bool EndsWithMatcher::match( std::string const& source ) const {\n            return endsWith( m_comparator.adjustString( source ), m_comparator.m_str );\n        }\n\n        RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity): m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {}\n\n        bool RegexMatcher::match(std::string const& matchee) const {\n            auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax option anyway\n            if (m_caseSensitivity == CaseSensitive::Choice::No) {\n                flags |= std::regex::icase;\n            }\n            auto reg = std::regex(m_regex, flags);\n            return std::regex_match(matchee, reg);\n        }\n\n        std::string RegexMatcher::describe() const {\n            return \"matches \" + ::Catch::Detail::stringify(m_regex) + ((m_caseSensitivity == CaseSensitive::Choice::Yes)? \" case sensitively\" : \" case insensitively\");\n        }\n\n    } // namespace StdString\n\n    StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) {\n        return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) );\n    }\n    StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) {\n        return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) );\n    }\n    StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) {\n        return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) );\n    }\n    StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) {\n        return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) );\n    }\n\n    StdString::RegexMatcher Matches(std::string const& regex, CaseSensitive::Choice caseSensitivity) {\n        return StdString::RegexMatcher(regex, caseSensitivity);\n    }\n\n} // namespace Matchers\n} // namespace Catch\n// end catch_matchers_string.cpp\n// start catch_message.cpp\n\n// start catch_uncaught_exceptions.h\n\nnamespace Catch {\n    bool uncaught_exceptions();\n} // end namespace Catch\n\n// end catch_uncaught_exceptions.h\n#include <cassert>\n#include <stack>\n\nnamespace Catch {\n\n    MessageInfo::MessageInfo(   StringRef const& _macroName,\n                                SourceLineInfo const& _lineInfo,\n                                ResultWas::OfType _type )\n    :   macroName( _macroName ),\n        lineInfo( _lineInfo ),\n        type( _type ),\n        sequence( ++globalCount )\n    {}\n\n    bool MessageInfo::operator==( MessageInfo const& other ) const {\n        return sequence == other.sequence;\n    }\n\n    bool MessageInfo::operator<( MessageInfo const& other ) const {\n        return sequence < other.sequence;\n    }\n\n    // This may need protecting if threading support is added\n    unsigned int MessageInfo::globalCount = 0;\n\n    ////////////////////////////////////////////////////////////////////////////\n\n    Catch::MessageBuilder::MessageBuilder( StringRef const& macroName,\n                                           SourceLineInfo const& lineInfo,\n                                           ResultWas::OfType type )\n        :m_info(macroName, lineInfo, type) {}\n\n    ////////////////////////////////////////////////////////////////////////////\n\n    ScopedMessage::ScopedMessage( MessageBuilder const& builder )\n    : m_info( builder.m_info ), m_moved()\n    {\n        m_info.message = builder.m_stream.str();\n        getResultCapture().pushScopedMessage( m_info );\n    }\n\n    ScopedMessage::ScopedMessage( ScopedMessage&& old )\n    : m_info( old.m_info ), m_moved()\n    {\n        old.m_moved = true;\n    }\n\n    ScopedMessage::~ScopedMessage() {\n        if ( !uncaught_exceptions() && !m_moved ){\n            getResultCapture().popScopedMessage(m_info);\n        }\n    }\n\n    Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) {\n        auto trimmed = [&] (size_t start, size_t end) {\n            while (names[start] == ',' || isspace(names[start])) {\n                ++start;\n            }\n            while (names[end] == ',' || isspace(names[end])) {\n                --end;\n            }\n            return names.substr(start, end - start + 1);\n        };\n        auto skipq = [&] (size_t start, char quote) {\n            for (auto i = start + 1; i < names.size() ; ++i) {\n                if (names[i] == quote)\n                    return i;\n                if (names[i] == '\\\\')\n                    ++i;\n            }\n            CATCH_INTERNAL_ERROR(\"CAPTURE parsing encountered unmatched quote\");\n        };\n\n        size_t start = 0;\n        std::stack<char> openings;\n        for (size_t pos = 0; pos < names.size(); ++pos) {\n            char c = names[pos];\n            switch (c) {\n            case '[':\n            case '{':\n            case '(':\n            // It is basically impossible to disambiguate between\n            // comparison and start of template args in this context\n//            case '<':\n                openings.push(c);\n                break;\n            case ']':\n            case '}':\n            case ')':\n//           case '>':\n                openings.pop();\n                break;\n            case '\"':\n            case '\\'':\n                pos = skipq(pos, c);\n                break;\n            case ',':\n                if (start != pos && openings.size() == 0) {\n                    m_messages.emplace_back(macroName, lineInfo, resultType);\n                    m_messages.back().message = trimmed(start, pos);\n                    m_messages.back().message += \" := \";\n                    start = pos;\n                }\n            }\n        }\n        assert(openings.size() == 0 && \"Mismatched openings\");\n        m_messages.emplace_back(macroName, lineInfo, resultType);\n        m_messages.back().message = trimmed(start, names.size() - 1);\n        m_messages.back().message += \" := \";\n    }\n    Capturer::~Capturer() {\n        if ( !uncaught_exceptions() ){\n            assert( m_captured == m_messages.size() );\n            for( size_t i = 0; i < m_captured; ++i  )\n                m_resultCapture.popScopedMessage( m_messages[i] );\n        }\n    }\n\n    void Capturer::captureValue( size_t index, std::string const& value ) {\n        assert( index < m_messages.size() );\n        m_messages[index].message += value;\n        m_resultCapture.pushScopedMessage( m_messages[index] );\n        m_captured++;\n    }\n\n} // end namespace Catch\n// end catch_message.cpp\n// start catch_output_redirect.cpp\n\n// start catch_output_redirect.h\n#ifndef TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H\n#define TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H\n\n#include <cstdio>\n#include <iosfwd>\n#include <string>\n\nnamespace Catch {\n\n    class RedirectedStream {\n        std::ostream& m_originalStream;\n        std::ostream& m_redirectionStream;\n        std::streambuf* m_prevBuf;\n\n    public:\n        RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream );\n        ~RedirectedStream();\n    };\n\n    class RedirectedStdOut {\n        ReusableStringStream m_rss;\n        RedirectedStream m_cout;\n    public:\n        RedirectedStdOut();\n        auto str() const -> std::string;\n    };\n\n    // StdErr has two constituent streams in C++, std::cerr and std::clog\n    // This means that we need to redirect 2 streams into 1 to keep proper\n    // order of writes\n    class RedirectedStdErr {\n        ReusableStringStream m_rss;\n        RedirectedStream m_cerr;\n        RedirectedStream m_clog;\n    public:\n        RedirectedStdErr();\n        auto str() const -> std::string;\n    };\n\n    class RedirectedStreams {\n    public:\n        RedirectedStreams(RedirectedStreams const&) = delete;\n        RedirectedStreams& operator=(RedirectedStreams const&) = delete;\n        RedirectedStreams(RedirectedStreams&&) = delete;\n        RedirectedStreams& operator=(RedirectedStreams&&) = delete;\n\n        RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr);\n        ~RedirectedStreams();\n    private:\n        std::string& m_redirectedCout;\n        std::string& m_redirectedCerr;\n        RedirectedStdOut m_redirectedStdOut;\n        RedirectedStdErr m_redirectedStdErr;\n    };\n\n#if defined(CATCH_CONFIG_NEW_CAPTURE)\n\n    // Windows's implementation of std::tmpfile is terrible (it tries\n    // to create a file inside system folder, thus requiring elevated\n    // privileges for the binary), so we have to use tmpnam(_s) and\n    // create the file ourselves there.\n    class TempFile {\n    public:\n        TempFile(TempFile const&) = delete;\n        TempFile& operator=(TempFile const&) = delete;\n        TempFile(TempFile&&) = delete;\n        TempFile& operator=(TempFile&&) = delete;\n\n        TempFile();\n        ~TempFile();\n\n        std::FILE* getFile();\n        std::string getContents();\n\n    private:\n        std::FILE* m_file = nullptr;\n    #if defined(_MSC_VER)\n        char m_buffer[L_tmpnam] = { 0 };\n    #endif\n    };\n\n    class OutputRedirect {\n    public:\n        OutputRedirect(OutputRedirect const&) = delete;\n        OutputRedirect& operator=(OutputRedirect const&) = delete;\n        OutputRedirect(OutputRedirect&&) = delete;\n        OutputRedirect& operator=(OutputRedirect&&) = delete;\n\n        OutputRedirect(std::string& stdout_dest, std::string& stderr_dest);\n        ~OutputRedirect();\n\n    private:\n        int m_originalStdout = -1;\n        int m_originalStderr = -1;\n        TempFile m_stdoutFile;\n        TempFile m_stderrFile;\n        std::string& m_stdoutDest;\n        std::string& m_stderrDest;\n    };\n\n#endif\n\n} // end namespace Catch\n\n#endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H\n// end catch_output_redirect.h\n#include <cstdio>\n#include <cstring>\n#include <fstream>\n#include <sstream>\n#include <stdexcept>\n\n#if defined(CATCH_CONFIG_NEW_CAPTURE)\n    #if defined(_MSC_VER)\n    #include <io.h>      //_dup and _dup2\n    #define dup _dup\n    #define dup2 _dup2\n    #define fileno _fileno\n    #else\n    #include <unistd.h>  // dup and dup2\n    #endif\n#endif\n\nnamespace Catch {\n\n    RedirectedStream::RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream )\n    :   m_originalStream( originalStream ),\n        m_redirectionStream( redirectionStream ),\n        m_prevBuf( m_originalStream.rdbuf() )\n    {\n        m_originalStream.rdbuf( m_redirectionStream.rdbuf() );\n    }\n\n    RedirectedStream::~RedirectedStream() {\n        m_originalStream.rdbuf( m_prevBuf );\n    }\n\n    RedirectedStdOut::RedirectedStdOut() : m_cout( Catch::cout(), m_rss.get() ) {}\n    auto RedirectedStdOut::str() const -> std::string { return m_rss.str(); }\n\n    RedirectedStdErr::RedirectedStdErr()\n    :   m_cerr( Catch::cerr(), m_rss.get() ),\n        m_clog( Catch::clog(), m_rss.get() )\n    {}\n    auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); }\n\n    RedirectedStreams::RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr)\n    :   m_redirectedCout(redirectedCout),\n        m_redirectedCerr(redirectedCerr)\n    {}\n\n    RedirectedStreams::~RedirectedStreams() {\n        m_redirectedCout += m_redirectedStdOut.str();\n        m_redirectedCerr += m_redirectedStdErr.str();\n    }\n\n#if defined(CATCH_CONFIG_NEW_CAPTURE)\n\n#if defined(_MSC_VER)\n    TempFile::TempFile() {\n        if (tmpnam_s(m_buffer)) {\n            CATCH_RUNTIME_ERROR(\"Could not get a temp filename\");\n        }\n        if (fopen_s(&m_file, m_buffer, \"w\")) {\n            char buffer[100];\n            if (strerror_s(buffer, errno)) {\n                CATCH_RUNTIME_ERROR(\"Could not translate errno to a string\");\n            }\n            CATCH_RUNTIME_ERROR(\"Could not open the temp file: '\" << m_buffer << \"' because: \" << buffer);\n        }\n    }\n#else\n    TempFile::TempFile() {\n        m_file = std::tmpfile();\n        if (!m_file) {\n            CATCH_RUNTIME_ERROR(\"Could not create a temp file.\");\n        }\n    }\n\n#endif\n\n    TempFile::~TempFile() {\n         // TBD: What to do about errors here?\n         std::fclose(m_file);\n         // We manually create the file on Windows only, on Linux\n         // it will be autodeleted\n#if defined(_MSC_VER)\n         std::remove(m_buffer);\n#endif\n    }\n\n    FILE* TempFile::getFile() {\n        return m_file;\n    }\n\n    std::string TempFile::getContents() {\n        std::stringstream sstr;\n        char buffer[100] = {};\n        std::rewind(m_file);\n        while (std::fgets(buffer, sizeof(buffer), m_file)) {\n            sstr << buffer;\n        }\n        return sstr.str();\n    }\n\n    OutputRedirect::OutputRedirect(std::string& stdout_dest, std::string& stderr_dest) :\n        m_originalStdout(dup(1)),\n        m_originalStderr(dup(2)),\n        m_stdoutDest(stdout_dest),\n        m_stderrDest(stderr_dest) {\n        dup2(fileno(m_stdoutFile.getFile()), 1);\n        dup2(fileno(m_stderrFile.getFile()), 2);\n    }\n\n    OutputRedirect::~OutputRedirect() {\n        Catch::cout() << std::flush;\n        fflush(stdout);\n        // Since we support overriding these streams, we flush cerr\n        // even though std::cerr is unbuffered\n        Catch::cerr() << std::flush;\n        Catch::clog() << std::flush;\n        fflush(stderr);\n\n        dup2(m_originalStdout, 1);\n        dup2(m_originalStderr, 2);\n\n        m_stdoutDest += m_stdoutFile.getContents();\n        m_stderrDest += m_stderrFile.getContents();\n    }\n\n#endif // CATCH_CONFIG_NEW_CAPTURE\n\n} // namespace Catch\n\n#if defined(CATCH_CONFIG_NEW_CAPTURE)\n    #if defined(_MSC_VER)\n    #undef dup\n    #undef dup2\n    #undef fileno\n    #endif\n#endif\n// end catch_output_redirect.cpp\n// start catch_polyfills.cpp\n\n#include <cmath>\n\nnamespace Catch {\n\n#if !defined(CATCH_CONFIG_POLYFILL_ISNAN)\n    bool isnan(float f) {\n        return std::isnan(f);\n    }\n    bool isnan(double d) {\n        return std::isnan(d);\n    }\n#else\n    // For now we only use this for embarcadero\n    bool isnan(float f) {\n        return std::_isnan(f);\n    }\n    bool isnan(double d) {\n        return std::_isnan(d);\n    }\n#endif\n\n} // end namespace Catch\n// end catch_polyfills.cpp\n// start catch_random_number_generator.cpp\n\nnamespace Catch {\n\n    std::mt19937& rng() {\n        static std::mt19937 s_rng;\n        return s_rng;\n    }\n\n    void seedRng( IConfig const& config ) {\n        if( config.rngSeed() != 0 ) {\n            std::srand( config.rngSeed() );\n            rng().seed( config.rngSeed() );\n        }\n    }\n\n    unsigned int rngSeed() {\n        return getCurrentContext().getConfig()->rngSeed();\n    }\n}\n// end catch_random_number_generator.cpp\n// start catch_registry_hub.cpp\n\n// start catch_test_case_registry_impl.h\n\n#include <vector>\n#include <set>\n#include <algorithm>\n#include <ios>\n\nnamespace Catch {\n\n    class TestCase;\n    struct IConfig;\n\n    std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases );\n    bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );\n\n    void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions );\n\n    std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );\n    std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );\n\n    class TestRegistry : public ITestCaseRegistry {\n    public:\n        virtual ~TestRegistry() = default;\n\n        virtual void registerTest( TestCase const& testCase );\n\n        std::vector<TestCase> const& getAllTests() const override;\n        std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const override;\n\n    private:\n        std::vector<TestCase> m_functions;\n        mutable RunTests::InWhatOrder m_currentSortOrder = RunTests::InDeclarationOrder;\n        mutable std::vector<TestCase> m_sortedFunctions;\n        std::size_t m_unnamedCount = 0;\n        std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class TestInvokerAsFunction : public ITestInvoker {\n        void(*m_testAsFunction)();\n    public:\n        TestInvokerAsFunction( void(*testAsFunction)() ) noexcept;\n\n        void invoke() const override;\n    };\n\n    std::string extractClassName( StringRef const& classOrQualifiedMethodName );\n\n    ///////////////////////////////////////////////////////////////////////////\n\n} // end namespace Catch\n\n// end catch_test_case_registry_impl.h\n// start catch_reporter_registry.h\n\n#include <map>\n\nnamespace Catch {\n\n    class ReporterRegistry : public IReporterRegistry {\n\n    public:\n\n        ~ReporterRegistry() override;\n\n        IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const override;\n\n        void registerReporter( std::string const& name, IReporterFactoryPtr const& factory );\n        void registerListener( IReporterFactoryPtr const& factory );\n\n        FactoryMap const& getFactories() const override;\n        Listeners const& getListeners() const override;\n\n    private:\n        FactoryMap m_factories;\n        Listeners m_listeners;\n    };\n}\n\n// end catch_reporter_registry.h\n// start catch_tag_alias_registry.h\n\n// start catch_tag_alias.h\n\n#include <string>\n\nnamespace Catch {\n\n    struct TagAlias {\n        TagAlias(std::string const& _tag, SourceLineInfo _lineInfo);\n\n        std::string tag;\n        SourceLineInfo lineInfo;\n    };\n\n} // end namespace Catch\n\n// end catch_tag_alias.h\n#include <map>\n\nnamespace Catch {\n\n    class TagAliasRegistry : public ITagAliasRegistry {\n    public:\n        ~TagAliasRegistry() override;\n        TagAlias const* find( std::string const& alias ) const override;\n        std::string expandAliases( std::string const& unexpandedTestSpec ) const override;\n        void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo );\n\n    private:\n        std::map<std::string, TagAlias> m_registry;\n    };\n\n} // end namespace Catch\n\n// end catch_tag_alias_registry.h\n// start catch_startup_exception_registry.h\n\n#include <vector>\n#include <exception>\n\nnamespace Catch {\n\n    class StartupExceptionRegistry {\n    public:\n        void add(std::exception_ptr const& exception) noexcept;\n        std::vector<std::exception_ptr> const& getExceptions() const noexcept;\n    private:\n        std::vector<std::exception_ptr> m_exceptions;\n    };\n\n} // end namespace Catch\n\n// end catch_startup_exception_registry.h\n// start catch_singletons.hpp\n\nnamespace Catch {\n\n    struct ISingleton {\n        virtual ~ISingleton();\n    };\n\n    void addSingleton( ISingleton* singleton );\n    void cleanupSingletons();\n\n    template<typename SingletonImplT, typename InterfaceT = SingletonImplT, typename MutableInterfaceT = InterfaceT>\n    class Singleton : SingletonImplT, public ISingleton {\n\n        static auto getInternal() -> Singleton* {\n            static Singleton* s_instance = nullptr;\n            if( !s_instance ) {\n                s_instance = new Singleton;\n                addSingleton( s_instance );\n            }\n            return s_instance;\n        }\n\n    public:\n        static auto get() -> InterfaceT const& {\n            return *getInternal();\n        }\n        static auto getMutable() -> MutableInterfaceT& {\n            return *getInternal();\n        }\n    };\n\n} // namespace Catch\n\n// end catch_singletons.hpp\nnamespace Catch {\n\n    namespace {\n\n        class RegistryHub : public IRegistryHub, public IMutableRegistryHub,\n                            private NonCopyable {\n\n        public: // IRegistryHub\n            RegistryHub() = default;\n            IReporterRegistry const& getReporterRegistry() const override {\n                return m_reporterRegistry;\n            }\n            ITestCaseRegistry const& getTestCaseRegistry() const override {\n                return m_testCaseRegistry;\n            }\n            IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const override {\n                return m_exceptionTranslatorRegistry;\n            }\n            ITagAliasRegistry const& getTagAliasRegistry() const override {\n                return m_tagAliasRegistry;\n            }\n            StartupExceptionRegistry const& getStartupExceptionRegistry() const override {\n                return m_exceptionRegistry;\n            }\n\n        public: // IMutableRegistryHub\n            void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) override {\n                m_reporterRegistry.registerReporter( name, factory );\n            }\n            void registerListener( IReporterFactoryPtr const& factory ) override {\n                m_reporterRegistry.registerListener( factory );\n            }\n            void registerTest( TestCase const& testInfo ) override {\n                m_testCaseRegistry.registerTest( testInfo );\n            }\n            void registerTranslator( const IExceptionTranslator* translator ) override {\n                m_exceptionTranslatorRegistry.registerTranslator( translator );\n            }\n            void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) override {\n                m_tagAliasRegistry.add( alias, tag, lineInfo );\n            }\n            void registerStartupException() noexcept override {\n                m_exceptionRegistry.add(std::current_exception());\n            }\n            IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override {\n                return m_enumValuesRegistry;\n            }\n\n        private:\n            TestRegistry m_testCaseRegistry;\n            ReporterRegistry m_reporterRegistry;\n            ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;\n            TagAliasRegistry m_tagAliasRegistry;\n            StartupExceptionRegistry m_exceptionRegistry;\n            Detail::EnumValuesRegistry m_enumValuesRegistry;\n        };\n    }\n\n    using RegistryHubSingleton = Singleton<RegistryHub, IRegistryHub, IMutableRegistryHub>;\n\n    IRegistryHub const& getRegistryHub() {\n        return RegistryHubSingleton::get();\n    }\n    IMutableRegistryHub& getMutableRegistryHub() {\n        return RegistryHubSingleton::getMutable();\n    }\n    void cleanUp() {\n        cleanupSingletons();\n        cleanUpContext();\n    }\n    std::string translateActiveException() {\n        return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();\n    }\n\n} // end namespace Catch\n// end catch_registry_hub.cpp\n// start catch_reporter_registry.cpp\n\nnamespace Catch {\n\n    ReporterRegistry::~ReporterRegistry() = default;\n\n    IStreamingReporterPtr ReporterRegistry::create( std::string const& name, IConfigPtr const& config ) const {\n        auto it =  m_factories.find( name );\n        if( it == m_factories.end() )\n            return nullptr;\n        return it->second->create( ReporterConfig( config ) );\n    }\n\n    void ReporterRegistry::registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) {\n        m_factories.emplace(name, factory);\n    }\n    void ReporterRegistry::registerListener( IReporterFactoryPtr const& factory ) {\n        m_listeners.push_back( factory );\n    }\n\n    IReporterRegistry::FactoryMap const& ReporterRegistry::getFactories() const {\n        return m_factories;\n    }\n    IReporterRegistry::Listeners const& ReporterRegistry::getListeners() const {\n        return m_listeners;\n    }\n\n}\n// end catch_reporter_registry.cpp\n// start catch_result_type.cpp\n\nnamespace Catch {\n\n    bool isOk( ResultWas::OfType resultType ) {\n        return ( resultType & ResultWas::FailureBit ) == 0;\n    }\n    bool isJustInfo( int flags ) {\n        return flags == ResultWas::Info;\n    }\n\n    ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {\n        return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );\n    }\n\n    bool shouldContinueOnFailure( int flags )    { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }\n    bool shouldSuppressFailure( int flags )      { return ( flags & ResultDisposition::SuppressFail ) != 0; }\n\n} // end namespace Catch\n// end catch_result_type.cpp\n// start catch_run_context.cpp\n\n#include <cassert>\n#include <algorithm>\n#include <sstream>\n\nnamespace Catch {\n\n    namespace Generators {\n        struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker {\n            GeneratorBasePtr m_generator;\n\n            GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )\n            :   TrackerBase( nameAndLocation, ctx, parent )\n            {}\n            ~GeneratorTracker();\n\n            static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTracking::NameAndLocation const& nameAndLocation ) {\n                std::shared_ptr<GeneratorTracker> tracker;\n\n                ITracker& currentTracker = ctx.currentTracker();\n                if( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) {\n                    assert( childTracker );\n                    assert( childTracker->isGeneratorTracker() );\n                    tracker = std::static_pointer_cast<GeneratorTracker>( childTracker );\n                }\n                else {\n                    tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, &currentTracker );\n                    currentTracker.addChild( tracker );\n                }\n\n                if( !ctx.completedCycle() && !tracker->isComplete() ) {\n                    tracker->open();\n                }\n\n                return *tracker;\n            }\n\n            // TrackerBase interface\n            bool isGeneratorTracker() const override { return true; }\n            auto hasGenerator() const -> bool override {\n                return !!m_generator;\n            }\n            void close() override {\n                TrackerBase::close();\n                // Generator interface only finds out if it has another item on atual move\n                if (m_runState == CompletedSuccessfully && m_generator->next()) {\n                    m_children.clear();\n                    m_runState = Executing;\n                }\n            }\n\n            // IGeneratorTracker interface\n            auto getGenerator() const -> GeneratorBasePtr const& override {\n                return m_generator;\n            }\n            void setGenerator( GeneratorBasePtr&& generator ) override {\n                m_generator = std::move( generator );\n            }\n        };\n        GeneratorTracker::~GeneratorTracker() {}\n    }\n\n    RunContext::RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter)\n    :   m_runInfo(_config->name()),\n        m_context(getCurrentMutableContext()),\n        m_config(_config),\n        m_reporter(std::move(reporter)),\n        m_lastAssertionInfo{ StringRef(), SourceLineInfo(\"\",0), StringRef(), ResultDisposition::Normal },\n        m_includeSuccessfulResults( m_config->includeSuccessfulResults() || m_reporter->getPreferences().shouldReportAllAssertions )\n    {\n        m_context.setRunner(this);\n        m_context.setConfig(m_config);\n        m_context.setResultCapture(this);\n        m_reporter->testRunStarting(m_runInfo);\n    }\n\n    RunContext::~RunContext() {\n        m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, aborting()));\n    }\n\n    void RunContext::testGroupStarting(std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount) {\n        m_reporter->testGroupStarting(GroupInfo(testSpec, groupIndex, groupsCount));\n    }\n\n    void RunContext::testGroupEnded(std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount) {\n        m_reporter->testGroupEnded(TestGroupStats(GroupInfo(testSpec, groupIndex, groupsCount), totals, aborting()));\n    }\n\n    Totals RunContext::runTest(TestCase const& testCase) {\n        Totals prevTotals = m_totals;\n\n        std::string redirectedCout;\n        std::string redirectedCerr;\n\n        auto const& testInfo = testCase.getTestCaseInfo();\n\n        m_reporter->testCaseStarting(testInfo);\n\n        m_activeTestCase = &testCase;\n\n        ITracker& rootTracker = m_trackerContext.startRun();\n        assert(rootTracker.isSectionTracker());\n        static_cast<SectionTracker&>(rootTracker).addInitialFilters(m_config->getSectionsToRun());\n        do {\n            m_trackerContext.startCycle();\n            m_testCaseTracker = &SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(testInfo.name, testInfo.lineInfo));\n            runCurrentTest(redirectedCout, redirectedCerr);\n        } while (!m_testCaseTracker->isSuccessfullyCompleted() && !aborting());\n\n        Totals deltaTotals = m_totals.delta(prevTotals);\n        if (testInfo.expectedToFail() && deltaTotals.testCases.passed > 0) {\n            deltaTotals.assertions.failed++;\n            deltaTotals.testCases.passed--;\n            deltaTotals.testCases.failed++;\n        }\n        m_totals.testCases += deltaTotals.testCases;\n        m_reporter->testCaseEnded(TestCaseStats(testInfo,\n                                  deltaTotals,\n                                  redirectedCout,\n                                  redirectedCerr,\n                                  aborting()));\n\n        m_activeTestCase = nullptr;\n        m_testCaseTracker = nullptr;\n\n        return deltaTotals;\n    }\n\n    IConfigPtr RunContext::config() const {\n        return m_config;\n    }\n\n    IStreamingReporter& RunContext::reporter() const {\n        return *m_reporter;\n    }\n\n    void RunContext::assertionEnded(AssertionResult const & result) {\n        if (result.getResultType() == ResultWas::Ok) {\n            m_totals.assertions.passed++;\n            m_lastAssertionPassed = true;\n        } else if (!result.isOk()) {\n            m_lastAssertionPassed = false;\n            if( m_activeTestCase->getTestCaseInfo().okToFail() )\n                m_totals.assertions.failedButOk++;\n            else\n                m_totals.assertions.failed++;\n        }\n        else {\n            m_lastAssertionPassed = true;\n        }\n\n        // We have no use for the return value (whether messages should be cleared), because messages were made scoped\n        // and should be let to clear themselves out.\n        static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));\n\n        if (result.getResultType() != ResultWas::Warning)\n            m_messageScopes.clear();\n\n        // Reset working state\n        resetAssertionInfo();\n        m_lastResult = result;\n    }\n    void RunContext::resetAssertionInfo() {\n        m_lastAssertionInfo.macroName = StringRef();\n        m_lastAssertionInfo.capturedExpression = \"{Unknown expression after the reported line}\"_sr;\n    }\n\n    bool RunContext::sectionStarted(SectionInfo const & sectionInfo, Counts & assertions) {\n        ITracker& sectionTracker = SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(sectionInfo.name, sectionInfo.lineInfo));\n        if (!sectionTracker.isOpen())\n            return false;\n        m_activeSections.push_back(&sectionTracker);\n\n        m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;\n\n        m_reporter->sectionStarting(sectionInfo);\n\n        assertions = m_totals.assertions;\n\n        return true;\n    }\n    auto RunContext::acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {\n        using namespace Generators;\n        GeneratorTracker& tracker = GeneratorTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( \"generator\", lineInfo ) );\n        assert( tracker.isOpen() );\n        m_lastAssertionInfo.lineInfo = lineInfo;\n        return tracker;\n    }\n\n    bool RunContext::testForMissingAssertions(Counts& assertions) {\n        if (assertions.total() != 0)\n            return false;\n        if (!m_config->warnAboutMissingAssertions())\n            return false;\n        if (m_trackerContext.currentTracker().hasChildren())\n            return false;\n        m_totals.assertions.failed++;\n        assertions.failed++;\n        return true;\n    }\n\n    void RunContext::sectionEnded(SectionEndInfo const & endInfo) {\n        Counts assertions = m_totals.assertions - endInfo.prevAssertions;\n        bool missingAssertions = testForMissingAssertions(assertions);\n\n        if (!m_activeSections.empty()) {\n            m_activeSections.back()->close();\n            m_activeSections.pop_back();\n        }\n\n        m_reporter->sectionEnded(SectionStats(endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions));\n        m_messages.clear();\n        m_messageScopes.clear();\n    }\n\n    void RunContext::sectionEndedEarly(SectionEndInfo const & endInfo) {\n        if (m_unfinishedSections.empty())\n            m_activeSections.back()->fail();\n        else\n            m_activeSections.back()->close();\n        m_activeSections.pop_back();\n\n        m_unfinishedSections.push_back(endInfo);\n    }\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    void RunContext::benchmarkPreparing(std::string const& name) {\n\t\tm_reporter->benchmarkPreparing(name);\n\t}\n    void RunContext::benchmarkStarting( BenchmarkInfo const& info ) {\n        m_reporter->benchmarkStarting( info );\n    }\n    void RunContext::benchmarkEnded( BenchmarkStats<> const& stats ) {\n        m_reporter->benchmarkEnded( stats );\n    }\n\tvoid RunContext::benchmarkFailed(std::string const & error) {\n\t\tm_reporter->benchmarkFailed(error);\n\t}\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    void RunContext::pushScopedMessage(MessageInfo const & message) {\n        m_messages.push_back(message);\n    }\n\n    void RunContext::popScopedMessage(MessageInfo const & message) {\n        m_messages.erase(std::remove(m_messages.begin(), m_messages.end(), message), m_messages.end());\n    }\n\n    void RunContext::emplaceUnscopedMessage( MessageBuilder const& builder ) {\n        m_messageScopes.emplace_back( builder );\n    }\n\n    std::string RunContext::getCurrentTestName() const {\n        return m_activeTestCase\n            ? m_activeTestCase->getTestCaseInfo().name\n            : std::string();\n    }\n\n    const AssertionResult * RunContext::getLastResult() const {\n        return &(*m_lastResult);\n    }\n\n    void RunContext::exceptionEarlyReported() {\n        m_shouldReportUnexpected = false;\n    }\n\n    void RunContext::handleFatalErrorCondition( StringRef message ) {\n        // First notify reporter that bad things happened\n        m_reporter->fatalErrorEncountered(message);\n\n        // Don't rebuild the result -- the stringification itself can cause more fatal errors\n        // Instead, fake a result data.\n        AssertionResultData tempResult( ResultWas::FatalErrorCondition, { false } );\n        tempResult.message = message;\n        AssertionResult result(m_lastAssertionInfo, tempResult);\n\n        assertionEnded(result);\n\n        handleUnfinishedSections();\n\n        // Recreate section for test case (as we will lose the one that was in scope)\n        auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();\n        SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);\n\n        Counts assertions;\n        assertions.failed = 1;\n        SectionStats testCaseSectionStats(testCaseSection, assertions, 0, false);\n        m_reporter->sectionEnded(testCaseSectionStats);\n\n        auto const& testInfo = m_activeTestCase->getTestCaseInfo();\n\n        Totals deltaTotals;\n        deltaTotals.testCases.failed = 1;\n        deltaTotals.assertions.failed = 1;\n        m_reporter->testCaseEnded(TestCaseStats(testInfo,\n                                  deltaTotals,\n                                  std::string(),\n                                  std::string(),\n                                  false));\n        m_totals.testCases.failed++;\n        testGroupEnded(std::string(), m_totals, 1, 1);\n        m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false));\n    }\n\n    bool RunContext::lastAssertionPassed() {\n         return m_lastAssertionPassed;\n    }\n\n    void RunContext::assertionPassed() {\n        m_lastAssertionPassed = true;\n        ++m_totals.assertions.passed;\n        resetAssertionInfo();\n        m_messageScopes.clear();\n    }\n\n    bool RunContext::aborting() const {\n        return m_totals.assertions.failed >= static_cast<std::size_t>(m_config->abortAfter());\n    }\n\n    void RunContext::runCurrentTest(std::string & redirectedCout, std::string & redirectedCerr) {\n        auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();\n        SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);\n        m_reporter->sectionStarting(testCaseSection);\n        Counts prevAssertions = m_totals.assertions;\n        double duration = 0;\n        m_shouldReportUnexpected = true;\n        m_lastAssertionInfo = { \"TEST_CASE\"_sr, testCaseInfo.lineInfo, StringRef(), ResultDisposition::Normal };\n\n        seedRng(*m_config);\n\n        Timer timer;\n        CATCH_TRY {\n            if (m_reporter->getPreferences().shouldRedirectStdOut) {\n#if !defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)\n                RedirectedStreams redirectedStreams(redirectedCout, redirectedCerr);\n\n                timer.start();\n                invokeActiveTestCase();\n#else\n                OutputRedirect r(redirectedCout, redirectedCerr);\n                timer.start();\n                invokeActiveTestCase();\n#endif\n            } else {\n                timer.start();\n                invokeActiveTestCase();\n            }\n            duration = timer.getElapsedSeconds();\n        } CATCH_CATCH_ANON (TestFailureException&) {\n            // This just means the test was aborted due to failure\n        } CATCH_CATCH_ALL {\n            // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions\n            // are reported without translation at the point of origin.\n            if( m_shouldReportUnexpected ) {\n                AssertionReaction dummyReaction;\n                handleUnexpectedInflightException( m_lastAssertionInfo, translateActiveException(), dummyReaction );\n            }\n        }\n        Counts assertions = m_totals.assertions - prevAssertions;\n        bool missingAssertions = testForMissingAssertions(assertions);\n\n        m_testCaseTracker->close();\n        handleUnfinishedSections();\n        m_messages.clear();\n        m_messageScopes.clear();\n\n        SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions);\n        m_reporter->sectionEnded(testCaseSectionStats);\n    }\n\n    void RunContext::invokeActiveTestCase() {\n        FatalConditionHandler fatalConditionHandler; // Handle signals\n        m_activeTestCase->invoke();\n        fatalConditionHandler.reset();\n    }\n\n    void RunContext::handleUnfinishedSections() {\n        // If sections ended prematurely due to an exception we stored their\n        // infos here so we can tear them down outside the unwind process.\n        for (auto it = m_unfinishedSections.rbegin(),\n             itEnd = m_unfinishedSections.rend();\n             it != itEnd;\n             ++it)\n            sectionEnded(*it);\n        m_unfinishedSections.clear();\n    }\n\n    void RunContext::handleExpr(\n        AssertionInfo const& info,\n        ITransientExpression const& expr,\n        AssertionReaction& reaction\n    ) {\n        m_reporter->assertionStarting( info );\n\n        bool negated = isFalseTest( info.resultDisposition );\n        bool result = expr.getResult() != negated;\n\n        if( result ) {\n            if (!m_includeSuccessfulResults) {\n                assertionPassed();\n            }\n            else {\n                reportExpr(info, ResultWas::Ok, &expr, negated);\n            }\n        }\n        else {\n            reportExpr(info, ResultWas::ExpressionFailed, &expr, negated );\n            populateReaction( reaction );\n        }\n    }\n    void RunContext::reportExpr(\n            AssertionInfo const &info,\n            ResultWas::OfType resultType,\n            ITransientExpression const *expr,\n            bool negated ) {\n\n        m_lastAssertionInfo = info;\n        AssertionResultData data( resultType, LazyExpression( negated ) );\n\n        AssertionResult assertionResult{ info, data };\n        assertionResult.m_resultData.lazyExpression.m_transientExpression = expr;\n\n        assertionEnded( assertionResult );\n    }\n\n    void RunContext::handleMessage(\n            AssertionInfo const& info,\n            ResultWas::OfType resultType,\n            StringRef const& message,\n            AssertionReaction& reaction\n    ) {\n        m_reporter->assertionStarting( info );\n\n        m_lastAssertionInfo = info;\n\n        AssertionResultData data( resultType, LazyExpression( false ) );\n        data.message = message;\n        AssertionResult assertionResult{ m_lastAssertionInfo, data };\n        assertionEnded( assertionResult );\n        if( !assertionResult.isOk() )\n            populateReaction( reaction );\n    }\n    void RunContext::handleUnexpectedExceptionNotThrown(\n            AssertionInfo const& info,\n            AssertionReaction& reaction\n    ) {\n        handleNonExpr(info, Catch::ResultWas::DidntThrowException, reaction);\n    }\n\n    void RunContext::handleUnexpectedInflightException(\n            AssertionInfo const& info,\n            std::string const& message,\n            AssertionReaction& reaction\n    ) {\n        m_lastAssertionInfo = info;\n\n        AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) );\n        data.message = message;\n        AssertionResult assertionResult{ info, data };\n        assertionEnded( assertionResult );\n        populateReaction( reaction );\n    }\n\n    void RunContext::populateReaction( AssertionReaction& reaction ) {\n        reaction.shouldDebugBreak = m_config->shouldDebugBreak();\n        reaction.shouldThrow = aborting() || (m_lastAssertionInfo.resultDisposition & ResultDisposition::Normal);\n    }\n\n    void RunContext::handleIncomplete(\n            AssertionInfo const& info\n    ) {\n        m_lastAssertionInfo = info;\n\n        AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) );\n        data.message = \"Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE\";\n        AssertionResult assertionResult{ info, data };\n        assertionEnded( assertionResult );\n    }\n    void RunContext::handleNonExpr(\n            AssertionInfo const &info,\n            ResultWas::OfType resultType,\n            AssertionReaction &reaction\n    ) {\n        m_lastAssertionInfo = info;\n\n        AssertionResultData data( resultType, LazyExpression( false ) );\n        AssertionResult assertionResult{ info, data };\n        assertionEnded( assertionResult );\n\n        if( !assertionResult.isOk() )\n            populateReaction( reaction );\n    }\n\n    IResultCapture& getResultCapture() {\n        if (auto* capture = getCurrentContext().getResultCapture())\n            return *capture;\n        else\n            CATCH_INTERNAL_ERROR(\"No result capture instance\");\n    }\n}\n// end catch_run_context.cpp\n// start catch_section.cpp\n\nnamespace Catch {\n\n    Section::Section( SectionInfo const& info )\n    :   m_info( info ),\n        m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) )\n    {\n        m_timer.start();\n    }\n\n    Section::~Section() {\n        if( m_sectionIncluded ) {\n            SectionEndInfo endInfo{ m_info, m_assertions, m_timer.getElapsedSeconds() };\n            if( uncaught_exceptions() )\n                getResultCapture().sectionEndedEarly( endInfo );\n            else\n                getResultCapture().sectionEnded( endInfo );\n        }\n    }\n\n    // This indicates whether the section should be executed or not\n    Section::operator bool() const {\n        return m_sectionIncluded;\n    }\n\n} // end namespace Catch\n// end catch_section.cpp\n// start catch_section_info.cpp\n\nnamespace Catch {\n\n    SectionInfo::SectionInfo\n        (   SourceLineInfo const& _lineInfo,\n            std::string const& _name )\n    :   name( _name ),\n        lineInfo( _lineInfo )\n    {}\n\n} // end namespace Catch\n// end catch_section_info.cpp\n// start catch_session.cpp\n\n// start catch_session.h\n\n#include <memory>\n\nnamespace Catch {\n\n    class Session : NonCopyable {\n    public:\n\n        Session();\n        ~Session() override;\n\n        void showHelp() const;\n        void libIdentify();\n\n        int applyCommandLine( int argc, char const * const * argv );\n    #if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(UNICODE)\n        int applyCommandLine( int argc, wchar_t const * const * argv );\n    #endif\n\n        void useConfigData( ConfigData const& configData );\n\n        template<typename CharT>\n        int run(int argc, CharT const * const argv[]) {\n            if (m_startupExceptions)\n                return 1;\n            int returnCode = applyCommandLine(argc, argv);\n            if (returnCode == 0)\n                returnCode = run();\n            return returnCode;\n        }\n\n        int run();\n\n        clara::Parser const& cli() const;\n        void cli( clara::Parser const& newParser );\n        ConfigData& configData();\n        Config& config();\n    private:\n        int runInternal();\n\n        clara::Parser m_cli;\n        ConfigData m_configData;\n        std::shared_ptr<Config> m_config;\n        bool m_startupExceptions = false;\n    };\n\n} // end namespace Catch\n\n// end catch_session.h\n// start catch_version.h\n\n#include <iosfwd>\n\nnamespace Catch {\n\n    // Versioning information\n    struct Version {\n        Version( Version const& ) = delete;\n        Version& operator=( Version const& ) = delete;\n        Version(    unsigned int _majorVersion,\n                    unsigned int _minorVersion,\n                    unsigned int _patchNumber,\n                    char const * const _branchName,\n                    unsigned int _buildNumber );\n\n        unsigned int const majorVersion;\n        unsigned int const minorVersion;\n        unsigned int const patchNumber;\n\n        // buildNumber is only used if branchName is not null\n        char const * const branchName;\n        unsigned int const buildNumber;\n\n        friend std::ostream& operator << ( std::ostream& os, Version const& version );\n    };\n\n    Version const& libraryVersion();\n}\n\n// end catch_version.h\n#include <cstdlib>\n#include <iomanip>\n\nnamespace Catch {\n\n    namespace {\n        const int MaxExitCode = 255;\n\n        IStreamingReporterPtr createReporter(std::string const& reporterName, IConfigPtr const& config) {\n            auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, config);\n            CATCH_ENFORCE(reporter, \"No reporter registered with name: '\" << reporterName << \"'\");\n\n            return reporter;\n        }\n\n        IStreamingReporterPtr makeReporter(std::shared_ptr<Config> const& config) {\n            if (Catch::getRegistryHub().getReporterRegistry().getListeners().empty()) {\n                return createReporter(config->getReporterName(), config);\n            }\n\n            // On older platforms, returning std::unique_ptr<ListeningReporter>\n            // when the return type is std::unique_ptr<IStreamingReporter>\n            // doesn't compile without a std::move call. However, this causes\n            // a warning on newer platforms. Thus, we have to work around\n            // it a bit and downcast the pointer manually.\n            auto ret = std::unique_ptr<IStreamingReporter>(new ListeningReporter);\n            auto& multi = static_cast<ListeningReporter&>(*ret);\n            auto const& listeners = Catch::getRegistryHub().getReporterRegistry().getListeners();\n            for (auto const& listener : listeners) {\n                multi.addListener(listener->create(Catch::ReporterConfig(config)));\n            }\n            multi.addReporter(createReporter(config->getReporterName(), config));\n            return ret;\n        }\n\n        Catch::Totals runTests(std::shared_ptr<Config> const& config) {\n            auto reporter = makeReporter(config);\n\n            RunContext context(config, std::move(reporter));\n\n            Totals totals;\n\n            context.testGroupStarting(config->name(), 1, 1);\n\n            TestSpec testSpec = config->testSpec();\n\n            auto const& allTestCases = getAllTestCasesSorted(*config);\n            for (auto const& testCase : allTestCases) {\n                bool matching = (!testSpec.hasFilters() && !testCase.isHidden()) ||\n                                 (testSpec.hasFilters() && matchTest(testCase, testSpec, *config));\n\n                if (!context.aborting() && matching)\n                    totals += context.runTest(testCase);\n                else\n                    context.reporter().skipTest(testCase);\n            }\n\n            if (config->warnAboutNoTests() && totals.testCases.total() == 0) {\n                ReusableStringStream testConfig;\n\n                bool first = true;\n                for (const auto& input : config->getTestsOrTags()) {\n                    if (!first) { testConfig << ' '; }\n                    first = false;\n                    testConfig << input;\n                }\n\n                context.reporter().noMatchingTestCases(testConfig.str());\n                totals.error = -1;\n            }\n\n            context.testGroupEnded(config->name(), totals, 1, 1);\n            return totals;\n        }\n\n        void applyFilenamesAsTags(Catch::IConfig const& config) {\n            auto& tests = const_cast<std::vector<TestCase>&>(getAllTestCasesSorted(config));\n            for (auto& testCase : tests) {\n                auto tags = testCase.tags;\n\n                std::string filename = testCase.lineInfo.file;\n                auto lastSlash = filename.find_last_of(\"\\\\/\");\n                if (lastSlash != std::string::npos) {\n                    filename.erase(0, lastSlash);\n                    filename[0] = '#';\n                }\n\n                auto lastDot = filename.find_last_of('.');\n                if (lastDot != std::string::npos) {\n                    filename.erase(lastDot);\n                }\n\n                tags.push_back(std::move(filename));\n                setTags(testCase, tags);\n            }\n        }\n\n    } // anon namespace\n\n    Session::Session() {\n        static bool alreadyInstantiated = false;\n        if( alreadyInstantiated ) {\n            CATCH_TRY { CATCH_INTERNAL_ERROR( \"Only one instance of Catch::Session can ever be used\" ); }\n            CATCH_CATCH_ALL { getMutableRegistryHub().registerStartupException(); }\n        }\n\n        // There cannot be exceptions at startup in no-exception mode.\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n        const auto& exceptions = getRegistryHub().getStartupExceptionRegistry().getExceptions();\n        if ( !exceptions.empty() ) {\n            config();\n            getCurrentMutableContext().setConfig(m_config);\n\n            m_startupExceptions = true;\n            Colour colourGuard( Colour::Red );\n            Catch::cerr() << \"Errors occurred during startup!\" << '\\n';\n            // iterate over all exceptions and notify user\n            for ( const auto& ex_ptr : exceptions ) {\n                try {\n                    std::rethrow_exception(ex_ptr);\n                } catch ( std::exception const& ex ) {\n                    Catch::cerr() << Column( ex.what() ).indent(2) << '\\n';\n                }\n            }\n        }\n#endif\n\n        alreadyInstantiated = true;\n        m_cli = makeCommandLineParser( m_configData );\n    }\n    Session::~Session() {\n        Catch::cleanUp();\n    }\n\n    void Session::showHelp() const {\n        Catch::cout()\n                << \"\\nCatch v\" << libraryVersion() << \"\\n\"\n                << m_cli << std::endl\n                << \"For more detailed usage please see the project docs\\n\" << std::endl;\n    }\n    void Session::libIdentify() {\n        Catch::cout()\n                << std::left << std::setw(16) << \"description: \" << \"A Catch test executable\\n\"\n                << std::left << std::setw(16) << \"category: \" << \"testframework\\n\"\n                << std::left << std::setw(16) << \"framework: \" << \"Catch Test\\n\"\n                << std::left << std::setw(16) << \"version: \" << libraryVersion() << std::endl;\n    }\n\n    int Session::applyCommandLine( int argc, char const * const * argv ) {\n        if( m_startupExceptions )\n            return 1;\n\n        auto result = m_cli.parse( clara::Args( argc, argv ) );\n        if( !result ) {\n            config();\n            getCurrentMutableContext().setConfig(m_config);\n            Catch::cerr()\n                << Colour( Colour::Red )\n                << \"\\nError(s) in input:\\n\"\n                << Column( result.errorMessage() ).indent( 2 )\n                << \"\\n\\n\";\n            Catch::cerr() << \"Run with -? for usage\\n\" << std::endl;\n            return MaxExitCode;\n        }\n\n        if( m_configData.showHelp )\n            showHelp();\n        if( m_configData.libIdentify )\n            libIdentify();\n        m_config.reset();\n        return 0;\n    }\n\n#if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(UNICODE)\n    int Session::applyCommandLine( int argc, wchar_t const * const * argv ) {\n\n        char **utf8Argv = new char *[ argc ];\n\n        for ( int i = 0; i < argc; ++i ) {\n            int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL );\n\n            utf8Argv[ i ] = new char[ bufSize ];\n\n            WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL );\n        }\n\n        int returnCode = applyCommandLine( argc, utf8Argv );\n\n        for ( int i = 0; i < argc; ++i )\n            delete [] utf8Argv[ i ];\n\n        delete [] utf8Argv;\n\n        return returnCode;\n    }\n#endif\n\n    void Session::useConfigData( ConfigData const& configData ) {\n        m_configData = configData;\n        m_config.reset();\n    }\n\n    int Session::run() {\n        if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeStart ) != 0 ) {\n            Catch::cout() << \"...waiting for enter/ return before starting\" << std::endl;\n            static_cast<void>(std::getchar());\n        }\n        int exitCode = runInternal();\n        if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeExit ) != 0 ) {\n            Catch::cout() << \"...waiting for enter/ return before exiting, with code: \" << exitCode << std::endl;\n            static_cast<void>(std::getchar());\n        }\n        return exitCode;\n    }\n\n    clara::Parser const& Session::cli() const {\n        return m_cli;\n    }\n    void Session::cli( clara::Parser const& newParser ) {\n        m_cli = newParser;\n    }\n    ConfigData& Session::configData() {\n        return m_configData;\n    }\n    Config& Session::config() {\n        if( !m_config )\n            m_config = std::make_shared<Config>( m_configData );\n        return *m_config;\n    }\n\n    int Session::runInternal() {\n        if( m_startupExceptions )\n            return 1;\n\n        if (m_configData.showHelp || m_configData.libIdentify) {\n            return 0;\n        }\n\n        CATCH_TRY {\n            config(); // Force config to be constructed\n\n            seedRng( *m_config );\n\n            if( m_configData.filenamesAsTags )\n                applyFilenamesAsTags( *m_config );\n\n            // Handle list request\n            if( Option<std::size_t> listed = list( m_config ) )\n                return static_cast<int>( *listed );\n\n            auto totals = runTests( m_config );\n            // Note that on unices only the lower 8 bits are usually used, clamping\n            // the return value to 255 prevents false negative when some multiple\n            // of 256 tests has failed\n            return (std::min) (MaxExitCode, (std::max) (totals.error, static_cast<int>(totals.assertions.failed)));\n        }\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n        catch( std::exception& ex ) {\n            Catch::cerr() << ex.what() << std::endl;\n            return MaxExitCode;\n        }\n#endif\n    }\n\n} // end namespace Catch\n// end catch_session.cpp\n// start catch_singletons.cpp\n\n#include <vector>\n\nnamespace Catch {\n\n    namespace {\n        static auto getSingletons() -> std::vector<ISingleton*>*& {\n            static std::vector<ISingleton*>* g_singletons = nullptr;\n            if( !g_singletons )\n                g_singletons = new std::vector<ISingleton*>();\n            return g_singletons;\n        }\n    }\n\n    ISingleton::~ISingleton() {}\n\n    void addSingleton(ISingleton* singleton ) {\n        getSingletons()->push_back( singleton );\n    }\n    void cleanupSingletons() {\n        auto& singletons = getSingletons();\n        for( auto singleton : *singletons )\n            delete singleton;\n        delete singletons;\n        singletons = nullptr;\n    }\n\n} // namespace Catch\n// end catch_singletons.cpp\n// start catch_startup_exception_registry.cpp\n\nnamespace Catch {\nvoid StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept {\n        CATCH_TRY {\n            m_exceptions.push_back(exception);\n        } CATCH_CATCH_ALL {\n            // If we run out of memory during start-up there's really not a lot more we can do about it\n            std::terminate();\n        }\n    }\n\n    std::vector<std::exception_ptr> const& StartupExceptionRegistry::getExceptions() const noexcept {\n        return m_exceptions;\n    }\n\n} // end namespace Catch\n// end catch_startup_exception_registry.cpp\n// start catch_stream.cpp\n\n#include <cstdio>\n#include <iostream>\n#include <fstream>\n#include <sstream>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    Catch::IStream::~IStream() = default;\n\n    namespace Detail { namespace {\n        template<typename WriterF, std::size_t bufferSize=256>\n        class StreamBufImpl : public std::streambuf {\n            char data[bufferSize];\n            WriterF m_writer;\n\n        public:\n            StreamBufImpl() {\n                setp( data, data + sizeof(data) );\n            }\n\n            ~StreamBufImpl() noexcept {\n                StreamBufImpl::sync();\n            }\n\n        private:\n            int overflow( int c ) override {\n                sync();\n\n                if( c != EOF ) {\n                    if( pbase() == epptr() )\n                        m_writer( std::string( 1, static_cast<char>( c ) ) );\n                    else\n                        sputc( static_cast<char>( c ) );\n                }\n                return 0;\n            }\n\n            int sync() override {\n                if( pbase() != pptr() ) {\n                    m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) );\n                    setp( pbase(), epptr() );\n                }\n                return 0;\n            }\n        };\n\n        ///////////////////////////////////////////////////////////////////////////\n\n        struct OutputDebugWriter {\n\n            void operator()( std::string const&str ) {\n                writeToDebugConsole( str );\n            }\n        };\n\n        ///////////////////////////////////////////////////////////////////////////\n\n        class FileStream : public IStream {\n            mutable std::ofstream m_ofs;\n        public:\n            FileStream( StringRef filename ) {\n                m_ofs.open( filename.c_str() );\n                CATCH_ENFORCE( !m_ofs.fail(), \"Unable to open file: '\" << filename << \"'\" );\n            }\n            ~FileStream() override = default;\n        public: // IStream\n            std::ostream& stream() const override {\n                return m_ofs;\n            }\n        };\n\n        ///////////////////////////////////////////////////////////////////////////\n\n        class CoutStream : public IStream {\n            mutable std::ostream m_os;\n        public:\n            // Store the streambuf from cout up-front because\n            // cout may get redirected when running tests\n            CoutStream() : m_os( Catch::cout().rdbuf() ) {}\n            ~CoutStream() override = default;\n\n        public: // IStream\n            std::ostream& stream() const override { return m_os; }\n        };\n\n        ///////////////////////////////////////////////////////////////////////////\n\n        class DebugOutStream : public IStream {\n            std::unique_ptr<StreamBufImpl<OutputDebugWriter>> m_streamBuf;\n            mutable std::ostream m_os;\n        public:\n            DebugOutStream()\n            :   m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ),\n                m_os( m_streamBuf.get() )\n            {}\n\n            ~DebugOutStream() override = default;\n\n        public: // IStream\n            std::ostream& stream() const override { return m_os; }\n        };\n\n    }} // namespace anon::detail\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    auto makeStream( StringRef const &filename ) -> IStream const* {\n        if( filename.empty() )\n            return new Detail::CoutStream();\n        else if( filename[0] == '%' ) {\n            if( filename == \"%debug\" )\n                return new Detail::DebugOutStream();\n            else\n                CATCH_ERROR( \"Unrecognised stream: '\" << filename << \"'\" );\n        }\n        else\n            return new Detail::FileStream( filename );\n    }\n\n    // This class encapsulates the idea of a pool of ostringstreams that can be reused.\n    struct StringStreams {\n        std::vector<std::unique_ptr<std::ostringstream>> m_streams;\n        std::vector<std::size_t> m_unused;\n        std::ostringstream m_referenceStream; // Used for copy state/ flags from\n\n        auto add() -> std::size_t {\n            if( m_unused.empty() ) {\n                m_streams.push_back( std::unique_ptr<std::ostringstream>( new std::ostringstream ) );\n                return m_streams.size()-1;\n            }\n            else {\n                auto index = m_unused.back();\n                m_unused.pop_back();\n                return index;\n            }\n        }\n\n        void release( std::size_t index ) {\n            m_streams[index]->copyfmt( m_referenceStream ); // Restore initial flags and other state\n            m_unused.push_back(index);\n        }\n    };\n\n    ReusableStringStream::ReusableStringStream()\n    :   m_index( Singleton<StringStreams>::getMutable().add() ),\n        m_oss( Singleton<StringStreams>::getMutable().m_streams[m_index].get() )\n    {}\n\n    ReusableStringStream::~ReusableStringStream() {\n        static_cast<std::ostringstream*>( m_oss )->str(\"\");\n        m_oss->clear();\n        Singleton<StringStreams>::getMutable().release( m_index );\n    }\n\n    auto ReusableStringStream::str() const -> std::string {\n        return static_cast<std::ostringstream*>( m_oss )->str();\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n\n#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions\n    std::ostream& cout() { return std::cout; }\n    std::ostream& cerr() { return std::cerr; }\n    std::ostream& clog() { return std::clog; }\n#endif\n}\n// end catch_stream.cpp\n// start catch_string_manip.cpp\n\n#include <algorithm>\n#include <ostream>\n#include <cstring>\n#include <cctype>\n#include <vector>\n\nnamespace Catch {\n\n    namespace {\n        char toLowerCh(char c) {\n            return static_cast<char>( std::tolower( c ) );\n        }\n    }\n\n    bool startsWith( std::string const& s, std::string const& prefix ) {\n        return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin());\n    }\n    bool startsWith( std::string const& s, char prefix ) {\n        return !s.empty() && s[0] == prefix;\n    }\n    bool endsWith( std::string const& s, std::string const& suffix ) {\n        return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin());\n    }\n    bool endsWith( std::string const& s, char suffix ) {\n        return !s.empty() && s[s.size()-1] == suffix;\n    }\n    bool contains( std::string const& s, std::string const& infix ) {\n        return s.find( infix ) != std::string::npos;\n    }\n    void toLowerInPlace( std::string& s ) {\n        std::transform( s.begin(), s.end(), s.begin(), toLowerCh );\n    }\n    std::string toLower( std::string const& s ) {\n        std::string lc = s;\n        toLowerInPlace( lc );\n        return lc;\n    }\n    std::string trim( std::string const& str ) {\n        static char const* whitespaceChars = \"\\n\\r\\t \";\n        std::string::size_type start = str.find_first_not_of( whitespaceChars );\n        std::string::size_type end = str.find_last_not_of( whitespaceChars );\n\n        return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string();\n    }\n\n    bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {\n        bool replaced = false;\n        std::size_t i = str.find( replaceThis );\n        while( i != std::string::npos ) {\n            replaced = true;\n            str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() );\n            if( i < str.size()-withThis.size() )\n                i = str.find( replaceThis, i+withThis.size() );\n            else\n                i = std::string::npos;\n        }\n        return replaced;\n    }\n\n    std::vector<StringRef> splitStringRef( StringRef str, char delimiter ) {\n        std::vector<StringRef> subStrings;\n        std::size_t start = 0;\n        for(std::size_t pos = 0; pos < str.size(); ++pos ) {\n            if( str[pos] == delimiter ) {\n                if( pos - start > 1 )\n                    subStrings.push_back( str.substr( start, pos-start ) );\n                start = pos+1;\n            }\n        }\n        if( start < str.size() )\n            subStrings.push_back( str.substr( start, str.size()-start ) );\n        return subStrings;\n    }\n\n    pluralise::pluralise( std::size_t count, std::string const& label )\n    :   m_count( count ),\n        m_label( label )\n    {}\n\n    std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) {\n        os << pluraliser.m_count << ' ' << pluraliser.m_label;\n        if( pluraliser.m_count != 1 )\n            os << 's';\n        return os;\n    }\n\n}\n// end catch_string_manip.cpp\n// start catch_stringref.cpp\n\n#if defined(__clang__)\n#    pragma clang diagnostic push\n#    pragma clang diagnostic ignored \"-Wexit-time-destructors\"\n#endif\n\n#include <ostream>\n#include <cstring>\n#include <cstdint>\n\nnamespace {\n    const uint32_t byte_2_lead = 0xC0;\n    const uint32_t byte_3_lead = 0xE0;\n    const uint32_t byte_4_lead = 0xF0;\n}\n\nnamespace Catch {\n    StringRef::StringRef( char const* rawChars ) noexcept\n    : StringRef( rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars) ) )\n    {}\n\n    StringRef::operator std::string() const {\n        return std::string( m_start, m_size );\n    }\n\n    void StringRef::swap( StringRef& other ) noexcept {\n        std::swap( m_start, other.m_start );\n        std::swap( m_size, other.m_size );\n        std::swap( m_data, other.m_data );\n    }\n\n    auto StringRef::c_str() const -> char const* {\n        if( !isSubstring() )\n            return m_start;\n\n        const_cast<StringRef *>( this )->takeOwnership();\n        return m_data;\n    }\n    auto StringRef::currentData() const noexcept -> char const* {\n        return m_start;\n    }\n\n    auto StringRef::isOwned() const noexcept -> bool {\n        return m_data != nullptr;\n    }\n    auto StringRef::isSubstring() const noexcept -> bool {\n        return m_start[m_size] != '\\0';\n    }\n\n    void StringRef::takeOwnership() {\n        if( !isOwned() ) {\n            m_data = new char[m_size+1];\n            memcpy( m_data, m_start, m_size );\n            m_data[m_size] = '\\0';\n        }\n    }\n    auto StringRef::substr( size_type start, size_type size ) const noexcept -> StringRef {\n        if( start < m_size )\n            return StringRef( m_start+start, size );\n        else\n            return StringRef();\n    }\n    auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool {\n        return\n            size() == other.size() &&\n            (std::strncmp( m_start, other.m_start, size() ) == 0);\n    }\n    auto StringRef::operator != ( StringRef const& other ) const noexcept -> bool {\n        return !operator==( other );\n    }\n\n    auto StringRef::operator[](size_type index) const noexcept -> char {\n        return m_start[index];\n    }\n\n    auto StringRef::numberOfCharacters() const noexcept -> size_type {\n        size_type noChars = m_size;\n        // Make adjustments for uft encodings\n        for( size_type i=0; i < m_size; ++i ) {\n            char c = m_start[i];\n            if( ( c & byte_2_lead ) == byte_2_lead ) {\n                noChars--;\n                if (( c & byte_3_lead ) == byte_3_lead )\n                    noChars--;\n                if( ( c & byte_4_lead ) == byte_4_lead )\n                    noChars--;\n            }\n        }\n        return noChars;\n    }\n\n    auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string {\n        std::string str;\n        str.reserve( lhs.size() + rhs.size() );\n        str += lhs;\n        str += rhs;\n        return str;\n    }\n    auto operator + ( StringRef const& lhs, const char* rhs ) -> std::string {\n        return std::string( lhs ) + std::string( rhs );\n    }\n    auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string {\n        return std::string( lhs ) + std::string( rhs );\n    }\n\n    auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& {\n        return os.write(str.currentData(), str.size());\n    }\n\n    auto operator+=( std::string& lhs, StringRef const& rhs ) -> std::string& {\n        lhs.append(rhs.currentData(), rhs.size());\n        return lhs;\n    }\n\n} // namespace Catch\n\n#if defined(__clang__)\n#    pragma clang diagnostic pop\n#endif\n// end catch_stringref.cpp\n// start catch_tag_alias.cpp\n\nnamespace Catch {\n    TagAlias::TagAlias(std::string const & _tag, SourceLineInfo _lineInfo): tag(_tag), lineInfo(_lineInfo) {}\n}\n// end catch_tag_alias.cpp\n// start catch_tag_alias_autoregistrar.cpp\n\nnamespace Catch {\n\n    RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo) {\n        CATCH_TRY {\n            getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo);\n        } CATCH_CATCH_ALL {\n            // Do not throw when constructing global objects, instead register the exception to be processed later\n            getMutableRegistryHub().registerStartupException();\n        }\n    }\n\n}\n// end catch_tag_alias_autoregistrar.cpp\n// start catch_tag_alias_registry.cpp\n\n#include <sstream>\n\nnamespace Catch {\n\n    TagAliasRegistry::~TagAliasRegistry() {}\n\n    TagAlias const* TagAliasRegistry::find( std::string const& alias ) const {\n        auto it = m_registry.find( alias );\n        if( it != m_registry.end() )\n            return &(it->second);\n        else\n            return nullptr;\n    }\n\n    std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const {\n        std::string expandedTestSpec = unexpandedTestSpec;\n        for( auto const& registryKvp : m_registry ) {\n            std::size_t pos = expandedTestSpec.find( registryKvp.first );\n            if( pos != std::string::npos ) {\n                expandedTestSpec =  expandedTestSpec.substr( 0, pos ) +\n                                    registryKvp.second.tag +\n                                    expandedTestSpec.substr( pos + registryKvp.first.size() );\n            }\n        }\n        return expandedTestSpec;\n    }\n\n    void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) {\n        CATCH_ENFORCE( startsWith(alias, \"[@\") && endsWith(alias, ']'),\n                      \"error: tag alias, '\" << alias << \"' is not of the form [@alias name].\\n\" << lineInfo );\n\n        CATCH_ENFORCE( m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second,\n                      \"error: tag alias, '\" << alias << \"' already registered.\\n\"\n                      << \"\\tFirst seen at: \" << find(alias)->lineInfo << \"\\n\"\n                      << \"\\tRedefined at: \" << lineInfo );\n    }\n\n    ITagAliasRegistry::~ITagAliasRegistry() {}\n\n    ITagAliasRegistry const& ITagAliasRegistry::get() {\n        return getRegistryHub().getTagAliasRegistry();\n    }\n\n} // end namespace Catch\n// end catch_tag_alias_registry.cpp\n// start catch_test_case_info.cpp\n\n#include <cctype>\n#include <exception>\n#include <algorithm>\n#include <sstream>\n\nnamespace Catch {\n\n    namespace {\n        TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) {\n            if( startsWith( tag, '.' ) ||\n                tag == \"!hide\" )\n                return TestCaseInfo::IsHidden;\n            else if( tag == \"!throws\" )\n                return TestCaseInfo::Throws;\n            else if( tag == \"!shouldfail\" )\n                return TestCaseInfo::ShouldFail;\n            else if( tag == \"!mayfail\" )\n                return TestCaseInfo::MayFail;\n            else if( tag == \"!nonportable\" )\n                return TestCaseInfo::NonPortable;\n            else if( tag == \"!benchmark\" )\n                return static_cast<TestCaseInfo::SpecialProperties>( TestCaseInfo::Benchmark | TestCaseInfo::IsHidden );\n            else\n                return TestCaseInfo::None;\n        }\n        bool isReservedTag( std::string const& tag ) {\n            return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( static_cast<unsigned char>(tag[0]) );\n        }\n        void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) {\n            CATCH_ENFORCE( !isReservedTag(tag),\n                          \"Tag name: [\" << tag << \"] is not allowed.\\n\"\n                          << \"Tag names starting with non alphanumeric characters are reserved\\n\"\n                          << _lineInfo );\n        }\n    }\n\n    TestCase makeTestCase(  ITestInvoker* _testCase,\n                            std::string const& _className,\n                            NameAndTags const& nameAndTags,\n                            SourceLineInfo const& _lineInfo )\n    {\n        bool isHidden = false;\n\n        // Parse out tags\n        std::vector<std::string> tags;\n        std::string desc, tag;\n        bool inTag = false;\n        std::string _descOrTags = nameAndTags.tags;\n        for (char c : _descOrTags) {\n            if( !inTag ) {\n                if( c == '[' )\n                    inTag = true;\n                else\n                    desc += c;\n            }\n            else {\n                if( c == ']' ) {\n                    TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag );\n                    if( ( prop & TestCaseInfo::IsHidden ) != 0 )\n                        isHidden = true;\n                    else if( prop == TestCaseInfo::None )\n                        enforceNotReservedTag( tag, _lineInfo );\n\n                    // Merged hide tags like `[.approvals]` should be added as\n                    // `[.][approvals]`. The `[.]` is added at later point, so\n                    // we only strip the prefix\n                    if (startsWith(tag, '.') && tag.size() > 1) {\n                        tag.erase(0, 1);\n                    }\n                    tags.push_back( tag );\n                    tag.clear();\n                    inTag = false;\n                }\n                else\n                    tag += c;\n            }\n        }\n        if( isHidden ) {\n            tags.push_back( \".\" );\n        }\n\n        TestCaseInfo info( nameAndTags.name, _className, desc, tags, _lineInfo );\n        return TestCase( _testCase, std::move(info) );\n    }\n\n    void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags ) {\n        std::sort(begin(tags), end(tags));\n        tags.erase(std::unique(begin(tags), end(tags)), end(tags));\n        testCaseInfo.lcaseTags.clear();\n\n        for( auto const& tag : tags ) {\n            std::string lcaseTag = toLower( tag );\n            testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>( testCaseInfo.properties | parseSpecialTag( lcaseTag ) );\n            testCaseInfo.lcaseTags.push_back( lcaseTag );\n        }\n        testCaseInfo.tags = std::move(tags);\n    }\n\n    TestCaseInfo::TestCaseInfo( std::string const& _name,\n                                std::string const& _className,\n                                std::string const& _description,\n                                std::vector<std::string> const& _tags,\n                                SourceLineInfo const& _lineInfo )\n    :   name( _name ),\n        className( _className ),\n        description( _description ),\n        lineInfo( _lineInfo ),\n        properties( None )\n    {\n        setTags( *this, _tags );\n    }\n\n    bool TestCaseInfo::isHidden() const {\n        return ( properties & IsHidden ) != 0;\n    }\n    bool TestCaseInfo::throws() const {\n        return ( properties & Throws ) != 0;\n    }\n    bool TestCaseInfo::okToFail() const {\n        return ( properties & (ShouldFail | MayFail ) ) != 0;\n    }\n    bool TestCaseInfo::expectedToFail() const {\n        return ( properties & (ShouldFail ) ) != 0;\n    }\n\n    std::string TestCaseInfo::tagsAsString() const {\n        std::string ret;\n        // '[' and ']' per tag\n        std::size_t full_size = 2 * tags.size();\n        for (const auto& tag : tags) {\n            full_size += tag.size();\n        }\n        ret.reserve(full_size);\n        for (const auto& tag : tags) {\n            ret.push_back('[');\n            ret.append(tag);\n            ret.push_back(']');\n        }\n\n        return ret;\n    }\n\n    TestCase::TestCase( ITestInvoker* testCase, TestCaseInfo&& info ) : TestCaseInfo( std::move(info) ), test( testCase ) {}\n\n    TestCase TestCase::withName( std::string const& _newName ) const {\n        TestCase other( *this );\n        other.name = _newName;\n        return other;\n    }\n\n    void TestCase::invoke() const {\n        test->invoke();\n    }\n\n    bool TestCase::operator == ( TestCase const& other ) const {\n        return  test.get() == other.test.get() &&\n                name == other.name &&\n                className == other.className;\n    }\n\n    bool TestCase::operator < ( TestCase const& other ) const {\n        return name < other.name;\n    }\n\n    TestCaseInfo const& TestCase::getTestCaseInfo() const\n    {\n        return *this;\n    }\n\n} // end namespace Catch\n// end catch_test_case_info.cpp\n// start catch_test_case_registry_impl.cpp\n\n#include <sstream>\n\nnamespace Catch {\n\n    std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {\n\n        std::vector<TestCase> sorted = unsortedTestCases;\n\n        switch( config.runOrder() ) {\n            case RunTests::InLexicographicalOrder:\n                std::sort( sorted.begin(), sorted.end() );\n                break;\n            case RunTests::InRandomOrder:\n                seedRng( config );\n                std::shuffle( sorted.begin(), sorted.end(), rng() );\n                break;\n            case RunTests::InDeclarationOrder:\n                // already in declaration order\n                break;\n        }\n        return sorted;\n    }\n    bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) {\n        return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() );\n    }\n\n    void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) {\n        std::set<TestCase> seenFunctions;\n        for( auto const& function : functions ) {\n            auto prev = seenFunctions.insert( function );\n            CATCH_ENFORCE( prev.second,\n                    \"error: TEST_CASE( \\\"\" << function.name << \"\\\" ) already defined.\\n\"\n                    << \"\\tFirst seen at \" << prev.first->getTestCaseInfo().lineInfo << \"\\n\"\n                    << \"\\tRedefined at \" << function.getTestCaseInfo().lineInfo );\n        }\n    }\n\n    std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) {\n        std::vector<TestCase> filtered;\n        filtered.reserve( testCases.size() );\n        for (auto const& testCase : testCases) {\n            if ((!testSpec.hasFilters() && !testCase.isHidden()) ||\n                (testSpec.hasFilters() && matchTest(testCase, testSpec, config))) {\n                filtered.push_back(testCase);\n            }\n        }\n        return filtered;\n    }\n    std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) {\n        return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config );\n    }\n\n    void TestRegistry::registerTest( TestCase const& testCase ) {\n        std::string name = testCase.getTestCaseInfo().name;\n        if( name.empty() ) {\n            ReusableStringStream rss;\n            rss << \"Anonymous test case \" << ++m_unnamedCount;\n            return registerTest( testCase.withName( rss.str() ) );\n        }\n        m_functions.push_back( testCase );\n    }\n\n    std::vector<TestCase> const& TestRegistry::getAllTests() const {\n        return m_functions;\n    }\n    std::vector<TestCase> const& TestRegistry::getAllTestsSorted( IConfig const& config ) const {\n        if( m_sortedFunctions.empty() )\n            enforceNoDuplicateTestCases( m_functions );\n\n        if(  m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) {\n            m_sortedFunctions = sortTests( config, m_functions );\n            m_currentSortOrder = config.runOrder();\n        }\n        return m_sortedFunctions;\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    TestInvokerAsFunction::TestInvokerAsFunction( void(*testAsFunction)() ) noexcept : m_testAsFunction( testAsFunction ) {}\n\n    void TestInvokerAsFunction::invoke() const {\n        m_testAsFunction();\n    }\n\n    std::string extractClassName( StringRef const& classOrQualifiedMethodName ) {\n        std::string className = classOrQualifiedMethodName;\n        if( startsWith( className, '&' ) )\n        {\n            std::size_t lastColons = className.rfind( \"::\" );\n            std::size_t penultimateColons = className.rfind( \"::\", lastColons-1 );\n            if( penultimateColons == std::string::npos )\n                penultimateColons = 1;\n            className = className.substr( penultimateColons, lastColons-penultimateColons );\n        }\n        return className;\n    }\n\n} // end namespace Catch\n// end catch_test_case_registry_impl.cpp\n// start catch_test_case_tracker.cpp\n\n#include <algorithm>\n#include <cassert>\n#include <stdexcept>\n#include <memory>\n#include <sstream>\n\n#if defined(__clang__)\n#    pragma clang diagnostic push\n#    pragma clang diagnostic ignored \"-Wexit-time-destructors\"\n#endif\n\nnamespace Catch {\nnamespace TestCaseTracking {\n\n    NameAndLocation::NameAndLocation( std::string const& _name, SourceLineInfo const& _location )\n    :   name( _name ),\n        location( _location )\n    {}\n\n    ITracker::~ITracker() = default;\n\n    ITracker& TrackerContext::startRun() {\n        m_rootTracker = std::make_shared<SectionTracker>( NameAndLocation( \"{root}\", CATCH_INTERNAL_LINEINFO ), *this, nullptr );\n        m_currentTracker = nullptr;\n        m_runState = Executing;\n        return *m_rootTracker;\n    }\n\n    void TrackerContext::endRun() {\n        m_rootTracker.reset();\n        m_currentTracker = nullptr;\n        m_runState = NotStarted;\n    }\n\n    void TrackerContext::startCycle() {\n        m_currentTracker = m_rootTracker.get();\n        m_runState = Executing;\n    }\n    void TrackerContext::completeCycle() {\n        m_runState = CompletedCycle;\n    }\n\n    bool TrackerContext::completedCycle() const {\n        return m_runState == CompletedCycle;\n    }\n    ITracker& TrackerContext::currentTracker() {\n        return *m_currentTracker;\n    }\n    void TrackerContext::setCurrentTracker( ITracker* tracker ) {\n        m_currentTracker = tracker;\n    }\n\n    TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )\n    :   m_nameAndLocation( nameAndLocation ),\n        m_ctx( ctx ),\n        m_parent( parent )\n    {}\n\n    NameAndLocation const& TrackerBase::nameAndLocation() const {\n        return m_nameAndLocation;\n    }\n    bool TrackerBase::isComplete() const {\n        return m_runState == CompletedSuccessfully || m_runState == Failed;\n    }\n    bool TrackerBase::isSuccessfullyCompleted() const {\n        return m_runState == CompletedSuccessfully;\n    }\n    bool TrackerBase::isOpen() const {\n        return m_runState != NotStarted && !isComplete();\n    }\n    bool TrackerBase::hasChildren() const {\n        return !m_children.empty();\n    }\n\n    void TrackerBase::addChild( ITrackerPtr const& child ) {\n        m_children.push_back( child );\n    }\n\n    ITrackerPtr TrackerBase::findChild( NameAndLocation const& nameAndLocation ) {\n        auto it = std::find_if( m_children.begin(), m_children.end(),\n            [&nameAndLocation]( ITrackerPtr const& tracker ){\n                return\n                    tracker->nameAndLocation().location == nameAndLocation.location &&\n                    tracker->nameAndLocation().name == nameAndLocation.name;\n            } );\n        return( it != m_children.end() )\n            ? *it\n            : nullptr;\n    }\n    ITracker& TrackerBase::parent() {\n        assert( m_parent ); // Should always be non-null except for root\n        return *m_parent;\n    }\n\n    void TrackerBase::openChild() {\n        if( m_runState != ExecutingChildren ) {\n            m_runState = ExecutingChildren;\n            if( m_parent )\n                m_parent->openChild();\n        }\n    }\n\n    bool TrackerBase::isSectionTracker() const { return false; }\n    bool TrackerBase::isGeneratorTracker() const { return false; }\n\n    void TrackerBase::open() {\n        m_runState = Executing;\n        moveToThis();\n        if( m_parent )\n            m_parent->openChild();\n    }\n\n    void TrackerBase::close() {\n\n        // Close any still open children (e.g. generators)\n        while( &m_ctx.currentTracker() != this )\n            m_ctx.currentTracker().close();\n\n        switch( m_runState ) {\n            case NeedsAnotherRun:\n                break;\n\n            case Executing:\n                m_runState = CompletedSuccessfully;\n                break;\n            case ExecutingChildren:\n                if( m_children.empty() || m_children.back()->isComplete() )\n                    m_runState = CompletedSuccessfully;\n                break;\n\n            case NotStarted:\n            case CompletedSuccessfully:\n            case Failed:\n                CATCH_INTERNAL_ERROR( \"Illogical state: \" << m_runState );\n\n            default:\n                CATCH_INTERNAL_ERROR( \"Unknown state: \" << m_runState );\n        }\n        moveToParent();\n        m_ctx.completeCycle();\n    }\n    void TrackerBase::fail() {\n        m_runState = Failed;\n        if( m_parent )\n            m_parent->markAsNeedingAnotherRun();\n        moveToParent();\n        m_ctx.completeCycle();\n    }\n    void TrackerBase::markAsNeedingAnotherRun() {\n        m_runState = NeedsAnotherRun;\n    }\n\n    void TrackerBase::moveToParent() {\n        assert( m_parent );\n        m_ctx.setCurrentTracker( m_parent );\n    }\n    void TrackerBase::moveToThis() {\n        m_ctx.setCurrentTracker( this );\n    }\n\n    SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )\n    :   TrackerBase( nameAndLocation, ctx, parent )\n    {\n        if( parent ) {\n            while( !parent->isSectionTracker() )\n                parent = &parent->parent();\n\n            SectionTracker& parentSection = static_cast<SectionTracker&>( *parent );\n            addNextFilters( parentSection.m_filters );\n        }\n    }\n\n    bool SectionTracker::isComplete() const {\n        bool complete = true;\n\n        if ((m_filters.empty() || m_filters[0] == \"\") ||\n             std::find(m_filters.begin(), m_filters.end(),\n                       m_nameAndLocation.name) != m_filters.end())\n            complete = TrackerBase::isComplete();\n        return complete;\n\n    }\n\n    bool SectionTracker::isSectionTracker() const { return true; }\n\n    SectionTracker& SectionTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) {\n        std::shared_ptr<SectionTracker> section;\n\n        ITracker& currentTracker = ctx.currentTracker();\n        if( ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) {\n            assert( childTracker );\n            assert( childTracker->isSectionTracker() );\n            section = std::static_pointer_cast<SectionTracker>( childTracker );\n        }\n        else {\n            section = std::make_shared<SectionTracker>( nameAndLocation, ctx, &currentTracker );\n            currentTracker.addChild( section );\n        }\n        if( !ctx.completedCycle() )\n            section->tryOpen();\n        return *section;\n    }\n\n    void SectionTracker::tryOpen() {\n        if( !isComplete() && (m_filters.empty() || m_filters[0].empty() ||  m_filters[0] == m_nameAndLocation.name ) )\n            open();\n    }\n\n    void SectionTracker::addInitialFilters( std::vector<std::string> const& filters ) {\n        if( !filters.empty() ) {\n            m_filters.push_back(\"\"); // Root - should never be consulted\n            m_filters.push_back(\"\"); // Test Case - not a section filter\n            m_filters.insert( m_filters.end(), filters.begin(), filters.end() );\n        }\n    }\n    void SectionTracker::addNextFilters( std::vector<std::string> const& filters ) {\n        if( filters.size() > 1 )\n            m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() );\n    }\n\n} // namespace TestCaseTracking\n\nusing TestCaseTracking::ITracker;\nusing TestCaseTracking::TrackerContext;\nusing TestCaseTracking::SectionTracker;\n\n} // namespace Catch\n\n#if defined(__clang__)\n#    pragma clang diagnostic pop\n#endif\n// end catch_test_case_tracker.cpp\n// start catch_test_registry.cpp\n\nnamespace Catch {\n\n    auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker* {\n        return new(std::nothrow) TestInvokerAsFunction( testAsFunction );\n    }\n\n    NameAndTags::NameAndTags( StringRef const& name_ , StringRef const& tags_ ) noexcept : name( name_ ), tags( tags_ ) {}\n\n    AutoReg::AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept {\n        CATCH_TRY {\n            getMutableRegistryHub()\n                    .registerTest(\n                        makeTestCase(\n                            invoker,\n                            extractClassName( classOrMethod ),\n                            nameAndTags,\n                            lineInfo));\n        } CATCH_CATCH_ALL {\n            // Do not throw when constructing global objects, instead register the exception to be processed later\n            getMutableRegistryHub().registerStartupException();\n        }\n    }\n\n    AutoReg::~AutoReg() = default;\n}\n// end catch_test_registry.cpp\n// start catch_test_spec.cpp\n\n#include <algorithm>\n#include <string>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    TestSpec::Pattern::~Pattern() = default;\n    TestSpec::NamePattern::~NamePattern() = default;\n    TestSpec::TagPattern::~TagPattern() = default;\n    TestSpec::ExcludedPattern::~ExcludedPattern() = default;\n\n    TestSpec::NamePattern::NamePattern( std::string const& name )\n    : m_wildcardPattern( toLower( name ), CaseSensitive::No )\n    {}\n    bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const {\n        return m_wildcardPattern.matches( toLower( testCase.name ) );\n    }\n\n    TestSpec::TagPattern::TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {}\n    bool TestSpec::TagPattern::matches( TestCaseInfo const& testCase ) const {\n        return std::find(begin(testCase.lcaseTags),\n                         end(testCase.lcaseTags),\n                         m_tag) != end(testCase.lcaseTags);\n    }\n\n    TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {}\n    bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); }\n\n    bool TestSpec::Filter::matches( TestCaseInfo const& testCase ) const {\n        // All patterns in a filter must match for the filter to be a match\n        for( auto const& pattern : m_patterns ) {\n            if( !pattern->matches( testCase ) )\n                return false;\n        }\n        return true;\n    }\n\n    bool TestSpec::hasFilters() const {\n        return !m_filters.empty();\n    }\n    bool TestSpec::matches( TestCaseInfo const& testCase ) const {\n        // A TestSpec matches if any filter matches\n        for( auto const& filter : m_filters )\n            if( filter.matches( testCase ) )\n                return true;\n        return false;\n    }\n}\n// end catch_test_spec.cpp\n// start catch_test_spec_parser.cpp\n\nnamespace Catch {\n\n    TestSpecParser::TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {}\n\n    TestSpecParser& TestSpecParser::parse( std::string const& arg ) {\n        m_mode = None;\n        m_exclusion = false;\n        m_start = std::string::npos;\n        m_arg = m_tagAliases->expandAliases( arg );\n        m_escapeChars.clear();\n        for( m_pos = 0; m_pos < m_arg.size(); ++m_pos )\n            visitChar( m_arg[m_pos] );\n        if( m_mode == Name )\n            addPattern<TestSpec::NamePattern>();\n        return *this;\n    }\n    TestSpec TestSpecParser::testSpec() {\n        addFilter();\n        return m_testSpec;\n    }\n\n    void TestSpecParser::visitChar( char c ) {\n        if( m_mode == None ) {\n            switch( c ) {\n            case ' ': return;\n            case '~': m_exclusion = true; return;\n            case '[': return startNewMode( Tag, ++m_pos );\n            case '\"': return startNewMode( QuotedName, ++m_pos );\n            case '\\\\': return escape();\n            default: startNewMode( Name, m_pos ); break;\n            }\n        }\n        if( m_mode == Name ) {\n            if( c == ',' ) {\n                addPattern<TestSpec::NamePattern>();\n                addFilter();\n            }\n            else if( c == '[' ) {\n                if( subString() == \"exclude:\" )\n                    m_exclusion = true;\n                else\n                    addPattern<TestSpec::NamePattern>();\n                startNewMode( Tag, ++m_pos );\n            }\n            else if( c == '\\\\' )\n                escape();\n        }\n        else if( m_mode == EscapedName )\n            m_mode = Name;\n        else if( m_mode == QuotedName && c == '\"' )\n            addPattern<TestSpec::NamePattern>();\n        else if( m_mode == Tag && c == ']' )\n            addPattern<TestSpec::TagPattern>();\n    }\n    void TestSpecParser::startNewMode( Mode mode, std::size_t start ) {\n        m_mode = mode;\n        m_start = start;\n    }\n    void TestSpecParser::escape() {\n        if( m_mode == None )\n            m_start = m_pos;\n        m_mode = EscapedName;\n        m_escapeChars.push_back( m_pos );\n    }\n    std::string TestSpecParser::subString() const { return m_arg.substr( m_start, m_pos - m_start ); }\n\n    void TestSpecParser::addFilter() {\n        if( !m_currentFilter.m_patterns.empty() ) {\n            m_testSpec.m_filters.push_back( m_currentFilter );\n            m_currentFilter = TestSpec::Filter();\n        }\n    }\n\n    TestSpec parseTestSpec( std::string const& arg ) {\n        return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec();\n    }\n\n} // namespace Catch\n// end catch_test_spec_parser.cpp\n// start catch_timer.cpp\n\n#include <chrono>\n\nstatic const uint64_t nanosecondsInSecond = 1000000000;\n\nnamespace Catch {\n\n    auto getCurrentNanosecondsSinceEpoch() -> uint64_t {\n        return std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count();\n    }\n\n    namespace {\n        auto estimateClockResolution() -> uint64_t {\n            uint64_t sum = 0;\n            static const uint64_t iterations = 1000000;\n\n            auto startTime = getCurrentNanosecondsSinceEpoch();\n\n            for( std::size_t i = 0; i < iterations; ++i ) {\n\n                uint64_t ticks;\n                uint64_t baseTicks = getCurrentNanosecondsSinceEpoch();\n                do {\n                    ticks = getCurrentNanosecondsSinceEpoch();\n                } while( ticks == baseTicks );\n\n                auto delta = ticks - baseTicks;\n                sum += delta;\n\n                // If we have been calibrating for over 3 seconds -- the clock\n                // is terrible and we should move on.\n                // TBD: How to signal that the measured resolution is probably wrong?\n                if (ticks > startTime + 3 * nanosecondsInSecond) {\n                    return sum / ( i + 1u );\n                }\n            }\n\n            // We're just taking the mean, here. To do better we could take the std. dev and exclude outliers\n            // - and potentially do more iterations if there's a high variance.\n            return sum/iterations;\n        }\n    }\n    auto getEstimatedClockResolution() -> uint64_t {\n        static auto s_resolution = estimateClockResolution();\n        return s_resolution;\n    }\n\n    void Timer::start() {\n       m_nanoseconds = getCurrentNanosecondsSinceEpoch();\n    }\n    auto Timer::getElapsedNanoseconds() const -> uint64_t {\n        return getCurrentNanosecondsSinceEpoch() - m_nanoseconds;\n    }\n    auto Timer::getElapsedMicroseconds() const -> uint64_t {\n        return getElapsedNanoseconds()/1000;\n    }\n    auto Timer::getElapsedMilliseconds() const -> unsigned int {\n        return static_cast<unsigned int>(getElapsedMicroseconds()/1000);\n    }\n    auto Timer::getElapsedSeconds() const -> double {\n        return getElapsedMicroseconds()/1000000.0;\n    }\n\n} // namespace Catch\n// end catch_timer.cpp\n// start catch_tostring.cpp\n\n#if defined(__clang__)\n#    pragma clang diagnostic push\n#    pragma clang diagnostic ignored \"-Wexit-time-destructors\"\n#    pragma clang diagnostic ignored \"-Wglobal-constructors\"\n#endif\n\n// Enable specific decls locally\n#if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)\n#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n#endif\n\n#include <cmath>\n#include <iomanip>\n\nnamespace Catch {\n\nnamespace Detail {\n\n    const std::string unprintableString = \"{?}\";\n\n    namespace {\n        const int hexThreshold = 255;\n\n        struct Endianness {\n            enum Arch { Big, Little };\n\n            static Arch which() {\n                union _{\n                    int asInt;\n                    char asChar[sizeof (int)];\n                } u;\n\n                u.asInt = 1;\n                return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little;\n            }\n        };\n    }\n\n    std::string rawMemoryToString( const void *object, std::size_t size ) {\n        // Reverse order for little endian architectures\n        int i = 0, end = static_cast<int>( size ), inc = 1;\n        if( Endianness::which() == Endianness::Little ) {\n            i = end-1;\n            end = inc = -1;\n        }\n\n        unsigned char const *bytes = static_cast<unsigned char const *>(object);\n        ReusableStringStream rss;\n        rss << \"0x\" << std::setfill('0') << std::hex;\n        for( ; i != end; i += inc )\n             rss << std::setw(2) << static_cast<unsigned>(bytes[i]);\n       return rss.str();\n    }\n}\n\ntemplate<typename T>\nstd::string fpToString( T value, int precision ) {\n    if (Catch::isnan(value)) {\n        return \"nan\";\n    }\n\n    ReusableStringStream rss;\n    rss << std::setprecision( precision )\n        << std::fixed\n        << value;\n    std::string d = rss.str();\n    std::size_t i = d.find_last_not_of( '0' );\n    if( i != std::string::npos && i != d.size()-1 ) {\n        if( d[i] == '.' )\n            i++;\n        d = d.substr( 0, i+1 );\n    }\n    return d;\n}\n\n//// ======================================================= ////\n//\n//   Out-of-line defs for full specialization of StringMaker\n//\n//// ======================================================= ////\n\nstd::string StringMaker<std::string>::convert(const std::string& str) {\n    if (!getCurrentContext().getConfig()->showInvisibles()) {\n        return '\"' + str + '\"';\n    }\n\n    std::string s(\"\\\"\");\n    for (char c : str) {\n        switch (c) {\n        case '\\n':\n            s.append(\"\\\\n\");\n            break;\n        case '\\t':\n            s.append(\"\\\\t\");\n            break;\n        default:\n            s.push_back(c);\n            break;\n        }\n    }\n    s.append(\"\\\"\");\n    return s;\n}\n\n#ifdef CATCH_CONFIG_CPP17_STRING_VIEW\nstd::string StringMaker<std::string_view>::convert(std::string_view str) {\n    return ::Catch::Detail::stringify(std::string{ str });\n}\n#endif\n\nstd::string StringMaker<char const*>::convert(char const* str) {\n    if (str) {\n        return ::Catch::Detail::stringify(std::string{ str });\n    } else {\n        return{ \"{null string}\" };\n    }\n}\nstd::string StringMaker<char*>::convert(char* str) {\n    if (str) {\n        return ::Catch::Detail::stringify(std::string{ str });\n    } else {\n        return{ \"{null string}\" };\n    }\n}\n\n#ifdef CATCH_CONFIG_WCHAR\nstd::string StringMaker<std::wstring>::convert(const std::wstring& wstr) {\n    std::string s;\n    s.reserve(wstr.size());\n    for (auto c : wstr) {\n        s += (c <= 0xff) ? static_cast<char>(c) : '?';\n    }\n    return ::Catch::Detail::stringify(s);\n}\n\n# ifdef CATCH_CONFIG_CPP17_STRING_VIEW\nstd::string StringMaker<std::wstring_view>::convert(std::wstring_view str) {\n    return StringMaker<std::wstring>::convert(std::wstring(str));\n}\n# endif\n\nstd::string StringMaker<wchar_t const*>::convert(wchar_t const * str) {\n    if (str) {\n        return ::Catch::Detail::stringify(std::wstring{ str });\n    } else {\n        return{ \"{null string}\" };\n    }\n}\nstd::string StringMaker<wchar_t *>::convert(wchar_t * str) {\n    if (str) {\n        return ::Catch::Detail::stringify(std::wstring{ str });\n    } else {\n        return{ \"{null string}\" };\n    }\n}\n#endif\n\nstd::string StringMaker<int>::convert(int value) {\n    return ::Catch::Detail::stringify(static_cast<long long>(value));\n}\nstd::string StringMaker<long>::convert(long value) {\n    return ::Catch::Detail::stringify(static_cast<long long>(value));\n}\nstd::string StringMaker<long long>::convert(long long value) {\n    ReusableStringStream rss;\n    rss << value;\n    if (value > Detail::hexThreshold) {\n        rss << \" (0x\" << std::hex << value << ')';\n    }\n    return rss.str();\n}\n\nstd::string StringMaker<unsigned int>::convert(unsigned int value) {\n    return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));\n}\nstd::string StringMaker<unsigned long>::convert(unsigned long value) {\n    return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));\n}\nstd::string StringMaker<unsigned long long>::convert(unsigned long long value) {\n    ReusableStringStream rss;\n    rss << value;\n    if (value > Detail::hexThreshold) {\n        rss << \" (0x\" << std::hex << value << ')';\n    }\n    return rss.str();\n}\n\nstd::string StringMaker<bool>::convert(bool b) {\n    return b ? \"true\" : \"false\";\n}\n\nstd::string StringMaker<signed char>::convert(signed char value) {\n    if (value == '\\r') {\n        return \"'\\\\r'\";\n    } else if (value == '\\f') {\n        return \"'\\\\f'\";\n    } else if (value == '\\n') {\n        return \"'\\\\n'\";\n    } else if (value == '\\t') {\n        return \"'\\\\t'\";\n    } else if ('\\0' <= value && value < ' ') {\n        return ::Catch::Detail::stringify(static_cast<unsigned int>(value));\n    } else {\n        char chstr[] = \"' '\";\n        chstr[1] = value;\n        return chstr;\n    }\n}\nstd::string StringMaker<char>::convert(char c) {\n    return ::Catch::Detail::stringify(static_cast<signed char>(c));\n}\nstd::string StringMaker<unsigned char>::convert(unsigned char c) {\n    return ::Catch::Detail::stringify(static_cast<char>(c));\n}\n\nstd::string StringMaker<std::nullptr_t>::convert(std::nullptr_t) {\n    return \"nullptr\";\n}\n\nint StringMaker<float>::precision = 5;\n\nstd::string StringMaker<float>::convert(float value) {\n    return fpToString(value, precision) + 'f';\n}\n\nint StringMaker<double>::precision = 10;\n\nstd::string StringMaker<double>::convert(double value) {\n    return fpToString(value, precision);\n}\n\nstd::string ratio_string<std::atto>::symbol() { return \"a\"; }\nstd::string ratio_string<std::femto>::symbol() { return \"f\"; }\nstd::string ratio_string<std::pico>::symbol() { return \"p\"; }\nstd::string ratio_string<std::nano>::symbol() { return \"n\"; }\nstd::string ratio_string<std::micro>::symbol() { return \"u\"; }\nstd::string ratio_string<std::milli>::symbol() { return \"m\"; }\n\n} // end namespace Catch\n\n#if defined(__clang__)\n#    pragma clang diagnostic pop\n#endif\n\n// end catch_tostring.cpp\n// start catch_totals.cpp\n\nnamespace Catch {\n\n    Counts Counts::operator - ( Counts const& other ) const {\n        Counts diff;\n        diff.passed = passed - other.passed;\n        diff.failed = failed - other.failed;\n        diff.failedButOk = failedButOk - other.failedButOk;\n        return diff;\n    }\n\n    Counts& Counts::operator += ( Counts const& other ) {\n        passed += other.passed;\n        failed += other.failed;\n        failedButOk += other.failedButOk;\n        return *this;\n    }\n\n    std::size_t Counts::total() const {\n        return passed + failed + failedButOk;\n    }\n    bool Counts::allPassed() const {\n        return failed == 0 && failedButOk == 0;\n    }\n    bool Counts::allOk() const {\n        return failed == 0;\n    }\n\n    Totals Totals::operator - ( Totals const& other ) const {\n        Totals diff;\n        diff.assertions = assertions - other.assertions;\n        diff.testCases = testCases - other.testCases;\n        return diff;\n    }\n\n    Totals& Totals::operator += ( Totals const& other ) {\n        assertions += other.assertions;\n        testCases += other.testCases;\n        return *this;\n    }\n\n    Totals Totals::delta( Totals const& prevTotals ) const {\n        Totals diff = *this - prevTotals;\n        if( diff.assertions.failed > 0 )\n            ++diff.testCases.failed;\n        else if( diff.assertions.failedButOk > 0 )\n            ++diff.testCases.failedButOk;\n        else\n            ++diff.testCases.passed;\n        return diff;\n    }\n\n}\n// end catch_totals.cpp\n// start catch_uncaught_exceptions.cpp\n\n#include <exception>\n\nnamespace Catch {\n    bool uncaught_exceptions() {\n#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)\n        return std::uncaught_exceptions() > 0;\n#else\n        return std::uncaught_exception();\n#endif\n  }\n} // end namespace Catch\n// end catch_uncaught_exceptions.cpp\n// start catch_version.cpp\n\n#include <ostream>\n\nnamespace Catch {\n\n    Version::Version\n        (   unsigned int _majorVersion,\n            unsigned int _minorVersion,\n            unsigned int _patchNumber,\n            char const * const _branchName,\n            unsigned int _buildNumber )\n    :   majorVersion( _majorVersion ),\n        minorVersion( _minorVersion ),\n        patchNumber( _patchNumber ),\n        branchName( _branchName ),\n        buildNumber( _buildNumber )\n    {}\n\n    std::ostream& operator << ( std::ostream& os, Version const& version ) {\n        os  << version.majorVersion << '.'\n            << version.minorVersion << '.'\n            << version.patchNumber;\n        // branchName is never null -> 0th char is \\0 if it is empty\n        if (version.branchName[0]) {\n            os << '-' << version.branchName\n               << '.' << version.buildNumber;\n        }\n        return os;\n    }\n\n    Version const& libraryVersion() {\n        static Version version( 2, 9, 1, \"\", 0 );\n        return version;\n    }\n\n}\n// end catch_version.cpp\n// start catch_wildcard_pattern.cpp\n\n#include <sstream>\n\nnamespace Catch {\n\n    WildcardPattern::WildcardPattern( std::string const& pattern,\n                                      CaseSensitive::Choice caseSensitivity )\n    :   m_caseSensitivity( caseSensitivity ),\n        m_pattern( adjustCase( pattern ) )\n    {\n        if( startsWith( m_pattern, '*' ) ) {\n            m_pattern = m_pattern.substr( 1 );\n            m_wildcard = WildcardAtStart;\n        }\n        if( endsWith( m_pattern, '*' ) ) {\n            m_pattern = m_pattern.substr( 0, m_pattern.size()-1 );\n            m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd );\n        }\n    }\n\n    bool WildcardPattern::matches( std::string const& str ) const {\n        switch( m_wildcard ) {\n            case NoWildcard:\n                return m_pattern == adjustCase( str );\n            case WildcardAtStart:\n                return endsWith( adjustCase( str ), m_pattern );\n            case WildcardAtEnd:\n                return startsWith( adjustCase( str ), m_pattern );\n            case WildcardAtBothEnds:\n                return contains( adjustCase( str ), m_pattern );\n            default:\n                CATCH_INTERNAL_ERROR( \"Unknown enum\" );\n        }\n    }\n\n    std::string WildcardPattern::adjustCase( std::string const& str ) const {\n        return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str;\n    }\n}\n// end catch_wildcard_pattern.cpp\n// start catch_xmlwriter.cpp\n\n#include <iomanip>\n\nusing uchar = unsigned char;\n\nnamespace Catch {\n\nnamespace {\n\n    size_t trailingBytes(unsigned char c) {\n        if ((c & 0xE0) == 0xC0) {\n            return 2;\n        }\n        if ((c & 0xF0) == 0xE0) {\n            return 3;\n        }\n        if ((c & 0xF8) == 0xF0) {\n            return 4;\n        }\n        CATCH_INTERNAL_ERROR(\"Invalid multibyte utf-8 start byte encountered\");\n    }\n\n    uint32_t headerValue(unsigned char c) {\n        if ((c & 0xE0) == 0xC0) {\n            return c & 0x1F;\n        }\n        if ((c & 0xF0) == 0xE0) {\n            return c & 0x0F;\n        }\n        if ((c & 0xF8) == 0xF0) {\n            return c & 0x07;\n        }\n        CATCH_INTERNAL_ERROR(\"Invalid multibyte utf-8 start byte encountered\");\n    }\n\n    void hexEscapeChar(std::ostream& os, unsigned char c) {\n        std::ios_base::fmtflags f(os.flags());\n        os << \"\\\\x\"\n            << std::uppercase << std::hex << std::setfill('0') << std::setw(2)\n            << static_cast<int>(c);\n        os.flags(f);\n    }\n\n} // anonymous namespace\n\n    XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat )\n    :   m_str( str ),\n        m_forWhat( forWhat )\n    {}\n\n    void XmlEncode::encodeTo( std::ostream& os ) const {\n        // Apostrophe escaping not necessary if we always use \" to write attributes\n        // (see: http://www.w3.org/TR/xml/#syntax)\n\n        for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) {\n            uchar c = m_str[idx];\n            switch (c) {\n            case '<':   os << \"&lt;\"; break;\n            case '&':   os << \"&amp;\"; break;\n\n            case '>':\n                // See: http://www.w3.org/TR/xml/#syntax\n                if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']')\n                    os << \"&gt;\";\n                else\n                    os << c;\n                break;\n\n            case '\\\"':\n                if (m_forWhat == ForAttributes)\n                    os << \"&quot;\";\n                else\n                    os << c;\n                break;\n\n            default:\n                // Check for control characters and invalid utf-8\n\n                // Escape control characters in standard ascii\n                // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0\n                if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n\n                // Plain ASCII: Write it to stream\n                if (c < 0x7F) {\n                    os << c;\n                    break;\n                }\n\n                // UTF-8 territory\n                // Check if the encoding is valid and if it is not, hex escape bytes.\n                // Important: We do not check the exact decoded values for validity, only the encoding format\n                // First check that this bytes is a valid lead byte:\n                // This means that it is not encoded as 1111 1XXX\n                // Or as 10XX XXXX\n                if (c <  0xC0 ||\n                    c >= 0xF8) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n\n                auto encBytes = trailingBytes(c);\n                // Are there enough bytes left to avoid accessing out-of-bounds memory?\n                if (idx + encBytes - 1 >= m_str.size()) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n                // The header is valid, check data\n                // The next encBytes bytes must together be a valid utf-8\n                // This means: bitpattern 10XX XXXX and the extracted value is sane (ish)\n                bool valid = true;\n                uint32_t value = headerValue(c);\n                for (std::size_t n = 1; n < encBytes; ++n) {\n                    uchar nc = m_str[idx + n];\n                    valid &= ((nc & 0xC0) == 0x80);\n                    value = (value << 6) | (nc & 0x3F);\n                }\n\n                if (\n                    // Wrong bit pattern of following bytes\n                    (!valid) ||\n                    // Overlong encodings\n                    (value < 0x80) ||\n                    (0x80 <= value && value < 0x800   && encBytes > 2) ||\n                    (0x800 < value && value < 0x10000 && encBytes > 3) ||\n                    // Encoded value out of range\n                    (value >= 0x110000)\n                    ) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n\n                // If we got here, this is in fact a valid(ish) utf-8 sequence\n                for (std::size_t n = 0; n < encBytes; ++n) {\n                    os << m_str[idx + n];\n                }\n                idx += encBytes - 1;\n                break;\n            }\n        }\n    }\n\n    std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) {\n        xmlEncode.encodeTo( os );\n        return os;\n    }\n\n    XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer )\n    :   m_writer( writer )\n    {}\n\n    XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept\n    :   m_writer( other.m_writer ){\n        other.m_writer = nullptr;\n    }\n    XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) noexcept {\n        if ( m_writer ) {\n            m_writer->endElement();\n        }\n        m_writer = other.m_writer;\n        other.m_writer = nullptr;\n        return *this;\n    }\n\n    XmlWriter::ScopedElement::~ScopedElement() {\n        if( m_writer )\n            m_writer->endElement();\n    }\n\n    XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, bool indent ) {\n        m_writer->writeText( text, indent );\n        return *this;\n    }\n\n    XmlWriter::XmlWriter( std::ostream& os ) : m_os( os )\n    {\n        writeDeclaration();\n    }\n\n    XmlWriter::~XmlWriter() {\n        while( !m_tags.empty() )\n            endElement();\n    }\n\n    XmlWriter& XmlWriter::startElement( std::string const& name ) {\n        ensureTagClosed();\n        newlineIfNecessary();\n        m_os << m_indent << '<' << name;\n        m_tags.push_back( name );\n        m_indent += \"  \";\n        m_tagIsOpen = true;\n        return *this;\n    }\n\n    XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name ) {\n        ScopedElement scoped( this );\n        startElement( name );\n        return scoped;\n    }\n\n    XmlWriter& XmlWriter::endElement() {\n        newlineIfNecessary();\n        m_indent = m_indent.substr( 0, m_indent.size()-2 );\n        if( m_tagIsOpen ) {\n            m_os << \"/>\";\n            m_tagIsOpen = false;\n        }\n        else {\n            m_os << m_indent << \"</\" << m_tags.back() << \">\";\n        }\n        m_os << std::endl;\n        m_tags.pop_back();\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) {\n        if( !name.empty() && !attribute.empty() )\n            m_os << ' ' << name << \"=\\\"\" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '\"';\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) {\n        m_os << ' ' << name << \"=\\\"\" << ( attribute ? \"true\" : \"false\" ) << '\"';\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeText( std::string const& text, bool indent ) {\n        if( !text.empty() ){\n            bool tagWasOpen = m_tagIsOpen;\n            ensureTagClosed();\n            if( tagWasOpen && indent )\n                m_os << m_indent;\n            m_os << XmlEncode( text );\n            m_needsNewline = true;\n        }\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeComment( std::string const& text ) {\n        ensureTagClosed();\n        m_os << m_indent << \"<!--\" << text << \"-->\";\n        m_needsNewline = true;\n        return *this;\n    }\n\n    void XmlWriter::writeStylesheetRef( std::string const& url ) {\n        m_os << \"<?xml-stylesheet type=\\\"text/xsl\\\" href=\\\"\" << url << \"\\\"?>\\n\";\n    }\n\n    XmlWriter& XmlWriter::writeBlankLine() {\n        ensureTagClosed();\n        m_os << '\\n';\n        return *this;\n    }\n\n    void XmlWriter::ensureTagClosed() {\n        if( m_tagIsOpen ) {\n            m_os << \">\" << std::endl;\n            m_tagIsOpen = false;\n        }\n    }\n\n    void XmlWriter::writeDeclaration() {\n        m_os << \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\";\n    }\n\n    void XmlWriter::newlineIfNecessary() {\n        if( m_needsNewline ) {\n            m_os << std::endl;\n            m_needsNewline = false;\n        }\n    }\n}\n// end catch_xmlwriter.cpp\n// start catch_reporter_bases.cpp\n\n#include <cstring>\n#include <cfloat>\n#include <cstdio>\n#include <cassert>\n#include <memory>\n\nnamespace Catch {\n    void prepareExpandedExpression(AssertionResult& result) {\n        result.getExpandedExpression();\n    }\n\n    // Because formatting using c++ streams is stateful, drop down to C is required\n    // Alternatively we could use stringstream, but its performance is... not good.\n    std::string getFormattedDuration( double duration ) {\n        // Max exponent + 1 is required to represent the whole part\n        // + 1 for decimal point\n        // + 3 for the 3 decimal places\n        // + 1 for null terminator\n        const std::size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1;\n        char buffer[maxDoubleSize];\n\n        // Save previous errno, to prevent sprintf from overwriting it\n        ErrnoGuard guard;\n#ifdef _MSC_VER\n        sprintf_s(buffer, \"%.3f\", duration);\n#else\n        std::sprintf(buffer, \"%.3f\", duration);\n#endif\n        return std::string(buffer);\n    }\n\n    std::string serializeFilters( std::vector<std::string> const& container ) {\n        ReusableStringStream oss;\n        bool first = true;\n        for (auto&& filter : container)\n        {\n            if (!first)\n                oss << ' ';\n            else\n                first = false;\n\n            oss << filter;\n        }\n        return oss.str();\n    }\n\n    TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config)\n        :StreamingReporterBase(_config) {}\n\n    std::set<Verbosity> TestEventListenerBase::getSupportedVerbosities() {\n        return { Verbosity::Quiet, Verbosity::Normal, Verbosity::High };\n    }\n\n    void TestEventListenerBase::assertionStarting(AssertionInfo const &) {}\n\n    bool TestEventListenerBase::assertionEnded(AssertionStats const &) {\n        return false;\n    }\n\n} // end namespace Catch\n// end catch_reporter_bases.cpp\n// start catch_reporter_compact.cpp\n\nnamespace {\n\n#ifdef CATCH_PLATFORM_MAC\n    const char* failedString() { return \"FAILED\"; }\n    const char* passedString() { return \"PASSED\"; }\n#else\n    const char* failedString() { return \"failed\"; }\n    const char* passedString() { return \"passed\"; }\n#endif\n\n    // Colour::LightGrey\n    Catch::Colour::Code dimColour() { return Catch::Colour::FileName; }\n\n    std::string bothOrAll( std::size_t count ) {\n        return count == 1 ? std::string() :\n               count == 2 ? \"both \" : \"all \" ;\n    }\n\n} // anon namespace\n\nnamespace Catch {\nnamespace {\n// Colour, message variants:\n// - white: No tests ran.\n// -   red: Failed [both/all] N test cases, failed [both/all] M assertions.\n// - white: Passed [both/all] N test cases (no assertions).\n// -   red: Failed N tests cases, failed M assertions.\n// - green: Passed [both/all] N tests cases with M assertions.\nvoid printTotals(std::ostream& out, const Totals& totals) {\n    if (totals.testCases.total() == 0) {\n        out << \"No tests ran.\";\n    } else if (totals.testCases.failed == totals.testCases.total()) {\n        Colour colour(Colour::ResultError);\n        const std::string qualify_assertions_failed =\n            totals.assertions.failed == totals.assertions.total() ?\n            bothOrAll(totals.assertions.failed) : std::string();\n        out <<\n            \"Failed \" << bothOrAll(totals.testCases.failed)\n            << pluralise(totals.testCases.failed, \"test case\") << \", \"\n            \"failed \" << qualify_assertions_failed <<\n            pluralise(totals.assertions.failed, \"assertion\") << '.';\n    } else if (totals.assertions.total() == 0) {\n        out <<\n            \"Passed \" << bothOrAll(totals.testCases.total())\n            << pluralise(totals.testCases.total(), \"test case\")\n            << \" (no assertions).\";\n    } else if (totals.assertions.failed) {\n        Colour colour(Colour::ResultError);\n        out <<\n            \"Failed \" << pluralise(totals.testCases.failed, \"test case\") << \", \"\n            \"failed \" << pluralise(totals.assertions.failed, \"assertion\") << '.';\n    } else {\n        Colour colour(Colour::ResultSuccess);\n        out <<\n            \"Passed \" << bothOrAll(totals.testCases.passed)\n            << pluralise(totals.testCases.passed, \"test case\") <<\n            \" with \" << pluralise(totals.assertions.passed, \"assertion\") << '.';\n    }\n}\n\n// Implementation of CompactReporter formatting\nclass AssertionPrinter {\npublic:\n    AssertionPrinter& operator= (AssertionPrinter const&) = delete;\n    AssertionPrinter(AssertionPrinter const&) = delete;\n    AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages)\n        : stream(_stream)\n        , result(_stats.assertionResult)\n        , messages(_stats.infoMessages)\n        , itMessage(_stats.infoMessages.begin())\n        , printInfoMessages(_printInfoMessages) {}\n\n    void print() {\n        printSourceInfo();\n\n        itMessage = messages.begin();\n\n        switch (result.getResultType()) {\n        case ResultWas::Ok:\n            printResultType(Colour::ResultSuccess, passedString());\n            printOriginalExpression();\n            printReconstructedExpression();\n            if (!result.hasExpression())\n                printRemainingMessages(Colour::None);\n            else\n                printRemainingMessages();\n            break;\n        case ResultWas::ExpressionFailed:\n            if (result.isOk())\n                printResultType(Colour::ResultSuccess, failedString() + std::string(\" - but was ok\"));\n            else\n                printResultType(Colour::Error, failedString());\n            printOriginalExpression();\n            printReconstructedExpression();\n            printRemainingMessages();\n            break;\n        case ResultWas::ThrewException:\n            printResultType(Colour::Error, failedString());\n            printIssue(\"unexpected exception with message:\");\n            printMessage();\n            printExpressionWas();\n            printRemainingMessages();\n            break;\n        case ResultWas::FatalErrorCondition:\n            printResultType(Colour::Error, failedString());\n            printIssue(\"fatal error condition with message:\");\n            printMessage();\n            printExpressionWas();\n            printRemainingMessages();\n            break;\n        case ResultWas::DidntThrowException:\n            printResultType(Colour::Error, failedString());\n            printIssue(\"expected exception, got none\");\n            printExpressionWas();\n            printRemainingMessages();\n            break;\n        case ResultWas::Info:\n            printResultType(Colour::None, \"info\");\n            printMessage();\n            printRemainingMessages();\n            break;\n        case ResultWas::Warning:\n            printResultType(Colour::None, \"warning\");\n            printMessage();\n            printRemainingMessages();\n            break;\n        case ResultWas::ExplicitFailure:\n            printResultType(Colour::Error, failedString());\n            printIssue(\"explicitly\");\n            printRemainingMessages(Colour::None);\n            break;\n            // These cases are here to prevent compiler warnings\n        case ResultWas::Unknown:\n        case ResultWas::FailureBit:\n        case ResultWas::Exception:\n            printResultType(Colour::Error, \"** internal error **\");\n            break;\n        }\n    }\n\nprivate:\n    void printSourceInfo() const {\n        Colour colourGuard(Colour::FileName);\n        stream << result.getSourceInfo() << ':';\n    }\n\n    void printResultType(Colour::Code colour, std::string const& passOrFail) const {\n        if (!passOrFail.empty()) {\n            {\n                Colour colourGuard(colour);\n                stream << ' ' << passOrFail;\n            }\n            stream << ':';\n        }\n    }\n\n    void printIssue(std::string const& issue) const {\n        stream << ' ' << issue;\n    }\n\n    void printExpressionWas() {\n        if (result.hasExpression()) {\n            stream << ';';\n            {\n                Colour colour(dimColour());\n                stream << \" expression was:\";\n            }\n            printOriginalExpression();\n        }\n    }\n\n    void printOriginalExpression() const {\n        if (result.hasExpression()) {\n            stream << ' ' << result.getExpression();\n        }\n    }\n\n    void printReconstructedExpression() const {\n        if (result.hasExpandedExpression()) {\n            {\n                Colour colour(dimColour());\n                stream << \" for: \";\n            }\n            stream << result.getExpandedExpression();\n        }\n    }\n\n    void printMessage() {\n        if (itMessage != messages.end()) {\n            stream << \" '\" << itMessage->message << '\\'';\n            ++itMessage;\n        }\n    }\n\n    void printRemainingMessages(Colour::Code colour = dimColour()) {\n        if (itMessage == messages.end())\n            return;\n\n        // using messages.end() directly yields (or auto) compilation error:\n        std::vector<MessageInfo>::const_iterator itEnd = messages.end();\n        const std::size_t N = static_cast<std::size_t>(std::distance(itMessage, itEnd));\n\n        {\n            Colour colourGuard(colour);\n            stream << \" with \" << pluralise(N, \"message\") << ':';\n        }\n\n        for (; itMessage != itEnd; ) {\n            // If this assertion is a warning ignore any INFO messages\n            if (printInfoMessages || itMessage->type != ResultWas::Info) {\n                stream << \" '\" << itMessage->message << '\\'';\n                if (++itMessage != itEnd) {\n                    Colour colourGuard(dimColour());\n                    stream << \" and\";\n                }\n            }\n        }\n    }\n\nprivate:\n    std::ostream& stream;\n    AssertionResult const& result;\n    std::vector<MessageInfo> messages;\n    std::vector<MessageInfo>::const_iterator itMessage;\n    bool printInfoMessages;\n};\n\n} // anon namespace\n\n        std::string CompactReporter::getDescription() {\n            return \"Reports test results on a single line, suitable for IDEs\";\n        }\n\n        ReporterPreferences CompactReporter::getPreferences() const {\n            return m_reporterPrefs;\n        }\n\n        void CompactReporter::noMatchingTestCases( std::string const& spec ) {\n            stream << \"No test cases matched '\" << spec << '\\'' << std::endl;\n        }\n\n        void CompactReporter::assertionStarting( AssertionInfo const& ) {}\n\n        bool CompactReporter::assertionEnded( AssertionStats const& _assertionStats ) {\n            AssertionResult const& result = _assertionStats.assertionResult;\n\n            bool printInfoMessages = true;\n\n            // Drop out if result was successful and we're not printing those\n            if( !m_config->includeSuccessfulResults() && result.isOk() ) {\n                if( result.getResultType() != ResultWas::Warning )\n                    return false;\n                printInfoMessages = false;\n            }\n\n            AssertionPrinter printer( stream, _assertionStats, printInfoMessages );\n            printer.print();\n\n            stream << std::endl;\n            return true;\n        }\n\n        void CompactReporter::sectionEnded(SectionStats const& _sectionStats) {\n            if (m_config->showDurations() == ShowDurations::Always) {\n                stream << getFormattedDuration(_sectionStats.durationInSeconds) << \" s: \" << _sectionStats.sectionInfo.name << std::endl;\n            }\n        }\n\n        void CompactReporter::testRunEnded( TestRunStats const& _testRunStats ) {\n            printTotals( stream, _testRunStats.totals );\n            stream << '\\n' << std::endl;\n            StreamingReporterBase::testRunEnded( _testRunStats );\n        }\n\n        CompactReporter::~CompactReporter() {}\n\n    CATCH_REGISTER_REPORTER( \"compact\", CompactReporter )\n\n} // end namespace Catch\n// end catch_reporter_compact.cpp\n// start catch_reporter_console.cpp\n\n#include <cfloat>\n#include <cstdio>\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch\n // Note that 4062 (not all labels are handled and default is missing) is enabled\n#endif\n\n#if defined(__clang__)\n#  pragma clang diagnostic push\n// For simplicity, benchmarking-only helpers are always enabled\n#  pragma clang diagnostic ignored \"-Wunused-function\"\n#endif\n\nnamespace Catch {\n\nnamespace {\n\n// Formatter impl for ConsoleReporter\nclass ConsoleAssertionPrinter {\npublic:\n    ConsoleAssertionPrinter& operator= (ConsoleAssertionPrinter const&) = delete;\n    ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete;\n    ConsoleAssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages)\n        : stream(_stream),\n        stats(_stats),\n        result(_stats.assertionResult),\n        colour(Colour::None),\n        message(result.getMessage()),\n        messages(_stats.infoMessages),\n        printInfoMessages(_printInfoMessages) {\n        switch (result.getResultType()) {\n        case ResultWas::Ok:\n            colour = Colour::Success;\n            passOrFail = \"PASSED\";\n            //if( result.hasMessage() )\n            if (_stats.infoMessages.size() == 1)\n                messageLabel = \"with message\";\n            if (_stats.infoMessages.size() > 1)\n                messageLabel = \"with messages\";\n            break;\n        case ResultWas::ExpressionFailed:\n            if (result.isOk()) {\n                colour = Colour::Success;\n                passOrFail = \"FAILED - but was ok\";\n            } else {\n                colour = Colour::Error;\n                passOrFail = \"FAILED\";\n            }\n            if (_stats.infoMessages.size() == 1)\n                messageLabel = \"with message\";\n            if (_stats.infoMessages.size() > 1)\n                messageLabel = \"with messages\";\n            break;\n        case ResultWas::ThrewException:\n            colour = Colour::Error;\n            passOrFail = \"FAILED\";\n            messageLabel = \"due to unexpected exception with \";\n            if (_stats.infoMessages.size() == 1)\n                messageLabel += \"message\";\n            if (_stats.infoMessages.size() > 1)\n                messageLabel += \"messages\";\n            break;\n        case ResultWas::FatalErrorCondition:\n            colour = Colour::Error;\n            passOrFail = \"FAILED\";\n            messageLabel = \"due to a fatal error condition\";\n            break;\n        case ResultWas::DidntThrowException:\n            colour = Colour::Error;\n            passOrFail = \"FAILED\";\n            messageLabel = \"because no exception was thrown where one was expected\";\n            break;\n        case ResultWas::Info:\n            messageLabel = \"info\";\n            break;\n        case ResultWas::Warning:\n            messageLabel = \"warning\";\n            break;\n        case ResultWas::ExplicitFailure:\n            passOrFail = \"FAILED\";\n            colour = Colour::Error;\n            if (_stats.infoMessages.size() == 1)\n                messageLabel = \"explicitly with message\";\n            if (_stats.infoMessages.size() > 1)\n                messageLabel = \"explicitly with messages\";\n            break;\n            // These cases are here to prevent compiler warnings\n        case ResultWas::Unknown:\n        case ResultWas::FailureBit:\n        case ResultWas::Exception:\n            passOrFail = \"** internal error **\";\n            colour = Colour::Error;\n            break;\n        }\n    }\n\n    void print() const {\n        printSourceInfo();\n        if (stats.totals.assertions.total() > 0) {\n            printResultType();\n            printOriginalExpression();\n            printReconstructedExpression();\n        } else {\n            stream << '\\n';\n        }\n        printMessage();\n    }\n\nprivate:\n    void printResultType() const {\n        if (!passOrFail.empty()) {\n            Colour colourGuard(colour);\n            stream << passOrFail << \":\\n\";\n        }\n    }\n    void printOriginalExpression() const {\n        if (result.hasExpression()) {\n            Colour colourGuard(Colour::OriginalExpression);\n            stream << \"  \";\n            stream << result.getExpressionInMacro();\n            stream << '\\n';\n        }\n    }\n    void printReconstructedExpression() const {\n        if (result.hasExpandedExpression()) {\n            stream << \"with expansion:\\n\";\n            Colour colourGuard(Colour::ReconstructedExpression);\n            stream << Column(result.getExpandedExpression()).indent(2) << '\\n';\n        }\n    }\n    void printMessage() const {\n        if (!messageLabel.empty())\n            stream << messageLabel << ':' << '\\n';\n        for (auto const& msg : messages) {\n            // If this assertion is a warning ignore any INFO messages\n            if (printInfoMessages || msg.type != ResultWas::Info)\n                stream << Column(msg.message).indent(2) << '\\n';\n        }\n    }\n    void printSourceInfo() const {\n        Colour colourGuard(Colour::FileName);\n        stream << result.getSourceInfo() << \": \";\n    }\n\n    std::ostream& stream;\n    AssertionStats const& stats;\n    AssertionResult const& result;\n    Colour::Code colour;\n    std::string passOrFail;\n    std::string messageLabel;\n    std::string message;\n    std::vector<MessageInfo> messages;\n    bool printInfoMessages;\n};\n\nstd::size_t makeRatio(std::size_t number, std::size_t total) {\n    std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0;\n    return (ratio == 0 && number > 0) ? 1 : ratio;\n}\n\nstd::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) {\n    if (i > j && i > k)\n        return i;\n    else if (j > k)\n        return j;\n    else\n        return k;\n}\n\nstruct ColumnInfo {\n    enum Justification { Left, Right };\n    std::string name;\n    int width;\n    Justification justification;\n};\nstruct ColumnBreak {};\nstruct RowBreak {};\n\nclass Duration {\n    enum class Unit {\n        Auto,\n        Nanoseconds,\n        Microseconds,\n        Milliseconds,\n        Seconds,\n        Minutes\n    };\n    static const uint64_t s_nanosecondsInAMicrosecond = 1000;\n    static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond;\n    static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond;\n    static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond;\n\n    uint64_t m_inNanoseconds;\n    Unit m_units;\n\npublic:\n\texplicit Duration(double inNanoseconds, Unit units = Unit::Auto)\n        : Duration(static_cast<uint64_t>(inNanoseconds), units) {\n    }\n\n    explicit Duration(uint64_t inNanoseconds, Unit units = Unit::Auto)\n        : m_inNanoseconds(inNanoseconds),\n        m_units(units) {\n        if (m_units == Unit::Auto) {\n            if (m_inNanoseconds < s_nanosecondsInAMicrosecond)\n                m_units = Unit::Nanoseconds;\n            else if (m_inNanoseconds < s_nanosecondsInAMillisecond)\n                m_units = Unit::Microseconds;\n            else if (m_inNanoseconds < s_nanosecondsInASecond)\n                m_units = Unit::Milliseconds;\n            else if (m_inNanoseconds < s_nanosecondsInAMinute)\n                m_units = Unit::Seconds;\n            else\n                m_units = Unit::Minutes;\n        }\n\n    }\n\n    auto value() const -> double {\n        switch (m_units) {\n        case Unit::Microseconds:\n            return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMicrosecond);\n        case Unit::Milliseconds:\n            return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMillisecond);\n        case Unit::Seconds:\n            return m_inNanoseconds / static_cast<double>(s_nanosecondsInASecond);\n        case Unit::Minutes:\n            return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute);\n        default:\n            return static_cast<double>(m_inNanoseconds);\n        }\n    }\n    auto unitsAsString() const -> std::string {\n        switch (m_units) {\n        case Unit::Nanoseconds:\n            return \"ns\";\n        case Unit::Microseconds:\n            return \"us\";\n        case Unit::Milliseconds:\n            return \"ms\";\n        case Unit::Seconds:\n            return \"s\";\n        case Unit::Minutes:\n            return \"m\";\n        default:\n            return \"** internal error **\";\n        }\n\n    }\n    friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& {\n        return os << duration.value() << \" \" << duration.unitsAsString();\n    }\n};\n} // end anon namespace\n\nclass TablePrinter {\n    std::ostream& m_os;\n    std::vector<ColumnInfo> m_columnInfos;\n    std::ostringstream m_oss;\n    int m_currentColumn = -1;\n    bool m_isOpen = false;\n\npublic:\n    TablePrinter( std::ostream& os, std::vector<ColumnInfo> columnInfos )\n    :   m_os( os ),\n        m_columnInfos( std::move( columnInfos ) ) {}\n\n    auto columnInfos() const -> std::vector<ColumnInfo> const& {\n        return m_columnInfos;\n    }\n\n    void open() {\n        if (!m_isOpen) {\n            m_isOpen = true;\n            *this << RowBreak();\n\n\t\t\tColumns headerCols;\n\t\t\tSpacer spacer(2);\n\t\t\tfor (auto const& info : m_columnInfos) {\n\t\t\t\theaderCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2));\n\t\t\t\theaderCols += spacer;\n\t\t\t}\n\t\t\tm_os << headerCols << \"\\n\";\n\n            m_os << Catch::getLineOfChars<'-'>() << \"\\n\";\n        }\n    }\n    void close() {\n        if (m_isOpen) {\n            *this << RowBreak();\n            m_os << std::endl;\n            m_isOpen = false;\n        }\n    }\n\n    template<typename T>\n    friend TablePrinter& operator << (TablePrinter& tp, T const& value) {\n        tp.m_oss << value;\n        return tp;\n    }\n\n    friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) {\n        auto colStr = tp.m_oss.str();\n        // This takes account of utf8 encodings\n        auto strSize = Catch::StringRef(colStr).numberOfCharacters();\n        tp.m_oss.str(\"\");\n        tp.open();\n        if (tp.m_currentColumn == static_cast<int>(tp.m_columnInfos.size() - 1)) {\n            tp.m_currentColumn = -1;\n            tp.m_os << \"\\n\";\n        }\n        tp.m_currentColumn++;\n\n        auto colInfo = tp.m_columnInfos[tp.m_currentColumn];\n        auto padding = (strSize + 2 < static_cast<std::size_t>(colInfo.width))\n            ? std::string(colInfo.width - (strSize + 2), ' ')\n            : std::string();\n        if (colInfo.justification == ColumnInfo::Left)\n            tp.m_os << colStr << padding << \" \";\n        else\n            tp.m_os << padding << colStr << \" \";\n        return tp;\n    }\n\n    friend TablePrinter& operator << (TablePrinter& tp, RowBreak) {\n        if (tp.m_currentColumn > 0) {\n            tp.m_os << \"\\n\";\n            tp.m_currentColumn = -1;\n        }\n        return tp;\n    }\n};\n\nConsoleReporter::ConsoleReporter(ReporterConfig const& config)\n    : StreamingReporterBase(config),\n    m_tablePrinter(new TablePrinter(config.stream(),\n    {\n        { \"benchmark name\", CATCH_CONFIG_CONSOLE_WIDTH - 32, ColumnInfo::Left },\n        { \"samples      mean       std dev\", 14, ColumnInfo::Right },\n        { \"iterations   low mean   low std dev\", 14, ColumnInfo::Right },\n        { \"estimated    high mean  high std dev\", 14, ColumnInfo::Right }\n    })) {}\nConsoleReporter::~ConsoleReporter() = default;\n\nstd::string ConsoleReporter::getDescription() {\n    return \"Reports test results as plain lines of text\";\n}\n\nvoid ConsoleReporter::noMatchingTestCases(std::string const& spec) {\n    stream << \"No test cases matched '\" << spec << '\\'' << std::endl;\n}\n\nvoid ConsoleReporter::assertionStarting(AssertionInfo const&) {}\n\nbool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) {\n    AssertionResult const& result = _assertionStats.assertionResult;\n\n    bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();\n\n    // Drop out if result was successful but we're not printing them.\n    if (!includeResults && result.getResultType() != ResultWas::Warning)\n        return false;\n\n    lazyPrint();\n\n    ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults);\n    printer.print();\n    stream << std::endl;\n    return true;\n}\n\nvoid ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) {\n    m_tablePrinter->close();\n    m_headerPrinted = false;\n    StreamingReporterBase::sectionStarting(_sectionInfo);\n}\nvoid ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) {\n    m_tablePrinter->close();\n    if (_sectionStats.missingAssertions) {\n        lazyPrint();\n        Colour colour(Colour::ResultError);\n        if (m_sectionStack.size() > 1)\n            stream << \"\\nNo assertions in section\";\n        else\n            stream << \"\\nNo assertions in test case\";\n        stream << \" '\" << _sectionStats.sectionInfo.name << \"'\\n\" << std::endl;\n    }\n    if (m_config->showDurations() == ShowDurations::Always) {\n        stream << getFormattedDuration(_sectionStats.durationInSeconds) << \" s: \" << _sectionStats.sectionInfo.name << std::endl;\n    }\n    if (m_headerPrinted) {\n        m_headerPrinted = false;\n    }\n    StreamingReporterBase::sectionEnded(_sectionStats);\n}\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\nvoid ConsoleReporter::benchmarkPreparing(std::string const& name) {\n\tlazyPrintWithoutClosingBenchmarkTable();\n\n\tauto nameCol = Column(name).width(static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2));\n\n\tbool firstLine = true;\n\tfor (auto line : nameCol) {\n\t\tif (!firstLine)\n\t\t\t(*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak();\n\t\telse\n\t\t\tfirstLine = false;\n\n\t\t(*m_tablePrinter) << line << ColumnBreak();\n\t}\n}\n\nvoid ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) {\n\t(*m_tablePrinter) << info.samples << ColumnBreak()\n\t\t<< info.iterations << ColumnBreak()\n\t\t<< Duration(info.estimatedDuration) << ColumnBreak();\n}\nvoid ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) {\n\t(*m_tablePrinter) << ColumnBreak()\n\t\t<< Duration(stats.mean.point.count()) << ColumnBreak()\n\t\t<< Duration(stats.mean.lower_bound.count()) << ColumnBreak()\n\t\t<< Duration(stats.mean.upper_bound.count()) << ColumnBreak() << ColumnBreak()\n\t\t<< Duration(stats.standardDeviation.point.count()) << ColumnBreak()\n\t\t<< Duration(stats.standardDeviation.lower_bound.count()) << ColumnBreak()\n\t\t<< Duration(stats.standardDeviation.upper_bound.count()) << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak();\n}\n\nvoid ConsoleReporter::benchmarkFailed(std::string const& error) {\n\tColour colour(Colour::Red);\n    (*m_tablePrinter)\n        << \"Benchmark failed (\" << error << \")\"\n        << ColumnBreak() << RowBreak();\n}\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\nvoid ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) {\n    m_tablePrinter->close();\n    StreamingReporterBase::testCaseEnded(_testCaseStats);\n    m_headerPrinted = false;\n}\nvoid ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) {\n    if (currentGroupInfo.used) {\n        printSummaryDivider();\n        stream << \"Summary for group '\" << _testGroupStats.groupInfo.name << \"':\\n\";\n        printTotals(_testGroupStats.totals);\n        stream << '\\n' << std::endl;\n    }\n    StreamingReporterBase::testGroupEnded(_testGroupStats);\n}\nvoid ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) {\n    printTotalsDivider(_testRunStats.totals);\n    printTotals(_testRunStats.totals);\n    stream << std::endl;\n    StreamingReporterBase::testRunEnded(_testRunStats);\n}\nvoid ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) {\n    StreamingReporterBase::testRunStarting(_testInfo);\n    printTestFilters();\n}\n\nvoid ConsoleReporter::lazyPrint() {\n\n    m_tablePrinter->close();\n    lazyPrintWithoutClosingBenchmarkTable();\n}\n\nvoid ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() {\n\n    if (!currentTestRunInfo.used)\n        lazyPrintRunInfo();\n    if (!currentGroupInfo.used)\n        lazyPrintGroupInfo();\n\n    if (!m_headerPrinted) {\n        printTestCaseAndSectionHeader();\n        m_headerPrinted = true;\n    }\n}\nvoid ConsoleReporter::lazyPrintRunInfo() {\n    stream << '\\n' << getLineOfChars<'~'>() << '\\n';\n    Colour colour(Colour::SecondaryText);\n    stream << currentTestRunInfo->name\n        << \" is a Catch v\" << libraryVersion() << \" host application.\\n\"\n        << \"Run with -? for options\\n\\n\";\n\n    if (m_config->rngSeed() != 0)\n        stream << \"Randomness seeded to: \" << m_config->rngSeed() << \"\\n\\n\";\n\n    currentTestRunInfo.used = true;\n}\nvoid ConsoleReporter::lazyPrintGroupInfo() {\n    if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) {\n        printClosedHeader(\"Group: \" + currentGroupInfo->name);\n        currentGroupInfo.used = true;\n    }\n}\nvoid ConsoleReporter::printTestCaseAndSectionHeader() {\n    assert(!m_sectionStack.empty());\n    printOpenHeader(currentTestCaseInfo->name);\n\n    if (m_sectionStack.size() > 1) {\n        Colour colourGuard(Colour::Headers);\n\n        auto\n            it = m_sectionStack.begin() + 1, // Skip first section (test case)\n            itEnd = m_sectionStack.end();\n        for (; it != itEnd; ++it)\n            printHeaderString(it->name, 2);\n    }\n\n    SourceLineInfo lineInfo = m_sectionStack.back().lineInfo;\n\n    if (!lineInfo.empty()) {\n        stream << getLineOfChars<'-'>() << '\\n';\n        Colour colourGuard(Colour::FileName);\n        stream << lineInfo << '\\n';\n    }\n    stream << getLineOfChars<'.'>() << '\\n' << std::endl;\n}\n\nvoid ConsoleReporter::printClosedHeader(std::string const& _name) {\n    printOpenHeader(_name);\n    stream << getLineOfChars<'.'>() << '\\n';\n}\nvoid ConsoleReporter::printOpenHeader(std::string const& _name) {\n    stream << getLineOfChars<'-'>() << '\\n';\n    {\n        Colour colourGuard(Colour::Headers);\n        printHeaderString(_name);\n    }\n}\n\n// if string has a : in first line will set indent to follow it on\n// subsequent lines\nvoid ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) {\n    std::size_t i = _string.find(\": \");\n    if (i != std::string::npos)\n        i += 2;\n    else\n        i = 0;\n    stream << Column(_string).indent(indent + i).initialIndent(indent) << '\\n';\n}\n\nstruct SummaryColumn {\n\n    SummaryColumn( std::string _label, Colour::Code _colour )\n    :   label( std::move( _label ) ),\n        colour( _colour ) {}\n    SummaryColumn addRow( std::size_t count ) {\n        ReusableStringStream rss;\n        rss << count;\n        std::string row = rss.str();\n        for (auto& oldRow : rows) {\n            while (oldRow.size() < row.size())\n                oldRow = ' ' + oldRow;\n            while (oldRow.size() > row.size())\n                row = ' ' + row;\n        }\n        rows.push_back(row);\n        return *this;\n    }\n\n    std::string label;\n    Colour::Code colour;\n    std::vector<std::string> rows;\n\n};\n\nvoid ConsoleReporter::printTotals( Totals const& totals ) {\n    if (totals.testCases.total() == 0) {\n        stream << Colour(Colour::Warning) << \"No tests ran\\n\";\n    } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) {\n        stream << Colour(Colour::ResultSuccess) << \"All tests passed\";\n        stream << \" (\"\n            << pluralise(totals.assertions.passed, \"assertion\") << \" in \"\n            << pluralise(totals.testCases.passed, \"test case\") << ')'\n            << '\\n';\n    } else {\n\n        std::vector<SummaryColumn> columns;\n        columns.push_back(SummaryColumn(\"\", Colour::None)\n                          .addRow(totals.testCases.total())\n                          .addRow(totals.assertions.total()));\n        columns.push_back(SummaryColumn(\"passed\", Colour::Success)\n                          .addRow(totals.testCases.passed)\n                          .addRow(totals.assertions.passed));\n        columns.push_back(SummaryColumn(\"failed\", Colour::ResultError)\n                          .addRow(totals.testCases.failed)\n                          .addRow(totals.assertions.failed));\n        columns.push_back(SummaryColumn(\"failed as expected\", Colour::ResultExpectedFailure)\n                          .addRow(totals.testCases.failedButOk)\n                          .addRow(totals.assertions.failedButOk));\n\n        printSummaryRow(\"test cases\", columns, 0);\n        printSummaryRow(\"assertions\", columns, 1);\n    }\n}\nvoid ConsoleReporter::printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row) {\n    for (auto col : cols) {\n        std::string value = col.rows[row];\n        if (col.label.empty()) {\n            stream << label << \": \";\n            if (value != \"0\")\n                stream << value;\n            else\n                stream << Colour(Colour::Warning) << \"- none -\";\n        } else if (value != \"0\") {\n            stream << Colour(Colour::LightGrey) << \" | \";\n            stream << Colour(col.colour)\n                << value << ' ' << col.label;\n        }\n    }\n    stream << '\\n';\n}\n\nvoid ConsoleReporter::printTotalsDivider(Totals const& totals) {\n    if (totals.testCases.total() > 0) {\n        std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total());\n        std::size_t failedButOkRatio = makeRatio(totals.testCases.failedButOk, totals.testCases.total());\n        std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total());\n        while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1)\n            findMax(failedRatio, failedButOkRatio, passedRatio)++;\n        while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1)\n            findMax(failedRatio, failedButOkRatio, passedRatio)--;\n\n        stream << Colour(Colour::Error) << std::string(failedRatio, '=');\n        stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '=');\n        if (totals.testCases.allPassed())\n            stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '=');\n        else\n            stream << Colour(Colour::Success) << std::string(passedRatio, '=');\n    } else {\n        stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '=');\n    }\n    stream << '\\n';\n}\nvoid ConsoleReporter::printSummaryDivider() {\n    stream << getLineOfChars<'-'>() << '\\n';\n}\n\nvoid ConsoleReporter::printTestFilters() {\n    if (m_config->testSpec().hasFilters())\n        stream << Colour(Colour::BrightYellow) << \"Filters: \" << serializeFilters( m_config->getTestsOrTags() ) << '\\n';\n}\n\nCATCH_REGISTER_REPORTER(\"console\", ConsoleReporter)\n\n} // end namespace Catch\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\n#if defined(__clang__)\n#  pragma clang diagnostic pop\n#endif\n// end catch_reporter_console.cpp\n// start catch_reporter_junit.cpp\n\n#include <cassert>\n#include <sstream>\n#include <ctime>\n#include <algorithm>\n\nnamespace Catch {\n\n    namespace {\n        std::string getCurrentTimestamp() {\n            // Beware, this is not reentrant because of backward compatibility issues\n            // Also, UTC only, again because of backward compatibility (%z is C++11)\n            time_t rawtime;\n            std::time(&rawtime);\n            auto const timeStampSize = sizeof(\"2017-01-16T17:06:45Z\");\n\n#ifdef _MSC_VER\n            std::tm timeInfo = {};\n            gmtime_s(&timeInfo, &rawtime);\n#else\n            std::tm* timeInfo;\n            timeInfo = std::gmtime(&rawtime);\n#endif\n\n            char timeStamp[timeStampSize];\n            const char * const fmt = \"%Y-%m-%dT%H:%M:%SZ\";\n\n#ifdef _MSC_VER\n            std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);\n#else\n            std::strftime(timeStamp, timeStampSize, fmt, timeInfo);\n#endif\n            return std::string(timeStamp);\n        }\n\n        std::string fileNameTag(const std::vector<std::string> &tags) {\n            auto it = std::find_if(begin(tags),\n                                   end(tags),\n                                   [] (std::string const& tag) {return tag.front() == '#'; });\n            if (it != tags.end())\n                return it->substr(1);\n            return std::string();\n        }\n    } // anonymous namespace\n\n    JunitReporter::JunitReporter( ReporterConfig const& _config )\n        :   CumulativeReporterBase( _config ),\n            xml( _config.stream() )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = true;\n            m_reporterPrefs.shouldReportAllAssertions = true;\n        }\n\n    JunitReporter::~JunitReporter() {}\n\n    std::string JunitReporter::getDescription() {\n        return \"Reports test results in an XML format that looks like Ant's junitreport target\";\n    }\n\n    void JunitReporter::noMatchingTestCases( std::string const& /*spec*/ ) {}\n\n    void JunitReporter::testRunStarting( TestRunInfo const& runInfo )  {\n        CumulativeReporterBase::testRunStarting( runInfo );\n        xml.startElement( \"testsuites\" );\n    }\n\n    void JunitReporter::testGroupStarting( GroupInfo const& groupInfo ) {\n        suiteTimer.start();\n        stdOutForSuite.clear();\n        stdErrForSuite.clear();\n        unexpectedExceptions = 0;\n        CumulativeReporterBase::testGroupStarting( groupInfo );\n    }\n\n    void JunitReporter::testCaseStarting( TestCaseInfo const& testCaseInfo ) {\n        m_okToFail = testCaseInfo.okToFail();\n    }\n\n    bool JunitReporter::assertionEnded( AssertionStats const& assertionStats ) {\n        if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail )\n            unexpectedExceptions++;\n        return CumulativeReporterBase::assertionEnded( assertionStats );\n    }\n\n    void JunitReporter::testCaseEnded( TestCaseStats const& testCaseStats ) {\n        stdOutForSuite += testCaseStats.stdOut;\n        stdErrForSuite += testCaseStats.stdErr;\n        CumulativeReporterBase::testCaseEnded( testCaseStats );\n    }\n\n    void JunitReporter::testGroupEnded( TestGroupStats const& testGroupStats ) {\n        double suiteTime = suiteTimer.getElapsedSeconds();\n        CumulativeReporterBase::testGroupEnded( testGroupStats );\n        writeGroup( *m_testGroups.back(), suiteTime );\n    }\n\n    void JunitReporter::testRunEndedCumulative() {\n        xml.endElement();\n    }\n\n    void JunitReporter::writeGroup( TestGroupNode const& groupNode, double suiteTime ) {\n        XmlWriter::ScopedElement e = xml.scopedElement( \"testsuite\" );\n\n        TestGroupStats const& stats = groupNode.value;\n        xml.writeAttribute( \"name\", stats.groupInfo.name );\n        xml.writeAttribute( \"errors\", unexpectedExceptions );\n        xml.writeAttribute( \"failures\", stats.totals.assertions.failed-unexpectedExceptions );\n        xml.writeAttribute( \"tests\", stats.totals.assertions.total() );\n        xml.writeAttribute( \"hostname\", \"tbd\" ); // !TBD\n        if( m_config->showDurations() == ShowDurations::Never )\n            xml.writeAttribute( \"time\", \"\" );\n        else\n            xml.writeAttribute( \"time\", suiteTime );\n        xml.writeAttribute( \"timestamp\", getCurrentTimestamp() );\n\n        // Write properties if there are any\n        if (m_config->hasTestFilters() || m_config->rngSeed() != 0) {\n            auto properties = xml.scopedElement(\"properties\");\n            if (m_config->hasTestFilters()) {\n                xml.scopedElement(\"property\")\n                    .writeAttribute(\"name\", \"filters\")\n                    .writeAttribute(\"value\", serializeFilters(m_config->getTestsOrTags()));\n            }\n            if (m_config->rngSeed() != 0) {\n                xml.scopedElement(\"property\")\n                    .writeAttribute(\"name\", \"random-seed\")\n                    .writeAttribute(\"value\", m_config->rngSeed());\n            }\n        }\n\n        // Write test cases\n        for( auto const& child : groupNode.children )\n            writeTestCase( *child );\n\n        xml.scopedElement( \"system-out\" ).writeText( trim( stdOutForSuite ), false );\n        xml.scopedElement( \"system-err\" ).writeText( trim( stdErrForSuite ), false );\n    }\n\n    void JunitReporter::writeTestCase( TestCaseNode const& testCaseNode ) {\n        TestCaseStats const& stats = testCaseNode.value;\n\n        // All test cases have exactly one section - which represents the\n        // test case itself. That section may have 0-n nested sections\n        assert( testCaseNode.children.size() == 1 );\n        SectionNode const& rootSection = *testCaseNode.children.front();\n\n        std::string className = stats.testInfo.className;\n\n        if( className.empty() ) {\n            className = fileNameTag(stats.testInfo.tags);\n            if ( className.empty() )\n                className = \"global\";\n        }\n\n        if ( !m_config->name().empty() )\n            className = m_config->name() + \".\" + className;\n\n        writeSection( className, \"\", rootSection );\n    }\n\n    void JunitReporter::writeSection(  std::string const& className,\n                        std::string const& rootName,\n                        SectionNode const& sectionNode ) {\n        std::string name = trim( sectionNode.stats.sectionInfo.name );\n        if( !rootName.empty() )\n            name = rootName + '/' + name;\n\n        if( !sectionNode.assertions.empty() ||\n            !sectionNode.stdOut.empty() ||\n            !sectionNode.stdErr.empty() ) {\n            XmlWriter::ScopedElement e = xml.scopedElement( \"testcase\" );\n            if( className.empty() ) {\n                xml.writeAttribute( \"classname\", name );\n                xml.writeAttribute( \"name\", \"root\" );\n            }\n            else {\n                xml.writeAttribute( \"classname\", className );\n                xml.writeAttribute( \"name\", name );\n            }\n            xml.writeAttribute( \"time\", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) );\n\n            writeAssertions( sectionNode );\n\n            if( !sectionNode.stdOut.empty() )\n                xml.scopedElement( \"system-out\" ).writeText( trim( sectionNode.stdOut ), false );\n            if( !sectionNode.stdErr.empty() )\n                xml.scopedElement( \"system-err\" ).writeText( trim( sectionNode.stdErr ), false );\n        }\n        for( auto const& childNode : sectionNode.childSections )\n            if( className.empty() )\n                writeSection( name, \"\", *childNode );\n            else\n                writeSection( className, name, *childNode );\n    }\n\n    void JunitReporter::writeAssertions( SectionNode const& sectionNode ) {\n        for( auto const& assertion : sectionNode.assertions )\n            writeAssertion( assertion );\n    }\n\n    void JunitReporter::writeAssertion( AssertionStats const& stats ) {\n        AssertionResult const& result = stats.assertionResult;\n        if( !result.isOk() ) {\n            std::string elementName;\n            switch( result.getResultType() ) {\n                case ResultWas::ThrewException:\n                case ResultWas::FatalErrorCondition:\n                    elementName = \"error\";\n                    break;\n                case ResultWas::ExplicitFailure:\n                    elementName = \"failure\";\n                    break;\n                case ResultWas::ExpressionFailed:\n                    elementName = \"failure\";\n                    break;\n                case ResultWas::DidntThrowException:\n                    elementName = \"failure\";\n                    break;\n\n                // We should never see these here:\n                case ResultWas::Info:\n                case ResultWas::Warning:\n                case ResultWas::Ok:\n                case ResultWas::Unknown:\n                case ResultWas::FailureBit:\n                case ResultWas::Exception:\n                    elementName = \"internalError\";\n                    break;\n            }\n\n            XmlWriter::ScopedElement e = xml.scopedElement( elementName );\n\n            xml.writeAttribute( \"message\", result.getExpandedExpression() );\n            xml.writeAttribute( \"type\", result.getTestMacroName() );\n\n            ReusableStringStream rss;\n            if( !result.getMessage().empty() )\n                rss << result.getMessage() << '\\n';\n            for( auto const& msg : stats.infoMessages )\n                if( msg.type == ResultWas::Info )\n                    rss << msg.message << '\\n';\n\n            rss << \"at \" << result.getSourceInfo();\n            xml.writeText( rss.str(), false );\n        }\n    }\n\n    CATCH_REGISTER_REPORTER( \"junit\", JunitReporter )\n\n} // end namespace Catch\n// end catch_reporter_junit.cpp\n// start catch_reporter_listening.cpp\n\n#include <cassert>\n\nnamespace Catch {\n\n    ListeningReporter::ListeningReporter() {\n        // We will assume that listeners will always want all assertions\n        m_preferences.shouldReportAllAssertions = true;\n    }\n\n    void ListeningReporter::addListener( IStreamingReporterPtr&& listener ) {\n        m_listeners.push_back( std::move( listener ) );\n    }\n\n    void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) {\n        assert(!m_reporter && \"Listening reporter can wrap only 1 real reporter\");\n        m_reporter = std::move( reporter );\n        m_preferences.shouldRedirectStdOut = m_reporter->getPreferences().shouldRedirectStdOut;\n    }\n\n    ReporterPreferences ListeningReporter::getPreferences() const {\n        return m_preferences;\n    }\n\n    std::set<Verbosity> ListeningReporter::getSupportedVerbosities() {\n        return std::set<Verbosity>{ };\n    }\n\n    void ListeningReporter::noMatchingTestCases( std::string const& spec ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->noMatchingTestCases( spec );\n        }\n        m_reporter->noMatchingTestCases( spec );\n    }\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    void ListeningReporter::benchmarkPreparing( std::string const& name ) {\n\t\tfor (auto const& listener : m_listeners) {\n\t\t\tlistener->benchmarkPreparing(name);\n\t\t}\n\t\tm_reporter->benchmarkPreparing(name);\n\t}\n    void ListeningReporter::benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->benchmarkStarting( benchmarkInfo );\n        }\n        m_reporter->benchmarkStarting( benchmarkInfo );\n    }\n    void ListeningReporter::benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->benchmarkEnded( benchmarkStats );\n        }\n        m_reporter->benchmarkEnded( benchmarkStats );\n    }\n\n\tvoid ListeningReporter::benchmarkFailed( std::string const& error ) {\n\t\tfor (auto const& listener : m_listeners) {\n\t\t\tlistener->benchmarkFailed(error);\n\t\t}\n\t\tm_reporter->benchmarkFailed(error);\n\t}\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    void ListeningReporter::testRunStarting( TestRunInfo const& testRunInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testRunStarting( testRunInfo );\n        }\n        m_reporter->testRunStarting( testRunInfo );\n    }\n\n    void ListeningReporter::testGroupStarting( GroupInfo const& groupInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testGroupStarting( groupInfo );\n        }\n        m_reporter->testGroupStarting( groupInfo );\n    }\n\n    void ListeningReporter::testCaseStarting( TestCaseInfo const& testInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testCaseStarting( testInfo );\n        }\n        m_reporter->testCaseStarting( testInfo );\n    }\n\n    void ListeningReporter::sectionStarting( SectionInfo const& sectionInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->sectionStarting( sectionInfo );\n        }\n        m_reporter->sectionStarting( sectionInfo );\n    }\n\n    void ListeningReporter::assertionStarting( AssertionInfo const& assertionInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->assertionStarting( assertionInfo );\n        }\n        m_reporter->assertionStarting( assertionInfo );\n    }\n\n    // The return value indicates if the messages buffer should be cleared:\n    bool ListeningReporter::assertionEnded( AssertionStats const& assertionStats ) {\n        for( auto const& listener : m_listeners ) {\n            static_cast<void>( listener->assertionEnded( assertionStats ) );\n        }\n        return m_reporter->assertionEnded( assertionStats );\n    }\n\n    void ListeningReporter::sectionEnded( SectionStats const& sectionStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->sectionEnded( sectionStats );\n        }\n        m_reporter->sectionEnded( sectionStats );\n    }\n\n    void ListeningReporter::testCaseEnded( TestCaseStats const& testCaseStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testCaseEnded( testCaseStats );\n        }\n        m_reporter->testCaseEnded( testCaseStats );\n    }\n\n    void ListeningReporter::testGroupEnded( TestGroupStats const& testGroupStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testGroupEnded( testGroupStats );\n        }\n        m_reporter->testGroupEnded( testGroupStats );\n    }\n\n    void ListeningReporter::testRunEnded( TestRunStats const& testRunStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testRunEnded( testRunStats );\n        }\n        m_reporter->testRunEnded( testRunStats );\n    }\n\n    void ListeningReporter::skipTest( TestCaseInfo const& testInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->skipTest( testInfo );\n        }\n        m_reporter->skipTest( testInfo );\n    }\n\n    bool ListeningReporter::isMulti() const {\n        return true;\n    }\n\n} // end namespace Catch\n// end catch_reporter_listening.cpp\n// start catch_reporter_xml.cpp\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch\n                              // Note that 4062 (not all labels are handled\n                              // and default is missing) is enabled\n#endif\n\nnamespace Catch {\n    XmlReporter::XmlReporter( ReporterConfig const& _config )\n    :   StreamingReporterBase( _config ),\n        m_xml(_config.stream())\n    {\n        m_reporterPrefs.shouldRedirectStdOut = true;\n        m_reporterPrefs.shouldReportAllAssertions = true;\n    }\n\n    XmlReporter::~XmlReporter() = default;\n\n    std::string XmlReporter::getDescription() {\n        return \"Reports test results as an XML document\";\n    }\n\n    std::string XmlReporter::getStylesheetRef() const {\n        return std::string();\n    }\n\n    void XmlReporter::writeSourceInfo( SourceLineInfo const& sourceInfo ) {\n        m_xml\n            .writeAttribute( \"filename\", sourceInfo.file )\n            .writeAttribute( \"line\", sourceInfo.line );\n    }\n\n    void XmlReporter::noMatchingTestCases( std::string const& s ) {\n        StreamingReporterBase::noMatchingTestCases( s );\n    }\n\n    void XmlReporter::testRunStarting( TestRunInfo const& testInfo ) {\n        StreamingReporterBase::testRunStarting( testInfo );\n        std::string stylesheetRef = getStylesheetRef();\n        if( !stylesheetRef.empty() )\n            m_xml.writeStylesheetRef( stylesheetRef );\n        m_xml.startElement( \"Catch\" );\n        if( !m_config->name().empty() )\n            m_xml.writeAttribute( \"name\", m_config->name() );\n        if (m_config->testSpec().hasFilters())\n            m_xml.writeAttribute( \"filters\", serializeFilters( m_config->getTestsOrTags() ) );\n        if( m_config->rngSeed() != 0 )\n            m_xml.scopedElement( \"Randomness\" )\n                .writeAttribute( \"seed\", m_config->rngSeed() );\n    }\n\n    void XmlReporter::testGroupStarting( GroupInfo const& groupInfo ) {\n        StreamingReporterBase::testGroupStarting( groupInfo );\n        m_xml.startElement( \"Group\" )\n            .writeAttribute( \"name\", groupInfo.name );\n    }\n\n    void XmlReporter::testCaseStarting( TestCaseInfo const& testInfo ) {\n        StreamingReporterBase::testCaseStarting(testInfo);\n        m_xml.startElement( \"TestCase\" )\n            .writeAttribute( \"name\", trim( testInfo.name ) )\n            .writeAttribute( \"description\", testInfo.description )\n            .writeAttribute( \"tags\", testInfo.tagsAsString() );\n\n        writeSourceInfo( testInfo.lineInfo );\n\n        if ( m_config->showDurations() == ShowDurations::Always )\n            m_testCaseTimer.start();\n        m_xml.ensureTagClosed();\n    }\n\n    void XmlReporter::sectionStarting( SectionInfo const& sectionInfo ) {\n        StreamingReporterBase::sectionStarting( sectionInfo );\n        if( m_sectionDepth++ > 0 ) {\n            m_xml.startElement( \"Section\" )\n                .writeAttribute( \"name\", trim( sectionInfo.name ) );\n            writeSourceInfo( sectionInfo.lineInfo );\n            m_xml.ensureTagClosed();\n        }\n    }\n\n    void XmlReporter::assertionStarting( AssertionInfo const& ) { }\n\n    bool XmlReporter::assertionEnded( AssertionStats const& assertionStats ) {\n\n        AssertionResult const& result = assertionStats.assertionResult;\n\n        bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();\n\n        if( includeResults || result.getResultType() == ResultWas::Warning ) {\n            // Print any info messages in <Info> tags.\n            for( auto const& msg : assertionStats.infoMessages ) {\n                if( msg.type == ResultWas::Info && includeResults ) {\n                    m_xml.scopedElement( \"Info\" )\n                            .writeText( msg.message );\n                } else if ( msg.type == ResultWas::Warning ) {\n                    m_xml.scopedElement( \"Warning\" )\n                            .writeText( msg.message );\n                }\n            }\n        }\n\n        // Drop out if result was successful but we're not printing them.\n        if( !includeResults && result.getResultType() != ResultWas::Warning )\n            return true;\n\n        // Print the expression if there is one.\n        if( result.hasExpression() ) {\n            m_xml.startElement( \"Expression\" )\n                .writeAttribute( \"success\", result.succeeded() )\n                .writeAttribute( \"type\", result.getTestMacroName() );\n\n            writeSourceInfo( result.getSourceInfo() );\n\n            m_xml.scopedElement( \"Original\" )\n                .writeText( result.getExpression() );\n            m_xml.scopedElement( \"Expanded\" )\n                .writeText( result.getExpandedExpression() );\n        }\n\n        // And... Print a result applicable to each result type.\n        switch( result.getResultType() ) {\n            case ResultWas::ThrewException:\n                m_xml.startElement( \"Exception\" );\n                writeSourceInfo( result.getSourceInfo() );\n                m_xml.writeText( result.getMessage() );\n                m_xml.endElement();\n                break;\n            case ResultWas::FatalErrorCondition:\n                m_xml.startElement( \"FatalErrorCondition\" );\n                writeSourceInfo( result.getSourceInfo() );\n                m_xml.writeText( result.getMessage() );\n                m_xml.endElement();\n                break;\n            case ResultWas::Info:\n                m_xml.scopedElement( \"Info\" )\n                    .writeText( result.getMessage() );\n                break;\n            case ResultWas::Warning:\n                // Warning will already have been written\n                break;\n            case ResultWas::ExplicitFailure:\n                m_xml.startElement( \"Failure\" );\n                writeSourceInfo( result.getSourceInfo() );\n                m_xml.writeText( result.getMessage() );\n                m_xml.endElement();\n                break;\n            default:\n                break;\n        }\n\n        if( result.hasExpression() )\n            m_xml.endElement();\n\n        return true;\n    }\n\n    void XmlReporter::sectionEnded( SectionStats const& sectionStats ) {\n        StreamingReporterBase::sectionEnded( sectionStats );\n        if( --m_sectionDepth > 0 ) {\n            XmlWriter::ScopedElement e = m_xml.scopedElement( \"OverallResults\" );\n            e.writeAttribute( \"successes\", sectionStats.assertions.passed );\n            e.writeAttribute( \"failures\", sectionStats.assertions.failed );\n            e.writeAttribute( \"expectedFailures\", sectionStats.assertions.failedButOk );\n\n            if ( m_config->showDurations() == ShowDurations::Always )\n                e.writeAttribute( \"durationInSeconds\", sectionStats.durationInSeconds );\n\n            m_xml.endElement();\n        }\n    }\n\n    void XmlReporter::testCaseEnded( TestCaseStats const& testCaseStats ) {\n        StreamingReporterBase::testCaseEnded( testCaseStats );\n        XmlWriter::ScopedElement e = m_xml.scopedElement( \"OverallResult\" );\n        e.writeAttribute( \"success\", testCaseStats.totals.assertions.allOk() );\n\n        if ( m_config->showDurations() == ShowDurations::Always )\n            e.writeAttribute( \"durationInSeconds\", m_testCaseTimer.getElapsedSeconds() );\n\n        if( !testCaseStats.stdOut.empty() )\n            m_xml.scopedElement( \"StdOut\" ).writeText( trim( testCaseStats.stdOut ), false );\n        if( !testCaseStats.stdErr.empty() )\n            m_xml.scopedElement( \"StdErr\" ).writeText( trim( testCaseStats.stdErr ), false );\n\n        m_xml.endElement();\n    }\n\n    void XmlReporter::testGroupEnded( TestGroupStats const& testGroupStats ) {\n        StreamingReporterBase::testGroupEnded( testGroupStats );\n        // TODO: Check testGroupStats.aborting and act accordingly.\n        m_xml.scopedElement( \"OverallResults\" )\n            .writeAttribute( \"successes\", testGroupStats.totals.assertions.passed )\n            .writeAttribute( \"failures\", testGroupStats.totals.assertions.failed )\n            .writeAttribute( \"expectedFailures\", testGroupStats.totals.assertions.failedButOk );\n        m_xml.endElement();\n    }\n\n    void XmlReporter::testRunEnded( TestRunStats const& testRunStats ) {\n        StreamingReporterBase::testRunEnded( testRunStats );\n        m_xml.scopedElement( \"OverallResults\" )\n            .writeAttribute( \"successes\", testRunStats.totals.assertions.passed )\n            .writeAttribute( \"failures\", testRunStats.totals.assertions.failed )\n            .writeAttribute( \"expectedFailures\", testRunStats.totals.assertions.failedButOk );\n        m_xml.endElement();\n    }\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    void XmlReporter::benchmarkStarting(BenchmarkInfo const &info) {\n        m_xml.startElement(\"BenchmarkResults\")\n            .writeAttribute(\"name\", info.name)\n            .writeAttribute(\"samples\", info.samples)\n            .writeAttribute(\"resamples\", info.resamples)\n            .writeAttribute(\"iterations\", info.iterations)\n            .writeAttribute(\"clockResolution\", static_cast<uint64_t>(info.clockResolution))\n            .writeAttribute(\"estimatedDuration\", static_cast<uint64_t>(info.estimatedDuration))\n            .writeComment(\"All values in nano seconds\");\n    }\n\n    void XmlReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) {\n        m_xml.startElement(\"mean\")\n            .writeAttribute(\"value\", static_cast<uint64_t>(benchmarkStats.mean.point.count()))\n            .writeAttribute(\"lowerBound\", static_cast<uint64_t>(benchmarkStats.mean.lower_bound.count()))\n            .writeAttribute(\"upperBound\", static_cast<uint64_t>(benchmarkStats.mean.upper_bound.count()))\n            .writeAttribute(\"ci\", benchmarkStats.mean.confidence_interval);\n        m_xml.endElement();\n        m_xml.startElement(\"standardDeviation\")\n            .writeAttribute(\"value\", benchmarkStats.standardDeviation.point.count())\n            .writeAttribute(\"lowerBound\", benchmarkStats.standardDeviation.lower_bound.count())\n            .writeAttribute(\"upperBound\", benchmarkStats.standardDeviation.upper_bound.count())\n            .writeAttribute(\"ci\", benchmarkStats.standardDeviation.confidence_interval);\n        m_xml.endElement();\n        m_xml.startElement(\"outliers\")\n            .writeAttribute(\"variance\", benchmarkStats.outlierVariance)\n            .writeAttribute(\"lowMild\", benchmarkStats.outliers.low_mild)\n            .writeAttribute(\"lowSevere\", benchmarkStats.outliers.low_severe)\n            .writeAttribute(\"highMild\", benchmarkStats.outliers.high_mild)\n            .writeAttribute(\"highSevere\", benchmarkStats.outliers.high_severe);\n        m_xml.endElement();\n        m_xml.endElement();\n    }\n\n    void XmlReporter::benchmarkFailed(std::string const &error) {\n        m_xml.scopedElement(\"failed\").\n            writeAttribute(\"message\", error);\n        m_xml.endElement();\n    }\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    CATCH_REGISTER_REPORTER( \"xml\", XmlReporter )\n\n} // end namespace Catch\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n// end catch_reporter_xml.cpp\n\nnamespace Catch {\n    LeakDetector leakDetector;\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// end catch_impl.hpp\n#endif\n\n#ifdef CATCH_CONFIG_MAIN\n// start catch_default_main.hpp\n\n#ifndef __OBJC__\n\n#if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN)\n// Standard C/C++ Win32 Unicode wmain entry point\nextern \"C\" int wmain (int argc, wchar_t * argv[], wchar_t * []) {\n#else\n// Standard C/C++ main entry point\nint main (int argc, char * argv[]) {\n#endif\n\n    return Catch::Session().run( argc, argv );\n}\n\n#else // __OBJC__\n\n// Objective-C entry point\nint main (int argc, char * const argv[]) {\n#if !CATCH_ARC_ENABLED\n    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\n#endif\n\n    Catch::registerTestMethods();\n    int result = Catch::Session().run( argc, (char**)argv );\n\n#if !CATCH_ARC_ENABLED\n    [pool drain];\n#endif\n\n    return result;\n}\n\n#endif // __OBJC__\n\n// end catch_default_main.hpp\n#endif\n\n#if !defined(CATCH_CONFIG_IMPL_ONLY)\n\n#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED\n#  undef CLARA_CONFIG_MAIN\n#endif\n\n#if !defined(CATCH_CONFIG_DISABLE)\n//////\n// If this config identifier is defined then all CATCH macros are prefixed with CATCH_\n#ifdef CATCH_CONFIG_PREFIX_ALL\n\n#define CATCH_REQUIRE( ... ) INTERNAL_CATCH_TEST( \"CATCH_REQUIRE\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define CATCH_REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( \"CATCH_REQUIRE_FALSE\", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )\n\n#define CATCH_REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( \"CATCH_REQUIRE_THROWS\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( \"CATCH_REQUIRE_THROWS_AS\", exceptionType, Catch::ResultDisposition::Normal, expr )\n#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( \"CATCH_REQUIRE_THROWS_WITH\", Catch::ResultDisposition::Normal, matcher, expr )\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( \"CATCH_REQUIRE_THROWS_MATCHES\", exceptionType, Catch::ResultDisposition::Normal, matcher, expr )\n#endif// CATCH_CONFIG_DISABLE_MATCHERS\n#define CATCH_REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( \"CATCH_REQUIRE_NOTHROW\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n\n#define CATCH_CHECK( ... ) INTERNAL_CATCH_TEST( \"CATCH_CHECK\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( \"CATCH_CHECK_FALSE\", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )\n#define CATCH_CHECKED_IF( ... ) INTERNAL_CATCH_IF( \"CATCH_CHECKED_IF\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( \"CATCH_CHECKED_ELSE\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( \"CATCH_CHECK_NOFAIL\", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ )\n\n#define CATCH_CHECK_THROWS( ... )  INTERNAL_CATCH_THROWS( \"CATCH_CHECK_THROWS\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( \"CATCH_CHECK_THROWS_AS\", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )\n#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( \"CATCH_CHECK_THROWS_WITH\", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( \"CATCH_CHECK_THROWS_MATCHES\", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define CATCH_CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( \"CATCH_CHECK_NOTHROW\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( \"CATCH_CHECK_THAT\", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )\n\n#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( \"CATCH_REQUIRE_THAT\", matcher, Catch::ResultDisposition::Normal, arg )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( \"CATCH_INFO\", msg )\n#define CATCH_UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( \"CATCH_UNSCOPED_INFO\", msg )\n#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( \"CATCH_WARN\", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )\n#define CATCH_CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), \"CATCH_CAPTURE\",__VA_ARGS__ )\n\n#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )\n#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )\n#define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )\n#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )\n#define CATCH_DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ )\n#define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( \"CATCH_FAIL\", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( \"CATCH_FAIL_CHECK\", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( \"CATCH_SUCCEED\", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n\n#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )\n#else\n#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )\n#endif\n\n#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)\n#define CATCH_STATIC_REQUIRE( ... )       static_assert(   __VA_ARGS__ ,      #__VA_ARGS__ );     CATCH_SUCCEED( #__VA_ARGS__ )\n#define CATCH_STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), \"!(\" #__VA_ARGS__ \")\" ); CATCH_SUCCEED( #__VA_ARGS__ )\n#else\n#define CATCH_STATIC_REQUIRE( ... )       CATCH_REQUIRE( __VA_ARGS__ )\n#define CATCH_STATIC_REQUIRE_FALSE( ... ) CATCH_REQUIRE_FALSE( __VA_ARGS__ )\n#endif\n\n// \"BDD-style\" convenience wrappers\n#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( \"Scenario: \" __VA_ARGS__ )\n#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, \"Scenario: \" __VA_ARGS__ )\n#define CATCH_GIVEN( desc )     INTERNAL_CATCH_DYNAMIC_SECTION( \"    Given: \" << desc )\n#define CATCH_AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( \"And given: \" << desc )\n#define CATCH_WHEN( desc )      INTERNAL_CATCH_DYNAMIC_SECTION( \"     When: \" << desc )\n#define CATCH_AND_WHEN( desc )  INTERNAL_CATCH_DYNAMIC_SECTION( \" And when: \" << desc )\n#define CATCH_THEN( desc )      INTERNAL_CATCH_DYNAMIC_SECTION( \"     Then: \" << desc )\n#define CATCH_AND_THEN( desc )  INTERNAL_CATCH_DYNAMIC_SECTION( \"      And: \" << desc )\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n#define CATCH_BENCHMARK(...) \\\n    INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,))\n#define CATCH_BENCHMARK_ADVANCED(name) \\\n    INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name)\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required\n#else\n\n#define REQUIRE( ... ) INTERNAL_CATCH_TEST( \"REQUIRE\", Catch::ResultDisposition::Normal, __VA_ARGS__  )\n#define REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( \"REQUIRE_FALSE\", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )\n\n#define REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( \"REQUIRE_THROWS\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( \"REQUIRE_THROWS_AS\", exceptionType, Catch::ResultDisposition::Normal, expr )\n#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( \"REQUIRE_THROWS_WITH\", Catch::ResultDisposition::Normal, matcher, expr )\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( \"REQUIRE_THROWS_MATCHES\", exceptionType, Catch::ResultDisposition::Normal, matcher, expr )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( \"REQUIRE_NOTHROW\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n\n#define CHECK( ... ) INTERNAL_CATCH_TEST( \"CHECK\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( \"CHECK_FALSE\", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )\n#define CHECKED_IF( ... ) INTERNAL_CATCH_IF( \"CHECKED_IF\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( \"CHECKED_ELSE\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( \"CHECK_NOFAIL\", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ )\n\n#define CHECK_THROWS( ... )  INTERNAL_CATCH_THROWS( \"CHECK_THROWS\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( \"CHECK_THROWS_AS\", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )\n#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( \"CHECK_THROWS_WITH\", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( \"CHECK_THROWS_MATCHES\", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( \"CHECK_NOTHROW\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( \"CHECK_THAT\", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )\n\n#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( \"REQUIRE_THAT\", matcher, Catch::ResultDisposition::Normal, arg )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n#define INFO( msg ) INTERNAL_CATCH_INFO( \"INFO\", msg )\n#define UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( \"UNSCOPED_INFO\", msg )\n#define WARN( msg ) INTERNAL_CATCH_MSG( \"WARN\", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )\n#define CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), \"CAPTURE\",__VA_ARGS__ )\n\n#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )\n#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )\n#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )\n#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )\n#define DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ )\n#define FAIL( ... ) INTERNAL_CATCH_MSG( \"FAIL\", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( \"FAIL_CHECK\", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define SUCCEED( ... ) INTERNAL_CATCH_MSG( \"SUCCEED\", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ )\n#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )\n#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__)\n#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#else\n#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) )\n#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) )\n#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )\n#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE( __VA_ARGS__ ) )\n#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#endif\n\n#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)\n#define STATIC_REQUIRE( ... )       static_assert(   __VA_ARGS__,  #__VA_ARGS__ ); SUCCEED( #__VA_ARGS__ )\n#define STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), \"!(\" #__VA_ARGS__ \")\" ); SUCCEED( \"!(\" #__VA_ARGS__ \")\" )\n#else\n#define STATIC_REQUIRE( ... )       REQUIRE( __VA_ARGS__ )\n#define STATIC_REQUIRE_FALSE( ... ) REQUIRE_FALSE( __VA_ARGS__ )\n#endif\n\n#endif\n\n#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )\n\n// \"BDD-style\" convenience wrappers\n#define SCENARIO( ... ) TEST_CASE( \"Scenario: \" __VA_ARGS__ )\n#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, \"Scenario: \" __VA_ARGS__ )\n\n#define GIVEN( desc )     INTERNAL_CATCH_DYNAMIC_SECTION( \"    Given: \" << desc )\n#define AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( \"And given: \" << desc )\n#define WHEN( desc )      INTERNAL_CATCH_DYNAMIC_SECTION( \"     When: \" << desc )\n#define AND_WHEN( desc )  INTERNAL_CATCH_DYNAMIC_SECTION( \" And when: \" << desc )\n#define THEN( desc )      INTERNAL_CATCH_DYNAMIC_SECTION( \"     Then: \" << desc )\n#define AND_THEN( desc )  INTERNAL_CATCH_DYNAMIC_SECTION( \"      And: \" << desc )\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n#define BENCHMARK(...) \\\n    INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,))\n#define BENCHMARK_ADVANCED(name) \\\n    INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name)\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\nusing Catch::Detail::Approx;\n\n#else // CATCH_CONFIG_DISABLE\n\n//////\n// If this config identifier is defined then all CATCH macros are prefixed with CATCH_\n#ifdef CATCH_CONFIG_PREFIX_ALL\n\n#define CATCH_REQUIRE( ... )        (void)(0)\n#define CATCH_REQUIRE_FALSE( ... )  (void)(0)\n\n#define CATCH_REQUIRE_THROWS( ... ) (void)(0)\n#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0)\n#define CATCH_REQUIRE_THROWS_WITH( expr, matcher )     (void)(0)\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)\n#endif// CATCH_CONFIG_DISABLE_MATCHERS\n#define CATCH_REQUIRE_NOTHROW( ... ) (void)(0)\n\n#define CATCH_CHECK( ... )         (void)(0)\n#define CATCH_CHECK_FALSE( ... )   (void)(0)\n#define CATCH_CHECKED_IF( ... )    if (__VA_ARGS__)\n#define CATCH_CHECKED_ELSE( ... )  if (!(__VA_ARGS__))\n#define CATCH_CHECK_NOFAIL( ... )  (void)(0)\n\n#define CATCH_CHECK_THROWS( ... )  (void)(0)\n#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) (void)(0)\n#define CATCH_CHECK_THROWS_WITH( expr, matcher )     (void)(0)\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define CATCH_CHECK_NOTHROW( ... ) (void)(0)\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_CHECK_THAT( arg, matcher )   (void)(0)\n\n#define CATCH_REQUIRE_THAT( arg, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n#define CATCH_INFO( msg )          (void)(0)\n#define CATCH_UNSCOPED_INFO( msg ) (void)(0)\n#define CATCH_WARN( msg )          (void)(0)\n#define CATCH_CAPTURE( msg )       (void)(0)\n\n#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define CATCH_METHOD_AS_TEST_CASE( method, ... )\n#define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0)\n#define CATCH_SECTION( ... )\n#define CATCH_DYNAMIC_SECTION( ... )\n#define CATCH_FAIL( ... ) (void)(0)\n#define CATCH_FAIL_CHECK( ... ) (void)(0)\n#define CATCH_SUCCEED( ... ) (void)(0)\n\n#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)\n#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)\n#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)\n#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#else\n#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) )\n#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#endif\n\n// \"BDD-style\" convenience wrappers\n#define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className )\n#define CATCH_GIVEN( desc )\n#define CATCH_AND_GIVEN( desc )\n#define CATCH_WHEN( desc )\n#define CATCH_AND_WHEN( desc )\n#define CATCH_THEN( desc )\n#define CATCH_AND_THEN( desc )\n\n#define CATCH_STATIC_REQUIRE( ... )       (void)(0)\n#define CATCH_STATIC_REQUIRE_FALSE( ... ) (void)(0)\n\n// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required\n#else\n\n#define REQUIRE( ... )       (void)(0)\n#define REQUIRE_FALSE( ... ) (void)(0)\n\n#define REQUIRE_THROWS( ... ) (void)(0)\n#define REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0)\n#define REQUIRE_THROWS_WITH( expr, matcher ) (void)(0)\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define REQUIRE_NOTHROW( ... ) (void)(0)\n\n#define CHECK( ... ) (void)(0)\n#define CHECK_FALSE( ... ) (void)(0)\n#define CHECKED_IF( ... ) if (__VA_ARGS__)\n#define CHECKED_ELSE( ... ) if (!(__VA_ARGS__))\n#define CHECK_NOFAIL( ... ) (void)(0)\n\n#define CHECK_THROWS( ... )  (void)(0)\n#define CHECK_THROWS_AS( expr, exceptionType ) (void)(0)\n#define CHECK_THROWS_WITH( expr, matcher ) (void)(0)\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define CHECK_NOTHROW( ... ) (void)(0)\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CHECK_THAT( arg, matcher ) (void)(0)\n\n#define REQUIRE_THAT( arg, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n#define INFO( msg ) (void)(0)\n#define UNSCOPED_INFO( msg ) (void)(0)\n#define WARN( msg ) (void)(0)\n#define CAPTURE( msg ) (void)(0)\n\n#define TEST_CASE( ... )  INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define METHOD_AS_TEST_CASE( method, ... )\n#define REGISTER_TEST_CASE( Function, ... ) (void)(0)\n#define SECTION( ... )\n#define DYNAMIC_SECTION( ... )\n#define FAIL( ... ) (void)(0)\n#define FAIL_CHECK( ... ) (void)(0)\n#define SUCCEED( ... ) (void)(0)\n#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)\n#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)\n#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)\n#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#else\n#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) )\n#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) )\n#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) )\n#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#endif\n\n#define STATIC_REQUIRE( ... )       (void)(0)\n#define STATIC_REQUIRE_FALSE( ... ) (void)(0)\n\n#endif\n\n#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )\n\n// \"BDD-style\" convenience wrappers\n#define SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) )\n#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className )\n\n#define GIVEN( desc )\n#define AND_GIVEN( desc )\n#define WHEN( desc )\n#define AND_WHEN( desc )\n#define THEN( desc )\n#define AND_THEN( desc )\n\nusing Catch::Detail::Approx;\n\n#endif\n\n#endif // ! CATCH_CONFIG_IMPL_ONLY\n\n// start catch_reenable_warnings.h\n\n\n#ifdef __clang__\n#    ifdef __ICC // icpc defines the __clang__ macro\n#        pragma warning(pop)\n#    else\n#        pragma clang diagnostic pop\n#    endif\n#elif defined __GNUC__\n#    pragma GCC diagnostic pop\n#endif\n\n// end catch_reenable_warnings.h\n// end catch.hpp\n#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n\n"
  },
  {
    "path": "app/src/main/qt/is-Engine.pro",
    "content": "QT -= gui\n\nCONFIG += c++17 console\nCONFIG -= app_bundle\n\n# The following define makes your compiler emit warnings if you use\n# any Qt feature that has been marked deprecated (the exact warnings\n# depend on your compiler). Please consult the documentation of the\n# deprecated API in order to know how to port your code away from it.\nDEFINES += QT_DEPRECATED_WARNINGS\n\n# You can also make your code fail to compile if it uses deprecated APIs.\n# In order to do so, uncomment the following line.\n# You can also select to disable deprecated APIs only up to a certain version of Qt.\n#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0\n\n# Confirm that we are using Qt IDE with the engine\nDEFINES += IS_ENGINE_QT\n\n# Game source files\nHEADERS += \\\n\t\t../cpp/app_src/activity/GameActivity.h \\\n\t\t../cpp/app_src/config/ExtraConfig.h \\\n\t\t../cpp/app_src/config/GameConfig.h \\\n\t\t../cpp/app_src/gamesystem_ext/GameSystemExtended.h \\\n\t\t../cpp/app_src/language/GameLanguage.h \\\n\t\t../cpp/app_src/objects/HelloWorld.h \\\n\t\t../cpp/app_src/objects/widgets/GameDialog.h \\\n\t\t../cpp/app_src/scenes/HelloScene/HelloScene.h\n\nSOURCES += \\\n        ../cpp/app_src/gamesystem_ext/GameSystemExtended.cpp \\\n        ../cpp/app_src/objects/widgets/GameDialog.cpp \\\n        ../cpp/basicSFMLmain.cpp\n\n# is::Engine source files\nHEADERS += \\\n\t\t../cpp/isEngine/core/ActivityController.h \\\n\t\t../cpp/isEngine/core/GameEngine.h \\\n\t\t../cpp/isEngine/system/android/AdmobManager.h \\\n\t\t../cpp/isEngine/system/display/GameDisplay.h \\\n\t\t../cpp/isEngine/system/display/SDM.h \\\n\t\t../cpp/isEngine/system/entity/Background.h \\\n\t\t../cpp/isEngine/system/entity/Button.h \\\n\t\t../cpp/isEngine/system/entity/Form.h \\\n\t\t../cpp/isEngine/system/entity/MainObject.h \\\n\t\t../cpp/isEngine/system/entity/parents/DepthObject.h \\\n\t\t../cpp/isEngine/system/entity/parents/Destructible.h \\\n\t\t../cpp/isEngine/system/entity/parents/FilePath.h \\\n\t\t../cpp/isEngine/system/entity/parents/Health.h \\\n\t\t../cpp/isEngine/system/entity/parents/HurtEffect.h \\\n\t\t../cpp/isEngine/system/entity/parents/Name.h \\\n\t\t../cpp/isEngine/system/entity/parents/ScorePoint.h \\\n\t\t../cpp/isEngine/system/entity/parents/Step.h \\\n\t\t../cpp/isEngine/system/entity/parents/Type.h \\\n\t\t../cpp/isEngine/system/entity/parents/Visibilty.h \\\n\t\t../cpp/isEngine/system/function/GameFunction.h \\\n\t\t../cpp/isEngine/system/function/GameKeyData.h \\\n\t\t../cpp/isEngine/system/function/GameKeyName.h \\\n\t\t../cpp/isEngine/system/function/GameSlider.h \\\n\t\t../cpp/isEngine/system/function/GameSystem.h \\\n\t\t../cpp/isEngine/system/function/GameTime.h \\\n\t\t../cpp/isEngine/system/graphic/GRM.h \\\n\t\t../cpp/isEngine/system/graphic/GameFont.h \\\n\t\t../cpp/isEngine/system/graphic/GameTexture.h \\\n\t\t../cpp/isEngine/system/graphic/TransitionEffect.h \\\n        ../cpp/isEngine/system/islibconnect/isEngineWrapper.h \\\n        ../cpp/isEngine/system/islibconnect/isLibConnect.h \\\n\t\t../cpp/isEngine/system/sound/GSM.h \\\n\t\t../cpp/isEngine/system/sound/GameMusic.h \\\n\t\t../cpp/isEngine/system/sound/GameSound.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Box2D.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2Shape.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/b2BroadPhase.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/b2Collision.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/b2Distance.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/b2DynamicTree.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Common/b2BlockAllocator.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Common/b2Draw.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Common/b2GrowableStack.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Common/b2Math.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Common/b2Settings.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Common/b2StackAllocator.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Common/b2Timer.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonContact.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2DistanceJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2FrictionJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2GearJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MotorJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MouseJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RopeJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WeldJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WheelJoint.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/b2Body.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/b2ContactManager.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/b2Fixture.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/b2Island.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/b2TimeStep.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/b2World.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.h \\\n\t\t../cpp/isEngine/ext_lib/Box2D/Rope/b2Rope.h \\\n\t\t../cpp/isEngine/ext_lib/TinyFileDialogs/TinyDialogBox.h \\\n\t\t../cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.h\n\nSOURCES += \\\n        ../cpp/isEngine/core/GameEngine.cpp \\\n        ../cpp/isEngine/system/display/GameDisplay.cpp \\\n        ../cpp/isEngine/system/entity/MainObject.cpp \\\n        ../cpp/isEngine/system/function/GameFunction.cpp \\\n        ../cpp/isEngine/system/function/GameKeyData.cpp \\\n        ../cpp/isEngine/system/function/GameSlider.cpp \\\n        ../cpp/isEngine/system/function/GameSystem.cpp \\\n        ../cpp/isEngine/system/function/GameTime.cpp \\\n        ../cpp/isEngine/system/graphic/TransitionEffect.cpp \\\n        ../cpp/isEngine/system/islibconnect/isEngineWrapper.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2ChainShape.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2CircleShape.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2EdgeShape.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/Shapes/b2PolygonShape.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/b2BroadPhase.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/b2CollideCircle.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/b2CollideEdge.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/b2CollidePolygon.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/b2Collision.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/b2Distance.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/b2DynamicTree.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Collision/b2TimeOfImpact.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Common/b2BlockAllocator.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Common/b2Draw.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Common/b2Math.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Common/b2Settings.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Common/b2StackAllocator.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Common/b2Timer.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2CircleContact.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2Contact.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2ContactSolver.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Contacts/b2PolygonContact.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2DistanceJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2FrictionJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2GearJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2Joint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MotorJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2MouseJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2PulleyJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2RopeJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WeldJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/Joints/b2WheelJoint.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/b2Body.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/b2ContactManager.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/b2Fixture.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/b2Island.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/b2World.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Dynamics/b2WorldCallbacks.cpp \\\n        ../cpp/isEngine/ext_lib/Box2D/Rope/b2Rope.cpp \\\n        ../cpp/isEngine/ext_lib/TinyFileDialogs/tinyfiledialogs.cpp \\\n        ../cpp/main.cpp\n\nLIBS += -LC:\\SFML_Qt_MinGW\\lib\\\n\nCONFIG(debug, debug|release): LIBS += -lsfml-audio-d \\\n                                    -lsfml-network-d \\\n                                    -lsfml-graphics-d \\\n                                    -lsfml-window-d \\\n                                    -lsfml-system-d \\\n                                    -lsfml-main-d \\\n                                    # Only for Tiny File Dialog Windows\n                                    -lOle32 \\\n                                    -lcomdlg32\n\nCONFIG(release, debug|release): LIBS += -lsfml-audio \\\n                                    -lsfml-network \\\n                                    -lsfml-graphics \\\n                                    -lsfml-window \\\n                                    -lsfml-system \\\n                                    -lsfml-main \\\n                                    # Only for Tiny File Dialog Windows\n                                    -lOle32 \\\n                                    -lcomdlg32\n\nINCLUDEPATH += C:\\SFML_Qt_MinGW\\include\nDEPENDPATH += C:\\SFML_Qt_MinGW\\include\n\n# Default rules for deployment.\nqnx: target.path = /tmp/$${TARGET}/bin\nelse: unix:!android: target.path = /opt/$${TARGET}/bin\n!isEmpty(target.path): INSTALLS += target\n"
  },
  {
    "path": "app/src/main/qt/is-Engine.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.12.2, 2021-03-03T22:20:04. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{e9938bd2-a14c-4922-8047-862bb4bbd31f}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">2</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">2</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.12.9 MinGW 64-bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.12.9 MinGW 64-bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5129.win64_mingw73_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\is-Engine\\app\\src\\main\\bin-Qt\\Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/is-Engine/app/src/main/bin-Qt/Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\is-Engine\\app\\src\\main\\bin-Qt\\Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/is-Engine/app/src/main/bin-Qt/Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">true</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\is-Engine\\app\\src\\main\\bin-Qt\\Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/is-Engine/app/src/main/bin-Qt/Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">true</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/is-Engine/app/src/main/qt/is-Engine.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/is-Engine/app/src/main/qt/is-Engine.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/is-Engine/app/src/main/bin-Qt/Debug</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">is-Engine</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/vs-sfml.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.10.35027.167\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"vs-sfml\", \"vs-sfml.vcxproj\", \"{7A872F18-DDA0-4618-9365-67608FFADB3B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{7A872F18-DDA0-4618-9365-67608FFADB3B}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{7A872F18-DDA0-4618-9365-67608FFADB3B}.Debug|x64.Build.0 = Debug|x64\n\t\t{7A872F18-DDA0-4618-9365-67608FFADB3B}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{7A872F18-DDA0-4618-9365-67608FFADB3B}.Debug|x86.Build.0 = Debug|Win32\n\t\t{7A872F18-DDA0-4618-9365-67608FFADB3B}.Release|x64.ActiveCfg = Release|x64\n\t\t{7A872F18-DDA0-4618-9365-67608FFADB3B}.Release|x64.Build.0 = Release|x64\n\t\t{7A872F18-DDA0-4618-9365-67608FFADB3B}.Release|x86.ActiveCfg = Release|Win32\n\t\t{7A872F18-DDA0-4618-9365-67608FFADB3B}.Release|x86.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {13EA6884-8E85-4573-9782-14275A0104B3}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "app/src/main/vs-sfml.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"cpp\\app_src\\activity\\GameActivity.h\" />\n    <ClInclude Include=\"cpp\\app_src\\config\\ExtraConfig.h\" />\n    <ClInclude Include=\"cpp\\app_src\\config\\GameConfig.h\" />\n    <ClInclude Include=\"cpp\\app_src\\gamesystem_ext\\GameSystemExtended.h\" />\n    <ClInclude Include=\"cpp\\app_src\\language\\GameLanguage.h\" />\n    <ClInclude Include=\"cpp\\app_src\\objects\\HelloWorld.h\" />\n    <ClInclude Include=\"cpp\\app_src\\objects\\widgets\\GameDialog.h\" />\n    <ClInclude Include=\"cpp\\app_src\\scenes\\HelloScene\\HelloScene.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\core\\ActivityController.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\core\\GameEngine.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\display\\GameDisplay.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\display\\SDM.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\display\\SDMBlitSDLSprite.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\Background.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\Button.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\Form.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\MainObject.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\DepthObject.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Destructible.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\FilePath.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Health.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\HurtEffect.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Name.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\ScorePoint.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Step.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Type.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Visibilty.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameFunction.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameKeyData.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameKeyName.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameSlider.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameSystem.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameTime.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\graphic\\GameFont.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\graphic\\GameTexture.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\graphic\\GRM.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\graphic\\TransitionEffect.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\islibconnect\\isEngineSDLWrapper.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\islibconnect\\isEngineWrapper.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\islibconnect\\isLibConnect.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\sound\\GameMusic.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\sound\\GameSound.h\" />\n    <ClInclude Include=\"cpp\\isEngine\\system\\sound\\GSM.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"cpp\\isEngine\\system\\islibconnect\\isEngineVector2Wrapper.inl\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"cpp\\b2BlockAllocator.cpp\" />\n    <ClCompile Include=\"cpp\\b2Body.cpp\" />\n    <ClCompile Include=\"cpp\\b2BroadPhase.cpp\" />\n    <ClCompile Include=\"cpp\\b2ChainAndCircleContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2ChainAndPolygonContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2ChainShape.cpp\" />\n    <ClCompile Include=\"cpp\\b2CircleContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2CircleShape.cpp\" />\n    <ClCompile Include=\"cpp\\b2CollideCircle.cpp\" />\n    <ClCompile Include=\"cpp\\b2CollideEdge.cpp\" />\n    <ClCompile Include=\"cpp\\b2CollidePolygon.cpp\" />\n    <ClCompile Include=\"cpp\\b2Collision.cpp\" />\n    <ClCompile Include=\"cpp\\b2Contact.cpp\" />\n    <ClCompile Include=\"cpp\\b2ContactManager.cpp\" />\n    <ClCompile Include=\"cpp\\b2ContactSolver.cpp\" />\n    <ClCompile Include=\"cpp\\b2Distance.cpp\" />\n    <ClCompile Include=\"cpp\\b2DistanceJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Draw.cpp\" />\n    <ClCompile Include=\"cpp\\b2DynamicTree.cpp\" />\n    <ClCompile Include=\"cpp\\b2EdgeAndCircleContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2EdgeAndPolygonContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2EdgeShape.cpp\" />\n    <ClCompile Include=\"cpp\\b2Fixture.cpp\" />\n    <ClCompile Include=\"cpp\\b2FrictionJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2GearJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Island.cpp\" />\n    <ClCompile Include=\"cpp\\b2Joint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Math.cpp\" />\n    <ClCompile Include=\"cpp\\b2MotorJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2MouseJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2PolygonAndCircleContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2PolygonContact.cpp\" />\n    <ClCompile Include=\"cpp\\b2PolygonShape.cpp\" />\n    <ClCompile Include=\"cpp\\b2PrismaticJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2PulleyJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2RevoluteJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Rope.cpp\" />\n    <ClCompile Include=\"cpp\\b2RopeJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2Settings.cpp\" />\n    <ClCompile Include=\"cpp\\b2StackAllocator.cpp\" />\n    <ClCompile Include=\"cpp\\b2TimeOfImpact.cpp\" />\n    <ClCompile Include=\"cpp\\b2Timer.cpp\" />\n    <ClCompile Include=\"cpp\\b2WeldJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2WheelJoint.cpp\" />\n    <ClCompile Include=\"cpp\\b2World.cpp\" />\n    <ClCompile Include=\"cpp\\b2WorldCallbacks.cpp\" />\n    <ClCompile Include=\"cpp\\basicSFMLmain.cpp\" />\n    <ClCompile Include=\"cpp\\GameDialog.cpp\" />\n    <ClCompile Include=\"cpp\\GameDisplay.cpp\" />\n    <ClCompile Include=\"cpp\\GameEngine.cpp\" />\n    <ClCompile Include=\"cpp\\GameFunction.cpp\" />\n    <ClCompile Include=\"cpp\\GameKeyData.cpp\" />\n    <ClCompile Include=\"cpp\\GameSlider.cpp\" />\n    <ClCompile Include=\"cpp\\GameSystem.cpp\" />\n    <ClCompile Include=\"cpp\\GameSystemExtended.cpp\" />\n    <ClCompile Include=\"cpp\\GameTime.cpp\" />\n    <ClCompile Include=\"cpp\\isEngineSDLWrapper.cpp\" />\n    <ClCompile Include=\"cpp\\isEngineWrapper.cpp\" />\n    <ClCompile Include=\"cpp\\main.cpp\" />\n    <ClCompile Include=\"cpp\\MainObject.cpp\" />\n    <ClCompile Include=\"cpp\\TransitionEffect.cpp\" />\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>17.0</VCProjectVersion>\n    <Keyword>Win32Proj</Keyword>\n    <ProjectGuid>{7a872f18-dda0-4618-9365-67608ffadb3b}</ProjectGuid>\n    <RootNamespace>sfmlvs</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n    <ProjectName>vs-sfml</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>IS_ENGINE_VS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <AdditionalIncludeDirectories>$(SolutionDir)external\\SFML\\include</AdditionalIncludeDirectories>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>$(SolutionDir)external\\SFML\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>sfml-graphics-d.lib;sfml-window-d.lib;sfml-audio-d.lib;sfml-network-d.lib;sfml-system-d.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>IS_ENGINE_VS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <AdditionalIncludeDirectories>$(SolutionDir)external\\SFML\\include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>$(SolutionDir)external\\SFML\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>sfml-graphics.lib;sfml-window.lib;sfml-audio.lib;sfml-network.lib;sfml-system.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>IS_ENGINE_VS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>IS_ENGINE_VS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "app/src/main/vs-sfml.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Fichiers sources\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Fichiers d%27en-tête\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Fichiers de ressources\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"cpp\\app_src\\activity\\GameActivity.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\app_src\\config\\ExtraConfig.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\app_src\\config\\GameConfig.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\app_src\\gamesystem_ext\\GameSystemExtended.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\app_src\\language\\GameLanguage.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\app_src\\objects\\HelloWorld.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\app_src\\objects\\widgets\\GameDialog.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\app_src\\scenes\\HelloScene\\HelloScene.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\core\\ActivityController.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\core\\GameEngine.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\display\\GameDisplay.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\display\\SDM.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\display\\SDMBlitSDLSprite.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\Background.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\Button.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\Form.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\MainObject.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\DepthObject.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Destructible.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\FilePath.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Health.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\HurtEffect.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Name.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\ScorePoint.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Step.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Type.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\entity\\parents\\Visibilty.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameFunction.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameKeyData.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameKeyName.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameSlider.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameSystem.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\function\\GameTime.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\graphic\\GameFont.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\graphic\\GameTexture.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\graphic\\GRM.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\graphic\\TransitionEffect.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\islibconnect\\isEngineSDLWrapper.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\islibconnect\\isEngineWrapper.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\islibconnect\\isLibConnect.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\sound\\GameMusic.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\sound\\GameSound.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n    <ClInclude Include=\"cpp\\isEngine\\system\\sound\\GSM.h\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"cpp\\isEngine\\system\\islibconnect\\isEngineVector2Wrapper.inl\">\n      <Filter>Fichiers d%27en-tête</Filter>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"cpp\\b2BlockAllocator.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Body.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2BroadPhase.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ChainAndCircleContact.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ChainAndPolygonContact.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ChainShape.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CircleContact.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CircleShape.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CollideCircle.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CollideEdge.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2CollidePolygon.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Collision.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Contact.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ContactManager.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2ContactSolver.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Distance.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2DistanceJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Draw.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2DynamicTree.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2EdgeAndCircleContact.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2EdgeAndPolygonContact.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2EdgeShape.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Fixture.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2FrictionJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2GearJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Island.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Joint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Math.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2MotorJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2MouseJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PolygonAndCircleContact.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PolygonContact.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PolygonShape.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PrismaticJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2PulleyJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2RevoluteJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Rope.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2RopeJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Settings.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2StackAllocator.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2TimeOfImpact.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2Timer.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2WeldJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2WheelJoint.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2World.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\b2WorldCallbacks.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\basicSFMLmain.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameDialog.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameDisplay.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameEngine.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameFunction.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameKeyData.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameSlider.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameSystem.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameSystemExtended.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\GameTime.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\isEngineSDLWrapper.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\isEngineWrapper.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\main.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\MainObject.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"cpp\\TransitionEffect.cpp\">\n      <Filter>Fichiers sources</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "app/src/main/vs-sfml.vcxproj.user",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"Current\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup />\n</Project>"
  },
  {
    "path": "app/src/main/web/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n\t<title>is::Engine</title>\n\t<link rel=\"icon\" href=\"/images/favicon.png\">\n<!-- Uncomment to use web push notification\n\t<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/icon?family=Material+Icons\">\n\t<link rel=\"stylesheet\" href=\"https://code.getmdl.io/1.2.1/material.indigo-pink.min.css\">\n\t<script defer src=\"https://code.getmdl.io/1.2.1/material.min.js\"></script>\n-->\n\t<link rel=\"stylesheet\" href=\"styles/index.css\">\n</head>\n<body>\n\t<div id=\"div_header\" style=\"text-align:center\">\n\t\t<img class=\"image\" id=\"img_loading\" src=\"images/loading.png\" alt=\"Loading...\" width=\"32\" height=\"32\">\n\t\t<b>Please wait a few moments, it will start...</b>\n\t</div>\n\t\n    <canvas id=\"canvas\" oncontextmenu=\"event.preventDefault()\">\n      Loading... \n    </canvas>\n<!-- Uncomment to use web push notification\n\t<hr>\n\t<main>\n\t\t<p>The push messaging. The button below allows you to activate / deactivate the push subscription.</p>\n\t\t<p>\n\t\t\t<button disabled class=\"js-push-btn mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect\">\n\t\t\t\tEnable Push Messaging\n\t\t\t</button>\n\t\t</p>\n\t\t<section class=\"subscription-details js-subscription-details is-invisible\">\n\t\t\t<p>Once you've subscribed your user, you'd send their subscription to your\n\t\t\tserver to store in a database so that when you want to send a message\n\t\t\tyou can lookup the subscription and send a message to it.</p>\n\t\t\t<p>Copy the following details\n\t\t\tinto the <a href=\"https://web-push-codelab.glitch.me//\">Push Companion\n\t\t\tSite</a> and it'll send a push message for you, using the application\n\t\t\tserver keys on the site - so make sure they match.</p>\n\t\t\t<pre><code class=\"js-subscription-json\"></code></pre>\n\t\t</section>\n\t</main>\n\t<hr>\n-->\n    <script type=\"text/javascript\">\t\t\n\t\twindow.Module = {\n\t\t\tcanvas: document.getElementById('canvas'),\n\t\t\tprint: console.log,\n\t\t\tprintErr: console.error,\n\t\t};\n\t\t\n\t\t// Full screen\n\t\tvar useFullcreen = false;\n\t\tvar gameStarted = false;\n\t\tfunction fullscreen() {\t\t \n\t\t\tif (!useFullcreen)\n\t\t\t{\n\t\t\t\tdocument.getElementById(\"img_fullscreen\").src = \"images/ico_fullscreen_w.png\";\n\t\t\t\tdocument.body.style.backgroundImage = \"url('images/empty.png')\";\n\t\t\t\tuseFullcreen = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdocument.getElementById(\"img_fullscreen\").src = \"images/ico_fullscreen_b.png\";\n\t\t\t\tdocument.body.style.backgroundImage = \"url('images/background.png')\";\n\t\t\t\tuseFullcreen = false;\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\tvar logBackup = console.log;\n\t\tvar logMessages = [];\n\t\tconsole.log = function() {\n\t\t\tlogMessages.push.apply(logMessages, arguments);\n\t\t\tlogBackup.apply(console, arguments);\n\t\t};\n\t\t\n\t\tvar showError = false;\t\t\n\t\tvar second = 0;\n\t\tfunction chrono() {\n\t\t\tsecond++;\n\t\t\tif (!logMessages.includes(\"Start successfully!\"))\n\t\t\t{\n\t\t\t\tif (second > 90)\n\t\t\t\t{\n\t\t\t\t\tif (!showError)\n\t\t\t\t\t{\n\t\t\t\t\t\tdocument.getElementById('div_header').innerHTML = 'Um... The game is taking too long to load.<br>' +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Please try to restart (<a href=\"\">Click here</a onclick=\"location.reload(true);\">) the page.';\n\t\t\t\t\t\tdocument.getElementById('div_header').style.color = 'red';\n\t\t\t\t\t\tshowError = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!gameStarted)\n\t\t\t\t{\n\t\t\t\t\tdocument.getElementById('img_loading').style.visibility = 'hidden';\n\t\t\t\t\tdocument.getElementById('div_header').innerHTML = \"<img id='img_fullscreen' src='images/ico_fullscreen_b.png' alt='Full Screen' onclick='fullscreen()'>\";\t\t\t\t\n\t\t\t\t\tfullscreen();\n\t\t\t\t\tgameStarted = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsetInterval(\"chrono()\", 1000);\n    </script>\n    <script async src=\"isengine.js\"></script>\n<!-- Uncomment to use web push notification\n\t<script src=\"scripts/main.js\"></script>\n\t<script src=\"https://code.getmdl.io/1.2.1/material.min.js\"></script>\n-->\n</body>\n</html>\n"
  },
  {
    "path": "app/src/main/web/scripts/main.js",
    "content": "/*\n*\n*  Push Notifications codelab\n*  Copyright 2015 Google Inc. All rights reserved.\n*\n*  Licensed under the Apache License, Version 2.0 (the \"License\");\n*  you may not use this file except in compliance with the License.\n*  You may obtain a copy of the License at\n*\n*      https://www.apache.org/licenses/LICENSE-2.0\n*\n*  Unless required by applicable law or agreed to in writing, software\n*  distributed under the License is distributed on an \"AS IS\" BASIS,\n*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n*  See the License for the specific language governing permissions and\n*  limitations under the License\n*\n*/\n\n/* eslint-env browser, es6 */\n\n'use strict';\n\n// Application Server Keys\nconst applicationServerPublicKey = '';\n\nconst pushButton = document.querySelector('.js-push-btn');\n\nlet isSubscribed = false;\nlet swRegistration = null;\n\nfunction urlB64ToUint8Array(base64String) {\n  const padding = '='.repeat((4 - base64String.length % 4) % 4);\n  const base64 = (base64String + padding)\n    .replace(/\\-/g, '+')\n    .replace(/_/g, '/');\n\n  const rawData = window.atob(base64);\n  const outputArray = new Uint8Array(rawData.length);\n\n  for (let i = 0; i < rawData.length; ++i) {\n    outputArray[i] = rawData.charCodeAt(i);\n  }\n  return outputArray;\n}\n\n// Allows to check if the browser supports the Service Worker\nif ('serviceWorker' in navigator && 'PushManager' in window) {\n  console.log('Service Worker and Push is supported');\n\n  navigator.serviceWorker.register('sw.js')\n  .then(function(swReg) {\n    console.log('Service Worker is registered', swReg);\n\n    swRegistration = swReg;\n    initializeUI();\n  })\n  .catch(function(error) {\n    console.error('Service Worker Error', error);\n  });\n} else {\n  console.warn('Push messaging is not supported');\n  pushButton.textContent = 'Push Not Supported';\n}\n\n// Allows to subscribe the user\nfunction subscribeUser() {\n  const applicationServerKey = urlB64ToUint8Array(applicationServerPublicKey);\n  swRegistration.pushManager.subscribe({\n    userVisibleOnly: true,\n    applicationServerKey: applicationServerKey\n  })\n  .then(function(subscription) {\n    console.log('User is subscribed.');\n\n    updateSubscriptionOnServer(subscription);\n\n    isSubscribed = true;\n\n    updateBtn();\n  })\n  .catch(function(err) {\n    console.log('Failed to subscribe the user: ', err);\n    updateBtn();\n  });\n}\n\n// Allows to unsubscribe the user\nfunction unsubscribeUser() {\n  swRegistration.pushManager.getSubscription()\n  .then(function(subscription) {\n    if (subscription) {\n      return subscription.unsubscribe();\n    }\n  })\n  .catch(function(error) {\n    console.log('Error unsubscribing', error);\n  })\n  .then(function() {\n    updateSubscriptionOnServer(null);\n\n    console.log('User is unsubscribed.');\n    isSubscribed = false;\n\n    updateBtn();\n  });\n}\n\n// Allows to change the state of the button according to the different parameters (subscription, unsubscription, ...)\nfunction updateBtn() {\n  if (Notification.permission === 'denied') {\n    pushButton.textContent = 'Push Messaging Blocked.';\n    pushButton.disabled = true;\n    updateSubscriptionOnServer(null);\n    return;\n  }\n\n  if (isSubscribed) {\n    pushButton.textContent = 'Disable Push Messaging';\n  } else {\n    pushButton.textContent = 'Enable Push Messaging';\n  }\n\n  pushButton.disabled = false;\n}\n\n// Allows to initialize UI components\nfunction initializeUI() {\n\n  pushButton.addEventListener('click', function() {\n    pushButton.disabled = true;\n    if (isSubscribed) {\n      unsubscribeUser();\n    } else {\n      subscribeUser();\n    }\n  });\n\n  // Set the initial subscription value\n  swRegistration.pushManager.getSubscription()\n  .then(function(subscription) {\n    isSubscribed = !(subscription === null);\n\n    updateSubscriptionOnServer(subscription);\n\n    if (isSubscribed) {\n      console.log('User IS subscribed.');\n    } else {\n      console.log('User is NOT subscribed.');\n    }\n\n    updateBtn();\n  });\n}\n\n// Allows to update the subscription on the web server\nfunction updateSubscriptionOnServer(subscription) {\n  // TODO: Send subscription to application server\n\n  ////////////////////////////////////////////////////////////\n  // This was done for testing\n  const subscriptionJson = document.querySelector('.js-subscription-json');\n  const subscriptionDetails =\n    document.querySelector('.js-subscription-details');\n\n  if (subscription) {\n    subscriptionJson.textContent = JSON.stringify(subscription);\n    subscriptionDetails.classList.remove('is-invisible');\n  } else {\n    subscriptionDetails.classList.add('is-invisible');\n  }\n  ////////////////////////////////////////////////////////////\n}"
  },
  {
    "path": "app/src/main/web/styles/index.css",
    "content": ".center-justified {\n  text-align: justify;\n  margin: 0 auto;\n  width: 50em;\n}\n\ncanvas {\n\tpadding-left: 0;\n\tpadding-right: 0;\n\tmargin-left: auto;\n\tmargin-right: auto;\n\tdisplay: block;\n\twidth: 800px;\n\tbackground:black;\n}\n\n.image {\n\tdisplay: block;\n\tmargin-left: auto;\n\tmargin-right: auto;\n\t-webkit-animation:spin 4s linear infinite;\n\t-moz-animation:spin 4s linear infinite;\n\tanimation:spin 4s linear infinite;\n}\n\n@-moz-keyframes spin {\n\t100% {-moz-transform: rotate(360deg);}\n}\n\n@-webkit-keyframes spin {\n\t100% {-webkit-transform: rotate(360deg);}\n}\n\n@keyframes spin {\n\t100% {-webkit-transform: rotate(360deg); transform:rotate(360deg);}\n}\n\nbody\n{\n\tbackground-image: url(\"../images/background.png\");\n}\n\nhtml {\n  height: 100%;\n}\n\nhtml, body {\n  width: 100%;\n  padding: 0;\n  margin: 0;\n}\n\nbody {\n  min-height: auto;\n  box-sizing: border-box;\n}\n\nheader {\n  padding: 115px 0 32px 0;\n  background-color: #00bcd4;\n  color: white;\n}\n\nmain, header > h1 {\n  padding: 0 16px;\n  max-width: 760px;\n  box-sizing: border-box;\n  margin: 0 auto;\n}\n\nmain {\n  margin: 24px auto;\n  box-sizing: border-box;\n}\n\npre {\n  white-space: pre-wrap;\n  background-color: #EEEEEE;\n  padding: 16px;\n}\n\npre code {\n  word-break: break-word;\n}\n\n.is-invisible {\n  opacity: 0;\n}\n\n.subscription-details {\n  transition: opacity 1s;\n}\n\n@media (max-width: 600px) {\n  header > h1 {\n    font-size: 36px;\n  }\n}\n"
  },
  {
    "path": "app/src/main/web/sw.js",
    "content": "/*\n*\n*  Push Notifications codelab\n*  Copyright 2015 Google Inc. All rights reserved.\n*\n*  Licensed under the Apache License, Version 2.0 (the \"License\");\n*  you may not use this file except in compliance with the License.\n*  You may obtain a copy of the License at\n*\n*      https://www.apache.org/licenses/LICENSE-2.0\n*\n*  Unless required by applicable law or agreed to in writing, software\n*  distributed under the License is distributed on an \"AS IS\" BASIS,\n*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n*  See the License for the specific language governing permissions and\n*  limitations under the License\n*\n*/\n\n/* eslint-env browser, serviceworker, es6 */\n\n'use strict';\n\nself.addEventListener('push', function(event) {\n  console.log('[Service Worker] Push Received.');\n  console.log(`[Service Worker] Push had this data: \"${event.data.text()}\"`);\n\n  // Push notification information\n  const title = 'is::Engine';\n  const options = {\n    body : 'is::Engine Notification.',\n    icon : 'images/icon.png',\n    badge: 'images/badge.png'\n  };\n\n  event.waitUntil(self.registration.showNotification(title, options));\n});\n\nself.addEventListener('notificationclick', function(event) {\n  console.log('[Service Worker] Notification click Received.');\n\n  event.notification.close();\n\n  event.waitUntil(\n    clients.openWindow('https://github.com/Is-Daouda/is-Engine') // The web page to open when clicking on the notification\n  );\n});"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n\n    repositories {\n        google()\n        maven {\n            url 'https://maven.google.com/'\n            name 'Google'\n        }\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.4.2'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        maven {\n            url 'https://maven.google.com/'\n            name 'Google'\n        }\n        jcenter()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}"
  },
  {
    "path": "doc/isEngine_api_doc_eng.html",
    "content": "<!DOCTYPE html>\n<!-- Created by pdf2htmlEX (https://github.com/pdf2htmlEX/pdf2htmlEX) -->\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"generator\" content=\"pdf2htmlEX\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"/>\n<style type=\"text/css\">\n/*! \n * Base CSS for pdf2htmlEX\n * Copyright 2012,2013 Lu Wang <coolwanglu@gmail.com> \n * https://github.com/pdf2htmlEX/pdf2htmlEX/blob/master/share/LICENSE\n */#sidebar{position:absolute;top:0;left:0;bottom:0;width:250px;padding:0;margin:0;overflow:auto}#page-container{position:absolute;top:0;left:0;margin:0;padding:0;border:0}@media screen{#sidebar.opened+#page-container{left:250px}#page-container{bottom:0;right:0;overflow:auto}.loading-indicator{display:none}.loading-indicator.active{display:block;position:absolute;width:64px;height:64px;top:50%;left:50%;margin-top:-32px;margin-left:-32px}.loading-indicator img{position:absolute;top:0;left:0;bottom:0;right:0}}@media print{@page{margin:0}html{margin:0}body{margin:0;-webkit-print-color-adjust:exact}#sidebar{display:none}#page-container{width:auto;height:auto;overflow:visible;background-color:transparent}.d{display:none}}.pf{position:relative;background-color:white;overflow:hidden;margin:0;border:0}.pc{position:absolute;border:0;padding:0;margin:0;top:0;left:0;width:100%;height:100%;overflow:hidden;display:block;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0}.pc.opened{display:block}.bf{position:absolute;border:0;margin:0;top:0;bottom:0;width:100%;height:100%;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}.bi{position:absolute;border:0;margin:0;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}@media print{.pf{margin:0;box-shadow:none;page-break-after:always;page-break-inside:avoid}@-moz-document url-prefix(){.pf{overflow:visible;border:1px solid #fff}.pc{overflow:visible}}}.c{position:absolute;border:0;padding:0;margin:0;overflow:hidden;display:block}.t{position:absolute;white-space:pre;font-size:1px;transform-origin:0 100%;-ms-transform-origin:0 100%;-webkit-transform-origin:0 100%;unicode-bidi:bidi-override;-moz-font-feature-settings:\"liga\" 0}.t:after{content:''}.t:before{content:'';display:inline-block}.t span{position:relative;unicode-bidi:bidi-override}._{display:inline-block;color:transparent;z-index:-1}::selection{background:rgba(127,255,255,0.4)}::-moz-selection{background:rgba(127,255,255,0.4)}.pi{display:none}.d{position:absolute;transform-origin:0 100%;-ms-transform-origin:0 100%;-webkit-transform-origin:0 100%}.it{border:0;background-color:rgba(255,255,255,0.0)}.ir:hover{cursor:pointer}</style>\n<style type=\"text/css\">\n/*! \n * Fancy styles for pdf2htmlEX\n * Copyright 2012,2013 Lu Wang <coolwanglu@gmail.com> \n * https://github.com/pdf2htmlEX/pdf2htmlEX/blob/master/share/LICENSE\n */@keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes swing{0{transform:rotate(0)}10%{transform:rotate(0)}90%{transform:rotate(720deg)}100%{transform:rotate(720deg)}}@-webkit-keyframes swing{0{-webkit-transform:rotate(0)}10%{-webkit-transform:rotate(0)}90%{-webkit-transform:rotate(720deg)}100%{-webkit-transform:rotate(720deg)}}@media screen{#sidebar{background-color:#2f3236;background-image:url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0IiBoZWlnaHQ9IjQiPgo8cmVjdCB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjNDAzYzNmIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDBMNCA0Wk00IDBMMCA0WiIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2U9IiMxZTI5MmQiPjwvcGF0aD4KPC9zdmc+\")}#outline{font-family:Georgia,Times,\"Times New Roman\",serif;font-size:13px;margin:2em 1em}#outline ul{padding:0}#outline li{list-style-type:none;margin:1em 0}#outline li>ul{margin-left:1em}#outline a,#outline a:visited,#outline a:hover,#outline a:active{line-height:1.2;color:#e8e8e8;text-overflow:ellipsis;white-space:nowrap;text-decoration:none;display:block;overflow:hidden;outline:0}#outline a:hover{color:#0cf}#page-container{background-color:#9e9e9e;background-image:url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBmaWxsPSIjOWU5ZTllIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDVMNSAwWk02IDRMNCA2Wk0tMSAxTDEgLTFaIiBzdHJva2U9IiM4ODgiIHN0cm9rZS13aWR0aD0iMSI+PC9wYXRoPgo8L3N2Zz4=\");-webkit-transition:left 500ms;transition:left 500ms}.pf{margin:13px auto;box-shadow:1px 1px 3px 1px #333;border-collapse:separate}.pc.opened{-webkit-animation:fadein 100ms;animation:fadein 100ms}.loading-indicator.active{-webkit-animation:swing 1.5s ease-in-out .01s infinite alternate none;animation:swing 1.5s ease-in-out .01s infinite alternate none}.checked{background:no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3goQDSYgDiGofgAAAslJREFUOMvtlM9LFGEYx7/vvOPM6ywuuyPFihWFBUsdNnA6KLIh+QPx4KWExULdHQ/9A9EfUodYmATDYg/iRewQzklFWxcEBcGgEplDkDtI6sw4PzrIbrOuedBb9MALD7zv+3m+z4/3Bf7bZS2bzQIAcrmcMDExcTeXy10DAFVVAQDksgFUVZ1ljD3yfd+0LOuFpmnvVVW9GHhkZAQcxwkNDQ2FSCQyRMgJxnVdy7KstKZpn7nwha6urqqfTqfPBAJAuVymlNLXoigOhfd5nmeiKL5TVTV+lmIKwAOA7u5u6Lped2BsbOwjY6yf4zgQQkAIAcedaPR9H67r3uYBQFEUFItFtLe332lpaVkUBOHK3t5eRtf1DwAwODiIubk5DA8PM8bYW1EU+wEgCIJqsCAIQAiB7/u253k2BQDDMJBKpa4mEon5eDx+UxAESJL0uK2t7XosFlvSdf0QAEmlUnlRFJ9Waho2Qghc1/U9z3uWz+eX+Wr+lL6SZfleEAQIggA8z6OpqSknimIvYyybSCReMsZ6TislhCAIAti2Dc/zejVNWwCAavN8339j27YbTg0AGGM3WltbP4WhlRWq6Q/btrs1TVsYHx+vNgqKoqBUKn2NRqPFxsbGJzzP05puUlpt0ukyOI6z7zjOwNTU1OLo6CgmJyf/gA3DgKIoWF1d/cIY24/FYgOU0pp0z/Ityzo8Pj5OTk9PbwHA+vp6zWghDC+VSiuRSOQgGo32UErJ38CO42wdHR09LBQK3zKZDDY2NupmFmF4R0cHVlZWlmRZ/iVJUn9FeWWcCCE4ODjYtG27Z2Zm5juAOmgdGAB2d3cBADs7O8uSJN2SZfl+WKlpmpumaT6Yn58vn/fs6XmbhmHMNjc3tzDGFI7jYJrm5vb29sDa2trPC/9aiqJUy5pOp4f6+vqeJ5PJBAB0dnZe/t8NBajx/z37Df5OGX8d13xzAAAAAElFTkSuQmCC)}}</style>\n<style type=\"text/css\">\n.ff0{font-family:sans-serif;visibility:hidden;}\n@font-face{font-family:ff1;src:url('data:application/font-woff;base64,d09GRgABAAAACTd8ABMAAAARDCAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAk3QAAAABwAAAAcVMvzWUdERUYACJF8AAACOAAAAv5Rf1erR1BPUwAIuTwAAH4EAAIYiEpzeDZHU1VCAAiTtAAAJYgAAHQ2isO8oEpTVEYACTdcAAAAHgAAAB6Dj34DT1MvMgAAAiQAAABgAAAAYBm6W3djbWFwAAAghAAABN8AAAlW3xSLw2N2dCAAADUsAAAHDQAAEIYidQLXZnBnbQAAJWQAAAXjAAAKWW1ZG1NnYXNwAAiRbAAAABAAAAAQABkAIWdseWYAAGrkAAfFHQAMu4xXc5LFaGVhZAAAAagAAAA2AAAANuRzQP1oaGVhAAAB4AAAACEAAAAkFCYZrmhtdHgAAAKEAAAd/QAAST5hyJ8HbG9jYQAAPDwAAC6oAABJRH8yEFhtYXhwAAACBAAAACAAAAAgGRgItW5hbWUACDAEAAAMIAAAHyx5QN6ocG9zdAAIPCQAAFVHAADY8DRPtBJwcmVwAAArSAAACeMAAA+TszKSkQABAAAABwAAN3FXdF8PPPUAHwgAAAAAAKLjHcIAAAAA1oTYYPt0/YwQXghRAAAACAACAAEAAAAAeJxjYGRg4Aj828PAIMDwu+TnJYE4BqAIMhDyBwCLigX+AAAAAAEAABJQArUAPADRAAcAAgAQAEAAhgAABekE6wAFAAIAAwR1AZAABQAIBZoFMwAAASUFmgUzAAADoABmAhIBBQICBgMFBAUCAwTgAC7/wAB4WwAAAAkAAAAAVE1DIABAACD//AhR/YwAAAhRAnRAAAH///8AAAOUBUwAAAAgAWB4nN2beZxWxZX3z3O35+lmaWyaRZBGlgZZm0UgLd2sDTQimyACQXBBEiUQDWASNW4ExCTEgA4KY5A4jCBEnUSJDpoJ6Kt8TAbcBhmX+BpxD+poEINC3/meunWfvv3QD5CJ7x/v9Ofz61O3bi2nTp176pyqepwDUi38OVuAGKzyRNp6En5M3gF/lzRzV8rYY+g0ORs6Okt3SSe/p1Qr9fZLd/LOORGlbA19VTVAO0GbxBQ+WjoV4evQVtC90P7Q2ohKpb9V+nvzpdJtJ93Jv4R6Hal3isF+6UaZqiR1h0mled6hfYVvU65xLvX2iuv/XLq4n2me4WvUMXSadIKHJrnUWyQ3wMvcLN0vQ+i7RKk7X5pDB/PcjHYa0Y4LbZxDNd/JpemV0pa0yqW54XG/tEGO3WJKmy2Zty+DEhHvTulMmTWWis5Tcq6CZaZMNe+q3adkNG2Uk9/Dc+Q8b1G4QMcIioNuyD9tZN0pliv99HL/JKcGKzQvvDqSmylf4w2WUel59LUC+fSnDwkPI4fOYCGyqPE2y+nI3bPykFguwQDGOI2xfsp8Mt5gqOGtboyT4G2SDFX+wSTe9QTd3Z/Ime6FtEE/qXXyC2eo/CJVK4Xw+1YhPBdMlU7IrToj0i19Gu18R6oyb4VvZyR8O6gwfBt9troUJOa4wTnIpVaP630b6Xbhe8h6rG1LEnpt5JerRzo26nVQ3U3yHNdLr+U7uEY61unoMf2MJb9rLh+535uzJXyRPn4Rfz8n1OecsR6jzzfKOLebTM1+r/2lTPXJ+w87Ljt3ufzk/Z7qqNFv870qvUVKVDZBX6kOehu5NFNd5t2N+h2b7wq+jJ6Mkgvc3tKc9x2Vb3+3nBb3m7UP603d6sQ4TX+U8bxy+C8PP9dvh+eRqm9mTPqdrJSzDP8ebc2SMWCY97AMc38so5Btn2y5DYydeaasqFwieypt9btxukoZdCA4Q8dnxni3VKGLBRbYLdNWY/cLYw9G+YWgWsZ5C0w/f6kDstli7GMrfXbflYEGyEL5Ubg/CG+H7tf5MnOm8zhX5rlPQCNdbGL6+kQ8lZ/7OUAXQSW4wH5vF1i7UePukj46XjPGGumNPK+H34PuFTLQysiUDeYzV0+AF5HJMilxH5ASv6+UBONlonczY74atCP/ZWxxKKXeh1LqrDbokhoSvpD6rZQCX+HMkFJ3ATbjQvFSO+QW5wDYIv8KdoJHweeK1BHqAG8pehhhisLZkuqgaxm4yqbbRWnyKuQ3BrYNcG8ClAs/dpsyb9PpeyrtPwSPk0jTj9sMHckBdS62qNR5UR2CrrZ43uIO2/8Eixbw8C/Q+5JAj0sVpM8SqcWq114B3hE5Ugv9ncjRj6BviIS3R/m1F5NmPa/Fsta+TXoPmGef37BlV9RB/8KvgwuieuEcytwMPQA2gsl1qN0JfhTVOXJl1J+psxxcCqZH/Wn92sei/g1Ptl9TP+Z5Z85zS7At6tP0r2PYDu0E1tkyj0R91z4R8V57J/SmqPzRt6JxmnpP1CF0wbm8bw+9BmywMuhkn0Htr6P8FK5POIJnHTfyDv+Qg0csnQLSoAX4LuUPg2dJnwp9HfwH6M7zgEi2tS+D17zLpZM7ETu6Xya410vnWB/5psq887EJW+SV2N4YqrbKlAk/UHuHfvzaXxnOCr4bznLPDmexFvwmuBn6afiQ0zX8lbWJHb0NUuaXST+1eWp/jV+2S22/9Nf1R+1hul20llBuol23y7DtHXVtVluq9tB/WcZAi/x3pbWuybZ+c6+vnK+2DzvZSG2Zeyj8QvO8Ytb3W3Be8CWMbZyE3aSMu1cmazkvIy3UZ/DOlsXu+vBFd5Wxq6O8Qmni1soMtwfP1HEHYYu0zfXYmJX07chpavsY4yGTTx2lmufXwHOxTHYPmTW2ebp9RL2Bxl4Ka2ZhYm1bCF/tGGcH9zZp5f0jtucubNIrUugtFAk24BOp7f0QPnpQ/my+vZWUn8Yz8IfB672Uv5P2ipnD3bxviT2lD/PMvFnfs8atYhxVcobxe/BLdK0yMm8mvRlrIc9jrD82xs5T98CTQWbuarDzrLNmjQaqB8EX0gR09T+SgdQp0/nyt5i51XQz9fGyc79E2mh76R5SjC/Xw5YpM/UWSHE090YnsvNu1lKdd9oMzjXrc5Gp0z/8IlMsFQr/XhkID2WmrxoZnKmQLv608COzruv4dV2okfak25g18mZsXzdprWuEwt1vxt5YZWDyJFo/VD5G5683a11jvxxd0vVS3wVSiv/ZW+F14t2F+J330s638YO/IP1AGJp1XfFH1lv6591os/4RFwDHzMnz1H1GeularHzY/hsrLbgIOZyCPGYzl9OlNP1vyHm+9GL84j0qkhmJXvxSeqk8dUwFW/HNrqEtRwoYn/B9FBsdtXoW3CRneb+RiphmnpSaNOt30IZ5vllGFTwsNQH6lO3X+uTOL6UUO3EveNzaVHD037G1PcA5Zq6Ub+TvPgnV71Vltw7b8SxyR391/H4TyrWX9jG/qgM6Dzr/OvYc2j4Yy7q9xviUnbT9YA/0iPTOjJCyYJIpNy4Z5xlf63pTvrn1DWNapPMWXEh7L/Ie3dH5q6PGN2ySTvO9zJHCmKqOx7wqT/DeW/XU6IrlKUttW/G3pL5TPt874Wuqb31OrjwMxc+J5ZqgDfuk6LzRO74Ro6e51PKm36DOg34rqq/ZebHyiWkcewULQXcwX+b5/yxTvTvwze6WqenhxF6eNFbfH5/J8KU+l79KhnjPobvEaYxjRCyrzBDG94g0DlYimx+Gh9M3hB/594Wh5b86GzuqnZiMPv+C9ktp/6+0f2li/Hae/MfCS7xvhpc0Kpc2GeBPYZw6j7a/oBDdXQUOy7igJTbtdtKb5A6/tQz3H+cb6Ua7reQ8/yIZ7s2Q4ekl5O+Vmf5O5nJt+KL/rNzk/5V6O2VpcD11l8t80gFztNjfwfNt8r3gmfCQ/xDvl/BMHvwWYh9uok0t/3XvBzKcOHFmcAPf4XuyMJgo30itlV7Ef4tSU8M/y+fhvtTm8LnUf4UveEukc/A1bH7Id34ePue1oAdz0RI/dwnybI7N68zzt4kt20lR6o9SFFTy3Bed59k7g3oteTeUepWy1BuGP+2G53qlMtPtwLc9DHszWvygXIrc1czjGMq1pk5rbJj63bTvNaGvtlIZDOK5K/rfDXksk/F+Pyky/t9BaZa+mvgZqEyxASNBH7AA3A9Gg2lgEXZiH5iFQ3RJXb5Msv7IRJ6H2LLaxrXgsuhZ34ffs++G2PeXRWW0/tE/kl4iJ/VneHogShv/aY/zsmi7g52pgp/lPEh6vo4tLutcIdO1tPuKzHE3ssY9yHo8E3/nKfzgwfjKZ7OWPCfT3T2kO5K/HlzFOrgY+RUR471JuX68u4J6u2njHt4rllPnNegDUuX+Xi5zd8hI700g0oG5H+ldAKplZOqXMt85LPPTP5DRhfNYK5ZCy03a7IOx/v9cETRC3/fKMn+/LHPahNudlbI19b5U+sPD7d5MOYWxNIl8vNo9kW9a+ww+iqZ7kn+EpuaDRUqpuyGje2uT8OVfkZF+W+nnjpfvpzZLczAN/esH7aX50Nv8bXKWgyeqVEGcPTCG85DMUbjvY49BsFqGKDLPRPA2wd8mw2N3Bd9WiULbjsE3sZ1vpau3Cd1+FhvVRMY4D/NdDiC+HEH8uKSuLGyPzkFNzrMZA1TnXf1g1b311of+ehRThNdFMUp4Nn1/5g1IXQt6098j4EbSPaH/Bh6MnmUdeBUsQ3Y7VPakHzKy2KR9hs/SZ5G2BW2nMlOes3xbueVDUp65QLb9YhnnpBVfA2Nj2R8P8bwcMzc6J8i+IZj5ADpfBUOkn1IzPxbxXOZC568emMdcuOvoW8en89sGHy2GlVs+RHoQbjc6m9AL+h2lQPZnaJvoPd5Q7T3gL8xPO1AMVvN8XeaInJm5X3XJxJ1qE4aCufoOOjC1km/jUHiUZ+K5sJm325SdbrFEy8Y6z1jWgzvBH2LZqkz1e1Id1nGezNzHcxvPVfy91JufhIy17fgbyQJZJ+c7blvThlfS6OiT4P3k9xfLNpZhXMe0wTzX43VT4lu132m2nUfoW9uaL6NTs+U2HY/Kw/A7Qs4yPOiYEm0qNN/MYdwuY0H2p0Xxfaiy76/zEOHoD/E/8UWPLCVNnF/bF/qIXWe+4b4uf7IxMf5rWBPR2ncjO2DWmm1RDB6OyUmnIn9XqYnHO4PzLVbnoDxa78IzQV9dZzxffL8bwNdzHyUWeBE59uM7Ae5PAT6eiQHmEHPi77i3IrdE7EH5XvgBo7zx4DzjBw5xrzP7dgYmztD4QqGxyTmUL0SOVdACE0uYvTOzZ0Zfbm/qTWTt1xhIzx005qEN7yzy8JfcC1lbJrDu4Q8YXMFacCgC61sp61cpvktp6jDpLeT/FV/yXNIPgZsBsYnzL2AT6THQd6AbKEPs6vThWbGUvPbQq8EPQJMIqY8jON+EToTSFzpQ6gwHE0BjSydE9VIroHeD79hyM8XHBvvoVKnTHtoDej8YIb62l3rJlp+ZKDO7rgy+jEOssln9UPz9kmiPU+M9/IEt4eMKYrZSYrXfmj1ckSpnDX0/hX/Xwexb9jR7CHqWoPMwlzmV8Evb3kTvabNPrOcSVYm2D+veqNkXvtTsp2p+WzNfGrOWZ/d0s3u5Zo+8wux7jnR/iH8W7e93QK6+kZFivJXnVkV4r9Mh2rdEDi1SS6CTDdqkfoxHNNHKuztj+Qcry7vDjUZWt1l5r4r2FFP/Gq62cm/v3AJdB6ZYmfaFKhaC08EZJla8LYLxBYkZa5+2e08xnRPB7EOZfa7E2Z3Gjl82QLPnQ2Z//AT0ZM/5dM9F5ynf+V4+Sp226MQH9mzGSZyf1KP1z/jC9y191+YXabyoepFL8539Jc5ZjntOEcfgMc13Hpj3XLA+vbCh88I6it9kn0/2bErP76ycDI1jwBPR3FjVz3PemKU6VxUm1mxiz1HG6lkkYx5j5n0b6/JTRq8aPkv+iuhJ62MeGp8nZ8+VT3xOlZ8OPilab77iM9AT0Xg+8tFgn/T3BvE9TJUa9zD9DJDO3tzwgNmnPQ7MHjIIpoo0BGsnj4FPtKNIV9aH7v8eDwERoiJzesMwZ2UG4YMWocWLCvdJeAK+2zDitTwX8XjSf7XoE0H3lY8Hw2v3Opg96OMAP0wU6S8tvl0fsdxjOcZyiced9UVs/3G7f+88/r3z8lWN+3i8J8H3+Cr4T0vVrrRsiG/VwaA5wCMNPjdnAWp3u1q0RGc+Ac+Dv1g8ZxDttbd0/4/Zl5BknWP0QM8qFPGc6FmJnj0UMDa8Zv8nWl/XLLNuXdWgfHbDHx5t8BbA27bnK3oe9CrzLbpXEFNna3QvJ3VelGfS6/i3NbsH8xooi2jtZNqYomA9+oj6w+09nkfNOeRuuYL0O/5UeUfv+WRsH4GkjkHhWhmuZ63ueXIPSJPuBZ0CXOd66Z+R1PneP8hbtDuLsb6a3iQlCucu5LBUVlk+NoNxwXMyy78UfJ3y7+JbbQiP4rteAcYzplXY2p9qXS+6e/QN7FaJfb4YWa9iXXS9A7LKbyf34efel25Wl9a9pdSuSBKZE6ChcSqcedIc+XaGngIGg24Www3dJq0sWuKj9wOnOcvE0XpgBSgBPf+m+n2sf64+4Ln4eJqeJxlQCC9l7uNSSDrtzAuPpF6XSvIaex9H+/D27kNV7MOkd0jPzHPmzkjbYKCs8drIPcY3wl/Qey+ULTLnPNGZTzPSlbYNhZ5JDoJeCk71r6L97Sa/Y1Asd6tviF6tDrbKmcG1cibP52T6ysXUmap5aV/O9ByZRn5VegL5JeHu9FApT78rs+mrK+0Y+DfS7wIZ4G9hTvfK3MDs3Yfvpu/hG3+bNeoAdReZOyznpC+XVcEs6k/j2SI9XGoKbpdS3qs/1Mrs3etdoTVSga3srOPVsVF3n99DFni7ZaZbIkPRm3X0XUPbUzMH8G+Hst7/VpZ4V8tQdzyyaS/nOj+X7ukptP8tZDaXOPAWvrUN9tzsYekBr0upX62Al0bw/aSOCR6GoX/TnYraDX4LuY9yQ4JBUpluyvJDbJm5nBhbZLki087QFaDE5intCU6xz4Mt7Q76gjLi++Xm3LWn9E/fzzd3mTmDLc5cJMWFb0pxk0tIf8vkFWUulqLC/cwzPq/REWyf+rnqxxATVwY9kNUHpLW/VnJKppmcUlhAuoPJa8tct800MndUquI7L6pfmLUJ2pah01insCP+a7R/k/SL8+FV/Y7zwBb0bSJ0bQ69U5Hem7qcOju8pdKF+Vlr6F6no7c35ftbw/f9rc51EeJ0kuYitSN6p1SRfPe35v9P4Lzkb5V5pD/w94aht1dWK5yXZKlC7U36z6k+4PSY8v7X3k6ZZ+heuQF0p+wVmR6pOzPzU4+mz2PNFjkIvu0Nk7P8YXyXO9DhFjIM+ZUFkYz72LimF7TQnt92sj5300QMFcdG0R2sZ6TGnv22It2DmPmU9BHm/Q5i5KdluD+aegXSW8/dvdXmrlit8T1+Kr30Po5pi/hE27N2/Ri4C/m+FLMSuK4OwTbd19OtccWXYeoNYh1d696TfkD0zo6uG/B7LvkXka7QtcC9nvpA04p4Xcml/kHsI0BeU0FvXTPidUOh7VLuE5W5WW9FvqnrIFiI7G6MbGDqJmsL78pI+KGC953M+Qx2QL8ts7ZRV++D6VmHRHdkMrrfpTqv0PuHMaI7JbUbnbTMTT1GX5Zm5+pds+9XYu5e6rneNXK6whsQwZ2D73JQxheMw1beLGMLGqMnjozNrOT5Phmbnott/fRYmojnG4yb/X9Cj/5v3d3Y4CH0aYsUBn2xl9+TUYXNpSbYnohzP+P9a7zvCZpl71ZUBy9D38Y2Tpd+7vvYhdbS05stI3LjTm+KTPIywN6LyNLZ2Jy5oLdMUngzkMUMs/5PVjjTsPXfkmr3e6wxG+H7cmLM7shturT0O6Af2+QM2j/V7OfcEsXaxJvVMbLja4m9uZK6toxfhHy+I5PMXS2d379Il9SVMlmhc+Nu1Fjb7gVMC592V4YvWdvYxD/Euy7YzkXhAhPjXikzvf4yyV8HbQ7dzbspeo8i3EN5jdl1P6lpXXvKQ3hI1xRi/knBPPRf72vwnfpLTaw9JF7D3Xbhp6Sbmn2aYlmYrqB99SUPIC/dy3vGnDHq92nuBfCd99N1o2Ai8u8bfugvlrFulcyB/w+9W833M9HsnS2XImc9ulWa3JNDPkOZR0B6rr8He2/v9qouKNz9jLGUerci5/dAEXM1nnkYL6V8b6X2LqRjYtoK4lFtewTvV0prgwXhNTy39fRe1Aggtde6i81dxkFmL+3XUgL6OHdLCh1t668w9zEuCubSZjlr9nLpqmeJ2M9uwS6wmby12LWvydzMbCnJzAcXgIFSWngt4+0oI/n+3tTzP/ce1stA5tDGSO8TmeDxzFpf5A/GFh1grD2lg7k7+KY9P7Qw55UxGjq3/D5ya+DM0pxXJs8q9ZyygTNKbUPbNfUo43lSlHop/J3u16cOhtsVf09a9/qdzuF2PctMprEvA70qaNXJpXPOw/rF5x/pq5jfrpQpDbefTDp7LiXh53p+pDw6Pwu367OWyZ4vHZT1Fs0s2lrY5/CwwuktK3meb7BWRju/4xsAevah7RnkOePytknnWE6Gjw/w64HXNfxckTy7aQjeDdgx4L7NuJLpRLssc30SZ6bD4rSexWbxkjipzfC9MtztrJTyYDpx5Sz6eAU0l4qCp2RMo9e/fCXnTuIj1LHtsDZPZs75HhJ5NZZ2szTOX6jUnEO/FO6j72bmHPolxp2UB89JPdL5yadjf4v+1Ds3G8o7kEybc6ynyHuqfjp7vp0Ddx19DLDznEjX0/VN6EWcTuiFnqvFc2DOEOP8Aap/dtxWTwxmSl9vD7H1TNaTPfhjM4m3o2dDTaxZkTpNbLyuPoBbLcvUhwPfCrZgSytknK4zvJsKepvYV/0f9UXUv6gg5o3is//yot86ENPjDxATg+ngHHCtWR8j3+SniXvPZRqXp2fLRb69FxrHBOa+4SJz3lVj90fMHUO71nTL3g3dZWKmKGZkrbK+n65JjXRdt2t6kdlzjH1CeFY/zN1pzmp03+Eqsy8r4ZdxTGH3WXX9qYr2jXXtDS/xjjm/0b2v8LAXnfE0sXf6Suy6Et9bb2v3m7u5+1Jt9fcf7j75lfqI2f2j6G5j93hMyr/ylAejs/cJLew9QoXy6tTxdgycHFzq9jdzdaMd6126/+JuCD8l3Skowb6B9D5zv/uA8XXnyqnm/toufLeHZQDPGdDaQNu8S5a7B2WYiUnXoDPEqk5fXgwIv3CukXZBmblXOtbGpjNU79CFzpSb4kX3/kvx0/S+msYTw9DTdxL7bBofjIOOjPaOwg/tfeSR8V176rei//J4rzk1rXYrZd/n3XfBInTkVNCK9z82fvUW+YPW130os+9g5iGiiviOa4zYz4jnKYbdk6+0e3+tjJ+wRbRfvW//mL1Dr3f69XddLSlfmjhLMfGP6oZfd34VnWfE/mf0zfxzci8njts1Htf12fq6Vcpn3Hbub+B434X3TxqeBls/QLE4nKHIt/8UQ9eDE5XRuxjHe6/2+URt/P8E73NpnpRProxy8+L7SQ2VyVl/++Rr838T8CN+D3aBp/9f95US1mrQTNTfMXeXS6DN8b1HkH6DtJ5L94jujxy5E7oCqnFzGP1Wo3Z99BsXLXf0EPhu9JuWo4+JfPmfFouj378c+Qlg7o4SCxx5GGwGD4Bq8laBJ6k7Jqp/hPTRPwH9rcg4cEdEj/wI6PsC2t2ndgY+CpKI/QV0xNw349veqMBn2g0+U/8o6Ud+Fb6RvZt0wrtm+Xynk/Wj8vlJeWMFez9N76alh+HPD8vx6ZM+VSJ9UvFAwgc7qXTCN8tNJ2VaNzf1/fF4vvLJKikbYopyMBgUg1+BBXrHSvl3Hidunxl+5u0BOX7gCekAuRLcz3MRz0WRztUe8M6XNTkYmQu3maHluSBfaVkubH6bXJCvdEQuyB/RAB/5yuXjI19+l1yQ3+Ur4CNfu51yQX6n4/A3Lhfkj/sb+Mgn5865IL/zcfiYkAvyJ+Tygc4M8mrktTq7VftmhPBW0MHYsQrpRd7vs7HXOhsrdTW2LftXLx7drO9q77J2bI3iq9qPOI4NrH8v036b+eK7k7FhJ2N/knFfvhgwbzphlxqyzSc6r3e6Eu9H59IxdtuzakNPdC8hUe+Thspbe3O2udPyc+liYiGo/S3kDOifoUX2N52qPx+Cz0g3jdIyGPSN7nibe/JKzwZj3T/JCOdVWeg+ge7fiK19AZ3+kZypMao5690nl5t93Ar5hrMz+t2++yg6LHI6dU0sy3PHRCxb6c0jPrpXunkdpdD9vbT0xhDTbOQbul0G6F6495B5bu20YI5vldO8xcQ7z0tXvw3tbMS3vwG+NkuhVyVdzT7lQRkPH+XeD4mnmkphoL9lqaJesSkzyP8OeS2o8zy2UutuIf9B0iuIu+ChQcCT4ScBw0+EwGkRfhTzcgyUjySKj227Hhi78pPbn8LIIgnkEskm/AP4d3Ag5ov8evJKwvAa42raSPKLDGOoLHOhsk3imPFZqNyTMOOOwTxkgQx0TkzfVgd03t3d+Fo6Zi2j46yy42I83mRpHc+/+7EMNnUpo3pAndaGL+3nKsrq3G+l/nLSHc37AbE+mXqaT1kzh8X2/VbGprrXXcaacRuZhh+pPP2d8PsC7W2jjxnUnU38uTHSHfdh+rb8e9XSWNvyf0d+TyNzM1emzjDaiPhvneTd6Jnyrm3GvGuZ/iLBDdJaQfly/2eUpy/4qwwuhJaKmHOjacTL0+T7oBgMAo3BYD1TcfQMIsrrcLLl6HtMJo1tIy5zushacAvoCUrBJaAPaAvaWXSz77rY5ww4o/EaGd20sfktx/amLxiqvxVZZfc0/zHf+lBvTYh+D5B9hz8+ByxL+nn50sfcwc/TRz07nvRvHw7f8CV8w1sTvue9Fb6Xblp/Hzmvn3sSvKkNLJgulxVWhY82+o1IYR/ph4yq866fiX3QvPud+fY488kn8duC7PqROPPQPZHoN121tfr7HP2NE/pdiX5WHkNHJdLw5HaVjk4fKUldLb11j5t2xifHlv0dg/XFk/JL3Rb9fiG57ifnRWP54/kfbgvKtbC6kxhvXrkl1nnG+qvonDccklkM383/GzeTpFcAAAB4nO3Uf0xVVRwA8Hve417eygNnlpMt6J4HnsfaHGprzRUr80fzj1w4K2eGiE9sZWXmD/yRgYoKCAji71+Bqc9E1JypObVspIhOTQ0QkELu4x3xBwgI6fe97+2KjMZabrX+cn23e8/9bt/v95ztc3YVRbErD59whVhvJfgNKyOdeVDwQEUhpVYSrJQqXIlRtil7lUNEJU8SRiLIADKEjCbxJJl8TvJsP9lKbRX2ZPsCe4o9055lLwyqUAeo76gJ6jI1U12hnlIb1TYtXJuhNWntmhmc4jjgOOYwI8r0PnqEPkIfpY/Vx+nj9Xh9gX5AL9Ev6dV6k96mI+/N+/C+/Bmuc8Fj+GA+jE/m03kO38S38iL+PW92Op3Cudy52rkzUo98LjIxyhbFopxCETbRSzDxtAgT4aKf6C9eELHiI5Eq0kS6yBL5olDsFvvFEXFUlIiz4ry4Ihpcsa4hrqGuiS63a4prqmta/5SYoZ4czx7PIY9ZlNRKQAEN+sKLEAuvwGswHN6E0fA2jIN4SIQk+AA+hukwC+bCAlgIi2EJLIMMWA7ZkAerYT1shi+hEHbA11AExbAXTkA5VEIV1MCvUAf1IAHA9Lv9bYFXAy2BtkAAo3AmpuIiTMOlmI5ZmIMrcRWuw01YgNtwJ+7C3bgH9+EBPIxH8QcswVI8ixfwMlZiDf6GBkq8jc3Ygn7Tb5qW7J+SCnGQENKbcPI8GUbeIpPIXJJC8i3JMlutfZ4lmWZJ5ti/CqpSB6nj1EQ1Q81W89QLarOmaM9qs7Q27X5wnKPAcdBxOUKJQD1M5/pIPa5LMkFP1Q/qJ/Vy/areordzpVsyikfzQfxlPoJP4TN5Li/g23ixJak4o5zRztwekvxvJOO6JXNFgdjVLXnGkqy0JF/qlkxyfWhJToxRPH09uZ59no6igZ2SdngKImCwJTkEhsHrluQYGAvjIQHc8D5MhWkwA5JhPqT0kFwB+bAWNnZKboedXZLfwOUekl5ohIB/gr8lENspeR85foqzuyUzLclcS3INbsAtuBV3dEvux4N4BI/jj3gSy/AcXsRyrMJavIYNXZJ3H0ia9Wa5mWiONeNMh6mZQabdJGhiAAE7sB3bsBXvWNWNlr8P663uOus21OJVrLamXcEKa+o5PG3tc8y6N4fxW0wKjAgMD8Rcj5Eg78kOeVe2yhZ5RzbLJnlL3pQ35HUpZYP0SkNek3WyVlbLSlkhf5GX5EX5szwvz8kzskyelutlpsyQ6TJNfubz+1p9R33hvlCf4o30Or1h3j7e3t5Qby+vaqDRYTQbV40y45RRYpwwjhv7jV3GdmOLsdlYY+QaOcZSY54RbfQzogzNCDLshlIfqKU12e7v3Ifdh9xzJo4MK2Z7WTErZJvYRraBrWfr2Fq2hq1mq1g+W8nyWC5bwXJYNstiy1kmy2DpbBlbypawNLaYLWILWSpLYV+w+Wwem8vmsGQ2m01mbjaJJbIENoHFs/fYePZuqD/0k9DokFkhM0OmhYwKISEKNSnSAPVToPfpPfo77aDt9C5to620hd6hzbSJ3qa36E16gzbS61RSH22gXmrQenqN1tEaWk2raGWvKw//uv/HYxCa7YkHC1H+YkoUW9eXTXl0POy0P6Ii6F+d7TEPW0HXmvEfDQz+R9Vaz/QP6lzaMwB4nI1WS2/bRhDepWRbfsV0nMQPpu2yG6ppKCV9pXHk1CYsUbEtNPFDbkk3BkjJcmw3D6ctAqQnXYIYmxToT+hPWDo9yDnlD/Q/9NBjA/SSszuzlGSpQIsSS+48vpndnZ3ZpfP10x++/+7R/sMH9+99u7e7c3e7VtlcL9++5czNfnFjJnd9+trnVz/79JOPP7pyOZuxL3148YO0dYG/b7L33n3nvDE1OTF+7szY6VF95NTw0OBAf6qvtyeZ0CjJuLwYMJkOZDLNFxayyPMQBGGHIJAMRMVujGSBgrFupAPI7X8gnRjptJFUZzfIjWyGuZzJ3wqcNejGigf0TwXuM/lG0V8q+mdFDwNtmmDA3ImdApM0YK4sPt4RblAAd9HgQJ7nawPZDIkGBoEcBEqO8/2Ijs9SRWjjbi7SSGoYJiWneMGVk7yAM5AJyw235PKK5xYM0/SzGUnzVV6RhM/LEVtBSF4NI3vzsk8Nw3ZxNeQ5izKvxYuGTiqBPbTFt8I7nkyEPo4xasO4BTn+4x8TJyw4P533nnVqjYRwJ3YZskI8Y/KXFa9Ta+LX98GH1KxiIIow8AsIYWmNwVjaU9+T9CkMyHAduKZ4dTXuoiTYY7Kfz/MdsRfAxkwJSVafmIdTU87R8e9kymWi7HFTzhncDwvnozNErD55OemwyW5NNhPpo3FYo1MjTWJouJOotXWKUnCkSqvtuFKcEV+EdJCsymAmHoc1TeOnNk1EdRpg8PgUrOQW7Meu7M8HQs+BXEd72WPpnIm3BPafv/mzWxI2Jb2W/pYgiVnSTjTQt2hp2/LSJUyQvjzsKMxxVvFXs5nHDU3yfZ1BB+EjyxDb0M9dgeCbJm7v84ZDKsDI+ooX84xUjEPiXLF9qQWoed3SnF1HTb2laZsHHPL4V0IJIWdlKt1uI/q5MXcnJ+m5/1DXYn1pjZdWNjzmiqAZ21K5i4v1021dk6KxAgIukxZEapFD6q1ueCiA1mMVubsbLECpwRzlWN5LGJofU5qRUK4gf++0PSPjDaGvpNWr8n+r0ZeCBFYSyopSDxbirz9gmv/TqHH8F1qp7sSsuSaZs7v5mS6+a3pDIgETTqa1UnlDiIEuXREOKyGKnBVFIMLGcb3Cmc7FUcJLeGLfDVrb3zh+9dyQxRc+LGKH5rIZjhohtiKSsMqedIyIKuJa/rkvb9s+lxWbm9yrwSBRjgyZ5SAPlEbmI04PViKHHqxteEc6Ieyg7B1qVMsH8350AXTeESPEUVINpShEhiFDShRq6VBLKbxx5BBSV9qkEii+2qBEyVItGSXVhhbL9HigtBrIIRpokrHGaaGTIEvFsnqMvthEp0Cjo+YVgVuDKGX8RMCUPWfgmpNzZpxZbU6DiKDoECSvADtDyctZOkeNCHyuKnGD1qMZxzhSnlabyDogUVZvy2DmCOtwBOPFC18/WcH6hvdyloB/9QXEPD54XsIkOitBHS9YBeosrcIFtg09lnDAoar5UqTdslVPVS+WuLsFCHzhhrgKszLZlo8ojtmBO/yvINoBwnNPORf6TIujTQ4YaELe7WZ32mwRX7hQrctxgUA+q9w05Z4h7/l2GxLKeoUJSOIcZnJOGd/EN4DCvinr1RBrHIq+ykGwBALmVQzTB4d4rwi85qshmCXT7ZHkA7vLJSQ/LcPQmoXLkfVlFvgsgGKhKx4UKpM90LNtuOt5iAWyHK9nGc4q6EKxBrYENsI3ZB+cWNthjWN5S9zYOPrx2bQkyZoniSEEF5LCFK0igMF9WvamF7GDtm/zsIa/Idv4F1KLb0iYrooOejNcbvoA0SwVSwgcZFQFP1WBPzmbgQ2RGBWnBbsuILM3oSiT6epXARQw01mRqa0ODeAgCIvI+eAoBvZbCAR71dLyvh1t9lknEtUe2jE4pbyqO08utyB9qgHxyJba+DQocfEUz+P4dMbg9ViLEF4HsspAaya1cvOkjO0X0dRobVhsBhJVmuo6hbPHogfLnSV/R46VVr8xILDZvwGP/+MjAHicrVZrcFvFGd29q6eVaykmCSaOs5KuldiRjI3S4JDcoitZCk3kYoNDIqUMsuOY8BybyqJT6uAwkE4zlNrTpDwLNg+nDE7G11dJqjzaeOi0HZhOk07/MZSYkv7og2KgpQND655dKQnM5E9nKvucs99j99vdu3uleBXZyj5QjpB6wtnf2ftEh75vOep5if2tyNbwWHwpu0B62J/JOPsTOQ/YiA8eH1oxYBDtBcC+MMveLaZSUaMEDV8r1Wpsip4QAWv5iujP2LvKYbKacDjOW8vqZOQdK5GoNK5fX24U1zRHz8er2DvkA0Bh77DzpLHcq9h4bXQ+rsJB2cPESynhZIL9gZiAQgz2VrFhVXT8DPsN4m+yN8gu2e0NS10cxYC/Zj8lNVjecXasEjlWrF4cJfE8e4JQMgs+B8wB84CNDLCfkBFgFJgGbMQL5kAL0Ck8bIpNYZ6T6O8FtwADwChgw86+Bv+9gtmr7B4SRN/vs4NkKfRxdkDqK9Dl0JfgXwl9EbbQ8Yr9HFTEn634n4G9DPp0RZ+Cvw76JGyhP6rYD7KC7DdU0QmWt1ZyX3wl4n6gFWBoHUTrILbuICwCpuxRdp+sNAONQu8vK7ZrjxXQ5DPaU7z6mugEtnQPtn4Pdm4Pdm4PsSE0fDFnuJzTzIaRM4ycYeQMY1daWR718nhgBOwD/ADDvuex78JvgmeBc9L/GHgMmBAW+xb2sQmz2s/usRo5Dtnu4g1GNHaK3YmtNtidxWvqo6OXLXeVOIjQ6op6RW6/jPYX3YuEt7+4vL6syLo3Xs36yHcAhSwBNwBfAZKAjfVZDS38JLuZ3O8iRjUfUUbYiG3EbmtN0pozLEq6XARHsoY1E91FjvOcTtv2TcT3sZ0oSMA+YBAYA2xYbQ5+P7sDyGFfcpjUHfATMIHlA86hPQe1w/Iiz4s8L7xeeL3wErCIdAE9wGAl6rgUudhH5M+LCLAa0Wp4q7HKOfC8aAFbYKmwVFgqss4pn2OGPrAf6AKY9M0BeH7gi7HWSrwHcMj4vMy5GDNEX+VzI7J6tomaTXSiiY41UUOPxaNGEFRTU7NvtGO640zH2Q5brmOgY6SDtZUWZotWuDUqNRgSesy6Znm0zRvfqExjZjnwOHAeYISDW4AYMADYlGkwx9utBYgBnUAOsKPHEXFnwbwSE/5xGRMtEVe+FGdYw2Frw9rO+NfxHssB4wDD2IcRPyyzy61p6TfBc9LfWcmfkH4OvtiHyT7i3bGjwhyIATlgELCTs2w73rvbxfhgDgwC04CN7cDfdrZdOYK/w8phFjHU65ZysmwZIaRmscsX9ymL8FBV+qrkpyXvlxyT3GBUb1E/2aL+fIv63S3qajSURhJH4KDkgOGJq0fjamdcbYqrGO1qEiCqslSyQzD9q+SbJUeMJQH104D6cUD9MKA+H1AfCKhfDYh+K3AtVGWJZI9g+qTkLZJXGR6u/oqr27naxtW4Sl+gqE4SkldKrhNMPzrqTXqJ+xT9iCQxErX0Jl5SiBS6YOlxyH8s/SbIvy39Bchnln6An6afUvltQT+xGi7w+FL6D7rZJuyPK/oh3UymoPPQ3dBDRKch6CuW/ojIfxn9n4X9Egm6RP6LpEv2G6ebpf/5Sr8fW5GdqPqcFfk2qj5LIrLqU1bkArwHrMh+yA+tyH2QUSskJniPpa/h8cV0N2lQRG4fCSliJh2Vil/DyPdBbyp3TlkR0SspCpRou6VdB1ktZnmaaqRLluOWJhdZTzQ5xAqiyUnXkZDUauqVk1dJUKrL0h7BKI6joQv8X/opsXDyT+q1XuDvncb6tsH8I91sTfHfnRDbZfGzkRINHee/1U7xXzaU6DaLz0ZKLgTOREoKPcZnsMkmchV6nE9HdvMjmoxOaojiUY/rzfw5bQd/JgTb4o9ETotpkPux4m0IZyM38g59im8KlSjCho5iRhXfoH2T3wD3+hLdXJzi1zWUxFRaMcbUcb4GFVdpmMpRvu6229pOKuuIkxaMiHPIudO5zXmLc6NzrbPZ6XfWO1c4l7hqXD5XtWuRq8rlcjlcNpfiIq4lpYU5I0xwD5c4fEIcNsE22fYpgkHiRa5Ql4LbY17F0kq6O0HNmjRJb02YbeF0yblwq7k+nDZdXd/IzFD6gywsU/leiZKtGRxR4dpXZ9a0Z04QSlv2PVEndHjfE9ksTZuzfSS9029+0o2VVN2yw7RriVqy7MFYbazmxsU3bEpegXoqHL78qQ1/8VNbnzCfTHdnrHWvvVafyJpR2V5YQDtt3tTtvz1zQnlAGUglTyiDQrKZE/Qh5YHUrcJPH0pmL6WRoDKINKILEWlFEhRpJEiLMq1DpuG8BlPJmWCwnPQ63SyScI5el0m7y2M1oATG6hKCNGUlaZBjNSgrRRoORnkw7xcHW0SoVw7mXUTkYCtE0kwohJRISKTMtIWQMBNqk+Gpy2EtVJ5OloRknRDNyjqUXs5pLOfgMFRyFBdywv/PT3/if0imxd63d/Wl+rVUj5bqB3rMxx+8q9bcu9Pvn9n1tgj4TbaqZ2ffXUJ7+823tf6kuUtL+md6+64Q7hPhXi05Q/pSWzMzfUZ/0uo1elNabzJbPDTSnv5Srf2XarWPXGGwETFYu6h1KH2FcFqED4laaVErLWodMg7JWulbEzTdlZlxkUS2/fayFhVPFa5FT10gm1jmG7xR3pGNgdqH607aCL6/POGsuUhLmCogQs3x5rgI4ZKKUDXc3kqo9uGNgbqT9NVKyAf3Yi1BwqQ2dXfy0n8+nx/KCyoUwuChQq10DuHyBrrT5qZbdmRM3dRTptGTzFLxPJCYMa7PablQrjE3aRvQBkIDjQOTtk6tM9TZ2Dlpi2mxUKwxNmlr0VpCLY0tkzau8RBv5JO2gvxk2zOG74x+VlcG9BF9VB/Xp3V72V1zJng2qOSCA8GR4GhwPDgddIjA7Znjhj4e/CDICjiJdAifVFJOtwDFvzCHCmIhecyuocc96N7rZj63393qNtxdbvsAG2GjjHHWwmKsk+WYHT+jLOeGtRBjk2PD2jHPhMf0zHrOeeymY9ZxzjHnmHfY/Y5Wh+HocvQ4Bh17HWOOCYd7zDHmVHo8g569Hubz+D2tHsPT5bFzJyVYWx4Qe1Qo1Bk+pyPJPVVJzpQkd7uSXGxfNlwIt2fiQdKH38cUv+WbyVWABqwFugE7+QX498B7wMeAjTwKPgC8DBSFhzWz5lTt3UmxB9mweJPWsmixdV10fQnae2dZu3eUNXVzWfV4tBZqxdZWxb34qU7JSfCbwFvAX4DPADuLsqgcvFC+g9k8yYcplkVgDAnKh4doGA0qzs5QPhwmAuK64jwhNUy/fIsJzRdIPk9wuiBIkt686FYQevGDgBgl/F94WOUlAHic7VeLc85XGn7e95zzfaq7nVVNYqojkYgE0YQNihaVihB3gihVWSsSWqEtZZVU6jKJxtakITMarEmjjdWWUtS2ial2ifudtsJU3HZr1WrHDr6zT8zuzP4LO5PzzO+b3+/7Xc5z3vOe5zyvKwbcIETyeMKUoCXgL/K4xONqaKC/56YhJpTrL5jmAP78nwOIRSnWog1uSifsQTUG4n08i2EoQX8cxkd4BHOlFhYxeA4bESuRUKQiQhzKcBbjMQv1uIB4pOO8PMrv9EMewtHdX+NvOpb5nXyqKVKwGbtkuoxEIs/TNEE6sOcVvhoRiPcH/RlevYd6aeM/QRrPLqMZ4rAQ7+BR5GK/v0embZCFSpkv19AaL6LIJttCPw09sQ0nJZ1ngzHXnXloG6bzrQ0SIdW+zl/BF1bwe35pEZaR8RZU65Mmxa1DFNriGQzBJN79A85Kc+lk+vg439eX8d9K3NIO+rUJkkcHDMBEvI31jMYpXMLP8rB0kfekijgqN9wZckvHa5iHfDJ/n+9uwk7pJJ00QiMYrQi0QwbvrUAF+9+KI5IumVItNabCJYV6+8d8mL/iPdpjLBmuRQ37uC1JfIY9mGjzqm1lX3Wd77/JEU7GGhzBUfI4z7j/jDvSnrioC3ShH+M3+npyaYJIPIXhGIcZmI05+BNndQ++wk9yVx/ik4ftXjfP3fQrGdu26EvuQ/n0SH67iLO0BTuIUxxlM4niKJ6SITJCsmWFlMoOOStnNaCtdaZeNx+bWvOd7eqc78EvhaMV+43BGEzlDCxgtFdyvBuxF/skTNpKR47oFN//RXvqc8QGPaznzWKzwt5zS0IXQn8L3fWFCDLL+jMOr+FDRuEfEk4O7SRXXpEfyPyP+ql5xPzGxJgu5lkzymSaZabE/NUcsrNslT3nBrhJrio4KfRy6KhP928xFoIAecUhAcnoxvyZwmyaRn55xCzMx5soRDHzZSXWoYrj/hL7cBLf4++cAUhrcs5h7y8x6xZLMVEmm6RG9so+uSi/NECjiXjtqr01RVM1WxcTJXpET+lV84T5nVlo8olys92ctbDWeteZSHNFrjJQG4wPpgWzmhy49+P99vcz758PIfR46PlQaagmdMWP9nPJPxYd8SSZLiXLMuZgBfEhM3E7vsYBnH7A9ZaoOGZ8C4lhNiRw1npLfxlADJbhRAYxRsYRkyRLphILJV8WSYG8JW/Luw+wmmOrkA9kO/GZ7CJOSp1clutyS5nEapjNsRqnidqdI03R/jpURxDZOoPI01k6mzNUqVt1p54yzU2s6WgmmZmmzGw2e8wJ8y+rNsEm2qftaJttC+xhe9SesXddpOvnprpytyfQMpAcyAjkBlYHPgpcDdwLBoLDglnB+cETQd8klmr1Dce9Df/bEgOH5RX3mH1d67guWpg8t1QyGLGAjjLTTbE55qbITRMl56TQ5JhpfoNJ1TtmhozWLyXaRLoeZgqWw0uVXtTbesWGySi9JvH2HflMZ5gUDTR04o7bMFvgrgJ6Gj30DanWvabAFPi/oIcrlzpXrkcRZS9oc9RxVS/VVXzpkOZoEcbaZHcXOYz7B+51xruXLpP25oQtR72J0X/KTSmlahyUgbaNvqDdpYqKe19a4UeZiTx5F33kc/ledkBko6mUQforztbH+mvpJsBB01pOmKbIbOAobTVMhulNzTC7A0dMFxGqxDHMEyNJzJ3/thBe5goo0ThqWj+qyXHpjBZYRb2/HdrdoNjujCtinq03CRiBJEzQWvTg2qgnxmIJOmMXc3AZknQ15vt8mUzdH0z9VOyQXCTKw1TLCHJbyP0iXKOphRPZ6x3q/36qfrrcwByJ4sqqRrxtuLPc9qMyvUj9LSImYwKv1mBlYJs7jqESAdioUDmz/Du8wD3nB/b/OJ4mv3FYbxPIOorKPJNvrAmloQ+xBLWieIOce3GdD7NpVN5Sn8sR5nCPGsQ9cR9y/CqkcO5G+AJfhIl+vR+PbIz0G6m/s/0WdMVSl6mjXQebTI3dJ19xP/pWiqjbaThHPYqVFrhObCb/Xu5zFNrT1M7efrk/iTDGI5oRyuIuegkv4Qbjlmaq8dvQEP3Ep5o87lB1GO4rfaQ0xVQ/ncq7GxVBR+3JRytXwdwtslM0iXzbIVwS+e94t9acNj/ZPDS2xtbYGltja2yN7f+vhRMR9Fst6GJasoZtR8fRnpVJg79PpLdJpvfoxsqtO/1LT/qcZ+hi+tL3pNJNDKLPGkqMJDJYY2Wy8h5PvzSBzmgia9jJdGHZrLxyiGl0eTPoi2Y/qP7m0A8toCPLZ62ziA5pKVHIaraYdX8pndEq+qd1rBE30K1tosvZyspiB3biC9ZCNQ/qxr2sNL6hg9uPWnqxAzjE+vMYjrP2OIdv6c3Oo47u6gL92WXX7N+En1NlAAAAeJxd23uUleMbP/57ZvbM3rP3pFCE0pQOk6aDREkqSU0HSUJUjFTSQSEJnVR8ks5C56YUldBhOtARUQghRCEU6ThlOk98X/1+v7W+a/1a673289z3db2v9/W+7ueZvf8ohP/nX4f/HzaGkJINw2B7CJES0BRGwhYoCCG1NLSFCSAmLQINQkgvE0J8CuwKIZEBOTAQlsDuEDJiUAt6wAIoDKGYvGKDYDHgukDeBdYu6B9CidUhXCz3YrklaSqZC/JK7gihVEkQV8paqbUhXNIbcJSWV3oGbArhiorQHkYBnivwl5VTjt5y9aAf4Cu3L4RMfWZay6QlU93y4irotyKuivIq0VWpMfChkv3KrKosvjKOynquTEPlohCq6K8KDVXUq0J3Fp1ZuLLozJoXQjWasnlc42AINflVk481cdbEWZOOWryt1Ql4W0v9WjivkXNNa6DtGrzX4K1Nb216avO3ttzap0KoQ+N1YuriqJsVQj1zu8FM6+O/kcYG8hrS0ZDmRpNDaOy+CS9uwdGUX8143BxXC7215FlrubfR2kb87Xq4Y08I7Wluvy2Eu9Xr4PO+zBA6noe+O+G73/nI1fODandRt6uZd5fz8NYQHuHRIz57Oh+9ae+j3qN5IfQ1g8foe8Lnk2oPsP6UfgeKf0b+szQPMofBag6VN4yO4TSNUP95Gv+n11FqjOLbqPwQXvT5ovPwIu2jeTFaf6PljzbHl3j5kjPxEn9foneM3DHO4xj1x/B/rP2x7se6H6uXcXjHWR+vp/HypYUJPJpAw0R6J/FtkriX6XlZzmT1JuOfLPBV52OqXqbSMtXsp8qZVgfom8ababyYbo7T9TCdDzPkzKB/Bl0z8czEM9PaLH3n4coz2zy189zPcT+HzjlqznFO5libi3su3rnu5zo3r3v+Xpf/uudlnrMxz0zm4Zinxnz9zKdjPl3z7b/h/g33b9Dxhvpvqv+mmb7Juzc9V2/iW+B+gZqLaF5M29vO4ju8edf833Xml4hbJm85LSvMb6XeVznfq2haRfd7ZrDGOVqDY40aa812rffMWnrW4lmHd53Ydea+Dsd6nxs8JxvlfuA8fmhtk3P7CZ2b5W/m+xZ7nzpPn/Nyq/gv5H/J76/sfU3L1+b7jbltp/c7/N9553yP5wefP9r7Sd876f5Zb7/wYbd5/8aj3831Dz3v1defrvdZ/1sv+10fHBPCYefgiD6O6vOYev9YO+7snHBWT/LwtPNw1noRf//V53+rQ1LIh00hKWlySEp2nZIXkiKQ1j4kxSqGpPTCkJQoCknF6oUk77+k4ltgR0i6UOxF20JSybYhqZS4UqdC0qUR2BOSSru+bGtIunxCSCrTNSRd2SAkZY4MSeXxVrB3Fc5KHUKS91RSFXWz1K8KVx8MSdm4apQISTV7hKRacmpnhKRr54WkOmpej6/umJBUb0pIumFGSKo/MCTduBbUaoC3Ia6GYhvtDkk3W2syKiQ1xXdrp5DUTO0c+luKu43m23HfAXfScJdeOmSGpHvp7NgaNoakTtBZzQfc524PSQ/qq0tBSOpKWzc9dedJj10hqWcO0N4Leuupt7g+OB8tDTj68rjfEnDdj1+P0fv4YhD3hHpP0PwETf2zAG9/+p+k+clhIWkATQPkPdUU+D4wF3jwdDbo8Vk+egclDVF7mP6eo2d4SaBjuPXhYkbQMUIPI+SN2BeSRsp9vg4MAnkv8PcFfvyPN//jwyg6vK+SXmwMCwDnaDGjaR3dG/Qz2py8r5Je0tcYfozR71gxY8WM5elY/YxTcxz+8WY1wRwm0jFRzYlyJgVw/TLvXuaxd1PSZHVeofsVHr2K61X5r5rhaz5fwzmlFqg71cynyZ+mn2m8nI5juvlM19sMPDPtz1R/lnMyOwbO0Wya83Dn6WsOvXPEzOH/XLrn8m2uOq/z+nXaXqdjnnM8D9c8s5jP8/nmNV/tN3j6pvw3aX/T/QJeefckLaRnoXqLzGyR/LdwvcXPt5yXxWb6Nv3vWH9XzSW89k5KWu4+X1w+T/PNcYX4FfpZiWslfSt5t4r+Vea/mn/viX0P/3v6fJ+X7zsT77teo681dK/V83qz3SDf+ynpA3596Jn9SP1NOD7h12Y6tpjRp/R/bn0r/q1m/IU+vqDnS+fiS558hdufsaRtvP+6DKjxtXP6NT++5uE36n7rnH1L83f6+UHsD3rdof6P5un9lfST9Z949xO+nfh26WmXPnY5D7vU/MVMfnGmvd+SdovZrbfdNP7Oj9/p+0OdP3iwx3O213nYS8efavyl1j57+81iv7NywKwO0H1APwdoPCDngJxDzu8ROgp8HuPXP7w9ru4Je6fEnlbjLH1FZvKv6//yQnJySagYklP2hOTUriE5zWe0MCSn1wrJ8ZEhOaN0SC62KyQXnxKSL+wEk2FrSL4oAnVATkkcpbJD8iVtQ/Kl9i/dF5JLlwnJlzUOyZfPCMll1Ckr58qCkFxudUjO3BiSy28LyRXAqzq5ov1Ku0NyFbWq1gvJ1fqF5Gx51eeF5BqnQnKt1iH5GrnXqu+dmHz94pBcF1+9gyG5fhb4bKDuTfga0dWInkZ6auS+8TCYAGrc3D8kN8kPyU2LQnIzdZttD8nNt4TknPNQp4UeWuJqRXtrvbfG2ZqG1mq21lObBSG5LS/aLQF67xR/F213y7kbZwf8HeTdS+d9uO/jZWd5D+B/cFBIfkh+t94huTvO7nR03wTiuovrzvOHaX+Y9h7664mjp9he6vXx2ZeWx8Q9wZsn+TpAXwPWhuSBPcBsBuJ+xvogfgxuGpKH4hqKazg/R9D/PP9G8WE0PWN8juf1RDETxUzSzyQzmcSvySUgMyS/OhBGheQp+psmbgY/Z6mZZ8Zz6Z+n93lqvyFuAU0L+LsA91tqew8kL+bH2xnAy7c7gNh3aVyGP99s881vhWvPevJ7ctfwbR2t6/W4Uc0PePqR+I/p/GRMSN4i5jP1t4r5Euc2a9+6/s4Z/IG+HbR79pJ34vvZbH9R+1e97ebN7/b/wL+3QUj+0/1fvN7v+mAMzn/q4RB/D/PzCN0F7gvwHMV/lDfH9F6I4wQtJ+2fsX5Wz0Xi/lXjv8UhJQwLKb5PpCT3CykpPiO7Q0pa05CS7udbojCkFDsVUorvCSmen5SLt4SUUgdDSuldIeXy/JBSxtqVOSEls0xIKW/vqk0hpaL4yp1CSpV9IaUqzqu3+TnYNqRUx1VzVEipNSak+B2Sco3P2gUh5brckHK92Po4bxLTyH3jGSGlSemQcgttt9YKKc2zQ0qOWjnzQkoLMa0mhJTWPttkQT3oDfbb9g8p7UqGlDtpap8XUu7ODCn3jAwpHfR0H00d1eistwdKhJTcopDyYAY0hq6gnwdxdokAji4dQP0ueuoi9qE6oJ+HxD3Eg27tQV63KbA1pHSX1x13dznd14YUv1dSHsH9iF4fWQ186Wm/p/ueOHq670VnL732oq93RaCxD9/74OzDt0djwKO+9h/j1xP09qdnAI6n9PWUnp+m81n+DqZvyHY/u1uHlOc2hpQR1kbq94WBIeV/9L7YIKSMtvaS2mPMc4xex9I4bklIGW8uE637/ZHyCm9fo3+q6+lmMV3P0/U03brfGCkze4SU2XzNwzvH3F63Nt8M5vPoDXxvqrlAbwthkf3FeN8xv3f1toTmpTxYpo/lZpWPYwUfV/JhFa9W0/ieub/PgzX8WGtO63iwzjldj2sDzRvhA/19ZN9X6ZRNevnY/WZ5W/B+KudTPnxGx+f62Crvix0h5Utn5yu9buPF1z6/xfutvO1iv6P9e/3+oM4O+Tv0u0PMj3T/yN8fxfwkfqfztlP+Ltw/m8MvZvIr/X5KpOzW++9yf7f3h+s9PNqr5z/59Zfe9jnHf7vej/MAXw86swdxHXbWDtN3RO0CnnhuU47h/sdnofN1XPwJvpzU3ynP2SmzP+1ZOyP3rLkV6eEcH8+5PrcnRMLkEEnJCZFIP9gSIqljQiStK9iL9of8EIllhUh6A8gLkXhb2BgiiYog1s+8SLEdIXLB9hAp3h4Ww74QKTEFrF/YGuxdVDJELs4A3CUz4fznvBAptSRELlH/EvVK+7ysRIhcXgtGhsgVZUKkTAzULrM7RMrWgUEhciVdV24NkXL4ytFTjo5yNGW6z6Qhc1eIlKe5fO8QqWCtgt4q5oZIpXohUlmNKupn+cwSV5Ve75xIdic4FSLV9VujR4jUnBEitYaFyDX2avv0NzlSRy/XR0KkLl31mobIDUUhciPPbqLxJnmN9NkYRxO93kJzUz02petW9W/lRTM9NMeV0zhEWui7ZekQadUhRFpPCJE2at4ObdW9w733UqSdXu5Urz2f7tLn3ercw5sOOO/Vf0d7nXB0ct3ZZ2f89+v7fl7mFoTIg2p1MYcuaj0kx3so0i07RPwtjvQQ3xNfT971gt5q9LHeV4/95D0GfstEntBnfzPpb6ZP4nxqdYg8Y/bP0jhYrSE0D1X3ObMZzoPhtIwQP0L/I8xpxALg8/M8f2FtiPj9ERntzLwkZoxexvDCb4vIWHXH0TdezgSeT9T7RF5Mkj9J3ZcLQ2QyHyeLecXaq+bxqs8pZjpFb1P4PlXuVPvT8PntEJmB2++GyAx9zFRrlrnNpjOP/jw15sBc3ngnReaNChHvpch892/wfgGuhTxfhPsteW8NBB4slr/YGVws923cb/P3bdfvmMU76r0j7x0cS/i8hN4l+l1C/1L1lzqPS2lZSuNyz91yfPlq5Dvr+bzxbousoGUFv1aqs9IMVjo3q8xqlbhV/FhlbzUvV6uzWs77NL8v7n1x3oGRNfSscb1Wzlrnb+2mEFlnruvtrTfL9fpc736Dnjaot4GOjTg/oOtDPXxonh+ap/dlZJNZfuzzY3sf0/yJnjab22bxW+Az8Z+p95nZbHW91Qy3OkfeoZEvzedLe1+J/0pPXzmT23BtM7NvzP8b/Xzj3H1Dy7fW/d6IfMvH73j/vfXv6f5BDz/w7AfXOzxrP+L/kf6f+LxTj7/4/IWu3fz7Df/vvN6j7l8+/7a+3zO/H/8BPR3EedBcDql12CyOyC2g4aiYY/T+w49/zLqQ3kKeFsoppPs43hO4Tqp3yrnyPo2c0sMZ/Z717J71HJw1h7P0FTlzRfwsMu9z5ucdGznn/fCvmv/i/i8SUkMZ6ArbQmpSJ9gUUpMDNIUJsDukplSEYbA1pEZaw76Qmmo/bR7sCqnR0tAexsDBkBprAK5ja8F9uv108en9QE769pAaVyOeDR1gJKwGsd7jqQn5CXyJ3mAvISeBK0PdYvKK4StWK6Re0BjkF18Ap0JqiRKQFVIvLAn6uHAPFIVU7/pUv5lSL8J5Ec6LcF40AxYD3ov0VVJ+Kb1eQsel1i/dAvIv12/ZWEgtJ788bRXkV+RLpQzQY2V9VeZBlR4hNUtsVm5IrSqmGi3VxFezVm1ySM2mK1tfvkumZvM7m59+a6Vmq5etfnU6qu+AwpBaQ181cNfIg3ywX4M3Nc2rZib0D6m1RoXU2nRdy5s69q8Tfz2Nda3VLQip9azdIK4+v27kUYN6kAPnr2m9iYd+t6U2pKMRPxrr/Wa1muBoQtMtZuX7a2pT2m+V20ztZvab09lCbgv9tLDeAmdLfbbSbyvaW4trze/W1lrjuk3+bTS2ob+t3HZy7+Rfe3rvmhJS77Z3D687OBP30nYvzzvK60h/Zz7dT8cD9Oby+UH9dOHtQ2K66r+bOT1Mdw+xj+Duias3f/rQ9qj4vubdj/+P0fI4H55w/QRvnsQxQC9PyR8o52lcz9D/DL+fxTVI3GD3g+kays9hZvqc++Fm7m9K6kjXz1t/wecLZv8/OaNwvEjLaJ6+RPMYa2NpGgfj9T7Rs/UyDZNpehXfa/Km8mCauOkwk0+z1Mvjzxw15uKaJ/6N86DxTT4vcKYXwlt6XEzj2/LfMaMlsEzcMv3k63sFv1Y6z97Nqe/R9b64NTjXWV9vZhsGhtSNvP8A14e83KSPj+V9MiikbqZtCy2f8voz9587G1txfGFmX3rOvDdTt20MqV/j+MZ5/lbt7Xi/k/edGX6vzx/4/YOzsEP+j2bxIw920r8L78/wC/zKa78RU3/T+x/49pjJXrF/wl/mvg/HPvr3O0/7xR6g4yANh+Awjw47o0ecl4Lz4E+Bd8NR75OjvD+q12N4jqnzj7V/9PKPGRQ6l4WerUL3hXopNKtCPh3n53H6jtNxwvvwhGf0BG0n+HPCefHdNfUkf07SeNL6SXEn1TvFN+/f1FPqn+b/aTVPyz3Nk9P4T9N/RswZuWfEnaHrjLyzapw1v7M8PKu3s577InFFtBXRVuS9UKR2Ec3naD5n/Zy4c/z1uzf1X1r/FfevuH/59y+v/9PDf3r/z/1/p0JayITW0B8Ww+6QllQScqAfTIHtIS05BnWgE4wEscnn14tCmvd+WsqukBYRE1kA20JaamPoAVtATFo9GAhL4GBIi6obVSOqRnRtSIsFKA3yYrTE8MTwxGhMrwWTQVxcTDwX7MfVTOBJ4EngSdCa2Aj7QlpGCVAzoyuMgXwQXywC2VAY0i6Qe4G9C+Rc4L649eK4i08Aa8ULQloJMSXawyhQv4S1C8tAU9DPhfq5UL2LskCti+i6SL8X03QxTRfTdDGui8WUpKkk/0rqpeTWkFYKT6kOIe0SeZeKLc3P0ntC2mUZwOvLxF6m7mWbQtrl7i8fBHRe4fqKPNBPGX6VMY8y+MvSUHYYqHelXq6k70oeljOXcrjKySknP9O8Ms08034mXzLVLG/mfneklRdfAX+FGSHtKl5dRdtVq0NaRdor2q9IS0UclcRUwlmJV5X4UglHZborW6+sl8rmXkWdKvRXoTOrAZhrlvyq4qrKrcr7qufv8V1N+9VtgaareXj1jpBWzZmoZr0a/6vpq5r1aupk05rN/2x82fOAl9X1WN28q8uvbq26PmpYqyGuhrUa1mpYq4mzpria1mqZ9TW8q+36WvzX0XW9eV7vfNblX1391nXO67qv576e+3r269Fwg95ukH8Dn27QX32zrE9/fXz1zfFGft1I943mf6O6DWhpYL+B+wbO0E3Ox024GjrPDa035FNDXjSirxF9jXjYiO+N3TdWp7GZ3iz2Zus367cJX5q49jc4rQn/bvGM+FucdgvOW5yFps5tU3lNzbyp+1vt36rPW/E0o62ZvWY8aWavOe3NaWhuHs3NLcfc/dZLy5HbQv0WZtdCbgszaUlbS3VaqtNSbit1WpllK3210ndrGlvzsjXPbnO2/U1Pu01eG9620XMb/rRR43b3t5vN7c707fpuy5+2arZVp639O/Dc4f1xh/7u4Fc756qduu3UbaffO83jTmfzTv7f6Z3V3jza09HeGWlv/y793kXHXTTdbe9uZ+Vude5xdu6Rdw/eDnrroO8OODro5V593us830vvffq6T/371LvP89yR9o72OtrrhLuTeXWy3pmmzuZ/v/37PUsPyHtATw+Iy+VrLp9znaFc77EHPXMP8vRBtbrg6IKji9yHzPIh+h7SR1cxXWnrRnM3/nUzk2566KZWd+epu5zu5v8w7Q/z5GF5D3v+HnYme+i/h1qPyH2Elp5m3Uu/vfTVi++9xPU22954e+PsI66PeL+f0x6139ds+6nRT41+Yh8zj8f0/xjux/n0uJjHaXsCxxP67q/X/s72k7QNUGOA2Q0wq6fwP+Ud9xSdA8UO9NwM1PdAdZ6m+Wkzesa8n5H7rHPzrL4HqTWI34PwD3J2BvNnsPkN5s8Q10P4MERPQ52boXQMxT/U2Rp6fs1ch+IeSudQsx+m5jB9D9PfsDr/H8zhOXMZjms4zhH8G2F/BM9GqDmS7yPN7Hnrz5vH89afx/08Lf/DOVrsaB6MxjGa/tHqvSR2jLgx+MZ6psbiGEvnWLMe53Mc/8fzcTxPJsqfaFYT3U/SwyTnZTIPJ+tjsv5fcZ5f5cFrPqfgmkLvFN5P5dNUNabxeppzOt3nDDkzrc/ENxPfLD7Pdqbz7OXhmsOPufqcq+7rtM3j1/y2/xdv0rnAWV7oOVtE62I+v4PvXfWWmuNSc1iqxlL6/eZPW+ZZXOZZXSZ+OS3L+ZJPZz7+FTSv8LmSh6t4vkr+Kudgldmu1vN7NL9Pl++WaWvMZQ1taz0Xa/Gvc07WORfrebFB/Q163kDrBlwbebRRrQ/wfWj/I/jYHD9xRjfb26zmFvmf4v3Mmf1c3FY6t+L90vndxodvnO3v8P4g50dadulnl2dvt7jf+PC7fvfS9Kd57uPjfufpIB8P4y2wflT+MTn/mPlxZ/yEOiftnXIezqh3Rs5ZWovknTODc2r+lx2iYUmI+t4UTR4Woik9QjS1ToimNYB9IRpdHKKxvBBNbxui8RkhmnCdsS1Ei/UP0QvqhWjxGGwM0RLWLuoQoheLKxkJ0UvKhOileEqXDtHLSoTo5ZkhekXXEC0zKkTL4rxSzXKbQrR8CNEKcvztjl61IEQrtg9Rv0GjlXaFaGX8VeRWKQzRqriqFoXo1VBtUIhm9w7R6j5r4K1ZEuip1S9Er8FzTX6I1m4NdF2bG6LX6eV6+3U7hWg9sfXw3aB2fbXqjwFxN1pvgK+hz0bWG+O6eW2INpkQorfou6m45hXhYIi24FPLrBBtlROirUfC9hC9zd5ttLXB3ZbWO/TQjrd30nkXPR3kd6TVb79oZ/H36/kB+7n8fpAu79iod2u0a60Q7bY7RB+muYf+HzGXXvT02hGivWnqrUYfuvwOjPZtHKL9ePkYPK7mE9CfhwPUegrHQHHeW9Fnt4ToIHoH8XywekPMcCjOYWo8p5fhZjTcvndMdIT7kfhe0Nf/5I3i44vWX7Q2Wv2X9PAS7jF0jOPVeGvjt4boRHUmmfkk6y/z+uVTIToZ12Q+vyL/Ff2+ou4rBSH6Ku2vzgvR18zqNXpec3am8GCK2Kk8mWpvGq5pak7n63QezPA5wxxm0jpTj7PomGV9Nt2zxeXxLQ/3nIEhOpeWubhe1+PrtM5Td779+fx4w4zfdE4X8HahmgvtLeT7IvUWOSuL1H5HPytdrzP7da7X07t+cohu0O8GnBvo2LAnRDfSulGvH+D5yOdHZrRJ3sdqfbw6RDeb9RYefq7/z2n7Qo0v6f/K/ld63obrax587Tx8i/tb3m2n8Tvn8Xv8O/D/JH6nvJ2ud/HwZ3p+Nedf8e+m6zdcv5vBH/reY38vn/7Ctc/93/j24zvgDB50Vg/p4TC/j+Av0PdR5+eY2H/Mym/GaKH44zQd94wel3eCxyecgxNqnRTnt2H0lN5PizntjJ0Wc9raWZrOOvdFPC3ibxGuc7R4x0T9pov+p8f/BoWY32yx5AgMDLGULGgPw0IsUgby4WCIpVpPtZ46Eqyl7gmxtKYwL8SiPqP7QiwmPz0DNoWY31WxRFvwmWEtIwfE+u0UK1YHcFzQO8SK4y2hzoXqX5gNaly4McQubhxiJbeEWCmcpZaE2CU4LpFzqbhLfZb2WRpPaXr83old1hrUvbwB0H656ys6QWGIlVG7zIwQ836LXZkXYuXGhFhmvxArL788jeV3wKkQq0BbhaIQu0qtq2jyWyXmN0msMt1V1MhyfXVJwF2NJ9k+/TaI+S0Qq6WXa2ivrYdr1asD1/H2erXqyr1BzA3q168HvLpRXw303kBt399jDWluhKNxjxC7WS9NcN0ipikvbt0aYs3125znOTzx/TnWkt5WemlN/21qtqGrDX2354ZYW73dgasdjjvNpj0v73J9t9h77HcQ2wHPvZNB7ft42JFXnfTdiaZO9HZW636zy5X7YIcQ68LXh/TTFW83191o6K63h/H24EEPXjyih0do6snXnnJ70d+7Fui3j9hH8T86Adz3lddXbN/dIdYvEwpC7HEePa7XJ/jUXw9P0jIA91M4BtL9NI3P8MH3vdizfBnkHAxWY4geh4ofxrvn1BmBe6SZPS/uBTp974q9iGO03JfMZQyusaNgSoiN6xpi4/U/gScTzXyitUliX1Z78nmY1yv4X8H5Cm2v8uY1Pk/h/1T1p6k7Xfx0mmeo7btUbBYvZvPJ96hYnvM0R99zzdR7L/a6uvP4NF/+G/YW8HIBPxbiXsSPt+BtOt/B+a78JfQtUW+pusv0t9w8fGeKrcC3Qm8r9bmSjlXuV6vzHg1rfK4Rv8YM19Kyjv71vNuAc6P+P5D/gf0PafwI3yZ9fmz9Yzo2m8EWnn9q/TN5n5mL92Tsc8/CVj1+yZ9t8r7G9w3+70qH2Pdidsj9id8/0/wzz37W5896+dX9bte/8fZ3PL/z+g/5e9TY4zztVWOv/b1i964GHHtx/Sn2T9z7zHmfPvep8becv/H9jX+/vP00HDDLA87AAefqgDN3QPwB8QfEH+LFEWfxCG+O8PGIesd4e4yWY9aPWT9m/Zj1Qs/DcT0et+Y9GzvOt+M8OoHnJC0n1TtJ+0nrJ83ulLmdMsdT7k87O6fxnPaOOW2Op831DP/O8OqMXs7y/ay9s/K8i2NFzkiR5+6cfs7hPYfnvwkhPWyEbSE9KRfmwb6QnlwR+sGWkJ5SCxrDsJCe2jqkp7UP6dHtIT0eQnqia0gv1hbwFMNxQQa4Li6nuJjie0J6iWxYAKtD+oUDQ/pFS0L6xXkhveTWkF6qNywGGkqdCunet+mXjIIZIf1Sei7tH9JL4yrdNKR716ZfZu8ye5dHoDRkQQPIB/lXuL5CjSvoLlMC8JcZBGqV1VNZnGXlX1kypJfDV65TSM/cBQdDegW1KowE+xXwVZBTgX7v5vSrxFcsDOmV1K1UJqRXpreyfqvwqiodVc9/qp9dJ6RX118NsbXw1lbzWmvXqnUtr66l5drJoOfrrF9n3fs6va7+GuK+uQfQfisPb8XZTD/N+NY8E8Q3F99cD83FNN8BdOfIy6Ehh0855pTTAfSdo5ecKUBPDr05YluKaSmmFf7b6GmjdpsxIf12Pd1uTrfr+Xa67xB3h7h2PGyndjv33unpd5p9ezx3medddN3Dl3vM8h417qX1Xh7cFwN67jOb++pBDtDUUUxHOjryrbM6ndXpjOt+n/ef/+RzLh25dOTiytVrrvnk6iWXzlw6HxTbhXcP0d9N7e7wsDoPq9PD5yO8eARHT/m96PVdOb2XPnuZbS9+9LbeG29vvH3o6kNXH54/SvOjND+K41Fcfc3P34f0fmIfd46flPfUppD+jM9Bzuhg/j/Hm+cW/F8M93yMoOt5z9AoPYx2Dn0vTh9r3uPc+z2dPsG5muh8TaJrEr6XaZjs/hV4DabqbRovZuCbJWY2bXNcv27m82icR9cbdL3hXC5wthauDemLxfvtm77cfb4zsZJPq83mfVhrHhv0vlHch/r6WOxm5+hT/m/Vyxc0fqXm1zza7jn+Qe6P+trJu5/F/ib/T9q9D9P3yz/A3wPOlN+Z6YfOQz+H+X2Mj4ViTvLrjJ7+zQ3xpDIhngbpg0I8o0OIX7AlxC/uHeKluob45XBlCPHMMSF+1agQr1wyxLN6hHh16zX3hHjtJSF+fSzE688I8Ub2m+BoOi/Eb10c4s2yQ7x5rRDPkZMj3hmP58hpoVYLdVpMgF0h3tJ+y/aAo6X7VhnQFPoBrla7Q7x1RegEOFrTdxtNt9WD/qDWbWLaZIKYNnja7Ajx20uAOre7v6N0iLdTp31OiN9j/d4FIX6f+/u2hXgn+bn2u/CiG23dRoZ4d7of3hriPenuLacPvr767CfmMRr782CA/KfUH0jn0/x5ZnWI+94RH0zjEPzDxI6k8QX3o/CPkvdi6xAfXSfEXzoY4r5fxMfxeby98XqawJuJepgoz/eM+OTM//e/b01pC3khPnUTyPP7Kj5dzAy5M4cBnbPEzXKfp16e/Tn6eF38G2otpHuhvYX8XkTf27x6JwvM6p21UBTi75rVuzjfzQf3S/Tvu0V8Ce+W8Ggp/qV8WDowxJe7Xo4rX8/5uFbgWbEvxFeZ0WqerNbLe+bwnn7XTA7xddtDfL319Wa8Xs56Xm7A84G1j/B8RNOmSIh/TO9mPFvM/lO+fqbe5/a36vkrXmwrDPFv6f6uMaj5Hb+/E/89rd+b2fd4fqDthwZgJj/x7Sfe7DSrnXzaydOdzutO+nbyepdzsEvsLvu76Nwlf5daP5vHzzT8Qs8vBSH+Ky9/peVXmn41h19x/noqxHfrd7fztVvt3Xh36/c3Xv/G8994+Ztef6fzd2fhdx78QdsffP5Dzh9y/pDzhxzfdeJ75OyRs0fOHn3toW8vfXvp20vfXvr20reXPt974n/S96ce/zSfP/XzJ2/+4tFfztdfvP3Lc/OXuf1llvt4to/3+3iwz9nwfSn+N7//5tvf5vS35/Zvc//bLPd79rw/4vvNfj/v/Q6N7+fxAbM6wPcDtBygxfeo+AH8B+QclHNQjndN/CCPDurtoN4O6u0gvQdpOETDIRoO0XAI7yE+HhJzCM8hPIfwHMbjHRU/zKPDPDqM57CYw3iO8Mh3tfgRHh3h0REeHeFRAY8KeFRAVwFdBfgK1DzKo6M8Osqjozw6yqOjPDrGI9/r4sd4dIxHx9Q+Rt8/9P1D3z/0/cOjf3hUyKNCHhXyqJBHhTwqpPM4ncf1e1y/x/XiN3f8OI9O8OgEj0541k44ayecH98P4yf1dNL5OcmbU2JO6e2UuqfUPa2u3+Xx0+qeVve0umfUPaPuGXXPqHtG3TPqnlX3rLpn1T2r7ll1z6pbhLNI3SJ1i9QtUrdI3XPO5zm1zvHrX33/6yz+K/6/kSERSoLPpP4hkZwTEin1YHtIRBaERGqHkEgL0B4Wh0Q0AtairmM9QiK9IqwNibj9+MGQSIwKiQxrGRsBR8Y+KAqJYiXAejHrxawX2wOFIXFBDMpALWgKuP3WTxS3XjwvJEo0APEXFoTERXJK0lpqUEhcov6lXUOidAaoe3lr2BISV+C4Qo0r1CzTGCaHRNnSgLfsGLBXVt0r1btSv1euBvflxPqtnyi3NSQy1cjsBDNgd0iUp7u8/PITQqJCFsjzPTNxFS+uagvWr6Kxor2K/QBnJf1W4k8l9SrTWFl+5XkhUYWWKupk8TRLzaxhIKaq+6q0V+VfVVxXZ0IuLAmJavaqmUk13NXUylY3G3d2PtBevQ7o39/hRA05NeXWUr+WmFpmc43ra2i+hmbfbRO1rdfmX22eXmve1+rzWtd1eFJHjTr2rpsSEterXVdOPdc38LG+2jdCA+s3bQuJhqdCohGfb6bvZvs3092Ed01wNHF2mvDuFrpvMc9bzPIW82tKW1M6m9q/NRvMspl135UTzcU1510Ov3L0kbMpJFrwtAW/WtDR0ployaOWNLR038p9K7205mEbPbaR25aWtnxta62tPu6wfgfv7+BDO+esndw78d/J5/Y+2+vtLp7cpae79X83DXfT1sFehx0hca8a9+rhXv505HNHnJ18djLLzvY64+ts737n5X6ePKD2A3rN5Wuu/h80F99/E11wdMH7kOfkIZ515Vc3c+xGRzfntzsdD9PZw1oP1z14+wifHqG7J86ezkgvnL143JvO3mbWh8Y+/Osj/1Ge99V7X3705afvJol+9D/Gh8educfVfoLeJ3z2129/Xj1J8wBrA+gdQNNTzvJT1gfKfRr30/Kfkf8Mvmc9h8+qOcjMBjl3g81hMA+GyB/ibA3R41BrQ+kd5nOY3Od8Psev4WYw3PoIWkfKH+n6ebN4Xu/P6/MFvP8TOwrXKPEvin+RptHO0mj3L8l5ie4x7seoOVafY2kc690yjkfjnIXxPBnvHTbe8zBBXxPomcjriWYySV+T8Lws/+WBITGZH5NpeIWeV3G/SsdrOF/D+Rovp+CZKnaq/al4pjkT08xyuvsZtM3gyQwzn8nrmd45s5zRWXTNxjEbx2zceWrkicujZ46ac62/bo7zxPkelnjTLBfQudDMF+l7ET8WOSuL1F4kfxFf3hL3lh7e4u9bzstiZ+1t5/Qd/r+D910evav3d8UuMVPf0RK+oyWWOCNLPU9L1VwqZqmelulzmT6W0bvcGVtOy3K1lrvPN+t8sfk8yse1wqxXeOZW6H2l65X6XKn+Kh6vomWVvFXqrlZjtXvf8RLv8es91++Z+/t6eV/O+3S+T+caHGt4sMb9Gr6t1ddasWvdr+PZOh6s09d61+udg/Vqref3Bj1twLPBe2Aj3zfya6NzsNHcP+D5B64/cDY/pONDnvn+mNjEg02elY/V+Nj+x87zJzz/RK1P+LBZ3mYxm/W6mbYt/N1i71P6fc9MfMq7z+R+RsNn9j+3/7n9rfa32t9q/wv7X9j/wv6X9r+0/5X9r+x/ZX+b/W32fUdNfO0MfMPfb8zlWzP4ls7t5rxdf9+J/8HZ+5E/P5rNT/TvpHkXb3/2vviZ7l/w/yrvV9e79f+b3N9c/+4d4XtjYo8+/NZL/CXnbzPbr57vZImD+A+Zy2Fn/4i5HeGr70mJI+KOmGsBz31PShQ40wXyCpyTAjPwnSlR4JkpkF9gVkfN5Cjvj/L4KJ5j9BbiP27/pLVTztFpWs/AWR4U6f0cjefU9h0j8d/ukBGGhYykjSEjeXvISNkaMiKrQ0Za25DhO0RGegMoChlxSBSEjGKDQkbxTiGjRL+QcWHJkHHRppBRsmnIKCXuEjGla4WMy+Rebv/yPNgWMq4IYP2KrjAZ1sK+kFGmNOQAzjILQP2yYsuKLZsLE4CusupemQntYSTkw56QUU5+OfnlBoL8cmplys+Unyk/U36m/Ezr5a2Xt17eevlRoMfyNFTAUaEx0FuB3qt2hYyKMagDYiuqV3EJbIHCkFGpDKhZSXwlPJXkVMJf6VTIqJwVMqp0AOtV8Fc5GDKyxGfxJ6s/iM3ib5Z+qlqvqm7VHkBnVTqvVutqvV2tt2q8raZONd5k01Q9A3hcvTfgqa5mjQjQWYOvNfhawyxq0l6zHuCtyZeatNTSYy37teYB/lrirqGhNk9qlwDX17q+1nUdPfuOkXEdzdfx+3o1r28NZl7Xel1npR4vbtBvff3W1299NerjrU/3jXTfKPdG/d5oJjfS3kDsTWIb6qeh+Ia0NZwC9hvx9GbnpYn4JvQ1wX2LnFt419TerXq8FWczGprRkMOnFtZb6bsVrtsqhow29tuc/7TWRu02dLfhSRucbXh6+wxwlm937trS2I5Hd9q7S7938/Ue9Ttkh4x71bhPTEd6O+mpM67OvLpf/gOQ6wzm8v1B/nfB8ZCeHqKlq/pdna2u8rvqravcrnrpKrer56sbb7vJfVgvPcyvp/ie5z/53svZ6i2+j5n10fujzkJfmvrK74fvMRof81w8Tu8T+upvlv3N4El9DHA9YEfIeIr3A+09LfZpHM+o9wztz+B9xjP5LE3P4hjEo0HOxCBncLDzNxj/YOdrMG8G4/FdIWMID4fwbojzMoTXQ8xhqDpDcQyVN0yfw5yRYWOAV8PsP2f/ObN4zkyfEzNc/eF4hssZzrfhPBuBewRNI2gfoecRfBmpz5H6fsm8x/JyrOdhLJ6xao+VM87+OLMZ534c/ePxjjen8WLG82m8XidYm6DWBLUmqDWB5sl8mMLj6c7rTL7MModZaswyq9k4Z/NhtnM9295sc5jtjMyW63tBxmxxs3mWx588vHk8ynPu5ji7c9Sdg3MOX+c4A3M843PonOM9MpeOuXyYy5+5+pgrdi5N8+iYz+P5epjP5/m0zFdjPt/e4Mkb+N6k900cC/AtwLfA9UJ8C/H53pGxiA7fPTLe4sVbON7i3WJ6FpvDYloW07JY7mK5i+W+LfdtuW/T8g4d7+Jf4uwtMbMl8pfQsISGJfxYyo+l/FjKj2WufQ/JWKaW7yIZy8QvE7/MTJc5b8uds+Vyl8tdLjdfb/m05ZtrPo/yndF8XubzMl9svth8sfliV5jXSjNeSet7el4z5v8AvI0j9HicjHwJnBTVtf69t6qreq/qfanurt6X6Znunl5mbegamIFhZBllEdBmEFmFyAyiuMQw7uIGJpGoWSCJGmNEdhn0JZIEib4EJQkueVnAfxCTp/M0CWoSmZ7/vbd7hsGX936PZmq5XVWn6txzzvedc281QKATALRcNR8wgAepvRCki/t4NjOc3cupflfcxyC8CfYypFlFmvfx3JTzxX2QtOdMAVMkYAp0In8lDB+trFbN/+cPOtnjAAAIHh49A9eDnwAdaN9zV3Kh4gEKp2MUjdJW0CilQp8G7tDs1iDNXfprbnYmxU8GNiSTw6A03JiR9gFOB5ylXKZxUSRrt1m5UDBayDfhe1M6UqmOjp/QZSqt4FsHEjjG/JHdAnwgCf9IJTU9zT6dGGKHEq+yrya4nK7gQwvdC32r3at9N4Eb3fe67/U9Ch51fV96OnlYOpx8RXolKap5foiJKRqtxqrVakxmM90TRKsgiIhh6B6AVvxgDrud7rmcVpfLad5lGmJ6D4ibyAY6dlDcJPC71KRJs4ls4CbNJi2zC5EmuIls4Ca4Cdh3OUiTcxPZQMeUkHOTCwCrBwCVrNXq8V3IKkHQY/kyluPBf7Kqw4juAnFmEgjiPyuIMDGgZ+YDK/6TyS159F2Rn3t+LsfJDWrTqowKqe6V7w2SXbNgheutu60vWT+0slZX/bzFzuRs8Vx5YNbwuXPlYfHs2bMgPXz+PNl6F5pb08CEF9D0v26JZ4aHwZkzw//Lxj3GVPJW8SheOf/VujEDBmB5QFL0gOG1gtnuUnv0kSH+LwfW6T0eGW/sXecBznRSPJo0O1qxRcBmB49tgnfwMWIXMT7WjI2jOdbsmAxzWTsf5GxWey7bVMinIOPe2rZt1aptbVvvvnfh9+Jfbtm2cuW2li/nd87oeuz013598pFH3lz2LPPZQ60P3vnI47c/3Lx11aS6rc0PX//kN7/0YOtDDa157xvbv3Lyza9csWcJsenRD1XPs2ZOi32lmVjaYYCY2AEA3Cr4b/B+wEIEXQDb8ruzxU9AehYx5b0IDvF/27sOkWcgdx8oBFjzZ79nQ6rn51E/+QAtgD9i4thPIuSazzNfUDRQAw4zswGHewSmy/Q6eMeZJh4BJ3rE/PpJk5PJyZOY+KT65OTJyfpJAIyOAhFb0R5uuTmq/zsAJt7wLLwXSiCo2FAmpIR6Q3tCLAgFBVFBQgiGhtCzoFQuwGS5gM+dMTrMbGFPmaMGJz6XMzy7YTtwKwakdEDQofh8CoIdh5nLQQL7W3KgMEHeqXF5u+D98GEQxmeV/H1+NOjf7Ud+39Bo+EB3EsGGw1ggPb1cO5/KVM0el7mrH4A6xYx2d8O+7q3dH3YzL3W/3o26fUPQSC9xyWG0q3aJsWuIlbmqPaq14/ewj3kB61f3PALFot2mwCQ+jMqqzGW2MLtrsvBx8Le14xYvjkQuHNcz+o5K4H34ev+kxz0Db4AHgUcR4NLI7ggCkajHo0CYvPAw1fuYNnqG6VGtwdd302d5ZgMAUcUJ/cHBIFKC/cFTwQ+DLAiGNBp8evzCg9Seg8rldo3LfQ7eCjeCuOKCchKOJmEmqSR7kwxIJq1WBQr4zAv9V94w8R5ax+/hOXwPdkULQTzOMFTqWAdWjw/h/ruJh1jmZ1TmfjgPPgq8h9Du8EthFLYPVc5TtYcuelgGdI6eUblVDwE3aAPdyEDsdy+Hps7DngHhB0oU7DS0WkFDKg2k9ijjUyJhvrm/BSotS1tQS5tuer1Pp3rNMQR7Fae4prFRNBi4+Y0aUcTLaLtM1u1Do2cOCALd+LtiIQe0t/fM6NSTrc5AoGcGCUTHk2SZTCaPHE9iKBkhOFL6fbl8vDSMg0bp98dLI+eIFx3G2j2iTA8n8jqgg1qXBCTodt2Htgpbxa3mLfLjsl7p2dmDSp5MJDO51D3Ho0SUyXO6F0T62tdIKyPr2ldOflx6vF1sj0vx4gujp0F09LTiiapTsVhHgy/VmWmJNXY0+1o62yZH2yV2ugKHsB7sRA8ZKyDPL0+H0+vbxp/bNyrCQfF18UORAeKoiMQ1mUxjmyS1txdj0WjjC3AVKKLJ+zp7A0OjR/bHU3myPji9EJg6Y+ph2AdoEE8mcRAfLooXPp8MlMtEC8XhDVgTRfz0JqwI8ePh8/BjUF01ZqbepLg7psmhKZGOUKcfTJPxYmpQ8cMu/3Q/wAYGsUZvuw204H+gDAfKyUWSogUGK8iANl1YGeL/fGBdmPdNH1Kr9q3zEchO4k+plDtK4lShqRkH4Vg0FOSr4aq5KUdiF89BI6QN5lzWQcI0PiIWyZmsPhzAmx2qUMGUQuQsGshZx8qoW6c36sxuS2ySXNc29ZqF7RVl6mDP9tN//+lNcwS/0500QFODELBLDbrKRymueHV6YdcVe9ZdwdybnlSIFmRB4LWTGrKe6MC8G65Szh+cNumzl1+G02d9/5vdbjHU/9nvvz3dYwoNvArf7uxvnbP6lX9/C8cAzC2IX9yomglcIA4+o9yi93rrJsd93vsCbETNyRIIBHWyZAqE3GpPOBjVhGJALaoVNaNWA1MwbjabkCfucgG1Zm4iFkvUyUW7u78O1oXdQR3nSlx1Ne2/4qyR4myx/MmsYWLGGDtKRXGY/JHdcnGkaGrFW8lktcu8AYvTGglY5AXQ68QLvy24APocngXjPQbL0r64Rj3EDz+/LqLRAFN4SA32rTMFcQteiUPM/zuwzoSAe4iv7FsHPEP8+3gFcTNeqUk3JpPkD0vPJbO4L3MF3DFNBVOokDPhHk3CQsDPmm0iCMRwDwGTiNGENwVsgVBuQcT20596YrNyKA7bYepo5eHKpt9sXvAezFZe+3DxdXBLZVOkxX8dfL4Hrtvsr49srbz868o7lf7lHjgNOqALdnoruh4ck+oAYA9QDDtfwzAvxrA6RYJKM/mfaV7a3N882MyC5qZwPY6EzbB5QiQcIFg2E8fBuRTLPONYhuMgAgG/0YqBLPC5OFiV+Z/jMndBD/wG8Ctm6O+AOzv2dCDQ0UGEYQj8PIZRWRTDqrJ23QSqsnxxKis5Huknyto1Lus5LGsj8Ckm2DtpzyQEJjWHG/BTtcG2i/G5Kqd1XE4ttiMQC1A54c8/U2Uue0A1c1zOPvQLbNtGHKFHTx7I5wmIJel1MS7OZfbUrktwcVkNF0Mhne4CLtL7plhxvoYVLooVUGnqb0JNYGj0KMYKCAsTsWL8vteMX38/+DK+YAhzEuA/5UeKv9//kZ/xG+8gQCNfDIvk/G6Mi89QPK7U8PhZjMdZJQh3tEO5fUf7qXZGaO8jq83tu9tfb2dAe3NUxn3VPqGvNmwgzzqpMo35Lb0XX/Va4AdYSErxMeISCJaIS/xLmI+WwG1Ldi7Zs4QBS5ZwnMLApRNJB70OvSfah5VaH+7EfUjQXpncOxmByeLkzGQGTG7R+nBXtsP2CQZ64T5ax+/jOXofuDcZcHW5NI3KHO9NIq+SUT1DOU5V3kmkpn2Emdn0YPBCH1Wv+2btuoLhJNPEckcA4XGMsgaCNWvoA635PI8j8e6bVMejNR1vxTqmzGFmdxfCupw5rktyPwZMAv5GjjfIY3qscaRT7R+2I9De3qDFJ026iDbU4uo3cVwtgalwC42rz5/oOt2F+rt2diFT17c8SlMv2TcasIRSYzZbyqTTHYIoKkrHk4MlqJR6S8hfypQQKImlpSWmVGrxi5dLfCDokyVnIJiSpXgg2HG51BoIKpdLXCBkkiVHIBSQpVgglL5cagmEpk4JycAv+v3Y6vwOjue41tYWFI/FnE6H2igIjZlMaqrsAwqmJaagovjgKR/c6TvhO+1j/L6Mr9/H+IYQDg5dU/yljo5AMJvuTS1NodS3OsVPNhRJ2M4VizjFwsaCd0S8KxbxIl3MposkxONPdTkW5pO1f3QfnzYyEdJrn8YMLCdhuSztFzsaM0P8Xw+tM5QaG1um+DEcK9p1U6bEVZp2pqUZR3O8y7UgmyvCxBN4d/86Z5xE91zSkaULwplIjMdBnkR5mEIksttCQSPkc7YQAeR2aAvg4D8ZFnCuf/E+BoOJJ6gCpgDrZqw9mQzqzDTOsLKHD0vd6czIv2XyPdaR+6QZqcaRFzP5SyyHDzO2GY0Z1NWY6bEy6PqR+9AN7Jdm5+KRSF3q0svOH72mGIlEGkp98JuVq8e2meJl40dUvo3zJmJ75zD3bEJXXOCdijFnJrQxT5cpMAS9yvIkwxR41sdHcrvzMK9oTPj7AvDU87w5gneNeDehR+QEvZZQTT0ll3onbXJypMlJm5zOlmbAyrRdpofKtF1OJYZGPzpAmvHGXylfxRvnD5EvE4mW5jF2+nuyOFLbw1Q1KR5PgnSakNVk+ThuJzifxpaAezmZlJRCi1JX0LcsNZSbhJAQHmzZ1sLuaTnScqKFSWpgL6bR/aRJaYGSOh+r68j5yBNihqjU6/T5vCKY8vnOJsCwPtmZ8JljwUTCF+kJ6hM+U09ITvjCsVBDClIt5esR1lMT1pOp0ESVEwmHMX/RQoTkhvr6hMsZ1m3Twz16KOj79Tv0r+tZ/RD6oRJNNMnhVLKuTk70JpYm+hPsYGJbAu1JQJAQE0cSJxJsYmnzU4cZnqTGn1BvMOVy2LZHqo5BPMLUesElMPMx1RRBnKhI3YIxYt8pFjF3TSbLhL5iJiS6JbVWUrs8UKN1azweiCOMWMT8B2tvYANmrOWBJKas+5iGeuwnim4daGjgCyCi5T1Dai12Dp4XoiGRNVso8zFrCfPBroEp7DjzgZjUmEhhwQdtJqt9gvnnCbGlnBU3ZTE5ihGHqHFZOAsGK39Ye9fUudfWtRRtlUm2yVlRuWztF12Ryytti3Lw8cdQRLanBGhOsV+6rHJ0U3f5sacq/zbQFg6Hm3th557r7qh41tuj4XDXSmaS/7K+FOapNEbbcQDdzpHYDmjMxYgB76vG6ECD2oXDbePEGD36B3z8EoL/hu9Dwhd+8AqgqHnCif+fdn7kZBRnr/OIkwFOvzNDVmE9rOaIi8fQbozjOPC1HiGcrCb7WSxbAk5FDzEBJLIvKifQc0bfwOdUOVhV/rM/2k6QFm5zQ8UNj7hPuz9yMxm34u51M8DtorLd48BEkZbKzuHr3Ei4WU32rtFRzM3oczdUn7vhoufGCInaKB+ryt31MwCCihWKDrjU0e847WCAI0ClhS88ae05c5W56Eaqs6qsfeDBGs5GIkTUGM4W8XG86iF8nJ9ysX0zxxiTwUCPItfCHOFJ1Uxx7FoQfRVvKLAasCTMZzPK9IKc6cvsyJzKsL2Z/sxgZk9mNKPKqIfgccXQnQT+LkWN1J1/6cbGX0iWNyQLi2rypzE/U20Vq/J5QwC14Gt/ZS9CUy9duEf14KKaFMXDoIyVxKeMSIJTBgKngUa0jHP2LBJ30slCAQelQgHnyLNx/AiKhczs3tlLZ/fP3jb79GyOQb1T4IkpEEwZnLJnykdT2CnOIVRUnJjpgV4nvhyYjZY6+53bnIxz1pvkPnG/FapLDFiLatxx9B3GRPkCrPGFbZgvhBUbBGG4NAyVcG8YgXDEQ0ojdRdYQ5UEotGrK9NQQbUGcMAPl1De4DjGQt4CbwWb0WbmPZY9yhxj32KZIImByebCtuDTmp1Bxh/sDQ4GGTG4LXgiyKiD+3BARQyjUnHs6wLGkje4IbRLSbKsgHD3bOOgyB3h0EccVLhebim3k2M5Oebq8PnkTt6u9vO8aQgaFaOO522v6YQdRuhXO41DcJUSDgQdDjfPqylGqFmibLWaaFoddjpdftLqGhr9WHGTtm0uKLjgUtdO10cuxrUvEPxlYN93ncnk7E/KpBqOIySOfDgz7FrReXYWzQbLpLBBckMc/ox2h0Zr1zo90KGxeYiecK5eze1hmvjNSLk1DUrny8PjzCG5YYCSBzBQlhQNi4DC8bzONsR/tG+dTqD5e9p9vJWUWS05SyjCh1SmsVojztVpWbUa+GKRl4Z+JFc+fNcHv3jk6Xl9DZFUZyHQmHQ2SnEjtKrWVA6+8cb68yvf+a9JcV9ze2b599ED31kshKsxLIh57NvUv1CVx8Inav7Vu0DQXvAvUyXD6ql/BavHgd/VjuvsCXhrx+H+M+GcRM98FaTgSWoVk7T9mlMapOHVdptbsNvUvEZrRAYdDlaeaMTiJt1gyZAusPg1Gm5+vwVaLB496S1PODI0epZieWQMy/HGfykecjjOpvHhcgSmI3NIDVCMbI5sjbCRNO2wZHI4mUuXCa4XCVw5MIThT7kIam6ol4yQCdTZAlp1HVfC7I9UZRozkvLMHcY7JTQNdkl3QuYteA5+bPybxEaEr6HtRsbpTriVzCbmbqOK1bMGjZvh9JzBgEM15q8gCerZ94znjKhoX5q5wfB7J1tvb+eL6qKNFTMNfIO63sZGE766WAgkfMlYMJLwBWJBT8Lnj4UEozEsua2S5IYQSR7J7RYkiBXF83atT8P71Baf1e6z2mx+f0CrUauTSXLbF4jrsEg/5CkYtYhlkmq/8VbxqJMog1BV8m9gYACQ5SJJ0UGjxATqeS1TRxipol+HFRHQ2uUgYzNTFLaNoXCVoVZL/rZmjLj5GKaaRihAS42GkuoSxKA8BsDYMPERQQ7OebfTNR0+1Lteee/9TX2KqzK1I155L7mmkrq60HIl/NWyJvTzX5yYLIspNhqFqfaTlbe2z4xEYNyeg6sqJ1Z0RiJTlsHRte3RqELtMIHt6xCvwnbIUDu8CvwEfg3YMPbAsB10x+CEyijNv3CwEujxoerxo8fx8S6Mk2kXdBkWk/zYcRjtnpgfJ7CtH6I+wdR8YnXN1htyGjgxt8sggfpEiGLOyQ+qRwXj+tpRqHq/qrUYr1vAT6lHFKPu6e5N7v42FqdAEk6QmqXEpGCQpEmhlmZnQW3WO98rwGfBe/qimUnEUSGE2RWAUGDjthcQAwT004Mp57Oude4hdFTRpdLBQCDoar2qXKtgiSPFc+eGSe2VGAapPGL7HsEtZ3DYIghTMwhSQdSbGZdLqovHaCEqjqT8EH9u3zrJQy1AqlagSkmSn4zVEmn/XyglViuJnMXBBGqlqVpZyhY1EqLmICaCaRqTWzWgUXO6iNna2HZJ05RVW18JbPzsLKlS0RrVynWX+0V99o6rv/Gl1cyc+sDWXqteY9G25RqnXbdk1d6Rj/nKtkiLfyOzltSqIrBOuen8s3NlmzV1PdFzEecgKVr/zsDChCxETNH8I00hV2M10CqwsVoNT6UzIFir/oZhWlzjoWVvj44c66HZhidmJzsxF9mJ4XBEE4lYLNtYSx1IHvHJmZFhkK7VtnF7LWWI92b7s3fa73QeyapiCV+wh7h6IBZKx+IdKV+6E1NmFRi7JRu9pdRuSbKCYEAL8O3U7swkrpE84VgsHYcfxmF8X+O+8WpzeYD2Nunpc6SjSaFSrN4DGRpsrWFQtbuxz2tIxVgC/mCIdm+QOnj2/1AlHifXlG7XqDVKroxIeloONsUny8nWzmsWFiunXfnplVIp5TbKTnfcBE3/uvILf/dZx4IWbzjsLs5nlK9PJ8Xfcf++4HuAx3ikAq79mIR4h0Z/e5B4eAwNoSv2dscm+vhB1UNizccBDz7FDiopRghluLo7tjQEIfRw4yeVk9R/R98d/U/VMzQ2qKqxAV6LY4N0EPbhC+NeOU2rZ3UXl0ywPD22tU9V1+LzIrUYtA1/EVYMcE4z7Gte37y5mWlGQ6Nfouc3TahVVXn4u7R2NHNc7kk4VIsv+TYruhBf9JUM8ykdH4t8DnOVaV77+HG154Dj19sPt8NHQVwRYboOrq+D/XVb616qY+rQ0MhCekuJCXyuNlZWfaY147L2A8KNgxgm/E1KE+ptgk1oqNI/Vk+88ET4XNxT7GuqtWLMcN/oFHp2BJCy/Yoa592LM5HRDxQdcZ2QmngS3j+jUDcLARiCvXMo8SW0N1mQFEd/L4RiJ6YW/k4kdvZ27uwc7WQ7xSF4q6LBHByKc5juWJXYlhdVeUcUc3sFx9kcOEej7Oar4dW+6yGzAMyHC3zMva79LJrG3qRGebZJ1aJmwmxURapfYRBhOAMIgCBTL0vRQFCWpUgg1CBL2UAI+KQIEKEo2p7UanJZJN3AMNGI2lxMG0qGrQbGYJAfdEJnkbu6gHMizEmDDb31S+tR/bfypO5UKxp9MjyAk+oyGQMq0VCcTZcnhGH6D6OydFAUo1lGGuJHDqxjmGwjDclZRotJ4d8OrtNqQtEYdduouuq2ZISHFqiI85LEGJis6AJFJEM4TSYRhYIc/7l6UZ4GaPj03J8+/g7kV304cMUXm+suiwpR6fKZ33hmxYFV1p48qRClu6WOSzPwdnbq7U9Vvld57eeVx1/bNDPZsaXF/We4EvbCwp17Rzx9pYZIJFK8htl416wo6Qs9zoXWMrtxJJ5F+uLgnuyJLNINjf5JKRpN+f7sdoSEbDo7J8skYqGOuC/RmRQ1fkwSNQZFo88bDIxQb09565K8tT7Fe7xajjOJGXFo9FMlRGxIDANRwLYD7JS6A7gHwB3gdQz0oB9DASmF2IPJ+nq73UFpv4MnxznCIZyLfHqAnIk3/qo4SOuOIJSDpSDaTMaEQVAMIpKwHLTa88GljReyN/ETWrHGOcAIyQbIZ6RMmeYw2c2ma51L+rWUSxPuWY29Y7mlPpjweXuCjoTPEwslk4tozyfL0v46PmUdUusPrkvxbq+P9rlXyxhoIsBUEwHa12QGzr9OAC4UQy6kBDkbPsjErP3RMwvK6VCqs8mfreuYefPG+nm2Sru1K+ts9EQFaE1++ysf2N75r8kxf4EmBk98qf/2indFVyQybTmct3cBzhJ+8pPK92r19RtpvYGrjQE9RCi8IqB+GQLZp2EUJMhQnjBCQuNK1+gZ5jCtOURrdYofjG6n54FAf4AM/+jZi4Z/audV5f3nuLxdWN436OyHj0g5C8MEPmtCHCuMyaJ1hqqsXeBrgMxecCN8CEj6k4NJ5nQSHiE7SXqB5MRxhPLYOMKNFBOqcvfCFzEmOBUdg0K25d1JxKDgheLGhGekeFCVuxe8huXWk1RfkGWZ6GWzvFt+Sf5QZmUA6EX8E4ZVNhQu1PxXU9maGq6cI3ikGFG6pdSCWrIeMiDT/N/wyIDx7xCVn6A89Cp8ulcR4NZ6OKce1sMbSdC+8KgDY+eFMA6tpjikuSj3Q6BjunoCzzVgnnuI4lD1+idfq6JQoV02jdVWqvcOx6+1H6oxBtF5JxgOX2pm0s2wGSO4m85eaBp/hoFaf1efYc24jP24oYbE8aHRljEk3jWRpw+OvsOqqL60NX29jPWVUNwwXewrolJxfRHtKO4unioyxcY2coX2i4EPX2P56Bn0BtVdXVV3U+lIGCwV5hT6CusL7OYCLNT1kpPzFwH5uHzfuPxnwLtjYzSl9hRWDSxdNEZTlbVmXNYzbXQcCPpbIGjJxwR8QsuFXqrqZXLlZnYP7SMdlbEH/LPGAQoRu+ZCH1krN6Mi+2N8XJJee08tF/H5VKqxPpqMcXoP7SNdrY+CuI/qFDPsC64PopeCsD+4I7g7yAQdQ6PTqcr9F1d+ELCM/oVZRHl2Ezw1gWe7sno6WYQuMxO2m3Dcpzl8YWwjT5DAXOXjiGFVHK92OTUG+ALE9wxNis1KyHl/FEbrmjyZNWk4Iw3T8hDEQdTDherrdKrXBh2QcmOz6G/y+A0kyPs5Es79qaHRd6kUvPExLRmkxsr/qdR4+R+z9hPHxd+PlOn0lJET5fIR8bh4tFwaEUeGTY7WGofH/wBh8hGN2+VGuXyBkTw5A2z0ZMh2U/pf33+A3r8vk/FKOz1ctEBuGYK06PXdKo/f+vNzxM0iEmOY+++P3u8Xh9CPFWvTLyTJ45FlfzjVmFmRTqeWNv+gSvbFT4qY4os1RjF8FpMKsYxvnzQS6j9ypnQG840L9w9JJQBUE75qaYNmADqaAXiUTCOZ0ffBgXUeri40pNbsW1dXmzTS2uoWj/8fMgI6KkVQqDlH5pCk6DDUZNjc1IwW4LxApxe0Zmk8L2iv3PHmm7l4YLIpFhrsTC2se7j5ugZH4n/IDYTKr6eNPLdociK+7Opc39VodcC+pju6gnCLdmzDu1QzQQA2Up43fa1rrRstdq/1rvUxi12LvYt9zNccTzlQOlQKzQkxgixpA0FWljSBkM/rckMAzJaQiBgTI2LSYQt5JKTVqEND6IgisRD9iTWb/iR4kx7FYSyZBY/s6fXs9rCeIRQ/FGCDVkFKuklF00i+Bm7R3efe6WbdL6I4zsuPYALxybny1IWHgXv0yD5dgRy6TyfkMeAnz4i4g8iXisaj6Ar4b6yd9qF4liZwI0U62kL4BVlC8VXx1RpPxByxLB3yud1aiTGbhvi/HFoHzGZtQMIE8dzBdRLitTpKELVjBDFbHTwhRp8bG0GZSBYChYCJjhiGLAFLCJNCdAKuqHy9c2Z65MeZecXKE/DK7161bCoXFdm5QtR89iX010srPZunRyKXbYTPX4pU0f65cHLlJ3+ucnBx9C+ohf0x8MHXJ0SGsJPGAQddMuYngcVi8PVroMbgkuxrbHCGDdp82Luflzi+3qBz4SRb8dDqrARYWrxlac7A0gE+1iqSWiBpxhvnqIfjjX9SDxdFv3zRAN+J48mLHXx8UI/6daFP6vOgl+wvOVDJD3f4oc7Z7USSDzCs1SRiU7FaLYhhTCbzk/imHT73Tslr972IiY8EvDgeJTweiZuj7dMibYHcu8frhQixFvMK0fG6/ZT9QztjX2Fz/cKtISl+nV8Ltam0f48f+d2S5POxYVsvmXMG94hHxBNk2pkonhYZcalcG5yruXv5kzIp7p0rEzshY3S0rDNyplzN9/HuGTN2+fTEQWpGJRZp5bNIh+Cw9WxYJB10SQpjMZMhOM060g92h+SjYUDiDDwNA4bxMFC1HRwMiOVgb6dTwKrOHq3OPwoVmiw5EgjgtDffVKRZoVh4cOrsZQ8//PDzV8lvvommX/aPlY2XXrV83RYoXAZ5/0zIY8eu4pVu9LRqL/cfGIv01bEzuBc+VMXOTNFMBh0yF2EngzlWheJgPayOtZH5GQQ9lRgEsZyZDB/FLgwfkXP0WMY+yln1sMpZfzg2RpZtJDKELMxePEZWlUP5alXOs+Dp0e1VlCa8M07lJCaw1XE5/zkup8pV6bOkW+mzFP/Fs8wel7FrbK4JTmMzVEDuwgylMV3x9nFd7cZQczfJ7xGcU4DrMUGJEFIJC2RiolafL9BnwuyUDqNVnwthmSOqbURm9RrgESzTgXWBUL3X1x0j63GpE/qI8it9jQv/EvMrH5G7NfN6BmUihBch1DiBkRbGZV07LmsveGZcVsybpbLin5dVmavaS/tXX5sb9YWxmki+NoJXfY7KXGaE+er4tfehUu24KVPgBM4qjb7D30q5mbHKzdCGMW6mFPUc1rFy8fyZ0TOqA5Sbpcbm24zZVw6CXDoRuqhbaL9bMOf9PpUhfn6OTqHRySsTZ15RO8F58TkqI1Pjiz8c6/fWQj0ZN229qN/dGOuq9SlTrT4VGKt123RPk0qY9aJaN2bOzDqq98Yqlx2o5gGCixa7VdsJo3P+9/lcVA6ZO1WT8xzM0LlTRpi2vWRDfTa4Gcdo7RgNd04g71QPVbmtNblk7hSph5Hz+8iw2g4XwmuXMATr6fmei1IfjBt2fH676gHgBYcppten5RLOmkyyCZlMtogOIqhdauw3IqPR5Va7aU7vpkN57jA/NkTEj01PxhunD5AveYLTlra2fC8P+/ltPAK8yO/kGZ4MyVWHiEjujlN1UKvKjCfr/AEfujvoPuCDd48l69JeMjr3wcF1OuBFDMVZVKufkrcJIuMJeK0gHgoS3kRL4PYcEip8orP0x6+v2F7w5tqVnqYuoTg1HA7PHkR/+O0761vlwoIlnQ8/NuL54mV0vuvoZzSnfAjrpA78p5JcjaBGBdWahCuRSDB6jf8xPzI+5Xneg1o8kPFYPEhgrNqIwjsc5Kkn6Yx5wSE70g5GzTgcbtGkmOIGU77eBBlTpwU4w8FFbh5EoImLxCKswjltzjwXVxvzHKuz4ys8jy9gt0d8Q0xWMYJ6jSnGWZ2RsKLlOPKtWp8/wUEuXU5C8YjbOWvkyBHx3DHxD8MEfOm8piRwO8VZw9m+JeXScDZberevTJuOm1rTuC0JxBP0PKxavFsuL6GfMrQSphkj8BKN1UoZZDaridY8+CoXNREgamIO377l+I5nH3gA8ULaU2eElgYYrfzHXY8/vWz+rrbpg1etX7Xh1q4mOPzLR3duZE5eNsWZE0P9lY8uq/z74a9s/vOWVbeuHfndigf7ib4ZslA9gXllErSALvDLw7gLPlISRlN+BXs9i572Dnlf8TKq8F3hR8JYpUtj/bETsdMxVmiX25Fe1TmEj26zOfIptV7Ir07dmEKauCuOxHghpEyaxDv9g2Im5EdTQmrJIPPqnBJU1AHBAE2MwQCkOOkzq8ub3xC/PY7i9TN7o0uj/VEm2jrENBwqYReZbg5K6WHxDwPDJ8vDWax2TGScRJGzzrpHjoDSmWHMco64xV/gDnAPty4pN2bKySRVLVVvkigWq3Z8jCYUxHg+9vYKpvUBrF4HofZ4CcfV7G9uskzUueqJrimrB86MDOYWhB2PTRcnJ9PFtuaZ6AvfXX7vpVd8/OC0qyof3bL6seW9PdeB0Vmx+KGrtg42bhz42opN8Lp1Vy6MJyNNweuYdbuaNBkh2d7ddEljgzNw6ZV3nprjm3Il/OvDszrsI58aBztGXv63OXWakZOSMhPHlzCOT/MwNnDoL3TO4nbqGzOBDX/zlHLZmqpvqPXw73qoCblCiRD2EOdjTmRUWW3WgpVRWWyWguVJy0GLSmA0QoRHos+9yMwDGTuAHPi8A2hfxJmcBtiZ7CEQFeUwp3ze6IltjxzB9n4SJ5D/3diHj9bMmtr0wAS7JjSbDI9dZM/cuEV/5/4f7HgWvW4M+2cXn3y5ZsrTbisU4pNXbfhSJzbmc48MbmTPVd7+cjIwcu7wlwf/fN+qL0rWIrHk9UQ3NV1h3QSwbub7W7A9Ck4Z64Kz2q3oKQhZaIVITDohCIgBf4CxseIMt9sgxzlJ0cgqtTZjc+cFraxNaxmJ0er1GYuUn6Pv0yNOD9V6A7Jjo1RsmPD7gYIlAo3gDWp0XEDzLZz9fHJEHDmCOWp5gGhmCQ60wJSjDu8szTrjHiYRYrgxQ5QDq35PTRMbJilMxwrY3XPUFCf4ehM77xu3vTHyk81dR+HScNOvFv9gwYx3+pfubEgtbLz3BXjLK8sujbAzb0c7Xwr9euSborxm4W2PzpqiHnnB+By1F1CLpSbgBz9W1qxFUIftRSdLclJm9Drr163IiESzmBUZJJiFrPAdYZ+gElieaoKX+TSPNcFrNFQTmj4N4jRQzWi0QO+2LzLyQMJmJHk/b0ZmEjw1IKiXwor6v8VNp3jMXbWhf2VBRGXjqptgTBNMierqfzGj7dDY8D9ZEHMbUdXq/2Y/sPrOk2otCIFvKtGIDF/2wBuCdweRy7HGgZyW1RYERHi9eJeIPCLEqKSXDENQpbQLkuI3ZoyKkRGMUMMYvaLamvcKPtmHfLYiiGgfN8U5vxEaXzBwGp/shWkv9A66trmQa4hJ7/UzOKEZOFYeyJZODJfF4Q8gVky6nMN6IlGu7J41/DE2GzKFgY6WDNTiGQVZPsTkzAG/pakg1hQRw7sOu0pYcMUTO3/41YeSpsn2kCxfD3th/MbJH2x69PFrL18tvwzXwUsP34dePPbUnqVLuu1L4PHKLVB+5DTcvLV7ZvFhKyz/84WaTrhLuS+BHNitTC95oeAsOec4+5ysU5VW476+MXJvBN3k3+JHdttKG3KYVpmQ1thjRDcb7zO+YGQsRSEoB5GGCYIgmzJI+oIiEcBwYhVJnoJHlKBf2intkRhpq2OHAzmwRhSzT5OJaxBT/7gQTxug4YU4VtGZ8vAHpZPDNVVB8bUsjUV/mDV8/M1hoiiiI6Ih7G/UxayhYCHfVMDh3gVDKOBnOJvooFbS7MC7MRr8m2sDCgWRrLlL1/aJuY3y9ZU9ld/cWBre9LVH+xeukl+ufLWy+/B9ly9+cscPv7xtsTX6zsymourUxiuFjKa+cq6yHt5Veedrf6jcvq171qSt1sp3//nC+WPf27O03N3QAafHG7Aep42eYe9ifwKy4C+HgW30tJIxivmUqBPzn9gg74VPe6E66AyiR4NPB9EnQaiJuqKJ6J+j/4iqtlvgbgu0DEG94t8Thn1hGAZBwELAiqyfPc1+xKrUDNtg8OkVPXE0rz+vz1e13Ey1nPcAqV9C27CeT0sfSazkaPTr0hEFaMjQU79mULNNw2kEJKM0wgCP+OTQ6NuKxmTNJ4WIIc6D0tHhoySIYbWeJOZYGrmoC16rggLuB+K52HTLw+WBmsEOECi+0BMmWyhafadqrCdqllyrr+E28jqWnb2LdMQ18uLf3tzRPG3etqvmNOe9/r612w99YemGm462PKoKqBxHcC+woVov/OOf/3XtlXc8fuODU9M3Gr+5auM37nvp1fu+0tgAHfGGWo2ezKXkDC9W4yIAXDPGihDIgC8ra+3BBUHUG1gaQDb/fP8KP2ND89EKxKjStjRSpQvprvT16bvSKtItSBNtjc6I3hTdElVdH7grgN7yw69J35MOSYwxHlLsgz7UEOIkHcYTLpAM9uqgTucKF0FWDG7FuUC6PFwli+Xhs1Xy4v6Fe+Qo1RdRGB0VhSLPJeD/SFj8FCWwxwfG2AnX/OyRysaR72ByYp9ATubAhh0/WLLgzP2PVCqLr9u84PxX70O7Kmd+eDLSHPgcGenq2fWt1yH/1B7vZ5s9B74H6Dv57EasIxkzw6OKlswz80cYAxsn5jFZJ+TPxeFb8ffi6B8R2OSd5l3gZVqdM5yLnMzd3HYO3cc+zqIW1I0WIuZTnMbMCIUsdXEomv1mZB5Cv1Zi+pBNkmQLkiWPDNUWU7bXDM1mlc4f9FgxQntgrwd6PDGCueKgaqfqiIoRVGnVehWjVqWxiw8TrD13tIa6w61EnUSjJIpWsZYEhIEBSgKxbSYgtTTs9O3QRINlyBKwcSSaklTFETFFL7zwt3HkJ2/c9o2HN133WdOZJ4pz/GEj8+Nud8EsdG2ufDHVsHNp/4v3NF667JWbD/pl5ArUPwzjEZYX6yMrz3/n9plsPZqmnjLr0bt3V9/h68T+r6K6TIFHlJ6VMXhI9zMdUutgV3J+ckWS+Z4RdhnnG1cYGS1/M38f/wzPqu1ixIHagj1BtFK4QUBBIRIx8LIPdKItfuhnGupVOC+DHxzotUN7giCuiSK0RmD8YRA7hY0tI54sn8EZCtbOSVrwz2bLJz4epuuB0vDxxswSam74L6IKFSa4omNcQaaqr2LlxCb4LquqfJS6ddv31y7bdNtPb5rz8pPF2VhF6HW/ySY1VI4bVjZmFnZdocx+6Ir5A3fcsfX23a9+/elZcEcg+WUYPy//VjKaCvDt7e2eOatfeeyGL1MdTatMYzYzu3HW1wReOwx02Mqu1lvzqxtubEDz6+Adia8kvptguIQ9gdStMmx3XuK8wskwGyE8oIZL4/1xtCcOC6yXcaQjMd7iiCh647zC8gISCnIBtWPw8spe1M5CgZVZTJDZgpfJuVw4Z1Z0alveJWgxemuTWJH7QYsi4lh6wCDkxRxp6AvBEFbi0THMOYrNKZukIw00ySDI7Czh2Hi8RAYhqOXBgb4BSoJrKYi9mmYEqkZYwx3MX6qfmtrHGQ1Wc5jZfPMNQ/61S40tlbevvXJzQyg1ecOS75d7Zny3/qrWhs13Htq9dsXBbMctmyal90EZaQ5tvlnyX9ZjbOvcE0gtDhW6Nq8udSTr+kKzb1q69vBDX71108tb1txz69K7PjiYrtat8Yol+QTB9+waeBPcApkFLHxSPiijfuugFVkD7tBm81bssgGDIYz+xD+Zk+qxt4KQGEIh4sZTpCejUlIOI7NNshpdcsaqWJFgla1pK2MNuvXB+ggInKr/sB7562F9IZwMPiuG/PjkdcyzJxDcjSAikPFJefhd8c1y+Rxh0eMboOrPdIld+mx55Ey5OnMkAZkc1mc7pDEyQI3VRFpygepe1bupKokJk0PZw5+9f328/7r8dWcXmNWVN78SNRojES4f2wjrKg+sirZ7TaaYwNoy80NuVhevT2fgvDfDYtK6CL50ibQcvr0xFUJOwVEKL4CJSNx7+/mtsxw49636eBLzx5swf/SCKHhXUZ7yw6c4qBchF7AHkGaeuFy8U2RCQk5Ac4WrheuEPwrsQm41hy5HqxBqkqfJqEkzTYNpONQx5hcsQ8wlimR/3K3B9I01xgU3dDOhOAZ+QcVqrJKFcE8yziRrfUWcjZA8ukFjyGuBGyCjgCMNqgMz4iAOS/64EkdykU40ETQyjhAzYsurL/2WNwzPwkmaeHYJTUdqyd3JkY9xsCCcqlSmkVT84Nww3sV6r+H6EjJ7m8JUwA9M+eYADQ4sVnmO4lHOb7HzgRrKq2764Y8rb1bertzOsMvFZTe99Z3KqCviCMbDQt3O2+G1b6587/zm9bedODn4BfSdyslXfwEfhzFr9P1v/OT/7YTHpgttld3ffu/UgV/+cj+12fmj7zBvYT2nIVDuC0chIwiygDQqnag35WN1MJaC9lRTinh6lG/iEeRNPNIzQA0lTAHVhrzNY9JoQvPFsD9M5vqz4bAJgXS6vs8NX8JadjsYj4mpRxqAqVbYxaWzaTLJBmLK4HBnFcLc97iYNJ02r2ZcLk5WAqG8TDrA7fbm+2TYLw/KSJYNhnhxJwczOIlGHEkLc2mMUxswIzLlKLffUCZ5EAavgQ3Vt6xB6Tj+EFjDjTnaNNzqSpP3rhszhNaOBRuKZ33lCKpFk+YJEYQMVZgw4w1WQ7VtPGY3NTNvfavyzqHbHvzBllt7Luu/5vFb+2fY2sRQqKXy4cC9u2Y9+tzqW2bMvm3N0Za/VD5aes2++4+54nOv/OL2pVckpCmVG2Buy8DPuv1TOi998o75iwYWAzj6hco0VsbxIwOGlAat2u7Ko7jZm/+e/ZAdAf2gfpue0Qf4kCIIW4UdAiMEgBXrzGptBCR06Aa5UEpSEnIa+Sjn1JryvrBDsKiHYFRJGQS9JBr8BuTHSYAB8LZgPJOEz8oA9oH1YCvYAUaBKoM7JiulA/H0maMkbAzgMDJyhGhuAFvyORxBfn90PAN3f2CmNbizZffIWRpIcGeQskQoYKJ8FCuuWqQQJ4TpqhWPz+5l5VDD8uzayhufLon59ZEI6g52fVq5dVK2MxN0em0Njf5JVp1BuibD/IUNPhG3jryfji2vFO6KmUduqTTapEIwZ9Ak6i+tf5g9vCowNUJsuruWZ00BP1c2NDg1Qn6yiNOrq12Qc9ldTa5prgUu1TInZJ1WZ97Z6ZznVH3NATmL3bLSwmjqjHCx8RojWixcI6B6nxyJhaVIpDldIllUO04/cRYlGHBYMbzQzEjxNM7M2UmGrK4hHPAGlWhDA7FdG05G/A2ZBtTQaSsKORkbIKPOYZ41LB4bIEn7UWysZ8WTJN8iI4tnKNsnORmxU6prGpkHxkwUJC/OwSbwB6pRE8W+UGEsSHOhalJmDvyLlGzydTfc/7d7Nikz7rl581fv5PQN/rnI4JrttZ4aqWz6xWMLfg6/c8e/Ss1ev6L8k2dG9jy+e+4ll8B7Z7lbHGI0mg9fW7nqxvM//HT/E/COsSSNxnBzpUv1HLbnGGiE6WoldD72aatotuU1wZuCiJWekNAZ6ZyEprkXuBHrhmfc59zobRMkCQGKyscw7fKJspdTcd46NlHHmuOmuBk3xM3xIOe1cpxXrmPrhtCryi2ibBVF2WV+zIweM8PrzHeY0UozvJG9l0VRFpq9MssCh5pzci0cI9ZxcVYNjKKRjAcMGlUaxmjE3zpTjfmEGvaqYb96UL1NzQhqqFarHRlaoco5yHnkSmp7Kq4VXBHA2KWoA4HSkWFHlpIVmBaPlU2thFEPbLhQXsXUZoDwm+rbE/eIs5L33Hr0HqdIVgL+B7NlU47iAWbYAwPYkQjmQkJxqjSyBCFhNrh/SZ9rIJ1PgXdhjBgB4T6q52aE83WVL34h8e7CVMy4sOKPidlrUd32FFwElfRm1gC/M7JVaTHOmaaKGQKZlee7/rRw9hutjd2J4O/YeYutkzWRiHFW9prz7zKm61LdNogi/3h327aQvGhhkGIFGdt6QPUQmAz2KrfYUAF1oTfQu+hjxLm4Vm4GN5bh2dKRNJNPd+LtjC0TyTCa6XmYCyuC+nX1h2rGwKjVzeZJilqXnxRrDgOlDjihs8ccjsWkHiCLsl8+Ip/GGZ9clCZxpjqhPsUXIqxOckquaKwzDkDp4+PYR0rD1SIpxMo+exaHIMx0Rs5c0Lmb/FwT4YwkcalVu6KTYNVRyHRH6jpkNnotHtWGCWp1DC/EPuMih/OFgOqBzst+/uqC6ay+MdB4zS2MJurtqrQVw/U+0W1LG6E5Nb9x3sIn85YjLzZLM2AHTH/vkkUr5j/z8wF5cdBxR8XTLaZsYjhscdzGTPqNyyCG+keWlSOT9inP/LHyGVTBfSslA4xQHjlaGT1D3kEENrDqICMGI3lI6g8+HM91+k7yzqFggVrGYkE626PAIYQVfYxlyZgtPpSuMXKwtExoyLOsw16byoCjzqyz7mHxBKkUEgXl0liRdIJShCNB5YIKqlwD8ZZde71idfp9g9rU1Gn92R8hYJJvOckDfDan29N8F7aLEHb2e7GfR0Cf0hIxhyAwiaaMSTH1mwZNnMnk0YSssscnSR6EBFnDayWNGvjUgTDOwkySNmAVhFiU3OSRT44cw3hz7sgxUKIxsLqk0H2EjvGEyK3VJp5M+PmS2psi1dCXQ/f+GiMGmXg8L+r81a8MWjlJ302fG3X9Gj1V6SE4EWmUb6G/WLIq4DY58a7/5spX8bNgS1e9jflQEX56GLSP/l0x4oiVLEDQLrYjUeUkPVGPYYPs+9sZwdkG69uKbSjZCte23tL6YutvW9nl3EYOHWZ+w6Dm1lYSm66JJqzR1rZoorWtLcjxOGzx+6O/jiLMt85EIRu1Rs9EmenRTVHE8lYeiSv5G/ineGYBD+/lH+XRK/zfecRHW7m2RDOfFgU/dDL+UMTNZNNSBhlQkRElBaptsqD2EfB5WSvke33bfDt9e3yszxdNPJV4M3E2wa7EG88nPkmw0cSCxA2JYwl2cQJqE3Bv4i8J9HACbkzcmUCdeHE0wbAJa+KriScSBxInE+cSvIFJ5BKoZMGJQsKSCCUYbXOilcly3AIOtXLcDZiTcVFuO3eWY+14A3k4+BsOvsrBOAedXDeHVnPwEPczfFgbX52z3Zfdmt2R5dTZrC1TVIr9xcEiW5xsCET5oBCYY4O29ABOts+KL1ejqam1lUTUgQ0b8JLG0yUEHJfQtgHSiG2kSk2yOTeNxvj/cWzlNOwOkIPxYkP5HpH+WJ0ax16W/lodrL7PtqRW6kwmYCFbfQ3tIkur8UESj7GX2HCUAGRSG7U7WvUQILQ7VG+P3PKF7ko9tr/UyI+I/XXPfWiW0tsZ780sji2DyaJ0JVbNZQuys+PffR2ee31vpJScDl+vXDJmlGjkkXW3yrHpMx75ciUSWQzNi+K+NsyL8r7uuu++VhFe0194P1L1ALbTO5XnAqLBlF8gwaEGuLwA1+L/eZhOHIavQtQKZ0AEuXyhkIknrPFCUzzRVCiEec7K41uWZTktM2p5MBRxwkKcv4Jfy6MreNjEw094eD0Pn+AhGSlGrsSaxE0JBttLIs9zTSqBmB6nx6YnYNMzal/koI67n3uR+zn3W05lfJD7JoeYOVwft55jBE7mkAA46OWauCJPflhB6Wjtzd+dgNOoIT6PTVEVT7Qk0NtY+Yk8w6c9JQ/yeCynsjCTXZrtzx7JsllQFIv+IqNhipPjPKnOKk4MIfoePiz0AIto2WnZYzliUW21QAvOgTEgkEFlp/gG7tVjZWJFZVPVEihEkFIDNok+YhfYbI5gtKBGQ47BucRAGVuVKZcrDbuPLynfo7rYanDOQbKKDRvABjItaoAYTdOY0TjGIEUcM5mx8QUcnJqrUyGJ0QjQQqsYOVZffZ0x45hVSQ04hf2LB9YsbMv7csXJl1wlGf48w6CeDh/a1v/++0uimbBrchjFHDm4svLLO116nFTl/JcxHBQ2tnU2tPgKC69cnvmPSvyNqRa9Ps36/eyq31Te2hRJG7XUbjA1Q2E6H2CBkvWIESgIbrXT1ekGnEZSa4EX91KPB4VdMUGEFlHTYwIGOOWE4bQBGQyyj4Ri7H5Hzh5dQmphZ4+WSaTGMELD94UQPQ6rtQBdw5UcCn8/J02rlJY5DU8/PQ4t38dROTHoEcLhFt98+FYPlKsIM7KM3rNr9K/M+6r7cfb9LfIbR39SnsO56QsMZPr0+PaNer1Bq9XwvJoTZXfQ4PO4g0avYPSKnN7gEzmR4zJBtzUYdPuMXmPG4LMaDD5erQ5rtFaNRisYdhh2G14ysBrO4FV7/HmvKFrytLp1qlblmuXwxrw/877l/dSr8u7RntAiRQsZRbtTe0TLIO0y7Qbt7VpWx3qNBrdBywc5DXJaCL2xiCbFCWk1YQ3e3Q1eAogBUQWpNVqkMWuQmvV5veTI9d7NXuQ19uPc7OngUPDtILM2eEsQaYKu4KIgo/YGG4LoUBDOdV/tRrzb4Uar3NDlTriRqOW5oNvLW+ISqLNIVrUmnXtzWHxjmNoxKdcSAoThszrHAhs9Mfa0+/dH+2i4dP/+yLEkqJXeBvrKA840DapJ/CXhCNjyZ1HTZ6tk9R6Vk7oCIa28+mj1g9PpMuwjAoihxxgYwmQVFiAdU6vRKUezjbc7LNVshXn/wOq2gG9B5c0fwmd1+srX4Lz2ZVu0YZRoWnlzh8rw0g9c6el+d+uifgH6K79aU9wC7xy5knm8ubHynSVwxnP7blh4w1ExdXjJU1edrPz0oeKXvkHsJDR6miM19svAh8oTWr9an9ea3Cak0YlQEpPi++JnIqvRQJyNaJnG5mBc0cUzilafP5WBmXh8pqUkdMld6S6mCwXBdDDTP3PPzBMzWbLRO7N/JjtzHnBDrTsQdAKLYkElP172WpZaBi0nLFy/ZZsFbcPxB1lWl2CcKTG6P+n+rkO69ohwGRDUSCOls53TVU6pK+NPNCmXqKwunDccdWRzORJ4crnfHxePZ3Ea4MiVYZqC3LER7GXiyfLAsaMjR8u0gnGUTNnI0coSqZo2ZiiwJWm9madTKmNjg0DU7QoTinakZnEhTbzQ2lxt/lwjt7HydvJqS8PqSUu/aFtf6O65f2qzwbESvmbps7JS9PK6L1yCNDFPER5fb1cF6ucUmubVNzo74PHlLoNGn/PEevt/erUYrVved5snun7xg8z0y+VCONwjXHb+8ECD0jSdefoSQ9qGfb7bRJoyirehiXn6DslAo8D5dx9NtglVPnxzZRp5zxEkyHwafvT0frMjT14D24+Tej15CeByvOH341aWh2f4czzS+eH7/s/8iBEC0KJS8/5AIMg7MeQ5nX6rN+9UcABxxrHfOdUBhgcxnxT3I15jMxssU/jLMNnyc3I8ECDcTQCBPg76OVJ4YrikmrTp5jgh+YkV5BTkdJoUo0ix5OwIeTGa/KDD8VwJZ4RZgiWYdxPXmZVUYacR2aPVyhN2loHq3DFY7Z4QRg7Sb9X3oEneEa11FByrlKieySwI28Pnbw9M2v/DTLBxvW9lkzOi4B7oZyZ5Ir1p+LYqlvdv+GwL2/nZdQ92370imLsKIvYfJYvPqomc5xnjrXJdhL5X10PeBwWNYOAwSIy+rUzXGPIJMi0VBkOdYd4Y1dfH+UYkQaMDhxQtxBALeoSGUw0fNjANOWCBaktPVAjbe0Kx9Z7Nnq0eBnhEDNgYds+cxaiArfZNDA9nKDaQRA2naSTTINA74e3uWhKWs13cVnvrDAMn/Zb5tNJuWWNlrYFFm27QSesr7dbZThPOuzwx+ubZl79etGddHZWe8CxhDtOwNtd7e8VbtreEw9nAQjjvHZeBvn327fZbz/900GscezdLtdbMMcdonaL6jpgJ5y95cP4wyIx+tE9dqCc05WZ1ISeqC3H8x9c76hckF+e+zz7NvWfgY2yCS2qZY9q3mPeYT4Psjdyd7L3cUwy7sn5NZm1+I8uuZVfqlsVWxlmPJywJQjSuZ1JxlUYXcUUWRZiIIpjzEdHpzVssLqUhm3cpoTBeuCS8EGx5F/kFaa0sZ4tkJBkhks5pjHm0vKmJvAvQVSArxVMq0Ndq64pqpasgqv1qJKhldZ+aUS8viJ+UNySHB8jPpyY3DOfSw8TeSCZIf3KENOTStRdHB0CZGqPdJAJSg8bMRZWthoamWArGos2TocMH6VQJewRbrKk2+m8SEXvox5VbK3+qvFu5+3dHoGb+b7LNAauWZWC91qLWTIs2xE2Wjrp+R+WG56/d8tC6A69cd+tp9ruvVH5dea2yAj4MW+HUX+yDU3iVTaOCPlNQDsT0xssLbZLJnL7n6cq/Vfbvu/eRb2M0KcK51bpS1+gZtof5FTCAHLxW0YScuIfUtMf+jjuOIxFhul7I65140R3blEbHDK+E344xtkAnf0PgZY69PrgxfHPspnrWbvfhsAyz2ZQ6EtWBSIpf1ri98fnGNxs/aVR9pxE2Do2+vT8az+P1R/sTdXktiTrhRHWdKZD13+lkUbzxFzpZVPsCkwX+0Qrd8Q+N/k4p0reKRDK3dIf/Qz8S/Gn/S35mqX8P3mP8SmsBkzSXIFiIFViIFViIFViIFViIFXi3uaDLVai9vUB/WoB14ptgnfgOWDJUaa1Tke/qWPJdf922up11TF3t12XJ+kBXoW5qHptBkr5oSn6PLpcuj1TtgVYHqj92Mlz9sbqBqoGQUnrNRLB90GiVhOP1b+KsqiYSpC7YBv0V7/FJCORVYoz7TfCdu9sDc+ZuPrWmGy716Swhq0Y9LVafMFmVwNSW9snLV29+/eZVm/99w4kviQYrc+1Dc754/IGH4dV/e3Dp9UazNhr0+2M648J8u9ugXrN5882Dk5Un7981+PcbvmW1IWIPPZUevohz9jgogNuVRSsbodtys+U/LMy/u+BqN9SlpNQVqbUpdlMW3pOFqqwtOz+7IsvGkRTiZWg0yIF6xsPk42ZNIqgYoWLsJVOE7TDAB0EgE4Kh5kxRtkM7mW1A4xotiNO67fCRk8dLZ7KE+FanFGF3ghf9gIWJ6GPCBBmWjijQ3BKaoqHxmTR8sVqvMDovWfd17eMvjU+SaYft1/zwuSypaJw/vevq2lyaRyo9JFtUGeeFJn2m5FB0bJpMLveP13EuiTTsnbGxiTTEZyo9KjIeHAQZ8I3DoGH0tFLE7qHSP6JHWvE+8T9EZosZbrFCjX2LHamZ/vrBeiQ0QBsXJDiQigg6rdsTjTh4dyisU3Qk+khGU17RfYRJjs4CeziMES/5Xved8jG+bB02y4NzLH2YDk3U2kBtdksOVDVHJpvWZqUR+jlAxmLG6nFk3GDifJZxxeWgacLYeZNqM00n5vT+O7WjDbe8NhMGWx7/UgNONEZu27b1lvb6Sb1fvWozBgjMK5jv9lfurQzfSkzo5/c/umDBZ9fgxINJwm1dmxbf+/0HDn4bjM1pYd+vzeP9lrLs7wl4TwIuZKAKRVABMSpkQ3ehJ9FBpFJr7PDR8NPhoTDzm9SfU+jK1LoUWtx8TTOyGR1ydJCNk3dAUaFgzMQd8SjSC5KRt8pGtT6QI7WOXiu0WoP1Q0zDAdDmCgbTY1NaCJKCEh25LQ1XJ7m4xePV3wUhQXsDyVwvlDY/X6/4FzNzsZdOnIXLvn/TwOFlt3tiM/MjL+YWRKwTJrtYD69ef9+Z+zrm53qvabuuu5N54+DysqdyPf3RlBZ548XzXSLx5+/92eyIZeQX1kVz6bzzf2CO8YLqAWxtU8GPlKWrp8AFk+GM3KLcmhyzMAs3pu9Mo7ZwT/jm8H3hx8Oqm7gtHGpNFhY18FEMjUE5mMZpDxMclEAxYxDz7epL1AiDXITVCWbJZOyXYa14oWVk2d5IoqABdNW1CT2asGLqsZPJ54oWpwDb/j9tbx4YVXX2j99zzr2zL3f2fd8zM5nJbMkkIXMDCUsgEGRLxADK6koCiiBV0q8LSrVQa8WlVWptXbCKooK1rWmrdJEgb0upbVVoX1xqm8r7LbVVzOR3zrkzkwR93/f3z9clM5nMvfec5zznOc/6eczgON27NOzSfcY+9t7wsEhhwnZMRT8RjaER0W1MPqg4hkjqQcV1HJnwGNMM/c+b9y5AP0G1PMpqdKaAfnD7wJNzGmMNrCLs6ip7bcXuC6z8oe/uumTwuUuE3nQquEiuay3OXtO2EPx19MEdJj5R/kunKWPUhkKJO9j9U0z9t8t/uOqW8rFfD8636i8uP3lNsCManr9O5OHgeD2py2YyTAksFxRarwcfPcghiRDVphdbuS+1gSvbtrftb0O/zP8+Dy/Pb8vDzvSSNAzHb4vfG0cWLN1hEkDgr08a6+uT9VymOer3qx3KJEjClijDARniOHXVu5txAAHQHHSskAOlxqEWJAaPWgaj2K6uJ7khRbc/x9aDc/Xgpfpf1sPH6kG0vqkeSqEFwn9B8BgEEII/w/8LoQ3GIPw9BPX4SayEydLEJW3ME4OymICtAjVi2qkUsmA1fo8SuJU+f4vEb3BqfMQoI3KH5hAPfzxMs2SJuWR/Z0V/92jVIUi8gf0VU7fUfe41O/52qpJASxzPZ0QWGc1mabkficwRPxA2gqsbEOtXRJvnfMAfB6YL9t8kr7RLPAnF0xEQpw+o/JkGSrkN5XvLre7MTIvv0tjYj8P9USNUpMKFKJwefaDrgZlvXJy8ct5VQLOkZf72sZMDmVLksnRi+4wDv4YD+6+KFfF+dF6P1vRrCk5zKHS3VhXYO3flfevnOMq7rk80q9HwQwsCatnY951dWPe/ZvxP6B/4rJzGjAk3PKYAj3mA3GPzxDzo0DTAtZpaQ61Iti1+RxyiYDjYyiEjx6HN4ZvDsDe8IQylYUsYyi1chIMSrsDN5LZwbJALI9bVrM2szMAMX8B7IBltRoy+Rw+VehcpH4Eqi0kVdcnpN2ULYiB2GAQEB2PUm57SGoGY3zJuZM3IWMo1PJURMnhhD2EbLcPLgAx/95DXl/YJPuTDMnDTq7XUCpojSVIsRgexqYXPlONHsOnxKsl9Pv5q/0jF9UscIDsr68aI2eKi0KS5alUTWAxX021bO3Qaa3XLpLZVV8nGIDv8H9+Y861HOgeXdF+1pm9lQ8IeCikzgWVr3Pnmp7bf8rXOH39Qis+buWLFk/36UEiXMxe3Xv3Ipm2s5NEtxaXL8kuv2dDWFE8unPO1cqrb5efka696/MlNhXU3zs1Nu6S1acW3bwO/nW/Lr1pHY9ln4Ev43M6DJS/YrdhOy5FttAm/IdmC/4qi36v/ov5Ejfay4KQE+F0ZF0QsG3R7jG635wUP6PQs8az1oNs8wOIBt7ifd0OpO+JudK93X+/mDrnfd//Ljba4gZv1INaaIftrR2x3jFWgWEKoF2T6XD2W90JGqiXqpC+Yo6/YdCGvglquzDFaXgtNSGs10qQZfIVRpwxZlfSO2PAGvgTD67Xu3fwzPCSVqVi54BsTMXedUEfvobXmmLp0HUyhOicptTposuakh5HxIElYxOtd3bxfsOqbxFU/cRTvYPE7dC9jCX78mFglVPX/Ew//oBh4FVvUiKoayaeV4rWdYIMqE1SjrrW69SnrD1+alfx7eEk6Wdrc3WH1+dQWQ+CKpTdcvOL1ux/KJ5uvmZby+HwGhy7bXbh+QQ/83vqOxBZX+0XToqGl87aWX7Ir3N0Ltz6yelb3FY1+99ymG0BTWGuZPRfbpl6sd2ymNSo3UxnOlmeiXnyO+pl65uaXGOf4v4UUVrt4rxIbOOTH49xhDj6hAo0GsD4OtEqPMqVEMmUiLOgYxgtcyEuSQbwKXc5rZ7VMOiAPpk2CadiETpk+Mo2bkMmUTsU0KerBpXR9VczywKQj7sGTI8TNBGjeJ81CqLqXJmHITDiSiPcCEOyYSsse1NuRmfbDFfNzM3s2brx416yOpNXiSTZpXdZAauzdmbnsrNmZ7Kzy/rzDtHvbz9lgfGPP/ME1Kx4/P3QyaIikpeoMN56bOSubmT1LzLEzlmcSfApMjVOCXmlz2OI2pEOMFrg4rUkWILafQmbMBUKuYFSg9VAGuSrHRPdFD0SHo6wORaPpVISwmSeYI6+Civw9AnQoYgomCYyCUJ8mYbQX8Ocyt7JKPaWO1WqTnmQqidQoGU8IVg+P1QuPqycKoqTsPLhvZQiEJExp0+jYpuEM8Z/axdxGQk5gTR0hnPxb/NnoEcqqtUB1RSkepjmQRerWwz9CVUpPzpuZBirUD+RFkUXhE4hmDFvnr/jh1LQZc2JjwvS1G/rNdZ6TJ5fP90dMP9+2e1LKzJ7lqtXpy+AGX8O9wfUUKmHvQkJjovsewHpDmLnhJSaA5z8fU7RSEPUie4SFD7KAMweElQAMgdNYPRhy73FD91CI6rZYr5X6Nb5VRK314SPOoWVKzAJmI7OD4WRM1Or3EQ0Xn6vvEoPgzNh7VAWzj/Qf7R+0j4lpL/2MmEkUvzAK57tQqWUPhJWG1odecYR6CNjA0qC5/O9Z/LQE1mIL89C7rGZxcPD8uZvcdaFQzruJVRXkYW1dbnZhXjop8tP4f8FhvL+SzEeCVu60OWNOzE/aGDBIknjpXzA6cxpdkChMcrsrF/QGdYKOah2Ea3T7dAd0wzpWp0vVMzxmId6MGeg5i2Cp8I8lRZ3/SvJlBv+dSZFmL0IM/+5DUcxVSB4S6hgzloI5xgzsyGxMCA4/yVbye3t0QIcZ6/mVGqAhbHUBV4mSboyy1oSMtPJHKux0hMq+YrXMbDRD/P8EsACIqW9A1FurmmuNkWr+Y5HFKu57OJwKWF3axoQPM5bITa5iew9hsC12o1aTW/4EZj4uEsiopelIT+Ke+yk7XVSYJrJYqiG07ar2TSYHpnlbeSblrwBz70uMDR9nq2zOXNEzxwNjtqJtjg01olkIShwBv+A7BQADVgHIIzDkh0qvjMc70aplCHcxUr/d7gvUWGwHw8qYkD/udfT4wJBvj2/Yd9zHrsRHUEpMZaty3ahOTA/MUhq+ReyAYTvfXWW+ybxXk2pEdwt4baCayV1lPCzQvA1Jk8vqT2NRV77xO6siW9UE6IKy3qdP/S5oSMTk6qwfizjwH+xpTfwAaBNlmXL8tGS7pIHpAPHnZTJZ3ku8Sip1LkiOeJVSnSsEwVb5VhVsIWKt3u7NHZGBn0tBq8ZFWh/4Ix5H0hfgPQ6zL3CqGTQ3dziSSbxU/qhSjtXw0wdtLizi4C+FgpZdyQ6wH7HjLKdlvfiXA+xplmMFkjDCutoaGvLE+ZQnzqc8cT7lifMpfxgeOci0gTbK71pjrq1tpsu/Ep/jr/CIF8zWHH+ukwCaEU9RfHCqO2mUAma0tvKjInxuQ3ruwm3PNspmbBPCnpBEI5PKpVASDHnDAUX4WnwC+1TuhYxaE5L6r2U8av9C0vqGb43zBCu+jjTAGYyLTiggBimonuZF4Qmc0EmBDgpOJ36M1486qQpVa41eyN20IGGKJjZff7R87QZvwL0wC7tyi4O2GcuO3PKbbgIkCo4GIxVnVdBkafFoZYb2xrlcZIZ3YOwP/3HVpvkLgbP3Y6jfmoiEQvngprFnP1p78+YX34QhYiLrNQZ5xO/xGtUFh8dsa3aY8XrD8TPsxejXTAvoe2G2t9cLNcStqDHlUkS+aGP1uUBazuccEX273e2gHhY1L1ni6JiTBVl3k9OlTCf8Srlc5+BJDxn8dy2vzzU3NxWbmpIJCQAkKH4QLyR9xWtJX/Fy0le8oiriTtRIbMQXKblPn3MFi/rD4++LCIp6Wg+Pfz8v6Igf8YAeaPUD+of1b+hZPcHC0yapBzJJAZKSwUgVISlSxU+J1K7tieyJwCH840AE0cPWaKaH7QtYYYysaiWeyKrDcYwuKoEoKccrHmqG8E0rZSrMPZXuAf3/jE/BwYsscCcigdwCd1MVB48of5tAIZKb6pOsGeEWGiSbCI5J8z4i8Uj0iybWFdCP3cqkfMI7WbhEKjHwZk9EU/57cqCj2PVIxtzonA3a74tfPbe5DzR54CcaPfFZ1zyUZlB+/OtpH6/RBQZ/ui3qe3jmELh/rVMNQmMPHi/Mg9IFBRh6Cor7v3X8T9yLWA4mmJ8J8V2aBzQwp7hFcY/ieQVb517EdRrXGmHRCCRE1pmB1uFxpBzIweIz5hHBFnfCYFQlBxlmkayO29ITH4gPxffE2fhhtEGIRFsflgGSvMjIvLK0DJ3Fb+vtGcci3m3cssBFws27XayLfNfobdXyKR5qSbMyL5/mBby7icAcO9c/WiQAUe8QG2pT9Veyr4fHhk/0D4s9TYYrYhMLzYDPYtabaB57JEwyZkqgUkvgQ2xVmub5EPJxL4a4+8sfKl576ycvlD8qn335F5uvfxmWP1oQTLAhmDaMM+uvO/LG5rXlsh2mWcOOGc3lUyPlfz5y/7ceA8qf3v9QeIbV1QWK5V+vKG8+ds9j++95E9y5ENTX5Cr7d2zjJpjvCnVOK1aX96Dj6DRCBTQTwRgC/dzVHMzYp9uh2ulyJp1jTlbOYmvkuKCVKXONTjCrblkdjETMHiI9HST7s4dBWOfUARnS+cx+rU/uiAqs3EcEM4/PJF8whnQah9Ys92hh1WlXOV+6R0EKqzkraVSMHD3E/BgUi+rF9HNeSkoqv1CUeQ0FHY/Vaarw0Gq+v3dsLn+fSC2zp39CagH/svg698YGf/pHz5X8rLzsfLP8dVFCbYg1T0gosPZp8HMAL8361+4i/oAOhuE+wbTKMDsFT0wLrFafxxfw+HVao05rKel266BO6ws0MD4mQIgRa2CMDUx0QQNokDJ+LBAYScOO+t31sD4eCCOPTWd2WKFc4pDJsFr3amks82qmlB0Z6c/gLQxSR8eOvtN/dGecZ36ykwREsbryNvldRt5nrZQyF6p8tUioqeL0lQMqy0UtkB7H6Gpn+KLE2DBV/+5s0wbmmkKww50OxKcBB8jNr2+ZdXNTvWWRNuyUBmGp/BQJhBJ9ELTDppV8OKgIhYzWRHBFeS746KZkcUd9W8gvK1YwSLnHsX7YwJwU9iStOmNuFwcUSXsSyvG55HA47Ql7XTwedDiN+JeE3Z4W+83KE1KNXeGIO+skfqsWAQVC0lA91k4cAYk1ZSwKGq1TVlef2+q83Qn3KoBcYVPEFH2KbYo7FBLZTvle+ftytFR+RA5j8jlyyMlNcmhXOOsc8YRcFhDwyLL6QOpVAkUlZhVTdAZRJTxDw66vVmxfEpOu5i+JuRv8TjFpg7hC4qDmvgQ1z4dY+FBJOaaykTiTLQbRvck9nvanZqX9ad/Yy4mui9flIon13uaIcm5be/mQxm/XmnNgv+lirLrtm3Z8WnYGF/FnhfjCT9dfNafX5cv0m7V7H4YH3amgkleFQh3RjnKGZfeanHTvUgwZLBPtzLsk1+dN4UG8fW28yZ2TApDjQE4C7pOCQ0pwP9aOjSbeJGWRTIZf/UhmREgm1emRJCCwRgNiOJ7zcgLXww1xe7hhTsZxkKR7H9cgzZAswEOPHWjtQGY3BX6OwH3ocQQRlKm1GbEAfRh/kdPgWyP7wwSjgEgBxDzMg6qMdCKS691/sl/s85Pqf3eEKWX7+0dfXUHqAe1H+4mAtNBsxIrjcOermPivVv2H5OQDyJcnHWQrgtLgI+BqgGgtjeyTwvkD4Kflt8EyMFCe/1zObgo70V/LF4Pp5V3llTCxe1YxBdaX7w/BL3dB5fL6bWDR2KNdY0/Nab6P0pLi6aB7GA/zF0EJWI7hjDrexHPEpF2Hec8UxT8YDmhNoMCa8J+DvMnI4/8BRIaQoGMR0us9WlcamyuuobQJmNIxBmxhgAnf3CM5qwZQDZTqFAe4tJkHJ/n3+I95pOKBCvFahdPtElxESbEpNLkeF1jgAi78EF7lJjDJfA8P+dQgf+ydUUq8wWpoiKGYBViB3ITJ2E/oid/aj5IcJWwtY2p2T5CTitB4nL9xJ1clrJzgi4v0w+YxIS6WHIZqDVujD11V/vB4+ZPy+2D+Il+Lk1f6lZ+9Cep/CZjz5RPzzTmrg41KEIM2lr/WVb5Lzhc8G8rvB8HdXWA+q0xmusp46nFsv+gIdiDzC2G2zsobci06ENWBuAnITFYTlG8jMTSbKYbfSoFagswI8jZsx/itNqPVBmxWq0fLACdiAoZWLuAWvBmPpwLr4FEpaY5xDFubMiv4txXstQKrJQCAT666Q3W/CilVWrnWFhBSHuAZYnz4tMnajw7aR0ske4gYN8TbRYzCLDULu9+1j/DvjPLHiDgoprAsqHhCKQhExR0alxOvNI23eVEjbdopOr7yNb5Efyon3rz1scf3vF/+3UP+xpErH7z8mm9+42/gh+U/PpV1SMMO1MlFx74WvfFb5XPld/fcAHjzxYM33vrmBzu/XIBL1+bXgSWEJ0uYdiFKuw9eYnh8el6NydfBg0Ye5FTAooqo4C+Vv1fCy1XbVPAOC+izg9vc97rhbA+QeX1ev1yG9TP8bpX8gHxYjhj847gcyeRyWIEhUfg0rQRuMeVETgQy0KQ1e8wpM1Ijc0CQ10grB/+Wg71yLHcDXi8jN91hut+EzCa9VYulawoBNORjMGkzX0RaUqZPSlZPdr87kuofTa0gf8N7Xj9B3MH+ailwf9wggrUEfGBy9ZiFVpuRIFIj2Ig6HWGpI/tU+Y/gh3/7xjevufzBK0ca/Q+Vf/f+nscfu/XNcoKbV96/Lr927MnCl3d+8OatNw5ebC6fvWEPPt1U37oxCjfS/U5qfsl+9zJvCQPbJV+RQJkEcIpvKL6rQI1KUiONPrD92wbn2rbbvmJDM51LneucyKxSq4IWs9FiMW+1AIu1R7VKBT2qlKqkQioVq1tlBub0DPUi9Wo1UmskjNfNalVmERXqGcsrFo4gQ6l1BJlQyfsFxgt0Ei9D/R4mzNCMf4F6pRqq7Q28qIrKCMn6iZuCopKIJcBiqKVYZAip8abHu58Iz00jmf5azIUR1aV+brKHHmtLlip1vRUVE13lXXHl3h9csWrDJbvKexAjicpmuy4r/wpsKN88c8E3Xlw7/aF119667aUnN622gT+Eyl91q8q5YHlkz7LLPiR07KnQsQEohKDCbXfXuRFBbo3ZkVyCjYmwBSFGm9YKWqSTRABps/qfL4YjxnA4ghns9AsyXU7u9RICLMOshrwGL0lI83qt14dBOgzC4VAPOAAgANbIJamrUjC1KgIiaSYtMRpIHrPXsMowYBgySGQGnWDV4geUwgvCK8NIGwYWFA5zKQN1EMj0OYMx62/gmGy9SP2UN5VOoZS6wZkaJWH3Y2TfZyYcjYRDmZJ9JINFQbaU7R7dNEJdRIMjRJMnThGKFRMnSZ7dlUAXLY3EQoJKCNPUqIllSqwkn6vJi6qoffTOjlXru59b3j6vNOerr6x1kXU5tH75/1n78C++8Suwojw8ReI+pPDXr++LuFSSgnDFyubpH2rwOm245NZHl81QqK+ZXwiCxTUZnMBn236st8aARCjeYgNSG5C16xbqLtWhgg68Z/rYBK/QfKj5VIOimibNbA3yygIurXyBHGIDGnoMwHCWB/xhlBXUFi6mDXqC40GkR0HyiQIf9MAlQVAlJUdlFmsgs72A8wKIpTlSSFUomG7I54JWmSXn8gYRcrgFFZ9zx1V/HnLscUBHPHYY3CU4mThBBYFyuV7QGgBj6DFANTIgAd8PpSqINIP2ESw6yBbgT5DiQLEMPl5LUReVOrpRusdIJntptP9VUd4Mj2ZoATGgyh9RJBi8DFiXqMYsAhM+j6wpIJFCKT0X0f6Vn50Gl+6pc5WNUBOZM+/6t7pDlhXrH/vWwHVLHj85ffmn08Bl+1sCdsCVz4fA9KMtTV2re7ct6Xtv/7prVq9/YGhv15rV5Y8aY7aEaG/VjX+AVmOZHmXeFbq8JKfN68VzXBYFcgOwGWKGogEV9XP08KQefFMPfgmwQgOaDVcYbjDsMrCLI6AjArSelZ6NHlStSEAep4nEAOvzOdOfQ0KIbKawUpsLhdjgn0momVHySq8SaVmlhpW7PBm34Bawcu6uo95ZayCS071ChsaEwOnQ2RAMHcfqi0OWSmFmH9yEDbGRyb5SrLiNjFDMpDO6YjUGXA0qDYoABP2TMFgmeeYpgD6J5laNtwoyl4m1mNHqR/edWFxa2uBN7u244alH7/5QaVluR/gkSq7Jb/gTQN88CN4/sfceW2COJ7r2he2/v/4KFvgHXc2h8pcejZp+ZN26i9A3h+nbieURppKgucIAEBMeCA+FkUwCiSBIYim7JLI2cl0EvQhOAviMGxC8pJQbKdwO458FJrgqOBBEOhQMBtgA8cZgtS9Aw/RuX25fAFD4AT0K2B2CQ6Ikt5RrdTlMWKXTTfzZFT1OHojnXDF9pTxej3/DGmaQFH6jCAqaBBP1WOHjfJUJeE0kyIQYrJh7TUhmcpBAbqo/laK55aASmqug3YxMoN6QdagYzYT0JDY/qZyPhHYHxY4HtH67/8KVIELIl5+8EAEfXYjOWwbfXzZzVYM39s1lW6eXxj4hCwE/8if88cDm8rsAfm0v8DzdVbIFZ3uiNxayve//gi7DaxudluulF/dXYgVnkJX9CZMEXS8xGqxJuNzBHMkEIgXxWl7r1SKL1gJCHJ66NWc6jIyCnMCbISYl0MjU1TQyFVWo3SpXMCIwUZCOCtGzUcRE+ehQFEWjqXrGzbuhHLlt1lA0J7GB79letB2xvWf72MZ12S62PWBDMtsG21bb7TZWdm38lvg9cSSNW+LwQWxKaOOe+MY4UklscTaqqkRsVZWILa2Y4UnEVsWroAmpdCFWkNEIGT5JZIKCVf6vEa3SCfuxyu6ohlsrcmpl/yANtA9W5JoYTdxkH+keOzGa4YcrAFMEaXC0AkRGoxDxapiLyCsRcqKie0bqwTQwKcxlMnqAGVlX9G1fekXAYFH7fNaO7s1CIr0kcMOe/mqYa/Du1z/d1tPtVtjBrK3zloYibYvaHa2ztyx+vBrlur+pcdbqiRwl9AzjZCLMgNDQCzdAKOOsHPw3ByROMNP5sRPe5wH5UGcIBlnWIXVLNAa3scMUsPj6HFIXTb3EiryMiVmCXFAlNUYobVWp/o+P8KOZDA04UKCYEwQnBpNkhGTsi1lFPNZjTFyenpyTM58J3kMlg4iUoqIflM+9+IPyy7Zum1ehK1hDKmAPty5d3QtSz0VT112z577bnoKd5U9G7sx8ujGkCnnCc1Dvcmedxrvp5LJpM8vzvjZjwS1j6+q2PUh5mKS3kR67iIkchPj3wyjynJi0Q6wPADiWOvArtliq1JDO4mU5t2gRvobEo/H14CF6vZRJvyCF2HxE+B5CFfIKcvi3FwUWsKxcJmIunMQ0SA2XhhvSPnwrhP8HDy1a9CS55aeb6G3xOBT4BxmXgbniWUDu8bxeotMoyK09ghbr6UiuYpBBa5IoFCR1mlHwCq8CKYBOTb6jYWWE9F4VkqlUJqOOHpDZLKa8WPdi5U8O49lU5Egm+06GHJ4goAuQCqU8qVISmSwLzr2+6Cj+Z9Hrr78O/l2WgX8vOrQIFsd+vugQwbg9M34GHCG546rfV3ttKAalgA+rzjMMH1HruJ+LPREk/wD34X2vQEwhXVhVGCqwh8ffEfhCc9YvwHQdqEM5QZbPVSCWQYp0Aa3202AYeZa7vHbPhto9Z+Mv5Mk9m/nmVc1DzfiefxVMzW31KQESQQz3BUEQFfGNi4fh9ys3HsxX+lx0jJ+RXkX7WznE+7KMeF/2y/hN6wto1cyhmZDc0jezq7lFgN60kD6VHk+zTJpPe9Or0kNpLo068e07L7w9xQ0e/5P0HO2LKva7A+x/4vsqngdePF0yQ9oTb6ZkE+1vKn7HR7/jEgwQMO0L2je2D7SfaufamQXY6iCX4P/y1f7nv6DXBSp9UYuUFnUQeAoPF94oYDqXCisLGzGlnykcKHxUkBUYBlseG9U7aIWXRC3ebpDeb/zd8T/J3qRjFXtdAUJjxiRoQE8D8DakG1Y2HG9gG+j8xF5bM6VL6fPF7/vo9z2CCY979oLZK2dvnD0we3w2XqEFPuCrjbzSf2smt5teG6rMmfB8VgjjseMZP9yOmHZP+xvkZWX7cPt4O9vOvFIHdlTabdExpCrtXcj9eIbhaP8N1b8r/Tdux7xWL3jgDt9uHyRmMIFfO+7j9vmGaW8cLU9749TgtcVe93PGR9EdFEfaKvZKGSBoy1Z4vAT2lPaVhkvHS2dLHFNqc7vx5aWpgM/V/r20D0iFj8bH8TjEvsVeuVUAkx5JnifB3y/S5z0hPu9XDNMkmABv6bGssiDyAwqWPZZ9FkQC6M8Vi7nD4/88ZLGQ5rqTAKer4xd77IBaj52DYC9+vlfQw7MukHYNuyDjctL+PK5JU5/ca+fyWq+dgxRbPCrIYY9nlWefB1EIGpXBnGM8bnoPz8TzK/cQcc1BDWv8ILijOv90yiD7HPa8iGd+eQ1z/CDFa28R9MAb6YmsipCAGTcUORuBNGYWilUTVLQ5JhK2+SgyfW0QE7jb4jh81XFoXoWn8B94QY5gdSTx/BT89k/EMWAZcBnzxPiPKT79E8wB5olnUTt5ZLTUnmsfkstzTPs+zJFIixkTs6mnvYTfDLQ/g/eopB1A2ESa7OpjaBX+8ADhXyGPJZEIID+/J0df58wVX2d0iq9ur/hqstBXwSlX5YR8T/54/nSeZfJ8/kAeDeUBk08Z8LJXKhNIQ7c8oXtc7Mua/6J5vzZ53p3Zz89bcu/n5n0p8wSIMg8JfiQMud05YUiuyGnxkVMSNgoPC1xJWCmcEpBQnashhjbinQoXtGNx1f7/drKbxNnGJ2H3T8z1yOS5zi58wVxv/9xcD+K5eph78FxLZK4lOteSp1QqbSQbvVRaWTpVQqXqXJUxxAgd/0/nWJvhF/Lxz6es5xfw8Resp4Wu57f/f67nCzF0oARK4i6z5JhS6f/pdKsMHBd7us7Dc1iEDjAWxsscIBbFm8LFNlfODMHDEvAX5SdKKNcB1nSP6VFsQtmUMSVUK13KpBJpoB5YWV6LzUFjTpuWKXNaLdCq5SHGSjp2D1n3WTmZ1epSNxilrhCrtKqxAnUYJQQ749ce5RnSoXrANmRDtnM9sn0yuIAaZwRp9AQpPhjMiPU/xSpeUVzHZPGJSAvmwQqKAzlhBPsKou5acTYgXzXlfdH6zSOPrFoBt4Ge/kd+cJHHsvrKu3+0cc1Xy70cn7/x0rYmcPI3t++9cv13nty++4/Ge9dd8/Vbyzt7g1vnzaidcb7qGTch01gEmUIQH2gTvCCeY5+I5xg+ZS9bJ0q0dViirXiW7atKtD4q0fr29Q33IW3fyr6H+5Cnr4TfDPQ903eqT9KH1dcewvm2GMv09XbPEhBMdwvde7r3dbNM9yx8DNLWFPFJYoj5/Fi1q+lY1YfwSOuqI/2icT49aZwrn0XdZJwRPM5uOk780OFupO1e2f1wN/J0l/Cbge5nuk91S7oh6CDDdOAN2j1vVrsA9806MGt4FkrPEmZBZla7ONDBKQPFOswHDCM5Q/uYrBF76CEvcDBegsx0TtDMmdPZKcA5WLnTzgFzxHYm8Vo/kznjZzgr7WdybaVv34rxexmfYEQDvUO9e3pRvHeZTxBQL76+9zBaRpVDqhhSPC7uSe5KppkZF1ZAgsdltppdOYvV5sht9gGzL+yb6VvqW+fjNnmB0Rv0dngXe9d4ucewwecIO7Y40AMWAMKBIklPTsV2xx6OcbFYIN1U52nIph3ahlIDbGhgtUZgPAwOChr+AVtUr0KBKCvXi9B+XpPDCCPatCedSiNZ2hcL+aHAECASqEOZJlpeKdgJZhdMQ/gMfANC2OpqJbWUKRmSycSNQLgemxIn8EYQ08XOrOg/wp8Y/aeYEzH6tzM04nchZk3FbU2zZwMXAnM1ZkU3hXcSllfel/flp+B5uUCWe/K+GjrX929+pqhPcKFAIL9424/Ln902WIHyKn8ArJPgvO4D68r/qEJztZuWlhfvW3jdyFNnRQSvj7tmT0B4zWawUop17HFsD7cx85hlzCrwzgtmKzYKlx8e/7eg1ttycLl+uX85crBxkqgmV+eKJJzSo+JzduI42LASFJpnNi9tRr+re7/uX3Xourpb616rQ6/FARsHMpLbB+UWoJu2RBNSCkCp7fP0pfpQFPX19S/KCnqsamVBA8oeBg8J2kWCflGBflbAnxXIZ0phYXzRIuJpXTT3MGoQXEnBbNWZc+YUycstJRckNybHkxIVkwQ6lHwZ/poY9kAmyIlvUMbn3DPIVRqntD/Bad0Ra6khJsSozwrbk7QrDx+DShTzX9bbDVqYy2Y1WAUrqZ7Ec7M2HEbp54wCTXJXkbCGkTdCEzJqiF9Hg0ehUS3Cj12iX4T68FcFuVyQC2o+J1elqta0haCyV5HIK59V/8YfeSczkuGPHKN47eJn1FmP5fBIxePCn6ESOJOp/E46ZPDd/7SP0mRQERWg8r7iMstm7STxMyOG+leIHkzitKG+Gy4w4b7HBjBxtJC3VejDSs5jHIipj/5IhUErhSxZMIGtipnWIGKvSqS+grR2Aowvsce/ef6nt8yVdgzyatmKlfue3nj5N25e9dOCSitNXN+0cd09HbPmLnRtHGnra2yVFMpPdWZ7LkmGOnI9T/9xfXDL6Rtm6eFBEBjbpAms+dHzSz0nEtG7lzU0Gg1dJp3ismJh4W1Lhr++8mLBaAlL0OyBPcsWGNszCRWLOLk627TMaYfHHr54+nzhsoeWTS8nO01SJNF1T5NdZDe3CZZaf1Da81hVrujwT5F+k4fA8cLpwtkCog2HC/lEQgAFLNoKVXu9avMSu/SPVKd3V3T6e7Hsd77EILxplMsvlkgEtBxfuLxqMFfkKcWZorYDrDzXip8bEMxgd+cbnac6P+pkr+nsTKUEUDG3Jz2WXE/xf+j1/upz8fW5l5gmvCW9OmOuKMM/AF/0FtPFjcWBIteO2QkrJBXnQO12pIMpoUN5Ea2Jr9pSz8F7Kj080z48h1o/pM7yIvQS7eEp2k3PgS9VvpcJyGQT36P3q/Z5xfoZvR89N76Oz5ywYEFMawtp9ireH7WSc6cVtE46d6jeS59X7ftK7kOeJ9or+Pzx4/OHaZtGWr+Kz0dt+D5ttfNHvAeN1xNaERuP0urXmFZxbOsTz7cQ2BPYFxgOSA6PfygoA34vtrMC+C6Bz9Hch9d6FllrcKtov+JjNCXoQBX7dCDIrQoOB/Fh8l+CMhjw+Ws3qiw9tdjg+OryTBjjLsf2cJgZFOy3AXA7BL/n/sJ9wiHGgwD6LfeGFgIZxBe+GHAHO0JS/WGgEfzWY0otx2mZHVh5vId8MRiRBp3OaISCto5jHZCAnZJA9XupTWf6SSbl6Gjpn6MlfHyN9VfOIoACKMs1oi8qL5jkiISxHx3+sQfo3r3rc3UFBN4jqgHGOHd5+QUw98SJT5+6oLAA3rk33qwNDjATPjLiayH+LEx/6iNjFM9TN1jFLyT6vCa+Q31ejE5QTPi1qr6YqX4s8l3qT3EJ5i92WNWuE/c6V9vrl4Kfgr1EhwGpph1Nu5sQ09RENnojXrTGyatf2+fX1Pb5pcw+/EyfYEAL+sHufsD09xM2vgRfesnU9Sa4NGckn3HzmE7mEaJrfUAqnCA5Ovux6WDjYhyMYd7lfekscjsaovEisng8cIajQ9LKyjU6h9zs4bHSUifxZ309zXuazzajnuahZtjcbGa0M4BsRldbUEua+7h1PrNP44vK/T205HVs+ONh/mMCAD32XtUl/97YcQKVnyH5iQR41JIh2JUiwjuoBre8NuC7sJ54CsoeSU/0TUpXpB9MwkuUfNZx0evlobFdE0B8NRi+hmREzsItBNQVdqRTSxTsZNBEsBZ0lFdX0dDQlRtEfD6budncXf4SuGUD+Uuixbzgs5PlTycDJ0LGX+5is1jPJP78H5BaqdPCKiwE5WEg94C/eD7xwKs9N3ru8iC9E5idYSdcA6+FUI53GgsATyD5oZ0NBlipQ6IxOARjh8kRsPh8gtmR8zmQy09xoGWIevv9KkFqjKhoUMXg8OUGRHze4yqwR3WchgBInAufyB8fsYuhgJU0FjBCTuosf9xKDu7SaKWHDVhRxakk+OY8kEh1/3tkgM2WT77xSvmxSZGB+nDLssv6wJVHWos7rtlz//3DaLD8jfLoK7nyS5XYAGetxAaWtnaM/fDv6y+75fw/4s//mRF9oh+K+6Pi47SAa/D+iBB/FlaNBmJDMfbw+G8EZSzmx0ZNHWb1us/JSGy5o3/RfSL6Oi3MIfwH/7PUpha0WCNi8vk6aW2TVXYKldPUjpJp8LWNlf35VbiPCQl2lmlp8XoFdqDleAsUWgDT4m0ZajndwrYw1C9a6UtM7StpAl8/vbJHd4Af47NGjq25vrY2ge09PD4kKOWKHNPr7U33ImyorKueNlX7iF4v2keXwmZ8vRnLIGb2zIZmAYLZU/x51Caic722Mt6lYh8+xCxb4iwJCCyb0odvzvh/cNvo/ddWvr9bvD9isg16LD1IY8BJ94+M/wj9nt7/usp89lfvn4zrOfz95JT7i3YoV7VDwSdwF14/77MIC5s/CCq/X6vFFq0PE9430dlxig19TcUXjK8FpPde9jkEBVrBJMszAi/sEfYJLL2ZIDiC+GYz8M1mVFaRcEF8io9a8m5tLOfhKdpT2wH5uh11Q3XoQN1w3fE6xNRR5/QFzLRpkr08vzam84D0G7EJWGWaTX3Ss/FVsycpVviaOqwXPU9p8FmFBmH83NRzEBDAnEMaPrencKCACfJ9QVUohBJ4UZvwXZomtbqszYH6ZyhNnBWakF6SSdLDfcALSl4w7AWHx+8VVF6vToeJMfmwz1cbslfHRGnxWYUWe/GYEs9WKmuwiBpoA0Lb6TbItOXwkMA0fKNpE9QYrOiM4njm18ZzHvxHlR5Rt8YowCi+LjqFHuO/oT56ruqjB58wZ/GzXQLWLyQh4qSHIIivCk5hCHzdt/F1Ujr3JyrX/Ziesfg61mZTq/F1Tnydc2K64lxpTIDMtfK882AZfR4PTtcBvNgkLDB1scX4Cj6RYTOd2xOV6/A5y3Q+C0jB3HOEY0V8W19VjPC+Hh/c49vnO+3DSvo5QemzqIEAKtxdO4DjFV+xGCvgqvot5ot78LjieC9BrRvQoPvh8Z8JKjdx9n9uk/TXYi9i3OCaqv6LeeIBwhN4n5CErxdIvIAwxYuEKeidLmCKwQqdRMypd2vjOQ9H8XjoWoZpzCKMrwvXiJSfePb82rPP0zoSj6CHe6L7ooQJyIVTmaAaIyA9ezbQ+csr4z5H5+9EkGkUGnsaVzWebjzbKGEaG10uPOxmfJfmSQSozh8vKzxE5x+r3IckAcUEfIr21K+qP1WPiEGsqo95JZhF6vFd6iftCHHudCx07vLKPHrxWLDtA5nmAazYHGhmzc3NmYwAS/j60ufOGHEM82tjOE9llZPki58QlFnyaJDFV2YvsLmm9KHlCQ/g536+zyyeE7F96rHMiFdLPffE98UPxBETJ2EY/Dm+e3yq2Kv1In636r/G8zorrilpPhsKXWh75SfiMfNrzz4PzuFnF54FafJonUyX68FK7HD6bJo9kD6dxkz6D0GZDhPXchrfLT2Z1ckYhspplqN2nIKeGScAlp2M5Vkwm+4jfQ5bOc/Pnm00CiBetdXWlNPwt9Smq6N2zQl8/LmeBSQSdEhuzaXbhXb83NHn29v1eoGysIgv0lbO0DpOD1NkxmjH1bazLQAClxtMk0qXQQcwexy8zy/3OLS+gHua1brM5XAH/E1F1hsKNgb8rC8ptQYYD/Tu9e2JxZMEFULPZPkszG7hea3M6/OlC9EQ6dalTMfNIJ5iNuLnHgYvHJLJ/RazJ+4+DP96EBvN5sMwc7B5Tb81zp/rP1dpkX6GP3dulKdNrlv5j/vHznw8ShqjkwQ7mmXHj/6N4cdInSF9Q3uk0xatgtKbFLLQ7eZlHittiu6Bal5Hm7XyU5qip+wjtMM9ceLVg8+VK2NNjXZFB3lSklhxmFTr5qlfhf22Nqw0eNYvfsURXlCpYP7OymiuSxrmwYHURQmJVCbV2/Th+uZU4/zFSW5e+aeLg82N589Va1hYlcZw1SWg7d/vBetmevQymVxTH6srLJ27sRQQ18lYztCaeQeTB09M6qhuE3upm+lP06T3DryHaWmfvfrGRna1jrxz7nXtifWkBLlSsiR1GC0QdNoBJVBqHcB0uRHMMQIjexg4DgGJLKFVOhNk7dy+6J4MyKxVOQBHG7FztJCQo43YOcPh8b/TZ+A3Z2kdoaHah91gaCxUwMtJG/bjI3hxx861Tm3FzpfjYx+PivV/xMcadwg2m9WOHEYzMIVTMasNvweVYb+MFjBaxgGuETTIlMZnoCo/MU5VbZxHGRXJqLUqv8IxALAsFzR6DWnDPgMybCrsv4NyWbWr+sdiT3U6rrEzhMFG+TIeUaX2Bv9Hma0h3ecQFM5YygEEPDKWtksHEq2MtkvX1tql2/mRlMhTYm0/TRan3dLrAanJbgMkhfO/5SfQdfJkNupr00UCQx31vXVfa9yctMS2pC5KSikj6SIVRmJ/Qiv++9pi0ctWZ1euhht85stnh9d+MvgFbASYueWZ1LaqI92k4PibBxXaHF6nXwmLLd6cBJgB/B48CeF3DAcNUBIwB8IBJLsteG/we0F0MPyzMJwp2SJ5UYJukYBexQbFVgXKazo1cCsPeiMbIlsjSBFRaVtD0lYmobI4zMRnHzM6TB4WsPIIkEcUPrWgUrGMCaiQyefwypQ5xwNmfdSHOFZLGr2MDv+tmq9JWteO6IvFFQRH9Thp+Jji3xk9TvyptSRyUHGHxuMhnpNw+SCpAZVI6WvAi0jnnYnab4vZxHP4d2xwbX+7fANiv7n9e2/AO7+zs/z8Ro8nIHMZnJpsi6r32tdv319+aO+Kq18u7//28mBmG/jFzpelKUNmHXji9gfK3wcPBl0Gi4N1z1v5o/IbDwQv3iDmPi0ud8Fhis32uqBgJLzEK0EOjjRxOSjnCZXPCs5AJFfwz/RDudQmjUnvl7JyDnZCqFb61PzLKINlsBxlBL2WAZ1MkOS8QEYNZGqLkfBxVjAxLKYc6+MNppyPV/E5n9KlCanVLi4ksFqtCciQyTyE7Uh9zmaW6EMuKdlkR2sgKiQhk/gIMA3jFQ/2cXv32GukzwXNcquQl9qxooOZJPZJ8yKCjkjZSoqf2NJIZ5Sa4fBfH/vDszfs/nrfCtD15HPNwTq9WVdc2Qryv/td8szOVdZm09otPzhp9iqao2D2H8aBh+cd5Q9/c0OuptN8S/IvrFePV3yoXwFfFfWAvwnKWTM7oQBm4UNy1qQjt6I/oH9Q36mnmocB7mOaX2IaMaUVWB1vor7TpmoJw0AT6GkCvU1NxH862VoQT108XcCEyl1cEe+PNPMdgql6VshiZXVZFASi2Sg0x8Kxj2MI+CR+xldKLEjAVxIgkSFAqsjg82v8NsFr8pHuacNCyuPP9diO207bkM3u8Tr8UB0gbkpvAAWUIaSxeQwmvcOQkHhAmiDz0U4JZzIp+rM0ktmky5ZGR4HYGrb742E7P5YhgQNSxXtm7AzNP5wA2ZvohIHPrELNz0PLoSuYVfSvXHHsxUctSontkXtf4Iz7xw4/4NRw6kJkCbjls4f7Fqyw6TnzE+Wu0Lzgevb2weD9F312UZ9tNQyFYId/I1q83CoYNCh00aA/1lV4/Pz8SyyXUd0VMR3lLvYu7qvYiG1i2pnHhejSAliSBzPz4GIL2K4HV+jBLh3YoAOFPLgjAaaFlBI1UwzYQ7SjuNrnt6tl8jrM6+oZpLecEF5gXGmERo/P4fEDvz/IpEJ2q7SuUcMrlSFZRDJN1lKSEZEx/PY7umJxBP9fyo5kStlR0ilqNANI3cRb/cNvjfDHj2T4MV3xLSJL9KLoqMbyqonHEpJjH66Csohxk/ykTiIEDWdqqz9AdgHtRXxXICw83ZduawtcYZno/efhrfa4GuiS/nT/pnLzpNZ/4M93JuqsW/3p8n9Or0sejnztiVULV6ytdgN8Qmwq8qlOtgFcM6kZYHnzVYpDWaaKc8veyV3BRJgsmE6QXc4KTbwh9yh4HsD90pelcI6yTwmV6tfVf1Qj2eUmELe12M7bUNzd4obqOlcdhPX6en890rBZkiU+V6PL3ZsFexsA22BsCDYgrSESiEBJxBy5LYL4+91PuOFLemCQAyQ3yCFi5ANyqJOEFZZoIsF6dVHeE/WiDCmk1pEYY8EZyD3ood1DvDpBt0o3oNunO6uTKTiPzmHAx7orVymC1zq0QaBDwWilWdsLSk2OyRuq7c/F+hlkIE45qEq3ylKjJ/pHpqCjkCDuyIr+Wp3FYCXrvDR6krZgGiXSjOQ1E5C4FSKIWK1km6ZATGRA8CGxAsZUg5ESm/OIgTK2Cgdo4n1e9s6DQ//4r5ueAbl/3jP47d/OL+66tbQglx58fOCr/wS5D9ZcdOutC1eDAmgDq//aWyr1/hVopy/4w6NLp2tm2N/d15hpLT3ylRnTAjNs3asP/H3B9PKHTy6YPn3Bk+WjFVxcbB/eSXuMHhP6VDyWYgU4E8IWyVzJcgmyqcBhDSia5pjgITuwOMEy53onbPTP8kPSLzfqR02h2SFojgJJ1BwNR5HKpQyGjEbWytu0TF2IVbqUapvVTLA9sQ5lc3irGdAJxCQFLc+TWvtZPOBJy+rntXhThikOqGylDJKyrxODYs/5bC0V/AQ+OjKZSqRzOJutUr6SZUIhVafQOicGKS2YmhSDtpGQuIprKdZ/oZe23/T6T7ddd/PmY6eCc479eU7w1PFrb/lBy7y9f542/95T4OCvvnzLjdt/tOutQscnhy8LLN1b/k/g2rs0cNnhj2anj/3usesfKL/x6I3fFs9me7mffRDbOGbmTmH5TjVQGPQGv9g5AJIy4H084ocUAT00BB6Tg63y2+VQLpNpBV2GYJ158d8P8JwS8fg6OSKQ9IirlRLrgVef1gt6pLfKK6XEI2K1lhi+JaWbYkUxrSZOTUIf5Mw04Sbgy08qHM6Y2QfAi+ZFALzz2Qm0bqJk+LNb4Xf6btq29+ueSy47EmJP0lLh85JrSY1wuR9dje5hbMwvXmLM428K4br6nIIUBt9iBl9RAIXZZK50SoD6IUYB6pEibSS1HseFejwdmwkUTDNN60xbTKzJKEmRYkGzHJyUvyf/WI5Ucqx1yGUKnRtPk+xOr0KT4wmwCHAhPb43oYkS04QxORh5D6YdLQmeQoX+zxUGY5IMVmLgJJ/7aJUwFNCtIX0hbWgxmomQB10lkuftMg9XTS73HXsAfHX5lyoECqI6scws9NmJdRO+zOO1fNunAfGr2gUNZGIB4r0MCzJ5bpKzpua7LNZya59eW/HU0ewc2IG1iI6JMGWljqp8A/s85rV5WPt1rgNbwG0Avc/+i4Vz5vbNhd9NvpCETyZ+kIBYPe4QCkizIU3bTSMB/zgtR/KBwlABFnwNgR3F3UVY9LW1ReZ9MPO7NofHYwEyUmMCo6RToDb93ZDD64nAvXi1VDp4GOwW5li4Jp3OA0pMseBonJbxlBoXNEKmkW/0Nu5rZBtjDSW/J2zzrfIMeKDgOe457UGeSDz2lCeawre9at5Tp0iRPGDmEyh82oA01T/48ZT+o3hJyf4+McofISj5YjPS4YlupO/1E1hlMRBFD1nkk1aTD/JinRURpI0Uf3VSD0GaQUPbDvom2g4GfNVGpWItOPv8deVV0Rs72xaHik5jqivtVfBrx36eTi1VIHtgSZo1aSM6nbM1vL58J6i7NpKThEIaTfjr5ZNA4jI1vrc6OTM/bTpYXH6q5N20MJeWxlmh3lsHHwkli4aFaPD/uKKh8u96A9Os2rEPAvXXlqNrHHPL7Z2yep1Kween3SSewfOw/UBy/hJMnhkTUvEoPq6sHnBPABA0RygFQGG32+vsD9iftHOySLQxCk3RUDQfRT+AgC68leM3CIKyRwkZ/GOf8qySVSMlk0gQD6nGmEuQrRnHu4pJ8AmYqAuHtPmN+R353fln8pwsn69rCPmkdQ02Vkkqy9UGliw/b5M2kdpTaDAweRgGYZot2OPa54Kkbj9xlNEmwcbkjuTuJEqeCzVig4okC5KkwcEMrfLAq/oqWdXs5zIHK3WOeGHTDf2TEghpz6QvWt9J7TdNPolY0ltRoqRokWlt7w7L1HVc/NzlKzdsPvrIpf1jO8Vkw+dIiuGqUpMCzL998DJ1aMqS7VTcfctLv7l97xXrHyWph8BAkg471jATfmJf1S87Ne8wESYWQC3vUDxvP6nlJkzNpV78LFusZh4WaUZfcV9xuIi0xZXFh4vIUyzhNwPFZ4qnipIiRJC48gQ+xjLFpmREwE9LRipPuzDf8IIxatdM5BsmvJVrvmh8+6eMb8mzqIWML47H1yLIdTmmZV/LcAvStpRaVrY83MJqWzz07UDLMy2nWqQtEKTIELUxxLQ0e+ICZDxx8WlT8wwrvu3jtVySCXkpCXlI6MBP5KV/irwUx1qs5ZU8zdxZjW1EfDyWsWKUYkJifgEdJuVdhr34Of8dHZ6eQoeFz6JkNfMySdcpuS85nETa5Mrkw0lEMstWJgeSzyRPJSVJCIJVGiQTEZ9ARveFNDDgM+MJmv/CV/JevgocjIvYpucEVabBIhNAhpAhM9UfrCrPROdovku6kueyf/xe4uOnCUmQKeQZQzUVaXKWJZEt08pd8JvYlnIyIWaeEPZZia3kMluDRhM2kkhvIb3RYTJZGKVVZpf4ZJ7A5yyhFLWAsPFzLDM2YflMsXamtErEBo60atHAb05YNNZab6dwon9T8XOWy5KLWbXY4+lTXr7hhgkbRYXtwTvRM0wjVpG2CtNbs2QOTVmZXB1clR3IDmVRdno05vDV+eJ2U5BgPkBfOOqIxeJGfSJRL7U5HXZFVinLt0pkzW0Xzm9sGMunzHBGnObY0WFdkX8Lm3nv9I/hOf/P8/1fWpVMIQV75yTj7n9qXEKsvM9TZ+FKOON/6GMyNkdWIRmk+JVXsj9h3NiqWyIkA3ZCL49RbTXbg3jRtYyaNP1Fal5jS5ssErvSKQn4ZAqnD2vzTOntd0ZKdM7F0rGx4yOYJscwHcaGj+knFj80lRiTgUenLv+VdM4doTbvBku1HNNWnJjfLjK9xk3fXLFwCXi6hjn6qaQyF0DyosBNeO09zNU0mqB2ugVXh1vKKLG2SIFYPRUgVleECZpMPq+HgpwR+2KjbFzGysgGFPOfJmHYkkyLhrTjRaWS9UhZ3WHp2eeuwnxB/K34q+mGvi9EWp20xOCm/z4F6kJI1YnMJ0TylLgP8X70Mw2Ym58VcmumgUXTQGHazGmwL3R5CN7qA9f6wE4v2OIF67RgiRbcoAB3yMEGBHohKMI5EKqwAfVcS4YhllbBGzgQgAGH3hUPZmz2iF6SiUf6XB6pxeaxp+zQbncyjaGb9UDPSzOlhESmTNTTZR4l/g0Kq0GcHNTbgfk/e/zvGaKVFd/pJ1n/EwAbFzo5/lvnhsUsrUHdi83Jpzo7uA8f+cr+F7+x+YFJ3o2wVwMMyVsfePyyJd9vnvnlfD7atn7TTR2FsV0Tvo61YPTcN4a2bq34Np58U2yYuuGlu4f+smv9lxzG1rG31t61cSf4z5qfo+JL4j6gfY06mEXMfqFpXQ9Y0gMae2b1wA0zQB/+L3d5DjblZufgdelb03BnClyXAheHrgjBXV6w3Qvu8IAbPMBPiK1IzX9l/vh8NL+T0j6SidZ1JnhZS9Cp62wu9CXqu0LxaFjaeVGfuz0kY51upV7r0FF3XCl7PDPKE4IPj+J3mNRHh8eGjw7jDfUOQdMbpbANX0DpqS0GKvjjusn0xzvP9N/1GAjppmTkch9c2HIgpJLwLHzoq/suXXLjbSc2z2vOB76w68DYnr5M6a45zW1z79r4uQ4EJqnM3GBPg+0v3/Plx39/78OCM/iHL2pBoABP78q7d6y//971X2JYhh//FXeAu5LxMUEmyiRBROiEkIvUxRPhRCjM2bUBhybMuaxuq9PqdmhsVrddK5H6wxz+N8H53Vaj2+pzW/lkLGrX2tVyWdCh0eB3BJNO79AYHZp6B9A6gMOqVCbCYfJxhwUTwhQ2W0wWi5VkSKa0SKvVm7xY7a2LyaSBaCTo90Or3WGxomASJBNypUnvUGm0Kg66fQ7Aq1UypvST4eNj+Mjg38ImDH7NZPpLPzlJ8/uHh/GyDg8DW6r/besxvLN0WVvqxp2aVwm6nZUgrYGMNWXDK96/01qB/xJxql59Fdj4t6zHROQ7gl6leVWr5XdWf+IPaFv7hrTYWDIFfADPI4AtWVH+gqwDZOViKwEkNURQVhrAzMAdGPvLruhF5e+Ux/3z7w30BX64xJYpgbcDXznZVz4H6lKBxlVjb1/5vZt7/7YhvewSLwxJ5yVW/qx8rVYSKhRCWmvqHvaS8vNgTnnNWONArCQBf8VKCbjo12NvdZ2cGyG9dsa3c1rul0yYSTF/ETo668EdbnCjGzjd4HoziGmBQmvXQpsGyOXgDinYKgUx6eVSaJUCuRTc6Qa3s8AQSUklRgnr9WDlnzNxZK2aJUajRGLUmoDJ7nC4nM4w0yCRJFuVEY8zFnXqdhqA2aCzWnVGk0OHmPDS1G0pOCsFUl68WVOCAnKSDVIgZaEcWyDZfrxWpKdH/9FMafitYV02Rfqy8UdHKQjhaDbFH8lkUiPZ1NvHKp0B+ImVmerorexPAtaEiR+e6ONjacxKa/UbQIwVgWo/H077WvmeR26a33dp/yyxi8/2a2f2LXOo2swBj6d9x9iHO565b6B3ffmtJVeShj67QVv5O8WHX2tZVenik/7qAdWKcvb3l5z/WX/3tN3oSbGXz+8fJDril8u3olu4er1E3VvFeWMP0V41nUIgDpiky2m0+2V6BVTJ7KqA3OUK6k0OA2TiwQByABnJCsaHwNiw2LMTpDCNMHMfHcGmeoY0hEYXtFemSZ5hmvNpEs3qTM2sPnTt+feyS0Omn/2MoObCdU+HeLCrvIXXz5Jctnqo0FfK5cBAeU+oyXsteKELXEUbyMC53m3l/V3luYvdfqnaNKvlRppPMP4r9gC3AWuvdcz9QsjrcVv9FpvRZA7YjDZjnd8Sk4Z9fotfYg7EpEHO7DcHzIR50ha/0eL3WgQLtGiMMWkgEGKAWuo3cuGYh7HFAj5/IOiDRrMFb22HRiZlUiRo8tZwCuuGxDHxFhHNIDV29J0RzBc8/tNb/TsrbKElXKEF/LBWa31rhIIGEG/D1Ej/NAACQFeFhsackZUS/GiKEe1vKb86CZ38+33gqQpGNHpa36ef947d8grBihYcZfvY2SpS+Qdj/4J3wwcpWrTT2YvKd4k+ojXlmSRXg+kESaHzXyVwsvReCfY2bmiER3LgqRy4LAeWura4bnOhbXbQawPXZUEmm86HwuHojgiIRPKcnG1pa5Mz06ffRIDlHEYCU3JjAylY5PPePMrPSicccpVS6XWkHdDRJtxoIaGYu6zgS1aw0gparHOt0GItJi7NfjkLF2VBLtuRhZdmvpyBuQzIZjx8qNhSZDkolYoYPauUQ0pOqSgqE6GHIk9HoCeSiuyOoEjYEwh4pEIHJPHbEayY8MNHiavz1aP9dL/qi/wo7fqM/6F9FcV3eJ3w30dGeNpzkX4Db2XMyUTDJ23N8LameIz9EwoNQac1Bvwp8DmUEdLbruproP2lAjUFxlPzTZg9oNL5Af72+0/OaKsL2iajj/xXctbC+dcXurM6h8Hn8yanbWxO5h+6+/UVfdunzVKpm/KLfUlvfEb55eue/e7AZFiS6xMd67d0zbFow+VfbG/qcvsbr+ietfqRbT3dWlvg/rtn5Kl/VsQi8zM3CXN2sWC7FFwhBX1S0CSdLYVyqfIrEiDBIlPJeDxSq8UKrSqlKmixGi1WS9BkMCotqrTRLHHYXUprWoKvULh8FYpjGo0WiVV0dBQT9eRIlj+5U3Sj4pNHpGh/ZQGwwkIIGAljEmJhMMWvmqlRB131/d7W+obF02a9fqF7dc3ci+bM8IVClAwN4YvvH5jsZb3z/tubCiJ/92NF7jx3J5YBS4TMuiDoM4MuPSjqwRIAtoQAExSMwAg9QYdcG5SlIYA8hFJryBVgFFKHXEHVLyLnU8SYOTp29CTF1aK4siIr8Jxpco/mGtKhXyL23yQTwUMor2q0dZez1xjkdd+56sol/Q/03sYp1/bfsf0r/wXc6ED56mUffUMvQ6FQ0bEC3HbD9U/v6l/X03L9knWzp5fH8Tyw/Y8g3qdRZqOgecAAthhuM8BlhvUG6CQhkYd9wMebiGJZ72X2YNknZ4Mqnt/DQ54NaXUeXUq3G9s5bo8b6tw6t8oWCklVcodSnCDh+hTxvRGDbezY2zRkOVo5uGhnG9NESHcamDrFGr8juHbuprxjbVmzzmG+Zem8YuuG7GZrsMmf+/rmyx9Y+2V45x0XTTN+5es6OZ4mDLmv3t83f/UVpfa5+flZ/+J8rHUe1rn9+Ox5D589Qax1T2eGhfY100HndLCuHSxpx4wE5mZBMQtmpUFvBBQjoCt8RRiuD1wfgHd4wQ1ecLUX3OYC17vAHRBshaClpZghjZ7yTGiez8N0tCaKfo1FK9NpfIn6QKGpUNQFNK3agqcAC62F1lI8FrA4bHBaKSB3SOm5liH/i+Th8dmmy2JFAHP38DvDtBkU/84JoppXQJg//4/YFihQleqTzr9qAyf8E9SaqHkbCwbxFxM+GU1iV7X3OqdvGDwzNpRdGrS8+qqLnIpd31lz+8Ll/7xr5qXls9s33L+mp2szM94diR66dPdQA+go//Dawb1rrwebr7qkNxoPFfybe7vgr27yJUJW38JLbjm1wD39EvB/v9bdbh77l2aofey1Hy6ok3/W9Z5DmEfOTZp3iNcgzUxjrhccXS2g2AJuV4CtcnClHPTKwToJwIpkJuwlp2U05QVpIAAESlmbx6/Wmnl1ivcG1CCbbYqFbWZHxAqbojJ5Beh7mKoJ5A1VFPixY5iK/cPk5a3hmiUDAqYaJP8UulWwrH0X/J7l8NtafwXu2Z+54zeJYPyvvTYBbI1YCsV/OrsgYfpZ+T8/+2zGsiNb118bD8Pvbf3Rql1LKQb/JVirqGJcl++paBgzvAPlb7608f6P1t6caVrbR/2mTobhDhPsHvglmntQh/WN57G+0cS0Me3MaSEWjFwTAgTzKiQ47O2sWahPWpBQbyq2lTjWzMKE12PF+8aCCB0vYs1GljVbLDZbyQ7s9qb/j7o3j5OiOveH65xT3V29VvW+71W9z3RPd80+MAUMWyOLCAJiM6gsAioMKioEGeOCYhSMu1kgixv3Gokbasx1YnBJwijX65rEJQmiN8lE743eROM0v3NOdc/0gOb6vp/3j9/LZ5yZ6ukBz/Oc85zvs30fwEyb1KzEzHadmWUVMzArveFOH5Rs+PD4JF9PZHI818skensTDGrpudvpcnvsfidsbrlbg1idH2rwBh4aeYtA194RAkzIDO98Pk/2sY3uaLyvhSF6/wlvq9sZ4zV85ZXwvdeAY2tAFvsSwCMME1rHyltDFNZR/2Fi8oSAFTWBAtrGkidZABzjqRNEkinYwbCyj1w8agsuC744ljVBD/DLeJ5POr0aY/XztVI9a+Kp/oWznV5LmhxNnlX9xrvJJ0jyBHsZ4/mSQKD6+nlJzlSNwGg9Y8IlzVmaL0HfM49+MLtKWh6w/3gKxrynaZqZCPY8mpki86Yi3hEGu8JgZwCsCYDpAaAv5puTdgfn0Ab8Ccnl1Onw90RRslPncOo+cIIlTuBxppzQ6fRFGEsUXB69MQo3Ykv88YM+8F0fiPgGfdAn78KuYIHkP0Qzx5mlZDrRLDGRvN8fSkvY/8B+iK4YCLWwOk6vJdGVUkl1N2rfYHkPvVgkcRVsd7CmRoqE952wK1QGjgwThFJRwaWqpLqyxkihazTcKG4fz4PYS4hYnyiq50KSunbV/ccq1brRae5V5+05ZdqVM25Mpbace+HhpvTOWTe258+pDu2cuZhmQ3SGVtDaQTMiWsd/g6+Bebes3RioXg3u8uWueOM/rr1dD3ZWV3nyq/+lurWZpkQE/lv/Hj+lb1XXO1spx+PvEOE8zjCKEs3EQRoj84jbFBN8ihu40764G2+ZSNwfhRYHMR1vHW7wLypDb49Q/xmbYQKgG6fE1iNuE52NmpFA1md8sWWnXTi3a9qafIQPuMXyz39OWsrg9JbTEp5n4D2/u2HxBXNnStnZ65qdU9tuAx9gY1BvHqveQmPKtN8yodnNGJkSM09JFsymoig2J/JiMOgSGVGrTYqiOV5MJsO55nxB5w3beKRnSFUhXsVbw0Vr3U0q5UeEw5154bfPlYTR4aESiRSPl1/a49YvDiQShrHxuFkJ7O7JZnq6s9me2+87KbC4f/9YaPE+TSrb3ZPJ9vR8fk61/8Q4o6PcrEYaq6eqM3BnaBdrNmDc1MqcpfQsKgJtEcxoAgYrOFcAZwhgnQmUjcCDP7SAS8TCjNvbXuix5FIepw0l5BRn0A/GQTxIyymHK2rAcAgjjBHh7eLhztGhxqDVWDlGjc3AJqr0i6WJg8CsBGCPj7jVLp7V1vv86WfeeR8ZbnsATHpmxtOR0ppUk8cdauoQQu54fvSXFtf++dU/0Bm3A9V/kQPOlWv+Fvvsyc8PgcU/S6c/6/51bS4Y2IveO8sV62iYcdtXncH+DmMuMse7Xwm1t8xsWdKCrk2D9eatZrjetNUEE069SJbelifYy7eCB/N5wGclj9OuS5RyeqPxi4VQqdTEUKzJoS6BibVfbV8ggYaQHPu7Prn7p5V5jSG4mNExSZ2IJjaPvjceeKNr33PpL3eOx9n+8fFNuVPJ4lsg3xhdI/qnPRX0fLYyu5Vch7xUhuubwOwmsFYC08RzRLglek0ULgUASEkpBjGIxuC5JZNMZgngSsTbDaglZvPbTU5bizMl2SBCpkJzyu8PQr3Jb0hm/MCAL6gjI0V1Hi09FUMlei5UcHVI+O1IKf+irXNn45BM/CeNveMTC+NPBFaCpjYXkyKrsamYrTcGknNa6XTaWoQB/OXgot2nzaw+BDx0Hubne6/sOqfjntVfg1urW9TptJELwa4yuGMwnJNs4bMXbal+WK5uuyTbbUY//fq37aOv98xWfQ3aR4L3S55Zo3QmE36nz2zTMpmUxSgGd+MrXUxMTs5LQj5JXFaUTBuM2pzPImVyxmDQiTpzOhJVGUPkeWzxR4fIfXvkrUplmCSYsNUoDR3u/O1z+LoeKtatBbXbTspoSSO9daTZKrcmJmaV4MFiIlyxW13N+f37py+vZrc4NXv2IL/VH04agDNz4WUlMYWURPt0R6ZyQ/ndlQtFcbZ1wQflln7fmS4LNg4vvhiK0P1B85F4f3QyPcxbSuclreBqGdgdAXc4LHWl0pmeTHcyIfX0SD0ZKebG2rJhfGLtdc9373Yjt5XpLLbl85meHnKhtsM2B8bfoKMdw3AOxozWTL6t6C+EOpLOVKrLBqDVyHQL3bC72yiF3QF/CBo5P9k9ZC5FcYhsnQpGNLX4qUDjqyCPPZnD29Xg54QAqvD2ESzWSu1HHkGNmdKHxlgpeRs5myB60gSRaGs0ecIUkTCI1inu1Zd4ENVE7Zr7q9+tftIwTeTd6kHgFSeMFHFCjuvp8LWDN30LF4tTMG6uTqoueQ39oXpm42QRcLDc3jhbJGJe0dztM0nSssQaZ7n6aD3fOQN9jP37DqabeUnZgB3dTivoKLYWCpkurJBuqbtb6sT6sWfa2gFshfibQit0tMJWuyvkjUTwz0W712H3dmOP32t/yQu8Bnsm34rVEZGiofakOyV1OoBdiJABYYI35I9oBVMn1PKkVGO4d6SmjLouhop1dRw+XPlibQwJb9Xxi6WuAe4EVaiaiJ88UgThjZ6cMFZkgiZoTUgJKwJ9/Ovq2ydMF/lw9NftDfNFcmB2uzUi5ECmN6ENtD5VPVz9dDf0jXY2zBkB/1O+sGHSyPKdmWTUhDGqrk3fd0W5+jrVAXt8BPVRO9DFfK4InojeLHsEX1C2eEJRMrf4AyVvsckSaAXwoPZ5LXzBARIOfAZamxc3r25GUnNrM/yg+PcidDSDpZ3ndsL2x4FfkVk2VxAAqQNcKSCDoJNcRjHuiItxGA/nEqk2Q5uvLdOGjG28HJZhQM7ldKbHwVrFY+sptJBmczLUjs0gpifVzop+hY4E85KCdD9Y4N/nP+Af8r/r1+z2A/+7+NbKV/KVMfKYese58DYhJ1pRoZTvr4yUBkh5+CFKBZ+neSigFlkSWphsLXRATk0eJNQhOw0Ds6jhalXvucbsH6Wp7fvX1SP75XQeQuhzJxZdvHLre102p1EQTI5Jm9ashzfG2yatmtR5XyLde8rXbm2+Gf78xjU9p4sfBiOlrpzfe9aA0rorezVof8xm0Jkmddx22wWCd/qUW6e0tK6q/qDbt5Dc78ePsh3oAONjksyvSCXFR0oqEpc3gT0A8vrdesgxESECLTVSavIFBjScR3DLdNKax09G632gGE28zFj2WSCntZLmirDgk622kMTrGF/Ep/iQBfk8OejXaBI5RWe0kt/xCU7ZqvGLguOAA650gB2OvQ7oSPuYdIyWuBr7jdBIR90PC6+QKsVisVZRXLSWjqhjQEcOlbItBZV8h9YSD6jtEhK5FSakWcdghIYMfxqDDx32B7rONm2/c/+Gsy654ufnn3JdjrO29TmqD7+yo69VmXfjiuf/MLNjh5o17WgfbZ4VaL86Dr4Bpl674Rt3bbmJYOG/HT+K/lST4XtKxoodf3kD3AbhDuteK2S8g17I8YlwAlr4YDiYDyLyBUvRQ4SgYEkiAYsx6MEi5NGDCItQK2DxaTmRjGYX8sJ8AYtPMOdsUacznFPcOq0Hi07rjIp6Mn5DbacU9AU97NcDXv+0HmKwzQuKQJiWyI/8RJ4qqzLtLFEpkoZpEdnYLMuvLNyx0mHsvtZZ8TEwc0/YvwJlK/pTo0zFcVEfJJJdSEQMPqKChS8TwaqirmK5LqxeVP23azdQW3JbrQY7gq3J48rqdRDoNWB287Lmdc1oXfzTOLw4fHX47jByhqQQvDh0dejuELrMcZ3jTgdySUo/KY0N2/I2xCHboJFJ+6VlQR2TAVZtJiexitbj9MjaFGeRiefJAyvieW0UC+wg0+LPiFpFWyNyPqIF2vz4yOT6uHts87O1ytkiFRr2WunQ+wGfWnU50Ajvv3zC/Qlpf/TE96//l73/OnGiveXkHD9N61+ELmmcYC+/8fYJaX2KzaZhOc6kWP7ZJxgT3nszfTHZHbEI8p1u8KkbcGEyulwnukWoE28X7xXRpyI4136p/Vo7Ij1SUAtdMAGPwf+BGm6bBayyAAu3yQmcpNFvEpNUGE4g00iMiAsKnEMO8qF8CJpRKBQMKtjY88EdQagegQ+Dx4MaLuhtwTtFMhCP/9BI7+hzK9RhGWozVJ3Wy0cmOVSsnSRkvqJWvT5A5zw5Jji8DSN2iBjHyBNnXrzt2XUrLqh0h3i9bmrvqkmnTj/tm2fNb5eDkRXr7zh4/krwyxeuv7ljyjmLE3alu6t89ve+veWGaflLyaSMb+/C+2/G8RtQAcstzjQxf1WMnkIwJkeEsEgI/z8ilLJx0rmxxGKXmTQoRJQIXBW4KHBVAFFCMzVL/iF/nNdwRpPftNyEHAT+PphEfo02wjllUl60JgUiqZDI6X/oBb/wvumF38Kow/lgCISIcNv6zcBcI/535kWGEfBhQEzeGNHH8NaNSUwCO6AJK6vnMi2s0Sfl3cBt1WGpkjr3fEnl7ibtZCSLA8ioBuE5fLWpYq0cUZM75FPtvFPyFCxk0uufHatWSra1j1eROmqwG9tR/EK9ZAlv3EL/2n3fWdcRSpnnnnHx1w6tX3F+ZZVrx9Yp7a3bvvvZ3AeuG1h41bqOwl/Xzz99yznrA237r328Jv6/XHDmlVddcOH+DesvSURrvufvNTcyOYzj9irNa2Rw0Pq8FXJWML1jccfqjlc72HsdYLpjsWO1AxmwP7rLvN/McvhoB1GGlDYlDFY5I7J8INgXYrry5TwkNfUw7yxKdt11TaBJ35UzGtuI22qbz/fzeHMmnU168Z0IiDCThEOvVUaHjhzL1/jm6dGuDPR+MlyvgyL7UU2FfYnv2hCimOjCTijpYX/fV5yEXdgv6Fgac2TJaO+GxiU63XvPpS+cemKvkrPmzhbBOw0dSyouJrVTCrajGeyx/EhZtaYIDoaeD0EuBKa3LW5b3fZqG3tvFEyPLo6ujiKDb6tvl2+/j71Oc6cG9iPAozDKI2xEB3VJJtPU1VRuQmtiW2KwKVaQIjpbyN7nvC4LmlwdOY9RYxKwwemWiWit8wP9ARiIZV2iPfmOCZi68W1+FCNjcrUfwjtQle4RQudPBTzsG67NpGDGxTtmLuuD0eno0UZZ1yzrCcLVKGPGM2J1+puM1Y+axwWtmtfRnQ2iZf+g2tDXRm/9jZ/MHL2yLuPzgYXY2H98c4JkIdOF7eqUGufsC8okA6k/d7nAXhsw42NrHjGPmhH5RCaXsegW9EMsxaN24DInzBCabeaYGVnMWuBhOb2+VnCuJwXnCVJwrgd6Iy/xno2eHZ7dngcpCW3AiA95AB9Lj5kHPAmrhpiY/jCGamBlZFNkMIIiH+8TwHxho7BD2C2wwlcloq3QQvKBzQ1ctMl2um+T0dq5141VjU9Zvekne85b5Q4vfPL7lQVgdGflrO8Pbz73RkPH5LO2twoa8G8/u+bmjWtvcfxm97b9P1y7/rZrg6v75lwqLj2BpxdwylImNs1caWt3znRCYiOzJnSpEXRrgL6gMB7sPXgUz6BHY0EejznIK7xDfgcvnH+Hr1nX4zyr57cfxtKus/N+pgdbagS9TS+pXRQMaRJawKxkBpl9zBGGMzD7KXGv4I1493lZHnk/5sjwjv+hnfP4m/96hDTMk3EeD6eaZTrWwzytLBN63yEOcdOiwjEV4tfbZo6MfIzlNzA6UBmi/fQ1TgC9ORWKyOaUrZXJZpdtPkbntTTOYKmFdb4K/++5Fx7+3lkN/L+rNtz01MbVNf7flb0T+X9vXTvG/9unylzDYplnmFYQflQr4CvZTczkzXi/us1AZ77dfK8ZXWUG37L+xApdVnC+czt2zH3A45zlXOpEGj/QhMCtGF69F/okxDrsYXtTs16PvxSa9Y7mZr0uDDh7c5NDH47rgnxKYZCAoAkhFOS9Hg8hVvYQYuXjHuBxtQR1RYk3bgmDsN5rdDR5xLjuWh0gFUfmLMgSxcUGjcBotA/SZG6757CXaQYrmzc1Dzaj5o977fPt0E6usIEjI8IQ6VAfGBkoVbAzVrKq91yFKuE50jttLY2Je5gwB6yo7FSnce1U3W06PnZgoOa4EWxB2AGSiXbtWLdMohU06ITkcGrRaCAnNTX9aFjvxX1SfCeyxqM1pubskvtrPM0frw9afSihHwyHT5s2+mZH9Tog5bcs6z0FtvedyXf+wWZfsU5VHojfRMmbPzDb/EHd07JpXvWvl2371d3zV00/jXDS4bMTwHhEZn6nLG2zz7DDq1rAeu9WL+zylr1wiXet9xIvusuy3/KkBV1jAXdp92uf1CKDIdokSem0wD6I0YHbLwk6HT5/kDHLQC5KCms0hJkkMKNkkuEoKatZT0hZgQU52mR1+pwdv0KOEGTayGwpuBerjwAUwxHTu6aPyHA7EgR+uJ+SX5Mx5Vg9GGmQ/kSP8Fx/rTlUnWZTYuhIogq5WEv5gVqHaKc3PzbKE9t/aZxPtQF6jF8GDrVMwulQXyHhv2I7ClTmLt+8c/XmT569fM21axdfIsc6xOKqxS35n9oCWf+kyd60yL+wbsnNP7hpWaJ5+rwr982ZceP2aW2h7OJYad55na1LDrLaeFKnPbx0y+VqXFPBMndimbcyLyvr27IzsvB6M1gtXSxBOspmqXSudKmEbi3cXXi0gK4rgFvh3fBRiGQ5aPVKTmcz+yCpFIpLzTod5+YgR9jDjdhQyWHeDcxuN8PxGZDRE3ZkaOGY8FD4SBjZqGxNfDFczBeRCxWLPCldVvtzD1JVAKadypeaoBKR68iKCpnTkq+ooI+I+X8V8kRb3yqrFBj1CNMEUoyx8Wcu5Ny8eufm5XMrvh/cvKSt9AIvpr2TJ/mzAdtP8y2LVxVJ1cMli9det/ryZz/57Mp505sTy3yX93QtPYyBZFzLHlzS2nnevFJscTbUNm37jTPm1OXMPoLlXAY25dq2jhkd8HofWF28uAhbi9OLcGnx3OKlRXTrpLsnPToJXTcJ3MrfzT/Ko1kIWfW901C30ZgJJaRYrNv6IN7VckHq1umcbid0ml3A5ZEUq9GY40VgFkWzk28H7S7eGXZCC3L2TdPpUvawrOOwhTLoAK9jckO5IzlkQyqRiV7p1evJECq9npSbKO7d5pfM75hRwbzSPGg+YD5i1pjNc5hTBDrDm0xZr3Xl0quhRHxo/Kx2bk3QzhcfAsJ0gg/KcKOexo1Sg1n66kprNFrsIzVLJcStD33ylRQ5eM42s2Acs2A1q2W1b+2ds++fqrfQM2Aw1gxZvad6BtaxnSkxu5WW1/n3eai1uCywbDzDCFMGkNGWtWdoER0DZkQMAB6NzREIMJwoOGqj0rKEL7o1x7mjNhSS+n0bfTt8e30P+p72veP70Hfcp/f52FSLSVdoocX6dFDUwIi7E+SHa/3qw9TrydtqPem1weHjfQvjG11HEig10dZH040DTHwrz1h/xuAzg9u2XfGzy89c/+MfL7xzpX2uY9Ikx1x7/11zp/dfd/auXWftOmva3Pd2zOy+6fpnn91925Q5g9/rnL6xd6khnTQsK/ZlE92nHXxgYaeYYsDxQnUGXI5uYdLM/Qchb+OhwCISU4vjnZkQQYcePI5eQNCwCZ+X6DdBSnR7jxsAbwgboOEnYCHjYiKIU+K8N+yFG73HvZBgHGj0erOZFO8FzchbAC6rpFXMlPgN/62ksmJQy8fC/oiWtjb4huvdwPkhMiJxCKj7tTJw9MhRbNKHR4eODlfyZIrfgMpMEicz6hsStScV+9Tzz3D5Qw8tJ6i7FJa7e8sYl//5zwFp8mkwnl7uNz80uaf63xd29zV1hOUlldXyq1NnwcBgLCeK5fhZo0dVP6Y6g/oxGMkyv3+C8ZAoWlSUV3WAxxLPJaA+AfZ4wRbvNV54vQ1oLeB6zbc0cGrPwp6ze17uYe9Jg6nphemz08gc2x67IfZAjOVYMhtHmYIl4R70KwI/0d3JM5nWrtZyK1qT2ZKBrZk2KaW7rgRKocm5iNEbcjhE1d2Z0kXsgjBf7BehmCmFROLsMFNUP3LM26F7boJDqfo7WOa+4Zr7XWmols5O9H1OELL1S3wg4Ys8IPN5A0+vXFihj/33fu0mNeZ57sq6F1QPedZcoMKbn2ee3vr1XHEOeQQXrLlcdYRmrlGDTf+4bkIclOgFnY/xZYRpYg6qEaZuopcEeMz3nA/qfWCPGWwxX2OGpMASgqmZhZmzMy9n2HuCYGpwYfDsIDK7trtucD3gwioxEpVksEqMgzzLZ+Jd8XIcrQltCcF4SJTCAd11URC15XIOo9nGcUyKyJ6f7+n3QE8oahPfwQrJE5beIYJCGoV+aEzqJ0s7K/1zAbeXUKNo0flfKFES8bynLkzwRSLsaP/8kwbhAWoT78A2McP8XMmcFgPrLVstuyzo/iBYG7wkuDOIXrcArXmNmYiP5WZzy7h1HHK4CRORzcWSPvRIChlQKiEqDMtS8EZGmLCgaxML2FyYSCdjZFJ+RR34gPQoneZ1boXsecegjbAU2Rxav8Tr4pJONZm96lzC4UZfheSmidu4QmX+wC8QVCe8QmoZmEpdloCGNRsEd2IhsDqTQY63RtEdJZtp9/NPXn7Rjquea/6mw+lMJExTZ6y/YWZvx9y7p3WeCmaBwbCr/ffzvr3niWdvvLnZXv3D+r7Zq5be/PjXH40cOk9SYxvW6nQ0gm0m8W3Sind5dkMWLrdvsEOjxW+BZLIdtGlSMR+xowd9QdkXjWhtMY02wjblso4m1m6LObIRrVbMOhzZrCNmsxWaWEcT/i8SY+3RnMbWlNWaiv4Ugzz+tFdbNPHt7Ex2CXs7ey+r4VjALXKAqxy3OH7oQC4HyWTRLzMcWxzsPY7HHPAyB3iCcrndn/1FFl7bBLSaaITlsjm7g/XKTTkNy+Zt9miMZYS93IMYIcoCmTwM83kv004NuJdMeCaZxeHXyIhhjA8IGRr9QvABdto3D2zGGiBFNoR/Gr9OSBxIYtdDv/D4DyA0ECV65dXqonTAPe7iyL0ANOQR3X5QTyOCJNEbBRZoRHZEwseZNU3xliuWNCf55dWXpA5rETwYWOB89TU3Z58HstVVM3pNbeIMtJG1BmaN3v2bs6afU5jamZ+Vjb0OjywN6jlJmhEtVrXQ3BG06H3SP75z112hQLZtaYzok8Hn4QaszzCTAZc8ymuAVeMjfDZ63iYHPWZBDpOY65tRSX7fD3Q+sMS31neJ733f33yaDjfodAC99TrrE9ZfWN+0aoy1kILbkDS0G5DGAKyvscdYqCG01AGdXwhaozYhGIva4qxfpxOjNkc0agsKQiHOOuJxdha7lIVsXAwKjPnJKLjXBrbadtnusqGoLe3XuXj9S/p39Bgn6pW0aFZyeRmjSxeoB2lzTpcQNIasbJT9GfvvLP4D4iyy2qK2n9n+3cYixgY4NmpL2nV+o4cBSAl5XE4nWZ3BYpWddo82aTQSnQ4XiR8rHPF5hotFay2WS8eE0opyGtnNl7ArTNLPdBTvazQPYaXNqLWKf/JW4vpO3BUEZJLIz8RxFkBHTisdTqFWcbdD6gCrWLJUxDtlbEvcEJxTGVibi5zCmv98v9a4bPu5hZ7gnEtPyZanrbr//Oo+c++cUmI6EkJnHavMeWzqfz4fDU/+BZg9O3RVoPCt90dPabv9gZkdp1wQojUk+B75K9a9zHxbKWkjnFnmtWEt9LLaFP5eDilMH+TDst4io3AwpzFaE2lk8Sd5LZMsJKE3+TiyKD4UEZlkqsw3vdQEOxY0gU1Ng017mlBTm/A44hWHS+TLgwagjrw8YnjXoOEMGN9sPjp6FF8a2LwdPUZn0TD0KPXWsmNq2ytDc2FZoIlbGxK5Ywin3jxoHRs30xC1RH+t/qX5R1fdLdstrlXgGec6O9KYCvH8+m0YtwRmgud6xFxY8Drz1cc2wRVPP6TsB32nR2VRnGtaWH3qvPjyqOdKcLRsyTt5UbS7rxhFb/hIOzyRm59wsGFcpDAPkJkVBNqZ5TtzQBsBXDJp7QFk5QGdqJSZHqEn0qP0LOh5t0fL90zl3b1u6EVuLLmDJauo+MqhELlDCoR7NzQUgh2EzTcSQqH+DOAz4Uw+g7jMYHOcEUqWXLvODRXk8wOvYVxcNVQD8hX1qph7zDc6dIzeFSsqx0aPEjyJRUlytWnQyIdfJ0+r1/G0fnHKrPYaFSsW6mQiSdbUEm1Zvw3pE8Hp1S4syYnZM/PilkVLVckTcYK+gfAZMfeV1cAsodkpUHEioMZ41Txa4dfHKtIkrIPqU1gHqozx3tyAZTyb+Z2i34cAAwGnmUFkpRBhdwFtM2jjZ/Cn8+g2HvDOvRzA4CTX2hp2ithb38SQaNYBZojRMHMYCXBIKk8Ji0qqTLlGFD8ROPY7scBzQi6SQ4RJE/iRkVXoEO5YMiNbFZbv7wB8R7gj34G4jsGeFiY0JZCbrpNS/qSB4vdxBWBYOcY4CPIrTtIG3uwEHdFBBrZOEnZn6qxcX97D/f9US2jD/MrEokzDV9SV4/lLG2o0U7fAga+sNIoLmvAnUXMjY8Te1KCyECn47u9F8xFEeiYVkMx+f8Lm9DsMYkjhJWBGUl9CpyVv2qHdrYVaxl7eh0F80iI+GAABKeksB0m4uEDJBDXEoyKC2zx07OghjDSfqxx9ZbiiGgqClkhCQ63X7cUvn1jZ6nS4T6hVa6hnvbFLrWftuu2+olepTlvjNd9/f72MNXefJk3LWLu6Pj/7/cGgRRQ7gqe/Xy7clu2sVa+S2nzp+FFYQA/atPBOunfbsCwQtqtBZuAJxoyBULrvFNnGlN0ipwigzDEcmCpwEZLCJZncldwmbpAb4rQ2RGPgrV1qDNzaVJA5LhwKQj8w2Hi/oK1tOaDyytYKBfAm+5gwJX5MypPJGW9rn0iG2GAsIaqW+kxZm4D0km8hGF7vNEIuEe6WENTHw2eDY7PtXfgcJBKtgZVV3zxzq53M5kjh9aSwbpuY2xSDn+P8clOgNjK9RW+SnVnW50uapURfksEo0GxowpZRMVtlIgtjOa0TE0mb16fwPhBCPspzh3/oM5fD+EqeesT2rg3abPlmqmDsAR99ka6MzlafexSfnsNq2G2Y6cWouPcTGk14ZfgQPW20NyALXGrO39FwTNTkSfyE7CA5WjAJ5iUkraXkn1HtPdtjbgpE7ZzFp92jE8aYP5q9XTaU2VnywuqWwQC+AjpCi8Fvg0HztJfg+yr5x+jMwECNuwR/4rF8IkySufAJJoEhxZRkqyxG8KcYbw6bodnsWYm9KAx6XMDh7HMxEaJTb6TsCYjOpNYgwbLWHGW0WBzad/Fx0KZTNXEcGRKOvTIsEDkcojWI6vqH3hoYem1FZZhckkTndMnqlm/c3k5au1oCrTECICBP19ux8LT2sYXecgsRw3ORQoEu8bQFra2nvasu8PMXu6oP4MXDjjsLoWCzevdNqs6AH+G1hpjvPMoEQBAFSGajy2CVAy6Wt/B9An0bxmSEKG4Bs48a4Y8YPXmJ2OR9+EGrR0zEJip8UqejQSYyWkMHpr6r+0gHGZ2gi+hW6g7ohnRHdDr1cR9+1HA6XSSsxkcIAK/Z1xFKnDuwmZmQMFZTPBMIXxozw/CjvuKkfS+MiSHncdfzvzTle/RD9D81jhfnG3G1aru+fnYZXn8r4JUnDB6wTXe97ls6xOmABt2K7kaoHR6Ez0P0gfPvTjjHuc15vRNpbE4bnGE73bbGhjyAAbTF0e251I09ggVgJYBhkAe9AJtX/UoP8BSmMacx52BE26o1W9oEPV8ItfThfz2Gb7GY5FdEA/Awbjc5YfPdQENyDEyow3KtBVrMZk0b0+5o0bTHynJIbElKZUYdDhdJr0xvSu9J70t/lObSZJYOxl3HhLdHhBeJREu1CTsqdx2tT8IeKK26+WSkl1DqEAaOzeQ9m4eLlTE2P6ZWdYOdUdrRf2KwVKgR2TknnM1xnUTZZdU9u848d+X6J2/fsCISXP3YrfNnVK8E51Z/ubGpVD+hY2qCb6ON1YT3nM37n7js6ovWfNfyx7OX7AElERwWU+dVO+snFSmq7qpaqjP98fe0KWyPFzAjylIzwbkcKUNyNxWmTtc4/NOandoFBOwaxYLBIk+SDbz8C/2b+v/Uo049miRqojmoMxqnlidBUZlexuC3vLK8qbyv/G5Zw5QPlKEZlVtdlCEQ/9X7XAdc0FUOioqj3Mvv4B/kP+RZ7A+aEZ+gvPgx/KZ3Cx8VYKHcKjaX9UIikoArE4BJCIl9CZRILDxV1cXm0tHRY3SXE8LPAQIljjY8HiXQ4ihp4cFIkOTeyEWAr0L6TCnFJZK5b6BBOQk+l4ptvSD5hfi5rb3+7oYXtanqn7Pn2PvXPZW9987vTHaZ3WvAIfs6B+tPLJHPnwMh1Ccxtn5pqwvLbH5r26Jci+cU8Oxqr5ncqMnFm35+jrDg5z/f17kd7FoSbhXFMr+wumWgSWmbacyCR+eYKdqeZSUvFpRgUxv405V+M1Vp9ft3ZLt41QbpqzNq+vzzP9Un5L9Uof8367OuTuoFNaiT+kH/F6mTeE5n/79W6CiqKRQw1uoMzT3oQWYZsDzBLDn+xsNYogvItWLEWuWXhJdAn9ZAnt34mjEIiO9MiqjHn+g2zAwps/oI5f+Rh7Gi5cePH1a2Y2W7Tk2c2nYqKshz/KdqvLnZ8xfrLA58lWSZTqETdpaxonrKs5K9Cjbiu5WnlZeU44qmXwFK1iEWyO01SO8slqT96Ggt4j6cGhKzSoJ4Hx8mjidgolzIggVZwGSFLNyY3ZGF2ezyM6imsaqP1usXKX/1K/gV0ss9sJla3Yq1Fialuh1oOLrEp8NXGFY3rQWVHF/K7cQD9wl+QSOpzsmW1jmWTqeOguaeF/ZN9BOwzs+9CmK4nghNr7aMq7zoLVe76yon3F/qhlnYuegsvGU8fzk6wWs4iHW/3Zitzpkl5B0CVT3Ypaq+6rwigAF0Z2gRWHEH7f6i1qA/3Y23D9kHJB+D/ob3QRdz6xNMEes7pjfL6SJgioDThoA1m+tr0lnyplyLDmNJP/LZFTK4RunAzlrEzncRTMUDAMo6savMt73T9mEb4tp68ryYS26Udki7JUS1KW1076CtIbTqHEOrmqtcoQBr3I3rJcW6GFWo1PADE/xn6pf9c+otZ6Pn/LdqNzlZlE/tpMa5ibxqRe8UcS4/H1xCaNRGz5nYPHcTHGxgU6tehp0SeoZMtf6xLubmJ5gMll0Iyy5LxhYBLk6mMPJJcy6t4zuw3DpYpUjk1oXlVmR5t8PvNMgMJ/LN7zR/2Iyae5KMA3COsiC6y2JyY3BHcHcQMUEhCIMLmE34YCBGldwxMpqPcKSOkN38pbJrGLj91fjoGpEa+zu1aO+fMdE1nYDe9lz6Aiz8MxK6ua+LDZjOdPy/0X/h+yTB/EaZzOmCoZCoc2N74XZ32D2ym9wCGTf4o/szN8yTAI7ZHXRDCwpxbqRjRL9fCmp1FqtfEQw6Ejot6gV5qu5sHfymDuiCWj8vhkUolkMFpjykBbwWaFOMRbBgo2IpcwVFKLtpVswj2OWIGzBuwR1xD7lZN+MX/BE/8hNZD1Cwe9Q3Wo8lYNGrzCKb69Xk+d4hLHKru5OGnLFV2cniX8lqtguHBJZ0tKn3RPzEDiP1sgD19CH6r0i3h/eM3m3ztkWqz4TxQ/dkewpEIGfHr4BeNBB3zR3VwddH313sCMTjcdcpcN10bKlGbwS/WOwMxMf5RYlPjJ5n1Fz0J+wo+jZTYqYCv+KLciFR7psE+rrABn4bD3n9Rv0OPeI0MSKKqVji78Q+jEGMeT0oFpbSikQNr3Qcn9596QPpdzGMZdNpB+yUrO4QtpO9EqcwAH8wzRI0xCSSsBFrzRSbRCCKLlkMk4hab2ZvhtXjYyGgTMbEkMzOQZfiUgSb7BpL57jCLigiV18J/7RWBvIox8tMXzdtmDD10ymJI2OM7NQFqReoWdV6dXwyRtQKhSKtDBnIj+AvKkP75ucqatqXZnUqNYNP82I6DJdjE3PjpahbZQkmKYVismSNj4/rIceE8hPEI/Vjw47Orv5obca8akbg3wa3Xf71F8DX510FylxEMFvjrvIDA7uxOLQdCwaC+uyMy9tK4ui/FeKl6kj7zG+u8po+/RRo2T3XPfns1bs06K35zoBFX33kquqPTm2vfrRA0LQ0nwYeviLgqK7Zt/bKKWp/3pzjR9l/0DqDLPMtJXdHFtzuB32eRR44x7XcBZ9w/sIJ0QE72FdLnnMMFGAEXzVaLenMMOitciSlRQFRVKdWGGVR5NySoMsEJJYzkp8RLvaHYzGTg9blNPnI43wToEqgDQIjbnKfkvCItTNPEmnuzppUSTK9v7E1QJWtUG8DIjUHTtpF0U4r3EklQqnI/mNe5d7H5y15+Hsr5j+1d3R0308O/v7pp3//yNJWf7p3+fKps655EvzwwPabn3vutsH9wLTr4ot3ffYf7733H9WLy8mNV938zos33vUu4WmYXi2zJHaSZ9qYXuapR90Rk0Dast5VFmGn1wmB3u/1Q9RfBHwRmLRJ0a9IjCyEonJGBpwMPpD/LkO5Q8oFde2tEus0kgiLJWEs51pZ0Smay8F2xhlxFpzI6ZyiFCip/dPMSySzo3K1r2Q0HDOlhwhspZfQvY0Ir60g5ENkb5ZKhNy6WDxWHCdaHCnSsknVqKgiJPIb67Cqgw4aZpoE6rRiJ8SbXCrNX9LapiGglfwam7ro/MdouKkWhHpm48WXbn5qPBT11PqBJ0tdm96qbr9oclfbZPDy4Su/FvgljUJJtQjVc/aLt7965KrtHmBuDFX91XXx16q/+cG2G/Kf/0cuhlqt/cu+cf/2PRhT/PX4e/A72LanmDOVdoMO+D1+rzYVws6BHSHeBKzI1Kkxeq6BdlFhkv5yJKLYXfLGCFAiIJJh9ALhda8IhwZUC3wMm+DiMSwsLBXSv0NrqVsKFWm8SLqWhT0RcTtVgAC/U/1T5sLLilKqmIhWrKQ9NiouB69ucWpYv9UXxk7Siy+GogW1LxYcXJnK0L7Y6nd2WGY7LTxTXxPeU41rYv5/syb04/qaPv9Bw5ow9rsM66mF2aYYDHgNTB4EUZ6g/h6M+vNplo8E/SGth+N4K7BaOw3GrIR/EQOTUvAanUdUImVJouuUgCIBqUTvWAvJ5dbXSZZJLTUthaeLJbu+ocmgFjUaay74knU3wBN0GQ0kffHqT8QlR0e+/UW6/fytBjhCsVyZ9nYnmXWKpEkAjC0ESygU7osYYjEGYf2iTlFnuSZmEJVwUii7yMX1cDimXmBWLIN+F2BcgiviQpyLSQuHSMQsq0KIL1F2Q3u31dHgP/yTtu5aUzdba+l2TWzp/vzmWkc38q52NDZ007wjfIZynX5dMXs1QONpVHespm4hZO2ziQ4HE8QLDna6dFnGIYqKNclxteXSKLmNLJcDJJAe4RDHMb6ScKhxwT7SJjxhwY0Kr4wHCk9cqrNRJI2xw2eoyk9oZR8Ty0lK/wi6T4+PS6BFlc+oawIGddf6+X3MjicYw/GPHg5JspcUUbRYrDLnJNwvSL/VtcsFGQgsCGokt44G2xkWZDQsxwSM13CiYinbbDXp0JkVJiydiA0wNsEGbXkMFusnAR8EayeN75E7c1iNmVYoiFEbjpwTtkF7Tfl9qQWtW2uK71t488Yp7Sg2+9abRj+tKRucc8P5V7Wk6T7GZ7oMb8Zr8jMXKLOQgFckCHg1OofbkXSgZ+2v2uECfIfrJZvOT8ZBuQzAoKXHVm8B12hFxV92826QRW4Fr8dNDrc7iDEXzQ+oyziaJzPTNtdWQddAllD/366VEzbmMOHN1ewFYfvW1gWpvvYpG29e2KdxbqmWxd7kKeinN906u5Ruuer8Gz5/f4F1NsE2bfgSfx/bpSTTCkqKdZM8KO+REb6h5YiM7Joo2bE7i7Lsh1nYDdHt0Xuj8I70fWkIARDjMUc8HouDVKwjBj2xx2MvxN6IsR2xWbG/x9CfYsAQ88UysV/HWL0pBmKwWSK7eJDbw+3jNFa8l4WsFPAHtUniXADBEBO8QdkQ3xrfFUcz42BWDHhjoBIDcfy7rD6pVmYpOyKAjwA7ikRcyXaebAILgbTlJr2oBK2qsVB4m0s+4gILXCvxhqLz1msjv48VsX04mgXCkLWzNvxgLh0HWBkgs2wwLBjyUddupNaWOVIqqfO/N9vqZTBYCwMEQpDfTgNiS2vJmYkj2Ym3EcFoy95AnoFPGa30fL/639Vfe516g9Fg95Xi1dPjXV6L3V+Kg03gmpcfn2aPn1m98+wl2V4jZ9CfN20e+FcAjjOLXaF4POGcB3tOd4bif/5JvvrpSt5vgF875VxT9R6Qq3HNN+q09WSdasd0KmWlbgndrr1XC+9ova8VSomEyGocLKthE0lNuwa6NQc1z2te17Dtmpmav2nQUWzMNE6NpHlVw+oRfpAKEh8Oh3eH94YfDGOdhsPukmT0GwyM1+VXEm6thuqU3cruYtFMFszSAGwQKxrAJjQS2zKmU1InjXWq0wnJdm+9mtRbDoVaRMVtLAvCmFIFsEBYKUBGAEKjUkeKwrH/77RK65kQtpCNIZGG4tM2okY3iKpsczXFYq2eGbdPe/zl6tbqnnjJb7d4u+Jgf7zksxsMRr3TC/BVV71z3rTz9AbO2JtdcjYaMPj5ldVP8z/5czzkPB32zHMm4vGQa/FxBgDwr6NnLWzNgeo9pnNP5Be9ksx5/EDp0ZvlZsKI8HjXC11vdKF7M89n4GPh58KvhdHrPnBxSi1khdNt06EpnUqJfdMcfX3TsOyCSCC7YDm+iwSjh390Gpg+bfG01dNQ27Q1066ZhtzTwAvTwFV9j/RBXV+yb23fJX3swb73+/7Wh9r6wJY+0JealmbZAt8Z7iQTbVgD6mxTSgpnk0ttkySloAsQMx0VZfqVt9GvSlJvlJmAEIBOSnLvcAQY+hdJ/BSQQVNyuWBIJwYU+t6UwULfG8HPbAgF2jpDHUqHwntkvqO3A+ZRByORMnrpceT4MTMTu0lkL1BHtdZanR/7fmTkFXI/0kK3zjxDWRay2ZoTcOTFsaiOumXIpiEf9Yt0p0ctdFLLTNQaz7FuVmfj1emsX7ZfmcYUvrpi2bZT+xryc/Ty/d8ZTD+7bMFc+6J67i5OL2IQ/l/4S5mxOOR2zTewffihouejgEyj1NIYTZh0Crrx7lDLlxGp6uQRfkaDOkVk6IXt5a2yN0xbkvXIoRHwo4YxiWElXGsmCYfTKVpbb8QPgwyYT6hShUOVes9OPYzQWevLtnVSRQzTIrPGb2tRgwl1yycXh49VjKDtYx2aJxSGqyUhYw2Zn+cmloajl4FA6j4aZVMgs1Stx/9ODRGfxQIyJSTFIlGejyQRkx+LxT8YVhyqmF5CAAupieEtGM5ZeElUpCARVxDLJyiS5kMsLo8qLhNj4jHUS9KAABGZKBZbThRZcYLIah0gpF5vXGz4G58wTHcuQ8p0KhMFmS+Nu7gTq78JwdGXltm3TwYnivPkSvtc82MXTJDpgVknFdyjhVf0nzOgyvUWLFcSv21iLnqCyda3WhbLMDuYVFjeQbeaAz87BgXFr7MR2YWwsGx6DJE45E4TyaWZqKjXNxPPHzJ5Wgaf/2obST2YtQjtCR0tY5M0XWoTmAv9rmvpuvMPNueAoSWcnzO5pxSS8SsbH6WvRJvKvd1yuFT9sKOpb/PZ/deBv33fernkOXNpawi/smlV//VV4/fwK97KEpnwevyhWqZ7KsUUmWFlhZfLtchezuGTgx6LQ9bFgSHui2fiaC1/CQ+dWQsf2hiCHApZWxS3urnm080lMU6LqUkhcVO8l/z1vWTlBSwgwSRGlXQ0SutP8JWwMbojujuKmChwoGhULtFWL85MdhdGAocaGujqU//mjtLBi+M7jE7qpRtLncA4PETeUKRE2zQCe2JLgUuN4zXsq/rZBLSnjpa6j28r9/r4ZJstE1n2o24pfcFZuUStf+CKTO4bLo94acOBXXHqyvszsYW+x5OZWUvP07MF9cR+FjGcF/EG8JIcx4/CHvYR7Gf8Sum5BzwGngMI2my2mA1ZWZbzpGXWw7llVotRYs11jCOXy+vhlHBc5hRHUOY5YOUsJLBqURhe4GEJ8YxXY6QY023m5TAPeFNO4a15a6+134oRkJUh21TP4ZvK1U/ahIFfMdMi07x2r/a4FmkZDFJGNw+Rqs9ak+4hKkwgPFd7fk7t6GqojC9mx0wfZXJWGdlq9Chkr5ZgT22Gy/J5seSM723KOm8CbWRqC2iaARfefuqzZxfOGb2DYAYHxgxD7M+YCPP0wz7GbqEBSc4hWwROtCv2ei8mY99nP2AfsrNWZLfHosS3ehS/bIuRbfOwOyir1ok0SzHYvjExShdjwG/RMyF8aMlAZMWO0UTIgw+zQcBvNHAL7MCOJfIYv68fozUt07t5pCaKXl/tagXEtnnq4WU6ArQuido1MaTOG2yoeGmccjPBbx2iV2d9vM1JfupfUFt9ss3ni8edU+xwHj+KRmnNfwuzTzlfH9ELslef1sOI2yLFm8xmpy7o8Iec2gyJQZ2SPTN7XhZlUSGnM/JBECxDT06MMcnIgvim+GAckU974gfibLzU5BLNJkd5pbBJGBTQHmEfAa5k9OSQcER4V9ByAq31OTZ0iHDeVwaGjg6PDg0drYwzGQzR0Xz5Ugm/QBDqeNFDMxir9tO1Rq1Rda5plNp2VSwSofHFJ260+pemM/KLzihflLvwwnb/bDAFbIsGTgcdmzdHrM5wsvpS9eo7zlk88MzZsclLbxg8v/z7NX4zkKrnfbDQ74H4a3num36Ldd2rO49QHLrm+J/QcSyvOHOzElvvAasdoMsKrtWCrVqwE4KLIYgw+QCwBEIBGAiQWLYSYkIhUsYOGUYycbOEpQKMCAAIVgFyAh1Jqrg5i4XEOCAXiEghwSTxIa1LHZHT+wqG93QsFOVsJf1j2NgTulb1mTyNsx03dN61U96y+i5pFWg/AgndHt999eOPX7N7bt/S/wTz9vadcsMNp0zfC+b959K+ueDAC1du3XrlCzdv2yDNWLyu+vv96y66aN1+EFq3eIa0YRteP9kv2ymPyxPKWo3HYJY1EQxEsamNRAtRJfpRFENbv2O5A5lIJuAIfBeyFo0/ZbTKfk9EZ/SbtDbSJh1SnD55d2hvCFIycSEUMve65rvgbuywMuSKw+ZbMpbNok7RUTQtybScTMA3wgLdSh1US8iQTg180ONyjFKLDVc2q2VkY5Nzx9PuK9S+dHL9R7ygtnvGJEQjCjUmHLT9vC3PV39Bd4wnPfCNMxddHFrdEiv89KHuIDylWv3XJ8E14FK6V0Z/tWva+Q/d/QYwbSjFVu+aodY9YD90BB1ggszLSgHyAPL/zUOO5fUg4g/LPOgF0KkFnI7T60Svx+HFxlivL7jcDpeLpAw/UM4gQ0yFUEzWed1e+DcvcHuT3nYves77mhdqvOATL/ijFzzhJUQ3iPOAv3uAzgU4l17n5dwenS0YVgND9BWNzePW8TCIbH5grReYD9lIKyfphyG9/GrT/gCdFLdT4xlvbyCshqCktp2TLwN0+AttjjUCbb0AVx3+Qrky0Uj11LEmluqrsiMaAtPTYCZpbyHtKuCz0b+q7SoSaw3ORLbP/0FaWca4LzWPYLmlwcqHL+VAnPKi6c1TF4sevXHq4gh5/hp5jtJnnwtql5iBWX+X8Gvhj4TNDsMBXtgo7BaQRSs4YrE4p4/q8U3CaUVJdEiSqOO4QixOfuJ0OF0OUR916PVRp8tVCEcc4XDEqYtxYZdDr5UM0biIIjqfYIZpTdCvAN5vkMj/wAoxI7v0AH+s0YP7JHCnCNaKYK5YEWEyDt6Pg9Vx0BG9Ngpfj4JzooCLgL9HwG2ReyLHImhlBEyNLIxA9Z+I4H/CqeNilmA6S7LwkSDignjzUqWojSS1D+qwky1dIsgWq89dmtCbpA7s8Ux4FnYe4g5ZqfKI4qyEZc9aInQb2J3brI7wwUok6I+S8o+plCoUlOw1jWoeqQ6ebj30rOxOuburp2zljvzMsbL6zpI0KKbfA0YJJLy+cK+k7Qg2Q7562s4urwVJkmaW0wEtVU1rtICfzOuQc/QgnP15dYo/XKtrwGfkY808Js/8XDlV5Q7SPw0AAwQQAUivBbpUKs1xOn1Sz+l0YjrlSKdTybFjgjd2mksl3Rwv5qOdfgbmbYinwbRwOJ90E3SScXjktCdTkC9NX5u+I43w//EdbqD+ojvJ2fIt5JBEbAh/Oyb0gTokYWjkBIt69L2T+sCEnRyWrXoiKtZS5csPRb0sp8auwAMqUnxMPq4udp4RfWfYGrFlqq8RrkhwcW7OGasbmCXBbJVXknBEgher2kwyYtKpLJHomxtmL6vTSY7OVckk1TPEYrl+SGse7lbWiJ5QJBwuIOhA4RCCoXBYtNkdNpvdHsKb0IZ0Jo/IIKdfcmn1Jr/RMN2+2E7Ct6wGI5iQ07YOXgbhnRDsggBGmLDNUEaiqUwarmw2Z4FWkDuBk5iRCuXDOTZ61Kb2Sg3QGoYBWjxyQi8dh4VIihdIzhtb5pgOOSeOrUFjGZla/xzpcvxww5lv2X3toerp0S4P/48Fp4MHZEFKP/1wugIUNHBT9Ye/WeQMkqqFuS+BHVvjcdYgenqrbwLflGBHXJVNujqD/XcsmxzzqSJ8S/svWogIZs1r8X6jRC7xTLNsJHOmH3EDnRsYv2UERqwt0WB0GAzGcV6sMuXFwoDPXuAMsn1wAX5fYbYL3OYCrMvhkl3I5dQKYRDudwN3QWtwGRKGGQbWZAgYegxIjwx6QwKLM1QDon6DRcaYcT4WOv7nDJwYCoVdzYxhgQEa6OzpEdLt05kfGBgrS+hUJ08PjGw+NECmceNvfIcbAaZqxsnklIEV5JZU78D+cZRw0iTqdhVdTqjR+XeMLF9dPHn0wpNGU887LdodEIyxEwusd63+VeMUFb3QFj63uquh1BpDofTxLbQ/LcgkgPdRPgqiGi8R641Y8mYi/le8IOkFv8G23evxiiazw2QyBySFMGlGIlh+kYjb6CxwnOwcXIDfVJjtAbd5AOvBJ96DPG5trN8LvAWtyWVKmGaYWJMpYOox4d8zaXRGgybmUww+X4Q0sRZcXtlXFByyj3TG8b6wDyY0Pm/IEar1QYSwanqd8wn/hddjCjF7PAc80JNiTIIpYkImrJ3DldeGVe2Ml4mohI8193K4yPS+WKLamjuyudigrQYGo/q08M2qrigjANFUlJLGnaCrkq3GF0eUhv66bO7W6m8Snm4uWX32RD19/d63j8298/7dAKzryD92ZiEzc5rfvbRRQyCyf8PvElFyPqLVGWgmnevzM2UjKYCH/7T8/atVvkcmlL7HtGaLoOdJoTsph9rnPuDWcG43Eybup2N+pD+yMYIi8WstwGJmREeLRqSl7PlSRa1Gw0aGuuZFtW790BcUrqt//mnVuipINPPLStTHJfhlZemq+PBe7qmWqcxSTBH7wM7L0sCbBjHX113fdH3fxUIXMBLuiTcetjplO+Eku9TklC/zXeeDerPXDJfobtdBN0qidoT/AC5EZBkMOYLB0LnYwwooYAFGj4BIE+kBsCQiIRAqKIixYxCOTIhJaU2EAdGUzurIV50rKzlaDBYehFREsS94gPBEBhlaOBUhLKr5BDKjRKnJxshpl6dFg914L0aaJj3SyMKL7uI4We+L+WHhtf4VDXIvDedHSiXSRluicETdvFQNK07QA/FVNldq3UyVgbo+XG7dWKCE1K2q3dENWmmImGD93LDs3GUBX8qUWPedfWv7P7t3e2bOOUcmqqj68YXffKDQse4mqqsz1t1/186mMwOJBVtOn7/+gYuXnHX+rJVjCvvH8+dtyEcTtZlOMzXfYETmesXBuTwuyN9pA4jgj30A2bQ2gvWmmQT5div4DICrsUFxBA1lXtSV98IHIf4T3OMADiYRCRaCMCjwMAz74dOQhVBPyI89UpTRGej0J5LCPET4tSpk/pPw9jD9/tjoMXz+yUAwYtapbV7xzyZBjec7sVwOjA2Cum3h1PYpWy93ra6cv2L9oa9djO6prplRHwMVqIBrbrjou1eeecFfFp8zpePm69V7EHspqEDjcjcppBxSB/nbjADxkXDkwQheu5GsfSZZuwl8FgG7WMDqGWfZIrrL+FLbE94XhuEws1cP9FEmMz/aH4VRM8mG9YefDrPhsHs3hgsaSWKcHr/75PW/KKgCGDj6hRJooMXEoMB6YlmSWM9Zo0KNFXPaqbdlGquPqgdU0kz2ACXE/O5FN1S3Tqg1+nAGuIsyZtLZXoTTlcpip7KU4z0Yh95px/sgJaT2pbAs7B4shzsc4JMUuNoETFYuVHaJkfLe5INJmExye6zAymRIyx/kXExSSC5IHkiyyWRo0AAMZuzFk+IW5sv3wNEvksA4K2s9l0IqBMfK/8lB0TqtLJpZYwdd7bocy2HqwpocwDCVAzYdv2wgBsVyAN+fIIfqJzNq+wHb/TKdcXyp0uHygy3+a/zQ5QJbXNe44B38fTw0GO8y7jc+aWRrVGh13MSRbQ+tWls4TCC3m3PIYSsT9Yjz9f16qA8HWd7mMOuwwT6EPwCt6hsqkXwlZVAgC1bpaDXasULiGteSbgJZJSpHVmy4/cn1Kxus9dy+vrm3PrZ66nfXXHTNZU+Avz2xdWfdRlfP2rPk7D+SOj06j12zgSHU5VnmIaVnEVwF4X0acKn2Wi1cZwD3msEllp0WuN4C1rvAab5zfFDnc/vgmhDQ27y2ZbZ1NlaPGB74tGmCCHwWq5zm473x+XFkRBhnOlImFEgprD5S/3EkkeCEHtIsmczITJOnh7KSEUI34cWadbURhoF6jEJNzQ7XMdqKSuMUMBKwiEaSCRJRjkbwvhfUuLNVUIFaY0+s5tLHn67+tvrGTx767dPAAHxPPfre4o2fPHbBdTee98hfNp1RPTiluWnqlOa8An9UfePF1//jVyAHph3+8Su/qj4PrHe/ufO+6lPVhx+69pd7Qah5ytSm5ikKrfktYEEOoltsWmRjTuSfulNpM3Mev6y3eC1wunWxFSZtQILT4WKIDFqfFho7ddi06IFTa8iJIsMFTDmuTkKVpyRU6bABxST1aupPbEzsSOxNPJh4OvFOgjRkmBIJ1tMinExEVaehyp9ARKWSMDSQQTYw39U5oinrQo32jtaJjjFRbRt8ZvCM9T/+8fozL//ZFdtm7zr7uv7pc+/qr/NRrbxz7rSzdp21Czz77PU3dc/csbe393uDc6bctvv5g6d1J7J9HcsMybRhaeeslNi5kFF5adgr2WeYbuxz9LZzRqt8mgesz2/N78qj++1grf0S+047ej0PtM1rmrc0X9PMrktflr4uTabYsdidE9gI+y77EaFIMZMr3N5mkmpcAgYUCohKVJLGypsl0DUoAWkSHeIn5zokUhMY0W/SD+r36LV6cljzEHFQFw35icHOh5E+HE7xZmBEZqtUUEoEhhusDrlU0HmlFBX4oRqR1SGaacL3PHbpSOvLyBcT2QyPvEb8kjoSA1QT5PKiDGtW5xdx2Di/gO6mrd1GNMZeuaFfKK0Pm6bO2NBAadPAeVPYYXSZkXvolLYeNn7RmXxBn6t++tm6qdPHKW6kBv6btDkA7Kkmsq+bGYb10X0dJLPXju+oliGkM5kk/LMHSL7uo4fDSTlFynrPxd9YPWar7CCfeAcwsUjxBuXdCHw4xnZFZjSJbvN80iUGrChBi/t0TQrPa8l752s/1MKNWtIaj7SMKRZOmmNiwu0u5NNhO+Dt4Dh2AUl1B93QpRFS1vjKcK0VYLh37icjNG819NZQ7zAlQa03FNUyUmOt8WQ0MHnoBo19srqSpo6txuc9XXhzV/W/egsdm/qvH5vypLu++vr1t0nRzP6xcU+f+apvpZrnLVoOb1JHPH2+ZmpbYUc+HFBz6x/jO4TEHYrgVOXYQQ4QRp9uAcj4g8cY+BrvbV6o9boIjVqIF4QCYh1IsCLWKghiOOQIh0NICC8KrwrDRWHQGQaf0qnn/xIGLjaBYTS7ht3CosUs4NlwyKpxm4skJcH7xCRy+yWP1mD2KybDIyHAhi4KXRV6JHQo9EpIa/l66JshiJTQgtDKECLHBvJ8CAS11pAnzAqdC+RlLPCyaXY2eyfL6lhwL/s3Fgos1uY+E+BNvab5pr3Yf0Qmj0jSkWIZhcVkOZIbzMGcjD0S0vVFkoaHaCRIraFQW21VPuB+fDwGaiXXauD1E7U8B0Pjgcrmgc0YSDfGRVg1LkLjdZs3M5uxfklVjiZu1anF1gQIYb9qbHAMeU2FBifQpHxY/aj5P2ebuZnVzXs2/elPKxIF0TsZ/HRKCjvG7rng5QEPH7J6nZnqY5vQ/Fem2U2mPBuJsGvfBOlLpLzFIIow6S5V7wSFq7wmIIqlyMLPq7/2WqwqDwKd/xplFpCJFx8ozdjxnh1eFobREBO3YoDEKTws726o3owOeiXkhwarxc/X6A5GfIcJn0aFkhwcE17DJgPLDp1QSKaOeG4c/Hfe/FEvrRrzyXHws4t8xrhtaX5RYlImHgeoOhpPOOfDbloxBkquU0dfXWTR6fl8alGNw7ta1vRivJdnJjPvKU3adrCm/X+wcxsDhvDW8K7w/jC7NbQrtD+E0CPeQ2S7Ao7XhDVQ0CSIH4fRYIKYgwXYSE7vXty9uvvVbnYi3V2OgcViEZp+Wfx18Y9FhAgshLymmGyVJDKeSXFYChGTVS74Jy0L1pi+lU5isu0qmHaUkwW/aC8T+jsF7zLC9X10Atl3vYyffF+788ZYv2s+F5asCq5OpP5u7ND6Yu67CfSMmt6xvDVrEH2zq0V7xWOqTwtbvqDOfTc+Jayevn71H5OnOPIOiyR1BBaCXbWZYa2n11jAfz5xXFiDT5ZjfqJ4dFnAcSEPPrF3+hr8Mh/xTZZhLdzrxQgHmEEQNAHErY6CaEByWMp2t2gsa9kdcDfx0aRNARDAtpx0BxqRpLVLyOWyeKACFc4iP439FGjeHQfxiJRWKS4akbpaHUVIGShrG7ndarj9uSGskqOHatgde77j6F314Wq5SHcjO8mX+nIvvVT35l5++Yv9uVnlyphHVym/M9GlG/fnClhuoUt0O3WwzQhmpcB9qcdT0JQKpHIpfDWRWh7q2S3C0ltiAk+mQJl6dlZv2W4RA2UxviC5MnkkSfiLSVI/zRQJ1x00o7QtjvFZwm9OKkkqOMLF61fdvCbGG/D7/zfB1Z2+oUONkhvzekjy6QTPb0yGjd4fkeMXe4Avv9zoA7700sle4DvlygT3p1KeNeYIIsLtry1rbmSSeLdMAl7FtaZtSxtEB9xDbkgKcbAjyNtlsvseNvFyF5HjbvzNJAF/erXr/3D33oFxVde+8C6nTD/Tu6ZomvpImiNLsiXNcZHcG2DAYFkOEGyabTlgDIYgEwcI3Bv7EYpDCiW0cHMpbthAYoU4DuRGmOQaQviwzf1Cf9HFLyEOSdDorb3PjDRyCZDku398tjRzZnTOLmuvvfZaa6/9W/ju4CPBp4PU5MKGKubDaahyNzRU3dGAG/BshAlyotsRNQoI29CxKlzVmJYqI4kZSfR60wdNRGzCUsgbIkpTSE0FZGTAQYOCcQPFjZrZZHNk2yweNat01DnMVbgBGSKKMWokBmM+kQkp2WQ6BtU05NtAguze6sF93CXPnTa9gyPNzW/xjDUHHO0l0WEf5MIDCL9fT7fCFGYGBzHcn+OrlqP9BD9ObTF9DYyUccxTTOOV8gkZBMrwH2QdHSIzMZmANKfMdWwemXVuTcMpkjaQI78tHFpTn3uoLKsAXVNyJr8b/soJSRsKUk+i+vKCh5yQV2BGoUe6DsZ0GlqMb9dCF825cg7Z3XygmRibsYFJFGIUGtiwthSHdQEb1h/DxWI+rAvw3S2PtDzdQk0NNQ3kBIeoIUMeIU8T+prnPQ+Z4rnMs9FDJzmZT7TcI7qKeURP8OJNNVpt1XajUvLioWPMQzpV6ox0zcij17s/6CZiN4i8SfZJsGx0T5qVUuV0JDNDq66bzjihZvqiOq3OjP19vjU+gniUmA/FFFufjVgkm5Wj0lZ4A+qAFVtj7iYRndmVmVQzPTk1k1kRw7HYmfM4q4Du2IgbS6zyls4rLx0Z1oOkcjwstBgpxXgnqKc4Yvh580eGx1aecc7hcCKOU7gC2TJUhAcucdLyT3fRnjZPRRmXnZCrQrruNB7dbcxdGD1F/ooxnqP2T+ZOYLfT+n3bpxdeOSGxxRgfjgQmJg0RQK6slw5yjCUVdaJ5+EotdnH3+m6SamtpI9W179eeVsbMZsx4AC7mMWZcNBu/MrtczDRUV1Un1Qa3qjbUpVCrvTXWSltbzYtAFjTOrsJ3VWGhyl2lVlFjVaYobExaUCMtGp4U6gkRLTQdZE17thpXN96m/ptKrCq2UFWUucjpYozWpcwFkSNycIU0ba/RTDU1bNukhm2b1LBtkxq2bRKtwb+peb+G1FS3NFSrW6uerCJVC1rQAiadupJpVV0w82TRpHPbq0P2X/Tq2QZY7MHYlgkLt0P5+ePi6hd8A6WXb6CwECGWRmY4n1vO91IY+w5PlFj9ZSKrv3wrJfG3hJa+tVIEtkmVdlhSJzDZweKGi2bIHDi36tQCbOSejY/89p3CNi7HqJfvwFza1vBJdxmPjW3HnEKg8Y0Z/L+5WLNd9l/pWPIE2eYG5uoUfoyqUCveqkfF9xutqhRT3OpS6RKJbKi4pWJbBb24fn09ubgOr6+5qYb4qnBN6p4UqautTWbS7kwm/ULTa03E0RTKZmrTdUL1E0mcrFOy0WxfltppNtveHAhHQlqIR5+HoqFsqC8k1NMQqmYR6NV7qHsHatfKguuakzwFyKBmdflUpv0T0P6NaeYcXFkRU3el8U1pnE5PSpOZ6XPSK9O/Tr+bFg1pf3pb+tG08GLmNxnytcyfmWsV/zqDJ4GewdolupRwNHxDeEt4NCyaaDig+VjEvS8QS7nklpQmmkqRd824+XSRd8zTdkLIe78e897LDxJmx4PvWCgiuzgy/6TY+uIh8OF+PaYeVkqheIqi5O8oJdaKV46H7MVPEwUvq+lMAwZOTDjcuXiz0Ll8yQ2FOU/qoXzY2z775Pj3O5Zv+5fzJz93Pr74u2j06plT3yGritF9oROC3v9bWzav58qzL+gZ2Xw3t33chR5hE+iJk9FUPFVzp/1Wp6qoWZWwQHjUjh0SD3Tv5IHuCqjuefca9w3ug+6jbtk8FvJuTnZo0eaODi2WVjs0T4WqdEQ7FnZQK+3omN7J/Xo2o0XVEFYQtlI0PVtij2xTZ7JaY17UHS6vyr2pToNJbYTvFlVTVA3yp7qGx+M3/I14/FY0JabVaclaNuS11Ys6cScb8sb7+ppwU/mQZ/WjLyeHRRfHur+2bLT1US6LDtazDZwUsT8WS1b7KeH5nWN5RscDN8dNLDbezcKm0wXuu8JTp6+p8+h88KOSifWj8/OnjeU/O+hpvrDxgjFmmKwHCv/1RvLUyON367ave/Qt4RDIjBaUx5P3ohYYlh6bUw3FMaq315OYYPZXplRzTHGqj0p7JHJVCzZUoKgw2T05OZnaJjdPurXmnprHaujPaz6oIeYa7KjJKI3YSRtZggdvVItqoZga1eD5aHSqfxLKTGUBDvrguzz+pJUj5rPBt+pwEGZ1rXXAutVKrbZmdXKHmkJt9rYYA+VsS3Q0Cea6lGapxmZanZArqlx+tcIQqtNMCht5xboI1CY28u772Lpy8sizId+v71Dmh0sJ3BztOJudMPJsnuse5LJMRA4eFQcrE1eC2pmtUrSrxyHO2TbmCVG5MPCfnuBNONS38r6FZy1svu3SJ0tBu+c3LZn6t3O9NdRN2/LHseHtgUGdv+HeUyZ+47b0wkKP+BOY68vx7L2oF4h9MazU1gUVC4hdmMYCKVO9eOUs/O60P00jS9vxw5QByldWqmp1wyRrj/VsK70LtEcXh1+tdiXzfDYz+CSCVqA4NsTnnFedREFsDAYbVhybjdFs+2wwsWfvwWdopiUNSW3S7V2dWicb5pTbp2qduLHzyc7Bzjc7BdRp72yEvy3qFI2dJXRWHmzenKlRFUEJnuevW7pMjiVClaZOBAoNbWjUlkiLUt3aPA0ExsJ5eN5AN1JbQ5NMJ2RbyOvZFvLc3cYm/wTsVnZsjn2cD8ruy2/xsDidLxhSsf3VXh3KlcO4sj8wgN1ePYsfz+F5ErZ9OWbQxFOQLelE/OT04i2nwngFFYMfTHaIP1nQ+0MOIJSd3hrtdoru2NJrr3QEzvYUprjnBxymfOH/hFNdvkKgelnIsn37Cakt8dJZTbX3f+N3nheKiK9TGldXXk8evDS3+MZCxYpIXSrVFD8Xr/+eeenIw3pGiPiF5LxZHeXgr+qr00LPP194RMdEBHmRB91Vwzt2VbPjdoRN5mvg4iZyFyE3Vd5VSQzVflBE36sWbKtaNrQQUcOOmclzkiuTlL0RUyd2phKJZL7Lnc935RNdKSGudOAa2lFXpVVpwaR6QxVWqm6oIg5aVTUt2ATd0XJc3chFc9lcXw7UjRyKM3UjDuqG5kJoESIpiqYZg0nNPMeXURjr7KhpVPk7CDD+7o/wd1g83Co71BBTXlYEI1W62Ap3cUVc/WnXK11vd9F016Su3V10Ztc5XSu76KNde7rI3jzO5PGk/Po8OZB/Nf9OnvJ2C7UsJfIN6hZ1VAUlRG3SskwJyTa1pWp5zjRvRPPN8CPZEKlWZX4WND+cG8N7O1n7YAmz+vlOVXHBKR7ifocd6uSJkicqH8NDReWjf1xOQTHjCggTWXi5bmuVzukxJjsJndE98YzeaZQTIb/mwtvP+ZXLZy38ZzlY4wv3zJkymx/Qu2/9Kc7nfXVe96RgOVrjX/d+5aFYZnrpcN43TnE2j2OtcvzNMEqh72h9FcyETlW4U6mKB1M4hZ2oEj2A6BcQFoExV1TgisaQ5Iv4ZwRQDETUGoxxI4tgrMCpcf9IJpRKav6MeY5dP3zAjiMcs0tGdgZ0cIfTq9qzpSPnHKSv3FHCA+uYZbsux5Dfyzwi5R6Qk2Av5ZLtKiwt93R8Yp+IdvlbPUorWubVmIhv2aMbmp6xddsozkO16Bw0qr2wKrshS1bRDbSYT5a2ubG7UvQYXN54gpgskkBpVu6Tt8j75IPyh7LEPqyR75WfgI+jsiwrwYpqJFpqQlYiNXgb0g20TcPagqapan7a/IUNptyUntlL6sS2s2fG2he1D7Q/2T7Y/ma7xD6saN/afh98PNYutzc3ZmnO7JuPz52Gf9aAfXF8rhf/jGA1n2vWpk1taswugNL0VnlEWXJXCjTchmJ1jXWkbqmlLcsQxgb5bgjTwVHelzvU29/cPMTDRXt787kcXO7v7S9+5geVQauiCTNO0CIojR4kmpnwaZJ+JCTn+Bz3Csau8KsV9z0bHHI6PfXY2mH52q0pR0ipwU1LxNtvtrlt8Z9/+h1is3H2yGv4m4WVJJR1uk3BoJh2xwpbcN3yGoeRBINCk91a2IovTPmcRhkHR5yf7359rnQgRL8D/GBELpTV/E6b2WHCkmAgZtxsYsDOHsneLDsYbrb9SC+8ovzhVwfzg4dYMqyECpYJ6Cpxx9gV/U76+cKa59P0C6V3+sif/oQf+stO9qrrExGwHX5Pn0BT0DlaU7uEp6DGlvo0psmWzgEwtXyxpI4/U98YapDctpCcTtZR0dw+JcRAlFE+ly3iEA0N5ZlTuHf4jaFe+5GR9pdfsh85wJFKSukAOnEJ8lAqS75Vgd2nzwog/L6UFcDs7ozUt9kjvsrGGeqUH/YuFN3XXrqRGDKnyA0w9fu/LGZ7zVWqYc+WDT9bcWnqjq/gt+abT0gPwPsvvgT9n4kWafW5OmNyyhYwotCkKbMHvNhbkU7yk3NKblJIlYLuuFxXU2c0m7vzAvQdunxyz19iryODvygd8BpLfft3dF+P1hVf0nv8megwdkos2VD4N+j81mt/uuUzUeSTI8UjZE06X5A2ciXI7Ub0/l5UBeqBsbpRvanqrioCy/V7mi1bma9cWEkrE8iWsmT20Ld2ukgj9T5L32N8St/WgjfgLfheTPvwGnwDixhV1roH3MTtVuQ99B0tDZVYkVIXrSPd99Y9Ubevjq6pu6FuSx1trMMM458Y6ppTCrvVFtQqt3iw4gGr0xMM6kf8rKo9iFHQHiRTlCAeDeLgHjzpq1kGsN4/htF6IMgzkh9iyUfXcbc4QxvrZ7li+nXgVh5x+kovzzTKYEh0C28i6GH5WgBradmwkSsLv7fmzSTjDeXnVDhqCse6FNlpUiwVhgfDqxZeELNU2NKkzdtgaHr+qyFlYeHIArvR6620t+D/c6NiMHlmFFavu6z6wucXOAxAtjSn+b+gdvTOrnCj0aY2Mb3MzgjfdFcTSVdHka3B0qgTu72c2JFEor7lMxG8JdoCBG95omVfC13TckPLlhba2IJRi72FGFqm1HOCW7TPTe79OkbF6YitoxSMEXyIZ++r/dsEL1Op02Xp4E+gvLti6uwIo3zSE7ps0ox8SyLmjMyun2I3XMLoH7ZlOP0bf3JTyLawcHg+o7/ZNh+/9EB3ojoUd8Yu76j4yq1fgkH4yQI7P69ERn+FG3BM/Fckg3LyCNsJP6Z5psxQqR1eRPYi27vnqDa36Rn6PorCbDCyEEtipzGYG29pNiIhfk4rLDktMT+nqEETWKCIoCEdDckR4GhIu0xW1ZC0cMea06MqlqiFTOc4eaX4G647HgoOFQ3bA04dBGgo/wpTJHVK6nEieh4+ai+lOjwB37Q1h2NdnZ1dptcub7I5raGIM2WRXQaH3W98OCguhL988nThg86cQfKHmsJL8M0DdtnonV6UBXiPcAWKoR/sRUZgSaW6RZXD4odklBASCUIX39u9MNAXIIHgj+hbyISswJkasgBnKmt1dHlioagybDCxzscSKnvfabarJgMjj9ehBTT4FHBYNItdtTgUB/ZTlthjB3Ceo6TN7S+eqNUpwc78DerJU/sRxz9nE9n+8lD/ED9aWgJGArYayyahNmCdFsww8+I9La5WSyy7ovDOTCs1eOwun/RIoHtWJCvUtlX3Fv58mcdTZ2p8pS/tMHqmb9yYgq6IpBrfKyxHcfSjvUgZfVMLOGKq0w8Esfvhyk5t95mfNBOzqMtJDqMPnIHIVCN9G3mRi1PGDVQyst0c5v8CpTZr3GcU/BQ0WJcG1HExYrjsQJrtIR3MEj6jkI4EBATyMo8tQSFsCCX4hDvA5+BEymRL3jFOGcYtRdrU6ujU4/5yPR7VMR6x5Y5glr/3Xk4Mb6BIJRwsUYlcDtRwuiqASFguIxKjD24kCaBPNXpjF7Xb7AzW6k3NAaTxMCIpVVijVZUa2UPf1+wuRjKX5HjTdsxGqM3wIyBRAHk5iXwwk8wcijUsJSOIzxFOLpgjWcs+C5DLIrm8jFxeRi6vi5EropPLBOSqDZTIFYhGshGCItgQqWVi62+TDOsHPUqUG+rrHSoGZgwVYbeK020cdu4EAk5Yvkni8hUbdDJ62owlMoZsNlc4bnRam/HlHbds6T2BmoXIJq/ZVyEYuF7I1uIlQNMUasAOrSKZEMSEvbZRnZKYmzg/QamSiCayCeoXE6LIAG19yRq1SsQbWHIwTItRLmJtmk01t6zJWpPK0jcYqCzXosZIrZ9NRqtT9deyO8J2b8yETQvtWLHjD+2j+hFvYqJ2wVe1h76r2eIaEZ1ipQjfiDpAgwWmKYNnIPG4r/45+i4ywxia6NvbUYCvUkk2nEh33XDIol521qCPZw1hQbM8mKC3f92h3kH7yP7ixHa0lx2b52PSx47R6FuYfXwvk2VsY/5YBcNCUXsqbCN91XDlKHPTeWBUyJJWj6Vq9Zc/OOyJ2s0GJeGBJRSurGaD+8kHfr3NbKnxrhFmS3ZT+3fDa7/ucVpUfG7W4vN4nNbcPWCP4sIV1+C32HotkCp6CYxLBvfuRbHRYztAwnOcDy+7iIkgXd3RODHJVn8ohUQTCIQdWjpgZgs4M+bkZ4DfY6Mfs+eibHdQf55/drClfxAuiMGqwNITiqoOfySptsZnxs+JUymOb4rfFT8ep0IMfxTDB2KvsoOo34r+W5Ssim6Ikpujd0eJwY1vcW9zf+yml7k3ukmLs9u5xEl/6nzF+baT3uN4zEEucVzjIDPlc2TSInfLS3hijI9lLMo/lV+R35YFg4Q/lvA5Av618K5ARAH/UcASxccp/jl9nX7AAqOYxUoNBocsOd0uUaAx6LLNxJB9q01cSWCnCPlpZO5yW8eNQnjTL1h+Pt0Vp/+DeebLlc7DwmP8hNu4vdeSO62115Kjl6iBPf5b7/M+Fex8VzWtXx+1BmwJLM0Rr7/SMvlxYZYhX8jgvsL9+KVuq9crxJ2hwn6MFycUA/F6aa3FWvgpboy6K4hXP3MJsmwZjG8NencvssG4hoMVKorrh+KFAMwBlpcw5jb47RY7KFnv7+RpEGGYt2vVgWeA4yuBKeCZGEfV8MGFHcSVm83RFTAHDYJfWCVQm1G8RiTumxmG97nuVe4NbsFrigVjNTHac2vsnhgJxjD7TGxSzBsj08+OXRxbH6NXV95cSVgWxrjLKRr82ngWFwHVmfzZA0B3tpvVu44Hf+ivPM+VTubiOdghnve9KNh0nLDxE/O55mJQ4kl5D3NkWcZLnG9O2xBt7nKk/FJ9KvNTgycAyrtlkuumjSaXKbhDmCXEaN3IG/enIm024/l9+F57JGHyeqsDmcIHuDHgd8mCV7dDv0YT+BviZciCerRGSTNTFlufNdCQZLAbHKohK+WlhRLdKt0nEWmA9XItR/1/GTEEwld7g0O9/e1cT+CSWre+gG1cXAjjb5isnbfWRW2WxIoFYtJTkb6x8BtcdWP1VUy+Qt1kH687gL6nrTOKAZGwMwLEQF2S5oe2eKKerAfa4mFt8eRdC119Lqq4oi7CYEaIawBZ7dYYrI4UVOyJDWfN7pP4wQpiKDafI1+X2i+iEAMIhw4sL3VBN1/gm7I+DQZ57iQdQKqsa2L5B7KvrJ+FQ6fr9MxyAmC0l34RfwD9DyBtLzKzBcTpA1XVt9uqWaho9VhBBjkYzs4eXKMZBxyTGeAhP/cQHOY7KqB+DX2kJwAsB6vwSOOJ6L34g2ht+9xc47mT+y9OhdIGd8BVO4W+ngun85PnX71Cq67tasm0dMnGLs4PP4Y2/Z63abIWogZokCjsVjQvZXh9xCA6jZO1YpN2DvQ5sTPbGxzpDQ7rzRn5aKjUGpnt45SSgI+Z3fj3S6esXZUMpkyugLN2SrRm8rzmRuHh9V/QarKdLemWTmhHbXM43TWZ1QFteR/a4kedWkBhbbHadlNN85SIYxwnjnHyVud9HLuzjDhjzSluD+gxhOkxHy1+f0qtM+AypYLJVWunLL1w7uSaqPCn2i6jzNuSrdG+sH7eNWmGC/QnwYF3i1uRFV25CxtMNrbj9vHT8G7uMWkmpmsZGc6cCRup6VlqBBtGHn1zN3xllzGIKOMuoUehmO4h/76LQZEaBPYd6pFlxcZzrB9f3juI8r0s8QnLcvEOVyL5CsxTV7EutLBM3yACYEx3r1mUmzkzt2iN8MtFa3tm5nIzu9fo87m8nYS1Uyi2U+rh6B/FdsrQTpm104RMxXaC7sHaZO1hHi/WTlmxYoOVfUd7TKbP2E49Zt7D82jl8O5Fa/SWCo61ixat6WYtRSU/Bz4CNncQPcBjnnfYHCpmAjrsD6pyzO1TDfbKtGq0YJ8V48lUIkRw2EAN2qH5kMAWcPvoe7tBtNuRC2j5zg5CXCamiRaPwsRcPrUE7M1mvDThAwq72PLYP356iB0zZtKZxTWw45dD/PALLh0GkB2JUx8exEd+fmHgvKaqeNXsubaOtmnt+fVzeoRVx8Eyxpct6e5b0DZtS64jE1965kn91sxOP/TaaYAeW9jI+KDXZtZrlgPX6oRe2xwOOxGLvQa75G3NSP3QaYpczGOww+FARqY7Zlwak4pZXThmXQddR10fuiSFujSgg0vvO0Vh6LNu1PV/xn5PPDyYcIxP5CNtHba5s6HfTecFLvx5z5z1+fZpoiG3ZVrbgr7uJYU7sb3m+IYzl8Yzxdx/6FlhqXCHU7L84YTPf+R0ORN9XagTnoeheV4zKQRbJYIJxXtoBmw5yY2QRChln+p0YFEiibDuslG+DG1EREAqmoE2I8FA4VbcIEmiRlne6Te1ZrjnIuFKgZiFKcJc4TZBMAh2MSYuEleIA+JWcVB8WTwmGkXRIBNBEhGmAsoODg4eHgT9mKO/D41jmx1mB8tKWGfwxxKkYwklpHjUPGHECZwT6s4rXFpYfQ7+VdPX6Xc/uUBQ0cl9BcvNKomSKEh6XzH0FYvQdNZXhjRBiYiZZ+PUfcXQV0w00GrH+kqvpMRMp9C59DYK97AUAovICjJAtpJB8jI5RoyEGGSRINCFMYG+Hobe/t195T01YqGuUNNUaDgH347vEp7/6y8E9ZML6Hd5f3Fc0PAtwPMUhXbTARAvBvQs+XdE6XcQyQ6jPFtymSfdkcO3rFwJN8/T6fQ7wUNaxNXwXLumIILZljl6hYg+XxCk/sguupkEBHEPMe6Iv/2gv7Z2wUfzPxpZ0P3FGe+g7Pzh3g7m7ILmuUhL4TeVl4irC4/gpazc9YIH7+PlTtHca2H4SaOol02B88hmDIXvzsPnbxdL//ZhXnr/fJb7JjvCd056XTlXYv3RSxOs3GI/C8vwLaOPQrkz9wKTD+6oadDxzhKRuKon+KN2nm6ARvn+v4I+RKOIGtAgpXuL1MjyYwfr+nWMiSJNoOAiTSoKH5B/Hb0U6nCC3MTf2kGoSECWoSzzpcZb4uRfR7aStYUPBvT71xfm4H2j34P7o5rVDlbUKyxDLEGb6V48AhWOQI3Le4dZl2Ac8b5E4fWj8Ain0+8Kc0gLfzYOzwJlXkEUrFeymQKBnkKi/dXxp8UxOvfqZAb9bjcU8hV6Pzwvo3M0BxIEthEtDBhhVdIos5kHNR9YsFASzEfqoKKkwd8kTTQRDhxnUwllh111L0BpXxes1KB/qFY/9YrlRMaVaM3hr5wXOG9o6LwAvX9o6JO+Idb+3eRQsf6pmg2xuhGrG1GN6lFVUDW10xiFqukJNeJx7LghPhJQD6+Dlc/WWXQR3o1/C+vsFX+XPqAZhR56ek0g+3kVAZwsVwQmtu/v0QM0o7UHnV4DOG37UqdRAC46Yf1/GG0H8V4AulzwlAyi7zualRQHwwwWOmHf1GJN0GAOCRrMnyeEfcJBgUaFrJAXqJ2d5YQfdpSTGoRBDPPmF6V5o2eM0U9KDI2AaEnF2XkRD0vr+r2NKzduX/n22ye2AfEareJ4G5DI2yBpEmuDxNsg7ZMOSpQd1c5L1C5hxH7elI5J1CAN0tO14cDIATa9PImWBMxPCi3Avfjut99eWdYGM1q9HZl4I2yiPN4Kk8y+ymoYli1qYC0x8JYY9hkOGiizePIg4tnJMPh503CMHQ7jLRmTIjosymCw1JrBAyOD4+0p0gXaxJqV+tKXVq5bx+UMnk7+Fb+myxkCcgafUs7g6Xfq5xU/xHfj34JY86D5uyS/zckcKce0JKxHss1oMtlcdI1tn43YjjGpF0VZtAbWLwQ8JRu5s+Jw85B9P6w1KNt7aMjZbh9ytOvuUhtmunsrDzae1Fp0r+PfBq6akUrcTMPVjopwjKaNA9HomdNJ64xlSvtvPbA++UIV8j7VsoD1pZ68Tv6L51y+XstJJoNZhDXUIGNKB4JhlWq+gGqkAVpN6RIrxRWYGmVgQbB2zEZZMCEQ4QM74EYuyn1ws4S8KI3okmkggJGUFxYKRMj2D+5npxO5WALrn1mO+/t0sx/Z2a48kyEZOdOaafW1+mTyXyv+8pcVf/0rf6WTS1fwqu9JCzhLzhKWQz2NeEBrNrNMN5Lklc6WLpbWS2KYIiPuUCqiFWsqqEWyhyNChahU2aozkqXel0TUzdx/KeShb22vB3lE39cS1VUZmq1VmP74jKL7Jw+KR0XBKNqUCtBADBaGvrnDF2QY2+9pl/nCqhTZHTkQgUUrjCuEsDtMprvDyTDZHT4QfjVMJ4Vxexgbw4EwsdWGsduetM+wn2W/yC4K9tIHMULsoAAIBqNDZa0UkNtSq9VqZkVdVIuVWhyjtVke4WxbsEjnbWDlNp7hmaeMNKCsll2UXZsdyIr5bNY97mxpjrqxO9tfAssaqsVj6J9jQT3cyVI8IdHfy06WreMOmSJWKnfAcJemkw9ZcCg/WHSA6Z4ZDh9QdM/oIYgt6mldMzSj290tKjkranE7v9kZGlhpbH3aW2mKYOJotA4M2ERLw44/1aTlSTXCLGJ21Bbu3jy5euCSoGcTflJ1iqLXW+OKFn6Jp1Q6ZMnuHYEp4XRMbnGXbIcG4GMPWr7zPYqRg6n+ioZsOE5tWAI5Va9KPLUJrGzc8TEqwdfQbvIc27IEo8lK39vOEsnkXxkuJcguJgDZf0BHjQW1rh+ftPnKsyM3FP4yRZEdJpsSMD0Y8tlrSBvfU/3DJhvbUx3JnGEx6u1M4zuFK1AW38/yer+nBWoaVVMa/yWNQTLZs7EsDYnE7vSqIcZoYIKrnjos1nnqUnXU1x36Yuiq0FdDwrNOYFKMq0SPHfjAYw9WqPXMQmxIZlTJg5uN9YF60v1wPX6n/ng9ubkee+ppY0pLLUpRJbUvdTAFy3qqMvND+i6wS5i+hcygktU3qmYeKB2oUDUzRma7OWamCjWbbOxGCjSqRCn6nuZIakktmFGTsBKqyWQA8Xz3jkil6mBIFO2aihi9uVCYxMCuuFTrY4BxmMXUrSimdJYcFDXVaolatVaDh2sDWoCVGDAZLWyjys0yffWZ1piEURNGJrspZqImlhpzZLC4SzI0ztLsSIf+VRHOuxR2y5Do9+sh2HpoPpc9/Rwzbl3R96ir6339vXqkNmf8/rKoa2BgBhPQouenKg9j8yTGg9jwnavnqHmP2WZwuyu/lm69xmydGa5ZMTOajZgdZrc7s6YyHO0751oyNHu5U1L2f78+NS0vSYlQdVfPUpvR9+zdTndca6iZwv34bWQeyLgmPFurMWYCGWJMB9LERhUvVtkBYNIpeSKVtfE6t+wySPUWJZiupj4m2TLIT9/aaSFNVOFuX2xjLoH60WM76hrVOPPlg5TTxRl/P6YZXV7gIfirgfHQwMw5qsEOok6KwQ2P1mOpHhtrcZWhFk+HX+fkSmyo9FdWVdL2OL4pclfk4cg7EUGKeCPpCE0ZPHjaxx68yoM3uJmj/zX3e26x3TDbsNRAjYYXDb8xvG8QnPQJlsWQ47qkJJeB9aRecsvxOguycbYxMgU0F7VhG5NiY/Kon/32Fx3H/KjX8t7SqcGJPuQiEmAphp77KGHqtqhZrJ9u58HUeVwMcGFWfBRzrxzz5ys6WCWZV/hkUmbRudWTdnjsvklfWjUdBFydR1Ay9XV1z7TNnfu1GlO0nk11a/tVV7WaUsxnb3HO/ObdF3i9UVtE8ufzXdYIfHnxF/d3mGJkgp8jhV7SzBXMz1FxGj9HBfNzhMMe3c9RiVx850rj8RVK0dsRQW5spW4eJeEOax4tnlSLzmGzJxwuOkEiGsO/zUao/nYwcjTyYURSaIQ5QSIlJ0jmZCfI/rHzKPv1U3rj58E/zScyDk/ZhTvxqd0jFc5k4XdVhoDnJDfJB2fZjF4vwVLV5C0ldwlGd4ECcK34DBKRXzMRpg1i5gRA2WwR7KipMZ5wMB3s2m8X9uC3xMi3Oc1Lz8koptngOSN7UCAEy+xZ1hH+OPNn6887cnoJs75NX/02nvUPlkG2wM8/WAZvCjqRBhRoAOanAGtedihbokE11p8shOGpb4sRToML4LnZdC0859otygLUW3xmyP4Se8SRc8TJ7EJgOf4aXfvJf094RkZhzYyMEqYSfCOSscYeHmQP4zhzAvLHr14Oz+OvFa6mawtX8zI6wFZeM3onkpCqBddjvIHgK1mSmxu4oY/uoOJB1oU9uP4plhZ2cIThvbzV2wvrLwuKF2mC5nytZM0P9/woOvLnywq78NxDh0AP9NFhcqc4m9vQ4eeYJo6Y1fGtnaLAFPLBw8wWO1LUyTlP3DlyI/ky+xVeHCg8OABlTKcr6ZniZaA31KMBLRFgnnTu2g+JQWF30qLVOKkY8oRIKBOdrG31Yi/zqQcHbshsYSfHGoquf0WerCkKdoDIxTXb0QDi29cOFZb0A+MR1PpWANMrivsCvYiBj380yIYb1Zb2BlrUEkI0ny9i+Y5B2ff0zHk9/Q/GzE1KTcc8dZ7aWIjP6V53Rryp0tys1E5ZpM5rzgr3rz1nQapmyYYue74mN13rmP+lsxckaxpSLXPb7B21uW5tim5z3l74KgmMfh3GqFKzCTClYOIhTCSBDfXhw2AeHT7MYsLth4G7SiMSuPYb1/of+8G6wp+wcefOk8shIrMBRSqIUBwb2cOMYYbselHMzsrICVeOBAI/eMx/7TcKX925Exv19vyy0INfHx3Sy5EE4BbG47xRaLwIYF2+A5VqSXlkH35db0ihR2/XxHIimoUIErQFOJiAGsJLaWct0ssQW1ozLSIrg7WiMHgtbxSzN+4G/vWOvgg2kg/9WjMTu8mpCuwFlstjO+DdxBbRIFzQHo/mYWeaPDGTTY3yiDUj9TCfgdvpZH9w8j84seKEPzjhDzuVHqNm5McKWlWO+O+B2+xGbJR6tCy7Mco2/ditms3j0YxONcvCA7CBF2tEPXYLRjyNaf/wO8XQt/nHuQgfBouxZG6/U1KBdL9Ef225Z6K2VizD9CnmM+W4VcS7+gzmp1i8pqdHzc2c1ZybeXzxmrWLFq9evVjtmZlrnjVT96Wh7XgfMTPYTc0UZf4wUE8N+Bny70Dske10M2LutLzuEEuNudO2c3cY0HgB2PqbiYXP5dlaHGveoCqyFxZBSG4Qt4iEsLTHr2ARb0N5+hy+Hwo2w3S/f6ecF7cJ2eGR4eMjzOkG8mOwmMQtBXzKeJVsjr/x7MeVrz+7HZ9XeBifd3KdX9iLRBaaAzUylxuxU3GblJdZNQJUg6Aamica5nYu3DSAt2KCtxEalbH8CmuaQWL+PlY5zg6X1kzepD49PQpNuBLwSza/Xjn1y2/EpxGWT0xvDoxn4Xpy1+hm4LDOXTa/4mbnX45pVrjwrdLVZ4r24LWa1bLKalWFTZ6rkWGTgrLDL3808hZU+BGPF4Vx9Mpj533khHMs6I7cQS7IZhdetTRT7Tc7Yoad1ZW+S85JzPJd96gWXdSZdJyFqdWotdwGdHkS34u3gkxk/B7SrEiTLJpT0TxUM1KUB4kK9R1i1ZXxDC27xltL2G94mn4xVfikCPL2yW/5xbSp0OfvC4hI4jxYj5y7RVgGsUBQnk/IId0HA+uJdHwl7hXefrvk453wDNxPJj7DvUjSyuPwDOI+pO8XlhFp9FG437GLgFYNNgjcWrydJXLIEanwvZXHmRf57RPuFzEVmdgav5+5hNj9x1cWlq18W49VX0bto4eAgzKaGQxhImhogLKkxIM7jF4VeIK5OIL+w0FWyKFSrVAStY/Y7sE/ugdq3nDkSHlZrG7mwhMoE1JlbY3zZ8i5/BGdHpOhvf1gThlRhxa/2LDeQC7G6zE524DPZvNPNMoSoZIoiFgycBXhMEs4A1L4ZZB+L8Flfz8Ytf1i3JegLa6cHCf9hdkPL3/hheUP46ef+gMO2XDoDwgX3OJ/jvbKceDCvMbyh9JXFJQHXmFOaaSZLOoN6CjLPAF/QWQz24LYwfKrZfuH+TJ3PRNE/X7uS8+5EgX30UsTcrywnfWhsBbK3svLnqGlJCabMXpFoXlKKCue8uLpUfjI1AWKuY99B1MZTlV8L4YlpfCNxKVHxf/EzMdVeEeI4IB4CawBU7TAzRL+mohvY3A8UbQFmnyHQA5GQR0B9WMXUrjTGYRWnk9lrocU1ZDiYoUDoINEfrhHiLzyCp7L2v9JQTw4eoP0KsyWubucMXtItTFNvsqoqCRmdKnYvslodG8y887kKc7ynllWmc141RNsOesdzrHNDZDJg8PNWeZl4OF8ZbM3VzarRyIxeVd1pevyZdFZvii5sKE0q6G71CpPnXRbcUZz2u4TXsSdXEdyc1/lLhDLMNOyQ6xaXTPCnUWNCO4f+W9xN3FIJri/fjus/2ynzY01zDKn5/FCBi3SxyO5EcuHoa8gODtUdHs6/npYSIi7z4J63xQm4bC4ANlRi2a2bxuFfhq2ySwiyfj0E5Z9loMWCjZ+eGc5wUd6P2Ky8xBvmH4kIVNK8taKw8YFi9dfda8pGq+dffnls3JuccHVixY/sL4jWFsTaef5r4Q+tFpsB7mV0SxjIFnoCinLt2Keksj0s8590jgU2ouMdMHw0qZGV5nUWq3V12vsV/iF/q7BGgG8swJHeZk+VKMFkMY82kT6qlOzGD0aVZSoklWoQdFlP2v+8d4TRGP50oqjeV5LQ1fhPq2uXsvXN+Shvjz7Nt9Qp/F3Nm4XiL8avR7mRAXaqCkuze5VXS4kHBWIIJj24Glawq/5B8Jh1T8Ak6PPjxf6+/z3+qniZxc3+I/6Rb/jWTwd9Nownr7dYIApM2234PEwscJkk9miCtnafj23y7B9mE2hMd888CNwPaxZ1IblxFisCmgEupevGAX/o5yXVAoNsdmVDtmbbl7YsSBVIc1vSidnzFZjc+yyLCdMifbq1kwkyXIAjc4QHOgn4lZOywe4HmVjepStqEfZuB7F9mGMPQo7pFvch1FAU1LYPowFWYr7MKDusJ0XTyluBERvj1auKZmZpgTPFtWkXahHV5GYhjSmIIF+dPpojdpa12lUop+sWcw0okVrxzQi4ZdMJWJfjqtEwDu/Fdwgd1Zz/eKif4J+MS6XPkXFwIGiiiGuHlMxgKfeBjno53Iwr4VvwvgWgjczO2wLwtGiHUZQlFEU1+9U2Fbo2MQctE8wybBuAGC/bpKJlxRtMjz6Eqx/LZ+6n+0CY7GluJ1NRi+GZ+7lz8ioSjPKdEDgD/4IHhThQaH0+BFegB51xoqg8HvvypW/0ksq7ORKwkS6n6nFxnVJdhaFbBHvBV0yynVJRcQGETq581N0yiLVS6mBi1olDhS1SqhPJzIpyr0/AY+H0RV7kReUuExlCpZItleWrlYlyRXepliwj1rc21xGjcJ/o0Wl/rCLi0b/Pv9BP4vXBNFoxwZ7mWgES7IkcIdZLB7zzhRtS7ZilLOr70TpOSbcHj9Jit5alHaXTJCmqEyGO9DCvUgafU9zQk+WSF+UrpLoE7Z9toM2anuGhmGMYIIpJmwwsamoYJYU7RjCHwJPGbeZmEAH04TT8CO+Qq8DCqZLKmoxbQkOx925WZdfPrs2HjXPX7R+/eIFwqT2SE1tsGPDgjMWL2Ly/RbBgzaK9yI3atUiYA7Ibyr4TeWYQhR+ogFRch9McsWBDY4i2YZ6D4H+1D/U288g4kCeqWMBgHoqUbaobjhY01hTYcyYKrOrOqvSwvZ7F6QCkcSkJmtzZW9Tg76HV6rbg6ZqlaxuVDxD4qUIhJUWrFCVJ6B2Jy2fOKDw9WJ9kFjESLEVLvepzPmNB88w1FQY0pbKbEddR3VaJNCOJinZwtpR29yURSfRwGJBhjcRfhMdY6oXPxT4BExfp0Xfmy5vwzgNXMXTS8WAP51hNmYrLWlDRY3hjIMLoXZxWmWztaklKTWlFtzbuaKYUx5B3X/gNGjSApz+pbpP2/XDf7vPf/hMfT6/MAc9+JniNFxgWD44HqYBz/bCsw9/xjgNH2iOD5eHacDzMwrL0P1gD8io7ymwwOh3tjNVkX5nl0aIhPEePZKFi+1KFsmCn8SDmLLEQiCNoxgr7OdDPIqpAQ9KJ+89B9l0HmQ6n6u45Xz/yuPMvPjSSrbXPNoH9T9XrB9RvX6J148xiLFi/WSsfvIkGSQ8rqkR1g6CFfbDDkVRAxkU/3b9YHCBPfTc8ZVgDh38Ep63DmTAzcIz+BrpFrBJYEGlAtceEYzrfr4ZzaNwmAp5zZ0j3yO/h3vbi3vevxMz6IjUhJzoUhbD+LHmtXlU5LA7Yg4aliS7vwJEoRnx1If1zfpWkaLALYhFAbHtIRHtIQc0xewia+z4qB3b7SRECcM5AE0FZ+1vDI8lUCphExeZTN+i4SlWvUd+X9+cdPh8Xiq3hBumiD/+hpyiisPudvlCZmswMw0a9yDwyIWjLyIrupXFgzh5PAj356Aeq2Zlbhsrd9tYMUwsI7Vyf47JxP5g4n8wYYVHszB/jtwDop5nboQ/S2NhIttpj6kUIPJZXDKuCcEiF5ZiRQpzyoNF8Ohi4I/HOX+sOl2syHasfU4+Ff5mxIirGDHyOA8YYYbw2+iktpwmZmS7xOOLWFvoWFvok3SQ8vsaKWjtWGE/H9JRpr3zOXP6yBFfMXLkcR44so/HjYy1w4xWFuNGdoqyHi2yWw8W+ZxtMJw2ZqQYMOIqCxh5XI8XgRlUjBcp/LjwAc7zuDQ7j0vbTihhBljJ/soz+4tHpeHCrYUe9BDaBBpyXrNJCnZ4S6g1fI/VnalRHYJynwGzkP4+AzWgpCc7vL+3F5Xhz4C8Xd7bOhFBpoQUlXtoYe9zHPnFX+Gpb4p1us0PuX9WhHGxGqvrFtdtPVqU94UeEuJt0TSFnUCoFqnTCDp1BfWUcpF6FEFxmJmHihiQOWnIsrTfDDm4mBvKn+WRAuPnznMTknmT0Izmzud6Fz50YibRLRt+dsXRV4sJREdHP+kvPDaycPQWp2z73sh/Il2/fqfwXRwdvZrbEzHNgbSXpTeLthlVNKOHuQLHLDLxc1hkx080yMB2ARnxk/+f+4B9n9ngOX4KeweP3lSoQNeMPgL6QbvmY/oBO/+j0EWw6oLG66QWp+bkfjGz6iwKQcath1ieksO9up7gO6WecM0JesLxk9UEqP+LhWvRPbB+eNC8vcgz+h6DXVH24Bm73W6ncZUm7MGNMASOmMGhOhx90hrgFSdqs6iuvXgLcmaH/zhs398POjXyZ+d/FOQR4Eyx9um826JHADC1tTUne+/p7jor1R52Z+c0xkz2NR3N1/9ysdoo1wpaQ6yGbF8Y09t0buFM9H3UAdZATLNZzGIYuS8XLWbDZNBZs9nh5mbgzyMMzLSpsdVGZYlnI/CxwK4GAitYaxdtvTE8pTGGSXuzq9GtVJ01KdVR7cEkHXEmatqqOyLajNkZtcdmqahqDtS1x2rPSHoS6boYs8VADrb8U2Nui3YbD7kF3QDer+G+z2rNQmSqSVgYoPrqN+b8ZIMcZPtHwaHDuos2zhy7+Jp7CtPuIb8vLDtyBG/Q7Y1nC7txz+hXkBedz1AmP9aMMFImA7zYWNRCvI6ltfpYC8OF5HR4NeQcsGqWAadDMrgVTTAMeB0WFp4efIOZiHx3KPhGcChohxd9v0nf6eDDqcvGHAtJ4i+4p6H57PNaWs4/u7lh/qWr4Of6c9s7ZszoaD/3SvjH7WfQKv18H7PtU/Yxd+qO0GzvafYyS4ZzaS8TgyybgwPFsgPrJXyNiDcyH2WpbIGXyHyU5CCCSpn7jvsByozyiQ7KwhzdQQl2HIxTePRKmBm1msO+7UPdF7dVuE94UqACs+As1PiUXQbagYFW8sCJn+6B+5dyk3G8Hgeq08x4W9H+4yGzT28V7xOfFKm4F2qzsTjxMlffZzEGC8vKjUG2pl6Pp/1/uF+CtZP2S/yrTrlfggv7YH3v/Ftx57qHtRR3PvLfo17i4Pc7tlOC99IMmFBZ4BOQf+KYH/WDs9ga9+PCBUXdQUb1O2UqsVCQjGYekF6WSCPMNSI9S6cgrJcxchwWAJzdn92vl+QYUy/Y7wdnFT5mvtkfk2o8jTb+w7TDn5d2tPFE4uk+anIp7iQfQK22nVinHZgXQ+W0I5eWaEcuJQ5+r2UHZnpUFk10P/M7ccE7+hZ+n+6F+xp3I7gRsfMyH2g2Qt2EGYDMBoSncyibW97745vFWjuCV35yw4gzGL//yc3n0Wvo8k9uOp9eC+XtgvIWiV9n5e2gGPHCnKwwXjTB1Mg8VoSV1t4OEyk7WAbilcB40cjbAyQkfv0vZ4uPoRNsDsxsDmvJ5qA9giYwNUHgagJLQwJqgsD1B1lmf5D5H2Ss8Ah1pj+YesyauWRzmMdC57ejHvnz2By+CQH0F5bi549PPEdXJvc/754XvmbinpeuVz03+jznb59mlLFEDAKS2ab8ELIf4WuGC/iYtiQ8zxVuwRvO2w+SckPh/92/n7flmcIDeCasGX50wV7kK64ZDrZmiCx+siZQqZr88II1BvohD9g0ZcAtawa35QbDFsO9oEA7B7CNWrxOftjnyGDQ/ot+tnQEh9qDR9jicaQ/OAZoUgz2S+jBnwlmYfq4EjlzvmOhGo8siMRzi+zzLctmrE8mr56xrPDetLoqVa2qm9Z99rnnng3jnhAi6LD4GuiRUzXPWLw1NeZlLDOjw8Dd2fbxEOssi2kRsoOHennoNPOiHerVY6ZdZTHTh5dt2lT6Ea4t+wB13gN1XiBFkIJamB/vmOZzelSbHV6QaJKJVUaKAXjJII+7bnD20JD90OEDvOMu3fPPI1OYYX3BqosPwI+4X2rxXzvlf1nPE1rD1026wwjjWdw/+hEfz24ur/geknkhc72CkWml+BmQVxJ8ZxM1kTnp7xPxDfqKVnTAj3DNlfklsoNlwTt8erNf6VIuyPj4Py14EOK+3s8Qd+BI4BzzDgkevFT3Z+HZY8/yPU3mV2LPIv4sKXuWHZbCswuvJy4tHpbCheeFbjxdnAdytOckOcqkaL4oRx0gR5kAvdqzyaqWb3i9NfLRy8OfRaBOPY1AFeedLFDLfZUztYzs9oGQ+scclr1/r8eSFrYBjVcDjc3AfSF0115kYfBRdpd6lwVHFay8otiwwcZ4PoauKGVIBlli815h1+wsAYjdtnkA2rlDyQ73j5Ry2jlyHBlbHxx9Y+8pIwNX2R5vYW9PKy0BqriwC0rO9w4erq3tCLEb6IKdZV+PDC5lx9UmJLTKwDjL5fbhamYVMvvwG4XXKy+5Tauv03ftNhWNw32MG4br89x45PS/EWTadaN3QJ+btSi1eytUo8aTF5IBvvcjsnF4menZkpg9fGA5O9gRPKwf9IPJlqjkVjKM+3XN025a2R4IF9amH33ggYU27o97EV8jTYXZFdGsoHNLoHUPsCVCYNpmUBe5p1K0hReLijYZeatwAQn9QzoFCf31RaGV/eo6BRm9GGyNe7mtIaOzt4u6Y69kbyQ/1d6QqfjcCTs92cEyn4v9pB0fZoPwHZ9xH62IzgG7gblIKfeUCv+43ws6fni46JuN38/iSgrLmI8J5r4Z5v7XUAXDXArAtLelqlRXLJpUXWOSoBMu7go8HNgdoPf4HvM946MvKK8p7yn0TvkheZdM6R3kQbITFAiv3RvzlvJcekXJDmzv5YHZcGFknzhYuot9krwBwVExUb44Vjmtm9zo6tAm5+nkC4ctKQW692Ker0lPXKDLHFhI0uWCB5aUccnTMrvlvNYmp9dTFD/t01rOa5uXKcqf9Irmi+KykQuh5Beav9h0G8z752HeT5fYXm8CWvqCZg4y2gQZbWy8Z3Ax/qkLLoyOgKPaQYtvbd5Z3nO9VAi6g8kgpUpltDJbSaMSYlhBgYgK65WTyrIlkKzVajn4riek1tYGEqt0MCZqYZTx+FcFTIJ7UyJ0dTygxjfZG1AVruLU6T386vBb9o8Gh18d0ilU2k0rId/qH4p5HovEYh7mMgF4amlNy+45M+0OVDY1Js7879NI8IOlG6TO+oC1qTLR+MwJIr1we/EP3Oel0zUBa04WrduVZhQMlug5vgYpcJH1rfKXa/NRa9KyKlVciKyqZ5MQ25TxX12fUus3oTAO61RhNHl5+GX9DXNYz4+YoCxpQKfps+vzrlzR03wvJU7s/p9PZTOM0sKlaGT0Z8iIZkBvGQYvP9RTJWGBzf2dsmbkCqlmtjhAIyUGcYDKTKS8Ojg0pp/OHzmsJ4ft9cmgX2ZaPbmWkRuP33jj8fce37jx8Sc2buR1nQHy5QnQd1n8kJG7OqskZgF8RzOLmkClQSxIA1z7tYw7PQ6DJjnE1Mj5IzoT6a7q1ic2rtz4+OPHj9/I+uEficKgvin+GGSXEWwBD8iTFKpHLagTdaO5aDFair6ALkH96Bq0CX0N/S/0TfQddD96BJ+hPSrfJ333Pvg/v+eBex6c/e2HZt2z/tovN99406Wrb7/r7Fu/Pmny5OYzzl4N/9c3Lz/PdvEFQa+3wWmb1lUZscH/dENz87qaxchkmU8XYUu6Zt1607cs3/kW/J+16KH7Vl209V9maLds3nzltjtWLLvjX+D/dVfGkpevXbvhrHPt7nP94baOc+G/uuHKuqorrxxoxLPkuYKxhzIQL1lFjbhx4LpHFtz3wPzvMpfM4cHBI4eP9B4+Auor+2A/wrNbvDzEDjO2Z7P2IbjUPxVzrLIvx7/gfz8yqH89aGfhyFAeFDoIhOZFlZXDn2H6a6mcUiHFcnhRvBVvjJdYih5kSxw7Wp5i/AwzOFN8dxXBDH3Fd1z8Xi59Lr3zuEU9VLB0T+lv5fee6tlU8b1UV6b0PTvqHmdt4wGLb150FE8f+XHhh3g6yV90UeEOnM1hnMt+o/j+ca4p15RsVNXGQituasLw+4NcU1OOnMFeP7nt6EV4uvDlwg+PXvSJo/h3clMz/LuzKZdrGvn3RiilqbmSfYMPsNfCMvb6J/b0Hfzz7RddRCOsftaKi44KXz560UUXffJlPP0uuCULv4VfQ0lHWQF3w8XZ8M3IRnihBFr+l/xFR8krTQ2TRmbCV3c2NqokVry7IMPFe+z536iNagNcXIunf/Lli6DB+p7E6EbBgTaL2z49ntulx3Nv1sO5hdtK4dxQxn1QRh/HgQlqFqtMe0yoxyr1yGxzkQe3HmHPT9h/69P332Y1M7CWxau7mdeby+NSvIcVBUDbc9o0txvL2wx4GzI4NB/F8jPUiMw0/BSlUHoBGB8qeGPYznBIdd+XLjL5ZuUEvTMcr3/pilm18ajp3qs2fOehsei0o5tqA53rH7h311iUGutTotCDDsOVGc3V6swg7gQJIyM7QJc1URMVZMlklLm1KSPQFfVdOSrJJpTPvdHbPNgMFqV9sBk4aLC59Pn0FmbhgXILk48L1L95PF6f/M14fZcer7/5xHD9CeV8rvEdD9eHMdle6MGLeBlW1KGFjGYwcksnEWSzxWSVjeyEs0hkBGbuYRAhpZJfHTpcOubAzwToHlUr1o8GLCoeU3i7WCc/rvBSqeIT+MokoB5gLcHcY5rIVxN8LH2rFzfP6lEXr2YhZD2zmtWe7tUcL4MIO/Cj4lIYT88PEaLXgVptotez6GVWUAnIWecV/GhJiRClcV0Bj04rnI/2jf4E+dEKrdErO6jLDeuV4EcDxO0yagy1YMDiYp57JIgmo83h9SOwDW0DW8BCYjbJG8GhXHaovd3+BjAEaJDAHcFfNLfDomY/3Fy8cnBG8UkyS6Oe4UfRWYI1XzqTk+RJrftmzUp39cQb6itmdAfna6Hza8z4LGKZvOBdvyE+r6l+4dnppiV+xXFGzH9Form3Igi644OFOXjZ6Iswo1KoCbVoIUtPnUtO98RQTzBGexKysSdb3aNU9Lh8Csq+3DxsHzky3MzUlSNw2d5+pLTdp+dNGdsB1bccy3e2UmXXeNnqMxa1Wg2T+V774laT2Wxq1c89qN09udzMws/Ktr/arOZFTBK0mhTF1MrOQrA/zsyVnYkYnSysRvulhTB0a7V5PphKRJLxO/JxmTwt/0z+tUz9tIoSI8Xv0z9Tsoe+QF+j9Gb5bvkRmcqCFGN7C8ItdBt9FKYqIhrGaFAQZQJM8NJhrls0swFo7wVruJe98xQiHMrQRROtcVdO3t+3smMUwYt4e+GNH+LkD1m7/qOwQbSNMj6t0lwBS7WFeKW0RKzbkLhNQAJhPnojMNobzEX/xjDftyDxGB3bCRBtvyo0Fpp+VXP2zx/79ye+/+I5awvvYf+c2mSydg4rX5gk2sQFUH6d5jixfML2G4zUuN0qwrwYLAyP1YFPX8fjj714jrigrBJO3/8QXhQe47HNzu0U4z34W0/xAJGxgGThsb/GhaM8slnv9wfCYyW/O0Z78beKfvcJtzM3PR59WpgtxsV5yIWWsb2oYzsMFj0lCctHZ2FJgSx+uLLJDkEwuVYx5Cxm4QrIuMokb7Khqx0mx6ZyW2x4UNeoh7NgavhKm1F6mHOSORM5dwrQdzGe7JjxletH/p+bh1JVyY7pm28lnluHUuK8W9u1detua8+zqAI0gc7t5THVOxQeolQek2fE22KlaLxsbzEWr4hsM272xWOiDcj9gx/84N9+fnbNr/BB/LIwSSc49kN9ZxYupb8EnVtCk0APLqrbLLxih1gMeTFyZXuAiEKW6dolVbikAotyC5C5hf7yxk8E+sl7LFKC+YBlUof+CnOlBqnoSRYt9NqOuhaGPnpMs9a2qFZLhaXeQt1CZM/om2xP17OHvrNbC+BAoLKRwZqZayr5aX9FqFV8WR9poj6foaJuD313O48jPva00aIqSoUBsVO0NelcLXsXcsTwQ/o2ctJ3UQV9C2tf5RnoDx8ath96dZjnaNJdAEV7EIRfbuTAIY4Uq+MKckgFF99MHAPyY0nmK6PYO46CVkLTnwRrCI89hA9/nd6l4XNcsVTHzFX52y4+i2DSkps5edatCbY4mWRr8vml4XMbUw3k5vPOm25UFncu6Uw3e7dMT0yeMj0TO9N/xjNXmCXBkBR/mVSautMMn5CMekgavQN09IKJcpChC7y5IxTT0VtrGtje6ZtagzuoFjN5GES/WCXuEV8QxTZplkTaTLNMhGUVvcv5sFP4swd7kY+RNaLFFKyntWHBliKDwbRHo1okoUY1A8N/3u0Lql6vYGdAvE6WmYslaowKFjcD9XULjMghILJljMhDxSCaEoGZ5e3PMhQjR64Ikx+cP/wyMI0OzMoMb2kcxJFFbsZ1omZK3PuOrUM7Z82Mzq7ujV9YV9jc2PaFNU2XUlNsbnu6UqJoadf0pYu/dMMZ5335gi/OPXvzQznfrIbqKUCzq0kbulX8OsjoCnS1jqvuPhlXvcLEQCIYWraHvve04o16id3rY8DqHtBNApRoEhKYS1VAWgWuCDAGtXkXmrDJln2194B95EDvoSJSE3Qu/8ryXpYnrLkoBErqvquECD4BWmJaJ/ybVfhjp2IQ5ajTZ3goVGGrEhfDt5885q105v5zmb/S6J1emMkQ+5n+82eSwWbgAwfwwVf3MjBAzeYLgdSCF8kPL5RNrThczKxYWXF1Bb0pjIuwJXvcL7hfc9NfO951kMhUI4yayCDC4d1G34Kp8o7mZx48DcTdVhB4DCvUwHyZBAX30neQkW3pslhf6B0L9O3tXbeuCBKoY9UUw/J8sAqX57nE5srU9XOvm92VSF8/47p52pp87bRFSXeqcelNdMn8mfPnX3jWyvkz583uW7Tt9rMmL2mcc/GZV+j+/4OkCjcLy1ElOqxVSjEPQy2oblTNEqbIbXfH3NQpehikt4e6RFLJYCVMeowhVRB5loN72xhKQlDhOPnUowRwggY0kGQBJmi2h3XQxDazVUVrwjeED4ZpPrwwfG/4aFhQwk+Eifnl8JvhY2GKwveFiYOGjYrWOlnNKnlloUIVxzOMLsD4LEprLAsEczKOA30zSWIf1LELGDC6jouuo6JziOkyaHTOHnJLjieAc6g894w+F3Dzg6HLFn0hYo07ageXTZmfyj3rMlscAXL5jCuv7Kte8MdOuxF7C1uvW4Bbm0BEFXbcaDeageUDJIPeB35Jom/uRRHmTHL7VdEfqNAZJQQXF0fWR8hdwYeD5G7lEeVphRokv0Rsbsbo9uTLsLaE4fJpA3JiO3X6dVwRmPAoOTq4w+BQkzx4rXWKOph8OflmkrKXY0majAl7YAjyhw+Mw3Ps57IW+Gjo1WEWx9bfe/L81+FmMg1knIVAvr7vatfOv2La5Jlzr8q3T21LOI2mqlRHqrG6+Zwp2XiUGpd39Sw/cx2HEujI+SxzKusnf6F35pKqsG7LHQFeioIsiKEsuneXHPNHuXdyh5+Dq7ymed0+9ecWvMKHFV8UFhpqpj6qsLVne1BnEhswyRYgRmNQC5JgDYOhNCaU9DNADit9a1ecNogkxjH4dbBN0Oqe4fPrve0+v44880px7PN6bNCh/v1FJM6R5mYOXAJCsXYCVP6E1LKtJW44IRs2jn4vPG/JSm3yrAVXzs66jIrDb3gw5AKlP7jH0BkJz6uOpRvPagVeWbhwyYJLN/R+seGLX1Fko2f6yFc32w2mGA6dl3CcoZ11/sxz2bw7RNpwDc/FcvDvy8USP11qEFlBPJdnHaMrx2Pj2RnYuxawOZjnd1TGR+UPwV6X7XKM4YPrSVlMwcqDHrzQgz16JhAQRSB6Bw9wGPfaiSgW/8SMK7jmn5hxhdG2Bmj7a+EKNBsbtO4Lpq6beuNUSqbiCzrXdd7YSUkn9gpYS2ZUrDk9KkN+BEFHkpSRzsO+97DvPZ7KJzODDKMgWMmTrYQGGcIz8Ga31r21+75uYW33QDdRunF3l8JZuI1rUZn6loPVeGE1rs7XL6y/t/6JeiFaf0P9lnpaH2yLd1kEU8UkrWOSyvJrsFQtpGUSjO7utNdFZovVDHAGe6r20rdhAIC4nLpAWUcuZ39jvy+H2aC8ysZluNk+0sxOhuyHBaM0ILXjOVH5J13+gQQYH5REpYJ9ZYPCvwIFYOJXpXHy6BFF5aP168IxS95Czs8vxFhWZhQ+mG2lvbFYcyii1BWOwSoryRGnz/hwcLK1Pb82eNGyvpTVYOskbZ56Ofe7r86VgoW/tCpxj6fW1Py7mx2heOF1GDggtzP3q3MrEjBjrppsbrzqqhWVc3/H4GXxaAvoGAd5rpI7J+QqeYLsG8tVAgp1IBogdnpyuhLbxDwkPP2QVvTse2DVOUUCk2wxecT+Im6VnqTkVIk39JNDn5KU5ODnzkkyej7JokdEF/Kh1ZqD2iOVqsmen6HCoxpyWfV98qgqWb3WtJVaFRdHrynClBsM0hrbDTZiU4yyk8lOhb61HXmIvlTsz48wPy6sES8t7x0ZbOaL6qvBIfv+YrDChES4nlKu1EdqV0wLWc+Z02oLODdtam3wkIev7qiYjNe5K87zde6qKXz7/CaYe7+BNaAa9IkK9IZmQTa7LWajKdHmCkGTd/kq1JDHw5YEW5BB5h9jCEounnAaLgQ3dkkuryvtopNfdb3jOu6i+2U8RZwrni9Ss/is+B/i/xYFw9eEbwrEKlQI9QI1C7JLEt0eQUZmpEViah9agw6io2BHLjKvMBNzyt3i7nZTt+zyCKJZlIAEO20hRM1MHw1zlZrNs0GOeMSyTONs//7eMbikXo6WVAS5AuW6mKhCP14r08RpwNpwNYNo+4l//4nobEVctmr88inw2LjsegNkV5LjVp31P41b9e3/Adwqg4TzL0ivSe9JdAJqVR7G7Qk2bn1oCwzgKBKe0MMtGKqSjmK1n61CMELLe/9HIaxw8p8PYQVdSyAkhMR58N6mhRFSUj6TEjRU4kolkcDY5AuG/EQ2hQwGlB+BGcugooZxdmT/G/vtR/Y7eFQJPjFrLUdXG8uSwnLWxIXQyK3W0KVNI882npX2W01RWBJId1NjfcYkkPXkXwsXroxPT6WaohvpZaviQYc/lfJ7p3gWFK77v7R9e2AU1dn3nHNmdi57mZm93++zm2STbLK7IQRCdrglIQhBEREhJILILQhBQFG5WLkoolCr1WoVqsVLa4tyM/raSitabUVpq7a2VapFrdVU26qvVnbznXNmA9jvfb//vkBmZ2ZnNrPP9fc85znPwc9oZhgkoP04NhiF4Ri0JwN+u4VBSZsdIGQLeEO82RawSPQJ33zJaGf0cunYS8pbx0ee0BXD8TodyzwDASjoTGCzGIYucB3YWV6D/UgiPL48udfnMDsjjnY16Xw0PT7rB1+N/4uWEfIuu6ZlIkvA7+uLKWXnB6HClAyl4XRMw+/R+qGs7gVxjxPGWaspbnNa5IBV8LAuUwJC8nRvEQqC7Eull94aUkh200GWVFT/k34xdTo782j5nwFtRrb0s4aLku7yV+h2MFjuBAu/+nRDpEbTCpErWUv5XoOHSUyfLvz3qzB9ApFwOJn0OUASWbmk7CCPIIUjyElaiWOj+9axHH2Gl+kz/Gkon83TwrxEU4I8BZlKGKMlQmrcBg2a8cZ6823wNJz+4G0WWyC0sGzrDQa1tjqfxAtSuD4ZySdap3Pnld/9w1cvXR4MiCLSNBAOXsUWTPZEKJBVnXaP0++ZUJtuDErM/9e+1/93L2hSjMdsgWSOIQbiZ7s5Iyzgzyw7CVLGNEHAaMPvc/dzi7DPWKVPMq1nbsLhMIiLNpsS8YbirnXyNhnKitcV8KwKbQ7BS0NAC4FNtl02eIUN1NhAyCZjInugIsuCaKrojIopXMS/pE8h/VEI+Y/3vFx6mQjnyyW8S5ppUOqP0B4kqBKRNWjowrDPBhLxTaXD34gnTr/jwbtwyuZ4glv01W1btQSnaVwitQVJX73HXjFyrG09/S9KZ234FNuHdSfCXKjXA8bjTTaIughFMeZ0J+0OybxRBCtEMF8EolvyeFwOu4sHYSRJyEwW4FTefKn45nH8HYzHxw/+cm4oR1JnpeOkP5mWN5EZDiNPXFnSlnybMMzn2FasQWMna+bS23aLpSFYZQPODEzYBHvYM/kXf6np6MmDO0srYMfeujo5uap0Kbyr1FQ3Nikbcv0HzMtXaf1VVFcq9VdwM3eUVFKSgqseJksKpYzFZc5WW4FX/7PcCt8wcfgU6sB0iDKL9Jq1ETDHATodYIo8R4ajZTDXBjpt4E4EtiFwJQKLEFgHwW4VqGSRegcT9/n9ouD3ubQQL4jWRhbTpvR8jvySbGI2j5WZJu3P/oxMlCJDKCMrJxsZrrSROEEdfSueuHP5/Gio0Nx96Tdnto/vuvay87KT/fUPz33uujXgxWd2fHfN4nttV2cn3nLVPRsvvaIGx6LTe7+1g6FrC7Tj79OF9ttT8DcMo/LWHzMvlBrI3BTAZDSfqoMq3eEsVBFEKSuFKgaD8CaQaaL3VmiB711Yudc5cm9NktybJvemK/emv3ZvzfDbSOXOs5usgB5X9BgfX4ofDA3/DR8fpXpN6gRfe2xr5mK9dgezA8GtzB3MPmy1YRytJeOWSSZJOuYpjArRZjrBCKDXoES6DAAGwh/pjfwKq6I4TLOsVuhb4WAOosriOI674JY9CHQjQFqDrESkpwyHUChotHpd/enfexQyMpvPZoaYYmvRqCvURWUzC/pYwLpb3+wZaA38hFHQdMaN/x6Lpg8Vh+Yop6ldIc68hxkI6CKCOkuWJ3MzXszmvJr3K8cbGucQu8PlKstHNhVGxc7Zh3WkuhBDFlpHqJezZHS3VtcNC7XZqDokU9KMqWmUhgrDcI9hGqYsX2B+YEo+xTAO3QKZRMJm0yGIomomQxkAmAPwN2A3egzrRCOh7dP43DzGhG3cvCObRbALqzGZO0ZnLASeJG8+rpvw0/uH8HODc54TxGonjq+vHz8RPVZsqB8/vr6hSHPP8/Cz9FD+1YOplHsdtzFABLeCGxGaDrogjEcCwVg8EQlUxRLmmCxHyBraMZMpIgYkgFEFqd1FyMQlZEUJ1rP7qjJMjVIDawbhb3W1uroKe5V9Qf9fA4GgYMze1sckGLCHJh9xMFFgmKqA6rc8ajaLjxYloEjdEpTWZR6tzkRqsvhz+n2dfj+nKKwaT8SzraXWVqU1Tyq/TpU+7+kZalVIFEp43zNQOoXZr3yklFrxS7mnFe9gCcG3FD/CB61AGfqIUT6rvNAoFfM+oKs4vkY1ktnvN0s1bLCKUwb5ocP9HBesYvHegf6q9CB651B/FQw66XEwjI/xi4AxXyaD/5NBBwLds/in6Ccy4yAyo8Zyo8iK6Tgowz4fu/xcG6BLgufxDoYkFDQ5yNv7iFeD3wQ1a+Zie26dv7T8errzvbVXrBhTtfarjxrqpwRa5jSwTiUdWLTdEK3+0l8vuLJctaW9PH5JQ2LdQPlRLTluKRrY0KWVf7dzZoW3pumUt0XmS8Lbw2YAKjxYwjCjHZGANRaPRQKBWLwxEsjE4sVIoCUWN0UClljCGQn4Y4lkJFATS+QigdGxxFluc+yUeCKRsVosLS2joT8QqKnJCFw8HmMTiaTDGTfFYsVkPIejicZsD6Z/njBBqfwjPML/jO25/BlB0jjYyZZOEY8fOExYwyYw1XWpn2UzY8w2NLoZUx8fWkbD6qAPZWrx4cH+QIZwI5/B+JtsCEfOcgJDVhwZVyCqDbiwuwIVAEYYEfuP469dW2ENXOuYmm/EGBbzwon3Sv/VWN8ZKN3smFpoKD1NOOTsKjTASWTP4FBpKdjSq9dpmjZu2ek7eotkr3UZuLe8cGQfLR95f0QXkZfyK8zcTPllOcMvbAwc/kjAGYtbIgFTLB6IBLhYwhoJOL7GF5PgdGB+xK26ZbcFWijxiUk8h8LnUPcIoS6GAJiAh/sdMGziqVybqFznyP+zFPyfiYOlOk8JhGaWnq5qmeL1TxkfhpPCxa5A2+UGGf79hKZV6QtR/6XtSU1LTl5w+vb1FxA7OHxk+G3uamIHrSbqly4t/xLTIaK7YXdkVwQyEYVsgiJGASBo2MSegSZmhFamZZRWGRCldqvK6rnYA6U4WCesE9el0ZjqSYkL4jMSrAREr6iNSrD4xVshZzW+PZOJRIK5kInjRDaTSWMgrQVDIa87ElBjcXMkoMQS6VRqEL6oFyTRKaU0SdRSqbjH6/Sk0h5vKqSeqxBsOByCiiqkJHPcc9IN3NkBTPsWSnwq7pQBZMkZoT5jI0vOCPVeuuM1eNJ67i+jGPoCCK/q65n6etrDBrspbK8shG0pJZgxoXAEc+xIPxeGdkWmzFMqzDOU4BxjRKMzQM0Q5SWBnTgmopwkUalI0giGIWJ/Bf7g37ir/NSk7rrS0eys1vLNbenLq+HEcMP0NhAAYutNBm/j2rulUvnRTR2adsEaMB6O7q0drWm1tcn55ang/vl1CyifD2Ifc4TwGd5U4fMvDD6D7tpdtZCu0M3UVmM+A1B9Lp/xvY8Pn4Lb6b3fIb4SLsG3JnUXwl4y25DVs4jJhngMYSBCtU9i127c3dTUdMbPLrebiJ/Fx3Ect71HsIzlSwMr4+NlOI5yM1upBPnskYA7llCpWRSoEcQBgQIgIL7Mx5j4BIYPFisDczpZvNPLC3G7ep9H+RxzmtRyDLUwWczuEnU+tGo7cBhCt9lqo/7DKrh56j/cLsoqN6z4D2KtiL/GrgBST0ECA8NDpJvYRVya7Vq+qLxl8obSUxvb2zfiwOvZvjWRrz7b1slqGtu5Dc0ne7Q3Zg5/J7LWHWJMQKTfamIndw23g/sOx3JexV6AZINqzWqBrRXVgobWm240/beJtcAAhBLwg2vADvAF4MxcgLuYQxzHYuBHlMBt4pwmrCwsZ2LjxiJOrAmZ8FsHGNKMidNdEGC+MOihKLuK3cwimdVZyA6CA7rMMbtJkfxK0ybTLhOHb/pId0U40M3t505yH3PsZrwDyXJVvhFM1+Md8imf9uAXtYVoEQZsWB+2c/V0nSb86s1sF8g0PaIWxjqU2F2Qpa4Y0yD/6YF+hipC0d6CKZsHeZAWQQ72xWHbx+Xl5S5u+b/vmIVOnQ4SjItpdojKxWkqJ358/AOKeVV6nMBydC99f5hgXuY8bLeuq/TZzIBrKJXdV4H1/HZwo8DGolGfj/Hu9T5G+kHheMIWxL6ypkbO7M88k0EZfOpAOhQcBP/SW1Ir06A3DdJpxhRNJHK98T1x/Ih4E/flvDU574zM7gxcSTaZZsFSxSB7lUlk4iA+iObqXperlQDiXoSYSgcMHePiKXV0Fd1iU7ROr4N1MtYHcrVLllsVMSrOEBEtuxan1F620JuZjmm8etqQ8l7PNGUg83llnw4ET1yv1wCPg3PVAZWX6xgPwHtWM95zsvY6RhHwBqtDHbBJeENdC9lcD5Se1a0Yj+OXIeztKUOJH8J/yUAAlVfqgnRz1OtlEpmMiQmmB4XI4f5g0MRYsJoc6meQyT7If4gdkkhZWYFZLdm8in8pwGVUhYlFydYTh6piz+fsqgJBnoKtUU0YexGQhe1bAv7jS3BbeU35H+Xflu8Cd5R+/uGffvPSR2+WW1Lt88+f05lKtffMnNOR4paXN5WfLT9XXgkeBEnQCrZMKT9Tfrn8TvlOMA7UgxzoKa+7qGvK7HJoVlfXLCofeax4V1N5YUbsDPd7emz0jQ/i40EsL37QQmVl0xOmXzn+6EAdpi6+29xt6bZ22l/jfuf8nBef516Qn/egRaYnTU/w6Gq0zrTNjQResF9kQjwP2KjZPGGWZLX6fCDASA1m3QzNZt7aYMHhg2KJYpdvsftkf8QP/X4nIFlp/Aisw+5w2nEs6uR5E1mGDWtzo9PhdDodDs5ssfj9jGDikMnBN9h1O7TbOQfb4AROZ68D7HKAlQ7gcAQDI5qZ92Z7cGiUp9sz7g37NVt9hkzExa9eqqOkKAQDEGIY6aayO+LaMiOhVw9WXF1yMBzyWSVECvQxnLMwZ+CcocHYHjZjLQ6Dim0sYH0mRTkeV3DaBXXgDQ18ke/qKf2ut7m+/FD5aN3oWZrlvH72G19dvW4y0jShIZVdhgKnP16Rr2k0aSN8Mv2T8omlvubd4b9xht5zVM+7Melex/5BwnisDlxIeZeSMMaalJieZv8ggF+yvxT+wCFMRovFbHa53aFQOKzskYFM9N7pW+kHvX6AyVuH3ZMoShIGWCCO/TcDMzU10WgkktLIiam1dYIj53TnnL0u4HJlLDmzOZSbEQbhcATlMAZ8NCPmGOnRSHVNLpPprt1UCz+pBZtr99bCGbWramFtbV0smotE9DpQl6VhD6U3DnoJrT/FyvhpK42PjXCJcIG0jiSeKpetgPEzuyP62kNQOzlROd/YwPT0ABwmO5AkMQ6zmXGHw0xNJFLHyP5BIXi4X8amgR8UYlhzYZ02KCQO9NcJ/4Pmqmc1mGQiSXQU5xMerLT52IjS4lNYafm8i6wfj8+OA3k1tp7Np0x9i0s/ekZIDaYuvhRwCy/StCmryl+tmZx6R8vPuBjetmJB6qv12EMevmDqvRvnjRo1r1ycMbF92mTvedN9XUu95RsMHe2k2BNjA4I9DSzA3Y95HWFepXy+LBoDJ2J/jsFVsb0x6I7dF9RHzSDHLgoPIzRowiCRj8XdNFCCBJYnLBQ2MiCBrRBvMgUCfsHljjN6BEQjJyNwb+RE5M8RFI00RFZFUGQQRnVrDMC4xRg1ui+qfL6aWMoSGXMwoPsId4zQyBjpxu9iV4djH16g0D3ACwrAJvNg/xkUSKFFLkM1iFjK/0QVMZeB3ivn2HDp5smbSoMUXmwg29KTG9o5+J8Yg+ydvt/Y69hewVQZqjM8pWMUH1+J6ehk3qF0zG61gqu5a6ww655rWW5BgijGseVxiJLDKUqiICWIbbJjCyU6WUbFisMetNnM0iC4X1dVVREg6Z+Bv+g+rDTSU8PPMw6sMD5RVG05GeUglGU748SfoKhgswrULKYbleJ8Np+lSSFf1js0mso6kfsiUYlc9hSJ1s+ACYLEjR4CgFqjJ2w2BiGVETCQIMKsSoNC6kC/elaYVQrYHDEDsYmABPoeHNiLIIq+DKT4UfMvLzfiUK8Gop23a6kxX70PpdLnWCx/uGh5Q+nvpdcu2SWWL0/CJfC7hjy2Ybo9RulopscOLI+P0GOF2qIOfPxNTFcfllANTKe0bek0dwY7wpMTndpc90zvnOBF4QsTPdpS8XLz5e6lXrkhvSq9OY3sOVXOKTCHuBwbnen0z3RaCUIYEOWC1aqwsZkYi8/kdXzI8wpiBSy6qt0OUSymyDLGe7GIMxplYla/Hwv7xxEQiUjJVlJH0+tBDR7Q4NE9qzybPSzjUTxRD/JMSYdayZo/MyS0izRYi0hQmpIaARsDGGFMUz7H1mn1NKMms5UyjGwqOQKa4qGehZiNSoYnm6GYovKPcAoz6kDU6h/k39HFfqfVyioxPoKPnuhneJ41NOEw1gTIclQn2DNhLTFEmZxqvGA+apVhoijTVGA0Y1SOZxmXkwFYSxTOoWIVUdB51oOlowet5S/Kz4IJAFkOQf2gFXukdPlYufmHPwcrju578Zm7Ne1uEPzVGwCZya5YfvfZX5VPoTuln31eXudCfaf38j/9CtxMeCxjnu6nPJap7njx8QluHjMayJS/N82Gs2tmj1kEF9WshWtrtsKtNaLFZEpVmVIpNtCMY5X46OZAPhZXmgOuWKKuOZCLJVxugamVaxPBYM4t5HiYyCVhPgd5WQCCYI5HWcCySpJJgEQiGs9Wgaqq0Qwjy0pdbW0wqMSLge7ApsCuwMkAF8U7HwdQIDCmxXD9Q2dSOCQD11PKVRw73SH8wqCRLqdITdaIuSJskmuD2DxhxtTWuoVkgsasfBIVco2URznoJFWZJCQ6m3rIj/CJAj3SUgnkidFy2gBP8jWEZW2wSa2HTcSghaEnDPMkO0GNG3ShC2+8JcvzN+9pqT7/09cCs+eWHpwzO/S7v89KtS66birH1+3eHrhoHrxk3kUBuHvelrt/+FCKPf+Go7/+Bld+du3kGk0DWsdVYBy3+ZXnNs40pWDrXdd9Z0sPOLR2chXAb6bb19I1Umhsu5ypAnMpzybvs34RgTdY7zHfZkXXmQesN5lRp3lKBE7jp6lLIiiltfLjVJSWkrZUEAVSM+0mk9fjAcYcf4YhkIxjifXTqnx+fzpdhaJVFuQI2P1cypS2r/Ob1qV1P+jzr/Jv9iP/IFqiW0LdabAyTZY2QWlyYmbCk/N5Z8ogV8XMFEOtsq7rhd0yILWNvTKaIffJu2XEyFG5QUafyICceIWcUGjpo5xolcWsCHVxWIQyjhkaRCSS9buGDFQxsHp1ZqgCK4aUUz099HeIqikRlRYSPoyosoEgDMRPc30UR/RQ6Bc47GGYKkuUplvxl6xisZ092O+vMrBfjppaChPyBAWkU0Q/Mdx3OaEMjNxqzJHE9ioRhy6n3eOItWrseTOBCveU/w1WgBQIgWVvH5WAu3cc1Eon/ACWfnB4aNm3HaUToKVj9MQoiL/5Gbik/OTwK+WToyd2Npd/AerPBzsBAs7yH0/tK/+jufybsxjf9Kg9RTC+ylsXDA+DKxkfht2AyVardh1AmHoSPmokIJqazthweo9i3APux/d4MP6DcHS6pjONX5vO3GP4gdnDp9gEzXd808iVME/gN9y6BJl0yuPRIUifSXOQHEfH8Ck0hl5/R+X6ncb1gBndlK/TAWj+2vXmchf6Ob3+zsr1z45cHw3bOXx99GvXa8OnYMPZ/Iv10l9UrvZ6BAFf7T17NcXQ/8bP8zC9fh/5fLiEeRB/flC3kcxAa42KaKqm5exdTU00b0G/N9qPY+8kc4Jq0sId9pvcd9sftg/auRvkbyhQZpMw4Dd5VMCYwpqHFxli0kxzLOa4ppqjNqvVNEvMbhb2Co8JRwVWEGQWQRYkA37kBEkZu9jppI/BLuY25n7mAIMxfnQQ5Z5wktI750RN+TxDDNkAmeWB/+PdoQwRZGrdiEAbM6YwQggc8csqY/KEB/mPD/V7eItpUHAe6reY1fgg/z7GCWYDJ9DsAwleQB6Z6LT8PKmmHpncZCcNn3lSsKUq+ZwDOX+wOGyuOu8SlETdelMhvOSj7/30xG2Lt+QD2TXnP7H/rino9nLjlvDgdWt2XbT1j1/97T3A3Lav/3uHyxeWl4HLMQ2vwLx9mdvJeJhGMJnmj2/K3JSF0uDwXw9GYmT10ld1r00pcJJbglZrVbQqmvpnPO6oaxKAdxAIB1ykADOg2xxmwNiiVTXJZMhtraHphJrawoyavhq4uwbUkODG0m0GZrMsyIppVmhw+JNDhPqhp1COkYe/0JPkSJF3yTCLDQvGaF6Xq9GNX02z3BYLfs+dZNHg8GeHrPgM3vmnHlbwB+1GJxB8DIET6BMEG9BRNNISFVG7szqTaS3hX8P9DGSGMhkS0uA96qBwTEqcEOYX9kPEDbW0+Cr1ID00O3QAf+VB/gOMFqqqHAKwCXWD/EeH+gXGgUHE3w70O0b4RuEGZVyCVI7QOZ4uJ8+qTloN73KqlZ6ChJN0crHRYBB7J+DYlxz3+Nb7fvdDZnj749fuvHj6zu0bZ45vbVg0q6m7Y+WcjkWpctcjN7Hjf/DgpofuPnTl1eXhnW/OX/rUUfDq9c/d0v/2WLmpwXv1LRu3zVi5sdLLE12F7mfczB+pVowb7V7BbGBuZbaDh5iHJF72RryjIXIrEnQjB5ksqchqRIVZtahCVbXZHCaTDBUBUxcyZA3nQ6JlwiwiEnqj5DLNklQ3e1uDoAtQENxKVlXdEZAFRVrYi1VlGENPZpcbdLt73dDtyw4M0PA/uxr7fSOgJCvLZcjqckVS9UAiR0NTRhuqotuwrCGTivVFZkwO26DgwYTmKaGLhGkeQ0GA26XQuTcpSFs0YY2wO+AjL5dXykvPW+Xunjlto5g8NnDFGHT76Se2Lyq/v+7uv+4G337sadBV/qw8ntoQMka+ia7PlzXGMp9kqrHsLjPLBVmLaLcwd/of0biDzOPaM42/8H9ezV3l3xC7Nba/kV2qLU0vqVuSZadoXenuxsV+drTWkh6dbfezcmOVr8Zfk2JxTJCKOjQBZLSomUmFEiuJBoTcUaIC7iiReDfWnoMcl6gfHP7iEBF2ukPeqSeaEaqcDRHq11OF0YvFAhPKhuDK0K7QyRD6JARmhPpCm0MoFKqiylWlkAursKU6GMWgjazo3dFRSExswPZqtaEBxiKaeJ8whW57Rrww1oOWfLaSJCWxTSbwuODASnCk32aLCkxqkH8TwzIG70Yz+PSB/qi5kjY1AvYM4Y5REGR0XidVDsRm0dxLGLtdxhhg9rCq09AK8PfcnAWTvr9ly3MN0fq24uwxXb3T7//RrkvK//3499767GT57V29CzejWaOnX7Rw7MWLLulO5Sa3t0zIN1y48qptR5c/XX77vaNPfuHMlvcdfP6ZBz7COkB9HPYNBeChOuBvT4NjjeB59hfqsSS6xnpN+mYrMqekKpgl1YXV6VAKO1xn1KsFg1zDx4RNXE1Ng6xxvKY1mBm7TpIydXm6Hm/AGywIQqQO9NWBurp83EnIbafbSlsozIRe+0o73GMHdmz6Dn9C+jvGn8QMxeSuGCCD6qvzBtF6SGKMgOE8NkrZAbVijFqyYPTo0UZ1wqFoTbcZMj1zKlkwUn8gGc/J4Ucf5E8e7nc6Gzh5kD91qJ/jG7RB/r0D/Q3ms/kUw+gZIwepc9ljzI0lRSj5nNEqn9SJEv9TsWSG/wGtz/36nlseLMRHJ3OXdV/+E6e/zjeuzV0bs7+wrPeqtLOxOt780jf3/Dd4t/3WVdt6xsfz0/uX9DzBmhJp3vTSwvXXjs81puZeddemPZhH7dhO6dx2pgW0Ux5VzxQvE2FenCTCJ6TnJThfvFa8RURFsVtcKSJfC8jWuTysr7FJGQQf6ZgDTKPZDLIMDkvSSyNyk2ISWGsslq+ZvisIisG+4O4gCgbzTJQMvCA9ky2gQRDSg6NH22Vr0YrdWd7uJFaO9ty123vzgGQosz2GOuSzpQz246ROgHh4aneYSp1IxJdrafLl4smCL2eTC764tWmar8cHLb6gD/oazcXjVL8ygScZH7A9jk8MzSFehnQ0JywojSCD1VTDMDxQmhhznalpkH/jUL+prs43KKQP9Tea61yDQvJQf505khgUggf6I+lBwYJf5MowUDGjHMP/j6k0t+0xneUZZhnPUP1qPsNm6nfO9rY1JaKqAoieggXKwilZTup8qbX+6YfK/7zmHnXcZN/axXtvvqHd2VyfbJsyY57rfM1b/g5ITl3IbU9Wn9c0Gpy3Q5twvb/8YXnH3d9h0V399z1x8WRVvnTcpDYTBIfAbaAJdrVfSeNUiiGxPoaMqgJ9KgMEVIUQ8Lq8BQkIVsgodq/P53YHeFst5FW7xAs2RuEFTvJlvbrDW5C9u7zQq4vmgtdrJxXSghXzjktix/RvPUlUTvJbbaZZRdqhXZIU1aHSS9Sk3UHetg8Ov6W7yCUn7ICxg277bjtk7ArmfcUgDmVGcIKxS0pEMGbAHMtVsgtYRYnLalVbMPeYgQxJboo+X8AuCTaIPZXlUD/kA+5B/ssD/QG+gg2KlbE6zAcfcHoSKZJPI0X4CeM1QZtAXHfvnR+lHonrM66+cp9W26EkHT+atgD+7bnyvpL/p5fP/zd8YfHCraXz4f6e9p0fkNG687GN24p9lxmHgW4j/j/s0i0yKVP/60H8KhP0JuIday3e8OTIhXc4cg0gp7q9z9tfdCH3UyDAKCBwyK2qJht2SAcY5MQvR0xmi1tR3dQjERxGPBLCBm4UMXVIH1csIH3MmIKCGhB8hazatRLtQvvRM4jdiwCDZqA+tBmxCKkWcruKHZIuiQK5+QSpQiJwjPqiijMyKj0MJNZaMqboGD+BwxaLiVFU7G4O92PYx9gG+XcPYSdkcuKdA/0m89dzxjT+txtRnqrYAcYJqosM9TjAp4/89d/f/95n/wLb3zp1zeKTkNtZXlt+tvyD8jqwCXSCKeCu0nR4denGtvKT5RfhRqM+EiPL/YyLeYXKrkXx6J5hDzKbbYBOBQuR+YKM04nM1iwpALcpMm99huzw2DzRydIRoysapEcesuAx/jaCSmmhIuLh1SRm0DuHiKDyRKJViod5EOVn8H38CZ6ls6LMdmeBTIVaxSMeGypDaDM0Xs70ZCi8IoiWuBgqqBksqdSXBw7KPGYq/9WBfmQQiySxaGkmqIgjKcsk9gJasOiNmx3yGtWYtfG6Sb/4y8RZS8HUvZeQEsz6OROoTrvIMBGmSwysoXQ5+A35euVb6iPyw8pDdtMauFoeUNaq7EJ5oQInK2Cv8wX1BfcLnn+7OT3Rl1hvv9bNVsEqpcuOroY3wT9B5OUIovc6CTm8ClFUZ9YViUZ9TpdLtduTbo/TjQGE15v0+Z0+D7CrrM/GShLLR7KRaDYKSc6Rd7ndXq9PivmipG1qBJNqMyYezwDg8Xj9XkpyL0v/RtI3OPyXQ+SPkqZrFGj5yPQCL7km6+v2wU2+vT7I+BTfLt9uH+vLGs3BDJJXcloDpAV+Jedeobu9BfsKxNVnkG1kdIvsAAyEaZaZUYwmkJnVA7Q+g4Beq4qfD6jIx8Z4t5PmuNw+ibVRe88apiRP4gxaMkYEXAVf898yACQ1D0asSloDswB7z41N4/OxUEODv1DcD7ouurX8dHnbg/56ylq0vzwVOO7PVaXr/f5JPykv6Gc18GHZBRv2zcKcxjz2Df8TfcjdzISBz8BRo81LzC+Y0SK01LoWITnaHZ2FEG/2+ygFRfMESkp9nODEtGwQeKcg8IIo8CLFpGJSMjslyaxi82u32/a7yAKARoc+FoBQiBUlCSPxQfhPXfRn+bcFNavbnwL7GTOOMUUhKt6sN5Au0/C/dDnKkBBkj/AJiUOikcpYI1lt1zvk9ykl76d+Ug7gHSKNPVuzNNJopUuK0JIAI41PWJOhzDlTLxPQLYJkt0sM45IkF4k+DvW7GDZEwxBWqth0A0epRiRC0VEagQSgMNdo8RMGARDGr+gXycXTimvqLyq//hPwaLyvowU7LbTqwlGXdkztyPROWAWi9+3ufQVsKc1Ddx98dPbcbz0+53flH5effW6rUeO8ptzO4kCeqa5ULTmuF0CQcbLQIodDIRcWAI3OubVjM5RMxuNps78WmpmglqWnrdj2bEruTT6WPJpk6RmHSC6MsJzbIYqy7AhHQkEs9kcIh4LJCDZDepIoRSRFzkQjQI6siuyJvBJhIxGX2+kWaeCSxG7mNFUevPMP3UlM/AwH2Os46oCMQ3HsdiCHoS/nuNVSZmSghSb+8tRqGVbfMFcVTVJbqIelo/3JZNppkUNOE/QbDtacjlNDlh4JvvPFitGnnbzI5JgRwEoq5fM09ZtrVg3z1kyMXgr+/vC2i7qC0TGZ2oI/vC/SnZtz64PJzCQntn1TFz748wlN83oWx+pb2xuT85csQDeX9l9yYdM18KnSlIsnbv3LItKT47fY/16L7Z+34hfai34gRy1qweP1KqI4AdswwY6tTIMh81jUk6QoTBIlswewDoY1ZbM84HnBQZoUeRmz2WNFEl37oxZ/ivpZ1LXStcmFXC6vKDDAZJJ4XVYLPC9i38pI+6VnJCRJWPOo5Hvy2LpkRrJQdo9RRlY0aoxGhq5sI3UwhswTI4Sxp8Q4BDIrzYvjcTpyzqGROYHAQavSCXB0OXkA7n3T3VkMJ21f1gL+gTrVurx3S/mdINw9fqM1cfnpYTDtknx116jAwkvmfFX6SwXjb8L2Ywr4IaVR03kBMNO00LTahEwml8lt2WLeYtkWNl03ceMUaNJFZ8Hil8f7xiP/BBU5vF6HgxnXbiV438dxzDhBIHg/m80vrZYn+NV2K2eSZJJ/SkQnNUxaNQlNmoQ6a2v1UdP3pkAqpTPEsugkM4GaOgeHX9LbCF+YTqUTdnZ2S73SSmmTtAuT8hWJlyRdcfW5Vrn2uo66OJdLDxrBQTASzJJAIqIDPbt6JDwgJMeUzpwZ0aARAh2csp+NE3wJHBkkcvFEIUHihOmJ+QloxSH5uJEIAQcICRwgjPvPAGGIRmrYk9AoYSBDooSBwGFBaGG49kH+rSP9HNfCOLzYKB3pdzhaGNU/yP/5iX4VOyOmJUGjhxbzuMigkDrUP85cnaXRQ3V+ULDil7PRw9mgXT0XO7lIdd9IFEH2aVhIlIt1fT2kGOm4dE5Qgc8pGtE9EjD2L1il/3hS/oWbL+jbvfeKNSvmXlT+csvt/torq9ZfcWigdXq13x5r0yZNb50UrtlQc+BV4L/8ol3czSlb53T35KX149bBmT0Lit3NWsH68Gvzr0Pid9d+/4eNNeGk2Tm/IzcN8iceAMyPzl+y4NLkFdca+fDJWC+fRPvtJmuK2k8rPj5F7ecEKoOz9zB7wJcOdF3o1tCtYTQm1BVaFkJfwi8RvNvxiANKdskhh6SwFJkavkm+0S6MDY0NTw0hr9ksSUKS5IWyWlFjNS0Wi+K43uFwOl+JguggukxfzFSbNpMcs9UcjfY5V5FZ7oGAkswymq7BvRpGk33aKm0zuVthdpPIlDNnGQn8WfpEgpulvdJjEpoh9UmrpN0ShjZ7aJFbn6x0K68oiFFWKruU/QqrYGNaIvJHRljOVsvQMLWFxLBkYs5AkVRkjIy+jVzVWiQCZVTRYNShadWSZK32mqGzOkZ9XbXJKlBpsVbMay5XPCdt4EqgSpSZh4aJdSQkULG2baDZ8H8wj97+q9M0vr7Pnoz95OLlrsCrrrEd4+qLo7qnOyddMDudDM279Dp0+23lE91jbh63vvy3/mXt74Bo+fbyYwtG1dZMWfbuv6dMWr6jBkPmOTh2HMR2VsUoJEw5OHaFD7T6zvPN9yGz71c++E8BPOzbHx30oW2mrcKdAlpuWeZeJWB4comFdJYVnMIEC5KtDLC5SHhjNQdI42gcSgYCPO8lyWQbAd6KF/R5wW4vSW1bjkg8cW44vPxvPU+gYZ8EGDIyTQaqdemkxBI+bSY2WJHlsJ21c+Qqu0SzQUk0OPyl7iCfgHhyXkE6ooUJtHW+tYCy56D3in9cTZwliUQJ+zJ0AKHlbMkTmXjwOB/Aru9IP88Dm9VFY58Km4qZM8nnJFVOxkg7O8+opskF2B9qwPbA478vf/romqWbF6699/Ub5kwsd135ASx8/N6/nvtd+VjXDb+Gres3vbjv15+u3GDgD2LDbZj+Dcy/jVGWLMVyY0Cr3AWmyuxT8CnbL+Evbex2+w/gD23oJgi6c5tycDeO8TBUQHwspi0NyZEIU9UU8YNd/pN+GCXptIgJRE3YrynU0CpkcUxF6WZ6SasuLMMZkn5ZTcZXVhO5HrGpUU/M2uSpahlT8FTVZfEmrhU8xLpaPEEP9NQT05qpJF882LbWn7GtFAISUDFQSWsikRZpIOugoB7qR3woRgU/pFHQHRoxk4SyjgLzH8my/y2zUrGB7SBz/NLL6oJa+wWjdn1/w12ZhmrLqkUPbd2qu8+Luxt6r3AGL0zveQFc/jmYObExXOUP/+OhazZCsGvVPUfnjHdJF110LeR/XclRs2lsv8hsqYNG5egFvgU+uANtdz3kekpk51qXW3FA6KKjLhgEYpukKK+QqWnYIjkZ2eTRBDNUnAqBaE4cCPnp6AumuZ+E5OZdHNC5PlJM6yQRvhlDQSK35olB5fMMXYOPxOmtaqYyTFsaKcZkMkbxywEoq9R2yCbBQ1PCwojtoCYjFgYuJ5uIM01kYMRDyWenxGLT5Ws2318efuBn5b9+69kHg4lvH3x646It2DBMObnhgddB9sVb/zDjtjv2PFIuPbvjj4Y8WrA9lzE9AswpSo3ilwq4S3lY+ZL5ErA7mB1gh7xDYZcpV/ivCKBlzDKwTEbZ0LXMtQoSBcHklF0RF3S5AjgEP0OljN9n2kxk0WzGMafL6t8dAIEAErO7iTFHCiHWHrQfQdRnHRz+u2624RMzrOATK7CS5bFLPURYz5jioa/b3wpGaD2TVMfBjMvlEzCVfAbhfCazicqeeYRwZy3uufaWmtuKhY25wFCIn5jps2uxp59zawsvmJtORi+e0Q0+QrD89tSpu4hdfWf1D0C0eeYV19fdhjErHWul86Q/MEY7uOFX9aBNKcjJbHJ/Eim96koyCOSIZxneZnPwQYKuHCazkl2JSaVKDGnPDePxyMgAXsRICn2s56mtsxMZi5BcUBTtQXAzGZEjpm8Vwj+eSvSdNEvOim39hGaWpCwdp2sdGZmgmdc8hVVGaFA0SEtTQoHDqmpyMHFaIM/wDtsg/+WhfgdvCtIhOdOZodQRNOO2u5zwnEQHndFtzOipjMnB9sM/Or3/0r2j4vUTXUnrkbbzI4Helr51F89D+93lfz/62/KJpd++EUy9ZMK2v+gzryg/tu6q806+/eIzYaKfk8td7MU0DoiDEJVIrYmdzMIbvTtCb4TQVfL60E0ikpOL5aUhxEOAISyvOHwcGVkjAQKHSfyEw1wMd4dheBBM1iWJV+025puALjqqR0SlAIAdxX0+RZEJF0wc53A8Y3+FZK3dgRFlDhBOWPGHEhrTeq2o1UFWsjxpxSBoj/UZK4paj1rftiJslKlEY7eaO6y4gXtiQvl8NU3GDRhOiQDZkQTHmRLPTKVkZ6BIwzja92vAKMY9zPB2mxQeFMTD/RLvc3CD/F8O9it0eJRWZRSLBq5UFe7M6CgkGdAUJFMNk+rIYOgf3gSO6Ipp298f+rj/xFenwEwwdvvcWJ0Z7U+2lO8sr58MJ29aO6f80jPlV13lReAeO3D86fmvTq/LgiUPvp3V5xs2wot91i/R/UwMnE85Mvoa5SYFSgqYDZfApcElsavhNcGrYzejGxUxw1Up1Y5ighUiaViHMiw7xQF8Wb/fLmTFweHP9RpCq70imCH2iatEJIrYwCJFJbzACJBUShPNoKnmQbRQn2RnnHY7o8QckAUKdMRYxi5GaeFBn8Xmz5Juhp6+EBl4xWwGMlNk4C4GrGQ2MbDIdJOSHtVO/q6VfOQwSVSvIjnqgZ5M3qimMWqoK2UGRgSCAwVAgrz6TAYHdoLSKrRuF/BOpaTayA2eYRiZEuTAz6ewlhAp5RbsjMluC3moLQrR6gTvgX6LfE4Cm2Q77CMjrw4aUFdKE0jeg47v8Qk6ohQB8OX95dsnxGa33SZpcFXvzAWpCeXP9oMbRkfaJqwNapf2zZyZKqDbS4XyBzd3/eCOHy67F7hL7yPw0fVzD+w8fM3e3xs18Fiv3sU8rAONhq1SsK2aYlMLgVq8udm3M7grtDf7gYm73na9fIMddbIdaT2LzIpZ9anIZBNCXaiLbVemBNrT7VUC43RlPO5gFZLZpMciSjioPMTzkXgM7xxO8kzGmSFxZrfHXFfLu9w2GYmuqmDcLUVEcFIEDnEimRPviilxcCIOgvHziBl018mk/Lq21w1kd9ENdfdJ98duusxDgxu53dl6ozZ6YHXrCErHuyMvZ2qf6MgCVamWFvJLKI1sFBeemW6MAc0BSzKCwzxd6q/lk7zbxngy+PBgv9MzomfFfKU8sQ04sIvIeVwErPA2RFStHhlsaqL2z2N3e9Q8fGLZXL87tmBGttksZFrdrvzAjT0rLt25NO92tdaI5uZs9wJNCSzuWxGNPM4M//qWWbYUWHLiyXvvPM9R7gXfc15wxz3P//xykLLNuuVI+fXvB9E3CO+mYszyBbaJ9ZWYq2Z79AHmIIO2Mdtt2+1ohWVFAmYb+hpudyK+Vmm4J4g2NwDGGUTQSwxXg2wveL0iDGt1ZkWDZi2b4qWsyKf2a89oH2tI081yQdNqRBIv/RlDcHKTis9JEhd0uhlmr/8xP6ToRoy4p7qh283FRjxWjJz2RGp6ayBTc7IGPlZzogb21Wyu2V2DaOWKapULCp1IjDXfMKbkgxRuBge7OcBhh09tZYbwldrKgaEeH1GRFqJsGcpnaiyHjH9GbO2pYHlSyxY44vUyUMNSSOoaUyIfhsog/+HB/jo4wkpazHgmq5Wi0KnSopyUNo7kZAzQSUoYiU8jWBQ+MPvghl9v+OXDt39/+ZTsnKRWnDt3Que2qSs6di56+JfXvbht8AfPv//Ggbev1j79818eHjN+0ZZvnXz51rv/fO8fjvxsBatd89Zjf3qf1GV9TsY92L+fqeNa8JPDTERXIdir/VmDjBahk+hg1blz6M7Uc9H79hk1bMxtw4eZ4OMQe7PDupir9UZ0o4ztTEHX2bidzu1MVerM7sN2IKTLsDsGNsVAjFE6MxBEzv69gab/oX6sch+tONMSEtIB0L5Wn0Zlk17/iHE9mDZyfWOWq8HXN55ToQaYeHkyl+LOYzqYN/RA+6SODsAwJkGIF8c7BbE4vlhsKxTqxrWOI3Nkzq+tc9aOa6utq2sdNaq1tU0Qx7UJbePiouAUhXFiW5tvyvhYzOlLJNRaMe5rLTQHmhJirTMZCyRgGza0qjNgb+/oGD/ehHG6yWQXMJIk+VKVbhXSLETN0yY7LcqrpWN50mjn5VxWwb80caT8bDubUQDeYjegkhEHUlCAXUEGnzkGcl5SXrBdoLXr5Ii0psg3NnDNFAsVATBavPw/W/UwpFWFcQqbFsCLwMWTKlu3h4cL/LHmQGRc47rSAasUzTTUl37aMEvzWs3h2oYGOKE+WxuxWMCL6UB1PgL+WZtMrtHLl8Pb/pHJJQP+C/3xYG3jVXBKeeqSqM/uNbr99C+J+Ui3H48SjV5WXgweGVsV9iQ0DUrmyXp5UWmV/K9MayxS9PkZWvdOxkWf43YyIczCZuYKPbi89tpaOKcWbA2BuRxwJT1KOBpuCKOwLNeQIhmmxZMjGh4WbkqCZEpzOeo1DxNQAlFSyjwqrlnAKI009CCqTNIrQ2/lhnKkc+Vx5S0cHx1fbQwHn9vUo0lpthslYEbTYKMhOTI6fNDQ0fG1tqjoubXrf3n0+msv33J6zY6e2ddv3DZLHDVvyZrnPn21s3nyd69Zdu2syXP9TZ13Lp3cNm76t0+Cg7/avOWJx74E6SFQmD994djmtre/WDR+yt/hipaw5/nmcPr0bx5Zc8+KS6/63ro76fxnrGMfoM9pH8dWZrVuu6gazAmCZQGwzgQaI/j7H6ljAKprG413DyWTDqeXnGNwgNPaWEcjyYhD1Zxu7N0iEX9Bq2L8Gn+GKC8RQRrKKbSVZc/QSzkyleJPuT8dV0jvW0qZRCEBKx1PUpVmvulK7pD0oTu35WcIYBnU0hi04+BHyefy6HPtMntbz5trZy9wcCw0WTq8DsekcU8D8P2NrbWBd++/b0Hv9j+snDUnpJZ/y1vf+54MSxwL7rupfPq6n44at8I/Oja+T4j5y+/fuuTOFQ8+8ObOnkv+9dSXozwX5b/7D3Cg/FU8XL4P6zqpvz2Edb2eeVLfGPWK1sK0aE90RRSNToKOutl1i+uQWA3eqAZaCuxLfZaCo7TnNXhXFDxvfc8K37N+boVxMV7pOss0kBUVOtLInA4R3OCJMSElBC0oFGrIhuU0SiihiMsb0D0CMpv1ZHVBNkfMcJw5E8fWAFP2xPH5PWT9xmOkWWruFFmoAVRaVJ8qvWdvmd+jvN4zlDV6J5PeiQTZnV3ijOQiEHT9R+sohfQQi3rcjsoKrNyh1mztOCW//dYdwdQFtaWjpJvUwcE/gwU/uy+a3HLn4zPGtLMPjOos1MgpcVT50/LpP5TfMjpMRVeD8cDz8Wfarx4qf3jq2MlUlthx/MNbuCuUNDwALqYVvfOHnfhkk14NcrSnWKGgg2LjjMZVjZsbdzdyMxr78O7uxr2Nf240MY2N+bxOjTu2vkVjTrfBF1IXDQ9U6qKXgCsZ7wEIxg/CR5+AgGkbHVJ06kuKtD4YkbgMfYzl3cUEGY15QD/P640mC0vF9SIOx953gsXOq5zbnSjlGuWCXV4gpyPpbBoJyK+Yawsmm8L4w5pd5kMBjeXN9gAnhxgTmNxNsgRxN7EXjm6GVjxCgSx0Rtq/peMUKfSZ95ohqXbFyG8Is2g+BgxYR1bP78nnj+dypBNpjv4WR5qLrybMI72TTTQmMjSBjFhhPSBGI62O4lQjFe9GH69Z8UT/z1euvXr10/0/WTbwVH7MwFvlI2vaxoxqA7956YbrghiY3etYu+G1E1s2eMGpctC99rryHx+49pbs6d/WxlGT2jtn5yMbdhs2geA0kkvJMb/QcybkRin0IDqCOFECosnv9kNzJBDJRJCMv3QcKrOzi7NXZZGYA2o6a0J19PvK1cCPqqstQWJNdR9dEe4wKXIoUKxllS29Figgi82uO0ykktGOATy5PZHJCB/bgd1vwwbosic8psaExgrYqBwtHS2SLrhknAVLvdEzPEcEf9qQ8jxpeOn30rlApL8lAVbzje565D84d9XnQrNpZLVh7MBIL+oYtSiYuucgKPaLaXMfOjah6+j35nfPDzrr08nWy9Iz0NuXXXakozRjyqE5jeHkmLlzx7XdPAgeenzDHQ8//O3NP/j1Vt4SnPnyaPdtW//4yaqrXy2vHZtceM3y73xn9q0/JxhYKrezAxgDt4Beo9t40O4uLAFAkIHEpzwpaEk1jGqAZJFCv8lPmh36Q4Ua0mrSohiv+DhDyxPxTmMV3lgdQGGdjkZ/TcakuRO6YC4konUaL4sggESoW0haO11TsOhQbiFQdhy+oqXZ5jY/lj+ah0weVKO8Q8+Q1ombMkDM+DJQygw7sOEDfocj630m+EoQykF8WbBGN9peGu0v9Tr8SbudwKnUALkmUgOFmhovk1WyUMyOZbzAjLw2nSzfnWxhxsYT2ePK62+eImwj/a6P0R6vWMrzPUZvXtIandY4Ynbl8e/Zk0zxxJtG+9LjZ1aNLx598xhpI0/7XGbOrm0Heg2eY3GIUV4TF5vPOWjrbM7Ilo001SLVwcSvaHbK85FO0uxA+dJx+YkN8ez66Ar+rqy7/ELuod7TKJKdR4qH8QlQqN/fW4KR+p6NIqgveV3BQjy/HHT/aOYJ6x/L5SW3HKkOLZi/82nQdWjWq55XQXTJLc9Wh/ou2fo00a/O8jwyZ5QJY49ylz6zF66EcJNrlwte5gNrQltIES+QY5FYb2xljO3TAFOtVM+o7qtmRbkOyJxkDXD2iCVTxTrERFUAmWNc3BKz2z2RVmxvdMxpWlBE1qhgGtKtlV7Vgof0r1Oer/RBJmpyivQ5GsI2J3sqR1d46zU6URqNyBSsIq5zvcQ4gE2QqjSPimFHgRQDqKiK4aq5q5/93htnOzX+7t5n/vQMkID/6cPvzlr52ZErbrq1/9DfV10Cf1z+1UuPhO4Z6dp4T+j7L4CxYOJLj7/6q/IvgLrvje0Pl58uHzxw4y/3MJU8Ghm3YxJMI3OLPmVS9sLsZVk0JTUntTSFuPja+NY4ej8G1odvCsNrfDt80Ord4L3Fi0ysm02xSLAqAdnWoJk85iotylu7+KTc5XYHkrTsjCRWerGFztfSlLcemBGA3YHeAAyQaE55a7VBpfcMKhkN+88SiNhlg0RGe0jSb9Yg0v/S5R49OWbc5W1ToJCKjC3nJ1kyduWBxX2t+ktXnti4/KmlnSu2jY2Nm3H7SfDHTVdfX0zLx6dbmxyypiEoJiILXvDt2vaDDeuvv+q+7af/dUvfrd3XPbLzMM2JXFHp1RFnLtGbmyOgJQjWClsFmBQAL3gEWM2t527iEI5QHJa4y+9P8q1hHEigqhiySAm/yx5w0paDfxoiXcezOHwYoh0GX6JNHpnK1+Ur3wTrSvPX5KIpTsSCiUXZf6aP/+XDdUs+/3l7gzvSQ0UhFnr/xz8Bl4A4GM1eGPzjnds+eL/8V/P0WbEGTauKTd3zI2ACDhprASZUbkc/Rqcxp689XF2FTQt1C3GLXLi57p46KNSBfeph9TkVRdkGFvaxYC8L2MZ6XhkENj1ZZfaHl7rlGd4+7yov8nrtNY1MvEm2A8GeHxaB2FsDarI9xweUt7AevE47fPbQ1p9DxeeP45jdyMNXlmSJnWHaKMM0nB3NaR4Zzomq2JKMBblm9ONUYtzV5a9uWHzx9M7V+O+/NnXmrVt1z9SEa0KVdoXHd0Gy/MDmO46fuD2NTq/OTFs/8K3tY0eh4dv6lpJBnebGSddCHmx/78c/nUTpEMP8jGC8Wc18S/fBKnuowCd0Wdol7ZGQFGNk7CxkH0N6ydg3mxLpQDRSBZVIxOMP+ATbIEjp9VJAEaICpPlFhvdimBmpzoBHIwxt5bCL2cMMM1wD/lMZf1Uskv30KMYjPQND7yqlU0eNKZokxY7BZfHU0JD/I2qT3+vx0wI1Y8WYGOlASmPA/z02ZCOJustyy8uvgeMa7IxP/m8S/DU2lp6q9HKtyTWgf7Dx71c5Sx+WP96atpcvWhw7G+EZ+/ghPdgGbKJ45BFd+r0E3oAfQGiRSWJOlm0RW9HWbWNlZLM5ATlnCWSYEO9M6r4uFx3+UhyuAuNSXFB0MRZgR8Qh6imyhA+vOfBHRGSoIlnHJ2SHy2bSfAGjW4874jcxxVPHeoaGilnsf0gzbWPBBupovNn5tPf0tPf8paPKW+9WkAexpCSwMYhDQQVt3ZahRXiELmhTQpswbse7m3oSAYumgcmXbrp/ox3Nhcu2Z2tKH9bELytPWTyttIS95FcakQcnxmPbsX4nmEFdYd1ON4YHLAiZSBEdT1vqhILOUCgo+AN+mlTw+0TB5/eTt/xGnZHZ55dEIRDkQxKSXSimIzFEHbjTU3AHwUVBkDY3m+FVZjBofsEML5bAOXfYGxJ6AiY0e1Y51qN6WoywwvDHxeO0ikiZlqET4L1GSmE7h3cEo5iIrp+qGRrU7ABpo3gIB0GGZiHgQVTVmtnt1vrmD/hiabr3cu62pnrJOIQHjMOpl5rer8mDp8odCAlVkbsgthv0VLkdHIanvzJOUXphoH8j1h+R6T+AICRkEPFZABheEOgRZ3JynInhELUcsgBkoVc4KSCBN0EApdmmxSYomHgIkInrJZXqXFZ5mX51jEKLR4mCtJBvTb+0l74YK4THmkAexdCN5XeW/LVUA8JL/gpfh78t1cGuRvjr0qAxDiGVu7g7uHU4/nhGr3VqSQ06k8kkXC+DmyzfsUBSTQlNvJuHXraKhVcxYG0CWL2iPUievVsOdAd2BfYE9gc4IRCAUUeyMlUhyoiKCO0Y8qX1qFX3hgpesrHqZhXv4Y3VGwoGHf5IKKT7QoVQHDkEk40pFsl6PF7l+TxN6NNlggmyVt4iMItYA2MJpPl0jhZNaYAzPtCtEi+YHkUCyDTNAyWIVWyGGt4hb3DYNnCNl3W2zs6tuLGhKZ8t7Jt1wbLT5aMX33tD9F2Q/Oy3b6G218pfvvPhse3Od8AU0Pnl7Cnq2AmTS0vB8PUb11eDgrf0OTSbLx51xCzuusOYy9bFVrMXYHtwQq/rYIDE/o2Fbi7FjeLQUhXwfiC4Au8G4JQAQLJ9vx1KGE1bTLLNRpmvKk5VVSRRJEcdFrPTYjGLZglHIoqMVIvXKhdUsmEsDThAMVlU1qW7WZtNVpBKr7NERbWgks0bFmBRMaNC7ixpGt3SQvyH6snj/1g7cHSCCUbhKWOcxLIy7Wsyw1DIhTFrBXhhgiqYalhDuLSWMjapLBiVJ5Drnlt/7JizvPxCDWhrai8fqwbNG7bd/bobWxDlzT/ABZ/hMPz3H0fv/OFTpw53Hrl8xRMdhw5dfJmqweuvr/TsLrebNmC96ANufUytV5AKLA+EqQFAqpfgyczHGSjXRkiZqBeo3NjJF1zCctnIqKnT5zNcPtB7XgF6qiw0nNCvw97ZovirRDk1ITKHnaUnasQLPWCzZ7cHXmgBm2nXQA/rqGemK9Oj03EAPb1rZnySnpo0ldjZqV2TJrH188nu/K7wJXGmS8eufAHTpDRFm5DQ1NUaz3cp9TPqV9XvrWf76sHu+sfqj9b/uZ6N1IN6OnTyXukUzXS8Vzr6XmXViGlkJ09N9Hs0wiAMGSDhA44VPPniUP5YZcUpY2GKU54cXZbMwHTEmBOvrzpHlmQbqRY1lmXD0M5Y5is9shQN7VxcSYG6jGVXiiBt+D+j9wM5TT1A5VLThkU+68o1R68tvzBmVltrPlxYeuHlG8C46wfyyb783HnzbnCeP2ZW383tLVbP5eBNx1In6030LNkCIRTTwQ7w/jVu7rtjO/TqRu954C2uanR41lff+Ok11x+ad3FT+MJs6tC2+Tse7Uvoy+bMr25dOXcnmjA70pRMdskXnP7p5Y0dG8wZtGKqNeuSk8lOFZ97u1rLoQduCFiTRD5ULB8x7Gfng0Y9Fq8SrIVUFG/SUczs5XFwuxeQWQZQ4DxaRQweIWLg1xRRbuzomsdw9QG9pzNrml2Q5EJbg2QrJNpCs9mZY2tjmhmLxW0WgIXkNg+weDhHNdOgNEChoas5qdd3Fas3Ve+v/rialauBFVWPn0cWEZvXNTuYZLoaOMBwm7nHuKPcJxw3gwMc0wWYLqXrky4sWF1d3cnxemJ8B7nj447hDtjR1Td+8/jd45Eyfu/4E+PR+PF9vUYh+Hs9X5OQgVepIJ1478y6TMSXn/qa6ORLWHRoV/58fqQt/4gYGd6Ndo37f4mO2mQ6J/nwP0jNqP9BbCprGo0ITgwLTs+ip68tv3qu4DRe//RCR+/SpzMPfefeNjeRmWNEZgKp2YUVU0eE5hUsNLHa7qZRF9YSsXkOrcJiUxrz7NqzYgOueHShMuPZZ/e2bAA7RkSmvG6gTh/VYc6Aw2dlBp9s0EN1o8CHhtTQWjCMV1/gljF55ttk/agv9F4M2UlCw7zDfLcZCXdLoCGqR2FUFFPA41dRbSJSpQVSsM4UycMAEKIuEHXprhmuPhdLh06DxCIVtT0aq8VBzBSvq2JipClVU7C1lxbXkAQaRq2lUyeeJy6KcoriVbo5TtH98QEC6UkqoBoY7dH/rxWkcEhTobRaSIx0TTfa2bMvlAbvDMtPHnt0af/CZUdas22d9RdEtxS7bnz0+jXgi3sCNpOtqfoCDenRNaB/YPXan7+wYasrWJi1vHzn1rn9F4C7fqdpcGJi5elHL/YXnTIyaDUZ0wrQfPt1h6Wo6ixECQybYFUKovk7ZuhTqpVHlCeVFxVuVBQk+XhR3CRiNmoMphvTgIklESQbdSHB5bKCrqQpWZtmumpzYZJl2z1Cm0+PKaWjp6jTJnTBBCkex7EPXe5lgMgrpkjuf6PImTyIeo4ssqBcnON3bv3R3p6ZcxY/P7Z2dGe2Jzw9GdAnrN24GORak7Xu0KXJqsgiMPjMN7/xX69tv4cS486V9989t+8GeDDp8Fx/OrUwUm3QIVxu51jsi1owpvfOKQAUc8QSMYS+HcbvkaEYZGE1suaHRSWLb32iV+EdrS6Ti0fHZhgIBGiP+UfHRZWNEdizSkRmJNZVabpGJ+Niu6RpDVVVcbnZ3xSEXIAVfFLEoQRUeEZQsmTVp6NnnQIg6J0I1dFPj87vwQ6dTHoeWYMIY9ge7WyjfaqslT77hESUfqoSI8pv6H4Ma36UTjbjVSf4KHh3afDuoI2zNaUugp2T4mOd8v5jg9duLpuXl7/MTN9eFy6ARD+ovgh4H77n0auWT4JYeiYlrkAXzvHrDhvCR4JcE11Tvn3goR+Vh0oXf/vbTeGbvw2nA4x/LigvuYKBTAjjXjInLcnUMy/qOz1RUSn4vaKtsC6xLQEf9gx64BTzHPNSM7rGtMME70D70GGERpaD7AiBR5xPOl90ojcSHyTgXQ7gwAxxhbVonVaROZeLje5Kg2fSIB3k+SgGPzIrSZKFF0Xt/5D35oFtVFff8Nx7pdEujfZ9pJnRaLEkS5Zsy3bsWEkcJ3YWh+wmOAkJhCWGLJCVkIQtGy1JC2VpKUlLS6GlTQghmFJK6EMppFDSp2XrQkKb0tKSQpuylVj+7r0zsp1AW57ne9/vny+LPRrJi+4595zfWe75gcvkDfJO+SNZ45TtaV7y22NMPt3jX+SHfoMxR9RPWVECIletpsM423/7yz6smX2raNBJBnQSChu8bVetquZZKHcgq+ilpKTy8OKrakupnUqEe7iaZikWUH7R0nvPfxYD3pTt2roDHUcarrnnpnH1j3z1/tX+SI0td/77M2+8rCn/3Z3g6I+33rRhw6tLmaEbr7yqNT9lzZ616SmhmkU7AuviQm65atuG3tBwOPZqY/5RfuiS4roi7Mr35qErFUtBreyWZfklWaMXfEJSeFZ4VdB67Qk77DL2GqGZ/Rx7N4s08EZ4G0T3gcMA7rTdZYPN1p3Wu6zPWTVBa9oKd2bvyj6XRWwWWLMS0wr0ra0a3p2UUENSYzhsxXcddb4yE+Wi0IqiUUbvINg96iATFtEexz4H3OLY7djrQI5EQt+sskLpmfa61kU4+CfG4PWFfS8Qa0h66IbZtQhvczOJZggP5dPUUNgVogkcvFJ4v+osOgJaeaB/G6qUyWqLq2o5aC6MHSHjwwi25NFwX97+/FNb7z6v9cppU69tXHpD7/zN1kJs3u/2fueqG6Y2L++ZvrF53uzpa7bMWrTQ+wfQc2jpvOmLHr9sXrklJreXlt668Ka5Zcd4eyy/9MaBrtm3r+id0JpMjm+74Nobp02aMP0L28p1aVVG6GMsowbm+ceYOmwr+qz2+q5a4ErEElAruSVZeok0cvkiycizkVcj2i49MGtAs7nXDIPmtBmyaWBOC4ytIdIA9Q0w5JQFVJShyZzmcp48X+YhsUlYADzPsBy2tAdVO+PinNjOsA0MUxblehsD9EwpR/rnethFLGTJ8v9sIcUclO4UjOaTXfXC8HCFp0kyvKBQZQy3g6YBFP7nK+9EH99Veaq65rfhNV957pp/naz5VwfvAdHKU8PL3Vla+rkrbprb84nlntV2Qf+t0yYBh1IvJv7rY2y3M1jP3irn2IwnA636jC8DOa+HAb4M48mlYRYBX20W5dKeLMqKjAdH5B78/nMk4goCHw7FfcjjS3szsFaf0woWV0obcMFsjsyrEst4GbM5QFgfHmHQTQxYzRByDWRDOQS9WoanDZAiRnsgHTXa6xGs9Xh9mbReFxepsPg6nbiIA5wCE07ZlVIRqQ+RXARhlCXWp8q2eYQQwB9RDkNx6e3X0uAMf7LhPzhAo+FBCgCkDD8YOUNWjBKyJUUGo2qrNuA0AM3HH38RPPtf2VSRa8vkWjtbZgB45YRZiw/MaOmkhdW2GYXrHq/8d+VF1AIun9VoiNtq6ic3Yih2dOMd343nZlcrq+f/ZVAPU4Ov0LXHq6j5IumfYupAU3mhpSZck61BZsTInAwtDDYWbDJh41LWhK3OYudSjly+zuLIJXKOXMyWcNlsiVSdpS7PpVwcfjKRsiSt9ry+zoVCksmVlnS5Orls44w2UkHiyBpvNpjrfZakpcky33KpRWuygJztHRvcYgMljO5s4Ns2MNV2tw322kCUO8FBhtvDwWXcfRycwwGPAzzjeNMBFzpAk2OyA2507HJ82YE0DsDV5WwaJuKw5xPJlNWi95ixqcJYUimYapiixgP0nlgkd0qpZZPEC5FPH+XNIhP/+qqXVbqs/yjHYQotcLawgOD8pGQLCpEW+QxMQPNFRWSza68FTYOdH397lFjvmBZum9TTS8rhlanfehCxVcHNPzX4F/BT0DpathMDyzfdhaV75o+grfJfyn4i80NnUM7RDLO7vKAEQAOcCGFDFFySWpeCf9b8UwO9YTA5Nj8GZSnJhkBj6PYQDOFdoOd5ZGJcwIFcNp+pbC87fPV2E0onkcHucOiEVqY2lGglp51zhCOTJHAK1AXnXiBW5xmllPbLF1RCzIV9RRz/kBrHqlWKCwAkqa+WfJTUd1E96YDtDdZ/HA0O58mj2hmVgcpLlVe+f/DXL4PxY8u5muvyiSnvJpLXnHfrtFnRJ34DeDD/D5UVb/3AsOiq34I9UFc5U3n9F0dBFjT++Ek9W3pd5+6a/oNdlT+8AR7+cm/nX+99lnJkDZ1Ev0EvY834UnnOnXrwshl0WGZbLrKgXhe4ywW04YYw9ETjUXg4CrSCW5CFLwmajbFdMYgxiSGFFUlmgoD07EiwXJvOlx3e+jyb1lllyeQ35hkHMdd4K0cKRjKKJZGjdZ+XX+CeoUzVpOzI/RK7y2alzjxcAVqluEgwvCKjPF9c7af0Vlt9qrTV+Hn0m6k/zRamNG3Kxttm7FlWbm4o3zV2am/Xs6s2XLf2Jz/fvOq7X3gld4G8qg69/DuTvW/6kfUrb50zddn15amu1lDP7K/uv2D2V3Y9/sENV5hLFEdjzLcf2+M2Zk95nh76INTyGlskEoGRpNEvNTNJLhlNIn0y6agr5oNNqUgd5JxBky/i0JO2RR1Jb5IMp2I5QzMkIPkKdqHZJPrqHELS52sfS7TjiAqMuV/2/faZPvyRfGLaSeGQflA06MggecER0jwGVgElNdhQr9QIRlUIKN2gTm1oGENmMI/uJgsrPEf7S9ICz+wNG0aKius3zPYskErhxHm/GGaCmxX3//K8RBg90tWR6YosmXn5IDPMCMdcPnNJpCvT0ZWLFcRLFHa4uuhGsaDGrS6sWxDvvQjTV66PYofhMDMy7/Dyng4Xg5exA5k8iTCMaRJOmwm0m3pMcIVpiwlyZBJQlBHIyJmHHPbcC6e4Z9SG3iMncdzFtL93Cv/LkdV4oY8S3UlyyVN976xOKgn2olYpqIWBgGDlN9nKO/ZkoICh9DU9ckZmhrLArtwAMbTqzFUrJW5s7CvQUt7wT/Ab/KAt9pU+mkseOkn7CbJAKnv0CBh1AW8AmuOxxhhENh0IsFa1iYBXmwh4tYmAHNYoi/hCpk0EOsBp9DrZykdYv9FLXIDXVRb8umy1YyCbhkYTpZRlEiCFErpyhHYMRIAh4o9AY2RIBxj8A3U6yfwk9yIHbRx+GceX9WrHAPlclkjHADb3HA9sfISH2IiZGYmToJQj8USWyXm8pE8Axwuk2PA/bRA4Evi3XQFk5sf/pA/g6f9c/K8c/gxFf8hMr3RiO0bO2NTiiPfymiiWRHfm/MzlGfTtGtARnx2/KI4e9IFfek564FXuG9yQdQP9JG4eBx+wgm7r+VZ4pwHs1N+lh4x/sR+a/DavLYJtf0Rb1pbNrnotsMmyTZeWvSbW7/HH/UjvNwFGImjVmU8R22Yito2YthcWKpP5qz5A8QALh7FntcZNa32iRBvz7MNJAlL6RJQUkfxFHDV+tHsG/SYR6xk/7jvT1sw4tHjNG8/dsGn95h9U3rmK29A+s+Zz97cv/urxO6c1nfzi1JZKZ0oPPeLyd8D40988eucXnn9y5y1A+P1t091GjTaYRhmw/JGb9lfuf/BGiu8pZxkjMD95jAkOnSgXrVz9+0Gw1rvNC3UA3A8ApSPXs3ey97PofRYYjH5jyviW8SOjVt/pB4v8wE+GDbrLhGEWWvR2huO4KIciCLs4opZGvateYKQyIwhE39NWRz0jrBQg3uRCVDghvCtohXCdxsSdsL9rh2QyXs6O9Ha3bNYRSje8YITVjRTF7EWilT8rUMpdvLCFHKHgPUV4uxeq/Xh9So15VOaFGsOzuMxRd3TR8tsfvWLxmk1PX9w7JRnorJ160TXd4zpn77mwp1QPLvjqJVffvevJZ2++tTnfERjnr7nyws1fXv/5Cbn1Ct/J0kon2K3d7WAtwtlzytEz1ZwdcqPbmACzoByzoDDKImTRhXVZHbJq7LLLBcyygfXLZWB0Ol0m2r11GMNBJmR30QBHu0gLtTkCKWjnFYlvGNKRqIxMVJMmKVB9k1XTThk1iTNA7krltfWbNq1/DcDT23qmgHzlWMe03aevWv/GG2tXTeibt10cV7d97hL8uyYxUPqA/q4XlEUIHVCECPodftGPf1erbLFo3bKHZWWtEV/azETjGYWP3Yx/4zIzA++/kFubO8I906fGYAVsWapThaq/LI11q60uQoNAjANxSlg+8AP8e1Yqp3dP66gcA/kpPdtOA4h/e/D8G+uvmrBk7va6ceL2eX0TVq0la43diyZG5zE/SWXxUWUK+r72Fvz4CF37biwLG45Xw8zycuts30U+2OkFWi/odAKtE8xxXOyAPv16/Q498mnWa3ZokMUcrmPGMTCGvzjibrWxERxcmi32AZQ7ZERM2I8vHoKGUeSCNPLpKxwpjLAL4nCyCuaizqq+Vdt3Slrbjyu3VX71+MMPPw7ioP/HkUvnrbjrox0bN+746K4V8y4FYyv3/vwoSIP0c8cq97r2tE577L7Ke5X3HvjBtNY95D2pHAg4KvxeWVwvgl4R6AXgjspRWIpOisJAFGBzpDeBWK5GxJsMB4JhUqoWogY91Is1dbzLHxUEkZSrTYLRbiKv4P1GQyyoF6MGoxHywUHsd6OQNMPDXBCQLvhjgwSVtBfpoIUj3LHCKZDL5QZ/xjFPbdeSChvehK8f4V4f/BlpdtdWbygUBAqASwEVlADpXJiipN4NYFSufgxg/z54JD9P8gy+Jwz+IyjPyFeSpDfWJe4Ca0EF/AZszc2LeULyjBxphUW/GlwDl56ZXm2NRWt7Ux3y4GNwEnl0Zhe+r2CR2kq35vdYx5PgufJmD4cNHEOmmqkJHZ3b6064S+5J7jkutsYNgm7ZBT2M2xVnEOsyuVMM8jPNTLMb5Wu6mC53T40m6XG7Y0wSx4xJ4HS5OLuHnePymTn8Mc8AfBt4GCdKhC1Wq8vlNobCVghAMplgGXIkhpxkxRdnyjazmZ1js5Jj2NZuRzCkjIox14e6vUm3C2icHqcjVtZh3/5XOvYFX7xdDpGz7XqenJLZqwc9+ltIbd2m36t/UY/0A+BQ2cVEPV7OHmDneGPkPJs3Xxax4f0z/Rb44g907BK++E3ZQkY+MQLYKhwRoDAAZpbNUdJKnScTRWtSypyTwCAdwdQa8JG5rmTQDw4S1Rv0GBz3j3Qr+Y/jxepYJuWzcn48+IiNtwb5EBk+3Vudi5KmQSThB7r2aZ/6urJPl+Jhtyim+ES3pE/xlm5JSPHhbpFgjd7h5M0qBqMPGWtOlSWODoavatnIQ8Kz3iDAPTg4aujIBpxj2ioTZzZVfiBVDrta2ipf7y14aieB8e/Ab8aDySsrgUWlkCy3rYGJQQgrZyT6cNwqdPfyRCRO40mjOhchwKSZzWXxch4sDwMyzQKu8d/kh7P94A4fWOO7yQfn+ghfaZB0vmU5GnsjJms26gyxmMXG1ZFpeJwj6kCOiFdntMkOnU5jsSZZcuSh+AI5/EfacV/ApqbvhR8XBp8/9uMCidVHsZmquUNs8AXabCs1FKsgAlX74qp1LjSw7oYfXn0ZNjNHNLbvuLSrr1697tnvL79o35wlX79Q8rW0XrF9Shl88PS+/d2vzuy98NKZM+GNP71+x3UbKq98+4Y7uwsrKw9dOWHShmV0L03C9tWs2teWdaHtITgnBOYGgS4ILneAyXYw2QIuN4O5COgQWAe3QzgHAltrtV874vXpWJ/XSaxrALE6E7GuGmxdTz1fIP9Brnjk3PeqNkwKUVTlbbVzVd5WB+mX1JoPPlZ5pXKbYlgHd6xdt32QGNbIj0E/SD12EH6r8otnfw76iGk9cj/QA919T2DT6gJ9x35C5Fr1GSYmhd9V45zYxTE4SQKTImAOfzGG0S7CWo703HpuB4cYlhX8vlTUTPh8kDkttDoMCMlh/EYO+/weZE7J5D1Z1ff0fIE0omNREqeBfQZ5UH1vYGSei+ffexC0Z1xtdvy42lwZbCG+5JXHDh58DKSqvmRw+7q1O+hbhvtrx43P1o4rVxZjp/IsyILsT1Sn8sR9lY8qH95/hDgVOEqOKWZdeez2EFgbIkI833G5Aw6LcYGZiHE7JNS7MZ5nRwSZVgQZSAiCiUjzYAARWT7M6og08bumh1Re4EaJdPRb/wxSHb06/0nCg3eOz2bHl3O58r+TdeXX2fHjs7lyuconptM64oRPzK6zeEEU3MF4SN/4k4cbG8mJiNIAfJBpb1DOsNHXk/MQ6uuXgMjwbPkJbUyRHLBrGT1bHu+V0tC72gHit0GBnsmcuhPudN0P79Pd79JepFmruRHHlAEQnKtBQonwt3pKwaAgmU3WWQbgRqHjTuAse8P1TieZsL0PIaSrSafjcSbBJWCCtChOSuYYRhQlKZWEwZDenMMR9H4TMpm41pXk1ISQShfyNaCmxpOMFxIJBgC32yOKeQG8K4DFwgEBRoU8tvwKD9Ggev78VLM6w4p8VOcbtle5QSvK6fR2Mi6ExItkclJBIZEgx9IPpxOJUBI5B/Tug/2hgELBGiZcoIZ+hJIhPZOUKGFLEhqsA7o3DvYbVMKWAp2MlFYYiOi0PSx4ZY5AokQrU3SCp0sll4JqtK/Su8CvPvGLgV/85LbzpnlbcrfftO6xG4SxvYNPL5gWuuhblzhEo0ZnkEwTl67RfDD4x59Xfv/K0cpQLuIDM//2xPcre65tjGpkGcbaV6OPl18GUpVXZiwVyFx9wj2oyzji8LR6zvED8EPl3KLfawdlAPwjEqdncN/QWvCeEpi/U3nP8bM7QvBauCF0M0RzfBexS307XJqNtg2uHTa0SFpmXuZG80zzzPPcKJrxC/V6nYTBmJMP4E2BZaVJBpCd46xJpyEqgMIekkziFtgpBbS9no4t82EYY7d79AaDztga9YB3yKnoiAd6yHFnyhZFDsbSkSKnigWGHF0nrTr4Q6u92aFSPYA0nXZDh2TgyA0AZ1RnpFQgOp0zigIaOoE9gMjch3cO9jsNIxP50qPmFEnxmCQyCHskl8NTjDq9kJC+1TtiamtvUfOSHKz8dfe9lffdkBt893M/2w0CTwSfqtxf+WXlhueB9Pj1+2pssaSI7t3/i8pblZ91H6m8uQurbOUn4C6QfAWMe6jFNonEAFuH3tBoKS+U8VO53f43PBBncWhj+2gZepd9BO/dLFNSZ0xMaym0NLY3dxW6Gi8oXNC4orCicY2wRlwXu0HYHvu+xRYuBX2CmC0Fk4KYq0sm+EhXbamU9BS8prKZqzeZbDZtIqlngOTzwvoBlC0Xt0r7JShJWa/H00PaiR3OtdAGVoD9ZIBamOdra3Mi82IWlLOLs/uyKJttblJ6bYb3ah/lBOtTBN2n0IWpsxfTnDLWtZUbVDdo8CG+ltJ48HzSCyjLpddPt6jXQ2d7eKHWNqD3H+rX6pO5Ad1fD/Yn6+iIj2SKviypkCnTWR8KobJCW8XB0XPJHH6gsldBt50O/iAj+emedVaH8kvojsqNz3yve0a9HElmY/Ou7NysCc2aE5r+s+c2bHv1vysze7vDR+qFTQ985+taWLlx8KnKA115uZEXgABuBSFKbgXECasq2zu/t/zKw7NlKI29Gnxh8EnDfddfvw/LL4FjpsNYfi1MB1hJ5XdHe+cd3B32b3L32f9of3vCe3b9rye8bT/Vjo62H53w63Z0tetG+40uNGXCivYVE662a9ondLUval80QZNqb2mHCSHRlJ1QEkpNbRMmCROb9NlIsChIitBhKagTJEspqBfETCQYF8SGYH0sKONNbIvw/JjWsUmv1TbGJnV0FL0+vRzX62B9EdY3NMRi8uNoCUaI47A+xLY69zuh04mDBZ4nwcOYMa3iijAIh1sYJhKJitnMPRMpkaki/FUjfM1UFyiFXJWWKadQM1E+oMHC8OswCK+SlK1S3XDw4BgmQtibrf1WhokXdbCRNaBigapEEfpaqSb4xmJNONzv0/uleIJqQ1zhASrQkU1eZWaZSgUkVDl+KEQ/Wwfswgi/7Se4isGwgoAHwF8DM8+D4+b3Ont+9uzGL738DNaKKaGKY+yyyODjqaZur79rXAROjHSNDcPvlfhrH3jw6/AVsGHleAnKck3PQqob6wa6VN2oLN0wczTLcaJ0RaWuqjAU2zYyjJZwCRbBGGX+BTP06uFQuP4BgKH80KvlUjBcrysFzacleyloOS3GSsGIIIaDPOODEQ9x1R4PAzm4DyKoy9bWplIjLOvnpwvFoizHpUwa8hG92RLex4OV/FZ+D49oAZwX/KzOoROfJPNmYpnaQj67NQuzWX86VaipwSbN5/OLMhebEYNbY+DdGDgQA9FYPgZjCu/Gp7tvhcqzr6+Vkt5+qhcnTpwqBfEEZErX4dqamkgaegb0rrKxH8J02GpCkSgdnGCJ6IvpOOVuTcPRJMa5EcdNh12EQdVTgzZQT6dg/AvfnQbw7sM/uuQLUqhj0uDpFU2eORM+9+VP996XwV+9dMmdr7+8eqyolWXDlBtevvn6rh9WvvipDlzxBYQzsIfgPPhPdfbATILziA9vLnFx7MObRzyB+vqv09d/qOLCS/Dr6x4CGeJ3rVx9ho6Xxn53RQbYMmBg6M3DmUzUUAbZKlwkA30aiA8JYDywU2dh3EwruFRhg2uwNTgn2iY6l9mWOdfZ1jm327Y7vxI2JfVHW2BXaaDp2SZ0V8v9TfCupruaIUIJg6GZMZvtD7L4m5dtzU1NWN1c4aZSOJhKJEgaR4qEXZFIuLkplYiEgzpPRi7ExEJMknwFbyvJrhUKjeQ3Fjyh+sbGjCGXa06tLTetDUdtIhBvicjLErtbQes9zb4nwFeZIPg6RvfNsKlsCEcjc8q5BMA/xVk2RvPhchiGw2PbhpMC6tTfgG/wJHeyjyMflMdk8A2dp1fMtRM+OKxolHfKS+lHz6LVxhqEIUkrUEgY1Agfw8hDjJll7QO6X5fN/awnnJF8oow8rdQieWCmcUDvOdifUYGIt1B0NHPPpLmnFRqy0XMyldBiLAACnbCpTFelrWXAepbTKgFssDRRPvvEfz33aEYQcunWTde0pbNnIjD+heUg+WrHZvDA7dMrgxdv/tKMiYsK6ZqWhKtnScVV3zdVZ2mInb9la6/UWJy3adP8QqVdZicXHx/8EOq/0TTdIcuO7w/eeerZvjFFuU50fwNduGCqhfJZVjZSPsscsCv2phYLaqvVXo/K+MOu7KsQ6rPRusm16FjdiTq4sm5fHUzUUZZL8jgeCYqCaCAk86IzErRhUxQJCoKUiATTgmSMBK2E5RKkRUGw2azQ75O0Gk0mk9YzBQBc8YQYLofA8RDYFzoWOhFC0VA+tDKEQpTwss7pEo1k/BI03JPn/rFaoQZWzAzxKmqmZ1DN9JBZa+eQX65Kp4MPaX3Erxj6gZaLSshqoVO2BSvU1lAPomUpj2xGq3CJKUyYWJIUTtZSf3E2FabCM/oJdkzsOeD7MvrWwcoBQosJJ13baUzMBheu907ED8ityt3X356rbHz5gKyZfBNaNEyT+bWVabu4a/SNm/DV5Qep7TiLmxzvZ5J7no3lFWBkAJWI7i0jeE18m39HRM/yz4qv8WiN5QbjTRa0gl8hXmVCk/mF/CIRJflcoolHbkpC6iL0o6JOL+u7JCnAhZO2UQTmTkbLSkwA2jg9Aws9ZFxplEBFGyGkNQOzmQ2Kbtc9cYoCMAKgAdqp5mqERuy6Qu9X5FrVqEzdUo9AyAV08oDu7wf7dRKFgTodF2ApDAz46dYKQC44oPvbwX4uTGEfZx9FV08HM9IYrTrmzamcvFLcO5sCDao7TzSAkfG06G/WWPSmb59s/OjPt56o/HXwR5s7w+N7wfr5ddf85Ni+bK12auXVPdMH/9h+8No7TiokppdM5rXyx1rrN75w+xf0/5YT/ub/a5zwhyD0WEz07f8nZvj0/xlmeOwvsD2Ygd9XmIkzH9B3Zvq85Xo7pKeMaLw3weSopyl/g1sUJM5kJAUkF1YWWADhAhPnuwADTQWj0WBgcZDDhhnG7yy4XG53u9Aj7BeQIPgHwBfLjq2Et1jLivHjMojKeRnKj8EokyTcnwoJKw38cwoTcWv1v8pHTEBke5V5mBtsVQaHp9PYbptcHMPTVWIgXSUmrEwNhJxAb3MGRaXc52qWar6d1W1NzvVBwjCsk+yNAUAnLmmNQEf3/980izZ3FnaK/E0PrK3c9/uX3OLXjk4vTFwOOv2fWwve39agnUpWdtD+q0sqc257pO39PeA7VrAMGr510UKfRh7cXxF35q7T6BWMcBa3PNYvB8PofNoLmGXgBJXCxztsOy+AG2zXXLDNgHrly+S1BmToCcRTcTRr9pw5M+fNnz/XYjZbNZEgI4hLIsFlgoTDgzpBaowEC4Jot9liJoPLZDLMnDMndn6f6/zz+6w2zmiws3PPnzN7wQWzZvYZ6pjzztM6HKXMhZkurbaOmVeYbymY582f0hgI10+ZMm5SmbPXT8rgB2RYUZ2P3Pb5xBC5HSK3QyFRLNRBs8nEzO/tXbaMIUcYjSb8g+wOY0SzsO+CBef3zp0ze9bM88wdDKGI7ejIZjJaraaxVLrwwiVi1qYB7ZoVmt2a45ohjXaL5kUN1ORGoGU1zsDxpto0pnqBKhUDSTVQJDj6UuWcpIGIf3iqHcUCCgYYvvDR03FVXdtObj2tWrDgo+c5FmkvRDUsDUKaa2rMdUWqQXV5JblUB8HF85CZeJhH+5les36KSGZ1P9w/TkTV+V6UqZz+XuSKsv4pGzWBHYgOkWtnY6lWna03jCEwauUhPcYw7HWUiWBk3tuoCbVkMhN5LQG5cRNQMS+2BnDVls6QnA+v/UnlW7fd8u2xOB4splKkHBqrKc2eOWNLY10mN6/DG+/cAidvnhjyTZmby+Ybt5w3fX5jWmxoFIWaZH1ba924NSuuXV35lvmWu62NDSbbxM1Ex8FeEKr9VeXzsncAZK9MZNZ9Z/s4PlyQs5NmXnnP7iVFFqypGprKzWxx0Re/esXsjrxcCPMTb3hwbSa2+IWnL3HLAaADQrAFVC6ktggw6aE30He1y8nAWboHbmcN6UhaQst86807zM/xmsvNy7jlDjSXm+ebF0RlrtPXa0ZjzXXcNAtK2IAmqbdahTnlKCD91fkoikb1eC28gXQPA/aTVBYEaExyShJqkq5kLImSST2yBSIBGAiQymWUsXsLWz2ADMv02LF5SxcAx4Aos4XZzexnNBicz5ABbRTOCbH6drlHhmRMONwi78bWTDaZwq0RO1hh320/bkc2e87eY0ecPW+Hdjpz8xSdTYxRympKCkYRajG3ehXV1VYCX/vI/z5KMbKKMigogwVP+enYeUJGpCSxcfxsFaJYL3H8LAiEU4RhXADpkwO69w/165ErMKD74GC/a1TajBJZKOyFTntx1FxjnTK3N4pK1UmpUgMJkml3sm6ZxLV4Jq/adP/zX96y69uVM09V3rhHLP5o5U23fv+VO7+8eNtVu7/mR8fBrvHB1NHt1+xP+Z/bcf8v8QrOWv/Q1hsPjy/vWXTl5x7YxZzFpV4DclS+LZe6LnXvcO1waya7Jrvnu+a7NeTDetd6t8bv8rtTrpRbcyxzIgNXEkp7Y4bCUPLY9Tjqw9+yBvWVA+7RaFThX09FgrIgMuTovCmoqeJSN3lcT+BQNBKMCQSZyjKhDg1gqIrNluhkXK6yExwn/BbHnCecKOrMO1c6kZPC00yqpsYtRmdgK3ZPWuVjrwJU6pKGK5Hko8pplM6dyp2q4lOGTGQPlg2ummAcsYjyHeNoVxODfs6CgiEKTG1BBZh6q1EuncZZT0+SnUXNbgc8/CRzu4bvWQ+nUKL2R67rHLwZuKctGXyUItSuLZ2a/o3jzuJq77oJGc/8at4YEZ5L5n5a6WdVYlMST5bBlUqGmcSRl9Zcmr7Odp1zR82OtH5yzeT0/Jr5aQ35sL5mfVrjr/GnUzWptObY+BPj4crx+8bD6HgqPfKYEEbhQDO1m8wOTyux5hM4kMXixPiqTISaHi3IBuLXxPZIcIwgehShDgsxrQg1T/1eiyBhaY4Z0wLr8nksW30kKqY8NTXlFDieAvtSx1InUiiayqdWplCKCnV8e7mcFhtnNICGe8YNC3XwMwh1OIgkJHJ9Z4v4rFCypVxT1+oPoZZmRdyBFpiLS6iuQMUt150r7v8QVTo/uyr4ItmBZ0dFljW1Nf9OOUhI2bt1JKQcXPQ/UhZlf/dgDNOocth8Hsf+9npjrty0Pr+2uK2onZQHjQ0b0jvTjzMajmBmURcJmiiKdgtSgCBqsb6hWGxo+DHSuBDSNKKGek2xoHPDQiH4TZZ1mxmQJSgkm42lCABJpWIxD4B6jxuazHqtBsFGMtfDsJUwgwSCQZbVifYIB7h7SsPSJda1ypyi0NSosIFCBr8CFoYRgs7a6lP7Dgk5dTp4sBDEiODdR/qDQbNbYSd3u2iiyg0Zo1mJN6FZH8vSjEEMqaxOBRUHUBMsY3fNxBPnAHdFbmMR9fKjnDzUebCL1/ZUvt5c+eKM8yZuGRy4dhIW2uQtE6+YfVlbPtu8ed6X2xKh8S3eaG1h8ZcWfO07+2R5AfioBCrLFSFN2j4irso2EFy8Ysu6vgn98aZoeMLOIWYi99YH91EcOvSudhK20XHmhwqHXyhCss1KlK9E/2dVF5TSAg6BvB5Pu76H0DSRisJugDEC/hMKi8zxOIjG83FS/jgL7q8ariOooWS1hKBEQw+JUbq4okTRPP4J/6Z8gON6taZXneX/b0oEo7cOerpywTk1gQl0gzy2ufNfVgFG7YnJ2xQ8r/ZLOViLhj6W8F74KsX3Q2f361nY4Rzh18nz8Lrq12vS9Ot19LHaH4C//p/08Vj8/AH6vInuNZrnI3ICISon6WgMdAkD4rMiuit2vwjvEu+S8NsXRZ3WpRMFndZpt9PcnUHnMhh0kui0G3RaHfDYClZzwWqxYLgTL+BILhSKVnN30ajH4PdLzrVlca0uajMD8y0G2zL7bry37pEgyd1pae5OIrk7XdQwp5wjk/aV3J2ujNVWl0z8H83dVaE5/nEeCzTbEBNXQz1PlO42z+j8nBLafYYcXOA/59twcPcZ8muImYr1QIflEmVSTAFYy2MX1++rf7ceJaUu40Qf6ox1xbtqO/PnxRbEF9Sel18cWx5fXrs4/2js0bzVWXBwBXu0wGBZpLo86S4PPZS/1mCrxz4SCF3hcE2XtowfarV2BugdduhwOqOMgFWdgxAINZ5UKiyY02mMh2pq9IswWG2NBHIBmA+UA/sC7wY0TIALRAOLA5pAV7Qe1M/IARxRk9FCPfrdeki6adv1SN9VvGipLz2dbNXV006tnsb1vd/XR65oTEVtKMU+Shz2j9Zq/YdYt1NqNihNhFj9qxpPmq4pRRm8+rFiLVQ2o46mchgBxzAJijtxEIPspDDj4oFm+uCjV/XAyvcqLz0ENM/C/Jh5sGttt/bVD79Xeb3yDTRtzY9v3X/V1fu/eOQr96+66ZAMWxaA0Ev7fjdvdqObeKn2hQt/9bUXK6+fPwa+Me3ZW3c9OfHMUdQ45dDurx4bQ/eVDe/D/XRf2ZjR+dEU8w+6r1ZE02A92oF2aY6lT6S1K9P70jCRplAGP1bzoRhfsoKoJNkUS2kiaJTYAAChVhQEjrORZCirJVkTDNb/fSY07XKLJkI8A4331Kh+q5oJLQynREbSoLTgPjoRGnwUsvaohGxWJftpg6yPGk+WocaT1SmfqqkQJQdK/JL9U3Ognk+mQLV7xdALr5y5lKKHyZs7PVeCvq2uzq2we3PnOLky58tvn4MR1i+KJVag4cDwzN6bOwhXBV4jK17vOsDQ9d4qpxpSE1PIHA6Ea8LoTBgcDb8e/msY5Yo/DUEzKXqKoISXW/KVgk5BtJSCDowFSxgnSolgnPmm3x/M58t5mM8Hgw4dy8bjMnQ69HEmsTKxL4ESQjoaSUfErZn9mSMZlMmYLaIPC8TvP+4DeR/wESdVpE5KzTSNlLQUJSe3KW3XKrIbRkqb9Axb8KFgfkDPYpgXDDoTWj2SY1QCLP4llMSm06V8UpZ+uJJFu0/UAiapYY+qW1H6TlrQUqubtM5VLKBdobkz4eTZs0NCz+zBgfnT+TN7131JDs+bAbvnnO/lL5h0OxwAd141TgSkcD1xxZkH14wPk5PnQpmMOFi44r43V3UI+Mn4lGU/uHHFGKL/zQyje42cPwLrqDxe3lvYW4R7rHtsMFKIFCFnxZq8v7C/CPdZ99nglsKWIlxpXWmDuUKuCKPWqA3aCrYiZKyMDUbbwbH2E+2Qay+372tH0faV7bClnW4eclvGW+W02BwJ1p8mKVSMIhw4UDst5iLB4mmpJRIEgoThR/S0ZCBpVkmOh+KiLbglCI8H3wnCFwl7S4u+vlgUcOxutVpgTSrl9UkQ6JtbxFy5FhyvBdHaY7UnahFXu68WlmtX1sJobb4W1tJt1u5wioYZ+sUYtNwzdmSbqRuN7rFh6E/+AnXM/6lRoUB1y/WtGh6ipCSPbBGx0KC1mGlyqBi1wBT00i0IlS0IkfJJ3YJqqkiBhg2Npc9QhMB3Rr1K0Rndax8u1kantY27EuqXlGxSO9BfFGu8CJxe2iiuBJaSaCgthWz3FK+jVcZKgdjyTtR3Qxcry8Yp156595ISF70F9W2cbsQ3pl1z5t4ba5zxNahv01R8Aya7Fp2597KWHNWTykaqJ+PBl6ie/L5cNljqd7bvze+tQ3vMeywwkidH08ycBe7P76+D+8z7LHBLfksdXGleaYG5fK4ORs14XWx5Wx1kzIwFRjvAsY4THZDrKHfs60DRjpUdsKmDqgu5LUWCkdNiKRIsnBZZmvYkMcRpkaQ9T5PogT8tKfFE29ixzNhCW1tra5MUC8REm3+LHx73v+OHLxJejia2UFcXifC82WyCyUTC43FL4xl9qUnMljPgeAZEMyTrgDiSdShnVmZgNJPPwAxVmg7OLupmsItZyN4zYaRKNVppuH+pNWpCe6R09a/0Jx0sG8cylnA0X9SajFSH6ngTTDBuJdHdqiS6gfLpbB2ihrz4v9chL82CN39GNbpQrNn64H3/W1UClTnfureVgbQPYola5/JSjbrkbRH8WnwbneLRUf6o+GseXc3eiG5k0dUI9Iik2IWm8ItIqSvFt/BQiR4tkaBBIIkcjpDyWW2SOxgm/U8y6JIkt95AAkW3s5BzgXbXO+QlFlrqijKEHQtotQGGkeWgaI1awD7LAcsJwqaTt0BLbnSzokrHt0qtgamlL9LxQr3F6CIYtgSPuFwGN6NUvxjGUA0ZbfjGIRwyGpTql0GpflGuiGqD4nD1q1r8OrvqRZpXSENDNTusFr/gYaXs9c7gU5s75+66vMOYtKGGzZ2zG5TiF3xruOylMUUXXAIy5PLjM0rpi2BYHJuwv8Cy8OKopA1EqDTWJ2vB2xHw6wgWSBAdDR6N/DpYFciK4IrI1Qh1BRcFF0VQKtgShHXBgpBO0+xNM2laEltotsYbIT7bGiE+WxGVL0DEI4KuaNSBxROT9cUC9tcQW/D9aZBOh5VKJJGN14e/0gIsVVutVowGVdL2syShbC7A/YM5NSILgN0zEyXVYQuWhFxwwAaXHRXqaAhRgAafIonAiCQewZJok+NUJrLSeqSIRW09Sn9SKmcl7FWR/IvGI7L/wAOjipQKkhquUtYM/iDZrLYcdfDt3cGxy0YJbwRaVWU3eMvoXqPYxCVnbtswc1QNmcjzF1Sa531WUeZiLUH0SamdLTQsrmExMVVJWe6RRgrGZ+2TU+nRG0QVCd0bDgUbOexUIo5Pk8gn9sZnlMD9/3KZ/+2S0hhhzNAbmkHtcvsEeFI7mWGO4JCXEcs+xhPx5DyQ0ABFPXlP2aP1dEkkcJrGvd+32t5A86fxoTd0f9UuZ2qwhfuIrv3mBfHZmdn5BYUFjdpg3JVx5YOFYKN2YwpcXry8cWMULcsuyy3Lo8vlZTWXZJAun4leKiG8+npBDFEjByOk9c9Gk2Z1yYQhnRQQH2bCEgBunZ6YuPrW2NKm2lZ+EQMipO4RCocBgKLNStJgqh0jxKI4Rnt/RDiUm6j9VPoc+QhpaqoElKgb0P3lUH/CECaZmMP94bDe51ZYzN1Qq1eqrPrqNqGwlsTiSjLmX/ff2QUHQ9p2OezRYxCI0M45igWHHYe0T1be+pTOO+C1gs8DI2DArsr2yus/qLx+EN7yo7d/+9/P/+W38HOViz7Zc7cBxMHKytrK85XXKgsOgGY0v/Jk5WeV31XuwMC6FhRAHznX91fsg4raqfYJFoN2ripnLxk1igPkPAaJJDRoJMK1K/27XUOn0E7KQeujsqazDbS3MCEmCdxU1jPmGdeiNbqNBs2lun7jWoAWJi4GFyPUIUxJzBRQvTAmARmo960+woE93D7uAIc4zuUMywwEUCfJepMz53JpGcoxzURN8YGhvx0iB6jihAZOO/RWuZbS82lz2kVatFsLjmnBSu0e7QEtKmtnaBdrkVYb1RPW06iDfFlUpX4sByn3Y7mlpZ4zRU0zTOgdE9hvetEETRNS3PsqP1xaISJbjS+xsUsrlIen2vtO5SiH3ymlJKUWpA4zeuhkIHFjh/qhTo8d3tsjFJHEWpJ0jENQ++uhvd5BypmgVLRCnRXJKukR3q/w9quA/cnT7//3yyeu3nr/S3eVwwlhYf/Nt1+1aSK44KKtD666dN3d8BYgVH438MPKc2ApM/QMmPft6RBahSWzwxqNvPtPs+87+LcPv/vDo8BM/Fkef9iKbmM8TJRJg4uoZBZ+j3mSedrzrPyR5gMP2+Cc6IQxZ8IVzaI/hd+S/xlGr4b/gv7kQdvkXYn7AfI6PS6odWpdBg9imJTXn05FojLnl1MpDseislbLGu0cy4TqXiTz7uLkFFYNtBLhlOFe+A5EUXgC4j9RrzedFkyChh6I01GqqphxYOhXh1SuROWoHCFNLFsoM7sR5I0njJCyXxnsrnrGeAw/yvXRnj+VWlbFJX20636woMSpgwWa0OZIv4m96MfXw6fezKYUz3VLxhTPkpNuvaSySKdfkOrFQcabwlJ8pN/rZbmo0pRjoxaZY1mBWmRWUlgY1TSC8SyLTAtWtHQx+kwcNdFa1SKnwWjActPHP3+80tqbc2c7wX0b77iw4skYdm7ctKO+MHHd1bffJMTByfpHr90kT1gB3uyPR+LxlTPu9oLLpsybfqbCXTrzgiVQqS9GsJzHYDl7mZ9RGXNjmG5mpR8ZMKqsYRCAdHi0wVwPoZaVGS9rtrAMJCOmXQCQRlhIll5HhaKL2cn5RRvl+xv6R9lMbmIbZd9jR3a8+OrCk9ZXNXtNiO2r6+twpHhvQrKneEtC1KV4c7c0fJyQtPl4z2nzMXpZuqA0qY0/see0+XiVrif1oOFwyxPyyJn4tE0/8uQ6K41Lmjylaei2f25qG7zx8lQEg+zmdeDNC0s+EKd9oRD9Aa9NmImDiXR1xkeTO/2wnNxh3e5EITKFzGQ2u90ejyjIDrsxzsuAYQWXPsTOAbBbZ84RZmydO+fxeL2CwDPhcHBg6O1D5Pkg4Q814IjKSBaQx0aqHCTrleOn8lv5/byG51ldXGdUFlYeGPoj1XaZfD35CpmcTKUkbDNkcIR0B70rQznXp2q4otxkvQllqFKyUbuEONJ/nlbTYYPV/qCqGExG3svbIQ/CPKMkIgd7lbMnwUNmj510Df354PJzuoZYu0BlYVfghl3B63bjp3QNqSCOBkxpQOG4fSxwNNQnvG5O6Rp6AiU7soG68+Oaruu3vH3lplkGeea2ZV/57UEw+4IQuo2eAh2zexyq/HbmxkJi0wIgoU3g8v0PaoOlivvdyFK4R6kvTMW+ZRY6gH1NiOq6F/uqVWgvMw9mqDS7NXqNwTjd2KPpRJNrO2ejnb6d5Z3j0KOTj/TCnfadsa29j9k0V3ZcM+GaDjSto6urqwelOybpJ1mRocPW6++I9mpes708GWayKmt2NpGfO4/sGAk/mJeYla4hB5hrEhpATzIzCQ3WB8vUadO6bRYLMVcyZdGLkVPgBv3k7m4q0O7Y9B7X9Ok9dntdZ2e8TjuTbLeW9rqeut11qK4uzVj0Nsmp7e6ZXN+hTTPjuHGltrYSgVSBQLRUSkejmTQ7bfp0xmgwzGOMTsIg0GDAymPQW2yS3akLazp85PH0nu7J9Z0dupaWcDg/KzErtlcDcqSdKK/ZoxnSINpVdEptJvJib0YYZ7DijOolUjqCHc1N6kfaM1Q9UGzKGafmpqkHiptJ2FHtLaKlwpG2InpFCTmVcF89qVz9r36/R+cCnsnW8GmGI6dlWolerq42Tq7CkcojnXb7zLh2QPfG4f66eNyYzlI9TNcovUdpFsydiowmpfdoutE4LuoZ0Ace7i9F2U/rPSo024tq71EbEFml84i43/g5nUek0lhsqGLoMCg0llQm1+FyJDvccoTw1xJKODf4XV9hfLr4YOXvnZPb+uYW2hoDfMAVyfqTtZ25mUuz6f4ZDeeDpxfU9/SnG9c0jGmrTfqzEXuYDzS21c/tbZ/cWfn7g8X0+DGzZcN51x7jl1QOydqJ1zzeownsGpcyOxrjmdyF166bfPt1Uw14MaZuvX3yui93NMrxRoc5NW5XQDP74c0TtTKYuoQ/trvNJCv8sEMn4R/RfmzxlH4Tq9agNcImdjILJxmBBuvsI5oYsFjCxHz5FGpeXu9w+zweXzyn9AuxMfJkUq/zNThMfDhKdLo93EP60hmbRfA83+Pe4oYRd46wTduIMzkE4jnAED11UxtIvo/NJoAeAQhfNJnoAe1AxLbFBsu2F23wiO1dcrXSBjkbSZ4qkAv78VOraJtQWm0T6us7qVSo8R1l2EuVbNTRrCik0iTURLuEsAIdtPAYjL1ZtvbjN+Xx4N/CAVh9DN861K/XOXBo9Rccapn+c4eQTqO0IdAjkdhnyw1Vzz27xuGxNy9qvfGhvwDHgfuv/NaSwDdund1fGdpwRd+0gy1wDYhwXHDjxV/pbH72sq/1LAxsWb3gJ+aW67rHLRkiMxJwXBrAPikLbqHySRp84DXfW76PfKjLd5fvOR8y+Py+lA/1aHq0M3KLc1tz2kS8W8AWefEh0qfM4IvyQp/d4QiFwkZWqyXzDoDXZPaaWbL25pjHThyNx2/FXsZjI/c4zxYPzHnaPYs9aKVnj+e4B+327PUc8Lzo0Xg8WYbxaciLqyTWAiFwVqcY/OOQVZli8HbZR50VmWKwR9gnHBE0ZLDMFgGRY61kcsEgRQcFlWpZ8WHc2c0kVSdlNFEUBnp47QCylb1SNsUnu0VlCoE5xdu7JU+Kd+DnDom+Hj70GLIykpo97M2dyvWdAtgHqt/tYJxPYFdHkQZB5quwX/Yy4ZRGhxJxpf9Em2CDTg6Fedp/4ggbP9luZACjTlKNHnagFCVGQB19BVgIPgcbx4NvT6gNECQycVZT5WqY6ar0KtMOHsf3QQAcndYK4srUAwpP2taA/ZWGOWVAJh6AN8nEA/IsxipUL7TnMW5mAvit4t0MteAm7TbTa7Vv1X5Uq+2qvav2uVpkqPXXpvAnt99d425x9wR6gjMmLp64deIZh9Hi8Lsvc290azguwzC1llobipCmI/33QZBxwu8+0tbW2l3KUk3yAoK7sCbVJpLJQqFoDAWDY8e2sd6sIGZFqkliLEM1KUM1KaNoUmZLBuYy7ZnFGbQysydzPIN2Z/ZmDmRezGgymQkeTy3VpFqqSbWxUlWTSlVNKo1oUglsLe0p7SsdKWmYElfaUkKl/4UmYZ0JdYveHj6oaNKEFD+2Wyyl+GJ1wkUG6xbVpNoevvDpmsRw6vd7qJU/1UtO7vadHDkss0pVq0MW5HTqB3S/L5v7nW2ebLE9EEZtrYqKBdvYulQcFeupiiWL56rYcIuTk5bhad9htR0RGxrn/0j9fpPgxxfDU2Lt5VBNG19zdPM3773+PyukFknpTZ1SY+el6ei0G9efufIz6ye1W+gVjL3Ggvuodpb1cfBRDCxvvKZxZfkjpGmGXbA3tqBREw1Eg4l4qkGDA5CgoQGxpURTrAXxIAA9Le4x7lbtWIZpbWkh6MlO9KAlhoALIdDUpI+KxPHM2cceYCEpN6xkEcNybJRFLOu3taIWuUHrtxW5YiqXS6UCfkIla7XajA0UDQHU2iI3NehsGTCUAYsyIBMxuAw0sjHEMIj6O9VEfHGKAnB8cbrsoZroBFude5z7nEecGsbJOaFT1UOqeORagU0j/dcqUqoaoLE5pgqR+nAoWvSPBkiEjHZYXX2RFB9IiK4U7++WnCne1i0aUrw1IVVHr6xeVT1IcrBJxAHSycP9omgL+n2028rPjrXYOJp9AjZjqojRz8H+FDuq26pQjUZTQEU57k+MalHqqcSxndNaPdJZjV6p/H3zMl9CNAe8rZMqjYoSHZ2ViHr1bctrEsUFhcZybcoj1HhqeTGajXQt7emZ8uiRTBq+t7TkG6U+PmntIThx5eXdufoaqc5s61nQkDF0f+/mbkjxinnoXfRz7A9TKl6x2NLTA5Avm631PC8SKJ7AUZp4md9kthidLhKfWYzWnAXYLBELtCQcOVIRjcsuMmj9UECggdWbZYvBj6/ybi8RuRs/pczzKbuPuGHOvZcAF1bn1BmU6MxBlNFJXuoQycv2OkDUcYJQ0/etHgnGVlUDYGyYSPkLG6Sq1bASq0HjsXYSrqWr4nYqcTCb4kG3GB+X4pnuWDUoDj50bkDMuGgQVo3NUmps5hcH9MaD/X7T2c1eznOMBYmQBTs5/isOd/o0tpH+r3tQEcdjxCrEp40RKy8mruremhIkPuHKprJ9akCmGACu7WK4qbL51w/NuTxWG47f8cTRuzt0jIpb6GwnqFcyuv/fz3dyY7zz/7P5Tmqg9n9zwFOwbGKcHpQI2swKPjrc77aGjQlaql9OAdTD/SDBVk8OUnfmpf2c/5dHQw2+po6GUiyJOmNMxc914EKlV2lGcXFxaxEBRvYHAmmsRdGoYNTrdBkcQ1us0MoSKVkpHrHGfBTQ+Dzkns9KpMb5tvhgztfuW+xDK317fMd9aLdvr++A70WfxuerC8aDNGsZpN8gSPI4J6p5nH9U8zhVQCODrfIeeZ98RNaQcdZbZCQPO5JzAE36XDyjjJAYRjWWFK/vFmGK1xFUY5fqUnwGW5AUn+6WfCneRe+KcooXukVrind2S8EUHx0NbqpGhiGFJIxPGEbIsgakxNLGfl2ajbgdSBCpfF3COXBFnTjRMApzjMi1DQv+U50KhcXWUid4fGyzy9YyXkEh9KK3gD/R++DjH81rkOPxUMPiSmBek0QE/vvf0wsi6nlNIn1uaIiZOHSS8GY6WEv8LNlLIE9lf+EMebG8VUZAdvCRiE6nNzodrM/P+KnM/VRk/phEZS5RmUs0O81JWySYk9qlxRJaKe2Rjktot7RXOiC9KGkkCUAL1Fnwi2HMXJU2vjhNpY0vTqnSVhii9pmPmDWMmTNvMSPzaNjwSWGr7RGnqkLmfERwIha1o1uSUnxEEaqZit6f4vluiSjAKKEqIn2EjYYRrTw90h/RGx2Aeo3RdUT8iR3V5aYWoz5VYqNuwz9XrqbQke5K9PYIkkSz1PTqaFA4DBnV+ZDd6PtUVgmau1PnneLHAcXPY/y4ms6//BOVnaBljMDNBECcSYN6ZgzoZLpAOTSHWQBmhKwEEw2AWNlNMVJC1On12AHIDA5m/P4Ase8WbN8DAYwGcFABEElBQGhg/CTTFggE9Bj40X07DP+gCvnOqFltDPMOOJHz7Ky2fTi1TRLbai+ccghCWXkUCDA2C11hFYbZjHrSn0LcNlutlasDGpyCl+ZIh/vahvsXCsiXzJqbJs+b4W+6qGJdXJo5F2+MLLrtwykzA4M3Lis5SMday1q4yd0zS8mFmiud6B/oNryeecoBPq/SrXlVewuTYuqZdrCXrun5Nxl3hXZFUc+4xeNWjruJ1fgt9Q017RLSC0Gny5pIrYkoCR6mbbpWl5ku6Jqmm0yF6UETfha1N1isUk2935dimBi0xqxaajnpAlq/DyYzPgywqPkkUJpa0IGhjx6lKQMfP2Zg6ANaORhDniU3x5C6m35okN7FLve9ciO5rScFuON6kNOv0G/R79dr9unBSv1WPVysX6mHnH4GaafP6cj3z9GQk3BRlP28hvxo3kqT7Rpyv4cHeR7wuaqBpYW7avpcOUCtipYkz61caytxp/gPEfAp9S9tqGhubx2F5stGYmC3UbP6GIiRvacWMR4GjMtBhe9yU+G7rG1Chp6U1OK1DBbw5cP9pqCpmoyk2tBOtp9cHDVma/RWxMgbNtQ7MFxT0ktOlR+D0LApZ9PIbGLwHWDNLFh43WM/2LZ0urd1ccV50ZgpF988cOCWy6ZGk0JiT9P8OYsWzZk+/iuuuYlpS7/bNUUbXjX4wuzKyaPPVN6YX/nDRSWvLDdvAMH5IPri40BY/OHWTvvgP9ce/82PfrLAXt/0o5+BQ+cRPQti5foj1bOcYnOHoJqvaqc61k9yUjdrtuY0GIoFaA1QjsXsdo6FOdLkW5OOpKn5TVPzm47x1Pzy1Pzyivnlt/Awx7fzi3m0kt/DH+fRbn4vf4B/kRRNPF6Tl5pfLykRnqiWCE9XS4RV82sEW417jPuMR4waxsgZtxiR8SEIJ5w3/4D2873/xhBXe4lV14tD/RGvW5Pi5W4Rh2gxYoqdJAdl7xbPrhsOm+FHIeuQ4oiWCR/pj3EsG/iUAuEn24w/YYA9Y8An72kCMrr1qcE9I9F7ZPbX+wIYNdEHtXLlt2t2nmWPBz+eFxX7wOCiUlCxz6nrWlWeKizT1yhmqlXn7eAomydNwwQyk6Zh2eE0Kn3DbDyXaCdj75DtYJql2bk0YPw+swVYWKXY4QvQ7ecDnK/HB32+dCaaoU9lYpHq5o9Uo2xyUXYTIc6IgGMRsDtyIAKZCBeBEbJfRxe7VlUTPbTLXmk9VqREW4/Jlh72nTz2krpuMUoEJikelHjTbWKCj2t5tjp+qZecqQnmB3R//5TuZPac7mTjJ7uTPw3/jIVtYKQ9WTqrPRne7xzTCh5XoW5uRl3k1nt7lwS4phLYj6XmnNh+Bfjo6WEJKXgX2cYuOTElO2b8t3qbovSJVeNrIwre0X6M5dYOVtO9FyVmfd+4A+M0mXTa6/XIABobGxpEURAsFjMrRAfQooNBcnZoYTmeSIaSdCMmERFIMhYMsmNa8616cq+Vbs7WWI5IZwyRTq6OWlxawiznFuW25o7nNHtzR3JYTlH6WJPLOZw4ZqaOlH69M8bSaib+cpZ8IxfdmCyg+RuSuNnDIlbZilUfOxoOE3nSCyLt1rPOuA+ODnsezqf4BqKIkjQmxTd2iw4S0YjDoTWOdFrH4QBbkqK8gB32aKz0qDUq1Ze0ZqVm1CCYWTJwiWzTc1qSjZ/WkvypW1WtREvV5tFP27480H78z+KspureFS/sLyctGE2BbzfWc+L89Ysd9CmsKLZGmebdRnCVblHMFrsI/OHyFB+PA7H+/MGP5wqpS8Ffhl8xY1s5qthmqh8TwDeofhQXT1w5cd/EAxM1Y8nGHjuWaS+XcfyZcrtd8gTGWF8sRqORiMlkZMu59vaxY1siPFEZf1SgKiPHA3GqMnGqMvGY369pbqlt0ZPEbYteSdZlh1UmS1Umq6hMdlF2a/Z4VrM3eyQLI9kofazJZjm71k5Vxk6/3h7TVFVGM6IyhAX9gAYyGk6zR4M059rx/6w8w0Mz/pUKCTwfIRXH6smR6v3aFF8kquWXmlN8fbfIpXhTt6hN8cZuSUPSNaMtftlYZsy8UGjQGg1Ki3vEyKaqWZuxZ7UnGz+tPfn/hT55qfeo/Ywq1Snrbn7sf6NVsPLbTdeTvi6C10nvhJ+JgSVUu+omMuA904cW+KblJP8XAf1UeIn/tYC28buEp3iEwXlMp5dFkeECIdlm44w+P8HpRqyIfj/G6Qo2t2G3MeQDvrLFU+/zuUb8BQGL5qEPy1E1toqa95tP4JDKzOp0sVjAHaDqE4i5Bob+RDGBq9pI4SLIkzzponkfu6s+4gIc+Zd3veN616VxqU0VVfdCVYk2eGFFUDuaCd4fbh8abC0OR2kPk9wdDkUOk5wtV20cUvu/HvH7OUYn0sYhnY6rJu7ctB8MG8AAHeTJhc4a8mP8tDZnp+pF1K5OFSaQoSyjRvwU4ZyLU8K8bxxc9MSvKgtmNq2/JJgFL5Tq11yx/oroZHRb3BNb91jjxllX3UJyKJsmXjX4sOWq7lmrWTIVG/uSAu0TyjHN4NtUop3vBT4MwTdDJ+v/0oh+2vhS/WuNaFv9jsan6lGzzy+XSqlIviDzFqsV7x6SequpSbE6vUtPYwJ9zBlUE+rvlf3UKyTJ/d3Ovc79TtTjXEFmLDaQtCy53UAkHFRDiCDJyIZpq1dwf/AEYTbK+XzNzflYnso5H5Oq2E+qyhlf/FkJ3srSDGmrhCSlO8xdz5B4XiLdYecImTyiLWLq7bMyLtVeseZiFVSElFQZDjmt24i4wTZJSaTlUnwNCUctYizFp5RgXbUMI/oQfMjXrKRafL5ImkEolaRGAqRYqzGCMci7B/sjBaoKETNNrkVsyiflzG9EVQysGmdjkHPhB7UNoBQ9t9tMeZmiLoKoQxeDF9qa3A4MRIrTc1FPafD+1eDOnzxemaxgyuNLa/mGhouurbznTaEr4/FA44WVwMJSWAEk4M0Lm7yV3fDMms+PoEyvvGbwi9bLzzuizG4lNaFLqU4JQKAalX8PfqiBb2pOhv7Co5/yL4Ve49G20A7+qRBql4DAADkSset8AZlldUaHnQ1XtSNMtAMNfaQqBdqPTiD8x8swguAz+1ilMG2qbn4TaaciSoEvTtEQtGwCJkLvQZoF8eWnKcOp9Fk9gsNyf9hLSs1UvErp2USxZdXsq8JlBLrNGUZndyrdURzNz9tZnY/KVqfAf52ePqszfqJj+z9KDCz8lwICZ/6VJEjMNnQSpdB++wRUj1YM92obGI/HQNbIQzYb7UOLeIBnijidex+bQ7VXOzt0UnuI9Ivg6GCjMqHkT/If0ycz6Ap5Y/yPPLosdDG/TELddXMy59ehhkxzXWcGBfxk5qpDn5VjpoQcVlNvGE3+k0olR9Lz1dj9cJT+FtEBLF0aOUSii6IwOqUYqKGtczW0Z6qGRPkZhkYKTD25z0AaZjCgh9mNf1HGh90IgFZIDQSMWaoFPXzxPv2p5OIwDVEWF7j3R0u/MJIkoO/9VFpRBZICsJ+defVZh4MJmppTs7DdwwU6tUHcD6g6+P36cxr4WT2r9IQb6GO9MZyg7iCsw9CJtJ/Equ0nZymH5B69v+PDpx6LpBGJ5A1IogCQ1ICDzOiGsPx7V35SZeLEmlB+AXh8Yt7zZuD0d/7r/Q0/v+aJU+D2JVv2Xv/63eDxk5eko9UNvb4JxON8+tKnnvp75U8/2DTEXAM88OoHHnq2chwsPQY4og9Ym5S+YdI1fBXVh5qc5T73By5kM9ssOTOa7ZrthhqXxp0OTgk+4tbuDIFA1GN3BVE6NQCCj251AIfDI0ikkuthoqzSYGn0eAMo47ZZFM/9t7KNZtVdbhQWsC7ivTT0Ad3HXEzLEn2ViWjZBHkVS0HiXhbsZvey8EV2iIX72SdZiONVYjXCQ++WbeTVT4ZfDEMm/E4YhmkwSQEjrbAMKopASDTTI+O0MEYs0CaiApmyNZz+cWsp7uNIeCGyBA9i2WAZLy0bggFX8P/h7EsAoyjvxeeba+/d2fvK3juzV5I9sznJTg5yh4SbAJsERDlEIYhyqeCJQCvY1rNVsK1a2yp4o7U12hRqNUpbpa2vqK+ltH3vpdrW2npk+H/fNxsSLL72/bMwO2c2+/3u2+2ye23cBIq9lHppDciV3ptQGrE7BrXBPz6zPhbzq3U2O7Y0tTY1VLBRb1+/nELsl3VE/7SPNoO5PXbU/pOvXRGMQF6RyVebcbKa/ZyDqJra1Vhv4mY1IhdtTGWXfn06E6k6eeaB46sjoYtX3bpeo4c6QTC3THItrg4jI+M4ANJK3t0NKvsfKO7p0ayavWQzOSPXkrncJKBcS9SPlXgIXrA9C1Hi/ae9fr1FJANHyUfO9emX7685d/9K4m54tvwpiiQpMvwsvBO1epXX9CmiImI0ign3M8MRENEs7UgkRgZQ635owxilNmotcyu89w2MbbcJdsGbs+e8rfZ2L6vWqPVOjVsf0yT0Gyv2mpRL9Wv0W/WUoSJZcaSCIijaaosm98fA67F3YuTB2OHYCzHKF9sQ2xnbH6NjsUQ0FgtArDUEQyFA8AHSz1H9FPkuBSgqoaCt7niCMJcrFC63WqfV2gBJctCY9qmx71iNOY0aMSYdZ0MYxmH3I4cUEZz4aeB83OscNcTt50iOS9jwYzYcVLaFQ9DWmuJRcOdvU+6QSREHHTf6QMHX59vlO+Cjj/gAcomM+ijfcPmDz1IKwjFtAyXkMniEx8YsCh1OczNszdTKOZeyVxMeyplxmxoaSqW8EyiRJUsY5cKGcx4Ure9Jr7sraHvS60LZBwOU7CGVORwx4n6cCkKkPfPMeiIYVMRxi5en12sNccIt9yLBrZueXO9WK8w4PK1QlMLThUJiZodqa8CIWZiRY6rycCtMdWsrOcSrsli3jfBZ0AvukS5Zva7qllsly7d2ty+atzG3VBKXZe68M+Z3JtSgzE/vrZfu21ct/Vn6+6d/qA1HQRe4GhjH90h9N7TpeV4992pqfv2cFBe6AuE0zo1HOE2ZIY6yuhV9hNyR2OXAUwVcU2iaqCrNyT5NLYCy0A9CGBeDA+xado17B0sb/AZjzl2u0udUjv3B31r+YqFvse91kFB/+VBc7qGdRo4zKxUqBa9WO81+tw/4WJ+T8IEkKKAe8zTvVOh5s0apUhlt8Kx/iADDxEYo2CiC4JIp47Bxl5EyGm0KhVqtwS4ajQlhiQZxONvZTyAGopw+WZ63BJB4m8QIkZyaHjHSMFFb6qk2gROY4MXCpoaploClxmo1OJ0Jij9ozWrcTo7zAWD2oTEE/4XHEPhYJ43FlVOBxhD88fH15hnZklNjCHBaLe4cCy0UPA0NsSP7tC8bzyGgrIL26sGLbzGDmHTivqu+MxLcd3zsH9J9jcUazmoVyC1rb33xgab08Ufut7wC+PGfAYXHaEZwW3X2NPkmjh3FMW9qgIJJgWeP+fExZFlkPVMLec/DGK4rXyaIsGgjwQH/If8R/6j/XT/jt0U7EpCePc9Si2UYF6uqPjtTDtm5Z99nvgzlXZzIgYflXl9/U/5DTZ5Rn07+d5p6Jf1m8ldp6ubkLekXk5TJzMe93mDQkWMVfCYT1yUqeK1WpybirNuBBRr2TW9w73e/7qYMbp876S64aZSfcl52SgXOTqkyW7Bea9FhM9aPIHzQAnZawGHLWQu533IQFesaUwgFVGc/ED3oBr/qsOpdFaVSMSybyyVMU25249Gzv8EcxogSEvCfsdF4yEgeMo4a30cd+XaVqjhkh8pMtdg4U1Bi9lJMfFZVxm2KuHNq0hNIRsoqs9DkjXfhqo8plVlWmJ/yenVxNoe1JBZC0oxFX1wWfXE5tyXOOoJHlYon1zs0ugRWonUV+DacEvM4Son5zByEqapgWTmaqVGXUl+Ez+S+TLXIheo1XbuqwjsC7jr2vNQxv0Z6tfyapS2DVYFgutJVnc0sIR+pzq66WvrQEYVSE+rXL2KNGxnS0lXHHlspZvl4TLj5md/cvpAUPv2ebAWR2K7eC/EnRzSC78ndo/wi+C/uv+s/MP7DTJ8xn6797wbqlYY3a3/VQN1cu6fhxVo0c0TvKStrbJylN/CzZlWGq6p5VIQSCoVR5kIyWcmaGOxtQ6A3nf0fMYJBb9plOmyiTCZokDc2VkF7vKysCoO/KuwOlczq/5I9KBvdwODuc+9ClnWOIDweL1Rl0QVvODplWUeRNYU9xEghwygjRsGB6KHokeholEZTd3dGqejMWMpULfiMw/Osq3+yrmd2ND0X987FvMmbg7GYt7IrBP+u0FFKLxpD0Zg3LKvcN08lPjyJshpsz1IG4rPGNsr1biRQ4Z2oQdMUbClWRVVWYINbUcmG1bYqXLRlq8bcjA/a5JIWm1qepTDDyJ4SVFUzvfmlrDjZ2/+52Q7nKrtAEVxjqesDZ7pnuVf+5tgL35Rs7dU+6QZ7xYCUla258YFyBxmqrxnectmBXvDJS0M1LkEwV69+6caNl9/NA2Pjyt/+9tLozBh7WWz95JcNl3V3XwVlE2q09FeoJ1WBP2Msu7pajFepqod1xTwUTgGUSUsfqR6tPlFNVbCgv3q4eiM6JVYDtzJLAHdZMvl66p0UeTB1OPVCivKlNqR2pvan6FQqk0ylorF4PJflo1URjgDvoiBxhgZufTpDOMtphdzYXJ2rqlLFolHBZp2y83BiXQwhjjWsVFkQUqmsOOyODb0DKnBEBQyqjaqDqtdVtOoo+X3RImTKsI+5DKNjWTgeiQjQNMQYKSAuiR3QUHESw9hYFPqFYWGjQO8SDgjkEQEQAieMCicEWhjOP3i5I8F9eL52xE3O4GVTCtIUal5IQZqpHp3z+lljXgOOAaKcm6CcpNkVKot5A6VUzZK61LJN5OwORuFgbGWAVdhZZxmAwoZrSFx3HRK1m6BlgMjF/TgRix5V/B5iazYWo9NEUE07od4kqtbTCi3qWsTJWQUYP1EJS6EwjZtYg/KWHMbTBcVTg5qmUBPqUjjjE+pSxoAV9F56U8v8y+M1DRap0dqYMRTmbdhqbmyR6gayB/aTgtdeqQcRJ3iQbpIOb+ko3v2g9PxILc+Hq/tA65ErbpDKBrJenm+9hNrUcFGCC22U3muQbQWcC4z1KldpXtO9REmzaiqYy6Fm1TStWcn30y58v6NkWzyJGpk+BpLIg6fRGXIHkyCZfC9JHj37u6eTyQqbCFJTxgYEZhWS0yj/AefHNwAJU8D8du9q74fsh2qaYRg1qTI5rTFrrbXTyjzoAR3xjrpdjVSttcva4aGIxkjc30ipagGakM35iXcIMok2kDPWTafJf9cMP1TGANHrrbVVCCHH9gbQYAuzNjazPQ/yFQZBmGWzNc4qKUJE4VRxrFDgThVPnEDjw2vTqSNc94Il3ycSZ/9BxM6+T8TPvv+Yj6uBPwNusVIIhRyOBq+NF4TwoRDYGNoVOhCiQiGfveDocww5KIfDY0vCj2yogxR5lPxEDHl9Fq/X5/F6w7V1llqvr7auJl7rrfP4Yko+HLbbbWweZa/W5ys2ZnZlyEymwlA6n0rBez1xX0zh84Ih7wY56E6e9YJ+7+ve99A8FL8366W8TmwZjGyyZ7NoAK5MKpAeoLooH9hrdysrz28ijYu9cCmOvCmiwDpRSpc5l0GPhyjJrUJH5IzDkeKMNHrDerOt1lsB19cREs7NnWAr8keV/sfXVxim+toVjP86gZ5ClfVWi90NIEuWu4UqQEkjkBWCAgBC5LWotynr7ZIz533xV6594Bsvge9YB/zv/MSyHMSzVT5pX/7ROTXz1wUycX3XrCbpmaaVn0mcl/4gtAktUgb8NRXOCwKTn/Pp5TfuKaSLFuOdh8jHd3Mz8iayoA9jq7m/arhqD7Wrij4/yWDfhZIMYt5UFxop4eKZVDo9I8eCSAKgRikWOKSWUJRSLLD7w4s5r1el18Mt928mWqBH7PjX4HSLd/4v6RYXzm2cyrmZHl4xlfd23uwKaIC6XBzAKRTh6VLr5HSrtifWp1l1Kes0kUUxNFn3Y3BS1b+XRoF4I7RRyGpB3X5Z8cfTyRRlnYeXelHw7Htyltv43VukizaUn59QMbk46CuSBI6YnUt4K/V17jj7nyoncykxn3hf/Na2eb+aR1rmhueSnfUD9eRb9eDherC9HqypB131YEcdWBMBV/FAEQbHw2BzGMwOo9mX1CV+4NIDNOWbfFj9rPojNRVV36Um3WpgIwWSvIN8miQtZJhcQFK3AzA72MPGMoF8MOYKmpOBWEw7q6GfQFbkAYImFgYbDFqfNqmllNpM0p1KGZRN3qihy9pvoGqro6wQpZUqojA2mclkxgpjb4xxk2NYQRsDycHiBPc2Hj985o0JbvKMqfYNeS7oSOn/1FbeweMkhQjL4EGaRAAPVMdJ56VR9PI8zXw1Gj6Mxw9b8ZhUm33G8EloMsoPQRL2220q5/GfSj/72yOPnCWknx0/Dg6C5I4Fmy8d4qKhxD/2bL98z7vHbmS1Ff75ZOQGH3fj87/90vrte/6RCEW5oUs3L9gBUideI2+TfvTC0+odO9RPvwDqQRY85K9YsXm5IaVycfoXHpbOStIPfqG+BvT0umrsnCCIgYulJ69R/+r7qGfrwy/oOZcqZVi+eUWF/5dvyDAOnT1N/4k6DM34dlHVwSxhyDyDSijffVKlbV6oQOWOL6C9u53AaYcaEiRUmqPtNluKIi2UzUqRUKkP05yFpjmDXp9iGQur17EM1N/DCqVFoVC2MYsYMseAdg4odZyBsdpJvU2tUHsVJjVL0axCM8Bt4/ZwlIJbzZFKBhKMEjyoALQip2hVUAMsqGJnsyTNglq6kx6gP6JpG30JfTP9IE2raaClGqgeajlFUwZyiCS1DGm3UbQVfpCeVeiUenXZ9Jzxp9Bg9IA6iUah4/HiJnvt0GBxaEaDrsFiEWLQGESfAsqXg2d2M1wC9yp1yJOpdzvOP+Z2K8eUY0aQLSKqL44AiwaEKBACQlUWsepI6R1p0YhN03/a+Ebsd9LfeOmt0KO+sR8JcPvyujLvpQuphXnpN5O/JTsnn6HI5fOWzZ/8M3hk5dIFw3MkBlg7C8EbfBche94C7TEX00OUEzXEpHhFY/Wc6teqKWW1ozpa/a3qo9WMRpN0J7+apPQUnbAkyJ0x0BcCR9yj7hNu6nuWVyz/YaF2UgCPNeEYv8Eg6s05g6jU5Ay8OuQxmWyRTiINlFQ6bWecNredzIdUPtbNKP0Z0ecTCBz19sD7nQGPkAuqRBt62MYETAYV6EPdvytQ3yCOqDNkfFySIw0c6INaCS7V5t7GrpyxD0ZlIEBqPZ1AYtSRdPWiRiSnJwqTSNFIQtCgQa+jk6PHoLHOjZbmv+MfuDM9Cl7OOlXgMWCQGuWGsKwiYA4JaDS8EclGu00hUy6ORTGur1335uRLO2evGY5s1Qkc2MNEQ1eQHVeEogy42SBozA33bc3/bOl3FnX+58bhQxWVS9K3PAd2/HjlXJ7uuZ7q0SeOgMYBlwN1FXK4BqSXFoRHpAc539ol193V26ycfE7/qNxn3Yv1wluJCJEhXhM7rwJgLQk2RwBliPXFhmIbYrQh3ZceSm9I00bGz3GiUpc7CJcqrOE9JpbnfYnDifcSZxN0wul1tbqJJA/hoDYaUKJBmY/bye3nDnL0e9xZjiTgYwYXULoiTJfaj7OEvYd8IInGcxAeviJsPqQGSfV7alKtjkKieIzIybAojk1k0DBhqMZMcKdPDxZxW7ssBMVE4W8TyZEJyFLHxooQBI6xEgwQyZQWH49gxzPYqgMl5oiV81Jvi+owhRwTRlx3TLtuuPgeqWPQZc7s6OPLeRD1cY6yuB6YK0AeHs+5WtwE7noBRQOrqpYX2gC5ryXHJ3xryKvFbR8fesypQzo6+/H2gvQwqZD+Pgqkr+grc5CPRc7+p+IGKKvaiXHxuuMA7KHvpsma2C2xu2JUTRywbeCSlqtayFXNm5tJoRnszd+TJyMNIbZQIFM12fKqqppoOeX3uL0k0T47Sqp0nNugJBqBsrGRgNJdjBhYH7uB3c/SKoplCWUm6gzkMtmqTE7Rbm8nle1Ep08XEJRBq9cQsCY/QPPuPxzl3s4MFk9OZDMlBIdLl4VIjhZ7EPKZiUxh8lgGvUEwcGOmWnlaN+QiYEoeybOcqcA/j7xHmF01NfI+kDdVT3U+zprx+FQFdltaEOZn/WbFDWg46n+8+ANG+oMzsA71Xtrs0jCaCh53X9oUMgCX9tk7b5sanGrnndLZr/9i20oOzVetadq+Gk1YBS7p+PExIEiDmyIZnu/wraLW9zvqbSaeby67TNp1GJQvX1JnaJfqDv3mpa/9d9c39903bzaAnAbHYPuhnGkmPhXn7Gja10RurAH6iDdSGbk1cl+EUTFEgkuQZVAxjhHNJF/Hi+ysWWQqlhHVulwmz0MNv8ztYUWe1OiNXk5taPA1kA0NRN0sFLyo51Em3iGWGoJAIllWSSQzyQ1pcDB9GA0725Um081JA/w7Wn2EHnI2fVdYGbaLZVyX3Y6G8XkDOTtO5TFZcyk7IOzAjl1AADKoD0ZdCJgQdqNIhTgJISPzJ0QvOLqGIYm4VmFiLEE4ECSTo67eyVGozONmSvBZmXXxuAoxErLKcMEtQfNTAJWVCA/I5qdhaQyV5ndjHzQXyFQz/fuO//DaLfTvSEXI0S7NbtDxBr3RuQJ87xKX5vf6DTvvmzVYbbRaBUFbK664qi3HId80sHxn5PArX9p37P1ebcbO8TxFqYK+leDMZWURIAhZ69qnHrviBo/RLP32ktbeawf3NqWlL9wv8zD4wxxH81uglftLMb1bAIlE1OmorHBVKFXlFYqKCldUiAYVFVDcVywWVgtbBErg/f5QhSvEV/Ah1J+84KqwuFwVRqPN4zngglo/x5EH1UB9wHbIRtpsPEkOKYCCL690qOx2g8BT0UTI7/IoSJPB7QVGJRLKkAll5FcBrfDY2Kkx4EyOFzMOHCEYL0KycnL4GF7ezSU44sXdSERD4YxuKcJTu5XXjO1mxsb0UG7jN3wNUlwMIFBABkaF8LB76xRno1Cj8RKgoMYFwWYHGsAcl+rSRnv1bfepuHnSjfM41VdvSi2QHq0K5+LgLE9mM1xm9uTDbx3jGZ05n1kHMtKebVbUvs+6DWyRfnlF5VwDz+sCydX09Z9sWGZuVJEbwEtSY2m96aPUESIGJfwZcdfixOoEGYsJdlt5wpFgFfEEk0g4hLAQZhIWhkmEQ15vIOEIhBKhQMqRsDgcCYPB4naPOkDSARwhvZ5UvmABFkuIJAsMYELxcpviMSs4YD1kJUesgLByVr+13zpsZaxWXTikEGIBr8PNkJzOWwYM6gssPeJM/7T8pdX/3OX/F6ufwWtvnV77WQCvffaf1p4+Kt3QFrh94dTKF+9xNEuTFWUOATwRA09F3d7C5N9uPcC3uWqB6uOrzD4oRs1XfSydTpbV87ymzNZAmT79pN0ODZNfAkb6BK15iCCUjRDHe4l+EBYtQh+w94FLOkB7x+IOku3Id5DtUCkWm1Wq5oUYiV29vV1OR3+fS6ma09fVp+gLdnRZ+lwdXR0d7edwG9hs7RUVAiSFPSHQ5wq197Vjapjt6oPU0EeSOxVABfG+3Q9Jot3VLsxraEjmZjcKwVxHOzWnrT/EqxwOQ6HB3Uh29coEkSyHJFExRRMIMtOwgfYOootJpL+C5OSrY9xrGdQ8pNaZdCSLU9CZARpQRD4O5OiZIiC4s1uZgBfHOASgGWDCLUmSCWw1Ff89ejH/S7k1DVVlo2TKGO2Vd+ycguvma5MLpHs6IUXdPfnEhYUWuR4EeJIr5zJrJ/ccfWCK2FqkreeI7Rbp+DSxgauk2y4ounrJl0pkeCO4Vdok5w0RBHsXpMNOooeQxN2Lu1d3b+mmbm4FdwVBZ2eb3dbT7ehmFV3dTHe3o621Lcx0Q3rsbm1JJMIeT6DbEWjpboEk2Q1JspvjLGVljhadDqgOIWJsAaDA9DEk09ISnlNbW5lrqg+Hc60tiq7mHj6ksNkSDbXeeratMyETYyWkxvIpcsRQl4GOoW66INT/mTgvTJoY/P8bdRb/Hfo0B/5XoRYwlyAdUbB3SRsWe7/QNQXnuV9yLJL+mCtz+O6V0heSauDP78bA/YLb2zT5yfW7/pmuU+4SXYPY54s38K0Szf/2gw9kuYZm8yE7KkLEIc2b+GBVkIx76jxku3mxmYwi5+TL4hcDfksgHgv4Y/F4UHZUssZQPGDwQjUCHmjVOreC82mBPeJw25XRWEj0+0ioyZtzCj/4ux9E/cAfVah8YMD3kY/0xQguEEfuJVIdUARFL67xV1K6AMdBrSOqNOZAcJNwvUDWCB0CKYgE4YfG6yEC6p1EuQ2NjjbBe2zBLzrBNieodrY7Sac9eQo59pG2chKqGS541DtRUjl7z2Clc/JMMYuC47XFESPcQN2GcBSwjgLVFm70xOnMOZtr9EeTo581euWUiRigkDYyI7UBKSZUCd5okorfjmEcAAqX9NC+aN/QutnXTh7dNXvdUF90n/TQF6tD264BCslDn5WcwHRN42D1F6WBT58AD4Gt6+eukFZc14ssqp7rwcEVc9dLt/C2S+Z8+CE5Mrn/wxtevMRGn5p8G8JN7pH2FSJAhMEq8dptFNjjALVOYIMiMR+mzoRBMBxOlbktZeFQmTsUDoedLovT6aINfLgMvquVGq8amAMWr1kdDPGi28Vuc+9x3+2mYvCNJNzgfTfQuT1u0h1kWl0LXKtclMoF7nZ95CJJl8n1dRelpl0hQl8WZpRIa9yk1OaUXUxYLzr1GhEeaLqO6E/o39VTej1h/ioAIHy3/2H/y35qtX+Lf7efWuYHer/XT5Yq6EWCJoQ7TeBi05Um0hRmrTZrm5W6w/qg9ZiVWmBdZd1sfcN62srcYgXAarSSSqs5eQpbwiMTxSJ3sojAX5woYqX0DDJ4sWGN9zDQke45UgJ8ceR8yMtwvzDQCbl9OYK73A+s1Ges1GasBHIvQBBnRqS/bKy/v2G+1FDM3F+/UfrL7I7OFmgrfJ9aJL0EKlo6O2ZL10gMcRa4bj++vVHD86p5a47fLp3hmdljT4HvSgueGpvNUBHpO7I8Vt0DabOD6AZ7RI5vqWoh13gApszO7m5EmR3NTZbm7q7mpq7u7mBBtBQKoheSZnezoQBJEx5Nk2YHIs3OrlCTSPJRd8Rf4Ysoa6rc4qxKX57Eg/+uUHI5VNDu5ylUmOo3eFHfMMpBe+1cEybmJvD3JhBtAk2dCpUIBsSPRFLsIrjm7mliLlyQmNuvbydr2jvayfbziLkXE3Pon4h5v/09O+mHBkh1oNEfzEcDFckzY5Ojp6HS9f9B5egyvGSUjU9E9L2nMy4Ie2yhFkY/h/7H/n8YQPW/lvYzOITqnhKHaLtm8ujOthkcomZgMnhhcU/99PNZx02dcovnmazj8kZp6ILifudneQqU9YqLIU8RiRbwlri0gwL/5fjYQXY5lzpJSlMDdERLqkVs6W+hHUxTS0uqvs5S39JcX9cMxXdNraWmptYJ2UtLPdwpsRcRsZemZr6ulg2EvSF1JukVUyxq9/JEWSCH2760qZy5YNDt1JtjdXvqSKIOvF8HPHXX1H2x7t46WlfnqSPrmpgFtatqSVUtuLv2o1rSVAvIWlPt12shC6ptJvT1LTILuukcC6r5XBZUeLjwcoFaXdhS2F2glhWAvuAtkAUOfmeSmH0++xEgA6I/nwFZ/eZhM2kmMpDQMl3V7nBcTIa7oMCcqlaIc3Eynixi+/lDbD+fHkJ+pVP/N6Y1UuJa8B3dhzA9gXC4xL2m0XeaiV0Acwlkfg8Wh0ag/R34HE5W/S+0lxmMTnHxBRide5YUvpDqQk5cgP8B11eOTTHAY1+RGWBH4sTnqS5vIt74JOKNAuSNgFBJbdQ77GXEEPGx+MW1y8HFc8DuXrCnAqwMgrbgoiC51w8GysAtZtDj6GitbmiuqS6vTiYrcul0rrpa2Ond7yW9HR19DkfI0tC3bRlYNjiwlwUUq6I0xAohE8qEdw2AAY0mzIYGB5fN63EsdIbhK2BYuNA0T5VJptN1TY2NTa3l1a3RaKCV4qllIRX8sw1o3Bc3USiMI1OhFqmhUOdMnhpDJ6AKWpuEV3FqwgRIwjNFbmKCe81ory0iIL89IZsfyAxxJl+Duip6GO5zpxynxnE3xJLtgR1jOCIaCtIhvzGHY6QoZxyFYtA0RVRM5IeWidzusBqdzlqDVosPoFtRVAY+akAKqdWikEelyr8ORW2ymXzWT72T9SWuanGfJVZJ74jdO/ivCL/esebR62YPXbZ7k/ReTSjE1Vk7a+u3J4I/rnKu3JopTyWUUDUL9d29ZsO8rmv2fvulJ4SvCL0Rz6HIXwegmbnfm7j+esBc0l8MgvSD/a3NVs/dqzbdIo2jIatW9ZMFk8nHCXcc7clWKnNXgqXDd1y9fH7U+aMvPPljX0um5bnrcbyGgLC3008Qg8QbYuLGAGjJ1zdV5xP5ZLI8m0pl83ne09nudAY9X2pv715aXISAqiMIG3KSmbqH+WQwGVqk04XYYnFpX6cDZbC7nEH48hur5s2zVPVp0pWpVK04a5aYiPiPAo+oa8krIpEwu3QawuNwU8hOmGpfPQdg1NhyJoDHMYARfJGL2WSHtItbT0AQY0heCMDI71kCA3aTVU3BFfemrC5ViP2bQKURYM+BFCfLZTOUPevLt4nGFzs3NDXWFVb5drjuks5eVGhd0fl4XRh3vUwHt8VDP867EESTMkTnLpq9+r+BacW8taHtZfU+hztYMP+w45QM0Z72TZd09XnHj2vrstUrOpeeRb0x9ewTjWazVx+F4MxBcG5VRWdtQN0yd3UXylqyzbNzTdcTU/PBmRPMcgJKTXHu5tCNIbKmtqN2SS21JgfY4B1BcrlrvYu0KQXlVUqKUkB+a2HDqPIYGJisEFI7neVmwl1P+SoTbn95JuIrJ40Wt1nUOHxmZSXix1mlJldpDGQ1QYeYQHGahDkgOByiy5PzOcAGx1kHSThSDqi2OByzGqqDIk3gWJlSlyNmBVDehUdrzAWCES94yPuM9/de6g4vuMJ7g5ckoAnk9Z3TRBGzP4a1E1fvREmXKG5KAG7U0Xsu2DP64ShWQmSnKtJCIA8flUtUsOtbDi8MTrXMBSwCnwKFc4wzGTTUPCIChRi0GZ2cGrGF7jZmsDKSzzIn2s1Kb/l1299kdFXlSycf/LpH/+sF/VsKPUB1r9gQmuVavJxc+o0y/d9q7AqF2Hk/k2e6/WueHNg1u4mRfjgI5YyV58mO4FYw6/APAFin4qW+x2qC4MktLVEAr3SGN0s99zXf863+pQiWZVIX/Tvq60SG+LOY3xcBbMAWIJdwazhyuXG9kVQao0ZSBQ0TF+HNOL0uVgjxWoNGrxcMOlBG6cSQXi+3fdHlCvoX9KRen8uWI8KtoO10O72YplQ0RACayPnCpiHTC6Z3TBRh4kykykR4h72khvWGzaIZJay5zfYca15kftBMKbeaQbUZUGazmVRRZicK3j0RT+acSSRp8UpDxVCOhyIlEp7gJrhjmSG8I3emhTB0OU4h3ZAoFLK9yNt9YoJ7cxTCC1kWYKQIZCe1/DKGjEEhQsme6yrky5aBlDXKeqLs36Z/p1G2+tUGo7Gs+aLvXXbnjfYdFtLZqNJUJ+8P7dPpy5ovuz5tt5ppZ01qbrKauhzcKNx6V8vlS24SpCFwf+9qMrOMLgBB/9XJL9VZEtT1n14r3Nny+vPmPem4HvWPKc3mJAxQ604Tzz8ViULsL0ch7WqVITeQWpsidUlPklQtjwBKtPXbyCETWKXfrCeX6cECNfiqClzK7mBJA9lHDpGUmsFd12og4ZSJcUfUxyMa4n0i57B6clzA56MtUS1VGaVVXKABalViJJ4jso54A5q/SCqTRaiqvDZFBziFHaW/ZRMEPDOO4gZvZDKu8cTMMGdxCIU50cQbBRvAuQjQ6IIqNEWWogL5Eou0s1PczoQDB3lm6zMvSP8h/eK5x3/9AlCDsu89eUY9MHL61xuXKubZ+vrmSOkle+db56Cdhbcqdq9/8n9GlpKPSr947eTPfwIqQMurj/38lbMEYL7y/OhX38+q+S870CYqvfTwLcfvI3B/nlLvKsIILfEU8V1xwxZqN0Wq2e3sXvYt9r9YRqXdpt2jpU4azhhIhruSu4mjaixLLGQH3KyxUFsdtzjIrBf0RovRy6L3Rh+JMvmKRRWXVFD5ija483TFsQrmogrgTnhiBgEohbDJ72dsvF6R5BmNKQxJ4wkik0Cdl5/qUw2pSFWyOJGBAiczvbjjg8U3x7NZbL5sms7yABYFypvCMgYlHtptilKcxQNKC5qLlBYUT2imnq1rfO3a17evbii8uvnEtZe+ZGqYs/3quvJia/L+QEUTuXw2fE/V6sS+698B/7Fz266dD+x75Jpt1225b/f1XxjacdXAXl3LiuUWvnmF984rb5N5f93Z/2RbIX56iAfFwFYn6HSCsAtYXYB3AosTKJxQ3H9FBa5SAZXT5UQmb61GZXHaNaoaF7rTpTGZ9E67XuvU6oN2p8UODQm7VgPl9E52P0uyrjLKbjG6zSQ8RxTGCpNjUGqPFzPJDHAms6ccryIn4PmuQOwihqozdgAD7C0uZSOjkCQ4pyQpUH5DKdIOpasKLRrbWlPp7OeiDrdZquclOmrIXkbG76gEA2DFxV/7Iv0/lY28L5T85BH6NuRo5Xl9b2bdp7+jhv6O5s6dPU2vhrgUJm4T51ssESdwO90eZ9igsxh0pmsNIG4AdgNgDcCgvUUHdFq3R611az0ptdai1hK3qkFB3acmE2qgVAO1Vk3TCk9Q4bQaTG4Lq9Nq8PdHLvLsuPz9sfXheHX3zO9fhJoIPv3a7oQSe8ex/xNMaxIzvvdUJp7MzWz06mqj3pAz+CxGu/S7mPQsX2PMgMNl/dY3TzqUZkdlId1MdTTaFZzbVjs5j2KWeFRKnm8LZCSW5Oq5mDtXDWkK44SCgnsKggdALDqDQBkE0UBHYGvgrgCtCjgD5J2KhxTPKKg7qYeoZyiqOgi2BMCiAKgOACEAGBqwqxVbFLsVlGI1hUiSokigVN5svMP4oJHabASLjSBsBMZAMIAjc2ajxRzwmY0EAL5wEATNLpct4LNZAhZb0Bew+AJun8Vs1Gh26vdDmRQMU74ym9PtJi1mFakA9FHyu3BxT41NL/AMDNv9z+iFXBHju5XcFIphJONOjRffLo5zb4/PQDf8FqKyFPz/v6MeNbH68tWr4H/qzv8VB5lvgwHpITAw+cfPx0VKxkXmcgyDcuKkeN1uBVpx6igDduNFp46Cc8tM4kUmKRIun91UVhYJ7A6QoUCID4TtKBDi3msHO+0gbgcsVF9IuwXqqbzJErLwKZPFYrIoC6Y+034TFTUBlQmYLCat1sDHFQGP3eUug19QoyDRGj8C1/jtsQsh8WcWeQqFx2egMFbIZ6zw+Qv7byA3+cfS+pI/+NdYTltLi/zWv8B2LKOlNuUzkAcmiQLRTdwlzkkmKZ9PCIfDDpvF4bBFUOorRaWiFks0aqmshBuxIeX1Ohw6i6W3raGmNdpAdURzqmhF2G8TzBTh8LgrfazFYDCz2FxBS4VyAsdQh2ocJYOyAWBLZBxV/Lw9gQeP7MZeA04/xuCol5zkVQp7QRaA1BqAZWzk/GTbzywYzoCpCjCcfCuS1+hmCqUE+o0ofp9XPlMQ2DJpX3nX0ktykfLV/rqIpruxSfqjyW7y2nLgO9algUfGjX6uHMQ/pQ594+8ffuPgwW98+OE3D/2uadEPpEfA/B8saqI2KPKq1k8vX9+5xBPIFG2GOw+ST1T4XVZOy/OtliVSBnwcjwS0LP+e9ItXTpx4BcRA7NWf/vRV6ReA+frJyRsmb3rzfiTDpTZWgny3kmgk5hCviq1resBAD1jctbqLXNy6upVc0rymmbyyAWyvA9tz4MoMlEmU18uHQiUAWW1CBAEoApl2xFJRATcFpLNqkkmPB0Opvx0d+6pb+HpFN5/VRMpDPhuPIFXmrvD+HyCFzMd/DappD8Hnwky2FT4DMpkQpqzOc+liJeOxOs9KnwM2zm1NfgZqDcOXHjly6dAQ2g4f5vMjI1U8XzUykucvCLeI4Al+FmxS1ff33Xvvvu9//wv33vuF7982cv/9G7/0pQ1wK8eu4mfvY95nDuNeJ8+JV6+rBJ2VoKYS7KgAAxUowWyVABYKoA1ugxcHybYg2BwAO9xgqRusc4FOF4AqhEMPHCpgGS4DZZzfXz5MA1oZjWodDUQ6jDNth7QbtDu1B7WHta9r39OqtH6/tyxqsnCchSovj0ejtFLJ0lC1GEd1c+PIJwAterQDkijdFmtgUBpk8XYGZKZ/kF7LoGUPy7TCY8NAphekf0VYOdPWjs5DXsS8P/qY9A93/xy39I/HRkcfA0r3nH43UD42+rurNhxx9/W6j2y4Cu319qE98gHpJz98wtTZaXpyDFSD/NS+9DLQf/frjo4Ox6HvSH+R/jK1L6/t7LPP083ULwk3tBq+L+b60hvSO9OH0/SwPGp6mN/IH+KpPs8Gz07PYQ+9ywUMSDQa1PvVpJIgAceUI0OhQanNlaeiPCvSSrUf+WT93jBvcXCsN0VTjnBUSXFtjjscpJ0D7dxqbgtHsZyNI5UOTisnrWYFrNpCOJDaqRWtRUZ10WjPwn9EYXR88kfIdCj8yDUOjYop42HKfADYcsYpRxivS5aXDadDchH5ClrgqfN5uvmKS592zu13Pr1+8+Z1zyisgYqk36x8+tIrnn/LNaciYFG89ZbSjE6alL8Cr45u2+ju6XZv3Pbii1s2uOwWv99id23Y8iLINXcELJYm6SfSWMFm9vtN9gJRsslU6xUPEBrCR1wKTOLhdfPAxe3gJg3YpwRXK8GWdUC9GCyaD+j5YFE7WNwG6DagagFbksAV3x4ntwcB1IgUrFuv73MPuUm3FspdUdsPV8hsHp61s25/HVmXL24c3jVMDq8Selfl4Wv2wgb/ZbMbygeiazIrV9Y0RTPwIYWqiQYc7achMGjCAzxWh4HQA70+Q/V2hqJzQ+F9AlguXC2Q3QKICUAjACEKkT2LV/aNCQ5awSiy/uvMKShYi+OvZpLj3CTyiL2BmBb3tuwPQ35QiP3oP+JjUDfKov3kDFVnCljyVhFEyXshUyBDMxaFnGSBHWKYh9kQSKEliK1BGaTZzySn+ynWysk8q1pO/kPnycBnMtIztEnxZOfNUqjz2dzN80BgFfij1PJ6PBX3qAV1MLlm1hzas/dZ6bD0za8/Jz0vHX5276Jl37hvdOv8LShlPZCUfrW1MLHlzpGd27p6tuwcAW3b6xu3Sr/KeFG++pZ5W18EDU8pmNU//CFQHHrk4Bze6Q3l07pMsDj0ySefPvfxgQMfP/fpjx46vGLQV37R5uW6tNrF6aR373xbuv5AR1vz4GBzG7DvPvru7cCn5VzqtG755ovKfc9Lj8q2Z9vZ0yzHOjEezSY+Ea/E6Z2LW0Ct2CmSA7PA/Dzk7G1VZD7TliHXJrclySVJsA6h0N4YWB8DN4bAxSGwKrg5SC7U3KQhIfqtV16tJBcxoLnpM/jFaVNahGO01pyqFczpJnM6bW6iskjQPe5vzyL5FkbDGJr45uYUwi2Fw6OiEUbp9Wk+paivr60WwlFkhUApl0kidylCnLfHcRuB5DhyjZaYptEOsQYn7ciIcg5djNkLs9B/A2EQI52SbdV22iiLNIwiVRyPsIRl/1dUIDcMX/bMyS984Y1nLhveuGVULf25MOfe+7dtO3h/b4P0Z/Xolo3MNhnU958H6k+feGHv1+DP3he+v/c2fS4qvfrtkVtvvnnf5UdALprT37YX1drhOhN2n0mgRFQ7Z/gzfQRcTbieAOIQOHr2haeHFph7RDCIDY0qVOQOn8F1C4wBPtMkP0PugXjhE01ATBxJkETCryZEEBCVVXJLjwQqs6uS7e4uaTn9PtQ5K4jbxVzcu92713uPl455aj0kNCdWK8FVDIjQwIfqCfaTB0nSGnAHzYF+xBwIf7m74ihgxArgRjVQSUWDwe/zJ/2UXxMqU+ndPrPNbdXE3XFSGb9HAKCcoqIChRwSUDj+z2AxOZE5nSnIwD5ZnPib7GE7M3ka1Q5M2TxkYJqIrTNjqrPAeWSPMkTp931XSkdK1Nia0bnXpSe/l1ogOKRvP7V38dIHDn7/K7cmjI22EHUfuEn6T5nADJ+uDrTwfNq346sfPPfpsYeODBc7bIOoP4TURaWgPpgkvia6FBq7hjRo+eX8ep4yUgYBGITDAmliDciJ1q3lcg8YwJsGoBZAlEXzt6h7WMDqCFeXOVzWRYS5sD+8MbwrzCjDYeIgtNqjRLovOhQlo8awZj8JSBVfrnB53GV6OYN2rFgYhwvDvQZR3oRSpE9PnoHLUxyBnHITCmajkCAWb8CCRZc84qykoRnPD+DNAjOUOSpVrPfqlcqWwqpZc9sWHMhHSaXgq5eyrdqEiTu0cfOVV4+tG7yM/PlCwdhUX9+18v57tn5RId0zR1dlNvA8RapCvpU/vvaGd45/4cvVTajf7NnT5K3MrYSZ+IuYMBsIhYlTGg0EqTDpgU5p1ANKYdLQWg2tNLIKE6NWqRl0nUAWtwroLQDoNTSNjtSM2sIwaqPCpECHlyiNFqXS2A5Wgy2A+j0ALHOMOclQApPHOx8yzC/U4Lj6F2rymBoI6rya7FCDP6hRmdWf9GCLHiojBNCoaUapNBkVyrtM3zKR/1ACDc3oDUCpMJrUasKKamAgo9lUJJKjyVFc6DIy/UIhVDRygS6VushvhtIPVDEUEYVdEaFC5ki1vRr+N2cp8lb3z+f81PWzJ/qf/5n7p3NOuE98t/8pqrK34/cdczom3ydj8O337XM6wNnJPxJAepDmwXJmN9RfK0W7dRclGnapTKLemDMRkNWiHS2bHMfO0lNIwUm6TsHXOHLGsKFAqR4S9UEIlMbbgeXNldLdoLmysrm5Ei4e2mHslc0KDTpResf0Lz1Pvww6mO8QesL6DCCUtE4FlHAdTv0aIt8b6CNCKNDEJkAVDhqBjqbZ+fg7CzdtEn/ccJJ+ua5/766V8PecvZm2EtuYg4SFyIpurfZdVFb+PtQflWcNwHCYApRJa9ABpQ4zoMHi+BvjRYjd4+PFkVpop5hLHg0cd7aWvsW2ZFArKD1x5bzX+xrKG5jmYEaXrgqzaX7OwVnDGfz3n/tcK5EWnSRpUJz7ZMNhLdCaKAMJlOR5n3qqODJukj/1MxICk8e21+cp4x6loA0m4afGBIaEXDzNhqsQF09k0rhP9uSrjInMYZkripHNGnCxBjygfkpN3qMEe7Dy9goFfkX+kSQJqKCpaMCyiEEi4wCtLFSQpuXXTKFF5jqvkfgFsujZCP4xJUngZyo/TUhHqDeZx+Bn2okQ5Er1RDsxnxgifi3OndPrWbgg1dw0qyG1dCBflU55PR2dzlic1eqMJjbME4BBDXpJHcU6nJ7O3u554jwU/5q3kI8NLFw8GCk3DCYHSTU12BR0i06vFyntfniDty6rpLJVgEkfrDpcRaaqQFVbwWIoNOmMs5ogopwY5U6eGOdOQa0P7b+N9o+hAiWX49fj3NuQQeGr6Nox7NyH+yD59imUtQNFPrx4Er5xJ/C/Uyc/ewojIMSLEDZZzTP2p84jngY+5zx1gXvQPj/znuKyrVuX/XxdTXrr1M6nH6C9dM26n5NfmTr38f9Mndt67uI/pvYmd03tUT+5/fa/doiTX8Vv5A23336p2PHRX/ER9T18NGnGb59M4DeAtwSGb4+0inqSpQktYYPwTUH4dkD4DhJ/ErctGVg22NDUPKujjWpviMYrEnwqGW6ond/Z3ev3Bfxeu7PM5fUzChWlhIjGKv31NbVmm1Wfr40nkmGBSvEms03Ps0oFoyEooGIU/MDyZYN93Z29g4Wm1uaG9lltHVX5mrqOoN9L+QJOly/QkRwEg0Sy+PbJUyfH8cCatxFcTmVqa09mxjPcybFT8OjUMXg9g07gom35FnvtSYjlx07Aq/COt09M/YJT598HL5R+F34Cn0QcFfkaIE9FkosJQbKstrLWLLApIkh5h+chlBXIjKu2I3lXjS27qnxVqCrLIxsPD3GErBgIISs8h2w5BknIrC1blbVS3oLdGavMr1m/MtvePbns7vmzu3vIWw18wYhP5j7Ze9nKrF4+JgejCXj5bkl9UbatZ1bpSeZ69bov7+tsKBg/ugxtB+Ah/ZT8/EXw0fy+zh3o5Me/7Z517sNy1BWXzfglH0tTT46c+7Q1oAg/C35infypkIvx0nbm6wod4STmEJ88ZU5pjTmocJwQ1XCnzK7RGL9LPwd1wShVfLKpqTYsHqWKj8fEGIp7btEYckQMEDEOnuiPDccOxY7ETsTejak4NharDXcX8r6G2R1Urbutjky7khkq7K7qifhCSoiMyp6qsoxbdItKT87d4Qr0zA4FmqLBDT07e8h3eoC/J9Uj9lA9/bXpQFVDKiDGgv1V4D3IHe7r4z4sbpoc/WCUg//kAiG48+HoeCmuKmv5ROF0JjNhz4wWRuEW7peC5COYSch3TUBFCIpkNM04Me2RKhnt2KTDwo4KYVsPiiiUhIcTq8+l5E3NeLUagezZspba7a/64qr9+1d9MRFMBDWhWTuubuCVofJgHDTeETD1dj2wblf75D7AaMojKyaf2Tl79k6yc9ds8soov53shofsk9trIpGa7aF81tBx9dXdukz+oznSwiXi9TU5XBSp/vStTmvGbCRxBi81eH2PnMv76V+p8JawX97/+vU9cl9V1DsA97qYB3pFDcupdDkF5/LnohCMTwT5HI9GODY11VRA8A4/Loiob4oohGK54wIkFrvQLiwWaAXc3Ck8I/xCYAShpsLiUyfVpFqPZkHS5CNirh6CusbbVss64n4bVeH1lavRHC+SSCrBkHKD8qDysPIF5TtKVqnsTc82+IGS8qOOBdCQC/c6MnbRjnDB3mHrSvaCDb3gYO/h3hd63+mld/WC3gX1RAI+kECtfdSiEE6LNeVd6TSSImWReE5MD6dJIs2l/ekD6UPpI+kTaYVyZxqkk0UE8unKsg8gCoxxb6MWL9MYU6o4G5PrzMaKBMaZJN4WJt6YurBpJupgpJmBNSULAaOMeRpjcGomKCHMdJ7muRr2qRgAPsA6NbV+x+pLrlm8eXZzNrGiKVTmjs/qeHQrr0vnbxSXuy3SZtLk6JYGBl1moAzbOsD3hnw68AXS4Z4Nvg13SQXvYJhioSqW3zjn6rV+Z8uaj9+UTrXG5vhDfLn/EjSPcV5ZBPCo0hOc6VenHAZBSFoul4rgJx3eEJAPXH2alIODwAsTBL2A6SFchEC8JK69lb+Pf5SnLuev5SWequE7+CX8L/k/8Mylnh2eTzzUbuedTvIjO8hTbdQiivqIAjeDOwBpVoc4nU5v7SR8QOnzMXoyXKpyNhoJzhIMqjRMQGdQJVXvqSgNpVK5j1IVpUJy0aTR5/YTh4nXUXM7P0EqiSh3DEXqZehlcR4tZAFyYa1c1IwtmlJBM45Hy+bepplFzFWIW2etoQuULNMLSiXLY2Ojr7zy+bXJq7u++c0uad8FapFRT5uboM1iJ4LEveL8kwC8TII37GCt82Hns86XnfTawMOBZwMvB2iLhjfqrfxO9wuoydt7buA2ED5cebxfe1BLapkutdlMGK2esH6XGhjUr6tJDaVWO6ZL7UVtOJ0bJnYRB+AKhbnXRmauTHFUXhfu9LEirjKGmDxxblmKnyktPrcm55USUzdNlRJ/61sPfPvbFy4bpnZ3nTnTNXnfzFphEn57gk5A/AkTOUCIjyhoO11NU6pyoUEg28FiaDxQCaaeIcvJBpIkGa8im4opooZKXyWppSorjbGow4cqhQ0mt6i2+4xK0tE8O8egDU2CtrtJVOOtIz0kqWM8DKlnSIJMgQWbUoBMmVLBFOXVpEA7m3owRdrJLFhAp7LlPJ8PlOf4hgLRR5Bo2iBEqXy5IaAO2j3GQL992P6u/X07bU8WUeL2Gah1DhY3ydnftdgiRq8RlOiNHMQjmwaLialkb2RZn54o1dObcGsoaO7JbZ+RJY3UDhaP7Pls8jZK3f4sHiJzL08nHtycu2XO6pXXl0V6cpPfyy7iLe5Ibxb8+dDgdXM7Tu9tWpjtX1e3qHln7toc9eYbF1+Z2+0uk67c6YdftMa3mVq/y1fOu/lVA7cen8ObJ1+1VO+suraTIKdmbBFxiEZviWUKYAdkiM/ypKrCWQFVeUIAHrbgKM/kCig1bZG9LKcs3FIgbc4GoGpwNvyx4aMGOl1oSNbxZBUEHgn4eFWcZOKgyRGPxmviVJwMVSvreFqTDSQHQgqP19vqUxhMXqN+YQNoKCTIuCqBxzEZIkAZaQ7kVGFvxNi13wYIG2c7YaNsEFtPn5kcxTDACwrXk0DpyH9D0hvVc6MAVhGnLxuxx35kEDeHQP4L+I8oFhlFyfk+7bTIZuRFl+vnrSW3rgFQpTjUVP6bDAHqudxtgzs7q2NpWi14uiS/s7ZXbapy8FrgEnY9sHf5yC1seLm4BKrM81XGhtqOlY1fzu1OZHIH2qxcufTH2daMxcDz5XuolYOumN6/6eRb62984/27FCD9s5E5DtNS6duXh1ujQveXqnYvg2YcD3nHlWwT1NJvxr1+MnvMQOtzc4GQxudWBIKkz80GQjarlQAhI0eyCqU1Y7OJKGPVAcigVnOfnfuwYVJupoTHWKDxFXK7HNwr5wkrp2DktuJK3ClHoeTAUcXE4+tx5xz4RsqzaxIJPGkCTXs7X+XJNILqLHWllJt9zeRz17a1XUvah9d2U0GG/ORvN3fIxQHUINoLXLEC+QF9kCn+kG4kHMRL8hx5h91uAbxZoVRbzKwddVDgCIfDhTpys+c6cr891ZF7Yqoj9+9KIz504IDukI4kdJxup47SzWwqiJq0yV8aD30/1yfQhCZwRdB0H2Vkugk3GunzhN382S7bZnkKnlmez2Vm/2k9zuuej1YkX50lfyh91ZLskPKtVQFbdS/45oZOVyUadrcmFuB5wNWtBmdW5h1AyG/G/WAgb1wHeaOP2CKWOxUhNUJ60mbzGpVKQuPwunxubyBk9bmNgaAGw1/uIwKOkj8XnT6GDfm8JGf0gQyGfYDVBF3W+/znYD9RSyTlySVSEcEecLh9K4HVGXgaGb9IGQkYA3ZcTjKjia4MZnpdRLkjt1q6EYpxaVsgdO3kcztnHzs2eyct0obRsGHyT13S3Ov4aKmQ7HAXuBhpojK8qXrqK5DvPyNa68Nd4Y0CpQq7wvEw5WbFeDLH4nxnlcMRMsFvq3aGCIBEGafS5gCgGT4cYpFnASDM0BMEoy5T475S6rAdDU1FE1/gzgel8Xt2zn7ATtnlEQ2l6Xvn8D4xjQJlMW8oEkIN+iNBNW7Oj1Bg5sKg5t5YNAK5pwYUhudVK8wCSEjmSrkIVD1qpPHSz36G9K7ZUn51mf322ykV755D/p28Z3tBOjrvN1iV4nky7LvsN/Me7zLVcFogIPjzUhv9Ywj/DPHoswQ4++4TWi6XQt5eldaQM5iAkaGRKbZIqcnRetJaYU4m3VwERMpDfl/IHSZFVb+K9KtSql0qSqXUR0mDzedzO8vcbqUio1RnVCrCF8kIXJDIEU6gdAYqbEH4YOCE7308LguXJZ0ZLHJvT7wha7VvTiDeyiGn+ehYcQTJsjHkHR7H9lOJqyYSPBfAWSwhKgsXpjoMmdD5XZgx8phLyIW5K/1jSbPseapeH3L5hKsu2weC3/rqw1e0XS1zD1pkSoj20I+O7tj1p8kljY2g+9o2EVBkN0R6da80OFVzJLMV6YcI/X6//qFH5DiDT2qj3kL90YjXniUyUFrFDaYckwHKgcTaxLYEpdI5dVBFAFbAA8pgTBoMoAkaH+l0xIUraSwQ7+KVvOCNsKyKNDjcXpc6jnEPGrdo+lEsRtC0T4PTLQwEtEWIKjFpwt15bEptztllCvsEV1e/3Hr7gI+CCzyCVvi0nNGLfVW9E3Kfv5KChgXZ+DjUysYShNyVZxzelcnAhS7pGHitcWypVHKBBnCfl5s9hYqlHjBoLCD1luT8aUd4a/kfCt27B+ZN42YJM3H3l5d27Xj4l5WS4+KFO8FX91yyw3HnDEQFZ0p4itq/jKQlCefPS9sVdmY5sQWsEK/Yo7wl9OwItUO5LXRzGbWUWtq4jlrXeFUZo17vKsQK1K9CJzeTILNlywq/P2/3uc2BoM7nNgVCHT53TyA01+fuRUgUCnvLLF5v2cjmzWFWaWFZpVAWojaPsEq6x7xhQ3s06pjX3ql1OHrMW3D5p96Y2+LP+FbnXZ7c6tXFVSJnzK0qhwerVhWLPSl0OpWqy6LTWXQ6m62r6+0hfV4zAIzJrPTC3x9l8nb0ERuYFToiD/J53YoVHfa5umCHwQ4K9g32/fZ37GftzE7763YSNSfZNIoqn+Tm2MjRZMRd/0+MZpLcidHCKEqUKfUTnt6FtJUoZdqjEgxUbwOfstfilodTrQ9LLf8TuP0hCkwWS2o5CCFgCxogN+Wc5s0RYWYVYL5azooSplzM2GVhL71QoGbaQ4FVedN0FPtcKhp6TT2jsAfnLr5Ve+vXKrs1hkAYFxSXNQWd649LD21a1tZRU9tY35bgykMgmPRu8EfqairFjht87nREyWfLW+zC7F1kx7Wzyxy3pO1LNdE2sb9QWVsb9W/0lQfpQIUh0VZozWSWl/ffJG2///ItLqAAgYVAWjEtRA4Csir6svRF3rS49Zq1ay+PZFcJt11Bz61PRer9zq5Czb07zUu9LhZcKTs9eq+T9rEXJUHItawy7vLVR5P189Trbw9elKvcsHTp/anFDoS79rMkM0IdJC4Gb4rLhUW1s2pb84vatG3WzlkdLZ2tqj3lexbtWUKpGTVLu+ky5QrHCvZo6Jmh0dXUHmFP9a7Vz4bpDct2LN2xjOpke5d1rqASy9rd7UFKtcyw2rnMv5r+VfjkMNlsQEhagaaYRzQFIxpnbozYDnmB15sCyYsvnhsIh7HECofdZRa3u2zl8DCSYnZ0bjiMOrqxjCCo70IZCu12NeJAdXWF9r72/e1Ue7toDLjD+SizcpjtXsaIxsXc4r758/viXDxTWZnp6xMzmSaRhYhu9JRxRjXqyCzWqKCoLHMHwnkhqkjZljnQMcOuHO4uLlNo5s7VpFK2Nk29JnzQBpK2121kynbAdhaq3jPHpo1smoAEILeHh1icQKicIArI7T6KPCX4Am5aUVPaYlyfan97sTfpgfQwgDWPEkGgBhiYBs4RQ2KqDyhuIc59kBjlPkyMln7HM8hsaC54RQL+IvS7IKFskgMcI0RxhMH0gssgrCVqkeOS/0QtCOVDQdljg4mkKneujZkHTNWz4BKnyBR9TFEHM8LXV1/1SIXO02l0rZIaVrpNHV59+Xelv/Sn7LlWc3PPrHw8avVWOhZdOVgTjoYr8sNG90VgDN44nK8I8ZG6pVsXOSq9pqCNtedndTebW6psmX5p76xq0LNY6zlxVTCj43lVTXjTCY9+ofQkz9a71+4pu4h17V2nNS1f1lp++apY5o7NwbxaEDRVoSvuyMQvWptsW7bcpBVU9Xtd7ErPzevKGlA4KCHdTj3CXEqIoOtZonD2xBNQrWhAlpwKKhqWqNmWU8KjJ3TmHIn6rdzPmXO1PpArby1fUE7ZayI1ZKQB2ApCIV+g1rq3ucn/cIHF9tV2cq8ZvEXJTSV/D/4OSINIqPvVw2pKSakzyLuYSeQbG4MLuYA/IAb6A3QgkKeHKkFlkkrkKStn22VDuootadtvO2hjbDazk1b1aYGWJYwpo2jcZaSRY8iWETdagcEKjJQ1EKgkooi2QoFwLoqKQfqjYGd0f5SMRuvqPA1Ec6oiw1X6K1OVVCWu/kC1cHgwW6lsGztDXFgCDxZPIS/feBY1x8sWxgvjcmXsBOLTUM8hcAE3joCWYmgjKFaLm43iYIBNLnjDgQCMPtWofWx1Kb0R49D5VZEyx8XVj9Qj11/0nd4OsTh0i7Wx9uSdL10drBlbe31v5441j+5sX1WTumXkXMnjxmvuWbdxXtc1e74Dit9aN9desXYgW97jt9/WF65807Zs48CCGx+Y29ps9S3oGBrZI5c3xpaVqhmPIb7nkG4nfw9t/BqEAySEvQXCvik7N0tSG3O7ciS8YGURGogOiAeLSDATlhV+pS5XgYYvVcSFai8ewWPw9fmGfJTS50vThhjQULFYghXgpafEtMJqs2FlCnUotDmqzLTGAKFKaVkIVHTBCy9AwFqrqwxeaLtovd64IfR6iPRQoS9VVZ3XPdKQI+oSaA53NBkXsYqmhn85EQcmKm5DfE2r9+VYm80mQFZlTY5vSgC57F5WrSbO9Z2EQhUX5UOo42pIWfk6NYacA7i+Kgl1ryyqc0ZpI+hW2XmI7q2ZiQpyTkRxCOpkF8YBOcfnQvWTJfDT5O+XdG2dAfs9W13f/PLifFY6u1JsXdkxVRc51LBlMaqC/NPa/lZtxaUlmM+PC1e4dtbXLUHljzXDHctw+aM7i6sdZXtiOzMH6metxG/Fu9T1NZTYtrXhqsLNhf9H25vASVVd+eP33lfv1V7v1b682velu6q6tq6qXupB091QiLQIKmIDLuCCARo3QA1tRkU0EbK5JEaYGE00mYA7xMzPToIkmQRDJmrMjIkkIUySsX+aBJ0Y7er/vfdV9cLiMr/Pn6WqXm2v3jn3e+6595zzPX/XKG21wW7k6IOlORcxVzFbSjtKz83j8MJxHpw3YKMrTHmHAXtqYgCvL0R3IDinVntBzVnUtV41x82pqXtZke3tDTys1YrGeX6soXlsmfhb5XKmQFytQiGTwXOPyi3iVamKm4M/yOpGO2BHh82vC9pJt7AH+4V3iDNFDDz1obD3hKWea/bjxf5TSu4Q4aTe0nZVkx5adpIcJItHZsoYaXlIxOTHmksP2R+ecnimCuBaFp07xaSzZweXXLAz84PBgYs29G+b2L8tHOjfhuZv618VrZQLPk9HwhSf23vBl3pinjldtrYYbFt1z4p/ftj2qTsaW/dsuKEODZddtg421smuSCx6y3QopnE7VPP5TKU0ut43EApcHev0e5bCGyYHhD/9X+c9jMzpzPwS+ySD8Aqp7d0U3Ljg63PfVTIVbgG3PMWAIAj5g/6QguvdUtlRYVxzIMwMDi6YN2cO6a9gJB7DnLCStSiVbK2mjScJPC/fo96nRkPq1eqNagaoBbWf9PYIWOYp57R1swFLVajmSqVcLhggXoLZoumm7gDXpu2OtqW6V3Sv676x+922EzU1q5w3p63WrcRzBlxVmCygQkzn0tEluC7sbDUicra2ZvCDv0k2ujXjhKPOXc49zjGnAjgFJ3Kepo82dhuw6SW5MCnZj5ad6Kbj0Jzynxj0ssK47DQMD4/n8nhUnOQoOKb6rMUS3mAs6Ep4A/WQM+G11EnzPXNsqs/aJhoBkN2E6EnrqFMCMx7YDObM9ARmOgLML4kjMLomnde5GE3cO9goTUVk/m1NRLCrdvb5jcFie+76822BpC3drbdminMNA/OsXcvIbP+dfz0fvV23lEkJwcxITMJ4w1Po6fO93aJ95VIdv9seSwsXW2+8wdmP6Do3AgC7GGN8PlwofVuqb5aQrW9QQo5BWOrfUt1Rvaf63Px3FVy5fX47npZdUkrqkuZLP2rnJJXVUZDai6w0H86v28lSjCzIjIGQg4A9FPCJnkCwv6/vBRZZ2L65LIpIWPeRiDuoVOpMHHsRi1B/HzuXdcNYOB9UQd3cucGHdTq3aT6xBfNhN7EF3d35chu1Cfk8VHncyGhSRZRSKFGgGVcdUVZSGwosXovPxSNjbg9agW5EdyEV6ifn1PuKo0VULNoD+qDDZ4f2BxfMshfDmdTYRGpMNhunNxp0y53SCdNZnxr8Ftt8y4ocIq9VUjTXjdqSBI3DGUPGDzImM0tqz2hPFje+2vX0QGWpQhVbMsugXNC+1KT9IIuyY9W7Fy9ojMPrFUrxzBYFrmm8YNCc3qq4vsjQMUL7KWC7shC5pSFGShYLGxd9fQBV0AKEQAAE/QF/UMHN3dKzo4dx9UMfjMMyZGjXglvTX2b+xBxN/y3NplOlBKc2t/mx8pe1SdhbbGtL+FniKRr0+CmWVZkXLlw0v79//+Q/JD2Bfn+YgRaGgX34Tc+2pwt9fZoYaeIn1fao9qnQkGq1aqOKASpB5VcxKpXfzAxY4gVG0hkL85n+rMT6zb1Cb6laLZUCfg6azJo2lgwdlgydS9qHGMhI2LtkJGq0pJLahNf6+Oa57I+ziMtqpWg2Ja2Q1kk3Sv+a/VfpT30aKcvcCHdA1OdXGwuQZDdAZj4exVq+DFeVJ8uoHNU6tdSqacOOllVztKyaY9qqOeCoY5djj2PMoQAOwYEcp9qyVGqExCIIa30mNSIP1Nb2QNOypVqdop9Y6IUn27bUbOM2bduipE9IEFs1f6uTpJbsYMq2je5aUgCkUs3hP7wJbmq2ysNws5E67LEn8D2YYQpBigx6Kx7yH8UUFvPW0gfbw8ZfLzl3qT1yJnMY8i/1i2e0iHd/fgd0es5sELV/3pcYPINRnGkTGemb0T54R/W+KpobCQFlVolUSqWoD9hCUhiYBTMeclrGbNaL3d3lfJksI8p5j0v0Y3uI5msNosrkg3qVE94PH4XMXRBCDVtnL2S3sopuFrLBvujAeQPXDzwyoLhsAA70be+7t++HfczaPtgHlNKgdL7EqCWnhKR2lVQcwoZMAkMAgXoQeASP38OoPNpAIKIKmiwu/JNMmbETY2QpO/bOGOG7PTR8iHKz4EE0PGzME0aA4eEc4UgfI4xRY7VjufHcS4ebO4UtAilCz9PyWOl6hagVnWTG6JZ105R5SA+Dj+QbYVs25+H/k5oyZAcPyqbs4MEP8452XHkMst5ZZgz9oZ5pGbJMvTF5ZudINmPNGMIv2bvBAHSQPd2j0h3BeCFqi4ScTsHXG4tISmWHUJE88UKlUuxQ+rz+eQEwYDB6JShoersWdq3oQku74PNdP8P3KahIzUshbVcqf+s8COYJ85DAzqsBFePHVkELRbgQroAK0mAPXcFsZn6E7RgDrISnDOEhqQJ5Ie/PMwKTB/MpdYQZr2UM9VBUFbZKDqHu9MesVrpMMVoLAmF6hVay+iS5J8cOytknY8fp7HOotR6Ro8PDU5HlYTmAOTyyyZiXieNIiPPt8drhSqa1QbxI5nyRA/gUw6cBMNZ3dIodnKj7Q92Zxl9vumK2M3PXnUihL1gzBmhM//73H+jQPPWDWc4Ms2xJl6WXsIe/tWTi12fyZiAoAcDNxbjtA3+U7o/2woFueEfxviLq8YckGbuMUunSd3bm03kC1XzaHHK6RZ/PhfowViEG6wdgtTc657w51895ZI7isjlwTu/23nt7f9jLrO2FB3phL1B2nd+F1F3OLqTqimdVbm3ArwrqAxlTzbTKtMGkMJmAMwv6HTlnBi8lD1E7fYwwqjSDzASjs0F6LJcn2jo2fnj8ZJASpRFsjpwenE02/Y+6ZuHmnoTLyz5dnWcLahj/hy9bTgNMBYi23wITH7ZkoaiEQAeA4k66ZlEeAHmMya0Yk7U4wWJOqBIs4tlbyik9o7ZIwOvjBptwrHUv6F7ejc7rhs91/6Qb1bpX4YM2yLUNtCFtd1vh9n6I+k39SFD0SydjUsdjHwUZqIeygWFMHAFmQCZw8VEUxlRhob7YCldh0FmBl+xs7CowBbDAsx++8STwQi8pATl0SN7mGcGKpEg82MQdTeo4BYUnwXB83HW45pqNxA+CoKyyUCedRT/CkkJx56kYXLLI1u73WNqjaPM5lqQKfRwUoptYbVv83L9Hda527blnXlRAEGpsZXezZ4F+8GcpiCSnp4Di2KvaOLhn8Mjg0UFF7+CDbqk0hB+iXp+in8QkLzY7Cv0shAqY6y/1+MRSIKjxiYpA0OUTLYFgm08MB4IZn1gMhPQk9hMSfWIoEEq3h7Q6nSIcCpVKRWQxmxWqnt5gRtLA1zXQr8lqNmr2aI5ojmo4zX7kl1zC4OrBsUHGPwgH2/RBcci12oVcDw5c/JojtUg4sal70US3MLLpBNZU94TclE1uDiT34G72+INC9wTpxyZ0p4Q3CAxTkLC8hFAg1Ey/+WAuRcqm2ErRsVKlNXP1uiC7OzjY2H5Z9tyoc+LO6XIgvcaX6sii/o6OdFStQNfjV7JoXjazTKOgL+UaW+HtkQ7/VviVxqWt6iBm3RUBl9ERiThtXdZFjZvgrVeQV9q6bIvf/+Ll5KUZfaAkOCgJCxk4NHf13NG59zOKqo+TiGY2Yc1ISgjJ5k4hlYzoCAEZ6ZhdyOfD4RBXqbZVacO8Km2YVw1rjcTl1dpok1iD3sAtE7TbtCijrWlXa5mN2l3a17XMTu1u7T7tz7QKrTZhcBtoY2ID/QJDWGw1gMQPTlC3GT94o9nnSYSj4i5xjzgmKoAoiNtERjzNdsCsjk/y4VSzJ2P37I7qmkrCW6gH2xLePEkfNYYStNEjiezXQ9gv5siz2iDp9FgPGhJe6wHGAEKtfo+nDIYRVm5cIrMsBz7QEw4UZ2dvyu9VuCKKNUMP1uTsTFXQO6fRj7GLlCHPXPjcJywa+GnEBcRB+lh+/XPdWZKM+fvfL+DzVlPT4V2kzVuN0WhJXP397y/U5Wwm+rjhou9p5otwX8Y4nQu2SoOVkORw+OEoF+oqx3xSR1qck0FOm5KJ+rxGAxMQBb9qjhDosgX5gKQ8okRK5bw+mAPzsr5AxRmMZgKBjVEYzYy8Q1xQkko93prkTozJGbDH7LkayR48lsu94fopftE13kwZwbayCYApzHwMDHFfjhs3Fe88T0bJxHc/CnqYvMK/Lyi895erZIycGTtV2xR25LWw4k2Mlx7wjNSfj0g2W5uPh1DFYMlFurvSKW93G+cR9IzfK/E+TRfPk+JxnoekrqhesIT1daCEu5T7lGNK7I3UemlCigXU0oCSUtfz9nBYSvnq4TCZjgzY+cuGj4YRKchD4cwpycdTch45PjF2jLwsjDXnmKa0hXHXT5u70KfIe4oN/KOOU8Wb7bYl4fOHmsPyw4YougI98BmPfuLW5rj8CGNUzmNRTuBx2Q1epnksUpteKMQNMGHaYkLFan91WZWxdpqlSqVDJOkqiGxMrlYzGkatQjTFZSlNcYkjvtTuy2fFYKgDhfw2ps0XdTuZhCjGpxJaSBNkJAb8QRufh3k5raVTIgEl0kZRCILeaCAUbMvGA220McxxUuVLo47vYOEPCxPHhluJLq0hPi5XiVZIVZGDhAVGqOwP0zQM4p5/YLpLqTn4T1MSIFNbTJwu8QV7bge2hQITd1EXrr9/G3vztv4z577Izlo8cotC+97brVXUjI2hL0zlwaQbA5wWj/e54PABMGfyLWkVbyqo9dAwlfrS20x9kTpdJNOlUvIGIp1cXHQwKa/kSmoUCuBzERBMuqCr7gub+AqsYEE7672LTZA3PW9Cgslv2kg6B8/rowkxHtrthRSCIFWiHgxnSsk6yAiZ0cyujCIjJxodI3lGw7IuhkfGTjSV0QzOgRYCsDJqh2ml9qxMmA9Mg5m2P2dEBMmK4bSnyYppQkJ+3NqzYN5Y5dOfKT0GYwLdNHFr8+ikLPp3aaoMXvMvnPwtG2fXgQQoggPSdTdkoD0Ab/ff40df8sIdXhizwNuN8B4BJvTQoYfdSmjXQ3UBFpKQ8iIEt9qh2g6vi0BlBEYUdiYkiuZkMJQAgA/BUKe5W5OO+3x83MA48Kfs1jgHmgpIRGJxhBQc4U/IZ7BFwSvNPMmOHyb1LpQv4RCtdacEobTv2jB+AS9Jh8l+aCvkSf5E5Gr2FhmelfbiC+RIGL3YZNsxCkri2MIWg4tgL7HxJc+uOffiLY1X7t/2yNPQ+ciGrXC4rzxSzfUte+KJc+e+FWv71JrGu1r3pZd5dHfsvPeZSOQP/wqDkP/58QW79zX+feI220XfvOdxaH3s5Zcfbfy5sewb5tvgb98fPvHOpSca//zoF4h8ByaPMTcxe0EMdIA/Satu8MK1XtjvhSUv3OyGV7ph3Q0rbni9Da6xwaU2OGiFJStczl/Jox1q+EcTzMZHBOgXsgKCAga0IKSvcMKKc4EThTgn48PSjvtiAEg+6MubySCv6toiHo8xIijvy34jixZkr8xuyTLVLMw67REV+OcYHI3tiqFzYhfHRmKMFIOxWAijU8GptFOKIDKVVTF8sjIOt5RxmL7NWDlZF7I+ZvML5K3+Jr8AVhBGBo1L4iM5jxm/VGJuSriKZ5U7Sl0/2rj62s1PToL2OTtEx+eO/yGTPddoHO6/n7PMW3XBmhUVS9Jme+D2Hxz6zOcrjYsfuP7r3C1QCw81qteuW1/jzoW1R3qebax97/KVrbr+L7I8Ht9F0HiWLs88chQ5rzcX4pJgLrgsSUvdcpVlq4VNxqtx9FgcTsahMnV+CnGZ8zJIMzsyrNHwJDLsCIsRUvHviImkMTNSRTvbu3mHz4HUjCPaKRXJOTpVlkIRdM6MVAezeAYJfsm7j4g9zCTiXgYIRegv7inuKzLFnR27O1DHfibzhIlw6OQnRg4Nj+QoT8Cw8MZUkBcKL+ZodPjFDE3WE15Z2WINmA4aUxrOYZoOQMmuuVNiweFpCpjpNmEzaQZKnSy/9o6z7pmOBDdeHt5w/iwGAd8MpoH7Nl5wOex9emkmNJUAsCzVUbl+mk2gkZ/mG1jUs1PW0UDji0wdY6QA3j0AVFhwbVg5NyS3J9EDljcs71sY3uKzZCzMfOs3rOgbVqixQtUBB15cO6GVS5MYu08nFJal16RfTjNfTMMLrf9mRbLajBLHAXuBaCONtVEApXiEVAMxX8LWyre3DbbZfaVV9g12ZJ+pJlAoEGUHDcYCKGwsIFAQCv7C0cJbBVZVyHYozNqdARiIR0QloAwF+fGDtGSPbIfLGmoyFmBbNUKV1cyalBUDRprEBZTJc4RurZ2qnpZ2WlwuJ3MblDqZeuTqwuK103H6O5Y3SQtmMxtcvLizAC966pJMtLihqZdFXnHtrb+hzAWXzeQ36MtspjrpbWxV7MO+kh88KK3jBZW+wEsGT0HtdroRAxiBQWaOz2L5GHQmUUkKXjhHyCd5V0E4Co9CBEd9yJAjVFFIF1AGjQG73etPkZohUs2yDShUIOhLecQhLxz17vKOeY94Favo/sfwyPgfaBXFH/BwPjbxzjB2gVyv4amYkgOTvWVCP9kUH1kfT/mdXdA4Y7Hc2q5S7KOdG58XI0PtZBG8Inte2PaQ3OJRca7CsDQ88t6JT3qTjWV4qVvwb1LoaCNHsoc0iZhN2EcJgm2SM6DyBgog65f8yB/gHJEAx+vNXpOGdl006uvKMG/ymTLY26jb7X7qfYcFLL4hsJFWPI2BI0BFWnuQp1bTQ6UKhH0H4BvAn6EQHiE5P8eGJ94hHS9zGZLh/Othun06y7m2G0PYd5yxJ0d3b5hNsget0MTcl0aUjX3XrRVtU/syjKPlMFu79Gqm8etGBEW8n2jtvcj9zc0AsI+yZ5k4vUDHAGrUmUl8/Wnwc+mCMQ/0eILt7eFQKMsqLGwoyCqCoRBdiIfCNrvFZrOzIXswrOBE2wLblbYtNsbm5jmrj293c4fs0B502wYUMKxIh2x6lq7J2TBPUmTootxGMKohq3KbzZ3OugkZBQkVHZxIHSIs/xVaNkOCDPIC+3HeUMOLbL3g5Q2gzSt6J8bGCPH/cuEE2fuk6a+Es2IW7z9stj7CMqXchqesDmeySDZp4OT8+ckud1tsEmhVrnBHYmLCf71Z0XjXI8bmwu9s4X/1qslqyCkt8EJmvT28euL+xr9v8tgEWyJxrmktFNFtdXcCRqOqEt82cQQFck6rxcBARNYkTZmDMjz0FNsJTVVid7bXilJ1pXelb6iqaPPc6NmS3pK5y7Mjgyd8pwKBqpW1Zv3VoSrLMhzLZa1AEWbjmXA2Ugp0+svZ6kBZql7AXhi5IHtOeah6DXMNe032mtzG6ihzK3trdjQ3Wh6t7s49BB4q76keDL8cPlr136bYzm7PMk5NSMm7fW7kdps8tIlEVccXVKoyJ4qeSJkFYtlBQ/LRdEyMdmZLYqeWBucjXjwjtqW9eIxk0pZMJs1yHImGJjJZfJT1pj2VLFvlsmwm7WWjpnJnZzQaQSajyuMISpz2W/4MLaHUF/2ZbEbKDGU2Uq9cmdmP7nuysu5OR8opnBhOuSa6XQ66hSZvuxAtQ2OzgG27otmsXdFq1o6NLhDG8dI1RW9nPqad7E3NXdJWmQlJoAMj2J/ZBFN9F11wADAkimzT18pxk7bWSW68eMA+oauw8h3+1X98XFcBZPuObtsMQ5k100paM85m6QkUA0WZHDLU6n5CqUpb9JCPupYsC89pHIA3NW51R5e0TYwRS9W4FR9/ukcI160RNM+bDaV6oAg13WWxBH/FxpZH105M+Ba8cbMvGSHW640FOlQeNkXDmkjE4mgLr2wshF9dme5y6SKzMF0Cv5dWFa0haJoJ7ELeUggFC/mTgV0gwM7PBLYWGX3aGcDOw3AeA1uNChTZhbDWOBvauia0S+myxZ0ZE14Zo5HgMYzvsYOnBbiWAlyt82oNmY8LcCAHnhLQOhvhM7RwGpRbm6pjJhvnzUL6BfAbp0O7bBPgY9+fRvv3Fwiz4P5z5J+Ce5TahhDVA9/Yyn4b476HaTsAuiZffTKUKHSR5j9x0VOIdsEtwo+7kN6mDik7q9VLu27wbK7cj1QoSza9sZksmESa4MBXUoKlItSkmFRjagRCn/eFCpuFrd6Nsa2J6ytf8t7vf4R/1POo91H/I4lHU49Un/M9538u+FzoO7lnyj/iX3C84P5Rfqz2svFl97uat2oeU4b3G4PucCyezKR6+Kwx6+7ylMLZ2GBFb1L5Qc1fy9aO1NhDCXht4qbUbbEdKUVfbLl2uYdR+5w+W2etttDeF+ZMliQMJ9d4HvY8nFTICpWCPY5a7xbj9UkkeJIVRdDRw1odol1hVxU6IkExlAshsps68cILLzTvaH4Mxbd4APRMHpEuMDsKPfJ+/lDP6h7U05NPulPVhMed4r0C7zWWK9WEsazgWVFhd+MvDyciYjhfLoh5m9Eq2kJecp5Uh5hLeHk+WE1YqtVEqmw0ElvV7U5Z3O5U0iNUFPSm6s3ncuFwCNltNoXqijIsp0AV8lV/NVu9qLq6urG6rzpWPVp9q6qp7kf/kPh57nPdl7kZdw5493iRdz/6wTO9tXsCxHyl3hk+MTwxPHJseMb+PzVftNQitd1ws5xdTh40rdZHuSXsS1DAQ761XbycUgj2XfAEdreGl8tFGiN9FzyT8GY6M1VmeDl+TVJf6bkstiG1uqbAxym4KQWIvZP4teErcyjqwBbPJ+grXcS3NusqPoe2ksT/ffNtlVDWRp4fe8ZW8cZtlR48DJ+wVUz47hltxSqYyItvSVpTJaEyVbx+UyVHLCVfCct3eBH1Kr5zy3cx+a4T3z3OV2DqpD9Ajovgq0ilhgHtvUsdPLkZD0EtA2d0llSfDtfNvt9q6IV29ts0CtJuC5v1ajZ3vHGs9qmGLxf95GYoNd5e3rViC7rmruyRv/TkbAvgb6uhi29p/A2Gbth8AQ2DQFblMpntdt1Z8KLGF86JzGcjEVYo3ge/ALd/Kkea1LHzw/MbP4Ydi6IdJhWMRBg+8XDjG42zH7+EJZgXsT/5V2x7K+gT0tb+ONyu2+7cmdyZuqttZ/o/9P/heCXxSkETjUcS4eSm+HWJ43au0pXmLyyVdRVnrb2WznYt0C10Lm5fnJa6ztOeVxrqui6yLbGtfVt6W35b4X7mi5Hd7bvTjzJfLx5gntOJfDuf9rX70ol4opDpUgpdF4rLYkNdLTTGs+2BLdjj9lWUxust0GLWOYtxhc+c5nwchJwZ5iqVqtncVTXKtWDjIJPJZ2o1mcBm+MiRMfm2IytK+3iS7xQiN7pisVTI5/VOpyueSCYdxXgsEinpnC6nw6XN7Mxn0jBdTKZS+SQ+wc2lIQ5yGe0G9TY1Uu9UQ3VJC8zQbK46iDeNTH/leb1jyAd9N7v8xVAooi1FImGX1uJyaZN5vT7rSFocjqTLqSvGkgWHXlvSei26YpxJOiMufBH40iwZM75Qr9eXSaf9fh9nNpk4UjHX//SGPMyntfuh4Ul/CZYoP4FQlEr7SkdLb5UU5IkneVOh9BwqAQeIwMufcKX1+6HqSeCAjufQ90AVdKFFTwYO76DgHj8xLkykhlMj4yfIimUK4sJEd3fzJp8hpsxorwA6d50MeugwVW7OON4QjtFNdfmW3AzjxeSxYeHEG+QJ4aY38JFSJXQburcbhO6bDx4kdwdVB5X4ToWfhc3sKbyqxJ4M9memIkfFQgYqZ7Zindp7JNMkaZlTLIRkwPDQjAHD/FUOGS2Xbv/8vAsbL0dc0QvHvt3rKi6Ee+shozBn4fz5sJQLZc6/+djSgQESLwpXbCsPHlxh7FGEw6zFcwOYfP9CR0ckknfkHK4rrrjMmcO4cPiv/Xpj/+asgs6FpcZWrgvPhVnwqrRa68BrTS1Za2odeHm5XAt/pX1Xi/ymkJNJ+UBalDJONyBZbkcdbzkY3gFVjGPUiTSRkMogSsGkgjH69CpdMk14vfg0NDHpQDKoAJqcpAooFETPca2+oMi5Um5RDAYNgYwRbjD+zIiMzpRdJJlzR/B3K3ZiNePV6PgfXiExkFfwovSQ3LrMNX5ImDhOU/hp3H3RMTshVBjP1Fy/pk0Vx4QjLrJXL9C27SPEM4SUbof0OwmhhEzQ01qfmltrO1s+kJvK5eS6tvX7ArcQe/X+Fdv6Nc3UiXPVIdu67A28bw0cvs5oGBhFdTZGOHR23xaK0RUsPmhmSjR+uScsvPfKpX6TcC1zXbPeGa9pFQ9jG1QEXz0AHJN/lzqS7YX5Zvis8EMBtSW8SbPNaBZ1ETMHfRGuqPRyKkVHLQHfTEwmUKIeDnfIlc5txfqqDri6Y2MH6ui0kafsfivMWvdZkdUd5up+Lcxq92mR1ohfe5p2pDFlSKP0Tccm8A3huRx5ZwxD5jjJUaHVvOPyihdLb5xsp4+MpFi5MndGogJe6Nqn5NUFWzvosyKdiofpoJ1YudJl1q2PeN3tUXRpvN2UjF2tCSx56UJBr/etonw0vOMyGuKkWQhR7zV///u1If/EmqUhMz8MJ9ZbMjLJTOJad7sCwMl/YJ/NgMdpLzgo3Sb4rY6CIYtvEOEDukO4T0B/5KGGT/JVvs4rtAy2GRYOv2gvZBWBhDpYhrl8b2BneXcZbSjD18swW5bKqCwB90b3Lvcet8IdCASdgQ2mbVhWiYc1mmxMiqGYTqfo9JuZpM+dzTNOscOFymqfAvZiD0dF9wlIGXQzRkTCESO0k9rwcSxZSju1iYp57MTY1K7JSjmcPTWXFo1NOugeONMT9sAWucRU7a51OqfAzhrI4Fx7r5d/f/eFi1Y6zay+lFyC6g/ZdRzfmRm452mFvpRaguZ/WTRwhmJiCZ1EGcl/Lbx6JJhYWPna8YvsvVYBz5MLY2u+uz66PORdAu8btvVYjaSRUl9ow/vfusBVs/AM5dZEzK/wuO0FT2Ov128SC4LDZC2sQJAm7kZ1upjBoKAi8na4OCwer0LDZ33ZTJZRZeuKhDZcztOha5d668+XYY1k1YKyUB4rMzxTlmgfn4BKVwBu+JYbuuv+ME+CSavNcI8Zr9PHzEfNjMqcWYklenyYDNtW083hEWITSHT64DFSqzPepGQiypAZmLC02daeDVmDUHE3hR06Wdinjd0zvworG/vOH9RmjPznH/p6QI+UIXcn3IsHMauJhXs+cQlSRd29dFQzqqi3u9GgBKXeS48uXOid8/WFhoJFoKN5pGLChrv74JCu06hvkigtNJZMBplH8h8A0DHeD34nLTE6dAKWMx7jJodVLJiEaLyg1inxxJVNtLW5E1otMGQfVkpKQaMvKJXZhIRthMHgBr0dQWunu9opesWyG9W4Toj6RaBq0xI3O5vWaDqAZ6Nnj4fxBIIivlBPYG8QjgbHgijI9VcDvbUgB8uBjtc5mMX+wQHkB4N49T9yhATojrwzJrw0TGhgBRojHSN9kyYIyxpp/ThGHozR1T1BwgwqrOZ/ulMgs2Klmv3KjbQ71YdhwE5S608PhIn9GAWbVy7tzZ8OCIJx6eUbTsJCEwclsfEGtslnQAOER2Cj25I7Ayjo3OkFgOKiD/ZKbqMfG/NsFPJG6OKSSXdCr4dCWzqhNQhpghK9Wp0QBDcsubmkXk/qeTVksa4nuet6oprVKZ1OFezsq/dQbpOecIYvQfzPV8qUaqU3S5MltlSnYRR4u8pP+t6rRPLGxSqI/wkqqLICL/5RUPD6vVnvUe9bXtZbD9K89WBYrFv3T/7tKXJgbWWukweShewS7LTCIZKOKuA55IhVQZJSSSXj8YkUxtowUTmG0bHhY/hgbCL1jtzcczzVSkxobhpATU2UtH3ICzXlolf0SiTvWN43MDYBKY+B1pBodtZqjgWKTqU1VDwzRO00x/wMKG1kBnRpI983uDSdPBml/tzSwb6TYNoCadD89Xu50wDVgCb+R584LVjlfPIK2UMAT9K84yetzkKeVMpqeRK/+KO0CoOWfzgtpVVWTyGd5mv6xXqkz2Yjjk5O8HQ6epDNKUKHqt3bGYmFxQiKOAOeoGCPBtr3CnBUGBOQwMNtcC9kYIDrCXQGJYJIidvDMRxX65UTRCgQ8UxDknMm3jkjGI1TaJTRl2imMsmCbJIHzKhomYE0IuEm3WFLCWxl4pmv2bUYYO3z73ma1WF0Tez/ktvAGorR89D8ecEuC5mXzl7pNLGGUvvZkbPCl393A0aVZ0njiotsvTKc5oXWM0uXuySzgcFHKj7pv7bxhZFgfGHpG8cvdBLMkX1xPcbY39i7TZzeR2PmmsnfcgfYdaANe1H/cgDosaQvjiQKFofKWFCykNVb9RH9Gv11+tv0nCuWjCFbCqqyF2SvyDJqvzPrRE5vpBgyMYyhI55gdFpl3KDWkt4ayMDodMDEFLsjkikSkVSkrkls7wadkkiKTbWGghi0Zg7LhIC/oTXCrSa54y3myDwJSeVoq7OxiSOvHB6mqQlyIBBalIEWZ6QdkXYBTMgvx5iarTKtli5oavaTa4XKuQPMew8Il2z55RO3XLPe90Lj8403fvBd69mN/27vWHjtRXxW3XZkHvfc8zAO49/71+PrR//95W2fQI9Zov/9wPcX9d9vaTz0/e9C43i93L1ulZC/FsZ/cOjFHzeOH33y50ce/70sz2OKCPMKkSeE0sU6QccXLolviqMlcXL37/Hfxf8a50aDMKX7sg59hoN6zsO1c5/hxrkJjlMrNNGolEwXohHJwxc3FLcVdxb3FlkVUywmO6ySYCrwVuhirMaOiBRQgjZSZfKkwUKqTY5IJrxIONJ2tA21JTsU2uLvojC6n2mTfB4Nr1qlQlqVSt/2U8C3+9oz7XvbFTzTfiLSSfopjklq7H8IeLHq0mONjLRUQph+5drtfH58OIfRcIhEYJuVuy8dph23aTRQrooYJ+k8shEigcCR1HR3ms7T6KbFihHgqBqb/RQ5pSJiv+zqXd/ZuFajnqkXvWdg8zNfvXh4YjscGv7qd5Y8wQrFm1fXyhp49hcu3/CF28fmdP+6pZirz/qnqy7/2mM37vxPaL4gvPmseZcR3TR+Q8d6BpTBAWnzlfkteeTIwdvTMNoO70vCHUmYSsJyAl5p3mJGSn1Mj6IstLPQIAjxbDfQflIHN+igTodojUkHIYAiMTA8fVWZcnfcsT4CF0dWkWiUlY9DVTzk9pfjIZ3WyjDKQryNUcZ5g5HEwg+P10giyMEXcxMvvXY4D4mEXyRNNgQ89PMkF4GUyQ/L6SKHZ7dFmD3uWbmA7mMN/cdvuXa9b3/j2cv/upcO/XR2IW1QQYf+/yGNlL73XTL0XxqlQ//PX5GH/nO2xnuQNe59DprGz+rskgGQ+t4Lh3/c+AMBwBO/k2VMxz+R8U4ptT0FN6vhcvWVaqTgOO3dWbghuy2LsifiGQCycSm+MT4aV8Tj1XKCDNW4VvBo/VqbTa8FmYRocZT9ET1JsfEnmESivRAJK9s7WIVSOy3D4YMTB39zOC+8mIOZPOHDEF5rSTFP8m1IWkdThLDZuzP68QekddlFo5d/bfV5ZEROi4uOyIdWzx6RF/eSEXnbZVebGv8D1dbPferbeFy25EXG5dqHp8dl3xpsk/PYcGymsUo5dmkCQOng/m6Kondo74e/wk3w68Ap6SHYcLniEgmuk1TFdbRdBGn7UCSfseP5c4Q9xxRlbPJnAOEX1z4DweoLFOdK5F2gyX/FWtmLwGLwzgFgwdY+hA2UY2F5IVLFIJ6CojzSMTzrY5HAYV9KSiarWQcxLuuxcXEErLWSr9pdEauSUsmczZAKEebsKpLcQ27kd2fdo27GLQbiVj5V9GXTHWJWNaA/T4/KeujSw3l6PGnmRE/O7TYWwTmRIG+cNCLjOV0gDVXpgJQKFivZwJHiW0VUbDJlkQRCksImHGpyZdG4ysjIbMqsqdoPF+k8ip+nhBLNioFW0125bVAKzqrukJOpmqw8zVxDPAroOjzwkSrcWet0wcfi9Yfv/sYDt700M/dw/aLLr1h+T+PvH1TprnirWfXxi2Vb7m6833j8sc+28hHh+s/BzF9uWPtRyt2buYjMfzC7wXzwywOgPHlUCgfjhVfmQ24QqvR6D3aZKhrs8Zog4hUkFbG/PSJIApkCOrGCgSAIfoExMIIQddZIZUmt1tUZjUe8Uc7u8kpOkqno7Y+rdYWr+2G231ip02REL0lGrMeBA6oc9TZj2Btx1oeI8yx4d3kZb5OVa+zEtDaxFqfSEJvd7oWXpgs96MxCG8kerB0+3PRrZQWelJWYgh+3pryl+FmMXd/8SBXl3qBgTn7/pi2tHMWHt372IxSUL17h8nvu3A6afF7sIPZz0+Ab0uXyvjDvh1YOW05RreJDWNailLIHfVEkSnjFKoo+n4VDeuH6SAAEhECWkruMBrhAAJ9KDVWMOqAPtqEclCDZu4FxEJDaoL8t2ya1Ma+3wbasI0P3TmZyLx9rJjsPHyeAArT3nEynih0wsn2F1ZFptdqKzCbjDmDAoMA0bXc+54TT6LDY2MEvUrrty7f1Ny4KL25M9qRyhYgv3h5+oX+bom9bf39kBqu2Qtu4tbH14cYXPcFqpOQNoKege4pYm5Jpy7krP6c8c9+T3Fj9kYIQSRDWOCw0r6TW8CI0MERQtLu001PwXWk3ZqVoPRgkz7Rh3+ZoEA4FNwZHg7uCCn9QCg4FmW1BGAwWnbzap66pGSzHuiGcRmRXRaSyDBdgAtR3p59Po3SRkCr4nYzKiWdqLM3TyXITYasmm6rHXeMgMz6VQEVcJdIRKUdYNFKRk3iqA8ZmC7MWnbWxFemZQU/98xsoF/XFiz21xs8482C1PloPeWOW8zS2q5h8k4E60mKcVhnvRzc1Pvlk6b5i6qolnihc+m93OrtVs0imgVyDNMB+BY/FQfCkpNM6RSfSAQ3kWQOx95eSIi971iRNpx4b7XEt3xvyeCI9Ese0+Ur9gMmLAwXkTfkioagYUQk5ozlnMilT/YGaGASBDcptSrRK+boS+UltoXJBKRTo9QZT+WhgKAVTmWFaCPGOzClPkvNPYkSc3gocl039FCHiSpKcQBdTpzHfTvgxKiPYr9AaoVPN9ocXF7ExWih0Q+Pxb35ulsGGP/vQMgnZVtO6ogp4XvrUcn4Hj27Tf1GPGMCt5jZyjIrTGpR8JmIyiclOwMS85TjndHslUaNWs/5OQpDId052os56VgiDOs9mWLSY3cBOsngC383uZZ9nFaN4CdeVpCn79Yw57I+JdcEPs/4hPwJ+wT/q3+Xf4x/zc9v80E/S1TZNz7p0v5UWTMw21M3twPEpu7wKe1Z0sE4bZudHL5ZwfcKiaRRkO/whpTzM+pK4emJjw0ls7wPwKx9WJdGqs3sQj/EF4G7pfJQLGY3OjsJcxu9LVrqZmFiNY/vbx/h8dg1gXKLaqZq2pKBbXQnk+WB3YEPftj60qu/1PuTvy/ahvoVJeyBnCvrirgCJ550yjEllz+Epvsnpsp6pwYxt6wxD8P9WEJdnH5QN7pqPWxE3ZYc/flGcXPcwiRQirXt4XmrHfoTgjBfLTMRbws4CEafXKSG1U1NUq2l9jxrasZFNG8I91MoubFnZMqhneuDqno09oz1Mz7zZXgTwwnNb228Kybvai4hT4cduxR7vPu8Rr1K1jWZarqSc4NNexivDm945NKPZwDEa45K314ibON5UiNxXYLZV/l+VpClEuWHAnI9ckhaZ0SLgY1WlgVnxmx9J2hnxGzLhbfmwGA6Ta0Zx/ncxHHBqDAcoelkRfNQYDg3hjJ8cwwlQ7rb/hxjO2sb2weDHiuF8838XwpkVw3l2ZgxnaTOGE6AxHDAVw1GwvV4wI4ajZQgEPDSUI+X/fwji0Azjl8aFM0dxsLiVTU6K/10U5/zGPmX4Y0RxYOhjR3EgCDa2cn/F47wEk08kEwmysf8do2AxJuJGIZ5IBE1mi8lkVpv/ZEYVciOabzTfZWZWmNfhB0zUDBeboUKAnABvF94R0AphnXCjwCwWYEWAZiHBmDqCvraomIwjC59jAj4nNlxu0WhSiyqkNiaMC4zMn4xwv/FVI1poXGe8y8hsNz1rQueZ4HwTjCdMRoU52XTDhWBuevJIYecnB7M5KTeUY3JluWjOjH/+s4GoG3vwMCDPGsepP3mKQ0lb1o3QTTSAdTc2ozR0PNesHxrZNN3Nbmbe4GnmFhiCp84uWKFq2EzepPF87q/yRHJxx/kh28TbgYkTYmQo24iT1E1L8E44Ct+Ax+Bo5vywzR0Zmpo9Cv5NzJ3v3aW47v3rW5mbzPXLE/Mi7/2ngh69fyd+vjlf/B5jphNK0n18CoIE5AUS4FGlksmswFuEZELgE8lk2GiyGI0mHe/mr+Y/zSvCJviOCd5jgg+YXjMhrQlqTaJpneku03+bWDVj4pOMMd4e86YSHFWfV8TzjmAUNbzgEzIC859GCIyC0W+UjEPG1cY9xn3GI8ajRo2JTSSNgoI30flJXU/x4RydmjytqUlqB/VVuQ05BHJElYyOyVUo/bRbpp/OEoeKOFJ+6kjt8x/xK1X+jDwRHZ/CI4HjtH5fOEYcKnuF7pKS+WhsxoyUa71CGEmGT1UtWEkb6Z68jGgq+DRTFlHxjFnq9zNmqe+GGs9gaHp6Gl+dWvbOhX7ohcUmaGdOUSg2gVBj4lcUmrPWuxMr0MOzYDs5CXoAQDyNM4ToMV5ysPvInpbu7839qR/Je1oIxP28IKGwpCqGZ+9pLZgcZ3aQPS09djiMHP/XO8iOFgIDvWJYar5H/t5vtb5XfwncAa8BxacZhBgUPYC/L4FnmSYxE8gk8KlSosRvTOxK/CzB7ErAhJCbn0oNjywvzjhnpXVO/SXXAhCXnAzaODg6uGuQ2Tc4NnhkkBn0Lp2fwmeYd4A5n54Bf0OxODk5+UcAuGN0L+8yIH/fMdbB7MPH19LjJACKp6gc3m/KYQDLIf4U9HfD7ucmx/AcWpz8haTtLkTaJFjGQilPCSU1XKTfcdbkMeZcKhe3LJdvAiBIGjQUhSDqNVikZg/Z1ORv2S1ENuCfZsgm9iyDKpJKXajgL5Z4BmVLQ6UjJYYvZV0u+tEiOV0RzDgXlgc8a0oeHvIpUAqrgMSgPP6J+f1YCuQzcOpz8h7mt1p7mPpLkITP7X0WwS3k3FvwufFjcP3G9pJEP0U+PrWPWWntY+LfvB5/YQCvQiF/OQSXXxzLSghehU961fRJN8m6w9fL/As95//InwWP0OtFsJecs5dcrwHBxV1wZxcEXUWolWS9zbhex+Qx9F/0/Hb5egv0evFP7U4CLT41Fl2xctL1Et5ffO4f4HkqAN6RzlZbK1ak1Ss9SmRATI5BvMIJAQw6nBaHA8/hwOEgezukxm6nY7djr+NNBycX3DkcPh5ANwNC5m425JX8OXlXI4/tjU+ndThET8FhFyD+NvJPBWFArduhu1/HqLU6Xq12hiTeB0XGFxgFJKnaHIgVFMAClgLmBIBfwj80gGiLb7kn209lopza4VxupdyRdmTT4RcIq2s+Q/cy/uA6LPxmXHixxZ40IjO2bMcvkQ6q2B7Ja/GVw2rScYvWfPmZWcy8MNBMDmN+0Lj021eM3Lbte43fPkj4d3ctqF2/5lvw6sa738qLyqjIxNj4xNvOi9c9+oPN10DBtmLjuose2LdsQQm+tKa4Fi4j+gk0BphB5gsmDt5G9UXixl/lLsM6l/H/LXg3FIFLMuDppj2BoZAmqk9PGxb8GcJP4FK8jnXskD8DXpy8R95f78gG8aDowDrumGqrXJw+z7emznMJPo88nnvICXqa41lK+9WzxjM9Fx1PjuaYfBGPl5BkQTDTU+tBoKczSIaVhE8pzR7RoNk7mt1Mzqvnmufdjs+L8cCgNyMwYr1wfopBs66xKEMYf7YfY/cAW8afjTbP/Sh+NiiZsTWLjWJXHiwjn5Yt76xTM/J52XWABw48pu+VSqQBMooZOg2I80MOQYUIDWon5FyQIZu/KshzjpDLpbDEdYw3rlALzu5mp6y4Wl+gHZ+SYEEIhGDNH5JCyOHqJpSEiFf5VEi1IHjZpY7U2bTN4AuLRrBTdLxFKzzxAmkuTcKQ400u4GF5GiQRHYE2i5crpf12m7IVsWEDJjlExm7e/3zjtcarzz3x2vNQA13fffq4ZvnIsdc2Llcya97/knL71U+9MbICfbvx6ou//MVPYBvs++njL/3k7X988btjX/pLvfHTR+/44R7Sj53KktkLjEAEYfDeARCYfEtaqOMLe4jR7dMPl14JHg++E2SUfrsfdfph3AHVFqcFGVgBnsev5ZFaBzXchdxVHMMABgqcGPL5DKEIq7VFDEqTd//k32kSiZcQIpK0Eu8UM/P7tPIEkBYsBp4++C/6Dipdv14oLAZQAnAX2AeO4J/6hk9UU0YYNXmT+B0mB9ST70sC+RI1LV15Sw3VfRHhnRFK/JI7Nkw5YJoOCn5iSuBTGzxk852G3UdI3N0Am0HdXkjpFppSt1vZQkyOTTIHqj0vbvvZ1su7pZ9ec+ST675n6ll04+1dQYgAarB6afGnXof/uW3zLdsevutfbt5yyw0Pbv/UXatvvPucrfqtlsg913129thnDs0e+wrmTTzjevHYVzAFMvYLZx77zA9nj30FszE9mkZpwzLy6U489jtnjX38rq7J3yom6Hn1zc9O4POGML6nTiZpEVzVge1F6jRzpojPnaCYb5fnkE4Ack8gOS9bxJZ8dWm0tKu0p3S0xOJp1OnE+D9pGh2mX4a/y4VlsIPYNzxqZPu2Fds3r2SEo0kIkglgkGCS/KrklImjc78O28kTxMbps00b9xi2cR5JgKMlCEpFYJZgCZ+zNGXmhovT5/vW1PkugTfha088Sye+ps8g4Dm0BIfwRWAvIEt+wYxZtHVu6kNlm/L7GRZMQVIjePL82XLM5nbjH4QdM83O7l3dqFsdID7Z8pkyULJTv+lx+By8F1SeQeTKi+TCsXApXbkzky+8SeQylBxN7k7uTR5NckPJtuZPTJ3yG9dP/cbHAfZTQEJyYiNOBCSUaiXmwlIZ/yw0S1DF5sViX4/mF1JZKZuySjT9jXlEVvOa/gY/CAH5V/TryM/YNGus0Jw3OlZiTVmRuK3scdBP0C8rzpvtcVDecdrHygXqUvsKwzoDqhgWGJDK4DDEDcwdCLogcDuMFr1OGbQANuQQXcioFXWCCtR+OjFWG5/4KcxMkHbOZK8yL6cYtFpTWWhhLsmonSJXmepKFQh9MjjYuGMNIVBpdqR6723SSaSVsS2HJymX5CSi/ah8ICc5fdj18JhsBj0XtgE24hF9nEkn6gXNGX5PsxWUvKiZUSV8UhcoyiJCSoTPnm61Q5pANclCaHHwzN46zbmc+wXVm7bpm8boXK5ghojehshcrmDAuXMMlVlzOUYzm6O6SjX1faGsK/zmxT1hpaRgzsK6OutkXYUaA1RXHeBCKbODgdhu5DOJcNxjdQV4jVoZTMU18VBKCfHfMPdwRuxAYV50hFQ+Ew9qh2svEvmMGyuVTEYYmxiDmbGJw2Ov/ZpkPfzmUEt9U23FrM22YkKr/bnVwlktJLB0ukZj+Ssat8LtjS2B8M2/Xbgqnx4y5W6a+PsnBw4dIh2iphuObYsmFJ9vPLWsnum/SNehbYf6dRHF2aO0/djo2U19Y0wRfXeC86S2TggqxbZoymd3h4z4IsPplCYVSdOLjHLZotjJRY2iK6IJWD7yRbZKx2f0BzvdVZ62Y1g0cWOrZdjUhTauvUKc2Ttsiy9Amoct0uORc/LForB3/e+WPLHA3GwlRuseB9hdNGfxz9KKzvxgHm1J7kiiC5JXJNHm2B3YwWJhJpOzO3jeUcgpI6VYwhEpuRIOxu2MJxwJLp9Tsjkl4845Eo6gMmdR5lRKpqur5PO5i9FIKSIqmJKbcZNNr7ZIyRKJlMAqBp7NQKbWlghGSl25DAMSbWJ3Grl9kaDoVzksRqWWJ9kxh3O1idxYrjZGbslfmHnxlRdJG94XtwvEdxcMBw8K2/FNqw+S8EpuO3mB3956hZTjyS/il5tZSFCuQLM1WTKbAR/i66s/Qv0au6tZiTay+qf3VpKdQ4Ebw/lFdzf2fnD5GhuTy88mfvuZz9zzH1YxtyQzLz/4Evyfj1S7RuvV8Ni8E4/NbnBEuk4wqlRGknRkTXW3Z7yp7q62VHfKn/EGjeayNWg0BYJGI34mHDRagkEj6O4uOxzWXM6XzngzlkrZGrbCVAZa8VG2bLWUrcUVZVjujQSDordczORS8WBEzMc4r2jFdldj1HdrFGSQ50+nlHyGaOVFKno4PDwlfChrhXS3khUma6SpmKlXO7LsjIbITVUwZ6qMOrkuysbcObx6hiJeOk1p1CXThVF/WXf+PWuuaMq//nNYPn1x1JdmlkY99GWKFWw792KszAF/kuLZbEoQ9OVYr76UiPXaUg6v2pZKOuy2lK2zrNNrvWp9KaUv0TTuc2wpi82WypdKc3rD4RhC6p7ueKw3pnF7vDG1Vx3sjVl6e2NdXb19Aa/X5nKZbRV3yNndbS7lU9lY2BsQO0Kod45eUCObWYRGPAFOiX/6kZx8T9VhJBr5aS4zBRP2oIGqhNxPgYXoTX4HT5Ak62wGYjKkYrt42tpOGAtgm3Tm+k5ox0bcTGMaeye+M+w+pb5T0YjBR146fY0nA59sfPLNi8MXYJMVPX2JJ1eHnR9U5KmoNx74bHQFR3GD/ZP/IjFqaJb++YsFmEvnIZ/35VE+X9Lp1IlEOGoKlsyWSNQUzXao1BmlOuNk1eQoo7Zk1G0rMw9mUCZTQoj1FUPBUpBzOFkW34edrMXpZCuBEix1uZ1Oky0gp8wjq5U3ddgjlj2FfYUjBWakAFcX4DkFKDPXMIWCLpoI+pzuTJvoTXKlioln8eoKr0c1Z1IttVwt/Q4Pf4+q+LWWJZwBuabumnDkt89W/jTqyJdgg5g4tRCxBgPF/JkRF7CGZPbn/2oMzaxE/G7jd+NbTkXcVhh669tzraX5J5ci/mPJ3tOg7aEl/1hlLSoAAvMAUFyL8ebE3s7nDoDg5KvS2Xi1+ovg74N/CzKf8N/sR+/64O0heAd3H4d2KO5XIM0CjwdYddjpEAUUjjtFmw+o+IDWFbSZQGCDbZK0KZNsQ7ajNoUtFtjPtEvCKLuHHSP5Bhl2A8uo2AxeJpJ6ODkSewzUjo2TnsHHmnFWbN82gWFaoSAnEHWWuqBxZvaQPWKUs1Ut2JQprp34/su3PPDZG655ryQnzvVva9yUbt+zeuNz2zvOueRHW5/2++DVM/OFFG1oQDV30X2375X963mTxxQs3YcWab47PuauxnJpxyNaPABKWC4uLJdrSv9U+nyJ0Rc8BWRguvIQeKBFgfZP/vFJtV5u1fUVq6twayfUGO40PGZgVHqHPq5n7tDfp0dqrVOb0DI7tPdr0QLNcg1Sa3ZoUCIq1mLw+dibMcTHfLFabHFsQ2xbbG/s9ZgqZlzQ0aFym31Om2hHvrhCXY6/yv2RQ5xKxaVJ4YItYN6Yhtn0nvRY+mj6rTSbTgMd6djMxOqBsJSoAyBZHIXdAJLdl67iAbzW1FFis5FmEtJ0ktfI2LGJ46QwMT88XptWB+0wl5M5ssnfTTK5Fo3H0pZb06xnJ+tJaOYpKfFxFCsLzlAa+/N5S36yY8s9X52tubHnOsUF8LUFYueEr6VBmPn6wuXnFE9V5K8b70L27bWiHtskqBfXNmZoVdZhnL0bZEAvlKRnbF3RLnRZJ3xGOCQgtQBVWi1UI2RCT6Dvo39HrE7BCVax0N+1rAuRmzVdL3cpfhn8ryC61wfvNX/djPrNy8xrzIxGt1V3p+4xneJ+LRTd8zygnrswh6633G5BOUsxYlKm4qIvkUlsSOxNvJlg+QQ5WJxYhZ/YjZ96HT+pUSUCEYVWnYVZVU+bRuuOWVTZsLTaN+pDwLfat9HHGBmfDxgqJHG/ew5eUDM5KbnKsMGADOQLkYpJ1ENhKUUVbC+sAhtIv/SdYDfYCxRAEg5NZZlRBWeGx5vpOSRo5Fo0kTtynAR8CfEg2a8dp+26h0dqb0+nkct8XSvlLZ2moqMzCO5y9uJUn26iahoXbqmaNTZ3e2TmLvYzWNu7l4Uztzz26LpLbrjlB1sW+wSHK6WHxvYZKq/q13ZkL+hfIZ199wqq9YKtZ/vOT+398Ze/sejRXzn1Qmjje19rvPvrOdM6fwC+ek+Xe/EVP7r/+s/Je+xrsd6vZNdhrecOgDYMTYOxECc1QryRQPTVJzFCKVTXY8yqOSeX4JhYuDOMfhmB92RgtdNbK8Pny2+WEV/2lWvlxeUN5W3lveXXyypVOZk0LJNIa+usXtIr1IxeH1R4SS82r9cezLigS7QHmSxGalJvUXdL7VGgh1r8LovbQnYeKoFwwULSoVdb4E7LbguyWITo6iiKRoGb74SqznouXK3vnioZ0DJAcjtzLslFBoJGX3A1G9ROjMkxw+MkNEzhO7OhHn5FeMlFiwDJJt3hl+QuetNZs4Qh3Zlx0J388SaZ6nCrh95UkP/D+uV54MkIZ1/Eej6yfs0HNsybVjjV8dqV/xz52plb5d3V1vjHLJQTHS+dPMY+xOwFRchJ3QU0D72EjqETiH2FPc6+wzJaTuRSHKP+ue+3PsSEfVDht/jRnui+6FiUIU2AkY51Eq05SQc9p80U0pB0jE5eu1i7SstotR5FjfDV27iOtNeXyWQ2ZPZm3sywfIYcLM6swk/sxk+9jp/UZEzksw6PMhZXaEOBVRqo0Vh9PFzFQ/5zARVBrjkSAVY+7UsjVbqeCHfUQSfpq/60JZO1QRsGJ54MpzQ5/tL4yCZSsiArjxhgDE/a3pY2QqTN7+SQCrHJlFBvGE559x/Q446sfGejVIXV9aNLzz1Dk7uTFHXRopufOU1/u/2/mInHJgYbWxXrab3YmwdADGMQYy+KMfekQyyECFvK2fgJTtAaCjuN8Hm5MbPfx6gBSXKORNTLJJXKw8gqcpo8pHmAzeRh2kSJwQ4or9qgel71M9XrKpY0K+KttLWrD2OLJ9g6igXP+3gkMDwfiMNcW10RjEu0RaUZQyietltyNetiKxKsfuxGEvkenupJ+M64cDBHreQMMFVAhjYhPAlIMopamaZNAIVQwPiRsIO9GMX64GDjT5+57skzg2XgRlJEDq9+6Nz+MyJk7e3zFbLcl1L+vr0gAd57mhOMlkKACDviDRSuQJvRHYj5ufu3bowIN1R4LB4E3IIbQ8FG5Ewoq56ymXm/kgxnJ69arFql2q3ai2WsUrkYnqRTmMwcT171upQw4WU0fi+v9CmRTqk08bqf6ZCH0X3OGyI1588k6opwSApRoeuFAh/yhdDOEAQhqGFCKQtpH2nMmCQTsWs6oWDKTHeHJHZt07Q6XprRJBIDIkO5QU/qBdmEA0HDsFx5TpvqnBEJrawlZlNY2Xjvvk+ddvjL1MONv1xyDXfqqP+RXU6RhsA0eUxZw75iEfzfA0AnzzczXEI83zgKkMw3n8UPrCiCnkaMyKbYLpb5hna/Fr3qhKqQL+AVw6LPhzrSYi0Dn8eGBRFrU8PWZkNmG7U1KhWTicUlhd5CwsIWi8OhV1/vDQCX4PLjGWLINera5TriUrlcnUYuGAiAiBQZijACvRuN7IrgpZ2RJ0U0TRtkzDTNjsx6Pt7M9Z9K9KdzCMUCniRqpNORIHvnNBFPniv8JIv6g1L9T54iuK9hm9O45fRJ/ydZHLiGOfABif8n+38yBnR4bpjAa9Ey+BPGQMsvH8IP7kGPoGcQwwAD1HM+UiFQ6PD6cpnchtze3Js5ls+Rg8U5ksuzGz/1On5So8ppIh0hvzfAJbHstbwVGhir1Unze+Y7PQXnlcZQPR4maNmJ8aJQqYA2668Lbii597j3ucfcCre7auY7YEe9LVyoZ0ANvAkmgYLM8lXS+QrR9DzhFZJHfbzpix8ngbXhieMnlwgQN63psc2iBG2Z/w+rFDjFT7sca+PH5w2cvmBAVscv57Vm6qXfRJozlQxc2/jHLxaerIsQxsa9GBt18BPS4/bVJ83U9/qjdAtWh5NNsAfYH7OKZ+AhiAb6xHmJkEolxFMVxu4LZPOMV+zwoW48qxqMotrmE1QkMxJlA0kumA8MVbH4CC3ZUHXXFCmZWsCHo/hQUa0CG98HVX313vBA/Xn8W84KGEg2q80rBIborHtiKh172otq5rIDyrqKLc10hurEkaajNHPgf+xc7JlooNWW7xM0jJ4+H7s9dlI+9inwgPM+rIJAzsd+ZYYPpaPKIXl2x7iFGCeD4NvS+qfQQYQ4ZENIRxxixIAytHF9kndOLKLRmIOZHOPzZv1cBWvDaPGaNbl6Z1glZSgbfQZm6nE87h285JOQVO8K99XJenNBEBihyliPacMOn7lOmvORTn0Kx8yyPSp9KnxaQ0CdW7o2aUp/WvQt9uBpH/XjJWCfLHt2X3Psf2ge9ske69JvjnyUTOxridSd01KHNFb9GK0t/s4BoJx8VSpp+UIpBG2haGht6PqQwu6L+S733eBT3O+CCRHeL0K6VfCuBt6teVCDWK6IlZSzEyLuhc6cg22PBY+Ao3i1u5EdZRHbEegmVfUZHaMD7WItDZ9Pv5lGvnQtvTi9Ib0tvTf9elqZ1lpEC1JZvuS0eeICE4mr1dTRHDv4BlkpEmMPM3R/5tDwxCE8/749TheFI61ybZlNnmAA0JSKKSbt5prPSLi0/VPaYB9znu2xvPDlPzd+0nj6ez+AbVv2VkxtbCQUKi7d8tTbN69bs/EQvJ3TtfvPRXr0eCG8vvHWp9fDq+AALB15aY71vMbSPedc9/xDjXcb//3sT+ChRa6yXZBjKyR+fx/lmv/KAcDiNZ5GKPiJuXfq+YJW/WX1N9WMVg9VfBA6WBNxc0zEIYqbRAuIePmoL5qJMtEorwR2uMsOM3Zot1s4McIrAxGl1kKcdEmwJYSIP5KNMJFQGCgSngNMDmgz48JvDk0cGhZeG5cTIYiHLvenGKbEBOWpEiRiMYg9mMqHKNEd+E4Sr8QCavHEl7ComPvygkah2f/d76xbte3WQ+nPWazWaFQ3d+Cqxht56aZva9jz4Hw46jNXd3/2gR1jL9z9+bS58fur5i1ofPJbW+49djXhu+rF899ObHNj4DixuUdbfoh0t8VROAShBYXRF9DX0FOIdbFJtsr+G6s4oP2xFj1r/qEZ3eN4xPGMg8HDL+QXawH4fODNwP9H3XsHtnFd+cJzZ9BB9I5BxwwAogODQpAAAfYCiiIpkmJV78VqVrVlSVZz745bEtuJHXvXLbYTx4njxLG9m+SFVLLebJxsZKU6u/scbZzdbF6yFqF37wxAgBRl+9vvryfYIho1c+5pv1PuubjdmXcud+5yHnO+4PyFU+g0QSugF7rlBdlqFTiu+qUKVx2X4wqH3YGLHL0k5e7F6hUBFTmgBFHlcSWuNLgGBAATHBfgdYRAHqgjYfTMDhRQmRJK2YAMl0X2lBHf+yiu3TP3Y3YoNgdPaqdh1+SjKrPeK+Z48XixxciD9yfW1s4PwlZwU7IXG9VNxHPsOOzSm8PUnkuNV0SfZYzBOwdtZwB7trBBjeZk83CA4tBhGInCOBQdFP0zAfE7dCCvzU5H6F30C/QfaL6CRi/Q7v9d9KPwrV/ANyUiWocaj3EpoVKbxbRaYKUh0KDQMDeq1055e7GQDgmi7A0t0JIUJnpDhIuU6Pg0uwqoInsu/mR67ifTXAiJtmcimIDGiqEG8QpU4EBbFSZUp2gbqqu1ABnwGNY6dtUM1PZx87YXW8ORv8Ul3FDtv6CB2xcWA4HLl7GRy78i3uVvVwuwU+z6tUK9VUG99WFrC8azNjBh3Ga8xUiIJA6HxaD3YZhW77e8BvVMgrlh/KwTqHUCkdOhd+g9JlouxHw+Dy7B8rPxCJPnqsGzmTwDUOyMasCVQxsyyG7RlcB4frQ8p3s4dMlsdkrHYzOSaUL1lbduWrMbqD/YMnowuzqj0qv9VONLXes7CmtLl7euvPeJu5/L99z4vUznI7tyDKlUln6FXZ7qWt2QaKz77tj+Y+y+3U52324MW14I77eCDVYwYgVtVpCwgrMwLJUYXBiP8boi5gOBCEaa3FG8nraJNTIBKvzNov8uovrDxXMzGeWFc3Mz6OAPrqDKYukalM3ZjI/ZaMvvOtZRuqEp0R5xG2zKhpAtp5UuhbrZaXofvVmK6CwJd1wmjHoHg3fzVy+Nu5HslzrZfbYJrKVAnYUiKTNTGD9VT8etUSzkCOGhOEZaaEYQ8LqleqV4IWXTC0jjdgTO5y4WEXYVJEv8A4Sm/dOvLyLtSgRLXAOB6dz49w/dWUPancRLS0BYNo77UOSBvNuMfVQoFotDYrF6eAj3jPr8as+oFkaGmzT1frUfrBjCsSFcv2lI7Ve78CEtjg/5/R6Hw7N69ajdrh/xekY9m3X6TfABRuFfqDzZBP8Fj2d07dpNm3CBAPfAx9aeTORA+6Z160ZXrx7q6SP9EfeaXryQTYjVYrENfktvs3mcpMgOwzF0QAkDpRpVedFKMmh/B3oP/geFZeacGqlAuQxcrkiCaeV8xUpVrUipKp8vqN9XvhCLslNjywMNmgFc8TBAZUmUyLXhldIkKtyHCWQ0EH/C+LzooU215XADRkmoZNlMoEi8HA2ilsvXgDs3bs2Oz30jY9WRYh5p/F3ptyGxuM4W96DKZS6T6ULF/VBxYE3hxPr1z9ONXm2CttWHqNGGtNt1jKf0pRyy6I/+qDAoRDatrhf8KjseCAzjfyj1T+4xRmFwCKRiWmMwiEJuVNRs0mi1SlKLDBJPZQqFJlALQOsooyudmvvOs89onUEjEvG77oLvW07Tbhgm43KdWe7pREVPjcVkVhkooQinacLr8Wzj7P+H/M9DHRjB/qtw1majABAmUpQ07klROh+dTFEpg9Ck84mFJmncKBJSQpOQSlHaFNWaAqlUPByOB4M+hULq1et8OkYi9Unj0qjOB729T6X6AUo9miwWUxw+VnY0RbHBvu42qS8YpOx2+H48QtpCklQTjenUaqlCMSLESSUmwPJVoVCijOHF8os4KzQgMnNxpkZOppnIog6PhVIyfbby4Xw3QVVKNBBBozoOV7b01HQKcLLDJl64gqe+2mDAioxWKCeQTs9LDLef7PP4b/wOrWJdsdvlAakYFR09+tsVNJUpDQTNGlQBDYVK/+Sy0pNvPG8Nhhr867RiX7qNPl7vdNl9mpBWZ9BPE/fRFkOd1/DwlvVmnRXVOl170dBVs5GgKK3MaJx6++0ppdGLUxRPZzmEXb7kT9pgQPuzyWBLQLeNCls9xb7X/9cjbqcIImoXhgnQnuA+bBr7Q8G7dQxMjIHrhm4dwvf3ne7DzxbBwcTZBC4SqTs6eprGm25uIjJNTUjbHUVMWyxiPepxNX4AA8PYBgxXo39Rq9Zq4f8pVBQtjHR2bi6CYhEZhBH48K52mJa5vKGQy4tlukxag2/ZwIBresIXLnZ1NYXayY4wDk0D/LrdRYocIqzK4Tzze5bzaKJNhjUX0CeCyLl4RDkXn1Et5LryIlOxENPTZ43s1iEwXeEsV/tZygoAFr9eGfKi8DZugz5UIEwjbQ/jblb9hQD19zfj7Dsw+uWZQC47sUDzS/+SON6z4bjFsywx9xoz4tGS3mUM+GP+xMEty4I4/h2k4SZfVA9+FV/e3e69NJ4atDauaqO8xe1t5hYfYSpRV2r8k3a7pbT/uD1I0w2OfcSOY44gLXdlVuzpVdkV7ygtZovKbFOitgZXsrO+NCaRRAe2ZFr2jsbEEgwC5r+Wevl3QWyyDFsHdAXNkWkwNg2OrARjK8GZFeCsBEyglP5nZFqtwuU66Qcb/fv9eKd/1I87/QD3A5EP+H0+ykpqrVbyNAnCCmBWAFIhU0RNpNZkInW6iClvwvkmYDJZHQ7rWhlAFaUCxME8hRXIrDJrx4YmhgDLqQ4My2IdoCPXSGblIzQTkfpJGaH3ua0O0iUxaRR6UivoXz0uKmLLcJwQCdnzrN6bZQ0AsgbsXyoDBEcodQTd7wwrE/GKVLBHJXOdClXHUSMW7J9yL8vFinQQNKNrJpg4dAgfq/5I0dkTlStBOhIHTmrYY3345U/mhUQowIHZQ3V1F73de1ck6nqWNAZD6vaNJwd7U/UxaZ3F0ldymNQep1kkFYncNr0XJMSydMNQx3TGaMys6oiFaSKz9yfZYcbQsOq6to1XswyHem5cm9EpQqV/myJJuQK6CplebVpPrFtpNhrlx0p/u9vVGAy2bDnZ0nbH/qKR3V+NX/53DBMOQhtRxKawdwotG0dBerRrdOUosWkIHOq6qQs/3HxzM37KATY69jtwgVjU3tba5rDZRW12e5uI8K2KRiKudFKbTifj8WRyGBmGZDatBi7flM/p9PUt97VMjfvSkfpgUGQX2dVGQbugHcOfVKsd2JMtOPwtF2l8MspZg4tlOBzhIDHHYYQcoEVQIu6zg6/gtyIXyzjhKDpoGRgyxkgkopyF+EI5q5yNz5eAgQrNZ0ZgGep/mEA9vza8CSAuMgRkJ1R3FbIKHi8o9yyFoQFoxhk2BoO/wEd8luMIOzDxFMPbA/B9voSApoVyodgSbPaXSnxdqP5by/dP9Lh9+y+pY8EGp0xpkynrzaVk6TPXdLavBcbRoyt8ozc/M0xcVHh1ZnUgUfDO/Sneby1s7wvkt9+xXGzR8PG5f3WHry354nk5DO4lpRZLKkCS+Y3F0rM0ofO3x8HnAPwzd4auCwbOgtOa1omd+dWnV3hK7271W+wQrUjE9cVthYE93U4AeUtcvnz5N/xd0A5EsQLk7x8KiVPd4EA3uLkdHGgCpxvBwUZwswbcrAb7+WC8Z2sPvqkRbOCBER7o5IE0D9S3FAGOxpX5dQWdyWym7E6t3e6USKUnMLAG2w0dwp9anLoWXYt7mcUisAO7vQFZlohbikmUEoeEkEiEgG5pEXbSQRhz6/R0QZEDuZw5xtA+gd1CmiXCmFLKZh+QoqOaIcMpPScD8CVArIaqzclChj0Sne0URJyH7lzJ+gr2/ASW4dX5cc4y09IGpMZh3Ov2Qx/AlbU0Ho7LaGOHDac9NTxO06wmy3Ehf9fcmejY9cWJ0yG7uGX98d7JuzY18lr5Smnp/G/jGl3iJ7/LbTrZCW5z9wWWn5hmLv13q9Pfm7IHOicifJkDT1oSvaHIQJYi8MZg1+27OtYf0nbcuCnXdeSxcVBaR8vkRRAeeLJ9PKGTyRs23Pwtqd6f98f7GBKA+5jxVo+vbSyG9oeUdvEPo9hTJuJ6fUq9PIx4Ab72lfdh/Ep4lN2Lye1JlV3+Lf8raO+YLMzGqhAH8H8KdXwZ9tuCq709u6xIZLC+IlFsyqYaM1g2lW4A2RReJOAPokggADCWympTBD+VzRZVBJ9waVRajUYFMgSBNcCHptjZWSzyJRKVii8S8fnLAzZ3yJLSuNxF6OrbGzJYSgOkGZAB0nAA+v0QbiNFUlJiQVr+74jB6O95HY+zjbdMBETm3p6JK8/F1RnWps//xfIezd/nsQYe8p3dKnyWdxRh/7Nc5xqH7mBIJvQKQcWOcw2HVx4adWWmG3jT0BmwYIH7QE4oAPHb1N1fB3+6buXY6Nx1jYxElCoFZRJHIBqe+1Z0hDbKpLZgNIq3hiNBe10dyJ5InohYjVpXPWMH/xFqK3TFniM6Ew98vaS4LhSEVsNrNGpUKfDDUnELNPpGLu29Y4vThNLeBqXDsaG0FgTPMGeCdps5ozO4oaGR2RtizyE+hjCM1wcxex67XLg3lYrlsXCOaM4RuQgWjgWCIRAL4CGQI7Roww7AY0SOiAZi2gDBC8Ri4VwoJM9Bw5BraFieA805YEeqyBOJ6ggeQcnrtPI6Ql7HEwh4vBaXwcIdMkzpdIGAnMIswILBX86FiHBADsRhEAbiDO1KkWlKwDNoBWJSpJOUecsxt8pdFToPBuUUkSVHZ+yhjDhryL9zlsf66/IBQMiDIzlAKUh1Jn5WxHEYWz09reAg/CIWIwZD/i6x53+eszpVGvEVcXWeqfj/Dm7YBsZvP1CiemOlc7Tdbi8NOxrMKrG62wGetfeoRe8OB0YsNlOzDqz2drU0maN41r92S+m524Q0HbBGQbD0/nqdiqadhkG8ocMQoumovq30p7eH6leQlrTWC7GZM5QyR8qz0DqFPVD/xrCpQrSXXm53eQISJebSB+BjoisdOtBqty4fGqK6esmQuxtvboyLvRTpEanl5awKe3AtOr8WgePZeDViVl68MKucgRAZZchUWjle09ykr5H0yqze6qHCHxP4surAWUaDXtjTtOOByS3jjSazPdGU711LwptKh7vufQlGsnNfP+Zyl6aWinHb4CdHv7/cNzHYLFeDX5ccq794sK091OAwmVdOb0z9I/jmLs+EyzpQWssFrHw3fRoNSbtaQIs+L92dblBRGW+qnMMsdfLRbJJJ7EjBdmAcpJNdSbzHPG7eaiYazGCZx6aQSIZtlDeMIbdEG8LwMV1sjEY7bJbhlSvp3mVklC4KWnINUh9NeiVqGf+q6z1TXm/lDBuzKGfKIINmF728kMiBzEPBBaWdSj5oydCxfIqVwAq4Vef/rP2Gl65JDDVYbQ5LMJT2pCZbaHdx/+DYoFRiNHaWPH02m0pV+uFSISTTbtDJZfm9zZs/ty01euLvzrTrXAGd1eOL+KLbn72+67bdncYLW/VqNYSIIpHNsQENUVsigPR45HU6za6/MxqHz3ypPGOqXfgYlOM92MlCR18mE1tVH1njs59RgoNKoJRItthdkZEIlOsIfOzryQ7HXC1bttut1hF3LNa4pq9nmlxVxLMZr5+sb6wKd9UhoOVGwI5d8TiyE+ySs5APrvn0NFx1+B9iyqcT9ysOkf801c5F780rwmNXUYQXoRPgzpofptFcKuQeUCW06h46Yqx7wA/Az4IRthYadNRJr59Xj19eXT2mtji4Q+nt16HZVTVuY/tW7hOD0gndxvXg1FbuM4PK4VxfurmiKty53Q6oJxuwOwrOjev2r8N7zRNmPGMGrQwTWuEJjNJIU6ZtVKAYYFWl3hCAj00tqd4Q1Ti9xmaxFEOhxGhbYQU53CpIMZSX9CSq6rKQg7NX52At/z5Jd2DsXXsi/fzLcvBV1RlUJYVIfbESCRxXU6LlQlFja6ljyGopXcs9HTObRMLGVvBazkZKJeA2IaG0R9zll/ndH6tKY6QFemmbff9vfsM9dTj2gt+N2CwuqEEyi3Hdm2+OG2VGlaT88m0Dp1Ds3kb+F6A+BbB8wWFUaGQyIHRpvCRtdwG+kSSFbhNOK+oA6cVkCDidY5f5IoqDzs1diM+yCBm601i0elT8omns86OjoARzxTpi8gaXe+5Wl+v43KvQRENTzT8Kf0o8y9pd1k2b3qX5LvoMOgr+rLtidolVVRN86Qtdg345Xhp5ZP+Bymw0NNsvimiwqnQKBRBSuqDdT1OAb7GTQtoq8MMQiwxiCskn0PCJZ61XxrtwlOCrWQ5yFhGxED5D56u3GQwydEwMzd8w8HnEGHSketngsbzZptUolZAbco1mF3dQTOm9e7JRrMKTFORJK9Zf8DZnUy4+rdPJMT6/3W0My12WcFReV6d3e0gKzxp1gGzG9DWsqfoLVvYjM+i1cu7CbJm8T56cz6aYF4zOn+cc/ocn9VLW5DzwFX5dKjg49+pDVjlflvKO4N0uRpXVKOY+P7lslUldZWafZyNnSIZKW8ZN3AR90EHtJIZXWvJaNEEf8Hm1I/Q/qGUvXA/ZZZz4M/8OrAMbKYRa8o2UWYOJxV3uQDBojYQ0FOZWunG3RhGMMMJgfSCM5a1mQBYwEjF7hl2V9+Jsvp+FgHBZOHwHV6a8LPMpFS5/IlQtdpvlXAtq0mbn29p4C6QgpnMELEo+wbc0paOpVI9EYrV0lRqbXTppnUhoNxtCcqAO72ppaUkuS9pV/IpkUBKNVaPsB+3prUMxs3l5ybJGZ1AqKEojJS2jRO4RD2VWunfPrTvsdjsbByY3xEv/uEBWLq+H+ONuNncSKOgB1HyypU7cTkpa8WTEp7CRpJUdFFeud3DeLRoDSzmZK53VUpWyK34PPLTYpyz0RaWjzbH2qMtMasNxu9EQWuSP3l3oMy7dX+tr4G9HdGTSxcjE9UEN9S7v1Vp/U6af1wh1vxPzF3TA6TQW6sQ5UpIXMCGPgkQ7AheRr5xF5C8014j2WlN/lVraApuvAzcsstE1Fr1/9Ws1ROe00lrL/tFCW1wyV613afK7h++cJ3gwfCdhrjHiaD+GuXREWoD8PoCdxHoLnqIbW6UkXC7jjq0rOlpHyeGT7e3bhvGE72gkkvKSImjCheZykhv+YSKzKM8Nfyi5N6A4GDJQIMSfGKw6y8eQcQfRcnNmkC5o1NVjUD8Gv6QxNsnJviuACFQIjQyQAPSDO71MOPMxIW6pYDLd7LK1tY4MHyh96bfbtulcj2/c6PWazC7nDt5q6DvAGwvDYEl7E/DnSDYGDlLqYDLvkW6c/OtnZRG3ezoL/nzGTOIfflxEDIHOz37OMKWR+yYn7LbrjtwNnpG//DLgAf5TG8OROmklHLgRnF4YOkvyKaCa8NlQ3IxLBFpXzC3ZNA3aSz8prTt06LUOg/EET8TujzJfxkVoD/dabDvWU6CnxnuaGvrI3jbpEEaQ5MbtjY2TvYKwc6PPF3VoBYSK5GskS7CS5WGFoRwrrxKUcp1eZR6idhq4+uWxhPDbC9FMbfgKakJXIa1TllnG/0VNAOuwlQPY0mtG87iHT7lb8yd+vzubHxLTg+1tDPMI4WOjAtBRDXEBabOy8W1HPmP+7w9fAsNTcjkuXTLGBXVv3ul0EKX3VmSzZpNGe/0kcBPNuVe++sKz/HKc8OYHXBhsbCn9CQjLMbAjnDKfTZe0f1Co1uF3ofkyUIf4YahDjdCjDGCZgqW/2zfQ0Sprb29aFqm3kUEybMWbJI0kakPFIsinlvElqzAMA90rWmmAzuSrKILGU52iGQa1YzTtAFwxQJN2Io+jEgRAujxiE+jj/DCa9lD6Zlm+H/LVT5s1fHlSl/PjvU/o0WhNNdjBDw5W5mr6Vnz0b+CnTGdQB+Y+L5t+4Cs8Pr/0hEiBmt3LEgtMQo2vr+HJ301AzysSlSdu7qInXFL8YZybtkldc+nZcROatkmLnK0ZcGTPriHw4GqtRjp3BsD1qszfzGDtcL3SBbK/yzvQpMjlmpeFfTYyQAatguaMlCQk4iWXi1stvttDu8si1wzygFstj9ezaAqmZt7IVsZf0kmBkHDGUV6MQBMy0e8Q+jjxM0pU+s77nIj5V1jPHCZlAIhcaDLmKoeML6b+TWbXgNfgc0LotTeVfnjbQ0+DkVxMgINzO9cBwFf8Uqwp/UXAyRLuZS5Km62tT3mCQm5cpmbXnrTWrQSPEDj7qmTuUyY18of/0k2U/slJ1VmAIvu2Lyxwqkt7Qc28+QTmLCh9AVJWj9tJjUaEkUIRwNBYcqits/nZi3A1aE4L3Z82FYJWgt/lsmze8MNdH5vvcDuP0KWRhw/sIz5VOuPSF9DzSj8WN/s9g7kLqvogKfcLhBlS4LAYDAIJ5Gwe3T6qibEU8MsEfNrEwvww03+A0GfZPTs/MX3Agep7shHwaXIEJTMLr7l+6e/xvwr5sApbVYiOr1JYLCKFa1WqXyjsTxHZVavWZF2JIHw9uKy31ecljRa73StmxIIUmRTi88lhBKKVKDyAQozK/ighaMigEs/cTBwlFWH4D/Fi2UzKcUifQGgjoJCmDQhBh3EvqupAnqoWfY1L8YdZH+iFX09BeI0sLPwNHmkNNVrceAdNpsNWh9UV83lNOrdK07rKb2XiDNn6+Nju1870WsNpksY73NZMyBpaeXyo9bqEJ+H3mStfTTCMVamSGANO3n2xJpuYpsW2pthc8/CZVDBtk+C4RmbJpnFcbKp3BHypQ6+fxd+sfu/SR2vOjngd7liBqgO4po6EXwUSS8TlmU77B7pbyHJfOobxV/K3Yy3YUMHf1ORymV3+bNbvdvv9irYWQcIlVjS1QF2mSFcyKY76dIRADFWBa0uGluHCRbjAMygIm2HxOMMVSFGONhal2SJZudwJl7AZRwE1G4vMv50DXFUcgo4411cDbYcTPGkNZazuudfYNew989putGIKo11Fl7rcaqdRERjc33v/l/BEw47JDnXp9/J0ZK70aryRI78xjr959vWDqdTB189a3SGzhKYl5pB7zaqbxvzPvVZqltlj1PIuu4OtXULcjfH/CtfAD7WmueBwu2i/0O4KiJXKpkRWH7C7/bRSKYj5SEIsIEVV2mfYaAQJ1TkGkn/+4iKKIQplzQEiG8YaTBw6dXcSjenxqspEIznirWYlYe41t6UxZC29dey7N3cvu+2Naz8CdTv2PEQh0hrf8A1dN/T5J+NTJwdqiPxr85GX9+9/8VD2zx+VTmS6IUV0B3hz+PR0/M139j6yGs2QhTov0EPa8lix4PW5/OkI5WrI51uMSpFLZayn3RGFmlRG4IOfSZENIr7bRnB1NG60DKqXQvbOzM2w0dZcfAaRWebZFZzkGLyAVN0CGSC+yfFNYXSq3aUuWmU3KircnSe2djmI1zmeraly0VrhbIXmUnVFynstfsWejZfH+greTEZtcEkaGxUSibMl7s+76p2MO9+IqG5s5EMLX4/zfRZxhWZWoC9cZClmBfocFOe5c6ghBGi51BLyeJWdDHAFyqmnRQZioTCHRw719u5d5qMNbnCUJm1dJ7+2e/e3bllWawIWijK4E9EdW3mwIxT10LTLz9/25N4mRHWtkl/GqpIMsAcuH+EH0H5fbKBQTyUDAXsWCwYxrBCDwYhKJcmqdTpGSarV/GSKcjPBmIjvM7PcPjeLumPYweMM6ppBfGeVGWmyKlNhOFfbRNwMg2SF2Vo54Ak5ct0sudB+Mbp4s4A3xay/c2rqjrVxgc7nUpT+XasbfPDnt9zy08/0T32l9F8vgBsb1g1k1X9G9L70xhu2dQdOHr92LEGMbHrmuvbM+pM9jt6Cn/ZsYLZ+5WRv/83f3Hlq7ieP11cIrgfR11We3PjBB19HtLdc5ua7p7GWgjMaj0tlMlPG70q7nGpTzO9OpfgON+nE+W4NWYdGmsxcLPOble54mdmzDDr6CikxU8vAiv26OoffUtgCVqCq4aCftVy1DAb/Vf24lHvVG9TzK8SwskucX5KxSJ6PsDY6h7UWXEG6ro52hZJyeTKZz7k0pnCADIX4jT47sZA4RBvKjl3kGDmDuDrzMcR9rHEGT0r0bjN4t0rBpes/wTS/6giYJAsI/DibjOww9EVCO6SzHVuOrSgEgmHG4+royTar4UPS3tExKHFpzZ52X0eIYfr4PgfR58tkVFpSzZpkJnKxxipzZFdqLXPx87M1Qqy6il9i5qU4UK4KcOYbfpc11uy0IN5vctc8NDn14DW5Whe14emfHzr086c3tLMy/Wu4QB7/2NmpqdvXxGJrbp9+4onh6ekVK4Y4c+Yfu2nVpY+WclY/Ly8YXbrUe3SKYaaO9vZeNxbrPXX82N23n4RrNHL5VwIZex5SHssV7N76sMnpMiihRU9kJUqnO1yfz2cMZtKIZ3z8qlWruioGGTZ2NWoIZJyLhLt2JfjzPQ1osXhb209954Zr37htWffN3z0GcrVYZ8e8QjeWDAMnp+LegcMroOPygZkbXj3S1Lj/y/v3v3y4GWBLCDrNr1/9yN6tD6wJRydPDoPvIJ2Gfnk/OwMJ2vFovSuWySjahMYWh8sgUjjc7uZ4hIw1w4dYbyINeA0wqXFecVa94zNxzn/NXIlKagiv5PyX1gIheKuW5bW63frM5s0vnuhZrAV3f4lX465rFfxPUSZ73WvHLFVFWA0lI/DkS5wt452AdNdj4YIBGbKAqx7ZMdaCQRXnu5GSX5zhGtmQ8WJt16c0XOAtmcljBLwaW9V9BT2vUgGD6KrWib3HXwmH4D0OYhsKSYYJms1OVxuG9bYlk1lXsA0+RCtMql6XEoi8voI4xZBkjzthEiC/iw/i5bMv8mx37kWU8q5aYY5z7AG96Cd7Tm89WNoG18LxKz9GI9c8XEa43LCFn5775hXE4n/D4hBb69be3q2tNhabgK+z7/3nL3/5n+h16SL7C0vYaZZ3pR39hwbr6wcP9YP7qhwtvfAvv/71v4AgemfuGiQHHN6cgPhkD7RzMawDKxSckMOGbDbr7AoHg/GsM4ynIR5pgWGZlsDqVD4B9NBzM+fjcXaZ8mwf0yw7HoF1Vqg/NUVV9ZVtMMVqrVfaGya8SUZnA4S2Whzzygnwtilq2A8Ud8+r7YoXBkEraF3zxM+vO/wPj4wFB/Z0tFQ+9MVX37xy5T3bsh2nvnN9aqrVw/sOIPChVWUpcTVnG0pPlT685dwtHR23zJ6deOHxu3I8Qk6G0afuuf79r9zQkjv80v4737l3Qs+ceODZ+fgD9Ra3YcsKPpcr0RSLuf0uc1NTWwcM+ARtTTpfczOViJGMCMUgAoTA8YrocA6cYaMPNvhAUZ3yHAo9NEvEa2VNXvh2jZaXQ73f1Zo0pMXd+4eCrGaDr7OaXYtPy4pfG6GV1q+6adzvGz4xbqjKwtzrVTuAdP/Ia8fZ3P8/XnbxPPzPwtijo+DmCwQ8IgvjDrvVZgvq6/U6kbXejxE8vsjmFgv4fEQ62vkwA6PYWbazmUFkz7KgjWGr2TAI9dIweGV70rV6CM9wIbDxDYQ7EeZ5PZQ3if/BbpkCHSqvUyQMA1fTQGju/o6HHnn4jhviEUqgcTcMNnytdGKWeFuVin7mBxbSo5Jopct4Qp6nt73ZXPqcuaV3eX/RUbo/3JEKBWOOzS+s4M5GvvHyT/kklOtObAzbUUgNN/Tm3E6Xy2Ps1WVzOelEbzgsFQqxrEjqcjqNDYzN5mZQQNXKdC0PuN0BcatPycJRCFfeuzDLtu6xLTwZRgWZjHCpqiL7kHjUz1k+0H0JVIoLoWKgvus8MEAyvSiv4al8bCi3Z0Mh0JSjMJTLCxOgZwFWvf2f7+275bQzZ5ZSKo1Ba3s1dawjvWfHpsCZe+Ljhzqbrzu4mwnEzaIK0G0o5H0tQ4H6kaFlzvTuHRuJ12sx7OCdb+15ufTPR/X1apHWqDf/yD/q9zT59TfszEwW3OZAgy1z7LYHB8vwdy6ectdnKJXCTGltCa+ei9cll/cLHHCNGxAWjMFYzh9sgA9jIxvPIeuq5MfJIOWOQnBfDuXOVbAgF8Uh+zoLo7pPE8ZVUf2niN84SyFL+EuPqeQWnezjYrdLP+DshtVLC9VWHSs/J6EtCPC3Yj4Yh2cKFlldnckVjdqbAIbVZ+1ht0kkU4oxAOrEBNvdzShnWcdxsdzrhbp+oean9TwDasq2AyEqkQqENlxtnQ/FIZM1rJssG8HHzJsBdrrtlpNHEn4q820mwDQca9n5/YcnLxXD/RnnslMvrC0c37/5jCXcaMVHOg88Mtx6aDLFt+ad1440TLa461LfjRliob5v/rr0lwe+48qPpbb+4vy5sXBvg++SN7uy0XLN/XP/+Exb02e/8eNybCpYC+1dA6pz8wRSV8yBOTBPLNbocdn0QZ9K7LA2kEAgddsBUva5c8qKe7zI6QJKXqGKJ3BWg2zVVaLQhX6RGAM/hzE2AqfRCtNq/SBibe/+wQBr//h9XHB96QcVli3MLlVwLMFH77KyuR36NReUzSHsSKFVp8z29JDZxkZ6uKO90JJt5fOxrEDQ1tpK19dHsz5aryt0tvFIgaC/013wk75WrKAs4IVCf9LnEPf7pJzsot7d9y5cZA92vngOSe+8IYASwEWq8XjZHbL7O7VstYTrymetn85G6KoNIuny2tS4QrdT6NYwMIZNVYwCeFtj1ZfeFXQffXHX1uePdni6NjYP3bUjP/rIT0+c+OnDozgO7HqVRoxHJm8aH799bSKz8/GtpR9q/sT8UQFsn3/M27UhN7S5ScfbLlXQ3QeGQ6EV13ZFJnvjfCBs2XSqd9vTB/LZ3V/cpHSoaJXZLmvZMxRhVt00MnBiKrYD1I0evzE13GT3NrSw6yqA6/o1NkfXVnBFUq6wx9PSJpeTrhaDS9ASipLhMOn0ZcUYqVDL0box78UvzM5HgOcvVuAUC3/BPOhH8lNpS4eLtrSTrGY4QEcsva43EFm+tXHZ3gjdG3E1Ry3t3c9XxKYWN1XEi3hfH+lhMn0hjU7UJ1KKTRG6JT23viI8fVXLIK6IGWfnroU010E9KWDLC35GpMAxjMo6TKZWRTYcRVvHwoxPYiedEszpxCSENtWAa331bMAzq+JSvJBswDaKIsVB4S/ymIh+VH2AHsGzWA4QzTagq4VObB0DWUHoTHg3eNRiZmcuGFrx+A396a0PrR8+ORlF/sINPFrdsnt/fOamXzw6tu6L7+7f99FNwJ2aXNHnWfFIN3GvV6rim5us4vzpc3ed+LtT7em1p5fNO4aXTxWX3ftPN931m8cmBOHcAE+qVbq66ivY6HOQ7wzWULA4zS6/wC1wM35/knGJFSgVSzlhzOMWVmrDyEqcq7ES566Wgb0iAK4E+UslXWvRTjmyXypynWuuCXT45aAeYIcu74d8RLmLyUIE5HLJrKpRotcH8l5HNiARiQIe0pfDGn0qkUrgE6tUYh8hIH1RAsMEiKwIlGKWm1B8kQ3gWDqr5PAepBOxNRblszxF4IZB++wgs+ZbwK6Ss2LhAc8DOXqidP23fKSw57aOsccOdcXX3bkKeXJhGQboWRjws/v6Bm57Y1f/PR23Il52PJX8yK4z44aoueP0Wzdc++qJjqYNp3scPbl62rOa2frV032Dd33/0L7vf3azytHhQTjvz5CgL8F1SCO/Hfa6ommhVubSW/kuoUFLCgV6+BDFwiR02yKfi6gNY1Vc7H5+BvqCCzOIq0hBvSqvSk4sdN2QPgBDAZ4NLOIwn0pu/szaH625f2Oy1nOvfwWARx8F4JX1C1KujxZv3NBWd+n59fi/17VtOFFsLWupKeQ+8tbNPT03v3VkbmpBzhX67stH+DQb0yzHhgr1xW6+g+/x+UzZOB8+BkMxVySbrVMoInV16VgRc7gjvpAoDSMcNMp8di7Oph+57CObe2SDQAT2GHYbDs3xk+dewMQr8441eUqeAdl9gbCZACNtJ7cUEsM79+4MOhxd9/7y4Yd/cVdH0/qTd9/XDhoXJCEJYe+JZ9ctPzYRI8PN7d1Opjuk9brG7tmS6ZWFRnuZiWJjvS57Y+uar94+MvXw96/Z9MqjJze2yWuSkjh5+Fs3tocHrsnnxloi9R4j3V0cCGXHHYEbvvj38zUXwX42Jw8xv90Z9pCulDAqjOZTqZY8VG2L2+MMiQVRUhgWZaGas5AYbVU7f2GRhsdnzs9eXcmvmoX/eIVfMg//MZq/RBp+3gDM5+M/x84Fg3YMRnVJaMYE/mQy7Xe5zNCOiSknDOvcbHBTsWO1aGfmyirdx8OdhRW4j4M6CytrH4905vF3J3s+brHgbetI5lyJICYSqYtmZ9akRs1KZsbrE0lz7nZA9ohSDJksh6szc+fjC4F4ZAYl487Pd69xW8hglIa2B1fd79K5jRpsTqxh4Xbni5smb93cFdITuNJoV1ZccSWCrSX/7nmozqJvkI3F6zunN+2ImV0aEeuPbZrhchALvlxdjI9erKB2tBY3Xv4V7zkox73Y3kJOq1OZs5nerBDDjgnvFOJCYS6byRT6fL5I1ktRqmwBkL29ujqdNtFRT3q9iVwua6/zdRAJn11chnoZLrRTl59wyL6MXWAQyO3ZRW4AufEks8DG6w38j8d5Hi9dYzyInXq5WsKjOzcW2rcVvQPdYE/Pzh6q7eQbN5w9d2sXBHiUXqWW4MzYgbbuw2OxTWtLnztxrHD4y7t2fe1kF3EfrTBaZIWtvT5X8wiTX+d6zlWc3N3VfXJjtvPQoxNKuxIqpVO2fE+3C4UEa0+Fns49tL73xOp04fALu2rqrgyWLlhcZpc7EFAkhYxLpKCcpNstvLLSWis3S6UxPyF//+nqqUsq+KIkZVmvcWyyjPc12GpsvBB1pryxLJ+fzU5Odq61mM29vYPZTkXW6+0skj1mlzOV5mFurVYy6msRS3zBeXx/0ZC5cIH16xe5wnElu1Vm9CJXbkBb6iB9EOEny5ssPzXSx7+X3dhTHyxubmza1OsPFLdk2w9MNElKvzdM7T7IZNe0Uz03vrhlywvHuuiOtdllt20vrHjgJ6dO/eyzCPE7oMRIeZGpWyYnb10Vbdx6N9FjbRxpaJzKQx5PNTaMNFqL/DqDunu5s94gBPxAy4pQz+GRSGTkcE9opC3IB6KWzad7tz1zqGUx9k+uOTu07NSaNGcvIern7WNnbkPZsDudoogKM3lQKtVJu8sp1FBtCnXuXG2Se/bq6dKa1PDH5EPBRE2h6qdXS3xWfF4ls0lgE1Cm32dnvmSxLoTbMXPA2epKe7K5dDy7SwZkJqAWpRtafU61kSRNeLrNFxDhMRJASubi59GgOe4HFAZmJn5++qLyPCresNuSKjRVopcFpJUlwM0SxZpMFXybj8RGBX+J11om86Zff2Fi8ou/PlNL7u2/eXR08olfnWbfu/Tb9NYH1616YHsj8Z+pLQ+uX/vQljQivqHnxq9u3/ryyV6msgRMx/Gv7N7ylVPFBkg+fmrVw7uaie7cNQ+vWvXwNblLr+Z2PYJ0BP4R8KGOZCEu6i/4kmm4Gq2tysFiVhhxKbV6UqTs8DmJnC8cIPURdzatLPcYwIWYQV0FF+IXWX/InEeol2Gqmd9FvQZo8zGb5UWTx6tKgd5eWKvkrOG8c8HX15qG/WXn34aqPPu+c9uyzjNvXb/piTzeV1Mv+B3o6Tk4HPr8kyuODPmiKw/XWI1GDgvga3c9dyjftPfJbTue3ptNhkoXK+ICOv2Td2x46+Xw6JG+4IY7Jv2cLbkG2pIjrC2hMUdByc+63V5TVmHzScRaH8bZCq6AhdoP4jag1mlx1l0CSI26GRhqVV2J4//5wIdPjY899eGDD/7hS2NjT/3hgc1f2NXYtPvxTZu+sDv7U/72DV8rffTY46W/vrZ58zeB8LHHAO/VDV2Dj1185JEPnxge+eKHj4AUaEP3RmCb4b19AOVagqlQbbLgT2YxHz/qsrfnoc9Xm0xUViG1a8h2adTNt9vrbAJfo7jOB70ccv3lChz0Y6yRO8/uOEelqdpeChVEqSq2xEjMGy2DqtxMVkEClWq720VxnizNtyY3PbB+/QObknPPnDh88DGT2mGSN2z9zKrDz17D/O/z4CQn4L9+dGTo+dKfvvGN0v95ZoAnqhOBt8bv25G99E/85m1342mwZt3y6aHSO3SdPe2fuHdbliD8zvyq7PXHWFX/j9brX9y95cUT3X1nX92hqvd7VWgPKbERrIL80mFkQarTiQk1plPWoVoFyj2AyOwMysIDdJ9oyFv59Bu3CzlqEN1317b22FC7U02qpfRYP7Ex8MTeFXuzDfG0WJhrnwpxdnAfvMYT8BpmdA0AlAY+BsQy7aJraCqHhqA+VzbHm+auKBQ8tpk2S+vkUrVZ5Wu2+xvbto83ERsjuaQnaVcohOJsKG7x7Bk+sLbA5uI/4AVBgn8aclz9CkYAHBAoPIHXeW8WjQNya0Ci9DPXVv7p0lNgHH7/Xfh9q2A9ZsPsBZnBrBFJhXy9Ri+UQbbPnEO8js/G2fBFg/LNXgYlF1DjNFqEciQz5UnY5VKXXJfpQ88EfPhUZmf4JywRH60x2YzNdHx3gyVc71HLzQpjnjIl0w3w2j+C1z5euVdA4ARWc68Eo3FHf/EPt6A7hd99B373N/xvYHZ0n0oFZuZjCoUd00ngfc5emI3DuOvCrBLlFDW1vtZda0X+mwy5NHXWiDsy0RUM59cdykS6oiZnbjTJW2WkQ3o1bVP7ejcXNt2/PkqGc85gf5Mb8ZDi/xdvSvADjI9pXuHz4aLyABZ5D90o21IDjZfOyZv66HvLiX/j/9dPTrN8115+X0AR92FFbLDgL3ZQ7XjOb6FIbZyKeSX+NnOU7LDEBV6XK9cQFEoUClwoLZJAwoZJTKS8RSyPZj1wjgSGztCRxNnQGXoRthLg5fbyc6FQ0lkJHdKexBVv1b4WUKUf+XqLQ5GV1+mYlcs63dGVrT6hJR0FUa23gXa3ZFNGXOxoioFGoz/jdHbkkyqpozEKGqW2VPBpf3fCun5Nri+gcBcPDoOnQi1+DTX3VOsIo9VTYaPMKAdfTbbRcvheYTSpN3pCOvAB90YT+sHphbbUS3yNeAELYu0FKhh0Um63ImwSgQBlECv83qDJItSTRoFESIrl7iCNVmbuHDdHlJmvh1cy5mhJWLuJ+s1rIQNXCdep3KoEm0VXOYmvzd0uczUGS02BlF0qIcOUFkQHv9jDjLd7n+ztzx7L4vs+imYdUoqSuxuDxI99GVpFPbV2Lb3s8HDpAZC/YXehde5+1t5nS728Ijv3rgnrLsh8tAh4qXoY/CpyCbRzUG+O0B6XXVifCSp1UpYUH83xmJvohPjLOQToFBE9KIxyL6CkzOJyqrMZpBkVQ6tqoCQTT/GKP0b8KcX9DXARB4rddOsN63P9p15Yk9nmsTaYXT8unbWml8fSm/ojwb6NmeyuD5gWWgadnbMtA25JdQfUiZ1PX3vozZuLDofcob704APglejytD2y+q61m++dDuY4niF60TzyBhg3+nTyOimlt1gasUDMD9xUzKAl9fJgPemvo+UStyOI84WoCIBxHMtfZH4fZ2v9kE7lDLshbG6WmWGnT1XYxJ7xVstGjmlXcDY7z7J33lE4k17IzIxLznJvEW+J+8qsm3u366N41i6hKKkjGyVaEBtL4iqjcRtiNEen4vL7PBn/Dqwe6yl4tDIcl1EGqTTg9dUDHmWXioIGsxQSK6kjaCCgvT4f/K08hPxxVkQ5+WS3d6kzXCMaSndxh/Sh7pu0ipnPbM135lb2dYF+fPfcXSwpT7IUlH5UJrWyf0vFv6Mk6CoBRAF4phSuFVD8X8s7teblsx/yy45FscaCxK43UhrgcMTrkXCqpBRt0CiFjnAQCKQ2EpNXODUvlKxMoltfQgg5AoAqUTsuBH9nKekT6LzOa0un9q2tyl+pFx9BYpfa9dSeA2/e0seK3UcbnTGnsgu/Dzy/bV9V9FA/+AixHfLDgbV/VaFUE4QYEWBWq102iMV4lL5Oyaf1EsQNi81un+cGVDPkYiusYDkRr7Ci4tA9ERBHUNJZw4Mi7pj75ftHz95xp0grlN2RDJTuXrj6l/67tTGXAcDVbqd4ddU1R+cD9hKX4ZpHkF0zazFMS7ksFpcrVldPSXCrmbRI6j3BOui4SakAo3F5edzsRU45Zmp6Flmx0TmvMGZX0RDipUv/utCeLVINxIfS3V28OxeYtGJVK8CtSKYurUNsQPIDaeFTkJYCNoRt+TrWRcRflhE4uyk60qJpUcjsMlzWImsZZuhAkrJSgRaCxtTqPqsxmGwUxsmEwOMmaXmfTzQ/1gYRygFJaAhmGNYQoMFVKkY5h+ZcQYqhEVjQthYm2AE0V1oBtCSoQsYT1oTIPN7Le/YUtp7u6Dw8wUTHjvSe47VuuC5XPz69JnyF3Q9v27O3wb9u3VR38AvnnI0BkynY6CCZsMeixC1dD7+50+fs2NbdvaObGtrdZpXa0sFLK670DQ29IY3Sk5s4dL82vqJQGIqqJfbG1bdyMcEAtCWTUHbtWBjrKMistrCdRwBKFw5HPWghtQoHjwY6QYCWSEmr3QZsNk5+p2fnfR2ri3B5uEEL7FGYCzv7kvOiS9RoY5K4+Z13GjbcMTLx+OHOwv4vrvvneSE++Hrfzi4n3T6dObyJMycTO57al0Wt2FueOdx2qLLf89uNOx5avfHO6cBTT3GyzZNDWlII06hUBqAQUwZDQyIZTNE2QHmCaFCHXK0gVRIbGQQ8YTzBHnnLaSNT6XcBbAs2w80+mUP1UISiVJ8g3vNvVS3l0mJe5fL8jlf+HXOrryruNRzlC6uqzNGL6yCGU0LsLhNilFwkJ5UCGNrKy6HcOZTD4pdteRligeayvWMRVeQDpEzdvOtYlMT9m4IIXMM+bEuhQamUYH2Up6U109EWD1BMxmNUU2YJ7QnUBzu6hPmW1tZ2DPUNySX8IOmQom2kSlItqLUZaDNMnJMTiNXnzinPo+ZItLrc/EC4tIIlQCDyPZxV1yS4PdhLrTGjSnGZxn04GWpyLIKCZRgZGWv3SYaKBw8ssfKhx++JTXb6QX3D8viVUJBiwaSzdW0B7N635cYlWTG3+k13z97lSJc6L79PfADXzoPlsLGC3Oz32h0OiuKLCKtQCpXpFa9Xl7daWeyl0VltNocdy9BKqT8SEdFmgYBNzasYVF5lm3EustOUoAiqDRl21g6bqrMRBqhgV9RQvUnaIGRbktBmsTBRm5YDT8XWrx7z/OMXk82t+x6dXvPk4c6mgy8fGvredmDXB2VSGdg+3ltns5HiplWt7tDAjnxiOOvklepHxlcnusf+15HtzxzI9556ddfWvznUgk8+1u87ENXwtWKp4dLGz/xxI87DQWT42s7D3zzeVj9wqCKbrC5Gsa4CLTcI9QrKJhTGw5EooLxCXtDmlBp1pEEuIxWCYDgSqXWK8QpEYWEYMzdTtitldLJQSqo5/YXKN69roLGqgFdClY/eYHHK/2E5+9GeGu37wpWQBcUFGMbTsjZmRSFAq2k1MFSsTAraGO9dQQDNDLQx9FWNDFt/AZHpcxXHz9oY6GU+vZUhqoQOf5KVAZ/KzNRiTWKwQjLnH4T8+7FmbBAbe6mjkRXeOpLMQ3sjyXu8Xj984yWXq5d1FlprzNPRKPR6sPzyoEQhhSGFZB625Rm2s4TtIUFFSEg2fMqghrr50lkVybH5BpR7TqHmMgFXbORieyC0EcJya1HZlxDXl8FoYHJ6Oty9rcPVefyVPRJz/uS2dr1xm9ejrm8dGuo2pqOtSbrV2nt8VfJJOj8c7lqVMVqZrkDz3eCmWc5dpnrD2ujEsf6Db/7Nw4NCnpAnsQcztCZg2uH2aJVaF6lTiABh1Vrb7PqAwbHjti9d/rB4eucKU9ORG0529u/tpbrKschBFmc1F5wRL4VhMYtCZ5cLKR2UfrtLaCFtAiWUfkm4DG2rsWMFeETYqtxVo4yFkAsuH/7RUiHGPNzi7H4vcWnp2KKCuC49wcJctt78Pi/Mvw1rwYaxkYJqwNHagmf1dXURHxXr6hptRSw3ZgHIdnUE42lphIxJSJUQtAzQDsAZM3YyU9n4R5QcTjjHbsXOsMZMg6Y6VrOokKNlNIVgU7XMUiMVGnZ4OipTB4CcOLnRPn7ggVXesWJMbrAp6gxmu0bjdDo1zHAbo1Zc++x1/SFVRTJWTkyEuze32EVqi27NutHr7xOY4qMnpkx1SgmfGC5seOXWFeZQM6WwGhUCDQTFlE7UefCzK12Fyf23Ll8kHJHrbn2grxT47D13/03j7k2jeapw/PA15bwKzwzXrIi1FdzxbFZQpBztPpHDscxEGVUt6RAwkCaBwxoU10mhp57XjovlocloiVAW+tzC9HPNDknW9lUsIS+5IA1dXkBWW3TE4YUBGrIQIMaKiNkb8pr9HROxhStnt9k1thiVzCep12pFAnyVNRdz32Bt5W8SQ12Ftr5Iy+pm2+IFyzZEuwv54qo8yvUNlTrBTohPnJilIFMLKYHTYpAp+KSQBQjlIdFcGzFLVM1eicqEoe9yeZ/kmlPLI21BncxgVTnjwaDVSasJ/O9Y0HLpxMHn9zZorJRKbTfInPXOxPLVAdZWT0BeSCAvOrHNBZ1OTgnq6joNAoGjO5lItLZ2Uo4ckmAbmqfu8baRra3yZEMiAgRE0EhKoXOS1JHyGizDzLKt0Gx3XLmOVm6KRA3CbCsQuMJFLeQeFOBktUCKembn3TQacQ2KNV5rIfOk5nrrmpWejrVZuq8zb9K5x/32fNzuauiim9tBf40Tm/MuZF3HRLNfK3LvKAS746QACjsjV8jcjSF3o98YWL8BrpMf4si/h7YqhqVeEotDcFG+ZjYrGZfbzUcLJFW6XfagTyiipayhmjsXX9APCslm060MDFsralrp/RUIvVUFx6nWA+OJZR1gZO4v1qTPEO5bl/QNtfp9bWOR5sMhytw7sSm94lC/xxxqBKKBm47sTqe7utTOsLV+fP01zZEte462d2xocSSaDNHBRgczujsbXb9mnMv9QL8chDQkUO8P5g0h12zE7VRIKaGMPlqjJD0w7LGgrE+iJutT9sVz5yKV/SwIamg+MZi9SrrnUyZ7Pt79llM9AONDvqSJ17EklnwpmfSzvJDJBGmL1erS6WIIUQqswgQNWLZwmxYqlV2WLWV28NhmPFTG5aUZzmWyrlTOY3sS8XSpxxh0a3MT2ydyKk1x33KfWKFRqwRJUZ2QZ2rbP+2BOjW5PNHe8JdSr9ruN7oGRydGB1xKW12sv3+0wdReXNaRVthy6ag6NTQ0lTc3OoKr1kyv7LMlmHJMgWaaDWKrCzHBINWzfHmzXNjTTKWz2bSP8jgYfXq5J0sO+poFTDjc0x7U6ElSrpGKoK2QswXYpXLO59mea+XF8zOc/pVjnQWpyf9BDpp/X5WL/7M0dE0iD3zxf56OZuPzYeiwY8SXIY7uhfG5uKPVbvfGlEo2ySGOxQx9TZTXK0GvJIZORSooVNBqOdehyWEtpiIPbNk6zu1JE5aBU63Gchvrq9ZJWNPmhWCXoZkgYoHpezdbMhGbqT5hAVvnfmtJ+IwCR1vWH04Uh6x10sYtdw73HZuMPx3oHI8Ei2kHnS6kaasZpNZ01uOD+RvvemzKlMm3OZ1Ru7xLZQ+Qak9qIOcfC0WXtzVZqW738Gf2tDLTJ24c2tftsDN5Z7y/Pd++PB6d9oHm/UfOVHRdANckjS0vSBQSn1rtMsJQFS2CxWjMYH7cRUV9AVID16Je4rIipU/XKv3v4zXxRXlpzqFBBVXFR4vkZDsgKrWapRV/9OmBlu3LAnRhNAo0pbb4UKNDE+xOOdrbmk1Xqv+WyfDQ3vYVj911Q7yrPnXo9D2D4bGOgMYdtV4t14vwBA/qjg/LFuw+J2Wy29W4yeRXUyqJ0k6qnQKTHtIn9VWKM5XoaeZirWNCJZmrQIiqp+LxlsIKNd5oSThQ63W4e7ZB7DsBY6Qg1lJwBd005XQBozGsopRiu9PlojAFqRIYdTA4kgboal73IpsqqNz5uXglubv0fXuqOYAy+r1w5b0TPKHDrA2ogDJURr/49BI0EPUDa1UUqXLv/usZDvzO18ho6FPasMlCFHrHWMqZpQxhH5Uy2GwGRA5uyDYGnW6hwkaqHAKDLojzpLFwGxkF5QFEFX5UEiAzrMk6z+44UHExH2SN4AoK0/MQP7W0HxJyVBP/XfrR4/fUUn3wQBn1V9+ueKTyR0+9uWgBbgT/h4MMby7lnG4sicv+qJI7TmDdBY9abTci32pMQW/rQZ4WjWWVQ0e7lJ+9uKi2Ukmr/X/0tIr//572ygxpuRaRJVC8psTaUR60TUUVwhjW0EmTJJvN1zS0F3h0Tuhw+DB5MMxIfXo0TxMRBwnJwzC2umkQeSiI3RfWHgyL4K2BO68iB64sXuDv1NYi3mnf//mJZYdXBKU6u6bObLEprGMN/qGCd6laxoWa2kQg++yup3alayF6ymdoO7zuX1LdAVXqmprSBlbBUIQK2hoVRhXUKpUGlykoIUrQKGmcxCRcnwU6Lipe2S863+gKxdZJqOYC0bRFyCUWwZcojb8lBP7MgfSvcDVVgRvahSGUWxwY7M5R2WS3UqkfcgML1S0XUfoA3d1E5gTdbcFAVEq7SEqukpNKicUcBISwf2Bw8MpsLfeMbd6BWoUSt8jmoWo0V0v5OP1ZXMW8EhHM5613LqVOVamLjxQ7XIsAQqEpZVyQe1lavWoFEjzc2ONbAii4Q0YiVpOHwjEJtLF1UF5TMNIcf8lu17CjYNvbU8v8Tqu4gUoJhYEEk8rTVmPKRjuZYD0ZkKd7gmK5EIad83qJWsHm4hfiqGtmtva0Dg5BahYUMqpBpg66RhZGlg/aSKEhRu4ko0EDAomac1iekZAhZIxcnb193v5j47GmnQ+vsTRlkjr8tbkOfp1Wzh6p4WtXSB9//EtioTvZWZ+fylrp1olE1w78Z6xdeibdF9G27H14fOPzN/YKVaT2T13GWMauhFiH1rtN69VdhLX04W4XjCmMDWvP9I8eHfR2s3uA3yd+CNdIg3kxz9cxPhF/2e2uN7HQSWGjJVItjQmv6HrCaxOrhsXNjfrVXzjQmt71pWs2P7Evl9v7ZE9wRYvP37+zNboiR/mKO4gXeo//7Zodr57pG7r1axs2PHN9Vwu94uSqtS+eHaCGz65f//zJPrbfaVmpl5/mb4dapcF6sM1fx9rRXUl78mY5Ffd74T2+HAiF2CMaHAIXicXzGC1nAn4GPhSAbsbiCrrHJbWYIFDG5tWgvJeB283AzHCNUOz0IIa5gMhTlekBUAdQ0x6oakEOlFs6DdxmTdV8+UZVWRR8d9tk2mhMT+LFV58ZOz0eKn2uqgI7/v6BCR7vW4LY5KkVWz63LZnZ8dn1Tx77we3FFfd8bz/xFbDXFGnzhzujppLwRxcufSez9b65J6uSf6Fw5Mu7XQ0GRSS88cHNCaLL0zHdkJ/O20stbce+cXDDc8e6K7Vvvo/NsbcVILKgcCtmxXw6A6XR1rlJWqDSaLV6zGoOEgKph8armCgyW94AX975wMygUUJLlbiZRdiI75v76uLEcZj1Opyl6+5eXN0uJ5V/UzF9ly9jX778W3AX8WW1oO6PLB1KsBf/Jf4EtLXmgkSFiUUiMTS+cgxN0zrHMg9ZL+7evGmkU6k0/sumxyabDuyYcr6ja2jt9aS2BsG/ZZotjVP5FqYnrK+nkW0QYR2lYSHDb4UL04SNYwex+7GXsX/A/oCu5E6n//jIC+9+sHofFpmNoBYhrpkVhAlIvhygiZPNRLoZ10M9JmrAb9UAAPQ5YI9o8doIgw1H3VZ0Veu91QZhVKuwAejS4K+gUZY4CkM1laQtNLBV3wfYUZdoOzFhQPeCp+Av8atlDEO1DVnwKk9no9SBqenJQHisL68VBdvGkr7x1RsSVJYSd5Fundhf3JxtufWmG5imh556uphZ0+UzhdvnLvu7slF1wCFPBsI7912bKD7/9GeSvig/mKBWbd4yt8fRmm8y51Y2kArSo49OdQWs+c09zI71A6X1V15yPFG5pKSbpHSiJS+Jg0WX7Huu9pL4nfCSWdPCS27qRZfEX/l/6GbB5/6HLPkkeR1pafnj7NfvPmriL5LXmr2nVSmlUyyuqhFjJHCgKpDeqphq9CgMrpVjJHE1aCxdlVO+gI2MawQZqQeoiqShKqiEhw2mayQZ6QfeaRhYv4Pp2Zy3BrqmonoPXMKGlTlzU74Vbwlv2byKSgT5UV/yM08/X0xcu29nOJCUOwLqaLYLPOdvD5t8XWsyxaefeqiJueGmW1uym4t+sc5tl4nh6iY2rB73JcfagiJtvm8sHJicngqoKZuudAN7yd5NCy9pyuZb57694JLP9S28ZGnF0pcU6Si7XFK5ZGL8ikvybv9/517Bjf9TjnB7lDCMnRGwDFtbiCdSbU3hoN/Fw9r5eF+ffble7jLY+1JNbqAzknq9n+/GQ2EApB2tZLtI6qPmx79FmPfQzJEI8tHnmPnNJwwzMxtHHRXsziXAJCG2Un3sIAEr6kvR1Y4U0i38nhv/61tvvXX1yQIffFAzWah2V9pb4KPuDpC8+piB/+jonp+oVG1SL7ExxeW2Uhf2+uUZGFdRBYUSAJlULBRKhRivTso6u/dm4txu01l2k6nGnUy4XVa0fzidZHR63esbxiY23Lrh1lJX9LOfja5/kN64kX4QIy5HeQ9g3xRYMAVmxyJY8uuYg7j+ZZ+vzvIt4npMi/Hg33VYkDj6EiUyvkocfRHeQISZY9vDL164iAqPsSjhYrNdKP5E2VDALHpNaLnm98p7R3W0yUAbjLReT5+Dz/W0ET7XeDMar4l9E73kPaD1lF/B784/11FmEId/VX4frc1OSMO9kAYp9lRBDwgpXywUiCQKDDgJ7LiAh4uEQnS6+IhElnhU+ILw20ICEyqFuFD8kAAI+I9KXpB8W0JIpMM8gPGU8OsEr0BgmAN9HXsB+zZG8OBK4BhYjR/DH8UJKU7iuAgdyJ3ACRwzRdBp4ca3Z6f3BDCl8W0zOsJ5+u339rz93vT8myjPap6FH8TjBpQfE7rTXvhghAbhvd/Y8Q30B/3Ne7+/f1k/+wfDLz8H6VrB0mXAmBexuleJ618SaiSQDV/jFXiFOkWC903iOKYkjmJ64kmoCr8LYOxp3CDy9tzb8CracpM5jN1UNc9XeLQmVyzqnv/J/37IJIu53NHSufIT9iy1Tnj9b8Dr12FGzIJFXjZbZBi8h69oBCaTEt7Fy3qLBd3Ni4QeQ7MI2W42duQB25/Ndt15PWyHu6r8Aj3nu1XMNyKUKwpAQG1wR6Nu9JRxwst/uGED//tUJOYKkdJoqeSOxlzOePQAYHutL49CHfhbqANSTPVVKS6UYtCZnUe+7By8mkOVSDPc0dB/W3qWt4HX3bax1AWmlUY1szHXiH5/H6TndkgPgY19HZL3RkFhsCQwQkngdQThwHAcHW5ug+/hLwCggKF3HqwGdwI+WA0N1QAOcAcgTBHIYdPs/2XuPeDjqM714XPmzOxs39neu7ZoV9KudlfNVhlJtixXGXcb5ALC4IYtG1NsihOKTQhgOgQIJBAIKRAky5YNBm4AJwHLkBtCLgkG7r25CQlXgeQC/ySg1f89Z3Zl2dik3O/7fp/AO7Oz7Zznbc/7zim9I73Ilentd48oMndT2aapYBMNN8GfsOKFF34Iv1n8Bf8HXAm/GULfPwhNeG/Q7Cxguq/7eRqpIKg9/oKBPphdcN2chGtOtdVReEP8jci96fmdhwsENbKV7DIY3SaSIRzRGPBfDPgC4VKB2yPcI3AGwacK4E8C+L0AXm/HF9ovs3MBu+STt0CbhzHar0OSJHFSpnfE81avB8J+U/9WuuV9U1Nvf28/guuvj3ik4x44gIfs708rf1iZBKFMg3CKk5empwMKGhy4cpk8oz4aLVQvbXWuXSLPqEvkQplkrexYJ1wrL2mtr+taPtXZljlXXtbaNK2QizW522qZLyueww+O/0DVCHKsP4h043+Wjf5wQZQs9kKjiLW7hKfJ+/A+DXl/v1bpNLTydepwPEdrswhaSGxiVJlGUReazy8DUffjRfyvqKg3t0xZQePKeSD7W0FXBHTzQTClP8ttal2BFzDhsJ4gjGWnt2DCQRAyiRLMyQLH0UtXc7dQEzfRd3EyT4jsDheIzCMEunEAzhF9L5zvg3OBy4ykMVjccThIrtc9oAyuTEkZ+tNmlPe4JaYYVEdqs9QvpHGUmj2+defg4M7B4owfvvAC25OyC3T7aabbThSSDXq9Ctklp55orFYNyiiLDIGm0xkQtVnRVrJlIGki27YzkXfYpbAtG41mc2BI153f2Q0mUPzeXmpMkRzGmfemtJyft7ik4sOKLYEtfIf5FpCBtiQDjsmAw2iXhsoAeg0y0JnEDDjLkgzGyjKw0gWzbc5ovE4Kf0f5ObxIGC79Cu6lJsPfjR8582/w9Dc0p/mNCTnjSb+BHzndj1Dsin+B3xFLfhKio16ya3g7Qnak1zlVFqTMbWEjJ94ekY5TZzHpe4XJv9GVraE/ocaq8tmkH+s78bN8sQd+86lS3EyjBpyT16nFSpUUqiggFdYKgqqSyET2BAomEiTcOMEZ0kauJq8SnkRlNqRWSwxBqc7MPmKGj1jMdTbZxj5iC9q4cRvO2NpsV9tetfG2jMkT9MAnPCEkU1WUPd5A4TX0LvoQvBnE5PnoIaACBMW1smp4/D05rzEVRDV8s1pQibzWn3PKThk+8o7zA+e4k5icQecq55NO+Iizyi+bXfB2aRgkpIGPBC1mifdnnPk0U+6RF5k2s1PpiDP3+asoA+cjL/b2b2XxB+gW1XlQ/7yLvuI57Uv0Bhp1MeAwFefiEMTERIiiU6JirHqtrGQ5+Rw/tbKrJbYkeXZkTdf0VcVIckmspWvl6mkzVkfweFs629ySqWkee68lk26bmsm0CNunrwkvjy2LT+1as2Y8tjy8Zvr0c1fPmBpfk25vzla3tlZnm9vTcGR22Ap28UMmVy96RJ6KRKwR1KJ7QrAqQeU+o2CtZblKXywlR0lKxpOldFrIzwwuIAin1lNQFCch9cPJQE0pQ3MSIF0lEMo+4bvQdzPqoj7zPdmldRYMv+R5tZTRtGl6NEQTVLepOTWwgPcPIJNk4tQmNZw/pRUzL46+vrJ3FCwYWE+pBphWCEiCLbIL7WnB+e/GM/PrnH192uolfcJPexpbtLvwdU/pd7V8juOqVSqdAWKywWjQgR1SKz4+Asw+N8Fxxbzdxr4UdAW4eryuzHELkykufO8VxSXoWhYL/E9xguLZOPL+oIx38SjjectDfc4RehMFsoP8tcU/P9JXXNKHLfSz66BNd///MY5YWRy5+6QwcgpH0kA/IUVgHOkYnWo3KVR8pxwhit+dFBjAl0LcFEtx6HO+1HoaXzr5S2OTzku+tPjn4l8nzk78VN+JH8Xjl0Gbb4Df1KBe2fsDgkmQy3Ac4uZzq7mHuB9wgoEAh5dFalFaX3VB5MEmGZKyyRcuZNEP0PPoNegsETJHRiDEuqQjwHNQRrGY1ymKI/0gXxOua0i0Ybt4Q/uB7Te3H7i0+MMV4T77zb3hPttJMbHEL/kT/JKEzBOk4ztANhi/VPmKD0/wy5N9x0Py2ZCAaAQTcmPmOzB4eA67KXGnvoMP8tw4jzN8G381/yrP81aTNqgF36F1QE+ZqxY/EMdFYhKD4irIWsBviJJBxtRVo7KrBv1CvOGf8xuneNvEZL8xyaW6y36Uf2ay7zzhM0+xW5qWGmiC+r+323WA592Ap4DuV2zPOMn2wKaoAtjB2LaQXWQvIYjAZcJMkL4ShFeo9jwPSZqMKJ3nNKBb/7ghAljUFicbYv+ZLJG/m1ki+Bz+UXQta3vFZJ8ja2R+F2sLBlfpOXoa18M/ylwP5U9gi49Mzncm6SOelO/gR06X8OCx4/wfUIblHo+fnHuc//9u7oF0NPuQDtIduTMs65D+7rzD+rfyjsw/k3Zw49sFFbqR2bYVLZN1vEsbKKjpA+jKe4Nw1NKAHIITPcRuWWsvoF0qyagBgcG5ZpdlIhMZ8RxVLApnjsMpMzYa7MqNn4jDtAf53I09zc099N/U+fAn3Ko86WmeP/8stuYC2M63QcaUR059GvGQy+vHnx/M1hb0oJSDoPD6ZyHHt8F1H7kKucgVA1JBfZBcAdCOfjSK2saK6TQEWzutrShz7mmpxTmp/EKfT1RW7DE3N7nMspsWVBysmGKNvzS5sCJA27q5rePHSrWhNtSDdg5UIJr5D1SpXcNKM12lZrra9dDOApoGLZ0DLS3AsRmOjdDibNbXbqL1JHI1AnjhrBsl4TEEz1mFCb5CZyjoM+mxT8ZeG5U+Gc1lRllpT4LePf/82PPP12aFE72jhaTopN7R58LJAAinABA75TlumsDDmhiZKEI5Y3ivgoACUvGxMh70VbxcOSqPuQncPIDb5GrVQvhHX3RUwNf+GJ5MfMmkc2W9BpA/18UwtqIoWnIQSeSBAbOZP3QaRaDFHhdcD5GrZK0la8VWKzJLtmcAQR981xVInRl9fTTzIt1X+sWSZuQoEzsVDKEubHeejBd+SOmw0rriajxnkXJBebxukmZo+/qeK2kN6+BEP3aDHhtAV6rR3QeRlVy53+iWNbqCe5js2ucNBD3eYeibz8f6plX6pi31TUv7VgHXU+SqIbfHGORBza6Q/U7Z5Ss45Ui0gJySk3M6vf6ArNMXAgGfN0Q7nmAdF5WO5zNpyj17od/OpgkAxl5//UXQoxcngHDYHXSkEBbLJ7RISveAijpLr9vYZfwudDlQh2ujzpjjTylcGwE9ST+Ib7z/jyDtQF2WXt8N76lKRLOO2EJXbTQLcNW6ZisIKZeVMSFoPI4eZXYeOEitfB/SYz1w5yuGsuBvOPArlDt/3pAnG+5Jtkp9x3gcfxW+04gCqP4ZAOJKpKbVwH3IhV08LeDqwcB81PDGn9/vchckG7YBOqOfsN96nQJyshGdalR43ukrtYUz1WZLutAN7Sr7jZVUp68ccLkQlbtakbu6JHf1syW5V4GrAJcwGAr5vrjldOh4SbTNdB6pkPviLlg/Z/h/T/U5d6YOFkcm+0gq1+X4xvHD0Gvv09D3BxAm9+8nIBuMMVhhBuyQChWUC9/4WF+fogvFrewzFnTBM8gEn7EgI8ABpmI8TOhS23oARAWGoDcgC89RQ/BpqSFoqSFotUbJLGv1BbPZZJRt9oKRYqkxFIyZdLpsAmULeFHRe6fjBCQlVf8grXSI6fOfXLWKqTPdpfyF1Z6FFpCh7zBrD0++hdQnqSvtGDkF3YWTnQb/e+YfXAwx+M4nSt9pQI5nkbb0nSXznfRtZfNbAI7VX1fnL39TOpmogu8hp8SlDUy/Bl2uqlMVjPFFtTytGx6C0YK63TJJ2fTwuzxVsolIZKN+VIlEPhqJaBwCCD+jkb00rMV5inJ97vmpcEwKLGMT3tWa+N5JcWSyrm2ZCBWA2guTwwUGzvgD/G1uyWSZPHoameBTNZ5TvgMeafQnk/RayRmPAQfJgR8hKLEfqI+ugMizgBAHuvwAhVvBBNKpF8dAnTNpSuHN0VxfX6G4k+rzEjKNu4YPwVuTTxH0LNnEProeHgm5b0DA6CD5GuKlT5rhf9TWPNZMJyyF7Uu4ajLtrbeUNkwF3TjCfwrfESnb0WOynkgcprYkQd+pNfUq5kTg0y/hG/m7ma6id8fvx9v4a+CzriGCOMgPhslNTyGcgZ9CmeYM/J7TnDe/e3sf/9tP3ez3uCf5u8niU3VRVGiVgiIbR0hVsYbjnqRut+Tw+d8DgOlkpBaXfPv4Bv4eJAmtf69e3zlJr98/odecMraFL4B8/SjZrgG1fhyycDU8IvJtUM/HB7wF/iA81SvUb7S8vtRJ/o49L4W1ehz21UbchUioNhCoDYRygfZMKOeX+QJcg1cCtSF4+tktAeDQMjzJtDPbJ6NoIX87cOXAM0o/WMQyabFaO0xvNK3spWnLyTeYJm4m8fKJe0hg8xD3Fo2PwHfZD5e+iyGEMspXOCeVsheVy9e7J6rWzF8uA6Lcw28GU51+QDL5kMXrcA2THbJexISIWm1IxKLtOVA7CRlA7bxkI2jPOsofj8KP9LJt3vJ0RN5bR3LH2YpzbOGlugIc2nB9Q54twERTKRMOcz1Fq7bWULHnrB69t+X4Qo2OV+Oe1NL6t6asaf6w+Sq9KLa3nnulQZhT2H7j3McUfz6D+XMJpWSrhCGt53ls0mu1er3ISQbI9F4ceXvkRZoDS0chB+6V2DLA9tLCFCWXDG44nY1GaqlDfuwSVy3FoNZ1SZ/CH1aN/4HcARg04Llycg+5h7xp/3OBvyh7eWBHhCwjK7IbI6Sbn5XpyRKNQxN08Q053ktTGrMnUJjJ42C+UAg4eALMaZh8R3Y5ic3pJKSQD/IOZ0CdNGTCXp8vFm/Xks0oDFgmAUkjuRX4uoGsG0A4fphsRTGyDVhqcPwP+wwG1eLg8Pgf5HqNU7XYCd+MEXwZ0DK9G6N6n9dthLdItpA2q5W1RKu12dzBaCbaEyXRaDpd/wy5CzUhNziGRuk30id0ClgvFVOm10J3S2g25yEfzlucTem0BLqeaW5rhnTgo+ZmCV4yw/Xdxpq08UrpRenFZtEoNTc/peI6Fy07iArjrw3q3IX8sHIMlo4BOA7AEVFvvpxmnOle+kd3lcRM9nZbGtexAg8IhD3kHU7QDuUsiJmSROGt7JTM86pqivM2z1gw83BzPH5k59wuj5DBl/kXPFjpkVqW9GvCcy6s651nmVvAf2pcNm3Dju7VXqkufO6aum/037hs1ZI5S+uKi/de6bm+Z2qryebtq/JqH7lwbsuG5auWUHnnwVgu49ciN9qzP2ups3IG4zDZPCCpNU+DcMzgG9YPuV0uQrjnQN0RU3gjSMhAtslGncsBbhvIt77gdgvD4x/u00iqxcLT5CJkRw5yz5CX4zDWHSR3I4+CPXjm0TRwh3yGbllNnQv4Tgn+Y8ePwIPi3krcEK5nS6hEGCRTqevxY5uYJws++/cEt8TddnvxwztbPNKi575/XeXSbx/98nPDV1/VO6Nrzq4Hb3rvYqbH4fGPuN2gx2H0DVnPEeIQEOZVgsXKFE8PfXOA4qmgT/AC2TqIUMh6CPplgX5JEkd8vKBxuXwS7ZDvEOlHmvF3D1BlXK3BGhrzLRpTQaMRTCEcCqkEYb6EpYPkdhSRPuqHjuaofmXS/emxNJuuAsoGvaXDGFCG6RcdNaI8UBMlUSKwGT3xDB3hNEkRFI3hznXtNV5f/LTqpbsyC87KtOM2r75n5m61evEyPV5RPGQ8Zvze8YvOM+jVs/NLZrWLouHL+bVr82ffdu95sxS77hz/LXGCnAPo8v2hEMbIxORs1mjbNQCGBZkBDgQscSuId5ts02NRY0cC8fJ+NcXgdj/2D5OLwReK+qC9x86Z7NhOjSsEYN6JgtKvpd/09lLSvDVNVz8w55k5lcTKNhXtFRKK2ksNJcnmwzlGGEud5CQPLzxRrL6PihZ/vatu0XSdzu2Mt9dt3FiH7XuuOrejKz9tWcPFC7q+elPXD9i46nnjvyGbWL9y6G5ZF0qnSDAZnNS9p8u9k60oFE+l08GKSHVGqGW9qoUuDcbjetOhUr/Nk/qtp++gnR6EPkNf70MF1tc89PXXtKcnOkoFC8+YP5nU6QzdWRXkmyib+6R+g0KXhDvxcj7ntJcF/oLkUau3jw3e3eKV5uH32jpmOp1jNqOHkLtsxizPu+1VLVMvuXTqH2+kqKTm1sYuvbJ7797uAafDWxNsawv+VO0N9oXb20M7SvIfxUfAHizorH1Yj0DserADAcDRg+C10H0N+FwRIqlixHiYbN+PzPhDMzY/Q+5FNiAtdyIrdP2T3v5R5iupGmcsrH90ek/Zf7GF1vGXHdV990zxqmcv6mq3itxg93TJffU5Da0Gg27JrrH8ctqmeeO/5URoUwBt3qfzaJ0uKjIPZ6XMzgOtckGrnNQe7TqTQauycio1kxqks5fIVrMcCBbMstMDCYrdL4M5+hV9tIO7YfqYNrMEBQTDlLFtLCeVWoyZg3WyenRZNopo2ERLXDyrz+lM3GwOSFLPaw1eff2rS8gcy0b57AuGF77gtKU7W3fsaHn68VtWdjXp1V2LS/vGLgMbo760Cj2wz4pRAHRn82BI42I6GAbuv37AggJU1fzQq5AXi1aHQBKVfFq0W/RG3qF1uSSHpiLNNC9NzU0nihVeiT2X4Pk+h8PhraCqWAP0405UTbtpzlNdZHMA0ha6SjQoJWimZZIZMpVUdPJkfTyBQgbTVUkm1FMsayc3QjXx4qLqXJvtTkOFyqB/oG82KOVC/J9z6/Bcl9NtT3RQTfyfr8x8rHPP7mkv2O2Nl49h1Z24YTqoZoO88NptVDMHFT2EeLMBZB7HLtnSiNa6L3Ff6+Zno8VksZvoDRQxUzgaoh62SgvuNhPCt4RwMNQWWhUi4yH8ZOi50Ach0gNPHwyRYCgT6gmRUAjIxqbBaNQuthsAaxMojweCfjlgGQByPXlIlrTI43M7MbYLdlF0CqFhcrmsvzqMw7LHVwiHnb5yDAOXfxmwkPsOJJ0sBDjpc2H8XdlIn8nCfGG1QATBDO0c0plAA7UHQRwJGuTA4feC0kFSl2YhYFSRCJxTceTLQQ+0ka6mkaHkoL9/K7y3FP4g/inGVJKGc4IQOGlYpEPeLfmcWeLeH/sD9qcKc+tSXvH8Sw1VLdG1+OuLv/WV5tCiZ57u+drbF31pt7Glff6SmQK5sqrKuGXhv7y/7+O3fqjGdxZnFT+kssBv45+ALMzo7CHwCYjFgs85hX3gFDApA0OAEO+TtpiwaZg8uM8qAyWmPbeA95c+6W+m4S5fdg55xdYmtI0FNfB7OOtbf+ejGa/2rLOvx2+Hem46X6Xa3bV0mqjSPjl7tBSvil8nU8CWHGjToKiaICWHy6QEQveGQU4kxkMKGRnQqcVyG8VhslM20AFXIQJ/V1ux9RlyB3IhHbTUSWkghOj+sXQz9dyWJtQ2OUqpnFaHSkyYT7hqSj0Ib+XCfHW9pZjdC9HpbLz/ajvJO6Z8tnHhLJua/zplHxcF0y5U5lQu1vZ1++/lv205wana9RPthwRyQj+FMnN6juxAVrBuV5ljDekmGJSzxKA+ovWCtKJDJ5OmnLl+EmkKmSGy4iuKBzJ45x/wlnXF0ZtpXD2GWzqePYrTP7qetnnsLy+9t1GZp/F74hP+D2pAd8nGV4K/QJzL0G3kKqI2OyMIOVQLjdagCmhXFKzG7vN63Jma6qq0xlnJTGRLJa4cJl+W9WBHAhH1JUl8aZ9O5zRLZdlIz5HtqB7VkQeBljtBHoyWg940M//VRBdOGu1NgwMr0wfKkHB/Ly5zIboVO2RTdMdh1lk4rytk8CT6bMLs/qISZLn/eHY64Ts777itdfZFxbfvj/nFisZ01C3E4m0BozE1B3f1noff+/ncWXqXSz9r4fZ77pbXNs/L37i8f7FT57d47fFMPmgyuQva/nydO5Fa8eTGLytzuiBlIg+BnM3Ii74y6HSYHYepSEGgGjCezUCLBd6g91os/DMlk7KQy/bxvBlrD08EXGcJGPAw24Gm3CHr/A47sjNI7RCEBzC1sNuRj4p/NE3J8ics/jKHD0GN0WeJ6kHbKBxrs3kzYBKdxLDMFDtzmM6ju6xll3xri8c8Dzt/c8PYmzuruEtnX8t550+/Y9fKaV3XvzvWRaYNyGcXf46Nr32NxWjozzXgI1LoR7J+j3pPgjNV9VRxPPiBjUOY4/TUZ68bMFdohsk1A3GXm3pwXzxuOwRd9gHrCsXjlQ6D3lRhjoSII0QXpHPQu6caXYHjTDxWlTVDBZ5lyFTZU8mBGt13oErPINDD1QGTycHepVEtdlBTAOeapmAAFxlLN9HZjWmWfPdCzKOelkIDHogaS7M02pRrYwiNKe41JoZpflEfFyOI0OFY1knkpcy56xscFki+VkaKhix+zI+vvuTrxf/hOvn3kjOvSnktU1sX8ULwUdM3vvXd7x7ddN/XnsXFzcW1+Qr8EBqPhyXvhgWzWjQa/Uyjz2+stPXe7S0e/WhP2a/hNwFPJzp7AJsQOIQNLPXdjNSlwKUEq237tCo7h4dP0LFrh5ADOxwWGv3doF93IpeS0VJP1tRUdrptis81lxaAPtEv6thwl5Wrs19ypB7Sh7PunS+G9MWvq8klM1bHA3mV5vrezm6B19wXfv/GsRd+pfjhMCi6C9rrR1cOEQ5ho4nFCC1l1bT0ptRAZL3HgYiNqNTg+MpkekiPfD4bX+4CTyXpctmGyR1DQerV9FStA+W8kMqT1U+oZgN1oWVllilJTKmpf6NjfE/u00R+ZCxaU7hHzes0C4+30M7tsVgMtUcf67qtv3GOYLjy3NYOlai/qvmyS1tWT/1Vw1Jmv6vA520G+7UBafyKbLnL9oj0mI14BI9zt5uoHHod9dpGu4PyURP0aD3YuYdsHEBYT+1XB/argTTyOlmjUrmYtrqeJl9HPAqUugxcbwfAdN9ghOc1tDgZpv1k9ksD5ahScZjw40qW1CsotZpIvJz9WsySigBVk8Ls5nScU8UGfnRRyxRw5ws/ev6bg18t/vsSrF92/dU7HH9+9Y8Pz82umt5VHC/+tXhsjKzY+/3iU7d9/+VrWA7wn2QVq+3Y5PiGussLj9eRsEurL9QlIYMvJOmIDy/mAkFibsDIqTFXV1EEskZDu4lQmpAEILI0DNAoBkfMIlh8/MMDtLfxeK76OcClCnBJTRQJ/Dq8GtGVyZBO4xQ/SOGUbLYUUvTGQiqVe5qVZwKkf4gOoWADKgad7gIbWKHXGsFFOFkgcQ6T62XzanGL+K5IRNFqlXXzdZzuIAsgn/TmMk2ZXlZYSPeOMhKW7mW0K9NLFUrJ0NIs9W4bpU6BJeD0f1CzXuWueq+zIVZg62mcUophm2f5MeTnDZOMKoCZ4kH61pnCmobZYfsDSa/UlblUK2ekVKuveWrC5ZQb8rfXejX57o3fL/7e/0r4lerWnrqWy/2bF/d0qnn97qDPurXLl2yZ8xu1pmZj3w3bQ026yMZZCyojOumcjuJt7/wpXOJCMssrbpM1DqdTkjAKBaloIoKK1iOjKEKzd3AlKtIva7xetVTKk3bLJrcxaMAGg9vtTyRxKkSNMwh8yT/JuTxLdqIUSyr8oKQ0qfhkgh01KdWyZkVjJ3EluqxsM3M1NBDTiOuk8VZZ0l6MxidwZPUbpxX8qYr7L+fsW4ofN1d2Lo2Y/AFjdyocunRFm8d81t3339aotunt1B9NP3L76ulVUYPUmYsLfJ3cvu9hy8aVXV3ZSx4vthZ/+0K+G5XrtSQJuKTpuBPj+HuyBKoT0DqdVrfHY7XGaX1+I8RP9DSE5AqgLZsH4hotpZAJFGcEF8AKBPTaUqDZLet8Zkny+cA5hSsOM6azDTygqhyhngVzrgScqlGYfANVUZyUUMw2XgQ4yiApGEHYGWtmy+82m2l8QmnFj+WU6hbzXacglohPsDdJhfcWf5zB66+/cMmXi39tP3dNxBjwm2ZWhvxbWh0Qwxc+i5t+fPTOu7717cr2Zqu1oyHEA1g9911Y7WoCDzD2l+KTP57g0veC3RewW079jv9tBXcoeajyl5Xk8eTjlQd5MleYrXqcJ9qENskl4nFT0MhVGmuqqYLV+rysUBCEfm9iFNABxyAcK8Eg9RyXzqvVelMiHotSCzXssmGbTZoI3ddCWm6KSVp4Fhsme2Q9nSQgS0SSwu4a6iuqAeA08IStkM5uA101pTPpnvTm9KtpIZ3OU+9Qj8LgE0zmQpj6BI1GW5AhXwu7qenXUVPvTafZoWTnlpInYNGkd9Ss7A5SIksT1p8xK7tqK9wS/mhFwITLpSgxQZRYU8rBSq4giPMn1WnJV5oau+cvX3qhyXi+045DodRNU2q8kizf1FBLeOmV/Q/UeNRz2r5MplkbFpy9fGBT284r2u5LqElD7XnnQbM9s2oXz24TReNVVbuvmLbw/S97Lls4t1UtGnYGqNxaQL9Xg9xyuFrO82qsN5iMJlPAEDQGTb/WjPN/UmtW8v8p/lpNWvkG9VyeaIiH1PAkpvbquESaOe+My8kqnl6UAMFlQHBWOHrJ+kG9TqM7BA5cC+Fbo1Gra/WcICSGxz9iup4AcQ5yXG0MLjDvHqsMVFHfkaZyWlV5dSUXrMwAWyOVlbWHyTdRoVyu2W/XabV2yVT+JhNVDG0ksiuwN8AFAnbqdYxGSm7H32OUzn6QFdU+SdPMmQquqcQDmFh7mUzTrN5GE0r6GmJMd5IvL+95TCWJ+jFbc9IWxJTp4TgkCPESHWbVKcYagidX3MlZ4bNyC/DSh+rGOtNcuLhf5gSuMvW1Kq+5PTq9oFY3rppxztUpn6an4SJyll6T3dfeO+OaD49idV7eO6Xxyyu7ZvKcUOgJtcnh+Zme53b6Niw8q0vkNRsrlFxhHdjgBvBVUVD352UfV2W1FS6N4gY008DdhegwRsT7NLFkhYcy6AGfzU6LRn5KoQc1lcmKp8G5JyE1v1b26WS7o9CjwzrKoXW6sLMiWVmZkjRm1eIUJAz74rGY00NF5QY3f2rqFQLXRR2YE7hXVTn1UlyYkoQx8pzuTdPsS2ou1zJZtKS1TGot6TPmYpNqmzQu0HXdCX5rHoent3z/uXk9i4tfvZXVdhd+aVtqbK6924wfuq3Qp3e69NPnPXrxrsK67iUNNC3dee+aCy/77Gdqcs7Sts/mR5T6JZnPuNpaWReWYuaslHXwjKINGbERqcTnJliaXiFn+zQctkxm0NsHs6wUcC9k5hrQOTvtf6+SU5WqMpmJMgwtatKtgSbuQUAeZSNae/q8ucWDtAaw6D9/c4NVxL85clE9bTLkTne1onKNi38Q7LYdr5CbSY0gk3aSJDPcK+T18g3y92u+K//Oo54it7RP4zZF+bScbl/rJqZ2j+xrJ6YaTcYgk+qqgqfgPqSw66GUzy42NlG9aA6F6aFCp283glWbUAF63Qx99sGxAo6ikkUcqO6kNwwx+IC9siPn6fCc6yGcx+KJeIgHY7eHOGsBGaWcVdtan2IeG9TnYdng88UDdrFU9xoml8k5QTBr9sYfiv8gTkLxbFyOr4nz8XhP4IMAlwm0BR4MkEBAk6lvq++pX1XP19e3tg6TuwY7zWYNNe0OhfSyO2/gnHtpzUupVjYpmxSnmYE78xl4YZRxNmURx5J1Kwaebxv7qFQgo0Y+USWbRMZKVbKGeuvJBI4j4XrrqUUCLSZ1Yz/1R7KVV+a82lRnn0qud14c3HPhFXmvvqrtfE115+ybcWvNa3X1hr4pHrGqcdWhm7+248mL7rwsdt7K2bGA0X59xGa/4OqH/xP/Fe+s6VsyvVFndG6rDBiLjxd/fQ+umJkvWPjIolVzspI1fOGK4jvFx0o51fgH5FbQ5Qo0+JTPC/I8EAC67XCoxHaaVwWBD69n9yw2goAlcM86ZNIbLVqr0agVqTc1Iofk4BwOLZORFjRbNlqt5qCUkdpocHX7DikRdZ+bw5HJPG87UJp7URxcwyMoBur/UVn7Gez5DOUvTAbU4OnQ9nKZCd5VMg3FMMo+wITDDflEfKLgUDaUGXZb76p3U62GOFEVj6euUolnTUnc2+o1L3znt7vNIv714xfPXbH7nKorn01dcvTFl/ecexUQvOv+feyppYq/BHvnEbtfEUOPKHcsnjlRm9xnC1p9fpaJukp8pFStlG2rxM3ig3Q8e0ZsE3tEXhRPSqO375eQWTJz5sMARAII71awnW0HPBUMywp4w4GQTbZxNpuHKm+cBSHG8qSPaH2zWYlJ5bsfX3QT5DSXyGFHDb0vopm1aHrH2N+6SRI93Y0Thg15j2FTgZ4aAiisft8zJ6Ao3d85TSl3EjhBgOc04ByQ3jVjZMYMnXgZnX0eukpL+X0OSOT3Rx+K4EiEQRRjEE2UfgGm3tPjlD/j3aLPlYjJIxSnqV71rEVdHWPdJ+rFp8C09GqABB87XQ2Zo/Vt8j6rb0fRgVKFe5ISDVkDFgvwWwqUEy4FJgHl6BHxkyJWJkVspjiZTq2C75d2mfaaONNh8iDoqK9scBar1V5+m52+LTJ/gq9WnIJUuWBOja+3f1LV/Iuq58LnwVpwAp+x6V9UW+85DVAYbeA249l8N1Kj/CDmOGGY3DCARFCHr8g6jswXsSi2cZij5RoNS7Z7m6QxcxPdirqZzTG31udzdtsfeyvVwnXzSGQQ+w4vSCoygO/m7mHfbUZbBrU6nZF+u4au/vgV2aXT65CE6b1z6Wodzuo2Q05/SgskjjwoYtaIXdxejmPNsLASfu/WE+3ASmDZajlt05yntPF/VlaqVdf2lJv6PXZIUSy6xheIDfhnSEKVEBw1vJZHJky0GhOHD5IDbDxR/kW6V1c+MzJyzNzkzoBGh2N1YTrSp8EJvFMl5sWGv5rGkTDitXTPi9doPdyvnvimvmtgbu6ch5OtjubL6O8UP9GG0EuoEfiMiyNIyOizVT6PxREl/mBNld9Xk0nZnoVfTEBmfgAZgbYdGHAZC8Nw0Bob4LBPJJyersnweu6tUel19v/YW3RTryPK3g3OppGcdDyXe2vkCF3eTrnVGY3wkG9OzH2g46qg5XQJqXyOljfyOUc+RydAKHMhKvI5bej7nt5Q7NMDuVXzZ26a0Waal41kpt500VMNLtXXemaebWupyn8zs8OUsrtSsYZWflnTxoqdg67NSd8rnZ1Nht6m9vs+3rxUTLhe61xkyhxdn5vZvHJDpnJE0Q/Am/8Jvhl8WQRVyVpksVSETFbRC8TuwKAzZEEUdYminn9rlE1MptaSp6CzLrCd7aCpTnvYHgOzSECXRLbbeSsmLxfn37Bpb6TqR00dba4g5l7+7GOVVZ65sIIT9oSa3AbjE87QWeu671tkI63dK76r2xoItWiWZ4JREy9gX6bUPs3vMN1vL4IWyO7dVnwJcMiQ12yQCEEGbPB6PBUqumbFgf1+yRwSCKYtt2rEEIjmxRfHci9KR5VdDqHdx4/25tyZnEuiK6r39iq9UEWp/rApbfFEgyWfA0YNukondphwPqf53Vi8Y17jpk83gkrdNSVQpRKCDdcvX/nwmrV3P7ywdtr23y55oq3tYeAe0z2t0ebiOyufXFn09bUr42CmjS/QernD6Gx0lRw1C7ZFCC1qampsyzc25jsTqXR+EfzXqzM0NjV5U+l0D9UvbzZCD90Comp29tlmvZaeGI2dcjd0Ks92AcizNVBybMUyKhFMFy+lCzK/PZKjFXnaRTek2S44y4H+CTWEru3LulrP7m228nTV+PJGxMqaWWxBKjj144m1gPmJvcvFvKO5vcUp5dpmpz79A6Bhq51qMxhd1W3zzs5Fm3I1mbqQtyZqU4spKVRZF/OGja6wtd0dMKvmyufEAzXpKk/D4s66bMZTOaM+GMzLHc2Or/F2X1gyp+Luh3UhuyPvr96woW9uTVqeI6cNnqQ3OCXS3LpuTjrs8Van0p5NiRZ5Zv7DaMjhMQrVnfM6q2s6Zvl9+epEkA4xQkhl51epXkYu5JQ1Njqp3igKGpQZATOkMGVrrTm2kK9IV/JlS3UlWsmBhk2bt0zFv/9W8cqudecsqzcn4iGtw1Sdz6telqySfgM8GG120RKcUuNjdvMA+g1/h2oT5HMptE9eF/C7BZdLZ4NfNBjVdZHFEa4igq+IfjXKzYziWBRHouFWHTbpgrqMjkDSWBFLVjZWXlhJ7k3iPUnclLw8ySWTuDKZSiSqwqlotCKZ8PttNrdDrRZI2OH1Wh0GQ0WC9iRzNKeMMKSPdHNiKuuMstaTheo1/I2MMK5ffpo/PgKdV/Qhf5wu26HMyqZ7Q9CMPEqXh0000JVU8+zB5ojhvDVsj+IoJiP5fKtVyketTktM7zbWpzK1Xd2mCnUur4twY1PxE6rXsLq3+Hz92Fsq04qemNPK5c+tz218aE7qvObbVvQtXKiJL/70e3j/rLE1wu6T8NNAVv2EfO6wiO8V8R4RXy7iRog1apXG43brtNpI3OEwxv3+azBO0JHRFszdxOGdHD6H28hBUDTFg3EuHkeEV6lSGsRxRFQ5rG6PURdPRvweqzWJPEmdjqgYcMffOmoBqwBU6JAw5gYmYadgVkKM7us9ogCcz7G125XrdNfNEjAaLLL6VCtmdcP6BmU/GWf5xghWT0aGe7l555aAOuLpTm/baWmuC8ZmdrR/V7VpApci2a2qilfVS7lo2OHOfmXOJkelQSsZ3Gapc5oraWK4edCfhB8J16MONB99ICduCOJrvfg6Fe4M4UII20OxECcG8SVevFyFLxfwBgGvFOh94ZcGZuX5YfKKbA3v7Lyxk1vRub6T64yGp0yBLINeN9XPCtfXh2eRBUa90+XywLUhs75pypQa8D1yvHve9vx1eW5tHi/O4878PMRFSWxt/fX1XH39PKPTbLG4nM55hyFYUC52AEjcIGobo4vF5Nn+FaW7gwqKEruOM8fogd0EyIDjAk/GPFa+t9dF96Idrc2i3vIfZjVCkY4FoGOgadwB3a1rJSx2UpdGWRmLq1QSdDIhi0F0p58GtqyeXYBTZbohnWQo/GjL5gMLXtv6wx/Xz791Xmxl3wWZ5Hl45uJH5w1IZ3UurJe9/pYlW2WdVUwurRaT2U6LS9LyRn3xdoNN5Ysv9/si1hy5b3pAevrZvuqqbzxy871Sd/XF/oZsSjKPfumDcKTnmp4KMKve+gvym7/mnxIyJt1TzsveaA+5nYb41uZL/dXq5LygWVIjoDXXYS3fL1aU5ofl0dnPoQoyhKoAzCFkQ1by4wOSDf4z14G0hgbUasvT5MfA6Xiyf59eb82Ghsn+IVcy6XKZ6TIioLxjL9Ldy+my3cr29Rm2Tz1b1VKZrl/aldYJlg42fso14ZTn+MN4vKE+EY/HGhtjcfzcWOcm7kAlvSMYj8Vi8EoCr5z8TDW7rjKRqKyrr4jFKh7+y29Unr8erqMfb2iKJZLAhE6cg14LtP/CY5P634nOfw4VoO/NJ3AYsFVZhykQVfCfefrngBgCIORQFpDY1whQMCCAAbx4OiDeBrL2z2Lxd2HTchI2i8787B9A6iTU+PFDxY85j/AYIsiO3JCLXiobfSHJXNDpsNMlIA6ypJcHMDaDAQ8FAhqPR3UILFMggwfcLhebXz1MfrIfobCG9xiGyeuD4bAAdv/6AB8XMtJrbAoWGztLN/Fgy+HTlVMzTWxDIrjEtufFtByZaLCGKYWKnwDFTqLmvJWRXFaowC8s++rC98YewksvWfC9/LaG1uVr61L/9cQTNzrtlVP8iR6vMHvv6q9+etUTLrcjd9m63nVfvuCrn12Kn8E/PSs+u9o/x6NhfOq72IVHyVdB4J1P6disQpOZzS4c0sNRC13edwDCBjKZVHTm9xDAAZxgGPuuAyVIswBJ69f0TmV5aZK4kjqoqM924NH5bXPXLksvCU8NNryJv1G3aO+GO7c0tDTUJ2fU12eVdZ/Hh/DvIEcRkXuIJ6B5DFdEPd4oXYuUwRKNkIRlKsa/63785pq7f9mMY8W9fg7T9QMO4ZjQTtYA5w6jKbLjEvf1bm66a7HrfBcB/h09iX/jM/FvcIcnGHjDZAauKjPwer5jbA4j4IebZ1ICTo59+pHG2tR+dorgrwIB9+OYQsBn+bHCwC8LeDoEblkmGDaDgtQrOYK5OI98yneBVbagf5dr1zfj7Y34hjq8IY6vjeLtUXxBFF+ow0uasbMG3xDCe/T4Rh3W1Wiub8SNKjXkTK/LGhQLJ/0J1Bamz8y3mPEm85Vm7mwzNtsNak3V0+R1ZED1EGp8KCtld2VJNukyJ82cBt5xbQwvieFYLOGmAcaPEvCYJK8ONNZMocRYo9apILYdA7Hmn6fLA9LAw3L6ERpr2CSWN0ak13MQQ0alN14/AjFHomv/9tJ/pSiDy5Empli3CtK1BgXcSVrtjIg81WYnBHsVO7WE4TLkCiFCeVM9+fTpPQfGdueDHkNnw9We7tWxBcvX3irPys08b23xpW2rrzj6s9Try4p9Fe/jwo0Lly/9Y/GDNy755OG15xn+dMnSwd4l+ppvnXvlrx4IzchG516yfu32uKfJkFzX0lBjvahw/8LKH36wdBp+fOGKf32l+K/XdrQz+YwbhF+hj8UweE4PWiY31DmnOzmHM+7kBCf+jfMTJ/eS8+dO7i7no879TrIXPQQitbkkjVYvGiSLQ2+Q3FqNKCC6h8Dx54+ybczfzh0/kqNrUfVTTevt7++nc4DSWMGlrsExleZINEUS87mPmwptt/t9sXbtLLsu5brk4gUrQg2LF6xQHW6pSrqnxa1nX67qevC8+LkIj9cJA2hEDIC3miMnvxnG14RvD3Pbw/haO/Yid9Cq1uhVBrPV6/SjqN5g0qhVvNmE6LKPx3LSsdzr0Dqa6pTa99YRsIT+UusUobXiOkZjSyIDKjYR80dWbrNXOaCZ1X67boHDMq1uanWtM1jRXlfrCqt2JMNJKzS2oWe6ao0hWhFsbK11xn0Bm8uJuOIxoQnXiA7Q0Qo0IF+23Iq/o8F7NPdouMs1eL0GL9fgbg2u1DRpOJcGf1eF16nwcdWoijukelnFzcd4GobIkscco7D/g/EGG7YZ3Raz8Ts6fLnuBt29kBYgoxYXtfhV7TvaD7REy/FIbTL63TanSasLG01muJA5duSN4zmmzTlaBXl75FjuCFtvob9feuv4EUsTlRiFhEmt/IdtQjyhrNrS4LAnRF6M1jdEaAFC4UpMd3FN8Xda3fI55+eSVfdYig8UgoEnNDFNzQqruWJRfEVtAKKCSve8JVUZSMxc1bymc/umhcEPDi8iljpzVKcSOMQXD/BjuBvkS8BDx1AV5uQnfl6Jj1Tib1UOVXJ3VeJZUdwYxZVR7IpibRT/PvrXKPcVw9cM3zGQZYYLDZcZSJNhpoFLGrDbgNVsJYr3DHiP9h4t9x0tXiT0CVy7gPMCrhCwRcBIwP8u/FHgBoQfCv8qEK8v4A5GUvHvmPB9JvwVE77chE3820b8qhEbjSo1r99recjCWeIEcyhuNFVwiOCKZAA+4/M6VGq3A3Tt7WNSyRKOvzECYe4NAPp1enK8n8KdZ3kVRVV6+zhTRGojCs69/SfOFCH00hVYGk7B/8y25KiYG8W7Tsjh8TPZ1ifTk9OLT00WRuBUa6Nr8P1EuA188M+AHzwl73zYju+04Yf1+E49fkiHb9Xha3V4re4SHXeH9hEtd752u/Y6LVmixdO0OKat03IOLRa1+BMt/q0WH9G+oeUOaPGjWny3Fl+vxcjlNKk1vNHkdBlN37DiXda9Vq7fiudbV1u5diuWrCFr1kqsnEbNc7RONgIAsr+3cy9CmGQm/TbdYqdM8/tP/mNDMyCaCYkYaGkbdihqCojhxvWBmL9xfnFUi6sXBQSrXS0YvHGn2a5TXfmku8ZkJ/YuX5O2R5UxBPPJKlWB+sljfJxLqB4CvaxBj8qOOIplY3JsS2xXTNCSWNbhliDJp6McCqKxYHPLRoNYldTYClWCGOzxrvJyXm/2A26c4zi3wWgz2hwmKShxooSFIIkm2aQk+GCSVAXZipJX4wexgIdx6jq6Wtbzb6dp0Ul6a2XvUcpB6bZodI5Sbx7yeLqU0RsveY6PpFnRpkl6bdXKXhelEXQ5WmXQUyKewUqgV4lwypJMxXpZqYrWPXNcYuyxmW0zrFq1QTT41VZ1yBbijLxRFRc51Vme7uxVc1a3rU64X93CxxdW1VTXyrWNgYyxPeUyqElQBkZ49ZJQ2hDO6CN7cC5nk9i6e1V8HGiyA4VYtbQ2n89mU3QnS7U6nAoFfL5g0B6yAaV0OOx2m2C0ZfN5n8Me5AMuG4prRISAER2Tjh8/6mxihSqlEkPLVpKSGeapGrDh+WaWA9ZmSZQt18c2XCpldFMxSRQanLYgtCVhddI8kHl7OkgkQ9eappTHsfa8czqnV3N3jK1r0hkstnU3BTNupxjMGpyZ5028yaDBRMNrVJLWo7OJcCb4anN5w0JRbYxNCz2M4/rmJsFnsDaH1MU/tFXGtEGHYIyLhd7M2porHXnn/bnlyfOoLn3GR/CdqkE6jxm1yN5AwB9x+/1myU0dC3JTt+IPSGaz1oYylLK9DYGL7YSXoY7kaC5fKtCBiCl7prIsFYUhXcUgc9YzeELLCXhhdEbkK6lYXT4cjHrioaDaL7sbm5vm2SW/u8JsU93SHpOL7dlCTTioEUx6vUWlj0b6KqPxQLgrHIlnlPueG4QteIeyfuJ+tEuFiAaIcRK0c4SuNuRRikIUVoC7FeMdFnvFtrNM5sglKp81bTHWhMyVkrFW4YTbBA7fploJuVoNapTdYV5LEPJVm7QVKa015UxEwtU6jYnwtF45kjueY6zi+FHpbbCBkVx5b174OVqCUtEZmZOJFl0XgzbE6SgvVxXE9fg2geuwedVTKpsTdQU3WF8gWKF1WvUCp1V7NNMDJrXaFlUJuw1+U9LhF6cQazoVMFpsnkJlUm/zSUaLOuBwaGbbYzqV2eaVGCbj/4V3oFu/AJPY6TG5dTIkHHoIO/B/8O9C1POj3pMzE1nHUhMTwYR4nyH7kZ3sQxYyJOtcLtXfzFXYnMW2MTY05ww5C5m0HBH+j8n5i7czm53RVVvbwX18SiJTjGSmT89kp3Ugo7IJgvAvkIVrgN+YkRP6EAYvWYkyqAFNQTKai7F8Q66xaUpeqC3UuVKmZG3WGG9uFUOds6fNmi7MnNPWoQoQ28wZdeCqk6lkNt4a6gjYZsywBTpCrfFsMqXVV3tiVd6oA+udSIu90zsbWvSxfKMuOndWd6tcyMqO6plzYo3TorK3JdYYlaur5WhjrMUrGjMhW2UqYEm4VMToUwsSq4GD18yVj0oBif4po0qblJk+I/m84mPoM7ZDNHu78njiM/DHCoLKG6VjI3T2FvtY6Qq9QDM6OntbgDwXQ2aL6RGcc10eR+1RcxhPui6EzXk7XE9Exag1b02IAv0aO/zz4rw5aiZRYlajvndw59i/FJ/B07i2vr5Pr6Fn/JXFw+/0/aXznT7cyV9Fr/z14b4+EqRnY88XD8NnDl5W+EVm+xsXW+f24Hsv/HDekxese3Ljxf39/JXv9vX1fXYVEM1f9v21re8d3vMufLytD/8KT/vsyj74xndw1R13cBcWrykW3+fWjH16Dpx34GfH7sG/LvroP/BmASxxOY6uzyCCTSw6iDTjfx402ArCsHLEbEk6OCFYB0nDMBmULYjjtLxKVsmSraDSqtUGPSsWHFHWzDKzusHIG8CllIG+1OHRfyYMx3svuepi7L706m33b9+1jbt02zUXF+/qv3bLbVu/vK10D9nF3S88hRKQfV5zENnGjw4azQUbXefbrNUXeNnugQeNucDzbsMhchDFyKEDynJE7lpqbGkwNhc5uN/tTtaArQ2D3ZlE2WItiOIuet8zEkkeIkOoBldcx7b/Y3Y2OjFiEQwvTfeJAdtjrccTSyHUFcqlDWXEYqENF5R8nNrhZJvk7q+olHMdF8mF9oUp2ZjStmBh1lX62fuuu+zb+2cWartnFvJd/MHWTF1H1bRpjkhqZl3tnIsj63Z0LMAWbaGxY4tx+ebdAzd8tjE/c1auMHPW+DjKFafzb5IBS1zYg5AkCiZ85C8XgT+7HN3OvUfykKXcPaSjxaAwhcoEJ06rSzbaCy6XL4povQKPP39AYyhAWqK10ttNPl+UFoq0Kq0gaKlcDdGoy+V00mFMOK5iI8I12oJKkIymgiAED5GnkQE7ADU6/YPNHQDmkqH/0foKvRGsFNwATvZoblIQpKGOJtf1DaXihZJZiydqRc567r3sPef29wYNDqv74nwy2zr/rNm1umQhJrYkshc2Z1bdyLkfiWfql5prEhFvRyQZWtTXuSStqbnGLSTqI5Vxf6QT0X1krFiLH1Q9YInzv0bILAqU0dyLzLIGo7DdIMnYhTJ1OF1HdW0JvPciUYuCqIDuoyuHvztoYWPh3x3SmQuximoKWxZwMGhShWxWsCOn6BfoooL74X2C3+98hhxGJnIcVZBfyDq7aLF4EPIIgm6YjAx4PNXD5N/2Z7PJWEVF6BD5N5TEUwE9N3XyTRnXWFNmjJIg6vWb6KQ4eJZPZ9g4IHP+yowr/WuKIFJ00IQLJ8IlnV0inljWkbEJRo04UEhgRg6L04EvCtpTh/qCkh2yXptfrwtWONK9YYeV85tyFiKEnUazLe+Uao0W1Vq3zWCSa6KSyWqHNNjrMPotPoveVCCfvjx/dnKp1j/HcCHe/srOXVVrq7cWL37wCFsPKjd+HtnO97N7YrPQyEFUDaqnAegkGR4IU0SdpWCh5iqnO3Ld2SnD5LBs7+jolgHA7u6srPEDsD6dTeujKhmLhSnkNjI4oNUaD5F/RTx5TdbJuZaW6en09Gy2ngI7fbprmLw0mExqw8+QV+Ddr0BjhgfmKEFYo4cgTIFO0yEf1JIB15OAHsu5M662krKa2eIIdPyyMgJLcVkoXa4TT/Azqr+TasD2CfV1kL8hHrJ9x56Bjq78gvZ2c+PO2h2bFi9O9+zunJNtXLI0HmhzBL0JX+WyuWcQF17zrYf3m3RepyNq8LfW9mbWp2u3XLBs7fk9NwmrY6GYrzaPx88oP+ZTq8dlvED4b6bnD9IVN9+VtSAgRZ1NVCRap9NPReL3K9ptK4QETE8PaKjtl02B/GwwU4ErhkHbNVTbERJoAXlkUKdLfrGysxn7+QydN0JF0NsGup2nw15Pxh6lhX9K16efAbz053S94YxQcRecUdUBw9z4Y/yboOtT0dnow4OoFXwFQBgfHn9DtkGAqizAQ6oAl85qXti5vH02U/SFC5dTVJcvN7Xj9vYQURnDiVC7hryKVABnEznKKpsOZY0wxzPk58jIYB6UdWd1zpu3pLl5SXv7DArwkiUVeVZW1WqrKggAXwUmsE+2WHrDT5MXwAJDwCfhS0KhikPkdeSh4FM9T3tG6S1gzygbyk1DHAjiJGsYbUvTsZ+liewsGp7GGFRsK27GPqcqKxOJqnCk7M/pOBwmHmVNjTSOTDh6R+xvCJR/U89F1+SWrl6WrpvfPX31r35SfHxg5dqIp4Y0p9o6H3/gsgf3/NLt+326o6F58doLOuZ8dusZhE1CoU5jdeH83garlUjtn15z2fTZd1+4dekqVb95ywuzd+zIVm71WvWttZ3brlx0/vwNX2A0GN0OsYHajA3lBwTeQEcGSeRn4I9+gQyg6JKkFngeHQRFV0/ScvDizGnj02rpgs9pI1fxRTo3ZfwbwhB5HtGVXm89iCSaWoCaOQqQX/iDgWHy8lAohLUWDajUUeSEJrrgaKGxHjxoIOQfJj85EAwKNKrTdVheAWYPnhIyWC3TGY2iMxoNuNpXkIBTEzrjkj7ygJZAv1zKlu7KAGGmIWMlvcAT8lfSEqcjH2YDS1gGC3xPGPqs6/mtt6RMTQGH3X/F5u+Qnvr2uVWaaWMvzPvmLBzrXDTYuyZ6rrWmZkbjJe1TvFtuyj3cYNzyxtjYrYtuo/dIEdZyVUKIcVM3MMK9A8o9rn0Y8yoRTmSTCdyU4AiEDMARAzEHDSJ2e4w6Kz1AgAnwv5/s4zhBVMGJrOf5SMBjt0kOR8RDY4haXRk5RF5CEqSAzDRG3eYmJTugZgNdzSu9BzD+Gy4rc1xKV5VUnrHaSTcIGxgAYunGTGll+9fnfXN2+xzo9H/UzDg8M9sQDYVNLUPRy5ZelKmv1viaso3X8q/sXXLLk7cuunVs900zLvKHW7rOmdfDP77KveixeJvXU6tPRPNNbSzuTsExYUhQMVwq0L6DyFXSjADVjFMx0gmUHQtCyOIxM0UJAjohOHqU2/anonSA5w2hUDDoLWmMGjQmDlpFNcasaIzZ7KAaYzijxpwAbkJt0pNgU3IChtwXKRF5pwQbWX0GTeKfKoH22Y4zaRPokYLXwVKOk0S/l3U6uluFQB/ocNxBOPqGSyBGToA4hLFOQXGfIKi1OganRmY2U+EI2BmcUYCxAo4BOBoYnPQ26xDk2ILIU2BVKg1QEwBWrTZXVESjwRKwegA2hRwMWLsCrN3uocCa/yawih2eDl7zCZBPzb2+EGvP3Idm4Qv/FuDCebctua3457+NOvVf9cV5fIhsB9yz6H7ZWB3S6gq+FDxcXoODw+P7hzQUaHyIvMx27dFCtkGIUydGI4cYpsf2WR2800SNWhQd9JqTvFrCF7JQdAuPeUcEEHU6HDmdzk+hS1PoRpWl4fIQ4MxNvU0lqJroJqbmJjgxN9EEr+TIehWUCLs7ojpxf6Q+zxIXBlQ47xSjJ+6+1hPV4gfmXmmbY5XnF1Yko7Of6ji6arp/iy/2szve2nnvuy/grmHVf0z5t1u+u6yvp3lbFIt3r7gV96r0akt/ZJbPYHy8ombauTse/cXGlboHk9n1l//o29evPdtH404Zsyq0XTZWUsRcDLEU9gJi+wExkQQDh5gJH9tnsiArvXM8QIiFXrOSV2XpFvgaSwAs2Gqx1Iiim8KS+DwspyBShuIfgQH/+u+GgBv+272f0BnBz3Tm9jPqDDXO/Rib/r/RlQmL+mdUhXtk7jdm+/9unPgfQ/Abu+/vAAujVTjGDfLrkQPN2r/WikXRYKH9N5sNhxQOMGSxmM1qw6FShuTi1YfIvyBR6TadhNJE/QpSkiG2ZzWmowxY/Z0O8s2HJ0rS3GBRbjpbrXPq/K4UvibXeqvp+93gWDuq462xSotpcNOe6h8uPnTXn+g8f9oulRVk6EGbhtY68YTAHDqduRSkzaWxKaXwI2s5zq6jdxT0ZtpeHtrrU+tpe3WntNdltjRNROVRts5PSUC9zN2dvgP48XkPzcRPnq4XwuFbl9z6qeXzXQGMZ413kd+RLSiA6NiwFGifJQXxgYfkdlCjJLn0yNFEQAcnLho9DHo37Z2H/HRAX5BoHqsir+3zeNxue1kWIYN+GHuuy+SljxXvTqXg/rWL1p7KzpsloV9wm4D8buWCHRfPnj6/ZXH3DHPHLVN23XjVQE2ss2lBogrHLrrkwtndNlPI600avAtm/9c5PUu7Zj0wZ86S9dTOWL+YnUXQbbLOSXvmoD1Tl3oklo6qcs98J8XFgFny0z4GoI9SwUb7qCWvlQzuAEL+QMDvd5clWWGWTu5tiV2hiT6fHLaUuPU3er8QDAs3nRkCZkqfqb8IBwyJ3EbVbWQp6kJ/GZJp/SxAyxYe4AHhEE3waErX3t4xpVBX1dGRrKtLHGJjUX464A66DkEiNwWUGbKxZ0tDICm3MpE3B/n22sIh8kNUB3HNDODV1bVrkklTIpjgEono02QEHLyG7nOiMQCXaPd1dLTRFLEFqMFIiaV3IzejBi6FGrhcvmHyyiCyYiu9xZjpneAHH1N+0Fs2jHRz6Rl78hEwWdCsUTqBlzKFtjF2l6G0ZksJbjb2W0Xvykwgzu7AnUjr6k/Ani8PnD+xeUPpFdVtPc1nZ1LhzIqdVU3bbz/+4/UXpyoc9cmu6qceef7uZ2L+uoU5i3vnqmRUFJOSI1Y52+kOOuOdGa0Dx8IVcYPlnKX9HQu75j645AfL67dY9j46/YovdS68s2/FjPaRBW3Lv+Z3F/xTo81rzk1n/Y5cUyq1aa6v7TIaN3hFjhMcbwHefCrHkzVwModKOEUlLIGEq6mEc1TCZ6Z7kkZTmDt3Xpfc3jhvHmhCnsq/APKPpSuo/LtA/np9I5W/HeSfhqOXvPmFJHCmXZrbIlPtaC9pR3v7XHuhYMoH8xwEIqodjZQRMu2w2+cm581rm4vnzp1Z0g5KHBehGNOOCkU7KiqSTDuCECT/Me1gl09DK0+nL4qRnoZmnkI0/5/RJ+GqyZQUv/lPa9eppPV/p2sc1TX1T8Bn1KJWuvujDRykEdTJSTXJRx/qaIirrp5wkCa7kepKM/MVkWeV4Az6QgPgmwem5jBzlsNkZD+ORDC25EDQL5bcgAz+hAraqAjaaLRQp6o5KUP42ENDIx0DrDjXz9v8aOlWTFhVrtt8kTyU/5QyZ0HhOioxnKtX/+TTcwJbby6eAXzLpWuXrbnDv6B91vIbprV9c+eC7uVta2Z245HVW3HstQu/dGa04+EZF1gLDnfPzGu52oaQMxePJ5R9NBjWPLXrOtSBjtJc9w1mvF4KdOiE8Q5iHGmiuNfWsiJyBHC3ui0Udxmu8nz8WYVwgFulvrpso7IWobZ6IRIJh/1UAkI8LgiO+pIEIHihaUCrqQQsigQsltMkv5+XgKvpNKY0OtlsFLLyvxKIKkOTtdZ/Vip8H42QG/9x0bAxrfxjquWoGjWhmw6iIDhYg8lciIm1DWbJ5a0M0JGbNuQiP0OV5MC+2tqGBq7ESmUpFm4QtdjrCthsZrPLJQ2TXw4EAmE4DGq1uOYQQA+q/9RUnJE+ZqOSS8Vjd9PEDV+q4WN0mZfRtjylD2zAMgMWh+saKGQlrhBnY0XoMBojpuNolNqleDo4+cc+td47beq0JRaHzRSQPK2i1yU1ZWZqtUYxYIhWGwXDk7V3rN/d2fL1defOXDVvWft0PPjfOPYEttjrqs7PbPjSyqs7VgWbtxQyHrt4QWMl1vDb/8+iGUuD7ec7u3q6r+PydSFPTSQN6W4ZPwJepAUNHUTR8Q+HTGVllg0YV1fq6qbabb5gdYRi6UI+wLIasKyrmzpVdYI9MyV2I1qVQCjnq4xN1RmFoC/ictntPp+NYhuJxCi2RqOQo9iCUj/VJnwBtkqoUPjZ5zA+ocKKAv+zaJO754JXH/pnIC8xu38cd4xSNL/ku1ADemxwVxr7KcsFb1I7PH6UFvSzw6VbWIYQXGV5VHT8lwfgPBpNooZnmAYfo657wO0uccFXZZuBlv+jhkQQoxq43oBQMkFvpOgNhUSiKUjH2JvNNbQyL+IAyznZAll5ulLRBO5pJaFhOWcmPZouLZOFxUnZ5Cljk0s5p5O+ciIFZXG0gQ+Nvbb1pQ2748Epvi5lWHL7zNpZ515w3YK+bWt29q1avzX12jmHzrt6/TmDN7+VWZkpfvyY2b9009ErzjurOzK9PB7ZPcVgDiWa6Ijk+njKd///5e7NA+Morvzxqq7uuY+e+74vSXNqpjW6pZYlW7LkE9/YQgYMGJxgiyuEyw5HIIEEQlgScmDnJgmJwfJJIHYSh0CCgGwIOQ3s9wtZku868WbZXMSjX73qnpEEdgK7//3Amu7p6a6u49W76r1Prcyu33TN7R9ZuSjkgeh2kIesT4XXKC13o+9P7SrimNqrbWqvSuqSqkrceox9NuhfZgNmlP7NUIW9+3FG1c8Ci94XCmXh59ysGe9GyAYdnbFlEwJfpjd083wuq3Z0NtubgI52ucrQ0cZ/0NEqa57X23M5s2JH/g/7Hf9x5WdWcj98l50v3HPPqnv/Kr77EZiZQU6c0uzUHLanhYsgNsCUJSFNDq7XHtDsFF5Wrtu0piL3PB2vJtlO6HPt+WhApicl2eQCsj82pTdIJVTMZtvaYIG8rY2tpyvrXr9V4g5sWss0+s+ZnLKe3ttTqchYVtfTG/d+rn6vKYvX8y4UkEX6uj64mcMDsskiDdC3KO9As+8QVjeey+Pl/FPIJ5uhngtk+iA9WUjf06gYBv6JH8I/gb1BnqBkpWhUIDQEKjReVXb6gBCdh2p2/HvKokGXyNB+Wi5cSc8gim3vAT1YAy6gUZMSYnLANEebiCQZABa9hSrXotvKnL1N9E0RenTPY78HEcp6PMnAYfKtfdlskuoOP1d1hxISme5gVXQHq9UBuoPxLbpD3Y/ROc+pCyEUb1MXZmmS6Qp8HZZF4a8ZqRFTIdxxzudX4a1/3/aTD3xq+dpKyt6UDeIo7uL+7er2/r5Fay7MpbY6PMV4rDkshO5bf++b+/yRkWUf3PC+lU2edRtTt94UbSkNj1/2vqsvOGBZV+xoTrX67NTOWjRzCf8V4X3MzgKN7MdTqw0A0M/mO3BT5kOPyYa3LUTsE4RW0M+6upoh10WWXc7HqXIWYWs1v3jbWo2R56uwrJOuJvKwVNPbG0jMWZEYojwYOtapdKzTGWD2j4jFt9k/TMo1pn1jXaKTyb7T5eK8hQll7tcXdeZ5zFWfuWqvQFbi3J5vhAPAmma5brTMfPvrtddevu7WdGKgJeQMmKyXX/yDn+45otWnl2bWtw92DWy4eqhrt98YbCnlu1L+vBBXrZQ3X3xy6/iKdV+/5uZrr7Uvqo62Dfbf3Ne5aOWHK3mP3dVUOn/ykqv23DH1aJ+1uZCIJK1snZ/qFM9pKqgJLcaRI6iDDgqlXtox/yrri0EcDI4k7C767WAxjdPpETo6R2SrCXaTMJnKXb09Q8PlERihAXnoKNU1KqhMfgwODtRClTZX0BqgYysFAsiq08p6i6TVViEQQ9ZHZco6otEq+hb5PtgrEDZgo7TeWx04TL4nG6Oy3NvbMzwyNNRzmPz8gHUEj4x0H6VzpJkO5Biq0IEswzBSY7xcBd5dULhR4TAEaWUhJOskVVZg6a2OSOYr0rFlWor/pBJxRD8UKC27Mrr9lVmdpcj2eRo/Det6bDM2nMXqfpTtZdXqTEP2v+I51NYX7vpx2T1n1URBq6vESIbexAKTNdqMg5x/7629o/l1Nm98uePKL8U9fssiX2LvZsfCVE/UZbdUpRZ8+enwHy56T9HcEo+7rlz7Ze7GGyWv1zryHo+pdA25473X2gwBF9EOFlxhLPgjq38XvcXhTrTarJy2enpDZ+/H1++IrHYuW51+by5GVvgWvr/T2BVqKlwRFf8OuOLDyMKb6bi3oz0sugMCUdtgWYtOHx9lb7KFngSjlLklE4VWsQxjnEkXKEP7CQPH/jFbCtSgDB0sQzqdTCZay4UCFaY/31cuh4/SAQFDtBPZ6ECJynwTRQ8MlAGngJHVx2fO8LyGvMW5o1B3Nc3xCCiRA5pGbytGT5FT8aXo/9C/cHTz5rHBmy//6ncuu8rnykbaoilfTHRM7f7qPQ9GvIlYod3GOz2RVMBpsHZygYjViz+357xVyfDwsk+vHV9+3tBmx2DbcMeQfP1NXfKG81/f9+vvej94eTqlN9vNhkVyl9099eObn1diphO1Zdx+7leoBd1xBOloXwYj4Ar9i+yw+6Q7HXd6uWggIuu9UiTiSUKmtD4g+/x0Vnhavs0WHRRJZCLPTnk8iGp+352KRgHY4fDBnMlk1+sFYGaiHdsZNfsoQXrF14Dz2yCOrv8k01dOKoTMsi2zauAF2/4Joo7qxqIKKMJC65S9VD3c/vd9+YbP5otGi99X8iS3bV//aL+1IsXC3nghnO5f29dXafNXcCqSWbzg/k/J6b7yqlUPrtzl3/WhmN8um5qcYiY0lh8tpIdiyxXdbuHMe/g2/hrK75Poy0eQhvYIJSbPYdUK94MLLRJt6Hb7MI5SLn0IxShVAaTWc9QEPEQ5NjO3HyNPw65jstFgobaKKxaLRoMqT+fPtMrMvOWmtwtLdTE0q0rLToCenvVG1X3HZzeraVdy3xn7zAjnuOUjtSfnms1P3Hsg7C+tamvik3evvfPve1++dPJtpvHF65d1Ta986E6mu1SxgfOSSVEjfEyNE7qQXE2cLCbu6gOibFYD4Uz1QLgzx7o9rsS60c56e2Bbbm5gW4QFtv33yfp+iXNj2VQ94V1Err2jyLR3EIE2R48j+2hf3KHEB9bWwndqFfSjQfTTIyitUs1stFRPXz/oCL298oJBWAceIM8eeOdhUvt6+3tAaejrGxhcQE+oUnGWMKmFZwmT6jxrmNR8ZWE2Rqp/vrrwvwmNqmsa7zoEqnZ7fZ3+3YU8vfmyql2oWED8z/BnNL1UkxPR0BE6Yk/s4zgNRK7peRDwPG/V0W/7jEbrY+QJZCaP70c6HW9mYrmHmlQM811hWJWimlyvpa0Dxs1O8GcqG5/KrfpZwLOJHjS9hWxqRbYp0VfyONnJbD1e05yLiqgLfUPWk059SqdLmPPw0oqy4Uel0klrcjCVcnq9iSBUyulMqJWSLTpNp76UamtORGwaDXqMfBuidg+APVNqO0y+LZuaYeY1N0fMXq8Nfo4A7HUANhE7NmWxSxFq9dA5xOIomDSrm4o20Bhm1xk7FVlnY6kaNjWhhY04uLsTDJNiztJwPWVrNvSN+T8UyxG/5nZb7Nq1ha7hdU28yelw2rVOrdFZiKd5LVnYbxP9mWxbID3sdbrtQtis8acG4gaPudg8WA0nF+gDXm/Ka0gsirQvaHG5QlZnUbSFosWilF7jSQftTk3Awfq29if8GbSRjrEVLaQSjfacwWCCnrNQs1lvlSwWHh1WRh6u8uQoG2TTGQb5NNt0ONUY5PoYS+fCGLPPjcVcYmWuKd5dzCfOybYkmExdJFxA6ayV1iE6l8qmeIR49ppKERXnU5BaqKa1kIfyEoxORiidfEPzYdhFEX34gD/Dm4kT6hyD4BGjWYrFMoToM9Aas1l/mFKGiSCPmc+QcBIhD6WEqXA4SUn62/v0ekYHSTr+/qAElt6Uw6UcLSI94hDls4wo6gGTgJFvZ0Bn6pJzVgmSVLOa2HJHw1FQD3N0z09o+oaGrCrbR8uL24blWER0Ls37W4xO0WYcS9sNRl9OJ9xoS9rL7fYRX0cl43D5Iwsu6mhyNLdbzMbxQMGidXvjTkVPWTTzUzquX6R9mmj0qTJ+x/bN6dZ+pVtT87v1i6Vcgk4/wHmFufeoxkd79HY5oPXyqXQsGLJ5QyF7GrT6dNpKVRW7NwadyvNeeIWRPH5IGwq67DaUPky+sz+VClls9GSf3R6C9XrYa9XlYQFVU2YR9lzNMkOLdaQyr5QICzXclM0sZbrZO+sIHWwBScmo6Gc7dzHxPScnNIzxo/5QxR52uOzRREuLxezi7fas32R36QRTMO22u3it8P2xUtVkTtqjnWV/OarXJU3uRId/TNNqjJSbshpHsc5/VmrMyIi8KH8E6WlTrVY3xPYTAhtlfnufyaSB9To7kMXJeoLWydncrMbcVk3EKl65abBaXdFdHe1ZFvAnY/5WX1x4X98FPdWl7zt3XXAo701YjBba/w7hDrxbw9M3p2XRi4wm5PW6iImyXJ2OAKAJ4DgBMBFkMz1Tpq9kcDhMgkOEKX2xB6R8tR3vjq1bIEZtOb8zbDLbSj5dKuFK29KLQsKfq2WeGESdMVkUBMIHHQoNrRVOqPkP65SocAtEhc/LYjjkf3vSA0zd5bAhER6FTNeTs2kLDHOlHloM0dz/LHPhrEkK/yAlQa37zAS+HN1F637OO6u7l9Ud6NfKMnT/UbX/WRD6Wavt/UcxxTPP1daiMvoqMiC/bNBrCYcErZ5AqvR0GdOBrkDGlEPBDSTVdnu5qOeLjqBU+1l1jE/ZbsCL0q21fQoGxHL+Z2g/5YV+lMRBefoOF/4ZwR8kXyYHyZOEv5rgSwheTfAgwRLBUYKdBHME/5Hg/0vwCwR/h+AvkCnC/QvBtxB8EVVZOXr3Qna3QFwkRcgR7mmOc9l/acFPW/CnLF+zPGYh11vutHCXWfASyyYL123BeQsOWrDZgv9uwSct+FcW/IwFf8PyhIX7tAXfZcEbLdss11vIY+4fujmLG5m+zOH7OBzmUDSA+MCtbrzWfbH7Gjehv4phF+LCj+iwLoGK05MvnXj2uI2FZI3j4olnWR7p5OQJWx2ta172+HGWkT/nv9mfxh2UC7tm43PZkPZj8NxWiFRUdi4q79953mA01RZx2iKUGxPNqjbraPlWypDjbpfmwz3bmzs6pO54KBZeQzmx02ZPlrstI7UDwI51njKM7YOCE51P+agDDcot/2L9kpVDdptGp7fZdfp7zHvM3AfMeIV5s3mHmQyYsWiOmktmYuZR8cScDPnpspIeX4e3SM/NgT/fFexcqeGMSuo7ZW9G4fsDJfnCyFJIei83t2gkWo8uWo/jwioqF2z7EK85QoWcsicvkJZGG49V28vHxQX62o9t7auFVc3urJPt57uR0tMXhCeQBq2Tu17kfsP9iSM8d4zgNoJ54iRJQsgv8G/xXzHBmucQ7kLYiAIoS9V8WUCvkFOEI7sESsvT/hPjx7Cv6J+mw0BHSz0wcNBMxdP+hTs67li3dKnwxG9+c9ddyj7LE/TdX2m8W/iN8CeBEOEYj9tgx10nn+QJ/wvNbzV/1RANnv9ujpNfEU4JnLALmnmMvts/TV/+tncnMtpEe+Ur9MXr7ujgf3bXXb+h771p5iF0C9pL+X4K2PwBWgFCDu7Ty7Dh6JTWIOlRMYv8XnGpsqdx+xxuf8vS9vbRsWr70pb2sbH29mXL6Jy8j7bjr8qcRJ+ClerXqRZtk8xxwadxgAANyaHDqq4SCsWpqhqHqz4fYrqKRm/1CXESDej1VtBVotEABl1FUV1kVyRQDPQHyERge2BnYG/gaOC5gCZwGGduK45PnlQUlZNnVFSUJtS1layDWYda1UKZtQudWjeRFBHWXv3r4vKotW2VhhhtYsTmjFST0cHzlrnccV3Ox/9sxNJdTtptTqPZsiYcC8W7K50dzdux1VX26JxxLyIzo/w0ekrD0SEyUs1zCvJKX5djqYLUbhg2rDOQCMGQMk8IlrHsSUsY3JDYwJKRrLo/6Dg3oVoofPVApim9QwN3aCJWTBl4iFjNh8EckTkd2xHeozdLSCfqNut26Hibjt9lsZrwIpOiB71w3vi0X5w+bxxgF17wT6P+ExPnjU8+mVV7plKkX0+rX6fhp9bSFVkCKQx1XZee+wCpoyhd8Hru/CfoqfDLhU0LAx35wpZqU3EbPWc28Mx/z1xC5dJH7FoLNd7/uh3oG9+Aj3HfIZ9FZhSSLQYDMURFh0QMWoS0RZA6nVkQ9Ey0M/+OsoLKfScYdKwpRde4EvGOzjT3+rr3XFSKe4Y2XjPRmgtBuQWc4h4UvkV5ThdVeC2Pk8dYfIN95pQs6u2SlrdYBLNsDElmM3+Emr8C6C5ZH9O3ssjb388iwKCJCaldUjwGzN3GPWghvjjflV/eNLp5eWko0cL94Nz3hfZ7r3zh8N03yef+fGLllbs+yeTwIZwiMeEpalp/4FEAZTokm3wyJXqfz+V0Wl1QpxD9s5KpAzbZ4pXo1HoDwgpDh8n3qDZuYeGFVvqAxuWyOqGyTqcFKmttVBayLrzFk3R4+vv7FTMse7pT2Rf64HbnTufdToLGNzSw3ZQ9RTWuBKdgXHpU1TGMSUzq3GruSIuBIB9e4ivdcsuCQWnish1ZrznK80Lg8gUjuhXF5S/si3xEgwfXfPnPX/zhRGH1WPM2LjFO2/oB2tbjtK3N6P5DLli/1AQJLGUkk149tNx4NzjZ7R6P154e0NNWR+mfl/7Z6ahEaXtjMVvmMdq2NFCsyU61a4ttlx7rPV6v3SMbQpLHY4Pf7Yq7x87sanXAxm0V2gvMMwhpRv39NqUrxuHKaWVmK+ooLE2ofUAHllNHlTmCKswhVHG6yfGJCztXO+NbF6fEUMTobeoYkm5ZLPUMnrOm1CxGdR3Spc6YIFx4463JVEfn4szwnsn+qx/4NfbfdtF3Tq7NtXaVN20a/bJ7MaPvHO2XgnCAMuSLpm6FCDRafQjOgfxBAz2azcirOEcfo2yWOUgPYoS8Hg/lf8enzOYmaj4c3xcMaiE6oQkXbis2YmUYGCdbEoNcY7YmfuYV8fa6317Nz1bPSaH/3FWXD56TCPfFNq1Zc9Fo53uXjEe2p9aPLRpeMtTfP/ShDfgPPzTb4s29nT2VBYl10Vi+sGTL0guGho8127PJaCzgj/hDIwsGljaXoi5mh34b/43s4v+KRBRDsiw6Gb0DPTjBzWAB757HE/kWg69G5Ml9NpsOkowCWFKth6JqPcxNNG14hVjqUFrxKDFbguy65OqfvX/Rilx50dpN1/xpdMXgRePFBbnkwv4brvsMeeAbkx9oKW1cefsnL7j297/uXNCebz538cg56QQbG7QXy2RY2Evtu11HUNPMK7DUmTk88zpkEkTcRipofjAVCLgBj+KgBfAosBvmLPiwPeR7B91ubQQbtYfJk7IxIYsQBgH54b4ipUXmEmCZUowilZTvIlxR5+Zm6w7rLqs6N8Evm24M22xYYFuDOBujR4bTA7GOUFLArpJntPiZUlqT9LoLly2/0L3GpjUF3QWRS76aTfVu3P6Frl7bQT1vifqWxW6N8+32lIN3XFJZN/C5y9eN+NQ5+zBtvw3dJ1tNMEgkDR8SFRhKNafMgh5Bm/UK/5xCOocdQ5wAUmZZQLZhjHQwyjpY19Tp9Ogx5f4D5igtx/wY+QE8KRstZkGnpx2k54XDePg2HwNvZsg3FYjIy9LyAFmAdtUG1X1INBxJGHDGQdvtqNjbq+Rh3X3fbLbIP/hC8tMXXdBvyGxYK+yt/dsnaufVnsUVfOu9uPfAj39U+wt2/+Jfafs+hVvJk1QGuNEDslWzmtbRAe1zzGkfb7TZ6mNqZO3zeua1b8pkMiLm+qAEAMAkBkYIjyv3Ix4Cwc0SD620kcdko8Db6AMYG0XbWVr51kamuUyCLfRoYZ9EBwMQd5Mnk/e91KrNRlt6+i+/Z8PasqPS371iAXdl7fgD+KnT/3bFJ6654Q4cvu2nz+HB3z943+Xnwtz7FR3PpcIzVMfKoMuOID+1/MyUpImoN0iBiJBihGxl9dcBb06lcAR4j63RAd/fF48HYD4K5PsHFLiDOjmfPK1suaYgYTJ6tnfO0q6tjkTbWHBxQTOkOSu/ZGnvlqh/aCj23g+E0/I521dlE0atM279pieyomfHBYvCa/Hfftp7zzU477Wcu7pv41XDG9ctunPtQ78Zb+YMG4vyuZmWggl857ehh8l+TQfTngJohay3ctaApDFjKnEOTlEN0QdHh8PiBlRUUaQT+Sk6jiEGkqrRmI+Qp5ClqHpZgJuCinGyqDjZxrNzHRcAgeqYCymzf0l7demS9vYlHDrd917u8aElHaDrVpcJR9qXLa+2jY4M/+2DwnV/+3N1yZJqdfky4DPHUDt+kYvTuoZlk8lsdvn9gstsotZ4cfoZZt0WFRxLHCaMOytoTu19hEGQt+GvGUWjJh3tsnUn04lmo80n6syugIWLGxKZjHn1aG+7rdlTCjaZHaVy2e1uSQR0GcAHRUV8kvsCcoFNbbZYkM5uMfPO+lsBzZmq/7MqLrxW3VXw601N/UsrlfVuORvrCbe/572cv9rcMjKy7V92BDsj7e2ZRe1Vr5fS3BTpIluEN9Al6EocPILMkPstSglY1inTE3PCS0rhyYuq2zZE6dcF8LFhwfAyrzfXqTmf3xZpsWr5yfCiNd2b+W3D4cepgIeV1EmYaGZpcnI1iPxh8r0DkW1427Zlh+kU8xmgkE3wYdg0ATDnK13nbx0LXN5/WHl5Gl4epif96dyKCq5UFg2vXmO1hSO6y7Wbz9/a3XJ5TgPFnk++d2gr7P24dWsnvDhH/y7H8m3F116j3Pu112zKBlSd1GgoFydBFc2qYX6V4iR8AztivHGzus053Gybe7MNzlV3WBFgnFxOBZ7RrZ6yhbiGS49J7YZ/D1xYs35TOq3m+1A9c3zp6rkgzZlxW3KxttFRwzVrU0HpMr3JrbfFopFY0h6IxwqlYHKtblJHBmPd2Vi2JZ7bViG63p61yWCx0BT0cZ5ALBKNpWyBflIohJJrFhcMA7GebKKl9pzbbnO7bTYPf38o6fOHu4rVYOY5DRmK9+TCTZlI/vKKXu5fkQ5VC3y7aPEY7IlwJJmyi/ZgKF8NNa1YIun0gytbw9mWSP69ZcN1wsqmUFs+6Y57jc5E1O5220WvR/FlsfxUlud9gxx7v/tDbm69e6ub+4CIrxDxFhGvEXETwXqCKTV6HBDnIqOwAUIr9FGkF/WcXm8ZsEAKdyMJ3ID0s6ng4O+iGlSln4Ei+4rj/pPi837vaXU7jQbk9j/KDz1rMvfZ87jV/SYu4b9C7kZ51IWOy5U7fXiJD3f5cLMPe32AAnqNC1/kwmtdeJ14ifg+kdxmxesMWKfBq/EWfBUmKQgxcXy4gG8o4LHCxsK2AimE29ocEO9zUEY9vBmblSgTZBJNURMxmVgX6QodLM6oXIbA4kNTHR1m0xPkOdZDPPlFvU8gk4xZyo2uGYe+YdomuJpOvsWzxOBi/6dhQV95l9FAf3y3MUB45jk+jcqa91MCyMt+TvRHJHA0CkirJxGun5vgdnK7OfDTjDOn44lyWYFpOoPbkf/KXLfjzAy1uw14rzamYutoLD+kIzywj8Nx5tRw+yUUB4gdka1Wi5IVLrvoCTV8LbCzFrKdsp4StRz2QSwfRDZk6zGAM//NsHjCjbKp9YzWyxZciqnAPT4R2w7PfAYKFtWjVT1a1Bea1SOrgC3IKrDfZpdwF32fmqcyjrOTbbQtoZnV+H7hP+o4QfR9TX/dhIr7ccmFXeoykItBPOoM0pCLKv4ynahi10QXoaWNt7FQMTV+8ePYwJ03W5ZgQ6dqL6DsfrwjiqNKWrlTujoaFUUZMf1K3yohXIbAyWKWVmyyEQd5Ie/mn7SnBUEph3vo9OOoXW7mUKnkRTI3UcKlklzaWSLWUpFhJu+yuwBJzUM/9BYlfDM7PnmFgnA0W+ZJpUwxo5RJyzahp2oXos2ynSfoggu8TbL6Dp4sgxqXqQq1eRm2Ltu9bO+yo8v4Ze/i3cXxSSW8MzsbQyqsFa6rx3cKNvJ6bQfKyEF8rOf5nlM95MaeHujfiQ27Nzy3gWyQ9Q5pAy0Oernex4xHavbQMrJQBv8T/Ab9gcWWiuFomEPhkMUhczgMpAWPzXuOrz9nkvAbwrXIJ1s4jBIx9kg0juMwpEpEKjxTexj48ewzHOCAx2QXfSaivCYKUbMoKka5KH00O+dZJAM2A6WFf2dttXLr37wUeWUj7edsyh2gHSwdBuTwegDsGepYZHWMKHG6rJIEatkf55R61qNgIe+tq/ZAAyMkSa283x9IQsZbWEU1aFKP4uG54CGxRBzS3ZLJcCqThviLpiYFT0Q2bY/ilynVnh1WJJ6MQWZbIpFSAEb2RyLppgxktqVSb0MaaXmXSCOn52WXzYE3GJ9kP53unItAkn0HICQAxpv5R2AktYWjX1yya/QLS+NjX1p2dmFWIx9b/bHa7nvX3nvu3WvuOTNttbJxy8geno6XmMEoA2MHX5RdS5TBU6izQZ+1lfNorZWD3G61jNkCorLNJRXpwCjUppKAWoaSM0/nF/87ZX7he+j8ishujMp5rV3G1tHi6MTojtFdo7tHNaMK+5r7LLRBeZbOjxxtQ5LFbFda6cO0JeVomSuz1VybVGbzcpZ2VbyCxvNZfAN6Sp0rlVYfPI/KIn1eNlnnPXyGZyV8A+ZRSvZxeHdlb+Xlyh8qfAVWoesllZXJzWb3Geqex6tp3dOyyOLbofIwDlVcVeteVV6vTh9+DtZCCUmoA71xQIK5U1DnTAdkjdroydtgGCBUtbVShjkkSYW29irMoY6OfLHA5lCUskeuVHL8E6SGfWWpFaZSpdJWKOVhKhWL1Y52CH72tMn0bW1tc6Ecus4O5aCEws2fOW9Buxh/+/wZV2bQuwEzEObMqHcD/oDnzLF/jgTxX3On2hnopBV/Ea9GnXIaZsb2LvxyFxXNQCGfCHwlwMHFYhXL1R3Vo9Xnqjwd9fFJmCxU9CsnTCYBRgHTZf5DkSdoC/oAWvYobM/4c9nvoaq5zNnjYtyedCSd99o1HPbKdrfkBUbqA0eJ9zkvV/Le7T3lJcgreu/xHvXyXnjXFaDVjAOR0fdM0GKm+Mvq7xGs6NeKPKAkGvLw9Fecfqs8mJj53NxnTM0IFspCsgMjHzyC4X0cLcMleVUxqeZffG62TWJGaVPj+atkPUEji9groY2tb2mjQNCwOMwNQ7HD/6umQ5VY+7NqexgeBN9oTxatoPO0KMc4XArJoV0hUu+K/uDuIBeUAY5HNpmlIOgU4/Pk+cTMknl9k2VtU/iNWggKilAIFdDB+fxGqcczjWfzaItGRt1TlGBgXW4fNacPz7ws60MhO2MdTHeD2GkxupsKetlolqJQopIhk23w3463lFtETbTcIpPfwWBQKUxkTWMpJbQLafVMjeY15Dkta/FbympFK2hZfVNA1Ydnfia7WeWYTIluju6IkigMTVQpV5RoJU2skkrBqpig5TK8B9Cf+N+r+hMIsRSjw0jEBf2mFGJy0OYuf5teo+BFOOrPW57B98ysRWFZjzsiEb9fhpyvYwetDskawzH2KH0Snqu9CfgZ9eeoPnTf35K0b2zsvUCAeG8cH4szI2LK5pDYkTK/OOucybl5QqO1X/CW2bJMzdyumQ6UfJStOMgOSjWbIzjFSsU7o3crbQDiUelwtLZ9bl1oG9746yeprNVjlIIuYG2QLXaHVIpR4pRjL8c4aMtkdlZezquDmFHqwObYUziHyrKeQ4mEySUrdXLNrROXnFOrolKvbGNsBHejXVl8D/9hlJXDyti4aB8lZadLSkLylJhcntyZ3J3kk9DLs3lUVJ4p5TyNwiiO0lT3+q1sbAGBxjTCKNt+mp68UxCTSCyuIMy1JFJMSUwmM80tLH/P2oSbmvxnRDnZF40z/TASSTW1NINQy2SS6YSiH/rmQaDkGhAob8yCgpycJ6bm4YOMnw174J8DpcwBJ/hHoCkvzwMc+AcIKmTjXESBxvzQ2Bpj2IpvEG5DOdnJ9LhEgo4im7RNzzVxTaqvvUnVRxrKHC2H4VjwR2k5pxT6Iq/zjL74R+gYS5TPoaVjepABi4cTlKaWALtewrR7qigtwSMy5WIjkGAHmXzMCFPKrT2guY+sU8oFHsXKawXeN8zMXMBVGh6mZEqvLAHmuUTNCVzSyAnMqrKTlSU81agjKwv4KXld6EErZbNG4NH4ugQri5UeaZROfxI3FTdt3rRrE7/pbK9SjRw4bbxzZglgLtB3/lGZIwKAMSRB10ML+33wqiEoakgtakgpqiFTGY4Aq7PyfF64ltY1IbvpqKDFgz6wfDlxpDiyeWTXCD8y386amanna9Pn31Ce59bT51tlEZ4fwh8bGorFoIhBaK4ZZMZgcXD34N5BflBV2RW1H+rC8mUZj//THDm0CMZiATyeCw9K9yx4ZQGHFvTYfNCJA3JiozQAnH5iYPvAzoHdA3xxoH9gxwAZYPxJLZ9Vl1PyHOl0jFAe8GHZc4ENcytseMiGqzbYI/BDAnY4op5vkW+hDNVNfz4lo5wJXGimaMyIkVE0ckZYGPyRbNDuiO6iDCvqSA4YGbLJM8iEjPTT8VbPIqiYqgut7l58SYGUQspWSxPj7yJ5UbP8neQt4tQ7SFmk/Z2Z+Rz0B7WxxhW5wUN+QtujXJbJnIAEx316K5X+P5BN2Szw6hzMq5xKTDmkTKasomex8oSEUh7MUZ5hctPjEv4z8Dv0vybXeF+eXyLsQU0HKHk830al+Jdksa3N4wFy6Zc2S7skItXpbbzOBzJsvs7WuT5f6TNtbL5SKYXash5Gt2fJ4a3PHaU+WxtltdL6/Brl5ZBAn72nDaO2Ii0HvkQkmVZoh7RbEqS3WKu0HCX3U6Dl5FT5O8TfBHopV+rG4e7u5maZs/YUe3b0kB5V8s557qnGc3muROdOSvbSN27r76eP0RPrUHFIHto8tGNIGJo3+7CS3yy8TO20x45AGojsEG0SS97tFrYJnD6qNzFQH8h2tB+eeR3y3+jx11NmCxxPyQZAjidaO58zMzo2kZ+gFEpC4hvK0e9BMjVFeKQ9TL51kPZsk8mEBvTkKUrvh1HhbUA7IL+i85OSfCep6KLUDsmIDDQBcpJsns6siiIPvs4CbsRcpVyzoQpsI7e3phhqjIv2PxC7pm/1sqPY/+Mbl14gNzV/cvK60TfXzE0jxD+57LMbI+dKoYcvOHfk8m8sao5nPZ5SOHzlTbd/7JvzswbZOgO1eXR/4T+NmtCyI0iEdNmWEJXxP9pv0Ok9IVglDdNOOYRckG9z0O4y6WnHQRiDjkp2aqJUIGZWfOkFtpUihl1pTz8jvqhG7Qt8LF7E7XwsmlK2vY7F1bAMF2trJZqslHV/eWJHbbyWrF38rddPaHAQT5J+Tv/BRR/8+/W1XdePrb95/ff+z/1XXohXkOHaFu4//2NxrtzpOW7qvDTQnRpYcOXKzQuLY7cNrR3wxvrqee+z+e2ClX92pgf1yCmqU+aP5p/Lkzx4HVA+bzZTHapY6i/tLRGxFC0dK5G500VRMxUjg5ar5tHScpFC53ir8DBavJ8TR/EoMxQslFV8X24ZHQ0EZEpDAdEvBnjOOrZzbO/Y0bE/jAljcqwojYHFMAZY6GOqRk6tIvD21t+h1TXekcdbNTegTbKBToVXVuPtq/FqZm7p6TRfvazSO/saesPeVXgV/Cp6MtIqubePflCpv4oqVZDXkpeIKv+zk4rZq9i9SttqD8xrW5HZAU3gB+boiwpsLi6XqRWwXO2g5fMxAWAzOYY3cIrOx3b0F1ks6Rzgm6I6exU+3IfPPkMP0SsVc9mUh+27rQVcKJj+2YSFPQr2mB4xcSaWr/qWaSvrC6ZyWXu2ydv5DibvG/MmL9UtxR51Bo+rU5jpnraKGgowDlE773I+Y5gD2rY+3F59Z1ObH/354S+MR4998P53McmF0FeXb1jWf1nypkXLZ3EhTtGx3jZ/flAK6jja8VwH6WDzo6ODzg/CFbv7u/d2E7E72n2sm3Srw9/99vnBytV66uVaF5MdmifQ5bKealB9eE8f7oNnWzdJ7EhNjj5GErAS1Nen1cra1n+v/rlKCNfLSLxnRtrT+0jvsV4y0bu9l0O9K3o395JeXICn6Y8FRs3gXFCImZL1Fcymdc4smds+U5a7r6ET9nUweItekIy9alN636ITOmsPz3teerfPs36INfphlIxoF6OnQUZTPW7XVPuMBPrcVLmqHNNZ5RhLKke7kx1l0UwHYQFm/xbQ/qnSKSG77UFJ2/o+CfxZLw9g0Pteoepe3dBnyiB8m/IGlWNPLzvKhkUz9NfFbQPQgbumtsxIrCNbL4TjK4fCJemaAqZirQgrcAqbULuUXgAXmXJBlfkst1wbpW3EdZsZX4j2ylRR7BQ793Q+0sl30tfIBsqAUGdnJiMz6yY1A1Fmu+CYVo8t4FbVz0jN6pHe9/yUPgn3PQJHet8jsoGe4C551YVSF7QlE41LqKvUtatrTxdv7Sp2TXRt7+JhHS7atblrR9fRrmNd2i4Em5VMBWckTYNSsm0N03B2nU5pS6zeFqq/LNN8Cr16CKOuvV3Pd1Hu+UtZ7OpKJuVOeWCL1AEf/6vWpIxJCaXFNIfFzh2ss451CqhzM/1Ctnfu7Hyl8xTrvmP71rexwznsMDU6JrHj0DA77htQfu1hB9m4cUbqBNHS+ZaG15sMi3DjDds4qyyivb391lGupF2MjWB3wAzdt6iNTdhCSZm4mZxydHnYcZ/BTqXe7w709dFBbobtgbwBaDY7ZtRjevb6/7zbfKzbMOFmBjB+ZQCvGNhMTZ1TAzyj84tmFHpfv0E5LhqZT/9GX1CdHWfsHsrLxtvmdg8jkTrFK/1UGwc8hUY/jeHczFXo2kNgyfeJfcxNku7rMyDGIIbbeuWeAalXbq1K+Gjvc70v95Lne3GvfM45jHPsozew+g0ojIRyA3ZszrGjrI8k6cNUOjH2otTxiraswmka9sDC2jmQh0/rRFSdpKf2KOqnujfKpEy8zKXlpcuktNzdDX1IuWpZkl5O493pvemZNEHpYro/vTN9d1pIq37auk+L6oUsx5+so3LyIVm+LvDhALctgBcHNgS4pkBHgLvDjVvcXW7uVge+xoEvcuC1DvxBK34f/WfEV3N4FXchxw1xOBRCwaBXCU+JWw5zb4JBacbILJo5ahGzCBUd2yw+REW4BZnJc8g5PxqjEaGi2pBU4bTPi1FpxKr8s/x+vu2sqf049Y+y+qGvoT80K2hfX6P6SlfPPELtJQOHN8d3xB+JExbxYKNKjTUes3lhjSxeqq/Ozq5PLazdPnfMBCte/ddHUJ9sItyuLFaWg/OHlbT2onosKK4co0Q4CYhCOkx+gfrBl65M5LZ6/Zg9dY2qO+aoPdV0AOgzS+3LP8liNqVj3hfUIrYUW0jLfPuS4c8h4uR3UFugDQ2ir8jWrihVwrryvfayJRTKJyB22wrhvvk84IXs1+ks5oFvs9GaYun3Zqp8OXu7dOXmUCRhj+qp5lZyJxLNbghELJXMzQwapguSNrq6zFW4itBCM0MwAAeeTUVtOelT8EVZKFlnA66WoZKW1X3xlBCz7Ozu7Uq6bRukPSqxYv0AOze7NbY71fAlUPrwAFEo2bgQMOZMZjLNOy4ZvqptcOO55zYvGfD7g8R0oTMWWpizRuTzrx8+r7bH7ioUVlyXdfn+syNRaU719JZdJhE/2zW8VCoVFji83zTbHE6f1ya6v5EI6IpO56pge+9V9175yduyvnBvtnkw6A//IDFabGtd44mE3fbZddoQHbcF6hz28vfDOi2Puju1dpkXqYTb3LWbirXnuzRd89dpAWcCfMSAM8FiTHpqJjR+kIum9qS4FPCZVJHy5x/KnamUxSJzqV3RqJTa5XRJqWN2h5SSqZKR2mU0SROp51KcNSWn7k79IcVbU8XUrtTL9FRI1TmD4usYZ7a3H32M+LndyImG5egHxftF7gHLVy3cnRa8gccd/AjPvZ/grQQjt8msA1vRCr6hfWYTYqtaT5ZPs23MxWONOaykr9axS+zg+unGxD+yYFzuEKKxwYuHews/+HHn6k2DPTjVNtwnhO7ecmMI/+f526AfWH34ZbQfblT74a7TQ6jlCMIzL8h+v8uMZGz19/sn/Nv9vH+X0Sj5QRb4laUWZU1CKeOqehmmLNpCXkdptvZ3XHYFoBA6pWkpy2kpu/17/Rp/I0BEiakBjI9GnI4VV//2c3SJbKT6bzt+pB3TT1DhLO3tNpv84TzOe6m0boNLYWoMukUjbDeECnhnYW/hlQKRCzsKuwp7CjxT2LxeRWGjplRBWQO5gs1+WL68YlLx9c/ijBSQhB6Xkx4rHd4M4LCUREdQ2uC51MNttmEzCRHOyDuS6UAQ1p4O0ruCQUMTYNBUKoYiWENp8qP9qGo05BTw1CJksgTTDleyyCJO4sGAD4XxK+FTYS4cthgNsFwJkCXfUiBLFNbNYEjsAK80ecV0uaxscytCVhouVsTnTzYiqjHYUZBkO3EepYW3wJXUM3XYBUofmcZW1e1RxU1oU3b3VoFLusay62zXLMhd/55zlhltYmHT+42usLHU7bp2YzgSCflrvyt1rP10f3rlQgXDxOS3hhMBa19xjYn4YhbzWAySpJ+5ZP3FtaPClwa2qGN7A7+3PrawzlX7I5IUX6FstHslpDgI86D12qk9K+d35jlrvj+/OX80z+fr60XZeuwTHSdhZYNWTPiLtR/AeiUlgJ4FXmDSFZkaAhVglJU5Bkbj2ZONZ/PcQ1QPyck+jtYhGJS5Yn5HflcefB1CXtbppby6sJBvUHujDnPbNH22NhUbbSruLHLWYn9xc/FokS+eqU383+vlsfWqHai6jygFxsDZzwoEzyRtG8SNcWKpv7S8tKO0qySUUD1EbHY+7RQa9aPy7B4hgRaAHVVUnCAuCRWLSPHRSyVJlkhR2itx0mFl11VJbbdUXzOsOz9xHZMGdaMHFPwZxzz8mX+CNfPtWawZVDkTrkzvu8WVmQ8m87/HkHnX2DHvEjKGYS2qfVhFL8qlxWnclcYXZa7OcLen8VVpfGEar07jW+L44vg1ce6jUUy2Rq+Ncnqnz9nsJJSdvDCl08WYOmC1cpwVIau1Y4Mf+10RWHSwVUOLQlwyhLmQPcRxoVCMPrE/4KJsC9SNNjoiRgYDOjUVDERCgOecIIcOIQdsN04cR8hPaWej/nGqPU53KnliuPgsMKQJCN+1Q+Kcl6VZ9ha9IuNDbAPyiYYqybRJNeGK9r7H7RIFTSxqk4AVadtSbg/9IcZwlNqkuZ3P/8Iyto32/OYV1y8o1U5/vzZd+3A80mx/A0dt/pvxomt3r5p8sO13hX7W9R8lUesF59N+Txt1A7X/2HUBzmy9Yuuy2E299wvGf//EGyVfeVEqMlBg/T4HezPfwN58Bj1V26HEgfSL/Rzq70kaqLTrm+jj+ub625X5+WhjPjXj1XwL6gCchP+UfflsU5PMlXJy7u4cKeb6c7tyr+RO5YQcM0bobMrBnM2pU6nBQ2p3ze4/Sm2iJdQmElHHQQ4f63seTKJjsrVP9kOU1iMDxwaeV1wV4PxhR8rcAPUzO9kI5mBlPjSvzKVUz+5Q4jEWsRUZL53Y/yGbFvX4WQhFZACzwmyq50NvbRQ6G4/B7JlpzU7uTarbHpJlozVg5VyELWv5BY/PJ3t8ks+Xwk0tKTmcklKa5gS2xvBMDLfEMLHG+mPLY3tjR2OCUUjEMgEQhz6HbI4GU5I5Sp81R6k+YTVHzJyf6EGmgx1wQP99/U/1RG/O+Bwoc4QSLIcg+2aaCrvxLAi7bD3bmCq59OvE5PjkJFWMslg8VoY4fJCMilik/1JaZa2s2t74X81fqeMnKz71mGbn6Te3X+ULYq4t7r11w4aVWxbxkViLz23s7a0O8OVk+KJPXnuecMcVX7KIUflQU2BxqVTcvowPVUvDSws3LBGWtlukpV2+ELNXoN/I7+h4fFSNI8z9/RVUeRQ3Q9CyMSA930z1mknZ3dzscMh4e2F3gSvILo9UAOFVqAudybpdSS0tvIthtIaPAO7bQb1PQgImKg44AmtPfDKrIrXuqj2E1zOkVrYPkIKrhmwoAtlPboACNblDLLnSbGbI+jy4f912qndaLH47qDQIxfyQ2aV7+3ZuyiY3bA+3WTPibPu1cd6zbtPGLflHu7NxtWY+jX+pdaNW1IX+3xHUMnNKboolJadIiVVlie6OsslUbmlKEWsGp0kmIcfi/oA3wiJGIlqHFInLXllrl7yeOLWobOVWvQ0VcZLKPBkknRw2OSQp09QRiNA7hBgVN2biJziXcHfIAsZwi9vllYq4H3PYFDH3myfMO827zQK1vtYBZMv0cUqT4jG/98SxY8eoVKIU94ynU3ym83gjBZ6SJhBvcfrFE9PKvs5ZljNo76TnL9EbyuXpMkAqUxkGxA2Lu9QkizOqdMVAxW+vUr0+I7V7wC/u1GYcZWqdK9melJpdWomRcqWMf1m7KB5ILLxw44fy3H2nL+3wYtJ86UciRZ9HGxGyZk9xrdbh5lz57IGu9y6rpnMj4oMLhGA4fIFkXmWxjvZ/AadNfe1C0MzZumO62u8rnkRoLV/6xu24NdSqY7Extc/TcfkIHRfArW1HA3iPPNik80Ykq+j20w/YucHtIg6/VtDwBNPJq8FWDQ4SDS8rWGhRyMKiFxAnc3IiKXFcMe1n/qWo5FciKFySnzJnGDmHPWQLy2G4fBEkI4YhRp3Iz4dBjSbw9Vj4+TAPJ/S7noTDRVOHN5qUOmKRvnvSSrywlaQj7XTMTbCmurxnooevCnJPskVIyg6PlAxreEHL0YkkaGUtvMlr80haTNx++nYhiFyUKly2MNW94MeQyyetKG2mChiBdTCu1B7R9esmdDt1u3WCbpYuJhkFnDim0sTz008qJFFPFKPzFXnFJxUmhov+6eKT078GXX4acsCARLzw6OQVgLYAD87Sj/qr8k0BYGic1ouH9LJZuGN117oz0VJFYqk29eCBEL1N4YiEmZb0rIytyaWJMKA2dChE1XLpXdFCnagK/2WwFsRznP5SZ9Rfu/Xc4QU57r5vakSHI9Ti0vx+YdPCVfTvdLfFulh+K4F5UoJ5QaE8sHHsnK3lkmTGN4oOTyFI+Vbtv3gv+pNwC/KhBJJkD/L5o4LVKuoMYtQdSiCDTidaqVQulmE7+2nxxEvTuEg/2L7zDPzFUSC0ZdpEWx9pZwmSuD2MPYBkQK/Ss2ft+VyzNbKs9VPR1SsHRdFe9NtS1uYS16tJOMwBs6MnxE9indVlqQz7fYZ4S9FjbxpyWUW+e3s0EGwLCGG3JywAhlCIT6NXNZ+mvKoT/UZ2mptDzVyBT+i9kbKjqcVmrgK7ofLNDWxbFKICCQmSUCVVSD7MF7qlqqw1StUyPc+iLICiZlsIJqgsG/UcQZGA11uNOcRoCnaTf0XOWV1Sk+CQ+GoBZVs4AedjZqOxw2atRqrFKpGrZ+JUwGg6i+ILL06zvEMqRBkRVXDxhRfKL5T9QJjiCZU5UWp6ViEzoE6FuspKiiLwKXrNoc1QZq8iBCTqAAKgfKsCAYgpgt2eahtQm5Leq9FS5e9VTxCTMZvOKFx2Beb0KztCTs8Cu8bDu9rC3uR4U6Tk8rQHXUaubLjMHZe7XU2aTWstuZ03RdzhSNznFQzJSHZRe7zpAuNgOjZyY7W8LJHf/iWxO0e8XqHWbG/ONRENw3ay03H5veYByqvSdFw8cZEyc5SMJjm7oIu6gpJWdDHMulPyVeGYFBPpB5nDnOjd/RxGlPUTjgsbLN54UbJ46VWDxW/hDBZHWDCkI2FHwsAhK6ZPYSIT4HGERFIBT5haSBE+9VwE74pgMbIisidCIhGhX5gQdgq7BUE4jLfB0FBeMT7dKR4vl08crzCQ5brsAESt6eMvlCmXoNeZdKjzhfHGlFeQtmCiw1A5WGB5QyazmPS3RKRTHbxycdPi1Avbgr9cUrzWNKJP6QvnOmzJ1bGJXMJcNdsvGDmJL1wvTI5kF9Z+tWxT58RHJvQlYm+zJYwa7Sqbe/Hdx5nv817av9sFh7pX1P1HkDBzaipUgK3P/iKvoiecjn4Y9UUDthqwQacVFGmgKVFhsIInvI5gRRxQRUVHO1Cn4bUC7XDox1CTRASDzhjR9+sn9Dv1u/WCnvbWic7OF1VWSpnoNHQRbfeL0wBQJL5whXJkn8qW79l6mD1Az2xPLUlY6F8f/eM/QdlSjv49pGDOIFy7icq2mzU8qmDHAWPU4YOGvD7liwFw8Sm51xeXuo1jxo1GYvVH/EU/8QnUmC4U0rlgMBANwA7VAZ+siUZlf0iKyno7NWNNJJFKy5k0W0tIWDxSOm3KIRnJgLOjFT1iRiQ20YRs2EFsDtnE7mvVmaUCbNGUTqUDu4I4GLMdFZ8TXxYJEkWRE9MkhjWuiKHfMGHYadhtEAz1Wf7CsROdLx0fHy+Lx8epiiE+KR63UWlCLecTT9JuslEiUuWGXfEhsZldZmAKmCkyTzIa87Gdd9Q1A5Aryu5mGY3qZlIzhUA6sLUCdYMdOGMoevVL+OZ0JZsc6N46vPXptNHnaP/8ppENnU0eval7pdah0zYnPLmoWzDyf4nFtnc33bv4vICknxy8NpoZXrPognSkZbTsTYSK2aKvpVVKWiKddJw0SKp16qa142ghOoJexVYcwlmU3PdaW9thzMuGU+X2V+32X3zf6kQAqMAQFdih1IqdHGX+bg9o/xYuodEm0pl4gWMesvYCx7VJdnB/07pXyn1che19WA5ztJEejTZM2YYzzMMXcCPAZfoQbpP6uHbIxQcEU3hMSZuiZ3ybRKVAXNm/Gt6iYJxaOG2BwHoLcEsLRzVlpT48hhx+Jeq22t5GBRX9l2AJ/i7lGnR4mPPYLPRtHubp0MBPlLtWFAHXplyDBNQCl3GwNFr2SB8m9DVKPeg13fSWr/3bDR1OYy6WX7buPWOazkCnZuw965blYzmjs+PGV762ZcvXXrnxrDfc8G9f2/LnR3ovvu2ej8uDZVFrsHpDlkSvx90UzLSYLU0pf9rp7UlYQl6rQSu2Dskfv+e2i3uV+4da1fuTvV53un5/k9PTXb+/PKjcz2sEk0GrEzTNXm/ZF+t1BrIWU7Dd2R2lOoKnSSPotAaToN7T5PGWfNFuZ3vQZMkGnL0xTzHkbVbvySdFS8xgsWmsqQtnT7kfPVx76TdfafUXzcZAJCCn0zI9GM1Ff+tXfoPjDz+M42f7tfbSw9c997Wb1+e9NktYtPms2kzI2hoL5JN+nc6XKAQjFTGY0Vp9NjFssXnz62/+2nPXveWJppBYitafyIcibWIgPf+JN/OCw+sztdmIzkE4BycaxaQjEzWK9Jw4dMTWZvJ5HYJu31tvi2YcSfGtt9UmPXGDLukxexxWjTHztw/O+4qQCZVrT+uu1zqQFdmRC3kBgwLFUBLlUBF1o2EclxeaAsFALkBM3qA35yUZE7VM8dMiftqPnf6kn3vSjQPurJt70oV1Iap8YX1epNzdyhVlnzuHctEcJxLmIKlqLVKuFOJNCb5nQdSqw7T2ek1Mdtmam2WtWWquLkiIJmwyG5Ky15lBmWiGPgqbAckV+mimM4+iOr5/YcjK00d5gQvLPns2C49mK2ghXhRdiMWFuLRwz8JXFpKFbEnmvPETz4K9phhsIDzL4kueTrhIzxvXxyGf+1ngh2+/Ec+/kcqY88bnOMDG9dgW0+OYrX6kB+V/bMOCpx1rPTijpT/Qr/T3jC11BuBTkNS662s/rI3Qv6dri2tP43Z8iP5V8eG/bcex2svCotpLOF576fS+6Wf+vmh6mjz2zDTZUbvq9I9rV+M7uSK+C3ueOf3/dp577q5d5567c2x1d/eqVd3dq7nfzyuPfcKV08OszJdx7G+PQfljtMhvKX+1Fnxn7erTz0PB2Dtdu3haKXPnuUqRq6medQf5K7qW/y3VASLIdciE3JoAsVFhPQ1KOf0A4JDZprVTDpigXBcYZ4Vy17FcJJKDv7wjlvX5sjFH/chPKj/kInOv0iN9517yBlrJ//5/+M5mh9ttt7vdjiaDI+JyRRyG+pG+s7U1An++fMLpTOR9vnzc5YrnEZ7p54vodWExnRNNsg3FbEajxxb0OJ1IZ4zZwBaZ/vU0ZBPSGjxbLorMCqHcm/5jcGIKj1ZYdB+Banie0sV8AcnURtU1m6cr6h8tVd9b9UfopPS4jIlz1q9v5h/jHA5nShd3mAWNxdieNGod1lJ7UKc12Qy0TluoDvZZzUraC8eOoDBsz5nMStaozQ22wl9kX4Ba1dYWKzUjrDgp2HUdfZIdeX2yjzlJ6G0+WS9KPp8VYT1BFr3eqCUWn9drD7hlFoGo14qSO2LHMvOHBPQmaTPegXfhY/h5LOC52tlhhgc7/uy4YvqWn1XUNKppUCvjxAvTVJnwisdBZQVtgxnDzIkErjpw6zkUSG9wzhVxHd1kdvnK89nOn8aMJs4dt21tWR3Wen2BiDs1WOkUXcKuoch7kpFQVjtyRY95e8SkjwiOhHl8sTOGZmZqN9U+hm9G2x1a4ZMI/W0bsh5EBnlwSDIcJs9CTAD45qt8BH2X/zTlelHZjOagBxNU/PU0WJXUAqLteIaN6ZmRg797NuBg/qNnAA7mEAJfivDv1MaNoK/KRqvX4aEGRigGiUQvQjwaHOUI7fJ7yefJPkI+zn2Bm+IINU9ELsoRveBQnSMOp08KQ5hDGNn8yKD3BGWWIhc2O6Sg32eTbZDyZOMNenOE7+cn+J38bl7g62rjie+LisfqxE9V3RoXKy+wq8pAMSVwYnIyO2ehsYjVdcZ21XvgUtYU8Ue65DXRWCDZp+sIuy/e4Mjc6vE3j4bt6ZjgXbZsrVZjctnM2vNd0vmtLaUHuOWREu3/03ya+5PwNRRE+44gF6Xj93gCktWMLRqz1aqz2qXd1qOUio1W7LRaUdAn81ZPxFP0EJfg8hoskscVsFl1EV1RR1y8TqRXNLqA0SpTWWG1GWWjTIswgta9wrjH+IiRUJmO+/EE3ol3UzJu+G0mFe8yiARlKznQmusnoEdPT5cpHTOKZY5mZnXVfSvtQA1zncvgSOHuPX203YdJTvhU5jx7VhMK+SJic+tIZ577PJ+2WtdUNOvdl62O+bqT4WZfKmCygC1yM6WN6/9/2R/Y8+77g5sRKZ87pfkI2wv9AFiar8vLg3FJG7X5JIfbG5DcOspJvV6Pn2ArhwuEkxGibBTc6h4XGGyc3q8zITM1tMxWHYcYYKrRImGv2WTSePxerxJca5G8ft4W0fRrJjQ7Nbs1gqZhXJ2YZr3A/CZiwwilvO1F2uhp8QWqXzypmuh+xTS3KRYUC4xjprkzdgbbySUnlyZqtd8+naImUvXzaxZtLDflNBdRu7S27V/vXbKR2kTbF14bziye6Dl/8GrEbKAy5R6f1tyFdMhGeVYEpVEe/US+PprJxCJWG9LoRXvUXrITu8/n0FLz0jbgWElVQ0fUUXIQB+xvHMs3pZqbg0mLCfNGIJ1+D/EEAm5ipWpXxN3vXu4m7vOC2BosBrlgsiXt9xqEpqa0XxANUcMKAzF4/TpONPM4mwi5LFhh/ydePPHitM3TSU9ol7wIIMLgoiu/6KUXxk+MvwgOziI9njjGvBrFaZ/IfjsxfobfWkvN2GEjekyNYz322LSxjK1dS/WpjJ546EE5b/dktB5bxcZ/+s1PvPoqJ3Ftr95f89X8/7qHXLpn6/21yv34BizVnqlN34S3pdbX3lz/yy9/+UujB7HALcGE6zj9VO306f1kOf5dzX3y9B2HDnHXnvz6339J0l/HN9ZugSfv+vsfieWu8097udfPf/nlr31t5eky9yzLZ1tf+yZ6aKZm0wpfobLlDhTehxGTlBaTKEUwFvE9+CgmWF2qZ36p9ZSWHxKuYX6Ta2UD0QqY1/BIRiwaLp6RrHRAi4iYCdJwMnd4Zka2uAMSh3gOHCREJsxNTW9cTibIdkKIdu7krS9MMAnrofSp8PDjDVeeDXzDQI7Qbw/R/7bS//hn1TMFS/pq8ht0J/935EDmKWSwClSzUrCv36JJ3elOVUKhSspdP/KTc7/Ro5L3t6X2MfRZ9DiVwQ8yGeyUDUgPQhhwW5kcHmcxRSy3XHhCzdvWWKZ7EPLIFox8Prtdxn5YIYMgpHqu/lvzqacb+dQoGvX5ZZyo51MncKKeT01NkgdxnnxR+B61bQ4dQfaZVw6KNslo8vFs5z29TeIdot8XDTE1yUCZgs/nFkVtCLIokBu73drD5LEphDIYECwzZEo2UG3BkfSno8hxmHxvP0/H2Afr8qLfH00jjDNINoUkBFs9fG+qlMEZtm9VVo3aK3vZzkMMa4JtWVhRkED7VWBaBRSU7QCWVffndYA/GxisBxwIijqi+gkUBUXxziYYDOqDY+eODlsmNva25lt1Qqy1ME6HaXHknCv6PMFPX9e9sKnFpK8kMvGhKv+jU5/f3PKFj4UDPSZsFC+9SrR2jOk+/ilXaPNAedtHf/ur/bs/OqmsLX4SLyK3Uxnlpr14vexLNPaw8sTclE+bWvQIwD7R4+QHCNNu8pMf7NPrWwD/0grbF3tMMXcLBHK5Q7SDHLRzn5wShEIG0GsdOFdfegQFEtpf6WQxjZ2w2WiW7XKhrnEwmGeXut1FHTjM3u5gvdGmrkjW1yTxNxf866WbBka3BUvB3IbiRO/A54+vcC9tKg2sW/GR5pKcaR3qzQ7zz/3qx88f/MS1l77P4kmFpfaJSRx69fQLnmglM3r7DQ9mBzecc8moPBpk67M/orR0vfAESqD3H3BFLW6qWFKCog2zitCoQweDQZ/DYWIYxz4fMj3G8HunZBeRraJEIASdBBOi1RoKBhNu2PxSo0kA6iDC8cbeqxXaCxDemVUIQyWKkyoxZDFtsIIOqGikintItX7UlW68fnjlv9yzbKz7mnzblWOGxUtbb/yX90ys/cj1+QvO2zq01InzX8eF2/r7ih/bMHrO2gmDTxwsV3viHUfj68+//ZP7Z/Oq5+QsN8/LWe6Xk5D/tGZ5Qsms1iuhRquLqzev3rWaXw1p1Q5pRM0DGWFhWvUcxdm4cXWvcvqO/1LiLoTzWT6Jjdy9EKOFgwIvkyHIK52fpNyIz1f30aXP/1mN27gHbYG9VjnU11fOylyvutcq5cDvr/2ce51UGOZTDv1ITumNPiOnibljXEsuI1tTkVQxRUSSSplRIuH1Yo8nghVGDdFUuMBp7BpOTzSCEKEjJ1tksyfo8MoWF1VGEg5YZg8mEBwUC+oAVbkwZUrkkGw15DIt0VQpJadISiMYjpAp7L4N9Z/ofHH82Ilj4snOOuS8yFKAmfIBOtdSgHMGR8SL06q6ASh7wEbAF+5n1u/4OGZjDiCd7Zm5YKuNbctg9yRiS9i6sS3BvV765AWT4xGz2+G7qtJU6luxcqzV2CSltL2Z0tae4sSdxyYem5jgfF9MF6vrbIVMPLAg3hRdvWVwbVZfuMUnZKrx5nQoPlj7QO0S/EDtEujb2T0AC1Rf2SfbP+TFeie+XYuRh1qb6r5+sh429pNKZbmsLP+aJVTGcVLOFeSC7Ikqodx6vV4q6E0mtu/fftj3z0SlhqzPtZazOKrsIXjQGogEuIDncbbVZj024vRLkyfFZ8viS8deOtaPKTtVDNFnFdPmxLMNsShSraMIcSXQiyzM9l3sGEj7kKoiCds72zmw9uoE9k28s/0Daw8qPYofUPLnEXGCfBSuU+SjkyHaELRoUSIhkxGIORoBITmizok6PtbM6Fx8LFFHovQHEXLNMMoAGNvsXsVdM58TDggw/15T4whPCXmUYlha4WzKwjKuW2RqU+xs2dvCtTQS89vquG8PzMPiyjPct5LsY++KZlZkyEBGhWNLwzxOq/M43UiRbORrsLJmceBmyxJ4aplHiyuKZKDY7A5A2nUByiqoZRXOUNbMElqWQakX8C58ir+F5btBXm/7o4SqWr+Qo6xqGEWiEc7OYOooR0uKSS6Jw5AeGlaSo5SSG5gqXTNfmttmqod892/PomY5jN0x1rvF+M44h+JiPBqX4zvie+IaUcHLU4PD6jho/H83yngGf3emA3XKWdBlohyKsoK2R3ZGuGIEWyORSH9kInJPRIjIol2KyOkWKVKPdK7HsCmx8lvm4Iqt5n+OErIXcMXyDVyy/vJE+e7y0bKmPIvgd0Zcsjz+Is5RPl8AEI72SPv2dhJp392+t32mnUftAB4FAWZVjKp7Fdiou6unqhzDjrpCGY3JBp8v1x4+I86ShJ6iN1wr23iyYmTzyI4R0jEy2sBbMjO8JZ6MQUrhmBLXapDG/pdIS2q4cCOmbmLmS3PxkSzTaIs6nokAw44qBncGOYBIigbl4I7gnqBGDOLg7HhSvYDppmQHVeanjiDSwIZ5hQoZqiMBNkyHf8TPCX4XNU4J8ogezqMJ27HV6jPqdV6IzfKRH+/TdRkhRlxGAnl+vyjq3GEow/P/sfYe8HFU1/74vTO7M9t3ZnZntsz2qu2rrVrJkla9WbbcG8LGxg0w2AaMbYqNKQZTHwECgQAJBB5JCInBpr0EhZj2YhnzQpyEYJP3Qk2eE34pLzGg0f/emV1JNiS/9//8/yq703Z27rmnfM85957rKRSgR+My2w3mwg3oQ5zG4bDbBTwP3QX8Wk2tJszY0ZO5DE7o4QF0ckq/ZjNAu3N4qioMMh3I5NSCcUq+LxyUS8FkYFmJ8viL/lLNYXVDK50nP+5bdOulg5fuv439afXqfS156Tr4ssWw7O7Kt1yuVTuX9neVGhrmB5ODgvniFbc/+vV7X/xza9sXMQSuoyBjh3StNtOrVdu8oQaglHkZyYysGnlw5MmRF0eokalKCrVaTEr9D8dU/Y8EuEh9CxjZr0zDqzbh8h9tv2nDk1BZB+KeVlz9o7XK2dALIpqvNdu6snVX65OtL7ZS5tb21gflTXWrUgokUS8FMo0pZtQayQAPVQWbp2qNMN6ugq/z9s6HOo92/qbzk07q2cnnq62dTbW6I7tnryt07G7uLnRUi03oxbNOmVvn7WjveKODVKqRPNmhMsvVSB7s+GOHumPGNJLpqiRf9izIXqJnmfM0AVe1IQK+V823zao1eBg3uNiNXtA3tsrfiBr6RiuZbb29lcCN3oya/cdao7cmpqfLyfU5ZlNLZ9TOSKguUWqEkYS2Ni4dZJlsrWzG6TXCcN2NNTM+m5I/q8yPt9bHoBewwi7UFHbh9PnxU/OuX6zXJTDEyM1UE8hUdRCkmJQvdVsKuWufVvlUSq+vQibdnp6b3pVWpaulNln9z6x7qtzrzfq9zIPkJuoUyFdDqHfK2EsZKx8t/7H8SVllL5dpGndae2luaTdSYnLlu5ldoMx5vndmzQRkl44q7UMfvKncKE96hiXcvlKtfaUvtE/GR6pWdA+iVp8OkAdBB/JdUxg/7kqhzvxLNZRK+XxVmNzNFZO79UVvsj25MkneloRmtDU3+WTyxaQ6WVdlyqjR+r2JX8+4N9apmR9APLXgGZ2xsDmxO4GU0TerrNyVECSZZK1aS510dezQI501c/6deQDOkk6ANbV5CvuNuNzbqWcSePokSci2vLGozJ5M0vqCOfJg5CieOslEdkc+iagieA0IA1Mwa57UvKh5Q6N6Q/Ou5o8aUlMLkdTq8EzXNK7NI/xEmacn2+0Sebs8nzAJRsBl+5UvrfII9YDIZvQt5Cr09lDk++jr1M9O/q7aHglrEAlB8PtBwhfMBh8KfhJUmYN+dJAkbis+WXyjSHqLF6EN0lzMFEeKm4vvFieLVBGGsL8Sqk+HrtmvRD2UMzWH8P06bUyHwSfIk+j8gVyc6hmOL1QbRhoQnX9fDTaECWTDotVK0RzNRKvRXVGVOboqujn6YPTF6LvRP0bpaH2CyKgco6ivR54BP8Xzsj7BUzRStfXIGbweuRVtWBqQHUk6Y6LIetyhiC6KfQ2/L/RD8mdAD3Tkm4BFvoZOlYyBqMPF42kBP6nqfD6Pxx2JhkLIP/3lwWgUOJ1mHk8xSIBGPbpiv66qe1aZi6HTmfFcDAovUY5MiYyVkUtydAwjZfb0xcrrww/PWLScrVsXOX/AqKmgPCugVmvWX59v6i/mM1BZtdyKFyzP80F5zXLpk03fls5Z5i36FooWOB+vVm5wS5N/jabLLD1n2FGBzv5WAa9WLh0b8sDs13/Ss9Jy79ldHaeaq8tWfzh6aPB9+/UXdnujK8/h9N8bvPuao7UadHLs6LWpWmMF+Btkh1zy/LXXq/pw0OHE8CgEQzNA0RfrzKlZ+DvJgNdkhZOPVtmQF4edzKEMQowYL4amSkt+me0rkAfRdwYOEjAzVB0icM5OPzRUKOAvng1ngzrQLH4Ri7HfJHajhnjk2oPplAPXU5bRLxIuudZDfZ7daZ9jouhz/wbOleX42clDoA3XDwLnnq3UmEX3wWUR1+DakWtw6AxBlTW1++rr952GS/L95TZRr0zFBBLk56r5+PlUv1RbQbIqovuPzB3uw/cf7kNtQ7hOrljGypXK0P2m7jZNX/l+Sm3ABHxEuR9x59T9GqJhL76fH1NbRTbg0n7ofqEvu59S3/ahOt1kvQEAX6ObjIHTIDNluyZ/AnVwPjVcr0POPgxyiGIW3L//eZDnjcYq5ogp32ryY/n6uVPXPyJfzyoxSHx1pnb19Nre9bka7MNEBBeQwdfOm+XPV+HQP772kelrz+rD1y6eca3Uf9q13yL2fa4CTnzt/IXIp5TL4Dyl7SosrAVPp+Zf/rU+v4V9GL6EELgFz2/56GAiYbdXieYZ7axd/7ep6x+Rr5fjKqUSvrpn+nmUORA/qc+BkO+dU569LUbZqrDpzGtfnrr2kelru9rxtV3T154pA98idk/8q3LtMBYBOOMZlBqA99Zljf2W6n+gSokmn43ZEK7EFdJX1qPJM+oGPln/jGmcfEv6k/KZIfkzQ3iE59Bpn1HqHD07VQsoATdQSVxTHeGjwUEZJ83F1YvmTgll3We8Z9pnZLC/9+6nP67736oxxf9msH75ZOLglC/nRMc/luukJeB61a1n1tTDx4k4Pq7UV6vXT0NyJNdPw/XVyD/L398rdaseU1+GPjep1F2DN0gPz7A7ZXBttcLzDofTJlhUnDvPmjlar9NpaABUKookyqo8TefzwUpDLJYKxhoayk7CQpGCjSBYPP/1oN+s4zQ0Kw/EO5yTZ67mj+fGc8x4Lo9HBeD1eLHvgUyIrYJH6skr9DLH8RXy6ijycn5F/5RpEJRh69g0yP/yHDPZmrTB08xJJAOJrVCvq5kJTSQ25KiI/a26fANjlz658HFkUJi4U7Eo377tATNjJc8dHESWYu+mboaJrFrFPYd2r3tzk2JT7j8UnJe1fG20s/NUc8fSxkcuuQVMYzj1TQrOYnANwvWqSVkeF6t+pfojOk4rfUhEJ96fOv5x/bghRkRVqwHik0kX+QzyFXOgGwxWA3m/C9hbRBeitlntQr+9LYlsKQ+qeAKy3x7R6YEyrhFTK5eTB70gu5tBBJTXOZYrAFQas2FcKgkZ19oCfm48RdJE4vHvNB4fT06ncgRbfTwiHtnYRhB3hqru5WlLPlBZEEnmMgZ/OGTWWtV5gtYZKHu50iyWrt4yW8z3p3a8xLV/Y42QCtuy/QvDCD8XhzzVyNazRhYH+8NfHx5afN6fy5s72GDAa3AOJFmdF30P6xGMob4NPYnenLjplkXnGMWYKz4rzDEOzwxdU5sbjukEXgH7gQr0Tn5Gnk/+BWGidtCFOHVHNdHanK12dva6SG+yu9sby2a9AwAMNHvNJpPeavWazOaeno6uvr4ugIOETxdbkzbMnE+5NKQyuT6Xy02g/3dwmFDmQGWVaJk7GTyiR85F4hgroimi77gy4zQQidImtTx+UxnQ2UbWxoPixFhtQGg0TWKq0nKuxlKvnXr+xU8gj3GgvyvvjTW2RkoBc1feWWku2Wy+9PDacqAU4YvxyLrijwhWDLCWVNyrNvZGsm0ru+7s6eq6qw+GW7NazmIy2ht8/pVdidzC2QPRapeZ1moNBucsV8+NF/Wk5m5qr6yJ854PtfFkgBM9xtiAx1ea+O2eoWtmXz17jzK37CuTg1AD7wEcMDylZ+VFlPFIWbW1Pmw1ilqV56AmwxGExswbVAzL0ap8sThbZRE13uFzd8/TuX0+g3RQiZtIz07HTRjsJ+8HXqXW6XTdUXxcrjtKTNUkzIMWkDpIqeNxszevFHt/6ulyoamFwTtmBGbbJ04gzdF+MicvKZNthHi+Qa10GOLyMC8PtMILxCNao7969bApxYDrh6FLcPUwSt+7PLVjGJcPi+5dCZ1vtq+NrK7Om7On0ro6/NmiT869IEOLfCCo01286DHV4FnPr1j4b+fAn503p2Fh2ru86Pru6tRI+MIneq0RNinYsrMqO9q7bxrAZcQWb2UqceuceEPDhQk/cZ81JfZGqi4lX9Y8uYvoJK0ghIsh/oDFy+kciFGIwcMYsztog8yN+TxiRjZ/4mQGtREJYtnGIzlFQhtsU5dnrIkzFccX4FeM0VSjjbI2NiZMhNnuZRsIvclk0MC9XbOz5SVLIp52m0eMumJL4c8gpdeqvmkw00R+y0Ub4nRj76Jli4KJxs3rlq1bO/Iv54R8YVdjfgbO/et0jWaMwxgc25wLmupxCFWvEodgcH2fDeAwtoeT10/XxpPtytbJ96fiykMz4q+yHVM/QJyUPp2K9U6fzxD86efl+OjddXvJDRGfED+ces4Pa89Jc8PECZWlrmvV6+u6Fh0fJb9Sr+NJ/gdHYbtYr6tJ3ob2k9M+HeJVCvubQCW5Jl+C/0V8jPTNTnA/eAgsrsYfeuCBnq3nn7dDtf3CO++88MJ8OakOgFCytTVZPuecMgAbe2YvWmTluKt7sO3DmmQcKxb0xxzGOkaZTCNbvMM27D2NZxtJuXyDCU7XwMvb6MD0Wo94aHowgNgA1mexmvGy1i1QrtWDvSaBh0FrbbyhPEBLruBcmrIA8jVumCejSFvZkKRYlfXjLOXaBs5uFPAAdmX0Ofom+SNInPCKBeo93dGIwLpNIatjdtOG0gpiRbzLvjhXtVsiWr9dK+iMtFqntjeHPV7W6bDZgquNWr+fMllIAxx6yGv0WSM2m4N3ZjXWFNcQj7hFXmMz2yjWobVeXLLp9LQ7TRCEihCK99OUyqTXQAhVKlKrJmmVhtepVBq1gVKpJt4MDvjhOp7P6AW9xx0ODDf4DBTZr1IZY/nRtmI8rvPZPIzdp01a+ADPWr0GY9nJB7stLn1wRDpSbHLEWJ+WMts5tTHibyolQlHGx3ayXqYh7YVX6n0lp9pp4vR2o5GjaelBkQuyWpdVTTEajYG0dcTjS9OuJjeXsDq7EksGUl2NHeFOLOPSvsn34D3wOYSduoG3amSYQCDf0tAJHWo8MCOPp6rhxcnRVrYx7FeKbWOjIXevDY/sn1F/Ka9Mq0Cn5Lo8Sq/Lw4RRb5lxdhveIy3XN+TX94etTiOjZrScgdWr2lqquXaTlgvqTSotFYswfrbd5NSLvqzdVkl6HD69m80/Eog9c25jm99SicTnpI0xURMsxkPMrFZfQ18m6fct8tmSA5zGwbYYWbUhEmyHNpFRc4aQBY8PyU3+GZqIHyMrbH3G5k5FTclZqH3jiNnHTyBeDs9k3HpxIbkBWDNPrYthw60q07VBsvIRZQgDNF3WOCSelW/njC6jP2GJCtZstyeos5li8dZYppxqtqVtuaK1sVdIdtlaGuOL/YsKtoTQMQfzQGFVJRMJMH6eC5WdWXuZU5v0WsTCDCe6RF5r5LVW44DVpbcm+HK1K+w3qSkI5fmtk0jzQQtxCGRBK+gAPcBfNXW0t/d0JYuhFpOpxaGSG4kk+MTxE+Oy2IZrAw9wLyo1JuhatcraUmaRKPWP1zKrQwJomTe4IzvH6bJbLG4rrVcbTOnEgmXdcyAkVJFA3OETvfGyTxzSI3Gy8S7WwFOB4aA3OBx6/uxskrFYqw2VWc0lDesyemZ5W92iP9xpQB2ns1iEdCFXGupYsMBNW3nWzNKwpbuhewH6V/xXZvIE+IT0clH1IwB8fgdDq36Jjp1Szk3cCT4BP1fOfdqvnJt4En1QP3Ht5LPEFcRrYB7YDC4B28EVYDe4FtwAbga3gwcRMmu5/847e+euX8+J4txLtm69ds8eZLip3VdddcP112/fdvO+fbffeusVO6ltO3duo8iOuZFMwQA7vIsXexMJL5YVXEP0OAZm49g9yCjgVlGlyjuLQ08ZGZHlM4cV3Yp6pJyfkp7TlJ2i62RckIGKECkDeE9XomcoSAp9BvexDIjkwiE17ShfLf+FUSfif/UZ72Fl3lk7vk1U+Sj+UPfjSC36aDdteKJo1yOllyIJNcEXP//QzfNul9nkTJicJn9ibtGdiHtuNuiQDjUjHXrXlIok1UKRaDKq7VhBIg2pkjVkVE1qKLWWVJOfXeIfCpF3h/r90i3BgQB8MtgfmHjBPxggXgsM+KX7Av3+5sBA4DWNQQeh3sirjcY5BTdSkBFrcMQHr9L7ik61w8TZHEYLhfTfUoPB5zF22gtubvPmZLYk1nXpjGuRsrSbsK6M+JiYijZrtHrS1ok0ZQppyrnOjnhqJJTq3NcR7djTEZF/453Rjr92Rjoa0fYCtP0ger/H4GZVai1hKTUGEs1YJunPr588m9xJ9II94E5wALwMXgfj4E2wvJr66fjCvT/+8UWXXv76q6+++cYLt90uaqOX375+/e2XR7Ui1bb6rIzfAi66d6Bz4XeLbQBzCPKYxuXxiDlW5iiZqXKyJMtIf5zB2qucKymiW+9iXE2mfkQ2zLliIQNrZ7+EX3isEOTaaoHajGMqWC+zlz/dZnsg76/X8ZrSkIItPFVaoR3iOWE2Qf1lPNgGp7lQLRv5+jincqm+WgP+/x7n1DhJ0kRRGqQGNbzb42c5FWlWawycSRQ5wUlp9KTaNKIwJGYxii8+7o6zVtYeddvsGk6vt2q5hokO0cKr1DqVycB9zyZ20rpgljVb4VDaG/WHwja7UfCm021MPljmPv+b1b/QLzgYNyXGM5qS+tSZHKu16rFNl3n21G8a9TaD3egUDC6TByL2JH6AeHfi8sBgcA7CAD6TgxEsopa1a3i9TjQ5zUI4Z2GdTtGTNPI6c4PTcxozOg2YcRkTQ2m0pJZGzaPMZivrYq00PTffal1gbYkElpbDFrvBQPoEd0qf8DWqyp2eRqNZ9CT6iNmCqI5WvoybLXFk9xV+bkCNM1AuhrU5KI0RjnRGOifeQmAAHqxGOgD1+TWTfyGvRLx7HtiHuPcehB8fAz3VwP1fa/rmbUvvuXtN3zeXrgmH1yz9Zp/a+PXRtiy4Y4uT3bNHbUTsms9k6uxa51bEnow82x3Znbwykd8rL9qh6DXU/1SN1Wrl/Gx1w9oyc40At2xkFYaWeUeGibIxrp+fyaDhGjz8h+BQrhKIAYmlpvXw3MOIMp+D6L20ZBMoT0qFtdbnj9gF1OsWzhqTbuyNFxxunVF06owklc2ee7LgcCG7leSZhAXxq4p0aViTyWP1ZfMBd4gOODyhJtH5GAaVapNFRZlhWYaJWhJzlEZGiRYdVUeJB5E7HSkv/sHITxEfff419LKNVOt5j8U8B3FKa07tNHIOm6y0lmpIHc1QlMHoD86yZpwlI4YHTAVpYwvvi2eLheT8Qo0JRW+a5TjWKtpEtUNjCPlmhbDu7LG49Wxzg1qBiirPTIbhGiyOjtjSgVSnQzAYPQU4H7EIidSddK/Vo3cEBYMGqCfWInt6H+GbYUUHqyFkI2/et1xrCy1fHrJpVWu2bEXW89o9fSO7F7nNa9pnzy4m2+X4mmIrkbGUtVlmXDGZmGNkmDJDp9mEKYU2pc9KikITZH2mjKP8ovr6J1YTf8w/wyNHrHeaQ440GjaE0//l32CVRKhMaquZ5V1YH1FmlRarI4OZQ6Q1a9SmpDvG6jmNooEser1Fa41O/KhmJcW4YiVLnljcs73uaSCmmOdrsJaC5qIr4l+662x3ik26Q4EWZykwwfmHgt9HZvAk0infRxpmSq+UA2asVBweWwTpFJMBKZWUw4p0ygWMCWmOKQ0i28FuW16xg3WfAnW7rzHARXhTg904nIwGGod9WlZj1RqsorPkbul6BVk9Elm6bEe0qkLv8hh+qRFhzTeIMPIVWuRo1hywDLRUxcTSpcEFXR0drS2VSntrfsGAx7NAr1/QLQQxws7lFGQkawEF+YzL8alsYwx+idzn/afJvb8QrfuHU4AUKpBF7hVyWnDDdZyaz8E3JkaG000ur9akCGsuux6WFWlNWxhIoH6jeMYr2AVnQ9njkK7AqGNJjcqTNamDOdRBrIFp4A0mX6DVmnUWFTFrds0Us4agSkVQLBdqbSwsHjgbLkRy4qgRTlojywtv1Cwzc4LVFAJAN/HM5C5iANGxE5wLNoALamj0OnAb+BpYUU0svX7Vvn2le2NX7bj3qnuvSt+5fdu2rRecd94lW9vu7EPQ9cILN6zTWJ1pYDLhOXxYjGoyhEQncxqRkUBVGAV9nqjTW5aJ2jLsJA6jYtEqKTP9/m+EV1tr/l/NVVdKVM284gxkqXQRvrEyghOp3ilnYmZ3lSYO14TEHLRgKRFisaRobLDEPftMNp2ON0RzhrzdHU3bLZA+vfPs0FJuHfG5DR6uRessCa68PRLlA7O8Ad4RjbKmz95G2JKgkAcu/QUjyl21XpbUWjUnGtkg7SbO1RsNnJFrkE5O9TgWnJDPnnNzTQubXLwti2CAmqR0aqGciWeaUx3Dp/V73yq2f2g+TWgpq0gZSZMQF9JWIZeJplPhtiuQOD2CuOJVxBEX1zljOydq/RZTwECodAnk5RgF26I6jxAS8magHRoAB/zA9LTe5mNQZ+Oezjbmp1dmVFwGP4/L3kbx2E+sD22lh37ametk+bMdPq/ODEekO0itJxTmiKpZNBh05khjcCCqJVzB2Dx1yWR2qeM2E0MTBHTKcT88GBY+ACaAEwSAraq1u1nWrfXJ8YDjOTnkrPAS0rfRor8ONJFSbof1Ak/YtsIHpMe9YWf+F9vhiMvIk4RJbIsnh9OZvtlRu7d8QczjGVbTOj9C0K4bkguS240ZTxnHHf8T/pmYUPPAAfLAUdWzeuBoIImcy0cAjDCQoRjPZRtr5vzMcfSIIckSPqWMpa+ZgxrKhI+n9P2bIh3p4rA1yPvaA93JTHPzrbQtYGTzYiDT7p5TMPnZtCvUmPKrdt09cMfgrs1LZi/SMU4hEu2Zu2HDw1K/1mm2htzF1am1FTbiaGsdLKaVeTILpCXgWaADbtAAxKre6ncZtVoVGXW6gAKMMjkGdyCNwXcJlzbC6FueC1CbVY0DDzZr3bxRT1Dkghw3mBso9lX9XsY6nHLGkfph9UMRTqd3JDX3syEuV+b6HU15BKic3s61TQ2WWNlk1I+KaRMt2ANWACc9k2Pgl+B9EAHsARqIFrUdgTWYGX9nvDFbRl1XzOMnqEU15JKTNj44FeSR/54mSJ/WbhfmZVsWO60MQfgIShRsQ6WeIQdr+RFl0VA2p69sMqD70LSGZ/ARvVtwZkwms5oy0ug7ZRr1T/4f8Am8BCRACbRXPVqK0pGg6E822jh7uLFI+nUqbSxjt3m0WrMHYF8ZOcnvYHAg10vKMSdwATJsVPDcHqVCBUKT+OllEuL4s7UelanFOOpz1ZUh5J8IgokjVYszlWBX0hcm1RRpIUhVwJtdGvabDNFEUYz02a0CR/qMsBDuCOhsRlvK2lV2c1x3u9Hrdmhoa4PNHU+KfpOXyWQKkUW2iMtiUcvTZCcnEb2LiN7LOZri0P6lskx9iPsA3oX6YBjPxu5sbrako1HcG+3V5G67GvWI8x2n0is1Bf6/7pzo/x99WP7/3sNj/ys2UE3OnfwT+IDoBDFQBOeATeC8arF91qySwHNcafX6FXOG+/sRX4B4JhhccX5lSVW1tr29Z+FwtEB6EXekUmtXIuZw8StB5gi2djhQzeFqB3hHZpS8zCqZPPqTYQd+xyN+vpxlSv+UY7A+DReUyimy2MrzVeSyKNFCrYQUbVNKt6Lbla2ysy0Hxj/geRNLquanyoFq3Bc0qDnEZ353anHQZ9JHYnlnqFuw8izBmQzSE4JybbqErvUGSbWaVK5OLwp6TfpwPOcM9+CrVR5aDRuCVZ/WZrDFrR1FF8s2F21FE814LDZ/3Ok1eczJdC403xYSWStpNnKZYLtPJxiFuLVacLFcc1HvdAi0fH0g7vSZ3OZMEl0voOstalHH4jnop6TrwO/AcgYpTsBJL8tz7A5M/gUMghsBiefYEXiOoDLHroyM/GDHwo7+hR0LsYzPR9d9V76OBq6qXkURgMSTBqEa1FLmtZIH0RpScHQs7IT22h065Lvg+/RNfg6eR09hQzYwWbWYjUatfjcQdXo9afeYjEZeURDjisuA7uk8rCiGKK5P4SFs5TxPIzGoAZlIuRbELEeea8laopGA+WLV4KDqXGPEmo9kWy6wOhzWaF/vpmyribfrFw+VWzNzdE69p7pa4HlbMoFl+8DkVkQDGsk2UmiTV8nyPh8d+658zDF1rG8yiJ6dRceQUZ2Mysfg5BtQCy/homq99MKnmxharZ/c9FkXPic9CiCYgE+jc4bJkc/i6JxBOvuzuPI56W6oBS3K504VlM99qpPPBcFc8H2CQce+MRn8PCbXuQpN/hnpGh4EkZYtIp8sHAyoNeF0SOBYR2MoEA4JKj6oTjeyKo4IBt0NBSR4hkKNlor6scmz1SA2+Idxxh65aocbsyVZwVhrNld2nnCovy4zWFbKaqViBG8rFeXCdfncMR+n1qlhIj5rVlxNq9ZBu8UPYbKhFe3qVCulww8bw3yk9HV3cG7KGOCibycYQkUgdNbWkEiotOqYM8YaaaNmVjyRUOupyJWdJrYQqYohk9tiMiEaLJkcB09AG6bPJPvp+Yhn7ZN/BbfK9FkifQaeAOXaOQqfA95JWubnOyb/B1wINwINCFWNGg1F0kBDI3NA0MCBDPZx+7iDQS+IsRDLNmZtwWhR5qgLtT/7mfaBB3Q3jd7Udtl28MV7UZSG+Of3IvM2ng4Wy9HaveDG+s3QM98h3QEuBGrEO2EApPvPOBaZOpZB33kcbuQiVOTrgKGoyEWy/ZF+gY5LyvEfASaKPnE7ziciqgTAevS5Ajp/g3LeqRzfJR9vBGrwOHwW86D0+Wdp+cwV4Gq5fUfAMCTg7wCP0CgSQPSeUfx0C64lZSJw3UI5/d4Yn10J5BdtntWyuOLy52a54O/0sZaBeL4vZeW0PmTbxcaoS4NxnhovXks+Ltft+VZ19AYB+RXox0VTakHtVofsgtUuiLvt0O72maDJpNNqPG7dEt16HaHjLXzWrbO63TrmHAvMWqqWEQtpcdMal1vweIy8QKsJuyhCndHCiCaoA+1HJ3JjOQa/tI/JkxHHjo8hTDE6emQvk9h75SE4uvfQIdMhiMtGjzLH0WF8lDEdUh86BPGxxuxoDBZlZOaXfVXeX8T+D8xDeUaVHqqAtGlUzElfr9jOk95s4pJ+2NkL2z0NvrJ03n0PhdV5d8f260qOnCYc1rHxYeJPE1R/0IWn9m+VbgV1mnxO3glaQRW8WD1fFO0jzCqG6GAgw/iYLEMyjEGvq7Yb2hsQXQzthixvt/K8vV0TSya8bk+iFS8wUghpON5MeAmC0HjinngonNdV2/JtCQASbXlVU8jdjojjppoIg5nnRIYUCUShkwqJxtsncofk8UxyPObouJz+zSClfWj0nSPMxNiJEzmkc9H/8TFmrE48Zgb1RkdZPBAqTPuLOFDXega9MC4v+m1BBHZxEQZkdvNsUI4po11rLdZTDiNz+Hn/hCPY5GSkvy7MnCf9oj3gDEMhewmZ0ycMDe7V7z4x3KFOJmmNKcq1PmE3R3de1NwWm7jm/3z4YdjPLzjwwFJXCJEaJv29hHa52EhF/v1sByd9tzJberrJGmQ10ofzjJpAaNUT8IiUw7oTDEy+p7aT3wctoB9r1qpwcxjuDMNl4Y1hYrkTbiCg2NOZp54lcwcGAqHQ4Cy8BYw8mDeItqod8YS/s1q5nYUsq+0BFEP5KJKiBhNxc8AbyAQeDKjMcS9emiUQD8RnRzL5Cj07fIMIN4pQdGvDDj3uhtwoLmt+VCE7JuZ4JTOKC9OMIuMJM2O5k8yxt8bloub5/EmEhityafPa+jjot16sYap8NFbXii/vLxUZ/2mTAWtlpuVayMEAjRxKtA/9cj5QbW9NXXD/9q8UY5kgJ0Z5z1fnbnw3s/o7Dy2eSzTDSXDO3FzFF7ps8dWbZgdn84EWy4aNq3b9ayLdP7A3c8PmQckiXa86cHYhRfx0XVdj00j8rJcdntxOh9Hma7i8J3T55Ret/VbeBi9ujW4XvnnBnIywghEz+pZrvzaYL21c+8Cy+OKK9Nv/MxunqlHfpNDLTUg23AhFZ8D91YYDbni3+1E38Yz9VTvxqB3eaYdlCHOOTgcBHIzD5yCvdkGHK/oCiTvXg/qnaBMZ4ANZMAJWgd1IL9KgMZgMaS160ni7FmqDDmM44dLFYumAzyLyVDKtUkQDj+SRCx+PjeWPo3+YGR17Z2wMSQNzbHTsrZPMyUpldMuW+monYWsMyrxfZIPFPMaDCVj0+1BP4EHiJC6BzCICW+ob5E3SdikerDiY666zOgtBuB9evf6Oa6/93ZG+fHHoNfH3S33zB1777LNw2D4bajr/sNDmCf91R7ozBV1PmKQf6aS/vUpJj1nqddD/m3yUfBJ4wVnVeFnsE4kLrHDQutxKbFDh5VsYlrVw3nkAVgFsBBAThAB+B+ZfA8XxYdako71uArHi+OH2Q2MTyCtBDIeblTs2LjsmShunliqordaRtwRr5fTlXfLRXdKnR6678Y7b3jh3lUcXNyf52NCHD8ztnLvowed3HPmvq/a8eey2WxrNVem1U7dc8vSTa8//tjLuCPfzSdTPVtTT3VVuuRv2u+FyAfYLcJ11m5Xg8ZNagJdVO0N6h40VLZTTRYmq6X5CD/zOGHPiZO1J5RJA/lp/1PuCxGKAaO8jT/7LjR9KHYEWu9niLAbgfUT4sPRSdWhxM6zAN/5r58XhsG2YaFokeMJSAd5ombBaTn9OOwiDVVVheRj2hyFSEv1OuM0O19uhzxeQqeoGUU8gpOeNarPe7PEbDCG3yIs2KhA67amVaQdIvmuMdQILeJ2jTmvDTJ5S2oHY6oy2XHvtaa35xS9Oaw/UDH4w1SLppUHpfovMO7hN56A2pcA51dINSejy3uGBqzybPbs9pAdwbApk7OGQxkRoWDfrttlDwBMKeQAZs5lEhoqRIpTbg/7YWgq8ZjveOcRMHGKOjR9DpmN09Pgh1K66fZjqky+ahCmDUCqT58ydEH2dVqPR0uUj3teluYD7nA8PDrepUimD3TX3oMZUuu/stfkPPgg3OPuI5iF7KPz6qN0ifbdpWHpqgcMtfdTO2LtWKzJin3yP+BDJSAy103KXHV5rh4vsa+2X2smGCMM4rFhlRIARdZ4IEi6Hk6YazIwT/Wpt4QDtcVFailYhCTmcG29/BU9JlMeyYsR87PjLqOfeOilXoJd7r5YbLddGWISLSsgMj41i8/LBmpZWER9uXnXDT552PvKVJaW8NLm62r26f39zKM4JbGXlrMuWrP895P6wZ6D9Ceeulualrxqa802r+ldMQi/DiPnWi+7rrWC+nCX1EjTqQx75TdVqRKi4CB7ozCEa1+HaTNxOPESoCW/FYdbRopay8CL6EGpKPnMy1z4xhqvzjx6ZOPFKjnkLCVBYHcTdEyz6eSzabE22Z9QBJGjpv5ON9k74w7UOk9aQdzXsaEnEZrXE47MWbSZ+c7XLFAo1eRdKD96dqJilXKJ5Vgy5AqgPHJO/J3LoOT0gW3VGNNCmgZQGmjgBUCGXAFyih7IyOqyGECRBcnFk4gij1AqozXRnp5LOigaaYiQi529ysM39N+diqZ5khLHnwh6fH36XvMgvzJdmX7fkfE8g17c8vI5YsYZnwwrfq2ajZ2kG36uuWRaFyyJQXa6UQ7TaSpeLtDpaLpazoag1FIqWQ8VUKhrNLi3CWUVIZIqwWEG+rbp5cwVWKtBc8VaIyiyXmQ/RbhMd4ovZFB0iPKKYdlOVZsLIiNCEhGRsYuwoxqITY4h50BbMTLyF8BSDFNc7qIW4hlsGad2VCKDmlTG9e1Uy1tqrsaN31ZVIhOAohqQ43lCTE/4MieIVOpXqi5igI/JgJjNEmFU1WwoNNkpHEG280kJfxcFquX4f/K53gNNYB34U49p4uLLUUpiVz++By27ZFk64szApvY9JFkaEJJp6bKlwOMt3S3/hur7X6rRGEdgK+VoKhSukJ27SYDkLIn2yWtYnK6qp1G50JGNwe/Qerc+r83htPrc/pNHrrIRBq/F6bFZRoPQ6UowCrEbGxydOoJ4/ikeLv4SU4jGsFX/8zltjV+5VHTqEASe0IwqNz0SadLHMFhQoWWu9G5Z5mrXWk4htsEyuHp6wuwctmptvhpTXHnXDF2ILOdW99xKUaGpftNpf6nUgLdLI9xxYP7gB5qt0mDOFw62mjue2zN4ivdGo9RhpHbMYz0lJI775LXknR5EueSwm3nfK+/ba2Mz3yOfIJznKGFH0K7LNtyK94wGzq5bVHFzAwV4ONunhOgIuIaARmwse+ASetyDmtrJhO4/8IVqrkq0xYpdD2Bznjylxj5OnWQfflIqRgVzQUlcugLz1xuuOSJ/u8u54/sFFyAA/8OFQjE+a4zrPqnPfgH74wzf3XPVf9m+fv/bJpy+55RRsqpobpfdkG9cDGBVDXltbjyNW8sAmAS5h4To9XKSHXXq4lIYbKLiRgMsJOJuAXBj47WGtrD+NwEXmfiAbOLwe2En5ecEZqznWxhPW4gd0wT8NIEoq5ls3PbHrsl07Htj75K4du3f1SV//8y2rbp17xXf2HYBjb+xcP6v9jS1Hrzq/ue3Ignc39m+6vsXfOreGgYBbpSGvQnSeUw2sF2rLV3Zb4AAFV5Gwi1xAEoQq7AJ2n8nAahDZn+E9qMHQZAY18uJnHj/MnEAkPzL93GF1sU5g/Jx0hJWfHWCQjfZVmmk0Y5chDnQhiNM6E/p4d0EK4SLp3RouwtjWP/lHVZn8BsISftAArqy2Xt4Ar7fDc+1wsR0uscLLTXCDCTabYMwEb9ZjVjG5PXZEYn0wQEADRNo0LMSNhnBYazCKqDlPMQBGn63T/5VcBv1D/IJ6Ab1cudd06BAWIvlN1iRTP2E6OtUt0bKtVjIENdCCewd7BzSUJ66oyokHr/nhzm07r7roK4l79v7gih2726tbE9K9O66BL80LpH8rtT8Al13hydxy3qz2n+6499rr0nvPq7StWXf13TfA3t9EpU2pWPFxeNeKK9/DNGhDvtc1yPfyISkqgyeruYUxWIr1xojlQVgJDgSJdd5tXmKvB17vhGdxF3BXcOQNaniB+go1sYHcThIihRt8IGM0m7N+tLUfVLJYnrKCzZC1CXjtnozxNqPKLHiFjEAaBaNQsDrC4d3Y96IL4dsoZH8SYSxqJ9/KYRds9ORMJ0zxvE7U3K5K5UuZWTZIZb+Se8LFQDl/TiEhyWCuqRnQUthPKRvqa87f9sqR8y584sGlC9VEiPCGrp37nW5/N2SeW3jlj1+6+IIX1rWtOJLquvuifHjiQekb0NFw0eJMBP5q/JavPfDgBeu+4TCuPuuCc99m4YXf+MYt10pvQ+LO5dIPnt/z0qWLsj0dG+dVZTmefJ+sID1sQxp5Q9V1vQ9e5oPrfHCJD97ohNudcKMTLnVCLa/nsOhagB3TL2zAO3rZdTJTWt4VNpsDBo4KhElMJDmQchKXFER4RwY93GlUgdN5rWJeSWvlrTSW8nrOHnk+lV8/9uDPtq954cDAwrPmHfjh2u0H4pWdT6Sad3wbnvXwW6/et/Fguu2li8855+LnO+Lf/td9yy87ecPZlysyDn+MdSvgQHuV38YitbSeJXpZeCMJW0jYQEKI5QBY9Vr0ftAA9eowQ+N5GWN4tdmZ2ggGpyU6KMszRz73fPOcuy9vSap+tPPqsZf/An98+45HLlt+Q0PyldvvkT5R/Cyk2+F/oO/vqjqu08GCDkZ1cLsablTDfvVSNVFE+pCRGdGKNcxBWsMZZPZSHgE9QW6aWgr/EIhC9aG4UfI5+avrDwL/A301ZE7UHwT3K7I35AbUryJCq+3PYYVbdZvxGkyCgQ3qVSE2GEaKTucTRDulM4p6pAwwxMOzg/LYT5o4LCOOE6OIGJAJR2sD+RGOqMMIhPxytnpwQPYxNkgbthLauH215F/j1lucZ8Nn7zv3mhd7288qFmM2qCfukCZo4scLDI28IRLJW8+DH2z0JML5ruuXFdIm6U44iWecAXK3bCczcqy/to+4MwuuqabWm+B2GmrpjTQRo6CTgrTJbAppaatWS5u1Xhu0WUIhrwN4cwZtAsu4C6ihOhzlzDTLZmxO0a41iCY7FcoEax5Jrv0o6nMMtpRBlbiy0jGEJ1HjJ46+MorQlQyu6ppQHiuB9J+8rEwxD0t5W/FMGBxmZ7i75G5p42tLhj84ltW6m96DIScVs4ij8IUtnAa9S0dN+jV9I62lxcHBrmXfGoHpbo0zLK2G8NUN3kQ43O5aIjnXexMRuIHIV1YtSMVQHxoQTbYimnjBrKrZ477NBV1WL9gNITTRuM1Gs9UNeMpLIUhpUjr2OIJJMHN44vCJUZwrHcU1neG0I4V+lSAcciGVEqfBsp/cmhLmh5aMqHRR17mSaZ0ozB8WUj63NRUh7cT9t7iNE9cO8C1GLRkOE2HPJuIKtT7ZsODvdTyj8sr4rq9q3ReE13thWQMT4SzYjLRpxubGD8pZgYkxESabFSREIUn5ZVCPoe/YmOxsoH7Ar18G7c9AsnXhqB9WeQMlt3l4wdg7oyNmvj0Avxeq2Jlk042PtqZk/3eEvChlG5Tuff3s9ZtXvwGX9YkIpAZtc6V9Xx0cXTP4BFy+WHCHa215kTxOPo+8+Zaq2+URvV4/Y0oGQJTXija9x2sPCGzIbghpVSBz5GRm4tAYcxiH47CrnjuZG0M2NldbZAyjGFuQ9WNoLkfb8LYygM0iVwkgjz/Yu1tav1Y0wTCx9uieiVMjLgcRJhJvO01scMtLqwNtsPubOaHJ1Qc77lmzO+BeCJu8rOCNmqQ/pJZnFuJ42OSLakZ+3kbQCuZV4zOeuT1ZjTRVc/r6oxerLZlqjA+c1oCxY2+dPHFyuhEnj578f9+SmSXh2RnbakZu4TrRWG/hfNF+egs/+5+2dKrank63Ke+pdqXNzgG5zX73otPb/GK6vZpCF0tb0+3tKfSvYL2U9Br5jupDsABsrTb3in19A3OcQj6THAGDcxY1tYiVUDAihgxaUR/qrw4WevtaqqFCU1OkEEmE3MGg26AOcSNONx6kceLkEaQgmIkjyht2gsfwwpJHJ+SIzFG5q8dyE7lD6EQOLykZrhOJR868MoCtPh8mIS9OpZw57UT98hkHa8REIAszxzsPVa6Uti3xFkOhQfN8uG9LqrrSxOgT0tCQMc0zoVA/i49mq+5USeL3iMjDrngWwrPvSTSbQ5t/soYZ+cnKWEvX19sEo20dPGTZaFWJkSUrL2BYQhv19MA3dgpqf3JusbQw2egYgi+vdRix4x41S/+dWGNZufHfEvMrC2X/hUU27iTW08aUvG9EGO1peT8t7+MaMBfI+40z4ip3ggDYWLXs9cLFXgzaSK+F8wCOc5qxOoiCkNMlajV3eh7xPO0hPRa3l8Wl8DIiyYmcqLe4Kb1GW4+u1ADYOJ54PYpdH5x8wBgM90xldLTWBXhM1HSExTKt3nicnSE+vGj13q0rhkedj9y0qtwoTX7yxhyhYBdVDRRxm/TJdX3df79muDsdWebcVW05601DMyyo9KncoBSWHnXNHazHVd8jPkZ4IwPWHgiFDAaNGaMjH0hglOFrtOA9O4iiFgY0SsUfMpWKGcIhM+/lMzxp5I18jA276JiCMWtho9Hx43Jsv4aicCxZWa00PHO5Quzl40YFA5GZcX2aDyjBfhyI+fiyhRtuW3lVtXubdODcXKgpUFAOtPfUDgTzexYlPInKjsFZVeHy/d+9YE4+cMaBnNJW8+R7qirqxzLorAaXhNcjudW4SX80jxdAqvh5xp3AY4npjMNQtBhwc44eH2OOj8mLQcvrQGHP/JBcund0qoOoeoNqPoU8jDtSO6C0p35UXuS2urJ/7XBbw+IF6c7htf0rC4F8jGUdiVzBNbQtOP++a669b15o25CrkEs4WDaWDxT2LIr5Cv5NG8MFX2xRID/H5w/mxDVXlC6/6cp9+6686fLSFWvEXNDvm5NHvOtFvNsiYxCLwutyPPf7HAV3neHLe+v7GGtxFNWr0AidT5APgF5wc3UFUIVu74Iru2BXa2NTRxMBmpgmXxPZxOpaQ46gN/RgAxxpgA2OtuKcImEueouZIlm0prMO6ABiL+3QhVvNaW86kybTaWtTUSxTQTFEs1aRq0E29IK5ZKwWoRs7MTY6iiNFE68gzfQO3jmBd5Dalke71fJAdTRXwsGR2hQ39FoUbLXfvBIuiSqRIZ6VaY8HuagSWaNa9M2Z9xCpDbrbpP4LrLpvzB0KuNXG7Gh8Ga3SssXsfFITcrfBZy+0aOdlS6xWpT77WnInmed7d/TOjydUL1aZBGuKRGCjfeRFVbxhQd/OXr5RHSKsiYdXBDoCXuismhMsMhFh2GgbkT7wBqu+0Us2y/Q2TH5CvinTX1TWHyCayFXqHXK++BdVsc8BbxBgLw9v5OEGfjtPTKeOnyU/qEbl9DHosEPG7rNn7eRynEg2mXTHtFBOJL+ngziN/Cz5YTWupJLNY5ajlt9YyK0WeK4F4qWGiZkpZYBTys+SHz0tZ5VfID8CJgDJ9/9Janl09PDpyWV5UWLm+OiWLYfPSC9j7LNldAv0/9MMM7lKenGBvVF6ucl69iTImz0R6OGR92r1tUjP7ruVaLKpUmLl0qvT9iRts2lN7qXEAxMremxhFYzAAemZOh1VWfU6nGOGlmrf2y3wuZbXW4hBB6w4oN0BP3L83UEMWGEPhCWIV8wRIFRB+D8QvgehKNobGejD+ehaInpISURjOlpmJqM9iVacisZ9UdCw/K0EvIjYRRBtxBzibILE2ekMQRIanbbaVstR4+Q0TlKrmtpDMqWfcYMmiFPUP0TEZgCJXmWCT2WqT+aOj9UnDiiGgpFpfwjT/p3DcrIajw/6x6lqOVONSC//4DdcibYeTQwqvRCUe8Hyv89bZ6sTX/fkbaY/DMbPnsxE+eDf0xuI+7S8scpWX/1ad7Oa5ymNMcCUviYYA5suLiddEx8fI9Xjgocb/M7Nc+0JWhBgztkJjyz2JCjhqfMESnox3yW932jxmmnpz30GuhDr+hr8mrQOr7JLNBGfov50gigogBer/bo8PJWHv8/Dt/PwufjrccLghp+64cdu+LYbPud+3U302WHRDim7YI/YyV4BFnCN8IhACASMwjLsgyTqcxvuOkZUOeBfHfA9B/w50lUBgA4eaAhkWEqPT+szjkAonUw2+r0sFg0LyDRSz6N+Usn9NJXYQh4XsgrI72XGsPFGvbMFZxe21H9wfykvX5asU4ydEJ1yQtFJy8wd4tPbu2+Qdnvzgomzp7xw1cq2577y3MODbWdV8tmOe9N2+4XNi+eKPd0rZvWTtlvLTsHPdxOmIasomFNf35uJ/ueSdINJek073CA9vjnrUEv7mUhaoS1pQrT1I+3fAg5Xl+qa4alm+Ltm+Ktm+Hwj1IXgqRD8fQg+F3o99KsQWXB3uwneHXYTghr2qWBJBaMqyKsg6YN/8cHf+uAh31s+goTwLxD+FsJD8C1I+GDMg4j5VCADSPT+TCZWsjMazoQJbCj5uIQZ5vNNDRE7prATlJq0mML06RQeQ4yPOH9Czh6OnUBmAeegKjW6bpmi9TShg8rIgClmn04qKvTO/2N6k6Y7rpqi+LZtUzQ/6+5nvpzmr2R31aguxT6skX1D6ZtfSnWsozDd5yO649zqddX2z0Pw16Hfh4hliMrE5yL8tfh7kVgmvi4S622wT4AlAUYFqBKsArEWvfNWnljPQzXBE8RaAmKefdrh49SYZZ/yed01VvUFvsCqiID1zPGWUVkfbJkZn/kiX84MjWDCzF9/8R+kOxFZjCwmytD9S3d0Nt+4cNl9TV3D+a8uW0D+7Dtbdgl+aw9hmm0RBU/Dhedc+8Ca89iJ2ewF5yrYC8vzL1HbG8H2avDZzGsZIirrYLWsg38O34eEN+DnWH8j8DeYCQ1mE4uzwcf6WIcYBf5o1A/IpAOxz0dPMSBJPj+lNr8kLzsmt7euJGuqcEoFnp6arem98heys+gI8cu+iVvcnWaa4fNu4mKtTadjQ0L7u0/12L0qQdBobUufEgz+fVsy0QipOiwkLLMIZg5nF/YX+LBJK73Iu3qk91vYlPSXPiOdiQyeTosM2F11HVS9oiIqENphAyS0EH4K4ccQvg1hCMQxEbyGgM9v4TkLCQmL02D1W/2iw0hYjEYLQWrEECZIAGgy/5wgJ2pDm06M5xlEHDkoIdMEod+pmWhK/ATnb/GR2l55RpSiBRK/nLilz97V6+7bV9Cpn1pq02oEQeW19zz17lo3Y7BpiYvdeZ7xiy430XR4t6B1GErQkGJboNjj4mFHyl7dL9i5OROfrGBNCi2i5FKEfxrBXdWevggsRuDPI+9HiN+G4VthuCh8IPxymIyESqHeEPk117ddhN4smokN5u3mG8xkgwk2IMCjc+qIT3XQZrc7HY0YJ+3PxA34DekeRJ6q0ZHNNnjsPAviDRTiLEQkpLrbD43hiOERnIU9eeLIxOG3auNAZJtZ0ydboJJuq0P808aFTIVXFXxfi6WRS80Z1nD9V0/uXHHZuct2zt3oMzpJG897C/1b75/XFU2ODMxeNjdibYQt5Amv0HGq/6ub77r0P1oKUUN+Epyd67183b9sHD2vMZX672UWnU3hF3ID4pcWsGG/h8UW7KDOy+gyoIQZREvjMasRXSqL2nowHdVqzT431gXeNCBa0MZ+aOZekLFGDdhhtx+/odaPM7j5CHfjkOE7cthUZg84NcqN/8c5WDe66guRrBZIbpAeceVsZul6zAbSw260jbfgqLuDoeFOtO2CZ2GxUthE8FgG/v73ZZxZEDzWfsK4HG8lLK0ff6xsWWdN/BmdnZIdeDmihQjS+81AwIYbj99ljFgOzEAksBwA3E7URty2M1r0JbG3Fggvn/mUnka8JXrwk6HnMSlPZhmY+JP8FPgZwvDX6Bk8IPMcMCHti7P7WAvjBD+mvAdYGZ3MZzOz/Dga/c9T/PDXbmR6luV6MoGG1mjAxKf8Do8bnqWe6+YGpa3fGU4IzmT7iG85kVzGmWw1epA3o2epgMf2F0olDFgNoYg1VCqHImrErphDnDjhT6tLdDmVikQyhTLO7IMy7cLlRjEDeUwhOpIsZDADpdx0iPFgoPqUGxgZ/G4qExXMQBA1VmGgPCNTF6+hLqNWxEJvKQx0/LCS4/+y/L7qSuaQ3BH/t+S+G35pbp+8WbqyIyF9iLpJlL411WErRMRWb7R6mLIFJrJFb9q++mrYeMX5qP8iYhzy0qdTvKX0JVLTp15uDdm5IEKkPkvcsXq79B9X0FO6+W1ETy8o7FfM0EHBC1iBxZbnAAOA1znT9oznlP59Z7zGZWfaGD4yxWWyRXm7d2KftyAYZEO6ZaOg0xnXt/xLk9dL8seFANdHGLEFFWDK2i/BnMXeHhyqP5eqgG0GpKulXwVgKgDx6EvimO8DHxHyQeBjfERYV9T16MjndBD5g9dp4TYtPFcL89ouLeG1OhFvPKUHoRgGDhqfTq/Dna/z+6x+v08b8Acw77RqtFaN9n0/fMUPv+WHd/pRg2z+qJ/061dC2AbnQMIMvTADSagZ4WAj18ERgMPrXJGcHtui/ZqAB4uA3geIjKx8WCumHAf9Wh2UZeIoYp+aEsqfPJo7qXg27+AXriLDEtmN3GtXXBs7gxE2+q+PC6iBlymBhsEv4SUE/FDLZwq5qiA95ioIRukVq/QKY8u4pfeRtBkTtsYPkH8Q/ACfY20ZF2Ibn6Wb8E0sIJ6Y+M0Q5xTkfesiwSBMXENcifcm/nvQ4qz1S4K8S70WRJD9ShbdMOiGghuq0R8NX6H/hybWe2CTBgLK003DHI0AV4gmaLfHLeNgDW3VaOiQR+PCav3Dp8yaELZYT4VtmpoEmjCsO9DpgR7aLFPvldwWHC3J5Y5OyFmRI4eZ4/XR3shy4dU0GrMAWXbF/atpnC+QqJYCqrMpeZe7wJv4iQ9ZIeuW3sM7hSYmfBz+CR+ALvVcr7UbUeQ2ST9kcQgC2iNKrZxamHgA/hwfqeuijYhHE+CC/TYTh2WHthtpEIzKjaVgwEO5acrj8cucEnAImFPsAUAkcCOhm6YNZqxojFOWKsfma8aKkXf+ga1qg4gNBKXinLxTkIM/JsizsCAnuPCmFamQjdJDsxPSXkjQ+Yr0jeFYbBiuHI7BHZl+uArvod4nMsPwZ5I7pffYkANJpOcQ1Jw0IW9JCfhffXF5c+JTdBDUcH2UbEYYBi8Ztr3au9TzSw+xxPkLJ7FEgKc4uJT7JfcRR15vgoIRrjVeaiRu0MGNuh064hQNP6LgedROah9FOtTwOhKuI7eRxK8QvH+B/ABZbA2yb3arAbhUijlpH8dgRRkis+V0cbCePrGZns7+KiC++cKt39+/+bxrtz70+OZNN87vvHRfV2FRxwW3dpfIn++//Oqrdhx4aed5u3a+8Oa6+VetuefV8+fvXKW0jbgDtQ05FmC8etFrXvgTN7zLfcBN9Lpg2QUjLmhzwZddcJ1rm+t616Ougy71T23wXht8Xvh3gdggbBduEP5VUFlZqDXBT03wNdMvTR+ZSKcWalTwlAq+rfqdivgbAY8RHxDEoAZWNDCugaIGajgdg4mAh5J8sN/q1OEdPaAwKzk1nN1o9OjNwEPWCIODVOP1tP0xeaxiBQuAojWwx1P3emr+Tz2RL+fxkRHOI2ecnJHELxF3fO8rNz/2nVtvvOW+G29/4sZIYdN9DcULehaSO+7+tx/c+uuRzHP//u8/yPVLf7pq4eZ3r1qx46qaj0fcKNuPJNhaDcUTzQlCk7AniFMJ+MvERwlCG3AEiE8D8OMAfDsAe2qOnI8WTVZZSqJGmlJFYzFDJOTEKsAFDGZscIw1TDMVekDCL/s57+CQg8IHW7bUuODLQVvuDL+OuLG/+6LmudgUSY94kFFi7GkPjL8ykrhhQTTvT1eD3cmY6rpNs5rYk7JVCnC9hGmYE4U1xUWXZQS99IShlAdTvm0fancMlMBb1aFTRfhREf6qCF8rwueKcCgJZyVhIgkdSahJwr4oLEWhLRqNEuogHyTKwb4gwQfDQUIVhLlQZ4hQhayhUIiEoUhIjsgQ0EogUkUIOiBbrWy8GifidaIZs0a6MUQRKpUhm56iGtYxxkhMQS4y+ZRseZ2EeTz6pUbD0Qm2cmwqrjla94+m4zijyMr8U8rK0QVlGaIajXOy2PX9SjrptZiEGpXzNuRDIyo3bMovziVe/9d8MDMo/TSbnROpWE2r24YQvL2SIGrkRkpWdqj1lpZ878Opj/vEoIZo789nEeUbMlN45TVEdzforfIuJxAZ8XaRFK1uiLURAYy0TC+TVQQ85T6Dl2Zm1vM4s54/LbM+o511X5B4TaD1oZUXM7asS3oM28/VTY5+jaAl7lE9lue7J+6YMpgXap0bX6w9Y4TcI/v+d1S7no/AeyOPR4iBMHwhDA/44SkT/MgEXzf9ykR8aoS/Nv7eSBw2wr/q4Ac6+LLu5zrir1r4gRb+Qgtf1sJXNRB7eB8+nY15bQzG3Hav7OQ9lbXL5uQpOwgaaipBSW7KDWROoJc6gJj+2TIzNf9Pk/MzOpvc4806DRbnUN/OP7RZjVyTF67y5gRzQ3Fbf2uv04ZAhAf61CMNXLd08KJZC/PZb5f/Bba12xHc9And0gO3z5rrCcwq7YEDwxanoPg1gAirLkQ0SsNHqt/RRGBPGJbCkA+Hw8QzYdhkh9fboEYLP5IJ8YoWPqOFj2rhV7XweqRINQ2aJg35igY+g9QmDbspWKRglII8BXUUfJ+Cxyj4KgUfpeBleOBJnCL61TCihho1fF8NX1EfUxMH1PAxNbxLDa9Rw0vUcLUaLlLDPjXsV8GKCqZSUY8HCSksBeGrwb8FieuDB4MEhSRWFj+aQv4FpY3CqJrEvVP1h6PWcDiabiOhmfSSGZIkw/R8BlZxiJ3X8jbZ8bDqtejPrLfRZjd0u+10NImrAX/0TMoT9NJ2jeJL8aweY++qlvGAMKW2aRUPfiyPcGQ9S4F0PXqruSL5PJ7rdlxJRtQi4mh/Zt7CXhf0LVvw+Vq8fAZfzLQVsu2YYhglfgaxPJBBPQwqg2kwtyDVIOKqTDP2lFGVxbzqwmav1v1b+3PP8X8SaXsHTJk6xYf2JrhKFLbyHeL99zm9QvjP6rkl86KJzYR24m/EI7ONKZut0TIsleG1l+cbbLaiZ1jqhWNDLp9eY1N0boTgVBtAHBTA/B/EsWZ82qxKZB049mHl5Vi2Nps028y2PIcA53tVbSKvAfEIoapFQd46fgzXRK3lozG2eAuPBhwbw+NWZH1HTWVnyzhX64VCMDBdUKUuHNFivRoFwXW1VeESiy88q29D+03rFhKQKOb7mvv3BXVGWqujjaGXlrmWZsNp4urly7u05nmti1ojOeG2rmBzS1fUt8A+//lNekqlCanfDJkbeyJtUxgLtXWjPPt3wXPAjFqo02PT+VSy0WeXo4VhVWNOZUS/dGMm5ve5gmGk+98DNLAo6qDe2tq8BgQlx2S3HDVZGRciTzErZWBEXjBZ1gatNWVO0UXc5NL0NHqaRzsEt6G6b50vD3Eje5sH6o00hBUq+EOz+tZmIunBpe6l5K8XtuGGhj2nt5QOB2RCzF8abZ31ZpBpnGrvVaqLgAN5FhdX08guvhf8S5A4GHwleCxI9rtgzFVxEToj/J3xUyPGTQgxxelmmgAO1oLJwqic2MF72u/mGCQ/7z3jDFPARqgopeePHj+EOz5/SAaUudxEBc9CmEoXbYHTs+uU3i7na6qQVnL2CkgirtJvXMjMXrGu2tI/55KO9HxRrfPFDK/tGm7wRTOLysT3bxweXjxn4/az1wb80twE6x/hT/54XnXhWf1L5PlvGDv/P8y9B3xc1bUuftY50+s503vvRdMljTTSHPVmSW5yH/du3MDYYIotcKFcbAKE1BtIQiAhuZDYxjYk5CqJQ+BG8iW5xoFgm+SGECBxyruQhCQa3t7nzEgj2+Tmvvf+v9/fwiNpLOOz11577W+1bwFaZ45oJ3qIr7GGqLPZOeCkTE6QOuEDJ7ztBJ/fhjW606HGEFCK8eCJ+ua4oIi3Pd1hNzia8/FMWKkUF+8XPCpAMKDT73vE/rSdfNoHR3yf85ErfNt9+3yU3Wf3dbuQA/zmM90msdZgqsgCaUW1JKNU25pIv5ye4AxKZnIM19EgZHkBuSGVgPKUylRGr1dIWyotiQ3ZmeMJpzsSsfJgqi70vdCLq+xgdHnPohG9nK5fmmztn6Vo3rAim4QF8Ol80unRGnqyg2zCGJOYffJia35wXS4WnaOg57fFyq/+gtx6PfXL1e1Jc+PuYp9aku+LIAH2d7asjr3hN/UoV7Ul7KqcSGsT++YsjRWLlsWhnCXtefJjUzq2THgfYSC8xCdZ9rTnRc+rHuqAE2RmeMf8gZkM6EGvh106GNGt05EdOsjqQK/z60gRBb+i/kSRDzsed5CHVZ9QPaHClvutk0aH2qHElXxvPcM47FZGi0+gHAGOt0+pVDThcIkEU/FXrjeHA7Jjk+NpTZ4vXkVynUJeGLJXEC3Dn8MgUsNa96YCZJetmr9++UatVK0xSb5knb1sbXNmgzc62NTe0tUfcVMrH1w82E3m71CLpfqO8vXbFw3+07yWAbZ8qjDSUZHDCiQHF5Eg7mcTghi8GXsvRp6MvRA7H6P6fRD25X2kTAHvKv6iIK1iiIiaRP1IBia3i7DgZbsNRjXllmItjegwDDlpNKKTq1YiVTvhrhM6XPgqQzLH1yNePleNxh3ACU4O+BCOvXwWXWVYEnl8EqsHUezN1Z7D3LQg+PMYZAK1nh654ou2WSMb2CZ0HvsSSCSMSfKYVStVMZbTkhaHbVbYFUjObyC3dA4Pjwxtvqm0rm7dnZxgJg8eoCUyF1iXeJm57PylPYt42cDv0Pk0IDT5BJs22UFqhw/s8LYd9BoQaeB9DbylgVc08IIGupSQk4NPDgheRIXNQtJAqLFMjE4un5OmCcJAIww027DSsMNwv+FRg8Rg0LXSQzSppp10gqboI0ZYYdxu3GekjEadVYHVR8cns7gjig7oBDqh6HMGiSxzkTuNxHS2lXeCRLWusEHvrgiqOjIUfqcqsAu3d7a0dt2y6vrygWTjqu2pzZTMNZAPeNC2Lm7tWDznhn1zl9y+et3AggNfyhh768LNU/fQlDzuZ+t6dNAng34ShHq9nnxfDz5dVkfqdSDQwfs6+I0MXpK9JiP9ZI4kjZynJzGp1Bwmd5pMatUjkqcl5NMqOKL6nIpcodqu2qeiJCqJyqbgTo6tZunT1gknRNP0xcsZLtDDo5WdsLPq/eF+aF5HKrZH7K0UIMHvuBXDrZDCS9aqmtlFOzpaRj6srJ2aixa9bxVetGJJa/vi2f/JLb2Sp4EfCbYRdcTiUxKZx2OpIzTfRtbYQMjQq4VzyzVhoq4uJvEFbS6bDn3ETCq8iBhS+5pFMBmk99x4bc5XvzT5QlrDtxVWsywNNdVg+B3vVDkY/p77Fi8HfrR115yWzgd3D7TOKaZ7Mm6Do7B1p0plU/kDioT8pmJ20Wry6MZI3fDKeGRkIOTWmLOZRNueraRAb5LszfXMmrGupcfi2ig+zFat1orkiBXXacV7xmoU1rhZJBZLGZXe7Da7pfYgXph05u5keLcSl1bimjd+XbjurVJ1yndL1uPrU4RBVCX4X6mAqymAM8CPOlvm7NpKr16ULd4kTygCfrQo1c6tBYfBnelJF+e0Dux+kDw7XBfZSM/qye2VmPQCcuuetkQma9a4QwMjkTh3t0Id2S/YitBhKzFEbGZ1wb6Gvp4+Ktjc0NzTTBWNKSHBqaI8l+/q8TuV6nAwygUh8taBrpawUq7t8Hchg3VcmGpIIFOG1noO2avMRUxYReMWtslz6IbEv9F6z2Qy5yZ4C67DvJVTPfp8hmyqZ3+KkLxmp7mLsRp50fLVW1OhK7JfRll73O0ti8PReMpUuN1zC7v84RuH42KZS1yfX7mxvbhkOL/LJTl100azk914oEXfe3Ag7y3s7GuaLYgbBRDpWpBNKoIOi5hCJlizuaOwKOtwK9WGkLTR407NztywKF8fUD7x/P096bbyr8JKBCJkrVG7wW9yVc49JCElWE7okafd+yxhQHpiofSEDLCBOy6hxLJvIcdagmRkwokgEtdgvX0M/U3e3vO9GUXeG81X+1CRba/pQ63CaUrHawekvmS10wGQt6glGhmy430t6Bd5XQc8O8hI9XqPJnNun1oiLf+6UGipxgJGhUeQn/0Om7NEQR6FQMDlCj4QgTsjcH0E1kZgQQQ6I5CKABGhI64IFYkDDAihVQjCaJzbfAPOFgmjYkIdd8bJuNimFVusKowpWcYxRwlJJasklWKxg/RHQtgxUw0HoDUA6oAzkAhQAXwyTISFevsZq9XOh2FOKIVkPFUbiOHdtjEeAyAThr5ncPDuTKmEAzJpBsGBi6VxmvjOYWHFVUubEnzDPleCluF8tp1TtWWcjtV2ePBXZGXwQi6jF6l5FukMOVp+P2j6sk1VV36nUyXVyFVyq+yLtnvjaNG/W9hx333ZJp3aTzYawKR0/sexYbUYDAanNgXv3amWyvWdk5duD8slIjup1ZKtdx5rb5SIKrHvH6Kz1kMcPJmNudKZQAyDoHq/y0R0YLsPkgIel/3WSa2p0NqUTGPJyTKZXJNC5rTWN2Gp+Yggjv1ruIzJMQ3Zw0tMM521xfGMYuZitVIbvyKZoZN36QyOcZxBsnshzU/GqSZwOTYG3VT7C/+G6Iq3qvLS8zdGjXdH/bD8e0VRQS4tDovVneV3+5RUyeVKWx3qWPn3SDFFYofGKH3c0qTMF3dY1i5b4VdKVC1koz4uzvzm4ED5pw1qt14flaV/c5ixuss/HWIknOb+eJHdizDHjU3y5I03rvQM/CardXE6DAnSi+xxkth+MuLRhcJWD75mMAZ4i5AQSWyt1LGkhbWQFl0A69/JcDiqZWJ1zyMJmgkbEpmF+iUrk4lwZ7iLpNAJfIcolrhMLIabnOCwpo1dwo0C0xKjp40yp0QVwU1FwZCcjFNyQncR6X11S8oWdmsiMmp+X7dMnVWU/6CoU8tAHKCN0i9ZVi6+j+wqv9uS8dnbNUPw8aND5UtNODzm0GXH14japIaOXbv+fdq/TaJ1457UB9iBt+zwSxuctL1gO2+j3tHBad2Luld1lJDW0+T7NHSroUENATWYFCBVwJ8VIBNbxGRe1CciIyL4qwgMFIgp+BPFhZdZJYtzdYDzdKSGg6kWA3c3OwhhTV4BHSyuSIjHnhUIXs0uTJFR8rzDM/MLZNLjv23g1r5Wb+C2zltnsduL0fbZPp0/ufgQNTLYMzi4Zv6GwZ5ZfStmf/KB+U0jyf7187YSVVzxW7RuH7GTTYm8Bi/5nhfSnnYPSXm0Hq+Het8D7xrhXQO8g/AlBQGqniPqJ8n3K6Fzncpm5/K0KrvNJjO50T11TEZX8iXjHGhESGPyhXSlAmoKKe6EGXn4qQ61mXPl4bfdA7tb8+2NXo1MKO0t+JPh1KLmhNup0ebZpdvamqiBm+ct8gSbM0alryfetGpF9/yQrVeyoqV7+dxKzQLVhfZ2K0ETg6zbrwaR2qAm/6iGdwXwDgU/pF6nyG9RcBf1SerLFMUlfgCjqmekYikIVdy9exE312UuV9v7oFKbUk1X8P19BjK53ZtYchd1fd/grt0PUF0L+lb/O+Pes2DpF6uyJpPUMHqOBWzkx7L/lJHfk8EJGRyWfUL2hIwK44CgSUj+WQhvkvB98hWSPEkCzT2QihBj7EpLFLxguedBj5Op9PrxQq3iT77dD4mSTHJPwj8VNYyf5CD/UPydmiJXoL3H7Mv3sj5pvbmefLv+z/WkOQSyELwWeif0QYg6HXoxRPp8WV+nj/MxTwUSDkPCrjZwip3ALFpSV6Iu4rFw8UK73enyYFugJGhczUy9cywrqTqdnAk4U/G9kN/58pkSMgBnmIrzuXOmXnDB/syMrPLU6Z8+AGKOUJHDKSuK3bujHpPDycTLP1M3q8UIoNB68VeMg2vmNnZuQWjH6jAlRdK21GDASa24ddFapdT65dm01GDw0M2kpB65r9rO/Xe2zT61ryOhVmTPFk3e3EAzt3cJ2CzUEkYie5IwapVaCUZupxi1ViMVq9RY6Qk9DzYunilOXJzAZT1nJyfwyiamoDXDV/1m9JhaBWNq2Bxd2W5VLuxvUJk1o6MNdXry8T0FexNcr7MvMbY8Eyl/dmmK150QOYrwj4dYegL0Hlzngixx0TxsJs2UnlFL26RITRjCjGRuRVJ/G0n/zRN6rdDl+SjX9/LLl3GvJn1p7IUS5/ZygCg3HXcT5zLcQ3LZ3Kq7S44+Zt0ye5VD6WaiY8uaB/2Zb2rlCsZMXte5a9eK8ND7LbQUDOX7bx2ChpQTfXX8Dloqr+i/lZwvuB2tYfY35FyyQCe14lIpVuFwuGiVm3AydgdXISx1F3XDOlLHKLD2CwgpfvRLk5deKPGxCkhUbxLcRsUD/ChwbWW5SluZSOzNVRuhjHqvgZyPn67AoKeDHbcOlV+q86CvBtca3AhU7NpFCdCaPEwEr8mb+6ZQamPMyHHfwj13GGGL5Qhb7DvRQzRDGzZ7TVQ2ksSW3KunuSoVe1jqzRfwqpoiUXwxHosYdRhBGIgIDv163dm0VC7u6qnuh7h2P8bSGFXUwAy0wjMcqpg8g9kC8uiarOzPdEs4jxyminb4DZqJaK96g4e4P7wSMQCNUQZtzBaHSekwGDDOGCra1XGgqygDId8ZcEHPYYxOa2AAAhF5uoIyBiEwTNdgDCQ/IdLdESQ/O/FHtv4DHc6P5IVgEYJUCB8I4W0hvC6EZ4TfF5KfV8J+5f1Ksk2JgGoSwVxlUAMakQRXd7E+nUan02kURcmwhHxDAhKdzWZAMPGTBggbwGoAoQHHfn7FJighuqrtTgpUFHxIwW8pWEFtp96gqFZqiCJxPoSUU0DJdaAzWLmUxzM2pUYlkfPJuTeP6UTCSpKjyCHlSmajdLGalagkN/DX1e6LiWoRSJpjqytVE984hibishVUpSfmiuQEOeJU6DTfM50xeGQOIJmkcv9+lVBRd1zQS8qZaDkML2c1QqHBENE6yz+CZg8jFtEGTq5B8i5BCdnv9mdxUPaUxyHSUBYDjjufUhk0DlokMSHLdNJFS3wKspK3mdFSdf4yfdGYP88F4PluqhoQFuCvZr6Fig8AkHc9Wuc3ZZf1PppxmJ3O6OwefeqrX0vpe2ZHnU6zI0MeWuHUte1akUkUNg24+uZ/7nPz+1wDmwqJ6n3jE95LWJCHtIU1S1KmFCm2GC1oGQ1kD0nZ/UGz0V1nxEc+yFUdWGUYsrMqqbjO7LR7/ejy1xIIP71zvC5ZE8ksTkx1A4ylL6e5QPFZbuo2F1KfSsqLvfgaqQ74wJ4+ukSqK66vxNVxSJP0Hcr1z8/p1+iVunxu9oqWzg2f2rbYZy9kHKnITQtsisT8f6Yan+qxFXfcOHvNfPLI4lhbOJDMLruuq/fZT8+RuuzqngWfnePtn/zzEI9BhAhXWwQbEEKey1oO68EkNWuQKRo2Q6sZ1GanOWGmzFw04BkKzBq17jl0hQrRQk1SqPiwmQxa6PgZjEMuTqBlYRZiDjmXgDIYOae1oTpFx8tDKi1p+YOIKtZ1alUWq7lultCwe3FMYtsrWF6WtMz5Ss/S+/Z33pHP7njhpOcVeKyKg5VojzCP8rfZxfoU6JHVScK5OPw5Bk1RMEfDUfJd2V9kPNqNiqAgnCUkEXiRkjCIfiQG1lg0Rkpj8Grs7RipiNERkR/e8v8RZ1J/4P+Jn/Kj6wvvsQnvMaueEwFXBBcUUJE6D81FKhV1Mb9CkXZZdER6qvKG32Qc8+DovibPXcbdm+gAajiavJ3VdoRKFHJnbUVOQ80ACD6oVS00qVTbTwc7lIPDWzexLf09Wz2ptcVkR3vDrKQhUi+zeNffv8TdZrdu2fI1R7Cvx2+nOrctWDzQs+W6wX46EF3UVMBkQ/W5cE7MdCfWtNobi02rj2y1/WgOO2egiY9hkEcRDjUjtH2AbXjOBxYbSG3wgQ3etsEJGp6gwSzGGeR3xB+IyZ+K4YfI9yVBTMKvyD+RJAcJOcxtoTwMdiNOqZVCRqlwGLC2CJC2eBkRVT3mSFtexlm2s8jLujjGFy3xrRpVBI5HNem9OZ6GWo9FwFxZvcTUk0c/c0fb6AN37jj4pay7bk0xv9IR7IhIqOepJXc8Lv/Tn+RP3HH9Z4QGz2u/DkPpzoh16dw7B7sWJZjm8mdt07rfgnTfTXyaNdkkVrvJLLXYTTKpRSQXS6wiuUkkF2HDrbabdHa7SW5H+NQisXKqEJRadFKphRi2QqsVKKs1aiXVViCtUkYjRT8qEjjVGp3FiiP9ToLE2Wnkbo6dG5/gXhjMOHx+gr64ooRpr144XC1qxDFD/hs1+lVFaAmgvNoZZ8gJ2gzFI58W6pYWl04TenTT22613FTXzRh2NTmUeteDm14POYYXieB3YxnXwBPlb8PEEdZQt+U7zeYFo+Apz/vy/vV4/z+cjSzg44QY3YQ78CT137O65s4sRaMXIX4R0139WbsMgwYpoUe4yIZpZUjaYCRIMFMkKxKwFntWQLB2sJs5n8swLAOZKnG+9AI9+ULp3ESUMCUsEyuWlxKvLC8NXuZ77qPol7YS1dJeGXPgcN07OLTVW34f3fVCsZPBWRy7KkRuQu/+7UkDusv/Y5nJg/zlcs8Qw3Fw4bWchoOEi7jvWUL64dusOpzLim3Cp8l/JUnSYcFtRawcGzaSpswWGa4PZ2lWYWbldNbMKFgFnVUwnHFncaVMgqD0FGGTyPCIdpc3iz+fQD8qkyReiEaBHjOdQYuyDE6eiaLNe4Fb5uDkWOIV9O5l+uWJnRNpbqXAR6jFCLhORVd4zhzebzDA6Zy2QeFKrCy/1aOkJHpaaxQ9Ye7qdSSgozFcKn+wRa+PyZKvrAgwUn3HLbf4Kz7kh93kKNyKsOv8a+Pvb8+E38/QM7E3kZgC3olrAG/h/znw3v3f4m4hevYR9Ox24j22EYGvr3D4K1qFYK8Lfy38q5DiAFhQAAiD3a+EayKwwEcgsLsMnzSQ/68wGEbQSgTAiMRYJvF/gb52VsDXzv9D9AXr/x764u7KcjfpIx/l8Mya/wmeYWrxjBRDGQLDl0Ti7+MY//8nOGbwH4QxSI/Kg6QFnXkz0fffYBhWzoMYIUYv/GSuxEdCF/1HQhfp1cgFbi1L5rRcjVyq+8Gi53MTcWKCvem52E9j5Fdi8MkY3B2Dr0QBXVA/CcChwMOBxwPUK3444YfH0avlnIU8aPm45UsWqksPWT349UDptXryv/Twn3r4jh6+r/uljvyFGiRK+LMSxpW/UZIvKeAVCZyQwCHJw5LHJdS4GDZY9lhIIDRc12XIxJX3q0MqX8RACBwmzpIbiEQpc+niGbx+ZAIQjpk8j1M2pSpV2s7aCtnpX7go0Ds1TLaGf3mq5Z6qFIVwEIY16pPDa1Pdyeuaug/vHerrHdj5WJesN5g0LFrva1p+aFmd++5FcW+52yQElY69/zsfW3vz0gW33jB35Km7FicVQoqizfDWT7cObf73DcNV2faSR7m99xH72KYnfc/5yFr08hh9giZ58PKBGH4thlr08idyKqI1A76wyip+EWDgQmCqWqQoV6GWacTCvfj/r2DL9f8AauF1vYXTpQf/55gl9g9iFg6voFUjnJL4H4EV4f8DsPJffxerkB++KbxAfZ2oQ37AUXbpvXFYFIdDERiJQE+E58erGydWBnYE9geowHtEAhISU84V9JkYhe9pZNTtj5rARNQl/ESADrjQzwRiKb/LI7ZbHZhcOZYSmAwxiYxj+UC2jr6M41HFDKYpKV0+i8392UulSUwNP6bJXyxNll6eJqYUVak/vB4zf1+6mWqkA5t4/oS4q5zRfJhQeMG49rr7H9udsH76/Hs+5yKODshrnweN2776hZXLJw/PWf7Ic3OPqZ5dWWyUwdBDG7aPZlr/F6yDTy2ym8E/+ZmX7yDF86xG0j/7ui0bvih5Yu+9r4P2vVmdazHX2Jcxb5vwCPKbGokfstlDWdgSh77Yphg5EroxRI4EbwyS3a4FLjLnApHL4Aq4qD7lYiXZpASp0qwMK6kIprFB3iJmEqeIJqfDZPGlfQa10WlMGCmjSCGnCRGI0nWLA16x1D3qtCmkoyoLrUrYwKayqXwBsc6Af5Y0Gs2QyflFWLYZXOOTKOFKF66CAbeMIegxjsvzaZyHQfZogh4vpSfHXk6jr86XLs8oxayW/3A6huVawY3+DFf6k8G+1BXx2ErT8rNfuPerj3ytOzpb6RKd1JpBmbFFVKCN9waGaee39eaDn/7y6pF/aeoezeVCrRuuv72zHi6/9/H9u6iXPateFwglrbR3R/k995o3BP/17AP737lnw61WXWHywrr7tmN71Pnhm4JZSN4Zop34BTtUXwSpJ+xZ7KG2aG/RkusAArAASCFAZxFyni4PafDAUi30A5ghD2S0LgbqGMSsbpffqlRnfUIiE0/IFS4hCDtb8E4U9f5EyjvqIFKjNgHpTjpYx2wH5XCYw9EVMRiKgTOWiBVjVCxWB3n/AStYzeJsW4yRyhUKlZqR85G9CaTYacz5iDehVOIqFHaOX8jn0R5c5jKul+lzpfE0J/vJMfT5At6N0jSHH1T3Ae8Cr9BG4RUlSVObE5ixOTCzMkkw69sM42L01ri8/Pu62+7/ypbVe0a/d/PwnBi3RVYHoD2yRJXAxIveYbr8aeX6VHJR11J26MhSwZk3yMkDr1sxy9addx694+mXPvPlwX8NrXpdJJJyG/U725q/vgOvPtxsG9744qd2P4BtqA5hnr3CfyJaia+yWw+2wIKW9S27W6ieFpDkTXlySQL6EtCcgEgCpAlzghwxAE8bITJg4giqLh7W6+gdxH48w0LhNqtoX30240mGISz2U81gDhvroqN0Omkc1Ws0Ga/L6pGpM8l6hYhjQubJbcYvc9JGel+cwBw342PjY5Nnx8ZfvjRRorkW9SvK0rm+FF5uduAp0Ct6LjLOTEdOiZ3jTqf5K4jam3VkCq0Dq6yq3/xmxIJ13WAGsPlb501eDC+zKrojvLgNx44dX7Jz06ImwS8cuUXL1mbPt/eWT2J9dy3c74n5fP3uNSfRURCBqrcAql1NnXFkFxiCEOWpp4kRYhWxhfgZu1+hYGwriRGpYJ5vAcEAU+rXrfR52zsDrLoN2vK5bDrvC0Sjjs3qAAQcq7261b7V5OqVC/Kb0zmd1+clvTqNf3SzgNCMziNmL1i5YMcCasEC66Z1sd7S0lj/UG8rO9QGibZiG9nW1tHZK47ErVG7w2q1Y/Izu2xmahypPNZymjfpWNtL43mk6BdwiTj6ksFhxxJ3vZfw7mCaIc780Fw9QiZzAZMRjWOTxPHUQ5VxKDMt9Zl8ktU3pr4VoT3hqqWrZ6GaVK8WTdc3CCt/aDDqDX4eLov1BlHeVzDYlcb15QImN/vqa5Q04Ogqp/YahK89lTb3l5vXmZVzDSFfQWfjmc1AN81stuqfWw0jhvLvrIGFGw8BvFh+8LOYCu1rJHtPXq+6t8q7tk3g/0QvndDxfGsn/UKeyzzvmD9h7bw3r1U5D8zgW3s0f9vN1q6dmK3tdoPzn7wdbT+3x+v3UtgGYi7HPyFdKBDdxHPsNlMUFtbBYundUjIBRSAB1JIWHxJEIdXQG4qoZV2+gDoIQaPd5mQII40uConMRFkaRtPoSHa1ONN2y6gzl5qdXpnekabSaXVneyzmCxSDw0EyGAyLIhCJidUFUmMFmicbH0NbXsJ7PlHd7cz4hclxLiKH7BuGM+jAVS+YcbTH58a4Xl2OdoqzcVCqTLWo3cja8zVjJ6uDm9GB5NUCKn+qN1B/KjfjfRv9i9y6vdysGzIxIgk6asJDDtrCb9bnH/hMwaBCR/Kf0ua28r/r3Iv37N7vG1QP7zVEv1kyNPp8afeiH8Oq0w7Fz81KtAvf/e7nm2/75zXfdN6w366CJ2/akpl9xxdx7f+HT5X7qeeQ7OuJPuISW7gxB7uzYPZCfx4a87A2B/NysD4LI951XrLbC35vDvdrwBI19KnBoo6om9SUFH1DQgN/7w/E6wIedyCRkqiULGEEo0bis6tNTlPCRJkCxebFmWi8ri6Zyog1dtrjHJUGfPSoipDTcpeckssFZoPVpOr234O8cu7eL1XJvWoMIE69cjsFifFSZjI9XsKnbwxPkKTPpunzV1BpV26f6XTslCU0VLepvmHaCF6xTdQUHqgSNNRTz92148m+hnBqIWcXfXJKbN5ddpnzs6CdxwlmvYypN/kVYAns/9I9y3YeW8YuSiZ886RMId+7tnUO/PryZ/bp6dh3PMhOeulGvz866kJwgXxlKUIXruvP//S6A+WzP945ZNIsKT+5zdcZCgytx7OmvoU27RTarybiEXbVugB0BxYEyFwARAFDIBCgFjPQz0CeARljYSIMlUq7/D5XJien1SYdIfeFra5EKpEupofxwcjKRA06l8bvGQ3Lg5pR2qWcjSMlJirXILaarBaeXS3D1ctOi5/mMpYlnPg+OzY5zlk5JHt8OtJXERxXbNIUxNLV2LuqxDnytVqRk6fSAWdJyxjqEhUJK7uWlqO79cJO/tIxGygrY3UGZaCP3HBzxhei2EBDly5S+jKSp3D3yrk+Xx8z+3n3qteF9H29BhU6AmfPOlw18ksQt7JD6+t21x2qo9b7YMQHmBqEFPr0Pr+PWqKCvKpPRcpUFlVERXk9DqXCwBASX9DscDBqr2s0KPGrR5UymYEU+mNirLQ17MHTsqoR0aWJGcLhZGOHGskYryGaqptMnur0LE3urUrD7btCHJ1zHxzuGKE8fR//2J85ESwPxWplsPWAM1SJ/71JidH620DFBiRek7fRS4nBCGTQCyGAQksT0SZIJ/aljqbIVEpgt+LZNzr2sEsAhIAWJAWUoKMphk84o6LpJLqLfZ4xBr7BwP3Mowy5kxllSIKhET6bzaxkhIzz2yl4JPV0ijySghRJFB+znrCesVLH7XCXHax2vfOfW0BZgN8U4GIBxgvwmcJXC98sUC2FohN96Ov9yXA8Hhbr/WqJQiHhJnHQZzAKpcd4hkiexqm0s8QZ61KJHp84iz+d5ev7JrBnkJiYoPFMKOQV7MR/i8GeBH6rSskNnHWYKiytTB+ZruQJVkx4lZ0RbxozTdzi5LaREi8JLV98y4LNXq1R6XabOgdvYGPJEe/erT1olwTLbY/urh/MIKfR7XbFW7Y3xXOfe6C1bZgmOx/MFnpunj3okFmg56ZZC/zB1nlt1kL9qodT6c7dDxrVgfKLtzT2OzwNmwd7HGu4mXPPf/gHsiD4DhEnTrDrRvzQ7YesHzMFGvwg9MMiAwwY8DiCsAE2qSvmukkNUrVZHVZTRNzp8zrvNcPNZthsBrM1ZHP6pCqlTuOSglQakgdG3Ron7VbJR2mf2x116LWO02A9ZbGKojGCYx+9XJyYfJmbVl69KSuOQInTdqT0L0/gfbiExyZe1THpF1X7omrBJ1dTwszAqlwkiCzY822zt8f0bZGKF/axvSVDxHn+/BL+QNBLhzwn59a3rEmu/r4TmVFQuVMP+zaU/6O7fNK75g3R9k/MQbpf4WMlosT32F2PByFkBKnRbCQlDPgA9ByRX4MRAkbkWS0GkohGAyqFUhlgLFbaKggGhEL02RcQ6gJCF1L8uM/j9dIGvZ5ea9llOWChLEFTmBGQBu2o12UCU1hJjhLhsDBgTfpFtDCpxlzbefQfthCTZ+kLpbOcjWB4KFmZbJtBSsrzVlTGeODIMDfwZGK6ZmvKk6LcPCdlhnLnpkWpddcyvGLVvO7bDQd/A0Pz3M02Wu6R/+1VcO0Nc7JM3Pd2+VyV75Uiym9srUcq2fyGs/yilK53biz/ygf77ate90Cuyvo6alrD9Vy1lLup15EtyRKdxFziadawYXDPIHlPD9zcAxt74J4GCAXibu9pKvmMiG1v6cihr1i9gJCIulKEDGTzW/zxgZRZR1v7TlMpVud0S5wdgjfa4GwbPNL2dNu/tlFtp+FzrDzoRB/D+VhKPPxNKkWoCDNIjtO0Ss1VRNNVslj6MhJLOs1kMjTykDLjGa6Fv3T5XPpcGqO6PIft8jWDr7gjXz32lf7EZqj6o5WjXxuurK1WxM1YtY3+CBe8PkeyfMWjT23b9PCdK79br6AlkT2N29c/1NkzMMe+faJ1UWNh82f/+t0DA0eb1j6/d9WBDb7dP9u7YlNndvZTXZnZy+J+8vfpdbLV+fo5h0bGHlq+hNUZAyKqd8f9C4d1bemYQkAJpcps44Kdax5YmLoj6WsN1m/u0ospEbNhUva5he2/eWRJ+xA71c99k2A5kSE+fSxMJHA0r9m70rbDtt9GpWxttjk2irDRNpeNstncoZAX008eJakrCChJldjrlqotuM32hFSlkrpxqFAqFpMRmzkYwsnKZzK0kgQVn6y9hJE094qHH2Cd5hg2xi6McS03mFBSw30xxbjBs+vVXH65GWU+mauI5cmbyn9sYBS/VdCN5T820nILEwJZu0L0WzMdBVmbQiSj82SjwaJrueuuIi6StWhbwTdHLTMa3XT+xhuHGDn3VfkCy/Az3Yk2pMf7kF3A8faH2PjG2E0xcn1od4gcCeHm6V4vNHthxAU9LuhyQpfjoIO8Rwi0eb4NbBj0yjf79vpIuU+pxKwCaVZpfoSAJB7ng/yyAH6HFvv8cnnEYKaTJlHEL1BzDMd57Bvi4S/nuFNfOoODhsgWXC5p8jMspl833T2LXos8dzY+3VVNRHopqLaYU/v23fHssR/ftutbI+t/Xr5ttm61FJ/sD/MLrsssOH6sfCHXfutNhQR18o6DP33qxI3bDMP57MIxge7Rsv/nabd+8c7Zh7959plo+V/vWHXTtoU4/vHhH0Q64RFiCfE3NjlrINY72Ncf7x1s7Y87ii398YK7rj/eHx2IDbgGYgW3cyDmKIb7wdQP/bGB2GnyJbYr3q+Lx/sHegdJUmwaXLLAJ+6hB31d3cWGfCGeTvoKPr/Z7G9GH0W3u+BwFaHYP0CrYoNzxB3Fru7uXsikCugCYo2NeVEsHna7PTF/WO6wMMYlpBUw9horj41hktnxy+kE/fIYdzsh6zCRTuPYIS4zRRdTOlFpHUrQE5jIHOPWceTRZS4ge3yG482emnhaUqvxBBj8mw9WT00trAICZuY8CK5ILcNfbGhzpqskuRsNpv0KRpsBfTXpxe2aSFdu1W/SUgJFyp3afAty2O1d5aaCL1a+A91sQXz7baqbs/jjguq9B7cjZ1CfUIGm7vLi8nMjqfmLvpTVqgxrfYOKudC507nEY7yzbOulOUZ0rXEUOfLzDs5BV+TSpV92x8iNU/cjAU8B/ZpZiYNfIZCXP7a65G85xj5Z/tYCd5bPGeNhGkpu/kQTa/faxeDx0RZGqqU9Wj8NILLYrVaRVGSVyCpsaeiMj/F8cC+McQTMmK5r6pBzHaxTlJp8pJs/7KTyIVJ5SznTI61XS554gpL6rXNgYrNe/hCcfGNIudDvp0h53jb4Rv/zfdomtRwCgZxt5fP4Gf0fvkkm0V3kItpZD+Eym3QGn0Yrl0kMcr/EbCZojVOb0JJarV6MbCM/vpGLJzOVZ51A2jGZnhjDYMXPNeAGKs+Yq24b2saKpSeT2n/JLWPUDz6oKNhCKtDFHnpIwtR36n7wi5ZUbMOP+pNHBRuQ01Ge0/9ar63hIDej88MPkK/9PnrGONFAdBFfZx1Lk7A0AYejOCGxJnJDhLyZgl5qEbWRoprqGjl/GghXDGI9zQEfI21AgMNq0ZoaYla/CYhmutnVPLt5ZfOOZlFzc3t9enHI5Rn2QqsXnN6El/R6/YGQWEtbNap2/z0I1wmn/GnOg+biuJVwxxgOgiBnhZPC2HhmbIw+V5rA81NrhrB4q/mKacXHfWjViYu1HpwxU0XHYr0wG3Trp33n91uUm3adxN6zQBaw92O3eXDbNpkmN+0uXydsfp/Jta/FHjP8G5Qbptzmk9++82PIbS6/06VP69R+f+xu8oH+Q8stYd5nvv3724dWIZf50zdoDddPec3cPMrKLI46Ik+sZvOY6IIMCOoF3QIq6XMk6+IBaE65DGCw+/QqJQ5HkPKkHPxxlcNR7zPqglaDX1Qvmp7NgXWcF1oJCW1yvDRGnx8fm5g8y/GLYW2vItwa7thr0h0ixRfnqkmeeoHzwMD877xSWnjw4PTMDpjk53XgeR4HxstUtOHex1vicLLwwvLNG1f/JNz/VreNH93x1lt4ZIc/buz/+a5I98f7Vq7p49Zv/vDXgjlo/SEiRZxhW3oCUB8AKqANeANUjxrq1SBU69V+NdWjggBSaBUIVXC3BO4mweUGI23y2x12E/qwhPEErWdCQchELNwEKalep5DTUpeUlLr0jBTC/qBCbXFaEggRW+rsJv8u+gBN0j7GYRTV+YX8cKSLY+dL6EVT1T36HCfJDHbT0vT59MTl9FSXJ42ux3MTV8R0prURyZcLlGL0m3MjjXMHEoBEiySsFxgzQndF8wRz5giPjD5z/MDHJENzVW3z9p/YJPTCvcpPM2RO9Xkl3OulNpwGgWOk/OHkS8K2oUP3DRZg/dc3r1qz5V/6l89aZYkvePtnjeM/Tv/s7QXxwVf7bx7ZsGkujqH9FeGHas7sEGs9lIVb4rA4djNGEbA2CPMNQEuUlF7PpcZys/Fk2TbMNY6ny1JEk8+T9rnceCovaU7XLfYFxA6X2+3FuS+zXk4a5RqhmiOeOJvh02AT3J2GU4vIZI1x3Wzo1pu4dHGiZuYdQ1fHjeh1XEKdydU2wPtnNsBPp7u2/7x/ZX10tiZ96+HHHvmakzbx6a5rpbn+7e7yn8sn5s1KdSxTpmRxUH5/9y7qmVe5y2Ry41XZLi7fVe4WCCv5roOsq6sI9UW4xQxLzJvNZCjs1mtzvphSKGPSRCTGZ7Ai1kDIGYZwOIoTVG5wO3GCyphMa4gMnXFlqExGp5cY5WqSk9JZLnifn5Gx4qbe0ufSF9IXkZAwG/3YVKxKeLWcPqJV3l8tYTL6r8hICadk9uOahBSSHZ+GqiSrvluTiNo2Q26PL5xKRn2Fv4v/epFLUi2akYpC99ww0jWci2om5rJ1XqsrqFdXEktKhdqXSUWSCTZBJsR+qhEieqsjLPOb1OpkMlNNJiEB4VdukOlZ9MbEBZw/usjpzlUpIz5PdLWAamftXitfhLNEUyIpW3G66BpZosnH93tiD8wQxBacLSKXTCWKqn6m4Fvo3uwjFhIbiJ+zxYOr4eB82DMfbpoF673Q413oJeu9sMjv7+0jGBfzdYZiZEqnENTChJAUCvtT3W0tWrrX1Uv2blq+Ermhx1NxsxW7o9ZcZm6KaKAbXA1Uw/LUd5b9aBl5/7JHl319GbUM+55Sp5qU9Gm13Quwiyoz5sxGJ/pYO4Qd0WaiGySnWlqaxWtjYQ7Tc+5oxXBluFkl+FRixzTNTdXCjij+jZz/dBo5qEg3d05cvFSa4Pp4q6btGgIXzWyBvqIJ+ooWaH2lb9otnNFcd2U/tOBb03t0Tte9+ktVP3VxQ8VP5d3Z7Zs+zrmzanFsTyOsnvwd76xit/V13oXl3Vn46Yy9zM9rWzrttmYaF3Jua8O0h/vgiqqHu93Cea6rkQ9bjlc82j7k34ZyWOcZtP8KZDM6iWfZta+lQJ2CxsZ0S6ElmUzrki3FZDqdLxSKBCPTao1yI7QUjeYWs9FXbNEViy3ImMiK3bG4P1nnNPvchB/8ggIUmsxJR4M1L4rE4vEEFDuNOrfD6pRoZVUzUnUoOHPLM0OVuIFc42hnz2K/IXERV+txvcW30dX5FZdwFGc8c1jCz6GFND++4hpWhus45vlrr+w49k93HLtxx7GWH0ciUExv2GhbqPyrpHGwXLfTpHaorfoIA3TdO31KSQ8cuX/Hr3+9PJD0mVu3XXG8yKAxA+vLPzpgVoDPl3HNpdpfNysZ746/7XilQ6tQJAQul2DDa+Wf7PEnVDIe/6PzR6qR/INEA2vFtjno9vqcLq3J7nS5PICwUY3YuGZsjlUQX04Vw3LN1V+xYM65V08v8LbVJqUdWdAQcp3iGWv3lStpdIxQ7E9MnLFs22+r8DojXRFhP2ANcTfbN2uQ7fblY7FkcXhInYd8UqczRzx4BWuW+wgzmBe4kCuThKTLEVuwZH7/rMHB4XwuNnu+eE1ba1gXsxa1ksi0QnC4D6cKuSlglewwUonJdPpSaZJbKpfupS+V0mPcF5Pj+Jq55uprewFFxitcydqUU+Yq3ZiZCK54kMlpye2tzLTaeABgOvdbmWlVTQBfO/OrNK6/Us7VIVu36TzlgemU7/SIrWri98oRW9U5Xdy+KNC9hXO8HcQWthnvQEdRq/VbfG8UYWVxR5EsdmVzcX9jvcsXxOOhyHg6m8s1oH1pbBJ3hHR+a+CKozm9DTg3i270s/hQnkNIiNuBv6N3tZJnahK1uSszf7xkqT9NS/ZmLFku3TqVm52ZlE2b266U36B6GPbghGvZXk3NwvyatGz55v12FTfn8QMkI5yLzROziFOsr78AjQXY1QhrGmGPAdYZ4G4t9AgWCsj5jbCwAUidrgnjo8E3CMCTp4Zo5e0SSEiGJSsk2yUCicTl/bp3zEt5s2lrhy+Z8oXbWxfX1yVTqUy2Xuz3WH2qPv89VrD26RfrySuAZqnGUaymWs/iSMnYmRJXG4FLrEqX85Wo9NSI3I8Gnle5jf9InnXBlOy3fn6myzjDYbxGfvX5u8q/mbET37l+puNIrZ5yG6+VasUUE8ju4VxhI9HDehPJoE1ndqkyKULm8wbjCXT5yEQZCoFFldXokTmYKfs3wfd0cglSdFuM8ZbhbLoCsKqrRJL4SLOY++iMaNfSaX3ctFsv/IhMaLlv5dwrsVUfMxvWHB6qyYcSa9EaX0Fr7CbeYY2dHd1t+frPNT7VSG5v3Nd4tJFqDIVjfpwA3NeND22qG4huutvVTXX3tsVidovNFUvGyNiTnXBHJ9zQCWs7YU4ndHZCGr3TATd0wNyO1R1kZ4c7eW8YWsKDYXJvCLaEIBzStfiPNIKzMdFINjYks9mk2O0ftQEflcaRaqHNqjOZNBLdNLLHyb/xUonP/41zZ53L/lVyf1UdTJTOTfDpvhInevxj57DOMlzC7xpW4ZppvzqYDvxfnfHTk69MbcTKh67K+v0h3jNnaM9VCb8fzjQPz22ZmfTbE+vcsLu/b2bKb80XuLvtwySyD7ch7N9CLGKz+yJHI2QkkVMSTtrpclJOE/p3pmrMfMkcmyNzYqoJUvGAWuk22GmDjChexHloPE1gAidGcdESztBxAPTSRGmGB6Bn3NfSTz09Y04dbzirPsBtWUesrbcD+QDw3LSWHji2FCP/jDPbXOxHfzbtCCxeihyBv01+eoZMhu8u/68bmjvjjc7swtK67CvUj4GuOAPc/Y5nLhIp4iF2ngs5g+6AJRAK+GwWnc3istlCIhOjUzBMKJmMCCOhSJLr30gdpWAbBUVqBUVSFB1yhZIhKhTw2JwUEUlYU25RSKi2yA1SXs8Q4Bsrp8e4D2hJlF7iejFqiEDpsQQnSfqlxEQNPWilzguuKTi4Zt+Gm7qcRciz/Bp0TgvsePlZfyOThqdts/WvnDdKtEMQpbYLGHvPZP0VsqKEi+xSid/f7U6XRaSy0a6SWvxITlYkJzxrsod4mz3gdFqbm9tZa2cq1+DrTAUafCGjv77B12BpY61m1hoy+qwQbQAregu5RDrWWniEBZbt1OmM8Xgqncl2dKY6TcGQ0ZjqTKG/rAuFjNgeEI90Pt35r51UZ5/L54uF2JZUXSja0GRtjos6e3xuo856JaauSLVGvokzCC8if+gCPqp88B0PXq9MX4cKryqXsq+2y6infkCtVkOVePXaIBOT+tTOi+MLzXHIGbtBTsAn3cuPh6jgbOpX0ztxZDF76MHOJeVX/JbAkrGnWi25AXi638vQbQO9vVCf9iYW3vZmu76+98pbP29YfubMUqZF4PMJdfY9xId/W2JK+f0ZU9pk2bhxrTnt91Mm164nyqdX6HMCHruG0Z7h/HSYmM1GggBGtc4qBafD6SNAh/5cIo2GAkEH4UwGwyIHJDVSu8ys4CQ7fvZyvjh+mSu7zyDFPH+4UnHP46CSFKqJ4mvczu4cTCeMqesmPz2VKJ4SxKScXFmbJqa2/+0cnx6++YqFUxE+TYzsUB/y287jWhOEZzaxjEHW4Ys3ES3C3NNxiA85XadhwwlfT0rTgTM7NoPHYzAMWP0hcftATCWS5HKpmKQoU8kbKR6UjJ+7nE5ocBK3yI2ZT9Bc7oxzpi9xbjbC5xUTxlv0Gv6+avWdaAbz7DQtM0NjohGuT9wAjGgqsnN+Zf/Ph/s2k0e89S1rC03/sv7X9uD6bDhBktSi+Teu3PvLJo1BoaIVupZb05rZ0frJnR+vezAQLs4q/3LWPJj15NDD22hzV/u6I+sLC3w76vvsrkzTylU72dw90YPll57RysSKlvJr5f+Ky1LKZR3wNJSaLXNvYFP1fKxMeJD6OhEnmoi9bHyk8cZGcncDjDRAfUN3A3l3Epbo9urILWq4WwVGecJnCRBhl9BtshRyGBhah5kVDMmk/GajXlyXj8mVUbcjJpLIfRWJXh4fxy4MAnk4HHSZvpC+NMHHK9Lp6QTktECrpKRXMLlmZgqPno44CA8i8SXnNq1W3PapJ7es2jP6va2z7o5xmRJfRV7t5/Z15tihI8t5gR3K9jbs40NhjQ2TdX3WhoPls1PiOQL/BO13bb7vU3s+VpEPi+7DHNFJbGRD7e1Q39bdRm7IQnd2QZZc6t/iv8VP3c3ALcJ7hWTcXe8zEfLuIhaNMSii0tDsP4A0MSqu74i5vXK92qbmJu1kKoFDfEciEDE+zunVVWVtNZzelZgLH++fETqs3IzV7F9VLiy6KO/G96Rc1+KMN6rtJl9dZ7b5+dLQdPiQvyYnD9/ABw2H71uKr8wTa7Pjf/3ex2JzgkmxMuXL2vT33/TinDuP3vkUjh5u5eNmf30AXj3ajuOGn9zzABd3nYXO4qNIlyJEhjjAJudb1lrIWxRwkxwOaOEeOXiJgF3kOBKF7dF9UTL6nsuQNLCGlYb9BqEhlzGepmKsZ1gFKpHMYY/6cdWty7jfKDAarQm/RmxNhWRyN69V41w5Btf8gikMSzicX7pcKr08wQeoiWo1Jtf1MoNiEze7iPgI6wyVqqaSBI8idTJ7133yuR3rN94w/oVVpcnDMLv0hefmOiva9J9COncbbnzhtQm04eDOhw6N/cddn9i84bEnbzn6uq7cU9UmasUi301c2wuyrT1IPpuQreoibmBNrURbntbEYj6npVHoyifzZL7nER/4vgkKQkNkkP44VHRdwB7xp+pEsnxjHfqod/sN4np/h0xeqJUDFwnU5JnM5NmMhp8qUcLTfzPnJzi2Sno68MrkpoVR0x9XAWSia3JXGvU1chJsQuLJZ5btPLzu+ve/f/v6uzbO35P1NPrSa0dWPq+xRa0trbpB3YubFj74RQsvL15KLybMdV1Ddz460H3kto56RxQPB75u+4JTApE3qBxftPt2y9+qMuNkxaJ7Ss/5DDez0q6OcLj5/hSksHA6CA8STjqFiej55EZvfbNVqaelNmtXsDER9fuCEoHVFkQfjqy/KJab1A6/BheUnUXnbabA0mc5fhwOwZ/n3U0kPIbn+Jwam1wrAD2vU9VR11fwYwauHhFtoPTXrzu8c1kmz8sDyc/yxQcX5TIvIkG1tlijNs3zK0emxkXfve7277//lzuHuurMie9XRZLCIiQ+tNxeyC8eVwa9IsGpBdsrw6PrO2470j1QPX8/4Gx5PUKugUM2OGyFu02wUAeLNXALA5sZWMxAI9PLkNiKO0TuOjU+dQ2jDnA5WMdKxw6HwNGoN4wmYGViR4JMvKcSJfwGvUutdqoTakqtzmhTFnHGH5VVDXz1KI5hzx3pHj6EXIgE2XkmX5Muuvo8XkH9iidezjiSU0m1H+Aj2YgO48rl5M2Vw2hcs+WB57evlaUqp7JcXoTP5arWxsqxvG9p3ye2bPgidyAfXr/twYPf7cyXC1WJklJ8MDs4u1VAujZfeISQI7s1m43FFAkm6N0nOioiRQRRG4YU64LWlFYWUav3UUcRypcSSAIlLITaiCS62BKcyzN97CoDtitH8JphyVodgyNN0UihORptghfQ0suj6/lYGlcFkDaz/JKF4WhzIRJtavrgY3jB23yN9gWw6uFoHnnek679dtXRqRMFRAdaYw86Tw3Ew6z7cA7uycDC+Ib4nji1OLwpfHOYWuzf5L/ZT4kpI0UGT4OCZa/MIeYTySR3zna6R93kSuQXuaxJ62wrZU0mJAJ7An14o6ksPm/eq88bPm44+8q7y7jUkM8p1mQTP/Kw/T3OO6pn163f37TcYpg6XaVmBy1R37y2ZU7XvAdWDTdk7a7lmz95autK+LeX7nmwUa17csaxgrqRgK54Y//qz392930diZtUn1u/67P3YBskQ+dpIbr7G4kO1m90WrT7/Ef9pD+S3I+bXuU+VzKZJJNiKgeaUIy26T34QFxE8CZfcX25tqmLpasSX3qGd3CvWipzLY9XsBBd5C2z8E2OnNwNC6YWeg1nl8t6Td6Dndu22TOW+c2Kp0vuqni6QJAI2/QjX6ARIefWFJGNCmN+j10s9a307/Dv91P+JrPPiAutca7L4LGavCK7NaYMR0VEjI65cD+fpF6qlCeq4LkmKcrVu5TGL+NxNemxcfrCRKb2Fqpyc9UBdw6uaEqtpkBr5SPsRys+F1+SmL+kf1eswdrH9aS6bQug0cXonUFV7W3zlYXfXe1pXXTffvjUequy2pA612oi/ZOvvIaTnmM1Z8PNnY2H0OnfzhbuDcHdYthA7aFIiBKRiDOYIgghCHPpZCrldNAmrdwhlzoSTnCGIRLxEtFkKiPySvUqa2X7sY+EfYeLZ0scOuEul4lK2e0Ll7nLhS8JRy7TdJbtmpdMVemr7hN2nnrK44f621dvOTVx45Qq2ANzZy28d85Q+SXwlP+tWo5HbS+/qVsxsvvz1930nW/NVPrVqvVN9b3dN172gQqX5WE7KCQD5DrBNm6Ow1E21+WBBg8EPJXR1e/a/mIjn7W9ZHvNRulMIDRBzthlJANGII0goOCX1PsU17LOqixuNUHDz+jf0yQt5prX5TqR2+Uw0EoNprx487hXUqWkOjOBhxqM0/zwgsn0pdLOiSn2yykCzCpBUYWEuFKDXFtcUGnnX1c72sEg3zSP4QY+bMMDHtJ40gO1ipvvAN/A8x24gQ+fWta7MI0HPczk+PzUs4Tjw9+zUp0pKzSZ7VnqNPrOir5Y79jtIB+2PG4hP6F+Qn1KTUlEJhHJTXc6SfteRv8TTHhySkJogKY0puepXxEsocCcuR+OHZcwWd/pD8dYXUNzdsz3su9nPgq//N5H+VwVusoXSjujUcJUtAxexjwuGM+VJnC/0XI80CUajV4FaHGVdh1ZO0GtAX6LKT+3tjf1DNxYzLc1ejVSWciPGUHTCzEjKCVd3tq9fN71N81b7A4WMkZFvyfetKrUMxKy9fL8Y+/BJU4OMeIBNvouDQNyaJJDWA5/kcM7cvik/Mty0h12yuQWOfms/CX5a3JKLlL6zRwloV5P+J0SqVTJUZI7RWFJUO6WGB/xPo1rxqLW55BQGKQHUWmF7/KF9ASPIxAgy0/w3b5pHLPBHDA8a5WmUla9c3rSAncNXMXAzokBvYNZujEZG1xqaR7ZWPRoTJK6+u7+3W2NbY1ZuaazP+h29a94uG7jvI700O3kv82KRXpaWmnPurnbbp67CIulZW57w/Bwe9d6ttg7zX2bEN5H2IgwcZqd94r/l37ypP8FP/muE15yvuYkTzvByo0y+osI+oUQFuaFpJg0kqTWZNaYzbTVwpy2vmglTVaLRU8wqzQ7NT/XUBqNitZSdoNeL8EMKF6e7ctuMZsNGoZR6BEYUnEDBoJVHvcMP2OAu0l5etNERmPMZxKlDG6YQAK77bDgzBnI0PgTMrxVtq+au7YiuEBQHGwIBJG1aTBeOVcucaB11vX9PfN6VmfTybaHNPcWsnTP4Mf19/xquye+7K4l4bqGAWr+8XnBkTk37Fs25FszOMc93OKx+PLz3EMvlf99y5xtrzzT614xk5f//1/89YW5Vf56RZ0i4Ff4ZIoqf32mdW4Lx18/lPh7/PV8LbwQYYUwwR53OozuqWmArEJoUCrUYioAJr0RE9SrHW4FR5SLecfQfxgrjE2MX7iMG1o+ukKmth6m2rEldGpc3kCsiZEcOcIY/OnyaVMjLd6yZUt9ZzHnFQY1rmxji/2OYKz8iUGdxWCIaQuwKeb7Qpc3bOXj/Y9DEu4TLEfPPXjcDUTom9U5CafUTrPJ4HFijmJWGzIbksACCYySENEil4gSVaiqL14o8evgylsxSTX6xJfiXhXE5+oUr5hZloH78OOyWa9TY/Umg810ZS3Qa6pnJFvI5fhxQ1aPxhVtKzhGQ1HoHNRZ9fq4IV/+VoXvvo6kkF7hOYbfY9uFERCFIezJe/o8lMwCFj3066BZBxZdREe2KyGjBL3SryS7KchR8Gb4vTB5MvxC+HyYesvyRwvp4KbD2Gl3UCLBBKsngl6nHbchsF5XVPsx+efl35BTK+U75PvlVEreJp8jp6ZaS/E8o1+yUhXuY3MJKEFFSMUM15FQmh5jlE7Ql8YylysFYrCz9hfUSg4Jbma4pyFDzZhqRLV1Xp9LF5xa8/zMuv5F69mmnsHd6Aq0rNk/GHIGEiN5svGG/kGTI6l1XHehZWBkaNPeZXjCUfzyd+ewI6XuhTyXeZLchfQgTYwcCxAcub7czjBGPwV2o1rGzcsJ+lQM7cfXt93KMeSeSKa5qQHvEJWCQZzUwJ0ZPGVXtUDh7Dg/PkD0d3lYr+jBSDeQux6zbRxe41RIlAVQKYtyklL0FftBaGQiQOcYlVamUthx/m/L9ZvDa7+b0zr1+jpJ6rusYfEweBIiuwLdQ2ZdUzk3SktkvP3Wk43Qjnw9MeEn7n0WM7WzWoLwqKUpSZuEJCS0xCWhJNwgx5TLbW41DZnIamcxbTBIfUfMsMK83bzPTJnNKofrc+6n3OQ+91E36cZdSG8eY1T0c8hSkdRb3xABLte6OMbxWXAGq4TPCnISkReEi6C5T5lMAt3tU5Rz3hlNmjVlz7jG/+1CS0thyVqHKsjRz61bVyWgWyuc09LSMvmNe4YYCZ59mbknbquw0JWnuMsXojOiJ+qO6wk1ZpM7pVSJ5UqVisaPra1MfxifqDqyuLJmio0Z7Vqu+hQcF/NC+cZ+o1Ts4/71RFhBPn1Xu6X1BwuhFf+bw6XhyvzzDNIpKxE5ZtVgDuyTEjUp0eB//c1jpJUfsVwxHtW5yVAp3q+0QARrdQIy5V9HRBa5FOmAOg36olIMkn48BheEBqYAvhQC4iIwGl2axvKFhDjH5zws6Dma0XN4iWUsI7bP9Gq5GZ1W2iLVtmqGNKRa49Qk0H1Me7S47cCOibrfPCYVSaafFVdlc+YO7R5+av7zP9Z9AM2L0RNXVrF2LVoHneLWsZgqHkIPbKgs5VDs+pq1XM/XKCJ/HEY53XUiHLD0uMrLCLBQCcJhkUo4lj2pyexiDCazmbNXSsYhdQWqxuk5dE6n1RJ5pWMXq1ELHLxBiohVkeukhClt5IMXzVAzp0InzogrsUEotLS2tnQt8n4hmr91XkUZLYJ5x+YtCVnXC2e3tLT+be7TjdFNcM8ykxdpxuRPwk77LKufqNgceB6tx0Ikj8kxWftbLLpe1BwrDCTNrJk0a3nrMjGxs6qWmUm+yKFCZzRjvBQXEoDnr3uVkanUZtljVotaxdjcMjWTgusKYCJX3qGSyPQdf7thVK8w2YTiCl8hJKAeYTo/0cbK5MMCEEjUfnzxoeexOzQGq93hcIFfQytJEc3pAfbopoR3tlKENrEzMy25SuILK8EVYz44Ra4/vL4pKXcMvFNQiasP66Qj8McfrOhukDhE1i+wBjedg//iH3gyOIuRTvXcKZAuO4n0SSCcBhWFWbRO0AaGO8cn8Mx3/lxN4IHvnLXBM8kvTaT/gYnvimS5Xe9VSxW0Uw+qLlqsl9Xbsno2RJ77rN6oqoOFaZVGrwenKlk+npEIhOpVvPyoPci2zCO+crytPdeEBedIfNt11kUedT3ietpFLXdtc93uojKujMvf1ZHwCzDMkHHwiKEHUs42J1ktMTBauMEufqN+YLiv2Nbe3lkX6eqT1rsdmawLX64yxdXTMvimwGpJTGUUHuZsKGW4wRnoKtJUhlIhkMUp0NQEjakZGtwO6fTXmDby340gqaBJas+rW1IqjdRj1fgVIsaYbR0mZYPld/uVlM6acHgyFoeqrvz7As8biqduYF7xnZaMK1VYjvBIT/ntFiRUuyllWgyfb7cHBlSa8gdhedpgiMpSlzvsQY3NWX5tkDfx6R+XuCPF8YwXDN6VngH+THH8633EgeN9RGs7N1G3IdYca05T0JDmbETAEDFE7AGOi51V2r3SQGtz3KiLFAwxbvBmfRZ3ZMo50vUTPX0zr3gsWwxjxpD1GOOu+kzmEt+cnUB3fVXSuPMtXbn2/xsS9mzu79GwV9HA/xENOwYH267Nw67UguiaTOzlHEfFjrDxY5AgR5FeNxBrjofCenxTHFMTGSw1SysMAakGJzIdFIhjEXUgFA5HVYpYHZ5faU8aWSNpRPfcO8fIhql7bmLnRHG6biszdgkpKGat5yo4p6fg8FWD9FXjPq6c6sALkBwt/0GOBKHQ1vf0vOp1hSoq6FOI8SQmbrjLopJP6VCF0E1ZJ0n+vM2RHCpvL7+rpF28utlGYP9htYSb8bLKO/DrwQpvLTrXQn793yDwiKATIrdHZ+XW7/emtG1aktDSWpeW0qpETrfH41PK/UF8X+o1OrTmU8l6tp6sTwqmbPjFsZr149VnxvDiaTzvmEe9VaNeWzQ548TNTKmjbylh2OV9lVu9iO4o/16RUMvQwrlJP9zCrWqlBl0CGmUarnMySjDAbE4Cl/IKNz/fpmbt5VX7DfhqkHC2NkneiM5SgPg4a/ujHX5hh1N20Dvgjw4gRA5aDAIxiO0OO5aIRyLWSSRi//+m7kvg4yqOvLv7za05Nac0kubQHJJGmnt0jjRPsizJsnxgA7YBYRscjmDwEZJwxiILAXLZZAmQbBIcyG7AB7ZsYwTZxN79sMlmEbBZQi4cO8GBrBcHNhA2Cfboq+735s2b0cg2m/39vt/nY2Y0evWvqu7q6uru6u4GTZ3ZmTD1mwgymU1eE2fSODXu+mAA0ch5n9Fiok7M2N+A/Q3JBqJowA0qtXiAPsT+QohhfmU6yQ6eGT/24ovmY4XLgDdtcpmPvUSHDJvY8qYwgmosXIDdKDp3FkqnsOjkU+STtkaj1pR/qMrksx6ywufGoN61G3fSnw8rFtgN0XwHPpB/LqW32O3wE97crFfY8/dhK/0GFe4+Fe/8qUF+dC8/+FsPPug56nnNw406cbOzy0k+tOFTNtxuxnYzVsE/U8g0ZOJGVbhLhZvolEitinyowirOwZEPOFxXza7Era2voTOEB13V9fU+4aIfn3TRD53goHcnpl6H/3RKsHjdJpvLqHDVD1vHrcd0Q6BDuO2nMXj72B0L+gKh2+ffMcbfXBWIjt6H0yT/iiYUW/I57pKFo4sXXn3xtQsXLBpZvXTJxV2jL2sWWCyX0XERx8ZFn4BxfRNqg7HR13ifI4yVYfxBGL8VxqNW3GztspJaK66y4r9Y8X9aMZ0GfPp4AieYerzuHRiKtnq1Ia6V/Vjt0UWd1ZGYM0T9hK/Bi6KtXDXr16o0SGfWeXWcTujXhMYithl6A/DrdKMrff0VzaMYFw8pF++RtBXP/hLDz5AlLaSkyALQBqxOhy3tagtEJ+QTn91cDEbP3vsponTQqJo3qD65ZePdd//uS9ziT36z+ta4Ol0ISz9dg7lbHjV9u8Ugxqamnm8bH37ytx35mlobftv+zDuFeOqrYCs5PI+3p924t68HpeKmpCcZS3LJgD/sYd1QIQLv+QE787caXvXsbsYv1CKX2eWFEZcp7AnHwly4vxenenGgF5Pe6l7yfi9+oxf39+FkHw704ZN9eKDvs337+v6578d9yngf8Gupi/lxgx8b/PiMH5/y48v9N/hv93NjAdwbwJEA/n5gOnAswH0xgG+nXy0KEH+A62hZnMS5JN6afDS5h55dlIi20A7RX8eZHTrOV9NfQ8w19FTEiZptNdtruE01eE0NrqlRcuKtAzFhetLMZvxzqcN0680mdiKpOI0tvIqppGLVQeXFxl8dnz7LbvgaFxJJC3mkaJMwHWSXeTxhZsWSSQlTXIXTI6QcUntJDin+6oYF0YgYCVcbE9Rb2vz3hzpSNQv66yNrhj2xhipLlc1mdQfn+es8q1fcRl4aWa1PCTGyJkV9Zs2uJ6PBRNja6K1r6R1aZdQ6vzfqa6u2+/hoSw/tK78C7SQMsXwQ9fD6foTN4tmc7GRf62Irplujc9BT1Ks4P65xmMQ+gc1+vbhp09kX6Z0EJYkvpZMgHcIxzmzaK+yprl3e1GPW3NA5kMs0eqo9C9roT8KsV1O1d3224a6zBx6bH2im80b0J7LwO+Kkl2CfH1dWg80tOFDX4Hc52CnECo1RiI6QF77y1TXQBhoOWHRERQestH5Z2E9vLKKn7r70evIsPYSGHkxVfiNb71x3GKXwx3+2PuFpboAIUW1wz6s1rFjQaXLR64xiNhe9gS2bCrqhQ25X99T34M3W+stdPQda8n93WVyYv/CQJvJZ6JNaUAJ9ar/Pi4Rb7V0NDW2Ya3W12Q30FsM3+Xpnm9fk5NSN+khf6+JWYmqlZ3Byra1xW73DQy86iatbUBMRuh7a3YDBiptlx7vYObI0tqOb96ADOnyYza+K85PSxTrFjcfqDOjITDHDlBXNNZxppKMg8tnvuDP1yY61DYb5833m1sMn7Zbk9wYH2Znsz5y8oodeiNRtD65uWdTfdm+fWYMdf/hC3GKCt7YoPZo9t+WiO8SxGomQG0D/JnSU71+hxaNB3BPELUE86sYRd4+bNBk6DSMGrlnbpSULNLimujasDCVq+2svquVQrbnWW8vVhmpDdQGEMbtCJFDndDhYmcXrarfS6yEXh64McYUrIqs3KLcoSZ9ysfJKJWdSepQxJQRFTmRV1LCJaS+qEjorKLxXqWumczz0RVzA+BV9tYijD7rLeDpVuAWYtnx6XHUE22Vb7Qq7jFPF1RyaX5oiN9hJ74bJSxZt3HDRio+Nrc9x9tOa61piSy+ONX9cc5r7cdqd3n7jQG9u/vpFN5vc6S/eG/rqss7evs4VD/ruFcuuldzB5nrH+Nqwp8Mz7OHCdR11w3Wcvcne5PY1K31uq4HNy4ft1cjWRBWsRxpJwcLM3jEx3hduUBWDeSnAl+06t0nxG4tE7rD5LNp/n+hMaw0hGyYOv1H35XVBNx1u/kgx4ja2/fSdvp67Xm6xuBwOuyl24lC29bqXU8Zqh3QnXAb6FT+6iG9osnXaRmzcHzn8Jocfsv2DjTzH/Yj7Bcchh1FPK/ZAvdHt8vxAvNP7JKqWVhCYz3mJ6iGliolzrsUbBQoFL1s/IJnO+Z/9HpjvPxld89dkmoZMA+7Ephsaq7mvfemaLad+0wt268zvviQ0sOWqDdv5VO/yiHinB4zZLwG569HzfPd1LtzjWugiLS7scmGdEztv0U5pf6jlNBqX5ncaLvuIBkeFE3IIEYKnHgiaXPSWCIi7NSqIMlWosPddYzbrVuiwU6fR0VNz7Hanze60YLvFTtba/8tO7ADqpH2Yzg4xsYrU1puxeOdJIUs6BXV6bLxwT0DhkoDCHQHQPyVZ1vnmK8fHrxRWj2hUDm29CgsGahecnDXFMpvJJfl88WIAj95uEe8LgMFHixXGS/kjwrUADlJV3YJ/mo/TKwOkuQ0r2KcVLeMtWoDHuNps0cFQDlfpqqj6ZpakTO/AIEiH2Gz7yf06TNeY2dxlF/1P1RFTk2mi8mu0wdGldtZ9ptS+DDNYupROrPltP1xbo1XbVHk3vvHACquJc3F4WjGSd8Wrc0868JuB+ujXCvPjp1jbWccbOgMjAaK2Y40W19HLHp5G9Xathi1022x2+GeyeWzEpgHpNTYtk/KgnzRp7PXqgqCvH5sWZKUiFuV98W2WL7VJaE2ZgqziMVspMb9aHgyQU+tvT7XkbwHxk7oGk4W4FPhFUCtd3WjRqu21RqPVLQ5+sgv7Juz4TaKq80QeceRrlDpvde7EZ+1VTjreoesob5J1oGMNOLXH+dTPnfgJ55Tzh07OYcegLdTIascGxxYH1+VY4CD0kP6Yg9M4VFyDEtXW2sU68kklsNrG2XS0BpVfVuGcaomKqHQ2odJ4XZ1Lp22wK1WcUHeHX0rSzud1sVReHx+nCXnFoqEHlIHLEQIn6XQtuhQebu9oLFYpFFJh5RfKZt3uvQ5To8rxfVY6PUpauflti9fd8/noFR+79Ot3kn+4sbnFXJ2gpaJfQ8tk9zX8vYX6JlAWDegbfFe7Boc5fNqKX7D81EJawBzVbjX5UI1PqbGSs3NBjjMaDPV17jTGjRhjB7Lb3dUIKVlPXG0wOjBWYvw+/Mpui9t4GzHajDYzctQ1UA9rRloWDFHVhbvTzdNJaHg0YYouFL3IMkZoIJlMxsRbLNnoB3wvJ9umzdY86U4Dq2Tg5Njyjr6u3MbL+S5rde/6/Sd/9lxSl1WCjVAjP2nKzrt248iS+b2rtV86OmXHNloK0nhPp/wCMiEb2EN00k5HM/vMNnZmv85hs9td1Xrski6cKozU2E3vZevLDjUERxalzww1oksN3vWZeanU/L/5zEBi4z33Y2P+D/d+jjvx0B3f3X7btkfu+Iftt96D78jfHczfReXI/63Cjq9X3gQ+3ITcaJBvut+Ab4ExPG82f9mIxVvojSY94lUGfQ1v1XO8do0JwxfgBV45babXx0zTm9umx8eTMTZkkmfkcY04pZZn6F3Pt7bxuWhb7i1//hfHd/NtrXyurY1XYvoezfH5t/Cq0205+hRfUb7PGfCnmXxGEEl1lx4v1a/Rb9RzepPBaOVrqGwGLc8ZUAykoyKCfKJw7FDZUvnCuNE6Wz6+Ldr33fwv/Nd/WpAvmlPcJciZO5T/Ll51oyBgDuLyT+QvQstmvgse8zF+fQqMEKEGd5RdsTDjxi+5f+X+vZtzQxNucFkSZozMZrPXzJnNfVps0nq0MS2ndaka7FE7MdnxjB2/ZP+V/fd2zq7XqxwN2O5yNyiQxWps4bo5wqm0eoURb4PmA9rHUq+P01saqNnSN3b64KZNmzebX2Xqjo+zAwfN7Dtm15utaqomS4ISbmYJF7aQONjrMt2uG264IR1MafrT11x55ZX5TwZwuyusVXvd9pYqmz0UGvK0ccTncYY0Ftb35v9R8S94RLkTGZGL16qRSm1AOgVCsdfpBD5diaPrNqyPT9EFjfYejEc2d/9b12v9gx2Nv1+0WRm56jedyz7PsI4q/hW3Kv8VKZGXN/1M+TslQUpuAiuQUoHB3I5BA0jVTtOJ9nGs9GV8Hbg1/1/5J3H328rVD05MMIxXAaO7gPFTxVsKQjglYBBuNoYv2OH04e78k/n/4t/G3Yp/fXD9xGw5yO8IQeCGJugrQdSacKyW7g+lGOowCALG+3b+KF6h7FjPxJglB34LQ7ihQBMYXnE5hk8dDlI5jr7NYxOgLJxY/yDFWA0Y3wYMNRrhm/5DjX+uwm8p8U+U+AWCf4exQqlCWE0mOJVCeUINnxBWcSDgselXpqnlM1WPCdPJUhaoOqwGrTvwt/kTH+Rf5d/+T5D5ttselOQu8hzgg8DzBdVPVW+puLc4/BqHkRqrFNwElIJaSRTcCYibMGNIc5KPCQynk5SlwA8rw6Aa5Zb/yX+Ccq0fnGA1tf7B226DtpPJD6GXZ34JbSfLu2tchuq6Wh1S1zWodUrS0OBmy2w6vcFNrekwteUkfZmm57bTRODU4WO/okNDp3jNlt1WaQUhlXw5Y+6WLtmq1lnES7YWXdvZPH6tcMNWZotJw27YYjkbtyss6G7lI0iF/LxRpSBKJQZtCaZ3u9M9g2BFFirC9LHDibg1mAna1c678/+NtQcOKCy3/e1trh276Fgyvy8/hJfOTAOOgWpYpdVBsVEUQFNX6XUGtVajVimwUo1ir07TuzABu4uaxmvTxwQmwAt4KLlGLuXsMOAMjPiUeKnAIw88DxzA2s0C65duq9m1w3XbzAwy50eVe5U3VIf0f0LIoiYm8g8gj+EZMI6QV+PgcSSTQfDcgvwodz+3pzpkcAnPgWtByDzJkamZPx8Y7FMHhUfps36EFG+qdgPmn+mzhqdwHb4Z1fJGTpXLOZ08l+M12nRuiuxCuUgGyGZmZj4U7iEB/BqBBv0Q8Gt4A/lUNOpw8CTCazKRKW6FSML45Hco3lSOFfgYH+f+DmiqDnKqri6NhsqDqDwzH+Z3yLGNj5NfsOeIKhjUaqXnAO+UHI+4CTV047OIm/nlgZ6sAMnwTsnxiBu/IeChcJMcbzR/m9KkVgLeX6Cowoa9+CKm21r8DfwwuoSPkiV9G/qIpy/Wt7qP66tTjkQwH8RLg2uChCb9EhQ0B+NBbntwb5AEbVMzv3lmJEJ6oSB6oez24aAG5TKsOFh7zcAbK5eh/G3cqPImkK8W+IYMe29kXNHfglhdvIMs6TnUAy841pPrIT1aBGz93NTMWxS9G9C7p8jufdgvoVPgTaJOjRBJ3crq9kOxbq8U6pZcHwkajTxponXbJK9bdueJkpWXG2hUhqeSCKIYkqBX5jlr0/T9Ga0+vS1xOAHW9MLBRMJq5UmaVTZVLhIR7Koxv0N5K6ufD8X6pm3HzOuIKYI7I0EHNddx4dlBsI0iT1rnND+pmtcTU8eWDnhJcBx7muGekuNCvT8o1KclIGCKug+Cfcgw4bkqEdMT3xontnii2VvErC/BNJOTAuZF6XQpZn0JppnUizrFeXwRz4tSivqPlmA6ya8KdhcuxRwtwXTi9wU7JjPHDqRSDJLK2ALt9IDaB3hn6HOm98g1rO0TjLp7UEpq+2PQNperHgK8OmZPuzY/BDXvRE/iJrRwkvPTHFp9tS2N/Ga/17/Rr5ia+W/e6w80eHgYyHiMNmjxwdXB40EuyGt06SDxgZH5xLYcA+2YiQltulym9z+STGvROpApyzdxOT+Gf02lQgRWB44HuAAVIlBZiE2sXKD8DrByPiOW81ZWzhh1ddvsxXIeA5+4nNsryMDKeapYzo2BqqpCOefvLMGrJevhOdvTON7P94PF/+xAfzpQV6znsfydJbi1+EWxniMNxqJfA9zbFAdUp6pDmNWzYTf42W9Qn4nRohXxGI8vAxUvKzZFAfs2brlyMdDUsba4+1bBy6J2vj7Ik3lAMQ+af4GC8fFBnXhYmz8r+ua80OZxTUcCtfE4Tdt8uqTNL6F36FAaQ73oJzRAU09vDz3O6zMx6AZwkpIlp8gemXwjM79W7lCtA155RrcLT4F2jO5PvL6zo7WVx52UrrNUL3Y2teI48GsQ6NDXZx6imnFo/AqViufGQbPx0v6D+rJvMr1mRBk/L+qFlizIVPN4jDIaK9HLAHq9x/TyiDQqoLHxWoz4bgzOv5fpIxSe6LO+yep+RvRZ/y60b2xaQtmkrcV6N0A/9R5rtx7RZ50R7Y7v9rmK9S7IvUuS+yp8H/4EauDN0Egup4ITvJJKvlKUnApTlH2XJPtV6IcFurax7qgW6BZQugVilRToGqEfk+lg2It+QO2X1smHzwwP0yoZ0sh0NoCNFfVQGfaCv687iOOd+JVOPDXzwTOdnaEQjzsEGqHNNeavkPMgLvIbUfdFQ6yMRN0N+SvkZQTPVYnP9XW06YrPufN3km9QPFBaaEOXic+1eTU1xdjgFDx3A8Pzis81i20t3ugyFPFSEKTdQv2SgGc8gi9h9aiFWA+1B7SsesT4h8CzPcw3Pcl801X/8gPqm2b+BXxTH40mzvCBeByKgOBXQidCNNIyIHBPidUJkgAzTRDcDG/NYjsUvdN4JhOR4ivlz2hcAc1WiCc2QzzB7HZoqKkJaoPW4lCJ3cIQTKFnNH6BBr0KNI2TuJt6b7NGn97U3Y0Qj7spbbfUKIux0Q7lz1h5ElnfW0PteNEri04sencReP1jBxYNO1WCQVOe0AfrWdn6RXs+Kdq+tx+n+vt9vqLtQ+wlx4e+9YBYX0PDJlm9WqAPlmFC7PVf8AuroMczmgz0Er56vih3M8jwDMPlRLkfE3FbAnX1Rdze/A565hk81yjK6i60Uw9Gnho9LsrKMKmPopjmsIDJfNUq8FWtk6SNlqlTZ0ijtihlIvCCHh2KNl6sFjGumfkP4H0tw2sU8Ijgz3fN/BjwOidJkOL57K50PMgHlwY5FAxQeSTJSJAiB6VKGxe6U0HWU3L9oVzpuKV6P55ohKb4G+imtESMWWbeyp8iHyuWAZRtk1hWLkF/qUxHSzCd5AkB0xwCzD8dCIVZybI4yJQfJQMyTKfYvjBy18kxoTZVf2D2qRDsk2TAPut5MzalMUqnTWArKWgUKan4RBsDujiLdQMinU0YN4ArvHyRWeoDd8vHDZQX8+ECr6dgNHyzQNOdxtBvdgBNR2n/IvDpkvg8hV8r8Fl7eWcLj68EmitnjU9Uf2DlpBBsSrFQ1F1gU7TpHfQMuwI2POcTn1t7eUek6Kt+O3MK+kYqt1KU4WGQ28tb8cbERIKgRMQHCkepLUTlxUR5sDu3mPxBsQ/fV5C/t6Pewdo9zRaUyT/zW2jzO5j8SrHtnCi0iQQWuUn40Hf9N9MhKLafD0UdejuaZWOx30I7l2GCPb5TaI8CnlgmehhjyfDgOZ34XHsZ3mgJnpP8vuDno6V4oyV4TqKVYrp6WexM4w/Bz6tY/PlHcrwwHm7zUv8oxp/z6XhV9c/wXIiN7XaiHaJffQxfjB6c5Hq+N3MYaVAGwpZ0T48nAlGoJ6JX8FysO9e9pJszdXvgw+ru491K+rYBPii6eZ0x3T0BFUE8dHC0YjwN7/y+izLsbbHwtlB4G2Fv+zND7JmDqYwHatAjWLr4B3oO6F43y3zNLP0+YPpBP6YADfvTWk7Wjwk6fmyWjleBjq3oTj6p4NCiHtBJVE3BmUY9o7nR1aOKDaMbR7eObhs9Pqoc5auM6dEJiLlHqVYTgjYTgjYTgjYTgjYT59JGUIYFJWIdlOvyHjlRqCufV9SkqMdDkh670JMzwgjmxIWNYGi1XdgIpmIZv/8R5VrL5Ko0imGCXMgoRpqHiTCfqhbjBCX4VBbtC3MqMSCOlfg5dmb9c8yfhgtxAsjumyRZWkZG6GCz3RBOkx4g7ZHcquRXFRHmn9SifzKCfwpNknag3QfiTs2c5PXt7ZR1inqpojNn8yoC7y6J91OIxgB1dDz1Fl81r5ckecIDX17mpgrx8HWMr1Y23+TbT1Af9Efv8/q+vvp6JrI23VPWfxjo/WCMZ7MwN7FO9IrJJIbuSSghGbtCTH8d8zlaWSzExn1vHejr1GBx3AfxPD1PUMSmPrHgc5JJj4cvxWP9v1aMJ3aJY5i/QP/fTCPG7z3dP+Dw8TBYfAvUoSy4QarOoCyayIhjCDLFxkHNYiyhZXrtanwI+XkbQR0dUH2iBARGUpnOonrSmOVUUT8z9b0rxdj7lFwfiA/GRX0irTWqoj4TM79WKFl96MR6/EFhXDWQTcCDs+f/0LqZk+QnrB5ahHoIiPXQk2lpYUM+uaAiHzbHc0OBD5RbWqgHDPUwkLXZxHpYB2XyEyZ3i1gPE4XnTh3oyVRXi88xuVm7ZXim/6Z6IzdvJdgzFB96dIiDwDoDMXYiQSPM8YwoB5Od6dvC4v21TYLWXwSt51Gr+BMfyeUyGYjYMp5MLLM1o0AZqhbJ8hpDek12Y3ZP9nhWkaUD6UxabFWxcTGUy6AKsv2JGArzIsOCPIJPWVMmy/6AIEsQZOnmwwRqIJXk8ZYURqkkFSHHRMhtzO3JHc8pcoUgq1wEqbwL9Qr+itWrVO4hoZ1aF4/Qgp+jpov1UahrkPGpQLFWghTlFF893E+rpXLtF+q/D/zNXiZPVek8M0bNjU4IEkKUe6jEzmz0HjUVLceIQDPzNvodauLrMQp63NC/m/zwL+bP+ZdAP7DHr/IDbz+KUada8Dd9UA57WfuoEu3uGrEdNDc6ZPO/NtAzq/inAi/QcKXwnLmuzmQqPtcHMboMD9rbJ0U8vxxv5o/Q/j5RxIP21y48p2/w2PVyvNESPCe5WcQLhkrlGyVXy/CceFR8zueXy1eV/5ZykuHp2XNGNjZnttcfMxgk2yP5b3FnuQfhuVbxOQ1bIyB00H8g2VrrLa4RVOXvLMGsJW+IvLMipMCb5O8swayF4aHwXCpUjeUyjpbgOclvxefSmVK80RI8JyGSDxPkE/FmTignWXvTC3EgZynozKc8LUWdoQ8/y+LA1gpx4OOTZJ4UBx6cNy+c4nGYdqTtltp0PEzbYzhlRdATD+QGlgxwpgEPfFg9cHxASd82wAfFAA0KByAoHGCkNCgMC0FhWAgKw0JQGBaCwrAYFIaFMCoM5hueIyjcJIaFlfT9cyEupPMbI6NWjXx+g+mMJZ13oR0sbrkKdP8hGuGTHIl3QWCdskIF8c1LmwlqboLPHDFlPczZvQzuTgXOz5TOilMdxQhGHL+KvKohlnpK9Y/Ay8DKdSf+PN4otHFfmxHaq4+2cV/pXAfId5rZQptAQ+tE6E38UWTlMWvTpWPCauiDn2I0BrFNnwKael6PTc20XavBmYVYGJMJgTfIyOY46PmkBV5AhxgvLR3019YI1Q1EYYGI0bhnfq2+U90KNEYmn5Nsxj9ADhhXoZ4ePTDCvc+CPs0oIsYRMyeVB1hMFhWex3Q+mj0fjTY3wvPxZ0EZ6fly/LVF/N5ehp89J/7aIn48zvBjs/HZPKKAfxXZhD8BOuvBVJYwBoSMFTkIcQnj0SXxuAp/mZUTpRlgTAjJPQtWIKMR+OyW+DxFLir493m94SZ6YinUPV86P1vG5ym2Tsnqvj1uMhcmEUrG6e78DvWdrO6N4vj7aGGcO4+y0mlK5miVB1h9R8X6frUwLo2Hg0X/YYKYdA+T3STKcW9B9gXzQl0V5+jcMEZ/i8keE+Om7UL8C3EKXzWQVRpYh5rJlcW/Aq9dEi/5fPAllBnByyi3ZWXzwaX8VIarbkcozDsJNo3giZFtIwSNDCA6m7wQmC4UmVLL3yzUjxX4Psl0NBfKGnSEKBObknhbEjuTSbpmmqG8M5Km4HrYeHyIe5/xjou60vXe5klMxxlPt0TTW7OYBrtV2XYVdG1dIEGXpLa4VlQL/f8ONfVDFoaxA/fjRyDKMWK6Y4Eg1wnXuy7ORZ2mxZam77ypypRGLpsZHIcTIJ3FAYg4D83uDFVeD5gJARM9BHLFeJ94UDVfp6Af+Lo1dRN1SlTn0kOl1AFUneRPpLXSWogThLkJi2grmcLcl12jls+n7aDnwBZ4QpzwlPicp4bI+rhaiBNkeBAnDIrP2crwTsnxIE44JM3jyfEgni+ZS3dLc+ld3bK5dPhDYyavFDNdNXMUvYXivB8sJRK0wfgfR3mtIW2K4o3RrdE90Zejx6PKKBRKlAVOosWhoh/4itQ+90D7JOBnTURsoKQkAs0UfIFgL1+R7GUP2inRZdvBqRPRRsroFsyc5u5XbqsW8hZUeBJCqwxvId5+uvi2rX97/4n+d/vV/YVeepKv6u9vaOBJP6D1Fwe442KZOcA+eqjNo0+IdvsaG2viiQDY69u8PsDW/QLU5gOyCVl25iRdE1N+EXWha/kORxeyIxhZ2LDdVuvSWYNRjDSkK+CIW2HAYU0Gm33wG5sG0xsZkSteq6rSuHX0Stlkjl4jw7L8hHt96I3o00l6H/eLqemkmZ01Q6+STcSxXV1yYgnNd1FnOgrnlkgnr9AMQXr6ubjDVmW3kKU76kK9y88eaw77fXrDc8/t29caufyKjdet6q6tbXDVGBqsQY8nFPP4DEZu7JIv5u+d8LcGAjZro+/qPzxy8dewdSR735ore+i53vV1tWZNwN1htdbUpDKv5k/Re43EsuhBa/get90ajvdoEAnU1zqqhALoqY/XFvYWE0c6GGnEtjhymNk5pUsdSoesPOjZrezAIvGWrFQqdXb6pdTr0yybCZcd2yId3EKTVdlVYnMUgxGryX2/kRfDvn0YHziss81REko1UaxZduZksSjo1UZmj2lZrLlCUZhzdCMJRo0Q41yjvAFF0St774ms5K/+ZBRfE8WXhW8Lk+tD+LIQHqrB81045cIrTXhlFf4kwdcQ/DmMJyJ4XeTmCPmSFX/ciiPWlupqlaGlBWUNhsa4WuX21ze2NEUs1upqrbOpiWtw12nocT5NCi0tt1gqJxwY2TXNzip98exLSXpeEfzGwg4rZTulyu5ydk/WN0xxv3lmfb1GrQagKfV/H1iv0DY5p9Tv71vfxCFXLpKLAGguEk+sYtmn3nDhhE66GbJwuqvdUtgAb+5o93mtNHtWec3nJp7On3nAf+fhuxf0r79mJ9a1LFh88fTSrvxn4ld4HdfdilN46PE/77h2Pd566PabzzieuXHtV7+96uJ2vHSoNf71Db8581qwu/k6fBaPbv37/O/yP3Jdt5612yGICbcov1itorkdMzTvaYc870mcw6Hrfs2NnLvoIxeAb5blPYmjVPpcXx8hxeegB1TuZXkLDA+/x50Rnws0mmTz0II/WifhPVFYEyPm5RgtvwxcjxRrlGCaw8bHyL8zmq8pLmcxjYU7RGPT5kCAJyjkF9iIcSnjw+J5Fxtj7/gkpfw77utAuWiSG6KdYZUBOsOhob4+ngzSn91gPZeYB5cOEjS4cXDv4CuDJwaV5kHvIBkMTp199cBIhOBBKRLcNL5ZNn6YS9aHFAE6NzDJNbE1Ma01fbjpRNO7YCdNTWVysxiostyPcD8ClEv5Gg4Nx4f5YW5ieNvw9uF3hxVoeDiX+yvkL8yVziX/NxSdwLlhkmNreuaa+jRqa6XdVFHwueXG7xFAQ2O8mTNfdviyVy7j0GVr+/4qcTPnkHW7ckfBLpowakp5fXPYheq1MjlPc3cD5SCM9tDQRX+VgJlC26JxmSAfxGWfx49IbcwD8qF4CzQyUTiCQ8XBQkm7Y3GY3A6E1sfknD8fmt9fKWdZOX5bal9r2djPxq1O4kNJOlnKatzbUijKTRXb2O6NQhu7H9EYo5ZbshSjpUvnzePJnhG8euSdEXJo5OURMtIwhY1MqIWSUDTBLrJpjrb0bakttQi2mGC2qK1Oo0SiVLKKtijI9Qj3E2qLk9wSGhA7mtPs3Wxl73wNxG9oyZILFzYSOWcZCu0mPMnRuf/9Vke6nclcZUyj9oy3pUTmEt9YLje0IeohO/g6znz1xqsJuvrjfSMXKqRg83PJKLQXO2/kUCJbKlPFtiLII7SVBO/k0JLLLlyUQt3StqE6LrWN3fgL+IHSttGVYm2DyUJw21xtY3FZ/QptI0V95OLFtG0wubaCZNz5JJuhuWQ75DlqIM8VgGaDcTPfizf20mXcQC2PJX85BjLIctSA+1Gxvwv7hMQ3QdayfD7oF8WcTXyiE6POjmBUlvdGc/pY31gn9o20D/VMEh+1HYvdmfZBn5U2w1jM57NY+EJqqMSHzhMJfAw78SDeKMxhZPopE5wpmfMQeI0VeBl2ovuFOQ+6lgnYBHtK5jxK9GA+d6foK1JAl+b15BAtpN7OTp6louy3udJCao22Kr20e033RDeHutuDraLUJTozm68TfCX6OhK8CB2z5Sa5kNRTh0J0XMJOLDUaDKpL4gG8MfBugAQsU/nfsYr1FitWPrc3l+wPsRhlQFjb2293pdkaXxX00SibvWBFIsXyrKDHIxxd3x+C1sKmOyfC28Lbw++GFSgcpgtQH0EbMTdzDl2+oVBRPpOkn8rcGkv3M2Tor/l+jPr5dOZC6+Wc+oD90v2vfbRHbz7c/Eozh5qbGj6iIufSYzuMiRCMrbUEZYcvWGiZLTF/VSrzadbm2mmvGUp8RGEzBd9A8wDKZBV8RCeMwXlobIMYDfZRH3FhxSz3I6yfL7UbwZ8wmaNN4FA+qsxl+XrQi1DvaJ/EDEfrqE1DYM6y9gT/l4Xn1cz3PCn6Hjq30jiJ3fD8AbNbdYmbJQkA4UY3Ru5aAyrxP6n8DnJLMd8Q5F8srQnJ8g1RFp5TF/MN4TnQG9XSHPZWjFpDLgM/Sci8i1buVX5plZhDNQJ9xi1snVMllvuPxDGDKUiXrVSqog+dT/c6sPFKSMT/veSXZXsiynMU8Hus/dDnvB4hzQUVc0BYuQh4T3Be8Tm/T/5cCR6zkVOif9xciEmprEGvF7o2f4NAKvbPjAejDYk2cFD0gb+kNiD6QIdR8oGxwIYA2Rg4BDaApvJ/YDYQkNmAGAfNJdNDijWA2zXJ0by6/YlUmr37Q8I7+MFgwXJBYJo5UBSYhT3nkvkRBZ1Dy/EBDoWpx+PKPd75ZZfmD+eS/xuKMeojJrlm0dexd3B1zZLczU115XLLcnpmyw1+ja7hZgVM3g39DfVuRPRuFyB0pfwimczblT8sxFqBWKlsslyY12bJdZrNr7dBLC76rvOLIuQG0TbD5oZV4hjkPnEMQttOI+AJ7Y3msgiiENwgC7UK832sPTH/VFrPQrtickWboGFdsFysfJTVIbobh621vI8fFuKO9na9HqToKIlToFwUbC8PelBcV/wxHQPQGcxMPLMmw6FMJhoFsvYir0wFPk78nQKfzk7Gp/OcfJzoceaXDMTUgVFHB+PRUYmHr8ADfMiY6Bu6KAu5DwHsdQVsmQ/ppLilPoTGcKLMO/GLQgwHZTPAZG6vIPOYJPNONFmI4TL9TOBMSQzHbEJlKeAbH5d8Xl+nUimTF/q7Ue7HkrxFH9rbQRPXi2vOO+RrzmBbhwvrRjS2TbJ1Z9EvE7Aj2bpzcT8SjvFafRrFmqt1vJAHVb4WC23zD2JfkkpaZT6crcMy39wqlis8j/yTuEX0Yy2sywL4iRaMWpprfGKXJfBQ3c7s4zHRDr8A9mEH2fFIlXkkjPGwVNYiL8VlzD4eF+3w6+IaoS2Xi8chvu4rKetyfMn+MBoZrg/D8yMldVmOL9ifuGbJ8HMV8H0FfFkZLRgxK0rKCHDXFXCLZcSLZcRLZcRjxOfa0mVlxOzxMdEeHxbHFLqhZZQJHqqgw5ikg2CPwUncy8Yvlto037u0F6xoAeVCF3kLrUnwDWBPwC9R4Ce3p8UYLR5h46qiPSkuYzb6eJk9zWf2ND8Xqi/YE1unY+vB5sL6Mf4BquNNGMW8MYJiCZca5ElKykg5vXTN5SZpzcWJdrLxGE4JZWZOo3S6FYIbmfMplLsV2saTrG2YZTGLi+Zz00tgxRbCslFoMkKRH2sjcdnaKtM/i2/LZmtri/oLOvkK+FD/p0X9B3lnTRoNLqQJQIL+gh7rJNwnWF9nexqj9pl2MjXzxoH2drZvU47Ncg7MYr1/DuqdllecN1nSKJ6l2HTRfVdRaYnPmFReO1n+YuMBfCiN06zI9EYoMp6mIOB0schYf48IjVlVO5VjyI86US/vsbr8BOEE/O22KIJ+rc3S7q4mGDU0tircRENn8M++lITXJI6dfilZLVyllWLnNzo52emyhfNljZge1tiAe+hhbVg4zVM8blZ4rlGl+rzv5j+fiV8McajO0xqPK5auX+E165N/c/U3PnPdh7fUGHTeSFx7adBeFxxxLcKfVue3BRPe27j11/pqql3BIG7hbz2za7nHbot+kjvrve3Mg+wXnd6buRu2eFsIx+6Xh7GPQfll1INu5nu6uuu7DYbuei5l66lScDiQttl6E45UIBSLx5taPKHuDlAsrLDHW3Aq3hZDSeytrzK6DQ06lEv9PplM5lLHktOvJ+ldT5ZULEXPMEu9lIyl6K2G1V2x1Nnp1IspS7UTigfKh64HiQf5S8fIUv19s75pzKSiWLyU2Sd+4m598EG9obZ2OJ/jHU6DIf+E/KdHHuLcQXeYXmCPLy18VH75zLIzWy+tqzMZAwGDsb7+Um5T+c/L0vPNjRvPsFfE1oRGaL4f2EIKreP7VyauS5D7YpheD0U6m0eaiTrgDIQDXKdxxEg+pcPu2pvR3WBB6lTKq8621sLfjDdrdZNwk16bQmqUAzvJgZkI58GeZqs74+bifWDY4Wzg7DYjafRHFZl0n6IjZYSfGxSpZB/JpKMErINr6Y3bwx5r3y1PbVh2/40Xtbsjo+s2355dcMk9l8cN9W38xe3Zy/s8phqvOZzgHulb5Fu88qr0uifvGIov33DnPblLv/vNrZ+5vmnVoZ/96SvhK65cNb85c/mt85OXLxuun8/WR+fP/I7bBzon0G18YmXsutgtMW5BeFX4+jDX3kjvv1lpxAuM+B4d/oQOf0qL7+XwvQTXuJA6kWhQ02sejS3mFm9LvIVztbhaUg30K53VBVG8vipRXgrjYjGYp0tWuMpLglQoCfKfHa3WQJ0led1jG5b9zbrhNvvy+3dfxp+7HL5762Bs2Y233527648/3ZOdqxSoHwhAHGSDcoijQXSIHzDyuGc3j7V8DX89fyuv4DWe9vY2aMBcBL8P/kOlUfnbIra2tggEpG0ak0n3mAOHHHi3DjusOo1Do5si/8IHrQ6b1eowm61WTUQTD/CJnlptWzxutVh0RqOKuJHJBLxzyZiZNSRoQHSB8NivkuwGmJpYyhVLxe41R8zon+5V3ml+Hm8a3yRe1su+ZydWbRa/mQbz2nTleCJu9dnpkSFObO3DmTQ9+9KI1djIQekSWrpQqooOdlUy9hsJlDP9hnQYuQAJPWCuwq0/1pg+g59cuKElfyS+4VO3dvOXpB2B/pVpY+f8sfmdxvyaTDS2ENc1tXuN9sYWe8vFS4bc/qWLB5VjQdVIbavt7H/g9209dYurg0HtVWvPejZ846pWT7KnvrmvxYFVemdjDXn98lDI8OEhc42/uibgrAr1LW3RG9WY1sXM2/lmxVLuQZRFS9H3+Bvr6uztYRy2W+3xQNgWCITr6wOBNWN42Rj2jsXH+DFOO/a1MTJmjQ8MkKqqT1vwxyy4w4LXIRyi6/j4fYQttIqtFqgNi05HiBVZ3Zmx3uFwxBRoaLDo9USrtbvddVUqwb/FClWRml0XQplv3gx2m5TKfTM7wqXw63FaI4l4EEexsLbNzoNTSXdSg2MTbkNWV6gYZWmdkIvzz2icFoNNY8/gnfa2Nt/xaYta44/glnC1zaU0G/JTrddv+lSxkrrmL5yfMeQfl6pn2dg8t3/xwv4A2W8OOS0ulVkfDIbrw/PzSfyXlrBVU2UIBpVVBq865D1z7Ma/uzparCyjK+ieKq8l6HdXQNzVqHy0OkQeoP2u5kn0HIvxCEu1NBkhTgmHnU6eyJIhxT0Hs2jfYLTBSUI77H1AOjXzOl+VTlPyJJAny/Y8CPQ3SfRTLI+Jji9JvJlvJs3NzfTEC/H4Cik5RcodL6c/Mgd9O9C3XwD9s38l/6P/E/6qL0r0zzH6wAGObBzDUzOneP3YGAMQEtdKASrQv8Dom+hemTFcBjEKEKMyiE0Z2dotrUO29q6C+keo7mmy13vYC9EdOej1mkxQe1Pc28KG40wFGpp9HKQ7Y7xmL6N818tVoi3MzcAfVa/yJnMY6L/EEKZ+DrHxPo6khDwzexqlUt3dPOGInxOjxDlpj1Sg7eq6MNpngTYI5XU89U6qAGAsMm8UAcaFfKjZ9EfnohcEqESv+qKM/rlTdJ7AwhFzG4b+Z/FiSjXKiQOJTEWaF0ppFi2aRTMMY9tu1i6/KrZpGkunYHzX+W4n6RSSatmbwQ5t9BW+qpON4cWtm7ulrD6x3Mrx3mC5lTAOZCvIJoMHhgz9FGAAAAZKfYRAe5NICzW9DqFmXguheMe2ju0dYCcv8PqODqAmWL4vSt5OyjGOnAOD7jIZOi8Gbet0rYDlwClGMpXYC3VWTnd0Nl0ZS6muldPKR6HezuAaoRZm6G0hrXwdMgfeCcwEOG8AB/DSeWvmbZzHoXnzRkd5PFRoK5syMWHNZjbOG+fBWbBgDhy1gdnuGbJKanN9fAwtDWBAQAFzYElgdUARIHjp8JrhjcMcGjYPe4e3sTwRsExMSAdXmJCjsJsr4x5huG0XhkutF7dzIGvmfLi0rS7cR/AwNTqruymNhnEB6sTwu8OqqZn3+Lrh9OIIP4u3JDuDF9IqJZ9QxufoBfJZ9JH4VOVHuX9mbehhsU1SX83yk9/gq9oarAoee8GQvPIDRCrQvVGBTt4/ldLdJNEJfauX7SeBXiFBCQlNtcwESky3Eu2RirTiBsjz0D6LjhfaC5qTaQW6o7PpZjMs0LE+8GFZHxrhqwj2zo/PXzp/43zFFBSVfn47AxG2Q832D+U4L5wHR37YixyH+uuDrL3OlLT7QT6FNmSwObMhsyUzkdmWeSczk1F7MnQmejV8tZV9ocngdy6ZuYSgSy654goeryx2u7J2UYb/xv8M//LL58JXf8Daw0yJn7Agc2ZphiAGx2UIXsUyX6oM6SWrlq4iaNU2+rJqzRrqJ0Y4aUFR7n9KcY98FNzVqy8Yl/oJnrfKcY9nFOeReEEZsuQbSrGPfjRsQeq5sVm/XsCmsUCU9yFzemmaoHQ8fTzNpcH6l5uXE7R8+c03U6yNUj8v178E54Vz43ziExVxgjMnSZz5ma8JceD3WQ8fFHp4SxoFHRozj11g9i55GI8q0L5RmbYRaBvLaGf2MNqbJNqp+xAKHYTG3pxrhgD0JV7f7NDQlBL5PoFiDDyL/shc9PLxi4x+BuivldE/+zPR66hrXZX4ZqS8/lK6o+V0ZfwKdP8OdBczPyPQPQdlFYLehk1zmw0w3OqNamjuUhzo40V60b/Oon9hLvqyaKbgn+EP9wD1HwY0Ky5Zrd2gJR6tV7tFu1Wr0OJ3YhjFYu3tPE6WOIpMRZw3zoND9/BWxFH8G21jBiTzN9R+eS1erT2uPaHlINLzpvjUthQnROZgv/4K7aAM58i5cSBCvzAc6k/SfAhp+QZvuoi0JDVLqEZ5eBSRyrsM7+gF4AnCzYlH27uER/1GE5T6cS2mIXGbuc3btrpNIQwnAGVUpuJcGC/MiQEBWkUMIbfh0UJuA8QzwplGMApsa6DHWpQHMxVo3iinKQ9kJJqbJJopFn972dmZv6OxCD3WgVSOY8ppj1SkrRzHlNM+K8ZA7MxOXu/3QkdwoXyPVqStzBfN/FqlZO1KxcZ7hfY5j7djtAQa1h7tYa3ikPZl7StgOAqtcHKTlvBQPdQF6DQZFIkkkzyJFtoabWzCgL8i/hv/A/xE4hz46ieZvatIQmrPXt6G0SEwLnpuLvUoMGRt4MTtirHxou5ltEdm0YIXmYtW9WuBFl8vtdtB3ouRGbQ6rOWWaFdr12g3ame0SoBaGsPbYttjJCYM2sFvFuTyFAbtwmhkTvyjHxlfkL0i/sxfwGaeYH3o38vaE4vzX+Krko0uD4+DYDHB0jh/Fp3QpoKT4GphfO+oT08V6eVdijgHJ9LfJNIL43Mh0v8Trw8HnB6+7EA1Yf/jLLojFejkJzJUpiu2KyLsAGtvrOIqcUSzZS22q1LaWVyLtKzf/HvZOEGghSBhtMdFJRbPhz0P7QusjJuh1x2VFXIBYwQwRko7XjFu/2fW7swl/eVCvvbyeoyQM+Zc7dzgVKx2bnESj3OJc6uTc1L0voyTrYBrMk68tW9bH908MzjI435ZVypsSh8X+Wj0zE7N5GqpDS3jdYh3YuR8xUmcwvwPQ23pGUo7CR7gu4bSA3ygGV5q69NowDvAD2wbUKCBgZER6v8Tov+nqVDiWUIVeR39X+CVnJsX67MKvGifFZ9EDLsevJITO+l+RnPWm92WVaBslo6gCFkl67rEPnThzEnFn1ibeVJoa3gJEvc598UctTxmBwmW9kPlNG+U02SBJluJ5iaJZgq75DY3QOkI3eKbyczqB8ppj1SkFU70OR/ts/g+aq98LY1/4qmNqYnUiZQSwoxK/MW5ynKMo+fEKJNDjsHajYDxHCszYUx/6TAjXACEC8rH9OV0L8ymuxjoLq4w56aaR9sYub+k72zha9CjWoy0j2qJlmZP8DSBojOX43GPbHJaPjYrwxHaaoh3yHAEkL4+OUjp+O4QbRvkfuEUIdYPNsDYEQIsPguGmp03j9pnpGifmYp0R8rpBgbmoEsJdPhOqf9r500FiWdYlMmy1G10jjrLZ4kkRGuhzZWMK0vxjl4QniDcHHi0/Up4NG6leEtocQplSjDb6WLTGNKvtJ9op2l9K1ZQvOUXgPfCBeFdemllvLK1HIMTfRmJ52e9y1cFKyyBydZgZHTCSeHNB0guLB5foYXe4ShfVXEVbVOlOWaRt4evxqj9XSY1nVyXz1zhsrn5Iu1aRhs8gJd04s7CsWMVp/c3VZp3A97sLAG+Cq/x4KWejZ4ZDzc18we+yuMxV7ETQzK+kt36FTDWopOsvZrxErbdhBKWDgcEumDp2N3ghLGsdz8217CTx6pqasxmHtcAYY1M7Qp0a78vcDM5sd7ppJnapdMUUj5qaVwulnPzJDsw8OkqUzrmwXSOD3SlOa2lum6qOB4BXen5nc3PEFB1iw/7xCKvA63N5YMgsbzK45iireGZN/mqQIDmpIeAMlQx1ivSrUXfBrrYQXjYaEmHBFPPLAlhTwijEE3PLQsZxzdJOWZl/t3gZD42MYnjNLfPE0zHGZzWkt4e3xsnKB6f3TGORyr2c4a1DMsnxKDMAJPJ2dTiGnB+tLiGbA4L688WNYmx3P5WXss5+H66p+h869GF9liG90YJXozi5XiKdwFr1IWyEjBvkjDZXLpMRrfCMTgfMM+7bFwiYxHvyGy8eYOz8WYvI8+B9+z/snxH/zfkK6xTA95zJXhRXq9wrFzF8M677i3kHZThvVCCl+RNCseKlQzvgtbBxX23o8U1bXNI86SI+HvW7xs4Q0+7zsafY11c1LUc5w0ZTpS3cYbuDMU5/1J5Yb4nPypfcwZEiCMoIttJ2czrFIZcNyCWrn8PDZWufwttbTbWkXKsvq5ZWPPnXxjWszKsGNRBQa5Za+OCcLK18UI7m415tBxTlG8WpiDkXJjF9XPAhLhDwmzkXQrD8sUMU1hOv+yy0uX0uXFeKMdZtkiGs2pVZZyS9Tzm70TbxXSvT/AZgrq6qy280A9VXBaMZCrhvDELp7OrDKdsdi0yu++W+zaG00L3kPX2VdMJ7XOuGwo532VYR2ZjZXtnYc2aB6uIxdYRJSyIxCW55lxWrIhzdDaOKNOcy4xFnML6oNyHMZw0X82hi5YxnAtcdpSv08pwX5iNu/SiuXFnL0PK/IZsnZBa2oxwenOM7TRZxHcTtPaqoJ//aMuG1103e9lQ3kZKeb4xm+eatR+Z57XXnpOnfI2u6B/ZXtBh3sWhj11DOV7QMuP69ZWWGefmdaSc17qPXTCvG274aLyelfFawNdW0OtcS5GCZuVLkZIvL+N1tJzXLL3OxUvQ7By8iuuVRX/MeHXwTRy69TbGq/Ly5cTE7OXLkjIrwX6hHPuWW8+BvWXL3NgLIeaQ5n9oa6IxLuvZ6ViHnQ48upAGuZWnkJgPKcd4YzbGglEZRtmUkgzjJgmDzSlJGMzHLl7CpkjOOcdUEevIbKxFi2dhzZpzqojF5pwkrCTvk+S6oCmoiphHZ2OK8l3QlFQRszC3RP14SR2w/uCqqxnAnFNUFXFemI2z9qoSnFlTVgyH+kzZXJPcT7PbblK8l6DB+U01fKUprIULZ09hFeOzUtw3SnBjfD1B8wZLcQVQmohWNqVVbLuyuSmZr6XjvTD1EyMLKKI0VbVkSflUlbytlmIdKccaHinBElYz58KSzVUVfaXi/1C/PMmNsPOTYBwqiHfuGSxB5rIZrMjcvI6W8hou8BLEPzcvQadz8irOcRV9ZYHXFQVeV4xTXuee+br66gozX+fg9UIpr8sLvC6/4vy8rrrqXLyEObPF0pzZbum+wqFgbPZAXJYrvkCi2SXRrGti8wFNQNNUejZp2ThWmGeRxonBZzhHNEanAqbmnOKT4dBzAQTeIn3VQeJoibCjVCrPEwhzgdLzKV5fYHiBc4Ol5TUm6b6zqHsoSSnlI+8S3cckWXaWjJGhr+GEOYE5IIrnE9E70oRz2Qy78X3CHWkEBjj0gJ02IGorvetFoFkn0ewCGje74xA1sgOrGunpjo0lZ7cK+eQ3FfLJoZ7YLgIvsyqdMb3ai7d5YRgUzaS9BPuEBEsWWCBZDnuRnp5AFZ0k9GaK/c76tJ+tYRvSE/69fjKVP8jr/F46BsdeaaVJPnYv3ucZK+xdNgQpgVDPCKNfKuz4JeWjyI4SfA0hJvUJhE+gdxFBpj16rK/mTARrCCvMK8enX50ex/Ri+unqrhi7UpreMk9vBZZuQ3Y68EsvL9O01GtCen8s25ptDinJo4uDCVUgkzAk/ZFkIkb5/iw/in888yCqQgHeypnt9Wktf5hgMuFRYiVSKWPHjqLYeO2x8Vp6G3AEA4NenLLbUskO/OPkwOeu7aqpy28MPfHYY0uM/y/1cCjmk4eVY8iJ+p42uky2NGuBBvjgvM6EPCiGODSFN/JG/XUGQ1pxl/3TSHOXCaHc6VfeP3sSx06/P36aKhjBDuF+buGa8GoqAbtQnnyVXBWLLfnkqnCzq8ri1Rxo9ruuW9E44lSOPcF7lvYGLBdjzqDlM19A9I5wh2INeVj1RZCnEXjfLpPJDx9c/ImGdxtIwz0tfDzAB5YGuEDA4LyOipkTBQ3przMbvAZioGJ+2n6XIZ1TLFGsVnAKXxvvNoU94ViY04RR7Mrxw2cPvzZ+8uz79L7scaoIlOb46Q/OoxAnuzpbKfs8p6IKeok2vV47v53doN0Wzam+WKZ7nm/Lsbu2o+Kd2xXmA4T1AGk8muSr6UWtdGLhwpYHimNn5j8flmHR/eaNgWqL/EyAUt5sHUE2VncWeM+9rCAb849J6xE7pfWINfTWrwidDJFdkSOtR5TQMZ85iz+bczgHTKSYs3+TlLMPHu3z9PZYO7TbBm9aStuPB0hA2NxsoVe4sru66NFROC11nLFxcd2BYp4UMYUd0mtn6G1dq3kHNrV72vn2pe0b25VmeJlo39auaKc3As1/iB0dt7/aLhwhF6AH1bW3Aw8qiSdNRVgd2BI4DhK9G1AHCpzpSjk99mTzJmld9RlhfIhrJX0yfDMMpDCgwEBqdXpLemv6nbQalBjyDsWHtg0p0NAQDSXxcCFki40X8aZFPLku1/Me5ElvT+9Nc0vSh9PEIwLvgXEagx5hSv0lTeO5/fEUe+cDUKSmEc/I4REIP+Mj/Mi2kb3ww8yIGo2MMAGGpJFoJCLMHgj2Ru+Eld+bGONSol0uHINhoujvwei4k2Sr8iZo7DXo8qepB7ubm8Jn+VjhjF2FSmWteseK37HOWIk1ruAVe6HtmzHGP+H2mLHZoTapsEYl86SvnAZnOj4teFPzr8bPnh6nF7jjlLKiXyVb/fmfn8i/X+ZdwX+v+ma5gy2T91mQ9yyfRhzm7j6PvNCVXLC81GFpcaNVPYe8+Z/7r/9qeWdwU/67FQRmZewAmQUf3IYekHngRvhQW3s8jI+H3wmTsCfu2uiacO11KVylfUVMfx0ymA1EyxWcMA9dh4I3R9KKPcLJMi3mlr0tXIvbVIs1tZJuoNTRCHKZF52sFbzy6iuZXwZtQV3W1Z3LL1fUfi6v/ERZgcx2yfNnFQ49QZytdy6W1jt3Pydmnji8s/OqxTzjfwOaJSxeFmh2STROjbSqWnon0Mx7lA+9U4vS0Ls3n6N3bzpnnsNN6OpJLkpbXUNjOspOAat2ps1RDP+mZo48E40HaeqTcNci/AYFPcCFW53A9GLO4wkuQW/cShAsROlEuptzk5AhFRnfLOajVZZhLZNhMW/htkS3Rh+Ncj1zcYzjXHx1/Hici1OO8bk5CnkaM68Av6XM5wvltLNQTs5GWk5CTF5WToxGdXOZjDuZjAt4HYdiPSwFmwlXVRQuB+6Lt3cNpT3syqB3c4ocVyZgbjySKayyCGej0bPY6JmXwtloMFZC+AFBQm8LPYOtQgzuAJoH2Z1YAs2umRkhBocO109pKsTgNBD6ipCnLPPxMb5xVjY38nq927wcvAUC4Fy9Jd5dyjF/QsSS+/dFvBtRECKDpJmmx7UqLfbTwmkY/kt6qR8jv9cf9/P+bf7tfhXy+0sYbSr68BJf55rDN5vNCv1cvlmN1Q6zyYI1llm+7lgl30wbeaPfTk+7sBdCMNE1x/z6kKa+RbPs5SXQtqlnHvcnDYlMQJUILn60d02ygrwVffNfL2/RN1eUl7nmUnEFzzxbYLlfbkWPy/yyDT4EAsiFwXW6iINzecM8W6K3GS3pd8P4HRjifgQP7T7kJu6Chw6YglgTvAAPPR7BtS7z9DR8cX5PXaks5nTUpcUz20/fM6uopPyMxVJ+xm6WJxqYxI2FGxJe4qsa25yVUnGL9Ask+l2M3v80Phx6N8Q2s1SFgpRaSA6RbvSQ8mqZ3/x7FrtehXbNMO+NdoFXuniS6xG9N33fBz4J3PbBnt5kqzi7W59sBWRudR/O9a3uO97H9VH/2Vc2N1u4yisTKZG5At+1jO8gr+ce7cU9vT2zGPXiXO/q3uO9XC9l1DsnIzGfbhXE5lNs7vzbYn70AVY2JMq73KDMz/iqqEetLs/aYb6tnPaN4t2IElkrkLVWzLcZk+pjZ0lOdiBOq0LINi65U0Ysk5tnlclOoUzonYQvHcyOsBxpKJKDQomMSb3D2MaxPWPvjinGuLJSEXoHaY1POGvpuHTW0m68DfoG5udjXfSYpSz189kSPy/QrJNodgGN2DckE5SmcLF8ad+g+k8hzxcPSH3D4IFV9VhIv3XR5OQtsa0xEpuoz0Cn0ZyO8a66dEzI/9HS5PdUih77JC7QR4RNA5lxKVfSLuKvl/UXK/g6YIG3JXCCJg0n+GAzvNTWwws4GXaQt52CJxIAjlY78RLnauceIW+a18JvnBjHpNki4QBK4FvIk1YOsnxsdUk+9gDL6DfGjduNM0aFFz6sMXJGEs8uzdK7Bk9klcJBv1XVaSHbkeSkfRCbCvn8UMGnFHZyGPx8FTIhN7oBxn68Cv6a6tM0tOZUegdv5s30fFRTXdpspF2WyWTCprv1Hnj9icmADVDrvFZbw3MmK9ZYRXd4+Ozh3Dh1+GfHzz7P3N+i0+aj4ADFz3Rmpjg/oIZeSy2fLzjMZgOibbkP/flfHP8a3yYM/RV3tbI5Av5reNXpthx9iEcV9Pg4bxb1qEsXVeC1oBaCcYNRz/RAVA+joIcRG8+nB8hfkN78fEU1wlJnJleDTm/8bf4X/uu/IKgRzQlqgIKHaHcmKpJjc3afgh75EOt3I7zOQ0c6Jow1+DmQhoDMWu7ujQjH4EHoVc6ephIWen18qBGKinboxXVAaU1KyJuT1n166NnDnV108e4j5tGVrDOyuZInZbjCXXyUsnQ9sijH2hI5IkU5zpODV5oPOCbl8O3Ei5AYCcezlFC+nlbIb2cyjEkyMJrS9Uy25jcHhOBbZn6t+oy4r0Yl+ZYUH8Rou3avlsS1h2moGKfrDN66eN22Og7V1dGTcHG9LPLcLO2/nvm18gTghQyq64qeZIDeQcXwYtqcdol2qXabVhlnm3U4KKmGeANpoOVkgHJqaGDo0jYdEV70g08Iaz/oD5KsHXxLiai89lEAxd5mmhy3vXlvsxI1N4NRYtxSIrAUKyvp2nuI3M8X5eX5JDJpPRQupqXR8kbtBLA4DE4NylCLTRGMIvEIHwFzjjDsZmmvYIzeMcaws/lR5UE6nw3yCvMbhTsqo7GmmuJ89tvQxjOsbXRB4yUYm+DLnxCl01kLkdvZp7m7SY1COUW0+32//Y4rEln8/qL3zy6e/7HBN1Fs0enxLLSTcRpvkgwNLYVYUj6/bIP6dOv10uyyZgZcwx4Ieqv14Oc0hpIZ5uKwu1LEhl8qC1wHZgVi9Owp6U/i/4OfZ17Pn0YBpRbK37wPuvxnuV2IxE5Dn5mIWy2NlsCIUvvnkyq6boNngvDsL5X3ICM6wQeN/J13pgl9MSpVKkMV4XRKlUGhreJ0erVGq1DrdRw3xe3lYdxmUyi0BpWK/lSn1tvUar1GbSRKvUKv0Kl0KnWV0mDQatXcc9xupOZ28yYlMmgNWp2a49QqnU4/xe3er1GpFPR9jUZjFKWs6YrVnk26YjXms+wUrVQNO0gxFkPwXez0aXqCVhK+EX6TTMJvu7qqu+41Rl0R453m56UP0Pvdq3jemL3XaM4qno9EQPdGizrcEe5wdjjVTnU4MPK5xM6diR076Ovn8qeVN96XePIJ+sMTTybuE8sRPwVlo0Of3UdExRGG9oS1Gg39yYR08JMOqQlWgGb4B9weKHQFaMIjHbeHN6iVGjUMUDQ6HcboH7mn0GGkhN+qYmdrz4CmqVhXVyoFmmVjZhiMZE9aqrvgH6ijjAraKEVtwHxBdh/Uni/cgZ/6eeL+/AfD+KL7E4qnXkt89i9XKX/72QStz/xFUJ+NTOY792m0WiazCvo6lZpTKOhPULM2pVKlUKqIRq1TCiITJrIaRNZrdVih4bRqNTwkSIzglzh2ulTiWLYgMIhMiz9Cz6G7VxIXCtsHhQxF7Wsczn9wf+LnIDMG6ZTf+mzitZ8mPgt2uxxPkJXECfw1k/ASm2ZH1PmWE+XZD4nzYdb2LuCZmd/jIwoLMcKv6yEG58K8DqFaJb5WMTziiph/u9j8AfUrUIS+jE9h+fCYohEfWQDY/fhH6sPkcqDrp3d9HSCYQ5gu7jnq01BfhKNp/FpTmoNePBuLZBGoHzFnzeCg3JMYTWmck+thvBqjl2tZMz57v3oL/tEDDyB6Vt07+SFF9UwnYKvRxyn6pBKKP3xQNaF+RU3U3+N6aMMFWZ0cdxzCBw5iVsW1WnCWKuW1Gib4H7PASnhFsU1Z89lsflP2LGOuVE2p39u/Xgnxvvq9yfWECsHEoCraqZrVVE36P3/y4j9cLPjlKe5j+D+UNyA7GmR3m9WiPrtdr1dx9neoMNrqpzjWSWi1HGg6bobGFhvPohw9VBCKz31AzyMVvVTs+dppyiuKBSdqt4lDZHa44Pc+se3jg4llg75qd3VVcOVi7mOR72xevjnbmezQqnsHr2hjfck87mPccuUN5pDmz1+g0fKf8ceFvuSpmhqtttiXbMQ7yDXcdvDyhv0EeyGEiNVO0+VIpYVck9eRv/8Qf0Cfe3PmJH4e/TPElZpJDWF2EigGeHb8fH802t8fjfFB9tofBUSgUdzEaJxIv9+mMQJdit5SJ6dUVEQhO4RP0f4CXrSAi9EDpANv4OxyWZAcZYOEcku/8JHqakEof0KDVCeQEmmRAUZWNage+VAYtaEudAW6Fm1EN6Nb0B1oAt3K9w5dumL+pfOX8VdEU+3tyY7ox6+8MhpbtvD6ZCzStNYc88b4GBdbE/XWmUPVQY/b1IidruYqNWfXaxQu0DOVOpZMJo+ap5P083SS/vRa8th48jV6U9+r0/TWOfhEbzY0v0qPOqQ+l0awmcaMT+kT/oO5pTIp3GiH1o59he8tKXsKw+M+O4b/PnrEK7wqQuFMA04l2+nBnUJROO30KFeV3daAqQ3hRvBvgj1x9AM8GYLvUvR/UHzXoHXH8byz/5T/fuFV8Zn894+v+/O84+uEz/LfwrOvfhrX5Dfiu/Pv/eUvuOHMwavd/uvbOrID31xy3w2RlTX1F7d0Zb+/+Z7bFZ+55NO/umvLVyeWLRq7aBQ/sW7dn9atW6f+hvCu/ObxdfTPn4C9ahVIAB/gD553nHuTTJ99eN2ZR8n0uhfX/WSdvqZ6whtuizbzS6+et2KTueoOlzvVtGD82iXjN2FT/iyZvuWaaz6Hr8nn5/V3D0IPM48Ke0Z4o3ZQPacdpNClaC36OLoJbUafQrehe9CX0V18P7/0otzS3Fj3pU1t8Xhroum+O+7Y8pnmdStXNjeNzb+69XJzsxciR675siZmDAHRGO7dMssaWNWXmUPRFo5a/iqLCP6v24KywjMf3T7+WtPgtsh/O7eh3PO/YSA3l/8e+hoaACrhL+trkM/iswThBSMFOuPlDp/hlehD5FUcprb1/9uzWtQ/8y+6ldBncWy+oAmlUT9ahC5D16AY7xwfjDRcPZpY0Rdc2tFQVa1y6ZWcklShXC4HwX8ulXo1CfabBKNOshlsLHfDCodgMdToxO/7cPkvFB/9F8+fSa/iXsy7dtz86d2P33nbE/nVg71dw8O53j7FwL6Nm/Ys+/zwp57MXzmQ7R0aynYNKbIX+qXyhr9cqXzs7O8Ov/Cdb7384mPfeuib27/20N99+8yDz//TjvW7L37569/9ysOPfOPbnz/4rfN+IfSt93ON+G+hbI1oHosHdCEcMpCHMDbCMO1i3qzizFdob+T6jI+ge0w/vhJCkg9Onzn7JsrRIARvHnfvRzyLB1g44MbtHUJx2NQQbd7vMRis8yOBFp2h9/PAqGlLa19Hk8fpDt+V/zliMcBjXCNHaAygVddADKBV4w3wi9r9dMA4hTfw+pEwSNnw2Ej4kAfj8UgEaNRAswxowlr1zGfoLIFWTU+PZNT0li47bySuhgaXi8cuk0mIJAqxRBuI0QH66pF2n17NoRyNIzgximnATiuu+nyXuyXQPupUeeDZ8K2jTk/Tsq25/M+o3aLlXCPZz+hrkOGAAdkoBgsYSlB8JZCJIiRumQu+jBVYOwd6LhF5hZDlYK0B+QR+KWbNVjmT1Jw//LrI8Y8VP84tR7lMGKXyXycL0QBSQbQEFaeCyCbZlYgHrY1VMFrHi89esXfvFWcH8itxMP9LTPexKvGKmVOqJ5VZFmPRbKge1M43tLfEAwGXvrqaqBRqrEMajdLE5TjCaauqGqA7moaI8/nxpLMrSQ9RpjFZPBHU4g4tdmqxWkukNgyOX/YZyz775N+vIBvOPtBNNpAN3WcfYC/0rW1goK3wPzow7+zXxB8Uw+KHwP+l7j3g3CjO/vGd2dWqS6vee+861dM17fV+J5/Pd27ynY17wT6Dsak2BGIHApiEFpKACSEBEopNu0CAgzgOSThIgiEkP+xAAoSUe4HEkAK3/s2sdC4B8gL5vZ//+5e02qrVzjzt+8w888zpv6jDd6HOnvvR+19E360t8VgLrDt5o8pS4e/Xjr9G7sf8LfsV5lDZr8Cf0AnT/em/h1KT8K4HIAkTzCSQ7+8KgEgT8yqm+9Ljr5P1iO4hhPl6iMVs6rzk5Um4LgkWJoF7fzydJwCoSe8XyK42AiODnLRGtjPv12iEoI5tkdYIO2wkPw3z7LN4LuEC8ttQXR49Up5mZlLIcKeYowjJEzi3uofnkzxOqG6oQPi5ZNN2yIswemv4YAR/AJ8Xkk2AxPXJp2OHeM5qcCjUAUmZKe7V2e1xly1skTeturhtYM/qepdzyV63Y7hBrW6soyGsVwRLSVZtDxkMQbva6QIsOc8clMfttNYRMvlyOau3xhartbRv6PaHS9v6evoG1nyjsxU0bmlsbBq41GtwyCL62cc88zmCTeJbqO1BQ8Lp4v2//0ONwZ9Tv0G1l+H1mAL7bqgyAYscK4JEvluZ993mXDeCnBQp928kqq4biXCJD743K6F+s4vncy03Ivzy8ZcR9pLdT0mRjUogDFSTNKT1lMvpzadpvNKG7wa/BTQQgN/eG76Zo7hfcy9ztPeca/Zu/87/+VXlPoIdwi/THMZwrJjaJ71PimyTED3J4TJSmMDj93rclNCT87qclPDL4Qc4yyzHmfeHvwVmgRXYwHHBjh1XX71j/wu/rMgfgeSvD+5Ct2AeJAnkwAtwqdSFApIOXgZBGrT+demTjy0Ffx/ezEXAJdxF5BsVfXLN8Sj9F8FVyHp+jvgh0ieXd9211k8TSAcmDh7BzQunOHPCqhqnhJgTMGOAgLbCIkioiqAJ5BWgav7yfm+1Je0/vYHgP70Bea+gUON1xLN00552V4z7a6H2sYGY3Tc4v62+xmyvM2gkIrL/soKrpv2HDY3c32L29i9x533635CPffrfUNreW/yZXDYdvbXd/82YY6DRaHM3B+3R/Npk4ZFwMB/NxNsLrrgre1Pc6m73WxyZEXP8jg8mP9PPvJ/pV9X2lm44Cgf59haE1LDvChA6g6OzH0AKdAMaXXMHtx6OIx0lxXNS0X6xGAj8kEHoQU3gSczxrOWVX+mqCxznusAkdxS4+WW9EAx+8B76oHv1cusgOXcv4EcmQ+wXqSm/gDnlXposukl1GQR2dJNJdEM3+MEgKRn8OzdI4nneKKw76YvQvWxIe3YS8wkfqwoTJb+zjmH0PU6kHPEoGmywi2lsVZgjqUPYdjcBdRW7nWSxCh8StFB9yr7vE18Jvi6e/4XdK0ZXNsRd4fanvvW9x7m/rxSvaKn4/c1w8t+eBuztPwLE1p3XDyV9G5FinN8zcc8TF1zP/ez6a7k3+CuaE3/+7y+p1slr1MXVOskh2x1g1ZEI4S/6/U5UKwVcK7hSptN8nWCPjjmUSnyaWkGG5MSpT1MJ4H3/Qro1kWimwFxbyicpONCQ4ay52NfXa4y8fy06GGtujhF8WZG9FYh5zGTky+phGWRudcVCKJRQFqROYYInP19Snvi4nB/39J+C2Gs/XJA7/n3R13xEGWY+AUUB0cptIB8iXyQkhPmAWEQ9SqbRQQn5X/txNjtExNlnMUvrQAC43LQwoCEf4sLrwM1cU+dFEec55Ivyf37DQX233M+AOt52znId5D2CPoJByBkJslSplBHIaBYrQlKTJLMu3uYDocrDv0nw1q/fPOP7T3Y/2iXQ5X/+rU37R0Tvz9DP/aOGfg5h5C0Az0W8D9GAIUysjJGK5YAgGYztiASCIdgZQw+Y1lUBmkvnIdMqD/ztBGdcfd11q8GbEz/auRO8mr9u9err8twOPk0Uum8/um+yel8DK1VKCQkjgRIFwO1rqRfL+K4aT+VhaY8rm9Z4VOnHJ8Cb+KacEd+UXFe5KdjD7eB13TUIn20h3cgmig/QfmnFH/iP7eB/fXrrAO74jAobEldx3wGT5H6kP114NjSX7BU1UBuhSIgt+3T5YOr0tkfNaW22Ve42gK/OMa7tq1evacn11tUY01KRcmINqcOHWTb+/tr0/jVjZ3XUpOtsRlXpajf6bx4n8fjGQlhYuXqf6T4TNCl0JzBTFemcDpxOxz0fDaPoox+BhuawFd19AhVBRMMBcgvt5XGN7P61XbQf8cPR/xeE1Px/wQn1nwFa3PXZoEXbZ+Q5klhz/E3yK4K11RgO9cM6hUWulAoEFTOC6l590vfy4GYXeMr+b/r68vm+gSz83Gz9JvjEju6BdG6gP0+tnJdJ93Xla/sB9c9dgl3/3DWQyQ+Usrm+CvbVgquoIvwWoSXcrEJLEHqJVMVKyF1aoQIR/KD5yEHzNOC9RUx7nhiIy2ihB1OOSqdyeapIfXFV/TXc99mOcW2U3rN0CXiwp3e1GN52yZczXxhZtfvqx8YXfwj/AyElRX9wGEPk/x6wcyMnATsgVgABeQvVQixDWCq2pNIPkJtjlJMb6ZQDIF99jt1O26nwHmaw0xkRM16g0lJ6ykYW3Fsj8mzpdISfz2bvDflr4zWp5oI5YIv/Mulxt1ksUoOaysVtwWROxJjlFkub25N8Pt1+Pc8INVe2534ednRuCdD5pM8RB1+/rjbxfNzesSaKf+TKG9RiMRna2OUOdhWyep8hdw/6i0y47qoubcCcLXQF3V3rI8IcZuCkOLay0x4/nG7+qhffu+qDvEYuIO+rtgWEWWtJNC7aIiJFsOQcd25xkk5zSTuu3aIltQqsjcuH+c/pGuxUy3vqcXJ4zvkGrVWXnjPPHSK1Vdf8g9dbKl476K0eQbiBJD3UlhNtLWmkR8UBtBVVCxx8gwtuccFGS4Od44or7PoE27DdIdJ11XrDwejl3P0fvU3mT9n2gGDXZfODDuuKpdyvPsk2enZUp9SSE3WaIJKsI3qyNufq1/+vFYuUc5mZLqc+Wd2e2gcGX/9wPX9h7hD88yeo8bmFbwa+Ez3/2ac8fz2RYV0fWYLauSKkcBnS6OE/ZSk+7hrqrH9TIu7yD538N0UD3f96CtuoO4+/CnbzPo6BcLDaE6QQj8HNcCckoQgj8HLxX1mdORVk7v7XNibquerm+4ETFYr5oUTvpEUn6rOGdThL0fHoligZ9Z/4Z/+JejX7cXsEqsaPrErmEzAE+bd/fTK4Z27rn2/PbQk2Vk//4x/VDfjkJ+OHWtYJx8ybzTvNpFnkdGZr04VUUjtXJoXfn5TyXdTo4ZkXUzysT39injj1uIH3L9O8y/oRPDGr+dCho1wreKwEHuNaP8wTJ4p34shm8NgQvnaIa620yaCygj1VvvAQBTYwx/b3moFZMUeifRDAOcIVFTsVEBm8MhLhMiZa+d/xjPrf8s+JUpxgpNmdcxsXneBezFP3oefce+I5E0QT6zKy9rCMVYcJlvayYQvrUrI63L1HxtiAmMSZPrD3rqrMcMnMgMTM4RnmZ/hzeiTmqQNRVR+zDfYiB6kF95eDlspG87+uqQ/izagozSzXym+0NJ/caKtu4LIoT/StYszaT8wnRoklxHJiDbGB2ExsI84lLiQuJi4jVrE1zT31GXu/Raig+3P9wRq3To6gR32/291fT55x5vplZ49v3bSuPDG4atGCeWcsHhlaTSSqlmKuCxVvq/iZTpnDaIc5chA51y+meBeIwW1uPt7K53UKgEG4hrfiwiyem9EfEAg9NDzV6cRAPZ1Sazz5JvIEBEAnKz6q8BP3y1f7TlVzfajwrG2XrC51Niw5e9N5n1tZ6mhcxMUka207trHugFWtNCrFdEv78Hpxr7tvIO6LGVWMXi6Sp91K6kefrqeVfqzSX1rpOT1Ud3jHpb+MqaNP7Nz9eCPksi9c8PnDcSYytesL328gg3u53FU+s9Gul8k0pEAE1oPFQYH5MBu06Ew6mUQvEEgeWg6OflxfK2Wu9ppedLJfXX6C9lJCReiQrXcQPiJExJDFzyM9UyRaiR7Wh66AkO+VoAW4P8IVDVpT9mQkYEnIPQaN0mXUMt6PpnUhkT6YMlS7xcXwRHfFZyQNXA2Wc/vqwDgYr+X2gRUF7mbuFsHy/6TWwS6wHIzXobuNF7h93M11YAV3CzXyiavxZB3qkPw4kDYIIX2A668ReWDtRDeSqQJrFisJnS6SS/kbgnXZGl/BEHPZTBG33Rz/uIqbxg3sgGf9U4Y+8jjqs3I2uWHNhFIkTRtr6npzLWuu/ip13X9UdR3uq0sqo60uXdNx1tia/Wnqc5+c+z4J73WwTomQoIQCSkIA8KnYbjp9ZDoNKrFLvlOs2Geuul9yCvCXEjjGychf/UdSDv5aAn/l5CVOTv3yUwgrc1oMjJ2PgaohsqimKlw2WNXcY8Qg63OZlEqVUwjUKpKQ0CpVY1db7UBdX2drvjeEgEGkMZOMsh8rsQj8MEdSeDLXBHZdQbXq0HcgDiLgRISJUGcHDoBqby4W5bNVLbhiOzDB323nLhvVpmz57W9uuWBBlyms2MS9Olau62bJ0f+ISS/ig5HQV/q5uJ87AqdXLxlYo4KinOVPcN1v2zOJOvDQ/4/okP4fowP5N0SH7ds/uOijySBY9r+JDKfgFhJ5qEkiR9QRTUQb0UMMEEPEQmIpMU6sJNYSZTYajERigTjjdCmdSolVB+IxiZ+IxTrm9TePti4o9bHDqa6G2kxHYyHb/XHEOMjT4kSMVyXmq0KTTxC5xU/p7sHRf58Vk3DbZ6/9cDBWbeP+iy47f/aZf/xjO7iUeuc/JlBa8ZGRWJ0LNwyVz4TbX1zJ/RxOr/xUhFKdQicFQsvOU+xjK9FJ9BLziAXEIqKMMGc/6/WYhCqBQOhmzEBECIXFno66UsNAd3uhP9KcrYkVc6l4y8cKDBaWVDUYr0Kbj4uZ+9cjn40q9Lzt7zecCHXrmd8L6ZeOPvnEL+9ZMX7BlZ8nw/85PYjjp0a3tbTUtc3eAKf3f/fbP4brZt+/fNe5l4BHPjkx/jfEr/2vuJbQwC/A+YK1CIXYCTerNyjpIn01TSboe2n4HH0c+RkKAjfeHi5PbMWsVPUusHfSBAz8/OSVQc94jnI/yO++7o5zBi8dLF3RkR7Uq7w6R9KdqnEK1r7y5XseH/3uug37R1M7nr6iO29XZ/ofONSPUw4QXlgL8oKrEP5xEyHW4GRdCTfY6QbuKZU2oQEaJbIlkECebWJiOmV+uTzxAk46pTnF0dGokIJJ61zZVBNoBPxk6W5hIH/A5PGYTF5Pn9IW4N4NWhmBQK1UGUW3C67youN44V7hOjNulV7PeNPPLzZrlGI95g9CBW+E3YJ1hATXDKuQiSRCKRQIEhSgRLg+JvjQIyRjuEcNSUjWlQVYHADs3riNuxPsGN7GfUDum/fww93g51weNHAH+XbfelTfIcFi3JrI6hXqhBiITZuNwEgmIQtLkIQmdPcjEy9OTzCHJ/jgC6FHeKINN4PHmFdENaCBoezb8Ssmf3hpT2+jLRgLtZUfvHufYPHKIfX1qzfemrBFjJbF9Ys/B4AZlSeE/rcR0dmMdE7ugCXmmQRXshYmRtI0oWSKzNUMmWDuZeBzzHEGMoQZl/EgojlvcpkZvpwKwDcx426OuTifJpgG2EWtTD2P9T7S9jBy6T1JW3s6Oq/R5+tYWawfb/ezu568mLuaFCjdhZA24jHIHPmIryDopK47X2Gy5uZlsovbAjVDGwq9X9s1j/sSEzZ7hrtTCnd9zNTTlrTwdYfL0IDqToIowkBCLE7SLGJQTBPMowcnpidSCfykGmxfNNj1DZwHnuKODb71q+Yeu0+w2DzbDdf7MrJKG0szup8f1YkeIe4QkX3ISUgNlM/yKLiSoAkfqh+tUlVUXa0iE6p7VfA51XEVVNHoj7AszKA6MeC/OtkafwqZ5vK0IOmo+OZo99croxevOfPsW7bXXb7h7Atanlp5Tq5j3oK2toY2cravz99zxqrcokXzlsQGNmxtTiy4sL20MR/perhjcWZBfaTEy+ocDa0IZ+UO2BK+Cg0TiIYMobQWrVdbyYT1Xit8znrcChG3Vx51+hQaaqq9UaeGcykoD+9dYdopYIWWufoPk9BaGNl69QiYQET01J5CRHhXlYilbGZJhYiptStGmn3gTERG94IKGc3dFTIiOhrgAXizoBbJe5jViYRSiiREbwuAgJQcR2eVODArUT5UTh9BC0gcRNYMy8GpvksL9wKI1IAI9wI8gDfC3Is13Av8vckj8GYKj/eRPQCVAOBBttOV4T3w5tlz4W7ySE0l18QF6LoJXkfqWKmQInCU4RhJkvgHL1aHEuG3Hu6Z3YEXaqLmy/yYuhSwgYsE5xIagnmIABIlkuG5HwGdP4A5Qp3X4ao02CG4aEnjyLLJa3vGElom2gvS+njj6J93PQJSLabQlb8+Z9e6+SvLlXrB3URrqveViIm5p+cfJqs3YPaCwiwWs0AcWpc0jCx7+Nru8bhWGesRjJtijQv/tOsRbrpFH67edim6J4QFuIs6G+GM1/j4twwRlBU2xzfW7IzvrKH8yVyyNTmcpObVAO2TLfIr3aEnW9xXuoVPtsiu9FiebHFd6am5MjJJGg8kW2omSQMrT5sJeTqVMtbtRHTCocBqmdvlkst02idopdAhTAhJ4SR4iNWFkG43my1PhCujU0shKnRPZhKQ+7+Jg4XLDbN4BFMDM4u3iERDZXsGrRCyZN6d+QC8i4fQoyqdKBPliOXhFHQqpKTbM0n+9oGNcjc0TgrfnRvelI4YUsxBPNSKT4pkA3PmII8kERkEnKJDhahx2sGqkUj/Yvmy9nBIYYtyv6lRy0V0NNbbSYvsKe43IY1CIBKpNGqj4n4bBbfW1Ez8vsau8HpFNCNLHx3M9XC/T8sYdEAslKmSPx4LysWu9opdPf5TOB/eNWdXFQRC5rsI0knsI+AUPzLVQIv/Y7sK7/p4uwqIPcdfAkfgncjWGFmpWCY1EU7EUlL0t4cnXpjmgy00+bSq8k98xSA1oKpazz3THlogZYrcoywjkwhIpUybgEOjs/c2KMQCkdMpFOibwPZOAyPX8v2ix1+CRfRfVsLKyhUKidUIJU4VUEH+35DLcIhP5egTuipJrPwnOmArMeG4FxYWGzn13+al5hcLI/qYYueq9Zcle19+dKSgnfiKfercnvbG+fX1y7ds62zpO/uAgY/vJKLHfwKl6H8jRBsbJiIet9jNukvucTcZcUfcIb1JGSKoJLWLIp3UPgpOUW9TkFKKq5qROXJQjduhy7wjk0b1gR7uNGUeqLY2VY2uPwKy1XB+Yd4bYxcsXb+uq/s7tw77zC6zdb2/tpQNNyTs/eta8guaoKLHnViabxs1L69fc61RpVdZk4PZ2BBjsC5rrGlayOMMVG/d6Pn/BWc4RUBEiU/HGb6PxRmv/AvMwDjj+I9hCN5UwRmnAQynCZjECrUY3f3IQQwyMNj41DgD3vQxOAP9byO846NwBoP0QdK8y0w6zfvMcMr8thmaGfGHbdT/AM6Auz8VzkBlaEB1J0FyI6+CDCc6TvG8fGTi0MciDHjTSYSB8AXiTZyvoIIvYqzNIEXA2+JTWQg6Se+iSSe9j4ZT9Nvo/qoTLDn9/wxXgKZPiCuqNMO4IsnabD6MKAgfwSSZXQzpZPYxcIp5G8NC6wmVxdMLU8vwP4Ao9J8GUCCbf/wYvBmeh/CEn1V/CE8gMPGvWELwISyRBFHusOxUKIHvCxzwZlA6Pd51DkcARwVHEN9H1+zncYTsfgQj8Djkj4QPYD8PHzB+4K5HTu1fkJ2X3Y/sPKj+4r/FDtx3/w124K4Da+A7/D0RJhHPPcV/gxvgSx+JGyBhP94B1WAPESYyRM/+sHuSfOMBJRVJmtDGAa1OilasOhlVGpSGtNoWSYuIsB9SItxhfKQyVHCa7+Gbxt17qRnm6NTU7LOo5rFKpYUVbkZ2GHOzA+g9brxXNd0Vs5cPZNF1PJNDdWsTC0Y1Tl9D59riFauHEfLIpjvrui73SORCsUQo9z61yLow6YuPLV7cKlbOa1zQ6E/pr2711NW3BpzzjUOPbJLSlMgr+LlXWdPub6qUD7wFruJl81tsrdEGxDbwDxt40wY61UCnBrQavKsGb6jBC2pwSA3a5SArBV4p8EtAlwBEBPUCqCeUuDYMDhGujRTSb3pG79SX9OP6Lfq9+n16kV6vbWKAknEwCYZk8KSrOw3kgAEYDFqLTEshIuFqSpTL0+UyXqfxmIwjs1O4h3qCf5XRi19NTPhoYdUgVWyUq1JTAX81Axl4S9HAjm5ua2xqP3/5Vu7SZO3yzTXrSYmzt+B3085FTa2L5p21c2jxRStW9Y5cenva0BUP1RNVWieR06NCdfFVduEbNvBNG3jdCh6yHrK+aCX/oAWT2qe1L2nJu7TAzwABo2PguwzoUIK8EviVwCgLyqBYBv4uAxKhWQgLdDcNwzR4nwZ60k9CIQn+RuIh5m+wclYNatSAUTvVUC3GTGXWK+wCviJQ2Y+i0s7UJFFh+UJXaqBSCejl0wqxpuFrABsIg16YqZRdx1cFTLp9F/Ze0N3k8V/YdkEfu7kYaSl5tb7kos+f3d/Z33/G8Jr+zr7usdKNXxquW5DsWT1/Ey87guMl2A/OIWrAYnYVHQFBLWgVAYEQPOwB17hvdcNL3GCVe5sb1upArwjUCXuEsItGUErwDWRLTdGw2BF3edSOeMzpiDu0HrVeIAyL9QJapxf80QGEDoMDvucA33b80vF7BylA1+CqCOkFWr1eQMTjYblcHAg87QYat0ftEUXCYq3YK4Yij9EDxejIJPl7dgAdDIuDNWHwdhhcE741/GqYbAoPhKEy7AgnwmRYr1CrjfpwyON3mPWGQNE0aBozkaZ4jVopwMQhFIzCqRhXbFHsUtA4TGDqSGqKf5+yCfDwqmnmZZ7rpndHdl94EMHv3YqDBxn8BcppnHcDf57ZzfBnMWPiU0olU1kBdAmCU4nKSCL+BfCXAOHLbCYBeGIhHINMWREg6mVdOj7tigPwti2b1tFKgBGpAfZzH+QCpYWh3P06xpA7a21rEZBRHaUMxKLRR2p7e78Qljhi9+nd8sK2bXmJD+r1pEzd+ZUbVuj1DoWdNhaLTXI7Orh61cEGiRMSxL/I/dfZfKcWdEtADwReHRDodDr4rg54tRkt0r+A0oJ3teDPEvBjya8ksEcAuiHwwSyEBszKD4iMCqUQEzJgNCoVt4juFcGrROBeBbhKcbMCjik2K3YqyAEFEClECqtMY52Tdgw3+ZcqjVgeyTpzZCZdkfeqrE9MALRC3M6rSVeO5/FArqIghZ6qXwDe4uUcXABqsKBrFPXswi2tjQuOVyV+Aon6zuVY1GWLm1oWlX7LCzzmdxHi9zF4O5Ejsqwjk8351MpgwGkDSupeBI5VyQAbeCXwdoDaFQABxCgT6cPlSmRCKnX4BWxUVDxuryjrik+F4fucT0ULT7TGVRyKqqP1dMtAINGqkopoW4D7iyxgp4E6ZLOxUZknzL3l08kUYjUjt4q+CW/nzuwOZ/L+1T/IaJSMXm8wiBM/WFxrdSS4I7VWtV4vpd1p8JdlEUaia63YPwkq05moTHmiyAYQc6mdgBT7zIZgQCZWSu6VPCE5LqEkpo8qW7VoCHZVS5evjmxDvKgAVWasOEg5zMG6U53Lk8X78RejQiTR/1XTHLjyynqtTaf0c+/qVcY7ldY492ZYJ6fFIg0jM0tug7fPHt0ZkoiQzwi0WmDxXnKgR2sV0Xq9XKpw/PKhnEup10tohbYGHBs7pYy+4yXQgMqow/O1arQ6gSgpZIWvCN8WUruEQIiLMz1HoZPtoSef8HdKZ5j7q9/CiNVKpZF/jkAat30qvWnw13L1n/i6JB8CnydGiVbW355KmPRdncMLRtigr0EqIpSCewVQUGNMdrKdr3S+3Unt6gSdfFViPuEHVeOH4OuUH41aHfpr+AimqXrimMGx1J946pOHhadw02ltu+mfNEgsRXumR960IBZt0yiEtMvLvSPzaBU0ZIxpJxsHQI44648xD01qzQmXs8aitMW4t/12hqbUDGMUf8sMVA1ig6mh0BWLpT09M2mtHHGXXKKTJGdaLQFnRGjm/slznE4vqZlptQXUZhf3q5wTMSXjSf9iiVnLNxgDQoj4bzmqszSWKTcj93mTNSmrmVDCeyGESpzN/xXv215qlxd4T8rUXD3hWvoYiTqt6QIdPKXh4kfjC2PNGrlIaAtyb8v8DhoG4l0dtBgXUha2izVzZdwWy3h7/nRSll7tbRvgjtbKVWg/3PDMGRGGb/XGuWk+4EqwAWGBAFFA1A9G4gqD2aQI5ugAAUjstrD0Fppy0lM0fIUG99JgC42gkoIfuIi019ZqkZjD1dEcZD6tq9hqnbYCXwJz8pM+VT0YdHwZq+0dmO7gTkN4JDlU2zqvdXXMabQr3DHuFaXLIJOJdWql/nsCcXOqwVdT68/arDrQ0baru655cOfV5T652HJHrQPTUWhrgKKsTSHqe7YFmZxE4+aL2hJKCebxBmQH7kflrCH62WS8Jiz1RDzwfQ+QepBXCs1qARFOhtnwljDlDE+F4SthcG8YbAmDsN5oV+Oo8lSlvNN8+wH6Kk8wB/nhNZ5qjyc2aSfT3wiRZZvrGwWBuezdmMjgcq2hszac1mgKo+dNdKaatTKFSKtVjdWHMnX3WCzlHmfcIZFIheDKRxcWoxa30WgNNyzvXaqmlQeHFyTd4dpRtyfTtkQhFil5PSFDZRuFIcJCeFiNVKTUI6S5GSBNdi94ApBASSSQCzc9nSowR7Ary/fJ8s5kPs17cogonixy63L5Q7t2OYwav8Sg6w9as6ZRV7tFYYShB8LcV7M+o7G+3lGoB1s1imLE0FDRUR0EpO4UbCA6gf97yNi+woalysweyY0SKDVbzBEzqdQ4NAkNKdJoLEUTUJqAhDTpLT5WSfKzE1wikmcyjoSvkRU35lmRLPNWHhzPg3xjI2SDpeB4kAzGfT670w/2+u/zQ4d/0L/ZT/oH0V+3+Eg71NsNJrvRSMgyeTuTc+aSOfK+HMjlRETIHgwi/6TJK2Jxzl/SBx0iESuWZUQiWae9mj1YRHTbJsnU/WMyIEuUkduyjJ81IwKYKePhqbFlZTPTPzuFc57M4K/yRHXnhRkiMTNzsIxM+wReo2OHyhMRQpXGKSZnUzipcNHcPzN1EOcPRmeX4YyPE0Q5glvEeLZXuZGDRsxxRVrjgR6nihFgcYiArMvg4VufVLzSTKs8/kroA2KzeoAPUXcOzsaddof/6Vmg+OmqZXaJ1iYyarUDv+WeBka1seCEv5B6DfWmjnee6Ld4KbdbLJFlG54wKXx7L8pFIm//l5vRrgQMIH44DWxJpc3NTQGaG+S+7v7bqNbi+cXZRgn3FaOzj/tei8Zk4n5fUohykSHcztFz/HyBUvBjPvagCVzJrg86NeYMlQWysKhO1CN6RPQTkYBUYg48DqCCDgYZTSZQt70OWoPRIOzSgjs0oEuxUAH3KG5UwKAMtAJAhUNOyiEQ5mpslJ0WZ9IWyiyRNeWNlNSEs+qTZruDxZNpswFGm3E4vIyAwBMJSJzSpBSOS7dI4SIpaJUCkRRIpYzX4psEAlYTsCj9wM82NCgZxHmMn2WTOMV0n0ibSc7xAEmwrDspkmbcN+nvQzgh4EVarCZE1QaNFpuTQn+MWJYkmCRwJnGmTTK5qgmEc5km6uroLVEYnSQTrExCC0gpJRTLKNwEakg/Y0jNThhSZcQWqeKzhpQhPWNIFXEqrT/zeUifRYyRqmzhpNP9M8yL5Zl3Z3jvEDHVkReXlflcO/wlR14cw7uGgkp9csF+Uxl7iuUIgblsrIwztUKXOyD05P2Vr4rXjXVPPi3U81+IoRCz+QOg4nYDvGXQeLwkjVC3QPlD7tp0ja8UKjbVltpHWy8fXXz7LY/pzM6Sl21KlRr1kia9x+FoOos7v737xi0L13D/VWjjdqZanhByv9pR3A6auNvojecq7d96pm7xIx8c+vZ942U4vkFu+fL94mVc+rkl739O3d94NXmrXfr+1REbNQW539xwlHv3JiTQPcdfRXy1gWgHJHuGEjgAtNF6FvFOHdlDricvJ28iBXuoGynYq1+ihz/VA4ceGEwB03YTuca23Qb9jnMc0NKQQBYKEM3KmCOWiJGimMeb/FkzaCZyeAKTqdzPcgIZmdOqLRrEIA/qLNpOth2zRD1iiXais6GBTRZS8aglxhJxxHbxuAwymDmYm2RarZo0BGUk4WwHRPt4+1Q7KWpvdWGCH0kdXIYpPYNIjChMINIZMV3NRxBlf4ZsfiEBmGcrBD/ajwjNHEZnD5enZtHveNWC/eByhaI8PRElnafQr0o3dJA80VmAsEG20hoQ8KV1uYrVrYzl43FUOqXhCcrd+70KHa+9KqJC9JM6tnEHMbnqQwuWLwmTFpXFEZAAXfisc9PeYMrvKGtU+ngidfVjmJz/rJKxS7+M2wy6uVdvODq5uzyw8OJXL/Jk9Aqld8uzz9qdNf58uzZc5n56BUKmkGg8/ib5c8Faokh0gS/zPVGG74VBqpMNNfjrWqJRIsJEYCQSstGT5FKWsSsFDoQyBVCtNnTIPAAdfMhNwCTCUpNgISuRCYg6pg7WeVomyTrWENqf6OzIZBJSgmyg/Kkmq8NFes0R3PZsj9LoNja73aOtTSiB8gKPx+uI7kViau7x1jZ9H/yRaABNBAX+yBrNteIL4Jq2jvvyU3lI5Pfm9+XJvKm7ZxKcf79reBmfjrRc7p9999jMsWPHZgaYN8r9yNXtPzYxwzRU3zO8OBZwrsYCUUT7zOx7M+XiMb7Da4b3nfEmXqEddYHPkYizmlpYdYpNtPgbQnVqtSwSycgctGBS+AEr3mil6YzMixP6ffDwRheEGVldy6TwzQc31tVlZIZJ4W8f2CgTJEKTIs8DGxPyTOek8PUDGzNyZHIi+I21BmapdCR1ygppFvz3Kj5HxCKA8EkALaeMxnPzrISZCzdj4i+tkGc7Az86LXByFhIEaoSVFH/pFEg++yPRE5Pwxa+e97mUzeujhFvLi2VAzv0DQkByx5vu7+3+dsSrumVz28Q1/ZtSrWc0O7OkMhoa81tKMD0+Nh72/Xrmsk5nKt+8+aodtu+P++rGv7K/YNwnvuahms37Oup7hkSsv+4d6yJPuBLDouKO0UnqZqJEjIDM94ju4y+xGQQjjN3BbmhRNhebx5pJMdkcnG+AJUHEAkxhSc7O5ts6CYZhkD1iWxnrkEDmmTz+DKuUKDMOTx0pi7K1TZ3CIDYwuxEMeSX4dhAGewpeLxvpyQcSCbAzcW/iicRbCep4AhAJICYTQ4AVyzPIzh0HAPQIvaWeZB8g+nb1TeEM66U+0MdPYGDs6WgeaV7dTJ7XcnnLTS0k29rSTDFegUVnucxynYUSzTdZzJQ1OQRKQ4AZApuHdg7BoaGFo7xaQJhzypBaVp5FtqT8Whk3xr8x+xrCGsDIqxC03//GG+bZqTfKGHOk0wh1GFJIARnS6CwCI8fMSCdh44PVER7lPhEJgSoEOelyVV1e0gNwE231UNXrnbuOVzK8MtKkyapW0vHX+bJCtE8nuQbNOi1l8Y/mMvleUuy3t3ODm0og87VsbjiaMvVw9atMcrEsbQ0ogTZyhmZs3TVN15Vu6sh29H29SS83rP7g22sGNQJvj3IIXD4RY82WTk7bxSS0jJc7Bo9NvGqL5TjdxVaF11uwD4NlN0bqkPr5wRlM6SKwidvdbfXtK1zInTPqyH5neFbUpML8Ijj++vE/Cu4S9PFxks1EG9JIBvZcZQt4uhX4Gpuai95ia0tHO0V6i0U3adWSpLWjMU+aWnw5UmkumqHIbPbK25vqSD1LNSP8o2N0UEzqdF651am1ZaysTJOxBpGJsLYWSTIRdVtiXpy/SGGRi1rIIfJL5DdIdHfoibr89cVJ+GPWVJdLuLKFMQicEPfTvQIp2CNzCTpb8VmNSadwaY2DVsBaS1Zo3ewBnkSZ97hfS6VmU6nXEFZArnd1B0t0mU/0U5ya4ds1IpGTBsiQNk8beAWAt9Hmbqafz8/KHEQv6iCzW4A3cPMdKOOoQeCqgEzdHE5FWiKLFpWfb3nmwwSrGFWHOcUGcB6/tCvrcoCsBwR0IODRCe6a8nKLuJDFV0pywcSoVz+FXjmjj7U2gC1gAjxj9ZUS4KXkCH+Ge5Pb/qOnds4+/gVw7dPPgLdm34cC7oOL7GGfL+PcCqihY0NAU9TYtWIfV//rCx2V478eQlr5v74Gbvz2t7lHjh3jdUP0+OvC2xGt1xHb4Chvd9pK27dsh6JhxsAYHTWOlHE4OFw70TUxn1xALR0uL1hFrqI2DG9YcDa5jTp/+LwFnycvpQxj0jEZTNiTj6XsNYkaUDMJIgeSj8UmgZmVhbrs3Y8Z7QanARjw8e7HOh4FZqKFWAXeZ+tbxp93L3mtZex5z+rX1rUQz3tpqWTx6PptZ23yuN3hhnptQ0P9/C20p97dQBX9/Mqa1Ut7NP2xR8kRIkR0kK1sviuZoLu6JVlfyOprCQlbpPOHhuSKu2VSsWS3lNZc3C8dDW7aNEacFSQAHB+TpG6sqXEsKuL4jKi/68Zu442G2qg/YxDfKJHJL1AYurt7evQ/UCqkUolEed/QvJ9ucYoN9IItj5AxgoYNrGPJtvXrFy9e4l5dWrVv1X2rXln19ioBsWrLKrjq7+e8fhRHcEycCOE4NhN5b277veohbPiOzeDxXczsDHKQkCksNvA+0wzCROg0+gH6KhbxJfgc8xrDpzjmoSyoYFo+dzDOGUxUDSXiYcTLzJ+PzZQBM3Nshji5iRh2K+JYy/7RTZPCPyGjOTo6TojP6tdMihQPbuyXDkkVvFkMZZG9RKdDyZBQSrdYJ4W/f2Bji3h82ST52wMbx5fz4SXjIuKsSeFbBzYS6/jDiJGQLY3wn2IRrVLFCHOQh+M46MSFm25wR2haxfvSvKOfRw4/5B3+gN97isePnbcTTQSU4bQmgsqw77zKU+kiCyC3PH+iFQ8B82oLAr44CuENf2AjkmSN3f2d7yhdGqU/7lMVt6bYhaEQ97do9MsbUyMOqUwf8erOHaorJdzAmkzevjMxL61XqaKFUpgdBtr8wJlfCm5sW7Bs9lB3p2dwJdjtb7Ov+NLXzovWCfpWLWc3ZuYPc0fqZm/qihu1sSuXn9kyXJ9LpW4sFAY3X28SS7iZS7YOpLNJ960sWzr7FiMjH2lOrjkrCddtz/XpdVzb4vnQ4/G3D5LfKQ3C2VvVmm/svuob6koONM/x10R7BH2MXy7m5wEIC+4n+DlQ7x8YIIi5PL80YTn+qvBCJMNIUxO9/LiCERhlh43KoBLqGT8DJTSlNVqCLaClIVOoibgDApFYJqfk9e1d3b0NdR2dPb2F3nB4pL9PqYgoBhnVgCpUmj88Eg7OG1owEhgxG/QatUXd0NuL1a1OTmnlvQU5VejtdSsiWoUiEh4ZwWeOqwa0qpGAaiAwMuJWW7RqtWVeaaC/o10kNARDdfUCgdnsVC8YZpQ93TKhZmj+YF9nl1hI6JN6KNLrnbEBQCoHgJK2BCLhgUIDNdIrUbtrMi2EwGFhW1NOKFeo1GIL4/Rk6AGgoiOgcH3kxQhcFwHo0468hQi4PPKTyD8jpDwCOi2jFvh3CxDgDssfqt9VkwK1Tu1Tt6sXqC9TP6h+XS36uxqsUYM3VeAyFVivAjoFOKYAKxWAVvgV8HrFQ4pDCnKPAuyRPy1/SU7eIAdiuUkeknfLF8kFormnVKtGFPJehYN9ADllCx0J5lAZGZVlfCcG8k+2Vroz0LrSWTcxsQx7nkhikCafAyDoB8j4jJVP2h0sPRUDJGAiOD+4yMhUEoUbT99ndmODVPk+scnviuas1SlX4GB3/l1WpXEmeOxFAWSWlNgsCV0Y0vBvZJ8w3q3aMB1Grw7g4ntTTz9SaZDEZs6QFnoMyJoJA5VN4YXLM/JU/tFfLgBRbvKh4KN/fcT7fe67IDf6m6faY7LAJvCecVO0Edyk61K4rDlNCDLejbEsuCkfTfsbwXXcJdzNow9ZL2K5o6OSUZK7eeRh60VFQWCxYe8tyMLN/gUq8II2p3bqe32+Ie+Fd9dPB5MhFe3zLUrtuu6WnbGMRuGb/cOxoQcAjYwfWiNVdT0CObdSTn4c6xFW/WPmDfoPzHv0PxiBSCZmIEVOgrYDOjXyd9tYpd6iUOghADqxSGQw6CfJ9Q/KCUKr1U2S6+5XKsyKSfJKVvyWBVhYtzdj4af4NKE1efUDQkgCEp2+/xWcQBzPzYKuIFh0msCntSKhWIhPPycBkknyiw/YNFq9Fh+Y0gHd98grCCvzHh/xd2IViZy+gR0obCX4b8QvDchpwcnOGZxllJgo80EcSCOilZ72kEhHevg8+MiBUUH5DeDRMzpvAF+98G/9Za79BnjBtybg12anV4/Bv8wKz7sbfA6cuW7ZB12U8+bLuSsQjvsGcJDLBVcRAX4MzYOszsGq9BlLMBSgsgZtzGjMmvMdtbigXWImU1trM5uzu2w2n0QoE4tlCtiBoL8s9l3CB3w+GSHmE/vXSE0ys0FlNGKXUKFQkRnCHHxSplI11NbWPOmaBOnLEhWvEBvE1yqdqyqcua/qnCXQG49h59shseNYwK3N6IoZnJIrEeFtKj6CG4BABPtx1SaAfLrSslvx2ZB1OSV6wGAC/lO7zgWI4eFFP/0JlInNarv4CceGDXqZUuMQPe5cuHJD38DIkksX5MVdbldTsthYO4/lxuAT1A2FolYpNQ08XuA0X9FIZMbBJUtGl+y+etPWHGcBPetC2tquL35+qPdHdXw+KcKN+PIlrMfBld8jWo//nY2abRmiFSiNLbUtMNoCvtV8qBne2Awmm59ufqmZjDWDTc0XNsOvNIOGpiasgF+JxrXRaLy5pcVdmbigIe6KttBCxtQUbdbj8FPIkEKhMmR2eDN50mXJuqEctpGMhQUinUMpijJme4aO6+OwDn+fEz8Ufy8u0McfisNz4t9Ce+RdcfBq/J04/E4cUPFM/No4uTL+WvxYnEzHwZ1R/PlC9CtReH700ej/iZIN8aYoFcnTdAd9Dk3S9PX0GzSpp/00/DENaukueiFNBmjwMP0jGrbQzaSwrZjP6xAGbYNtHYQHiDxyV0ToNhlcStcgkorEBALxU7NT700tKzM/xDEhUxgKVbqFt/KbvMJF+0jdbq2o2f7XUmkz35qIvl5LIX5AqnZq6sjU1JyDv/ukZqUqM0bwmnsCq2oCu38ppOTAh3E+dvROQHscjqNK5wmsEflDfBpQJUA6FegNgpdmz9/UxUXllvXx2ceTw37jU0/JJY5ITRK2xBMLJFR+CEQaLEsd4C9DI6mB4G3Pwadm94JvPLffV4x0gqe5oTWuVp+vxnE+uGcIbFzrMqqNPl+0Xj/AXdsH1IuC9jqfD2bsXeHbnh3ilj8rq/Q3NBEEdR/iqRjSTx5xyBSCJJ9STEMLvR6RR+Jyi91Sp0PmUNjsDrldjrlIInNoZTKHR+wW411G5NGKRB6xR+SWO+wyVoYlfI1UmfmNDMhkBp9bJPJpDRal1aEX0T5PlI2MAbALvAIg2BWFWpdUIiRlYhEpV7j1LqfLSzrcHtJus0ViEWBREkWEWHYSODQqGglbShGwK7I3MhX5WYQai4AI32HwOt/P8DpOUIQbhl+b5VdvEEU82GXKzMxOFV9LzfADurC0T0QIPBXhHGn7cSAGJi1aMSetI14QoXmrC6qdB3mdUIeW0wjdCITZfFaIUSc/j6HGRd3nl2oabn7i7+iFHLbE7JPYLfsnet02Htgh9zPUfEox7J3gzt44tHEvWrgH5lyzf2wa2rQXLeA3ish9oIn3t4kQt174Op0ktESB6CYWESuJX7NNtKHDACnjSiNcVdhWgKSyD0iIEWYEKuiBaLY2DZtUHZTEtti0dNi/0LvUsdC0nHXYhhf7awfS0eHJ428/LLFlht1+dgA31uZUtox+oGMADrij1/uBP+qPjvU06IRCgxCKhHSeXkNvp3fTFH0LAokLEV3ldcTqMVdimnlx+nCqPF1OIbiwrHy4kpaizMzMzRIWOYEnCGPCPP2zufT2fLcfn0h8mk9aN4YxzxgOdql0c5KoJnN5TbVVBDBC2oX7Pmkc6cY3meFm3DzFh3Wgt4EWUuC0YKZ8Du/jWDkSCnFjjNNXaY3Dp4Svj86/fONIr8x3SOfbZV+0bOfFQ6Ozj1xwEzc5sba5ecmtT24eLDV6TFlPYR73u6s0TR33vND5UqplPXSA/YFYd09NLJHq7IiHZjc3jfw61qkpDsSDQ30LwZc+uKuFjTVPdDlEwLFnsK+f21focK+C7osGh7r6wHbuzqff68xlD0wOrPc/dc7sxMPLmVKDQ5cB/ddbWy7zv//HvrqW5vq+7saW1gbYduSsmxXNhwvce9zDZ7rZ2hujTbGV7WreL1dyHeRvBV/E81eANPuL1XbwLRt4mAT9JvAjB8jba3PoVM4QddhrnTq9IerU5XROnZfIaQkiV2u3Jw1RrcFuM0RNJrPdZvcaTVqjEW2bkxar1mKxCm1AaAVWm8lOWfy10ZxTR9CqlJ+Qq2ilwWi2BG3gJzbwHRu40HalDbZZh60rra9ZqfOtV1ghbQAFQ7cB8l/nG64wwGit3WC0WU1msSXszOkIChLuve6fuV9xU6LN7p1u6HZbwvUSiaXSfEPCeguPkgsJfmYExBrVPpryXDTbBJHA6Hh6ujjXjVMuzwFhLMqiC08HxEi2lejFR1XheCrfif70k45lLiAFfLrttAWQc4YeX0dqqqzlAJoc+WPTlUsm1i2sSzsy9cWe5RZz04HDoWv3DrwfuvaaL3g6+65aWNes/+4Gs5v9HATOwV2auraeny2pb4vVOjKj5VXjd4I/IPM+zu2DC7l9YATsWL7g/K7+bN3KphS3Hfwz6q25vmv01yDO5xxCNp9aivRziqhFmrCT+Cv7tQ5GpsxkkujrC+RXyDtJUkICEamkHBTUCYC+uZGtMTU2sv5wppEVyTONjWZB0NmWbIPKNkcblLW1eZSxBjMbrlXaQIC0OXa5LdmgB8oZC2/iiWiCbWLr01ShkHNFM4WGWLgGUMXEYAIqE44EFCW6WxprSblLhIhmIJUum6mkG9e9ontbR+kS5XT6NUNq9g1Dmnl5WXmrIYU1gAH34j6bIrClnUkVZ2bMH+DeupQZR+bzHk2llxj39+JL+SzsWPGiE3ie2Io7H/jodrSqgeUnjzUgwIYJlsayLtQJMgFkXHPIa+HJSy0tWVNnPr3iEmugLzP7aHrEp30KvYA50J8G7+xbdvE8o6qUE9B57lDX/ekSuE3MrQa3UFbu3PV1a/tsZK6YXGvltu10Rn2+WsfZsGPoi0Pb7VGfxbfS7h2yuSPuo9dpLrk9FP6iZdMl2nkOLKddx1cK7hI8TnQQ8wiObQr0A3HRVISigrEAxXlTHhpze3JQnAMhBoSUYFvTZU1wew50lAZzWSKb1qghyBiJGwmYIbIEtrZLQUYLMg6QQOYTSKRSuUzmDSNKWOrnZ7O9DfVut0/m8RhL6s5gMwGaO5ql0uaUEAiFsJnMZM8evHQQpgZbBuGgRWMMrs+BJTmQW5Rel4bpSFKMM7KV04gaqVSqXH75INrlgxFViJoHmRl+cPSz06kEn/ocU+7Z2WfSfMxjKlGuhDuWT/ElT0hbJYwxLbSDE73zuP8dN8hUDlSAkqfaBKpTKUClAUfoyVfCPaq9duh6obOi4g3ATym66qQ6WV6rsZA+jyezwJC0cBqpXnrert4rWhilyzkE5aZBq7ZuS2Hr7hV39s7rKBdWhL8ysvrAtc/0NCicmge42d0TvdE68NtWweOXUUJK50lzw7cM6TyK928UMcIevw/sWe1wqFR+f8a/kVvuiCtsDvsjLzjmZR772/3f/MG6URkpokPTd7/11L6xJmpIj2eGQ0b7PsEGIkLEiRQQ3l9nB7bJ42+yzWJpywK7USxpWeDyBQEQYKXisAftYlGqJh6TxGhhIhmNCdBbInAH7dqgPRK0KxQSrc5ostoksRhmgHbkBto0Mds5NjBqW2ODHUhT2wy2gI202c16RmP3JFJ+nUjoMaaSUYc17qlxm5JJuc1OBiMaRgAlcosCiIjiQS51kH8XDyJCImrNYrodrawOHwSJI8++eFCVxpRjiCd3CyJzbdyKgyocpMq8/OzuiIifSK1ylPnQRuW6F/kZ4soIJfPhf65KBKurEsGKBDiPh8qnMQzG4suLMZCiynEJBffN/uHy4ODszCL317kFC0ypYu+hP3RwPwdDgPYAAJZyh9ree34g4cmPz56z8xKwto2b7PAJ+6Jjjz47GOiR+nxKY+Lae4duG4KrZ29Cq0e3hIo0fAUkuJ+/e9ttlTimVykfolUXwlThbPtl7XB3E+hqvsn+iB1eaQeIdDe5wZVusMi9zg3r3MDntlsoU2gSeNj6RkauUJwDwCWdgOrUdno7yetawCUtYKIFdLQAqkXb4m0hLy6CLUVQbEHXCBp7MjWplMljFeDfO02IEB57p7uY8nla3G5xLFjI5dIFUhzUqdVKHZLGqXSCmal8Y1dm9tkp5gj+xqHeU0gup6eZgyps+uZeKXxo5uShl6f49hsXfRIW8cEvfCIgXq4QATCAQjTInYwdE3pUaSyXVfuHyFLxVCjf7B1+/cSCvk33bRm1+nzSVPydvrvP/5x/4bVaS/EObgQ2rA3093Us++a6UY3Pp8ronu+7beuO9KrvKmWdtzjAM+CfRtXImeua8tuX7uFG+/tXbbhzYdeQTpdaMtTk7RhY2lC7bXwPuHtgYHzVvuWlIbmkdlTF450epEeVSI+6kVRdwnZtC18WhlRYG4aX+sA2HzjPerkVmvAElSBEA6XAY1croQMmEJSAQYRr3ITFHAs2iL22oNmk1OvVKiVJuD32STKBp9vAim96JvVMqjiNNB5z8JmZFKpihG0PpdKVEQa8O8hHFFR0GRToPNkT8QT5bFqnPxFS4EOVl8sDFcWHgOgFyge5p1huPx8zsPe77KUX8UEDDsdW7jH5xc/umP0zx20qziwETdzjpp0XVsMDFgiHh4WsfhmXBheI39eDs77N/Zn6nYn74Iaj3CV7swQf3/EO+UPqScJH9LMahRwCymvyegNmj9fpsNko0yTy6VQeF7IIhBPZUKtEIYlqpERx9pkiUuzPpFKJNNbpOGh9Bnu96dlUJb1vtRUeVkLaSH5wUiVFNTK5eVU6C59/8UVa67G7mlQBdbqhzZ1rCyjvuf2aa26/h3qSe75j9h5nPmgMBWt6akzBtkVJuPaDA+RAx+96uOd/V8l7Jz3+AHkEyd0YsYE4m9gFfKx5TzcYs02Mw/HFvk3lTbs2gfFN45vWBEu9C7C0eIJNbHNzLBhMXaKUO+RQnriweCG8UJTcBXbpBck1YM2aXnzd2tQgC+IIwUAlnsW21LG1dEkJDpdWlmBLCVAlUNqQX7PCMrHZ5nBYzlOr9RZLbNfWjWt9G4JXxMB5MVCObYrBvhhojIEE8opjINaxlAblxSIBHBN1BPPFYkc9qM+TkyB1GWKbMi+i6XQlk4h6TvBm+OhdPvkOYiCcQhHHc6oq5ysd0WXEYikMmI5sTR1FLhTfWJVOHOGH8alOjqtM8V94SEtZ4Mkic4g4L05WR4sBA05ZZ8BT0kBbddBYYO5s1diqPHFybiCZwU7iUYFCdA9aGMjgwzjrj4EfSSTUNQGfP1DtXUFq+NWO4PxQm7cpZlI5YzZX2CiW2b1B3aC6o9kR0Itjmeyic1pKezexLZv2Dqw/P2cyuyQ+H1VYsXtebKQtlFp8Qc/wtZuKwa7VjZ09CztYhd2iF4bmB98sxnKRIW4BsvImg83VkevrhxLJGTvkgXRzyJ4NGmweh9ptYVaudKab7AO2Uq443JC0uuetvWxk8NJlmazJkeAipavWN9rz/fHa0R7W6eseu2hR/ar5rG7rmAq+cpZcY5TsFwuhc+vW5qeg8gazVmWL+PLt2krMQx4x4d0IVwsJKeFj1RKKdhMiSNAgTErDYkggA1mcPTqLzODRg8wsTiTBT5GAB7zhpj6GC1DncL7ZVdQ55BV33/3BNuqWu+/GMrmKIMgD6L5u4stsp8htFAfFMCheKN4hnhQ/LRaIxWqb3U4At9ABHLBBV6sGarXEa7VYtBrNqBDQwpywQ0jmhb8U/l74NyEldEuEkkly6YMJKZBCNdq63611mPHaCsX8Qx7EJvtomddYyDtKY45L8xyG5HkCh5OjXQTjJmb4QaoKUgg8IJtqorKuvCtORkDeJXQhDiAPNJxPdm27YQgWX559NrVm+QLWx8UbwOWKhqFV+asaSFUD93KxpKJMY+3njzdLZw/ApjGpKVIcKYylB3PWsbHQxsr83SZUB++gOmgnXmLP7c6CDZnzM3BRBlxGgssg2B0Fe0LgafVLavhLJXhaAbSBoCaoCofUoVAwyESiyqg8HlPEYtFouKGBIPJM3pkn83mmU6FUqoVCjZWxxyOBsFurkjPFYiwaDGnUoahCGY2mrFaHxQZTQaFFgOpmZqY4gxNaJF6eZo4iseKH1QGc6WcWyeYzzDPPpBJ87eDKmsZtxkghXribqsBXjF1O2Z0bYVKBswCPrJ1zRKrtP9lTG/tw054N+HQCHVr46ODKsNvK7FEU+U587bfPnT2aHvEaMFaSS+3RZBK21yRjfikFlNw7eBkbHty5KOGP+aMei9+sFEPwyNg3zmn15d1bwTPNQ80ltHxnndPCGH0+o75eU9qwZGhJCS2z765aEFt48XBNfTzpC+bsqSLbVMnZgWMCo4IvEiyxkFhB1LL2oHBhNNQhjrXSopYwemcUQ4tsy4ygrlDIEDihMaqg4pGX+XxIOFLbUEinkzUCZBIaETflm8j8qUNXXdVRx8KAwBMQau18dnC+eUZBkmmDL43UFaoG0u1xoat0ZGUgsk4LXx+4ZnPr+ef8FdA0jUDEYFwXbU/mWv0K8HL5ps2Nto5tC9u4J0LNKxzZztJwqO4MX8RjMyW02dbhR0KdoD5U8CRtMmehf/GKFLcEYcNGxpV0WkOOyFk/udnCXhYd7O8P+9pXFMOLuhMtK7Ym/YMXjGRWDLOaW2+9Nb1w56KcQ2JUqHSKrrwx7tHDv91xxx6xK1pjDGbdKqE929ifAT+31ydsPuvKiu39s2ALtZnwEBZWZjELJVaTEMmjSsQntS7yuaSSNa5MnAqohCoFQguZJiqfzevsAh31kMJVGNkxeMfgjpGCS/GIJjl/14Htd2w/sGt+UtNz9/679q43fvBSidxhXL/3rv1396z5xQ/3X7Vcc2bpcc3yq/b/8BdrkP5yI2IeQTIWJeqJxQcsFs0kGWND6TTZ6LWZYm6fHAhoSMbooCmKIA8kTaZaj9/iFdXXBmUWBcTCgRzxarKrmRSD1UclFxaSjWf4OAM8Bk1TjVWpBqhUqRsB/Njc01tBNaeMLBe6b7rpJkugXwp+PPbAFcNtF9yz/gvgNq5s9fdnZn8nXeDXTi2dt33Q72hb12NuDoKx7ge6wcPYsXYvuGbzoi8uTz/QvXmXA/vZzrM2g474wJpC81mjaTE/9uAW5F/tFtxONBBp1hh0JhINyVjIHzEaGJVJr1ZqIdUAZZVpNtDr2eqYmoox5lMo5F2VkcJ8jD6iCca5aKU3IPso5McXYKLxI0eEKsS62HLiYUyCHfn3N+cBOVhcuGrRt8+JZ8pev9ddTkXPvHFE9mRmXUkmK7u9AU9ZJhvaUmi/cOG8M2644QZ/3dCfrrvs9TuTGmlHdiNJ5rPnSdWxa6dWbtz5i+tDtIAzZWBGIOCIDLQI6OCXnr3g6uev8PDj7RBGPc5Qb9D1RIZoJeYTRdahbutoZdl52bzLbbcjilpdovnzAJ3JpGssIjy7SHoGGwCGL/1MZasyz1shWQN0eJQMAqt8cfiUf/rKyBL0RpAAERZnSDgRzIZpniXn0mhUBqdl8S6WYt5VgIplxph+jcbNXFcavODcL3YuZ5s39164xnftGu789LAfOab9aXAZOGvrg2NjkciTe4ujlr6JL3f5Cn7t8hXfWz1A178FwDv/JGnKu3TJ9tW3BuwtSz6/eunSiE187O3/y9t3AEZVZf2/+968aZlML5neZ5IpmZaZyaTNpFdIJQ2SUEILofcmRYqIgAURsaGioiK9REFFF1lbFBXrim1tq8Zld9X9lMzjf++bSQAFd7/9vu9PyMybl8nk3nPPPe2e8zvnz1tD5jlE73KTy/rXX+zq+saFtZWVTQxyDF8v9BdU2Bc2NclRLgR1K/EEmM38VsjifUYB0EHbmFkXX2QuhDYmQlMdCeVdXUxcm5HR7C5obTZXVZbVmLOzDeY+0BYTFJB6UpeiFqQRAgEh5sB7Bwgo+35APQ8QQl80Gv3cDy/PJjpeDoP2XWozcEXTDyT0CGDmDP88nADsQNVJ8Gs48VMH4B363TJ0j2DRaMWQvMyF6ge65+17ft2k1VZjLXd807jlE3KnZb41aG4lPhxcHu2IVoy+84vCAl8YAKtaY16zsG2KhTByFb6mEVYnmFJTE3VGOgC5busLjzz4cm9EYzl087TVR0qnMUb/0kE+GN/pi42ra1ncpJg4MqhOZbM5XKPJbor1BusmfeOaneJzzPaD2U5Dgz9YUYMN07Kc7hXqw8ZiPVhHTDwuN3dKtK5nSnDM6NbOYFWVP4hoKaojzeJ0HsPAcWqZWqbM54R3jxnUspSh9qGn+n9IoIbQUA1XJSxqbCEZrgQaLgT6VR0QPgwtErb+p5QmN9M0/UipbS0LFPlLp995U3vubJ6Yo1SK59X6iyvfK503xtqdykvlXOj7N+lOTqOJ3PrNjLpsozPfFKxaMmaeTvrTuLl5rkD5tJbCUXM0XHHFf3MNCKwG6m4+2YPpoA/sx7wHLLI+1kBMysF0fq+LzxDqJBJCyCH0agL6s69GoggyJoIC59DNQ4fbTIbZgImEGJ1uNZT+bsLhHbqOyiISisPMxBsACg9AgccfT/3tJPUptRncCFzlN1c5RPkS6LlOo3Z9cBGoPtn86jQqGn//7InvqVdAB0i1g90Gr0BaHQT5Rx8G64AFhMHDFou0k4LWH/UI9QfqY6p/2T3UMy68HuhBt11FLaP+Tn1D3c4YNLPyuhPzHH/xU9Y3kNeMdHduzwnMS9gxCxYi7DGhgxDw4bYSG8l0JZEiRnga0YEEOwWiA2eRjSuh+QZLTkuRmHWW2BJITDsUvlanWtYevb7gy/s/pCig+HzNy4v1k6jzx6k3qR1HQfTpqlvKHWKDg3shdnjlisOHVq46FB9Y3THm+tUdHavJaVTg9aPUXuoZ6hzVP3u39MhucAvQvwKajlss8iwHVXP48IqVhw+vHH399WM6Vq/uSPggTXBjHYY63IeFsMKYwG4zwq8Mv1nJ5xMyaOt/FuNI8JCFneE2EyiNzoejsN1A/DRUZkndHQjQU6d7RRPJEs8E8jkqC0S14ZDR6bpAOuQqok0xyPm5AK04UyRVMA7PH9zZUSu768C+exS1o/GJE8eYVfW4XWhMM0VWz5uonXSz17Xwxnuz46lbt4LZ1BarpWYm13Du9nu+M0+vNlutxsqZLFuY+u6gJp4jWCPdYWQujtx0G76+hvr+yxHDsmMBXE8DXEQfFgNcOo9UpjDK7c3Zk7MZmAHagylGC+kvsyIRkpJT5vIaVhpuNhCG4wD1yxPg7xziaFYRSJRIyziuFA4ZOkFoMA8RwvIJTSwVSxem4+lLi3ghw2S6wW5KWkymzkpbxVxaaDyB2AcfiZkgA3HNXjMwFxVazOY++JJjMkpNJmNTe5pzfSaKcII05KN7Bn4YEP404IwPfI5ya+IDGEq0jNP5mB3oAmVcisSJuoMjZpeRQ2j62JzDvQSHI+1jfXy4l0NY/X2sTw/3Wl2uHHhxsNeVgnIghaec9AOKpaKygV9rEGQ+XRarowVhoklY4n2K4Z/SwTp8kfrBCfP2PbceKQpbBjvoqXbnj8htrczNsOMf06KteOPJtru71j99fEnMWVAfrq/oqg0Se9bf9sIjD7yCNIO9MzO7csmtneV+82hwmJZc7S/d0fH02Ffuuu1Tv7toa9/06sW3HptaQe9NtJYXkjq1GCs+VuDIdRcFi0No3cRuu82S4U65TJfC2wfFHASG+PmwJj177rRf+EOyIv73lSgHKVHae6ITcBLvFGUhuySQLLlEeZ3BK8gwMnVsUl8mKQDuI70KbcprptaOrIrJmfncvxV5DQ3Z7sLLyZBUkEkKlFBjXdtSVaNuGeubcS/wxxwaKqsrPyMC1ualAw20QZsvfkq8C2WxB3XCE9nT0xUpeo1RQWBkZgqNDBVBbbLp5u4Iemp4foykmhqCJ0rks0IxTAdcZMmZEwvXBu3hBmqw74/U/bdu2HLm4YlvCHPEZnOE+uucdU+cefrkjhWvv+QYZw/Xx2a8+fbD614wuA/PvekPxYXUQhC4ceayQ6D4wA03PJbI8ciHeoMLx+rD7DGJzWG26PWsVKVEk8rxYu501Ph44J1+NGQ03FNxVNNKkzYUSKgLk+USYjySJRgN3GQWQUWcC7jAbCDMkt3SPI5Oettm4AYbqE3UZxeoZ0dFsosby4OvL/0TUJHn57TgFgveMud74eAr1K5pej3Z08lNKafaqJepD6klP11fOTnfndcu7hwHMoC5ZhZ4eVYNVBFuail4FekEDGP+AueA+mTEsLwYR6s0GywWV34ESsYjaeYc3OFGMtLF5h+H2x3HpIT9AOr9AnVClD5zRKccp9HkriX+raJktAzxF0pCTjo3QygFyBimdQv+0m9VAPHiP5vqUq3Whq5/ike5fPGnvI58SZq40e0l/pZqNi28nTj2Kx3wSvzb6plUcEoz1dxc7bBalWmGJURvS5XDSr1zHZwucbGf6mZ48HuhvnfAtRMd8zrtRgYpIzHaDUcKnTVs9oTCiVlhdGmiDMCJYGhWOEp4wII0+FfAz/D0fzz37/c1jP3oQn7KmvGVU0H74UWO8EfUXUceVVM77crg/tsMo0E+deLYEzVLAf/bipefyHN3Lsrr1vb0NPUB/+QmfvyBkScB0/cidT5kB4unxLd7Z2cX0PrMc/F79k6yAevGejH+4Yk9hJnA6NpuOFQxlmjvSCZGRJ/mDUs1CZwH4zIhkDTO4JxYNpTgIb7UAQ6FKQXAPtSqi/4sLCxXQGc3ZA2J0Y8xsuIQ2Dc/UkG9Rp29bllu3tv3cDiiQ1+NaZiz/Mn5D1GvPXbjvklFvqrCG65vWPPywsoLEuLTnZK9jdOOZVrD+VaVf+GT+pe21Hhy6ySivSBQKuG2rxsxHmz6W9zXRP2IPwYKQE9lzk3U973fUnuzAivXsCSpDyxbWXUzMPh+eHLH5mkNM6NeZ0yekVl27AL/YYV4e64WFMztnORPd8yxiuXzn9K/1RN2mlaqZJOB2MeSjKbi1DnZdVNBqCKbejmxZzsvvstaS27DKrBwTIkDrCIfzrQIfgnS8/U6rUatEqSwBZjn3GnhKTrU7OlPWgL9wtOJllosO1N2eV06lJxGRFtIPpY9rIDOegI7AKGLo67Udrq2HhE5YS8b4XJEAWvtw9ePTNdpKphP1m1bVLcw/oO/qeuT20qU39wWdGjMM6pat4yelL+bU7W7tfXQddeva8Z5k+c+z/h4/O7MrwbfmLpoXePK1ZtbcNa2scdn5m+526nZukOZfcME8POhRxtX1OR11c+O3j7ZmB6KbV9VGutb0HV86V9uOXAqbwrc83bo5++E9lGA9n0Lj+bV1DjsGuVx4jNMhRmh6QutZkG6Ci9ubAyk4kK0/YEABWDo4Lso0XZ1QJh85fOiPD1UCWD8DbpH0lCCP7n8FXoXihOI4P4y69ANJsv4q9fkzvgz0HqKb5DVjok/O6ZWBp/xQviML5TVduBFHehOx2NOmcz5vVOmscSPOqVS5wB6QIYUFJYLZ9ZYrOiaKBm6oraA2UPXgyfgFUM7roOIjRun1Y4bN3hyzkj1Fa87xmlpnrFf/Ip4jNwEpYUxJkxPIfSsNLVCIVRhQjbyCKJR+oAhSm/IIYcpsWME0MygkfFYQWsAKMRJaU9v1TDxWM49uTbvHm8T9cdI3u0g6myWpYMyKfUNY+8bzf6YcZPaPb6/a73P6sFHWgNUx5GnGK07+GG2PTxYxQDkgbJA7nVUOlu//rIxIl0k86QQNpZaZ5SKTKRKJdRePlDFtUcKuXd4sIRVQRL/YsDyPbw/libGPB6wedS5h645cOKVooya7+Ro7NSR7ozZ8VeunAAt54RUN3MPmQvnEIFyzh+W+qTDco6P46wrmg1hdDNWzMoGYbOJgSW8Tiiv0JyEmBWgW3CLMvfMW3Hdd7UTel975L4HO1uoA1Ru6zSwALSBMsA5Y36J6qS+D3vd+ULCVTy6F9+JY4Nq6n3q+dmrPyKFiq5T8bvv4E0fOe0Jvlu+pju3nhM/2l60EwAvPhm0zP+GenCpN6yUC5TXTwcEuBm/MMFH/bi0+buErAlefJcYhLrVC/mG71JZLRauyiPgp/JSuDRCPjrCQiEkcQJcUiYVw/kJgBWuA4kmifzwsO1SmwKWnT6Hgt+WgIH4tLHi6A03fUjdWqN9Hayvnnq0fVrXXS/+tLc3MJaTYdzTBBjfAy6JVy6bMprqHzv9ZNuN9+Yodu92bb+5A1inlV3fYGxwOtt6S3NiuUa5XpG1dFnR4n1JP/E88wRZh+VgRVgN5oyl2SOc3ECMSbirNamqlGJLKTPNpElL09AN6tFBOXKZFJerIxaOCviT2oQGR7usKjc8rFGlqDw3sXbWEIZ4DwfDZirhOQFW7aoeR7Wemfn2yonlJ06wmbzHvhw37pF9+3u3L5x008Njmo33fwbuieeM49aVfUW9sKtHB7K+AbqayV/EN6/fUTxyVt1duBpsB/dMLb2X6q6mPlhXM2UHjyW5Y07TmPq8SFndlPfevPUlEFQKZSLq6Bu9q/KngDuuq6PeHVxf4TBZQgm+7L74ObEc2uY6zA54tI9l5RIcLtugIpTcNMNG0QYpm6NUKjekEFpdigZqFb0GT9Hp+kBRjI/ppZgW06c8AS0zBNBVFOPqdKREINaL0blTSkwtKFOkWspIQhfClmmM2wVsPdvD7mLfxybZfQTnoHi7pA88f1Rj1+tTUnh94G8xmRbXAK0W0wBMY9B4NTHNzRpS8zTIwNKJMJGNpYHutQjKeHYSyTj5NPBDx4Dwh8/pLmfxjrwhrJCB9c5MOvs6kcWHCr5T9FqdGOhTWKRC0Mf68nCvgkNa+lh/PthLEonibWgnoQIz6CUMGbBDGjFZIWbLByy4AxIWYPezDy0e3XPdS53Vpcu95vTxVb2tG/Vpj4BiIKqN5NSC6HPgkz+e6mkb/8NnVN+2ubNuvb+1ZGx9/rYJu8Aq4N7XOGbmToyu1f+c/Du5GcqHAiwWE1vVHnMaz+vFnQ6jwWXCRFLk2qdI/MEUNqcAy8VRP2Ho0Qf6/Z4B+ikZqx6g1Xhi4BhdzmZEo08AaaGz+ASQkTUgMl66khlFl6rcmCxi3todm96kPj5W91AztScymoq2u7ffQRgNqnQRELlBI2nWaRx8IHEDM3UuMD0y+p57ul2dZfhPT/7tja+oj3JyiLODD87It1gqJhAdDWPdQvMs6nx3Bv3UMDjJH3jx2f1P20sQ9tFXF/9Con7XqHOV66ARS0Pz5FmsGpadZJqUeCpS0YcEbATcjGzyAFydxBxpdQv98isUM62JQSCpkkEQmOUKci9UrdbBxQyoZqkgVK6Fc9vAbKKclNWNAa9QXw/u2RXKJO1Qb164n9E4+OKwbt3WkGu98DNBoBsXdA8wFJpsOjYhvPgpawzZjmVCKYIqmYvpfbOxAusreSH6cgmjUn6kAHWEMME1kMtl7u2ZcpCpzi3weGIFwWBZaWl5BVsq41itaqNRzREKmTwek4ll4jJcUlZe7i+tqMguumWlH3j9MT/u9+ffsj/7fDa+MhtkZws5Bg7O4QBcKtmL4QDHFXqdR4frdJlut1yRkb7Xq4gpcIWnA20Mvwf+R6l4yVcdfnSiSx/rotoX+luMABMCHvogM5p4zEM34H/4TrSJIsKB9WRmsoaB3kNHZECuznTTVZuZeDDWxzp3sNeT28f66Fhv0BP0MCtK+9jMg71qax9bd7S3gq3mMIV9bMPBXmZii0WdTtrwdNJACRE/3G7QZc+61Es3AYIAV1ckveTpJwIYaGntQXBZIwpFAgQB6hS6LOIi+C/96nE1zbmZLqdfZtO747eHVo9orM13pfuzZVaVZlQDef3C07vnrDp+5+KF02pndlI78Ob4Y2TN4Exw6K3HZ9T40vPV+hGbBjmMxvi8Dx6orvE4g2pd9z78yVklZmCluh+6e+Ojz25avN+z//ovHpoDwOBfZyG+KIU+8xkoSxGmTS5WjuXGTKVeXzTbYrdhPqEPx7KF2YZswpdts2X7CEKdQkgIOhjZL6bbEnZ00OFsYT9qTIxD58YCtSSKQTLEMoaYEfBboD2Do57HuAxIh87RQsnghnEYQSJ4WckqeeYEtbevj9p34lnQdPAQaHr2l0OPg6zdu0Hw8b3Uy7sepF7ei5dZwiZqgcHrsmQbwIQTd920xVCZYcqSFI0b32wMgO+pvcePg4a+J8GoY8eox5/cTb26Zw/8jEdBePdu6qVHqZ8qI0ajpxHXVYeNm8f3rONwrCzm5IaWOTxax4ynysi7GUZo+ZRgaTFeMJbjtWAGJuHgIF8P+aUIEgGzDAutX/t04oRgwq5AZUbmXVjBEEmJobcFs8AWaPrkrpt7G7XisbHX1eXoHf4JY8KNfatGRVuPU69Or43dPLFzdX1L7j++VlOP1fSkjy2LVIDpoPX0gyv/QS2e1VQzxaHXRThZGaW7wIi1dVPnUOc37XqldN3xjb3tj1536/j7QdFNGa9Q59qoD+6bVdg6ozG2KHHWAf0Ohg/KMRVmw4JYDMs6GOSLkHchVGf3sQaOsljQUDUWHGcNQLGhIj47gKHzVP93EWS3DkSEtEyTGP2MBP//xtsA9IIaaQIA2p8Ydickw/EIlh3P+AgQZ99s3Xi5azH+6EufUxce23Md9UenNONd5Ee8O35s55o7V5aXkDXv7rrjIz214QqPIt761PY1bwr7ti8/HN8C/QXijYiMdhug+4DfIt23YPUBSaLOpIbqIZdCO1AMDYF0LAvLw5zHcsNCBsMi8cF5HwuKsQhHp3TC6wNcFFqJRKLQ+YTTpW0qm8UDbDg0ao0GqOMwlpgE0FYSYna5WCQETHRPgc4YMNyMDh3EAb9YRNAlHXY5OXcf9chdz7z7V7AQGIARLKT+65sngY/KOAxw6vXvTvTH3/qWeh3gh6lzr+EnPz771sefvPnWJ/Z75tRnmvJOUD2cVfO2NYKO/wIZ4C5qIvXu36jry6j9ErDNCcb9CE3e1Qo7tZv6M8Vl3KqgrqPiP1L3OTeCn6CX20odAKOox6kPqD9Ru8AYYB2UN73NZh6FdvEtF79g3U2WYL2Y8IjVHZgYSKNZnLbzE4Yu5Gva5bCgYIYAXPJU7KhOBYq5hA/A5OJXC29Al8A27BMgGyQYvrRpXIA2QeUyJvOZSYu+fae9UpcL0qTiEVuKbgpXdz0sUXXFAs4ND4R9C05u+Y56/+hdT/ZU+woL1q1ru+UN4ALS08s3fUFVUf+sy1sH0pkWLUU9M3XFU6AWLFyw+KlYkG0mMfstVQv73Q0LaqgLOv33fFF0Xih7bH0jyIqoUp12reK/lnjHSjOoNykr9cbNm2c1zSv2uAo16Y6yH/FGkDFF+wT19+WxejBzE9fI5YVazlH/mNq87B+HajNUTImURcuLzovvkr+Qy6EEbcBCMRWngp3PENQFR2b70+12gdZfjgGpBPKHIOlpnEpEMjwB4Tv9NPYGOrDPRMCVNjvr341e0FgCaIVIFMdg0S4XsCT3lVxG/vJdYyySfSpQNz4RyAg4teYZVW2bE4GMI9XjDs1fusV76+nIE23UL7EGHGWmx7uAc+P0zllblRsO5q1Ye6aixzWyasKTvdFkTCN0w8RfxTQygrGHlxSUPT1tTE9Rr3PcjQUnF6c/NWa/tzqcgWPzN44dN6u1pR7tOxTn6IHyxoA5aSukGgsfshcFaDNRIDPmVmkIgivDq3MM7BQ6yMEdDnIgiRMI9COZ82oERTh+ZUMlbKeE5YvpgCLZBhTSRvhryTMseBCCGdMMyB5qGxW4QvjUfDNw8F6gGH3TnMEvP/jnJ+/ffDvlG5ZC7hNv7ViSuYQI9iyj3vPlgEP4YmrjlbGNV25ffcRELV06iY0vZx7fsPao9PG11A/xkb+WSrfftXn5A+ILEf5e8AA3vgfx0RCNglgUqz7gcSHaiNzuYCjdbw/aeTjg82X5enj3qAEPSjhMOTI1AVtG5+MkSDXQn6j0RfleEXTQPOBHFLOjIKKMBmz8HeLR4REUGGKyUH76JZ3cQ1GPjfD8V3ByK3XHRlF5U/ytK4glbS8HwexZy1/MqBgsSJLomUal22ol2rrBVmrjlHrbbyj09hSdz2ot3faeW5WkRUIvUdvJHuYGKJvRiWEeVh+T+n2Z2WELHomkhDKccrVGo1PKEBHkeF46SfDg5bEUDpvNBCmIEKcCiYxfRIxAMkuETg5JJK/S/ENAB8NM2CVX0kARtobJZGCD5iM6OSbgjyK62Ak7KpOmGWbK+vSuO8Zmd1C3DJGhvCSD8glxMvumDUnmiS8ubMhc4s4tib5R9z57Ixf3UWypldouBK2XKMG9fWl4wyv2I9OHWIZx1C6Ov5wiLH1pZX38SR61cbEG1dfgEpae7ISaugUri4mqskZ6GOWuDHu9WAYILcNKu1q4DS8vLgqr+ClatH+kqRrMc+oUIsTZU6f60VZC4MXwkpY3HBwtMwqdKpKuFkDGa8JGS1qt5qB9GIUEiR9kyHhw2/C5CM0flku9T8LE90AEOEBRY7ZUU3OqXVS/gXrV6bdQr1XZxenhhyyMue1Z5Q8+VbF5Fj+ozHTw2QIRw2JJnTUxOoJ6d/a6SeFZhEDKJGvip/A8q38U5Wp0wZ9nNoHv4jPwDZSuzWGxuJvBmyPtUquY+kv3wpCnsr1n5sgxa0gWX8AQaYB09uT8SOuWFV2tyzLFGozAdLiVswDuKQVWhHVh5bHU9oxUrVJvtWJlvhQ+Olcp9aY21OYiGnJxeRpLXBfNQ7aO/1XELv3+71D2JL270MHRudPCV2nDR2FOQGvS9ENMRJNl+HglE+WPJY+gAzR6ZwKeJYHSiewj1hW2cDIYi34BQcTg78lN3FETqq2l1I1FppquOoGJMe7BkjCkBleSmfWgILC0paHIWhrv0Kqy2LpsLf4gxybKbmSkl8bbdH6LEZrUD8ayJLmF7vbqmIGseamiNP50nY+wWJiuerwkOnIT9b43n/oqYlD8PWB3jX/ZogpmgPNlPsuBUm/8/J8sWaVgoDhksShtFZRmJF9VWpKIo0nh/twP96cZ88UEaUolX8PkqOUkaRRiqWgnmvg4m8Wiiw08gYQARzEp+CLRtAUVH9olBPKJjHTjcoUawG1HSOhNFjSS+7N6wpTPuv909rtvj2i4AXeOD5pv/yO9u75+DISzbwYPkHaiYd2F28H2uF5IWMHAwYPQN+X6rK5a6mH8C7ilBu+lFuCDa9zNQiuSKQr48DDkASEmxdRQA1ljIhlXTJIcLq4hcAmPJ6STDgIilGgQ7aefE7kGwGiiq52BEbG3GQQkcDOECwAIhPmA8XDswgFiFjV1/0KJXUt8N7gAL5i/orBq+eD9K65bx+YoivE902SGGJhE7bAyvlh6B2j65ac5B4ldF7IZn3YQqWbbBeHCrFCCrkaqjPDSOdXBmCpNoZIa9HzM6OWl8vjwiyMVcFkA7lpokJ6iY8boFASKOeHQCTMHDhWSF4lv6FWCIcfDHqaNbSGaCsBAC/X3rjwPmY5/RO0HddQjW55968CW103a7mOb7qGuB/XUo0QdOCprrYbWUK2VKkn7cNepf5zZzf9m/50gYAF7E2PNg37jUTjWdCwjlgLSbGqmWC02kJI+8MuRdCVu4NFOYiDuT/Z/pTGPEdMbFXJoCNK2c5Y4miCuyEgwEoYy9BXthJE8amXUNFLfE/cCFnUbNFn/TG379CSX+qYjiltxr4qiqEcPf9+zTYJ7GZLy7GID9dG5H6mHQTl28XVgzC4ui4AI9WY9NY8apAaA+cuHgCAMMulxR6i5pJ1cgWVj9pgI0xkNZo1aqSQzsnhcgZTEPOfOnjudMMzQ1qdNYOiuoeB2AnqJLkAIGETCJNb+EHWzkhCIrIQsZMiExEZwN3WAem/LcXdoRLnEbDpav7J7YTsIrLxha74xfcGUTHXjhDmbD9694y9ijTZ+6mNgxjs7qeUfUGfmzd86/ejY98aBhwH7p23CmRnOVsWKQzuePffcWm8Ov8Z253t/fYSi6PlYLv4Z9xB7MRkmPgb5JEUmQWG2c6ej/UmwcNrsoRMLSLOIVuUWyRM5TWZVpiadT33nMrlLpPgrf85rmEsd2d0gsMzC32wtXnsFDkcu5jrKdynC8LeRzg1acCmLoUAahikfstCS2xwRjIOqHZMo+Db7tU6YZWZa3KFU2oT0QyYv3g1+WLq3Jb40JyDNolyiJjfCiEAnzPASAUQEmlKmnn3N4deDv7fcW30IP08JlrYxrVZ7mtIWAK9T1Y0jnENHzPSltztMjet+7u2Qwmy14pNqjgzVLTJ3Qd51YmG412RZZTGr/qRD7xQKFbi+LJNQJgyrg2zF8PySsAoRlfBDFQIRg6ZSYprI0kxW+yUVAULHHW7LlIKLL2MQ4p7WXPB0ZExT/C/1kfSG+D/GmHLHU6OcYV6gADyX2zKzrm6W8MvvdpcHAuXom7x3cuqF99c3kFYrI9Po6vrDO7V2vYdltbIlPO9tDHXq5PLaWbNqB524Jf4h8WBFhR/9Hly7dy/+BH26MqwHk8Y4DqtazuBO8HKToQvI1PKkW4fRQAPooIb2zpBLN4Q9IKe9ums4dQWEuACn3brEL2JRMOzToahIwqVj4Tue2vcS9eLBjdGb5KwjVm3L19UFRp9DJShnTFsWnPaHlf3Uo09vOzwl5i+OrlnRVH/T3LmODbvvvV86Ye9n1KS/V2bNBKV8M5P6+bkJswAABwb+cFtFJNVIYs2bpj5VMPPO3dQ3G4OzZ3LS1s83pYO8h6Y5JVaJXATCX/eON5qh3KinTvfd1FO7MOZ1x9KcmZXF686MAODbOzoE5p0Xl+WVg6pzeFr2P6hPu9vXA8meLF2qRCCE9JsO/TkGeRsWQHIiXZEiFYtEPIGTgwUMeh+BzqP9p6EHdxaduCaQ+YfSDsUoM4FORaMPv+zJg6TEYRHk9nDCnBLCTwqTjHHUhWPUt9RdH9+2PrarfmpVZY5+3X05TZVKz6fPK9za/mbhqKxZPYD7ORixFVQ9dxDcA0ZB5lr22MtBT5XoGXWGttQ2mdo/9dEndOl5md0ga9HMVaPqv/ontYua/mdow7Rf/IixjFGBiTEl9iAd841lMCoY5UJCmqaUA4xgFghJAPWgRBkVo2btMbhBMI7cKiCsHNLKZIqlEkkMVe/woKaHUgHwPAEPfYKRgKZFTwjU3IMq24cQa2mEvkQAoUN9QImhqEovqSSVAg4Brw/3cjgCOQqv9ApQX8aok665QBh5QDSMHIvRZ1KYxJ7IUAeFKx+jNlVMfP2+AepDYPv2HeBN+Wrlnn2LcQm1afFPzs3rQOzHf4IC6nPqqyqQsXgJ9R6y4S7+F+HBd2JpmBFTxDhCA0eqVuNQiaIAhycijiCbBEsmXSQyl5wgkW4RDpCJnWs2ER7q279MufHBHxdWtVN/Xus2V7T071ZTTK5ozDnnHMCnvpnd2PLXe+sLJz5ZHGqYfTsPf7vZSccFdlz8gewkm7AqrBHjHWokS+msFjqMhI4NL4WEw4rEXx3WJENh5cRhr2X4PpM1vBfhuOF9zIi4Df0cPzEFSHfvOHx9XW7zLvHsssJp8xrXvy7b0O7UTZm26u/9B4CtINh9N1ekkz9xXeME6rnnDlE/gyywKHVEmrIsg/BNuG7diQ3zu7c3580dpWvprVnVUD/rqxtDwYhWrqzRUS/v//TbtdmFH46WmDjMYPYtj42u3E79/M0d9wBSYhWIVDQOwA8sKdkKbcNWjH+4QaEL6YbPjOFsLMMCA0ma8PDs6Ygxil7Q6TKoBheKUab5V+kyeCKeJEmky4itCibOCvhZ0tmPdFIP9aym3j5dHVryF7bU88l94+b8ANYdnwZac7uC8R9CHe4NrPA8TrOgyDvhVeqDO27a113mydesMaxovuvMbQ/sFTGOPH8CpIhrF6E2U8Fn7nzox+5YC8h8Uy7hVW/e/emkurVAdaQiFOef8E2I3tjCk28OcP/81twbpzbOiXotjuxUaaDqY5AmWMQTbWGDbTtk06mtYShHUO5rA20nOWMcFs/MBEBiNSKfAzOb2XT26wEJHVaNDtCO+6n4KZ/XKkp6WMgbuExj0tBKSX1KIPcLP3NFOhZeNpyONSig07GqcFn1TPDKlGbw2HD21eBWlH0FHCj7KlHj8xXnKFmFlWPsA2U2uFxwrXDst+lLGGCyQXK91OjaeFk+Y7IHWwFgA6RNMBYK+8k5R49SJQbdxtntKYJH+yvLR4IaUP4naiU1v8iWU3rX26+9TrVT1VR85eOTy325OTlVN1S2vX4YFwH2VpWgh5qeFgXPgR1/1pB6ihpc1qhv7ajmi3cuntz1CK4Fo7dTBfHHQ2smrAHFwACUe+N/jp/bOLVhbmGWJ8JJSXdUzn4O3wJkraK0eYOT/jgSXw0e3ZSsi6y5+APBxjdiPOgZ8A9L+QRnOIcLG5oumthluWUEe/snkztWgvzn2rtLK2J7N0aWgxSw5vzOxa1bgb+rfvkz1I/hMGhZhmg6/+I3jMnkPKwasx6IOvuI6TFBWE3aShiigJEQi9gYOhvsp48Gz6L4DGlGMBF8AuW8yqROGkOAxmwJJx4DdFCLCKOSV/pVolaABfcIgfAH0QuGyMTQa+PfmvLcqpaJ7a9WeTyLl97R5XQaCL0OvMZRmR1KX5UvTakycDNtPRuZZEaHwWsQFs4d65R72wx4t8jpzVKPWn1H6wKjtDB98eJY94Gyx6fPC7V6Qp2m+D9cU6dOsLNVGXkZugqrzc1VGcdIDCJeYObUMYaOmjUz5oUa0NyjkOdzyKmQ53VPYkJi+jGDCqgUhB2HZDiAIBkgs59FuPUZIGyk6+RQ5NFoQtV14QDyfxWJFjd8uL0ZskGHDf+YLUhhkVw+136YOnCMI9FIDNLJ355tqFepRDqn+rUP0yfMWJAbmdFVKR15l9am18ubPZl1dc8/Ub5+wQQL3avzb4QGrocbMxzEoZtCTD9k0BBM9Ewy0GJ43h6InqX7ipII9pGEHl44WWZs8wC6VgoRPlmjQddVoJXCv9ceEO+invUs3pXpyWawUliaSd1an9SO2+1Gwbj2h0n4b2qvADxGzRR9yC4Phd7cYKopzxXkifgMrcId0+dn1nHYwp2Gjmi0Uz/r8IklYxANGy5+SvRDGjqwtAM6YR8iYhpIkxE030DiIZax08VKdA102EibcQF5wOgfKnRC9ijd03GRxMDEcQAshW2h+K5nrTZIO0A1G4xZfpeDyWKx9FpPbWydsao0Ihx1+4qpjruslRnNBkPDdJOhsnyic2VL6yrne4l944AP68kZ0J7QYeKjWoVIzOSwMYSLkuhNKZIqzAkzGKehaIOY7FJ1Ci7nAeWI+IPOCE8wDpztqaiYMqmqmtgQL58l0DE8HlytmwT+UtHI9IAl5VWTJlVV9NDYMpiQVUIWYhJMD60xOcZKWaEEf1UCJSHCZ+nBJ3qgR2G//o7Z0VP9qGsKUjYohALVA9IgyWIQNoDK0mI0MKCON5LP73+YZ2C/8WjFU9RPe6gz1AxwGwj8DBZRB0EH9Rz1HvUq9QAoAT5i5KSBO85SeY8ffGEGuBGkAS5YS307+NIXr77y7RdvvPIlwi7CrZxWOjZXhJViy7F5MUmJoXTUhLJZDGE6SE+XLVnYMxnFbGMmAxOgfBKcjfEMPJzHk2GLpgTNBrxrzIiq/BxfphhFNQ931OR5pYmDgkR9PR3KPHU6EKAxGk53nDuVzPaDrxQRur8qGA47IRzty3yuYY8rEXMaclQSgeDAZb6aB0ozq+SSU2Pz4InyocSNKLBfitjoE5vDlgwVg9z6oJttsTCshfXcgFpLzdFkmVN8ag3eyraoI2PxV6k/ZkpdGVTYYQbyBiA1BlzUDrMtLbp6LePWPZUlIaonO41MkffeyE8zZFL9vvFZj90b64yAg16zpmu2nK8PA39GdRUppN7LjFFfFLoY32T6lRaLvxxAQZJmOVDtoLTTvHKdmLBYuN56/Mb4zBFZ8FquVmffDULUyzdS8WkReIPQ81hSsXn3QZFJIlHiFgtZUHz2m848YLHgapEi45ZNam2qSGOxOEZD3iu4+DkDI7ZCT3E05o9pwqo8V8MohgmX25zM8poqQpCyk70frqdAlYJFz57tOA0FevTUKXRUSK+KzMxMWi1DyalZ4rCZxcSTJmcUJBpc4wEBSnMmErZRFDcid/hSfnDyFwNBFC+BhioD+1ouKg+5c5kW8byK2rFazrcCbl2bPTDWmyrUVrZ6LPqu0dNYHAZf7KrmaWShch6XDYoINoPL5lXmO6tUJl9ti0T9afzxGXUGQ4mD2HrrZurnYHtjdnjbytv+OBr4sv+ynZrgMwXn3374vbz6BSscU28IP7p+ZrdBLFKCjoMb1gnz7aPKH8g9uCLmlM+eWAhSHon5gzJxQk5gVBmxkHgA2t2FmCUmzQ7worgqrZCNsQRWo0wslGFMRK/TKNqW8EgDyeI3+pwcp4MtQkgKicIMGZHO+6F9Uqj5cFr7KRKp3nTvMzsw44++Rm0S1Idq3BFl7cjS6ziWU7Nm5oiNYr5CkdLV0Gp15ARKVFyFUGEmWXgqA88ImU15bCaYsIjYOnhs/cTZuxeMfHb+Q2DtnhOgivqRKvSPq19zXfl7o/XhbNmoiumHNU7uCI20+d2SEeunBgLtTsIIXSUUXETnNXLMAmVj5gFt4ljCzrLKcRZydeS4go4xH0ilFZ8/OnhaBN0OIZLgAAWJzcbLIshIYkoCUOWLzAo6csMCQTPckoweO6Ns0gxqTfGK+FMrS0pWHv0Tx/0QoZNnEh33+0foyBrqDx1zLBd+XFPFsFoZVWuITnT1yzl25naGi9B1Vw4+sM3LWD+NmemlcwrhuMkH4Lj1mAuLYN5D/nSx4CniMwywBqCXhLsiEY0S5bt9dlDNoquxkqnG3w0knN1fD5oWC5fuKYbSh4dziYfO3xi6+Mai1fG+VcXFq8jl6DH+5Kqi17QqpXaXUht/SJf2kFal0pI4nEslabWSlWguyavBBxJXFWtf006qJjobxqsunIUPuonVDJdqQv3gA9WTtPQZkpMqI28ib4I6Q4GivVh+LAPKPIJP4lCPitV8Jz+XT/D44Dv+IB8/zn+F/yc+cTd/Dx+H+w512EYAfJcxpzHIGaqKMHLoSLCCrtkxhmkELyOUuTpA1vzyMX5PfAKDUqcLl86Ia3B/fCPhH/tERnr8YPzAJnxHvJvxolGRa26vGVzMmMh5rrSbKrMSa4mFVmrfjQviKYMHRjzKxscR2sGbBle+YcxI0TId00gUz7n+4lfk6+RbmAblE/NSU4VqlQoXcuRj8Vn4Tnw/zoAebUc/HbmE6oBuUW+h8xPonBw7CkgYUJIC8qSNMuP1QAYqQT24Zzd17K//pN7O2ptx9nHAgZ5s/9dfngb741sZA19SE6nHz1A7Tr//vu/2+0BJHHiA7g7q/D5kn5RAJnqffAojMVkshSDHYjsxXADvY6hJMSqop/GVS4jbn4+7yad+KSOTOKxX/B5GjoWDxwU4QKPvQBWxYRqquQR/6/nBaXtJ3i9l8HdSIK9Ww99JwbQxIQNwCJyZcuUvBuhVCiAMTqjibHYmSMEr/oAHv6Oe8RU7qBnECHx6/LbBQ2CgeklDfCfGuPgH+JkP0jl8Yeij9SB0g2i4QyZlNzimYKi8vP9VdA7wKmp6A61Ug2KofhytN1rxcAKQU0IX6JrpNuxhgJhcyiKC9NtA8u10QJC2JhPAU/BLB0lNq+FE9VuijyhUBMDFAweAZM3a2tpMd462JW/hxhvfiD+fOlJjk+nM5zU8rc8mUWnMwLU9has7b9ez+BzGihEjVjumlkpt4jWzI40ajVfurKxcEqnfsDF+B/UBFLbK3Ltu2NC0pLLyk3dVpaTdGo3esO7udcuvq7Y1ZI5xOq0gVahzLSeyxmZL9NKUCzg/M027lMFPtStzpw6+CtZ5OEI2wTv72J5uvVfJ4JLpra6RVnNX3sLrblm2PEclyPwWcAY5c2RCHckxGGMdDz4ATSM8mWN08WtGE7kZy8ZqscnYQiwaM7fPm54uVwmsemvU2mXdZyWtdRPmqQrymEKhKqWiPDsMfzFKWzwBD6S/EH57OhJH2V5fgm401RQIsQmqxSi41PAa0RhpCbqZ6BDOF5MVJOjfoRE8wjKAAp8sqF3JxA0UaqCrDc0JZQuyhqoTE3CKTdRujYjDF5nqTJaqilKDyaWz3za/saomkt3lXT5yyZTQSNt4gkEwcZ5Abkixq7bIhP4gTyHh6UDZGj2f+jhFQL2pz3akbZHaRWsa2z3AmavK0fPANqnJp1lxww1FmZPvvYfcfKG708AVp6aNlfkbco0ed2Tssk9H5RaXzNv62KgbQqNcATAmNYUrYaarZHwRAcX7X5UqXapEyTNNAYwuucau9w5q/YUZSn+F95X3dVnSsbffv6E7J0sqIfDbDFk26Zkzz1TXfvoJXJfYxa+J2cQGzIT5oY/ahmybjBpzc1pNSRqG8QVp+rRoWlfavjQyLRJg8VNQnTW9CtBF7hf2R9BSSBI+UGIthjHDh8FEEe+DxEVyKTIBOgodas0NnZZQku5yCb1HkqkGzB8YRDTWVl5ctEb23Xu3VlWNGbNx423T/IGilkcjd4NNlnK9w1OtilhTdFSvNj+DI+b01FQDgklmzZxe1VxYIKle6FmaXxD0TZo7ByxWZojaogVa7STtt2PGzNx6zz2jWpyunMaaCflSI3jHkt/UatOnhXWFRel6Dn/wOBeOuqq6hys3ug2vzx+54tYbuxpGgDvZOml29YjSjKzpvTRft178Gs8k5VAmqTEvVoe5Ykq9JlyYgvGY0rpam1Xg0/uivi7fPh/pwxD4VSDwDoIBTgiUocJPdEDiHzpXRyRBBKJFiYRFu5moZ5scEElWhFRSJPK50TuGUp+D4GWlyZyWZjYpZRa1MMfhyBGorRcxaYZCoZMdWawQiVYrtCByWipJFUq1Ea25ZExJgSOgXG3Qq1PcZsaASZlmNqcpTRlCtUXmyMlxoM/55QKfz7JrZNX4SpnWJKrMpaIjTFIlsSheXAE/R6iIOhRTyoM+q70JnJyplmuYpJ3Or6N2UmV4DimDtNFDuzkbGwu5S2tz1hNlwUiBAFJIPrbL7RJE9JFopCuyL0JGLqeQOHJKcVUa8XFzEoIHQD4LJsOhic0cJGgu44Ah8iRxeqSsJBLyELlYiF5vK81mJfqWWdVCodoqSz7HbToOTyhM0+EvrDeZP9Fa89vMwEHFSxcv3BQtTFVohVyllK/ka+tzIu5PjE4jX5iiZnyX+CylOeOyj6Kff56uSmMxeQq+Vsj4k9LgEC0Ccay7IHD/ImLe4KrzPT056QKtLJXFl/JUkhRWalZgB4HNSk2zEYA0J+zoRyGzfQn1lAMLQBtGGlD5MTGJqYQqXEWQJKEiUmwomGjSma18lDR1gEcHEz0DpxA6IkrQFZ6C3iJyzRGwnTGIYhlDlV+JyN2lLAVForQ+mEjcdAIReHP7LSAdJ8jxTfjEiVMUd2x98smtd3hdCzfeGzbOH9w5ZqQCFLX09I5aTfyFOgpuNQd8VVar1T5p6o4VK3b8uDS8+RYmtcVqqpwHipe0tC2iOpHtWXDxU/J7chrmoTOOwzFhVJPuZZSGTJI8poNR6sHpZBYAhCZOqZzgCAk635hOOkWJBMJE+gpAhqY4cZrCsl/WOjpRvntZ0q2dVrXkpZRbG4Hw5EBi/+AWakxHw+Mz2m4qLx0rtVp3TW94tHvZH2c/9Pze8x7TmU0Lt9385Iob93vd4LplS9uKmttN/SunRBctvnF+dD74s5VVDsIbpjRWV6o3rWvrmTFq/5LFf1s1ZW3+3fs2Te7Z2fXZiTdvTi9hpuRuG1PRuTjHtxj/at8jK0ofHjftAT+iBTpH/w7SwoflYaVYekyS50i1GpX5+ZxCLSdbTGSiwGT0VD+dcY1OpU/RR/1iuYI1fMQIrZ6hKCxKR6HnLUpSBYWP6Z0Cho8WRAmcrlBQ9BmLE+MKWsrGzXv0zEsvfPD2Ry/sXDDrvvySCn4ed/qocrNCYiCK1y2cNLNnJnWHw2VzM/oNEgk/2xismNkRfw9E3/7k/Rc+eJnaM2nzvYtBKJJjrK7D6+1WrSq+Y0P/oQfu2kxdV0mN92VnZYKHEvYAefFl5mlyMZxtDBuDdYG5Me2GZjCleVEzXpYDphhAxNBmwCs0oKUAxAryCxB4QXY0Jo1GY/n5ZSHQlN2djYeyA1ivGrSrgVqlUwh4fF0Ac6Y7FNi4kcWguLisvKKjs6Wss6yP+DJmaWuRtrWAQmMhXtjWBto6DSO9I3HRSDByZHVVZVdndXVzU3Mf8VUss7Na2tlZXTeuaXYT3twEQJOoCW/qjEY7Kyo7Opu7uka2NGNtY5rqy4qrR9YW9RFfxDIK4KiwTEeBA3c4sj2hEMgOmYx8H/Qi+BK1Ss3wpNtMEh6XAfVn4GT/h/6TSUx4Twd8TsAjRk96TkZPfuQ/SX9FT9Iq9uS5kwDVcp2Dfsir62lU7/UIaBYauGko5f5cx6sJGGLhpbsIob6/X/jhOfhIt3brSDwGPIkPAB1DsJ7WoQ7btJMtCiTNUFpDDzf+SFbsX9b9I/FF4/0Yfwtxi2JJSUhb5unaqslWnTgvKNWx5HL12HCsMDNQ4njG1V5ZMq6kzJRq4Mrl0gmBcMThVto2jlOVqRUvDLa3E4/En6aebUzzUS9kSzsvYgGBzgZ0MqDWSg25VN+Nm89MLMwjCak4EyjuDGhNtoLCLMMUU/n4rvwcvSCT+uqOkMZoCdt07uossSfkZkz5ZTx57+AZBcOtjsxflZnmYikUHL62Fb83PrpUYWUAG6ikjiG/pBRuxkpiK5aBVcdsdoPUQmJc0qlG2U2parXBjhmkaXx+mpSQYOp0poSr5nGhnO2PJqVsv/CkKOIBKA567qTww49OC+MnX6Ur15myIThvOyI03I/Jox36RdIfCBqJyklqRaqk2BBXczPFJs34r46OKGC43bw0Te1RBteungj+TszErfpp8e+r0yzWlzoVEtAUqQEj6lW6b8oUuakcwgr3l//i5+xsYh82ChuHTccWQ3tbN2/KmMqwlTVKOWN8c0NtcSzfl+nUi3lMjYBDyFJoHLdz/iv/nUagWrSgSVSl2n/7GE40LxsWQknMhH/vjnVI+EKJTF7jmp2tavSEFuZkPzSh++Hs7Ae7ux/MzlkY8jSq7JKI3j1a3ti7fcmS7ZParMurq5dbm6ahV9OaEq/aJqFXvY3y0W5NSPnzrvxYYV5+rAg/nh+DcgRd5BbRd9JkeoM3PT3Dbs/IsHsNelmWQOlTtf286M5z5+6c+32XKRAwtZ9fgF4tON9u9gdMXd/PRa8W/dym8snFU/Kfn7Pk9TOLFz+dC68Wn6Gvcp9enLiXwPlZd/Fl8hw5BRNjcsyI+WIag1cb0+Ja1AhQzZGTMg6T42EDNhBjgMSib/cLz87u9yMEkdnnZiOUinDgsiRN2oqxQjeXMMqAmYaosK/rN6uqqeMjlAKpLJOxgN5K28Hz1A+1f32/sEpnJUUt8f1lSmAwqEvBghaLdC7aGPFCVbwS77Fm8RKyed3Fl8jn4Dg1UBuhHmqVMVcFWc7JzvXkgJxAiT9Aaq0egsnErJjQK1wpJAzCnUL8pPC8EBdiGpTwhbqMohA1ilNfmofPC9eVtvsvQ1CU8hnmJI7rEGYr5Axwjak+u2avV1sacNXnW61l3dHcsaU2TaR5zpZmMJsgBebsDKnTrODpw05r5MLMqxBDzrh9KV+pCdUFs0aX2H0N0yL+KeObC61ghtChMo2q9PNNuW5VZYlXTXx9NVLRdSNwHVkfJdfRixVAj3ZkzBvFfF7fSh9h8O304Sd95324ryLMMZhNXgU6sTH9/vq+jbA6k3S79kKj28lGq0HkBSDMOjoiah1C06ELAhSm4Q7PCdf3amxxX7+ZSaYIo9TxmJDHJQkBT+rB711/++4FtWtq6zaWBWrlIotM7zX5fYars83gNy3xfXl8Dsk2GFikvAAsLFcIU6XzPrlt7zMte6ZOO9DiX/TixsqwTpw14vDpEQG6h98NkLd2k1OEttQ/YJjQnroFr6R7+b1A3BOPYa5jmKZLM0tDOPourjyoCTpQ+zA2N8vRB8DhakC6EaAaoNt9+bz050mHP+/U1T9P36WfpSfcic9zJz/PjT5vpIj0Xvl59B5N8H5ibaMx60wozVVeZUxZpySUBi/wGqwZht9bTGhlo/36Tv/say0kB7DMl1mmQ9WB0L+RXG2lAD94PnNj3wtrqqrztenujJKOI0/svMZO9nc3iLdN6r3fo3Wmqdtz268HQEXPS5qcF4FpsRysOGZzuULpHqMhJ2TwkDM1QMPyMmPMOibBNGiBNlUsh3qExGlwgksTQlBG4ggNWkdj1v3ORKws2hpIuqbmpEEOvS4k9knetScWP5JPif9Z72+MRprlbv6KiT1rvdUfPtUSkZJTrjnFbdu1JxdXleY35uaOnzmvoqh6/sE0Az1vV3LeTuhlVGLTYiUzK0BFAFWn1vkJv6ESVEYKiiIcD5nJwZxmE8cUM9WZxpoIp8lpUmYw5EqBICrYIiA8gn0C/HXBRQEuYJAoMDx7DnKnRMOo1aLAr9eeDoGgSScpZL+UHo9IhLIdh6oqfp8pwhZ3bNSYnqkVlY/f32RVGVWaHlt2XdCR59GNmFoUHlXA2HdtejL6q0yeMeGSFtW43Mlb00RykcZbG3Q3CBWaznxfQevjv8c3DExE028qxsVSMRGkYmksfaYDOGReaUxaJyWkBidwqg0WNUdECjk8NpeVgpOkhwEYbASCNZsG4vTTMFiX0wbIzDTwJoCWpYiD/97k8cre+dSjYFHTfGqQsfva8yR21h87VgneoMIgjzoFXvy9aV2m49A+92FlWO1Bf0kO6v/usJeotFq74rfi3P67InxY4wnp5IFriHAJHQcO/CqOEaBP+JDiG0aUvZogGPyt8outfG4VtQWqPlPkMtV3DeGgTyq/+qxge0L5Vd+9sp66Fao+c1NC9SmroOpD9Mkdlhc6LICNwEbHfEVlnnyQP2JmDagJe0OxUF2ICI0g9ek+FpcrZWA6r26ljjDodurwk7rzOlxnh+Q8Ih0WIwOXSOSJRGlGQAxxKol++e8S5tqckpQq/zaV4m9eTa5O+W+RiiG+KofRNsIwf7mxEBYD6+msy9GcNNLINRHszF3GRzIfiX0Q/iZ8Icy6KXZv7GEdkZuWm7k0RjjTnJm4Ok2dia83r8t8MfxemMHMZGavUxNMM9ON28w2tyGbYJlsJlsmQWZKTTIzIZfJkI/Ml0qkUqlEETZlMrTpzGdADGNhHPjIxvxg01GtQBuFFudToBXLA5sOpaew2H2gNdYCxNuxJ3BASmUSuSxFTrKYTILN4fDoz4lGvC6DwRp0qVQRF+YUOi86Cacz6opZ66y41VqE/KY1qTjxemqMB+B/3i+F0G6XMIoKUZ8qGvAinif8nK7mH0h8oyL+Abppc7KYHwEO0p07fxgQxvMQEIaHRh9E70El/IkK/jmoBWGiIRboUB8OZ6Zr/X2s9w/3atPT8+DF0d50uEPZHLq8ny0HqGQ/cMrpjyIAQlSuT4NjXN24uuSdXBE1ovM+6XzLoajR1bZmwUTn+rGTl923MOfGaTNXFf6he0GorH5UcWmk/Op78cI7NTW2EV1jc9ra6ke7R06bVewZtbx85LSwo+JYUWfWqIi7LlGj7EjykRV6pDGowRrB9zQfRaDv6WQF39MPApIHmEoNELHdgORKHmn8Uv8z+FH/s4X5EGMn60H2rqxHCslc58M+vCpNnpZViDrz5CvVWYUxTkpWY0wozlI7nU5coNQr3coXq96rIpnV6zLXh9cVMlghZlgesoVsYUM1kyyUhmRhIiM9HfFZqt0mtdttjqpQISOvFO10gTfqxb2Is2qhGBXkpdjTbRnpKRkki4XztH0gFuOd0XyiwTUaHi4SyfrAzcd4mNX6sRmY+wDrCMbz8nAeYkYvTtIf21BT7AoEIhUut7vGhUWF0YtRIhptcMUidRE8EhmlvQ+aLRoO34rEthLD+CyDiyTTXAKOHuFM8NPtGTbGqCbEQR7EdahWPcF2KEH5aswIPfmOgdl00WCi3VPHgBI9pSWZE3LlwG/4sQNSz4kYcnaHOsbJwNPzqgrzvKU0W3rz8mrpizyOVtPHeudIr1aL82R9rK+O9PIycNzcx/r7wV6cSCBlIg71JOAyEXRFAjFTkuTJ4aSISyLvSgPicg6+PPBp/S0HB0vv75g69Za992y1KDS+iC1cP69ZF11Y5YGmxG2DbW3EI4Zu1/pxM+ZFJiGGnrcMMBIMXVocKWf039URKm8KrZpya1SikqtGhKtHa5rKw9kJUyLJ2ROD6XU5NGvPKRzz0DBnhxppziYxX5KvkT0ahD5UBXiG5msnS8vVszIUWoZVChapblBtVz2ueqTiSfYzKtau9EdCeK7+YSseRZwcQpwcgZwcQpxcQXOy3qnHV7NejL4XJZixdab1znUhBsvBdModNofNaYgxyZDUIXMSBI7TXAwwKQCYLuoIMbw5NBdbohbcgri4BHJVijcF4BiBpxCk5ilwC8aC7gP8gyzIsIeYYrG8D0yIaVPJpOmMMYVMHLrF8FNThamGVG8qIxUxdLGWpP9CeWG2y25357uMxkIXFhAG9gUuBhiBQLkr5q5z4253FYupJRgajZBkMJSu81zA5QpxKMQYVZXDXBygu1skJOdVGbgDgaTkIQ4WUs6Bf5dzj+LeaMhryaG51eL1liT4l5Mqpxvep2q1zD4WBQUtTiBuvQTsSnMqDYJiBuQ1dTO4Om9eTbwyvqY5MH7z1Yy8TROdqyZNXlbaTvPl8iIoaLNLkoKW1tz8q+jjC59DlqycMDbHMyKUZMmEtM3OuEzakph1mCf5UN5mYtngNponbWwmV6hiKjltzDbOQ6wvmV+yOI9kg13KR2x4rvBhOe5B7GhD7BiG3GFD7JhNs6PQKcRf9LznwZnedZL16nU2BkvFVMtVNpVNbfAySZtUJVMTHDa7j5gc47CYUhZq33k5awo8KhvD4KBZUxaV4TLEmlmINQ3DrMk/DgqgeZ4K/hmTMjheboxbxyUwrpCLc7kYNFYRD2YwSPqjwr50V1qa1u0Si30uzCw0XzQTZnPYFdPWQbtAm4M4dlOMy+ezacbLiSQZbyBwdX77PMlucc/nV2W19ZlpV+M4xHAGj80gc9B8JjMYsmj1beCwGQxuHxs73Mu4xGm/ZbRLIS/wb+vtJGNd+OqygBijrtu1avKMefcl5FzR8wk5V1KSV5Lkp6HQ2OB2mokmBpMam+ah0jparpW1Z43Kddahczpk9/GSdp8uJri2x3BNF+Fq5sXVjQhkdwXgH11E52+pDkhovCkR5Ap0AIgnEqxRfplVdlmPg8tatsiS4SR8Ufw46sCcytUnurI02pSpXIPTa7VafaiEbrJRibor+1DNAH1Nn0nCv834mf7bUcx2KOCl//5Rnwg3G+ghHDThV5YF/uuRGP/TkeIH/7tT+J2pQQkA58ZakpxbFxY80liXnF+MWw9nWBxLzvFwUWFilkMpukPwC/8Lk/3fJ8b/HpWuTT3IFxc/ZdclaZcZ49o5IaLA6zbS5DsSzfwVgw7RSxSJ/muSAbqJOJ3bdVnZOAckIioIGPsaE2RyKqzBDMpupRh2obKyAHd0ZmeCNhDz5JSSvGtOn7RbU42+iReuY9zSLtWbSauVk2nx9wx+QYjmubVBKIKtiXw28cVPaSw4PaY5ImfphABVwB/W83EWcn6TRbEo8PH74yf3/t4wyZp/YzQ4GgvbM0T/AwYzzbUmtpwV8CYHdsQ3PLJL1KczUf/F+MC/WJ/fHz/DfI3V+Tcm9sv7v7NhCTRn7v7h/ZpzqDiWmHdqEZo42r3JqR+tv2zuw2n1cPpJCfU/pcC/2rT/IYWuuXP/R6T7PRnIQDRN9Q3TdAVWdmTC2CG6CsfThJ076zLSHpt9BW0vq1lA5B0Wi//XFP7/vQL/f5fmmktG62N2E71eXVh+jOcrNIxkEO0tFaVJxdVaJsJzs+0WWvweyrHhl8CCLhPDNATVvyDhUGl/iK7+gG8hwHCFCJ1xyQFXoHrQ70rcoVNhrymmiQeAefH89vhTORqZmsPyfkl97haHaih9wFowqwLEqB+nb5+Az63L9Z75m0PCE2RWgE8jllB7wzUlOP4yNfJwF6Q9SOFYJQqFqByMobbm2GUGB2G1kkJV62iwFay/bwJ8RWRqrOXUS8AXSpfJhDIRgLcEipFToXwXQAdhH6RtFPPGuJmYUcRQ54TTEdzO0WwbnsZiqGkcBNWvcBAUl+Eg/KfEIkr+Q5rgf/1fmDrkKzh3tpeeO81Xidk31iXnDw0iSIHiWJIGh4oSRLgqX/1PSfGvRMN/TCri42tt7v8FGl746PdtTUhf7oEkfVdglTF+gsJItg7ROHU2IjISv0kyHx4/ROdhMXuFPvv/Qe1/JWj/D1bjmjL4/3SZrrl8AMuAivIYjWWnPSAWoIUR4hozAwkDjKALZgYShhXKqbyiz5zMRlfKKFCFnr8AMLYZ5134MtBslWnsIwL4pN4Wg/D/cfcegFFVaRvwObdM773XTCaZlJnMpJKQDD0ESOg9dJNIr0FKKAoGUBEFBV0Vsa0NIy0EsCBgWwmxABbEsovoqlF3P3RXYC7/OefOTBLAst+3+33//2cyM+feuXPve563njP3vK8sfMvUB1bUwcVCbpOv0LWQnoFLBvpgILrk8rPDnHpd9iJ+3fbnrJKdAVLQiFOhVkEV1KWwaTZarutSLipZKgqvRCPJSPhiUf74uvv4LdzMO6QqVONHDfXt25JVoZoObMBVoTbfGdBYdRYpXwFqPXfy0xbu75tIBaiLBy/jAlDlBq01xN+z6kU2cwlZE+UGtt3ONJyeba+cMqdBHP6DeMXS9pxQpCsyLkajVwkFbj/OJ6Ima1W8kZEpBgJMGgzB7q88+wq36MzKkV/BMHfih7ELfAXuBfRMDM4G7qX3uC9eOjnFBvtCIzTD3vZEDhvB3xEtIZC1y6oniZpNQUiLzQYqPRWXnP3znjQgThqueK7mnJAbqjuXfYzfcZGHF/90yHqnjyHdN3bB6hsc4tJCiGSdYsAwuAp+C8/BVcFRqAu+wcHY4dAoryH2I7Pocn2DM+Dz5brm0/Vj0+x+36UzDNm8vCH5wYZLt2EsS9CLkN0IpKgn1n0ut0dI0mrv1UoEeJlEKx5JncV393ZKLqztmt3PH0+aDdMDxcWBQEnxCnNOD65Xr2ykmw6LLU0BdexG/EFJIFDMuWOukUW2lBRLyQg4+Z5Ml1mZMhfFhCXk5k2ejmzQB2RGpb1cvd19PMKCXELR/nytJF3gJWs3WsMJZ3g2jPMQ/R7i/kf0w9b4R7f8q12Dn/56z5H44L6zP3fq+xBQh/yhqqaXq7a3uw5BMHZUHISodAyCYWC6oC8PRLi1kycsI/fZ8bWg/j2A/Kcw+4/B+Vto4/uhz7Hvx7HuBcLNmd2lBbm+XqRIXJ5X8EsKEJe3ot8FrZGk0iCuL17uk3g+MjYhC/1/BbVnYJPNn64/ddooknpyYUauzmvjDqVzBwxpTnX4N9Cx+lJd3hAnoOSFdoVYKfX5GLWj7+XvaDY/qEJGCNkr9ZVzdDu9BfkVS7PYItWpKRf2KRq8XDac6KP2tzqg/lUq6S2/RQeN6WC/QHxwgUzMh309evYShvOI/cyV+N3gF2jrMEi/SePvYNSvd4P56Re59Fs9pJy/Locs7r/wk2T/q0AN6BWVTutxQ8+aXsLRI3gklKNyJRX+3r8MRuRqQ/jvAOU/iRt89z8F6W/bWSHGXPx+F8zng/VgWFTVOK3Huht6rkfQL7spAb5mKUJ/VoW/9tfwj/yC/f1f4sP/Eav+z7j4m0ymsS8ViOL2fRwoj0r6jyrOYsZV9SwbisfUPYZI8iO+ccTc5/6mue8Ya/8+q8/fH+uE/P2JPMuVMJ7ygtwzG4TJPH5kdS/+8q94g29hU7rbKzX0GFDuSYX5OSk5IxrODS8v4gZnmbXRWzf3zsriTqVYU8cefq5iSPff9A42oyms8tTVTbXo7WhwYvLM/yPXsgRnbNUpjMbqY8fGqU1+nLFCZ18MrlyeWcDPQVsRsF8in1GI5yhSc00SpjDTaQtiPB3ZEq2KKsSaoe7QjA7ctP9dUKz/Us+R2P23+kbjvrGfkfXDvZG89Ixqx4wdJywrAnw3B1XEO7p/4C/0tGMWAslO3C/9N8Xgt0XsXwOF+fLX1PRfxuu3fRrCUvhhEstasALZVsvyMQ1jV4wTTikbnwB17qwkrFHxnF8EtvOcA+/pkj7uPwbw/yYPft2K/rvZ89v+EYLuaCyoRPzTA8Mukptjn1CixfnMsEXk84lcndadgLbMnNuPKyvLtiicJlIOid14qcfIQju5BB39Qz+LyjsXnb8vij0r6CY0andElW70oA0+sfB5O7TjIvGt1WXtZEIhXsqWimdII7c4Y6fZacl8AV3h++CWB76CcG/jczmZxQ611OstndZ9yI71UyoLcuH4fUeh4NMPoOLOQanBVH2901ExZcdjl3plL8Fj3t5XzjEs6qcTZCGLZrfbnFJNmbZKO1FLO7TZWgr12eeTioWZANMVwd6g7FR1Na/fyTJ6kbAxLwFBhABDcuDmqTst7qde77Wq4t7P/nl0SZXSZbJkyKE6S+k2WLOk3A/ZgpKpwdF9xj0/c1xt3+6XXn0V9hv01IPlGKtLZ3f0s6m9896EH/SeW1RV98af3iexO/JtIYTfKNAjKhk+YqSwTzhoNpRjPdLnmPpJ0qJRFFv7XCUwWAJLpKwQEz9vPs6rQqo4JuIUMp7HE3XJJa1GAz9jFInPN8QnTVAMo4TGJNM7dgtx/a/raUcEDp6myaqLjFyur904oP88t0Euye/OlWiL3UYJY/WPzJsxkKL03fpyOQOLpKw7syo/b1iWOWcAV1wWthAF8CuhLoP6dpoyNTBt4k0DBozotpyrH+kyOFNSjCqvejDcMDc7mlcuzeAGTMhGO1NS1EPRvpyoPbOA04/Nt6akWItHwAlbM93xMV8lAKLd7EAgRxYqB+ijEok6LZWizGm2TrcyELlSq/h8DmQ6SyhQq8jcldDlT1WT1APpkE/UgWeRmE8bRn91H/r7Iaum20vdarJ+wBtfjW44w9UfeXbypO0PwhxKBEMPbZ80+dkjXP0U26OP4pmjRx5RKhTKRx7hvuT++uijtiknX4LWkw/v6IP+djx8Es8xYb+UmOMyAR+IgmBU5sszp+ahR3pOYr4rPT7fJYnPd5E1A7hU0rUTX0mi6cQdzxlQre/SZX3yHukuc2IJ6s+UDZ3Xz+nuv2BoUadu22ftXV1eMOeZBb4C10J65ipnpi/ZC5hdNmPDgMo1Uwouf3hnp75vDEzesbjuiYVl5D7UBG/0SBf7gKFgIohEzUPG9nH3GTqmKKuoD3oUuLLTJJShII30lM+UzOcmbw2Tl5yQ+7oc8if6lwGTvcuAdIKzxTAvcT94MdR24AJ1Dooso1RQdN/r8/LMKR6C1iQAvV5q5fl/qtfCp+cUlK/eO8seS0IW+8jZb97QsqKhC/q7r+V33wQ4zySgYZLy8UzZwifqFu+YHLj8YQLOmAGuHLBhRhn1dcGUNdgu9LvyOSsj87SuqFKr86KHyKgSpzjTSOHmY2WtyeL22vjqLVI/S4cwiufuIfWk4nUXtE9KLTqrJnDn5hdhWfOGA1zTIe6HGueSP63Z1l7f8FHjjvOlTic7I2TVGsoPcc++dfngxSf36Z6ctwkqWj6Fmeub22ArWUPVC9n7fnSTRkBN5fOAcuPZdxGdxSBjVySfVB7JU4JME3rQ9jS9nE4jfqDsGO8H4rcOYIPr6pz7gxioiNabTThJdSxJKzB2nTRlqir3zeaea9kwbvxDD7+4+c50rU1rlXidTueY+RuGNM6a1VDcbXH9fWtumLbUKbdOz4kdCo3wmUaUFF48ePn4U8+Mn1Bu0NqCXKR2y4TMPn2405/tX9dYXl5Y9KSOU9S5evl8Oc5luF9hhP9gUv8hsE9lNOrUOLf3fo1eL9KJJUKsoyI+AyteYI+lF3MCXv3bBtSjECUPUpPlUgf/I8Rwn5kKxtakxtZQQWZ8ncuiNpFrXt4Kd/hi86mNPm4injbtmA/PIfWBSqP67p5BpZV9++V4Svvm5PQt9TDma6bJk2aDLDAmhuP6xuPaWXM9SZRG8/pUkNQcPd6FLIkWJ7VUl9K/MbleNWNHYffxpc6Btx+7adG8MbdPjkSm3DluxphNNxQcOXrelD862mN0vvFXp+BLPSbLxMWNPRcdva2ye+XNT4wZu2NJvwm0f8jq8Udb4GjY2uvGAelU7AkqNHweIHMAHfYmBCrAJFAPVoPbQWU0beS8CndFY8PcUXPXLa+bWDeptiRUUjG3rqSkbm4FU+zKwSaouJMJ4lHrMEL/qjnqAPB6BqkgvxjCq4D16nnLlMfnHynIwxaKRbuMagXNxjH/TYs1uBPq9UmjtfimY7cPdJaO7z7n5FAYSvBi5phNNQWvvhIbGZl8+5gFb7xcUHPXmNnjNk6JQMaYP6ZnjzH5JuoOU8HoaE/EqF+xa+M6sYmZmDBt4ypvO7qo54ZlUyyhy0VXMe/AaNg25ombK0cfOFq9amgqPaHfkh3je8wfHoLUWCq9YnqvOGNhDmEsA7TJe2zVaORfCSZGu3sr+/bJ7FOJHgOLSsIDgT/kX+WnXf6H/dRh/w9+yh8WW5WSMsmdEjooaZJQbZIrEkqiYdjEyiJ+2Sy/BEt19liiIkYrVl98t6j711fHwn9hoV5yjdH1F8pS639rqR5/V+kvLZG9/MGvL9bjx/kjkL0+iXTDAWy75OIWkWWPSg7M6H03DRkUS8aOl8WOh3Ks0K0XwauSTiJh1xSQ8iAjJtIubjv32UOzp21P9Znb/vD42VDFEz+Xcg/NHNXXwvSDrI97iat7avUTi+YdeO3kptraR/ZBVaEqJwvT8PSVr+idiI9h4NnnF6enh+wtwh/3qNhwqEWk3UXLQVnsRFk7We0VyoGJXE98TqN8d9fhAs8Pkqk0ntq7gN7WbdeaR0f1PNiwau7dUL9+atBttqhvMvoCNVu9FmfGvZWuqu3lqyf9oQ4K1t8zvWrslodympc9v/rJ3n57pogtE0gfmlk1oNCe1sMhmbCmqnblE4jmKvCg8Hl6JlCBmVGNiDEx6UwhU86MZgQKOSOWvIS8mgAI6RIU7jC0dC8EAiHTQn0clYOdULIT5k4SzxVT4ha4f7ecFbTAj5sV8jL18LGmDNUFvMApVn2uXdV+oQSUoS384BPQzoMIe6Fb7zbgxKv+vFIIvx1YXDxIUPzzq3UTKlcfnDrqCD2zfuKkG2a+uemeUJZvG8b3Pm4YXccWI1rXRu0izVrd7Hyh3Cj3ywvk/eQj5YJJmrkaiqElEjmmUKES7hSBnaLcOaqVKkqFSaSlshaqZi9DU0I0RJTulUgfkMtwXWMlAC5VSPWDilatVU9fasIViUtID37iSY93BO2Caj51P5iXgTNz4dzT+lS/2qtGHbrvrq2+7OA9m96cecOkifX0Q2uPjJx6cPWgCbUXS9kjA0uKu+A9O6rpoH6UXEAzckLVbolE2kKX7JbJ5JhGoBLw/ZGBnapc4c45opUiSnQI7kfmgoEf75dKZUnAVQjh6vYLCbxV5D+BOCYUV8DJL3DnuRHoAm2SvJ9fFRQj8uiZiP6sEKF/8oR60BXzVVGLRLNWOTsfSweVxhQxFJYXSq5gGCERCclOMUiKBKZQDhQIbgEySRLcFYHwAZbBcKvh2wC6kBf7AXUiCfi8uIjwslJ9gQgODzeYN29ehjEPdUEdUecXkH5kw/sWT+AFJJjt26oaWFwykD1ysbR2wiAkPyOP8HahCjyE8J6NRk8vRjOgfZV7dr5AKDAYhAZDqjDVUCAsMPQT9jOMEo4yyJQKABmhHo2vpUTwhUCEBN8A9FhCtGaTSavVCMw7TSbWgDu8n9k5h13JUizuKrrWlcN7FNpciJRgt0KkJyzT7NRqpTsnSeYi44wEsFmpWGUjvPoJM6oEd1AVyyBMw2Uj2lHX42Ww8QPXkeBTbM5DfjTOu6TG4PLV7lQ/EkDh8xOabx7cp+Hilw19Bt/cPIHfYs1ki7JlZdy95dnbbnt2y90ZWZl33YOb99yFsdnGjaBr2f0ImwNRv8SOeSsUCgk2fqHfkC/MN/QV9jWMFI5MYEO6tVsrNBB+m6Q7JZqdkknauVpKi0FQACXEpoHZyZp3snNMK02UCXV7PwQUARULgVD0gEFPhAAjqtG4tCH07bW2pNZ16T+WheoSrHmxRONCCdFCIxGLDJhQwKRU+PMMRrVAiG3KX1F/tzxz++3PbLkrE6NAmnez+yfsRwCtuHh+Re+qm/dPQFtVvVewlhUIrv14jmVbbEscFyf4Lhr6wQ0lbgwOFhIKI0LlCfMMFMaIwmBRGDUKQKWCERo6Q7Tb5HAegncBO7DRFVG58nfiFZUhwBx2u+Ra0Ixapy1XkwTuBy2tXevqAt2FTuipro8gh21DHEaNMa5eWMNg9a/CiasxXx9S7mOqNRb5VWD/+eAUXCFlOgCCGcwV5E6KD6DN93azNF7as59hJbRFCHF7L8sCs+AgfAZ+AUwZlYjMQYj2StV51JVBiPJ2nBAZJ2qF06cxD168wly5dMM0LM+H0VgCIv/rAaei3eamvGl83XnJdMHOigxCF3WT8Q3TGzZ6nH2Gsc40w86YTCbbOCM9SGQRq6FHS6kYMVBrNABaEAl7xCqt5hDtR2ZPDYt3Qw94GW0gFkMfGrG8C7sDXod5rFFYHUwoK+RLu/RaEi3VuWm5y+10O9x2t83NChiapQW0kGYEMrlUTuFZNp1RZ9IxAqvIsxCYJdqF0E1bFkKdHL2AjAyYkRFAf6tXI/7gBWluLwrMS2k8HYAnvbx46orGgTRORQ6zZwtk0dvbFs49fm9UwswSSCOznhpbcdvU7gqzgQr9s+fibZvHj9769Mrwd7G3qfyPyubcsqAiMqDKW7Lze2SFU2EhU80YUEsIpOAzvMZrF5Y9f1RSJZ4oniNeKWbEh+iB6GMB2clOZLH1Y1i8kwYU7W+GEKwqywMtVw5HM7vlgWhqnhPAVeBTQJWh0UobamC+Q4piWYFALF4lgZskD2PLiL6gF8tzJePlgKaRNxGKRNLxstETCMiqxOOnDLyoKiHWQRTZZmRkYA78VM0/c0LWXcgVCf++bybDAJG0Rfi3PTNFgEZ7ds0EuJhOkKwmxStIkfgkHqlMwaU3k0/D0AtDfxxC7tW6DwXnucxqgGsg/DFqZKR3eWfnFwlhHpUnepV6VcSIxCKhGGOEC7hDiKIKEd5SUbSOEokpGooRtykBi3buY4CEEgpQq5kOMYcZimmBzXspMRJYArILIbQJPIyuhfbvF1GUVILVGq+05V0FDkGwrAWxd8RryUR8DXe8mExEVpOhmKQ6I6IWQ7XPjV7vg63wxOVm6mfuFm4NtZQSxn6O3TqEEsJnuBG8b0yFHzATkG9kwQjCb0gdRFLOwmBUw0RxvmIVwE6aARYhRWPKWcYswFwhOklUsroaBAdxBPrdDEshxHfNZAnSuF6RHic6ZiZcNlbRs4dwh+C95LqUJxaj3xa8iTxrt6hYq1TQIoN0jfog7I2ufTYqBk4RFDUaCqkX4EvACF+AnxNti51D14rFzsVtFvQmE/uRoJlM7Ar01J679szr1S/ic1g1QTS4lDDCWEyoPfNJj8y0XKWkv0ykdU9HeszGYtQeQkMJT4NBFKcBYBpYRACkCoGhKw1kzT4ItndQEVF3lHAwknl0PNNMeXgqUpw2TTZPheDNf7bzVKgk5VKR3jWdxAx/pQzsK9SrWAP3AhhAxpDaF5UxgM5nIVXL9CtHl/0Rm2pAwlGS2tHNvnIxjf2AMjTxeK6IbaazhOXoHK6oFC9RpKkAgBySMO2uH+Jkg2BJsIRUQlBTK5pim8X7fhoQ/y57BF2fBcGoDlIBFsf5dIAKMCwnADBfmDgJ8RftMXIeFSGEcJc9EpvRRL3adKmBDZP+IFoyyflCUR3uEI1cP6TyUXiLz80JOp2PeKFOJ0Q9U3uphthMulcT6tzFE5g+hM8R1DdyPhag8zGohxSgApATMGxX+tqJYUieD2fL1qPeUvegk4QvNTTxeNOZ5Hw5UT0IEAJZBhMI2ADD0L9EIL4lkxAYoTMvv0htwQQytyTxJzQKkTybBWyAZgDyZAxbK8YpIxAzkGHkRF3Pix8/8ucOlnRQ61YTemMzMIcQxZcaEpgmzo94xNACVoiYnC8SCFmGgVAY6Hz+9oSRvND1/IR6NcYXkR/bzNyCOoCEgJyfyKAQdI9aUcwBiCCigR5diwxbvogVBITCa3pwIdkBvjs8Pvo4C9kPsFwYmnAPknJO+lAWtaHzUzw0BHoRENaKBTz8V13kxw4O8HFhggtqogSYD/cQTpDLJPqCriMFY6MBkVgMOq4lkbKMSFgrR1eUAWlAIhGLBfGryq5lTpceJi/f0dE4u7xxPDHPmuKU8H2mrvwVjmZfoW8hPrVsL8MGkP2n/hG1UFjsAgD5OYD0XIycIfIdtaKErsejOCLLsVj7T0m1VydVn6j/yabYKWQBKHgYycc3RP8xB9UUhKhfNABCxEFsCdBF9woFSKNbqL17RO+fiZuEuFnAFwomOoZ7hZ50CT43byV4S5GUc9QfMajYKxIGWNIbK0O6A5C7owUCYa1ULGJZhoi85CpUS+K9w5C2t5f8lJBL3g0jyad7x2bwws/+0NTadLmYXBf3j9goMRgQNYtQrxg6AClA2EfR+VKELLoyJgZdHF95nYR0klyW61BjvqdJJvL8Qw+I3DGX3tSKLhNGvGMWXrodxHEl/GORNI3ZK5AG0DAWXcTMEvuI/KNIhPw7g8br+XKEr0iMPt2HzAhFQYy0LI60ioc6yVOejg4AvCSWxQmI9dScJgZefg4ub6LWEhC4NZeLmYVNSdmmMwn+AxO+4h9RG4O0M8CKxHxclS8RigJY7JGh7MKADpm+hgNIrPKStpfaQuwvHI0YcFGVvO7XBP/yqBHFOJDYIBLDobgvX4LxR6TsF4kDIBeuI1cl+F9APf8F8LXkghj8lyGXzkCMPrJIF08QVab4a8axH7VXIAyIRQR7SAeYAIVMFEIdkUKh68vQ9SHg2S8JSKWCdbIO9v8q8sQk8m6HLr78HANjp7gAtRYJPtsDdZ5Gbu12LPdIj7F9J7iLA0JCiU3AICVmsZ1nRSJxvrTD1l+RdHjehDm5Hu68CdHHfRQWfXShHy4XI+R5uY/7PjGoilogCIj5S/GKJgb5UqSESAWw1PEqgaVOktRv1TWi38mG4rrDxIoeucSh68H3eRcZN6RI9rHtIn4Sy3787Ah/MbpkQNQFf3lCM/ahvsetjKyDit/ggB5zAL1EqDn00EtXqAx4OrasSVh+8eUmggWzkJdBOJr4QDGo7JB9Cy/7YhEv+7USxB0RbyAOUnuApIMLcem/nv1JSH/csRNrTqSffjUeL3xNrjsgaurwJWIRtnLIapNL4r7znqQzB1S89P94Xfzz4hygv750BZ5GV4v7Dj6mIL6DXJfHn0KSxvD4SxH+ki62R0bBAIvlfx+yfkLsY36/7YlgFSCCmEcXN126Qg/l1jTFliH4VU1wOf3qpdubusY4UjB8ryShAy5eB4AUxgGplUuEnWKe67jVzjy4ri4kI6BEFET0AbkC3h7zcZYUDIlHWiKpFDk6sUSCjBLL5MspdP2DcAeiGJkDqQSZQlEXcxBLBkYdLOkagMX9H3yfS4/7QOLRiRukkzTgYnNKsHSvQh7Ak8r/iKajsSCSADEyvBKJkhdIuUyGrp+vVioUiKwAK5FKGYboKw8Q5pSqM6c6RRlXsSzxGlconlwtITmuRIeJGseWUrciwonnZnswCxF6F19GHiTuS5OxJLaqST3yJvRIIo17ERmTS+cCPkrCKnU1K7FInetk1K5SKD8v37xDuQcSnUooFY4m4vY9zsvxUTvxKHxAJsUajP2KDIkzYSEmUS2AuSBAUGSZzhxVxc6pfopdz9LF2apN6hrva4i2JcNfPrqhk/TwfF28VyINyAlfnawwIAoIUFCFmIuCKoVCKZXJcKSjSgRXUSUjUQYUCrkcRz5i7Km68DXBVaKJP16HrV3UgHglc8IroQggtgyejrslPh5DSkm/ihSUhCk8lvE4E9mKqBhFvUwy2PSikRIy3hKpiI825Xy0icDFrpLhZCTqvNApNrjWVXUEvYkIn49CL7+QiPNJKNpZxsh4QgpG70NjBxrP/vdErpswGc/tSAFRVcTipGOXIsBx8BCn50KH3fqxS/TwY9yAauOUJCII9gM+gkNs7QjheL7GscF8XRZVyBUKjI5AJpUKeYjcPERKiQQ5V6Sy6Gu16nhQrlIoA1Li20hYxRDOEhI7bOuPV9m1DpZeM2jgueomCstjeIkjrIXLsdryOF66Pamv8TFEXE+q96AIi4SgKZCiiTYIEOFs3Ajmy3kzWCtL+KI9e2QdtF49tCgJEsra8cxa53FVYpRBBjXxgQb96uViPNjoGMdhrXUjd48UNGHyeRcApPwIK+EkOjlG2VXAXbjWOV7rIPmBHlFaHKTEnSSKUugkNthHKsHyfXJZQKlUYHwCGB9sLDB5CCKeNJlSKRBI89VIBAhvkySCJIm/wNuutjjWyUr/1JlemASQmo21tokeFluKyE6iiFnLI9l5rKoF90YVyKWr1SrcAQXNW+USlpGjLhGEA6xGKxaplEqZTGrRx420jp8rRXIpkchRp9RqTUCrBZyuk053gNqpI5XxkIi33IM6+nMdkc1LjnX1nca7yTEvGffGLXvCU3ft233RAmQ8NRq1GlnIAKJfGg/RlCoVopY3+nKZRY/sgS6OADb7ZDgV1RO7r9VqNAnbf3XvsP0v6Txox7272m3GH4M6QdLVNXQxJnFpS1qUhMw1JQJkJtk/LHtqYASvIssik2k0xoDBoNfHxTAT+U9xPBgCKGxjGQb1XavTqVRqo8FAURMhhBYzYh3+zRcOiSoFKLLWaLQBnU6vRyM4fBIFskpipVIVUKtlMj66M8WltKscXo/N86/jbTrxu/0ahuNInI8HeVvFj0vpb0hUHkP2KeGMqEw0RqURNkigSZxILBcWgo7xKjWLYEQD/y4AD8FV+HcCeCYqpUE+S8Eus5tl8dhBnZjcnMWc6fAls9A3nQfQl1dFZahZ22VuFNuQ9s7fRTz7qLMM0sC7Cw3J0ZXl+IcK9G3Q9dslZejaNNJcI/5yfMKDfJ86Rb6fxn9/D55abYGv7WMBpv4A/BTwJ/mpy0mobzvmV08n40U/f479+By16AQH4WuAofrsihucJB3I/6up0x3ncIAaThTvh5BYOly3Ef826QV+ksM7AgpAMSgDvUA/MABUgWFgFBgHJoKpoBbMAHPAArCYOhA9JUIDFiAVCCkaqZlcZtRoFUqT3eZ2WR1OjzclPS0r0x/IyA4W5uXmhIrzC8KRkh7RPr3Levbq22/woIH9y4dVVlUMGD9m9IjhE8eOGzlq0g3TbqybWlM7fcbCeXNnzVw8f8Fsgy+1e2n1hEX1xhR/Sdn4iQsXS8yWom5Dhk6eIjVZC4sHD5s0VZMe6NFzzNh587VpGdFeo8fNXSCwO/LyB1XeUCO0OXMLBlZNq1VkZffpO2LkrNnKzGDvfsNHzZxDuT054f4VN06nXd5QpHxA3QwgbkO2vYUe2iyT6dsMBiVuulzmNovFi5uZmb621NQgboZCRW3dukVws3fv7m2lpf1ws7x8SNvQoQNwc/jw6rYJE0bhZl3d5LYpU2bg5syZi9rq6+e0UB9GxTctydfXty1erGuB0maxeErb1Kki3FSr57ctWKDCTZataautZXBTLp/dNmcOipmlUTGE09tmzADP3RR3w7/6eg7Eo+vfcey1rzSrKon//S80KCa5+Z97yQlpI3qvL/5kO7WFv2O/8X9wfE1DA/w7ev5XQ0NMh9+XL8fbPzc0cHL0VDQ0MJ/g9+XL8fbPHUf/fN29v3COnzv2Cssb8N/yTq8Ny/Ffw+/YD0DJla//53YCLAMrwS2gEdwG7gSbwVbwB7AdPAr+CJ4BTWAP2A8OgZfBUfA6eAu0gffA++AM+BT8BXwJvgHfM99ErxDLIiaWhtgXCbE3melpvhS3y24zm4KBjFS/x+twWqy9e0S7lxQRa9OvZ6/Ssm7E5hD7MoTYG2JlhhKrQyzMjXU3TJs8CduZOdNn1NROmbpu7ZrVqxqW33H7kptuu7Xx5ltWrNx459Jlm+7Zct+2Bx/Y8fDjj22+d+v9f3ho+yOPPvHHFw607Nu76/mdzz715MsHDzXv373nuZ1PP3P41WNvvtF6/J23T508+trrf3rrRNu7751+/9u/fvXFuc8/O/vxhx98//U357/8818++fSjM4Y+fRfV33X3K0eMWdm9+40Zu3Dx+g2bNr/40uGj7d9pMoM9eo4eF31t3vx1t91z7wsvv/rat99r0wPRXiNGzl2w9tYtWw8cPPb6X79WpGV0Lx0+atbsNY333d9y6M0/ffWN0pdaUjZk6Mw5q2/e9od9zW+89cV5SYq/qNvgYTdOX3XLgw/t3d964tyXUrensHhQZd2MhhUPbN+1+3jb538WuLx5+QOrbqhZvnLHI8/veefdz/4itDtyC/pXTKu9Y+PDj+587u33zn5C2Zw54fIBk6fcfufjTzzbdOr0x5/SZksoUj1h0tQlSx/741NPn3z/w4+s4yfetOzJZz44A7ApJVbVZMpqy8628vazT1vfvhHeaGJLSYzmpEnYPE7FzZtuWt+2YcMy3Hzssbva7r77j7j55JMvtr300jO4efLkK21HjryPmx980N723XdnsFWd+sPfavVH2o4e1emysr5r+/77zEy1+rW2119XqdLTv2775pu0NLn8T21vvSWT+Xzn2778MiVFLD7R1tYmErndf277y19cLpZ9t+299xjGbv+k7dNPbTYIT7e9/z4AZvNHbWfOmPJ/6PqTzr/l7Yt/u5Hu+Pv/yS6KUV33wF9qNhz7Fw7+v2/yXqngOk/237A/4Yl+6XjfdY7H+/3XeQp/4TzGf/H42uXLf0b/xGFdJO2Lj5ON+DZpXNp+zVGXHrrqEA/xXtc5F3aBycMuW5F7ncJ/xl+GtBuuuWTD7zgm7lg7u8tr27xLXd7Jsf7PjwfZV67EbmdPI5/cHfQAfUB/MAgMASPAGFANJoMbwI1gFpgHFoEloAGsBmvBenAHuAvcA+4DD4Id4HHwFNgJdoF94AB4EbwCXgVvglbwDjgFPgRnwefgC/BX0A7+xrwUvVKUnxfOyc4KpKf6CnIjoWBmRpo/xVsypHJQRf++fXr2KO0+uGrggPJ+vXtFy4aNHDV23ISJU6a6PcPHjK4ePxkF8i4ntaR+0fx5s2dNv7GGvmnxwgVz58ycUVe7Yf2ta29evWLpMrvjtnWNa25ZtbJhuc0q2PHQg/ffc/fWbXdtFD68/YE/bNl8732b7nzsj08+82zT83v2mi2PP/HU0zuf27V7n8koefO1V4+88tKLBw80S994/djRwy+/cKhl//G2t987+f4HZz7WG1pPvPPuqdMffnRWp1X87bv2r/96/os/f/6J8ofvv/3mqy/P/eWzTwtLug8dQdF33C4QPvqIRPrWnxTKgiGDhw1fctOG23Y8/Njjb75xPHqs9W8/5FZWjRxTv3j9uoe2//GJ115vO/Hd95FBA0eNXrTw1sYHH3jyqVePvf1O+7ehigFjq+cvWLvm/j888/SRo++9+/U3wf7l48bPm3vzLfdseXbnK4dPnvrrV5l9+02YPHvO6lV3b2567qWX3z99/suMPr0nTpo1c8XKrfc+v+vFFz748ItzaT17Tblh+oylDdvu27P74KEzH/35L/4e0aloWLRs+V2b9u470PLx2c8/Syktc7tqau22jXeaTc379bpPPi0GkGFFYplcpfY4HVaL0aDV+Lq10OLmwkIvGp8UY0cJQFmbxzMUN0eMcLbV1EDcZJjaNofjDty8/XZr28aNLG6KRHeicc+juPnII8a25mYxPzDaj7z5W7j5pz9p2z75RI6a+1SqT9vUmhaqe/Pf/yu3m1qtQtfdrVQWodHK7vz8H/Db99/n4bdw+NuDUAq+QZ9nZ3+F93z5ZRZ+CwTO4be//CUdv6WmfobfPv3Uh860R+PN/TtyuhfI748/dXq90Hkbz1CQwU7SOXKdHOXvaV/4BU/6/y5H+G/Y9a/60v9vNfGEh1cf6fzEc1B53queEf31nl697zr7jegk/quewuscx6L9BVfvQ083egrzOs6tzcOlubo+r3e+33scezrhOS6md3Icyxv4f+Q1PR1bXX3Zz8kPLm9rSB6Djof16CDsQ5c3dDpR562r97HvchuWcxsa+NflcFEDOkfytePv54brb3T4v59/4WB02usd3nl3J3dJ7km9GwCmJ/08fy8jENASaGGBmWFbYOEeN74jNqPyHL4THNcKcKvdd9PPXx6Mn/h+3Y7vCsGgXULmEI2zUQJq4G4a34Nr2k/REvFaSijgP6DwBwz+oBnQa0X8XfT8fRPo5Ty/hIYj85L4Ulq1W00uN5A2katOu/wVOg860S3wRWoofQe6bs5ukEu3wObdkGJ7SOH35DaOZjLt+T1g6AK6MHEb6XkQLIldiM/2DeVy6Du4EGzjc0R2nE8Ihu1mcjGJu2l88zDqArrABxCvuPp+N2SEaNc+AD+gWMHLiBb+OqLO10l0JljCneN/LeWvKUcv+LrwFu5NWMBffQDk3sT9AbC78Ar1Mp43PYDoMTXTmAkMe5CaBdyQ3vUp4gK5Hz84qD0nhH/wEF75J6Re5lbw92uFABC8wN6GepJxAEBqwh4KSKiD8HX00eu7gZk+CJ+Gt/K39psHXTgHTGUl6DxuMfom9Rr1GnvbxUXkPK4rnwveYtej82QeQtv89ykpbKEm7KUocqIZcELHGgFQZr6AuiemoIt95uIIdn0sM5aJ6UHneYGdic4T2EWBF6kJpI/x012HnCBmuZgSvBDrFuvGzry4CPWlKz0Bnh4Kvr4HSvHv+BP4EyXJGYRXBZgv/IjBhoK3MDEXR1Mnef7uBusZL32R5HS4LWp6U/S6nNovf516U0Dvpw4IDojoXiJFN9ACj+/TdxOaujGotVvTTfIC9AEbeBcRj5nbHmvHdyK3k8UGYWhV+WSplM+SqpRrhgArNA2BOhFqGQSopZYqhkAzjV60Yv0QYGTRCy47AjPif6sBrkASxos9gdcD+DWhHUXhsyE1Y/bJeo5r3s9x9SfnVD835fTWraemPEdfnH9yPtoHqf0L3ps/cMLzE7aePr0VveGbx2vAWGYcU4mkWAmMwAn8IAgKQBnoB6rAKDAR1II5YDFYCd6ITq2bOXj48PGjb1peWDJ3YVrmpGkpA8tlot5RBojQw+ZKKclMScksoUfbckM6lcpkq6yonz9/Sk3fniuW5odnT9cYho6kBN1KR6KHZ8JYh2Xs0uljx05fStd4JIpAdnaqpwYEP2ktCra+3UqqtwSDqrdb47UqVa242flJjoNB/l11gj/+qoOvOR7xWoerUUXC/vi7Nv5ujL8nPhdetX31+9WfCw1dt31XnT9xPfpkKDc3tAW//COSE8lJwS2uACdO2RnJyYlQQ/FrzIJ3ULckj409F8oNh1NgTm5uDnwdf8iNx6//wEdvwS36XvQSQlvc+5FIzqdoA25FjZH4bMvQC3wxHMyLlaPWPaFQLuWKH8QJUeMr/LUPc0O52ahBbHyH/Gft2y97XUaBHjJ4HIsJEnAGtSToXZEU9Nh5/vedq+Szi0R2lUOkY6uQLxhOnySZpCsPAJo6uZfZTm7MPNks2Q4k8u30IaKPchjcI9wOKPQBvn/NrFK3wOUJV4PNyneq2HkV1w7K2lH02f5dTgj/xAs9yRI6qavok5xheP3iYcPr6+mTlzOpvfXDhy3Gm+jqAUTHTuYWsrbbCW44ADS4XJY/V9NCF0fFTBs0R9GWGW9JpG3IonxHA4kBr4ixof2GVYo2yoaPsK0StUGa+g7A8a74whhszb/LwM/4ak9+I0Eg1l4QCQOsvcJwRxmgUhhgbom9NOe9ekg174dU/XtzxjVNObV126kp5IdODOWCZgxl84KTSKWbJm09dWrrpKYJxHbNhU9TNfTDQIo0uqiHFsiwC6Q+BBr0LgBmNFrQY0eE9ijRuxhtm2j1rsfiBut83GJ1zlVl7AQlnFG3eXNd3ea7b+xfU1teXouuhDfxc2Btef+amv7ltaQGINx2Zb1gC7MGcdcJMpBV6QXeixZu1W41bLOfFnwk+ULwtUTYqG00rLPT0wwzLDMcdB1dK5+moYcbxlnGOejR9Cj5cA1dWtijKNPVQvePqsKpVakTU1em0qlAVNR9MRqCVUTFPap6tPWgeohUL9B+JLrjUW/8UZuo+87S0mDRzsLS9Lyjc4Mw2Mx4j65Mh+nNMhs+kEEH6mj/bpm590HKCdfGfQLquupCdfyJ/wkamqLqYOxCiRq/Izby68dgNV/QkaQ6oRivJ4XCCamNHgbnqWYi4RSc8ySlM47uTm1YgBeMG8n6dsbwMAw/+xT39uNPcO889QwM71jPXdq8CTJ33AGZTZu5S9zNnmDQ4w6FKAnfCHKi0qr77qssC2+ePOVuZs3jXOsTj6PvPgWDjz8BI49X38Fd3HgHF9u0CdJ3bISCO7i95Pvu+HnQOzchZdOmlInTpiHxhy2IV3sJr6zIB0TAS1EDhh8zhMlOy4jYVB5V1OzKVWE+GA1VhokGao5hpYEyiEAkuDgHf5aD2LE/oyqjLYPKQJ5xfFQhCi7LjixLyy71pZVqnVhjUtBxzqNzfCt9lM+Mv2Q+qp3rg75mhiy5XKmF2mbkS8fvk5lz8d1ZhCft1fNU7dWq8xmqeeh5Dj2+U32HGIO4wWXwbKkOns8oUSU5czVT6E4C7O4szCQ3TYEfr09i8q9iwvA4XvB1T5A0YsfCd0+ZvDlcVnnffVXXYs6NuhZiBO9EBDPRS9UVt7CvYATysGVwcnTEKAbq0gMBrTozI0MjsjscQhcrEDh1ahHLmDTpmS47AwJ2l06dnsmKREGLVpORkRrQ6tBXBEKHI9Up0DmdAuE2QWBbhmab1rnN4cJhzsfNgozFoZ1UsIUujyp8clluaqpvZ4pCmetNwbvEhTujRstiba4DLxDWmczaUo1LUCp0lDozSgO5O1MVeCn7fqFmsTK3ZKesBR6KKkyUMWjcabGYoWknMKNd+7ypi53OADpwT4qvT7QFRZyfEINnJmuQTBf4uz3IMpcL7efMeK7BpGo3E+ads6i+RREcOtaEP7GY2slURGLBazs52qJqV32BK6k2KrJNGY2KhmPJBogv4jSSIm+NCtWxkuTLMdLKCYFqGFE7oBE9DEaD0a13C4RQCBVQqPaqs6Ef4gJs+BbIUliAHuiVj6WwPOB6AtmQvnVgzfbR0JPL/bm/I5WCg7ld2uXQXsR9MeXuGQPn3jeY+ygC7T17S7nn4WBxzz7cuRBMueHB8d7VP61vvLB27YV1G34SjOCahGX9oC2P+/PEiknVfV58iDsbhpbyIhnXBIcoS7tzX0egY/hj0/tM3z4cOou48327i/qv+Qf++jp0kn+sQXJzgevPStm/ADPSzNkvAgs1H2ipBcBNzW8GUqlAgEYa1PzdtAh5y4WABSJq4W4BYNG+vehDR8qL6HgjOl6J3h0H0Ev+3APUAsaIXhfC43Px+hV1Eblx7xxeOIcakWA4WMI7gfhNN/g+k3gekgjv4ekuzou2wbe4vGIuFx6v/fGu2/65ft3PG7jP2+s/XwG1R45C7YrPYSs3u5jrD/cXw7tvuXT7uosbbvt53TvcO/TJJX9eepRrh9qjS/+8hOjJHO4i2ygYDkwgFTwSdVVRVTTVH1ZQFXRvE66uZzSZDCjuYAwGPas1u15GXZKh/pkxLmjEOD8qpmkGHaS3QwwMOhK97TEYvBiTPXq93YshEaGvqNC7vTMkcTBi6NkeL7mKCwjyXgAbl3AwgitZot1FpDJBNRI0o1ZIQwwKtuUYJISKUQz92i4QMYdTHi3ayN2/ZduGnzE8MHKmcjSsi31pcnWCSTBcFatRUn1iYAB317qfb0MgfQjDVprm/pEXa74KKhSndUO9EzBtwAsao2msb7h/dr7JPcN1o5t2OQ0ymgJCs1lEFmtqVNptUbVGospF0dNze2RaFN/A56ISAwAyg89otLA4/Yas1oCTILhs5hScBAGPtyyDYqYfzTFTZZ8bep8ndWXROA5pLn5BUY0F6201Mr3GCL/a3wGZ+IrPVL8DuVZ3QTjfn0jjghQNhYVuy0yor1g1dmh5fhAOeGy98PJXwpa3mKy1w8be7Mp6K1TRi2mb+fSlxj4TVxUFxm3eOVXs871/auLEm8dUFA97In/YzaTvBSjIEKG+R8DNzc5t3lzdNk0L9VE015Ke65RBWSOMbAPUNgAlzp0hO8SVIh+203Z7arZuZ5kRVhknGpuMtNEoVuYtSz0Ij4Bsau2eh8UQjduP7FYuyz0ItfAzPrqdF4udJ3V1q9vjb6jjJNFB9bnghfYLSFPSYUG8Xkm8q3ixaacaj4lkPdj7Y2AgskpMxeXnRY/nD6mF3ZvGLXxky4SS2oD5ocWLdvQZrrZ6pm3eMa90bdiby4wZX7rD4/VE3pitci6f/0j9wu2RPuXpCx58cM7oKWms6MGFNz3aPeIbvf1A93QnwqXsylfMaoSLDZRFpSP10GJSMhQQSA/CVUALV0U1USA1PgmUT7q2I8Ew2+OMrsacLmlHQ31Le7sRp+OsZkky6XgvEMHJTuB1vNQU54LHl9iy07fMnjWke6qrZNjMWVtHrXxsQLGpvu2jhzP6LiqZc29ltwVzi4dsqRl35OG2tTfyMhu98hV9GtGnBqUvIDXsDlxI60v2MgqFCLn+IbtFbwF8o530TkWbglKYNUn6Bl0wnTefA3i99TkLtk7YtGNaMKKpfkQdJR5z873jK55cN9QaHHKT5cEbttczbVt3vlFb+Vnzptw+N233vrLg1EOIBt+VM/QZdhhwgCHNDptBIrGpX6LwlIYN2VADECO7IZFoDiHTYEZ2gpjNqdhGwFeI2XwfvS4C5+YiswDCkNiHIDYcSDrwio0wyQtkh954Hia1rpNQwPOpzxZUlWTlTi0q7D/GFn1g/KyV25ZVTmKHKXRFgftqajN6TzS7Lr+4pHHIsmk33pkdz520ig2z3yN6ZzYrZQJEsqqFWrQbQvUhQrYMG32B7UVCPbKByNov2CMWa8yHMPloW/OLXYi1A3UEBslURRHuB2/4+K74OpNuMKrZLl2hDLStbOvEWTffvzSte5/YzmRfmH/889Kzy1cMbZg67S6FnTp54PILSxoHL5vKdwfZ+NCVbPpd9iC596UtutLEwA8YWKvZr6FaUJBhhx/YoUGrUSqMCrPdIZOb5BabUyqxSshvMkAMrBKlGIrEYqHKZFTI5UKdUgVVQtpm19KMxWygX4YQmoxWGi+Oj4JJ4GHwPDiMhq9up0NDs1KZkm5Csq8Qy2mVBEqC84yRs/OM4VZjWHW62hiOt0HwWLD6NSRurWdbsd5PqEYNVUPjMfSnuuYVW7/51dXz5pMYg0VPYV4BeUbUPvQs0AvVBSz6gH73jZHc/SPfQH8jYQ1+5/7M3Q8fHsMdgK6Huedgxpgnx8Dv8Es/7rOH4XjuLdTmNGNWwe8e5jREHhL1e4JgfBRFqCDH6/I5zB6PWCEx0CqZWOXwuuUeEAwGfGKvzOMJGMxWIxXw0lbI16+JHUYdOkxeI6qzqAGDhw9/cvjtw6rYcdxQnQ7j2ZJk9R9vXiQPPTuqAOGcgok7jnEeLL4Iz/54MaCj6I8vCPScTwU3cPX4Kdf3e2tlwYNT4Vy+LhCcUVFRAT2kOBA1wLWE+xFtc/cMtaQJ5T4yMQuykLCksBuBDwyLBnwel0MAU1JsdoVWpVeLFS69T4OzOvlSVGqoVovtSErEAqtIAlD/gmfDrdhYo77FO3ji8OGzh1XHw7HDxyOoi2RdJyI9Es/qnOhjHp+DFqfdxb9eRKiUpyLWvlzZFJP8SfRnV/FZiLOeeuopajy3YJVNmZJS6BgB70DUn3rfJFd558aeragg9EvifCoAU6LhAgiKfCnpVhdik1xsojViUFAQShdLFf7VHpfGI12dovJ4Qiar1UyFrmLVx4dx1kpVDKeJwzxD7EJM+qRVFTtxGL1exS1MvxdraFd+4RFnRIc8M+FYuBiSVAgdXCtLHSx3CZqNyiTrhpiqVM6XdHqVpp9gytRV+WPKcnOT7Ftjn3yGhsM6+HeLc+qnNPfKcIdHiHhd3MDrugdhkIEw8IF8cFs0pS4PFuX1z6OK0vqn3ZhGj0yBI7ywnrqVokZQcBSE2dlZqS10VjSENZcChSGZIMujdxiUJr2AScuJhLJMaXoQUoWoUEiZGUhzWF2UTGmVizDTEV5hdZzpn4TbwwQmJNOHjyOJrsYmOidUHf+DOqEgjkWnSkhxAcCgYTNuEPLSoMeiQHLvMRlL5h2YcrPNPzA3dgihpjtyxIrggn97eMLqIeXnNvQYERn87bfTuy0o702f2jet2sYtIggVOhdSz1fMx0lsrb5pYza+XunTchXf6sYMwzWnuL5sHdHn7gijzMKS0SXUjWFYHoa1Adg7fVo6VZ96ayo1Gpm1QGbAQ0EdRUFKEMzMDGGsfGll6+RQrssXeFyW/G5pAQHFMMG8SJrL6qHUUpMyM8hLU7istTWOEUmBjpQCYVNUrfoYmf0TmqJGVUZjwzFYnUApHcIERnzeDD6aEXhdZtgZJb2KJd4YknSD6nCEHM7WcfdyeRGX1ZVlMjqyClUOozfYO7eYW4EFDH63f/idw/pxu6FpRHHlstjl7bd0myrWasWP1S6nllJULP39FK0/JJSjGMimh28zfTF2GueU4fXc9xXcssUZxXL6xZsf0MaOwx5VfO3P/txaej2bDXJRZNwT9IOKaGa/QrgoDdakwRFpcJ0WNvaDeUxJSmaKVtOrn0zqk4rLSosK/akSiU/qa6HejJpSJbpUiTAVjkqFfVNhampuUybM7G+2tMDaaJpD8ZEU3ihdIqVGS2GFFKZJIZSqpZRU2idnhwIOVkCFL7VXaUkLtEYz84ryFDaHjbLZNHl5PSoKYaFW7/OneIQSKcjNDWVS/cqKe2TKxIyIkoKyk+EwSU6vag8HW4OH+YTa1YRTwWp1BO0OB5EVqyblzMmf6mR7WPVx9Qm8Pa8Rc454ooRHOnYMmpDoHybDYfIFH2Ymipj8Xtqr5dMqakm+bSck89ckA642QsczdvM8x0GtMF+rFghptIPGaQ/p9XNrplMbvYXF4oa+qzbu7DZ1dlpJbnqQoujRwxdNWhrJbiy/Y6xHY5ApVDJdd+4l/UBnz8GZa62OgSPWOtfce+9slQVy2+DCnKaNNZ4ALLXaXZFukybPi+aJYCNX5x6csZZ7c59WIpR1h4+mTMz/RMathNUuLbdKAadVzS7NQDqjQLwWIF7bUAyxNerqrx+jp9L0hXoqFUKl0261KWws1ENKBoFcDgDmbYpNobMpAjZocwpYp0Oh06RYTC7HXMcqB+0ANiekNTo7Zp3carII5Ao6EwVbiFllxxEzEEtaj8RaD+PfGDAfWg/HWk+o3v64FbGgkRSNR4BXY+iZY+wxfoJQDInNFRBLQzBHBgbbXORbtLRXTQu43uzISo/fXtRjcCi8ve9e+11Lqw0BZ9vjR3az2ZdaVg8Zmt/dgfznS+F5VJ07596UWu49eD/n4vriHMhebim7nR2oEdD8mEh+haL/C/nLYrA42l+Qa8il9BFIRyAsLgB2lZ2y2/VCWcqnBXBSwdyCVQV0QfeMgNObnalPAV6V9zASC702MzsszEgLZIFim9BpFdiRDwuWvYbk6HAZcqllxGpUx8LIwB7G0lcdO4EtLvJFxGiwXhTyKmHnCovYIvCpSxOetsPDxpMu89JG/5ePuWH4/X31N6IwTh7yhKYvo0V+W1+uG1JYh8qiDyqgJnt4ZPiox3O1CsM07u6SMAV9g2RDYe85rnEe4y2crb8yqFOlpGiNq+nuH1iIM54y3le6O/o098JIdy6uqYcw+wOytaXgSDRwawlcVAJv6AYLusHUIjhOCCuEcLwA9qdgIQXTKQhLi3NyMooKirD89Axk6AJFxYGMjILc3NQCWFBQzLKiouIij0Skk4iKJKLiqEtr8gZUEo+pQBLQ5qLAzBr2UMWlKlZrZdQijOVhjGWYf8NZX1HwfeLtEwhOFJuoXmlkiAkOm4JqpNcR9NooQlaZ4fclYE46MS/l9uaFkYpeW/GvIwE0TrukBjhvLNmBx0xiYq/ZP3j6cY01s8q5TLl1enbspXiZyoycENUzOzhCwsC9JdbxTvj3oSPDlVwNvLDAO2Q8txTe6ivL6AfbuAG1bj5TNT2zzm3CdSYziw2V3GR415g0RzcUF+Q6yrkbOOV8a6mS1AejGBmSzzzwanQOnQ1HZcGDQgjzQmlpjBciQcwOub06N371BgqQ3c0MKZWSbBbKWYiQzg6JJNkSUUooWxfKvi8EJ4VgqMBh1xjcTkkKMEADg76SIXGzadaAwIGMCgjliVilxsqoJAnkwwh6LMcxpMeHw9UJWX6NyHJjhgq80sgiZYbqiAmZVRRrYTa0JpmATGknNiBpR/DnJ+A3XivgJNlULilOqoQ4PzqSc0bmE3LP9+iRxn0ZMg7isueZlA6lVR9QQ1X2X/vLRf3gxk1zv/lmQmooxVzKcSmU3xiB07j31phlKPyNuIbSPc+Y5Wrv3MsL3+mllcmCjMvF1H7Ivb/YF1RIsB2wcEuZp5GMq0D3qEugVCg9rEDHsgKFAqo0cqlMxsoEXgXFKr00EUmcdPo4DEaCrRHV6dZIkI8DcIRMpcM86MaZu7xaN3QzT2OBiQ2la7jK3bkWfaqN/ubyWvo2IhLM6XHZS+CwSwJ+jIJs0Ux6C9BiGqBYJE4BUId/12covUalRrogDqm1AhEMCSU0T8NxbFs6iOBpEEO32puaJAMRUuCmZ8bupwZgFLnh1CTuZKUh12Rl0gQ0oOdcPsm9zKXQAUaaFa7g+Bi0HABkJ2cAC8gAU6OlKCAwpKWmURZpQEotkcD1gvsElNpq0XpgyAqt1qzUEqXIKQqKaJHIkybTaJQy2hpIQ0GVhY+jIjjTOvLQQVU7ROPCdjzQOBY7gcfM8bgpT4DTyqtVJG0w9gG8CSxGQ+qEUYwXgGC3cyteuJM7vfu5l1+FGeGjoUhNGq+C3AqFZeqQHpeWTFq0MlYfiezfC1Nh+J3309Mvra11W9SmefQLkw3pVsNHz3J/5y7evZ2vGcr1JTVDu4F7opock9nkCefowuGcA0aIRmkRbMfsBqPOYDAqbw3DRWEYFovNhlzgMRhKQh6/y4yPcPvnhVeHqQFmaDaEaU9e0JoTieRQTo/VZHSJ1HJWCXAoGSEwIBRwxnJkjYKx46oTYYRG7DgeMaNdrYmQstEUlykfrgLB51VOJtzPU0PvdUqW0p1LlgrCxTO3jqsb081sceYWl1VMtipiP7q7lC0VmtK7BToXLqUmPrq4V++sQpfZMqr6hvz3mCWXbusoYOpcQNePDijNGkm8hKlzAZIV45XPWTxm4+MKhIod2Kwqq8Pq0ah0Go1Kr9doHEIh7YQU7aCVciXGK9VB6xwOWiyWyx0OAL1Ou12l0enkEgktFFqNVpGeUipVYoDAIvWrghH+X01y9gehOYjMTULvGhUogDimhhHiAxJ7VWQv3olXUpLiRP4udd+SJZEpykHJx3uKp8BnRpgjpZzXy6UVVQ+jjEOK0maf/5a+9XSV3xkU+nxKU2jzpceYunVDWJ+PyXZnTuT+K/YxlUJ0JgPhcDPCAetMVTR4Yzq8EcXREigQGAT1glsFjKgkNTWLsnnUQIOURK1WysRJJaGuVpLjqI0kop1XEK1bnx9xGQ1qnLneQ4arCYfFqpNpzvniIRnw5hfuhAGsHtypzuoBb+6sHuxArCDcR9wJrCDMMl5BLveOKwhUQAFWEFKjknmNbgJ2MCfaXaXS14vhDWLYVw/FeqM+RSrWScVKIIVSo8hkNIWEIp1QBAYIodAoZE2URWiUKvRqq1IgEqO48FhZLHwsHCxrjbSGEQ/PVpuOE6sFzSrUbuXbqL9qnmto7I37itiFJyyJa+ar+GE9YF4rT1/s7ObmXkznDvgK1WHYZBusP/Vh1f6icCkdHTF2yOUfaHa0XSzy+fq6w5yA0rxiccVrqF35XHgZ2bcwrGqWKsSyniNkLVe+ikpxS0G2lXjbi1t+f2aLAg5QwGwFtCmgRAG/VcAKByxyQIXD7sDSnC9X6OQKo3yUnJI7XbKRmTWZlCwzO9PjkulcLtkAKcxEAEmtUuqiFP5VClOlMCgVS/FXx2cHddnZQSAVZ4gpcXo2zHb5fC6DwRpRwv9SQqXVbvWolTq1Uq8eYocuO4R2NY5LXeKVgjsFlKARhUN0Dp0td8hcPqtRrctMsxpSKbtUplAi9Tl28liw7BgGHT9wKI6wr26txn7DjIdFZxMcqJ6HQUcih1lBGKNKcGPevHlxa4TMEtKqk9g6dfpwHvkqvukK80zAMw1rmZjnnDfBOaglM88dO8SYlcLLhdmGYao0k0vBrUrj3uJaU7hZWTL/LPiTaVYmlH5ernDb8rXplCplZhZkoGPkM3cw32aX+pzIsO+kp15+kKlZaRjg8w1NaYgJqcbWtFC6WuDzjQmvijnpon+QOP+cYCuS4SzQFl3gdvtul0KLVCINmS06s9lykwRKbOLhPtjPB31imzjF79P5fWkioSjkT9P5/WlA6Lc5nTat1rhQBmVGszFFIdMpZBqFq4d5iJkymyeiIZKQTaMCKIbxGHUKtcQitjmtWrfAjOReJu1gBGIBz4u4EqCQFfHBctZ0LM6GDi7gfbx9S4CNf7pPcuJqHaE71ISvdenvskV0RrC1PL3eVeziWtO/4H70cR9ZzI4oXDVSfezVXGOasRjuXSp6+08DD3ZoENU/tp+melkcCp9PUGjPjv0N7mzsZlbgeuvlel3s7xRNtIoCPa6co/fQ9yIvEAD/jD603gAbtXCrCtYL4B9ZeDsLl7FwMQOXCuGNQohQcT2kgRPtsNReaaeCdqiwO+yUxq6xm/RpfoMfjfkFAvSeIhXopAL/89LDUmqHFE7C8wdQamBNBlOIZnU065xNb6RP0LSSnkhTtAsFtSY7DawOgaEmrT6NqkmH6WkS2isW6nUoOhF4lQIpK0AMOYwYgLyJsaiVuOIgskyHMTvOVlfHNcKEFAH94QA3PleAB6sQDUFMQX5GoRU5bzxbEJ8uwOML3r3QQn9BauLHLCXk645isWdz45UQCvLpPbk6t4M7lP79Mu0KzcLa/mOWD93+qVGkrYQZXDQ/LVRoGzqansOo7f0uf0d5CjOL8rrNvnV0tC7Py22g3Ligp8X3UFqPPuH8cm8qb9e8KFrEsUwmKIk6YAbItil1Tplf4EFmwQsEAiUSSnun6T8yV3o8hkLZGJkfPaw6fZZM9GIldf/KCIlkplW7cckJ5u8+qtzTJ7Y+XrSnY0TUJyeU5ZcwVP3IKrkPtq31a7ipyfHPjDo3qaBjMhTrK7nlA+Zg+rMBoI+gGNgPiqN2mArSLUqtXeZhU7R+L2BZpd1itQkw+ZJO5J+9mnwfLhjm1l8zhuYND6LdDgnl9BEfrJrCLaBEHkcPrs8Ei5YSeu094aFZOgm8fRQi+nLdyL/0V0b0Gp8vw1kHzw+SRvTq1NR866QjiGAK9LnyOTMa2RUrSAXjo9qlTjjaUeegigT9BVQ+1ZeiQAsdjkpVNpdtk422pahFZFspV6ldakotl7laYJ89JqHa1wKtuxgpX84G36hZfeKTdtXZT6rjAQCefPWlxusu6VEkzKqTFZjiU66IHynM6PoN3Hc/3bFixpxDZ6FWrO6eP+jx6RN35ETn9VEIYDH84vA9TTR9/4YzL61YK0op4rZyS/pQfeZlDsvJ3Nb48c3zN1d5x8WaglifByK/v45+Ho09y8Cd0e63ReCYCByRA0eGYEGoX4ha54HTPUs9VIEOrs6Ck7LmZlFZFwryUByoVCFeFgCVChTQPdbnw/zsFjozavKplEqQV+DLzg6X+NKFtnCOS2Q0unBRv2CrCncc30dwAgd7MNgeruZvaq3GFV5U6PPq6k5z0eTmEwqXT8OFpgRCBY1r9fjJxBGu2ROfJnGTSbn8AuhOjSdUpodDKLZk+wypLrPY8P/Q9iZwclTV/njdWnrf932v3vd1umfpmn1fM8kkmUySyb6RBJIAIUASiIadBNlEQFlFZZUdFQERFQkPfYjLM3n4RFQgPNSnPk268ru3qnumZyZR/h/fP5OZqaqprjr33O8995xzzz1H4ZDYZJ54k9+d9Zsoo23d51fdsiF/8d5n7li7tnJ47frPLv9MrPIgeIhUm9fmx9rbwKBYI3EyObfGRmtjReVkl6MUs9rizS6vc+fQlV9b+eGVhzas/+qbF+xeezHQLvU1MK1tKO8Ge+Y9/EnqOiyFtTOeCNQXLT6VWuTTajCfyof7fC6DWqHSaOw6gzQRIgFvK0CTDhreKn6SyFTeSKveSCeQyURkeceyWqfnNT9U6HBORRvIlJnSgGg+xjvSzV/6PmFVW50BCftheNfejC+Y9juntGpDPBEzGZ2xBqXd5E1QgZxV/94nla8u8a4wKJS+nW++6XCl/IVOXXiKmHEwc7VaO6G8fx5iXwNn1Vbs88zAYRpscYNLbaDXBhpsYLMaLFWDfRKwTQKWS8AS4QbhhUJiCb4BxzcAtHKRCTabpoOACY4EcXcwFcSxoCqIB01Bk5eEw+RJi6Xdi4aLalgO5Np40NRAi6UOGqWePQmldfoEGibIlOQLlHEeXq5k1tScfwABQSecKU4DR40W5ZvPVxeuOBvAAYyoipPRg0rT8MBCxZ5w7K3LtzY2HTvw1t6NLcz6DUf9HVkX7trcvR0+p3WYElGObGfQHHNrte6YufqbeOzuqx69ZP/+/Q9c+8ill19eaqo8a0u30WPX/s91q13Ouy77/lGRUiQJdmYdnbVP6dxR7nd1DY+YhjIwhtYqFbjI5zOZ7Al43ea0q9QauzPmjIV8tFltU9uMZnPISCusKkmIJqxAUC0iBnnCsUTFVyEEiRPH0hBH8CcXogOhlEpqC7VSZ1UpH8hw9raaqzqnrp5wixbwQmwY/42rTSeXa9tdFaskrvHYp3/7zGALGYvJTLbhZ0SK/BdWrs/gj75PBy3dldf6TT76B1MmLRhvGASDi8x2YCqrTO1rMPzMj9lu4MIfhN3owQrPOF0mN4ZBsfg+o5KZSNLksjs9AtyjU0g4kxmSroKjALk5VG9Ayy/NTbm1sHFCVQ1HrxV6qnmSChngamlubpH8bFtKoZFbHRpaJtSK1CqT+EELvgn+5fSz7AfNGZHAZE3ZFoPDB1RCsaGds3fAncRJOIe6sHVMEccPQFPGhmE7bDeihQmLRiM1arX7jaDFCJRGpzGBYmLMQTEUKmKLy6XT4bjaqoHis5z+CFILvxJFSPzUMW4RAjbiWLrqqFRBLTzxKYqT/+Oa4dTAPy7xzesFB9gukoL2zgT2IaM9bL7NjLc2d2eS6XS3aFiOYd3PAe/T0HywLmuGR8weWiWHohoqwyqlSwkNcaNrn+ta1xdcxDYXmHSBARdodIGwC0hdVjgaiv1O2M79aSKdbi0ear25Fb+gFaxtBeOtoL0VZFsB3QrIVl0rLmoNGYP9w/0KRVHSK8El/eJiMJRKxULEkjG85iCBoC1nOD8uQu/K2ijmAom40NXZUyQXExDZPN5PIuFYVKMrXDAGNoVQAhmaAP4qprkwompFMD4Ihq9UxbtV0CqD119zNlWrVRlRpJqQD8+qFWsk7n5kWaMxYd7atsZsF9K03GuITE5uu6ynt1CiH3+8p3dg585HtuzLmy1uCU1rEonFS1Zsbu+INH+w+jJ/T+/FF32zMasw7+ltd/npSDv7jT0pLRN7+UJHAvyo9zy6J5lsa1ueWRezrV1TKl27+KbNW3JmZ4KNHB4ZjSeY8mg53X9ZZsBRPDp6x84dYiD6yVUNec6H2UW+B3Ebx3oYv8Zus3vUGp1arZF4MMxmUyetZotFbdF4bbja7lWJooGqTwpOvJWqL5OTDoliccadybme4LwaJyJ1/kStGzgIo4OrXgqnG/K9YOuiSHzTBfuY7PTSMfqbyNm5LZW0mKvuTs/46s25+Fh3yeCKxQphusT+R6CBVqvTK/qbR5JamnzHZIyFL0WeUNzWsKyc7/DLI7lIjsfuQ/hBfDXELoXJniL9GFBBqqFWpOViLR8Cz7En4A0fDFfWw0E3e68a0zNigUyGzXwEKhfHah/T1kWWc494yZfJ0PC7+ijwVsYHz+D3fBqUzxCAJDAcPvJVrqS6mjZSkIwjQY4OxS87H2TBgs/gJKphUPsMUNMFSg1eZ08EwRH8IDjzYOcvK3/E5tHvgAIRvQvfKTgADX0B/04Ie6gXHau9eG5DEBF1LeGJmduWhe9AtBG1dxBz3lEltD4Mnyea/drMW6rU178FYH34QcIH3yHEFE8LcD//WL5mNZ/lEmyD7PoFx7IvDPN9N/sZLdd3uB/aazWCVPUfrm907UF1zeYeWE8P/2wrfHYCa8SijB4D+aTVIqet0DKzugT+mMuvh+85+TY/X6LAVdUJrrCgtuCYKdKLFASuUo0Q1agRID2Bq9Dr8ddzqK9J6ks2OAx+q5KO0nTLUCgw1NOka1J4IjkntE2itL9lJLTsKD5cpZgox53FiEXjDFl9g2NLk5nRokMfbgmmrUm/sT0TGhpdksyOFGyrwc66juR5rOHaBHVrDLVGZXVZk1bi7I2aQq361C36tK341MRj82iOM2bM4JXqVXqXPqknEvqEPqzyW8N+wgqJfvukai7VXG1BnmCuRKMCFwb4ukGI4BlbgNBEji4LjbT4IYHJlCsb8coh0T1DgdBQCw2vKa200dGQ9EmJ8srVtsJINrlkdCiUaTf6k9Z0sCWsdxRHM8mlY4M+a8ipsUSKTn7MILqzkG60f1X5jNCPUX6c5y0nUdQB+N2Hf3Ar24YESMUwjA9Unqq2l/+c/CkCA+gzGVSSVAwKAH+9cmALfgB+4MCWyoFZ/tTuxwgc1O7XAiPo4+7DP+Rvl2JptktwJbQpoKTDzJgdc2Olav6rNdhm7B5m88jqZtCsLOz3AR82fmACnD8BmImRidUTxIRjtXun+4CbGHUDlzvpZtyE27xWLlcbGLP6wNIbJ8Hlk2B4ctXkjkli0rLDvt9+o51YaQcJe9k+bCfs+hUkiWkY/YFVImyjWI0lMpDKtOWXFhRBdkz1NnKNcD8sqhMW5GU5pnoHnXI/ylOvwv9I8eGLncMRzcVIBtxcrkb4ra3+Bllo6kL9HE3GcHqeKY3j1+qEORQ+jOZxiNuZAEsDXXsCnO8zaJNYvuB1gDT+kqjg9TaI8DcqWVGD11sQVRhgI82nfou+H8W/VWlH30BzUCIVawVWDWUU6R1+a8BsvB1d0gjrL7GnwC72evT9pMYlvEDkUqtdwvNFTlwVSqdDTegHIJrYR5vwi5sqY03kbevSJkpAySmTyyF2660ul+3vMv6aTDB77YMm8lAT2281maz3WsxmC8TDaQz2cZy9A+HheVSQ6gkA5+yTyRTKZCmI//nHkjjbNV6778xuiE7L89B8CDzFCKE8f54IwE9CUxr2DPpQgROf1OnIX9kTkvhf72SvZY8cGR//BYe9U2dmnmF7QoB/g/uskAg8yWAH4EPQI6AQhk+huacYqZ+z1/71C5IEe+KvbNcvxsePIPyuY68Dl2Lfh5jUfQsTEP+FJm34Uw6JeAcOFQqOVVR3jVuKcRDg0mj/xtLEihUTpY390aXF9YNxwmm5Ynr6kMVNJIc2cPmOMezM6yRGbeL251kxOyOXaQTQ6NRgFitlQZVhNbOV1ufMDHXHyBH9cW2G6KMzWZ8vmwEarsor8euaWGVttSNiM6rfyo/JNHz/7+D7HWhW0lNGncKmIJFrHe2eLUNZyG9KC3DemXzBiEoAgwxAUjZPPKxrv6Rr42uLb+2MUwJNbOS8VkK3/PRbniXTm3OuslnhdbSVz3tw+zZLziJvOHDFvgz5zVMWfdRvknLvRm1/pvZug5h/NzX7bhDgxxAKQNIJhAFUdhjZDUiag6Z5797OnP5oOZGsvpua+/LCQfjyUx3k+9WXExiNLSaXkX/HELMd2CAjETI75PvluBzle/85oyVcZmZEi/ahEdoQDi0ltBX154zYJcCURJnACcyM/BaWSnrK9PaU5ZjFrKqkuSMk/3Lc/7ouqu86ctmpN4gvnp4ms5VKtddq3/j1bHwJuAncOsmG8aZaf50Wz9VxFmEb8aVEkpPXnUwUVfUMks+RpAgzYUHsOYzEXGSSxEkxYChAkY8LBcTjGP44oB4XQKieOHn8pOr4SWheoChILh5sCpIL1Kgg+NLKKZxC3/jn2dO3AZJt5H7xWB078xsiBeV3CCtifZiTURb8Wq0QlJg2IiXssvP+PS4AiNt4l9Fy1kULgVwRnAirTcC8Dwt9EcjTqjMYOXBpFUDL15vmbxUKwPdCXTghM8d9eocj7raHrfKW9Qc7hq7a0Oh2TR7xOMebNJrmkgDHGxXBkSSjcYSMxqBD43KTqtOPWYLyuEOgc4bMdD5v86XssQZr59Zef3hkz0DfwNDGe7vb2e/shNby0CGf0SmLGPB27yIcY5LoERpH0JhwuRFOp88oiS9S12KXYkXGwrS2tvRnBzJLQhNBxy5MojlPo1lj36addsCJAtryaVSY+/gxVJwbnaFvNHaBgbO1kIUBZ3Yo9fUtREFBnP0X2pZGBKAVkjv7LxCAo6K6F6OQxzGxSCBFCNV4/FBbGWRMicbhgiXb0p+i2/omGgNt3RNN9MDSrR30+MpNxcjgxNa+wMDy7b353u3LBwK92yYGI8VNK8fpjq1LB+imie62QGlpXxud6m/JWgrDjQlT64Am2+1Dr5AIhdS1CpUCTgsBtU4HTS5JpqB9F/aQCU80Bq2KdwMNIas405mmte/6Ohv8guJQMWZ4N9aZ8chKI6W4kX0XuIxxeCjzZDpj7xpi8AaBv6HT966WTndmxNZQQ+BdhTXYmMBNvrj5XW0hQ3vgmwJwIlKoEA6L4AB+AVXk9opbMSMjVZGMYb8ESLDH0YQAxyXSp9E8e679tosQyMGTsXI5FmMY9o14mYnGmDJuvI14nolVL1d/89jXgRvIMnkrpsNcWBQLPOvu0ge6rAo1qn8pyRKXCuHB13VZBZZ4r/I/751UvcNpT5xi5/dxBjqSZSTnrj3HZmr4/OvWNx5lv8l0rdZFBVetmARP9/VvELPGkZ07R4Z37hjJdHdn4Dd+3xWfy169ZP3hG7+1ejn4085h/u+d3Zl0T086083pWmd+ReTwH3K6FkquDkV6GulaFNLNfljZvwU/6OR1rbn34gAjxFW9rMDpZQe3VPb3V7U4nOcD8QeOD0lGhenBav1O/QH9J3pS/4/YcWzq/E/BjnOzgOsP2ENzmj7E8P3E8HJRh7WTZfxBjrY4o1RawQ7rfuuN1jNW0qo/F2n/v1DGXjJLGbSV2S2cTSrE1M8SfoEAKr4aOLNz8Q/aai7zh24FHvYEu0UITn95+PSXufmxH36O4D6nY8SkHwBKqKI0nE6QODlbIQ6cx54AnlvZLcSyYWLZ/57h7XPwwT/xK4APiINDp4+h98B7ieq9wI+R1Xur5ZbQ05+DN2eGTu+v+gtQe8CH3P0U8JMKKPiPzRQHaoEN6QEfnj42RBzEZttRvR/Roqh/Pk7Auz3w/v1DRNUf0YVh1KPEzVDvVzyNGQUStB52rIzeUHNgwxdV7SV4iO/e+MDl+fzlD2wkSqd/dM3bR/r7j7x9DZEg/MalhzdsOLzUuD286YnPfvaJzZHtC56vgA9HnmXu+dqcuzZHQdKqZqS3i0jUHnr6R0Rp5mX+7ZHN6LGbwttrL+JxOM72Eb+lboCWfgAzMzKH5Ha7WK3DbtcDNVbmomA4e18PdSo8p8JQ5V4ceelxauEl/NLb1h+5E6T/su/uIbel7zLw1txzdgc9sOEouOZtkAdntoc7PmJv/e47j13z5Tu6znEd0heH9L08Sx+mu10bUEsct0ud2nr60OpTLotDZdaAqXU4nLnohZfA59df1mdxD9297y8gfeeR9bext8y/sKPrji9f89g73wVbPuoIb2cB+/rb7IVHNwzQ57jOydujZ94jJ6HagvRiL+ZlDCOO1Y6dDsIB1bdVsh2y/TJCJtAIkaSaSpePTSFwzKxJoyiimeP66wCLtbXF4Df+7eoBO4UO4m3t+I+587rvigb9bI3H2hbQQzPGVSZU/5kwOYSCEQ2qZE9oZDL453JaVaOI+tcoss0nCP+4NRZrb4vHWvn9DV+BNO2eoSmBBRiTZiS8OrwzTIRlPsinKokCR41P6MdcThHnoKv+OknW0wEpO/3beRdmmTfLNPzjszAS5QLh6N5VR3cjlmXcDsFIfnV+Z57IJ2f4acKStfbA5kCevp1Ov31sCjF4XjM+zfGcppqqlIPeajNmDmb4X2sgmKyxHVxUaxJ79dwj1LjZv8IxVtOVPVgccz+PeYgxRuJlQlJT134lUD4HnnlCTGDl96ZOlivvQxV81lc/O+XkqtEUnKPea6w3/l5qPTrZ2jP95oOvdIbd8aZ1E2sO+5oGU8KQIt7aGo+3tYLnrr5/0x29W5de/Oj5fYtSPts2Ojl26/6Wved/7oHLL21NoNsSrVAW/oF0gOcFDpSXhZHiciFGSYSYUiR8Dn8EMvztYyDx9vHXVG8j4YtI0SPfBCQM0gqe37ThNfifelWQM13SeFS+nCzYLs3fLF6Qd8bw4ry0Mwlul/S/mFQGYB/hS8CLRBC+Q/YClBlD3JPnPhcsjja3RCItzUSwORppaYlEm/k5ZtOZ98BNUNkxYspnAPaMjNFAgFXe4+Qyt2ZaXQ2pe9RNG88XC4VSWqNLlfrzbRtvxEHUc+OIVi7WiUuZVNeuVRuf4J59FGoTO8BHkC7x1zHmLERhCQb2Umsr+Ij7Bb+5z20/8xNwO/gjpEnxNKRJA0Vz4iQiych5FfiVG28dirfPpyhyFoJw7CBs69fIDyA9XszASOWyZxyMSShgkLQ6WebeUC+qtOdigJOntXXl/NfaGL4ZDCVYSADA1rOT+E5qHxzpXkZlEmmoGBUDMo0GuAHy+CB1hs/VpebsRi9O+KHlXxAI63xfRmTw+AMzVCLHmR6OC2j6yWjSpk9mooLW9s3JWENj1KyXrmzqAQKhMd8WD7eLJN0kFUsn/ewkeApIvvdkdM0qoS2aD4WLAiJkIUN6Z+FAW6mnv+BwBB7p8q7cEHqWvQ0D4Ap2kvgCpDuJ6I5YXFScigO/ywU0/5Du3AJC84W6Hf9wpAfmET6H1O7mtSqDMdnYGC1sT4ZD8yn3ziNXYAqQgoZwsCGhkxBV0nmec7SXIdYMQWODwChQNxKNRDkrjavVzjJwVlsANf1aG1BhHdgOCzBCmpH/cdYnWc1SUMMCZ7wLhHN7CLYrX9BocZnCn0zHqFA4ub0QbWxMGg2qtc2wXRJRezjeljdCs76naaVUb442NsSSm9tbBdFMUm8jqX2V37G3PRvasJKQ6BINwXCDgAyYBF2PBByOQn9Pqe1AwakPkZYQISiGQ/moTbhqTfTJ7wEJeIrXu+7EFhPrqE1YBmp4VthjLYliuzeLucUx8yalkECLNAluhWp2XZRf/eRaxInb2ZVRA1IDlVysGLKyBXwYBfzPRVbATgR724tjiy7a0dVj0bk9URFVyvRm0tbYlvVX01lLfrw4Mf3NjszWm26jLWt6vc2Wz0ejV4dbif6+S8p7xha1dyz2O/Vxpzxo1oRzmWwPE+4e6D1YGlsem1o65ilct3V0cuoJ/+SV3aXQqoIlY5raz3R3b3UVMHDmJPiuSIsroVYC5R6OEl1BOcG7TUXav/5C5Aff7cM+/X2YF8qH4+BuKA4aGI+QoES4VCwkJQn4JwEpEYgoKY6RIkKcQFlzCC7cc+pVlHYngQ7UiKW0MCAMFAIFY8EoBMdXHDxY+8/UHWNQQD/OdoEj1I66ub8be5q5bqRzdefOznc7P+mkOofLYH8ZlEeKq4s7i+8WPylSxeEM2J8BWAZkRmIoFuvd2CdQhgwHwP4AwAIgYB0RrxbvFL8r/kRMiRkC7CSAkgDEiB4Zp+9C45TSM0qwE8688P+IG60PvOv+xE25H7OCL1mB0uq0lq3DnLEosGJoAyXUNep+qt6ec+l8Tt+cLSRv0NYdE3XH6k9xDG6EqkUbmo5BK3/AgNqVc/0mz8RbkY7Syh5BF+OtDHtD7cqN5zzgcp+yfeBpajN2HaZ6BuvrvU7ZS/BOZmj95AvIV+cPZOIEMq0KvCv7bCd6/kxfPc1zKxkEp6oQaNxUw474Y8Gcw5lbBMKvxnxKh1FBe4A5SRuMdNLsoWkPPDbOO7Z4adprQcf+pLmxP0GrHCYF7TUn/dwVL91tTqDDhLl79sjnMXGfTphLvewFuJiUqgwKU1ir8ARCer3XaVNow6YF56HaucumAPwFAK+E9QavRStUUkH4IBl6kAve6K/eqA2Z4oHqKXxOII7OAjNntZcYvDa9ENos3JrbmV9RSqgfOrEQ5mPUAlfQKJMCKVA6jYSQRsHtx9LlVznnf4ZfHtZy0Rtoj2TBKCDRfiKUzKy2Z6ZAeYTcln61n/yR09myK9OYia3f69zAfvIN9rHnr3kGlL/1uRvDGqvOImVXJmMlxu2KUVvZzL9NBg2nOhTm4kO6px/6+wunfwjGv9Fj0FqTPeJTERlBnuD1uUVAiS/FD3M+Z8XT5ONCqL9zzmTe0YZM/0W857hyCjx4G7j4tqqexX4N3IR9n9OzDMZnKEaKlA6kcmhmNQ40w/Cy12DU//XGjW35/lJKp6GlQqH4/I3siSc2rtrVlcqUoFoh147c6Iny8r7Evkr0cc9OYBZGJnAwxkQCMz2DbJ9y5j3kieU4N5t5Z86bqHNcJyyXHN7aVhhsChsMBolcKimvZ72Xf2ZbR76vOaQ2GuQyiWRwgn3V9+jmiQt6kpEmkUihsDVPwUnpkXWL93QlIy0ikVzhbVwf42tCNlIZ7Fmhm/NX6p/FgITE5UCIJd48/iZIHEObB7VedUZYJxOePXDgR2mvL532edNUBnz8V2827YOn/PNGqXEQrz5vO9P9GvYOhr8PAMBxCfMbyPPfE+BnBPgBAR4iniPwzxNgE3ExcRVBEAfI5RjoxUADvIkg5MxyAHoBaEAfPQDpsbyZnpqashxLJzIoshCe8+FI6eq1VHJKDAJAiLzYNeEVZ++bBFPvpPgFipTgCe681ZcEoEoxfkZEPYD9BdIr5dqvxBQCMSFTYKjpADEBtr9elsLpaTzt5Vt8L6sBHwt+6E1z3GCfOQAxxf6NegDI4fMoTA31ZAIjKCxxHKV/PVYtgZgB8spH4OYD1AMHTsOmfp54ndgkOIaJMRcjF8KJDAgIsUiAAxJLvHoscywDEm8cP8ZnC+QTnIEMIDaxP1zP/hBMWMBKah27AdxBgw72m9j85+GAwuCcKaAIHBNhUJ3KvIpIOf4G9zy0NMfXY4TPu9fCfgXk1oMcpWC/CTpocAe7AeH4PWIDeE2YwmSYCcoCFUlAESFntEKhVsUYpCRi1EkuRJAPAkNTj5DwEtU9c/XzDXiNXO5fKrC7cjuJmmkheDSuZ+Pgxy5vyh89fT+vqDP175Xy79UboE6OgooYgcIAZ1E0vI+hWGUU0ld9b/2UV4041Wa0BvCd2tuInTmXXbDUv5wUvAJfg66e/tuVUX/K6wI/ZuN67r3gIHiNGuDeSzPqOe8lGDEODbF/5cXk8bO+GLD3E38AWfheMWZnZCIBieGkgABQ3cHKx1868RJIHH+T28oLqtng1W6Q/e89z+7Bj5A/ff/998EkegYEQBYecc8QCylAUIRQRKF9oMdfOv4S4CI630QpwNTV7PEgW9kJH/LfYBI+g5Nb6878HtxHLcb0WATqqTKpJGIwYG6XWA+xjByRyK44cSyZ0tackTk0L8fxgHr+hXXte5akUov3dBRHM0ZTZqQ4/5xanF1+cXv7RctzU0SsY8zvH+uI45Urz3IR0rUdHACD1FKOLguqxg3p0rtdPFmJWbL4CXyWqnnn2xOjTV5P01jCl3LK5c6Ub/45tRT4Wsbi8bEWehluDiTMcM42E2z32a5y6+74d6r8kj+F6QmJFI6IMiQEIJXDgRv1NV8wuK84kjEZM6PFjj1Lkqkle9rJ/8XjfAtjxFRu+UXt7Rcvz3K2NnFTta3/+JkFMDjTjLEmj7dpNEGeIcx+RF7AjC+jeZJ9AOnRbBd1F8TXGBZjjN1ySb+1F3hjsYK0F88VrQVRwGWaCUrMIB8+yuKBgg7casS32u4TTk9Sq3gPN7dqWgv/dasRaXN2rcz/HHgAv5CUGjTRRBLvSGrDfrtQyl5Gt6ZsSY9MZ/FaUq5mnbRyDbonkkQ7WhbTJlKq10STaEuLLkTbhTL8p+BQsilglJhoWqSxat1rT73AppQW2ujJEDKzMToavxH/gF2bbPJz93A7Xuo/4FrH5Z9gu4it1A1YDxzl2jzkgMRhUSnjoSighF3dcCiUj3MZJHiWQD7wCSD4fCO1dWK0GDwT/szvc4ANVSOVktv9kq/uDgbcFnswuKO1tXVop1WbXXvDssDS/pTC6FBmmlr6p61ykUjVnjSnCy20hFLDDmVLKUYpEwmdFmNMATTUDZU1e73exVPlr1U+WXPfhW2WWItPaTcpl65YF/8lbuxfY0rGpfZMkLWt1kt1SpHPBzW6JUTzF/w+i8q7k9N3WiAG7oEYaMLyjE2U9Tbh4bg16pF5vb6oyGyy6ZRSH13CxQKs/GYaNT2d5q1wbosIYgLS8+IgglZTgKFmoULNr4DSkcLGqlCp1/l5ilCgv9CrJe9R+qVa54bF38bfZI9cO7lp9ZYXbtsadUVj21pvHulirwSbWKmVHklUXkZbpO+bCmf7hH4VNcC+Mu4rFdi7aNZvWbPrK8/v/czuZNnXlFiz5CjI+MAblbtqm6RJmUK7dQq0wLbq2C7yavJlrISlGJOFtFptfk9EqlbpZMo0YaNBqZRFSytc1HOabyqaFmFjUV//s+ZxIcto5wvnTVFD8YLSRRZAH1E+R9Mqd5jNIXeLOqDJNHV4EpGoXn+0sCsmdevIl9l/P2fTHl3mdIaCqb6U2WxJJNfim9yGzT3azkw1196viJ9CPb2ABRiNNByyh+xpl9WsJ7BCIY1zanoiA5vIO4KOFZMpGndz8xOUHbx5VMVvRu2Ff0ELWGjfFh+PyIf1/fRu9lfP778+NnpBR9umXn9x3VXD+y7o1RfVXm+B/bhhRavvkaHbXvpRsHdTObt55bD1D+wnq7d8vWvvSkaub5/Y3Ni7b3kmZG1jL4TtaVvR8L0eV9u9t7fvHI058v3RM2ewxWwz8VPie1qh5NcYxq7AhF/H9EKsnENzkevMXwmCi8FxY2ZGarO43S4HkOsoKR+xDmV+hpOK3nniqAU0A6QoEWoAHxCbODQ5T8hQgsor+J7tD7A+cPvmOzdl68WHdqBx4wFi5PSL+I7KUQzlrnGxi6CC+iqk8TccjeInAYaWLXI5fv3ddebHpBvS6cZ8WAsWYXTZYMnt8OE2mxJO8MFAQGkQciRnoBzP8H6t9Btq2B9wlJybeqjtiaE2latF23HhodUbSTH793/cMOKL/xaOkmE7qVSpBZ5EY8yeoQ24/4Z/2Fz2818cos1WwpdLkRSZ9kTS5mixyoM46eZ48FuOB1K0Gu/imJBDfzdARrQTP9UIVA9z9w+eeQ9/m/gDPH+e45EKw8QovjIL0VrCMoy5VPDSfg2GqWM2s1QUtlrFUVExr1UTaFBm+JxS8B8XsJPhhI+76gCDkgUZmiAjhqqwgb+ApvcEvKPuNCDF3VJAfKXypxUeu2MNu3jckm0Gx73gYfC0F/ysGI+PV34fzDvlwbHKnyYaYjOn29//iFry/kfgtXeGgk6TQYSyD6RuIlecBsSZU7dfHQxSNI0rDDZ1fOo7P/iMv+4UyHEfykpQ+SWf4+vMSepK4jFsBFuJbcOuwLoY7+ox2nJwhyUSsVi27nHRDbm0cNXU6NYo2d81MDSkEGJoJyJsfwZhhJuCOU6g5AtQ4cxwcYA079oMKIjanjvOzcGtB3NjuM4VimasQhVacOJC3kNuXOvRDbQaCubafr45J8T8xwn1abL1el+uZXCb1t2c8olyLYmRklsfbo1u/NAYYYKujE+LJ2k6sXTpF8f2ByVLv5id7MurNAROGZUSjcllPn99sokVDEwbhjuMgaxtAL9w9viduodoVeDQdpV5cb8l5jORZk/LRC7Q1pi3NC/2da4oGLXOkF7nUoZj2diSnh44cfUo3Vl/9BD7g7YRpV0n0DjNDbd2fA5MOcLy2KqirzlmXld/ArbNfZDFJ/0awueZX4m+BfHp4/AZZgwKrxtraMBQOkpRIigSF+mgCymb6ZMZtDCBukRTRB7LmeQQUN3hIIo0NDcfJQsyWgjV2b1thTzSioAUCNJA+Mor3/kO++G21798qbPyxxUeqacljUBqKbggSl/OHXrxfzd+6bxiw3lf2vziZZcVdjxQwSAwt/7gdfYd9odvvNF+2VPnQ4CqrEYliRBqmu4jV7Cp+y95onfpfb87cuPHX1t1yy2g9Qt/emjZ6Y+rkIT09555j/oGxGQjNoStwBKMaYR2JByJpuHJqEbTSUvFUl8TXcyjrX4oyRtUgTKJk7wXHjW2bkffp4UfV/2Fn1mqUQugHmokXt3o9+F+/0hnRpxvPjewNtzkafpSOjpa9g8PX5kcbfL4e7eyrlkYzez/e8fRnPH8M+yUuluZVnrRlSu/f/QoveiqtWsfvXKgMlGPFS4X/ruiiyAumjEGzrJ6xhuJlJuJTN6aFQmDtFhntOpxfu8wpzkXOS45KH5/bG4mq2V1vx/nfURMS8yVZjxUpIA8IrP5EuWxXMP21b3aAJd88N3MSESviQ02Nd25fOutW/tdpTqJxoPlbiitDjh6+jryLmehPzb5M5xGGQjpdtfOyi82fuGiFaFgMD25f+i6OonG4eX0AzwycA4XD0JcLMM2YkXGPlnogV94Mz0s3LDcZNQL8WjEZ7U4pXKrEu115GQUL6G53cNcHDAUTVwfFzjVP4c0JU5x4jbJ8mD5lKiBQ8gBIL8Cc4SSKdKqTxUYv8xdjIEGochtcAQV7Mexi5pbOv3djRGxuyXtE/8jycTJJLH4gVnIHA7KHGk/LgxknHJAV35yj8drU3vPf+WA222KlQOWOP1PZRCSP4ZFRfbh/fo54KnWUviVsB/ih8aCmJ/R6Wix1WG14UEvhgW0hFhmlfDZLhFyuN+1iW6OFBGjHYr+BEISZCDwSnF+XpsrM8DPQHui1KkG90aa414NG6D/XJ3G5kqJU3cSzj1RR0ZGQIvIkWyPnLocT3BAQDg4Sf4nxEEfthRZiuU2KyMYULlV7gkDHRT25yeiPdU56uRMz/MWEi34lD1bm4iMfG4GPjcAv+8S3lXf43gnmnISI0WXLsycqzvhFEPIRdgZo0iqVmdBJKdFuzTXJJtmOxnNJ/+8D6tziE5H4XuLNrlESQlomlI5uk7/79z5BOPnC65fw1gMS2JxxuTyWt14LGTyJgFJRoy4XGVViOJcvGK1f6ss41QZwgu/5/cycGvru5nIAMINtG7BV9m//I1m/84uPjq/w7Og9cG6Hn/5w1OVZ8A2sGU/expvq3wRn2Yfnd/5FTe4Y07nsyHwELuU3Qca+fmB7/9ebAJbjezEUrO1UdDfuYJuUyXdSfcSBIPJviXR7gUwmG3fp4eCHWQKc1GgBBm9l5iPBBrCReuFD/h0kPhNoR4N5TWXfDwHD8APEfP4MeLT4kJ31Rw83NJY+f5cRDRB0IBnftc2wo95tovDBpozIDKadY5COqzkxj0Dx335bOP+GDLSPs3Y55hSZzIggVsGn1IgOBuM5dtGvY0xczpiDPr9Ol08GdP1/eLTion+LfS6KaU9aKFTar1aG2iJPgj+VFUuoOyANjfCzhpsJ5ZlrMsWDyo5+bEOyY8dCDhr8zuiq84qPyAD/nURokCVU2btKV7jKP9fiRW1U8leZOsdmwg6Uj5dIelpCEqUbq9PExH9nwkbZdp7eqptfbtX6wwawhmDUuFpjG6eL37q1uhQBogoozeaIhF/vMEEv/w2jdgfRDuIOC6Xa6XmUNb/DPKQgoyBYyOJ/Buc2lowzCpnnAvLqwVzNkS04F8TR1yq6A03r3vq8/smEtc8xz46dc81F2ac+9auP3TJtw62d+9/fNPoNRcsczqd4B1D0KFWO4IGYwD+tgepraEcMPZkV33m3m+sP/3C30NLDi3XfbXQsPiu44cf+tt9I9GVN28Exyo/mfmII2BEj0Dt7DrzHtEHMRWCoynE6EKYXi8PZ6EZmZWTKZ9UTtu4pBQn5zVyZrM5ahCfpMQ/N64C7deZ18a12cLg2qtHRl3Nk6VyF0Vo7H5jLDkxcfipAwd3776z9ZINA1qwaV7jwJa98fbLLr+/Y+9krrnRF7dIEv7B7p7DV7/zn1demVp93SQQLGwXQLnGqZ9RA9hiLMWYNS0Y4fA1l/yDfYm0tT+JW8UCh1VkE3Ehr8gGrMCfv0wfQ8kLkykx2gTO+Rc5nzZY4Hn15jILnK9QqqqRlwqtokeqwgSOCXwd+J+WDcsXxyr7ShlcbrexUd79ilKsLqZN3/52zQHbFteGaIdQ9oMfSDoat9+83B/KOMEfrYWOJU3SdSvwT1hly1jKAGVFwCTTGjxWlHO13gkb7IsW/SbOC6u2al0r+9gHJOX8+iPrWo1GL00DkbO5INm4AuWBgMYzyr3ahaSIkQoSiqTHmbG6UxK1wqoSFEnQ1NHZiXy06cTxE5ArZT4uOM2zB61ueNXVeAGuoVw+U94nywWrVTnG8RCiHvErDmbctMO//vXvXX4t5faDG8KtjUX3hx9Oew1ub8zHtvutQfa3AplGph9m44lGj+yaqwCOi5wWXUQNVNQN7CdjlX9/2+4zKkQ6O+5yAakp5Pg5+9N9bgOk3OcDeq0pDTayb8Ub3CqBFPf5ZN7WHLF2zB6U+Kxq5KidxcYE1sJ4Oto68QkgwFpDBNGOwS9ZQ87usuYd+FC/UmYdVMyChOMAFy9lLGoQJ+hAYSE4FrrzF8JCCVCwjLEeZgmAX5r/HPvDOeggZHOxcTZk/Ntf9+cPfH8OxrY8kL0DpOfCY1u8KTCLjnXs9NnA8eZfPpP97GtzcbaJ84XWMNONMYyXyGXyeDcQYq40Jyqkoag1LLDZ7U6stUUhtTIoar/KNG72qUWZ1bgWmAeQqnOfz5M7B1gcn+rBlQDg3xq2fL0eIyRRA0h8HrCuuKhwaaEeXLm9pY3vzUdH28i0mgPH6fMXQOuB3aW9nXPQ1YHVY2gK62L8BCDNBpPAiHVZCNwIv7zRzrbE4rFCybqoAffLJV6rjD6LsKnH0tkQITwbvv4/CZ+zYOOmBSj79DLobPD4/EKsfVpRVIerIayPCSYtJmsiGhfGKKNZHTPHzOpGv7fBSpckCpRos5UEHQODg2cVTBwrUZaUc0moswBJuBCI/0xSLQTUunlg/FQC6yyoWnMWYNaLLb7WC3URxFwM8zJaLGa1kSIPbfXiGrXIq7dqkcJbeRPxpMqEKnLSXARXwThTFEQ44zapCih8GyXTqUyH1g5v6slaLVmLG9UBWezXv8TX/yj0JqxiFUFWTnrTUA+USExBh32qLETlP5x7wHfK4LecP0Sis6qcl7BoX1kzVC6ehv3qxpyMSiF3Y6TYbLCaJGKJRIZhNbGA6NTOHf081Rm+QxC1P4HD22GyBlCllQcFMq3C1MuWXSGrUijHD4Frh1apuRW4SlOp8sNowa0RKnw+gUKvtC/hanrPqZHjYdQSp02ugdzCARbwkla8xrUKNyTROKwvdeOvZ5QQoWoOU8lba5x65RXcMssrBf7aa3NZCi6qcosI9F1S45Vtdd/pn9ezlKcX8U4JeefDHIxCj/tMLrfbi8klVpmEt2l48KPlDe8Cds1BcEaNS26cy7PbbwMEPsNQcsvY6Wfnco3oHfOnpRxP2V9yPk3JmV8JvgJ1YT3mwiKYm1FJcLdebjT6bUE1VIUFBKchonUXtPACezSX0RTybpfRoIUcg4xzuwJ+IgT49BwomTNip+Rp+ZsvAikwf+sh2Te/KX70JfY4+7NvfEVM9p++g2g8764NWx7YUQKC8o67N6z9wnnNJH59H/B9+4m3v8VW+tiTr/z0318E1sP/de/yxXf/+uc3/Mctg6O3/+IqrErve+SXoE5rgRyMI3otSlqOO53CMG0QemmhtKrR1uiFbBRUs6g1A8g/FAvJRTULITLdnKpLcBvP7YD80ufIXMsbKGvakVtkEdf42h3Fty6fkj0HAEspysNX/KdQkupZmd90CS5q3b3jissfuPYRQeuyJczKZvvdF910icSmvX3XUXB8+NCq7GNflfP09kD+2iF/7VgSa4RjW51SKgvBoEFcKuBCoSOI3OInuRULjupjnJ+4liNEIHQAvYrnMUoyvsAZzoVrIiXdgJ/88YPqRJHxpEdLrrVjIhHyj7O/ffHFX377r3Nd4bgs0dSWC3cY11NbD1jiXr2bWdWy5YjPPxpGvvHvfQ80gfY3FnrC2Uvtm5n+gXxqRzWPHrmOyyEZx4qoXQWpNE3TKmk2jVOUjc93t6BdYKayXC2xHTfU5ju5uXyjSKK3ABw7utU1FpvcvmpIlGp6cz/sHHfTokxmm2WuKxv8vimZpolJhT9FPDZkD1x4/tpDrq1buHR2LQf3TEP9Zb6/+rmOzgix53O2yWo/iV+F/eTAUlgHZmcUznTQghmJUFNQKkJhm3wSdH41bWbZwodyN7pnUsCTsOfm95F73rmwWFu9+Cr73rQrNtNNQHI3MK5LXnr03ta5HXaqa+757DrGLbelEjMdduttfTsHAgu6bf4533eCXbDvAlgJG0RtDTbSHswuTHXQCrFaOretdasWUPbM6TY4jhzAyC3fz+9B97xz8oWZlISkiCg/c95MP8IhRokpK+Nf0KUVfO75bIZCSkJNrZjt2LuFcmGAMSzs4Xmn9XWqolASFxgbbo7aorGk12AyROFXCc25ouaSV2SVoKUJLnaD1z/Q+iFK6cnLwNosyztU+Fz3XCGx2fiNfCHfDLT8mmHNli5+ja8iNXn99iW+noatd65bd+D4cZt/EFWZCpc1upfyo/bsVGcoOrS52dIaBOE+/HeosJQm0BJbdsmiq9cWbOzf+krcjGyzuXaVwDUSSWRwS7lvz2hYLOHjSP/G9hEvwP4twN7NMVZDAddq5QydT0kb+qIBh9PpcQeEErlVquCnnEw1k2nmJL++nkxRXEt4fYprSbUsXG3q0c9mMeK8AXoz0BlnMzShFRvc975UoHGl/azLHOxQSg8fFom8DkNABix+X3dPf2Bo/7JU43l3rHY3ZNI2sdCb7wyVJltcXmZ5IRWnrxsjpw1yvUJE0waveXqM0ExYTCaF64J3msYzxp59909t+tYN4wKN0/Iy4We/utNjzwVNhenPDi/53NZmk4bz86C6bI/Avm7FxqAmT7dFQ51BJhTEVIxWy5h22oHdzcAv8dhwMG3N4gKxVcg7Fk9WOx1tSORDFfnMTpziVd/BOTXiCJfoB8WD6HUz/jOD8WwQmYsG3F/X8yqnavPGKKkz6KkVu30tMcvnrlM6VAvhMhcg+D52zwwYwP04VS5lKAG1aqsz2+m/aBuBg2vnwmfxHLhAHrF95K0QK0PYasgj30g8sojuddvtVG+EHlD2ajS90uGpaDlfKJSKZaGIsgrng4Zjj5pLoVTlUT1uagwyzOUQl4LPeC5E+QN6nRnUMwviia5Hk86v3bxRrSM1ei01cZ6nFDFBAdGpozXnAFnDtnxxU74OX+yXZ8C1FmQoqrdkMZICcsm0LdHizU80e0gC/OFskPPoK9PE8cprpmAd2jisUe9RK+DcMYZWhm1DQSaZ7CvmrQ2iwT6vT0ZotR6rjy+YcKwaFMaXhYAMQxEqfBozlBiU440dIOWvDkOQM6RwAfoIuooldQsBNl9Q1/e79LnJLh4+277zuSW67Iojr19dh7cNl7RqiduqMLry/kk38b2L36rH37U3bx2/cDAkAj/mKtuNX70+s27FSJOfZJ+aRdyojFn72X4eTZW7qPTYTh5T1OvkdmwUm0byJ72IVg5Lx6ai7aXGxnaPKRRqaW6fD6Vj6hkhlJ4LoWYQJ5AXocYiwQyP9OoqjxaCiBQiBPGBq0gjJZbVo2f9pZ2mFm6ghJNb7ekOyC1Dcbr/LNixNE5f/+K+6x9f6zU3TLZ6m7LxeuB8T9q8+spR8EFt4MbjVc6x3tHdQ1ERPlmPoO4L71jUd/VFa3pCxPcQhK6jei55cE1442SzieZyV/eww9Rebr2ziCLv/EEboZJrJRRJEgJxMohpxUqFAo7axLEMik1DCYRRnWr4C2XXohycHQx/6uFEDe1fZCoQORWnrXOVq3EwL1Ew8Vlz1vLd5Ms9969d97OtX05ev/Lhnoue3tfy3VeBGYi/s2a699Bz7Acb79lRajjv3i0b7z2/qbz7HmW0z3V/6Z6ubpGLbEheV7owdUl38uBXfnoYJF7/wesbTn3h0hNPH6Jk4/d8cOsNH31t1aK7f3P03r88OA7b1wFlDQZlTRxK5BhjzNERLCRMlKNOMyANBotTinKkK2pLO3wQD1JDqka/fsYcQvRz2ry6tmLBReNBTYRQz6x7oGbmia2HD0MLXm7pY9NaT8ql+O1v44PdnXTbvlWl/gMPr941YG+wXGlMDeYKa/ui0YH1xaZJ4rFT3x2Tx/JOpVBB02J3e1E+BiL5noimvPv+DbtfuXaQUbg0lQR4NDna6E6sOjI9dcPKZDWHUw/bJPgy7MM81ocitbB8Pm2Ok6kcINMer7e1EJQTrUEjysSV4e2UY0h+HuN2aSbQAvZZuk1oMHJQ9ntz1T1WoNbLxPwevaHrwp8vnd+H2zt6wHdVtEM3wLRPNVqsdEjOBluuHhm6d3yEnde97I6N2SMTCzrUvbsfv8vc0jXgb81tAXR5PBleOtqmq/TEk0IX4XVcJPivBT2OcX3eRD5JvIgx2CIsz9hNMVAm3RjDNOSsBYXb4+mmjVq1sHU0iiPTrap38h4EyA8N77LPze/mmidxhiGEeh44CO08JIA7QHRh13sunsuWH88By4kTc5HB7gDf2LMACNu/bmrpnscX9nX2i/UI2s4+j9+7EDAAS8N5I8etRTkZpcZqi9lifpPVIvIHRTXTG63yIa0TbWuqpdDiMID8iSA3K+SgypbH8b79D6/Z8q0bFwUXXb4YmFKDg4uL7K2sd2TvaCg8eF7H9KFRH0E8q7ApVt6wOplcfcPK8nnL27Tsvs7FGaOAxi9hBJmRDcXyrmW53LJdZYMeq9FJ/BCO3RSiU2d3pBypkMVqk4RokXAendm6VF9QEGtrdFZ9mLVVyQwor93b2HbjxUO2WCEXl//aGI4k7SzLPmmL+RwRm2LrxraVzTaA30mJqN61TWZjae1gvCvrMylI9kN72KET+MCX0kCuVkYyecviLbZ0d5gSCnh6o+xu8s/UJqjl+xh1syISjdJ6pYVoSNMlikDu2szx9BvVsOUyHHYtKM9gXoMM6to6Xm0yQXFHQjeXfLnA5/pC7pgM4UVe2BsjbcaK+et/vq090rsmn54cbNLS8rZ1VwyN3bCx8barL/uCE48rSfIhgtRrWpY0R/X0qjPeRV5298ZXp+n7APaTpyaY84ai9tKS4tQNa9KlNQe7D7J/uOXq+2wbt/mHw91Wj2Xq8cVCY9THntr7ei/XtjbYtkbiv6EUDTHaVkUqnW4yGXXOxqaGUKSFIiR869JvpBPHuTJdsw1sIQo1uAiEgRZqBkx6N7/zs9rAFlAGQq59i2Jt2sp5ie3b19PRolvmbhxJjF8YcQpNdL5/ujx8fre7ePELB8G/4ThJ3EyQEnF6icczeZNrCWzied9e7QlNr1nhi/QxBUtkuNE70SdVF8rljCs/vi7etvfQnetJS9bq6fQ3mWzGxh15aTqAn77kB718H2rO/Ip6lBrEQpyNqgcaa8ihwyUit4iLDKnGuSIfDx/YA7xaArkbebewXucE2gzQ1kIAqEdrkT1vPrz1P/8SVJp7yng42eiSxre9tZWtPA0YtN5PDdQW7MEv2E68Cc+v0Di9FFpgNto1mc1/x42VTexqQr0rzi3vc7WmRoiT5F3QnoZYCwT0tNRhlQitYhuqc4sC5XnrkYtHTSRTRi0RJ/i6UIIqkUYueMU7E6IELn7nLqXVm/DxWdSL729l31//jjHVACKukM0gY78R2nXv47gf7PIlHCpIHMqmfhU+XIl9jMuLNruOpgmVI2I//TFQsCu52lFsl/AyaAsNQO3UaIyYOlpTHmfW2uZO441hg0msmS32Vh9ADMUvNSfKGkrSMuArJPFJ36upTICWL+RWTQvPB154q95VCCQqY+zfcHCgLnwiuCbUx/4nVzYpLtV1NIG/mPIFvRFVTlK5I8UgrvIVM6hyEh4dbwO3WMNeh1LiMDrbj+4dmgmjGJz4EhFDpZQO6P00TSc96tEyV02JbghAJiTCmf0VJ/7h5fEE/LNY77Gox9uw6h4W6iniZqivQ36ETea2ctLrylgZT0pQDBnNUvWn4kctSoLg0lfO1mZDU3jd2WwVN+IHlt5FS+uDIDwen6bpLa6skcLqCjvAgZwbFTaS6F0JL3iquVn01su6QBG4l4S/2L651z8b3FCK3YJrUZ0jOmFXC2madNgcMa7SkZk2yXAIAVfYoK38EZzKu7QOeC7fzI+rEbaLRHnBWrEkY4rFHY0lu7UpXmpqKsUJeTKolGtpCmDlyhtlVGUogexgVIiBCw6YkexcGHXVuOMyd4HqdjE+KGLGdEMJ2OP4SOcFR/qL012BEB3MUlRrcHK9tnH7CvAN9p3+fUuThfVHlnZftq5bbV/3bNf2wVBy1Y2rgJg9NvrZVVnS17t3ScISLTktMWcyEN62PL9+CBpwUUXD+Pnd0/fuZvJrrx1XfED3nT9YnOqgfeDR+OKL+XZ2EM+R92GdWJwxuJ2Mp9ySSjMt6XQLQ8izUaVcT0Fd+litlZx3h3fwzGslMaNH/LNmduy4vrdhVYc/6AtkKFxnp7XRrqRFX1w3BK5nf4kakpu+dknnvjVdKtvar3ec1x9MTF03BQj29Mj+ZUlif9vWwTCKhDEGrRGNVSOBxkkwOdHmd7OrZOn+9czEjZuKyWX7+uU/cret78iMN7ldYH9oYCuna/kwjPTBMd6I9WMRxtASjEb7c2lrVtQfhGYjrhVJrdwmzPSJ9PH08Wog9knOn8VvTZpZdESrIXpkoaPGohAQOIQjQD93c5JRzW244OIoIBCKDxECaX8+iLcFVaGARyyi/uN4X/9Ouv+yyUwpZcq3jqQ0q4a6PN7xUOVF/4qQ7uXopW2Ti+nmsZiuI0WO96XUVmhWCtQ2vTbet5wSypuWX9w7dDBpou06AU44r/DDMdxgv5BY91DlEZv/xlXFNX0JIUFVfV79xAvUDZzPq8Q4/F4rrWBoqwG5vGSCWJIooA3FGC6UCXGIbbSVhPPqqWtmxkku+o6gM9z64jz/1qx2aTTkZ5aPOLMTqBd4vqAB+f77C31clEyrtA3MuMOAEJqbJhpkF/i+KNsF7Cdj7Ffme7rY3ycbnCqh0u8HuMlrXkOJxjqNZpOycvfZHGAL8NAf1OtlzcEQHok35jPWnAhF0vEB2GiB7Hj6xEkeD4Wqr68OEHawEA2QT4Y6QBS08/DwVWk9HJRnwcLxX4iMNTjIyVfr8fBQH7HmfGsNEN613gV4WNHXYUaA0DYQzLnxUMSGUSRM3GpKpTQcKtpoo0ZaGogSImERcYlfsMzUMKCuukAREuZ7OecYoVCTmusXPTsSFuLg/fdnkKDzu8yiqmv0XFCodC/weI6RM0AApEyvNq8eI/88YTknFNC6I9tDRqnLoZ3hYzQaIEM1yRQcAKBqzO3N4EMJT6arfk5+bSkBZoID56xG1od1gH1gp0XPhUr20JaYkbXUViVjObtodoWXuvzUfiJUHDXac1KCphUuc3/61HvsW7UlSoW/LUf+rrbmy9NMpImHeJqBRs7RjPzWAkSzcCHN2vlB0f+A5hNzYp7fOjvJxEOVCG6YE8BaCbH/W08xoZmhmJtzzvwePwHtjibMz2gikhjWFINfBbdFIy5ECc6kO1ZNLoVkDxS+aB2Fy4rMG/uzuhZZg1Kk3sgTjpceWDuwrsn8wuX7ey68dahrMq9PuF1Bq9bksrqH2+OJRdvLruxkR8CSaA04i5mEnuy75ub82HT4lrtST1+68ZHLu7ROv9Yelao0KqmjdWNfy66JrENbXjSdi4610KZoowfj9qGNQP33BNq3JvXW9hcStf2FujMfkmhdM4W1Qe1cGQ3SVnFTUExgumAbIeAtedjUalqiesM1AntFMBOHy13nWwrqoijtADzH/gegIyM7Ont3jYRbN1ze3BrK528eyi0te6UGh87p1Su0ThvdGDQAvSMfMKpdUZs7bBITg31f7dkxEAh2r24Y2NLuYF858N3+/l5DqNGnp+1qWzgVtrkHLluB29GG8mB7ymoMFT2foDax3bBNV8+0iaatyiZaDDAd/X/RJr36X2nT92fatGsoWHGcvU3Ey+6W5TNtYv/I63ujZ94jHoKYzKGsoFmCCFuDZnE4KCdqa+VodVYvqCOeNwoFHPAKeQ1sATnrSsGXLB/p3r+y0LzjzlWrv3hBubjtzrX3vFhsu3jn1tyiaZkl1DiYio600J7WFaUQvqwjUNpyy+TUY1eNTd35+nnnv/3SA8wWGtha1vfuAvEXAtNrprqjweGLh5fdvoPhcTfKMsRDHO4CNdzJedwBzI3fi+eoW2FbDIzY6HDIsZw8CLg8BnxDtFU/wxznD8q7uqB58FJm8cG8NuDUKb0NIV3Ea5Q5CxGJWqQOGqOjzXSwa1WhcV1PyBjrjLc8sAn/Dt7XbmrsXpT0LB3IqfwtMUtvRxLH0xRly4/kcqu6w8lFO5jYyslxT7yB833tpnrhHFSCVhecgxJJ2h91pouSnMJgNJoxhlbIhAN9UPrWPF8nuamozKUbfwPtBahRzQXf5mYd3Vz15MzZTXYvsvTVdTpruoB/r31/f//hjc2XXvbKxSMioctkDcuBOiYkicsXGu5roMnPvkeFGrt9ueXt/tTIhtzk4o1dze0X3b/mu/fdP/iV6r74U8fv86iEZ7XfoeWPf6a4tNlZWH/9kvV3bslP8nPQbmIx5EcGoxmN3iCVaSi31eSUWJELg4/8Qq0/WWs+UNvAP2xlLo26eo5Yxw+fo0GrGINMIxMSpMhu5qejG061al3yc9Hvkws1HiiyGSjevVZevCNbn90tPEg8hu3DOhjP1k0jgxlrKhC0O3zGzUPhlCSmuHjv3tUd5cnoPrkIo4TYzGYvvmcz1b7l3AGoifkCXwuhqmr80xZXF35qkwE3wTnA7AxXf90w9zICDhhZp4ltykzs02cX93f500tb/eDqc3BsVJtukZO6QANtzRSYACnVKRVpL5vKN9sExnDR4+4qZ9Vw3pSZ+9nGeMEuFqhsBltACXQR/KN1Sn947ermgYjSM3xomr1Q41Kck9OusHIMXNO2OKOT2pM0q08V7AqxSOjzKQNtGXANsyRrNNMxPatPFNwqoRzOu3R7Dqxctj4jU/qq/SKDY62b2y+cZ6zlpqDVb7NrtGZZs9Mv8SgGh4ay6egwVP/54IZqZ8z2BeqJT9sBvCYB+ameXSLnrs0MT9B/z02ZJYwPXHNO1sYyFmHr4EUXSoVqe8LPNup8casEpayoMvDkK56RQ2vZvVrnufmmCrSlwUWXnX8Fa580KQ1ygc+nCramwfh9cIBynAGYHMMInHwG6iNZxlwkmjBMkQ8E4w6nU0T4PO64EIWFS2rrcMcQZ6AJjGRphttkD9uMChcgOVKnRfmr6215tFqB+GQDQs444PZWQ2XxS84gZY/RbpXEzeTYSLTBJSMJed4ZkAB9uGcZoZIeUIhBoDGgy/psfo06ZwQ3nf/qGtwcLrjY3lBb3OzzyXztBbB2dErViCp67k/ntjX2NEAO6CRA6wzoA3m9fPuzHVDOGmDf54ifYt3Ycoxh1N2Knj46IaVEIvXyCdrpcD9HnGTkrW2FhpaUTu3o0JCch/TjNN/9/Gp/ghumVUepFwg83jAIzG02svLd3NYPBSkE5wAJ4PJbzDpZiUHY30+ytyh0IrFG5oiktGwoU3ZLJe5yFjzsWLR8ojNijebzCQVQ71iIlsoTeouzJ4jc4fb8YMKWV3FuVfB9HGf/XGyxUz6fLgonoUCiM6r3CrSe4qJSzUf+2FmBQxwm5DrOYx4dKDgFBKfL/YH8Dbdm1Y2FGH1e4vF4W+kwyJkB3W31CmQiFBR0/I3axiNNMQEZ5ebT1syk80Bxy7PpPDLq+QqSdo56hx9gX1eY3LqZtB7GRMgjqeX1cIL8HC1p0RxlaKjyaKzRI+dze8jNPlNdcg/23x+ZVf7aHKe/Ttxsys2qeX9CumsQjon11BYsgZWRnpc0ElGyAUt43aKGoBwgpej4m9X4VdiSWrKPqtZQdf/U8shzcNdWFzY4V9hPeg41xya6Ir62yUJpWcmhtnrUbSubbKUtt06yS8GTDSs7/JNjbUc6/kepl1HZdKpkjTSAwJY/HvUvmlxXTC5q8XnLy/O+/pHxWNue7VvyS65ZnTnP37m6OPHMshv+ZxX+ebqt3OLu7W5vD/R1lGF7zGd+RV0M7XwLFsX0jIQOKsQmkzWIcbZ9gqu8VIUt7CXA7xBz56j6pUMVjp9c/uWjFy6OJxbvvfnhlTf96bHp/Jqrx9iV+Mu16LOV91zYfpwayE7uv+3h5aufvOvgisz2F7EzN2144a7Lwn19Y3f+15EbP3hwsuOm9+8FedDFr4d2QN2TjxXOYSZG5glidmE0qBUTqF4wygbALe9yUoQwzrrWaiwXzi9te3T0h1dZHeXe8czqI6uTzIUPblh2156O8o47Vhj9/shtiUXN3syizYXYcKMn1L+Z2Hbf6aURpTfREh557jvfndzwzDUj3Zc9vH7q69eOkzKjwT9+1ZrdT+xt8Y/uX7bj2St7+LnEy/YR09RmrAELMNp8ymO12aJOh4dAUbqKBpQSjE/1hGodH+MchiGgP8tWEW6RBUUlgFk3wkyiIzf+Ovsfc7I1qa1ulS5kkoGReNfdfe6cT6e2+w1wogjIFf5o3ADo1+oC8akVGrNKKBYF9v3XBTt1nqhJT9tUfq3OHCv7TzurPu4+/FluzQ62IxG2G00m2mqxC9HahCIFJOdqx1kl/Yw/tKZhuPEV7CdnE++7L7bGvdqsTx0OecRyl8enBqp3Z0U6Ya6J9Dc1zqAhkDeYDWhoVl7g8cISV0As+7EsWmkMKcwKc9KuDVrxZBCtmp+sBeQhm+X/sfYd8HFVZ7733Du993anz9zpvWo0Gs2o92JJllwkS7ZlufcG2KYYbFNMNxBKSCgBQkIJJSEhJIQ4+e1mbTZ5D9gUTEJCstmXmPRNwXP9zrl3ZjSSRXkv6zGWpgid7/vO+c5X/5+mruXRk04VgcPJjPqE7j+/AuyL5oxzlJUdRBy96uhXV966IVvY/eDa5XPv0kd8CdE6oY/gXcyNZ4ZM488/R7/tLK5qSI/lbeDlLx891rjptvHxO3d1S4ZyqYlXcVzzWZp6N+HQrszN+K7/2usvBulv9l65Jh1dfhCtHeqVo9zBS9cugGsnFq5dXWnHZPP7Wo2cGe4OVSnkPcWO1PV6shq9u2rStS9cOriWXfqFf2C1tQM3s/bljTbi9g9be9w5v3bQ0nMVs3boc7XTk8RR4knoc2VrOD2cGk7PfJ29D/mQKjmpFEBfjEPiSMece51tXVZ71YumM1cL1ytNLUwosdexj2NCZfWo/6B8H9t/UCmoH97UlSKTxJt8sItqsO+7cBdTaSRWo9YDYswVd2r4IpHBb80tqKW3QF9QBA+pRYQCWqBSRw+ZnFRWYpHz7RA1WIUf8KRqqTTuAt9ia+f5fBuK+dC/43wziMI7fEG1aP7Cq592utgAD8A8dC/3b0x/squkMmoSGSJKxnGXnXTKOJhQyFyTTJiACSJS85djvW0O11BfxVUp8mJR0pANquEOhguakDLTPhiI9afNisyG5cmpqemUSNSbQtoi2iWTOZxDMXB0ZN26+3bdN+Xfag2EelIWsnFNG3joiT8/2GfpOrjqg7m1VluYoiirbTPXdJ3X66H/enR0dNUTf7yHdn2qYjf3cqagjkhhnpI6HInoNKF4LMm3W0ibjEeIxVWCKlYzUwGJQK9qRLGGsBWvEMQawnVag9i6esDllccKnVSgNaxv6T+0V0AmA1po8jojpEQiiVsoZPE+dOdv8XH6sXuWhbpTFlN+qg3MXLnr6IWNyRavnKLkntYkIXo2FIR647XX6nR0CnOWFNEQGZG5rHKBUGiUiOVM825Fp7Eb8+OU8SLl/cuPU8ULUfbu/nBN/IG8TmXX6+QwZi/JrSRpQaUJWoUYMKE1uGzGBGeRDpZQuktqZ9B/qcpdQjETzyzSuBfuXEIrs3OjuHJ41h3wxhYDq8+OK+RysbYKisaiMLB4ikzgXw83g71SFQ7tIs69NH/0+rWZtmteueK6DesP2ZIHbnxoin76pRuzsyfH6Ts5Rc4HyhWf+vHtJ859enlD9knNquvG/f/42oUtrzx42L+MiaG+R4wRpzAnRpak6FcDG+XgiTlacVWHMpVSi5dQvQngaSd09CPx3oTJ3burf+1QNmVR989d0bLm9nVJe355+hf4aWJQ1LRyd2H45KZCW+Ry2eqTM/GeI5+bbDuybaW1E8mpCcpp58W7MB7ymw7wwOVccAgHOH4VBuTw7VMcqOsB8RIIP4f/OxeLni9PnQbR96amclEEpzsFXF6+S53Ed9rKf7e+8hLd++aboA/db89i3wa3VWakWEoyrMTjSUoqeUlLlIR8BJB6HkQRbNBCbNQFWLC3XQInTrQwSOAtpfJrNUhw+Ls84Cf4WWIvg+3s+DLG4QhxHv51Bi+eA/9lhwaC6Gloz59mEXbR5Cb8bHkl/jj6j3CM0JtGKjFEcBvQQL0nwtRfgXfZdj6B5pwgNNcFwLXJBNDoM/6Mfu06zh8kfyg/gM/+QXIF+nn8y//PP697lL4KXPOoDv28C8MYDE4UV1fHpaIUmQAun88uTuAOK2mvAEJ8HPjmYiNtic8sBbSJWiiD8Vj567ERr/HC9z4eVvPCXfC5rnLswafB64tANFGseYi4Cd5dRWwITXJw87neNg4opeLd3QWN1CovNCMkRiYidpaJbCbegWSdZUlD/aBaHr9i1nAWDGBU1kc6dcxQwUpYgoC3DasI0bHBG4tHMruOinQOg96sURooi5ZU8OI9Y67Wda12c9qUnh2I2nLLkvahNCBqGZF/V/lJoz9rizXoQkXuLeWd5lLwyEC8vGXqulGv0RP0GOUGi5zK+3XFvQ+tx1cRAMHVxoZzdrVnuHOi0s+XJzjhvpQlEnOETMzM0Iu/pK/gPg3lm8V8JW3MgROCgNFL2v0CkywrFpAAJSoZ75P5l3HOCAdYjBHFilfpihBesAhKE77kcZFgF1Ewe4ai4IcIJxPlzoLxhFNqDpXiF46S1HCM9kUn3Dqrzx2wWfLc/gt8QlZFyLxwa6zZoxMa6OU9B1e3qDidF16pvkU84wqQSrGwEou6iBP/DXV8C7K7sw0NVnMo31jg+xV8Dyn3iQRYtNotXHepMvByaOWQnhoC1kdGmbQspiqxFQB+UyeFO9vmOk+q7UGLgsv5iNDSQ3f0bbPr4F17ucPHjwXoc01rWlxukdqili77qGjSa6/1TuQZWX23gp+RxGIlvclopLRwBR6pjKJsfF8MCxFaG7orEHnKyiAS1L/LKG21q9Ii6NA6Fl8gTEkv256XhXsV4d3bVu65cdm6x48MCEEr/fVLb5TrrpfufvF3J++8NaSwB4UI937jqTWhztt+dGevYNH1wuu94f1nZrv1IO2HNLxVwcaII2QMLB4Pi31SykAZwnZKyQ+HuOJ5ZAyWgCpaZq2PsIKHwcJhsIYEJMmBMsCQJKKXuXIe2Ldv137t3DUvHFs5EQvrvRYVwe0o5lc124CW/r0w3re+gO4nMIluoGuv/Sln5NPbTnR3DXiiIlPEnS+kV1/ePtJ+2WQa3lLsjDu6k1k3QsfRGwCJlQKlQFOCcvGbQtCaIsVaDqpbKqLh89X1q5jsKF+pqOUW2fHjyYQRVBu6liSnKh+iV/IuVQwbM8FhHo+XOJx7eDUk7OolqPIP7OhkCYrTG+kXtP68J942ydPq1JwwkALB6jWQyP+4fjGJw3ft60QUstjCf4J6cSXC9ujtUgVJv8XS7Rd5tPJiIwIYnlixopoqYCCGUal4VeXX4wwzh+ZSipVpR93x+uSwwzKu3BywL+ACfVhrD5oVXOKT4w/TXx93SNQy/h2XsGYrcwIVg6D9E8ARo7ml8D48ztyHvdhqVPHitBqtWLDPpenVWOFDsnqlK04m8ULRJSMlgkovW30zWw7VOzGtFmyyzzUPOnxJP1MeLOpm4gFdXXa6PuTJ54yM7u91OppXNuz8Zfnq5JhHv/z7C/uaRi2om7p39t79K5xDh8uH9u5ZfdOaaHLzZ7Z96ZWe7RSV82jiM7dMzQ3iL6iaxzY0JNav6NIGqIxrD3h8f12LywFw+IgzRKmoRu/qg3MPlU+QoYGN+Zbdo7EesUKRaO72Nm4ejOgYW6iJfoLzU6YepAv15xSKlNspbqIaQzqRka9Sq7VYKprG5Mw0VbYghLlt2G6UqmVZn4Grpe0RzLGyaorCD0Flpq7M7GCgHnDy0AsHGhNrb10jENgMFr8MqMPR9ZnLHtscffjkkw8+1bqxyx1dd/cmQyYT15gU0Od7dWxg455VQ0P27n30E6Mnvzo3/Z0X78+8ch8rf5ovlQ5f89llfzl19T58Onb1bff1jd69u00g00goldOk4FyuL1+/YXb2my1HNzPzxy5upzs5NrhXAsh2wvUuU8AVcEl8yGnFJapKneP5irJgPQ8Hwin3zg/pqjXNV/cBM7XE5VDiT9N/oY80x9tjThOpiSRsBY343Xel5JYY8QepKzyb3EK/if+mt7yPjmvJtDMpFfoZlHG6F+zeZG+j6Lce9WnK/8XotiG4sa/gnoS+tbekQRVKIrtOAgphKoATfsrDQyn4cuJcYh5ZXJ1OogocZlzyglIdpqWbKVtChWyolX5h49TQc889N7F69e4qkrhEb7Kp1Q6HQx0pyWS/hX/MnsJo+Zzf1yKV4td1X93ddMMr+XwVOZyndprNbq0gnkq/0QrfpHdc7Qy53V6XYz24g9lvq+Ad2QbvSC+0AhIlo1SW9TU0EKGoz2TUEUGfj3BTlIcdyVvrpGPBas8jbU3NW3HZdLXwX6fPJqs4tAgYEkUXlFVVjbCnWZVN/Kb/mZkD/37vitCyvV3XXjd6++lda7/Ut7NQLWuhf12iH9nyQjH3uR0Dewe8T9wzddNkODN5uCvS0LzzvtWtuyeyAsJ9y2X9JzY0RkPjH5SrBS7tw73Ek8tnUkNrAvfc3OPr3dI6fXzcx8Z5kc92gfgy5sc6WHpzVD5PROKUhTTwwwGK8Hi9PjbT/fH0EvX0VrYfpNdbpZcxYKE4q5cU/kryYNfADZsLntYViVBvg61x082j3UcDg34+X6FAdg/92+C5ru1+am/H2KQu0hHjikODeZcxPew0O6mO2WJkpOjlcIW2cLOvea7bF7AMll9+3OmSSaHh0+m04p+NJTeOuNsS1k5Lqjvo68k6KjIuMT3jecxakovEXp/Ph9l8aiLhw4TV4gqGPu4lwkQBeVwGiEXCqwW6b1sowemn7rp8PLLppQvHFsps91P78g27HrNdIrnw2BWfenHuYfpPr23llhaJbPapX193w389OVOR27ehPWGFngikwYo1UzZbKkBpxClKVO3sYGkACzMhNXnpXYvWXn2eB6C1Ko21nz/U1XHkmS0Td+1oRlL6IiuAzGjjur15pbVtx1CqK6RmRAN+VpNDw95nL5v7yo3LaiJyVdnftf/UYO/dl/eT8XY/kgvjs0N5fAbqudXQZzeFwv2+gQFnc17EJwUFfNWED8XxbRbngiP3PguTzdCHXeouzp+19MINWgCLHUemYbNOjHCrcmKsp2jGLRbWU6w7gnVntGVVg3HxJ8Njl/dVZQzPKuemBQ5kWVA9k+vrD60q3bOmad1CX7Ojb0e3qyZ5eILvZXSt/OJ7HDNxCutGdmQsHreZqWxLq4JSKlOJrJjikx4hr9qPxfBHUXFVVLWI6sIzyFBcw66tndlL+PZZvkwrk4bsIGtMdM+fwyw8nTJnLgAa6o5s/anuSpoJImBRonHFP11wEuHxPIlCiYAqn6ue2cIlx7qL7Y1/He6RJ+GZbYB2U2vJqVYqu7qdHIXLrcCBnJLJ3fCR5/vSWIRozvuMVmGtKY25HqEprXg9cVaBSsaVjD+Drho7O2AKaLlVT5R1aLz8dJYNi9UQ6jNZNkNciUx7uVbA+S+Xyz6x6/pldPnEboGAs4Y+DXqNQ2ZNfteeKzrog2dy7i/fY8msPTF86oy32Dacy2rUJFG+/PJr+m5qFciNCr5KUt7svBx6P0PcmRMTvrNP/S445gcPrT7gSXm20WttYavsQudw++rc+q3rvvHEyegEV2rSal3JDzi9Hgpcnyp6NAKCh/9t15eYOb4aaIP/mukJX4vtwK7ArsImS/Ghrti05eBlBIdjJk2kQkFyuLzNW668issl4WPdToryYtQ0fKwbb5Kvo6SM7qhWOiYVFfbpcwrU6YtMTyX6Pplks39VRkFrowJSaQb8rLZWE+lFnRS6yqRGZLHOZ36KgFWpal7VX6lUIKvZljgqQhBIMTUxzEadk1mQ9uR1T16ryKw7Nnzd9Gs6vRjHeUB2J04k1xwfaesOWx0xWUdu4zFbpD9t2fLpf3Tcsq9XqLbp5lJBkbMYnM6uuarr+fFxXW52cPcXD7lLUZIHZoXOaEHsKUVMgH7MOAHW8cXcOTCoCtubZqLBhvbLV6VLgOAQQr1AyuXOpORWZXH3WELjyWmUdj5O4Dify3NnOv27199hTXb65DZXwLzNFrepvIkS/c7GHkfGoy0Vu01uvRQnJMQJS351IeK7GoX9yz8yN64s8KW8I8Ve8IpQJaIq+AcMjtkKqBG7Sz6OTu/nEIEggWMtq8GqlSE+HoQP6XBDeoAczOIuu0hKShyoOe59JjrxfhV8ixEbIzGEoURpuYtAFPmLsp8FAOX5icDy+CDrxWePgsfpB0F4IZbiH7+7AMjsxz/+eMC8Davp3ddcg//+6EMzx+g3F0Eqivs/VxeLnxqZGcWf/ljcPPGGKToTv5q1cWQ1nLxebLgU0vv8OY6uMa/Tgl5NT3cTL6/WSvPavFaaitucpCMhYmqVOzo7qw7r+XqmKlU5ZT1fF2OaUdpLMM20CwDNGB7XSt/UWS8YWoRotgKof7SyHtHs2rvr4czuv78OXW9qinvLEhh5O+dmhnctQDN7LNuwAMmsYSaHv1tF2fvgP5wHkX968ZcX/w/Us/1YEstAn2u0FPEZDZm0lqfxBzTqlFNF4A3ZIC+QC6mFAXVALYQMs+t0dkFSIoSiqgb7mAkz9fhvqnmGEQ5ApevjfxYAFYbSBbgLIn/sXmSif0ApBRQgwS7wv8GW+Sjgl7/sLv+c/ux89O8b36jE/zhP0T8o/xJ46B9z+8uv3fC9arjviY6Zjgu343cfp/9Qfel810w3vpaNAl4IgV/u2bETbIR7RgKZ8VeoS4tw1/SVfHGbVcQRJpJCAb+rM8URJOGjzatVBUiNT9TRFsKbCoVipUxtHhBhqWPIBjr0iOQFrc/Iu+Fq62OGDAfqXFfAhhUpVKXWt82uIo5ew5WoZKYWOl+JHtLHFsQOr7xyPnoIDqHQIjiEn3+tdyKxJj4To5/1p11aVA5fiSGqbz5eH0Dsis5En6rEEOl7UHzx4q1sDAPF9DcxMd8i1o8tL0UTApzraiu1Bfr69Ry/wej3eQtNJo7R12b0+YxthDLfwDitWZmSBPIK6CIT1WAbuOYZVGm4RBUNTIjL410UDmZZwoY00J1Su2v4zFgUgCA1qAggEpU4h8fL5W6i76bTJr9CalWYPf3p8ssMjB6Dowfef2tT0wbnvXt5fLbvem17544LP7YMJsCT9pO02ixce+e6OAB0G34FgH/oA0xmu8G2D4+1zrT9BD2zq/rSmRmfNqyvdGSfCIYknJ8IRfQbdw1Olr8KwsPbS3wZ/z7k0/83VEhfYfK2zSWrwevT63x+bcCvgw+x1UHaRIlkUiO/NK1Ys2IQnxirvi7L6GWas/layIxaHUimcoTSS6Qb3cGQhsk2/v3vbL6x0CLlfulLS2QcnS6UcLxnzczka2zO0RZQDZ1smWk9UE07Qpu0/eK7HAW0zVZjxZKtV6fvSXZ3GbsNehzXd8NHo9C3esUY0eiLhd0sIFfNLIMmBUOO4vUKUUwKwFO1TZGA4a3FWA/VzC8XBQhcyiS8yWoiZpqHuWkKfZ2f8JTJEl+ghPZYS3B8MrmixW3pv3aOK+SCk/SPYu36rt7i7k+vyad4vnQ+5eEYLXyKktqjrZFV24uznVS2kXpWahTTm0C2herpb9py+/iWQxmjySGC5lqwfctosz7qauzzUa3dYxmCi981s4OMKDOnlvXfsLEgBGK5UiayRsEPerYMNhpi7sKyUHI2bF7Pl/LvmdnrszTetLz76Lpc2miLVno7L76Hvwn3xQDiYZNKnfc25rSNGjWOqxvhI8SnerFOfohyO83iT8DDKgdtAF5Huio6D6NJGN5VXT4va8PVD8bKZPHbHOpYoS/iyvn1Unch1gUE93wuPb4jF5jJKE1inczhkDX0rY5Bs1+vyazp5fI5vzvuCJtE/t65QnowqVSoJMQz9L/0rm00aB1BnTkSCuhdK2cS07cXN3b7ZAou1wS6Ord0unVUwuLMpnIUNKMGZ0LaSLzB0bC2y6+XywwsX+Af3iSD6RotGTyugYHoyvG2TrJjQpAwR0lSwXHFSHTrlM8o3k/UOYaxOFWHPVNXnDZv1XyyROPCV8Cjg31dXB5XafZqDV6zwprs8OJbqvnEj05ALhry93ti20q4ddQ6HU/rIRVq6AqhMGvF/aMPf0xusn7a38WLWPDiu8RT3K0qHv7XCp5JknMOnkkP1NKektpsseAOvTzig9uS8GZ8GC6oOUjFs2yahOK5aoh4lQlp8w2z7GErMPFkdjSvUoFe41i+fiv91nNPf/M7IBhfNxtJbPQNnXrj2DxQ+sYnDrbITOuH2v5xxcz+q8r7k8mvvAA8IPGD/9Bq/B8QN7x5R18VGz2y5ubpO4mvz+j9pO7HT9F/ov9++2cw9i7mTlTwwDIlMh4VSTsiwVaTvq8vx4yggNskV8UNPc+WOixOvc4jiC7Ksy6CXZ3P0M4jigJ4JtJMZBLtJm6mii+6MNlaD8vKpGgXgo1eMKn8JG70Z6xMCraGPQo661OtL9Zjtt7G5mjp2+rhSMFmgiMMdiXJahIWYM3Qvn0W8seFKhM0cpPQpcSdOClwYQLUNcwAqb4OmZAkkqiyDiVaK/MJHbXhhkm2io0YVHj4vanA1CPVWYSc0eoIw28un7OpxR45aJ7aqpZxHmbnDrKTCj9Yk210j9GvLcBhHkJVyaoGjCC72kNRMtIhsAp5JGlGA17rXRUWLIbtvGd5rAcLzubik8laS2i6AZpxzryIEDJAlriblhTnVo+F8GPQG5FZSPAGeyQjeCuD3Y0OIDyP37jEFaFlZLZtArki+CT4Q80Fkar1dpKOgxdrh81+xYVT9e6HbQP4DOt+tOpY98PanBXNTdXJxY5q7+QqUoFbcYNwXirnazJBdWWLcuJJFqyElYemLfaIzj0ew4vRYYr8Zm68iRIwgtimEvA4kr22FEUF7Ic/+LMxu7IEpYBf/OPFnxBK+LudWAjN4naqda6gUVjpJIfnvopWewmbUQt5bdgGEydi3XNwK8vJON4RH6MMwseecX3jEX93xn5sz2OPPa9zx8nvcSbruFR+ZLiUe/opFOyZ3Za7xxR1atDekNF9vD64rg6EAVts8ofIQkBmJbkC0szDF6C6M4HLKiSITk+CysT7CkwIX1ibg8e2LgsBG2tgNwMAp6K93QMJfNCXsUsN2t+fl2l1pDjmBu8WV7QkSfq/wYMHmxpXl7/S0SKQ6+X0F+iHtbpCB21rmuxpsoArOc6JDRkljubcaU0yddJDj4LHDXmz3iPkcAFFcV2NgzHaXbY8H4+iaXgeSmq0ekl8XfkWT4PO5RZQFM/ZMJTEn2RsZifdy/kVpNuPNWDd8C4zYrm8qyGdFnV3umxQhWngVpIFQq7KiJTztfaG8wl0p1cmc6LWvkXd/DVjWFfL72UzFa+Bx08zwxXRZECks4nnTnatLbXs3PnLCxVEueUeDZvUe3T9XcNsTu/F6elg8Fu3FSfI/t13dqOk3tp1X0U5PWvr6uNzk5PBwHdZG9i+l+tEeTyDe7KSxls2enCop2eMw52U2Zg83sGxMR3bG7iD7iVe556E99MdVXuH91/cA9gEyuOPYs6Qxeu1FOW+koyIW3yDKAzPjmJjh85BB5IJxnOg3uZktTLoKbGdmllo8SmSCdTGyVg1HNTz6E1buZWyeTR9C88MHds20mD29O29/7UD07du7PApBVpv84pCbLyvZIomjh+Px0yl/ol408pmr1ag9HVsvHX6wGv37+3zmBtGth0fbN860WG2tI9vM6dWH7nzkbG5Vz9/81wOZPmF9dfe++SK1huv3TeejK8+Orz2rW2gi/5fW/5jz8ixqWRyfN+1N7auePLea9cX+FmQm7v586/OjT1y55HVKXf31m74141403fxPc7fiGcgbz7P8gZcx32A+FfMgSle1AAToRJi0TOJc0xrXVLpYoTpqASvoTXH4LU6WKXIPVhRUXW2ArGNPZbEvy6eLjxGGVmThI2TWPEGYhN3DuuDmruxRIr6W6yxwXZysB8+lI1ZytfgIfo0uBKoMWacZ6LI/FuLFcInTGa66r5WQ83VEhgm48cknlmDywI/ufB5Bcw7Dwj4ErGJftSsdegk9HGF0S630I9Y0LP9+5lnYMpicmoE4Ar0zAwmLaRTw6+892v6ON6g4xvigb/9LRA38nQ6vjEWAP8S0QeZZyIy5tHXfx+hG9DnwIOPPgrPqhX3El/g7MR80HYqYcGSugHzOeDDk4+QBq2Hy80IxMxk+ehZBq66woCzlUoTj3ehiVHJODvYKCc1X8oFlWqljoH4At/f1O9v22TzXNaSm+7wxPqnox17Xfbt3fHBrIW+zpzujexI0H59qOQv9JkiJc9xsJ1bTJFRl54gQGS40dneWGiJDm3Mde3s97Y2NLY4m0Zimelu/3Wm/ObByKaNha3DETAz2A69OlulJxKewRhxJ7YOId6NDKVIQ5YcNqV50zMzXSFva2gtaoUUL2yFrELqMIOLWA+9vk6aBRKq3NeVuXgVgCGmk3r+VXTvLHwZpR04f6j2OabHeju90G2juKaGJDitThbYnkZzKlv0iLlqW8wF/p1pafTnXI6OYhq1NEqNveA7TEuj3KxncxGP13c0XrsO3BhuCajdTO8ifQD1Lkos8FL4zaRRokYlG6h1kT5QGk/rDJ6wFvwmgloXGciAthT98Mq5hISttY3Au93GxMmCJX0g4HLFQzxeKE4kTXrSKEi6hCSfASIuVoMc0C5FFQkIoEzJXLbwWquPbaCGWBa/DPln0BwAe1pnuuIaHfGHWDyo0oo5Bmp5rPy1eCyk0ok5f020+1TwGuIbA4XAX7m4PLqyBwQog0jnbYpdOHXIFqfgE72nKQae1IZ7kuDfct0BOa6tx1J2YSk0CTwVd2E47kVFzQK316UgZXUQypXCgkrUHoGwL24VqJTpgfqEEv75q2dnH9ja0O0e33ES2lPJAS+pcU8kyy+nBjxmX4upsHkw5O+cTFmWZfBD5uz6G0avWBlu9qqokP2qC6f22hsoKmS7mvibSBhYtr+3tGUgIBJV8ez4OFx7AvUiB0V8H5kwCAK4liTjemBkAOJYt6ZiQwgvqTVkly0E800OC94HxEFczNhaJWhrmXXuiSh9NW2mNfTVgUa/ga9B74EfxqAdhku4/R/cRNzIml+2IxeY7zjUBz+hRCqjPLCCOFC1zC4c4Oxn1p+k+/DLmBptbUmk1JAqnMBIXFa59JkSjiVm1tQM4CR+2YcqcXoX22DkqNP9//gpq/uruGzCItMvGC7pXEAQjpGUU45FBAYttL8yHh1jgSWrNY5snj/HJsvAR2CEAZcQ/UW5NBuoTSrmHHu32zQ29CFwYPRxH/1vCERsnH4VwbfRa7qpjA/8iAJ5/MTZ/v4PwQD74GVi/YVPc8Yv/G5/qApHklzPOcrErs/De9RFPIMF4KlsxPIlSzAWoOx40sLlp3K5VIzipyiDRKhU6gxijIfAhJLRc2cUrAOsyjGTB5Q5pn0WmuVoAIFuvmXCy1bYVSodoSz4yCMkHAQCVnOoCM2T089/2yD09a8i3LjWk3KQlNUk3/TbwStXpThbt3Kapg93pkY7GkykIdnU4fuCGDzyl749bh69hSBO0Su6NxlfOtww3eFVxsbbf5Lf8/i27q1P7C24+g+MbFt21YoIfSOdeu4FK324Ms+2gXgW2pHj2FrUz762u9DcawwEjN3NRmNzN7G8raEhbaMS/J7l0kkuVyBllHilrwJ9UwXOQpEjtpqsEiGqK8dfchZd/Y3GcgC+zV84tZANLnEbEquu7N9zX867bm69b+F4UmvCoyWgVKPh5UeGZ293ZXYv679yKi+26VPFvnDbzmXhz9YNLjRz3Q1dfk8pagIrl9+4Nr15g7uzwbV43JzGGSNlWnEomgoHRlp9De1NLcW5o22aptG0Pr/74blT9ePkvtG4qujwtK5MMnbP9MW38PPE16CfFkB9pZTS7dBwZXyb1WjHANNzDDdGEXmp3CyDaQy5QyXVyCLn1qrHAEFl0pB/WnCbatXhfgdfYVSB3tC/yAx0R6St32aNh6NmJ/3Lp4FQca8+4tardObOsQ15AOwBs1byQ/o9o0Aq/2OoLWqQ6J16F/0e+NktQv47cr0jztbqoP1NoB4EDxbHXCWFXGbkEWb4njjs4Is1aNo6s5PPnkucY/x9NfSGKpWttU6L+Q2spRzVOsof4zj+XHmNCkHJrDoWtomb117TP3jztjbuzAyvc/ep5f3XrEmXT4AnOErj+oy/v9mP57VedXfr5l7f+ss0bUfniqUDn9vQve2JfU3pdTcsb1zhbig5iquYHuX3OMvhmtPQkgqXtK5MhFTppREsHYGPZN7HT3KrC69g67ydYHsa56caZi+tbHRUiahYVUSlOpmzXNK+4UjHiju35Llc7/dDTHiNrV8E2iZ199w1g0NHpxLlE7GJw31fHX2OsCW7guGBvIcHBgeuW9vQffVTGxzN1n1staI11eE9171/JJRZd+Po5Gf2t/8EqFunGkl3y8oMtNsrdW8qntTC+HjtdCuxlcHv74V+TUfJ1+xx2vkN3SHd8pE+aShJYCJlUTekm9YROvEIFo3FZjCEuy3HilOJKDyHxankO/BoQl6wdVZn52sY2WNXAJci6jLNzQAeRgB3H1iMnuusXskRAD4bXTecsBWniuPHkzrTEqC6KptfbzRz81y9wjUwOAA4i2B033/KDM2O3t2ezFV0h8LfmUFltUlvfHfTwcXouhdO5GfHuszuNqPVljXa/EYxfu8iHF36W5tMPlLekQuEWHtUDjf5Qe4t2ACqT5eIxcVQOpUidKFQH8oeifr6++cTsnCfv11pFWML8WvJgGy1G9m7CEyjVnGHFNd8/G8ehOSUSmkMO9T5sMmW9eqtqU6fWlGPLyWQC0wh5n17hn0fvlKHk3VLeYSrtPoNkUZ+i8AWbnT62mIkQWfrYadwHo5XP8O3Vz4DwB9rYFRwX0GXGb+be4vCI3XFMIVX+gUMo3cp+ehreQWmLAnxThAqSaWpEBYNpqPpSl0xLoK8i2MNWBH1PpnFhXQBeDJNmQJ8RLUqUiOCO66eg7kKdmJlPAZQVkqKK3VAiG/ZClx9pYy2xisCchFqfS58RdkMwKy7EDIaQwW3RGoyddHFkk4vlaLNYQo3UwSHbdEEyh+lQsE0mEn4/HHuLbRbEmrspLydjSEJ/aNxs1kOWSSVWSzjgILvdHu9XY1ByeraLKnuxJAW+DQD8Ui/lv6pboD1WZUXf8szwDO3ETuIbvx8U5NLxLWG+ruKze38sY17JrZPTkaCCjUZUlbn38FL/22mWnjerWEDYUu06n0MLIt2IQyMBbDhs9oZzQN+tb4O/X+4WA2VhW/Jxuj8J4BkuQT3hdh/Oc/csKLFlo+YXY2DAdc3laRbY3eruC5bQ9CEr5wHZIm1+pSfEI3l2wuBX/7kcsZSa7qDcL3uQJNH9aDOaZBqIoN5kSnA8F1y8bfEO5Dvzdggg8QaJoNia4+sXa0OiqAQ3M5Q8wLUlgrTFedrkC0WYAaLuTXflrpU44y6npdVrBZ8MTtQnptrTEXpoUUNNF9fyCcWqeX3SpdyAaWAYlppYi0+1aJGmgtvLGAC5EFF3/dAO6y/FIKnS6cJJRNpPkrkji3rlTZ3QJVftA3Zpm2ETbQMa2ltvUTjL1D41baiBUr/k/QTMd3HvPl7gPgwva83fmSLEeJoKV53B+SXVvmZK1px0Uf1HCHelsvXvFiouwGAvV7h41ji4luEkHgFI7EoZirJMBA1myw8ku9UKSWMxXqWMboAX82mf+UAZYfTDHSUl4KqlqjqfPgy3md5XqNRhoYKT/txd+++UblKRAjBT+j3/IPFAE/qc5soShf0WIXEHRL6HXvB4+4eWVt4Rmhx+bQ5rsISdoHCVPPrz5e/ozarReHOFaHMhpyzs5TVIP2auLgPrvUD6DMnoIYNl0wcgoikwmlnktuAA0zs4ru1GpNRp1ZUAiavJ9Dq2dkAfHaOZI2I6piHKikES0YUEFaCUKrhO5Aay4rM5t1ViojW7rXZSUPWVqEqw9Kj/gXVmfW8+5Y5LIFURR+1fvvLNcKkQdML1i/AG6qOuAvfrdBlplcqDAoBfoKWgVujy0yMPGYhjV+FNHohjfGS3iv2inlx3Odyuh02sU4bI3h6jZJfsYdfR/v19cTZSvyPiVFXw1kMBLuOnWpRHULFUsytCAzoQNRoAR3uDSV3V1NI+JB1Ysuh1tYDycHMaM8YGjg13NOX7WlaYwdfQWOkTEb6O03YxVIAn8y3mppmOpcdHPRSjjus97V8bTuaLWU+ab3etXfoDTQzatkdhfKLDWytShv0le6A9mcAaqoehJvcY7MH4CNNhUymIKXX8NvTlIArqk3PQk28dQG9il/EuzSgV3N/Fk/nAFUP6A7kAa09mT708sS9u1ra9t03Pnt3rOHkwCJfh77O1dnodrZMF4J9DXZn2zpQWOTx9Pfd03bo6a17v3ZN50Bza+8Cvwa3OYaPz6174YZljsFrpvd+/XhP+fGad8PBui/u414PZZrDOrBl2CQ2VgoMtjVSmYB/1OKHj05PKBrNoARqCs/wVwy1dlIiuUxmUCukospOhntYUQsJRKGFHq1Nnk5WMLj0tYJPT0XQFa3uqALzI9h61m9mCqD4FUsM7hh1dUtYAeWosJHLzQx0jbbuvW9FcqVnJDtq8CotTe2DseWHhj24GwBkjw4fcjtULSu2FeKj7SnlkW/lt8TeD/Vl7TY7yNmXE66unNtkov/NPkx/in5IF2wNOQoxG/GB9dbmb1y+56Vru7Tqe633q4LGIFT6zZuOdUtV/Mk7N2Xn9inX3bTCbwo1Oh6yW0SOwatndr3Uhndmmi887xw+vmHiwdbyq/7gP6ITrV5r0yqM4fF7kMfPQi1WgHtsDHV19WEdOajDcmJxDiMEwzEqQDnFzZTBIAjpmCOEthnbSVHDsGb88CX5NT9fqcJWUCmMhb6dmg2kRwhQZR6+bWkGTXxqdwti6bYHYjVmEt9AfAJ0A99XWgUQ+8B3hIHiCL11nmdgYgnWoP2IuLiis8o/+juIPTKjbPLU5hwxgBjnHjwx21h+qsYqqGOqM+zU0EeyleRpLEulNAl+i4jyuKz1I+wSbLS0/mB52catD5tpx/csbGhoxjn3o0l0/r6trZVRdNT0wwdalx5nN9jizffXf7xpz+eIHWgS3drnTgxXR9G19F795MxSs+x0q2P1nz38vVsGMHbe4j5I7wfQ+0X1vMWSbbwnO0DJVEql2ahWyMTLe8PBFgrjcjgBNLQTgeOiP5Ujl1hwABEe1JJa9RMxQ7/kkeN8rWlLrCvTO7IGsWXd0FB2mIzrPglzetDzSAC0uaZ46CW7nf6WY5h4xkoes97Q8p29iEvuU9a7NDHrx/OKmQC46Wsd+KpY5sIr6NXVD5XKT7l9yC+EO4e4gTgFfRx9SSTlKBQCOQ8TIHO+iMaXwRvWwcJ4WYALhQuUSaUVWAD+uysPH73qvoc/99ijDz5w68lb77l96NU3VeBBeq3mrW/1MvhznZwnGPy5cSxSkrT2UHa7d3yUSlkzCHpO6PFbvSIJV1NptKumZM+jQFA17pNhJmOyZTJsc4nrQ9HnGBCyBZPkiC6+wqyRRyNugjS5ouZ4CzV05YqoPj831Lg05pyjMJGOL2t00MZoYqo7WAGXm1q+Oa81uyy4NOHSUyY56r/5fnQg5+Z9KNpcYrg5JBV7m0ZSQGVpGElVUOUq2IN4EJ5RN8rRI8RBjAg5He4FkIPnq35THRTL0kiDeNASVn4Ytklg+x78T041g3q7JHzgt0VYdU3Ejxh/w1NSIdwYUVOhoHMozUJetVYSmSWLUFhqybcqFksV7PdjUFlCJUlgPFDFZgn5FRotTxi2fCxMS9jh8VWgWkgdh2N2VRBblqQNY/GYf0uYIV0ZrBPzllRYgrLZ7WGXk+Jz9C38JmQHV73VGtoXwlddwnP6UMwvsMBv+tIlHtNHQIDRNy10mm6mf3SJw6RYEhesvNBbqtDKaYa0dmETCDujK9uaKLjh/gp40e4idCO8AXEdvclKyJqdB/yxJH+0rP9fePCx0qcfWMAVMPcRPPmwLVH+70X8AZgV7vEccSdGYeaS1GYmrSKKx8VlQg3q6Hr7XOJ1FsMHY9A6tbU6ThQDXBCeAD/cUGxZ7+mfVnrDKYujLesXPFYfxyL0JGn6PRgx2lV81ERbbloQoZphagEuvsd5Fq7Fi+VRpk2vU6htlI/yYJiJ4iUoEYOzgKa9nVfAlSVeZ7AKF6GZLFpk3RjkytCzyf4jq+LZmWv6eg6tSHgvXfRQlzXt1xuTvQlHLqCHug53hPo35vNbhqKB3g1NeMawkBB6M5XRQkXXMNsf0gbborm5/tDFixdjdCdxBMVpwQGGz/jF94gyvE88aP4xj4e7SQ9PJpdz8JBKoRPPxyxQByVyAZKJLKqyqOao0zy2iQnBZlbKF0Dbp2av+pxASaqsPhn9fnhlbPlKqi0bEOuk9qxfBlpA9PtHwb7fjs1lVErX7tdm3M36QKOr4yi415dxyCj2fFTXFWT8L4OZE7EBLBCIe0gfLxQPaSRSqUKmqW/FZUDAaxOzK2MOFq+Swb2oFlooHWkl6gFMJoj1e/YsteK9e6trPkQf+9Qsvnx578Al697e+3Nm4fS25fTJN098vxIT+iUvSDyNzWKXQRvYkm4gMzs3bBhbRhrIERNv7bp1PSFve2j9UlUFlbjcO+c/eWEB6/dXSwjYE/BRpQVgUf8r57efqNSAx62rNeAIpILg8EdUG9A+LYWa7CgtAhNTkJ4nPkn5wTdjOcl8+YFlsK8gKX1E+QHxr7VfYEZfSUU1FvorXgzq1wr/0ai+ef6LqvyfXQLgegH/L8G2roXjFkBYM319RFXpsEz/SAjrRTju85DWC/hPNy3JfzqebrLwL+F/JVoqt1SipeCHi/h/KaL1vABY7OpFAqBKcfPQYIkVAK2dF0ArCpayAriQXUIAgMl1FSH/GfzReCikFAiFEpFSbDU7HFkSZZyh13fu9drxZccSz3cqM7VDnirLXJl57tf2dZr4HF/g0LFntrC8veAe2KXXCVQ2XYfarflirtMjMQayVm08W/JIHLkwcar85kNOlxkd3pYBn2Siu+MasD2cd8uP/SLUPRWjr2kdCcsl1oQH53uTNimgLl7EDFBffo94WMXDH2f2FXr+VeJhLIy1MBPdeGajAxqDQSzSIIK28bl34HWN4AahWVyP5YCGazGADnxXRezsYLfq1PG6pvm/ezvTVpRQCZYiVsEa+i/PgGsbFBZXxLHfTBliPbFAU5jSpP7yDH1qyDQUQ1kYtSNsRNkatSOUhz/p9XWmrKZQkwNcUf5PAvy2dXlC/VzHgfGYuXXb8A/Be+UU/ZzL11H9KY0jbDCGHBoGZ+MQ3URMQL1rwbQloVTO41lkRj26c1HUGt5sFMGIBrkWSVbHqEFSiP66wGevo/K55sCyIQJ38w/Y4+GY9Xr6oWcAH3Am6O+DmWc20e8PbGuzXrtT7dU+p00uLwIS/1/lX+CW8g3lMHtuyYv/ymmFv78FW46qIRvSlI/MeHg6I6kvYq39IpEe+TpRxOdaY9nC+zYK2E5mtva1OtLNyVZkZOdn1MmX4j5xtMr9/LLWgvf4ne3hMP2m1uVP+1992pOJRG3gmYBdpVzX1+30gIwlFmvwHHnZ3p5GDJwXQxh0V+Xg65rJnT69SmXw4m43IaNaMtjFC9kWh4iizHqJ23TfpvUmrYWicCVUd4/TfzK4oWBCpppg4FcoF/ptuo/4T8iXJoTZGY6RERmCjBM1qeQ4PHE8pkI0kahWzqg/hOD5ltcoAHVcYvYmuZC0aByS9l4wGwxY6WFPsnSc9s4zA+ex3CBOLUnFS80dDgFwu62kbs3p8ol66vEXGOqhrBFNNVl7SupoorW/SeyjtAbSo+OhSeaVOboMZUjiqIRp8ao/XLYLwFSoxYHJ7y1FzhIcQMJdsCdAYrGs71qSwg+Vb/3OSCwl68P0MCPrNsxZUhYaA2EyH+SRVo0czZtmnU6kOdmtTy2Q6fzhZCePfySPCFW9dKcSgx3t/lQHPLycxrAt01AKgPs+lC0/WCDhb3XMFq07dsFjvWqFKTOaw/0fzoLqrINOQglpDCEMUWNQhmEyh5t08tQyHgoxVAruGNQv4Xz1Azu9EfXLo3p4T20ApZ4EhJL+T7J3ZKIyl1AcDLu5cofLrWqhv8LVm0xCbRp8QRsOO366E+eUh1o3tLnYMYQSqUTmzIc+gz8vpjx2nkJCUV6Lt4NOADXUR1n8MXwvdxDTQktUVxI6gh5SyRMDVBz2zrl3zjGlJTWznl0nUQlWVlHisjZNutQfiixrjYod3NjgbLZh/UCcy40PrG/Izg7GuA5xtHVZJNRfSmu4g56ERSK3xZ3Nc31+f+/G8t3NG3v9/r6NBWfcJpdYEp6KfwTMuIt7C9YMPRJFOi1vDPO5DpfFarUrpHIsikBOUUUuqghQMpY7e5FemtHle5E7wgCnKWsWYYXRcLeAb0r1DnWpR6B2kvTvjQ41nyNWSGSk4FHzxuF1doktN5rSp4IWq0pns7rInIJPHEy3e+VD9DsOn56v0wl0Pgf4Q7JgF4q07fSOPVv96+nP52Y6PHITpVXaHT5HI3kNS5MGbwAPQppaoUesNej1sWJRmc1k7EolNxAMhgXQUqsQxnQ0RZl562zkpZ6sCroOKm2odkCm50lFXX21oQeQ3gDwAvE8dTwJ3x7wWDT+DDqZUkmNWpG89nrYKJBw8Rfr6GvDccpmdXMjonzIGLaricNVgvcQlNVKccPCppAp6FDhiM4YpPMApHMZ1lGyx/MYls8PcNJpDscdUSgiEbHXqxGLre0tbVabzYExgjzLNnGhMjVUqMb+m2D+hRvQxdqo6VrKiXm6kOZskhlhoK3/fjHXZHiLEs/4eGKeSS0SyMQiTuVpjQtGlcLIh7akSy2q+3aefZWfI27pbAagRSkgZGYj+rbKjp/LzUFnwqHsrnz9jzom8piPQ/4A3Idfw9kOdYOjJFOp1Tim0xqcNooSsHPjz52JVsZ8oJs/y/pEyap3w4fuHlSCBbZF3MXeAxagAY35AYHWaXyZK1KI5ZAYcutwT5vS5JWYec0Jh08nwPcMgqzBphLo6OeTBYdIrG3ft292z7mkp7+l3RTImP/rMBPHJjGMuwHqLjvWDmUYLxmXDVIOqPw7uiilLEzKg6JCI0aQecCrb+KZryBWM/q4huTNXmaVKtcIAHDF9sp8hmp2m1XhqL4U/lCluscRAHwSnG3OikVCYb5AJ/0xi1yg4ErUMlmaMFgaLOBTyXW3TdHd4axFJObKybAb/HRWJ1YL5JlUYjTvoP8idmiIHR6PiTSto01rzCRU0oAjUils68CvEk0OOY8roG8B4EJ+uo2ipN6OHPjVFo1IJRN6PBKeTKTaX75DZk50+F4FyHYLX3yP20U8C22ULixbshSSGkwowOCD20Zl+agsgmexk1YRNyStoCAXWb+9NsUSnWQd23irZ3x2pok560IoRpUyHDZNzKh+Bi8hWYVNmy/hw1+PJTccR8V72g2z9z62P98o/C0AAqe+m+7wZ2xSpXEteHmjUfx3c+flX16inG/jZxr3rb9Mc8PuXVeXntremqcf8IR5SZ0C3mAce1cH+NV2swf3eJK6Td1b+69bUOTH2LBrIR+uhXzognZNV8m3jGppyfWkkhKxvSvWVeoiupJicbKLEERDzTm+IKRUeiibxojCAGfYVNh5NhE2xTAF5RhRBSDQsv5RpXyRGdrBYxMdDL6dtRJNZztSaymz6v6nHKnqFFhiGgCH87ohJilWmthWnLo7xpMJDn1n0/SOqbxVIRCUSo2rC/aO0TvWDmXSFmXX7JGu8MRwp7nplsmuyyZi5bfBtFgqtPsiBpQUwwtSFX/N3Nzs3D7lzE0rA+smRGrhnQ0t65d7NMWmHALHvP/gzW3hK2RjN67PGkNFatVwfPV1o4oWd4vD4CXl1vyqSsyHZ4E+Yw4bwMIlfSIcMrVTCoXWJKYaSKyRAjyelzF1EyjUxoTeGahkFO+pjrmsxDm9CxzItGOR58hdbPavNza3dTqqGbHc9pkRm2tgYjqNPEqFOx8CLYZA1lZzJXHTomQacaqoc+rF1YyYLjHU4O/LORkX895Ig1VIle9vXRZW1HuXnsUJNcQDP/SbLXDv2LAIishRlNFAin2BEFemlEj4bKyCKdRmEg/VMb9MeELvYvNcShebos8yBBoB86q/YfaGZfcd5jkiWfMXNW51h86qFoRuGNg29fDBjq+4WiYb3hhZU9rc6we/X/3IFd1XmaMO9S+OyVxNkXIk2zB+2zeMy05uzINWcHKkdfen2D42L4ZxJonzKp6yiJ5ffPqiBxu7eFbF49zPnAM/1JOz3JuwQWwDdnupcX3gphEwMjnbu68X7+1FbSIBh8lwlfxWOS7nkgb3VCDQuDEenHQ3ppoKjY1kIFYwTPLibkfqJeLnJZUzIeodGqfa27H1Q0MiFYoTFstnEmwSXpUrni6fPn26eBp9AdHT576rKJ8+gxB74Qtvn51SnPsuegI/O6XKwb/xWL3PWFEctaar2q3oWPAM3jIpFqraApoJ1IJXa92CW0sGOIfCy0teqdYo0drNpNzUYIllTNwvflEf6U6Uy6GCR0lvkLvyIdoRLHhU114rcTRMHBpJrO70q3N9a+gXjR6nwx0yp5ttQnA/LpBK5HbuTYZgwa2yaMUSg0tPOUPdU/Enesr3dg24eRQl9va14BvL9zb1+uUUJfH1FfGNPdHt22b7Izpv1s6xFOK23+idXqc+MrQpd/1qRyro1QoBKxveEe7NUDJXYI+V2g923rIZbF6/vrNYHOz0+6OFNOne13mrBEi4XK/DHR2KglgUdEY7o+OHB7v2useHV6wcH+9Mx1bayX284YEmv6fISGnQVxBtp9aswQ6un5sTsFI6jywVRkyseBg5JRcLCmq8qSlF+Qy81qcUp9FrLOIyMvLqBMarYWMyDRcWZuYIG/XXzl+YqI17YcPdEpLEKwqyTpDQc5LhnG91bOp0hW0qo5myyS0Or9GUDrtFMim4KtelDIptjTE6G8w5pA5NZ/NPhfZiRkRLXO6kTb5QvP6pu7cnJ9pC/Iav0S8skC1pEmh13Ju9uaLRFebooiGtVSvSeWKk68rVGQ5Rzje2u6GGoITuzgL4xT65gF/+YttIGMpYERlpwccWSXzNsyeWqb3NgTUrzs8Le8VtOYGQQPYKkvUJeA5VmA/bg322FB8cnFSPGf3+sebm9v4Olds9lkq7k3ysPdYOxtrH2mf3rZmbnVzucm+cXbO6rzk/iERrmyz0iyzUjh0Rv1qnA5xIOp2UUBFsdqwjtlHlhnqZES7TVIHaHxeLHKCTeIY9h0jWitNnoDVUkzSUsioHv4FyriRMWBlbAMGo9JqEUFafvdrmxY6MAsclT5Y4t9xOgd1kdEs1KPWeyJLcnRJKZfC7XFSQZEUjkqvN5OD4chfPn87pb7EqPU1B2uFr8qrpTRJ3a4aWpFop6UJBy935iYMDSNTEncArUOk19hApzk0f6RgGDolgXiYNKzoyuWh7SEvILGTPB+PNPV4kZiDy9Lbgm8v3FHu9YvRcEhzpukTK2X3bprv8UM7Ih9Bf/APnAehD9KCp2K2UAcs4lLEGq5rn93uiUb6IFDCBgiRyGqozz2JxiqlmrmtVmz8HFd3HGl9JFiW8MgytOomUowXbJUJz0BGgJe4Ou+1LX4rP3rep8cB001tvGY3+2hi0aDCk1d5uLWVchvhgJtaTcemEf9luMyrMbrfHcwwf69vz8rFu3/JrV322s/z0SpuNnYJmNEWZIWjqdMd4KtjfYHcVhlasruQDZ6FNlYf07sRWliIdq2KTrbw5qgkDQMaTORMWS8AZ0PKoxPZ0AsMS/MHB3tFRJ6U1m41att9Hcb7CiiqSH6NaVMwXZoIXE4F2VfA8UBuxDegqyMgeFimmCiHMoH5U8cZ1+gioFjx/LANxJr6N3+bwNOUnO4NBu236jn+bXrN/bJtNj5BkLIPDazuCoXji1tvD4YGBw9qi2awXBQd39bQcmmn8MCaT6WWZqR0prs6vtssQ1syd6TRFhbN+f6Rr/cNHBvqtIhPouqWjy+fPdUZiXd2NuYldA/0SfsOBHet6gh8vh7a5/XNtjmre+peCXu5JrBO7A3uxRA4O2u9wb7z28pt27pwZ2phOpdokbRJep9t+eeElIlFqCQS8dq3MzdPzNtp5PPtG4tSMe3qFx9tKtl3ZduXM9fvSDalodB+QrCFlMzweQWycDY0aSHJ4VKwdIPVDoioyC1v2E02yT1FgQ8G2yZzP5UD0zHlVtXSs/LoSmYWvV9AamSI9VBmDyopZ9aKpgVdWDEPmPFT6lJULAW5RZeN8NyeKooFLfqDy/6n+XzmLAWa9VbgUjpZ7U+9g01VNUmdjCDSKyIhbQ39/2SM9yZXtXrHJb5mZ8HSsbaL6O4tGrWtlwFZM2JwNXVRze/n9hR+WO9JeEGf+XyZv2GsKdKyKL4SBtlltamvcnS6m3WDwyl2lVvDXWJNd7C57fTlK6X587Vpq4PIx8GLHquaARuDaVgp1J0ieRCFKyuRSV2PY1RgwBNfPlu9d+PFEk03kLn+N+R/+IjXSVWrrj7ZMN1sXg0o3NcS6S8W+NcXqnhmAZ9eP7cc+XRqd2+H1Tcbhw7bf3btjZKQtCa1OjtumkRKE1C2GVrRNLLb1Egfb3K35FrKNJxYIertCGb3JlMyINTFSlxBJCOgNbJ2YwCivz1fp40igO6RYfn3xjjm/YH+cT0QVr6N32G1R2SaK1xOMiaF0aGuiTF66N2rtMf/UJrgF31W+jRHe5xaKtQq3r6SN/4S8ubfQvC4aMDL6Ah2pFyD+6+rc4/D/hFzpXsEglGsGOwrlOrb3UCq9uRk+QkfdE4emp4eLE0qlPkMBq9sTkgvd+omQXh+aIK4bdg91D5LDvImxUKlNrJIXSGVR5HWTHpmVDAEO/7Ids7NYIsWMbasJlh2VUEkHsN/PyxWeesWZcuJMkrEXl5JrJR2wqMwJpdEXvvQ/JOE6udH5YM4pq517+DRjE9cGK9CGf0rS5WlWgnQfI0G32N4UAzchMV4YZc67W+ZqDHH5/3NiR/UwUO5OKPcQthd7qqQNuSi3w2kAhnVr1+7K7col97oHtiDt3z4xMTrQmncnO5KGgWRywEDsV7oVQoNWm4yFugGH09EtbiXbRaNjO8ldu5TrNqydnHTbHE6nG8vJyUYlL0hhMoy9ndE8A7QP2EEmUOmjl2tnfKkboP4CgNsA7o6qabmEOD3zQxFYwf+TtwT+zqXyJDh8OwtUGuZpvY59QPj/dxnQvfjUEgIk/FUA078fd8Qdii6C8/+v97HK+RbthHLuxz6FfbM0d8PtLa1XjcFH7lPu7bfv3z++vaMtEXQnc0qlCOt3eyiPQeUWmUTbcx6RyJPbzjHOuTesMSpmSdUcT8Tlbt8SWkna7eMrxYZR0rRcFPSHOrr4t1x3xRXtxZbW1nYsFSeTsurkw7pDf6kFAKI1gVclzoCsRqEWOIP8juQlGoBXFwCqBoSQQNnUknpBs9WipiIlG2D8p1QC/3mcDOftTLmG2N4YA41iayZEf9/X2zcSja5o94lG+g4eWEJBhB+6I766M/DB1/8ZC8DfMJSogHik2yiZu5xnvjwR6E5ZHK1rS2DX3k1Hl9QY5enXXD17hujcP6s4Ll7E2rBnwb9ydqo8nMcxTMHn3AoMF4wYoH/OuQdYuc9gckz7FZEQA0Ig5WLRs69DMZ995yyUXc30TjKeIf3zpDTYvXVHdzItfGz39ke5zxRiXZ2pxsMP3M/EpdqAi/gN83teRr9HPgzULN4EdIanOTuxHPbWC3qhMhx6idj5XEwmbREROzEl5iO2YzFiCyaEX5XElhdtViuOgxY5sQ3+3GYsTOzBQsReLIDJ4HdS+J0Y81z8fckqVPCWezwJgGFioZ7/uwAIlJSqVKAkkqUCgcTLxN1otAKxuyTHcPBZ/Fn8Z/jvcQ6O618ijpckM/xd/J/xCT5frRZ/lbgLa1T8ORHNRaeguzK1+7zivxPRYHAK+Slst0lQ8efz8C9WLDcp4AMF0RV/boJ/lWiTJ7OOFBsxR95JsubCMKjjcsDi2jEODHob4d/Bt3G+hudKeoE52+fQftpHKjqjB0WlqCKQcwKgH0mS+lI2eWecFCa7t0UP47ddf+b1cPNQunC5ZefyoTYBR3LCZlbv6TS7m5a9n7ti9ob99pzYua13xO8UKyabZ2j6d8fuZX246Yvvc16F/M9g/1Lyj6dBNt2VxtfHwVYXuNwBfA6w0gC6DSBnACm7LW3j6Q1pA9fwErGtlLalNTYbNAjsCWckFgt5vO4QhhMEl4s1mMUW0oJDf36jDdgMJq1ExRPo5dqIM/YSsf0Fv83i8b9EbHmeSyhkL0ExFs9+N1F841VUPQL312l4n7xxVnE6kZhCocGk4rvMJaN449zZHDQjcmffOqvKneAogieOnFacPq04cVqGxgxOVf9QGj70GQHjMGo1QZBGuUXIXJbDOj3ILBIF/CT8lvNqJ8kPl0c+0zXS80pT/68/PdBp4kXw21S7P+M3KQrju4WO/p3Z9QPHxlumnbioZWPHlkNdM6Qi7X018ez+y/KHx/s3u2jRF79oOj6UL8o0pg0hUvTMofXR5a2Qz20X/5PTxpnDrFiqJFdjSolYhvGEdoNRZ1C/Ajc3CTe5GJMgZkDr+Aw8ZQnFO4kzLH4VM8gQJac0KrhgL0OPIutwMlQkHQkdp83bKXTp7lCYhE+Xwf0Fk2IM/15nmvh8l79HkV/WSf9n57MGvacl81YGaK+/cl1rZwLeJYMXf8W5F67JgkWxiZJNIbPwBEKhWEbw4pQn6LL+u/2ndtwe1OrUUWtY8TJcpRYzQLFRHoGQEVvy1UTxTPmdszm03DfOTX0XyUrxVoKJNClOswtfsOpU3aqhdJjKkfk3kwk9596eyK0Kk2L/hRP3FEjFIKHpMlsv3BQT3C0z8e7WyIjLTM8M99A/73lOpw0V8ufzf7gJkaM3ddI826zjGscVQh0ZsV1p+4Ggql847ZBGIxb7KiYmrigJMVKjFfBVGvk3IEF6yHYBVCY8RM55hvHfRW3Ab52v8tzlyDoSShbSrLJyO6dd69o8/UD5pij++Pv2+Inyt25BLAf/AAXc+KXV9zdlzoDgA11brpzq6mRmYvwfTjf3r1gj1loyyBVSNU5gXKFUjTWhM2OLmzwOv+FrcDVpYsuXxEKsWDz/9tnTkKdvnH0breXc2wyGF4rRoVXJq1vb5USzqTMFUF1dETAVJ3W7u/JZltuc7sZvdBCctrZTdzSnnOvLzz1AWfjuhqDLyKU8RatM5jLk8T2HfBb8C0db3hzolepJYe/ovnvvKc01jZuUN63ZtlwrtSpJrSeatMnlxpRsezJJJlWS3vSNTH8m5PUZyGslZsZKLxjMXFz9ErH/RaVVJBaY4XfP4wKu4ZuQThFU1VswFeQ7YPl+pvwqiL5xXsFwHkHcxGN+oIT0uOb3uJZgpYDSrZwzH3yxcHXp9oJJOYi3/fzmCY3/jvL/PhTCycGuU1evae88/jNaBWQv5/c9V1pNv8mcv/Ocw3BtOsz7VYxD7P8yhiQhFyG2q4gtzxG4sO7kIfFDNeKtoMnWnTQt53CnlqvsjA+Wb76NOWfyn9883Ezxwa/udu72kEjkx3/G6lbHxd9xXoG/04sNMb+zJMH8NrtFo9WrVWIZYo1Jp7eYxIglNswJWaKDLFETm2urYRnzdgJayqcT0GpSLLE2NjImB45s0uup5xiS+Cu9WlycjsyU/xxollI4jz4XuJLHG2703ttMKkdx8S86OrdOwMW/d59qW8iz6tia0JGXwwfOnP7e9euuXNPZ2dL+LqSDwn7FWU34MT5m+RLGfYnwvoDmTWBfrcx6ffUs5FkZWvIUmvSaVDo4qz/4HvjjMPjzr0bAH2g5e//DvfEZbgHe//+Xt+8AjKM4F57Zent1r+71qiu6091Jd6tqlVWxJUuyZGEhN+QCBgw2LphegkNeaCHYkAQCJDEtoYRQXGUHsB+kAMFAEkLyXgjhvZCE934cSH6nPdDpn5ndO0kuYEje73K7N7czO/N933xtvvlmn6pnMN4Tl4P/mV1ueOvEz5fLtedXTi2lv0z0i2+Q8i/CGrW8dOGs8ltgjZZT5w+4HDSCXvhvSns1nWaq5WF2AdfvXMutNp1tvoK+NHgD/VX635x/ky0bai8PXhGll9DLatdH6T6mPz9cSwsuIeRmGguMb2LqHcXqDcrzGRgqynLQxdByMDhBP6K4JdohSTQtF0MMEvi6lCkf8fn98QTRbyII8SmEdjN9KzCiOXHeTgBbJ+irFWlrz/aee3qe6GEO9cBwT23Pwp6tPUyPMkFfpdT+ugle07StaUcT3aQU6+UmJZNFH+GYbGna3kStbJpqovJNHU3DTRubmKYmfeJppBrFkWoUA6GpP+w2mbjTQxNTf1DmCRJ3uoS6CgHqXdDvM3ogaPD7PGb0iOhYqL9H/4SeDutr9Yp+lZ7R67sd0OHwhGLDMSoWC2dgJpNvgA1PIV1qPvDQd4E+8Xfi0fECkth5VXDnx8cRyyrkW61E/Ue2QQbrSvi38c0ZpENdeATg2yP51o5WxHyPtiL1CREQevB6cy5jvlpE8r2VN4utrU9yVPfokv1Annp1l8EjFyfUa0i7BtF1J7oC1GpmKWKSmzNEFWCPUwSSp6AJOB1xmfgmcDQStisgPeTjcqWhjUQ1SCR+cCXSDdg8vCxw2rRusLZ+fKjkdcXd7rhL/bQtkOGfmpb0rLuiD+sJkTNX19+7+QtLVo4NLq4vnb79aqwotFscvjVIUXhg7YK2dUtXjn22UtsVx/SL9ePLmHMQ/e5A9Msxty1U13kjU0ep6wld36OW3/SOOj+mfk9L5Pl71XKgPo9kPX0BKb+PzIPbwFe054/AH5B27lfLp9ZpeyV+TzWg+REEOfCZXToGZhBd7o3FDF695MY6upeyYwHqReQboq8CyalDez0xOZm0Ikl2IZKrWxTRabCY9Jyd4nQ6rI/rJuhL9litzkDAOTF1aJfOKDvzmWIeHwOWkZqLKmVksB5dQMozjjMkx1VvhgQvUllPIMhTmRxJWQBn4IpHuKKyI2dJruQXbUFRXPhqg8/Y+Mrpk68jmDrjHvWTHrStV5afO7HoOcmR6W6/4oq27z68bcW8ZqNu3um+0h0I9vaEV4q7oCNR5jn0OgKjb2mwe4bAqBu+iW0nJO8i4Pb9yJ64WrFvcx10UXlXh4tyuVhoBEDQI2jt2shC9ikELiORe1fttXih10vrMagEestuHkBIT0y9v9uE4ERPIDVFL26yQIuiN8mWCXqHoo/x+F7hIY8tkqj4u/GM+JfM5tbJDFa11EmFQHdk/GgrBqmVmCoIehWIESIPwFmkjcEFa/3nf+VbeZ9+ZPl1pVtnki98Mzz8xbM57vp5i3t4Tv/4wJFz1d8waKS4SlfdpW/QLYSuHlLprV0tx3TrJuUPz6JbpAvRfvavqPwRtTyl0Sd6/nMExo9qMH596m1M5wjQblL+mPr8V4DG7/+b3kjaf1x7Xj0fEfdHQTK3BrSCd/aDZoQTS23dpjqqziVJoghBOISpN8pyWOrGiNRF2EWq11WKJ6uEo/JwdmX2leyvs0wom892ZOls1sRNIFNR8Pl0okbH1ythj/lVE9xuggtNq0xbTXTYVGtSTLTJ5PEEkimYDmPUhugtOwMUxIjFFeEEfeW+4fS29I40nZ6g797bvjWwHZlJ+xHzbBN/t1k8unky04qRiQ+lwfGEiIVtbhUxjgmCN+PZ0dE6iY1LPD2K+VaEdYxl7DeNkABLjOPy+liiYnXOgQjlSO3AGZiPnS+/lQa2lf7cmulcHLUEgua+dCR86bIOr3Xkjq/d1qRzGJ2lr1TIAs2e0jd09NwffGnV3JqYSewuJFimXuncfb9tPdIXai95uNRe+v1zxT56YJpWHAl1nWoJgnQK4SaDjO/SfmCeemeX5JFrscBzNinotqnJHtRLkt3j9drtCZpCZuZOCMF3kZJYBWIIbQlBj42lJEggtMkIZe5QzcIaalvN4zXUyhqYr+moGa6ha2pEPcFYMGjUY8AbMcaq/NatIrxHhJvEreJ2kVbEheIqkQ6LtSIlin4/BWGkCsvKGJKVEcBpSOOeoa8A1fTdoA2J63tBKxJyfzmiibGihqNZSBrfjMSahqQOVN5qI4gip5OpDC6DtVtkVZC47wjhbccgLVnGWtgqcvQxwghuLz2fh+dft3bs2tL/dJ65OmoOBizzq8OBTe0upBAvegY2P3+7FJcQAtTPl75y+zcfqu5stdu7GsMMQtfw3Wuz7uaVc+dN/r30+PMUXUaVJBGZ04bwtIrMud2aTOgmc+48NLfWkTm3Z9acRjKEXkjK906X47mIdTXEHzvBCLxDaaRzrEJ30im617NMOV+5UflO7hHlv7y6FqWts4e6IMZklEznOR7a0ulV/J20JSfkTQo9D+s8+o1DcChbI3tlzwHVatiT9jv5pmY8l1vDEXypMhg7RaRUWRBhXABaEYH40bUKXXl0taBrP2opG+ra0UVZujq6rumi3+ua6qJ2dD3edbCLXokKtnXRw10ru6iubDc+2gPWTNDbFZfNW/Ce6aUpb9Tb5aW9EHq8tFSHJrVixgRS196QJnwBTen7FZPfnwg6eYmUSBP0ZUody1qF7Yl7Ek8k6HCiNqEkVieYRGI4+F6Qygc7gjuCdDAo5Bs6GoYbVjYwDQ3tE/TtuxZZrQLm9KdhdxP+P25tRrSF6ctKJGZzQb2iz4xVKuJAnSNlrUujwSPTrijsjULU1zF59KjGMoh+BMarobpsPtP7pMrbxgb7bOWIoiMN9mMNTD2cSZ58jqLrJ38ciNZWX13w6dPdazilQboodMPaq4o+Y03H2UK2e+AW2J57tb7BtKbFy9c0rTxwy4sqe1GJ9a4rHt/wlcviZ60YiAfNzuuiDue519z/G2RaX5lbMza3yWCWtlQHzaWHS29/FVbNL8o2Jjq6crBWtEfWLiv9uvQg7JlmPFDVoZAdRt9K6HNCkxXPV3SfV4jtcb/m+7wKTOtcH2g6F898Bb4+Q6Z9oMk0XP4AKVf5Gi7fqZW/pJ2F+Qf6GWT3L4IrlPlfgtAB4SWhr4CvMvTZoTXhiwE9Pwz1tl4wZKN5IAHKCTwhCkpuNyiEQ8DtToeKjlCoGHJLMFwoAp2+2krzumcQjdPYiEYUnaZv3Zeq9gfm9tQ3fJd+EpwGRtDUGHTXNspzsQDqoS9XDG2tc1qGhxYM6pr6J+hrd3V1Nekwm+MRm2MBnDqqBLElUETvDPjRq4De25Suro7WqMRKJybonYqptrbJwoZYimVNJi/W+U8HTfQdYFR8GxOnqvEfGW9uxpwOK/oqg8RBs0ePZAg7zJO/RM0/Vsf/3vVm8XvM98pKvltV6iVNuYfaFRyr5F+o0vCF48Jxijzxe6hfiAnAH2MCxHHq4pN7TJC4RHpnTjjrW9U+S/vYJiE/NycG8mOnz/Wx+dK2B2Draf1PtzbboWFpvCN4fkRzowjB6o6gWd9am6N/WTp37OHI5yoKvnlFtG2ov23DBX1jna2dFLV4rGcZNgtMTa4dcu1tt15auOmcNadLhoCNuFciRtEjCxcWE6nTCI+dOgjj8HU+YksYbwDAyplffAKAvCJQEFRJJqR5II1acQqiDPTYjQhMwAws75t4CvpAvr5+HFlr9fWYVltKj7J76EO2BJtB7fBGmcIpFyOKE7UUCpjtCgXDitEpg7AYpsLIPEP1tLpTB0qPwqP0t1AfenAfjHKlpsUKAaopkpqiiATqjJrgH6yL+nwn7rPIsS2ogEFt3YnbAjgdjQG4wXf38KLNienk/V3oasCs2YBubLLRKjMcO0G/uIfnoU4voLvdBgNAKhn9IhIqNPw1DWnahCyZfcBBv4QM8X3IDN+1k+WZCfqFPRyngzRAd7spSjAgneKFfTqdyeGw2y1P0z9CyvwE8AITTH8+Lx6dLOQ9zXk34tKTeBYcIRoc+lSPa8bKGymfJOWTxJOH6TjOJxvt6D/OlIP9J9ipg08zcsK3+x8Y3Np//4LowDeH4O2TP4B/9NsHhvpsvqZbR28t7bht7LZl207ffvSxS9ozI/cvLy7YqcGZwEbkDO9qsBuZhe86yo9gmFQkhkawT0YQxvFdWLE65XwYahhXoT+NuxH4wQzc1c1owYuxh+9E0oIIxWNa+MfrgxYYZ/dwzDTNwqPsZcCjmFH9WESl2SiMooozaBXNl6O4DnknqjP1C1QntZOCFjJVDGa5THlhW4dtq22HjbFpLRDC++e0cVzf60jftdGLyRkosCRCCSpBquMGxmfA/5h+1JF+FJUIrvZrxLGlMhBdik4v510bXVSHawcyQQG2Gf6329PGeE95jMxP4VH0g08R0QiD4SAFgipjCWJWRGpW+kElcT2VLpifomKnYqBgyGwiUDWrFT7l8yAJ49wwV4P6NU7GmWUG2XtAag8a2av1iFt8E+/SkyQ80g55lbxVpmUV/OroKu+s4rbbEubn1TamfsExoHUXqlODicCFrHJQk1DhZcnkMwszqzJMZmJqqyKIVjmjGIxyBuAFw3qNLKbb9ZJ2X9DafRe1W1QcqBmQiqrticl8UknSSewucQdldN26y2yVk9Pt1c8e69rKWOvQWN8AWSXAona210NQn5eAgr+EZAUNdpO8Q2blY6itMt6JyngRbXA14LTdbHnAicqASWNoxCsz72WYbRmojp7OKDaXrALAggEgaADIIKW0vgKE+goMJiowUN/VQd6Vwu8K4HcRYOAiC4HGquSO5OPJ9xG/nAGN8RkNq/BoKA0x9fR5iFZu13iGG7yPczMhntHZYWYQtXT0HOx5pYfuwdAV9HKP2g6GqSqvmDZ6Hap/h1afqUisgESoDfhFP+XHYss/XRX8Y3WP63cG9Xo3zhx8N/VtikJcYu7jc6kd+APMVYeh9EA8BEXgDXKPYhTJQNQmxzcj0a/NnanBWX3KfJLxfNq6gCmPB7SDLjAP9MPMnnlYViuarO7HstqKboJhvUE2pdHH5SEoTkzdt0ewyr3z+7DE7u/v7OjCN4rSPXceFt22UA/chsbdA+1NOrmtOu6wH0Ci20m/vLu2GJWzE/S+nfF4EYt1mX4FtKErRGK9Z143Futz53b29c/HYr23V+nqRDeKrUOxeeSVHdd0UB0djLmpqEMKwI8Usbl5G5IsRbvT7HDIxSLSBSZ2DVZXmw8g8e/Hgv9IMS++TTwB2GfTPI7FvxrBPJ6ZxM7vyVmKQDPeFmNtRjck2ll9cPMR7cFCWTEYx6pBBpJ9440NjZy6+Cu5IkWJ12KYcTnOnks2lpH9diTkBT9pgeQQEXaGasHU33j5OXqG//bie5ZsfOs5OG+C+8+WX2z79pI1p3ddE384tbTq7A7nhmh80ZOr/3NBcXV9qlqOtFCF0MCNpbtn6iHxZWuTLa4qOd4ztv6mn69fYdiRqj3/8h9+e+uaRZ5lLC/Q7jMTo3Ed/wgrcIam0/zWX85UVlTdDdMScCHNKQii4Mk9QUwPbo0eoui6B119AT/W2oJBdygSxqiPRj3Y7/ziHq8XGigLQvAuQXBRBzTM+oM+jNlAwBOORjBmQyG3V8KYtXg8tMEA6VFETzQNMQafrIIIaUhTy+DQRBK5Nkthm2wtEDQV1V+OUdkg0tIS2iGTBO44fF8qwpnQbvvgajp/zrzFfSOLinIg37P2nC/M/drlmdbS52cB87HhmkaPn+/Pdq4p3HyBUDp7FrDK+hyGl8gZ+RPyNbwJMQouUhZhcT2oNDXLg0p1Fn1YXfL2QWgZDA2uHNw4+N4gCwa7Eb/Aj63s29i3o48Gffm+g32v9P26j7X0hfpq+97rm+pj+xS5W+5TgmG5DzNGkyj3zebemy/MlBmtqtvN4g110D1Du6vyaYoEVi2xgheeZtaz9Mt/tA2wcmqQ2sWcj2zwdzW+efMMHsV8JM9dieTQLqwPVeouRPpQXolQsDagBLYG6HITHf4duAlEoKgdE2lH47SVfpC2Xqq0lQVrOAXM2YX6H0Dw3GkQ5YmpXytCIGCzKVjxxqzbbLLKYngHMrgUg0kdX2aGuoDbLeB2sf2ntot0nzXgs2DoSexd/oXilSSA+meLilFblb3KcZuNo6AbC2I3bt+DxCRwv+Kmat3b3O+7aeAW3dvdB92MGyt0F+LXjKtyD/RPzaP/i30B2Vqj5L3kO9a5mD9ouh0mzDjWukAo5CS6L5E+RjsawvBsmxHnD4Bx/hL212AumNwP0lOv70JKUQRPdqQb5Cem3sLXGu1ai68IFDl0VZzoZo5vne/GNjoUFiyyPYyeMOMnUAsprQa6vrHLZMZXZPLpjXKn1xNIsWKs04gYQ5T+KRCAjv4xaAQi+t4EAL1rl8frDEzQ31VMltTKFJVKOY2xWJMTcfvdSmensekZZNT1AoF+DoSBburQHsEg63RGzO8ZzO8nC558xnvELf4WMQ7vEXXDSn4c3TQTL0cH4u1WvNCZUbkF4uTEXwGjGs+WyKZhvD6vbVvhtR/izjKXn/5LzrdUt7YksVsDvvbe2evzpnQ06twy9i34yI71n63z9EUuaR8dOgi9P/72vDlKqnpJb1t9ZH4+25b93JWnLasZqTN4ihsv/T8w3tz2pSWbQqOOodHEBTWR6rql3Tl3IrRMDjx65rK+Dd+Z1xIL2qTaYLC7s6k1vqw5UXxstPq8DlOwbueadTgPEdLX6CTCZQDcux94ENLtCBXGMPqYo1uno4xhpOo5J6bewZhxaphxYszoEWZ4Tu9kKPEgwoMF4SUAKJV17+J4Wo/x4VI2Orc5KYsz71zppMNO6HRCi4V+hn4eYQIgrIQAJKb2n72eI0U3XjccHx/3qpBHgJ8B9nGVS5M85icELp388EvU3+ftvrMCuqsXnIlA99XNV/Qjtnz+15fPAEt1NCNhsGz5zPW3Ag0OTBDBoQG8sR/kEU0jUk1gmkZXWaPMOo2W67VrEdN0CN2MZkYLVE+mp0DNCa8L32igqzB1uzF1Z7W6WQ12WeJjRrADWWgJBaNZ1pnqFBDYkgiALNJ29gEOOBAIgyFvFIPQYMnCbNbrSKU4LyLoXRaLg/suglwTmoYYcphmT0CyGHLjZYpFMC2T7PEEmIH1xY+jW+pnx5HeueuPIVQV2oRQqbNnE9pjx9NlGQGELnEMNOYp3PuIpyyELYo4X2d3yn1YfxzGH+mJfwaX2YdaGIwNRJG6uW+vpRf29kY/lumgR/fcE30iSkU79SdiPYrQGxsYCJwCAzrtUzEgfF5Wa5kLjWvzgSwM4/0Xs/nRP48lObF2Wt8OGxv+Ee5EffMXE/ePhw9dd/s/xqfYHz08vHSo4/yqz8wbxmdSEZ7FU4jfpMAvFTGCaSWMySSJPzxYdEnHc7EqMWYJYh0zFLJ8HEcjWLc8YaEsT8/ka4oQssRi+lPmbmmNux09jrtpaEVYnYHTCko1hH4Mv5tG0kexvtXTOPgIHsjmZ4JYhTETRDBuAJ0wtqcFg7gTTy4sHjrCCGTNGNYK/shPfAJ2GftodtmWak02YiQ1NSVPhXUSRCWfSFLJZ2bzT0VoSrW2Rj+Oi3afjIvOmHfjZV46E0UzeGrmH2Cs9mkkfkIe21LG6ydltkz3LFQjfdBRehTzXqSrOzXfBl7rqlJEmgKLR5hOpNOOYRV7TPOqjGEVuawOqr4RPB9RfZdaH9xTqZ+vRpo+TeVw/ZxWP3d8fUxrqL5UWUdQa/d1OS2odi+u3avV7p2ujfuO5QYvlftumU9v4p4G5+6kqcWYD1TVnSGLiw8tpoYXw/BiZfHji99azKBBBQIK3//74b8O02hsRJ1unZLvGXti7NAYvXJs4xgFxhaOrRqjxyB5Lfqxl5x7hTVrolirNxUfJhq/VB6/ZT4AqA/XoT7kscvMiWqLeXhPHoL8wvyq/BP5Q3k2j5v1BfDkOaR440kZ5PN6vfK7xO+Tf0n8NcnQHbnhHEXlKn3LPZE7lKNX5jbmKJBbmFuVo3MwhH7dm56SLwrBEFHR1f6N4w5mtC6q/UPwlTT4lvt3A+pfH/a3odaxWajYfUFZ7IP39EHQt7Dvib5DfQwpD+Le9fVFo8qVjVc0/a7j98pfOv6qcHRH73AvRfVWetj7RO+hXnpl78ZeCvQu7F3VS/fCpnIPm2DTcT3UzBRCg3On1iMbeLGNYy+Z/s4ttCXwd2KjjE49AbKKnoKropuQQKaj+MVWxNgt0YjVjVeborVITJd99eOqn+uvCDeAfRONvQq3w1pBa+k1sHIfFU5tT92Toiem/qgoSF47FWobYiskPGhldmN2a3ZHls8q3fVZpb5Rziq5PPpIZ+Ts1nAY3QVj6AOZjFnF4JOzxJgmf8Y3E8NR81dCPeWmN6Mx3ary1NIfyRqXEfjAKiX4bzZ4Mwev5uAy7nyOckkOk8cDgU4HQjzkacylQADy2Buio1/aJYku+ruqGII1nwcdR958iWy5FV+dfPlCa7MHsy53/qXDLxfqavESKpy58EQ7tAxGjRIOKIJHZyw9bWtINEV8N7tW3IwkxMUdNQvJwtNkbaLQmG+99azYWJNfzRmK+n8GtZ16FwRBFnxbEQ0+6DRVBaqyVbSLSVVXY/buEqxydQKExBAl0KGMZDI4nAJrIH43DytJIsiLniCfUqpTxBvsRuIApMTUW6n3U0wqus50pYkyiU6HDbv5RBBEnwCIeMD5V4+Iky8XrM3j+ZfGM8Ba9LrFl63NCACHEO/+XvOCI9bm1/Hu89deWrli/PDLGWgt1tWi2xXjqj+NU3lzo8qX7RgQUkNjwxx4DHCo7am1hQ67VZ8M+VhGt/DuZctePVtudVGFwVtTT84AVlVuxci6ZcsX5x54DHpsj391c+uCzpUf/sfxcCM0yDyM4JYEGxQjQ8NQLMwmdE6neYL+yc5wOIF9mzpdEONXwRje5wPmcIhlrBP0D/aFLViziIGnkbyqBjH6l8AA7Z/PHxF/68HxI95JqdnWDNwd3slCXv2H9zER19Y4OaGDHNRBslWSPUsNjUEYUuUVPsODx8kSaLCtr7HaEzyjuOXOtx6iTJI9pHeagx5HKLKtdL998Zqos6muFcavPOPWpvaQe+zHQ7oeXTQdrWq/qP3RW3rWQusFoe5GAR+cQE8dmLqWTtIbkXFXDWRw055ENCdaJCzVo1FRwNdCwRLCY0a4PUCMx12KHqZzwXDCnDMhaPxop9Waw9qzyZS2hCfo7+/0ell02ZVOWwCW2w3AAn1luY3+kbiZIrmq/9AEaRXVcAWtGMMj4pIqySbqG2P1RbJRixyngSgkEpfLnlc7njpqjgk6WbpNyTa7g8play6jfjUZS9e3dM8J5XO+6+FEaU8q0xqoX97el7po5Rn1yjXuGIwHG+eODOXnLFrzQN9j4wvPVvrXty1pjHQ/vHJF9jxPombyb8PzW8UNvWMOAMHc0mLuGvhT4AbzFcuNVthrXGw810gDyeJ1TNCvKXrWJl5igILBZcZmtkjvQo+6CB94GY2xmaR1G7eheXBEfPUQmvsAT32V0vHgQKTojIVx/EMx4mSv/WDjRR4/pIIBf90muJu6790/TS4upS9ewd5QWmwWw61nXlzTtwYueqz05fOzAQHzYdw/+i7EPxMq/6Tf+XA7iCteCIIx1qxAMZgPrgzSQcwNg4pgkoOqAw3JZ8wDv0F/Bd7CXGnjjdWINI6SGJpvTN0LbwHXAxoEdhLv7Qu7KArQ++kX0Y9qookjmHzxOjq8Zei+/sKto7ehtkT6dvg287oNe/MA00/i0cSpQfg2uJnEDSxUnOeyl7LXsw+yzFeZCeZ55hcMw7McfgGjvmgPRTEcg6MHdvHTr5xsbn6dvJZ4h0XycrAZbsYdsEDUCbxu3zXwzSG8TP9k2Y8LfKg/77E32rBHEDCTas7C0p3wPa0/BnCjYnrYsN/wgoG+C+MQRxsoZt3D7H72BZa+i4U8i2MSFJHjdN+H8Hb4LbgX0hAHSb6wBwCdHu/JenGPwQDViAdFv4N/nKd4fha0sDFYdnRrQxgft2pXkXxqsCwPJ73gnn64dui+gc7B+/obbhu7rfS37WPbHkeDI+MicCbjylfGJaJxvV0Z17WK6fsGeLvhW4a9BtogaON6kYd38g/z+3n6hOOqYEA3Hb+hjnC3wTBrRIX8qQ2o7JufFVfRNNvhjnSAv9Mj8AP2ZjSeOoBsBBJv8nccv1AZjwUcUkwtRigYPcZqI202msiILPUGyBlchsSMQdbzkONdfKIySCcapM7SAiFtQWw1D2kbWxmphWN4PFKWFdAA8UghNFnM+MZo1OuQXHxxn6AIitEqC2jaACTTFpTHXzwOCEiYrRwnMcQzIHEsPBCCOxCOJfgjhOSfajhO3TPvQYLnJzQ825dtV8/G+uJUDn4L/JDAwbmPQ9OE4hka5IsvlXcFN1pj1jnQGnt35YGVK39YOhfeWTpXpf91aG5fz15swxo/YP6LtLeu9Ci8XoNr+04VRLs4FSCKIFJhiqLUCbj7ODImI8W0/GZl+uMRwaUIu68i7BLM7kTDQO/G644jcKvIsxYAPtii+tPp56gvcG0ix/x0zdfx99I3qS/AkEg86/9zDXkmi3ThV3gd0iuB6suHa7mrwBmKnqGpt0bhxlE4ShRawS6D0aFimwK8wCd6RR+DHnh8EVyEfxWlpLxIaWtHHwZRXoQwi5R5KSvTxEZAauDm+npNw50RG0AnuR8jPmonOng/SHF/B0nFQ1PwvRQEqRTS/tF9R3I4uTV5MMkkZ4ct/JPaAIWps+iL2RE0fpbwcyN8oPRDvKaCrK3WLje21YqKzSEX8Rp/cYahptW9inm8XNf8Etxe+hOQn6QyGCgGmxuH8eE1iyw2e2yiVVay12QpC1KpV2UPZpmsGmqCl0Bm9OVIpS9Z6qGpi0CN4qFQO36/QuWzm5Ai/jiqy2YVnYA9AIdweEB2WsSU27mGrfQL4XQ7GwNdOJ4jryLTic0roMZfyLWyItN5+XGZknF7FuKxIO3KpN3NlWWach9pB9LhPwtOBIPDJ4NBvgKD/DV5ypLvQJbfwTyTPwYGVaUhZg/FIpwuJjgdhErpJ2AOiYNqRv/mOE3ItGnBHewflMlV6SXXvdkG+dUW9BP9OugYz6iImo7DOUFsXhWO3olp0U02bFPbNJvaNtOm/vR1VT+6ZuN0KbYZ5o1ON23VIJ3zoGrVAFqzaNKfJ0vpmjmDrBlixMyyYWYZLchUmREjh/iOHcap/2bfBVVgPlimJFvi8cbOmnS6tjMcClX5OtHfAdHJWiysRWyRW2uq43PTobB3P7Ev8pNvFt78VeFw8U2c8BmqOZ9t6nGTeJP64UK+IL6EPrAGiVQrWj3+LqH2LAjxP1dxprWF1+vlxunkZU4HVz4cDz3Zgr09/11aNTc1X0DCkEYGklVKXJmwsgJHh63+CFzsd/TjYa4P2WsOrAlanfVzso6A0RCqMkh2Yy4fMVhYHYw3robu3GdaW5eGlHhd7NlLHpb//NwZGz3py1qRFXdGYcFO6mteu1FU8lHRYneGmtp9LnPA5md1Bk70eCFE9KfBzcYZ5xLdHdkqTJJdCjJgIVgONimFzpqa9r5iXV1jXzKRyET70F/HuHFs+YhHZB2sbvlSdDMykuyc012srRmsSyQjxwMVyaxfHRbfLBxGMgWfKVZ847D1I+BbOVgQ6a9qmoV2WLZZPiGYIU7eSyycRiZZ6tdsnIsGBzdtflCgGEnvFvVuA7JzwmF4wakAffLPNT2eArGGGpA5tPy25jaL6F587nlDaaOXiWSsMVvHhR2Pbutee6pIKD0shq0RZDt1aP4KDH+Ej16gngF8FutD+MiBRWAcXKpke/L5zoEGWW4ZSFdX5+ID6O/oSqPB4F8Oq9yjPe3zGor5Ybk6nQ4vGa1CNpYiAIPRyFqtboSTQiGPsSFOFt7AuULL+IE43c+buOSkaClnic4jTNDYrYlxEi1DHmHjE+KFxFpgc5v1lU63nXXjk13zvJ3pa63+1jnN7ss3jI65WlPXdw/WNi5enAjC8VNBTelBKehL+quXwPh11+21sHZzNsZZTLr2unFpsCFTt+mcpeecvfDmU8XLZGJ1VTjuryuW+T7GA8LL/FnfE/i7iOXoYOnFUy9HsnOw9OHHlr9XaSdLPTt1ycnKAUPkyFZEJ91gLVgPNoGvKvIFGzeet44piumlPT1jqwbmzx9etaqjvb27ZV0x3dKSLq5j3BcGgsGo+/z16zds2uSo5QB2RCiiY+mi5QN9PWvmt3d0BAOBZmyiA2R4dhxBFDKDbMiZvFaS7xFvFyfko+YKIgREflApCB80i8twkhmCdpzQEXNN1RyPqISEKEritXUr4jjH2aKSms+iYQ78ZBTGIz0Yx+1sveLuu8YdEaNRrq61Ba68rvSjn19zvWJoq0sN+IJbL3/91nXXRcKJwVxHw/yWc4dOqzslUrsjuqKqC/2HcdEdgRCyLCdY4t89fXz+0PaLPyutGXJ8Nn9m7IrONpcvb7VQNAdhOHLVcEdYOlXy+/u789zzRtF/UNETthL6G6n43H9L6GYM788iMhrLwaqpUIUOrlYSJ0K/in3afT5B/qfD+ix0nwjb//8Q/b+C4P89vGJcqjhCuBwtr7VhXAIJtII1SibrdqflUCAQk+02m2SW0V+6XcfzRprKJvMhv7spYOd1OpudNlVwNFl4meRnmebo+ACHk7Pzab0Kp/r9JOCmf/vBz5AapsIQPnRqwHysAp15pwonZBViOCHdGDSA7ftBeOotZJJYZW+9x1PPYWVbj5RPjoM1NTCK4WDF6qhJtj6D9OF6Va0ECfq1XSYTyE/Qr+1WGCYIniGRE16yEO9RF+I9nuAB+jXghM0nWognW+4yk+SMnDxeAVSX/6aJezZlq+cpzCDsWK4S8YkIm9nz+F13j1fXjswgVOnMVCLevPWKn2274LpgzLfFhui09ezB0ccJDTLCNAFedG3+LkensmHelQqhPyvNRxDxKSEJaH7XCzXdWwQOcPU+Du+Vsdpt2Nh2OCwm7HfYC0QoipB/RlPAtZXtnWYRuzx2Wyw2hx3vibFaoQ7RHI33xOClbFc5UOf4PTGV3TDlyEoCoFnLD2XH00wVntV8EzNV+VLPDD9UeTyIuy0hulAt83P4Cn8pyIIxcCYMKAK9Wh8ThIg5c4B+GixD6DRY5GXLVk/QT++NxRySFPGh250ORwRdFJfZPFA/r7BodLh/oGPewIAyOqoo84bxE4XCPNxCM/2UYha41frFsfFkJGjlOHCAfgYsxnSilxcvHp+gn1GMSUUQ5WQyaJYkKy7QB4P1A/3dSkdudIL+192LFg20dqCbnYoycID+V9CPyNIp4aBoEnjZPwGrPo8MpiMIUjgF1mRB9VfjuzwWphl0zRwp50xGrJb4spuJH7uQJ8GtZR83qa4uWzfnSTXsBtdc3cSxj6dvEqtuKi1GLbChMq0bytMcqdY08YknyKNkpaCD5HgiRNwBy1nh8IOyqrYhsm+ALzIml8VKM2O5lt7FVQ6H3Wnz8gZHLprgdXOVsGCL5wqBRNAbKNqCdoc9HEunzSYnY7NlvEabU8ca/QmXzcnw1ZLRbrSxQRPvlPIxo9OEHuhuCFa1xgOuhLumN9jYnbbGIo5c2Oj25bONECZKFw3UNhhNUXu4qeAtRHS6KqMr1uQZ5OoMoUJ1DWevQ9pwwmq0OTifFdPOPEQ7T/JtoBrUgWbwkmLnPUwiGQ0EbZ5g0J5M2u2eKCYFhvFgYhEM2P9hMNSmcWFNTS0pzCmCW87lmgq4UJabMNE0IKKxpQuFXIMST8kNfDDgsttAEpNCIhE02zAp2O1BTAoBlRQCGikETkIK+UxrMd9KDm5Us2eUryckAjWn1UzkNZ4Uezxe5UC/S9oVPolwY41Y7Q6MGx1rdjJWe8ZrsjoFpowci7z0hczoz4vL0Cf3+8HaepMxag811XkCtioMdinS5JuPwB4uVGd5d83ruZrYaTXV0Vg+WzWSqY5hnYTAntsPeAT77+xH2Hh6J0VxGKI+RhH8MsP4cvl0POH1WSLGRMKXz/t8EQJ4ozGCYWynn0JWPoOZvtFslxlLIh70eXV5DORcLuHyYiD7fAkM5LgK5LgG5PhJgVzMHzOv8MSxavOKAF1LF6YB7NRADO9D8Mqe9jsVsCrRE8AeR/Xc/lwutjBdHb0bkTIGKiZlDajH0DKiX4X5N0S/OSS2+hH3e3dfYJSxGIDOhcEzhIWhwSQPDSF9QjeKARuwWHSYWHU6OdUS7+3rbu8otnR0yH19yHLsxqCNx1tw3RpEvsIoM2AZsQOASP+ZPQMDIwaDnXC2kZFUR3ujXIz0YUj39nbkixjSstyBId2uQrpdg3T7R3E2lVWpDO0j2FmmqLKzosrL8G8ICdgloEI+iZe0CNuqLNpVVvROBTtJjX3hc7vhk7GkLtYstTaZfZbBUG2LZLD2ZgN5Pe0Ic/qT4W96YowEXTzniNE8VydQ+jpzQtBFLVLEZZGkzOnVAafExywG670nRu4AX8DIzXKOuj85U2bBiVQ62/Rc+SnhU09+HJcyGxRfQEasSpjJqjBacwitYjqdwzwp90/hSWS6aJzon8iKCAuqiIcTzxQLYj41i7irB/L1GstHzAcJfgTKSKO3f3qevIOYzsJMKlaGI58HelAEFyrtBkNdbSrp8fjDgaRAAZ5mWVuytq4u5Q8EUrxAU8lUjc4G/2aDNotlKAZDsXysI0bjCxVzgfzhzRdeiJTo8c2/erPwZuFXh7U0odhzUiSHpBWIeysv4uMzSfJ7Na9RA9J/TlW2wmjUxUTt/uQ2FSRO20klJnd7wwATt/bMTdRdcpRIwipbuBlJwrCgEph3gEAlleHs+cr+0CfZ7bYEXs8TeeMZAJR+Xin/QqV8HJWPV8pvrZSvQOXPINuFInvWF6p71kWe1U09Be1kL4Me3sCn0fNva+XvgiNIJz1cWkCt4AaAAsbBOqAogeUm3ta5ZOS8bFhR3E3h+SOjUmpFDyiscUsK9lCpxw6+eRiHdhR/hcyavPgG9h3+qkBS1GKnK7YV6SQ+zA0ZkrZGJz67m5zZVj4+unJwl2p6og+I/heJ07adasxBXDGmVgrCeFT1EJJfqBXbz7xx0BXlGF8yL0m5pJcxzmv48v+5ZDDRZDfYGMppFyR/1BEspAKC4E8WQ/Fmq8NJURadNxa7bHWpnY/azbROpKDO5hGDKYqxGfXemI5vj8c7oNmTNOiTXrPXaeWMmdKCRZu/8e8d13bFGtMRs2QMpYrRS984F/ouyw1+tuv+NR3XdmfbXEa3w+RPpk3mVNybcrpai83nFe9aNv7QAjrQcWWrvbi5JdGSjVnCS7rm3qjM3TbQPuoLLH28SjRH9GYrZ4kT/0Ee4eEQNyD2Gs+mvgjAIUpR/Qp2yHAUd7eYsN6C8JZk3maewOsQNhn+cep5YN7H0I8otqj8CF7Zqkc2WWHqNL6PbQXrwd1K1ciCJUNDy5csAW3retav37C6p7Ymk4rGg6naekOtw26vjcdxhObukLk+5MBOBoM9tGRoAT2yfPlZGRwHUlOz+iwcwtnTtb6tbT2OCIE4kg2xGYx2fNQu4TOHpWbxDRyViU8VwP75Ir7HFIHzJ755mGi9zXgmkhvie8CnFtHqeeESj8gF/YtEE1oeRVk1TPBvhIqK5MhoTBXoaxJ7m1mkIlugmeZJTmpMQkXe/MeOz3/2krqOJY0ehnK1dc8NFauXnt7vCWQibqG0ZWC+XXKMwU0btloe68vrdBZvOkYnl966fuy5Zemrb72rt6OT9fbUFFavv3Lw6+453sRpw7314VR07bwv/Mvlss3e+S/XXFzXtExaBSWK5Vne7Ai4WCMvRoIS/2MulKmTvC29S5vnyP0dA8++m3p2bP+Vz/aed1qHL7tkfpFnqXBz2mMy962LJJryGfeqrouifChVk4kbCxvyAucI1wTpTNfCeLqRBXZQALvZH3BNsAGuglfCR+A++D34Y/gm/JDyUkEqRRWoBqqNmk8to1ZT5wIAp4+9Q5xKykMZWbqOEGZzEpk5OIKViGQENBiL2J3FhHYmqEviy2e94K2MsYjkVE91V5vCaazwLeaD+EpcErFoksOx7OTovYh6Bl9Mm/Don8tZRMhMlmUMyROCM30UI6RjXJQkzCSMguO1Q47gNAPGTWjOJnX1Rk3YXHFNVcqSCXlmETn1zgIxL8e2P24HWVV5NdsO4uV0choqPljEy0T45XnEZGiJ2FxIXdFgNr2sRcRDjsLAQJIAvUzzvTgrUOBwLHGyHEzc6DoOZiTHjyZyEph8Xax2+irZS2rHpIyHTTfC6du4GgfFqRlnXeTdmjxCF/ojf8WO1XJTDTPu8PZUFos6l0SX2SuqGkeTTz0rlQARB1CgUnxgntNBny3wZs5g5mlONNstHofOwHlTBrvHYA/6/ZZ4wVRTl+9knOE58dK7VcNeZ1wO1UXMIb4h3RAJ9a6/2PfFW0spz7VWj87LWXVmnSPqa0U31py7ymtjhVA+FGvwRqv1Im+rKm2IdwV8bcmrvEpb0ehMeSxBU9dBT+k7ssebybXlsp1cUK9zWBxwkHFyOpPHfLvDJJhEnc2hD5pMboNBYEVJcmTrY5LQHKEYgTcZ0Fxl3ZJgZQ0WHy0wejbKGJCeJ3IcDFH4u5nX0SxDMyb0uJEVPhdblM9kjfoL7Qberrs66iQj1jsi88+JGyUdG3XYzZY1plDIJ7gy2bYzWCcCB/WfBj4U8usM8PVCQ6/gijakuHhOmNsqJj0b7a5Ye+kyu9fpDIsOj0FncD3e91e7YKYFg87sEqsYA6P3W1wii1h96Y4ET9vtOrshDf9jIt0umQwJMdW8T6qa0OtgorZG96F7+h7eqNfbrKLJH2GMUNIZGBaNiOYsdl5P/ezkP8EPQ51B+KqraqGgo8Mf0toNtT/YGSg9I4RCrmjTW7aIIJh4weXwOCgIdSaRZwysQaB1HD35907JFna7mK3miJ+5XNCxJrtD5wi462qFv+i9dW7GbRDzQf49QXQYvBFeyqRFU59dX/qmkMm5qwNWtzHOW4xGR6ZGjPXJ/yVQlOCy45O5DaG0y+eOL3B78xmfxZdb5fN5UIc5byDd4dQLwXi1s6rZYTTTZ9f+aXutSYhm0iGPzh3rCm4+Lal3pZ3wkvpGhmUtRo+JNXA6XcgoWS0mg7XZJQQsnJMzWU1il6fG5ZI4hnNda+FNNt6ke9Dq0QsiY/iyzkCbbDoTr4QjYsBrsBgNccEBYdi9mjcanCzPUX5Wz/HWBJ2Bp+GRspJRLHi50uFSDzyXNhmtbrM5SLEcR3POaLczxFsFBAnOlfWJ0c4qZ2Ru6Umlez6lE01mna5oyoXhSCaa2lr6gyhadDQT1qN5ZrGYw2bJgy6uHGrNqzOyVh+9L9fNhMTCAxdbE67377JY9CLHsj5YawtZBvQBFlodNvrDB2Z+awjaXUI0xUts1KYTdbSV0mUoPb3ihMUfXtISbYGP2AOWsMHH0qbSIVvQEtb70W1/S6Tl2ZqULhHnaBdnYlmnAVk4XxB84bCRlcw6u2w1W0pjUkLnKd3c5U0hrb4ZdjJT7KXgIHgZvI90Tyv0wxhMwgyUkbRCkkDbzI0EENEBi04kMLBaSI6QJLujpo8lxeJFchIuzFVWnomuYEfMVDu0snIErCr/yoxeS0iFeL2ExQqNf8Jpp7DnDbH9BtI+ScOmRgmcoF95xBDx8yxmzGxjkpxqobLehmneS6oX8BUJHNzNelVWYCGLu4CZK2KscxAQykweNrIaq9UWw8hZzVgQU182ReB98zKNjW5XeGGu3VyIyy7f5PcDNrYwbyR+gDU6RYvN5ss0+G298+qxV96Rcgl3O4NOkffXNYRjcqGf8/KNCcVbJSUNNK/TMc5Mi8XV727wuN0uPpA1OgPmfpozhh1uW8yvE0WRc3oQNdSzvAcaLKJurs5oRm0YLLxgFYxROPfY/pSii1g6FaOqPKnSQYMAYw1Ka15/Pq23WVw2MZJCWjflMyAGTOtpmhKsLr0RwknWHWiI6gVzNigJZrvB5LSYOeq3SsZk3SDQ1e7UEr1A2a0frun3WJM+DxVDrKoL/Z/8gUnPIcXunNWNTj+9KKvPRGrZIU+sELbcINXk5LCQao8EMz6jIFX5hNq5S+rMRqFxSaiht7qe1+kTtfmoX+8Ll94wSob3pAAv8NGs4s+LKefXDS31rM9oawzxByyL5pv1btl3t+CwN21Zf1bSMKcQ1LntGbfOPLT2IrlvpXX+2Gigq7iicd6t88+c2ZWDsU05eKcjYv2cIcRBi8vnsTMb9AEf4uS1jM3Mp116u57RGyi9TLP60negLksjm0iULIJTNNhMZg8vcH/jqFwzPMsRtlahVigd/01vRucvdaG5+Rc8P7sFm95mEoht0Ds1T/g+VxQTLMS2gfEGZpBce9g3yDXDfAassfLMH/B3ULMfsFBSfFdfPTysMDQ4c1V7u0KBhQubmxX4Qns7AArM1OO/9Tj2CfAf/PuUz3AjGwZLwC3gSbAHPAV+CH4CNyoPHH7+ebBn187du3tHUP3evru/9rUHH7r13ntbblx6ww3XfP7CszZt2VL7mfErr/n80qUtXb2dnS0d563LG7O169DfVDPf2NJB9cI+AF579umn9ybCqb0HJvZKDrfHE3bsffZ7B58WD7/y4vPP7965a8+eGz9zzTU3Xrhly41nrR5fuvZzl62/4UZx71NPVScmqnv7+qq3feehBx+894Gv3X33wpGRzq6u5paWfO2BNrkamzNmjyTSLCtSADiMgogMF/QnX8BZGcWXCpOFgroqp/4r5n/1Jj4NTT1eCRm15LE3C28U8NkKhULZpYDtHRwCehiHzKAPmCexGsR1hs/iw7/jgBrsh3jzMD5Kgizx4QY09z9+E/khjz/LZYdfKqgBHtpXdeke20pJJz9D1Szr25Ek4kVlfTtyUt0Ts50QVI9UJ99oJ1SNb7U9bA0k68v1Kwo/0n6Jkk3uiP5Ku/BxPshow0dqkyQolcO1CevS1EptiRLztulbw40D/6Pv3jJ8+o2di86rjWWX/d09ft9A91fPKr1E1Zx73rlLe531a9oTA5FvcluH4y3m6ur4nKXdd1jSzsyW1mWdabPeAD+keQOvz8eH5lt5PU9PvpIMFByOJgSZJrfFFHFPfuUOmkpbA5zdYNf7ayODDCsJ+owv5HZFBQttbPAHUimjIdfU7GRtje1t7ujqnMUrWllvvEayNjbnKf3Qff1/FqWh/jmLbxrzepa9kGJrEiZv+Q5Gxnps3d0dcYOls+/ce2SPpaahvXtedNkXC6GY7oMrze6e+nmt17WuPL+xp3XFoTldF1/QURMaLo4Fx8b6RFdr+v7lsuP08zbUTP7OJoq2sJVjmW4nb4yGwoFIXqyrN4etgVxdbVDMBRstfn2smfk67Te3djUJOptopByCp0quYnmH2WivTQcYjvlg/a2jt0H7+nPtq88QSz/JSa6qkYKfcYjnTN8COPUjpoFazw4BHuT3Pc4f5F/haX6C9u+yABz2K+y2sFDHTlDf2QWYr7L5I98DHSvGj44fGceuXWQSxWwRav2j335xLP0T+ArzSlWmn+QKUdu9oNwud5B7Bek8pF0WsqRdpDVC3C78KmDzrx3B7f5FbZccMFofpi5Ij7346KPwVaahP1N1DWpzHzMf9XUQGMCAUs2LOqPMu10eGXWVBsxaFhigizMIn6UUQFGKyytT5c7jxl/S9h0tOFJYuWIcoqGsHCebQWEVzvJL1tZYan3p3esPx1NVrd3/chNkmGubL/xCc0fjrHfX7wfU1Ps4XTqFd03ZUA8MawEHLuU54bMWBuoY7Y2TxcLb+BQN9S3Ego3XM/hw0/VVrT2fu7r0HrTedDjODt7UrDR/ac6FhG/Po1+AX2Pz2AsHQOlPFf/fQ2y+7M9Tf0HPeumDcD/bhUqEqddK75D9GS0wTo3QO4EdRBUDAE69wWBmDXpbObCPhIarB4ITV8t0TAdZGZwDqZGxf928La2LBYKZwFUbvo0a7B7ddcaZ1u46+xl9jZcqLaSf1aW/wGvAcqRm6n9D+s2sQP3Oor6gt5Y+nNHvbKXf5Bf0bB/9bfgddgWOsEIlr1WeRWWVZ8kv+D1TP0PveQC9x/QbdV35Z/Ah+FPtOVKqwe1X8Ek2hGqa0Xduht80VGmT/IKe3YCevZy1k/jz1IxnH2LtlWfJL+jZy8GXqHfoosgxb5Lnfo59qNzXtbyfPCtOfQ/cCayKAEEMJ/6EXpBXg5spIBJ/qx6EQAP4Gqaat3YZrHINDnjITh1STEJazmZZJ5D4AMviqGCbR2YDAekZ+mlgoX8FGtCDEXqXYnDyNpsXAC+Ld+MdVhDbydYoAmqqJptNTND/vrOuLnwAR0fAOZ8X/1zIT3qa8wU3Saekrt/gY5rIWj/6WsyQZWYkQa7OuzPv1tWCDDxZ7Ijq626wk/DBJJITquPDrm5AS4Wc6QNrQuJ04IgrMx5x2V+6uae6Kq7nTE6bK3llUkS2ZtQfuZk7x+MwWZRcbFbQiM1oken/+VFj7TNf2PyHK5O1Vc9e9uDa0lU7C+npOHNmM4L/f6ixwlMKfJ19F7gQTB/GWU/eUvQYqFIuKPsTeGHFlMvJOHmYLG/3Qz8Gq2CW/X5ofIYkE/2ptgMLgbUmWF1dJ0l1fn8Ug9VVp5jMcp0i6OW6OiOGr9Fowrnm/32n1QpOBF988NgxAH4Xr7GMq6th5a18AIecnACAJw3Z0cAOXz8xIL95ErjD+AmgOPmXk0K9HHO2h/4DguYY+I/9oFml0TDmbHqjVR5sHGofbZ2H4WodGhrFcB0dbW392ECep6YDeRTDYPv8+SONjSOtrV0IzrtGRoIIUScI7llykuCeOScM7rEWjyXu2aE+eK/NTCzADPi0oT8fNz8+UWjQh98+KfpOOWYIXnpypFJqHD+7FBhBDbhlP7AgXFoQUklIUdRU5Ujb/BihxqqqtGJzy+m0zXZsTJFiiDpCoaTJlLTZ3Ahp+5LJ2TFFOQAxXmbFFM3GxpETImD2zuaPof+ZIUfrTwq16RAk6msnB0s5zyq7VOSM1xFZacf8mfCS1oPAeAx30B/HAfajYbtnTn8y31UpegLueJLJe8JJquVtnbpXzavM/FaNLZy6txITNq5GhKmBYLtOHgW2z2KZjShbOY/JNKJmxH0dOUnE1yzQnzN0TKSXh+zpLPcPwfMmsi+P7JXm4mT/WALkwd49jAGi/ql75xgOb6dTrKyC5jbLBpKZlCknBgIuvI86lcoho2zfdvEefPhDArMSAY2pku2Z5fFOUMWIeEUmpnOlkia8io73VwdgIJDR4f3VdSBD/xIhleyvfnvG/mo3oknvdMQbAsT4zL3WanxOcxkY45Wtlqe4/5qitWg46vpT2YjNvqrFyX2w/ON2ZJdz+bIcoonfq3GChIbHCIwd4Mp9ZkwVx8B4D1ayWQvZho8IRH9iYO5jGEEULRYDphQdCRMUTpY6W5vP4zPAlKmAadZGn/fKkYHbZoYLQm3IH6Znbf2pzMkxREO3TOcuZvej8b6j5hYnuZGFSm7xnYrBgBNUsuUM49OZxVUo7IHQoIJhN8vq9AYCDwEKwnFJxaf36qrpxXdz3KdKKj55PHymZxZOLzNz++4sYM3ayzsbYrtm7uydCbZKvmgBwYzkppiV0/UlxXzC1K2dHcoB+kXQhUS2xWCXu7o+WaZWNS3rvo/NxdpzbC7W354wF+vkR6RfzRyp5Fz9BxOuwn8s0epNC+5d8MkTrJZ+d9vpt2k5N6aequRWPWPnR+ZL/YjkqP7jkqMekxFVjQk/SQrUk6c+pQfuP0HK08u3j96m2llPaXlOv0xk5TSN3XMCClMMqMOfgJ52fSQRKR9PRCeknn8O1Xx6ivnkxAIq+QtVOmndeTxtKMZjKcIN1eQZmCIqtHBSKjgpBRyHfI0fa3i/Y5q3sAHEf7vAs4o5ijFvJZiPQYfGW1TGqxggrGs1NnVmq90S7rsH0QBS7prqMA1UVzdiGmhCNNCJrmyF/+5D/NfW2mjUEXJoa9uWgIlGyWNzu5saGxnCU7JZGyaH8KfkKRVePK7x4n+MPqiHFtw7QNV+WiJhnkfK04e6T04pal63NoILzE8q4s5u4eyYZkwmL3egAluyad9CUbzFwvKYeniyoR/xE3aaek7GT3hVUp2AmqgVWNH53ElIShvcyeiKDSC6ums6Ly9zPpLz787I02tH349M57mlN6Hvf5j+jusz75Hv7VPrudvoxej7+5U51EHXgzngEUWqx9kDGZPNWp2Oem0+X0M63djQ0HiA/jHIk8w1UUySgmAjJiu9ay9TSJt8ieoD9LMgPXVon4BPJW+QvPi7j2Sq0suoFWtjY4NiNMsNDYUD9GGsXT/ZZlVNoIxHzT+XOdqsfhLaA26SyQb962hWwy3z5XjL8k6UhBohomqalaxzWogTdrdrXyUSvqEmpCPKA9OxQDkjkY8Vl3bKcrRQu3DZv/7rSKyF01X7beFETukeqErp+LTTl4y2+CLVfLqz2uKC8Vg4brQ5TMEq32NmaW6gpar1jPT8eFbyNodaoq0rNmYSEW9Tu77xgvZsz2YNbwiuCG/3TsOd6Gd/LOtnTAe7X9PPemHwhPpZJ0bISfUzxSkI3aInGKhvyCWCyWRXQ0N3V1c3RtcchCejEdsGO53OIEZX4KM0N0Wv09WL7Q2eZKEeI69BRWZDQ1csgb8nNWSidwS6u7swMru62jEykZr35PzARyHTbTuB1ncy7JZzlX+kLvgPYJ+OzFIdf/MpaIE9a5aKecUnooyy7o5xj2jjgTJt6F4gc/JP5b1x3PfpdhAHtWD5Ppud1Qt2e0SVBlmMS4kEDeo1a293lk1YbBP0s7vsdgGh63tkhhUEhJQj2JrD2ChPKbx3Rgv7n954fgwAyU5nLUkUAhkvk1A2PlJo4L7/wVBDXbyQHj2DAIrnq2NtnUtGN1+xZFt4pKt/yQ1zlfuvGFlzy+ZN8PAFa2DcZg5pYJkTa72hfzhR3XGOQ3Z5huf/C1XX2N3cnNDggceL4PHgNDwYPFf+b9l2477P4LmCc2tdsXNabsZdkmA2SVIcAyebrcMQ8aFbljUfmGWt7AWgTkjbXRhKkmRKYygxCEoNpllQcjdP0+cMUM3m758QaMx8RGl0+BNBjlmD5cH6UwBfBX4YXsZHKvT1ILcUwe/oJ/z+54//ruq09G/oLQgXuxTDL5h3GIoNI45QR5JjkMTELykiujHofXoqFTLR9hiQVa3s5T2iKNntEnp0j8kqS1IMl8eRtmaRIcihh32+qpDJZAuRZOwWqxwK2QCoUvOf2UgMfw57N3kYJErNEexYKktlW3kLmeqtyBD2ghUam0Q8FIiRgHHIH6exxMpoc5DECSSnKWEx5bSlRfo3L3533bMbvlifHk2t08edXo/VKTVtHWufm4i5ms5dcMYZdz5cnD9nYbbp4Wt/c9kLpT/cYw0t3fLKjRePr8iuiYZj56VWpfMDdVG/rbvpsTPOzxd6OkcGHh7v9Zi0fOTP0T8EAbBhP3CpOZutNhtwYu0kb4KmA8j6BvS+vQCiP5zvKZzwVVVYFKvNZ+VlBEpeb7VCAELIWHp+p17P5tV9C0jhszZn1B0oR0iiV5zbtTmvuSI4BtMxdtGomgqfg5XNIvRzc+8obXnw7+8Hqr5/95ULoyP2uRvm3PT1s4Ye+Ak1vrdx4LH8pU2X3NPqOdNqt7cV6i7Pe/IVvZxO0ktACpyvGMUqiU0Bu90vSXhRYY/ZKvv9KTURngEjX4+Rz1aJYlWVa2F4a5gKh0m6uzRwIXRLkj6vYXkcu0jzWpq7CnorXtKYtmVGm5iNJNkCH6skayjjlk5+qbN7YVX32HnXLVs22nfacDqcsvmtzpb6z23uHY/7+sTloS/BeCje1RqpfszmzDUkTK45G6rjweRIJhdtdYc1/Z7+DdEpm8DraBbo3tFRAp4F9doskPEswOadwewzU9Msy1cTs9JSkmlSVc6X9zgcPknyaRPC50vi8uoK41LsCKexJpYpoHqhUCpmtbpi5bkRi7kYJoWB1aIBq4DnhuGj50ZF6T92ilTYXHmiYJn7KSYLtXjwvgEq/4lmDNGA//7jU5822h7y5wgOIuDW/cA79dYecdqqsuDJYnW6XNjjieaRFVrxPGLwPMJ+Pn3oKUJ9ZSdfGdqukNOAJ5TB7HSyDBPz4wllNgvHTqiyqJg1q7QtwWU/30dPMCo0cP8gNe+ks4zAZFI5yVTTcoKT8deAm8pSEQ077Ej5hBpGksI+X1ibc+FwDZ5zDGPB9GWeHjHmrkLK4UilvAurtlZRVVXMd8k6hZfsLzQfO/ts0yLymDk4S0qe6myEP0G0Av92ClNSs5E+al6Wzw9jtyBZVSrrDlQV+wqCkQfpUxeVoSRA6PQGhZgJ89idwSDOeb/TZJphBxLgGADwhhH0BC9vxUtvkQjL4xmGVYcksgePHlFzaDdnpqcU1htOoDVg/6WWkLUCBLqcEQYv2uxYcG8/rJ68nXI6ZX8uNj9XX2hadkVX4/3mUDrhiy2RZPZypHl+MPbY0iErb4ynh7+w9qKD3/gZZKrihWxooa0yXi/7IBqvC82K85FVYYSeaSsCqY02vPnE59NL0jGjRTpSUM9IZjzQYJCVygONsVhHsqoZR2fwDnWXY9lHQM4NQqMsNEyvS6EhJstDlFzwuSU3L3pn8h64uH1x8dHilsb2pefUp5dJzuoWf2rYzw5sX3XzB595TLB4XIXLzhs/79pzb2YWJgdqgoNeNTZv3lQ78yCONbD5yf6sDNXPXK/aUgjH7xJbKoB0xNt3Hrt4Ymbx1maW9QSjpqQV84Od0WgSX6xW/ckWTQwME8TINwUNTgyTeFwwYJjoEEwywnHIn14lmUkBM1dIZvmyP4oWKKZsoDzykfRwR3lF5MsfQROMRhOvEvh40Sy4DtuaMDBNFRVAIcXZhckjFDIjCjkJYPYyTNSs89kwTKJRwVeGSbICkwqdTMOkQizFWRRThsdHUM17p189dt7wlYvg9ScnnWuuO+3zX7xh5LoPvnQy8qnkQeSKIsfOyC3I/hrpzfYTfQe9wMyYyPOwrNfAh7gisIHN+4ENn57gD8gsYxJttJU4RnSmg/RPSX43ktEYH36hGMI6HcsyotVkQib3LxDB0U/TvyBLjA6kz8Xx8giW1UU1RLHoyXuP4MTGRzqKRZJrSIuEQEDS9togKYIDre3woZIN3nip7HZbOgtF0VB7CYw/Ri/0zL282dAScDgKF/rFD98vx+jgcRifJeOKlYao3dQv0bioSi6WJD0fSCAGLlEMwbDRJPvCRnL0yFu70NWOlxr9/jDe14YEpxBT1bcygezzh+12Nyvg6Ie9+GCrsOA+QD9PzNC4oDEPpIR4SBymZola1SCbI9phZLFZVhX569IIgegWQSjRybXdo6v7Wy6/6Gt3Lu9tzLYtXdg9t7pxi8knJWojrmDV51pgPBhr6218LFfVuaSzRTxv9MJeqaUpXzBGnIVkO1/GMT0fweL70znXmUsQLOgyLOBR1oWzvyLbWz+9PoY4pwF7Yo1Ih+BmeQv3oYlhNBoMPF72YsjSMXts3pDptcAZ2oF91qLWA2i+z1w9Zp7F7gXLsefiqv1D/X9+Os6HduBtC2rOJDV/DPp9MckfouVaRMZTC2gHpT0tOptTDVPBiWUam3eQbIpv7GtqmtO2ox22H6DfAK30y4pRDVWZHaFinB2hsrOppREzhubm1vY2nPO0dg6cM4FdR3p5zpx8MIE5gwkHEullLWhF0SsMDhQqh64op5CXhizikNgVNdlHZnzm8mo5eIWEUHSoR3fjT/UQ7t2mmkANBcaXqsGEnzKMRWNUnyhcpXTm+KZlZyy/aPwThKd8+OOx3hXD6L/Kr+rAfYyZ+4wtYfwpzknJisErcMQcBZYtS6cV6rRyxBx+thP8CfE2/Oxr6rM57dn+flFUqK7Ks4gm/h9zbwIfVXX+D59z7r1z7+x39uXOvmcmmZlkZhKykNywhCVAInuASFgE1ChJRBTQEq0aQS3U1gVtkVZRUayQsAxglVq1tdaftLVWay3oH61bWtviTob3nDMTQH9tf8u/7+d9Q+bcM3cmw53zPM/3+T7Pec65EfK5vApMADPA5VA+BC7A6lCuNmRnC3OnooZ6AFGrN1lDEMAy2cbXcEFdq2FLEAZJZUcwmGxFBAgAaGpN0jIxdzaZnN2UZw4faFu+Ym737NmlmrzZ3d0r8syP918oK3XZC59g3gAGrDitpEpm+dwlSy5ua7t49uwFpIRMJ198sTcYr5nMt1psBjlPcbOpqaGhHmKIqseKM4gQZV42EvpgBbLZDIb4RDL3YVDLWj3ZEECdVat75DiM50mFTWdx0T4h5XR/ma8ALA2D6G/GnnL+p3Koc8V+TeRT6EbrRc0jbt1Wmxjdp4ZsPU5M2XZ2VwZa/F2dK+3ZUJoHKG7DXyyEKE4IkFoIsh6UIjopJ2eytAAdq99/WTSlS9ejQLg9orex/CV/7YOc6ZErW3zB2V6736T1iGprqqwi5BQ07rIZE+e0TllRkRrvsNbaLDa23N76kcHtuapubdWcQvafFAZxLfvcC2/6xuaBllhTczgbtEsm7bTmhd++oaZhY8IZ1Avl0drk2ERjMDejpe+iKx+YeuHA5qsP+8ddWq5IOHWh0wlrqjq6IsRrOPFfVNDRvY2IzmI9tGFkuhDOPASai1V0ZeTmOuri3fFkI+7caL7JcpP1Z2Z2oWtTAgXI6RTWgUQc62N8Krn9ApmoiRH15H0qqJJVhqxKxZDNQBjG2OjzNaZJrJdhDoMo89PBSKTxCTrPNoS9+NEhm5vu6ypr8Z8bjRNmN81tWTRhQkmHJyxaNJfo8AyiwzPyzBuyenbLBRd0NDV1TJgwFevu/o4O/BXIbsgH7L4sy0CGfpYKf0tG9NVUqNMwTfx+JlNBDjU1djI31xWJiFRNMykSXA1jrbQPE+1yUDVLZGprq+xfrQw7Xy2pblNvQvbCLybdyd+NpssTnYDE8GSBVZFJjc7SFbWvVL8cySEStftzoZrqUiazuua8G2T9V5rIRFlhzOXrW/Qes1Q3pby+bPK2R9dsgQ9Pmp0Zy3e1dvxwc2Ef1N7w28tvdFj9ZoPThhVBZwzZ7ZNOr/snysekzS7LtTd+Jxssr5sxv2nhRQM7R+YtvPy4WM0XPl62JuJzXVB/4YbvvrD0kY7ZlYGtD11xww+XfaM6xH7nn6saA2adcbM67oUS3o0r4p1+FO+WtxHMupCWaq5Y0U1KNbu707Pl2VtnM3Rf7Ljalp092/DfxMUhAFqbnsSalsSPf4Z3eox3hv9vAM/wDxCv6Z8C3D+qyv23I95/Vc/4b0K8e//fBrxC+78CPAbDm5t9iftjCe8Wn8U7a+mmX+bS0ULwT/c1HFTizjn48/wT+CuC1wyizKq5cxcRZV60iN4Z3GjK0ttru5T67IQJEb4EkkbG50uXkLLRSPQ2/VWkLFYkDH0d9g52dFRE/i+B79Q/Bj674T/V31Oga6IlyqNoR7X964WyRegr3Z3s/6/gNwL/veA38pt/6WcRmEX4Xgn/Tshl/xOWR9HsqfPQTC7i2b8Fu9qL2GX5b2NXMS7+52hFwOnfjE3/Juz5t2EMkSfl+iUc+ZzOGP0P0aPin5Gn/yEoDP0vAECmAOD+V8yHZAj+gcV/zcD/L+37f2+//0szJbYokkYA3E8AB5RACxzADYIgCbJgDLbOyWAamAk6QBdYBQvymYf0B/XoKv2A/i49sz4CZ4WXhVEwnAmPDzMdYy8ei8rG1o6dMpbpaL64GZU11zZPaWbm1q+oR5H66vqWembu+BXjUWR89fiW8cxzK+Czq+AvlsLnl8O5XSu6UMfCixeinfH9cbQsDvfHn43/Nv5xnL0yfmP8jjiTiY+Pz4ozy8bZx8Uq5q3uhE2dbZ2LO5nOzujc9hhMxZpibTEmltK0TYKTYFWGl5iU4GIzJstKseHC9ijUR9uii6PMfVHoi6ajcpSJzlS3BNqm17T6ZlZP9U5f0lPbX7u1lpFr22u7ahlvLayNzktfCC/0Rp+KIi/+29XR++QV0ePRv0QV0dCciosqULgiVzGxgqmYdV8CJhYbVxuRcUF7CIZsW3VwtW6jDun8fLUyF2SAF3qDUO0HquAl6YvgRaubNjYhfZO3qamprYltck6Rps5I6afD6TMqJ15Q1TIjdfToG0ePim90HhVfxr1UZ++LfeKx4smXSyfFV3o7X3y588XnOl/ufTHT2Ylf6H2jD5/u7Ox8EaSONjS8gR/4ra/Qc+TNR9849tzZF944+koneaWXbNvU2/tirfjMUbJfNHlrZ28vvXdd59kf/BwGc8Gcn/Pn/DBoyEAz1ukasvgY98k5fy6Tw2f9+LUqsg0CDFqCBj99yVza8Ac7LPqnfvIxhowlA7MJaMEmUjxAMRgwiJkqASw/DseP/KTwYzgeNS1fXvjkN3OzUxyxxWtO30rOsd8o/Pj48pEthT9/9MHnHVd9ue/48uJJ/Ed3PLBt2w9+sG3bAyO65csZDz2HP2j5cebw/R0X3eV5dPU120d+9vxzzz3PfuP48uXLT38Dji+8+deKNudmeBJKy79owv+35lfomcMLq5Pou/g68Bm04bGjRx97/OjRwl44/vQ3luP/7jjjWPb0S5f9AZyB2sLfCx9jDIQuADgXB2hOu3vPjYn5exE8gp4ECsCjpwYBx+bRk/sYoOJJZz8EDkHBPYVfR4CBZUAJL4UXAntC/KRhpGGGeKph+kjxxqfiadxUpqW9gM3zvxvqBpDHx73dENhTiVQiXdnhN/gNYdxAFwtO+5ijp2UOfAl87NGirz155iR8jrsUaIAd3ECu6wh6BJu5knjC6jFZIMvNWYHgpNnjz6qcn+lWVgM5nss+BA7ib5VnphzU8oxWNqlxPydrAVCxomzNqmT2M4f4yfCp4l3fCGkX38GA2EuQECRgywRJVmpNEPImJc9gAG2iKTF8vTDInNs6kqEspqggcFVkvmJ8KtXMXp5sbk7iB1zJxHPOpmnTWu2J0+nmCnK6orn4vW5kgugJ/L20wAkGyfc6mHf83PGphtHkz3w2FAxn6bEiTWrX3h3CXwjkz/xcduOOw44b5xjcfKqBvMamQSrXjfhra0Eezh7iGacOHwfNJJWa26fVqlgd+eZWp9NmUF3G/tR2GTBAw42S67v+S9bbE4lPOkc+GT6bkRmm9xMmIkvA3s4S8euT9gOdzJvJOGScL1aRUWDO20CT8Z8/JEiutqIxyUStqbawtMaaqyivc1YzQRha53A01dVVzllWeB3G1pfLdfWV0W8VXiuOR/jMSeZ1PB4ShpsfkvGQFwkcb7RzNiNr1NkUBj0v6mwerV1h0PCiXetVSQqDmhclFacECoOgBLzo0NqRxcSYbTqrTYcsbsZs1zqRRVK5JBVjhkCJLCxjBkqVJOWZqKwESjMASp3NRp7hzzTb7VqL1epwOJ0QInLSxphNJrfb5WJZ5iBvMBo9Hq+XI3eDi8oVvKjXkzy1IPAKHR5olRLY7HZJAirRYDCbLU26Adtj2oEue48d2fNIK9tUA5JyQHoMNGFXqmD0CKJFvvkPELPpxaDWIJ4aPime/KTz5MipU+QpMSFyOL+l/0bOdU/9o7MDXDJxrfjMQNJODvqv/ZCCBGnI6mRQnv/bwW6TizF6eQXuy/puvZpn8D+lHSi1Sirvpgzd/92QySTI9hCkxfK3mYK5DMm3mzIMeWQsQcZv8TNBk58x+U3+KzofPTLxDICmhbMWwguWzFr8yKEWcKbwUecFCwuPLb4czppceNQFfzYTzmuHPyvUkkd7YdfMYg854DyCRN1nljPbuCdBGJSDHDxOUclVk4d3yB2mi6ujzlTNzbZbU5vSXF22Nbs4u6J8nW2t48rytel1uU3cne7HFI/xj5sft/wk81zuc+6LnEnlgLIQjXAs689VOOysz2qpClewuYiDY6HJarFrorqn4LeBBTmAHujgfSAKl+3DQubgE3A3YOEy4Ifb9gUCXi08Am/DemuBtw09bobmPNwqW6ve2uGCLieogb4auaar5kQNW6PzUU3TAn+Xv8fP+PPIOBh/S5mH78saEfjAYrAasMBRfRjeATEmJjB2dk4/NXyqk+JoZ+8nndPxk2FxmKjCyeFh3I7gZyfpjCDh6riF5ImNPCnm6Mlq5I+GlEZ6M21ZizuciJscaSjV66hMj18nx5OVsTK3R6VOV6YqkSLpqVoKY+r4UlDprlgKPN5kRZkqik9F1RpAlCpBG0wZ49fhH9CLPWxCkg0RR45jNRYLZtJerQYPYZ5//0A3HrOKAIb89/d1B7Ref17Q7+v2yV4tiTheTDQlqpqwIokvFqtV8ZVjlTKR/Y0MxX3wanIZC+GVBrInkqG4B7klmMNPoIFsu2Q1lTbOi3aXq++8483W3MFH5Jlj3PdHtbfccnrLrw7LF/5wKVy6fMn8x1pjY5rbvg9nbLpdhybfcum0yzbkTYsWcTq+sfDb+76jK7B7Hrpm86/F/n42GGOc8FealTOmbDy9VWsP9srj1naTm/1NPvNzxTKMTQwwgACoBM2QeiI5iD0Fg3YpHtTsEneFHyzflT6kOKA5JB4KHyg/lNbcLjCIogiGHjO5GQHyWgDTWC21qIwtqjzsOMAyLKhqCeKu7KxriccRgtidqqNjGr+oHtOehGJSTqJkHv1R1o7jx3i/sIzROcbNXkDVZDqGbfGTzl58AE1N1O6HsWpgHBnGCgJLhUm1AxQJKtN2LPEerjkbTkfCYTkyJlIebgiLEX/EZrVbHVZGoQm7w5nKajdoDjW6YW0C9+rLcM9ksLhBgPO6oVONey4l7uVSVW7YFMFNTUWdG4yN4casN7qhT4Ebq1ZyA4+Am7O3Nodn73GeiJ/tXYeDy05pb7Aqz7+5rzsYV0m4c6BbxTIca6TnWC5eRztxNVITJ4w1p0l8JoF/scIoYRD6Sw6YRJ+N0BYYLZkq3TMdVlHdOff6+bNSGAl6Toc6mD+cnjNwx8Nr225oa7+lJdNmNYQs3nSgqtLH7Jp02/RH1kzZ1Na2aVI6WJEMpJOhdNrPXfpFJ3f/iW//6Ml5uy++eO+8MVcfvWVKjceYnb7vyemZkcsX7F6598iChy69+Edzc9UtPx2alKmZMvhEa4ZgWuuZN7kvsS5VgrFgCtxF9SgCWk+0IrEVKnRKSe2z6iSfo1kxKb5aWh1bnVk9br2kYKtgK8k6ma1ZcpTLdcZsmZyJplvHR5fyXa6usq6qi8b2VK0Z+3ufRqNNmBSNVc1lLo0WxRWKPJwmBxpd5sZGF8OWJyvSKR5mXHFFeaLR1KxUVt4N0N2QLOm5YN+YliCjzKONslqc9JLVKqorCYuC6SEwMaL4MfwBaIQ/w/SrDD130NXkbbXZnNo8/KZscngjMHJdVw7mjtTvXe3t8SJvHlbI0oSGxY7Vjo2OLY77HI87nnK85Dju+ItD5XBMbcV/N+QnypyYcaqIcvi3TxyZMfGiCe9Mx76Q/H4yUnKDWKebhk/RI8Y6iB8DOqra8FwVXq34fLHYjoJTX68k6xOKRhO2sTJXM2sNisq84BrqRqAyz7y1H5t20DopL6j2d4tWZXBMnh8e7A4Sn5fA4EQi5KqEoYirhPD4LTqI+OKenjZdaXuiryzJLaW0rLZifXyYAlQxv2Wi23iWsq8W+MC8WXsu77h10sQuczj8wGUzdy2/5me9O5/+0UepwDeWXnvVnd/Ob9y8x2MtK1x/zYaOcfM6Ai/esGLs1es2X9l0JXNxmG8qPL151azWKdJtN3VccvmcPevX/fW6VTeOfXRBy20rL9mx+K0nfr01GZI4df2diyZfuK6uct2IY9+DGyY+uOTSH1aReuMLMBtzUk69jOqfpNL1e1ZWqwmx1BBimVf/XP2q+l01qyGc8qCCwRzJqSSEUlZpNMrLmH7tbEpbyCKnGSIRGGiaTlgj7MOGLQ0BWcFQqCe4fj453F5ty1ZU1FNCGNuQwBwwHf52kQNCMLswFV3DfQuYQGsRX+80PGRAN2k2GZDqbqUB3A1NEBN45cO6QLsCKvrNsy8kF9E5PNJAtQRrCM1YYXYDTfj9GDCI5CzYp6CcCGqIBLH5exC65q6Ltn4PVn2yYfsMv3PqtYXV4Wkrvg03vwyr4ZnL4xM+LNz57CuPb37onuJ1JfF1zaXXNZVeV6iMjQuTOQZfkAFfmAlAqFThi/Ip0gr8xRX9liKp++qFkctSmuDoZZlyGKeMFhHwuUZoxBqDkf7ui7Z8r/DSpxvum+53tF7DLY+3rri9cNVvC78owMvDEz+Alz772z2bH7yHXNO3UTvTg69pJlTQa7rNMvtG/cLqQ7qnnEMtB2e+5Pxpyx+dL7cINVy9boy+zlkfydVUt2RmCma3GBAbzM3mcebx5VL5xLHS2IkzpBkTF0uLJ66zX+G6Yvy6yTfbb3LdOH7T5Lvtd7ruGH/35EfsD7p2jn90yi8iv6jxXTBlfC1bNS3bUs06E9GQ2yayXpUWRKurWFWC9TYlrwk05OFBOWjMtl3DA3C39reWrPe30burf9vU5JuWnvbStGPT2Gk3ziLhBx4kzGhGRk6NYC926tRIw0lIbY4atO3sKhZab44l20sohxpondHqFkVSxp9OlKxooOdt6U9WzNG9Ykv75dpKXoBkLIt5zGJOqxEW196VzPhsWpN+jgfCP7P2QGXIm8wpasonjAv4K8bdMD2TbV3XWuHxTGksG4ssobQU9liSGq6+fErY6Qqky8qkrsb66tYN7ooKj3/q5ax54oSlYbJUq+IHE4JVbZEKb7jObbBKOuu4qKc8PqUyUTt+bSJW47Yk0wOZqmh6plVMuhw1Ro1Z65D0Tos/JVXENxKZh8Ft7EL2p0AN8lTmzhRKMT7Bp2RTwMf5FCn1arBarejCttGsZy4APBMFKnxUAwb3EO4BIOCekrnggFoNujjI/RifZLFfwi0TPQi7BCgcUagJaXFyXfi/POJDaSSjHnQMcT4Sr2jmF22ul1LUk50gRWKWThq80N+Rk50lIxxU0QhjsJsE0CnM97CUwgYcMxgyBhwrGJCtoIN/a4enCprb4N9nwr8W9DMLWvyfXl54FN4Nfg5s4DL6PaMdqMP2jJVR2rocxxyMEgKeZfWCERwwyho1W6e3eC39FsaSh3FZ7dUv1iO9w/69B0pseqSThPcnjbVwdNkC7JUOYiDRGI0awioyZGYkQ02SQPZoTvucNl2+slfJ8+qw0VxZ11o9buWWwqPlgS3tJq3SrKzLVLZcsXjlXiKfWbAfzUc27OVn0+v2Ia7fvbx6I4edKwJ7GAYgEbbDLrgV7oDHoAI71ux+0M8SJ4g9XSfBitQwbqkXk/YCJi8492I/ZaeZEhMetFmIG/kS2e6iuMScOYkaMQYwJRxXAu4F78pqDEdEgFrEmBFiyO46EGsM9MpmH5NmupgeZgdzglEwR+Bj6AU2D1fvPU6x/BQZKBxmlqLHyjQGcqRmQAmwCN1CjQVLO/yA+9YXc7lHaNw+9cy7zEFuFRBBCLxOrmJwieDLQ8Ugx1nIQat15qFeNiqdICJHkBzpiuyInIiwEQM5rSPxz0awBezANNsRPkw2Jh2NgoZp/DN9uASfmL9Og6FgKBBCCgQZiBR82CW5JY/EKEwRfVgdsTtsDqTws4alwKtwLoVmHe5ZNbgXgr6lUBJwYxQtS4FDhZuztDROH/H4ddJezkcjFo7TWvL8e4PdWi1lA3Tws8bi7IbBjCh61Ih0KVxNtSE7Og+Cpt66ZkHX96659+bfLH36usuemVjbW73Gk0yHasvqJuQmZ9H2d2HbzOb7ni08/mHhwB1v/+TTwrt771jStxvWvnvvFWn/2FmF7xG5foQNUoHH1FrMDMlm2d5l32E/YWeBXbajteAmgHTNJngxbAZKuAPHJAztC7gfxB/wGdDDi4EVnwHwb7IO6vVIiSCnFDSIAYfhp/jtU2SjTqeXDbm0fqN+q36HntU7bIdRCJ4sDX+iYToOMyn3amowEOOpBR8Pn4YfJxIlJJb2QY4ndzR/a7BbqSEDVUX9WjhjMONIzuLPNaIcHhy6yOEjONVvalhUQF1jrCo+7AyPY3/2gy8H+sZ4UDiM3JXr0R++G/d5vFSvy/H3fxR/fw+8g37/63m7utZmd43N2mXcOEij91itZXwDP4XfxStk30J2gbDQtsB+qbDGsMb4PfX3ddsMu9W7dc9zz9t+bn/N9pr9hO9z9nObxQLdrIOTLA6rw+a280qb2q52Zx2THJtsW3y83YGQzenQOBRaxoE4hZ2WtZlYTHJXyUqlbNY09SuhMs9kcPjOObc4IKG1yHGYyeBBvW0IIo0nD2+TtUDxVptpsWm1aaOJNeUhL5tk/MWcwCf7+n1Ml2+HD/kcR+Dn2Ha1UJbNi9FqtBFtQU+hl9Bx9BckIIf3MPzWOWs42TBcygeMpgOGRzp7G5pGeotB/8EtSviU8iUlAp29HYmTJedJw0Aklmr3rnXc5iC1e7qGAZG79hndMyTh2dcJyF3GcSgrHdRqRY8HEZrs3NctcsiBO4PdSFO0gmKwTpN//pxQIrd8sORosR9FvL8Ku1Tm0cWnT8Al0Lf98uX3RcKOl+7d+UZ66oOfN8Kl3fNanJArfBmG4+Ddu6578MreQ8+9vHXlyh/uL3w0RqysKPKtWRhT5mL5V8GNRP6HgOrMiUFNrZIEPg2a2mblRFWLujXAvqSEZWVjyuRsV/al7InspyoeZGGzcmNwffKR0KHQ4eTzyePB4+HXk+8H3gtrpghleXjrUCwmgjw6OXSMzqZl9zOcaIXWPLxvv1tOpMjNa8YPidqy2BG4CpiBEv0fWU1XUW2lMsOSH9qjgRqS8FG3V/RXoK0VOypQBT6/fzG/EQ9BHr0tq+Qs3JE9mkVZjLuNB2XTUyZkcmQIvL17VqBUmsPEkeLmpHiK8MTEcF/TcCfdVowiXnUy5Ymo9Kwi4A/6Q/6wn1VwYV0kosJQlmIrlkKPHvf86uhSqFImFeml0Kt1E2wrZmoSo8kaYq99oJdQcyUTK6PhDx4IJp0XTPu68RC48/zHg92i9qyk8YMYMxEutQG66b7CX/KKxX2oSwuBk6TKmGyCTUBwVd3eG+6fN+7wtf09txc+2LQs5Xc4DVfbwvEVdwWd3sSdM3xt902+ruveVezUTXdc0rbgu9srD2zYc93DE6LucoFrUqi3d7e1jnHHmj2qC29oW7nxQexjfBgPDmF9UGFbYSgixKxaqAcTtbKekfUwroEWHjsEyCg5BWQ1ai1gNVpWodFiu3XJRl4w87wgMCyv0AjAq4XaI/B7QAHU8D5Zy0GFUlAoBI7VaNgjcAq2SAGukNVKpZ6B9zGPM4jJw09lO2yiBqyHXRgtT+gZvULmIe/QnWelvQ1Upg3YRHH3HZHMgTTVpoq5GXGkr4HcG4yY5EAywZZCV5qPBX2YL/X2Sfs1rIC0irxgk1XdvEqrZclllWYfSOrVQKUCLUFDEBMpmMEHyBw6sHPkaXTl5TsLIXjqW4V74Ip+5vrTt6IfjCwu2tNSbE/ruGnAD6fT0Rv/AAuNHZ6LPRu5jYqN7lvZ29x8DuX8c5g5vnn+S11ruXWuAbTZudl1P/OwckfwRFAPglAvGowmi9UmmDGzYMjAGnx+TClYn98puRjeznL47H1DPp/fdBgjm50xyVgC8C2A3vL7Mcs8DBuBBCft7+d3EDuBH2M7CUI52EVuj5SHnx8Q0Q4/9JMPkZU+mW7B5QiQzOh7dHxPdmKXJHaSsaSmc/JsXoAaDDTQOGFASCY4PLiAPCkCn6ztg32oz3c9vB5d71MUq5d7Me6NXzRfVl/KrjYu9/RwPW6us4MkpBhfXvDv72YYv9aeF8A+TAP8CJ8a7Paz5+yDyIH38yyxDnqLkVHCWDIMEkhAZt2MwqoOqLz3xnk3XHDFuvWrk0FnNNU6/cq922+57AnIctMeORDdfnP+0gP90ZpZVa6E6M/u3bjht3UVPNJTfjUfy24v1n07iMEElV78SuVa1VW665Wvhd8LKxQMvJZZz6633mhjG4SYgmOCjphDwfgWYyqPseyALwIjET2mmrcN2QFHqNmQXguxMGQiU9modoK4HEdyvCu+I34izsYdRTnhl4BJNPlMaZNs2mraYeJNjrJzBO00JtYnSwyNQhd2SHThXh9Jz5wb+31qhaQoFoxjPCt3hZVGt8vjQgpDWBsJK4MYsURpKfDrcC+kiiyFLqNvKQhocAPOJg7jJQiT9goRDFT7uwVBb4d5/tV93XZOj0nb/xns1mu/KhtL8b47pRu7RSOGrDFUnYF0qWBJQth9MXfe8ND9l4a2fvuWX6685pe3LHnydqj/7NKRXxontWSmzNt087WRedyqsLbthz/btOzEnkdufWTREHQfgJML80cmDMzqenNc6oG7H/3CV7SzaWdOMjvp3rwnin6LPXNiyCQ1cqRGJIE7DgFyTFw5DsjaLu0O7S/g8+hV+Co6ocVCgGoItLKWQRyLOfl3ZCeDzAyDWEbLyZNy3FtQgQ+KtyA2pDzcdmCHGqodGu4wehcw6E+yBrAiK7Pt7A6WY59A7wBNSVIkC3GyOKtAOENCHE4UGf6A7tpnSuahXMOtUdzA3aBgS6aBOUEfHnnpgEoFWMxl8oJ3sBsUld9IKQCORUj2lSzJj/4H+l2hoQfeUbilNz074+amRb54kn1WSnbhuBNcg/V3M9ZfB4iADHyAavDhDgiVGW8mHl2dWR/oV/dr+p390vXh/sjmzC77TudD4SHNPufByJHos6pn1b/TWnmgggotciqjVq3NGdaGda3wVvhN7Y26XUBXD+pgK2iFU2KL4cLooswl4BJ4MVoZuSS6KrMBXhNdW35NZgu7hevn+4XrDdcbt5i3WO9m7xS+a7jTeK/1wchj0ccyefaA8J76fc17uvei71WV8VpltA7UwjFV3AQBaJxRljaijUY2Cq6CHExad7MSeyEltiTySOO+iD2HCHJyDsm5rtyO3Ikcmws+gV9gsE3FsU2p0jbZttXG2BzZw/DPJWCj6U8KasMnTxXjHWJAkESr2GiqEilPwGBlBUvYzwVxcMO7l8Jyc3wpSBqxxw+wmAJ4SHCTsFYsBSlDRdF0SrZD/D8BO/zbJx10akCUNSmwyby9r1vBmSry/JuD3aZR2ylmUkqra0vZzHPpkurzU5o202hCkybaN/2g85e7Hvh596N7aqf9fu9Puueug5VXy2tXrOjPVVbPar/tsu7rI5PQozfsmHvDU4N907ZfevOMFb1bXli35IoFe1/pvrbt4qvWtmVXpQp/atnZdd296+dNrr2E4t8F2KYexvpjA1FYT7UnsyH6Gve7wGtRdhW7jrtWWK+8SnO1dp3pKt8twjdNKqWwpQzVC1zU7o/aOcYTZgHPHYbLgB3K+6Lt2GdjVJSVqfDqMA49gIeIUsdhfLx1n80GtHaCfk6oPwiMotFnZIx5eBFGwjK5rL+Mkcu6ynaUnShjyyDBTz9+m6x6SoVUjthXuN1wkdyNFD1UUwkYRVpsYCjiY21RtnEpJBg0ETHsigQjXq1/KXDrScAq4J5P7cFRqwE3AWX4fDgkQqX+S9rLh/P8p/u7eV4HingItDoPDmIHu3XcV/DQRrKMNaN3uyqSOoSREZKbi8DS2kAszO7rT/yq7Psbt/xyxYbnHrrq9j8+94MnUcY4bt30jps6mhcnv+EKoyth6PGL3jg4eMuuzY9++VZh3XWXoEPXz1jy5tU7tv/mqrnlxfn8PWdOwq3MHoyFNrCQztwyjjwMy27tyuqtjh04UJcBr8HuRy9bGFmZ3WrZYUGWJ2AYe7pfQ1BErlM00illT3F8ojEqgFENeMKIyJ0PiLKeV4FhOr8aw18qwihPNY8jR2YPfYofI6Zxxd44fJ3fKjwK88xefJ1BsLGYDfeHf2JYWf2c/pkA0mglk0VUag7YNeR6zXlmhuz1yHY1pp1KrxIpqyWxTu/3+vv9jP/nkiNEcpp0cg4HaTSfMoKvPiWepBIv7rbUmyClJRqNx65W0K+SacoU80/nfxfmn+SioLP0vS78elKK2SsXv5b8xRf/ID1F84dH2A72u0ABEa04qWGgDdgVqOQG1CwQeIivLQs5kEol6DVLgywme0xUVis4s4JBCg4VnysBNAOGBVBxmBmHCfq4QcaHMCBOIGs10WvYK72GiTsLJ8hJmYNN3GpuI9fPsRyCkAWczKGtHGznujjUhU8jmevhEKYnHMIubRaGy7/KVqBXHFOgxYotCrRasVGBFIt4mnw81Ynp9fDpYmkXTbCnOnuHnY6REacdH8ThYcwB7ZRhn+10EJJNyB1HKo+oB4MWJbTAMJs9vZTZ/uUv0dPw1/MKlxcuWQBfIfUo8HV2EXMFrYe6l+ovWdAbPcC1sYtZxD7JTCOlT0wUDys40y/X1+UA6AeoHTc7wDFwAnBAoeA4hEQIj0GYhjLcARkAReiDDFyk5Fk8rmCRUEynFus2PsHfp69U+NHZm2gYafiks1Q+xbN5/m9D3Txg8LGUEjybFCT/wmzNl8+TB3PFzFMzwdfkbaKarbIDmwIlmFrmrMgBK/AcETkel/++yAERuYKKnC2JnDsrcoRFnpAhbIKr4UbYD1nIsUgP2yAiz7fA+yC7GkI9TOFTi/Gro/KOKfA1H8Ujh2TQBbbiYWRJhUQatJMMdQ8e2HPjVRQ91QGsAf9NBYDEA+7Ful1UACXM4V/Idnz5S+a+00vYLLqtkJwLb4d3LizEKYYtOvM2U89dCgIgCXVkBPcrBX0a0dstjEnnsql0U7otvTh9jfIW5U7NTuf9kjIiaLQ6RrQynN/LQr3OpFJwLCPyiNRIlW80QVMeHtivanFgVcgzM2UpKJep4SoAIuX83uNuSLYRHoiIl1nfKU/n4WUHI7KvPF2Oyo8gLUhhilEz5P/egmLV1js03d7be7Zu65MGHAl1luZPbLXAUKwQKaW9sbNx2lyCRgqr7Vo3UDp5N9TYVG4ouHADir4F+5XOBOyVZBXEl+oIlqkdKsquHaV5UVoLRKvg6F1dzrIBy7kyydE6cf58NH6ujK+c3hAaWDpveUPSH5/49IP/sWRy88JvN1tK8Azlb+z8Tu+6xo13zkyHu12hyllTe3909fxLp9yz6oFNp5pTBNlSpdq5JYUWvpz7FhgHZqNiTHTJg+DB5g+byaYULtFhcbU75rjWWnkogti74P3mE3M/mcjOb3/Q8qD12FzW1+67wDdzsZ31Ax/0IV8buwpchFa6BwC7DmwGXzYze4XmceMy40DbzMpxzQiwatYZb2vOIHa8BPLMOFkpNsLGVWA8HI+fHRynb4mAcbzrCDYKB5CYSfunXVftabHlmQvkar4lma1WzVzJjqmsnDNX3RJvcj7mk9KSLDGSc27tGP2U/iloysOmOl8gHZAD7QE24JgzNw9fw4K+0J6HNTeW5sexR5kh0nKg4lLvt0HTqRGsAVgP3m5qGhY/7hzpfJuSC+Po1Jn4/ICoa6Cir5/QWjOWS0+a3DJ54mRGUV/XUIcU5RFl2BLxhQ3hUCSGw7EJY6esAa01U9xAkWLdQKhQr4FWL9bYK4eA3e3Ex4PQJTmcYpick91AF8XvmFw3fg2cOmaaG3Bp3g1UCX4NMPtt9K8cruLRGNTj436oKdOvgedXhdCaoq/8xONFwkp+xowBnb3S3iSf5z8Y7K6elhdUg92N4/P8H2V9t5SsBo2NoDopcRGPLc+/u6/bo4/o8/zxwe4IOEtoU+QHfy7NW45SVmMui0LBAIssZiOb8QFTBgF/IIRyohFkqlijhSb5CVUqzfHT5L/VVsMHivvy4A8hdyvF+s/1X9nsSvimvHj7zsJvDvypsOZPL8CelyEPd62pW1CIFH7158Kqtz6DT335Epz+o/tPb5o23fjdwQmTLv/x965YOL5D9D/dOr23vX5SeV3/rb4xU5gnC70nrg75ym+HkwcfhYF7Py5kP3uncPNPIOakhT8Xdr8Jv/8ZFODzED5aOHjoYGHbA5ObxywcumTjJd+Gq3pnTZx4ualtzbNb5ze1zT+46L7l42aQ+38AwO3BOOYCXjS7WNtL0d8IvR7kcQMcjwO3F+Ko3Pwk8xaw4QePHyrmLdkmIJeH0Qsuqxt4ezCak7ss6pEAUiQQ7Hzx2IupFNE2jLl//hCmij/itQPPPCPiRyXRc0Gn12tFlUfpbfcrLHqT6DQ4Jclldyv8+TNHB8M5chhKz8/SYyJJj4NlxdO+SPG001M8baOnBy30IN8lmrJavRp/eK1+qr5FnOJp83fo54lzzPM9l+hXiqs8a8V+dkC3WT8gDhg3eW723qu/V9xmuNdzSH9I/LHzkOcF/S/En7t/4Xld/6r4gf5d8V3P5/rPxM/dn3vKlfpWCXlxFI0HCbg9HpdSp5KUVpdNsgqIlwSLwSxZrvboRZ/ocbkCBtFs6DFAg6jX6fLoedmAPGaEPF73Tuy86MDl4X5ZI4h6xmK1CoJScOXhF2TbKWhAO3WyIY/SQ20e6MmjD2WdT9a16z7SMbqHfJduph7P4cQIYHeS5NfwubrQU2T6vIGUwpCc10CnDru7Ae7aZxJ2IA5D8eh/bgfEa59p4BvwL02CnbU72NfZIR306N1upd6LY4lhWdPt9Sr1DG8zM3SaZ6jbqhQIX03YqoorSeiMAC2OoTZB5nzovVwzsDQBRCisGjG7Rv6+KFC/tDBnjiPTCN8IwldrO2eNvHdBbezydz6Ez73SFvWm+HBYb09/h1305d03X8CFw2zSX74YalFo5A+kbioAAPsONw14QAKMQf9BUT+9ACzwbAI3ezZltjm/H93t3B19z/l+9E8pzRiwProuc0/VtszO0COZV52vRl+Nqdi6PPrTkH5ldR3RKFcgS47y/7HYshnZX44bhydbJQdjuJHc2QmhCeFNztfgK6HfZ94O82wIhrVVImNRSE6zxxqyxizpZNXE0NTsPDjfsSB6JzKIQKybAxeEuup66vrrdtQJzrSzqh1g7+8MeWKOFKtAjMfmacvcHLon9FqG99XJde11y9AypovrUnTxXem1iiucV0g9njWhK6LrYzcobpJu8mzJ9Nf9IvX71AehL0KODkHvlZT+gOiVrP5gJoTZWDnIJbwhJlA2pjzDJAOxXE5pLYvZbFaUjBEt2xqBEWIydTl6GEcO/UNNzaQ69OjQ+BZ6lM34/LTFLqjypF3INYdNeMeUk/0HZXFiziizO1jsBXewJ1iGpTdb0RqymNr7WMjm4a/kcLnCZEJzyjV6PWm1WtwGsB3oRTRH7yNP9dtr656AvwJ+sATaAS35SiQapg9jvRvBTLezd/z8Q6CSqXhPoofhDuwYGoh29w1T5ewrBtKlbU6GSwzHUOQ2ZEYSu7jmVDYYs3sg75QcElIoIiEc4GciMXskA1N8ZQYGPZEMk4WVGSYqlWVgmktmQNgdyABPFZPLQAiwK2o4v1iRzp3Azl7Y19cH+nrPJlUACb0HQSCX5z/c3x0IKK2JPP/JYLe1jEbeVgs2ln3dVqQsz/Mjg93KJHVfo1OlxITwh5AHXYZF7MdazCIH/cU9MMmUcgLm/FXFwpUwvW92kWzxhmLKpXhvO2bwtpYl/cffHunPzAnb3NHpGTT1gWV3br9mZEN4ce3t35nx9OHl7Wt69z859+ktjfMltM8zbtGNFx2aE64O9jHd3/CXh+2hg1et+IGe55uun37Vw9YvV0v3X912+2yWwyx/6pk3OT32G6FS5mWc0pOCpOYk5b1Tv81zv/5+4wH9QaNa8OAvAK9lNliutt7GbLZ+n7nTuZs5wig1jI5F7slMB8OlBNEQwuwJcvuRBOFhzKNaD/ju4WIuBubR8f2GxB4Rinmmef8W7X1apM0zKTllVqLdZI/GKnH34wboNTQZkMEpY4VWNvjsUG/32pGdqpt9Snj5Mhp5Jzr7aOXAJ329mCr1El7ce6rz1DtNwx+ewvBH8mzPU3XxWSSFhg87I+qINayQlBVAY8GN4OAqoMqmrQDgrCYUsy19vZ0SBmafSxRdCJldIcbFYcHu63YxZi2dPjMri6yjyVCqay7Olpro7icKwjVoxYBNwQZ9JJ9mDBG2TPfnYX/l9Ta+84OB31+7dvjuG36xzrui8NGRwuOHNh+ATT/+zpa4UTI71dylhcxLBzYVXj6eL/xta+/D5v0Pf3H49Atw9pHJVpOUptw4iH09meuxAj+cQKXWoZbU7pvEO8Tfitxaca15QLzbtM3yvPS8+2VRsBuMZreH4S1wwHmzB8UEhVfCTIj3Slp/0OZ3eGM6nRY5YlYrEFwNbUZYTIuljbKRM+bP/PEAGX3jFLqDYmNTTg5CXxD2BMmcERP02ygu2Cgu2KigSAWuRsS4oKAnFU5yUrE9sKQkPYIKI7QVcSyc+ISK85zx144au8vp0VvEsDni0bvmQqcFN26Ddy6UTI65o4IjkwbYdgmD1PrzAhrs1nrz/J/xQUMNVIuAjRoocGBDxgdIDRScZ6BYfJmvmqQPk0ORV/ijWG4AQz7ZwDEzN2R1EduL4Th/7E92/6Rw5esb574Lqwr/8dGCK8I1/iuY7o2+8vDmwpO/Kbz95MtLXbAF2qADTnDTOB1Hm+w+LLMM3Eol1iTnVrquct2b3mXfnT6SPpET5jp6FD38RmGjsl/Rz28RtiiVIa/k9gfCXinhDwoyGVLBr9N5lZLAE2H4yRnej5BXIfEuUUIwiHmYOwN2JpKgQiRT1ug32O2VJ7Be7nRL77pcbkG5WxAUu5vIPDbgRb6N3IPxzDtyO/2stcnd5QlvRQr/abdztw8zu+M4hpnVnuvJ7cgxOSBSYYtUriIVthgIh6iwQ/RkiAo7tD174hAcoAk+ImgqbZHcc/FU58kRLPBOspsVEfmHmNngQ4FSHGxRDSMNJD8hDn8IxI8TsHQs1aNg29QnkwmFIqFUJpxOdwLiSGB4fzeE7gSgpb2JOJV6ArnN9LnbQ8XtLoq7qYjG5yy3ZLwGctfRmowhSOa5g35S2lIPSdlPTYahaI1xeVQ3iKFHI0G4G8bXRLOKcFinM86cU3hFjI1554pV6cbm2JVffpBOJ3w2Z2h2mrXoo5ZMVewiDo28G0yuKcSWuYKxQvOCqM2Xary2sDtsE+VlTO91nli48LtL2y16oit+rCterCsV8GrK5GOpPPTINeHl1UpWqdqTYu5OHE48l3iN+U3iPfY91ZfslyplD9ej2Ii1p5/rV2zB2iPwKmUc8X6NJg8jslaQeLdXsvkDCqwu5EwZJyl0lGF4vFLEH0yUx1SChuUQViIsWFsFCEZATIyhGNGhcDQaQVabEE3EdoMyCMrSZXJZTxlbtlWh8PKwjYdP0aT7fjkJdFRHdFQddFRHdAGPm+qIm550Ux1xb0/+J0A4RXNjZMHDSVqTJP6586xaFMtEiXIkSnoxMnrEykGKwUnSVVNWFuG4iCDYIhAD9t+IctgiReWIhGlNRASZyd1RsFrYhGJF09fVguoEQXGsEkmUgAZzcfmz5TzXfVYbUBDe/+mcNm04DKMTJ3yqVfnK05Ujh9OzI3atyosVl/mrNuiceNElWAU+aF1dyLVNDRfmrvQ7jPZwuNK3nuku9guvLO6IFXN6k7FPfgT75Cy8n2LFbBXbkkSOqDOGRLvoQL5qubqr+mqhx97juDq+1b7Vsce+x6GuSK1VD6gZe3XS2V7dU30r+xh7oprVMDepj1YzkwUsZ/vfA0aiBcEs9dJD1EvDIcy9W+XxlfeU2+z2gCJWzuhiASVMeD0aIkkPFZpHQYTmCRgM7catRqQ3thkR8RMbjWeMrJEl0jViZ3FyH3UWefSZrFY1tEegPuKNILpISSQfExHJ65EpueWbS7LH4I8RIZWgoqdacJJOBxCpi6P+vOQRsr4ELwrhWLQsGo8yCg2mf3q/oR76vKKBT6gqgDaIG9GnqwfKqKICqsO6CvCVJES86OjJTr2dkBA+SVZVVpYjFCi32pxYK2Rlt80WKM8y5QrsMPZ1lzMBHWV8gfMdP63SOOf7SW2gj4RHRedvIMwt57eQvL7FgCmfb3Q34NHSgRr2vWAwN3vdk4WRgd47/97femuzt3km0jpmuM1XnNhUuOqX2+auGLzjhanrVo8xmSQGs4LZOy648sXH/vJ04egdkTC8eUWTPxLJhi8rLGmsO/3jT4ce+OnF8+xllmAG6w/hB9/H+DERHj6XCTg4SSZDD8L5M5/sJ3INZ/NnTstG0s1Si8xSQWdN+A2yiZw2wQDVgAC14kD+zLsyNeMAfWPA2SwybwE3fpTjRwo/kkCDWyV+NOFHAx5N9VgQCiXHoqRLhUBTimYUXhSHhz/8kDaQZG0SR19MkOMbiaOkHlXu7Zm0Y9KxSScmsaZJ211ydTvuIqy3an8g4JVc/kDWKyX9gYleqdEfQF5J5Q+avJLkD2JHWeEP5rzSWH8Qj0IwFJIax45Vq1UoWVHhckmC0RRAcgAeD0CSiesJ7AgcC5wIKAJ55JOd4qSuSUcnMb5JcNLEcCDXnu3Kouz2liV/sCemi6f6yHJnsbePQtTIV1dtFgFqNKKg81gQB9r7mzA5bmzASnWg212eYiQnRZ0QQSNZ242vTtWIVKhCkATQhH+oYuG4G//SePsczBBN0kHLf8Ih/z9HptKfwJ1oLYakRDqNJlCvhDGpPJ0eeSI9K+IY2Uxfqhw5UkIr/AqaiGWAOffv4A2rihhlE5uXn77jHGDB7xeWnQdfl573Nqx7GUxQr8a65wXvUOxa7ae8xU+Vzy/Hcg7/EsPyasErIX/A7pWM/oDDK0F/UOmVDP6g0YAdkGB3IKJ3DoHomYMlf+oIKHuEfuGEwJwRYFpoF7oEZrFwVDgmMAJL3iZQHRbyZz7bR/4Wdwqym1KmJb4ef7//hJ9J+9v9XX7mqP+YHxGxzsCypO4Hg09vX8kHUcdTlCNppUGzQaR+w4C8ZFNLLEE06jdotfs/HntFSVoZdPXXhhcPPB328Ffgn/RPf5f2i3zxzJuMAY9jEBrpONZPNMLFpsVmtNzWY7tR86j+aJgz2mE6LIeRUygOp5sOpNXuEq0OBFHaLJtRO1m5yqj2O2JapduVP/MFHR3cObWPjBrpyH4ycq6AUpkWZGGLcJ/wuMA9JRwXzuCxRaXBfF8208G00lF2ho/jSO5EKJxHlUP+Ez8k0f7JTkr2Onsxry+N5PBwZ29TQ7EebpTVi05JpXFqXPVQrZLUjnqAvXgDRWVSpdor7TOboRaT9Q/2d2uVLFmxhkccotKIlypTzo2xDp6d7i7V/JRqtX9Jh9o+/oE1F3Y7/OW+TNQWklJ05LkoHe6Ri7c9eVtnQ6XDG19YPW42s704+pDkobhX8diPR3+mY5/foHtSh3DssBFciTboyNrj9dVPqQ5rhcsANLITk1ihq9EcdBHqR5vkrWibPKTdpzucOTz+t9rfVWmNasjokAJxVbeAgartYDfcoftVlaAGZMkAp/EqPdo4CMOUsknZprwVPJd9Dfwtq1eqHeo0zKGMPE5un/ggvB/tlA+gA6o9414EfwDH4MvoFeYD8AH8CH6s+kjzN63dmrFms1Xp7Gy4DXxXe2fVHVllaQbQn9IHPA2eiRMswJJGujRgonarQ7Ir7EJZRIrWRxGBs5FnaUOyLb1UYKmRBkmuVWh5SUG4gz+Q8koxf6CheazUwLGsxOkpl/B6pag/WJ+tk+ohAAGd1ozDyWYASIJ0djprTqezAGqzzdzENGjOsnVaiDRqlZLndT26p3RIF+FZnrdaHbvtDfX1sVh0bF0dJnG7o3abTaHgoogTGr7D6tLpFNvPwR5yS3c0RtbI2nYt6tfCPVrM89DncnlKT3mnnvomPfVY+gCmMERrSxSGIoRn+4SJT8AGmqZyjKapRgkopp59pOSaTtWeHF1z+5XF+KNP8Ah1pvBYfXWl4oCuuB6/lJrFvONcVrb0hMxS4oAV9PaNny8rU5mK5tS4ivFsZ0dngtQqqqrtVm2TymeurSJbA4u1sqirJRtEDOpqAT4zSJ8dHRTJs6N78eHsREtHsQZIknVpHWDsUYUQrxvLRCOE1qi6sZgtPMvYHdSi7BTDbFXFTK+hWBWkLOV0i7WN/4L3jjqk6hpAJ0joOR3ZPAgth6c2/GjeyIa6jClXKKf2lhx58jwEHJdMlXvt5ithWaMUr/LCv5VPXjXNuh99VNBv6MABVdRuj2ThS4XWr3DkgL3oZOTlhSWmbigujHlsQcy5rU0t5kPYZstwzHQQ26wPvFms8BCBCH3AB+XAPLQSXYU2+7b5dvkO+TQwkIffkjO65dVz0CIPwn6H8QesNZJhbEDllUR/0OclM9IyYMCfXAYRuYKIEbDRdqM8ekZOWf9RwkOpVFFFU9GzKqpoqu3+JZ3nApwiJp46Rcv6yUL/TgKJCbqcEke2+zEJN4p6Gr6KiHHl+VOD3QxLZcWMhq9VRfiDNuZrSURLpEgPaODaCNk7/Wu+fCczN2yhKYsV3fN8oqbqm8u+941V8Cq+sDU8xreGuZSkK8IwLq87vXuW12JOXgmK2Kf4Gx7HNGLpOL6rt0MdEGw6hzamL9PH2TRvHAvHpjrsq+Eq+2Wpdfa74D2pF+y/t78LP7BrtXaosinSLWmm2l6dnmRnrOmoPZJmFHYubbMxCVCGn9WDOlutPefIpZuq2qpWgfVgrX2dY016M9hkvzG9DdyV3gUeTO+o2lP1S9vz9qNVf7C9Zj9WNWx73/6+40TVJ+AL26fp8GQ4xdaSWgA7bHNTl9iudjxnfzb9iv2V9Nv2t9O6Ygbd55Wc/kCSohbmiYI/WMyp+ylikWCHFDvYHQA67HYCV43plDltt6VT9hRM4Wu3OR0OG1IKAgDpdDQmpBdiduNIJQM+n3+Hf4+fMIkTfoV/u1wFqyAiH6EV9T69gWTDKynFwNInzHE6yX6QDvaGqQJWgRKYFAkkmcA/W9RMyxlIx36OT2J+0osRgxYzSynRrGmCxUastdsNtXbRWAsEe60tf+bYflutLW2uLS73oI8OSHLZsgbaU4zSYUVAcLiKkY4DKcJloxM/sXMTP4mmUUTwUxD4CgTQ2EYJz2M5570MmZaRU1K4PV2IpeeGrGZd6yzYDz+EJ2F/al7I6gq3p0aOpucFrSMfs1eeXnutNx4OZ319zNoFMXc0/OXrLH16evPZFzZ/eQvdR/7tM+/jmHgaiMJPqV62bjZC4xYIkdyW24Kg0Y1gFFWYxpiuNt2NjqMziDcFAkaRRAcBP4kOAgzRiaCZ6ETQaDRAHPMZA2ajMYDx4IeyProbqpRKiCSnYFQyVJYa4yyDwSemRVlkRAy9+wxYsOIodSIdmhoVt5fRWZSmnFwGfWWQVA+iMpOZfITF708H4NEAjqRo5ESD4AAJh1U0pnLElvxwFCOKzOlsVhSfwP136AKDop4MDw+U6t6NtbCWqgdPFhKCTuJKYkqjw1gGm0CtsQ1MNS4GC4yrwSXG9cZ74S54BO43vgC/gMa/IEhi3w7Qm4C9WJ0OAXTm4SGPsQmRqSLseXAQ/+4BrJCyq5Z0B0sHiR4OOGoxOyfdV2W9sdZoNdYi0YIfjlocNr46qK7FH3OsePhsv7kWyYZR/3R2yoVoJNVHE5KUABmVUY1SoAxbieySiyKedJZhV9G4iKgig3Ux+xWCHfy6ctLUnAR7mLFE0eCrRAVDp6+XIm1YH4n+1Y+td9dz007zjG5Uw77cxE44/eOz+vb4xHITviqag7marp+XwK+pxlXeZXyY36XaJbJXwXX8ALyZZ8cL2hhgLDGF0t7gZVIMAozIkAWYMsMxU9xEK5xNOZ9bdiO3oUFU+pSoWFI4xVWayiCp7+lib+KTYg58dBVkFZTIakdnxBTRaQwVQIL2Cmjmcc/K4Z6o0lZAB8KNUbBUABtrqQDnD3HiOgwZ0l6gxZHmvm7AKCx0dkqhPLvUEbtGgwj8pK2pJgl7A13qaDSI0QgahgL8ZmF94YPCu4Vv/uGpTw9cvulblw099fmmy7lLC6sLLxdeKKyC34INcPwv904ZeLjwRGHf0M0wDpvhokdvxmNH5nETNAYsh3uLVfJJPBTfqculklfa10hrXNfEepJ3uPh19oOhw7HXpdddvw8pHFExGYvUhmuj9bF0ckH04mhPsj+pfg5Ap6vM1er6neN1iXs4Bn8Res32+9Br0VdjH4QULjnojgk6Au4B6JV4fxBDv8UfBG5fedwdawq2BVEwyFviMavVggReMAKn6Ew7ZWePk3NOSZbmNEASysk9SXRf8mjyWJJJlkPq5CF155A6eRjQ66gNlzKb1Mfrtlck8/CqIT9JZX6FSZasuHM6mfWMFGc9I2TWs5jYpHOcZBFYrbHIAsh8R6jM5rKHY5EyWyQDQy7cRB3xDAxLwcx58x1TZuMgyoNBLVjPBjy+eixFL4A0vwUSxTLwPtgH6NY9e93BPP/+/m63W7DE8/xfB7stZmpqFkyrldTUhK8kQWnq8+uIX5ynPLu+nu6PUZyd5OEDrsj07MgRzDXMEuYa8K8Hfr319Z9X9jXnZrpX3TX5htmZdrShcGW/F3ONMd41TDfptQ6uf/CYbpJK9YP++Xe1msic1uTCam4dtjcLiMByam9lE+F8/g7IKHRwHu6tgGvhTXAruFP4mf5toGT1MhgHmbkCcxebR8fklGCNiQzw7BYEwt5IKSELZgqClkkEGrymlAmdW+nCmabERm0zJsdQzNkgan1apNd6tUg7JfqPbPMkmZPuJLdwaiJr4KnAZGXEF3ZF1BqVBins4VAwHEQKryVQAd1KJzZLPW4iBvzUb/ZU4G8mafBBKTh01goYNOKGruEbXcYXJ6uUS2X80l6WyfO/29fNAuDJ8yf2dwtAKVrz/F8Gu8XR7UuKO+RwhLJHymG0tAMGsWkzgGdNmi5eTkLmphXDd20uPFf404qts9cPwM0QMzV4I7bx9QdW3/qty/c/ccXA1Nof6/c8qPFxFw1dVNe8BEo/gWl4e+GywoufF25m37/+/sKewsHBTZt+CBv+/mD/urNzkauwrcdAFhVXng2G7MRAwtRMBgLQeGPk2eCzFcyU0EMVyO61JVeEGCVUhiPhSWA+XI1WhzbADegK7xW+tYGrw5vhgO/uikfho+GDkScqzoQsCt8N8NbQDdF7QjvhA+jB0OMVT1W8mv5LxZkKrRFYoRMZY9ieK+uSdekVoYtTqriAXC5o8Up6fwCEYxIQvJLOH7SSzGFQRuXhUCiAoBkhGNqNfIiPl+2kk2k2crm8yLfzXTyzlS5fA9JuVzYPvy3rq2JutwvpdTocsgtGWp40v1ieNLEtB/yP+1EbJoTIv1+shnJ1T/WxaqY6K1AMEeg4CBRDhIDVQjHEQk9aKIZYtueWHKKh6FfmQsROkmtMJAh+pIr4kSrhR4k4kj2gcBDal0qQiNThFIdHo09orHXaS+Fmgq4DLm4O5aqo9AS94YpgKgMrPbhJBsozIBhK+6oyEIxq4nXXwb7iXDjlB2G6MJfcXnfQXEs2xj1gpg4fdz/aL9amRT128bDo2TvIzjzSYKiczfPvYYJZXq53QQEPIn96sNtVRWdmXRLNiLpQTKMXKQTpixBURWdki+l1rNhlEFK4+VdwxJOAFVadXevFc6sKdxZyGZ/WI7oi03IUmGgQBP/86otb7n8U2rs2rz491uRSPv3sfd+sW4bWIwgLa78KT027rrw2HylsuGm+Bn0XPnz9xvtMNCfXf+ZNlsMYNQZto5ruMN5RDvVQTzZQ0LMxUMYl2mAbUhrq8rBFPlY9ptrJSOxi+2LHYudiScFpOR2IH61j16jXaNfo1up7PD3enlRPepNwk3pAO6C7QT+QeJh9OCMatRltVptzZ9xZd46UY1SwPo/PW1ZWkWmEjaiJTTvSnrQ37R+bHZubrJ0cn62eq50nzi2bm3B7oRdJGW9Oqp5tn+2Y7eyoWpRZlF2UW1S9oEbHqNVlJrVUFlT76urL0nV9xj7TptDd/N2pbemHU0djP4k/lzha91GdeYYwRgKrkfQ4fAkiuBGWqjlkbe6eSpfkXu2VPJ7DbnIm67jHjIGrQaMzazS6hCauYyNKelAE4QiOJmOVTDBGqjyg7AlkISS7SOVhUBZThqcM6Ljh/2HsPeDjqO7E8XnTZ7bNzrbZPqvd2aKtknYlrSy8I9wbFrjKRlgBh+rEsggECI51oRiHXKz0ALnYKdQUG1cBISiJIeQSJ767hEvy/xHI/X0EAr44OYc/OZD8f983u7LM/e7zOdkz782bslO+vT2kuw+4X3Ez7kl69/H4t2N5BbLv8QHxfSX0XOlPpfOYIZtLambpF3iDoUp6qYLZNFv6HlpM1dFiEmwE5Ho4vwMT6rFzkDQ/Nj0GU98QiYpw22aMNJhpnJZ9puVbIr1hpOw40yTr3amK4MmmbQWpi8q5gBV78Eqo4E25aO+ibPZCPqNgxuxy5toNFTNnscwD/uQvKqFnYRLGo2Gw81xju9ZxnXJNHuw8CEsG1A4rNdVu01x1tuKqd1VcRFQeCpueWq0jGOyg6Y5YzNvRy0SlDh4z7yPbOhhvkvCA2SiUxn93ZoNLslkjLUZbeV1WIFHS3RWjW3mrqdnpFcEdxXzLUIe/feX19+Xnv/H9+1f86XvzqvEfhYJRwTBCG49u2/mZnr7MzDc/t/LV72y7vTcQSshYEMzv3n/Vrsvnd63Yee2HPn/5g69IXCNWRv/02c+M3L2p89pC7Ecf+dTaz/5LLRgvA+7MxzLhQZAJUYzgTt8mtIneFN0UuwndRN8UvSkmlhONxOrEl7kvhR/jHgkLNIrG/GCPaZOAlicFLUnFacUlJibpKdMjoTxlBpwN1YXFzEHqAKRM0lkzJEqE6kqEwEqE6kptAX88HwNq7YQzqJgS2xLbH2NjT9NZyn/+LdMGNNlPqLEfX/2wvnXYCl04NwzkN4bJva0GFzhkc1XxJ8qfVvqbDmv4tpRpq+Gltes1IuKBQwgpP7HKlWF95xgdiyliXJsUzh3dFqcdipvQPmVW04H075Y7EdLt30f3iMVNSHrYr7nSNk/8urXPYbWmPP0D0HG+sSVbXS6kFW7lzA/Xpvp63j3X0mdYu9Oz7Uo0n9Av2/lXuSfxNyihb1tSeQWrfO1lmHwYP3OKtOZaf6Sa5fv4lfztLtZIGpnOZGdmUXJR5uGMkMvUM/Rg5SO2j7kezDyXeSfN9zst10M8Hg4m2tqJA8IDxuJkUNMwj6WNrENqx/rxn4/AO8ad14jyTDrwvnOgJSuSJJr2umhigUysiLQIXgm31wt8k/BQnvgeQOG2XD3kThc2akoFjVb2Vw5WXq2wlbhOPr1OPr1OPr3epqq7PGi7B3kI3/U4YZ8nBvs8wfK5C7r3cMtCB/nORPvOD18w25Hc51Yce0dlxeW3P9kjYlKRTmRlN9RtoHmXkTFSTr1IKe60PVdENjmhGEUqazNAN0OWoEfiDdEwxn1qB5CI8FE2TDFagMjkSKMdBrH7OaSmiGd5At/n7cikMRe8yNEEaN2MUUky/4Re7RrM+y4/87PfvVbRF0G4YHVtKhhduff6e/55FeaF4P5YEN8x/duf/f5rD35i6K+0uvMyw6ilxqafXP2zseUfOfpr2tilF6xYBBXrwd8FvKV7AGaOyC4+Tlse5SN+FFMc+NaPO+O0X3BigQn8uw1l+tSpKVSGwHC7qiSQX7TVH/cjIjVpVsh3V80K+S6USWvepSer/6m+Gz+bYJ4OPKU9EzqY+JvAPR78duh73DH+KYF7gnuUf1x4wveon3tImHBNqA/6JxLcDb6tgY+wt8vjCW6Tf0NgMPFB/gaB2ywMiZvlq5xDPs5MDFJrmQ3cGp7TE1W217eYWubkDD4nZMWsL+vnsLicqCRGEqcSXNNZEqGcCV32h/ztfsYvOOARw04saAhi3Al+ksawMv3888+D+d/KpDK9FIfClMunhF1OER8cD8TC8cnzu023X+B1URCw1OfF6ifH8wDsNX8AbwXiLixOUrTAS+8GUOAPFb/pn/Cf9bP+1ys+0zfoO+g76+N034hv1DfuY32T9JvH9MQXExApjsnScPDc8OlhDCVNCyJkewNfw61GOv9zcLhVGOHCH5HchvNoDNiRJGtq3WWqdRasPUpdFD11LB7/+pinLmc9MPrrJ131lp1hCGopHPcLSgwxTgcBYvySBIBeArzNShZQfw0lEZC1DPgJsOQWkFCzfkKN++5So5abyRgzbEYJLptPt1/VW0JDyCz3LeLs3ErDkej44LsfZz+zyRtPcoYhlVKdN77374z7I8VozYYpDIHT8PnfCzsxnNaZKy7EPByTUG8u7QVKC+YqOkNHpEqYtam0TaQgGCFQbxBwnQXYoMQ7BLsoS4IsV/i6oDo1T92OF5hs+rAoVcMQWY3bCG7N13GnW6qVl0tD7EbpUYlP83mxYMvas55sKBduz2Y6uvl6qFpZwi8UVtiWhtfyG4WN4pC80b4xtLGytuMGfquwzXZ96PrwTV23srfytwq3yrfZPmb/WOi28M7Ibfot5XvYT4mfjNxXvq+yp+OzwgO2z3k+pz0Q+nL489kvlD9feUx8QnrC9kTosfDjkSeij5YPC4fF4/Jk6Ejlx5W/iX+zvRf9m778+vIHK9d37JHY3vC22Pb4h4vsB4UPitdLzAppZXxpdkWZHQpvKF9eYQaFQXGTjWEFSsaCYsRfbo/k4h1C3dZyJEYpdV5fuCJFWJvberNhVRRsyCbWMyogB8aOfoIezz8/mwMdNgtSJCJKkhzBkmMsJlI8RhdPyBv2ZMu5cFa146tkYulwpt7RG65Pnh89HLbJ+uT57aa3Igq63WZrC+Ojw6FIJCbJMjGrhiN4IFKOimIb2Owr5Q5eEGBPpNKBNzs8aiabrddVirbJsigK0ryv8g934G92yKx1WKHyJPQ9XaxUKx3jHRMdzOqOLR0jHaNk49WOsx1ix+viH6QrbOGjIdvTtE6F0H+ZNtM+aD9lZ+yP9s2bpG88bKEjlF8IKqc1ZfocUdny06/NamlzqnVDNQaCnxc64s45GPs/o+zctaA4+0X8T1D6Sb5j848aJiYijJmAxt5s1u9oxGClV/Aqrqm2BtV0Eg5jEdMrRQgi1GnRJrW7072IU33EDQAfsukG6Gp5AZCvzcJhqYnGVnQTCJnIU0ataWJmB1vInawJO2uXxrz5mXuzMz+dOZma+VDR7l00D72t1XoLyPb7rI51YE8w6MnRSqq3WkQsogtRf/oSjPbpavLud59hrnnvH9hrPx5IG4ZRaUt+fFqgd49t7kx7HKrI46Fc167pOP3mnZVAVnQaFs9yURR3ANOCBnP9BVpwxM0KGqieR/i+niyEAppK2p2gSmw62Eun6aDIt8JwAnXCwpT3ZsmCcrsbOYJSug/dRn00walxSA91uuplxVtXBsy8OcAMADjtjSert1K3ue9oG83fUXyw7YHkI+gR5fHE422PJx8pPl5+JvmM8Uz66d5jjReV58PP6y/WpwZ+pf5K/5vt7EBELSu62qan8tlSuXyJUlEr+rxEd6aSX0I5VGpAH6gMnBpgXyiijxTvLN+T31NmF+SH7EMJRkoGk/75jYEVoQUZXvWWUKr0wcTDiYdLbBNv29jQgJlzp0u0m0qU2LABryIc4kMivIpwujfdjAB4/vlmAy+hxd9WlPQyKib0stLmVtrUBoWKaoNXhDAf0vFVMsUsRt1GX7jOITbMBVUtHEy3wVXLPeHeYpuitKGiF6Eiprcq8bLpZa+ul0sJN8WSFWqr9/ZChGkoGOR5Try+gRp5CvKHdVRBV6IRNIoOoin0KjqLZDRJ/5fpWqiv0bfqjN5Jte1vo9sm6R8dMwe+2ELHc8NYBcTscW6QVrPaBiiABP+cTUT8XyHd3DWU14dU82Es+x/CbwYKCsFcJDsWbDxWRrm28nwG63igF9yQ2JrfXh4ZIL59hHU+gpuuazM39NLt4OVPKg7wlLxueuz1pGarl/CSXOqvpyt+GJ865q+3Zf3AdV895K/DZEXHbMTZR4MHCWNvUVTrbbpa7wUXjauesRpwz+BGt5q81cy/mHXP/jUnBhomXkJMGewlKuFmQ9mePoYEzJryNgwemsAyoTAhEBhqZgkE8PiLIgesku2YGjCI5GG2xnokNIf5hxE5yhohecTMQpS8/ZZN00/3RXxhSai8NnO6qHavnIl3GfNHlyJz5q8f+vI19M2D8yqn/tzusbtKS9Hv66nuTVfQf5q57MgWLBYgm2R4AgH3EnTlzOf7Mj69nTEMTglt3Iw+j3bvuwZvMaWIsWTmJ6ijO+vzKT43wkOuwGU3AM3wYJrxOOhGlt/7CEchlWgZjzVqZuUq7argYIUtBD4WuD19e+b+wJ4MH+SCPE1VfIIvq1cGKxzHYRqZ9dEk5TglZDOprFGqVBYjs3I52ihsim3MDlZu5m8Wbs7e3D5aGUfj/N3C3dnx9vHKvvZvoG/Q+ysnor+KvlrR7+F3C7uzDBLoMLJU4HhaD8epbClMWcpwTIuGY6m0Fgi0ZdJejDqCKAJqtWWyeCurpQPlrFARs0ImrXFxBVFUPB4D5Tngb4WA+Vt+TOiYLqL7tpmiRBPFGY8dJ7rzt/UMvAXVUbOmJRrMjGbGMxMZITNJf/lwGRAuCKUkQ1hP6g9pF0LoZnFutko92xRR2SbDQ2q9FSYzN0qGrJuFpfrSfZnmTMTgAwejCRpDeWKX5IAEYyRCWeBtsNIA/O0gr0IDyPCkvd4qqUJE1YzClKJMLEEskFTsv2nhF4RWYGUYLt+vhSPiYryY0WF2yJxCvwmFtl7RP/NUJH1FYXoKtPKZT11aXu5N0wtj5dWXoDCS+6Pd3ZixldZ/YHp65tstFR0N0L1bO5OyYRQKqatmVqCvX1WKFIKkEh3Fgs/bjcoEJlUTagvgr3G1J1TtdfUqC7nlrnvZPY7jEuS6Sga6jFqELpO3slcLI56PsGPCqOde9i5h3PM49bj8sOM5ahI9J086vC4FwyrHMLyb4yEMrU2SvVg+kxRRRhQeJeUvTbNLlG1Jt5uCnAAB8gyt4tf7eJYPlT0Nz2oP43F36gpSPi0GVc/tiZuGiRdsFdZNsBr92jApLbqKZHhM9yuvNcvzWsXxLDe2NXLBTILyoIYcoRQ7hDeBxVmePP/Ok1Y8w1D4OMe5FUV024g5zE2LiBQftnxYc6pXSigBSVhMooYSbZbZ5MH37qEL43tqCfPdg8y1M5dt+0CXLx3hVr7Lj36Ln3nAYF8qD92B1gAteGzmRnqEu4kSKGuWGs2EcsQSw3JphlYEPo1pgxQIhGDuNixPMpY8yYBGkOypgQd4lBln2HFmgqH3M4jZzfEHERqkR2gaixnSJOo4nPhnqyi+5fKHoGL8fJdZRdatN2YlwpBaxuEnET8p/OnINqTS3KRw9tA2WrngyU2QQssJemRmKZqc+R1qm7lRQKv/9hVqtn7wJaR+8C1EFkLcJGJMW2Rr9/Xoeppu1hF2za0jjL5DYgFUb5W0NgW3qHyc+g4TZLnPJ/D5UEwYvvP021jWvbieMHgd51YU9mCJcQ364+CMv1VQGFErZm6gGfJ+H7ZqrZvSfokekRB+w7yQRpTCsWmaURsYDvFrRog+yHPWS4bGjOGXzOncKNSaGecmOHo/h7jdFeoARVP4/X4PdVAJai0pMETqKlivl8y2Am94eM4rbpbrgYqALH6zR7YxKiWQV0xdeMWeBKlonViB3+9S/H5/x930zsxqfiupv0I/xDzEXU/xzSiBNiRudG7t/jWNlqFl9GJ2MTeEhuj17HruBnQDfS17LWdvCmV2hqNojqPwvYsC+dZUo6sMcYXhIwzL0Cwpx8LxXsxYmsVZHK3iLBzL0lgQOmpKPMVR1/HXMfT30UL8MY9RDF5YtPAot5FU0oFCRWemYT4Z+FDvgT4yG2iE6bDYKpuyA+XDRxmaaxX177S4OpH40V/Q41fOfH3m61ehA9z101308ulj9EkCX+f/NLOYVWcexPBVs2yKNLlPF0N1czS6jl2yVMsrf+23Sp9ClRtETwr/2ZwcjIBvLcGq777MJmcWr8Xv81bWh57jPoyvt9KqizzKneLoCodceOevyHxKd6NJNH0MSnV+heUmaelw4isvW8i0ahqKlU8PW5/0EGVCUXJrgoIuT/LWV25Mch+eeZT4LZedP8PsYQ5QndQlzP1z6iXoDRKp3jCBR/rCQskQbTbwZsKoQdm7LMlLpdd1+eEQvP07YtrsAjbqA+bZRY7tqgukFYokyECX8CmlLirG5gqVqt2U8EXtZjQKazfeZZ88/0szBgfZ7ewuDWlkVCNHaIoRE/oLLAXzO2I9cZgkCuTzJ8vTADa/zJ9EZbxBBLmpqZfz+RPKL09C+HrY3G6LfLKLVtd0I1WP18cbj0nHZEbNqzupnV33Uvfb7q/xUdXfpzTGG6wUWcmt5Bfpi9pW9pmNPVFRdgo61bYMrZCX2ZbVVvQs6Ft2yQbbdbZ7pLvlu22utf67/HS8saVBj4hdVLW/lCtWn8GqvZ2ywwz3dXvWVrcTP3tfTcF6Mw3K84id0Ulzq52192sQSJSz1VdrW7TtGlPWdmm09nEssMATV/rNfho/9iiU4C3W8HubZBabbtZWmiqi4ohBdTns9moVv/j38Bfg13U9g66jUpQBv+isU0bcGDcmDNY0zhr0uIEMBQ4ynqEXYMLjw9QkXvdNouvMWLhc7xBMZ10XBoVxgVEEdFZAUERuwfwFH7ZcSzvGxvJQlSWvTEOiEmQ0tqKB3x7uhyotp4eVMzsaZyB6OO+uW/S8bGH6IcaOsAxzpjnRAfExLanNiyQ5T09vdy/NS6Is0nyiTW+j+ZqtrlPuqCdCqR5X3BFBbcl5XD1C9YpVHcvMNjWiRJCzDa/6+P4IRTzF4G5q2pfbrdIqYwjLSmjHGAU6SkMl0n2eIqy1Az9pCRQKhTTHnPUe3Qm6AshMOui1Nqxj6LZ6AC8RgPaQrS7jT9mThVbGrYxbCbfSbGxX628IVIijmsbG7NVJ4fWj2+z2Skyx6rYIldyk6DiyrWJj+ydF6dA21tZ0Ys2m30E6RWuqBlAaLJ8u7wvMrTwU8IPFG5GUap/lIQYVgtRroZf8far7ki0fi+V++taGNQ0jTZfTRvngvjsumxdR5YBLsfv6R6/t6ENfKqxeuL535d0fcgc/ceOCjoW3rU/tubatrdBX6qwW10/k4pfm75n5yV3zvIKjv/eLCz+HhvuDhZH60i2Ydpx/9/xp5inMU/1UCr19gXY8GeOABihADTivndJIiJ9mB1cHkAo7ACoMkQ5QCjsc74Dj7XYtQLG05AGNy+01JXyY10eFDcmWGKIF4sdsvJy3HJkE01/OTykvYLQHmmoxFKwOUAy+BD4PzoFzYxyXNijIn+fXaTTAP9zOO0dgG3f+4zgM2e1pw8o9wqRjCnonm7930iorFTZvV9Lom/wx/qjwxziWghY4hrv19C3Mrey9zG72EeZborBEQH2iN+MY8MS8C7WAnWLDfkpJoNk76YgDp4ZCcAc4hnvT7sfsOWW3K45Bx6hjwsGO49VBB0M5IBSngrtTjlMOwYHpx/H+mmPE+OGKZu4/ZOpYMfjTw2OWh3es4Q7USeV6glzZoM7YhLTOxHQUkrUIFdRs9oiIt+JsQkdBWzhCRfmw3iy32PTrwHxniGQGjg0NhQ/7KDoxKQaObKMFKUzyR6UWvALbulB2FsOfFQuVMbqCqBkcReAWzbvnwb//56/f/63Bh9e7dC3S7kSeYteH6pv/4R+21mpZ+u2n/vxP574w3tfHHP3K0pCSHJ3OTv+fzq4Xnzv4bNiL2dtiDGfLMY9K0G1k1gWRRS0uRYcuSrEnnIb3Gy5JgDnoaHCqkCS/RBTzlSMeL70Od/7xGPCtaAeDGQlmEvnhxokzBJhOQhWfJ1WS4X9ze7FKJeELBxwbODriWcuu4dbwa4WN4Y0R4TruVm6cGk8cCT+vn9Jfpf6dk3rQErReWxfZkhzRRiK3amORT6qf9ky4J7RH0DfpA8nD6Afox8KPg2+IpyN/1M8hjaeXqxvU++P36+PJs0nBraPvnX+V0vESx2SJilJA5isYdkYS4wmaSigJnSRujSYm5kRdn004EtdGX3Eh14/9hiREwcrhrUNj9qp1/JC2xM/idrTavtdO28sKiegfoUapCeogBRXoJBigqSduDt0VogdDaF8IhSaR3VTP8ojiFd7SdTh+QduCp+jPWCEGUG9ieGzH9I7h0zsI6OXzjTNndhAGcVptoqG8JnpN9OYo87kogjr9GH96e3tRLynmCSmnxEKLNRwNfApnj3nqnKK0Ujr0OSkdCNwrO8LHXS4pkWAkP5m2QhKY6KQYObSNsb2/YD/4Bulalepq1mTLEFW1rVnJChNLZrnx67u+8jpCR3Z/t6MwL+a2JZPzt15y+df2XH1ZTxVdefRHiH/l18i5d1W6nPbdGo8tv/pr33x3Qel2kJcWnj/NcpjmxakiPTZHXkqXSX5fjtcICIoWOBLQpPSon5BAv00nDl2APp04dHVyNB59x7S8tRqcoUeehoRSEB4gWTyuEiOtx5Sc9DqPlzLwZy4UGCIFAS0s4wU1pZ6XscwzRUAZUkibX+IKFZ9F6TaGgVMjo1FkRkeidDRuw5ex+QlV9LNAAvEdeqHVWZcLr2nYAybKHDmGPBy/jufLJUInT+YtcgmJq3kgQC8PD59sQMUaTDIxJj1FlbHetGRJtQwIdWm+VB0p38neyX2SHS8fKE+VBbM8Xqapsr/dl1/HrRPX5r8oCEsFpJd75CXyevnL7KPt+8vCVPlsntZ1Sk88jXHDhjnzon59tX6Vfq28Tb9D30ft058QnhJeaLelRU/GPqDGPAt90Yx/IBKLLozj02xswUfeWryACoU4Y4tTtoRdB6FH9Y34x/0H/EzcP+Gn/W/mBnnQ9bKlKrTHl9T4BaUFu5recaxAjEGRSviD7JUx/MiY4CqE4lLKBcIbSudZMWOkxZxO5Vm8ygqGjtq5gk7NFh+khnsBHyDMEcLMwIkYPuql4jbJmBTeIBBemBS5CxBO1EijVaMNSwC1WXLblAMCXLLmhqiXJqzTP14wvvyLr77zo9tXY7IbyjuQu+hK+MNF28zZEt9/TXnjos0Ht22+bvEl7z7/PFqy6vF/INT33Ze/tiTiTu74Cfr1wtH66utf/Md/tWoRQs3vNcxByktFmSNzYD8r+jGvtUMJJMpJmma9A1/FpBCEodIwfTkNiVqEBkPHdEMWAUXZwoZbgAocNIQfHoGzBUK18XECO3n+JXIG7vzjccAbtsNmIwQH5H+SHQ9BC8MEAbAoUD45dUEQiPqgQOlBimnlMZGbsH7RqhySAmBXBF04KDCUMCJAuX5W+Cz7dfYQy8BPCfjRAGfTAPhebzyGnxO6+GkxgsDT4sbphyGnMx67WHzInzwFEsTwieHhfKdVGRkjCHGvqlu04eAINeJ9ieGCegQLmZG634zU46Tk1ILlVTEOrCdOgDFbJcNr2kvVMB+UNnqu8m8JbNI2hwTESLwgiXbOt4zfQ3+K323/pHJP9Bv0t7Sjnl/Sv3H9VjlH/yfjUUeEEXEUP90e6QfCi66zAuagguNumpEAo3iMUcu7pcX0Eml1fC29VrqaHqP3ePYEH/B8U/qmPCkelQ7KP6b/QL9qPyd7xVMCooRTAr0DWnh3ECR6UOCFnayXqvh9cKseta5u8e3y7fO94mN9vvC/QPWs86cwYwJ/+iHLgW4uVevwjq8MI/giws9EfzZcd/nRdv8u/14/4z/n9Y5DkvOESFfEveIrIqOIpoifRDwoviry4hNOH0vtAbhiCqZacUIdOYZyKk7dyZx1IifciYTfpXNBbEFTasIKzKrpHSAy7YD0xjNYSyFll8cApPJjmIWAprDdhzUFMJSQ+rtjxPhE9fZCdY0FG4/wFKLpHUNEtSGegzFihxXwr9mSdbtZrDvwAhN1H8qCERYaoCaHwtZW2NrX3JKtLdnaksiW6ZTqPiVYD+ruukMnqSMof5GOMQTUQhBsbh81Kfz70W0+n80dJhWa3IKNJTXsbRc4Y0up8PBWmFugySNV4JFGIm0Fxv0Wbd26e9M9xbjvH7/88Jt/PvbgC9O70WOcEryme81d9LyffeQj19zm3fN7hH7zJhJ++kTfxlSv+Xdg+1lNUcwd3KeoPD0whyoYRcIRiyYwtiKxJoTzSHHySHTmkEhyCVQnZFSrgNhOlZAMK6mAf9qqn2DKYsqIBSjKlXNNovAhlYdqjGemlKnGyTPKGYvtTYEKcEJ5Af6dINnq4dbkwC5yDoVPNaM5PoWvJOYQQWDEA+YioguQ2/i1aSNYTMbx9m+JTuB0FgstJvcyrPDPnzxp5aeEzfn36w/4HkgzC5mF9qXBe5h77NyDLCoXdyUm+Alhn7hP+qryVffBoqTwmL5tad+SpyOi80hM/GwbOhITJhnRjCdj+2LPxeiYO2UEUH4Qq/yV9pzq5kVBVjBiTKIrDu/Fav4k/fYh1J6fRIrpyOaQ6nIrn3W5UAqA/PDISJW0fX1W22hYbaqDtKY/kqhOOBGgxhbnqHPKecrJO4OFpxmeEZpBoxYwrzrTmmW7HzevDZ8eI1bN/v7psf7GNNbny80cDdXIeP1pw5c2/NkIlfGmIuh9MdMYQJ8MpCaFt0xpWyzmxt/QjRXgN49ty7n52ZwLueVusIosvi/rAkK5krUumLuwWWoXJrcFYc6JoqjLhx6JGPPXTL+cy14aPHRo49EdN2zsq8YCXcvj8XTJjLzFrJx+ZLytkEplF15Nb1rav+f7tyws9sZqiQ95PB3XvXTpUswSLplZzPw/WLeYRy2jhphpaw4u1T/4pfQD3QxVVDbTt7bfuoam2vkSf8X9OtvoWb15e88t6dHNMM/CXYG7tb21T86/a9HeFfeu/kLgC9oDqyfZp7gjgSPaT6o/WTG1+dTmVzef3RwO6b4upebtjm/mHhWXdzfClJ/pTiwPU8EFKpTRdEAquOTxeCVx3ECqAdY0FfM9g0yEa29Aa9pUW2OfccB4zmCMSfTVoxvz4wkIJ/ud6YBj1X2JA4nnYOJt6xzS4lMS+FhTm1iOlsOcXstNPLS8ACi3nBRFQKLp2S6iXSLuuCHUsMY/QKr9dpj24HK5HESDwfEgHXyW/meKx0i5iurHu2ReCF6OLi8UXKu+z1Qwf43hdZ1axVTMuFJB2yt7K/sqTEUDfl6xAypVavUSM74WrYVnc2Asx51/PKJ4Sed3xHK11koIxAi41ohnEUlO8QdC1b1ZtDo7mp3KnsqyWSccmW157XDnP0wVCE32Fn1zZbO5eT9+59xmODVis1c3O/d+cTFaTGxeizt0P3L5R/2/wMxl8vxfTDeJd7WDIOIn9+ifpJ81PQ80UKOjwgwy9CCDIJWNBtfG4WC0Slp8VQZ+HgR46ByHZ2Ru2LT5aXQblUDyk3vA+U4iJ7F2NDZNOmfyY6eV/A6rMkTeKvW4QzlNCv+cUc40mdD0a8CSGgpMoADVwcYUOB4fjLnSkV8kXknQmC+NnTsDwWowYrxi4JGxlo+x6WK8UIAfY+odKzb0LUrVItGAhri00dnR1VHtYPiB9Op0yWhPrzfWRlBkXixCrait0qlLUUOnLuEaEWqwuCpCXZFfq6OF2uIIWpfZEEHrN0T7wvjw8DxqZcdyHa1YXus26QU6xDWz/RF0WfnyCLUmd7lOLQosiFgzc7QiwZur/EWO93YyZQcQDcj2QTsIKzXlkoJhtKaoYJk7+6TajAd/UvROCm+bxjYMqhhgt4hotYgaIiqLKC4il4hURuTN7uUFKhxcMCm8cnRbMLic7yc9Xri84CLzD1iFKOH1hJSTW66ajf6bMxlIgNTQ8HkFJyZqTSXS8uLDP2t2MGuWEDKNKjkLzc4qQaYIIe792VnD0qi2dtPJ/XeN/DDvZHiOceU/2nvi4YVLCvFEJTL680uGt9/4lXd/cM8Km7smbKnm68i3fOvC6uDKqxd1zbxTrvRtffbIt7qqD/4eXZb73NB9J0yOlwIhmeOXjo4f86brXrcusAwnOUav2HHNZzd0dmuacal0TbwjnryK3n3rHV/dcOnYHfs2Xfre33VtNCqp+buWVv1+lid+MQfm3f+J9dlu+tk5vDvaawKBUGS3TBi1rKVgWyOh4RpYzgD3NLCSEh1XcwIyaGng5nEYSCeqtUwRJVi7nV6XINdIFDW4RhEc7zCKO28TM2Cxhcu485bpIkIDuV4RYT10QMaigIoXAy9ZvGSoKoQx1ohtsNZNZdzRAguWwXIZtGFSTwkcqpZGTIRx5cQLncqJvDVyEqvIJ+ZoxxurKqB+jazxL2aq+KJwSXdGJuKBTEQCmYgNctN6SIaa9kSttwclyHCCDCfIcAI/zVlC1XDnL0dgB+68dxz2FYu9PU2pgggVzf5JECbxU1gWR+KRA99Fuddsr8m9I1gfcBmu9HjvRC97sHeq91Qvk+fRYO9I7ygMmb1IF7VczD3JuEx3WzEXyyxvk3MxZXkykYulJxmnWUrWMqWBaqy2EOmZboo8ZSaddrsVOailpAkZHZSRSx6V98m/kFkZiKFRpBKpUrw4WBwpjhbZ8eJEkT5YRFBWcap4qsgWR3oe2WVNU0AKQoFkPbcw1Bmoe1NvzqbZFB68oQgn8kY4HeGCESSIISEK4kPT+kjM9VDFjmjE+PvKbHRSlLEYwQouI8u4VSI7uOVm4Q5LMUZuMjcjMYpjFO0iAkQ3SZSysj6Ijgw1Pawqhk3VGa3a/omBy0bDHqdcMWfm+8xOmYkvrHTcuNxXXzzTd0nSq7niIV/ZiVTu09NX37Fo/ZXmEzPf26BrkVQqk1YuQwu/eFW5unomclUpnkp55N71zCWWGm3pzP14JWD8slFt9PYLGPYUlcIMKkqKxDkIejgSxPaTIEmDCY/GSJizER4jQco9CUIBbbgZlvLzY3C05NBanAh3/u1IEz1fbaHnS0cJdupgQAqsTmxP7MLiQdt2jPcwcTKRzImdAy7At/EeLN2+hJnNyWHl5eGmTcnyp53EKIRpeR4827OY49AJziTIGq5zZMWKZmdgwOqYwZ4efp0JpsT9PA0/SlF6ok3wwOO9bUbgTElKJR0Efxw0oImD4A88mYU/GhAKgm945LiFcqnkHJyxdG187y+fbJy0XE5N1AlOpNBIajQ1kdqfOpvi9NRgijZhlQJG3tlZJW1vn9UWK1abNEhrloKhKkYoz/I2Ry6mYjTKBAf0WGKhPWj3TOBHqVNUm13wqPKEhKQ6CX9YQKIgTFejxtxktzuCjpRm5usa8f5191UnNDSooRFtVJvQ9mtnNU47lDz0DWuSaXzbMB8yGJrOWGI3lgigBujsVLSoGaK2wzLNP0XxYsdxE9+E4PZ4CVJ4mgJ1I3Tm/fMFzcK/lSDRgv9c+7x57e398z4e7BiYWbCgFJaEWCiSdSIv92nY0d/ePm8mMa2vr2OAD/WvQx/4QkEPulKjFH3+mpnFaC+3F8N2Dp2dwz1sWQ9R/Txx+MrnjgDZJ50mEL/aAuJfmx4Lii0MkGHYEZ88P0NOwZ23yCm483/IKXE4RYJT4hSfywBU27MmGEmzOX/45wpVPnMSrKHKSyebwJvPt8A3/wLW2I59JYT4IMrD92j01Bz5Q5iomvnB/ET+Medj0f15Xscb43lGwSOn8kxIzGb0gUwsuzAIj8Sv84Sk9mBYz9kF/yRymg6FouwC/mXXPjLdyXVmf7sFDOaSGlPKBwIhDAUWbBOTKjwpXqfi8QkduXQEs+Oe1RldJ1bXyfN/xXoy2FwPtef/KQGQQZLpm76ePEnLgdCNVecwjCgkD7vRsLDxIH8yfIRA5ZmxISgh3Jx/U803JzO2qo5FYk5X1Ii44hEUc4ZBRkMtrQ0zH6y2hY/4/UqOnxQ7jpkUyglKmISBKC5iTcCA1bQlvA+4LjgmmwW858BYNt/fn8egNP7i/s0bOxKhsPsDCa3kvwBpe8nu9nz/jP7etW+evjSZ7HQIG4wNn6E/9aV8gkAbyCpuimLtmJb2MH+bA235EBFBgmRtpTu5rUoFVuqT3QHw4oc1lk9eJxAFHTNvCSrdmVIcNUUUUkEvwROhpURkkJIfQLHUklVKLVmlBNQZLlCCAnuknElJQe44m5YDISNLfgjUk2ewxJKmahhS1W4isXT3UOmg3W75P5l/OybZHQQZmH97UubJtLj5piAznZ+amrrg6GzKCi9gSgxB8h2VZsQq0LmnXPV4nVZ5BeH/n5O+IE/YJuwPuR50P6Q+GN9XPyzL9WA9tEXZ4t4S36Zsd2+PP0RLb8bOxOlx6e+cLzAvuN6g33Cdcf9JFRvuhtaI9+qN+mLXmHyLSyzT7Ypu6OlyvRf1KoJPWYeuUNbqbFLZgDa4XlP+qnDL3EvjP5R+KP+/MheQ/Eo8Go8voi918Ta3y+MI2aOumDPOr2HWsWu4IWWte62HD7qi0Vh8Dd2KzC53awQDkMLImRp+R3fakf1jGJNkPpix2/FPNyUsYnBNlMCXDNugIBDegDv/RXhDqVTvvSBbEdEKZKqTmKnNOnIxCzPXKS5Eu1WPRwnGQ7FgCYtLmTaZlmIySEuZZHemPFCLdS+kypQNU6mUHvfqiNbjWD6tINqLEA1lteIexGZol6womtxDUYFJ9Ja5UrP/zGaTeSxZBYOabKvYx+30WTs6ZX/VTo/ap8APFwjs05AWitdRHYtXVKpcpkpK6SApu8ENltB4aaJEl0Z665PotsOJRz5sxfWMQXYelnAvU8agihJYJ4d3zKnBCRPE9gfhkUEBxICj9PeTAG9nq56S05ottq41ucqcUNPdsO+EIJC6bGM7wE031kyroHZQVo0cBaONF+tm8SzWMvESNTHgZV0kSPuQrW6Dxl13WY1kNRD68qS7juYEWTeTL2xI0ZkMfm92WbIKMcm8EfIzmSwJsA5m5NlCTLOl2ZAbdC7IqiBB1C7kIVpZV2sGDtSakL2z54L0B0Ro9RvL7WIijT59xYcG3nzz6rZKKjh/ZkE6nJ35Q7C0aqa0OOmzuZx6yNfuRgr36fd2/HKhard7o7Su06V5v5n5148lyk45lUI+T6ALXTdzaqhXQ6mU2xZIXM5cum9J2I1FPkRdguU9F6ZRPiu3tCXtBbCwQ6Q9r51HQtP6SagNItQG2UFJaEZH/JHoR/aWQGcHsY8ER0ye/91REi/BPYvJighz11AeqC7rmY2UgNzDl/Ods8ZRS0I6AfbROTpPxkNkNi9x9kGgBEUJTbuoZRElzApuyhLB7BbZIx1LBLPbA/6L1JYG8fkBNTo+EZgKnA0wAWKKXFyF1uyrz6uiwCHH1u7BADIDg4GRwGhgIrAfHyjYczFheRvKxfhMshU6gW9J4GUKpRz25mWsEKravOqEHQ3a0Yh91D5h328/a+fsh/xzhChL+Wj0XxCbhtEOYp0kUtMRH8UJIpGWhKa0ZJkd54pHLaD5WLC6ZKbRKIWccS2UdSM39+l3B9b3RokoxJgPLWkK+oQ38RXmALWBFefwpsAQ0aOHiPU74Caf3b1uZaXFRSrwseHTVkjwOXz/Sp4cle/oWdw6anHrqMWkSikctXhgyQA5boAA0QABooGVXvi1la3zVra41srWBXDnv8wgHLtShsuszJPT8+T0fA+J6YOBHlKeugdi8UhOeE8ELtxD1Hs4tIcm+0lR1B43uYabXMMNAVTWNfRK07f9Q+saejvxe0+e/61pg0N1urn/PQy/4Av3B8udi5YCIdCXrF1nwjHldWj1uu3rdq1j1q3nl3RoRsEm9Bc4Kw6oDHxyeBgLd9NT8Ndik7NS30XdJhqAReqEkiftC0SfmXUXmP348vjqNoET1q5bL2gdS9wEG9w6cY7reaLe58lYvmeAbA2QrYGV+Dn+eNxyl2/sAQMJDPdYlhLS+QvZ29OzcSVIDjC4soVduPMO2bty5dDGJlK5Z9cKvnOy4EegyDOfbDSA1GPIPuhYsXbjc9Ti869Ti/BSxkvl/OtHQ1pQ07Re6w8T2khVODX0Jz8zjuF8COwIeQeaGEK6qOdi2iT93pG2nlysA3dMW9vKXGzJ8jZ3LhaYZJxHkvlcrDLJOI4kB3Kxxbhjzk+uy6waWBtbt1DM9awy67msSAnGkvUb4MMYBbtsE3iWE5Ys7qhoAXkIS8CKO5Wo6GhUP6jT+iSqma6eXCmf6q30oNGegz10D4z5V20YSK1cGV81uIoeXzWxiqZWKavoVZD84/VXV41sHJqkN2FOuEubRFvJPHEXIqDOgcXhtNX0t4LH4a9B/q8ibLGVg0HN2iJa1oi2lN3lMJLplD0RQU5Xm9OYa40Yg5xg4s4w5fXCos5y0M8tASg9vq1DWyIbXP+kKB/eZuPI9KbgzCAci8RG9Vg2if+LZaLJnMCXwbtQYJb6XBgW5pgsLhKnu9DgVrV4fdf6O33XfXrFsh0Jv0PuvmSm3zMvEZDZcGZ97aaVNO3rWzzTsbJu4xKF1d21NcVgx4qZeY3OEBG6My7kzdNvbXWl27duuW3FinV9d87cul73x1OpgJJ0D6JPjpbM2lJbfmYFMWtgNncFHuswo4WeGd+m7nAqFZ63Dl31pUJTOEeUnaKY/w/Tvy6GnUv/aoT+VYhs3mGVDRNd/iQQkhJsJaOpnEgIWbN6NaEiop+YG5uVKOzvT9OxAo39YPlPw+F+KkpOjpILRcklojlibcwRIT7XEtZzlrhIOm836y5giijDGTkqQqcqRA7pIDplR6cDpoiD4u5tlv3RlFKuVKcQKliRiOWyVcGdxCPWLxbT51AdBciOYhkdLxCbq8p+4hUhfocO0ic30GFd35USCT8WCX0RCa0R/SQgx0+G/CIM+f21KhUlR0bJQJTsjJIHJTE7LSKTAxIER+Ryter/1viI5eS+mtleE2tANSq1wdpIbbQ2UeOKLDJJfxxvHazxB2unavTBGhrBA1M1Jir6czGXZYjM5WKp5W1iLuZcnozmYknLENmRaR+oxDoWRqhkZxd54lQy6XI55YA/JUyI6CBY9EfFfeIvRFYEQ2Q41xVNtcdzg7kRmHFjPDeRO5hjqJySo0nZSQmTidxI1TJG5v/3xkhVCzI8awSZQARxvMaFWshvTYc1TFKtLFtkp+CS6dCkaMeSKi20KQ4mZZBCtS45BaLEXHNk9/9gjCTTWs0ZvCBsdKEVX/vsim2632nruHRmnsfsktmBVR+91eYE1PUu7nDFW5h75ocr1vffOXP7hniQmCFdq9FHd+74xEx02B/FuLlkK1r78NKQpTZTNGYNp5mnMG66qChdnIOdESyMWkG3RKi0dFIFwvztIRbwDXZCx/TAIEsOYwOGaFMMyuLBVtikZWO5EHgjwX44LgQnhwEOQ6yXQKnXrhA5UiFCJEskDuiybMxutwJoCNMDgMRcj2q52hep4z70qP+Y/3n0E+lE9DcSr/5BRkulRf4NvnvQp6Q9rt+EhbjZWWNJ4My+OHrB95MQbcbRMrF1NyqZ0C2P9ZfVGHxZdArWg+wIO8pOsAdZnn0LJulumPZ9WEWbjRmBiHcwbudXHMyuWXFw8PJNT9pjy56Ms8uu2LTxWYjxp1i8xM9PAbNdsPF7VIjppFjKy3S+obwRnrOJ+dDQhdqW3SiqGs40bUTSssGn3S6vTkVRSEd+Cfc0Afc8DkVHYQavfLaATgU5vGrq/K0/EuOO4RNDKlqw0XTfQt/C3yHf4bxDvc1/i3ZLRBweGrYqLEkRxV0P48UHTjWb5VQDLz2lkJBKShADpDymaLuQVNXZnKyNeLvmo0AbOLbUpl+Lpk59/KZbf7HrF3dct/Nna2o3XbrvEx/4+A1LmANf3X3gY++NP3z/dz7+t48ONL5654szv9v/o3OfGqHo83+bWc48jWExQ9XpNXNgMTePZJp0yu3QgMsFvE6eIKUzOQ+h6x6dJJro4D9qSY6Eluuz0eM6k82rrJMPPW1N7WnasCBUMpzdQ7xArIUSRSg7hTD0YqqNZcgzhIhfFE4+pbyAiXX5ohjKp6jO8+8dBUDtlAFmSSCkLM/rw3dH4NpD6K5Ht/gKseX9hxkmYqOOj8ryzgyFgk58Mza4G7gBEluuWNQWzUaOnWqGjuUB6j8uzwNorivLlM3KHjd7bwHNKzTmrShsLtzovrFws3i7+/bC3eLDwhvi3yRHZd7GrqHqtiprzkNlkcnmVA8W8IL3tnmwmJdJUpnE6kyMWkir+SzDlpRuBHdCC3BPQc3Z2RGXJ2R6RB6XD8iM/KZOE4NmWNcHIZR6PIEgBNkKO+YSI30QiE5ULpLUaMWgA4kFq3Vg1mrNOGF2Q2tiXr1cExyiUU3b0xWjJnTqqOzAqy6pW0cdtpL+vmnoiE8YCO9hJPDdJAadF5ylSeEPR7c5bYGgNY1I0NksHGUFpDNGl68VLmJ5aTMtMarLP8f1w1lEGJJZm+IWjULpJXtXf/LKHfeNPrG8O9sZqK+Y0YM9GY9PScY0A1Ul54fWbJ1/+ZXmxko5xdTHXrr9A9vu/uWZh3b5XMWZN67qikEddlvHVubqoYrm3DXzxPZk38bLrn3qn3dcpqkQOzyznKUw7EepPM3Ngf1QmpDetI9MKuHjkRBrWgicoE2ReOFmnVUiCznBhE5kKaguTAKmuKctg4CpCFHeFVOThsbnhlSb4LTgDINYY65JYIpAuAVkU+F2IMnhdoDbcDvAbMgViq1XGFQkyoKuZQaLtFkcL34zu7/IVkKVRKO9N79aMUNmYnX70vxG12BoKDaY2NS+Jb9duTp0dWJ7+53KjtCu2I7Ervw9ob/Pf8X1xdBXYl9MfLn9q/nH/I+EvhX5Tv4p//fxHfw2/1b+3Xy7XrzZuDm71/Mlz5e8U0VhjQe1ic5cTMg07QJhzRWLM8lQDsFjJY2oJgi8Mxym4nEngGmZiqMJRI+gcXQAMUgkVow30x2Kb9BHP+f7he9PPsZHokB8CwqtiF6okzedHx6zptUqE7PBmcY0wK/amqdDS2U9gVQgrVNZD14Z/qSOMl4I7G1ZziGefcdYbx5C2vND4SNRwTIwHNkmOLUkmT1JE9TcpOg/tE2dzfW52OzQnFytGd0LseuB7h6m6bu05nFmbtK6ls90enqjXm3zfcvu+Sfk/VF9JN1XuyuztTG6/xs3z7uSOfDutRs7I4ah2OpYYN+2+i8/fQMZuh5JTZfRd7HM8P0fPDXV1fL708cxLGbRb+dG8rYTKszHA+4MEakzWhw1zRZztfx4SxqPt+ToONA7Ek8TJ0aIOBG840S7JwcihdH8QTCHa1QaA6pzdWZ7ZleGyWQFzc5gcngStPkzWJf/b7I0+B6Vi532SbhcGp+7Xdol0RK+gMbjOyWk2E20dbjH/yKkOA7WD4Bw6JCovni8PTfHRqycIFF9w7OSb9jcjlVVVyfd6TJp0/UJVjDb0ZZ2FAc6SnTje5OZjD6QjmUWUrKt3e3VFcRq4+D5UezIPsQwlIC13y08MnnEl+LtqJ1yp+LxuI7G9QmdpnQFa8NT+imd00dyj8xm11n67NjpHWPN8shjZ4bdzdoB1BxH4BiWSjFhPOQns1hg+JKz9knRc/gmJmupodacPMjX3cqCaGmUgZYX/GLr6Mqbb+9ZWk0lN/hUX7HicVw6fya/uC0oc45kKJ6RkY858POfLyhkuhd5c1fNLFuZwWJmyk90xWv2XxIBURNRW8+fpn+FYaqDvXEOTGW6CEx1mSBD0oh4uRHxciNXOCRm7DCeSbhaRM0F7LyTzF7SIYgZV4JV8xy6nUPbOMQZZYRQuxD8aAxdE0MxQw+hkdBoiA5hxGqcGB7GkloZt7gZhjQEACMsnZ785UnllxY/n4WgzoQrI7Lt/pha4uj2DsG6TFBdwaGbuI9xNGe0CwtjaGvsIzE6Zqg2BHf4FzMEEOVydXWGRCfRzzIqNJlMV2eTb5+w2hMQ+T0Mi3LixHBDOUGyHpt5ZDmpECzQqloybfVC1lbXvEP2TemHlM+nOFmQs3JupGu0a7yLd3VNIt3cjYnwTx0/dZ5InTD+NflS6jeF19jXkq+l3ijY1EZhuPDh4s7CXrSX3suM+8ZD4+HxyJ7i3pIDKrLKjGTnI3LhxbafJMUI4/eqEX80mAsXHpAekB/SP5f8XMqm5h3ZwvLC6q4tXbflbivc63wseaDrdea1iD0ndsSoZ+kYiqMymdQ7f4h6tjSJQqa7XYsFnw3HQvEQUkI6fnOwM/isH3a2qWoq6bCxrgxpuBj6MVUqt3dQFLzU0MeDQQ1Sm7z+MrxY+mcqQioEt/0JYhcZr2kbdaER16hrwsW4JlG3GcyEgqW4iMTCvgwaIYU3GKjCQWeeRjrVifQnV7QQCOqeErVvGuK4zyfQ8FC9jKXfQ+cR7kKQ3elzMMEq8bSfnlMQFcvOMtZAUw6b1+GwtcqjDln1UYfHLqqQirvNuhwlXXJUqfyQVbc8m4vripsX4u5EBPE5MULBdOmUkOUiqMUuQKuEmjjvCm8rb7vfzbLDQ2iMFEHdaAb3oX30Pmaf7UHHhG8iNBGeiDzQ9qXkvqKdFM7ZQXKmNpq2crKcur/wUOqhAjc8BKK9O6sH61I2WEemXKfxErZCykMkAkOul/BQgSxS3a7E1IZThxUUlgjXSROsp6zA/KTV2KHsnadeaFZ8O6Ra13Kp+CdU/BNqvaCrcM5Z0+XCh7nqjOLAv+OAC5w1VQf+HQc+Bi+amyzvT5G9+A9ZObNDYdNB06VQyF/qEIJyOzcpvHZkW7ugxnBnDvdslXttFnpFzUKv8Va0HlA7KPPaTEJMZdJzirzSE4n0R69cvF6Pb/nsT5+9Ze22hC/gSCQiX7160YYPzPyuWHzoY92rutyKamcOzLz4uRuXF3uzudKSa76+84GYHEJLPvXpy+uLrproq2/Y8eWAy2nNU+Y9/2e6n/0BFaazc2Pgo6aKaV+UhEPY7MQkZfd5EOchXQ9hkp5WPJ2nFSPhgXdoFeq0iQWX38tC8DuFeMwlp0+dLJ850eSPL7dyXy/QtWDAimQla9+cfhh80kS4a3WCIF0SF9CoDdlcYeS7wYuWeRH5ORODMP5tWxhxRLXhiHmJIxyW81gGNZ7cKeGtnpb/1eOJRuaYl0gGTGP61PDwlHJSOTHcimLB4BB+inLgGxiw17egLTTdiD7gfiD4nO85/2Tw9aCwL4r2hNBq+2rHFvsWx181jtd8WkZj/D4tGGIQrLzh/YjxVZp3y1RoGvH2Gty0/xe+V4jE90Fv+GeUDbyyBR0z5lI5ejBKRymEWJZLeQc9aNyDoCD+Qc+U55TnVQ/vGYl8a09LsWlOdzV8bhhCdM9Bhvv0acvPinedRpg1U0RWtGZeBY1lDBSWY2GEqRtiieyHeJdI8rxdTeglkafW3Kq+pJvIdj1dIPmVSLz7fIR5M1r+0ktd2cR8dyY5vrC0sf0zPTcXAzn2BzP/snj6u0Pzc9mrr+nacg19fcJ/w9L0BzH80edPM9PM5ymD3jgH/vwZYn8Vm+qETc82fTBNqUyPNTXp01Ykjh4iB4ZU4u9RW4CptnRu3DlHQsrUVEvFdmoGb9OdGh8tOG0CZK8cBRVblKnyy3nIlLBUj7daATnWTJcv5+dKcxsEK62HEWWbbtOcKSOAr2pd0taU5WXLI0l8lHqI+CdDRNALycS+pIpiWicwqvOWHyatgk8VDlFbEWTQIVCqqpn0XE8LXinEVgurKRJWg8GViINYKiU5WzWUAW1IzwAHOphhq7aeeJ++NL5U50KiZzVo2InVMSOTFDNoQIiJC3WbERUn0SLTI1OGgZkePI9Ttsk2W4IkHzqpg1DcbRTtQ79ALCLhlmowlFLVQc+Ehx7Hq4MexpqvwQJQDJ7pH+66WFqEedqmoZ5Ja+pwMkUO3PmsvAiBP+GIyx1xhSKU4g4r0UhrukEyPwaIkilSfff4Nqw4yjZndFK0H8JathX002VJk3PSDFvgigVIoZZoArEbvPLMNa6EP55xzvxH8dY7F63aUYj0LEUDQ438h1bUNzGfn/7VPpJc+MPxS4c+NY4eGOgMI2P6ofHB7pW0cFkPbYAvFcPyGQzLOv3HuTVMJSqk8l4wybvxouOFZv7tSQqCZs689VajjHlT+YINskOTpbAoSW0JfJ7NSwzsXg/vJvqtW+VpMoIphk46OlznZP7CfyuMvvzySYXkspqSukbeqG0OMkEywU+tDfjhB3w1b9AbSkptcsKtqylND+qhPqku96kwsVdfaLm4TFooL9IWBZeFbhC/Ij4g/UPowfC+tsepx8SHpa8Hvx56LPx98ah0TD6mHQ8+HXomPNX2K+1t+W3t3VBxn4TaSJziSJW0+Q6rjeWsdskSq81krDaZtFq3m7SmGYxUXW13UmNojB7l7tT/jrvHvbdN6hOrclWrh1/gpxK/Dgn3yXu03UGmR12q0R7NG/NQYT1GqbI7hrHlXrMghYK6FgxWrNpY4VAoJYm4Jwo8x7IiFg49KhbgKD4UtGmTCDO8LTJS5JS8Tz4m/1Lm5J1SGIBdMfnyfvEp8ecYy3dKwVtCUCJFpyR8vy61KjUTLEjMSGcNmuP2GiVNYeVuEj13TGlD423W28BHQXvM5akmgFQHlXwe5qMFuhKa1l6DMmzaudAZaMe0M7NF2JQzQK93/y/qA1vlRHe0ZBOCIlZd4KOy7nc0MJF7/ThupZQNQjtfxfKSDKHwsqcu6lhgwksz2gVZJlbTIYUolQ/ZdLeXoazJUzG8WfHLIMuQ4krNWmphqKXWrC3arBgMSU8ZNzoQyeR8v3opINraqihf9SYjM8/kZp7yZ+PuTubzRlpPVmZ42tEbdUoum2Gw7tji9/6D4brLiiQSnf/8ae4IxquClefUxKt0IuZ20gUwjzopKa2JbNaI8y4eEKLRKJetKqCtEqAtc2gac+6FJBY3QtQgstaIgUW01lpaYqksufjtBVSgbjGQYbsli7I26+qFQjGRKBWbkhwpOTrcgMBj8mNWoBZ5/+EnVVI6KNKo+TNYcXYbGb20pXSDNFp6w3gj+47xTtYOBxzy1MhxL4bj1USplNvaHQ0G4+GkUmLldDRdSNfT6wKPBh7VHk2LNqMn1ZNZTa1Eq4Rl4pLU4syq7KrcfcK4Mu7+e+O+7H258dKDyufhYOMZ5SnjqexzpReNF7O/MX6TPVWKUxwr8D42IBlCRsryuVpggbLAPchdIazXrsjtse1V7tP2BPck7zPuS4+XArulewO704xDGkIfVT7qZjH2pNMZw5CRgPFHCbhjip5MxHQqV4hRLtkZc8WDsVgco99hCECdPL/TNDUjpYuCKAmpXNaby2XTmbSRqYiSVxQlLBkFfSnZ8MqykUylKlrQq2nBXDoZ1AIyxlQZf4dn0FsY3WLorcNx5HLDlkI5sVyE+aqixOO6TtEwiKgCPgSjs/YMupEyKBE9YrqyJr7ZVCpr099zfVDGeuCTR6aoD+aSkDvmM8PlwSDaH0TPBn8RfAXTx8+mypgQhI/rLgMp+KM3c6aMZ5BCpSkfpgV2Uy5vSSMzPQ5zoqO3jkg7M2XxaUwQRCzKyTqVRePZs1kaEsCO4lOz+wViih7MofEcAp+fnjNzB3NTuVM5ITdSnJXYzkBUQDB0Zvo0VtR2NKkAHgrhAbxbOx3CYhwsZ5ouwZAVMwfiXauQkdU/Y+mGs/XEnc0iYYRwiHNH/tf1iqFasVXAkVT4A2shInOdHk3DJIagTEHangcoShTmMJxtvNCcPRSoG9D4yNaTvgs1TC0agzGOydJOdyzBUQXCy+MuijeyNpL31HWhSKlntvwoKVhs0ZkW5WluoyRjER4HGscM/sTzVS3j70dHlsa84qkfeDN1lNiQm/l57t9n/mrM/Dba248JEBuLxAvTf0bf2d0fcEKd0YCS9Pqm/4Le7dY9MdowHDe89ya9bPo4Qy/rclh1+cIUxfwB06Re1pwjt9rTslZNs0UKX7AMFq6iR6F7IVyWKsbcFmkql63qxNNNamFVKN6tLpLRXsde51737vTu6ku2lwK/zfy2S3KV0rJhS9nH5Ftsr3UKkb6Sa1M3W2pwDaXh7k03svVqpW+ZbbWy2r04tiy9MruiavatD643BvtuEXbZdim73Lv8uwJfEPYp+9yPas+kY07OpbjcrkJcibvjhZycC5T7ZKVvnbSpe7CvFdeawvd9ey/qhQe5tYzKpXRVk1mqBM8QK0Wj9VKpr94igeVys+oy0MApaw3P9HdpjM0Bvz9TrdZkm93epcG0wcF0tVbtqhnqXn/Zjdw1LBr77dGdwcEYipWN7cldSTq5N4mSQaNUqncV/5LLZboG8RvfWUM1jhOMoCCkaoa3VjPs/kym0mX3dnXZ8ffXJHugK2MEbb3ltCYz9qpQiwBZLUjSpetcERSJ429SLsEHwWKC2w28v1TUYS9bRMViLBaV7VjsPbrdj/wlYxI5D+tBFIRL2JWaGTwYfDV4NsjCAHD+4DN0N9VFCei6Q7VSBlOUw1QX6nqG/gFVp/roVYcTJ/dYpcXPQUT0cH7HGayNWdg7nG+xdqjJoRAheDgPYhtRzNT/S5VjpKn1nWXtLeX0MLz10+TVwwzGw3hEIZvKnW/hniAq/c7+3U6lf+eJE9CcEE8IuBHxqDVzMSmR1AqMtWG8lCH+9Z3jUj0A1hXcfx3mk/SBki1F3A2HGVZIadbDeEMj1Y4DzgYHHmcBypJ3Q68PBB/c5rIuuNrZY666obtAvIDaxQIQA5c1IbID73CQEbDKpHVY3HjMDefBDJQgkhxSrcZtCShhR13BL8CNl4Cp1hXFVXfjpWD6YNpKoCx+q1GBnfrA5nPW9Pjq3aKvnq146zm8uEU/RPbii/nrOdONF1+9Exb8ywH4dbyoc0J+//vf+y1B6KIdQMrsspausiVawdpPr1V72Y0FhniEKZVJaHCsJP/32suYrLXMQCRCuClAuZBnNiK4Vi0jUhzFqsfc3eMBQSuMDuQSSZt/YMXStjTq7kh1rNt5eu3S+sxgMegx7/3cwmJx5lepcHrT1HeXX34JJnSRgNaptF1//TUhXxSTOa1t7NGZyds7mFTK6wwEhk+c2OzWMnQqxXmjH6XOv7etx6J19pnFzDlM6zrpdXNoHZal8+0MdVsGZaJYvyH2ccjmOeYmXSjMe4wmXRq6naTbOdlSffJn8m/hf43yyeEWEWzSnpiUp6JeN31HJ+rE0ifFJ++A33B5vV0UVe2aFbxeHj6BtV1CbSz3x0FlxdqNz1Lh8+9QwfNnqRBmNrLSDCX8lgS5uc78F3K0p1ryb+2+i7uHpyWJU8WgGJLy3lBaSqmpUDrfi7rVWniJer10vXxD8NrQNeHrC7eJt8u3Bz8a+kj4tsIeeU/wy9SXpS+Fvph/hjpV/Xc+ieWifL7Q3i4jolcEQRkpdDaVkbSoB0OhSrvsxQcU8nmihuTb8SntIYmVxQJug1jaEZNNhYQUbHbiu82Uk/Woqxr4/zl7EwCpqitv/C7vvapX+75X176v3bV0V3fR/Xqhm2ZtZBGUBlSUrYUGEVFRiHFBo4IaJziaQKImUUAFGijFjCYxTswXo5lknGRmMiQzaJaZnpiEcYzaxXfvfVUNGOf7vv+/4VW9elX3Leeee+45557zO3aXk2os7r0qeEb1Pl3qHlf9XoVVt9GC86tELN6mpEk93tQ7epqcc8CP/HtXpWEu3ZNGaWeh+AwNP2RQqlvnnR3dcnbq3CjFB5lqhBzOmzqbkuXRdJUt5UXaA0V6Nk5DPf+fFAS4hYoWeSSkRC/pu7am3TBB7AZvrKb0Hxvzyhk5ctnyyv9oQuggtSEaC4tNH2gPbBQr0MBD1kwmcOZNo0IZTMFkJO4QnfUvlJ9f2DW3PR+oxFUtQ+He+il9wGmwFwjrx7yxmfU2+FEibhLVWmJkOAK6nk823bVnIJ0s2PTdyw+g475sSGPQyDyfIPP7GOF5K3yHYSvkTErOwR3gDmgP6J7hapzigB1q7TdqW8sjYJl+xIrdnF1n1q/kLtOf4d7WKxq8HIfYbsN6pOM1c3h4Kw9H+NU84vMaYUAPt+nhKv1mPdLnkQr0TBHRzF5knMkGeL8IPjAYeq0t1BkYltp4fkLVouZ0en0YcxaMOaxGnB5qdHYtvQo3wkM+r9UIhlV6qM9DpNKfRt1ABzjULaUxzB4gj5Yd0cK8VtKOa7HWlbP32BfYsV2TVZcAgshps39VnrooHus5igNN62eeGz1rIP/I/EURNehL8x4bufvEPr3nttcc0DBJFPT/aryxCQdsTRFDlM02uvNvSyKZW3CevLCgJi3Z0Uv0U9hG8y/++aStwsUtdPdnJy0VbtxEd/edNFU4h5Xu/uaklezq2e6n4fABg5hWqzVWK9LwzImpEZC+pvjdsTGk+jTemgwuTS3VUHvAygCny+14hfqTn6HV9Z9eVTW7ubiAwdRfw/nr59gNauis/zqMk85Q2+x65JOfhtL+tQBCN5GNw/yDxEB4hPHJ3B14PI6uxItNG/Ea0xrzNpPQol63WQVVKrXKus5iBOuIXD+iVu3kOsJhh6IjENB1uLuNHY7jVnI6i8VvlesHjVt560swQkyKjUdvYWaCrDKcIwpFlan6U+eqMnyiXIuWOnMJod3HoZlcRUZvhlaW5M+0Y5pmQodSO1Oi6YKDgtVgJPt4+Bs/zt68cePN2R9/48brM198ZN+XMtfX14fsv7p31iulWbfpErqdw6W/Gd7zr7aQZ9fcrm8PXPs3xdJ3rh34dtfcXfJ4+Wp9EJxjONVrGB00gN9g3FjeB/chhGrwnyQRA55IMvJbhoSMkFxnGVNQ6pehDwTAhmnEZ+YglDMGiXiaZA9GYanNF2CpjSHjuUX8gx/WFLPY9Y/WB9EZ1g8PsevPvskEI8qEiBbjK03XomvxdnQj/tCraFGt86vh22qoVltIVxhJl5DuIJ2z0/gXHWIhN2SxWGswcjz2d7+gffDpLpikqDNyJ9A+2CJ3whbaCxYzbPaCudQktP0C7S/0R7OLjl7cCdlHH9m3P3s9vzFk+9V9s/5G7oTbZpVembXnX+0h7+3zur7df90lnQCBBT7I9aCvAzt4lNHAq8K83oWt+gSO6TtxSb/dLIoGzspBjbZoJd1wktspQlAUaY8EDWD/PngQojyUIALQAP0Qw5l5ogJr9mtnOpb9CyXAJBUHo0SRzU2eY4SoUucUfWj3CS0HyMlriv8+PsYZxJrik6NjBooSnWNBEJQbC436Z6yaoRztxBGpzpky3P3XZjf84q97B1db0sKeFensOrho5pzr0JN3POK7Qlp61T17dS0PrT5/nhj/gH9BOGyKaj4EwKjQXg3vhTeA0gmMEEbRF9FhIrlTUJa+J0AuoTdIKbekH0/sS7yVwPsSMGFom0UzU5eXSmD6fE9Pn+95eDe0AodkwAgkQqQ1OW2bAcyKUacYaULbzK7fwuv5jaTNR6zNC3AhoX+r5IJSBI5EVkfQeGR3BIFIPoIORl6IoIildv5fT85KQcqS9EQsO41dPwkAN6Hgybk+Yee6ipD9S8At6WCuvacdtcOPaLNy88FSpBW9h/Pvnv8d/6zwsimq5Vm7Q/A+OA4CkhlKidUJlEusSqCEZYQ2rkw33iJfk9VGpzTUCg0a3kNo6JF0GP0+AiPWK2alyFMHL7qm/Nys/iBrp2m0e4m0y51AECJU+jTtB9pMIqW9qqdjQQfqiKyhZKdUZ+di+N38JnIuBzmXoL3qRgC8kgHlent6F/Ti3hYbuQnY8yI6cslzf6qdQmsHD5IvIpIdST3jPbt7MJDfeuQT9F44wZbShfbrp6/7LLluXnIgw8DIAAID4wMvDLw98MsB3jDgH0ADkdrUTyfoeQamz7NldGtp+jyV6fNcvQ2AuOTEaHxo99C+IfzC0KtDbw/hoZbFjJgDF9/HhfZzp9sfIvdhlUQ0J9JCr7dg+veXPPfD079//kYEWiiXGrpHulF3C/j0ZRp9Nli/hWLQknYu1u6F64lMOwaDuHb+14wjgzJH0ntiOImMth6ZF8Ed5OJOSYN6AjBgbKM35ru4Rz6jjR1QfPYgaTPiW+0b9x30cT4jDWSijQMXNZ5uu3667bPgr0nb+FGGciCHV4+H3w+jsLFW/w07gf/CCVLy88nn6Jg+x9XgMXKU8fJqYjWoZV4OX+i+Bl1kfAt638/I/PctetdquMAFd7n2upDLRtMYKYGcl7DQZ7W1/wMA9uMQOkibn0zMikHomm5Df09j1iT2nPLvn/0xAH5JBSXviPd9L/YSXaaDXcp7KX0QadfFnk1ud/Ub50k7E4L7/Af9v/Rjvy1OWiF0cTPajuW0MN6KyLIBHCJ0ZbKhd6R3Xy8e6YW96O/oFWdexNesP1nMPXu2aIMHvgLoyNSjBQG4i7ABMHyKDbZ8Zjs7OAUoVchPaSEQQpWLu1/mabnN+uk2z4KT5IswUQ5y4c1hNB5+hfQ9qNX/yPo+/Bf9ILfvmG5/NXiGHA1KZjIKY7tj6AxhALDkUwxAhm9puu3c6baHwLPs2jqkJxNWT0pKHUjxKVCDs9nFc5cIIto3dN2aPW+6Qae7SXufZIILiOjdnNiV4BJeGyVx/C9k2Kfb2gFhPuA+AQ+QG26RBwuEif+h3frpds+C58gX6aMwzWJcWCpO2pCW0rvTXNpbOy+w86T/YszI5+mYPo9Mt+Qx8pgMBNNoFJa8moO7czDX0sU47KJzjNJZEIJr61fix/lbQQ84zXQN7XgvXBfaEdoTwvyMGb1mvBjwcAp04j6QIJuSbA6yaeAAMJEtR7YSHJCMbTAI24TOtcq1ibWOtTPeansJ5kEYDhzj39LT3Rb6I7AWrvVLhPlOS72PBp54imiJznOjrsl3J+W/dyffBT2OnpzTwD6Rv8mzwFCl0Q1EFZPUJQ2x30wBqA8w/ZFW6nW9yZaGQwhHY92wvYla30CotzMrk32U8bQU1DgoXwzN3ALtAkKaCOex5gtpobd/fT7T0ZV2WtUrq7OgoLCX+7LJfqVqiBuacY3BZs93daXbN+WTCT7Tlo/Wr4QTUPW3x9NXr1J40uVEsiLghItLWH3tu/s6Z81pb2mJHRkUHDFO6EjGO3IWFV55XeJU/Us0L+ZqjNEb/AagJprec4z6Bux8zrGmvNt50PmCE7crTS/jGBDgd4AGx44BbKUfMfmoJ4qeZbd4UHxBxH4xLxKtXHzOQQlKlyEmp6gqOyWneSShXavWe4EdWr3QqCB7Zp7s6VQaL7Qh8mJQmrzAwpGXaWfY5+AWGhthqinOTYwR3UJTU/zp2BigFUmIDpj6FPqGvRkhTHRf+Ojnjk/s3jVxfPfoHXeMrvj8HfwG+nFi1+6JxfTz51eM3sFygj5XvwvfyWdBGpTh3ezZbwPpnCXtvav8oo03lKHd1h4eCq9Tr0+uy+5Q35zcA+8O35vck33MesLydscvOz7yGFV+VQB5laI5k/VYLErBFgpbrYo0yGTT4ZDfZhYFlUsriFwmHQZcPBvyY6/NnLcqFHkl+bnSolAWtRarq6TglMQ4mDiZjxgVZoWyBo1SKN7KqV05WuzEleuQiN5TbM0RWxtpne0Wi0vb3vFs4CWognuopcMQDxw0JmLeJLWzt8wjBvbUNAx5/Jr4DXH8SJzBkE/29ExNNt0CrByXXIJJjs1kwTzNWkz3GHSvVatVhSFV1VV5srXmHTRhrLWgM7RF9NFWQ9EPCrq8H4Im9iVFcyYDxWgxKrlQJozjeZsoYM6YZ0a0UcHFGWh5s+IDg+wjl3rN8DrtUzZ4YjhkjsrYcmQMmQvYZm8GtdFychTroI0MNN7cxDTHd+a2XfH5hQsfHHx8Ybjw5R2PWRL3z3ro2kg+n233mZSc9mxH1JOYMd5ZrmvOePzXVS8LwdGX1y0M1W+Bh+bO33R/fc96Du6qb8okyzNi2ait6gtO3RvVqgozx8fRWs3sNd+cczvjmRnnf4N/zK8D/WAB/DXjmbI+r6/k8rnKggoflrxDDyi1usiAPy5YQrAPd2t1rZZ5AyrBP6TVRb3tHcWuweKBbH/sNF5BThiFyyayvDc0VMOdUlF11Dhv0G43qts7fK2wdSfw6fbpkM61EHeEiv5yvNzdkdwZWzt7ELj2uQ66sMs5srAGbz0eWLyyUd5o6r+IHXXuHGGB90YpNgZbJZg0TH0w2TNFQ7kmJ41yl9Oer1zwujQYgZbeIt27ZtaCjhmpfCBo8nBiOqqMBvjQNjjLM9sLqpluL+jMdXhhpWOugxyYbxvwEjt0wYBoErxAIZgtQc6/DfBCwD/sHvLCGaku8ts8eZnjnOcFC6zkRWFWeUHDBc4wEeEFeES5NHYq1UBFBMOLbz45c7DFN9M3VEPHjvODLQPkfQLOHPD55WaAhfAQ0WwZMA4JfpUXxqLEYjw11heL2bPeIVZ8xOu1Z7tqin+dGMvyRlVNGSKsqLXPqynePTZm1366+Egh1dYcG6wuEbOybRcBB0djF7yJNLm5VIyFSoWoDNN6CeY+88bbA/CiLAb0k3odukOveYpti9Y5wtanrx3Y9MX4aKmtf8UsY9KFoPU739FefeSa23e1eqNOtbLF17FgrUaBIapfbktaM20xV6AHPZK1rTy4rkfQzFskfvXrrZtHRmZW+5dznCuqXfaHVY+23fKDjXsG/G1R000ez84nhrfOCUy9pNO1xsLJbsLHT9TH8RrCx7PA5fApxsevBpd/17imnIKRsH95W7hjVn75LcPbF943fHD5C8vVd0fvXohUHJ+4Mbonwol+/XynL+Eb8s2WhvuHB5QxZTyd68315wZy82ctuXz+DnALvCmyg7S/F9wL9wx/3fds3zf7T896jzs747f99vbLh+YvW4JPLXg9+nMPFhbcvfBk9PUF70j8wshgfBiIeGEEDHMpwevzdSyBliVLYG9/f8f8qGX+/Gj//N4oFx+E3iU+LojpGz2iFFpPYzVIAS1WSz77Or2QE3qEVcJB4QXhl0SodK1LtXdkLR1ih6EcfxmbQDd6HSzCpuObaUgNXHZiMNtRLGP6jYt8MwebJKNh0D+YHzw4+MIgP/jdZRtkzxmZ0+gqHHunpbRAbjI3Okl2mg7v5prbtNO7gTdzUflDVjGUrYGPUmfUKe3wwlZOSBH+/PnEWMok2MnOsTFWfYswpVEGfWkAczYrjVDhyGqLyAwmS0jZCzfNmMxRdBEEJ1ND2psN5Lq88Ob+ylM7Nu11mYPBtJLvLAxf685seGN2ccMNg6Wndoztzfl8aYMz1tF/vS9/+8sDhbGHvhQpPjRYfGzZvZfhObNv6bnx6buXxlqsWZ8+arckytcNS8nBeQ/dcNkVV56cOW+895an7l0WKeTi7l6j19yybkZ365xV929ceOWK45ErPz/YtXBTKT+6q/eBjT3M7zQOn0XX4YNEH+mRa4gJ8KWTgNhFtMQeXHRcdGq09F3W3GjduemVh9a8+5gggWaZr4vVA7hx3SOPrFv3yMP4IH2jG4Dn/1gfxE/yc4EJ7KDXOg4UUFFDP5PUBhP3mAHxSDjCU7cpByOSnehJwt+jKDgDIbxJb4TGzRb1JrOlBjuOB4ZYDbyzhDvmnRutTlJv3n9+QDij2kNF7ii5sRNI0AMDRwTQsTEDaiA+y5Hb7F8WsSpHhYAVt8w6PfzKt9akOr/9BPw9b/1zq/DWn1s5s3LJ0U2bBldf01hHC53/E/4b/kHQCTvZ6O3MOxdkRpyrnXuKj9uedSruUu7RI8m5owPlXXk3uaLB4XfkHdwcJZ9oAbODxoLfF/HGjfmctwa/LvlBPpLLgXJEBYAqHrGrwll/Ky2DUsrnu6qFVi1dNDKlWy2uaqUzLPDOruq/B74+h3UBLaA33/DBvCmmVOTOjU6dZcGj1I3JQkgqzexOOQyzXOyIpKxOhSYZaRcrHqBUlNQFD4w5Ih4QjSRsaQ/sUJY9sKghL1Fn3ANS1rinoRk2Zwg5i2CUjiP3MfIUNcXvTo7l83YV9QnTJSKVqsxSelXAHq8p/o1IeVVTyrOgVzqmCqVuVDIW25vDig0fdNHwUTTGTwNtqa054oyhasE6Onroa39Tjl91z30nH7t8fSocS3GCXu+qxgqPfHHD9esvX3hdmPdXVqF3/7xu7akHN8wuJ+Ovf/W5+ser+5KZVNhgdKhNOl1p8OG3z6kqtz18947dr3z8J9K3HLEnf8W/zW8EeuADfWAuuon18PGipK60kq1AtjjZMmSjyTM5ydTYLBVHFnLzh31rylxQFddmQRGUeF/Wl0P6uD6LyBRtE1xiS66UK99q3m5V8qF4CG12bvahVb7VxtV2PGIcsa9y4ltju3IonVsRW5HDW5WxXDZ7NB6zxOOxeDaHY5l4Otaf6zvsbz9cLh4u9R/OvZ+H+XyglD6cmf0lv4FmyfplFG7cK2mILpwt+0rwhRIs0QNdSsMgwI5BpVgCRaI/FnHxwdY+f6rdV4blseruNEyP7c7AzJhvCOqH4NBRQxjuDh8IPx/G4RrySxYu398/d66BaEhHZ+Sqe6v7qrhKvjip8Qy+Soss4BDRBQZHNFAzPG/NNQ2pPcqC16e2Ntzuo1snR7eeHT07So9S9zMNbJ/soT/aWm38oipzb26UxUbJHxp1S++RYypkbXjxwDCMzozImewtURvLZXdFBqJDBTgcHOqCRr1lKfBBz1JoF8meU0H2BiP9BRCNzQrN7qI57tugF5MXq9qxDbh58gIa2lHq0xEEjO8ZINkoHN26JQW2wgsBBe6T2XJZCfxza4pfHxvzz64p/unkmN+vBP1E/f75ibH+fiWQa7ABrHSQnWNjSvHSGgkyligTTm2ciYwHLhQM00IJYXuQQ1aLiSu0hU2lIgrzASZiFQx+zBqCIeOlCC5E5TG3saUJoqZj1XG4+JWX68/VavXnX34FLj72ZP0Hzx2CxW9+E5YOPVf/wdRP4R0P7V9704+jLeZgrf6Pc4VMf/2hfFxUYEUkM7n9+s4ty6JZfuOp+qEXa/XnTp+Gl9VehEtOzfhm/Y1nvln/4eHD5FzPwPZv/vTzo3Nv8NXfKVk0OAAfrf+vQEsgYLcZ5iH1bK3dWf98dlFp4SYDlaP4krHWC7ezkRbZbtpu35Xb1XZLiR9qWx5fkl7esT5+XWZ9x43W8fx461059QJlvob7JU3rqtbNrbtacWul0F3DSyWLPxgIFHr9xcg6UDFU/JV8havU8GLJQHk+O6gv+Aq5Qk+BK7CDdBDk97eW/eXgfkBx7GFGcnOpo/qyr5wr95S58nuEqQ9yL3Cvcu9zHGNtLWXt1Rqk2d23+IqLmZttZ2lYHw0PYi/nqqQrqyymZzR3lknfTuj7NKMS9txG2XMbZc9tlD23fSZLXhKowlhRXiTsrRSyjN8qkZrinyXtWCEfrFSC+QIHGI9NUDgFA2M2cEGnyZE/Cgzz/8BodrOc39Qs7dduJ/M6aOQIM6X8/8pdpy2x8Jc3XbY70RI/+eh3b4x84dz363+Gjn/Mzpjv1Bhs6v8Hvnq1/pubbhyopB5c8NM3vmb+XxC/+CrUa1xKo4fo0y0oojhBdAk76IPnGBcN3p+Do9mrHTc4bnDemLkle7fjzsx92cey38h8M6vpzwxnlztxJTvgmOnCbY6yqz2NeYcv6osZSoZy2BF1pbJK/2t97hoUJ4IzXuvrozuhwGt9EbaTeq0vyr7Kv9ZXZkeqr/W1kx2pJ2h8rU/7QFD5Wp/mgZDFmc34Hc68y5922svpnBmF90di+yPRaJmI5dL+crljf3u7RisoFCaT+TGAUQ13H4M2O3mTMsDR59nvdvfu7+uDLghQZv+GLMwecTqrJqNCOaOaTvkHiGaWSuop86LhkzPyj4EqJNI4KZmUeD+y7beXASrDe5RJcI/xNNISw3kA/uPxwLJbaETb2alzZw3nqGwlXFwlbMyUuWYUKmXeeVPMhmVBqfI6aZ39l9OSmlU19VpaVbMq/6bRWJbXF4UWTLOtHNtOlQe3pImmc86MVmj3uPt6aZiVfqwPYLsdqHWxcAffXmTaRLsCmBmHA1l3y6XsbUYiJA2vpRjIJAs8sRMmTUGjHFjF6nbQpcmICANWHbI2jxOFA4ZYGgmr8DGNtVcqoJ/Zgqol18yJ99Xv6w3NXTWiD3LXQSMUob0jYooO17d2Jcz1N/31HxojsXD9Rx0xkzHewc99Y9bMqW8tzuBwWEhdhgZ65r8x9RqqRqAlPVhPL0ly4TC0JXvhf0xtQvfWWwYStnDYkpwJ/25u3BphuuR/cFZUYnV2ZzPO1QME5Rq7iC2z1+DUCXwncjYq7L7b0LzPNVTv3LzJURaz4z6GJdRUv0Ui/FGp/vPgelpnFy4nlKtwq9FWvsJ8jSvZldLYuTi2pqyRdpmgCUi7BCg4qaYvvS3+UkTiXXpplXWzFVkXO6ioY96tqQ9Gm9cdnUdNLwZlOgE0GsFErl0oGAufUv4DF+0jIdPTk8lIUv2H2R4pnZF6+IqUaRxrvDOaOOt/5ObwQ8AM57E77RCtM71ryh2mIcU3NBgCXos4wGuwwixosNIgarBar9JgnV6lRUaDqEUms6BFWKOh6+EaLbJotUgeY/SAHbD0Oz3v43M85jFCBqNRqWSL52qVSq3W6zRafATV0JAUA/AIdwPPC4ojJmA2G4xHlIIoSqqDKgRUBpVfhQHdV9VQRbKrj+hu0GuO0JCcg1qs3WnQz7TIq+1V57lRB5kipihgqhzj3Xw9RyPEHdReyVXlSFIZSzU32owspW+Nst76xp9c3vuY2qCvKf58YkxpYEPkY0k1xgEDLTKmpaxAQVhzOSP1p8gJVOaAuYAD1gDbQuZAKWAOONEVfzfyI3hn/fJ9qDL15E9Gfly/DX7joanv4zZknfr3lfUHR6cmkZlWTKQ+uPO/AUA4S2RtH5gJX2O9s7a1rS0/0B8OD/T3RxQBrbZd6VYEfW5PIJjOZ9xpIYBQO+8WUpGkOxUmMrwtnw9F+i2RSL9b74rkU4NtwUo8nIzkXZY22N/RFwqHZg68jWBIq9N5+kKVKugydKGuGvqJlOrsONxZQU7Xb9xuTzpledp7OOVROg8PEcZ1daa6DuurviqqDguuw87TMAgEoEBpSQT6YH8wODiUqqH/OJ52Dg69hNaSKR8dHZVHE9M0q1NEF/2ASsOpsw2Uayr9JuW++oRCcxjqpFcmm79loB2myqWCjsVQNTwQzOfQiLeTA6lkuNtGVNU9tPh3VVGlYb00zNo0c2alWq3wfEWprDidngrU1RSTJ8cg9FQGwmSX9O/AgKeSVoJKP6uEWulgErKCPKT7JyfGMkmPlyX3eJRMVLaR2Z5B1zbVy0bM5fR/ZgXTiKkCzWKORUMBWTiyGCrCKwwpsGQMTMesdqN2KDs0CPOEmFsjRKYfDkN4w0plOKxJ5O2j9fO6dOXk9dvbh3PRsU+EwqKYo75t5+CM1fWl6Z7ZFfjEPHdwnLtcH9RG3AXvxqn/qj8Or+XR1G+Wbq4n1sy0qus9V4Yc4eLA5vqhSKv/Ztjy2zsTnpwiEoHhlRsw3tvmNzmFSP2dteWYSTW1mOqSw+d/zN/M7wA2EAR5yOqASZuW22E+lw2F7EjXrcTaUFinQ8BgD+qhwRQO2rWA92MhQ/YMWgwUzjjU60M6ZCG/0un9JkgElj6uQlaInXErjsdVok7MVH1EULqkNtjmrxpMUG9aZUImZyu1dVgdK7oEsOWDrZR3GMCScToIkHn7dU13v+ySoj6rikJXZX5+nYxURM2abCLt8pktCrHF5/V5fG4fJyijqXQyjQSXxZ8BCTGTgT6zMwPTinimAVyUTNGi058TCD/JiB1kjrXYiWLHxZ0Aaw2cijyKTrQ6WaE2K1bFGd6WSryQ1S670ChbtNupRW6QK+sqYu1RowEE2uwyjgdL3xChvBiAKD9wt36+8651K8+9/Ku1/7b4c113vgH3QMu/rdr2k9HynK4Fs4fRO1OLyt3Lr19/942LTTruna+lv7HlN1+uP/PTJ+cMHMg99RbshVH40CcnbC19y+oHfn0UC58cuyza0XPn+xO3rp8n2wslsJG/Hb9AAVxAAcia3jaBCGfRJFrsWqflHm5P7EuFZ5Bql26XflfbHuUpK3+L/6bs9jZ8E7rJsb0F/5X1G9Zv2PGd1sd0+434urZ7jafs+LqWjf61WbzcvxatdeASmomW6XHMqQWcYI5FyTtvsHUmDZ35fDCZDHo6xRrcLhmDnVjhGxRcpcyg2VlszJG09z+YJy+/yUOMqkIN72TD9cj+yIx9NE/08t8fG7Mla4oPT43lbXkbFj1Ejh8fE3GQfHV0DMtxV0YqyFNs3e0iH/clfnDzhYLHNBTygse7vYweGPja/V/9l5/ddc2Sjquk/WP7/rZ269I7D815+Mpbn35ubObapOPN1ttXbNj7wPJVwzn0+BM3/+bFU5PD+ad3Xv+jJ5/+wfL6M09sPProI68Ozsss3rTu0dvuOrCkQ/aDKcEDXA/3XWK/yX0RzoEczHE53q/yq/06v17pV/iVtPbjQcVBpaAj0zCCp3GMNAB44TGsVNTwQkkU1FglioLAs+ma4zR4tfqgGqlPsynZvJpW7hBO86t1B8m4PK2kxajJcTfiOaLTHEQInYYQSJ0lIJVLtBTU/zLUID66kplntCz72dGGBltlHoeps6MgV23OrAZWcO5cI9W+EXp5TMNzNcUfT42JPK/QAlhT/IGonwo6p6aY7smm0/ZSwEjmUGPBSOZTsinhH+s6+McReK6ugf/1wEL4tcvgH+r6y+orF8o4iI7zo9xc7h/IrKSCfkqxiR3wJoRkPfoU5FQip1ETmsROqbAk6ooYAHLB3CRjHvcEL/CcwLQUAC2E/jzHCxyN/sPIgjGCNdx3Cu0nxBcVYq+OkFmJfkx9WnCAFh9FPwc82fxAgANSFIjKIofJBQR4UHifVkYZF3YLeDV52SdgIPgFScDCS2gR4OEfJCeCRZVKrzAo8gq8WbFLsVeBFSvUsnJD61ieqxI7mIHBEyKeq4LcpMs5NeUiOs8HlO4uuqB/TzNxjWvsLKfr+kR7BFilIHoMEUSYUVielyKwBK0iIqTlZn/8Ftf6yWx88uMfccWPf/gB/P4i+Pp19Zvq2+orRz9FVyb5J26COz6broDSlYiS/w90RS/hPgBx33HeL6p69ZSuRKv4MTmJwCgLpilLKC3lycMUsUDIvgpDPfbhHowP4Ocx2ox34b0YbyYvBzDW4xxegFdhDjdpnESkSxBRTQ/CV+EvIR6Hu+E+iAGU4GqI/TAPRyCGKzQNojNi06DVT9juFtlvdgnlCU//HwlPur9JeHAR4c3QCksipEqik2v9+C188pPZkNKd+4d6x6J653XwXnj/x8OjsgxApPvOE31Qgm8yGVAN+gKhYDJQKvrKwVKomCyU1pbu9t2d1Cz1LU0uLeFB32BysIRL6WJfqdzV3lcO+YJE5UtG+sLWGvzGRJ/2J0GO7EimPs1PQi0+XzCZsiSTqa50iqhvb0ilapeFluvo8iV7remuKu7jfMl0FxeSXFr3jGo1lWpp8UY93T09brfe4/PkPD0ezkM9PkN2CIDT6Yjasc2G7HZtuVQKh5BGq5zR3U3ojiA6hb0ej8PxvB3aT7mcNps1KJGhw+33+1KrUmhvCubJPPsSPA16iYQ5Q3O/aVqni6Z/uRxTrGxlM7xbfpfLVzJr+iL1vvnttAxi6sH0GlaFJW5M541RNZHoqf9D2oZsULuP9Xg9sopYTXm92hB22OlH9RhwOLSRYjsOBWn2zlgpxKm0OqYkajXN6pf2tul1V2LEyWALpPvltapGMUwaNzMDEnlXipEXTLTF0nQap6wRBukRqh1Q1lGgJfDZ+lK16IzkE1NT/sGgQ+Tqy+A39fW18Oa/jwx1wJdmtZre+XurVdcmmuAVVXcq9Q78fH1UAZ8ZHhv32Qy2RMJljpqvHRveFx6G71/eAaNRPmw1pKb+DD9sc1otWg5Ho/bQVXX3sIHy4t31QW6Q5nJChbx+1UkLQJRoTptk0ZfGO1/oRIZO6BXDWOVUQcFAswSd1gU2aKPrMAanIu33O9UZfTiMOryilWYG2x7WiCqa/BtUqzWSntYiKDNQNw3MaXo0qzTYoFmgeV7zlobT1GBcsvg7V3eOd+7u5DrzI8lkB5nxOiBtr6fVn/1gN9gHePCFyjG5mD3zvbD+J4rC6Dm5gADDFJ80NDAB5SCCLdUmiDhL/qPe5oxeRQS1oqbUTIz51U5jTckdG3M2IYoKLGK90ISZNE7vNcBeGuoDeWPrLE0rXa5uEXvtKZN2MLF9+9NKRdDsMrnUSXFs4fxki/Lyv5pXinlCMKjtiEbavBakgfiLU//+UCnedjd6fmrrGp/DbfMN3by5M7X8umVWQ96nX3BwRirf3VnI3jTiWDuXH2RzoXT+V/jf+AdBAOSALDkyQUkpFgUdb75Mh68LbYjf6L8lvifGr/XDmdmZORRxd2EUcUZcKH3EEqwRWSuCnZH9XlH5EF8jAtShAcr94k57cC2Yifb7DXmDZMCGma2JGvyqpPbb83bJju3O/OIX4b82is7OY9beB++yfOypc9Xc5LnJ3GRTTYOjIOU+DizeSE3xr6fGvKJX1FjSNcXZiTGLWsPXlPZjYxrQ8KkyDY0BKcCmFsYi46kOjVEgyMIT2mVUZjvTzlBDPcNf1Xzryxvub8/OO3b7FYfW//WR+n8/cWr0wcu33HjZXSm3Ovb46BXP7d605NbdT6I3twxPfG9kwVf2Xv2PL9W/Un+v/r2Jx2/81RPZak/Gs2/z1p31Nx7feusdX6djIVUf5O/n7wdW8DSjbldVc71mB75bx6VwSnslvlJ7P6JgSkGafqTVYU6r02p0IYQtCGH8tF+rxVq15mmBh3pdDf7pJOiBEOq4l9DDQIsePoEW2X45StmXhprRmvQ9ZGNxUK7JCynqyob0aqhVR4lBS4M/oJ7XMJWKBxeQfgNkzqE2JaFNQIQBikfZbufnfnQGfXnqGq7ujhtu3TTlQW1TX8Btg4sqc5zx+mAE34VvitSfv2/7lPqTo27TVesYzkS2PiisI88eAc+zZ1e5Yu95N5V1Z/vMNThnIuQ822ehO8HI2T4/29Ge7VOyHXS2T8F+4zrb5yM7UjDk8/sVih4lVOoAPGIxQxAJOl0fxSAK6rTvRZdRPZOpjx/IQN+EFLJwb/o7U+5T0Mx7A5gVHT455lfqbWa5hqAZXJDAsuuMQtk0BC5D604RmrCkuouPcz/75N3Zy8JTh0LL5sxeHhI6Q8tmz14Wop9n891/fmPRrGh0aDH/vUWzIpFZiz7qkj/L83X3+bMcIDKyAPZK/mwup9eo1QVlq17dok7aIUI2m49MfmFQENTjVKAd4wE8DTcBE0BwpqS18WlbTm/yEZv3C3YiPo8nHw5kiZw8lvsjRVk5SSOLVxf7Lwi3c9Tt9cGWs9TPzMSanHomT3vyOnWV6B3Uh2kNNcZEQ0LJ0iikEJDiwkc6iMzy6EIFDvzGaBsqp6tC2LRt1uxr1UbVv+s1Ja8lZYsVVEJrIKzHVu/gsraw/+oV1+EvPryu/vuFVyzqaP+r3V9468otp3p/+2j9nVLU3Rr0OPQDmXU3WmGkY8mOOyIyrcD5MMorhkAW3CrnQjntCQjMduA1dGhq2HlciHaEyLskeoVEwm42A/Fb6J+BHfjpK/zDSQDyuWVETWDi/azh7HSePY1ZmWwszBspfJf7qDdaU3qOj3nJrKT0HB0TZMuP8IS7WcdhGlqOCmyT1YLRhWDXC3Em3zcpk+6V2bY5pVgoYTca7WLEoLysPFLsK8TinRajTTSKGrwLzfzra/t7++O5StjiDSXW1a/9ZHDqw/rP1/UPlDJlyRNIzt/73T/LPr+PsB618esIHTpgSZ5Zc6zeEqAz6zp1RQAWEM32Ail/GTgT+qfMP7X+vP1Mh1of1rcvCM1uXdCxN7S3Q5HLdmd3aPdo92u/qa1pv69VOrVx7W5ht4LrCOVK3v2et/zFUmc0t78LzAFXEv26B2BRMlRESV/ZG4XRGvzOCZ+Yo4g86HVJi/friba229L5nJmGgjx+ItRB7NLcSzAD2uDjki5BoU8/p+lOOCudXwzUZIWN+c4ntxgm5SrjhCPfIwOXIjhtmdxCYbi25xwUbO0ci6egcy0LqaRocUdBrqZ459hYtETMdaJnRf1ABKLe7yIfyQSs12P2tb4ZJcumBArPQcd1I1hour9aoBcy7YrMANZLgtpYSd/GWlu5HS4ulfLZgNMe2HLzimvciNjMgi493OZyxsSesXRpvq1lXvHpHZcXorauCPfE9f2pbCYRdLUv6+6b+48lYisLLfmSNVHOZOfm04FsztcSX50PFm02Ogd7sRldQ/pVDZyAVd+V3H9lfMzx9xy+23ivA91ovNmBlA6HA81QmgcFQn5J1AwC7LbbXbaX4eMAw28DPXz8uOh0kcH/7eMBapswf+rUZDMyqBmGnIVE8TZGWSiyE9q80ERDkS28rRGKbJdDkc1eYOXM3ouXOz9H6E8U3KOCuab4RTMc+Rf/l3DkC5WQB3Y+eeyW7U89fV1x9sxYT2XOUJpf98zOnRNP3nbfodQVVx+4prJ89Zev6abjfQgA/gx/HWiFXkaNZVF91BwOh3McsdfMQljImfVmsy1syymrqk511V51XB5eFl+Wujy/Nrwuvi61Nn9TeEd8R/Km/L3qe+2mgwUYPOy80gUOi1cqWx504wcVbpdLqSQzzEeSDfkDAQhR4mkjUhpxy2Efdxg7XTX48LGASCajh0/CYNsutrTXcdIP2sbJ/Et2JReKVq1tfr0P+lyFTFXbhoihiZ1tTQdkdR6NQP2AvRumRs/KG9MpWZXvnmmomYbxQROC65PkP2V2OabHhYhW2X5iLEDuLFFT/MexMaO8dtywDcwBhm0ZKGXZknGBLSHroMIqu5IDZqpEGlAjQNhuQ3e1TD0VtJRnwdxXJjZ8DZbf/CEsf23D8QMwN1y2BKee9N3ave7X333z2jsWzsrDYP1f4PwFaW/uwT/s3A/dj+2vv/vYbe8/mPOmF9SPwWBm6UO/hgByWx8+//AvetPM93uWd+AXiLwYBIvRWYZt0ICJkoiACuSLwhJpNzgIXgDYD/LUG0KVcWK66gYiVYWKon1JcZp2YRD9NKQeiKtFGl3PiYv4a/gbePww/zX+GI/5Vp16DkV7bJXkOBsUCFy2IANzmV0ZlLm95IvASKSkyF8mXYYuSzvVidbW3IJWj6jq7aGgwgzgvKfHNNSxdIkEGJQgYPUEQWAOe59jo8fmzFm6RA4G+V6jgiD5y6XepMCbLMJgSw8rvrnFyFJVe8jea6OjRI1guaujozKq+tLlXUtmLOle2buyb2X/yFLFCBjpWQ1W93Azh94ZQS7fbF9/++x5I/6RgBBpSfgy87p8XfN40SIOodzS4cLywvrCY9xj6sc0jxuemjEx4zsz1B1SQCaVTW8pApHS6n1Cotv4VWTs5CVKmBMBySBBif5oVSReXCVtlnZJByRO4gcaFMsHcJNmPYRqmFJtAJJuYLSrlhSExg366ZxqfS/c3Lurd28v7j3X0yP+cEQF8ypJtVqFVTX022NLgcRwmQKJ1lxrTytqzXnm9AReoUC+vsCqwAs0CgpeJukWtI54IPnvcS5pFNWgfvpzzHNFIb+r8ww0OZ4uYI9uoWs+WxgoEyHyBTrTMI7U1hwdRFsNZ0dTbO6mxjcVTxQbF25d7pZ0HUMmXMpkSqLoLEmARcZJkrMUmMN2AwFnqTrA3O9VRYnYFe9OjJUUOmJLOCbGdGrnZZfacM14uUvWbmT3fNO5224XGmUGBOaXl2UgOS5H/ggXV8+QUd1ZdF0kwGwQYsbPgAx8icVG/wvcN37VgraKP3zT0s+NzQvP0aQ6LbkNHSs/d/muJ3aM9PdFosawO2ZtGf7y+p23W/Kloav2nZh6Hd6C1o6MbL7d6rpny+xVfbHLUXvB/sazM2I7bF8bm5+zXyEGc2q3/67Vl9/SO5JcMbbcH4gvbnPZ/fHiullDxao7/J1TvbffcNvUDzMPzVyeXFpZvmBNgozR2Plv4Z/jnwAHsRKTMn5DE37d6RfNwpKg/OoMhLioxxOxKaIRUc0+JnwJVpWDlSDifZoGDjurJEP2TKwIjIkVgTHx00VgeD5lMqWblJaLwFBITmp2NzL07QyX3y3dEIcJFHPOcV7hGufGFePKmy3j8T1I7Qoa0kjQCHqbxqaPanu0gjtIi2FogiGtFgG9MxDw6XRQo/eZnMGki7MBzCdCwYBTr8FA6YkirTavgxbyE50pRR8J5oj6q6YPhoiefQpmEyO8K62jkLJabdY3YjBBkzPVrBVDuFpegWCCoqfnbA/1cv7FslOl6WcyKF/TfXrtyR+Le1vMVkFpiSqiXqvPD2LKhB+2mD1+GBeiF8pksByBraNwKy2madaK0OYM+mlXAKzRc6LNw4JAbQoxytaZxE9lnbwuZ5202xWNGi9snYmGWjNWba5h2EXYWNvA0buy92zY9ubuRbvn3JN7oK3j5h/ectld/sI1fVffEYNH69cXrp55zW1YeiS1/56j26c+V+h5LHWge2L+TX/cVTy8fObBF3feB3fXu1fMPPi3N1P9Z3l9EHfgt4j+k4KQzfh9zxtgNJCIXKm/MrlRvzG5U78zeZ9+t/m+5GO6x/SPpZ6xHQkbbHYHdvn1hmSc0zodXovBZSS2c0ov4nEv9NbghKSzDIY049rd2n3aF7SctoZnSjGhArTjGg0WXSN6P+T9Vj/yv4eNI29HoSrqiqLoPaI+AzM19OgJXNGLUHwFPQrSIAO/DwLQz+yp1Adbpt7bQl2Ok+yFmRUgN0Ume2JRjDYXGcl/cLFDkQmpUfdJr8arASELq18S0guAIfU3XBef0qHMxABD00ld0wHtsoLajeBr2d7eLNlCMT729J3rLl/TnQ8kBr/7zLNveFPvVPFb7Euy1Z/c+VD9qRvu3HdZq2+jP5hbNPOG50/fsWjm1f+9h9D/bH0Qvo5/ROjvAOOyXaEhM4dK6i0aXB/q1pZZ6c1kqaitnf9QEpP54pe039AiQs/hE4JZkADZK9FijlgSiwbJ9qHT8AFhfEaUyZzhPeopY4GZpzQaYJ5+4s+oH10wX3g8uDQnkXuXJFd0Od+fzfXx+EfsM32e2z55p+TqmTd3riMl24hh+DNuBd4EeDCfPsFpwOMYOZ4/hjlcw7FjCEGGPCZqi9ClAMsE6jCYT1SuD1IMHYN0H60vdQwDvqb4w9ExwOw+FqxhDBkDYa5jwSd2vKm+Ac5k11t0/hh3jWIeeZQXGcdKcUQEuOIV6rhRAIQFng9x2MJxGCgUIQTJUQFBzAkKHio4HiMBY2LKA4R4cATeLxG1PiHp/H5+N3+QKDhO5eIz8gTpcs77T5djatJJnZCOXDVH3isN8WGUPdT8xVkW0+V9WTSSpFaQS5EZSaBq1nQsSiOnpyBCWvSBc86uf79ueD0IM/BRxbwPr8VTV0pf+uQNtq5QX4h/zW8EfY21xaKY8kFnal3iaem38D2swHxfCAEY7uODIRRI9PF8OJCwBAKJAJ/o48QZ4xlnRH8a6oiNVoA6qS9DzPlwPoQwDoZCYkbUhcIQ0d8qNeV0/kYwAKWB1QMHB345wA3Y0qbngcag8WvyGkmzWrNPo9DM668h1dFdslNj0jC65YNJNinkLvHsU7OeZaM0Q0AawTruiTAIAWIg/u4E6eGM6CSDcGJM1GVmMFMm04zMJJNOE2KDdN4lBr4cEG9jhVray+ayOcR2Lk5njTL8kUbxRgE9f8z4XHHHys2Ll3f05VpcMZ1Kp7YYWzp9wohi21H9NQWjKzjc37ewe07c44rYRNHod4XUbryxr/6n+nD90NiiGelYW9hiM2gUSq3KuPIOG7w3BM/0KYz24JqfVrv6sqFkyGqIKNVKhSNQYDK1BRq5Ic4A3KBd9sJLrUkc0Sd9kRSnItYrr1f5lCE+5cIOhVXv8jlC1pRGNHJOfymSUUJtIl4s0bU3/86I11OMvERGUwb99wSn1RSddDxxO9mqcKcRgmKP8YDxl0ZsBPsh9Ow3eOFu79tetM970IvyXslLDFyD1+/F3nIlvj+RoOgnHYtl9BOG+ELXzbbSXZAbpUUbKAoKFSBNPJTmir17wpPI+InV/wEx8zMZorV9cHIsA7TkpsnuiTHOKBlFsnd0zEgHr4soDIbXXmOFU8n7X+KloEZuMpWuZvZVDn7GV5wnhb+wJrvuzBO9g1eZU1zXlo5Udt3pq7paInOuU136XSf9bv3pqzvpd5zu9kdarpQuX738xn5ty0jSoFxdH9/1iO/KHnpoQOsbSeqVq0hfuQDgfkDGGCLS6xDrq8UiEHEFtKMOfAW4Aq8Ha9F6fAu4Be/g7kR3cno9B/UIIoorc4TnLDxP5AwRKkmALKTzeYgw4DB/BEKg4jgBuBTQKRBrd1fTNXDW8B6VJw6iY1PhJ6siNKCfuov55kIloTkbNMc5BIlU/OPEGFQizAocGqn8SEARcz/4eARtgyP1LfVZ/MaPfo3/9pOKvK7wIX4Vf508kRpsYs9kErFCAVU0i0mlOCIIqiMiTSxSw69KKuVHPDxCqHAE00M8/OpxxHKc3jweoAEdLMfpA2Y5fyC/N8GMqj00ZOu4gtwJDXxkIft8SIQFDOXXTyr12+DnK+dQrbO+Hd7X+Scl/Bl8p56sx+X3T9/rePNeVQqo0Njtzv/7vU4gl/aSm6V5QH95t2en75ZTUdDnxt1SIRwyy6+Iq8DP12+rnJua1Qnvq2/v/BP+ej1eJzo3/Jn8zuJv3jt/VuEC32ExpCFwlN3xuD8iRcijCBrJ5JBaWkwmQe2WAlJ/KSD1lA4EzgSQPrAgsJfscJuJaXae2GQ/00tW8gMr/YH1jBXprQuse8kOt9n6ivW8FVt/Rib03Z0ln7hKRAvEMyLaS1/ED8Pv/qJZZntKLrbdeGsAck42yhKPuk85NAC0kHuhMz6NS6WPHPkfAlMv3odL2Ozf24t+3tBxmjvSd2StpvH9Re/T+EMM/0fGH7LDL8AvUSQS5A/A8cC+AAoYaudfYyAUoQuIPAwfRMYuenm67SHSdpzhZxygdvJbmTPETm6pwZWsdeuF1ltlHAgZB+jlaRygQ3APae8+gQ4kYALUoMTaZS7FHiL8N+f8+8K/8ctAGcyC8krJNeP8uLBLsUu5m98t7FXsVSrXum5yfcl1qPBS4W9dQsLWabvH9U82LqdUBNRqn9KtoNGdPt4tuLRO30CAPJtGozaoJfW4+oya261+Qf1LNVa709WnEzgPcoYcytE4zlXZMghlM8hkdjh/4zI/7XKnvG7lQDwgKg8rFPxhg9AjLBBWCbsEXtieP5xN+XJwV24vaZ2DZDc35jjsd55x/t6JnYuk2XA20AbbR2btm4V6ZsGDs+CsGjojqaWqIeKPoMjw8JoX4T1sPWLrVLOuBq2pQcETt56dYkuwzFyicSyGT1j8LflJfbTKMNlGt+To9N4I47sEGE8uKzijPxjvjvRFQ5EZMSkD+oPkpSdazcBYvDc8kAEXMonkFH26EqZphHa6M4kq8wckcAbUFO9PjGWQ21RT/H5izK0MDDDDKSB+yh/AwjbJFBFjYZty3LvtQtRmUBGkikMYlQzthLnJbDIdq8kX5WmIpniwRP4SN3LqhtUwFhMX33jKYtd3r9uxqjCnHB+rux9o0Tw+Fnmm/tunHngGDtgP3b8L/lzjd5idxcCmuhQJtc3b+a1Vi0/fNXdFiEdTv111bT1+64K6NJLXKl3ZgZ31w1AUDsHhVyH63qSCr7+z3Re3ad+/Y5HF+3D9J996vP7PXy+seJDKlf7zZ/k9+AUiU9pAF45f7L8rNP13hc/032krEV/Dfzf/s/13wjXCDQJ+WPiacEzAQqtWHY44FZmIWZ1Q0sX8BHMBJEZsWrmaMatvLKqKodr5f5Fa6KeQV6MhrwYPyBcu8dnla+ffOSWKwpJ8fgZbqk81vXW06NfbtCjtZEouIPs/uOiuW+pfHFxZXFlaWV7ZLoyAkdBqsDrELVAuUN9vutt1f5avtC33rGpb797QtoW72b0ttbNte9fnuXtzX/ef9L/u12OlqEcPKQ2efBcHcEEsqYIhlSh4KgWDkAkxt1yxUGDhD0OlVYXNhV2FAwWuUBEIEQjlaBGsoFMBRCh781aLW8WHGaiIUryN0IqQyaxVF2o4LaXz/vzB/Nt5nK/O0Bfh5uKu4t4iLp4juvQPD6igHAwvu+YE6pqTNOMzXpmBZiRG9tHoClofOZkt2vqrDUdFaus8BkG3Vfa5sRypJl5Cw8eju7TvKHjG2dEtPefk3JLRVI6uI8rmbmNomhr4GWxUbix1eXM6B+bbo4FIudReQkIsHo0jIRXloh3+kgcGguVSZ0vBA7yeDn/RAyOOhB+kaWnFrCnvgUZeh/xAbygHKh7Y5a14cClI9uL2sB8mrRk/yBkzHoT1gh81EYVpSZNqI3WwsQScTDbyZem4bzgJRYPHKYpmZ0H2DxYK5oozTEb6iTGfU6EVakr/xJhWbc6wwW+eDuhItV1wAzZ9gMwzcjEsAnXIN2u+220KSKNBrYbGcgjiA+WY7PhbhfrvXDByazgQPn7bVfeGug9c9cIf/vuFjV/Jdd2x8pEVK/hP+sLXuCPXdV+5/MZ7oBuugk7T0lz/WjTDqV35wzXXbTN++8jK/pGFEL7zLtQvG1wy+5prjsCukrTo0Xr9i1d88fRvofWjQSlf2QHg+f+E3+OMSEdGbZts5SOiwasAcPFwLTc0iwjmd4nuQnNZ6EIoMZgVk0fHaAZDIzAgwBk//gUXgt8bZjb3+Un4PaUJ6f//n09p+u9/Ukbg92bL82A/XosXET3YBjLgAJsH4xDoOIc94vbFg0qjOi4FT9qNkvoksGOAc0ST1Ed8kd0RHKnBpKR3dx4k8v27ep1Pt1uHdfSYyHU+b4EWZzZXg9umlcnReZNToyxnsLE81jOPBvqcm7zAww2MAsIkdhBUx9VGtsz1WlubsZFcI8dc0f682OyLfPZhOLhsrkrUatOmxIzZ7f1jd6Err5XUao06bUvMmNfRt+FufmMiu6YrpNXpZ6TzM7ctWXMkGu1c0e3R6QxdqdZZW5esP8J0jAaNjFi7n+igTwJCjfHW3a3EEEBJTLWKRjzgi/ha+DtCSxdYzygZAEBwICIglBBwBl5pkbQnAfZQEhp8ht0GbCDkOsF32p1uz8swCQLg7+AM0FxGbNJp3rlJ2ZcFKEoKNQ20lgZhGE2EC8nil6I0wJevi7g1ar3K5DbGu32pysCGZV38xlR3KVby6/UKsZopeKJbF2+/SpLv/9vk/v/I7v8qGXtTdBJrhjeIFnBSK1nYnfOdervPvtuO7eTejxs+486b2XQMlLnRsY37BhZ237QvzaXyhfK/jRtu3P5/ro241Bqd2uSit53s7N+4vAtfm5tRipZ88m23eaJb2G1jYId2bh5XIHq5ntjdh+l9nzqoOahH4KhQw93HdbajhpdwN9Di2ISOKN06Ko/7u0p6HfTrRgjPvqA7ozuvEw7o3iJvuEe3WYd01PWBNHvMR515vaRH+j34qCg69+i1C7RntFg70yMHom6hlvPZUQOLqh5t6OQ07Jc97lGdlthvknpMpwOGozbhqAwRMZmjwfGfXrilI/Piz6gtXChEyIakj3/AlafejRSK4XCRTGCFcJht9XmX1f+LHqObPJZzRKH4W/5BYlOJ4B8k1TKwTKR+KFHB0Go53sIplBzPCpnIRzA5InCYTHmCUka0hRakVCCivIhKFhbsomHBggJApQAETiGSd2oxIzL7noYDhGcUcOAUhwDm4Q1E21ZLHv4GYijv4vZyB7hXuLe4M9zvufOckutWbWDRQqNbzn1wtlnrg1ln1K/WCPucDpz67B1KVhERG9MuIhSBX6uv3Fy/Gd5TIdrWYriWf3CqfaoLfQ+9cdXU/qnH0Fo2dhnuO8O4zDdw4t4itGrgfVaakHBNvM++KjAzvE+a3I+qYuASvE8zsVWeYdihhgZ26NfIU9slDTlVRyw5K3YxhKjsI60fOv8DdIhfRzhVzucjs/IyvA7tQN/EHyIB19DK4wiqMQU3A+j3VJofg+9xL6FOMmdQerHFjKrMUceRGuMGHi8xXSE69Mny5fgb/LqPrua/QuaG357/Df5ncq2cjM1xIuE3GIsRWi9AJDtav9pQVJJPx9XaYlRe9jUWo+F4XBLVxXg86dObdTqHKueTQEuLJGqKLU7ewTmdqmQNCsfCvKqGc1LerBVgFmPq/QC5HI67Yzq3vhW0Sq1Ial3derD1l62cy+71c9jd4vA58YuQDMzc5DvVX7AIztEthncm36FD4E22NReXKjnyA8PrKWCouhy/YDolmxdyKSADeDAjgvSMTkfu2ByGvhZiKEjWsWzO1+NDep/PhwLY5zOHBaeDfHNyDDud5nCSLcOEebOKwbiZtdOYA42Q31UrR0cbu42csIBgDSgCcnjKRUuMofYCkVHklTkd7cYQClBXYwAvmPoORnH71B+Uc5d/6e4ryot8Swdv+Op7t681X2ufja6xLw7ufuTdQ8/EXPXJr6wYsqEF6FfJxPyfPPDUzMQNlj2dq155Ymq+oSUyf/Kvjy2r/z3s/cYdPyLj6qbzH6IC84/Ml7EJAVRhTnGpF0TSAGRAfpRHEuLRS1ANBPjsURkJT/aCNP0fRyHLL5j21KBCw0ejbLpkyDVvINdsZ9eU83GJgFAB+KlrntIjH3oeYfQyuZwCPIF94ML1pqavx4HG9czMy3LDp3wrcq4rOe8MIq8k+IeL7Z4odB9LCDYaa6AFQlcxA4h+7dPb9bXzdVZSkFUpZuaInvew+pi18+9JYVYj0yavZfb1Ajv7hV2gh+2sjKY9EaHlN+lhsvMrVpWQ7Pw7q0sdifT1ypEHtEKibM3QD28yXIoKBdV5k5ZUpHqVtGQ8N15Es3NS+b7cfeVncs+UD/adKL9ePltWrWtf3Tfe97vy79r/XP64XTHSB/1KfaJFFQtGJlr8dwf5RIsYC9knWnx3hxKRcocdt+rLHV0LirBYwwOStiuSAdaRGIzl45ijVkomnogDwe9TiarWHG/Qh7kD/PM84l3jfW/1oT7JHo5ujuwltv7DMWdvXw1eeTxw6MlGtBeNTmXo9xQrh0HfV1lMPp24tlZp5Jex0jAfKsaKHLNJ7AdbtSeZ7u6Z0UMthmpa8oOeZJcfsjw7VnWdlsB2nyoWQUalynQx134G2OIxOQofxAWvWon9ARbo6Vc1iq2RYUbGnrGxBBVoay80ctPbmrAd1Jq/KOy+TEtyFoqNUGI2NcYanmTBCjfDXeOBdGm03nG1x6JSZm45oxE9aX+yrgkPdh89eu3rty29vz/jC+YrgYgnWbjW7MJfFKY6N/egcDjVsha+O2rWG6cOj/kdRk84PO9OtHjOqTe3V5bHgtnQwpxVf1lp1oQ8r9oJn/YwXPYi/Anl1Bpsu6sxZdiTDgfQ0RKxRgFSltUVhUzSCvxKvyKKYtEmz0aneTbq8jQqwf5R5lkX41mXixop7BcI0cOI8Swyamvn/4PxLNn5B8az2ibParWERJ/Bs01j/ALT9siRllJRnRspo4NlOF6GQaV2okV5dzCaaPHHgmiiRXF3yJVo8cVCRm06ZcfI4YrGk/YMEf8xqZD5kcMKwAgtyVCMGQ2EIZUKVTwadh5wPe9CLhc5YbmAwrrN2r1apH1Y7yyV/w+82OREuRQDjQc1XsgJneZDR7bNZGlty7fl2rBgjmYtxGBtM2U805xIdC5iU6qSyaLVAfwqKzEb//PEmBVAmh3+n4QViwZBCLTI4cfHxpSXsuIFXqSZv+0X8RxbjKD8KVevoUGoJSecLuUueCEW69e2zByqi/HK4NGjisUTV1x39QNxa6W/XukLWRz+SHZbZ9AeMWjwrKnnx/qjhOmk+9GyuW+8snX27I8Hr2hvgeEwNKvKK9CrMBl5xtLSkXz1ClkP/wLRWW4k/HYb3MLksEXaNb4L7d4Fe8VhLMwcFmZisbcGv3pM3JnpNeE+4CVbN0WmJVsHUcvayGYkm51sFmBBvzoewTuHe83wq0RD7ANzybaJbCvItpT8ZIRsN5DtZrJtR7+SDGthxLJds7Z7rXdtZm3vW2IvhbwNki1OTwifAxGwgeytgQOSevgtsHbu2k1rV6wlM8T/Zu9NAOM4qoThOrp7bs19au5T0kia0Rwajc6WLcuWZVtO4vieSIltcmCwnPsiVkISckBsIIQE8sXOQsjBoVjyMU4IFsTkCwRjLyQBdgkWHyHAbrQxuyGnNfNXVfdIsuOwBLL8fP/vOOrq7ul69epV1av3Xr16RfLDb41fmM2cU4TfEtX+yHPihfDCJ2/YVoS58QCNZEeD3jpecbqmHS+zSLe/ZQFwDbMxcBMJR6LLOS0FwSWXlw3TUkRces8cUyHhWYCKkLKxRENIgrtVCwThynOYopQ4vIY5r1aP2Y0tRWVwLHXN8qIyIOpWipetTJF/F0b0F0Ipii6LEuAyTKXI/0zHJC3OPFDJVSHvWpgNAUp+nJXRma/qKTF3G2FM1mtoRN4qdNKP0dhJIXlPLaARIpMynErV12WSETJHNJ/bVJvJ1NSubHRba5VqQ6o1XteqCzgUDemmJZHaVDZe09dUbY2rIqlGi89vbkxGNLWhO5qiqaZo47lppymGBE3QirjWeLxZ0yHUR/NLUjWpTF1iIF2Dj84Ta/ru+ujG25fWdouC2hZKRWsyEbOCRx2x8MebG9o7G+3Z1d09SGsLNsVq036rQH7qinW0rbvsylXN6XA36YW5VDTSFCS/4LilZk1WYapOdbTmfTWfOQurHIGmaCwVsKtZn/4sysEt2Er0tIwc6+MtKbjeWyqnlnYMuoF4NrAHXbIR3pI1plN1JSAvP2BrxddCks+fK30d/gk8axS0RCEDelEFhgm7cnx30Ry7//zSIXwOeJbw9IS8O6Tj/ur7Gx9NFBPPJv6QEK6tusJ+R9Utds7hdMcA5PQBZZ3Wsa9ODGvAPpOo1TR1uVuXN0B9g69hpAE3MCPILjJdP8216q0+64gVW6lmrHcmm+aaP6haTISkwqVTNEjdy+R/o+wDn59xtq7e7wDhOpNJy1ZuaN+UNGUW5nNWUZZ7DP8+7y/b1KXW6NQ2m62ufWlu3kc/BTesWqpWa3U2u7G2Y3Fzz+ZbSofq8oUOd1WVUtkeTy66dNXF3wrXNWxqC1XplMrOeLL3inM3fpPSSwG6yz9QPMV/lOgvJhAGadADVoBNcqSh2MCFIxeiR4Wv6R41Phr7WvzR1MMDB4S9ugPGA7G98QOpvQNVv1dihKgiqadHe0CAnHpQ2+3p1RThGlFt7qVaBM70Rsjj/o7ehoal5/YuoD85C71LlyKiGfW1XPDOmpazvlXb0v1O9zv5lmQRPiPqPqJsCbzjbNE7P1LZe84U7+lX6OLfG5UVsekp6UolHpLIGw6koMOSu9ceftOqyDnRhZGN0XXRgUh/dOj8wfORkGtpbkFCKhqLzI+2RePRrojdYXNYHVgwRoVIKFod1UV8kZUr1njApt4LPHD9MnJ33hJyl03nPaAn2u2B7Y3krrOe3FlMTg8I8wEPdGvJnVdN7laffa4HblhELmuXFzzg/MXk0tKU8cB5NeTSmujwALGOXBwGswcGFeTiqvJ4gF/lmQlge8oBbrP/1clJ3cnRss5dEMkUFb/esznSoPGQm32bNRxR48zsluMLS6lDBvm5QYM0bL05nydzpOFQnAUbklXOQEUSk1zV7Gw2nI1VGItC9oHsi8k+qBjnpN8jM7/PQpB/l7ozd+hEZg3+0Yk3lt629LHLF985sOxTC72WgMmWCDQ1BpqSIXTFotsGln1m4dbR5Z+Z57OHoo3+ZFOgKeVHl/R8dumi7X19ty9d8rmulLehkWBrD8YSIf6j75zH/9Pab1z06HdXP/LRi0ZXZg2e1qW3H+hLZZYdHO/LTH90zTc2fuyRtU8/cvG3VmbNnk98fs/CplT/2LeXpbOrHtp0zVfWrXnoI1d845xsou/Q/oUps+eT9zzWmwaza59wZv3yMXgHvBc0jpO++56TXKJB6SQXzWAYbgvDsN5JzQuFNdmZM1TgzBkqj0E/gdMq+iBohUOtI61oeetwKzraCidbj7cikTzsaMWtoHLCw5zTVeiW6K3Z06zLnk9w+yIIiRY0EIKJUFcIbQvBkL5JPtZiJv9W2d7BcGLn1JyQ7R0+eBmIUDPR8o6Rjh0duzq4DlCEjr0swH7r7Bkt2dOeC2Nn58JYRTWEWf0BesZEbtZaQr4nFEVX0+/p+aTsPAJAvneKWpgkeKo+TusZmFPIbB44k+cxkudekB+H8HT0N5rYSTqD0S1RdDAKfdFEFEUdxdLnd5OW2EqbYgYms/NIMC8ol0m94+OkjqfA3I8gyIYo1Gy2ej/5vdahXhSLr5Hod2p97ACS+tjHYMBRLP8Ta7bZ5XCZ5mw9m+UR5Da7TaIBGvBBn44dXOE5hQZSHjiT5zGS517g2Y+6gq8FUVBXLJ1gq+DeuavgpynLDm+n+I2TEmbOu/DNtWdVzs9hebQyfndW2jQV6aVtmjypTaXv4cz3j8EnCG71tH3ec9pOtomdtrNnSxZmKdKsUdZkT1uuHX67Um4yAmi5qTmYQul8EzwKbLBtju90k8VE9SYru9osVpuCVyodSo9wrlLhsEOmcUGmfUGmiUEtpQN9S27eYMoXfbOf/qbVOuyzNoK40QQS6bgx3fXSYQOzVlWP73BAB7WzOVOpzLBj1HHcgf2O5Q4kksuQY4eDo7+Ot7RmWNqQlNJQhKVixOnKaGu9isVBWOsVFoesMV23xWvt0SlsQKEQ1ADqYFjL4De3ZnZo4XIt3KE9rkVD2mEt0o7Zx74iRUvYeml8qrId35T/09QJ+Kd4xaBGNKhCnC7M7SGkUCiZlqRQSzsz2Uq7RQ6tycLFsfUz6r14naupuzR/fmO1SuF1uWuqoAWPTvtX5oki7Wo/F57/hXq/Ux8epu3AedEW/mIggI9JayLXcs9w6Aqib1zFUYeLQ/gZ7mfc7zgVwgJ6AQhQoLEo7dwRwjs46m91NwvOplDePbuQNF2ge8OnXi1MyUsLoFC9hwgSosCCwKVZWLy0ORRRhN4ufsdXeu23Xv7i0t4XXiD42LgF6B5+CXCChxk+8x/WH0D79Ph2xa36W834Sv1V5jsR/oj5WnSNAl+CLlZs1OP70D36RxAGMGO8UXUVEaRu5Dgd0F6k1/l0CR3WFeHwfnARdLrosgALhDNdCYDf/vr06+2VuH+FalGl5aBRb4OcrahUixrqPwdU0MwbVUWlVnaiGzyvQP3oCvKJY2bplDFptTNtY1saWDsIzX7ukmW1wYaHavxNVT6YLiQGruiqt9Y6NFzf7dfqjB9rPrfwsY7lcVPYyGRwO/cD9AW+j8hyOWntEMAv78fQxQMaYg8Oz/FUqywgYlBU6uVYPMwx1xqwoxumb+L7RiRdNcc1o8v4ZUAPhiSboVqlgmCHbpfucUKZJ7Ab8FglmoHqXr3ap0Zql5EMf6dhbsigwtIpkHh9qmBoZ1FoqveqgG5ExxeVrt2bdbJXIQvhlq4YZSWfwpwvEF/0sY8tTFsCqoeGt3yVX9bhjNd5Wq+//8sSbn/gBuHTLO5fu6RzbCMv8cdoKO83A9Sdii20gURB4g6PC4erDwABL5taQ6su+YudqnusZPH65PB97FbSK+7hjMjK72D+YcdZaRoN4jhOqVFzOWXlPAys0ls5p8PUK9Bxq1YTNiIIWhoVoGsqnYjLUVn2Cr16EzQVsWqvisZsUZE7UU0/w73ACq1PYhVBDhBeQQO6kB/H9L3MD0Sl0mVUtzikiPHx6dfj7ewkBnJD0jV//ZEo1GuHnojyamUL4qtjmwH4C05EOXf58PDygeEty9MLF6bJH79jeEB6tWBhOrVoUSq9kDTJk6Vr4XEirVjBo4xycd7+paoLm/uscI31Yiu6xnq7FdVZW61IbXVZiWAF7wNWCwBWMvkSXatnL0JAd5GyCJOiAQK1lSiZarUN8C2GDCzC7aJ6CAyDEdLrnbYn4Nfh0EwAhNel2Hcs0kT79DQNWAUlBaHiy03/i1fvM9MSlMyinZZjFEfSlZj3saytEn1KAS9uT3V1Xj0Yybst6d7GoNpgGDAsaV70MUWcmx/31iPWV5ZxFnQzi3upAHewGteJKogwr+A5To6AiQWFAqGdGGLhXkUXh+7FXUBF11+/DR8EHNQQUeJBsQp0DdANkErV3bNHcbxOVCCmRy81nPgt+R8k5C3n04WZeCuSX7aCAyJmLJOZPsxpHILkb8eTvwzA6578lyD/8dLX4NoSi6ngKZ0DP05mVbfEO8QqrYZ3A8tmXqtRtuppsKapVAompn512PDjFB0+eiULr6N3s/A6lGJVWCHMnmTRiKgPdyfOwYXutqQfonzKnLToa1Y0R9prrRBFvaZQXUttu1fs6Ytlequ0npqUsz7vj58dtoai9f6T5pZ1kp3sWnAdvJS7lt8m8IRd68nE8QKi04mFOwIJZemLu9HcuWTpVIFtSp96ld7IZOF4JEKJLMzVJITTfC4Nx8hUAo2/9XJe2P/885QmNjJHjZK5pB6mWfkDMbAQXAmGGzneY/Vscl/h5rRuj0fj86pUPq9XrfL51EpfNQwEq33Vlo6gzldtDoRUWo9GE1J7LWq1V4PUnnqv10OYhjnqKcLPiSrRO23xW8zITZ72+HxmIpKQ1waVygwj8d9Fog8RTJQebxF1iSqN+gFl/Bv1m0ERHRI11f6gUqlzNpxfYB2eeR2//vpUJVgDeXpZCr7CLl00YBINnlTZJ0VHAidtnTLlCbXin6JrsYZDhxTtCkN7JVyYWOX2aVWc2kP+QSm2w57NZgQjRcWfxjZDxCQKyEIyxruoF08+kZCi7NXCrKT0GRXZHA1FW4n3QBRCY86qqDj2sWAYXOe7v6tLNAScR47YFrTVobXtC+frFL/5jc1rLdz72eSC6+L+iN3YvQnGv7b+W/DFS7M1kUhDg/280g+eHJwota1prNLoLZ+8VsnmBS8ZhDEafwUenSMbZnxMKvRbmNkdQ85usVmVAa3PHyC5tJBnEiHPZEReyRab7OZi+Y9MPKRHuDPx0FwRD83mUFAWD9upbb4dJLqIbChvSqJLmVYyHWIXcuHtaDsWdoQmQsdDOERFwK5e6oQ3Ia7Ot2X40Jiu0Lw8BMXQ8tBQaDhEv95p3WnbEdpFMmg4HlgxRITfWazY7LDbkNlhrvVqY3SlSRML+WOObp/X3wMwstmSVmyxWjEuQuUewtO0tiL0jFutWh/bSgqARqtG+FKOBYnlw2ab9U4C0W6xmGWsaCq6sm2ZHWa43AyHzMPmHeZd5uNm3jwWlOVNKYwP/ffGbMwnJn2y/TSOKenIqCn5tGVgkCXSSnDXrcy6fyldYRINFjvBBFnJP20AqLU61p20VUXFz0jC5FQiqEpWXGlv6EzPoeZ8+5z+NSO7Xv/1r1sdEbGUcmZ8NtsTT6j4qN2YUkM3f9f0rs+ce9f0G0ONGjMKh6FJl9kAr7tvxZfghi9EXH5j+DpJBxop/5rjmU6jZrrIODhGhBqiV0NfG9S3wZ1tB9tQW+PVVMGbVYoJYWQdb2P5ZfQCOwOvjp2JOJ4HIErmLn+mKzOaOZg5lnktI9Cl+q8xHTF96rl9dO/CY6x8o1Q+rKf6nqiHRx1wJ1E61IDmM891tab52HngrNwmGe8bqS/EbuhmWgTtxwk3NLj9brTNvdON3BxTue1zDi28NC7bUWfPSlZIp5js41SXGDc2o2+TiUoB1xBJ/l9FHSa9TiWdmMxzLMShQlD4kYgQukSpes+RyYxFtcunJlONZen09Cs0ioyoUiAF0RD0GMyY7ZPSCcrSKcrnnENaz4VeefcBeiX4hQDgr2Zyfg2sZtz5Il/0SsuVdqzxaAJI4YC3eO4IoIhS8FWDQFDjqzYGQi53OBhThqKDKphQdamQKlhjMhmRu8bpBEq6L1EVdPtIck5tLFZb52u3uYbrYF3YRbJTJaW27prA+Rsqxz9Lq11SfF3DKwXqxpAodLFQVkQxKNDlMLruKi91uTwBs8MSCZh9K6HHQS5+a3Al9NrdK+Udp/Ssqa1sUaNGpWQO1BGVChjDRSUY22wMspi4RgNjv0YEXEVFichobuZGyY4mIYnEhWlcXNkBIkmPIpHC3IayaTJGWMwdP2eyGkAgRuZqYDQAMmpokMdQemXE+vTT7tjSNKqBbbDxUOmzpat+sW3l72Cq9OPX1l4Gby9dFWnxXwb3LYabt/nrI9tL3/9p6del4Y1u2Avt0Al7PCXNYtI2PeWX8V7Sd3xk5nyNtc0/N0Ooghrkgz6UR/fr7qtSLIb96CJwLeDqYQ1qh3nEIaRWqzVmaEHVapcmCZNkmhbRWu9639WOq4Nf9f0JGm+GN2tHdF+F3DXOa7w31I8A7mrdFaZrLddauT60WNfn7fdxbQRWa30f5GoJYMTBMMzAeZBrUWKVWk14okZDd4XbvFqVAgOhLuT1a1UCBjwpE5Iy1RaCB+G36pBGX6dBEKtdChrTMgJcBtdyF3YRHmPW1BXLb++hTtZ1dIO1mU4IdcsphxPO9emh3tVoK5ZPiNV0yIXYXBJiztih5QYbtDkbZrc0x9nelkvjS2V/6sKUFKpW9vk9OaqufEiIiboKshP0yKX9kDS/7fG2qEwZEF8jWb5rArUGpyMaiRqjAWfID6IWcqkx1flh0O73w7A15ge1hhjb8DwTjYR68hbkEPaFwtZqUQ8wnfwh+Ueo4PKzQxdcCnOMqQgz7rtzZn3ItjnHcjY73ftskkzBSD5xz2aPKoIVz95sBsEX3vT+Yd78XPXV294O/vY737vs6LbxE3dc+dWmmC+1/IKhm866o3/dDQ9wn/1U7ub5uXC8ffDO3E0PlS47cOcfboKaH/70Szfq1OGHHv6n79322y0P7P41NFR8uJgdySDbr0Zn7Fcx/r32K8l/7OMz/mPns7OBY2PMfDXXeWwfBNm0oBHj2ep9EDargGwHJP09TPh1mPCiOMjL0VU6epVuX7UtEIz7qsOBoMFXTQaYx1cdCoTqG9KG/EPwd+FwCDU+pNf79Ej/OxuRRNLtCldb3BD0uCs+Be6KrOF2trYV4VXjFe5DJmD5bCRmhqCncpBrxb8GlifGVOpMfA3TdmZX21sSLUjHC5yAyT+iyWVyGSyolGqlRqlVcgJdh0dCC0qnYUJHLhkhn4YpZWNaDsBM/rvxRqI21zPvKwBsIT314t63Wa+3RVkExr2bQ8hMT3ggzMgmRenumnXsZookNXQg0imQQojTVdiZAIzZORKiogp66B4QtmLAQnfDry6+Z/Hm7etaL7h+Q/jLvQtW1E5/J1qosdj6m2vQvJr6lNdbf23P2pWdmzprzuccWvO6e89b+snzWnR8x41LI5EW91V446XZ+kjEXtW7Yfv0N93Ru87rv2Eh1fkAKr9d6sdPEH4VI+139VxPpRQZw0wqTKmZm5GaDnYHfaFWt7XiWjP70cxERrOfWhDpM7l5i8mK5OY/JB7g95PPa4SqGIDOqsZIlaZ5jaAg86IURttAxUZpsVD27jgqe3pIeynE64zb4ncacaPSX+t13hok4p8jFgKxwEDMC3ritTU4ZY7XmDDX3BgQEKCwaRlOR1Ub3Ri4PFVEnaLRj8zhAPBDP+lM/x74Xv/sPGaonLhAZLilFCFT3lg5dQ7M2BPpbqBEVqFTRjJRbTQZySpSftJTyCWtavbDJk2jH8xlJUS+G4dAaC4q7Xs2C4qqRrY5v0pjd1azHuKsknsI+Ue6Bo6kjZJjv+TiHIvGKsZJIuxVTrMgKvhMrMfK4iiCrujC7QN3rN962/Bji5trUvZ8f8nvzMXMVkPI64jAjKrqY+ds7Dxrvbg6mQjz7kunF15z/uabn5/68jarvqH0h0LKG41CaNM0beAXrGly6KcfKD22JdS6etlHDvxk6zKHiegUETTCrUM/IfKQOOuXb4N0ww6Sol9i6qO/nmNB816h52QW5nrp/+cpXv/rqNsvGjmb6isPwSr8L9x8oAH/Lq27QqQCvAIrNQKHlWRmUiGNwD+nIjKjRsDPaVAGqBAPABW4VBrBoiFvldTBd78KWVQqBMh9fEzF42/jOBBwB0D08DlNhu5+IZAzqIh+Pkbg0a+UGYEeTWf04+d8Ggg0fs0uDda8pf3JASa2OWnwGMcrLue043Xn645XaAoShZdJSu6p/D+7Sb5yA5WGScMku9AZUZ6enNjJIyr0Pw6Bkwl3Kpijrr5QoYIPwfNLu1rhEBxqKe2CF+RLD5R2wkXwfDjUSp6H8qVdpQda4QWlnUy/uw3dC1/iLyKy3zZGr5BeBbTI+N15ms8E8XfnqT8TsjsBRCbnvdTU8k0IkUZdhKtFE6JmA/LqZhM+KBqh0ekqYuPulyr2IhpDmwilTKc5UZiS/eakc12qx1QaLem345s1kDm5S6dOUB8itqeZubnNMaLfdjgk8BpDV+lJ0aBV81ivtSR446rpx9urVLzS71fwtk545UK7QWdhdbKge1EXqZNb7gOFt5VvaZFSCwEHeGADduCwO2IOhdo+wo3wI/ZPOnZwO/gd9s87JrgJfsI+4TjKHeVftB21H3VMcpP8pG3SPuk4zh3nj9uO24873A4L5uw8NmIHcpOes3LM6XQw41qVXgd11MhIpJ4n4GqgxrWi1cgrbrR0gruR7t6qZoyR0yPFdqBWBhp7i4VgmZaC/dKEbVayz8QN2kqP6t1TVWVEjqLixJ7NyGhUFxVvVmJtsQhyzDNLEZD2CcwGFZUOzKNmJNTVUTK9eVbqnK78SltD1bZNl9yS7P/lE6vyFpy81zNxzeIFHee0tV2w5fJF8/qvGHP4GR3r0e1IQ+gYB79mnFzbUCT18Ws2NgfVSfWVwq3CPcLDwkPqXQ3KjcLbdUhVB1WKICFI7/hOwrxoPFUbF7q3R7VCtVF1uepm1d0qQfXNYJAjqnTPmLNXTzrS+PZaWEvBmjk+FAwqzPGLQKM5eqMi4b5RW0S1e83O+tVflf0WpiqbYBI0FN/W6Sl2fGGBxS+TyMUOXItX7w6G6DlBqs3BeDBu4/RSHAU9x9US7jG2mZuhHJO2mLW+Eh9hxlQ5N2BilEn7FctlLtwgnrv+kosX9X39wRURV8DlviTasjxb157wLr14Xu7cTu7w4mBifa5nlev8tgvvdhhtRndyINtwtsHuPq+jqXM14W+3ln/Iv8jGnQe0whtYP133dvStOqSsg1yQy9qbo80cHYzq7EhwJDSS/WTzjuCO0I7s55snghOhiexE89Hg0dDRzNHs0ebJ4GRoMjOZnWw+HjweOp453uyZO4Q9bjflb75ql6W62tWcCnhc7mquvS2YDeFEoNmvvVejulca1zpYGel60oQHsQrU4FqQIH3ZD7ykp+dyzTSk7gKfH0Ho8rirNR4+fm99cyDgf8QbufF4CoIUTHUCL0x6Re9y76T3uJf3utolVoHwEZNoXG5ExnfaLpEi79MdtC8X6NLG1qWvby3MRP+kbin09Cj2u2Ga7h05wX6Vj6ucjYItOak4JN7CRsvuRA0ZIXs2J/z+5qJiet9mv1slsZw9mzUexnPShOl0HZJt8u/PeiJ0m/6fG1i3noY3ceexvQaw7XRj7smVecv7MK/L6N6Ed1X3eSvj8fzhKxbOW3L5mD3AzpykfeYluc/UEGFalGa4ducSJ6I9xRNPEAGAr4vHY3Nb3+Y0Ald1Ne0BKbfH4nZ7qt0N9YSne+IRVzQQrItG4uFKqyNvTU281uf3h2u/GfpckHWKPSgaC8QoPwvi+WKsGrkIBA/v1oQjL9TVBY/EvDcHbmmgbctaeTmZDd6pbyjCG8cDtJHjbxReZs38xsvtbJqjwQVZ674+JUdEITft0isabLPAGlgOQFUJVSQ3s3RWTjyuMEhLhdV76qL+eLio+KOo2RypicejQVFqajL6NTDoVsnt3XWItHXKZTgshS5nIZj/m3a3hqyhbCAL08aQEZ62oa88sXYtaei6zVeUHoVXr7iidOLPNu3VZ+3f3wf/uZSD7aVDgLVpndymGNSDHOEEN0r7Cj2t/qqG1mRVV+uV6lvUd6u/plap4nCT+r+0f9L9Kfp2nM+3tjbL7mIhyV1MF6IaNiDDujWdTTb16FboNuou192su1sn6IrQsy/8o1BIaeYYe66H9U/CC4ESuOCCMU/EzDhxHawjnHivkgc421xET4maptaWxkQi1ZDLtRAIoiPVmE6nPpds0tB9OHw6c0O+4T+bk/kmGuE3OdReT6ON6blGezgUssfqNf56TcJQRE/utTvbDt8uM3Ea4pedeEjN61Q+eFnqEu1d7a/PjXUv30p8nnJ4ZnqXwldJQvXM2Fdw0pEcW+mSBFYmWtOkP+zfnGttbcqaPYT3k76RbRLNyiakUtaxKUAphdIhncLFArcxGw9bQ6auW/yfnw0UM1PByX2Emz5RIP3h3btOO0FsvUqaHfibNl9eeoR0l8tJd2H7kb58uuli0RCSZosToZO6DQSEG+A9REdOw9tYb3EP+gcDW/xbAtv82wLbGrY1Kq8J3Rl6pw7r66D/SfgQiIAIkbVVgXn+4fqRekSavp8wkBr47nh8Xn0DfUoRrv3ueOO8BnO3AT4M5gEdeRkEHLvXkvsQcLB7L+wXLaFINOTzolS6Jhbyp3ekd6VxuojPESPAZqfHpoVobHCLxbpPq1PG0mmCLpGXLBYzRJ/ibNYi+qXoNzfG722ov8qX8REtytWVHcyibDTo4IIO81uZ1ezMTMrpmRP80pdZ4Gx2/ophzj8g95iZPlMqTMtBGdgm67kRGAozkRjkyAreaFExNb4ZE3zokVjAFkvTLYiGzbbGWDwQiMcabbxXOgJhfLPOS8/L2r3ZK0VbTslHYxJlnPQaSQ95zzEIHXCOndAcakRxFouBHaFF7uFXoKn0Hzq1vz7ZNP1EckXU8b3veesWJ/GntMHqBZsu/u7uc5dVhcMw1jt/N7ytf+mFAafJEYk0+a9d2o+ev8VTGym9OLimZvrf+7eUsgOLI7KP0mPCL01RbYnZX74Jn4d3Ab+oho9nJ7KT9DCNYtnF7OTzTgryQfJ2lHrxv/LLTFGdV8oL9hP+FBS1GAwaSP9KDnJrBck5CsMLZ6zczHdO8gH75ozv1rfKZXg5sIoqWKti1vXoHM8tuiZQupbj+Y/OrAk8Dp4mGeOiFfrykB7HiobzI3m0I78rj/KWYvnH+yiQvLLisjezNlC6Fr2AR2fWBh6vBaCNssOUIYX81AQjppan0HBqJLUjhY+mJlNoKHU8hVKmYvn/MJipGZgF2e6/mNBQz/zw3pFtXvfDL4KAaIYDNVtqUKJmsAbVuHmaOXbqmkFv+WW8mNm/XLL96/ME0QhRbQciByNoIAITka4IikhECc8uFRS2zikbzpQ9DnfBe2lsGNgVg6OxgzEUcxdLv9lzMkml2DBS2RfPlD0OvkjKpv6Aw2EYFj4tO9DNWRxBIEry/I6/i7CHNOqdtdXsRlrK7C/TkxxKpUqksTNVauCKRjCRGEIK27AdivYhO7I7Nal6j0aVVFWRL7DWwEw4Bo5F2IjgaJht5olQ801Uz7bzEC6aYB8l/AZmyxGZbSfCTD3+bGbGR6yyU4du1Wk3/IiZc18qFA530aBpXS/FDxul0/WoSce4KAj92Vx4YXhlmIv6Xf7YE+VJEClPir2fUF3vuj6KN0dvED6h2Kbk2qMD0fOiOKrEaKdqVIUSqi2q7SqsiuEBpZe9UfVo7DFDt81r73G6orEIF0/hIl6wT6nTaonuRgmzGlbp9fRwSE1IowaUIoQKDqfTQ2bFXbiRtHgkFotGXS5n2KDR66o2afV6n2GHAY0aoOHfE8u3+3f6D/pf83MGPxzyj/iP+rHfmZm/TQ44u5W6RF3Kzkc6eTZ8ma0MUjftLnbEB51D53zyCguWyUxMlN/RtFAAdGKkSyb1Td5gQ6Q+mPCDJi+5NAbifpj0pWaidN54I6SG6hbyH41Vu6Z6TM9sLWTq1CIUUgOnJhQvKv6wZ3NI4UkVlfzYZk/FZt01s0RC7THy4mHamLaGmNkplbPzoazs52xKp+xO2FgJ+pxOoUdLL8EgFwi44jpobLjvPn3AVt2gKR1vnD+y+J7Jt56+ZkBo35BYvWDd45vXcfVnDzUYQsOl42dPdz240G0Mbf1kb8e73/8+XLh0ejH8ec9wfuCiZ3/4M6a/Pl1Kwt3lh4EF5EUfMgiCWg86IVSraesZID0riYNQy11nMmkT6cSUMZ0otAMa90pa54ctTUkzm+qlfQMz2waeXnihTWFyGs+dH82cdXMpWbsyF1BVrUomz1n20Yskf6onS9fA4+VDwApWiTogqg0ZtUYHkNWsLKJrRI2OvqHGAp2Z7gRC5QnRqDJkkAaoCX6Av8pgsIJE+yxS8elUohCfotEdjGm2Km6f3Q0zx6vmnXjg7NWf3Biuc5jaepIhVVU3v7Lr7I3KONdT569DUoyG8hR8hu8wRbmvAGBQcNvBY9L70gO4lfsIef8Ie38rrEerT/P+LvAYfV9eU/437ObfJO9JfoPAbf8G48unvI/S9+TXz9UAGlASAJ78Y2uhIGAMGCPkQg0zJ/x44oTIg3eBn5tgawFnvv3A32LQy/0M7lasIl8aQCv48QHy7qkxhIQifkpUcdRDjuP0SvI0ptHo6ctqnagyZnS6sKPOmmtJNyZCdYlEuKUlHK5L08+s1ron8FPAjb+9ByiVnK5Y/q6o1RsyOkeiMRYOGVuK+Lt7crmEL0RuxsLhxBP4u6CxPDFutWcaqSuEzkBSGL6FxjlKJ6ZTRnaRN6yTHk5NOXnWz1MJtrO8EqrHSL38pBHAUtLpqdadyTXbLULlRjp3UpiJi9EFLZWQ111Q9oHM5rwQ3p9e92z9OT+rtq8nyasuT5rQ0WL2h2rjSr7KyplMcZfWZFVxWnfUZrJyCsWqxnhkebwm1Jm0W9jNPy1JNuu0QbM/3+TymMJKZVhrC7U4+xVNGn+qtkEwN/1D9IH/L38Ly0/ACF8Nf0qDujwFEN4PIB4nOYu7eZigm7ZpLyFzEF/9zk7+fBj51j8G3v/XfVt+ExKVkXsUeEEMfFzUchj6Qn4+qrRaiUb0kzG/P1rE+8eUSu+TpA1E2gr7q0GV38dzxiJ+Zr9fb4VWawg8hYtE4gzhfwUaaL4lMWX4rZNGyXdNs5V3R5eLTGvS/8zkwwze8KQzS1mg71wzGcI+yNQrSH5SUKkCg+2LcrVO7/r0ZfdNPoJ0drNPba3yOi2+wPbSV8yrNgatLU3tMHLd+s+2dPocK/95mbJHGawLhjsv7/zGXT0XQePHfPNzKvU/Cs3PfHvm2zPfnvn2zLdnvj3z7ZlvP9i31F8PctwPhS+bosa7qA3QlIF/LD8LqvZj9AXRFMx8ASTi2ez/YPm9/AXwfqHJIPAa6ZnoovcLHeRZ+Q9DI4rTWYKO4KSfed4tOMlz1f9ouYtIOd8U7iDlaGfK/a2wljyr/qFos1s4YBC062efFasMgu43c37/Kfn9vDm/k/bVrmPPIvcL8txIngvsOUl+P6K4ijyv/eC4lF+A94OvEvropOfSG+R5HXk+I6+f+fbMt2e+PfPtmW/PfHvm2zPf/g3fgh9CB/wBvx+YgBd0HgAG/MR+hahSZxQK97fxPmDDe4CAD+xRKMxOUMR7x3Q68wG8FzgTU/IiKY2ZkErEu+TVGcEayswG7sOzJ1nb4A9ccd6Vd6ojrt5cvk9YlEkton+8Z/6VT7s/d9sN97Xuu6Gho7D+RI5FO1i8mK6j/m+C3xEUBBpg+w5QEYwwwQgQDARaMlsTmlPEkYFc85Kl2ZZl8H81DyzLkT9ax2cIjMPcKhZvou4AhTKGsZVWTy8BGxMELa2VidWKVegUyMa5pRxe1pJdsjjXsmwgl13S39yyDP+kZdmyltyyZdN3zxT7j9G+Z7498+2Zb/8hv2VrmRC831rmb2fWMiEoPQF72Vomy6P8C/IowZtPKOfkMfwFeQzgtScMcp7pHwl3ll5SBEieqw4AXJ4QO1WWDMYAiI2pDKB+BEBUazNdAHaBAYD0YDvYCUYBlz8IyvSxCxwBx8gtv40kiBTGDjetymAkqswZhMABOA0g5bfxfBx8IlHYeul5LBxCHBjTjgT15U/bQ9M/OpYKKQL3MHqdsAh3Tn+G4SRKOJkYTtRxnYbgp+cYzS1H/95yEoX41nQF+AnLsS/JwOG0mf9paT2DPSAmsWgwZwA+hl/DGL9AK7OTFur2zqn5MVIawBADdDMowulxACFMbJ2aMuYLtDqkIlsdUwVWlDk0bT52CSmqNEbLKs0T7iyfw8oaOQBQ+bgUmogg3kPqQ4BiSmNMS8KMxhh24QGM9Hg73olHMaExLtPHLnyE4FjG/DaSICzhRo+R3UvgQIhp1dGfJXEchnLp0qZQ6phwJ6PDiUnS7isYblceoGGT/v44EYymcegLDCM4/Tz/07KH4bNCTAtkfLGmIX3qNfLqBVreTtJGtGlmkTtGmoV2CgxvxqxpEESnb5oCDJnT02+GLjnG/xQuo20TF64t15LyXOB/7TeLznjGbKbxp8ad3ozAamHKEGGhCLvEVrtop0Sx03LtjCh22GUfsCO9fbt9p33UTohiL9PHLvsR+zFyy28jCbIbn4TzgRU44fwxtZovwnn7BBqqyioUYe6WRDpRMEwRAcQwdTJ9XA7DUkq3eJ6SCVFZSxFqzjXTjZtWi81qoQ5q6ZTVMuVrVPMKH1frg6g7bQ7WX3+T8IRGr8V2v8+urzfyVsEabO1icc6m9/M/Kf2E1NcDriMDRjTYSIUBd4xDHKcmmIkhh+gYcbszjhFSwUEHHHAMOnY6sN5Bb7Y5jjl4h1wdN6mOUolpdTirFXCQo3TTaDNcgg66k+o0W50Cqw2sgqwukqfdTG2apS2spS+mbSjINfr7gkaFLZoaaF8W8QhLm6Lhnr6Mf7FBoVCE1KF8bS7mDadIH75XuHb6nv8L2hC8fxtOj/zFjQinbxM0QKUwEel28V6T31CdqaLnmPhV+gzyE2YLDTeqVJYbNWyAkIGLtRdpNPAiynHGiaQPJO8qkNganyA4Tx+Swh3CkEkKxZ1O5dI2aRcxbZzpR/yKvbVB8+b1vkV2H9rQmBi4Yk2s1qER9BDrFN3Ndz4i+pZ3sDB6pC2UwidLfaQt7OBWiltCwk2tMmZQHcOtCN1jBD2SiN2i5q/lM3KVJPn9JJI7DIdcS0+qV/Np63Ui4lH8U8RnvOBsd7fFjdbUxhdevDwUsamFW7+s5GL+czZFzUnySHhEmTALKFwF9OAyiX+7fRldEc4XVbxYpc/wvJrRdsu1jKuPD6yU0tY2KU02S6mnRuL6dqM7MwmgHohgCEwSUUF9kUo1UxlSF2kb+AR1g2tKxuEpof1KZbcn1n3B+d2NJo/iC5s23i1cFTY4naZg73nSWVuESM+DkrAJCODmvbBOpaHFvjhOUjJCJ/eRbsIBzAaGwUoGBsOttk7GMSLhWOuqJlwXdu4CkKA6BEYAPWVxAvCUz9JdRxyPLsJYuIhnWFNfHlNeOujpPMpwCe4TlaNpMJl7Y4rQOV/7uvuVX1ULmz67dCnDs/RA6bHy9eXbiJ4WE3UAiztVcICeOQhVtEEJKWZjD+4WRBqkTzEnmN5/yZHOr545bpXCHOas5QP8BjJZtIt+On/QgHF6MgioxKDHg3gbxu87WVBxYapQmSdKnyfzBGdl88T08wSu58OBy+afCtw3CNwuBjcneqh88UJFvNGDQbCNvD+N0PHqSUCpvPEGkTf4DZK8MX0VZy1N/O0wr5oDs3QBwfMT/EYyb2w47bxh1juggxXB5ontDu4DzhOs6Mr8gP/s/PCd00wP3I73mR4IPZ4k9Hjx74b7fzO3ffmDIA/f/bmgKa1hvH7hHF7vneH1mbnM/v04fbyd+ty9/OcZ/btv/eWM/h8Xr8sFzfSf/j543f0B8DpR4haUb2AxtxbtNVO89BSvKMELS3gZCV62G7Uc64fcIOmcuou0WnjRKBm6iYI8NZyC2PsFv532foDot/DEpwlu2r8Xbie+8YFw6+UWlJ75u+H2kb8ct3J5OlZ6rMSXbzMpqr5Sup1OaeXyiT2lx6Y/J7+zye8eIe9uld+p5XffIu8+Lb8zyO96yLug9G76a4DNkdOf5RYA49+t3+z+QPV/mtT/QQnfckSqQ2khmdMj5J1Q9ZVH6fMF5FmUng/ROpI803Kekpxn+tcEzkEZznz53afIu03yd3+Q3/WTd7Xyu2/K775I3l0hv3v7/b4j/egO4abScwo/4QtL58ilmhm5NDNXMLVoKjP74Kz4XBHP4ltPJub7iJcPv594ecvJ4iXB7QLCS3/zd+FZJ276IDxLRWi2+O9Js+hfTLN3f0Zotvrvw+ff/AA0m42tD46cEuN+118R4/50ce2VLPg+xwLxh7WVwFks2H31nGD3u7THtfg04e7p4eOnRLyXxOxqUTs3pH6cRsObGwf/b413j8sq/iHwJrPt0PNov7Rb53wK/woogBn/mugUx8QlSERiS1sGiTUpciFaFqJWCB/ajkbRQXQE8fR8xQR5PIKOIWHeFgR95P0x9Bri6C+DaAv57TUkKBFQF/GvRJ04yG3h0DEit01AwwFSmC0xNeH6ZWGra2riEyDhOE9SHOMzunrXxPREU9IcyAbmrgDxc+7fLJngf6TC4RT9K30nFQpl6J3w4EjpF+GmJvZDKJUKkRS8p84/3Qug2ZmBxXJZVJMbrPTWZnROguuYqDAX8a/FcxAewZQImBIBUyJgRgSiEI/ig0QL5vXYhxNMHebnbcHQR95SyyVH3w/iLeTD17CgxDSyFjJiIuoX8aSoRVjEooEUiQ2MNto5tKmQRqIMPYIXEmq8tHTKcHjwPGpDO4VOh7smXEspoWj/MCtCOfg+xHrsmVAKcu+lliLwzW+ehlxz6CXQFUoo7Da4GXHUNkqcs3k0Qk2TH4w8ozKB+FMIxPMQcZQ2aikLxnTb3CRRRaWYZHYMoEhNmWLYZMtA2jnDMdIvzdbMMBpBiJ4v+jiaQEcRPx+ZdTJRFVsU6JgCKibMlKjOClENhxj9KF0PS9QllCUEfokFP+lInEJkasU4nK+QmZA4lrbnzO9D5V/d9o3bvf/8eO70dD7//PdSepbO0tnQPz8AqkiXVJEuqaMdVE/D8JGuqZK6Jpa6plY/oqe011Pa6ynt9Yz2+u36Uf1B/RE9T0MyJsjNMT2hvR76yNtj+tf0HH0/qN9CPnxNLyj19ER00jWr9IRok+NavUjKm9hHOqdebxBkOoItAFGb+9/YOeeQKUaIOHeB+s0KvYqhZ/avrpCMf0cm1krSQyv0QnRNBYW5dUQnDIAlB4AOPy9WfdoGP2q7zoZsvMeDcBE/Pw5CyFjE+8ddLt5H90upVPgJef2li+qKefIHE4ajtBr5fKEgr8RkYvJJupVYn1YsneVptRAZDYWn70FWa8bdGOprzKZa1l47L/eVKl9dtDq02p6BkW+tWWZUaCN1A3dedPnBB16AXDiSavAtN9H1KYa3C/8XGU0e0LP3auttVkSG//N7XC4kmBnKPlRFUBVVdrtGgILZfBLG+UJaxjhPjwBoShYovkRujM5BNlZB1m5DruldcFXnqvQ30pflOtd8JFu31m6tbXXXDLgJoiq905a6+uLCxTdd+Glueay/3rvEpWLraEDP/yscJf3RDFzg0+Lg6w6osNvtMTt+xv6i/RU7dugNUGkw6LZZtluQBWgUQGfQIY3OBkywh/ztNI2a0F0mOGjaYtpmwibnDRo4oBnUbNFgDW8YdG5xjjrxcSccdR50ImcRZm5h1qqJl54pFAy/pEEmzischqQvvZR6/vBWU57cHSa13VqgXg5xGKSVU5Aqt0FSZwVV7dMpOJrMLHrYhyBMLnFcefnZa/25c89eKzyVrU828Dqt0JSZt3ND9AJmk/sT/xb8uMILouA/aJTRSfF6gyXzJftjdsRBCzwEn4dcBGbhAog9gWqztboaaAPAarCShtfuBFBabcM3kAFRowFagxZptB6lJ50BnojPmTf3mdeY7zM/auaVZoe5xnyR+WrzbWbBZDZGtJoqlUoQ9UafccA4aOTM2BiJUKYWqDJm9BFfZDCCxa7IQGR7ZGdkNMLvijweQf5IMoIiRbiYUunSrecVKEd6nh6+cjifOPwM3c57XqFAj6nOxynR0gZCxq2kh2w9LJ0WLQVnI+/ikpeIdDpoTAqpk5O7jtWiYHZwKnLBj5+3JKtQGfIao0tT47UkzTZTT7atocnuC3dnmxwB4dqagMuI7CFdr00XCvtaOpvsUbfX7LQzueur3M/gq/xTZN5YJba+iF5BbyDMoQkMsxhy2ILDhL3/Av4Bvg0xFI4A2AqghjC+OF3n48EkPo7JxMsjkDjseqkwAZ0J12GCPRmjckIGqsSE4au3tdy2aulS/qlXXvn0p09TNv8K/waPMT/BwSyZXDkLF+Yw9wvhD8LbAhbgyWUjJE7yx3nEjwAOJCZI2a7DpPD3lE0NqLk0fJUUvOq2Fu5nn/70K0zXKR+GEfiiwmuKam+jMVGqnvs5ABt3QxYiX21yZUDIrtMx/jquMlAh+X6a6uRUK6ca+Xe1nOpodp3Rlzmqm9Qhpw7CdpDIVizTNH5ElpT9p/IK+CL/qly2ouo5AN5eD3yiFYZEnZ4WLRhFIhIb2gfbMQFQyNKMQN67EEHNs3l5I3i29Dyo3Q2DFAWXP0NT0aCzZEDQEESbgkEjgUVEdwKjEJfiyqTKGzgb94wpyvMSDPTI9LdBTqxFIJl0ABENJmEyKSa3JbE+mUiOJHFyxGTNJEWbnVyIXpAENOgIDT4/c8aYBHNKgmmISTAJbC3BbwMYEk0cBhdc4KgR5TI4vIwimtIbM0PLoH7ZzmWjyw4u45Z9gLKpxT9LMaC7NSgO4bKP24tvJbRZJdUL+09cDyKii9AyF9WJUL8isWLnCrxCJHLJClGjz6ygwApZOd5OK+nSe3nBFOV+x/Lr0ep3LwYOUUNwj0ds1QTpTJEyeFYqK7P8BBDh6/xKUuZdUh5QM5On2qpSkjzhDyEPaIURfq/AEfrGaR5tgkC4mvQZE0YQhAJVZpHc+INdQRSkHUbKKbUN8594nebV9kh5yz8neWOik+a16yCgebeYoN/UZRox7TRxJrqa8qHDAM2lZVyWv5bAuEdqH7ijNEzqYIOgp6s2TdpnfWL94Prh9SPrd64X1ksdf7Z8roPl/aKct57kTYleCNx2UjpMZsQM0mcSmcHMlszODJ8RTeZMhg4K0sUyrJ23UnAfLiypTowurE7aDKwndImIGkKWBfNJpRDsYcco6YwZQ4+/B/VQtV5u2AouLP8XpfzgWZK/XrST/J5qggxihyeMuLGbIuFmkSKMGbfUcef0qQ8Hznvq0wBXEDhR0UDbuY9WiNwYFsFFMoBFBMBMdzsNHg3QQfLXiRaaP1At9RODf8S/04/9Mgz/hw8DDJIaj3OXkLH8qjzGfimNMUoPO0fpET11jA2WH5ybR1sL6DzlEc0QOGkWSCZzByIwrBkHKw5W+CnJpwhI+Qwx7qdgI7hxJv/logqDRb2syGL552ITDf0mIhNhz6awOWzhMVhoWIgWUrALZ19/ziQg6KCcSrKFEKkDOI44UNKxnRpEKCo7HAcdnANIjgLZbIGiVKC1iUv1aSFzxbjwo5n6JECNIIIE4xlut9tkYnRkp3KwLkqKcIta7UynmDt2+06B1QSWE1id4xymtfqZaPN4CDz6pPcP+YdJw1DU/RJcQ8YvarSsjSTAEuQsi+XVi//Amwnc/2Bz4Y/gjvJK4BVVsMXnc7lEGKAqjt6c0QdggA0dadwtLr2L/4CHK/kIr777nTCpm5G0r89HCQxHg3AiKM2LRjObF8fVmkxQHr5ys7N4YqVfcFWzsLS1aKTcAsK7oY+ibybTz5APRhhUuM2/3Y/8EmsqyHReXNoyFxdSh9ffvpfwRhUEEZ8VSHUQq8iwSwbEABIDxwIowBasZ+fPk3AwxCQcWB96FtYT3qRCIBTSWkUJJ+tcnFB4DlbSPJ+Nz9LWNlOvONzB3QHiopfRyGolNAqLFmsmLGqrMobwQHhbeGeYC1Mqx0+iD4UjGGfgNMHr+VsIb7FwbPIJEUis4WuO1KAaSmbSkWrk8Si3NIPTWd4sfI47SOAcl+qIf8+xOnKPk4IyohWBpf0qOs76FoZIvZbQIbGE1lejUmeWwEWixsAYTpY0oTTxS7yv/CDXReFqH5TgknoyuGh1Ba4oNjcTuJ3tLgK3m8LtrsDthh0UbsffDS7oLN0n3I1XSXSg45LVv2mc0HBhkbnrkbG+cCFgfG6JqJWIQC2wS2jnZURlI5PiWLqP68JZCUcKi+HGYLXPwGpvl2B1U1jdMqzu/0lYUh35Z2famtWR8nL8e74dnCXqBJ4DhVUhBovV2jdTa/KTgUgCQ0QO4Na/HwlkIYfenoQ/LVNuL4Y/mz92zJZ59hIXK7N9pkxWI1rmWYmzhs4aOYs76/2q949RJhlHS5Q/YP3nP6VxTWZHAMJ0jgYLupy0qB4KqkcG1SOBmpUVykuE7+NOgvPDUn78+5n8uSYTzd9M8zfL+Zs/3PyUDyh/wPqGhH8DfzWhVUi0ES5CZAwn1Q6QYVFi0dCikUXcotPJs8L3Gc0fntOnakUdzd+WNbH8rTNSV2uiFbVKUpcM5cODwT0srCH1eF2CgVYTGE2igcLogZ/t6QkEKJj5TCukYOYn5u+cPzqfmz8DqiC3KZG78G8YPmMSLLCLwEqJ1ZTFduUV1bT/+DqhoTPROdK5s3O0k++URZ9OymovPVl+wk8L9QTWuAzran4XpS+FVRNUGymsRKwrNhQbiXGx09EXxxgue+T8GwkuGVFH86cb7H6aP1Usj1BxOMX4nY5MIKlEajSFU/L0UQFI6hYrPygM4J8Q3aUgza8c0V1BdjeKs7m5OkPTMZWeSNj/W9TG43ROq6e8tF7uQPVAYqCS/kr5MrUpmqJVz1LdncyRAPjFKgTCQR3JGqJZQ3LWkJw1K+dz4f8i+X5wUj6L30sFZB/N55Pz+WbzSfjzIQl/Og9Q/A20Hku4+yv48J+S8DFEKVxay/IhogqfI+ZwjagmQ76mRqcTZRyxL/ZaDG2P7YyhBGmDnTEcE8mUTkQGXSZ2ugokZtTtOTRwsTJ/8J4y54u1OMzKDIfValKm36smZe4MwRCV/UP0XI7Q6apbUYZlO0GMzVOz7VaZp0iXzrL5gAAD2bidjZUkHfFJGVzydHPLSW2WqAGghloFEKgPQgYhRiHEZAixGQhynyb557bdnPw1Xil/iOY/mWyz+kBvuZN7mPuKKWpyS22Hejh35T2/aeZ9A0pyvwA0OH9E1cl9GTSBjeO4sdFcxM/tqQfpQITe6DRal/87eD8IgBi5OkAd3r/P6tBrdTo9M183NlFrNoYaFdMx0kdTUynq9JQ2/Or5KcP0r6Zg4kep1PSPDUefn0onDlNDVZDasnkuEEzAHBfwR5gfFHlkQb2ac1a6ZcyS9oeZ+c/WBlWd/V80CJrhUqEULn3kyd+/JEA33Iq7kOrW3k+duL40cl3/6ptWP/1/7rlsA1yOF5Y2rnN09sPIA5irT+Xth7T5i6vbIt3zLjtraEGi/5aeld2OQOfAA2ti0j4I4R1S9xiYdwDo8XN7Qa2ixhPoVuPngA24SY09IESuFhAllTValNTyLdCKTs9Uj9TtGcOLcixCnqulZ8BFZO+u09ZKeOepK0tfKq0sfbR0L7wO2eA1l/7ifWqC/vhqX2My/61EVf176yDhrxAJ/kmwZhw3NJhIk+2Lg5S6yR9mdXACH0HYT7EHdlBL6mCxa1i7NSRpgqHUbKzVTqnSexrsv6+Z1F4KkbXXJ0rF0obSgtKX/ps6zrRWsvF9Ksoai/FXC6nvlfwxwq9Nki7E/bjcDtrFCIL+3tHeg71HerleKuOD3t5QiEj9ib6uvtE+PNQ30Yf62IDRZProLMLUIjonzZkHKFyzBBdeT+C2EBUGHvQe8SKvqNVngNer11OYga7AaAAPBSaIciPDDJwWJudlMC1zYLaKIaKv5Q7mjuRwjmGay8ViFGprV+toKx5qnWhlszGF2noSVFL/BgLziJAmfApIXBBexH8D9O1BhsVwMZ1aNFVkavm+WLd4cXW1CFyg2uAyVHNI37+tf7T/YP9r/Xy/GEhk+sk8Ri/GTL+sqRJtOr41O0ML4WCFFoTfLhdaQNt+OOmFBi/0Utx8oYyX6epkKkt5vVVVIjT4unwDvm0+zic2dzIuy4y5FP85c+2HDxc0ELl0Lk0ScAeY4ZgrljXWUo45IGrNmQGZYw7M5ZhA5tlz21+bYPaMGsnmyLguuQlRGKfluh8WDKl/C8cJDOvJ/Rsj/1mjZx086wiRn1mvOess0r8xSqzoWjG6Ag+tmFiBVsi9ZsX79G8FInBtJ/dvjA7WHqlFtax/19aS/k1g1nfVj9bjofqJelQvw6x/n/7NYNpP7t8Yjc47OO/IPDyPYTpvXk0Nhbqga8HoAjy0YGIBWiBDXXBq/7aUl8ytP9Hjvzojb686i+smcFbSuW+lTMGV75XX59ZTGwe7ZvInalkTNNL8jXL+xvfmn1MnQRu3VHIvmmeltFlIcy+Ucy+czV1pO2obk3DXL8aLFH3gJ1SGWEclyFw5s44O0Y4sTcZTzexxPNogpYEwS0WbyZIB64bWIbBOXLd8HQbr1nk8Ium6vxc9JndG2QcVizcuvXzp/gGOQD62Fg6u3bJ2ci1eWzFAraXmKPo07nBLaXsHS0V1b5n82pddS9XQkfGNZakmTRtoOrnHmyRaKUhk45J8RP/bSoVtukQXr6zszMrdMVZXm1TX8h9JXd+ldU1T0K3lTJqC7uiU0lheSkklaSoaaSXTy9NDaQzSaSK51RTLRymFYnIanX1+a9wTo+mkSCSXjCUWjiFnEArBy0KXhS+LvBJ9IypQQqTgYGpLapKI5RVCpCghUjIhUjIhUhVCpAghUtTGxAjBpMO6DTSdHPfU0vTne5zuDPBJBDmVIpfKq1yFClHAnDERqIwJiS4QMvvR8iUQLBGXLF+yY8muJY8vEZbQotvKkrpPCMXSWKtkBlITSoElS4JBsVumhCinXbPPjDIipUycUkYMi0ho29i+sWNj5+Xtl3dc3rlPfKXrjS41JU8/HOzf0j/Zj/sr5Omn5OmXydMvk6e/Qp5+Qp5+2CKTp0UmT4tMnpYKeVpOS54KdeISn5b0voWgitMp/IRPw4rtEG4Ao6IGgrwhvyv/eJ7Lk+JEtcaQAfk8mRSZhS3COsEITaNySk+FHVeVM7VyyjqPKky/e5ym5LvHRTW5ga3iORsyTLeN+YMZ0JpsHWnd1crpiZI72LqllQOthlZ/61DrcOtBMu8qWgHbFeYuZwRmy5LMzfHZNc3CnDWiR2hdtN+T6lK+n9Rlch8EdoMd2WmBNTpSDbuZM4oOsWZexkovFnpxjMwvZ6z0YqGXKsZMymxBlaZaOdXIqVpOVbTy9jI92Jqlitn3JLXR9xN7SAqt9MX8BRmr3K9oOtaWtUoWGU0GWJPWEesuK2ewDpObHdYjVn6I3B60YqtsYZ9T6TmV35r9/3vd5T4cqPRholstE74EXt4PAZHdjrbiYvlfRENrazgs5sXujZkWevmbenFEQ/hA1BBF0JAfZoNkIs+D/BB5wFvy2/KT+eNs2EyMrc6y5GyWjC/uz7C0ZyFLx7qlX9tZImrWlTN5KgLmT+nwlRpTDbwwlwCFuW0fqLQ90cKfE74EMak/O9GeHXRf38gOuh8jLIayJqvZrNOJlpGzN5AuEDsrYxZjGz7Uhhdj5IYTOCWnwtBgGbbssjxumbDwwDJEHvAWyzbLpOW4hbNIVLJIVLLIVLLIVLJIVLJIVLIwJkmoZKFUsoD3I4zM5Spn05+hz5+nz6njR78YJcn8qKF2d2rjG+vNMlNfYzLD0li9lFrtLB1TmwjJ/m1vZyeZHGrp/OeopsOGpTE5jc6+/+uHnZMNO4hRuRvCyW64vHuoe7j7eDfHbNabypLtevUaKe1dJKVk/pTWRMjM2E1n1+7TDi8yIxJpt3AqkU6RI+b2IyJHHCLy1e9FNXV9qIYT1bCaAm5uy7DU7mHpmM5I6POfe6urlUrxQ+1C3tkuRDAYdG9xT7rxcveQe9h93M25ZaK4ZaK4ZaK4ZaJIa66EKG5KFDeYpUP2ZC5TESDO0EDWBxeWCpyO6bbSeOmH9eXLwdX7qUrZaehExfKLYrSzk9o8UYe4MNshtndnOsSm5gw82HGk41gHPtoBO8Szz850UNqQDxg63eyRqiAsra1nqajyhUlmMk12zAzowqVMHaiY72U9F36b4sTaRdAmfk5PtLITlAIes6Tlyt4D2or3wMk2978tP1hQOpvLclcSmmDZBtJe2g26RDMCsYiWE1FUXLosExXb2uhYpnsrMpljUbgzOhotRzGIJqJd0W3R7VE+Wpnx5/jelB+Er9N1ZO0p9nazkSeQTdSQbCpK2p/pZHv7X5OP1OVTc+tCdOgVbz8OOkUtRiNxKLliNRQlZTkhp42MxZAbjDK0sTJF/AvQRX0hpIk6O+N3VcFnjt8V0WTtFCWM/Kf31fpAecCC8mYuS9dP+CvltcB6vh3U7KVtGIfF8huiIR5RSm1aZ6hL1OG6yhpMpT/JvlIeUq4gt6ebu4f6SnFgaX9tWuQMSxJLhpbsXHJwyVGiNZ3sK1W6j+tgeRWyTeknJG/dAcCVfytWRyJ6PckeToRHwjvDB8NHw8fDijBdGAhXnFo+HBjUJxBfgS0zfoZ62PzOz8GFlHaGHHw8B8mVavBVuZzRKN7RABscZN7M0ldejTFjM2j0pDlBI9zWONo42YjFxuHGkcZdjVwj5UgOh2SwUGskgwWdZGlrFwgVL91aGRcMB+5EBQfmAzEMmscwW3wSA3Qxlq040RUMon9T30NkSHYlB5LDyZEknwQVN0PaupD0aR+3F/GgGfxQdDtSUJGCzQH4ST/c6L/cj1b64QI/VBohbnoSPw8wiFF/dw2ngViDNT7QYjdXF/HTotbiCrsQckHkcvmK5Budwwx4A48a+AYehqhfeZWoh016CPQGvV+P9UX8omhY44SLnDDvhE67o9rlan5S8jiH+VuY03n6MPWNL3SRvykjPbC5ABM/nko5E4PkhSlvmCAvHQkacsMw1ZQEg9JxfgW6u95PPebpJi6rZdajPqfIRuzMji2fD8Qi1lGfdfprG+T2jpaeK7QOJ8ye4rbygesfEU2N/wZDNa6m/DcuH93+sVv1yjrj/GbbFf/Wf+4ojNQEdIJKH/nViraWJV+5/KZw/zUd91jiKy9ZvKOzzladMCl5jDk87zcL7TO+nJsqvpxVPwLPTj/CfGR35HbljuZwSy6XSIhQn+/Ko7zsjzPDry6Fr3N/InlXy3mV5RbQJIYxsFppU2+xb7OjhB3q7T57l33QztlFgyljF6N1GTuYXWr7kGHJfXH3TF+shSu4OtBCY2P8UXQ2xGtqRJSsF+u312NqbRypn6w/Xs/Xs0lIb8zU0/5ZP+t9KPm8Ej5B+mOFTvqlUCz9CuSp7MikLpu6KgO6c1Yd5TatYl/2SOuxiildl2kl3YpwyUtP8d2gfjpzfDdqT/Ld6BLD1IZ87kBI8tRRScv1KxIrhlaMrOBWUDcdc2aRzNcXSQuL8mw1Z76jvjVz/CZqT/KbkMtY3OOiZbS3NzezMvoSfUN9I31cH3WtMUvTNCmj4/+9MiRfBu4AodV/SW3Kn89sq0a8fQH1AKUzRA+d6E52xpjVHcsPCt+n+bWPybrzW9IsiUEuayeZm2nmkz0pYPxvziv7G1D+vlfuiyKoAU27URuTzf2ZNtZ7qowZQxsEbflUi4iGWkkPIhDpAszWWX9yigd+msHaJ8Oqn1mRD6u491uRr9QBx1je/fI8c4+cV59oUKlE1EjznmyZliY6BBLlG+AzYC2LIZcRnQpe4DAECBF5dJiH/E4FVCgQIK8ShDGmElsPX5rPw0SaPhkO0zOUIopYTg9jOfhM846W+eSv8eL6iy8jf3RvDQZtpefgkfLPGXwNOCZmINt4QIjz/7D3JvBVVdf++Fl7n+Hem+QOSW5u5tzkTplvcoeEhCEnIQkhARIGGdQYsExqKwQBxREUUNQWnKjWVKkDzkVRmWwf9BWpA1Fa+9T3FLS+Dq99Reh7nVRy8197n3OnJKhY+/99Pv/fX7y549nru9Zea69h77O3hYANdUcV1I45IUGd2BYSBNmYYjCZ+Lcm/NZkUBkgkQfJ+KEg4oeirMpqoC0kq9nFIVk2mAzGFJXH3cVeHn+rqemOUEoKiLKkqDzgntTGA2/+xbEkjoL+fv3OrQZ+Blz0NWNRv2Ou76LeCn4SeNIbvoPYiB/U1kgoDCkqEGfDjXUQwj9z8DFtoXvhefi4Fh9MLumR38Ovhas0ucBcdUKK0WQwqZhjbDU9aCLXm6Db1GdaYWIyWKdsUe5T6KUKNChTlQUKLVeAWpQihaRLMfmwS1WxRyS1IgiiVXSKNEuTFaasKKbNsB3IElgDpA7aYS5QD2BXgBWwEQpE4FvvTMZGtgk7BLJBgB5hobCS3yZiEGUL6oKiwHbDTgNZY9hkIO2GuYalBho2QJbBayAmg8WIfaP3hGqvrQ+lqCUe7AbCNnyxUardzsi2n0PJa2JGwTGdqkh4x50pdsRgr65m+FYTLn7dp32Z7Y/JfeSX7OPYh5puZuDDhw/4decj09bjw4mPcdep10U+xj/1+OB28NzwtdAltPP+uFat5WJV3fUhUZVlLh72RiCyaJGKJL9EiylTLvXibSFFnT5Py+s6OjQ1s+a5QkzH1tNtdAelXNX6ma6xvCfOK/gHNaCBbH/uYCJmB8NbW3KRey0+qtuz2zfiQ7Onbw2vhLuFel1vzGqWpjeOnJBJ9VaFEizmefyMa0Yafs7YMES7mX3DuzsHvxHYvaXVk0NELarAP+k5IexwlpY+752spac2e04IVUCRJLXIFYraVHVQY9aV6wpZFAhRVA9mikb2I6YHKl7Guh8o2yjxBfyUC6JCYHyyTuSS0N6yTmVmlPgZcAPT7Ey/dzVuernRNwmfx2XH+/vukqUlrfhw4CO3vaB9Az4y8RGb75dvkH+OccQSfU5tpfyJvr7LUF+vKMzXN9V1162vO1gn1o1c36XPp/48ul4g6Xqhp6eggF/f3d29vvtgt9idfD3bzhFc5EdwM/ZjxvNUEsh++n38nN/veLi2xhYutuPXrsWL2fj+F+Eh0czvs3pLu88Kf9mFHqqKVlN/RlVGdYZfrtk3/O7zqVksl+PP1fpzlf5cqT9jYv+XFy64YO1alXkAnon3azT+R3yT0/hljEaNmiI4TTWmHtNCk8gqGqrJmBsyCX4rWHk7XV1Ll7J2qtERV1fws6FnD7tFs/S6jpXdl/XKJ5VCB4vPXtqzeHFGhkqWM/VJzwrh8/rdRWH2dncjf1IzmltC6nLoWX5sOalZri4/vZwuF6qj1fOo321GGm9KJ3SsjMZipNGuGomlq8vrVcl8ncJ8jcJ8jcL8GIX50DP/2HxSM1+df3o+nZ9EgfHA5C23RHmQbDAH49V5e3YGjgSINhle7A6xZzU/0x4S5jjnqHOogLEbcc6pwdcrMYjbNkdmNfuMOd2BCerDkx5uehg14iLVmBW6CGXFVkVoc0C9mj41M/lzmr/UaX6INBftqTFgFkd44OMp1QIgZ4n27Mjjz6oJQ6yVretbt7Wiof1JTW1tsteo2+077WwnApbRp2CnkRmqsSM0g5HWqPNZ13CFoPObz+ddtD47SmrgG8LFz5FuPpqZUkM93Qu7ibm7m60qnLlPmwnhzxMn8efd48PsSZsJmVkzc/3MHTNF68yV+GLbzDdnSgvx5cGZdGZ8JoSvsI/yzWn/MoH2sudICy/LsvWMH6nmlqaaoEpraYAGKWnWATTrAJo1AM0xAM01zeubdzSL1uaV+GJb85vNEiuyHmymzXEAvfH7AXl/83rgWwlzL/1MZ19RvTNnTpigEuuslbN2zHp21qFZkjBrIb6h/llNs1bgJx/OOj1LnqWVuGdpJe5Zeol7ll7inqWVuGdpJW7+6QXDoVnYGfHatp7faPIojspDx7JKrSArmqCkqSkYRCwtK1t2tDzbcqhFEloW4hvqb2lqWYGffNhyukVu0bC0aFhadCwtOpYWDUuLhqVFx9IyAktveLRctJq6sEI1sxh/dtPsntkLZ++YLTGly5k9W+A5TB/K5MNZtIfL6PQscZZevZylVy9n6dXLWXr1cla0ejmLVS9nJVUvo6WcMeSCWOYjlqUvIknLVIwsjqg5UyejkjAIKIoPW2gPF83pFrFFh9CiQ2jRIbToEFqiEFoYhJYxIDBZRF5KHNcsXfDn4V8IRWxdArcSMyaXNd1qN7m+uzslReXqHcOO1yaMV5Yu8iO8tmQ3Xrtv+BequakpO5sB72TLpjqZiUZdBQj94KEfSS8KbuHjF7Od6J2dbKI8q1gr+tl48e85NTvVGioyAjUaLQ5LQVGBv4CmiQVFTuCbLhZhyMWdsGrDWJC62I4IxEotRcXFyj7609160JaSaguxo1NpSpaNNZ6lhvD5P55Pt7PnQy/i17YCByu9pKlCljULfZ2NZhXEaXgL/NYjgQrQb9eefjK9gbnubOsRHiLzTU4acvxCtp8FQMfQz+dYDwfQ5+fwiCibHcnc1xvd+UXhO+BolRS+G066LdOCXpPXT9jN//igH5ma1IECjOjNqXKKw7OoqPRpQgq7coNT1GsffOX60px75kteq/+XxgtTzWsqJmdGzgxFCqdMh0nnP7fhioG9mzYxX/yM8D59DmWcL1ympqRZzZkhs9VWxKZ4/0u1ItfEDlki3+RKZJtS/Ew1qbLBIjjALjm4YCaEHEYLk6TVKLInodDot7590vpLJgFgO0Vk+/1vs61Bj7BN+nikU8EOj1a0O9PZaseMYCYvHCl8XwP6nOyu+Zf/2Tv56uaOYG5XoVgTnHX+LbdWXwxPFW8pFleVvXHft2568nwIF64tfPzoB7elpRVpumZJslnZ/Bp+7HiBktlM1370woUXlpervMjq1+oUliS7iv9+Mvv9d1+YNs1qjf8eB8TEPWWu/7GQxjbR+SdsoYNiPPEcmPxHho6MvVfOSW2nHDpyd5wfJG2KE9tDI/JHaRdkc9y5wn+/mO40mNn+vB+qRvbCWlbJevvvL2Q6QrkpbEeplAw1QzWkhjKyrdlsoykt6FVzTPYQS7y6lRXKDcpW5aByShlWjE1UOaALYc7XKYTlubkWsC63+IcOs5PMzyIKpk7ay8PWw/qrQ7U1Ap/yYUJyZMU2lFL4/mvaRlNcXk5Y3BFaPjO7NCM1zUcv7CydVTYzozkTpffa1L4aj8NcNX1+ic05m9nJdkxAfiIdEIxCp1q9Wt4okzq5XSZUFoliTGFJJxFDSqsyR1mtbFTuRmpERD4woMbAnxm39dhgekMv+HutJ44fSmfZXm1NscvGN563BelPBiL7IvthCZQP0LehYyDyNpQn0z1fbXBTyKJwt/yITFbJMFlGM3LLIZkmoaCyYZuyQyEbFViJ+X4ChCCmhwgjEQP7L4YjI47jBx8PYFdsHYgo8ImQjKNVLRPlTJmhEEcQNv6A0VyvbFMoo2uM000mexaKMIW+MzBUT15NoGcQxqnOnRIQTNRlg0mgVkookZQdMtwhw0p5vUxkJMNY84+iMZqEVDhwppPu0fKQyTEac9XgXhmQmz0K3MeEZjBJ4l4RHhdBlAx3ybBZhitlQEnDEQIdZD7BRJFxh3Sjgj0U6MXuDTL67EOdSyPUG0FHsHQ2TMGulUyRo7CpD/+EknEYhYCa/SSFuRwKE6wkInk5oQsHkYxOJK5DxVAPxRqb34ts1IigEiGJfdCR0L4itKhelJ1RpHsoUFF+RYK7JFgtwRIJ2qW5EqmXQEJqcoLC6KzpRLWeq9c0dqhwNqoI6snRvqGtpH8ELy2qK8YFkrufwmOyxhrZw8WKKmLAtM+PdBgFm6aPce6i8oNYF6IAv/cXVBOylTF3fcRCr0juxxbVoysKskhguwTLpCslch7TH+A8K9tk0BTGfzaaI0n+8Fe6NC8dukgcp9EjV3N51qmFXJ5sX19NpBuluyUyV1oqERSkrLMXFWHvCBmSqwciS2bHektTCAQX42et2rlcgVtEuInClRTm0+UU7SxEWylFdWR2r6nqz0TwMpkqd8kPo7rcJMNqGXyawl7DFBaIkqyufUkKy8pI+lgg9ELvCL2dtYyrlHh46HXy6yn4R8/j/bG+Xqqqm+kR+jb9LRU5yDrazpDCJvme2CCJaiDCOt71DzGAd6Pp4jjB7Dmq3w1+vy1oC/aOBBcfpzguWxzYIqhG6UX2M2A7QAVnEq5JaskAhXV0CyU7ZZgnL0sA8wWWNdq2OL3rIJ1pPFLrJ1uTaPWq9Q/LQL5HniTkGnIbIcsJXECgk8SNGUesTTKs5TaA5Ov58By1Acazpo+J6ihw1vv0LgFHApTv/n2A9QvDon5C9yf3iSyE1AJAF0QJodJd4sMiIetFuEKExSLMxU5AqgGtaX+McT5mRo3btAyNW7piymcXiI/G2tb1vk0tu4Xei01ryn8M+9DL1X+btEMiq6QbJfKN0UNJshEIvYlmMHMZapgm2H8jFRo9T8wOrlanlymwRXxCJGvoJkqWU2ijUEehnIJCHUhepropXCXei75IUlhfoK1v4Kag20E+gZQEU0i2hZGmMLYtdPRrtnDpmePihPozx6krGatRWKNOfUSBexjc+xAwvUqETQTWEtjINkVqo2so2i3NokmayH06mi1ZycCObRR9XIIJOtqnYeT/RWGG4zhnwiQ0jaF+hvNlsmX3CJyL1fHcSh1soyZ0pj+QyRMi3C8iblhH4JskyQmtkm88u7kmwYpBggRYtjisfijEjo7sY7BuhDTdb3gS/IYHbfVuZiebZfIMhfso3EJHekTdagZHkI4Jg9ltMIHq9k/QWBjJMvpOsm6dp4ZXc8f0qATzJHiSE7yVwlMEBgjcSmA5uYqQBjKVaTNzLFREtWdDe8Df0JBgOzrbUQhJ5ooIXnhPQ/DZiRPSSHsarzofkuAeCW6U4EoJnqAQcytoVAmehLPbm0RwlBVpfL5K6xmN3Bif16o9W/jg8xqF73IOV2sKSUop2JkdwRQZ+/8pkaAGXC2CVWSOI25ZokS4VbGga5uMnyMHaDc4gARH9H9fXAFi4kiyoolrYTqzIutnp6Xbqz87LVoTsRqF29UFt3KsGIBpQOczc2+PYqUIVjfwG2V4UgS6TmTmRjNF4ANwCZp5gsYYeTjKbUsDzYekkWrbp42H7AG9faOwR01r4jo4DyaiaZ0pZ+BfpXvXa/0Zx3+12oXgFTlRyprRP6aA5qMR91MIFqETEdBhJCk4whUMCHcOQyxwxGNDRpga4BjikRaHor4EKtHihvoZ2m3kW4QmYV2oNmj29l0JogMCimmbvENmIPs5zi1j4NORjY0rof9HIVoHG8CGahrZzxBNxuFnf5L8eFx1twhrxc0i2cm19QkAEImsGJk7k9F+/INRt8U2w9MNvwyiVh/JZ2R+8KcBpPDpR1JhtH1ub7LQrpZdBahFAI9gbCXehc4RzX0LuY8QkQB3m+wcCfSc3E/6R1qdLm/dWzLLm7Aaehixz94X3YxWS4yXStX+lAzzWU+iARlFCSWo+6BBJrokJvjI5YNiJqn9kRdnwvUEpMLIvstgnaZjLbF+61ar7lJgijJPIZgfYXi9hcJVFPaQI1xErK9ECZNBhTCCsRzwUGDs0VrrJl+8m57tgvu10DQUOYr04/lKHEOXWvqS8rpC1iqwTAENxkjaKFFxhMMYE0Ey/Ucjhzo4fYwJLo0cR/pDPyFNI+nPUatLZciRIUWGNxV4iWN4gp4NhuY0Pg8EjALynch/aILA7PSeyKcI5MxbtCoJh0G4SG24RYIyCVIk9J1bCBlHOjD+oydleA+RybBThGcI3I86JYnMi3Afgq4k6kfOYkG6CaGeSTFAGyK/0wCJb/wd0Xz2WzFXw6LrdljNR2r3c9d1CYH5qEAE9VlEasBzZX8wpnbJXsQHXJV3dcHAgJQZ+VdN6RJzcfTNC5T7FPI9GW6RYZ0M4+QOmWSjY9ScBEobiRiiRDAfT2AIYoRYzYPz8nbkfi0lFiJvD/BcdXtCHOAeRzsouVN5SCFLlDUKuSU2CCExiQUi1BjtUeugLZhErVeL3caor2D2OGUg8g4LPJLpub4rPyaThxW4UblTIVcoMRcSI2c4G7m+RHojqxq8jkKbR8iyXS29W3pEImslGAcdSOsRGV2D5l6JnsWimpCYiiRLkw1BfZpujCJJ3x4YGqf51JaEOKd2I8u50MlPkcAgaeE06snVXE9ibh6HKZHiv3g/6gYz1qCR7Nj3RxbPgWpYxFNFGFgROUQWJtlrr1p3QIF9Mmzk9SP6EC9AbJZ0RAs4DM3LMBhkjHDTejjAoARGQxnlaJbMhE4+gqFUBi6K7EFVCyWPH/Vq3sOcPhKP+TdF4z9hsBgcyfrIostNGiXUrIGLIw9gYigk+4CZau0q6U6JLJZgrgStEoQl8EmYiq0WSbuI4e3jei6FLkLkmqYkDlVjhJiJZZiCOahhqGa/XjLUH80D4/0+Xa2co0nbIMITBOMjiNVIGLWNemTFqUbDWr+frTYZo89HlEeWdMHeX3G+F0dmRM5jG5vExyKFnfF4twRrtOrSUonOFdeKZAq6g0SeWZR7FrZ7R/CdGOsu7oA5nHJv5BmyaVTdRKvYvYrUMWF8mdLl8QDyIR7uvCd9JpGjEhzicf5tBK76ykYAIxRQN4aZvWjXM3muSKdMGrqSXjm6bjJRKwhsiseJZRR2cICvS+9J5DvcPhOsgvkyDBlFQrXBz4HAOLKxsI2IwKIR7KxeTA47eHLIgPWTrR8n47pIrUdQaynU0ymUaAPTRh0RetjE3DAJkeELEY2ZFSKey6CaZ4UMTzs0k2VJePyqfee5WOiowk0v3AzpzIV3jh9ysAwwWV/61fYdnEnMBJfwZPAHEmyTYBM31joJ3hPhVRG2iztFcqUIdxO4ZYQVjbCes6pK3H6Tyzm98ANWzkH2z/z276Pywzlq4FMR/l38PSePo+YdEqyX4HURHkM0IiTUYb6cJcEIY0JVncXJt6CaXpEkm4vVCaijvOwyP54walUXXrbgeTr6kdtRJDED4kGuQU+3kiKOhFwL+sa2m0uhEeHw7NBafmaqWD/SblapUzS7eVeKIWNV0Rgy7M079emB/RLcgEEkidlQNBoUjPEM5qxdBvEOG2FDl0IrtyHMAq3uM4306PpkjFep0x7jGPdJLA1khR9SRyGK8AcaPEyk58iLZfIA+SFBlHBdgmmdE9DRSG1xpOdDQMsArVVncshl+pxO4jg0aR5ilbRSKR8nOcg75Ydkgoa/RsZM9UmR3PpV0cHZkF0TzQStVZ8dBgHdVxwXW5Wbv1m3uXvhcSDAwmYj028iKFoWOCqFSs4CkcT3Tw2gGn12MWaBcZuShWo1myd6IisVoHo8jAq7XtzGOGKl0b5eP285XrOPG8ul0IZN+s64xIVMjt4Y3kmq+zb5fvkpmS6QL5HJoyJsFtkw+mVSv96R2d/uS+EiMlEqHOrvIe8l0jEKq9Upr8rQLkM9Ty3uwdFJgbv1bPAIhb0UnqZwG72fkusoLKCXUKJB0PIh1nms775MWjai92JpyNuRey6FfRhJY4LoGrpvOnkvNn/hTbSBT7RC3hGZtskQkqFchp+hs1PuVshSBdp4xnazBEt58Y0dPUpuo3BdVGRxvORLpLAjPF5CMvv8pbBXSybDQ6+jOPVJjESs96rf+IsMR7ijQ31fIAOf4UW8f6EMMrpo7MmdCmxTgM3xkm8qME+BChQ8g79ZInMkeIbCNUzql3zVBHRERDGal4cir2q84Gg9b+iTDvKeXoSO88Lin66XJbhNgqslWC7B+cyHtUukXGLTl7fxkAJjbVShbciueLdIHiS7CMEvrv+KGWrcqcWAbo/8m6Yg4oZITht5T6vy6Th1G5youm4WvyuSp5HsVgRBvkWuw6CQ5avs0MdRKWuCF+tLylnRVvYNiAeG3pnBTCUh/pWFoJr/fTYTcxm5htCpBMYlJMRaXTU4Kh3WW2bBdf8c8p+Ynw5tvZT8JCl3CKjZl8jr5LhhYSzErWpETppQnI7at013dPvmwPWwhCUoP1oG63j+G2//AjWMRs0T3ykK7JfhZq6XS2XYr9U4CCSQVhBHUkLMNOzI2RRspHnsn6PXWnAofvV8+HZkP7lmZK1ltuo/iinxjxR4SYbtMis3sam+q9h0hg6DqbnM5v1Qeb5EdNo3quZzdI5easFQEHE8MDRAbx6Zz1ykjpvDs6ccCf5bhg9kGJRZSL9YZlOKtAhjZ5ZWx9SYxWdMNIYvjs5gpA5vjXw0Bwb4IMfw/OLMJvHSGB49NhunFv5VhJ+JcDN9TMtodN3VyJ4lDospmeZSUBMGGJFfzISbYFJSnaBRLdpOd1LyBLPc+wm5Nh5mobCpNhMSHFEeiNUjaLTW8nGkT5u5uiWiDLAMNbH2MVF1titQr4BRYcODMZZxsD5lXBiTQu3RlbuEMku0psPS7gFWcBmxfmS8WrSTz48hxZDCsq5olWVUSecLKEULOpxc5G0eO8TlNkl1rZZ4TfcJQpEKj1Vny5BQWjGMXVrR9WCsJTEDESWW4+p0pqqlWkKJ7vhO6SGJaOspRqWS0Y46u/6NmCRZMgcKYNWAuPrMWzCwMvILek+SPc5Tg1qU2yqz9UiU017LaddLyXUUhZ3Jwszyi21yZKAbK+mwZJHBeIsc+I8kHIvU8Q/x3OlmzQZJO8+e7tR8zlJprSTuJe8QkpAxxio7CWp1LnWdOXxuk6WLDNGT0MJGq0RMk/h8Gvrl6AqQkamj8ezFHRijvDOHqxj+GVgUeRDTx0T/0qKW8ti0TmwX54rUJ0I7y5v5tOEthGpz8CzAFKOOdEQ5B3oTZt15LYf851KM1UeMM+PVYkxHOygbdO+lj+Pw8uWLJ0l1kzk6K7Mw2x5MjhuuVbtvlaGMubVPKLzMgpnb9HygLJrzadNXG1j6oo20GL1RdEZObcotlv4JJDZDNGb6p8+2Qd/Ibtb1rmMlVMI3eBZIL586dJe4Mjle+4564cvohVi2vlYmZTJoiG/T6jxrKUXEDm2q8EoFHuGmohVXF8ugacdmzMxEoC5tRNVnt9CDC0YOXIuMR+DW4WoDbHyScJTZIPwA9PL8kF4+DR3Zx2uT8aOseeb8CQstX6YkWv+JZocsNySrZTgvivaHBHiMdE1CPejcUsTes87JTV3JNZzliPTyWUMLyDPw5xHx8YVqHeaIDB0rCokP6QhXReFt+Ucy1zHwaCN7ZD/r/GpopPcLyblWnVr4KDv0/W5KFmDw9ATQc88OkcwdkQGkcOY3+hyhN2GOsJI1/gilLCvcIdJVfO1MO/6lq+lGyi1b0JPHBNvuHdO2meWhSqBbvLx7aJ64k9FyxXjpUCu+Lz8jk9v4pMrd4iMiwcRxjQjzRFiWlD4KWkAxZvqo9atLzyBPRRZeAQfg11LhmbIOsSKBHqufdNSx+WmHTHhsgSnNeQrUoZnwgXu1tFEiWynLxiimYl30AnoZW7QSS2iM0QzS+KUSGr3a5IkHVqciNzJwLEr4zzPfaRYDkT9AlpCEcbXauU7eIpNWGYI6Vl6d0Bb+rFYeUUibcp6yRKF8FOKp45akvPEcUCZVcGMoX4/s1FCy+tGZPePFcUO/J9q5Z3Gcd6p9mOO+xoLzTfqqYA52Ld3MBbtKuVEhVQpkKGgfCjzG13ls5us8MEfnYibfQjHHJ20vYMmjMWpDI8GPXB6WMCCdLfvdr3GBGaN05rNJYphnjHEeDKgPXYoEn7B5iTZpjbRJelmSSiVQJAeGFGQzYTWgO8WHRLKRzcrHRqJelq0l5IsGDDEMX5Av6hj7k+LsH0Z+egW8xHLF+iErAozniq6YPU5SS9AUHubUaSwSTswVE7O5mPPr02frE5LFfUiLh1XjxPHJdeBFauOd+sKjZXxc02anMKLbxZcF3can2C/gmZc238nCGRZRfHF0F+sayvhmbP89csky+CGLyf8a+XCofyb5MSxJrsu1qt5dMtwvw9XyrTK5B8cDuoyeS8apk0zIOj+O3KQRZQHdDHIcs85RcxJT2cQuW76yQ4E7WLUD01Atfr6PPkHJrVwKI5JPVv7HOOTLRJhjzLL/IvKghoqloEP9zTQn8jjpT8LVpZZvZEa/VoF47fQrpp6jDEQjzvLOof4AXTbUS68bOUeA9HeyCYKNMrlLehgTzJXSej6jd46ZpjZpm0D+4cgby2AXTzIZ5987M02cNmq9ZWnUKfBKzbcJXEquJl8620yc4w9rNoAkOcFWet1upNUV47NPbYiWfZfJV/JwnlUZuY+fT2EXge/zGtJXNYFECxiOrOyC6zBMYlkps0uVHNLk3hXzjUE1Zz/PauZKfJ6Dil88RxpNrXkBp4v8B+f0W+R97Z6KrphO1ahZt8jwlSs4qDhdcD1cyFORZXAdn/hNbH+26t+owFxWmGVlxSt57Ybb0FetmYyhu11wpxbRd0T2fQPuwaj+p8kyZHPAFVqOuomtgmYD22q2Tv0R8VyVV0eQAODByC+64C7UXiaDlfDw0IB4WKOt626T6vq9BC9Jr0tkP5vAWkfgnNQ2qUyCpDih8+Fubc43qU4yTgFWfEfXxBT02viylLPWSWLR5+g6iXWofkBbKxqvXZSqtmhhRP7cwki0xbA+zscW4w7QhgeS22xWXUt47SVbYXXZDgI551Z+OUv9hYlpAJbq62uT6iJsdRKmplravkReI5O5X6ouosezY1VgBiLvSMl1kRlq1XL5Khw/JCilr1CiKSBbEs3W2iVOFH5uppjkL5IWmtjgep4dwv1LI2fEH4+sV7aqrihpTjSWM0Wjwi9MTmBkVherybCsjpH9nXjh2pF0O1TPFEaXyfYJEe4V4dwpj5kTIe0QXMBzNEb7NXKYL5RPpD1dLd/P19fgSIPMc75v/8rp4hgAtDII9joC2I/x5P7kdS4BNfsxka2c/h5bRZmQjYljZWO82MLzMT6eDg1HbpwDHahL8Ehv5H6WkCWua2tWfRh9LuFrWK4i9xKygEApX2hHYws2R6ZiyZPeCamYVgRhTEjJa3cVYYLqforVFe6TyXymv/qk/80iiaZhROHLQlF6g2PM4EXzrz9FLr4Wfsryr08/qpZuT1pze7naFk8UdlIM61icxVOwdoU8wlMEnoRh2Plt+n1KrklObNj6W2MUxFnX38ai7eTc60+R9QwYiwD/9FkDQot8CM7k9csr1Q6We70q0zhMDPmaFQgozHvwu5zW6vN1vZSlL/H08Nt6+jIa4hh3tsQRJviUdyP3aQgxGjz52UaEOPQBKR6xxvp29QIt79rC50WyZAaVSnxiYo2+2OcRln6xKbpMtvMR0EdZOL9dIrHEq5clXuco2b5otpUw95WM/2eRJzX8GFD+/bOfIP7YmtH4evz16mxMuG6VXpOIlnVRzLiyWNIFr/L1JWtZzZqtybfLiJytPoFNbGHnU4TZNLmB316UnH3xcftQwD8m5mjRKo45OY7QILMRFQEnrMnX7a9OLbqS8tnCR0S6lc8Y0lj2hWYXHcGTzC4577oWDg+I7s/eZ+aAbbsTaujlj7KbLLfLBMOTy+g19ClKF/B7MGJhJvpwdBTRrhnbUSRHl+9Fpq2C/Xp+daY8QP8CdyXSZfFfNjP0J+S49sojFGBwZPznisV/n0Qu1dpn7iAgqjyVSmp/nhrcp8BiZbXCVqSw3OFumS6VYyYUoxqdvksk/bkRWKK6fRTZquFgyRNDcl/kFrJsJJal6oR1fJLCLodltlgJHonei7CeL3yKFnO/EqjYHQjJ0P49cu8qVKtJPLVi0P4+1Ea7kvr+IrUeXVVIArsEdGc06ybredqNEeqdIqwWN4rxOoPEbj6I6/rYisBVfVSqdTTy6CoYhJDWY1L+GSdPtTQ8erw6SXUvo1dSkqzpsZBV4u4s4daHMfVdT7JWwQGdlPfikffnNajFD/GlG8/E67oLyCX69HeyRY30Y/HZ6WXkrwPio59d0C1dNiKP71XHbeeTMvoq480Su5mKrwlhC0LWUbolYQY5emvXl1TAmJ3ZkgoZbM5vqL+bPAVPsnLeyFoG+tUHZLiN3w2BAxqO0ssS/JpC6edYXozsyFrGIzCLx0Td5H09/4rTXKZOvAmH/WU8B9NvGOIZ/NxoRsvlspx+NaXvjTqDZKU/HdmwDH4OHp6TITBaFPk+3TWynrBYncgXZfgIzGGQ7LziQh/mur+N3UUJbklbnfFEwjj/JbW/LxpDJmv/MngZajVx0TlDm8Q7k+sMHWoZRiMxCKv5uhztVoIvaQC92t1TSUkbKzXoJIkD6c2IyQBzn4f4YgJ+a+73+I1+5zbgJ473v4rM6oB7oGVAHDdkiey/BgJimpBAzyhMUb16GsJycH6n8leygChVnhb8JbK0A7bqFTVGtppe8UAiXYXdk8GmQslOEb4rwmUkVsgYJcqxMl9u6B3kHS7Ea8gbPKVL4iug5jyBcmSl/C9rTsmW9GHkjg64j4/TjIPlfI4z3k9dagU6iNlsSRRm8mxgZst2HhPpJeeqmaNVsgMegxqd7rWRQfGvUd50nazl9R9GjXxJHUxSvg7Ypje+Obo2Pp4L16kFT7B1zpspiY7CuvpJek56bNAfHLU4YKx6Ad1zpnNAy1niuX2VaufxGs92+X0kTL30djXcyauWIVY0iEQiV+jrKM6UD4jHZiRjZ2uis3YRuC9eK+CNy2drPAbaFkV9AfpBplEDdBH8eNQaDW09SMrI9SBfQOSs1QjWBQOwhK3RiNSL0+BVySKkCG17sTsNKYrKN2ssyC4IfSBCn7hCvEF8U/xAPCXKoiIa1JT1RDZhXx/KPZ57/BD4B/tX8S2Vjg/i/7U1oLh8Lv0Br55f4j/h54/zJctPl+B/P0Xe3hdD9JvSTMGO+V2xnG00hxRrrjOUIsNnMsgkC9k6ZMi0mIpMxGQyH4A8QSTPCE0ng/7ew+DPPcpMpp9tXBTd3prtVMQ2ta5nWzF985plS6+bt7qtJVixqNmVn1c+sUOSepvCZXUrZ1x7iTNn8vLk/YMU4SDbYW1YNWbkhADwD903/He1oLAspFjkIrlJ7pb75K2ynCazjXGIDQcm2Ec/3C1Q+SX6gaAKEv2VOkNQC0tCAln/pXbdYXvuSJ+75851/hEb7AxWCNlNudNPgv/4Sb5NFf5gUNujKsPlC7L9dZpcR/b+gW2mI69+JrKR3QibzOfeFwXGHuxDZgsZnwbGoyBbef1eTMHRwiogf4LGH0nijzD+CF1PGX+U8UcZf5TzR7di8nmQvkklCy2ifnzxAUX+KBThpx/QU1Rkn/fRFfjDU5TlKefEn+KqZ2r85BFXAETGoFL8DOeQRD6SHgUX5y8PDAn8maP8mZxWv7bFksloC6WXGzNCeRlsK6XU1Bx8el412PguYya2uxgyOv9rZjRRpGoKoeLyvDzrcpvKiZptfEszNTUrJyTYrDanjRpsfrYtl7ZLWcB/MiqOs0gMH9Zfsh29/EOH9B3LNIFJWUrCbkt12o7waCRciNVkQUVZx/KZJZ4sk6VAecjttH5jZkFzJpPricW+jBr8PHC/QfQ5Zws0JuMUwSH4AV4sZCLNjYrUy0Tq9zGROp1VXKT5Ho8uUg+KdC+1WFRk0LKPnlC7VKPdziRrZ5K1M8nauWTtW+277AfZcVUWe5Hdjy8+sKNk7VCEn35gP2UX2ed99hX4w1N2lKxdwPZekOVsTzprODU11ZO93O93L/eoHl22nphsPVaP00MNnmTZ2hrwgQPnSRRuX6J0s62HUaYVgvXQWBLOSNjsS0p8fRaR/43tA8YekX+J7goG3zxLD8ivu2tr+c/1PcOeHtEdaNNb0aav4v1hEd57MZXpfNo+fQCzMJ2XuUDQ/lOtqah8qZY0rnxm1awaLCGzarGgYPaaLCGLhZrNeleZsatepKyjKLu8w6gaWT8ZWT8ZWT8ZeT8Ztxp3GQ8a3zRKFmOR0Y8vPjBiPxmhCD/9wHjKKLLP+4wr8IenjLLBOFpxmWSZXFH0bA9lbddh/rm2I7H/5Gg5O1Cl50blWII6HBPU9595BmVSjDI5wWWSLrz1gs2WZrYynk1sj0G/hVrM6extGpOIM5U6aGqays7MeTHdHkozM01CbmWbOdViXh8TCNtLjf6zRdHEn5nXRtc2/eQxTRTHUQ4ojuO9TD8n+mtrRsjCF3TExXHLLU9vKfzx4USJLFok0NjYz+w2T3hgvyDTE7uFvFTGrU1Nzzsk5Fpz1+duyxVTaG7uj3Gsz2EcCxb8furXZaf2EUxz0xo61IQDPduccfBY7knrsZPJDCYaFRv4xzKgFu7oRlpLZI++/0MVGoobE70CYZ5al2/1gMWSKxvzDKbswu4cyGnNVZTOHfi7POLeZQVrjs/YabOmOdNq0o6lfZgmpaUVFbKRYdWh3/76cO/QoSO9vxaa/tJ7sulkAD89xEcCFz9Lw14cxshjIrjCQXamBttH0YNpCnE/HshRI5OX5qQ98YQxNZhfaobMysdhz+/WF5jd7nEFc3/XWbO9osHiXhmZOTwceU30gkveYVXEtyJnGAvDw0IfeMjz0o/TveIf+Z6IgxMEwaGaQcjJSU9XIZftBJnLjt3S92ztHG6nv5cy8Pcf8z1sB2Hb8FyhUDWC4HTm5KrAtu3fY8kIWVzgEvy9sbN9QKCZjI50tUYnUxAK1AyqHTFNO9hZFR2MWEfClv18v/8bqY/RS/Vo9ITFSK9YzaJCXZ0zV6UNaoY91MDOyLU0ADvYo6IifhbHV75WECJT6OXDbyCft7OzIMS72NwLSm4zOSJEv18xfBS///aI738mxK9n339nrOv/bz7/8f8/3+/czj/8v/HMtn/sfDOMJweGO2Gp0KufxXHFboPJuI++9nyKKEvsWREIBsuvqSaVGq3on40ppn30VTVFNcjA3gMVtPdElNh7SRH301cF2X+yoaECrMdys6cnvxKymWdtaHhbf8QPC+HnYyztfKSzU38Y75hzx2X6g48VjcOd0ov0EI6NFay/rQbqRB6sqpEx6SswZ6jx89G3D3eShXQnyqVV+63wafy3jjRI/Wq/RQw/kF6U2Lk0v9HPvDktVTGJi5QUVnjMDrZpc7lqModuKN9VTsr50B6VePTsNtmItO6In922R8xlp7Hk8h2XjaZQrijk5aRxsnyU/+rXCY2R+xJlllpFagS2i38Ol5nT1+Ojzb5iFB2+97LGvPu0I2G8sePik87i+3NMTnIqm7nTTpxPcdhyuK5lsSay9CayEk+c/8ev13iRZJT975J5kUQq+J3+Hj9t9pdl5an4fozjbUbzIs1FLN9JxIJXphTlFBtYE4WsiUK9icKxePnq16MeTUNeTFq/sDOU4LR4EztHjc/n1j/Htlr+d9XJuwaEImcRSS8q4N0kuK1u4gZs3cpb5YcnMc4q4uczTUs6H5CthihW7fxkvRx2sh7bqZtksREhSxsR4Ou4Fnl6NFHXMOb510/fEMrUQsgq5tbpL7mhhAgl1hJniVqysmRHiWwtgRI0Ef3gLU7/0QQdwTaGD+ttZNrSMgVsI/2GdCKkW9Od6Wr6yvQd6bI1HdK/7jaERvBIL7LzyXRejsK/Do8TGtQKFr85ieDkDK0ouqGI+IvAUlRU1FTUV7StSCpix5QVsWPKiuLHlPWGo/5KO/OsNfnMMxDS0gTEtcJyg4X4LcASpSZLn0W0sMYsrDHLyPPTvr629DMRF2Nb2/Wz/OaI76K8CtCNttW0kZq2prKgSsDa6mxtau1r3dp6sFVuFaJ6F8UjTuRtfFdvw4VthFUTgZoCbGk92xP+RTW7wJEiYFNqPljznflN+X35D+YfzJfzWTzEm+v/p7Sn8UgvifFYBWbUvMlqLQ46Rc3DzWRF88HmN/GF2N38YPOuZprT3GQW1aU2YANli7WFqC3bWna00Bat5XA/aCcjJp4NSS+L4a2C7LgPKc5DTxz3N+fwWyEQeZo8z2IclndgfPyWsFjYgNeEBLRP4SrVJtKejoUdKzvouI5OkYli3/C7aprDwY9e6GJ22sV3KccxqIuko+2luzPcmXemywSyWaCRzb8120JC9pvZpCZ7a/bpbMpChm3ZB7PFbD1OxRDEr53MGg7zLuc50fCj5HnxUj0n4nmDbmeuPIfI7Cz/hnwi5LOeUTEI2pEvW/MhP8nOeJ5EV6bL0qHouW/xM/KQz1p+Nl41O1MBOfuZ6pjZVcoPlQBLj79nYc+DPbt6DvbIPdphOtrwGtb1J3ZGHWuHn01X/wK7sj0WBf5RdbSreXp7bf62hW0Ptu1qO9gmt8Xa4w3G4s2vu039vDg7trlb03PhKXGL0Ki6CQTGh5U87NCiRljYCNbGpsbuxoWNKxt3NR5sVBrXp4cb2VE2tnBj7JROxr2Gk/5UWodtPq+3eaN4Ugg8xyR4WC1yF5ps2KxLTcXxwLXStd510PWBSxJcTa5jLuqKHcwZa8vH8b2gt3U54pv8ApqhH5t7f6+/zOHE1tjRoarTZgtZqmuqF1avrz5WLVmrm6q78c3K6gerd1UfrDZUx9ruTeb/lRj/fmEdynSqakHpWcfDtvHPjj80/vR4ESN21Ti+ISOPn7fIdNaO0kbR3MBEs7JxfeODKBipUdPXcNT0o2MJ/alcGZOHX2iXdgjl7Fxjq7vPTdiZPFZ3CUqFnc/kWogS4WJIOOtDl8MrMTn4hQDirNnN1fKUavRXZTvZ5fy83DSEtpAfqrqrWqxOCgHH4jnEefbz/tm7lzOp82jDhqy80zX+5EatsQR/PYK3kHA+8ubdQ6BbY+1Z1cJZG8FZ7OzeEXyFOF9VHMsLezlXOlMWhqU6ypZUnYAEefINT5Pn01+gv+zV9ERcHY0cjPo5sEKNtYbUsBGpJiFy0GIO4hYvSPea9ZhjgiC4eQR0Rk0vKdEu9ll9xMcu9sUv1q/Npf+L176qXVsXjVcKC7ULXVYXcbELXSPjFV/kPvkbCZirOGaM4tB0M/1+7fCaEIviQnoUF0qM4qJjOalIwF41IdqC4vVqLVSwFir0FipGx5GkIgF//Hob5xxf+Nj1Pv1634g4Ujtz7GD0zLHUMrpSHif4VRMI7dZ2Z/vWdjSdT1V7e3txsQrWKU1TuqfcMEWcotZNCk3RzxTuTdAlH28rQz8zsgfbGr8XPiwEayHwULbIxUNa9CeWUKCw0GzGRjH06cZASCxijRbpjfLMNT5uFvJ2MxPanYQYP2RnFTvrSb3edH2s6fp6rxebHtc0rnvcDePEcazpcYlNj3ne2rfkT4Sg6kY77FHRpR3qOdZzqud0j5h99tPX4mfy6Pz/PMq/pVMoxfZ8PFc6VQpCaanJxBvxdfvW+w76RF/y8dJxXn8e5VVvQ8PUzDE1H2s+1Xy6Wcxubi4p4c2p3ep69aAqqqMxCZmR+5S10gex/q0ix/ALPzvz2tKJNrpGNXd2is2snW6mJ926nnSPSHl0XUVb/yDWv1XC+7EMbHppSTnPwM6ubbHYpZC3kanp61WCUKGNgs+yA6ctFtaIyhpR9UbUpEaQJ1dkBnlBnIh2R3R9EOgeoVk1QpVqtoduqMLG/qy6q6qcThUq0dFVrk8JF1U2VfZV0q2VYMFX3ZW7Kg9WSpXR8ISdXRYb630i07WX9bZPizwuJlY3LHSvdLOzU9mJc571KamhrR6weIo83Z4+zy6P5NHcE/ccX3NbGs/kvQSeWfzmfw4q+PRPWmhlxfoKHPEeUm18uASh0lpJKpkcK6NmmnBuPPXRqYm48Av38wgHJTdPtbnd7FA2NtFGPKwFT4Kh/+PXC22RCxPPkbdMhQmRE8I39LO/d6exUuQneys8qSxf5PWE2jCvK6iVSkrI4n3Qe8xLBa/Vu9572it6QTCoqdaQxbDLcNDwpkF80/CB4ZSBGvRggf2NHRT+fzS/5efPy6e18+d5zl5Ht9kU8S2oFHqEK3drzKp2I3pR70rkji7Epx3eZ5FNad/wH9Qmr8eAKi24nnURp6vGtcN12iVaXMUGFjpsDe8KvxmmReEV+IJawv5wT3hl+IPwcFgOg5udmezWsn0t0kO9quDyiY07xKfka/kgwzb8R3rGJmO+cK3wAiJjR4OpVnt2yJm+kOW+NhV1jFU9d2ddjN31mdqQlmYwqNsMd5oOGSglxWprZ6hYbQkXq9WN+MJXhn9S8kLdxSuKya7ig8UfFJ8qHi6WioGVUNXazrBZbcLHRHw0jA+Z1XR7yLw+xRbqM68wf2A+ZRYtZr+527zSLO7Cd8QcK4Dz45/7tRfaCXzMlsP/3+RJ0yHpN1Hbwbz9tFAqtDxHStk4gATU0p5SHAf+W3WVeghaoU9tCFt8fp/qu8EnWnwLfSt9D6Lv+cB3yqf4YoOMPnfkgT/Ly3TdZnMlR4UnhfOfI7zs7vNr5fe8Qq38jrQYmepMGyOTgWSKMm7IOJjxZoZoyfBnDGdQS0ZRRlNGX8aOjGczDmV8kHEqw5ihx9e8Cv1/iKYwRTCLaXLQKktvsvlFbR5ADgq5wh37hdzh06o1vyCUI2YpCjUabJm51L6P7t2dlmr7EX1LoHSvAPR51ZyTJdhFhRqk7GzBnsaOsDOlphqNhky7zWbYR9/dbbdT9iTkwz7wbPJbj50M+vH/dHYodDDH/xs+Ze7np8/iQ2g62RQMnrThO/a//9Bx7bwtdiCZKxz0Q6iu3pHpyHJkyorPEbS7MuDxSDpsmfa3PzpD2dmW5kDQmlKTN3ViN3h+SDydv8ppW9eQ0liQmRlYlW/d2zn0p/icB+PdOkuIzzO+Ep1nTA3Bhxi/5/P4/VU1xePKyWWVGze49bBfz0G067Ki10k2+EMkVXDuR3HuRAdQxKYoLW6/m7hZndGtO4DwmDl6iO5BmiWYc/i71C7CVmyldHWFQozwNJg2Mt9IyqFDcBFeW6Ea8WKMg/pUyny/TVXLytjlzQub1zcfahabE6pNY+biX7EdYd7wr0WX/Ha6l9zBxpi0p4X3h9+1KYZ9wiuwHGNUjMSFCWWlPnSHpb5MwHjczxQ6N4+dqntINWXYQwv94CdQup88I5QJFXxyVD/L/nPa3w/iP7X9l8+Kv1FvvzHWfiM0nnP7R86K/x9r/5kx5N8R9vhZOOLn7Y/X2x8fa388jCcQOLf2E+X/z2j/5bPib9fbb4+13w7t59z+kbPiP6f2hweHf026efv3YfvetKcPcOkP79Rax3ioKjcnG2OWnGyDFaMUp966M9a6E5wAOWO0zu3059h+/6j29w9/9DW2Pxr/yzg+jN1+hd5+Raz9Cqj4gvaXjWr/yPC7X1P7TP7hhPafGSX/Bm8WixmznLz9Sr39ylj7lVAJ4Dpb+3/C9q8Z1f7+4T9+Te2Pjf/ls+Kv19uvj7VfD/VfgH/ZqPYT5f+Ptf/p8K/p47z9R8ce/5FCo8/rQQpeTwpFClU6haoYhSqoAvCObV9naz82/vyT2n/5rPjH6e2Pi7U/Dsadc/tHhNP/lPZHjf/YfnvQVcWypirefoPefkOs/QZoAKg5t/YT5f/PaP/ls+Jv1dtvjbXfCq3n3P6Rs+I/t/b5+KlMiNnXxQdu4aPcXJuS5hgegDeEJeoUUQgGa2tUKtTWVORgOCVU5KCxiU1h6AtDWDWlhMJ0YS2otVCrGk2hWgJ9pdBUCkWl8GYpbC2FUvZxKQsie/v7+zGnxxfsT782oRTWajefh2XR8LNRLOHwWFiC0BeEIMMS/DqwsHGnZgQWlP7wAeEAlwxDs0ztEIWmpupxiKZ6XBIaFfpUUDGjCKkU4wd1PFh4FDECy8okODqe3nPHs2j4jSie5ub/V/BwveR4NL28GPXyFm18ELjuCO9H+0tVJ01ERJMmjvMyROO8qKZiUwv0tUAL668WunASqJNgEqM8iTCdQs0qCsObYdjK9As/Dn9Rf30RnkVxPC0tY+Fphr5maGZ4mv+ZeNB+NQ3ieHiPTZs2vg3xjG9LwjMD+mbADNZjM+jCDlA7wNLBNkEZgWZlEqCz9pjwZTAtimOaMWMsTNOhbzpMZ5imfy2YBCLMFh4Ss6TXBVXogAnq5MxWeGwy/L0MNrngChfMcS12kToX5GbCJ5lwWTrstLHd/x6jsJnCpzbYa4PJtkxHnlRkbwO5DdosKc376OtqrtJY3ABCg7WBNEwMh0IBv6UaqquLaiv9++gv1elq03iYOPEmD7R4IOyBd0phbSkES8FTCmJpZimZS/fwY1ppqYcWGbXTvanSWVxkK22rnEzbQPX7xzsy2/Lyio0pL9G9gkVoo8+/UBsIN47fR/c+39AQCh+gB4RifDQ1BYP+k+wI06YgX7Gc3hDk9QH85BA+2L2AR3oDNkdDbAeC3oA/GAweORnAq/y91iMB/6D1aG9vg3XoaKChvz/dwU841n7arz+BS1ayHPy4eFeI3X5V7/V5tfsfojdmZWQVQZaDfeUKB+vCvlA9uynCofjwKnsQQj5ZCdTXiVmrM9f7zI6UX/0RxMwn17Q7/R3tnrRCa0rV5ZNqZ/x0WsfSsuDkHEV669/FhkqHWFmv1own/ZE/V0+5ZW3gPPr3j96Z4pvU0lYfTM2c2nrBHZvqei5bbjHc3j1le+TTpasfaVl6863ucGdbZ/F1F8oVucU5LxTMsBqUoXrP3N45SirqRKfwP+Ib0gkhE7XilFo63Qdkog8KfdCWAfPSYXspzC6FZbYrbTfbaH2oIVDpL0vB4X4ffVctDAQaeFen5Zc1lBnBKKeRdgHCAigCCGXsJ85wQ4O9xeMR0iBtvQ9W+eAbPpjjA58nP6u+0h+qPYD9GaAH1ExPidudJW81wuXG642E/bOoP8Ivs+jzgoX37Ml07UigICsJDTYNHT/Ebh5I1w9P7g36rYcC/qNDb7AuZWfY2tJZaajXFszxZ59kpyzbEje24bcIZyq81xLupnNkgavEFsLelBX+rzjsrnfbQn62zt3rq89i1aQs3pVZ44HWpI67/Or2tJL0vMZny6Z878k1W+GBiYdRl6vya2sXPLQl8jyYboZXUumBZ4ymdkf6t28yW7Jptjs7eyKt8Tiv33hXyHXpQ00XLLl559B8eNyWa0+7Tl3ZvNrrzO+Z8Bpcfs0ES2dF+WPXX995yQ2/SN8RdvM6ygQ05jSlMt2b5mT1GPRI78K/CJmqEfNSj9GoEs8+8rTQpC9Yx2Ax0i6p0mXCROEKtX1KIwQbYXkdlOfAlmy4Khu+Y4IVphtMxGSZWJJVYwFrFliyLFmFTUFfZchdWFJZmLs23EADeSHi9uWleQw22SI0DTa9MXSY1eFOBsA/9MZh64nDNr2HrCetg3GjYbcrRu2iTrtjMaMubAvp9wvhkIKStBeH2Y2M/OMKCBfb+D2NjiybpAbLl19503lNk+vLZ3kdDeucmXVd71x/SftsMeOa2qGXapYVpmUUXFwDN/bOufyOyPpLYcobu+9acUN9w+yK5i2zQHjwWRj4w9MfL578naH8HvtSj2dywWV0db93vDfyu20tc489HfkTq2v+BmX0pDRNqBOufk6Q9pFX1bywvboqy15trypBm83KsqcKdqud2O3jCrLY987KItXT4yGekJAX9uD3FXlVJL8or8BuLzBY0k0oo+OHm1AtmZhsDbbgL4cOo56+cXToKA5MvUdvtlZY4Sc3i9dZD0O2FRWX3VqBErHb+P2d2l0gwYAtDCNEpI017O5WXVjSkzVz3VnFE5//sd9Vvj5z6Zk9eZ6emkipf547K5zjUQvGw0o6Md/T44d3JV/Iueoz9dsdm5e4AouAbBHFMz++vrDc48HP6a5JmYWZRs8ZhZqvKyr3MN0Z/hXXnaBwqzpvbhDagrCuFjZnw/gsKM+CW21gtOXYLrHRm82w1gzLzOyAijXoxkqsGZCRkROuLvHVOHNKfGklBl9NIMdRUpSXUlxscawN0Ko8P7GUikZWzj3JZORHlWImDf5fnsTxV9cpf+/J+OaymkpZ0TDjClXMxGJl+kTtY2tTerFTUrfvjPxu192H6ssXFFVB6r8umV7RdezoCyPV6AlQ4L/I45Hjr7yvzr4XdejI2zvfB8Ptf468vjmqP5Cl6Q+UMr8a+VBYA046Cx1TjpCtmgwbMoUN1vTUbFHwD74/CP6TJ9iNXbG7djXNVqw40LAbaQLgbJ1x+1Pdpdvbpt46o/WBDTd22Ys2wq/uWrL6mXnL/+uiiquWb4dJkVf+0JSOerpAuEn4IZ0t2AWParUI1oNpZpCJHcwpaVYQ/O8fDwxaj6OeHX0jMHQUE4l6fptO1Nx89UFO84eRl+aZJIuSlum3Drrk1Nk3OR0pk2Dt8jQ5M3/e0LMTzFkCRP5buAmykFa+cJ7qy3JAgbnKTEgKlBtBccBvHX91EAfJyAdByNigEJKWqqSaXqJlKAcHtO6m6F38RwdPvn/yKPhPDAb81pPoagexQ3v7a2swUOkHpTiMdh4OMWjafYPMpSr8lmbImhhJ/+uswOymdZVVhb88v727puv9A+1Z/hzIu7fg0LrOtqaZa39eUze3pWvNbimlFGVjEVYLHyNen7BUDXkz3BuyZbmwICOjIFvYYDZnFxYU5PV4ocQb8LZ4qTfzuQzYkQGLMkDN6MkgGRkpefto2fPOFAPrt8H3mT4yZRsM9KL34PsI+E9a32hAiTFebA3s3i3NUrmh1oU1bQtEOfJFOcr6+JsXbLprfG5/cf3Mvgn+wva6xrbQeZO8XfdPbZx8yR2w4vrWhqaqmhl1l7kd+eVVraHx8633u8vaW+eFuH79FvuhkM4RTEKa0KTmlSvgVkIKuxWepknUaIKDNDXFQI1yyj6UuwhU8B8/PBQ4bB20oSkNDaIdDVoP27jcwWXHoSPMdp922QAKv7km8gRcNeebv4qcgca9e6fCzyP1MCFymI2JRpTn32gb9n+vWl2QU5VDjDnwVM5LOSgsVwbxSEBoXr7TUmMhFos/rymP5DkEAGWDI4+pAdsNrfX5/ExbCpfn0ImTaAqoAtY3MObqDaAYmRpgyJqhuGLhlO6Jo/L0ZfwtfLr62vO/9c1vXF1b3jgxp8/VvPD6hRt30LbFs6zq9P613R0We2lF8Dx1zfgqALZVVOQk2qNVsxHhKrXHXQxlORCyQJkJTKZcE/nUBEdN75v+aKIXmC4zkU4T5NutHiuRrfAXKzxm3WslXmudtd1KrYYNhVlms7AhKz/Xmp5uLhHNaagd7w8y0aIyBzhH1hMngzz2DmrjFGcq0d5xRBKpZvW62+O30KGmgHXWtMuu7px7z+ZXApEPW6d1XThh8qZ8d4d3isnpmzy+KA9W9E9pUadtf/vqb5YWRCKhQMMDM0KtldX+KRM6q338nr/IX1A/DKgfbG/INAPfFFIAdmaniPrwnAHN8P2TDQzrcUSNuoAwjeDK4ONBMRgif+4+9e9rg56Z8K+0cWgquXQBW58m0GGzsEb4X5RjHsqxRrhIrTOVmr3u7BJhg9ebb9hQXm7eUJK1IX9JNrRnz80m7uwQ/nGH3CTbnV4lVmB+axIL07m8WEBm5X95tIYjIhqTjT2icVlGXF7e+CjJrMeRRUO6zOoyMHBGZ8xE97+z2nsvaOu5b0p27fSWBTObex6cWzjxurW1rtLvLE5//rxpE4LuMqieH6qqDJw397K63HDDnJpSd0XXggWNRRNh+mWOPH/HvLbIvT1XtJ8/YXpOPs+RknRnrTrD54SybNhvgMcN0KiAhx3InE7Inwj8lLxF/pPQxQTayHmEyLJ5Q6G7wgAmQ66BfIK/NkCZAQyoOu4Sg8kk56bLEvcHMcXRdeYEalBMb3p1zcFxxJ2R7C9GaQ7TGfQdXGc0LXpQ0xlNf0gt1xkgqDNLuRJdwXVmPNcflg+Ol47D5crTQhGOmE+r/SVODCft6bkpXrdbkpQUe4EDnPCh87STvOKEl5zQ6ASjM8dZ5qSZTkfJvBJSYvJCEf56qgUaLWC05FjKLLTYstgBYUeb4zwHFR2ZDreDhh2KIjpE0sAPqXlH/J1IRUkoEFAQg6tWXdQbOHERG2gv4tkYPp3QXqMwbCwYwJwO/1mPHw0E2AvNl1ogQVFQT2SFRfJcN+qYLin4BVxeZC8/sLjIag+Pr8osSE0pcmdV9BZnZVhD53+3cra8NCczzaJWu6yWDHvRuEl5WeaC9Pz0VEuIwqzqKtekylK2PblQy+RkmMnl5Bf+qD6AkiovLY0Jq7qykslLcMJpJ7zmhPucTzj3O2m5s9FJmMCI89mSQygtL/5SKIUPS0+XktdK4b7SJ0r3l9Ly0sZSYizNKSWZpUK5tZwUlVdWNlo6LSQmUPsSB8x1QJsD6hzgcYCM6QdBoTpEkEVo+JsIv9UESxLEinLVBcvEygQa8B+/KCZZ6/ETg8d7B/WEVpdxopjPSdKOL5R4cPL+ytaDgVb8+3ly/1t1RUFHRWlee432zOQ/l8t/Msp/otAhvKZet7Zxc+P2Rrq4Edoaz2skU90L3KTRXetyOuurptROai2rbW3NtQvCc+mwPn1b+o50ih11gQJlSoMyVaFKiiSlKExUjsYpE7xusLtBdsNf3PBbN/ybG/a4j7jJo25Y697s3u6m7ipXqHmCq7TUYn/ZAY59MH6T4O9HG8Zo6/1BHLz6+X8ocXxtPREYZNYd9NuC/Sjko/39AT8rLRx/w3oCBzu8KmjTLvky0pUVlohWgF5j0JIC9iMcFX0h7ZdFcHaxiyJpdKUFXUFPbZXDnmquc6YXKOaUVCWUl6oY0gvlz+uLypTcVJcvNZjuc+elWdKzqqf48s35PpPR0JJejOGjLdvM/ITQyvsngP3TLZwv/Ej9VtuCqT2lXm+Za6pT6LH2kJ7zpjaNq6qd3NTEegX7IqEHxoUmTK4qayv9zQLYu+BnC95ZQDcv2L5g5wI6b8GyBVcuoN4FdQvaF1DXAu/02d7S0qqqVy1wwAJbLPdZnrBQix37o20TU/l+JumgX+sSrtasO44fHwwk9glTb+wPVO7jAeyR4zjUYHewTuFe6Mv0SCGgV2Ld4ooFr7JSp/+Yv4xfrbCv2ZDtOHsfOawWU6o0wVlWOzGfGsxp5jTJLBnMzuxcIpGaytSU9LxCT0ZewGa2pIp24+f12FO5VdmK1Vhc4Pfac6qVdJst16Zk19p91YVmS2aKuTglNdNRXOzOG2/Ny0wzixnmuH2Zsf8qhHHCDNXjrPQGAqO7qsxf50qU+wwm9+P9KMTBMUU8eGLwiyVKE/Y8UHSNZh7u7PKqVv1e77gyb6i8PiM9x5HusmV/nky6KtrKvXWzmyZk1Dht2SaDiddCOyPHYJ1wOx/T71UXjvJ9yVrmKGh3g/s6L3R7+7wrMHk4UAJPlcBACWwqgd+UwJ6SIyVvl9CSfif0OBc6SbMTrE6ns8ZJnU4uO23QwHEZx1Zm+4O8VNt/HF/1Y0SGL4Nj+DnpC2T3haNuWaj9xUo1+6zCmVZdlddZWcpjHypMjTTCVbpMaoR96pUVpaUxwfirqnTZPFXxUgX5XgWsqdhUQdor5lYsraC/qYA9FUcq3q6gFaVVfrf3qZKXSsiakk0l95TQ9pK5JUtLaIKYnPO9y71XoRgl+37LqxbypCZpYnEoolAgacLCTDagScZ6ov+EJjDmtPSXZ/dZX1ZqbHXY54uvVHNaeQ7mtT5PilGf5cjUnBYRWoZ/TR+kp4QMlOVqdcZ8L7zigVeKYb4T5uUvyyc/y4OfOWBe1rIssiUdrk6HW1JhXSrcbIC1BriZsBKKtMgFNS7V1eOiLldZTp9lBUqo0JSSKeyjH7MC3CD4e9khPL1sw6jeEf9BoJDYM83EVVJNwqFJxFFixveFJBiYhO+rCfxp0QP9k8Z9c8fyix9cNWnquvvnta2YXlY0ZcWMaSs6XJXTL6Gnem576dLFP7pzQc9tB1dcd+jGyd+qv+TeRR13rpna0n/vvAvuWt4ggHA5GtOl9G3MEWpfzLVkpoK8D6aqJmdmTSbJzIU8zKlPvpBqyUszCU1Dh5t4CWzoxBHriSM4NNgZJhsDxXYTQVw2BOYKk0vLmquy8/yTXBFDaVNVtqOyqZS+7U7zTmkY+peGpnzJ7TY4J9aRRbWNhUZ3fO/zK1DelcJCtTi7AioUr0RF0ftRqlJjAxwHqxUlx5lbk0tyc3OyDtCgUEw/VtlOflaMmipQpMHdiowgB4cCR3sDTUNvBJh0g35egEpvwCB9kPmI3toaT6CuiZUuJtH6SZSJEjVL8U2SgrrEFTu5cMr66pILhsr9l1++xFPZUJxaPL7HP2dtRZHi8NZ1LWrqWTmluOGqAxu21oXJmZKyRRdf6K7oVOtzK2eMd83rTLGNm9QUdNbNWVzdsm7jwBKR35u4gobpKauS+ofhDyI38zHMHemj9yPPrC4wbm+qUTEpIgGU/wtpSgqYUEt2pxkBOXteEhVk7TDydriJRdQvDw0eTm/gGTjYgnaXzWUrDoMCxeT3u3f/YOh9srIz0gl76Kkz994c6YMfLKLf+e3Q9az2HIqspl30XcTxx+FfRG7n9ej5w/9Fn5OWp8upJ3lfTI5cRvegTqQKLWr+FHIz+S7ZS0Ryr/g4ihoo/jOnmlJSTOJL2A0gpNKPn8OM1R9sCnKpD2on3aOsB3uZkrAdIlFRFF8G3RMpvwQeiEzytU8MZjjX0rfTPn2oSHwaVaXECo0My6WI5SppuVVOPfUxez8z8m36uGhDvKcFIfIEx7sMf/NL/pvfFbD3PSjMpfheSf2v4YX6HjSVqE9PcZ5+z9/PwGtm8mv+8Bl7j6Mi3c+//2/+/cX4/TppGn7/x9EywfclOB5cw7//+G32/lr8/lb+/Sn+/Uw2X8jfn47V+BXpO+kyq/GzM4gi7fRp6dsYXy1Tazd3w7LuK7vJejvYUwq2dkBHczO4CwpCF1a45rhDVXX1IVeopl6YI0/ztE4Qyqv20Y/2VJgcb1h55f4ks0T8GzzMzPHw8SPWocNH+X5gqOS91vcHee0ebAmjB9Nt5pWjNlrMrFYvtLLPXOGg/is78+fVxFcNLtZpcgEU4y/q6dPhvo091a1VWeasQmuaPackt7bYUeJINeQFKyJ/MOTWlldEUl3uYJHl5psnrHpoqbq8w1dVlF5Q6M4tmBTMDVW7TbkwMbuhMWynPzzz/3D2HoByXOWh8JyZrbNtZnudLTOzvcz2drfc3nWv+lW5arZkyVi2bCzbsnERtiQbY2wwD4fimOTlh+AG7g0ChBsCRFIKTpzk2YY8CPAI4gVC/peX6K7eOWd2994rXROIV75b5tvZc77zna9/3zl0/Jn3V80+3mwOOAyk3uVMsNUjO8inFw7mDMtPx2eqIVFk0psGyS2T9331A3WhPOjlU1pXWoxH7WHJM/JqCe4IFdxDsc6Y8mcQr8eJDxFPtOc1xIzAnjmRTrNarfM+9p7D4PCeYw83QKNU2iIck44B9hh7LPhhp/leIejhhWCQJaTNM8J9qmvPX7XDdCZ9yy3V7J1iLDYsZgkPrXZCxD/v1qK911laWkKtHC8g92E+j/C/tJRfXlqzAih8wvRXgYF7NIP0qDy6jLbqWqQH17DOlSVwNMGalaDwShhBdynyv25hQSitQOAQtlAqG0nqWW2gVaK7S9M5aOLryU4w0Qib7703tviJo/ntw0l15fU7Rw+P8XC5XF7Rb/IFIy53MSXQRgNoOiu1ki1R3HsKLn5yZfEzIQffXfy8KxwKCklvsenXgk973BqbnZpafnp4U8rUW8TlTw5MxeA7fXS6RV4zuedLZzZaIs34noVIteXiUwp7JmnjbDRaWv6uXXhtfy2JQGs6FAk50nOHq/cvPFLVoLMWSchHCYWT+gUhElHibPtmhnFG3C5n1KjZo7leQ3U04J80YFYD4pqahvRogFYDvqMBr2qAU0NrhKjTGo06jUaajopi2OP1RX2ylxa+kJRqK9ScAJCUbSUpKIFSGQ1HRHfU49E4WdqoBD6BExlarcGSfQlSS24JPyABVNEudWXyThT7zJxhEmfuXAI3MmeMS0pIPPBjZMz0PpdVI2iMypdZdD0r5ZGsAnnAUT1qKYQzIAhJAmsENjZI0dZwNOkBEwy4zhqOxByda+gAZzcZy53PFrUaG8dpQe5xAahDY23Kd/H5dN4FpTBF28xsnLv7bkeQsXpMagFcB66TdUk7/PNh6i3IRweJTcS+l+6fBe5NtjeoHFEmQlSuLUyV4UO1ZXCToIJKg8edksRNc3PNoVERcEl6sCnqOSPUHYjWhQs59D/q83ohh0L47y7B7SBvFuaC7IhfzK9SH4I5TiHLYU6Jn40UT3FwSzQVUForkLRm8VuyJ7zt1bZfpQ02S+DxvR/aVw/qciNjFiZbriS9gXic9lQm9g7dZKr51BGpkPR6EqVi2uiMWB3T0dqWsputvm+HJ2sSXJmhOBnJjiStvC8zMFC21GfSDoWCMjrDxfF0ZjzrU5oseiVpgbJQ50wMStnxjNekoKiLv6dSibUJ3jYzXSZJWZ+ZvPRDBQlpsUUca/MLGVC2jFvIazKg2WoR/kAABIksxKzcZpMgBplXIU5tc0mQDPgBfDh0YrbV2lYF1SwkqRccYkSHiyZQmBz5XFFPaajfXJC1R0hAiM10z5sBfJrqMg1IHgqoMUM9p+wwKld4ht0BSQnzEupfBbXJ7rd5BsenhOk7d+b46tT8XKj2gZqT9zqMvMabGV68ffbq1x7auunBN47MHgw5OTOtVLCsScGTn7DEk0m7J8ExrVv+8Mjehw4OhU3RvC0STbqsTG10rCZMnXr9hhu/8fCmILSR1aTCFJD9tOhMCMUuSF8+okAcaHseTIFaClSTDyTJWgSc1oFxDToCdxRq0QgzfiYeiD8S/2xcEY/bSz62INg5XmQ5E13IiF6OWE1oyDt9Rdixp00jWlqtqgKMB4VMSPAyafnE24+MMfHxUuO2E3e0OnuSFb+e4UthUKOFRMbh3bK4ZzozfPyze0zRqEhTb83d+9Ri+MDhg3G4wRWCMZAPkydSlYCOv3g9pVZSpnBr36mFw5+7uQkoCkC6KMJ9dQ2cd4G4rl0Ki4LJBI18gQAkGYAWqpAq5aMprVNICWbB7OTEsAmYgIYWnU5NlAvTGjHfnyxKqMjItNAlCZBZ7odcITlgEz6XkbVEBySKBNQV4dQjeVZ+g6URpgL1apxQOVpQSsOzob/841rbpwCiCDTBoeorlC0V25TbMj7gFurLWgnOV+3OJ6i3fjIyGVJ1bvckK77OJ4RqzN55hUt49IbE/MglwZ+pusnN6FMe7wvEV4bh/FPEznbEaGQZJkUEAPxPzCQCIqdxCKKRMBJqrehgHAynFhNcCpkgvgDHySbIBXmyK1M+25vzuRyeMAqS9SdbXjXZtVZKkBqOKKzxsVLn8Wg1YlMIAmkMj5QfUnkbpU6w0gqoVVy7RgXIC9Joyta5R8M1ip2PJQZEpnMxPZFzC4I9NQzFc3RYcvP9Pf+pVXu+lgGVNKjGwZgRHKbQ1gcE4RMET9sJnM5BHaJsM9rzHo4jvF6zCu15vOFfcphFAW15yDJRShTTDa73tvz55bNIrcj07UY045UND6fNFsKRYtBmpHzACNbb+Ao3b2tuv3nq4KN7UmJr045dUaFZiDNjDfBFT4a3LHzjptNvfWLjzEf/8lTphrzFyeg0ZrtBRYrkU8WrZtJbTn9+y6Z7D05m7HrWogGK0QYJ8acPDmT/r1Te/OCLBw5+/bHdVptWpyJNNqdW5olOuOeRTKlDi7qustsFn9ZqEgifL9nIRZJFoc4JSUI0cX4uw81xD3NPcKpW98Wfc0qOE4s5rYpTFyA9vCI4rBHOLiLNbBlpZlg/Q6i58QKiiXd7G2FpufsMqaIor/uVVmvQdiV12LASRQ2ruEYJfL/YDND6UCPXCXiKSU/Hpw60qh1XueVXq7lWBfy41A5oSdvPI0NpN89bEmP55f9RHI2xgqDy1ovAvxwbykCCcWeGYqSIyInn7enR9E9kvETgnwsQLx4i2tZ7TDZBDTkRY+BMiPA9JEes2N5Idr4N5xIDl49VnhG40KllKj6twlMtgm8Wqx6F1lfJCLZ4M0oOBwYyPh7JtsDyV6LNuA39tvfSD8l98LczRLytt/kjhEpIRYgUl4G//ZLbHTrPIMGTy+BfP798nsE+Qfx7XkhZiJ+u1kS7crk7LnJfoepWKHQ6S3VokndUc7zO6rOwTrNJw3q0NidNaoOtIvgu9SKXHRI6nw0ODTY80rjk1LsTnAmKH9rsNvFGLzQPSRHiq8tDIL4Ut8MxjxCfbY+PjBA1oNWCmlatlSo1a0Wrq9RqUFdTm9RArWNZl1anFTwuq8el9ZhMOl1sLCPEcsGKR4h5KoIaDGdyXHYETrdNu8w6U1Dg2FCXrKACJxMW1F6qa8gKbkni62eUWGfLIRVukUWu0zMaqMYp7lxCLf5zSHNDLhKFCUAx40DkVUIkGFmPGclLCLoOiaIi4EwXmxsPDd4OhlsHN9TsHXeYU+qtxs4bSv9wsxNCS4sX+d1EM2YBrC7gs1ndbiX1Fk8aucq25s2dPxiZjegoQfAZNUbGzoJdnb/gB5JOQfBm6n5ymBuQOJ7XBRv5zv8GBB3gRZPRrKX4Pk1SX4I4DhHFNmthzWa3ELC5Q0rBHSC4IMTWy2adaOMsEFMXls9i6ljuMWIUoAY9kuxKGGrNbEltYySgIo0+z185WxMzorD94vn+jP4n9aItMZJZftQRtGrV0W0bOj8XuEzdRw4HGxlPd3whSAP/DseXI55sH97pAacBuBVKEbeH4tMsMLF+lmSdJoVWcJFOZ6KQDSeCPJD7m3j/gAA3ER8kyKsIMEJsIUiRACoomEjCJxEJJkEmwmYTz7Fu4BFY2uf1Zp0ulyLLkbLkhYSRk0/WbC29mVtiLi4tYadYrhupO7+42COSPGQ+KBlVzlfNSlpyHebDA/i4kiLATqjwi2CiNOBTK72NSmcgW3QpFJ3ng53nFUykLXXOlOseJeUeqFJvLSfJN3lvbjS6/IPIcM4rCMHyZIzcfvENyrv8VKHN6yEVpMsekh5YqHp5hD8LxN9DEH8R4jPt/VqT9BgB7iAeJMgdBIiygGDNrAAIKyDUjwAwCAADAkACFADmWMQTlBgXcJnMQGN2ejgXe0rGPeOiaTWnDV5rvt1M7jKDCTOomoE5zBFajLg3L2AU5VBC3ZvwJTIDQGbP4tnF5fPYfQEvnj/TNYMWF53LZ1Gew5r9wa/dOlDmFQFPfsoQamXBDYFS2MYvl3WhwWLn/uqAVxGUYjE3RE4VXJB5rsZXTl/8G0q9/JeZkaQNCuLseJK8ho/b1eiIaCy/y1B+26BufkM7U06Pp8mJKKhGQSUwESDLnnEPuWA5bCF3mq81k9sMhwwkOjuc3EldS5E0kuYsajgYEB4RPit8SVAJQt4OP32F8IkmXUJUYuPwAuogfeGKrDhL3/2CbXtFWRbkXYvHqJicOvXq9cdePzU1ferVo7mbjl0zl/kGxYoj187OXjsqspTSGh05NDG0fzTp0oLlwy/fv2Huw3907LqvPDhvy2689fd3WbceuWFXvb7rhsNbrKF91xycz8UnFq85QnTtZur9kBYEaNtNv0ao4UR4JhPIkJmMr2oziYKPd/rEuGjS6ws2J2enywWRX6V0o6S/DM4jxabd2Z7yDbqGHB8KR9C6lW1Xqt59Gw685thy4NDmQmPPTcXWAUnLjw4sL4eaGQ8dGqmBbRp/OGFNTOZ9kcZUSBy3Um9RJr51YHzimkHOpOv8hzgQs0EVROlr1cip9GDMwncSClqjCtY3ZVtbcza1WrY7Ip2LigBc4yDRIH7anhmvgYkimEyCaxO3J8iDkeMRciwCihEw6gdlP9jOgXEfKNm32cmSGWxjD7G3sFSRBVXDDsMRwwmDoqYHO1TooD2CsCICKEsnveD9XnDAC+a9YNALJC9Qee3esJd6mIJK4G0U6aW8VOj3pOckkpEC0iMSJUmtEPqu9Y9o8EUa/K6czvswTdFlEaoAP38lJnopXZAjiAxK10X0gyhGtv26Kbvd/5h+Lsrl0YSwEEkriys+Pii41VAogcvITBF4tvP6Q7vv3pK2K2dOv3r0xtfvm9w+4c5IOa60b+e25MXvdInufZjobJHRHtF1LpJ33GnbePCGAzPssa/cP7vxw29ce9s3R528x6YdnE/bFOSf/zoahHaBgsP8fJT4aNv6QA08UAUJdKhaKmFNpRIgLyAcZRrZbOqDKXBLCuxLgcEUSOUaDWvOoM4LVo/Jmi+K0QRIqAAwjA6Jbs6LxXoqyxn0Jo4wyGKd+Rm2E1EeT35xhWozuNwAIYtFCre5KrtkIBkvLgZRB0SZiC+T27LSA6lcocZCHnCgCVbFFShv578ZLaxFzyWylk4s3wrq6GCrAJ4OzG7cJEaLnmSplDEC4IgnJN/ykDkuFX1cwmv0lWYz3hIDvoVso86/Vps+pSBYkyMSGcmMJm28wuT3+HbX02MFwWlUdL7hTXBWlQD+AxrMRqMpkS+7kjNlv5pEvH4W6nhvQpqfIf74FVZvn4bECvmStW2qMoVAgSwUmhuiYiSiR59taT5DfIUg7yI+QpB7iRsIMk0AE+EncCee+1iwiT3A3sRSBXYECtjM8MkomI+CIGr4xETJaLSaebAKFqugXp2uklWPWhyemZkYRkScET3hcMCDbBqE3p5Vg9Ats370vOodyjKDBs45/B6Hb9BLbNuBrnMaae3QnulFybABz7N5TtnjK5E01SN55AXJkx8V6HCc3x0P5UIsP7i7mtk5GudnbtkUHqxkrGYXq1PwvClXq+dFpTBaCPirmwq5/RskfvSakWhTCrMOpy5MPpvYlU/EbHzaFWnXakFPe25vPXlgc5kxMzoTqwYzw4sDQSNlCddjoYF6ze9rTi82covjcSNrdNq657d9DtK6n9jbrvu53/WBu30P+8imb4OP9PsyPtJnJ8BHSXCMvIcks+QgSTJkgCRJk0Zg7Ebk9fABh0aUGfDy0tuyaXB2+ey7cr4r031eMfvX6BsYTWXqd4y8ikvXQx/XBWqZTipf5zQfyw9GWUowUG/9tDwk6JcrYivlEgRXqiWS37InWrGfYt1LA+XkB+D4q8T+dvFEEiwkDyfJB1nwAANO6cG9NKhU3DlCJQ3mAJML5KQclcuZ6+6A4DR7nKDCVd1w5C9EoVBE4hAr2Mi26OoA8nPfsO0qTCpsaYQvt3hkYxduN/lzxQdqbb/K7Ajuvvqq6F/9OY2six+XWgENaQrUdw2HZsZbNrNdB7lpTYKasic7HO3cXj8Rq45Hja+9Ar4gqwm25Gi2s91QHhqtigZPMuAplcs+8LlAKWLHuhMN56/AuvF97bGyB6g8dk/YQzk0ZQ3cJiqNRvD4rB4N7fEFgz6fx82yGtrp1rhpyem2OuH/6I/HrfMFnVYVoFnO0tUse17jFsQH8uihEgNkZqASA+woxh9CGwN/gg0MjKIwiow7PNh6CHexo4ZqJdaPPp1OG3WdP6ONGkUiDJhQJszbOv8gdj5lEwWkHvHA4rZGHMsvk6w36nfqXE6e5+pbS8tWaixf8Shkm8t96YcqqGgSTeLP2/feZgDxeMBi4QQ9yxL6ZDInBT5XfrlMzpRBtQzqpekSqSmB0zR4Pw1UNKBLZaryucLLBfKxAri9ACYLoFIAR/In8g/kqXoe3OIH/nyhqFMG7g8AIsAESH1AH6i0CUIrVJrNCu0v6hTWQknXSMVZKLIShFlGGLb9kfVvdqA8Q5yi3qtiMa8Uia162YXAkDKZyRSG8Ye8pl3aQqzF0zXHZEcKRKi2h9MnWJ/doNf/6KtRd1wUrOBuncfJaAxG1bvfpqASzHoCRpCDLD3p6nw33PmPzi/FztecYTHiguim9HazleeW/wh8/UB7LKDkeZK223T+UMi4/C9gWe0Nhox2H6sleV7JxmfbF5fJo8uPUvH6cFAtr4UXysoQXItZoGk/Fo1KzWbB4SCMY8YRaSLHFaSJAFcI0Xk/V+BGDcYRo944EqIPFo4XThWoLRD7RlCAn0pcwcpxBZeL46AxRY9npQlJFwzRoQckcIeEFu84DQ7RQKJDtDAhWScmJMjAQyAUGpmbnZ2YGGm3pREwMtIuNEJhKcZFm/TEDOemgdHBOa8gaPQKWks5XOmFIx5dN2U/8IEW54xxaQn/YWV6Z1dfN61cNplMLLQucOwEryLoLZq/J3wj8kKagKVre3ejJpCP4MW1oQSAFqDwev6rNcxZFEaf6/BDBptBbbS7aDDlbkxszX3gfHq8Kjk7JXUw6GLsTzxIOywG1unWdj7vLA1vKX16yZGrj8SR2a2zWzWsNx3+zDctXodVZzLrFIDnrfmF0Wc73xrfENaSKOJiYSyBwM+/rg+EQozJTCuAIABtZNP034AEP1oO8Yi/wPXVYF3oZHvQYtHD1dHQek1XE8rlElDtSdB6t5f26iW3F5r9XpvNzXsFMZHwWsQQJ0CVx23XAL2Fs16+EkhZr2J2ey63hsE4cV4//ETTZTerEYu5y2oHmppa5TNrAHlbvEKHQi6b6VvP+bwmV9AMGs5oXAr8TOEbbHSc2Sav7/yzwx+I+hHT0VrNjqij86fAnipCW5KmkHlWy3Y+9SN+MMcJgjk+mv9T8Lt82qNDOClDmfl/IE4sxPZ2+j4t0Ko1GsKtA1od2AaADhBAoHVWmtZBZNmQv4LWAJGmzbqemDwL/yEWgbNAVlEVC2d6Lo+M8250lQrK6Qq8hfrL5V3gQ1sP1jz6cPjiIfLJzusbduadesFLvXXx6mBtQ7rzc+rT5szGJtB37SjlKBzjDDEPueTRO0bBjtEjo2R4iwhEwWxiGNnNLwmQEFKbpqfr9aFWS8rOWbNSZn4uOxeZA3OpSiWSjaAQwGyqVc9GK1xENIsoFBBJZ8T52VnnSkSgGqGHprkNc3M9XQAqtchhvNQPDMDtgRTebpSgs5RHGxB9cvY8i0LTi8ydZ5aWjEtKJ5Pornou048fIPWLObeYw9kEjvV96msCCI1VMUmcX9P3Z1lYnlL8L5OotCSnB378R+UBTktBwldz7eqXVQ4pfrg4P1T1h3df/KfGoE/R+Zdr9bTV59N2zlmgYmoDw7RBo/AIYd3fKn4OlZPEUNrZ+aAlXA13PhYdiFo7n/MLFqUtPVX6d8GdaYWf+SunwFodBgX8CaUjFSfvsXodFp3NTpP88vfBDzteQrb3/035E+ofoMWxk/hIm9c4hJ2iwLNGk2mUAIBv8yAr+4wCPLWT38nvnkcmSGiuCIrTYrM50g1UoNN1Ag7KwfI866B8ahE5E1/ZKqbTPjFM4/MfUXWcAy4BNIt763JB9uXL1hu7gm7kHrkiggFxeBm6UdGr7CmAGq4KO/ZBPqjsxrH6iWLKx3hNqDCW+JvnIrWoDfIad7Lmf47xRhz3R0ebdZ+wcXmRdgf0kYhftemB6zYWPSpzqLLppk/sM41Ho2MG0rn8u7b85tZVHxhzBabv2DW2NW0kL7QneE3nNO2v5zofr0HLpPMpzm8kdbH5kUtQTSVj43tvuLVuaW9Y2Dpb5+EHil/GJ8v+ybs+v2fvf79lOFCZimE5JnZ9jHHijnbBYbvXDq6232wn7XZ/MhqAtlNQHfRrNQFXwK/WECqtEPJrRHVQDKjhw0VEuTjCs4tz2E2iA7nIzzIXZPYmB5YxpZ99Z4l555t3nlFAHdO5xHRfMHLAaLHnqfSBsk19hbeyAdTF8hqP5UsvXemzfPjh1V7L82eqH+o8fpnn8qlDpfeBxa73koJ092eKssIM9f8MMQhl+LbDETBmBhMUuCkArg6AbQFwewYcyYCrGbCZAWMM8AcyjIkw7SavI8kpEtw0CA4Ngu2DSE7vkI5Am9AAyEHJAAkSGCUTYYWwJhsiVstzScAkA8lHkp9NKpJJ5TAAA+jzuvK+QXB8EAzeFwDHAyAgim5oFbr8gIaqGOnWPSiBExKQHsygkWSKIm0yGhkllI2kgcZurPwiTtxELj34D1pzKLmh/x7bbjKKoZ6FfXoMUtRAXw07s+Yt1mMdkXIa9MJUZYd6xbKLlHthWijAcaBLgWX47aHbp1pbP/zivo1PTt0p3BWthEzITcZv2rYQm9cK9W0DsnPMbbBrQ/Dd8FUjcadGCZlJMfTghq9ce9fX7h3O1x8OfiS29+qrkshZpnMng4umQl6s77r+mk3svo+GM6ZsJpSc3Hfkuow4NVyzdf1lxyHdSsQwcWdb98koOBy9LXp/lAoj1CaqVcOoDZ1OGlBRKsmbFQxWjWG4KXrn/KApn3+R8VN+i120IveEJVsQsd85kDiWUCQ0Sk6N4z3vLuawbw0Zc7m+m2Lp7UVMuxdwJbz4XnErnEGk6OOvuDpfAtkG+1b8ayj5jqQGRnlt6mAjMDUxnOfaB27KxQezojHQ4KUNJS7VnvSaI7xX83WxFrMJgpJr1cmt9TYHlVd7tC7yOsbgTTY3Fba9r25Ta2mqwhr4gc1Se0vORimVJMQZ3OsKFPcOEgPE+9vWB4qgVpwqkrXMVIb8EDTn+RAO9KeQwdjOPZL7bE6ZyzmaYkhwBBiX2xFOiCZ3SBQdjjIygAfKYmB12B9H+qCgQ+LtnaVugokcLJUtyXUSAPhivuuJDNqC7OWJANxjKBEgNl5u3nbbHa3OYqoc0D38ME4FqANf5wc0n5Acni17UDrALTgdQFg3HQDE8sCHMwI6Ur5z4zpJAXJs9NJPFZPUL4gicabtuq8ATrnBLW5wjRtsc4P7siArmCUBmYm5dsw4aAaSGZgtRqPFTIlljdonBESL5FRCODMLFSMdyyqdYgK5XVDYXCcqdSs12shXC8XMIiurgedzrFkWTajuHz56hf8AEw/cegDXckK7styNMbM9gusG/eBOVUyW956cPndzKH/XzNWLH3v4XXOxNcaP7qm5Oq+nGyFj4qonbp664+pZ79mxY3Nx4B+6aVPmJffw6KnjN5yM/Ic7HbImdz+4b/lVwRxtJcGme144lg+Up+I/ofPT+3A+Jc7tUn7bHGY+j3smOIiPEbvkngnxpFrTJpOvUv+71zNhHfj9xE/XwifWg3+jD/8kcZbYJMNnEgg+sx78yT78U8RrcO3k+5cQfHw9+Gof/gDxAlx3Z1tHkUQTDYgi6/I3VvqOyt/Z3f/OF4kvXDpL2PB3ct3vEJmVcwUmO/egnCMI/wUM/yXiEqEidC8DYn7I4Wj3zj+Uc1Awbp5CfZ0NjrswZgBRKWvINqj0R34FLMLjE0QXulRC0OW185Th3+jDP0k8LuMREPVymmiD+nrw1T78AeIhGS8kIKYqabJNgvHL8YLj5XhMX5TH/73uiPx+m60N/KvHj2D/HfU+7cLu/5OdMizHaTRtwK2GVUGlsIrHLsM++Z3uyEOcBt43tAr20s8hbASPW4Y98FJv1Fk/BEbnQKyMGt4bx9swvbwo0wvQyvQCiFjRDPEYW4sXHIvCc3ypS+9v9+i3WLQLbbL46+H3A1cPPp9H8IX14N/owz9J/HuP3isFBF9ZD/7uPvxTxL8R+e79Wwg+vx58tQ9/AML36H0cTQA1X7tsXbFfEc/hje6cf9ajtUYjkG+DxtrfuBx+P0j04Ot1BF9fD/6NPvyTwNKjzfYAgm+vB1/twx8AfJ8259CASDCz3p7V4DF9tbtfLvbGVCjAZ1BYjy8Q/T3+NPHKpVdkvCYT78nXHuvDP0M8R0zK8LE8gi9dBt/ZjHJi+/DPkzvgHHQvk0Q6bbev8AScr4jH/YUuLv29cQ8OZrNtMHTl+pIYlzL8C8Qve7gcbCP4wV8P/yTESw/3+P5j68Gf7sM/S/wLMSvDTw6vA4/zCfH9n+yOp8+/S0VH/Aq8dPURM8l8cxUfIvp86Gnio/I6IK6I+FZlPb71WB/+GeLD8joAothC8EPrwZ/uwz9LPNCbT7OyHl/sbEZ5gn3458F5vG5w+jVX+HJevsJvX4BysYvXUhHdt3QlXj+Fx/2MPG6Q7I27PYXwOrse/Bt9+CdBtXf/saH11q1zAuXA9eH/GuS6456fj0TW0tunMD5kuGdBsYePsbF17otzx/A4nu3ST6c3joFGDazFN9Q3e7lmw8Q48YF2w+lMJKq5mDsY4IURNpcbnFQPDNLVcSYvDANU7ScO8aM5cXwUPhy1gWosySVqtJtWOzintutB66eZ9XOXsf8Zapzn4dNKxhn88Nzb3SyhrGTJF1cr5sE171DpznsnovFKCCc+vJJhBn6wko320EPr56M9THEdH/mPzpUsMye3kpbmzHfC75GYBv7+8ccfx73v/gwicBrzelm2PfVSXsa0L4bkoG+1HDwLYafwvpFhn36pu2v8WGaulsWXfgZho5j2ZNhnXupSnjeMYGNr5HZnM8qJ68M+L8hU5PV2uVZfDzjdh3n2pS4Fif7L5TURgfQGbTYGwzJq5kukDdMVyn97CNPVl2SZz/V2Ty6qXL178JhOoLwzCPucTNvEX3Rpe+vWELtC2zh3CvPS52Wd4+ddTioIHnhP8bJ7Ih9IFxbd84XuPfN5t+Wye1I/k+EYteFD4NnOyf7nb/U/fxZMLd/U1ze+3dc39sN93h1FLBY0XaFvWODcHsL3ebG7b/XdcVQqCLw3Dvm+b/ThXgDW3j6MRS+/b9euyUK7Zow41nbsaB9pk7dGwC0BcNr/CT95sx8U1Rmc/OBpBpog08w0TRPOMcFk05oqYi6uGxsUnT5UCGfjHCgbUqXtWsdy57LWuQtr6gmQCXO+lxQrrq226e67JtWv8+slxpa67jOUKA9wQTg2kdXeStbScbH5ikeJ9+AEN7b9yODG0/uK1ng7EVlsCdWINebzR4wGl9VZNBgsN96U3bFhxPuj+HjBJwjB0phIOvBG/HZ6c1MYu+tL1048cNvVYjjrCqdtqWRGCrj4ePwL9/7inyKDW9IrehPR15ueJn7S0weKhffU+x7rwz9D/HNPH8gNIPjWevDf6cM/B/nu7q5ehhVFqvcLKzoNzs3AtPRqV6f5ek+3nJwcbbTJibW/YYe0xGFaerVL0z/s6hzbtqmJFVqS7/tGH+4F4pM9mT0+hu47vva+OI8Bj+M1eV8d6VL0hg3Dw20wt3pfybBv9GGfTHWpdPMcgt28BrZzO8qP6MN+qSpT/tycx9PjNZff74VE934bZtH9Nqy934k19/vrjHy/xcWV+2U6t6McAAjzetdWO9Pdb6GQXbuCowzkD6vh/pr4TBdOktbAoZwCPL7Xu7h8pLcvgwEHtHSCa/dlLwchQsy3wxEx7CEJYNbrtALns3nCYQA0nFbUezwaixllefpX0g1ay93Eapz1lQGZ8+eWls8tnX03d455GztUu6GCoC24JkaE/C1XJB8AZec/VhIQ/u3fLktB6OzN/2olCeFXefB7vTSEvn5+d18/fwqIRFdS1cffU/8n+vBPA0NPx2sMvKd98Vgf/hl4/67Eqo0g+PH14Dt9+C9C+Ou79sKwbC+017d5vtP/Tn8/kl0jhuyNqne4EiA0UKdH+RebiTvb9YXxw+PkhxLgwTiYjINTNNi0qRCeCTpdZnNtBqik9gzIzgBmJjBDzswktxZqQi5ZzIFN3GaUR9/WDYlhQ0zntLm8JqKVP4fKDa7MyVhcPo9enM2dY6sryRmrcjPksCqqzi87VuoNyujlb5qz4d9W8FTSvlLeIllN0S2lcC1m8+cHeVfKenkmx+6h98zkqIxYddHaZLwwZtT7ojlXshpITDXzVgX1G+Z3IFsC5TrgvfSVrs779729NDrYTLbB6GW2B4b/dh9+P1y7LmcaGkLwg+vBr9zfAd7s6b7t9nvCV/vwB8D/7NuhW9APkGDj+nboG3079Enizd4cqkWVsQ2qV9qVGvwbX+3a63/R/42JUg55NEb/M1vXQXxhxTeEfuMy2wPHcDH817pypG/fOxwWKBjs68Gf7sM/S/y0hycfhnevB/9GH/4F4ue9OdusCN62ji2t+rBsGzMR2b+Gx/Ua4IhQ26ogRkYqzXbP3aYY7jrcMt3GzPI9lKN4Tl/vrr2nJxs3bdJAe3zz5fL3z7p+mqWuXtaS4SliZBgdmTiyzhihLFGhMcoyE9Vlwvd/uKaeykcU2xYfIAib38vYjGrBRqhFD+dDSpOB4YxdpQnFwNfm6f+66ihbarr2C02gVeq4is0gDY2MCqqHio9k3MtD+UnJ3ktJTI6kHTy2uyyorh4KCopQERvbEaVCqVIIFGmlSIoigVJFACVkSgTUGuFYgUohEhQNSNnCavUrZc/00xJYkMfvUVJCVsqDPIhogQV81wte+YvO33X+hLpw0TJOPrO8uWcLY9w8tUIP+P3XVmxI/P5ZXOOKbAI7zvdOQCvx+rZ/xwiYGAE7mmCiCbaWwHgJbJXAuAS2hYCB1gVQLnetZp+0AlsSZ3vb9VYW6NQsO5gXRd2g6OlleEPkvvM2Mgghtt+VcxgvwGe5e3E3sS0vhxtLSCoWwgkQUtl48T/JAgdXh/XerJAZLofDxXFppBTufGPq9CvXH3v99NT06csTw6/I0SV/P5D06PPtzqfhNm597TfOEu/ZWhh3X+zZI9gWUiFbqFvbVYW4FCAeC263EBJASLCarVar2emEf1itFgiCxJqsrElgdTqTiQ15rE6TDikabtrM9kigl6giE0Kvzqab78bmu7XSvRyVrCSuTThYWyQdoQCg1aj6uXPeGo0nnGCTCdxiDkfjqEA6yNkZ46+e6xU/C8AQHqmg6uhI1kf3q6PJBO7/INebwPm+sGIH4fe41yJRh39ehPuQhpipEp9v74cyhfQ4P+ICd7vAHtf1LjLjarnmXJTLRZEkXY9Fo3RYf1IHjunARt1+HRnQSTqohet0Wtrl0pOkVg8f6kfMwCwEPJ5wqRQNhKPRcIBSZ4QqrRa6wa9eYgEuP8owuFF27x1A1ZA4FfQcSjDAW371B1nJErTxacAHQ2rekbdCGwgRJDKCEE1GMFGihA5enUcpQPZ8EF4tNUCeDe6kamFyar4z/qgq/JFwwFwSXwuXGLMpHPZ6tr2WqpiMuvAzfNTvHwY/TQxYROHiGeqtfxsov398lNVpNDpNMtR5tuZyGgy6mC8GB63RmQzuObbzgxX/UBnzvZfW1A5miFabi8e1mYgnKGScOhaSFRuP6CAVxWinhyNEt4yY5aWeFoP5XaZbBwg5XpC1InMPZ4ABNFlUK5kGOMsPoOmi63Y5QaxIDXd8RtZcz3dcpabRYGANpoG84uZCxWxkjQbvoU4gUw/qqd9ZLmUHWbMVZXPZrWwjS85kBwwmE8nzpNFsqGWXX4TXw/AyaY60JKLH21HdBZzjy705UidxHeA97REKkOQpB3DYx41AaQRGt8stGYxWt8dgtOvDelLv9rgFg95q0LsNNrsBPlw+j8dlt7mMgoM2ePQiCTAmzl3IZ1oX8t3uXrLr6txK9driGY0zAVktCsaz+UW05zBhOHAVOaQNlBeFaKLsoIJFLXBSgjWstHoCZnMl1nkVDHY+CY6XNnv9kimcurgEPtK5iXrrkliKeGiNrnOqc4uZMQ8V1J2/CIGXwfdWbBU879dX9Aj8/qsyX4bv5yAeRCINefix14ggZLZ0oaxweYmykDYi3utIpO0qizYdLotedA5ixkJZXHbRiXRaRzojElDqZ6Hg1zLagJbSUipO0Y2qL/bj6jiqvrSEGPUFHFpHLyBH4QDmIKVyT42FaEDqq6qbkgCwruvI43TbCPlRxeRYJz0ypTr4B7e0h2/9g/2qiTHwV2OTiqOfP1YbPP4HnV/U9w6LJ08+VdkzGr7n5AOljCBkSuV9J6fn7t5VUJYknpdKyvreO8cmT+6vkI9Soclbtz/ykAYEJm7bBZ9lP5Wc8wlx9Ef9/fBx6gfQHvngc9kEzksqhRtDs0Okacg/lBmihgLh3MjQCEmMMCOBEWrER9C4yYDve0qgdBBCPVwnREc4zI0McsMSl83qOJoeXltqjc9wRKjp1fcsIbTB/fT2Ei5yg3/eRlVaQFbo8yhL1qhUr7H6cC+CSJGjUOXxakuAfHpmR5qhKH9z77DDy6oA0Psru+7dhfqVdNy5Zkh/72d3+ClSxfgc7b2tIKlgMjtmlVy7Dn5UbEGy/NvwxDXt5u4mJ5D60IBUP7R1RPJR35YGY2ZBYCJD+W8rCgc+ui9dDZkogXSVF8db10xEQCQ9mrTzvCU+mu/Wku6G26RKfKQdPlUEtxTB8Qw4EQcPhsFpC1RYypWyxy0KYhk+ctFQMIjyal6WoiAarecQQt06AgBdKARAuSyKbpXK7VEKQoVOiUxXHUBpSHL77Bw2mCHrZeQKsBzmyphhM6heH9fqy/pBOY+48aoKBkR5JiBnhNmC5W42Zj/tNRgJU/X2eVXr+M7S9JnXrj/6yn2Tqc23TmrOi2kPTfKdaXZhf2bj0ebQ0fmkOTFWMHbGl6vlmGHw4Kn5XY/fPNw+9qld03cfmnbELP6offkHgd9/eM/HDuQrBz+8pf6+nWP27/+X4uq/bfxY9vN/u+/n3w9yKzFA5OdvroX/beK7v22MFNMGgmdbXfj0SnwxF22jVKorbajfOPb3W8eQ/ys22m8dX0e+oUu/UtwI+W+bOPKS5PV4Yiyi82QoVB5qN1tlkgDamJAjyqCcyXES7fWLrlhE3wRavV7jcekqq3xFecQ53l1CaY2Y6aIDFJaX3s6dQ22ssVqMAM6vOI36rY9wvUc/+wRRutq2XhnLJgOv8qcHQndNfWbT5LGZSJg3pwtV71yJdXDW2rgpOlZ+dL/GW0x16sjDtLfvX/qbVC1o6NyxeaK09+6JibskR9hjDAW12pN3SIc2l+76VaydsF9W+9K1v4YxTcS7a/xIb40DAbW6DQJr/WyQ5qgfQb24TpxoR4q50RwpVw5SO9XXqm9XU+l00s95fT4OKpABDnBcI4NtCxtN1DkukhIzdfhQRkSTz+dC1YAvlLrZPPl+KxjcHQL1g8Fddha73WBwi3PMTcTLi/QpXA1lwZVUcnOpoC0ol02VqR9Z2lc9uHjjl89Mb/nIlw9HGrkoa+dsBqXOa+QZQRcLORujk8LE7TuKCvB45ypSqE1u2BAqHdg66XuX3z5TmLjv9ZuOLz00p9YZ1bReTXGxzv8X3pziUn5T7ein9zV3nNrXEk1caTrV96tiPe+1ldyOFTvjt94j3X4G8PtfkmtbL/1CeRrScouYI461DTViTrCaoDpldFg1CM/cRGACWCesExsdUjlESECqlbnq3KwIwLBNrCJ1Qt8eFg1x0e83cQY5nffcOUTNCOsXcriIefHs+Qu9AAT2mHUbfvWT8HrxPbYXd5A7psp1aU3QAFgF7TvJVqfrqalby/Frjlw1mxYXPnpdJxqtCWzn77RmryV8ZLo2EOHMnNfLhPJWu9VsMDVy1PZsg9cHimxycyucmNhbCIXIkNISqm9vFA/OSYKBb2bJv+78y/VP37sn0BwciHhiUJVNlWpf/tg3parBZOF5JtLOLBdVCk95Y6k8X3SriF5MVfkYxOUQsZm4vW1QqzkuKWzWmARCcCBcBqcF+MhvrabzA8khUchvNonz8/CF4B2oos4ddexxHB4TvekE/K6322YBIbPXvwOfG41aLby9ciINirQun+1HVHFJeKQfQr0cxe/ZywOsbRpFvqMP1jPg+1JDMHQRHNv98es6BaEatnbuVXsquU6y3+HjzUzFpyGjwYI5uamN0WoOmkkbALF62AIgysKN1C9XYVkXqGeBe72+H6nRzE866RXkUlTXH6/4XYjbUWKxLSSTot1r0Qpeb358oFbPtxpNQhRS+VpTDBEUlSiMig2U+5y2WxJc0tZvTycraudy7+JywNVsdvk8cx6zA5wZiswfH5CtINkQWk2EEDfrcdqgzKFJw+jDOyav9+g1SqXCbNDHPZ2t2220nuXZiLt0bGAdVmvvsWiSnd0wOOw7Mv9ovKinLSqVChpESq+hIT264X0+g6k1+ssruC5m0/0YqAL72tj9XXms7fHexcVksQ32rJXH3KWfKoaUn4Hw1yLeYfrlwDSOnNTzCp0cOYF6dOcfu3kCm9v+20hQzxSFSCpliQwThC5icQk6s0onWdkUl7Yg6tXWVdxwgxeRNXFh6eyKlYmikLiGGNvZcpeWRYBO+sF2JNuvI+ualyhdXz7ZpU/MuC8EXA3Z6CbbVHvodOcH8bpoZsSBBPhxfCBiJknKqI0GALNLq2X4Whx8Pz4gmnXBZr7z3auPWXWazj9+aqglAGOoniEX0/WgARInaQjW0stPxDMaVqUkTcYD5P5UNYiMU0NwIL383yM1SMPC/FBgOHyFz1He99QJiCMTUSP2vOj3cVwBKwSMMqAklUrbgJexxfSCTU+LMbl7D2T6XCxqIESGq9LRrh9SblqFT3eT2ySu7leFz5ZBvVn7bA8yQeUK4hyysMI1EStVv0GwJG0fiiSmr6oIfle9c3UPWRRniCijfqObz4vnWtJsu+RKz5S42C64wflqn6919qsUtjW4+mlrhlHr1FTnLkpNqw2JgZk02s9X+l57ugB6j3QBiCc9pKUk9lEMQP44fcoFbnGBgy4w5trmIh+0gNstYNKyw3LEQrGolveROqjXI83jJVDiJCni9UPxTxARJkJGWK+DM3Fl0UGTGW5ABH2XxoVl2au4ePbdxXO4fhpjb/ndb660ELas9mNAMmMR6sLIyQM/5lns8+iaD8jtoVQhiaSWifE56g6pzhqttN5YLoYce4fbC53vPbs1FtUGm1eHowWW0dGs02jOhQGpDrs9Yylwy2GrBZW/GUzGAWn5n+f2GK2uztePftBuX8jsKYGWcmRo8LG9ex8dEHNBi1pLkd63Ou8sLHwgb7XsIP+OuNxvK9e/KV+Ctu1p4lfth6bv2HUHef9WcGIrOLwV7NgKPjkP7p8HJ+bBwvzheXLUuNVI3nbbyePg2HGw/zgQjheOk8eF26eOTu26Rto8lToNTudGQHAEjNw9Jajd6qRfahdBUc2yH7GCG6x3W8mEtW4lrYJJ3RgE6UEwCOrqq/YsLAy7j6rrU+LdavUpZCLHhExmGHOA21hwirvdhLoyyQWoLawRYOaLo6JVpH6dg9YytpDfvYBcDhnm7UV0cBiDXRBL8GP87u0LuCXKmqYNMr/gMRdQU10nFfrXb+vXb7iOGThVB6u5Sze6VsaMvttDVG4gSqllfo8LIqk0kP3+DhtYDhUFi90XMGhyqU92vlfd6PMPh8Ob0y7e62EZt91G6zheYKP84FBrwWXwW2z+SCGesQjFEPhTocibY1wi6NSaPG4P494x1BhOhaxBr9ekczidBqPbH3b6YwxbjScb5Uaq872f6ZNhq5kvCgJANUTAZzPScxs6vxQ0gZB480DzgJUNl2YrubJHZTKbEm6xVIs7JmtDmzIs0GXrARp51VDgr/OvtMXNOOe3zbvitRwfSEBwjbecyU+Vo2adwJp3Tc9sjqO+lk/YhM4PcrUADbr9piOXfkr+Au0q4oNt7X02ELEBW45B/S2rhBsyt0oqUH2kSgZSj6TIXDWVquYoYpAPhVqkBDV+kgjxfNSWE/MEfAxERb9uQNQpdSSpk6tjkEGP0+2x+lKVz59aPIc7Na5Ot2fx6ZQWNt9LP+knp/SqX8Ld4hfszg7zxZUkFZV6i6Cy2ljek9w+MHz9TNxfnZcK21t8ds/922/7w4GApTo2HytuLHuHpoYP5beEmhuu3nXkFht5HvidboPayPCt7fnMbDNtpFND2wvtI9Ox/VfbuWLUEazOpZqHfN6i1mA9Mjm/9+arV/tgR6AmLanVLlegkSBGggEiEJRGCOsIERwR8rVU3g5VwkACbboAoXA1akj1G0D6Sipud3HOBL0mmw4VZ0NJ8PYSFqFfP6NYdaze20s9nW9FP1atsLZVLty+NpO/zK3Lr7h1qWEna8ylwfcLVZPRwhpN1VInUCiaTEzHp1EpzUYmHe5APsgabCxrbGTAj7M11mijCsm0QWfkedZkqEvLny/UDSyLHL2MmclnSd/yn3oDOtqq1GjhZxCmkiX3SzUGopcnTayxIi3/A7HKt4H0kb1r9JHZ0eFATx/BOg71I6jX/En7+lu2gUMbwPgGMFiUZrcCBRAWtloXFrZer7hLQS4qwKl5sGUejM0DxfyC3jTrnyWPLYD9C2B+AYwsAHGhuEDOLswueBd5uzcYBkQYhBkrsKb0gndypNkUt+6aT4kKoNdbwzwnohVa2GWxc8Da638ma5TmKqLgLlNbRhVIvRZX/d4zbO/Mjm5hrZO5cBbztBjAchstxHu73btrKruZMeu6jHupMS9EPkS8xIrRztuO3eN8Mc7pmUTAZDS26p1QJmNiGNZghNTybn7QaLTFq2x61Ma63D6bzu921PjqaJy3Bv1+s5tlw+GFljOTrwSG9/r9M1LgA7vTQ2mvltZ2LmRLBr0dL7DRUEOLWTUYzZDnMEYo4Tr/R6kwjojc4FDby/qMOlMh6k1ASnDbD+2+0aO0R+rxndf7uQjuE/ELRRTulxox3hazYlww5UG+VhsIGSAT8TAe0lPIcnkbQ9N5WgxxUMXvy/muREE1omfPo8wLKOKX5NjFf2pArhL9shsb4pr8XudP3stkbEnU+/Z5DTabwdCSOoF8wWCyUr/zaw3EANoIT2SLjMksCKzRWM2uFyNbE2+9PKaz+jpbvjIe0ssBx/BfuDJuAPGL9XtcJ3+i3bxVDR5TAQA0KjqhwqXyCSKVMJlojZZO0HaLXUrQ1kSCZiyBhD1BxnifLpWzsCqSNnIm0CuS/6ZcJH/uHK6OOvvOWZme+y0JmHfPnlkVfMTKVrf5BqqR6saQKDkjBqyW0/lcGW8FEOHAy8eSkfOfKeQkMFfdFfjGbNZR9PmG/I3BcIBN21kHPdDuPGINsOaMj3orRBasmwY7vwf23hr1elQ8rxqf7Mw8PSEWWJZNC56E3qBR30JeG4gaWUbRs5PmMF4H1o8ddG2eQeJQO7tTca2CfJACt1PgCAWmqJ0UWQCDNSGezTqIOIjHjcMOTjDaNMaC05blcigN8xXNIMeLAB23cP7CZSZQ97wFaAG9e+6bvUQhHhNnjxiv2PjWbmjxPWJxaMd/MGTZGDmxedkktfUGi8lgRew5X4e7XKPZBvRSEVoiZobJ55BBD7m7xagvSZ1/PLY9lhBsRmMRbeMyql/leSva1cunJrVGjUqdiZM3SHWDHu1v0sBius5XdHrUpwf+p/BCPE0Rs21/rdZWe0WXlhGmRHGmLVTSU+NiNOqtlZF4Q46iF70uziMHTnreDBx1OytXJ6JDM5ZkG3x9Ydbdr0h7g3jA1APB5J1N9aG7djva9uSbOrWlnQffH2rrlbROpbIbTIlgJxDKBKxqtWHjk3MLx51qjUat8kdiZvD3Aw2TRqtUGWcytbvHKCZeMgQcPO9368vR5ZeSOYPBqlJBGaYxWnSGdJK4JCakAcvG+hPQWGctqEGDz2vMhO+RBq2psNvX7+mqOgxxtIfY3eb3bNgqjM7MSKMRqSxE0ukI6xQ0JlITmZtJm01ZbpbNYA2a3MOBAUhAGFmoHWCvkQvIvC0TEaKfs4z83O13+h5CvYe7OpCt6cvJB50n28PpFXSHv2vPqw7/3y/5hqwmt9lobErgW5EYJDBAkXqlhnN/Z5ox6HW6VAQ8FpZorUHPbv5zm8ekIQFp0eulMPjOYNOo0RqUSqfBNQlVWrO+gaitDoUGz1Os0TCQWn4inNZpjBSlMOgPkfsTRXSMNLwI9ZEsvLiHYRVqnUojJaBhXjIYHTKuy6Hlz0cyOtqhMvX2Lcb1IeK29tBD+8Ed+8HO/dfuJ6f3g9p+ENsP9uye2SwMT02lh8V0URCTSZFxCIgViWA3dyhYE/ccomenkqwxw00zqbUtdM4vy/0Y11uAN/vGZf7XLIP9v7oKXeJnuxFn5xVLQZIqw2++EhqK0UE6FXRcejAV2N/+NUtiVv/2KzJrpe1qrarz9ej8WMWkp2XfaAbrbW8RLJT2m14jitCEiHb9I64BkScEILjSYb1gdulpMZNxE6KFq9G8W4xgxQtJ/fO4tXUG+UXO4sOTF2XfHWqluMYvQil7q9A9GAJ553rcQZY22HYgH5W2DUYSU1dVRL/e53V19uayJtZa9jTreZORJQUD+ZA0YDTYyvs+mF28Mbr70etWu0YoBQmqAoB2fT1L/g8SylCmEfkp1IL0tcK/Q7PuxC7sGaGwXxjRJQ+NoTni0GuEFh0QkJwbnhTqg8V6Ej5sG31EXrB5GFs+KwIQGeE8g9yQD7fni4jGuRLDFY1Y63xzibmw4g1e3VMSmVJv4/7HzAXsW7f33UB9Z2/PCF7jQAfrdNrFzZL3wYnnVvxCoWrcwQgDSfDjaD1qDRZYadtQGKEvFFJo1vRVrnkUWq6SIUNGQ99FhF2+SPMP6qAsAfpgI7ucWOVD73Dv2YZ5lY8N4XBCxqArkATJpK24CnMEEfFwuKvhy0JElNP6+h0412nA+Vvg6DfHxW81a8S3Bi79kPoH6hdEibin7bwmfmucPB4DV8N/+FTMHTQwGj046JVmGMMjhs8avmRQGAzeClEqedGhz94SFDIG0eQ1eW0qMauziZFghOMiV5raF2RDG3VGZ7GpjcJhK00AFhfLMqvJNRXlYDGIvClYVeMtVxjguG/CHmvaX7uvFtqwYbIqUJ2rwOPK4o4TExOnpVBMx6PW1HpaSPIHxo5++UMbpk5/+f17P3xwyPrP/qo7F2XC7f33bm/u+/TRWmMgtTkMdsU4vdXoGrv3y8eP/fHDm7LTC+FuXOXSD1UOiJ8CMU98sl0oz47PkpMToDIOKq2JFlmujdfIHbYjthM2aof1iJXcZQHbjGCrFmzXgJ0KsECBIsTei8DhCOOe8pbhZDCc8RNOIQxEpzOYzOAe+m09FxT99IDI6KZEVS9VUc7oR+TTj7rIQdkrDm3Pr5TOoNzECP8ekRbb5U1Fwb5vqTfc9/z7eu1r8zdcf/WGvPJb6zVRBw9SrDiKutqO4K62EdzVdizh1pK2q549OdXLV7Smp274b/vfo69655fv3WqUwAd0KFRwr2WJUWg5iPagVxiNxdUgkwXqrJQVVGqoCKkFKRbTjwPwIRVQqWoIr0796JAoxdWpVFFQgSCX5elcUbRz1n4fCtQbegk3FsXpMhfyuNsZOgTmfL/jFONcwrZcFucrovwOdD5Hfp3O0KoQH0fprqu7XUIDEpR9UiLuACS3abpYiIqbNs4GwJOFZpDWhRr5TsBVSvqMrFZjMXY+Br7K5LyZDRXO6E34ouN+g0snqKxcwgsaKm95x0h9t8/jNyl4S3I0u/xdaShmQZWBjQowkGSnQn2aVPvLM0lXOZ8wWfVkN9+4ofgwOrej7VQroc7p97F2k0aQG1N6OY2okqP/Zy9cWKcteLd90TqHxk0VprLQvNF2knLGcakV0OITGN5yZYbjP+klHK85dIEkHOTvkw3lJwgHXM182xm1gYjpLRMZ0QD9yXA47zxJ+AkLsLwKFp5PKJVE69zFxXNy/2WZvrt9l1EIUYG2/KqMW+Q1VTgqm/eGPc1mNen2pWsDZWvsqq3Vh4CG8WdCwZSPUQOtt5jiEj4zTSmCBz+yI8aK9S3Xj02/f0s1ZAzvfPQ6c3tmQzsaH5ybrBkKtx4cDpRGJyewPneCfBZ8F48914b6k4M2aQjypMlhsQM1TWiABo76OQAHfXHxHZRCgQImubPM+Rw+2Te/FofYIRgBE6LBFXZ3nvfHnFqNg+UsVuUnls/4gibK71eyATd4MV3Qab34983ks+QU/P0EsattRmvJnzQaXam4Vut0uVwQZyMvcnEVXE4w0jZfqwVV7aR2h5bSaYGWUAM1Gh2HR4f6eqPsJpTihLlvvnca2aolL/aa4qJoYp+VKNQ28HA07WXozFCHvuuTWzzBXMURLoXtqozKUdw5MbhY96qc6fkTWylaabAzH/fsf/j6reFohWdcfMTgGB+WovURrzVVHtl+dFSB5lWGNOGA82oQO9tRb8N9Uhk8WWkoKxVlg2JaiYSJaTRAw0uglkqEiU7nkWPsdbBA0GDkORuc0YWLi9gDkMEtCM8t4qMqu37b3pFFllXTifSms6pnUd890xWxr6OGsg4h7Qym/TZtVOMrzA+I4xX+mlLNo4zM3rwhOxRhBKszGU+6PZJgT4xsjSsySodYDnsTHqPZ4zey5kpetEVr4oYN1npd0kg7x+J6q1PnsLMW1iZmvdmhKIviUHBdZ+D8acJIjLcZA4Ha5dEKCpw06tUKNVpOk1GrIzKgBUgACBU69HHhOQLNfBFb7/LJcnlU15Vn3kHHU+JjBm2QwxehtKSC4J0bbri78yy4M6HoAFL5iU5094sv7gZ/+zudr8l2YR2uQUb5ACESg20XNKU1J32+CCmKDEMJAkWRFidhAAaEdBIinVhBegZuzxw+fxbrwpjU1fyKO3wtXhURC5nJ/yo7fMuOQm3PidbgRpF1RsMRO1dP+5T25Nxt2z6rfGD3Hp00ubdWvWoyEQ/Z7KyVdcYHBHU4V84ESeBFfCQIx1uEOOOg/lVtOwjCcDKZLPqVoZMOf1ap0RARwgzMiI0QXJeN9A+Cz+VkaocjNVLqtSpEsdBU5EE3R30l+4Dkh44uDDt9o/nkxoYYHdtbrl89EfNWt9308LbOw5TSFKrGrAneofeXE2JVeZxMTh9uGl3e0nyxuGc8ntl8Qzt37cEdw+HOGSbu5rfPFtlwM+WaGpE8Mv55OJ8yxL8OckUjoAjUg8mg09K0loLr/wIBAFhZc3xsY753bOM51AuRt8iUXSbLnV/u+f9/ovcLUXtsXvnAsot8kDKLIf3TOFcX7TUfxFuEqBDTxMa2aAKp1FjUWoSLXlWOjfGzRaBUNgFfJbgcbY3SwwQHOPTTNGYdaJsxsrcNpX6w2N1cRdoc6pEHt9naBMg1G0yuIpMRinxw3dae3YSxyFvuQtITHNicz29phvh8xY6ERnhoe7awcyhsEpqP+mN2rScSN5VGK5JVx3ktTKgYLk5oPMWUgmfDmZoQamV93nSNC5SSIb0vX6qF4uN5L5cbElwpqbjXFhF4Npp2qqopcShwQuOOFHgofb2NvMEfyQVX05UXyqdG2+1znFQGAvn4SQOkMF8GEZZoJggv8CKUmGWUMH3SkhuRQ10sjxlOefVRPl0aA2sTQeHk80NHd0DSGltDWu17vn4S3AgJi6+sIizyG2RihbD2jsclSFjTT9y3BZwwJdyhhZkiA8nKPQnJ6tIlwnHpX8kG+b8savY2gljeTGhfAIRFh5Kv5PjGCUhV38XXT+Dr6ucJDTRQcL2rmQDkFL52+xXXyvC+Dnztjt61sK57TQ+/N4OvfaD/m8jv2PvNOvxuhnwbXr+z911D77tBeK2Iv3tX/7vmVePl4fUy/u7dve+SulVj8uHv3oOv6V4kAcHhL19275P9e3t794b7YvzSDxUfhjr9LLFI3Ei80F7csLlV2yVIe1JSbfPRkUlOd1UAuRhVk4/PgtnZSYtV2jxptU5ulhTvv0oIP8CBDx0F9aMgdRRwR13HR8C2kUMj5PgIiI0A3QgzA7gNrdQexeHZ2cPbxCLq9HU4aGVcriBqsJ555yxzTm725aguQ4VUbmsvPyHtB0uyDIOMpEV0niW6ZsYbMZ9H4g0JOICzudEpAThbUM4hjPQpUNFv1tffmY5u/2m1/Cw3ju1vSpRHTynqTIjn2WAsEHAakvXJeKqmFenq8LAlNz+Ytwz+/p4dN7QdgeLw2JCbCQYa2yvR8aLfmZ+veiRJ8pjEoCMZXLYXUr66xEWdtLDf2yrxycFJjo4Uh8KFiWKUPMWTaovA1SdLWZ4t5sVKYnRLmvGni/aRLenRuWBm03g9Gzby+wf+X3FfAudUdS5+zl2z5ya52fc9k8wkmayTmUkms28wCwy7gAuCCCiCoOD+VHCjLkhV0KqAay22gutrtbXWbsBrq7WbYFdr/5WWZ9X3qkzmf865ycyA2PW9PvhNcnPu2c+3n+87p7CkO2SOFoPhzlKrJzHU3eE3trZ3ONxJv0oIp9rqSiWLP6JtXv60PpbvjrXMbbKzxmio7azRXkJjSwDwH7FXgHlgQ7l1dFQ9L5stDnvdvYF5rnmpaKA4D/0XFyD9VVRzPq04mk1pVUOujHpE0Ys0tCBvN3J+l8fjovCSYb2dHGkwZQs9jEVnYgPCpo/xw0jRHU+9gm1y1UiW6rGg2LhGjjnApje/5OZh8ObTOulSe7OJ2NhIWBRZBmygI45ePMfj0mYTESPzKHuW2WduWTb0I3twJDH+teTcgGnP4mhmgA8JTG53/ML29vahtXaDhtU6op5KyeiJOQSWFrRdyWQu169QOB29leaSz6hUMW3pnpj48ftXuKPBYMa9nlFpDKsWw1Lj+PpNfv+cxW2fr3x5rldl0PCBgMLgNAhDsOvuhmTcZhuuOM40mgVtIGBQ2h1zcUwhZJjvMCeQNHMN4s0KUCz29i7ZtGkJUnafPRCJxfzno4f9Lqt16Hn6WeAHmJOkj2EDwDFyoX0CCRXJRujXQC00SuDMVo8CJCAtffk5YnCnq3wlnwkRzQzmSeyTZB6gq+oaxN75ZoPkS5HLhrAjzeQLGr+A22lZ1PysKpFJaa0JgU5RNEMxgtGmjs4f6TCIdZnOeLKEIJhu7UzOR0qDS7R6PTK+ZfaSKGRYTYONkilU3ZlMX7CeYmlKJSh9IqQ5NsyqNcpYJm8RrajnlFqjsqspyPIyNqngqQlrXLicZjUqucVsUlhtiCemG4OGus5kbGbB58gNpTbJZbRCY1Brmtua1MpkU5NeaVAKbm0gbfpR/rJcT0u5GfYJ4aBPKSaserfO3+WvvBgatIh1XjPNe66D7PVWv0KMW4weQedvaI5U9nevk2SOe6AV3kJdgWQOb1mFg24AUh44gL4ThwoFayIBLdUHLClBPg7DaMLQXN2ic6hiZ6TVXqN3PvywsKpgaYvm1zW7uqR6bwRH4L1MN9CBjnK4R5grLBfoW5RwsxKWlLBBCdXqq1S3qiiLCqpUNGAUKrUaNZnGlqA0PlZ38WLUZi32Eooc78/ksohtCjQ2B5ngvVohjuShb/clO8wdlCl673qFVaezy+AY1O3Kn5+5G/WhHvXhI2YOgq7hcv1K0ybTjSZ6A3c9R3VxY9wyjuYsSqvVYtF5PR5BqfN4vVaOsSM1SiAdOUouY8SWqVRKMk1ZE+S6C+wjKPII8sKSYMNjG3gonDchZC4h8RxNzkfh+pkWB9J8ZDTLMfWU1mCSZ69Krrt4xCtTcSGGpl+bE89xzhkjQ+663q6uYP+1q2db7nzs7seadLkI5WyX9krBEYpH/Q+DM8qJnSLcJN4oSpcZ+bx2zuGQG1Umk9EoaFVyOUe7LRa3yes12e1Gk0lLhiDFFx4k90liLS+Nr0EmoyAhY0elLQIoEizCm/UQO/GTjT8ynFyemNjyaYJMFF9ocDTqDG1Rj0mhqFO5tC3xaOtoLCV3sx5ni4pcCcnIz1pqdkfq6LHH5kcun/PRFR0PLPnS9R0z2nKX83q1SsTjOgf8Ar7MDAAnmFH282YEAA6tRmM2I26s1zv0ZgcNtBoaqjQ8DzUa7Gh7CB8Zb0V/+oIFMbzqxQGHUzg2BwfgJAjz4wPZDCKI2HMumwmSU60xIUVDQqImfDlW+Y+UY64tY2uDZuNoTyi9LBFdCDfdLa4sDkTPVJrUDv8Nb9/qLRgEhyFiVrU1nhsoEttTEm6EH9IHgIBWpKFsvdkANxlgnwGvBL1ND4FOZjWqVHaG9BOpQmRigQS4BE5CuF/pFJpDPhMOYRpuFDHlhx92zLhxqCHT1jd3xlAg1rp0bjJsM9/T09hAfeGaOWd5fd2r7t6/MLrgktbuclc+td4h2QDs4PeUkmkFEdBfDi+LXByh5oRhTxjmw3AjVhIA8Ph5m8Gq4q02m0rrcbnwHOIwXIxZGMOwlzEGibR18lwInmx0T54AgfrcCvO5TDaPWU0qL00mAgKlI1IUHSakQDLpLmGhrZmmbHqde3bvZzRqq0kZg3c9YW6I5K6ap23p7rbK5ApjjzpksQXUVEzpcI+u883ZkTFL8O1E8C1jOpBCXyjbz9PCG2XwUhlE6g6rUrOIoKKBIOVHzUp9TyeQcH3EehhxVgtaemvtIg2OwhCL8E9vSOf0lGxoqdhQ19KyxLh/gDcvZzreuLDylSNv33nr6mOVico1h2Cp2vYvKDmiTyLStkNbRHiJCDfqtuioXh1cSJ1PIcqv1aCZ1Co1jFYLlQpFbQolmmA9bDmC+4D5/OQMhmg/2Tvjszk9YTZouuSmF8us6NeLPcmhpfa4sdll7YTff/c9eMem/YXuz/a9sQR2vXvNq4OtayU7Zx14A44zo8CGIynLBqWXx+tptPO83O53arXVbhw5miK6hoTQFuFNrO5XlxBB3CS8uSHpBp2pAV0OjjfEsmqOHos9le3Z1OpSCYySM6lZ22eX1ceiV8ozcMP99tWDriuXOa+bveKGDuvM3IvzLglow/Bzd/n99nYOTKNNgyAAhsr+AABWi+jxMGpeo1GrlQreYgUBF0N5RJ/LZFJrNIoqPUL9TuHLblKHU6eQo0MHU5LhgBBWiRBRtGT7N+PB8MQj1sdjaKT40K62epNdrQqxj8ctPoXSpTdc09ssl+tkFstaf0tkaRd9/y+Cbf/WmbtsFD4AjfvzvQadW/PD+Qaap2W7zGejuQ6B43CCaQJGNNf9Za9FrzdwXpMoOoHJFHaqvH6/W4YTDaIo4xhGRsZA9ijSJOyPMAdsJJVoUwFf9YIGIOF8Fe+JfBHOAzqDCayE95iywom6eJffnS0idU+02ue0NUQgld9jSVo6RuItnpzZTfHzR+bbU+FIf/ScXO6mOdk9lR9UvrviA1tXZN3AinRdaBKH5EwP8IFU2YQviTKqEGPgOSj3WowmYDEYeNztI0cPo1nHIEPOrK/NNQZWNM/6ql5AgIavEigs/1NyT+G82EpjQr38rHM19jr7GZ19y40zU7PiCXuk0biSXnOrOK+44xXoeUidb9CHGvL+i7fo3Vaj1eIzK8m5N6h/LqYPNIBZ5fprRTgmLhMvFmlONImUaA6FHIjqy6Nqtd2MKBddXx8RlbpoKBJxSABz5GBauhE5Tex56HcKT7xeupsR8qHqZhCZ7TD5ZdIbHUholJgyghk8JvRHIW0jnEzJIEWxMo7lNJaCUtTk0pDyciq1knHVi02hszYPWoRFWfpNY6B3mAn65Yp53rSMP7vy1svKkL0ps3SkqLvurPplLTctWybhQQQ8hPC1B/HonnJgzLfMR3E+k4/yqZ08kqTMThMSbEw+dUDOIgw2mVRyUGXLack4XH1AuFCVLaCDbL9LIwtP+hGnHdAsYQXH4xGZ4DgFodO1vn9zvi7UJJqCWpld6UXUX6txpXKzZztbYFkdtNmCanqOVruz+axo49qyb8d6pcdk8inbbp758Eq53ELG0DMxSzUCX0P8ra6skcsZBQO0kFbItRTEwjmDhfNXjhwiQbCHDuuIYMZ6g1kvYbdmAkNp1cj7H04Axdt2Q+9QKK6ww5/t26PseWpmetGeSMlU2kjacalfBcfAANhW9ncCk9NL+wvNuUwySkeaxBxF04BVszn0f0YoEvTrkYZQVpRKmVAw2FTIONHPp5IZL9YbotFMP/p+mqcpSjThTmYAtukhzoZ1iGPCm8cEAuPSpQ2I0FTtZIJ073oaadM4eNdMtOagyIdz2QxWflU0YX4YnKrkRqKm5irHJhiC8DebCeeJEpYqwXoaa9TqV79gW+xRrv7CryonKm+j/8ePf6PjzOH+Nb1tsng46Uu0bLvgS3kLt3O4f5FYiqVHRxObtVGjJRrKdX3rT9AAMbGWv3NgnXb1jMv2Wy6MOJSizel22kRlZ2eBzyQK7bs+WDuXD1u+1zmmTSxffn7jQOuS1fE6lM3ldqFseC0nXpiYRT+GN8uA8QBgIAPw5FCABGjhQGXWm/UaqcfHBfqP+/YpJZ6D1l9zC1yFeI4PYal1qwFuNECDx65TC2hJ1FBtt9kCnMyCZvwZp6DzsDTEi2CQ8x4EzUj3Tb2CZvvoMekCrCMHFyPGmLIQCyGGaNaLJxTDC1Z2M5hTp1NtEM2kkUeTjuOjNbeMhzqGmtZ8+G0EQoVmVz3HuvNbFizZc9byu/bMbuza8Nu5+9radqs05m5byd9aeWvJk0sqjmXtF+P+TyxCnw/DpxAvSoLBcgAE7Waj0WJXywSNpoGDMpfdqFFbGLMgcC7KG4lQccREj7yCN5wLhVTiIBEnEaXBBAaLmAhuCENNY90bK9hIZ0/AXJ54HiGklPBQ8nb1V48eRBkfrjyt1PqsahnSpI2cmjPxBiVUCmo1xwTKoUg463KofcGg9oqIs0Wv9Th1LaWUTJG06+QUA00NTEPZJdaZbb5YUqeWa0WlCq/n7VQr6KBvR/y2uWy3O+RY4NdqOLmRRsKgCZosnJaGNE3k/cXpI/g6IB0ezkmSgUGS8Gv0Q7qNb0rC73C5WQUr8lh+18k1CoXfoq+v9xhoDQXppa46CJPDIc4gV6qaBl3Ooqe5PeBUWgn9m3iWKoL19HbEQXvLSIPyeGwmntMhWm41mDwar5fnAeP3M9i5T2MjNB0rI0QpwWQc9xTf73P0kHCoKo4aqjoHkjeNUr+5mmIyrd9BFaVSWmg1NOmUel7jU8sYRqBkHGfSCyaPzkDfZhETalZOhQJylYv2lP3apLex2+ZoCXalq33fRXWB8+gdiHZ3lF2oux4L4qCygEplwrwoFAp4fDqDTqHQ6cxSzwnXR+BR5UfT2BHqtkSxOcKKsJMCj+P1pAioGg86j9EIepFCLIjGR4VwWrVcbjRoWJ6VqQWjJpB0yjm/kV4t19jdSANiVBa9kg1dOJiua9HZ64IhSzYcnpgAucoQk6VX6kOqz+KYOt1uqmvix8BFImyXtTEMObNu4qv7VbpMGSRitThbRBs6mCK9CpW7q1rOMdEBwqScBfFhVM6Cy8ktGfKtCmYsqHxsMsz8f6aOk/svhFEd80Grjtf2w+cmvghGyhaGBuvWknFI42HoDWW9MbOBVKgm38/INZkN1XHq9BlpvBoyXtQO+qi2WI2pn3ihMmuq36RN1G/SZn3ldTBQNqA2h/pI/6VxMPRMXKejPkO+jWby/Yxcl5lZHaJBGtoprf1r2wKlidXcHdyr+hBzHLelitEnmFl4XZgfsyKoL9tRWyPDM3txWzN7MxnU1ggFZ5QRbMyQKjxlnmCQacP1qR6U6oO3SfVRV6P6EmUTqq+7q6MV19fRWleH6uumYDtZcmWm/RNV/i/VCQYmeujfkXH/oVrn3mqdd06OOxIOunGdXrfVhuqMUDCAxx04zbglmOQeqOEU8xqsRw0ZCVyX2+rIOZDT7m0gYyqS/HdJ+cHxyfwWs5LGePDP5F8Kg/ANbibKfwPBsz0Th6kvA5107p5KVYYhQE60w3mvJ3mHJ/PuJXkNzyMS961nGhpw7sZqbjLWwISbeZq+HeWfJ9VNYV2C1D1jji1Rhj1Tdb8wsQ6+z9yM8s6X8oJvgY9w3fTET54xGnm+TAem1f335q/2ZftkX/ZO9aWjI4H6MnpqX7ZN1r2X1K3D5/CRcxzoxD+UFwTGf808TbGTfXiInvXxAyCL+zAvn1DjU2oRKNqiGfJttkjfBqP0jbB0GFMdhJe1tiufge/TD6P6uhBshrT94FJcK7ScGABdZR0NskaDGgOmQY2Ai27AtSitGfxdVsnlmQYK6st6MaMn1Wsy+kmiNnmG4b+iDZCaOIfeQH+gD7GstJbwZbAMryU18c4zsZjFUqaap6+llP+/JvPvJfl15Dz/HM7dPTXn3ZV53FUEBkNS3Qw+HxPDbOWhZ6xWjaYMI9PrlvJvn8y/dyr/G88EAjh/enr+U3nkQ5Rs/FEJrpa2aZgynDcdVs48iac9BN8fdwA/zpvH5Bkm8CSJ5kyiut4JUJ2nGsz/U+UlGs7cI9FwXJ75EAnu5rIGgiWYZMOlZbkhsxSTrak2MU3FZTBNJeP7XK3MbExC4RguM/bPlqn27cla3zSH6Ncr70llBknfBssIegZP086TtXY0h+C6Wpk20k4Zlyn/s2VAAyrzH9xzCN4wyeARDziPqwf2skBTYGAAILCnhstKCT1PkmFgkA7jciqDVA6kUDlv2Ujh494VCoQ2/rJozPhxYf806eWfLPtzsJs5jxsWQqrXFkq0cZh6UcKnXz8zPByNlqkl02npz8F7LCT5X0+dkv/4M21tglCmhqbnfwfVP8CN4vpbJZrXiPIT/Fu4ENe+cgrm3wHvMb8ieV8XT8k7MIBrXlCr2QlS4AD3EdcE7gC/RpymHy6DV8F98CV4EB6Fv4f/TbGUnkpSXVQfNYs6g1pOnU9dRF1K3UjtpB6kHqX2UQeQsG2ueS7j0FgzHc7k8mbRDZHmbZYMHDkSO6iFGhiD5rSR95uN6ZC0WY0U7ZpRypzLIwGbKJQ+YlXP40+TG5pa8M4q2YYxm5wwHfZOmd/wpsz0Fg0wAZFKb5KaN3olHS9MNpZaYFW3l3R8Uhk2CMSgjxjwUNtkq8SfrcU85k1GpF9p8aFpkhVq0uJP+kaCVVALxLhOzJl4MzNLcqDnqrXh1LGgDk5NkGRRJFfqQbLHlK9uKBj/wptap7FC4g1XdW8yoFOGiDtopIlp0hsmg0PdSUDJJhLCFihT9QdqB+/90bUzR7DmnoN47MQdNv9pjzV7aDbTBmubZMR2gr4MZLbQ4oYnbSt5yIcnK8hNewpOPrEoB4sVQ5OZ5nhSE5r+0mQgBR88+aeUKR+UvljUnlGE5JPZrOA1nFKDsghyrc6os4kyJWeLKA0WV4M9mFLXNybaGaOnJfihYte5CcOwzRjMuBu9Gjefi+a87t7VG+zbbq+YMlZbLF6MN7RzLoVM1IrfhDRD8263Q6a8Wax8Pa5QMSyr5lmzedBrJC0oRG/lSqvRwFFW3Brs1VllNk4n08hEn70VPejiloBNz8rdCbc/Z/PVKQReHxj/frDDaS+GL7eVi2mVMWLVutQdB/Sc3B52WVSx2ZGAXR5siLps8YYOzsVolKoZgYgWaVQuVqdmjA6voJbbOaeF5WlYuWHNqd3utk4OnzmRyvXKTb5chAvG5d2tQth6ocHkL50Inj6dmm2wGY0eQbQqZUrT+Lt91BkGuYaWK2UakxBglIzCoTUJLEdxX1zjDcKMXKxTsz5RLsq+H+Jpg0FmUEYry9Aj5JRy9EOh5ijmPrNaGRIihYXPRUvjN5kDzylkMJSsl1EPTD1/fN7UM+xRKPQ6Qe3wMipolikZlpIzNKc18ApqpafO5XIqeT2rZhWi3Os1Wu1U1t3ugq+bAiNyGe0ZP7v2cH31gQm72p3jX5O73SZf04ttVr3HYroMIm2dZ5SsUk7LOBr+18m/r24341zjI9I3fFXjdTAh/LFZIWPVBlEmOi3+mFUJwYTC1mhhLEoh4eL/wLhFm5c3x6KCus+gWMJ0PCuPxS11Tp1FFeS1KpUYqxf8fZnbkmq5LxZ1W2UWf4frolkqjULBCb72gNHbLfsqx6nVbr3BJmOthhbYh+tnzSohZeMqh8bV7ygyCdaiQM1xh+UUJTcZjKLJrXRHTXZLcKbFlojZtfb4mXa7FU0XZ3NG24wKuStYZwwURJWGPjdJA0NaI0JOZdA0agVLXsYpfLGIx6S0+M3D+Tqdbo1gYm1e55ySYNUr5PxVbpXVt9bqMWrGf39qxyvTBv+byivlzn5KJqg1MllaHffA0ZgvcjXsOF3q+JWCoJXRjEeBcFar1Xg0Ziv6MsU1GpdNpmJ1dvqMYQuvXKIy6CysbGm8k3ELqb0bdCHT8fEPyS9rqm12M/rdOq8zC7cqBI5l7Q3a8a/o3dpBhZOFOlFP049N/3Vi3UnvfugymOS+CG9mfXqZIKN1lCxGKSqFgEolQwAmV6lUlUKzrxk+bnBqPUo7S6srN+ldWo/CgR6HJ5/amr3NL9dHZKEgR5stIZm1JLd7PCrWrJEZMjqNdsbJPytzzShPPf5gOmyRym3oQ/JdC1RkWIcBOdABhsGqA/nOYj/z7/TrIAHU9OtlIdSfCIUS/bQRgFGrzeZ6DiUqjc0ze8plXb0c+LBbjs5mtWZfoJ9F9e3HF1Mn0omqU+eRo9gBX7KnT7lUC2SjGxJPTuKzhDfbec5bY39msvFOSDq5jDIOa4wu1wIlrwMp1JonnvBS1hzz9JM7dy2uS44m9c7LtlS++6OrtpbNZ0dCwcLVm39465otLr99vb4t19967oyxJyuzz+jM5UZacgOtQ3ZbwGtrtPpgULB4GTkn1wb/fc7i/qHbLv63xE6xvXxBz2Xlosme0Olo3uu9fLjsNp94unE4GSst7es25QIGh1KulOT5B6bpVjyrBQs++jZJv/8T6d9CcqgIg/xGIhPqJZmQdk7KhD09Th+SCQfLgpAZLKvURFT+G+VJl0uhJfIkKuvHZT8pizIuUlb8RNl83hdGZVtx2VZctvWkskCs3MNvZN+a7HOCwudSRsp6mnTaaETCM+wvq4yZfqK0KDL9UgWkhppN7R46TOqQ+p4Ab07VEXEpsAAOvbgOb7UO7+nqYFykDjwGTpW4dLKGQt6qxTU04xqaqzU0T69h0n5wd0131xwC/zn+M0nPa2rC9oOWk2wClJn5Xc0mgPLGJuolm4DVKJOVaes/lLfah/tqfUB6SDetw3oIGQTqBF4HlYYswcm21HXwfXas1gZaP475Fi7H0MCOTSUMbcPlbP8z5aR+MiOT/WyAJfoVYC2r8WyXSqijdNXKVV2gWlucYrKtBgDYK3EZFjXmtqLG0IPrny4DWiuzKZ5G+p/6MenusBnVG7XMEErnrMjASmDm/sT9EHjADLAUnA82gMvBzaACri4Hl1x6xuZ5s3Rm8wcf/PSK55+/4etf/+mZZ684N53u72/rChbq6yPBn96AadzeRx65/228sSjfuWPH/WvXrVn1HbyXdT9N3w+I6/bRQ0eIs1fVFxH7GB0SjhzG2xXVV+S8uDRxEUsdSR09lGwEvLRVSwRmsumM5N509eAmaATSmUBkawBTvDZE+8jFKzWnRIlCIkmcCPRIasd7HyhnC94kY1ESEntxXjjtEXt0pFMnOUgy/8v+kUZuvlOT1lMUpOUywcwLMrnN4VRSMq1SqedlsvEHFNY6l95lEA3uQDSqURsZvT5m47RyI8NTaqffrMcPH2dbhp/307k5tuuuXnTiv222Bd+OsPWhynGbdSF5Ys8OFJcsWvbxwv8Ld0z43mBwrkLjMQTUyS1znvhKYX2Lvi4aFtLXzVq0p++MG+K0PB0xK5UuwRGqN0cdMplLqXc3Khs9JivrjAbCrC6ihbCQyjVyDi5XGPjSAwmz2TeUdDCi8LEybjYFRlP4mf1pdM2Jn03z/fT8y1w/SbyJauK5iQ7FjxE+1YERsARcBK4C94JHwD7wHDgEfgp+ATeVnyiVirH2lief3HnPjkt/tO7w4fsOHLhl25Y7d+woFluymUyLJeIGLUt/dsFbby1evmrVwqEZM4Y7+3p7u7o6O6MdixcunDd7bGx0XrIFJjtgS8e8eR0t9BO/cpsffeK+3bu/+dJLLxw8qNTRT4zNng0y2WwiDx7dt89y+Q9+8uSXnjmwY+fObdt2XHfXXTfcccdPNnrXHrngrZXLli1cvHhGX+9wV+fQkLdYKnnvu3/v7pdeeeFxoxE7Bjzrdjwx0o70HeIkwNEAJFKp1HgK/zuawsFtR99M1TAc/6XTB1OptORagl5gFxnixEfwXcA50Qdx98FO3VXnL7xXnKhmFI4eOTx1Olg1zyHiZpCoeQlJLkLYLRAf6FmotZ3ALaYS1Tf4EbskEO8K6MXWBkQI4lRJOp8B/TcZvVUXF8m3C8lbadY7aQGoilnowQm9krkDuxRgewd2cMAhJxSNkFlv+CSNkXT0qteYiT1JYxeJdEc0d+zbiurieFaiQZIGXqNKSFXnsdpN1yLYg8TZEUcUoBYkesVd9PEPP39X8+Zs0GDTUiqkTJ9zbuuikY6HqAvvOefKDba0re+Ly292r511SUMrtb1yw4tPXt580ZpVad13y1/72vOfLTwEDZdkTDYt9LmX2ZMbYWGJnmESSUPCsXLXdLLy5wfi8c7VkUhLLhikbrM7U15fsnnMbmQCxZBRCPZxRpb76FeI4FS2YooDf2QeGmiZdxPzTUKDFDM/usZA6W0egVEolZxJ5GRKnqa3h4NOtVlQrG7hmgiFgt4r+3K2UDxk2z6/oyB8fNklqRLNPLfMtGRwtXzf7ofvMvpjpkjksb233/rIfXd/tZsesZYva1U66zWRzT3CieNnXfywItJiuALugoHo0tz4o7RpGt0Y/0OpsXHdUHNrPGYbbMxa55wf6eZlflXhXm7RVt4T+wDTknsILTmxe/UKw1lnCAxMmE3+4UaHzFMxUfqWjg4bZxA1LkFsRHzL9Z7d71OLFlUr/Hl0DaYBcgAqn1NOIBrgr9KAz4A7JCoAZ5a37r7vPoDQesbCpY9e8MQTVXSed8dtt95+++i86bjesX37LTdvvfvuK6+6dMvWrQgvi8VUY6OuJVgOdMxD/506jwe43U4AvqgXdAjdg9t37Lx76y23XHXV1o033njd5tLaxy944mT0Lt1xm9vjKZZGOjC7VgYbU6ns/fft3rtX+e9IRTGCevrZZ7LZoE6vD9Yc88aPYhQ/IiHseIp4AB099Kl4PoXkVbyu+pphdz7s2GnB4TZHUySyS/JUTFuqSEsq0E1HcvxxCCO3rloLQmpdVVTAWhLxFOdUSBKoR3gD8yroTdWTw1UkGxzr5WrMOz91r+U/gc2fgr+ScW0SY6ckClrCUOUz9mQ5eE7lSGVv5YqvP1r5XuWPx1dUzrbCWUg4fOguWIRJaF6/8tzzZoeT3DisXK9d4yy15IzNy88+K6M7/zrn6K5ca/aTmNryKZh6YsXpsZPpGLy378RQFR/Z/6wJBxNVzJuZmjdYNJfO6Q15W0aTcNj3+iFHZjAR3dD26tWHWneduW/jJZ5cxGSrS1s9Om2+0HZV6z+ChBXd6VCv8sdb594MH51Eto/oKb7OFyXc4kBq4gxhCb0b6eTNoAS6EYYtAi+WB0utLcXmpkI+XywuHgxmkbYF6v1ut8tlBX7/4rmjo20yXi4XOhlL29z5s0fh4My+HlhsaS0V8s1NTa2l5uYSNLVbXW53HPvA1XV3ZgNW/ATlPM9U3ZQFwvTePCb5MuH4c8lRpYABu8bYsE/foTdTGHwJ0KK/gzW/IXz0NMoqSbqHcJwZ9nSGVfO3N1xiJ83f3ozkloNt5Z9kURjgsL22yi2mibPBqUdhyZ/uWLx7sPPucyoHqfoVK1cs6DVml5VCg96H+C0ORSI41K+zU7/6BI/4s25o9yDcO2P3wEd2iYQrbq5Bygc/qj1Bb3vfigcyVm19rtTZ41u4LeX2yz6+bFOLqTW6Z1Fm6Is90wl3xXnb3Fs7bh+7HW6XqOo7U4srTj1K/p9d2HeO+gpa2SvLfh0rjgEwVig0taWbmtKd4WgsPYb+L1aqmwoFezQWG8ZOjPYkNrc81ccCrJEsWqRTKfCDRtNZ7gPEIeoY+UihRXzz2KTPuRTriykPjl3G7nUSRcL+o41JFrFeRD+Im11O8udl8CEJtWNI89K+Q4bQF9pJTioj9IaphqEyZuVeU2t70Syk2gaj/3XFBJBf39giqjWWhrahRSl/IRVPZD32uF+U8VHBU5cN2r0ai9eAIFHHzSyfEXLFY/W2/JzObDJhq+vNud3pckeraScxOuuiIesepcdoSjsbVq1aNjMeK88ox9S2iN3d7GstrZwR89rsDdGYbU24WO5PH/d7TDYN29A51NkQ7xhwOtINYbeJRXpi88Td7NP0V/UhNoZtMJqD8K2PvkZ0zrun22Y0Byf2/KV0aX+YtaH07Tgd6exB5jMk/5eZIkm/U0oHj/zldFTuEW6BPsS8L6VT0X8kHYQnHuSGuXo0rsXEn6WBmcE+gN7X0X+q6vwPUgHuNn1I8y3p/cRPOEbgVHUATL63kfffrr4/Nv096KnUM4+wBn1I7yDv6+ANlZtJ+wPM1lr97LtofF9G70+pl/0eSv/K9HTQCzSMmkvrOfb3kt8pDMJHuTQIgE3lRqvV6XTZbWbG5PEbtSZepVTKeAAYJkDRHOPneb8/5HMFKDtnttG00e3DRkcPvf8ZrUppkvFGUGXYbfjgcey9e4REO5BzZZGsXXMiTAtHDqVIOFBKurY9mw77s+mpvTPiGh42p41+/GcwerNeWv2+4r/e9WQsFm37uQzDKNikvb+o7CoUKnp4YxO9bGBg4BfW7k0FZdEWsWadzqhGeBalVa5/ZR+8fXL/GI9Vz+k+lmKSK0PUAfZmtHYUWdMGsIKZqNr2chyP5u4bUjrsZS/79HQQQDD5NL0CpR8k9kUdFT6xeNLes1Cyp+B0YKuMfHp6tZ6FtXrQWp+gXpvMb67lR2tpYW779HQwMOGgn6XXojX+4zT/DlHy7yD5XgVPYdia+JheRb+P8v0n8SeeDXYzJva7YBjMB4+Xmwsj7e2J1AwgZwAD5A2JWV7DWCQ44nRaLHqd22EzG+RqlUoxzNGUXD5SKBY7Z3hTsxh3YgxTyWg08hy9v6wfdjso2sZ1durUKoNCrjdzAMcx4XASJOYJRwiM4NuvJK/uqoNmWnKERa+lnBLkHEVa2CHpTHuddPQ39uCE2XQegQ8SrcIZ4txtxq6+TohAh+PJRy2azI9Do8jp3lCKOqhFeaVThmrMDRGoEMPDe8vUI3vkr/2Eogr1ZqY+X0baMLzoYpq7YltwbkRt5thfvAsZcc6tLf60kOztDahdennDBaXGoa+HBgLLxbjNFtYk4703tM62ziHw6e8Nei9fzNVbvdYDznBCph0IBQbuvL0v1NbuLzrSnKDo74pv6O9cbB89/zyt7JaRns9WPkqvad7rHUtnV+UqxtCcxWM0o8JrNQDeYw6zR0EGDIKbyulSF17bfFauUguMzODUaBSyDEZaJ8/7nM4Gm21mV1dDQ329rVzu8WXy+YwF464NrZBayKh7engZJ1fRlBpgQfsImXI04VJcO76GuMrKEpIdLU3w+QiRTtCyEYFdiuWTUDmcryGvZEzDQdN+H4mEDmuq0SucNxvIB3StMMyL/JTTvrQceBnp0CblC18w9NRtu1a+ea1MlMu9eoulWHyFhpAyBzTWpHXB7psrT0PZjfBbcJ3KMTu/uUet0+ltLV+s6935+IZbGXagf2DOIyfQ58iOsdHzbYF98FGdTSnwbUs8hfmeDUGPY7j4HXiBxqr6Ycjddk3HdpvNv+rBtkXnbn1EopfeifeprczHiO4/gHGH2YH9C1F658RvaTNJf7Ca/jJJH5p4m15D0neflO6d+CN9O0l/rpr+PqFJX2DuArPZop5jbsW/KxXmLkij32Hm1olRkvNWgG/XwTLL56EFHqNvQTqUrayQy2QM0MjkegrguCAkEB6SYoNEafNGiruqmQbgsTWr865Wb6xsmp9OzyzVRWh6vcWSy/eE83l3wbF2x6q+vmidFFfwADTBXzI/R+2EQKgsmNxujdSa366XyVF7B1NkY4m0WFWTTtsqTY4PmdaLX57aC7veHbWkfH6/vzHp9dHwNH2CWWvMrfP5Ewm/z+fD/WsF65kuuh84QQwMls1+S8gllykUOlYfcgEE7BZ/yOWMYbMSUMhkeh2W1/aDNkxKEoeIgI1UPIhVyqOECKXTUjgg9kWoycjVCB4XbQ5Lqdj75f3AggWzXMV7ibC78oLVZ840e/xL0v5BZ11H3E5t5iyesMGWs+nTzUUnYjY6V9SxYhuSXxtyxXKHOzB6Q8zpkbVsOH+RJ2fP53I2RUu9OewSGWne8biKaFwOEAW9ZaPPGnQq5EqlnjMEkQZeb/UFnVEyKqVcbtBzp45KGtSpY6qeJHHyqKBxalRMsS+6cN6w83TDmn3G+lPGJLjqTzOkK59vM58yILw3gNeJeQnJLoYqP6swTdX0IkkXT06feBCv67T8J6R6UHqRpItT6YgntVZ+TOCABjzAt9GfWXbEPPGQTtDrbQyHeLpVbYuHZMFg1hOLB9PYHKGWQQ5JNHpBsFnVMjKBaSmSIZE+nJqaxRpoHKqaIaTJDOr8Oi/6y/8VQKH2L4XWpW//PdByUWUFvAf/Hfg7oKY2x/hO++qcNVAOtlSbY5IuTqWTmKES8wgdBRGUY/bzSHj7xlOZOsSpv1uW2y0WeUmpUmnQrwNyJPsF2hWIRyRAHfp0AB59CsABU9eDBL7D8+gxwhLI7rJ0bs6b+PBUYi7xenQZA469IidNk6s7p9MBY5hEhEgKDD7LlmYesSR6k5+v/Kbivym6Au5a/fxIvDthprkH5+c7m8sLN3Y23ym3a7RJUXQaFG5bSOH2ul9qmD/cYR6Ds34Lof5PN/3Z6dLFM1mr1qqLNJ65bsX6B7Y8vdVf1osOvc2lchsEjkKcA9FRH/ge9TYnAC2mo1q81SUDWhmJtzwkRYamyfFSCiSE5mywROWpt4P9s5ZcvG3+zIXb1i9dMD/F7udaL/tq5Q+VHb8beheuheLXLi/xmEaLYAPlZTQIJo3PAhwtQi6cSktHtUmnPUHKW1m+Hu5kNCdW0Peg13EmDFu5PDDh/qg1GiDTa9SMsUbXDxK6bqjNnUiE41x10yru9WXbY9EBfS4QakRKXnwR+0q9P1BsXXjlYnOjLR73tsTNHqWB3KMMEVaw7woh3WcIZ/k180WiA8zkPMxS7i6EUYqnaIjD4VPJRjrrNfL7Wf1DnOcS1SqCh80TD7JPM0iHY34jya3w+Pgzkq6B5FCkG6m2nKqDnC4dLK08R+1nzkf1vEtgMwGeAm7ss1q5R/Zteh5Kf09KZy+t7TVz36BLqJ5HpHT6nU9PRzBO9vXZt0A/GAVpBNeOblouDzbrsf2xBfTT+w/MHBgaDWEBKEi/BtrGjxIRlCgt5kKyEUqgiq/hrXlCVN3wQmG+9ipo5MlLN5QOtjabqlIOAuwEPn0eG/PwyRv4/GD4+vFlqxO83ejzKxTr5zwCH//cmmsa7T3ejaWx8JYzoe37j/W1lEfn97oLNs9AoqHYcO1lsxaaitFWddB24SW/px4644VFY18+CwYLxe1z1wmFqDgUjUQuiHnrGhd0xm0B98Ks44mzG0aCF3yhp9nv0puTrV1lR7MrsKgQSu8bEwcyM4SQ9allq+h+scHeEyo7ACX5MKB58iF+EzkQ8oejBiy5y2X6r6Bp8QFqyqWkrVAgs4QmByljZKt0+kxIIdLVoHUzXR01HT6xnfpzz8KGTTOnBtp2bujs8ujQvxWKZwfPRqOa8+ISGNx3/lBkLD59EGJIV29Coyhsauu6uZ/aVes1kPqNfQ9AAbSDhgPF5lI7ZosHBI+brnsR9ZwFJtRzDoiEvKPOmyc7f5pFisFs+nSrWxuTtLyG6pioH05fHVUIr86K1dNW84Ylk4OUlrNZGiR17tRKhC1oJfadZulqo5bWDu6bXCuEe1fB7bQIrMAPrC8BIxqgC4nvzwI1GiQLEgiIj6HxkWNNEFeaTmx5ybRnFE1wu9bq0UUopUajksGtnTOS+XnzQq42s8sedtTNh4H0RReeF+Ube+YsmOOPNa5dvmD5uSO3sGcFPEFHY3oqfof9YDJ+pw7H7wjY73sYNEn2GfpX9HqEk09hnNQOIop7NcHVN+iv099E6fslXIUmUCTp36fD9HyUfqBKC24k9TRMbGH+A+nqxEec8Px1E78hNOXKKd8VTFPWHqnSmtOkY37H/AR+iXsNqBG0BMuCTEnX5/Neb33KELbZTAZidD0kHDkobSkcxDAiohnEJnwiKJnFv9kJAPp8JoryKcwa0XDr37Kjzg0ny4KDb23WBY2h3u84/+r+dI0Gs4NVOxqe/98RWvw56ljlo0maO1iLL8E0F78F71Q+mkaTP/U9aK7cc1L9Ccp4cv2Ve04qnzi1/r/8HjTDIOIhn63ZAfWD1HHqK4AhtMjIDgIVkjFEJMvVlTWioNdo3O64MRzmZdSUfxtZMrIHlK4RpEzVgdyIOGMbNlwbvFM0XCLhLZBgeD6Ns9HGEw/ReodhcKhPb6/UB4ZDz/uHAt+v/PKMXJfI6DQao7olN/L/1CqPR6VmvYhAbSzFRvcsSs98ijraFemmuyPdlbCnbiyWlHnM8nqPo8ntUOc8Xmu3yOTOrdqK0Hj0nL51Gt78too3vH4mdZQx1Gw+TFfN5oPSF1NryTqtR/O4f3IeY3wYvwXH6beq6/gX34MwDHLD9A/0HLZL1uyEzKKqHfIUOyH9p6r9cZrdUZITUf8dNdsZFWAPV8tjG5Ke7a2m29g91fI4Pc06cNzPxGomi3g5x26ctL29z5pq9lyUz4w03E9JB3TlS0gwGYI/QUTOh7RQe1np83hCOFDDasBB4ARfsUSVbKyDpy512jttqWsQAYcqhWmrm5kFt9eWt7K/CgDTF7TZOW1BIV1ddOyzOSFDnyf+pr6l/woYVvt24iTAy8yaBLzjf0fHqAks978MXwd24Abis26nU6Ewa5G6LnlBoe7kRby1mJMkG3KqjOR5kMYKIerHy7/crdNxarW+frO32d5T5+ZE0w2Bmf7HHt/o7veqHGbZ/OZhudKWntnYb++Nf5W0y2G5UqbgdoGtYD94GbwKfgDeAkv2X/a99d/FKpf12ldfufbIG1/a9fCDT9y5bdtIw4GXcrnzRkautWOm/dJLC9vWY6nDoKzps8ew4nVMOndGsvKlj6TeRJoZPqGPXMOMkb7mLRX6qz5TxGWKli5cnvSZqrlMwfTJLlPEY4pOe6VjX05SWuDfwQqmu3cRelTjwSTyospgciinTFG5tOvChV0WTrS6tBfdmRSznSPxZFfSRdyj5kWn3KNmLZXcoxxosl11KZstn0vq6ymGIR5SRuwgxSuFyMbmKfcoreQdxTct3ToP+o22iCbh649nU00LN3fkP369yqQM4hSTqrdWmZTGITGp8adP8uZiHxzaPfC62hMN2f3zzZkTgPA8g0M0wKA1krHrkvWe4TNP6wWlaDzVC8rf6NYIngbnaTyhBmzteZn7eshsOdUNCt+EsGBIpmJUwejwTSsvfuneH9EtEu906hzBhk/hneO3THPZovtvH7tjfKk/lGpwj+ipP1f5sK8u1Iu0IALP7GEEz58FO8HDoG//ZXvX349hWXPtzruvvaFh+zQA3r79rwHw/y3UBv8SKP5LoE/etGTLJ6Hvzzf+Jbj6VwFT23kDkVOA6Y1PhRPw/wGJ/mOeAAAAeJy1WM1vJEcVL+/MfmRZJxEEFFhn8w4oa6OO7U2QVvEKpN5x29PZ8YzVM7ZjCSn0dNd4arenu9Xds8MgJDhxQPwFuXEMygGORAKuHDgFiSMSEhck/gDEBd57Vd3z4Y8kK7He6X5V9ep9/N6rV9UlhNi6tiNWBP9beeUaGHpFvFI7NPQ1cbOWGromrNpnhq6LV+pvGvq6uFN3DX1DrNYzQ98Uj+r/NvQt8fr1gaFfEo0bNw29evP2az5KXqnXUNeduxHT15F+9e6Pmb7B/b9k+ib3f8T0LaY/YfolNPQeW0j0irhX2zb0NfFy7YeGrokPaj8ydB15/mvo6+L1+pahb4hv1Y8NfVM8r//M0LfE9vXvGvol8fPrPzX06suv3XjC9G228w9Mf4Vt+zPTd7j/b0y/zPS/mH6VbLv7H6a/hvRX124z/RrxrN1j+uskZ81i+hvc/32mv0lz11pM32WeHzD9BvPETL/J9E+Y/jbz/4Lp7zCtMXyb6V8TfYvtX/uUaa3rT0Tf0f1/ZZp9WfuH+FiAeEdsiwfiIVI9MRQS3wciETH+CjEVKfc0sJUhTU8f+xVzbOKILSL8A+Fh3xnOL0TOLYlvidzP8Rky56q4zb8m9vRxRIoJ9nZYQ4y6S10t1DBF+WOUBSg7QblKBEgHSKc4llW6oPJgW7yL1FtV66Gw2A4fJaTIC6jXRz0kIxDPDO/72BpiL42O0c688ouwUOxLdKk9A8YDxGNs93GEen1GY9FHLScxngJrGeNowP5Sa4CyJzg3454xcoWMHmB/GRMXbSJ0FM+LGd9HPF8yhxQj1Eloh/wEY1HJC9yfYw/hl1ZRnPlB4wVaoXBmjiiIj+Gd7QcPoTeUcJDESTFNJTSSLE0yv1BJvAl2FIGnzoZFDp7MZfZchpuwenv1dlP2MzmBTirjHs1q+dNkXECUnKkAgiSdZjQLSMH2u/AWvR5a4PlROoSmHwdJ8Ax730+GMTTHYU66ekOVQzQvZ5Bk8Fj1IxX4ERiNyJOgUsiTcRZIfA2KiZ9JGMehzKAgT9wetFQg41w+glxKkKO+DEMZQqR7IZR5kKmUXGQdoSx8FeUISA+xGTGKINomuh6iN+LcEj01kjm00QwvGfnYQevgDOMZcWyFJ8/GkY/E8grb+RzJsCQJxDrKUBzLpMqgDRRswrSzZAoY1bB+oIIsIVg2vrw7x5yUeZU4DzFJaLGJY5nlhNbDze3tebFa6LJIlGgEfp7XeuX4vA6o8oSc5YTAM15RgxeqWsuOUdL4UGR+KEd+9gySweUpL760PnGZrPNpAHNlcJeFTFBIjIGnQjnAP2WKxtv46/JijTElJM7SBmUMGUml8nfM/IVZ3i0GLuSCQKXsgXgPi+Y7s6QBXqq7mT9R8Rl0BgNcD/A2dAs/juQUfcgUrkQLjlVQ4LJo+Vko4wIevPcuCTmXjlSaxuhNyoVIl6QB21ZwiT3lMggc0CmXPV2miqr0ltzAPgDLlwytZP9C5ktNibY4VWLWkzISem5gpJR++yw75VweIVfBYzSrz3aUJXe5fBZmhi7m2bmeQeWDVbVn5fs8Oim3Q5xDMbJMKactU+u1Kj3LHiheHBPGKeDN7SLMJsZTxdtexBtcuRkvY59wHk25sCgsJPPbycXStQ0viu38ZlVmeMaFoODIBdXyuciDUvt5ux7N5QB5on0pWF+5MDPe4KacPwmiFPOm7l/qqc49fyGr9OacmKf2StN0TEjNYYGsfV6tWS2HOOlIclWO6oNVbCIzk16uEGVQzvj4QocPZXDerI5ZZZkiPyL2cFZLFjPb4uj4TIcmF84fPJZXwzofwMjXHbGFf5JLK+l4xscLyZH1sY9QOkOOcmzLyPxw6TCzYVbwrGLkFWqlNV/muPgFj2ewtiSjVcqAN6qMfop9OlZl5kg+2kbmWDfL8KuOnGVmXn7sLKN3WK2gfG6/1XHX2SCNvjPO6djE32K/M3Mk1DWIKoTPMdCxLvNZ51dq9nStIUGp+ggYV9nii9nRe7mu/R/iUaHks++EnTI1PzRrNkDpI7NWZhst8P4YmbxZL228PL6C9tCFwzdGfGMOo5B3m2ih3pz38Qp5XIUVzyu5L65y1lKVK7Ffnh3xgUkt+V3aNfswmq2c2Y5UxtDiup+wlkHVlnMZQvVLRyhHabOdVlvdZ1uk2bHGVSzn64mO4ZaJeM4rJapsKNf2Yi59cVTnd3rt5fyOs5jTMyQmjOPoBeNY7gr04RYbZOScBSE/SecMl6fIEcztIcUVNVnvACF7UO58O+equY9SE648F38O69NkuePMMCp3tRlO83VlcVbO9ULHq298v3j/9S+JalYhkJszasFrOGILaHx+d3/RLJjf65rCYY6O2MPWCe6eHve42AdYTT0cOcbWLvbuYs995Oia8fscsRPek5rId8T7nZbh4bON7VOudXsCuE2tJ8jfRlk01xEfsA4HpXWZ02PZB9jbwrdj+GhGA3uOsE30PldDra+Ns/QHvmv2R21pD/uh8nDRKpc1lpYdYMtD+U0zaqNsl+WR/aR/j+l2ZeeesdRmjEgyyWygRS1uUe8Rvg+Rr8v6bfZZW9tmH/ZwXPvisAWkedP4qvkIn2MzQjEi+1r4N/PKZgyabM0Mvwa+D9Fykr+Poz3eKTo4c5c97TJ6jsGMvG1xa+aVjlSDvSFUCYNdpA/wt19h5/FT2+LNSVvE7oTHZ1zaP9s8G4xch1s6Gg1u9ThWNGqZWHrsx7LWE85Eh7ls9rhbZcgeZ6+2vsxOraMzZ4nWR7Gdt6XMarhijWgp5fiRifR5XAh1mzEhu7qV5ssk47dyddkA+ThNIyVDGCRxsQmnyRhG/hTGuYSCLnaoG4oEgkz6hbQgVHka+VML/DiENFM4GiALfW/6OaQyG6miQHH9KV/qlFc3BQ7kgB+nhhiQBovefPVTmZNmSTgOCgvo0grnWjSnVKBimAxVMJyzbIJKVRxE45BuuErrkziawrra0FdIc+wo4Spr9Y0TfWRnMi8y/JxWSTxTQNMrWY8YgXWFWgo5oruDTKHWMJnEUeKHi+j5GiqZkTsJqsLnuEjHBYSS3CSeoYzSRUQ3wY6nhp0CggIRn6HqK7R5k67z6ApjkERRwjcDBmwL+n6O1iZxda9WhmF9WBTpztaWjDcn6plKZaj8zSQ726LWFnJ+aG7gNjDAnBg5mUZiLr4yvOiq7zPD0SKOvxDQTxP0isCRz2WUpBrwxUtFAnPhWpHcO6QA5XyDhb4jDBLnnWU+ohNaMMikpAwKhn52hl4TzogXRhUFQNIvfBUTLD5fbJa59sX9IJP8PE8C5VOOhEkwHmFUfH3/qCLEZp0kLvgLXXOz+ZcNtiiUKFDpSFzIBxNVDKl7LuUsk3JkfTkcKcxVrZtkZfp2FzXwQiIPLRgloRrQWzIg6Rgdyoe8aFF0f0wLOKdOkyfo4RY6nssoIgkUbYPShabqRY8q9cIxSLMRk2EyusJHWgrjLEZjJAsIE8gTtuWpDIoyxWaZjAsgVLz4dso09/vJczl3RR0nBS0ctoiWWjrLFTOUD330qy8X1q8/52pGBuQFppPCIOES1sv9Kgj0qms60O3s9U5szwG3C4de59jddXbhvt3F9n0LTtxes3PUA+Tw7HbvFDp7YLdP4Ynb3rXA+eDQc7pd6HjgHhy2XAf73HajdbTrtvfhMc5rd3rQcnE9otBeB0ihEeU6XRJ24HiNJjbtx27L7Z1asOf22iRzD4XacGh7Pbdx1LI9ODzyDjtdB9Xvoti2297zUItz4LR7m6gV+8A5xgZ0m3arxarsI7TeY/sancNTz91v9qDZae062PnYQcvsxy1Hq0KnGi3bPbBg1z6w9x2e1UEpHrMZ606aDnehPhv/N3pup01uNDrtnodNC730etXUE7frWGB7bpcA2fM6KJ7gxBkdFoLz2o6WQlDDQkSQhdpHXWdmy65jt1BWlybPM+Ne2OaD74iPwYI/tKcrq3iMfYrH4H9iT7wwXl7uhubSVtQ+qv229vvaH/H3u9qntU/EssRZy+cPssvG/77ETR/Mi/qMxkvlR3x1sDRev1d/UH9S369/D5/vLemLWcfl8qjl42cNXcIRDoI+B1Z+s/KrmuDPI4FHigz/xuaT//NkXdr6Hy7tmwV4nGy8BXQbV9dwnWFGl5kZopk7I6ksyTNpSimlTE7iJG4cOzUkZWZmZmZmZmZmZmaG34m3+/T91t+16jOSpbPvlTRn3+M70Sh51Jz//ll81KRR/z//xRsP/ZBGyaOUUdGou0a9PuoBSZYUSZU0SZcMyZQsyZYcyZU8yZcCKZQiKZbapLmkuaV5pHml+aT5pQWkBaWFpIWlRaRFpcWkxaUlpCWlpaSlpWWkZaXlpOWlFaQVpZWklaVVpFWl0VJFSqRUElIm5VJVqkl1aTVpdWkNaU1pLWltaR2pITWlltQuFVIpjZHWlcZK60nrSxtIG0obSeOkjaVNpE2lzaTNpfHSFtKW0lbS1tI20rbSdtL20g7SjtJOUoc0QZooTZI6pcnSFGmq1CXtLE2TuqXpUo/UK82QdpH6pH5pQBqUZkqzpF2l3aTdpT2kPaW9pL2lfaR9pf2k/aUDpAOlg6SDpUOkQ6XDpMOlI6QjpaOko6VjpGOl46TjpROkE6WTpJOlU6RTpdOk06UzpDOls6SzpXOkc6XzpPOlC6QLpYuki6VLpEuly6TLpSukK6WrpKula6Rrpeuk66UbpBulm6SbpVukW6XbpNulO6Q7pbuku6V7pHul+6T7pQekB6WHpIelR6RHpcekx6UnpCelp6SnpWekZ6XnpOelF6QXpZekl6VXpFel16TXpTekN6W3pLeld6R3pfek96UPpA+lj6SPpU+kT6XPpM+lL6Qvpa+kr6VvpG+l76TvpR+kH6WfpJ+lX6Rfpd+k36U/pD+lv6S/pX/kUbIky7Iiq7Im67Ihm7Il27Iju7In+3Igh3Ikx3KbPJc8tzyPPK88nzy/vIC8oLyQvLC8iLyovJi8uLyEvKS8lLy0vIy8rLycvLy8gryivJK8sryKvKo8Wq7IiZzKQs7kXK7KNbkuryavLq8hrymvJa8tryM35KbcktvlQi7lMfK68lh5PXl9eQN5Q3kjeZy8sbyJvKm8mby5PF7eQt5S3kreWt5G3lbeTt5e3kHeUd5J7pAnyBPlSXKnPFmeIk+Vu+Sd5Wlytzxd7pF75RnyLnKf3C8PyIPyTHmWvKu8m7y7vIe8p7yXvLe8j7yvvJ+8v3yAfKB8kHywfIh8qHyYfLh8hHykfJR8tHyMfKx8nHy8fIJ8onySfLJ8inyqfJp8unyGfKZ8lny2fI58rnyefL58gXyhfJF8sXyJfKl8mXy5fIV8pXyVfLV8jXytfJ18vXyDfKN8k3yzfIt8q3ybfLt8h3ynfJd8t3yPfK98n3y//ID8oPyQ/LD8iPyo/Jj8uPyE/KT8lPy0/Iz8rPyc/Lz8gvyi/JL8svyK/Kr8mvy6/Ib8pvyW/Lb8jvyu/J78vvyB/KH8kfyx/In8qfyZ/Ln8hfyl/JX8tfyN/K38nfy9/IP8o/yT/LP8i/yr/Jv8u/yH/Kf8l/y3/I8ySpEUWVEUVdEUXTEUU7EUW3EUV/EUXwmUUImUWGlT5lLmVuZR5lXmU+ZXFlAWVBZSFlYWURZVFlMWV5ZQllSWUpZWllGWVZZTlldWUFZUVlJWVlZRVlVGKxUlUVJFKJmSK1WlptSV1ZTVlTWUNZW1lLWVdZSG0lRaSrtSKKUyRllXGausp6yvbKBsqGykjFM2VjZRNlU2UzZXxitbKFsqWylbK9so2yrbKdsrOyg7KjspHcoEZaIySelUJitTlKlKl7KzMk3pVqYrPUqvMkPZRelT+pUBZVCZqcxSdlV2U3ZX9lD2VPZS9lb2UfZV9lP2Vw5QDlQOUg5WDlEOVQ5TDleOUI5UjlKOVo5RjlWOU45XTlBOVE5STlZOUU5VTht1hnK6coZypnKWcrZyjnKucp5yvnKBcqFykXKxcolyqXKZcrlyhXKlcpVytXKNcq1ynXK9coNyo3KTcrNyi3Krcptyu3KHcqdyl3K3co9yr3Kfcr/ygPKg8pDysPKI8qjymPK48oTypPKU8rTyjPKs8pzyvPKC8qLykvKy8oryqvKa8rryhvKm8pbytvKO8q7ynvK+8oHyofKR8rHyifKp8pnyufKF8qXylfK18o3yrfKd8r3yg/Kj8pPys/KL8qvym/K78ofyp/KX8rfyjzpKlVRZVVRV1VRdNVRTtVRbdVRX9VRfDdRQjdRYbVPnUudW51HnVedT51cXUBdUF1IXVhdRF1UXUxdXl1CXVJdSl1aXUZdVl1OXV1dQV1RXUldWV1FXVUerFTVRU1WomZqrVbWm1tXV1NXVNdQ11bXUtdV11IbaVFtqu1qopTpGXVcdq66nrq9uoG6obqSOUzdWN1E3VTdTN1fHq1uoW6pbqVur26jbqtup26s7qDuqO6kd6gR1ojpJ7VQnq1PUqWqXurM6Te1Wp6s9aq86Q91F7VP71QF1UJ2pzlJ3VXdTd1f3UPdU91L3VvdR91X3U/dXD1APVA9SD1YPUQ9VD1MPV49Qj1SPUo9Wj1GPVY9Tj1dPUE9UT1JPVk9RT1VPU09Xz1DPVM9Sz1bPUc9Vz1PPVy9QL1QvUi9WL1EvVS9TL1evUK9Ur1KvVq9Rr1WvU69Xb1BvVG9Sb1ZvUW9Vb1NvV+9Q71TvUu9W71HvVe9T71cfUB9UH1IfVh9RH1UfUx9Xn1CfVJ9Sn1afUZ9Vn1OfV19QX1RfUl9WX1FfVV9TX1ffUN9U31LfVt9R31XfU99XP1A/VD9SP1Y/UT9VP1M/V79Qv1S/Ur9Wv1G/Vb9Tv1d/UH9Uf1J/Vn9Rf1V/U39X/1D/VP9S/1b/0UZpkiZriqZqmqZrhmZqlmZrjuZqnuZrgRZqkRZrbdpc2tzaPNq82nza/NoC2oLaQtrC2iLaotpi2uLaEtqS2lLa0toy2rLactry2graitpK2sraKtqq2mitoiVaqgkt03KtqtW0uraatrq2hramtpa2traO1tCaWktr1wqt1MZo62pjtfW09bUNtA21jbRx2sbaJtqm2mba5tp4bQttS20rbWttG21bbTtte20HbUdtJ61Dm6BN1CZpndpkbYo2VevSdtamad3adK1H69VmaLtofVq/NqANajO1Wdqu2m7a7toe2p7aXtre2j7avtp+2v7aAdqB2kHawdoh2qHaYdrh2hHakdpR2tHaMdqx2nHa8doJ2onaSdrJ2inaqdpp2unaGdqZ2lna2do52rnaedr52gXahdpF2sXaJdql2mXa5doV2pXaVdrV2jXatdp12vXaDdqN2k3azdot2q3abdrt2h3andpd2t3aPdq92n3a/doD2oPaQ9rD2iPao9pj2uPaE9qT2lPa09oz2rPac9rz2gvai9pL2svaK9qr2mva69ob2pvaW9rb2jvau9p72vvaB9qH2kfax9on2qfaZ9rn2hfal9pX2tfaN9q32nfa99oP2o/aT9rP2i/ar9pv2u/aH9qf2l/a39o/+ihd0mVd0VVd03Xd0E3d0m3d0V3d03090EM90mO9TZ9Ln1ufR59Xn0+fX19AX1BfSF9YX0RfVF9MX1xfQl9SX0pfWl9GX1ZfTl9eX0FfUV9JX1lfRV9VH61X9ERPdaFneq5X9Zpe11fTV9fX0NfU19LX1tfRG3pTb+nteqGX+hh9XX2svp6+vr6BvqG+kT5O31jfRN9U30zfXB+vb6FvqW+lb61vo2+rb6dvr++g76jvpHfoE/SJ+iS9U5+sT9Gn6l36zvo0vVufrvfovfoMfRe9T+/XB/RBfaY+S99V303fXd9D31PfS99b30ffV99P318/QD9QP0g/WD9EP1Q/TD9cP0I/Uj9KP1o/Rj9WP04/Xj9BP1E/ST9ZP0U/VT9NP10/Qz9TP0s/Wz9HP1c/Tz9fv0C/UL9Iv1i/RL9Uv0y/XL9Cv1K/Sr9av0a/Vr9Ov16/Qb9Rv0m/Wb9Fv1W/Tb9dv0O/U79Lv1u/R79Xv0+/X39Af1B/SH9Yf0R/VH9Mf1x/Qn9Sf0p/Wn9Gf1Z/Tn9ef0F/UX9Jf1l/RX9Vf01/XX9Df1N/S39bf0d/V39Pf1//QP9Q/0j/WP9E/1T/TP9c/0L/Uv9K/1r/Rv9W/07/Xv9B/1H/Sf9Z/0X/Vf9N/13/Q/9T/0v/W//HGGVIhmwohmpohm4YhmlYhm04hmt4hm8ERmhERmy0GXMZcxvzGPMa8xnzGwsYCxoLGQsbixiLGosZixtLGEsaSxlLG8sYyxrLGcsbKxgrGisZKxurGKsao42KkRipIYzMyI2qUTPqxmrG6sYaxprGWsbaxjpGw2gaLaPdKIzSGGOsa4w11jPWNzYwNjQ2MsYZGxubGJsamxmbG+ONLYwtja2MrY1tjG2N7YztjR2MHY2djA5jgjHRmGR0GpONKcZUo8vY2ZhmdBvTjR6j15hh7GL0Gf3GgDFozDRmGbsauxm7G3sYexp7GXsb+xj7GvsZ+xsHGAcaBxkHG4cYhxqHGYcbRxhHGkcZRxvHGMcaxxnHGycYJxonGScbpxinGqcZpxtnGGcaZxlnG+cY5xrnGecbFxgXGhcZFxuXGJcalxmXG1cYVxpXGVcb1xjXGtcZ1xs3GDcaNxk3G7cYtxq3Gbcbdxh3GncZdxv3GPca9xn3Gw8YDxoPGQ8bjxiPGo8ZjxtPGE8aTxlPG88YzxrPGc8bLxgvGi8ZLxuvGK8arxmvG28YbxpvGW8b7xjvGu8Z7xsfGB8aHxkfG58YnxqfGZ8bXxhfGl8ZXxvfGN8a3xnfGz8YPxo/GT8bvxi/Gr8Zvxt/GH8afxl/G/+Yo0zJlE3FVE3N1E3DNE3LtE3HdE3P9M3ADM3IjM02cy5zbnMec15zPnN+cwFzQXMhc2FzEXNRczFzcXMJc0lzKXNpcxlzWXM5c3lzBXNFcyVzZXMVc1VztFkxEzM1hZmZuVk1a2bdXM1c3VzDXNNcy1zbXMdsmE2zZbabhVmaY8x1zbHmeub65gbmhuZG5jhzY3MTc1NzM3Nzc7y5hbmluZW5tbmNua25nbm9uYO5o7mT2WFOMCeak8xOc7I5xZxqdpk7m9PMbnO62WP2mjPMXcw+s98cMAfNmeYsc1dzN3N3cw9zT3Mvc29zH3Nfcz9zf/MA80DzIPNg8xDzUPMw83DzCPNI8yjzaPMY81jzOPN48wTzRPMk82TzFPNU8zTzdPMM80zzLPNs8xzzXPM883zzAvNC8yLzYvMS81LzMvNy8wrzSvMq82rzGvNa8zrzevMG80bzJvNm8xbzVvM283bzDvNO8y7zbvMe817zPvN+8wHzQfMh82HzEfNR8zHzcfMJ80nzKfNp8xnzWfM583nzBfNF8yXzZfMV81XzNfN18w3zTfMt823zHfNd8z3zffMD80PzI/Nj8xPzU/Mz83PzC/NL8yvza/Mb81vzO/N78wfzR/Mn82fzF/NX8zfzd/MP80/zL/Nv8x9rlCVZsqVYqqVZumVYpmVZtuVYruVZvhVYoRVZsdVmzWXNbc1jzWvNZ81vLWAtaC1kLWwtYi1qLWYtbi1hLWktZS1tLWMtay1nLW+tYK1orWStbK1irWqNtipWYqWWsDIrt6pWzapbq1mrW2tYa1prWWtb61gNq2m1rHarsEprjLWuNdZaz1rf2sDa0NrIGmdtbG1ibWptZm1ujbe2sLa0trK2traxtrW2s7a3drB2tHayOqwJ1kRrktVpTbamWFOtLmtna5rVbU23eqxea4a1i9Vn9VsD1qA105pl7WrtZu1u7WHtae1l7W3tY+1r7Wftbx1gHWgdZB1sHWIdah1mHW4dYR1pHWUdbR1jHWsdZx1vnWCdaJ1knWydYp1qnWadbp1hnWmdZZ1tnWOda51nnW9dYF1oXWRdbF1iXWpdZl1uXWFdaV1lXW1dY11rXWddb91g3WjdZN1s3WLdat1m3W7dYd1p3WXdbd1j3WvdZ91vPWA9aD1kPWw9Yj1qPWY9bj1hPWk9ZT1tPWM9az1nPW+9YL1ovWS9bL1ivWq9Zr1uvWG9ab1lvW29Y71rvWe9b31gfWh9ZH1sfWJ9an1mfW59YX1pfWV9bX1jfWt9Z31v/WD9aP1k/Wz9Yv1q/Wb9bv1h/Wn9Zf1t/WOPsiVbthVbtTVbtw3btC3bth3btT3btwM7tCM7ttvsuey57Xnsee357PntBewF7YXshe1F7EXtxezF7SXsJe2l7KXtZexl7eXs5e0V7BXtleyV7VXsVe3RdsVO7NQWdmbndtWu2XV7NXt1ew17TXste217HbthN+2W3W4XdmmPsde1x9rr2evbG9gb2hvZ4+yN7U3sTe3N7M3t8fYW9pb2VvbW9jb2tvZ29vb2DvaO9k52hz3BnmhPsjvtyfYUe6rdZe9sT7O77el2j91rz7B3sfvsfnvAHrRn2rPsXe3d7N3tPew97b3sve197H3t/ez97QPsA+2D7IPtQ+xD7cPsw+0j7CPto+yj7WPsY+3j7OPtE+wT7ZPsk+1T7FPt0+zT7TPsM+2z7LPtc+xz7fPs8+0L7Avti+yL7UvsS+3L7MvtK+wr7avsq+1r7Gvt6+zr7RvsG+2b7JvtW+xb7dvs2+077Dvtu+y77Xvse+377PvtB+wH7Yfsh+1H7Eftx+zH7SfsJ+2n7KftZ+xn7efs5+0X7Bftl+yX7VfsV+3X7NftN+w37bfst+137Hft9+z37Q/sD+2P7I/tT+xP7c/sz+0v7C/tr+yv7W/sb+3v7O/tH+wf7Z/sn+1f7F/t3+zf7T/sP+2/7L/tf5xRjuTIjuKojubojuGYjuXYjuO4juf4TuCETuTETpszlzO3M48zrzOfM7+zgLOgs5CzsLOIs6izmLO4s4SzpLOUs7SzjLOss5yzvLOCs6KzkrOys4qzqjPaqTiJkzrCyZzcqTo1p+6s5qzurOGs6azlrO2s4zScptNy2p3CKZ0xzrrOWGc9Z31nA2dDZyNnnLOxs4mzqbOZs7kz3tnC2dLZytna2cbZ1tnO2d7ZwdnR2cnpcCY4E51JTqcz2ZniTHW6nJ2daU63M93pcXqdGc4uTp/T7ww4g85MZ5azq7Obs7uzh7Ons5ezt7OPs6+zn7O/c4BzoHOQc7BziHOoc5hzuHOEc6RzlHO0c4xzrHOcc7xzgnOic5JzsnOKc6pzmnO6c4ZzpnOWc7ZzjnOuc55zvnOBc6FzkXOxc4lzqXOZc7lzhXOlc5VztXONc61znXO9c4Nzo3OTc7Nzi3Orc5tzu3OHc6dzl3O3c49zr3Ofc7/zgPOg85DzsPOI86jzmPO484TzpPOU87TzjPOs85zzvPOC86LzkvOy84rzqvOa87rzhvOm85bztvOO867znvO+84HzofOR87HzifOp85nzufOF86XzlfO1843zrfOd873zg/Oj85Pzs/OL86vzm/O784fzp/OX87fzjzvKlVzZVVzV1VzdNVzTtVzbdVzX9VzfDdzQjdzYbXPncud253Hndedz53cXcBd0F3IXdhdxF3UXcxd3l3CXdJdyl3aXcZd1l3OXd1dwV3RXcld2V3FXdUe7FTdxU1e4mZu7Vbfm1t3V3NXdNdw13bXctd113IbbdFtuu1u4pTvGXdcd667nru9u4G7obuSOczd2N3E3dTdzN3fHu1u4W7pbuVu727jbutu527s7uDu6O7kd7gR3ojvJ7XQnu1PcqW6Xu7M7ze12p7s9bq87w93F7XP73QF30J3pznJ3dXdzd3f3cPd093L3dvdx93X3c/d3D3APdA9yD3YPcQ91D3MPd49wj3SPco92j3GPdY9zj3dPcE90T3JPdk9xT3VPc093z3DPdM9yz3bPcc91z3PPdy9wL3Qvci92L3EvdS9zL3evcK90r3Kvdq9xr3Wvc693b3BvdG9yb3ZvcW91b3Nvd+9w73Tvcu9273Hvde9z73cfcB90H3Ifdh9xH3Ufcx93n3CfdJ9yn3afcZ91n3Ofd19wX3Rfcl92X3FfdV9zX3ffcN9033Lfdt9x33Xfc993P3A/dD9yP3Y/cT91P3M/d79wv3S/cr92v3G/db9zv3d/cH90f3J/dn9xf3V/c393/3D/dP9y/3b/8UZ5kid7iqd6mqd7hmd6lmd7jud6nud7gRd6kRd7bd5c3tzePN683nze/N4C3oLeQt7C3iLeot5i3uLeEt6S3lLe0t4y3rLect7y3greit5K3sreKt6q3miv4iVe6gkv83Kv6tW8ureat7q3hremt5a3treO1/CaXstr9wqv9MZ463pjvfW89b0NvA29jbxx3sbeJt6m3mbe5t54bwtvS28rb2tvG29bbztve28Hb0dvJ6/Dm+BN9CZ5nd5kb4o31evydvamed3edK/H6/VmeLt4fV6/N+ANejO9Wd6u3m7e7t4e3p7eXt7e3j7evt5+3v7eAd6B3kHewd4h3qHeYd7h3hHekd5R3tHeMd6x3nHe8d4J3oneSd7J3ineqd5p3uneGd6Z3lne2d453rneed753gXehd5F3sXeJd6l3mXe5d4V3pXeVd7V3jXetd513vXeDd6N3k3ezd4t3q3ebd7t3h3end5d3t3ePd693n3e/d4D3oPeQ97D3iPeo95j3uPeE96T3lPe094z3rPec97z3gvei95L3sveK96r3mve694b3pveW97b3jveu9573vveB96H3kfex94n3qfeZ97n3hfel95X3tfeN9633nfe994P3o/eT97P3i/er95v3u/eH96f3l/e394//ihf8mVf8VVf83Xf8E3f8m3f8V3f830/8EM/8mO/zZ/Ln9ufx5/Xn8+f31/AX9BfyF/YX8Rf1F/MX9xfwl/SX8pf2l/GX9Zfzl/eX8Ff0V/JX9lfxV/VH+1X/MRPfeFnfu5X/Zpf91fzV/fX8Nf01/LX9tfxG37Tb/ntfuGX/hh/XX+sv56/vr+Bv6G/kT/O39jfxN/U38zf3B/vb+Fv6W/lb+1v42/rb+dv7+/g7+jv5Hf4E/yJ/iS/05/sT/Gn+l3+zv40v9uf7vf4vf4Mfxe/z+/3B/xBf6Y/y9/V383f3d/D39Pfy9/b38ff19/P398/wD/QP8g/2D/EP9Q/zD/cP8I/0j/KP9o/xj/WP84/3j/BP9E/yT/ZP8U/1T/NP90/wz/TP8s/2z/HP9c/zz/fv8C/0L/Iv9i/xL/Uv8y/3L/Cv9K/yr/av8a/1r/Ov96/wb/Rv8m/2b/Fv9W/zb/dv8O/07/Lv9u/x7/Xv8+/33/Af9B/yH/Yf8R/1H/Mf9x/wn/Sf8p/2n/Gf9Z/zn/ef8F/0X/Jf9l/xX/Vf81/3X/Df9N/y3/bf8d/13/Pf9//wP/Q/8j/2P/E/9T/zP/c/8L/0v/K/9r/xv/W/87/3v/B/9H/yf/Z/8X/1f/N/93/w//T/8v/2/8nGBVIgRwogRpogR4YgRlYgR04gRt4gR8EQRhEQRy0BXMFcwfzBPMG8wXzBwsECwYLBQsHiwSLBosFiwdLBEsGSwVLB8sEywbLBcsHKwQrBisFKwerBKsGo4NKkARpIIIsyINqUAvqwWrB6sEawZrBWsHawTpBI2gGraA9KIIyGBOsG4wN1gvWDzYINgw2CsYFGwebBJsGmwWbB+ODLYItg62CrYNtgm2D7YLtgx2CHYOdgo5gQjAxmBR0BpODKcHUoCvYOZgWdAfTg56gN5gR7BL0Bf3BQDAYzAxmBbsGuwW7B3sEewZ7BXsH+wT7BvsF+wcHBAcGBwUHB4cEhwaHBYcHRwRHBkcFRwfHBMcGxwXHBycEJwYnBScHpwSnBqcFpwdnBGcGZwVnB+cE5wbnBecHFwQXBhcFFweXBJcGlwWXB1cEVwZXBVcH1wTXBtcF1wc3BDcGNwU3B7cEtwa3BbcHdwR3BncFdwf3BPcG9wX3Bw8EDwYPBQ8HjwSPBo8FjwdPBE8GTwVPB88EzwbPBc8HLwQvBi8FLwevBK8GrwWvB28EbwZvBW8H7wTvBu8F7wcfBB8GHwUfB58EnwafBZ8HXwRfBl8FXwffBN8G3wXfBz8EPwY/BT8HvwS/Br8Fvwd/BH8GfwV/B/+Eo0IplEMlVEMt1EMjNEMrtEMndEMv9MMgDMMojMO2cK5w7nCecN5wvnD+cIFwwXChcOFwkXDRcLFw8XCJcMlwqXDpcJlw2XC5cPlwhXDFcKVw5XCVcNVwdFgJkzANRZiFeVgNa2E9XC1cPVwjXDNcK1w7XCdshM2wFbaHRViGY8J1w7HheuH64QbhhuFG4bhw43CTcNNws3DzcHy4RbhluFW4dbhNuG24Xbh9uEO4Y7hT2BFOCCeGk8LOcHI4JZwadoU7h9PC7nB62BP2hjPCXcK+sD8cCAfDmeGscNdwt3D3cI9wz3CvcO9wn3DfcL9w//CA8MDwoPDg8JDw0PCw8PDwiPDI8Kjw6PCY8NjwuPD48ITwxPCk8OTwlPDU8LTw9PCM8MzwrPDs8Jzw3PC88PzwgvDC8KLw4vCS8NLwsvDy8IrwyvCq8OrwmvDa8Lrw+vCG8MbwpvDm8Jbw1vC28PbwjvDO8K7w7vCe8N7wvvD+8IHwwfCh8OHwkfDR8LHw8fCJ8MnwqfDp8Jnw2fC58PnwhfDF8KXw5fCV8NXwtfD18I3wzfCt8O3wnfDd8L3w/fCD8MPwo/Dj8JPw0/Cz8PPwi/DL8Kvw6/Cb8Nvwu/D78Ifwx/Cn8Ofwl/DX8Lfw9/CP8M/wr/Dv8J9oVCRFcqREaqRFemREZmRFduREbuRFfhREYRRFcdQWzRXNHc0TzRvNF80fLRAtGC0ULRwtEi0aLRYtHi0RLRktFS0dLRMtGy0XLR+tEK0YrRStHK0SrRqNjipREqWRiLIoj6pRLapHq0WrR2tEa0ZrRWtH60SNqBm1ovaoiMpoTLRuNDZaL1o/2iDaMNooGhdtHG0SbRptFm0ejY+2iLaMtoq2jraJto22i7aPdoh2jHaKOqIJ0cRoUtQZTY6mRFOjrmjnaFrUHU2PeqLeaEa0S9QX9UcD0WA0M5oV7RrtFu0e7RHtGe0V7R3tE+0b7RftHx0QHRgdFB0cHRIdGh0WHR4dER0ZHRUdHR0THRsdFx0fnRCdGJ0UnRydEp0anRadHp0RnRmdFZ0dnROdG50XnR9dEF0YXRRdHF0SXRpdFl0eXRFdGV0VXR1dE10bXRddH90Q3RjdFN0c3RLdGt0W3R7dEd0Z3RXdHd0T3RvdF90fPRA9GD0UPRw9Ej0aPRY9Hj0RPRk9FT0dPRM9Gz0XPR+9EL0YvRS9HL0SvRq9Fr0evRG9Gb0VvR29E70bvRe9H30QfRh9FH0cfRJ9Gn0WfR59EX0ZfRV9HX0TfRt9F30f/RD9GP0U/Rz9Ev0a/Rb9Hv0R/Rn9Ff0d/ROPiqVYjpVYjbVYj43YjK3Yjp3Yjb3Yj4M4jKM4jtviueK543nieeP54vnjBeIF44XiheNF4kXjxeLF4yXiJeOl4qXjZeJl4+Xi5eMV4hXjleKV41XiVePRcSVO4jQWcRbncTWuxfV4tXj1eI14zXiteO14nbgRN+NW3B4XcRmPideNx8brxevHG8QbxhvF4+KN403iTePN4s3j8fEW8ZbxVvHW8TbxtvF28fbxDvGO8U5xRzwhnhhPijvjyfGUeGrcFe8cT4u74+lxT9wbz4h3ifvi/nggHoxnxrPiXePd4t3jPeI9473iveN94n3j/eL94wPiA+OD4oPjQ+JD48Piw+Mj4iPjo+Kj42PiY+Pj4uPjE+IT45Pik+NT4lPj0+LT4zPiM+Oz4rPjc+Jz4/Pi8+ML4gvji+KL40viS+PL4svjK+Ir46viq+Nr4mvj6+Lr4xviG+Ob4pvjW+Jb49vi2+M74jvju+K743vie+P74vvjB+IH44fih+NH4kfjx+LH4yfiJ+On4qfjZ+Jn4+fi5+MX4hfjl+KX41fiV+PX4tfjN+I347fit+N34nfj9+L34w/iD+OP4o/jT+JP48/iz+Mv4i/jr+Kv42/ib+Pv4u/jH+If45/in+Nf4l/j3+Lf4z/iP+O/4r/jf9pGtUltcpvSprZpbXqb0Wa2WW12m9PmtnltflvQFrZFbXFbW9tcbXO3zdM2b9t8bfO3LdC2YNtCbQu3LdK2aNtibYu3LdG2ZNtSbUu3LdO2bNtybcu3rdC2YttKbSu3rdK2atvotkpb0pa2ibasLW+rttXa6m2rta3etkbbmm1rta3dtk5bo63Z1mprbyvayrYxbesajekdE/t6e4yO4ag3JvR1zuzUO+YEo9E7pbenc5rRMRyd1sSuvomD0yd3d+7qTPzfsd2a1DvQMXFiZ8+APfHfQ719YsfslJOGQ/tQ/o4BowDYCbAYBnbOCXbxv0Sd/x4aBcPoHI56MZyxc05wxvxnUFP+M6gx/8s15X+5Bnu6RleShJg66/7n2VP/d6yuO6GjT5069EMfO9DVPalT75oTjLGMv4vxjx0ef9fwCzaWkXYNR3nsenLXzs56/2Hs/L/j4TGkObHqTpvS19nZ093RM6lror5Bx8TBgU69e07gIU1iS99g+CXonhPUDYbmp3YP/dA3Gn5Wz3+eJTJirm80/Kye4Reup2NGb/9AX++MqZ1K0TNF6eyZYoxjer1Mb9zw9HrnBG/c1MGeKR19g9O7OwYHvN7/3tI3HSb3/YecMbWsqm86TO4bDpsNP7Z/TnA2+8/L0///vjw5b1We6psPP3lgeM6bz36DBma/QeOH36DB4TdoPDMYZAbjh2cwOCdo4/u6eqZog7N/euP/z2wG/3vLGM8bOcgnf8v/jHHWf463/s/xbv871rcZnuHuc4K9zf8+irv/e6h19/ZM6R+eXW00sUJk1rWUKIi8lzVe2VqVWCPWiQ0in5hai9hOLIjlcKzDr8Ovw63DrcOtw63DrcOtw63DrcOtw63DrcOtl9q4qb19PVrv7J/D9zWYcwN2A3YDdgN2A3YDdgN2A3YDdgN2A3aj0MbPYQ7+j9lkvk3YTdhN2E3YTdhN2E3YTdhN2E3YTdhN2E3m3eT1bvF6t+C34Lfgt+C34Lfgt+C34Lfgt+C34Lfgt+C34Lfgt8Nvh98Ovx1+O/x2+O3w2+G3w2+H3w6/HX47/Hb47fDb4RfwC/gF/AJ+Ab/I9DHDZ/2UOYF7oRfQC+gF9AJ6Ab2AXkAvoZfQS+gl9BJ6yexLZl8y+xJ+WbcbsyvJ8Ene8e+h0SiGY0fncIUb19/d0T91+Lj3f8dzsiSjRxMrxISYEgUxI+bEKrFGrBMbxCaxRWwnFsThVyOpwK/Ar8CvwK/Ar8CvwK/Ar8CvwK/Ar8CvwK/Ar8CvwE/gJ/CRc5LAT+An8BP4CfwEfgI/gZ/AT+An8BP4CfwUfgo/hZ/CT+Gn8BF2ksJP4afwU/jYOknhp/BT+Cl8AV/AF/AFfAEfjycCvoAv4Av4Ar6AL+AL+AK+gJ/Bz+Bn8DP4GfwMPlZPMvgZ/Ax+Bj+Dn8HP4GfwM/g5/Bw+xk9y+Dn8HH4OP4efw8/h5/Bz+Dn8HH4OP4dfhV+FX4VfhV+FX4VfhV+FX4VfhV+FX4VfhV+FX4VfhY/7E9yf4P4E9ye4P8H9Ce5PcH+C+xPcn+D+BPcnuD/B/QnuT3B/gvsT3J/U4bMGSFgDJKwBEtYACWuAhDVAwhogYQ2QsAZIWAMkrAES1gBJHX4DfgM+64CEdUDCOiBhHZCwDkhYBySsAxLWAQnrgIR1QMI6IGEdkDTgN+A34bMWSFgLJKwFEtYCCWuBhLVAwlogYS2QsBZIWAskrAUS1gIJa4GEtUDCWiBhLZCwFkhYCySsBRLWAglrgQT3Jzg/wfkJzk9wfoLzE5yf4PwE5yc4P8H5Cc5PcH6C8xOcn+DwBIcnODzB4QkOT3B4gsOTgnwF+QryYfEEiydYPMHiCRZPsHiCxRMsnmDxBIsnWDzB4gkWT7B4gsUTLJ5g8aSEX8Iv4ZfwS/gl/LK0pvR1zOyc2Dt9gjXH47OP5vwuHZ1Yc7qQ/9wjiBkxJ1aJNW9qb++0jgm9M//7rAaxSWwR24kFcfi1SHF4isNTHJ7i8BSHpzg8xeEpDk9xeIrDUxye4vAUh6c4PMXhKQ5PcXiKw9MkcYf6nAmd3b2z/jcpRJ4i8hSRp4g8ReQpIk8ReYrIU0SeIvIUkaeIPEXkKSJPEXmKyFNEniLyFJGniDxF5CkiTxF5ishTRJ4i8hSRp4g8ReQpIk8ReYrIU0SeIvIUkaeIPEXkKSJPEXmKyFNEniLyFJGniDxF5CkiTxF5ishTRJ4i8hSRp4g8ReQpIk8ReYrIU0SeIvIUkaeIPEXkKSJPEXmKyFNEniLyFJGniDxF5CkiTxF5ishTRJ4i8hSRp4g8ReQpIk8ReYrIU0SeIvIUkaeIPEXcKeJOEXeKuNNqqQ309vT2e5O6Ovs6+7v659yyG90zpnbMObQ6enoHOrs7uzrcYkZ/11B/P+dusxjg92N7OXLHTe+a/deJ4Rvj//Nge9z0zinDD4q6hh7+f1jaHJba7Bzo0MZ0TJ/eMTywIUPDU7cZ+pUyxNM2nzp0pM4Gaut3zJjRoW/QMX3CpA55w0F5o0F5qy6DEcgbdymbTu3VNuuaMr1D2bxj0GA0ysZTu5TW0P8b93cNYxp1d+x/RhTwwJHbdse/L4Tb+d/pd45Mv2tk+nMN/t+nDk9uzvPVCbMnN2X25LRJnd0DHQa51N1nT232LwfmTG12Mm3anKl1z5na8CCbLblnUN61y+gdnp/SN7VX7589uYo2JygDQ3OEr8wYmt/Eof+Hbmq9s19497+vefD/DNPt/e+7Nvjfd63333dteBhIN20frc8ZbsXk1eKziXTTdqEOjaGiz3n+yO/4PNJkpzTZKU12SpOd0mSnNNkpgk4RdIqgUwSdIugUQacIOkXQKYJOEXSKoFMEnSLoFEGnCDpF0CmCThF0iqBTBJ0i6BRBpwg6RdApgk4RdIqgUwSdIugUQacIOkXQKYJOy2G+oLEWNNaCxlrQWAvULFCzQM0CNQsaa0FjLZCyQMoCKQukLJCyQMoCKQukLJCyQMoCKQukLJCyQMoCKQukLJCyQMoCKQukLJCyQMoCKQukLGisBY21wMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxwMcCHwt8LPCxoLEWNNYCPwv8LPCzwM+CxlrQWAsaa0FjLWisBY21oLEWNNaCxlrQWAsaa0FjLWisBY21oLEWNNaCxlrQWAsaa0FjLWisBY21oLEWNNaCxlrQWAsaa0FjLWisBY21oLEWNNaCxlrQWAsaa0FjLWisBY21oLEWNNaCxlrQWAsaa0FjLWisBY21oLEWNNaCxlrQWAsaa0FjLWisBY21oLEWNNaCxlrQWAsaa0FjLWisBY21oLEWNNaCxlrQWAsaa0FjLWisBY21oLEWNNaCP7IL/sguaLQFf2QXNNyChlvQcAsabkHDLXC/oOEWNNyChlvgfkHDLWi4BQ23wP8C3wt8L/C9wPcC3wt8L/C9wPcC3wt8L/C9wPcC3wt8L/C9wPcC3wt8L/C9wPcC3wt8L/C9wPcC3wt8L/C9wPcC3wt8L/C9wPcC3wt8L/C9wPcC3wt8n+H7DN9n+D7D9xm+z/B9hu8zfJ/h+wzfZ/g+w/cZvs/wfYbvM3yf4fsM32f4PsP3Gb7P8H2G7zN8n+H7DN9n+D7D9xm+z/B9hu8zfJ/h+wzfZ/g+w/cZvs/wfYbvM3yf4fsM32f4PsP3Gb7P8H2G7zN8n+H5DM9neD7D8xmez/B8huczPJ/h+QzPZ3g+w/MZns/wfIbnMzyf4fkMz2d4PsPzGZ7P8HyG5zM8n+H5DM9neD7D8xmez/B8huczPJ/h+QzPZ3g+w/MZns/wfIbXM7ye4fUMr2d4PcPrGV7P8HmGzzN8nuHzDJ9n+DzD5xk+z/B5hs8zfJ7h8wyfZ/g8w+cZPs/weYbPM3ye4fMMn2f4PMPnGT7P8HmGzzN8nuHzDJ9n+DzD5xk+z/B5hs8zfJ7h8wyfZ/g8w+cZHs/weIa3M7yd4e0MX2f4OsPXGb7O8HWGrzN8neHrDF9n+DrD1xm+zvB1hq8zfJ3h6wxfZ/g6w9cZvs7wdYavM3yd4esMX2f4OsPXGb7O8HWGrzN8neHrDF9n+DrD1xm+zvB1hq8zfJ3h6wxfZ/g6w9cZvs7wdYavM3yd4esMX2f4OsPXGb7O8HWGrzN8neHbDN9m+DbDtxm+zfBthm+z9pHnM3767Qz/Zvg3w78Z/s3wb4Z/M/yb4d8M/2b4N8O/Gf7N8G+GfzP8m+HfDP9meDXDqxlezfBqhldz/Jfjvxz/5fgvHz3yuIyYE6vEGrFObBCbxBaxnVgQh+ef478c/+X4L8d/Of7L8V+O/3L8l+O/HP/l+C/Hfzn+y/FejvdyvJfjvRzv5Xgvx3s53svxXo73cryX470c7+V4L8d7Od7L8V6O93L63Bz/5fgvx385/svxX47/cvyX478c/+X4L8d/Of7L8V+O/3L8l+O/HP/l+C/Hfzn+y/Ffjv9y/Jfjvxz/5fgvx385/svxX47/cvyX478c/+X4L8d/Of7L8V+O/3L63Jw+N8eHOT7M8WGOD3N8mOPDHB/m9Lk5XszxYo4Xc7yY48UcL+Z4MceLOV7M8WKOF3O8mOPFHC/meDHHizlezPFijhdzfJjjwxwf5vgwx4c5PszxYY4Pc3yY48McH+b4MMeHOT7M8WGOD3N8mOPDHB/m9Lc5XszxYk5/m9Pf5ngyx5M5nszpb3N8mePLHF/m+DLHlzm+zPFlji9zfJnjyxxf5vgyx5c5vszxZY4vc3yZ48scX+b4MseXOb7M8WWOL3N8mePLHF/m+DLHlzm+zPFlji9zfJnjyxxf5vgyx5c5vszxZY4vc3yZ48scX+b4MseXOb7M8WWOL3N8mePLHF/m+DLHlzm+zPFlTn+b09/m9Lc5/W1Of5vT3+b0tzn9bY5vc3yb49sc3+b4Nse3Ob7N8W2Ob3N8m+PbHN/m+DbHtzm+zfFtjm9zfJvj2xzf5vg2x7c5vs3xbY5vc3yb49ucfjen383pd3P63Zx+Nx/xLv1sTj+b07fm9K05fWtO35rTt+b0rVXqZ5X6WaV+VqmfVepnlfpZpX5WqZ9V6meV+lmlflapn1XqZ5X6WaV+VqmfVepnlfpZpX5WqZ9V6meV+lmlflapn1XqZ5X6WaV+VqmfVepnlfpZpX5WqZ9V6meV+lmlflapn1X6iip1tEodrVJHq9TRKnW0Sh2tUker1NEqdbRKHa1SR2vUkRp1pEYdqVFHatSRGnWkRh2pUUdq1JEadaRGHalRR2rUkRp1pEYdqVFHatSRGnWkRh2pUUdq1JEa9aNG/ahRP2rUjxr1o0b9qFE/atSPGudjjfOxxvlY43yscT7WOB9rnI81zsca52OtfSQf8+B8rHE+1jgfa5yPNc7HGudjjfOxxvlY43yscT7WOB9rnI81zsca52ON87HG+VjjfKyxTq6xTq6xTq6xTq5xvtY4X2ucrzX+/lTj7081/v5U4zyucR7XOI9rnMc1zuPa8HlcaR9efw/FCjEhpkRBzIg5sUqsEevEBrFJbBHbiQURfgV+BX4FfgV+BX4FfgV+BX4FfgV+BX4FfgV+BX4FfgV+Aj+Bn8BP4CfwE/gJ/AR+Aj+Bn8BP4CfwE/gJ/AR+Cj+Fn8JP4afwU/gp/BR+Cj+Fn8JP4afwU/gp/BS+gC/gC/gCvoAv4Av4Ar6AL+AL+AK+gC/gC/gCfgY/g5/Bz+Bn8DP4GfwMfgY/g5/Bz+Bn8DP4GfwMfg4/h5/Dz+Hn8HP4Ofwcfg4/h5/Dz+Hn8HP4OfwcfhV+FX4VfhV+FX4VfhV+FX4VfhV+FX4VfhV+FX4VfhV+DX4Nfg1+DX4Nfg1+DX4Nfg1+DX4Nfg1+DX4Nfg1+DX4dfh1+HX4dfh1+HX4dfh1+HX4dfh1+HX4dfh1+HX4dfgN+A34DfgN+A34DfgN+A34DfgN+A34DfgN+A34DfgN+E34TfhN+E34TfhN+E34TfhN+E34TfhN+E34TfhN+E34Lfgt+C34Lfgt+C34Lfgt+C34Lfgt+CQfPFHimwDMFninwTIFnCjxT4JkCzxR4psAzBZ4p8EyBZwo8U+CZAs8UeKbAMwWeKfBMgWcKPFPgmQLPFHimwDMFninwTIFnCjxT4JkCzxR4psAzBZ4p8EyBZwo8U+CZAs8UeKbAMwWeKfBMgWcKPFPgmQLPFHimwDMFninwTIFnCjxT4JkCzxR4psAzBZ4p8EyBZwo8U+CZAs8UeKbAMwWeKfBMgWcKPFPgmQLPFHimwDMFninwTIFnCjxT4JkCzxR4psAzBZ4p8EyBZwo8U+CZAs8UeKbAMwWeKfBMgWcKPFPgmQLPFHimwDMFninwTIFnCjxT4JkCzxR4psAzBZ4p8EyBZwo8U+CZAs8UeKbAMwWeKfBMgWcKPFPgmQLPFHimwDMFninwTIFnCjxT4JmiWupbzrnyWJ81HLYc/keGs+YEa8uRy9SsWSNHw8/DMwWeKfBMgWcKPFPgmQLPFHimwDMFninwTIFnCjxT4JkCzxR4psAzBZ4p8EyBZwo8U+CZAs8UeKbAMwWeKfBMgWcKPFPgmQLPFHimwDMFninwTIFnCjxT4JkCzxR4psAzBZ4p8EyBZwo8U+CZAs8UeKbAMwWeKfBMgWcKPFPgmQLPFHimwDMFninwTIFnCjxT4JkCzxR4psAzBZ4p8EyBZwo8U7Tgt+C34Lfgt+C3w2+H3w6/HX47/Hb47fDb4bfDb4ffDr8dfjv8dvjt8NvhF/AL+AX8An4Bv4BfwC/gF/AL+AX8An4Bv4BfwC/gl/DLir718Im425zAvdBL6CX0EnoJvYReQi+hl9BL6Ni/wP4l9i+xf4n9S+xfYv8S+5fYv8T+JfYvsX+J/UvsX2L/EvuX2L/E/iX2L7F/if1L7F9i/xL7l9i+xPYlti+xfYntS2xfYvcSu5fYvcTuJXYvsXuJ3UvsXmL3EruX2L3E7iV2L5MRHvPD7iV2L7F7id1L7F5i9xK7l9i9xO4ldi+xe4ndS+xeYvcSu5fYvcTuJXYvsXuJ3UvsXmL3EruX2LzE5iU2L7F5ic1LbF5i7xJ7l9i7xN4l9i6xd4m9S+xdYu0SW5fZSF7Gj51L7Fxi5xI7l9i5xM4ldi6xc4mdS+xcYucSO5fYucTOJXYusXOJnUvsXGLnEjuX2LnEziV2LrFziZ1L7Fxi5xI7l9i5xM4lXV9J11fS9ZV0fSVdX0nXV2LjEhuX2LjExiU2LrFxiY3L2giP+WLjEhuX2LjExiU2LrFxiY1LbFxi4xIbl9i4xMYlNi6xcYmNS2xcYuMSG5fYuMTGJTYusXGJjUtsXGLjEhuX2LjExiU2LrFxiY1LbFxi4xIbl9i4xMYlNi6xcYmFSyxcYuESC5dYuMTCJRYusXCJhUssXGLhEguXWLjEwiUWLrFviX1L7Fti3xL7lti3xL4l9i2xb4l9S+xbYt8S+5bYt8S2JbYtsW2JbUtsW2LbEsuWWLbEsiWWLbFsiWVLLFti2RLLlli2xLIlli2xbIllSyxbYtkSy5ZYtsSyZQmvhIdXS3xa4tMSn5b4tMSnJT4t8WmJT8thnyajhz06FCvEhJgSBTEj5sQqsUasExvEJrFFbCeOcMvhWIFfqdiTu6YM9nVO6uifyl2ZN9gzqbOvf2Lv0N0Tur1dBnsHOmd/f0lff+ckHkOaJPV7e2Z/V05nT3dnx9CT/IFZvf+5yaMYdMKgEwadMOiEQScMOmHQCYNOK/r0rp4539nSObG3hzGkvEQpL1HKS5RCS6GlTatz14ndHdOH5sI95E9H8jMbwYsieFMEb4rgTRGQBCQBSUASzEswL8G8BPMScAVcATeDm8HN4GZwM2aawc/gZ/Az+Bn8DH4GP4Ofwc/gZ/Bz+Dn8HH4OP4efw83h5nBzuDncHG4ON4ebw83hVuFW4VbhVJlnFV4VXhVeFV4VXhVeFV4VXhVeFV4NXg1ejXnWmGcNfg1+DX4Nfg1+DX4Nfg1+DX4Nfg1+HW4dbh1uHW4dbh1uHW4dbh1uHW4dbh1uHW5jtDext7u3Z/rQOTnQ0bcb9yZqd1dfBzdANHJ9Rmf/0KO4CaEBodFQJ/X2TOEG02kwnQYvZ5NpNZlWk2k1mVaTaTVhNplWk2k1gTaBNplWk2k1mVYTfhN+E/5wJ5RURo/ECjEhpkRBzIg5sUqsEevEBrFJbBHbiQVxeByVymhz7OS+jmkDg33cwQAqDKDCACoMoMIAKlVnVmfXUFkd6Ovo7+c+BlFhEJWmuen/Td7uzujr7J/Y1zVjoGv4O2mG7mQoCS9FwkuRMIKEESSMgIpcoSJXqMgVKnKFilyhIleSdquzf6BrescABqgkEFOIKcSUuaeQU6F1dHfOmMotZk6NrlCjKyn8FH4KP4VPxa5QsStU7AoVu0LFrlCxK1TsimDeVO4KlbtC5a5QuStU7gqVu0LlrlC5K1TuCpW7QuWuULkrVO5Klpizz72pXX2TrCETzjngjaV487VkQ5EhULwrFO9K1rCGUnR2TZk6MNUdmNrXyXG/M7lr5six2z+k4x5u8DyGRDGvUMz5CrOhyEtCMa/kjIeiXqGoVyjqFYp6haJeoahXKOoVinqFol6hqFco6hWKeqUKvwqfIl+hyFco8hWKfIUiX6HIVyjyFYp8hSJfochXKPIVijxfZpbwZWYJX2aW8GVmCV9mlvBlZglfZpbwZWYJX2aW8GVmCV9mNhSbVkdfX++s7s7JA8aco8EZ9pzYN/ttGP7lpN5ZPcNHE4befIuHTepx/z2a0N9p9/YNTJ39zW4d3W5Xz8DsZdXE2aey07nLYNfMobOlZ2KnNrV3sL/TG1p1dfdO6ZrY0d3TO2DPfvCUvo7ugRn/Hk4YMDcrhyrg0H+zDyocjP73IB05SEYOxMhBbeSgPnKQjxxURw4yDsRInmTk6dkIIhvJnI7kSUbuSUYek4zkyUaGKkYenI4MI/n3YISejIwn/fdg5FdiBFH5FzqSORkZqvj3wSOZxch4xL/zGsksRp6e/TvBf/PMuccYnDGhu3fiNGPoPZwdteFb3ZOHY98Atwf6pw6tfLU5P41J0+ZEa3JXd/fQWrp3V33doRenmurrDn3+xHDIZi/BZ/+6b+hjYAz0dXVMGZwxHPu4PalnOHZP1md/y1/3nD/2JVmrNSdBmlpdPTMnDA7lGJh9NPwQu3dGZw939k/vGvrYdkzsHPq8zfz3htI/2KNP7pw+9IlTZ//Q+mcMjVWd2D04QZva2TEEn9TVMbSWmORMH+znM9jp/+d4ZEHNtahJi9rTova0qD0tak+L2tOi9rSoPS1qT4va06L2tKg9LWpPi9rTova0qD2tET61p0XtaVF7WtSeFrWnRe1pUXta1J4WtadF7WlRe1rUnha1p0XtaVF7WtQe9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYT9kYb1eHXdyjWiHVig9gktojtxIJYDsfh13coVojkH359h6IgZsScCD+Bn8BP4CfwE/gJ/AR+Aj+Fn8JP4afwU/gp/BR+Cj+Fn8JP4afwU/gp/BR+Cl/AF/BHXl8BX8AX8AV8AV/AF/AFfAFfwBfwBXwBP4Ofwc/gZ/Az+Bn8DH4GP4Ofwc/gZ/Az+Bn8DH4GP4efw8/h5/Bz+Dn8HH4OP4efw8/h5/Bz+Dn8HH4Ovwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq/Br8Gvwa/Br8Gvwa/Br8Gvwa/Br8Gvwa/Br8Gvwa/DrcOtw63DrcOtw63DrcOtw63DrcOtw63DrcOtz7CZd4N+A34DfgN+A34DfgN+A34DfgN+A34DfgN+A34DfhNuE24TbhNuE24TbhNuE245UiEX8Iv4ZfwS/gl/BL+8K5jo0ndaVJ3mtSdJnWnSd1pUnea1J0mdadJ3WlSd5rUnSZ1p0ndaVJ3mtSdJnWnSd1pUnea1J0mdadJ3WlSd5rUnSZ1p0ndaVJ3mtSdJnWnSd1pUnea1J0mdadJ3WlSd5rUnSZ1p0ndaVJ3mtSdJnWnSd1pUnea1J0mdadJ3WlSd5rUnSZ1p0ndaVJ3mtSdJnWnSd1pDtedMh1e/5TN4fXQUEyJgpgR8+FY4fcVfl/h95WR31eJ7cSCWA7HBE4Cd9iLQ5G8CXkT8ibkTcg77MWhWCc2iE1iiwg/gZ/AT+Gn8FP4KfwUfgo/hZ/CTeGmcFO4KdwUnoAj4AjyC/IL8grmJcgvyC/IL8gvyC+YlxjhMK8MTgYng5MxjwxOBieDk5E/I39G/oy8OfPIyZ+TPyc/n6NmTv6c/Dn5c/Ln5M/Jn5O/Sv4q+avkr5K/Sv4q+avkr5K/Sv4q+avkr5K/Rv4a+Wvkr5G3Rt4a+Wrkq5GnRp46eerkqZOnzjjr5KuTr8446+Stk7fOOOvkr5O/Qd4GeRp8PhrkaZCnQZ4Gz2/w/CbPb/J5bjK+JuNrkrdJ3ibjbJK/Sf4mn7smnCbjbcJr8rlrwm3xurTgt8Nrh9cOrx1OO/nbydtOnoLnF4y74PkFzy8Yb0GegjwF4yzIVzDOgnEW5C8ZZwmn5HUq4ZWMu4Rbwi3hlnBLXqcSfgm/hFvCHfZh2Rquz0OR25xP9N0lfXdJ3122GFerHLk9PC7+TUHJvyko+TcFJf+moGznee0jj2d87YyvveT5jJP+r6T/K+n/Svq/kmsXS65dLLl2seTaxZJrF0uuWSy5ZrHkmsWSaxZLrlksuWax5JrFkmsWS65ZHIrD8yg4X4savBqcGpwa+Wvk5XzlWsSSaxBLrj0sufaw5NrDkmsOS641LLnWsORaw5JrDEuuMSy5xrDk2sKSawtLri0suaaw5JrCkmsKS64lLLmWsORawpJrCEuuHSy5ZrDkWsGSawRLrhEsuUaw5NrAkmsDS64NLP+/xq6lSW7cSN9G78c4dJmIva3DJ0dHAyDxOLIe1LQ9Mz0eqS2PLh01rZZUu/1Q9MNr7683SQBffuSgqDoxk/iQXwLIzGaxgOq0J7BNewLbtCewTXsB27QXsE17Adu0B7BNewDbtAewTXv/2rT3r017/9q0569Ne/7atOevTXv92rTXr017/dq0x69Ne/zatMevTXv72rS3r017+9q0p69Ne/ratKevTXv52rSXr017+dq0h69Ne/jatIevTXv32rR3r01799q0J69Ne/G6a+qf8jztumvTrrs27bpr0667Nu26a9Ouuzbtumvbdvnwp83l+Y/nB4dZUFnQWaiyUGfBZsFlwWchPMp2DiEpSBqSgVRBqiFZSB4SLGtY1rCsYVnDsoZlDcsalrWDBA4NDgMOAw4DDgMOAw4DDgMOAw4DDgOOChwVOCpwVOCowFGBowJHBY4KHBU4anDU4KjBUYOjBkcNjhocNThqcNTgsOCw4LDgsOCw4LDgsOCw4LDgsOBw4HDgcOBw4HDgcOBw4HDgcOBw4PDg8ODw4PDg8ODw4PDg8ODw4PDgCOAI4AjgCOAI4AjgCOAI4AjgCOExMu9QRCWiFtGIWIlYi2hFdCJ6EYVNCZsSNiVsStiUsClhU8KmhE0JmxI2LWxa2LSwaWHTwqaFTQubFjYtbFrYjLAZYTPCZoTNCJsRNiNsRtiMsBlhq4StErZK2Cphq4StErZK2Cphq4StErZa2Gphq4WtFrZa2Gphq4WtFrZa2Gphs8Jmhc0KmxU2K2xW2KywWWGzwmaFzQmbEzYnbE7YnLA5YXPC5oTNCZsTNi9sXti8sHlh88Lmhc0Lmxc2L2xe2IKwBWELwhaELQhbELYgbEHYgrBJLdFSS7TUEi21REst0VJLtNQSLbVESy3RUku01BIttURLLdFSS7TUEi21REst0VJLtNQSLbVESy3RUku01BIttURLLdFSS7TUEi21REst0VJLtNQSLbVESy3RUku01BIttURLLdFSS7TUEi21REst0VJLtNQSLbVESy3RUku01BIttURLLdFSS7TUEi21REst0VJLtNQSLbVE1/XDTxf//vK5CiYLVRTcYf2qe0Ltf5XsdLguDg/Ozi6/TG764Wbu4rMQkuCyNVdnwSXBqyzoLJgs5F4++mCrxUBna8V0HqYyr8+84TALmSVkljxSh5GG7FuwWciWQ7LsD00WqizUWUi9vM4YnTE6YzQwLgvZsk4+e3OYBZUFnYVs2WTLJls22bLJlk22XGVwlcF1xtQZU2d2m9ltZre5u83dbeay2Y7Ndmy247Idl+24PAqXR5Gjwueo8C5bzuHhXbbssmWfLefI8TlyfI4cnyPH+2zZZ8s5WnyOFp+jxedo8TlafKj+K31sPE0fG4frolkcXGw/bR4NqO6BTkHSkAykClINyUJykDykkKXu40+WwGHAYcBhwGHAYcBhwGHAYcBRgaMCRwWOChwVOCpwVOCowFGBowJHDY4aHDU4anDU4KjBUYOjBkcNjhocFhwWHBYcFhwWHBYcFhwWHBYcFhwOHA4cDhwOHA4cDhwOHA4cDhwOHB4cHhweHB4cHhweHB4cHhweHB4cARwBHAEcARwBHAEcARwBHAEcIXN0n34gKUgakoFUQaohWUgOkocEDgUOBQ4FDgUOBQ4FDgUOBQ4FDgUODQ7kuUKeK+S5Qp4r5LlCnivkuUKeK+S5Qv4q5K9C/irkr0L+KuSvQtYqZK1C1ipkrULWKuSqQq4q5KpCNipko0I2KmSjQjYqZKNCNipko0I2KmSjQjYqZKNCNipko0I2KmSjQjYqZJ5Cvinkm0K+KeSbQr4p5JtCvinkm0K+KeSbQr4p5JtCvinkm0YeaeSRRh7pUD8dnmFse7C92t5BuTz/sE0YgwpvUOENIsSYZMHpg4/bq01SDCs1K5YVx4pnZTlWxLlO6Z1LyophK4atCOYVwTpFYJ1CMB5CpxBMM4zH0ykEqxkWGNawsmClJSUcssLuBJ7RULHC7gSe3sDTG9id0IwVGUKnyBACO9opBFswjBcr8GIFXqzAixV4sQIvVlgzbM2wNcN43prDsSJ9OkX6NDyjDS9wwwvc8Fx3CsEMw3jiG46DhuOg4VVoOMibZqyQgYYzsAo23eYlaHgJGl6Chpeg4SVoeG4bntuG53bB07ng6VzwdC54Ohc8nQuezgVHa6cQrGIYT+eCp3PB07ngCO8UglmG8ax3CsEcw3g9OoVgnmGcPJ1CsMAwXoUFr8KCV2HBibBoxwr1aanPkidxyYGzZGvL9VihKKqDSreZccWlsW3GivjScllouSy0HJMtx2TLs9HybLRLdsziUcDiAd7iocDiocDiocDiAd7iAd7W1Xf06Qh/kA5uus9G39HnpVIL+pidfX7Xgj71zj6TFoR1/Pjm1+OWfkpKLXZnH7uzj9vZx+3s43f28b/vkxayOri4PrtIjw1uUF7R7PRbdwb4q3v+wJpuppVzWGGvfP8Jt/9vqafjqx1esexodHONfq4xlBptBs01Fh2ycw7ZOYfsyKFXewzezXnp9ulZ9NLNeenmvCya83Ne+jkv/T5mi176OS+LPcKcl2HOyzDnZdiHs+jlKC4RjyUvp412rtHNNfq5xpGXxQRBYuzTWHSkmCDTxuLMFHNh2licmWIuTBuLDhVzYXZ8xVyYNha9LObCtLHoZTEXZie6mAvTxqKXxVyYNs5yFr0crThWuuTltNHONbq5Rj/XOPKyGHoIuX0ai14WA2naWPSy+JekmAOI/Tkv9+pZdMTNrV8xF6aNRc5iLkwbiw4Vc2F2CMVcmDYWvSzmwrRxlrPo5WguMYclL6eNdq7RzTX6ucaRl8VFxWLu01j0spgL08ail8VcKEYXomrOy2IuTBuLXhajbNpY9LJobnaiZ8e3l9lilBVzYdpY5CzmwrSxODPFXCh6Ce9KXk4b7Vyjm2v0c40jL4vThWnap7HoZTEXpo1FL4u5UFw3rNecl8VcmDYWvSzmwrSx6GXRXDEXpo1FL4u5MG0seln8S1KMZETwnJezqzA7+DFn/BStdf7iQJv8Zaqu8tdBnVRDspAcJA8pZCl/7as9pBB0/NC/5hdOa36z1PK7rHbS0r9PiJs2Fuo0XlcymfVCl26a0c3oiTnMX5x1koPkIYUsueixq+nlZq/AyV7B2ytXK4YphimGaYZphmmGGYYZhhmGVQyrGFYxrGZYzbCaYZZhlmGWYY5hjmGOYZ5hnmGeYYFhDSsLVpZjhawt2dqKYSuGrRi2ZtiaYWuGtQxrGUbvWp3lCLEcIZYjxHKEWI4QyxFiOUIsR4jlCLEcIZYjxHKEWI4QyxFiOUIsR4jlCLEcIZYjxHKEWI4QyxFiOUIsR4jlCLEcIZYjxHKE2MCwwDCOHdswrGEYR5XlqLKrsUIGYuz8cXPx5fNmKCrmsIpXZU6HnzE+u778bSgzO0DDr43Pg6p9LFVzluw+Ptl9fLL7+GR3+PTf2+u7r01TGfN1O1OHypjddnZNURnzdTtz/uyanz/df7ndXlxffWWKdsL2sjZ1bCds1tqu6doJ28vaV3zbJ648xrF7/gXzdTt2Dzt2fnS7XNoJ28va1LGdsLG177gM9pjxdzS5Jo5anmwHG8O3MukpyOTtJZ2kIGlIBlIFqYZkITlIHlJ+0jIBHAEcQadNs+thgLZ7nsGTneykHd1sSzeXhZu1Lt1MX8LVNXdfjW4++//zm+uD64sPt3f/vjh/en11Lsrd/0nL8+H376A++3h9f0Pa9p/U73b7L+k3/DyeqMMP5UnHqy0RPhp8+XJ1f9n/dF8Ueh964XHk78VHA3eUet4B13MOuMg3iJFrAA48vfTNdoiFhx9P/+fgQxcgjz+eZvGb5uBM3559s4iXZbys4mUdL228vI6X7+PlKF7+Ei9/jZcf4uXHePkpXo7j5ed4+Vu8/BIvb+LlbbycxMvf4+VdvPwjXn6Nl/fD5UETXXtwHK9Pfri92Nx+jvKxyI/ffr6+uRrEh+u7eK9/FOj/rUYEN0NWJjmmTS+/bPpfMbu//Hhx/q/UeLe9+BAbnzf5X4xEkuZme/VpEJ8tz7pkvLjYxD5rMr4m4+uJ8efrkcEnR9TviPodTfsdjfv9JD4+OSYbx2TjeDqwYxrY8djeCdk4IRsnUz9Oxv1+FezT5nJzdnN9lSbxt/53nFND/xOE5/8bG5bS48nybJM7vFxOmF4sP3T1/Ozs/OouglcC7uSb6028/3TNtGuhfbEeG3i6ZjfWZO21dHr5euLG8DiptI4mX49Nvvx+gn70/W+bm7SaMtlPj9jFI5qZI3LpxdHY+IOjmHEv/1J0ydiUD7QCsWGRGmSEj37oTKfAmcKrOjUI/OE6BfnTY3b8WBz/w/Hn+6tPm5v7y4vNfbL8y9RynTz8hab6DcXWm8m4nr0ZpdQb6TbY08qTcRtXJP3xqWv35C2N9y2W4YSW4YRHcyKjeXyCtP7Dye8G9vSEFunlu2lSvaN4fidZ9PzdKFFe/jpNpF8niUQJ+F5Mvng/yYL3MsoXQzXiBOTKE2uj3Hjc9J8D4vQszu+i9Pj15vJyI9NqQpVyJT6yRPj7DO8q6yZX23zv0dF1vvnXzZcvmxyVl799iPKDH+/j9ad0/cc2B9cWy/Hg53jz4S+fr6OxN9tPybOHbzf3aSXIq4c/f05dlln4+XZLQ2lCmqV+3HfXV9dxpr9NQ5M7z7pRifa8Hw/Bk5dy58Xx5fknRpxMDX7bmxgt76uEGd0c3KwOFSuaFcNKxUrNimXFseJZCaw0rCxYWbKyZqUlRR2ywkNQPATFQ1A8BMVDUDwExUPgnK8UD0HxEBQPQfEQ1IoVHo/i8Wgej+bxaB6P5vFoHo/m8Wgej+bxaB6P5vFoHo/m8Wgej+bxaB6P5vGEOJ74yNk9F94Mj5yD0D9y9kJ65OzF+MgZpf6Rc8D1j5wDLj5yDmJ85ByAwyPnIA0cH66u42PtIPQcvZA4ejFyRKnnGHA9x4CLHIMYOQbgwNFLzzeXX85vbjdXH1JFOP08PNPucVrKWHyUsfgoY/FRxuKjjMVHGZt31HeSgVRBqiFZSOAI4MgnU/qfEoakIGlIBlIFqYZkITlIHlJI77v49ajl16OWX49afj3KJwKc5dejjl+POn496vj1qOPXo3w6oFeoD78E5XMDzvGrTj5E0CtkgF9o8vGCXiEYv9Dkgwe9QjB+oclHEpzj15aOX046fgXJJxccn1xwfHLB8ckFxycXHJ9ccI5XzvHKOV45xyvneOVcXLnRllW3c5troQV9qp19qCVHnqsGeqt5J7nmneSad5Ib3lFseEex4R3FhncUG95RbHh/teEd0YYPGhg+aGD4qyvDm+ENb4Y3/NWV4S+1DJ+TMT6fT+qkGpKF5CB5SDE/PR9f8Hx8wfPxBc/HFzwfX/B8fMHz8QXPxxc8H1/wTcWwimEVw2qG1QyrGWYZZhlmGeYY5hjmGOYZ5hnmGRYYFhgWGNYwbMFKDKjv2Ovfv1zLQxi1pCPn+YvKlr6oXJnSzapwc92Mbg5OmUMniE455Zsx8LrHMNl23T3diNJ9XstK/3NS0tJ/73N7e6i+zcqQsv2d1Gy52U6abbsWU/1SAZtXlLD8Z8QerniHOLtq4yD+HKtBHGa6fuWPdvd8qZMnihdTcQAoDoA1w9qxQn3or5znMzCez8B4PgPjF+wBH4jxCzNWyACnIZ+O8Xw6xqfTMWnM3ZNius2ZxgdgPB+A8XwAxvMBGM8HYDwfgPF8AMbzARjPB2D8ohkr1KfhPpxpiwXDFgxbMmzJsCXDVgxbMWzF82Tzwc1OspDcH2NYmVFYTcNrL9B/AJ0q2PYAAAEAAwAIAAoAEQAF//8AD3icJdJJTxRREAfwevUWka7p191eIWJMhGEZBhmXGE0E5WKC2w0ODoIyajTRm8sX0IPgAiibicYh0UQ8ix9AMMLBJdGreJFEHU4CY4x/8PAqv1SnX16q/qSISIj4CJ8kpjwp9QZnVs2SVnPqO7zEbaS5ndtJ8SHugrt1Lyndp/tJ64IuwOf0efiC6SdlCuY+aTNkhuBhMwyPmBH4gXkIj5pReMyMwxNmAp40k/AjMw8vmM/wF7uJlK2wVaRttW2Em2wTnLF34XsW99hROwaP26dw0RbhKfsMfu4UKcfOk3aRi+DY4V+XcT/gn24NLgcvSAXTwTTp4GXwCp4JZuDXUkdK0pImLfVSDzdIA9woeIM0Ce6RjGTgZmmGs5KFW6QF3imtcE5y8C7pgrslD/cIZiIFuUgsl+QyOlfkHTrz8hGdT6mvpFKLqUXSqW9hLamwLqwjDtPhHPw2nCcdLvjjpPwJf4rY530PfNr3wn3+DHzWl+BlvwaXfZm0/xMRqUhFmnRkoqvwteg6cXQjugnfigbRvxPfJhUPxAPE8WD8GH4SF8nEUzG2EC/E79H/kFSQSjYnlcRJkISwTyLSSZxshWuSGvS3JZ3w0eQYsmOQJN44VWpJ/UVaiPEGNmxgx5VwinEDb+Fq1O28A7WW0/jayJgqNzOmylnGVLmFW+Ec74b38F54H++HD/BBuA2ZXE/jYbiDO+BOJPN/Jte3/Au15ErY9bL7Da+4FXjVrcJr6xnY2AX/AwO6dWN4nOWdC5wP1fvHn5k5s7c5M3POpG1paa0l13VJQpIkSZKQkMot17XWkiSEJLmsWxchSULSJiS35PZzS+yuu9xCkhB+/fpJ0v+Z53t87RSlUH6v/8trP+d85z1zznOe88zMOec73wEaAMRofYyaYLZIb9ESElo9k54CWW3Tn+wIR9o92TJdi0pp0S1Vi4N4YDXvqp8AFR+o0yQBGjWoWyMBuj1cH3UUwC+/gAUa6BAJMcDBBgdiIR/cCAWI8V8x8btU/i71fpdeF6YMW+bvEY2JgWqBCzdAHOSF/AHGLsIMMCEKWy1Ar9OwVgIUbVj//gSoftHj/O0xuD1Cbc9zUXJ9mNzUqlzXVrCoVYuUbrCyVatOabCOdBvpbtLDvmrxrVPat9WKkCa3Tu3cSSvfpn1qC61ym/QWrbRq7VPbd9Nqte/aOUWri7u00BqmpD7VSWuZ0rlVitaONJW0G2lP0r6kAzs92bq9NhR3T9dGdfaPGpPm68T0VindtCnpfo0zSGd17dQqTZvXtWuZstoy8qrv6XjMadgi3yMMPRZNbdXgTtoC1D9+/gYoBsWhBJSEUpAMpaEMlIVycAuUh1uhAtwGFaESVIbboQrcAVXpCEMdDfh3Pfar/+lm0iKknEgCFKRPDqmFamIEeRgJedQxhUkjSSNIXVKTNFRLXlKbtCCVmwiF6FNSuH0axoKvRcm2/BhjN9HnOGgI02EWLIBlsBZyYAfsg8NwVovSPC2flqgV18pplbXqWm2tvtZUa6n10gZqI7Qx2kRtmjZTm6ct0VZrWdo2ba92SDuundJBj9KFHqcX0dvoqXp3vY8+UM/QX9Un6FP0TH2uvlhfqa83mMGNPEZ1o7ZR30g1uht9jIFGhvGqMcGYYmQac43FxkpjvbHF2G0cNI4ZPxhnWQRzIAJPeM1ICfWMsSWURlcH/zqgxfifNUx3+Aqa5afRmB5Sn09SDEdy4GV4Cp/DD9sl7Z64DXvJXmIfC+WcAk7r0HHORJVmhlIxJ5R6PUNpnlp0Fml50kP1Xr869Pn6I6HPsSL0ObYdlRwTm3NDsxsGxyXHdc/bLO/BfD/cOD1+RqjO/BXz1yfb9PyP558QKj3/3lCrCkSoNEalvVSaE0oTtoXSgvVUOikUJYVmhD4XWqHSdSrdpNKdKj2gUmV1oe9DaRIj21hSbFLzpPFJy+hT/qQdhTsUqVJky82zinpF5xSLL7ay2Jni3YpPL5FYon+JwyUTSjYqearUpOR8yaOSD5WuWXpymSplY8vOLTfmloqhWm7ZESr9lt0qPRlKyxdQaT2qR6sQFfpcobFK00LpPamhtGZcKL13lEqXhPr43iw6Pu7eTbUq1Fp93+DavWovur/k/evqjK+z4oH4BybXbVZ3aN1FD8Y/2Kserzf+oWb14+vXqJ9Zf0uo1gYxodIalKHPeRrUapDVsEzDeQ/HPTyxETQa1OjQI2mPZDVu3Hhek2pNJjYt2nTQo+LRtEdPhY5uVjx0dLMF9Nlq9v1jhx/f+0T35rz5pBYVW6xv2brl6VYj6Iqgtcbe9GO5dWKot1uXwe14bOuWKj0WKuvJnirNUOmCUNqmqErnhPZvczBUTptTIT+3jQn5o62n0liV5gsd11b5u22V0PFt66h0ZSht11BdWfzj81GZ1ehqVkZ7FNXRDmtn8TLDdAbX6zfrxSBWL6knQ169jF4G4vXyegXIr1fWq0CCfpd+FxTS79HvgST9Ab0JFDZaGW2gXMSxiO+gQsSJiP9CxYgfI37Ea6ZmdsCrmtAS9fJGTdYYr82V8Y5VG+pDU2gJHSAdekJ/GIx37LEw6QLXrJNwGk2P0Lj7HBjaRm2j24fSHLc3pdluL0qz3Gcp3eA+g2kO7teD0hz3aUqz3e6UZrlPUbrB7YppNu6XTmmO24XSbDeN0iy3M6Ub3E6YZuF+KZTmuB0pzXY7UJrltqd0g9sO0w24X1tKc9w2lGa7T1Ka5fYEHbf2Rd3opqJmud1Qsy/DI+OUR8Yqj7yuPDJGeeQ15ZFXlEdeVh4ZrTwySnlkpPLIcOWRDOWRYcojQ5VHhiiPDFYeeUl5ZJDyyIvKEy8oTwxQnnheeaK/8kQ/Sje448kXI3wvuANRN7iv+j66DI98rDwyV3nkI+WROcojs5VHPlQemak88oHySKbyyPvKIzOUR95THpmuPPGu8sRU5YkpyhPvKE9MVrHxtvLIW8ojE5VH3lQemaA88obyyCyKkXnkl0nkkWl+pFyGRzYqj+Qoj2Qrj2Qpj2xQHlmvPPK58sQ65YnPlCfWKE+sVp5YpWJjpfLIv5RHliuPLFMeWao8skR55FPlkU+URxYpjyxUHlmgPDJfeWQtRccm8shi8siKy/TIceWJ75QnjilPHFWe+FZ54rCKjW+URw4pj3ytPPKV8sgB5ZH9yiP7lEe+VB7ZozyyW3lkl/LITuWRL5RHtiuPbFMe2ao8skV5ZLPyyEHyyBGKlB3kkb3kEbzG+8f7V3gNz2wci6biJT4Kr/bxODotg/6qAXWhsWgODMd0Z7VvxRMqd1g8TrmfcdtjKndYNMPcMdrvUZU7LJpSzt+vicodxnry4Yg0GUfL1aEONILm2BvdoA8MEt1wn5NY2reiq8odFumUO4bbuqjcYdEubFHbsEVtwhY9GbaoddiiVmGLWoYtanEJFvUIW/R02KLuYYueCluUFraoc9ii1LBFncIWpYQt6hi2qEPYovZhi3BMr4/UX9ff8cf7xi3+3diuhXoSZwfxaGk1jORmkAo9MHZnwBY4hL0ZAVwMBt2U9n5UR20Z6m/hTWkLjuTEcMx5ir1ErFmuvYfQlsfCe2fQ3iZ6yMM5QgFIorKj+BOopWg/TsdbVEM0HTPMLyP3MbTFJUuiqYaQnVFUv6Vq9u2KofpsvxSqwbfKMKNMnOuYEu2IMkuZpXBupmPZhtvcfcIs5HvKTDJnmJm4FYknPX+0orO1bHtoPy+/V8C7yd+PfWYWNYthpPvzH39UAzSmuYtqyW/ijIzKiXGfcJuDb4Vuvh4hcH8dZ33l/bHgHxyBZ5QcLt8IzfnUsQbOFivQuCn2ko++UDmXarPJFrNP2VK2TL75Fy0PlnC59gdLY+GzzJ9z/vnyLl5y0D/VL+ofjS25gF8utn/u+jQ5UR1ZLdeRd1/0yIvVv/xKlOIVDEW3ycxe7CCdBb3NPuZzeGVfBrvlRt6P9+fP8wH8BT6Iv8SH8mF8BB/NX+Wv8/H8DT6Bv8kn8rf5FP4un8E/4LP4R3KL3C53yj1yH5/HF/LFfClfwVfxJL6Wf8bXmSW8eOtrZ72zwclysp0cZ6P1X+uEdcjZ5Gy1vrW+t445O5xd3ODg7OURPJq7zn7ngPMVtznnjnPQ+ZpL55DzjXPY+dY54hzlwjnmfOecdP7jnHJ+cs46v5iPubprWqfdKOtn13I591zbbOtexyu6sfx6Ny+/0Y3nce5NbqJb2C3qlnCTeQF+k1vWLc8Lu7fyBLciv5NX4bfzO3g1txKvyh9xK7u3u1X5Xe6dvAi/mSe5Z9yf3Wru3W5N9xcRLbhwhSeuF3HiRlFAFBRJorAoIm4WxUUpUUbcIiqISqKKuFNUF/eIWuJ+UVc8JBqKh0UjOUW+K2fID+RMOVvOkR/JeXKhXCw/lUvkUrlM/kuulp/Jb71EeUyekN/L/8rT8mcPPMOL8CK9KK+wV8Qr5pX0SnnJXlnvVq+id7tX1bvTq+7d49VyH/T7le1iuwDYHnYG4+WsGQk3mSXMklDMTDZ7QQmzrzkcepojzZEw2JxuvgdDzA/MD2GYOcc8ASPMf0dosN6t69aFXRgNlWGs3Mxf5EP4cD6Kv8LH8HF8En+HT+Pv8Uz+IZ/DP5bb5Bdyt/xSHuAL+Cd8CV/OV/I1vDCvwZvwGs4aPtD60fq3ddjZ4my3jlo/WMednc4ebnLd2cejuOWccL53/uucdn42H3U1Z43L3EjrjBtj/cIXWGd4Htd1Pfd6XtmN4ze4N/L8bgGezy3oJrk3u8XdUm4Zvsb60b3FOor9eBsvxJu4Vfjd1hG3unuPW0uAsIQjpMgjbhD5RH6RIAqJYqKkKC3KiVtFRXG7qCruEjXEvaK2eEDUEw1EYzlNvicz5Sz5sVwgPyFdIVfJtfJzedRLksflv+UP8kd5Rv7i6Z7pFfVKeGW8W7zbvMreHd5dXg3vXq829kKc6oX9bD/2wlfsK7yrfM1wtMeOY79EYb/gvNeMwN6Jp94pYJY374YEs5H5LJTBs7E3NDIHmYPgEXOwORgam0PNYdCEeupR7KlP4HFzqbkB2pk55mZ42txqboVnzR3mTuhl7jGPwXPm9+Z/YLh5yjwDI82z2Kf+XKcKjJOb+EA+mGfwkfxl/hofy9/ik/lUPp19z/7DZ/O5cqvcIXfJvXI/n88X8U/5Mv4vvtrsib3ZGHtzNfbmKeuk9Y2z2dlmHbH+Y33nfOHs5oxrzpc8ksc4x51/Oz84PzpnsDfBWe0aboT1kxttneXzrZ/4da7jSjcPr+TewGPdfDzezc/zugluIbeIW8wt6Zbmq61TbjnriNnTrcATeWO3ivUN9uZdbg33XvesiBG2EOI6ESvyinhxk0gURUUJkSzKivLiNlFZ3CGqibtFTXGfqCMeFPXFI3KqnC7flx/KuXK+XES6XK6Ua+Q6ecQrJL+TJ+V/5Cn5kzzraR7zbvaKe6W9cl4Fr5JXxavm3e3V9O7jlbA/815r/Unn6Fi0LB/E+OMW7zq3OV6lcFTj5TV7e3n89UJ/HGPqOMLp7d8BzNl4PV6B4/Wq4EAijlFXQhbOVw7AMTil6RrXYrUErbhWHkdCsThOTMR7YjLe5yrjvaYm1HFbgG597T4MupPlNkDd4D6Eul7iXACvY+tRZ/ONoOMdIxt1AN+A2p9/jtrvwiXKbDpyg3+k25JKb0SlN6TS6/ul801UYg6VmEUlrqcScZTnPuIzyjUO55qEc03DuUfDuWbh3GPh3OPncuKZcK7nuZwXHc7FqJyD58RyjNgkjNmbMWqLY9yWwlhrgFGEV1yc/Wg4D/LHpR5vi+OMA/7+6PlwHmPBv5MfCO7rJZzf93w+176NaJZVBH3n7y+wPBYumal9iXh18fNyKkflFHGcomD420MplW1gPfP5MszhHAjjoiiO1+qpchLO1XAuR0cwjrMPvBoMMjW134Ph+h4M1iczQvWF0tDR7AA7RjUa9P1IHozfBPJDydA4if+LdAzpStLxWJrL1rNtOJKJMuPBopF8gjnKHAMFzXHmRChqvm1OhmRzivkulInQI1woHyEjboDqEQUiSsF9vCnOCJrY+3H+8YSz1lkLzd2f3J+ghXgJZw4tlSXnIjQ0pqpxUVv8vSOV1SWhHI5IqyKpqax/mXQprZUaubZsIl1GY/LePOlvaFHkr864ULvu+VNW+uW4ONosg1FRFX1SG2OjEc4d/TWQNOgOvaA/7jtItX0q6XL/aP4I/yxX6W1z5WeH99J4k3BNYW6aRN7KtdeKv8FbrupLujJBfWgMj0NrSIF0nCX3gQHKezWvcjt9S/Ko/qoFdaEhNIXmeGam4NW6J/SFgTAUXsar/kSYAv63M7OuvOfZnl/FwD/dM3kw9qrQ6tu52GsHqSr2BkEGjmzGwySYBpmqj+79hz3i23ydui7U+JXV53txFIwB/3u6yaoHB5NOUmVc0Fq6C4Ts0PgE0tdyXZlWXcKeTf62Xrvu/H0+fDadv2b4/RaK41Cf1foHfGCob83PzaM1nuKrPKiIULbdp1hoayymibSq4bPa4N/R1ErCH6w5GOq7chZeLfyzJeTOxUG0d52X17veu8HL5+XxYr0470YsKxrHe7PNteZn5hG+wp99yp/BXwUc4LfCTsAjW0NpeZ+sLe+XdeQDsq58UNaTD8n6soFsKB+WjeQjsrFsIpvKR2Uz+Zh8XD4hm8sWsqVsJVvLJ2Ub2Va2k+1lB9lRpshOMlV2lmmyi0yXXWU3+ZTsLp/21x30L/UjaOYxwwVupBlp2GIde7mgrCbvktXl3bKGrCnvkUVlMVlclpAlZSmZLEvLMrKsLCdvkeXlrbKCvE1WlJVkZXm7rCLvkFXlnfJeWYtKb6+3x9I76mmg6en6ELzX6VoU9BP7xH5xQHwtDolvxGHxrTgijopj4jtxQvxbnBTfi/+IH8R/xSnxo/hJnBE/i7PiFwlSk7o0JJOmjJCRMkpGyxhpSS5tKeV1Mo+8XsbKG2SczCvzyRvlTTJRFpKFZRF5sxQyv4yXBcQqWVAOFVPFNPGumC7eEzPE+yJTfCBmig/FLDFbzBEfibniYzFPzBcLxEKxSHwiFotPxRKxTnwu1osssVXsFHvFUrFCrBafiS/EMpkg1opssUbkiA1ik9gstoiNYrvYIbaJ3WKP2CWWS1cmiZXiS/EvcVyclo74SvhrOf1wROk/DeQ/ZeRhbPtP2+SFG/2nbaAgFILCcDMUgxJQCkpDWbgFbsVYrIxX2Kp4tlbHK9a9GPH3wwPwIDwEDeBheASawKPwGDwBLaAVPAltoT10hE7QGbrAUfgOTmhW5LORvSOfi3w98ijfzU/xH/lp/hM/w3/mZ/kvNtiarduGzWzTjrAj7Sg72o6xLZvbtu3Yri1saVewb7Mr2pXsyvbtdhW7tf2k3dfuZ/e3n7cz7LH2OHu8/YY9wX7Tnmi/ZU+y37Yn2+/YU+yp9jR7jj3XnmcvtD+xP7XX2uvsz+0NdraK8suN5N87S/woZ4YwSuOJXdaoAglGVeNOKGl0MbpQrNeGxHCsX0qU/ybOQ2cIlqTrQ/XhGO0j9Uy8duhaDPQPxPnfFuV/OcbXYEyvxUj/TMX6BozrHIzpjRTVWzGqt2Fc78So341xvQfPg1V0JvjnwAfBOA9FOZ7bpzHS+9PzZDaO3SQ99xaHo/J4KIAj80S8xhbBsW9xvFIn4+i1HN6NKkAluB3ugDvhLrgbx8G1sI/q4BirHt6fGuI9ujGOtZrhfao53sFa45irHd6vUvCenYZjwGNwHE5qPLJXZJ/IvpHH+G47zs5r57NvtOPt/HYB+yY7wS5oJ9qF7CS7sF3Evtkuahezi9sl7JJ2KTvZLm2Xscvad9hV7TvtavZddnX7bruGfY9d077XrmXfZ9e277fr2A/Yde0H7Xr2Q3Z9u4Hd0H7YfszuZj9lD7CH2e/aH9kf2/PtRfZie4n9mb3ezrJz7I1iMt3t/Gczzq1e30/q3yv6yyGhZ77YSP8z/5ofD3023g1+/uUH/7MYK95WfHaQ07cmmhghXlfljQtw/zuTKP8+Zh0EnU2nu+8Euq+e325EnQiT88+FxJGtdWj7TNQbWFuWwrqwHuwZ1pM9y3qx3qwvG8heZIPYS2wwG8KGsmEsg41ko9k49oYqKQ+tgiT8qiyNDUflFywRj76EYzX2/CXtlUZr8vEYPaGeaEn7PUCss//NknZCO4FdgpdB3NIWj9L9FkAJ9gp7BZLZWLSmNHsD21PWyrQyoZy1wFoAt3iuJ+h7Bg09p0Mkm8AWAsQ0i2kGBayF1gq4yVpprYFi1jr0byl7q70DanmW56CF/jcvBTCWJygfT76iFv2TLWqjWpRyhX2ss1G431+zjGFkNMex7DQIPemUeY15+3LaFmqRfyYnBFoVin60jb0ZLi2/Nd+a/5syN0Mpa6v1Jdxm7cfyq1P5Nan82lf9vLkSFmpooW+fTqspv/VB6Jp2udb6nvDj249uneZKV94XV8pSDS317TTwLuuvDV3MJ76+TTqK2uefJX48GbSikX7VWhis989bO/wfsnb4H5xvI656NI/422JkxEVa/2ePGnXVryFXwutX+9y+cv129eP+wj3/T9R7LnYSVez89nyglX/28V8aq/gRHBqr/DaOx6j6r07poy7bdn+1LlT6lY/Vv2rXuVHWFHWNnHFFLfvnW9aGxrR+y6587F9evJl4hrRUa+yh+8eca9T3f7WFV78HLu+c/F/ogctpob/GEEVH9lDX4tC6wUJgUSfYVDaMmP+dTnH6FjyWRkdM+HOb0ZTTwzlD5YzQqgFdIf1j4iBJHeOvRZw76nzeCOfDR2oLyJIKF/jmZjJMh5kwFxbBMlgN62ET7IC9cBCOwEk4BWc1psVoQovV4rVEraiWrJXXKmvVtJpaHa2+1lh7XGutddDStO5aL62/NkjL0F7WxmoTtSnaDPSn7gnPRXXRwzr6ORM1Ez2vo//HoY5jY1HHYr/o2Duj/fai9/1Z3kjqNb/vhrMM1Az0nM6GsaGoQ9kQ1CFsMOpgbJ3OXmKDUAexF1FfZANRB7IXUF9gA1AHsOdRn2f9Ufuzfqj9WF/Uvuw51OdYH9Q+rDdqb9YLtRd7FvVZ1hO1J3sG9RnsTZ31YE+jPs26o3ZnT6E+xbqhdmNdUbuydNR01gW1C0tDTfPjmXVmqaiprBNqJ5aCmsI6onZkHVA7sPao7Vk71HasLWpbjFtdtzGGdfzDaMGo+/U6U10IfTt0+dGeD849t8HZeKy3kq9RVC/LpN/7DdQ8rST2d3OtJ/ZtprZa26ed0WP1MnptvbXeRx+jz9LX6Qcx6PIZ5Y26RjujvzHemGtkGYcZYwVYRVYfWzyQTWQL2CZ2zIwyE80qZiMzzRxsTjYXm9vMkxE8okhEtYimEd0iMiKmRSyL2BnxQ6SILB5ZI/LxyB6RoyJnRK6M3Bt5OipPVHJUraiWUb2iXo2aGbU26kDU2ei46HLRdaLbRPeNHhs9J3p99KEYPSY+pkJMvZgOMQNiJsTMi8mJOWJFWAlWZauhlWoNsiZZi6wt1nEew5N4Vd6Yp/OhfApfwnfw723HLmpXt5vZ3e0R9nR7hb3bPuV4TkmnptPc6em8jD6PAgfy+L2jV/I16gTp8XOEeq+Sr1EnSMPE7130b1ufkJ4n7Yi0I9IuQNoTaU+kfYB0INKBSIcA6UikI5GOAZJCJIVISoB0ItKJSKcASSWSSiQ1QDoT6Uykc4CkEUkjkhYgXYh0IdIlQNKJpBNJD5CuRLoS6Rog3Yh0I9ItQJ4i8hSRpwKkO5HuRLoHyNNEnibydID0INKDSI8AeYbIM0SeCZCeRHoS6RkgzxJ5lsizAdKLSC8ivQKkN5HeRHoHSB8ifYj0CZDniDxH5LkA6UukL5G+AdKPSD8i/QKkP5H+RPoHyPNEnifyfIAMIDKAyIAAeYHIC0ReCJCBRAYSGRggLxJ5kciLATKIyCAigwLkJSIvEXkpQAYTGUxkcIAMITKEyJAAGUpkKJGhATKMyDAiwwIkg0gGkYwAGU5kOJHhATKSyEgiIwNkFJFRREYFyGgio4mMDpBXiLxC5JUAGUtkLJGxATKOyDgi4wLkDSJvEHkjQCYQmUBkQoC8SeRNIm8GyEQiE4lMDJC3iLxF5K0AmURkEpFJAfI2kbeJvB0gk4lMJjI5QN4h8g6RdwJkCpEpRKYEyFQiU4lMDZBpRKYRmRYg7xJ5l8i7ATKdyHQi0wPkPSLvEXkvQGYQmUFkRoC8T+R9Iu8HSCaRTCKZAfIBkQ+IfBAgM4nMJDIzQD4k8iGRDwNkFpFZRGYFyGwis4nMDpA5ROYQmRMgHxH5iMhHATKXyFwicwPkYyIfE/k4QOYRmUdkXoDMJzKfyPwAWUBkAZEFAbKQyEIiC3MTHLMh8TXqBGmYWNQLFvWCFegFi+qxqB4rUI9F9VhUjxWox1pEZBGRRQHyCZFPiHwSIIuJLCayOEA+JfIpkU8DZAmRJUSWBMhSIkuJLA2QZUSWEVkWIMuJLCeyPEBWEFlBZEWArCSyksjKAFlFZBWRVQGymshqIqsDZA2RNUTWBMg6IuuIrAuQz4l8TuTzAFlPZD2R9QGygcgGIhsCJItIFpGsAMkmkk0kO0ByiOQQyQmQjUQ2EtkYIJuIbCKyKUA2E9lMZHOAbCGyhciWANlKZCuRrQGyjcg2ItsCZDuR7US2B8gOIjuI7AiQL4h8QeSLANlJZCeRnQGyi8guIrsCZDeR3UR2B8geInuI7AmQvUT2EtkbIF8S+ZLIlwGyj8g+IvsCZD+R/UT2B8gBIgeIHAiQr4h8ReSrADlI5CCRg7mJTf1jU//Ygf6xqX9s6h870D829Y9N/WMH+sem/rGpf+xA/3iWT3yNOkF6nnAinAgPEJoZeTQz8gIzI88h4hBxAsQl4hJxA0QQEUQEEf9dHJc2G14IZWk1px7NiR/COfEKqE9rOo/Rmk4LWtPp5VlYcl+cC08CGxLot5JVoRbUh2bQBtKgJwyADPDXiVhozYFytAZBOVqToBytUVCO1iwoR2sYlKM1DcrRGgflaM2DcrQGQrkRmBtBOVodoRytpfjPVuEMeyQAzfQ5aFpTiIVyUAXqQnNIV3b6v5GeC6shB3bCQTgOp8O/lKlFa1Tr/JWX0FqAH6PsFf8qd26L38u4ZX2uLZy2bMi1xaYtWbTFLzE7nMsJ5zaGc5vCuc25aj5AZWwJs63h3LZwbns4tyOc+yJXGV9RGTvDbFc4tzuc20M5P5oExGHPG2wMG4V3CYO9huneXK1yqLQvz21hE3AECWwKjtUi2QwcfXGWiaMmm32Iox2XzcFxhcQa/GfnYiBeWYT3JTbGv2+x19SWNbRlNW3xV/8+tvZC7ieQ9ql+D33HE/HLLxD67segZ6Ly0NppIq0GPUjHT0dPXaknBfwaYqEAahJG+4XriPzVufYCrd6NhoJsHJ5libTOVIjWmZKukEVxeA4aUAQa0m81Lt+mv78F+bDHGBSFRnhGzvoH2vD3t/hcFBW/YGvPfddr4NVrOJ5TI/EaFkPXMOs3fd70Cvjrj+vL3UOD//Ye+mP74nEvE73ZGAbCHFhwjcfQH7fn965jqHhPuvJXo9zl/pPXlNx2/C9dGS7UL793fvv77/uT+2dfxfM/tz1Xq/zsa+h6kru914o92f/D17Pc/vxftT/70q6/rPOvztvWFxtxXva37p0v0aIBf5tFfk2hpwt1+k116FcJ/rtF/e9k/T3od34079OY/xxDrm9T/Tk2y/Dn4IpPo9LK0+/k/Kfn6qlnMx6C33u2X4No9ZuB878YeIPK89/I6rKJ7C32NpvMprLZ7CM211pvbbCyrRxrk7Xbn+HQnTdD3XmjqbUxZEc5+qWi/3xC3cu2IpJNY++zD63N1hc4Atx2ZduJM85roJ1kxVVtJ83y/vF2khVXtz+zr4V2khVXtz+nXgvtJCuubn9uuhbaSVZc3f7MvBbaSVZc3f7cfi20k6y4uv05+VpoJ1lxdfsz51poJ1lx4Xb6v4M79/4/f3bvXOSXk8NUDX/2l5V/5YgK9AahAjgvTFZrwMJ/Gs9z/bYAw0+Ukj3+Z7UdR5wndZuNhfNvSEiDobAYjlPrGsDV+4aCYw+H+vd9lom9G+rb7Z71N3ns/C9M/3+1Og3Ov00jFWfUI/7RNmvCCPTFtWXVteYr7Zr0lXZN+kq/Jn2lX4u+oifvNTbomrTqxWvSqpfUWCfG/z+aYlbFrAIjZrX/D7f7n1cDveVXfuWe1vyVY8P/vzfsgrT+48rhcoQcKUfJ0fJl+Yp8Vb4mx8jX5Vg5To6X/nfjF353cB9w1W8zQ2/lCr6lzH9bmi4nyuGkI0hHko4iHU36MukrpK+SvkY6hvR10rGk40jHk16WTV5BMz9pAdKbSBNIC5ImkhYiTSItTFqEdAbp+6SZvrpPkDa/qE3h37Dwdvg3hq/k4/0+ozcKJsO59a5Y3gEi+VIw+Mt8E1/Gk4KfQ29/pHfzpdEx/vfuRaEWbw8uX84/w/3a4t9szDfx39ZnmvwtzK9Q/JE/w7GuMKda/TlwRrjWctBM5kCeC9fK9vi2nz9e7XmB+i9lz5Al/p4XtKl82LMpcB2f5L/Jyz+W3pc5gb+Gnl6V61MTdeRgOPc+EpOnyIPya3lIfkMkxT+LgckJ8k35ljwMud/H9dt3nUREcjr3/Pd/RACNYOlXlxEx9F4xCP2G2T8n/dqY/2RQ6DkU/0kgyp1bbw0/sxB+uiW0PtoGz9kCF4lnnbWNOoaaQtqFtAfpM6Q9SZ8l7UXam7Qv6WjScai/PxvpDs6v39UaeIebb8VRsuIoWXGUrDhKVhwlK46SFUfJiqNkxVGywteBpMNIR5OOQ/3DGQyrQL+pidMKaElaca2MVkGrolXXaml1tYZaU6251kZL0dK1HlofbYA2WBuhvaqN1yZp07RMbY62QFuirdTWaTnaNm23dkA7rB3XftDO6LoepTt6Hj2fnqAX0Uvq5fSKelW9hl5br6c30pvpLfV2eqreTe+p99UH6kP1UfoYfYI+WZ+uz9Tn6ov0Zfpqfb2+Sd+h79UP6kf0k/op/azBjBhDGLFGvJFoFDWSjfJGZaOaUdOoY9Q3GhuPG62NDkaa0d3oZfQ3BhkZxsvGWGOiMcWYYcwy5hmLjRXGWiPL2GLsNPYZh4xjxvfGaQYsgnHmsThWgCWx4qyMP7Pyvafb5MNQj7QjbU/agbRjrp7qRJpK2pk0LVcPppN2Je1G+hRpd9KnL7mX+5A+l6vH+5H2J32edADpC7ni4UXSQaQvkQ4mHUI6NFfMZJAOJx1JOipXLL1COjYcVzp7g3QC6ZukE0nfIp1E+jbpZNJ3SKeQTiWdRvou6XTS90hnkL5Pmkn6AelM0g9JZ5HOJp1D+hHpXNKPSeeRziddQLrQ15hmvlpUskXbLdpuLSL9hHQx6aekS0iXki4jXU66gnQl6SrS1aRrSNeRfk66nnQDaRZpNmkO6UbSTaSbSbeQbiXdRrqddAfpF6Q7SXeR7ibdQ7qX9EvSfaT7SQ+QfkV60FebyrepfJvKt6l8zyLlpHQWeA6pSyp8vTrjs/8DuJCe4Hic7H0NeFRJlWjVvXVv/97+/0un0+n8dzo9yGBExIgxZjAiEzEiImZiJjIZJsMgRsTIMshgFjEyMSKybESMkUVkecgisgyyyLK8bF6WZRlkGMyyiBkeYsRs5CGLMSavfm66q9PdIZDAAM7XX506qZw6VXXqVJ36vwACAPSgFdYC6en6p2tA4NNfrF8Kyp6tf+Z5sHDJMzX1YMnSp1csAyuAD6DZ76sIAN+Tcz+B4UfLSzH8WAWBAAwPAxFAIAAZIMyR/Q2w08T8jbi/IZCABQhz55cFgGV+xYcwjKHTfnr555aDac8/U78MFL3wdP3zYD6FNRQuoXD1C8+/8Dw4QuEJmp4V2ICdlskBnMAF3MADUoAXpOJcpuFwCTuST5HmAwIthlqSGtDhOAZgBAow4TA//qWDAMgAmSALZIMckAvyQBDkgxAoAGHwGJgC3gamgsfBNPB2UAjeAaaDd4IZ4F1gJng3ji/glGTqm3G51kEZmqALBmAQToUzYDEsg/PgQlgNl8DlsAGuhRtgC9wK2+AueBh2wW7YCwcEveARcoVCoUSYI1QIi4RaYZmwWtgvDIpINIohcbpYIVaLF8TL4jXxhjiIEDIiDwqgMJqF5qL5qBLVoXq0Cq1DTWgTakXtaDfajw6j46gLnUHdqAf1outoQBIkvWSTvFKmFJKmSTOlEmmOVCEtkmqkOqleWiWtk5qkTVKr1C7tlvZLh6XjUpd0RuqWeqRe6bo0IAuyXrbJXjlTDsnT5JlyiTxHrpAXyTVynVwvr5LXyU3yJrkVSxgCKG3Dksf+c2uwzHFNKJuU41hWOOQ7G2gINDRiyWH/rzcx/20kJq4rqY7VWeZZ5j+1SQ1fxP5++3Xm56xg/pW5QCeQ/5cAGas5fOESkLFywadtgGg9NBxQ/RnML1hOtUG2hWxzbctsLbb9trM0RHLsdpx3ys5CZw3727nWudd5waV3zWB/p21NO+M3+mf717K//bv9l9P96QvTN7G/04+k3wxMDdQFdtC/UYo2pTxlc0o3+8tr8y70bvdeZn+l+lJrUnel9rG/fLm+pb79vltMZpZzzN95QZVUFfVF91FPwLOU/e8dm2gYyqvNa8w7E5xH//L8Q8s/dPzDtf0l+5fsP7r/wo9Lfnz+wPYDN36y6iA4ePAflx6qOLTrlSmvHDhc99PAEfnI/CNnaKzM01Wnu19df6bmzJGfzz4LzpacPfDagtfaznnPnXjd9PqG89POX/zF4e6O/5x3QX/hxn/VXtRe7P5l5SXTpf5f1fU4evreWHLZdvkay9U/AZZjfT/1jZ8u+3TLYu3ifYtPPxN4pu2ZY7WW2pbafc8yKtG6wnrO5qK4YfXhF6e+eHVNz5fq1ha+VPxS8zr/uv4vz2JlnF8/v/9j+xbsp5r1brFGrBPrxVXiOrFJ3CS2iu3ibnG/eFg8LnaJZ8RusUfsFa+LA0hAemRDXpSJQmgamolK0BxUgRahmrtpL6x8K0OsfNqdzNdNVX2B6fCULuaHrrISOl3OJc7DLCy7SC11tXW7Taa4nFGUsSrjUMbNzMLMelZW+3XHVMcyxx6V7wCLm+dh/31S/2RdubG8n+VGZyQQQBRU/anM1/QzTZfWq/5h1e9U/XOqf1n1rzMfAdXXq75D9f2qH1TpS1T/tOpfVP1rqj8Qy0dW+com1fepfoj54g3176mqP0v156r+IpWfmo5crfrLVH+16jep/A6q/jHV71L9s6qv8hGvqr5afnFQTUdWfYvqe1U/W01H7Unk2ao/X/VrWL1syGR+SyXzCw8w/52r1HrzM3/ZSua/9yTz9bOYPzOg0m1ivm8980vWMP+JecwvU9MpB0xL9DuZb5it+lfY/+cfZH7RFqJDuAesYn6Hifnf2M/8p1YwS/mnJcwfNKr+Yeb/uZn5QzXMH66lPgR1zIfbmS+sZr64iPmI8YPSSubLB5ivma76x5mvZelDXS7z9VrV72W+YZD5xkPMV1R6UzXzzXOZb1HTs3Qz36qGWzuZbytV/SvMt29gvkPNrzPMfNcU1T/NfHc98z1q/BQX870e1T/B/NTlzPf5VP8W89PUcvqXMT/dq/o3mR84w/yMItXfx/zMOap/mflZe5mf3cD8HDVfuWp+cll9wTxWXzBI6kuPx0KLAWnJUHps5O/hbZG/Md3Q7/A4Blq/bv2OOmZ6K2SiIXogDVT/uXt02J8+Fx82uH5UmBFoBv/459L40IHzYHGC0A2JQm91JAr9n6FEoX/6bcLQbycK/eMvEoZaE4XeXJYwDyhR6I1ViUL/3/6EZducMA+hhHloSxT6h8SSPJxQDvMmLN9/TxQ6+MQE5CvgWYeI4TTckt83TOySIJmMn6KzKwjICJjZri+S/6Bvom9Tfz1qovM4L6Vh1nlWJC4eo5iCtoCtnOklnhWV4RSQ8JzwHE7weQH3bkK98DWgsQatZXjmNDqtv+LSQugraAP6KvpGHNUqjkpCX0Mb0cuoGX0nJk1Z+JXwf3GavxZ+DSThN8I1HNInmoFeXC4uB2HrB61fAKTv8gHS82UDYq+IpRugaUF9JU3jb9BWzIvMFQFgFh2oMJonNrJZRmaMWDrNeEj+DZxnHfoOzhEZxRjRs2gp+ixqQF/EI8e/QqvRi2gtzT2Rvh+QkYFD5fs5IkG0BH0JNZJcoK9jCg3ajn6Ks1CJ8+Q3/NRwAqQbOgz/B+QbTmIr/ZjyutINymwGmwnM5XI1k/JbS/5Cz+FR6/PoBbQMj11XoM+jlegLaA1O4yU8jv1rw2Gb2WYZNx2pew9X90VRq4AG0J/QIJ71/af1J9ZD1gvWX1p74ujfE6HPRf+F3lDjyJJGKpQ2SF/F88iN0suEh3RB+p3UJw0Z32f8uPGvjf9mPGn6uXmm+d3m91LuP7X+nKVgAzbR9l7MrwkQ29iCa9KI9SSAZ+NhPPOegbWzFMwB88ACQOp0C83HBOBwD2tRqA19H+1AP0D/C+01nDK8ajhjOGv4hc2g1hspqxzRmHHlDbZQWqqB0BPF1ZAqCltGh8TgW8BXbpu3lQnztmnsvAm5NJUbiSH7L0+TAA+DztvkTSCan6S9jTOf8DhN6+5gmJNk8lZL8rkcfXli+RSOUMmMB/bFhXDSvtf5FCsI7bhg4+gQNed9E8znLkDmontxLs1JclkDlgCy/gjBOhrjAG2nc1Ucz1yGvbRmTTimGgLDQ2SE28m1tc4ohMUqPYH1NNyM/g79PdbZfejH+krDEcM/GY4afmY4Zvhnw3HDvxhO0Ja1KaZlidS6RHu+98ZYZCj9bRxFcSyFbImjeF8sBToaR1EyiuJncRTvH0Xxz3EUpaMojkcoyKw+k9J8PtJeR+yUHn03YqfSDK8YXomzVq+BxwyvG34F3ml4A1uuEmq5ZlPLNYemQGYYLswpG4QSpkHgdtXOfl21s3pqZw2TEF/AJZzB2eIXI5o5tvZCtB7HFnHqhdTquuLiJxsZQPTNO7bvd5/LpoiMSC2y9Ygn4nQy+nc89ew47RuL+gNxmjgWdVmcVo5F/cE4DeWpyagqyMloTsyod3QbHE39oWTUtLWNpp6blPpnCaifTEr9zwmoy5NSH0+gCV8atyZ8ZUKxN0wo9lfV2NMSxh6rpRAtmKpqwXQab/VtU/v6mBR3wVF5fdI5nr8NR0D5CbhPY2uGn7mLmcb9SAGilyeR19eoLImt8WAsiPWliPKrim0J1u0J20hs3xHP5VOjuHz3rrhUj+Lyvbvi8vQoLr235SJgLmHKR4hwqUnWVySRUGIun07KJbGEEnNZnJRLYgkl5vJMUi6JJURsMOEyHbAZJ+NSextpjpZQYi7PjoPLd2/LZck4uHzvtlyeGweX3hguSOVSTPmwPrfuNlxGSygxl+fviMt3k3BZekdcvpeEywt3xKWXtsYAYCPGXMD2jz48xngoth2PjjlvnK0uPuZHxtnS4mNWjLN1xcf86DhblIBjhmhcqMacP8ZYauyYHxtn+4uPuWCcbS4+5sfH2c7iYy4cZ9sSacxCEB33f+L22kfHnfExF42zJcbH/OQ4W198zMpxtrj4mE+Nq5WNrDPsuc26DVtNYusw8fiN0eHqmhJHE1lnSL6+ZB61wklWN/m1TTMga9lk/kvmDKRNE90jMiL2lfTfZJ0XgBWArEGT1VUA1mO3ETs29wf3BkIXuIhhJpXgdGwHSvB8qRy3xUV4DFKL+8960ADWgEYs6xawBWwD7WAX2AsOgMPgGOgAJ7F03pBxHwA7UA3GPyv/D4avaR6n4ZCESD0EZ1BjG6EXXiP/FV+k4TtICPLR8L8nIZjbwgjPbBQiUKrDEKCnKcT/FfaRcPiPNOTPBMLXWSypmNBIZB/YC74MTgu/EvqEfuEPwi3hj8KQKIoGURFNolm0iE7RI6aIfjFLLBAfE6eIbxMfF8meA4K98LewD96kp3nI6gWxBX7s8Cxx6Co5s8Dg8O8R2Q8FSE4wd1kDxjt3+dqEYm+cUOyXJxS7eUKxvzGh2N/BtV0L8fwdLsX6m4nnBXOx5VqIR/KL8ShkOViJ50jrwAbQDDaDVtAGduK+Yj84BI6CE6ALnAbnwAXQA66CPnADDJBlMWjEvHy0zb8xfIpo4/DviQ6rIRiHH+P++1kOp//F9AR/V1wstsLeQXEKBTBUGUkLkFg8jiGmAddorGYa61mK76U4pYQzuZC9MXn7/QjEMnmX8ZZxwDhoHFKAIiiiIimyolP0ikExKh7Fq/gUvxJQMpUsJUfJVfKVkFKghJUyZY5SocxX2pSdyg+IrAUriF3b7wWngABl2vcmWzVdhfux9bgP2wS2gu1gB9gN9oGD4AhuO6QvhH/uJnBc+PJoiIobuRBjlDKG3piED4PtUfwu57eE/zTsZiTs3WGC3n2y+u3obpyHhiwH/DpkdK7sxb05/38BaODv4e+xMcXKgEOeRX9N9zu/CTLQt3GJMg2HDYdBFrVZ2THcXNj34dI1TIDf3afuwf2wH7fuVdj63K/07ya3ENtEAvuwbtjG3FEYaRtJtfrPuzjdpvjgXhpydrTOq+HGJBw4zpO8Y2sDdzOaAbg3AFhKAPcIAPcJAOwbt+b7J6UFRffynwRaetZVz9aN8E8AJvwTgQX/EC6hDdOS09wycOOfFqTgnw6k4p8epOGfAaTjnxFk4J8CsvDPBHLwzwzy8M8C8vHPCgrwzwYewz87eBv+OcDj+OcEb8c/F3gH/rmxnszAej4T/1LwOKwIt91Z+JeKZ6LFuOWV4F8a1qNSLIMP4F86+CD+BcCH8C8Dl+NJ3Nd/GP+y8KzvI7h0H8W/HDwz+hjWwo/jXx6ePXwCBPF4/pM4R0/hXwh8Cv8KwNP4Fwafxr/HwDP4NwU8i39vA8/h31Q8D38e5/QF/JsGPoN/bwefxb9C8Dv8ewf4b/ybDn6Pf+/U/JXmr8AMzYuaF8G7NF/SfAnM1Pyt5m/BuzW/0/wOFBlvKVbwHmW6UgQ+rixWngFVylrly6BaaVaawWKlVdkFnlEOKAfACuWgchB8XjmkHAIrlZ8qPwVfUP5J+SfQoPxM+Rn4otKldIFVyknl38FfKf+h/Ad4UXlVeRWssfzAmkdWe+E+uAbbpSO4RtwTGQdAG/RAP8yGITgVTodFsASWwXI4Hy6C1XjMsRS3qEraxlbS1sXjZRRfyIWXUryRa5M8XhnX2ldyNE2j+QzLNCRwv/GhLhC1o3uieeZpgDuhrVyvnrdpipyo+Qaxn/RcDSLnfnD4y9xIm+3JZI/RgrvxHARC0l4dWI+njmvmAkH/MOlp/jBETtxeoacMr9DTSWCInu0d/iSGrwyTc5lXKA0YWh6Fg3spLlBKC/dfRrmHQmptycgOczhGIZnXOtB5SS8pkk2ySymST/qutFP6oayRrbJDdssBOVvOk4OWZsvXqQTHok2VfXJaTAw3ICvXZGWUrLwRywgA0Z/V2JE96w3YNWO3GbtW7Nqw24kdqcH92B3C7ih25AYLqeHT2J3D7gJ2eCYGBgA5e9WP+xUCCf4vZJcb/5fsfv8e/wXBtyneg3uiaC2x+w2vxdabesKFr0k/w+loNb6eWVoU4hnZKYAELa5z021npWfAeTyvvYxHqf3gJhiEAtRCE3RALwzAXBiG0+AMOAuWwjlwHlwAK2ENXAKXwRVwFVwL18ONcBPcCrfDHXA37k8O4t4EDq+gWn492hLUMztx4UJNkvCZScKXJg7n+attjIazczrx9BMJ5/kLpWPS13H0dAQt1nLh3nGGC7Tdj9q5sUCLCMhqikJ7keW4H+F7kS/TMTceidFV6yJso0uwT1ocORNITruTVa5q7JOZ/1L8f3K+ogGwGWWynuSuoLBZwGkKrVgXy+JmN8dBJ54bncV91CVwBc/hroNbYAgiqIcW6II+mAmDcAoshDNhMZwN58IKuBBWwcWwDi6HK+FquA5ugM1wM2yFbXAn3AP3w0PwKDwBu+BpeA5egD3wKuyDN+CAAARZMAo2wSP4hWwhJEwVpgtFAEqfk57Dcv48uWmAetD/wXih+PlYnKfhcTFdWoUpa9EbGB6TmjC8gg5iuIqsv6CghPtI9Lr0FI71uIR7SsFBQoSvSLjPkxBdo8klIfK/EFyqkmoi6f5MskTwPxFc3Ef5H6SUNA9Sq/Q8gJqPEMj4M4i2Us6/FtfjWO8Rv4phpvhZDOdKuzGUxJcwfEF6H4YnxJdJuIg5w0bxMoabxUs0/CjGV0o/JSf+xc9Rms+NSEOsE6di+EmxA6fybXEdKZH4b5h+Ifp1RDI/EX9GcihiGyL+jbgfw1+Ir2D4EXFzhA8PWSyuFniolpdAAev8p7DeAs2/arqAoPmlpgfIdLykxzP0x0G28qRSDmYpH1E+CoqVdco68H7l+8r3Qanyd8pO8ISyC4+dPkDmH4IERuboDmkxOdMlNGN4HGvpvHvdQ8LjsBOegmdhN7wEr8Br8Dq8BYcEJOgFi+ASfEKmEBSmCIXCTKFYmC3MFSqEhUKVsFioE5YLK+ndDHYi8cpE4fDOyeETA8eftySUt8nVtDh8wtKYNDksHg3jObMQFfbExdpCe/w7OY2U4KTrw6XNwwuoLGa8BR9J+BemzW/1zW/1zY+ONvNn8tVT2Wx/hoazEjHp8Gf4Wbgaa2B0LJVmWlzcFo6Sv1URjv6XhQgLOT4Do2FM3BaOnr8Hwe9ZLxxNmQzyeUgqjS3jlUNM2blS36a8gN4u6eTgAIExtyfCo3niud1X6Fn6r9CQEXjn2rzyYdZmNhd/Cz6i8M61uSmhNp94OLRZbfE7RvcZariHg8fjwvkel/WCWopfiutFzsVx2BsXwkGBrsgnu6nG98Qq/cIofQK8KQ5fmRiOSxpzbi+HGAnwZU9Sar68YDZZjYdkVYvkpDOC34iLy0vGw1GO0HfesTaPeW/v4dJssZDmmd1co2u+opELWcnpEw0RBYrTVWO2Jitsj+qNGIhCXNYIpcrzSDQVhrO7ZkJ3NC1E+xj1Vh3dLxYPxsFVUZzxYTiiMyGxneMQiP5XClL8LPffeDgOaTD9i8jBnFwOMWXnSj12edVU+jieR7i8lXKQHzXF5ZZyu3PNJqvZj4Zm13I1sX+0TiTQ2lmcNEu5emLSr41yUDV7JReL0xiGs7GgypmeIEVTKN7Iwatx8GAUZ3yYfqA1HE0cB2k2pfHG/ZeH45FG0zjkUBFXdq7UY5eXpaKm2M3Fqo3TbP72b1xuKbe/ZM0+yEnWyEmnkZPa9jjpH4nKl++nVW7tnGafJr2auJWrraXRemJ3hUV6fke8zmke61m7oiHJIOOJqims43SF5WSQhtDbzNJiTvvPJoHjkcbpccihnaPcOrrUY5dXbRuNHLfaaN54zY5JMS63lNtkavbIyyXkfh57GewldTQuAP2oc2Rfx5y+gb4JCtC30LfAFNSKub6N7oE+bthr2Aum0ZNlb6dnrAopl7+P3JMmdy0q6WmGyUth8nJIzm2QO2hVYDu4+EDlcfLKGKA1jUA1aAOXYOCRKuXkSGmklz//kPTyQrQ/Uu2tkbOctG9SR+Y0RKVnc0s6NxuZ0ZFTLLzVZeuB6tyvL0rJ5mDMcrBz7/yLFqxfZqNQzg7Hwkqun22K4jFjgUIO50fmXdx/4+E4pBEzMk8gB46eKztf6rHLq6ZymuO5PZqiOh/ewaW1MHFu6ajtTnv5uz3vnej86+Sd9yanrzNxStFbUl+IrF3e+WtOd/o2BKKvSVXQu0ieSUl/ov3UneVfAuR22HywGZylvfeDUIL7KwEZa08Qa+kWcA666FjiUZDB/ZThiFW7/JBYNdaTHuH6R/7VJ349kuuLYyibOAsUGEfcuFgx/+2L9Mixc1geNo6OG/P2Uzx+cDTO8sDmNDw+Lmk03V4OMf+NK/XY5cWpDFD6TkofgWLF8PWE0gioaXVGYvVF4J1atQf1RsekQHGniGceIrkJXPMgtkZhnbBBaBY2C61Cm7BT2CPsFw4JR4UTQpdwWjgnXBB6hKtCn3BDGMCGXsYjGChmC/9IoLgEw6fEf8Jwl5iH6/5/KOwjULSKbox3iLkYfxuFlXj2DOFK8QcYfp+eS1yFtQii7+F5Np4pE4jM4tdwLDM5zSimk5OWqBGRM5/flN6LR4gfRgLGn6SnLlMofJ2Gj5z2JHCLNAuHMNwtTaOnPefS056zIxwC6ItkvImexPi7EEn9e1I5PclJKL9GcGm1VAagplzCNNIL0gfo+c8F9Kwp4dwt4v+Kf0PlYBc/iuEnpRfJOJGUSFwtSYCc6qwG5EToU2SFm5y0xKXeAch5zm9j/FnpS5jnZ8XZNGT2iDTEDRTWqac93wnIac/tGKaKzSNSEn8i4jm29EPxeyQP4nfIqJmeO6WnPVnexoZqPuOgms84qOYtGayN1iAP0VX633YBl0X6NMX3kHD4rPgjFRfwiPE0OdcP3w+fwP/5APwAQPBD8ENAguXww0CGH4EfAVr4cfhxoIOfhJ/EVvUp+BQw4DbxHDDC1fBFYIJfgl8CFnoq1UpPpRYo71FKwBNKqfIh8CHlSeVj4KPKCuXzoFJpVBpBlfKy8jL4lPJD5YegWjmqHAVPkxEG7IzsTaaQHMNDsBbLS4/bbcHE7u0mu68Dorcyxg8PAjh4ZagdRO94JKNsHx+3yC2RZDRjpzIxKABFAIIIyGlxPUB4rGQBOsEupOHwLGyTPMLbhLcBn/C48HaQJrxTmAECwnuEYpApvF8oBblyv9wPgvIt+RbIlwfkARC6BxwLsFaQvUjyvuJh7I5h14HdSezISul57C5idxm7Xuz6sbuJ3SAxkNjhOSh5UxHiuTTEo3uILSfENp3seEI8Y4N4xgbxjA3iGRvZL4XYvkFs3yC2bxDbN4jtG8T2DWL7BrF9g9i+QWzfILZvENs3iO0bxPaNzDnh7ljbM/xriqdQaB7rhuLgpdtYMtyTDt+8G/s3/HuSLo7LUndEwncmpZ+YxR39bjKZ6Y7s1d75q8IO+gbAnHhOd3Zb947TddG3FefSV58nlPI9zmciOZP52pZJlB/P782QC59+kvJqfze55Y3we5PKG0k/WXn7Jrm8fW9yefsAudXpxzFX01fRyesR5IUYPJoUaobJ9zrI6+gCMKFTCPf4klbyAYP0mPQYCEibpK0gQ/q21AaC0velHWAKuRcJpsqCbAaFslV+DJQYFxk/hcccbyhvgGdMXaYuUGv+k/lP4FnLVy1fxzOYz+CiH8XuBHZd2JER0TnsLmDXgx2eqUE8T4M38LhkANBtHgGPVAQj9vG8SPBg3I/9bOxC2E3FbjoOK8KuBONl2JVjNx+7RdjhkalQi/2l2NVjvAH7a7DDs1UyWxRasNuC3Tbs2rHbhR22gQK2gQK2gcIxMrbHPraBAraBwnn8N7aBAraBQi/GsQ0UsLUQsA0k66IitoGiCY/5sA0UsQ0ks0c8JwAitoEitoEitoFkH1ksxTTYBorYBooL2EqyiG0gnWlgGyhiG0jOfYhr8d/kvtVG7LANJDt1ZJSMx9dAxHM8cR92eGwj4vmveBw7MpM9xXbrxG7ssLUTr2B3Dbvr2N3CbggAhLDTY2fBzkU+M4VdJnZB7KZgV4jdTOyKsZtN5+8QVRBNlcMU0hcvJHrXFP2J4m24xtLI93CG2xD5OsqfEHkLcUBqwOFIItaQ3WIdJjg00VjsRuuAtJGEUBp2u3UYke8F/Qsib2eekdZh+Cv65SDu1itOl35TiMZSIeoZgeqdWJWGhtP7scCPnsGwCM2IwCCHOzgIVDiFgyzkGRC5ZxsTPiNqnRmufk2I3sIlL8qMYc1fG/O/dw0T3PWNh/6YkMdobtlN4A9NOA+EWwN4LlKn/bSmGM7gHzh9YCFn5LyIDFm9J4PczWShVsDtTjiKe7PiyX5nANbDBrgGNsIm2AK3wG2wHe6Ce+EBeBgegx3wJDwDz8OL8DLshf3wJhwEcOh7mqVY+h/Q/BXVTqwBQ+/SuCm+mbafj1H8bylsHIFDgyQWxv+TwldG4mL4OgdpuFzCcegdDeWfU5hFIZE+0Ojof7dylIzPRorTmZFM05Xp6zLSG9GcqGkxvIXWzb4olC6MDuHD4/8rzY4LoTNSiX6bTK6PQuloFMqIQtftIc45tl64LnA/JyABAaeQJ+QDlxAWpuAZ71RsM3xCIbYaacJMbDcCwvuE94Es4QnhCZAtPCl8AuSInxZrwTS5T/5vMF3+vfw/YIb8R/mP9IX3e8MX97JvwgwKQGw94EHssPUgp0dhJ3ansMPWA2LrQU6sQmw9ILYeEFsPiK0HKz122HrgGScQsPUQsPUQsPUQsPXAsgACth7kNKCAyyXMxm4udhXYLcSuCrvF2NVhtxy7lditjnvPTSYthug+e9tt+PcSnfGR76zhELKWaiYQ0x+gOAk/xb7Sxr7RxvXbRTTczL7RxiD7vhsP0TYuLoVqilNGaIavqf/dF6ExsxAuXbMKLSOlwOHVBAq+yYTsu3PxbY7lRM3P4cQ0CSDOp1QkmYCA26YRzJto/ycIglYwCQ7BKwSEXNw+pgkzhFlCqTBHmCcsECqFGmGJsExYIawS1grrhY3CJmGrsF3YIewW9gkHhSPCcaFTOCWcFbqFS8IV4ZpwXbglDIlI1IsW0SX6xEwxKE4RC8WZYrE4W5wrVogLxSpxsVgnLhdXiqvFdeIGsVncLLaKbeJOcY+4XzwkHhVPiF3iafGceEHsEa+KfeINcQDhsiMjsiEP8qNsFEJT0XRUhEpQGSpH89EiVI1q0VJUjxrQGtSImlAL2oK2oXa0C+1FB9BhdAx1oJPoDDqPLqLLqBf1o5uISH8L2WWALfSbKOvefHxYJvjwtgclP0nx3feA5x3WxT2X1QOgGw+NPtxhnnmaCZTxTvf1Rr7pRWb25KsyZIzL1hJGjYjVXrbyrV52MnpZdupJvVvBzjXR17DgagrZLRpbFGc3cNSzZPQuBn+Dkr7KFEOj8mc3jkxRSvUeBztPxW530tOusIq++lkajSXc4niujc621HtBYS4n7GzbZo4nyzk9YcV2odXTVpQzW6OOuWfFn5FjJ/3Z2TB6oly9w7KZyxs7G8b21WvHxGsoXjE6nM+nGs6dIuPP2qmnjdkNkUoufFa0BslaROTsHD1tzM6esfPHMfkfDz5JuqFqyJm70wcO53Qgab0nqeuJ1G9MWXg58Pnk0lLL2BdXLh7ny8Xj45Atl7c77WVNkRepGhK8SUXqg8igGJDbcuTLPeQFffLSe6K32SD3NttE1zgSQTHy7uvIi8rsdNfKe3xGkJxQrATk9qkrLt37eU7rbs42kvPqJ0H0bOPk5fxBLvlk6cnEyvggac5ES/Io6dJEZTE52jWyL/ig6MhIfh6dmh4p0aTVF93XnDxufXi0MU8gO039eO7ysfu/pn63sx1Sbs3CxFAmu4xh+Yd4NL2RhvxKJivjF2Syy9svt5LxnbyEwhYOP47hMN2j6JSrMPwtpR9QeZ6jkJ55UlfY6W4G2zGT/wiia9xxeVNXum9EoURX52m6QKI32sibgiOr6owD3SUbWR+/Ef0vW2cX6Vu5kIaLGgKFPorT3Tw8doR0x3QMCKsoLKYaNEBxugcA6Vu8As05pLuCgo3CUi4WgzSf8FASSPLWIHyQynAthVOpnPdGpMpkPqAh+fkDC4nWIOjUdBCoraWwkkJSuh9pybmrFHQKvU73sXVALxkkIzBKJskKTJJD8gCb5JVSgZvub6fQ/W2v9G1pO8iQ2qQ2kEN3uXOlH0i7QFAWZBmEZK1sBm+TbbIdvFN2yi7wLtkvp4N3yxlyFniPnCPngmI5P7IT/gG6E/4k3QkvpzvhH7Z81fIy/Z6U957nzCN7cc5I/mbR/BXT/L2f5u8Jmr85NH/zaP4+QvNXQfP3UTJufsj3FICAx/fCBuyascMzI6EVuzbsdmK3h2o/EA5hdxS7E9h1YYfnnAKeJwkXsOvB7iptMUDA8y5hgB26EmXsjNjhOY6I7Y6I5/RiNnYh7KZiNx27IuxKsCvDrhy7+dgtwq4aOzx7FulO3wR20/l9dH4HPdne+Zj75TE75ZO0R55od5zfF7/Njvi9hnSf+453uO/pfrbmiKYZd9Jn6OrgbV4YFkqEMqFcmC8sEqqFWmGpUC80CGuERqFJaBG2CNuEdmGXsFc4IBwWjgkdwknhjHBeuChcFnqFfuGmMCgKolY0iQ7RKwbEXDEsThNniLPEUnGOOE9cIFaKNeIScZm4QlwlrhXXixvFTeJWcbu4Q9wt7hMPikfE42KneEo8K3aLl8Qr4jXxunhLHEII6ZEFuZAPZaIgmoIK0UxUjGajuagCLURVaDGqwzP4lXjmvg5tQM1oMx5FtaGdaA/ajw6ho+gE6kKn0Tl0AfWgq6gP3UADEpBkySjZJI/kl7KlkDRVmi4VSSVSmVQuzZcWSdVSrbRUqpcapDVSo9QktUhbpG1Su7RL2isdkA5Lx6QO6aR0RjovXZQuS71Sv3RTGsR9plY2yQ7ZKwfkXDksT5NnyLPkUnmOPE9eIFfKNfISeZm8Ql4lr5XXyxvlTfJWebu8Q94t75MPykfk43KnfEo+K3fLl+Qr8jX5unxLHtIgjV5j0bg0Pk2mJqiZoinUzNQUa2Zr5moqNAs1VZrFmjrNcs1KzWowcgeT3dzkX5NjaybsjTX2TtB8qn1XKA33Rg1b1UkQ6xKFxTTWlmi4us7ZkDiWur50ieOzg4vFvz53gUI9l//VUUo1b9wKp3ovhy9pE0fJ4pLbLiMvnrdHU1e/3r6bvjyzksshW4/KjfKMSR3RkOBoGlUmdA12uISmxVYjSzlp0LecYt7kYO8dLOekdIP7L+NPX3Fia2tqCLeax5d3PCHkfFmkjpLRxJVdpWF5YGut7Vw4e5HBOLpGYkrB1Y4acm506iwcbaLh7I2WWVGY4HYXL5+7C7mfLYXTW3qLKnG7ME9eu+BbwSidj5aCpc6tGI+t4fdOn+MllqAniSt7ghzG1Wm8DBOExMkwQchdaUJcSe90pSbRV7ANmM8U/D+yGjATO1JyMisjc2oyQyFzGPLFazKnq5uMcc1bI4i/pBGEujt3OqrR8f202s580TbN99PxtkWNtYtrnVVcyzgebcHxsdR9P64lqb0L3+PG95Qs/1yPFWN/aIi698iXtCJaChY3fgQR03PX01eeZnE5ZDtm3F3imBcU+f6Vv29MZRI/goixq3TvK/69M/XFvq3RnKtvh3Dv7am9Mv8m39XR5R1XyB6ujpLQxJddpWGvP9HdRfZilRrOXnDi3hSMeWmK46b+l3vVLyZ1Gi4tovz3UShHYcy7UvHyubuQ+9lS+JdIqcVO2C7Mk9guuFYwSuejpeB0fjwafu/0OV5iCaQaX/b4HMbV6XhGEPEyTBByV5oQV9KHcgQhI+kwHi7U4BFEFigDTeAk6IMWOA3OhyvhVngYXhBMePxQIazAY4RDQjceB/jFYmzrG8Wd2J73Yrs9C1Vj27wDdaCr2NYupV9w9NC3a0a+EgelTrJCLh1lWkROfqMZ5FtwQp98iGgI+y4cYl+H25aIg/Yq+a82QG7/yi0SyXkLwVEP5Tx7WCa1ScLp9+UELEsLcJHX28TlZNWN1Ra4Ip8kdDiNRBRFEYqq4Z6kPNZpfLfhwSjG4nGF4PDS0OAY+SAUVUkoojyOJ0mF44EpRGACjsj32iGqlrZguC1aB6JxVB0kS7WTrNaPmSqjuH3pW4azb5Pz8GgKsgswqvTbElLElp6nCJDcjckjpFIk5SEc0ZSOzUPoUCmS50Mt7dBWrrQJpI5mcBRVY9RLEnncsTYckYJ3oA1XyE7NbVI9flttmAwe428Lt++fFkf6JyqN8fRPcotswPAG+bow2kl6OElPcNFFdgixdSU7ewPiWTpD3jgODhujHMgqfRwHCLKMzxqfN/678ZTxP4ynja8azxh/bjxrCpo/Yq4wf9Q83/xx80LzJ8yLzJ80V5qfMldZvmhZZW22nrL+h/W09VWbzqa3BWzltg9jiZnv4u6nG5TIfvkx8EG6r/QJuq/0KbqvVE33lZ6mN0BrwHNYpDuxw+NTuB+QPcBkN0IhdyOUWl31RigU8DiRuxEKBD8Oy8YueiMUCEXYsRuhkLsRCoVq7EdvhIJx3AiFY9wIJe8rAu5GKFBvhMJRN0JBghuhkLsRCkU81lFvhEJxAfbZjVAoLsF+9EYoFNdifz127EYoVG+EglE3QgF3IxSIp7Ab341QcgoTInab6q2bng/vTc+H9Banvkhvwmq4kKxf3el7TaJN9OCxaLYYEqeK08UisUQsE8vF+eIisVqsFZeK9WKDuAaPU5vEFnGLuE1sF3eJe8UD4mHxmNghnhTPiOfFi+JlsVfsF2+Kg0hAWmRCDuRFAZSLwmgamoHHtqVoDpqHFqBKVIOWoGVoBVpFv668EW1CW/F4fwfajfahg+gIOo46cT96FnWjS+gKuoauo1toSEKSXrJILsknZUpBaYpUKM2UiqXZ0lypQlooVUmLpTppubRSWi2tkzZIzdJmqVVqw33tHmm/dEg6Kp2QuqTT0jnpgtQjXZX6pBvSgAxkWTbKNtmDe+BsOSRPlafLRXKJXCaXy/PlRXK1XCsvlevlBnmN3Cg3YcuyRd4mt8u75L3yAfmwfEzukE/KZ+Tz8kX5stwr98s35UGNoNFqTBqHxqsJaHI1Yc00zQzNLE2pZo5mnmaBplJTo1miWaZZoVmlWatZr9mo2aTZqtmu2aHZrdmnOag5ojmu6dSc0pzVdGsuaa5ormmua25phrRIq9datC6tT5upDWqnaAu1M7XF2tnaudoK7UJtlXaxtk67XLtSu1q7TrtB26zdrG3Vtml3avdo92sPaY9qT2i7tKe157QXtD3aq9o+7Q3tgA7oZJ1RZ9N5dH5dti6km6qbrivSlejKdOW6+bpFumpdrW6prl7XoFuja9Q16Vp0W3TbdO26Xbq9ugO6w7pjug7dSd0Z3XndRd1lXa+uX3dTNxhZSS5m41wK6RpTzNea6Bo4e2NWPRO+kUK2QkRXN9QvfLA9BfbFL0cSPux2AFv/p/t0uDchsG50WowzC0/Kh99N4OKq8+FpHP+5XEkPRPsT9g0cPlyNdS2xBFgsfpUwRm7HOTkwbkEuLi3LEB2//Xkzl895KmdzpLx7uXLRXRJ64ntkl7OTK6mDC6d7AWwVAM8jRtMzad+MxmJfGhyiKyx/pjcg+B0NenZ8ZJWB5aSf4iiaVsxKB1f76voLnyu2i3SJC+fqKGZ1kpPeHYf7otqihreNRZ9Mnio9y209V95u7r9MVrQtxOxGFUdrLUYOnZx8+HUxU1Ta8bs26r4ne0s5QGlWRlOP2fdpiUo1qfwnK3zC/QYAIKrnE+83ONmq7Zq1o+T9g/k+9A/x/UBsewfjbO/jbtdvVvtNVi9J9SGJPJOWK5m+jaO++PBk9ZW0HifL3iWW252unyb/mj27G0RWTwWsOYJ6N2hk9RSqq6cCIC8ArgQiWI3dOuzu1d0gJhGBrriQsM+Cke95QrRdXQn+uloSPS2J4baxMDT0cG9LjbxUHs/9Dl+MinAdO+1X70naI1zJyWLPaI6GkzFpzhmV5p2/fTa27D30vgF5sWvtBNKZ7Fx56bvq5Vhnd6sv/t6PfE12KSavBnmNHamxignV2ETbzZunN3wuonqy7j7qyURl9/BoN59rH33pfx5YQ+/JXHqg8333dTO5bfbVB6LNjs7Fm9NmX30o22x8rh+GNvvqX0SbfTVmDFc2sZYVN+5quJ+6GUk92kZ3Pbi1hXMLrQPWDqCxhYERfOSts4vk7KJmnWaDplmzWdOqadPs1OzR7Ncc0hzVnNB0aU5rzmkuaHo0VzV9mhuaAS3Qylqj1qb1aP3abG1IO1U7XVukLdGWacu187WLtNXaWu1Sbb22QbtG26ht0rZot2i3adu1u7R7tQe0h7XHtB3ak9oz2vPai9rL2l5tv/amdlAn6LQ6k86h8+oCulxdWDdNN0M3S1eqm6Obp1ugq9TV6JbolulW6Fbp1urW6zbqNum26rbrduh26/bpDuqO6I7rOnWndGd13bpLuiu6a7rrulu6IT3S6/UWvUvv02fqg/op+kL9TH2xfrZ+rr5Cv1BfpV+sr9Mv16/Ur9av02/QN+s361v1bfqd+j36/fpD+qP6E/ou/Wn9Of0FfY/+qr5Pf0M/YAAG2WA02Aweg9+QbQgZphqmG4oMJYYyQ7lhvmGRodpQa1hqqDc0GNYYGg1NhhbDFsM2Q7thl2Gv4QDWxmN4xnzScMZw3nDRcNnQa+g33DQMGgWj1mgyOoxeY8CYawwbpxlnGGcZS41zjPOMC4yVxhrjEuMy4wrjKuNa43rjRuMm41bjduMO427jPuNB4xHjcWOn8ZTxrLHbeMl4xXjNeN14yzikIEWvWBSX4lMylaAyRSlUZirFymxlrlKhLFSqlMVKnbJcWamsVtYpG5RmZbPSqrQpO5U9yn7lkHJUOaF0KaeVc8oFpUe5qvQpN5QBEzDJJqPJZvKY/KZsU8g01TTdVGQqMZWZyk3zTYtM1aZa01JTvanBtMbUaGoytZi2mLaZ2k27THtNB0yHTcdMHaaTpjOm86aLpsumXlO/6aZp0CyYtWaT2WH2mgPmXHPYPM08wzzLXGqeY55nXmCuNNeYl5iXmVeYV5nXmtebN5o3mbeat5t3mHeb95kPmo+Yj5s7zafMZ83d5kvmK+Zr5uvmW+YhC7LoLRaLy+KzZFqClimWQstMS7FltmWupcKy0FJlWWypsyy3rLSstqyzbLA0WzZbWi1tlp2WPZb9lkOWo5YTli7Lacs5ywVLj+Wqpc9ywzJgBVbZarTarB6r35ptDVmnWqdbi6wl1jJruXW+dZG12lprXWqttzZY11gbrU3WFusW6zZru3WXda+V7EfSdS71m+TsfDw745bLrbnE3WRg5/j483HqaiyjZzzZqzF9HL6USyXMUfIn9cOJoUrJbnd0c/jCJJQsn4G4fMZT8t9j579dn4zyRmKau0z9XuQznmcyKTEZHoni8bWgrkXeiNYmf4dneBvl5o/yVE9fNkZxdgYzQeqXuHxSXH17aCIaEk9ZlYTyHKef3FcPk8qzcLy1qfIcW/LcXSYVH1uTa8etSxWTqnXjplS/4L4iirOvfcVQsjtLudESxXx7Mr4PYWdpr3J4RZJ83gNK9ST4VRXXRPq9lgmkPm5dYqmze3R8TuKlpN6483KyHbNE7AvSKs/4OuJ4qt9zTsKT9Qwqn8GoPjMpJegZmrgSNXElSpbPuRz/riSUTVyJmsi3VZJKieqkNA/oR+qI8Y8p0TbCgddk9Z7BiJS2JNJ5aV603ifO8y/aws6J6hvDVVh1X1J/U+3mhKzhJNm4e2K5Hg17FKTfbZpN2/IuVYsGRiTAdlVVniM3SzojKR5XvyMZoWQjanXXdgelHLEsnSOtWN0B7YzjuVWVfJTnFo4np3X81zaFI+T7lQm0bvw6Pw7K4RlUJsl1np68pO/ujp+yTpV2Z6ReKM7iMsnE7CIf5+S5N7HkYyi3jlVH7OQBTitam5fUb33G1rsAtGgbwvKle9KQ7kmn0z3pAN2TDtE96Sl0T/qDdE/6SRzfjZZw3/z8DKpHn4v77mcj+mv0LfXbn24AuB1pqO5Ik9cqZUBOx24ACDRjfzMQQSvOUxvGd2K3B8cjbzmRF5WOAgmcwH4XdqexIy9SkReh6JlZWqo3H/KrkUU0jLyJxfZ1zaO+kkokxX8fVQB69N3IuYA0wyuGV+JOB7wGHjO8bvgVeKfhDVwrJbRWZtNamTNq7XJpTOp3ur53f/IaXencNoHcPphlY/UwC5TeoRaMf79+mfoN+HtVx3eyR78d7HiAanC8503utIUm2iO4t+0s8b7Ag9Ra4mVytzqf6GzB/dHxxDvzD6JOx+9TT0Tao3eF75+04/dUH1RpvzpK2kvvUNp3Wo7JtKvLJtRTPJhl4zXm5AOkMW9ePRfHtdvJzu34RwLLJ9iO73/Oo+cj2sApcPah1ajxnkW81z1YohHLg9UP8Tl8NHqT+BKVqF+6v/e9AoHfV1OIbVH16lcqH6iaT5hjP9Dg/5KTee3qq98PsSYkLOH9tRSJxtMPpmVIfLr1UbAE8bOp+1n7o8f3D27tx5+TfFRqn5SM3S6xqeuT0XqH6FsAeitTMKW3BhjFaW/dpL7zm9R6Qa/Vm/QOvVcf0Ofqw/pp+hn6WfpS/Rz9PP0CPLKv0S/RL9Ov0K/Sr9Wv12/Ub9Jv1W/X79Dv1u/TH9Qf0R/Xd+pP6c/qu/WX9Ff01/TX9bf0QwZk0BssBpfBZ8g0BA1TDIWGmYZiw2zDXEOFYaGhyrDYUGdYblhpWG1YZ9hgaDZsNrQa2gw7DXsM+w2HDEcNJwxdhtOGc4YLhh7DVUOf4YZhwAiMstFotBk9Rr8x2xgyTjVONxYZS4xlxnLjfOMiY7Wx1rjUWG9sMK4xNhqbjC3GLcZtxnbjLuNe4wHjYeMxY4fxpPGM8bzxovGysdfYb7xpHMTqqFVMikPxKgElVwkr05QZyiylVJmjzFMWKJVKjbJEWaasUFYpa5X1ykZlk7JV2a7sUHYr+5SDyhHluNKpnFLOKt3KJeWKck25rtxShkzIpDdZTC6Tz5RpCpqmmApNM03FptmmuaYK00JTlWmxqc603LTStNq0zrTB1GzabGo1tZl2mvaY9psOmY6aTpi6TKdN50wXTD2mq6Y+0w3TgBmYZbPRbDN7zH5ztjlknmqebi4yl5jLzOXm+eZF5mpzrXmpud7cYF5jbjQ3mVvMW8zbzO3mXea95gPmw+Zj5g7zSfMZ83nzRfNlc6+533zTPGgRLFqLyeKweC0BS64lbJlmmWGZZSm1zLHMsyywVFpqLEssyywrLKssay3rLRstmyxbLdstOyy7LfssBy1HLMctnZZTlrOWbsslyxXLNct1yy3LkBVZ9VaL1WX1WTOtQesUa6F1prXYOts611phXWitsi621lmXW1daV1vXWTdYm62bra3WNutO6x7rfush61HrCWuX9bT1nPWCtcd61dpnvWEdsAGbbDPabDaPzW/LtoVsU23TbUW2EluZrdw237bIVm2rtS211dsabGtsjbYmW4tti22brd22y7bXdsB22HbM1mE7aTtjO2+7aLts67X1227aBu2CXWs32R12rz1gz7WH7dPsM+yz7KX2OfZ59gX2SnuNfYl9mX2FfZV9rX29faN9k32rfbt9h323fZ/9oP2I/bi9037Kftbebb9kv2K/Zr9uv2UfciCH3mFxuBw+R6Yj6JjiKHTMdBQ7ZjvmOiocCx1VjsWOOsdyx0rHasc6xwZHs2Ozo9XR5tjp2OPY7zjkOOo44ehynHacc1xw9DiuOvocNxwDTuCUnUanzelx+p3ZzpBzqnO6s8hZ4ixzljvnOxc5q521zqXOemeDc42z0dnkbHFucW5ztjt3Ofc6DzgPO485O5wnnWec550XnZedvc5+503noEtwaV0ml8PldQVcua6wa5prhmuWq9Q1xzXPtcBV6apxLXEtc61wrXKtda13bXRtcm11bXftcO127XMddB1xHXd1uk65zrq6XZdcV1zXXNddt1xDbuTWuy1ul9vnznQH3VPche6Z7mL3bPdcd4V7obvKvdhd517uXule7V7n3uBudm92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')format(\"woff\");}.ff1{font-family:ff1;line-height:1.346191;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff2;src:url('data:application/font-woff;base64,d09GRgABAAAAAb/4ABIAAAAEpHQABgBjAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAG/3AAAABwAAAAceaeg00dERUYAAScIAAACYgAAA3aYsbSQR1BPUwABQYQAAH5WAAF13GFC5ZdHU1VCAAEpbAAAGBcAAC/uRZndNU9TLzIAAAIQAAAAXQAAAGB1d7lcY21hcAAABagAAADSAAABirhSMOxjdnQgAAAZhAAAAywAAAigAwMV3GZwZ20AAAZ8AAAJKAAAELO1sxgSZ2FzcAABJvwAAAAMAAAADAAIACBnbHlmAAAfNAAAhdEAANPMe3DA4GhlYWQAAAGUAAAANgAAADYDYOsRaGhlYQAAAcwAAAAhAAAAJAytCRZobXR4AAACcAAAAzYAAENi6F9cqWxvY2EAABywAAACgwAAO4SZBccybWF4cAAAAfAAAAAgAAAAICgGAkRuYW1lAAClCAAACKAAABVyi0g/OnBvc3QAAK2oAAB5UgABZM9luBYfcHJlcAAAD6QAAAneAAARKGZOz4UAAQAAAAb9cY+dZDpfDzz1AB8IAAAAAAC55pg9AAAAAORdC1/+hf5BB18GxgAAAAgAAgAAAAAAAHicY2BkYGA79s+RgYE97l/r/zb2eAagCDJg/gAAlVEG1AAAAAABAAAdwQBnAAQAQAAEAAIAEAAvAIYAAAmkAWsAAgABeJxjYGbhZJzAwMrAwTqL1ZiBgWEOhGb8zpDG+I+Jn4mFlZmVhY2ZieUBA9t/JwaV/0wMEOAbrKDA4MCgwGTOduyfIwMD2zHG/QoMjPNBcsx7WEOBlAKDEADo3w/0AAAAeJztl0toVFcYx//3fN+duHJhHr4aIbWhlJFqFCSxpYkhdAxOxkggksfE1I46CZoYQhoHJTJq2kWhNm20VbeBSgptlIBIIS194ErcNIs2CIUYFA0GRGwqov6vyeDGhUiaiHw/+PGd1z1zzr1z7znHTaICxA0C3m+AFKLPT6POm0CfLMYwDUsrYtqOw94Alrlz2Me4XybxAcvS9MJs/JJW0VP0KO2n7TTh8jFIK4M+MkozGvUhQjqOlKbR7UdxUM8wHaXjzB9Byn1Lu5DvL5opD/Wiy++kJejWz5F6GqeRkmkc0BGU+2tRr6PIy2pCnvYhV09gicbQ5K7gOg27ac7vBqq1GevkM7RoB1qYT7r92Cb3UKqtKHMlqHEF8LUIpS6M0tA51Gg3LWX7Ts6hGUmpRo10sN9hFPKaSl2E7FAR8uUaljKdIwPYLsuxk4ZDV9EW9OdXYCS4z8E9NoyXJfh/LvQYFgqNP37EdzYpU3wXB9GqS5keRVKrmB/ne/wRfQ9Z+gnLLyLp/4Td+jsSeoz1G9guiK2sG0CTlqBEv0ZEI8gJDSBfV/KbkYc8GUP1Qs/zRQjmutBjmE/cFKLyIYrd94hLDHF3B3HvNra6f7FZKrHZ+xUxbxi5/OaWeZdQpmOISQ1dw/bViPDaRnccMXcWte4NvCtbWZaNt/UbrHU38VaQdj+j6mXG5vuom+v5/h+4CC7PpB71zvh8Qor/gnXeVeKX59V7fyCSieJxDfWexbkec2YPklnDM+vqXP+OYRjGq4JuxCGuR2H5AUUyhA3Mv889zQ4tRpplW5hvYzoRtKPnaTtNB+3od7SHfvG03UbsDc5obgJr5B+8I+M86ySwRW7xDFaPg/I3+wvOanWol3J+x8vRQz+mnXQT/ZTupYdny2vpnmCcQXS1+Iqun49rtQ3bQpPoyVqFHsYD8/U8XnR8bh/PkkPch5zkvmM7EvIXYwPNoWeZv899yxS9gUL5kWUrENcg3qWjrN8xG09zj/MAu6SRz+xPnjf7UeA3YJXswWpJ0DcRna+5G4ZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGMbryxPx799yAAB4nGNgYGBmgGAZBkYGEGgB8hjBfBaGDCAtxiAAFGFjUGBQYrBniGaIZYhnqGaoZVjJZP7/P1AeJK7G4AgWT4SJ/3/8/9H/+//v/b/7/87/2/9v/V//TwlqPhbAyMYAl2RkAhJM6ApATmQBMljZ2Dk4ubh5ePn4BQSFhEVExcQlJKWkZWTlGOQVFJWUVVTV1DU0tbR1dPX0DQyNjE1MzcwtLBmsGKwZbGzt7B0cnZxdXN3cPTy9vH18/fwDAoOCQ0LDGMJxuQwLiCBBLQkAAKBDLQQAAHicjVfLbxvHGZ8lJZGSKHf1sE1703S2E6pu1rbSOGlpRbG34sOmWDsURRW7st3uiqRDqXnYbQ9t0ALsoZAx0h/RW69D50L7pAI5NEAN5NRzEPQYA0YORW/q75tdUg84aBf7mPle8833nHUf/vm3v/n1wwcff/ThB7/a3uq8f7/dam7+8hf37t7Z8L31xtpq7b3b9Vs/q65Ubt4oFwvLP3WvX3t36Z3Fq/mf/Pjtt668+aM3Fi5fuui8/sMLP5jPvSa+b/PvvfrdV6zz57Jnz5yem52ZNr9zaiozOTGeTo2NjiQTBrtoZFW24JW21blCoDKiKEyuMrdf3FpQbMayxTS/suBfiqnUqKPYbFXN1bwec/O+GnNOktxWyZz5jQ3mWxYvqZEcbrESttSFumcL85/WEO+DR50veLZtqUQOdwUo3CshbymzBrhtRZCKYjWPnv7BV3kAWd728a576tXB1PdfpuQTxg72T6h525BmL3OuUFRsrscyXyl2mshe5JliS+qCA0VMjLQ0tqCMuW+UMauM07eg8vEliO3L/EtsUGpti1JrCxZtBYc2fRFZ1OaSy7o3fQVDrXRV/X3V601OFEShPQEA0wDWm5gEZJIAEPGgZ2SuGXqQyJQWewmWnoL5ZkjdEj3byt0NMBBF2A2Y2UNM/2B/7yiKgW0wmo1GkRJqrKBSkRJ8S7mhYru8d3Ff7vVNthk4mZZohXc9lQxB0GPJXKnTUK9UaxsAYSk8QYeTu4v6Rc7jpQ6XmBNtgLcoktOPwVuddkBhYgSiCJxR8HbsfUvN4FtS046aAtnUJ/+ykrKU3eI0lXKHq79A3SNYm94IgixUlyWB1SCstL1MLlkYuk1HY6WlnePuhlx1N7ej2Av3BvFvS1Nl/m3DO/APODVjbMpWsE0qb4e0zdI2l7ttvdU9vTXEKy9tF+khRkQ/Wwf3hlfqiNLhgtg4BsncSV7bVuccYpSyRCqGLWgfqQzEof6UE5ZjQJ+Cchv6wxraB1jRDYt+DIoJNoiNMEHR9+3I7yBVqdzO6GXBJUlM5dScY9qfAbd/6WK17pWKlt69ShS8d59nrecYV2tDsJEFjVx4bkU2qq6J6moUBZ3BK2hECZwYeh6kMb2W+ixrPYvGd72yKAdSlgUvy0CG/YPupuCmkL1MRj4oBVynvwH4011Llfd8ZQYdY1F7iMRxir1yvapmV++Qq8q8E0aF47qw85Y9PaSpfRs6zjlEP3KAck6aX0O3U6hOFi9TqemjQljKzFPKQqF1DznR1PGrX8iVNQi3KGuSfq60tRYbC5EZBw/VwNUYCiG2Tfm023fZJiaqu+pFc842rcfMXXDgx4Aw+wPM6XXCdAeYIXsg4Ldsde1/xPfR2JbTYoZfXdD216W3pfYb2ON/8iqdj10/W/CSViIeJawkjSYclLIlddbRjGQTVExpCv6FUKajRgrevrXkc3Mapc4AzU2HMggV9QvxuUF1lM2ZylhSxhmCM9RVXd6TZ/NADgOJl2QQR9rRbcXNoNV5+d5AYwpsz4rop2cE7fAfurzFVTtXpryy7IhixVenqDarU1/rF/S1Ch5HJULmruoBL/EOOVvxoKhLgm8dBfcPvgyKVAKhMpFYcYjjHZn2eKxduvj/BnoXgf6nPb+zCCnu69gBfxvL6mxpeLGV8lacUbRWhbZyHD+04oAGzkfi2eqN859nEajns8/9l5m82jg2O7KYxuWHlaHhqbIzEB7NbzjW0enNE+jKAI3y8UfrEwwE7VnKFrUTELhWz9CD0cKur95zfKE2HWELr00tJ80ydiMowJ9kR1EOYTxYUttR9lyXbEgmQ4WttKRY85YiP8ywqlFtoJqibS73hPFotecaj9Y2vCcmY/xRw3ucMBKFYNnvvQac94Qz5mpogqAEpAmnCUmqY5LW9NYTl7Guxo5ogJ43+wbTsPQAZrBmPxHBzGiheb2QyxLAjEQYd0A9Alg6gnUj6gsxdRoYkzBPGY5uTCOjq8fIwO7EqJt2x91MYioBSxLoMSBPQTtusE8zxpRh9SCzrsF9o9sbd60nWlI9puyCkmDdIQyaE9kRQVgv2vj64Q7WN7xPMwzy9RsUy3ShB2c7CCBPIGVayq15f/A7MvApVNmZKH1RF8Q1phLiGjQey6gJ0V5Wk2KZ4NcJfj2CjxE8JZZRPFBaOBVKGQgUT7Qvj1mGTwWAki2R4/2DA/SfZ+hbthrL3cWD9jTu+Bw1YAV0N+gJAL6hus2Q9KAkT1InrDR9lR4KBElFjUPCeCwBFGXNQz0UTE2EWCj0EGCUlq6vfIcW9bZIAOc4Td4Ui2psPpI5Ok8LLfhyRrypm/FYTk3kdugzDt2ojWiIhSkW8yMjpTLQvCmAagY8ipE1pPLIPN0TVgRp40w0Mt/Wz4QVI1lUfyanJtT4Zer0KT2evAyBuFO+HymvZzsxAdY21SQ0mj9iypgB1gGqQrrg3oGqRPo3ErPaZ3XxO1QwUlpLSgGtpnKVEOU64p8EROQHzJCV1iCS8VkETdHOM/p3oNE/+Kv4vX3kQsnA2YaSgTELJ3CX+fIkQN1B20mfhE5psJTpqZczRPZKTw2/d6Iu10Rlv0/djlOrRbwxjv4Mo47NV8Ld/MxbdLrYQkSLlV7itqO/hv7KFbQbcNKD7p9EQtm85ROVoFJPRe1biYwjRHRc1MKl+c5gZsSzyL1SvX982hlOy/TQEftyfH4cmdeNxlbblvoAsTogIR/h58QUi9SUFjXzDXoCuG2YKEgIxCGlUbfJvU2EPwSiq5UlFuHNMDZkvJL6yDkmEpliIJwgiLajujUe+DxA5zNW6UcQ+Ykvvx8qV4TUE2rRfvCPQbsOJQU9o/ZqqRT61P2wLfTJmWpSZH3ScSROJGZJKaTSmVwGMcTPk9vog/uBI8I2vEvr8bAdd2wZWYekWSWB7G7TAeYdvS+OYrhJr6Y+xN8LHFhiWs5IflWiKN9DPxmZb/48QM+i1sS1q0NL0E+fWaGZD0ER4XiOCKOkIG0+dHr3UrlDiL4/diLitJbK9U9vbUCiM4wGD/GzhyMUq9Pmjbo+8uvKlSR0BeZ1EVX6l5mrRGPwI6H5K8RqDRwWsQGiu0qccb2c8ah2tFvdVWeq9TsWDHvpv7OCu0N4nL2We3BU1R3Hzzl3N8lmk2x4bF6bF6wBzA3msTF4m4u5G0Ata2EDERKjhZojSm0BzYL1AYmVhZBAEKdUA4ykMzKdtn9ks6FjYkVSRxFpIi/rILYSBKwDwUSHqmsH0+893ONoS2f6R6cXPt/v95z7O+eee85ukn6ST7/e78ig8/P76FcyxGT4UoYvZPhchjEZRmX4RIbLMozIcEmGj2S4IMN5Gc7J8KEMZ2UYluGkDCdkOC7DURnelmFIhkEZumTYLkOHDG0ytMqwWYZNMjTIcLcM9TLUyVArQ1CGO2UIyDBfhgoZSmQolmGmDEUyOGSIl8FujIt0RehnQj8VOiZ0VOhloSNCLwq9IPS80HNCzwr9QOhpoaeEnhQ6JHRQ6BGhbwk9LPSQ0NeFviZ0QOhBoQeE9grtEdotdJ/QF4V2Ce0Quk3oVqHtQtuEbhEaFrpR6NNQ49b5+S2i1Sx0g9D1Qu8TWiM0KPQOodVCU0x1+RttfpIHikEVWAiWgdWgGWwHe0E3OAiOgmSyTLlIKGlRrpBnQBeIgAFwDAyDMZCAWX2Y1YdZfZjVh1l9mNWHWX2Y1YdZfZjVRxKxhnJUl6O6HNXlqC5HdTmqy0k8nuolZ8AoUIgLmgeqwDKw1+Y1vPaxD2nk6sBVNnD12NXhq2NXbddMGRg/Nj48PjZuW+NPtBVg2QPQY2AYjNkKjCTb8KtjrzIhLv8E2xRMPIUwksrqUO2CDgOGxyaabVvCfuqaRl1+jy1etOOgzSxd1O4heaAYVIGFYBmII2ego2Cc7TEWK2eG09Kz3/kz5Ikn0zxPPJl5/ATyukchP10D+clqyEOr0jwPrWp+JCu0drI7+4EfQ1ashNz/4GTP/Q+GH87KbEp7fE7mlMdApr+UPUs6ASPZ0CIzsU62i+0mSWwb62Db4W2snW0lScTDOkk7wCtB94I/gPeBje1Dza9JMtuLsb+C78HYF0jy+MesIzrZq/Uj7DKDP4v9nK3HEavsKfYkscM3sMeJDb7e8sfZUtH/KHtA+ANsadSu5vexNVFPvnaAPYL7Zt0q9NvM/qW9pT7N4fezh0km+C3u94malWidRvoYKGwjeww7qrIWuDm+GW6u4wnLH2NLxP2fsRWEwNfBzf61ljdZvsKqC8GJ6L/mq9mSaLx6oz+INiWbTGX3sh+yZdjCGraILYYvYAtZEFvpZAtADUlk95JK5HrkdWAt2rvR/j38PXgiW4kRD2FDGzHT/fDlmOk++Eqis0awHNwLasACMJfpYtfmsAk4KJUZVvtWtM23ns0mYNdu87vRT8lt0EOAsUrcj8d9DW6+3Syrfgrq481d9kUnpWn+NFZs3bjJ8plw8wFFVlu1vBAD7ert/mq0KbFD94klVTIfCQCOVsisZdUsVTzaDzdnqoKbS/+e1X+L5RWW32x5vuXl1rhSy0us/hstn8FS8Qpt/lVoU5IF7WdleOV0lsEycShOlsSS4QnMwRLF4SQAJzY/HatNwOE4cThOHE46DicBh5OOw0nAfS9GFOAwcjBTHjwLM2XDvTiIHJAF0oETJBCdLqY/MN+MLrB8Cb3H3Ct6l+VL4Wb/afoOfrap9JTlF+iw+Wb0rOXD9JLwUbhZP0IvYa8N/L0QdSTiyzZAbdHSUivgS9M3PrD/zbx8DRVKtKhIe5kqFFsRzZvq7Tdj70Burld25uTIzuzsbzo9Htk5OctKLc5JVjIciUiM0l4j2I5EzT4kfyI6CVlI8swu07EgEg3eJVZGer1ec0XkpZxczfjY4xHL/NsNBdqSPppgTKJ/PWVXK98NvMuMiDNZ++OAXUWBMWvvpEmasae4RNuzi6q7d9nVXTts6m86bWrns4pqvFFUqj27Q1Fbdzy/gzkaMxrfbFTyG5NdmHxs/+15Bdqf+miikU2f30nVWS/QX+5kasZz0wq19Odo6s4qQ3tvJ32FVtAi/L5QaUl0yKbij4vooGkzo0MKrMjsfIXeSeeLmvnRZrvaTxtoLb5XLn8mrcXr1hJGN9FWcTib4ebhbrG8lW4XAzvgZnt7b9iuVvmTaBeh9G06KG6egONrSI/TwWicebLx0bIyzbRuxdyG3g9yxbEaE/6SkaW9dURRjxy2qcbhKVPN3t7D7nThh7CbwtOyRLX34MxSLViDfarBfl/Aa50/h8a5wkJtaBCfoMHquaJ+cPp0018aTM/SXrtI8daO6GnxYMN3saBAO3ORGq97crTeHrvag4MxBmbP1ga6berJbrvavR4/rk9PTNPeOEDzO2hqBzWnbK+4RUzdPl0VSylrx9xbt9nVbW02dUubXW3DPl4ZVdTPRu3qpy1MHeuyqaPYGmOkrFwzRvA0c3hXzaJrPu/2a36LLqZzduHgz3TRLow0+3+Bz7/Z/04L9uepZqpuwKrW4xGXwalm2hwuyGsNU3Uz2IinPA1uDGvh74eVFWF6W5hWhOm0MPXMcmdUuN03uyeWu10+d1KZ21HqjitxK8VucpM79pUrP1YSY9Omp8yY7ipUU4pU11Rvyg1eV25eSn6ei9hT7UyfneLUQ3qnrrhSJyQ5Ep1JcfEJSYrNnoRfEElxCs9bU0hdhdTpCrjwk6KSzFVCyu/I+644J3EqTlclqXTUKw2OdcpustvR6XqPJPVTJ00yCl0empOcEZ+V7E5NT55om5xcHFsd2xvrih2NHYvFVcWMWHcsEhuO2UkfdUaLY8UvUyepok6jxPYPPaZ/of9dL9IL9Rn6NP0Gfaqer+fqHj1Dd+sTdZfu0ON0RSe6Egz6amlkYoAEaqsjkyh8cXXEpwb6lPxFkTI1EHEEG+p6KO2oR2+EteIbXRuxtfYx2MQ5dzfU9dFM83bY048POIkEloe31atqTnWEBxbXRZWWlpzq+kiZyM88g0wCkbKaiMdbrV7vagqtld4UsrrwT1w9M6bNixTO+1GkaN7yuarsFRdtwnWt3hr1jX/rwpzfPOe6T//2LdOoSCRkThYye0Kh7xRe5xlm/X9oiRmbvjuGyBe2SkL/3Zh/W3NI1kUyIlU4wn8t6KHmWQYXVUfYnHsCEb4oEMkNNiyPZHmrA5HDaFUEGyIp3mrM3XTtCpn/1zaZB2H19RA2p7aHmRIHaWio8zfSrwmnX4EY+BJ8AT4HY2AUfAIugxFwCXwELoDz4Bz4EJwFw+AkOAGOg6PgbTAEBkEX2A46QBtoBZvBJtAA7gb1oA7UgiC4EwTAfFABSkAxmAmKgAPEA7uxkl/hn/FP+Rgf5Zf5CL/IL/Dz/Bw/yz/gp/kpfpIP8UF+hL/FD/ND/HX+Gh/gB/kB3st7eDffx1/kXbyDb+NbeTtv41t4mG/kT/MW3sw38PX8Pl7Dg/wOXs1T+HU/Mf/zq/7/85h/AowJQf0AAHic7VVtTI5RGL7Oc55TrSn5gTb9MZnMJGx+2OpHMxMzaT5fRj4isaavaZQViVGJjEhpVCwZJkXemTJGW8yMZjZq2TTMWumHlvdxPY/3fftcjM2v7mfPfc65z7k/zv11VC68AbUSfpgBC/SJnDtB2n/NjQ6j2MQuuiOqb07um/CRofAxpWjjjQ6tBX5Gaf8TQ0G2uLR4OX/dXIQj3Xlgi3vcbY2rRpKGhhF3h4dneIp7OGjN7biFKie9CrdxiBLtSLXWa7EMWSglXkGKDRFYiQ3YwZ0ElKHcybUZ0ZjNDwijR486qY1oR43o5bmiIfoLqCURd6ipCIspLwwneNtTuIoLWIJsrvrgtYVbtE2IQxIu4wZ5tyLWoi5FJhZhPW1bSC8lIJ7abbiOasTgJs6SbkcUSjzuw0tLNiNldGnzjS4cI+9pLVnL1PJkBpKRhhK8wzfk47ijYeTo/QHko5C3yEIeY2qToTJSRrtj+zuopb/q6ZtURqWC8ShBvpiKcziMdDEGxbCLOQO88zdQixzKHggPcZd+K2d88+ixJMblCq2PHMwqgoQ38yYONuGLHmz8R0uGh93MhVRm3AHqSeTN12AbsyuFYyz/FLct80QYjjDql8RMfCA9HPsRLyaLEDzGEeGPvTxfTOop1IkQnk1CtQjCd8pfx1sOAZVr1qXVD2DWpZjAOmFtyh5zLT+5+oELi0A86d8PxBThw3yrRSX1X0SRmCQkutEKh5glAhi56XjB/zH9Vod6+u8LT/ijWYjf20KOYypGd+4OtYXZnjugN2WyUs6zvtKZQ9Ws9XqcRA3HHK5KWUFncI05UMFcyqCtfXptmEu83cSWD3yZGXDrfWDSjRdGk6W3ycXlyHPPX7Ga37KeI9krRmEU/iNonr1t6r0WocYqYXzWKz11xzrRzY1yVnwB8T5+24fnlT9ku7pufFV1jnA1TgU6EhxpfMua8QbP8QhteMnMbsRHGSIfyVbZqUfrHqpJXcRtPRh7cHqwPD1ej9WX62W6TQ9W07gO4FsVhdV8q6L5Xu5kX4PK95ytn1Sr1FbZKXtUIdl2se9lszcVsJMt+AkcSfkQeJztwktImgEAB3BTZ1qth62y5spZs5d9mZlZOXurmal9ftlj7svMnkRERMToMEaMDiNCJCI6jJARI8aICImIGLGDREh4iIgRY8SIiNEphsQ87NBlbGy0Ln9+PwaDIf3JFjEWsRQRYtqYK8wzVhbLwhplLbAu2Cb2wZ1nHAZnNVIT6eEquds8Bq+Nt8q7jDJG+aNd0aGY2ZjQ3eVYKjYU5447jBfFBxJUCYd8O9+XSCQG7o0nEUmvk/nJCylEymfBoOA4VZBqSR1KG067vD8jlAi3HtjSn2ekZ8yK2KLdhwKxROzPzMvcz3JknT3akMglG9nK7POcmVwidz/PkhfI9+QHpFr4relbdVXwouCUqCL8hZrCNVmOrFfmLVIXvZJz5aNyX7G4eE4hVswrzktMJUtKvnK5VFg6eQPct0MlVLlVZ2VDZSfl9gpDxZaao7arvzxOf7yncWl8lcZKf5W06m01u3q4eqdGWvOuVl7r/bW60RuwHLZZd3RdvbBeWT90jTfsQFuu9Wi/6sr/WI3OoBvTLeo5+hGA/2pCv90ga/jYsGdwGgYNa4ZNw04jt5Fs/GCkjLtNjqagSWzymZVmjXnafGEZtxw1O5qDpIAUkW5yiXxPbpG75BF5Sn63cq0Ca47VGeaxnlAKSk/ZqRFqipqnVqhtKkidUlctRBjZ4mkJ2tJsC63S1uM2Y3t8+3j7XsdIx6cnTLvgqZIm/oqGNtIddD89Qb+k52gvvUbvdEo7PY4oR5tjvYvoWnRynTPOYDe/+033hWvS9a1H0TPfG9M718fss/Wt9/P7pwYkA96BEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4Nz8ANVh08wB4nJS9CWBU1bk4fs89987MnfXe2fd9n8yeTPbkJkxCgAAh7IGETRBkFFCk4AYKQa24RA1YrOLCYu0iLn2lfa21fYrWFqut9fV1x6p1KYLS32tVcvmfc+9MMgHs//cj5GZyZ+53zvedb/++c0KQRJEgyMvo+QQk5ETqaUCkW56RU7NP5Z6W0X9oeQaS6CXxNMS3aXz7GblMfa7lGYDv5zkfF/JxviLpFYLgAWEtPf/zbxapEwQCSYzAF8nD9D4RbpQ3yQjAAhIAhZwAxFOQekouZxScvjF98s2TRHsOvRjMZzMABqAPfYN5/Do7aWq/wkbvE5Lg1/gbQVp8/gx9Pb2a6CEWEGuA8ehwYhG/Kho5UoxGp/mIphW+Jl+bW+VeCKdNG9J3ejs62rraYNu+Lr4LwiFIDgEXNfQwD836Pti3l9dTkdjOYLDTp1q4AmqJ4eZpbl8T1TzPcqa3t3PesFYr7/B2dq4d2CVPn0Tzs9tO6But4suTnN7SyJ7kLI0iBseJdvupBGFF12VDgwmOyNut7Cn804qfQp/hLHl0beTyHP5pTSeyGQefuuSs+Y6OrrZ9pS5xtnDo4RKe7t6SnkLwE+0JNEA+kfsSsJns4pAWBPwpUFfbBuqlH/mcmzQZtZTcDSxt6E44UuczGeWySV9uMp8r1FukhwH+WAq91AKT0SzHVzfA74fTIByBN6358eZtzy1rvXXztLblT5emXLswp3UmZ183PffK6ikdmTrgUsoYRq3W6QwGs8Xp8GSnNXrc9alUy86W7LReobRjZ6Iv37wkn3etHChumb5wz2xvy6GY97b+7rkPXN4/fNOU5Q/1D97d52hZ3uVrrW8q9sanfLyh66vTamtl2aw26XI5nU4HvrjQv0be4Yw0tnXZW8g/Fb8+v3FuIr+is3XHR/ydA3O3taSagt0v5aKI50bgD8AakR/bRL5hCZIl0T8KAuJGCGlKXEqiHXMiXh21+D4DpU9Y8X1Ee0RhzKNgzbQr/Ig1A+CPBIL9nDCT/Cv9IOEmekTYFqUKqvbySkC4oXsv4VC5Tbto2uvBQ4wdzxHtZW4R2UCtVO0t4Y/uLREOaZHxKGgdSI7Vo/Uz+SvLZDLqLWb8lSf/+uR/by3Ubf3tk92F1kTGHeD07oAzHso3Dwkz17wBZgE3cII5b17Rr9ZGa2YvfeDR8yeFly6bl46ZrEg80ZwTaM4Dl5izQ5ozcKvoXSaTNOdTl56zQ5wzGJ+zIecGeo4lERfV5eoL0hdXS0bC+CuQ+NIp0w+ueUN4RnhbeEd4qmrKxPmToLl6zrPIQ9CJ1pAjlohz9pG0QqXlZGqK0qsBRypoklZpKUoD1ZTeQMFoU4IDSDiQtGIZkVYR/YJR0Ex6dvwtTHp5yBAw0JEkqKdhHoYsNHR2COddO92C0AncwtudgHTvdAHQIfwVPrDhu8LLoPG7G3YPb/wuaBRe/u7GYXGuNxC3w08phlARs8W5WuWQfIGRPc8TUAUoRgZ+RKo15I+imQRgT+Zz1uPscSKdt4/l7K+xr+EJqsQHoOz5EuJZaxpJPX4Hz48LcL46H8LIZyJ33CfcDTbdB64mKWEYXH8HuE7YfQce3yr8HUwh3ic0RIs4vl72zAsantH0aGRyDfm0SqXTSsoLrW06Yf87HpIZ/wwaEN3D+sSMdAeQR9rIutoIqNNm1i0t5FNG+fvdxe7N13S1ZmaunN47HY1XAj8hW8ilaK7N0ngkgORzPAGACQKKBgRaDAQVyVCZh5SAfK4kvS3dF9keIUa2CBnwOvjJgyIdr0SXeoQHJGIiXCU8uoMET5FkRWLT9lMI3LP4NoJjP4UnbQrUgfpX33//fYlv2oR++G1R9lMiDDUEpIMAXliBkre3nsghHmgXIeE30WsEiAEBAL89lnqIfJPe96//lHcRom27+fwZeArZIQ3hJKZK0kNwkNvPEwaFFVr3KyjVHqPRrd0DJXNxgfAQ3P4S/uT+koIaFx7aT3K1WNxzWIQAq8cvaskw0sIkWfPbX3dce3DF7996V2jZtn3btS3re7sGG60smAcGjgH1U/OE7whPCg8Lo+QvhB8IvwQekHwPuG7o3/9HEf9nCAK+huZrJ5aJs3XrzSaTRSFjFMzXigoLZSG0ZjMjIxjiq1qt0yHxBXucy6fRS6I9jU2ZaGDyouioxh+34PmnReuD3sPrZ3RDi8lX1wbruFo0d5k8AvIyE/k9ja9taOaYa8OyHLII3i0La8Cb9TJANzWHTCpy2jSa87d1w0Q01Nk0E1iWPymt281o3j9D844SXxPnnfe69HrGajUrXGZoNz/IuyiG5llDDx1VRGH0gMJm0zO0XObdo9fHbVGGsd5lS5/Mp8X5ffJWDtvMNJHGi8EeT+TRguQSnJ5AiHHYkmPcHOUhFHaX+cHSOHxF9EBJgYUCP5bIcY3SE5jXcm1kfR4ilAFSd1hMsOWUB+rwUmLhgUhzk89nW4Imdj537meJe3dvzjfUWzOrZvxnx7Ztv573g+dNyd6lm55f/IjamUwLf8is+8Pojs6edYPpGdd0vv5CY/7xB+sWL7zs8q0/24tpcg/ivVcRTTLEf4o0KWrUoXA4BEP7+TBlDu+PZnR2wEE7Wmx30uyGNvd+3mygkhAkH6QotSIcjmfuIgi7Yk88btfv8flyjrvsEptWfeNlR8QRmVaiESKSKKSijEl3ML08GnU4tL8UHh80aTO795fMBkAlHyxRIn/nRIo1is+nE42YagaRPG4gKheTG+KfAT9yTfKip4G8lASow8QUeejA5leHNj05ULx+ZeumRXWrXx9d8PLcrYFrVt0yfPTJgVu/P7Bl09AWJ9X0fH2he+eS+TcvTzGqunnXztj83NqI9821Q3fdce/+RYpFX12wYeuadVh+ZxIE5aOXotn6if2Yit8ndOdf4NOMukenUyjltNJJO6HzQV5P0wq7FX3ucNHuVUAdq9Tf7vT6FBRNBx3ydB5RypL/JPebE0R7vkpK7KLzp28c9/Uk+NYKfCXtfLBUgY3gIiLlK1KUyIlOJVYJoTayFSlEbMFyiLvy8gByxEgkXuhmbaE+AEiqLa4Ze5OcdrepKefT9qrPMKZYSrhC+BjcKqOUwrYsG+mZfnAGvObc41wi+9rBKW1BqzoLzn829EHz2H2ijO1F/PQbpBvDxMeYEt8DQE3bWZfuGJpwmHP26NQuNVR/nde5DrieckH05eLoEA3p/XzIwNmg7YD5WBk3MwfNFotPZ7+DZYFvj0IRJe8CE2w146ixb8ZRTf/AoqftxobFjUiIEN1eS1R0oySJkoEQBRTxDCYFot+kWXnwrFzqr5eqpxSi95fwfA6U8HT+A8+G5zBh7a8lkILlRO8tMQ4TUbd+nNewwCJFxfkkKvu4Cd4M+Pduc29bPnxbz3Vziisb+siI361Xz9KN/aT2utavHLts45sj365/c83yRw5ccUcbp0+T96os3veFaWbzime37H7hMsle3HL+DKVEMmsjksRuUWpr3LRMxjGMHdq/zjOMLWwDEPA2igvD8H7OQAdsAAQ0dyYS6cAeYznmaMT8VjElJ8rkKtONy+exNJolsPavlxgmLMHbX+IMopGxn8BspccfxYra5JeRcks1ptj+FIL1ALn9SGWJvj/iOyyD8O79Hz/kVc57fNmmA32XvfG13/9542uA3Suczy7pC6tlStmOW2asaXdcR6eyu84TR6mWhlXPbr3l5atRyMc8Awp/G1aMrTfHvSq1oaHzx6/ULrm+5/5DmPfuP/8ZRaLYU0tcJVLFCcmMWi0jCUKmkUHZAQ0yxaSa1mpZjUqdPvESlo8JLvo+QZ9/v2GxXmQjKdzCTpyd/RkmhVaEhUBpZAdKGijpIfFdya7XgTofMq3ygMFHkWM/GCEdQk8s6zMbFhjhAB36/M0sda1O50wVAYqQkeewAcnJebSGLrSG7cTt4nwLKKjlqOZAoBk27+cDFkUAqV9FHub38wqDJQET+y2U485IpF7tvtNgUFN76us7UnvU4+t5kpvsHUwoV8lHNYvwA837SwFFHnkLCOb+kqXsM6QTkrdqqaxfOeqLhMtRH7otQ/aYxMqjzORw0q9aElrJTZs3/uau4Z9taFkxnfzvTW9sv+fFVaWxo862VT1zN9V3XD39pmGVu2PNtP5rWzu3zp6+ut1BvqGp+cZXrn1mxeJvbl64Y65fM/j25Y8tnfO19VcdALLmtb3Jjhv7B25suf3cpx2b+jNTdg0sv2Naapaody9DNPxIlIMUsUukYMKDGJbRV+QgYpPkwKCPwMh+PUUHANCY7gwEMjV3aiYbp38nBRioXpKCiARtfyWAniwFoTos8pFx6pHY6TKSlNyArXrFmGtR/GwGjXtO3Ggqy0DLlqe3/OoPjwl/+K8j4a7OdhujVdRvmjtjbYf7ukj2hrMvSRIw8Oi2qcKfhDOfCff9XE+OamwRs8IeT97+X6uwCIweFHUDcnXA1fBWMU8iRTUe8igBWeiFffAeSOsglB/lZYCkn5IpGNlTlYBBZBWs1LD3yxsv9czER0SBD9QZsF989SuvvAJv/fDDsRXIPSaJaShO2IzG16CoSpLCMHuUX85t5HZwR7kzHM2NBwXsU7pOshw9GPSV6IE9c1IMINKDoiPO29HjBMdyXq6Pu4dDc+EuiCokFX9hbCHObc14fPGfr0yOMMgDH35Yjqt2o7hKTciIOyVf/kcyIKOfIQEJefrY+TO8m0aEgDQBqKPUGYrUUUAJKSijCLmCkFUiQsKGZzFoyVvTDekGO3tiEP3Hs/fRsvOlapAXgap6NF1+UAx+64CJAaYb4JYxN/k2CfeAG/cKvxZ+vRfR+AZQCz+FQ+IaXyZ54OB5L0KGep4/SgMd7aFJJaShnKAUDCUfn6RoDRGt/iQtso0Az5fwYzRPU8+Xqp4sfzJhZ18rT8ZnQvoNz+bcV+EW8td33CGsuOOOyfTbjmfy3I/QPYDpFgDPUIDiEfEApGXUUfIMSepIhDFJyuCXEs9+YjDdIJHOIYKSgFwIouoR/MSJQdEAMwAR7Qby7TE33LJ7L0iC5F5h5x7JZi5FSteEdEWIiBG3iDSLeRUKMxE+ykcJPasnfVBv3mHWQu29Zir8VCy0gyD09puUSqQJ0icqPsdbkna1W9kT2Pm0j72G/HZRSdguCe3eklnUE/ZJn8fig7XDuEaQlf17UfVCuZZ0AQvm3xalrS7TlLfHe7Ozl+lvu/pA79aHpurcqcapdRlj4GXwiD+Wa5zVOn3pqtaZ6wtDQwebUj03zIl1dXZ1z22bMbXRdkyUSRnyTz9AuHuQf/q85OUrGJ+fVim9fq3fZvV7fX5Ia2m7xxPUWgwKld/oVULlCK/zzvaSHPR6rXociXF67nCRMGtlDlrvt1LYSbXkkaG0SH6q5GqJrnwGILcVu7P5PCdmS/LsrS+88AL+zjp4vzTCSOlC+FWwrSJwKSMp+lo4M5lZ7JO8+DTwSR6FGByCepAH2JMFPgiduayV1YWElN/OtrYL8xvmRsCjD4N51lBt8tyz4LHns0prIuifnb0Z6QFPSwOTzTIb11Jzvzg0qz+lypJOchjb522IZuuQL+Ei4kSBuFekWrPZVIjHC7AwwsfVrvhINONKwuSIi3eBw0WXXo2crRE1r1YdLqohd5PPlzXHbTdlsw3xxHY6fTInWWnJRIs8JBqd8qsLAyGD2RQvjJTiruRICYMeKalhxVCLIU8eU4KrTZGROt9E5CPZbii6oSRmLBswVyx0AmxD/r3SEk6R/gM/GZpSmn/bnm2/ezCw79Hk7FJb+AbPtIFbRjqm3n/zg6KfD1d0tQdMmmxxeN3CHfOCTOybW2771kzyk/v2dC0pWJCT8/nYVfLOm1esuKkNCepXkE+qRzzmJX4k5UONrNbUY9Tpl+k36KHeQmCdkEG3kDD2kcvJ10mKgaTbggRuhLcY3Mg/G3FTbiCTkUpgOEjq9X7lTVIgmT+Z48TgZ8KzQf78i4gpGhPsi+iC6XXJ8VyXGG+khEcbKbnLfk81ICkbJhIO2Wi9WYqTOGzPCeTNBlEETulXWaev7Lr80aW995f61071rhp6aYsgnLsVyP5jyX66Qfho4eU1twun/utF4aM702tWCW8jH2QRmP8W6DxqQLK4FfHVm4ivHESCmC9SyutwQ/cI0neIiRx6rfpwURuDsREtNNwYCiWd22UTSZ8qfhEzPw73SAk9EhspaeF45icvZUvKjIHwIEX3OxDB6FB1Yg5IvjUVNSsRK6TBf/zok8P9M6fzgzNfPdIYnTVvV2lBwXbtb+4vtmbVZj/fBVd0t/sRG8x97JMj3xDOL+zNRv2DlLNl/R1Prv45oLdSUm4Fy0sc4ZUiXpuIgGfgCFXp8VisJMmg4aCeR3f0lhFemfIrkfz4A4eLfiu0jvD+VPJwMcVAZiQFuYM6vd4KDpKk1ec96PFklNbtkbIA5cqqOF8hCJYa6efY8UQl/YI+gAK+8Ug5MGke0iSUlpGS0m8dKflTzEgpJdIvncAZGfx0GUKZIaiArxwzY+5IABzaQSlLU5FByrtS5/XHGiLCi2/V5Hy6oSGtP51+C9RnW2v8FuMqw7mVZeGj5wu/yk7PuVVj/7C18MKOllb72I+5WOfUovDoJMEbpyuD6Bonfityy1xCy2q92ke0R7U0A7UMSSoYxgx1nIdLc09xP+ZohjOP8ATyHSATdzMjTMbpcXsOF93x2OFiXAEVI3GoO8hptQFM4BrGsj1wKari+KeSYB07LupfTFn2OLqBeS9bNQ9pFpOmwJhHStIc0OhxBVJkEoG5vBQ4Dw1KFB4sUxheSGEpM1FFX2alOZZsyQq/f00ir86fTr2m9RaiQrGKsMV5Nfqxv7iKU4WBYpdL2NrSEzchDX8BWcv66gGkr5LEcZGu9mgoHELWLQwYGA6rSRftgq4RHtAGHdYkMaRJdATbxy5nX2eRJmHVahM0jagpk1qtYA9yHJnc7vWmbTcqJGltFHU98m3aq5RV+3gmR0pQo5eYlFw0hIbFg9KukVJlRMslRkRGQNRa4/DE1OGg6FGE5JFqPWWZrMcKrQBZAFyq00ITVZg1reOupWPniT1A9vTgt9atcky/fPaVB5fMfGDDlqsNmXpwfzBokNOmWdEwWAIW/AZ0fttkF04NrE7sEU7/5EXhwzsvX98y0FejzWbVntSUNolPaQrxaQPxVZGemYQO6kb4RMCSGMlkZIwJWi3Ww0WFRR/K1kJ/LhDwHy4GILG9RqNp0sW3uxDOz+rATFc6IXIj5kQxA4Z8vHbJySgLOyaZKaEbKSVEqBMQxbwX+rx4kTJelfQx4iLfRSwl0gLdrxCGNFH3yLTGUEQYrK/hxt4Uk19LyswFDtVELCqyhos2g8cbatjPm5oCZr0ym9X6u+eCx4VBKRc2idOyKrOvs0t4GKxcyPtZ9NFAd39ZpkkPopW9UkuhFXLF4aLcpDfoDxcNiCjqdBl9SRARyv+BPoPexzjiPHpewu4SCIEnxXkPVOZ9GM/78y+dHZ4PkhNSg+ZjJjrE+RgpGtIjPMVpddrDRR2kaPN2JQrOcpU5lVeBoeiREv5UeVYSycshGDfBb+CB9tHdvkXTXVykVZpP8dYnNscW+bvWLqIuk2gjTUbiIwWaSxdxvziXBiIO47w5DCHRliVG3BmHOw8z2QxyuHxWmNVyPGxta0WzZIywDXapOLPDF5InttenT1rQfMv+qbXiqGIesuRRoI/n7ywDFkFOgJNAIZRE/zNdudpPYF0lKimxElkufWtJOQPKCyGWw+El9ZdEiCfc4fZZs5cHanTqVBQ8523raBeOglJTZ4tfmBryW2zvx8I1obpLcd7frZ0D6zONEZcjGqKyWXmgtVvYPXZ63hQPnc1Cs1mfD4IlbVHDv+HEij1hEX3dxCaRvhGCYRlSDRnGQqiQ76FCvu8Ir7KZLebDRQtUMgcVCi+xnZXUWjUHTCRYRX91Ao6KGClhABWu4Cql7hAym9RksymR5RtAlmiK+dwO42rjuRsn8A5Z1UuVplDLkiXCVZPxURu8nT0Yn2sJQqZG+BSIByUfvdbGM/oemy0fUmkjMBgKHi5qQkQ2nz1crLM4YB7arLVWpGhqaz2yU2ZLHdTrG+yOPPTsSGCWEVPwGNdEPl9mnzyulo5HOQkp3LtgGDyEBF7iG1wkkmKXhBjuYU1TzRL6+gBAX2a96WJOYYBPpsZrLrLBssYalpFxwuarhXuQZRXv3Vch0WqwDNwM+umguL7nDpSXXhvsngO27wN1jed88HSr8MI3hHsvwRXn8vCESMPznyOBn0/UEmtEGgYlW0hZwqwmV5s7XHRqa6FpB6QsUKEoOJy10LujZoJYKA4UyYTodDxXMWpqxKXi8/hZrJgRTfLofSn6dQNLPkximzSuhwMA6QtEEBe4iCDw68GsXUMrFKZQCqxNhizqG8d+XVtj4OSyyeRoJF0tAw2tYP29v+ri/SKfGL38tC8OwMML+yIzhStf+cUlyCDmB7A/8FPkD7AogqnUYI3QiDwpA+OEzhGG0txotfq5G+n0BwjtDy6swRqRv4M+OVJiqmuwKYCiVX0B2WM98sNlYhm2oK+r1GHv2vrSnTNvGzv8zNnr95wXtM9+88oHehfvXz1w8/wIO/sIoL77Z8AfeUj45e8/FJ5/hPy5cEJ44Q6gfvZ3wHPLvAf/IM4by3ODKM8JYr0475DTC70jvNOJLLhkV0SrgmMKA7TcFAwmPaKBwa7DJHdPZO8yQpzTO1IqgzCg+MJQcd/Gi0kXrZJYnUQuR6SuHHCi13LwDY0jlRWmVVbozIfv9ux6btWG1s2b7puVmrOxc1VurLk7ZlFNXpJnv7f28BUpam7z7ZsWXNPtoqQczleEW+gsWiMfkSWOiLg2KpVGuVYO++TL5RvlUM7rtMAAtYTDaAzB0AhvNDhwhM47KKVXRRiNPovnxlgs77/RIuqzT3D5Jv+W3XaiElZOLhydqLi9mCReNNbF44RGSngQFIeV111KV6BHObEsFLK4qYleKDINwmJdROSIcl1+giFge8CRqc/WGOv7QplZu6c2Tp820Nz92XmJRY6PTavmECYfaW8M6GLBtllFc27NonVqMASKFY4RPhQeIrdeyDESv/wL8UuaaClrzDqng8hmCZhFvE40y4OMTC47XPSF5UbD4aKxGTaPGGHc43GEQw5gvam+vi2UBds1iH/SXNnJ1ZcdXcxIZVVQ4aXxfIYdj4JkBI2AzHgJjYJHaEbUkzhL1A9i6CWlNy5hQTGDyXCOwyPZ2xRIAxQ4QE4qK+FEGnhSZQ5XOT+nP3x/377WhXUDkYamjPBRuOhbFM0nstmrNi0sLa3v2LVxgJwjfKunw4d1RTUDPvns7S8UFLbBlQd7eqOKbN117Ud6e1wq8omx79i6b1yy7KZOpDc3nj8DR8Xa+UmRkro0zkGkk2n0HqGizNiNb0F3zAYUAli91h1WSgutVqcqGKScSQpSI3zSYMDaxUBZD862AIsl6j2l02Wip+TyHHEwM1HsxG5+VWVHqk6U4wh9o0g3/BNT+lKzCFx6FmgSIyU8BSTgZfaV1vMCsDgFLLb0YSpHUqRUEarEGFJDn0VsC8Tyz71pLJbmX3tj7ZZt1942Zd3Pd/aOXLnK0j00o+Pylnzpih13zu689vEVD50A9YvWZK+7dsaagZamDbfM3HhogHUKny5aGcmsmDJ15bxa/qo7h9aNLInVAb0Us3Ui3r0B8a6XuFmkd1Kn55Bq46DOAzTQ4+EYG2GDNsTHkDwItUqPtdNz0Ov1Kbcjze3jKrRMAPbTk2U6jgdj+YqjzRsQ1AmIhG1EbJiSujTED4omzODDUWuVo0fVcQGxANhJNa00JzL19dtF1VfvTrkMqpvSrbUJwyoUoh5ccFmt+RxRVnpy1hJsa6EIfeO6PhHHAWSHfodwzBLzpBqmQtTmCoMhnoRmE3LKEiaYfSQcztu3ayuZobKTW7FGWgVS3uUn0KcrYZGYzcCdmniVUlUeGCk6IaIUVQdDq42GcGDt/Zdt+/amnNIQzIKDKO6JTV/T233FVDt25e9uSrDgt1fOntFUOy1euP7IzeS9s+q9Fo0U6Yy1rNg1zZe97N7ryU2Sj68LFsX4x4xw/A3C0Uc8IuI4X+blwEyZV6kFvXL8Ui6+VOCXCvElwzP46kV+G+Mw6E1eCAgACYDsGu3SWWkC2hmHw2nT6QI+OqpjQS/tTJ8Q+feEmIUWXbkyldAqJxIgIf5z8GwFYAVSxfFvl+raYrXOYgBtcMLhR64bJh34XSpjZXUfAo9MzcD6TnAwlssGhBU7hacc0Uycnp9VWGtC/tnZc6/DgiEedWta6lHEqAzPW/rFt6glS2ZGlFmJHp/JlyF6hIgnpNwZcf51HjEz6DVl8FUvXolj6G4jA2aim2CmHl9CehMk9SqHGyoYZOgNTkpLWP1yBoaCJpObIIFerzAaCELhjijS7HEs26KyxuqZG/dvMU0sIlEkipiqwE6AHCeLJV/uZEtBkRxAok8eGMZDIogoBL8tvPCY8Ee92x3wgW+1ZfXsz0DnEUD/PZFvBl91B30Ru3D/3dSCLx6n2ooLsjYGOWuZRGB567kPqau+GCG/uKO5tYCpZUsM9H7xM0wnU1n+24gnRb5piqYUVlBfn25z+7IwlU4dLnrrEkE7nQasQQoLuUZKY6bboMJaD6NRj6HV0JrxePhMWqz7NqZx35Ulf3GcKCWcG6UmLv/kcarHqMCfHC2OPy1xEKaQB4jVngoHQUM5MyGGjCogq9QyYL1BJCw4mYmHA/fc7fVqgnFwTah5StvbQiEdSweEaakal/u5H2eCcWF3KFNTaP678F40FnDqEcPJwz7nvKazf6tti5s9CQWiaWrRMuExYWjx1GwQCaYiEHAWcyAlvDw774uj91WezPSlYCN4nW8K6mRSzhGpW2ofonOCuFWkc8pFaLXyUCAcCh8uhmiTFYp+pZlU6h20HFq1LpropOkarWs7QSRrREWL6xxI0b4tEqZM24mOJqmuPg5WBFkBN07KcgeTxG6SqhLJ5ADjfedYFsc1MKwDbwt/z9XWIjdgyBF4+aWoLxEH18fa+DbhQ7UT6eKGTMqpIVtJMNiXQspX1e3q6RR2gqVTl4SDMRRU6+oG1gth4YeN3XErel9pSXQ3IXoMEQT8XMyPHJA8JkLOylGsK5cblQqgABAgBa3TI4uh1zNmtdGohmrkNOkPGgxmlUopPyiTWQml2N4lJlnLfrdoxCXrU3GV9BMBtVsaRBoDqfNx+EZ1xWlqlCxSWnwxHmGT9XnOVwd8fiSGAc5nAlPBuikdcb915bnLyG8Lo5FkMBAwrIS7l9rqlq8WRrLUKxpH7ZIiWJhBuL4j9JOP0fsIeaWPm0Sh4V6eBARye/cSDkouGwZA2msxduLCPm6S3lvCH53ce+5Ds0Df5GNCJ3he+BRohX55V/9ny6S+8X7wQfV4MnE8GQAkJPcCB00SwxBK4526aDwZGg9/dG8JVI9X58MdzeADNJ4Wjfe80N8ve7Rf5G3ivI785/mdSM378HjfJf4HkDRIsy8SaVwUfw4Q/1PCDcQYkAlxGPnPTzZvRn5zH/L1nkLhcpjIgfWSlgbn338OmxqkmN/nlfgVmQIuKnrs/F/4IqPriapUERjZy29U7VAdVb2goggVq+pT3aN6REWroUply4AUlYKph3nKHAoeKYZMXkPG8IjhqIHKoAtpwN1pkUhND2Uwot9sGpPLlDRBBppYGwvZB2yswWhUuIeBKgxzeFAGmcdcrjY+rEC/4WSqIp0QUxlSRqPS1oRYxsq+uCkxuKk9Me4GVfygTdKvCZELkTV4tisFRIwaRIwie0uPIGT+ojqjojIqHmH2gup1FS0iQ6UeLiFMLoWF/VJY2NgHSjZWdK3QaOUZoV/EnPamRD6xCXP0eDdNMFRVLCfFYjkn5XdhZUsJ0gvkY7qFDyzo3dwGfMAbXTB11jLrzuU7dnSs2tpCKo2RGuFj9auvprozxava7qYWT29e333vAU3H2q0N/f235NKO9lt2Cgent9Z6zOoseIVcu66x09a5JifFnxnEA/9CvOokUsQeKdauATEaRdb7eJrVmzgzqwloAjAwymvMdtuRop1wAmZnGFNAg/kjHM6wqZRz2CBWXPDKIEXQXh12trdX1gPzt6UG0LF9pXHYoyUEF8HE7eRI/NtFaolNW2WClNte5RHkxyEjgjQBopDUACv2HYFBqntwZfP6r81d9ZNd03b2dHdBjSWS/7RZ62ufld56w6arG/pmh6AHTOsMXPm7hx8/eY3D38pS7ct769x6plb5xRszl7TkDC++ePzlwPSeFJKndYgm/UgufOU6StELMoA8CgDw7DBM9eJmCK8eMh49QArMBvV8ONaj11l1ULePt5o9Migb5T0syyr1XoMhQAIQUO50iPHOiYlNUhMbonAx5S3MnFejGNt2CjdiDG4S61FV4+oNU0uXHtiq21fCo46WPKykL46XgeEWjcFNUmPTeFBT3sUEEU3LIQ+cvp3LdWa7S+3WpuVTu77CN+ZnLV6Y/9ErG1/d1X8HPPRGxwz3wLHh+Xde1lAodja0xgxfnLr/3RsMIv8gWlEJxD9+okCMSpaVe5JldUeKrClvTFvTMI2J4o95PIinMF3ksiNFOaEAymG90Q8DmJGwkAcCDTWYSmXZvpCHyhyEa8VW9l2RkdA4aAhrGqPv98Qw/hhuhZEQG7W/i5GfYBtkU+WB+giOFcLj8R56Gwmg1MlJ1UGqzD0yY6Lw9xa1rn1wXcvBZza/dH1nqVHra5iS3rH7qo01TQ1NDm0VD103a0rUpqpVHqSmTIl+9tHBdzearMLTs4b4GuOJF154RedryrRlMb3WIt66H/GWDXHXiyK9Or0Gs9vHQW4v7/OpzMRU759tp20kYWNtXtsZG8VAm5kyQ/M+pFJVbuge5VXoHYue8OnZnXZ7QF/efPeJvvEtrvGCvA9mLVED2k5dlL5ISgPvLeFhbcTU0kXjUuZ9JTzoaElVYS0MTEppiM0reDfdBDURgX2VjXBQ6tWAO/j1O2a+9qv1x29efdf8NBz7at22Ff07O9bL4vOKl1+venJKb+Kfn4y+cwO/4Ru36bc8uqS1C8wv3T7t0Nek+Hg2Itrf6K8TNcSzUmeBUq6QHykqTKwesZgZfJzQEV7W6/W+4H3dS2ugV+y09od6vC7eFYTBvS5kH0nfIW+CHLbi3uhnWTBTl07kP8m9iak23vuEZab9VF5s6K+EzXY0mIk1J8DHpUsNo64Ms7fkAuWWKBFMIp9rl5LCgSpPjkM6nqpvQ7rLguQRN01CF8iTq05rbLGkcHlN2KTcFrZZOA3FtF47PDC7fpUhn/Ilww7Nabhw7PEpxYAJxQ5iAwM5mEchrz2fuvK25RHVd5uz+jC/rHcd8gDahQ74NuKvHNFBzAWXizRb2Onrj0SUirSiABWjLxSAruAppAuQKRTSun7QzxMsMCFdrmM9bJo9zZ5n6QBk2XQPQGAg8TGf09l6YM8ob3Om22H7aJqNKNX+3iCmQQyRMxh0+zo7e7u8rAH0drnd80gmmqXizbtoFgk2TZvyBDG/FxtclQ59otdkmp/fFReZ9kSi3JiAjLpFbHcXszWc2IB6Iperbo8p64BKX9YmMSOpx17ipjJXY5bE6zZNQjhdUIyW/l/QzREflzCuoyWM6WgpXeZ6nCiREkjVg5Yb5cWAKCIXe4kD/ogMC0AzGLdcOLNUEPeZSlds1Sw+UGkcF62/odJJLqaYE8AP3/4+4wn+7PtzW3pdU4pnrtjdWPrFbauPfKVj3sx0gZ/TM6Nx9Vf7eqaClWPT1yzP9yRNuQUNyy6z5fN33zdwc1Eb6WkanQMXylWe9W2PP21qagiF2c4N04fu67c2Dna3Xx4xTM81LmuN37N0wfa5MU54/cbbIsXF2UVb6m86dyo8vzAwPzPQ4qyL2yQZ5FHs5Ec6vqms4VsgXlcyii4AXwh8YQ0JGI1FjxT1MZMXiK0G2INoqD9SbCAagXrYam0hAsOZsghmyjXxakUv6ncpsJIidwdvFMGKIGkX9howLEnDI/WOQ6oJV0EsR4HxrVXltuRqASxbAnAlNWvJ4nz9go6YURdpFrZE/BaNY/bUKD8vITfGEsJmLIuiHfikBTkOs9u99rqZ6/uFWxe2B1gkgnrvlCKQDd/Z7ezpTQg3F5siNlVZMmFXxSZI/tVcRMAP6CISI1vZv4pbKBt1pGgzVeykjly1EQId/DMkdXAZ+gEh2Ekahkll2eVVlmmmTCcSL55kTxLIlRw8JVnCcV3lRmAxSB0kV5UugMdAKLW9bBpMtL9bVk2mQB0c76oSzSOmHdh+bE3EZ9FQ1mzyg1Y2mRe20sWf/vTzUwjpzm7wHD8rbVHUMWN1C6YEpL4TkqCFLnCtiKOF2CvimFUpFAxkHuAVTpPxSNH8pAkhyV+IpcLLMDor2EVahqs088k3xZ5/0ZBhRO2n2t+d4BCxAVmlYB4oKZwY7P8/tokKtgapjD+BMrj2e8803b3D39YRN8uM8foPW0VUf7nniWtDi6yJxuUzyL/NKkasqjpGlIN2JAfNSA544g0pWtKffx+vDwoHxJ9GnJZuRS/iqVavxUGbgjDGk4SeINUUQehsTjGhc6ToSJt02iNFna6t9UixjeCBljPZgjQRHy6UyVDA0oFr/e1Se1xFLCotqSdwOTYv7scTxST4b0bEo+nwKKLYiDJTqedUoEhNAPVtAP8fz3gBHQBleRJ7LdMA6ybTJBmT5Knk9ZlsLYVUmlGE4uCp1Nr694A3Nycj7LDbVP7kV3wur6MB89I1uQgnLwsWmZQzKCBqsZlMbr8sm2X42t8Jt3W2IxsHOaPOlWt7JOlUnxH5LKtxRqYUJsuWuB7g92g9zESvyHUmFMgj3wBpYMORopEwATMghjVlkmqkwKS92r4rKbxhXPqgSJxKD8pFGK7Hs988PvszLZ//m3khmZctg78glgOnOK8FKgWWYlyhF9O9FP4V4guJfwX4QuCLIi+zOvKz++lCXeFIsc9eZ1r25NDQ4JHikA4w0UQ3PUU2BU7Zp5GxTHK4BXMdQgz/5LFCbmlZZBjW+cCUP/uAD6sO9KYPv6lCb/p8K5cTPcOLMDU4MHNRmWUX4RYl9LlFSLUglsMaOZFARk50wxO4NyJ/qpxOldRNfjyXWEmuYv7zTMy8POvyhGVT9pXQdEUGtiB/HNfMLRWWs2BfyCwp7wsVNXUJ5T1+b2L/bFmQN2hbZva0+y67yTpjcEXDlBVTPEpDOCl8BSt2xuDwp8LRrjnBiXtKk8+fcsV6ZoRlGmMoJGwN+6xqrPI+bIV+qqU1xC5d1tsTicy57nLh1t4mr0U9rvXnb+gMO1lv78xa4b7J7yzeWIybVaHu3hrh9sYWv8mgFN+q0poSb1BpxBstxKMib7Sm8NIlsQWtwZcEvticLZAEJAq2gSn2ZFQ8vkNXo9dlcIiZYQvDCkVbTdw47D92/nW8iujnC8+xHOj1pyureLKcGJlYuMl2VRxCAo8gZ1AMmZHSFuIiSXY1Bi4kPLiA8PIqy0taqLRkShUGRygTiXTPC4v2o2JOPmxVaacvGawtzO+ImxTGcLpCuO6rp8VcnKd3eka4QxKryWR7nJrBB2y1M0tzhVu72tAAUtwJ30J+Lt5fvlraE4T3l4/yhFluh/ZROWtmVWCmeafSq0ayp3RrEad/F93R7oRYNtBNiDRCQnQ9ExftPh8tYTijJTlb1flQiRmxYzfZgSONr//+mld2vPWHq14Vbtt53ZShZnvHxp5tN7P/58yhdzZ89sHhdzaBz1/7Y8dVI7Pv++mSX4l7ivopFeKDKNFAPCX5BbhIjUJjBxFOhVMwNcqHzQV73pOH+X0obLY8aTabkCnV+Xdmy35BVkzCIOnNZpsIqx02iGaUZ7AdxVylw9xgkWRa7M/HfDDuaI2H1hVtaEETwIOPlvDAnvy+kjiqDlHgXZExUFAtKUjTxT6VXBLmcrZG2kRXqGOlDM1GxpLICGuDSauCUlsiyY9aNbq2nplTo4eevuzHu6ZvzVlb5xa3Xfduw5w+n/vXHXzIioskplh3ExzoaY3a9QxmgvbGMPvPjw+d3GQDy5av7fD+7EVwW2DWtLjog6xF9PQifnAT2fLOw7BbFCHgSCni6jiM7+PVZnPQYEBB4aiBteosrNk2rMhW8g/ZbD6yUyflH/InG7GpuDj3UKEUAo3AquP7SgimIThakgBWpx4kJ0ui0aSEQ71FFBYgbWao5B0or7A2k7AwhcGr+UNPX/ParVOvbukuMpZkUPirtWlW3c23b9gQb25stmuF/qzSGmrvBItbp6X+96PD725yeVvZL+5q7oqalfCNwTVTPa//6IVXdP6mdFu2Yo9gEtEmUtY5brPNajtStJpwhjb8ZEinA2pCwSpII1TQO9TYi9Gz5h5aDdU0yygUsQjQD7vLusaNXZOctDH5RIJIlPcNIUdCctMqNDKhQUwXABdh/wcCrUaRgbQ50T7+cJliokapBMiXVDpI29cPXdnVlN5kLaSDUztt5nxeuLJKg5vhlJlx2XuFbLyvOyM8tqTLy0xWKaKhBsQQ0iFKRJcsUIl0Maft7fbZdvhjOyDsrN2L9Ig97AKYQ3r05p40QP/osHqLereaDKnr1CQk1KyaV/epl6tphla7UiYU9Ywi1FM0pEdTrP2QzRbPgUMEIsCw359XDMe/dGMrZjVEimWDg1ITxKDUqTB4tVhW+vKZZf9vZoYmNlrC0xotpdhKU8TEaBODiTmLMmNW9T9UTh2QFF5VtwR5frm5pbe+b1m4b/WaDe2Flbf2zXt4xkrHFYPBroI3Ou+KJVe1L35iU+f1g+TJli7njI5US22iZvrK4uxS0W0zvrF0ri7Qkszzdclwz8op/dt4jUHyoULnz5A/oZ5F2n2fFFFYWGj0GvhwusfAq3U9BnafxUwqdTKghjI5rySQW638WK4zGBnGLadVw/b0yUbMpm+dkI5pqPBpY/vYW4kEii5EVR8wVoG0sPtK1UAdcuXHJblONIv2ytMJ9LQNt80a8HYJE64CGauOhgrXcYFQri1gVN0Jpgg/YmsaaqLd/uTU7cUdN90Pv6qIti9b8s/VwpQV13Q4fZ5CV9vXHicTCN9p589QQfhDooa4Q8TX73rS6XQcKTpNXqU8IIfyfXzAbKgBNcizBTrzsNetrpRH1OoUORwV9Rjy7KLYkYxijS81fJZbKfKXSqFyaBAEPyDfV8LAEWCxryI/njs1+Kq7KHBtvCqLKtUwxO6KacClD3Y2hboXhGRaQyACXCieKrzbKtPN3du7ZEuTJtQGfyjAa69ri7tnTM+CrzRKneZj82cWy3nTgXk9d98CrpvXHmLx+hvO/y+lRPTwlOnBMxkDcp8zuGdCzuLCg0K8IocaX61m1uDGDRRHirSGMztoQmfQIk7odLu9NivD+LyIwVvTUkkoAdi/VNVwxeYJkEC6TGydKIOqgLlk68QF5dpy68Q3U2GDRvudXxjZZAvYEonHXcJTW4RPnL5ICP4wqzJ6HY7miCAD72baHPEaXLn2TeXHHORHMxudivIeDtf5L2QJhHeIOC3tOdOyojlHFxZfxMKcC70wetGFwxetaOvxhcUXcZcYh+lkZPGVE6/ic606G7rrxVdOuhpDEJgIvU7pcEMxsUpprE4/rdCFgkajy0ACjjPokfpyuSIKqb8A6epLdlvkq/otcCMKUf6JlNfkUSojTBB2vP0Clpt3Ku0X1WQW+y9cwhd3nLF4EIPd0RRTqx8CYM/vjmr1yQIYRNLiswl/vpX8aIwl3+tpdmHvOxLBFCeh7Nzn4INwlzuOS+RynauVH/NK9LYg23gc0bte6s3/PhE//y9s5hLHzv+Lz6AXjjihpQIZvSkE/QE/kr6AXJmD6Uz6SFGR0RFaR5zSZxBfhvT6xtB4C4be0jjewjTeaY1PLEA0QRSpBloGiIFJTU3lNmvp6IL6CQqgeNwgGcOCuF20arcoWW+AVd0EpPwWk90fBFPDsxt/+U52VkS4aq7WcM9+zhCKCs/46uqTr/+mprbGDG6bbTKTHYcceYfFLc9mVfxUQTjR2a1D3letKWx79RVzyOIIUIiSwcZ6QIJgS8GJQnV1zpJySvQzCtNFOU0RT4v82qaycuaed1X/R0XKefQKV/y9cshAuYpHDq/qmzzl9BKs2RSJ490zKLCx6BSH5HIzS3i9MbPEYEhtn5roAMvnxfwvUuC/wDuMBkXFXfOl46BhvlmqGgQNML6JBmk2exkI9ujLrb2SZasH461jF0k4qahfe+OC+q7F6qDfnc53JYT3Hb5wBOxLh/Ua7TOvcIZ0kyTx/Tfsn6U5HvNaGjYvJj+Z1uRGrofK5LM7miKCCvwlOsWVqEi+SL85iP/mIvoZiS+kfSo6pUdJEkbWSDLQy2h6oJbUYE0fw6cD0CrxHZ1RSyhZJWmDSprUQu0oT6qwx6HSMYeUFJZ/D04zaLA60Cg1Smg8RIiqgTCLykILEU9KSXfMrIl8gi17IumJjaistKENewaJoUGxf+NLJ+f/0smNltDURksqnbQX8VKQxc5YqbsDSN0dYscHnHtOIIPCJ7mmWutC8n/H/gjktbXhoA34hT9lYVNw3lTA5s69zAZ6+xEdlwl95Mf0XiJJ3CBVIX1eRqlkIDPKK41J5Wg0YzRB0yhvBMkaWDOaRMvHUKYaR3iXjqLSKbErZyx3PIc7yi512kh5B7PPq2RGS0qjabSEIY2Wko5JO5hBxSQG8LEZ6FUbaAYmsdIjbWYm8V4AmDeRbz743KzkwJy+gdSs5x60z56d9eoDA7N6B/16b3b2bKGv78Bu4Fu8KtofXTkAfLsP9M3h/IXls3+6+tZVXr1nze0rfjp7ecHPzRH7TfrIH4i43yTinsazZJRQOcozSSMzgbtDwh14lTUmh5KmdbtCDkcZ+VM59kX2eE7/77FnlKMlRsTeIWIPJmFvKDcw4AMZtfiVFiQAIgRsBfjYlbqUuD0CBuq6EPKpgb45A8lLIU/vRcgLfx5YiZBftVj4879BXjx35qrzW2TL6TWEgQgQReIZyX+qf6dQCL0TDqfaCGMb+up2KnVhTzgdhuFw/Oed1pd1x8hFvIkosAVvARYK+Z83e18maJYm6RqifXDsrVO59GC79APgwj0SFPYEeyKXPpVnT0lNtRV4nfGflzp11pdLIkzHOMzm/M9LzbT35ZIIl4EIsrVdOmQJA5d+iB2spIwK+INhcWdFMJ+jzHp5LRkM+Cm815HK54L6i2r4eZPkb0qeuGz5xjeEvx14SPjo15s3vwmMDx0Atjc23viI8Ptjx4TfP/woCHzvGAg+KnxnvqWuu7Xr8kZbw+KOvqXu+b13Dv7opyuf3zlvB3nVo8IHr28snQDOxx8HzhOlja8LHzz6Q5D5xpPCGz/8sfDGE98AGbL3hx09nv5D1/bdub51zvKf+mwn/3D7L6+2Y12G6wAb4UtoHfLiGqgMwyr2CKfX0ZQDqfP235wCYkMSr+TYI6Xyfew5vFS1y64qzts4OTlvuHReniKeR5fd9DwiirznDFFLzOBDpnRtNFZD1LhU2VRtjSqVUtXUUnUFIpbI5PUGg9ZqTWUhCmBzafS//Y9vnchxemBBSywtMpdHC83+8Xg2Uz7UApa7TSqHWohxkRyLtXioBefj8DdZLzPHg5awQ9fR5s0EbczyltundK9qc+qCLTXesEmuvwecG5PBFecawN/M5lC8LmJL5xsDM/qNwZz7FnfKle+Ohdtau5O+mkjUKbvq0UeFd6j9X6yh/vn5txCCUiwPPkA0NhFN0j5LA3p5pGhSq44U1Tqk8YfpSk1tfJsl+gh+C2cnpEbv+ovrPisuKPpkv7zec15A9J5ORQgvkrfNfKefoQO0T6kNaO22gM8fgLTWQXs8IavW6ENK6Cyv83l8ad92H8VAny+gtymB0YMP3jhSJCxa2knrifS4G4nlTDp049LnbeDv7CVPzCCrTswgn82EDFqNWVhqMGvTzcJwIJsMgvV3gojFE4uNucHag1m1wedwNMSm5hobLYkEssmy0NR+mDv3XGerT5kFj4L/xrplLWYwykLYiTBRR1zBNxn0EaczAiNneaeKcJ6NZvBmzrMEj0MPQhWCobMqXqU8UlQx+ojuU58vYv40na53Rk7TE1vST2IbM35cRvqSx2VUzsIA1btEpJMwuInzqSBXSUPCwNraBMfGC+Dsf/903RWbrlpy7PvfvPOaLYXi5gVzZnZ3LytNcduzzX18VhPqaCKXNLeHNdmrrluyK6x03rBycPcU+FPh1syinim9LiEnLKMsjX212a5ahKTop+B864i45uv4FvE4GB3pIUlGPALYBvWkntTK8MkXZ8snX5x1Ky1at0yLz77oNJCdhoP4+ItP7VLy4232ba58LPPkFEj5DEXR4ahWedImVUnnkVy5cemeIXP7In7xLV3tNywpLm53Dq14Yvkf395y8uu9N8LPT/cuDq19ec99b22ILZr/qccC1EBx6F+7WalmeQVa1060rhYiSLTxPosTOs9aeAtaRIsqAAPji8id8njCNrx4Fxxykh4/tGLSSmHNgDcjoIVpBpWT866ojbNsvBZ89aFf3D8nFrr79aNLXTHLm2+s+cHN3ZXl4MPqbP31P/nqbWtX4LU4dx/8/cm9Ly3FtEc8CL+L5hon7ufVCl7F9pgUJoVWJ8cxf1HN9oTlYTkBgEh9ELACxJW4G+2slRfzfAHEx2cDPI5eAoziIMPIZLrQwXBYZz5oMtUA3WlXFWtigWMvhWg1e6JFEvt/0vjoRjD5lIP8+GmfE1sv8DqC2w9EapyahQtVzljNgc8zzbGQY4g796LEtbB5yJpsqoUvCbuMqYzwajxnFpZo/F1zhb9VM+w/phQdRIUmDyKaRIjN3yfsiA4tyAW1m3Q6o8nkhy58lpbLf5Y3mdQgIuWB1UZoPIuPskGKknEetLtcfu1BnS5m8p+WTT4togr18S2EEwdxiIdwxMAF6CUmU0HMnpEKYXkZu/yQOd7UfP7RYMKtW7iQdceDj+qzLZMwa+nyCatMdc3CwaY68//0TY+oynJHyZHcJYnL+TqOM0Vi4Uj4SDESUZNu2g3daMEJ2oAPbjirVqpZk4mzkUk/Pr0hedrvT9s+rRzeICYcJ505k686umEc0WzGJx26UBEyywV+x8ShC6QJfnNKV8uGvr/8edtfH+zbNzDo6FnML9zV4y1eMX3FoC5eB66LB7Vsq9dVlj29/eOZiwJrXh25/FvXF3v6Iy087t/XBNvaKmtKbUNrmifm8KmwBmr28mGPMbzXmvHVpKHb4z5STHoYSq6HJqPpSFFmJE5HVKq6sPa0LV05YCE9HjVOPl9hvKhbPjYBTOzDK2PjwkeGTuwUUrE1OeHq2gQrpLmavLChrFxH6mMseEOXqAN3FWK6P7XwITXCIMw3AYvwgSjE1YuK3ulo/Pjjpo4Qfh3hGyt4gs9E3ZPkrRaJO7UqiTENp2VWm+y0dIRdOZ1eseSTma6SHAefTZocmuxFMxg7hGcmji0Xvg/eQ2ObiQxvx2ciPMBTep3Yh8JQNHFaabEqy6NbLzgcodpBq8wAbGm7Z7u/tbXGWhl/046DG4OLbKGGZf0QTEyhsr5Xo7F54hq+g4jCKK+Hfkg0p4hRY8Ziz8BkKnmkaHMZYUqlbYQtzS2IIgoWNjN6yudzcQqt1uoydFqtnUT0dK2021fKFuDLpHTUJc5GANJRQeVcyuQDDtIgRYn73i5mCxO43ZltbN7eYIokwTeC/V3CX0BtKF6bEFZ6PFz0GxqDyeiyxi7kEbLIJbZPb3D6AjTyLHJdwp+EDZmER5XNklazOVH3Z87MKmjhnUuzDDGu424UfY9pfAQn9Ek1VKvtMmATG7EZHTKze3W8jj1S1GkOqdVO2enyQahEuuowrqqeOWxTMd9crKPBZ3UJ9id1jYmgdch47ryECWXJqsN885hLF5+3WjhWPU08v9UEQc9B88sSS/m8jeCRJSIIq0oTikIltp4RldNsNSPmRktrZbKEzWqzQ1nad7qmJk/KPuHK+7Wls+e//GSCEAiUw8rJi8OACSGovIFP/N0p/FJFkXhBnigvyGLgAi2gCQksFuprkVDLVcIPnyOPNazOCvxFSzC2jHxUlNaxQ1Xy/cfiirF54rpcdv4zagPCO0V08sGYSsEojhSZBENwJq/L7TpSdOs+IVIcpCgUdyeg7ZNg1bkCaSkXn5eS8vjveVRy6GWRDoBw5NL4ArMF3ikiBhahxdo49pHFLJ+MaBjsnRIAOoQWWDqB1rkXIOePYVwXXozr/tWtlT5uO7IzLOEiEryFcUDHWZ5R4vMCzhJmzacWi4f7lLr4rHZ6/FRQyTsV6+KVA4PJurtObOrZ8dTqr/163dbfCYP33nXbPdNvmnfn3ezVZ47d+fPd7dd+8MSxczeSmff/98PfHP7V0j9Ivhnm+78g+noRhafzERv2x3ibLUmQXsKLvGx1EibHLTn3aTSa8TvGbfilzfepC222dPardIqYPyKa6/FN18jcTZhu8JuvHetPhd3e3APLl7Ugo719w6IrerzRqcsbh6oJ2bZtxdRS2G30uuEPsfGG9whT7c3zWvi5OXxG2jrhx9Q9ov+cRNKSVjK0BinffbyG0Nv1QRg8y+vN9gRMnLUrNbSeZghGqSdM7k8jkbTvU9P4zv7jFx0bN366Kz4POoekxSKdX1v5SyV4d/7EApGT1+etgHtqd9Rek3elZtzY1bJ4eUfr6/9dXrDDY0+Pr5csFemLKV32hp6m0OCS+Spg+KK8fL8V/g4+Gl8+ce2oK9DapYkm4kq+wWqJZ7M4QOKzWULtJdNE+kjR5SfUjbBxfAlDDouFi3v9/hbu07q6lmx8kkNWqTRMLOul9+NfvLxaKLdUdtYHwlXta3ilyzSoWuj37n92ljXRPoMHqWmxua5EJnq+pnl2sNDcsgQv+z23DfNXz5svrflSvOaZzusHk1NbchELY+jid6XzLkW2af2e9nrzC2UOmLVxU9+ycKXW3IzWP0us4GvtdneIIFSqEBFiQ6SaDlEmvHX+LJ80m7BPZ1LaDtntcd8wy2bjw3J5njiUnXz+/EV1Y9wzLR0Sl81U72uH0tpX3LhyWReKvcrIFD5vaV8+Y9VV3sW7V65ud7SV7pkzY2TRCm/b7LYlVwTmb566aXb85eMLn5gD6Olzwwvmpjr5pnjn9OnJmRt6fFr9ez0zfPN68l0tWXdz96KWrz1g5f6OcG0sx8xOYi5fw6nVcsIhVuYIMz7XQn6W1zLsIU5rUcs61Yc0GpfltMzlrvg84h8QmrydvXqXJfJPpV76crJ4/Gg1pCxBMZG3Kzbn2zLWIfjykCXbnr+GTfNZhS3ZXUf+PDC/D9iF92YtCI7V9U6LqkUbNhXpvV7RhuV5p8wLvWd5mVkfT0ouZsLIZM+Ew3nb6UvvSwdGvJEmRV3glMEL953DPxgbBu+/bOrVC5vDBhY5j9hFYJz18/n6pa127E1uxX7lvuk3r50eN9W0zd24ADzdzIfK7oDQV1w5u+AM921aCp4rO5Nln8qI5j8Nzd+Do1jGNlEG5Rwa2kwTDK5+amiLxuCz024kOkhJ5C4u3pUdgy8tbR5Nh/VazUt/tZhTLeC6cCzqFe6+Sfid3RcLISehXOAY+yYZauj1iqVNxs33nPs+nDm90a3IluuaD6N5hoghPh/ijBCY5A43VDLIT9A7KY3VT8gZBlcdrWLVUa/BdUerJmB1uyMaKJ9IBU1UHy+545spT/nflRHnCu/vFf5l8QZD4D5cRzwKzAf/+IbamCyAy6Q64g9GYce5H8COnhYXU6kjjn0HDpw7RLb5pnkm6ojnXpJ8NTPieRrhV09s5ztkRuCPZoyZGGFzlrviHTENW5BWRkswRpNMpoQZf9bvDhmULGsPZWGh4I67TXZ7YzoUr8K2+loVwV1YW2wsv4MXEgm5Z1LhUA7Lzm65cCirqhtKO7Ofm918281+nz8IZodm9f0S+FyJkFFYO1fveORb0VBUeNJb3970K+Ff1pjPocErnknP+t53ku02sW6oLK4R/incEElZ8S+1XDr8h/cLfhsuHKpCxV7AgtXenEsLsxO0soj5jFV8ISQ3m7UgXo7RXV6o06JgxM3o7QFay5hlQbtXG0aaQq9QqxPh07JETbWmQKYAsG/jjscv3ZQt2oVWMKm2PJnJoRSt/wKHe9zf6jNJF7grmnSYv/2MzxiMgtnh2kL+X5W46n9AaUF7UJnN0n6HtRAQ3gZsvmC1+xGu2gg/Q7jv9+OxVh/yY3YjPI3EFuRKeRl1j5IhjLheVo9eG9V6vAOFJGSsjGQgi34QaoaAxF6e0SNHf68ea0lOpVQZjUr5IZnMXNlvzUlWMV1Vs6tKnY2X1pAvMGnrdLm4VgvyoUwyYRw69yrZK7yeb641D8H4fC6+sEP4bRbeE5rbA8xZ4vx5KU6lH9aHQZ4gOBn4QjtAGHgVIBw2tSUE7KowgTRXog77bL0wQz5HP08EkH9zBx/U8wzXo9frVCrk27zH413CXhVkoEqli1ExCGLzeOoYIL9nseig7j3ecgwA3hEI+I4UA5/p9S6DIagARCDg+oUqGExHfqEo52Yq0iBu3MIezz8kx+cfE3+mZuLEZvHvioDxvbaF+vKfSqmk8HElDqfvxa22YkoV/F3RvK61YV7i5z9rnZrpZtcsHuFre3MWuTV3Qn73jlK6Nwq/BhpyiRmZ5VcwmYXT6xpXxCPW7Az+bHvMpk6CJN3eORhtdUl1qQaYgd2y/yRsRJSIEet4p04dUCP7/p6a51g1DEAi8DfIW1CEZHnS+iMA0YfUgCQgogUX+0xn5+QnfD7k9vyC4xJxbvykWFH+//EO+493JZdIPJ+s/Pf0ENoI5/Fzt8nxnbOgkusXPQOpLRNYOi+rn7GhJdN/VXvTYCxbL3M2PpXxdjX3z3sgUNfoItP0LD4z/Z41S7b3BU3GmIr8Vk/Wo0jJxla3zwhs3/aZoabGJgyKPvsgWv9vovV3ovhhLm/WebWklqRVBhVU/c3A25Gv+x5v+AHCzo6w07g+03p14B2S9ChOmCXntnxi1T/eKdf6J3gavSHlgkGlXxL3WlW1VBrIK1fq6gszFvUvyCxMp9IzB2qH98weGZqycj392H31hV1fuWlrrCafyrqfeHDlvn7d2F1EZc5QKXse+eR54v+r7svjpKiuhevWrep9qep939fpvXt2ZilmBmbGAWbYdxDZYdgRARdwjyjiEiWiiQs6KDGJAiLKc8lziQujMSJ5McsngYz4DEZfkhfH5zTfvbe6e3oANe/93h/fJzJMd3VXnXPu2e895yw/zDL72tj90iMAChq1x+jkuYQRBRofC0bMqE5nGIYHBCdmVKN2v1qt2temHpQd82h5mMtVVfRbCRrmXPGg7TBnlpxVvGIIk7LFGK5HLQ4iRHq5vCAVVtFptCpPpVhH1RMZqTTb0hocv2bUpF2z060BpSmQ8E6bO36iPZnzqNiPyeLIhyKpsF2eki6B6QrjJXcu6d19iVr7QaI64FBdf8U1WzW+oM8o8ides8/QmpkpF/IfbhEqKCEY66A8SCgNFiKXWovbkrIgubUI8VSHxaJA4SA0fCxATBKFAgWJA4ICk8TgHjR7KErr4rT9FouXOyaRkCNXRY+VLxT0NJeTRZTRcoEVj+WBso1NsaSUrHlYrJQH9H0Tto+9695xO+e0XdYUhvmx8+dn51TPkI5uap0ioyE82Fn/2I8uu3dyZMzGZeymNfHcu4vnLZ+Vv4Ho5C7YSIclr1NharOgdTjcIW4fECxu6B4QLHjpFTLAIRMNBoTQEUAJHjIBbF+bbNBid7sdNGIb+ykHrQ3Rx/QtanU0gnH86GT2He44VstF60y8VlErFZUUZmnRPSdFoaXYHmujC4pCwbs/1rhi+RMRu2pqJMLI4jPmjaqrmCAPua1OE6/4Mbssvy4RMsgSCbkukAa7EsDl6ZjcZFVu8nqQp5fNpbALPppO0P9A65uiRlFd1Di0TIqgXBqX5mBugOwdGOSaDqng9ndIpXUNborjOFrO4QqRZKYD/yuMsrs6uDPCts5dnS91vtvJUJ1cJ63Tdro7U51If3V2xlssLbBlwEJ9nBLiKKYbiPdYAO7JRVv+BSm0FKCoOHpuYtygu8HXMKZZzgSDSMclYYRiDMfGjJnAHKuunhBp/pPDERmvUvnSx3wtEURQvu6qFLHgJ0tMxL1OKkTLfKDT/3l67jquQFuurMkdmQgRi82bW0caEsRKMSIIS01imaa4qTQKFI+sDxdoVpeGgppzbCFaDpUVaYqTt3yhIP3rq+jgndc3xs3IK44+2bu8667LFu/sTiVNrlginB27ZXxlZihvaWsVRo9pGt2mcfsWLZi/sLFxmaoD/Ds7TyZJtixbr9aGNTaHauLEhnmVjrENsWaTssoba3dbpja2L0ipX+7o6WrtnNAxdM6QcVWlRtUkgkCB+Xg0bIQM0l1ZpG15B24RBq3ImOBjaen9mecR7bEZMQVU2hD0B/yIpQNIW+n1lZT7WEUpVVJwmLjTRVtSTEoVLMgwozaK59XPz7eJqgy4hctyLTNDClss/1HQplZ5Ii5rqtGmsofzfwzZVBJH7U/TbHdTJjdrfP7vKb9Bjhk3GP9lU3uE55NxY/7vGb8OvSkzhBK0uj3rlqXkoo6eABvBJslhUlvYLKioIaBF6nlfm3a/BsunzmxEriQyoIOgn+aPyWRWC2GY4ydLQihi9oezxIZUwTKwiyWP8Z3tQataYkMalkAsOXzrrV8fkutCcZDOhG3ylCzvIfAhKIx0Ghwi8BiRHztdMMEh2iDgYscBoQf5LPikuxzKkCp5Vq/X7Wsz7NdjONUmDKBMzhzTaCxmAuLrWQwkBg8BWehSUg6pfmTX4ZqcHgRv+15sxTxrU8YqsVftT99NAP3hzOWXmMeYAvXV4IwI7dANhbpdxCPYvuWQrrNTboje0LndqqC418DLVJn0vrbM/izmFhX6uCsYNgdwTYDBGhxkdDabVcPJZGaj1VpFeY7FSLq2ePxTjLyKTVIJA+HfyjzviyTdtfhEOfa4RhQSlvGRS231hev9WrsDVAfHBO5/weiOu46+r9HrDSaVPZL/A1KIhJmYnyksubBXy5npRIKJe2791OY0SxKA12klD6QCermoGWkN5qWkvEQPsArRQ08lD/NIy/P7dVjlayWFusFB6phSaTQUXOsS++Aw/yKgjoAH/qbsocMMDDD/Mt9HOngitV0w+oA0OIqtY5Ci/JgRuifsa+vZ330U6UgFxWAt2Wq0xFNj2JbWln1tSXProDSSmwhamvhjDk2kKdfSdKyzc1LkWG7S5Nyx9HnJEo4MlCC7ekWZzpYJNY6MgVl0MIhsw++Q7eJ7F0lEI+S9kvql2bHTjK1LqsKNKYdGYY/mTwbtapUjHLBlakzia5ta4Yz6fZ1xIlWiiO3PsD2wsbKuYXSlLpgYncv/Ne0T1UEgcWJUW8BoToas+cHim8H4Ww2dFcZEtTc/KKqIMrGUivSFakTfSnGeyWGs6oL7A0TmLFw4AlUxFEt9LMSwl2K10LZKaLaYUahpGUwjJ6XaFQm16I+5Ul98lOVH6kTRczMXecB+MLjfQu6rXInvG1N93Gshd5WvJHdFdyycM43FzNnYnwrlPyVKwotRsjRejlyDaqI+1d6w0xLPuFQj6CaTNCypHD0jIrMlYCMhzUfZ9pCW8/ucfP7LC4mzDDblMjN78n9P+oyKor8H44hWHPL2PFSDoMbZ/QFKkDmhc4DCzrkMO+eeQXW/1erj+xmmrMMkDjnOls48AN+IydnnlcMBcPucW8ZN2TVz6uWXeLvvzJ+b3ZNojugSXememXQzTI+5o3fF7nGZaZe3rtw9HkzYtjMyZnZ27pW1N+c7MJztdD3sIbFkDq3rDoGXsRIWyYoEFGJlCRZbhz5ERXwRGBnwCRlT0p6EyY/tAj5VpN+vewEJVSXlQyjZEUq6ykFXfyxWrTIZWgLgmEpVXYXx+iJbWvSycKosmhJVm9jyhCI5souu4HDhW7gYYBVaEwGvGrlxv8ZaAinsrFwSy1Wn7Buv6/netEvHeDurJk/p6nHX11voFBy/GWkQ4tD503QqEXcgRb6Cjgatisf3bLi3dbCry7t969VX6tMRS36O6L/PQXQai+iE5+0lqV6Bd5IsSg8AZJK8HAISzOhNSn1MGlEiUn0sKLHnrtf7oG/ArMfcq0oOmqzHElJpOtivLYbZiCDZC8OXckqInD0yciGVbYiLK4cjNUQoFtL5X8dc6tToMaGutY2T71gQn5zIVCP1+b6nKTNz3oRxnpp6OzDT9QmZPpB6OxGztN+xbP3usXpjRDnkSwZ0CnpVa4t/+9ZtW/SJmPvXRb1Kz0C4B6mJglpOARSuqEAVVAksQupZCz7rEtjvJy6CpVDuNig7LQfBFt0xJ5b2EyM8BIzp7xF65uzrRFGW16A5L6b+PZL06PZYJDxdGQzq4zUazhfIf1hScZfAXMIse9DvM+WCjsFsiJecp7iIbzMNxV/3Ixzw6m1AcqdUWhkd8uMGBBMyTLSgrKhgIDNwB0K3Ai+VOzmosxqtDlMFxTBScArFW9JjwaBRe8zhSJtOGUe01j05wlX+W/9ccT1fLXXaxYFIYaEKlV6S0mn48zcP9HTtOF1LU3WTvaZ1bE/q5u2rNk3QdTaPGmOvbQ+NqfJUdC6ois9uW8iaM5WJqCXotTsyram5C9x311dnE/aQ18X5E9X+TFtcL9cM4XlvSYS7Q9JD2SkHNU2QsxK9Tqf9WDARhSqxUXh/e0CC18/gGGQYud0mk+n0epdEfsxmcznFbAhPGg9y/SQd9LdSsJVN9XP9mbQe576MOaP/ggItkIymbMo1J08qMaijrN7q+em5c5aCz9h7JM7mmQ925n9Z2+LV2QyZZMVly8DqoQ8Iz7Uj/Slhn6aiCGKVwu6AMo8Myj4WPARowEVBFDkVgABtwUbGut8yqD9ma3EolTH6WECUro8Q4xGOO50thYkFC60v9TYT+ezCHAF5v/19OefwOqpWInP7PmuvfjwjkVYKzf7R06Mye4x9On9bqslrVU3NAAnytWWJfFUqYiMZgUzUmJk+DciSPkOhP0kY1kA9wgmvw9inZSYMPE+pOVshV22Wyg0shd/VOgZNZmQyFQYjI5M5HZi1zDkO9wg4bc6WnA6yk1BIsiI2KqZYkc+HTxmAycGgQn7FDus4wKGA2vjxvOctkRD9Z/bpBGs0cX5b/l9BssaTRIqQ0UXjeRf4Y2OUTQzdhmFNwXpmN4LVhyzDlEMcUmKE1nqZxOqAJEznbRTUGjxSGVkD/6DXZ3IzeqSmIMPpeIoK+As7B6TyaATgZgx5AczhNHGOIFFKFPuD9PgDKx/ThQLA4w8opCueWn7PZpM/CCiXy6Z9YwV4luXzUXC6MiZNJKDVoA2Y8z8HA3kryNXajQ6YSLDmWCDvhYSfAkiHvYrwqadmCDpK64wzwZxMmYGVucp9bfIcxsEd1JvIxId9bcbgoMMZd8XYRD+l5YCGra9vGMWLOSfcKmTY7ysrNyp1aM0V3G9QdualeHgW9x5sxlWdw5iDm+YoFFKL/QvfKNeO+0I1lvxvHXapasFKldzu/E9TNOi5ZafN6zcCl8uu1jAv96q0eoVShxCUZnyP/DwdZRJJ2qiUG7XbrtEYlQojTCZYiy/4yBGfz4g+BXUqhVmH+Y/OEv6LIy24VbBrZchzlkEdlClxtZDQwwCK4Rhkyxhsy3QmQzDiY8wmJFwhzuGKs4RhTU6gbUkMyk5JtfwxG2XzxRmnM5kocSg+z3g6mx1ebTHe6id75uKxmPJSIFBTtlmA9wrKmtzqwX2R7nkNsWyH1GV0RLLBF9QmnxvEw37dlltlcok/CjiH22W8GdqmLEqrbrNaLO1jwUfekAVxBGsy2pP5F0BOb3YoLQ6mwOQBxAvjES9sQHTQUw8IOo2aVjNQBSk9+Ej/uZ6GpOGkS8V3yAX8Q85AvV6j1qqBklEzKhW2EipMCC8toLhfyUBag+uCBuhB+SmFCpcA0dQpvd4I6eIOQl0qReUAV2rairNwFm5oeD9ZV9hOjsXm426E3M0sPnsNEPcAce8Vz88kxKI3DH0Itr7gDHs1Y2lX/qZn4xE7z9CvJWjGWJl8PjH0tSnViPNRM899zrLMNKqGaqMmUN3UIWF+ILivjaqY4K5wJx0KxxhYW9sVCOi7sp5MJlmF+4hWCVUQdsGuzwRo0uPmY4K+WxEM3ej1Zt2KMROghvpbzOGuiNWymRbL5w0N2Za/aTTSjCebndhxo9gYz2btx3vjomFEUsGd5M1kwvXJV6nmq4/bLGXNxYp+H0lFijSo4wv7azk+h/dUyrJFxYMVxAWWItka7p0jLTc5oDimHYlWcWp0dQ2A8XlPrlj24Ixbd2Uy9tp5V7Y0rZqYHHvNltQvKzdG04DVbZobaqm0eXKReMu6hsbL8rdNnp2acMmUORnvxIlXrWvbPIY2rmkbJVw55bJHOkd1T0k1z2/2mDLja1uXTa+t+332sg2RKJupWfhkd0VGZ/Dlmmqq6UWh0T3VY8ZN78otfTGzunNhbyAFr0b89wvmOrCN9HDqIXUFlos2paJZRnSYSQcqUpn+HQ2YCr2XwLYjuLcSicPzNzLXnWskz9I+g24KFwIqdRakTmbSEH30lcIn0efYk+caJXvR54KCFS4U6LX0dhpqaYCPnnfT82mGRl8fhkb8tmSv+BxIDVIUu5s6Q2bKKgt42ZWU9KntCiCR/0yhYYGkBfwMz8/+mUSiVpVincLxA5zEOJvN4uHqxW+V3iRtMLAMiH/BK2/Rh/D/Z8T/iH7vpbfSDdCI268LahpA+pAAGBZQkfrSsVTc15duyKfBL+mt92Mb9zL64t3sVAJzqzjFjcaDihH9KRpE6qn3YcuIMcf/cRJzLx7Diks9Cp8tvIOJj0wamRt89+gFmTffYKd+3QWf+a+7EYTYn3kCzEEU0lA1Yq2xVKCARqOUIrfmaaWS0xKCnBhuWNqPw2D8IdK7IU2G3hTmE5PtVNCqUkemz2zMJCUqdrd3gqdlyfIJDaO2THe1jUG4tdPPgdeYfeh5WiokcDIPupVWUXpg+aNO2H4vbvuMfABb/gSQYfaNfMZ2cd2Xw1chYB+n1MSrmS/OHLAjMyEzSh1ArVZKZUq73Wr0mKzKg9B6kE998YeTXPHh3IkSEFlrf9Zm6c+SwWB2yiQT8A0Q8iey6MNZdAXToDBU3EyshXfEKwDeUSoDUybW1YT5vK70KzgFXw2MczYvXtFZPfbKma0TR7wA72NawYP0D8jaOKlJIh/IzB6piXICp9OOXBONRiWVqXQH7fCgSoQfu8HiT+QMHCcQYtaVmQXyNZycEN8dsXB4sLR3xCuQUyr9kyfXRf06Hnw2/Du7G4O5aNm46qpL5jSLQA+/wnSnj0PAHCnQXRimueKfp/nxYZr/jwhLH/8Wwk4W+aOdfgXBuY/Q1kXVCfYCZV2Kf4a0x7NF2n4bEdlvoiJwMfu+jY6Yh8+dow7lH6ZPsX/RSZAemIJex9DrWeS1jJqCe5qfs9GPsC+hqzHBJCWnBqQMUhL3MsxF25mL6oa9oG35gOSxSYPnxPxo7JwNfFK8J9JX4F6BZvEZY5a5aMvy4j3Pb00+MEkCSE3uOQvZX0xQU4TEBfW4iThM3CPEDUZouMfIeOXGeEg+ohz3bPb1soLU1AUFqfjoKalGILW2pMT0f1Rre6bnwZveK1TavleqNV1fqjVdP1xrimlkoZ8fxum8OlujASEjGAlqcaZQZlteZTv0HTjhClqSbyAVtASR/1EF7YsYp0IB7bfjhHjrynOfw6NMWCeBa0UckSF6hAlTVqpesHNGA3Ja8NStJ9qkJoXBY5SqJNQOlcpuIzm0V7njha37smM3dSRnPjzrKERcxnAwJzGCU2pPe9fQe1O6PDa7MdSQjYKbalggaxldYWUbG6W+S2aAzyNBldfX8cmCJwg8GSS04xE8IapXqNNK3dKUFPJQKnWEzGaDPKBWKwwOA4q29ggOhSIkD8HQg3KJ1L2T5yOWkFweNt9usUTCRetODpB8caIf+RzFvijZQkqk5PSSmCBYGohbiKKGD4+QsWBSiZSeHo05jHrZNM3X/+E9uOHSy+oXzJq/yX7Fhtd79v24YsrWzn0d90s0ppAn//d0+/tLp65c2zBtdu+Co3XZLVfVXrZwddPtlyLRzeUPwKfYxQjPLJWj7hb8DkfIjRxgjToUDiNs9ghhxhzeE0mb3dC9xywwZmg+AlRCFHfa3yMwily2JafPMmp5KETJd8ZivsztFGXX7/T5qhy32+1VlWU78aW/mAmLrVcvPrNbN3yidLjqFQsWLDZlL2WLQjFQVaIR4FtWvzxz7LULR429Ymr9ysnZBa/fPumF7vX+3kuvvPrxh6dtf3ra2hXTVjvpf0DwXE21t33N+Kk3LYjIlVVTLu/a8MyysOd479xdO+9+YIpsxq3T1m5dtJxe9NWtIq825P+VqWbnIF7dSHT5dES7Z5G/FKLCVITa9yx25myckzRCM+kdHVqVUwVVDwhOJ88GWcjuEYKYdGmtyW1KmaAamnjeCq0PCrw8Em6J6MPQZDGbbd6dMlmF1sbRtwPbrRxXESUU7HrK0NP1lHbSrBlP2wy1M0/gzenigaz+cmqSqPKC09mFhsGEnsNpNkyxMJ6+DGpyUi9fOruDR3/x0zc6L5+z/erWy8e3zK8cRys9Tp3yEs3QHzMb6zf8dG7vW7fupw/k//HB0gUPPbxih6DjU/RdCovnVH60ybTgwOU3vrxIsver+zHdrkUyfpxdzEngJoj9zI78UfhTRDfsi/UchnRapZLQmDIGSqJGOv9BtRxgWmo0vFqpSvW/hiVHxF+N8H+OYs+dqZ1ZNoEBl+6mbNybmTQ5g1kFqrykXlrv1cNbhj7cRYP8knDSY+am62EyCD/+6niG2arVOjMCaAZNZG1XIxjfYBejtd1MXi/KH2ByBOYtQxjmgp6iVJQN1yhIkRjsEaQK3PdvD6VX7DQYHOqd8GI1CoViNh3P0aA8RQ9o/p03ev/l6nePfZifklg2bf2aDRumLolxQAYUz/9jY/6/8l/mP8ufoaN73llz/I9f/HkFjkuopxHj7UNw2KkGwaE3m0xWckrkvjaZVWHymGVSZKN3INQcYpDJvcp9k4aExTFbouAg10tipB9SuupmjhtqmTk9ZVPb7O413XFwtI4FbO2okEkBOzsZtdlT0wj+Egk2Vl0CNEhLAmoNgunW/zd15D3DOjLw1LfryK53ln2DjrwW8UJ1SUfeKri/VUcK//v60fa/pRvv+Kd0I0z9N3UjolFBNyLfO0AFqXWCTy51UTzHe3iogDyvckld0HW/YJBKFQ4b+lRfm+MIUAoWn0IeCrYEIa9TGW5RuHyIbQIyWThEPBacX/wi+0E/JbYhHi4nyxX7iaXEdBE+NcI0ooAW5AqlsFJ/oVEk8PKV1TV+OQB/Dvn1asnQSXrUHZXpqFU+XvW5VB9J5DflPwPXShhFfhuck/+rQmfy19fv7YIbvt7LR5Jv7G1ojthUGZAH1LxPRg3dxtxO8N1HeOIbdD///73u3/fduv/kd+t+pDevQXrzPSQ7FuTZzRZSLtYqQ2g/IMhkliAXhME9nGBB3v4DFk5vYRifBQCfamc0mvDt0OsLo6+KmBKh4MpPaIoiIZ4aMvooaC5HgswFDdRAH660kkglpS73ITj3g/y/ZxVtP5i56r5xi1659b1f9r5Gnfvef+SWxC1GrUS+6druFZWr2GQ2/4f850ztqMVPbbj9zRWAA+qDoO5P26VDK10uXqfRu3s+eGvS/cvuewjheXv+KOEHbNNmlts0W8GmCWo5p23Rwn/asg0nBofN2/nG7d3zjdvSC40bLNo2FHHGqUZqgyBQgOOZOp+vDtbdJ/gsMt99kbSlAlbsESyMLAMze2R6QNldPGew7wiFqlw7DIZmFbOjqqo5gZzv5qbhZRnWWWQcwcX695CtAHNpJIEYSYdLO7dGgwQUhw2JXAlHvNTQ9L/TK9aveOPGa15YVj1nHL1syYpXN7/1q2VDv82snNq5rHrUyrEbtihz66b1rKxqWHNJ27x6K/2euuLJTZcfWDDzxxunXDUtpE7/aN2SvXMO7F37AFBMv35c0zUzZm1ruunrP8+6bWLHTdMuva0r0bOCIv1clhZ0PeZXvC+wRNA7GauU8KxUGjSbET1FDe8m7CtwikS8JaGPM9BDUSr9Do8nFd2pUokx1zfp8/7z2Zet1unDxZENortgoBlpWE+OMBWL4E2AB9lffGqSN++dOfXqKdEVr1x/7P0b8n95M3A0Mn50i15mr5/d3LOqegX95AAAbmBgahsaVt49Y9vbq/J/yv/1L/l7fmeuoi/lHClPtnL2DzeO7r6/d/fDjAsr8YKfdhb7QIiHsa8RRwL8GKKFlWoR3DxaKYPMxGBv44k2mYlSG4xyCSU3UzvUajEeO4kDTO6E9TVyGihVYt0cVtDBosdBlzwOEpKdURn9TaOG3ru0zeqwuyZXxsCtNZKvqup9Zi3b1CSPdLbAhkgwFuj45NL9CKYoYuh1CKYINUtIIa2kk1ssJpnTBG2m+wUnI2cFTt/BRmQRGHlQxkolntt0ugprRC633G5NncwVvYsscS+Icsw1Dx/g58UylmCpRBnPpi8eLSnzLSD2LZZkGgJGbir/9Zuxu27amKutsaQXdh0dvWXL+1Oef9GYGDdn3YszH1I5Eqn879LLf3fP9paO5XNTXRtafvlyXW7v/VUzpy9auvnNe3EveUT3LWTu7TVCm9YGeKhWBUMhwl4hxhRCnoUNuZ2uhMkFra49KLZgEhAk7mcYlSwUqkgji2ST3VZRYdPd5vVm7bfbLupPkC3qEq6kjUaZT0E8qoI7Af45d2LCxrfmrds/q+3KyxrXzaha/Mt7pv1i8mb/hoXX3fjU/lk3Pzdr07p5mxxM/Ys11WOvnz312kuToiOx8RB2JJbNu/3Wu/bMkM3YMW3N5iXLyX5wBxJAB/IhbJSPmv0cpUWmNCFXdWi1MoXCwTqg435Bx7IymwV9oq/N5pFBLafQ3eLweGUMywbsUrLBVHQZcqnz3QWxqhstLz4+cnFfAW+t+AE4Vxfnho7TnbuM9VmvZpzqczIXfQVyFG7GjsIWMhH+UdFHiGXeeVScgg7ODWIX4W4sO3PQmt7P7kb+wT3PAjDsG4TKfAOt80Hnz5wQ/Rl2EvTEKzCRSUIIdxMPTWazV4udAeC9TSaLIM9geGmHTQdxDOrE1sjvxC4cvX2+J1Dzz3kCc7a4tlx64/c6tk5su6y2hw77XDrVBO3Qzyu3Nl5xZNHa43f+pOb4kksfenDFrcgoICdAafacyXciJ+DgppteXoTWdPO5zxmK6JAENU2Iu1iJhJfLbdD2gCCXW0NWZPsFK8NjL5rXs34rAH418pJT/tsMIy3/hYqThASi6ZfQ0ovZfoAzP5LirhdhXHjjns9+6FFM2Tt/3YM9i96777f/Z+07gLs3fy4zuyekkigk26/rWtJs38omMzeco55iGmoXHtx83S/WI+svPwCqP75RNrTSVOFRqvS1LS+9UTn7yo7vP4bXu+PcIDxM7H+X4CiYf6oYzhaNPvffDWdH2nt4eOj5O2l7viOa8Zr00wxwFhvE1v5yrdaRbANtWIevQXx3juhwM5GpWej1SUL/JDVFiLkR/eW6Iv3DVpH+el0YhvfoGBaxvtq40+9Px3eqRyqPb6R+ECdASx15yZ6kaLv0WIkWdSep7wSp2/qvNhZo37Dp6U2/+t0j+d+9si80pqXZKtfIatZN7lo22rU1nLnqr6+JlJ/18JZ27IUN5u9+W0ffo7aGTTJbReKWVxZi0t/zKLFby2GC/o1kJy+FjyDr8ENKfhBQ1FdUc1WVmLe5BjbSv5XcjK7vJdelByjpILqMry1E146S7z5avCYrXtsA0/Rz5NpjxWv6rwrX6tH3vpRch671lZ5pHRx+5k0IpnclT6Lr+4rfDRS/uxRd+5Tc9/HSd/kyeK+CdfQpydXo+hPF79LD8MboP5Dv7ifXlIdoQMnIl8n1aTCJaHE7uv7j0r0txXsjPl0CL6N/z56ilFSbEJXKJZ/QAqVFAR+9Db4E34V/gQwFgQJCJWDkEvASrVLTL4mbfbmsBZl3ipT5rcvZ+oeyeI+M9+P8OwrNvUbw4fp8HtDrAWR68/8JFKuBPP+P1YgHl8CP0DMXk33FBmTRPlnDbmNpFnwiaCmgpXZRD1LvUn+hWBWkoJRiZHJGGqmP8Vg/U8UhmifwJqse7/ujv0voK4Zuoa9g/rF6df6TVaswn99Fv0BPk/yE7P60ClGFEioHFAJlh5wirehRoH8+UtAKasAu6FwddsegktL3s6x4mOuLV7NU84nY2dfnris/ZCrusBt9xfDBbMJ/cjV04Io90yuiM+7bPCURtXk5nte67dHk1Cz9QmXvwb0PP7O6ul3H+WOTZ3z/zumT4iGdsU4875QtwGhF9gvBiAsnBigBgcoh099DoX8+Qp9SDCgxjErboFXB9vO8wy6mchCMx0fCqC/0AsR7ELCqMhzCf/wge8WeWZHo7Ps2NUxuCut5jgBHByQ/qVx95IEfPr+6ql1feenudbtmEti+/rUoQ/k36N/QEVGGztWKtZaUFGyT7pLSUrzLLfLXNfl/o39L+0RZQp/jBcV5HxN5eCH63FFyv0e/9XMb8m/Tz5HPPTb8OQi2wV2QhmWfq0f3+5J2ivJWgk8Gtsl2yWjZMHw3ITzepdtFuSvejwPbuF0czZXdbyn63KfkuY+X3Y8H2/hdPM0P3++q/HH6FG0RZbF4PzXYpt6lptUj8H2d/gO5337yOaOgQoJJWcA2yy4LbRFvWPjstPybiNZRUUa/6dlYVvNf078HVyNZTQpmGmJppaCSYgTkd78EVWpYkkybpZ97jcJbPOT0YfCiUikpE0rCj0vObaV/T50jcukTePAJxXwisFBCsTI5KykTQSR+Z7HLMEL67iwIH6Duyk+ng3Q74uqEYCaSh4mEbMwAZbcpdUjORB7+4vXC5h13wnahjJG9VVHE6OCWPTMiFbPu2zQVSZjPU+Dh/PTq1QcffPSZVZXtOt4X+/Hdu2ZNTCAWxrTK5qeD1xAMVgyDKFlYASBoFHarEstRIUYhjaWIBJ34ZhnKbt4zMxKZdd/mESLUXrXm2T33P7+2eoQAUYVZpHegNf0c2X87lUFBvw7qBgQqIbVAy4A0puo3Gp3afggLedkLs8Sh4RPtEjBc+aUB4L77dk/cOXf6pk73Y/k3e6ZP6u6e3NzpWnv8g++/Nq9pzf1zf/sReP5fn3r00MtHphTmVl5z7iEko/+O1uNxsa84j8u+lZoOnJCj5SxvMOPNwgFBa3QbaTk0GmXmGN5lG2iTxnFg5zFK8d5vv1pdVD6FPLJY5lHyUYbLJ3Fj2UzaLj7KhR4l4U2Il9FzBnrPewruQ8vnCl9HDulcsQFr2VSXYnSIOIJmtd7u6UNvTJ4Q4PV64/QxATAvAeCkWNCoAoJAK43BGHjdakrExhzWrqkV8V+I8D+K1iJE/VTE33Puc6EKedMezs7J9SxrD5lMKFjWQ/0r9pgcF8fLQ2dkcfYUihdNp81muaef40JyuZiUzhWLAE9k8aLVxYrDWUgSVjzlLCKPn+M77znoMa/0Fp8iC53plcXJrHEyBqP8DpgKJO6UXiyjXcjxSqTgK3/QpNWO0Qwd9m2cMHdCaHxH03Tz/Jn31ncvbbJGZm+8qpaXakzBn4c6b++aOXtitG1Ci3BzwO2ruSScmbpw+TpxbveGc3cjvfs58soHxL7NiRaKqvDj8kmPBaqhxWJXKX1+Pz6sL/ih3j8QScMKWDEgwJjeDk1i521th8k+oE8opX4/Je0Ph12J0xRl1va7XCkLouPIJMh5wehFEtuF6e34S2RGhI9KtPReCJbfN9DrR6D0whiBQ4Hh0NsHevUJMi+j0BRanOZOzhEi2uqrqstCW/Dtoe3VD98w9oqOzNTWhZs771nZdl3NbGN3y/SZmy5vmHdN3SVjG6eZ6cCOltCkpurueoeCW9M9drVgMd4l1Pd0T5nRDnMTKxvHtozGeqEe8eKX9J/IzN2VYkxbp+ZQTCtlFTYW60hBhzs0P8Q+xTJyyLKUW1aBFBi1r80ax+HtMbtbht62SSR+3/lJcbGdlyhJpYaKORLjsheLcfEBXCjGuBAsibvU+avBPRtVYb9Z3ix/UuML5489ASiGkZ/LyQzRqvHVtH3ov9Qe757x1RV6aQIIV8R3ZfIk3rkJ6bt3oZYKApMoYxQWfLQQFMtYgcKq1Thwe1YPjRaNplmlQwk1OKitsiQ6NMqPBYcQjHY4HBwbwOX5gYTlzLtGYOQqjKdMJo/GelqrBZ5+mSxMnwZA3A0oFRfUdT1lL6bDrR4SOSG5fH3u2ZJcxspaZoosUIe7FIlCigG1XhRQBCeB0YdhdCg/7i0CGWAHegMJznIG6TJghAhMxGc41S4KcSz2Ou5oX/YgxG/mYc4aGV8bywPVm2YbJrZNmzV7dkLI1IAtRpNK0abI9/rmxCZfM7b7nqWb23YLo6bNmzJTpnGCh+Rac99XSm3tykumbGkW7c5StA6fIjm2IG03XUg4JFY5rsZFwZ3FxxPh5RM4wf6xJca6LQC41f2BQMTdbzAM77idF2NfLLeOhGZEgE3MVQ3ElWXYWCEk6Xs2/qjXIqtZ3jZx46jOe1fsefj6z/ccjnTWmKXTZxyaSL+T7LxnERPwNq3tmnhN+/7H7vr0Vnl+rsFpqAisX/uvU+chnrrq3API1/oI2dCNpJ4OAo8SeUZYxG14wSRn1BUgzmgAhCoUTCtPqVUq8aBgTtQruFU61YxVNK75b8SukL38Lip8F7XkTC++D25JHSt9Mk2GgJSC7RovfSq/qheszJ9x+sxadaeWnkG/8vVvXPRelYJ3REl/5oXnbkc+3+eUi4pT9YVZQY0kt17r89XC2gGSW0eKU5aG6QFBlsA59gFLjHK4eYMDqcsqvA4qpr+qqiHRr1KJR+pLfC7+zl+8K76ZdMU3kaf5agd6fbL0QC9+wkCvJVZsjC+O8fjG3DtpQxcspUZI6r3sBd1Id/dM+P7CubeNj7RWg/GdU++YsmpHfVd+/dTJ6aaAZmZXzxTF7KnZ0SFubve06WCWyrlyTMeahtoVHbmuKqvKvaC1dXFV3byG1nk/6Jlkj1c7xk0cn49PmutKjXJOmjtNrEM6dyfym75A/BvF3ckcUquC8C+Z9iCHCkXAQthXsCR43M6Fj0kwG6sN/W53LIw8lEJ3km9m44KTQjjZXIUtbLi8eT0xCHri/BWHov19ypaJMUZW19u65fpxP1j5/YfW9H9vVbSrxijhI62ZGfMmjEvUzNrYyPh8123q2jbu8BP3nLxWAR41uHVBe2p6S3jRgsmkd3J3fhLjYHcjTgkT3lBQL0AIXqDRDyrVDHA6+iRaxQP4tSXVLLIgYBxfv3M/rGR3f3lUOobsSSB/TvIIO5/YkEZqNLhM1LiViKOvx15dJVeJvLrKmvraGliDvLpady0iXW1tfSRWERtoq9DUM1ZZC6XltB4t1MALbA99vt0ZDYW4VhhhfFqFOl+6xlNbEfVV+PrT6ZamF0aPbn5BEFpbCP1z4hKUOYqFswaitbL1k/mn32SwsCpFa3a62BL4Io4lxrYVO5aVpkq6EqGKHEuMKEGzvkKzsp7p0V6qXavF+ClY20DvBbgRvMicPOR/FqGIZevIPITiLDLRH/1u81k+CbTMYQ2iFWS5bzOtQz+SGitGC0O/Ps+nhQ9/ffvdcOO3Wl7wf7x+s1Z6Ec/3ya+62GcQp2Fe2Y14JUS1UGPFGezPUXWIdjHMKXVcHeKUuobmxgbYgDil0d2ICNTY2JxIp9IDbSlNMyOzt3jwFJee7/KXBVl8LBxzodPcMaYpXNXgaUwlw6kwUm3trS+MHdv2wphv45Ey/7oZSe7FXezv4hCMpRdzSJ2pjq5DKCIOKUOwOaVZ2cwQ3ELf7aNj1AojFS/w1AvMUh6+/DOO+7dxzInvdOqHQt/ANjsJ23yHz08f/nbGIXpmLeKdH7KLUUzQTnVTk6lBorW6akYf68xWZiunTpS+Eda+4QJhlysM4JTJkyYKlW93NjbWVo3v7KxOjnmNagft7RPjiUTFK1DpHdjmB34UOiCf/RW9BsIeWI3UXi71t7NZQs25Z+s49Ct6Z+5Z3BOkLpfLpdA7IEVmWOFxGGdJ3xr0a+4sOQjfKHRWvt1bemL7mNd60TPl4kNhxSu9Sr8XrbofcFB8st7+Si/Ua1aKT7fgh8Vi2eIZIrS25PnotxIAsex/N1gA36UrsFbf+p0RBVP9bVoDtJFlZu777rDjv75VhTCrxAXHOT+apX/DLhZzfvTlJFcsZcry5rSR/i07X8z1oevSA5SJKeah0bWj5LuPFq/Zi9c20DL6OXLtseI1WLxWj773JTtLzOMVnimDZXlzBNO77A1i/k78LgeLeXN07VNy38dL37WUwXsVzdOn2Klirk78rhqW4IX0H8h395NrJG8uflnMm9MSRIslYk6ucG+eGc6bd6N3n2YfoCLUbCHjEpT6DpfLG5aSHpJyXodrbz8TwlobWvR7bQB92Omi+TB9o6lFqxVP8XyEt8eP9/P4HP/Z4lZseaPgWKE9UykRgmsja84rB8/RC/+itkYT+aXxkFGxpTpmgNKFfavrcpOUsUiwKqj5C5w+tLe1zW/EM+hMPmEMPTcncTdUXfnkVPmzNRlf58aJM5DfZYSN8C7J9ygn5aHmPkfJQFJQuVwekxY4IKXrMx0BlYKTH6Q4FcVYJBInz6nkcqORd6I/5u0mk9id4ZNsLkXGpunqCo090WuE3+mzOXOWR4od95MhJZ8j56WAGpDTF+elNCeiRkv+JaNGm4rk3wzXO0Bg22dae9Az9DTQXgUbE6zV4WkaW+nP6f02XLfYKNA/HJpXkbYjrp4KVhf6SzTCCsnVyI/0USlq/tP61BGEktIH+ii/L6jo87pfAElKieJV9BPknqEGFQrKeAQkDkajeg79+4zDkaF8/udQYMBivDB2CIFPUjmEzwBSRNmzCEnubOpsHdkoH9nuV2okvZ1gId6TWkHhsBHuNjO3AncnqQA3rL+l9ZGf/PRp0+Le+QtbWsOdHQvqXI1TmxYhHBV8IE3LUn69IhGb3HJDs6Lmts2bwQc93cJomD+V38rYO5rj9WEyn3IRTNB/l+xEayc8q+V5GkV18qMgQZkpFiQP2Wmash8BVQcNWq0KEeEAb/gKj1LPprjTWfTjLEh9wudS/ej/Umu7Ul3gyMFO9N8nGCd3t69u3rhm8nTXhNE7Zj5zZP7z141dJ+l9tn1s98MbfvJ848wXOf3x4ze8vlpb6GvXCK9A62CjwlTrQdBndyIQDlGKvnDwKFmAEvH1iOiHvN4oZS/QnJBcJHcKURv/PZ/SDB5wgoypP1w8yxUDPuncCoda5awArZduWdha545HbpnXs8PnT2y/uaPvEb0rRFqWiOQ1yBOmVPXUK9pvnNWzQMdNoC+556q+J2hRxjHsFII9Qm1+1qbVGmxGqQFDL8giThlmJ/mitIqhw320FOMSoSIgd8DVZ8SXDM7BcNip0mrQajhsGru9wikzYsR8mJkQvev6ETf145FPGMOzZ0Ucm8WIjidd6lKFsTNkngdei/LZHtKyHhD0l+N1wXjqw7tjQdW4cXKT23X3icqUz9SjHeoVeU1y9bHqGkP+j+HcUCCozb9krh//ichjUsxjySK+9BmEb4hacVCrdRRwDdnLcA0WcA1RIZATTFZHn33QFrQZg3aMqgaAiF1E01NCk6CIscFZvpFY1p2PYdnAkvIeF/SZ8SZfIvHWzkRAKeK3k/en8kdLuDWn9Pnjydr8p7EodzIWMcoS5QJUkBE4GclIlJonqEDQ1+f327QqnjdgbFSUClQdALQNI6pmv/L5nOYgz3FBmjoC4gedzpj5OSRPstQnmCXrsnjheFKAdTabO53C/gtmVvQvwkc6Ipw0j+gVOWJgiaYhl1zcdOjwgue3d1w5pts0dcb6my9fP2GCyhsBUY9dARu5pNX4b7+67herON3hzraj+372XE1jOJW04u461opEkUfvQ2uWo64QbOq7yJCSuxaRISUJV59bJ2WgxNjnPoJWy2wYZOMSr97FpvA/So3LkDKkwhjFZ5TKKkNIgxfOWlJ22VSKHLGuw/XGKfIf1nxIk6fwD3ENyxtSIa/ngqW7cJoJbEdrlj+G1i7/PTX67e2CNqyKOtVgM/6tMuJUw9+QpSPL+PnnYpu2siXFrWkyb7+dDBR/L9AC3IVoYaYantVzfTwj7eMx4mrJIIr89JxEj/6QFVUqxd5sRSRzImoIsexFOmyJozeakUoZASwG8WJgEb0XpHvAIQQL7swWPchr+rQYErmJZUyDrJzHUDytkade/wLvoTcf7+f+Jj56RJ818mA9aEiuXGhvzeiwTqtBD94M101d1uHoMEVHZegfFVvY+TNDc4b11v3o2aOoKwUT76eoKmuNQg2VlX1VFmvEBGN9VRgYV8VgNOoMqO1SRU2lWmoO2HUWndOpMFdWmGsqeBQYHeCpAOaJFOKJbC2mVQ4fGMINoRH1siJPiIIwcNaMbD9hDpx3qxPbrcER82KLbZ/Lut9fhMzywOgJS312DxgdaK0+9WUolrTl/yXl2muzOu12NVqDtwprUB11alijp2NplU7HwURCEqr8Xf7NdNRCJxK0mQu/5zOr/iFyyMglCqRLdKI/Q3SyU4Kgkkops6HPqOyj7jJi6mgUg2aDQSGXymROs4LCZNBifhFNZYFhsFEStViuVHxwHjqHQhG706KcxA1tK+edHTJtuKMq/+WF3EPgYiYhuLLUFkGVNlN9xkwm0WdNJjFcbqU3gJSXXNVntioHlT6/kkubfGanwoSgpDIsYixBbY5wXGUk5U8knI9GENSpHGkupas7mcP2hmgvHh8Zx2jo6s7ipctyp1P9Z9HFs7izPTi/Axs+B+eH/kJJ4MiF04McMwlhhSXkVxUOlYSV5z+blpexEizq/1nAW/0pYAYlPYRTvxzm2o/m7osMHaEnNbzQfmJY5gskGXqDri2sVR38AaJJkpojqKFRq+pTq+N91u8nEpgoHqPH3+cbVHnjcZ/WxzyqVRkNj0ql6XDSYvH6HI+G8coh1DARBnO57CdY6lOiScohm3QW40/QRqjlCqWcI6agmPgL+DVH7+bNPhmUKuxRIEVILs/fVG2Ry8twPst83xqsS3zYtb7YRA7hPoOO94Svzee3X4At0hvYTq1DdgrvGydfpKzIOkkpKaiidMhzo75SYg/VZHJqsT2Coj1CSJwmjnVp03h4+gnxiXAXtI+OvLr04LqbfzJh0aH83qs2T16euGbdxq0w8W/v3fGLS1f9y9V3/uIy8PyBF+bdN//wi08X/DY5orcT+W09z1FOkDzsckk55LZhr6CkWuVEtVKcBLvOz/h8UYmLiIqyaEWKpl9Urmd1YghwAQeJFTrIeUNkLfrMoJn3JvIvFbjnsr5Hc5feKNQ77eO3rpy/vD4NP0yE9SPV79r1TUvGOkDnpFlTJkNxP2QRPR32E9+4glokcDJO1ielOK9S6jUzDBfBQYCZMiP6erHp575C4m4HHKentHaMkVYfDMZdmNh6Qmxd3Sd4U4GYjJxIePQbspGEtc7WikfbS9028MiTEdn1EYtCr1U0jPWH6n3xqpX12Y5x1dEDR8RFujHPDa9Ri6oj63BX5WptrWMq2Q/fEhes79/ANeet141ovSqoamr90zZkX5KH43EZ3xerwr/qvKxf1qcjboB0UCIJAd4VDAKbMxTyAV7qk/pMGF2k5aVxgBdQVVzAohdQaLRZUve5bGlB6y7WjW54UKQbkNbmZOiJvzjYBuEPGrH57y+s76WP7104z9fsqo2nY79KpWpswXj8knGN4xoCi5fXMw/8POPXKZLJYZc1sWrtpHVOBVebntsRliUapy9OhTlwd/5ZTbQlO6kb64zLUFz0MFr7BDX5WYXfDy0JkwMR41m9xeJIwLj+ebTsECSfqfjKYjaHseKUSyQpDRWPuzUkHiIugngO83ROdBPOEgrgjmX6suZk9EUnmxTbmB3Qz5zaPSXYPW3M/MbctPVN2cVTuzXpllz7ZHfb1OlLah96YN1djKx79BghWpcLuBpnjmqYUWdXmA5VNZibqwO5VDDUNrvpiq2BZ0W7FUdrnSayOeEwPi3My80kqNLwfRReYQU3qOW0tIJzKghSRqMT0rTb4UQYYazqMCtj3EhkniU2jEQbejw+EI4cPiZOmo1DZoLS4QuFpvPeZP6phFc3LRpyONXdkqvPZBp96qHHRWGUGSJxeobWWT0Kz4dFuuwGBGeY6hTkWo8ferHWfh5UUhacXmC+8mg9WrvBr/IjsKsP2e1RlQHznlSM/U5miXMhRg6niW8hekikcdrIyXPDfcpEHzM7/s7en+xW2StADjmToUk982ZjJvOiF8yKDTuEux8E1xW7pPoz+Y2XXJZZsQHcNvwWprMXpuH1CH4HNUlQAK0OcvY+h8yBUyEO81cqLVBpjXK5DjBSqcVi19l1MrvJbBbPEPZn6wqpkGKH2kImJFdE5CLjHwAeCEJ6k61K+VWKHz2n1YaTIBvPOfO/X3bWkohKrk6wNrs+4cr7wLFgRu9ysYjm1a1DC+hHxyZlCZE/XDDLjkdwe6n1yPftk/dZ+ux9Vo6SSjHoFVpaR3u/MlrkRotbr7fzlFyl0UDISewSfjtn13k42uv1ayWAxlgQpdePkPkkJXI+QmVEbgf9g2KgbDb75z+fPXt+37IL2pYBP/3j31/1jikYAw3hsOXm39504EeuYAR43G6PMX9uHfv20FJ6d0cNiuAkFpN/fD5LPzi0ALw41eVxIFwVlqrqoTUIRz+SgVaEYx21W7ABDQ+1tX11wVzOWSs1Gm0g5rRBR7KvDotDOjHIKz0wWot+2jUGpOAdpkDAbpRK7blgEEbt8VAom7UDiaSysjZhtydSRKNjTPnCT/Kq8Lf4o66uGBOJ2S1dXUFPlhYYB30jh58Umg6LXc+wcRBPuRFRK3Q9A2ubDa4F8/28xQW0ocZRe36WSFRY8i97XVKVcfO1Om1N/s+uinT2wUcyMa8eMYTMpw7Fdlyf8Wt5C/KClbUT3viP5mqPJJFgdToF0kRPHrS6tQFEUJm9quWD02OqTDBB+ATTcBqxGZsFHaW50+UKWqUmaGb6WH+oj8W08wUH9QFFMGB1653I69Ba3QogVasBsAYrGCtj1TBuHE9VVMRjYv4Pcz2pRsSEE3s+FsKFIq3E6BEpobPY3yrvcecudYgrG4UiqiGw+MVEpR/kPF6t/eYbzJwSxQdGZzJe8XPsIxxMeHTMHpDuqFQkkpDTaf2J373hd/o5FBckE3JvZWP+Ty/HoqRHvT4Sx7iPQ77/HxDueqoRRfwcy1F65V28nLqLuDUa2aBCr2elUiMlk2k54vFj1VmHjf5p7C3mCiqzOAt4RCsyyWe1abehe2g1+NVnFYkAP4G+Hu6wNfT8NUG/bhvd+CcEAfV/ASi5bCEAAAB4nK1Yz4scxxWuWcleS9aKxE4g5BAKErCcjGZtE2S0OgmZGB1EiFlkdAo13TXT5e3uaqqqZzS6B/IfhOSeg4855xQIhBxy8F+SPyCXfO/V657e3ZEQIVo087p+vHr1vV9fj1LqJ7NWzVT+95laiTxTx+pbkY8g/03kG+oD9W+Rb6rj2Qciv6PuzH4p8rsY/43Ix+rR7DuR31M/PHoo8i3106M/iHz7xu9u/UPk99UvTv4s8h31g5P/iHwy+/v3/yTyXfXgw3/BktnNW3gq2SqSZ5j5o8hHkP8i8g31M/VPkW+qu7Mjkd9RP5r9WOR3Mf5Y5GO1mb0Q+T3186MTkW+pXx39WuTbx7eP/iry++r5yTOR76h7J9+JfHLj93e/J/JdVX/4WyCqgfEn6lP1OaRnyqlCBeVVxP+VShh7Aimojj8NRhykVi0w81jV+NMYd2qtKsxFfrL4tvje4LPESvWt/uyTTz/Xz1wRfPSrpJ/40PlgkvPtQj+uax3cukpRBxtt2NgSe57gsEYtWbnBo2mWwUH4CkrXqsfBBnPqK7vuawPhuulnbPwlLaMFZ3pU+LqDnvMdotxXqwe4yUP8qec2RBiuHywePnz99svjGp8EDkmJgSyhvuE7XGCMLKaZCqOH3bDm5x6OGFYX+G7wbGCeY9AX4/naRW10Cqa0jQkX2q90quzEA+vg+46GC990pnU2Lg5h+Dr3q4O+JA0067Fuhz10l6d8yzX2tfjUbG2J73OM0Ekk5bVbPuMCZ6tnvvVp11n9tDFr1661aUt97oLX5xjd+nARryNc4ZMwXkKXZZeVjAoFZ8uhqHEnOkOzlfcxV3C45tUkkV+uWprYyhqfnn21Zolmtuwv2tuxFS3W5nMMYxf57jlJyI5X4iVCJU0s3nCo7SBZllteT54trlnTMWrZH4M3ss4vGIc1jxg+c9iT9Sf2bp6hkwn/mvVbic28OievA1Z5NLAf6bOWCNiwvOO1ie0hG+eCiMOc5TM863nF80lOPqx9itRgx4Dn1AuWIz7jlvHc23DBT3l9Ri2XIyN5FSTDjOCbxpMor9KYfw3bWPMtM7LnfKs48TP5pZN75pmGs4a05PgnrCmeluOqdpLhTvCgVXGMpIzFsIYibsujBd/Xcs5XjBlFRpICNUWxx3klPu2IYL7pTqzIKC5ZNpM7O0ZnyTdOPBcZy5rxsOyJOFaenKklMshJdg9IfT1mxOH61/M9pplId+smkbzPnSFf6NSN+I9aleboz9Exn+C1j5gAy64jdT2nIsco9ZJyRCWyV3I7yzEe2OKe/Tm1fI9WbnmkJ00ixl6pQBmDVn3Ee75hLNKVOL96Qs+7c4ZG1udhRz/xydnktHCpN2qOnuEuh+qjVS+vnLzlyKykU2U9a8HFspYcAY1k1bRqFNyFWsaJnnfsfw8tlzH5UmruxWT3E6wOXDlyTrxdNe/F8hxHNWfgkAedUBA3aeHZdiO+GGKlnfS1XKMSZ24z7iCcOqmhcaxznnU59sW+Qg045Y7k2Me5Dg61t+VeN61AhrNpyNdGIsmNHcpxhuhJV51iMen6lYl6aW2rSxvdurWlXvmgfXs/FoGGgzXl0E6T17X3F3rtfam3FWa74NqEPSbp2BiwsuhegRfop4kVb2zYabvBwtiZYlDTBY/2T90fK79wZu1bU/MM1idX4KEyLtSutZGHwfDcCmKwMKcGb9jYeqdjCr5dz2GIq62ufHCvfJuwebI8G0U6yM58Bdt0sA12soYLqzEO00AlDQhPAOsxsDfRJt8nIkFNtPWGrnVegSTRnQvX4Uw8ND4mDebhCmuWNNQya3KwwxWRQIIVNFL7rQ2FiVYXlQmmSKCE2cR+WfaWDMShO6iAiUtLiGKbC5BxArC0tW1sC8YLBgY6U953IDpk1NfkiAmJ66M4sTAdg8zeIb9oD4BBrHXnAcec7WJgwv3RqNFTsfJ9XZIpsSaqDcSDLftClLNZIN99nRgYKwEEC9qPkv6mx3TGfNjQR3Jo1KUver7JGW8LmY7rraVT9vFoX8rmrUsVmCnWrGGLTQRAY2iMQqNwti0wvmuWvhZLvkTkXvD0k11wNTxxIMx7KAdGtY/kgw4vEY45OrTD/4xKyxQVEZWsaWjCvsS6FCnmvDausRxQZBMSycWEGKTobe02B5AJ7NcGIDlKKNfBq0RSsxVIQ6qzCRl6pk7xt+W/BfL5KqteCHc/lYz2zO4NM5sdRqljrYQ1gehWKXVnp6fb7XbRDLR7Ad5+itP9Opiu2p0WaYV8ia+zYa9tOHuqlbeSxsOvALmcdlya9w2q5Yto9YJbaG4Ju7HF57acm/6weiiRhVBtKrNzLmaOW3PNGubqMtl1srcQLVaejRAyKssNt62BfC/Zjj2NylSsHe3KOzKxCNdGVuMd5uptXswyIc8EIROSOLaeYtQSDtwgl/tMmQtupocw28pNM+2scU4p79XXsac9mbTcw/qPVSbMy7FBXdeebfhfsd1r3782BaFFueVNid3VG0xJ8WW7Hk1igG6S75KE/udX0UwXdkKKtnxzzy9wb4o9oy6/rIXRO37ympBfCDp5LSj5tcwJscl6KibH3RtjNP9G0opn9tqHDNm/Uni2d8lIy28m+xds1LOudlx427TQL3yPirmjzoCajxZBw1S50OJNsnNdutjVZjeX9ozih5d8Kt7ceVDzGpeozS93uZeh27WkCxNoKmEQVnTC/PovB2j4aBxoOPRTDfbOac9wAOojOnhRTSzb4lD02LpH+d9b71u0oHvuYzTwJRXecTk0vMlaXs4cBu0qoULnpjgckFu26HrECNxzOCWBJ/hg0D92aFnbtvamvIyeEfoT6DqeuQMIQwfOUFq6Jq2pbN1dRnShH7c7WU4OYUbhK7d0iX/F+n91hH39PuVwXGEus8QFJ2sHhvpWfYJL/WlpVwZtbGFi91L9F9fb9At4nGzVU5Akbbiu4UrbVo2t7sqs6u6xbdu2bdu2bdu2bdvm2rFj/f2drDmYeCOmIp48mPv6QnDo///5NyjUOfR//PEO/L+/oBAcQkJYiArRISbEhrgQHxJCYkgKySElpIa0kB4yQmbICtkhJ+SGvFA4lCKUMpQqlDqUNpQulD6UIZQxlCmUOZQllDWULZQ9lCMUF4oPRUJ+KAhFQ7FQQigxlBTKGcoVyh3KE8obyh8qGCocKhIqGioWKh4qESoZKhUqHSoTKhsqFyofqhCqGKoUqhyqEqoaqhaqHqoRqhmqFaodqhOqG6ofGgXBEAKhEAbhEAGREAXREAOxEAfxkACJkATJkAKpkAbpkAGZkAXZkAO5kAeFoRRQSigVlBpKA6WF0kHpoQxQRigTlBnKAmWFskHZoRxQHBQPRSAfCqAoFIMSoEQoCcoJ5YJyQ3mgvFA+KD9UACoIFYIKQ0WgolAxqDhUAioJlYJKQ2WgslA5qDxUAaoIVYIqQ1WgqlA1qDpUA6oJ1YJqQ3WgulA9qD7UAGoINYIaQ02gplAzqDnUAmoJtYJaQ22gtlA7qD3UAeoIdYI6Q12grlA3qDvUA+oJ9YJ6Q32gvlA/qD80ABoIDYIGQ0OgodAwaDg0AhoJjYJGQ2OgsdA4aDw0AZoITYImQ1OgqdA0aDo0A5oJzYJmQ3OgudA8aD60AFoILYIWQ0ugpdAyaDm0AloJrYJWQ2ugtdA6aD20AdoIbYI2Q1ugrdA2aDu0A9oJ7YJ2Q3ugvdA+aD90ADoIHYIOQ0ego9Ax6Dh0AjoJnYJOQ2egs9A56Dx0AboIXYIuQ1egq9A16Dp0A7oJ3YJuQ3egu9A96D70AHoIPYIeQ0+gp9Az6Dn0AnoJvYJeQ2+gt9A76D30AfoIfYI+Q1+gr9A36Dv0A/oJ/YJ+Q3+gv9A/OARDMAwjMApjMA4TMAlTMA0zMAtzMA8LsAhLsAwrsAprsA4bsAlbsA07sAt7cBhOAaeEU8Gp4TRwWjgdnB7OAGeEM8GZ4SxwVjgbnB3OAcfB8XAE9uEAjsIxOAFOhJPgnHAuODecB84L54PzwwXggnAhuDBcBC4KF4OLwyXgknApuDRcBi4Ll4PLwxXginAluDJcBa4KV4OrwzXgmnAtuDZcB64L14Prww3ghnAjuDHcBG4KN4Obwy3glnAruDXcBm4Lt4Pbwx3gjnAnuDPcBe4Kd4O7wz3gnnAvuDfcB+4L94P7wwPggfAgeDA8BB4KD4OHwyPgkfAoeDQ8Bh4Lj4PHwxPgifAkeDI8BZ4KT4OnwzPgmfAseDY8B54Lz4PnwwvghfAieDG8BF4KL4OXwyvglfAqeDW8Bl4Lr4PXwxvgjfAmeDO8Bd4Kb4O3wzvgnfAueDe8B94L74P3wwfgg/Ah+DB8BD4KH4OPwyfgk/Ap+DR8Bj4Ln4PPwxfgi/Al+DJ8Bb4KX4Ovwzfgm/At+DZ8B74L34Pvww/gh/Aj+DH8BH4KP4Ofwy/gl/Ar+DX8Bn4Lv4Pfwx/gj/An+DP8Bf4Kf4O/wz/gn/Av+Df8B/4L/0NCCITACIKgCIbgCIGQCIXQCIOwCIfwiICIiITIiIKoiIboiIGYiIXYiIO4iIeEkRRISiQVkhpJg6RF0iHpkQxIRiQTkhnJgmRFsiHZkRxIHBKPRBAfCZAoEkMSkEQkCcmJ5EJyI3mQvEg+JD9SACmIFEIKI0WQokgxpDhSAimJlEJKI2WQskg5pDxSAamIVEIqI1WQqkg1pDpSA6mJ1EJqI3WQukg9pD7SAGmINEIaI02QpkgzpDnSAmmJtEJaI22Qtkg7pD3SAemIdEI6I12Qrkg3pDvSA+mJ9EJ6I32Qvkg/pD8yABmIDEIGI0OQocgwZDgyAhmJjEJGI2OQscg4ZDwyAZmITEImI1OQqcg0ZDoyA5mJzEJmI3OQucg8ZD6yAFmILEIWI0uQpcgyZDmyAlmJrEJWI2uQtcg6ZD2yAdmIbEI2I1uQrcg2ZDuyA9mJ7EJ2I3uQvcg+ZD9yADmIHEIOI0eQo8gx5DhyAjmJnEJOI2eQs8g55DxyAbmIXEIuI1eQq8g15DpyA7mJ3EJuI3eQu8g95D7yAHmIPEIeI0+Qp8gz5DnyAnmJvEJeI2+Qt8g75D3yAfmIfEI+I1+Qr8g35DvyA/mJ/EJ+I3+Qv8g/NIRCKIwiKIpiKI4SKIlSKI0yKItyKI8KqIhKqIwqqIpqqI4aqIlaqI06qIt6aBhNgaZEU6Gp0TRoWjQdmh7NgGZEM6GZ0SxoVjQbmh3Ngcah8WgE9dEAjaIxNAFNRJPQnGguNDeaB82L5kPzowXQgmghtDBaBC2KFkOLoyXQkmgptDRaBi2LlkPLoxXQimgltDJaBa2KVkOrozXQmmgttDZaB62L1kProw3QhmgjtDHaBG2KNkOboy3QlmgrtDXaBm2LtkPbox3QjmgntDPaBe2KdkO7oz3QnmgvtDfaB+2L9kP7owPQgeggdDA6BB2KDkOHoyPQkegodDQ6Bh2LjkPHoxPQiegkdDI6BZ2KTkOnozPQmegsdDY6B52LzkPnowvQhegidDG6BF2KLkOXoyvQlegqdDW6Bl2LrkPXoxvQjegmdDO6Bd2KbkO3ozvQnegudDe6B92L7kP3owfQg+gh9DB6BD2KHkOPoyfQk+gp9DR6Bj2LnkPPoxfQi+gl9DJ6Bb2KXkOvozfQm+gt9DZ6B72L3kPvow/Qh+gj9DH6BH2KPkOfoy/Ql+gr9DX6Bn2LvkPfox/Qj+gn9DP6Bf2KfkO/oz/Qn+gv9Df6B/2L/sNCGITBGIKhGIbhGIGRGIXRGIOxGIfxmICJmITJmIKpmIbpmIGZmIXZmIO5mIeFsRRYSiwVlhpLg6XF0mHpsQxYRiwTlhnLgmXFsmHZsRxYHBaPRTAfC7AoFsMSsEQsCcuJ5cJyY3mwvFg+LD9WACuIFcIKY0WwolgxrDhWAiuJlcJKY2Wwslg5rDxWAauIVcIqY1Wwqlg1rDpWA6uJ1cJqY3Wwulg9rD7WAGuINcIaY02wplgzrDnWAmuJtcJaY22wtlg7rD3WAeuIdcI6Y12wrlg3rDvWA+uJ9cJ6Y32wvlg/rD82ABuIDcIGY0OwodgwbDg2AhuJjcJGY2Owsdg4bDw2AZuITcImY1Owqdg0bDo2A5uJzcJmY3Owudg8bD62AFuILcIWY0uwpdgybDm2AluJrcJWY2uwtdg6bD22AduIbcI2Y1uwrdg2bDu2A9uJ7cJ2Y3uwvdg+bD92ADuIHcIOY0ewo9gx7Dh2AjuJncJOY2ews9g57Dx2AbuIXcIuY1ewq9g17Dp2A7uJ3cJuY3ewu9g97D72AHuIPcIeY0+wp9gz7Dn2AnuJvcJeY2+wt9g77D32AfuIfcI+Y1+wr9g37Dv2A/uJ/cJ+Y3+wv9g/PIRDOIwjOIpjOI4TOIlTOI0zOItzOI8LuIhLuIwruIpruI4buIlbuI07uIt7eBhPgafEU+Gp8TR4Wjwdnh7PgGfEM+GZ8Sx4Vjwbnh3Pgcfh8XgE9/EAj+IxPAFPxJPwnHguPDeeB8+L58Pz4wXwgnghvDBeBC+KF8OL4yXwkngpvDReBi+Ll8PL4xXwinglvDJeBa+KV8Or4zXwmngtvDZeB6+L18Pr4w3whngjvDHeBG+KN8Ob4y3wlngrvDXeBm+Lt8Pb4x3wjngnvDPeBe+Kd8O74z3wnngvvDfeB++L98P74wPwgfggfDA+BB+KD8OH4yPwkfgofDQ+Bh+Lj8PH4xPwifgkfDI+BZ+KT8On4zPwmfgsfDY+B5+Lz8Pn4wvwhfgifDG+BF+KL8OX4yvwlfgqfDW+Bl+Lr8PX4xvwjfgmfDO+Bd+Kb8O34zvwnfgufDe+B9+L78P34wfwg/gh/DB+BD+KH8OP4yfwk/gp/DR+Bj+Ln8PP4xfwi/gl/DJ+Bb+KX8Ov4zfwm/gt/DZ+B7+L38Pv4w/wh/gj/DH+BH+KP8Of4y/wl/gr/DX+Bn+Lv8Pf4x/wj/gn/DP+Bf+Kf8O/4z/wn/gv/Df+B/+L/yNCBETABEKgBEbgBEGQBEXQBEOwBEfwhECIhETIhEKohEbohEGYhEXYhEO4hEeEiRRESiIVkZpIQ6Ql0hHpiQxERiITkZnIQmQlshHZiRxEHBFPRAifCIgoESMSiEQiichJ5CJyE3mIvEQ+Ij9RgChIFCIKE0WIokQxojhRgihJlCJKE2WIskQ5ojxRgahIVCIqE1WIqkQ1ojpRg6hJ1CJqE3WIukQ9oj7RgGhINCIaE02IpkQzojnRgmhJtCJaE22ItkQ7oj3RgehIdCI6E12IrkQ3ojvRg+hJ9CJ6E32IvkQ/oj8xgBhIDCIGE0OIocQwYjgxghhJjCJGE2OIscQ4YjwxgZhITCImE1OIqcQ0Yjoxg5hJzCJmE3OIucQ8Yj6xgFhILCIWE0uIpcQyYjmxglhJrCJWE2uItcQ6Yj2xgdhIbCI2E1uIrcQ2Yjuxg9hJ7CJ2E3uIvcQ+Yj9xgDhIHCIOE0eIo8Qx4jhxgjhJnCJOE2eIs8Q54jxxgbhIXCIuE1eIq8Q14jpxg7hJ3CJuE3eIu8Q94j7xgHhIPCIeE0+Ip8Qz4jnxgnhJvCJeE2+It8Q74j3xgfhIfCI+E1+Ir8Q34jvxg/hJ/CJ+E3+Iv8Q/MkRCJEwiJEpiJE4SJElSJE0yJEtyJE8KpEhKpEwqpEpqpE4apElapE06pEt6ZJhMQaYkU5GpyTRkWjIdmZ7MQGYkM5GZySxkVjIbmZ3MQcaR8WSE9MmAjJIxMoFMJJPInGQuMjeZh8xL5iPzkwXIgmQhsjBZhCxKFiOLkyXIkmQpsjRZhixLliPLkxXIimQlsjJZhaxKViOrkzXImmQtsjZZh6xL1iPrkw3IhmQjsjHZhGxKNiObky3IlmQrsjXZhmxLtiPbkx3IjmQnsjPZhexKdiO7kz3InmQvsjfZh+xL9iP7kwPIgeQgcjA5hBxKDiOHkyPIkeQocjQ5hhxLjiPHkxPIieQkcjI5hZxKTiOnkzPImeQscjY5h5xLziPnkwvIheQicjG5hFxKLiOXkyvIleQqcjW5hlxLriPXkxvIjeQmcjO5hdxKbiO3kzvIneQucje5h9xL7iP3kwfIg+Qh8jB5hDxKHiOPkyfIk+Qp8jR5hjxLniPPkxfIi+Ql8jJ5hbxKXiOvkzfIm+Qt8jZ5h7xL3iPvkw/Ih+Qj8jH5hHxKPiOfky/Il+Qr8jX5hnxLviPfkx/Ij+Qn8jP5hfxKfiO/kz/In+Qv8jf5h/xL/qNCFETBFEKhFEbhFEGRFEXRFEOxFEfxlECJlETJlEKplEbplEGZlEXZlEO5lEeFqRRUSioVlZpKQ6Wl0lHpqQxURioTlZnKQmWlslHZqRxUHBVPRSifCqgoFaMSqEQqicpJ5aJyU3movFQ+Kj9VgCpIFaIKU0WoolQxqjhVgipJlaJKU2WoslQ5qjxVgapIVaIqU1WoqlQ1qjpVg6pJ1aJqU3WoulQ9qj7VgGpINaIaU02oplQzqjnVgmpJtaJaU22otlQ7qj3VgepIdaI6U12orlQ3qjvVg+pJ9aJ6U32ovlQ/qj81gBpIDaIGU0OoodQwajg1ghpJjaJGU2OosdQ4ajw1gZpITaImU1OoqdQ0ajo1g5pJzaJmU3OoudQ8aj61gFpILaIWU0uopdQyajm1glpJraJWU2uotdQ6aj21gdpIbaI2U1uordQ2aju1g9pJ7aJ2U3uovdQ+aj91gDpIHaIOU0eoo9Qx6jh1gjpJnaJOU2eos9Q56jx1gbpIXaIuU1eoq9Q16jp1g7pJ3aJuU3eou9Q96j71gHpIPaIeU0+op9Qz6jn1gnpJvaJeU2+ot9Q76j31gfpIfaI+U1+or9Q36jv1g/pJ/aJ+U3+ov9Q/OkRDNEwjNEpjNE4TNElTNE0zNEtzNE8LtEhLtEwrtEprtE4btElbtE07tEt7dJhOQaekU9Gp6TR0WjodnZ7OQGekM9GZ6Sx0VjobnZ3OQcfR8XSE9umAjtIxOoFOpJPonHQuOjedh85L56Pz0wXognQhujBdhC5KF6OL0yXoknQpujRdhi5Ll6PL0xXoinQlujJdha5KV6Or0zXomnQtujZdh65L16Pr0w3ohnQjujHdhG5KN6Ob0y3olnQrujXdhm5Lt6Pb0x3ojnQnujPdhe5Kd6O70z3onnQvujfdh+5L96P70wPogfQgejA9hB5KD6OH0yPokfQoejQ9hh5Lj6PH0xPoifQkejI9hZ5KT6On0zPomfQsejY9h55Lz6Pn0wvohfQiejG9hF5KL6OX0yvolfQqejW9hl5Lr6PX0xvojfQmejO9hd5Kb6O30zvonfQueje9h95L76P30wfog/Qh+jB9hD5KH6OP0yfok/Qp+jR9hj5Ln6PP0xfoi/Ql+jJ9hb5KX6Ov0zfom/Qt+jZ9h75L36Pv0w/oh/Qj+jH9hH5KP6Of0y/ol/Qr+jX9hn5Lv6Pf0x/oj/Qn+jP9hf5Kf6O/0z/on/Qv+jf9h/5L/2NCDMTADMKgDMbgDMGQDMXQDMOwDMfwjMCIjMTIjMKojMbojMGYjMXYjMO4jMeEmRRMSiYVk5pJw6Rl0jHpmQxMRiYTk5nJwmRlsjHZmRxMHBPPRBifCZgoE2MSmEQmicnJ5GJyM3mYvEw+Jj9TgCnIFGIKM0WYokwxpjhTginJlGJKM2WYskw5pjxTganIVGIqM1WYqkw1pjpTg6nJ1GJqM3WYukw9pj7TgGnINGIaM02YpkwzpjnTgmnJtGJaM22Ytkw7pj3TgenIdGI6M12Yrkw3pjvTg+nJ9GJ6M32Yvkw/pj8zgBnIDGIGM0OYocwwZjgzghnJjGJGM2OYscw4ZjwzgZnITGImM1OYqcw0Zjozg5nJzGJmM3OYucw8Zj6zgFnILGIWM0uYpcwyZjmzglnJrGJWM2uYtcw6Zj2zgdnIbGI2M1uYrcw2Zjuzg9nJ7GJ2M3uYvcw+Zj9zgDnIHGIOM0eYo8wx5jhzgjnJnGJOM2eYs8w55jxzgbnIXGIuM1eYq8w15jpzg7nJ3GJuM3eYu8w95j7zgHnIPGIeM0+Yp8wz5jnzgnnJvGJeM2+Yt8w75j3zgfnIfGI+M1+Yr8w35jvzg/nJ/GJ+M3+Yv8w/NsRCLMwiLMpiLM4SLMlSLM0yLMtyLM8KrMhKrMwqrMpqrM4arMlarM06rMt6bJhNwaZkU7Gp2TRsWjYdm57NwGZkM7GZ2SxsVjYbm53Nwcax8WyE9dmAjbIxNoFNZJPYnGwuNjebh83L5mPzswXYgmwhtjBbhC3KFmOLsyXYkmwptjRbhi3LlmPLsxXYimwltjJbha3KVmOrszXYmmwttjZbh63L1mPrsw3YhmwjtjHbhG3KNmObsy3YlmwrtjXbhm3LtmPbsx3YjmwntjPbhe3KdmO7sz3Ynmwvtjfbh+3L9mP7swPYgewgdjA7hB3KDmOHsyPYkewodjQ7hh3LjmPHsxPYiewkdjI7hZ3KTmOnszPYmewsdjY7h53LzmPnswvYhewidjG7hF3KLmOXsyvYlewqdjW7hl3LrmPXsxvYjewmdjO7hd3KbmO3szvYnewudje7h93L7mP3swfYg+wh9jB7hD3KHmOPsyfYk+wp9jR7hj3LnmPPsxfYi+wl9jJ7hb3KXmOvszfYm+wt9jZ7h73L3mPvsw/Yh+wj9jH7hH3KPmOfsy/Yl+wr9jX7hn3LvmPfsx/Yj+wn9jP7hf3KfmO/sz/Yn+wv9jf7h/3L/uNCHMTBHMKhHMbhHMGRHMXRHMOxHMfxnMCJnMTJnMKpnMbpnMGZnMXZnMO5nMeFuRRcSi4Vl5pLw6Xl0nHpuQxcRi4Tl5nLwmXlsnHZuRxcHBfPRTifC7goF+MSuEQuicvJ5eJyc3m4vFw+Lj9XgCvIFeIKc0W4olwxrjhXgivJleJKc2W4slw5rjxXgavIVeIqc1W4qlw1rjpXg6vJ1eJqc3W4ulw9rj7XgGvINeIac024plwzrjnXgmvJteJac224tlw7rj3XgevIdeI6c124rlw3rjvXg+vJ9eJ6c324vlw/rj83gBvIDeIGc0O4odwwbjg3ghvJjeJGc2O4sdw4bjw3gZvITeImc1O4qdw0bjo3g5vJzeJmc3O4udw8bj63gFvILeIWc0u4pdwybjm3glvJreJWc2u4tdw6bj23gdvIbeI2c1u4rdw2bju3g9vJ7eJ2c3u4vdw+bj93gDvIHeIOc0e4o9wx7jh3gjvJneJOc2e4s9w57jx3gbvIXeIuc1e4q9w17jp3g7vJ3eJuc3e4u9w97j73gHvIPeIec0+4p9wz7jn3gnvJveJec2+4t9w77j33gfvIfeI+c1+4r9w37jv3g/vJ/eJ+c3+4v9w/PsRDPMwjPMpjPM4TPMlTPM0zPMtzPM8LvMhLvMwrvMprvM4bvMlbvM07vMt7fJhPwafkU/Gp+TR8Wj4dn57PwGfkM/GZ+Sx8Vj4bn53Pwcfx8XyE9/mAj/IxPoFP5JP4nHwuPjefh8/L5+Pz8wX4gnwhvjBfhC/KF+OL8yX4knwpvjRfhi/Ll+PL8xX4inwlvjJfha/KV+Or8zX4mnwtvjZfh6/L1+Pr8w34hnwjvjHfhG/KN+Ob8y34lnwrvjXfhm/Lt+Pb8x34jnwnvjPfhe/Kd+O78z34nnwvvjffh+/L9+P78wP4gfwgfjA/hB/KD+OH8yP4kfwofjQ/hh/Lj+PH8xP4ifwkfjI/hZ/KT+On8zP4mfwsfjY/h5/Lz+Pn8wv4hfwifjG/hF/KL+OX8yv4lfwqfjW/hl/Lr+PX8xv4jfwmfjO/hd/Kb+O38zv4nfwufje/h9/L7+P38wf4g/wh/jB/hD/KH+OP8yf4k/wp/jR/hj/Ln+PP8xf4i/wl/jJ/hb/KX+Ov8zf4m/wt/jZ/h7/L3+Pv8w/4h/wj/jH/hH/KP+Of8y/4l/wr/jX/hn/Lv+Pf8x/4j/wn/jP/hf/Kf+O/8z/4n/wv/jf/h//L/xNCAiTAAiKgAibgAiGQAiXQAiOwAifwgiCIgiTIgiKogibogiGYgiXYgiO4gieEhRRCSiGVkFpII6QV0gnphQxCRiGTkFnIImQVsgnZhRxCnBAvRARfCISoEBMShEQhScgp5BJyC3mEvEI+Ib9QQCgoFBIKC0WEokIxobhQQigplBJKC2WEskI5obxQQagoVBIqC1WEqkI1obpQQ6gp1BJqC3WEukI9ob7QQGgoNBIaC02EpkIzobnQQmgptBJaC22EtkI7ob3QQegodBI6C12ErkI3obvQQ+gp9BJ6C32EvkI/ob8wQBgoDBIGC0OEocIwYbgwQhgpjBJGC2OEscI4YbwwQZgoTBImC1OEqcI0YbowQ5gpzBJmC3OEucI8Yb6wQFgoLBIWC0uEpcIyYbmwQlgprBJWC2uEtcI6Yb2wQdgobBI2C1uErcI2YbuwQ9gp7BJ2C3uEvcI+Yb9wQDgoHBIOC0eEo8Ix4bhwQjgpnBJOC2eEs8I54bxwQbgoXBIuC1eEq8I14bpwQ7gp3BJuC3eEu8I94b7wQHgoPBIeC0+Ep8Iz4bnwQngpvBJeC2+Et8I74b3wQfgofBI+C1+Er8I34bvwQ/gp/BJ+C3+Ev8I/MSRCIiwiIipiIi4SIilSIi0yIityIi8KoihKoiwqoipqoi4aoilaoi06oit6YlhMIaYUU4mpxTRiWjGdmF7MIGYUM4mZxSxiVjGbmF3MIcaJ8WJE9MVAjIoxMUFMFJPEnGIuMbeYR8wr5hPziwXEgmIhsbBYRCwqFhOLiyXEkmIpsbRYRiwrlhPLixXEimIlsbJYRawqVhOrizXEmmItsbZYR6wr1hPriw3EhmIjsbHYRGwqNhObiy3ElmIrsbXYRmwrthPbix3EjmInsbPYRewqdhO7iz3EnmIvsbfYR+wr9hP7iwPEgeIgcbA4RBwqDhOHiyPEkeIocbQ4RhwrjhPHixPEieIkcbI4RZwqThOnizPEmeIscbY4R5wrzhPniwvEheIicbG4RFwqLhOXiyvEleIqcbW4RlwrrhPXixvEjeImcbO4RdwqbhO3izvEneIucbe4R9wr7hP3iwfEg+Ih8bB4RDwqHhOPiyfEk+Ip8bR4RjwrnhPPixfEi+Il8bJ4RbwqXhOvizfEm+It8bZ4R7wr3hPviw/Eh+Ij8bH4RHwqPhOfiy/El+Ir8bX4RnwrvhPfix/Ej+In8bP4RfwqfhO/iz/En+Iv8bf4R/wr/pNCEiTBEiKhEibhEiGREiXREiOxEifxkiCJkiTJkiKpkibpkiGZkiXZkiO5kieFpRRSSimVlFpKI6WV0knppQxSRimTlFnKImWVsknZpRxSnBQvRSRfCqSoFJMSpEQpScop5ZJyS3mkvFI+Kb9UQCooFZIKS0WkolIxqbhUQioplZJKS2WkslI5qbxUQaooVZIqS1WkqlI1qbpUQ6op1ZJqS3WkulI9qb7UQGooNZIaS02kplIzqbnUQmoptZJaS22ktlI7qb3UQeoodZI6S12krlI3qbvUQ+op9ZJ6S32kvlI/qb80QBooDZIGS0OkodIwabg0QhopjZJGS2OksdI4abw0QZooTZImS1OkqdI0abo0Q5opzZJmS3OkudI8ab60QFooLZIWS0ukpdIyabm0QloprZJWS2uktdI6ab20QdoobZI2S1ukrdI2abu0Q9op7ZJ2S3ukvdI+ab90QDooHZIOS0eko9Ix6bh0QjopnZJOS2eks9I56bx0QbooXZIuS1ekq9I16bp0Q7op3ZJuS3eku9I96b70QHooPZIeS0+kp9Iz6bn0QnopvZJeS2+kt9I76b30QfoofZI+S1+kr9I36bv0Q/op/ZJ+S3+kv9I/OSRDMiwjMipjMi4TMilTMi0zMitzMi8LsihLsiwrsiprsi4bsilbsi07sit7clhOIaeUU8mp5TRyWjmdnF7OIGeUM8mZ5SxyVjmbnF3OIcfJ8XJE9uVAjsoxOUFOlJPknHIuObecR84r55PzywXkgnIhubBcRC4qF5OLyyXkknIpubRcRi4rl5PLyxXkinIlubJcRa4qV5OryzXkmnItubZcR64r15Pryw3khnIjubHcRG4qN5Obyy3klnIrubXcRm4rt5Pbyx3kjnInubPcRe4qd5O7yz3knnIvubfcR+4r95P7ywPkgfIgebA8RB4qD5OHyyPkkfIoebQ8Rh4rj5PHyxPkifIkebI8RZ4qT5OnyzPkmfIsebY8R54rz5PnywvkhfIiebG8RF4qL5OXyyvklfIqebW8Rl4rr5PXyxvkjfImebO8Rd4qb5O3yzvknfIuebe8R94r75P3ywfkg/Ih+bB8RD4qH5OPyyfkk/Ip+bR8Rj4rn5PPyxfki/Il+bJ8Rb4qX5Ovyzfkm/It+bZ8R74r35Pvyw/kh/Ij+bH8RH4qP5Ofyy/kl/Ir+bX8Rn4rv5Pfyx/kj/In+bP8Rf4qf5O/yz/kn/Iv+bf8R/4r/1NCCqTACqKgCqbgCqGQCqXQCqOwCqfwiqCIiqTIiqKoiqboiqGYiqXYiqO4iqeElRRKSiWVklpJo6RV0inplQxKRiWTklnJomRVsinZlRxKnBKvRBRfCZSoElMSlEQlScmp5FJyK3mUvEo+Jb9SQCmoFFIKK0WUokoxpbhSQimplFJKK2WUsko5pbxSQamoVFIqK1WUqko1pbpSQ6mp1FJqK3WUuko9pb7SQGmoNFIaK02UpkozpbnSQmmptFJaK22Utko7pb3SQemodFI6K12Urko3pbvSQ+mp9FJ6K32Uvko/pb8yQBmoDFIGK0OUocowZbgyQhmpjFJGK2OUsco4ZbwyQZmoTFImK1OUqco0ZboyQ5mpzFJmK3OUuco8Zb6yQFmoLFIWK0uUpcoyZbmyQlmprFJWK2uUtco6Zb2yQdmobFI2K1uUrco2ZbuyQ9mp7FJ2K3uUvco+Zb9yQDmoHFIOK0eUo8ox5bhyQjmpnFJOK2eUs8o55bxyQbmoXFIuK1eUq8o15bpyQ7mp3FJuK3eUu8o95b7yQHmoPFIeK0+Up8oz5bnyQnmpvFJeK2+Ut8o75b3yQfmofFI+K1+Ur8o35bvyQ/mp/FJ+K3+Uv8o/NaRCKqwiKqpiKq4SKqlSKq0yKqtyKq8KqqhKqqwqqqpqqq4aqqlaqq06qqt6alhNoaZUU6mp1TRqWjWdml7NoGZUM6mZ1SxqVjWbml3Nocap8WpE9dVAjaoxNUFNVJPUnGouNbeaR82r5lPzqwXUgmohtbBaRC2qFlOLqyXUkmoptbRaRi2rllPLqxXUimoltbJaRa2qVlOrqzXUmmottbZaR62r1lPrqw3UhmojtbHaRG2qNlObqy3UlmortbXaRm2rtlPbqx3UjmontbPaRe2qdlO7qz3UnmovtbfaR+2r9lP7qwPUgeogdbA6RB2qDlOHqyPUkeoodbQ6Rh2rjlPHqxPUieokdbI6RZ2qTlOnqzPUmeosdbY6R52rzlPnqwvUheoidbG6RF2qLlOXqyvUleoqdbW6Rl2rrlPXqxvUjeomdbO6Rd2qblO3qzvUneoudbe6R92r7lP3qwfUg+oh9bB6RD2qHlOPqyfUk+op9bR6Rj2rnlPPqxfUi+ol9bJ6Rb2qXlOvqzfUm+ot9bZ6R72r3lPvqw/Uh+oj9bH6RH2qPlOfqy/Ul+or9bX6Rn2rvlPfqx/Uj+on9bP6Rf2qflO/qz/Un+ov9bf6R/2r/tNCGqTBGqKhGqbhGqGRGqXRGqOxGqfxmqCJmqTJmqKpmqbpmqGZmqXZmqO5mqeFtRRaSi2VllpLo6XV0mnptQxaRi2TllnLomXVsmnZtRxanBavRTRfC7SoFtMStEQtScup5dJya3m0vFo+Lb9WQCuoFdIKa0W0oloxrbhWQiupldJKa2W0slo5rbxWQauoVdIqa1W0qlo1rbpWQ6up1dJqa3W0ulo9rb7WQGuoNdIaa020plozrbnWQmuptdJaa220tlo7rb3WQeuoddI6a120rlo3rbvWQ+up9dJ6a320vlo/rb82QBuoDdIGa0O0odowbbg2QhupjdJGa2O0sdo4bbw2QZuoTdIma1O0qdo0bbo2Q5upzdJma3O0udo8bb62QFuoLdIWa0u0pdoybbm2QluprdJWa2u0tdo6bb22QduobdI2a1u0rdo2bbu2Q9up7dJ2a3u0vdo+bb92QDuoHdIOa0e0o9ox7bh2QjupndJOa2e0s9o57bx2QbuoXdIua1e0q9o17bp2Q7up3dJua3e0u9o97b72QHuoPdIea0+0p9oz7bn2QnupvdJea2+0t9o77b32QfuofdI+a1+0r9o37bv2Q/up/dJ+a3+0v9o/PaRDOqwjOqpjOq4TOqlTOq0zOqtzOq8LuqhLuqwruqpruq4buqlbuq07uqt7elhPoafUU+mp9TR6Wj2dnl7PoGfUM+mZ9Sx6Vj2bnl3Pocfp8XpE9/VAj+oxPUFP1JP0nHouPbeeR8+r59Pz6wX0gnohvbBeRC+qF9OL6yX0knopvbReRi+rl9PL6xX0inolvbJeRa+qV9Or6zX0mnotvbZeR6+r19Pr6w30hnojvbHeRG+qN9Ob6y30lnorvbXeRm+rt9Pb6x30jnonvbPeRe+qd9O76z30nnovvbfeR++r99P76wP0gfogfbA+RB+qD9OH6yP0kfoofbQ+Rh+rj9PH6xP0ifokfbI+RZ+qT9On6zP0mfosfbY+R5+rz9Pn6wv0hfoifbG+RF+qL9OX6yv0lfoqfbW+Rl+rr9PX6xv0jfomfbO+Rd+qb9O36zv0nfoufbe+R9+r79P36wf0g/oh/bB+RD+qH9OP6yf0k/op/bR+Rj+rn9PP6xf0i/ol/bJ+Rb+qX9Ov6zf0m/ot/bZ+R7+r39Pv6w/0h/oj/bH+RH+qP9Of6y/0l/or/bX+Rn+rv9Pf6x/0j/on/bP+Rf+qf9O/6z/0n/ov/bf+R/+r/zNCBmTABmKgBmbgBmGQBmXQBmOwBmfwhmCIhmTIhmKohmbohmGYhmXYhmO4hmeEjRRGSiOVkdpIY6Q10hnpjQxGRiOTkdnIYmQ1shnZjRxGnBFvRAzfCIyoETMSjEQjychp5DJyG3mMvEY+I79RwChoFDIKG0WMokYxo7hRwihplDJKG2WMskY5o7xRwahoVDIqG1WMqkY1o7pRw6hp1DJqG3WMukY9o77RwGhoNDIaG02MpkYzo7nRwmhptDJaG22MtkY7o73RwehodDI6G12MrkY3o7vRw+hp9DJ6G32MvkY/o78xwBhoDDIGG0OMocYwY7gxwhhpjDJGG2OMscY4Y7wxwZhoTDImG1OMqcY0Y7oxw5hpzDJmG3OMucY8Y76xwFhoLDIWG0uMpcYyY7mxwlhprDJWG2uMtcY6Y72xwdhobDI2G1uMrcY2Y7uxw9hp7DJ2G3uMvcY+Y79xwDhoHDIOG0eMo8Yx47hxwjhpnDJOG2eMs8Y547xxwbhoXDIuG1eMq8Y147pxw7hp3DJuG3eMu8Y9477xwHhoPDIeG0+Mp8Yz47nxwnhpvDJeG2+Mt8Y7473xwfhofDI+G1+Mr8Y347vxw/hp/DJ+G3+Mv8Y/M2RCJmwiJmpiJm4SJmlSJm0yJmtyJm8KpmhKpmwqpmpqpm4apmlapm06pmt6ZthMYaY0U5mpzTRmWjOdmd7MYGY0M5mZzSxmVjObmd3MYcaZ8WbE9M3AjJoxM8FMNJPMnGYuM7eZx8xr5jPzmwXMgmYhs7BZxCxqFjOLmyXMkmYps7RZxixrljPLmxXMimYls7JZxaxqVjOrmzXMmmYts7ZZx6xr1jPrmw3MhmYjs7HZxGxqNjObmy3MlmYrs7XZxmxrtjPbmx3MjmYns7PZxexqdjO7mz3MnmYvs7fZx+xr9jP7mwPMgeYgc7A5xBxqDjOHmyPMkeYoc7Q5xhxrjjPHmxPMieYkc7I5xZxqTjOnmzPMmeYsc7Y5x5xrzjPnmwvMheYic7G5xFxqLjOXmyvMleYqc7W5xlxrrjPXmxvMjeYmc7O5xdxqbjO3mzvMneYuc7e5x9xr7jP3mwfMg+Yh87B5xDxqHjOPmyfMk+Yp87R5xjxrnjPPmxfMi+Yl87J5xbxqXjOvmzfMm+Yt87Z5x7xr3jPvmw/Mh+Yj87H5xHxqPjOfmy/Ml+Yr87X5xnxrvjPfmx/Mj+Yn87P5xfxqfjO/mz/Mn+Yv87f5x/xr/rNCFmTBFmKhFmbhFmGRFmXRFmOxFmfxlmCJlmTJlmKplmbplmGZlmXZlmO5lmeFrRRWSiuVldpKY6W10lnprQxWRiuTldnKYmW1slnZrRxWnBVvRSzfCqyoFbMSrEQrycpp5bJyW3msvFY+K79VwCpoFbIKW0WsolYxq7hVwipplbJKW2WsslY5q7xVwapoVbIqW1WsqlY1q7pVw6pp1bJqW3WsulY9q77VwGpoNbIaW02splYzq7nVwmpptbJaW22stlY7q73VwepodbI6W12srlY3q7vVw+pp9bJ6W32svlY/q781wBpoDbIGW0OsodYwa7g1whppjbJGW2OssdY4a7w1wZpoTbImW1OsqdY0a7o1w5ppzbJmW3OsudY8a761wFpoLbIWW0uspdYya7m1wlpprbJWW2ustdY6a721wdpobbI2W1usrdY2a7u1w9pp7bJ2W3usvdY+a791wDpoHbIOW0eso9Yx67h1wjppnbJOW2ess9Y567x1wbpoXbIuW1esq9Y167p1w7pp3bJuW3esu9Y96771wHpoPbIeW0+sp9Yz67n1wnppvbJeW2+st9Y76731wfpofbI+W1+sr9Y367v1w/pp/bJ+W3+sv9Y/O2RDNmwjNmpjNm4TNmlTNm0zNmtzNm8LtmhLtmwrtmprtm4btmlbtm07tmt7dthOYae0U9mp7TR2Wjudnd7OYGe0M9mZ7Sx2Vjubnd3OYcfZ8XbE9u3AjtoxO8FOtJPsnHYuO7edx85r57Pz2wXsgnYhu7BdxC5qF7OL2yXsknYpu7Rdxi5rl7PL2xXsinYlu7Jdxa5qV7Or2zXsmnYtu7Zdx65r17Pr2w3shnYju7HdxG5qN7Ob2y3slnYru7Xdxm5rt7Pb2x3sjnYnu7Pdxe5qd7O72z3snnYvu7fdx+5r97P72wPsgfYge7A9xB5qD7OH2yPskfYoe7Q9xh5rj7PH2xPsifYke7I9xZ5qT7On2zPsmfYse7Y9x55rz7Pn2wvshfYie7G9xF5qL7OX2yvslfYqe7W9xl5rr7PX2xvsjfYme7O9xd5qb7O32zvsnfYue7e9x95r77P32wfsg/Yh+7B9xD5qH7OP2yfsk/Yp+7R9xj5rn7PP2xfsi/Yl+7J9xb5qX7Ov2zfsm/Yt+7Z9x75r37Pv2w/sh/Yj+7H9xH5qP7Of2y/sl/Yr+7X9xn5rv7Pf2x/sj/Yn+7P9xf5qf7O/2z/sn/Yv+7f9x/5r/3NCDuTADuKgDubgDuGQDuXQDuOwDufwjuCIjuTIjuKojubojuGYjuXYjuO4jueEnRROSieVk9pJ46R10jnpnQxORieTk9nJ4mR1sjnZnRxOnBPvRBzfCZyoE3MSnEQnycnp5HJyO3mcvE4+J79TwCnoFHIKO0Wcok4xp7hTwinplHJKO2Wcsk45p7xTwanoVHIqO1Wcqk41p7pTw6np1HJqO3Wcuk49p77TwGnoNHIaO02cpk4zp7nTwmnptHJaO22ctk47p73TwenodHI6O12crk43p7vTw+np9HJ6O32cvk4/p78zwBnoDHIGO0Ococ4wZ7gzwhnpjHJGO2Ocsc44Z7wzwZnoTHImO1Ocqc40Z7ozw5npzHJmO3Ocuc48Z76zwFnoLHIWO0ucpc4yZ7mzwlnprHJWO2uctc46Z72zwdnobHI2O1ucrc42Z7uzw9np7HJ2O3ucvc4+Z79zwDnoHHIOO0eco84x57hzwjnpnHJOO2ecs84557xzwbnoXHIuO1ecq84157pzw7np3HJuO3ecu849577zwHnoPHIeO0+cp84z57nzwnnpvHJeO2+ct847573zwfnofHI+O1+cr84357vzw/np/HJ+O3+cv84/N+RCLuwiLupiLu4SLulSLu0yLutyLu8KruhKruwqrupqru4arularu06rut6bthN4aZ0U7mp3TRuWjedm97N4GZ0M7mZ3SxuVjebm93N4ca58W7E9d3AjboxN8FNdJPcnG4uN7ebx83r5nPzuwXcgm4ht7BbxC3qFnOLuyXckm4pt7Rbxi3rlnPLuxXcim4lt7Jbxa3qVnOruzXcmm4tt7Zbx63r1nPruw3chm4jt7HbxG3qNnObuy3clm4rt7Xbxm3rtnPbux3cjm4nt7Pbxe3qdnO7uz3cnm4vt7fbx+3r9nP7uwPcge4gd7A7xB3qDnOHuyPcke4od7Q7xh3rjnPHuxPcie4kd7I7xZ3qTnOnuzPcme4sd7Y7x53rznPnuwvche4id7G7xF3qLnOXuyvcle4qd7W7xl3rrnPXuxvcje4md7O7xd3qbnO3uzvcne4ud7e7x93r7nP3uwfcg+4h97B7xD3qHnOPuyfck+4p97R7xj3rnnPPuxfci+4l97J7xb3qXnOvuzfcm+4t97Z7x73r3nPvuw/ch+4j97H7xH3qPnOfuy/cl+4r97X7xn3rvnPfux/cj+4n97P7xf3qfnO/uz/cn+4v97f7x/3r/vNCHuTBHuKhHubhHuGRHuXRHuOxHufxnuCJnuTJnuKpnubpnuGZnuXZnuO5nueFvRReSi+Vl9pL46X10nnpvQxeRi+Tl9nL4mX1snnZvRxenBfvRTzfC7yoF/MSvEQvycvp5fJye3m8vF4+L79XwCvoFfIKe0W8ol4xr7hXwivplfJKe2W8sl45r7xXwavoVfIqe1W8ql41r7pXw6vp1fJqe3W8ul49r77XwGvoNfIae028pl4zr7nXwmvptfJae228tl47r73XwevodfI6e128rl43r7vXw+vp9fJ6e328vl4/r783wBvoDfIGe0O8od4wb7g3whvpjfJGe2O8sd44b7w3wZvoTfIme1O8qd40b7o3w5vpzfJme3O8ud48b763wFvoLfIWe0u8pd4yb7m3wlvprfJWe2u8td46b723wdvobfI2e1u8rd42b7u3w9vp7fJ2e3u8vd4+b793wDvoHfIOe0e8o94x77h3wjvpnfJOe2e8s94577x3wbvoXfIue1e8q94177p3w7vp3fJue3e8u9497773wHvoPfIee0+8p94z77n3wnvpvfJee2+8t9477733wfvoffI+e1+8r94377v3w/vp/fJ+e3+8v96/cCgMheEwEkbDWBgPE2EyTIXpMBNmw1yYDwthMSyF5bASVsNaWA8bYTNshe2wE3bDXjgcThFOGU4VTh1OE04bThdOH84QzhjOFM4czhLOGs4Wzh7OEY4Lx4cjYT8chKPhWDghnBhOCucM5wrnDucJ5w3nC+cPFwgXDBcKFw4XCRcNFwsXD5cIlwyXCpcOlwmXDZcLlw9XCFcMVwpXDlcJVw1XC1cP1wjXDNcK1w7XCdcN1wvXDzcINww3CjcONwk3DTcLNw+3ILq0bREX8RPIsg3aNCnTJHvcf0f8f0eE+t/Dj0u+4pMv8K9+8hUkX9HkK5Z8JSRficlX0n9XkLwRJG8EyRtB8kaQvBEkbwTJG0HyRpC8ESRvRJM3oskb0eSNaPJGNHkjmrwRTd6IJm9EkzeiyRux5I1Y8kYseSOWvBFL3oglb8SSN2LJG7HkjVjyRkLyRkLyRkLyRkLyRkLyRkLyRkLyRkLyRkLyRkLyRmLyRmLyRmLyRmLyRmLyRmLyRmLyRmLyRmLyRmLyRlLyRlLyRlLyRlLyRlLyRlLyRlLyRlLyRlLyRlIS/d//5rg4cMaDMwJOH5wBOKPgjIEzAZyJ4ARr8WAtHqzFg7V4sBYP1uLBWjxYiwdr8WAtHqxFwFoErEXAWgSsRcBaBKxFwFoErEXAWgSs+WAtCn4bBb+Ngt/GwG9j4Mti4Mti4Mti4Mti4Mti4MtiYC0G1mJgLQGsJYC1BLCWANYSwFoCWEsAawlgLQGsJYC1RLCWCNYSwVoiWEsEa4lgLRGsJYK1RLCWCNaSwFoSWEsCa0lgLQmsJYG1JLCWBNaSwBqoJQJqiYBaIqCWCKglAmqJgFoioJYIqCUCaomAWiKglgioJQJqiYBaIqCWCKglAmqJgFoioJYIqCUCaomAWiKglgioJQJqiYBaIqCWCKglAmqJgFoioJaID9Z8sOaDNR+s+WDNB2s+WPPBmg/WArAWgLUArAVgLQBrAVgLwFoA1gKwFoC1KFiLgrUoWIuCtShYi4K1KFgDlkSAJRFgSQRYEgGWRIAlEWBJBFgSAZZEgCURYEkEWBIBlkSAJRFgSQRYEgGWRIAlEWBJBFgSAZZEgCURYEkEWBIBlkSAJRFgSQRYEgGWRIAlEWBJBFgSAZZEgCURYEkEWBIBlkSAJRFgSQRYEgGWRIAlEWCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlvjAEh9Y4gNLfGCJDyzxgSU+sMQHlgTAkgBYEgBLAmBJACwJgCUBsCQAlgTAkgBYEgBLAmBJACwJgCUBsCQAlgTAkgBYEgBLAmBJACwJgCUBsCQAlgTAkgBYEgBLAmBJAAAJACABACQAgAQAkAAAEgBAAgBIAAAJACABACQAgAQAkAAAEgBAAgBIAAAJACABACQAgAQAkAAAEgBAAgBIAAAJACABACQAgAQAkAAAEgBAAgBIAAAJACABACQAgAQAkAAAEgBAAgBIAAAJACABACQAgAQAkAAAEgBAAgBIAAAJACABACQAgAQAhQBIEAAJAiBBACQIQP4ByD8A+Qcg/wDkH4D8A5B/APKPgvyjIP8oyD8K8o+C/KMg/yjIPwryj4L8oyD/KMg/CvKPguajoPkoaD4Kmo+C5qOg+ShoPgqaj4Lmo6D5KKg7CuqOgqSjIOkoiDcK4o2CYqOg2CgoNgqKjYJio6DYKCg2CoqNgmKjoNgoKDYKio2CYqOg2CgoNgqKjYJio6DYKCg2CoqNgmKjoNgoKDYKio2CYqOg2CgoNgqKjYJio6DYKCg2CoqNgmKjoNgoKDYKio2CYqOg2CgoNgqKjYJio6DYKCg2CoqNgmKj4MmPgic/Cp78KHjyo6DuKHjyoyD0KAg9CkKPgtCj4MmPguajoPkoaD4Kmo+C5qOg+ShoPgqaj4HmY6D5GGg+BpqPgeZjoPkYaD4Gmo+B5mOg+RhoPgaaj4EnPwbyj4H8YyD/GMg/BvKPgfxjIP8YyD8G8o+B/GPgyY+BJz8GUIgBFGLgyY/9TxF3smpb213ptRqKiwm0RtLHnEXneRbOXf8dEthSoCScXL2Ff31t1l42mzXgwNMXGxrn+/Mh31Tkm4p83/75vv3zDUi+Acn37Z9vS/JtSb4tybcl+bYk35bk25J8W5JvS/JtSb4tybcl+bYk35bk25J8W5JvS/JtSb4tybcl+bYk35bk25J8W5JvS/JtSb4tybcl+bYk35bk25J8W5JvS/JtSb4tybcl+bYk35bk25J8W5JvS/JtSb4tybcl+bYk35bk25J8W5JvS/JtSb4tybcl+bYk35bk25J8W5JvS/JtSb4tybcl+bYk35bk25J8W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1b8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxb8nxT8XxT8Xz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78Hz78HzFPl+xz1fs8xX7fMU+X7HPV+zzFft+xb5fse9X7PsV+37Fvl+x71fs+xX7fsW+X7HvV+z7Fft+xb5fse9X7PsV+37Fvl+x71fs+xX7ft/+7/ft/37f/u+X9Psl/X7f/u9X9/vV/X51v1/d71f3+9X9fnW/X93vV/f71f1+db9f3e+X9Psl/X5Jv1/S75f0+yX9fh2/c//i3/wf/8+//at3//KPx++PR/3x6D8e88dj/3jkj4fPef54vP/8yB+fnD8+OX98cv745Pzxydm/+H//9Hd/+6/+5h//z7/7F3/7N3/68+Mf/q8//+Rf/sNf/d2f/vyzv/jf//Yf/+6fX3/97/759/7+r//vP//e3//p3/3pb/78/NNf/5u/+oc//+Lf/PUfH/jnY/9U4b/3r/7+H//tn/7ur//27/7lv/89/4Pv+R9+z//oe/7H3/M/+Z7/6ff8z77nf/49/4vv+V9+z//qe/7X3/O/+Z7/7ff8777nv/6e//33/B++5//4Pf+n7/k/f8//5Xv+r9/zf/P8i///n+n3l3/ZXuO1XvE6r8fr/eP1+0uvn1d5ufFz4+fGz42fGz83fm6UG+VGuVFulBvlRrlRbpQb5Ua70W60G+1Gu9FutBvtRrvRbowb48a4MW6MG+PGuDFujBvjxrqxbqwb68a6sW6sG+vGurFuxI24ETfiRtyIG3EjbsSNuHFunBvnxrlxbpwb58a5cW6cG48bjxuPG48bjxuPG48bjxuPG48brxuvG68brxuvG68brxuvG68b7x83/ilHr59XebXXeK1XvM7r8XJD5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+d/3T+0/lP5z+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnpvHReOi+dl85L56Xz0nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dt85b563z1nnrvHXeOm+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnofHQ+Oh+dj85H56Pz0fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dr85X56vz1fnqfHW+Ol+dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P56fx0fjo/nZ/OT+en89P5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur8/aPz+ss/Ov+n18+rvNprvNYrXuf1eLnxc+Pnxs+Nnxs/N35u/Nz4ufFz4+dGuVFulBvlRrlRbpQb5Ua5UW60G+1Gu9FutBvtRrvRbrQb7ca4MW6MG+PGuDFujBvjxrgxbqwb68a6sW6sG+vGurFurBvrRtyIG3EjbsSNuBE34kbciBvnxrlxbpwb58a5cW6cG+fGufG48bjxuPG48bjxuPG48bjxuPG48brxuvG68brxuvG68brxuvG6oXMerni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhyserni44uGKhysKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCKgisKrii4ouCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puCagmsKrim4puDa/wrXPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DNQ/XPFzzcM3DDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDDQ83PNzwcMPDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDLQ+3PNzycMvDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDHwx0Pdzzc8XDH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')format(\"woff\");}.ff2{font-family:ff2;line-height:1.064941;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff3;src:url('data:application/font-woff;base64,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GYw7GG8w/mCCwYSDiQYTDyYZTDqYbDD5YIrBlINpB9MNph/MMJhxMNNg5sEsg1kHsw1mH8wxGDUYDmSgg3rQDNpBN+gHcw7mGsw9mGcw32DBwcKDRQaLDhYbLD5YYrDkYKnB0oNlBssOlhssP1hhsOJgpcHKg1UGqw5WG6w+WGOw5mCtwdqDdQbbOa7jOb4TOKETObGTOKmTOblTOKUzhjOmM5YztjOOM64znjO+M4EzoTORM7EziTOpM5kzuTOFM6UzlTO1M40zrTOdM70zgzOjM5MzszOLM6szmzO7M4czyhk64qhTObXTOK3TOb0zpzOXM7czjzOvM58zv7OAs6CzkLOws4izqLOYs7izhLOks5SztLOMs6yznLO8s4KzorOSs7KzirOqs5qzurOGs6azlrO2s46zrrOes76zgbOhs5GzsTPa2cTZ1NnM2dzZwtnS2crZ2tnG2dbZztne2cHZ0dnJ2dnZxdnV2c3Z3dnD2dPZy9nb2cfZ19nP2d85wDnQOcg52DnEOdQ5zDncOcI50jnKOdo5xjnWOc453jnBOdE5yTnZOcU51TnNOd05wznTOcs52znHOdc5zznfucC50LnIudi5xLnUucy53LnCudK5yrnauca51rnOud65wbnRucm52bnFudW5zbnducO507nLudu5x7nXuc+533nAedB5yHnYecR51HnMedx5wnnSecp52nnGedZ5znneecF50XnJedl5xXnVec153XnDedN5y3nbecd513nPed/5wPnQ+cj52PnE+dT5zPnc+cL50vnK+dr5xvnW+c753vnB+dH5yfnZ+cX51fnN+d35w/nT+cv52/nH+dcduI7rup7ru4EbupEbu4mbupmbu4VbumO4Y7pjuWO747jjuuO547sTuBO6E7kTu5O4k7qTuZO7U7hTulO5U7vTuNO607nTuzO4M7ozuTO7s7izurO5s7tzuKPcoSuuupVbu43bup3bu3O6c7lzu/O487rzufO7C7gLugu5C7uLuIu6i7mLu0u4S7pLuUu7y7jLusu5y7sruCu6K7kru6u4q7qruau7a7hrumu5a7vruOu667nruxu4G7obuRu7o91N3E3dzdzN3S3cLd2t3K3dbdxt3e3c7d0d3B3dndyd3V3cXd3d3N3dPdw93b3cvd193H3d/dz93QPcA92D3IPdQ9xD3cPcw90j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W/615V9b/rU1X1vztTVfW/O1NV9b87U1X1vztTVfW/O11V1b3bXVXdtvCrWFXlvotYVeW+i1hV5b6LWFXlvotYVeW+i1hV5b6LWFXlvotYVeW+i1hV5b6LWFXlvotYVeW+i1hV5b6LWFXlvotYVeW+i1hV5b6LWFXlvotYVeW+i1hV5b6LWFXlvotYVeW+i1hV5b6LWFXlvotYVeW+i1hV5b6LWFXlvotYVeW+i1/aZQ228Ktf2mUNtvCrWNQm2/KdS2D7X9plDbVNQ2FbVNRW1TUdtU1DYVtU1FbVNR21TUNhW1TUVjU9HYVDQ2FY1NRWNT0dhUNDYVjU1FY1PR2FQ0NhWNTUVjvyk0thqNrUZjq9HYajS2Go2tRmOr0dhqNLYaja1GY78pNPabQmNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWdbUlnW9LZlnS2JZ1tSWdb0tmWdLYlnW1JZ1vS2ZZ0tiWdbUlnW9LZlnS2JZ1tSWdb0tmWdLYanU1FZ1PR2VR0NhWdTUUn/9eH2Y9uU9HZVHQ2FZ1NRWdT0dlUdDYVnU1FZ1PR2VR0NhWdTUVnU9HZVHQ2FZ1N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85rOazqv6bym7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+puqLuh7oa6G+pu+BZv6Lyl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byl85bOWzpv6byj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyj847OOzrv6Lyn857Oezrv6byn857Oezrv6byn857Oezrv6byn857Oezrv6byn857Oezrv6byn857Oezrv6byn857Oezrv6byn857Oezrv6byn81613GCjnXcavdG2W284+1bbbrQV/4BDxN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sPbH3xN4Te0/sGDnByAlGTjBygpETjJxg5AQjJxg5wcgJRk4wcoKRE4ycYOQEIycYOcHICUZOMHKCkROMnGDkBCMnGDnByAlGTjBygpETjJxg5AQjJxg5wcgJRk4wcoKRE4ycYOQEIycYOcHICUZOMHKCkROMnGDkBCMnGDnByAlGTjBygpETjJxg5AQjJxg5wcgJRk4wcoKRE4ycYOQEIycYOcHICUZOMHKCkROMnGDkBCMnGDnByAlGTjBygpETjJxg5AQjJxg5wcgJRk4wcoKRE4ycYOQEIycYOcHICUZOMHKCkROMnGDkBCMnGDnByAlGTjBygpETjJxg5AQjJxg5wcgJRk4wcoKRE4ycYOQEIycYOcHICUZOMHKCkROMnGDkBCMnGDnByAlGTjBygpETjJxg5AQjJxg5wcgJRk4wcoKRE4ycYOQEIycYOcHICUZOMHKCkROMnGDkBCMnGDnByAlGTjBygpETjJxg5AQjJxi5/7y4QedDOh/S+ZDOh3Q+pPMhnQ/pfEjnQzof0vmQzod0PqTzIZ0P6XxI50M6H9L5kM6HdD6k8yGdD+l8SOdDOofCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4AcAJAE4AcAKAEwCcAOAEACcAOAHACQBOAHACgBMAnADgBAAnADgBwAkATgBwAoATAJwA4AQAJwA4AcAJAE4AcAKAEwCcAOAEACcAOAHACQBOAHACgBMAnADgBAAnADgBwAkATgBwAoATAJwA4AQAJwA4AcAJAE4AcAKAEwCcAOAEACcAOAHACQBOAHACgBMAnADgBAAnADgBwAkATgBwAoATAJwA4AQAJwA4AcAJAE4AcAKAEwCcAOAEACcAOAHACQBOAHACgBMAnADgBAAnADgBwAkATgBwAoATAJwA4AQAJwA4AcAJAE4AcAKAEwCcAOAEACcAOAHACQBOAHACgBMAnADgBAAnADgBwAkATgBwAoATAJwA4AQAJwA4AcAJAE4AcAKAEwCcAOAEACcAOAHACQBOAHACgBMAnADgBAAnADgBwAkA7j8vbtA5FE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyicQOEECidQOIHCCRROoHAChRMonEDhBAonUDiBwgkUTqBwAoUTKJxA4QQKJ1A4gcIJFE6gcAKFEyic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')format(\"woff\");}.ff3{font-family:ff3;line-height:1.096680;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff4;src:url('data:application/font-woff;base64,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Dmen86ezy9nt7HH2Ovuc/c4B56BzyDnsHHGOOsec484J56RzyjntnHHOOuec884F56JzybnsXHGuOtec684N56Zzy7nt3HHuOvec+84D56HzyHnsPHGeOs+c584L56XzynntvHHeOu+c984H56PzyfnL+ex8cb46fzvf3CQXcVEXc3GXcEmXcmmXcVmXc3lXcEVXcmVXcVVXc3XXcE3Xcm3XcV035KZwU7qp3NRuGjetm85N72ZwM7qZ3MxuFjerm83N7uZwc7q53NxuHjfZ9VzfDbsRN+rG3LibcPO6+dz8bgG3oFvILewWcYu6xdzibgm3pFvKLe2Wccu65dzybgW3olvJrexWcau61dzqbg23plvLre3Wceu69dz6bgO3ofuD28ht7DZxm7rN3OZuC7el28pt7bZx27rt3PZuB7ej28nt7HZxu7rd3O5uD7en28vt7fZx+7o/uv3cn9z+7s/uL+4Ad6A7yB3sDnGHusPc4e4Id6Q7yv3V/c393f3DHe2Occe649zx7gR3ojvJnexOcae609zp7gx3pjvLne3Ocee689z57gJ3obvIXewucZe6y9zl7gp3pbvKXe2ucde669z17gZ3o7vJ3exucbe629zt7g53p/unu8vd7e5x97r73P3uAfege8g97B5xj7rH3OPuCfeke8o97Z5xz7rn3PPuBfeie8m97F5xr7rX3OvuDfeme8u97d5x77r33PvuA/eh+8h97D5xn7rP3OfuC/el+8p97b5x37rv3PfuB/ej+8n9y/3sfnG/un+730JJISSEhrAQHiJCZIgK0SEmxIa4EB8SQmJICskhJaSGtJAeMkJmyArZISfkhkKhFKGUoVSh1KE0obShdKH0oQyhjKFMocyhLKGsoWyh7KEcoZyhXKHcoTyh5JAX8kPhUCQUDcVC8VAilDeUL5Q/VCBUMFQoVDhUJFQ0VCxUPFQiVDJUKlQ6VCZUNlQuVD5UIVSR6t6hdZ48Rb3vT//7M/GfZ3Jxr8Q/Tz/P92fy96f//fn9c36x78/vnw//9/NenjyJf56x738fC39/Rr4/o9+fse/P+Pfnv/9e8e/PEv8849/viSd/f3rfn/735/f749/vj3+/P/79/vj3++Pf749/vz/+z/2RYsXoio3bN6/QPFeefw/J/x68fw/hfw+Rfw/Rfw+xfw/xfw8J5t978gSn5ODkBSc/OIWDUyQ4RYNTcJ8X3OcF93nBfV5wnxfc4gW3eLHgFNznB/f5wX1+cJ8f3OcHX58f3OwHN/vBzeHgvnBwXzi4LxzcFw7uCwf3hYP7wnBfPDgFX3Mk2IgEG5FgIxJsRIKNSLARCTYiwUYk2IgEG9FgIxpsRIONaLARDTaiwUY02IgGG9Hg5lhwcyy4ORbcHAtujgU3x4L7YsF9seBrjgU3x4Ob48HN8eDmeHBzPLg5HnzN8WAjHtwcD25OBDcngpsTwc2J4OZEcF8iuC8RfM2J4OZEgg36SIajB0cfjmE4RuAYhWMMjnE4wkRyHjjCWjKsJcNaMqwlw1oyrCXDWjKsJcOaB2serHmw5sGaB2serHmw5sGaB2serPmw5sOaD2s+rPmw5sOaD2s+rPmw5sNaGNbCsBaGtTCshWEtDGthWAvDWhjWwrAWgbUIrEVgLQJrEViLwFoE1iKwFoG1CKxFYS0Ka1FYi8JaFNaisBaFtSisRWEtCmsxWIvBWgzWYrAWg7UYrMVgLQZrMViLwVoc1uKwFoe1OKzFYS0Oa3FYi8NaHNbisJaAtQSsJWAtAWsJWEvAWgLWErCWgDUA5H9+2oBjMhw9OPpwDMMxAscoHGNwjMMR1sASDyzxwBIPLPHAEg8s8cASDyzxwBIPLPHAEg8s8cASDyzxwBIPLPHAEg8s8cASDyzxwBIPLPHAEg8s8cASDyzxwBIPLPHAEg8s8cASDyzxwBIPLPHAEg8s8cASDyzxwBIPLPHAEg8s8cASDyzxwBIPLPHAEg8s8QAQDwDxABAPAPEAEA8A8QAQDwDxABAPAPEAEA8A8YAKD6jwgAoPqPCACg+o8IAKD6jwgAoPfPDABw988AAFD1DwAAUPUPAABQ9Q8AAFD1DwAAUPJPBAAg8k8EECHyTwQQIfJPBBAh8k8EECHyTwQQIfJPBBAh8k8EECHyTwQQIfJPBBAh8k8EECHyTwQQIfJPBBAh8k8EECHyTwQQIfJPBBAh8k8EECHyTwQQIfJPBBAh8k8CF/H/L3IX8f8vchfx/y9yF/H/L3IX8fmveheR9C9yF0H0L3IXQfQvchdB9C9yF0P/K/JuC/Apr3IXQfQvehbh/q9iFpH5L2IWkffibw4WcCH5L2IWkfkvYhaR+S9iFpH175PiTtQ9I+JO3DK9+Hun2o24e6fajbh7p9qNuHpH1I2oekfUjah6TD0HEYOg5Dx2HoOAwdh6HjMHQcho7D0HEY4g1DvGGINwzxhiHeMMQbhnjDEG8Y4g1DvGGINwzxhiHeMMQbhnjDEG8Y4g1DvGGINwzxhiHeMMQbhnjDEG8Y4g3DazwM8YYh3jDEG4Z4wxBvGOINQ7xhiDcM7+4wdByGjsPQcRg6DkPHYeg4DMWGodhw5H9dBl86FBuGt3QY4g1DvGF4S4eh4zB0HIa3dBiSDkPSYUg6DEmHIekwvLvD8O4OQ+hhCD0MoYch9DCEHobQw/DuDkPzYWg+DM2HofkwNB+G5sPQfBiaD0PzYWg+DM2H4Y0ehvzDkH8YfswPgwRhkCAMEkTg5R4BFCKAQgRQiAAKEUAhAihEAIUIoBABFCLwco+ADxHwIQI+RMCHCPgQAR8i4EMEfIiADxHwIQI+RMCHCPgQAR8i4EMEfIiADxHwIQI+RMCHCPgQAR8i4EMEfIiADxHwIQLv+QhQEQEqIkBFBKiIABURoCICVESAighQEQEqIkBFBH7Mj4AaEVAjAmpEQI0IvP0j8PaPgCURsCQClkTAkghYEgFLImBJBCyJgCURsCQClkTAkghYEgFLImBJBCyJgCURsCQClkTAkghYEgFLImBJBCyJgCURsCQClkTAkghYEgFLImBJBCyJgCURsCQClkTAkghYEgFLImBJBCyJgCURsCQClkTAkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgiVRsCQKlkTBkihYEgVLomBJFCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkhhYEgNLYmBJDCyJgSUxsCQGlsTAkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOlsTBkjhYEgdL4mBJHCyJgyVxsCQOasRBjTioEQc1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQSokQA1EqBGAtRIgBoJUCMBaiRAjQT8BJKAn0ASYEkCLEmAJYlEgvt+TM6TJ8//Oif/r7P3v84+07Jd706tkvN44eAUCU7Rf09+4t9TOE9wSmb6NO/SMVezDh3b0x07NP/n0K3nP7/DdmvVpfk/v8e06Ni9y/dT6x7fP9e1da9/Pte1eY/mHf45Nm/dslW3fz7YofX3C//Z6NC9fZf/bvz38J+N/xy+b/zn+M/GP6f/bPz3c//Z+O/n/tn47/Gfjf9+8L8b/z19/y+KBt+DaPA9iAbfg2gsOMWDU/B9iQXfl1hycPKCU/B9jgUbsWAjFmzEgo1YsBELNuLBRjzYiAcb8WAjHmzEg414sBEPNuLBRjzYSAQbiWAjEWwkgo1EsJEINhLBRiLYSAQbiX83/ud/u+CUHJy84OQHp3BwigSnaHCKBad4cAo2koON5GAjOdhIDjaSg43kYCM52EgONpKDjeRgwws2vGDDCza8YCNoKzloKzloK9kLNrxgwws2/GDDDzb8YMMPNvxgww82/GDDDzb8YCNoOjloOjkcbISDjXCwEQ42wsFGONgIBxvhYCMcbESCjUiwEQk2IsFGJNiIBBuRYCMSbESCjUiwEQ02osFGNNiIBhtB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB58lB517QuRd07gWde0HnXtC5F3TuBZ17Qede0LkXdO4FnXtB517QuRd07gWde0HnXtC5F3TuBZ17Qede0LkXdO4FnXtB517QuRd07gWde0HnXtC5F3TuBZ17Qede0LkXdO4FnXtB517QuRd07gWde0HnXtC5F3TuBZ17Qede0LkXdO4FnXtB517QuRd07gWde0HnXtC5F3TuBZ17Qede0LkXdO4FnXtB517QuRd07gWde0HnXtC5F3TuBZ17Qede0LkXdO4FnXtB517QuRd07gWde0HnXtC5F3TuBZ17Qede0LkXdO4FnXtB517QuRd07gWde0HnXtC5F9TtBXV7Qd1eULcX1O0FdXtB3V5Qt5eAm//96v2gbj+o2w/q9oO6/aBuP6j7P386r2iurt07Ne/SumMXthgci8OxBBxLwrFUcPz3rqBxP2jcDxr3g8b/8wfzKvzffznBVoLLK/+ffx5k/p8/lVcNPln9/34yGApC94PQ/SB0PwjdD0L3g9D9IHQ/CN0PQveD0P0gdD8I3Q9C94PQ/SB0PwjdD0L3g9D9IHQ/CN0PQveD0P0gdD8I3Q9C94PQ/SB0PwjdD0L3g9D9IHQ/CN0PQveD0P0gdD8I3Q9C94PQ/SB0PwjdD0L3g9D9IHQ/CN0PQveD0P0gdD8I3Q9C94PQ/SB0PwjdD0L3g9D9IHQ/CN0PQveD0P0gdD8I3Q9C94PQ/eCF7gfJ+0HyfpC8HyTvB8n7QfJ+kLwfJO8HyftB8uEg+XCQfDhIPhwkHw6SDwfJh4MX+v/r4Y5RRUePIIxuwSsx73ZXtaTVDE7GDBhn3r9fMidrUFDRx58cFA96POjxoMeDHg96POgRe8QesUfs8aDHgx4Pejzo8aBH6fGgx4MeD3p0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/np/HR+Oj+dn85P56fz0/mj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+afzT+efzj+dfzr/dP7p/NP5p/NP55/OP51/Ov90/un80/mn80/nn84/nX86/3T+6fzT+afzT+efzj+dfzr/dP7p/NP5p/NP55/OP51/Ov90/un80/mn80/nn84/nX86/3T+6fzT+afzT+efzj+dfzr/dP7p/NP5p/NP55/OP51/Ov90/un80/mn80/nn84/nX86/3T+6fzT+afzT+efzj+dfzr/dP7p/NP5p/NP55/OP51/Ov90/un80/mn80/nn84/nX86/3T+6fzT+afzT+efzr+/O59ff3f++/pxjWtdcdV1rsf1umz82Pix8WPjx8aPjR8bPzZ+bPzY+LExNsbG2BgbY2NsjI2xMTbGxtpYG2tjbayNtbE21sbaWBuxERuxERuxERuxERuxERu1URu1URu1URu1URu1URtn42ycjbNxNs7G2TgbZ+NsPDYeG4+Nx8Zj47Hx2HhsPDYeG6+N18Zr47Xx2nhtvDZeG6+N18Zn47Px2fhsfDY+G5+Nz8ZnQ+dA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3ABxA8QNEDdA3GBwg7wN6Dag24BuA7oN6DZ42+BtA7UNyjYA2wBsA7ANwDYA2wBsA7ANwDYA2wBsA7ANwDYA2wBsA7ANwDYA2wBsA7ANwDYA2wBsA7ANwDYA2wBsA7ANwDYA2wBsA7ANwDYA2wBsA7ANwDYA2wBsA7ANwDYA2+/Lhi5RtkHZBmUblG1QtkHZBmUblG1QtkHZBmUblG1QtkHZBmX7fZ3rcb0uG7pcXa4uIbaB2AZiG4jt92VDl6vL1eXqkmD7fdnQ5eqSXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfi14deGXxt+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm15deWX1t+bfm19UO3JdnWD93WD92Wbls/dFvObTm35dyWc1vObf3QbYm3Jd7WD92WfVs/dFsKbv3QbXm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWglsKbim4peCWgts3v/7x5x9//vG///71a/b553/++ve/fDIldxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGWxhuYbiF4RaGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhoufwwWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4uLncPFzuPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxcerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjof7fX3/B46UOvYAAAAAAQADAAkACgAVAAf//wAPeJwt1H1sjVccwPHz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wUYONnKwkYONHGzkYCMHGznYyMFGDjZysJGDjRxs5GAjBxs52MjBRg42crCRg40cbORgIwcbOdjIwUYONnKwkYONHGzkYCMHGznYyMFGDjZysJGDjRxs5GAjBxs52MjBRg42crCRg40cbORgIwcbOdjIwUYONnKwkYONHGzkYKNgH+2ENnKwkYONHGzkYCMHGznYyMFGDjZysJGDjRxs5GAjBxs52MjBRg42crCRg40cbORgIwcbOdjIwUYONnKwkYONHGzkYCMHGznYyMFGDjZysJGDjRxs5GAjBxs52MjBRg42crCRg40cbORgIwcbOdjIwUYONnKwkYONHGzkYCMHGznYyMFGDjZysJGDjRxs5GAjBxs52MjBRg42crCRg40cbORgIwcbOdjIwUYONnKwkYONHGzkYCMHGznYyMFGDjZysFHLNd5AG+kAOpAOooPpEDqUDqPDaRMdQUfSUbSZjqZj6Fg6jo6nE+hEOolOplPoVDqNTqcz6Ew6i86mc+hcOo/eQ+fTBXQhvZcuoovpErqULqP30eV0BV1J76er6Gq6hq6l6+h6qlCValSnBjWpRW3aci241KMb6Ea6iW6mW+hWuo1upzvoTvoA3UV30z10Lw1s5GAjJ7SRg40cbORgIwcbOdjIwUYONnKwkYONHGzkYCMHGznYyMFGDjZysJGDjRxs5GAjBxs52MjBRg42crCRg40cbORgI9YHGznYyMFGzmEbHbbRIWAjFxu52MjFRi42crGRi41cbORiIxcbudjIxUYuNnKxkYuNXGzkYiMXG7nYyMVGLjZysZGLjVxs5GIjFxu52MjFRi42crGRi41cbORiIxcbudjIxUYuNnKxkYuNXGzkYiMXG7nYyMVGLjZysZGLjVxs5GIjFxu52MjFRi42crGRi41cbORiIxcbudjIxUYuNnKxkYuNXGzkYiMXG7nYyMVGLjZysZGLjVxs5GIjFxu52MjFRi42crGRi41cbORiIxcbBXtnN7SRi41cbORiIxcbudjIxUYuNnKxkYuNXGzkYiMXG7nYyMVGLjZysZGLjVxs5GIjFxu52MjFRi42crGRi41cbORiIxcbudjIxUYuNnKxkYuNXGzkYiMXG7nYyMVGLjZysZGLjVxs5GIjFxu52MjFRi42crGRi41cbORiIxcbudjIxUYuNnKxkYuNXGzkYiMXG7nYyMVGLjZysZGLjVxs5GIjFxu52MjFRi42crGRi41cbORiIxcbudjIxUYuNnKxkYuNWq7xBtpIB9CBdBAdTIfQoXQYHU6b6Ag6ko6izXQ0HUPH0nF0PJ1AJ9JJdDKdQqfSaXQ6nUFn0ll0Np1D59J59B46ny6gC+m9dBFdTJfQpXQZvY8upyvoSno/XUVX0zV0LV1H11OFqlSjOjWoSS1qU4e2XBce3UA30k10M91Ct9JtdDvdQXfSB+guupvuoXtpYCMXG7mhjVxs5GIjFxu52MjFRi42crGRi41cbORiIxcbudjIxUYuNnKxkYuNXGzkYiMXG7nYyMVGLjZysZGLjVxs5GIjFxuxMtjIxUYuNnIP2+iwjQ4BG3nYyMNGHjbysJGHjTxs5GEjDxt52MjDRh428rCRh408bORhIw8bedjIw0YeNvKwkYeNPGzkYSMPG3nYyMNGHjbysJGHjTxs5GEjDxt52MjDRh428rCRh408bORhIw8bedjIw0YeNvKwkYeNPGzkYSMPG3nYyMNGHjbysJGHjTxs5GEjDxt52MjDRh428rCRh408bORhIw8bedjIw0YeNvKwkYeNPGzkYSMPG3nYyMNGHjbysJGHjTxs5GEjDxt52CjYL3uhjTxs5GEjDxt52MjDRh428rCRh408bORhIw8bedjIw0YeNvKwkYeNPGzkYSMPG3nYyMNGHjbysJGHjTxs5GEjDxt52MjDRh428rCRh408bORhIw8bedjIw0YeNvKwkYeNPGzkYSMPG3nYyMNGHjbysJGHjTxs5GEjDxt52MjDRh428rCRh408bORhIw8bedjIw0YeNvKwkYeNPGzkYSMPG3nYyMNGHjbysJGHjTxs5GEjDxt52MjDRh428rCRh408bNRyjTfQRjqADqSD6GA6hA6lw+hw2kRH0JF0FG2mo+kYOpaOo+PpBDqRTqKT6RQ6lU6j0+kMOpPOorPpHDqXzqP30Pl0AV1I76WL6GK6hC6ly+h9dDldQVfS++kqupquoWvpOrqeKlSlGtWpQU1qUZs61KUt18gGupFuopvpFrqVbqPb6Q66kz5Ad9HddA/dSwMbedjIC23kYSMPG3nYyMNGHjbysJGHjTxs5GEjDxt52MjDRh428rCRh408bORhIw8bedjIw0YeNvKwkYeNPGzkYSMPG3nYiDXBRh428rCRd8BsFBwfVxJ50UZExDEcrW2tXykzPLOFY7B90Z+2Do+VGxwHN8JxcOMcB7eK4+C24ji4MsfBTXMc3DzHwa3jOLgljoNbz3Fwj8jMz8wXbTMLMyvEZzKrM4Y4PmNnNopTM5szj4qzwvNSEG39Hiu6vMe5iWU+n7nYPzc9Mj3839I700cclVmQWSA++x8/pyVxlP/ZcaKr6P0Rzuuhcznq/Ws+JtqJi0QfMe4AX5JD51K+uV21f9dLGPT28JiGXwyPaVjNMQ1bvePavvTfXqMP/u37Xwf9Duh18MGn3cZflbi/Lt1EXzFBTPuPbQEffM7eb78UdPXH3mfs/1s+qdvz/qdxcG5r77ZW73c7CGr+m99vHLDbyf6nfmB+m/EfupXtf87/E6dlHBK34P0v9cE/J8aH3Hec/Lbtu/t7nNekf5pv7p2Oz9zgn3L7TM9MT9Ehc4t/+ieyvzqFc9Gp4vd+0Olf9Amd/kUiIt8kpkZqIsdFukRuijRF5kesyCOR5yN/lTJSe+kiqbfULC2SPOkx6efS69F89KTopdG+0XHRZdHN0Seiv4z+M1aKdYpdGesXmxRbGdseeyr2clyKt4mfEb8m3hCfFl8T3xX/Xvz3iUTiqMTZiesTgxKzEkriwcSziT8lq5PHJs9L9kwOS85LGsmHk88lX0vJqXaprqleqZGphSkn9WjqZ6m/VWWrOlR1q+pTNaZqSdXGqserXqp6o7pQ3bH68uo7qidUL6/eWv1k9a9biVb1rU5rdXWr/q2mtFrVamerp1u9UhOraVvTuaZ7zYCaGTXravbUPFPzh9pU7TG159T2qB1SO6dWq32o9ke1r8o18nFyF3+NU0L2r4vrhBS/N2jtmfSMNyeZzweToLVn0n2TdkzaMWlXMTmeyfFMjq+YtGfSnkn7iskJTE5gckLFpAOTDkw6VExOZHIikxMrJicxOYnJSRWTk5mczOTkiklHJh2ZdKyYnMLkFCanVEw6MenEpFPF5FQmpzI5tWJyGpPTmJxWMTmdyelMTq+YnMHkDCZnVEzOZHImkzMrJp2ZdGbSuWJyFpOzmJxVMTmbydlMzq6YfIHJF5h8oWJyDpNzmJxTMTmXyblMzq2YnMfkPCbnVUzOZ3I+k/MrJl2YdGHSpWJyAZMLmFxQMenKpCuTrhWTC5lcyOTCislFTC5iclHF5GImFzO5uGLSjUk3Jt0qJpcwuYTJJRWTS5lcyuTSisllTC5jclnF5HImlzO5vGJyBZMrmFxRMbmSyZVMrqyYXMXkKiZXVUyuZnI1k6srJl9k8kUmX6yYXMvkWibXVkxuYHIDkxsqJj2Y9GDSo2LSk0lPJj0rJrcwuYXJLRWT3kx6M+ldMbmVya1Mbq2Y9GHSh0mfiklfJn2Z9K2Y3M7kdia3V0zuZHInkzsrJv2Y9GPSr2JyF5O7mNxVMenPpD+T/hWTBiYNTBoqJo1MGpk0VkwGMBnAZEDFZCCTgUwGVkwGMxnMZHDFZAiTIUyGVEyGMRnGZFjFZDiT4UyGV0yamDQxaaqYjGQyksnIikkzk2YmzRWT0UxGMxldMRnDZAyTMRWTsUzGMhlbMRnHZByTcRWTCUwmMJlQMZnEZBKTSRWTyUwmM5lcMZnCZAqTKRWTaUymMZlWMZnOZDqT6RWTmUxmMplZMZnNZDaT2RWTOUzmMJlTMZnLZC6TuRWTBUwWMFlQMVnIZCGThRWTe5ncy+TeiskiJouYLKqYLGaymMniiskSJkuYLKmYLGWylMnSiskyJsuYLKuY3MfkPib3VUyWM1nOZHnFZAWTFUxWVExWM1nNZHXFZA2TNUzWVEzWMlnLZG3FZB2TdUzWVUzWM1nPZH3FRGGiMFEqJioTlYlaMdGYaEy0ionORGeiV0wMJgYTo2JiMjGZmBUTm4nNxK6YOEwcJk7FxGXiMnErJh4Tj4lXMdnAZAOTDRWTjUw2MtlYMdnEZBOTTRWTzUw2M9lcMdnCZAuTLRWTrUy2MtlaMdnGZBuTbRWT7Uy2M9leMdnBZAeTHRWTnUx2MtlZMXmAyQNMHqiY7GKyi8muisluJruZ7K6Y7GGyh8meisleJnuZ7K2YPMjkQSYPVky+zOTLTL5cMXmIyUNMHvr/7d1faNbXGcDxc37R2MTX+Prkj09O0zTGalNrYrQhFf/OYDM1f3xNE40xy9x03ShjjDF2UbwowkC8KKWMrRtr2UXpWOlFkTHKKFVjGGWMsovSi9KLUcYoY4xRxij74/Y8p3EQahk28Y1l34v3uTnK+5zn9/n98p7znod3wcjlPHI5j1xeMHIlj1zJI1cWjFzNI1fzyNUFI7N5ZDaPzC4YuZZHruWRawtG5vLIXB6ZyyNFaJ7fs/U1acxr0i15TfpgXpN25zVpj61Jz4QdeV+3L+/r7sz7unvyvu6+vK97IO/rDuR93c/nfd1DeV93KO/rjuR93VFb1f4wHCs/Z3fVdPlnlsNXLTffYzhiK90We1Xymvm5+XX3ra+V7W90KM/P6IzvH+Sci5xzbc65PudcyjmvzTmXc87NOeeWnHNrzvnunHPbf3ehf5p3oedCn+VcY2v84fCEvafa68lFZH2nz3F8fo5Ti7oyhf2LyapmvyJ0hNFwLu9YJXtdrOI1qv5sP5pjk706Fsyz+t/4LeXdXN3MY97fa7H37AxdN6nijW83bmUWXg+/i/weKsJYmFx0RT5dFtGy8Bxq8r5/7yfOzuPjOU7k3P0ecls19hyYCqeXKPuF73LruR2tSm5H/8d9VbmDdFZuk4vKJ1TlVv/XxBI/Gapb+6W9hz/ttVpq8Te/trf/XW5Y6Jy38HHNp3L8bhU/53z0bah/zvm45lPzWd9JOU0sU52G87dantNi74Lq5n7j0+D5+Sf6hUVk/9mY63j+xO5zXewdvBz+V9rToZK/b744/5fv6WW4YtWd81Jft+V4Riz3dav+nOPMY/YX7Hjxysr6VWfrXi9pw7fKv2nc3Pzk+ndSX9tT7e9vGNj4401/66pseal7xbaZ7a/2Sf/Xd/5qd8feJ/a/NdBz8MLge4f3DH1/5C+VI2MvjF8/MXny0nQpDIVnw/PhhfBSeCX8IrwWZsMb4c3wVngn/C78IfwpfBA+DNfjilgfy7EltsXO2BV7Yl/cFT8XB+NwHIuTcSaejY/Hb8bvxHPxfLwQn4rfiz+KP4kvxpfjpfhqfD3OxV/H38a347vxvfh+/HP8a/x7EYraolRIoUV7cV+xpegt+os9xUBxqBgtxtNdfi42rfIzsqnWz8umlX52Nq3wc7Spxs/UpsLP16aYz9r+O5++vZ5P4v4rn8r9Zz6h+w8/rStf8VP7ctZP8MsZP80vX/aT/fIlP+Uvp/3Ev3zRT//LjHcCyBe8K0CmvUNATnm3gEx554Cc9C4CmfSOAjnh3QVy3DsNZMK7DmTMuxHkmHcmyFHvVZBR71uQIe9nkCPe2yAD3u0gB7zzQfZ7L4Ts874I2e39ErLLeydkp3dTyMPeWSH93mUhfd53IQ95D4bs8H4M2e69GdLrfRrygPdsyP3exSGbvaND7vMeD9no/R7S6b0fssH7QKTDe0LkHu8VkTbvG5G7vYdEkveTiHqHiaz3bhNp9v4TafJeFBHvTpF1FtdJ2WJZ1lpcK2ssrpGSxZKstrha6i3WS53FOmQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZwa6O/kBfC6H1wdatYXOIp2fDA2GyuLSytOqxuiul1PDt8puNXc3n17+b+tuebv/jhoMbn9/0YdfYlpe7a7ed3v7Lvqb+b+x8Y3fn3nP73x7oPXhx8PeH9w09O/JBZXjsxYlwYurkz6cbZr6GYATzbEQWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhazPlKwi1Ogz+kwI+XcNYv5dg/v/737XoMV0tiSrZmpOVs3UlBotNiaraZJkNU3rktU0lZPVNK1NVtO0JllNUylZTdPqZDVN9cnqmerUROq0mkg9pSZSp9RE6kk1kTqpJlJPqInU42oidULHLY7roxYfVdOpY2o69ZhWLFbUjOpRNaM6qiMWR3TY4rAetnhYD1k8pIMWB/URi4+o2dUBNbt6QE2t7tO9Fveq2dXdanZ1l5pafVhNrfarqdU+NbX6kJpa3aHmVXt1m8Vt2mOxR7stdutWi1t1k8VNamp1o5pa7VTzqh16r8V7td1iu5pdvUfNrrZpq8VWNbWqamp1vVq1tUWtztqkVmdtVKuwrlOrsJa1wWKDWoV1jVqFtaRWYV2tVlutU3vi6F1qTxxdpfbE0Vq1J469kIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1nIQhaykIUsZCELWchCFrKQhSxkIQtZyEIWspCFLGQhC1m3R9ZNf9fgP7x99gwAeJzsPQ2cjVX65+N93/sxY7re+/XeYRmahKZpjGmSNCRJkqQhSdMkJvlqmiRJsrKyVlaykpWsJGutrKyslSRZyV+ykqysJEmy1lprJzP3/5znnJn7ztx7xwxjUtvv/p7nnPu85/M5zznnOd+EEkLc5DDbRYx7i+7tT5rdWzRsOBl832NFQ8nI+4sGDiHTBw3sX0TmD713xHCygjQkWufreqaQtFu63Qn49u6dAPfqCbgNIeEw0QklGnGRRFIP/3PCgOZWdk4MsGsQp/gv4vYQ1vHW21OI5/aeHQErd4Q4SEK5u7L/bkJvugPidivfThIg/KYePbqQpj1vvSWFBHJ73gy4gh9hZ2hLuq/w4ULSe8jAouGkH+KZiJcMu7doCNknMPUgTkfcHXH/YUOGDaELEC9HvObhhzOuohsAt6G7IBaRC0IakJYkjVxO0skVJIO0IpmkNckifcidpC+5i/Qjd5M8cg/JJ/eS/uQ+MoAMJAXkfjIIfLrQZ0WXhFhIrVlIAXIZuZJkk6ugLK4mbck1pB25luSQ9qQD6UiuJ53IDaQzuZF0ITeRruC+nnIdyxUhSVV8vRG+OyHnDPisQfkawGEn0BoDn0XJJ5GLoCzrE5N4iY/4IWVByFGIJAOfGpKfkEbgMoU0IU3JxSSVXEKakUtJc9ICQtDJdSSX9CK9yR3wj6t/BGJyiXKHWLqRW0h3civpQW4jPcntyMGbo6jH6H56mB6nxYwxNzNZMmvKWrJM1pZ1ZF1ZT5bHCtgItpidYKe5xpvydN6V9+E7+B5+gB/hJ/hpTdMSNUtL0dK0dlo3LVfrpw3WirTR2nhtsjZdW6yt0NZqG7Wt2k7toHZUK9aZ7tZNPVlP1dP0tnpXvadeqI/Wx+vz9EX6Mn29vkPfox80NCPRsIx0o6PRzxhgDDdmGYuM1cYGY4uxy9hnHDKOGaccxOF0eBwNHc0dWY4Ojm6OPo4BjkLHGMckxzTHLMc8xyLHMscqxzrHJsc2xy7HPschxzHHKSdxOp0ep+VMcTZ3ZjjbODs4uzh7OPs4852DnIXOUc5xzknOac5ZznnORc5lzlXOdc5Nzm3OXc59zkPOY85TLuJyujwuy5Xiau7KcLVxdXB1cfVw9XHluwa5Cl2jXONck1zTXLNc81yLXMtcq1zrXJtc21y7XPtch1zHXKfcxO10e9yWO8Xd3J3hbuPu4O7i7uHu4853D3IXuke5x7knuae5Z7nnuRe5l7lXude5N7m3uXe597kPuY+5TyWQBGeCJ8FKSElonpCR0CahQ0KXhB4JfRLyEwYlFCaMShiXMClhWsKshHkJixKWJazCekebCLkA07UTWwva65g0121V9I3y//K50rx7m6KvhOwqU/03hLlwN7ijhKYJOpiuhSjntOE+NHn6kSs6XDFWunl4EdK0trvanrwm85op6MNyjXFNcE1xzXDNcS1wLXGtcK1xbXBtce1w7XEdcB1xnXCddmvuRLfP3dCd6k5zZ6Gvpm7DneQOuBu5m7nT3dnuHHdnd3d3b3eeu8A93D3SPdY90T3VPdM9173QvdS90r3WvdG91b3Tvdd90H3UfdJdmmAkJMkUu7fIFKdORjPx9/OXpixd89rI12a+tmNZxrIey6YuO/wH9x+6yPxkjm5ttO6MPhPcs93z3Yvdy92r3evdm93b3bvd+92HZR7/uGvl+jf2/KkZurzm3EouYV3CpoRtCbsS9iUcSjiWcCqRJDoTPYlWYkpi88SMxDaJHRK7JPZI7JOYnzgosTBxVOK4xEmJ0xJnSa7/XbY81CdLhPoHKdMnS7BlDzDh//0p0uyRLXOaMTvjSKscSWtjSFrrma13ZBWhXc8pbd+u/ej2q9qflP/bprcd2nZx20PXNJPhN8qWfruukBwZMGjAyoFZA/fLVCUnAQbe1Jsv/oHZElzB/6bjidMlvjcnLgYuEgoShieMTBibMDFhasLMhLkJC9Edu35kp3bSll4K8oV+k5dJ099WhiFyakDK2k9uv6qDu0NOh2ky7q8DWCo8oWdC34T+UgoS8ojmBnPVIaIL8+OtSioCst2+eXq3AcplO5mfHvtvy7htdc9kpOoJ6QnZCTkJnRO6K1dSRhIFJaF3Ql7lfCBvWNuW11jEmQDum6egmfh50edHDsz8YuXB5IPTv0z6cvyhZl91+GruYY04HYKnAWWOR9fGXwKbnO+13Nzw/Zz3D0nKlqwtS7b2+eDQtp7bVA5CyTIHyYuSNxMn8DTxpXEv7XypdF7avIJ58+atnbfnN87fLPnNyfmHpHuvrA+8sdE4vXFvtDu79e42rdvOWzy3dLpl5C0rbjlGnBoljru29Evu17Pf5H4b7i66ezW6dN+9Ly+Q1y1vUt7avBP3tL1n1D0r7jmOOg4tWqrSsTx5D9rMX/f99bRfb/h16ZyMOQPmzJyzec7pF9NfzHtx2ovrXzw5N3NuwdyZczdJ2crwZHTKGJmxOGMv/jfebrg+7525G6a9m/mubHeYaAGkvN1uYC55ztb2zvarsZel5hxpWtulGfJIM3mUMrdKs0Gqcj8bTZ5S2iStSV9pb3n8sjaXjZX2y1ZdVprWSdpbzWlVnNlH2jMXt3a2LpD21quyAlkjpL1j845zr/dJ+/Vjrz/RabC0d9pxQ9cb1kl755ad590YkBL637bSHDdVmiNGSvPRImk2TZbmB1Ok+ZT6frHyN7q7cqf8t9ekOTFPmj8vkOaU4dKc2UXy7uL50kztqExVWxesleaYYllrp88nTNQwK4kwJng+XZq9ZqLeQfOaS7PNaGlePV+a1lBpetZCTwHunSsINURtKVTmBGXOkq2Ca44ylyhzjTQbHwM3ok1bJs36K5S5X5qmR5k5yhyqzNnK3KTMk9L0pqrwIF5Rv3yblHlKfW8rTX+K+p+vzKnKXKPMwzJ97hPSdEL6BV+cedJ0LFLmFmXuUOYeZc5U7jsos2vEPZHusRzuK5ZmgSqXB8ar+FYoc4Pi1xhlTlX0FKJBzaUN5ksz1E+ayQul2dCpzLHK/Qzlf5AyRytzijLnyrp9SZE0m2UpfyOUOaFiOM4FUelEOftmnzSnHJX5NU6rfIvcESkXqHWsVv9nqP+blLlX0edIMymg/i9R5gZl7lHutyhzvzJPVfyecEKaiYnKTFVmO2XmKnOoMlX6ElX8iSuUqeJJPKDiWapMlR7XbmUek6bbUGZDZWYqs4sy86oIXyPswxnSnKqhSf8wX/7vuly0moReO1LSL7JEq05ISVdljlLmTGVuV+YxaZamKbOjMqcq85Q0w+OUuQZNSgLKLFTmIWnSfGWelCbLVOYUZR6UJs9T5k5pakOVOU+Zx6U5pK8yZTro0BXSHDZVmfukObyHMvdK80FLmSp9D6p4C5src5I0HzKU2UWZi6RZ1EyZ+6X5sMr3CBX/I6nKXC7NkSo/I1dK89E0Za6T5igV76il0nyspzKV/9EZytwizceV/8cXS3NMZ1muY/op/shypbpKh5EuTccgaToTlan44zogTbcqnwT1PUGVW+IAaX54WJrbj0rzr6el+VEjae7sIM2PpTzQXSp/u9X3v6l07RkpzU/V97+7pbmvSJqftVTmEWnuXy/Nz2dJ84CSly9UPAenS/NL5f+Q4t9XqtwPd5fm14OlecRU5mppfqPk66hK51HFj38o/h5T8vRPFf7xEdL8V1tpniDKVP7+vUmaJzdL8z+zpXlKxf9f5a9YlXuxkp9vVb5Oq3JU9ZOWtlHmLmmGx6PJSAdllkqT7pYmk3LG+DJparJ+M125N6T8Mocq58tV+abLcOkVSs4zVHyZY6XZWsl3lqov2U2ledUOlD9+9TFpPpQlzYUi39AzPJMk5bNJJv5njnnSrLdYmv7l0gyNlGbaPumvt4rPr+IPqPIJFEvTUuUakvmjyUpukpV8NlDy0lD5/8keaTb2KFPUJ6jjNxyTZk8pB6xU5IeaLRS3B9v+aUTwilnHQyIMN+FkQNgo/w7/aV7Jvyr8/23J2/b/pYUlnWzhMRme2chKjvEd/58eY0+NfimYPLQ89HpohXQRblyag2G0MNsqypzwU5Uod1WgQLxhIcOaGTLzLL/VS7miYdGicctjXWfdodInZMHg4/kk/nM+l8/nv1N0Ebthua1m1qVWc6uF1VLJ4KCYdBp+DPww63nrDUKs1dYa0kTRRV9omD6zq5lvi5eG58Sm09yYdEbaxaGPikNfEYf+dGw6teKkc1kMuuDlQORlrC/58b7Q3PCuOF8eDXeL82VL6fzYX1ifsCfqCyMeoqEU3ww/IXtaiIa0kB5qUP7tY/Ia/D6O+W0A8LldJX+yHsxETjjNoGmZ/cy7La/ls263clXL9X9i7rP+YZMREuoS6kFCodWh1aRpLXzdhF8/rP8VfG0fuhG+/in0px+/1upXN9H/+3zJ7LjlAN+LN1f9/duSqr//90DJtKri/8+4M3xfXvX3bxtW/f3UqjN8P1z199O5Z/juPrfvpZvO8H30OX7fxAqrTF/+Gb5Pr/r7eeQ/x1UlodOJPpQQ0bMxT29PHpqdPUKLSiSOb5uV7I4rg5XDGGkLQ/Pc6OniuclzG9hTQC8hGB73DSTDyXBfAeLBAot+GlftKob1iC0s3XOzp5vnFk93T39wR0lzdClXxd6PWz9o/QlRrj+M7zq5AboWo0if8kXIEpueofmJv34gP/As0kKWH9PMwLX4Kke7P1O5oSKnvgKf0IIc1r+sEiscYiEj5Ai5KsSSgb4mkoh25DQLzYfM0ebj1lprnbXewlkJ66eyP0WdxW96zQDoII3MxuYlZnPzSvNqs515rdnBvN7sZt5i9jBvN3PNAvP+ZKlhM9S1au6r8Vn5euYsfNGz8sVKdp+NL+z568hX+K6ziquwzjjPQJ+puxTWXA6FjnQzarU19hd+Jrz1rOJ7OPxH4c+6yDJBy0+2GlhNrFSrlXWl1ca62mpntbeutzpZN1pdrZutu608XJWRutzgs/EX/uNZpLMhzhalEjEWhTFi+DVs3yi5HVvNvp67oGQJrmV7iNw7IHFZiyXanWykiVFeojnYHGION0eYj5ijzMf8t/tz/UP9w/zYNlvbVAtU1paKdisL/f6GxNZdNe9c70vexd7fYUuZZWXYWnfZrj4g2mHoZbpDAm+DPsLl6Q9tu5jRSPRc6knztPK08Vztaeu5xtPOc62nA/YD9tZWtpsTyltbl/kA5mEY5OJB0YL6cdbAOm6dtkpDRGndTnTbskLbu6XK/iNev8cglA4YjuRsPG27qrBFSkS/mAiU2D/B+2JSXGUJcdVjJqlSto9OmW+17x0b7xthWudXdmW2s8RcSafyXhq4SQfRQeZgxEMQD0M8HPGDiAsRPySwH11G9eRNMb63SPRIi5kPQAlVdrkuhktqDsE8itm7APAzk3RBt1vPotzil2Ya6UjkDKwM/YOzKM94oXMMvQ+GL6VlW41Cr1q/KeNgWwz5cfHP08LT0nOZ53JPuifTk+W50pPtucqT42nvuc7T0XOD5x5PvueXNXAHeiTU2h6QDrHfBpofcgfZTBLYveyn5En2EXeSeXwL30J2aD/VlpKP9L8bMyh33+EeSP/k/kWCTjcl+hJvYtcn3pM4nz1W7/56w9ib9cbX+yXbkKQnJbDtScVJxeyT8jYtraxNY510tyr/ylIh1uBFOlIAmgGkAWQCtEEezDwDFtLUUbUBg5H2Qg3bbUYMb7b3RkJ8m3y7iOmf4H+FXGy9a20lN4TeD71Pbg19GvoUOUbNbeZn2O5WjnP2+YvTu9T7R5SLZljjs4Gj4FvwlU3WFwM+oE8pr4O1zduKNfr3MWv0I1HulsZy5x8S5e61mOE9jK25mJ/tIMYYoGskCU6r3HbSVmOexXw/h35iSK3n+oyx80QV+8PmI/7alueYsWvLRLx2fJ5ij5TQGKQ8AbJWv/70+s8RYkJ/AVJWaD5OXF7LewPxe2/03kGu997pvZPkghx/THr5PvEdIgOhP+tFHvHf4e9HRvkHQ/mMhd5tOHkSpHwJGW+9CVL+u9DK0EryJsj6FrIWZX1deX/DQM5TSaQ3FnoL9zSHlgxnhT234kzc7WIfn+c+z31AGegZBHrSYM8wYnge9BQSt6fIMwJ0j5GekeQizyjPGOLxjPWMJX7POM94EvBM8PyMhDxPe54mDTw/9/yCNPRM87xAGnte9LxKWnh+69kAGlHlseb2uCNzWj8/yvVfq3B9X5TrHVW4VusS9CVwEzBdZj0oiYtMk+hQ6n7o20FfIwlmsvkTUs9MMVNJfbOZeSm4bGG2IJaZYWaRkJlttiGNzLbmNaSJmWO2Jxeb15kdySUgNTeTS83u5q2khXmb2ZNcZvYyB5LLrcHWOJJjjbd+RXqFvg2FyQPJNNlJhicHk5PJSCyh1Ar60mQSPd+dCOkLQroamA3NFiCbXitgBS3LugS+XQayJDW8oWYRyLHQg0aCTIW8l3qbQ3v3mnej9y/ek95TPt3n8Ll9nX15vod9k32vgAa01rfe9w5I23sga7v9d/vz/Pf48/33JjdM/gmEPBmlZRrUnUSoBSlQA9JA+tuQHNCHukJ72puIdaVumG4H4vY2u8R9EaOb8DG0P4j4Zza7dJPoKQCpGwIyN8rzmGee5zeehSA9v/P8Ucmp4I1czybVTRt9XbilwxEvtNklfhuxdNMaZJLSnWg/gnhnxM0Z0pYdM23Tz5C2FRg+coC+arNLvB6xdJOFafsY7d8g/jjipsq0MVHT44x3qplOFsS4TkUwQ12N/gPxmzb6VLT/3ebmpQiHqxi9iHRmeK4/t3Tyi4VbrtlwU0zJt4jfs9FnI+Vrm5vfIW5WF+nUMoRbrb4NX4EYd4rxnTY6SgU/FXHDVyHeck7pFO2laPvFiCFf9UxiPbomo2wG49hs6KmExvUVSUVdqzP2Pz2wtRJt0TA52sS5vvt9g3yDfUNqGEuZltYuoqWVbhX5kFjNgcYeLSeAi3SALIC2AB0AxK560RL1BOgDIPb5DwAYXMYfFqqMJZ0mxsbSjbSTRThXuRRSeVGcsu9PBoGEjAB/A+EbZT0wjN6ReNiVgk4ujthZ99InIYbtSJE16ycYJ8oAO4p2xBwlBOK+3TPUMwLagsehf37WM93znGeG51eemZ7nPbM8L2B71atSezWGiH0IUyDlOkAj0Jk6ktxyvbiPPkrh2qNQkBiskbWs7VWdk4Z6c4Vrj3J+ciI1Rx+E31D5GExsaw9V1Pyq54jOLkzqueWcfN8cY27poyo1wHjrMpVD2VmlZljdUD6uUmOMF0rlea5dcVxWrelWDuWTGodyX4xQdtc4lAHIlzycRcxUoYjdO/VQu7S15/5cGIUMD84NviTiC84MPh+cFXwh5AmZIW/IF/KHAiErlBxqEGoUahxqGkoNXRK6NCRqig49xg2E4DjHg+OcJjCG+RVpir1HVoz4n6rV+DmOqgiOqjz+mf5XoG5yJQNCFqQW9+gZpfnWM9Symof4+1oPcekZQyxbZZNzB4WkTFcsGxPWV2NCMRqkOBrUcTTowtFgAo4Gk3A0eBGOBn04GvTjaNDC0WAyjgYbeKZ6ppJG5WPChTgmXEpae5bByPBqTEsjpY2kYr2MTo3A96l+/lbVz7uxn0+oBf9l/srqTqz9Q2JeBsbNwXrBJsG7Mc5UxT8Z47ux/PjFDqKy2dxq+fCKGdayeRi7n7S4fhiM3XbHjEfOem6M4cdVNjosH/m1I2WzyWXtexk3RpEybfJMMtcZ5xsaQU1uSyLzuRH/8VY1qKd3Hc1BnH3eusacZ//bWfRh8fukyqHvOYu+rfqhf3oWfV78nrDyGsHes+gLqx/638+ij6x+6PvOou+MF3r0+sZnNQq9at0hOvT9tRT6fTFD/7yWQhezcHKsvLDqsXIpjtdLm9qwpLREfG2EXjLFRpFuJiAuJGcaK8f/lliusxNIF4GUETy3LcZtYtTWD6A/gDj7LWaURhA1ogrvj2BF+QTxqzb6eLS/Z3Pzc8TPEWKbObbw65AKPVlEF09WGkHZdxiXQ25Ay4L094b2L8+TT1I8v/T8EsaUdr8BMEVbmFtt39UN2SIa9AFtgT9FtRJ2deKt3K6Prna7fuM5+e5yTr5vOifftynfmTF9V9XXUjKDTATfC3GUfIaZCgj4mzL5LMP0D1GUP1emoCQ/RYXE3lxa/jU8mMIoJfxl6c+BoluDrSJrhDXZ+gURO8GGWY9ao60J1kRrkjWdOIjU64Q2I2q7mDXLBmgHeeuI4S2Jg1cinl9OkStA2fYVIBIK/xTxHMRijwm3ZlnzrFcFj6w1JDI/MotQKlYWNFIP0jKSrAOw43X4g3FIuE3weYBZAC+E24Q84fyQCaY3PCXkA/ADBIBmASSHd4UaADQCe2OApuERoVRwewnApQDNw1OICSHOgRDnQIhzIMQ5EOIGCHEOhHgEQjwCIR6BEDdAiBsgpA0Q0gYIaSuENAdCmgMhzYGQjmDaqh9SMsTfILy6yhDPMCqrHr9K5wefB5gF8ELp/JCndB2kKb0iv4BmAZTzC+yNAZqGPZCmdEhTOqQpvZxf6ZDLdMhlOuQyHXKZCiFOr5TLVMhlKuQuFXKXqjg/HUKaDiFNL+dX9UNKhu8NAKoKsWp+RbcCj1W7Fbj5nHx3Oyfft5yT7+7n5Lt/+bivbNVPnLKwnyAwgONit2iR2C+K2kxTaEc627SZSZV8MOs5a4bobyz4EYLrdtQab80kFq7VXS7cl+88FalPUXu+qgqvop/oVPw8ytc4a/w5pCJ2eJX9CI0r4uc9UnYeiJpBwAnebO9V3i7em/wT/D+z3rU2Wn+xNlnvYfobQg5m2dJf0S8j3rpZVcWV1BxcSb2+yhSLvNrXvzeXp5dDuvqZQp6C5gPl66UqnMjIWITon+l/3hZqmfa65AwrfL8XcdJBiOfZ7BL/GbF0czmu8G1D+0HE2yJuqlzhu6jSTiWxS8m+R+miauuuQn8gZBwRe64JEfr09Fi9ei1hUX9n4bi/E/5nxCnaSJCcIeYwwqCVfBjk5xHzUeI2H4MaXE/s6yMeaDUfhLZ+bvA3qBk392f4W/mz/FeWzQNax60T1knrlFVccXdjyB1KCNULJVVjntARPU+JM4dNceYwE3cXdcQ5ywFq36WJK0siXz+9YPIh+CtO6Vpgy4KSz8f0Hai1GYv4Mw3RsX5RazMZNYn1YK3NcMSfO0jHlVQLbGWxfllrMx81ifVQrc2I1CTWr2ptpiT+/ImItS+R42AZ6+Fam0GpSaxf19rMSk1iPVJrMy7xYtVUrIUYr2zFvqmFWKueuYoV69HzGut9cWL9x3mNVcx0bSRzAR8FTcGscqw9GvreidDv0lKxX4GWzkXcGvEMgUtwN1BpFtqXI26HFNwvUHp55Kui4P6CUummESmfEyvBuagS3ElUyzuizbPSMsQomxCR3wUAiwGWlekK4UURvUHZx9o0iXGITyK+KErPQEp4l43iRgryjtyJ+AbURcQaUKFNSxQzEpX34KWaftMyf2K2Fjqp2de8S5zsMPPMe8x8816zv3mfOcAcaNW3fFbIusK6zupo3Wb1FKc+rF5Wb+sOq491p9XXussSe+auiLVnz3zCHGuuMd+shb17ojVpRopwX0+gjvJU1R7F85/fyLqXPH8T6xS94X3Du8u7x/utt8RbSuTuaLvPDujzDzF8JprTzefMV81Fvud8c3yn/fUCDwYKA08FniFle7YjoWTEDUXDNTe5Xhd/lS+WT9sqnzrzUR0/m3yfkMgpkTIfcvfG8hg+nHb+BFkwECN3cr759Ri+HeB7v/cL70Ef8TEft/G3UYW0insSIjdC6ODH7uMRGPXMpcMJo4uhxQxAa51PCshQkOVRUPMnwMhrGplJ5pD5ZBFZCmGtJuughd0C46ddZC/ot4fJMWgPTlNGnTSJ+mgyTaHNaBrNpG1oDu1Eu9IetDftV9bKlgzFdrEP2rtF2aWbdLQPRju2QaVFaL8f7f0j9BLclVWCcxKlD6O9ICqc/6D96zq3v25Lv41OAjFnWjqrM8pdy88X3+bJ8/QXUiz2/AD1FrzRU+TVIpG5Wnv7G8GyhU2ztbBTSPTtHSx0R0jc6KbLvYW4OyQV91dl497Ca3Bv+7WqdUsng2ytW1XhucrnJFrAWCzDvJ6kgOTeT7Is3XKRnlYCtFF3WGlWe1IEUplHJoa+TQ5AX1TdlGSTnCpTIv4Ptp6F/89Zv8LZmurnVAP3baBlGm3TWWoSw/nLO6VTaQ7ObCQCD7qT3Nqqq2JnpF4AIZ/Q8wU2xFmRZwWFPWuIG+4W6g/j/jtBaWi8jmdIhL2VXgT2Cfi1Dfot1t4HvE57V2D9Izxz8r7ARgLgXtrHQN+KbrYi5W20H9d2QTgh/BpGv4e1BwGXSKyDpsBaaPcKrK8RaUD6B4JCP0DKYrS/K+jsc/z6hXZ/WQgsWWDSjH3E9rC97DO2nx1l/2YnQZgY17jOXdzDTe7nAZ7CL+XNeSbP4tn8Kn4tv5HfxLvxW/idvD+/jw/jD/KHeJHxRuIrov1lTVgzdhnLYNcltUvqgPvvhdaXClBxBYWIFZTS1tr15bhVBTylIoUup1MJp+uhnD1R2up00N3mgrwshh53JVlD1pNNZCvZQXaTfTACP0KOk1OklGrUTT00QBvSprQ5TadZtC3tQDvTbrQn7UPz6AA6mBbSkXQMxPm5PItJi8paEKCIM1mEzY3VvpSupNNEi4b36djclH5Osb/hm2P7YiXoS8R4Ne4EiXbTj2oYO1Jori09PTCutlWlh+AdfKyPzRfessdZTF+n2VeYnkFVpQdD8OCp4pDS1O41C/B0sV9pZX2su7FvbmFmme2sS6wMqw2uZMm9qAzXwuReVBZjL+prUZRNIK+indfAfRL8njAHkSnmAzTJHAwwBGAowBiaZj4BMBbgWdrUnA7wHMA2Umx+CLAdYD8dZH4OcIAO8lq0qTcEkE2KvVcB9AW4C2AgQAHARICnAaYAPAMwF+AlgPkALwMsJe28rwGsBPsbAFsBdgGcBPiWFPvcAI1IO18emBCmbzTAWIDJNM0H6fItBftygLXkoG89wCaA9wC+Bto/AI4BnKZN/QSAArQjB/29SLG/N8AdAH0AIP/+4QAjwP4JuDkKUEybBi4CuBYgB6A9QE+AfgD5APcCvASwAmAdwEe0aZCRdsGWZEqwJ8BcmhScD7TFAO8AvA8A/LLWkmJrI8AmgG1kk/VXoH0E9o8BPgH4G8CnQP87aWftI1Osz8H+JdC+AjhGNoVuo2mh20lxCPIQgvSH7gQAfofuAbgXvt0H5mAwh4I5HKAQAPIVGgm0UXjKWt30VWNZyAVZyAVZyDW3wf8PAbYDVJSFXJCFXG82TfNeBdAX4C6AgQAFABMBngaYAvAMwFyAlwDmA7wMUC4LYH8DYCvALoCTAN9CeVeQBfg/GgDSpmQh17cUzOUAa6nlWw+wCeA9gK+B9g+AYwCnaS7IQi7IQq6/HbX8vWiavzfAHQB9AMplAeyfgJujAMU0F2QhF2QhF2QhF2QhF2QhF2QhF2QhF2QhF2QhF2QhF2QhF2QhV8nCWpCFtUoWckEWckEWckEWcqUs0DRrI8AmAKhfUhbA/jHAJwB/A/gU6FIW1oIsFFtfAu0rAJBrKQsAkIcQpD90J0AFWQBAWQAYDlBBFrBNLZMFg0Jry8QaSOb50NFpfzqIDqcj6Gg6jk6k0AewNeF/AhYvE1C2De27EDsQXy3o9DDaTcR9BKb7xQ0lNA19mWK1X9mvEHZ2L7pBCt2JdjyDw0IYQg90fwN+Rcz6oq9OaH8T7WMQv4PubZgWI/0FpKSi+1eQno2hIWYt0Q3enM7uR/vT6L4txvsJuj+MX0ch3YZVmm2YJeNXxFAm9YmX+ElQvfvwE9IYNMWL8bUH8dbDZeq9jDvIGPIk+Tn5BXkW+vFlMDJ8nbxPPiGfk6NQSv+lnOo0kZq0Cb2EXkavoK2gnObSl+gS+jUVa9uU9SNqv0TpdIhZ6vrpNl3/jzFGi5HTxkkw/r8UdE2x6qbW3Cqs4EXGnulxQrOfwoiMqyvv610ZIxXyBL3uDXmbe6/C8XL0SOWNWGNrdT5cx7kL9Bsj36ti5rvspHGO+aw5w1xo/tbcb35uHjBPmP82T3oHegu8D3gLvQ95R3ineJ/xTvc+513pXet9y/uJd7f3U+/n3gPeL72nfdQ31jfet9y30k/81F/fb/r/6H/D/4n/qL84cFGgQSAjcG2gQyA/cG9geOChwLOB6YGXAisC6wIfBT4LnLT6x8hnrNQy82FMa/z5j+hc/6nKXGve+d6XvQu9r8YoodUxS+gR9LXHe9Bb6uMx0h3LF1OxRXZsV47rz3HjcuAsyN/ELEiQQUtcE7+ad7+YywgGYqQzli8m+FJlOtfEjetMZWIP5c2YoYi7ASrP+cTKb3zfDvuMT3mu7X7XxvKLZVOdmOP7rhwzZSmomTSEsc0BOhZ6GYUr/6djI6b9J9ZgT7/kbwWQBXDl6ZeCM0sOBJ8HmAXwQskB6/jpl6wTpT2tk+Fu1qlwb6s4bFinS/pbpadfCpHSTiFasiikgV0HcJ7eEnKXfBhKAKhXsjuUFO4dZ4/TrPh7nEp3hC4BuLR0Lu5xaubPKOH+VgBZAFeW8ODM0i7B5wFmAbxQ2sU6XsIhhSshhcsghashhd0ghRut0hIOKSyEFB4IaWDXAZwA7tIrQwkA9UpzIIWrY+90Kj1dac9UG9tuNYY7nJqfW8qAb8i7s0yZ3LM2p8oUns26fNn9QaLvkXvD8eZcT1exS8BzaflZkhaeXp7epKWnj6cPSfPc7cknl+OOy1a4TzUT/YwoP3UTwBXUUecQ3tnGLsbVIlfdYPS+qM7iP9vUpiD3NdIdUrmY7LpA03s2uaP0AN1KNMZAc04631oznU5ngb62gC6my+hKCv1JOB9nE/Yi7okt7b8FVvRDETpPqh06ORabzuh5phfHpmt67dAxXvte61y117oe5LkezqtneFpVmFe/Hvcwiu9iJaUdSHpH1bqIu8fFHFNfwnD1vwBgKHwXaw2jiLyNjpDInJDbZkccXh1FkScNfJXpksLG0lK8tSGR5NSlBNL1dBPdSnfQ3XQfPYhjiFF4C8+PuC7xdzv+qOWT/xeOLNM03fcjrlv8oyyfp3Z5E3L3R1yX+Icly8dBjik7BbLco67llx6np2gp05ibeViANWRNWXOWzrJYW9aBdWbdWE/Wh+WxAWwwK2QjmRhb4D1QZC3i3yKWO/Bxlwj5xobtlLej6ItR+3rKRl9ls+MpUBjLCIx7+gju9iefIR6JeFhUmPMQvxKVEjuWob0ZlcLo9Ay1hWbP76WRXIf/z+byHpvfdwSmvdCegPj1CB8UfWgUxjSQqyIpCb8ewYo/ds7YefLzKnmCOPxWlP2VCMYY6+KWgRh31bGVWAc2Qh1IwfuICkCfnwzt+VKoB9tB/k+C3CeDvOeAnPcH+Z4Icr0Y5HkryPFxkN8AyG1bkNc8fBEB7yDiBUa2wvEpE5Ay4ZwpM7SBCiuK5uGPKFxGGYGUERGKnq61VThC6aGwohiX8r0KRyijFVYUh1O7UeEIpbHCZb6+0NYoHKHMULgsheu0TxWOpPkbhcty2lP7VuEyN99oLypc5mYb8mebnWP6pwrHd/Miunkx4kZLNVwKl1F26V8rXEbpwv+lcBkP2/APFC5zs1A7onAZ5S391wqXceN17VGFgeLv5e9NiL+PH0aa/n7+fkS3tlmfE8P6wvqCJFtfWl+TBv/b/UD4SmwzfsQ/TPxd9QPfqzrwoy70oy70v14H2EBMM56poc8ilns3NiL9skgZ0OZIkTd6NrPR+yGW9+DiTkJ53yfrYHMj927chFjetov7s+k/EeOObboPv+LOcoplz7ZEYqS7Y2MZGtuMGFPCUC4ZtoUMd6UzvO2Y4e0tDM8ey70tKr/P4snksh0r28vyDni72HGr+LC9XNa/QfuDEf5IuuKDxANtPHkJ3UvOWDbcKYozKD/0v4oz26vgSTx8h+KY8HuqDutA9ve5DpR+INL8I/6B4rqqA11j1oHi70cd0PAkIcdbp/kcxF7EIxDjiiB7HjGeNuS47sg/iNDpQ0jBHYQc22wN+cBxb18Ye3yGbTbHtViOrS9zoV2+YNUd7fcJrOOZI56P4WDbrMmbzSfEwRiahvfsa7huqOEpSv63SGq1mbaveEM6/9SWX3uu7XmX+KiND+FIrnljxH+N0CUfFH7KxhMbZ/jPbPhoZc6wBmh/I8KZCjzBc1va1TbOZNsoEifYODagzuqAvCs5zt3x36/6UMt60QH8+kPXi46fhV4kOWO/lf6HoxdV+TbF96w+yB3aOGpkjyLfZbv1BWI5RsQzo/RDpHyEeLGNvgYpKWiXvrBtZu8iT+ohHV+uYjgWZDjmY7mIJ6Obl9Geg1j2QihnHN+SUG8H3BMHY2gcpV++PcHxdDxbGQmBY5utoazwR/Drqkh+7bmukHeJ37PxYXck10rXX2qjr7HhdyM8qcCZZBt+L4ozMkfTI5yJwROfLV/1bRSfrbZLjrWvw/ogX7P4AdQHjreuyhcpWAliqSdg/8ux3VJvxkjKXYgzInTVk+CbPexJ/Hov4psj9YFdgxTZbxxHnIcUj60+bEAKtqP8FsRSMxkYJaN2jKFxnPnR0CVHaeB4lwbHmTGOfZH2GNrxjRmeY8uvLdcV8i7xrRE+sHwbN8YhPctG32jDu2w8sXGGrYhgGXIFzsiysCKcicGT2TbOPG+jSDzUxrF3f6wPZ1EfUFa4bE1RI5evEnHs9/k2W1muQwru25M6rqRLCeB4xwvviBi1bb7dVh/wPSiltT9mqw/PR+qDrD8aalBc7m3Em2H4EVtJR2MMTcN4NWx3NbzXgGOLzvH+FTmi0FBqNbzbmL8bya891xXyLvFOGx++jOSaOyL1UNKj64PiiZ0zj9rwzsqcUfXhJZusR/OkSYQzCjeJYP4vG8e6XRj1gebR7oBXQn1oTnqSPiSPDCCDSSEZScaQ8WQSmUpmkNlkHllIlpDlZBVZSzaQzWQb2Un2kP3kEDlKTpBiGKgbeNbLoo1oKm1JM2g2FW8DXBTuU45DpdOEHfHF0o50n81+cel6tE9G91vQ/Rakoz08A91H7IoSzkC7wCHEvtIT6PdEOYVg+ATdk3CniB3dkLCJ9kGI0yJ0G84sWWSjbEFf/RFnKCxvVwAdJHRZKA1PTLes7qtV1X61lCQn4al8eduROJ0mzvoQIiR1ExFv+IqXDMVLLuJGenGbnbgNjBDRM4m+opTgFAIFWaDQqtMAQEOApgAw5qLpANCPUBjL0A4AnQFAVinIN+0DAC0DhbEvHQwANYKOBBgDADWXTgKYCjADAHoAOo9EzobXAQ5/KlaMw19WOJNe9/EWK8y4uCf77dLR8hfuDb/VZ/hVx434bf2OfoN//OGvOuVQucy+6zSX/Wq7/OfE+FVyS+rw/Vqp4fGk74mGJzUtfJtPvizJcD5Sjnk5rvTKm33l3JDU/XmjCJ2izs7wpj85k6BGCThiCKNGxVogRZ4934e+5NxqKWoCcjSNt9tp16EdRwlqJvV2pPw1DsbQuIwX39LguOLN8aUNLvUeHBtJjZN/hTjNll97rm15Vxy4NsIH1t3GjVFIb2qjX2PDt9h4YuMM2xvBMmQ7Z+QsATcinInBk0k2zvzMRpG4r41jYk2+bjS88/ASyTnj6HPMb5Mqzlub033P+U5X25c8Xc68B8tPdrc8gx95+tcIsmC9YCDYJNiz/NT0mWOTZ/apN1TduPB2AB73ZoD1VXCCms/FePUrlg9qvkoiJ+SjUxbbzyPItz3e0mqnqyz3zasdx5By99XKhzcb44l9q2HMNKlbDcteHquYi3eqlJhIzrPO4Mcou2/SPyQ4D/2+HPP2gVh+K7/7Vj0/Q8qlrDIXYuYJ+s9s9PdADE7HjMH2XpuGKcrAuysbQvq64DlCAqP98ntaCK0/ohwb8tZ7y2vdbol3YFnZPY/4lfmGQj/NibyDuOxthQWk7M58w/cP3zHrI2un9bG1K8bt+hGXZbfri7s5PrJ2ERIV6ivKLSO6CJUQf1P/xTDy2mbtIJr1ibWXuKzPrcPkohjxvBIjHo4+CfrU0WdCVJwLy/1R39dRX1+NfPU3ivFOwqLI9/oPAdZ8mdAG5QQLYr6MUNH1d/Uygj2NGpEvFWSTyF2Cv40jJ5HXEZx49kScPFHnTuKEtPiMIfUzn8U7K8TpllfNRZVOuKh7QbwrvW/guZZdeLJlP55s+dZ72lviIz7qY75GvkzfQN9QPOcibr5Y7lvpW+U7jedd6uGJl4qnXXIC7QMdAj0D/dSpF3FLxkPinozy0y+fBU6KWhBsCXzqGSwIzg8uDr4eXB08EDwSPB0ssfpHScrvysu2fvTbEfLNCPt7EXQdLcAVi0RyWe3OzdCOtAvtLu6mK21dmlKGCS8Jo/06xLMBtyr5qhxnlhypRFG4dGgElxwXfkveBJyh6E8iTomJWys7xoXxtirZgCEciYRQ8mEkHPX1RbQfsKXtHbTvRPvRctwacauST8rTllnyZYReKk5RX6b31G/X/y+pSdKVSV2SbkrqlnRLUvekW5N6JN2elJvUK6l30h1JfZLuTOqbdFdSv6S7k/KS7knqn3Rf0oCkgUlDk4YlDU96JGlk0hNJY5OeTBqX9LOkiUlvJa1P+sd5DFmsRonVLzF3L05vryPixU5CxLqs0LNFuym0XDFXL9YYxTl6Mdt6WiimAE6AJABooah4MD0FoBkA6OUU9EUK+iIFfZGCvkhBX6SgL1LQF8V6MwV9UbxEQkFfpCMARgOMA5gIACMAOh1gFsBcgAUAiwW3w78tw4SH30P778txKxvODL9aiVKGWyCeVE6RfjMquPmtDc8vx63Do9EusYX4WaS/agthqS0c+XVpJXpmeInN/mk5bo24Yi522ehLykelyd+TUSnObHO5UirXaRsiXoJ0XPlUI0i8uYHjfgaeaKPjjDqTIyTcIaTWwJrZ3GCrWGG1T860f4x4KmK5nidXuXBcxZdHYpSrHjEwhsaXIZZz+7grmjewpQfHo0yOR+Xcfktbfh/F/RgNVd63l+UdMNh5UPFhe9maGeQI2hbWK8IfSVd8kPjmCE8Aby9Pyfs23DKKM/ZV5Y8xxng8iYevVRwri7FuRqXf0c3/dYIj72wmI0Xcy1u2L6UuXiQmRL7j2VCdo7LHX9WbmHWVNnGjl3zNsyapuxBSHqtMxT7UO8+a63bftc0Xe9hxUo63gZ91yst9n4eUl4cdJ+X1zl7S7b7PQ8ohbKoN4hMBD4ce/cGzu7OajqeT6FQ6g86m8+hCuoQup6voWrqBbqbb6E66h+6nh+hReoIWM8IMlshMZrFGLJW1ZBksm7VjHVkX1p3lsr4snxWwoayIjWJj2QQ2mU1jM9kcNp8tYkvZCraarWMb2Ra2ne1ie9kBdpgdYyfZac64kydxH0/mKbwZT+OZvA3P4Z14V96D9+b9eH8+iA/nMBZjc3Ud+o4Ucc8An6XBaJhTQWGHkD5V0PXtaD+ubS1zT/+F7h9El4u40H8SBGbj+BIxS6r3FX2ZsLMstGfxN0TIwg0JCzo10WWiwOQz4UbPxBD+E8EqzE4cND3WVtipV5sD9BuFL705hj83Eg67SXdDuRkCUw3TORtT3g/tSNHSI3mJxjJ3WiqGE4U58sQowhAKEHdBDhzF8E9oIOmsD+LJWiqmaq8IEyk/Q3xKSxc7H4Sd/Ftg2lXRBaVYYN0nMF+CuIAfj4VlLHY7XSBiZNuQPj8OLsDwZ6KdYbxHEY/UkmP1h+wU8t+GeU/kdpcoHED+90G7jZ927lUIx+7XnjtbaqHueUh9aEG80Er4oa4HYbwt761tSH4C9b4xSSFNSFOot6l4g+2leIdty/JbbK8gGaQVuYM8BmPqp9Vtts+DdjGbvIy32v4BRtYryJ/JGvI2WU/+Qt4HXf0T8nfyOfkGxtf/IicpxZtuE3CM7QWtPQDj7BRaduttBm1FW0MLcA20AddBK3AzvQ909Tegpq+m79DD9Gv6DdTwEu15bZa2QHtFe1fbqG3X/qr9WzupMx3fNqn3e+S1OAPxN/ZJ+ZzRRNucUREpOy8k38w+/71l3fTI4k3wVDIJ7+C1vsO81uxmv7rgjHyBezJZBT2PvKX/+8GbC4+TBtSl5jCuWE0OUTGj3fAHyssLjfNUm8jn4vmhROD1D1h/4qP5OD6Ri7dIrgrnl/eeV5WeJuosNz0h6PQE9qczBF2uWou5tzJM9pABETu6j2Gv4P6s/dLccBubPd9m3xDHTc3cd7W5qWC34e42egW7zc0jcexH4tin2cKZVh26KIvzaPfa4qqGPX75xivHCmWaf2a6LZyi+g/VHyF27cR8g28MvsL3pPln8RKfudbcZn5obvcaXofXWXldw9vXe5f3ce8Y70Tv095Z3he8c70veRd7f1f+bt9W7wfebd4j3m+8R70nvf/BV/wM9Y5fX9/d+JbfaN9EfM9vaeUX/Xxfi1VA33F/I7EO6L/E307cyOwf7B/iH+of5h/uf9Bf6H/YP8I/yv+Ef2zZq9z+14Jzg/Msjns23ZabEKuZdRnk+gyvHxHy33XVwP2gXTvMjwI+Bq3bmDOtwtC+NJ8W0KG0iI6iY+kEOplOozPpHDqfLqJL6QrQFdfRjXQL3U530b30AOiNx+hJepox5mRJzMeSWQprxtJYJmvDclgn1pX1YL1ZP9afDWLD2Qg2mo1jE9kUNp3NYnPZAraYLWMr2Rq2nm1iW9kOtpvtYwfZEXacnWKlXONu7gFtvSFvypvzdJ7F2/IOvDPvBpp9H57HB/DBvJCP5GP4eD6JT+Uz+Gw+jy/kS/hyvoqv5Rv4Zr6N7+R7xHym9gCOZV4GvE7Y2TeaeGviA4FB/4expL4Y9f90Tcw856CbV7X3wH4XulzOC8HeQmC2hgNneWN9AI4RBMUUo0Jof5fgSFC8xbkdR4t/w7HGGrRvEu71dhgOuuGNI5hlcNAuWTM+S7TAYhQJdDFyJBjCcsRH5cgFx3c7BCZ7cPw4CCldIhQ5rrTnhZ+O+DJy0d4TcZYc7yB24ghrN38c87IBx1CPi5Gy5gE8VGDg+F4xSsVRzyYczTWVvpCyXWDtCI6MJsjxEX8GU/54RTuMlMV4cKMME13i2FAfHxljsr1qfJpcxv+qMYyyC8tLJAqrEomDIb+FZ8L6WmVfEh+rMrLjtogPRFLCW0ZihHFoYfnXueL2MNYf3eQoLOYftMrpBKkQEtIPKSuFne5DN2POwzhUjkCrO/a0jzoj482uMOLsRm+BVuY2aGf6w+hzALQ0L+JLLL+hr+BI9E/QvvyZvkXfViPSI1JroqdpifGGM9PZ2pnlzHa2dV7rzHF2cHZ2dnXe4uzjvNM51DnMKebTqKuwfITalzXDHRDHaRL886Cuw8gldbOHAd8mzLESrCRyveWx6pMbxRtn5CYrYIXIzVZDK4XcajW1Lia51iXWJaS3lWZlkDusTCuL9LOyravIPVZb6xpyr3WtlUPuE+/WkoHWDVZncr/VxbqJPGB1s/qRIbhTYkwyTa5Hfpp8UXKATBXzhRb8oBcZbI0j1BpvzSRWcjA5GcoWRq6hO0J9QneG+ob6hfJC94TyQwNDBaFBoQdCQ0PDQsNDD4YeCj0cGhF6JDQ69HjoidBYHOOfAC04jci9A//rPKyav07kq+Cn4KPkH1HSJ+TyL/8D3BMSM5iMxjMIphphnJ/TJ5VPuVRdNhrKPsg5tgqD8P0KT52mr2Ia7HKx6bylQeS1I+lGInvAfg3YX924kkV9p6BtP441v4H5rPksyO7zJugo5mxzNuHmHPNFopkvmfOJYS4wFxK3ucT8Pcjxa+Zr5CLzD+YbxGP+yVxNgr4Zvhkk5Hve9wJJ9r3oe5H8xDfPN5808n3r+5Y08ZX4wqSpn/opucTP/YmkmT/J7yEZftNvktZ+n78hyfJn+68m1/qLA9eQ60LrQ++Qp0LvhjaSn4V2h/5Gng79PfQl9FdC/jrhmxuRWcmzz3NN/X0/OFRZJubUnD++ob6i77VMnH2ef5gyQXFUKfbtzkb+vFjDfIoW7FnzRXOu+RvzFXOhudx83Vxprob0vwDpng8pLfWFIaXcr/kdfqff7U+AtF7k90BafX6/3/KH/A38DSG1V/nb+K+GlL6LKYRWFEbzQUJghP5/0KPYUyp3Cs+tcUo1c5b5e+DpvCpDxzOV5KUah56E8xRDzGHmg2ah+RDOVTxiPmo+Zo6GNoUSl3XcOm2VhmhICzlD7lBCqB7WyQ50FPaZlC6ssZRBqamdqb8yZ5ovmC+r/amLzd+ZS81VuEv1C/Mr859ip6r5H/NbL8ddsUO8Q73DvMNxd+xI76PeUd7HcB/rAtzJuqjCXtY9uJf1YKW9rM18l/qa+1r40nyZvra+a3ztfNf6OvgG+gp8g6G+DPM9pPa5/so32/dr3xzfXN/LvgW+5b7XccdrPX99tb/1ukDHwA2BWwM9A7mBOwN9cber3OlaFHg4MDIwLvBU4GeByYFfiH2vQRZ0BxOCicF6QU8wEGwUbBxMCTYJpgZbBjODrYNZwSuDbYI5wc7BG4NdgjcFuwV7BvsG7wr2C94dzA8WBIcHHwwWBh8KjhCz0d5s7w1Q/uL0lwdPfzXB019N8fRXpn+C/xXS0XrX2ipmLgkNpdhlhI5GGZn3Y2nVSWmJuvMvq8QKh1iIh4yQK5RYsTxI37MsDzfOFSZ7U7xNccawhfcKbyugG6quElFXK8SUd1YxgY4a4/bqN60NOGat58/wt/Jn+a+M00J0wrUgsTY09SzzWTdppXqRDvqvPkbsMv2hzy3y/fwQP8pP8GKNaIaWqJkwCGmkpWottQwtW2unddS6aN21XK2vlq8VaEO1Im2UNlaboE3WpmkztTnafG2RtlRboa3W1mkbtS3adm2Xtlc7oB3WjmknNbE28zuxpxPwUSLu9z2OWNh/i/bfov3PaP8z2oeifSja8d4unKeh5H6bPZ6bt9H+dpXuF6N9sbCHnxJ2wJXDWYX2VVHhvIr2V9E+Bu1j0L4C7SvQvg3t29D+Gdo/Q/tItI9E+zC0D4uK157OeWifh/ZX0P5KlPvq2O1pexPtb1bJw+rwx+7XnrZ45RuvrOOVe7y02e1b8U63XlFl9DraX4+SB7v7eHHFkZN4PAljXOHXK9sryE88mYknJ3Z7TeWkpnZ72dnstjzWzS5nLvYSejrhzILYCy/6qJj7pPQF+njAK6Btvo5MIDPJIrKabCF7yTHKqI9m0x7QQk+BFnkdtMQH6ElofZOh1c2B1rY/tLIToXVdDK3qVmhNj0MrGoDWsy20mnnQWo6HVnIhtI6boVU8Cq2hCa1gNrR+faHVGwut3Xxo5TZC63ZYO60n6Sl6pp5b/r4E3sdDRoXnVKbgKFO9U6Hc5FdBiR9O82qFoxE3lFdAvHTqwFt3dNtdqHRQuA1w2AkcBv4a+KoiX1f+JY5feV9nLL9ai1h+nZgaI9fmohRc1IQLcflSJTfPmxvJAfJZ6Y4yio7n5mlS6az4FMmBqik63s9J9UjIXO5Y0ErL35rR5DzbHhtlRGWKnn5minHpmSkO55kpxhdnpmjrzpxmedcT2WRz801liryTqgJlwtm40VKrQdlVDUqXKD63icrpwijKW4pSXsrG61FuTkdxNb6b8nBUy2h3M7AKir2Wroyu4YRUwwUjOujV9xISDFuE1AON+j1ykfWB9U/SMLlh8k9I+/O3F0Dp5dN/1MtrQy+XtwjLW0UY1gbeB0tZ3r4od7I8gF8vRpyPWLrHuxb5IJQseVsw3tlB8f5nKu+glrdJY7vILkH7U1Hu5W0seKKL/hpd4j2KVMaFN6HIm4k5vrvBOqD9FwKHZYuLN41SvLuSydt25am7eUjHW+s4xk7xrlIu3zqQfR/eNIz6hrqrlP4J7fLuV3n/i7xLRd5a4o2kSpuFdnlTyR/Qr7zb+BfVtsu04Uk+hmfsNHlXnwxfnn7bgXZ594rk1b5IGri8ARZ3Zml4B6s8jae1Rzq++qzJs4Ct8evIqPKNU9Zxy91ux9te1F20Uh7Ql7pZuTiqrJ9Dl50Ry/tinrG5Xx8lD3b79Wi/O0pO4sgM/RXa365sV2m2y8zwKJmx33aONzuqm0JtMhNDTu6PkpNfIv/nRsmM3W53Y7ffi+G8FSVj+MY0+wepq9OHSeWvaLeJ8Y62qDmCHx3ApShXUftFry7aEXEjk7jdfTCAOBc6ksjXdMRNSpNiafbnjOXKkJjZKlsZ+iWp8ZyRmPkmxHzQfIhw6Of6EQPnjMR6qObN9t4IQ5NNvl3ExDnVi0Pvh94nl6sVmnyc1wqch7hrHFIVKQUeUc3Go2k1DJ2SeyrM/v7afFnNPjbypnibeJt6L1YzuHvl7K231NfI19iX4mvqSy2fwb3Ml+a73Jfua4Wzt/f7BvkG+4b4xvqe9P0U529n4gzuWt9bvnW+t33rcf6WVZi9vVHN3/Yqn8HtH2RBHtSCRtBZPmN7UdATrB80g/7QhtD20M7Q4dDXZ+YPvgdfxp9na8wfcT/MmePoYYtjeo3j0H2jfY/7xviesLYJPc8cbEI9M0eYI8Q9QBAvw3h9GO8lGO8VKt58W7zP1Tjeemp2/6D5lfmN+U+cs1/lXe39s3dNNfJsr5szarVucm8X750Q8ye+r4gZ2hLaQi6OWStrM9aahhQ7jZXr46/+B+tjXM5UqIkzz7Imxg/dXgefP8c6GD8We42bVcs1Llas4rYrsXuwO44Q1YwNu19HXJoocFjc5kRBe4DRnOkyQbsyu5r3k2ss3WpP7rSus/LIjNC3yQGyXNyEK3Qe3gEA+nhx4zKM3HGsIG5dFC+4cGh7OIw3hX7JoY/n48E+CcypADPAPhtM0K04aEd8CcByoK0CWAv2DQCbAWAUL26L5nuAvh/MQwBHwX4CzGJ52a5mAIgRrQlgybuhxTheg1GlBtqceGtGgxIXN2WLkbrWHSAX/oMGJW7G1grAPhSgCOwwetDGgh10bg10f20a2GeCOQdgPtgXASwFO+iW2mqwrwNzI8AWsG8H2AX2vQAHAA4DgLatnQSAMbrOAJwAoB8B14kOBamnAICur6cBZAK0AciB0WwnANC/dRgt6TDS0fsBwJhDHwTjXdBN9REAowHGAUwEt6A9wgiY6LPADrqivgBgMdhhBKHDiF1fAwC6tL4JaFsBYAShg0ar7wM4CACjBf040E+BWUqIoRFmwFjd8BBqBABg5G80BWgOkA6QBd+g/A0ofwPK34DyN3qCHyh/A8rfgPI3BsN/0PEMKH9jDNih/A0ofwPK34DyN6D8DSh/YyHYofyN5QBQ/sZaACh/A8rfgDpkQPkbewD2g/0QwFGwQ/kbMJYQkwgOAyARwASwAKD8HVD+Dih/B5S/A8rf0Q4Ayt8B5e+A8ndA+Tv6AkD5OwoAhgJA+Tug/B1Q/g4ofweUv2MaAJS/A8rfMR9gEQCUvwPK3wFatwPK3wHl79gCAOXvgPJ3QPk7oPwdUP4OKH8HlL8Dyt8J5e90Yn0vtmF5r/GmiF3ObMR9t/e1s6JEf63aTXQ4AypTzjwzQ8SNIhXDzIwXPr21Gjk6u7zX1O+ZOXMR3kn9z8ougVLZ7ouDpZuKd1tvqiwJP1ipqBxmXKmAceH/ulRUjYur4WZPNdzUNMy1FSl0MZ2KcxiJJIP0J4PIcDKCjCbjyERoAaaDfjOXLCCLyTKykqwh60Gut5IdZPfZ3ewh4qTTBC/poQhmywTPKGhS4a3SjngrS49Q6Ga0j63k91M2XWDld3o5ZSs9XUYhBL9+yrohfTNSDuHXbuX4S4FBpU8v+1rJjuFINxz39NAJ4GuOuIWQbDIc5bjMpUjDU2xNRUoZ5j60y69HEW9DfKDCnvFfEGpNtWaSi3HPeNr/wF596K3F3BjLB4CeXbyixaBnF3daQ8kTBj27mNVl0LMz4RZ6dgY9O4OeXbx5JWYNGfTs4q4zcReYeI2NbQeAnl3cbQ38JeJlMTGPyqBnZ9Czc+jZOWh2PAnLhYi73XgKAGh24jZuDpodB81OvEUkbsMWM6viVUXxFpB4a0XMJotZcw6anXi7kYNmx8cBTAQAzU7MTPJZAKDZcdDs+GIA0OzE2zUcNDsOmh3fBCC0ctDsOGh2YkaYg2YnXkThxwFAs+Og2YkXFsV7kmL9UIPxr9YQoClAc4B0ANDsNNDstA4AoNlpoNlpPQFAs9NAs9NAs9NAs9dAs9NAs9NAs9fGA4Bmp4FmJ2alxUuV2jwA0Ow10Ow00Oy0VQCg2Wug2Wmg2Wmg2Wug2Wmg2Wmg2Wug2Wug2Wmg2Wmg2YlpVR00Ox00Ox00Ox00Ox00Ox00Ox00Ox00Ox00Ox00Ox00Ox00Ox00Oz0XAMpfh/LXofx1KH8dyl+sxOpQ/jqUvw7lr0P561D+OpS/DuWvQ/nrUP46lL8O5a9D+etQ/jqUvw7lr++ytY1xNLc6xQNs9qq1LMQV9Ku6wLXUG5Iz6EXfGc8r4xg8r6C9fL94fi64pvpG1biSpuE47pgKja0TV3svsDso+HQ+i8/lC/hivoyv5Gv4er6Jb+U7+G6+jx/kR/hxfoqXaprm1jxaQGuoNdWaa+laltZW66B11rppPbU+Wp42QBusFWojtTHaeG2SNlWboc3W5mkLtSXacm2VtlbboG3Wtmk7tT3afu2QdlQ7oRXr0FbqibqpW3ojPVVvqWfo2Xo7vaPeRe+u5+p99Xy9QB+qF+mj9LH6BH2yPk2fqc/R5+uL9KX6Cn21vk7fqG/Rt+u79L36Af2wfkw/qZ82mOE0kgyfkWykGM2MNCPTaGPkGJ2MrkYPo7fRz+hvDDKGGyOM0cY4Y6IxxZhuzDLmGguMxcYyY6WxxlhvbDK2GjuM3cY+46BxxDhunDJKHZrD7fA4Ao6GjqaO5o50R5ajraODo7Ojm6Ono48jzzHAMdhR6BjpEKe8cYZW3uqp1o/lK53yTYm1aJdvCsqXVeXaMN7YQ3FtmMq3Yt9GO74IKl5YUqtl6i02+WYZxTU2imt75Gm0472gFNe/8f0nyin6KoyExuRbZvhSMn0rTjj4SifBlfUwhsbkiji+oUbl+7Z4eyqV680dMC58Z43J1VlctWX4GhrLRwquR8o3qkvx9tQS+UbtZ4hxlZ3It3RxfwgbgnS5RitXGTF8+lO045vWBG92Dcu4cJ+HXKGXr9/Kt67DeNtqqUzzYPz6CWJ5V6q869X+ipzDxnm59i/fBpE3vuI6N8d9JGw0upH3tMi1cFwtpiPOgRKVU34vUuSrdrjCzXE1Wt77Kv3Kt0eYTIlcCca3/9ht6EbeJXtjhEvybV/+ImK8p5eJ21SpJtfXA7aQf4NYvvgo30GVrwkj9+j/xZHn6kh4dWQ+miLXs9FO5fstUfWC4Zst8gYY8o/YEi7LUb2SjO+yy9fB5WvI9J044UTVixgUuTsE7w0Oo7zFqDvVqE3q7em3ImmIQYniRrVqU4NIrglDimyX8PVD+mpETuy16SzrjswLvrCudktE16ZoSrSvaApKF8M6QuVbkNG1UuZavgksdi3Wzb1d3NPZ013dreXCm7TcRKQtHb6J723FOTP43xn4L0bXPQHEe4Ti/QmhsQ1G3YGcE47clSpfnyBkKJF3lwl8n0pl2Q1gbkxlwhl9Cfyq7SZVcfNgTszQq76l9tVqxbSwFmIqC0PcKmtF+X+xQgxtKsVwprCr5qKF9xWKm2b7VTvUc4sxGe8BbAeyJOayaiPOc0vP2XLVLiFlXOxQAy7WTAbPTznZY4iUS14tlUvNcvhdyIU9/oZ4q2IO6YtvlcyqM8msHnfORUoXnncprRxD7Uvpwu9YSqPjr1spXXhBS+nCCj1ldo2kq3LvlltrpfpilFQW1Qm/XlTvaY0lkb0oDxF5M+sP555jUVpdyVIS2e8VyeOFdm9r3d383A1ahb0kcvPz2fLkf5OD322tqQnPv2/yX7O8/bAluWa8+C5lsuytlO+TrJWl+YcsQ2V5/I5lA1+j+Y7TIN6VcRe5k4jmniRWj9h4NolNZTPYbDaPLWRL2HK2iq1lG9hmto3tZHvYfnaIHWUnWDGItcETuckt3oin8pY8g2fzdrwj78K781zel+fzAj6UF/FRfCyfwCfzaXwmn8Pn80V8KV/BV/N1fCPfwrfzXXwvP8AP82P8JD+tMc2pJWk+LVlL0ZppaVqm1kbL0TppXbUeWm+tn9ZfG6QN10Zoo7Vx2kRtijZdm6XN1RZoi7Vl2kptjbZe26Rt1XZou7V92kHtiHZcO6WV6pru1j16QG+oN9Wb6+l6lt5W76B31rvpPfU+ep4+QB+sF+oj9TH6eH2SPlWfoc/W5+kL9SX6cn2VvlbfoG/Wt+k79T36fv2QflQ/oRcbxDCMRMM0LKORkWq0NDKMbKOd0dHoYnQ3co2+Rr5RYAw1ioxRxlhjgjHZmGbMNOYY841FxlJjhbHaWGdsNLYY241dxl7jgHHYOGacNE47mMPpSHL4HMmOFEczR5oj09HGkePo5Ojq6OHo7ejn6O8Y5BjuGOEY7RjnmOiY4pjumOWY61jgWOxY5ljpWONY79jk2OrY4djt2Oc46DjiOO445Sh1ak630+MMOBs6mzqbO9OdWc62eK9qN2dPZx9nnnOAc7Cz0DnSOcY53jnJOdU5wznbOc+50LnEudy5yrnWucG52bnNudO5x7nfech51HnCWewiLsOV6DJdlquRK9XV0pXhyna1c3V0dXF1d+W6+rryXQWuoa4i1yjXWNcE12TXNNdM1xzXfNci11LXCtdq1zrXRtcW13bXLtde1wHXYdcx10mXOGuJL9PT5xHL89x4Ko3KW8bxhCPBM/pEnhFfjFieUcbVBoJvtNMmaP+1GtkADr+A87XYmsmzkARXBsJybeQkYpxvJvhGH74GJ255ELgxusSVk7BMoYb0sUjBGeswrg8wPAVOx+NXnDPGl+QoxdOF9A6kyHPYvaoKX64G2Gf9S3GVRs6LE1wVwZNkNIxrL1S20jJffqTLtTg8s0nxtXiKK3X4qh2l+JoflffcfY0Y8x69enZ6EX49hBjPeIbxNF84H8PHURp9Ar8iDwnep6jWPUK2VOEbhhTXRuyraqX/RfqbiPF1AoJnPAmuWkSvsJXgCUq1KiJTjqsTYSw1tTIwvTK2r95I+QnLlQ3bqqmKfQ3SbStLFM8zksm2MHFFi+CaGHHXKj0O3xieIKa45kbvQvo+gTmmX66uUDzZSuU5WbkmJteXnoxILJVcug9DwDpF7o3iw3VIx7cc2QLEjZAuayW+V8KRG1yGiXIuaxxDaWGyDmLtoymIsaSoPGGP60gE0xC3/tawXte0vsdtB3Ati+IKs6qDuGoar32wr/gRguHI0ozXbuD5WfIuYuRMGF2qVTVZsniWmdxZZfhx2oe4dKzvBOu7XDMsfRjDj9ee1LCdobcg5S+Iu0byHpceh881bmfs9QhXGsPyBgbkMMXz3QTbNIJrgPHamVprT3ANnMpVZXlqXp5NjtfOxKPHCyceHVsMeXJcceNZpMdrx2TLf8QmLSKndb16matWL+upE9Ji1ZKBvDF1Qrps1ZKqVUsGvRQnIwHGAIi9ZOfrhDTFm2PFjuL5SHsG4g7U0T5hca91jjXe+hXphbt5H0imyU4yHPcrj4TUUOtDxD/FdIp7UQOQugU4WrvwUsog7rLUtIDUZJjXkxQ8RZdlTbAmkJ7WJGsSuR3v0M7FO7RHh76FUMbY8jiPiHEoJwtpFuiAF2Yug3WUGsGzHORZe+RZB+RZAaZsEKZsmDqtGJPnyNueMXnbEO//vxB5662b1GAKcjAF15Poe90lxxjUODmbI+4KvLD4FSvNkbaCQ1kvI+uI3Kew8QJPe9V5sbd7Sy6wnIj7g38q9JHQK6Hf2eRmHlmEvGcgP4cuuDSXpxbSfu5tNoN+czERa66cLKM5NP8Cz+/3s/WuyOVmNPsC5/KF1I7L1nCVag3XXmCci061nZNledCg/JeT9WQzkbeAbrvAc1GdXFHnAGd3YjjHkUSS9uP5hR/W+QXHeMckx1THDMdsxzzHQscSx3LHKsdaxwbHZsc2x07HHsd+xyHHUccJR7GTOA1notN0Ws5GzlRnS2eGM9vZjlC+hF8da9zG94bFG36HxEkocOOo0o04DVTMc2K5oY+Si8rtaTwltpvwl+X2E+I9v2g3rJktnGq4MS7V9sdyY3QgmeX2O7XWMd38ImLXF2tjY7nRxoaNiBv+XGw3pXeU22ns9Gg0vCsSjr4HYl+gtajE5w8ibvgh7UjMsjgUI5zk+OFUyO8CcbNKdHriubHHxT/gQ2LmKzncGLF4J/ID9nJsN6UpiMVIeyabXPGro4ngmAxH0V+j6yul6lL6NwyhnM9GkX7Pmfhs/CK2mwo8HKW/I8Lnp+PzULnpUJUbbXbs+qVtEXVHv1zUL3ATs35JN8AF6E2dLLb8OBtE5BncxJRnZ5aNqxtjy7N+MCLPjjdiy7N+MMJnvXPs9OidI3l3DBVy6CyoLM/atzYeXh5bnvXLY4STHD+cCvmdFZFVe3oquHnS5sYWl35PbHkG/jRG/E/hJrY8A39SEKM8V5ZV142CY/oouzyrU4e20hTyrPtKy+/YdRbEllV7vuK6sfOwrZBVZ4PKsmrnoXLDqnDDCA/dFioAjWNQ6HESwNf6WopdgKC5/JIQazpoLs1QJ2mJOksPsa5IewL0AcgDGAAwGKAQYCTAGIDxAJMApgLMAJgNMA9gIcASgOUAqwDWAmwA2AywDWAn4WIlU6zj0EMARwFOABQTnLwW6zUsEcAEsAAaAaQSxiDFLAP6i2z43w6gI0AXorHuALkAfQHyAQoAhgIUAYwCGAswAWAywDSAmQBzAOYDLAJYCrACYDXAOoCNAFsAtgPsAtgLcADgMMAxgJMAp4nGgX/cCZBEdO4DSAZ7CkAzgOjT/aIklnyfcXgweRKwQa5D+xOAPQR0EXKC9y7H8UOYVW38dA3d1wXOVO21nT4gihIr7xw0nwCuKViqdjIYa7QF8wnbG9/yZe9n8W4+fNXb3C9ucsO7+cSL3uI1b/EqknjNe4r3GXzNW7yGJF7zFne8bfXu8p70futz+xr58nwDfaN9Y32Tfc/5lvqW48vd4t1u+Wa3uIuP+tuJ127+n71vDYwqqRK+r77d6XQ6/e7b7877nXQ673eGYZDFiDGDGBEj5otZNkY2IsuwiAxilg+ziAxGZDGTYTLZGJFFRBZZjIiILIuIfBGRjREZlkXETAaZyLKZTOc7VbeTW51050FghmH4cSondU/Xqapz6tSpqntPGT9irDY2GFcZ1xj/0zhoHDZFmkpwlL4qHJHvk6aXTIdNJ0y/NjPmZHOVud3cYd5n/qn55+brwnHhtHBGuCD8Svi18BvhP4XfCr8Tfi9cFf5L+IPwR+E2WJtnLR+2fMTyUcvHLJ+wfNLyfywNlkbLKkuTZY1lrQXd/cWP3SWObgbHvWSFXjJQdr8Fe/5JT/l7SoFuaZrQWwxtp2PRChfHSn/SX2R/MbDGXx6i31h8E/we6DmBcj/puQk9R+vM79D+VCgtd2ItR7Ki6fwn0pokrWD9hp7Yg1jUTU96zt9z6vG2LdT/FdSn2fgPws+g1H+Hcv8jqHV90ncTret0fRjM0j7pxUfB0k6v/aTVnf9EckGs7tR9KFpgmnfLtkB6jFJR331y78z93DsjY2QKmVpmkFllblm8LFXmleXLSmXzZYtklbKlsuWyWtlK2SrZGor2fUx2DtJl/J8gDce4EuOZGM+chGfJXoQ0mz+C85tw/j6MfwJSL78V4z/D+CDGBxAuF/Bvj0GajvOzZV/E5XwHPZX9BdLlsh6U8hfRyJEvHEt9Br4EpXLE6xDfCOlLcvjtWxh/60cI923mvwrpp+W3ERf+Okrlr2P8t4iL/OYk/E2MT6b/EJFm4fxPEjisXd96FbXirati6/hv4HI6xludyd8eb2kWfwu3dAjTxE7AM1E0aF+mvBz3TzpOX8flNOOnh3Eqx/l5mHIersMAzj87Tp/Fe3F+IeZ7FucMY5qP4V+1YL5ncW8P4/R5XIenMGUK/i2i9GDcg3Evfwbn38N4Ci5HzI/HfJdiPAnjH8Xl/AalCjnGL6N8FJs5oHyxHC/Gs/gv4/x/gzQPl5mHy8zEeCbGs/gPYvr/Nwk34dSIS3hmjng27r1seS3WwxfHNTwL62SQVJ4ipXOgyeS7xtMsPHaysP5kYQ0ZK8ccNM2QfxfjByfgWfxxKZVvk1LZ93H6Nfz0MMZ7Mf7GBDxP9nMska0wj1mYKPQuNtjPBIphUphUimM8TCbFM7lMHqVgipkSSsk8xcyjVMwC5n2Umnk/U0FpmGeZJZSO+SizjDKADT1Pmdi/Z9dTZtlG2fOURR2jzqZs6lz1+6g0db3601SZ+m/Va6hn1M+pN1DvV39RvZn6kPr/qrdSz6pb1cepD6tPqH9CbVL/XD1IbVb/Wf2/VNcjXLPvQp2OA5wCOIsjyFIonhnTD3AN4CaOLUuhSFjMsBgEh+UBVAA6AAEAPGc2FiAZwAOQC1AMMA9gIcBigCU44i3FrgCoB2gEWA2wDmAjQDNAC8AOgF0AbQAdAN0ABwAOAxwDOAFwGuAcQC/AZYArANcBbgHcBrgLMEJBBwMoANQABgArAPinXDxAKoAXIB+gFGA+wCKASoClAMsBagFWAqwCWAOwHmATwBaAbQA7AXYDtAN0AuwDOAhwBKAH4CTAGYDzABcB+gCuAtwAGAC4A3APwEdRMg5ACaABMAHASk4G+oLugUQ3NsqyAQoBygEWAFQAVAFUA9QA1AE0ADQBrAXYALAZYCvAdoBWgD0AewG6APYDHAI4CgDyl4H8wd5SMpC/DOQvA/nLQP4ykL8M5A8jnEI3/qEPLHhIeJA/D/LnQf48yJ8H+fMgfx7kz4P8eZA/D/LnQf48yB/dcMmD/HmQPw/yh3mQ4kH+PMifB/nzIH8e5M+D/HmQPw/y50H+PMifB/mDBaDAu6J4kD8P8udB/jyyAR/jwM/1LZN9DtJwjCsxnonxzEl4FrcQzy1rcH4tzv8Gxrdha/o9jC/EuPjbTIxX4t9mQJqO87NBK1A56LdeXP5ydLYHHsHHkBcgWz+W+gwcmgMNsr+D9BCmfAlxfwvjb/0I12Qzzv80xrMwnuXHxdp+blo8KwBfT5TzWYzPG6N561UuBfkC/tZJ5Yj4WC+J88DHcEufHqch8UyuANP/zXgPeNHdFIE9z+J5VabA+RQu+dtED3+GqOf7MR6J8TKiPs9hvpGYbxlRBxmmz8X09ZB6MO7BuJcTPYsGjOficurHce8knCwnC//Wi3+bFVAOmS/R53FFeBb6NK5zIeaF8Cz2DqZfMxEXZcSJs1zPHHFSIl6/9F8iJD53/Omg+NjYeUmqj79dJP22oGkG143x7gm4/7f+dB6R5uO0itBzkUvdBDyPO4JlATSyvRz4FDz6znfXVLHk6c30Vno73UrvoffSXfR++hB9lD5On6LP0hfoS3T/ey3CLLJbTDtOe4gUx5enL6GUrZdSGkepYapxqpB+688X8SGMF2K8k6JHLyN6SImnfnr7WDnw9NDEMpm1UjnMYpziHQvxnSVccpuIswx+egHfCjDOF0d9RyWXYZpmovwLRMli2jhl2i6l4ptO4jsJ/hx8N4D4BgKLTwvFN6/EPmTRrWMUh9/l4DQEvQ6n8URaHVhzSHGf0DWSLMRUpKeXEP1MPMU3JVymb+G2E71BlxM0ByY+9fcMrpX4pgSigfQWzt80XnKbX761YzIa/bPEd1yaYml9RAmNRMmXpHz/U4WU+nMKpZayJkLK1QReKPWzX6aN0lM2G6dVhCxeHMNH/5WFlQzlRVox+gf2lxMp/fRVkr6JOHobZFzDfz1Ww9F/ZX6PSmO6cWlySR8C5CvmfJYaH2X0c/5+e/zvaGCo+Afcwvm6BdBC1M5k3M5U3M503E4PbudTuJ0LcDsX4XZW4HYuxu2swu38CG7nR3E7l+F2fgK3sxa3sw63sx63cyVuZwNuZyNu5yrczudxO5txO1+g/unJHRRP7qB4oHdQUDKQvwzkLwP5y0D+srvIajy5l+KRuDXhyU0Vb3+fzyV9qDdV0EeQr8YYYA2SjOOMPuB7sRCf0fM4zSdw5Fsm+tCZRKQ/n5dSH/6+29ck4aPoy+9EP2U+/m0HQf8akeJfvYW9uFH8dvFoA4GvweUsxXxP4Rz8JvPoPPzbi1I6ah2vbeJohcTXn7+GKBmnvjtEnfGbt74fQpo80/tShUhBJxgFq2ATooRYIVPIEfKFAqFYKBOeFuYL7xMWCe8XPi7UWCkrur03bYpy36dbqPurOZSOIsKjSPAo6sFJbB0odJMqjoGBoqpfBYD5EkcqgPkSx7HwUeI1pzBfohhBNMyXKCoJDfMlDfMlDfMlDfMlio+AIt3TMF+CbjzIt3qRPn/3nUsn3If3TvEdn2EjVkQspfiIDTCuo6kFVDeMz0b6PONhdjJDsGY/yllhXX1FVi7r4Dm+nj8jT5Zvkw8qKhWHwgxha8MuKwuVbUpf+Irwk6pY1RbVTUqM2R5PpYJlRnGT51OLqEoxMjGtn/hWPdOKdufomtFfQXoUtIQe2SGuHyQaMR0Z8sHKc+QAjOQpOPhe4z414ddelDPahu3A+9Ea6n+3i6s5icanQmsfkQPOmYIDrK7cgb+ma9CKio4e/RBqITWKOTwTSDP6JfSrkSFkbzCfqTj8IQSHIszhq+jL9ak5TNcG6rvsiWB9DP3y3TF8Moe3Pk5/exYcRoJyqMH3UY9xmCCHt9YyETOVA2NnO4JxYMr83oLI4bmJkka7D8BBNQMOi9nkoBz+mrKE7iXgUI176fQMOPSIq/NJHHrQ2+oPpA094r5AEA6RD6gN8Vx4UA4REh6EQ8dsOLD/83A5UBbuYAht/cIU4+EnaO9jhuMB3fUdjIN+9F+n4NCNdmNm1gbfD4O3YfQrvq8RHCbo0ls6xHNmukTVcbFB25A6VRt8pf5emkEbRj8k+xOimvhl2eh5X8cUbfg4yplZG3yvyfYhGz5RZ4HD16aQg5/DLNpgCdKGqeSw9oG3YQ4cAkptk75dg1l0Kg59oqRnwmG0QfZhqVRxR/LBcqDqRP8c/9ortYHMD2JbS2fBwSm1gfJKbXiAHLzBrQZ1RlzhUKGs98zt0rbg8wP9zJRjumPmY5raxf1H0DYQaZAR98bMLR+1S7ZgBhyGJvXSK1gO66fnAHOcdfZtGM2feS+BZ1zxcHvpbWlD0K90H5wcpi47ZBvaZuEZ3x+HhkkcaMvzlr0Ye/K16pOvVZ98rfqwv1ZFY1G8BacY532GGrvHLVKTpEnWpGjSNOkaryZbk6cp1Tylmad5RvMJzQrNV+E3Wn/cTBQxk8YRM2U4YmYYjpgZjiNmqnHEzEgcMdOAI2YaccRMAUfMtOKImTbNds12yjkeN7MLx808QGVpDmpOUQUT7ttZFlDPqe+2edTaIN3ss27GrXh3tVCUEpobZqdNM7/5D+2gPzgNmM39f+vxdzFvh9Smr9X9jdlg91c9yPEU/Bart0vXJ7fufvUw2E2GD0Pvgt8n+Hbr2eR7++bSbxPv1ntY/Tb5hrt3ot+6JvTbsln229R1fGdmp+WzGLHvrhaSurLrbZuBH532ixIunzQm59aKmc+hNbMaow+7VtLdlBvwGfw7rw/T1/lh2Jlgs/bbZwNI7o/a+Jxct3mgw3X+u8Qf5OhBaYO/vEDtXAHaudkf8//tGjWTa+Ok5FQsthwbqT3UXqrrEZFOsLo+TCsXzGN7+60aWYtH1YpN9qEfnkQm+oLvjEQm33n86EmkC8eRR9Gf8S0pAbKgNdUUrfNoT1NyXS2loj70JH7vg4jfq5inWKhYrFiiWKZYoahXNCpWK9YpNiqaFS2KHYpdijZFh6JbcUBxWHFMcUJxWnFO0au4rLiiuK64pbituKsYCWPCFGHqMEOYNcwdFh+WGuYNyw8rDZsftiisMmxp2PKw2rCVYavC1oStD9sUtiVsW9jOsN1h7WGdYfvCDoYdCesJOxl2Jux82MWwvrCrYTfCBsLuhN0L8yk5pVKpUZqUdmW0MlGZrsxWFirLlQuUFcoqZbWyRlmnbFA2KdcqNyg3K7cqtytblXuUe5Vdyv3KQ8qjyuPKU8qzygvKS8p+5TXlTeWgckg5HE6F8+GqcF24EO4Mjw1PDveE54YXh88LXxi+OHxJ+LLwFeH14Y3hq8PXhW8Mbw5vCd8Rviu8LbwjvDv8QPjh8GPhJ8JPh58L7w2/HH4l/Hr4rfDb4XfDR1SMSqFSqwwqq8qtilelqryqfFWpar5qkapStVS1XFWrWqlapVqjWq/apNqi2qbaqdqtald1qvapDqqOqHpUJ1VnVOdVF1V9qquqG6oB1R3VPZUvgotQRmgiTBH2iOiIxIj0iOyIwojyiAURFRFVEdURNRF1EQ0RTRFrIzZEbI7YGrE9ojViT8TeiK6I/RGHIo5GHI84FXE24kLEpYj+iGsRNyMGI4YihtWUmler1Dq1oHaqY9XJao86V12snqdeqF6sXqJepl6hrlc3qler16k3qpvVLeod6l3qNnWHult9QH1YfUx9Qn1afU7dq76svqK+rr6lvq2+qx6JZCIVkepIQ6Q10h0ZH5ka6Y3MjyyNnB+5KLIycmnk8sjayJWRqyLXRK6P3BS5JXJb5M7I3ZHtkZ2R+yIPRh6J7Ik8GXkm8nzkxci+yKuRNyIHIu9E3ov0aTiNUqPRmDR2TbQmEWxKtqZQUw5+Z4WmSlMN1qMOViNNsP7YoNms2Qqri1bNHs1eTZdmv+aQ5qjmuOaU5qzmguaSpl9zTXNTM6gZ0gxrKS2vVWl1WkHr1MZqk7Ueba62WDtPu1C7WLtEu0y7QluvbdSu1q7TbtQ2a1u0O7S7tG3aDm239oAW3SvyHWSTGHw3Excl4axoq/BT+ocYx3dm0fiWK+YbEi7e+ud/im/Zo/A9UwyOrou+ZBjDmc9KT+nzGP82xvEdUuzfSDizjHj6bxjHt6fRufhpu4TTf4Wf4hrS6zDeiPHTuMwoCRfvqPI/3YDx13B+CqYclnD0ZcjYUxrfIUj9NZFDPPXfmCbmizct4tvQ0PuhUM6zEk6nEtyTCO6VuOfDJJz550ncf4Lz8Y17nFHCme9JT+n/N8t6ijVZjst5U8LF2/cCekm8Iw/fGMg+I+HiXXL+p8dQ6sO1pc9hSnwPHbNfkuBoJKZ/mWg7vmcTxQcYw5kjk9ou6ls5prRLOHNUekqfmWXb/06SCLNPwsWbBKlvYRzfzkbhHmCwjnGZEs78Qnoq3npGHcb5+BZFtlbCRR0Qn6JTT8p/4yH9P5jyaxLOZOCnF6Q+pH6K8T9jyp9LOCO2FPe/eOMnhW+4o8VbEU9LOP0D4im+kRN8D4RfxWWaJVy8UdT/9AuEjPCoYd+QcOark2QkastnCF36TAhd2otpcOu4ixLO/kx6Sov35eFR4B8d8yScuSI9FW+i9NekDz/9dwkXrVNAPd9ZyplrCL49EMUFgbbvl3D2Rekp/Qupbxk8crkPSDhbOqnnRWliWyGLl3D09diEeuIRweD7CrnPSjgbIT0lxzuD7wfkxHEh1va/URpkvON7AGULJJy9Nom7eL8t9uq5BAlnfjqpRXikMDdwmasknFNO0hBxPsJ3ILJ7JZx5QXo62/lo9GX/016g3CDh45S96M0kjM945hp9n/8pKjNawsWbVYEScP/dkTOe48Rbg+EpKvOwhI9T9k7QEGzlOF7C0feRE2SE77iEuRJ+ywkSznzdT9k7PjvgXhWtLu2TcPEuTn8+1mew3nfGfsss8ZeDcr7nxwfH501x9vlbzPefJNx/1+T3MS7eoPoTf91QixwSzvyb9NQ/b868njOfN2dLKfpdERJOf3sS5Yzn4tHv+Z8iuW+TcPFmXqDsHWvXzGft0e9TtyEfawJbhSnFOWjQ/3QQz1mDs6H0z+94PHIxEs7g+0YD5veHMWuLtw9TuJ7/LOHMU/jp5LkY+7dsn4Qz4t2y5Fws3iH7Z9zzVyR8fNZGPY9re59z8T0JZ1qlp3Oai/skXPQ0AuZigpIXPXnst3A7g1DemTC/49t1x+d3JPH+SWUWYBzfX8x9Y8oyxXr2BdRTKlOUIL79nKuUcHGuCZgRPonzK7EFmyfhfu/iCxKlf3TgPmdTpNHB2CeMDulc6ZOaT6K9H3SqgM+YWHzGJMdnTOH4jCkCnzFp8BmTFp8xmfAZkxmfMVnxGZMdnzE58OmSG99sm4xvts0BfmZYPUo7UxkaryYL1pI5mly8Q1WG96jma56BNaW4T4V0S7rdFt3BTuNb0zZQvP92W45C8TFaQXdRPNm9gKPdZtTSQ3gUollSRqGvC89S4v1fl3Cv09S071G+nalQKURTjNBCqah/pivoVfQO+hB9kb7LCEwhs5xpZy6wOnY+u4U9w97iVFw6V8mt5lq5I9xlblhml5XKVsg2yzplp2U3eSWfyi/mm/id/GH+En9PbpUXy2vkm+Qd8lPyGwqFIllRoVil2KE4pLiouBsmhBWGLQ/bGLY37GTYdSWvTFQuUjYqtysPKnuVQ+Gm8PzwZeEbwtvDT4RfU3GqeNVCVYNqm+qA6oLqToQhIjeiOmJ9RFvE8YirakYdq16gXqluUe9Xn1ffjtRFZkcujVwXuSeyJ/KKhtJEg2TrNVs1+zTnNINajdYLq/y12t3aY9p+rU/n1s3T1em26Lp1Z3UDerXeo6/Sr9Hv0h/V9+lHDE5DuaHW0GzoMpwx3DKqjOnGSuNqY6vxiPGycdhkN5WaVpg2mzpNp003zUpzqnmxucm803wRNEJJaSgTZYcxUM/nQnoWvwfTz4eh+XL0VEiK7/Ing1A0IwrwMRDFT2V7EYWvfmoKJj4YFy4dfwPbj3CmdvR8KAo6mn89CIXIpQKX0TtFPQgKpgXK4CgdJVBOKpZKpjxULqql/CS4TLRCBbm0bBi95c3XIJz9pfyzY5aSXgl/aRp5SSylpgzj7/ZO9Yuv+H8xC55cuMwyPU9eJquY5hdBeCqa2R9QdFgS6hF+CfclqMWz6ItILolbA+nvRjWoFxHOpIz+a7ASZAvQtwj8EMyE6DaylyHnOPoV+xr/DJSwdDQdSniOWwrpFsifRm/eiphOokEpAsuIn7aMYBTTaid7E1MclhnQnD5xDKAvY6YuA1FMXUZQ7Qw1SnpleUDROHEMyI5PVwammKIMLhxFCuPeNwq6ykSwH0GrX9+LJIVsHfjftOynmKIQvYEOFFWBFOyvMMXnQ1GAtiVBenK0/v4pQEtRTT+F65Hir+mXp61pacialvkp3CHrURasjOkpZInoGwhZHaoH/Qv260BXFEjBtqKvhbkO3xE0ZlkbplAFtFbD/h2UEY4iCtCdzGuI4q17ARRrMMXfhqaQpaPYenwetgx+Ch8zgaISUaCvcOhO1BagiAtobQL4wTT/3dEfhyoDKNZjis9jigu4HoMkhVzBvQ/SnNHdocoAChemqA9VBv/fXA+kO8SaBmstULRiiq+E7LET3O9Qff2tZSbXA/oUfifbPJoUqgy2insTWTrQPJpWo5hVk8p4jXtxmjIu4JGNy6B6mZ9MLgNG9u+moRDLOOj7lkQxgcuLuIwpKLhY5AP42xK8P2JRjMApKS6j7xC5AcQlJEXdNBQL2Tegx5J8/xWKQpaPvmCGcfvpkLLtQnfuyf40hfR/LPsmULww+g3MpRlzCbAf/Pe559Bti+hGwBBljHDfmZqLv4x/9H0udBnIDk9VD9k/waqf5tW+DaGkz32K64Txslash9hjE7hMS0G/inwFdq0PfY/URX8fcnYBTlAwr6N7Htl/mILiDSQXP0VFMAr208gWcuGhy+C+hr6w5343BcVB1EsyS2gKsLhZkH7Y94H7p+A2wvoVZpkp6rERW+0pKJhq7pto9IbuD6YFzUCsbQqKRcjCTEnxCrrvknkLU6wIXg8eeaNu36dDlUEPIeswFQWUAZJjC6agSJH9YRqKFj4B0sEpeqwFWYcpKX4te2O8P0JR1E1D8QqyMFBTRNEQlOL37GmkrVOU8XP03SFbhVsblIL9APo2HihClsEekaWhdAqKAs6I1hEjQyHr8dfcKXSD6hRtmZ7iGWLs3w1ajxxi7F+7v7E//ch+EKOS6SbG3M6gFKeJMbcxKMUWYswFp/g9Meb2BaXoIcZc8DIaiTEXnOJBjLlBYswFl9wgMeaCUrA2YsyFoqibmgL0QxpzbUHLyCDG3Pl395jj/5GrQTdK49uEg87ZsC4G2dI1aEYe2YC+4/dH6Bmn8F3EMYTOo1XBiCB+cx3ojY+eRz4/dQb5/EAxFidnEgWdGpqC+gJaFYjnEyEo6tCqgMa+dvB60CfRqoCpRqsCoPitP9JAIMV6TPF5TPEjzGUwcLygVQHzR7QqCF4GULgwRX3IMhajVQE95K9pcIpWTPGVUBQUhVYF9HP+MoL3KYrl9iry6IOX4etA9mO0DfnJbx4O1hbq/WhVMFUZoy7k0Y9+CZURvD98F5H9GKcIWQZFIV87RBmvoTKmohhtQKsCsS2hKNDYn4qCsuDoJO8PzQUo6qamGP1XZD+oXWhV8OaNoHq6C81AoOufDilbC1oV0M9MIX0nWhVQw8gbHxHEWD6B3jijQx49/Vs0ssf1Y3DCePkOwSUIhb+MIbQqCFUGWhVMqEeAdaBT0aqAPolWBcH1lClDNoj5q4Ca9k3QdVgVsNrQNQ1BEXQ3kVdQdFgsPgVS+3cw0UnLfwXdNZ2mhPE9UCrkjiZDyY0fNn6Soox1xjoqwjwqMJRa+JElidLhKAjPW35o6aFettqtDuoVoA4bj5acRMl0Ht3TlFu3SPfXVDaObFwlhAtx1EeEVKGMWi08JdRQWyxvWk1UJ3ViRnGBaTIeABEXmA4SF5hGtjBEXGCaiAtMTxEXmJ4QF5gm4gKj9yZoIi4wTcQFpom4wDS3AO0XjscFpom4wDTXBPBg4gLTaNaeYVxgmogLTMukuMB0kLjANLo9IkRcYJqIC0zLQscFpifEBaaJuMA0igssG6EoHuSPdJMH+fMgf+SV8SB/HuTPo/13kD8P8udB/jzInwf58yB/HuTPg4/Ag/x5kD8P8ufXAKwHAPnzIH8e5M+D/HmQP98OAPLnQf78QQCQPw/y50H+6G4u/jwAyJ/vAwD58yB/HuTPg/x5kD8P8pdzAEoAkL8c5C+3A4D85SB/eToAyF8O8peXA4D85SB/OchfXg0A8peD/OUNAE0AIH/5Bnwid3+xkb97XzmTn05NM7mcukk5U0dRJigDYimHqu39tWu2v52+1Q8oAvCEKJ33F4H50ZH1xDSkrAMiNr83ZT11OjwDmv4Z0My2zAlRoKO3uFG6jVJx2idfhjz5MuTJlyGz+TJEe0x7Qntae07bq72svaK9rr2lva29qx3RMTqFTq0z6Kw6ty5el6rz6vJ1pbr54BVX6pbqlutqdSt1q3RrdOt1m3RbdNt0O3W7de26Tt0+3UHdEV2P7qTujO687qKuT3dVd0M3oLuju6fz6Tm9Uq/Rm/R2fbQ+UZ+uz9YX6sv1C/QV+ip9tb5GX6dv0Dfp1+o36Dfrt+q361v1e/R79V36/fpD+qP64/pT+rP6C/pL+n79Nf1N/aB+SD9soAy8QWXQGQSD0xBrSDZ4DLmGYsM8w0LDYsMSwzLDCkO9odGw2rDOsNHQbGgx7DDsMrQZOgzdhgOGw4ZjhhOG04Zzhl7DZcMVw3XDLcNtw13DiJExKoxqo8FoNbqN8cZUo9eYbyw1zjcuMlYalxqXG2uNK/G9yeuNm4xbjNuMO427je3GTuM+40HjEWOP8aTxjPG88aKxz3jVeMM4YLxjvGf0mTiT0qQxmUx2U7Qp0ZRuyjYVmspNC0wVpipTtanGVGdqMDWZ1po2mDabtpq2m1pNe0x7TV2m/aZDpqOm46ZTprOmC6ZLpn7TNdNN06BpyDRspsy8WWXWmQWz0xxrTjZ7zLnmYvM880LzYvMS8zLzCnO9udG82rzOvNHcbG4x7zDvMreZO8zd5gPmw+Zj5hPm0+Zz5l7zZfMV83XzLfNt810zLCsFhaAWDIJVcAvxsPLxCvlCqTBfWCRUCkuF5UKtsFJYJawR1gubhC3CNmGnsFtoFzqFfcJB4YjQI5wUzgjnhYtCn3BVuCEMCHeEe4LPwlmUFo3FZLFboi2JlnRLtqXQUm5ZYKmwVFmqLTWWOkuDpcmy1rLBstmy1bLd0mrZY9lr6bLstxyyHLUct5yynLVcsFyy9FuuWW5aBi1DlmErZeWtKqvOKlid1lhrstVjzbUWW+dZF1oXW5dYl1lXWOutjdbV1nXWjdZma4t1h3WXtc3aYe22HrAeth6znrCetp6z9lovW69Yr1tvWW9b71pHbIxNYVPbDDarzW2Lt6XavLZ8W6ltvm2RrdK21LbcVmtbaVtlW2Nbb9tk22LbZttp221rt3Xa9tkO2o7YemwnbWds520XbX22q7YbtgHbHds9m8/O2ZV2jd1kt9uj7Yn2dHu2vdBebl9gr7BX2avtNfY6e4O9yb7WvsG+2b7Vvt3eat9j32vvsu+3H7IftR+3n7KftV+wX7L326/Zb9oH7UP2YQfl4B0qh84hOJyOWEeyw+PIdRQ75jkWOhY7ljiWOVY46h2NjtWOdY6NjmZHi2OHY5ejzdHh6HYccBx2HHOccJx2nHP0Oi47rjiuO245bjvuOkacjFPhVDsNTqvT7Yx3pjq9znxnqXO+c5Gz0rnUudxZ61zpXOVc41zv3OTc4tzm3Onc7Wx3djr3OQ86jzh7nCedZ5znnRedfc6rzhvOAecd5z2nz8W5lC6Ny+Syu6Jdia50V7ar0FXuWuCqcFW5ql01rjpXg6vJtda1wbXZtdW13dXq2uPa6+py7Xcdch11HXedcp11XXBdcvW7rrluugZdQ65hN+Xm3Sq3zi24ne5Yd7Lb4851F7vnuRe6F7uXuJe5V7jr3Y3u1e517o1udIJ6CMXKFt8tZdoRjlbu4E3g98HFLyrQmg9wBuePYko5Smnx+xj8djOD3/cXv9Bi8Rv94lu6NC6N2YTuUGDxG/T4xgGa+pHvCtrRl3LErxlEGuaTOP+3OKowfsuVPoDTHRINunUVKK/j/CWIkhO/FZt16kNvHZRR4+/YBklx/cX+IVMWvwk7i/QptGsn9mpA6qMqIL2DcZyiPYmx3p5tSmciLui2JsgZllJ2t5Qyv5+Y0p2oD8kcjp4qZTuwTBlJN2ae8g6ptv78/cFT8a1wMqV/hPiiWJlIH1CdRdyvh/eVslW+7wHuwXpITZWy2zHfoalSdDdx0LT5vtLtSJrcRlzbtVj38MgKmRZiXa3FlJNT8Wu52aY9+F2YP03Zh1/DOrwe4+ulvvJ/uzPLlI7GOoy/HKLOSCnZn0zjxJReiXW4RcqRKYn6hEpVuMfur2dwKvNOrL+YH2Sk45Q+GSLdg3W7E+NiughrOMbF3rjPtA+/RYT1E91lFjr11/DoVCnTEyKd7bgzYd3G3//5v+6dlNKXsJ1ZiOkX+iU7/SiYlIKUvzVuySelfungr3b8M9QMUlrA4wLjzFfRjEYdl1JxdmNto8MTfrsZz2t/kXJC6YnfBvb5RzQ1+1QmfhN2A3FkS6X5dOx7FKxd4txKphtxX12XKMWZl87F9DumrPPU6Xqsh1jbxRl8cirO5pPTyePdP+qxrSDndMbjGwmcecfmR5TPtOOnxHzEtOB8QjPpWygnwLZfJWjsGCe0a0y+OF+HU1IWOCfAAkxqHWnz6aO4BMLCjNkWnL944lOw+SOB450+ietPjlysq+zTeOwcItLGSR5gNk5FG3uaGLPYrlLrRF3Cta0Xe0bqYdG74DksC1rqYVmiVBN2/+iHqbE5XSwZf03LHMIluwkp4JL9NVFIdRC/A1OYUCrHsQf8FkyDxh2Pv86U3UC4qA+kpyGWLH6PG6CZoneELZKYihwVKomL3x8Wv3Ydxj4nLWmdmAbTOon7ZG8nwCpijn4P0I51HuuPOEP5dVuHfBWxHL89F/NFCf6e0NgtxFNR1qLeVqM7zvx+bKOoSzhHic4/mbXo7jNGj9PF2GKMEr10J3jKnMaa/AyWIOln1qKS6SFxNGFeHpxzF5UvrizIlPQwoUxUqx34LjayJ8ne24ZpRM/wEi6f9BXPidzFPsFP43HOG7h1L+Df9uF+fgHnYA+QKUOUk70+0vcTdZJ+XSrTr5lkKuqDOGfhkrk23Ip+Sc9pQaJhF2KNqsA0rxKW+Sr2CnZIdsNv9/Do4EXfoBVr+wBKRV3yz0q1kuz8dTjlH2s/xNL/4fiI2+SfH7GfgOWOZzF/+cQsGaCxQWygxFdMyRknwAb6JEvCpUva7vdgxfI90tznt5ZXcS/li54/SmUGbK/+CpcQ7y8B4ddxK3pxn1zAOTosZb8N8dvSOxO8i/lYQ67isWDC9BE4rcYc1ZN6Y5Jth17tGJ8rcwlZ+yRtAR0YGUvBMt/Bc0fT2CqYTP1lRki1ZZx4RPSLszk5p+PSOnH9/etlnEPO7GKOqEs1Io7pP4LbaMXl41EPeNO4X3oet3HEPypHxnwDcvXt18k94rzjL+fOuLdAzOwB+nkPWyFxXbMJpbQP4y1+/RHnJmmGaiS0TtSudVKZzD2xDjj/T9I4RSfjY96+OGOKI5FeKfYwmo/oW1LJ9CWMV/tLjqT893GR3q//q2ViJMrx17Fy0fPHkYHEsSzD32fLxDV4s1Q3/9yN52v/+o70jcVZD6+8xHQyF5GSE78Yvo01eb3ERUyDeRET8wO0l/Qirkr9xnb7fjduIVswL9FXuYXXzmLklaME31aif8S1zBLi6VpR1liXCrG2iLL2SHoOPkwHzkF6eAHrJ54TyXVoqDUd1LBjbPUUsGYUR/dRv5aO4PqjnO/i0YdXi2QaUGYjrudCPPqIngzovfeLNRdbjcsn13diTieBX8L0+3HrFqB7icCSd2C8aXzmwr00eY1GrtT8Oil6fVdxPRslO8CtmSSdxZRk8Yg5S6SH0rzoOz3ce8T8NTkVNcQ/FkQdOzxphYUjEIi2WvyCXFyJ+Hvsx1hSgmQTxL7y43iE+u2VuEPVg22+30KK9l+yxuABopKXS/ZBlKM/tgfuW3F0+8d4u2RFxfL96x0sI7/HWIh1Fe8tULvwbbDH8YyM9RPaO74mEttI2hlRz0X7L+4SsCai/GS/hbGMzYZQ5g/HPLcx6fvHRce41fVII8sfFaDK3/MdlN+LFqUp9vNY3XAdcDQU6DHI56ORTfPLdy32MNuw3PFdnFCmZdzLwtrFirHNluP5N1ZqKbcCpwP+/SXJelcTtl3ULjGqxA3f7vH9HJPUFtGO+WXXQsioD9UK9HYXpvdiXmI/oBo2Q6ljc8GfpD7xj4hOQsMH0RsQYJPR+9c38V2dov+8VJIXzAKWcR+vVNJDtkmqm3/mEncVsGRZlTSaRI2VbZPGmqg5fk1eSYwXOyFH7Ikxi5mfo7YgXCxBHBfjKzgk2ROYfhNOsRfHPo91ZgkuoRXnVOGcaFzOYYnGr+fR4n4XTkX/SiH6gZJPyM3DUsaa4LcDV3C6nVixjuD6zMc55f6Sx38l2l68ImaoKkpDoZgkH6E+QUVTn6RqqRSQwktUGvUy9R3qb6h/oX5FraF+TV2ivkldpm3Ui7SDTqJepVPoD1GD9LP0EtpIL6WX0Wb6E3QDbad30l+nE+lv0l10Kt1N/5jOp39Cn6Ur6fN0L1DdYij6E2w/20+v5b7Ibaaf477CfZX+e+7r3G56A9fOtdObuE6ui/4it587SDdzP+R+RH+Z+yl3mt7GnePO0Tu4Xu4i/QLXx/XTrdzvuav0N7g/ca/R/8S9wd2l27gRboTeK2NkHP2yTClT0Z0yl8xFf0v2e15Jd/Na3kNf5LP4LHqIz+EL6b/wT/ML6Df5hXwFPcp/kK9kOL6K/yjD8x/jVzJq/jN8E2PnV/MbGTf/Rb6FSeO/zu9h8vg2vpsp4b/DH2IW8T/gf8BU8cf43zDP8n18H/NZvp+/zqzmb/I3mc/zA/wAs4F/g7/LfIG/x48wX+RH5RSzRc7IlcxWuUpuYV6QO+VRzEvyGHkG84rcK3+KOSj/gHwdc0L+vLydGZC/LH+ZVclfkXezEfIfyI+xenmP/ARrlv9Ufoq1y0/Lf8E65b+U97Px8lfl19ls+Q35HTZf/hcFyz6j8CqOs0sU/xMWx76q9ql9nAakTjM1+I0UnqJ9VaN3KRZ0AN3kheKK01QHfvY5amb3H6BYthp/lBEUX4TG8UUYHF+Ex/FFlDi+iArHF4nE8UU0OL6IEccXMeH4IhYcX8SG44vYx6PXfwtHrz9FZVNvZ4R8liqkyqmFlBgfd/8se4OGtn9YU/3Y9QqDewX1CYPfJX4UdeTRuGGBxbfdLPfrz8x7arrIzY/fSONwjP81FLq7EN2ueOWB9NV7rx9Z3I81uBcZ6uQD6sf33sjlcLT2tRR6U9wOnK9SI4+VRj4avYy0dR61yK+tB3D0rkd3hn00+ozzj/B6v6WceZ9Nr3uPq8ciGx/NzXg8o3jgb89oflx7VLSPK6iVfvt47gH16Ht3XMvwbSjrqI3UFgrdrsNQt2j+sdTSR6O/A1cx+x7BVczUd39NnDsPP8Jz59QtYXBLUDtYqgt81jOPoCzu/462iR75zFv3aPiKU7dusp984zHyk6eTrDgHopaz1KkH1vZ3g1Zz47MVmqtY6hrlo7nHSPJzGe/ortwKv1YcBM+o9xG2zHPRgIke4Mzb+Wh5JFO3M4hfhqLHP3Z+2UzGey2Oz43G+/kH1gvvJp2X4ds+0U2C6PZNN+QM0Apa/Rhqw/330bvFrx67jfLdVN+ud6XfP9bT786adz02KxRSDu/+FclYa94LKxBJco//ikOS63t9hSHNUI+L9el6rKxP13vI+nS9h6xP1xPrM0Hqj9N+RqDf8PjsXzz+7Xov7UCQc3+1f+5fQ+3wxw97mDZoNuuIJ5bh0dazwHa9t3Yy3+t249F+ixtxevFd9Yb1WI3f3W8/k/3+7n0zeawVj/Nbw5KkHt83eiU5vlfftiWl/Di8CRs4Mt/9b6mOtee98QZp4Hh83N/ulGT75M1LsS9o5ihzgJIxZygVpaB0VB11hFbQy+j9tI+phN+j+zOiqUQqHUpDXtACvPqj8Le2OGU72Kpx/Ig/jjn+phndEEtS0ifxLa3Tl9hMlNiMS9yFbqIhaUYHOBp9PR26RLZKti/wN3OtY8gS77uOAaWcYG8GqyOju+9+3E+U6K8jujVqQh0rpunHI9P34+zqyH5t6n6cso608CMBRclhKEbgBI6ihAahByiXAGEVQDVADUAdQANAE8BagA0AmwG2AmwHaAXYA7AXoAtgP8AhgKMAxwGAB30W4ALAJYB+qME1+HsTYBBgCGAYVQOAB1AB6AAEACdALEAyxTAegFzAiwHmASykWGYxANSXWQawguKYeoBGgNUA6wA2AjQDtADsANgF0AbQAdANcADgMMAxgBMApwHOAfQCXAa4AnAd4BbAbYC7ACMUx4I1YBUAagADgBXADRAPkArgBcgHKAWYj25E8u897X83p9CK5yHlqacw/gVINfgG6yF0r40/nVlp4rnV7hmn/3eW9G9H6kUxGsZHl5hfF0jD7eV2UXKuB2YEJYzgrdQw3UhfYSqZk2w228WhVTB549E8WMsvhvGHvId6qhHFHsA39GSN/mEcb5NyRN7cl9DZCpPKfgxHOdqOYhJACWP25MLox3CMCtA/+vXRjdNxlPWzT6MU6uvHxXLEHNKWMLuYDZgjzDB0KlimsfzB0RIcecWJOc6bAcc4gmPclBxXPwiO/EoWPGt+D+pDERfLEXMeRhuBSxMu/89j+DjHPz8cjpwV68mHUIv8+DEpx685L2PNWYQ15wDSHLImk9Lp5Pgq1pxXsRxfJTTn1SByXIQ5Jge2kVWhNs6KYxzBMW5KjuWYo3ZuHPnPYM15CWvOZwjNeSmI5oy3kcy/D45NuPw/j+HjHCdrzhLMMXtajrTwM+E8xjiY878OM/83hCNUqnAU5v8Kq9lqpT5EfRjIlwIsB6gFWAmwCmANwHqATRSD4vfQ2wB2AuwGaAfoBNgHcBDgCEAPwEmAMwDAk74I0EexKDYMfQNgAOAOwD0AH1QJ/BBGCaABMAHYAaIBEgHSAbIBCgHKARYAVACAt4JuxEPROBh0c2kDQBOOyUOj0cRshll7K/zdjuPZ0MwegL0AXQD7UXwZ5LsDHAc4BXAW2U2ASwDgrTDXAG7iyDo0MwQwDL2KepbHMXFoVkfJWIHiWXS/ayyOwUWzHgDwVljwVljwVlDUHHbxOz2Dzz0N6QPMvrR3fgZ/cGndpJzgra6mqiiOWgX+AA1/mcl3HnK/QrfAyj6HU+XoryB9ihZgXP8v0j5xFNM+dM8sPTSaDzm08Esoh4VxDKMNj+AP4BFcRaHRC34xvQKgHqARYDXAOoCNAM0ALQA7AHYBtAF0AHQDHAA4DHAM4ATAaYBzAL0AlwGuAP/r8PcWwG2AuwAjMArBiUcxSRk1gAHACuAGiAdIBfAC5AOUAswHWARQCQB1ZcDSMLVQBKzdmVUAawDWA4ClYbYAbAPYCbAboB2gE2AfwEGAIwA9ACcBzgDA+oa5CNAHcBXgBsAAwB2AewA+imGh/1klgAbABGAHiKZYNhH+pgPAmp8tBABLw4KlYcHSoAhkbPU7PQYfqVH8OHjy9zWWI4cjb1FyjRLGcgzM2sfoVLqd0TCbmSG2nr3MLeJ6ZOmyvbyOb+bvylfK+xQViuNhnrAOpUG5RXkvvCG8X7VYdSLCG9GpNqm3qocjG6ddDbSj+5+553H0sTsIF+0BmXKvwfqXpg2w4qWZTl8pmrXQ7bkBlJHj+HRepApWtbRsBYoiJ/upZIHIVLaCGsUc/xp4nfTZUNQ59KsASsuD5Qg+3APjKNvIngB/6in/PXqh/V+JYxyKtYd6+L45jgDHRKpyBhxfwRw/gjn2TJKjZWYc+c+xKBLiNmmfado22ubWRv6fkRfEHx6v4VQcF2OODOZYPZHjuGc9DUd5GLrtWV6EbNrb00bg+CLmGPl2tZE/zoWjdCpe4xyrMUfkn1ZN5jhjOR5n/2fGHBdPxXF8vTKdBfgv7iAeHV+YpRzj79vm7Ea7u7LvoBveZ96rTDU9dL9tZD+P2giW/Gsz4PhZbMnj0E7w/esqN8LBykR2akZtHJcjMzi5V2eqq+wf0R3vk9vIfY/LCirHTiRHesf9t5H9B7QbHoRjPRo1D4XjWBufn8DxbMg2aoNznLHmjLVxIsfQbZwjRy5ONhzYq9wHpFOlCRzHdTWY5sy0V4HjhydyDO4JPCiO4G/wY6mf48g0bUReh3sObfxP1MZAjtO0ca4cv4et3PvwqnESlyCaI9rVnjn0ajqaH2V3Z2RzPo45avHcMQeO3H9Mx2ucY/UYR9Cc+54fwcdfMGOOg5gjiiM/GMRf/dzMOIIPYJ1lG9GMfHMOvdqGTg1ny3EuvfqOtPHa2yvHmfCa3EaOuf+Vzv1xnIsFeMQ5jvsA0/QqI1wQ/kxRliRLEhWN/0cn5RTeZ3uW+gj1sM7JKfoaxczynJxiPBTL5AJI5+QcugeBOCeXMfU4IjuNztOYdQAbAdA9qWjXYAc6SwBoA0CRz7sBDgAcBjhGocjs6L4smjkH0AtwGQDdPXMd4BaFbuSkmbsA4u1jNKug0G2rNGsAsOJY8jQL8mVTKZ71AuTjGPQ0OidnF1EUWwmwFGA5QC2WwTu+XzaX9EGdmo8efiz22sZOze9jx83YamyheONBSkXlUU1UL51N76LvMcuYHtbJbmKvcfO5LplC1iA7x6fzO/g78iXyIwpBsV7RH1YatlfJKOuUp8MTw1vCB1SLVQcjdBFrIi6p89V71CORNZEnNNGaZs0N7ULtPp1Kt0p3Qe/Vt+rvGqoNx4zoLT4r5abiqVSofT7+cmcRVSm+A07/FO3EMd/3vQTpDybuyjH/SBcBfpB+bhp7NAUHNgWPDwXiwP4e4eSv2UYanfstmLQanQ2HRvZraG2BOIQs41NzaQNY2F9CapuSw3/Q354Dh7Psp9HuwVQc6BeYiDlwGMF7k8aHx0G2AslB9p13MwfuabQS5ZZPKek35yTpp9Ge1LQcdtw/B6aT+1sYD4UPbzwwP0KrMXFMPyQOq9EeE3NpSg4b58Th+2hPiXn9IXIol/0lWC+xhcT+yqfomvvnQPfLDgfloCD2U+bEwd+GSbr0wNtQ6Nv90NrwdbQHJM5x4i9Af5+eUMacrDfzCtoPCeDw80l7VnPjcAnJgdRWVv6A2/BH3IZADvIHyqET7ahMM6bnZDVYBXsE+QMPz3qzUdyXpvk18pfmYL3Zf5i4+/qgOXDMDPaZ5sRBpOLC0f5UqDJgno6ahmZaDg+/DQ+TA5Mwpe/9+gPwvZ+VfG9OO8n3bn9X+N4P3TN+HLxKxvfQfb7XH7rPd+Bh+3xsxEP3+XY8bJ8PPLLHx+d7eG14faLPx0Y9YH/prYk+H5vxYH0+1j7J5/vkg20DWzDJ5/vIA/b5fA/d52t84vNNz+FR8vnmxuEBtIEW7lgSMSZ9QdBDpVpSLKlUFT4XWUKh7weDfzlAzeHLAcr/5QBzH18OsEwhQDk19uUA5/9ygGJqAIJ/OUA/5C8HaFYAkL4ckLEegFzAiwHm4ft2afTlALuEothlACsA6gHE0653/HxjLukD/KLw8T8VqfPn1IXuh6fVTzkp5mmBUnFazQJNhaZKU62p0dRpGjRNmrWaDZrNmq2a7ZpWzR7NXk2XZr/mkOao5rjmlOas5oLmkqZfc01zUzOoGdIMayktr1VpdVpB69TGapO1Hm2utlg7T7tQu1i7RLtMu0Jbr23Urtau027UNmtbtDu0u7Rt2g5tt/aA9rD2mPaE9rT2nLZXe1l7RXtde0t7W3tXO6JjdAqdWmfQWXVuXbwuVefV5etKdfN1i3SVuqW65bpa3UrdKt0a3XrdJt0W3TbdTt1uXbuuU7dPd1B3RNejO6k7ozuvu6jr013V3dAN6O7o7ul8ek6v1Gv0Jr1dH61P1Kfrs/WF+nL9An2Fvkpfra/R1+kb9E36tfoN+s36rfrt+lb9Hv1efZd+v/6Q/qj+uP6U/qz+gv6Svl9/TX9TP6gf0g8bKANvUBl0BsHgNMQakg0eQ66h2DDPsNCw2LDEsMywwlBvaDSsNqwzbDQ0G1oMOwy7DG2GDkO34YDhsOGY4YThtOGcoddw2XDFcN1wy3DbcNcwYmSMCqPaaDBajW5jvDHV6DXmG0uN842LjJXGpcblxlrjSuMq4xrjeuMm4xbjNuNO425ju7HTuM940HjE2GM8aTxjPG+8aOwzXjXeMA4Y7xjvGX0mzqQ0aUwmk90UbUo0pZuyTYWmctMCU4WpylRtqjHVmRpMTaa1pg2mzaatpu2mVtMe015Tl2m/6ZDpqOm46ZTprOmC6ZKp33TNdNM0aBoyDZspM29WmXVmwew0x5qTzR5zrrnYPM+80LzYvMS8zLzCXG9uNK82rzNvNDebW8w7zLvMbeYOc7f5gPmw+Zj5hPm0+Zy513zZfMV83XzLfNt81zwiMIJCUAsGwSq4hXghVfAK+UKpMF9YJFQKS4XlQq2wUlglrBHWC5uELcI2YaewW2gXOoV9wkHhiNAjnBTOCOeFi0KfcFW4IQwId4R7gs/CWZQWjcVksVuiLYmWdEu2pdBSbllgqbBUWaotNZY6S4OlybLWssGy2bLVst3Satlj2Wvpsuy3HLIctRy3nLKctVywXLL0W65ZbloGLUOWYStl5a0qq84qWJ3WWGuy1WPNtRZb51kXWhdbl1iXWVdY662N1tXWddaN1mZri3WHdZe1zdph7bYesB62HrOesJ62nrP2Wi9br1ivW29Zb1vvWkdsjE1hU9sMNqvNbYu3pdq8tnxbqW2+bZGt0rbUttxWa1tpW2VbY1tv22TbYttm22nbbWu3ddr22Q7ajth6bCdtZ2znbRdtfbarthu2Adsd2z2bz87ZlXaN3WS326PtifZ0e7a90F5uX2CvsFfZq+019jp7g73Jvta+wb7ZvtW+3d5q32Pfa++y77cfsh+1H7efsp+1X7Bfsvfbr9lv2gftQ/ZhB+XgHSqHziE4nI5YR7LD48h1FDvmORY6FjuWOJY5VjjqHY2O1Y51jo2OZkeLY4djl6PN0eHodhxwHHYcc5xwnHacc/Q6LjuuOK47bjluO+46RpyMU+FUOw1Oq9PtjHemOr3OfGepc75zkbPSudS53FnrXOlc5VzjXO/c5Nzi3Obc6dztbHd2Ovc5DzqPOHucJ51nnOedF519zqvOG84B5x3nPafPxbmULo3L5LK7ol2JrnRXtqvQVe5a4KpwVbmqXTWuOleDq8m11rXBtdm11bXd1era49rr6nLtdx1yHXUdd51ynXVdcF1y9buuuW66Bl1DrmE35ebdKrfOLbid7lh3stvjznUXu+e5F7oXu5e4l7lXuOvdje7V7nXuje5md4t7h3uXu83d4e52H3Afdh9zn3Cfdp9z97ovu6+4r7tvuW+777pHopgoRZQ6yhBljXJHxUelRnmj8qNKo+ZHLYqqjFoatTyqNmpl1KqoNVHrozZFbYnaFrUzandUe1Rn1L6og1FHonqiTkadiTofdTGqL+pq1I2ogag7UfeifNFctDJaE22KtkdHRydGp0dnRxdGl0cviK6Iroqujq6JrotuiG6KXhu9IXpz9Nbo7dGt0Xui90Z3Re+PPhR9NPp49Knos9EXoi9F90dfi74ZPRg9FD0cQ8XwMaoYXYwQ44yJjUmO8cTkxhTHzItZGLM4ZknMspgVMfUxjTGrY9bFbIxpjmmJ2RGzK6YtpiOmO+ZAzOGYYzEnYk7HnIvpjbkccyXmesytmNsxd2NGYplYRaw61hBrjXXHxsemxnpj82NLY+fHLoqtjF0auzy2NnZl7KrYNbHrYzfFbondFrszdndse2xn7L7Yg7FHYntiT8aeiT0fezG2L/Zq7I3Ygdg7sfdifXFcnDJOE2eKs8dFxyXGpcdlxxXGlcctiKuIq4qrjquJq4triGuKWxu3IW5z3Na47XGtcXvi9sZ1xe2POxR3NO543Km4s3EX4i7F9cddi7sZNxg3FDccT8Xz8ap4XbwQ74yPjU+O98TnxhfHz4tfGL84fkn8svgV8fXxjfGr49fFb4xvjm+J3xG/K74tviO+O/5A/OH4Y/En4k/Hn4vvjb8cfyX+evyt+Nvxd+NHEpgERYI6wZBgTXAnxCekJngT8hNKE+YnLEqoTFiasDyhNmFlwqqENQnrEzYlbEnYlrAzYXdCe0Jnwr6EgwlHEnoSTiacSTifcDGhL+Fqwo2EgYQ7CfcSfIlcojJRk2hKtCdGJyYmpidmJxYmlicuSKxIrEqsTqxJrEtsSGxKXJu4IXFz4tbE7YmtiXsS9yZ2Je5PPJR4NPF44qnEs4kXEi8l9ideS7yZOJg4lDicRCXxSaokXZKQ5EyKTUpO8iTlJhUnzUtamLQ4aUnSsqQVSfVJjUmrk9YlbUxqTmpJ2pG0K6ktqSOpO+lA0uGkY0knkk4nnUvqTbqcdCXpetKtpNtJd5NGkplkRbI62ZBsTXYnxyenJnuT85NLk+cnL0quTF6avDy5Nnll8qrkNcnrkzclb0nelrwzeXdye3Jn8r7kg8lHknuSTyafST6ffDG5L/lq8o3kgeQ7yfeSfSlcijJFk2JKsadEpySmpKdkpxSmlKcsSKlIqUqpTqlJqUtpSGlKWZuyIWVzytaU7SmtKXtS9qZ0pexPOZRyNOV4yqmUsykXUi6l9KdcS7mZMpgylDKcSqXyqapUXaqQ6kyNTU1O9aTmphanzktdmLo4dUnqstQVqfWpjamrU9elbkxtTm1J3ZG6K7UttSO1O/VA6uHUY6knUk+nnkvtTb2ceiX1euqt1Nupd1NH0pg0RZo6zZBmTXOnxaelpnnT8tNK0+anLUqrTFuatjytNm1l2qq0NWnr0zalbUnblrYzbXdae1pn2r60g2lH0nrSTqadSTufdjGtL+1q2o20gbQ7affSfOlcujJdk25Kt6dHpyemp6dnpxeml6cvSK9Ir0qvTq9Jr0tvSG9KX5u+IX1z+tb07emt6XvS96Z3pe9PP5R+NP14+qn0s+kX0i+l96dfS7+ZPpg+lD6cQWXwGaoMXYaQ4cyIzUjO8GTkZhRnzMtYmLE4Y0nGsowVGfUZjRmrM9ZlbMxozmjJ2JGxK6MtoyOjO+NAxuGMYxknMk5nnMvozbiccSXjesatjNsZdzNGPIxH4VF7DB6rx+2J96R6vJ58T6lnvmeRp9Kz1LPcU+tZ6VnlWeNZ79nk2eLZ5tnp2e1p93R69nkOeo54ejwnPWc85z0XPX2eq54bngHPHc89jy+Ty1RmajJNmfbM6MzEzPTM7MzCzPLMBZkVmVWZ1Zk1mXWZDZlNmWszN2RuztyauT2zNXNP5t7Mrsz9mYcyj2YezzyVeTbzQualzP7Ma5k3MwczhzKHwSHnvSqvzit4nd5Yb7LX4831FnvneRd6F3uXeJd5V3jrvY3e1d513o3eZm+Ld4d3l7fN2+Ht9h7wHvYe857wnvae8/Z6L3uveK97b3lve+96R7KYLEWWOsuQZc1yZ8VnpWZ5s/KzSrPmZy3KqsxamrU8qzZrZdaqrDVZ67M2ZW3J2pa1M2t3VntWZ9a+rINZR7J6sk5mnck6n3Uxqy/rataNrIGsO1n3snzZXLYyW5NtyrZnR2cnZqdnZ2cXZpdnL8iuyK7Krs6uya7Lbshuyl6bvSF7c/bW7O3Zrdl7svdmd2Xvzz6UfTT7ePap7LPZF7IvZfdnX8u+mT2YPZQ9nEPl8DmqHF2OkOPMic1JzvHk5OYU58zLWZizOGdJzrKcFTn1OY05q3PW5WzMac5pydmRsyunLacjpzvnQM7hnGM5J3JO55zL6c25nHMl53rOrZzbOXdzRnKZXEWuOteQa81158bnpuZ6c/NzS3Pn5y7Krcxdmrs8tzZ3Ze6q3DW563M35W7J3Za7M3d3bntuZ+6+3IO5R3J7ck/mnsk9n3sxty/3au6N3IHcO7n3cn15XJ4yT5NnyrPnRecl5qXnZecV5pXnLciryKvKq86ryavLa8hrylubtyFvc97WvO15rXl78vbmdeXtzzuUdzTveN6pvLN5F/Iu5fXnXcu7mTeYN5Q3nE/l8/mqfF2+kO/Mj81Pzvfk5+YX58/LX5i/OH9J/rL8Ffn1+Y35q/PX5W/Mb85vyd+Rvyu/Lb8jvzv/QP7h/GP5J/JP55/L782/nH8l/3r+rfzb+XfzRwqYAkWBusBQYC1wF8QXpBZ4C/ILSgvmFywqqCxYWrC8oLZgZcGqgjUF6ws2FWwp2Faws2B3QXtBZ8G+goMFRwp6Ck4WnCk4X3CxoK/gasGNgoGCOwX3CnyFXKGyUFNoKrQXRhcmFqYXZhcWFpYXLiisKKwqrC6sKawrbChsKlxbuKFwc+HWwu2FrYV7CvcWdhXuLzxUeLTweOGpwrOFFwovFfYXXiu8WThYOFQ4XEQV8UWqIl2RUOQsii1KLvIU5RYVF80rWli0uGhJ0bKiFUX1RY1Fq4vWFW0sai5qKdpRtKuoraijqLvoQNHhomNFJ4pOF50r6i26XHSl6HrRraLbRXeLRoqZYkWxuthQbC12F8cXpxZ7i/OLS4vnFy8qrixeWry8uLZ4ZfGq4jXF64s3FW8p3la8s3h3cXtxZ/G+4oPFR4p7ik8Wnyk+X3yxuK/4avGN4oHiO8X3in0lXImyRFNiKrGXRJcklqSXZJcUlpSXLCipKKkqqS6pKakraShpKllbsqFkc8nWku0lrSV7SvaWdJXsLzlUcrTkeMmpkrMlF0oulfSXXCu5WTJYMlQyXEqV8qWqUl2pUOosjS1NLvWU5pYWl84rXVi6uHRJ6bLSFaX1pY2lq0vXlW4sbS5tKd1Ruqu0rbSjtLv0QOnh0mOlJ0pPl54r7S29XHql9HrprdLbpXdLR8qYMkWZusxQZi1zl8WXpZZ5y/LLSsvmly0qqyxbWra8rLZsZdmqsjVl68s2lW0p21a2s2x3WXtZZ9m+soNlR8p6yk6WnSk7X3axrK/satmNsoGyO2X3ynzlXLmyXFNuKreXR5cnlqeXZ5cXlpeXLyivKK8qry6vKa8rbyhvKl9bvqF8c/nW8u3lreV7yveWd5XvLz9UfrT8ePmp8rPlF8ovlfeXXyu/WT5YPlQ+/BT1FP8Uet98Gd+JdhdQys0n8AEJZ/9A4PslXKaScP43RH4FUU508N+y/03gvybos4j82hD5b0o481ki/1RwevoSgf+RoH8lOA1fF7wcLi94PnOWKDOKyD8QnF52lKB/jsBfIuhffmdw3hZCH2aLE/rDjQbH2ZtvH07q6kxwbiQ4Lisn5Mu9Mzi3k8j/SnCcSwyOsx8PgdeGyG8iyqkh+iF5DricwCseMv5BQrdfJ9pC2CUZaWeqZ4ez/zJL/Mb0uCz6nce5FgmXO+8f5xJm1/aQ+I9niQ+9M7hsOdF2YsyyP38wOPepEPhzwXF20zuEVxL12TwHfF0I/EUJpwfeGZwj5kqmNDjO/kdwnLkaAr8RIv82UQ7hL/E8UZ8X5oDXE/i+txE/Frwt7M+C49z3iPzXZol/cA74R2eHc19553H2LaJvS+8fZ88R+JfmgP/NLPFfv304n0Hk194/zm0j8AYCzybo33wb8VOzw8l6ck9LeMAa6iHj7Aki/1ZwnFy7hVrHMfYQvMj1IzFGAto+E7wjRH7+Q8aLCb09N309yfVpKJxct84EJ+tD/5kok9Alcv3L9Myhnx8QzhI+A7kGnwlOrs1nhCfNEifXmyHW5jNZ54ZaM4ZcH7USeKh1wWmC10x89VD2dgb2KpRNCDkW9s5AB3pnKbtQfv6m6fGQvmIo/4ekCTGPy4wErxnMswH9Rpb/AQIvJ3By/iLGCLlXI9sYvJyAPZY4Ip+0LcT6V6YmyiHWmAyxXmDiCRpi70IeRpRD7icQ+kzO49x1Ag+1Zv8OQVMWXJ9lRN0C1sjzCHpy7Xk2OM4RbVcQfBWEfHmW4PU+ou0/IHADUSZhH0KOd6LO5P5eyL2vxBDlEDjZLsXXg7eFLFNO7kddDC7H2dq92dq6UHs4oexegOzIPcDY4DJlX5++/gF9eCM4PbmPGrAXR9rY1hC/XTYDfOD+8ZBzEDnGZ7CPOhM8YM8zxH7mjPY2Q+DkmUUofLZ7m+S+YgD+MPYSZ7mvONs9RtI+z2Q/kNzrC7nvN4O9u1DrpgBf7vshaDyEHJ8O8VtivcA8ReQfJuhJG1IaohzyrOcqgRN+L+nXBfh7K4k+JPXzBFF/om9JPyqkXxRijRkwJ5L2h1wDvhKiTAIn7SG5Fguof4i15Gx9wtn6gaHWNSH1JxTNLwictO0V09c/oK8If5L5MkHzp+B6wn+NwInznYB9BnItRugSU07krw5ez4e+tgohx5Dns3PgFXLfIMSeQKj9gZng5FlwKPxB9eHDWKeHOo+eCT7bNfVM1tcB590hzr5nsl4O6LcDIXiRZZL2k9iv4Ej9HAyBk2cxpK9Cnrn8KsRvNxE0nUQ+MZ+GOith3yDa6CXqT/pjxJkCT9AE7O0T600ZYVsC3qkItU/+MQIn15vkXjexJx+w/0ysWQL2dXcQOGH32N0SLj8v4YoPE/Un/FgZYav5XxK/JeZWcv0ecj1OrrXJ87sQZ1Jkn4da15NtDNUWskyezCfX44QcZ7svMdu9iFDnJiHPF4g2BpzNkTIlz3G2TV//gPp8KQQ9MR5JvyvgLKYg+G/JM9mQeKgz1hngsz4PDXW+OQM8lB2Y9ZljCJw8jwuFz/acMdS53rvx/I48X5vJWVvAOVqoM7UZnIuROkDWOYBXqLEzS58wwP/85gzoQ/iBMluIMklbl0PgRYROPjWDOn+IKJP0SS4QNFnTl0PyCjhL8obIJ96NZP43OA23hZDR/wmBz8SffJbAibWGjFgLk/O7LJeo2wx8y5D49uA4OV8H4ITPSa4TmXkh8sl94FC+KOE7cWsJnJg3Q/mfAX4gqSekb0n6b8RZFftDAm+dAU7oM/meW8C4I3Sb+zSBE/u9ZJ8ErGUswXUjVH34vyVwYt9VTpZD+JnkGk22nvgtuadHyoW0Ua8HxwN0mDw7IMaILJLgRe5X6Ah68j0o8l1T0oaTe/hE2wPGLLk3RcxN5Ds2MtLekuNuTYj6fJvAu4lyiP1J8qyW3P8Jud9ClMP+MgROtDdg34zwSWT/TtSBsDPsFSKf3Osg503yvQhyXUnYVeZO8DI5wuch2yIj5UueBxFjjfsR8VslUc82gobcrztO0FcRuJXAyXmB0LcAO0DuiXHB8/mtRNuJ+YIhdYaU728JPNQeCGGXyD2TgPMLYj+QJnSVfz54OaH2FtjPE/nDIfqH9LuI9w24DQR+OTivAB8g1DszIfb6SBomKzgvdm3Q3zJUFaWhMimK+gj1CSqa+iRVS6VQddRLVBr1MvUd6m+of6F+Ra2hfk1dor5JXaZt1Iu0g06iXqVT6A9Rg/Sz9BLaSC+ll9Fm+hN0A22nd9JfpxPpb9JddCrdTf+Yzqd/Qp+lK+nzdC9Q3WIo+hNsP9tPr+W+yG2mn+O+wn2V/nvu69xuegPXzrXTm7hOrov+IrefO0g3cz/kfkR/mfspd5rexp3jztE7uF7uIv0C18f1063c77mr9De4P3Gv0f/EvcHdpdu4EW6E3itjZBz9skwpU9GdMpfMRX9L9nteSXfzWt5DX+Sz+Cx6iM/hC+m/8E/zC+g3+YV8BT3Kf5CvZDi+iv8ow/Mf41cyav4zfBNj51fzGxk3/0W+hUnjv87vYfJgPHUzJfx3+EPMIv4H/A+YKv4Y/xvmWb6P7wM97OevM6v5m/xN5vP8AD/AbODf4O8yX+Dv8SPMF/lROcVskTNyJbNVrpJbmBfkTnkU85I8Rp7BvCL3yp9iDso/IF/HnJA/L29nBuQvy19mVfJX5N1shPwH8mOsXt4jP8Ga5T+Vn2Lt8tPyX7BO+S/l/Wy8/FX5dTZbfkN+h82X/0XBss8ovIrj7BLF/4TFsa+qfWofp0FRaiJ+FnEG5M0B6EALBPjrhL+xSCO4U5AqcUpxWzG+9UkEjScRNJ5E0HgSQeNJBI0nETSeRNB4EkHjSQSNJxE0nkTQeBJB40kEjScRNJ5E0HgSQeP+I2hwy3zLx3alufkYx6ez3ADCxQga7B8wjqNgsPsRLr4pK1MhXHzrlP8Nzq8Q9/5wOfiNTC564m/FCBrsf2Mcny6wv8b0eNeMy8L5teKe2qT8N8U9OISLu43MZ3H+KXGvcyK9uMtGX8I4jqBB/xHT45MJ9pWJNOIuM183sRwxggaXNzFf3J1kzuIy8S4zG4Xz8UkDc2AivXi6IzuK6fFbOOxzGMcnPexLmB6/Fc29LOLyxoeLS7zEN+x5m6gPmGb+zHFSf3A+1h/xSwxudCLO3kQ07M2Hh+P+vCnqKsoXdTU0Lumz+CY3NyLiuC0YFyNoyMqxfPEOO8OJOKJ5mLjES4ygwe3E+fhEn/mKiGN6jItvlnOJE3HxDXL24yKO+0rEazFeO4kGR9Bgm3A5OIIGV4P7Ab81LksWcdyH0+AEPT5ZlMlFW4FpKh4ajk+DZB/Euo1P9fjXJ9olMYKGTLQz+I12rlrEsdyD4BIN+y+43/5lahz3oYjfwPk3RBznT8LFt9hlYt2icVveJlziK74xz7UgXHxL/v+z9+bxUR5H/vDMM888UtDc9z2jkTS6BZZlohAio2skje77PlAwSxTMypgomPAjmGCiEMJiViZEwZglmMgKVjDBikwEISzGLJFlTGQsE5bVYkJYTGRCWExYGN7u6jl6ZjQ2zm6yn/ez/qNaxXeqq4/qp5/u6nqaCAvhsfyD8ySSno0PbS/dDw/AQ4S94JeEB/zjeYgaEdz8W/MkAk/YAm2HZ5aFZ5actgp+/d/lycko+1gID+8R9uvBPIniEqz9m/NweiqogPpAxBi77i/iIVqIXRnCw2kf+zzmSSQZ/9rfmic3aLDwriS3ZjBZwTyJYBP8SzBPItWYqRAenhHmcggOJ6bMddBDrZdINBvHQX0gGoB99i/i4QYNdjHwEMXIDv5NeLhBgz0U3BYSXSd4PZgn0brsK4DDKa/gDw/Mw7tAUP4X8RClIWh8UJ5E2rHf+9/kSVSf4B70LYxJLusv4Um0n2AMeIjME3zrL+IhwkDwlQfmqXH+1+ZJ1A43G3Bq3/FpeXKDBrsJeIhoYbuAhwgDNgPkqf3LX52n9kQPwrMZsM6BepIbNNhcmPfoPdRfmSdfkQmOAg6RdvyrwTy9dwvcx+H6Ez3kBg3GFFIW9A+f7B/hGWHuBdvogXi4QYPdHYJDFBSb+VfjIaKFnQ/jFp5Nbuzj6knvT8Px9L71QXi6PuSLFP4fQSeMJQbGEr3/JTdoMKN/UT//D/EkQkgAawZ6D/4gPL03fyAeorIEiQ/Mw35TQPabYfb+9H423J433J6R9skE7I8g2lLYB3y4fQfcoCE8AWU9yBo+3Hz7APNVuDkh7LOwC/hdHzsG4AYN9swD2y5gbQ/tInzAWhfwkHUvH/weM6wVA9Y/YFPCU362wPc4yABPbtAQqqGssO9ZqM+3QvqN1g/Rq2wp8ODHYMGPQb7YYcn763koF54R2ldDbtAQrgnWE+BjgRs0hHGAw9wiIHMLtf8VSmBcSUAPtcckN2gwsF8gN2gwDpChfBfkBo2Iz4Ee2p9AjW36PU5u0GAvAR+wZ/fXh9ygIfgJyEA0Kvto8DgnN2gIK4KfEXKDBpsD8vT+lG47xZNoURbaHvkT3A+RUC65dSIS7Etu0OAEUBZEVAsLoO3wNVrEz4GHGzQiVMHzA/3sBzzj1LPMGTFP/Hu0v4v2g7EJoDPh4+YNwSkYb9AucoNG5HPBbaF1khs0Iog/CiK52QliR7+PKJx/8sHmujBtp/hw/pxw/pAA29E+QLhBQxgbbFMSNS748OPm7YA+pObMgDmf8qMG+OLouRfmbUFfSN4mKJf482nfPs3Tvll6fngAPvAdRPGUvytgLFH9Fs6nGoj7+QCfJzUmP7VvMwD389y78Cy8G8rDM/hu8PgM9HnOzLMwfohfMYAP4z8M70uk5qgH8TE+gF8xvI9xZp7dCHXeGDxXB/r64Ln2+PpAPj6YD/Tj0f46as6k+HD7poC1HHw1JPhZiAzcoMHOATvC/oXLDclL7RdIBDyTDThE5AsOgjzMeyyZQ2AvLMwK0UOf9dC+GmrdS6/rAtZ7EGEvWAJ9CGMygoxPau9DbtDgoG/pdVTYdVGYPWbAO5FqV8Ae8Edglx+F6KR4ej6k92IB9Q/YS1L1+ZRrwk+7Dgy3rwk7fui5nd7zwlfZ7Jshczv0m6Dk4+of0FfUepLcoMF8B2TgBg32g+BxQm7Q4P4ReDjf4eB8J8DPQO/FqLHEwFqOgbUcuUFDsDy4nn/1vVUYOzJPwHs59Hw2rE7KFmFkwvoNqDEc3j9A5/X7CsLppM+Cw/H/U334P7dPh34IwZkhsMVQ8NgLx3/aPfWD7K8DzrvDnH0/yH45oN+odoXds9Pz5x/B7uCvIDdosGR8ws0XgukQnj6Loffp9JkLfIHJ/iYkL7U3JF+BsnsAh/epAN6n4c5KyA0agj9BG+ELXiYd6k/tK+kzBXKDBgcyAb59au9JvrAVwtwSEFMRzk8ON2gImoGn95u0r5vyyQf4n2HPIoA9S4BfF25eEGwBHuY9Acx75CtcwXbMk1snIsYxT26diKyF+sM6VgjrWHKDhhDmanKDBvcW5IV3awS8W+m9fNj9OFXngPO7MGdSdJ+HO9eg2xiuLbROcoMGR3B6P07ZMez5Y5gzuLDnVuHqHObcJOz5AtXGgLM5sClLbEqf44BvXLDp4+ofUB96vNHy1PNIr7sCzmLgBg3BF4Lz0meyYflwZ6wPwH/q89Bw55sPwIebBz71mWMYnj6PC8d/2nPGcOd6/73zO3jfzcBTMn+F8zv6fO1BztoCztHCnak9wLkYPQboOgeUFe7Z+ZRrwoD1J9ygIfjhx8qHWQeSGzSExhCd9NkZ3KDBPgI83DLAfhHGJLVHC1tn+HKYrQSd9JoEvvQWnAYZOpYv3BqMKoteBwa8f2kcYiMZiI0kN2gwfw6WITdosBvARnBrBvflEP5B1pPwJT9bDTy11yA3aAhhL0y/38kNGsK5ULcHWFuG5eHWDGZzME+/rwN4as1J7xPJDRpMTggOayGG+IHDrUWptRO5QYPtAR7em2xtsN3DrgNhnAjIOKHXlrB+E5D1G5xVCeCsitygIfgF8JTPLSxPjWc6zi3guaPGNrlBg/0q8ODvZQuC+yRgLwM3Xwj0Ic9dmPqQGzS4vwce/K4c+F3JDRoRRA+sM1lYZ9J7NHKDhnAV5AVfMUd8emAXltgF5iWWzFGU/zPAF0qPYfrsAJ4RATwj5AYNoRTKov0VcIMGqwB5Og6KjjWFOZAlczj48AXEhw9tF/x9yDMLMWkM8U3Bu0kA7yY6xobcoCH8SshzBzdosCtC6gM3aLAvAQ+3RbADoAf8k0LwT9JntbT/J6y/BfQIQA+5NUPwVghPtTfAb0atScgNGsI3gucZctuF4ALg4OvgiK+Dfm+CLQSzg59rel4lN2gwN4J1khs02IrgtpAbNITEvpSPhdygwcKzRm7QYA9DXrhBQzAL6gk3aHA7QAb8dSzx18ENGuwRkIcbNARVwMMNGgJD8PxAbtAQSEPmAdonBmtCARuMkxs0uF5oO/W+IDdoMGTMgH1ZYl+4QYP9LfCghw31gVDvLzqmPSCWHvyBLPgDyQ0afBir5AYN7pvBesL5FsgNGoJvAA43aDB3QvqHXndBvIEA4g3IDRrsauDhVgt2MmQuotcA4WJmwvj6aBlygwbzcHBZ5AYNQU9Q3s9u0Pg/d4OG5DuSf0T2juLxeWnobwaieYgWIHIirAT9rULUgKgN0SKEdeEbNe7vgHs1rsPdKyrg/x14sf9XYRQgn4dffwrIb72/fnnbwr08waJYfA/HZzcafHajwWc3Gnx2o0HsZzcafHajwWc3Gnx2o8FnNxp8dqPBZzcafHajwWc3Gvwv3GiQrcjWZVuyY7OTsudkz82en52TXZhdll2T3ZTdkb04e2n28uyV2Wuy12dvzN6SvS17R/bu7IHsoeyD2Yeyj2afyB7LPpM9mX0h+1L21ezr2bey7+YwOZE5khxVjiHHluPISclJz8nMycrJy3HlVOTU5bTkdOYsyVmWsyJnVc7anA05m3K25mzP2ZmzJ2cwZ3/OcM5ozrGckznjORM553Kmci7nXMu5kXM7x53L5s7KleVqck259tyE3LTcjNx5uQtynbkluVW5DbltuYtyu3K7c3tyV+euy+3N3Zzbl9ufuyt3b+6+3AO5I7lHco/nnso9nXs293zuxdwrudO5N3Pv5PHyuDxRniJPl2fJi81LypuTNzdvfl5OXmFeWV5NXlNeR97ivKV5y/NW5q3JW5+3MW9L3ra8HXm78wbyhvIO5h3KO5p3Im8s70zeZN6FvEt5V/Ou593Ku5vP5EfmS/JV+YZ8W74jPyU/PT8zPys/L9+VX5Ffl9+S35m/JH9Z/or8Vflr8zfkb8rfmr89f2f+nvzB/P35w/mj+cfyT+aP50/kn8ufyr+cfy3/Rv7tfLeTdc5yypwap8lpdyY405wZznnOBU6ns8RZ5WxwtjkXObuc3c4e52rnOmevc7Ozz9nv3OXc69znPOAccR5xHneecp52nnWed150XnFOO2867xTwCrgCUYGiQFdgKYgtSCqYUzC3YH5BTkFhQVlBTUFTQUfB4oKlBcsLVhasKVhfsLFgS8G2gh0FuwsGCoYKDhYcKjhacKJgrOBMwWTBhYJLBVcLrhfcKrhbyBRGFkoKVYWGQluhozClML0wszCrMK/QVVhRWFfYUthZuKRwWeGKwlWFaws3FG4q3Fq4vXBn4Z7CwcL9hcOFo4XHCk8WjhdOFJ4rnCq8XHit8Ebh7UJ3EVs0q0hWpCkyFdmLEorSijKK5hUtKHIWlRRVFTUUtRUtKuoq6i7qKVpdtK6ot2hzUV9Rf9Guor1F+4oOFI0UHSk6XnSq6HTR2aLzRReLrhRNF90suuPiuTiXyKVw6VwWV6wryTXHNdc135XjKnSVuWpcTa4O12LXUtdy10rXGtd610bXFtc21w7XbteAa8h10HXIddR1wjXmOuOadF1wXXJddV133XLdLWaKI4slxapiQ7Gt2FGcUpxenFmcVZxX7CquKK4rbinuLF5SvKx4RfGq4rXFG4o3FW8t3l68s3hP8WDx/uLh4tHiY8Uni8eLJ4rPFU8VXy6+Vnyj+Haxu4QtmVUiK9GUmErsJQklaSUZJfNKFpQ4S0pKqkoaStpKFpV0lXSX9JSsLllX0luyuaSvpL9kV8nekn0lB0pGSo6UHC85VXK65GzJ+ZKLJVdKpktultwp5ZVypaJSRamu1FIaW5pUOqd0bun80pzSwtKy0prSptKO0sWlS0uXl64sXVO6vnRj6ZbSbaU7SneXDpQOlR4sPVR6tPRE6VjpmdLJ0gull0qvll4vvVV6t4wpiyyTlKnKDGW2MkdZSll6WWZZVllemausoqyurKWss2xJ2bKyFWWrytaWbSjbVLa1bHvZzrI9ZYNl+8uGy0bLjpWdLBsvmyg7VzZVdrnsWtmNsttl7nK2fFa5rFxTbiq3lyeUp5VnlM8rX1DuLC8prypvKG8rX1TeVd5d3lO+unxdeW/55vK+8v7yXeV7y/eVHygfKT9Sfrz8VPnp8rPl58svll8pny6/WX6nglfBVYgqFBW6CktFbEVSxZyKuRXzK3IqCivKKmoqmio6KhZXLK1YXrGyYk3F+oqNFVsqtlXsqNhdMVAxVHGw4lDF0YoTFWMVZyomKy5UXKq4WnG94lbF3UqmMrJSUqmqNFTaKh2VKZXplZmVWZV5la7Kisq6ypbKzsollcsqV1SuqlxbuaFyU+XWyu2VOyv3VA5W7q8crhytPFZ5snK8cqLyXOVU5eXKa5U3Km9XuqvYqllVsipNlanKXpVQlVaVUTWvakGVs6qkqqqqoaqtalFVV1V3VU/V6qp1Vb1Vm6v6qvqrdlXtrdpXdaBqpOpI1fGqU1Wnq85Wna+6WHWlarrqZtWdal41Vy2qVlTrqi3VsdVJ1XOq51bPr86pLqwuq66pbqruqF5cvbR6efXK6jXV66s3Vm+p3la9o3p39UD1UPXB6kPVR6tPVI9Vn6merL5Qfan6avX16lvVd2uYmsgaSY2qxlBjq3HUpNSk12TWZNXk1bhqKmrqalpqOmuW1CyrWVGzqmZtzYaaTTVba7bX7KzZUzNYs79muGa05ljNyZrxmomaczVTNZdrrtXcqLld465la2fVymo1taZae21CbVptRu282gW1ztqS2qrahtq22kW1XbXdtT21q2vX1fbWbq7tq+2v3VW7t3Zf7YHakdojtcdrT9Werj1be772Yu2V2unam7V36nh1XJ2oTlGnq7PUxdYl1c2pm1s3vy6nrrCurK6mrqmuo25x3dK65XUr69bUra/bWLelblvdjrrddQN1Q3UH6w7VHa07UTdWd6Zusu5C3aW6q3XX627V3a1n6iPrJfWqekO9rd5Rn1KfXp9Zn1WfV++qr6ivq2+p76xfUr+sfkX9qvq19RvqN9Vvrd9ev7N+T/1g/f764frR+mP1J+vH6yfqz9VP1V+uv1Z/o/52vbuBbZjVIGvQNJga7A0JDWkNGQ3zGhY0OBtKGqoaGhraGhY1dDV0N/Q0rG5Y19DbsLmhr6G/YVfD3oZ9DQcaRhqONBxvONVwuuFsw/mGiw1XGqYbbjbcaeQ1co2iRkWjrtHSGNuY1DincW7j/MacxsLGssaaxqbGjsbFjUsblzeubFzTuL5xY+OWxm2NOxp3Nw40DjUebDzUeLTxRONY45nGycYLjZcarzZeb7zVeLeJaYpskjSpmgxNtiZHU0pTelNmU1ZTXpOrqaKprqmlqbNpSdOyphVNq5rWNm1o2tS0tWl7086mPU2DTfubhptGm441nWwab5poOtc01XS56VrTjabbTe5mtnlWs6xZ02xqtjcnNKc1ZzTPa17Q7Gwuaa5qbmhua17U3NXc3dzTvLp5XXNv8+bmvub+5l3Ne5v3NR9oHmk+0ny8+VTz6eazzeebLzZfaZ5uvtl8p4XXwrWIWhQtuhZLS2xLUsuclrkt81tyWgpbylpqWppaOloWtyxtWd6ysmVNy/qWjS1bWra17GjZ3TLQMtRysOVQy9GWEy1jLWdaJlsutFxqudpyveVWy91WpjWyVdKqajW02lodrSmt6a2ZrVmtea2u1orWutaW1s7WJa3LWle0rmpd27qhdVPr1tbtrTtb97QOtu5vHW4dbT3WerJ1vHWi9VzrVOvl1mutN1pvt7rb2LZZbbI2TZupzd6W0JbWltE2r21Bm7OtpK2qraGtrW1RW1dbd1tP2+q2dW29bZvb+tr623a17W3b13agbaTtSNvxtlNtp9vOtp1vu9h2pW267WbbnXZeO9cuale069ot7bHtSe1z2ue2z2/PaS9sL2uvaW9q72hf3L60fXn7yvY17evbN7Zvad/WvqN9d/tA+1D7wfZD7UfbT7SPtZ9pn2y/0H6p/Wr79fZb7Xc7mI7IDkmHqsPQYetwdKR0pHdkdmR15HW4Oio66jpaOjo7lnQs61jRsapjbceGjk0dWzu2d+zs2NMx2LG/Y7hjtONYx8mO8Y6JjnMdUx2XO6513Oi43eFeyC6ctVC2ULPQtNC+MGFh2sKMhfMWLljoXFiysGphw8K2hYsWdi3sXtizcPXCdQt7F25e2MfjM6nCDh5fcAqnTOr9LpQ+I+zm8dkv4JR5BpAe/Cv7GMj0AJIFufYDkkUhWylkUrgcn1fjlJnEiGAx/pX7KkguBpm9wieRzBs4ZfYCIodfp0CPHCP8s/hXQY0QeEBuQH0kOOXfAOQD9u/xeTVO+R+AnmLhPyNkp/AJzIPMbXYZQpw45d8GGaHwlwi5iFNGCDJu0NMLetyAdApPoV+P45SvA+Qi+ziSOYFT/kV3EvpVD2W9AGXpsQzvA+HT6NfNOOVBfXg3AfknQG7iXPzLkGs1zsW/7MmFEP4zOCW5BOm4JsJpqFU61FkP/GGckrIYIyC/AcRIyUwQGSjrMeAv4ZRo5j8LyDi09FlAtOx9hHwdp/x6j56FSM8kTj1lnce88FeAnIdcoyCzBqf8UUBOA/IaIKehfyqFixHyQ5wylaCnkvsAId/GKY2wycGI4L0AZBhkhilkEJBBCukFpJdCpgGZ9iMROqwZp16ErqE7G/EZeHQJr8JozCDPBdSwCOrzDIWIQpBAmZ/gp4lr9CP084XLYjoh1z9Arp4wT1wo8ij0z2rI9SiFvEYh4hAZ8Qwyg4AMUkgvIL0UMg3ItA/R4nYJXoF2eUqHvnoFavgotOs4tGsllAUzALMfbPEq6CHIJPTPq6BnMmTe2Al61mC7sC+AddaAzBrQXAGaCbIL/ypsA5ldMA4ZzPPBpnyGIFie3wIphTBfD0GKAxA83p7DqQ/BfdWNUx+C+2o5Tn0IbqMTpz4EtZS/F1ImtIbQ0iJoqQNaUQQyzwEfjVPeTUCINX+BU4Iw6ZDLCpLpoQho5sEILwaEBzI8GAnQUi8i/AGe/XDqQ6hc4fSEIM8Jv4xK/xVOmecIAvaCOn8MMgzIsB+h9UDpoche0HMF9JA3CCDCOAo5NIPMMMgMU8ggIIMU0gtIL4VMAzL9sUgeQhJxyux1n0Q9c1SINHC/hKfjqOcdtwTxbwg1PM87Lug9mMmb4T3IyKEVUdCKsAidC/cP/12w8i4Yz+/C+CHIl0OQABl459bCO/enoOdPIAOS/D+BzJ9gRpLBW/hPRAYQFUGgPs/COPwZjI1nCQJ1fgrqTCPDIUigzDDIDFPIICCDFNILSC+FTIOeaT+C53z2KZj5aZnDtAxV5zdhjOUD8iIg+fBe/gfMRxiFwBME1zbCzP3gY5DtFLLdIzMISINXhlFBWRooS+XpZ/x83YVZwtPzYIs3aFtAj7HBSJDMIMgM+hAYJ4J9YK8pgkCutyFXeATP/PvwjO1B7rC/RkgHTvl3CMLFovr345RGBM+GII/SiPBPWAanPuQdQN6hkMOAHKb02EGznUJcoNnlR+gagk1Ps6+j5zQep8xp6HkG82glgxGYn5kqdgIhr+KUqSII1PkotI4gcwD5VghCy8wTvov1CJ/x66E0J0F90qH0C1A6mcNNoOcu6CGIk5JxzozwPwSkAKf8DwkCeiTQzzRSTCFvh8i8HSLzBtiiGGzhRQ4DctiPgC2KwRYE+S20vQC33Vs6XUOYNwjysL/OzGIW5WJtOGXITmEx1GcaesOL2GFdZ/ch3bgsNhn6eXGoHujn+XgMsHacMvNBZj5ofhc0E6QMZPrZlZjHCO8WjJxenPJuEQR6BvqHRpiiECSWRvDYZjbg1Ieg/mSqcepDDgNymNKD2/gFnPpkUIv4P8CpF6FrCC0Vw5h/DVohhp53gcxlkHmPIFDDJVBDgvwZcv0SJP8cioC9DkPvvQfIYZA5DHregz7xILCW0ODUi9C5wukJRgQCeE73wAgRgHWKwDoPg2QRQXC5bCrp/3AI7nM2Ffq/KFQPWX2FILUwfgwwfmohVy1ozgPNNPJ0CBIgA6U/DaV7kXcAeYdCDgNymNJjB812CjEDYqZymRDyjzhlat238G4Feuxt6DHYufDfB/478Hy9D8hFsGkX68A80RPQ0swZc70PT8oOsDJBboYgAbnAygOg8w845Q+AzADk+gLkohDmbjASKEPp2QKaX4ayuqCsl0HmZciVBbk8CC0DufaxaGch+AZO+fug7QVg90SwewFBqNmGQtBsE/txMmDlZLCyF3kHkHco5DAghyk9dtBjpxAXIC4KwXavB7sXhNS5B9p1HxAdPDv34dlJwjyXB7ZOIgiuLZcnPPPpEFx/hHzLi5A5RHCYzCeAHANkHyDHCAL98yTYgkb2hyABMvCW2Q9vGYK8ChYsBAu+ShDI1Qm5wiLw3imE9w5BPhCO4VUBTomPyIOsppCbM8g8DzLPU0g3IN0U0g5IO4W8DsjrFHINNF/zI7TPCnwOWsxzswDXgsxtqE8r1Oe2Z80WjFydAXkaIU7hbB9C+76mYGbjsNdLGCd8A/MwogARvA/eMIIYhMcQ8qHwV5gHPW4o6wdQlptCzoYgnyTTDUg3hbQD0k4hrwPyOoU8DchsP0L76+ApuAhlnYCywDuHkNcBeZ1CngZkNoUcwrMWTj2IgOyJwKcHbUd78OMI+Sn4JaLhnQvjh///cOrx8gHCWEKQLwUgqHTm63hE+RDsC7Lh1Ie04zc+Tn3I2whJwa2g9Xh9jLjtvA/A57YZpx4v3xS09OsgOYXbxftPj4wE8wSBGjqhhv8Z6pmEXn0bfHo/w7n4b5PSI7JQrqdw6qsPysUcxCOKRrz+TFLDYA9nKIJGHbbgv0KtSM/PmwF5HpDnfYgBRsIR8GoaYIS/gX22bDEglWFkTKD5Amg2gQwgrPETkOcBeZ5CugHpppB2QNop5HVAXqcQNN7YeJx6EXYf9tvgFCGRqG6rYE74MdR8lad/sHXeISMT/KukXe952oUt+BjU9pJ/1PG3hCABPmGw8rPQG1EwqolP+IEQypO82tOrv4Zn55S3XfwngV+LUx6ZkbScGsmocEq8zQH+529CfQjyBOWRJmNjBzUSCPIeILFhZZ4HGWq0wPzzHtjLi7QD0k4hrwPyOoVcA83XKARbMBos6B2HC8EWC71jjP8WICPw3L0FMudx3YS/Eq7iebzoD4h0A9LtRfinqfcXeNo9yGufgHQD0u1DnmPxd1G3cMoHzxv/OcilglwEeWEGBM9jt2AWJf66U9i+gnPCQYSku8t4wX71fpxGQM9HWHxPZaDfGMuIQeY1kPH6n4cxAv4fQPgMluFfhnQmbyrWE+BVIwiWZ6+AZo+/TvgL1KuHYXwSJMBnBbmehVzDkIvyEQk/hFzkKQjw0uBc/D+Bz4oFv7HHAwN6WKzHgwSuAXCuD7gvgU0/8K0TqHccEw0ybpA5CzLeN+PzgDzvRXigh/8WTmd8X/TDbOM/JzIRBDRfwJp9MxL6lR1n1/qQwBGOcxkg13uQi3oKhDzIRVYOIadCaBw+D+PweT8Cel6DdhEk0G+D236H24l7jCvheX07tD/hDZA5DDLFIEN8Dj8Dz1I5eJYAQXtqJMM/h9MZd9C4XQF7IoJgebSzK+H59l/4V6GBfduHBOwmIFcB5EqGXNTqXZjL/taLBK6foRXHoM77oc7e1fJOWD+XeJHANz7MvQfAB/uP8DRdgrIcgMD5LOMAxAYjPEqowjwgD8GZCw/WNg8B8gyXgGqo5yp53nOrb4Ke3dQJ1O/hjCwakN/7y0LvZV9ZaEWNkafAx0hOK7biNxf7K3h/bQWZ34G3eRSn/N+R5x1yPQu5DO4cHj4nwvXZCPUh50TEK/uS3yvLnyX8O5T+AZ7BGkCU8GsUIErIRfyrmX7/qmA95rl+eH7Xgww5ZfiF55QhxzuToNWy75xaoIXZ+CjMpbBWZ4agf05A24cASQGdI1BWihuPT9qvTjzt7/jPzfnvQK5K0PM46Kn0zC0+vzozD+ozAD2fDMiAZ0b6Cp6jcErPSGwH5TcO9feCBQXdIcioH2EiKJtGYIQDb3DkYZxy8DRx38XvhUgeTrmvY0QIp0LC70MdXsMIqgmaeViyhr+Hn24OeiYCTo64x0FPCv6V+zVOhafI2XHwubDnhK7Xf0I3wxlQyJmC4Aqc5lyFk01ynhsSn8AMQK5XqfPKdEAeASTd876g3ynkBKoXSu/1Ivwx2Du87PGZ/xBaegD1z48h/mGE9Bg7hHuMfQbzpD4hpcO5JzdKnXt2Qek/h9I5GAmh52jkvJuhz7u5CejDCR8Sep4LvyJkwv+GhV8fCzjBxL8+iVNfz09D2+nzrwlAJnyIHGSiQIacUsWBTBTIyD32mgZ7UacwIDMMMs96ZgkyVn/mmyXIKfD3qFPgrdA/I9A/W6F/Ijzv5de8ozfgKfgILFgJJxo/hDPokDUJ8XkycG7LvgEye8nzBXZn4cz3T54n9wrMG1dADz5jegaQHwHyDCAhp6XoOcUyK3CK9CAZPllHwZqZv8WjmVpH3buB0lRukofvm9zA88btBETywHsnFOmBVjwGrZghroDIfALChCC2wB5jtCHIo4CIoc7PQp3JqDsOffgqPDueMQ81fAFquMb/FHhP/6E+a+Ak63tw9jeTTEjMAC49aH1om/Hpps/NnVBW4El6f7AFCQKzSi+0ghdOJgBBpQsWw/y5BE4D4bQCIT/B8VG47V6EipjqBj3PQf/8CvpnplPy/gdAbDzv2TEbcJqMn4Ip0Ox9ToMR+ny5DDSHIPx3IVctnA+Gnia/CzL3IwrxDpG75ZP5IGIfRiKa/LloPZ4VNW67DJCZzqD7HwDBbQ9c4e8MQUJlMJIP6/kXYQ+ST61APOfCuCzBP+AaRhjBgp5TYPqkGHpMBa3QQK+qyJoExvPDMJ49Z77Q9rtUS8k5bB99DkvNYzehpSEI8wj2FbCzwDPzCFmZY58eq8Cpbw9L+RNA820Wr1dnCw08b6Qc8QS+R+XSgXeFgR2Qzq9HeI3ymIFfglXA7uYmno35b3s8S9jnA34kvg3qZgBfE6xF0ZrcCK04iXmyqoR9yr/CPsUBs/oLoPl9QF4IbQXsHcJFuL1A/AlQn3rwdg7i1OOFgH0K+wXY3SwCmdDd8UHMox0HRg7CaucMXvlEFMKe/QzU5zTUBzxvaIZMwrf1wKrmHVgFTUANQ/zPHm/hF/1emhk8VJGUx8MQvEMkuz+0Om3HnmShGMmQE1UVRC3eximjgtLHQjyl7ohM2Hfj05/L/t2fb4dIfDvtUJ92L4L2KX5/7zHcYx6PYp7foyg8g1c7EYW4x0j/hPppPX6bXeDxIO36ALyyj4JXlvarP0r51d0g8wOQof3GP/D7jXmgh3Hh1LcXxl6dZL83lfjiULsoXxzoueD31/Efg18/9OtBCP71EqUHPELIOpRHKNiPhPZ6ePy0wPg55l6Acej5f8WpJ1eAN96zksHIR4CQlQw9MvfCWIU9PhpRT/Nm8B4QDzlqF5aZgJFJ2nUabPoa+N5h3017Zfk9UPrXKN/p16As2l/3PEYERXCmMIWfQQGcsQqKwHsJUayCIhhjt1lkX8EBnKK5RRf8nIY+cYCYYZ+7G1Iz6MmBftgOKYl0CvClwBqphIrLLYFepRHiuwhFQs9BKIR/N0RmhlywRgqUsQXagokMRpB1MDLCfYR+/WeceuONwTonwDrkScmEOtNnEwYa8fhkPoI37EdhZLJDEFuIj8gW4mHANbyMff5olsjyzhIB5wVueBOFIEFnAYBw+FT0Czj1IqEyAQheNaXDHlOMZwkSEY0QPK9OYz+kF6GjpklvwJg/gmVmPC/ofwDE5p2j0NtzzPuWQbZ4Gt47s33vnT3wZF3CyIye9v5AhP9dQJ6FXOPgTQ31qz9LPEJcPA/73t/xy3Dfwwj3RT9C64FcWq4cP6fCe7yZPO0LicwnIND2AL/fzhAkWIaD0fIWePlGwMsH3u9Afzj083mw4K+gDz2+birO/AzUZxT6eQ20i8SZj4LvpRf82J7Ic5B5DWQ8nm2w1LuU15qeW14CzYGzTf9MTxO/hktG/C9x6jmJOI9PAVCd+3l+b/w1KL3fV/oHsI9bDfs4MhLmcthPuJb7JhoJ10FPJvZbsjIcjcBkgsxH4M+chPiEjzwI1vNDNs6HHGbxKXkbu47niZNhqnCr2ZXQhyTG7IugWQKaye7maRbvsrsAeZoq6ztUWUcBMQFColWrwAuaxa73aua/zp7F+xH2W5gHZABypeJcPDe8LxZDfeApILFYJI6INeN4JBJZxIMoAv4fAIGn0uOD/SNGiFeWfwn8oqdABvyZAj34TscxIiBfJRSC5lSIdDoMpRPP7dNQZ+KV/RfcY8I03GPMvwCih/5RQ2+AHv4taEURtP0W+OtCY1dIPMk8kCERJmcB2QMI+T5lHyCeCBOoTwOU1QtlNUDpTqhzMtTZ6VkV4JZ+CC0NF/kwAkgCIOBH4v8ekKcomTEWj97HWTz3jmGEs+O4iIg3IK7DDsgg5iPLABnECBoVuD63IZUBMo59JsKvwnr1W7DKBXtxj0P/g0+YWy5Eu6EIDrx2Fig9JM7TEwW30B8FN0N8VEh0jaAFR8gI4yFOhuwCQmMCu6lcnjEGpZ+C0v9Mygrw4UNMF0Tg5JE4K1g5kOiRxzzRIzvwjZXYUhFv4F7lJKTH8K4qsgz8dYOkPsGlk9hCoZuKLXwISv8CHof8++7v8maITPP02JKAyNjgiNbQaMy3gyMtPf1cEBB/iGOKMv1xgzNGr9kB8cWYzRDl9T6UtQPKen9me5EoJk80JjnR2EKNVeLFgkhLVkVFWhZB/8yH57QI9w//InsC5foJTklkWsBTcAJk7kBsTwfE9oSeAX3osTLYHWJBSbuOQbTqfohWJc/XHSGOqoqGtegd8M5VCR1I5jLMElWwOg2NUXxZqEUyL0Oul0FmB0TzymA2biOa6XMrWIsyUOc1UB/iO6XjjUXw3gmIQAbEArkuQC6Ph4qOEyYeKgpRhSDpodHF8F6me+ztMMjbUHqqP3aXWU9Fr3nGPPSzHWo43/8UeCNsoT7zIQpOBVFwM8mExOXCyjPwPM4209NNx6YyYnhThyKBcacYeQlGggZGwuEwMoEIXnkKcLnC3RAXB5GoAgFuu3APbrsXoaNVoe1F0D8PQ//MFHfa/wCIzfdU/ph+KsE63wHrEOSjEISKxiQnvDMgA0J4x0Gu0EjLAZA5AR7OL3Bz/TLcZUD6/AitB3K9DPXpAmSmaMz+B0DwqpI+UZ3nXsoLPmMNlgGEfx+iMfVwfgrxkIERkuCvS8I15PLAgp5YRypm0ubZy+BWHIZWePc7ePV1GtbhnuhHkNkHMmRuGQF7xYG9RkLmsTHQHPB+J08K1FAFq4L5nj7EZX0DynqZ1BDHhaI63/bWGe0LXDCz3fbPbFwuvEFyfTPkVdjLDMNu4iq1A/JEDfkR4q8L2DO+QPkGn4dIwnzWiHlA3gTknwB5876S59n5sjbKd2EAZD/ZC1N+id9Cfe4Bci8EARm2B+ozC5BXQKYeZF6hkPyPQxgz6LGAHjPI2GD38S+Q2jxxg497a+iNCQz5zreCxfEbcpwyFaBnHEfECeAbWP44eCqusJ2wiuvEvGed2Qnr+U7M+3sjaP9OIVAfG+zET0IKftGg6L6BQIS/gJL5BhUB+CT4V02wj34SkH5AUgHpJ7mA/4E/To+B76ZZnRBHvOwE385DWCcXCXs3iBAIREAmcN+dzQveQYci2PeVCBo+gr1eIvRGgNcRyrLh1azwpzgV2DzreVxWF4vj3sl6/ofg694MffhDsMWfQOcy6JPHoO3/Bm1fBu31ICCzichALnq3fjYY4ZsBKYAxMIBTHpkBCPJ5nHr8NmPg5euEfeWYB8Ej4QUYGwQJ9X25wKO+CCLljsNIWAbItwH5PURR7ocd5QSk8KUt/yrsNFlAWI9nexbK9T2cktVX4PfdMA6rwNedDD3g3TPiW7GbYUf8RUCSwDrXQSbJM+YXwu4GxjzIkN36euqr8LeEK2Dnu4Ln3fUPQK6/h1zkfRHq5aOR/7j/sBfxeEopGUEzhYSclnqQx6HfIslaFJC5IHMKEBIR3UpuA4De2AhnxwNwdrzRM2fisfcaq/XNmWQmMcKog5kEzQn4rOT3+KyEzAlMDLQUnkQmxvPEYZ9MNjzLOnIOAiOhAEbC24AchlyzBaM8747e4J+RGMODtpT9DZbnmsCOa2HXBnMLtwKQN7AeFnzI3CpAPrpfgDT04FHB7mJfxjw8cRo438kCzbshOv0dLCPMBZl38DzPfhH/KlwpXIl5kHHCM9gMzy/5Qm0akBqw7LRnlYJPzeA81OvfgHOrw+RE3tN2XLoQayZtD0X40MOCJyEmmfjeR+F8gQ9lgUdIkAH+ZxnUh8wbn4Px8xrIfM4zwrHkizhlkgGxg8w5kIH9MpPCNsOs3ox5qPMbIPMQjMM3APk5+1Ww6VcxHzpjux/BszSJfwOEvJdPQit+AvhJQMhIkFIjAc6bhHDexMB50wxz5jwW/w+H9awe86Dnd9CunTB6SbxEDYutv1bwIeYJIvgDQr4p6PchfWw+Qq4K8J6lD/owCz8j3I/geYGbPfgH2UWIX4hTcv7liRI0+mdsxsT8ECM49ZwyTECPbYQemwDk94A8CcjvPQix6UIf8gI1i5KTvkdg1hJD2x/x7IlYaDvL8+6S3se88DVAYCUsSMd7PWEjTtG7CfUAH97Rgv+CZxB2N4IIzHMawMkJy4+hdBeU/mNAloMVLgKy3LPP9c/h5Km8wuLz7g6ckjUAfwj0qCHXkGfH2gnvQV/pTALI3AT9CTP3GPN9aPt/QNu/D0gZyByAXFBn5muwZvsjvOm+BghZj/3Gf6LBfx7mDRvMJCtI/8CTkkDdNJIDNs2C1uUA0gVIOyBdsEb6PcgvhbY/BZrPA5JBIfCOE8ylzmG/Am+icXgTveR/Fwj01BnrRTyeBWM4RasvtE7grxOi8cb8Bqf8dR6ZzyGZb0Oui7ACseF4ck4PETUl1Epviqz0QpAWaiX8jj9+nnkc+nkh9DNEpjGdgLgA6QQk4HTJ/02N7wwIv5cDbo8h68zgVSV9VkLuWAj9buJTrKyoVswU4R+w3sBIDdTwO1BDW2i8OiABd7wAEvjuDjl9o+rzHlVDTrjN90Yj/RP6/c45QIrxG9aDeNfzfiQkV+i3MCiX/4unVwCBNQDzMqyj7ntqSJ9fYJlfwDg0Qbt+EfpNDdqRffb/gfxf+/9AtEw0Y+fxGAcTz2OYZCaFxzJzmHQex8xlPs/7HDOf+RIvislmcnhixskU8KRMMVPCkzPVTA1PyTQyTTw1M86M87SCpwSreDphlbCaZxCuEX6TZxK+KXyTZ5FES6J5VkmMpIJnk1RL2nllkk5JL69Z0ic5xlsn+bXkQ94rkj9K/oxG1L/xeII1iNYj2ohoC6JtiHYg2o0I7QoFQ+jvQUSHEB1FdALRGKIziCYRXUB0CdFVRNcR3UJ0l4cahSgSkQSRisewBkQ2xDsQpSA+HVEm4rMQ5SFyIapAVIeoBVEnoiWIliFagWgVD8f/89gNiDYh2opoO6KdiPYgXYPo735Ew4hGER1DdBLROKIJROcQTSG6jOgaohuIbiNy83hCFtEsRDJEGh4jNCGy4xgbfMaD+AxE8xAtQOREVIKoClEDojZEixB1IepG1INoNaJ1iHoRbUbUhwg968JdiPYi2ofoACprBNERRMcRnUJ0GtFZ9Nt5RBcRXUH/nkZ0E9EdHo9D0wSHEk7EYzgFIh3iLYhiESUhmoNoLqL56LccRIWIyhDVIKwJEY7+wzHASxG2HNFKhCH7c8j+HLI/h+zPIftzyP4csj83gAjZn0P255D9OWR/DtmfQ/bnkP05ZH8O2Z9D9ueQ/Tlkfw7Zn0P2j0D2j0D2j0D2j1AhMiBC9o9A9o9IQZSOCNk/Atk/Atk/Atk/Atk/Atk/Atk/Atk/Atk/Atk/Atk/Atk/Atk/YgOPiUD2j0D2j9iOeGT/iD2IkP0jkP0jkP0jkP0jkP0jkP0jkP0jkP0jkP0jkP0jkP0jkP0jkP0jkP0jkP0jkf0jkf0jkf0jNYhMiNAzGpmAKA1RBqJ5iBYgciIqQVSFqAFRG6JFiLoQdSNC9o9cjf6uQ9SLaDOiPkT9iHYh2otoH6IDPL67mc1FaRPeI7qjgJ8F/EPAPxTM89YLfoP4h9lClGbg3TD6tRN+/T7wm1CaLnwF+ELgiYaHgK+AvLNRmgZ4Bn6bIT04bzqU0sI+jFNhM5a8/5I3RaNvlS8V3P8XwNG+za3COwC3Svg1lB4ADS/gWt0D/t5hqOE6wL8K/MPAP+zhSSue/ET+YcJDiV5kFaXtCeBzvJL3/p1NRumUp+1+bYR/yKM5GeSboR9yfTI0/xCUSNIy/D8tuctwZIQ7/f6Pg371pomQ9voQUuc5ATIvUeluX/rw/VXAk1QH6bOA/5jSMOTXw34B2vIVn+3S8S1QgSPHo2HInxfN2FgyEiR50A8vUaPlcZ/+9Pv7qB4uBl4K/KNUT36dkv9XX/owpBkgn4Hl772FR9q9t4Q7g3rM29tC0D8X9C/G7QV+DvDp7DzAu4CfC+Uu9vHpITyt52HImw55Hw7QQ+N++c+z2L6fF34V2jgPysL8w3j/iuRXBPNkNMJz97Bw9L/Jp9+fDBqBpCfTPWP+BWqc//f53Bl573zygr9unjbS8ptmTGezA8APBPGevJ40x5c+5BljmZBW8XxPuqesRUH859G7HVsHyczeMnsZj5l9iidibkWdi5qKuhx1LepG1O0ot4gVzRLJRBqRSWQXJYjSRBmieaIFIqeoRFQlahC1iRaJukTdoh7RatE6Ua9os6hP1C/aJdor2ic6IBoRHREdF50SnRadFZ0XXRRdEU2LboruiHliTiwSK8Q6sUUcK04SzxHPFc8X54gLxWXiGnGTuEO8WLxUvFy8UrxGvF68UbxFvE28Q7xbPCAeEh8UHxIfFZ8Qj4nPiCfFF8SXxFfF18W3xHcljCRSIpGoJAaJTeKQpEjSJZmSLEmexCWpkNRJWtCqbYlkmWSFZJVkrWSDZJNkq2S7ZKdkj2RQsl8yLBmVHJOclIxLJiTnJFOSy5JrkhuS2xK3lJXOksqkGqlJapcmSNOkGdJ50gVSp7REWiVtkLZJF0m7pN3SHulq6Tppr3SztE/aL90l3SvdJz0gHZEekR6XnpKelp6VnpdelF6RTktvSu/IeDJOJpIpZDqZRRYrS5LNkc2VzZflyAplZbIaWZOsQ7ZYtlS2XLZStka2XrZRtkW2TbZDtls2IBuSHZQdkh2VnZCNyc7IJmUXZJdkV2XXZbdkd+WMPFIukavkBrlN7pCnyNPlmfIseZ7cJa+Q18lb5J3yJfJl8hXyVfK18g3yTfKt8u3ynfI98kH5fvmwfFR+TH5SPi6fkJ+TT8kvy6/Jb8hvy90KVjFLIVNoFCaFXZGgSFNkKOYpFiicihJFlaJB0aZYpOhSdCt6FKsV6xS9is2KPkW/Ypdir2Kf4oBiRHFEcVxxSnFacVZxXnFRcUUxrbipuKPkKTmlSKlQ6pQWZawySTlHOVc5X5mjLFSWKWuUTcoO5WLlUuVy5UrlGuV65UblFuU25Q7lbuWAckh5UHlIeVR5QjmmPKOcVF5QXlJeVV5X3lLeVTGqSJVEpVIZVDaVQ5WiSldlqrJUeSqXqkJVp2pRdaqWqJapVqhWqdaqNqg2qbaqtqt2qvaoBlX7VcOqUdUx1UnVuGpCdU41pbqsuqa6obqtcqtZ9Sy1TK1Rm9R2dYI6TZ2hnqdeoHaqS9RV6gZ1m3qRukvdre5Rr1avU/eqN6v71P3qXeq96n3qA+oR9RH1cfUp9Wn1WfV59UX1FfW0+qb6joan4TQijUKj01g0sZokzRzNXM18TY6mUFOmqdE0aTo0izVLNcs1KzVrNOs1GzVbNNs0OzS7NQOaIc1BzSHNUc0JzZjmjGZSc0FzSXNVc11zS3NXy2gjtRKtSmvQ2rQObYo2XZupzdLmaV3aCm2dtkXbqV2iXaZdoV2lXavdoN2k3ardrt2p3aMd1O7XDmtHtce0J7Xj2gntOe2U9rL2mvaG9rbWrWN1s3QynUZn0tl1Cbo0XYZunm6Bzqkr0VXpGnRtukW6Ll23rke3WrdO16vbrOvT9et26fbq9ukO6EZ0R3THdad0p3Vnded1F3VXdNO6m7o7ep6e04v0Cr1Ob9HH6pP0c/Rz9fP1OfpCfZm+Rt+k79Av1i/VL9ev1K/Rr9dv1G/Rb9Pv0O/WD+iH9Af1h/RH9Sf0Y/oz+kn9Bf0l/VX9df0t/V0DY4g0SAwqg8FgMzgMKYZ0Q6Yhy5BncBkqDHWGFkOnYYlhmWGFYZVhrWGDYZNhq2G7Yadhj2HQsN8wbBg1HDOcNIwbJgznDFOGy4ZrhhuG2wa3kTXOMsqMGqPJaDcmGNOMGcZ5xgVGp7HEWGVsMLYZFxm7jN3GHuNq4zpjr3Gzsc/Yb9xl3GvcZzxgHDEeMR43njKeNp41njdeNF4xThtvGu+YeCbOJDIpTDqTxRRrSjLNMc01zTflmApNZaYaU5Opw7TYtNS03LTStMa03rTRtMW0zbTDtNs0YBoyHTQdMh01nTCNmc6YJk0XTJdMV03XTbdMd82MOdIsMavMBrPN7DCnmNPNmeYsc57ZZa4w15lbzJ3mJeZl5hXmVea15g3mTeat5u3mneY95kHzfvOwedR8zHzSPG6eMJ8zT5kvm6+Zb5hvm90W1jLLIrNoLCaL3ZJgSbNkWOZZFliclhJLlaXB0mZZZOmydFt6LKst6yy9ls2WPku/ZZdlr2Wf5YBlxHLEctxyynLactZy3nLRcsUybblpuWPlWTmryKqw6qwWa6w1yTrHOtc635pjLbSWWWusTdYO62LrUuty60rrGut660brFus26w7rbuuAdch60HrIetR6wjpmPWOdtF6wXrJetV633rLetTG2SJvEprIZbDabw5ZiS7dl2rJseTaXrcJWZ2uxddqW2JbZVthW2dbaNtg22bbattt22vbYBm37bcO2Udsx20nbuG3Cds42Zbtsu2a7Ybttc0ez0bOiZdGaaFO0PTohOi06I3pe9IJoZ3RJdFV0Q3Rb9KLoruju6J7o1dHronujN0f3RfdH74reG70v+kD0SPSR6OPRp6JPR5+NPh99MfpK9HT0zeg7dp6ds4vsCrvObrHH2pPsc+xz7fPtOfZCe5m9xt5k77Avti+1L7evtK+xr7dvtG+xb7PvsO+2D9iH7Afth+xH7SfsY/Yz9kn7Bfsl+1X7dfst+90YJiYyRhKjijHE2GIcMSkx6TGZMVkxeTGumIqYupiWmM6YJTHLYlbErIpZG7MhZlPM1pjtMTtj9sQMxuyPGY4ZjTkWczJmPGYi5lzMVMzlmGsxN2Jux7hj2dhZsbJYTawp1h6bEJsWmxE7L3ZBrDO2JLYqtiG2LXZRbFdsd2xP7OrYdbG9sZtj+2L7Y3fF7o3dF3sgdiT2SOzx2FOxp2PPxp6PvRh7JXY69mbsnTheHBcnilPE6eIscbFxSXFz4ubGzY/LiSuMK4uriWuK64hbHLc0bnncyrg1cevjNsZtidsWtyNud9xA3FDcwbhDcUfjTsSNxZ2Jm4y7EHcp7mrc9bhbcXcdjCPSIXGoHAaHzeFwpDjSHZmOLEeew+WocNQ5WhydjiWOZY4VjlWOtY4Njk2OrY7tjp2OPY5Bx37HsGPUccxx0jHumHCcc0w5LjuuOW44bjvc8Wz8rHhZvCbeFG+PT4hPi8+Inxe/IN4ZXxJfFd8Q3xa/KL4rvju+J351/Lr43vjN8X3x/fG74vfG74s/ED8SfyT+ePyp+NPxZ+PPx1+MvxI/HX8z/k4CL4FLECUoEnQJloTYhKSEOQlzE+Yn5CQUJpQl1CQ0JXQkLE5YmrA8YWXCmoT1CRsTtiRsS9iRsDthIGEo4WDCoYSjCScSxhLOJEwmXEi4lHA14XrCrYS7iUxiZKIkUZVoSLQlOhJTEtMTMxOzEvMSXYkViXWJLYmdiUsSlyWuSFyVuDZxQ+KmxK2J2xN3Ju5JHEzcnzicOJp4LPFk4njiROK5xKnEy4nXEm8k3k50J7FJs5JkSZokU5I9KSEpLSkjaV7SgiRnUklSVVJDUlvSoqSupO6knqTVSeuSepM2J/Ul9SftStqbtC/pQNJI0pGk40mnkk4nnU06n3Qx6UrSdNLNpDvJvGQuWZSsSNYlW5Jjk5OS5yTPTZ6fnJNcmFyWXJPclNyRvDh5afLy5JXJa5LXJ29M3pK8LXlH8u7kgeSh5IPJh5KPJp9IHks+kzyZfCH5UvLV5OvJt5LvpjApkSmSFFWKIcWW4khJSUlPyUzJSslLcaVUpNSltKR0pixJWZayImVVytqUDSmbUrambE/ZmbInZTBlf8pwymjKsZSTKeMpEynnUqZSLqdcS7mRcjvFncqmzkqVpWpSTan21ITUtNSM1HmpC1KdqSWpVakNqW2pi1K7UrtTe1JXp65L7U3dnNqX2p+6K3Vv6r7UA6kjqUdSj6eeSj2dejb1fOrF1Cup06k3U++k8dK4NFGaIk2XZkmLTUtKm5M2N21+Wk5aYVpZWk1aU1pH2uK0pWnL01amrUlbn7YxbUvatrQdabvTBtKG0g6mHUo7mnYibSztTNpk2oW0S2lX066n3Uq7O5uZHTlbMls12zDbNtsxO2V2+uzM2Vmz82a7ZlfMrpvdgr/2YkZxCv/X8eeZSziFuwRd+DsFfhsP30ayMgLHJCiBP4/3J7z77qe8vBfn/sHHD3JXAuX5Sve/gcxhSv4rFN9F8T8HPh3KjfXx54Vvgp71fp7g3Ks+fjCCCZG/SpVL5Lsp/gkvz0yxaBcteMb9GPA3EV+G7wFgpoRP+XmQ8eLfo/iOIJln3ApKjxRkloXISACvnBn38Mt8dfDWDfB7t336PTze4SOZr/lknnDnAS4I0u/FTV6dvPNsG07dTui3PTi9/z3oH7GfJzKEF16l+HvBMm6O0iMHPUyITCTI/C4EF1H8In8dSN0Ifu+WX7+HfxVk6qi8nYC3h+j/JuD7/ToFI8B/BWSmqHZ9388TGQ++guK/HSzj1lN6zCCzKUTGCPjfh+BWiv+2vw6kbh78c379Hv6PwD9FyTwD+H+E6N8KOud5dTJTgj/BGKiGsfHvME6egbHxmJ8HGS+eQ/G1QTLPYFt49bjvgUxTiAwZq18Kwe9S9Wnx1cFTN4/MZZ9+L38DZL7sk3nCnQn420H6PTj2ynl0sux3UPrFe1XBPH7WfPzv/DyXPrM8zXNRnyyD9fOve/glnywfkPdKGNyvx4F9akwfjpfw8ngMMA5hIcX3UvwpP+/Je5/im0HmRyEyrRS/0K+f4MLPh8gXU/xqP39vCuR/HiK/xa/H0xYnyMyieFL/Oop/juInKZ1E3uDn3T0g80qwjHslxa/26ye4MD9EfjHFf9/P3/svkH89RP4nlJ5ZYMefge2eDOaFGyj+hp/nHp1ZnuY53SfLYP38mx7+a58sH5D3P8PgPj38DBZ/wbf7/iDmIaLbw3Odfh5k3nNfo/hyn4yHF14Mkt/tzgeZ5yid36X4p318N9zQElDuvT9Teir95d7DLZIK8VeZk/eP8/BtLck+Xsq94Oc9Mgo/D/OPRwb4VOHdQHlG6n4SdP6U0v8ixf+Q4hOocn8GeRMoPd+k+BiUtrLovc8fcf8DjKtqij9G8ct8vEf+3odU3h4f77rXG4Q78JzvyavA86GPP/xx+j0y71D8L/3y3MIQeZhnuEgf/qigEvhkeHY2UvyfKf5FH++RvzdG5VX6eNe9kiDcwT7lyxuJ10IeXoHXVOH1E1woouRvUfj2EPlHAH/Uh7OCl1G63J3xv8j3sfhW6l/DvNQnrPHzLL4t5NfuVX4ZvCbxygTwICNMofTkUfxpirdR+vf6eXzOivhvgMwjfp79kV8/kfGU+0gIT+ogpvTEUfwrFM+n9H/bx7OCJugT1f8qT+zyyH+PFzAsjgruvr8Y+JsUD7gbfz/FwFdUATLulymZqhA9N8Lo+UWwTLCe/6l2sXoWrdUFX7q/Gr4MWkXxd2bCmV+zo/iJ84y9DX6e42bEQZ7/oR/38liexon8p60PPwHWZuw9PBskcBqKHwmDMxQ/RPGDfp7S6WJ/6K0n3wVzrIfHd/IE4u5NwA9RMnKKF/t5otP9EEqfxs8gfwTwp+F95+X/MRh3fwP4JAr/DsU/4+eJTvjmaxubAm3BHoBtwlSKPxkGd1D8YYr/lZ/362RewtH+aC/Q+bfl+Up4lz0N7VXiKKdA3v2iX8bDbwuRcQG+LgR/leIz/XlBT0Cfs88H8+4+vwzhOX2IzBcAF4bgeyg+3p8X60Ftj4e25/9tef6beB+N5gq8snqT3eXnhWsp/gOKx/Jn70GfC/9rZhtxIor/J0rmv6h+XjZzPwu/6ec5KYUv8/X5m3icoPrg27reFLzt59mf+nn4PsWLY/kP7+G5cTv7Pk7v47XZQuEtP89l+3gi85ZbHiTjxfEblvXs5dt9/BMgH4o/CP/Evft/eV7st/Hx0kAZ1IcWyhb/7Ocjkn08kRlx60Dm/RD8/4XBdUH6P01ZXEjeoRl5ZURHED7i/hbFa0BmjJLBFv+QqsOHVB0+pGWo9gbi/y8MrgvS/2nK4kLyDs3Ik/YG4FR7P6TaS96tU+xbOL2PfT4v4b2el+fSfDzICLTYZxgg48X7YcxkwZhp9PFPgHwo/iD8E+DL+gvzukspnguSSWJ3oBXCEVgbKFk0owp+TPqN3e3lA2Ta2QiEfBH/P0Gfhsf7uHAyvPNcBC7R4+NtovhqPx9hpnCQdz8akpfiYY/vxZspvobSaQmWx2vFwLx+nt+OfXeozpWfjr/7/sfI/IjFXvRv4nMB/o+EP/XzNI7XRR6+A+flj0N9OnCUnpcnuPvngP+Bwk8A/1XA7X6e4Ng/j/CjXpyRC8ahrP/AvDDZzwfgz3l59F7A39Z98b7Ez2PfKXpHPEXhrwTLuAuBnwjJex3z3Dco/HUv7/Wre+zyKnVGQONXg2WIzz/Az0/557nllPwdyj//x2De45OncNr37sHNwX512h/OCai8X/PyqK8qoE8i/Py9OZgXfJnCfxkisxz4iyF4AvTb9yn83708s5C9gJ5r7j6+n+Qt9idenr9N8BKWvD+KEXxDsgd/Gp/XeNYMH7LjXt7Tny+66zFO/Coema/jXNi/FMC7BLDaxz5MJF/pwxPw2QF/G84r+AmbjtMQ/CK8fwHn/RF/AcTvvr8F81zqzDwtg+MUCc/fxim9OhHf5uPfBH8ItB311TEfT9UB1Zm8H9dDu3L8vGftSvjxmWUC5Fv9PCei8N/NLIP3VjPpFz5F8ZMU/96M5bYLLuCZ3/13IEPWfkKQYfy8sMjLMw7hd2eWCZA3UfwYxb84swx7ncLrKJ7W+X2K75+x3HYW9qRuPJOPsPAWcD8OYxL+dwY3vjX0RfyV8Uw8joknPMlL87xlMH+62C0zydB6EN4D5Wb5+BfdXwf9ZqosS5D+F93DKH0W15OURXR6eO8c9SX/maBnrmj3z1fknNEzd4n9PH0e6tFD5J8Ng7cH5yXnpAHz5DlK/rfB8veW+OvpkaHmVc8cON9/xuepw3/450PPuSE5u/9+8LlhwFkhkcmcGad10ueeAeebiyg9jwXL3/uuv54enb55m/8hg9+nbfdGwHZ4D/XhPdzqFwVHKH6rn4dvToH35KV43jKsh+9iPppJhtZJlxtQhxfxlwC+suaFyP/cW09SFtL5I1+59Jj/kPnQl3eb4HHY3+E9zja21ce3M9vgWcN8ogDfezPukXmakvfxqA/fp8bDJYpfSvX/476+fUpwy6eT5pUCfM6y9f4b0FeXcHqfnJk2+2MPPDyJT/DFSCD9H/H8a4OP/OOZxX6e5Z5nai3P90738OR9/UuvDNJf4D/zJbwnzmHKd57r4CQ8/7mDk+f1qwf4XigfC+X3CPQbUL4C2ldD+08C9+ZPzbwu8q9PAtYPNfAtsGee4WIou+zzj3O8JodxwvCE8ifkT/B48hVytMZRLFHP5zE6gU7AvKv/pf48M4kkPqf4nELM4ymkikSeUDFHkcuzKVyKv+Nl6IS6z/GqdFG6OF69LkX3KG+5LlvXxtug/y+DhreHh78oZBBFIpIgUiEyILIhciBKQYTXAZnobxaiPMS70N8KRKjGghb0txPREkTLEOF7QrB/cy3iNyDahGgrou2IsA32oL+DiLCfdBj9HUV0DNFJROOIJhCheU4whf5eRnQNEfYh30Z/3Twe3AwwC99piHgNIvy/pdrR3wREaE/IZqC/8xAtQLwTfzWO+CpEDYhvQ38XIcL3auCbf3oQvxrROkS9iDYj6kPUj2gXor2I9iE6gGgE0RFExxGdQnQa0VlE55Ee9GywVxA/jegmojs8npCHiEMkQqRApEOE3j/CWPQ3CRFaUQrnor/zEaF1gbAQ/S1DVIOoCRH+/2Dw/7iylIf/Fx+ecCWiNYjWI9qI8C3o7zZEO/AdZujvAKIhRAcRHUKE7CpEewq0DuAJzyCaRITWHGgO4KE1OU+I3v3Y9yO8y+NxyP54jKNnh8ch++N9PIfszyH7cyn4vmdEyP4csj+H7M8h+3PI/hyyP4d22hyyP4fszyH7cysQrUKE7M8h+3PI/hyyP4fsz+1EhOzPIftz+xEh+3PI/hyyP3cS6UHrKQ7ZnzuHCNmfQ/bnkP05ZH8O2Z9D9o9gEc1ChOwfgewfYUKE7B+B7B+RhgjZPwLZP2IBImT/CGT/CGT/iAZEyP4RyP4RXYi6ESH7R6AVMDLVHSrdBulJig+X/vQvQkJ//XiZUD2LQpBNQfLp4fLyyx+gtn9Zuz5t3k9utRSn9/8YLImQYF4VJiUy/wrp7wMsS9v3/1+2Dk7D2pq37v+8rT8+vfMAMucfQObT6jwSiKQeSF3DY1Kv8UTMu1FtUYuiuqK6o3qiVketi+qN2hzVF9UftStqb9S+qANRI1FHoo5HnYo6HXU26nzUxagrUdNRN6PuiHgiTiQSKUQ6kUUUK0oSzRHNFc0X5YgKRWWiGlGTqEO0WLRUtFy0UrRGtF60UbRFtE20Q7RbNCAaEh0UHRIdFZ0QjYnOiCZFF0SXRFdF10W3RHfFjDhSLBGrxAaxTewQp4jTxZniLHGe2CWuENeJW8Sd4iXiZeIV4lXiteIN4k3ireLt4p3iPeJB8X7xsHhUfEx8UjwunhCfE0+JL4uviW+Ib4vdElYySyKTaCQmiV2SIEmTZEjmSRZInJISSZWkQdImWSTpknRLeiSrJeskvZLNkj5Jv2SXZK9kn+SAZERyRHJcckpyWnJWcl5yUXJFMi25Kbkj5Uk5qUiqkOqkFmmsNEk6RzpXOl+aIy2UlklrpE3SDuli6VLpculK6RrpeulG6RbpNukO6W7pgHRIelB6SHpUekI6Jj0jnZRekF6SXpVel96S3pUxskiZRKaSGWQ2mUOWIkuXZcqyZHkyl6xCVidrkXXKlsiWyVbIVsnWyjbINsm2yrbLdsr2yAZl+2XDslHZMdlJ2bhsQnZONiW7LLsmuyG7LXPLWfksuUyukZvkdnmCPE2eIZ8nXyB3ykvkVfIGeZt8kbxL3i3vka+Wr5P3yjfL++T98l3yvfJ98gPyEfkR+XH5Kflp+Vn5eflF+RX5tPym/I6Cp+AUIoVCoVNYFLGKJLT+m6uYr8hRFCrKFDWKJkWHYrFiqWK5YqVijWK9YqNii2KbYodit2JAMaQ4qDikOKo4oRhTnFFMKi4oLimuKq4rbinuKhllpFKiVCkNSpvSoUxRpiszlVnKPKVLWaGsU7YoO5VLlMuUK5SrlGuVG5SblFuV25U7lXuUg8r9ymHlqPKY8qRyXDmhPKecUl5WXlPeUN5WulWsapZKptKoTCq7KkGVpspQzVMtUDlVJaoqVYOqTbVI1aXqVvWoVqvWqXpVm1V9qn7VLtVe1T7VAdWI6ojquOqU6rTqrOq86qLqimpadVN1R81Tc2qRWqHWqS3qWHWSeo56rnq+OkddqC5T16ib1B3qxeql6uXqleo16vXqjeot6m3qHerd6gH1kPqg+pD6qPqEekx9Rj2pvqC+pL6qvq6+pb6rYTSRGolGpTFobBqHJkWTrsnUZGnyNC5NhaZO06Lp1CzRLNOs0KzSrNVs0GzSbNVs1+zU7NEMavZrhjWjmmOak5pxzYTmnGZKc1lzTXNDc1vj1rLaWVqZVqM1ae3aBG2aNkM7T7tA69SWaKu0Ddo27SJtl7Zb26NdrV2n7dVu1vZp+7W7tHu1+7QHtCPaI9rj2lPa09qz2vPai9or2mntTe0dHU/H6UQ6hU6ns+hidUm6Obq5uvm6HF2hrkxXo2vSdegW65bqlutW6tbo1us26rbotul26HbrBnRDuoO6Q7qjuhO6Md0Z3aTugu6S7qruuu6W7q6e0UfqJXqV3qC36R36FH26PlOfpc/Tu/QV+jp9i75Tv0S/TL9Cv0q/Vr9Bv0m/Vb9dv1O/Rz+o368f1o/qj+lP6sf1E/pz+in9Zf01/Q39bb3bwBpmGWQGjcFksBsSDGmGDMM8wwKD01BiqDI0GNoMiwxdhm5Dj2G1YZ2h17DZ0GfoN+wy7DXsMxwwjBiOGI4bThlOG84azhsuGq4Ypg03DXeMPCNnFBkVRp3RYow1JhnnGOca5xtzjIXGMmONscnYYVxsXGpcblxpXGNcb9xo3GLcZtxh3G0cMA4ZDxoPGY8aTxjHjGeMk8YLxkvGq8brxlvGuybGFGmSmFQmg8lmcphSTOmmTFOWKc/kMlWY6kwtpk7TEtMy0wrTKtNa0wbTJtNW03bTTtMe06Bpv2nYNGo6ZjppGjdNmM6ZpkyXTddMN0y3TW4za55llpk1ZpPZbk4wp5kzzPPMC8xOc4m5ytxgbjMvMneZu8095tXmdeZe82Zzn7nfvMu817zPfMA8Yj5iPm4+ZT5tPms+b75ovmKeNt8037HwLJxFZFFYdBaLJdaSZJljmWuZb8mxFFrKLDWWJkuHZbFlqWW5ZaVljWW9ZaNli2WbZYdlt2XAMmQ5aDlkOWo5YRmznLFMWi5YLlmuWq5bblnuWhlrpFViVVkNVpvVYU2xplszrVnWPKvLWmGts7ZYO61LrMusK6yrrGutG6ybrFut2607rXusg9b91mHrqPWY9aR13DphPWedsl62XrPesN62um2sbZZNZtPYTDa7LcGWZsuwzbMtsDltJbYqW4OtzbbI1mXrtvXYVtvW2Xptm219tn7bLtte2z7bAduI7YjtuO2U7bTtrO287aLtim3adtN2J5oXzUWLohXRumhLdGx0UvSc6LnR86Nzoguj/7/2rj6mqvOMH+4XzDCKFCkgtZ7vz2udc6BGDaGOEGaso5YYI84QZowfZ8QwIk4McWCtc06toWqsc1aMYc5aYhkzjFhrjDXWOmONQWqcoxadQ+ecc46Lu+/HOec55567YP9bwh9ef3n4vc95nvfe99z3vs/7e888dgG7iF3KLmNXsWvYtewGtpndwm5nW9l97EH2CHuMPcGeZE+xZ9kL7GX2GnuD7Wfvsg/Yx+wQF+DSuAwum8vnJnISZ3BTuGncbG4OV87N5yq5xVw1t5wzuTpuHdfEbeK2cju53dx+7hDXzh3nOrlu7jR3jrvIXeF6uZvcbe4e95B7wg3zIX4Mn8nn8AU8xyv8JH4qP4Mv5kv5uXwFv5BfwtfwK/havp5fz2/kN/Pb+F38Xv4Af5g/ynfwXXwPf4Y/z1/ir/J9/C1+gB/kH/FPBUaICOlClpArTBAEQRMmC4XCTKFEKBPmCQuERcJSYZmwSlgjrBU2CM3CFmG70CrsEw4KR4RjwgnhpHBKOCtcEC4L14QbQr9wV3ggPBaGxICYJmaI2WK+OFGUREOcIk4TZ4tzxHJxvlgpLharxeWiKdaJ68QmcZO4Vdwp7hb3i4fEdvG42Cl2i6fFc+JF8YrYK94Ub4v3xIfiE3FYCkljpEwpRyqQOEmRJklTpRlSsVQqzZUqpIXSEqlGWiHVSvXSemmjtFnaJu2S9koHpMPSUalD6pJ6pDPSeemSdFXqk25JA9Kg9Eh6KjNyRE6Xs+RceYIsyJo8WS6UZ8olcpk8T14gL5KXysvkVfIaea28QW6Wt8jb5VZ5n3xQPiIfk0/IJ+VT8ln5gnxZvibfkPvlu/ID+bE8pASUNCVDyVbylYmKpBjKFGWaMluZo5Qr85VKZbFSrSxXTKVOWac0KZuUrcpOZbeyXzmktCvHlU6lWzmtnFMuKleUXuWmclu5pzxUnijDakgdo2aqOWqByqmKOkmdqs5Qi9VSda5aoS5Ul6g16gq1Vq1X16sb1c3qNnWXulc9oB5Wj6odapfao55Rz6uX1Ktqn3pLHVAH1UfqU43RIlq6lqXlahM0QdO0yVqhNlMr0cq0edoCbZG2VFumrdLWaGu1DVqztkXbrrVq+7SD2hHtmHZCO6md0s5qF7TL2jXthtav3dUeaI+1IT2gp+kZeraer0/UJd3Qp+jT9Nn6HL1cn69X6ov1an25bup1+jq9Sd+kb9V36rv1/fohvV0/rnfq3fpp/Zx+Ub+i9+o39dv6Pf2h/kQfNkLGGCPTyDEKDM5QjEnGVGOGUWyUGnONCmOhscSoMVYYtUa9sd7YaGw2thm7jL3GAeOwcdToMLqMHuOMcd64ZFw1+oxbxoAxaDwynkaZaCSaHs2K5kYnRIWoFp0cLYzOjJZEy6Lzoguii6JLo8uieMUTPZ3R1pLhPRxU6/VHgCdYOFgXRKd1//ZZI8KhvzqY2IfRcwLq0FMYbTt62kHds59g/tcOJnbAt+xfYDt6xsOOUApe/+1Fr8FTNu4KjWNSAlXDeOdE6F17/fE+Os2F4MDnoTpcI/w52vGA1ocIDkh0n/EbuO0WgP8NcJuFLX7sz6CtAux1wD4Nt22w/fyJ1pYQvk73SSfxT+x0nzThPwb23Qn872F7sc3pojWzN3H/BBxMa2ZvYv4v/DkufgHAFwBu8+fQmhmxVwIMfb4L8F7f6xJdwcrhrwBGz4khOgSCX8b2l4e3OXagT5gK9Akr8V5/vMYd+MLZa+jCC5PgBD5ZH2danT2IFsb2mljMxj9A2h6Kzw2LDN1raPP/Y2O8F4ppi/3Oxni9O9Ge8mKsn6H7gZg2pGGje4NeRBoMsqeEYWL1jLXHwgC1OgbFQMZUYBCNNTp2vk1iC99n0Hr6bBvviP3G194W+y56xU91Kou12nhHrARzvrRjJpjkkmAnuRBNKcnF0pfiXNpQDZtcl+I2FI+vncSDqjVFNJ4GbC+xcy+iNRWMY6jCRGqT5rNXnf6JqQBzAL/JWPVL6IeJvWP7sfBHGL8N+rzAi3ENsgjs7YDYJ54En0Wx/YxVE6V2GsPbdpyuGBIxbAv7BF43Ugb4171+hnbYuVgcECeuq1m439PWBHpUE+hdzWepwJ4GcDrAjq7V5QfoWk2gazVBDdgkulaKHS2rCfbluHBiPD4+Z9n9aYKatwlq3m5+GcCV3rawT1zX7QX8614+qG2boLZt4b8A3O9gXEs2gT7WBPpb81kasI8H+BWAHZ2t24+jszWBztYENWyT6GwpdrS1Jti35MKJ8fj4xPV7XF83Qc3eBDV7N38lwA3etrBP4HVxbd4EtXkXH9TmTVCbt/irAF4NOKg38P4kiq168B7GrpVGxjuYcGht+AnAt70cOr6IH6Inz0zgkM/YPxLs6QDXODHQcYftdKztAbgdcypB22o7X7d/MgZ7QL7tIJf2JPYnXg7dMwdzATFE9oM+LEmIYZYTA/W52mlL8qJ+xnvzcvkh/MEk9tXetnSMw5gHAP+Ol0/HeA/ggByTtp2OMe4f/IROK8d+EOd0YP8Y4A+8nNg54AdX5dH+LQ/nPLZ3J9gvgnhedWIgsVFOl+Of4mLMYUHbKLYXev0PT8L2t0C+xSCX4iT2j70ckpcrFxADOmvD5v8rIcd+JwbKKXTakrwo7vfm5cqF9e9bai/0tiXviyvmDwG/I4H/Ougr1ptj0rboc2jNfzCm8yh8H6PzFmS35lEEcwCTedR4jx9r7rQH4HbGmTNgDp1HEXyJscZCERjvEPvEk+DTmketduw0hrftOF0xJGLYFvYJvG6kEvDveP3QeVQP4IA48bhO1tYE92FrHkXei1RgTwM4HWDnfu7yA+7nJrifm+BeZM2jCHbu4Sa4V7twYjw+Pmc58YN7rwnuvW5+GcCV3rawT1zXHQD8O14+uMea4B5rgnusX9vpjDNXIRjPGfB4p/MWah8P8CsAk3lUf4Kfbzl+KC5mnDkD4bQATOZRbzl+KB/gxHh8fJJ9kIWOncbQAOKE/JUAN3jbwj5xXfdDwO/w8uk86i3AAXH6tyW/T6kWoi3ymY3N1GzG0UhgDtLzMCbaV0P1ErQt0v/42nPd/kdyLfp7GX/Xu/h96PeyDzZTvwN84pE1DHEO5rwP/P8N8D8Ffl7wcMpxvm14Tc9tb0xiz3X7f65rRTz8vkiTL3bn24TbQuzkW079o3UDuqc/Avb34z7vghycbx9+H932xiT2XLf/57pWJIFf649Tq712pO+ycQ7mXLb9l4e/ZhyN2acOxn1+H3Konu2TBHtjEnuux//zXCuSwK/1x0DPRu1Yz2bhHMy5zFB9OFnPsT4baN5OcVHkK+dzQjj4/S0i69Uue2MSe67H/4ivRefqrraRBl/s/jw3gPHb4Dd+4z4/AfwDIJ6vPJxyer/am2BvTGLP9fp/jmtFEvgjzNcevw2e8Ys5gRA+Z83Sr4aBbtZrHwm2dLPfqC3VzYaBbhZyMoAuMQPoIb32kWBLD/mN2lI9ZAbQQ9qcpPvgW0O++91d++N/hPbHU/xZ8J8AP7YwQ84rbI39CuB6jNH3nUHtBGM7Xo+qAbgxVoU5RAfyjm1vpfaPHDvGNbEW4KcqCW7xxY2AY/nvdTh43cynLV4fs3C/g6nWoh5g4p+cTzfXtj+l9r87doJdfqoAbkmCq7w+iQ6ExvZj/7ZEq0DxagfjOa31XrSA92IPeC9aQF+1g/eiHfRVC+j/RNziixsBx/I/APr5jn/bpJzpzntBMfH5Kujz6aDfih07wS4/VQC3JMFVCT4/BP3c4d/Wn0POZQu+N1zri6ej+ott98fNEMewfgPt3w9WIE0XxZZPL7b8lwKfXtwMscv/QcY5XwydWkLPF4v91MYHUf/YZ3shZSw9zwtxCA68gDn0jCRsp2cVYT9Uc4Ix1Zxg/AidiZPya7QuGnwNaYFC2UgzE3wN1bbiON63sXp03k0sC53NFMeLMM5OsNs42ImfYJqPanlxLOMn530fZR2Kf1qCA0jTEmwOdmKcH/9rCjr3IZSCz4DoxtrO99B3RHAA6+cHEuzNSJdC+AQTTrAzeB37RDXuzsAgwqhWGKwI5dv2isBCjMXkfuC1IA69hPon/DLqn9BLqH/iON4/4QDKN1yK8o1jGT3BFOUbjqJ8w6Uo33AU5RvH+egV5Rvn16OeQf5DnyL/cf7n6NVrD91CsVE+wZgTzkb5hteivMLZKN/wWpRv6HgIXwXZQ8dRvuHs2JHkflzXAjjlPtUvvWF9fkgtla7LWWtBCFvrMDzjrKUguwk0V3R9AHPo2kK4iXF+OxNMfrceZezfvCPSbgG9UwSvvNE1BLxGStckMSZrd2hfhN0WrlUOYT77P3N8fQQ5vg5y7AY5doMch2iOASZt3IpxqxlmXN24o0xo3AcvxZhZudW51YGteT/MWxb4Zd7yvJ8F3s9rzNsQ+H3el3lPA38YVVuNqq1G1Vajaiv7dVRtNaq2GlVb/Z+orZhCZlL8G7yMSY+/jmEymRwG7e9bgmaIKUtQBCnbg0jRvx1HExi7cyz6xZialZk1Nisr68WsgqzC3FwmNe5tQvxf/BuG0eJ/nxz/P/4Nw8S/YZiSEX+qW/8L4VdmXAAAAAEAAAAA22P9NgAAAAC763zMAAAAAORdC2A=')format(\"woff\");}.ff4{font-family:ff4;line-height:1.172852;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff5;src:url('data:application/font-woff;base64,d09GRgABAAAAAFUMAA8AAAAA03QABAABAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAABU8AAAABwAAAAcb0U+9UdERUYAAFTQAAAAHgAAAB4AJwEWT1MvMgAAAdQAAABDAAAAVlG2fPdjbWFwAAAETAAAAIYAAAGKsYBnDWN2dCAAAAUcAAAAHAAAABxcemAnZnBnbQAABNQAAAAUAAAAFIMzwk9nbHlmAAAHXAAASFwAALnwfkF/E2hlYWQAAAFYAAAANgAAADb3v4UkaGhlYQAAAZAAAAAhAAAAJAgPBRBobXR4AAACGAAAAjQAAARAbDY50mxvY2EAAAU4AAACIgAAAiKBYlOAbWF4cAAAAbQAAAAgAAAAIAFwAVJuYW1lAABPuAAAARYAAAI6Gx1XmXBvc3QAAFDQAAAD/gAADOU2pUQocHJlcAAABOgAAAAxAAAANMUDzA4AAQAAAAEAADFLDDxfDzz1AB8D6AAAAACvhDZeAAAAAORdC2D/5/8gBMQDYQAAAAgAAgAAAAAAAHicY2BkYGBO/K/AwMDy4//z/89ZjjAARZABowAAqw0HJwAAAAABAAABEACEAAcAAAAAAAIACABAAAoAAABGAIwAAAAAeJxjYGRSYZzAwMrAxLSHqYuBgaEfQjMeZTBiZAbyGVgY4ICZAQn4OjoHMTgwKCgqMSf+VwBKJjI8AAozguQApaUJdAB4nOWTy0tVURTGv7W2SYiDIJRuYfYQUvHJJdOLmUZevak9vKCOg7KHEDkIgmjQoJniPBw1iQY6lGoiQhSlo2rSxEH4oEEhBEV0uf328dY/0YGPb5211/M7Z9uUjorHRkA1mNeItWky4YgvOuAL5mFOk2U/1WwH1G0p5cKQ9tt3nUlyx0HM2dJEyOiujykd7qvZ59Vn7Zqwq+oHl+21en1B6X/1I89JniG2Qw+8W13epXrvUQpuAU3gGOcd0U7igT9SJtaBRz1Fr1XerxQL/kR5f07+MjwOmsBHaiwpbw4KqvYZfOXKh+vJWd43OZ8u8WP4IZxWpT9T1rPFQrhF3VFmvAT3K2U3d2eG07atDnYWOzZ4jY74MDkpNfoQaFGjdVJnmD3alNW6zmmjuOPC/qxsGCO2HZwmNgef13G7oax9g7vI48zW6LlSLNgnemyr3N7Sf0uz8Dt4yjbV773ai10e6tH2IDtGfU6pxyfYsQqNXqHbiro9j068W1BdtKMecSZ7GvvoBDM2lg2w/2HmXlEu0XOW96hpFXiPBmga7uGfQaNVfBHXwKIqEz2XSjq+gKdL3yJqyYycNyQ6fsB/W51hQ/myPdSrBYP47oBlNYU1eF4XEz3H1On7mI8Z/QK5aOqL6PFLtT6AD9g6XEePNbi1pOdJOLf7LeyNKqN2oQIbHX2QnB36EBv6iDlL7kt8P7Br0OY3XKE6y+hQ/Lf/dx1Ca3Er+V9Kd+/v3fWvu3f+D6pD0t54nGNgYGBmgGAZBkYGEGgB8hjBfBaGDCAtxiAAFGFjUGBYy7BdQU5BQUFJQU3BQMFKUen/f6A8RFwWLm4JEv//+H/4f7/7L++/uP/8/pP7t+9fvvcGaj4WwMjGAJdkZAISTOgKIE4cSMABIjhBBB9+hVxwFhuMwcMLJFgZ2LnxaAMAjikdjwAAQAEALHZFILADJUUjYWgYI2hgRC14nHPgZGZmYmJkZGBg7N3B+L/VNcMFjjazsrgxaG9mZwOSG1lYgCIb2diAJAA1hwybAAAA/0P/9gIGAscAXABWAE8ANVpiWmIAAgAEACECeQAAACoAKgAqACoAVgCCAOQBOgGCAbgCAAMEAzYDaAPYBBYEFgQWBFYEjAUCBaAGXgcEBy4HdAeqB/IIOgh4CKQI0Aj8CXAJrAoWCrAK/gtwC/gMRgzeDWQNoA3uDiAOXg6QDwIPvhAAEHYQ2BE2EYIRxhJGEo4SvBMKE1AThhPOFA4UbBS0FTYVqBY0FnAWxhb6FzwXfhe6F/4YPBhqGKgY2hkGGTAZ2hpKGrQbJBueHAIcjBzcHRgddh26HegebB7KHygfih/6IEIgyCEoIYYhuiH8Ij4iiiLQI2YjkiQkJHok7CVaJgAmOiZ2JywnlihGKMIpBik6KeIqOiqOKrwq+CsyK3YsCCyaLQ4tUi2ULfwuci6mLwwvWC+0MDYwejDaMSAxdjG+MgYyZDKgMugzSjOGM9Y0YjSkNO41TDWWNeo2SjayNwo3fDgEOGQ5DjmWOgo6PjqqOyQ7eDwGPEg8rjzwPUI9ij3QPi4+aj7MPzY/cj++QEhAikDUQS5BeEHMQipCjkLmQ1xD0EQyRHxEfES+RSZFnEXQRjZGgkbeR2BHpEgESEpIoEjoSTBJjknKShJKdEqwSwBLjEvOTBhMdkzATRRNdE3cTjROpk8uT45QOFDAUTRRaFHUUk5SolMwU3JT2FQaVGxUtFT6VVhVlFX2VmBWnFboV3JXtFf+WFhYolj2WVRZuFoQWoZa+ltcW4hbtFvyXC5cbFzMXMxc+AAAeJztvQl8XNV1P37vfdu8N/vy5s2+ahZpJI2kmdFI1va02Ja8yZKxjG3ZYIM3sDEkAbMFCJiGhBRICIQSkrJk/bWBJoG2pC6lCU3Ir0ka2k+2/58kbZOUkIQ2NP8sbazx/9z7ZnmyBGnT9tP095ON5NHC3HPPPfec7/nec+5DBCURwh3kQcQhCXV/HKPi8Cck3vZK38dF4cXhT3AEXqKPc/TbAv32JyTRfnb4E5h+v+ROunMldzqJ5e9/7nPkwaXDSXIhvB3aiv4Ob8f98J6jugfzvC5ggnkOfsIRjDZcU6wG4A2Lw7g4vDSMenvwzNGnEUL8zNEDf6DPXzjgrj6N+HPPDuz2JtXkVszVlnD/Tvi/j6CvoOfx5H/C+5bU9JEDB/DkFfBjgrbiT+Ht5AxyoCg6onfiWEyPuyJhu83t4qOqj3PCKA5R4FA04uDsIvIJLifmENcYc0yDQV1LGgyswcjsUzf8aYkQM4sQq4vgE6XKGO6v9o/gdHX5l1sP9Bc43ua29z56oNphvCJn7u4clfsx4d0uLXHi7sJY8ws6h3Mn8HZ0AlmRH12qd2BN0wN21afIDjvvd7s4G8zBSudgt4HoLsGvWjkFL5tB8XUmoJknoNEJ1CUexXXp6y+3Hugq+6Ig9gH4fOLu7LCzn2/zJU/cvTPCXlD7CJzbiF8AfVtB0gK22XQ7kS0cEXiQTLAqEidaJJ7jJCwKSJEJh4kVlG2pizoMwo611K0tk9SCbGZJbVRSrMJyu+FvpVTBkaeemn3qKXLm2amlu8lVU8+CPGBEFvx7+ElkR+t0F3Y4dCfP81YFIwkrdasyjKoxioIc5lEcbJRSnx80kk5lc5VyP94lhMs9bdlOrhc/2Ztp6+tJCm19YLlHEOLysE50v1nRRXqezV8mGJaGt1oERRYFQeJlC2hDQKAMkRPIsnXSDPv+Jny4vrnM0FdOHRYmnal/UIPvMT5OsD/wf0io69y/8M+R55APtaMxtAPtAtluQ6f0Xnz6tH5735tvfMPWqcmEetup4wd37Zwfy4ZDPkufMNPNi0cXuV0LeOcFXNVhx/h4Y3VgbeBvcQmkXOo2/0GNF3V5j6PTZnlPU3kzYP6lPg0UKYlOnM7m4G9Vq7JNQV+nU/B9Imr+5b+YytV/0x/HJfrblXL9d7GISzjN9Y+ROPZrfvhacuB0qkiyGnxZ6qv2w5bLZYs4TX8kakTGUtsb5zoyu23hhMuVTMdT/CNOizSFsRCcyPvdNhETfwQ7sZK+cq6Q2eNRE3FVtsWjKXGPluXtUpff7QuVJzQCv1h7Zn1tcv1l6UIwoAXz2XaRIxb7+okTOSsnbsSSd8OUT8JESITSgqAo0WCU/449dNNo/wWn+0TYAVZ3oWfrvRjzwTcpNkd0PuzPJiKVzsqfuhJXjVZ23lGUOV4mkqejd/p4BDaz2Jcrrcv1zdpD0Y1kcmmKvKXTKRIiKj2VuZwv0rHxqmJ+7qTLP7s55IpN5RISmL6Yyut0Tw6jQ+hL+E+RiHTdhyVJtyDCc7AhediEYIqNfUBtD7Zcw+gEJJkXUWKuTZU0NVf50tGj78J/umP34vZb58HUYIwZGONF/Ix5DE5EvMDDFhcwxq0xmANqjIFXGaMqVaq5ivbivceO3fvSrdv37rngdsR8uRfv5zTwLRIKo9P6CI5E9KgvGHC7ZEtApmFC9QlBzW9VBLtN4AWJ6hn2Ig6H/KrNKkqCz+uwEwFzy7ec4W6ob2Qfdf/YNOrmFoyYJY0wbVSSzPsIaQ3+LYGBjmEImpVqmkt7ce7kDJ4V+JmDixbesnhwhhcOlcjt1WrtGzgX7vo23v9qOv1q7dFvd9X+P2N+Y6DIP+S8zH8s6AlssehgAryAEfgN6kMlBHMClwZhsTkFFp7of80ptJyGxSyxhUpM43oGRBzDp2qf+9d/5bxnXxkj98PY4LvQ86BbDsloB4ytKLoVSyJbP/BYHI3EIpFBoSaPxXx1w1Ujk6oU88BKw1t53VI65wZfdSDQEzxxgpyp/eQf/gHb2dwvxGfxXWx8CW3Ug2zu4B8l3ggd8JKjwWK5q1xqBQeyymS96VxJg49PlLNvuQs+8Nlnn30WfvOac8+Tz5A3gRXF0R36BE4k9KQvFgloXo/TocgwIPLxos/rctoEqxiN+FVFkOOxgGYBmwoFRQFsyOMGuBCm9oXFum0zoQxdGJ/P95JNYUWUMAuboMIK1bSUrkK4ZR8liX1IafbBwT/4ieBvByaDt9lvi5y23xaaCL4DPuCrMHyE8DvC7xj4yEc+svOTOz8Mf+Cfj+A/+CSEI1Q69xjJczIqoSE0id6ol/HUlL4+Ozk8VIpHwqgUzgrVoXJXZyLulTzC5HCx2+2CGDUuyGVe7PK4u7twqYW+2Gov1ee4tNLvl9CUeWJTbOV9ceIGD14pU+89hisltY866DhJl7NpNYapZ/dT36+mK9TbC33g44uEA1sXVZ92545o+NLiaDDcl4nnysVUPNRhJfgCvbiwz+PCnNhXqGbbyldV+2TsXze9JRosBR3uqRu/fEle5rDiz/buHezs8TkJNz5uVYL5qurrmfq5YzwVUwvzfQW3xM/PjQwcec/WdZtTMo+3cEQMXrAngsD9Qfzkpuvxswu0txsdgpi+Z4++17Jjfjqh7t460FVgUZOf4MXRPq6rExc6OBoyJ1o7hEVMsykgs8Ym0B6zxvb8uyKl978i/kn/JXGNvOvfE7M4NH7uR+R94A960AjajI7q7XjLFn2rNDPe29Mho/WjI5X2dFATkcR7vIMDoj3K2bEF3sDbVPxY3SeuRCl11XvRFrPqtzCkJ1LVgtOAf9NgjKBM0DuzXboiccIMVaOGTHLwyucfwqDoKlfOwoqoYOqjmFwsyaLHIl9zZCo+WtUvLvYrEhEqPTNTPZ1TG1IZERx4JB4O+O+XQWOY/Hw+pnCzQw5ZXGgvFaJ2RxlgRnsJ9/UGokmn4675vnCwq1RMJGarfamtm6bybalMh8PRk+3wuGx/6HY72mSlIzWSig9tJtZp/KFYFwzgGsgkgiHHBI3N4FvRN5hvHdLdLLfiOJ7QzKrlUVlqtdTypqskVnVPCl4U3nM94HwfvKcHTeka9np1HyIS4p0OG2e3wHc5bG+uxHkx34685jf3GnqHnQ5+QMpSg61UR3EV+64ds/oD4zsiIR7sqXIBOfPKF9/1oWi5F9974dwuX843/8S7GPaYA1kSIIvCsIfVqtsg47DwAqI5EWpGq7G6ObTio9Ush5XKocEWK+dKdOvNnTo1ftddT//jF/EXf/SDL3/lewbO0fG9+K3ky5BP7tRj2OnUXYqDAnqbVYHIaJEEUbDTaIU5s2LPwxR1ATjkNAvgZFrOVXNVDXxkVZM0KXdfbusNrht6b3BdvyW/Fd8bO54v5k+fhk/HY8eZPCVUIdeTt7J8I8fyDchuACnQeCnIFgidVgaCIPegyYallfYYWeHqqZayWqrlBvCgJgHuJCt4pISV2s9KtZ/ha7Gz9mq59ip2lqk8R86dQM9DnmFDMxDF7Xbdga0K5Kc2uhYYCTarGboU61mpeVHs5pHtBnagDqwCm65agVQHc7Y5n93O9Z54yDXq7+c8dq0N/ddyE4jNiUNjuvf89zUDsV/5xlUjV2P5GUYI7PYeti+HG/JiCrDoG7fsZ8y8MblV3pRmQXhfqfZYiZw5eyfs3S7wnXbyAoqiIlhpAvf06L0+1evjU4lkZwEweV60d4vhSBjbAdw1d4drybWEmxi4OQ8e9ZiH7GHzAI+YMwK64RjZ3hXp3wJOZfoBwJeNSCVGsavUd2wdIYLVFSq95aZKxGUn8MfujJZvJjdhq4yxbIvEpy4cue/EtuMnnLaqwzGTHei75JJKpWN9tTrRWa4e/GF3dHgo0jPV2fv4pZ21fzT24k3w6RTb91v1MNv3ogJ7D+AqpgZvoSQDZwardHL1zfh6TsBLY2e1RGmFm9TRzl7L+OL7yFgiNQQhzAHjDgJgtZGvoxzao6dwPq+3x7yerM/rceMcivFWhxjMZUUUhLGbmQ8Mz2A6rOVwyxc0s6C8WYg8FaIdl2mQYQmvoUfIK+ArFuspMqCBKEmUWjHZNtIzsj6U26SPb9vDi31TlxcSuTflOy+9Nuew4Mt3V0cKqfbOWPe4vmGzHlI7RysbJY64ivfMVdaNbuoPBKgu82AzPNjMFDqpd+P16/UN66Yybai/0pfNtKWDPts6fmoyJnaqPhHmybkEURwdxZ0cnmzYj6tOLhlGdF7UrU90Eq03T3S9gQ9ZXGWTzWULGHKEUh9E1wbQwQALy4adMTPziZJaVwGL0LhySzaVUNVN6bgVomkqPtbuUXD4ZIJyK1zgso3hOIcXCJHyv3fxokck3FBFb0tMjR+5tbfbTr4ynW8Tecyn47mAVs614S2bA36vU5zLd/U4bF67oobeuaXX7UlUd7gFS7k4eWioqg/vsNthnwXBDtqY/dnREb2LsUuCzS5CwsZILhoUCC/brQJsbpHSPYh6ZLLcJs/3waCwpm2upKKqFcgwwYuo6RHs5oJ4Yv/ll+/74SNz+H/XKtsfeWQ73l77A7qe3ee+Q6wgWwfar7fhQkHvTHZENL+EOiKhoJYUbOGQGIiJblcGBwMc7mgKBGvnahE8y3PgDlQwC1RoLJ8Ww4zdpNQMwCCwzTR1oVI/480ksYgphr1DkDutvVpiqCPc2TPkdocSYddCD35j7YXIyP6jJ/tHbuueH2qzfNJmL6RlByb8QNvmnfkCYBTO4/Tjq2b/qnLnpYend8icMNUxB/rvPPcy83PtaB3aB7McGtKHve1Wgta1xxWv0JeU2lyiUukWtTYuFNAwjreILNcSm2h9nmYbjaMh8ySHmItlpsgSEkjxR3FzXj3pbgDobhfF2tQLahh0Qd2HsWmdBH88esQj250zERtv8/rHSkeuGZs6GvdwMv7jBxNab36yv81Ve4ds18c35FJb1g/MKhBdUpcSLASu7ht2eFyh245erU9xYMsJPIXT6x2E54Rq25ba+7JtY5XizIbdQ/0hja55CuyR8iMagn2OAwEIwH7KDWtI84uIRV5uRe5+njcMmOceqAdD5mz4NEySZhvJFP5psidf1KKqw3rQKXi9gc70cDBcO0zO6LnBDTvGd2zbtuPi2Njo2L7NWxJxRPF8P/gXDtYqjfrQNPObMzP6pthA39hoKeS3KlJMyHcLPLdBLKSSYNnN+Ac7hDmUVgKFTABqxizuTD00UZK2Sh1DuRGeWIIpMa9BA1S16VUpYvdSQjHHcipV8xm5U/+Vg3hy3VYvR2yDlflD3SWe8PFIYV0qfuMx/pr7E+rwlvFt4wc1/6kRv8NfDcXAh2CLbA+ND4x1TK2XldEjrtABZ8Ji2dae6a1Wo+XOvMfZ3zt29A1bRWdhfnx6Z/lNIRHjF7cHZRKIhL0ei+T2qM7EqMEFddZjeAHy9h2ANIeH9ZFkT0EB2DFUSMplwS9XRU8Whznsb2iqRcwu37Z+NGxW0zBTUwwPYaaHtMjSQ/hk5OhjmMVzt4t+j5GvOAdGnqLJOMsqc2+zTPYr1v6uPt7tTLnsstaxZ3L0VD7e6fLYAh//3UioWPBFFyP4aszP6xuzqW2Tm7Pt/AOFKhYG9dtUmyqBb+TEDePHPjTopZkIV6h9tvb/TtooK2nLnMJzLn1rf3HT1J7e/qEGNwU5jMGLpRg3BKGdMlMGwyeC9pFIKFm1gp0yEVSvw4tRYOY2wBmFZ/jsCTouxbIwrg25wIvmsNsNMM2qOB10ZJcdIK2AXE7RDmNbBYedLMO2YLfLRjdvMrd5fPcKiGsI0oS5IFAL6FLJ6F5fh1KkTO5EImBHN+NbMZVqJaH7+nwu1uxYwhXiSdUuwo+kanly5+jPfzaK1TGYfwn9Lbkev8j0fkGdj0SMjjPyC1EA9SMJS7CEjUSyaOIjl2l9NYIOq8lKBj7I9UtPk41LT2Nfufx8meUR8zC/LcvmJ8B4YB88MpPJv5JLznVBJqlencaP1C5K46+lRn/289HaD8fYHivBQN8jX4T5dUL21Ia7uvRue2dO8/OpYMCv2sGeDJgvEpnxnrwZy5myuvPyOh51mQXpahgY16ARwAs5OYroGIYGp1qh+4xtQ/VrBw58gLj+8uLqaDbmCiv6RuxWPZIlupET8/GecCnlB/N8WXMoT3UUF3umo86ApTSuOhzlaJtHkoKj42pHLADeqjexns5x3bkrufvJV8Hn7kZv1suMvfLsnJ4qdncW4uHQ7p5id1cncnuE6vz2OT7TNirIQ5KtXdxa6hM1v03EckPZLDMwQiZ9Ca+Hl03erAF5FVZLYPNLp8DJtLiUAs6lcuCBSK6bjGBDPaVcpeT2aUYUzRleug4RqxxDhU7KeFGQSP7E5UqWu/s+8/I/f+pLB47ZeSKMDS067H0+0d2fi7UFto2Uivv2t4viYloeSgQvOvjIe58fG39zua9nsD21gwvF+vZ4JIxFz565gEB2WWSvVXn103/yi5PX3pLNLm7ZSPoz8HOOFBb3OjZvmhpXI7Wvj0jVLv2xw0e/8tDte/dnFJ5XAZ1sriQze9KxaHz/YjKKyLklUP5hdlahoFk9yrITXlYsPI8VC+gBUCDbSa0EQWsmKEsmDIhXyU9KaZry5ZIZK77oICaXYP6Sidq3sHIdJENLU0/N4t21D9OYuwNkuIxxNFGAbpfpnQwHOkChHHHwoY5YlPPyHndHu4jiMTEa8XlFl9uFKXnjXuZDi8PNEwaD9zVRBe5VMCHui1KY7meICKw9nXQbORUsaAFXYOUgNtMMsYDxLV8YLVsESSllQj+tfWvxbwJaWC28/8+ePgUIUAocPEPOfIKvzNkAomNnX9vEZ2CK90oWW2DmutmLJdGqOOwjjfzl3RAv29B20HYmo2dRm9eDImEP4q0B0ZUQBRcH+bW1la400J8Z/FlRxjybDKNjfXUyMJdlKLeU0NLlIoWEkJv4DKa1Qt7tUTY8+6HteV+A5zlt+puYhBZ5S8fbP6dxg2NX3trn+L5z3H//4ZK+eWKmNPbcK1ZH+LJ/isfeNLv7ZDxhxHy6XvfBerlRBO2GOBeN6jEJjIVXIx7e7YqEwiLyekSHy4ndsEYuU6hh61M/AjLl7i4UNU8naiyOka6rLgbrcBrWJuEuU64zjWef3NDmcwj4OZ8nGN78jcVbMJ/tuigSfi85c0mpPzfjctV+Oi7xIiZ0HbDz6OScA2IvZrJvZOf+R/QOg4di59zIqoDrhHihyKJkBU8KHlUULBJ8wo2Tk9Ws7PwDk9WO/pP0L+WkVKLVHsAP1Gz45dob8TtnfzJLzsy+yOIklSsOcsloETw8PdWCSWNET7QIL/AWSRRkKpUoACQxe/iV4rQIkZXHW9ggxkAU/GrtmUX8hdo9+G2ztc+CHN9lclA89xDYZy+6AvLrvj69hCDv6u0ptqUCTowEjkRFby8Se4odouDlZIvIUZYJY6e5NIJlLfUM2+x965I5UZ9Zsj6DtktXwM325IxzhCaTjdPNc/Qe1d86MUhXyEPT4x+0+X2CfPv4wI4LP/ChTZokL46UtzxachOOg2A48P57ioKFfw6fqN171e2A37Qr9t/z4YsOvymd7phpT99fig8kfXl78IOn3amu2eY6XMrs42DdPiTIkRkryQhKCLUCL7KaCHCNjLhc5hq1JnljnK4Nt6L+StMopSlX6aYMTvKJxUW8e3Gx9mFypvYibluawjN1edATjHujnDHl3uCbPEcoZ4BMtPjYclJvVWIchnlikbpeeD/63v5zP8J/BK/9zBfRah3FD/sANgTi/T6VF51OrMgcVk1wAlPSjY3UXE11tcqchr+ByTUIEFJ5gy+ycUPIvS/Xe+poZ49FwN/fnu8fyM7hv6n13zyyqViqJBNtqLkO72TrQJE0XQfOCsaHWWkOSMiIC5COacFi1n9zI7QkXLUipyTjNCdROO0m5Mba3+Pe6//1ikXQT+1va5fifSd+DK8+2JTFBrIILF8VRV2ClzxnmAI7nVjGn62SrwI0MwsgGsQZXXxiq21cxPuol2qMxdHzCht41jbGS0uKgJgJsnWXRJg3Z7PKFkLLFcj5Mx+ur0130xBW8tTUEEphWgHg5dJPLL79a199+yL5u81ky9KTIMezRAcLgdfNub+F+aWdetLwSzJ4SXBJMt0L4I5g/hZp5TYwC9PUwkqHRLcAVUQaP7F4GB9fPFS7F2T4CimADIV6fvkp8EdOiJiTup9FTIsaQRbelRRtNvDSrXOTeqA08VIrg6S33DqzpFaZoQEFpxhnwihLarWd23c9/OjC7OzOxx7bOUs6MyM7u11JdaRnEGxvY8+ha4f68P4PXHL88oMf+vCByy478OEb1h2QBWJxj87cOnBsW2X3llacnAfdWUD63Xoau1w6mBpvc1JvAi7d6RARrbUCfWILmLH0Gk69RatLyGWekcuIk6qvAN6TQhcKW/Bl33/1E4uLH3nf+z5Cznz+xdrLYMf/684bmS7/kOkyjgZgNeN4cFBfFxzIJUi1vyvuQEE+1dcrSljlAGk6msm6iWVbBkEcaNAsyyDDzlKOZgw5djpGD8coBcWUTYngHMPJgEgklqRr/jECjjxXJR8szQe83Z35O7ZsCMqwsbHIhR+7EVZA6PWGhkduSIW65aBT/d3xqYsjaY8c2FoJ9u5zCDaRSFs37oh3rx+M+OzXnYb1KGSHF1Lh9Vvv+tyUlwButXT+4/0bN9E3FOy7ivU1OQlrEkd58PB53N6ud/gyPrfLJuUTMS7Kww9yIkomAGfGYyrnM3NRde/+GsEfoXazQtqZuQksZDmJA1OYCXATAhrVQTema+ZtYM0deD5gG+qtgMjSaNdGh9NrOWCReZFkdj+3uPhyMavd9yw5Az5fznfuUdXiJiXW2z9Q6W2zKS7f1eX52tfwtYTvCJVPsRj+XbIA66wztnF8XJ/o07s6Cx1RpJf6IpYM702KGi9WqzhCNA7rjdmZsOaKQ2gdjZsnN77MyZeLnClo04qJosFEGoelJa2ksclLvjrFSn/3jqH+HdOd5Yv8asamXdUxNbf+iptOODm8yHGR28Y6y8XURgH8TN4Z/iS++e4Bn1MKrytWvjXXmYsmpxZCAM44IRjt2n+00nn5eofd6doXSgyNqE4XIRZiKbxPkSdPWyAPxxZ338Bh6stssPZZluvsAOtnVUv0wE3g+XoJlgj+jJYtLadmtFYK/XrUTKPIykZC31okJ2Znl+4lBgeyAdbjEhg3hOZh3HBYj1htVsOhhwJBQfR4cAjgJxhasOVB66F2WaVUEIXNw4bpsOGG06qHWidh26+Scz+KsRB61+GO1GJl3XC5+Ga94lEwOIM+f/g2vXIcP1LbcefoFAR4y1hlfdbfjz+GMMsHN4GsIpoAb8v4GhFgB0djHYu1vCkNpAd+LTJhFdamxKW5khd/79CPr/inSz9tQI8lCKpsHO4ki3NbAHvQOCfbJF7mCSBKgRMIZ1VYTDkvwC39itCWhPEgsoXZyDh39VOH77nr2N13H/nDq++CkZ9kIW4LSLGVnWvW/bMV8E/MqIG1UshPZB4bcZbhixWBrUFdvi6y8zJBOG+au+aaH3/3jb//xGV//+M3PYkP44XaK9hb+31IBNJ1fV/AYsQmwBayrCvYImKG+cEPQmCgOheX6dxAFt3NlEM2jy7X9Q6GSDX/0omlfUvH/wxW/ShFlZB7nDHwFT0TKrC4TjluGtcFma4yEmlkglSDYhuagtDtIK1kKluVAs3QtDK40y2BIdmo4CJkPCfwh5b+Ed8FW2Pz0rdmF4hmnMNvxP1sTy6YmDsAVYIE2Y4EkIeWKsCPufOyMLMUrfRrNe6O8ZRu3H/ttX9FzowuSaPc1eg1zrU5jqcTptUY2Iysl1pAbiWuFnAJ48XaBwAUPM1dffZOo94B3pssnxclU8DbgF4FNi8Yic2L/Mp5rcpJ0lpy+MDkr669lh6oj5J/GTXm1U/68MfZHh7XVWMPw74VWI0k4NUG7zpWL05smtLqxGs6J6WreNslM1dfPX2QnHn7kSNvr+vupXM3rFprgP5dtQY0OcYv1YK3Mz61nQygryyrAULo16sB+srWi46QgdPw88S57+MacaF1aDu6RM/huTl93qmPDa0raWgq43LaIPsXhrpnpFgM+7DbhcHyMs1jHQNXNk+Kz4uLGTRnHn3OMPtqM3uVRD9YHzjlbE6UGscXDASxE4xqHRIBIqLhUnNyLGw20lxWh4jLxSt/pw12ooC9KZ53uAs5yekTHB2Z7ERnxiGDs+gu/K4WD3rWuR2BkGQjzolXec4fE4c3VWAPaWNH2jB4VB4fVpRSuXjEpcZ/mA6Ogl/jkoWIi5dDHCdEg3GfGh8odtmJXe6e9ovwYyyp2w6COxSCnlGv3dZ3Ee+U3WmGbTece4WkYJ18DEflGI6SEnE3zrglPuQBO/d5/apk83ow7fYgPrA7U82bKUtqFWg2691WwVFuc6Vhqki0tEHVMeY1l67XYPofqpx801CpWLncquzVwYUvfM8miqcLPUVJjPkC22M58IS1hbmN1121YbuCN0vSBggLVxDXZ67qLoGUzr47dw1MUzvsOPcK/inYTAFidgx3dupdqBAKonQqiHi7NS75cpLoI+IKom54JVPXaZ5NJ2Pq6hQzXfmeStlg6wyyI1euV6Ow89kxgn8qyPZSce+TPVaQT1YGSicO95at/DxHopcujGJ+eusFbRb+qUSqp6v9sbZgRXVYS4Mj1Z7SOr9NkPbdus3tmrh6RzQMawZzIjzL9/PogJ5la4aCAZXLRQF+wJL5VQLm53YT6puwH5ZMMdWH1g8TGp7fPElllSUDB1WFeaZTWUqY1zeE5ua0EmQF9WVjEJHwCxB1CyfedAWp9l4znM5HH4/bHcVNuwNhSZzLxihs2KBYpz503GdVts3NeLy9mCxdBdF58Yp39drx+uqup5lNdpz7PszPhVKol/GSlL0KwBc96SAK8M6C5O1NS8FAXJK8MMMmY2Viq5rQ93WIqoxxwE4hvImoimE1Wc8f+6tFTKuK6GGkCImPis9ZeIuvqzLbK/e49oWVwdEbby8GQ7W3cLKcSU2UtyiU0OGUdcNjswq5N+Z25BI5gcOQkhzPjdy8cdt856HJtny2PVPtuy8hOkSlbWJ6TLG4DUyLC+QzKIzeoPexTgNEC3xczjBklwIKBWlfAyNL6vXpNi4cgjSWnUAKyzm75eUd5x3OCqv0FeBGSxPoIE5UWFDYiQ7sxGoJF47vWlxsyw+4u62cj3eJfrfAH8fP1CbwM6PrN0biHOaoB+J9DvcWWLvuczoR2H4bgqwlw86RE0OlzkJM4QvJhNAbUzi5yvuyKBEnQeLE2NdMW2jl5lK9dnO5d/atcqJMj2iMGmUndmCWjxjHyewUoGqAaONAuV4sYphpnDyqDKfDIbe2UeCD23pjkxMjJ5PRQltvn8+Fd7whGy0W9MGE/Vv29nzmPbOZ6EWxyGCXVyQEW5NXVMHCi+Cpp8be8cdDbhFCcdaZ2FBz39HjghXCpUj1IBFLxSu/NFleeKxTISxvgE8/YD72Qj2NVVX3SzZAh5Ige9y0Tc3n9XoAva/0rlqTOBg20S9epJqVoTb9apy401zW8KGwoA9NHLs+KZJdnLwYLWWDC+Ay/2XvyUJb7XF87R5OGM7P1X4IUhE0BbvuwXovxAV60kA5kEGBaNTgCD3vFiiohO8QM8wZ+zeeu1KiqgLh88GFhQV8tsbjs88uInLu1XNT6GEYVwUUe1hvx6GQHtZcTofdqqg+COYBjQ/6gwER1tMgqOE3Cbad17tnArHLLd2GQmZJQoYkPnoIWMTUxmnfA5hGxZ0D2d6nhScVq8UiW7BV4HirPcfv24fPLn1lQzIL6csILC62rydxkLy+pswHW9GulbymIFtoOsaoTQwiL283/DcTm5K3QWzitx157uuXPrGTqu+52vOY7PwYrOY2Qw700Pm8svBr88oPLZh4ZXhvzgV7uRe9US8xL6xCUuz3qUJAa0sL2UyxG7AiEnp72vNxSewpZto0wY9dIumFSfeY7ERrHhdpww0+cdg0/55V/LNXlfrHCDu4hUUywirYd08l2ygPAXnLBSzVXz6EQzv96mA8TcuRLesuvSotY7IL1CDkuydTsYWLRaG9IwsKXC+OhXgSikYcNptjx7FQNF/7Y7zfI1pi/X2FDbUX8Pg7cVf7FnhxFqHW/nWhCNoLHo2ekimYNX2FgnSPRMIeCZyxjaORPQIzD5t3sAEmtDqFWp9veJVzMq/arGyFadKglDboTDa50RP7kh5Z5PACxorNM2ZV5WpIhdls3FuOBt0d9tqj+KJAPNBGePtQUa/9kAlvYAUvyO6EaLpVj+B0Wm/jecpXpFy8LSYhr2SxYNO2apBHrCoXNbdS2ixvunGu12BfqePl6ic6jUpKn4Rj144Pj4yfulYfHtITnPqWbcm0AA6EZFPbbvMR4to2c/31M7OzM9ffOL219rXAB0vVoUCga3Cw/FGbwrDpRhID2d0oDjgnx/qmICzFIN3iNadDcLsgAnolq8tJi8044oZpuM7Dpo0S46Vl+821SkOUV2pC0wJO5UDpnmZhHY0bD+CpS64aKpeGrhSP9y08MTSbjV0wFQheCga1e8emq980c8FirUaeqnVvGFg4flRu++gJqv80zIGDOaionXHHHR16AaWDPg5mIag+8K553uokNOti3s1qBmrLw2ETiHaYZe+oYzQ3axc2EhLG3VWIER/riQkD1oRbKF21b7/HgTlpauRothAMRV/qUNWQ03lg1u+JBtanwuDzNmO89+KBjmD/1Ts22TxaZKQ24YBwQCyFB+/vtsN8xI0DWw8398YizM+FtulRVrGEbC5YDovIS4Iiu4hVIeBSG2UdbF4NB4ha5RsrK5Rwykiz6BmHOorHIDW/sJQFeIsXFnx7BoP4r7tSg55AuPZLfPZgZZRgY6+mAe9/AeLoGGPGdV0fL48lE4CgxkYr5YTczqsZKTyIwwSPnnfcsDKAjCLdLJZe50r74oDoDbXyDdBB+s9nSzmDJm4WDV93UFY8luKwx69bbfFkRyGXbRuOhC/eo/BknnDq3kI4kfJVHU5+b6QyUb3gylKXFb9nwUdwX3dYDdoIJ0pyMrZ+KJuWecxv6/S47Q7do7Z3+mw2iDOaJzkjzna09XRMipKhCxvoIkveDd7mcr2bYUreYVXCIdg69YaNYAAcWCgIoVUC2/Ni1mBIcKjFU5kuIzDjybqGQqs2qZZYkzxtVRojqpNj8wd4eWjXZZf5EqAFt83alqhofkJ247MPPDBaezIZATc9ygkWTguHNHzFaJ1v/T7+AfixMKuGo/KHcDgEQmsQdWASdqvNSxskHZwdMrgwwiZs0PC8jSsIUAsVrBQ5WWlk9EVC2dfG2TSNvO8OZjrT0Zls0ibhBXdw7PIwZPAL0zl/iBAhly50tOG52uenU73H/IEsVms80z3lAzENIK/Bv5Jfi3+9evHpA59avMeAULXF+jjks6xmcHX+lfx6/GvJzL/+y+LDF153bMfRG3Y/uucYDHwMv4d98Pg9qM6/4v8HZGjxr4CFZAvBHC8x/tU43yVN/nF1/lV6LRCUk9LeXEnDxy9+/MzFv/3bF5954uJb8Nmf1H7+wgtY/omBVcRzE/j7IIOX8a8+n67aAHx74T15C/VHAMeI+Xy5VYrThGA+8+g+OrrRJoANBtjIMXZHHSmf4rB9/cjDp3d90Vlal/UrpwBnRR1dGVDNIfzepSfzGxj6avCz+OMgF60HSTN+lpNki0ToITAvChYsIY72XPNYBgUJr0fQtjK41epBDH4W/nu09m3cUzuKOygGGK3dMjqKbzH2013njuPryXfAr12jF/HYmK67MBqkEaI9n8um4rFwKAAB0EpbWUSB7+5ycy5+FLm6m81MRfN52Wp/zE3ZY2Ypx4xGF9ZSWqF/WVm7ymqg1Tim93+oMcjkaP+FRJM0lRZAlXOVKvwmS+Lu4vlZWqDC8dMzBVpER7juydEK/RbB3TbrtnRUpnWhoEX/IJ7GtusdYYfdYXMEgpn5ijUX9MFre6djfEdSily8LupR6NeTXoHr78r0ykocvuxPqvZhC9XVX55LoBo3sry3S/i17odxp/+yVOJGfvkd+r7Hz53AF8Ia6Oi43sPO9JBeLhW7Cx3JhF/1eqwKGlo3OFDtt1kkgbPyQi6baQsLkaIHe5bdabByFRpSeFY54sNU0T6maXaES2t/R3CRlBleqFa68QiuUgYL4E6u0kdDF1sIWAoIbPjCIa+FUknwnxi6ej1TOQlpkyMVWIVk26b2LGUZ8xFZwaKg50Nhu4MqN2Gxcc5dStm5na6D1R1d19sZlyI7pxxOhyzmHG29SqWnazP9Vfjr0NfJtAQDrcdt+GH8LpREG/UATqX0NIo7HQrinUnVh3gvbBZncwWa3qzF9aTM00+x6YNhQdbHO7k0xGqtFJf7qvhhUYmMKHJs0OlUwOYnrGWfxyL7VYdVsvC80xZ243tUTccWFZacl51TgDaxCLkwza54YvCnlnM/J1PcHhRAOXSRnmXdWTjgsuUSKmBS3h+R2tK5RJwLWiSs+VlO5jd5/iJLDMxntc0a+pUtWuCEjAq6IqnEOdYMh0tejhKM/dWSAwNszebwdw68HC1Egr1OhxZwOD1utyyX/LVfXvUXxy2dhc5OecZ1gHaYKZDo/fl0m4+ergvztNIZY967nThqe8lke7atsHlw/ZhR/0B960uQE3pRBrxYBmezeo5610zU8K8BKZWJRjgft5qjpWftq03QgrLmCWZfw99665W3Jcko5l3mgBe+YDjgaZB846wT4xnJ1pceH98nr+6SuTdabQO6ZAl1p4PTw2xu+rmfkJfIo6iCtqAjgDK2btW3Bcd1wNBdOc3r3DQ8tK4tFrKJKBPkK/aAowyW3uw0XtZqaz5UaE3Tjraap7mVYcgWWUVyVY1lt4DVNQnmyphxokm5FrVMpFyGrnClWqbN9fXGICf2+T+m2GSbxUYsdteJ8eOqv3fTlqLff0I/7rL73bxkV47rJ2xOV3u+kAxkI371+DjeKs5fo+CTc4o8XO2MwE6S+Ks/4Ax4OiK53jbFFwxdOXGl0x6N2F3wIhSc6O0p2e1B18mJk7JidVoFi9MGX4ydnFesc2+24Ey0Iju4YNfCLfUaIzvsBYlx7ZRFgs3CcxI9+JFE2i+xssaqaL5KpHU6t8pNIrQPuKQln1jE+3dKtUfJmfe/8t/YqzF67ir8C/IVtBHtQwdhT+zfr1/k2nfBxiSPLty1cai/kE4l/T6XsFkSRnJSeCKM+xvu2yhpN1/VsTzt6Ef7zTLsZ1u/XCTZRmKh+pzEr0pN+9CMqmDWz8gqOAwe1ESHqhyr7mDdjcyhv2HA5chkEsJGXuh46za/dwhyuuTNm9M5cFMzvHN60sthLqIVHIlkZ3c+He3jyrMRNRYd6Ixc4ls3BimELKvBbU68vhyNka4dLgB7PaFuP58mxLPu5ouKiqTuDTvdu9K5bDKOfTZpQ6/Dnlc9HtHu9BXbt0xn427cNrc3ZoWIzfcm5monrYnZ9SmHJAm8RfFvsiojQ5rd3qgrn+Z2AL50gg96h64zfFev9/W4ea/LYQd/3aj89XqcnEO0LSsAdrvsnG1lFTC7jadRC9SoEGlRVMvjqrgKQjQXBdOb4KitsOLg36lZ8Q9qb5D37v3rxcVmiTD+9OzsLOtPK8Gc/o7VXqfQHDqhd+L5eX2HuH120+jgQCm3fSDlcYpCODQ1MSl0dsUkpEnWeked02zDdX5juHGwef4NKU40bxZ63ogjWoO7kYz+CE5jFkQvIzAyWMGoP2HXUdD7PmJYTdOTEtZjaJTZM1K9WhLxW+3yG48fOnT8jbL9rs/+xWm8fdMNN7734VM3b9qKb6XXTkym426F8KloJhkNRhOlEQg4iXS+TaZHk7ykBrPOgN/G6TI5gw/tf/DB/Yfwl++6+69qD8gH9u/6o2O2ax/fs+/YfVEeAlU6kc+nN3fnnTLYq9LbIyuuWFc8HdacciIQBZ8fdsZGmvXPv0NeQD3spLi3V++zZtqsSk9bOqhZUREic0GM9xRFjATRE+c8GGurHCMt6zipa1RDvWaN9jKNJn1NhRjuuXEo2N88MVONgmjaTZLEf1t7vDR4XX60ErUdVIjAyeuf+2fdjWHTOSd+9MZNc46DWLQP5GbOwKTwPB4/sn23zAmTmZmSxSur7/3GYGxTTvYG+75ZGbqCsztK+cjnARqBXxpGB/F17O4tO3jhKOsRho1Tx/T1a7jskCI2cuXzMT0y8eer3Exn3MeVM/7B1x0+fE+Y3s31x/MLi/On536rfkUXvSfie2A210KyMgMYzqi15RkzTQOCgFrdTUVTDDAXva+stKWd2ckKiVdrm/G1915UBrht2kdJNI6m0W/pQ6zTUxrXK+X1FEqXO3JJj0uCvTQ9oXNjwngqJnHTG6XU5IQ0NuqXlBTNkWmWampwaBqBmb8932M3ycSVXaHe/lLVuMSPdRzBHtPqrIKxxUS1yvwy6xL1xUWAdCy+FzD1Iaz+8wG6oe557i/uZttrfPuW62/cvP3hUze893c+ahO3Ea6StgIIxyLhJmTq1gLdZV2fGdswQRYO4S/dc/dfsc30kSOLF164/5D72sefuvyjsN/cc2oqqBRl0ZEMunne5oiEFNkXeuefD1QYHmqDWPpt0Kcd/NJ63c/4YiHuTYUcAm9jOX2LZCkO4/N41dV4Ys8QriuCuppmbS4NTXWPou5NivlKNSu2lbsIb7N5vXYLLYqGLCPq9EXJmWo+OzScyRclp2yzWyApAtfuVKM+1lNHeU56h5kTvUHvZbW52EktnFXpOB1WThEgUtDmeAsnSQ47bXRAElHk5Ylc/TqB87iu5RntyqLdKjj+aoUenTLSSy3hH9V8L774YvnFFy+rXHln5fHHK3c26q//i+r//7vO7wzu973kLTDqHHiaOt6ju5vCPYnBPfKacM8UWF8H7qUfWsDCRvkcPnv7Z9hcc+c24jtZvZud3RtH/ZuVs1kFuwIJM3zXBgkIYqdwrZ7u5YXszXG5VRycl8XDIVrTC4n785P7d0+XSveUSvgNB6b0Q2fvNArDeNRx7iUighwp1Akxpoxu0gdwpaL3q/CNNGxsJyr18eXeYjff01Uu9XBFsSsreTvTEqTWktjX2811cV5ad9KsXmCMpeF0lt0QuMIOnahiFrvSqkRpFeWyoONWkz4aug0ys8JOzeipPlcHKniJYGdP/8W9ctAe2htRqiPX/VPtZgisc+sOxWmNsj55sJ2IHC/s2fPynj33SuJgT79Ii7CVwmW54Zs2ztZ+EvRZk4MbL+QFy317tu+XvO4kfvfiIj0j5anN8476WqVAR9fqFaYjrSsdkfm8ZgfI1iskW10IVkVEbmL0ItgBrmHh/KLNMVO2MLyctW8a00rtNJsTZMqSeSkoZpUezQoBcM9MR41LQCigZn0M+w7X7iXtuKP21aloIBLxJaLl3V41kXSEL3y0L8zxhBDBX+3UvB6t1e5Qi2/C/+riOM7tmt14a55eYogdXTdc8+q41R8MaI7RjmRPb7IdGfVJL+F/JX7UjXaBNReLeo8t35a2WcXutA11YV7r7pIwihAzQKl3bQ6vTB00VDRPvshMI82KtynfVi35pIaZGMlBP7vhRKO9WUY7cAkf++6FfDgcjET75XnRun5wR4c3fP/pRKB4yWDJypP5rnJF687Evvvy3VlCG9nE4VHVs6HUAYZhKXz1CwN2womlYp9XsfTHM4A4enNbYd/OAC75LXZfZwuXSBbBRoGJyCG7ZFzdaVt5decK+8erXVPC7vCMY+Mqz2/cc+jQPR+79+jRe79329zeC+dvna1f6/mb0Cdr9C4cYX2yCda9mEzqKSnodlmkhNfD0UvNPG4wTCQmYnGfV7S7nOyOP8ey3JUdbSzvYGj4NQdKmmVL1u8YMmr3fbSWiyUs7ub1tkWSfuJvAo750SIRM39U+zJ+qXb1VwOZTCqWzERCz4KT59d1XmpVrKm3QRaz9PecEA6OjYVjFNH9X9b3S+dqWdZDxvGcUG8nJL9uD1mJ9XI+sYifon2Ds2Aj6NxB8lkYx4UCrCIsGNRDyC9xBLmcfEBz84DHBDHgFh2aHwxHQCLHWA+ng/WVSufluFr9Ks1ho5l+mWYlFDQLFDSK49K0DSJXYjcPJt2YscZJN/msvH3ph3PSyIaYm4Mk4rHa05B+b8KLs6+8//2v7L1levime5buJbEj87ceP0VirR7A38BeXda78GaWOxzVu7HHo3vtThkclM0KyMUFOaaFd9NLlKwUWgCacbvYdb4rDtPOr7VrIimPWTAPFUzGEINYLGJ9iwAz8F21b16Bh2ovXIG1RRy4ovYCHj5Ze3ER76s9hk/h9bUv4DL7+JPa2+j36rntbshtq6z6c2BAH+yuBgOo2t0RdDosOd7jExMup+iw8yIAlwSHq69VIblc4CoaMAs80OoNMoo62JaiZXROkq5frqr1GTuPbcImZVm5o6v9xG0JkSZ5oTfvmX/7+29ok8lib3m7w9ffo3iFyFtHBhaiKcgGxZ7nPzA28bXBcs/eoOZ3KAuzJ2+4IBLY1dfvoRcxESx33LnuAkUtDfWnvZ47NswstmzqOoYtdtfP1bBMjz1p7bqFHm8zFIFZR+OyxotlyKoVVMTVDtVoQy9mjaWRfftq9y4aoLu69Hn494ut3sDruD0gRwA8XxfbpyBJwGOWxS75Ah43p7y2TEWtfu1QE/KZRVu5P1uieY364pJIq6kbcu6Sujo3uTm8KXT3sS6baBabvJBtX6dYT2+Nhhp6vIzdKUbZUxoNIV8CIZV6b6Nxfsv6o7nzz29XlLFJqwTFhp1Tk//ulbVP4cXras+w9twztTtoQze8+vNGvcK/kEVWD3ip3o79fl2T4bUiQ+oGtmyR7DYREjnC8bTTCnJ22bKsw2us6eZM69vM3fxmyfzMtPu0klbqC2LaSp9u3Btm4+hFwHfgxxd/Nj41qzqkebBiHXeBBk/883e3zvGw/39D+3t/c/rd/yf3++ImPmvdQsSxw/rmQcbqIHG1O9FfK7U1NEd8i7UPsM154jevz/j/hDtO/vt6Rdm5MOvR2KKH2Z0M2O+weemZsA8CgOpjDtVnMp8VFSm+Ve5jWHYEjBtHwMvOfGMp1SnnAvTEd9kRLzhLLLpm6QEvYPb2c//AjZHvAmJvh7h/jT7AcISallS+p9ofCbsEJ98eizrsAmJnJyJA6jgfq3a0c3kxHALpnY5opGGCrct9l3Fo5gvzpVXARSadzaUaqSij0PzN3iCq15Rx1jBE+kvNDisIe781YVfDxSc+0RUayS3OxMeffKyUHs0uhh7PywSTie4rQu90YE/srXe44h2hWULcY59+ftBB+Msu452Dn//TMVDIMbLphkIms35dnlja3v9QBjLZ2rHfkF5StAOw/+eYDJdAHGR4mT5dAqAyNq71YB4d7ECg1yvTh9osuzqj+QCh5iMmmv5gtTrzDPjxEoX7FOdYFy+Wti99Z3GWnFi695X316+zAJkGQC9hkCkC8aWd1UDbnHYbz/hVhPlIWBJEUfN5OD+kqhGblVp32CwTjSl1mZbV461aCq2x45SSUYKXdjtJTzolUXcxgt+NMx0LyZBgGVlc9EfiHsEVv7Fvgpz54mZ/kNUw4BGIQT20zDiWe8OLjbs43lXXpxEbRclgRM9TKFMne9zCcoWer87hX6XPZP0DP7eI/Ytn/9zQJ3xMGRpla8z9AmRyopN11lqmYEHi6aVzEGaciHfY60/uEW1WxW6D1I49wKd10/nqa21mVu2rUtZ14eqL/gRWqZCH5e1nn2zKyda+EZP+geVIYYbKaBWmCMkFHwgDoqVCQlRyQU4bDnk9os3t4kDS5UeUK9N61GQyV+lFKmkNJwB5J+2NLTUSejz1F4Vtw/nucjmTqn37vlc/FelPau/5GP5dTpjq2n2go0eRMDhhmICSDZdvQQ1u4qdMz0HwdZdBnkefyBUKh/hoROT9QZeTTQImEAy4XaItGnJyDi4SBpeHzYpuHhQ3ZmE2A/uqD+Uyz8M8C0rffzafyJwsVvpTidq3Fp8O92aD9z9ONizCVIireNclhV4LBCUwFcJ3RCq34ONNrp/OZ64+H4oRaM+MuNpEnA62EvYVK3E+RrCv1ibzWsI/8RcFb/Km+gossgW4/3GQGlvbH6wvwBmT/o1c9d3sXtGL9Azrv1QKfhUlE/EYsim8mhP5ZEKMx0Ki201BobpKqrqyT1FdpRnTQIisf6JHdWCJJUSlevlQspL0NchdqbJt+tbTD8SxBHHRo7/y7IzPsigqpbd/pCDj2p/iSRFbS+/ZWh5U8I93TU/ccAufn0q6KiNfe99AXyxxwyP9vbPKhD12Vzo7U88Bz/2IewTmGIZIegg8DI2k1ny22G3l4+GQxvn5YCCMRL/aLzpDQS6gYSeWOBwwNb7VqX/TFmnONbBK4KQ3F7buZKmXgaRZkiUYT+Fgp89pBo+jRkcc6AH7eWKJP3z1wxfObV947F1TW9124RLIxd5ixZxU7RlRIumgz+cK3Eg4myvUc/1H8QOa2++78tTll34AEPP03OzwYO2PKNB/MhceuG3DiJcTOJ7nbWNfDGjRgUL7FqaP2Xou4kYhdLGeYzdlOPwWjjgdfCjo5lwhj2gPBkQ3ctg5l5P2zZkTpJa/OP/ZcWSVezMwl/bSc0QDRlJgzQFs8A1hNz7+kas+FQx3XMwTfrp0Oc4s/vnJuIQfexL7az/ACU6UL92Z3TyQh3Dhx7vmQuFbAVWjtT7z/5I+84Fzr5A8+SbMf5SdFtLqY2/e0lP0WtAQH+2XXBmk+bGL4GjrIuZVe3mjqxQWYx+7BlztbzwhwDhwbp6Fsb9cHTD3j9DSqFy22WxO0PFE5IKJzRB3Bc9IfvTAb7/1Cr9f8wbfURr+/T4pbflcOhbzuXSvRPjwDdGhzpDkJd/c5RM5OZ1/u2DhLZ254O333fjbkCbaN/7iTzbv9gpEDiztVgjBcnh7tC+oEI//Pk7cXlwoxikcYWen38Vn2d2LeXRUL7AubntK4e28lo9GOI/gduWzOckdi0qRUNjrkZxu4nJiU5WC6RTAzJm3LmNcpZm76dbp8RekgfWbi8B7VFgFGbuVcX4kH/J4E1ZlsPzkDxbua495RqPajddOhwBpZnxB7434lyQbrLbFUwCcXGODp/HZ2gQkZ67keq+AR8t2ezJGn4TQOCOGeZ7HlwuUjpDIygPifwdfTs+Gd57DZ0cR48tvJJthHEhP0Sm9whCqNeSh9yQrshAJ+7wAll1OwR3xSpYw/EARkORgqY3TgWlhg+c1KfMWtjIXWa+ErYZ1wQ5MGthKTee8qqgazPmox223uQBxXrpLmqntnJH+lkTcASyMBnPR4vDAsZ21iU+fPv1pfMtlLjKzb10bvuX/1l54dkb3SbY3XouXF8y8PPlP4OUzRosJfQ4O6zhR07jzs8e+8/XDz+x65vDXv3vZZ3f98pfY+uo/wJ9Xaz/95S8Ztomfewl/GdZmlD2ni3q0vlGANd35uOp0WDDq40dDUpvLKUEWLVWruG1Z09n5TPxyIUdX8XJVlV0m0c/ObxkZDxiArYtBydcLidkjo2gpsdQqCahcRUR9eGwDvXLUt2tmqyJEeznMOxcXVJm2nyU+/GBaJHzAp9msDsdWTtQHdnQmItsi1oes1sRwpehW5Ooo4VM5p6iMVANexeK94dKg1h4JWOmhTfiiaLW9DVJUq7o5mqr3RyPW99K4bxDLjIPkZPpUOxMTTl6Dnf+3cvP44YsXaksHjMKU+2uXwb+XG7iMycDOCKJgScazeLEGaRUf9bREiVJmnnttgVacGHSbBFuJ+03MvN9oFCy1KnUbsmZsE7Kcr85I9mJq8ninhT46xCQ+2blRwu3ZYDEd3OHySJa6H/0O6HNVnl5YxtOv6LP6N/L0ht27Syq+6tDLPzvyt7TW50e1H9dq+Oy36vz8L/C3WI/VfsDytAbXAq9BiTQ9BU3arJJEJMDxioxZi9Mybv41mfmVVbVVsF4aplvEPLHZbWNuJ96z8MlA6LhPG4f1u2DzoT8DnT3zlhsOHINsqdmrTX6L9cOZeXlWG8SqD5meyOvx8vV2238rL//QwqmP/q9rFrjfm8QP1I7C6l2C3wdSwetmf+zLrDfOxMsLLV7eCIR1Xp78J/DyaoldJwVyLfxs166f4bMvvFDjX/kf3gtu6PEfQY/LOHmBcvL1ajPQ3n+ck6eQ4iMLZ9lefKZ+P9L/9B70/xPvQDLuy/kTZg/n8fqtx/AyXp/8x3h9/MTvL+BnRkfpdTe/wX2mHKzxRvJtdh9qB+pHV+llXK3qA8GMRQzyxf5CLOrzih6hIxF3uwTkkvorCcjlOiQUBcDi8xKIgeaKCyMHp/7GxOSbKi6q5ilU2eV5LL71VBoZGCXzGxwS5fKl1i2iRqMKtRe8+5pte+wwKwuR/fq6t+8ig9ds69k1+7ZdeXvi5mtcbR27Hs3KnNSd61MDOXvf4MlQKOpNK9pgsfDkk5y4p3ribRtGP0Zuw5bMg/f0ihJ3cyG30NvhFNkZ7W9CX/IGyEummAzncfkCpZ6FOvUsmbh88p/E5eP3LNBMYx421jM0t6A5mhEjO+HT74FMAXQY8k5asWBzKjKEcMbmwyYKaBZKNUtet8dhxwHK5pNm+aEh1XBTKm35Qba2SrWCl678EKb37bDglKJ3v1Ey/9aYb8yVcAuRhQW/K9W52FbBZx/pd8oE/6jG/zXkZKHZT7Ti+veZHg+BzIzDZ+ozdryhTkOTLRKfrE7ir3ja/WtqssHiH1/48sLSfkOR8MEzVbK15UZAJie6Uu9jHL6FYiFYS3q2IGB2R4HNSe8BgmTTqsgQIRz2umi21yfxi+aAu5LEb4jXXGwq4k7LzNKeppSNJSfsDDQPctrZPUsdjDO22JFF8Abpo4UEm9VuY23oQS3gBLxkVditReg86vi1WHy0KoGssse0GUfN3tY9JGnb1x+LetunP/rqrV+/yyVPBWMx9S347OcxFmV90wMg9y3g01ybe10+2uzE1v1qhuf8KMT4e8omagFNCAV53uO30yp3mxX2sF912CUlGKAmHNJsnOkylV/F31tX4RW9aoMpSTdJEqOQ5aEPPpLK5eKRVxfudisT2wOn8Td20Rnw98/E22jpGiVDMO/atA0wsEStxchF8N/BKwfsOvpkCLrrJJ9FCjjpBCB/xVLAr0GuCEAXO0D284n7YVP1W4u6X22vafQR1+ySZhO/g9MPfSCyLteGt+778cLd7Qnfbt/N+Oz/xtiejK9XlN7dBoUT9xbm2PM12gAz/IT4URHthXyDPtEz2J7NWBWx2G3FKMhnAAAVu5PxGPaYyc9WpeyK2uTMKs/19JbKtMeMPsDPQA5x3Nc8ecC5HtYyVWpUsKc//dWhWCRQ6c6L80RwdFcOFkl4prdwvzPWnnRK1rcF5uUtw28KQNT/Ks5Nz0MOwqdig5CqlrtKIserE+tu+lqBiOBjSeTRqYnb3GKmcQfmXxMf2FcH84i0elXpaFf4dCjo5+htVxlJCCF6LYHkCAaI5scOLLQ8oonAb3YLmfaHtkrlqpeWY8eJUYNep+9Z7tVgctltdT5J/aEgO64+oAWmbxrWTx2pDDhtwuzCwu9jS/LEfC7+AEBnXEimB04A9JVvvAMQdKl/qNj1CsD+BX/02vXV3X/zIbviN/LhNrDBz4ANqoAS6J3pFMu6g/RxuR63EI/5OMhYJVcsChN1u4jXw9C08nrEvOkBvivBbCldTRntCCOYEty0qaKSzjlg3hAMKrdf9FaXVdF6vArOZ3b/YuFwR2EAQIhn/3Wf57HV3x3KKEpPT2eNf/6npLvb5an+McU5YZhDnDvAel1oTM0bZ/T0vgqK/xSZt1pY9wd9uIRAT1KX3XbdIveWP06r2XW2MhLQbC9X75j4y8ULjh1735EjRvPNB1mjw1pN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+WvUlAuWtZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZry/9SacnzuJfRDbhq3L3/WH/9rPOuPS6rJIHfg7O/i9lH6DBQ8xZ6B0npf45kP1I00ssQV77vaEx+wSh97UvPha8tleIsj+EvoefJl9szPMMtHIezbRIFVZNmsInsCeDNlKQ6bilxb+coqKWi6Uu6vqux0p/T8gY5qzGrpxV86NTTmrspBT4ZHbOxPwdi0to+OTTkDRnTytA6RFhIhgT6iqOnmi6albWluJVMAvt1nPJMwfeRAtaO3l5y5uzAm9zt76jU3R86dQM+jEzDnGT3I5oypkfFs2pi6a9PDvYrFVQZdOeFqieYZDF5WYFjM2eZ8djvXe+Ih16i/n/PYtTZm41vxl/B20LcdhdERvZOdVztCQZs1rPo4B+9y2ilzCLoPh2hVC4RosHKf2FoCc88BS761ZdkCXu0puml2xlBfDW3ZV48f8HqGk7LU+2jjBf7S6XQ27anKoYSfv8L02tAd+gp6Hk/+x+3bazwFDU9egdD/D8VO/U94nJ2QMWrDQBBF/9qyg5oUPsEWTjoZSxYY1QLjBNS4Sb3IiySQtWKRDW5zoFwgp8khUic/zhQpggPZheXN58/MZwHc4gUK32eGe2GFEIXwCDeohMe4w6twQM+78ARz9SA8Raie6VRByGp+6fpixfmZ8Ih7n4THeIQTDuh5E55giw/hKWaqQ05fjzM8GiaqMUDz5pc35uwMCZC7/uybqh60zrWOs4zaFhYtTnwHtpYwlGx7skNTEnfUKxzpMByNna2OrSEUrEsqDgc69uw0XLRh3XGOY4+n0jOIJWmkWDCG/m1bYUrvDnbfGL1x3eAqb/raep0uYv0jyfWc/82TYIUIS9YRv2h9PU2yipZplK3/CPMJOt9g5QAAeJxt1FW0VkUYxvH9/zAA66jY3X08+917Zva2u8HuRM4noMTxiIGYGBjY3Z3Yii2oCHZ3dwd2Ky5d63ufG+di1nM1v6v5Z43svzNtVNYn+59D279X1sh6ZFOzSdn4bHI2OhuTjcumZBOyidlYGvRgOqZnBmakJ73ozUzMzCzMymy0MTtzMCd9mIu5mYd5mY/5WYAFWYiFWYRFWYzFWYIlWYqlWYZlWY7lWYEVWYl2VqaDHKOgJBBJVNSswqqsxuqswZqsxdqsw7qsx/pswIZsxMZswqZsRl/6sTlbsCVbsTXbsC3bsT07sCM7sTO7sCu7sTt70J89GUAnTfZiIIMYzN7swxCGMozhdLEv3ezHCPbnAA7kIEZyMKM4hEM5jMM5giMZzVEczTEcyxiO43hO4ETGchIncwqnchqncwZnchZncw7nch7ncwEXchEXcwmXchmXcwVXchVXcw3Xch3XM44buJGbuJlbuJXbuJ07GM+d3MXd3MO93Mf9PMAEJvIgD/Ewk3iEyUzhUR7jcZ7gSZ7iaZ7hWZ7jeV7gRV7iZV7hVV7jdd7gTd7ibd7hXd7jfT7gQz7iYz7hUz7jc77gS77ia75hKt/yHd/zAz/yEz/zC7/yG7/zB3/yF38zrZE1aDR69us/tNm32d7RGnlrWGuUrRFaI7ZGao2qNeperXc6fOW+zFfhq/QVfEVfyVflyw1zw9wwN8wNc8PcMDfMDXPD3CjcKNwo3CjcKNwo3CjcKNwo3CjcKN0o3SjdKN0o3SjdKN0o3SjdKN0IbgQ3ghvBjeBGcCO4EdwIbgQ3ohvRjehGdCO6Ed2IbkQ3ohvRjeRGciO5kdxIbiQ3khvJjeRGcqNyo3KjcqNyo3KjcqNyo3KjcqNyo3ajdqN2o3ajdqN2o3ajdqN2o657+x/s0Mw1TbPQLDWDZtRMmpWmtFxaLi2XlkvLpeXScmm5tFxaLs2kmTSTZtJMmkkzaSbNpJm0QlohrZBWSCukFdIKaYW0QlohrZRWSiulldJKaaW0UloprZRWSgvSgrQgLUgL0oK0IC1IC9KCtCgtSovSorQoLUqL0qK0KC1KS9KStCQtSUvSkrQkLUlL0pK0SlolrZJWSaukVdIqaZW0SlolrZZWS6ul1dJqabW0WlotrZamlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSUWQs+BQ0Z2DbKY2rqa3YOHdw5oDhvR7G52tnf8A09xf7QAAAABAAAADAAAABYAAAACAAEAAQEPAAEABAAAAAIAAAAAAAAAAQAAAADbY/02AAAAAK+ENl4AAAAA5F0LYA==')format(\"woff\");}.ff5{font-family:ff5;line-height:1.089000;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff6;src:url('data:application/font-woff;base64,d09GRgABAAAAAUeYABIAAAADU0AABgBiAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAFHfAAAABwAAAAceaeg1UdERUYAAKlcAAADBgAABKjio+5rR1BPUwAAx1QAAIAnAAF9+vufdwhHU1VCAACsZAAAGu8AADKSEOAMYk9TLzIAAAIQAAAAXAAAAGBWBNbOY21hcAAABPgAAAEEAAAB6nkd4/5jdnQgAAAPbAAAAQgAAAIkPR89E2ZwZ20AAAX8AAAG0gAADE2CFS8zZ2FzcAAAqUwAAAAQAAAAEAAUACNnbHlmAAASDAAAUUwAAIhE7ArS4mhlYWQAAAGUAAAANgAAADYDouiCaGhlYQAAAcwAAAAjAAAAJA0CCHBobXR4AAACbAAAAokAACVkXHgpDGxvY2EAABB0AAABlwAAHBhsJoz4bWF4cAAAAfAAAAAgAAAAIBDNAeluYW1lAABjWAAACLoAABXk4dmeC3Bvc3QAAGwUAAA9NwAAqMTtLst6cHJlcAAADNAAAAKbAAADDNkw1r0AAQAAAAb64fyASKVfDzz1AB8IAAAAAAC55pg9AAAAAORdC2H9+f5ACCoGxgADAAgAAgAAAAAAAHicY2BkYGA79s+BgYG98O/Pv1s4tBhSGMQYkADLcgCouAeCAAABAAAOCwBhAAQAMAADAAIAEAAvAGYAAAJCASYAAgABeJxjYGb+yrSHgZWBg3UWqzEDA8McCM34nSGN8R8TPxMLBzMrCxsXE8sDBrb/Dgws8QxQ4BusoMCgyKCg0Md27J8DAwPbMcYDCgyM80FyzA9YQ4GUAoMZADc3EPB4nO2XS0hVURSG/7PWOkd72aQGQUQ2yNBI7EIRYreBDQp7EDqJIg0RMeKaVKAFQm9NMicZ2ZUgexBp0CDIIo0sGlwHUiKYjxpECOUkw4Jyt87VaVpw8zjYH/z8/957nc3aB+6+HPqMXCh0D3BeqN9AEYfwhTNQxRmmyOk2taqf3Gcq5AoOq1ZQBtbJiLnuAp6UodKNqFertqvGUOWeh0ft8NwcHYfheRdBbh5ctwSV8lLnU3SezHd5g3Y3Gw90rjPpCLqkGY+pxxyQemyTGoS4GTv8zBPIo3qTJGfNKWlBiMoQpkId79RciJA3irC0qfYgTxrMMN9GmGvMTxpBRO7jqAC7vUwU8KCJCUwal6KTS50kfw+M//pBEWcVRbBP5xdzqXmtOZ0iptjNxTP/3fjvxWJJNHQI4aB7CAopN03SCuIY8mUYJEs0f1PPR76rma6pas16vRuIu/T+6NZn2lRRrT8Iiu/RrGu3zKg+U633Qp3+/k94jTgjG02rrMGxoM/4t/hnDbqH2YSL0c+FiNETDPiZJjDgGCTzfr2DKxBzPqLXGdTxBs2DiLkL0ctVqk14xyVo8veg5+ilVtyhHP2vqsQ4Az1yDm/pE05rTgv4iLMCpTupk2nipuprsN38G5yFFs4yl4Luw2KxWOYqvBJL4z5grk5XJ3tRPummf9r9tmBRvG6ZGUpUj4lEv8GyJ92MBd3LTGivr6a8+k81dFm/MS2WOYysxQKqx2ZfkmoaZ6rnBuziTkR5Nd5zn/pW1XJVHYaEEKUURON1T9HE8xGVevVHqg584NqptYda14HjfMGZx3cd4pOOuJlOcnytwPm/B7ZYLBaLxWKxWCwWi8VisVgSyG8OlLRYAAAAeJxjYGBgZoBgGQZGBhB4AuQxgvksDCeAtB6DApDFx6DEoMmgw6DPYMhgzGDF4MkQwBDOEMkQz1DAUMmwmWEnk7mCi0KdQqNCs0Lf//9AfQoMGkD1elD1jgzeDEFg9YkMRXD1tWD1vf///3/8/97/O/9v/7/1/+b/y//P/j/z//T/U/+P/j/y//D/rv+t/zju/7l/5P6h+wfv74C6kwTAyMYA18TIBCSY0BUAg4CFFcxkY2dg4GDg5GLgZuCBSPJCKD5+AUEhYRFRMQZxCUkpaRkGWTl5BUUlBmWwrAqDqpq6hqaWto6unr6BoZGxCYOpmbmFpZW1DamuJRU4EKUKAMiMREN4nI1Wy28bxxmfJSWS4sNdPWzT3jSd7YSKk5XMNE5aRlVsVuTSplgbetDAruy2S5ECKJ1ybIMWUE8yVvojeuv1o090TyqQQwPUQE49B0GPMWDkUPSm/r7ZJU0JKhJidzjz+x7zzfearfp7v/vtb54+2fG9x+2th79urTcf3G/Ua2u/qt67++nqL1c+qfzi5x9/dOfDn31Qvr285Lz/3q13F0vvqJ/a8idv//gt6+aN4vVrVxfm52bNH10p5HPZmUw6NT2VTBhiyShSsea5B3SjFlBe1ZUpKf/o9cMyiTnLVrPyTtlfjrlo2iEx36KFDW8gqhWfUs5FlkeULJnf2RB+aEmXpkp41HqnR7e2PFuZ/7LGdB8ydLPm2bZFiRKeJkh41juyR+YGcNuKkCaJDY/f4dk3FYCiYvsYtzx6e7T0/cuMfCHE2ekFMx8ZoTnI36jVSSwMRP4bEleZ7XVFkFilWw4MMTHT2kSZjIXvyJgn4+pDmHx+Cxb7unKJD9zegXJ7+/BoL3jj09eRR20ZynDLm72DqTa6Rf/Y9Aa5bE3V9rIAhAbEIJsDkmMAKj4bGPm7hp4k8u7KICEyBbhvjs11+T2g6nGAiarDb6DMv6EMz05PJkkCYqPZfDSLjKBUjdKREXKfqh0Sx3KwdBqeDE2xGzj5nup1nnqU7IBhIJIlt9+mt1obO4CwFd6gLzncdT1w8KTblyHWzBtgVHUO+jm8198LOE2MQNVBm6l5R/apRXP4d2nWoQLYCp//20qGbnFf8jIMjyT9BeZOUG0ekQRFmB66CrtBmXuwxiEpj8Oms7HZ08GpHnckHe4eRLnXORnlvx2alP+PjeggPpDUgrEre8EBm3zQ4WO6BzI83tNHPdFHQ75K96DOLwsi+8VjSO94bl+5bzbEwTFJli7K2jbdcFgwDF02sdOD9ZHJILyxn2vCcgzYU6NqW/+Jto4Bdqx26n4MxQw7LMaUoO77dhR3sFK6dDR9W8mQNaZLtOCY9hegnS4vtbY8t27p01Oi5n36qmi9wry1MYaNInjC8isr8lFrW7U2oyzoj4agHRVwYhx5sMb8WuvLovUymj/1GqoRhGFDyUYYhJ3h2eGukqYKB/l8+JkbSF3+BvC/HVvUOPHJDPrGio4Qq5Oce42tFs1vPuFQNWS/EzWOe8quWPbsmGfj/5HjmkP2owa45kLzW9iWR3eyZINbzRAdwiKzwiULgx57qImuzl89oFa2odziqkn6JXd/O3YWMjNOHu6BmzEKJbbN9XQ8rIpdLOhw04vWUuxaz0W17CCOAVNOR5Srj5lyOKKMxQOFuBVb29+T35O5Hc6qOflJWftft94enbZxxv9WKFOJQz9f85JWIp4lrCTPsg5a2Spdd7Qg+wQdMzSV/EqR6dB0zTu1Vn1pzqLVGeB54HAFoaN+pb40uI+KBZOMVTKuMS7QV3V7T16vgDhOJOmGQZxpk8eKL4Ne//KzgcdUOJ4V8c/OKT7hP3V7i7t2qcF1ZdkRx7pPV7g305Vv9QB7rZon0YlQuZt6Il3Z52CTDOq6JfjWJDw8+zqocwuEycxixSmOMXLt+VxbXvqhiX6IRP/zid9fgZbq+ziB/Bjb6mppe7GXKlZcUbxXk49ynj724ogHwUfh2fTBzS+LSNSbxVf+ZS5vtc+tJjbTtMq4M7Q9ajgj5dH6vmNNLh9cIDdHZLSPP1mf8zWSEGsDZTzbHFSNZ9s73gtTCPms7T1PGIlasOYP3gHNeyGFqGo0wSiDvJC8EC0D2p4nMprfelEV4lBTpzSg192hITSWGWGG6A4TEWaOsASwqQiraiz6qnCLfbjAUwh6j6ob3h/9fhj47GxxLUpAZLa6Kyih7g6MRCpPWbW3Rjm1xvg9xu9FeIrxtFpD+qM4JJd6GCiUPxqwJyzD5xTmdEmU5PDsDB30JTqvTanSU7xosDOOL5HF6+C7z28A+D4ddjtsB6dpknt5s+tTZqwQLE2agYaZWAM4GlqGbwEIdZGsHaWngFEchz75Dm/q7bMCKfE99ECtUGox0jm9yBuV/XBOfaivk1SJsqUj/puBbdwINWJhic38yEnpPCzvKpC6gYS3p0R3G8k4tchP1oqQPdzqU4t7+s1aMVFEFZQrZGnmNt9VaT3P3YZCPGnfj4zXq6OYAXublINFixOujAXgHZCabAueI5jKrH9nNZtDsaV+jxpko7WmNMhUKDU7aDiRfA6IqoyEoSujIdbxRYSm+eR5/UHbHp79Vf3BnvgtLynczh4nprDwDVkVfngRoCdonJmLaEHDYZgpXC4Q+StTGP8zKCRuEzgwtdjsHFfmPlr+HzBQf5AAAHicXU9LTBNRFH1vph+GzsyrlelvKC0US+0QwVYhDS92bGlczKZ8FtSaCCkgiCLaglGQT6SBjUaNFSuJbowbN4+4GTbIDrcaXagL3emSBWJd4au/RG7eOffcc5N731UXPn22O2rfvqM0PWOXp2dcr99QPXWV0sUJShcuURobt8tj43NX3PnJGqn23HlKw6OUhkZq5KGRwmW3K2e/nnDVX6Mwbzm2mImN+Q1micAvX6GiPoKtJbVESpslw917jKLeh1zWmd3Ksr6sgKL63vaLU95DUR3y6tmHUGl/DB8UGcW5cjgUNa84VhhrMaZG3xfh0yJcmIPKjVmjMrvY4F0uQGWJYrFgVG5SVBW4dpCQ2yVnmyQdl2zHJBSR+LDEHZVMrRLbIoEjkg6r1UjiRH2gSQw2IRSCwfKeUv6Bdr+LO9/EWHm7zMR2YEgRmxXU4Bcb/ajOK/q8SN/bVLuMXHUUWQ/wXLWFN5mreNZg5AFkeBM76LUgDTEW0AE62WEuzy5xz8Ez7iPiLMDCWlAH6ODSbIabYvNoFaxyJbTOfQDiOhSgqNqQDD2C0+wWJKtDsBlqBO9JEQoAAkDZStFCEaN4QvESCmrA1IxDOIgDuBE3YB+uwzJ2YgnbMMIcNmEWA5yK9EJi04DWGycHIc09cRJRNJ31dZOwohEulelbg/B2mrqEWdYh6CWGZZ2hyZY4nenToavSLsjrAEJAtP7CrbSieMig1tNH5j1pEq6IO5400Ei4i8j+uLI/cvk/afJ/O0d2kqScHB0gZX8n2U2O0qKf7Po7f3VJKEmakwMkSL3Ab+9fwL8C0Nl0emVBPkcn0kc1cZIYvXP/P9a4ysGp7jhhEmc0MtitETmV6Sduf1wjr2jVlsoQ3h//CW2W0AcAeJxj7WLgY2BgDWUQYNAGkwwsRiASApgfQNj/P/yfCyIhbAaGf0EQNipgq2UQYLb9/4EJqOv/AqAKQUw1mIADillAnP04FCUwFOI0II9hBcNXYmxCBYxxjLoMDxlOAHU3M0oy8jGyMHwCi0swGjFqMOyDK6xjKGU4zfCLYSXDZIZahgxGBqC6BwxNDHcYtgDtRriinsEJCBkYohi4kGzRgzK2YXHCETB5B0yWMPgyTAOazwB0Ewi8AtqBDXQxzIGzYWYuYGgDYgaGDQwpQNshwAtVG9s+Bg6mEmD8NALj5QHDKYZNQBeHMtjB3WnFqMUoBwyLKcDYvcHQw1D07y44jl1YBQHj+EVueJxjYGDQgcIwhiaGU4w8jEaMPoxZjBeY+pgOMPuw8LFsYjVhY2G7wz6DI4hjHWcZ5xuuVdxe3Dt4IngleC/xBfDd4HfivyOQI9AiKCa4RchP6J/wPpE8URvRS2JhYu/EF4i/kdgk6SG5TSpH6ov0IhkrmUOyMrJL5KzkHsjHyC+RvyH/RcFOoU1hgsIshSUK6xQNRiFJsGBA4QOlAqVDymrK+1T8VE6oJqguU32jNkHtnnqZ+hsNG41tGts0gzQPaSloTdB6pp2k/U0ngyawboDgO90E3TV6Onrz9AX0lxkIGIQZrDNUMYwy/GaUZHTI2AYIJxn/Mgkx2WXyzzTJ9JKZzQDAOCBsMJtHI3jPXGEUjsJBBQvMCywY0GAIED5BhZZGQLiHivAUEN6gOnwGhF+QoVXZKKQyfGVtY91nY4ABu2y+2BrZNtm+sXOwm2UvZR8GhLccJBymOfxwdHCc5TjLScgpw2mdM59zlPM+530uSqNwFI7CUTgKR+EoHIWjcBSOwlE4CkfhKByFo3AUDg0IAPatRtgAeJzEfQdgHNW19r1zZ/vuzGzvvfem1WpVR6tVs2zLTbZlW7bkArjiSjGxMdj0boJRgIQSnk1JQgvEBEJI8HMaTgIhjTRISEJe4oS8JEBia/TfmdmVVrbJe0nI+1kj7exqZ+855zv1njMDCFABgFgrGQIIyEDqCQjSrU/KSOZk7gmp5MetTyICPwVPIP5lCf/ykzKp9nTrk5B/Pa/1aoNerbdCeLgAHOcukAz97dEKeQLgU4Ix/OOJ6nn9rBZAhAhSIkNSQvb4PilCoCNtmziegWlz/pg5l80ooN8OkV9PPMG99cjelspkl2To9Hp056kfcq/CFBDOeRI9jj4uGRfOGWG1EhkphQgQUqmCkEIZgqAjfyKHT6krpZkTuTz/fzbDn1TCnzjx1I1lYstTN3dJxjkr/DXkf/DnhWA3Nwe9JrkbOECcNQEHcoyxwEHRiB6jgIOkKJeFTOf5kx4DHSfjwNJhOxnHJ/alYKFBrys28o+8zCeV4QcijAYXzBPFm792Xmv7wv6VQxde+rB1/mWNvW2V9sb48Fxuzo7Xbv4RNEPf0ftWDcVT2zp6Vz39Ve4r3Nv3bvtInl/P5Bg3h3gOr8fCr0ehRMoxVuEAFmQZA9BCkgaDTcHTmJ+5Hn3OBY0GJST9xRxekLCuQkMK+jm8lFte5H78a+vsixq6NmYC9nh0+VzJ3Xgdf5j4KHfbY9uK7ALoPD5+88l7z7+oKPBk8nruR7APM14NLKzqchmUqR/X7FMDefpYDtgY7tgIZgAlkYXbiSLsI9T2xMqL5lf6h7AcU+yGtfPXrMyvbLzsPy8XznUa/+jA50LAwCrA4/uggAYseZC2nRQlBDuwxGGqJms4uZ1bQG6V3Ik/Y2fVCEI7QJBASELwlGvz2jzo6BBQA8mtp17+OlmQ3Pn+c7JuQZ6bAUBfkawDTnDBE5DoGlrK2q2AttlJymCzZiwWm1zBS0omfbgis8kw/9LxuBbktbqSJW37mq4koPJ4NmNnDf/LDwxDKS92s8xbbEdFPeZ7yO+joCwM81IZ8QN9Ys1q/emv6zeN5T26W1UWoyFTWZcnOq51+GDT4mA4qoXLl0t0oc55xE05t9NGB5rOh/EN92FaXJPvkKswLTnwdpWWLkojDwJr7Aa59gZMmNfbYKU0wVAoiIL3sqEQaXUCO2SQ3bTP5ETOe1mTFSbpHH4lR+4jkyh5L0vKRMwAm4V5edXKEV1p5pG2hOUS1+pACbPCIjLcNvHaSea149pSiedL9t/4jcP6YjvMC2CmCBqKv/2+ULiYN+Vz7VjnQnFYbCdEHhOy06Wr3ty6dnxpae21g8T2A923v/zRtT+aVbhP+enBSzsv3jVs3f3V7f0VT6XcaiMtf8ikiruWzL1s9YBD4/zY+SvuvaI56f3TKyP3Ltywdjta9tDO7gFtbkkPj0EEMBThBHpDsDdykGEdxONoHhpFWxFCclqwYxjJBCEjJUjKG7K0OcdDuuP4SFrEtWDSIJzA4N7JAxyiB3mIT1zP/ySeBMTkPQCQ+yUrgA/EwC1VCacCIOrR6aPI40kwfkjECEIbQ/gZggdZv1+rUlgdSK1SH67YVTEtwqzNp/MYkOYqIk/GebGZ88w1L76o1cESfoqf8XKz/CPnGIZeGYWMBgHVWM29ehcpPi80hIPecKjQUPQTJ7ndlNlrUw3R3DLaX8gkiE3QEyeUjDlgoidOU4m8geCegd0kAdXwiDXS2VWw9KnKZXmoc5Bcceo7bb05nw6Vyyjc1RpPf/+dfYvYLsxxKQCSAPYfPpAEzeDbVc50KKV7w+HWFLWXbWxstTcnU4mUI5FCdpWyOZlsRs0H2WTSlzVlUfagiTWZD1dMvhiKHfSxPu/hio8nU0AdbzXT1Wc86iwzAF/HOdtJzI70yRzPvPCH9yXDMGcyC8iGVYSTfoHJgukIF6GIc79PpsJvY9QTAurRkps+k09lu2/YQaw8P9S367JHL5p4k4olPcwzmnCCgp9dur9n0/aezPqbjMuZ0cvmxDdsvF4yFAp41vWsunF9UhW6drhy6cj8uLmsjs3pR6WW5lhYWp54ZPDG5YuHJFxg4lICFpYf6B5ZJdjRS7Ht+SG2PXHw5Sr/fQSwWi2WJLOX9dgYythnc9IWaEIWg9OADAdZpx4cnXyHNeB3QBQQ+B1CGpUi6UE2SlYtgIU5jlVeW4rXHelKGLGYO4JTOy4w2/whn34Ya2IKmxGpDJtlSnTSmMnFPKIgNi4Yyo3YdOdzJvKH7H7kYouJlanCqpArb3TPqQxsnBPcz469uOW7b6kNsczBZ7576Yr/kDRwPx5elgzHsh9bO/+bn+patKU1P7qI+6HD+psflZdcfen1L+9nrULcwmO5B2MZxxfg8ionA8a9bCCQlDrjSALcyH0QsAAergB1HMUPqlm16nBFfU4kiQDVlQTXacff8A99eDhfhzIvD0IkgC8smFYdjhcwj2TSOkzdcctnK4nzFiZad33ywW/eNJhyXPHcbQtT8ze25uwzUGRzGsrbPzF21Z+/dcfC8G7yvFdgcvz8GxcHCTHGwjwg38I8SEBTlQMeRkMRwOVyOlNBo9wkw48QCsqNiGEV6j7GqDk6+SKbx081xoOsXJ4wAecbTkKDPCbkNB30sB6sbB6awG6GSCRkSHYwwSbihyuJGYQzx7D8ReonjscBDw3RvB2PM8fjZ9pJHnzHcwL+VP/HCxHxiVW8iko/jtzEI4SP6m0D+VbvPomtMXtqww2RYtq8ZfR8KpS6+aI3E9loY8Fx7YrT/dPSkwxxL6ya7eM8trZGbkNzu2Piv9S20pI2bnyG7Kry+QaWTxyGqvJZG/IHzFjXqbgLR1KAdiLKFUd0yB1Khx4LfTEkCcWBn/F7/Pf5H/dLFH7XQRbEPfFMnI2Pxm+NS9UoHncqZEqF8nBFgRlg2WdBFLIYjThGOGhkjYbDFeO5WFQLrPABzhBWjjDHR86SU1VIC/7/LWgY8kbEVPWNNYU6lwzhf0pJlM5RE6em5YKeFGX48y1Xh5oy9i3rz6dDkesgZXP5bakQ9ob10hFFqHZ3dXDlnoqrmrNMviMB2DY3gu9U5eX3uDSMRoNQU2ova+QD1sMVmczBZGmdjndVrE7v4q2nGVtPV+ByDwQeSCGPwxFAgYOsY9qA8lTzNpM/xLTrSjzx/DNeCqKR1pWYY4IETP+W7xmGgvvDDMWmGmtUWCqYaB1voM0CW3kjJT6wEHj/WERhORlKUfBtKhxy6eZcX9h/86tvtm64+VNf2PzaQ237g7PZjiLbVC40xwILF+V6si4F3BHMGqJRabmsCfYu5I54ent/97PN0PDmkc0NJe7nS8ZiNjc7cMmVj911zd7L/c0D4aodk/wc60kLeKbK99YUTaVBugVRVJs7yWgTWq0ngfAzxNzGJkO25G2ZjEUpQ3abHePOpos0FFGwgKPnw5WQADceX+Y8DsCE8Iu31h8UwdnZ0L962jNw60XngrHAdW/9EXknBjEGLqcQQLyIW7poxguir3hPeN4DH+qpOxRRzQNZQDXcy11pd9a9UIO5cMC9BNvqDqd8B6Ixz+1gWZXnFpnegKQGg1NqJyBxuAJptQaHspoa4dN45ZMXc56HKv13/3Q4Cs/igMgaeJpTijSqQ5iod8XnAvVnr//0V6rE1rDyJl53DzhaXXfRqKTtXnsMxHvi8eYeVLLb+0rGGAViCLCxGOtssLtyqNBQOFxp0DBl1MF2HK5QrBCeC2IUVotj9LzgPE4I4eQ0mQJcoODFeIr9//KZh8UgCf+r4wvUu5AAGF5H01CweB+EIiJDhyrD64aHaJUnSMO3aW9uYBZ36Du2UCBk1nBq2m4yeJfrvUE/vfADAUX8xda7dukFQbvZbyfLFZmlvZf7j4n3O/qjeklnGZmsloGh32WTOu7qDwZWDUecEIddV5VHSCal7Q5ESaUuCkihBkkVCgdyHFSwgpMwG6adggiVGa5BLDVpeabx7Lb/E2cYDp7t4EXwEauyjYlCg/3a805vqeOICL/vX8z4Wkf7uB3nQGBG0Bkcdkl/hmltB09UaS0BSDgCEoXb4ynKFXZkNrPBaBMqQg+rMPR5PO05Rp9BeV0ulz9cyQUd7WRbe9vhCtFewwgms6ot2mqWGM8LpRJdSfyBXxeqA75/7ZTDUA/rFbCKKgxCv1QG/SgFw34cxJ8Lc8Sv58IfwlfqVLSGpxV0U9CQbuQ6HihrNCRDJXRj1fdvqw+XTn8Bdc1U5KrVerDyi48sHjn9F2J4+yMLV5ycz/XPeH8qkuJ5L8F6/zDmfR4cqvI+CUmTjTQkJQYjkssLdncKJUnSZIqEopHo4UrEDhhNnoIAYD6BGlh45mhr7BGeTXNbqxNZbftnzoITe73JnG+cCTiesWl4bsZCC/zIlwZTGmdatOxbBZ798a13HAk3LU+6+6q8vHWKl5Khia//+olPvwo7W0tTXDr1LPHcglu2wK7fXsd9/lz8E+u8OO/E+dI6oMdJ3vIqB22avT6fL27Yi02WGZlxaKdXBlHwIKucCig6qm5TCFHSJ7G3ZP7unw5L+KCincRJH58DQT6Q4LNAKFZOcfYtVUKi+623PbOvfvonu9/6bXTk2idPcCfnLcskGnPtF/gcRvW8FUs+eVUf84e3B1/+xddv6f39L0Z/e/LoZSW4+/rLTPam7u9dfv51s2dd/ZG7uV9x99dyQfK/MTYCIAMeqtKWzdBMmmFcaeSU7cXGOuekNZoM0hxkM5mABZs36+GKJZBG6YMBNuA/XAmckdtNlSJP1nk928mqQ+Bh4vmXTjgMc2KeiC29L4wT5rP0Duaq9TgZQur1xYHLFiUWjv/2NmdbtEsmPSP2ha3rrlySXLW2KXqZZEgqS8/Z3LP1iX2dEu5VTzp0VvA7sTi1+ob569YSEydm8C+HLduXapYtp5Sn23X6Nr3e24Y86b1sUxPryQFde7sO6Q6y7e1hu1XusDsOV5T2cBtqOxhmw6HDlfBMsvOiuujOqAbV8xIyr+WO8QwNfChnH4Yu6IYuAjNzypGezVxvzkUaDVJZsI7JN7QW9U7GmY1T3N1eq4cKNWfb+85m9Z/W7do4p+h88hnux2uuwJzcMNu2i9iWXb7kxtmdUWV55RWHBxaHuC97M4GzGK/yZivLmu58taM3Nbpv3tgoMfELvi7//uQ75BDWzSx4s8r9KMhQFlNwr0yWd+2lVF6vPcOXbjIkDXDcD5JskkTkQTapN9WyApOdz74InHvp9+ntyH6Q1dc0c6oiHD/jUFvS8s6GV+2J47lq9uH4t37bsN5F5HPCHkqY3+ppx0cmnH7w2Qefdphd2E6KSQhfntY/izJL+zbvjSw8b9VY5aqvX7P2oeG2/XDx6PrdY6uHRzPZ9LzegRW3rPjaSDucs3RdfM/W5uFFAz2PjAyOb2s12rlfbL1g25qePb3l9RfNPm/F4lLO5PA4oQf7k89jf7IQY94Dbq3xnAAut0kmNyMTAD4TrdPqDle0BH4VM8HlYWVmj2D5PEikFEMPE3cCE5dLnxEa42CxGr78E2eZqlrMcBl+H4Vkfr1k4eA+aClkhr9fTYBPUokGv+7788LZQCzv3D8gGeIOXTicPJ3iwzYBgNLI4CB6lbIm53TAIcGXPoZ9wYOCL91ey3NBKI+ClM2ONMFgQSPxIu9BVqI3JdJInzQY9Icrhhn5T9UrVCM1MRcw/q8+hXMl5PelsNKd4SoFJRUiY319okpe6xy79rNXDt25tZOyX1AXwF5DK4cXD23vttyhIPlXH6ESSTcNf3zNi9sa4suuGcletBueaG6Z8oYTd3cNR5etnHXdJuKT4aJZeF2TmNuN+fHi5F8l+zE/gmCkyg9rMEAzJBmmmQCtkypsODa3WMzYwM/MArHy8KEDNkBC4PA//DHOwPkqP08XEmIuUqTRCQ1mvcmYR58pxaghGj5Cu1LRsGXi9lO1kj8hoRNZI1QQanTfxpE2O1/rlzrTnfFTD5LJqWJ/iGXjJitnvH4Y03Rs8q/yGKapBHbX8G00JZLZXGNR7lYwbhuj1bZYbdpEI7LJlD7klmeNyONxH654qssWBMsnzFUqMaqZY9Vo1Pi/+pxYcsCaPkUyv7shxpuE+CINkZSGeSx1mNebDTIcQEm3JWJUyEvDh2lvPpUITrz0DgE1XjO38h0DYY2FaALQzqhdBSEJSYnGXOiB638EoUyT3o2+NbQp4ApYJJg9gdY53ad+Shx4pLO3N3P6S2Rk1eo4FjmpDzZbdnHXLtx1cX7LjcS3JrYN33jt6j8KevEstgmLMc+S4MYqzyKhgNeb1piNFKCSSJOknE65SaqQKw5X5JZAGBmDJpPxcMVUL+maq8cxYrXggK0B5p9Yg7f9w+fAGlPvv6qwwcbSbK8r6WD2Eg+Lzko0CS1XKnRWm9VCw9/Qcw2Dvyz6PBEa3kUbvPG5eW4P1DjzgSn7AGkiEeooujT4WLGwMMwdhLMHF8YcbsxJiS66um/iv7CfWsWdIuZP8vvHhs/hXAgi+EMA0qIpwCYA4XXc7yO+7eNO3XMPH1f0Y7+2DL2Dc8MU+GiVowlAILXGI1WpMuEDrFGtSaCYUnGkotTGUOwQqzVB4Lfb/cg/ztqZqonEfj1fDTLFhHoqIhUtj+ufPMswLJqng4MwvyMq+CSUz6HqXpGUqFkldOuyrXepVYkmFbevUVPZtW1Wz4b27OjBZzffkZIpcqWRW5fGk+XrFnnRQ33MRG+BNSUjkvIJculYpHzLlvXfe/ZAN7fXMxgsV57jju3p77viM3fyPMpjHvVJxrEfKoC7a3uVigNsKlUEeovHLzHqQwaGCaHQOMuYAMyjrCSLsodYCYOjHOcRvnbJh0SWDtGbVO2sUPs7Y1vD+y+caRiaeVdd3VbDnlkW5q03r8bBPJLWmFTbQYYy+CdNx/rNle6NHbHZG/aPLy5fwo5snjAqdM4EA0M7/8hkm4Ptbe5wiw9z7doFPtRA9i8MdN66Zel3Prl7XtQT6WPIDSuzJiujkHYyp16f1dvPWoqF8kPPzpnVe8Ujd/P6OmfyHfQNjK/AdNRqNkIY8hxg5ZC1OPug5zH8Z4DB3H0DkAoEfKQP+Q6xpMmoo81Qi8wOnQM5xlkdM2Orq7qVbmG+x5dTbdYT0zmQqMWZD/v0mL/8nhkPP6H3RYyLZP7GKRTiqIl4b/76V/eef7DfSFs88fwtT53fdU9r02eJRHzW1cuu674MKpasH176yS1LFne0zW/tOa9g1P/ZaOrrfIR7dfvz7WIeyOvk8xhvIdA0VW1tUtFGUygmNRiaswdYVygQSKLkOBtg9Dqk1x2p6I2mRtRga0ANh1ibSQkVcqSQH6koBLzMAEw6Hp8Ka85Q0tiHddqqVxGRd27tNZ9DfVdJGYXOhcEX33ZapT5DjVdhNR5eWJEq6/SY3GBdaanh75Zsl/ksfXZzH3cNhrrqFJoAszEmf4Mx6QUxcLqGSp/ZCnRXB4MJ6wEcAPqQeZxd5bvQR3T4Bn23YMj4aBdgrc4+4FnlvdBLAC/j9XiRAnn5XTJs6Pu8LoQfh1hkoiMoMs7STH3WzSMpjqG0jYeSkA3hp3V5+8Qx7Ed4GST+7757OFiHZwHN/MY8yfstIQMoBmsiQjev+821ux5cSOnD2U989/JD97TdzE18TkMFWtNLbx7lykdfSsdG7vj29i0L7t/aMH/L4g3jCzZvnb1zZTPZ0hHsanD3Lj8t2X9JvnBU6HGScZ3om5J7QAL8sObDgT9O2RiH1WlxJuLSuNTiRHGGScUd8Egl4biTtdKBkBebxaNQzWIr6aD0KsAwDGEVNytVesTox1kV5Anm9xnj1Y3Gmkbj37n4jIKxmNYezzPHhJox8+F+E9/Mg8SNdWwh+MyJ7+nJy/yI14FwUdy70V9LRaMuG20d2P3J1eHlzckrSI/PHPC5tdYX7F982nf51w+mM3ZHKFlKRSxfRWvKpNrc0LRqz0hcqv5qe4MutWRwy57Tz9//6kbNZrm17aKN6FJsPyav5DoFn14E/eCFKoeb1Q6DyuHykc0AXd1gaG4e6DzAGkCRyUiRdJzNOFTqXlRhKqhyCHseRxvttFpxTj/OWpkpta6ROeV3+GpurtbBwLx2MidWM3l+Bj+UUw+baykHMW09dHyblMmM4wKpDElldQ/x/cYibJxhWYjiuN24alXP1pXzg5rOC7f3Y4837/Yf3dR7cfuyrYuN2g6b3eK0YbFEc6WegdEbvziydDHxNSZXWnbr8ngyvnSsbFvobfZVulLrv/WYYsGKKDYu10HVi5vd0T6Gu3R0Kffynnk92VQgYLXrjCp1bt1A+5YcsWVWT3fls9yL+/r7ijseuEzc08kDQBaxbY+DB6qSaZBpTEinS3pcELjjbrc3jjxxGI2gaORIJYoDMytpRVbssRgtg7TMkYrW6DHylrfO4Oar1lgolPLIru2eZTGE/+mT8QEFFKyCbMqI66smYWqnTDTyOJSY9x/nnXeRYYFSliyqubE9dnUo4Jm9skm7hXtzwlQz66hArh7Zsa5zGXdzKqdLBqRlwrNzqTWZyJy3fWhiktywOlk159hOd2Aw75FciGNZE3i8ZqchAiyhITHP1IhAaA1LE4MEMUng8PiLxM/wE1IBCIYgGESolEcqKuMjOMs9UjHQYuDE/DLNB5dYabE93D694fiaTeiatbOpD+eswxA7PP1MrvGMIvY0cBNFq0qaLKq4sXs0ymALDQPbJRf+5S+n7sllmHgIs+TzrV3msFdaVgnxAG8vib0CHxzg5SoftAIflKTJgXQqjVyDNLzBSrByx/+0fvsjNpv1SMU2vfTpZU+HQGKHco0rT/9bvkLg0UyDOM2nvTyfbP59X79t2gQ+ILIrKLDrb48/8OqGqt0jvt3UY6lyTNSxq7COJcCrVW512nSsmja7gSfh8fgSyGu2WlNe4EY6O4n46JBQk24WAI3HYj5SMVo8ClqjUR+paOg4jEWPVGJTYbeoIGm+rCm2tvFlIXO+5lvyUwXT7+Uw7wSH/qF+TW1nkhCTSjPOzPVCIRUJ9ah6lfyOwV2a2xmNaq0eBq61tq9/80qzL5ehuXuuVmqtRuvmesUk5urzDd6GlNXsQeXOyryHudvK5ZCsDB93WxQcU6+YNTtG3IR5rAdzqzw2QRWBlHK5USlGiFCIH2sUpeMzd6U1H/BHmL6pXLpGC+HYxnG8XVFxo9UVS8ZP7cAGhNeW6aXx68I2Q3ol9n0s+Eqtd7K5lGxKppuSCLiDyONJmaS0VltOMfSRCuNOYpNYao6hCBLsImLacQB1iG1nio80NhaOVBqnMDwdT4n7xbx4pqjK58X9KXOutvUQ+ZDOz4fSZ9lgos4GT+dzqM7OyIRc0ER2DD2y4fwdU2b5epVKEgy65i7n7fIbtyrlKBBO7+83YCP9cYk2ncNoWl9S9+za2bt2B/JuWjPTVA+nWxO6ZDq/dhu21cSOSMZHNaR3X74WH3zZMuyKucmy6gfk4rHYFlCVBVnGsoiDB2u+TuKLIAiTtN2mpqwUxVgRbX3EbDYhs+lIxUzbVXK3HMkPsW4GxBGIH6kAI2ZQ+hzuifnlOZ3dP3+24Sic6dzO5OW0CEj/lIMbERxcHe+6d+3qPb/qB2f4tnoWDY3F6zkr5iSkBvPKAqJguFbhNOz3++PW/dhbixUBBgipKnaH59r6E3b+/u5fDkvqs9dio1gsICiIhDiJrEZN8MUtR1ZJ5QazP7R2V/eCZR95aP7Su1872VYOdnU2pG1t7KLLhpnB+3cmGiu9C9i+9d064/IHNh7g3v3sYuhfOeIe2PHwAz1rV36Se1T0Xz/jFpDzhBpACXyx1j2kO8Dmci2BppBNqbDL7UBuRwH5I1KpBEklRypSuqgsUAVUOMRSjCWGYuOsxeT3Ib/vSMVvryWfdRpzLlhM9TJjxkQ+nHMPV+vhNVAIxRb8ybCsthMAz1Foed0SK9KQ3lxSV3ZsryWzm4YXJpGEEKwafOnMWgvx7KZY1CvhwbJkLDqVzX6HcVpVvNVDnrOrLVWdQ7/FvHaCT9V6byxmtUnthGrKhDQQujVqs0WJSILUkT4SaUneNUEGEjoEyTtYO2Nk6iObDj7Lwb5HbN00i5vxte6Pmq0L/6unHIZ+gVXkdPuVwGHI1wkef8rpZ/zJjphDzauaSdC0bQPqRZ/fVJ5FfLurQeOd1TOnhdewNQlBwd4mL96tF+dpTuNc/wbBBr1e5UcPiFEmg/+ATJZ0XMVSKo/HGguTYRLNqxWKtoJ9QALIcTZsMli1q0yQNrlNadMtJlKBtFZkso6zWqaW//F5tZi9TBwf2Sa4a52wZ1dL7Kd27Zr+XV915oZd43TWKY7niB33wizJU5JsX2ZwyNHRt3b5j/9zzhP9DZcr5vR1zXNVujas2PyFSzYend8ELX1LvHN6Ys3FROsV827/hNX4h5Gl3S3BpqZIx9XLzru1x2Z6n8fahZi3IfJ1rNcv1rRaozIBEFJZjFaDVW+wIhVgbc4+EPCAABPwBJACkV4U8B4iTbQeqpHeyFqoIxW15U6Wt8xC7gyqe20dVZJtVubEmW2BxxkhaY9/WGcfDtaSy8ai3s+n7nmZkKwjQZkbi8SPe7funjd/Y4YynX8N1d6TTdjfaf6T/S8XytRy5PMmVxWfmbMg3LKmPT00Bp8sk1526+jf9nBFV3PBT6XjbBfPr53Yxl+E3sBYvKpW93DYbQyj1SGbLQmJCAqoHTWXZbJajlRwhiy4Lbquj2rKKE2VjqfHXP6hjw/zXZDV9Jos1g7EQl11NqDqA2+H92J3FwwYUqnOnJfaAt2iw+OuaVSPfGrLOsHdJZrQGxNvYIeXjumD5YHFZQJOtFdd3gly52be4cHt2OElAjLRVs2b/CMZwPzQg3VVfrgkKjVSkDpI00ZEqpFJp9BDKU0qhY0Demrzqm5jL4+xIIaU2v/h73E6S9S2tfSNOrGpHPr3ck1fHlFaQyEajnbfeUsgSaE3ytyTE/cTf5tXdqHyhPH70D8aChNlfs1Dk3+UDuI1B8Bt1TVn/NBDKpR2h1MioY0mpKdIiSSkobBbc5o0EpPG5NfbA5DxSOpSxtqqOrR84Fia3r4TduaY18RGRus/dA5MnxQI7UwFv5SQ1ShtJzpgvkavNOFPcy+9/rBbI1c2PbnrmUGZMYwJHynu2NigpN5sv22/SP81E6e4n8HIJbsDu7jXP4lgTxdOCyZiT7362Gh5IvojqBsWGAInX8YxHo35EQP3VvmRAxqTj1S4pQgp9HpjLOK2uo3GhFt42Rl16x1OBybBqZBGZFGhLFGDpxDz1vpFzNMzeMJWPf7BHK+1f9n/8ZNN91abcXgntnJOIT7cCIrhFMJvEoPLGm1eGnZZE4fuaLvB6HM4rTR39KYtrNVHc1+wsdC67AJPyON203A2ceWCFSmrnyyX0x+9sch9I9Hu1knL8JKxNWl7AL9agZrB3/X1B/RyHjuTYW5AwHt0yl42R+VetwTI5IDSqlRx4HYEHAFEe7Hx8moCzkAygL1p4A7WYTfIo5SE1hIqUirGMHUIwNkHdgnYmAleta41Nn8cc4E5fiwn1uTiH9rph70z1QjnoQQQanBVN5MXp7eK0LZMYQ5Hp1QL2vyxT3GTt1wyv62YWM26Bt3ZDdDjjnX1jLYTv+rv95FY334AfYK+lbdxL3PXfv6ewVaP3aZRvhmLOJo3zhVtx4sogx6X3gTSYAvrVipkPmCInpJpTrAmg8uVNSgVPj8O6Xxv+/2kia+SWxV0n8n6NquNQjLN4oN0gkygxNtkWJwlZo7H+S2fCf5X+u8NgcJiLR8z1rnVfN20WrEWSMtgJbL6rrm7rvr9rGWjn7y6775C4FJpW2u6M6qfN29A37q6J2XKxzoXmiVP/IfLumTBg/1K3VjrsovaXcb/aKv4ixV3S9MwskYKJV8s0s3ydOMkrw2txnQ7QJo1W4DWaiMpg8Vstsr4iYTfVWQRK6aoY6qVLT811SuO6uZnjOpKZeEgP6n7ksLW301PfJZpHUgY5YukakqfWxeBt6+n7CQVdZhs9Jw5UGVL+OB+h06h0ecWPJf/SK2WTxTRb3HeomcVxsNmxUHSYWbwCk4yJ7OZ4LmLO3DtB9R13Ocu6QA48dfJ+1CXMFdvYRUAIQkkoDBNXzOd4lA06jp11bfIj0iG/jYgeRqHwtBHPI8WSR8DNmAXeWbTmE+xpIZC1Nsa1hECNmTjgD0COn4iBvw/qWZUE/y+gDjrzjNMHHTHlkMI78OQ2Lbl0IBM3bZo18DSi4yNi31RNqOSDyz+NnQTz/fdsHpOcdXx65aZ7cuCweRtL89tmzV3IIZYcb52BfEccbP0M2euSVwKaw+Ji3N80JqEpIPvJpAKE+98IscLs4hgh7imoZ0Dw7uMjUt80fasUjFn0e1LpJ/hl9S48qtTS/raYPvA3IHQ6RcnJwHN/YDYQEQYGWiflJ/CicTk5ORXuW8QR4XX2mqvgRi3hFhBzMKvdU793VpuMTxE9OPXyuJrgAQv4B9XSxaBCEiADGgAY6zeYKB8UikFEvF4hrJYMg1s+iiBac2APJMn8k5VBIBYXG/IGeIqlE8mGzP59AksVmy5T6Txo8T/AOmRE7af2PjXT2hL6Z98k29XwweYJ3yXGhZTLXv3F4RRaoLv3cScckKz0V+AWq+W/58oSk2xgDlkpzvbPZmAVTHael1Xz5p2Bx1oTXhCRpnuVnh6QorGTjfBX5tMwVghbMV65B9YYAjkXFe6Us58TzTU3taT9CbCEYd0y/33c2+Rd506j3zvb5/CZNfyMKIJ64UOFFmHQgeQXCo1yIFCh+Qy6ZGKTPsIIxSIaFCrH2cAH87BqRoZPLt4DO8U68aj99QUBqo+oGaMJUGqyVbgBWGwjM36lSEJ1jYkUVE2X1hilUiiVp8KqcZZ2gdVyOezeaHWgDxez5GKzhu2KUHHifq5aD5SPqOfTIg5q1PRoTT0TnfAIL5RiC9KQm84FPYTQSqc0BGQILm7vd5AmOIuohyheDEPf/HuIqkh4KUm1kG/miaUZak7G9EZDKZE03x3MCQrd8lM2UULkOT00x2VoKwMH7zruQWiDhGYvoNkDvhBCpTATpYtpdLJtNUe2W+w72cLhRZZMo2kVksplSqh0jgLUkyK8KBUisr6Ac7zsyg7zvopzZEKFUfxcUrBu4HqsFC15irSXDcdzXdp8J7ghJj3FvmouRZUiGCDNDSJQ831k8zT4/uM2W42G5U7ZMpQgiJaN187mmvbvop41NkysvqWCyZ+QVwyb2PL8lW90bmbUuy63aXhhQfKUtoaY9OEzD1Xn45Ly6b8go7+jfMiKva2wrJZnX49saZ0fqWzjeDu4zRk155yr5BrLMK52XtkGThBDz+9TNMU5ZbvZ82MnlLpBcHrTcBBkA4SkeMOZc0JTrU9HBcuB1E3mgxl/ukttUacH9X2joXtOPReYaf8+mW3resemLs+uqtx0V2rNz+6av4Df/zYx0jb7x9+nLv/o1vOX7rub1bzysd2XgXpE1uxBHkZ3otlyPcetbJew342EsnInCkktWMR2d3IPc7aBRFhT32GiGb0zZxDElgEQTGxES8G4pPN4D08fP9nb+7Njl5/3eOXcGl4vT1UXrdgsNkrJdkNPUnTmUyPjn5iw/ov3X8x676QcJVW7b6uGEyt25OvzvjydBQwHUnwIOvlp3sJ4HDY7emgUWGS40cIBRXCVC1Tm6ptw081xnFWoTAlne4jFacJzbOP2glgZ+xb7fvsOPu3m8ZZZ1KOaMJNpAmc2hLyZOJIRT6eVNSEJdRQeLfAP9sWnxq2/8AZX0aYH8WSTCFhWrORH9asn9z01nOSLBR2krQjFP7a4KZ8o32sdwzSPv+Goc+1dHbEL5p3+kmqnqNk7m/pnEfN3Ztu416MxvXcRdaBEe7VMzlZ41dE4NcdrDsaClsxr5ikD9sqoPUixpdE7mg62hFF0WSI51ZRoe4LJcfZrb59PmKf71YfQfvcPkKBzZZXrpTJZZgttN1tx6/YvfzOisWLvOOWGl4ERs0YZ+XbH3gmfcCAbd2oYB2uzuAaP+H6FA6W41mK083gBBqu8u35BZuyTc6xgTHoy2yAPoc/Y0rG+W6+mSwR+XYw28k9yaaruktGse6mwFq2QACz0exwukidLqPYzwYtRpMRp/QmxoTJNZnUCZfT61Uj9TjrNRGShARJxhNT6lzL9WuEn9Hzc7ym2UKpqKraHXCq5RfSRHiqRYSfD+F3FKKFnZJ58zfefUG5t7GFVkoj+E9epdKNlsSljdmdszYeXmGPHN574LHVd5Hm3w7P+zR3/52bL+jrSzvsiTzOiaiRnS/bi1bXss9cfOGF9/2sudVa0yFJAmOiDWxl2QxDZ0G2DdF0hzet1aV0Ol8K4WdIO86mo9b0eCYTLzajSHVfuymqkCrsyGK1IL7qIbcC7LqqrQTVJ39vurSud5Ps4Cew4Lmkz9v26uyfeCgjExJ+MpJzVKVf4A5nZr5StTW/YvJFcxQuD4qHb1H4EPrMcz0xvttVRMN//3Dm8RQ6yqrlGz53pO5gyuYQTwq2M8YaAONANB//48DCahI2PzD4Zw6EzggpziRNBp8UV+6cufJfnGupM5bG5wA57iXiEbwWK2hg1RKgsSK1VI7wg98vVrLIpBeKFlNLmrHFzCcJsJYkwDNWdVv+b69mMk5HqK07776jbk13/fFXmm3ywp7riHtcg9OLmcZRD9jGNlMqFWNz2IweT18pCmI9sRg/e2qM0iCKwDgbjXY6sjZnHmWymSOVLKXtQmwne6RCd+Klnms69ORUcl1vM/LHBNOK2StQ0Di1OcuTIBF3Z+uHRj8QYDL4ng4j21aKFJuMbsyWb1G+hcPcu08a/dGAhovQToNW0a21+fyR9AeLi1imcRhTwXxfg8XlwApHFuf/mbsg0xyQl8vQZjZ3mZ9O+KnvWub8PZnyfES7BHy1sC6pROISMCYBMgXGGOC5dxbSbFVrW5vWw4ALnsuviKTedFW5q9t/0ZLTb52Dhgs9Iyu4ox+0Nvyf5JckPwm1gS01mcxmOqUvAV2pnaRpNmUr2l3pIpnS25vMrFrbZzY3ykNSRQQFQ8EjlVBLgd92LTVWRTxTwvF8LicsX8ubzKnf+bN0p7HaI4/DW2n94GAdlcIwJ7YSv5wpqkEqRres4N79eJNerTJZe7EL4d9+eCYXjnbBUfiFc2kfvKD90c2HuIXw8I17r9zGPef0ZUznEuTEk8Tcqk7wSdkrmF85MJuNYifry+bIYLDBSLiQ1OQijRqciPBtCD6gScWFghpKOHn+5KttCPhJ1XRO8wXH/ggTT5/bpghzlh2wXuKIePqtNoXOl1dJz0HwthcDQYXJlBGPlvKUP06seHTt3b/KdJybvlOjm3eNve6ZMwWN029g1PK+czX2nXoQwJm1hdxvMIRc+1kNPxGJswClgg8NFKbpC8jVbZ/C2nZotUuV1IubUqJf1BHfvuSZtcsfffumq59Zom/fdMfzv+rrT8/tbmkyVgZGr8dfuuTTe67jfvK1FWs/s6P1pqMPbCtxx9evjS7c/827WzZf8Cm4CVRj3k1YFmEsjRVs2r2fTSQamFwYZHHwk0VMIIcC42wuZ6kFNpY0So9bWCGs4VXtnNOKZ1296YOCmJwwz4hjF75oNZWioA+IZOAfV+3a1Be44Z1bnNZ+urLj8t6R1THvSuhzec8dyqiDbUONH3lmPkFc0HHV4ko34karNO/ANDcAFuxi2xUyIMvsZ5uby15Wp+/Q630dyNsAdCyrQyyWkY7RYWTqdFGrXWbhHbrCKlR2+Z7B6FQSkJ8R2HzQZawmjh3joSrOG8LqvCEO44QyzgcwZ8bAYVs8r3Nom5so7jM+o1ducsfcJb82HD/L9r4vsGrwtoXczxdvmRVeviYWGYE/9fR3ru9k5eUly27zNTgV98wunQvLAtvmXztm7vD1b+joqSBuHe9Xf49zuK8IceBiNmGzgKTWEjogl2fcB1itXOsOkcZkDEhifMjHxkwWo81h5Hf9jefM5rTmqYRu4jhzTBh+07vQ1L4hwoCH4sZh6Ox9Q/09KFjqC65cb+teHp/b7Lvw5esXPzu/YafmsYVr/YODu1Zf/Mo1m15a2gyD7XMTzKJZifb2oq3Uu6hw/u0DdvPvnujrSHZ0pLqvX7X17tlOM4RCDHM5xsUnMC6CfI5qtmBX7QgDbRAxVeg7zFp8FNRa+cDPKqY9jOWYQFCuLrCZzlFnYF6sBOm9yI8pJOOQOFgFuZzSeq1Wi+bucqohk9bvbEM/b98pUehMTs9C6OMNqoBtpDJGys3E89pobxa6uR+Zwg1OEyUV468bsZ35roDpVtYDIg0oHG4ULqkgESZaJCZLKouEUD1tmo4mOmx1F7ISI7LqpN2ZoY/oU84OidBvbCOX37dq1oGxkkxFdUpVUz5zWCaX9PZ2L2/Sj4qIvFlwHzsvOTTk9fds7Pd2sSx0O+YZavaS2+CL5R19s4qbl8LPeefo6gJMCC6bfJf8JqbPBwqsXaO2uyRau4t0ODU+hwkazMjr8x6pGH11pAkFg7xQL+LL5EJDhNnkhtgTzLisjXglgyKxjooktAQBDRpSCWlrOhDml+xPtfVzzh8sUkRSOKUsSz3ZsM6gN793+Hz4zfiagFAUkgfmX3z6FBpY1aMU8skDk3+RKfFaG0E/m5Ar3J5gKFzADh40KdVmp0uikiucrmBIqgUqkx6LheEbX9Nubc3FCXmCsOE0LRgJSsOCcKW/6Uk4TBAmxw3zMK/nNwDy+ulID9OF7jBDAhJKbv8PWInO56HgD/jCF1Ii/CK89SW9BCr/4LFqeEKvp3ytXQ1cpwp+N4y1y5grTETQ7PZKEAdpEk8uqm/5WmPp84jgeradl6zA51ob0oZARFrukhZGl50+JfY2fLqqPyWwmW2KO9NmCuiUpM4c9qZzDaTfayal0haj2RkHFGn2yYwWRErIIxWTJJAriALM1wlwqtwn7rzltMKVVoWagVa4goK2VKrKVl+95KcY08rqZ98gqs4S8q+5YbFe8sSn7/Z2YcsZoLw+muq53R/zeiluL2VJdM6GznFnZ4yC36fcAR3VfnE6g9+DV1C2bGc30crdM7tLhjkTsNjTnvvvDHRYXDaiXJbZSgPQBke6ejHbSL/dUXDfujvTbRXfdDd3i7q6C/PpbsynFJjLRoDOiyyRYEzuslnkEiV/qLBihPDtiPZIHAkeJ2qdmQFMcSXPVwgwV3LCkCWU1RmcDkw6qpFu1s9IFYl91jNsj2eH0uH0mnHqTEcC9Oxnc243pncL5V+0EN6xY8q/ijboNngoODfDj0xKMoFAI/eb97tabVYb70jm8Oo6OSnmg5IXdSEYwoGEFP5h/nygZ1Uw73aZLUHoVoVAvADjBT4GeR1l0NOSF4ANc2QeG1OrXITUhVSqTPAUziW90MLXTzjW8p5KMVlRva9RR5gIikwwf+UtcLUdqtohhc3xdKGQT6ezM+b1/FOxFO9aZLX2umrTASoid/vSNVJJMERxvwmqW3YM5OZlh5+9onVJPyHxBltWNTvcpmhL3ENJbo+ruB5HgDabibbLesqJ1f1bvn2p9XvqhDkcuOD4rFCCSXcvbRXnp17G9B2RvgDsIIk9Z1J2ig0E0ozdYXMYbA7EWMyTFYvtz3YQRvgxwaL3KDetUrmRm1P9teZkRNcpEvuf0/FVLbyCU5dqhdVJO1HcHTCvguLQgUgqSaia11fyCzJLn97fuDzUvvhumdSVoF5ZsbrTH0pVWoJOtyXRlvLSklntjcnVs7Z+Y7ddm9AQz/s8tNFAtiu4G7kDYX9xy10tkai+MLRpqYjpH2Ma52MZukCJdWgZGnosp1i5Vq02IAPHqt8DJGlH9gnyr9VY4FhtqEIQFvM9vtA1Pc9W8/z10oHEt0tz7xwe2NS04Uu709syof1Ob255YzzvbWslwezetuYNPRd/aZNGc6Q1s/GhWQ3N+mAVW3/AvPeCJrCETfu8Bj1CCgrp9c3xU6xdJp2syBR/dmO3zrHu9/TayYr+faMhZUmh1ITlHACrcX8KYHzBZorX05mXv9qyIrSMyQQ6xN4dsdkRp+XEHxWkO069Nnw3kiEsAu6/gur2bf0Lx0aevrKt4PMGvc2NCbPDbTPbXCa9LaCUSE7FbCpBCBOtjMshNxglbZf1d2xft+ubO3U3BgPurs0fyfgTKrXd6Elsbvby2OPlcr6Ex14A7GBT7tMUCDn0xlOsTI9jM46l9W59Wo8UmCEqQuVDPo5VvceXfQkvsh+dfPEpi72P/82qKW2fnSAsyDJBTAkxzk8b1SZl63dlbCexWfreaxiY0lo8IY5zVTcsZwxzZe94qu+8Ttfmly7bvCMy+swVkkKh5YIK99Xd+/z21jXo89dHupamL3p+w9ze3KzWADKHG5qzbR9Fs7pd1g08jXIig3qlx3HcFgLr2ILRaNCoVc6A2WDRW4IBiURvQQGNXM4ghmPlfzHDyUrQjEMG8wRreNfuQR7OHnp/am9TEPj0VMAxwQnXxrOO8Za2lM7qeddSD1JpdZiqvnKE3tWEvCaF98gNiS6Ha8Rs9SYY6mrj1Rs9jx6M+k12UzTh0e1SSua1I8rp27VDIb3BG2juax/jNHeMKxdLXf1zCN3ESdGGrMA0fhbLMQY6wHb+GhFxFIt1Sv2O3ClWqklRSiVGLMcq33MfnXyb9SmoPjeyhlCIY4GVsXqs91lJBbKiGCgg/JhA09BmXhPFJsjzDCP62gkxveZrklNwro464ciSf6WxaK67DEOdwoo7wRjnl5cu7BsaXXF0b+tSd9vSJj1tcoU7h/ct+egnGpsXaOiuru4x1l7wBZtGW5xuvd9oD/kpvVSOHi+3b9u45Vu7rLq4mptYMrj9khV9GfucWd4udyvjNgR9xYt3w51h33lfnR2Mq2l9vJJsDSawLXoZtaH7sM6HwUI2KVUZEMNEnWG7I+RweELIGfBPVgKhPwN7GJmRAAP0npOarDDO93knO93zPsPSTjV11/rfaSg9YwQJR8N+sVuUNwWEqrBx1sByZYOcdyevzFdqbCbP3JK653t3UZ4Y1vvVklmllsGuRPq3AYtNj9rgWJI1m8yNy0rc54ijHUazXjC3ovy/i9qIUekz/Bw9jvDdBigFUopQIYCkSIUI1qDTYdule1d0kcImrrCR+5+2n56oQljAcBbK/EV9beW1xRKj/i8H03J/BC90jdoZ0Xx7mfSZRx6ZyAbsJiNe2RcabWYd2SwX9zqxvlXX4gBO0M36lVoHJAFpJLR4PSTS4vU4bDbrZMX2Lj+mw8mdU/p1rjVhvRKXNd2dUc0ycOwmsJJfns687IY1EV5vwkmvdq2MVNndmleGJ/mFnn5gw752rDLuWQPwOY9fzeiUqFk+cUD0TTwevifldWct26h3KxmbJeEmPBA/Qsgbi05WYvDPeoLgPS5LUF6Cs2QYDaWZrFDvei2YCm8NGFXbUL0g00x88CM2x/nOJrzgavN6dSDGzJdc+Swjzl+GvBqjE+rhbXJLJNvupfRWCkzaC12HVusdXp9mcotcr2e6vns/gQjsIKQvTJzSOONuJ62mYFshn1j3etyvlbRBnVHFfZP4vtKglZkwVKZoJdZhWvXAz+qghEZKvQ77NPhnpXyyoqwCo7ZsfqkzhziEdT1IEKEAxX1negF6lUmBv6Ot/tsgj0lJE7ZJ7eAytotsaEZApdYmSA3QaABrC1qsAavVFUC2hEqWkSHZBJt5zxIMIUMUxwQTbPS9gM/nnaz43rW1TVY0wPa+kP7UMHLmBQXyMzWxlK5dRgbO1L+zD3gIyfKi5ar1yE+VCdHp+bTcYvHMLyi6vz+CZLWna+QkVoMvLYyo2rcNdM9XxwZnp7KzwpoCQQRCGqwSq8spym5uW5HhPgfv0sTo2vMXAnbGrCVb5Pv7O9jmVKMp1BWPt/1eaVTYjUQbqPINPYT5FsHRYEriCSIIY5RVrbFoNDoLotRWG5I75Ug+wTrfs5hMxsmK6V0qMlmB1BQO6zl0DhPl/ftsmDJe6O46w4SJlknsMc2XF0RUxV2DgunyxGbaJfgFp58x6XjyurpF22U1mpFoo36EY40rMV0WHMenWYvmlNWaiZxigQJHfhyreM8YR3HO+Ndz1jr1tQt/C81EfGcTHwnCBqFoMuMSs/BHpIQ29YzsHpj7kV6p2u4+/6ah4T2t8KdDOrfXw2g0CrlUIo3FmuYVSVvaHk51jrKBxg19zb5ysXNlrnMDDGxQWWJuR8jusoTiwWLT6mPi+u8mmtFjeP0ekAWjbE53io1G8x6vRWnHFOB/HpUywW/9T7DUewqZEDq+63FNVjwmUwAFONN0WDRTRPXYrY/YZwilFryHa6XAGWE7ggW5DAPyhcVRddu2fj5+f+qq9qJR4Y1R3Ksw4wuleko4dnfmmjJh8ne+OG3VISykPhbH8Nu+cZFuLKa3GMg2+LFIoLjpYzh2tzesvr2KxbWYZieYzUbMSpVJBYHTrWJMSK004wQdQn56gpxg7e+ZDAb9ZMXwrvp9vqGvRh5f/OJVURxz4bNRwcuIoTs6B/rMqG2fxaz3ecJWeff3sR13RDFZEVXLzt5UG3kq4tW6s8UQhtqX3G612cBT0dup4fXmCMZXAK81iv163GjQ++ynNZqI7zQrlcajICLV2H1k0KjV4hiV074XDbJBhBAXFMXC99lXxSOWVvJitwaPPqEPQbjAf91VxoTA/YyhBeECY0UYl7Y2FVp02XR/b8/+ZZuu9I9Ii/l83pDN9M/+xC09+9pD6K+l1kjAHAhbQ0tzrcMpzwPNDWGvwRWwhYebV603aB7C9JxEGeIN6TzgBvPZGDBgu2rT2VQyrVZnQzKdnjVhD6Qy6U3INMHq33WTJI7Yz8igBH/EkzYjTH3tOA7YiGp4xs8PEOL8gFAKEMYHPt82a0Fx0Qq5qn2lptgUMj8deNj0aKtWHve2h9FTzVnL/IqnKQNRO/IMLLp37C9djaZULIrX/B6WwdckT2DbNYeNWTUWiqL1yGKJQWkQeSgAsJkC72qwBVNYTDitfd+pQIoJZ03nqxZ9Rqm0uuntra8w5s9I2TEh1TYAiGB6uUSCpkyWVIrVgjsZnjJZ9pTkCW6nyWVTCTYL9nNd2GbxJvmyru65FcFkGUwSTMsrqAHdgmkxgQJrlUkZRqODFlrDyCijxkSJ/l/2fq17lS8kCiUXvv2bv8oSn68i7NeN1dZjwX2iLV5NbvmN626aL9M5PBow2f6sx6mWPJH1rLv1hUvhT2E4pCdbubb/Xm/VEq2iz34NNUj0eB1+vh5ktykkpIPSGBVGB9K5YdCgUyiNDpLS+3R+m17w5u9KBE9Qu67oVDGIX5m5pK1ea5RfIN93z8OZv1CrWOfMVxvwa001/+0NfvfWS50yiowfaDnQK3fHqIn8vDa3RHm4aeWgx6XBax/jvvSp5xPrqXnHBuDPG0KSVm7W1l0XNKe5WfvvwglEjY792JZciemIguVsyqhRWn2AdEfDYTepNOjiVjfQGH2kKyILyyOR8GQl8q7OYXC5HJMV1/ugymPLFK9rJPFBFV/640t9QrkPVgOVPM47ZGJoFa6m3f4wBk+YF0ee6Em5Kb1d8xvr4APevoDf46R+u9lWNhlsmrdtkYeXz7b7vG7qD+RP/H4/pdHD1sLsm6z7y2mTrPXXhtawjmaItmLolr6bc3GDtEWkL0w0CngJgQVsFBhCSCYjldqIlCQjbpdTBiQUSUsk5GRF8q7L5bPhZHrCBjBpr4n6mj4DR7V9Agwm3meLhcpa2IvJkxLTFzWsNnTDItw5R+mL8bhaMaI22dXf8EY/e2DPnLZCImOp6H3zoU3nyFYK2Gt/qzmGBdV26acKjF5OtGYv4P5w36Fy3qhVSu92mK2tzUL/tpfcTSwVZvkjrB2tOWuGfiuxjyAIQKTzID0ysm07v5OHtZJYyo/D82PvAHKfJHdPvv6PnQPhc4SmToHP8SfJKyCGc3gEXKwOrdlKwA7iMfwpFmey1Y/Gt43gT+rxJ2P8J6XH+U/ycnlw0ox+LnkJxx04UBHuz8UCNc47xmg1VFtkarXNIKvdOCw9crIawGczEl8KR+k2GMjLcJShhOIdw84fvnZdV1R77Reh40fW2ZdtXLWwPTMy8Bs/O7xlT9fLhB+2HdrWvP/H3AvcHVeu3ZEFcPLmSTPxcu37hS9m1cIyaLw4i0xmMNjUtRuF1X8/FC4oKt4prJ2wCYL3Q4X4/Vc/z/3iZ9PfL3lJXMDXJ97kvnQXvwBYhhuFBQg8MOIA5gWyC/vxNtZjBbQdUUabNUNb3Ja0cHsFi03oyOcqMr6ZdubdFE7ozujKr91Aq1aiqbblU3pba5Nu4hO6SmvQql1Ays16a2spDb91JZWBTUOhUMgoGxqSmcKds+BOQ5Zyma2+tX/L/QDzaJw7gT5DlkEDuJ5t0KhDyetkTAjYmOtwpujzNdpsLuCADHKY96k1QRQKh0ModC8bDpMuswu57mXNRyHFamGGbsB/1UDuIzMocy+prLn26ZtZ1d/hx1yaeqs6JZq38YMTzGsnhY0DfXGqLDV1+5+zbnBF1gLpi5o+8sONHztSHN0/m9h0mbt95ZY7Vo9+q6cwLn9w1o7ylq2LrIuvWtUd6O7MLJznIv7yh3QaK+aeNQMOjWP8gvZtaxc1OPh7XC29f/H6ddslkc6RzeWe/tDaxYL8tuLE+hayB7hAO+u1AcbuIGmj3ZahrW5r2ooFaLXahS34hyty+1kCrLtZmpDYfOAt0F5QKmIjI/rTf9adtzzn0Q6qLXpDsrI8T4Sv0CZgU7LZULsJWrA8D25psrvMdLBxHUxUjot7PK9jOb4zLUdZqAHYeFn+n8tRGIHJiTMw/5gcj/475YgDVaSRrAMO0Mw6LYAW5mGslgwwQxUym8U72D1ckVllf0+G57iLXU0HXXp7R5t+Yq++mw3ZtQf50dZWNgd/Wb2HXTAsqKAxWJlFHOLvYWcOrP3bhvsE2f108h3SLdzDbh9b5u9el6vdvs7rbbD/g3evI2Vny+wDb1031ao+U2L/63vLPf/vubfc5CRombyPOES8o+VnTRpOrwGyJ4E8AToK/CzJnydvJ94S3murvadNiu+B44QReSXrhM99kfsB/x4vUuG9ywk5ulB4r632Him8V73W2Kcl94A4uALbaRr4YpSGtlscZkc8Jo1JzQ4Uo+lkzB/0YEnw/YoB1uOwwyOVuP1OFgenepVKjzx0hmZpRLNqfR+tH8cpGz8+LE5gV8eK6y+cM+MaY1qY568xxvcHTl0TjM9zCF43PviSYLa5lzy4bkFXdA00eRl/xqd1fdHxxaf9574i2Nie5XHqqDdMJxbOvvLMC4IRQDX5DvoiegfkQRcIsIbs4ZyuYRFloyAijYdcTPshUo+x1XESx4AM/pXNBMWuX34bgag2cQmwCNemavieN8RfJY4vZInPhNUTc7VzH1xZWNTsXvno72/VSSQtXd7ZCxbH52x99+buLXMiCs0smVwCtc6ATsVdNzh3/8oGrSNo8PR3piQHpUML3U2zE6tuWl1SzTcEdY0NtLcxsnxso6VxSbulq4V70BtzGJQWt16BffEbyNe2rNkRtqoi7f1ewRa0Y1vAX1cuAFKsxXfYb7fZgG5cCQ8ThB/cafHrLLQSi66jgxGz0JP8rjY/pgaFke/a/sKMq7VV0yIweQkVSHssVPpPX65dqM0Y8Hp1/IXarlRLhKkcLA6ksJfyzz0sVX+1I69Jr5i7Zc/EQ9UJHTC1xk/hNUZw7GZ0+cesUHlYpaMPUwgnQBriTkBjUeTEhWGZTAhtpXULEafTpy4sh/w4JSIa6hbxpepCrUOX3Ls21u/DCMIGUe2IuG0UemN6ObXFrrxmcVQmO2r1GeSEpWFRG0CTd3IseTHGSyuYB0ZBiXXNHwflcX9hmErO+rjZjBczPjzslx5EfgeiATPNUeGegXzWwAjTf/zN/ryysMwkWpuwQEMLrA1oVAFWFK8xXv0Fq1ASLBI2UBSEvlqiyr9IzI3NDsKbnU/JPM0XPXXpgrIznm/9ecumBdn8kl37bygvH9/c5i3NjnsioeZuT2tn2+5nuHFLYVFbYcNQobXnQVeHqzEDX8n2ZcxtzamelLmI3pEprjao+wdm3bq9lzY349TC0TRU6tq8qD2i1ycHmsJdrQWLgU3G+9sbTP5t8/sO7uo/lXbGXbQxPVDwZ6TS2DKS7RzbmR+c07l6e65/COvcIM7NXpVeg3PMKEiwFtnhsD3Kqui+aBTYw3RES1E+eBijAAsbS7ujA3MuriudFOdL+Xyrbp4KvyTBeSQ/sgxxqoLyxAJV0oMQ97bNYnerua+oQhkTUrmaRm857+udSKG16pTcMYmMfOnnqK0gSyZlRU+8zeJ0SgoFadEr0WWG73zjvontvrRbJynAb2WGM9yLOBP4OGojm6R7hHs0tAIfq02PK43ZLAiPm42R4rgfJ2IdJ07if/xgnrDW2oid0cTbBAr568LYcFFvmp6J5Ss9+HcMyhCCyc0rO6z5uY1XNpTszX3LWrmFKqvXqJEulSicXtVdgXTrogZzpXzerpVr+gaySr28RbpH5q20RTub0mZ5w5aOkZDOxsgKpDuet8JbLa10wCMpTNiQu9AXLWUWjw7mEzjF4fXtDZREP5TeBHzAyCohGneHGc24McobcFG5/HUtnrWpJmLqovePj0p35gbbEk5NS/n/9XWlsW1bd5yPh0SJ1C2LpCTqFkVJlkTrsqzIkaLErp3DipM6S5Y4To14CBKkcZ068bZkXdHGS7plwYCsVbeuwC4hXTFgWBdg2T5kRxtswIAN7YABG7ADO9B98DC024cdZvdISrHoav1gG6QF8f/7n7/H9/7vNY5EFtPNK7WpKyeK9ad/fK2+ViW+/Uz1xJOrZ2NzrT2tNxwwka0+euYnL5+yOZT3m4o+m1CfHJJVns63EVZMtWlLT42wIvRpq9u4hCqNS3kYJQqBUpaLQ5Xd6dMO+PDiyxdq07feuiHfAlWCIrjqwr7RmFNpSuQJE4Gt6LUSnL58dO0H16ePAaFxdPFsoTY74gFaLoLyYe9A+bLIVENC0iAdb2daoYXQhRAWirYb/EH+FOQiypCmxS6wF1iCZS1IRrQPdTFAFSq9mPMP5jcfzNvhzzZADztm1Pdh0d7BfspFuB8Sejd1GjU4Qv47tUW3z20jj4weQT3RE7u+FMnGAs6lnZvz21G9zoi8Q37X4gk4/52NyG854xVho4fpbYgprfhvLNkOm9oI4gyFBbej41TDTZV5w64aX+vlURzT2N++uB0Bup4Yts7tOMKET0QJMpCi5Y/1Oyz6anIJNToj/i/UCVsxJv8nH3vRucMbCsN42yY2K/J2+a9Qzt9Cv/w79MuCImcq045bYB2guHjCjbU56J4bhbp6AKsmZy/9dTdkRxPRh36K9xUtHNwv1vyZoL1pBiuwUHoshthiEkscr+063xoO7Dh26fbR1pWCuEDsbFaO7Mr4LXhqbpYvTCSmDPk8/JIy92U27eJSM8sTkzc+cW4m47bemxwfO37xyXOabvFvQt3WkVojZmvbpKDUkhakCxIhSWxFqI6OJoVOQmBFr4lhDB2jqJUymN20JKf4yoZuJT2m77fp17yy73x/vw1mxN7GTf4oLT+j6V6U34npbnTj4wrlDXssRBBY/bobeFBnk3udwSYqEeFskf30U7rLh/GC3oP4eSWa2aGORzD1UNY38npgOiRG8I8PkHSbYNskgc/9ItT7N+Bz98JKwiQ7APh2C8URL9/Jiz5xommlOrSgFpJ8vf4X5bc6w6O0o+iW4GO2vhPMyr2F0HqZsS2Z0SRkVt59Y2meocCy2cbHcpFf3KTcLO+m5OsWjw1QplHS5uRcvjgMiphFfgqiYyzEMQzHUT5iBp80eyPwmnBwTEPa6+edaKmEUmwy8H35Da/gdxLlEnDamWHmMy6/nfwq1EIwsqUFmvczRp0elNg+CfUQQJgGxXk6jGA2IG1SVJJ5QbOAll6wARb41RP+bDLBLO3ZHGgE7HkyAinmex9gA6Kq+n6uwVXEpJCOdwSRxjCBJBkB+r4ij9i1gta4boduUYcywfqtTgsqLxzVlb2DvETtFsH0/8QeUB6KrcbeXM8azQROElOaF/1NB+BUHpjAaQ3Fh3RuRnDScSm1NCbfBY9Ij2U8aY/8rcGuJk+B72pQ5cu6T6h+r/jfGYhdUua4o6FOWORwxC3mNMcTEDW+IegxzQbK6lCd7jXoA3GjC1+xei0TEEmEAi7KGxmyENe/c592m2cGYDVclZcj+xNgj7fs0qwTyRaZzc+DX/LjIfn2YGzaXOMfsAwuwnzLwMoAozfepn1thE4iymYZPbaq46U409f8sRNH/zi9Npdji7Mrt+cPf3xW5IqHVm7fH63lW7WUjy7XRlq1tM9iuJnY/8R0Y/3q44ekzOzy7sa1K+cP5f45e6B26vLqR4Jzrer8pUvnetzAB3UaRXJIoGFD2smkmY21OYE2dcy9lNKNY2V3uUE+0yUMWAQOx9SpNCGKrlUKHG56X4kCz5XWlpqTqy9MGS3GyeBHn9o7g9/CLg7WmClxYM/sylQEvACA/KOzjxeLmg4VmUNQ5gKyC0k1PL6OOVYqITFRiEadHZc43s6/p3jDxoaa9uvbWaJtqwtDOXFNoQMDcbm2+L/BiP58bG1xZ3zXnISGE5YhSzJLye9aWdJnSSRL3gFI/xSfOFnlpltBo400XKXE/c2Rw7slK8lVRmYLI4ZSZCK6XExf/j9xcD5YOZArF5QGBYBcgjX6WegzI0io4SBFWwB3ZxCinUlyvrY70aWQ2pZEoNdJgfeoo9ZGYYQJVztCTJvJxDE+U+GnZ3OThydzhZPXDk98rpk8RV1v7EdRW6QyHK5LgdHFTx08+uJUFg9JtSjdqKdqeanWqowvNCJDzu89V5G4hCB63cOVR3LN07sjjOunCAAmaJt90DZhJNiweewOu92LtFnBbOyQmjdtvq6MKRUyoQ9ErUtCoTrqIdhYdAU3BUVavkj7oozVsFoO5aI++nQOc0lLmC3MG4TNf+mUh3rd8Xzg93+2BKWwQ53jQGGsnYWylBFvwxITRtrupBBVSmWvSm1oabEvQzw8cKi+7b46gaocc3vYQPJRGoxrOWLaPb309P7xszMZm3lEl8gnjYYzqdpwkCae9465hHAvS8ivza/u5nyjj44JJzO/06V3+V5I4pcZaW9erfPQSAV8WR0H8Q0rhfiTbiHqcbngeE14yGic2vJvbZW7mvCwLj0DRu30HAxmt3UqF0BRK0GivzG57VSVBjU6GHV7qvL63SZqsPkYs+FqicymyTDzavl8FTxmjcVj1pK5VDZEvP6FzVfQz7ozCT+mvMsCJJY3xNX4izfcaSGTSpktHU6IsChGCVgSjjThSJwZUzgADD8onyPRFUQlWX41+nigbM4B/8AB25bQsEBi59zyr18bwUgb66LAKpUJo0YUA2NfgxkGgHuky06NmUGV5kRBYOSvY3lwZ33zTfSWNoosGaQMyTMvSYtxEW3Jd8SD4jA1RIFZmwKobFKcJd8UN1+BOBDoq3tUHELDlRbCHiOEwr6PUDm0ubv6dsaoLhjoqppRUkphtJ+3YOhN3BRKWeQLtC/OWglmKMO4RMEMLpqDfpRAcbRC3DB5nBbWawZxk80bkWL/hRysxm2xj+WZl2bqB0h4FfeFzU7yZ3fpQChIu1zwAygdqGTlH/4PyHP3+HicrVjNjxxHFa/ZdeL4ayVw+DihEkjEgdnZxAcnXiMhZyMiH3yzEoVbTXfNdGW7u1pV1TseX5CQkPIPcOBPiDhx5ISQuCBOHPh/+L1Xr3t6d8eWhfDKM6/r49Wr3/v69SilfjJr1Uzlfw/VSuSZuqm+E/lA3VH/FPkQ6++LfEPdn/1W5HfU3dm3Ir+rvjf7q8g31ZODM5HfUz84+LPIt9TPDm+JfPvwD7cfi3xH/fLoRyLfVe8fNSLfm/3j+3dFPlKP3v81LJnduIWnkq0ieYaZP4l8oH6o/iLyofqV+o/IN9TPZw9Ffkf9GHfP8rvqp7M/inxTXcz+JfJ76hcHvxP5lvrNwd9Fvn3z9uGxyHfUl/f+JvJd9eDoTOR7h98e/V7kI1Xf/zcQ1cD4I/Wx+gTSc+VUoYLyKuL/SiWMnUEKquNPgxEHqVULzDxVNf40xp1aqwpzkZ8svi2+L/BZYqX6Tj/86ONP9HNXBB/9KukzHzofTHK+Xeinda2DW1cp6mCjDRe2xJ4zHNaoJSs3eDTNMjgIn+H4Gmq1eoYDDWQyWX3m61I/S6Z2eLh+jVO+yFSjfp2m0cpTLYfqS8rfUs3evV8yLlEw1OoR0HmsPsWEDRFg6EeLx59ePWI4YJ960v46wxy7g6TEritxeIPvoM4xRrjQTIXR/Y5f83MP1w+rC3w3eDYw3rGbF7uLuqiNTsGUtjHhXPuVTpWd+HwdfN/RcOGbzrTOxsU+T70u4NTe6CENNOuxbos9lt1At1xjX4tPzdaSe15ghE4iKa/d8BnnOFs9961P287qZ41Zu3atTVvqFy54/QKjGx/O43WEK3wSxkvosuzQklGhdGg5+DXuRGdotvIYcwUnSF5NEvnlqqWJrazx6dlXa5ZoZsP+or0dW9FibT7HMHaR757Tkux4JV7Kwbmz+IIDcQvJstzyevJscc2ajlHL/hi8kXV+zjisecTwmcOerD+xd/MMnUz416zfSmzm1blcOGCVRwP7kT5riYALlre8NrE9ZONcEHGYs3yGZz2veD7Jyfu1T5Ea7BjwnHrBcsRn3DKeOxvO+Smvz6jlAmgkr4JkmBF803gS5VUa869hG2u+ZUb2Bd8qTvxMfunknnmm4awhLTn+CWuKp+W4qp1kuJtUjzhGUsZiWEMRt+HRgu9rOecrxowiI0n5mqLY47wSn3ZEMN90K1ZkFJcsm8mdHaOz5BsnnouMZc14WPZEHCtPztQSGeQkuwekvhozYn/96/ke00yku3WTSN7lzpAvdOqF+I+ao+boz9Exn+C1i5gAy64jdT2nIsdoLw1jKRjWYwPNMR7Y4p79ObV8h1ZusqQnTSLGXqlAGYNWfcB7vmEs0pU4v3pCz7tzhkbW52FHP/HJ6eQ0smPNdhjev2HP5rvsq49Wvbxy8oYjs5JOlfWsBRfLWnIENJJV06pRcBdqGSd63rL/qVtexuQLqbnnk91nWB24cuSceLtq3ovlOY5qzsAhDzohPW7S4LPtRnwxxEo76Wu5RiXO3GbcQTh1UkPjWOc863Lsi12FGnDKHcmxj3MdHGpvy71uWoEMZ9OQr41Ekhs7lOMM0ZOuOsVi0vUrE/XS2laXNrp1a0u98kH79jgWgYaDNeXQTpPXtffneu19qTcVZrvg2oQ9JunYGPDA6F6BF4AvseILG7baXmBh7EwxqOmCR/un7o+Vnzuz9q2peQbrkyvwUBkXatfayMPglG4FMViYU4M3XNh6q2MKvl3PYYirra58cK98Cyo1XZ6NIh1kZ76CbTrYBjtZw7nVGIdpIK8GhCeA9RjYm2iT7xORoCba+oKu9aICSaI7F67DmXhofEwazMMV1ixpqGXW5JjSRQIJVtBI7Tc2FCZaXVQmmCKBMGYT+2XZWzIQh26hAiYuLSGKbS5AxgnA0ta2sS04NhgY6Ex57EB0yKivyBETEtdHcWJhOgaZvUN+0R4Ag8rrzgOOOdvFwITj0ajRU7HyPZgvTIk1kXsgHmzZF6KczQLd7+vEwFgJIFjQfpD0Nz2mM+bDhj6SQ6MufdHzTU55W7DrvjZBbyydsotH+1I2b1yqwEyxZg1bbCIAGkNjFBqFs22B8W2z9LVY8gUi95ynz7bB1fDEnjDvoRwY1T6SDzq8tjhm8NAO/zMqLVNURFSypqEJ+xLrUqSY89q4xnJAkU1IJBcTYpCit7WbHEAmsF8bgOQooVwHrxJJzVYgDanOJmToqTrB34b/Fsjnq6x6Idz9RDLaM7s3zGy2GKWOtRLWBKJbpdSdnpxsNptFM9DuBXj7CU7362C6antSpBXyJb7Ohp224eypVt5KGve/AuRy2nFp3jWoli+i1dfcQnNL2I4tPrfl3PSH1UOJLIRqU5mdczFz3Jpr1jBXl8muk72FaLHybISQUVluuG0N5HvJduxoVKZi7WhX3pGJRbg2shrvMFdv82KWCXkmCJmQxLH1FKOWsOcGudxnylxwM92H2UZummlnjXNKeZO/jj3tyaTlAdZ/qDJhXo4N6rr2bMP/iu1O++61KQgtyi1vSuyu3mBKii/b9WQSA3STfJck9D+/ima6sBVStOGbe36Be1PsGXX5ZS2M3vGT14T8QtDJa0HJr2VOiE3WUzE57t4Yo/lXmVY8s9M+ZMjulcKzvUtGWn6l2b1go551tePC26aF/tr3qJhb6gyo+WgRNEyVCy3eJDvXpYtdbbZzac8ofnjJp+LNnQc1r3GJ2vxym3sZul1LujCBphIGYUUnzK//coCGj8aBhkM/DmHvnPYMB6A+ooMX1cSyDQ5Fj617lP+d9b5FC3rgPkQDX1LhHZdDw5us5eXMYdCuEip0borDAblli64njMADh1MSeIIPBv1ji5a1aWtvysvoGaE/ga7jmTuAMHTgDKWla9KaytbdZUQX+mm7leXkEGYUvnJLl/h3s/9XR9jV7xMOxxXmMktccLJ2YKhv1Se41J+UdmXQxhYmdi/VfwGKjA4cAAB4nG3aU5gtC9am7Qw7tm177TXHCG7btm3btm3btm3btm129ffXfEb31X8dVMaVq1aM3FX1vDMP7hF3ZOTfH08/499TR84a+f/5V5n959+cEXfEG/FHgpFsJB8ZY2SskbFHxh0Zf2SykWlHphuZfmSGkRlHZhqZeWSWkVlHRo3MPjJ6ZDAiIzpSjzQj7Ug30o/MMTLXyAIjC40sPLLIyKIji40sPrLEyJIjS40sPbLMyLIjy40sP7LCyIojK4+sMrLqyGojq4+sMbLmyFqO63iOP3KXEzihEzmxkzipkzm5UzilM4YzpjOWM7YzjjOuM54zvjOBM6EzkTOxM4kzqTOZM7kzhTOlM5UztTONM60znTO9M4MzozOTM7MzizOrM5szypndGe0MHHHUqZzaaZzW6ZzemcOZ05nLmduZx5nXmc+Z31nAWdBZyFnYWcRZ1FnMWdxZwlnSWcpZ2lnGWdZZzlneWcFZ0VnJWdlZxVnVWc1Z3VnDWdNZy1nbWcdZ11nPWd/ZwNnQ2cjZ2NnE2dTZzNnc2cLZ0tnK2drZxtnW2c7Z3tnB2dHZydnZ2cXZ1dnN2d3Zw9nT2cvZ29nH2dfZz9nfOcA50DnIOdg5xDnUOcw53DnCOdI5yjnaOcY51jnOOd45wTnROck52TnFOdU5zTndOcM50znLOds5xznXOc8537nAudC5yLnYucS51LnMudy5wrnSucq52rnGuda5zrneucG50bnJudm5xbnVuc253bnDudO5y7nbuce517nPud95wHnQech52HnEedR5zHncecJ50nnKedp5xnnWec553nnBedF5yXnZecV51XnNed15w3nTect523nHedd5z3nf+cD50PnI+dj5xPnU+cz53PnC+dL5yvna+cb51vnO+d75wfnR+cn52fnF+dX5zfnd+cP50/nL+dv5x/nXHXEd13U913cDN3QjN3YTN3UzN3cLt3THcMd0x3LHdsdxx3XHc8d3J3AndCdyJ3YncSd1J3Mnd6dwp3Sncqd2p3Gndadzp3dncGd0Z3JndmdxZ3Vnc0e5s7uj3YErrrqVW7uN27qd27tzuHO6c7lzu/O487rzufO7C7gLugu5C7uLuIu6i7mLu0u4S7pLuUu7y7jLusu5y7sruCu6K7kru6u4q7qruau7a7hrumu5a7vruOu667nruxu4G7obuRu7m7ibupu5m7tbuFu6W7lbu9u427rbudu7O7g7uju5O7u7uLu6u7m7u3u4e7p7uXu7+7j7uvu5+7sHuAe6B7kHu4e4h7qHuYe7R7hHuke5R7vHuMe6x7nHuye4J7onuSe7p7inuqe5p7tnuGe6Z7lnu+e457rnuee7F7gXuhe5F7uXuJe6l7mXu1e4V7pXuVe717jXute517s3uDe6N7k3u7e4t7q3ube7d7h3une5d7v3uPe697n3uw+4D7oPuQ+7j7iPuo+5j7tPuE+6T7lPu8+4z7rPuc+7L7gvui+5L7uvuK+6r7mvu2+4b7pvuW+777jvuu+577sfuB+6H7kfu5+4n7qfuZ+7X7hful+5X7vfuN+637nfuz+4P7o/uT+7v7i/ur+5v7t/uH+6f7l/u/+4/3ojnuO5nuf5XuCFXuTFXuKlXublXuGV3hjemN5Y3tjeON643nje+N4E3oTeRN7E3iTepN5k3uTeFN6U3lTe1N403rTedN703gzejN5M3szeLN6s3mzeKG92b7Q38MRTr/Jqr/Far/N6bw5vTm8ub25vHm9ebz5vfm8Bb0FvIW9hbxFvUW8xb3FvCW9JbylvaW8Zb1lvOW95bwVvRW8lb2VvFW9VbzVvdW8Nb01vLW9tbx1vXW89b31vA29DbyNvY28Tb1NvM29zbwtvS28rb2tvG29bbztve28Hb0dvJ29nbxdvV283b3dvD29Pby9vb28fb19vP29/7wDvQO8g72DvEO9Q7zDvcO8I70jvKO9o7xjvWO8473jvBO9E7yTvZO8U71TvNO907wzvTO8s72zvHO9c7zzvfO8C70LvIu9i7xLvUu8y73LvCu9K7yrvau8a71rvOu967wbvRu8m72bvFu9W7zbvdu8O707vLu9u7x7vXu8+737vAe9B7yHvYe8R71HvMe9x7wnvSe8p72nvGe9Z7znvee8F70XvJe9l7xXvVe8173XvDe9N7y3vbe8d713vPe997wPvQ+8j72PvE+9T7zPvc+8L70vvK+9r7xvvW+8773vvB+9H7yfvZ+8X71fvN+937w/vT+8v72/vH+9ff8R3fNf3fN8P/NCP/NhP/NTP/Nwv/NIfwx/TH8sf2x/HH9cfzx/fn8Cf0J/In9ifxJ/Un8yf3J/Cn9Kfyp/an8af1p/On96fwZ/Rn8mf2Z/Fn9WfzR/lz+6P9ge++OpXfu03fut3fu/P4c/pz+XP7c/jz+vP58/vL+Av6C/kL+wv4i/qL+Yv7i/hL+kv5S/tL+Mv6y/nL++v4K/or+Sv7K/ir+qv5q/ur+Gv6a/lr+2v46/rr+ev72/gb+hv5G/sb+Jv6m/mb+5v4W/pb+Vv7W/jb+tv52/v7+Dv6O/k7+zv4u/q7+bv7u/h7+nv5e/t7+Pv6+/n7+8f4B/oH+Qf7B/iH+of5h/uH+Ef6R/lH+0f4x/rH+cf75/gn+if5J/sn+Kf6p/mn+6f4Z/pn+Wf7Z/jn+uf55/vX+Bf6F/kX+xf4l/qX+Zf7l/hX+lf5V/tX+Nf61/nX+/f4N/o3+Tf7N/i3+rf5t/u3+Hf6d/l3+3f49/r3+ff7z/gP+g/5D/sP+I/6j/mP+4/4T/pP+U/7T/jP+s/5z/vv+C/6L/kv+y/4r/qv+a/7r/hv+m/5b/tv+O/67/nv+9/4H/of+R/7H/if+p/5n/uf+F/6X/lf+1/43/rf+d/7//g/+j/5P/s/+L/6v/m/+7/4f/p/+X/7f/j/xuMBE7gBl7gB0EQBlEQB0mQBlmQB0VQBmMEYwZjBWMH4wTjBuMF4wcTBBMGEwUTB5MEkwaTBZMHUwRTBlMFUwfTBNMG0wXTBzMEMwYzBTMHswSzBrMFo4LZg9HBIJBAgyqogyZogy7ogzmCOYO5grmDeYJ5g/mC+YMFggWDhYKFg0WCRYPFgsWDJYIlg6WCpYNlgmWD5YLlgxWCFYOVgpWDVYJVg9WC1YM1gjWDtYK1g3WCdYP1gvWDDYINg42CjYNNgk2DzYLNgy2CLYOtgq2DbYJtg+2C7YMdgh2DnYKdg12CXYPdgt2DPYI9g72CvYN9gn2D/YL9gwOCA4ODgoODQ4JDg8OCw4MjgiODo4Kjg2OCY4PjguODE4ITg5OCk4NTglOD04LTgzOCM4OzgrODc4Jzg/OC84MLgguDi4KLg0uCS4PLgsuDK4Irg6uCq4NrgmuD64LrgxuCG4ObgpuDW4Jbg9uC24M7gjuDu4K7g3uCe4P7gvuDB4IHg4eCh4NHgkeDx4LHgyeCJ4OngqeDZ4Jng+eC54MXgheDl4KXg1eCV4PXgteDN4I3g7eCt4N3gneD94L3gw+CD4OPgo+DT4JPg8+Cz4Mvgi+Dr4Kvg2+Cb4Pvgu+DH4Ifg5+Cn4Nfgl+D34Lfgz+CP4O/gr+Df4J/w5HQCd3QC/0wCMMwCuMwCdMwC/OwCMtwjHDMcKxw7HCccNxwvHD8cIJwwnCicOJwknDScLJw8nCKcMpwqnDqcJpw2nC6cPpwhnDGcKZw5nCWcNZwtnBUOHs4OhyEEmpYhXXYhG3YhX04RzhnOFc4dzhPOG84Xzh/uEC4YLhQuHC4SLhouFi4eLhEuGS4VLh0uEy4bLhcuHy4QrhiuFK4crhKuGq4Wrh6uEa4ZrhWuHa4TrhuuF64frhBuGG4UbhxuEm4abhZuHm4RbhluFW4dbhNuG24Xbh9uEO4Y7hTuHO4S7hruFu4e7hHuGe4V7h3uE+4b7hfuH94QHhgeFB4cHhIeGh4WHh4eER4ZHhUeHR4THhseFx4fHhCeGJ4UnhyeEp4anhaeHp4RnhmeFZ4dnhOeG54Xnh+eEF4YXhReHF4SXhpeFl4eXhFeGV4VXh1eE14bXhdeH14Q3hjeFN4c3hLeGt4W3h7eEd4Z3hXeHd4T3hveF94f/hA+GD4UPhw+Ej4aPhY+Hj4RPhk+FT4dPhM+Gz4XPh8+EL4YvhS+HL4Svhq+Fr4evhG+Gb4Vvh2+E74bvhe+H74Qfhh+FH4cfhJ+Gn4Wfh5+EX4ZfhV+HX4Tfht+F34ffhD+GP4U/hz+Ev4a/hb+Hv4R/hn+Ff4d/hP+G80EjmRG3mRHwVRGEVRHCVRGmVRHhVRGY0RjRmNFY0djRONG40XjR9NEE0YTRRNHE0STRpNFk0eTRFNGU0VTR1NE00bTRdNH80QzRjNFM0czRLNGs0WjYpmj0ZHg0gijaqojpqojbqoj+aI5ozmiuaO5onmjeaL5o8WiBaMFooWjhaJFo0WixaPloiWjJaKlo6WiZaNlouWj1aIVoxWilaOVolWjVaLVo/WiNaM1orWjtaJ1o3Wi9aPNog2jDaKNo42iTaNNos2j7aItoy2iraOtom2jbaLto92iHaMdop2jnaJdo12i3aP9oj2jPaK9o72ifaN9ov2jw6IDowOig6ODokOjQ6LDo+OiI6MjoqOjo6Jjo2Oi46PTohOjE6KTo5OiU6NTotOj86IzozOis6OzonOjc6Lzo8uiC6MLoouji6JLo0uiy6ProiujK6Kro6uia6Nrouuj26Iboxuim6ObolujW6Lbo/uiO6M7oruju6J7o3ui+6PHogejB6KHo4eiR6NHosej56Inoyeip6OnomejZ6Lno9eiF6MXopejl6JXo1ei16P3ojejN6K3o7eid6N3ovejz6IPow+ij6OPok+jT6LPo++iL6Mvoq+jr6Jvo2+i76Pfoh+jH6Kfo5+iX6Nfot+j/6I/oz+iv6O/on+jUdiJ3ZjL/bjIA7jKI7jJE7jLM7jIi7jMeIx47HiseNx4nHj8eLx4wniCeOJ4onjSeJJ48niyeMp4injqeKp42niaePp4unjGeIZ45nimeNZ4lnj2eJR8ezx6HgQS6xxFddxE7dxF/fxHPGc8Vzx3PE88bzxfPH88QLxgvFC8cLxIvGi8WLx4vES8ZLxUvHS8TLxsvFy8fLxCvGK8UrxyvEq8arxavHq8RrxmvFa8drxOvG68Xrx+vEG8YbxRvHG8SbxpvFm8ebxFvGW8Vbx1vE28bbxdvH28Q7xjvFO8c7xLvGu8W7x7vEe8Z7xXvHe8T7xvvF+8f7xAfGB8UHxwfEh8aHxYfHh8RHxkfFR8dHxMfGx8XHx8fEJ8YnxSfHJ8SnxqfFp8enxGfGZ8Vnx2fE58bnxefH58QXxhfFF8cXxJfGl8WXx5fEV8ZXxVfHV8TXxtfF18fXxDfGN8U3xzfEt8a3xbfHt8R3xnfFd8d3xPfG98X3x/fED8YPxQ/HD8SPxo/Fj8ePxE/GT8VPx0/Ez8bPxc/Hz8Qvxi/FL8cvxK/Gr8Wvx6/Eb8ZvxW/Hb8Tvxu/F78fvxB/GH8Ufxx/En8afxZ/Hn8Rfxl/FX8dfxN/G38Xfx9/EP8Y/xT/HP8S/xr/Fv8e/xH/Gf8V/x3/E/8b/JSOIkbuIlfhIkYRIlcZIkaZIleVIkZTJGMmYyVjJ2Mk4ybjJeMn4yQTJhMlEycTJJMmkyWTJ5MkUyZTJVMnUyTTJtMl0yfTJDMmMyUzJzMksyazJbMiqZPRmdDBJJNKmSOmmSNumSPpkjmTOZK5k7mSeZN5kvmT9ZIFkwWShZOFkkWTRZLFk8WSJZMlkqWTpZJlk2WS5ZPlkhWTFZKVk5WSVZNVktWT1ZI1kzWStZO1knWTdZL1k/2SDZMNko2TjZJNk02SzZPNki2TLZKtk62SbZNtku2T7ZIdkx2SnZOdkl2TXZLdk92SPZM9kr2TvZJ9k32S/ZPzkgOTA5KDk4OSQ5NDksOTw5IjkyOSo5OjkmOTY5Ljk+OSE5MTkpOTk5JTk1OS05PTkjOTM5Kzk7OSc5NzkvOT+5ILkwuSi5OLkkuTS5LLk8uSK5MrkquTq5Jrk2uS65PrkhuTG5Kbk5uSW5NbktuT25I7kzuSu5O7knuTe5L7k/eSB5MHkoeTh5JHk0eSx5PHkieTJ5Knk6eSZ5NnkueT55IXkxeSl5OXkleTV5LXk9eSN5M3kreTt5J3k3eS95P/kg+TD5KPk4+ST5NPks+Tz5Ivky+Sr5Ovkm+Tb5Lvk++SH5Mfkp+Tn5Jfk1+S35Pfkj+TP5K/k7+Sf5Nx1JndRNvdRPgzRMozROkzRNszRPi7RMx0jHTMdKx07HScdNx0vHTydIJ0wnSidOJ0knTSdLJ0+nSKdMp0qnTqdJp02nS6dPZ0hnTGdKZ05nSWdNZ0tHpbOno9NBKqmmVVqnTdqmXdqnc6RzpnOlc6fzpPOm86XzpwukC6YLpQuni6SLpouli6dLpEumS6VLp8uky6bLpcunK6QrpiulK6erpKumq6Wrp2uka6ZrpWun66Trpuul66cbpBumG6Ubp5ukm6abpZunW6RbplulW6fbpNum26XbpzukO6Y7pTunu6S7prulu6d7pHume6V7p/uk+6b7pfunB6QHpgelB6eHpIemh6WHp0ekR6ZHpUenx6THpselx6cnpCemJ6Unp6ekp6anpaenZ6RnpmelZ6fnpOem56XnpxekF6YXpRenl6SXppell6dXpFemV6VXp9ek16bXpdenN6Q3pjelN6e3pLemt6W3p3ekd6Z3pXen96T3pvel96cPpA+mD6UPp4+kj6aPpY+nT6RPpk+lT6fPpM+mz6XPpy+kL6YvpS+nr6Svpq+lr6dvpG+mb6Vvp++k76bvpe+nH6Qfph+lH6efpJ+mn6Wfp1+kX6ZfpV+n36Tfpt+l36c/pD+mP6U/p7+kv6a/pb+nf6R/pn+lf6f/pP9mI5mTuZmX+VmQhVmUxVmSpVmW5VmRldkY2ZjZWNnY2TjZuNl42fjZBNmE2UTZxNkk2aTZZNnk2RTZlNlU2dTZNNm02XTZ9NkM2YzZTNnM2SzZrNls2ahs9mx0Nsgk06zK6qzJ2qzL+myObM5srmzubJ5s3my+bP5sgWzBbKFs4WyRbNFssWzxbIlsyWypbOlsmWzZbLls+WyFbMVspWzlbJVs1Wy1bPVsjWzNbK1s7WydbN1svWz9bINsw2yjbONsk2zTbLNs82yLbMtsq2zrbJts22y7bPtsh2zHbKds52yXbNdst2z3bI9sz2yvbO9sn2zfbL9s/+yA7MDsoOzg7JDs0Oyw7PDsiOzI7Kjs6OyY7NjsuOz47ITsxOyk7OTslOzU7LTs9OyM7MzsrOzs7Jzs3Oy87PzsguzC7KLs4uyS7NLssuzy7Irsyuyq7Orsmuza7Lrs+uyG7Mbspuzm7Jbs1uy27PbsjuzO7K7s7uye7N7svuz+7IHsweyh7OHskezR7LHs8eyJ7Mnsqezp7Jns2ey57PnshezF7KXs5eyV7NXstez17I3szeyt7O3snezd7L3s/eyD7MPso+zj7JPs0+yz7PPsi+zL7Kvs6+yb7Nvsu+z77Ifsx+yn7Ofsl+zX7Lfs9+yP7M/sr+zv7J/s33wkd3I393I/D/Iwj/I4T/I0z/I8L/IyHyMfMx8rHzsfJx83Hy8fP58gnzCfKJ84nySfNJ8snzyfIp8ynyqfOp8mnzafLp8+nyGfMZ8pnzmfJZ81ny0flc+ej84HueSaV3mdN3mbd3mfz5HPmc+Vz53Pk8+bz5fPny+QL5gvlC+cL5Ivmi+WL54vkS+ZL5UvnS+TL5svly+fr5CvmK+Ur5yvkq+ar5avnq+Rr5mvla+dr5Ovm6+Xr59vkG+Yb5RvnG+Sb5pvlm+eb5FvmW+Vb51vk2+bb5dvn++Q75jvlO+c75Lvmu+W757vke+Z75Xvne+T75vvl++fH5AfmB+UH5wfkh+aH5Yfnh+RH5kflR+dH5Mfmx+XH5+fkJ+Yn5SfnJ+Sn5qflp+en5GfmZ+Vn52fk5+bn5efn1+QX5hflF+cX5Jfml+WX55fkV+ZX5VfnV+TX5tfl1+f35DfmN+U35zfkt+a35bfnt+R35nfld+d35Pfm9+X358/kD+YP5Q/nD+SP5o/lj+eP5E/mT+VP50/kz+bP5c/n7+Qv5i/lL+cv5K/mr+Wv56/kb+Zv5W/nb+Tv5u/l7+ff5B/mH+Uf5x/kn+af5Z/nn+Rf5l/lX+df5N/m3+Xf5//kP+Y/5T/nP+S/5r/lv+e/5H/mf+V/53/k/9bjBRO4RZe4RdBERZRERdJkRZZkRdFURZjFGMWYxVjF+MU4xbjFeMXExQTFhMVExeTFJMWkxWTF1MUUxZTFVMX0xTTFtMV0xczFDMWMxUzF7MUsxazFaOK2YvRxaCQQouqqIumaIuu6Is5ijmLuYq5i3mKeYv5ivmLBYoFi4WKhYtFikWLxYrFiyWKJYuliqWLZYpli+WK5YsVihWLlYqVi1WKVYvVitWLNYo1i7WKtYt1inWL9Yr1iw2KDYuNio2LTYpNi82KzYstii2LrYqti22KbYvtiu2LHYodi52KnYtdil2L3Yrdiz2KPYu9ir2LfYp9i/2K/YsDigOLg4qDi0OKQ4vDisOLI4oji6OKo4tjimOL44rjixOKE4uTipOLU4pTi9OK04szijOLs4qzi3OKc4vzivOLC4oLi4uKi4tLikuLy4rLiyuKK4uriquLa4pri+uK64sbihuLm4qbi1uKW4vbituLO4o7i7uKu4t7inuL+4r7iweKB4uHioeLR4pHi8eKx4sniieLp4qni2eKZ4vniueLF4oXi5eKl4tXileL14rXizeKN4u3ireLd4p3i/eK94sPig+Lj4qPi0+KT4vPis+LL4ovi6+Kr4tvim+L74rvix+KH4ufip+LX4pfi9+K34s/ij+Lv4q/i3+Kf8uR0ind0iv9MijDMirjMinTMivzsijLcoxyzHKscuxynHLccrxy/HKCcsJyonLicpJy0nKycvJyinLKcqpy6nKactpyunL6coZyxnKmcuZylnLWcrZyVDl7OboclFJqWZV12ZRt2ZV9OUc5ZzlXOXc5TzlvOV85f7lAuWC5ULlwuUi5aLlYuXi5RLlkuVS5dLlMuWy5XLl8uUK5YrlSuXK5SrlquVq5erlGuWa5Vrl2uU65brleuX65QblhuVG5cblJuWm5Wbl5uUW5ZblVuXW5TbltuV25fblDuWO5U7lzuUu5a7lbuXu5R7lnuVe5d7lPuW+5X7l/eUB5YHlQeXB5SHloeVh5eHlEeWR5VHl0eUx5bHlceXx5QnlieVJ5cnlKeWp5Wnl6eUZ5ZnlWeXZ5TnlueV55fnlBeWF5UXlxeUl5aXlZeXl5RXlleVV5dXlNeW15XXl9eUN5Y3lTeXN5S3lreVt5e3lHeWd5V3l3eU95b3lfeX/5QPlg+VD5cPlI+Wj5WPl4+UT5ZPlU+XT5TLTzNpuPHr2A/vdr/z9fRdv//VVGtwv99+vC/9/XbvDfr/rfr//9827heJn1t9546Y1HjR4+DIYPkgy/o8MnGc1Ty1M/fFL+VAc88RblLVrxVPPU8MSbteOJGxU3Km5U3Ki4UXGj4kbFjYobFTcqbtTcqLlRc6PmRs2Nmhs1N2pu1NyoudFwo+FGw42GGw03Gm403Gi40XCj4UbLjZYbLTdabrTcaLnRcqPlRsuNlhsdNzpudNzouNFxo+NGx42OGx03Om703Oi50XOj50bPjZ4bPTd6bvTc6Pt0+P/x0aPtcWCPYo9qj5U91vbY2GNrj5092rWBXRvYtYFdG9i1gV0b2LWBXRvYtYFdG9g1sWti18SuiV0TuyZ2Teya2DWxa2LX1K5V9p+t7Q31//Fde0Ntb2jsDY39vI39vI39vI39vI39vI1da+xaY9cau9batdautXattWutXWvtWmvXWrvW2rXWrnV2rbNrnV3r7Fpn1zq71tm1zq51dq2za71d6+1ab9d6u9bbtd6u9Xatt2u9XbOGxBoSa0isIbGGxBoSa0isIbGGxBoSa0isIbGGxBoSa0isIbGGxBoSa0isIbGGxBoSa0isIbGGxBoSa0isIbGGxBoSa0isIVG7pnZN7ZraNbVratfUrqldU7tW2bXKrlV2rbJrlV2r7Fpl16x5qexaZddqu1bbtdqu1Xattmu1XbMtEdsSsS0R2xKxLRHbErEtEdsSsS0R2xKxLRHbErEtEdsSsS0R2xKxLRHbErEtEdsSsS0R2xKxLRHbErEtEdsSsS0R2xKxLRHbErEtEdsSsS0R2xKxLRHbErEtEdsSsS0R2xKxLRHbErEtEdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbErUtUdsStS1R2xK1LVHbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyAalsKiqbisqmorJ9qGwfKtuHyvahsn2obB8q24fK9qGyfahsHyrbh9r2obZ9qG0fatuH2vahtn2obR9q24fa9qG2fahtH2rbh9pGobZRqG0UahuF2kahtlGobRRqG4XaRqG2Uagt/9ryry3/2vKvLf/a8q8t/9ryry3/2vKvLf/a8q8t/9ryry3/2vKvLf/a8q8t/9ryry3/2vKvLf/a8q8t/9ryry3/2vKvLf/a8q8t/9ryry3/2vKvLf/a8q8t/9ryry3/2vKvLf/a8q8t/9ryry3/2vKvLf/a8q8t/9ryry3/2vKvLf/a8q8t/9ryr+1XidqWoLZfJWr7VaK2fahtH2rbh9p+lahtKmqbitqmorapqG0qapuK2qaitqmobSpqm4rapqKxqWhsKhqbisamorGpaGwqGpuKxqaisalobCoam4rGpqKxXyUaW43GVqOx1WhsNRpbjcZWo7HVaGw1GluNxlajsV8lGvtVorEtaWxLGtuSxraksS1pbEsa25LGtqSxLWlsSxrbksa2pLEtaWxLGtuSxraksS1pbEsa25LGtqSxLWlsSxrbksa2pLEtaWxLGtuSxraksS1pbEsa25LGtqSxLWlsSxrbksa2pLEtaWxLGtuSxraksS1pbEsa25LGtqSxLWlsSxrbksa2pLEtaWxLGtuSxraksS1pbEsa25LGtqSxLWlsSxrbksa2pLEtaWxLGtuSxraksS1pbEsa25LGtqSxLWlsSxrbksa2pLEtaWxLGtuS1raktS1pbUta25LWtqS1LWltS1rbkta2pLUtaW1LWtuS1raktS1pbUta25LWtqS1LWltS1rbkta2pLUtaW1LWtuS1raktS1pbUta25LWtqS1LWltS1rbkta2pLUtaW1LWtuS1raktS1pbUta25LWtqS1LWltS1rbkta2pLUtaW1LWtuS1raktS1pbUta25LWtqS1LWltS1rbkta2pLUtaW1LWtuS1raktS1pbUta25LWtqS1LWltS1rbkta2pLUtaW1LWtuS1raktS1pbUta25LWtqS1LWltS1rbkta2pLUtaW1LWtuS1raktS1pbUta25LWtqS1LWltS1rbkta2pLUtaW1LWtuS1raktS1pbUta25LOtqSzLelsSzrbks62pLMt6WxLOtuSzraksy3pbEs625LOtqSzLelsSzrbks62pLMt6WxLOtuSzraksy3pbEs625LOBqSz1ehsNTpbjc5Wo7PV6Gw1OluNzlajs9XobDU6W43OVqOz1ehsNTpbjc5Wo7PV6Gw1OluNzlajs9XobDU6W43OVqOz1ehsNTpbjc5Wo7PV6Gw1OluNzlajs9XobDU6W43OVqOz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')format(\"woff\");}.ff6{font-family:ff6;line-height:1.065430;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff7;src:url('data:application/font-woff;base64,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')format(\"woff\");}.ff7{font-family:ff7;line-height:1.089000;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff8;src:url('data:application/font-woff;base64,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')format(\"woff\");}.ff8{font-family:ff8;line-height:0.910156;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff9;src:url('data:application/font-woff;base64,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zy7PKc8tzyvPLy8oLywvKi8uLykvLS8rLy+vKK8sryqvLq8pry2vK68vbyhvLG8qby5vKW8tbytvL+8o7yzvKu8u7ynvLe8r7y8fKB8sHyofLh8pHy0fKx8vnyifLJ8qny6fKZ8tnyufL18oXyxfKl8uXylfLV8rXy/fKN8s3yrfLt8p3y3fK98vPyg/LD8qPy4/KT8tPys/L78ovyy/Kr8uvym/Lb8rvy9/KH8sfyp/Ln+Jl1l/642X3njUaPNRmQ8xH7X5aMxHaz468zEk5sdH8yV8KV81Xw1fLV8dXz1fvCy8LLwsvCy8LLwsvCy8LLwsvKy8rBVf3FBuKDeUG8oN5YZyQ7lRc6PmRs2Nmhs1N2pu1NyouVFzo+ZGw42GGw03Gm403Gi40XCj4UbDjYYbLTdabrTcaLnRcqPlRsuNlhstN1pudNzouNFxo+NGx42OGx03Om503Oi40XOj50bPjZ4bPTd6bvTc6LnRc6PnxsCNgRsDNwZuDNwYuDFwY+DGwI1hSOlttP2s7KfYT7Wftf1s7GdrPzv72dtPe62y1yp7rbLXKnutstcqe62y1yp7rbLXKntN7DWx18ReE3tN7DWx18ReE3tN7DWx19ReU3tC7Y+p/TG1P1bbH6vtL1nbF2r7S9b216ntu4393zb2f9vY/0ON/T/U2Bea/+cF+5s19jdr7W/W2t+stddae62111p7rbXXWnuttddae62z1zp7rbPXOnuts9c6e62z1zp7rbPXOnutt9d6e62313p7rbfXenutt9d6e62313p7bbDXBnttsNcGe22w1wZ7bbDXBnttsNds0mKTFpu02KTFJi02abFJi01abNJikxabtNikxSYtNmmxSYtNWmzSYpMWm7TYpMUmLTZpsUmLTVps0mKTFpu02KTFJi02abFJi01a1F6zdYvaa2qvqb2m9ppdArFLIHYJxC6B2CUQuwRil0Bqe6221+w+iN0Hqe212l5r7LXGXrNbInZLxG6J2C0RuyVit0TslojdErFbInZLxG6J2C0RuyVit0TslojdErFbInZLxG6J2C0RuyVit0TslojdErFbInZLxG6J2C0RuyVit0TslojdErFbInZLxG6J2C0RuyVit0TslojdErFbInZLxG6J2C0RuyVit0TslojdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i1RuyVqt0TtlqjdErVbonZL1G6J2i2p7ZbUdktquyW13ZLabkltt6S2W1LbLantltR2S2q7JbXdktpuSW23pLZbUtstqe2W1HZLarsltd2S2m5JbbektltS2y2p7ZbUdktquyW13ZLabkltt6S2W1LbLantltR2S2q7JbXdktpuSW23pLZbUtstqe2W1HZLarsltd2S2m5JbbektltS2y2p7ZbUdktquyW13ZLabkltt6S2W1LbLantltR2S2q7JbXdktpuSW23pLZbUtstqe2W1HZLarsltd2S2m5JbbektltS2y2p7ZbUdktquyW13ZLabkltt6S2W1LbLantltR2S2q7JbVdjdquRt138aZb7b7dZnU//O/HMNp8VOZDzIeaj9p8NOajNR/mwaE3H//7cjN6tPmozIeYDzUftflozEdrPjrz0ZsP83JlXq7My5V5uTIvV+blyrxcmZcr83JlXq7My2JeFvOymJfFvCzmZTEvi3lZzMtiXhbzspqX1bys5mU1L6t5Wc3Lal5W87Kal9W8XJuXa/NybV6uzcu1ebk2L9fm5dq8XJuXa/NyY15uzMuNebkxLzfm5ca83JiXG/NyY15uzMutebk1L7fm5da83JqXW/Nya15uzcutebk1L3fm5c683JmXO/NyZ17uzMudebkzL3fm5c683JuXe/Nyb17uzcu9ebk3L/fmZZNe05uXTYONabAxDTamwcY02JgGG9NgYxpsTIONabAxDbamwdY02JoGW9NgaxpsTYOtabA1DbamwdY02JoGW9NgaxpsTYOtabA1DbamwdY02JoGW9NgaxpsTYOtabA1DbamwdY02JoGW9NgaxpsTYOtabA1DbamwdY02JoGW9NgaxpsTYOtabA1DbamwdY02JoGW9NgaxpsTYOtabA1Dbam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Oq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOq/pvKbzms5rOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/ovKHzhs4bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOm/pvKXzls5bOu/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/ovKPzjs47Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Ou/pvKfzns57Oh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc4HOh/ofKDzgc7RcIKGEzScoOEEDSdoOEHDCRpO0HCChhM0nKDhBA0naDhBwwkaTtBwgoYTNJyg4QQNJ2g4QcMJGk7QcIKGEzScoOEEDSdoOEHDCRpO0HCChhM0nKDhBA0naDhBwwkaTtBwgoYTNJyg4QQNJ2g4QcMJGk7QcIKGEzScoOEEDSdoOEHDCRpO0HCChhM0nKDhBA0naDhBwwkaTtBwgoYTNJyg4QQNJ2g4QcMJGk7QcIKGEzScoOEEDSdoOEHDCRpO0HCChhM0nKDhBA0naDhBwwkaTtBwgoYTNJyg4QQNJ2g4QcMJGk7QcIKGEzScoOEEDSdoOEHDCRpO0HCChhM0nKDhBA0naDhBwwkaTtBwgoYTNJyg4QQNJ2g4QcMJGk7QcIKGEzScoOEEDSdoOEHDCRpO0HCChhM0nKDhBA0naDhBwwkaTtBwgoYTNJyg4QQNJ2g4QcMJGk7QcIKGEzScoOEEDfefL27QeUXnmDjBxAkmTjBxgokTTJxg4gQTJ5g4wcQJJk4wcYKJ+88XN+gcEvefL27QOSJOEHGCiPvPFzfoHBAngDgBxP3nixt0jocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQP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')format(\"woff\");}.ff9{font-family:ff9;line-height:1.064941;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ffa;src:url('data:application/font-woff;base64,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S+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5L7rXkXkvuteReS+615F5LvteS77Xkey35Xku+15LvteR7LfleS77Xku+15Hst+V5LvteS77Xkey35Xku+15LvteR7LfleS77Xku+15Hst+V5LvteS77Xkey35Xku+15LvteR7LfleS77Xku+15Hst+V5LvteS77Xkey35Xku+15LvteR7LfleS77Xku+15Hst+V5LvteS77Xkey35Xku+15LvteR7LfleS77Xku+15Hst+V5LvteS77Xkey35Xku+15LvteR7LfleS77Xku+15Hst+V5LvteS77Xkey35Xku+15LvteR7LfleS77Xku+15HsB+V5AvheQ7wXkewH5XkC+V43vVeN71fheNb5Xje9V43vV+F41vh8T/3/F71Xj96rxe9X4vWr8XjV+rxq/V43fq8bvVeP3qvF71fi9avxeNX6vGr9Xjd+rxu9V4/eq8XvV+L1q/F41fq8av1eN36vG71Xj96rxe9X4vWr8XjV+rxq/V43fq8bvVeP3qvF71fi9avxeNX6vGr9Xjd+rxu9V4/eq8XvV+L1q/F41fq8av1eN36vG71Xj91Lxe6n4vVT8Xip+LxW/l4rfS8XvpeK3TLwHvVT8Xip+LxW/l4rfS8XvpeL3UvF7qfi9VPxeKn4vFb+Xit9Lxe+l4vdS8Xup+L1U/F4qfi8Vv5eK30vF76Xi974dv1eN36vG71Xj96rxe9X4vWr83rfj9wLyewH5vYD8XkB+LyC/F5DfC8jvBeT3AvL7/f7zv/Pvn3/+4f7jLu7mHu7lDvdxf9zs/rH7x+4fu3/s/rH7x+4fu3/s/rH7x26xW+wWu8VusVvsFrvFbrFb7Da7zW6z2+w2u81us9vsNrvN7rA77A67w+6wO+wOu8PusDvsLrvL7rK77C67y+6yu+wuu8tu2A27YTfsht2wG3bDbtgNu8fusXvsHrvH7rF77B67x+6x+7H7sfux+7H7sfux+7H7sfux+7H7Y/fH7o/dH7s/dn/s/tj9sftjl1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7oVdGroldFr4peFb0qelX0quhV0auiV0Wvil4VvSp6VfSq6FXRq6JXRa+KXhW9KnpV9KroVdGroldFr4peFb0qelX0quhV0auiV0Wvil4VvSp6VfSq6FXRq6JXRa+KXhW9KnpV9KroVdGroldFr4peFb0qelX0quhV0auiV0Wvil4VvSp6VfSq6FXRq6JXRa+KXhW9KnpV9KroVdGroldFr4peFb0qelX0quhV0auiV0Wvil4VvSp6VfSq6FXRq6JXRa+KXhW9KnpV9KroVdGroldFr4peNb1qetX0qulV06umV02vml41vWp61fSq6VXTq6ZXTa+aXjW9anrV9KrpVdOrpldNr5peNb1qetX0qulV06umV02vml41vWp61fSq6VXTq6ZXTa+aXjW9anrV9KrpVdOrpldNr5peNb1qetX0qulV06umV02vml41vWp61fSq6VXTq6ZXTa+aXjW9anrV9KrpVdOrpldNr5peNb1qetX0qulV06umV02vml41vWp61fSq6VXTq6ZXTa+aXjW9anrV9KrpVdOrpldNr5peNb1qetX0qunV0KuhV0Ovhl4NvRp6NfRq6NXQq6FXQ6+GXg29Gno19Gro1dCroVdDr4ZeDb0aejX0aujV0KuhV0Ovhl4NvRp6NfRq6NXQq6FXQ6+GXg29Gno19Gro1dCroVdDr4ZeDb0aejX0aujV0KuhV0Ovhl4NvRp6NfRq6NXQq6FXQ6+GXg29Gno19Gro1dCroVdDr4ZeDb0aejX0aujV0KuhV0Ovhl4NvRp6NfRq6NXQq6FXQ6+GXg29Gno19Gro1dCroVdDr4ZeDb0aejX0aujV0KuhV0Ovhl4tvVp6tfRq6dXSq6VXS6+WXi29Wnq19Grp1dKrpVdLr5ZeLb1aerX0aunV0qulV0uvll4tvVp6tfRq6dXSq6VXS6+WXi29Wnq19Grp1dKrpVdLr5ZeLb1aerX0aunV0qulV0uvll4tvVp6tfRq6dXSq6VXS6+WXi29Wnq19Grp1dKrpVdLr5ZeLb1aerX0aunV0qulV0uvll4tvVp6tfRq6dXSq6VXS6+WXi29Wnq19Grp1dKrpVdLr5ZeLb1aerX0aunV0qulV0uvll4tvVp6tfRq6VXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXoVehV6FXo1dGro1dHr45eHb06enX06ujV0aujV0evjl4dvTp6dfTq6NXRq6NXR6+OXh29Onp19Oro1dGro1dHr45eHb06enX06ujV0aujV0evjl4dvTp6dfTq6NXRq6NXR6+OXh29Onp19Oro1dGro1dHr45eHb06enX06ujV0aujV0evjl4dvTp6dfTq6NXRq6NXR6+OXh29Onp19Oro1dGro1dHr45eHb06enX06ujV0aujV0evjl4dvTp6dfTq6NXRq6NXR6+OXh29Onp19Oro1dGro1dHr45effTqo1cfvfro1UevPnr10auPXn306qNXH7366NVHrz569dGrj1599OqjVx+9+ujVR68+evXRq49effTqo1cfvfro1UevPnr10auPXn306qNXH7366NVHrz569dGrj1599OqjVx+9+ujVR68+evXRq49effTqo1cfvfro1UevPnr10auPXn306qNXH7366NVHrz569dGrj1599OqjVx+9+ujVR68+evXRq49effTqo1cfvfro1UevPnr10auPXn306qNXH7366NVHrz569dGrj1599OqjVx+9+ujVR68+evXRq49effTqo1cfvfro1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj1796NWPXv3o1Y9e/ejVj17h2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++Lbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbg28Pvj349uDbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7f+9+19Yro0LAAAAAQACAAgAD///AA94nCXQOU4DURCE4arXzxnR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')format(\"woff\");}.ffa{font-family:ffa;line-height:1.064941;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ffb;src:url('data:application/font-woff;base64,d09GRgABAAAAAUFgABIAAAADY+wABgBiAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAFBRAAAABwAAAAceaeg10dERUYAAMN0AAAA3QAAAS6JuZXoR1BPUwAAxYwAAHu2AAF7wFCeiFhHU1VCAADEVAAAATgAAAOMEH7mjE9TLzIAAAIMAAAAWgAAAGBWRNbSY21hcAAABZwAAACtAAABqnPT7qBjdnQgAAARJAAAAVUAAAJSX09WFGZwZ20AAAZMAAAG2AAADFTeHlV2Z2FzcAAAw2QAAAAQAAAAEAAUACNnbHlmAAAU3AAAZ34AAKrgiik7wmhlYWQAAAGUAAAANgAAADYDLujEaGhlYQAAAcwAAAAgAAAAJAy6DhNobXR4AAACaAAAAzIAAC9G6ptEXGxvY2EAABJ8AAACXgAAHAhowpLqbWF4cAAAAewAAAAgAAAAIBJXAgJuYW1lAAB8XAAACKAAABWTtEjJinBvc3QAAIT8AAA+ZQAAvwdbhxPzcHJlcAAADSQAAAP9AAAGHMU8BUEAAQAAAAb64WW8hmhfDzz1AB8IAAAAAAC55pg9AAAAAORdC2P9/f5AB7QHBgABAAgAAgAAAAAAAHicY2BkYGBn++cAJM/9/fsvhX0LA1AEGXAuAACW3wbjAAEAAA4DAF8ABABQAAQAAgAQAC8AZgAAA9IBIQADAAF4nGNgZjFi2sPAysDBOovVmIGBYQ6EZvzOkMb4j4mfiYWDmZWFjZmJ5QED238HBpZ4BijwDVZQYABCBVl2tn8ODAzsbIwHFBgY54PkmB+whgIpBQYzAL5kDjcAAHic7ZhtaE1xHMe/9/+wm4RpblnIC9OssXm4tly7LutyTWMetnZZ7NjK3BEWRZiVqGGLSVoaMu+WPL9hrkJI4QXxZnmj9kJGSXkqm+85N6Wk7uzOnfp/6tP/4fz+v/M/9/zveRI9CIKIDsB1D5BBdNBsVxdqdDZqUu5jrS6GpcahVC1GgbyDChWgWchwT0SRekGbUSEvo0hewAr1EPNlLvw6iNt2Xjunzu/7ovOY4yRznmd5lkZg6QewxGN6E5P0DvZtZN9W7u8YatUbWPZ4PQGFOoJinQaP+wrGqY/wqJcYrRqxHIYhh+pEDteAJdowTz2ATxxAkdiEkeoW6zvh47YCxliiB5O5jtJSqnlOvUi16/IFChM+H67VROe0sY9rMPL+D6jWvm/qLsJqGCq0ZpmFsPzEsoXtfIRFOz3O8/qG/d0IpwBlqou+4nWjmXF2GeW2l1itDmMO14Nf7cHolHscs43/79VIUxiEtcB5JjqnfayJzjmUkTMxT+6HVzxHqTyCcjkVpcKNgByPafIw/K5PCLm6kS73sv6O94EchOQJWu3E22PLxSOExH0sFQHksG+B9CFD3UCmzOA41sXrvzv3+i1W6srf7wsihAitAnozge/fB/4rDBzO55Qt55RHZ/8pjvfhscKPAG11xl3FZseLuNaf/dn35Hhj1XD44s5bgHaa3Z+5GAwGw2DCa9hc8TlWl+tR/8/3/wEbVBO2Sy+mKI3pSmEG216VzvecJr7fpGMJy0q6xo6jp2kd3evENaHViYu1Y3FR1MlVfL4OIF8tRIBtrypDlbqMLaoYy9i2WF9ux9EzdDNtcOKizB9lXBT7nLgo1soGWLSe2vVauog20HU0QsN05c9jYr2Gz/AH6cx/MvZLb7W7EfXup7QRtXH97lEc+qW+KxHnMt752u88idifwZAsZFvfV9mJoMzjM/t7lkE6np5DSHkQFGPoZD7HP2PfKAR5vSmUT+grxrfEviXJ6862hfIopjJXrjyIEboEHrkbqXIDRslJmJXs4zQYDAaDwf4+new5GAwGw/9Jb0myZ2AwGAwGg2HoI0K4lOw5GAwGg8FgMPw9PwAKW+NHAAB4nGNgYGBmgGAZBkYGEFgC5DGC+SwMHUBajkEAKMLHoMCgyaDH4M7gyxDMkMiQzJDKkM6Qz1DMUKog+/8/UJ0CgwZUPggun8tQBJH///j/nf83/h/4v/v/9v+r/q/8v+L/8v+L/i/4P//+D6i9eAAjGwNcESMTkGBCVwDxAgiwsIJINlxGsYNJDhDByYUiw83Aw8AL9CcI8AsIMjAICTOIEHIZRUCUFMUA9QAntwAAAHicjVbLbxvHGZ8lJZLiw109bNPeNJ3thIqTlcw0TlpGVWxW5NKmWBt60MCu7LZLiQIonnJsgxZQTzJW+iN66/WjT3RPKpBDA9RATj0HQY8xYORQ9Kb+vtklTQkqEmJ3OPP7HvPN95qt7ux3f/fb3zx9suN7j9tbD3/dWm8+uN+o19Z+Vb1399PVX658UvnFzz/+6M6HP/ugfHt5yXn/vVvvLpbeUT+15U/e/vFb1s0bxevXri7Mz82aP7pSyOeyM5l0anoqmTDEklGkYs1z+3SjFlBe1ZUpKf/o9cMyiTnLVrPyTtlfjrlo2iEx36KFDW8gqhWfUs5FlkeULJnf2RB+aEmXpkp41HqnS7e2PFuZ/7LGdB8ydLPm2bZFiRKeJkh41juyS+YGcNuKkCaJDY/f4dk3FYCiYvsYtzx6e7T0/cuMfCHE2ekFMx8ZoTnI36jVSSwMRP4bEleZ7XVFkFilWw4MMTHT2kSZjIXvyJgn4+pDmHx+Cxb7unKJD9xuX7ndA3i0G7zx6evIo7YMZbjlzd7BVBvdon9seoNctqZq+1kAQgNikM0ByTEAFZ8NjPxdQ08SeXdlkBCZAtw3x+a6/PapehxgourwGyjzbyjDs9OTSZKA2Gg2H80iIyhVo3RkhDygaofEsRwsnYYnQ1PsBk6+q7qdpx4lO2AYiGTJ7bXprdbGDiBshTfoSQ53XQ8cPOn2ZIg18wYYVZ2Dfg7v9vYDThMjUHXQZmrekX1q0Rz+XZp1qAC2wuf/tpKhWzyQvAzDI0l/gbkTVJtHJEERpoeuwm5Q5vbXOCTlcdh0Nja7OjjV446kw91+lHudk1H+26FJ+f/YiA7iA0ktGLuyG/TZ5H6Hj+n2ZXi8r496oo+GfJVuv84vCyL7xWNI73huT7lvNsTBMUmWLsraNt1wWDAMXTax04X1kckgvLGfa8JyDNhTo2pb/4m2jgF2rHbqfgzFDDssxpSg7vt2FHewUrp0NH1byZA1pku04Jj2F6CdLi+1tjy3bunTU6LmffqqaL3CvLUxho0ieMLyKyvyUWtbtTajLOiNhqAdFXBiHHmwxvxa68ui9TKaP/UaqhGEYUPJRhiEneHZ4a6SpgoH+Xz4mRtIXf4G8L8dW9Q48ckMesaKjhCrk5x7ja0WzW8+4VA1ZK8TNY57yq5Y9uyYZ+P/keOaQ/ajBrjmQvNb2JZHd7Jkg1vNEB3CIrPCJQuDHnuoiT2dv3pArWxDucVVk/RL7sF27CxkZpw83AM3YxRKbJvr6XhYFbtY0OGmF62l2LWei2rZQRwDppyOKFcfM+VwRBmLBwpxK7a2vye/J3M7nFVz8pOy9r9uvV06beOM/61QphKHfr7mJa1EPEtYSZ5lHbSyVbruaEH2CTpmaCr5lSLToemad2qt+tKcRaszwPPA4QpCR/1KfWlwHxULJhmrZFxjXKCv6vaevF4BcZxI0g2DONMmjxVfBt3e5WcDj6lwPCvin51TfMJ/6vYWd+1Sg+vKsiOOdZ+ucG+mK9/qAfZaNU+iE6FyN/VEurLHwSYZ1HVL8K1JeHj2dVDnFgiTmcWKUxxj5Nrzuba89EMT/RCJ/ucTv7cCLdX3cQL5MbbV1dL2Yi9VrLiieK8mH+U8fezFEQ+Cj8Kz6YObXxaRqDeLr/zLXN5qn1tNbKZplXFnaHvUcEbKo/V9x5pcPrhAbo7IaB9/sj7nayQh1gbKeLY5qBrPtne8F6YQ8lnbe54wErVgzR+8A5r3QgpR1WiCUQZ5IXkhWga0PU9kNL/1oirEoaZOaUCv94aG0FhmhBlib5iIMHOEJYBNRVhVY9FXhVvswQWeQtC7VN3w/uj3wsBnZ4trUQIis9VdQQl1d2AkUnnKqv01yqk1xu8xfi/CU4yn1RrSH8UhudTDQKH80YA9YRk+pzCnS6Ikh2dn6KAv0XltSpWe4kWDnXF8iSxeB999fgPA9+lwr8N2cJomuZc393zKjBWCpUkz0DATawBHQ8vwLQChPSRrR+kpYBTHoU++w5t6B6xASnwPPVArlFqMdE4v8kZlP5xTH+rrJFWibOmI/2ZgGzdCjVhYYjM/clI6D8v3FEh7gYS3p8TeNpJxapGfrBUh+7jVpxb39Zu1YqKIKihXyNLMbb6r0nqeuw2FeNK+HxmvV0cxA/Y2KQeLFidcGQvAOyA12RY8RzCVWf/OajaHYkv9HjXIRmtNaZCpUGp20HAi+RwQVRkJQ1dGQ6zjiwhN88nz+oO2PTz7q/qDPfFbXlK4nT1OTGHhG7Iq/PAiQE/QODMX0YKGwzBTuFwg8lemMP5nULoHyFUhcafAjanFZue4MvfR8v8AEISBYHicndFdTFtlHMfx5zmnLRz6ckrltIVDaaFYCIcIgs40nNhSIIInZoVxQa0JLDzM4XRMy+bLBi2DbrxMpy5sbEvkzgu94Gn0olwMlmUZLNlidGqmJtNlS9R5s4uJdbuY/z7jXAxvjE2+n+fX07SnhWXkwxVfCm78oi+LPfoo14dLH059OPRRrA9RH1Z9FOlD0EehPkz6MOrDEP6drQfM+8w7zNvMW8ybzBvM68xrzKvMK8zLzHXmJeZF5gXmeeY5Zoa5xDzGnGPOMmeYR5hp5hRzknmYOcFMMZPMceYYs5sZZXYxO/M2tDbgAApB26F+aARKQsehRWgJWoW+gszIi6tRAxSCtkP90AiUhI5Di9AStAqZ4R/pD7+Df/7F6Sr/9jvg4CGnfPBQ6dffwD7wNvDGPuD1EWDPXqe8Z2/yrbLR/SVS+auvAbuGgaHdJfLQ7vSbZaUJ53ttpZXvQgVrrjXu19+wMvoFdq3gmu8HVvatpFYMp89wSvgM7j+BP/qYU7IP74btf8ieoDDoHlwb5H2DVjGYv1j/gvfJoP2zofHgJwt+r/tUoC54agErnQv45Dyn2OdD4eAP89hMZTpF+VYrLsBGhJCCTZunYfM0hrtmkTIHzUCzaZMykcTK2LhRGZ+q8k6nsXIUmkoblUlIfk5yb5OkZyXHM5LYLFmaJOFpydQo8Q0SekrKYl841fZ8ZaDGVlsjinW4NvdQyf0tbvxlu/enrXGjMcfdzeE6xVaviFV+W7VfrPDafF5RtBdbhCKzxVRQaOENRgvCnMXEE69Z1ETOjFpQO79LGOWPCp+jT4WfRMGMzLxZbEEtQoyPCwf4UfEsOiucFpeFH5FtGVfiqrBDlLHH6i4os0p2l9VhKLF6W224EmGEQDvUAIWgRWgVV4YDpnq1Tq1VA2q1WqX61ApVVt2qpDpUURVUk8qrSI0292Lq0JDWG6FPYDh3RGizomV5Xw9tUjQqRON9GYw/iMFVyk1nMeqlhuksB4ej7eV4XxaX5l9Oy8sIY0S1gfT7MUXxUKLt6KMpT4w25ceHnhjSaFM3lf0RZesjMbp57H/sKr3XQXMdwztpzt9ONzqG4ckA3fC3Jx69WtdB6zt20lq4GPC3P/aBeMvnI7jBo3vkj0QCbpXIL+qmIfi9W79PRsj/8GhPhHJtr2iU9GhUjsYHaJk/otF1eLYtGqcWfySRSGQQ19ab4fKYgHi8r9WDKxDBHqgcckFOyAEVQyJkhYogASqETJARMoRfIg/IfXKH3Ca3yE1yg1wn18hVcoVcJuvkErlILpDz5BzJkCVyjMyRWTJDjpA0mSKT5DCZICmSJONkjHSTKOkineRff+j/8oj9r3f9AyhhfT8AAAB4nI2RP0jDQBTGf5cmsVNpnZwEwUH8h3RwENpBXFRwKHTpIKU4dBL8U3GpqINg1UGQ4qBScFAcxKmjODo4dBBxqCWIk1MQXRwaX5ISKYr4jnv37ntf7vsuZ5SIgJEmyoCX0eNu9iNk+bVjO8du9mtopvy6Pcwi0VDCsTX5yqkII/aT8zPCram7myINbj34gHXysh6yQ4IsC38e8vEfpfZQSTWqhlQvp2yrEdWjutht4XHVx2VAXKNAjROO2GeJvII3LDalk2M+YLn+xmVAxruOrxFRw7yDlvrFwD13wuiUfo1ZVpmhLFp1nqWX5VU0vr0OBrkkPiqy7smses2c7Lc87Io5UYcLFplqFzOvCWvL8j4b8i4WDwIVSJMMFMZUv+rmXP77izgrazp19cmNaNgqIkhVbmypBpmQKS7L2KyI73rzsfnk2PqkqYyzjmkmjNgXzV1axQAAAHic7cFdSFpRAABg51w5q2lm5ay5m5ma3f7MXb1mR+fM7rmZabkYITFGRIwY4VPEkCERIiOGjIiIPcgQCYmQMaIHiRE+jBESPkRIhIweImSIjBEx1mIMxgpka7SN830MBgP/1s1YYWxccjMxZupygDXAWrsyUHCvUF+4xVazE1c9HDaH4qx8XWQpyhZPlRSUJK4FuGqun5vmBUv5pUE+i+/n+8uYZZ6yXYGrXFQervifzFXqKteFQ8K962MisehRFb9qoVpQ/bj66MaS2CmO530n/zdFF9qHCbFhbK3GXBOTyCQhyV6ttHap9rN0Wpqr09cFZZgsKpfJn8jTCpVivl5ZP1ufynsu30rOBZ1RHjToGkI4Cx9txBsXGtNNeFO4abfZ25xrIVoirYJWd2tapVIFVOk2S1tSTalnzn5riMC+1xJ2YpAYPofTxAsiTER/uKURaIzHBzRjmmdnTJ76w2m1au0kip7LWW3keOJXk/fJUTJKrpJvyLfkJrlNpsl9MqsDOq8u0z7WntKP6Hc6sI4IkAIcuMEk8AI/CIB5EASLIGqoMIwbssbF2xYTzxQyHd55aTaafeZ4J94ZtvAsTy3ZLkVXkGKcbKEmqNdUnEpQ29R7KkN9gkxYDCsgdlIJ1RBAG3TBh3AC+uAsDMFXcB0mYYZm0xitO+XQyak8PqeD9DIdozfoFH1AH3ZzukXdHvQP37TarHPWTM+DnrhNa1u1HfXqe9/Z+fY5B9sx6Ig5Yn3GvuW+j/2u/pCT6fQ49++KURT97XYU/YuPoCiK/nQcRVEURVH0X/0F72d1vAAAeJysvQd8HNW1P37v3NneZnvvva92tVqtpJVG65UsWbItF9mWe8ENjMFUF1zAopgSwJQoNAcIFiGEXkwKgWBMCn4vJMQJJBAgDcJLgAcxBlmj/52Z3dVKlg15v/9HtrR17j39e8499w4gQAkA4ixBP0BABBKPQ5BseUJEBv+Zflwo+GPLE4jAD8HjiH1ZwL78hEgYOtnyBGRfz6jdar9b7S4RLsYHh5gNgv4vv1cijwIAIHiImYnMgjuBHQRonVSGZEO0FAI7sg8Bq8wu2K1NvnskDdr+GQWmNss/o3Up6ElAQk1pWmFG7xGK8A+h1xkN/E8GmX/80VWFwtWf/IBe6YuaHTaFwmH2O2N1fczMdf8NZ0EX9MA5r63fbPFFZy9hfv7hG7ffu3pO3K/V47lEmZnEHZW5cHOgAeTmJLXaZVPMRZt2QI2aIpTQm0035PCPJlsfDPA/3ugPPrqmdaqpCO486yjzOPMW8zbzaGUqMFczFTyX9fjXRTCB+a18Gj1GwEeJ5Lsg+U9MP+YmvIj5FCaYX+P3uc+OfUx+IlgLYuAnj0NiWv8iWmoxmowHSyaTFxwa+5iOKvVdWH59xEoCSRARjQqRcD8dJV1erxIp93u1BA0du9XqhHRnAJqS72ryyU9etxzlSaUOs8Syf1csX5aP4veiapCpS1knj+I+8yi0V8vz7fSXHIBqb4LweliRagyZdEMB1ieIYNatVxJ6tSgo9LqAup4VfZrcus/YvKx79dCi5m2LFs2X6j1RAqR9iptKl96BOfvuuqf/fPkfBCnmL/OXxLcxn//yUWbsGxsvDPS2u3SKYlEVaMszVzu6umE/XPwM1H1/NsvHZQAIWR1vBN8r87G+wUpLdF1Wa30IZHIOPaqvzxws1SOJPIDCslAofLAUsloaGjw5vQDzrynr9FyeYDmYTmOi3s1kNHl1JgM48tTGjKkNPzBm1Bm1Jm9KRjkmer/GEMB0+isMQJY3Ogc06t3ZVpRV1zfkvEoogl4YCHoNE99KQMxMCXQLz8oGVHJ/fnQs5tFKhEgvt/qZzx5j/mbWaqTKSD1zlT9qECgCjfATqIcx+FuBVuVt7jl5oDDdryoW5Rp7cwn+Y84fE6GZa0YTKNpReuBdpn5GUwDzVmoKtabQqt5GH1U8+UuUxSoKCLASAMEszNs6UAAvl7mbs1pimUwMZfbTIAatKBZTQmUapfcraaXiYEmJ6jyED0LiYAlaLfH8LoPP25aJ7xJxDKZ+m34dK2q+zNwMyxpgMVH/jKo1APMGa5aFf5xn2Rz5+mNVuH3mSw6EYZmnrIKmDUYHVlrMd70DOiHH8kASJogo5ASA1Jl0K5GtD3g9xLmjn/qjeqFAHw0Q0y95oLW+K9hx8eoZq4JtkXl5ZndT9yxvOptrUoYaNq3p21Aw7tm1oCg1httSaHmSDpmlRbfH1r+lZ/X1y8JS1zlzr1myRFrsu+d7vbSJeb6nxack7xp9PTpzQ+s112Cdnj/2MfoN9g114A2e60/J/P64kbXXFmyvRmDuM680Y3s163TY4+2ndWSKwm+kVHUQMyUeRwjtj2vNJlPYvYeiUuE9IlEG0CksA8tRVsfZ/+p8suosOIueZN5qVtPHB4597YHpeI3PON2VB7QO7BBaYZZV7wTK1rP+wWDkXYkS6ln+88LxegJB9Vvmi7c0L88n1i2ZtWugbvvfhwbu27BP27xoWn5xffzstTtumHbBmzeue2sVnHPpxaGBaa1L5iaC89du7dnx8IDWxLw9e1ksNLuxqX9OPb3j5pU7nl5lNMB6XsdbsB+m0McAGzL4uKzjM2VhFL6HpmV9MuJ8GZTJSJXeqd+tR1Kkt1opRA3RVioUGMZGDjMoCZJUktCRZBIlbycNAMpCpGswk8mKdbQ+dqWY1XzsmNUs040ZjuWYEaxfSEYnMAp/YNkWLkZZ6cL/fQo0ngN/2a8aZsAfZPmbwFLw+VlJsKwXebGJZHCQZL0QwiaBWHEYOGERD6jm3rlwwe526IaBSDGRmNag+PHS7ZcuT267uUuo0NlDzPWmO28rtSTmpvYK+rrazu++5buGFcvWhl0Ds58Jx+xy+qbdzPZil1evkBbh78lNG1rb6+YmsM4vwTp/N5aDA1xQloKDku2RaZF2iJZRgCRtyHYbaaBoFYDQZdorKse8zLFJMQ/b/qssB/Wnfn2cMxM/PACNLB+IihbqvRwrCFYLcUBDfTNXP7vpjb/s/Mc359xbPKJqafRPyzhiq/ua1uP4s3IeGPv0Ox/tMOo+Wb7Av+RbF19878I0r1ssTV9gmszAVY3yTS4tcg3R52uhSuvUztau0JIGpNVKkZTDLlIKmKEMmREyIMNtNDKYgWbQYvG4tINCzoWyYZ4FNOPybLPU+LplZf1J/ofDTNCQKa444K/hELZNFrm5Oe7kEMssoQj9ad3Prvjgw21v37Jk32pXQKuDo1fB3Vf0bp/+Y7Krb+YSyTObFoOxkfs+3BbpybbNmXfJ09/Ld8Geb91+1y0AIyYfQ5N2zCtsIGA2dJe5NUC7ZgWl4qQ4h3JDNBKLkxQE6TT+/HQ6rUoWUGGITlLULKSa5ZyVnIWMaBat1HTNoilTJ+ocMtm6dYJpdrmXtnsjkEijCBBc2dQ0p34wUoFMRzTGPHX4sIU6in9eL6sSdpNRTHrVbioM4QJ4vhJPcLBhWd3+/zZH2mSrDPMfDDsAgyJsojqh1xMUsnraDNMG3l0msJQacqxRt0L+D8EqtRuyRtzAhTNhxaYbWKuPQg9p/x5p8//m6Jq2tLkld2L44Lb37txy6IrpXe2RQLC9flbftIsPLM3M8sONo8um93Z0T++eMd3n8++8etdeUyf9cDdarJXZVpUeeUoTr3e41FfsO+eOObrs0un5lR7HrHxy7rRQ7MaVy66cH5QKmZ/s2nHBxTsuv/DkQ7ZitKtjfq8n5QIcJu7GWO4drAMD4Ndl+dNin8yHfLexNgxLiCZpRGMzpgYeWrhwwXBpocpoqavvFvRmzD09vcOlHvWgQxwbbHQ0NjqWDICOwb4KrssnkxTGH+/yyKOMyrC6/5XjMWCfcg84iSb/w1HL4OOMV8U+pmw63B+i4l2zGGGweAT7G5J9jRh/jeQiYRULEmXc4s/AX8iX7O+dsbqkX3vbnL6NJSeS6wNWxhH3KOSeZMASi7u0IgHl9TO+hFcukOutfpt/Tk7mizPulF8h0AZTULMLLUL9nYHu5uW9kUWDS5lbYjMTdp2oWJRFZqyA8sVbaBvl9kTqm5kflLpidin7RvdKKC8uaYxYlIm5SWbn8p6orFhURLpWwDtnTI9apSVxRY7kbViOeXBbWY5RI5FHFrNluATN+uBDfr9vuORXhdTKOM4ybqPjVGZQKGx2hILaQQcrMg4r4+SpzL4qWzMcV1kZub7qisB0ui9zKPDMHBYZWaOpSIm8jbEmfAqhwmjz2QJzG+X+JGMfZ6RK3rp8fX7upml2Tg5FWbR7BZRNX9IUNMuT85LM7hUzTuHTTSjX5k8uvmIBs5/nezlekGnMNxWOggvLnDMBLoYBg8SKrEO0hJLvNZlc1F6y7MDeBeO+guULNfnztc4E0y7wVF0C6y44p1AGuUpINN/y260zBp89+3+Pb3+PeXrFiuz0qGbFsmlzA9T6Pz961eE9hbHjj3x4AaF6/TcN624c+N1vFzxclje6Fc87AF4oz7pRDWVATIkJCRKTNCHTyDwypCZJnJezhhR4yOfzDpd8KoPZZB4umcS0SBQK4Ehnr+ZhOKpzRlVjUCyewQH7KAtreNeb+M+GKdvpGS5ZtlIWh7IIAE1pfb9UdN2xuDDtaXUuYcjGtUJlJM3oquqwE81BC3oVzP80tVrrMvX1zIsreqOSU80E820OxgeLMd+S4Dc8354D3rH3n5VQXVKvV+s9NPY+Xcc/QUYtrcUQZkhLgSQO3MkYHcNYeyhmMBmNQeeVKlUieKVQWAfoxNQgv0xk5SELwqNq9hdm46mjus88Kh2r4IUzXJZH+A2TAL6erxWM43v8LJj9nWnDwp6Z3jmrc6u6IhtevKz7+vMGjbliojjL1rV++SWtLZu+ueSBX0DlkiWl9nBTNmpq6l6cWzzYKdd9QHdaWxoCDZlosP+8GXMu7vUnP+J4S2Nbuha9A+LgurJOBtVxDQDx4RJQIXHS9pBFZncgkVuERLfRboPdphuUyZLEoL9iWJkMqLrx5F+xP2rjM0xW8exnvFbF9ZzyxQGtm3XxHJYuJ6G8yxd4cxUozrqlIA2vlHvqAv65eaHaF4ZXCTShJPPxNol82f4ZZ+9uREKZ1m1D74z+duWmNntiXhJe0T09ZJUXR0u9nRGrdJrkJrSgNPtb2+Dmxha31aARcXi0gO4hjgmGgBwj0uATArnmEFQ+aYZC4hBUPClRaQ3PQQVQYUxEHXv3CGj7SyZdl4LYTQhFQTZT40oT40+IF/XnbuuJhaWimyoPBEOzOzYcXDS/bvvs5Nxo7WM8Pgmex7+uEszHuVYMpEA9aKXtQQBwWiBLx2OyeFwWQw3Jeq3SlKwHsUg8DZJvHXvrCPcLJo9ioJbEUZzFaUczyaOpOs6P5XA+zzkvgk1c+NCKtUqkRHZsuN4sV3rD/4mc0BDxGQNWVXurK+UzS1a27JvWuabVpvK1xFwBvUhzEzw5KkSrTjbCvxsM/kg2aE5m8t6euTpf2nGFI2HPdIYDrYXOuDsWDNmEm++9l/kLecfIOvLzLx/GNGH+jp0AQOARLMXe2w2Gy1qXcQG31e2EAreAUrmxLAxegcQtUTkhcu6ncS5jRRBKVEikNyGpUSKRHixJaktHWBPHSxhsBp/GNp1hQSB19QsvsP/rrLTz/3zBAegWsViQ93E5nNeVEQgnYr8boSDT71ZqNjD9/saEBd4LZXCGwZGKjv6+Pq2kmJVww7fh8IpQT2Q1hg5krHc6uXDk2z1tQezxhImIs7fpd0SGxfcrsez/KOjHmVAM44JHytzJxvIovx/7E0lsfyplwDnvfgNt0B8sGZAE57L7JTQ3fxeIO3b50a5MpjkW36WqJELvvo4dHFtM4gs+oFr64bA0Hw8DX28ElkOnvcoAZKE2dlXu2uoRzoDYlwX+chnD6xGZoaFc1CCiEP34+lum7XvuxtGhauXoxvOnL+9o7WQ+Zn5+1gXN9CWLOovNM1fsKPm6zuq5jvhlbPjis25dEZtYOJKp/O7t89/bEm06Z/m8VREB4xvdhpIXr+ta32Yv15HbBWuxzv2oEkPA2Md0dmJd12YTIMF+2kaq2XKNWqWCSqTS6XCc3K/TElBFU5RLvNNUdn2Wo6+foTTERQxQLgl9vTFo3RlLQuUiMptgqikNy8FcRs26Qx8GJhofjhtk+zWmDfPvue/WG7uX5nT7Nj+z+lfMFztvgY5X1n5H0MC8veUc5jXmGPMh8+e61QPMaxbT7TD5/huw/RFDpY7ZgnXPhqPBtrLmuW1xFN9vo23WgyUbUrHVLBWtog6WVMKdwWDSvktfBVinagarWObTXmAqXWJJTDsQ6z6VUCSs1SRWZ3LcQkRZi4gNw+88ck59d3f7j3ecfS/TVFEfeK+me3NPY7Dd7Vv33OWtVkF//fl3Hr38rhOLZq/TayZqzYgPuUyRjs1bv//8yKUE1hPW/mZgHiSgvKInirEX6F6JvEshpmj8h6L0Yj3S76fFCbcY2wogIJZqIoGD2v4EnYgfLCWQw+02IMN+N+32HCy5FZRKZSCgg3Y6U2LDrmDFLi1Hj7EI5Gi6hnXU4baax3yWm+SV4EgySh3h1YqdUsv/y5Rqef81huQXL6JQXVa66hMyl0E1MiLpfe4EPfPNwVjardqyRelJJgff8KYCXqtDs097MlwRkaCf+emKaUHGZW4qMGc3FSyj/5AYArGuNuaWifLhMAorkyCWSRQKy1o5F3gpr8v7mJf0OlQBZyAZ+EmAlKBAIOqIIsd+Ohq1i4Gpz7TSdL4Jv27S61m909N63cGSHgklYsnBktgb8PuBiTYa4w6wSzkulIpIyhC4ljNstlXhDH5KHVnGqnjp/4/Z1IDurxpxwF/JiatedgrxEFBIGcPe0b9VmI5e4YTz4p5kxi3bskXuSSf2jGRzHr1aUCxKTGE6hZbxXOeFg+ylVqa3rcNWloFgLbd+dG9ZBqmIAilupiNeQ+TmVEonIhH29AdLQoPGn8ogT53XixXNi8CuqEzWFFHuslU4nMG5WDXM8slmbSD6mpc1nfYaLHuqyYhbfQqvuAU3d3nBSI+TF3JEEcqOHm/yKJkWUm4M2WsWMRTZIAUPK4INhDQWUgtGZubZdSCVI9cPb2bO87YELFoc0CfobFHla57JPAFn9TZzC0rWSH1DRY+Jczn/Or/MQ71RN1EJdimVDrtaA/Om5LtVFSyXW1STP2ya8IEptIIljoCnkBQO6sQjE6e+ItUaNrG1C7OvqZGdq5fZyq2JW8GC8lwNBq1Oe7CkQyIxEt9Mi/BkFQq7rTzZI4BX0/HZTvp4xaeMz5Zb4MYoecJ04Ql3MDFzyZXpQrNVzk83EtSKz9t0VX1bKh/eYU3l5s0mi2VOyyy+xnyFt4K9eL6d4AeV9c3OTAY7RVqVgXKUyTii8dZ2FGmLRiMHS1EkENuQU+RwOA+WHJ2G5naZsCtj2OWrLL8dxoo6cWmTfcAVGFlUeLRCZfhrDzJpnXOqy2H8hCqgMgGrK2xTCJVzvSzy5LRZBMlDwWwo6Bp9z2OSeOq/ZQuHfbpTxM7yUZ9oyN/fbU1G4VigobOBeR1KW6aH9JL2osCopZwtff8TTemZC6fWa47bzF26+p+sn+b2hmCxJLK1FZjHKj46iflvB5eX+e+FNrvtYMmOgAJik6YoNhpRNKU+WKIUVyiVTtEuwxTYga+sV/hrPcNFJsaw8W8NwAqLiInRiTjXFzGKftrUmfHL9hlOTh+PRpjQUFvqpM3Xsy3LbCpKTSzZy6ohiF8/F9gwfSlwQ5m+sEweCJJ6dxK6Um63CwdVJNZrDXoDNtGgOOyRq0SXh8Np1eXWCpU4GRlfMa+oAX4NZ2wcrWe4YHXddtK3yrSedj2cXa3NBNRZjn6BLeQ2yhmmdUlUIlUFG9iVcL1QEc7C2+Bq99lhSibVe8OYGwqNo9A2chBJ71n8u4/YhVevkl37Drcm0aqefEBZHP1W05FFH0HrD9qbHDp5EWPHs8c+FgQwvlZiDRivyWmQBudaWpEVWffTIlK602h0qnai09bkJn1+ck2O65Dw4VRRrSOUEHIYGENfgl15Jp5l3mTeuBEaXoBRGBv4zl+Zs26+beamafa23WtuvoGCi+DCd2HbQea7zCM/Zj55ZC7xC+bXzBvzbnt1+ytQsY/5kMe/5D1Yxg4QATdWqiE2F3JhtG7TiXQRFNmvo3mvJhCLxAdLItMuny/mxJ6wmmtNAg78+lCZQMeZLzYZAtR8l3XuxEQ/UFnHCGYz45kVAaXGaHw85hMdoycveefBVa0Lzrokn9+8oDPwZTHnNognmfbTP7ry8FpyS/6yjRt21BOsvmO1J/+AeeEB15Y5EdAAJU5VlCraIlKxZkirkBsCeLAENGqrglZadwmFPm85HhyzHKWOVWuTfIW5XAVLs6ywnP5qVTZM/tYATz5fxFCzmEdQcZBwR6TOJJzTQic9sn3kt/ZpDVaHJxPu4iBQUWSMtKfQX20ta+NwBXNviY47NJKT1jL24ey7F+uvk7PvTZV4R4rcyCFwOh0HS06kjaHYflqrVRyCkqdTqXRwl2myFpe9OreoOuV3q+pc/eQAHEchap0ScatStX6+UgVDrykCOXjIFzEIQ/N33rXqG4d3NI8Hc112+Yx1Z4XJxT3NPlVZtKM3XjZ8Qaej+dKHriKurjhwNrqPbpp9xbL03Fv2c3Trx74QWDmdX1Km2yyUGJFOpOexhkOlUjocOiRxWXSY4Ax1JK3m+34ytQSrJn0JyzBTSyZfJylHKy8sE8gurhm16CmVOpOFjwayUTuz7O/MM2zdhAjXp+XaI6QiMiNcV08Wi0J/x6yR75ArqzUTd1vHaJqjwTr2hegpTIMX7CjTEBJKLMgoclPIxHVxIZXLizQqpdfjpjRqF4WfGZHEbzdWSDLmeefMUWbMlDuRysKc8mKYwgmfm0wjmkCmUQszWuFCpS6Tgff60yEHs+9f7zGffcn8xuCJuAhLfdr+feh87x+ISSxz19dhesXhGQtHDqHvnewnV86lXWKO5uz5o93o5EmSj0l6bKNvY7qL4MnKqrnEFG0mi1lIaVG7ulhsP1gqIqcngxrc2WzDwVLWJHGRzVF/e9SkTTVLFFmF1u9ylcj2VJblxGEOnh9OY2CSr/0/FRLiY5brqwacEvZUIhfXv+KEuVrOIeggqyCISEIR219gqNTdUALhOL40GVS6Asu2hayxILzbXl/q+T3sVHvdZpNi9PVYRKRWW667X2uRRkPManeuPQ8FJ8PNIacehzaB26OOttB3PtHc5nMFyeI0sXfOOcyro3+zZsM6GSoWBS6v3BZyxv76iT0VslpDWBTS8Ky58BJ4f2lxUkeW8YAa8/5dzPskuKbiH10UBSQmSzCCjKGypoikXNXMF4E2owvuUqnqUmX/mD+SxnpXC/F5QMj3E9GW019sAuyv+dLABKyIAQGvfUKWe9Ya5UQi4ks+M/x9uM4kYj7x6oxum5nQzzTbvvusVR/2w5ut3kgT9i3MvyrpocgQaa+DGqKl2xv2KTGbpEVLVwtzDTwv1+3zhQmsnfr44i6eN32YNzTmjba6rhkCFHb2lJrWytRcoUuNY54EiAEC+8VSrUAk0otVOP6zTUCZchPQUZY9XAQod6GMxwJuaeEMl6TFfLYx9XcH/G4+TXZnoZvr5FG79fAF6MjNaLBfc9JA7GE+KfY26Pahdy6Nr9rK7C2Sd6XOXgQ3sjgnMfYxuUQwBCwgBPZVMIJIOFwSSaBUFkI+FbcirqIMDmRyDOGsyaLZ63ZHpNZBSw1GwHPKR2vWP9pe5gHCma+EqZryiwPaetYu/FgdqiuWGBiIgjW9DNjYDhBSgz8CjTtgy+J1TU88sfFXQ/fsnbEHuvsHlq5asCS2oJFs6+ptdOkkReXoSzDX4h358vsfXJzPa2DnjotffPLlnyb6MyxOYteMMA9cWPsrnifrsA/jJMcFdXjWQ7SOEuK07yGhUDBcEgol0iSKKqIoehutMIhxpACDyWRdaC9VCaHG2jWkJLfsON7d0caxJvy1B6hdVprqWgNwwlpSoLLmlq0sXJbZVW7mIm2VVSVV14HuZ57e/Ma3Yv1NQm0gDfU7mT/N7W8diC9YEu1vgr7KohLsnv3lyEMfbJVRS84ZSFqk05SjYPslAw9e+PJPowNNnI20AoACgruAHxwsczCtZUt5WtUelQEZhmgVdIiGSwLHdNqq8uKPDZf8drtTS2ucVqdQ7hwkyWCg7EsyR9QZ6hhXuBoHXOlozdojx0H3Vw5Qg7wmf30gx1ZT2J63HLfyW+79gnaY0XvLecf8pJ/anvSbsFl++LsF065Rh93RhPrFF6lwPaMsKj2FXmJDh0htT/ieek75aq4+v3FF787RoZ5WH04hME8wZ8irsV41VzFnKKhWokg4MlyiwvpmB04LkPU2GlGNueFSI2iC4kG9vtDsGkyNm1ZbW7S2pWG8E8J+xmtxJegpvseG9douv5o+FO41PlaR7Gu8BcJfLbmxZ/PWHN9rYk16FQpnXSgwL4eEMo3HxhgcHq2SRFJdIIL1By2dM23O0LZJXSWCs84rOJJzEsxljQW3xaDBr4u05mAHjeQL5uTcOjG2z5f53rlu/KsgOA97PSt4qsy1PCIQWkOriNkEMUZAFfET4k/4ASkBBEUQFCLUD2FUN1xSqcyklRwuWbFj1wyKxdVizmHq8ISuArZIsXzZlgvKaUzqP73+xIaCCVfDMMCdRTVtA2WewteYf51d51dIzFEP1O4sM88kOO/f//7yN1yPwGt1LT6tqCQezVeYxPJDyXTAVzl+GMGhMj+av2q+xocwcB0u6VUSKZJ+k5bYIElIyUGl0myqlLdYllTQ+xQsqfuPhxhPBqbmCWRXZ4O1/RSHmX9BS3jVIwtS01ptZb5w/HjnkvsvW2a62Nq4sBe1l7lSsadfYXtqqXKiIRwaLoVBFIJYTIu099CxnCV2TyqVb8g1DJdyKoHYhKwii8U6XLIAXX1eKmyN6QbdZ6iKRccjbdlRR/+TMUxnvtqApLzOysYwviCmr9Q4amyOr4bxWFuEzJDIN2CEbYx7MzMtLqctJfdnJtid4TK3NxRdnKAWws+CK9cTlzJX9NNWbGWSgGV6z0VBr+bVFV1RxalWd/JppXNOW9LQIadpYctKnsdECvPYCPoqNV1OzsAISZEQO1ghGFQoqnpUMSueVarJHzXVvM2GqcmUwldrSJHoORcC3VPPtdy3zcwl16OPcW5UB56uVEbZ4ZBomBZa9Q9ptRqkGaa1qpQxbomj+G20hXIHUXCIbfbYG4lk9AYfjtcyVgeM6UlVG95X8usTf63pDAx93REmtHBOebEBwYTWIlRuO4PjMEc9AeTAV7lwg0MRkumCAajfoZIvuG02h3bWr2GRzsKl8f6GJ7mowwUldM70lohVJy6Jb0bzujnIY4GtLOB55YVEf2WPB+bjHsxHO4iN14YoSuZGKjfbOh0DITKEQmzvdLmLyhrTDNrtCX+1BfvdDL/uMYFYDsxx0O/MFytXDab67oCf7Q4KVHuOc8YJ3VgTwAwxklt8dsvjT27+3e2ppX3NM/ZQ/iSjzITVZRiTWNBwVX3BP/Lld/+xVW4w5jUj5/UWPMpiUe4pzEI9PIh5MbaomfUv/rGPEUG+CWzg1jJHYloJxq9alQrKkUo7naZUNlpOddlsJoR/2AZqjQboKJ1SrOP7tI9g46UOY9zSVl1wxI/4PrMyaPmqK1ZXzCd9l2/FDpRBS0bv1rNrQdxuihwiFt3Ud9stOwtNLq3gI2hn/qxP+22xOuvWnsK99xPJDmlo2qY5X+5kCls2ZaQWE5/XaMeOkx3oHeAA6yu991CpRnaVhZTpBQ4OoKpEOFsTiewytYu0T1EwqVYVdFN9tVI2qdYU+OLBxPStXFgghMmY5aYDOl0qBq+0e52xAPOzHzMnrJ6wA71TlPh8qZlMD9yd6vZGcqLiNIklMm/+6Ezii9nNTmGxXDc5LlyN6fGDvRX5yWxOJNbaoUBp9ookEvFwSaICGj1CfqDXaSEiNBA/E5udQaX469ROzKe94Cn1E4EMelFtYcgKM5MIRx/86A+/+NTgCLjgB8kkJd35tx/8dK9OhRmwzeG2+73Mp1LiytEdxBedbV4RW0LxmwseZhXx6OgcuLFhho1nhCnSNzA6E9NP4fjowvQ3jddPgMoeJ03+YH0O+bLlZlmB2IDMWKysHcaBMGxXSX0qkNPG7XWmupxUKGwJ+7Sm/2P95KsGPEP9RFsNjexikYhnGlc5aYMoQVaS/wn1FSgibv2HO1NnZ8ytQrlmy0aP2hdkdkcXtr72ocHlsRpl8C9tGt36dSZt2At3xnu7CB/zVLLgEeMAE5fr9Zb7Lg8HTCYPiYNl5/R/wl5X2K+XwGJREVX7bbfsdoQNNi+BcWzbQt5mmB7OZuLgxTKPW0z+ENIHNFZPTGAw6IdLBpUDUCoRNnCRzCODCpldRvDNqaRVTIv0QEUhh0PvCSWt+nGLMnIpD2g7yjWnLuNXgJKZieoX//pj0STrYy1nuNyAgO/CzJSdyIT63qQKy6z2C69c09N+viLoDRRmNuaZEZs77ICfTjbZ+M0PzNX+NemNXHgB8RFnmaex3HJNHt2KeakFd1fstVr/GKLVKiBYKfiVAEmrhZAhtrYiFH5FbaWyk4UvkXBO9ysuO7G+Mvn7A/5Mtb7irdZXbvlNvC2j337yEQK8kmpKOrejGWcHls9nni+ielfvYpjC1I2N8XuBBC9pAkABgFoEn4MprEdaWkaUfB6hxk941QEQzcJotroXgiig9zH+itEGxUMymXS4JFNhTIXzWaMSZ8ks9JqwLIPBRV0qd2rG0X9qtlE8XaJBjH2JfceVZAtwYWS1ls56xF7S65bIvXKT0eslXS6/XO1VG90ShAO6QmKXEBJSIlEbpVDlRBqgVmuGS2rwH7UvlpsNk9A9bulEDma4eil0I+K6dFgpVzLX6ai6KLMtnE774Ox/QbNMa7C4DCc/hKmrilKf11wIxurb7dGcsDhNUb9qLhKcfNpTF7GpBUX4HXiA7UFchGlbQ6ZBAKRBG9hA582mTCiUQZkhOiQHoaFUSs7CNzktlw2X5BJQj+qHAA3gcAmYTfW6wYRtsKmpPVQ/KPx6/YflXaeZmnXLtIOs7DjV60R8p4DQW7PTFKmrLYTeRZGARiAP1BPu87cv6U1bsotLWzabDaFQMVOaef15A51Lmywbz58VMtZvXZd2NM6aWZTa49O64McccJaZ/JmuWMfaTpvUtnttezbp8Vp1Uil6ifm2KVOsnzubyTCXEtGBaekZaQOnc6yOPkMWMQ5oop02AQIE1CBCMETbpDoZUsmGdAacArKtgnt55Hf0GNsneJjHuVyHVV0K8hUUYRmZYYBS2WPIYVv09A53f/cll55/QWZG1rxjzf3nHXjz3Ms+PrjwTtL8v0vnvvG7D/4U7i19ZjPs/fd3vzt6nZbFqKzcHsFys4IgaKXdVrYlHScZ7E42FW214ERcoqJwWi7c6/GE7YP68bX38a6jchce34RXZnvNgrJAXdkN5fUQsbte+cbyTKZu+eI964aYUlkK8Fq35+GH59+xPkmmo/1bHzj39i3ndBQt+glMP+/k99Gx31//kxUsP/G80dt43nEw+JRKHgW2Q2Mv0EUpRnlGJ43/OJ0+I1f0M8qBkdU+tn5V1T4/8le0z+Z0OPwqZTQWSxr9Fe2boslukv5VG90onOVP1EO1N0FO0fbGNhZUtA6dv0NhMtlDgZfW+SMW6fr1UnMotO7VYDLoU++kJlDNjPmyNr2UOaCJxpgXQzE9cwkV6Cwwb/K+jOXDjzg+XPAEpbCzXGiUKLrsJheN/2CfYmJppU0mqFAYkXFIQSvkwyWFJE5AYrgE7S6nM0CpVElTYFBUpn2qXrbqsnIN3XWp6pbv05CtZ70kMZ8hK2SvKZP9zLpI2CRev15kDMfWkSKFPuCYkuj9+mSceSxUZ/55vs1jM6jIii2Rs7EtRcA8Oh7wsvtQVD6nj5Agn0+gUSj0SI8dqBQKBOw+HYFBo44MOhwx015J+SgHvgOXMlWPXeBdKZ88+kXVnbuahvEtq7zRcScwwHJDGPpse8e0c7sPvLFx9xePrLt/2Q7Pqrn79qzdkC9qY0H4p5hHIbPmPPrBjw8+AsG1WuMnA/1/+NM7b/eWUrkGL7ttJTpjWVmG5J+wDFvAIjodVSHVEB31GKJYa33pLHJ73Mg9TGc8ElKkYxvbkHFYaNCDwZhC0RqlBm3jHXKZSoE/Uy5mV/vbxusCBejWn9LyoVfixMOdrSwiC/TkViwuRs0VDZgb2QKCumKqH3Evwi0CVSACP7J5dDIRmlhPePNN/lmtRMtvPfjgjJakAyfRIrXB6mwqVHSYmMH5oAitV8l5BbXyCmocxImRbWI45sQ0QffYKXMJLNHNqCoT/YSfG344aSb80AzFPuVyGuYQUcTjm9nxRaSAHC4JJDqsRd/U6VWDZrPVwo1/hIU/1WY0be3I5bLbszXDRlc/vDA1rdWK1BNGHX18+33bl5outuX7eyuyP47HLrKyNxZQ4R7aqIDGezwplceP5F4Fz41EXRERKcixxOmP1DeiZMnYypks9Vtj+nD61HShKvvJnLLDCZ1gKgjL6gAnFsym4CUVq2u4tF4bCsA/2dJ12X/AgrfgGWWsHpPvQovT4feejtnPUqEdnQ0ulw8Vi4Q5kvuUiWYyorYiMpos6cZHQw7pMV4aFZ/2fcwTB2inPYQDOLCbxlEIShDFbbMe0tJa3XBJS6nVLumgmQ+Xp2kH0/ISmtTYBYMDFZK+FcrEAqKdmpM/LtNKpquyWq5JL6aZJ2spYufXD4DgQTy/PFhP1+cdtFzd5XDkokQDcJtRjqtYSpTqMIpR0WhsuBR12PN5vxkYGj1+6aDB0Ox/DopBXW1/11cdiwLHNbxitzmvUIS86DQ9XFr0R/hqVf95OQoVwZbHvndftF4pYl87UJHt0dfHSeaNomK6kQvuvvAmZh48eN6d593K/OJUqx59oswP8gYuBs3H8kIWKyk3+T1Gr8lkxNmoRKoAcrkCx10rsJuRMHYIip+025NClguar9Hl5oaYRjs8tU8tExj3xpg7KM3sWSGdSNtu+EMJ+wpcxTOD2HDg6uFDUxCSGHx01wSNPflR5ZwB8goca9h9o1HaKGbxES2WcjtBgaGyYbTS1DPeeCaowjIWjRLC6mZQLpYQq779tz27P33guf855+rPmKu2XEgvyOjzqzsvOpfacvyFp07svuLDgy8wzE6i8MHfO7fetejgLxb8N19TZP1FN2cbUTCDDkpc7FEEEolD43Ai55CD5qpCEkqr0Q6XNOSg3x93yQe/us8MpsvbcDzBU6KDQF1FzR7i2rsOr8hvf3DTqlZFIDPuH65deNayiLdlbipHpgu7Ns7afVYQDS2fEZVPZPP5zMrsQHfL7ASHPZcwL5K/xbz14pzhLLoZGOz2FEoN0XapgSv1GgxATsldcqRGcrFajG4Sf1tMiG9UH1A/qkZqhQGY3XtjsXrfXt4FfIITBuyjlx1dxqGUcoo5vtUfh3ajQ8DhEyNLKVsBCRA1QpooI5QNyU0Om9lBuSIRR/u0NSsK7RvWJmf97hgvuO+OPlUjN1VWZbNrpUKZ2Tynlba55nZvM0L9cV6Ux5j/ge/XSpKX44tYjnU4WzqHbnKCDGBzJQAonB4iOwLAIDWkUXqI3VE1XDJIwlKxTIrRq9TpgPlBqxWGQ+0ZOEixEeBlNvOrPfxn6oN6WH/IY7IJdsQRLywf1EOUD+pB1cSJFTv8Mw/SqkiOqLvj5ZXb9yR6Qh3mQDDAHMzkui0eqz2QW9i6oMnOaQJ8/u4yapuoBC07N67fn5Dqujq3xVM2SXH62dfXpQ1igmTWGutntrTMSmj4ODCAc6ZBrB8JsJyuF6kcATLqNEGTFiSoBCFFiSit5TZia6VRdutslN2wG3BcqVLFA1eKRCkQT05xIk/t3lrq8DLOw0w4MGfSUSWT9tOq3zOdsyI2IxFcsmHp1uK5R3aveWjONa5lczr7YytWLrukjb7g7uWPH4X+NWvt0+oTdEs8uOCimWfd2K1RjS5ZUGpOFZvDoYGLepbu6fMloZCnM491YQ7WBS/ooYOI3RiCoawXsAt+nLsBErWOC3iIkHq8Uix8v49DJMfO1C+pZRE54podeYELKm2QedK0Q+QJJBLzeamOfukIGOQicn4yEXQLd5Bp5u3krKB6dGlVfAJKb3M1txLfUYf7otycC5xfZPU3V9O5OFxySnRxFMfZrOoQlD5dV5cJlwN0xTtWG/zgRABVaWOshXN8G2Mn62Du4/13w9n3XbDj4bMzNZjENb9n5mzfJJjFXHH57StjqVU3Xgi/MfGN0ryNLbn1m7h+rLHj5OWYBidooK1isxOqNMhBlckwm01isUOucZOO2oJ8TQcVa0yVqvNUtXYqGVPK7z9kVKdi8Dp7wBV3M4+/xvzV4gk7ccCV+HzmQnD0JPyvfIeDr9nZYv2zTo6gnlktbLWdrbX/W/hTrqYyiw6zNXQk4Urjdi1fFJcAFJhUYg8pxVMU2Pm2yvE6MFs2h2com5MiSAZ/8T9vMKNGt88BP0smpdQNn7/0qyEtlYzDy412o91jYd6WEb8fDaHe3jY7XzjXpBoYJSJOMvCHjV22SCOmSUSZ6/pKJ0eqvYdLONy0mW4ClCNKmr1+nOF4Ml6vZ7jklbANoRaxmT15wkyBrC7qSJqjQBR0UHJPMisXiZqDHp35P6+ZS2o2SQQmlr1zWsSr3Cllb0JEPA3GjKFoSM/IrB61beseq9EfZHb6+lv/MZoteOGHbQbj+RvcjrAX7jWnC01EL3O9pz6swxiXtBm0nuiT93mS5br39G5ogBfMbBKyaR8V8zx4VTSn56reQnfztPJaEebPCsyfBOiiA0BpQwEBu9OYNAj4lMQXDASHSwGNyS4llfbBRCKV5NzAafoCWcphmbpT9RSKkH7cM8Dr32wt+OCIN6jR3Xi7Se3wwY2x+fUjEx0EvAXefXEHJgF5rMacn/kASiN5h8WNCZQvXsisvmiyw+DpYmvQP8F0aUEn7aktE0smFJ25hj4KYAV+nS84H566mQ/H8amKxXccZ4vFO07uJXz/SDUlXDvQxeexxeLniuhyd+9i2FBka8Vc3Uio0wSgulwrdoA5bK0YmuqSIoUfpmTjtWL+88QMwQv481h71UL4doL/NHDYxQY/dIx/mgCtKEN8LngeeDAS3kPPknmRlwEySuaSYcOVkexpUYQFaWlK36U10kac6DO08XOPa6zkOQFgHIXJMHKFU2EiPEp+odFqxUDmQbaReDwZGBFXmt40fCTbUs70J7Rc8SeQLV/GIbpqFaMhxx9MVNnEDytYuub0MfiJqPncltYlyVd/WdfQkJPduuCZnsUbkzJziPlUt35VImjPutENRCoWmZFcuUkZ7exqbdzuj8WX9n5a8GvEBehHzc2+gCVmxnyoRykUFT4PTNhzddABATlWEog+E0sCyIMJ8ozSss+NWvbwC0b7hfJLpzMkMo+M92KNV2bGmxX5ZBtL3NjAr+Gzi9dBUTA3YRl/r8ic/PlS4boN266sX7y1o3VNJLPiWL65lW5qNecigr+0pyziVgnzfbRg+K7Fu2b7zFRY8ZvppfPP3rZFnyyfkzQfpYjvYxnaQSvtUsvlOqRjaPnn+C014o86w7JRUxA6jV/yMjlWu5+7UlDC/DdOqM3WoAkikybOL0y/ZubGGztWfWdt6rK6WyURf2vBFGpwzkP/7GrNzb9pxdnfnEGp7stnLr2obV5Gx2P/hZivvZivTqxfc+iE3TZWsjs/07FqRus+Z9ksEpwQS7AiycMoPCr/QiQ2IsDpz5eq8abJccZWOylerpaIRDUdjkS5w5FjPeJ0qNoTMCa2hQ8vkUqaNqUuuzK3/LKOYLNFZg3/bNmxxga6lG+15QPoRD5gEhXEA7AuMXz3AGa4VNTQndILsQwC7aXzzrn0QhNmO8Hx/O+Y53pgA0tpDKSxZtAqlVOVVCEJUqmwszAjM4PVBugpPUEhHAk1SDOKvgDKLw0Gh001Iqoc3zZJFrX4F5M4USRuTntyQf6QNeK3M69buvn27v4D6795D2I6+gdyCxPXEnUN6RYBemR6rm//6lW3zxt+eP0Kf+S/5s9bNJvTlzZUIOYJj2DstpROapS0Uo/0DK38t0hkFtjMHCXm42789ljJe8Jstdo1artQZh8hyTKGyxyhuGJzemKjB5v5Vw0bG0C5k5Ko7aQU1jZSzvZYpAv8Dg1S3PutQuNGic3odV19tczhZYbQdone64Nb2kiF1XbRDvk33K7WubFVzI0Rl07EluAACeJEAgHBj3Em1gp6wUzwMB12BXpkARIlxOoe1EPrTF09tJqWKLvUarFJ3IAaGJXYKSZ8SMwWnaP4DbE4YQJ03fFEC2ph6MTnphIqMbRpz8zj03WCdntY6Q3XEWEgwMjwyXx+duY5KAXhylFx+Tz1+lH+H2iz/LGauXELrCynWO9WEWjUcjTKPjTmeRxWPbAtEOR8WjNMTz6wraH2vDZB7XltwspxbYEo9OQQ2EJQhjtuDOUslDYRffn9BfedO2vv8kwoYjBk48l0ct4FRVO4HkLGU9eQymTq6tOO+MDSgYFsZmdym6BHKlLnveecLxDJTUqr6XvFFRmFpznhazRr61zxTpdtcS4/r9FCin/Z1Vlsn95dHP2nIxLyxEMua5jD1aiAerCN14NuOlSXGivVZT5zAAvCP6M0+lxBeVFA5fcHxkr+E5IRna6h3jkSqfrOKvypdvxwls2f3TJeQiG4c4T5VtzJhzBhJws3NK3KtMxM6cU2L3Ov0yKR6HAe3BCQmL3MPV6rhFSafa8sF2xIBp25uY3vZ4MmcaEgNIWy328pOFWmuOWzbAgbfkGEX4LvtWbMShE2+Uc5HzYdFeDjwmdwzDeBRtqGCJpSKhVjJeVxA2nCHsx0AqoJ9YhYbDFz5sH1UI4vw75sefsotw5W6f/kwwK/0Q2u/WWPx4oxcvDIcoHKamTuET7z0EMnD4tMwSx0u7xaUauYKWTcBoWgwK5ZmokkXM3NxQCMoEA78GwMOp12rKQ7zrZc0pI9xhNcW+cI39aZrzZ1vsUu+k+ekram/ZL3mXDpL19zdezo9GYSGm5aO7kZ/XTm2t4m9VKNNxWCDD+v0UE+/rDyvwDLPwNW0dmy/HE67EAOhgYyP2BSKYVUJh0ryY57jQFzWRPECo3TbDJlQVUZsAM5XHYp/MG9kzolOb2o6YEkVGySy4IC9tBC/alaAVeLLC53g0vWAjcaY+nMmmFTIORgRn6kdGqoiZpB/kBiCHvNKhfWAaT1hma/544YhQUo0ykvmkIzKnTDYUy3DoRovUY9VtLoPmMbAsdKwhNgRCYz6NXjKl4bsCZNcuJM0PHTjYf1kPwIx5wecDHdbgVGhH9YA0t1dKJYdwzFRunuz0vFYvtYqXhcpnR5s4JGjyKXaxwr5U6IRjTANhLUBIOamR2lupGWSQchVtOtsoZMPrIwU7ZJwySThJNMcqrXqsolynCXID4vrWtet4411e84jRLK7zJlAyKrr/qswY/zQuYBt1UitkaPLJVLW9dmugcE/U3JDVtrbbevYDEnLP/bEJjwSgwbc9gkZFmIjQjmA0asrAP1kXqeh2i+gPVVfXSMQB7kEGE9HaVFn8P6+sxYqf64WhdEEW04HBkrhU8oRkymBgJ6RxKV88BrHNYEPrGqickjvqbXwuyACkxYotAZnMJtiS1u5j6efMFzAwGP4bReazKhPDZBKkyjCli5+i8HRMSfs/VfBnwhx/DDTn2JTq3/wgqC4uqqENUEHPjd+59oWHF577Y7Oxbc9+fCtPamtrZpTSj1wN3zd84Nz7tx+Tnf7IVzLtuz5ZLdu87j8gqiCdXjOfixVxig6/SGDEpakig5Sls+12k4YzlethXPHg+GfoznC/vRWCyr0wcw/pONN+GWj+Wt8ac1LD/VnHgZVPF2dmLT7GoOXHgtEoHKaf3ZYp7/PPQOt9ub8nRbc8He6Cf+yMGMgsTg8xDmBrdeIcAahMXAg3CZ6Oel4gWbLj3PmHKwGBfT2sHh7yjopUOUXO5GbhaBs02tODyQewCMoiAZREEMxKOaEbs97jsqqjbL8tRgIv+riqbYdAKT550Aa09teB3HtmFhfk3djsGGZZd1JhY2ZVfIsAINee3yhka61NRibwyiK+OhB+9ZcFlfQK3zK0ajfp8O65JI54oQqKPj/M0XbzHUeUDFzxD3Ynp8bA1HTNIAUkjG9o6N0uTnPo/HjZO/43qT0TRWMp4Qi0QBH1CP2MoGcnRC6KuIikeEMFO7p4aYykPA5eLMppZEep/E49IG7TKp3cvcWfYDKwRLM0nJDz0BjTMQfrUhZBZMNHF27jMxLt+K5x4G6+iIQGHzkgGVAedBBrWaNQP15yBMhTEcDwfoAEKICXxh0Ou9NhbeKRQhL/77lEAQBaEpyrA1hxuWT86u1mHPVIUtn8qbfYoqtZ1laKKn9cXnXz03tX7OWm1jLpU05vPnLhq6YdsN6NNcrsfkcZnMdaVk26KQWPntupTXanK69JHF9FnrXfez9CUwfS3CPpx1dNE+FUVLJJRIS7GWTVPH+WZhnGNw3cdKnVg3IsThX5NP873HfCtEDVq3cFKZ2D9chudcuYJombYuf+6GhcGQiSKfeOUVhcOqdXj0aF86uHEtnNsm0HuLxQOrmI86cjaRhsLza8e+Z6bgcRAEM7AlBNUABMdK4LjFZDKyQElmtSGRU4REo84vrBYtDpJhYsQzfsDiP8dLBFh5ouVzEsePSawsnqkriR9vIfzL7dAm0dkcrPs0+/Fja+SVJXJp25rMprViq1fwOHNna8Gqxl7z02zIKCkw0xtDRjbXq49s2Pp3HHTFeP4+lEUhPH8nyNN2sWm8vjpWch43nTAZuQIrX2HlIQtbrWybssSqnbjh18tt6oU3+GxSyZrNlMzlgjaHw+16b99PkMFo0QoeLwg1KoXHxJz8izuo1tnJQqvYlGpl+uAfxCmLChXw/IKonnwAz8+Ls+no5PrqWElyHKATOi30Av14gdXpZyus3GxrS6xtk0uscFJnshNqM9oJTbWI+OPeb93yuFpvNsDVfrtA0X/vNfsGKInTDbX+uOcwqofXMFvhH+MeNYkDlV4l1fv/Db/NrHzdH1Rq7YJCq7RpBjMb02HGcViM6WgE59HNQGmLkkYP1zmSKfsXUqRHJqGRdzJRIAjalFK3EmQ1UVvSmMxKBYKmoFtjPENhtSZQTygvGie0DkzsJw5OIH8C7fDj+705K/Ntg16s6JulV5itzN89raFbv20I2LVwuVkrVXR0KVQ2MzR4snXkrUeiXhyZoVwsU1Nr5hn0MqkSYZ5Egze/ZPUqiUILUoqkWvWCmUqTTE7BQovYl+H9r49IczoYBSvprF2lM/iCSOsvg3yV0ClMCpEGCTHaR1KM//aoToiEWqBUIbtd6w4G42ZtVTfZ7uHx3HS8yaCqquWTNSqtvhNKrxP1F/60dOXSfGKhBAe1YJ3X/mNj0Ak38sqskrPKbHP5bSh0xUWKe2x6Q2sB/iYfwB66rNPMe86QpqzTuRxfY8Vx5tuYTg3OG1lfppFSmCLWkZEiMRDhHIcRnZBoBEqViBQIdEDEkcUl3IfTvK84pczKHUGf0VerrHjusPPyugbtitH74JLt3rBDt5wYQLe0Tft9I/ybMVl3lJ0LAnPHPhb8TbAOdIC5YDm4kZ41z7nU3wgCclvnAhLpAv6xUiCgQ7pe1DtE68i2lmktqIWepkVL0dLbkNYTDBptzsZOsg/I5y0gacrY3beb6sY/QnrlwC7shakjah5sU0dZPWQXO7CIKvDr6Lhn5osFfKGA1+S6lL+CA1CuGmW4Y02588PLMqr2j5Z/WI/ZkONKegG+iF7eIaNNwGDlwHf04MYjV/zsLWu6d/2SfJ1l86923PcDa/s5u9qebY9H43WwUSKUiGUypZKitFglTLH2tMUUCbTPvql33nbmpTUrZxQinZHoqzOPNrTkd28urjq/q/Ghu9ILZnZ3pGYtX9O4+s6BK3cm+ubN65n3287c+ob6BCo2KaJWq81iNVvMWJdMJkOmxaJ3z+3rakXhlmunT58XnNPcunk0uejzzuRF0zdtt2P59GH59JMrsb8ogdngLnp+h2OWLwJIfiuBX27Ld5GkVtuG2oZobV0im0CJ2+isgZyFZt1OGmyOSJ4sAnlHF5lWdTjcPREgdgcCaVNLUZVuUbWoxOk5PVeKq1LijpVVcyZU9iecxGpWY9mWQl5aOIDz8hoXFlGp2OWqDRX8jWUMxlqPUiOgBKxISDhRQKhn2obts7Y9vnzGFavy6VWHLmi9cGGm/aLNi57zRyIBaJav7w80xqz6oKdlxp5pDTNnMv9eND/f1NrrebT1FU+q/rw1a+eFg9qWS+d3XbQs3rWn2L+7w5CZ19J61vzchmdCfYmAhygWZx7sCcU1esecYqMmSlydXFdoaOlqTfSPPtf6+6BnWb6f61/dSLYROsFLgATyJ0kCIraBiSsjwKCW0DEP9L0peKnIPF+E5bMjVgt+RORFQvx55VPknvIXLNVv5Jmz2z8TCYvMiU5IgrExJki2jf1a8BIlgs+NPg+4tYzRUcGPxl4XCfFrPxi9E/DXvYPcDh/m9r6GaRtac8pm1POJPQRBwBe4220tW7blAvaWW6xLeJj5F7uRlLuG4DX4sPAIvoaelqEX24hHx7+ypebzwiP483huDeT2sS7BeXgeb4/exc+NyQpeG5suPIJf+1N1bibmLbgLJoAS6GiJ6EnlYyoxelzONuJRx/+CL8unVlzFpT4Iz5FIGy7dNDNap5fDRPis0Lw9O3sXBuav7118IZ5ZG77WA+gd/EgDtCDyBPEYYsuWGqW6C2lVsic1j+ngo4Rc9DiFr//6u+wIbcei5fuLaSeMpIUPMJ9+OT7ategB9tZjo/smDko8wfrCIUwIP64IiIGvMq6SHVesEj0mhITgUezSMuxa1/iI3KjsOFDBfHp7ZQD2N3tZzJtN8Dmik7gOX5d6moAACGCS28rPaoQ76yY6mQB8Ez73a+6zxHKiE6XO/Fli+a/ZXPNJ/EtQvq+dhZYjROA5AgHiJnmEOgKSo0fa2HVFL+KOfhYseXA2jDCfCvpPbkTfHHmDvwkbAgXiZ8QxfB32PGwLCJdPxH7KbEGnOxL72Fecie2f4lBs6CR/erpjsW/h+NTEzEWvCb7J7u2mpQASVsTST/BBHWNNdnHYC9Fro4mXidcF3zzxQ1EH9737xgxIje3TDGK0kb8Pn0oKJUiK0ZZ5CMjMgt0a7vZ3XE9odYVBUHs3vvLN+DT8nfjUP/r4qkL7tf96Zm0u446EwjFPfW7lP1a+ADEzoRw2/GjpZoe1pYf57ZefM6/NKtgd3DyiYwbiDjwPCzsPtg48xN6lR4IAfx8+i2zqeUy4Ex9/Iz6qchu+5z65unV8HkZDytecni94afnzzH8zXzKfMb8ozwRGv4Siu2/ubbYYeHtsxrz8dYWXCEIrAaEAoBpeYrAMGeL1l0cTVVbi7wFmhPh8jP0etmPwBoAQKz1MsgcGLMP6rsYenPicGbnrLqx/O9FjxHHBEKd/JloqFBEvIEhi/JJ8iwNfRzklwdonYDXwqtk3h4lts/aHBEOMGf4dsr/4tbJ1AJDXcWdROsHj9FICIxq51ExCIDAJnA6DSGgU2m16sUQn0aiUMqlWajQJhEK3Fs9QKibldqgw69U2QCnkSP5HBQ0UUIbUFFL/kaIBhR9rpZQi1WTUCoVStr8iU7ndwT/HH3D5QOUfuz8nYznK4eujaXZzDr9FZ+JvSB07jP/VQYQzR+TVuvF/bzbD/c8gN/6P4Rj+i34QeulY/t5G5gP86/lfB3+Kn+ShCf96fvSSEDQFUQPz4Q3MJngr+/8GqL8B7mc2s/9vYD6E+rExcOHYx6SZLGqEaBUnoxA2WgkO6zZQT1t1ZpORxh7KaJSYpewRQt8tSUzgOopizxnlO6H5ugS7LJPhsK/OyN25qLL1nFtvDsKMUE/MFYvcDn9pdF1zu08rdJiN2VIePnKFEKqnOcxeqULc34/09nCzFz4T9pmTG6By5UP82nsKz+kBskgJ0ZqfsM/rmKPoHu75WU+zz+uZt8gFZB7TsJb7/Er8/uvkRfj9dT9jn5/N3vNDsBa/v557fwbzJvo3mcbvb/gv9vkK/H6ce38j9/5i5ijp5nhyNqdDZR7h+OMEdTQlsSHbAawebO3vADDLD0Hhk0ajW/UcxGH5tB2gGJewhgh11R4zroRJNN3y83M6d31//ft/+5Q5O9hX7JjlsiTb46VZXmrzJy/c8ttr25nPmY+Y95l3iOyDrwysePr2a55ZG130Qyyru7Fua/C8LHhWGE0Z9HqxEfsmseS7JbEBHIKCJ5VKm5VfPqmRVFlQNWeDjksJSRTuwuLSycNnL04aHGbnxhl5+DGWkbGpxa+XEkuWCDTuwnT4WNjXmt0A86yEINiC5fM3bh/GItoflMu1EnFEZYQUMtpsLI9om1QcQYLInWKD0UiJBULXIUg+RVGxCJ9Cf3KM7/NgY8rE+6jhl/l72fmrfdswV97FxfUxVAqrbNlTT7yu6I5apOdSJ+8MPLJx0erEvJ5ZyyyPbtm7t3fnY0tVtnDXmtZv9b0rMsaCzCPFjl+smnvpppYFS8/b+n4yrGvc3BNoz+e6+lKX9kl5f3UZ1qMPMF1RsJOOyGUer9eDPAdoL9J6D2zFYXQPCqPwARrHAo5Y7R62DfGA9hD0PCOXiTweIPoh9osBoIKCZx2OuAFTZUge5Zta3mVv0pjkUuqaMpilUpidsLlNm22o1I/5TW38Hfv4DJNfr8yWka7o2k9fvvTpNcWLlt1wz6Y/3HPJT/seM26YtWbNN27q+c7D/X33Bol/frCpY+/S/j0rEhLrs4MXPbUhFDh+7vrBK2649gLRrd84+5L3eb9ZtinsNz3gfDrudomlQE2pCez9bDqxXGIT2xBh09g8NmQibXfRYrFVKjXjjw+XrJgB2Gto5FK7C+mvEwp9trKcjZn069VaJnc4dXm3DduqWhE425fGbU/Jwkx5F5HIW16IwgpQn/NC+LrNo1cKR78g2v5uSgas8g3yjzX+JKP7K+yVKphn3xVqjL585rpN6KyTjyj88bdum067FUVC+j83HRg9zsl2CNu4nLwIS+fbtILdyhuXsYTIkBLDsidtri72L53SGLuUsrtolQ1n4j729oBJPVIgPUWZkOkOSnI+hCqIozD00T6MjQ74DkE3TekNBpf5epUKuK4Ti0MEGK979jym7Fv0uNnVODC5AlougR4p3zzQgi0hyoWQupRxXNCcnar5I8iQW13pWOb0Yegx07p5G1buvCi9PDdAFHwurXKtcfRQ467ZW59efek7d5/zyl+Pb9pw9Q3X30RpmomHZQY380vmG2rNskcuufaHy8I40pb9JDCBOEiAxXRaAe0wDpEJCczsggcrZRNlwjDlLtokSkipAAocoMwQeuXXRaMp0nudrrwCra5URtvG02++osBRBPVCIDLWzp7bZeXLIba+oCzXj8r7NRHa/9/MaFQy4+aV597Vd86f7r/12JYfwWV/+NLTnDYojThar1zV2JPULZIIXK0CZvTfZDaz9tD2K39x4WWfPvw+3P4+NbpYZdXIjXKqsfDcM4l5F0//xq1wL2ffb5JBMo39eictBwq5UCFEwv+vsi+Bj6q697/nnpm5s293Zu7s+9zZMpnJhMlCSHITQjYCgYEAIUBYRAgiiwrigqAICIhbtS6oSNFaUWtRUKy11VZ5vjbpw9eWv6/98xTrkr/W1qXtvxVy8845s2QSwGc/CWHmnHvu/f1+5/f7ne8595zf70GNgsa9qAQ0rZZSlF6lJv1HwA3pv5cp6eh7NS9TNPrbi+BO4egYgZAZkPGRzbWsTxIe+eLfwBlxcbTSa1JfbYP3wM+//mSaBOq07opqcB/Zb5Efe9B4G6MmU3XUCmEyBfQGSZXXWwWrDgpeTu49mEpxERg5KHBMnVKOZuEH5TZyERvaZ5fsS6fr1a59bHyfmpyWJSfbzhqLM2vcA2P+pLBaNyZ2pEthvrj+ISvNViWDpsJJWfJygYXt9Iarr/3jA3f+n831K1rp0ze8u/vjv6wfOdPfV90W1i7qXdynWra0vqcsNb8201HOvkG/rUk8tXnT88t6n76m5+Z5Xk3/e6u/1/f84SsPAdmte8s7estu3HH9iOSOuxtu6OndMTXWuRxNZYj/yY/ByKEkqcVCkAZG4MeaqHCq1Wj8fVhQq00OHAj3oGBSOrBKErejBkAv5/bxfEVinz6/BG4sKuM4XUQfiDJKMw3SYmYgIgajwURLGBZbWUnOCLyIAGprV22YW+WSK6ffvnzDIzM3n33owy8Oi//+h1f8dRkrx8il0rKehstWzP1HO7BMWbTp9k5JJrXy+HU73r5K/G/x03Pid98y0E9oHRaTRmt2JG5+ue+xR/Z/F2OOjUgPuggG2UT8E548mYktThY8erMJbxpMslALWZYxMzjo71MtjInaq1bnN0iUYjHEV2GQp8e92spDsT6WF5pGliyY6vQ4zOmGevDCdgzDGjysoqdH45k6g/6vaJALDwC49AiirRrR8r50JcJL1/4K09o4+jk8Tb5veY3gL6TI26SLEO3XEfy0HNWfl96P6q9/E39fh3hbSq6/gdTPHB2R8NIe9P3GUwSvjf5FsoTwvpXUz0LXN5Prb/oK60JeNpSG8o3Fh5a7oOugIGdw3OeDAmVT7bVaA9q9l8zZNvH6C3K24SMg+KAnQmkUIGm2cdojgtJoOvvwb6665uyjf/9SHBXnhee28rUJr9aRbklkOspY/R6Q/upDUP+EeFR8UnxUvI/+1f8Vz98Q6t7xiy0v/PXWmtY7TpM+fRTJqRbxYaeW5LngEGoTMGxjZAXYtjeH2QqB8cfGyiEjifqhn9ikGPipeFHvpcCdX+NrWDLj/KH1/WnO47D1ra6nldsxuKsLmVUY3Bn8Da30b6LB8rY1BNwBai2imUM0h6nbC7HL0fCmYySC1LNHp4uGGZ3FY6F10OJwEMk6GEmYCcPwQ2Nh+3OLsHlIB/KQLx9MggQs/RdvgcNE5IfAS+FBMoqY6S+bhJD6au782tjBq9ZurFneM2vAeuz6vbu7v/PjOXV3PzNjl/dvbDIpPtS89P1d2x6/Z+a6rRuv/1NF2NS9e2H3bT/83vQH40okg21I/yxIBgnq07wM2kvRoAmjQR2aGyAWKCgQUAiZDVagsyJoYDUJJjxhMNkQJgwEKGYvr9/rdie5BGUTOJJJ7hsQ4eKSz+NBoUPI/OtECCbb+JMvl75/73jUSY9HnYZS0IkuuGfk1ze8uqrlhuXz7+zZ+NHjG38/+5hrzbzf3vdA9w+PLZxXMadJJ1F/trZlx+Kem5eWK3Tz7uq/5viqaOjcVauADCPP+/av3xi/Yl4ee+b8CcGebxUiv/i8jEJOptwqJ8swTvim83fOD50QFamhHg0IDONQyDAC/X6LQy8YVAqEPk37pNKgEwfRKuLPsaSH2F5GsD4tzr0TxV4zhz8dGPD+C48bZ4IXv2VvqAFeiGnpEkx7Nhi3yEaG6f6znoqISzOgHlVaY14RfArmKZXikWYlF25I3peDtMHyM/dlGkOsAmHaDxGmHSH+5RGkp9XS+ykeePJSuzSybf5mZCu7ANnaaApjWjllFizevQjXUkiqBGvk826PYVv9t0W2jm8gMP0vEigEL6baF39ub/W3g9SPHLetm3/l6l3bKjaWLaS7Q36LZp1p5KEpW/tufGXVjZ8cHvh9w9dXXrF7/757jJoa+mml1Su+Lj5gNCx6DkPqGNbl/NiHxvFoMV9dRSmcLmLsAq7WE4vGsNqj3hcOxyWefaZiiFJDMdxZMfu4sYitsUBD3+repYPfBTfpvSQ8Bzhd5xgwP/EH8fOEcuajS65+Yu6G//fUgXc3vwnWfCier5jXzCkvH5gyO23pJ5j83FeSqjTG5L+66sYvn/0EXP8RwuSuCs/kjpdOYDx+Z26N9iaEC+ZJexAeHyiMj5RMg0C5GqFyGV0E5Ajl5RNwXgqUJxtH3sif9UQ6VryJgO5C4iAXa3snQPZ5I78bAn8Xp5ZV+c3qa+zwp1IWQXb4T53Wk87gCDckz14OryDMHkHY6JlC5FQCySd5vZPgpDHcjqdICLfLy2AZQh952B5AsH1vKlWLYXt0r5pkrx8H3IudMx64O4Tgt3qI9VI36P3foX/VxZA/gBvpa6696bOD95+9sXFVB31m2yd3ffWPjSMvr1qxbNnK/hUr1QOrm/oq0ksapy+KYNB/ZPPmo3nQ79Msfffyw4ueP7z2e0C2Y9+O627csWWEvvOuKTfOW3Bza9uWnM9fjGN5kBx7yTE7KaJ+lUfrgZ6HBa3WbbGQRRcL4yY67UZ2YlTaMeIv32csRks0jrOTCyagyE6+1b0nZgkfd5PeUKaqmuCP8dMHcoaYzB8k+bSZZj1obaqYvCqcEkIK5Yz7Vm9+Irv1k8cOnbnyiPjKR2+EhNoKvWpgZd3sSku8HajUmXDyurtm5qYOO9/esFM8dk584Jd45uCK2tPxN94un7upVTxDYkvCBHTL9pO1yTjSATTKDwtMGK9NDlNR9ZDV6tMNXXJfYv4tqiy/KkkXuhu89NwP+g4OLN85O/Ci+F/2mmQo5VS5q6KpahtM/Ofp+/5tUcP6A4v/8B748fb7O1LztnTsO9DYcRe24a2wHhoQPTYqLLAmwRLGKPVPLfKImRrSaosRNApnHIYmrEQSbxzCc5SZSnv5tLKRB2cJAX3A0NxVDjYtk8LPfV6TSgpmzIBKQyAEng26Ez0/n7Ihn2cH1tNfo2eHqHlCKiltlNLIXXB6zstBFeQcggMLRXCEc2fNPpJHpDLPoF4fllu4sdNmX+TO8RQ3DRaOCOPkaSA/dF8AO0EJ7ARTP0jErIo+48gm98buju5Ic01Vm+G2G/Z3DOyanFx9VWgO/FjtdP45XXNHd+fynkTDtJbOw1F75fzaqgUDi93dOV7WwAT9T8RLjLpJaFUpvT6fF3qHBR80+obzQE9LgB7CycMwTFn0FlRgMQpGO7QPG6MqJePzUcxQUDvkdJaZYxRn/ualx0vhwCIMlF249jhu6VHGbPnx7d27s3OXLrt89uFN2YOZ28wdtXdcvqr++pvqJk/u0EqfPDw1PFeYtjKsNF3R3XFVk8t8ZFr9d7pnLpTO7a5v7GzB+tyK9KdOthvpj5e6XKh2OWVynQ4YoM5jlCkZjwyZ6scC3q9Dq6BMZpOHOXTpn1psEb1S7vRC9pxE4vfIinDvjZLVxuLp9wmrjQDvKL7YaiOLcBk0V4IVvEMpPgDuf0rhc7CKuaojantIvGe6TDl4Cl4vN3ki07tpvUjJOceD0yM+fAruzTk94sdK3I/bkH3qZU9QAWq/0KFW2pVQ+bHwmP1Hdlpn99hpBbTbfSw+VMNqtRbYbQGWj7Q8cvIA9SbwCT4JlAz7oqzJ5Ob+qNFQ7iGGCY1fUWRnTf+RLrtwwVHuIsuKjZ/lgiDEc/wvzk+mcLdWFp19Ef8wPnNBlfEZmm17fJvb2vvmNc2eCh63W3SKeXpxTnlPzYJdnT97ofNh2H/klo7ZM7PGIDgi07GnX1XJa9dN377LgftxCeK7DOmvBc0cZwgRp4RjOMh9jGCzRWdB3vVj5Bp0CI0M66IU5VENhUJRieec8YL1wwmOtzK3E5AZB9Myk6rw0mHJwiHmi37p3p/5qq9smX3NlFlPbHnqxD5q9PCLvMscU8uZ1mltbQ2yJVXwnj1eV+Omrrnb2n702F3DdyjF2QqZVc14yq5YtWBR99ycLQ7ADAzJtlIaKiVwShklU8ug7CM1T0cQJFEhH6NTqsbWCMmKINlFdbJkRRBgeAFD4pb7wQLxdDhsUS0y0T+QtZ3/cw3drdR5Y0BPsMUCJLcwkhuOwzaJ6hUqKaDRStIeTxqmhwWPmfEg8zeHYGhYMIeZOIwPM1H/kA06hwwqOJRMVkWGVDnN0P8W/46JccIaoNkyhgOqM6Vjlyx0MRyAv9C7DvU+ueGKgz2P9Uxd/nj/1oemzhDXtjQ1CM31TVOZaS2V9VxHY0uL5K/yqns6N9TXru3Y0yCPLGiatqqqbln91OWPdc5onzato1msmT27rCU8fX43GfuziGcv4pmjgjjyAWNVIsT6saBUGjgD8XqGMIdVhkOqomFM55xO3j+k+ebVPRLjItMgqS5N04DGZbKslxvm8HqeclJbV31Ynh7o3LpnzpPXHnlh9C/XTp5utTWm75wC59fRmkjr8nq3a/fm7lu6jj/zvvg3I/hh2BMVBoRjs+Zi2lfBn0OrdB95T137AqAgOAFUzwsUhf47JpVIoQR9EBRSyFAShlFI8JTJgDxN7j29/qNc2BUWb6lD/1bRR0e66aOS/3/vveKvHsBvv3fSP6GnyZ5F+uCkXFRMsOD3/cNKwcVTDugYppwRlUM6xJJX/41ncnI4kxvgya42Or//gJGZTXj/AWepDLP0tN3PLE2ULXt2V2c4wDk0Wp3GaQ2GWz+/jP5J1ZXPHTjw4ub6BUZDIDpz7v4982bHgkY2CgWin2n6J+BLRA8+KWXF9FAWaBmmBCufI4yLWJTSIUPy7BsT6GHzWcMDmcK6GgvTO46sSCWXP7Mj2VodMFqTszo/Xih7tnLg6KFHX7q6boG+fP53r956aGH8/DAUyHvdt6CbjrAM3EZR5w5QqucBlrOXasxk8LrhVvEdaKAjRgZuJ/W4bLH4Dv01Kbu5WLZGfIv+Jym7pVjWitrW0X5UtqNYtg09T08LqOzWYtkSVFZG2u4slg2Ip2CItqKyXcWyBei6MLlud7Esi8q8pOy2Ytmq0cVodsajsn3Fsp3ifHoa3Y7Kbi+WpcX54EtStr9YtnT0LiSPz3PyOL+CUiD9oxJEGqR+6+hjSB64fjupZ56n5GWomshl9DEkF1x38wV1a0bvQvLBdbcU6oyJfF0rumcd/QlL5JR/pq1s7JnbEE16KGeJzHJtfYW2S1BdGbnvzmJbXQm9A6MPIDm+xxI55trSBZoWoLZh0nY3qVMdowHFkMakPovqvaT+tuK9ucK9KSCuQPzeS/YzsS9RMhrmNv+QcAn5vT/0vefv+Bm8Rtrz9XTp8YL8mBbpKn0Yy0/8Pfr/SbgWRwuAOyQK9Azti5SFgXQ1YR+RWWjTKV2Zb/NOSZubJbNQG/Vx1IbmcZPGDJE1fga+/pYJ1xefAdEz2ovPQD5nD4CSSfBO4nM8ghb8lJL89GIO5vRnY55lD84GBp+mf3bqlNhy6hQZ17ZQcyTTJA2UjAoJOiiV0TIvoCQShKvkVJLEkKVsycpKu3VoyIC327AZYFYA8xY4dP48lIAz74A9p8Wz4nunsS7SUuiWrszpovgOkT/DlOgibYYGUk/kgvvWwhR0kTbTX5O6mwt1jkLdGlpK/5PU3VKog4W6VnTPOml/Thfzz5SXPHMbokkv3ZrTxVxbraygi6iujNx3Z7GtpaTtAK2BIWlPThdzbdWFtgtQ2zBpu5vUEV00M2O6iOq9pP624r0NTFEXcf4e+rz0YTTaLRIqWEHPtrM6QUeiVeqACyfWcbUJdp0fXfBkS9DpdLNGt90tU7tvlUj4UP60uKFS/9tvztpzQdYd/huT7lQ0bFA3RRKXyLmjeL2vfn1PScodih79J8Lq+2V70VzET1UILnfWE5H/wiuodO1er85v5Q1ZfUSb1UVAloqgMZr8YJLj6AMZncl+Pl9pFJYGACpZkpSxEoJ/+HiTShxW6UN+8c1A2KDkAPuLTxidycGOPPjHy2B9tYzzuFrdrowzEJFU1yhSHjZNbxmZanRzOlgNsiBBxqwWROdGhN/wubkmSjhmHqyrc58ABsERi01NNQ0y1uR6hNIyWl4E2VCkSVRnEQZv/AyR+RleOhyqBXlcWpk8i82gJJEmjjWMZ0YQb0IJhNP4bWEYH501pC0Qb0XOYacYYFqifgmgZe4oeNoza86sRr6vPSwkbJGWhTN7qp19kelxV2dgpsIRFCIznDb9rDnOuB7WZ+R8VcQBbrGXT4oxGVplCTdWzrzMI1N5U83xyhlVPjU9z+BZ3RWyK8XfArBLY7NMdjfWgdyZswT9d4SreCooaBRHXa5whGaGg7xRcwJYj1pRn4ycRL/4ZRPmC0cVhgG/AeGEXJhEcz4aE0IR1TjeBv23tSqrr9zzQjze408HbYq1sY5l85fes6yCS3VULt7Vtk12xWvOipBZPH68p8cWSdtfU+k1U9Y/uqz+6hWzXRkd8l24L55GfeGkokhn7NFBhj3qZ9BPLO4VnRGeyL6oMOgXU5fb43+B6DGekAXCaCbqxUfdxgt5/bqXd043hCZ3z+9fkfaprSoga7x2ht6mwDINV0ed4CZ7ojLGVPOLH96c7p/fNcXPyhYAALquuLsLEDvFtCoRrUlqqaCxDDJMqsIraIzt3tCPgZVyjb4mONE3VzfXz61HkxtOQ+kFpbZdb0ZMaPgEXsVWKtTtibCYZ2jkZJz8wSa8+GScfMrJnsXKX1VM35kL2JXvhdIvmEFIYwbpYwMqkyPs/E6n1WlUShculGmMDnPng764i1VeoSFcxjNOsN1ehjXnpDvuUItfKU1u83mrh2XE35hCkzzvF/ik/4L4LKPaBZVzUMMLamM7Hw9gBtzoY8DlYqUeS9LSiLCeUzRmWZ7JyiKSrLRg1iMnSbL5k/EzJ+OA6NK44IEX8JSLSAa2qyNBcW2hy+gjOY72jOdIYmttdDCZ8YaQY+cjlcVnEf9u95vkeX2H65C+V1FdL/iPaqqwiduiGvRTXVNRnkw2Julk0sjYcSozuwfZwEtGPjRMAwaxUVn5WWOhZ4bS45QOMGGSXRUWzoxi1oiplMQCLmRdheGBjC2eSHu272qKGPoPbG6NIm/YFl6rdvFp36rlM7uiFYzRYwU7PW45Dadaoiq9UjJ7zvI1mVvemm+HEolG8YorFWC//8xzT1dXhhwRh0GKmPfHK4IFnXwb9VU91SewNYPyaLRRwQ9yFdkUX55N8nLEleDtD68P0+GwzpN1886sq+iI6SyI1Jc4Y/KDOSYfQCGAMNkOTl5XmS/sRhw3tjRCMBlK4NviNbgbxU9VIW/uIzHCfZzbwNAAmEu/oUsKfu3ZZ0v79jZbWTqKvkkMnDvAm3bsGP9d3IIvzskAnMr5EMHCDcrlLrc+q+M1yHNgDp2lHBad2wQmcnSDUxcSW0LeRIryFJAxnL4ZfIpocFM+Qe8e1Ok8Xi5r4U1ZM8/IqOTQuGebtJAJ47h7Y48HBzx1M/tSMSdv1THjng+/nn9lV3VIc5nKYnH7fDraMp4Iquib3kfPb6PmC5ky1xTYgQRRmU1HUtmKSDjL88FsiG8q03Vb+63r0XTaSpWKqK1URFgBjLVDha9IDXJn+i7odrI8hidvhUgR7NipP5xuFdu0+VJilTsj8QTntbP14CZbKBQ79jdTIiiuNtsVWj3Tq3CyFq3lG0R/p9qX4nhfmSOJrIE2emKviPe4EtKqaqA1qWx2m2qPNqSgnyz2D/ZpHyD54FVxPfbdPq8OMY8ds4tDRvJC0SWX9hQ7UUnGvO54bq7yBsIO+grdpcgd+asm0eUbpQpn8iRrES1N1AyhTD7obvLAWotlari2yRaAgsdT3pAV+FQ2GUlkyyOomyKom5CtUvxEO0X9ApKv5z6czUUDlpQE/UV+qAof3iXHYkE4kIvwlU/9jYFInjOWHgVXYj5g0VqR39GGLXv236QPsWgGQDMhn/iB3a+ByHihPOQB6x6TbSXMNbpzVpA32i/LVkyJL60WnwLZ2IrJsaXV54MV5S5UK2NdZo0aSyZYkXTJMmJ7QRbwbiSLKqpR8Gcor43na+S28myCj2fLeJ9E5856i/4K91CB+dqcbr6eW7p+Hc/ZJvJYNDBQWQ7GnDLqRvoG8bQhaJBIEWe8N8cZBJDhPaACzCEMR13AaQnpIeK3HnzgmOJKr294JM+L1OQy23KslHukmZF3qjcL/YgtN9JFqdHvsvq53AEmmoxB30VjkAFNxAOCQnPU600aj8IwUrnjct4m5u0O5FavSuNDkNURxIskF42lXILQugR88Ov/mLzu0cvWHlydrt94SByBagtfGwnXhCwqiD/XhCO1vBl9Tvz322sOraupXnNgxYYfbKwBr3pmzJpRF/TXtE9vd7q7Zk6fHPBVTetszWOwRQQPp6lJgtMyGI1O8lYMyl0iz1PlogY5CuwkQmNOAitfYXyY6Exz6TYk+K0AMX5IcjzQ+IWAYZwjOJFZ350OmVPtTdNafXytFSmfbmGPLdEQMgX0Ew1J5XSXC/GmlfVOnRSATVjjwIauvkR9SAeA+CqRNebjZcRHhmqmmoWgaTAqt02Z0pJsHpQHEI63lYvV1VRjkZ/MBH5qi0NerbH2Qq5If+Sj4eIXVDhMcM7DYQAAxzZJMuCdMRADTtRtvbzJM6k1Equ1ZZQmm9ci/skUN9coDZzPy0uZaGBBY6AtY1zYfRGuNYn501OdtVGdzNCcWGTwOFhJxtHKrzG5QrrrW50BJIRN6lRLcF4rADnfMg1h/P9A+lZLNb/kKEdjYV1tEOMep1FebgxKuAyOJExT0uFMROf0OGmnZ5jjMfBf3EhAG/YoZBH1LJ7gu2EuQwcdHkM7hcgSeJLmlha6OvOqwhGdHK2tD9U0WmOzGnjhshvrZuyZuplra+RiXmPM5e/qaE67kzPqBcHd9sBciTdYGzZNqQml/G6lMVE3I93eP9mq0f57c5uKC9oiGT3rD8aq25JNazKcRsoaf034K0N9vAL1sRf5cQsY1Gh8frvXa9aJHC/PMhEpwqG5Ph05WZkcm8qURkJHxENyaDmAbIpuUEcC4ooELwVTgkG7QQkHYPUaqDLaUU+GR74scW20VuMJRfTvvmuMhlxqREsS2fadRN8ygl5HUdWxQUcg6+e9WR+fwsBLaY4gonhEVKnrztn66yTS7Rj6GIt0W4JIaKJV9H6iSbNzQ0147o5FC3f3JkqHH7WvNpGqdSukhyYAlN8t2Nod8nVe1wtqbPFxNY9HWye5vDVd8ZzeaGAK3o548VN+gfUhJpSOiAkBe0PWiKdfRfqHyFQ9f3gdyZQdH+E2F37hiahbI/fWefao2ZgbNHIev18vfv30GbnB6rWgcUPqcxnT3PLXVoA+b507GKUzVYx5Untw5An6bkuSt9FVubiwMCWdiWiKUWWCzY+E6kFjAbCgQVvFK7JKnoURKzbhocahAm2EOlWejuIZ+ypj9bg4tlIGwvoHX3j+l4ze4jaDu11lWtnq1KLUoUc3qPSI4mrWZTFq9cr3YYq2jgzTd1mSYTuoykjcHnOlWdx7NwjfPfIi6HLXeWIBSSYDze6AP2of+X5OlsiM4RpEdyM1WQhMrs7W8DoflZI4YtkoH85GeFfWGbFnHZHxClsY1jnkh/BZtnxKtnwIhfy7rEJZI8hzeEF4WsjQgTd1nmRIvMro4lS91iSntamMZoX4y+RU17FfqOxurwHsrrAp5nTpvUEOVBmjEV4nlYpnuVg5GsCg0WSI6nch3tgwpzWopCCT0bcEfgdc+qDXAjMZhdfAa69faqpg7SYagS8HHzMSvhH6gVeSsbxW8HoGkUHU6OXxbCwSyUYRwzaey1pRx8l5GTKKCVimaKkYqfAXjQ+B31pAJ7CYirMQaWYKBJVPcSGVxQ2+wwXQRHe91uQzA3/Q44v8HKj4kLjK5GRVMlqyCTSWTdHYMVq0WK3lxlMnbUm7g0WqpwgGmsXX7JUxr8zNu3F3KnUWi0ElCyQqCV+VCDt+gfiyUE5BgRRDNPFqOYXXTFRkzaQS/8uHTZsYF6HjhM7ttJk0koGRZvCD5wLxgH2APgHvkxmDsTLDuQx93FbV8ecMeQ7JNwyHKZZyCVrqVqXSZNY/yepk90sdVCkqDV2QzndwQirf7otm8cXr3t2SttEDMg6fLz/WTwOaopLJxRUpPFFlV37Rt13GNYkbE+AwXrd8TtIGzsk4PcPcTS/Fzf8H7BYMKgAAeJytWLuOHMcVrVlS4puAIb8CwyjYgShrOCsqoKRlRK1ggQGzBQU5q+mumS5td1WjqnqavZETA/4Ff4JCZwacODD8Ff4AR4ahL/C5t6p7eneHBGGYC87crsd9nPvsEUL8cmHFQqR/n4pNphfilvg+00fipvhrpm+In4n/ZPqmuL/4VabfA/0i0++LexPPW+LZ4odM3xY/Ofpdpu+IXx/9JdN3b/zhzr8yfU98/OAfmb4vfvzwF5l+sPj7j0YdHoqnH/wbmixu3sFTyVoRvcDOnzJ9BGl/zvQNsRJ/y/RN8fPF7Uy/B/o40++Lny5eZfqW2C0uMn1b/OZolek74rdHbabv3rp79M9M3xOvHthM3xePHvyQ6Qc3/vjwSaYfivqD3wNRCYw/EU/EZ6BeCiMK4YUTAf83ImLtFJQXLX8qrBhQFvpL8VzU+JNYN2IrKuwFftL41vje4bPESfG9/PSTJ5/Jl6bwLrhNlKfOt86raJxdyed1Lb3ZVjFIr4P2O13izimENWLNzBUeVbP2BsSXEF8TxF+6Gp/XNT5hneeX5f7SpMKJzBxl4vPGG5ePvWLDQgZBiqcw7wvxOTa0D7BGPl198flVbld5HZZoGD2iIiNdQlSDby/OsUa20U6F1cN+2vJzB0+Npwt8N3hWUNWwV1Z7e0yQSkavSt0ofy7dRsZKz1y09a5rablwTaus0WF1CO03xYc46GziQLsO5wbcIVtesJVb3LP4lKxtie8zrJAkotLZnmWcQ7Z46ayLQ6vli0Ztjd1KZUt5ZryTZ1jtnT8P1xGu8EkYr8FLs/tKRoWi13KsSthEMiRr+Rh7BcdzOk0U+eWqppG1rPHp2FdbpminZ3/R3Za1sDib5CjGLrDtKYtIj4vsJUIlzjTecdgNoDTTls+TZ4tr2rSMWvLH6I3E8yvGYcsrimWOdxL/yN5NOySZ8K+Zv86xmU6n7DbAKq169iN91jkCdkwPfDayPqTjMiNisKdZhmM+F7wfs+TD3OdIjXqMeM69oDniE24Jz70O5/yUzifUUr1SOa98zjCV8Y2TJMqrOOVfwzrWbGVC9oytCjM/k1/abGfaaThriEuKf8Ka4mk9nbKzDDcZDzoVpkhKWIxnKOJ6Xi3YXs05XzFmFBkxF6s5ih3klfjUE4LJ0iFrkVBcM61mNhtGZ80WR94LjGXNeGj2RJgqT8rUEhlkcnaPSH0zZcTh+texHfNMJNvaWSTvc2fMF5K6y/6jXiY5+lN0LGd47SPGQ7PrSF3PqcAx2nH1HlEJ7JXU71KMe9a4Y3/ONd+jlXoi8YmziNFXKlDCwIoP+c53jEW8EudXJXR8O2VoYH4OenQzn5zMpJEeW9ZD8f2ePZtsOVQftXh9RXLPkVnlTpX4bDMumrmkCGhyVs2rRsFdyDJO9Dyw/6k3Xsbk61xzz2e3T3Hac+VIOfFu1bzLmqc4qjkDxzxo84xiZu086a6yL8ZYsbO+lmpU5MxtphuEU5traJjqnGNehn2xr1AjTqkjGfZxqoNj7bXc6+YVSHE2jfna5EgyU4cynCFy1lXnWMy6fqWCXGttZamD2Vpdyo3z0tnHofC07LUqx3YanaydO5db50rZV9htvbERd1SUoVEY24K5wFwgX0RmvNN+kHqHg6FVxcim9Q7tn7o/Tn5l1NZZVfMOzkdT4KFSxtfG6sDLGAHNBqTXUKfG3LDT9SBD9M5ul1DE1FpWzpsLZyMuz44npYgH6ZlM0E0L3aAnczjXEutQDbOmwsDjMfUo6BvpkusiDUFN0PWOzDqrMCSRzYVpIRMPjQtRYvIwhVZrWrI8NRnoYYpAIEELWqldr32hgpZFpbwqIsbDpGK3LjtNCkLoABZQca0JUVwzHjQkAEtd60ZbjMSYwDDOlI8NBh1S6htyxGyI60J2YqFaBpm9Q36RDgBj8patAxxL1ouB8Y8npSZPhcp1dUmqhJpmcSDuddkVmTmrhem8qyMDo3MAQQP7YZTfddhOmI8XukAODbJ0RceWnPA1r7ddrbzsNUnZx6N+nS/3JlaYTHFmC110JAAaRWsUGoXRtsD60KxdnTX5GpF7ztungzc1PHEgzDswB0a1C+SDFm8Zhud1cIf/GRXLIyoiKmrV0IZ+jXMxUMw5qUyjOaBIJySSCRExSNFrdZ8CSHn2awOQDCWUaeFVGlKTFkhDqrMRGXoijvHX898K+Xx1ql7l2f04Z7Tj6V7xZDNglTrWJk9NGHSrGNuT4+O+71fNOHavMLcfQ7rbetVWw3ERN8iX8CYd9txG2XOufJU4Hn4FSOW05dK8b1CWDZHiW26hqSUMU4tPbTk1/fH0WCKLPGpTmV1yMTPcmmvmsBSXh12T7xaZi87PKg9kVJYbblvj8L1mPfZjVBrF7KRXupEGC39tZTPZsBTv8mKWBvI0IKSBJEytp5i4+AMWpHKfRuaCm+khzPpsaRo7a8gp84v3dezpThpaHuH8RyINzOupQV3nnnT4X7Hdc9+/Nvk8FqWWNx/srlowH4ov6/VsFgNkSbIl5vE/vYqmcWHIQ1HPljt+gXtb7Clx+WXNT95xs9eE9ELQ5teCkl/LTB5sEp+Kh+P2rTGafkSx2TN77mOG7F8pHOu7ZqTzjyr7F2zUs7Y2XHhtXMlvXYeKOVBnQM1Hi6Blqlxo8SrqpSxNaGs1LHN7RvHDSz4Vb+48qHmNidTm10PqZeh2lnhhA03Fj8SGJCyv/3KAho/GgYZDv+Xg7pLujAJQH9HBi2qmWQ+h6LF1h/K/195ZtKBH5iM08DUV3uk4OLxNWz7OMwzaVUSFTk1xFJBadub1jBF4ZCAlYk5wXqF/DGhZva2dKi+jp/L448kcx7MDBoYWM0OpyUw6U+m6vYzoSj63Qz5ODuGJwlVmbSL/zPX/6gj7+n3M4bjBXpoSV5ysLSbUd+oTXOqPS71RaGMrFdrX4r/26vyDeJxt2kO0ZVm0buGz7JW27czYYyymbduOtG3btm3btm3bNt5tr93coxduFKLNQsT81ynMr51CH3FH/v+ff08dOWvk//hTev/zlzPijngj2Ug+MtbIzCOjRuqRZmThkUVHFh9ZcmT5kRVGVhxZZWTVkdVHbnZcx3N8J3BCJ3JiJ3FSJ3Nyp3BKZwxnTGcsZ2xnHGdcZzxnfGcCZ0JnImdiZxJnUmcyZ3JnCmdKZypnamcaZ1pnOmd6ZwZnRmcmZ2ZnFmdWZzZndmcOZ5QzcMRRp3Jqp3Fap3N6Z05nLmduZx5nXmc+Z35nAWdBZyFnYWcRZ1FnMWdxZwlnSWcpZ2lnGWdZZzlneWcFZ0VnJWdlZxVnVWc1Z3VnDWdNZy1nbWcdZ11nPWd9ZwNnQ2cjZ2NntLOJs6mzmbO5s4WzpbOVs7WzjbOts52zvbODs6Ozk7Ozs4uzq7Obs7uzh7Ons5ezt7OPs6+zn7O/c4BzoHOQc7BziHOoc5hzuHOEc6RzlHO0c4xzrHOcc7xzgnOic5JzsnOKc6pzmnO6c4ZzpnOWc7ZzjnOuc55zvnOBc6FzkXOxc4lzqXOZc7lzhXOlc5VztXONc61znXO9c4Nzo3OTc7Nzi3Orc5tzu3OHc6dzl3O3c49zr3Ofc7/zgPOg85DzsPOI86jzmPO484TzpPOU87TzjPOs85zzvPOC86LzkvOy84rzqvOa87rzhvOm85bztvOO867znvO+84HzofOR87HzifOp85nzufOF86XzlfO1843zrfOd873zg/Oj85Pzs/OL86vzm/O784fzp/OX87fzj/OvO+I6rut6ru8GbuhGbuwmbupmbu4WbumO4Y7pjuWO7Y7jjuuO547vTuBO6E7kTuxO4k7qTuZO7k7hTulO5U7tTuNO607nTu/O4M7ozuTO7M7izurO5s7uzuGOcgeuuOpWbu02but2bu/O6c7lzu3O487rzufO7y7gLugu5C7sLuIu6i7mLu4u4S7pLuUu7S7jLusu5y7vruCu6K7kruyu4q7qruau7q7hrumu5a7truOu667nru9u4G7obuRu7I52N3E3dTdzN3e3cLd0t3K3drdxt3W3c7d3d3B3dHdyd3Z3cXd1d3N3d/dw93T3cvd293H3dfdz93cPcA90D3IPdg9xD3UPcw93j3CPdI9yj3aPcY91j3OPd09wT3RPck92T3FPdU9zT3fPcM90z3LPds9xz3XPc893L3AvdC9yL3YvcS91L3Mvd69wr3Svcq92r3Gvda9zr3dvcG90b3Jvdm9xb3Vvc29373DvdO9y73bvce9173Pvdx9wH3Qfch92H3EfdR9zH3efcJ90n3Kfdp9xn3Wfc593X3BfdF9yX3ZfcV91X3Nfd99w33Tfct9233Hfdd9z33c/cD90P3I/dj9xP3U/cz93v3C/dL9yv3a/cb91v3O/d39wf3R/cn92f3F/dX9zf3f/cP90/3L/dv9x//VGPMdzPc/zvcALvciLvcRLvczLvcIrvTG8Mb2xvLG9cbxxvfG88b0JvAm9ibyJvUm8Sb3JvMm9Kbwpvam8qb1pvGm96bzpvRm8Gb2ZvJm9WbxZvdm82b05vFHewBNPvcqrvcZrvc7rvTm9uby5vXm8eb35vPm9BbwFvYW8hb1FvEW9xbzFvSW8Jb2lvKW9ZbxlveW85b0VvBW9lbyVvVW8Vb3VvNW9Nbw1vbW8tb11vHW99bz1vQ28Db2NvI290d4m3qbeZt7m3hbelt5W3tbeNt623nbe9t4O3o7eTt7O3i7ert5u3u7eHt6e3l7e3t4+3r7eft7+3gHegd5B3sHeId6h3mHe4d4R3pHeUd7R3jHesd5x3vHeCd6J3kneyd4p3qnead7p3hnemd5Z3tneOd653nne+d4F3oXeRd7F3iXepd5l3uXeFd6V3lXe1d413rXedd713g3ejd5N3s3eLd6t3m3e7d4d3p3eXd7d3j3evd593v3eA96D3kPew94j3qPeY97j3hPek95T3tPeM96z3nPe894L3oveS97L3iveq95r3uveG96b3lve29473rvee9773gfeh95H3sfeJ96n3mfe594X3pfeV97X3jfet9533vfeD96P3k/ez94v3q/eb97v3h/en95f3t/eP96//ojv+K7v+b4f+KEf+bGf+Kmf+blf+KU/hj+mP5Y/tj+OP64/nj++P4E/oT+RP7E/iT+pP5k/uT+FP6U/lT+1P40/rT+dP70/gz+jP5M/sz+LP6s/mz+7P4c/yh/44qtf+bXf+K3f+b0/pz+XP7c/jz+vP58/v7+Av6C/kL+wv4i/qL+Yv7i/hL+kv5S/tL+Mv6y/nL+8v4K/or+Sv7K/ir+qv5q/ur+Gv6a/lr+2v46/rr+ev76/gb+hv5G/sT/a38Tf1N/M39zfwt/S38rf2t/G39bfzt/e38Hf0d/J39nfxd/V383f3d/D39Pfy9/b38ff19/P398/wD/QP8g/2D/EP9Q/zD/cP8I/0j/KP9o/xj/WP84/3j/BP9E/yT/ZP8U/1T/NP90/wz/TP8s/2z/HP9c/zz/fv8C/0L/Iv9i/xL/Uv8y/3L/Cv9K/yr/av8a/1r/Ov96/wb/Rv8m/2b/Fv9W/zb/dv8O/07/Lv9u/x7/Xv8+/33/Af9B/yH/Yf8R/1H/Mf9x/wn/Sf8p/2n/Gf9Z/zn/ef8F/0X/Jf9l/xX/Vf81/3X/Df9N/y3/bf8d/13/Pf9//wP/Q/8j/2P/E/9T/zP/c/8L/0v/K/9r/xv/W/87/3v/B/9H/yf/Z/8X/1f/N/93/w//T/8v/2//H/zcYCZzADbzAD4IgDKIgDpIgDbIgD4qgDMYIxgzGCsYOxgnGDcYLxg8mCCYMJgomDiYJJg0mCyYPpgimDKYKpg6mCaYNpgumD2YIZgxmCmYOZglmDWYLZg/mCEYFg0ACDaqgDpqgDbqgD+YM5grmDuYJ5g3mC+YPFggWDBYKFg4WCRYNFgsWD5YIlgyWCpYOlgmWDZYLlg9WCFYMVgpWDlYJVg1WC1YP1gjWDNYK1g7WCdYN1gvWDzYINgw2CjYORgebBJsGmwWbB1sEWwZbBVsH2wTbBtsF2wc7BDsGOwU7B7sEuwa7BbsHewR7BnsFewf7BPsG+wX7BwcEBwYHBQcHhwSHBocFhwdHBEcGRwVHB8cExwbHBccHJwQnBicFJwenBKcGpwWnB2cEZwZnBWcH5wTnBucF5wcXBBcGFwUXB5cElwaXBZcHVwRXBlcFVwfXBNcG1wXXBzcENwY3BTcHtwS3BrcFtwd3BHcGdwV3B/cE9wb3BfcHDwQPBg8FDwePBI8GjwWPB08ETwZPBU8HzwTPBs8FzwcvBC8GLwUvB68ErwavBa8HbwRvBm8FbwfvBO8G7wXvBx8EHwYfBR8HnwSfBp8FnwdfBF8GXwVfB98E3wbfBd8HPwQ/Bj8FPwe/BL8GvwW/B38EfwZ/BX8H/wT/hiOhE7qhF/phEIZhFMZhEqZhFuZhEZbhGOGY4Vjh2OE44bjheOH44QThhOFE4cThJOGk4WTh5OEU4ZThVOHU4TThtOF04fThDOGM4UzhzOEs4azhbOHs4RzhqHAQSqhhFdZhE7ZhF/bhnOFc4dzhPOG84Xzh/OEC4YLhQuHC4SLhouFi4eLhEuGS4VLh0uEy4bLhcuHy4QrhiuFK4crhKuGq4Wrh6uEa4ZrhWuHa4TrhuuF64frhBuGG4UbhxuHocJNw03CzcPNwi3DLcKtw63CbcNtwu3D7cIdwx3CncOdwl3DXcLdw93CPcM9wr3DvcJ9w33C/cP/wgPDA8KDw4PCQ8NDwsPDw8IjwyPCo8OjwmPDY8Ljw+PCE8MTwpPDk8JTw1PC08PTwjPDM8Kzw7PCc8NzwvPD88ILwwvCi8OLwkvDS8LLw8vCK8MrwqvDq8Jrw2vC68PrwhvDG8Kbw5vCW8NbwtvD28I7wzvCu8O7wnvDe8L7w/vCB8MHwofDh8JHw0fCx8PHwifDJ8Knw6fCZ8NnwufD58IXwxfCl8OXwlfDV8LXw9fCN8M3wrfDt8J3w3fC98P3wg/DD8KPw4/CT8NPws/Dz8Ivwy/Cr8Ovwm/Db8Lvw+/CH8Mfwp/Dn8Jfw1/C38Pfwj/DP8K/w7/Cf8N9oJHIiN/IiPwqiMIqiOEqiNMqiPCqiMhojGjMaKxo7GicaNxovGj+aIJowmiiaOJokmjSaLJo8miKaMpoqmjqaJpo2mi6aPpohmjGaKZo5miWaNZotmj2aIxoVDSKJNKqiOmqiNuqiPpozmiuaO5onmjeaL5o/WiBaMFooWjhaJFo0WixaPFoiWjJaKlo6WiZaNlouWj5aIVoxWilaOVolWjVaLVo9WiNaM1orWjtaJ1o3Wi9aP9og2jDaKNo4Gh1tEm0abRZtHm0RbRltFW0dbRNtG20XbR/tEO0Y7RTtHO0S7RrtFu0e7RHtGe0V7R3tE+0b7RftHx0QHRgdFB0cHRIdGh0WHR4dER0ZHRUdHR0THRsdFx0fnRCdGJ0UnRydEp0anRadHp0RnRmdFZ0dnROdG50XnR9dEF0YXRRdHF0SXRpdFl0eXRFdGV0VXR1dE10bXRddH90Q3RjdFN0c3RLdGt0W3R7dEd0Z3RXdHd0T3RvdF90fPRA9GD0UPRw9Ej0aPRY9Hj0RPRk9FT0dPRM9Gz0XPR+9EL0YvRS9HL0SvRq9Fr0evRG9Gb0VvR29E70bvRe9H30QfRh9FH0cfRJ9Gn0WfR59EX0ZfRV9HX0TfRt9F30f/RD9GP0U/Rz9Ev0a/Rb9Hv0R/Rn9Ff0d/RP9G4/ETuzGXuzHQRzGURzHSZzGWZzHRVzGY8RjxmPFY8fjxOPG48XjxxPEE8YTxRPHk8STxpPFk8dTxFPGU8VTx9PE08bTxdPHM8QzxjPFM8ezxLPGs8Wzx3PEo+JBLLHGVVzHTdzGXdzHc8ZzxXPH88TzxvPF88cLxAvGC8ULx4vEi8aLxYvHS8RLxkvFS8fLxMvGy8XLxyvEK8YrxSvHq8SrxqvFq8drxGvGa8Vrx+vE68brxevHG8QbxhvFG8ej403iTePN4s3jLeIt463ireNt4m3j7eLt4x3iHeOd4p3jXeJd493i3eM94j3jveK9433ifeP94v3jA+ID44Pig+ND4kPjw+LD4yPiI+Oj4qPjY+Jj4+Pi4+MT4hPjk+KT41PiU+PT4tPjM+Iz47Pis+Nz4nPj8+Lz4wviC+OL4ovjS+JL48viy+Mr4ivjq+Kr42via+Pr4uvjG+Ib45vim+Nb4lvj2+Lb4zviO+O74rvje+J74/vi++MH4gfjh+KH40fiR+PH4sfjJ+In46fip+Nn4mfj5+Ln4xfiF+OX4pfjV+JX49fi1+M34jfjt+K343fid+P34vfjD+IP44/ij+NP4k/jz+LP4y/iL+Ov4q/jb+Jv4+/i7+Mf4h/jn+Kf41/iX+Pf4t/jP+I/47/iv+N/4n+TkcRJ3MRL/CRIwiRK4iRJ0iRL8qRIymSMZMxkrGTsZJxk3GS8ZPxkgmTCZKJk4mSSZNJksmTyZIpkymSqZOpkmmTaZLpk+mSGZMZkpmTmZJZk1mS2ZPZkjmRUMkgk0aRK6qRJ2qRL+mTOZK5k7mSeZN5kvmT+ZIFkwWShZOFkkWTRZLFk8WSJZMlkqWTpZJlk2WS5ZPlkhWTFZKVk5WSVZNVktWT1ZI1kzWStZO1knWTdZL1k/WSDZMNko2TjZHSySbJpslmyebJFsmWyVbJ1sk2ybbJdsn2yQ7JjslOyc7JLsmuyW7J7skeyZ7JXsneyT7Jvsl+yf3JAcmByUHJwckhyaHJYcnhyRHJkclRydHJMcmxyXHJ8ckJyYnJScnJySnJqclpyenJGcmZyVnJ2ck5ybnJecn5yQXJhclFycXJJcmlyWXJ5ckVyZXJVcnVyTXJtcl1yfXJDcmNyU3Jzcktya3JbcntyR3Jncldyd3JPcm9yX3J/8kDyYPJQ8nDySPJo8ljyePJE8mTyVPJ08kzybPJc8nzyQvJi8lLycvJK8mryWvJ68kbyZvJW8nbyTvJu8l7yfvJB8mHyUfJx8knyafJZ8nnyRfJl8lXydfJN8m3yXfJ98kPyY/JT8nPyS/Jr8lvye/JH8mfyV/J38k/ybzqSOqmbeqmfBmmYRmmcJmmaZmmeFmmZjpGOmY6Vjp2Ok46bjpeOn06QTphOlE6cTpJOmk6WTp5OkU6ZTpVOnU6TTptOl06fzpDOmM6UzpzOks6azpbOns6RjkoHqaSaVmmdNmmbdmmfzpnOlc6dzpPOm86Xzp8ukC6YLpQunC6SLpouli6eLpEumS6VLp0uky6bLpcun66QrpiulK6crpKumq6Wrp6uka6ZrpWuna6Trpuul66fbpBumG6UbpyOTjdJN003SzdPt0i3TLdKt063SbdNt0u3T3dId0x3SndOd0l3TXdLd0/3SPdM90r3TvdJ9033S/dPD0gPTA9KD04PSQ9ND0sPT49Ij0yPSo9Oj0mPTY9Lj09PSE9MT0pPTk9JT01PS09Pz0jPTM9Kz07PSc9Nz0vPTy9IL0wvSi9OL0kvTS9LL0+vSK9Mr0qvTq9Jr02vS69Pb0hvTG9Kb05vSW9Nb0tvT+9I70zvSu9O70nvTe9L708fSB9MH0ofTh9JH00fSx9Pn0ifTJ9Kn06fSZ9Nn0ufT19IX0xfSl9OX0lfTV9LX0/fSN9M30rfTt9J303fS99PP0g/TD9KP04/ST9NP0s/T79Iv0y/Sr9Ov0m/Tb9Lv09/SH9Mf0p/Tn9Jf01/S39P/0j/TP9K/07/Sf/NRjInczMv87MgC7Moi7MkS7Msy7MiK7MxsjGzsbKxs3GycbPxsvGzCbIJs4myibNJskmzybLJsymyKbOpsqmzabJps+my6bMZshmzmbKZs1myWbPZstmzObJR2SCTTLMqq7Mma7Mu67M5s7myubN5snmz+bL5swWyBbOFsoWzRbJFs8WyxbMlsiWzpbKls2WyZbPlsuWzFbIVs5WylbNVslWz1bLVszWyNbO1srWzdbJ1s/Wy9bMNsg2zjbKNs9HZJtmm2WbZ5tkW2ZbZVtnW2TbZttl22fbZDtmO2U7Zztku2a7Zbtnu2R7Zntle2d7ZPtm+2X7Z/tkB2YHZQdnB2SHZodlh2eHZEdmR2VHZ0dkx2bHZcdnx2QnZidlJ2cnZKdmp2WnZ6dkZ2ZnZWdnZ2TnZudl52fnZBdmF2UXZxdkl2aXZZdnl2RXZldlV2dXZNdm12XXZ9dkN2Y3ZTdnN2S3Zrdlt2e3ZHdmd2V3Z3dk92b3Zfdn92QPZg9lD2cPZI9mj2WPZ49kT2ZPZU9nT2TPZs9lz2fPZC9mL2UvZy9kr2avZa9nr2RvZm9lb2dvZO9m72XvZ+9kH2YfZR9nH2SfZp9ln2efZF9mX2VfZ19k32bfZd9n32Q/Zj9lP2c/ZL9mv2W/Z79kf2Z/ZX9nf2T/Zv/lI7uRu7uV+HuRhHuVxnuRpnuV5XuRlPkY+Zj5WPnY+Tj5uPl4+fj5BPmE+UT5xPkk+aT5ZPnk+RT5lPlU+dT5NPm0+XT59PkM+Yz5TPnM+Sz5rPls+ez5HPiof5JJrXuV13uRt3uV9Pmc+Vz53Pk8+bz5fPn++QL5gvlC+cL5Ivmi+WL54vkS+ZL5UvnS+TL5svly+fL5CvmK+Ur5yvkq+ar5avnq+Rr5mvla+dr5Ovm6+Xr5+vkG+Yb5RvnE+Ot8k3zTfLN883yLfMt8q3zrfJt823y7fPt8h3zHfKd853yXfNd8t3z3fI98z3yvfO98n3zffL98/PyA/MD8oPzg/JD80Pyw/PD8iPzI/Kj86PyY/Nj8uPz4/IT8xPyk/OT8lPzU/LT89PyM/Mz8rPzs/Jz83Py8/P78gvzC/KL84vyS/NL8svzy/Ir8yvyq/Or8mvza/Lr8+vyG/Mb8pvzm/Jb81vy2/Pb8jvzO/K787vye/N78vvz9/IH8wfyh/OH8kfzR/LH88fyJ/Mn8qfzp/Jn82fy5/Pn8hfzF/KX85fyV/NX8tfz1/I38zfyt/O38nfzd/L38//yD/MP8o/zj/JP80/yz/PP8i/zL/Kv86/yb/Nv8u/z7/If8x/yn/Of8l/zX/Lf89/yP/M/8r/zv/J/+3GCmcwi28wi+CIiyiIi6SIi2yIi+KoizGKMYsxirGLsYpxi3GK8YvJigmLCYqJi4mKSYtJismL6YopiymKqYupimmLaYrpi9mKGYsZipmLmYpZi1mK2Yv5ihGFYNCCi2qoi6aoi26oi/mLOYq5i7mKeYt5ivmLxYoFiwWKhYuFikWLRYrFi+WKJYsliqWLpYpli2WK5YvVihWLFYqVi5WKVYtVitWL9Yo1izWKtYu1inWLdYr1i82KDYsNio2LkYXmxSbFpsVmxdbFFsWWxVbF9sU2xbbFdsXOxQ7FjsVOxe7FLsWuxW7F3sUexZ7FXsX+xT7FvsV+xcHFAcWBxUHF4cUhxaHFYcXRxRHFkcVRxfHFMcWxxXHFycUJxYnFScXpxSnFqcVpxdnFGcWZxVnF+cU5xbnFecXFxQXFhcVFxeXFJcWlxWXF1cUVxZXFVcX1xTXFtcV1xc3FDcWNxU3F7cUtxa3FbcXdxR3FncVdxf3FPcW9xX3Fw8UDxYPFQ8XjxSPFo8VjxdPFE8WTxVPF88UzxbPFc8XLxQvFi8VLxevFK8WrxWvF28UbxZvFW8X7xTvFu8V7xcfFB8WHxUfF58UnxafFZ8XXxRfFl8VXxffFN8W3xXfFz8UPxY/FT8XvxS/Fr8Vvxd/FH8WfxV/F/8U/5YjpVO6pVf6ZVCGZVTGZVKmZVbmZVGW5RjlmOVY5djlOOW45Xjl+OUE5YTlROXE5STlpOVk5eTlFOWU5VTl1OU05bTldOX05QzljOVM5czlLOWs5Wzl7OUc5ahyUEqpZVXWZVO2ZVf25ZzlXOXc5TzlvOV85fzlAuWC5ULlwuUi5aLlYuXi5RLlkuVS5dLlMuWy5XLl8uUK5YrlSuXK5SrlquVq5erlGuWa5Vrl2uU65brleuX65QblhuVG5cbl6HKTctNys3Lzcotyy3Krcutym3Lbcrty+3KHcsdyp3Lncpdy13K3cvdyj3LPcq9y73Kfct9yv3L/8oDywPKg8uDykPLQ8rDy8PKI8sjyqPLo8pjy2PK48vjyhPLE8qTy5PKU8tTytPL08ozyzPKs8uzynPLc8rzy/PKC8sLyovLi8pLy0vKy8vLyivLK8qry6vKa8tryuvL68obyxvKm8ubylvLW8rby9vKO8s7yrvLu8p7y3vK+8v7ygfLB8qHy4fKR8tHysfLx8onyyfKp8unymfLZ8rny+fKF8sXypfLl8pXy1fK18vXyjfLN8q3y7fKd8t3yvfL98oPyw/Kj8uPyk/LT8rPy8/KL8svyq/Lr8pt42Q22Hr3M6NlH/XcY/HeQ/w7Vf4f6v0Pz36H979D9d+iT/+4ZDE8yPOnwVA1P9fDUDk/d8DS8T0YNT8NbZHiLDG+RZnga3ifD+2R4nw7v0+GX6vBLdbihww0dbuhwQ4cbOtzQ4UY13KiGG9VwoxpuVMONarhRDTeq4UY13KiGG/Vwox5u1MONerhRDzfq4UY93KiHG/Vwox5uNMONZrjRDDea4UYz3GiGG81woxluNMONZrjRDjfa4UY73GiHG+1wox1utMONdrjRDjfa4UY33OiGG91woxtudMONbrjRDTe64UY33OiGG/1wox9u9MONfrjRDzf64UY/3OiHG/1wo+/T/17FqFF2HNhR7Kh2rOxY27GxY2vHzo62NrC1ga0NbG1gawNbG9jawNYGtjawtYGtia2JrYmtia2JrYmtia2JrYmtia2pralNqN2rdpnaDWo3VHZDZd9b2WWV3VDZ59T232r7t7X9bLV9Q20/W22X1bjMvqy2L2tsorEva2ytsbXG1hpba2ytsbXG1hpba22ttbXW1lpba22ttbXW1lpba22ttbXO1jpb62yts7XO1jpb62yts7XO1jpb622tt7Xe1npb622tt7Xe1npb623NXrfY6xZ73WKvW+x1i71usdct9rrFXrfY6xZ73WKvW+x1i71usdct9rrFXrfY6xZ73WKvW+x1i71usdct9rrFXrfY6xZ73WKvW+x1i71usdct9rpFbc0euqit2ZsXtTV7/qK2ZhKISSAmgZgEYhJIZWuVrVW2ZlSIUSGVrVW2ZoBIbWtmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWSJmiZglYpaIWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWaJmiZolapaoWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVKZJZVZUpkllVlSmSWVWVIZIJUBUhkglQFSGSCVAVIZIJUBUhkglQFSGSCVAVIZIJUBUpsatalRmxq1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NfCqgVcNvGrgVQOvGnjVwKsGXjXwqoFXDbxq4FUDrxp41cCrBl418KqBVw28auBVA68aeNXAqwZeNfCqgVcNvGrgVQOvGnjVwKsGXjXwqoFXDbxq4FUDrxp41cCrBl418KqBVw28auBVA68aeNXAqwZeNfCqgVcNvGrgVQOvGnjVwKsGXjXwqoFXDbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eIW+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbui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')format(\"woff\");}.ffb{font-family:ffb;line-height:1.096680;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ffc;src:url('data:application/font-woff;base64,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WepmSZolaZakWZJmSTqXjnPpOJeOc+k4l45z6TiXjnPpOJeOc4k3l3hziTeXeHOJN5d4c4k3l3hziTeXeHOJN5d4c4k3l3hziTeXeHOJN5d4c4k3l3hziTeXeHOJN5d4c4k3l6/xXOLNJd5c4s0l3lzizSXeXOLNJd5cvrtz6TiXjnPpOJeOc+k4l45zKTaXYvPifz0mf3UpNpdv6VzizSXeXL6lc+k4l45z+ZbOJelcks4l6VySziXpXL67c/nuziX0XELPJfRcQs8l9FxCz+W7O5fmc2k+l+ZzaT6X5nNpPpfmc2k+l+ZzaT6X5nP5Rs8l/1zyz+Uf83NZglyWIJclKOTLvZBRKGQUChmFQkahkFEoZBQKGYVCRqGQUSjky72QfShkHwrZh0L2oZB9KGQfCtmHQvahkH0oZB8K2YdC9qGQfShkHwrZh0L2oZB9KGQfCtmHQvahkH0oZB8K2YdC9qGQfShkHwr5ni9kKgqZikKmopCpKGQqCpmKQqaikKkoZCoKmYpCpqKQf8wvZDUKWY1CVqOQ1Sjk27+Qb/9CtqSQLSlkSwrZkkK2pJAtKWRLCtmSQrakkC0pZEsK2ZJCtqSQLSlkSwrZkkK2pJAtKWRLCtmSQrakkC0pZEsK2ZJCtqSQLSlkSwrZkkK2pJAtKWRLCtmSQrakkC0pZEsK2ZJCtqSQLSlkSwrZkkK2pJAtKWRLCtmSUraklC0pZUtK2ZJStqSULSllS0rZklK2pJQtKWVLStmSUraklC0pZUtK2ZJStqSULSllS0rZklK2pJQtKWVLStmSUraklC0pZUtK2ZJStqSULSllS0rZklK2pJQtKWVLStmSUraklC0pZUtK2ZJStqSULSllS0rZklK2pJQtKWVLStmSUraklC0pZUtK2ZJStqSULSllS0rZklK2pJQtKWVLStmSUraklC0pZUtK2ZJStqSULSllS0rZklK2pJQtKWVLStmSUraklC0pZUtK2ZJStqSULSllS0rZklK2pJQtKWVLStmSUraklC0pZUtK2ZJStqSULSllS0rZklK2pJQtKWVLStmSUraklC0pZUtK2ZJKtqSSLalkSyrZkkq2pJItqWRLKtmSSrakki2pZEsq2ZJKtqSSLalkSyrZkkq2pJItqWRLKtmSSrakki2pZEsq2ZJKtqSSLalkSyrZkkq2pJItqWRLKtmS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CDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDjCDCOAOMIMI4A4wgwjgDj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LhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC5xuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiw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')format(\"woff\");}.ffc{font-family:ffc;line-height:0.981934;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ffd;src:url('data:application/font-woff;base64,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d+5w7nTucu527nHude5z7ncecB50HnIedh5xHnUecx53nnCedJ5ynnaecZ51nnOed15wXnRecl52XnFedV5zXnfecN503nLedt5x3nXec953PnA+dD5yPnY+cT51PnM+d75wvnS+cr52vnG+db5zvnd+cH50fnJ+dn5xfnV+c353/nD+dP5y/nb+cf51/nPGuiNcx3Vdz/XdwA3dyI3dxE3dzM3dwi3dke447rjueO747gTuhO5E7sTuJO6k7mTu5O4U7pTuVO7U7jTutO507vTuDO6M7kzuzO4s7qzubO7s7hzunO5c7tzuKHfgiqtu5dZu47Zu5/buPO687nzu/O4C7oLuQu7C7iLuou5odzF3cXcJd0l3KXdpdxl3WXc5d3l3BXdFdyV3ZXcVd1V3NXd1dw13TXctd213HXdddz13fXcDd0N3I3djdxN3U3eMu5m7ubuFu6W7lbu1u427rbudu727g7uju5O7s7uLu6u7m7u7u4e7p7uXu7e7j7uvu5+7v3uAe6B7kHuwe4h7qHuYe7h7hHuke5R7tHuMe6x7nHu8e4J7onuSe7J7inuqe5p7unuGe6Z7lnu2e457rnuee757gXuhe5F7sXuJe6l7mXu5e4V7pXuVe7V7jXute517vXuDe6N7k3uze4t7q3ube7t7h3une5d7t3uPe697n3u/+4D7oPuQ+7D7iPuo+5j7uPuE+6T7lPu0+4z7rPuc+7z7gvui+5L7svuK+6r7mvu6+4b7pvuW+7b7jvuu+577vvuB+6H7kfux+4n7qfuZ+7n7hful+5X7tfuN+637nfu9+4P7o/uT+7P7i/ur+5v7u/uH+6f7l/u3+4/7r/ufO9b7v8/fcz3P873AC73Ii73ES73My73CK72R3jjeuN543vjeBN6E3kTexN4k3qTeZN7k3hTelN5U3tTeNN603nTe9N4M3ozeTN7M3izerN5s3uzeHN6c3lze3N4ob+CJp17l1V7jtV7n9d483rzefN783gLegt5C3sLeIt6i3mhvMW9xbwlvSW8pb2lvGW9ZbzlveW8Fb0VvJW9lbxVvVW81b3VvDW9Nby1vbW8db11vPW99bwNvQ28jb2NvE29Tb4y3mbe5t4W3pbeVt7W3jbett523vbeDt6O3k7ezt4u3q7ebt7u3h7ent5e3t7ePt6+3n7e/d4B3oHeQd7B3iHeo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MUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSMUvELBGzRMwSNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM0SNUvULFGzRM2SyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMksosqcySyiypzJLKLKnMktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLaLKnNktosqc2S2iypzZLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacySxixpzJLGLGnMksYsacyS1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNktYsac2S1ixpzZLWLGnNks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLOLOnMks4s6cySzizpzJLeLOnNkt4s6c2S3izpzZLeLOnNkt4s6c2S3izpzZLeLOnNkt4s6c2S3izpzZLeLOnNkt4s6c2S3izpzZLeLOnNkt4s6c2S3izpzZLeLOnNkt4s6c2S3izpzZLeLOnNkt4s6c2S3izpzZLeLOnNkt4s6c2S3izpzZLeLOnNkt4s6c2S3izpzZLeLOnNkt4s6c2S3izpzZLeLOnN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8KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZedfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVwyv07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07YK+XdC3C/p2Qd8u6NsFfbugbxf07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2Rd+u6NsVfbuib1f07Yq+XdG3K/p2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')format(\"woff\");}.ffd{font-family:ffd;line-height:1.065430;font-style:normal;font-weight:normal;visibility:visible;}\n.m4{transform:matrix(0.243243,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.243243,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.243243,0.000000,0.000000,0.250000,0,0);}\n.m3{transform:matrix(0.243750,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.243750,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.243750,0.000000,0.000000,0.250000,0,0);}\n.m2{transform:matrix(0.245000,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.245000,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.245000,0.000000,0.000000,0.250000,0,0);}\n.m0{transform:matrix(0.250000,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.250000,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.250000,0.000000,0.000000,0.250000,0,0);}\n.m1{transform:none;-ms-transform:none;-webkit-transform:none;}\n.v4{vertical-align:-50.400000px;}\n.v1{vertical-align:-46.080000px;}\n.v3{vertical-align:-6.720000px;}\n.v0{vertical-align:0.000000px;}\n.v2{vertical-align:28.320000px;}\n.lsa{letter-spacing:-1.452000px;}\n.ls80{letter-spacing:-1.360000px;}\n.ls3e{letter-spacing:-1.276000px;}\n.ls11{letter-spacing:-1.224000px;}\n.ls9a{letter-spacing:-1.172000px;}\n.ls79{letter-spacing:-1.152000px;}\n.ls14{letter-spacing:-1.104000px;}\n.ls33{letter-spacing:-1.064000px;}\n.ls8d{letter-spacing:-1.056000px;}\n.ls85{letter-spacing:-1.020000px;}\n.ls61{letter-spacing:-1.008000px;}\n.ls4f{letter-spacing:-1.004000px;}\n.ls7b{letter-spacing:-0.996000px;}\n.ls98{letter-spacing:-0.984000px;}\n.ls7{letter-spacing:-0.972000px;}\n.ls74{letter-spacing:-0.968000px;}\n.ls2d{letter-spacing:-0.952000px;}\n.ls99{letter-spacing:-0.896000px;}\n.ls28{letter-spacing:-0.880000px;}\n.ls15{letter-spacing:-0.876000px;}\n.ls84{letter-spacing:-0.872000px;}\n.lsa7{letter-spacing:-0.868000px;}\n.ls3f{letter-spacing:-0.796000px;}\n.ls19{letter-spacing:-0.788000px;}\n.ls44{letter-spacing:-0.776000px;}\n.ls78{letter-spacing:-0.768000px;}\n.ls10{letter-spacing:-0.612000px;}\n.ls93{letter-spacing:-0.544000px;}\n.ls4e{letter-spacing:-0.524000px;}\n.ls7f{letter-spacing:-0.472000px;}\n.ls50{letter-spacing:-0.399200px;}\n.lsd{letter-spacing:-0.396000px;}\n.ls70{letter-spacing:-0.380800px;}\n.ls6f{letter-spacing:-0.375600px;}\n.ls5f{letter-spacing:-0.338800px;}\n.ls49{letter-spacing:-0.324000px;}\n.ls91{letter-spacing:-0.297200px;}\n.ls45{letter-spacing:-0.296800px;}\n.ls6d{letter-spacing:-0.242800px;}\n.lsa6{letter-spacing:-0.212800px;}\n.ls8c{letter-spacing:-0.211600px;}\n.ls7e{letter-spacing:-0.199600px;}\n.ls26{letter-spacing:-0.192400px;}\n.ls4a{letter-spacing:-0.180800px;}\n.ls81{letter-spacing:-0.173600px;}\n.ls9{letter-spacing:-0.168000px;}\n.ls2f{letter-spacing:-0.150800px;}\n.ls3d{letter-spacing:-0.148800px;}\n.ls8f{letter-spacing:-0.146000px;}\n.ls72{letter-spacing:-0.141600px;}\n.ls5a{letter-spacing:-0.116000px;}\n.ls42{letter-spacing:-0.108800px;}\n.ls39{letter-spacing:-0.105200px;}\n.ls6c{letter-spacing:-0.101600px;}\n.ls12{letter-spacing:-0.096000px;}\n.ls8e{letter-spacing:-0.095600px;}\n.ls9b{letter-spacing:-0.086000px;}\n.ls20{letter-spacing:-0.080800px;}\n.ls1a{letter-spacing:-0.075200px;}\n.ls25{letter-spacing:-0.071600px;}\n.ls95{letter-spacing:-0.065200px;}\n.lsa9{letter-spacing:-0.063200px;}\n.ls48{letter-spacing:-0.062400px;}\n.ls47{letter-spacing:-0.058400px;}\n.lsa4{letter-spacing:-0.058000px;}\n.ls97{letter-spacing:-0.055600px;}\n.ls27{letter-spacing:-0.050000px;}\n.ls86{letter-spacing:-0.046400px;}\n.ls7d{letter-spacing:-0.044400px;}\n.ls29{letter-spacing:-0.042800px;}\n.ls1d{letter-spacing:-0.035520px;}\n.ls1c{letter-spacing:-0.035040px;}\n.ls3c{letter-spacing:-0.031680px;}\n.ls53{letter-spacing:-0.031200px;}\n.ls34{letter-spacing:-0.029760px;}\n.ls4d{letter-spacing:-0.029280px;}\n.ls5c{letter-spacing:-0.026880px;}\n.ls1b{letter-spacing:-0.025920px;}\n.ls37{letter-spacing:-0.023520px;}\n.ls87{letter-spacing:-0.017760px;}\n.ls92{letter-spacing:-0.012480px;}\n.ls5b{letter-spacing:-0.010080px;}\n.ls73{letter-spacing:-0.007200px;}\n.ls59{letter-spacing:-0.000960px;}\n.ls1{letter-spacing:0.000000px;}\n.ls24{letter-spacing:0.008640px;}\n.ls76{letter-spacing:0.013920px;}\n.ls36{letter-spacing:0.025920px;}\n.ls8b{letter-spacing:0.042400px;}\n.lsa0{letter-spacing:0.050400px;}\n.ls17{letter-spacing:0.052000px;}\n.ls18{letter-spacing:0.058400px;}\n.ls69{letter-spacing:0.062400px;}\n.ls21{letter-spacing:0.063200px;}\n.ls6b{letter-spacing:0.063360px;}\n.ls9d{letter-spacing:0.065280px;}\n.ls9e{letter-spacing:0.076800px;}\n.ls51{letter-spacing:0.080800px;}\n.lsc{letter-spacing:0.084000px;}\n.ls40{letter-spacing:0.084400px;}\n.ls82{letter-spacing:0.086400px;}\n.ls90{letter-spacing:0.088400px;}\n.lsa3{letter-spacing:0.093600px;}\n.ls6e{letter-spacing:0.099200px;}\n.ls63{letter-spacing:0.103600px;}\n.ls71{letter-spacing:0.104800px;}\n.ls7c{letter-spacing:0.111200px;}\n.ls2{letter-spacing:0.120000px;}\n.ls57{letter-spacing:0.137600px;}\n.ls65{letter-spacing:0.139600px;}\n.ls55{letter-spacing:0.141120px;}\n.ls32{letter-spacing:0.141200px;}\n.ls5d{letter-spacing:0.148800px;}\n.ls46{letter-spacing:0.156000px;}\n.ls67{letter-spacing:0.158400px;}\n.ls68{letter-spacing:0.183200px;}\n.ls9c{letter-spacing:0.185280px;}\n.lsa2{letter-spacing:0.209200px;}\n.ls6a{letter-spacing:0.211680px;}\n.ls54{letter-spacing:0.213120px;}\n.ls8{letter-spacing:0.216000px;}\n.ls56{letter-spacing:0.220800px;}\n.lse{letter-spacing:0.228000px;}\n.ls3a{letter-spacing:0.228800px;}\n.ls23{letter-spacing:0.238000px;}\n.ls13{letter-spacing:0.240000px;}\n.ls64{letter-spacing:0.244000px;}\n.ls58{letter-spacing:0.247600px;}\n.ls35{letter-spacing:0.254400px;}\n.lsa5{letter-spacing:0.267200px;}\n.ls8a{letter-spacing:0.268400px;}\n.ls22{letter-spacing:0.287600px;}\n.ls66{letter-spacing:0.338400px;}\n.ls75{letter-spacing:0.355200px;}\n.ls31{letter-spacing:0.364000px;}\n.ls43{letter-spacing:0.364800px;}\n.ls62{letter-spacing:0.371200px;}\n.ls94{letter-spacing:0.374800px;}\n.ls3b{letter-spacing:0.384400px;}\n.ls41{letter-spacing:0.414720px;}\n.ls89{letter-spacing:0.416000px;}\n.ls7a{letter-spacing:0.420000px;}\n.ls77{letter-spacing:0.436000px;}\n.ls1f{letter-spacing:0.444000px;}\n.ls83{letter-spacing:0.448000px;}\n.ls4b{letter-spacing:0.452000px;}\n.ls1e{letter-spacing:0.456000px;}\n.ls38{letter-spacing:0.472000px;}\n.ls2c{letter-spacing:0.488000px;}\n.ls60{letter-spacing:0.488640px;}\n.ls9f{letter-spacing:0.524000px;}\n.lsa1{letter-spacing:0.529280px;}\n.ls2e{letter-spacing:0.532000px;}\n.lsa8{letter-spacing:0.545280px;}\n.ls2a{letter-spacing:0.560000px;}\n.ls4c{letter-spacing:0.568000px;}\n.ls2b{letter-spacing:0.620000px;}\n.ls5e{letter-spacing:0.628000px;}\n.ls30{letter-spacing:0.720000px;}\n.ls16{letter-spacing:0.835200px;}\n.ls3{letter-spacing:51.048000px;}\n.ls4{letter-spacing:75.528000px;}\n.lsf{letter-spacing:76.008000px;}\n.ls5{letter-spacing:92.232000px;}\n.ls6{letter-spacing:98.952000px;}\n.lsb{letter-spacing:99.912000px;}\n.ls0{letter-spacing:1038.640000px;}\n.ls96{letter-spacing:1998.124800px;}\n.ls88{letter-spacing:2019.244800px;}\n.ls52{letter-spacing:2020.195200px;}\n.sc_{text-shadow:none;}\n.sc0{text-shadow:-0.015em 0 transparent,0 0.015em transparent,0.015em 0 transparent,0 -0.015em  transparent;}\n@media screen and (-webkit-min-device-pixel-ratio:0){\n.sc_{-webkit-text-stroke:0px transparent;}\n.sc0{-webkit-text-stroke:0.015em transparent;text-shadow:none;}\n}\n.ws47{word-spacing:-10.227760px;}\n.ws46{word-spacing:-10.200960px;}\n.ws49{word-spacing:-9.980160px;}\n.ws25{word-spacing:-9.484800px;}\n.ws4e{word-spacing:-9.392800px;}\n.ws3e{word-spacing:-9.332800px;}\n.ws21{word-spacing:-9.324800px;}\n.ws23{word-spacing:-9.296800px;}\n.ws5b{word-spacing:-9.252800px;}\n.ws14{word-spacing:-9.220800px;}\n.ws3d{word-spacing:-9.216800px;}\n.ws6e{word-spacing:-9.212800px;}\n.ws16{word-spacing:-9.208800px;}\n.ws63{word-spacing:-9.200800px;}\n.wsf{word-spacing:-9.192160px;}\n.ws2e{word-spacing:-9.149200px;}\n.ws7a{word-spacing:-9.139600px;}\n.ws51{word-spacing:-9.136000px;}\n.ws26{word-spacing:-9.128800px;}\n.ws2{word-spacing:-9.120000px;}\n.ws55{word-spacing:-9.103200px;}\n.ws33{word-spacing:-9.088240px;}\n.ws19{word-spacing:-9.052400px;}\n.ws85{word-spacing:-9.032000px;}\n.ws29{word-spacing:-9.019200px;}\n.ws53{word-spacing:-9.008800px;}\n.ws1a{word-spacing:-9.002800px;}\n.ws2d{word-spacing:-8.993600px;}\n.ws82{word-spacing:-8.974000px;}\n.ws57{word-spacing:-8.948000px;}\n.ws56{word-spacing:-8.923200px;}\n.ws38{word-spacing:-8.920800px;}\n.ws4d{word-spacing:-8.913600px;}\n.ws35{word-spacing:-8.906000px;}\n.ws54{word-spacing:-8.904400px;}\n.ws45{word-spacing:-8.902400px;}\n.ws67{word-spacing:-8.897120px;}\n.ws62{word-spacing:-8.869600px;}\n.ws52{word-spacing:-8.868400px;}\n.ws5d{word-spacing:-8.864000px;}\n.ws83{word-spacing:-8.858400px;}\n.ws76{word-spacing:-8.853200px;}\n.ws6d{word-spacing:-8.851200px;}\n.ws43{word-spacing:-8.845600px;}\n.ws58{word-spacing:-8.827200px;}\n.ws18{word-spacing:-8.823200px;}\n.ws15{word-spacing:-8.816800px;}\n.ws81{word-spacing:-8.815200px;}\n.ws2a{word-spacing:-8.790720px;}\n.ws59{word-spacing:-8.785920px;}\n.ws1d{word-spacing:-8.773440px;}\n.ws10{word-spacing:-8.764800px;}\n.ws48{word-spacing:-8.763840px;}\n.ws4b{word-spacing:-8.754720px;}\n.ws78{word-spacing:-8.752320px;}\n.ws68{word-spacing:-8.741520px;}\n.ws2b{word-spacing:-8.741280px;}\n.ws11{word-spacing:-8.738880px;}\n.ws4c{word-spacing:-8.737920px;}\n.ws3f{word-spacing:-8.735520px;}\n.ws28{word-spacing:-8.735040px;}\n.ws44{word-spacing:-8.733600px;}\n.ws2f{word-spacing:-8.733120px;}\n.ws12{word-spacing:-8.729760px;}\n.ws13{word-spacing:-8.729280px;}\n.ws39{word-spacing:-8.727520px;}\n.ws3a{word-spacing:-8.723520px;}\n.ws20{word-spacing:-8.722000px;}\n.ws71{word-spacing:-8.718400px;}\n.ws1e{word-spacing:-8.714800px;}\n.ws7c{word-spacing:-8.709200px;}\n.ws84{word-spacing:-8.706800px;}\n.ws88{word-spacing:-8.701600px;}\n.ws80{word-spacing:-8.699920px;}\n.ws7b{word-spacing:-8.699600px;}\n.ws1b{word-spacing:-8.693200px;}\n.ws17{word-spacing:-8.684000px;}\n.ws74{word-spacing:-8.669200px;}\n.ws5a{word-spacing:-8.663200px;}\n.ws2c{word-spacing:-8.659600px;}\n.ws34{word-spacing:-8.656000px;}\n.ws4a{word-spacing:-8.648800px;}\n.ws60{word-spacing:-8.623200px;}\n.ws75{word-spacing:-8.618800px;}\n.ws30{word-spacing:-8.616000px;}\n.ws24{word-spacing:-8.614000px;}\n.ws6c{word-spacing:-8.591200px;}\n.ws3c{word-spacing:-8.584000px;}\n.ws1c{word-spacing:-8.572400px;}\n.ws69{word-spacing:-8.565200px;}\n.ws72{word-spacing:-8.553200px;}\n.ws86{word-spacing:-8.552000px;}\n.ws5c{word-spacing:-8.522000px;}\n.ws37{word-spacing:-8.468000px;}\n.ws77{word-spacing:-8.467600px;}\n.ws3b{word-spacing:-8.440800px;}\n.ws4f{word-spacing:-8.426000px;}\n.ws5e{word-spacing:-8.410320px;}\n.ws5f{word-spacing:-8.384000px;}\n.ws42{word-spacing:-8.365600px;}\n.ws9{word-spacing:-8.364000px;}\n.ws6a{word-spacing:-8.292800px;}\n.ws40{word-spacing:-8.240800px;}\n.ws79{word-spacing:-8.220800px;}\n.ws4{word-spacing:-8.136000px;}\n.ws7{word-spacing:-8.004000px;}\n.ws64{word-spacing:-7.996800px;}\n.ws32{word-spacing:-7.989920px;}\n.ws36{word-spacing:-7.988800px;}\n.ws1{word-spacing:-7.920000px;}\n.ws87{word-spacing:-7.896800px;}\n.ws6f{word-spacing:-7.892800px;}\n.ws1f{word-spacing:-7.884800px;}\n.ws7e{word-spacing:-7.868800px;}\n.wsc{word-spacing:-7.824000px;}\n.ws22{word-spacing:-7.812800px;}\n.ws61{word-spacing:-7.796800px;}\n.ws7d{word-spacing:-7.780800px;}\n.ws66{word-spacing:-7.768800px;}\n.ws41{word-spacing:-7.760800px;}\n.ws50{word-spacing:-7.756800px;}\n.ws5{word-spacing:-7.752000px;}\n.ws70{word-spacing:-7.744800px;}\n.ws73{word-spacing:-7.708800px;}\n.ws27{word-spacing:-7.700800px;}\n.ws65{word-spacing:-7.612800px;}\n.ws7f{word-spacing:-7.592800px;}\n.ws8{word-spacing:-7.524000px;}\n.ws31{word-spacing:-7.509920px;}\n.ws6b{word-spacing:-7.404800px;}\n.wsa{word-spacing:-7.308000px;}\n.ws3{word-spacing:-7.164000px;}\n.wse{word-spacing:-7.044000px;}\n.wsd{word-spacing:-6.816000px;}\n.wsb{word-spacing:-6.696000px;}\n.ws6{word-spacing:-6.684000px;}\n.ws0{word-spacing:0.000000px;}\n._7{margin-left:-9.072800px;}\n._5{margin-left:-8.063200px;}\n._1{margin-left:-6.768800px;}\n._6{margin-left:-5.532800px;}\n._4{margin-left:-4.519200px;}\n._2{margin-left:-3.320000px;}\n._0{margin-left:-1.609600px;}\n._3{width:1.119200px;}\n._b{width:2.212640px;}\n._9{width:3.288160px;}\n._f{width:4.480640px;}\n._8{width:6.095520px;}\n._e{width:7.410240px;}\n._a{width:12.355200px;}\n._1c{width:110.853280px;}\n._17{width:129.219520px;}\n._18{width:132.446560px;}\n._15{width:142.247200px;}\n._19{width:156.111520px;}\n._1b{width:166.589440px;}\n._16{width:195.377760px;}\n._d{width:223.041440px;}\n._1a{width:236.588320px;}\n._c{width:319.907200px;}\n._14{width:664.976800px;}\n._10{width:723.222880px;}\n._12{width:735.836160px;}\n._13{width:772.568640px;}\n._11{width:830.814720px;}\n._1d{width:845.157120px;}\n.fce{color:rgb(0,128,0);}\n.fcd{color:rgb(128,128,128);}\n.fc0{color:rgb(0,0,0);}\n.fc2{color:rgb(54,94,144);}\n.fc3{color:rgb(78,129,189);}\n.fc9{color:rgb(255,0,0);}\n.fc10{color:rgb(0,0,255);}\n.fcf{color:rgb(0,130,64);}\n.fc1{color:transparent;}\n.fca{color:rgb(152,72,5);}\n.fc5{color:rgb(0,134,60);}\n.fc4{color:rgb(31,73,125);}\n.fc7{color:rgb(0,111,191);}\n.fc8{color:rgb(36,41,46);}\n.fcb{color:rgb(111,47,160);}\n.fc6{color:rgb(0,153,0);}\n.fcc{color:rgb(255,0,255);}\n.fs9{font-size:3.840000px;}\n.fsc{font-size:13.920000px;}\n.fsd{font-size:15.840000px;}\n.fsb{font-size:27.840000px;}\n.fsf{font-size:30.240000px;}\n.fse{font-size:34.080000px;}\n.fs5{font-size:36.000000px;}\n.fs7{font-size:37.920000px;}\n.fs0{font-size:39.840000px;}\n.fsa{font-size:39.936000px;}\n.fs4{font-size:44.160000px;}\n.fs6{font-size:48.000000px;}\n.fs8{font-size:72.000000px;}\n.fs3{font-size:104.160000px;}\n.fs1{font-size:111.840000px;}\n.fs2{font-size:192.000000px;}\n.y0{bottom:-0.500000px;}\n.y1e1{bottom:-0.120060px;}\n.y1{bottom:0.000000px;}\n.y69d{bottom:2.020000px;}\n.y7a7{bottom:2.090000px;}\n.y614{bottom:2.110000px;}\n.y79d{bottom:2.140000px;}\n.y607{bottom:2.160000px;}\n.y38c{bottom:2.210000px;}\n.y42e{bottom:2.230000px;}\n.y469{bottom:2.260000px;}\n.y3be{bottom:2.280000px;}\n.y28c{bottom:2.300000px;}\n.y2fe{bottom:2.304000px;}\n.y7a5{bottom:2.330000px;}\n.y612{bottom:2.350000px;}\n.y463{bottom:2.380000px;}\n.y653{bottom:2.420000px;}\n.y61a{bottom:2.470000px;}\n.y8f1{bottom:2.590000px;}\n.y72b{bottom:2.620000px;}\n.y749{bottom:2.710000px;}\n.y467{bottom:2.740000px;}\n.y2f3{bottom:2.780000px;}\n.y2fb{bottom:2.784000px;}\n.y8ed{bottom:2.950000px;}\n.y115{bottom:3.000000px;}\n.y74e{bottom:3.070000px;}\n.y3bc{bottom:3.140000px;}\n.y912{bottom:3.220000px;}\n.y7b5{bottom:3.260000px;}\n.y40b{bottom:3.290000px;}\n.y61f{bottom:3.530000px;}\n.y2c1{bottom:3.910000px;}\n.y34b{bottom:4.180000px;}\n.y113{bottom:10.080000px;}\n.y70{bottom:10.680000px;}\n.y42{bottom:12.480000px;}\n.y679{bottom:13.820000px;}\n.y747{bottom:13.870000px;}\n.y611{bottom:13.900000px;}\n.y7d7{bottom:13.940000px;}\n.y619{bottom:13.990000px;}\n.y462{bottom:14.020000px;}\n.ye3{bottom:14.040000px;}\n.y78e{bottom:14.210000px;}\n.y91d{bottom:14.350000px;}\n.y468{bottom:14.380000px;}\n.y2fd{bottom:14.420000px;}\n.y8f0{bottom:14.470000px;}\n.y8e0{bottom:14.500000px;}\n.y924{bottom:14.710000px;}\n.y6b9{bottom:14.780000px;}\n.y8eb{bottom:14.950000px;}\n.y6a1{bottom:14.980000px;}\n.y2f2{bottom:15.020000px;}\n.y466{bottom:15.100000px;}\n.y2fa{bottom:15.140000px;}\n.y3bb{bottom:15.380000px;}\n.y28b{bottom:16.340000px;}\n.y349{bottom:18.220000px;}\n.y95f{bottom:25.490000px;}\n.y651{bottom:25.580000px;}\n.y321{bottom:25.610000px;}\n.y42c{bottom:25.630000px;}\n.y404{bottom:25.750000px;}\n.y610{bottom:25.780000px;}\n.y618{bottom:25.870000px;}\n.y60c{bottom:25.900000px;}\n.y72a{bottom:26.020000px;}\n.y78d{bottom:26.090000px;}\n.y8e1{bottom:26.140000px;}\n.y746{bottom:26.230000px;}\n.y7b4{bottom:26.300000px;}\n.y782{bottom:26.450000px;}\n.y74c{bottom:26.470000px;}\n.y91c{bottom:26.590000px;}\n.y69c{bottom:26.620000px;}\n.y6b7{bottom:26.660000px;}\n.y409{bottom:26.690000px;}\n.y8ef{bottom:26.710000px;}\n.y465{bottom:26.740000px;}\n.y2f9{bottom:26.780000px;}\n.y923{bottom:26.830000px;}\n.y8ea{bottom:27.070000px;}\n.y6a0{bottom:27.100000px;}\n.y2f1{bottom:27.140000px;}\n.y3ba{bottom:27.500000px;}\n.y6f{bottom:28.080000px;}\n.y8b{bottom:28.200000px;}\n.ybd{bottom:28.680000px;}\n.y935{bottom:28.920000px;}\n.y348{bottom:29.980000px;}\n.y41{bottom:30.480000px;}\n.ye2{bottom:32.160000px;}\n.y677{bottom:37.340000px;}\n.y7a0{bottom:37.390000px;}\n.y617{bottom:37.510000px;}\n.y60f{bottom:37.540000px;}\n.y60b{bottom:37.660000px;}\n.y729{bottom:37.780000px;}\n.y78c{bottom:37.850000px;}\n.y7d2{bottom:37.990000px;}\n.y7d6{bottom:38.060000px;}\n.y7b3{bottom:38.090000px;}\n.y780{bottom:38.110000px;}\n.y6b6{bottom:38.420000px;}\n.y8ee{bottom:38.590000px;}\n.y91b{bottom:38.710000px;}\n.y8df{bottom:38.860000px;}\n.y922{bottom:38.950000px;}\n.y69b{bottom:38.980000px;}\n.y8e9{bottom:39.190000px;}\n.y69f{bottom:39.220000px;}\n.y2f0{bottom:39.260000px;}\n.y3b9{bottom:39.740000px;}\n.y934{bottom:42.840000px;}\n.y289{bottom:43.460000px;}\n.y2be{bottom:44.830000px;}\n.y8a{bottom:45.600000px;}\n.ybc{bottom:46.080000px;}\n.y6e{bottom:46.200000px;}\n.y40{bottom:47.880000px;}\n.y66f{bottom:48.240000px;}\n.y114{bottom:48.360000px;}\n.y520{bottom:48.720000px;}\n.y8e5{bottom:48.910000px;}\n.y403{bottom:49.030000px;}\n.y79f{bottom:49.390000px;}\n.y60a{bottom:49.420000px;}\n.y616{bottom:49.510000px;}\n.ye1{bottom:49.560000px;}\n.y728{bottom:49.660000px;}\n.y61d{bottom:49.730000px;}\n.y7d1{bottom:49.780000px;}\n.y7b2{bottom:49.850000px;}\n.y74b{bottom:50.110000px;}\n.y6b5{bottom:50.300000px;}\n.y734{bottom:50.400000px;}\n.y91a{bottom:50.830000px;}\n.y6aa{bottom:50.880000px;}\n.y2f7{bottom:50.900000px;}\n.y8e8{bottom:50.950000px;}\n.y955{bottom:51.000000px;}\n.y2ef{bottom:51.050000px;}\n.y69a{bottom:51.220000px;}\n.y69e{bottom:51.460000px;}\n.y809{bottom:51.600000px;}\n.y3b8{bottom:51.860000px;}\n.y116{bottom:52.320000px;}\n.y3a2{bottom:52.440000px;}\n.y4b7{bottom:52.560000px;}\n.y4a1{bottom:52.680000px;}\n.y206{bottom:52.800000px;}\n.y225{bottom:52.920000px;}\n.y254{bottom:53.040000px;}\n.y51a{bottom:53.160000px;}\n.y66c{bottom:53.760000px;}\n.y287{bottom:57.380000px;}\n.y2bc{bottom:58.270000px;}\n.y650{bottom:60.410000px;}\n.y8e4{bottom:60.790000px;}\n.y31f{bottom:60.890000px;}\n.y95e{bottom:61.010000px;}\n.y389{bottom:61.030000px;}\n.y7a3{bottom:61.150000px;}\n.y42a{bottom:61.180000px;}\n.y77f{bottom:61.270000px;}\n.y727{bottom:61.540000px;}\n.y7d0{bottom:61.660000px;}\n.y6b4{bottom:61.940000px;}\n.y8de{bottom:62.260000px;}\n.y408{bottom:62.570000px;}\n.y461{bottom:62.620000px;}\n.y921{bottom:62.950000px;}\n.y919{bottom:63.070000px;}\n.y910{bottom:63.100000px;}\n.y699{bottom:63.580000px;}\n.y6d{bottom:63.600000px;}\n.y3b7{bottom:63.980000px;}\n.y4e3{bottom:65.040000px;}\n.y853{bottom:65.160000px;}\n.y808{bottom:65.400000px;}\n.y695{bottom:65.520000px;}\n.y5c3{bottom:65.760000px;}\n.y3f{bottom:65.880000px;}\n.y963{bottom:66.240000px;}\n.y594{bottom:66.600000px;}\n.y2e1{bottom:66.720000px;}\n.ye0{bottom:66.960000px;}\n.y14{bottom:67.080000px;}\n.y7d4{bottom:67.560000px;}\n.y754{bottom:68.040000px;}\n.y6d9{bottom:68.520000px;}\n.y79a{bottom:68.640000px;}\n.y83d{bottom:68.880000px;}\n.y576{bottom:69.000000px;}\n.y6a2{bottom:69.360000px;}\n.y6a9{bottom:69.600000px;}\n.y3a1{bottom:69.720000px;}\n.y5e4{bottom:69.840000px;}\n.y4aa{bottom:69.960000px;}\n.y205{bottom:70.080000px;}\n.y224{bottom:70.200000px;}\n.y253{bottom:70.320000px;}\n.y519{bottom:70.440000px;}\n.y64e{bottom:70.800000px;}\n.y53b{bottom:70.920000px;}\n.y428{bottom:71.040000px;}\n.y2bb{bottom:71.830000px;}\n.y8e3{bottom:72.550000px;}\n.y26e{bottom:72.840000px;}\n.y7b1{bottom:73.010000px;}\n.y77e{bottom:73.030000px;}\n.y725{bottom:73.300000px;}\n.y820{bottom:73.680000px;}\n.y50b{bottom:73.920000px;}\n.y460{bottom:74.380000px;}\n.y920{bottom:75.100000px;}\n.y8c6{bottom:75.120000px;}\n.y918{bottom:75.220000px;}\n.y698{bottom:75.820000px;}\n.y3b6{bottom:76.220000px;}\n.y90f{bottom:76.420000px;}\n.y952{bottom:76.440000px;}\n.y153{bottom:76.680000px;}\n.y7ce{bottom:77.040000px;}\n.y694{bottom:77.160000px;}\n.y66b{bottom:77.280000px;}\n.y807{bottom:77.520000px;}\n.y4e2{bottom:77.640000px;}\n.y7e8{bottom:77.760000px;}\n.y48c{bottom:78.600000px;}\n.y560{bottom:78.720000px;}\n.y112{bottom:78.840000px;}\n.y7d3{bottom:79.320000px;}\n.y9b9{bottom:79.680000px;}\n.y941{bottom:79.800000px;}\n.y5d2{bottom:79.920000px;}\n.y4a0{bottom:80.040000px;}\n.y13{bottom:80.160000px;}\n.y184{bottom:80.280000px;}\n.y3ec{bottom:80.400000px;}\n.y286{bottom:80.540000px;}\n.y3bd{bottom:80.640000px;}\n.y387{bottom:80.880000px;}\n.y6c{bottom:81.000000px;}\n.y3e{bottom:81.120000px;}\n.y6a8{bottom:81.360000px;}\n.y1b0{bottom:81.480000px;}\n.y9a{bottom:81.600000px;}\n.y204{bottom:81.720000px;}\n.y23f{bottom:81.840000px;}\n.y223{bottom:81.960000px;}\n.y90d{bottom:82.080000px;}\n.y407{bottom:82.370000px;}\n.y64d{bottom:82.560000px;}\n.y427{bottom:82.680000px;}\n.y861{bottom:82.800000px;}\n.y886{bottom:83.280000px;}\n.y6fe{bottom:83.520000px;}\n.y2ba{bottom:83.620000px;}\n.y99b{bottom:84.000000px;}\n.y401{bottom:84.190000px;}\n.y436{bottom:84.360000px;}\n.y26d{bottom:84.600000px;}\n.y7b0{bottom:84.770000px;}\n.y77c{bottom:84.910000px;}\n.ydf{bottom:85.080000px;}\n.y744{bottom:85.560000px;}\n.y45f{bottom:86.160000px;}\n.y8d8{bottom:86.520000px;}\n.y1e0{bottom:86.640000px;}\n.y8c5{bottom:87.360000px;}\n.y2f5{bottom:87.500000px;}\n.y917{bottom:87.580000px;}\n.y71a{bottom:87.600000px;}\n.y697{bottom:87.720000px;}\n.y2ad{bottom:87.960000px;}\n.y768{bottom:88.200000px;}\n.y3b5{bottom:88.340000px;}\n.y605{bottom:88.680000px;}\n.y5c2{bottom:89.040000px;}\n.y806{bottom:89.160000px;}\n.y933{bottom:89.520000px;}\n.y2e0{bottom:89.640000px;}\n.y948{bottom:90.024000px;}\n.y593{bottom:90.264000px;}\n.y152{bottom:90.504000px;}\n.y31d{bottom:90.744000px;}\n.y7d5{bottom:90.840000px;}\n.y753{bottom:91.104000px;}\n.y6d8{bottom:91.824000px;}\n.y3eb{bottom:92.184000px;}\n.y285{bottom:92.300000px;}\n.y83c{bottom:92.424000px;}\n.y386{bottom:92.664000px;}\n.y575{bottom:92.784000px;}\n.y730{bottom:93.144000px;}\n.y4b6{bottom:93.264000px;}\n.y3a0{bottom:93.384000px;}\n.y5e3{bottom:93.504000px;}\n.y4a9{bottom:93.624000px;}\n.y183{bottom:93.744000px;}\n.y222{bottom:93.864000px;}\n.y252{bottom:93.984000px;}\n.y64c{bottom:94.344000px;}\n.y426{bottom:94.584000px;}\n.y2fc{bottom:95.040000px;}\n.y675{bottom:95.064000px;}\n.y2f4{bottom:95.160000px;}\n.y6fd{bottom:95.304000px;}\n.y2b9{bottom:95.500000px;}\n.y400{bottom:96.190000px;}\n.y86b{bottom:96.264000px;}\n.y111{bottom:96.384000px;}\n.y724{bottom:96.460000px;}\n.y7ae{bottom:96.530000px;}\n.y370{bottom:96.864000px;}\n.y50a{bottom:97.224000px;}\n.y6b1{bottom:97.580000px;}\n.y8d7{bottom:98.304000px;}\n.yaa{bottom:98.424000px;}\n.y89{bottom:98.544000px;}\n.y3d{bottom:98.664000px;}\n.ybb{bottom:99.024000px;}\n.y6b{bottom:99.144000px;}\n.y719{bottom:99.384000px;}\n.y8a4{bottom:99.504000px;}\n.y2ac{bottom:99.744000px;}\n.y91f{bottom:99.940000px;}\n.y767{bottom:99.984000px;}\n.y916{bottom:100.060000px;}\n.y951{bottom:100.100000px;}\n.y852{bottom:100.220000px;}\n.y3b4{bottom:100.460000px;}\n.y4e1{bottom:100.700000px;}\n.y66a{bottom:100.820000px;}\n.y9b2{bottom:100.940000px;}\n.y805{bottom:101.060000px;}\n.y932{bottom:101.300000px;}\n.y55f{bottom:101.780000px;}\n.y48b{bottom:102.260000px;}\n.yde{bottom:102.500000px;}\n.y940{bottom:102.860000px;}\n.y5d1{bottom:102.980000px;}\n.y49f{bottom:103.100000px;}\n.y5e1{bottom:103.220000px;}\n.y12{bottom:103.460000px;}\n.y151{bottom:103.820000px;}\n.y283{bottom:104.060000px;}\n.y78a{bottom:104.180000px;}\n.y642{bottom:104.540000px;}\n.y385{bottom:104.660000px;}\n.y7d8{bottom:104.780000px;}\n.y72f{bottom:104.900000px;}\n.y658{bottom:105.140000px;}\n.y1af{bottom:105.260000px;}\n.y900{bottom:105.380000px;}\n.y9b8{bottom:105.500000px;}\n.y90c{bottom:105.740000px;}\n.y99a{bottom:105.980000px;}\n.y64b{bottom:106.100000px;}\n.y425{bottom:106.340000px;}\n.y6fc{bottom:107.060000px;}\n.y182{bottom:107.180000px;}\n.y2b8{bottom:107.260000px;}\n.y435{bottom:107.420000px;}\n.y3ff{bottom:107.830000px;}\n.y26c{bottom:108.140000px;}\n.y723{bottom:108.220000px;}\n.y7ad{bottom:108.290000px;}\n.y77a{bottom:108.310000px;}\n.y36f{bottom:108.860000px;}\n.y6b0{bottom:109.220000px;}\n.y8dd{bottom:109.540000px;}\n.y53a{bottom:110.180000px;}\n.y1df{bottom:110.300000px;}\n.y971{bottom:110.420000px;}\n.y81f{bottom:110.900000px;}\n.y718{bottom:111.260000px;}\n.y8c4{bottom:111.500000px;}\n.y2ab{bottom:111.620000px;}\n.y950{bottom:111.740000px;}\n.y766{bottom:111.860000px;}\n.y851{bottom:111.980000px;}\n.y91e{bottom:112.180000px;}\n.y693{bottom:112.340000px;}\n.y915{bottom:112.420000px;}\n.y4e0{bottom:112.460000px;}\n.y45d{bottom:112.580000px;}\n.y3b3{bottom:112.700000px;}\n.y931{bottom:113.180000px;}\n.y2df{bottom:113.300000px;}\n.y592{bottom:113.420000px;}\n.y55e{bottom:113.540000px;}\n.y8a3{bottom:113.660000px;}\n.y31c{bottom:114.020000px;}\n.y5c1{bottom:114.140000px;}\n.y110{bottom:114.380000px;}\n.y93f{bottom:114.620000px;}\n.y5d0{bottom:114.740000px;}\n.y49e{bottom:114.860000px;}\n.y5e0{bottom:114.980000px;}\n.y6d7{bottom:115.100000px;}\n.y83b{bottom:115.580000px;}\n.y282{bottom:115.820000px;}\n.y789{bottom:115.940000px;}\n.y3c{bottom:116.060000px;}\n.y574{bottom:116.180000px;}\n.y346{bottom:116.300000px;}\n.ya9{bottom:116.420000px;}\n.y6a{bottom:116.540000px;}\n.y221{bottom:116.660000px;}\n.y23e{bottom:116.780000px;}\n.y203{bottom:116.900000px;}\n.yfc{bottom:117.020000px;}\n.y251{bottom:117.140000px;}\n.y3ae{bottom:117.240000px;}\n.y518{bottom:117.380000px;}\n.y150{bottom:117.740000px;}\n.y26f{bottom:117.840000px;}\n.y64a{bottom:118.100000px;}\n.y424{bottom:118.340000px;}\n.y9b7{bottom:118.460000px;}\n.y181{bottom:118.820000px;}\n.y2b7{bottom:119.140000px;}\n.y6fb{bottom:119.420000px;}\n.y434{bottom:119.660000px;}\n.y3fe{bottom:119.710000px;}\n.ydd{bottom:119.900000px;}\n.y7ab{bottom:120.290000px;}\n.y509{bottom:120.860000px;}\n.y6af{bottom:121.100000px;}\n.y8dc{bottom:121.300000px;}\n.y8d6{bottom:121.940000px;}\n.y1de{bottom:122.060000px;}\n.y539{bottom:122.180000px;}\n.y81e{bottom:122.660000px;}\n.y2aa{bottom:123.380000px;}\n.y765{bottom:123.620000px;}\n.y7cd{bottom:123.740000px;}\n.y850{bottom:123.860000px;}\n.y669{bottom:123.980000px;}\n.y604{bottom:124.220000px;}\n.y45c{bottom:124.340000px;}\n.y7e7{bottom:124.460000px;}\n.y9b1{bottom:124.580000px;}\n.y914{bottom:124.660000px;}\n.y3b2{bottom:124.820000px;}\n.y930{bottom:124.940000px;}\n.y55d{bottom:125.540000px;}\n.y48a{bottom:125.900000px;}\n.y5c0{bottom:126.020000px;}\n.y596{bottom:126.140000px;}\n.y93e{bottom:126.500000px;}\n.y5cf{bottom:126.620000px;}\n.y11{bottom:126.740000px;}\n.y26b{bottom:126.860000px;}\n.y8a2{bottom:127.220000px;}\n.y83a{bottom:127.340000px;}\n.y799{bottom:127.580000px;}\n.y3ea{bottom:127.700000px;}\n.y788{bottom:127.820000px;}\n.y954{bottom:128.060000px;}\n.y39f{bottom:128.180000px;}\n.y384{bottom:128.300000px;}\n.y66e{bottom:128.420000px;}\n.y23d{bottom:128.540000px;}\n.y4e9{bottom:128.660000px;}\n.y8ff{bottom:128.780000px;}\n.y1ae{bottom:129.380000px;}\n.y649{bottom:129.860000px;}\n.y180{bottom:130.700000px;}\n.y14f{bottom:131.060000px;}\n.y9b6{bottom:131.300000px;}\n.y10f{bottom:131.780000px;}\n.y779{bottom:131.950000px;}\n.y7aa{bottom:132.050000px;}\n.y743{bottom:132.140000px;}\n.y36e{bottom:132.260000px;}\n.y86a{bottom:132.380000px;}\n.y6ae{bottom:132.890000px;}\n.y8db{bottom:133.060000px;}\n.y972{bottom:133.700000px;}\n.y433{bottom:133.820000px;}\n.y88{bottom:133.940000px;}\n.y3b{bottom:134.060000px;}\n.y99{bottom:134.420000px;}\n.y69{bottom:134.540000px;}\n.y2a9{bottom:135.260000px;}\n.y692{bottom:135.500000px;}\n.y84f{bottom:135.620000px;}\n.y668{bottom:135.740000px;}\n.y6ab{bottom:135.840000px;}\n.y4df{bottom:135.980000px;}\n.y603{bottom:136.100000px;}\n.y7e6{bottom:136.220000px;}\n.y45b{bottom:136.700000px;}\n.y92f{bottom:136.820000px;}\n.y2de{bottom:136.940000px;}\n.y94f{bottom:137.180000px;}\n.y31b{bottom:137.300000px;}\n.y5bf{bottom:137.780000px;}\n.ydc{bottom:137.900000px;}\n.y93d{bottom:138.260000px;}\n.y5ce{bottom:138.380000px;}\n.y26a{bottom:138.620000px;}\n.y6d6{bottom:138.740000px;}\n.y839{bottom:139.100000px;}\n.y345{bottom:139.220000px;}\n.y280{bottom:139.460000px;}\n.y787{bottom:139.580000px;}\n.y6a7{bottom:139.940000px;}\n.y39e{bottom:140.060000px;}\n.y5e2{bottom:140.180000px;}\n.y202{bottom:140.300000px;}\n.y23c{bottom:140.420000px;}\n.y250{bottom:140.540000px;}\n.y517{bottom:140.660000px;}\n.y423{bottom:141.740000px;}\n.y752{bottom:141.980000px;}\n.y17f{bottom:142.460000px;}\n.y3fc{bottom:142.750000px;}\n.y6fa{bottom:142.940000px;}\n.y674{bottom:143.420000px;}\n.y7a9{bottom:143.810000px;}\n.y778{bottom:143.830000px;}\n.y742{bottom:143.900000px;}\n.y9b5{bottom:144.260000px;}\n.y508{bottom:144.500000px;}\n.y6ad{bottom:144.770000px;}\n.y14e{bottom:145.220000px;}\n.y1dd{bottom:145.700000px;}\n.y538{bottom:145.820000px;}\n.y869{bottom:145.940000px;}\n.y2f8{bottom:146.060000px;}\n.y717{bottom:146.180000px;}\n.y8c3{bottom:146.300000px;}\n.y720{bottom:146.380000px;}\n.y9b0{bottom:146.540000px;}\n.y2a8{bottom:147.020000px;}\n.y489{bottom:147.140000px;}\n.y7cc{bottom:147.380000px;}\n.y84e{bottom:147.500000px;}\n.y28a{bottom:147.740000px;}\n.y4de{bottom:147.980000px;}\n.y667{bottom:148.100000px;}\n.y2dd{bottom:148.820000px;}\n.y55c{bottom:149.060000px;}\n.y10e{bottom:149.180000px;}\n.y3b1{bottom:149.210000px;}\n.y5be{bottom:149.660000px;}\n.y68{bottom:149.780000px;}\n.y10{bottom:150.140000px;}\n.y49d{bottom:150.260000px;}\n.y269{bottom:150.380000px;}\n.y5cd{bottom:150.500000px;}\n.y5df{bottom:150.620000px;}\n.y838{bottom:150.860000px;}\n.y344{bottom:150.980000px;}\n.y641{bottom:151.220000px;}\n.y87{bottom:151.340000px;}\n.y31a{bottom:151.460000px;}\n.y3a{bottom:151.580000px;}\n.y8fe{bottom:151.700000px;}\n.y39d{bottom:151.820000px;}\n.y98{bottom:151.940000px;}\n.y432{bottom:152.060000px;}\n.y23b{bottom:152.180000px;}\n.y90b{bottom:152.300000px;}\n.y1ad{bottom:152.420000px;}\n.y860{bottom:152.900000px;}\n.y2b6{bottom:153.940000px;}\n.y17e{bottom:154.460000px;}\n.y3fb{bottom:154.510000px;}\n.y8a1{bottom:154.580000px;}\n.y648{bottom:155.180000px;}\n.ydb{bottom:155.300000px;}\n.y751{bottom:155.420000px;}\n.y741{bottom:156.020000px;}\n.y8d5{bottom:157.100000px;}\n.y1dc{bottom:157.580000px;}\n.y716{bottom:157.940000px;}\n.y8c2{bottom:158.300000px;}\n.y764{bottom:158.540000px;}\n.y14d{bottom:158.660000px;}\n.y2a7{bottom:158.900000px;}\n.y691{bottom:159.140000px;}\n.y602{bottom:159.260000px;}\n.y71f{bottom:159.460000px;}\n.y4dd{bottom:159.740000px;}\n.y45a{bottom:159.860000px;}\n.y591{bottom:160.220000px;}\n.y947{bottom:160.460000px;}\n.y2dc{bottom:160.700000px;}\n.y55b{bottom:160.940000px;}\n.y3b0{bottom:161.330000px;}\n.y268{bottom:162.020000px;}\n.y6b8{bottom:162.500000px;}\n.y980{bottom:162.620000px;}\n.yf{bottom:162.740000px;}\n.y343{bottom:162.860000px;}\n.y640{bottom:162.980000px;}\n.y383{bottom:163.100000px;}\n.y786{bottom:163.220000px;}\n.y6a6{bottom:163.580000px;}\n.y39c{bottom:163.700000px;}\n.y431{bottom:163.820000px;}\n.y201{bottom:163.940000px;}\n.y23a{bottom:164.060000px;}\n.y1ac{bottom:164.180000px;}\n.y516{bottom:164.300000px;}\n.y422{bottom:165.380000px;}\n.y6f9{bottom:166.700000px;}\n.y67{bottom:167.180000px;}\n.y36d{bottom:167.540000px;}\n.y507{bottom:167.780000px;}\n.y6ac{bottom:167.930000px;}\n.y8a0{bottom:168.140000px;}\n.y537{bottom:168.860000px;}\n.y39{bottom:168.980000px;}\n.y2f6{bottom:169.100000px;}\n.y97{bottom:169.340000px;}\n.y86{bottom:169.460000px;}\n.y715{bottom:169.700000px;}\n.yfb{bottom:169.940000px;}\n.y8c1{bottom:170.060000px;}\n.y6d5{bottom:170.300000px;}\n.y488{bottom:170.420000px;}\n.y84d{bottom:170.540000px;}\n.y7cb{bottom:171.020000px;}\n.y7e5{bottom:171.380000px;}\n.y459{bottom:171.620000px;}\n.y666{bottom:171.860000px;}\n.y573{bottom:172.580000px;}\n.y14c{bottom:172.700000px;}\n.yda{bottom:172.820000px;}\n.y3af{bottom:172.970000px;}\n.y5bd{bottom:173.180000px;}\n.y601{bottom:173.300000px;}\n.y5cc{bottom:173.420000px;}\n.y49c{bottom:173.660000px;}\n.y267{bottom:173.780000px;}\n.y798{bottom:174.260000px;}\n.y3e9{bottom:174.380000px;}\n.y27d{bottom:174.410000px;}\n.y342{bottom:174.620000px;}\n.y319{bottom:174.740000px;}\n.y95c{bottom:174.860000px;}\n.y382{bottom:174.980000px;}\n.ye{bottom:175.100000px;}\n.y288{bottom:175.220000px;}\n.y8fd{bottom:175.340000px;}\n.y39b{bottom:175.460000px;}\n.y430{bottom:175.580000px;}\n.y220{bottom:175.700000px;}\n.y239{bottom:175.820000px;}\n.y24f{bottom:175.940000px;}\n.y1ab{bottom:176.060000px;}\n.y676{bottom:176.400000px;}\n.y85f{bottom:176.420000px;}\n.y2b4{bottom:177.580000px;}\n.y17d{bottom:177.860000px;}\n.y3f9{bottom:178.150000px;}\n.y647{bottom:178.340000px;}\n.y6f8{bottom:178.460000px;}\n.y777{bottom:178.750000px;}\n.y740{bottom:179.300000px;}\n.y89f{bottom:179.900000px;}\n.y1db{bottom:180.380000px;}\n.y536{bottom:180.620000px;}\n.y81d{bottom:181.100000px;}\n.y714{bottom:181.700000px;}\n.y8c0{bottom:181.820000px;}\n.y2a6{bottom:181.940000px;}\n.y6d4{bottom:182.060000px;}\n.y763{bottom:182.180000px;}\n.y84c{bottom:182.300000px;}\n.y690{bottom:182.900000px;}\n.y458{bottom:183.380000px;}\n.y2db{bottom:183.500000px;}\n.y71d{bottom:183.720000px;}\n.y946{bottom:183.740000px;}\n.y10d{bottom:184.580000px;}\n.y93c{bottom:184.940000px;}\n.y5cb{bottom:185.060000px;}\n.y572{bottom:185.180000px;}\n.y66{bottom:185.300000px;}\n.y266{bottom:185.540000px;}\n.y3e8{bottom:186.140000px;}\n.y27c{bottom:186.170000px;}\n.y14b{bottom:186.260000px;}\n.y97f{bottom:186.380000px;}\n.y341{bottom:186.500000px;}\n.y381{bottom:186.620000px;}\n.ya8{bottom:186.740000px;}\n.y85{bottom:186.860000px;}\n.y38{bottom:186.980000px;}\n.y72e{bottom:187.100000px;}\n.y200{bottom:187.220000px;}\n.yba{bottom:187.340000px;}\n.y96{bottom:187.460000px;}\n.y4a8{bottom:187.580000px;}\n.y21f{bottom:187.700000px;}\n.y24e{bottom:187.820000px;}\n.y515{bottom:187.940000px;}\n.y318{bottom:188.180000px;}\n.y36c{bottom:188.300000px;}\n.y95b{bottom:188.420000px;}\n.y421{bottom:188.540000px;}\n.y646{bottom:189.980000px;}\n.y1aa{bottom:190.100000px;}\n.y3f8{bottom:190.180000px;}\n.y6f7{bottom:190.220000px;}\n.y776{bottom:190.510000px;}\n.yd9{bottom:190.820000px;}\n.y970{bottom:190.940000px;}\n.y506{bottom:191.180000px;}\n.y89e{bottom:191.900000px;}\n.y535{bottom:192.500000px;}\n.y81c{bottom:192.860000px;}\n.y9af{bottom:193.100000px;}\n.y868{bottom:193.220000px;}\n.y713{bottom:193.460000px;}\n.y8bf{bottom:193.580000px;}\n.y762{bottom:193.940000px;}\n.y487{bottom:194.060000px;}\n.y84b{bottom:194.180000px;}\n.yd{bottom:194.300000px;}\n.y4dc{bottom:194.660000px;}\n.y804{bottom:195.020000px;}\n.y457{bottom:195.140000px;}\n.y590{bottom:195.260000px;}\n.y71c{bottom:195.360000px;}\n.y55a{bottom:195.740000px;}\n.y5bc{bottom:196.100000px;}\n.y600{bottom:196.220000px;}\n.y49b{bottom:196.820000px;}\n.y571{bottom:196.940000px;}\n.y5de{bottom:197.060000px;}\n.y265{bottom:197.180000px;}\n.y797{bottom:197.900000px;}\n.y3e7{bottom:198.020000px;}\n.y27b{bottom:198.050000px;}\n.y999{bottom:198.140000px;}\n.y340{bottom:198.260000px;}\n.y63f{bottom:198.500000px;}\n.y380{bottom:198.620000px;}\n.y4b5{bottom:198.740000px;}\n.y72d{bottom:198.860000px;}\n.y8fc{bottom:198.980000px;}\n.y14a{bottom:199.700000px;}\n.y317{bottom:199.820000px;}\n.y36b{bottom:200.060000px;}\n.y95a{bottom:200.180000px;}\n.y420{bottom:200.300000px;}\n.y17c{bottom:200.900000px;}\n.y2b3{bottom:201.220000px;}\n.y3f7{bottom:201.820000px;}\n.y1a9{bottom:201.860000px;}\n.y678{bottom:201.980000px;}\n.y10c{bottom:202.100000px;}\n.y775{bottom:202.420000px;}\n.y65{bottom:202.700000px;}\n.y96f{bottom:202.850000px;}\n.y73f{bottom:202.940000px;}\n.y1da{bottom:204.020000px;}\n.y8d4{bottom:204.140000px;}\n.y534{bottom:204.260000px;}\n.y37{bottom:204.380000px;}\n.y750{bottom:204.620000px;}\n.ya7{bottom:204.740000px;}\n.y84{bottom:204.860000px;}\n.y712{bottom:205.220000px;}\n.y8be{bottom:205.460000px;}\n.y2a5{bottom:205.580000px;}\n.y6d3{bottom:205.820000px;}\n.y84a{bottom:205.940000px;}\n.y68f{bottom:206.060000px;}\n.y4db{bottom:206.420000px;}\n.y803{bottom:206.660000px;}\n.y92e{bottom:206.900000px;}\n.y2da{bottom:207.140000px;}\n.y58f{bottom:207.260000px;}\n.y94e{bottom:207.380000px;}\n.y5bb{bottom:207.980000px;}\n.yd8{bottom:208.220000px;}\n.y570{bottom:208.580000px;}\n.y49a{bottom:208.700000px;}\n.y5dd{bottom:208.820000px;}\n.y264{bottom:208.940000px;}\n.y837{bottom:209.300000px;}\n.y6b3{bottom:209.780000px;}\n.y27a{bottom:209.810000px;}\n.y998{bottom:209.900000px;}\n.y785{bottom:210.020000px;}\n.y33f{bottom:210.140000px;}\n.y63e{bottom:210.260000px;}\n.y39a{bottom:210.380000px;}\n.y1ff{bottom:210.500000px;}\n.y24a{bottom:210.620000px;}\n.y238{bottom:210.740000px;}\n.y21e{bottom:210.860000px;}\n.y51f{bottom:210.980000px;}\n.y514{bottom:211.220000px;}\n.y3e6{bottom:211.460000px;}\n.y316{bottom:211.580000px;}\n.y41f{bottom:212.180000px;}\n.y17b{bottom:212.660000px;}\n.y2b2{bottom:213.100000px;}\n.y645{bottom:213.620000px;}\n.y3f5{bottom:213.700000px;}\n.y1a8{bottom:213.740000px;}\n.y6f6{bottom:213.980000px;}\n.y149{bottom:214.100000px;}\n.y774{bottom:214.180000px;}\n.y505{bottom:214.820000px;}\n.y8d3{bottom:215.900000px;}\n.y533{bottom:216.140000px;}\n.y2ee{bottom:216.600000px;}\n.y9ae{bottom:216.740000px;}\n.y711{bottom:216.980000px;}\n.y81b{bottom:217.100000px;}\n.y6d2{bottom:217.460000px;}\n.y486{bottom:217.820000px;}\n.y7ca{bottom:217.940000px;}\n.y4da{bottom:218.300000px;}\n.y802{bottom:218.540000px;}\n.y92d{bottom:218.900000px;}\n.y58e{bottom:219.020000px;}\n.y2a4{bottom:219.140000px;}\n.y559{bottom:219.380000px;}\n.y5ba{bottom:219.860000px;}\n.y64{bottom:220.100000px;}\n.y56f{bottom:220.340000px;}\n.y93b{bottom:220.460000px;}\n.y5ca{bottom:220.580000px;}\n.y263{bottom:220.700000px;}\n.y8ae{bottom:220.820000px;}\n.y836{bottom:221.060000px;}\n.y9b4{bottom:221.540000px;}\n.y279{bottom:221.690000px;}\n.y784{bottom:221.780000px;}\n.y284{bottom:221.900000px;}\n.y953{bottom:222.020000px;}\n.y399{bottom:222.140000px;}\n.y95{bottom:222.260000px;}\n.y36{bottom:222.380000px;}\n.y237{bottom:222.500000px;}\n.y4e8{bottom:222.620000px;}\n.y90a{bottom:222.740000px;}\n.yb9{bottom:222.860000px;}\n.y796{bottom:222.980000px;}\n.y3e5{bottom:223.220000px;}\n.y85e{bottom:223.340000px;}\n.y36a{bottom:223.460000px;}\n.y64f{bottom:223.560000px;}\n.y41e{bottom:223.940000px;}\n.y2b1{bottom:224.860000px;}\n.y3f4{bottom:225.460000px;}\n.yd7{bottom:225.740000px;}\n.y772{bottom:226.060000px;}\n.y73e{bottom:226.580000px;}\n.y96e{bottom:226.610000px;}\n.y1d9{bottom:227.780000px;}\n.y148{bottom:227.900000px;}\n.y673{bottom:228.140000px;}\n.y8bd{bottom:228.500000px;}\n.y710{bottom:228.860000px;}\n.y81a{bottom:229.100000px;}\n.y68e{bottom:229.580000px;}\n.y4d9{bottom:229.940000px;}\n.y456{bottom:230.060000px;}\n.y867{bottom:230.180000px;}\n.y801{bottom:230.300000px;}\n.y945{bottom:230.540000px;}\n.y92c{bottom:230.660000px;}\n.y2d9{bottom:230.780000px;}\n.y7a8{bottom:230.880000px;}\n.y58d{bottom:230.900000px;}\n.y558{bottom:231.140000px;}\n.y5b9{bottom:231.620000px;}\n.y56e{bottom:232.100000px;}\n.y93a{bottom:232.220000px;}\n.y262{bottom:232.340000px;}\n.y499{bottom:232.460000px;}\n.y8ad{bottom:232.580000px;}\n.y17a{bottom:233.060000px;}\n.y31e{bottom:233.280000px;}\n.y6b2{bottom:233.420000px;}\n.y278{bottom:233.450000px;}\n.y33e{bottom:233.780000px;}\n.y6a5{bottom:233.900000px;}\n.y398{bottom:234.020000px;}\n.y1fe{bottom:234.140000px;}\n.y21d{bottom:234.260000px;}\n.y236{bottom:234.380000px;}\n.y4e7{bottom:234.500000px;}\n.y795{bottom:234.740000px;}\n.y369{bottom:235.100000px;}\n.y3e4{bottom:235.220000px;}\n.y959{bottom:235.700000px;}\n.y41d{bottom:235.820000px;}\n.y2b0{bottom:236.740000px;}\n.y1a7{bottom:236.900000px;}\n.y6f5{bottom:237.020000px;}\n.y3f2{bottom:237.340000px;}\n.y10b{bottom:237.500000px;}\n.y83{bottom:237.620000px;}\n.y771{bottom:237.820000px;}\n.y63{bottom:238.100000px;}\n.y504{bottom:238.460000px;}\n.y8d2{bottom:239.420000px;}\n.y1d8{bottom:239.540000px;}\n.ya6{bottom:239.660000px;}\n.y35{bottom:239.900000px;}\n.yb8{bottom:240.260000px;}\n.y94{bottom:240.380000px;}\n.y761{bottom:240.620000px;}\n.y819{bottom:240.860000px;}\n.y485{bottom:240.980000px;}\n.y6d1{bottom:241.100000px;}\n.y7c9{bottom:241.220000px;}\n.y665{bottom:241.340000px;}\n.y849{bottom:241.460000px;}\n.y455{bottom:241.820000px;}\n.y4d8{bottom:241.940000px;}\n.y800{bottom:242.300000px;}\n.y2d8{bottom:242.540000px;}\n.y2a3{bottom:242.660000px;}\n.y557{bottom:243.140000px;}\n.y5b8{bottom:243.500000px;}\n.yd6{bottom:243.740000px;}\n.y56d{bottom:243.860000px;}\n.y261{bottom:244.100000px;}\n.y498{bottom:244.220000px;}\n.y5c9{bottom:244.340000px;}\n.y179{bottom:244.820000px;}\n.y997{bottom:244.940000px;}\n.y63d{bottom:245.180000px;}\n.y276{bottom:245.330000px;}\n.y281{bottom:245.540000px;}\n.y943{bottom:245.660000px;}\n.y37f{bottom:245.780000px;}\n.y4b4{bottom:245.900000px;}\n.y4a7{bottom:246.020000px;}\n.y235{bottom:246.140000px;}\n.y513{bottom:246.260000px;}\n.y794{bottom:246.380000px;}\n.y33d{bottom:246.860000px;}\n.y3e3{bottom:246.980000px;}\n.y97e{bottom:247.100000px;}\n.y885{bottom:247.580000px;}\n.y2af{bottom:248.380000px;}\n.y1a6{bottom:248.660000px;}\n.y652{bottom:249.140000px;}\n.y73d{bottom:249.740000px;}\n.y9ad{bottom:249.860000px;}\n.y503{bottom:250.220000px;}\n.y8d1{bottom:251.300000px;}\n.y1d7{bottom:251.420000px;}\n.y70f{bottom:251.900000px;}\n.y147{bottom:252.020000px;}\n.y8bc{bottom:252.380000px;}\n.y760{bottom:252.500000px;}\n.y818{bottom:252.620000px;}\n.y484{bottom:252.740000px;}\n.y7c8{bottom:252.980000px;}\n.y68d{bottom:253.340000px;}\n.y4d7{bottom:253.700000px;}\n.y454{bottom:253.820000px;}\n.y944{bottom:254.180000px;}\n.y2d7{bottom:254.420000px;}\n.y58c{bottom:254.540000px;}\n.y556{bottom:254.900000px;}\n.y5b7{bottom:255.260000px;}\n.y78b{bottom:255.480000px;}\n.y62{bottom:255.500000px;}\n.y82{bottom:255.620000px;}\n.y260{bottom:255.860000px;}\n.y497{bottom:255.980000px;}\n.y5c8{bottom:256.100000px;}\n.y835{bottom:256.580000px;}\n.y95d{bottom:256.920000px;}\n.y63c{bottom:256.940000px;}\n.y34{bottom:257.300000px;}\n.y6a4{bottom:257.540000px;}\n.ya5{bottom:257.660000px;}\n.y93{bottom:257.780000px;}\n.y21c{bottom:257.900000px;}\n.y234{bottom:258.020000px;}\n.y512{bottom:258.140000px;}\n.y33c{bottom:258.530000px;}\n.y368{bottom:258.650000px;}\n.y3e2{bottom:258.770000px;}\n.y322{bottom:258.890000px;}\n.y996{bottom:259.010000px;}\n.y884{bottom:259.370000px;}\n.y1a5{bottom:260.450000px;}\n.y6f4{bottom:260.690000px;}\n.yd5{bottom:261.170000px;}\n.y73c{bottom:261.530000px;}\n.y9ac{bottom:261.890000px;}\n.y502{bottom:262.130000px;}\n.y532{bottom:263.090000px;}\n.y1d6{bottom:263.210000px;}\n.y70e{bottom:263.690000px;}\n.y75f{bottom:264.290000px;}\n.y6d0{bottom:264.410000px;}\n.y483{bottom:264.530000px;}\n.y7c7{bottom:264.890000px;}\n.y7e4{bottom:265.010000px;}\n.y68c{bottom:265.130000px;}\n.y453{bottom:265.610000px;}\n.y664{bottom:265.730000px;}\n.y8bb{bottom:265.850000px;}\n.y2a2{bottom:265.970000px;}\n.y274{bottom:266.690000px;}\n.y178{bottom:266.930000px;}\n.y56c{bottom:267.050000px;}\n.y5b6{bottom:267.170000px;}\n.y866{bottom:267.410000px;}\n.y8ac{bottom:267.530000px;}\n.y25f{bottom:267.650000px;}\n.y939{bottom:267.770000px;}\n.y496{bottom:267.890000px;}\n.y5dc{bottom:268.010000px;}\n.y63b{bottom:268.970000px;}\n.y672{bottom:269.090000px;}\n.y27f{bottom:269.210000px;}\n.y942{bottom:269.330000px;}\n.y397{bottom:269.450000px;}\n.y4b3{bottom:269.570000px;}\n.y21b{bottom:269.690000px;}\n.y233{bottom:269.810000px;}\n.y657{bottom:269.930000px;}\n.y909{bottom:270.050000px;}\n.y97d{bottom:270.170000px;}\n.y33b{bottom:270.290000px;}\n.y3e1{bottom:270.530000px;}\n.y41c{bottom:270.650000px;}\n.y883{bottom:271.130000px;}\n.y1a4{bottom:272.210000px;}\n.y6f3{bottom:272.450000px;}\n.y76f{bottom:272.860000px;}\n.y61{bottom:273.050000px;}\n.y73b{bottom:273.410000px;}\n.y9ab{bottom:273.650000px;}\n.y89d{bottom:273.890000px;}\n.y8d0{bottom:274.370000px;}\n.y1d5{bottom:275.090000px;}\n.ya4{bottom:275.210000px;}\n.y33{bottom:275.330000px;}\n.y70d{bottom:275.570000px;}\n.yb7{bottom:275.690000px;}\n.y92{bottom:275.810000px;}\n.y75e{bottom:276.170000px;}\n.y482{bottom:276.290000px;}\n.y7c6{bottom:276.650000px;}\n.y7e3{bottom:276.770000px;}\n.y68b{bottom:276.890000px;}\n.y92b{bottom:277.250000px;}\n.y2d6{bottom:277.370000px;}\n.y94d{bottom:277.610000px;}\n.y273{bottom:278.450000px;}\n.yd4{bottom:278.570000px;}\n.y406{bottom:278.760000px;}\n.y865{bottom:279.170000px;}\n.y25e{bottom:279.290000px;}\n.y8ba{bottom:279.410000px;}\n.y834{bottom:280.010000px;}\n.y2ed{bottom:280.370000px;}\n.y177{bottom:280.490000px;}\n.y5ff{bottom:280.610000px;}\n.y63a{bottom:280.730000px;}\n.y671{bottom:280.850000px;}\n.y72c{bottom:281.090000px;}\n.y6a3{bottom:281.210000px;}\n.y396{bottom:281.330000px;}\n.y1fd{bottom:281.450000px;}\n.y21a{bottom:281.570000px;}\n.y232{bottom:281.690000px;}\n.y511{bottom:281.810000px;}\n.y320{bottom:281.930000px;}\n.y367{bottom:282.050000px;}\n.y960{bottom:282.410000px;}\n.y41b{bottom:282.650000px;}\n.y882{bottom:283.010000px;}\n.y1a3{bottom:284.090000px;}\n.y6f2{bottom:284.210000px;}\n.y73a{bottom:285.050000px;}\n.y501{bottom:285.170000px;}\n.y9aa{bottom:285.410000px;}\n.y3f1{bottom:285.580000px;}\n.y89c{bottom:285.770000px;}\n.y8cf{bottom:286.130000px;}\n.y531{bottom:286.250000px;}\n.y96d{bottom:286.610000px;}\n.y76e{bottom:286.660000px;}\n.y70c{bottom:287.330000px;}\n.y146{bottom:287.450000px;}\n.y6cf{bottom:287.690000px;}\n.y848{bottom:288.170000px;}\n.y481{bottom:288.290000px;}\n.y7c5{bottom:288.530000px;}\n.y4d6{bottom:288.650000px;}\n.y7ff{bottom:288.770000px;}\n.y7e2{bottom:288.890000px;}\n.y92a{bottom:289.010000px;}\n.y2a1{bottom:289.250000px;}\n.y555{bottom:289.730000px;}\n.y5b5{bottom:290.210000px;}\n.y271{bottom:290.330000px;}\n.y81{bottom:290.450000px;}\n.y56b{bottom:290.690000px;}\n.y938{bottom:290.810000px;}\n.y495{bottom:290.930000px;}\n.y60{bottom:291.050000px;}\n.y2ec{bottom:291.290000px;}\n.y27e{bottom:292.250000px;}\n.y639{bottom:292.490000px;}\n.ya3{bottom:292.610000px;}\n.y9b3{bottom:292.730000px;}\n.y32{bottom:292.850000px;}\n.yfa{bottom:293.090000px;}\n.yb6{bottom:293.210000px;}\n.y793{bottom:293.330000px;}\n.y908{bottom:293.690000px;}\n.y97c{bottom:293.810000px;}\n.y3e0{bottom:293.930000px;}\n.y176{bottom:294.050000px;}\n.y85d{bottom:294.170000px;}\n.y41a{bottom:294.410000px;}\n.y995{bottom:295.370000px;}\n.y1a2{bottom:295.850000px;}\n.yd3{bottom:296.570000px;}\n.y500{bottom:297.050000px;}\n.y89b{bottom:297.530000px;}\n.y3f0{bottom:297.580000px;}\n.y8ce{bottom:298.010000px;}\n.y1d4{bottom:298.130000px;}\n.y96c{bottom:298.370000px;}\n.y644{bottom:298.490000px;}\n.y145{bottom:299.210000px;}\n.y6ce{bottom:299.570000px;}\n.y480{bottom:299.930000px;}\n.y68a{bottom:300.050000px;}\n.y4d5{bottom:300.410000px;}\n.y452{bottom:300.530000px;}\n.y2d5{bottom:301.010000px;}\n.y94c{bottom:301.250000px;}\n.y554{bottom:301.490000px;}\n.y5b4{bottom:301.970000px;}\n.y270{bottom:302.090000px;}\n.y937{bottom:302.570000px;}\n.y494{bottom:302.690000px;}\n.y25d{bottom:302.810000px;}\n.y833{bottom:303.290000px;}\n.y3ad{bottom:303.410000px;}\n.y5fe{bottom:303.890000px;}\n.y638{bottom:304.250000px;}\n.y395{bottom:304.370000px;}\n.y249{bottom:304.490000px;}\n.y4e6{bottom:304.610000px;}\n.y1fc{bottom:304.730000px;}\n.y2eb{bottom:304.850000px;}\n.y510{bottom:305.090000px;}\n.y40a{bottom:305.450000px;}\n.y97b{bottom:305.570000px;}\n.y366{bottom:305.690000px;}\n.y37e{bottom:306.050000px;}\n.y419{bottom:306.170000px;}\n.y881{bottom:306.770000px;}\n.y175{bottom:307.490000px;}\n.y1a1{bottom:307.730000px;}\n.y5f{bottom:308.450000px;}\n.y4ff{bottom:308.930000px;}\n.y994{bottom:309.050000px;}\n.y3ef{bottom:309.340000px;}\n.y89a{bottom:309.410000px;}\n.y76d{bottom:309.820000px;}\n.y1d3{bottom:309.890000px;}\n.y530{bottom:310.130000px;}\n.y31{bottom:310.250000px;}\n.ya2{bottom:310.610000px;}\n.y144{bottom:310.970000px;}\n.y6cd{bottom:311.570000px;}\n.y7c4{bottom:311.690000px;}\n.y47f{bottom:311.810000px;}\n.y847{bottom:311.930000px;}\n.y7e1{bottom:312.170000px;}\n.y451{bottom:312.290000px;}\n.y663{bottom:312.530000px;}\n.y2a0{bottom:312.890000px;}\n.y553{bottom:313.490000px;}\n.y5b3{bottom:313.850000px;}\n.yd2{bottom:314.090000px;}\n.y25c{bottom:314.450000px;}\n.y3ac{bottom:314.570000px;}\n.y493{bottom:314.690000px;}\n.y315{bottom:314.810000px;}\n.y733{bottom:316.010000px;}\n.y394{bottom:316.130000px;}\n.y4b2{bottom:316.250000px;}\n.y1fb{bottom:316.370000px;}\n.y231{bottom:316.490000px;}\n.y656{bottom:316.610000px;}\n.y907{bottom:316.730000px;}\n.y792{bottom:316.850000px;}\n.y3df{bottom:317.330000px;}\n.y85c{bottom:317.570000px;}\n.y418{bottom:317.930000px;}\n.y174{bottom:319.130000px;}\n.y33a{bottom:319.250000px;}\n.y739{bottom:320.090000px;}\n.y880{bottom:320.210000px;}\n.y4fe{bottom:320.570000px;}\n.y993{bottom:320.810000px;}\n.y3ee{bottom:321.220000px;}\n.y76c{bottom:321.580000px;}\n.y1d2{bottom:321.770000px;}\n.y96b{bottom:322.010000px;}\n.y70b{bottom:322.370000px;}\n.y6cc{bottom:323.210000px;}\n.y75d{bottom:323.330000px;}\n.y7c3{bottom:323.450000px;}\n.y52f{bottom:323.570000px;}\n.y450{bottom:324.050000px;}\n.y7fe{bottom:324.290000px;}\n.y2d4{bottom:324.770000px;}\n.y94b{bottom:324.890000px;}\n.y817{bottom:325.250000px;}\n.y5b2{bottom:325.610000px;}\n.y80{bottom:325.850000px;}\n.y10a{bottom:325.970000px;}\n.y25b{bottom:326.210000px;}\n.y5e{bottom:326.450000px;}\n.y91{bottom:326.570000px;}\n.y832{bottom:326.930000px;}\n.y7af{bottom:327.410000px;}\n.y56a{bottom:327.890000px;}\n.ya1{bottom:328.010000px;}\n.yee{bottom:328.130000px;}\n.y30{bottom:328.250000px;}\n.y230{bottom:328.370000px;}\n.y655{bottom:328.490000px;}\n.yb5{bottom:328.610000px;}\n.y143{bottom:328.970000px;}\n.y3de{bottom:329.090000px;}\n.y37d{bottom:329.210000px;}\n.y417{bottom:329.810000px;}\n.y9a9{bottom:330.530000px;}\n.y173{bottom:330.890000px;}\n.y1a0{bottom:331.010000px;}\n.y339{bottom:331.130000px;}\n.y6f1{bottom:331.610000px;}\n.y87f{bottom:331.970000px;}\n.yd1{bottom:332.090000px;}\n.y958{bottom:332.210000px;}\n.y4fd{bottom:332.450000px;}\n.y992{bottom:332.570000px;}\n.y8cd{bottom:333.410000px;}\n.y1d1{bottom:333.530000px;}\n.y70a{bottom:334.130000px;}\n.y6cb{bottom:335.090000px;}\n.y52e{bottom:335.210000px;}\n.y689{bottom:335.330000px;}\n.y846{bottom:335.450000px;}\n.y47e{bottom:335.570000px;}\n.y44f{bottom:335.810000px;}\n.y662{bottom:335.930000px;}\n.y4d4{bottom:336.050000px;}\n.y58b{bottom:336.410000px;}\n.y552{bottom:336.890000px;}\n.y816{bottom:337.130000px;}\n.y5b1{bottom:337.490000px;}\n.y25a{bottom:337.970000px;}\n.y936{bottom:338.090000px;}\n.y492{bottom:338.210000px;}\n.y864{bottom:338.330000px;}\n.y5c7{bottom:338.450000px;}\n.y831{bottom:338.690000px;}\n.y637{bottom:339.290000px;}\n.y3ab{bottom:339.650000px;}\n.y393{bottom:339.770000px;}\n.y4b1{bottom:339.890000px;}\n.y51e{bottom:340.010000px;}\n.y22f{bottom:340.130000px;}\n.y50f{bottom:340.250000px;}\n.y3dd{bottom:340.850000px;}\n.y37c{bottom:340.970000px;}\n.y85b{bottom:341.090000px;}\n.y9a8{bottom:342.290000px;}\n.y13d{bottom:342.530000px;}\n.y338{bottom:342.890000px;}\n.y7f{bottom:343.370000px;}\n.y87e{bottom:343.850000px;}\n.y5d{bottom:343.970000px;}\n.y899{bottom:344.210000px;}\n.y991{bottom:344.330000px;}\n.y8cc{bottom:345.290000px;}\n.yed{bottom:345.530000px;}\n.y2f{bottom:345.650000px;}\n.y76a{bottom:345.820000px;}\n.y709{bottom:345.890000px;}\n.yc4{bottom:346.010000px;}\n.ya0{bottom:346.130000px;}\n.y75c{bottom:346.850000px;}\n.y7c2{bottom:346.970000px;}\n.y52d{bottom:347.210000px;}\n.y47d{bottom:347.330000px;}\n.y4d3{bottom:347.690000px;}\n.y44e{bottom:347.810000px;}\n.y2d3{bottom:347.930000px;}\n.y94a{bottom:348.170000px;}\n.y58a{bottom:348.410000px;}\n.y5b0{bottom:349.250000px;}\n.yd0{bottom:349.490000px;}\n.y259{bottom:349.610000px;}\n.y929{bottom:349.850000px;}\n.y29f{bottom:349.970000px;}\n.y830{bottom:350.690000px;}\n.y7ac{bottom:351.170000px;}\n.y569{bottom:351.290000px;}\n.y670{bottom:351.410000px;}\n.y4a6{bottom:351.530000px;}\n.y1fa{bottom:351.650000px;}\n.y219{bottom:351.770000px;}\n.y4ae{bottom:351.890000px;}\n.y22e{bottom:352.010000px;}\n.y50e{bottom:352.130000px;}\n.y365{bottom:352.250000px;}\n.y3dc{bottom:352.490000px;}\n.y5fd{bottom:352.610000px;}\n.y37b{bottom:352.730000px;}\n.y416{bottom:352.850000px;}\n.y172{bottom:354.050000px;}\n.y9a7{bottom:354.170000px;}\n.y19f{bottom:354.290000px;}\n.y337{bottom:354.770000px;}\n.y6f0{bottom:355.130000px;}\n.y142{bottom:355.610000px;}\n.y4fc{bottom:356.090000px;}\n.y990{bottom:356.330000px;}\n.y845{bottom:357.050000px;}\n.y738{bottom:357.290000px;}\n.y96a{bottom:357.530000px;}\n.y708{bottom:357.650000px;}\n.y6ca{bottom:358.250000px;}\n.y47c{bottom:359.090000px;}\n.y2d2{bottom:359.570000px;}\n.y7fd{bottom:359.690000px;}\n.y551{bottom:359.930000px;}\n.y815{bottom:360.410000px;}\n.y5af{bottom:361.130000px;}\n.y97a{bottom:361.250000px;}\n.y5c{bottom:361.370000px;}\n.y61c{bottom:361.440000px;}\n.y314{bottom:361.490000px;}\n.y5db{bottom:361.610000px;}\n.y928{bottom:361.730000px;}\n.y491{bottom:361.850000px;}\n.y82f{bottom:362.330000px;}\n.y661{bottom:362.930000px;}\n.y2e{bottom:363.050000px;}\n.y277{bottom:363.170000px;}\n.y8fb{bottom:363.410000px;}\n.yb4{bottom:363.530000px;}\n.y13c{bottom:363.650000px;}\n.y364{bottom:364.010000px;}\n.y3db{bottom:364.250000px;}\n.y37a{bottom:364.610000px;}\n.y171{bottom:365.810000px;}\n.ycf{bottom:366.890000px;}\n.y141{bottom:367.370000px;}\n.y4fb{bottom:367.850000px;}\n.y87d{bottom:367.970000px;}\n.y8cb{bottom:368.330000px;}\n.y1d0{bottom:368.450000px;}\n.y844{bottom:368.690000px;}\n.y13f{bottom:369.170000px;}\n.y969{bottom:369.310000px;}\n.y707{bottom:369.650000px;}\n.y6c9{bottom:370.010000px;}\n.y52c{bottom:370.250000px;}\n.y47b{bottom:370.850000px;}\n.y44d{bottom:371.330000px;}\n.y2d1{bottom:371.450000px;}\n.y258{bottom:373.130000px;}\n.y29e{bottom:373.250000px;}\n.y82e{bottom:374.210000px;}\n.y388{bottom:374.400000px;}\n.y8f2{bottom:374.570000px;}\n.y1f9{bottom:374.690000px;}\n.y2ea{bottom:374.810000px;}\n.y218{bottom:374.930000px;}\n.y24d{bottom:375.050000px;}\n.y22d{bottom:375.170000px;}\n.y4e5{bottom:375.290000px;}\n.y791{bottom:375.410000px;}\n.y5fc{bottom:375.770000px;}\n.y363{bottom:375.890000px;}\n.y3da{bottom:376.010000px;}\n.y415{bottom:376.610000px;}\n.y336{bottom:377.570000px;}\n.y170{bottom:377.690000px;}\n.y19e{bottom:377.930000px;}\n.y7e{bottom:378.770000px;}\n.y109{bottom:378.890000px;}\n.y5b{bottom:379.370000px;}\n.y4fa{bottom:379.730000px;}\n.y8ca{bottom:380.090000px;}\n.y1cf{bottom:380.210000px;}\n.y13e{bottom:380.810000px;}\n.yc3{bottom:380.930000px;}\n.y2d{bottom:381.170000px;}\n.y967{bottom:381.190000px;}\n.y706{bottom:381.410000px;}\n.yb3{bottom:381.530000px;}\n.y6c8{bottom:381.770000px;}\n.y75b{bottom:381.890000px;}\n.y52b{bottom:382.010000px;}\n.y7fc{bottom:382.490000px;}\n.y4d2{bottom:382.610000px;}\n.y47a{bottom:382.850000px;}\n.y550{bottom:382.970000px;}\n.y2d0{bottom:383.210000px;}\n.y814{bottom:383.690000px;}\n.y5ae{bottom:384.170000px;}\n.y737{bottom:384.290000px;}\n.y979{bottom:384.410000px;}\n.y275{bottom:384.530000px;}\n.y313{bottom:384.650000px;}\n.y5da{bottom:384.770000px;}\n.yce{bottom:384.890000px;}\n.y140{bottom:385.490000px;}\n.y74f{bottom:386.090000px;}\n.y3aa{bottom:386.330000px;}\n.y392{bottom:386.450000px;}\n.y1f8{bottom:386.570000px;}\n.y4a5{bottom:386.690000px;}\n.y51d{bottom:386.810000px;}\n.y790{bottom:387.170000px;}\n.y5fb{bottom:387.530000px;}\n.y3d9{bottom:387.770000px;}\n.y61e{bottom:388.130000px;}\n.y85a{bottom:388.250000px;}\n.y636{bottom:390.050000px;}\n.y843{bottom:390.650000px;}\n.y6ef{bottom:391.130000px;}\n.y9a6{bottom:391.250000px;}\n.y4f9{bottom:391.490000px;}\n.y1ce{bottom:392.090000px;}\n.y705{bottom:393.170000px;}\n.y87c{bottom:393.290000px;}\n.y769{bottom:393.480000px;}\n.y6c7{bottom:393.530000px;}\n.y7c1{bottom:393.650000px;}\n.y52a{bottom:393.890000px;}\n.y4d1{bottom:394.250000px;}\n.y966{bottom:394.270000px;}\n.y44c{bottom:394.490000px;}\n.y2cf{bottom:395.090000px;}\n.y54f{bottom:395.330000px;}\n.y5ad{bottom:395.930000px;}\n.y978{bottom:396.170000px;}\n.y7a6{bottom:396.240000px;}\n.y108{bottom:396.290000px;}\n.y257{bottom:396.530000px;}\n.y5d9{bottom:396.650000px;}\n.y7d{bottom:396.770000px;}\n.y5a{bottom:396.890000px;}\n.y13b{bottom:397.130000px;}\n.y82d{bottom:397.490000px;}\n.y568{bottom:397.970000px;}\n.y3a9{bottom:398.210000px;}\n.y248{bottom:398.330000px;}\n.y1f7{bottom:398.450000px;}\n.y2c{bottom:398.570000px;}\n.y4ad{bottom:398.690000px;}\n.y4a4{bottom:398.810000px;}\n.yb2{bottom:398.930000px;}\n.y5fa{bottom:399.290000px;}\n.y3d8{bottom:399.410000px;}\n.y362{bottom:399.530000px;}\n.y38b{bottom:400.010000px;}\n.y414{bottom:400.130000px;}\n.y660{bottom:400.250000px;}\n.y335{bottom:401.210000px;}\n.y16f{bottom:401.450000px;}\n.y19d{bottom:401.570000px;}\n.y635{bottom:401.690000px;}\n.y842{bottom:401.810000px;}\n.ycd{bottom:402.410000px;}\n.y6ee{bottom:403.010000px;}\n.y4f8{bottom:403.370000px;}\n.y1cd{bottom:403.850000px;}\n.y704{bottom:404.930000px;}\n.y87b{bottom:405.050000px;}\n.y6c6{bottom:405.530000px;}\n.y529{bottom:405.650000px;}\n.y965{bottom:405.910000px;}\n.y7fb{bottom:406.130000px;}\n.y44b{bottom:406.250000px;}\n.y479{bottom:406.370000px;}\n.y3ed{bottom:406.440000px;}\n.y2ce{bottom:406.850000px;}\n.y54e{bottom:407.330000px;}\n.y736{bottom:407.810000px;}\n.y5ac{bottom:407.930000px;}\n.y783{bottom:408.050000px;}\n.y272{bottom:408.170000px;}\n.y256{bottom:408.290000px;}\n.y29d{bottom:408.410000px;}\n.y8ab{bottom:408.530000px;}\n.y5d8{bottom:408.650000px;}\n.y490{bottom:408.770000px;}\n.y8b9{bottom:409.850000px;}\n.y3a8{bottom:409.970000px;}\n.y42f{bottom:410.090000px;}\n.y1f6{bottom:410.210000px;}\n.y4e4{bottom:410.330000px;}\n.y51c{bottom:410.450000px;}\n.y75a{bottom:410.570000px;}\n.y5f9{bottom:410.930000px;}\n.y3d7{bottom:411.170000px;}\n.y567{bottom:411.890000px;}\n.y898{bottom:412.970000px;}\n.y634{bottom:413.570000px;}\n.y59{bottom:414.290000px;}\n.y16e{bottom:414.890000px;}\n.y4f7{bottom:415.130000px;}\n.y8c9{bottom:415.610000px;}\n.y1cc{bottom:415.730000px;}\n.y2b{bottom:415.970000px;}\n.yf9{bottom:416.330000px;}\n.yc2{bottom:416.450000px;}\n.y703{bottom:416.810000px;}\n.yb1{bottom:416.930000px;}\n.y528{bottom:417.410000px;}\n.y688{bottom:417.530000px;}\n.y133{bottom:418.010000px;}\n.y7e0{bottom:418.130000px;}\n.y4d0{bottom:418.490000px;}\n.y44a{bottom:418.610000px;}\n.y2cd{bottom:418.730000px;}\n.y589{bottom:418.850000px;}\n.y54d{bottom:419.090000px;}\n.y7a2{bottom:419.280000px;}\n.y5ab{bottom:419.690000px;}\n.ycc{bottom:419.810000px;}\n.y255{bottom:420.050000px;}\n.y927{bottom:420.170000px;}\n.y29c{bottom:420.290000px;}\n.y8aa{bottom:420.410000px;}\n.y82c{bottom:420.770000px;}\n.y391{bottom:421.850000px;}\n.y217{bottom:421.970000px;}\n.y1f5{bottom:422.090000px;}\n.y22c{bottom:422.210000px;}\n.y51b{bottom:422.330000px;}\n.y5f8{bottom:422.690000px;}\n.y361{bottom:422.810000px;}\n.y3d6{bottom:422.930000px;}\n.y38a{bottom:423.650000px;}\n.y65f{bottom:423.770000px;}\n.y841{bottom:423.890000px;}\n.y897{bottom:424.730000px;}\n.y19c{bottom:424.850000px;}\n.y6ed{bottom:426.170000px;}\n.y16d{bottom:426.530000px;}\n.y4f6{bottom:427.030000px;}\n.y8c8{bottom:427.510000px;}\n.y1cb{bottom:427.990000px;}\n.y74a{bottom:428.040000px;}\n.y87a{bottom:428.710000px;}\n.y6c5{bottom:429.070000px;}\n.y7c0{bottom:429.190000px;}\n.y527{bottom:429.310000px;}\n.y964{bottom:429.430000px;}\n.y7fa{bottom:429.790000px;}\n.y13a{bottom:429.910000px;}\n.y478{bottom:430.150000px;}\n.y4cf{bottom:430.510000px;}\n.y54c{bottom:430.870000px;}\n.y813{bottom:431.110000px;}\n.y5aa{bottom:431.470000px;}\n.y781{bottom:431.590000px;}\n.y7c{bottom:431.710000px;}\n.y312{bottom:432.070000px;}\n.y405{bottom:432.190000px;}\n.y58{bottom:432.310000px;}\n.y8b8{bottom:433.150000px;}\n.y132{bottom:433.270000px;}\n.y3a7{bottom:433.630000px;}\n.y1f4{bottom:433.750000px;}\n.yc1{bottom:433.870000px;}\n.y2a{bottom:433.990000px;}\n.y759{bottom:434.110000px;}\n.y906{bottom:434.230000px;}\n.yf8{bottom:434.470000px;}\n.y3d5{bottom:434.590000px;}\n.y859{bottom:434.830000px;}\n.y566{bottom:435.190000px;}\n.y98f{bottom:435.550000px;}\n.y840{bottom:435.670000px;}\n.y896{bottom:436.510000px;}\n.y9a5{bottom:436.750000px;}\n.y633{bottom:437.350000px;}\n.ycb{bottom:437.830000px;}\n.y6ec{bottom:437.950000px;}\n.y19b{bottom:438.310000px;}\n.y16c{bottom:438.430000px;}\n.y1ca{bottom:439.870000px;}\n.y7bf{bottom:440.950000px;}\n.y4f5{bottom:441.070000px;}\n.y526{bottom:441.190000px;}\n.y687{bottom:441.310000px;}\n.y139{bottom:441.550000px;}\n.y61b{bottom:441.600000px;}\n.y7df{bottom:441.670000px;}\n.y449{bottom:441.790000px;}\n.y2cc{bottom:441.910000px;}\n.y949{bottom:442.150000px;}\n.y4ce{bottom:442.270000px;}\n.y588{bottom:442.390000px;}\n.y54b{bottom:442.630000px;}\n.y812{bottom:442.750000px;}\n.y5a9{bottom:443.230000px;}\n.y926{bottom:443.830000px;}\n.y29b{bottom:443.950000px;}\n.y12d{bottom:444.190000px;}\n.y82b{bottom:444.550000px;}\n.y8b7{bottom:444.910000px;}\n.y7a4{bottom:445.030000px;}\n.y390{bottom:445.510000px;}\n.y1f3{bottom:445.630000px;}\n.y216{bottom:445.750000px;}\n.y22b{bottom:445.870000px;}\n.y654{bottom:445.990000px;}\n.y360{bottom:446.110000px;}\n.y131{bottom:446.230000px;}\n.y3d4{bottom:446.350000px;}\n.y413{bottom:447.070000px;}\n.y968{bottom:447.430000px;}\n.y8c7{bottom:447.790000px;}\n.y334{bottom:448.030000px;}\n.y98e{bottom:448.150000px;}\n.y895{bottom:448.270000px;}\n.y135{bottom:448.630000px;}\n.y8e7{bottom:448.800000px;}\n.y107{bottom:449.230000px;}\n.y57{bottom:449.710000px;}\n.y379{bottom:449.830000px;}\n.y19a{bottom:450.070000px;}\n.y632{bottom:450.790000px;}\n.y29{bottom:451.390000px;}\n.y1c9{bottom:451.630000px;}\n.yc0{bottom:451.870000px;}\n.y6c4{bottom:452.350000px;}\n.y7be{bottom:452.950000px;}\n.y686{bottom:453.070000px;}\n.y2cb{bottom:453.550000px;}\n.y477{bottom:453.670000px;}\n.y587{bottom:454.030000px;}\n.y4cd{bottom:454.150000px;}\n.y74d{bottom:454.510000px;}\n.y54a{bottom:454.630000px;}\n.y5a8{bottom:455.110000px;}\n.y311{bottom:455.230000px;}\n.yca{bottom:455.350000px;}\n.y5d7{bottom:455.470000px;}\n.y925{bottom:455.710000px;}\n.y8a9{bottom:455.950000px;}\n.y8b6{bottom:456.910000px;}\n.y83f{bottom:457.030000px;}\n.y3a6{bottom:457.270000px;}\n.y1f2{bottom:457.390000px;}\n.y215{bottom:457.510000px;}\n.y22a{bottom:457.630000px;}\n.y35f{bottom:457.870000px;}\n.y3d3{bottom:458.110000px;}\n.y12c{bottom:458.230000px;}\n.y858{bottom:458.470000px;}\n.y138{bottom:458.590000px;}\n.y905{bottom:459.550000px;}\n.y333{bottom:459.790000px;}\n.y98d{bottom:459.910000px;}\n.y9a4{bottom:460.150000px;}\n.y894{bottom:460.630000px;}\n.y6eb{bottom:461.470000px;}\n.y16b{bottom:461.590000px;}\n.y199{bottom:461.950000px;}\n.y631{bottom:462.430000px;}\n.y134{bottom:462.670000px;}\n.y130{bottom:462.910000px;}\n.y1c8{bottom:463.510000px;}\n.y8ec{bottom:463.750000px;}\n.y4f4{bottom:464.110000px;}\n.y525{bottom:464.230000px;}\n.y7bd{bottom:464.710000px;}\n.y685{bottom:464.830000px;}\n.y448{bottom:465.310000px;}\n.y2ca{bottom:465.430000px;}\n.y879{bottom:465.910000px;}\n.y586{bottom:466.030000px;}\n.y310{bottom:466.990000px;}\n.y56{bottom:467.110000px;}\n.y7b{bottom:467.230000px;}\n.y90{bottom:467.710000px;}\n.y732{bottom:468.670000px;}\n.y28{bottom:468.910000px;}\n.y595{bottom:469.030000px;}\n.y3a5{bottom:469.150000px;}\n.ybf{bottom:469.270000px;}\n.yec{bottom:469.390000px;}\n.y229{bottom:469.510000px;}\n.y5f7{bottom:469.630000px;}\n.y3d2{bottom:469.750000px;}\n.yf7{bottom:469.870000px;}\n.y65e{bottom:470.350000px;}\n.y412{bottom:470.590000px;}\n.y904{bottom:471.550000px;}\n.y332{bottom:471.670000px;}\n.y137{bottom:472.150000px;}\n.yc9{bottom:472.750000px;}\n.y16a{bottom:473.350000px;}\n.y6ea{bottom:473.470000px;}\n.y12b{bottom:473.590000px;}\n.y198{bottom:473.710000px;}\n.y630{bottom:474.310000px;}\n.y893{bottom:474.430000px;}\n.y702{bottom:475.270000px;}\n.y6c3{bottom:475.630000px;}\n.y12f{bottom:475.750000px;}\n.y4f3{bottom:475.870000px;}\n.y7bc{bottom:476.470000px;}\n.y7f9{bottom:476.710000px;}\n.y476{bottom:476.950000px;}\n.y447{bottom:477.070000px;}\n.y2c9{bottom:477.190000px;}\n.y549{bottom:477.670000px;}\n.y811{bottom:477.910000px;}\n.y5a7{bottom:478.150000px;}\n.y77d{bottom:478.390000px;}\n.y30f{bottom:478.750000px;}\n.y402{bottom:478.870000px;}\n.y378{bottom:478.990000px;}\n.y82a{bottom:479.350000px;}\n.y731{bottom:480.430000px;}\n.y83e{bottom:480.550000px;}\n.y4b0{bottom:480.670000px;}\n.y78f{bottom:480.910000px;}\n.y758{bottom:481.030000px;}\n.y5f6{bottom:481.390000px;}\n.y3d1{bottom:481.510000px;}\n.y35e{bottom:481.630000px;}\n.y857{bottom:482.110000px;}\n.y565{bottom:482.230000px;}\n.y903{bottom:483.310000px;}\n.y331{bottom:483.430000px;}\n.y9a3{bottom:483.550000px;}\n.y411{bottom:484.030000px;}\n.y7a{bottom:484.630000px;}\n.y169{bottom:485.110000px;}\n.y55{bottom:485.230000px;}\n.y197{bottom:485.470000px;}\n.y136{bottom:485.710000px;}\n.y892{bottom:486.190000px;}\n.yeb{bottom:486.790000px;}\n.y27{bottom:486.910000px;}\n.y1c7{bottom:487.150000px;}\n.ybe{bottom:487.390000px;}\n.y12a{bottom:487.750000px;}\n.y524{bottom:487.870000px;}\n.y7f8{bottom:488.350000px;}\n.y12e{bottom:488.710000px;}\n.y4cc{bottom:488.950000px;}\n.y2c8{bottom:489.070000px;}\n.y548{bottom:489.310000px;}\n.y5a6{bottom:489.910000px;}\n.y7de{bottom:490.030000px;}\n.y615{bottom:490.080000px;}\n.y29a{bottom:490.510000px;}\n.y957{bottom:490.630000px;}\n.yc8{bottom:490.750000px;}\n.y829{bottom:491.110000px;}\n.y247{bottom:492.190000px;}\n.y24c{bottom:492.310000px;}\n.y1f1{bottom:492.430000px;}\n.y214{bottom:492.550000px;}\n.y4a3{bottom:492.670000px;}\n.y50d{bottom:492.790000px;}\n.y5f5{bottom:493.030000px;}\n.y3d0{bottom:493.270000px;}\n.y35d{bottom:493.510000px;}\n.y65d{bottom:493.990000px;}\n.y8b5{bottom:494.110000px;}\n.y902{bottom:495.070000px;}\n.y330{bottom:495.430000px;}\n.y410{bottom:495.670000px;}\n.y168{bottom:496.870000px;}\n.y6e9{bottom:496.990000px;}\n.y196{bottom:497.230000px;}\n.y62f{bottom:498.070000px;}\n.y1c6{bottom:498.910000px;}\n.y977{bottom:499.030000px;}\n.y6c2{bottom:499.390000px;}\n.y4f2{bottom:499.630000px;}\n.y475{bottom:500.110000px;}\n.y7f7{bottom:500.230000px;}\n.y2c7{bottom:500.830000px;}\n.y810{bottom:501.190000px;}\n.y129{bottom:501.310000px;}\n.y77b{bottom:501.790000px;}\n.y5a5{bottom:501.910000px;}\n.y106{bottom:502.030000px;}\n.y299{bottom:502.270000px;}\n.y377{bottom:502.390000px;}\n.y30e{bottom:502.510000px;}\n.y54{bottom:502.630000px;}\n.y828{bottom:502.870000px;}\n.y3a4{bottom:503.950000px;}\n.y1f0{bottom:504.070000px;}\n.y48f{bottom:504.190000px;}\n.y26{bottom:504.310000px;}\n.y757{bottom:504.430000px;}\n.yea{bottom:504.790000px;}\n.y3cf{bottom:504.910000px;}\n.y35c{bottom:505.150000px;}\n.y564{bottom:505.390000px;}\n.y65c{bottom:505.750000px;}\n.y901{bottom:506.830000px;}\n.y40f{bottom:507.670000px;}\n.yc7{bottom:508.150000px;}\n.y748{bottom:508.560000px;}\n.y167{bottom:508.750000px;}\n.y195{bottom:509.230000px;}\n.y962{bottom:510.430000px;}\n.y1c5{bottom:510.790000px;}\n.y6c1{bottom:511.150000px;}\n.y7bb{bottom:511.390000px;}\n.y4f1{bottom:511.510000px;}\n.y62e{bottom:511.630000px;}\n.y7f6{bottom:511.990000px;}\n.y523{bottom:512.110000px;}\n.y446{bottom:512.590000px;}\n.y2c6{bottom:512.710000px;}\n.y585{bottom:512.830000px;}\n.y547{bottom:513.070000px;}\n.y7a1{bottom:513.240000px;}\n.y128{bottom:513.430000px;}\n.y7dd{bottom:513.550000px;}\n.y5a4{bottom:513.670000px;}\n.y30d{bottom:514.150000px;}\n.y5d6{bottom:514.270000px;}\n.y2ae{bottom:514.440000px;}\n.y4cb{bottom:514.870000px;}\n.y827{bottom:515.110000px;}\n.y246{bottom:515.830000px;}\n.y213{bottom:515.950000px;}\n.y1ef{bottom:516.070000px;}\n.y298{bottom:516.190000px;}\n.y2e9{bottom:516.310000px;}\n.y5f4{bottom:516.550000px;}\n.y3ce{bottom:516.670000px;}\n.y35b{bottom:517.150000px;}\n.y8b4{bottom:517.630000px;}\n.y563{bottom:517.990000px;}\n.y98c{bottom:518.470000px;}\n.y32f{bottom:518.830000px;}\n.y856{bottom:519.310000px;}\n.y40e{bottom:519.430000px;}\n.y53{bottom:520.030000px;}\n.y79{bottom:520.150000px;}\n.y6e8{bottom:520.270000px;}\n.y976{bottom:520.390000px;}\n.y8f{bottom:520.630000px;}\n.y8e2{bottom:521.760000px;}\n.ye9{bottom:522.190000px;}\n.y25{bottom:522.310000px;}\n.yf6{bottom:522.670000px;}\n.y6c0{bottom:522.910000px;}\n.y4f0{bottom:523.150000px;}\n.y62d{bottom:523.270000px;}\n.y522{bottom:523.750000px;}\n.y7f5{bottom:523.870000px;}\n.y474{bottom:523.990000px;}\n.y546{bottom:524.830000px;}\n.y1c4{bottom:524.950000px;}\n.y5a3{bottom:525.430000px;}\n.y30c{bottom:526.030000px;}\n.yc6{bottom:526.150000px;}\n.y8a8{bottom:526.270000px;}\n.y4ca{bottom:526.630000px;}\n.y878{bottom:527.110000px;}\n.y3a3{bottom:527.590000px;}\n.y38f{bottom:527.710000px;}\n.y1ee{bottom:527.830000px;}\n.y297{bottom:527.950000px;}\n.y5f3{bottom:528.190000px;}\n.y3cd{bottom:528.430000px;}\n.y913{bottom:528.600000px;}\n.y9a2{bottom:530.470000px;}\n.y40d{bottom:531.310000px;}\n.y2c0{bottom:531.790000px;}\n.y166{bottom:531.910000px;}\n.y194{bottom:532.270000px;}\n.y855{bottom:532.390000px;}\n.yc{bottom:532.750000px;}\n.y701{bottom:533.950000px;}\n.y6bf{bottom:534.670000px;}\n.y7ba{bottom:534.910000px;}\n.y4ef{bottom:535.030000px;}\n.y684{bottom:535.270000px;}\n.y521{bottom:535.630000px;}\n.y2c5{bottom:535.870000px;}\n.y127{bottom:536.110000px;}\n.y584{bottom:536.350000px;}\n.y545{bottom:536.590000px;}\n.y79e{bottom:537.000000px;}\n.y7dc{bottom:537.070000px;}\n.y5a2{bottom:537.190000px;}\n.y78{bottom:537.550000px;}\n.y65b{bottom:537.910000px;}\n.y9f{bottom:538.030000px;}\n.y52{bottom:538.150000px;}\n.y826{bottom:538.390000px;}\n.y4c9{bottom:538.630000px;}\n.y877{bottom:538.870000px;}\n.y245{bottom:539.470000px;}\n.ye8{bottom:539.590000px;}\n.y228{bottom:539.710000px;}\n.y24{bottom:539.830000px;}\n.y5f2{bottom:539.950000px;}\n.yf5{bottom:540.190000px;}\n.y8b3{bottom:540.790000px;}\n.y98b{bottom:541.150000px;}\n.y32e{bottom:541.870000px;}\n.y975{bottom:542.470000px;}\n.y6e7{bottom:543.550000px;}\n.yb{bottom:544.270000px;}\n.y2bf{bottom:545.230000px;}\n.y165{bottom:545.710000px;}\n.y854{bottom:545.950000px;}\n.y745{bottom:546.000000px;}\n.y7cf{bottom:546.600000px;}\n.y8e6{bottom:547.030000px;}\n.y473{bottom:547.510000px;}\n.y1c3{bottom:547.990000px;}\n.y544{bottom:548.470000px;}\n.y30b{bottom:549.070000px;}\n.y3fd{bottom:549.190000px;}\n.y2c4{bottom:549.310000px;}\n.y8a7{bottom:549.430000px;}\n.yc5{bottom:549.790000px;}\n.y891{bottom:550.270000px;}\n.y8fa{bottom:550.750000px;}\n.y876{bottom:550.870000px;}\n.y961{bottom:551.110000px;}\n.y244{bottom:551.230000px;}\n.y212{bottom:551.350000px;}\n.y1ed{bottom:551.470000px;}\n.y2e8{bottom:551.590000px;}\n.y5f1{bottom:551.710000px;}\n.y35a{bottom:551.830000px;}\n.y429{bottom:552.240000px;}\n.y9a1{bottom:554.110000px;}\n.y105{bottom:554.950000px;}\n.y6e6{bottom:555.310000px;}\n.y51{bottom:555.550000px;}\n.y32d{bottom:555.910000px;}\n.y193{bottom:556.030000px;}\n.y23{bottom:557.230000px;}\n.y700{bottom:557.470000px;}\n.yf4{bottom:557.590000px;}\n.ye7{bottom:557.710000px;}\n.y62c{bottom:558.310000px;}\n.y6be{bottom:558.550000px;}\n.y4ee{bottom:558.670000px;}\n.y683{bottom:558.790000px;}\n.y445{bottom:559.150000px;}\n.y7f4{bottom:559.390000px;}\n.y583{bottom:559.630000px;}\n.y80f{bottom:559.750000px;}\n.y1c2{bottom:559.870000px;}\n.y7db{bottom:560.470000px;}\n.y30a{bottom:560.830000px;}\n.y5d5{bottom:560.950000px;}\n.y2c3{bottom:561.070000px;}\n.y613{bottom:561.120000px;}\n.y7b9{bottom:561.430000px;}\n.y825{bottom:562.030000px;}\n.y4c8{bottom:562.150000px;}\n.y5c6{bottom:562.630000px;}\n.y38e{bottom:562.750000px;}\n.y4af{bottom:562.990000px;}\n.y243{bottom:563.110000px;}\n.y211{bottom:563.230000px;}\n.y1ec{bottom:563.350000px;}\n.y2e7{bottom:563.470000px;}\n.y3cc{bottom:563.590000px;}\n.y359{bottom:563.830000px;}\n.y974{bottom:564.310000px;}\n.y8b2{bottom:564.430000px;}\n.y9a0{bottom:565.870000px;}\n.ya{bottom:567.310000px;}\n.y164{bottom:568.870000px;}\n.y126{bottom:569.230000px;}\n.y192{bottom:569.470000px;}\n.y4ed{bottom:570.430000px;}\n.y6bd{bottom:570.670000px;}\n.y472{bottom:570.790000px;}\n.y444{bottom:570.910000px;}\n.y7f3{bottom:571.150000px;}\n.y1c1{bottom:571.630000px;}\n.y5a1{bottom:572.110000px;}\n.y62b{bottom:572.230000px;}\n.y2bd{bottom:572.710000px;}\n.y3fa{bottom:572.830000px;}\n.y50{bottom:572.950000px;}\n.y7b8{bottom:573.190000px;}\n.y8e{bottom:573.550000px;}\n.y890{bottom:573.790000px;}\n.y5c5{bottom:574.390000px;}\n.y38d{bottom:574.510000px;}\n.y562{bottom:574.630000px;}\n.y756{bottom:574.750000px;}\n.y296{bottom:574.870000px;}\n.ye6{bottom:575.110000px;}\n.y22{bottom:575.230000px;}\n.y3cb{bottom:575.350000px;}\n.y358{bottom:575.590000px;}\n.yf3{bottom:575.710000px;}\n.y42d{bottom:577.870000px;}\n.y9{bottom:578.830000px;}\n.y32c{bottom:578.950000px;}\n.y6e5{bottom:579.070000px;}\n.y163{bottom:580.630000px;}\n.y125{bottom:581.110000px;}\n.y6ff{bottom:581.230000px;}\n.y682{bottom:582.070000px;}\n.y4ec{bottom:582.310000px;}\n.y7f2{bottom:582.790000px;}\n.y582{bottom:582.910000px;}\n.y443{bottom:583.030000px;}\n.y80e{bottom:583.270000px;}\n.y1c0{bottom:583.390000px;}\n.y5a0{bottom:583.870000px;}\n.y62a{bottom:583.990000px;}\n.y60e{bottom:584.160000px;}\n.y309{bottom:584.470000px;}\n.y5d4{bottom:584.590000px;}\n.y7b7{bottom:584.950000px;}\n.y735{bottom:585.190000px;}\n.y4c7{bottom:585.430000px;}\n.y88f{bottom:585.550000px;}\n.y973{bottom:585.790000px;}\n.y242{bottom:586.150000px;}\n.y227{bottom:586.270000px;}\n.y210{bottom:586.390000px;}\n.y1eb{bottom:586.510000px;}\n.y50c{bottom:586.750000px;}\n.y5f0{bottom:586.870000px;}\n.y3ca{bottom:586.990000px;}\n.y357{bottom:587.470000px;}\n.y8b1{bottom:587.950000px;}\n.y8{bottom:590.350000px;}\n.y77{bottom:590.470000px;}\n.y6e4{bottom:590.830000px;}\n.y4f{bottom:590.950000px;}\n.y21{bottom:592.630000px;}\n.ye5{bottom:593.110000px;}\n.y471{bottom:594.070000px;}\n.y581{bottom:594.670000px;}\n.y6bc{bottom:594.940000px;}\n.y1bf{bottom:595.300000px;}\n.y59f{bottom:595.900000px;}\n.y308{bottom:596.380000px;}\n.y376{bottom:596.500000px;}\n.y2c2{bottom:596.620000px;}\n.y824{bottom:596.980000px;}\n.y88e{bottom:597.460000px;}\n.y241{bottom:597.940000px;}\n.y24b{bottom:598.060000px;}\n.y48e{bottom:598.180000px;}\n.y295{bottom:598.300000px;}\n.y5ef{bottom:598.660000px;}\n.y3c9{bottom:598.780000px;}\n.y356{bottom:599.140000px;}\n.y98a{bottom:600.940000px;}\n.y8b0{bottom:601.420000px;}\n.y42b{bottom:601.540000px;}\n.y7{bottom:601.780000px;}\n.y71b{bottom:602.040000px;}\n.y32b{bottom:602.620000px;}\n.y162{bottom:604.420000px;}\n.y124{bottom:604.540000px;}\n.y681{bottom:605.260000px;}\n.y442{bottom:605.980000px;}\n.y191{bottom:606.580000px;}\n.y580{bottom:606.700000px;}\n.y1be{bottom:606.940000px;}\n.y80d{bottom:607.060000px;}\n.y79c{bottom:607.320000px;}\n.y6bb{bottom:607.420000px;}\n.y59e{bottom:607.660000px;}\n.y307{bottom:608.140000px;}\n.y470{bottom:608.260000px;}\n.y8d{bottom:608.380000px;}\n.y4e{bottom:608.500000px;}\n.y4c6{bottom:608.740000px;}\n.yb0{bottom:608.980000px;}\n.y88d{bottom:609.220000px;}\n.y543{bottom:609.340000px;}\n.y629{bottom:609.460000px;}\n.y20f{bottom:609.820000px;}\n.y1ea{bottom:609.940000px;}\n.y294{bottom:610.060000px;}\n.y20{bottom:610.180000px;}\n.y5ee{bottom:610.300000px;}\n.yf2{bottom:610.540000px;}\n.y103{bottom:610.660000px;}\n.y355{bottom:611.020000px;}\n.y875{bottom:611.740000px;}\n.y8f9{bottom:611.860000px;}\n.y99f{bottom:612.580000px;}\n.y8af{bottom:613.180000px;}\n.y6{bottom:613.300000px;}\n.y32a{bottom:614.380000px;}\n.y6e3{bottom:614.740000px;}\n.y161{bottom:616.180000px;}\n.y680{bottom:617.140000px;}\n.y441{bottom:617.620000px;}\n.y4eb{bottom:617.740000px;}\n.y123{bottom:617.980000px;}\n.y190{bottom:618.340000px;}\n.y1bd{bottom:618.940000px;}\n.y59d{bottom:619.420000px;}\n.y773{bottom:619.540000px;}\n.y6ba{bottom:619.660000px;}\n.y306{bottom:620.020000px;}\n.y3f6{bottom:620.140000px;}\n.y4c5{bottom:620.500000px;}\n.y542{bottom:621.100000px;}\n.y643{bottom:621.580000px;}\n.y240{bottom:621.700000px;}\n.y2e6{bottom:621.820000px;}\n.y5ed{bottom:622.060000px;}\n.y3c8{bottom:622.180000px;}\n.y354{bottom:622.780000px;}\n.y628{bottom:623.500000px;}\n.y99e{bottom:624.460000px;}\n.y989{bottom:624.580000px;}\n.y5{bottom:624.820000px;}\n.y874{bottom:625.060000px;}\n.y8f8{bottom:625.300000px;}\n.y4d{bottom:625.900000px;}\n.y347{bottom:626.040000px;}\n.y8c{bottom:626.500000px;}\n.y40c{bottom:627.580000px;}\n.y102{bottom:628.060000px;}\n.y1f{bottom:628.180000px;}\n.y8da{bottom:628.320000px;}\n.yf1{bottom:628.660000px;}\n.y67f{bottom:629.140000px;}\n.y4ea{bottom:629.620000px;}\n.y18f{bottom:630.100000px;}\n.y57f{bottom:630.220000px;}\n.y80c{bottom:630.580000px;}\n.y1bc{bottom:631.180000px;}\n.y7da{bottom:631.300000px;}\n.y122{bottom:631.420000px;}\n.y329{bottom:631.660000px;}\n.y305{bottom:631.780000px;}\n.y65a{bottom:631.900000px;}\n.y7f1{bottom:632.380000px;}\n.y4c4{bottom:632.500000px;}\n.y88c{bottom:632.860000px;}\n.y541{bottom:632.980000px;}\n.y4a2{bottom:633.220000px;}\n.y4ac{bottom:633.340000px;}\n.y20e{bottom:633.460000px;}\n.y1e9{bottom:633.580000px;}\n.y2e5{bottom:633.700000px;}\n.y5ec{bottom:633.820000px;}\n.y3c7{bottom:633.940000px;}\n.y353{bottom:634.660000px;}\n.y988{bottom:636.220000px;}\n.y99d{bottom:636.820000px;}\n.y8f7{bottom:636.940000px;}\n.y6e2{bottom:638.260000px;}\n.y160{bottom:639.340000px;}\n.y464{bottom:639.960000px;}\n.y67e{bottom:640.900000px;}\n.y57e{bottom:641.980000px;}\n.y80b{bottom:642.460000px;}\n.y59c{bottom:643.060000px;}\n.y1bb{bottom:643.180000px;}\n.y76{bottom:643.300000px;}\n.y328{bottom:643.420000px;}\n.y304{bottom:643.660000px;}\n.y3f3{bottom:643.780000px;}\n.y4c{bottom:643.900000px;}\n.y4c3{bottom:644.140000px;}\n.y34a{bottom:644.260000px;}\n.y4{bottom:644.620000px;}\n.y88b{bottom:644.740000px;}\n.y46f{bottom:645.100000px;}\n.y293{bottom:645.220000px;}\n.y440{bottom:645.340000px;}\n.y5eb{bottom:645.460000px;}\n.y1e{bottom:645.580000px;}\n.y3c6{bottom:645.700000px;}\n.yf0{bottom:646.060000px;}\n.y627{bottom:646.660000px;}\n.y873{bottom:648.100000px;}\n.y352{bottom:648.220000px;}\n.y8f6{bottom:648.820000px;}\n.y6e1{bottom:650.620000px;}\n.y15f{bottom:651.100000px;}\n.y67d{bottom:652.660000px;}\n.y18e{bottom:653.140000px;}\n.y57d{bottom:653.980000px;}\n.y60d{bottom:654.360000px;}\n.y7e9{bottom:654.480000px;}\n.y7b6{bottom:654.940000px;}\n.y79b{bottom:654.960000px;}\n.y121{bottom:655.180000px;}\n.y4c2{bottom:656.020000px;}\n.y540{bottom:656.140000px;}\n.y561{bottom:656.500000px;}\n.y20d{bottom:656.620000px;}\n.y1e8{bottom:656.740000px;}\n.y226{bottom:656.860000px;}\n.y292{bottom:656.980000px;}\n.y43f{bottom:657.100000px;}\n.y5ea{bottom:657.220000px;}\n.y3c5{bottom:657.460000px;}\n.y626{bottom:658.300000px;}\n.y46e{bottom:658.540000px;}\n.y987{bottom:660.460000px;}\n.y99c{bottom:660.580000px;}\n.y4b{bottom:661.300000px;}\n.y75{bottom:661.420000px;}\n.yaf{bottom:661.900000px;}\n.y6e0{bottom:662.500000px;}\n.y15e{bottom:662.860000px;}\n.y1d{bottom:662.980000px;}\n.y101{bottom:663.460000px;}\n.yef{bottom:664.060000px;}\n.y67c{bottom:664.420000px;}\n.y18d{bottom:665.020000px;}\n.y57c{bottom:665.740000px;}\n.y59b{bottom:666.100000px;}\n.y1ba{bottom:666.220000px;}\n.y770{bottom:666.340000px;}\n.y375{bottom:666.700000px;}\n.y303{bottom:666.820000px;}\n.y53f{bottom:667.780000px;}\n.y66d{bottom:668.260000px;}\n.y1e7{bottom:668.380000px;}\n.y7ea{bottom:668.500000px;}\n.y120{bottom:668.620000px;}\n.y7d9{bottom:668.740000px;}\n.y43e{bottom:668.860000px;}\n.y5e9{bottom:668.980000px;}\n.y3c4{bottom:669.100000px;}\n.y625{bottom:670.180000px;}\n.y351{bottom:671.380000px;}\n.y46d{bottom:671.980000px;}\n.y8f5{bottom:672.100000px;}\n.y986{bottom:672.340000px;}\n.y872{bottom:672.580000px;}\n.y6df{bottom:674.260000px;}\n.y15d{bottom:674.620000px;}\n.y90e{bottom:674.640000px;}\n.y726{bottom:675.340000px;}\n.y67b{bottom:676.300000px;}\n.y18c{bottom:676.900000px;}\n.y1b9{bottom:677.860000px;}\n.y80a{bottom:677.980000px;}\n.y609{bottom:678.000000px;}\n.y57b{bottom:678.100000px;}\n.y374{bottom:678.460000px;}\n.y302{bottom:678.580000px;}\n.y9e{bottom:678.700000px;}\n.y74{bottom:678.820000px;}\n.y4c1{bottom:679.060000px;}\n.y7f0{bottom:679.180000px;}\n.yae{bottom:679.300000px;}\n.y4a{bottom:679.420000px;}\n.y53e{bottom:679.660000px;}\n.y20c{bottom:680.140000px;}\n.y2b5{bottom:680.260000px;}\n.y1e6{bottom:680.380000px;}\n.y4ab{bottom:680.500000px;}\n.y43d{bottom:680.620000px;}\n.y100{bottom:680.860000px;}\n.y1c{bottom:680.980000px;}\n.y11f{bottom:682.060000px;}\n.y350{bottom:683.140000px;}\n.y46c{bottom:683.620000px;}\n.y871{bottom:686.020000px;}\n.y696{bottom:686.040000px;}\n.y6de{bottom:686.500000px;}\n.y15c{bottom:686.620000px;}\n.y45e{bottom:688.080000px;}\n.y18b{bottom:688.540000px;}\n.y1b8{bottom:689.740000px;}\n.y59a{bottom:689.860000px;}\n.y301{bottom:690.340000px;}\n.y327{bottom:690.460000px;}\n.y57a{bottom:690.580000px;}\n.y4c0{bottom:690.820000px;}\n.y7ef{bottom:690.940000px;}\n.y53d{bottom:691.420000px;}\n.y5c4{bottom:691.900000px;}\n.y20b{bottom:692.020000px;}\n.y291{bottom:692.140000px;}\n.y43c{bottom:692.260000px;}\n.y5e8{bottom:692.380000px;}\n.y3c3{bottom:692.620000px;}\n.y624{bottom:693.460000px;}\n.y34f{bottom:694.900000px;}\n.y8f4{bottom:695.380000px;}\n.y46b{bottom:695.500000px;}\n.y11e{bottom:695.620000px;}\n.y73{bottom:696.220000px;}\n.y3{bottom:696.460000px;}\n.y9d{bottom:696.700000px;}\n.y49{bottom:696.820000px;}\n.y15b{bottom:698.380000px;}\n.y1b{bottom:698.500000px;}\n.yff{bottom:698.980000px;}\n.y870{bottom:699.460000px;}\n.y18a{bottom:700.420000px;}\n.y911{bottom:701.380000px;}\n.y1b7{bottom:701.500000px;}\n.y599{bottom:701.620000px;}\n.y326{bottom:702.100000px;}\n.y373{bottom:702.220000px;}\n.y579{bottom:702.340000px;}\n.y4bf{bottom:702.700000px;}\n.y88a{bottom:703.180000px;}\n.y53c{bottom:703.300000px;}\n.y823{bottom:703.420000px;}\n.y1e5{bottom:703.780000px;}\n.y20a{bottom:703.900000px;}\n.y43b{bottom:704.020000px;}\n.y5d3{bottom:704.140000px;}\n.y3c2{bottom:704.260000px;}\n.y11d{bottom:707.260000px;}\n.y985{bottom:709.060000px;}\n.y15a{bottom:710.140000px;}\n.y6dd{bottom:710.620000px;}\n.y86f{bottom:711.100000px;}\n.y1b6{bottom:713.380000px;}\n.y325{bottom:713.980000px;}\n.y9c{bottom:714.100000px;}\n.y48{bottom:714.220000px;}\n.y7ee{bottom:714.460000px;}\n.y578{bottom:714.700000px;}\n.yad{bottom:714.820000px;}\n.y4be{bottom:714.940000px;}\n.y822{bottom:715.060000px;}\n.y290{bottom:715.540000px;}\n.y209{bottom:715.660000px;}\n.y43a{bottom:715.780000px;}\n.y5e7{bottom:715.900000px;}\n.y3c1{bottom:716.020000px;}\n.yfe{bottom:716.380000px;}\n.y1a{bottom:716.500000px;}\n.y623{bottom:716.740000px;}\n.y34e{bottom:718.060000px;}\n.y11c{bottom:719.020000px;}\n.y46a{bottom:719.260000px;}\n.y984{bottom:720.700000px;}\n.y722{bottom:722.020000px;}\n.y86e{bottom:722.980000px;}\n.y862{bottom:725.400000px;}\n.y189{bottom:725.740000px;}\n.y956{bottom:725.860000px;}\n.y7ed{bottom:726.340000px;}\n.y76b{bottom:726.940000px;}\n.y4bd{bottom:727.060000px;}\n.y755{bottom:727.180000px;}\n.y28f{bottom:727.300000px;}\n.y1e4{bottom:727.420000px;}\n.y1b5{bottom:727.540000px;}\n.y300{bottom:727.660000px;}\n.y3c0{bottom:727.780000px;}\n.y8f3{bottom:730.780000px;}\n.y72{bottom:731.620000px;}\n.y47{bottom:732.220000px;}\n.y983{bottom:732.580000px;}\n.y159{bottom:733.300000px;}\n.y6dc{bottom:733.660000px;}\n.y19{bottom:733.900000px;}\n.yfd{bottom:734.380000px;}\n.y598{bottom:736.540000px;}\n.y721{bottom:736.660000px;}\n.y2{bottom:736.900000px;}\n.y8a6{bottom:737.380000px;}\n.y188{bottom:737.620000px;}\n.y324{bottom:737.740000px;}\n.y821{bottom:738.700000px;}\n.y4bc{bottom:738.820000px;}\n.y28e{bottom:738.940000px;}\n.y208{bottom:739.180000px;}\n.y2ff{bottom:739.300000px;}\n.y3bf{bottom:739.420000px;}\n.y622{bottom:740.380000px;}\n.y11b{bottom:742.060000px;}\n.y158{bottom:745.060000px;}\n.y86d{bottom:746.620000px;}\n.y6db{bottom:747.820000px;}\n.y597{bottom:748.300000px;}\n.y608{bottom:748.920000px;}\n.y104{bottom:749.140000px;}\n.y9b{bottom:749.620000px;}\n.y46{bottom:749.740000px;}\n.y7ec{bottom:750.100000px;}\n.y4bb{bottom:750.580000px;}\n.y1b4{bottom:750.700000px;}\n.y48d{bottom:750.820000px;}\n.y1e3{bottom:750.940000px;}\n.y207{bottom:751.060000px;}\n.y2e4{bottom:751.180000px;}\n.y18{bottom:751.420000px;}\n.y621{bottom:752.980000px;}\n.y11a{bottom:753.820000px;}\n.y982{bottom:754.540000px;}\n.y157{bottom:756.820000px;}\n.y889{bottom:760.060000px;}\n.y86c{bottom:760.420000px;}\n.y659{bottom:760.540000px;}\n.y372{bottom:760.660000px;}\n.y187{bottom:760.780000px;}\n.y7eb{bottom:761.860000px;}\n.y1b3{bottom:762.340000px;}\n.y28d{bottom:762.460000px;}\n.y439{bottom:762.580000px;}\n.y5e6{bottom:762.700000px;}\n.y34d{bottom:765.120000px;}\n.y119{bottom:765.720000px;}\n.ye4{bottom:767.040000px;}\n.y45{bottom:767.160000px;}\n.yac{bottom:767.640000px;}\n.y156{bottom:768.600000px;}\n.y17{bottom:769.440000px;}\n.y6da{bottom:770.760000px;}\n.y888{bottom:771.840000px;}\n.y606{bottom:772.080000px;}\n.y8a5{bottom:772.440000px;}\n.y186{bottom:772.560000px;}\n.y4ba{bottom:773.640000px;}\n.y620{bottom:773.760000px;}\n.y71e{bottom:773.880000px;}\n.y1e2{bottom:774.120000px;}\n.y1b2{bottom:774.240000px;}\n.y438{bottom:774.360000px;}\n.y2e3{bottom:774.480000px;}\n.y863{bottom:774.600000px;}\n.y371{bottom:774.720000px;}\n.y981{bottom:776.520000px;}\n.y118{bottom:777.480000px;}\n.y887{bottom:783.840000px;}\n.y155{bottom:783.960000px;}\n.y185{bottom:784.320000px;}\n.y323{bottom:784.440000px;}\n.y71{bottom:784.560000px;}\n.yab{bottom:785.040000px;}\n.y44{bottom:785.160000px;}\n.y4b9{bottom:785.400000px;}\n.y577{bottom:785.880000px;}\n.y1b1{bottom:786.000000px;}\n.y437{bottom:786.120000px;}\n.y5e5{bottom:786.240000px;}\n.y16{bottom:786.960000px;}\n.y67a{bottom:787.080000px;}\n.y8d9{bottom:794.760000px;}\n.y154{bottom:797.160000px;}\n.y4b8{bottom:797.280000px;}\n.y2e2{bottom:797.760000px;}\n.y117{bottom:797.880000px;}\n.y34c{bottom:798.120000px;}\n.y15{bottom:799.080000px;}\n.y43{bottom:802.560000px;}\n.h14{height:3.251250px;}\n.h47{height:10.680000px;}\n.h2e{height:11.040000px;}\n.h1e{height:11.187656px;}\n.h21{height:11.785781px;}\n.h24{height:12.000000px;}\n.h29{height:12.730781px;}\n.h32{height:13.080000px;}\n.h3c{height:13.200000px;}\n.h27{height:13.411406px;}\n.ha{height:15.000000px;}\n.h2c{height:23.040000px;}\n.h1c{height:23.160000px;}\n.h18{height:24.441562px;}\n.h45{height:25.080000px;}\n.h3e{height:26.400000px;}\n.h3a{height:26.548594px;}\n.h13{height:27.662344px;}\n.h35{height:28.854844px;}\n.h7{height:30.480469px;}\n.h1d{height:32.019844px;}\n.h38{height:32.097000px;}\n.hf{height:32.106094px;}\n.hb{height:33.731719px;}\n.h17{height:33.813000px;}\n.hd{height:34.461600px;}\n.h49{height:34.920000px;}\n.hc{height:34.976719px;}\n.h1a{height:35.061000px;}\n.h3b{height:35.160000px;}\n.h2d{height:35.491875px;}\n.h2b{height:35.640000px;}\n.h46{height:37.389375px;}\n.h8{height:37.423828px;}\n.h6{height:38.769375px;}\n.h20{height:40.440000px;}\n.h10{height:40.640625px;}\n.h2{height:41.415703px;}\n.h11{height:42.140625px;}\n.h9{height:43.922812px;}\n.h5{height:45.906562px;}\n.h4b{height:47.280000px;}\n.h40{height:48.480000px;}\n.h44{height:48.960000px;}\n.h34{height:49.920000px;}\n.h2f{height:58.080000px;}\n.h30{height:58.200000px;}\n.h31{height:58.320000px;}\n.h33{height:59.640000px;}\n.h19{height:59.880000px;}\n.h3d{height:60.120000px;}\n.h12{height:60.960938px;}\n.he{height:62.051719px;}\n.h43{height:72.840000px;}\n.h1f{height:73.080000px;}\n.h28{height:73.320000px;}\n.h22{height:73.440000px;}\n.h4a{height:81.360000px;}\n.h41{height:81.960000px;}\n.h36{height:84.360000px;}\n.h4c{height:85.080000px;}\n.h26{height:91.920000px;}\n.h3{height:94.692656px;}\n.h2a{height:94.920000px;}\n.h1b{height:96.480000px;}\n.h4e{height:120.960000px;}\n.h4d{height:133.560000px;}\n.h48{height:141.960000px;}\n.h42{height:152.640000px;}\n.h4{height:168.562500px;}\n.h37{height:177.480000px;}\n.h23{height:181.920000px;}\n.h39{height:204.960000px;}\n.h16{height:259.440000px;}\n.h15{height:313.200000px;}\n.h25{height:330.120000px;}\n.h3f{height:357.000000px;}\n.h4f{height:442.200000px;}\n.h0{height:842.040000px;}\n.h1{height:842.500000px;}\n.w3{width:18.240000px;}\n.w13{width:21.120000px;}\n.w2b{width:21.720000px;}\n.w36{width:23.760000px;}\n.w14{width:24.000000px;}\n.w28{width:32.880000px;}\n.w16{width:37.440000px;}\n.w2d{width:37.680000px;}\n.w2a{width:37.920000px;}\n.w18{width:38.040000px;}\n.w24{width:41.520000px;}\n.w26{width:44.520000px;}\n.w2c{width:49.200000px;}\n.w10{width:49.560000px;}\n.w1f{width:54.000000px;}\n.w31{width:56.880000px;}\n.w8{width:58.920000px;}\n.w1c{width:61.200000px;}\n.wc{width:62.400000px;}\n.w1a{width:72.600000px;}\n.w20{width:75.000000px;}\n.wa{width:91.560000px;}\n.wb{width:103.680000px;}\n.w34{width:110.280000px;}\n.w21{width:111.600000px;}\n.w1d{width:113.760000px;}\n.w19{width:115.680000px;}\n.w6{width:116.880000px;}\n.w5{width:117.840000px;}\n.w11{width:126.000000px;}\n.w7{width:126.360000px;}\n.w17{width:147.600000px;}\n.w32{width:149.160000px;}\n.w2f{width:152.880000px;}\n.w27{width:167.160000px;}\n.w35{width:173.160000px;}\n.w2e{width:188.760000px;}\n.w1b{width:214.080000px;}\n.we{width:215.040000px;}\n.w22{width:264.480000px;}\n.w30{width:271.200000px;}\n.w1e{width:278.280000px;}\n.w15{width:297.840000px;}\n.wf{width:308.880000px;}\n.wd{width:321.960000px;}\n.w12{width:345.720000px;}\n.w25{width:360.240000px;}\n.w23{width:449.040000px;}\n.w9{width:465.360000px;}\n.w29{width:474.720000px;}\n.w33{width:507.480000px;}\n.w4{width:513.840000px;}\n.w2{width:594.959991px;}\n.w0{width:594.960000px;}\n.w1{width:595.500000px;}\n.x0{left:0.000000px;}\n.x24{left:1.680000px;}\n.xa{left:3.000000px;}\n.x45{left:34.104000px;}\n.x1{left:35.399991px;}\n.x2a{left:37.824000px;}\n.x23{left:41.040000px;}\n.x7{left:42.719991px;}\n.x42{left:44.399991px;}\n.x32{left:47.664000px;}\n.x29{left:50.999991px;}\n.x3b{left:56.423991px;}\n.xc{left:60.743991px;}\n.x25{left:63.383991px;}\n.x1e{left:65.303991px;}\n.x2d{left:67.223991px;}\n.xd{left:68.783991px;}\n.x2c{left:71.063991px;}\n.x44{left:73.103991px;}\n.x1d{left:74.783991px;}\n.x28{left:76.943991px;}\n.xe{left:78.623991px;}\n.x21{left:80.663991px;}\n.x1f{left:82.943991px;}\n.x3c{left:84.383991px;}\n.x10{left:86.663991px;}\n.x2e{left:88.320000px;}\n.xb{left:89.423991px;}\n.x41{left:90.503991px;}\n.x27{left:93.743991px;}\n.x34{left:95.423991px;}\n.x26{left:97.823991px;}\n.x31{left:99.023991px;}\n.x2f{left:104.179991px;}\n.x39{left:105.259991px;}\n.x20{left:113.419991px;}\n.x3{left:117.979991px;}\n.x35{left:127.939991px;}\n.x43{left:149.059991px;}\n.x33{left:152.880000px;}\n.x11{left:156.379991px;}\n.x49{left:172.609991px;}\n.x38{left:176.089991px;}\n.x36{left:178.250000px;}\n.x3a{left:181.609991px;}\n.x3e{left:195.650000px;}\n.x3f{left:199.970000px;}\n.xf{left:207.289991px;}\n.x46{left:219.409991px;}\n.x12{left:221.209991px;}\n.x4a{left:223.849991px;}\n.x4b{left:226.489991px;}\n.x6{left:227.689991px;}\n.x2{left:231.889991px;}\n.x18{left:251.569991px;}\n.x30{left:273.670000px;}\n.x13{left:286.969991px;}\n.x4{left:297.549991px;}\n.x2b{left:301.440000px;}\n.x19{left:334.269991px;}\n.x14{left:338.229991px;}\n.x1a{left:363.909991px;}\n.x1b{left:418.659991px;}\n.x17{left:430.539991px;}\n.x3d{left:465.460000px;}\n.x15{left:481.779991px;}\n.x16{left:491.859991px;}\n.x1c{left:494.379991px;}\n.x48{left:533.280000px;}\n.x40{left:535.320000px;}\n.x47{left:537.359991px;}\n.x9{left:538.920000px;}\n.x22{left:542.639991px;}\n.x8{left:548.279991px;}\n.x37{left:554.999991px;}\n.x5{left:580.439991px;}\n@media print{\n.v4{vertical-align:-67.200000pt;}\n.v1{vertical-align:-61.440000pt;}\n.v3{vertical-align:-8.960000pt;}\n.v0{vertical-align:0.000000pt;}\n.v2{vertical-align:37.760000pt;}\n.lsa{letter-spacing:-1.936000pt;}\n.ls80{letter-spacing:-1.813333pt;}\n.ls3e{letter-spacing:-1.701333pt;}\n.ls11{letter-spacing:-1.632000pt;}\n.ls9a{letter-spacing:-1.562667pt;}\n.ls79{letter-spacing:-1.536000pt;}\n.ls14{letter-spacing:-1.472000pt;}\n.ls33{letter-spacing:-1.418667pt;}\n.ls8d{letter-spacing:-1.408000pt;}\n.ls85{letter-spacing:-1.360000pt;}\n.ls61{letter-spacing:-1.344000pt;}\n.ls4f{letter-spacing:-1.338667pt;}\n.ls7b{letter-spacing:-1.328000pt;}\n.ls98{letter-spacing:-1.312000pt;}\n.ls7{letter-spacing:-1.296000pt;}\n.ls74{letter-spacing:-1.290667pt;}\n.ls2d{letter-spacing:-1.269333pt;}\n.ls99{letter-spacing:-1.194667pt;}\n.ls28{letter-spacing:-1.173333pt;}\n.ls15{letter-spacing:-1.168000pt;}\n.ls84{letter-spacing:-1.162667pt;}\n.lsa7{letter-spacing:-1.157333pt;}\n.ls3f{letter-spacing:-1.061333pt;}\n.ls19{letter-spacing:-1.050667pt;}\n.ls44{letter-spacing:-1.034667pt;}\n.ls78{letter-spacing:-1.024000pt;}\n.ls10{letter-spacing:-0.816000pt;}\n.ls93{letter-spacing:-0.725333pt;}\n.ls4e{letter-spacing:-0.698667pt;}\n.ls7f{letter-spacing:-0.629333pt;}\n.ls50{letter-spacing:-0.532267pt;}\n.lsd{letter-spacing:-0.528000pt;}\n.ls70{letter-spacing:-0.507733pt;}\n.ls6f{letter-spacing:-0.500800pt;}\n.ls5f{letter-spacing:-0.451733pt;}\n.ls49{letter-spacing:-0.432000pt;}\n.ls91{letter-spacing:-0.396267pt;}\n.ls45{letter-spacing:-0.395733pt;}\n.ls6d{letter-spacing:-0.323733pt;}\n.lsa6{letter-spacing:-0.283733pt;}\n.ls8c{letter-spacing:-0.282133pt;}\n.ls7e{letter-spacing:-0.266133pt;}\n.ls26{letter-spacing:-0.256533pt;}\n.ls4a{letter-spacing:-0.241067pt;}\n.ls81{letter-spacing:-0.231467pt;}\n.ls9{letter-spacing:-0.224000pt;}\n.ls2f{letter-spacing:-0.201067pt;}\n.ls3d{letter-spacing:-0.198400pt;}\n.ls8f{letter-spacing:-0.194667pt;}\n.ls72{letter-spacing:-0.188800pt;}\n.ls5a{letter-spacing:-0.154667pt;}\n.ls42{letter-spacing:-0.145067pt;}\n.ls39{letter-spacing:-0.140267pt;}\n.ls6c{letter-spacing:-0.135467pt;}\n.ls12{letter-spacing:-0.128000pt;}\n.ls8e{letter-spacing:-0.127467pt;}\n.ls9b{letter-spacing:-0.114667pt;}\n.ls20{letter-spacing:-0.107733pt;}\n.ls1a{letter-spacing:-0.100267pt;}\n.ls25{letter-spacing:-0.095467pt;}\n.ls95{letter-spacing:-0.086933pt;}\n.lsa9{letter-spacing:-0.084267pt;}\n.ls48{letter-spacing:-0.083200pt;}\n.ls47{letter-spacing:-0.077867pt;}\n.lsa4{letter-spacing:-0.077333pt;}\n.ls97{letter-spacing:-0.074133pt;}\n.ls27{letter-spacing:-0.066667pt;}\n.ls86{letter-spacing:-0.061867pt;}\n.ls7d{letter-spacing:-0.059200pt;}\n.ls29{letter-spacing:-0.057067pt;}\n.ls1d{letter-spacing:-0.047360pt;}\n.ls1c{letter-spacing:-0.046720pt;}\n.ls3c{letter-spacing:-0.042240pt;}\n.ls53{letter-spacing:-0.041600pt;}\n.ls34{letter-spacing:-0.039680pt;}\n.ls4d{letter-spacing:-0.039040pt;}\n.ls5c{letter-spacing:-0.035840pt;}\n.ls1b{letter-spacing:-0.034560pt;}\n.ls37{letter-spacing:-0.031360pt;}\n.ls87{letter-spacing:-0.023680pt;}\n.ls92{letter-spacing:-0.016640pt;}\n.ls5b{letter-spacing:-0.013440pt;}\n.ls73{letter-spacing:-0.009600pt;}\n.ls59{letter-spacing:-0.001280pt;}\n.ls1{letter-spacing:0.000000pt;}\n.ls24{letter-spacing:0.011520pt;}\n.ls76{letter-spacing:0.018560pt;}\n.ls36{letter-spacing:0.034560pt;}\n.ls8b{letter-spacing:0.056533pt;}\n.lsa0{letter-spacing:0.067200pt;}\n.ls17{letter-spacing:0.069333pt;}\n.ls18{letter-spacing:0.077867pt;}\n.ls69{letter-spacing:0.083200pt;}\n.ls21{letter-spacing:0.084267pt;}\n.ls6b{letter-spacing:0.084480pt;}\n.ls9d{letter-spacing:0.087040pt;}\n.ls9e{letter-spacing:0.102400pt;}\n.ls51{letter-spacing:0.107733pt;}\n.lsc{letter-spacing:0.112000pt;}\n.ls40{letter-spacing:0.112533pt;}\n.ls82{letter-spacing:0.115200pt;}\n.ls90{letter-spacing:0.117867pt;}\n.lsa3{letter-spacing:0.124800pt;}\n.ls6e{letter-spacing:0.132267pt;}\n.ls63{letter-spacing:0.138133pt;}\n.ls71{letter-spacing:0.139733pt;}\n.ls7c{letter-spacing:0.148267pt;}\n.ls2{letter-spacing:0.160000pt;}\n.ls57{letter-spacing:0.183467pt;}\n.ls65{letter-spacing:0.186133pt;}\n.ls55{letter-spacing:0.188160pt;}\n.ls32{letter-spacing:0.188267pt;}\n.ls5d{letter-spacing:0.198400pt;}\n.ls46{letter-spacing:0.208000pt;}\n.ls67{letter-spacing:0.211200pt;}\n.ls68{letter-spacing:0.244267pt;}\n.ls9c{letter-spacing:0.247040pt;}\n.lsa2{letter-spacing:0.278933pt;}\n.ls6a{letter-spacing:0.282240pt;}\n.ls54{letter-spacing:0.284160pt;}\n.ls8{letter-spacing:0.288000pt;}\n.ls56{letter-spacing:0.294400pt;}\n.lse{letter-spacing:0.304000pt;}\n.ls3a{letter-spacing:0.305067pt;}\n.ls23{letter-spacing:0.317333pt;}\n.ls13{letter-spacing:0.320000pt;}\n.ls64{letter-spacing:0.325333pt;}\n.ls58{letter-spacing:0.330133pt;}\n.ls35{letter-spacing:0.339200pt;}\n.lsa5{letter-spacing:0.356267pt;}\n.ls8a{letter-spacing:0.357867pt;}\n.ls22{letter-spacing:0.383467pt;}\n.ls66{letter-spacing:0.451200pt;}\n.ls75{letter-spacing:0.473600pt;}\n.ls31{letter-spacing:0.485333pt;}\n.ls43{letter-spacing:0.486400pt;}\n.ls62{letter-spacing:0.494933pt;}\n.ls94{letter-spacing:0.499733pt;}\n.ls3b{letter-spacing:0.512533pt;}\n.ls41{letter-spacing:0.552960pt;}\n.ls89{letter-spacing:0.554667pt;}\n.ls7a{letter-spacing:0.560000pt;}\n.ls77{letter-spacing:0.581333pt;}\n.ls1f{letter-spacing:0.592000pt;}\n.ls83{letter-spacing:0.597333pt;}\n.ls4b{letter-spacing:0.602667pt;}\n.ls1e{letter-spacing:0.608000pt;}\n.ls38{letter-spacing:0.629333pt;}\n.ls2c{letter-spacing:0.650667pt;}\n.ls60{letter-spacing:0.651520pt;}\n.ls9f{letter-spacing:0.698667pt;}\n.lsa1{letter-spacing:0.705707pt;}\n.ls2e{letter-spacing:0.709333pt;}\n.lsa8{letter-spacing:0.727040pt;}\n.ls2a{letter-spacing:0.746667pt;}\n.ls4c{letter-spacing:0.757333pt;}\n.ls2b{letter-spacing:0.826667pt;}\n.ls5e{letter-spacing:0.837333pt;}\n.ls30{letter-spacing:0.960000pt;}\n.ls16{letter-spacing:1.113600pt;}\n.ls3{letter-spacing:68.064000pt;}\n.ls4{letter-spacing:100.704000pt;}\n.lsf{letter-spacing:101.344000pt;}\n.ls5{letter-spacing:122.976000pt;}\n.ls6{letter-spacing:131.936000pt;}\n.lsb{letter-spacing:133.216000pt;}\n.ls0{letter-spacing:1384.853333pt;}\n.ls96{letter-spacing:2664.166400pt;}\n.ls88{letter-spacing:2692.326400pt;}\n.ls52{letter-spacing:2693.593600pt;}\n.ws47{word-spacing:-13.637013pt;}\n.ws46{word-spacing:-13.601280pt;}\n.ws49{word-spacing:-13.306880pt;}\n.ws25{word-spacing:-12.646400pt;}\n.ws4e{word-spacing:-12.523733pt;}\n.ws3e{word-spacing:-12.443733pt;}\n.ws21{word-spacing:-12.433067pt;}\n.ws23{word-spacing:-12.395733pt;}\n.ws5b{word-spacing:-12.337067pt;}\n.ws14{word-spacing:-12.294400pt;}\n.ws3d{word-spacing:-12.289067pt;}\n.ws6e{word-spacing:-12.283733pt;}\n.ws16{word-spacing:-12.278400pt;}\n.ws63{word-spacing:-12.267733pt;}\n.wsf{word-spacing:-12.256213pt;}\n.ws2e{word-spacing:-12.198933pt;}\n.ws7a{word-spacing:-12.186133pt;}\n.ws51{word-spacing:-12.181333pt;}\n.ws26{word-spacing:-12.171733pt;}\n.ws2{word-spacing:-12.160000pt;}\n.ws55{word-spacing:-12.137600pt;}\n.ws33{word-spacing:-12.117653pt;}\n.ws19{word-spacing:-12.069867pt;}\n.ws85{word-spacing:-12.042667pt;}\n.ws29{word-spacing:-12.025600pt;}\n.ws53{word-spacing:-12.011733pt;}\n.ws1a{word-spacing:-12.003733pt;}\n.ws2d{word-spacing:-11.991467pt;}\n.ws82{word-spacing:-11.965333pt;}\n.ws57{word-spacing:-11.930667pt;}\n.ws56{word-spacing:-11.897600pt;}\n.ws38{word-spacing:-11.894400pt;}\n.ws4d{word-spacing:-11.884800pt;}\n.ws35{word-spacing:-11.874667pt;}\n.ws54{word-spacing:-11.872533pt;}\n.ws45{word-spacing:-11.869867pt;}\n.ws67{word-spacing:-11.862827pt;}\n.ws62{word-spacing:-11.826133pt;}\n.ws52{word-spacing:-11.824533pt;}\n.ws5d{word-spacing:-11.818667pt;}\n.ws83{word-spacing:-11.811200pt;}\n.ws76{word-spacing:-11.804267pt;}\n.ws6d{word-spacing:-11.801600pt;}\n.ws43{word-spacing:-11.794133pt;}\n.ws58{word-spacing:-11.769600pt;}\n.ws18{word-spacing:-11.764267pt;}\n.ws15{word-spacing:-11.755733pt;}\n.ws81{word-spacing:-11.753600pt;}\n.ws2a{word-spacing:-11.720960pt;}\n.ws59{word-spacing:-11.714560pt;}\n.ws1d{word-spacing:-11.697920pt;}\n.ws10{word-spacing:-11.686400pt;}\n.ws48{word-spacing:-11.685120pt;}\n.ws4b{word-spacing:-11.672960pt;}\n.ws78{word-spacing:-11.669760pt;}\n.ws68{word-spacing:-11.655360pt;}\n.ws2b{word-spacing:-11.655040pt;}\n.ws11{word-spacing:-11.651840pt;}\n.ws4c{word-spacing:-11.650560pt;}\n.ws3f{word-spacing:-11.647360pt;}\n.ws28{word-spacing:-11.646720pt;}\n.ws44{word-spacing:-11.644800pt;}\n.ws2f{word-spacing:-11.644160pt;}\n.ws12{word-spacing:-11.639680pt;}\n.ws13{word-spacing:-11.639040pt;}\n.ws39{word-spacing:-11.636693pt;}\n.ws3a{word-spacing:-11.631360pt;}\n.ws20{word-spacing:-11.629333pt;}\n.ws71{word-spacing:-11.624533pt;}\n.ws1e{word-spacing:-11.619733pt;}\n.ws7c{word-spacing:-11.612267pt;}\n.ws84{word-spacing:-11.609067pt;}\n.ws88{word-spacing:-11.602133pt;}\n.ws80{word-spacing:-11.599893pt;}\n.ws7b{word-spacing:-11.599467pt;}\n.ws1b{word-spacing:-11.590933pt;}\n.ws17{word-spacing:-11.578667pt;}\n.ws74{word-spacing:-11.558933pt;}\n.ws5a{word-spacing:-11.550933pt;}\n.ws2c{word-spacing:-11.546133pt;}\n.ws34{word-spacing:-11.541333pt;}\n.ws4a{word-spacing:-11.531733pt;}\n.ws60{word-spacing:-11.497600pt;}\n.ws75{word-spacing:-11.491733pt;}\n.ws30{word-spacing:-11.488000pt;}\n.ws24{word-spacing:-11.485333pt;}\n.ws6c{word-spacing:-11.454933pt;}\n.ws3c{word-spacing:-11.445333pt;}\n.ws1c{word-spacing:-11.429867pt;}\n.ws69{word-spacing:-11.420267pt;}\n.ws72{word-spacing:-11.404267pt;}\n.ws86{word-spacing:-11.402667pt;}\n.ws5c{word-spacing:-11.362667pt;}\n.ws37{word-spacing:-11.290667pt;}\n.ws77{word-spacing:-11.290133pt;}\n.ws3b{word-spacing:-11.254400pt;}\n.ws4f{word-spacing:-11.234667pt;}\n.ws5e{word-spacing:-11.213760pt;}\n.ws5f{word-spacing:-11.178667pt;}\n.ws42{word-spacing:-11.154133pt;}\n.ws9{word-spacing:-11.152000pt;}\n.ws6a{word-spacing:-11.057067pt;}\n.ws40{word-spacing:-10.987733pt;}\n.ws79{word-spacing:-10.961067pt;}\n.ws4{word-spacing:-10.848000pt;}\n.ws7{word-spacing:-10.672000pt;}\n.ws64{word-spacing:-10.662400pt;}\n.ws32{word-spacing:-10.653227pt;}\n.ws36{word-spacing:-10.651733pt;}\n.ws1{word-spacing:-10.560000pt;}\n.ws87{word-spacing:-10.529067pt;}\n.ws6f{word-spacing:-10.523733pt;}\n.ws1f{word-spacing:-10.513067pt;}\n.ws7e{word-spacing:-10.491733pt;}\n.wsc{word-spacing:-10.432000pt;}\n.ws22{word-spacing:-10.417067pt;}\n.ws61{word-spacing:-10.395733pt;}\n.ws7d{word-spacing:-10.374400pt;}\n.ws66{word-spacing:-10.358400pt;}\n.ws41{word-spacing:-10.347733pt;}\n.ws50{word-spacing:-10.342400pt;}\n.ws5{word-spacing:-10.336000pt;}\n.ws70{word-spacing:-10.326400pt;}\n.ws73{word-spacing:-10.278400pt;}\n.ws27{word-spacing:-10.267733pt;}\n.ws65{word-spacing:-10.150400pt;}\n.ws7f{word-spacing:-10.123733pt;}\n.ws8{word-spacing:-10.032000pt;}\n.ws31{word-spacing:-10.013227pt;}\n.ws6b{word-spacing:-9.873067pt;}\n.wsa{word-spacing:-9.744000pt;}\n.ws3{word-spacing:-9.552000pt;}\n.wse{word-spacing:-9.392000pt;}\n.wsd{word-spacing:-9.088000pt;}\n.wsb{word-spacing:-8.928000pt;}\n.ws6{word-spacing:-8.912000pt;}\n.ws0{word-spacing:0.000000pt;}\n._7{margin-left:-12.097067pt;}\n._5{margin-left:-10.750933pt;}\n._1{margin-left:-9.025067pt;}\n._6{margin-left:-7.377067pt;}\n._4{margin-left:-6.025600pt;}\n._2{margin-left:-4.426667pt;}\n._0{margin-left:-2.146133pt;}\n._3{width:1.492267pt;}\n._b{width:2.950187pt;}\n._9{width:4.384213pt;}\n._f{width:5.974187pt;}\n._8{width:8.127360pt;}\n._e{width:9.880320pt;}\n._a{width:16.473600pt;}\n._1c{width:147.804373pt;}\n._17{width:172.292693pt;}\n._18{width:176.595413pt;}\n._15{width:189.662933pt;}\n._19{width:208.148693pt;}\n._1b{width:222.119253pt;}\n._16{width:260.503680pt;}\n._d{width:297.388587pt;}\n._1a{width:315.451093pt;}\n._c{width:426.542933pt;}\n._14{width:886.635733pt;}\n._10{width:964.297173pt;}\n._12{width:981.114880pt;}\n._13{width:1030.091520pt;}\n._11{width:1107.752960pt;}\n._1d{width:1126.876160pt;}\n.fs9{font-size:5.120000pt;}\n.fsc{font-size:18.560000pt;}\n.fsd{font-size:21.120000pt;}\n.fsb{font-size:37.120000pt;}\n.fsf{font-size:40.320000pt;}\n.fse{font-size:45.440000pt;}\n.fs5{font-size:48.000000pt;}\n.fs7{font-size:50.560000pt;}\n.fs0{font-size:53.120000pt;}\n.fsa{font-size:53.248000pt;}\n.fs4{font-size:58.880000pt;}\n.fs6{font-size:64.000000pt;}\n.fs8{font-size:96.000000pt;}\n.fs3{font-size:138.880000pt;}\n.fs1{font-size:149.120000pt;}\n.fs2{font-size:256.000000pt;}\n.y0{bottom:-0.666667pt;}\n.y1e1{bottom:-0.160080pt;}\n.y1{bottom:0.000000pt;}\n.y69d{bottom:2.693333pt;}\n.y7a7{bottom:2.786667pt;}\n.y614{bottom:2.813333pt;}\n.y79d{bottom:2.853333pt;}\n.y607{bottom:2.880000pt;}\n.y38c{bottom:2.946667pt;}\n.y42e{bottom:2.973333pt;}\n.y469{bottom:3.013333pt;}\n.y3be{bottom:3.040000pt;}\n.y28c{bottom:3.066667pt;}\n.y2fe{bottom:3.072000pt;}\n.y7a5{bottom:3.106667pt;}\n.y612{bottom:3.133333pt;}\n.y463{bottom:3.173333pt;}\n.y653{bottom:3.226667pt;}\n.y61a{bottom:3.293333pt;}\n.y8f1{bottom:3.453333pt;}\n.y72b{bottom:3.493333pt;}\n.y749{bottom:3.613333pt;}\n.y467{bottom:3.653333pt;}\n.y2f3{bottom:3.706667pt;}\n.y2fb{bottom:3.712000pt;}\n.y8ed{bottom:3.933333pt;}\n.y115{bottom:4.000000pt;}\n.y74e{bottom:4.093333pt;}\n.y3bc{bottom:4.186667pt;}\n.y912{bottom:4.293333pt;}\n.y7b5{bottom:4.346667pt;}\n.y40b{bottom:4.386667pt;}\n.y61f{bottom:4.706667pt;}\n.y2c1{bottom:5.213333pt;}\n.y34b{bottom:5.573333pt;}\n.y113{bottom:13.440000pt;}\n.y70{bottom:14.240000pt;}\n.y42{bottom:16.640000pt;}\n.y679{bottom:18.426667pt;}\n.y747{bottom:18.493333pt;}\n.y611{bottom:18.533333pt;}\n.y7d7{bottom:18.586667pt;}\n.y619{bottom:18.653333pt;}\n.y462{bottom:18.693333pt;}\n.ye3{bottom:18.720000pt;}\n.y78e{bottom:18.946667pt;}\n.y91d{bottom:19.133333pt;}\n.y468{bottom:19.173333pt;}\n.y2fd{bottom:19.226667pt;}\n.y8f0{bottom:19.293333pt;}\n.y8e0{bottom:19.333333pt;}\n.y924{bottom:19.613333pt;}\n.y6b9{bottom:19.706667pt;}\n.y8eb{bottom:19.933333pt;}\n.y6a1{bottom:19.973333pt;}\n.y2f2{bottom:20.026667pt;}\n.y466{bottom:20.133333pt;}\n.y2fa{bottom:20.186667pt;}\n.y3bb{bottom:20.506667pt;}\n.y28b{bottom:21.786667pt;}\n.y349{bottom:24.293333pt;}\n.y95f{bottom:33.986667pt;}\n.y651{bottom:34.106667pt;}\n.y321{bottom:34.146667pt;}\n.y42c{bottom:34.173333pt;}\n.y404{bottom:34.333333pt;}\n.y610{bottom:34.373333pt;}\n.y618{bottom:34.493333pt;}\n.y60c{bottom:34.533333pt;}\n.y72a{bottom:34.693333pt;}\n.y78d{bottom:34.786667pt;}\n.y8e1{bottom:34.853333pt;}\n.y746{bottom:34.973333pt;}\n.y7b4{bottom:35.066667pt;}\n.y782{bottom:35.266667pt;}\n.y74c{bottom:35.293333pt;}\n.y91c{bottom:35.453333pt;}\n.y69c{bottom:35.493333pt;}\n.y6b7{bottom:35.546667pt;}\n.y409{bottom:35.586667pt;}\n.y8ef{bottom:35.613333pt;}\n.y465{bottom:35.653333pt;}\n.y2f9{bottom:35.706667pt;}\n.y923{bottom:35.773333pt;}\n.y8ea{bottom:36.093333pt;}\n.y6a0{bottom:36.133333pt;}\n.y2f1{bottom:36.186667pt;}\n.y3ba{bottom:36.666667pt;}\n.y6f{bottom:37.440000pt;}\n.y8b{bottom:37.600000pt;}\n.ybd{bottom:38.240000pt;}\n.y935{bottom:38.560000pt;}\n.y348{bottom:39.973333pt;}\n.y41{bottom:40.640000pt;}\n.ye2{bottom:42.880000pt;}\n.y677{bottom:49.786667pt;}\n.y7a0{bottom:49.853333pt;}\n.y617{bottom:50.013333pt;}\n.y60f{bottom:50.053333pt;}\n.y60b{bottom:50.213333pt;}\n.y729{bottom:50.373333pt;}\n.y78c{bottom:50.466667pt;}\n.y7d2{bottom:50.653333pt;}\n.y7d6{bottom:50.746667pt;}\n.y7b3{bottom:50.786667pt;}\n.y780{bottom:50.813333pt;}\n.y6b6{bottom:51.226667pt;}\n.y8ee{bottom:51.453333pt;}\n.y91b{bottom:51.613333pt;}\n.y8df{bottom:51.813333pt;}\n.y922{bottom:51.933333pt;}\n.y69b{bottom:51.973333pt;}\n.y8e9{bottom:52.253333pt;}\n.y69f{bottom:52.293333pt;}\n.y2f0{bottom:52.346667pt;}\n.y3b9{bottom:52.986667pt;}\n.y934{bottom:57.120000pt;}\n.y289{bottom:57.946667pt;}\n.y2be{bottom:59.773333pt;}\n.y8a{bottom:60.800000pt;}\n.ybc{bottom:61.440000pt;}\n.y6e{bottom:61.600000pt;}\n.y40{bottom:63.840000pt;}\n.y66f{bottom:64.320000pt;}\n.y114{bottom:64.480000pt;}\n.y520{bottom:64.960000pt;}\n.y8e5{bottom:65.213333pt;}\n.y403{bottom:65.373333pt;}\n.y79f{bottom:65.853333pt;}\n.y60a{bottom:65.893333pt;}\n.y616{bottom:66.013333pt;}\n.ye1{bottom:66.080000pt;}\n.y728{bottom:66.213333pt;}\n.y61d{bottom:66.306667pt;}\n.y7d1{bottom:66.373333pt;}\n.y7b2{bottom:66.466667pt;}\n.y74b{bottom:66.813333pt;}\n.y6b5{bottom:67.066667pt;}\n.y734{bottom:67.200000pt;}\n.y91a{bottom:67.773333pt;}\n.y6aa{bottom:67.840000pt;}\n.y2f7{bottom:67.866667pt;}\n.y8e8{bottom:67.933333pt;}\n.y955{bottom:68.000000pt;}\n.y2ef{bottom:68.066667pt;}\n.y69a{bottom:68.293333pt;}\n.y69e{bottom:68.613333pt;}\n.y809{bottom:68.800000pt;}\n.y3b8{bottom:69.146667pt;}\n.y116{bottom:69.760000pt;}\n.y3a2{bottom:69.920000pt;}\n.y4b7{bottom:70.080000pt;}\n.y4a1{bottom:70.240000pt;}\n.y206{bottom:70.400000pt;}\n.y225{bottom:70.560000pt;}\n.y254{bottom:70.720000pt;}\n.y51a{bottom:70.880000pt;}\n.y66c{bottom:71.680000pt;}\n.y287{bottom:76.506667pt;}\n.y2bc{bottom:77.693333pt;}\n.y650{bottom:80.546667pt;}\n.y8e4{bottom:81.053333pt;}\n.y31f{bottom:81.186667pt;}\n.y95e{bottom:81.346667pt;}\n.y389{bottom:81.373333pt;}\n.y7a3{bottom:81.533333pt;}\n.y42a{bottom:81.573333pt;}\n.y77f{bottom:81.693333pt;}\n.y727{bottom:82.053333pt;}\n.y7d0{bottom:82.213333pt;}\n.y6b4{bottom:82.586667pt;}\n.y8de{bottom:83.013333pt;}\n.y408{bottom:83.426667pt;}\n.y461{bottom:83.493333pt;}\n.y921{bottom:83.933333pt;}\n.y919{bottom:84.093333pt;}\n.y910{bottom:84.133333pt;}\n.y699{bottom:84.773333pt;}\n.y6d{bottom:84.800000pt;}\n.y3b7{bottom:85.306667pt;}\n.y4e3{bottom:86.720000pt;}\n.y853{bottom:86.880000pt;}\n.y808{bottom:87.200000pt;}\n.y695{bottom:87.360000pt;}\n.y5c3{bottom:87.680000pt;}\n.y3f{bottom:87.840000pt;}\n.y963{bottom:88.320000pt;}\n.y594{bottom:88.800000pt;}\n.y2e1{bottom:88.960000pt;}\n.ye0{bottom:89.280000pt;}\n.y14{bottom:89.440000pt;}\n.y7d4{bottom:90.080000pt;}\n.y754{bottom:90.720000pt;}\n.y6d9{bottom:91.360000pt;}\n.y79a{bottom:91.520000pt;}\n.y83d{bottom:91.840000pt;}\n.y576{bottom:92.000000pt;}\n.y6a2{bottom:92.480000pt;}\n.y6a9{bottom:92.800000pt;}\n.y3a1{bottom:92.960000pt;}\n.y5e4{bottom:93.120000pt;}\n.y4aa{bottom:93.280000pt;}\n.y205{bottom:93.440000pt;}\n.y224{bottom:93.600000pt;}\n.y253{bottom:93.760000pt;}\n.y519{bottom:93.920000pt;}\n.y64e{bottom:94.400000pt;}\n.y53b{bottom:94.560000pt;}\n.y428{bottom:94.720000pt;}\n.y2bb{bottom:95.773333pt;}\n.y8e3{bottom:96.733333pt;}\n.y26e{bottom:97.120000pt;}\n.y7b1{bottom:97.346667pt;}\n.y77e{bottom:97.373333pt;}\n.y725{bottom:97.733333pt;}\n.y820{bottom:98.240000pt;}\n.y50b{bottom:98.560000pt;}\n.y460{bottom:99.173333pt;}\n.y920{bottom:100.133333pt;}\n.y8c6{bottom:100.160000pt;}\n.y918{bottom:100.293333pt;}\n.y698{bottom:101.093333pt;}\n.y3b6{bottom:101.626667pt;}\n.y90f{bottom:101.893333pt;}\n.y952{bottom:101.920000pt;}\n.y153{bottom:102.240000pt;}\n.y7ce{bottom:102.720000pt;}\n.y694{bottom:102.880000pt;}\n.y66b{bottom:103.040000pt;}\n.y807{bottom:103.360000pt;}\n.y4e2{bottom:103.520000pt;}\n.y7e8{bottom:103.680000pt;}\n.y48c{bottom:104.800000pt;}\n.y560{bottom:104.960000pt;}\n.y112{bottom:105.120000pt;}\n.y7d3{bottom:105.760000pt;}\n.y9b9{bottom:106.240000pt;}\n.y941{bottom:106.400000pt;}\n.y5d2{bottom:106.560000pt;}\n.y4a0{bottom:106.720000pt;}\n.y13{bottom:106.880000pt;}\n.y184{bottom:107.040000pt;}\n.y3ec{bottom:107.200000pt;}\n.y286{bottom:107.386667pt;}\n.y3bd{bottom:107.520000pt;}\n.y387{bottom:107.840000pt;}\n.y6c{bottom:108.000000pt;}\n.y3e{bottom:108.160000pt;}\n.y6a8{bottom:108.480000pt;}\n.y1b0{bottom:108.640000pt;}\n.y9a{bottom:108.800000pt;}\n.y204{bottom:108.960000pt;}\n.y23f{bottom:109.120000pt;}\n.y223{bottom:109.280000pt;}\n.y90d{bottom:109.440000pt;}\n.y407{bottom:109.826667pt;}\n.y64d{bottom:110.080000pt;}\n.y427{bottom:110.240000pt;}\n.y861{bottom:110.400000pt;}\n.y886{bottom:111.040000pt;}\n.y6fe{bottom:111.360000pt;}\n.y2ba{bottom:111.493333pt;}\n.y99b{bottom:112.000000pt;}\n.y401{bottom:112.253333pt;}\n.y436{bottom:112.480000pt;}\n.y26d{bottom:112.800000pt;}\n.y7b0{bottom:113.026667pt;}\n.y77c{bottom:113.213333pt;}\n.ydf{bottom:113.440000pt;}\n.y744{bottom:114.080000pt;}\n.y45f{bottom:114.880000pt;}\n.y8d8{bottom:115.360000pt;}\n.y1e0{bottom:115.520000pt;}\n.y8c5{bottom:116.480000pt;}\n.y2f5{bottom:116.666667pt;}\n.y917{bottom:116.773333pt;}\n.y71a{bottom:116.800000pt;}\n.y697{bottom:116.960000pt;}\n.y2ad{bottom:117.280000pt;}\n.y768{bottom:117.600000pt;}\n.y3b5{bottom:117.786667pt;}\n.y605{bottom:118.240000pt;}\n.y5c2{bottom:118.720000pt;}\n.y806{bottom:118.880000pt;}\n.y933{bottom:119.360000pt;}\n.y2e0{bottom:119.520000pt;}\n.y948{bottom:120.032000pt;}\n.y593{bottom:120.352000pt;}\n.y152{bottom:120.672000pt;}\n.y31d{bottom:120.992000pt;}\n.y7d5{bottom:121.120000pt;}\n.y753{bottom:121.472000pt;}\n.y6d8{bottom:122.432000pt;}\n.y3eb{bottom:122.912000pt;}\n.y285{bottom:123.066667pt;}\n.y83c{bottom:123.232000pt;}\n.y386{bottom:123.552000pt;}\n.y575{bottom:123.712000pt;}\n.y730{bottom:124.192000pt;}\n.y4b6{bottom:124.352000pt;}\n.y3a0{bottom:124.512000pt;}\n.y5e3{bottom:124.672000pt;}\n.y4a9{bottom:124.832000pt;}\n.y183{bottom:124.992000pt;}\n.y222{bottom:125.152000pt;}\n.y252{bottom:125.312000pt;}\n.y64c{bottom:125.792000pt;}\n.y426{bottom:126.112000pt;}\n.y2fc{bottom:126.720000pt;}\n.y675{bottom:126.752000pt;}\n.y2f4{bottom:126.880000pt;}\n.y6fd{bottom:127.072000pt;}\n.y2b9{bottom:127.333333pt;}\n.y400{bottom:128.253333pt;}\n.y86b{bottom:128.352000pt;}\n.y111{bottom:128.512000pt;}\n.y724{bottom:128.613333pt;}\n.y7ae{bottom:128.706667pt;}\n.y370{bottom:129.152000pt;}\n.y50a{bottom:129.632000pt;}\n.y6b1{bottom:130.106667pt;}\n.y8d7{bottom:131.072000pt;}\n.yaa{bottom:131.232000pt;}\n.y89{bottom:131.392000pt;}\n.y3d{bottom:131.552000pt;}\n.ybb{bottom:132.032000pt;}\n.y6b{bottom:132.192000pt;}\n.y719{bottom:132.512000pt;}\n.y8a4{bottom:132.672000pt;}\n.y2ac{bottom:132.992000pt;}\n.y91f{bottom:133.253333pt;}\n.y767{bottom:133.312000pt;}\n.y916{bottom:133.413333pt;}\n.y951{bottom:133.466667pt;}\n.y852{bottom:133.626667pt;}\n.y3b4{bottom:133.946667pt;}\n.y4e1{bottom:134.266667pt;}\n.y66a{bottom:134.426667pt;}\n.y9b2{bottom:134.586667pt;}\n.y805{bottom:134.746667pt;}\n.y932{bottom:135.066667pt;}\n.y55f{bottom:135.706667pt;}\n.y48b{bottom:136.346667pt;}\n.yde{bottom:136.666667pt;}\n.y940{bottom:137.146667pt;}\n.y5d1{bottom:137.306667pt;}\n.y49f{bottom:137.466667pt;}\n.y5e1{bottom:137.626667pt;}\n.y12{bottom:137.946667pt;}\n.y151{bottom:138.426667pt;}\n.y283{bottom:138.746667pt;}\n.y78a{bottom:138.906667pt;}\n.y642{bottom:139.386667pt;}\n.y385{bottom:139.546667pt;}\n.y7d8{bottom:139.706667pt;}\n.y72f{bottom:139.866667pt;}\n.y658{bottom:140.186667pt;}\n.y1af{bottom:140.346667pt;}\n.y900{bottom:140.506667pt;}\n.y9b8{bottom:140.666667pt;}\n.y90c{bottom:140.986667pt;}\n.y99a{bottom:141.306667pt;}\n.y64b{bottom:141.466667pt;}\n.y425{bottom:141.786667pt;}\n.y6fc{bottom:142.746667pt;}\n.y182{bottom:142.906667pt;}\n.y2b8{bottom:143.013333pt;}\n.y435{bottom:143.226667pt;}\n.y3ff{bottom:143.773333pt;}\n.y26c{bottom:144.186667pt;}\n.y723{bottom:144.293333pt;}\n.y7ad{bottom:144.386667pt;}\n.y77a{bottom:144.413333pt;}\n.y36f{bottom:145.146667pt;}\n.y6b0{bottom:145.626667pt;}\n.y8dd{bottom:146.053333pt;}\n.y53a{bottom:146.906667pt;}\n.y1df{bottom:147.066667pt;}\n.y971{bottom:147.226667pt;}\n.y81f{bottom:147.866667pt;}\n.y718{bottom:148.346667pt;}\n.y8c4{bottom:148.666667pt;}\n.y2ab{bottom:148.826667pt;}\n.y950{bottom:148.986667pt;}\n.y766{bottom:149.146667pt;}\n.y851{bottom:149.306667pt;}\n.y91e{bottom:149.573333pt;}\n.y693{bottom:149.786667pt;}\n.y915{bottom:149.893333pt;}\n.y4e0{bottom:149.946667pt;}\n.y45d{bottom:150.106667pt;}\n.y3b3{bottom:150.266667pt;}\n.y931{bottom:150.906667pt;}\n.y2df{bottom:151.066667pt;}\n.y592{bottom:151.226667pt;}\n.y55e{bottom:151.386667pt;}\n.y8a3{bottom:151.546667pt;}\n.y31c{bottom:152.026667pt;}\n.y5c1{bottom:152.186667pt;}\n.y110{bottom:152.506667pt;}\n.y93f{bottom:152.826667pt;}\n.y5d0{bottom:152.986667pt;}\n.y49e{bottom:153.146667pt;}\n.y5e0{bottom:153.306667pt;}\n.y6d7{bottom:153.466667pt;}\n.y83b{bottom:154.106667pt;}\n.y282{bottom:154.426667pt;}\n.y789{bottom:154.586667pt;}\n.y3c{bottom:154.746667pt;}\n.y574{bottom:154.906667pt;}\n.y346{bottom:155.066667pt;}\n.ya9{bottom:155.226667pt;}\n.y6a{bottom:155.386667pt;}\n.y221{bottom:155.546667pt;}\n.y23e{bottom:155.706667pt;}\n.y203{bottom:155.866667pt;}\n.yfc{bottom:156.026667pt;}\n.y251{bottom:156.186667pt;}\n.y3ae{bottom:156.320000pt;}\n.y518{bottom:156.506667pt;}\n.y150{bottom:156.986667pt;}\n.y26f{bottom:157.120000pt;}\n.y64a{bottom:157.466667pt;}\n.y424{bottom:157.786667pt;}\n.y9b7{bottom:157.946667pt;}\n.y181{bottom:158.426667pt;}\n.y2b7{bottom:158.853333pt;}\n.y6fb{bottom:159.226667pt;}\n.y434{bottom:159.546667pt;}\n.y3fe{bottom:159.613333pt;}\n.ydd{bottom:159.866667pt;}\n.y7ab{bottom:160.386667pt;}\n.y509{bottom:161.146667pt;}\n.y6af{bottom:161.466667pt;}\n.y8dc{bottom:161.733333pt;}\n.y8d6{bottom:162.586667pt;}\n.y1de{bottom:162.746667pt;}\n.y539{bottom:162.906667pt;}\n.y81e{bottom:163.546667pt;}\n.y2aa{bottom:164.506667pt;}\n.y765{bottom:164.826667pt;}\n.y7cd{bottom:164.986667pt;}\n.y850{bottom:165.146667pt;}\n.y669{bottom:165.306667pt;}\n.y604{bottom:165.626667pt;}\n.y45c{bottom:165.786667pt;}\n.y7e7{bottom:165.946667pt;}\n.y9b1{bottom:166.106667pt;}\n.y914{bottom:166.213333pt;}\n.y3b2{bottom:166.426667pt;}\n.y930{bottom:166.586667pt;}\n.y55d{bottom:167.386667pt;}\n.y48a{bottom:167.866667pt;}\n.y5c0{bottom:168.026667pt;}\n.y596{bottom:168.186667pt;}\n.y93e{bottom:168.666667pt;}\n.y5cf{bottom:168.826667pt;}\n.y11{bottom:168.986667pt;}\n.y26b{bottom:169.146667pt;}\n.y8a2{bottom:169.626667pt;}\n.y83a{bottom:169.786667pt;}\n.y799{bottom:170.106667pt;}\n.y3ea{bottom:170.266667pt;}\n.y788{bottom:170.426667pt;}\n.y954{bottom:170.746667pt;}\n.y39f{bottom:170.906667pt;}\n.y384{bottom:171.066667pt;}\n.y66e{bottom:171.226667pt;}\n.y23d{bottom:171.386667pt;}\n.y4e9{bottom:171.546667pt;}\n.y8ff{bottom:171.706667pt;}\n.y1ae{bottom:172.506667pt;}\n.y649{bottom:173.146667pt;}\n.y180{bottom:174.266667pt;}\n.y14f{bottom:174.746667pt;}\n.y9b6{bottom:175.066667pt;}\n.y10f{bottom:175.706667pt;}\n.y779{bottom:175.933333pt;}\n.y7aa{bottom:176.066667pt;}\n.y743{bottom:176.186667pt;}\n.y36e{bottom:176.346667pt;}\n.y86a{bottom:176.506667pt;}\n.y6ae{bottom:177.186667pt;}\n.y8db{bottom:177.413333pt;}\n.y972{bottom:178.266667pt;}\n.y433{bottom:178.426667pt;}\n.y88{bottom:178.586667pt;}\n.y3b{bottom:178.746667pt;}\n.y99{bottom:179.226667pt;}\n.y69{bottom:179.386667pt;}\n.y2a9{bottom:180.346667pt;}\n.y692{bottom:180.666667pt;}\n.y84f{bottom:180.826667pt;}\n.y668{bottom:180.986667pt;}\n.y6ab{bottom:181.120000pt;}\n.y4df{bottom:181.306667pt;}\n.y603{bottom:181.466667pt;}\n.y7e6{bottom:181.626667pt;}\n.y45b{bottom:182.266667pt;}\n.y92f{bottom:182.426667pt;}\n.y2de{bottom:182.586667pt;}\n.y94f{bottom:182.906667pt;}\n.y31b{bottom:183.066667pt;}\n.y5bf{bottom:183.706667pt;}\n.ydc{bottom:183.866667pt;}\n.y93d{bottom:184.346667pt;}\n.y5ce{bottom:184.506667pt;}\n.y26a{bottom:184.826667pt;}\n.y6d6{bottom:184.986667pt;}\n.y839{bottom:185.466667pt;}\n.y345{bottom:185.626667pt;}\n.y280{bottom:185.946667pt;}\n.y787{bottom:186.106667pt;}\n.y6a7{bottom:186.586667pt;}\n.y39e{bottom:186.746667pt;}\n.y5e2{bottom:186.906667pt;}\n.y202{bottom:187.066667pt;}\n.y23c{bottom:187.226667pt;}\n.y250{bottom:187.386667pt;}\n.y517{bottom:187.546667pt;}\n.y423{bottom:188.986667pt;}\n.y752{bottom:189.306667pt;}\n.y17f{bottom:189.946667pt;}\n.y3fc{bottom:190.333333pt;}\n.y6fa{bottom:190.586667pt;}\n.y674{bottom:191.226667pt;}\n.y7a9{bottom:191.746667pt;}\n.y778{bottom:191.773333pt;}\n.y742{bottom:191.866667pt;}\n.y9b5{bottom:192.346667pt;}\n.y508{bottom:192.666667pt;}\n.y6ad{bottom:193.026667pt;}\n.y14e{bottom:193.626667pt;}\n.y1dd{bottom:194.266667pt;}\n.y538{bottom:194.426667pt;}\n.y869{bottom:194.586667pt;}\n.y2f8{bottom:194.746667pt;}\n.y717{bottom:194.906667pt;}\n.y8c3{bottom:195.066667pt;}\n.y720{bottom:195.173333pt;}\n.y9b0{bottom:195.386667pt;}\n.y2a8{bottom:196.026667pt;}\n.y489{bottom:196.186667pt;}\n.y7cc{bottom:196.506667pt;}\n.y84e{bottom:196.666667pt;}\n.y28a{bottom:196.986667pt;}\n.y4de{bottom:197.306667pt;}\n.y667{bottom:197.466667pt;}\n.y2dd{bottom:198.426667pt;}\n.y55c{bottom:198.746667pt;}\n.y10e{bottom:198.906667pt;}\n.y3b1{bottom:198.946667pt;}\n.y5be{bottom:199.546667pt;}\n.y68{bottom:199.706667pt;}\n.y10{bottom:200.186667pt;}\n.y49d{bottom:200.346667pt;}\n.y269{bottom:200.506667pt;}\n.y5cd{bottom:200.666667pt;}\n.y5df{bottom:200.826667pt;}\n.y838{bottom:201.146667pt;}\n.y344{bottom:201.306667pt;}\n.y641{bottom:201.626667pt;}\n.y87{bottom:201.786667pt;}\n.y31a{bottom:201.946667pt;}\n.y3a{bottom:202.106667pt;}\n.y8fe{bottom:202.266667pt;}\n.y39d{bottom:202.426667pt;}\n.y98{bottom:202.586667pt;}\n.y432{bottom:202.746667pt;}\n.y23b{bottom:202.906667pt;}\n.y90b{bottom:203.066667pt;}\n.y1ad{bottom:203.226667pt;}\n.y860{bottom:203.866667pt;}\n.y2b6{bottom:205.253333pt;}\n.y17e{bottom:205.946667pt;}\n.y3fb{bottom:206.013333pt;}\n.y8a1{bottom:206.106667pt;}\n.y648{bottom:206.906667pt;}\n.ydb{bottom:207.066667pt;}\n.y751{bottom:207.226667pt;}\n.y741{bottom:208.026667pt;}\n.y8d5{bottom:209.466667pt;}\n.y1dc{bottom:210.106667pt;}\n.y716{bottom:210.586667pt;}\n.y8c2{bottom:211.066667pt;}\n.y764{bottom:211.386667pt;}\n.y14d{bottom:211.546667pt;}\n.y2a7{bottom:211.866667pt;}\n.y691{bottom:212.186667pt;}\n.y602{bottom:212.346667pt;}\n.y71f{bottom:212.613333pt;}\n.y4dd{bottom:212.986667pt;}\n.y45a{bottom:213.146667pt;}\n.y591{bottom:213.626667pt;}\n.y947{bottom:213.946667pt;}\n.y2dc{bottom:214.266667pt;}\n.y55b{bottom:214.586667pt;}\n.y3b0{bottom:215.106667pt;}\n.y268{bottom:216.026667pt;}\n.y6b8{bottom:216.666667pt;}\n.y980{bottom:216.826667pt;}\n.yf{bottom:216.986667pt;}\n.y343{bottom:217.146667pt;}\n.y640{bottom:217.306667pt;}\n.y383{bottom:217.466667pt;}\n.y786{bottom:217.626667pt;}\n.y6a6{bottom:218.106667pt;}\n.y39c{bottom:218.266667pt;}\n.y431{bottom:218.426667pt;}\n.y201{bottom:218.586667pt;}\n.y23a{bottom:218.746667pt;}\n.y1ac{bottom:218.906667pt;}\n.y516{bottom:219.066667pt;}\n.y422{bottom:220.506667pt;}\n.y6f9{bottom:222.266667pt;}\n.y67{bottom:222.906667pt;}\n.y36d{bottom:223.386667pt;}\n.y507{bottom:223.706667pt;}\n.y6ac{bottom:223.906667pt;}\n.y8a0{bottom:224.186667pt;}\n.y537{bottom:225.146667pt;}\n.y39{bottom:225.306667pt;}\n.y2f6{bottom:225.466667pt;}\n.y97{bottom:225.786667pt;}\n.y86{bottom:225.946667pt;}\n.y715{bottom:226.266667pt;}\n.yfb{bottom:226.586667pt;}\n.y8c1{bottom:226.746667pt;}\n.y6d5{bottom:227.066667pt;}\n.y488{bottom:227.226667pt;}\n.y84d{bottom:227.386667pt;}\n.y7cb{bottom:228.026667pt;}\n.y7e5{bottom:228.506667pt;}\n.y459{bottom:228.826667pt;}\n.y666{bottom:229.146667pt;}\n.y573{bottom:230.106667pt;}\n.y14c{bottom:230.266667pt;}\n.yda{bottom:230.426667pt;}\n.y3af{bottom:230.626667pt;}\n.y5bd{bottom:230.906667pt;}\n.y601{bottom:231.066667pt;}\n.y5cc{bottom:231.226667pt;}\n.y49c{bottom:231.546667pt;}\n.y267{bottom:231.706667pt;}\n.y798{bottom:232.346667pt;}\n.y3e9{bottom:232.506667pt;}\n.y27d{bottom:232.546667pt;}\n.y342{bottom:232.826667pt;}\n.y319{bottom:232.986667pt;}\n.y95c{bottom:233.146667pt;}\n.y382{bottom:233.306667pt;}\n.ye{bottom:233.466667pt;}\n.y288{bottom:233.626667pt;}\n.y8fd{bottom:233.786667pt;}\n.y39b{bottom:233.946667pt;}\n.y430{bottom:234.106667pt;}\n.y220{bottom:234.266667pt;}\n.y239{bottom:234.426667pt;}\n.y24f{bottom:234.586667pt;}\n.y1ab{bottom:234.746667pt;}\n.y676{bottom:235.200000pt;}\n.y85f{bottom:235.226667pt;}\n.y2b4{bottom:236.773333pt;}\n.y17d{bottom:237.146667pt;}\n.y3f9{bottom:237.533333pt;}\n.y647{bottom:237.786667pt;}\n.y6f8{bottom:237.946667pt;}\n.y777{bottom:238.333333pt;}\n.y740{bottom:239.066667pt;}\n.y89f{bottom:239.866667pt;}\n.y1db{bottom:240.506667pt;}\n.y536{bottom:240.826667pt;}\n.y81d{bottom:241.466667pt;}\n.y714{bottom:242.266667pt;}\n.y8c0{bottom:242.426667pt;}\n.y2a6{bottom:242.586667pt;}\n.y6d4{bottom:242.746667pt;}\n.y763{bottom:242.906667pt;}\n.y84c{bottom:243.066667pt;}\n.y690{bottom:243.866667pt;}\n.y458{bottom:244.506667pt;}\n.y2db{bottom:244.666667pt;}\n.y71d{bottom:244.960000pt;}\n.y946{bottom:244.986667pt;}\n.y10d{bottom:246.106667pt;}\n.y93c{bottom:246.586667pt;}\n.y5cb{bottom:246.746667pt;}\n.y572{bottom:246.906667pt;}\n.y66{bottom:247.066667pt;}\n.y266{bottom:247.386667pt;}\n.y3e8{bottom:248.186667pt;}\n.y27c{bottom:248.226667pt;}\n.y14b{bottom:248.346667pt;}\n.y97f{bottom:248.506667pt;}\n.y341{bottom:248.666667pt;}\n.y381{bottom:248.826667pt;}\n.ya8{bottom:248.986667pt;}\n.y85{bottom:249.146667pt;}\n.y38{bottom:249.306667pt;}\n.y72e{bottom:249.466667pt;}\n.y200{bottom:249.626667pt;}\n.yba{bottom:249.786667pt;}\n.y96{bottom:249.946667pt;}\n.y4a8{bottom:250.106667pt;}\n.y21f{bottom:250.266667pt;}\n.y24e{bottom:250.426667pt;}\n.y515{bottom:250.586667pt;}\n.y318{bottom:250.906667pt;}\n.y36c{bottom:251.066667pt;}\n.y95b{bottom:251.226667pt;}\n.y421{bottom:251.386667pt;}\n.y646{bottom:253.306667pt;}\n.y1aa{bottom:253.466667pt;}\n.y3f8{bottom:253.573333pt;}\n.y6f7{bottom:253.626667pt;}\n.y776{bottom:254.013333pt;}\n.yd9{bottom:254.426667pt;}\n.y970{bottom:254.586667pt;}\n.y506{bottom:254.906667pt;}\n.y89e{bottom:255.866667pt;}\n.y535{bottom:256.666667pt;}\n.y81c{bottom:257.146667pt;}\n.y9af{bottom:257.466667pt;}\n.y868{bottom:257.626667pt;}\n.y713{bottom:257.946667pt;}\n.y8bf{bottom:258.106667pt;}\n.y762{bottom:258.586667pt;}\n.y487{bottom:258.746667pt;}\n.y84b{bottom:258.906667pt;}\n.yd{bottom:259.066667pt;}\n.y4dc{bottom:259.546667pt;}\n.y804{bottom:260.026667pt;}\n.y457{bottom:260.186667pt;}\n.y590{bottom:260.346667pt;}\n.y71c{bottom:260.480000pt;}\n.y55a{bottom:260.986667pt;}\n.y5bc{bottom:261.466667pt;}\n.y600{bottom:261.626667pt;}\n.y49b{bottom:262.426667pt;}\n.y571{bottom:262.586667pt;}\n.y5de{bottom:262.746667pt;}\n.y265{bottom:262.906667pt;}\n.y797{bottom:263.866667pt;}\n.y3e7{bottom:264.026667pt;}\n.y27b{bottom:264.066667pt;}\n.y999{bottom:264.186667pt;}\n.y340{bottom:264.346667pt;}\n.y63f{bottom:264.666667pt;}\n.y380{bottom:264.826667pt;}\n.y4b5{bottom:264.986667pt;}\n.y72d{bottom:265.146667pt;}\n.y8fc{bottom:265.306667pt;}\n.y14a{bottom:266.266667pt;}\n.y317{bottom:266.426667pt;}\n.y36b{bottom:266.746667pt;}\n.y95a{bottom:266.906667pt;}\n.y420{bottom:267.066667pt;}\n.y17c{bottom:267.866667pt;}\n.y2b3{bottom:268.293333pt;}\n.y3f7{bottom:269.093333pt;}\n.y1a9{bottom:269.146667pt;}\n.y678{bottom:269.306667pt;}\n.y10c{bottom:269.466667pt;}\n.y775{bottom:269.893333pt;}\n.y65{bottom:270.266667pt;}\n.y96f{bottom:270.466667pt;}\n.y73f{bottom:270.586667pt;}\n.y1da{bottom:272.026667pt;}\n.y8d4{bottom:272.186667pt;}\n.y534{bottom:272.346667pt;}\n.y37{bottom:272.506667pt;}\n.y750{bottom:272.826667pt;}\n.ya7{bottom:272.986667pt;}\n.y84{bottom:273.146667pt;}\n.y712{bottom:273.626667pt;}\n.y8be{bottom:273.946667pt;}\n.y2a5{bottom:274.106667pt;}\n.y6d3{bottom:274.426667pt;}\n.y84a{bottom:274.586667pt;}\n.y68f{bottom:274.746667pt;}\n.y4db{bottom:275.226667pt;}\n.y803{bottom:275.546667pt;}\n.y92e{bottom:275.866667pt;}\n.y2da{bottom:276.186667pt;}\n.y58f{bottom:276.346667pt;}\n.y94e{bottom:276.506667pt;}\n.y5bb{bottom:277.306667pt;}\n.yd8{bottom:277.626667pt;}\n.y570{bottom:278.106667pt;}\n.y49a{bottom:278.266667pt;}\n.y5dd{bottom:278.426667pt;}\n.y264{bottom:278.586667pt;}\n.y837{bottom:279.066667pt;}\n.y6b3{bottom:279.706667pt;}\n.y27a{bottom:279.746667pt;}\n.y998{bottom:279.866667pt;}\n.y785{bottom:280.026667pt;}\n.y33f{bottom:280.186667pt;}\n.y63e{bottom:280.346667pt;}\n.y39a{bottom:280.506667pt;}\n.y1ff{bottom:280.666667pt;}\n.y24a{bottom:280.826667pt;}\n.y238{bottom:280.986667pt;}\n.y21e{bottom:281.146667pt;}\n.y51f{bottom:281.306667pt;}\n.y514{bottom:281.626667pt;}\n.y3e6{bottom:281.946667pt;}\n.y316{bottom:282.106667pt;}\n.y41f{bottom:282.906667pt;}\n.y17b{bottom:283.546667pt;}\n.y2b2{bottom:284.133333pt;}\n.y645{bottom:284.826667pt;}\n.y3f5{bottom:284.933333pt;}\n.y1a8{bottom:284.986667pt;}\n.y6f6{bottom:285.306667pt;}\n.y149{bottom:285.466667pt;}\n.y774{bottom:285.573333pt;}\n.y505{bottom:286.426667pt;}\n.y8d3{bottom:287.866667pt;}\n.y533{bottom:288.186667pt;}\n.y2ee{bottom:288.800000pt;}\n.y9ae{bottom:288.986667pt;}\n.y711{bottom:289.306667pt;}\n.y81b{bottom:289.466667pt;}\n.y6d2{bottom:289.946667pt;}\n.y486{bottom:290.426667pt;}\n.y7ca{bottom:290.586667pt;}\n.y4da{bottom:291.066667pt;}\n.y802{bottom:291.386667pt;}\n.y92d{bottom:291.866667pt;}\n.y58e{bottom:292.026667pt;}\n.y2a4{bottom:292.186667pt;}\n.y559{bottom:292.506667pt;}\n.y5ba{bottom:293.146667pt;}\n.y64{bottom:293.466667pt;}\n.y56f{bottom:293.786667pt;}\n.y93b{bottom:293.946667pt;}\n.y5ca{bottom:294.106667pt;}\n.y263{bottom:294.266667pt;}\n.y8ae{bottom:294.426667pt;}\n.y836{bottom:294.746667pt;}\n.y9b4{bottom:295.386667pt;}\n.y279{bottom:295.586667pt;}\n.y784{bottom:295.706667pt;}\n.y284{bottom:295.866667pt;}\n.y953{bottom:296.026667pt;}\n.y399{bottom:296.186667pt;}\n.y95{bottom:296.346667pt;}\n.y36{bottom:296.506667pt;}\n.y237{bottom:296.666667pt;}\n.y4e8{bottom:296.826667pt;}\n.y90a{bottom:296.986667pt;}\n.yb9{bottom:297.146667pt;}\n.y796{bottom:297.306667pt;}\n.y3e5{bottom:297.626667pt;}\n.y85e{bottom:297.786667pt;}\n.y36a{bottom:297.946667pt;}\n.y64f{bottom:298.080000pt;}\n.y41e{bottom:298.586667pt;}\n.y2b1{bottom:299.813333pt;}\n.y3f4{bottom:300.613333pt;}\n.yd7{bottom:300.986667pt;}\n.y772{bottom:301.413333pt;}\n.y73e{bottom:302.106667pt;}\n.y96e{bottom:302.146667pt;}\n.y1d9{bottom:303.706667pt;}\n.y148{bottom:303.866667pt;}\n.y673{bottom:304.186667pt;}\n.y8bd{bottom:304.666667pt;}\n.y710{bottom:305.146667pt;}\n.y81a{bottom:305.466667pt;}\n.y68e{bottom:306.106667pt;}\n.y4d9{bottom:306.586667pt;}\n.y456{bottom:306.746667pt;}\n.y867{bottom:306.906667pt;}\n.y801{bottom:307.066667pt;}\n.y945{bottom:307.386667pt;}\n.y92c{bottom:307.546667pt;}\n.y2d9{bottom:307.706667pt;}\n.y7a8{bottom:307.840000pt;}\n.y58d{bottom:307.866667pt;}\n.y558{bottom:308.186667pt;}\n.y5b9{bottom:308.826667pt;}\n.y56e{bottom:309.466667pt;}\n.y93a{bottom:309.626667pt;}\n.y262{bottom:309.786667pt;}\n.y499{bottom:309.946667pt;}\n.y8ad{bottom:310.106667pt;}\n.y17a{bottom:310.746667pt;}\n.y31e{bottom:311.040000pt;}\n.y6b2{bottom:311.226667pt;}\n.y278{bottom:311.266667pt;}\n.y33e{bottom:311.706667pt;}\n.y6a5{bottom:311.866667pt;}\n.y398{bottom:312.026667pt;}\n.y1fe{bottom:312.186667pt;}\n.y21d{bottom:312.346667pt;}\n.y236{bottom:312.506667pt;}\n.y4e7{bottom:312.666667pt;}\n.y795{bottom:312.986667pt;}\n.y369{bottom:313.466667pt;}\n.y3e4{bottom:313.626667pt;}\n.y959{bottom:314.266667pt;}\n.y41d{bottom:314.426667pt;}\n.y2b0{bottom:315.653333pt;}\n.y1a7{bottom:315.866667pt;}\n.y6f5{bottom:316.026667pt;}\n.y3f2{bottom:316.453333pt;}\n.y10b{bottom:316.666667pt;}\n.y83{bottom:316.826667pt;}\n.y771{bottom:317.093333pt;}\n.y63{bottom:317.466667pt;}\n.y504{bottom:317.946667pt;}\n.y8d2{bottom:319.226667pt;}\n.y1d8{bottom:319.386667pt;}\n.ya6{bottom:319.546667pt;}\n.y35{bottom:319.866667pt;}\n.yb8{bottom:320.346667pt;}\n.y94{bottom:320.506667pt;}\n.y761{bottom:320.826667pt;}\n.y819{bottom:321.146667pt;}\n.y485{bottom:321.306667pt;}\n.y6d1{bottom:321.466667pt;}\n.y7c9{bottom:321.626667pt;}\n.y665{bottom:321.786667pt;}\n.y849{bottom:321.946667pt;}\n.y455{bottom:322.426667pt;}\n.y4d8{bottom:322.586667pt;}\n.y800{bottom:323.066667pt;}\n.y2d8{bottom:323.386667pt;}\n.y2a3{bottom:323.546667pt;}\n.y557{bottom:324.186667pt;}\n.y5b8{bottom:324.666667pt;}\n.yd6{bottom:324.986667pt;}\n.y56d{bottom:325.146667pt;}\n.y261{bottom:325.466667pt;}\n.y498{bottom:325.626667pt;}\n.y5c9{bottom:325.786667pt;}\n.y179{bottom:326.426667pt;}\n.y997{bottom:326.586667pt;}\n.y63d{bottom:326.906667pt;}\n.y276{bottom:327.106667pt;}\n.y281{bottom:327.386667pt;}\n.y943{bottom:327.546667pt;}\n.y37f{bottom:327.706667pt;}\n.y4b4{bottom:327.866667pt;}\n.y4a7{bottom:328.026667pt;}\n.y235{bottom:328.186667pt;}\n.y513{bottom:328.346667pt;}\n.y794{bottom:328.506667pt;}\n.y33d{bottom:329.146667pt;}\n.y3e3{bottom:329.306667pt;}\n.y97e{bottom:329.466667pt;}\n.y885{bottom:330.106667pt;}\n.y2af{bottom:331.173333pt;}\n.y1a6{bottom:331.546667pt;}\n.y652{bottom:332.186667pt;}\n.y73d{bottom:332.986667pt;}\n.y9ad{bottom:333.146667pt;}\n.y503{bottom:333.626667pt;}\n.y8d1{bottom:335.066667pt;}\n.y1d7{bottom:335.226667pt;}\n.y70f{bottom:335.866667pt;}\n.y147{bottom:336.026667pt;}\n.y8bc{bottom:336.506667pt;}\n.y760{bottom:336.666667pt;}\n.y818{bottom:336.826667pt;}\n.y484{bottom:336.986667pt;}\n.y7c8{bottom:337.306667pt;}\n.y68d{bottom:337.786667pt;}\n.y4d7{bottom:338.266667pt;}\n.y454{bottom:338.426667pt;}\n.y944{bottom:338.906667pt;}\n.y2d7{bottom:339.226667pt;}\n.y58c{bottom:339.386667pt;}\n.y556{bottom:339.866667pt;}\n.y5b7{bottom:340.346667pt;}\n.y78b{bottom:340.640000pt;}\n.y62{bottom:340.666667pt;}\n.y82{bottom:340.826667pt;}\n.y260{bottom:341.146667pt;}\n.y497{bottom:341.306667pt;}\n.y5c8{bottom:341.466667pt;}\n.y835{bottom:342.106667pt;}\n.y95d{bottom:342.560000pt;}\n.y63c{bottom:342.586667pt;}\n.y34{bottom:343.066667pt;}\n.y6a4{bottom:343.386667pt;}\n.ya5{bottom:343.546667pt;}\n.y93{bottom:343.706667pt;}\n.y21c{bottom:343.866667pt;}\n.y234{bottom:344.026667pt;}\n.y512{bottom:344.186667pt;}\n.y33c{bottom:344.706667pt;}\n.y368{bottom:344.866667pt;}\n.y3e2{bottom:345.026667pt;}\n.y322{bottom:345.186667pt;}\n.y996{bottom:345.346667pt;}\n.y884{bottom:345.826667pt;}\n.y1a5{bottom:347.266667pt;}\n.y6f4{bottom:347.586667pt;}\n.yd5{bottom:348.226667pt;}\n.y73c{bottom:348.706667pt;}\n.y9ac{bottom:349.186667pt;}\n.y502{bottom:349.506667pt;}\n.y532{bottom:350.786667pt;}\n.y1d6{bottom:350.946667pt;}\n.y70e{bottom:351.586667pt;}\n.y75f{bottom:352.386667pt;}\n.y6d0{bottom:352.546667pt;}\n.y483{bottom:352.706667pt;}\n.y7c7{bottom:353.186667pt;}\n.y7e4{bottom:353.346667pt;}\n.y68c{bottom:353.506667pt;}\n.y453{bottom:354.146667pt;}\n.y664{bottom:354.306667pt;}\n.y8bb{bottom:354.466667pt;}\n.y2a2{bottom:354.626667pt;}\n.y274{bottom:355.586667pt;}\n.y178{bottom:355.906667pt;}\n.y56c{bottom:356.066667pt;}\n.y5b6{bottom:356.226667pt;}\n.y866{bottom:356.546667pt;}\n.y8ac{bottom:356.706667pt;}\n.y25f{bottom:356.866667pt;}\n.y939{bottom:357.026667pt;}\n.y496{bottom:357.186667pt;}\n.y5dc{bottom:357.346667pt;}\n.y63b{bottom:358.626667pt;}\n.y672{bottom:358.786667pt;}\n.y27f{bottom:358.946667pt;}\n.y942{bottom:359.106667pt;}\n.y397{bottom:359.266667pt;}\n.y4b3{bottom:359.426667pt;}\n.y21b{bottom:359.586667pt;}\n.y233{bottom:359.746667pt;}\n.y657{bottom:359.906667pt;}\n.y909{bottom:360.066667pt;}\n.y97d{bottom:360.226667pt;}\n.y33b{bottom:360.386667pt;}\n.y3e1{bottom:360.706667pt;}\n.y41c{bottom:360.866667pt;}\n.y883{bottom:361.506667pt;}\n.y1a4{bottom:362.946667pt;}\n.y6f3{bottom:363.266667pt;}\n.y76f{bottom:363.813333pt;}\n.y61{bottom:364.066667pt;}\n.y73b{bottom:364.546667pt;}\n.y9ab{bottom:364.866667pt;}\n.y89d{bottom:365.186667pt;}\n.y8d0{bottom:365.826667pt;}\n.y1d5{bottom:366.786667pt;}\n.ya4{bottom:366.946667pt;}\n.y33{bottom:367.106667pt;}\n.y70d{bottom:367.426667pt;}\n.yb7{bottom:367.586667pt;}\n.y92{bottom:367.746667pt;}\n.y75e{bottom:368.226667pt;}\n.y482{bottom:368.386667pt;}\n.y7c6{bottom:368.866667pt;}\n.y7e3{bottom:369.026667pt;}\n.y68b{bottom:369.186667pt;}\n.y92b{bottom:369.666667pt;}\n.y2d6{bottom:369.826667pt;}\n.y94d{bottom:370.146667pt;}\n.y273{bottom:371.266667pt;}\n.yd4{bottom:371.426667pt;}\n.y406{bottom:371.680000pt;}\n.y865{bottom:372.226667pt;}\n.y25e{bottom:372.386667pt;}\n.y8ba{bottom:372.546667pt;}\n.y834{bottom:373.346667pt;}\n.y2ed{bottom:373.826667pt;}\n.y177{bottom:373.986667pt;}\n.y5ff{bottom:374.146667pt;}\n.y63a{bottom:374.306667pt;}\n.y671{bottom:374.466667pt;}\n.y72c{bottom:374.786667pt;}\n.y6a3{bottom:374.946667pt;}\n.y396{bottom:375.106667pt;}\n.y1fd{bottom:375.266667pt;}\n.y21a{bottom:375.426667pt;}\n.y232{bottom:375.586667pt;}\n.y511{bottom:375.746667pt;}\n.y320{bottom:375.906667pt;}\n.y367{bottom:376.066667pt;}\n.y960{bottom:376.546667pt;}\n.y41b{bottom:376.866667pt;}\n.y882{bottom:377.346667pt;}\n.y1a3{bottom:378.786667pt;}\n.y6f2{bottom:378.946667pt;}\n.y73a{bottom:380.066667pt;}\n.y501{bottom:380.226667pt;}\n.y9aa{bottom:380.546667pt;}\n.y3f1{bottom:380.773333pt;}\n.y89c{bottom:381.026667pt;}\n.y8cf{bottom:381.506667pt;}\n.y531{bottom:381.666667pt;}\n.y96d{bottom:382.146667pt;}\n.y76e{bottom:382.213333pt;}\n.y70c{bottom:383.106667pt;}\n.y146{bottom:383.266667pt;}\n.y6cf{bottom:383.586667pt;}\n.y848{bottom:384.226667pt;}\n.y481{bottom:384.386667pt;}\n.y7c5{bottom:384.706667pt;}\n.y4d6{bottom:384.866667pt;}\n.y7ff{bottom:385.026667pt;}\n.y7e2{bottom:385.186667pt;}\n.y92a{bottom:385.346667pt;}\n.y2a1{bottom:385.666667pt;}\n.y555{bottom:386.306667pt;}\n.y5b5{bottom:386.946667pt;}\n.y271{bottom:387.106667pt;}\n.y81{bottom:387.266667pt;}\n.y56b{bottom:387.586667pt;}\n.y938{bottom:387.746667pt;}\n.y495{bottom:387.906667pt;}\n.y60{bottom:388.066667pt;}\n.y2ec{bottom:388.386667pt;}\n.y27e{bottom:389.666667pt;}\n.y639{bottom:389.986667pt;}\n.ya3{bottom:390.146667pt;}\n.y9b3{bottom:390.306667pt;}\n.y32{bottom:390.466667pt;}\n.yfa{bottom:390.786667pt;}\n.yb6{bottom:390.946667pt;}\n.y793{bottom:391.106667pt;}\n.y908{bottom:391.586667pt;}\n.y97c{bottom:391.746667pt;}\n.y3e0{bottom:391.906667pt;}\n.y176{bottom:392.066667pt;}\n.y85d{bottom:392.226667pt;}\n.y41a{bottom:392.546667pt;}\n.y995{bottom:393.826667pt;}\n.y1a2{bottom:394.466667pt;}\n.yd3{bottom:395.426667pt;}\n.y500{bottom:396.066667pt;}\n.y89b{bottom:396.706667pt;}\n.y3f0{bottom:396.773333pt;}\n.y8ce{bottom:397.346667pt;}\n.y1d4{bottom:397.506667pt;}\n.y96c{bottom:397.826667pt;}\n.y644{bottom:397.986667pt;}\n.y145{bottom:398.946667pt;}\n.y6ce{bottom:399.426667pt;}\n.y480{bottom:399.906667pt;}\n.y68a{bottom:400.066667pt;}\n.y4d5{bottom:400.546667pt;}\n.y452{bottom:400.706667pt;}\n.y2d5{bottom:401.346667pt;}\n.y94c{bottom:401.666667pt;}\n.y554{bottom:401.986667pt;}\n.y5b4{bottom:402.626667pt;}\n.y270{bottom:402.786667pt;}\n.y937{bottom:403.426667pt;}\n.y494{bottom:403.586667pt;}\n.y25d{bottom:403.746667pt;}\n.y833{bottom:404.386667pt;}\n.y3ad{bottom:404.546667pt;}\n.y5fe{bottom:405.186667pt;}\n.y638{bottom:405.666667pt;}\n.y395{bottom:405.826667pt;}\n.y249{bottom:405.986667pt;}\n.y4e6{bottom:406.146667pt;}\n.y1fc{bottom:406.306667pt;}\n.y2eb{bottom:406.466667pt;}\n.y510{bottom:406.786667pt;}\n.y40a{bottom:407.266667pt;}\n.y97b{bottom:407.426667pt;}\n.y366{bottom:407.586667pt;}\n.y37e{bottom:408.066667pt;}\n.y419{bottom:408.226667pt;}\n.y881{bottom:409.026667pt;}\n.y175{bottom:409.986667pt;}\n.y1a1{bottom:410.306667pt;}\n.y5f{bottom:411.266667pt;}\n.y4ff{bottom:411.906667pt;}\n.y994{bottom:412.066667pt;}\n.y3ef{bottom:412.453333pt;}\n.y89a{bottom:412.546667pt;}\n.y76d{bottom:413.093333pt;}\n.y1d3{bottom:413.186667pt;}\n.y530{bottom:413.506667pt;}\n.y31{bottom:413.666667pt;}\n.ya2{bottom:414.146667pt;}\n.y144{bottom:414.626667pt;}\n.y6cd{bottom:415.426667pt;}\n.y7c4{bottom:415.586667pt;}\n.y47f{bottom:415.746667pt;}\n.y847{bottom:415.906667pt;}\n.y7e1{bottom:416.226667pt;}\n.y451{bottom:416.386667pt;}\n.y663{bottom:416.706667pt;}\n.y2a0{bottom:417.186667pt;}\n.y553{bottom:417.986667pt;}\n.y5b3{bottom:418.466667pt;}\n.yd2{bottom:418.786667pt;}\n.y25c{bottom:419.266667pt;}\n.y3ac{bottom:419.426667pt;}\n.y493{bottom:419.586667pt;}\n.y315{bottom:419.746667pt;}\n.y733{bottom:421.346667pt;}\n.y394{bottom:421.506667pt;}\n.y4b2{bottom:421.666667pt;}\n.y1fb{bottom:421.826667pt;}\n.y231{bottom:421.986667pt;}\n.y656{bottom:422.146667pt;}\n.y907{bottom:422.306667pt;}\n.y792{bottom:422.466667pt;}\n.y3df{bottom:423.106667pt;}\n.y85c{bottom:423.426667pt;}\n.y418{bottom:423.906667pt;}\n.y174{bottom:425.506667pt;}\n.y33a{bottom:425.666667pt;}\n.y739{bottom:426.786667pt;}\n.y880{bottom:426.946667pt;}\n.y4fe{bottom:427.426667pt;}\n.y993{bottom:427.746667pt;}\n.y3ee{bottom:428.293333pt;}\n.y76c{bottom:428.773333pt;}\n.y1d2{bottom:429.026667pt;}\n.y96b{bottom:429.346667pt;}\n.y70b{bottom:429.826667pt;}\n.y6cc{bottom:430.946667pt;}\n.y75d{bottom:431.106667pt;}\n.y7c3{bottom:431.266667pt;}\n.y52f{bottom:431.426667pt;}\n.y450{bottom:432.066667pt;}\n.y7fe{bottom:432.386667pt;}\n.y2d4{bottom:433.026667pt;}\n.y94b{bottom:433.186667pt;}\n.y817{bottom:433.666667pt;}\n.y5b2{bottom:434.146667pt;}\n.y80{bottom:434.466667pt;}\n.y10a{bottom:434.626667pt;}\n.y25b{bottom:434.946667pt;}\n.y5e{bottom:435.266667pt;}\n.y91{bottom:435.426667pt;}\n.y832{bottom:435.906667pt;}\n.y7af{bottom:436.546667pt;}\n.y56a{bottom:437.186667pt;}\n.ya1{bottom:437.346667pt;}\n.yee{bottom:437.506667pt;}\n.y30{bottom:437.666667pt;}\n.y230{bottom:437.826667pt;}\n.y655{bottom:437.986667pt;}\n.yb5{bottom:438.146667pt;}\n.y143{bottom:438.626667pt;}\n.y3de{bottom:438.786667pt;}\n.y37d{bottom:438.946667pt;}\n.y417{bottom:439.746667pt;}\n.y9a9{bottom:440.706667pt;}\n.y173{bottom:441.186667pt;}\n.y1a0{bottom:441.346667pt;}\n.y339{bottom:441.506667pt;}\n.y6f1{bottom:442.146667pt;}\n.y87f{bottom:442.626667pt;}\n.yd1{bottom:442.786667pt;}\n.y958{bottom:442.946667pt;}\n.y4fd{bottom:443.266667pt;}\n.y992{bottom:443.426667pt;}\n.y8cd{bottom:444.546667pt;}\n.y1d1{bottom:444.706667pt;}\n.y70a{bottom:445.506667pt;}\n.y6cb{bottom:446.786667pt;}\n.y52e{bottom:446.946667pt;}\n.y689{bottom:447.106667pt;}\n.y846{bottom:447.266667pt;}\n.y47e{bottom:447.426667pt;}\n.y44f{bottom:447.746667pt;}\n.y662{bottom:447.906667pt;}\n.y4d4{bottom:448.066667pt;}\n.y58b{bottom:448.546667pt;}\n.y552{bottom:449.186667pt;}\n.y816{bottom:449.506667pt;}\n.y5b1{bottom:449.986667pt;}\n.y25a{bottom:450.626667pt;}\n.y936{bottom:450.786667pt;}\n.y492{bottom:450.946667pt;}\n.y864{bottom:451.106667pt;}\n.y5c7{bottom:451.266667pt;}\n.y831{bottom:451.586667pt;}\n.y637{bottom:452.386667pt;}\n.y3ab{bottom:452.866667pt;}\n.y393{bottom:453.026667pt;}\n.y4b1{bottom:453.186667pt;}\n.y51e{bottom:453.346667pt;}\n.y22f{bottom:453.506667pt;}\n.y50f{bottom:453.666667pt;}\n.y3dd{bottom:454.466667pt;}\n.y37c{bottom:454.626667pt;}\n.y85b{bottom:454.786667pt;}\n.y9a8{bottom:456.386667pt;}\n.y13d{bottom:456.706667pt;}\n.y338{bottom:457.186667pt;}\n.y7f{bottom:457.826667pt;}\n.y87e{bottom:458.466667pt;}\n.y5d{bottom:458.626667pt;}\n.y899{bottom:458.946667pt;}\n.y991{bottom:459.106667pt;}\n.y8cc{bottom:460.386667pt;}\n.yed{bottom:460.706667pt;}\n.y2f{bottom:460.866667pt;}\n.y76a{bottom:461.093333pt;}\n.y709{bottom:461.186667pt;}\n.yc4{bottom:461.346667pt;}\n.ya0{bottom:461.506667pt;}\n.y75c{bottom:462.466667pt;}\n.y7c2{bottom:462.626667pt;}\n.y52d{bottom:462.946667pt;}\n.y47d{bottom:463.106667pt;}\n.y4d3{bottom:463.586667pt;}\n.y44e{bottom:463.746667pt;}\n.y2d3{bottom:463.906667pt;}\n.y94a{bottom:464.226667pt;}\n.y58a{bottom:464.546667pt;}\n.y5b0{bottom:465.666667pt;}\n.yd0{bottom:465.986667pt;}\n.y259{bottom:466.146667pt;}\n.y929{bottom:466.466667pt;}\n.y29f{bottom:466.626667pt;}\n.y830{bottom:467.586667pt;}\n.y7ac{bottom:468.226667pt;}\n.y569{bottom:468.386667pt;}\n.y670{bottom:468.546667pt;}\n.y4a6{bottom:468.706667pt;}\n.y1fa{bottom:468.866667pt;}\n.y219{bottom:469.026667pt;}\n.y4ae{bottom:469.186667pt;}\n.y22e{bottom:469.346667pt;}\n.y50e{bottom:469.506667pt;}\n.y365{bottom:469.666667pt;}\n.y3dc{bottom:469.986667pt;}\n.y5fd{bottom:470.146667pt;}\n.y37b{bottom:470.306667pt;}\n.y416{bottom:470.466667pt;}\n.y172{bottom:472.066667pt;}\n.y9a7{bottom:472.226667pt;}\n.y19f{bottom:472.386667pt;}\n.y337{bottom:473.026667pt;}\n.y6f0{bottom:473.506667pt;}\n.y142{bottom:474.146667pt;}\n.y4fc{bottom:474.786667pt;}\n.y990{bottom:475.106667pt;}\n.y845{bottom:476.066667pt;}\n.y738{bottom:476.386667pt;}\n.y96a{bottom:476.706667pt;}\n.y708{bottom:476.866667pt;}\n.y6ca{bottom:477.666667pt;}\n.y47c{bottom:478.786667pt;}\n.y2d2{bottom:479.426667pt;}\n.y7fd{bottom:479.586667pt;}\n.y551{bottom:479.906667pt;}\n.y815{bottom:480.546667pt;}\n.y5af{bottom:481.506667pt;}\n.y97a{bottom:481.666667pt;}\n.y5c{bottom:481.826667pt;}\n.y61c{bottom:481.920000pt;}\n.y314{bottom:481.986667pt;}\n.y5db{bottom:482.146667pt;}\n.y928{bottom:482.306667pt;}\n.y491{bottom:482.466667pt;}\n.y82f{bottom:483.106667pt;}\n.y661{bottom:483.906667pt;}\n.y2e{bottom:484.066667pt;}\n.y277{bottom:484.226667pt;}\n.y8fb{bottom:484.546667pt;}\n.yb4{bottom:484.706667pt;}\n.y13c{bottom:484.866667pt;}\n.y364{bottom:485.346667pt;}\n.y3db{bottom:485.666667pt;}\n.y37a{bottom:486.146667pt;}\n.y171{bottom:487.746667pt;}\n.ycf{bottom:489.186667pt;}\n.y141{bottom:489.826667pt;}\n.y4fb{bottom:490.466667pt;}\n.y87d{bottom:490.626667pt;}\n.y8cb{bottom:491.106667pt;}\n.y1d0{bottom:491.266667pt;}\n.y844{bottom:491.586667pt;}\n.y13f{bottom:492.226667pt;}\n.y969{bottom:492.413333pt;}\n.y707{bottom:492.866667pt;}\n.y6c9{bottom:493.346667pt;}\n.y52c{bottom:493.666667pt;}\n.y47b{bottom:494.466667pt;}\n.y44d{bottom:495.106667pt;}\n.y2d1{bottom:495.266667pt;}\n.y258{bottom:497.506667pt;}\n.y29e{bottom:497.666667pt;}\n.y82e{bottom:498.946667pt;}\n.y388{bottom:499.200000pt;}\n.y8f2{bottom:499.426667pt;}\n.y1f9{bottom:499.586667pt;}\n.y2ea{bottom:499.746667pt;}\n.y218{bottom:499.906667pt;}\n.y24d{bottom:500.066667pt;}\n.y22d{bottom:500.226667pt;}\n.y4e5{bottom:500.386667pt;}\n.y791{bottom:500.546667pt;}\n.y5fc{bottom:501.026667pt;}\n.y363{bottom:501.186667pt;}\n.y3da{bottom:501.346667pt;}\n.y415{bottom:502.146667pt;}\n.y336{bottom:503.426667pt;}\n.y170{bottom:503.586667pt;}\n.y19e{bottom:503.906667pt;}\n.y7e{bottom:505.026667pt;}\n.y109{bottom:505.186667pt;}\n.y5b{bottom:505.826667pt;}\n.y4fa{bottom:506.306667pt;}\n.y8ca{bottom:506.786667pt;}\n.y1cf{bottom:506.946667pt;}\n.y13e{bottom:507.746667pt;}\n.yc3{bottom:507.906667pt;}\n.y2d{bottom:508.226667pt;}\n.y967{bottom:508.253333pt;}\n.y706{bottom:508.546667pt;}\n.yb3{bottom:508.706667pt;}\n.y6c8{bottom:509.026667pt;}\n.y75b{bottom:509.186667pt;}\n.y52b{bottom:509.346667pt;}\n.y7fc{bottom:509.986667pt;}\n.y4d2{bottom:510.146667pt;}\n.y47a{bottom:510.466667pt;}\n.y550{bottom:510.626667pt;}\n.y2d0{bottom:510.946667pt;}\n.y814{bottom:511.586667pt;}\n.y5ae{bottom:512.226667pt;}\n.y737{bottom:512.386667pt;}\n.y979{bottom:512.546667pt;}\n.y275{bottom:512.706667pt;}\n.y313{bottom:512.866667pt;}\n.y5da{bottom:513.026667pt;}\n.yce{bottom:513.186667pt;}\n.y140{bottom:513.986667pt;}\n.y74f{bottom:514.786667pt;}\n.y3aa{bottom:515.106667pt;}\n.y392{bottom:515.266667pt;}\n.y1f8{bottom:515.426667pt;}\n.y4a5{bottom:515.586667pt;}\n.y51d{bottom:515.746667pt;}\n.y790{bottom:516.226667pt;}\n.y5fb{bottom:516.706667pt;}\n.y3d9{bottom:517.026667pt;}\n.y61e{bottom:517.506667pt;}\n.y85a{bottom:517.666667pt;}\n.y636{bottom:520.066667pt;}\n.y843{bottom:520.866667pt;}\n.y6ef{bottom:521.506667pt;}\n.y9a6{bottom:521.666667pt;}\n.y4f9{bottom:521.986667pt;}\n.y1ce{bottom:522.786667pt;}\n.y705{bottom:524.226667pt;}\n.y87c{bottom:524.386667pt;}\n.y769{bottom:524.640000pt;}\n.y6c7{bottom:524.706667pt;}\n.y7c1{bottom:524.866667pt;}\n.y52a{bottom:525.186667pt;}\n.y4d1{bottom:525.666667pt;}\n.y966{bottom:525.693333pt;}\n.y44c{bottom:525.986667pt;}\n.y2cf{bottom:526.786667pt;}\n.y54f{bottom:527.106667pt;}\n.y5ad{bottom:527.906667pt;}\n.y978{bottom:528.226667pt;}\n.y7a6{bottom:528.320000pt;}\n.y108{bottom:528.386667pt;}\n.y257{bottom:528.706667pt;}\n.y5d9{bottom:528.866667pt;}\n.y7d{bottom:529.026667pt;}\n.y5a{bottom:529.186667pt;}\n.y13b{bottom:529.506667pt;}\n.y82d{bottom:529.986667pt;}\n.y568{bottom:530.626667pt;}\n.y3a9{bottom:530.946667pt;}\n.y248{bottom:531.106667pt;}\n.y1f7{bottom:531.266667pt;}\n.y2c{bottom:531.426667pt;}\n.y4ad{bottom:531.586667pt;}\n.y4a4{bottom:531.746667pt;}\n.yb2{bottom:531.906667pt;}\n.y5fa{bottom:532.386667pt;}\n.y3d8{bottom:532.546667pt;}\n.y362{bottom:532.706667pt;}\n.y38b{bottom:533.346667pt;}\n.y414{bottom:533.506667pt;}\n.y660{bottom:533.666667pt;}\n.y335{bottom:534.946667pt;}\n.y16f{bottom:535.266667pt;}\n.y19d{bottom:535.426667pt;}\n.y635{bottom:535.586667pt;}\n.y842{bottom:535.746667pt;}\n.ycd{bottom:536.546667pt;}\n.y6ee{bottom:537.346667pt;}\n.y4f8{bottom:537.826667pt;}\n.y1cd{bottom:538.466667pt;}\n.y704{bottom:539.906667pt;}\n.y87b{bottom:540.066667pt;}\n.y6c6{bottom:540.706667pt;}\n.y529{bottom:540.866667pt;}\n.y965{bottom:541.213333pt;}\n.y7fb{bottom:541.506667pt;}\n.y44b{bottom:541.666667pt;}\n.y479{bottom:541.826667pt;}\n.y3ed{bottom:541.920000pt;}\n.y2ce{bottom:542.466667pt;}\n.y54e{bottom:543.106667pt;}\n.y736{bottom:543.746667pt;}\n.y5ac{bottom:543.906667pt;}\n.y783{bottom:544.066667pt;}\n.y272{bottom:544.226667pt;}\n.y256{bottom:544.386667pt;}\n.y29d{bottom:544.546667pt;}\n.y8ab{bottom:544.706667pt;}\n.y5d8{bottom:544.866667pt;}\n.y490{bottom:545.026667pt;}\n.y8b9{bottom:546.466667pt;}\n.y3a8{bottom:546.626667pt;}\n.y42f{bottom:546.786667pt;}\n.y1f6{bottom:546.946667pt;}\n.y4e4{bottom:547.106667pt;}\n.y51c{bottom:547.266667pt;}\n.y75a{bottom:547.426667pt;}\n.y5f9{bottom:547.906667pt;}\n.y3d7{bottom:548.226667pt;}\n.y567{bottom:549.186667pt;}\n.y898{bottom:550.626667pt;}\n.y634{bottom:551.426667pt;}\n.y59{bottom:552.386667pt;}\n.y16e{bottom:553.186667pt;}\n.y4f7{bottom:553.506667pt;}\n.y8c9{bottom:554.146667pt;}\n.y1cc{bottom:554.306667pt;}\n.y2b{bottom:554.626667pt;}\n.yf9{bottom:555.106667pt;}\n.yc2{bottom:555.266667pt;}\n.y703{bottom:555.746667pt;}\n.yb1{bottom:555.906667pt;}\n.y528{bottom:556.546667pt;}\n.y688{bottom:556.706667pt;}\n.y133{bottom:557.346667pt;}\n.y7e0{bottom:557.506667pt;}\n.y4d0{bottom:557.986667pt;}\n.y44a{bottom:558.146667pt;}\n.y2cd{bottom:558.306667pt;}\n.y589{bottom:558.466667pt;}\n.y54d{bottom:558.786667pt;}\n.y7a2{bottom:559.040000pt;}\n.y5ab{bottom:559.586667pt;}\n.ycc{bottom:559.746667pt;}\n.y255{bottom:560.066667pt;}\n.y927{bottom:560.226667pt;}\n.y29c{bottom:560.386667pt;}\n.y8aa{bottom:560.546667pt;}\n.y82c{bottom:561.026667pt;}\n.y391{bottom:562.466667pt;}\n.y217{bottom:562.626667pt;}\n.y1f5{bottom:562.786667pt;}\n.y22c{bottom:562.946667pt;}\n.y51b{bottom:563.106667pt;}\n.y5f8{bottom:563.586667pt;}\n.y361{bottom:563.746667pt;}\n.y3d6{bottom:563.906667pt;}\n.y38a{bottom:564.866667pt;}\n.y65f{bottom:565.026667pt;}\n.y841{bottom:565.186667pt;}\n.y897{bottom:566.306667pt;}\n.y19c{bottom:566.466667pt;}\n.y6ed{bottom:568.226667pt;}\n.y16d{bottom:568.706667pt;}\n.y4f6{bottom:569.373333pt;}\n.y8c8{bottom:570.013333pt;}\n.y1cb{bottom:570.653333pt;}\n.y74a{bottom:570.720000pt;}\n.y87a{bottom:571.613333pt;}\n.y6c5{bottom:572.093333pt;}\n.y7c0{bottom:572.253333pt;}\n.y527{bottom:572.413333pt;}\n.y964{bottom:572.573333pt;}\n.y7fa{bottom:573.053333pt;}\n.y13a{bottom:573.213333pt;}\n.y478{bottom:573.533333pt;}\n.y4cf{bottom:574.013333pt;}\n.y54c{bottom:574.493333pt;}\n.y813{bottom:574.813333pt;}\n.y5aa{bottom:575.293333pt;}\n.y781{bottom:575.453333pt;}\n.y7c{bottom:575.613333pt;}\n.y312{bottom:576.093333pt;}\n.y405{bottom:576.253333pt;}\n.y58{bottom:576.413333pt;}\n.y8b8{bottom:577.533333pt;}\n.y132{bottom:577.693333pt;}\n.y3a7{bottom:578.173333pt;}\n.y1f4{bottom:578.333333pt;}\n.yc1{bottom:578.493333pt;}\n.y2a{bottom:578.653333pt;}\n.y759{bottom:578.813333pt;}\n.y906{bottom:578.973333pt;}\n.yf8{bottom:579.293333pt;}\n.y3d5{bottom:579.453333pt;}\n.y859{bottom:579.773333pt;}\n.y566{bottom:580.253333pt;}\n.y98f{bottom:580.733333pt;}\n.y840{bottom:580.893333pt;}\n.y896{bottom:582.013333pt;}\n.y9a5{bottom:582.333333pt;}\n.y633{bottom:583.133333pt;}\n.ycb{bottom:583.773333pt;}\n.y6ec{bottom:583.933333pt;}\n.y19b{bottom:584.413333pt;}\n.y16c{bottom:584.573333pt;}\n.y1ca{bottom:586.493333pt;}\n.y7bf{bottom:587.933333pt;}\n.y4f5{bottom:588.093333pt;}\n.y526{bottom:588.253333pt;}\n.y687{bottom:588.413333pt;}\n.y139{bottom:588.733333pt;}\n.y61b{bottom:588.800000pt;}\n.y7df{bottom:588.893333pt;}\n.y449{bottom:589.053333pt;}\n.y2cc{bottom:589.213333pt;}\n.y949{bottom:589.533333pt;}\n.y4ce{bottom:589.693333pt;}\n.y588{bottom:589.853333pt;}\n.y54b{bottom:590.173333pt;}\n.y812{bottom:590.333333pt;}\n.y5a9{bottom:590.973333pt;}\n.y926{bottom:591.773333pt;}\n.y29b{bottom:591.933333pt;}\n.y12d{bottom:592.253333pt;}\n.y82b{bottom:592.733333pt;}\n.y8b7{bottom:593.213333pt;}\n.y7a4{bottom:593.373333pt;}\n.y390{bottom:594.013333pt;}\n.y1f3{bottom:594.173333pt;}\n.y216{bottom:594.333333pt;}\n.y22b{bottom:594.493333pt;}\n.y654{bottom:594.653333pt;}\n.y360{bottom:594.813333pt;}\n.y131{bottom:594.973333pt;}\n.y3d4{bottom:595.133333pt;}\n.y413{bottom:596.093333pt;}\n.y968{bottom:596.573333pt;}\n.y8c7{bottom:597.053333pt;}\n.y334{bottom:597.373333pt;}\n.y98e{bottom:597.533333pt;}\n.y895{bottom:597.693333pt;}\n.y135{bottom:598.173333pt;}\n.y8e7{bottom:598.400000pt;}\n.y107{bottom:598.973333pt;}\n.y57{bottom:599.613333pt;}\n.y379{bottom:599.773333pt;}\n.y19a{bottom:600.093333pt;}\n.y632{bottom:601.053333pt;}\n.y29{bottom:601.853333pt;}\n.y1c9{bottom:602.173333pt;}\n.yc0{bottom:602.493333pt;}\n.y6c4{bottom:603.133333pt;}\n.y7be{bottom:603.933333pt;}\n.y686{bottom:604.093333pt;}\n.y2cb{bottom:604.733333pt;}\n.y477{bottom:604.893333pt;}\n.y587{bottom:605.373333pt;}\n.y4cd{bottom:605.533333pt;}\n.y74d{bottom:606.013333pt;}\n.y54a{bottom:606.173333pt;}\n.y5a8{bottom:606.813333pt;}\n.y311{bottom:606.973333pt;}\n.yca{bottom:607.133333pt;}\n.y5d7{bottom:607.293333pt;}\n.y925{bottom:607.613333pt;}\n.y8a9{bottom:607.933333pt;}\n.y8b6{bottom:609.213333pt;}\n.y83f{bottom:609.373333pt;}\n.y3a6{bottom:609.693333pt;}\n.y1f2{bottom:609.853333pt;}\n.y215{bottom:610.013333pt;}\n.y22a{bottom:610.173333pt;}\n.y35f{bottom:610.493333pt;}\n.y3d3{bottom:610.813333pt;}\n.y12c{bottom:610.973333pt;}\n.y858{bottom:611.293333pt;}\n.y138{bottom:611.453333pt;}\n.y905{bottom:612.733333pt;}\n.y333{bottom:613.053333pt;}\n.y98d{bottom:613.213333pt;}\n.y9a4{bottom:613.533333pt;}\n.y894{bottom:614.173333pt;}\n.y6eb{bottom:615.293333pt;}\n.y16b{bottom:615.453333pt;}\n.y199{bottom:615.933333pt;}\n.y631{bottom:616.573333pt;}\n.y134{bottom:616.893333pt;}\n.y130{bottom:617.213333pt;}\n.y1c8{bottom:618.013333pt;}\n.y8ec{bottom:618.333333pt;}\n.y4f4{bottom:618.813333pt;}\n.y525{bottom:618.973333pt;}\n.y7bd{bottom:619.613333pt;}\n.y685{bottom:619.773333pt;}\n.y448{bottom:620.413333pt;}\n.y2ca{bottom:620.573333pt;}\n.y879{bottom:621.213333pt;}\n.y586{bottom:621.373333pt;}\n.y310{bottom:622.653333pt;}\n.y56{bottom:622.813333pt;}\n.y7b{bottom:622.973333pt;}\n.y90{bottom:623.613333pt;}\n.y732{bottom:624.893333pt;}\n.y28{bottom:625.213333pt;}\n.y595{bottom:625.373333pt;}\n.y3a5{bottom:625.533333pt;}\n.ybf{bottom:625.693333pt;}\n.yec{bottom:625.853333pt;}\n.y229{bottom:626.013333pt;}\n.y5f7{bottom:626.173333pt;}\n.y3d2{bottom:626.333333pt;}\n.yf7{bottom:626.493333pt;}\n.y65e{bottom:627.133333pt;}\n.y412{bottom:627.453333pt;}\n.y904{bottom:628.733333pt;}\n.y332{bottom:628.893333pt;}\n.y137{bottom:629.533333pt;}\n.yc9{bottom:630.333333pt;}\n.y16a{bottom:631.133333pt;}\n.y6ea{bottom:631.293333pt;}\n.y12b{bottom:631.453333pt;}\n.y198{bottom:631.613333pt;}\n.y630{bottom:632.413333pt;}\n.y893{bottom:632.573333pt;}\n.y702{bottom:633.693333pt;}\n.y6c3{bottom:634.173333pt;}\n.y12f{bottom:634.333333pt;}\n.y4f3{bottom:634.493333pt;}\n.y7bc{bottom:635.293333pt;}\n.y7f9{bottom:635.613333pt;}\n.y476{bottom:635.933333pt;}\n.y447{bottom:636.093333pt;}\n.y2c9{bottom:636.253333pt;}\n.y549{bottom:636.893333pt;}\n.y811{bottom:637.213333pt;}\n.y5a7{bottom:637.533333pt;}\n.y77d{bottom:637.853333pt;}\n.y30f{bottom:638.333333pt;}\n.y402{bottom:638.493333pt;}\n.y378{bottom:638.653333pt;}\n.y82a{bottom:639.133333pt;}\n.y731{bottom:640.573333pt;}\n.y83e{bottom:640.733333pt;}\n.y4b0{bottom:640.893333pt;}\n.y78f{bottom:641.213333pt;}\n.y758{bottom:641.373333pt;}\n.y5f6{bottom:641.853333pt;}\n.y3d1{bottom:642.013333pt;}\n.y35e{bottom:642.173333pt;}\n.y857{bottom:642.813333pt;}\n.y565{bottom:642.973333pt;}\n.y903{bottom:644.413333pt;}\n.y331{bottom:644.573333pt;}\n.y9a3{bottom:644.733333pt;}\n.y411{bottom:645.373333pt;}\n.y7a{bottom:646.173333pt;}\n.y169{bottom:646.813333pt;}\n.y55{bottom:646.973333pt;}\n.y197{bottom:647.293333pt;}\n.y136{bottom:647.613333pt;}\n.y892{bottom:648.253333pt;}\n.yeb{bottom:649.053333pt;}\n.y27{bottom:649.213333pt;}\n.y1c7{bottom:649.533333pt;}\n.ybe{bottom:649.853333pt;}\n.y12a{bottom:650.333333pt;}\n.y524{bottom:650.493333pt;}\n.y7f8{bottom:651.133333pt;}\n.y12e{bottom:651.613333pt;}\n.y4cc{bottom:651.933333pt;}\n.y2c8{bottom:652.093333pt;}\n.y548{bottom:652.413333pt;}\n.y5a6{bottom:653.213333pt;}\n.y7de{bottom:653.373333pt;}\n.y615{bottom:653.440000pt;}\n.y29a{bottom:654.013333pt;}\n.y957{bottom:654.173333pt;}\n.yc8{bottom:654.333333pt;}\n.y829{bottom:654.813333pt;}\n.y247{bottom:656.253333pt;}\n.y24c{bottom:656.413333pt;}\n.y1f1{bottom:656.573333pt;}\n.y214{bottom:656.733333pt;}\n.y4a3{bottom:656.893333pt;}\n.y50d{bottom:657.053333pt;}\n.y5f5{bottom:657.373333pt;}\n.y3d0{bottom:657.693333pt;}\n.y35d{bottom:658.013333pt;}\n.y65d{bottom:658.653333pt;}\n.y8b5{bottom:658.813333pt;}\n.y902{bottom:660.093333pt;}\n.y330{bottom:660.573333pt;}\n.y410{bottom:660.893333pt;}\n.y168{bottom:662.493333pt;}\n.y6e9{bottom:662.653333pt;}\n.y196{bottom:662.973333pt;}\n.y62f{bottom:664.093333pt;}\n.y1c6{bottom:665.213333pt;}\n.y977{bottom:665.373333pt;}\n.y6c2{bottom:665.853333pt;}\n.y4f2{bottom:666.173333pt;}\n.y475{bottom:666.813333pt;}\n.y7f7{bottom:666.973333pt;}\n.y2c7{bottom:667.773333pt;}\n.y810{bottom:668.253333pt;}\n.y129{bottom:668.413333pt;}\n.y77b{bottom:669.053333pt;}\n.y5a5{bottom:669.213333pt;}\n.y106{bottom:669.373333pt;}\n.y299{bottom:669.693333pt;}\n.y377{bottom:669.853333pt;}\n.y30e{bottom:670.013333pt;}\n.y54{bottom:670.173333pt;}\n.y828{bottom:670.493333pt;}\n.y3a4{bottom:671.933333pt;}\n.y1f0{bottom:672.093333pt;}\n.y48f{bottom:672.253333pt;}\n.y26{bottom:672.413333pt;}\n.y757{bottom:672.573333pt;}\n.yea{bottom:673.053333pt;}\n.y3cf{bottom:673.213333pt;}\n.y35c{bottom:673.533333pt;}\n.y564{bottom:673.853333pt;}\n.y65c{bottom:674.333333pt;}\n.y901{bottom:675.773333pt;}\n.y40f{bottom:676.893333pt;}\n.yc7{bottom:677.533333pt;}\n.y748{bottom:678.080000pt;}\n.y167{bottom:678.333333pt;}\n.y195{bottom:678.973333pt;}\n.y962{bottom:680.573333pt;}\n.y1c5{bottom:681.053333pt;}\n.y6c1{bottom:681.533333pt;}\n.y7bb{bottom:681.853333pt;}\n.y4f1{bottom:682.013333pt;}\n.y62e{bottom:682.173333pt;}\n.y7f6{bottom:682.653333pt;}\n.y523{bottom:682.813333pt;}\n.y446{bottom:683.453333pt;}\n.y2c6{bottom:683.613333pt;}\n.y585{bottom:683.773333pt;}\n.y547{bottom:684.093333pt;}\n.y7a1{bottom:684.320000pt;}\n.y128{bottom:684.573333pt;}\n.y7dd{bottom:684.733333pt;}\n.y5a4{bottom:684.893333pt;}\n.y30d{bottom:685.533333pt;}\n.y5d6{bottom:685.693333pt;}\n.y2ae{bottom:685.920000pt;}\n.y4cb{bottom:686.493333pt;}\n.y827{bottom:686.813333pt;}\n.y246{bottom:687.773333pt;}\n.y213{bottom:687.933333pt;}\n.y1ef{bottom:688.093333pt;}\n.y298{bottom:688.253333pt;}\n.y2e9{bottom:688.413333pt;}\n.y5f4{bottom:688.733333pt;}\n.y3ce{bottom:688.893333pt;}\n.y35b{bottom:689.533333pt;}\n.y8b4{bottom:690.173333pt;}\n.y563{bottom:690.653333pt;}\n.y98c{bottom:691.293333pt;}\n.y32f{bottom:691.773333pt;}\n.y856{bottom:692.413333pt;}\n.y40e{bottom:692.573333pt;}\n.y53{bottom:693.373333pt;}\n.y79{bottom:693.533333pt;}\n.y6e8{bottom:693.693333pt;}\n.y976{bottom:693.853333pt;}\n.y8f{bottom:694.173333pt;}\n.y8e2{bottom:695.680000pt;}\n.ye9{bottom:696.253333pt;}\n.y25{bottom:696.413333pt;}\n.yf6{bottom:696.893333pt;}\n.y6c0{bottom:697.213333pt;}\n.y4f0{bottom:697.533333pt;}\n.y62d{bottom:697.693333pt;}\n.y522{bottom:698.333333pt;}\n.y7f5{bottom:698.493333pt;}\n.y474{bottom:698.653333pt;}\n.y546{bottom:699.773333pt;}\n.y1c4{bottom:699.933333pt;}\n.y5a3{bottom:700.573333pt;}\n.y30c{bottom:701.373333pt;}\n.yc6{bottom:701.533333pt;}\n.y8a8{bottom:701.693333pt;}\n.y4ca{bottom:702.173333pt;}\n.y878{bottom:702.813333pt;}\n.y3a3{bottom:703.453333pt;}\n.y38f{bottom:703.613333pt;}\n.y1ee{bottom:703.773333pt;}\n.y297{bottom:703.933333pt;}\n.y5f3{bottom:704.253333pt;}\n.y3cd{bottom:704.573333pt;}\n.y913{bottom:704.800000pt;}\n.y9a2{bottom:707.293333pt;}\n.y40d{bottom:708.413333pt;}\n.y2c0{bottom:709.053333pt;}\n.y166{bottom:709.213333pt;}\n.y194{bottom:709.693333pt;}\n.y855{bottom:709.853333pt;}\n.yc{bottom:710.333333pt;}\n.y701{bottom:711.933333pt;}\n.y6bf{bottom:712.893333pt;}\n.y7ba{bottom:713.213333pt;}\n.y4ef{bottom:713.373333pt;}\n.y684{bottom:713.693333pt;}\n.y521{bottom:714.173333pt;}\n.y2c5{bottom:714.493333pt;}\n.y127{bottom:714.813333pt;}\n.y584{bottom:715.133333pt;}\n.y545{bottom:715.453333pt;}\n.y79e{bottom:716.000000pt;}\n.y7dc{bottom:716.093333pt;}\n.y5a2{bottom:716.253333pt;}\n.y78{bottom:716.733333pt;}\n.y65b{bottom:717.213333pt;}\n.y9f{bottom:717.373333pt;}\n.y52{bottom:717.533333pt;}\n.y826{bottom:717.853333pt;}\n.y4c9{bottom:718.173333pt;}\n.y877{bottom:718.493333pt;}\n.y245{bottom:719.293333pt;}\n.ye8{bottom:719.453333pt;}\n.y228{bottom:719.613333pt;}\n.y24{bottom:719.773333pt;}\n.y5f2{bottom:719.933333pt;}\n.yf5{bottom:720.253333pt;}\n.y8b3{bottom:721.053333pt;}\n.y98b{bottom:721.533333pt;}\n.y32e{bottom:722.493333pt;}\n.y975{bottom:723.293333pt;}\n.y6e7{bottom:724.733333pt;}\n.yb{bottom:725.693333pt;}\n.y2bf{bottom:726.973333pt;}\n.y165{bottom:727.613333pt;}\n.y854{bottom:727.933333pt;}\n.y745{bottom:728.000000pt;}\n.y7cf{bottom:728.800000pt;}\n.y8e6{bottom:729.373333pt;}\n.y473{bottom:730.013333pt;}\n.y1c3{bottom:730.653333pt;}\n.y544{bottom:731.293333pt;}\n.y30b{bottom:732.093333pt;}\n.y3fd{bottom:732.253333pt;}\n.y2c4{bottom:732.413333pt;}\n.y8a7{bottom:732.573333pt;}\n.yc5{bottom:733.053333pt;}\n.y891{bottom:733.693333pt;}\n.y8fa{bottom:734.333333pt;}\n.y876{bottom:734.493333pt;}\n.y961{bottom:734.813333pt;}\n.y244{bottom:734.973333pt;}\n.y212{bottom:735.133333pt;}\n.y1ed{bottom:735.293333pt;}\n.y2e8{bottom:735.453333pt;}\n.y5f1{bottom:735.613333pt;}\n.y35a{bottom:735.773333pt;}\n.y429{bottom:736.320000pt;}\n.y9a1{bottom:738.813333pt;}\n.y105{bottom:739.933333pt;}\n.y6e6{bottom:740.413333pt;}\n.y51{bottom:740.733333pt;}\n.y32d{bottom:741.213333pt;}\n.y193{bottom:741.373333pt;}\n.y23{bottom:742.973333pt;}\n.y700{bottom:743.293333pt;}\n.yf4{bottom:743.453333pt;}\n.ye7{bottom:743.613333pt;}\n.y62c{bottom:744.413333pt;}\n.y6be{bottom:744.733333pt;}\n.y4ee{bottom:744.893333pt;}\n.y683{bottom:745.053333pt;}\n.y445{bottom:745.533333pt;}\n.y7f4{bottom:745.853333pt;}\n.y583{bottom:746.173333pt;}\n.y80f{bottom:746.333333pt;}\n.y1c2{bottom:746.493333pt;}\n.y7db{bottom:747.293333pt;}\n.y30a{bottom:747.773333pt;}\n.y5d5{bottom:747.933333pt;}\n.y2c3{bottom:748.093333pt;}\n.y613{bottom:748.160000pt;}\n.y7b9{bottom:748.573333pt;}\n.y825{bottom:749.373333pt;}\n.y4c8{bottom:749.533333pt;}\n.y5c6{bottom:750.173333pt;}\n.y38e{bottom:750.333333pt;}\n.y4af{bottom:750.653333pt;}\n.y243{bottom:750.813333pt;}\n.y211{bottom:750.973333pt;}\n.y1ec{bottom:751.133333pt;}\n.y2e7{bottom:751.293333pt;}\n.y3cc{bottom:751.453333pt;}\n.y359{bottom:751.773333pt;}\n.y974{bottom:752.413333pt;}\n.y8b2{bottom:752.573333pt;}\n.y9a0{bottom:754.493333pt;}\n.ya{bottom:756.413333pt;}\n.y164{bottom:758.493333pt;}\n.y126{bottom:758.973333pt;}\n.y192{bottom:759.293333pt;}\n.y4ed{bottom:760.573333pt;}\n.y6bd{bottom:760.893333pt;}\n.y472{bottom:761.053333pt;}\n.y444{bottom:761.213333pt;}\n.y7f3{bottom:761.533333pt;}\n.y1c1{bottom:762.173333pt;}\n.y5a1{bottom:762.813333pt;}\n.y62b{bottom:762.973333pt;}\n.y2bd{bottom:763.613333pt;}\n.y3fa{bottom:763.773333pt;}\n.y50{bottom:763.933333pt;}\n.y7b8{bottom:764.253333pt;}\n.y8e{bottom:764.733333pt;}\n.y890{bottom:765.053333pt;}\n.y5c5{bottom:765.853333pt;}\n.y38d{bottom:766.013333pt;}\n.y562{bottom:766.173333pt;}\n.y756{bottom:766.333333pt;}\n.y296{bottom:766.493333pt;}\n.ye6{bottom:766.813333pt;}\n.y22{bottom:766.973333pt;}\n.y3cb{bottom:767.133333pt;}\n.y358{bottom:767.453333pt;}\n.yf3{bottom:767.613333pt;}\n.y42d{bottom:770.493333pt;}\n.y9{bottom:771.773333pt;}\n.y32c{bottom:771.933333pt;}\n.y6e5{bottom:772.093333pt;}\n.y163{bottom:774.173333pt;}\n.y125{bottom:774.813333pt;}\n.y6ff{bottom:774.973333pt;}\n.y682{bottom:776.093333pt;}\n.y4ec{bottom:776.413333pt;}\n.y7f2{bottom:777.053333pt;}\n.y582{bottom:777.213333pt;}\n.y443{bottom:777.373333pt;}\n.y80e{bottom:777.693333pt;}\n.y1c0{bottom:777.853333pt;}\n.y5a0{bottom:778.493333pt;}\n.y62a{bottom:778.653333pt;}\n.y60e{bottom:778.880000pt;}\n.y309{bottom:779.293333pt;}\n.y5d4{bottom:779.453333pt;}\n.y7b7{bottom:779.933333pt;}\n.y735{bottom:780.253333pt;}\n.y4c7{bottom:780.573333pt;}\n.y88f{bottom:780.733333pt;}\n.y973{bottom:781.053333pt;}\n.y242{bottom:781.533333pt;}\n.y227{bottom:781.693333pt;}\n.y210{bottom:781.853333pt;}\n.y1eb{bottom:782.013333pt;}\n.y50c{bottom:782.333333pt;}\n.y5f0{bottom:782.493333pt;}\n.y3ca{bottom:782.653333pt;}\n.y357{bottom:783.293333pt;}\n.y8b1{bottom:783.933333pt;}\n.y8{bottom:787.133333pt;}\n.y77{bottom:787.293333pt;}\n.y6e4{bottom:787.773333pt;}\n.y4f{bottom:787.933333pt;}\n.y21{bottom:790.173333pt;}\n.ye5{bottom:790.813333pt;}\n.y471{bottom:792.093333pt;}\n.y581{bottom:792.893333pt;}\n.y6bc{bottom:793.253333pt;}\n.y1bf{bottom:793.733333pt;}\n.y59f{bottom:794.533333pt;}\n.y308{bottom:795.173333pt;}\n.y376{bottom:795.333333pt;}\n.y2c2{bottom:795.493333pt;}\n.y824{bottom:795.973333pt;}\n.y88e{bottom:796.613333pt;}\n.y241{bottom:797.253333pt;}\n.y24b{bottom:797.413333pt;}\n.y48e{bottom:797.573333pt;}\n.y295{bottom:797.733333pt;}\n.y5ef{bottom:798.213333pt;}\n.y3c9{bottom:798.373333pt;}\n.y356{bottom:798.853333pt;}\n.y98a{bottom:801.253333pt;}\n.y8b0{bottom:801.893333pt;}\n.y42b{bottom:802.053333pt;}\n.y7{bottom:802.373333pt;}\n.y71b{bottom:802.720000pt;}\n.y32b{bottom:803.493333pt;}\n.y162{bottom:805.893333pt;}\n.y124{bottom:806.053333pt;}\n.y681{bottom:807.013333pt;}\n.y442{bottom:807.973333pt;}\n.y191{bottom:808.773333pt;}\n.y580{bottom:808.933333pt;}\n.y1be{bottom:809.253333pt;}\n.y80d{bottom:809.413333pt;}\n.y79c{bottom:809.760000pt;}\n.y6bb{bottom:809.893333pt;}\n.y59e{bottom:810.213333pt;}\n.y307{bottom:810.853333pt;}\n.y470{bottom:811.013333pt;}\n.y8d{bottom:811.173333pt;}\n.y4e{bottom:811.333333pt;}\n.y4c6{bottom:811.653333pt;}\n.yb0{bottom:811.973333pt;}\n.y88d{bottom:812.293333pt;}\n.y543{bottom:812.453333pt;}\n.y629{bottom:812.613333pt;}\n.y20f{bottom:813.093333pt;}\n.y1ea{bottom:813.253333pt;}\n.y294{bottom:813.413333pt;}\n.y20{bottom:813.573333pt;}\n.y5ee{bottom:813.733333pt;}\n.yf2{bottom:814.053333pt;}\n.y103{bottom:814.213333pt;}\n.y355{bottom:814.693333pt;}\n.y875{bottom:815.653333pt;}\n.y8f9{bottom:815.813333pt;}\n.y99f{bottom:816.773333pt;}\n.y8af{bottom:817.573333pt;}\n.y6{bottom:817.733333pt;}\n.y32a{bottom:819.173333pt;}\n.y6e3{bottom:819.653333pt;}\n.y161{bottom:821.573333pt;}\n.y680{bottom:822.853333pt;}\n.y441{bottom:823.493333pt;}\n.y4eb{bottom:823.653333pt;}\n.y123{bottom:823.973333pt;}\n.y190{bottom:824.453333pt;}\n.y1bd{bottom:825.253333pt;}\n.y59d{bottom:825.893333pt;}\n.y773{bottom:826.053333pt;}\n.y6ba{bottom:826.213333pt;}\n.y306{bottom:826.693333pt;}\n.y3f6{bottom:826.853333pt;}\n.y4c5{bottom:827.333333pt;}\n.y542{bottom:828.133333pt;}\n.y643{bottom:828.773333pt;}\n.y240{bottom:828.933333pt;}\n.y2e6{bottom:829.093333pt;}\n.y5ed{bottom:829.413333pt;}\n.y3c8{bottom:829.573333pt;}\n.y354{bottom:830.373333pt;}\n.y628{bottom:831.333333pt;}\n.y99e{bottom:832.613333pt;}\n.y989{bottom:832.773333pt;}\n.y5{bottom:833.093333pt;}\n.y874{bottom:833.413333pt;}\n.y8f8{bottom:833.733333pt;}\n.y4d{bottom:834.533333pt;}\n.y347{bottom:834.720000pt;}\n.y8c{bottom:835.333333pt;}\n.y40c{bottom:836.773333pt;}\n.y102{bottom:837.413333pt;}\n.y1f{bottom:837.573333pt;}\n.y8da{bottom:837.760000pt;}\n.yf1{bottom:838.213333pt;}\n.y67f{bottom:838.853333pt;}\n.y4ea{bottom:839.493333pt;}\n.y18f{bottom:840.133333pt;}\n.y57f{bottom:840.293333pt;}\n.y80c{bottom:840.773333pt;}\n.y1bc{bottom:841.573333pt;}\n.y7da{bottom:841.733333pt;}\n.y122{bottom:841.893333pt;}\n.y329{bottom:842.213333pt;}\n.y305{bottom:842.373333pt;}\n.y65a{bottom:842.533333pt;}\n.y7f1{bottom:843.173333pt;}\n.y4c4{bottom:843.333333pt;}\n.y88c{bottom:843.813333pt;}\n.y541{bottom:843.973333pt;}\n.y4a2{bottom:844.293333pt;}\n.y4ac{bottom:844.453333pt;}\n.y20e{bottom:844.613333pt;}\n.y1e9{bottom:844.773333pt;}\n.y2e5{bottom:844.933333pt;}\n.y5ec{bottom:845.093333pt;}\n.y3c7{bottom:845.253333pt;}\n.y353{bottom:846.213333pt;}\n.y988{bottom:848.293333pt;}\n.y99d{bottom:849.093333pt;}\n.y8f7{bottom:849.253333pt;}\n.y6e2{bottom:851.013333pt;}\n.y160{bottom:852.453333pt;}\n.y464{bottom:853.280000pt;}\n.y67e{bottom:854.533333pt;}\n.y57e{bottom:855.973333pt;}\n.y80b{bottom:856.613333pt;}\n.y59c{bottom:857.413333pt;}\n.y1bb{bottom:857.573333pt;}\n.y76{bottom:857.733333pt;}\n.y328{bottom:857.893333pt;}\n.y304{bottom:858.213333pt;}\n.y3f3{bottom:858.373333pt;}\n.y4c{bottom:858.533333pt;}\n.y4c3{bottom:858.853333pt;}\n.y34a{bottom:859.013333pt;}\n.y4{bottom:859.493333pt;}\n.y88b{bottom:859.653333pt;}\n.y46f{bottom:860.133333pt;}\n.y293{bottom:860.293333pt;}\n.y440{bottom:860.453333pt;}\n.y5eb{bottom:860.613333pt;}\n.y1e{bottom:860.773333pt;}\n.y3c6{bottom:860.933333pt;}\n.yf0{bottom:861.413333pt;}\n.y627{bottom:862.213333pt;}\n.y873{bottom:864.133333pt;}\n.y352{bottom:864.293333pt;}\n.y8f6{bottom:865.093333pt;}\n.y6e1{bottom:867.493333pt;}\n.y15f{bottom:868.133333pt;}\n.y67d{bottom:870.213333pt;}\n.y18e{bottom:870.853333pt;}\n.y57d{bottom:871.973333pt;}\n.y60d{bottom:872.480000pt;}\n.y7e9{bottom:872.640000pt;}\n.y7b6{bottom:873.253333pt;}\n.y79b{bottom:873.280000pt;}\n.y121{bottom:873.573333pt;}\n.y4c2{bottom:874.693333pt;}\n.y540{bottom:874.853333pt;}\n.y561{bottom:875.333333pt;}\n.y20d{bottom:875.493333pt;}\n.y1e8{bottom:875.653333pt;}\n.y226{bottom:875.813333pt;}\n.y292{bottom:875.973333pt;}\n.y43f{bottom:876.133333pt;}\n.y5ea{bottom:876.293333pt;}\n.y3c5{bottom:876.613333pt;}\n.y626{bottom:877.733333pt;}\n.y46e{bottom:878.053333pt;}\n.y987{bottom:880.613333pt;}\n.y99c{bottom:880.773333pt;}\n.y4b{bottom:881.733333pt;}\n.y75{bottom:881.893333pt;}\n.yaf{bottom:882.533333pt;}\n.y6e0{bottom:883.333333pt;}\n.y15e{bottom:883.813333pt;}\n.y1d{bottom:883.973333pt;}\n.y101{bottom:884.613333pt;}\n.yef{bottom:885.413333pt;}\n.y67c{bottom:885.893333pt;}\n.y18d{bottom:886.693333pt;}\n.y57c{bottom:887.653333pt;}\n.y59b{bottom:888.133333pt;}\n.y1ba{bottom:888.293333pt;}\n.y770{bottom:888.453333pt;}\n.y375{bottom:888.933333pt;}\n.y303{bottom:889.093333pt;}\n.y53f{bottom:890.373333pt;}\n.y66d{bottom:891.013333pt;}\n.y1e7{bottom:891.173333pt;}\n.y7ea{bottom:891.333333pt;}\n.y120{bottom:891.493333pt;}\n.y7d9{bottom:891.653333pt;}\n.y43e{bottom:891.813333pt;}\n.y5e9{bottom:891.973333pt;}\n.y3c4{bottom:892.133333pt;}\n.y625{bottom:893.573333pt;}\n.y351{bottom:895.173333pt;}\n.y46d{bottom:895.973333pt;}\n.y8f5{bottom:896.133333pt;}\n.y986{bottom:896.453333pt;}\n.y872{bottom:896.773333pt;}\n.y6df{bottom:899.013333pt;}\n.y15d{bottom:899.493333pt;}\n.y90e{bottom:899.520000pt;}\n.y726{bottom:900.453333pt;}\n.y67b{bottom:901.733333pt;}\n.y18c{bottom:902.533333pt;}\n.y1b9{bottom:903.813333pt;}\n.y80a{bottom:903.973333pt;}\n.y609{bottom:904.000000pt;}\n.y57b{bottom:904.133333pt;}\n.y374{bottom:904.613333pt;}\n.y302{bottom:904.773333pt;}\n.y9e{bottom:904.933333pt;}\n.y74{bottom:905.093333pt;}\n.y4c1{bottom:905.413333pt;}\n.y7f0{bottom:905.573333pt;}\n.yae{bottom:905.733333pt;}\n.y4a{bottom:905.893333pt;}\n.y53e{bottom:906.213333pt;}\n.y20c{bottom:906.853333pt;}\n.y2b5{bottom:907.013333pt;}\n.y1e6{bottom:907.173333pt;}\n.y4ab{bottom:907.333333pt;}\n.y43d{bottom:907.493333pt;}\n.y100{bottom:907.813333pt;}\n.y1c{bottom:907.973333pt;}\n.y11f{bottom:909.413333pt;}\n.y350{bottom:910.853333pt;}\n.y46c{bottom:911.493333pt;}\n.y871{bottom:914.693333pt;}\n.y696{bottom:914.720000pt;}\n.y6de{bottom:915.333333pt;}\n.y15c{bottom:915.493333pt;}\n.y45e{bottom:917.440000pt;}\n.y18b{bottom:918.053333pt;}\n.y1b8{bottom:919.653333pt;}\n.y59a{bottom:919.813333pt;}\n.y301{bottom:920.453333pt;}\n.y327{bottom:920.613333pt;}\n.y57a{bottom:920.773333pt;}\n.y4c0{bottom:921.093333pt;}\n.y7ef{bottom:921.253333pt;}\n.y53d{bottom:921.893333pt;}\n.y5c4{bottom:922.533333pt;}\n.y20b{bottom:922.693333pt;}\n.y291{bottom:922.853333pt;}\n.y43c{bottom:923.013333pt;}\n.y5e8{bottom:923.173333pt;}\n.y3c3{bottom:923.493333pt;}\n.y624{bottom:924.613333pt;}\n.y34f{bottom:926.533333pt;}\n.y8f4{bottom:927.173333pt;}\n.y46b{bottom:927.333333pt;}\n.y11e{bottom:927.493333pt;}\n.y73{bottom:928.293333pt;}\n.y3{bottom:928.613333pt;}\n.y9d{bottom:928.933333pt;}\n.y49{bottom:929.093333pt;}\n.y15b{bottom:931.173333pt;}\n.y1b{bottom:931.333333pt;}\n.yff{bottom:931.973333pt;}\n.y870{bottom:932.613333pt;}\n.y18a{bottom:933.893333pt;}\n.y911{bottom:935.173333pt;}\n.y1b7{bottom:935.333333pt;}\n.y599{bottom:935.493333pt;}\n.y326{bottom:936.133333pt;}\n.y373{bottom:936.293333pt;}\n.y579{bottom:936.453333pt;}\n.y4bf{bottom:936.933333pt;}\n.y88a{bottom:937.573333pt;}\n.y53c{bottom:937.733333pt;}\n.y823{bottom:937.893333pt;}\n.y1e5{bottom:938.373333pt;}\n.y20a{bottom:938.533333pt;}\n.y43b{bottom:938.693333pt;}\n.y5d3{bottom:938.853333pt;}\n.y3c2{bottom:939.013333pt;}\n.y11d{bottom:943.013333pt;}\n.y985{bottom:945.413333pt;}\n.y15a{bottom:946.853333pt;}\n.y6dd{bottom:947.493333pt;}\n.y86f{bottom:948.133333pt;}\n.y1b6{bottom:951.173333pt;}\n.y325{bottom:951.973333pt;}\n.y9c{bottom:952.133333pt;}\n.y48{bottom:952.293333pt;}\n.y7ee{bottom:952.613333pt;}\n.y578{bottom:952.933333pt;}\n.yad{bottom:953.093333pt;}\n.y4be{bottom:953.253333pt;}\n.y822{bottom:953.413333pt;}\n.y290{bottom:954.053333pt;}\n.y209{bottom:954.213333pt;}\n.y43a{bottom:954.373333pt;}\n.y5e7{bottom:954.533333pt;}\n.y3c1{bottom:954.693333pt;}\n.yfe{bottom:955.173333pt;}\n.y1a{bottom:955.333333pt;}\n.y623{bottom:955.653333pt;}\n.y34e{bottom:957.413333pt;}\n.y11c{bottom:958.693333pt;}\n.y46a{bottom:959.013333pt;}\n.y984{bottom:960.933333pt;}\n.y722{bottom:962.693333pt;}\n.y86e{bottom:963.973333pt;}\n.y862{bottom:967.200000pt;}\n.y189{bottom:967.653333pt;}\n.y956{bottom:967.813333pt;}\n.y7ed{bottom:968.453333pt;}\n.y76b{bottom:969.253333pt;}\n.y4bd{bottom:969.413333pt;}\n.y755{bottom:969.573333pt;}\n.y28f{bottom:969.733333pt;}\n.y1e4{bottom:969.893333pt;}\n.y1b5{bottom:970.053333pt;}\n.y300{bottom:970.213333pt;}\n.y3c0{bottom:970.373333pt;}\n.y8f3{bottom:974.373333pt;}\n.y72{bottom:975.493333pt;}\n.y47{bottom:976.293333pt;}\n.y983{bottom:976.773333pt;}\n.y159{bottom:977.733333pt;}\n.y6dc{bottom:978.213333pt;}\n.y19{bottom:978.533333pt;}\n.yfd{bottom:979.173333pt;}\n.y598{bottom:982.053333pt;}\n.y721{bottom:982.213333pt;}\n.y2{bottom:982.533333pt;}\n.y8a6{bottom:983.173333pt;}\n.y188{bottom:983.493333pt;}\n.y324{bottom:983.653333pt;}\n.y821{bottom:984.933333pt;}\n.y4bc{bottom:985.093333pt;}\n.y28e{bottom:985.253333pt;}\n.y208{bottom:985.573333pt;}\n.y2ff{bottom:985.733333pt;}\n.y3bf{bottom:985.893333pt;}\n.y622{bottom:987.173333pt;}\n.y11b{bottom:989.413333pt;}\n.y158{bottom:993.413333pt;}\n.y86d{bottom:995.493333pt;}\n.y6db{bottom:997.093333pt;}\n.y597{bottom:997.733333pt;}\n.y608{bottom:998.560000pt;}\n.y104{bottom:998.853333pt;}\n.y9b{bottom:999.493333pt;}\n.y46{bottom:999.653333pt;}\n.y7ec{bottom:1000.133333pt;}\n.y4bb{bottom:1000.773333pt;}\n.y1b4{bottom:1000.933333pt;}\n.y48d{bottom:1001.093333pt;}\n.y1e3{bottom:1001.253333pt;}\n.y207{bottom:1001.413333pt;}\n.y2e4{bottom:1001.573333pt;}\n.y18{bottom:1001.893333pt;}\n.y621{bottom:1003.973333pt;}\n.y11a{bottom:1005.093333pt;}\n.y982{bottom:1006.053333pt;}\n.y157{bottom:1009.093333pt;}\n.y889{bottom:1013.413333pt;}\n.y86c{bottom:1013.893333pt;}\n.y659{bottom:1014.053333pt;}\n.y372{bottom:1014.213333pt;}\n.y187{bottom:1014.373333pt;}\n.y7eb{bottom:1015.813333pt;}\n.y1b3{bottom:1016.453333pt;}\n.y28d{bottom:1016.613333pt;}\n.y439{bottom:1016.773333pt;}\n.y5e6{bottom:1016.933333pt;}\n.y34d{bottom:1020.160000pt;}\n.y119{bottom:1020.960000pt;}\n.ye4{bottom:1022.720000pt;}\n.y45{bottom:1022.880000pt;}\n.yac{bottom:1023.520000pt;}\n.y156{bottom:1024.800000pt;}\n.y17{bottom:1025.920000pt;}\n.y6da{bottom:1027.680000pt;}\n.y888{bottom:1029.120000pt;}\n.y606{bottom:1029.440000pt;}\n.y8a5{bottom:1029.920000pt;}\n.y186{bottom:1030.080000pt;}\n.y4ba{bottom:1031.520000pt;}\n.y620{bottom:1031.680000pt;}\n.y71e{bottom:1031.840000pt;}\n.y1e2{bottom:1032.160000pt;}\n.y1b2{bottom:1032.320000pt;}\n.y438{bottom:1032.480000pt;}\n.y2e3{bottom:1032.640000pt;}\n.y863{bottom:1032.800000pt;}\n.y371{bottom:1032.960000pt;}\n.y981{bottom:1035.360000pt;}\n.y118{bottom:1036.640000pt;}\n.y887{bottom:1045.120000pt;}\n.y155{bottom:1045.280000pt;}\n.y185{bottom:1045.760000pt;}\n.y323{bottom:1045.920000pt;}\n.y71{bottom:1046.080000pt;}\n.yab{bottom:1046.720000pt;}\n.y44{bottom:1046.880000pt;}\n.y4b9{bottom:1047.200000pt;}\n.y577{bottom:1047.840000pt;}\n.y1b1{bottom:1048.000000pt;}\n.y437{bottom:1048.160000pt;}\n.y5e5{bottom:1048.320000pt;}\n.y16{bottom:1049.280000pt;}\n.y67a{bottom:1049.440000pt;}\n.y8d9{bottom:1059.680000pt;}\n.y154{bottom:1062.880000pt;}\n.y4b8{bottom:1063.040000pt;}\n.y2e2{bottom:1063.680000pt;}\n.y117{bottom:1063.840000pt;}\n.y34c{bottom:1064.160000pt;}\n.y15{bottom:1065.440000pt;}\n.y43{bottom:1070.080000pt;}\n.h14{height:4.335000pt;}\n.h47{height:14.240000pt;}\n.h2e{height:14.720000pt;}\n.h1e{height:14.916875pt;}\n.h21{height:15.714375pt;}\n.h24{height:16.000000pt;}\n.h29{height:16.974375pt;}\n.h32{height:17.440000pt;}\n.h3c{height:17.600000pt;}\n.h27{height:17.881875pt;}\n.ha{height:20.000000pt;}\n.h2c{height:30.720000pt;}\n.h1c{height:30.880000pt;}\n.h18{height:32.588750pt;}\n.h45{height:33.440000pt;}\n.h3e{height:35.200000pt;}\n.h3a{height:35.398125pt;}\n.h13{height:36.883125pt;}\n.h35{height:38.473125pt;}\n.h7{height:40.640625pt;}\n.h1d{height:42.693125pt;}\n.h38{height:42.796000pt;}\n.hf{height:42.808125pt;}\n.hb{height:44.975625pt;}\n.h17{height:45.084000pt;}\n.hd{height:45.948800pt;}\n.h49{height:46.560000pt;}\n.hc{height:46.635625pt;}\n.h1a{height:46.748000pt;}\n.h3b{height:46.880000pt;}\n.h2d{height:47.322500pt;}\n.h2b{height:47.520000pt;}\n.h46{height:49.852500pt;}\n.h8{height:49.898438pt;}\n.h6{height:51.692500pt;}\n.h20{height:53.920000pt;}\n.h10{height:54.187500pt;}\n.h2{height:55.220937pt;}\n.h11{height:56.187500pt;}\n.h9{height:58.563750pt;}\n.h5{height:61.208750pt;}\n.h4b{height:63.040000pt;}\n.h40{height:64.640000pt;}\n.h44{height:65.280000pt;}\n.h34{height:66.560000pt;}\n.h2f{height:77.440000pt;}\n.h30{height:77.600000pt;}\n.h31{height:77.760000pt;}\n.h33{height:79.520000pt;}\n.h19{height:79.840000pt;}\n.h3d{height:80.160000pt;}\n.h12{height:81.281250pt;}\n.he{height:82.735625pt;}\n.h43{height:97.120000pt;}\n.h1f{height:97.440000pt;}\n.h28{height:97.760000pt;}\n.h22{height:97.920000pt;}\n.h4a{height:108.480000pt;}\n.h41{height:109.280000pt;}\n.h36{height:112.480000pt;}\n.h4c{height:113.440000pt;}\n.h26{height:122.560000pt;}\n.h3{height:126.256875pt;}\n.h2a{height:126.560000pt;}\n.h1b{height:128.640000pt;}\n.h4e{height:161.280000pt;}\n.h4d{height:178.080000pt;}\n.h48{height:189.280000pt;}\n.h42{height:203.520000pt;}\n.h4{height:224.750000pt;}\n.h37{height:236.640000pt;}\n.h23{height:242.560000pt;}\n.h39{height:273.280000pt;}\n.h16{height:345.920000pt;}\n.h15{height:417.600000pt;}\n.h25{height:440.160000pt;}\n.h3f{height:476.000000pt;}\n.h4f{height:589.600000pt;}\n.h0{height:1122.720000pt;}\n.h1{height:1123.333333pt;}\n.w3{width:24.320000pt;}\n.w13{width:28.160000pt;}\n.w2b{width:28.960000pt;}\n.w36{width:31.680000pt;}\n.w14{width:32.000000pt;}\n.w28{width:43.840000pt;}\n.w16{width:49.920000pt;}\n.w2d{width:50.240000pt;}\n.w2a{width:50.560000pt;}\n.w18{width:50.720000pt;}\n.w24{width:55.360000pt;}\n.w26{width:59.360000pt;}\n.w2c{width:65.600000pt;}\n.w10{width:66.080000pt;}\n.w1f{width:72.000000pt;}\n.w31{width:75.840000pt;}\n.w8{width:78.560000pt;}\n.w1c{width:81.600000pt;}\n.wc{width:83.200000pt;}\n.w1a{width:96.800000pt;}\n.w20{width:100.000000pt;}\n.wa{width:122.080000pt;}\n.wb{width:138.240000pt;}\n.w34{width:147.040000pt;}\n.w21{width:148.800000pt;}\n.w1d{width:151.680000pt;}\n.w19{width:154.240000pt;}\n.w6{width:155.840000pt;}\n.w5{width:157.120000pt;}\n.w11{width:168.000000pt;}\n.w7{width:168.480000pt;}\n.w17{width:196.800000pt;}\n.w32{width:198.880000pt;}\n.w2f{width:203.840000pt;}\n.w27{width:222.880000pt;}\n.w35{width:230.880000pt;}\n.w2e{width:251.680000pt;}\n.w1b{width:285.440000pt;}\n.we{width:286.720000pt;}\n.w22{width:352.640000pt;}\n.w30{width:361.600000pt;}\n.w1e{width:371.040000pt;}\n.w15{width:397.120000pt;}\n.wf{width:411.840000pt;}\n.wd{width:429.280000pt;}\n.w12{width:460.960000pt;}\n.w25{width:480.320000pt;}\n.w23{width:598.720000pt;}\n.w9{width:620.480000pt;}\n.w29{width:632.960000pt;}\n.w33{width:676.640000pt;}\n.w4{width:685.120000pt;}\n.w2{width:793.279988pt;}\n.w0{width:793.280000pt;}\n.w1{width:794.000000pt;}\n.x0{left:0.000000pt;}\n.x24{left:2.240000pt;}\n.xa{left:4.000000pt;}\n.x45{left:45.472000pt;}\n.x1{left:47.199988pt;}\n.x2a{left:50.432000pt;}\n.x23{left:54.720000pt;}\n.x7{left:56.959988pt;}\n.x42{left:59.199988pt;}\n.x32{left:63.552000pt;}\n.x29{left:67.999988pt;}\n.x3b{left:75.231988pt;}\n.xc{left:80.991988pt;}\n.x25{left:84.511988pt;}\n.x1e{left:87.071988pt;}\n.x2d{left:89.631988pt;}\n.xd{left:91.711988pt;}\n.x2c{left:94.751988pt;}\n.x44{left:97.471988pt;}\n.x1d{left:99.711988pt;}\n.x28{left:102.591988pt;}\n.xe{left:104.831988pt;}\n.x21{left:107.551988pt;}\n.x1f{left:110.591988pt;}\n.x3c{left:112.511988pt;}\n.x10{left:115.551988pt;}\n.x2e{left:117.760000pt;}\n.xb{left:119.231988pt;}\n.x41{left:120.671988pt;}\n.x27{left:124.991988pt;}\n.x34{left:127.231988pt;}\n.x26{left:130.431988pt;}\n.x31{left:132.031988pt;}\n.x2f{left:138.906655pt;}\n.x39{left:140.346655pt;}\n.x20{left:151.226655pt;}\n.x3{left:157.306655pt;}\n.x35{left:170.586655pt;}\n.x43{left:198.746655pt;}\n.x33{left:203.840000pt;}\n.x11{left:208.506655pt;}\n.x49{left:230.146655pt;}\n.x38{left:234.786655pt;}\n.x36{left:237.666667pt;}\n.x3a{left:242.146655pt;}\n.x3e{left:260.866667pt;}\n.x3f{left:266.626667pt;}\n.xf{left:276.386655pt;}\n.x46{left:292.546655pt;}\n.x12{left:294.946655pt;}\n.x4a{left:298.466655pt;}\n.x4b{left:301.986655pt;}\n.x6{left:303.586655pt;}\n.x2{left:309.186655pt;}\n.x18{left:335.426655pt;}\n.x30{left:364.893333pt;}\n.x13{left:382.626655pt;}\n.x4{left:396.733322pt;}\n.x2b{left:401.920000pt;}\n.x19{left:445.693322pt;}\n.x14{left:450.973322pt;}\n.x1a{left:485.213322pt;}\n.x1b{left:558.213322pt;}\n.x17{left:574.053322pt;}\n.x3d{left:620.613333pt;}\n.x15{left:642.373322pt;}\n.x16{left:655.813322pt;}\n.x1c{left:659.173322pt;}\n.x48{left:711.040000pt;}\n.x40{left:713.760000pt;}\n.x47{left:716.479988pt;}\n.x9{left:718.560000pt;}\n.x22{left:723.519988pt;}\n.x8{left:731.039988pt;}\n.x37{left:739.999988pt;}\n.x5{left:773.919988pt;}\n}\n</style>\n<script>\n/*\n Copyright 2012 Mozilla Foundation \n Copyright 2013 Lu Wang <coolwanglu@gmail.com>\n Apachine License Version 2.0 \n*/\n(function(){function b(a,b,e,f){var c=(a.className||\"\").split(/\\s+/g);\"\"===c[0]&&c.shift();var d=c.indexOf(b);0>d&&e&&c.push(b);0<=d&&f&&c.splice(d,1);a.className=c.join(\" \");return 0<=d}if(!(\"classList\"in document.createElement(\"div\"))){var e={add:function(a){b(this.element,a,!0,!1)},contains:function(a){return b(this.element,a,!1,!1)},remove:function(a){b(this.element,a,!1,!0)},toggle:function(a){b(this.element,a,!0,!0)}};Object.defineProperty(HTMLElement.prototype,\"classList\",{get:function(){if(this._classList)return this._classList;\nvar a=Object.create(e,{element:{value:this,writable:!1,enumerable:!0}});Object.defineProperty(this,\"_classList\",{value:a,writable:!1,enumerable:!1});return a},enumerable:!0})}})();\n</script>\n<script>\n(function(){/*\n pdf2htmlEX.js: Core UI functions for pdf2htmlEX \n Copyright 2012,2013 Lu Wang <coolwanglu@gmail.com> and other contributors \n https://github.com/pdf2htmlEX/pdf2htmlEX/blob/master/share/LICENSE \n*/\nvar pdf2htmlEX=window.pdf2htmlEX=window.pdf2htmlEX||{},CSS_CLASS_NAMES={page_frame:\"pf\",page_content_box:\"pc\",page_data:\"pi\",background_image:\"bi\",link:\"l\",input_radio:\"ir\",__dummy__:\"no comma\"},DEFAULT_CONFIG={container_id:\"page-container\",sidebar_id:\"sidebar\",outline_id:\"outline\",loading_indicator_cls:\"loading-indicator\",preload_pages:3,render_timeout:100,scale_step:0.9,key_handler:!0,hashchange_handler:!0,view_history_handler:!0,__dummy__:\"no comma\"},EPS=1E-6;\nfunction invert(a){var b=a[0]*a[3]-a[1]*a[2];return[a[3]/b,-a[1]/b,-a[2]/b,a[0]/b,(a[2]*a[5]-a[3]*a[4])/b,(a[1]*a[4]-a[0]*a[5])/b]}function transform(a,b){return[a[0]*b[0]+a[2]*b[1]+a[4],a[1]*b[0]+a[3]*b[1]+a[5]]}function get_page_number(a){return parseInt(a.getAttribute(\"data-page-no\"),16)}function disable_dragstart(a){for(var b=0,c=a.length;b<c;++b)a[b].addEventListener(\"dragstart\",function(){return!1},!1)}\nfunction clone_and_extend_objs(a){for(var b={},c=0,e=arguments.length;c<e;++c){var h=arguments[c],d;for(d in h)h.hasOwnProperty(d)&&(b[d]=h[d])}return b}\nfunction Page(a){if(a){this.shown=this.loaded=!1;this.page=a;this.num=get_page_number(a);this.original_height=a.clientHeight;this.original_width=a.clientWidth;var b=a.getElementsByClassName(CSS_CLASS_NAMES.page_content_box)[0];b&&(this.content_box=b,this.original_scale=this.cur_scale=this.original_height/b.clientHeight,this.page_data=JSON.parse(a.getElementsByClassName(CSS_CLASS_NAMES.page_data)[0].getAttribute(\"data-data\")),this.ctm=this.page_data.ctm,this.ictm=invert(this.ctm),this.loaded=!0)}}\nPage.prototype={hide:function(){this.loaded&&this.shown&&(this.content_box.classList.remove(\"opened\"),this.shown=!1)},show:function(){this.loaded&&!this.shown&&(this.content_box.classList.add(\"opened\"),this.shown=!0)},rescale:function(a){this.cur_scale=0===a?this.original_scale:a;this.loaded&&(a=this.content_box.style,a.msTransform=a.webkitTransform=a.transform=\"scale(\"+this.cur_scale.toFixed(3)+\")\");a=this.page.style;a.height=this.original_height*this.cur_scale+\"px\";a.width=this.original_width*this.cur_scale+\n\"px\"},view_position:function(){var a=this.page,b=a.parentNode;return[b.scrollLeft-a.offsetLeft-a.clientLeft,b.scrollTop-a.offsetTop-a.clientTop]},height:function(){return this.page.clientHeight},width:function(){return this.page.clientWidth}};function Viewer(a){this.config=clone_and_extend_objs(DEFAULT_CONFIG,0<arguments.length?a:{});this.pages_loading=[];this.init_before_loading_content();var b=this;document.addEventListener(\"DOMContentLoaded\",function(){b.init_after_loading_content()},!1)}\nViewer.prototype={scale:1,cur_page_idx:0,first_page_idx:0,init_before_loading_content:function(){this.pre_hide_pages()},initialize_radio_button:function(){for(var a=document.getElementsByClassName(CSS_CLASS_NAMES.input_radio),b=0;b<a.length;b++)a[b].addEventListener(\"click\",function(){this.classList.toggle(\"checked\")})},init_after_loading_content:function(){this.sidebar=document.getElementById(this.config.sidebar_id);this.outline=document.getElementById(this.config.outline_id);this.container=document.getElementById(this.config.container_id);\nthis.loading_indicator=document.getElementsByClassName(this.config.loading_indicator_cls)[0];for(var a=!0,b=this.outline.childNodes,c=0,e=b.length;c<e;++c)if(\"ul\"===b[c].nodeName.toLowerCase()){a=!1;break}a||this.sidebar.classList.add(\"opened\");this.find_pages();if(0!=this.pages.length){disable_dragstart(document.getElementsByClassName(CSS_CLASS_NAMES.background_image));this.config.key_handler&&this.register_key_handler();var h=this;this.config.hashchange_handler&&window.addEventListener(\"hashchange\",\nfunction(a){h.navigate_to_dest(document.location.hash.substring(1))},!1);this.config.view_history_handler&&window.addEventListener(\"popstate\",function(a){a.state&&h.navigate_to_dest(a.state)},!1);this.container.addEventListener(\"scroll\",function(){h.update_page_idx();h.schedule_render(!0)},!1);[this.container,this.outline].forEach(function(a){a.addEventListener(\"click\",h.link_handler.bind(h),!1)});this.initialize_radio_button();this.render()}},find_pages:function(){for(var a=[],b={},c=this.container.childNodes,\ne=0,h=c.length;e<h;++e){var d=c[e];d.nodeType===Node.ELEMENT_NODE&&d.classList.contains(CSS_CLASS_NAMES.page_frame)&&(d=new Page(d),a.push(d),b[d.num]=a.length-1)}this.pages=a;this.page_map=b},load_page:function(a,b,c){var e=this.pages;if(!(a>=e.length||(e=e[a],e.loaded||this.pages_loading[a]))){var e=e.page,h=e.getAttribute(\"data-page-url\");if(h){this.pages_loading[a]=!0;var d=e.getElementsByClassName(this.config.loading_indicator_cls)[0];\"undefined\"===typeof d&&(d=this.loading_indicator.cloneNode(!0),\nd.classList.add(\"active\"),e.appendChild(d));var f=this,g=new XMLHttpRequest;g.open(\"GET\",h,!0);g.onload=function(){if(200===g.status||0===g.status){var b=document.createElement(\"div\");b.innerHTML=g.responseText;for(var d=null,b=b.childNodes,e=0,h=b.length;e<h;++e){var p=b[e];if(p.nodeType===Node.ELEMENT_NODE&&p.classList.contains(CSS_CLASS_NAMES.page_frame)){d=p;break}}b=f.pages[a];f.container.replaceChild(d,b.page);b=new Page(d);f.pages[a]=b;b.hide();b.rescale(f.scale);disable_dragstart(d.getElementsByClassName(CSS_CLASS_NAMES.background_image));\nf.schedule_render(!1);c&&c(b)}delete f.pages_loading[a]};g.send(null)}void 0===b&&(b=this.config.preload_pages);0<--b&&(f=this,setTimeout(function(){f.load_page(a+1,b)},0))}},pre_hide_pages:function(){var a=\"@media screen{.\"+CSS_CLASS_NAMES.page_content_box+\"{display:none;}}\",b=document.createElement(\"style\");b.styleSheet?b.styleSheet.cssText=a:b.appendChild(document.createTextNode(a));document.head.appendChild(b)},render:function(){for(var a=this.container,b=a.scrollTop,c=a.clientHeight,a=b-c,b=\nb+c+c,c=this.pages,e=0,h=c.length;e<h;++e){var d=c[e],f=d.page,g=f.offsetTop+f.clientTop,f=g+f.clientHeight;g<=b&&f>=a?d.loaded?d.show():this.load_page(e):d.hide()}},update_page_idx:function(){var a=this.pages,b=a.length;if(!(2>b)){for(var c=this.container,e=c.scrollTop,c=e+c.clientHeight,h=-1,d=b,f=d-h;1<f;){var g=h+Math.floor(f/2),f=a[g].page;f.offsetTop+f.clientTop+f.clientHeight>=e?d=g:h=g;f=d-h}this.first_page_idx=d;for(var g=h=this.cur_page_idx,k=0;d<b;++d){var f=a[d].page,l=f.offsetTop+f.clientTop,\nf=f.clientHeight;if(l>c)break;f=(Math.min(c,l+f)-Math.max(e,l))/f;if(d===h&&Math.abs(f-1)<=EPS){g=h;break}f>k&&(k=f,g=d)}this.cur_page_idx=g}},schedule_render:function(a){if(void 0!==this.render_timer){if(!a)return;clearTimeout(this.render_timer)}var b=this;this.render_timer=setTimeout(function(){delete b.render_timer;b.render()},this.config.render_timeout)},register_key_handler:function(){var a=this;window.addEventListener(\"DOMMouseScroll\",function(b){if(b.ctrlKey){b.preventDefault();var c=a.container,\ne=c.getBoundingClientRect(),c=[b.clientX-e.left-c.clientLeft,b.clientY-e.top-c.clientTop];a.rescale(Math.pow(a.config.scale_step,b.detail),!0,c)}},!1);window.addEventListener(\"keydown\",function(b){var c=!1,e=b.ctrlKey||b.metaKey,h=b.altKey;switch(b.keyCode){case 61:case 107:case 187:e&&(a.rescale(1/a.config.scale_step,!0),c=!0);break;case 173:case 109:case 189:e&&(a.rescale(a.config.scale_step,!0),c=!0);break;case 48:e&&(a.rescale(0,!1),c=!0);break;case 33:h?a.scroll_to(a.cur_page_idx-1):a.container.scrollTop-=\na.container.clientHeight;c=!0;break;case 34:h?a.scroll_to(a.cur_page_idx+1):a.container.scrollTop+=a.container.clientHeight;c=!0;break;case 35:a.container.scrollTop=a.container.scrollHeight;c=!0;break;case 36:a.container.scrollTop=0,c=!0}c&&b.preventDefault()},!1)},rescale:function(a,b,c){var e=this.scale;this.scale=a=0===a?1:b?e*a:a;c||(c=[0,0]);b=this.container;c[0]+=b.scrollLeft;c[1]+=b.scrollTop;for(var h=this.pages,d=h.length,f=this.first_page_idx;f<d;++f){var g=h[f].page;if(g.offsetTop+g.clientTop>=\nc[1])break}g=f-1;0>g&&(g=0);var g=h[g].page,k=g.clientWidth,f=g.clientHeight,l=g.offsetLeft+g.clientLeft,m=c[0]-l;0>m?m=0:m>k&&(m=k);k=g.offsetTop+g.clientTop;c=c[1]-k;0>c?c=0:c>f&&(c=f);for(f=0;f<d;++f)h[f].rescale(a);b.scrollLeft+=m/e*a+g.offsetLeft+g.clientLeft-m-l;b.scrollTop+=c/e*a+g.offsetTop+g.clientTop-c-k;this.schedule_render(!0)},fit_width:function(){var a=this.cur_page_idx;this.rescale(this.container.clientWidth/this.pages[a].width(),!0);this.scroll_to(a)},fit_height:function(){var a=this.cur_page_idx;\nthis.rescale(this.container.clientHeight/this.pages[a].height(),!0);this.scroll_to(a)},get_containing_page:function(a){for(;a;){if(a.nodeType===Node.ELEMENT_NODE&&a.classList.contains(CSS_CLASS_NAMES.page_frame)){a=get_page_number(a);var b=this.page_map;return a in b?this.pages[b[a]]:null}a=a.parentNode}return null},link_handler:function(a){var b=a.target,c=b.getAttribute(\"data-dest-detail\");if(c){if(this.config.view_history_handler)try{var e=this.get_current_view_hash();window.history.replaceState(e,\n\"\",\"#\"+e);window.history.pushState(c,\"\",\"#\"+c)}catch(h){}this.navigate_to_dest(c,this.get_containing_page(b));a.preventDefault()}},navigate_to_dest:function(a,b){try{var c=JSON.parse(a)}catch(e){return}if(c instanceof Array){var h=c[0],d=this.page_map;if(h in d){for(var f=d[h],h=this.pages[f],d=2,g=c.length;d<g;++d){var k=c[d];if(null!==k&&\"number\"!==typeof k)return}for(;6>c.length;)c.push(null);var g=b||this.pages[this.cur_page_idx],d=g.view_position(),d=transform(g.ictm,[d[0],g.height()-d[1]]),\ng=this.scale,l=[0,0],m=!0,k=!1,n=this.scale;switch(c[1]){case \"XYZ\":l=[null===c[2]?d[0]:c[2]*n,null===c[3]?d[1]:c[3]*n];g=c[4];if(null===g||0===g)g=this.scale;k=!0;break;case \"Fit\":case \"FitB\":l=[0,0];k=!0;break;case \"FitH\":case \"FitBH\":l=[0,null===c[2]?d[1]:c[2]*n];k=!0;break;case \"FitV\":case \"FitBV\":l=[null===c[2]?d[0]:c[2]*n,0];k=!0;break;case \"FitR\":l=[c[2]*n,c[5]*n],m=!1,k=!0}if(k){this.rescale(g,!1);var p=this,c=function(a){l=transform(a.ctm,l);m&&(l[1]=a.height()-l[1]);p.scroll_to(f,l)};h.loaded?\nc(h):(this.load_page(f,void 0,c),this.scroll_to(f))}}}},scroll_to:function(a,b){var c=this.pages;if(!(0>a||a>=c.length)){c=c[a].view_position();void 0===b&&(b=[0,0]);var e=this.container;e.scrollLeft+=b[0]-c[0];e.scrollTop+=b[1]-c[1]}},get_current_view_hash:function(){var a=[],b=this.pages[this.cur_page_idx];a.push(b.num);a.push(\"XYZ\");var c=b.view_position(),c=transform(b.ictm,[c[0],b.height()-c[1]]);a.push(c[0]/this.scale);a.push(c[1]/this.scale);a.push(this.scale);return JSON.stringify(a)}};\npdf2htmlEX.Viewer=Viewer;})();\n</script>\n<script>\ntry{\npdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});\n}catch(e){}\n</script>\n<title></title>\n</head>\n<body>\n<div id=\"sidebar\">\n<div id=\"outline\">\n</div>\n</div>\n<div id=\"page-container\">\n<div id=\"pf1\" class=\"pf w0 h0\" data-page-no=\"1\"><div class=\"pc pc1 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdX49k6Z3g9d/vOScis7uqq9Juu8ced7cL7QUSN4g/4oIbXsLyJhA3XPAaEBIvgEvECwBpBVpWCIG4mJVgpFnBzrCI1QLaGS/LrD07ttt2d3VlxnmeHxcnIjIiMquyd9zjaTyfj6xSVjk6M/6ciDzf8zznOVlVAQAAwG+p5ikAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPV5CgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfZ4CAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfpwAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecpAAAAUH0A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NYtjV1QfAAAAz+iNjwAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecjAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1+QgAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqD8nmn/4AAAGkSURBVAAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0+AgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAOSq78/3X7dt27a/P7559+PTtn37/ctfn//4+f2H77+9+/Fp23xkAAAAT+Qfz1k1ZeITIbwAAAAASUVORK5CYII=\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h2 y2 ff1 fs0 fc0 sc0 ls0 ws0\"> <span class=\"ls1 v1\"> </span></div><div class=\"t m0 x2 h3 y3 ff2 fs1 fc0 sc0 ls1 ws0\">User Guide </div><div class=\"t m0 x3 h4 y4 ff3 fs2 fc0 sc0 ls1 ws0\">is::Engine v4.0.0<span class=\"ff2 fs3\"> </span></div><div class=\"t m0 x4 h2 y5 ff1 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x4 h2 y6 ff1 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x4 h2 y7 ff1 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x4 h2 y8 ff1 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x4 h2 y9 ff1 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h2 ya ff1 fs0 fc0 sc0 ls0 ws0\"> <span class=\"ls1 v1\"> </span></div><div class=\"t m0 x4 h2 yb ff1 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x4 h2 yc ff1 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x5 h2 yd ff1 fs0 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x1 h2 ye ff1 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h5 yf ff1 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h5 y10 ff1 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h5 y11 ff1 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h5 y12 ff1 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h5 y13 ff1 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x6 h6 y14 ff2 fs4 fc0 sc0 ls1 ws0\">© 2025 <span class=\"ff3\">Is Daouda G<span class=\"_ _0\"></span>am<span class=\"_ _0\"></span>es</span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2\" class=\"pf w0 h0\" data-page-no=\"2\"><div class=\"pc pc2 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRbABGIVM8ifR8UOEq3eKn8ZrVKrlZzTvfZ1FwAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPW5AAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgfAJrgAAAA9SURBVAAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAMC36mumI0kybm1fS3LN+7ku785wd7UkLgMAAPiRB0chGo9C+nC2AAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h7 y15 ff2 fs5 fc2 sc0 ls1 ws1\">Con<span class=\"_ _0\"></span>ten<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 h8 y16 ff2 fs5 fc0 sc0 ls1 ws0\">Getting started g<span class=\"_ _0\"></span>uide<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">18<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y17 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> </span><span class=\"ls1 ws1\">I<span class=\"_ _0\"></span>ntro<span class=\"_ _0\"></span>duct<span class=\"_ _0\"></span>ion<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">18<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y18 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">About <span class=\"_ _0\"></span><span class=\"ls9 ws5\">the<span class=\"ls1 ws0\"> eng<span class=\"_ _0\"></span>ine<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 lsa ws6\">18<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y19 ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Engine st<span class=\"_ _0\"></span>ruc<span class=\"_ _0\"></span>ture<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>.....................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">18<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y1a ff2 fs5 fc0 sc0 ls1 ws1\">3.1<span class=\"ff5 ls4 ws0\"> </span>app<span class=\"_ _0\"></span>_sr<span class=\"_ _0\"></span>c<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">18<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y1b ff2 fs5 fc0 sc0 ls1 ws1\">3.2<span class=\"ff5 ls4 ws0\"> </span>is<span class=\"_ _0\"></span>Eng<span class=\"_ _0\"></span>ine<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">19<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y1c ff2 fs5 fc0 sc0 ls1 ws1\">3.3<span class=\"ff5 ls4 ws0\"> </span>as<span class=\"_ _0\"></span>set<span class=\"_ _0\"></span>s<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">19<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y1d ff2 fs5 fc0 sc0 ls1 ws1\">3.4<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">main.cpp <span class=\"_ _0\"></span>fi<span class=\"_ _0\"></span>le<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">19<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y1e ff2 fs5 fc0 sc0 ls1 ws1\">3.4.1<span class=\"ff5 ls5 ws0\"> </span>m<span class=\"_ _0\"></span>ai<span class=\"_ _0\"></span>n<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">19<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y1f ff2 fs5 fc0 sc0 ls1 ws1\">3.4.2<span class=\"ff5 ls5 ws0\"> </span>gam<span class=\"_ _0\"></span>e.p<span class=\"_ _0\"></span>lay<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">19<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y20 ff2 fs5 fc0 sc0 ls1 ws1\">3.4.3<span class=\"ff5 ls5 ws0\"> </span>gam<span class=\"_ _0\"></span>e.b<span class=\"_ _0\"></span>asic<span class=\"_ _0\"></span>SFMLm<span class=\"_ _0\"></span>ain<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>....................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">19<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y21 ff2 fs5 fc0 sc0 ls1 ws1\">Dis<span class=\"_ _0\"></span>play<span class=\"_ _0\"></span><span class=\"ff1 ls2 ws2\">...............................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">19<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y22 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meDi<span class=\"_ _0\"></span>spl<span class=\"_ _0\"></span>ay<span class=\"ff1\"> <span class=\"ls2 ws2\">..................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">19<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y23 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Public <span class=\"_ _0\"></span>met<span class=\"_ _0\"></span>hod<span class=\"_ _0\"></span>s<span class=\"ff1\"> <span class=\"ls2 ws2\">.......................................................................................................................................................................................</span> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">20<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y24 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eDis<span class=\"_ _0\"></span>pla<span class=\"_ _0\"></span>y<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">20<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y25 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>s<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">20<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y26 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>d<span class=\"_ _0\"></span>ra<span class=\"_ _0\"></span>w<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">20<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y27 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>dr<span class=\"_ _0\"></span>awSc<span class=\"_ _0\"></span>reen<span class=\"_ _0\"></span><span class=\"ff1 ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">20<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y28 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>sh<span class=\"_ _0\"></span>owT<span class=\"_ _0\"></span>empL<span class=\"_ _0\"></span>oadi<span class=\"_ _0\"></span>ng<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">20<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y29 ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tOpt<span class=\"_ _0\"></span>ionI<span class=\"_ _0\"></span>ndex<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">20<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y2a ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tTe<span class=\"_ _0\"></span>xtAn<span class=\"_ _0\"></span>imat<span class=\"_ _0\"></span>ion<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">21<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y2b ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tVi<span class=\"_ _0\"></span>ew<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">21<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y2c ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tVi<span class=\"_ _0\"></span>ewVar<span class=\"_ _0\"></span>X<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">21<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y2d ff2 fs5 fc0 sc0 ls1 ws1\">2.10<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Vie<span class=\"_ _0\"></span>wVarY<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">21<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y2e ff2 fs5 fc0 sc0 ls1 ws1\">2.11<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Vie<span class=\"_ _0\"></span>wVarX<span class=\"_ _0\"></span>Y<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">21<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y2f ff2 fs5 fc0 sc0 ls1 ws1\">2.12<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Vie<span class=\"_ _0\"></span>wSiz<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">22<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y30 ff2 fs5 fc0 sc0 ls1 ws1\">2.13<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Win<span class=\"_ _0\"></span>dowS<span class=\"_ _0\"></span>ize<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">22<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y31 ff2 fs5 fc0 sc0 ls1 ws1\">2.14<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Win<span class=\"_ _0\"></span>dowTi<span class=\"_ _0\"></span>tle<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">22<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y32 ff2 fs5 fc0 sc0 ls1 ws1\">2.15<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Win<span class=\"_ _0\"></span>dowB<span class=\"_ _0\"></span>gCol<span class=\"_ _0\"></span>or<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.......................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">22<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y33 ff2 fs5 fc0 sc0 ls1 ws1\">2.16<span class=\"ff5 ls6 ws0\"> </span>loa<span class=\"_ _0\"></span>dPar<span class=\"_ _0\"></span>entR<span class=\"_ _0\"></span>esou<span class=\"_ _0\"></span>rce<span class=\"_ _0\"></span>s<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">....................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">22<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y34 ff2 fs5 fc0 sc0 ls1 ws1\">2.17<span class=\"ff5 ls6 ws0\"> </span>loa<span class=\"_ _0\"></span>dRes<span class=\"_ _0\"></span>our<span class=\"_ _0\"></span>ces<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">22<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y35 ff2 fs5 fc0 sc0 ls1 ws1\">2.18<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>IsRu<span class=\"_ _0\"></span>nni<span class=\"_ _0\"></span>ng<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">22<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y36 ff2 fs5 fc0 sc0 ls1 ws1\">2.19<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>IsPl<span class=\"_ _0\"></span>ayi<span class=\"_ _0\"></span>ng<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">22<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y37 ff2 fs5 fc0 sc0 ls1 ws1\">2.20<span class=\"ff5 ls6 ws0\"> </span>qu<span class=\"_ _0\"></span>itSc<span class=\"_ _0\"></span>ene<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">23<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y38 ff2 fs5 fc0 sc0 ls1 ws1\">2.21<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Sce<span class=\"_ _0\"></span>neSt<span class=\"_ _0\"></span>art<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>.................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">23<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y39 ff2 fs5 fc0 sc0 ls1 ws1\">2.22<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Sce<span class=\"_ _0\"></span>neEn<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">23<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y3a ff2 fs5 fc0 sc0 ls1 ws1\">2.23<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Wai<span class=\"_ _0\"></span>tTime<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">..................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">23<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y3b ff2 fs5 fc0 sc0 ls1 ws1\">2.24<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Key<span class=\"_ _0\"></span>Back<span class=\"_ _0\"></span>Press<span class=\"_ _0\"></span>ed<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">23<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y3c ff2 fs5 fc0 sc0 ls1 ws1\">2.25<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Mous<span class=\"_ _0\"></span>eInC<span class=\"_ _0\"></span>olli<span class=\"_ _0\"></span>sio<span class=\"_ _0\"></span>n<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">23<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y3d ff2 fs5 fc0 sc0 ls1 ws1\">2.26<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>IsRu<span class=\"_ _0\"></span>nni<span class=\"_ _0\"></span>ng<span class=\"ff1 ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">23<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y3e ff2 fs5 fc0 sc0 ls1 ws1\">2.27<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>IsPl<span class=\"_ _0\"></span>ayin<span class=\"_ _0\"></span>g<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">23<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y3f ff2 fs5 fc0 sc0 ls1 ws1\">2.28<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Sce<span class=\"_ _0\"></span>neSta<span class=\"_ _0\"></span>rt<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>.................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">24<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y40 ff2 fs5 fc0 sc0 ls1 ws1\">2.29<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Sce<span class=\"_ _0\"></span>neEn<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">24<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y41 ff2 fs5 fc0 sc0 ls1 ws1\">2.30<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Win<span class=\"_ _0\"></span>dowIs<span class=\"_ _0\"></span>Act<span class=\"_ _0\"></span>ive<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">24<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y42 ff2 fs5 fc0 sc0 ls1 ws1\">2.31<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Key<span class=\"_ _0\"></span>Back<span class=\"_ _0\"></span>Press<span class=\"_ _0\"></span>ed<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.......................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">24<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf11\" data-dest-detail='[17,\"XYZ\",33,810,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:784.450000px;width:514.300000px;height:12.540000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf11\" data-dest-detail='[17,\"XYZ\",33,775,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:767.020000px;width:492.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf11\" data-dest-detail='[17,\"XYZ\",33,739,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:748.980000px;width:492.250000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf11\" data-dest-detail='[17,\"XYZ\",33,567,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:731.540000px;width:492.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf11\" data-dest-detail='[17,\"XYZ\",33,308,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:714.110000px;width:481.300000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,766,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:696.120000px;width:481.400000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,731,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:678.630000px;width:481.050000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,672,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:660.650000px;width:481.300000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,637,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.600000px;bottom:643.210000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,494,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.600000px;bottom:625.780000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,397,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.600000px;bottom:607.740000px;width:470.300000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,242,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:590.300000px;width:514.350000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:554.880000px;width:492.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,795,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:537.440000px;width:481.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,686,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:519.960000px;width:481.250000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,552,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:501.970000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,328,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:466.550000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,199,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:449.060000px;width:481.300000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf14\" data-dest-detail='[20,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:431.630000px;width:481.300000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf14\" data-dest-detail='[20,\"XYZ\",33,545,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:413.640000px;width:481.350000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf14\" data-dest-detail='[20,\"XYZ\",33,331,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:396.200000px;width:481.300000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf14\" data-dest-detail='[20,\"XYZ\",33,143,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:360.730000px;width:470.500000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf15\" data-dest-detail='[21,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:343.290000px;width:470.450000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf15\" data-dest-detail='[21,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:325.860000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf15\" data-dest-detail='[21,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:307.870000px;width:470.250000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf15\" data-dest-detail='[21,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:290.440000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf15\" data-dest-detail='[21,\"XYZ\",33,79,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:220.090000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf16\" data-dest-detail='[22,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:202.050000px;width:470.200000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf16\" data-dest-detail='[22,\"XYZ\",33,79,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:78.850000px;width:470.300000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3\" class=\"pf w0 h0\" data-page-no=\"3\"><div class=\"pc pc3 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws1\">2.32<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Vie<span class=\"_ _0\"></span>w<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">24<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y44 ff2 fs5 fc0 sc0 ls1 ws1\">2.33<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Rend<span class=\"_ _0\"></span>erWi<span class=\"_ _0\"></span>ndow<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">24<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls1 ws1\">2.34<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Mous<span class=\"_ _0\"></span>ePos<span class=\"_ _0\"></span>Cur<span class=\"_ _0\"></span>rent<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">24<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y46 ff2 fs5 fc0 sc0 ls1 ws1\">2.35<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Mous<span class=\"_ _0\"></span>ePos<span class=\"_ _0\"></span>Prev<span class=\"_ _0\"></span>iou<span class=\"_ _0\"></span>s<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">24<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y47 ff2 fs5 fc0 sc0 ls1 ws1\">2.36<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Rend<span class=\"_ _0\"></span>erTe<span class=\"_ _0\"></span>xtu<span class=\"_ _0\"></span>re<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">25<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y48 ff2 fs5 fc0 sc0 ls1 ws1\">2.37<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Gam<span class=\"_ _0\"></span>eSyst<span class=\"_ _0\"></span>em<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">25<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y49 ff2 fs5 fc0 sc0 ls1 ws1\">2.38<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Fon<span class=\"_ _0\"></span>tSyst<span class=\"_ _0\"></span>em<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>...............................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">25<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4a ff2 fs5 fc0 sc0 ls1 ws1\">2.39<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Fon<span class=\"_ _0\"></span>tMsg<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">25<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4b ff2 fs5 fc0 sc0 ls1 ws1\">2.40<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>Butto<span class=\"_ _0\"></span>nSel<span class=\"_ _0\"></span>ect<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">25<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4c ff2 fs5 fc0 sc0 ls1 ws1\">2.41<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Opt<span class=\"_ _0\"></span>ionIn<span class=\"_ _0\"></span>dex<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">25<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4d ff2 fs5 fc0 sc0 ls1 ws1\">2.42<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Sce<span class=\"_ _0\"></span>neWi<span class=\"_ _0\"></span>dth<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">25<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4e ff2 fs5 fc0 sc0 ls1 ws1\">2.43<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Sce<span class=\"_ _0\"></span>neHe<span class=\"_ _0\"></span>ight<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>..............................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">25<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4f ff2 fs5 fc0 sc0 ls1 ws1\">2.44<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Del<span class=\"_ _0\"></span>taTi<span class=\"_ _0\"></span>me<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">26<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y50 ff2 fs5 fc0 sc0 ls1 ws1\">2.45<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>DELT<span class=\"_ _0\"></span>A_TI<span class=\"_ _0\"></span>ME<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">............................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">26<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y51 ff2 fs5 fc0 sc0 ls1 ws1\">2.46<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>Butto<span class=\"_ _0\"></span>nSel<span class=\"_ _0\"></span>ect<span class=\"_ _0\"></span>Scale<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>...............................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">26<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y52 ff2 fs5 fc0 sc0 ls1 ws1\">2.47<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Vie<span class=\"_ _0\"></span>wX<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">26<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y53 ff2 fs5 fc0 sc0 ls1 ws1\">2.48<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Vie<span class=\"_ _0\"></span>wY<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">26<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y54 ff2 fs5 fc0 sc0 ls1 ws1\">2.49<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Vie<span class=\"_ _0\"></span>wW<span class=\"ff1 ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">26<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y55 ff2 fs5 fc0 sc0 ls1 ws1\">2.50<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Vie<span class=\"_ _0\"></span>wH<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.......................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">26<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y56 ff2 fs5 fc0 sc0 ls1 ws1\">2.51<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Mous<span class=\"_ _0\"></span>eIn<span class=\"_ _0\"></span>Coll<span class=\"_ _0\"></span>isio<span class=\"_ _0\"></span>n<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">26<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y57 ff2 fs5 fc0 sc0 ls1 ws1\">2.52<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Mous<span class=\"_ _0\"></span>eCur<span class=\"_ _0\"></span>ren<span class=\"_ _0\"></span>tEqu<span class=\"_ _0\"></span>alTo<span class=\"_ _0\"></span>Prev<span class=\"_ _0\"></span>ious<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..............................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">27<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y58 ff2 fs5 fc0 sc0 ls1 ws1\">2.53<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>BgC<span class=\"_ _0\"></span>olor<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">27<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y59 ff2 fs5 fc0 sc0 ls1 ws1\">2.54<span class=\"ff5 ls6 ws0\"> </span>inV<span class=\"_ _0\"></span>iewR<span class=\"_ _0\"></span>ec<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">27<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5a ff2 fs5 fc0 sc0 ls1 ws1\">2.55<span class=\"ff5 ls6 ws0\"> </span>mou<span class=\"_ _0\"></span>seC<span class=\"_ _0\"></span>olli<span class=\"_ _0\"></span>sion<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">27<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5b ff2 fs5 fc0 sc0 ls1 ws1\">2.56<span class=\"ff5 ls6 ws0\"> </span>SDM<span class=\"_ _0\"></span>man<span class=\"_ _0\"></span>ageS<span class=\"_ _0\"></span>cene<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.........................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">28<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5c ff2 fs5 fc0 sc0 ls1 ws1\">2.57<span class=\"ff5 ls6 ws0\"> </span>SDM<span class=\"_ _0\"></span>man<span class=\"_ _0\"></span>ageS<span class=\"_ _0\"></span>cene<span class=\"_ _0\"></span>Even<span class=\"_ _0\"></span>ts<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">28<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5d ff2 fs5 fc0 sc0 ls1 ws1\">2.58<span class=\"ff5 ls6 ws0\"> </span>SDM<span class=\"_ _0\"></span>man<span class=\"_ _0\"></span>ageS<span class=\"_ _0\"></span>cene<span class=\"_ _0\"></span>MsgAn<span class=\"_ _0\"></span>swe<span class=\"_ _0\"></span>rs<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>....................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">28<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5e ff2 fs5 fc0 sc0 ls1 ws1\">2.59<span class=\"ff5 ls6 ws0\"> </span>SDM<span class=\"_ _0\"></span>call<span class=\"_ _0\"></span>Obj<span class=\"_ _0\"></span>ects<span class=\"_ _0\"></span>Event<span class=\"_ _0\"></span>s<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>...................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">28<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5f ff2 fs5 fc0 sc0 ls1 ws1\">2.60<span class=\"ff5 lsb ws0\"> </span>SDM<span class=\"_ _0\"></span>st<span class=\"_ _0\"></span>ep<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4\">28<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x7 h8 y60 ff2 fs5 fc0 sc0 ls1 ws1\">2.61<span class=\"ff5 ls6 ws0\"> </span>SDM<span class=\"_ _0\"></span>draw<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>.......................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">29<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y61 ff2 fs5 fc0 sc0 ls1 ws1\">2.62<span class=\"ff5 ls6 ws0\"> </span>cre<span class=\"_ _0\"></span>ateS<span class=\"_ _0\"></span>pri<span class=\"_ _0\"></span>te<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">29<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y62 ff2 fs5 fc0 sc0 ls1 ws1\">2.63<span class=\"ff5 ls6 ws0\"> </span>GSM<span class=\"_ _0\"></span>pla<span class=\"_ _0\"></span>ySou<span class=\"_ _0\"></span>nd<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">29<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y63 ff2 fs5 fc0 sc0 ls1 ws1\">2.64<span class=\"ff5 ls6 ws0\"> </span>GSM<span class=\"_ _0\"></span>pla<span class=\"_ _0\"></span>yMus<span class=\"_ _0\"></span>ic<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">29<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y64 ff2 fs5 fc0 sc0 ls1 ws1\">2.65<span class=\"ff5 ls6 ws0\"> </span>GRM<span class=\"_ _0\"></span>use<span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Syst<span class=\"_ _0\"></span>emFo<span class=\"_ _0\"></span>nt<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>.............................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">29<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y65 ff2 fs5 fc0 sc0 ls1 ws1\">2.66<span class=\"ff5 ls6 ws0\"> </span>GRM<span class=\"_ _0\"></span>use<span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Syst<span class=\"_ _0\"></span>emTe<span class=\"_ _0\"></span>xture<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">29<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y66 ff2 fs5 fc0 sc0 ls1 ws1\">2.67<span class=\"ff5 ls6 ws0\"> </span>GSM<span class=\"_ _0\"></span>useG<span class=\"_ _0\"></span>ameS<span class=\"_ _0\"></span>yst<span class=\"_ _0\"></span>emS<span class=\"_ _0\"></span>ound<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">29<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y67 ff2 fs5 fc0 sc0 ls1 ws1\">2.68<span class=\"ff5 lsb ws0\"> </span>GSM<span class=\"_ _0\"></span>useG<span class=\"_ _0\"></span>ameS<span class=\"_ _0\"></span>yst<span class=\"_ _0\"></span>emMu<span class=\"_ _0\"></span>sic<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">30<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y68 ff2 fs5 fc0 sc0 ls1 ws1\">2.69<span class=\"ff5 ls6 ws0\"> </span>GRM<span class=\"_ _0\"></span>use<span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Syst<span class=\"_ _0\"></span>emRe<span class=\"_ _0\"></span>sour<span class=\"_ _0\"></span>ces<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">30<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y69 ff2 fs5 fc0 sc0 ls1 ws1\">2.70<span class=\"ff5 ls6 ws0\"> </span>sh<span class=\"_ _0\"></span>owMes<span class=\"_ _0\"></span>sag<span class=\"_ _0\"></span>eBox<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>..........................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">30<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6a ff2 fs5 fc0 sc0 ls1 ws1\">2.71<span class=\"ff5 ls6 ws0\"> </span>con<span class=\"_ _0\"></span>tro<span class=\"_ _0\"></span>lEven<span class=\"_ _0\"></span>tFoc<span class=\"_ _0\"></span>usCl<span class=\"_ _0\"></span>osi<span class=\"_ _0\"></span>ng<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">............................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">30<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y6b ff2 fs5 fc0 sc0 ls1 ws1\">2.72<span class=\"ff5 ls6 ws0\"> </span><span class=\"ws0\">Other m<span class=\"_ _0\"></span>eth<span class=\"_ _0\"></span>ods<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">30<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y6c ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Protected el<span class=\"_ _0\"></span>emen<span class=\"_ _0\"></span>ts<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">30<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">3.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enum M<span class=\"_ _0\"></span>sgAn<span class=\"_ _0\"></span>swe<span class=\"_ _0\"></span>r<span class=\"ff1\"> <span class=\"ls2 ws2\">..............................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">30<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y6e ff2 fs5 fc0 sc0 ls1 ws1\">3.2<span class=\"ff5 ls4 ws0\"> </span>up<span class=\"_ _0\"></span>date<span class=\"_ _0\"></span>Msg<span class=\"_ _0\"></span>Box<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">31<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6f ff2 fs5 fc0 sc0 ls1 ws1\">3.3<span class=\"ff5 ls4 ws0\"> </span>up<span class=\"_ _0\"></span>date<span class=\"_ _0\"></span>Time<span class=\"_ _0\"></span>Wait<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">31<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls1 ws1\">3.4<span class=\"ff5 ls4 ws0\"> </span>dr<span class=\"_ _0\"></span>awMs<span class=\"_ _0\"></span>gBo<span class=\"_ _0\"></span>x<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">31<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf17\" data-dest-detail='[23,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:800.150000px;width:470.300000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf17\" data-dest-detail='[23,\"XYZ\",33,267,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:782.720000px;width:470.400000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf17\" data-dest-detail='[23,\"XYZ\",33,173,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:764.730000px;width:470.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf17\" data-dest-detail='[23,\"XYZ\",33,79,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:747.290000px;width:470.500000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf18\" data-dest-detail='[24,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:729.810000px;width:470.300000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf18\" data-dest-detail='[24,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:711.820000px;width:470.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf18\" data-dest-detail='[24,\"XYZ\",33,79,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:606.050000px;width:470.350000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf19\" data-dest-detail='[25,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:570.580000px;width:470.350000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf19\" data-dest-detail='[25,\"XYZ\",33,79,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:464.810000px;width:470.300000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1a\" data-dest-detail='[26,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:411.900000px;width:470.250000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1a\" data-dest-detail='[26,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:394.470000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1b\" data-dest-detail='[27,\"XYZ\",33,201,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:324.120000px;width:470.150000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1b\" data-dest-detail='[27,\"XYZ\",33,97,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.750000px;bottom:306.140000px;width:469.850000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1c\" data-dest-detail='[28,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:270.710000px;width:470.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1c\" data-dest-detail='[28,\"XYZ\",33,531,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:253.230000px;width:470.150000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1c\" data-dest-detail='[28,\"XYZ\",33,439,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:235.790000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1d\" data-dest-detail='[29,\"XYZ\",33,337,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:96.751000px;width:470.200000px;height:17.439000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1e\" data-dest-detail='[30,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:43.842000px;width:481.200000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1e\" data-dest-detail='[30,\"XYZ\",33,546,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:25.856000px;width:481.000000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4\" class=\"pf w0 h0\" data-page-no=\"4\"><div class=\"pc pc4 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff4 fs5 fc0 sc0 ls1 ws0\">SDM (Step <span class=\"_ _0\"></span>and Draw M<span class=\"_ _0\"></span>anage<span class=\"_ _0\"></span>r)<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">31<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y71 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class S<span class=\"_ _0\"></span>DM<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">31<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics <span class=\"_ _0\"></span>elements <span class=\"lsc ws7\">of</span> <span class=\"_ _0\"></span>SD<span class=\"_ _0\"></span>M<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"ls2 ws2\">........................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">31<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y46 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>SDM<span class=\"_ _0\"></span>scene<span class=\"_ _0\"></span>Obje<span class=\"_ _0\"></span>cts<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">..........................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">31<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y72 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>SD<span class=\"_ _0\"></span>Mget<span class=\"_ _0\"></span>Obje<span class=\"_ _0\"></span>ct<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">32<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y48 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>SD<span class=\"_ _0\"></span>MaddS<span class=\"_ _0\"></span>cen<span class=\"_ _0\"></span>eObj<span class=\"_ _0\"></span>ect<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">32<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y73 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>SD<span class=\"_ _0\"></span>MaddS<span class=\"_ _0\"></span>pri<span class=\"_ _0\"></span>te<span class=\"ff1 ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">32<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y74 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>SD<span class=\"_ _0\"></span>Mset<span class=\"_ _0\"></span>ObjD<span class=\"_ _0\"></span>epth<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">32<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y75 ff4 fs5 fc0 sc0 ls1 ws0\">Game So<span class=\"_ _0\"></span>und<span class=\"ff1\"> <span class=\"ls2 ws2\">......................................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">33<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y76 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meS<span class=\"_ _0\"></span>ound<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>....................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">33<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4d ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics <span class=\"_ _0\"></span>elements <span class=\"lsc ws7\">of</span> <span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Sou<span class=\"_ _0\"></span>nd<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">33<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4e ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eSo<span class=\"_ _0\"></span>und<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">........................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">33<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y77 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>lo<span class=\"_ _0\"></span>adRes<span class=\"_ _0\"></span>our<span class=\"_ _0\"></span>ces<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">33<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y50 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSo<span class=\"_ _0\"></span>undBu<span class=\"_ _0\"></span>ffer<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">33<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y51 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSo<span class=\"_ _0\"></span>und<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">33<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y78 ff4 fs5 fc0 sc0 ls1 ws0\">Game Mus<span class=\"_ _0\"></span>ic<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>.......................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">33<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y79 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meMu<span class=\"_ _0\"></span>sic<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">33<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y54 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics <span class=\"_ _0\"></span>elements <span class=\"lsc ws7\">of</span> <span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Mus<span class=\"_ _0\"></span>ic<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">34<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y7a ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eMu<span class=\"_ _0\"></span>sic<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>.........................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">34<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7b ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>lo<span class=\"_ _0\"></span>adRes<span class=\"_ _0\"></span>our<span class=\"_ _0\"></span>ces<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">34<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y57 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tMus<span class=\"_ _0\"></span>ic<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.............................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">34<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y7c ff2 fs5 fc0 sc0 ls1 ws0\">GSM (Game Sound <span class=\"_ _0\"></span>Mana<span class=\"_ _0\"></span>ger)<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">34<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y59 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class G<span class=\"_ _0\"></span>SM<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">.<span class=\"_ _3\"></span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">34<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y7d ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics <span class=\"_ _0\"></span>elements <span class=\"lsc ws7\">of</span> <span class=\"_ _0\"></span>GS<span class=\"_ _0\"></span>M<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>.........................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">34<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y7e ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">GSM <span class=\"_ _0\"></span>Cont<span class=\"_ _0\"></span>aine<span class=\"_ _0\"></span>rs<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">34<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y5c ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>MaddS<span class=\"_ _0\"></span>ou<span class=\"_ _0\"></span>nd<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>....................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">34<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7f ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>MaddS<span class=\"_ _0\"></span>ou<span class=\"_ _0\"></span>ndOb<span class=\"_ _0\"></span>ject<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">35<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y80 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>MaddM<span class=\"_ _0\"></span>us<span class=\"_ _0\"></span>ic<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">35<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5f ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>MaddM<span class=\"_ _0\"></span>us<span class=\"_ _0\"></span>icOb<span class=\"_ _0\"></span>ject<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">35<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y81 ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>Mpau<span class=\"_ _0\"></span>seS<span class=\"_ _0\"></span>ound<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">35<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y61 ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>Mpau<span class=\"_ _0\"></span>seS<span class=\"_ _0\"></span>ound<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">35<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y82 ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>Mpau<span class=\"_ _0\"></span>seMu<span class=\"_ _0\"></span>sic<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">35<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y83 ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>Msto<span class=\"_ _0\"></span>pMus<span class=\"_ _0\"></span>ic<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">35<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y64 ff2 fs5 fc0 sc0 ls1 ws1\">2.10<span class=\"ff5 ls6 ws0\"> </span>GSM<span class=\"_ _0\"></span>del<span class=\"_ _0\"></span>eteS<span class=\"_ _0\"></span>ound<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">...........................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">36<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y84 ff2 fs5 fc0 sc0 ls1 ws1\">2.11<span class=\"ff5 ls6 ws0\"> </span>GSM<span class=\"_ _0\"></span>del<span class=\"_ _0\"></span>eteMu<span class=\"_ _0\"></span>sic<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>............................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">36<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y85 ff2 fs5 fc0 sc0 ls1 ws1\">2.12<span class=\"ff5 ls6 ws0\"> </span>GSM<span class=\"_ _0\"></span>getS<span class=\"_ _0\"></span>oun<span class=\"_ _0\"></span>d<span class=\"ff1 ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">36<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y86 ff2 fs5 fc0 sc0 ls1 ws1\">2.13<span class=\"ff5 ls6 ws0\"> </span>GSM<span class=\"_ _0\"></span>getM<span class=\"_ _0\"></span>usic<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>.................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">36<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y87 ff2 fs5 fc0 sc0 ls1 ws1\">2.14<span class=\"ff5 ls6 ws0\"> </span><span class=\"ws0\">Other m<span class=\"_ _0\"></span>eth<span class=\"_ _0\"></span>ods<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">36<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y88 ff4 fs5 fc0 sc0 ls1 ws0\">Game Te<span class=\"_ _0\"></span>xture<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"ls2 ws2\">....................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">36<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y6a ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meT<span class=\"_ _0\"></span>extu<span class=\"_ _0\"></span>re<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y89 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics <span class=\"_ _0\"></span>elements <span class=\"lsc ws7\">of</span> <span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Tex<span class=\"_ _0\"></span>ture<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y3e ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eTe<span class=\"_ _0\"></span>xtu<span class=\"_ _0\"></span>re<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>lo<span class=\"_ _0\"></span>adRes<span class=\"_ _0\"></span>our<span class=\"_ _0\"></span>ces<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8a ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tTe<span class=\"_ _0\"></span>xture<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8b ff4 fs5 fc0 sc0 ls1 ws0\">Game F<span class=\"_ _0\"></span>on<span class=\"_ _0\"></span>t<span class=\"ff1\"> <span class=\"ls2 ws2\">.........................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meF<span class=\"_ _0\"></span>ont<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>.......................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div></div><a class=\"l\" href=\"#pf1e\" data-dest-detail='[30,\"XYZ\",33,324,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:800.150000px;width:514.250000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1e\" data-dest-detail='[30,\"XYZ\",33,170,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:764.730000px;width:492.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1f\" data-dest-detail='[31,\"XYZ\",33,780,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:729.260000px;width:481.100000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1f\" data-dest-detail='[31,\"XYZ\",33,340,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:693.840000px;width:481.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1f\" data-dest-detail='[31,\"XYZ\",33,230,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.400000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",87,810,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:658.960000px;width:514.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,669,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:623.490000px;width:492.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,646,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:606.050000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:588.070000px;width:481.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,197,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:535.160000px;width:514.250000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,795,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:500.290000px;width:492.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:482.250000px;width:481.000000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,676,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:464.810000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,464,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:429.390000px;width:514.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,327,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:394.470000px;width:492.150000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,184,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:359.050000px;width:481.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,771,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:341.060000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:323.570000px;width:480.950000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:306.140000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:288.150000px;width:481.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,267,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:270.710000px;width:480.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,173,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:253.280000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,79,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:235.240000px;width:481.000000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf23\" data-dest-detail='[35,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:217.810000px;width:470.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf23\" data-dest-detail='[35,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:202.520000px;width:470.000000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf23\" data-dest-detail='[35,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:184.530000px;width:470.250000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf23\" data-dest-detail='[35,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:167.100000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf23\" data-dest-detail='[35,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:149.060000px;width:470.200000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf24\" data-dest-detail='[36,\"XYZ\",33,113,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:61.279000px;width:481.050000px;height:17.486000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5\" class=\"pf w0 h0\" data-page-no=\"5\"><div class=\"pc pc5 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics <span class=\"_ _0\"></span>elements <span class=\"lsc ws7\">of</span> <span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Font<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>...............................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y44 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eFo<span class=\"_ _0\"></span>nt<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>lo<span class=\"_ _0\"></span>adRes<span class=\"_ _0\"></span>our<span class=\"_ _0\"></span>ces<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">37<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y46 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tFo<span class=\"_ _0\"></span>nt<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">38<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y47 ff2 fs5 fc0 sc0 ls1 ws0\">GRM (Graphic Resource Ma<span class=\"_ _0\"></span>nage<span class=\"_ _0\"></span>r)<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">38<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y48 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class G<span class=\"_ _0\"></span>RM<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">38<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y49 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics <span class=\"_ _0\"></span>element <span class=\"lsc ws7\">of</span> <span class=\"_ _0\"></span>GR<span class=\"_ _0\"></span>M<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>..........................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 lsa ws6\">38<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4a ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">GRM C<span class=\"_ _0\"></span>ont<span class=\"_ _0\"></span>ainer<span class=\"_ _0\"></span>s<span class=\"ff1 ls2 ws2\">..................................................................................................................................................................................</span><span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">38<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y4b ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>GRM<span class=\"_ _0\"></span>addF<span class=\"_ _0\"></span>ont<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">38<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4c ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>GRM<span class=\"_ _0\"></span>addF<span class=\"_ _0\"></span>ont<span class=\"_ _0\"></span>Obje<span class=\"_ _0\"></span>ct<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>............................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">38<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8c ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>GRM<span class=\"_ _0\"></span>addT<span class=\"_ _0\"></span>ext<span class=\"_ _0\"></span>ure<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">38<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8d ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>GRM<span class=\"_ _0\"></span>addT<span class=\"_ _0\"></span>ext<span class=\"_ _0\"></span>ureO<span class=\"_ _0\"></span>bjec<span class=\"_ _0\"></span>t<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"_ _3\"></span>.......<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">39<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4f ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>GRM<span class=\"_ _0\"></span>get<span class=\"_ _0\"></span>Font<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">39<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8e ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>GRM<span class=\"_ _0\"></span>get<span class=\"_ _0\"></span>Textu<span class=\"_ _0\"></span>re<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>..................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">39<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y51 ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>GRM<span class=\"_ _0\"></span>del<span class=\"_ _0\"></span>eteF<span class=\"_ _0\"></span>ont<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">39<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y52 ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>GRM<span class=\"_ _0\"></span>del<span class=\"_ _0\"></span>eteT<span class=\"_ _0\"></span>extu<span class=\"_ _0\"></span>re<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>.............................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">39<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8f ff4 fs5 fc0 sc0 ls1 ws0\">Transition <span class=\"_ _0\"></span>Eff<span class=\"_ _0\"></span>ect<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">39<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y54 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Transition Ef<span class=\"_ _0\"></span>fect<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>............................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">39<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y55 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics element <span class=\"_ _0\"></span><span class=\"lsd ws8\">of<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> Transition E<span class=\"_ _0\"></span>ffe<span class=\"_ _0\"></span>ct<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">......................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 lsa ws6\">40<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y90 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">Enum <span class=\"_ _0\"></span>Tra<span class=\"_ _0\"></span>nsit<span class=\"_ _0\"></span>ion<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">40<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y57 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>Tr<span class=\"_ _0\"></span>ans<span class=\"_ _0\"></span>ition<span class=\"_ _0\"></span>Effe<span class=\"_ _0\"></span>ct<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">40<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y58 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>s<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">40<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y59 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>d<span class=\"_ _0\"></span>ra<span class=\"_ _0\"></span>w<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">40<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7d ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tTy<span class=\"_ _0\"></span>pe<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">40<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5b ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tTr<span class=\"_ _0\"></span>ansit<span class=\"_ _0\"></span>ion<span class=\"_ _0\"></span>End<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">...............................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">40<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y5c ff2 fs5 fc0 sc0 ls1 ws1\">Ent<span class=\"_ _0\"></span>it<span class=\"_ _0\"></span>ies<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">41<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5d ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ma<span class=\"_ _0\"></span>inOb<span class=\"_ _0\"></span>jec<span class=\"_ _0\"></span>t<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">41<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y91 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics <span class=\"_ _0\"></span>elements <span class=\"lsc ws7\">of</span> <span class=\"_ _0\"></span>Main<span class=\"_ _0\"></span>Obje<span class=\"_ _0\"></span>t<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">41<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y5f ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Ma<span class=\"_ _0\"></span>inOb<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.........................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">41<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y60 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>in<span class=\"_ _0\"></span>stan<span class=\"_ _0\"></span>ceNu<span class=\"_ _0\"></span>mbe<span class=\"_ _0\"></span>r<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">41<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y92 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>SDM<span class=\"_ _0\"></span>call<span class=\"_ _0\"></span>Step<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">41<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y93 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>SDM<span class=\"_ _0\"></span>call<span class=\"_ _0\"></span>Draw<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">42<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y94 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>SDM<span class=\"_ _0\"></span>call<span class=\"_ _0\"></span>Event<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">42<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y95 ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>s<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">42<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y84 ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>eve<span class=\"_ _0\"></span>nt<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">42<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y96 ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tXSt<span class=\"_ _0\"></span>art<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">42<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y97 ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tYSt<span class=\"_ _0\"></span>art<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">42<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y98 ff2 fs5 fc0 sc0 ls1 ws1\">2.10<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>XPr<span class=\"_ _0\"></span>eviou<span class=\"_ _0\"></span>s<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">42<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y99 ff2 fs5 fc0 sc0 ls1 ws1\">2.11<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>YPr<span class=\"_ _0\"></span>eviou<span class=\"_ _0\"></span>s<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">42<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6a ff2 fs5 fc0 sc0 ls1 ws1\">2.12<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Star<span class=\"_ _0\"></span>tPo<span class=\"_ _0\"></span>siti<span class=\"_ _0\"></span>on<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">43<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6b ff2 fs5 fc0 sc0 ls1 ws1\">2.13<span class=\"ff5 ls6 ws0\"> </span>se<span class=\"_ _0\"></span>t<span class=\"_ _0\"></span>X<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">43<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9a ff2 fs5 fc0 sc0 ls1 ws1\">2.14<span class=\"ff5 ls6 ws0\"> </span>se<span class=\"_ _0\"></span>t<span class=\"_ _0\"></span>Y<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">43<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">2.15<span class=\"ff5 ls6 ws0\"> </span>mov<span class=\"_ _0\"></span>eX<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>............................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">43<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6e ff2 fs5 fc0 sc0 ls1 ws1\">2.16<span class=\"ff5 ls6 ws0\"> </span>mov<span class=\"_ _0\"></span>eY<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>............................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">43<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6f ff2 fs5 fc0 sc0 ls1 ws1\">2.17<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Pos<span class=\"_ _0\"></span>itio<span class=\"_ _0\"></span>n<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">43<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls1 ws1\">2.18<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>iteS<span class=\"_ _0\"></span>cale<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">43<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,643,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:729.860000px;width:514.300000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,493,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:694.390000px;width:492.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,362,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:658.960000px;width:481.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,198,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:641.480000px;width:481.200000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,80,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:624.040000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:606.050000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:588.620000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:571.180000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:553.150000px;width:481.100000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,267,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:535.710000px;width:480.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,149,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:518.270000px;width:513.900000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf27\" data-dest-detail='[39,\"XYZ\",33,474,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:429.940000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf27\" data-dest-detail='[39,\"XYZ\",33,392,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:411.960000px;width:481.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf27\" data-dest-detail='[39,\"XYZ\",33,298,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:394.470000px;width:481.050000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf27\" data-dest-detail='[39,\"XYZ\",33,193,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:377.030000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf28\" data-dest-detail='[40,\"XYZ\",87,810,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:359.050000px;width:514.250000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf28\" data-dest-detail='[40,\"XYZ\",33,641,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:324.170000px;width:492.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf28\" data-dest-detail='[40,\"XYZ\",33,619,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:306.140000px;width:481.150000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf29\" data-dest-detail='[41,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:219.960000px;width:481.000000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf29\" data-dest-detail='[41,\"XYZ\",33,501,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:202.520000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf29\" data-dest-detail='[41,\"XYZ\",33,404,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:185.080000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf29\" data-dest-detail='[41,\"XYZ\",33,300,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:167.100000px;width:481.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2a\" data-dest-detail='[42,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:114.190000px;width:470.250000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2a\" data-dest-detail='[42,\"XYZ\",33,302,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:25.856000px;width:470.100000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2a\" data-dest-detail='[42,\"XYZ\",33,208,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:8.419900px;width:470.150000px;height:17.436100px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6\" class=\"pf w0 h0\" data-page-no=\"6\"><div class=\"pc pc6 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws1\">2.19<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Spe<span class=\"_ _0\"></span>ed<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">43<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y71 ff2 fs5 fc0 sc0 ls1 ws1\">2.20<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Hsp<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"_ _3\"></span>............................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">44<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls1 ws1\">2.21<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Vsp<span class=\"ff1 ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">44<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y9b ff2 fs5 fc0 sc0 ls1 ws1\">2.22<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Ang<span class=\"_ _0\"></span>ular<span class=\"_ _0\"></span>Move<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">44<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y72 ff2 fs5 fc0 sc0 ls1 ws1\">2.23<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Fram<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>........................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">44<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9c ff2 fs5 fc0 sc0 ls1 ws1\">2.24<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Fram<span class=\"_ _0\"></span>eSt<span class=\"_ _0\"></span>art<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">44<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9d ff2 fs5 fc0 sc0 ls1 ws1\">2.25<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Fram<span class=\"_ _0\"></span>eEn<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">44<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y9e ff2 fs5 fc0 sc0 ls1 ws1\">2.26<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eXs<span class=\"_ _0\"></span>cale<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">44<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4b ff2 fs5 fc0 sc0 ls1 ws1\">2.27<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eYs<span class=\"_ _0\"></span>cale<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">44<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4c ff2 fs5 fc0 sc0 ls1 ws1\">2.28<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eSc<span class=\"_ _0\"></span>ale<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">45<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4d ff2 fs5 fc0 sc0 ls1 ws1\">2.29<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eSc<span class=\"_ _0\"></span>aleX<span class=\"_ _0\"></span>_Y<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">45<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8d ff2 fs5 fc0 sc0 ls1 ws1\">2.30<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eAng<span class=\"_ _0\"></span>le<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">45<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4f ff2 fs5 fc0 sc0 ls1 ws1\">2.31<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>XOf<span class=\"_ _0\"></span>fset<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">45<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y50 ff2 fs5 fc0 sc0 ls1 ws1\">2.32<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>YOf<span class=\"_ _0\"></span>fset<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">45<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y51 ff2 fs5 fc0 sc0 ls1 ws1\">2.33<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>XYO<span class=\"_ _0\"></span>ffse<span class=\"_ _0\"></span>t<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">45<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9f ff2 fs5 fc0 sc0 ls1 ws1\">2.34<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>XYO<span class=\"_ _0\"></span>ffse<span class=\"_ _0\"></span>t<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">45<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y53 ff2 fs5 fc0 sc0 ls1 ws1\">2.35<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Tim<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>..........................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">45<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y54 ff2 fs5 fc0 sc0 ls1 ws1\">2.36<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eAl<span class=\"_ _0\"></span>pha<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>...............................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">46<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7a ff2 fs5 fc0 sc0 ls1 ws1\">2.37<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eIn<span class=\"_ _0\"></span>dex<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">46<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y56 ff2 fs5 fc0 sc0 ls1 ws1\">2.38<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Mask<span class=\"_ _0\"></span>W<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">46<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y57 ff2 fs5 fc0 sc0 ls1 ws1\">2.39<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Mask<span class=\"_ _0\"></span>H<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.......................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">46<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7c ff2 fs5 fc0 sc0 ls1 ws1\">2.40<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Rect<span class=\"_ _0\"></span>angl<span class=\"_ _0\"></span>eMas<span class=\"_ _0\"></span>k<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">46<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y59 ff2 fs5 fc0 sc0 ls1 ws1\">2.41<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Cir<span class=\"_ _0\"></span>cleM<span class=\"_ _0\"></span>ask<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">46<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y5a ff2 fs5 fc0 sc0 ls1 ws1\">2.42<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>IsAc<span class=\"_ _0\"></span>tiv<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">46<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y7e ff2 fs5 fc0 sc0 ls1 ws1\">2.43<span class=\"ff5 ls6 ws0\"> </span>upd<span class=\"_ _0\"></span>ateC<span class=\"_ _0\"></span>olli<span class=\"_ _0\"></span>sio<span class=\"_ _0\"></span>nMask<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">46<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5c ff2 fs5 fc0 sc0 ls1 ws1\">2.44<span class=\"ff5 ls6 ws0\"> </span>cen<span class=\"_ _0\"></span>terC<span class=\"_ _0\"></span>oll<span class=\"_ _0\"></span>isio<span class=\"_ _0\"></span>nMas<span class=\"_ _0\"></span>k<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">47<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya0 ff2 fs5 fc0 sc0 ls1 ws1\">2.45<span class=\"ff5 ls6 ws0\"> </span>upd<span class=\"_ _0\"></span>ateS<span class=\"_ _0\"></span>pri<span class=\"_ _0\"></span>te<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>..................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">47<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya1 ff2 fs5 fc0 sc0 ls1 ws1\">2.46<span class=\"ff5 ls6 ws0\"> </span>dr<span class=\"_ _0\"></span>aw<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">47<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya2 ff2 fs5 fc0 sc0 ls1 ws1\">2.47<span class=\"ff5 ls6 ws0\"> </span>draw<span class=\"_ _0\"></span>Mas<span class=\"_ _0\"></span>k<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>......................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">47<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya3 ff2 fs5 fc0 sc0 ls1 ws1\">2.48<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Mask<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">47<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya4 ff2 fs5 fc0 sc0 ls1 ws1\">2.49<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Cir<span class=\"_ _0\"></span>cleM<span class=\"_ _0\"></span>ask<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">48<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya5 ff2 fs5 fc0 sc0 ls1 ws1\">2.50<span class=\"ff5 ls6 ws0\"> </span>ge<span class=\"_ _0\"></span>t<span class=\"_ _0\"></span>X<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">48<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya6 ff2 fs5 fc0 sc0 ls1 ws1\">2.51<span class=\"ff5 ls6 ws0\"> </span>ge<span class=\"_ _0\"></span>t<span class=\"_ _0\"></span>Y<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">48<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y95 ff2 fs5 fc0 sc0 ls1 ws1\">2.52<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>XSt<span class=\"_ _0\"></span>art<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">48<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya7 ff2 fs5 fc0 sc0 ls1 ws1\">2.53<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>YSt<span class=\"_ _0\"></span>art<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">48<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya8 ff2 fs5 fc0 sc0 ls1 ws1\">2.54<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>XPre<span class=\"_ _0\"></span>viou<span class=\"_ _0\"></span>s<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">48<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y97 ff2 fs5 fc0 sc0 ls1 ws1\">2.55<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>YPre<span class=\"_ _0\"></span>viou<span class=\"_ _0\"></span>s<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">48<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y98 ff2 fs5 fc0 sc0 ls1 ws1\">2.56<span class=\"ff5 ls6 ws0\"> </span>dis<span class=\"_ _0\"></span>tant<span class=\"_ _0\"></span>ToPo<span class=\"_ _0\"></span>int<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">48<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y88 ff2 fs5 fc0 sc0 ls1 ws1\">2.57<span class=\"ff5 ls6 ws0\"> </span>dis<span class=\"_ _0\"></span>tant<span class=\"_ _0\"></span>ToO<span class=\"_ _0\"></span>bject<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>.............................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">49<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya9 ff2 fs5 fc0 sc0 ls1 ws1\">2.58<span class=\"ff5 ls6 ws0\"> </span>poi<span class=\"_ _0\"></span>ntDi<span class=\"_ _0\"></span>rect<span class=\"_ _0\"></span>ion<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">49<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yaa ff2 fs5 fc0 sc0 ls1 ws1\">2.59<span class=\"ff5 ls6 ws0\"> </span>poi<span class=\"_ _0\"></span>ntDi<span class=\"_ _0\"></span>rect<span class=\"_ _0\"></span>ion<span class=\"_ _0\"></span>Sprit<span class=\"_ _0\"></span>e<span class=\"ff1 ls2 ws2\">......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">49<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y6c ff2 fs5 fc0 sc0 ls1 ws1\">2.60<span class=\"ff5 lsb ws0\"> </span>get<span class=\"_ _0\"></span>Spee<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">49<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">2.61<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Hsp<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">49<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8a ff2 fs5 fc0 sc0 ls1 ws1\">2.62<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Vsp<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">50<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6f ff2 fs5 fc0 sc0 ls1 ws1\">2.63<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Fra<span class=\"_ _0\"></span>me<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">50<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls1 ws1\">2.64<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Fra<span class=\"_ _0\"></span>meSt<span class=\"_ _0\"></span>art<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">50<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf2a\" data-dest-detail='[42,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:800.150000px;width:470.050000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2b\" data-dest-detail='[43,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:747.240000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2b\" data-dest-detail='[43,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:658.910000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2c\" data-dest-detail='[44,\"XYZ\",33,771,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:641.480000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2c\" data-dest-detail='[44,\"XYZ\",33,267,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:553.150000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2c\" data-dest-detail='[44,\"XYZ\",33,79,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:517.670000px;width:470.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,560,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:464.760000px;width:470.150000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,466,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:447.330000px;width:470.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:429.340000px;width:470.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,267,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:411.900000px;width:470.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,90,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:376.430000px;width:470.150000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2e\" data-dest-detail='[46,\"XYZ\",33,524,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:343.710000px;width:470.050000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2e\" data-dest-detail='[46,\"XYZ\",33,321,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:325.720000px;width:470.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2e\" data-dest-detail='[46,\"XYZ\",33,227,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:308.290000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2e\" data-dest-detail='[46,\"XYZ\",33,133,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:290.250000px;width:470.250000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2f\" data-dest-detail='[47,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:272.810000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2f\" data-dest-detail='[47,\"XYZ\",33,126,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:149.610000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf30\" data-dest-detail='[48,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:131.570000px;width:470.250000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf30\" data-dest-detail='[48,\"XYZ\",33,663,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:114.140000px;width:470.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf30\" data-dest-detail='[48,\"XYZ\",33,462,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:96.151000px;width:470.100000px;height:17.989000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf7\" class=\"pf w0 h0\" data-page-no=\"7\"><div class=\"pc pc7 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws1\">2.65<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Fra<span class=\"_ _0\"></span>meEn<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">50<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yab ff2 fs5 fc0 sc0 ls1 ws1\">2.66<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eXs<span class=\"_ _0\"></span>cale<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">50<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yac ff2 fs5 fc0 sc0 ls1 ws1\">2.67<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eYs<span class=\"_ _0\"></span>cale<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">50<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9b ff2 fs5 fc0 sc0 ls1 ws1\">2.68<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eSc<span class=\"_ _0\"></span>ale<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">50<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y47 ff2 fs5 fc0 sc0 ls1 ws1\">2.69<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eAng<span class=\"_ _0\"></span>le<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">50<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yad ff2 fs5 fc0 sc0 ls1 ws1\">2.70<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>XOff<span class=\"_ _0\"></span>set<span class=\"ff1 ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">51<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y9d ff2 fs5 fc0 sc0 ls1 ws1\">2.71<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>YOff<span class=\"_ _0\"></span>set<span class=\"ff1 ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">51<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 yae ff2 fs5 fc0 sc0 ls1 ws1\">2.72<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Tim<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">51<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yaf ff2 fs5 fc0 sc0 ls1 ws1\">2.73<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Inst<span class=\"_ _0\"></span>anc<span class=\"_ _0\"></span>eId<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">51<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4c ff2 fs5 fc0 sc0 ls1 ws1\">2.74<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Mask<span class=\"_ _0\"></span>W<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">51<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8c ff2 fs5 fc0 sc0 ls1 ws1\">2.75<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Mask<span class=\"_ _0\"></span>H<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>.......................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">51<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb0 ff2 fs5 fc0 sc0 ls1 ws1\">2.76<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>IsAc<span class=\"_ _0\"></span>tiv<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">51<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4f ff2 fs5 fc0 sc0 ls1 ws1\">2.77<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eAl<span class=\"_ _0\"></span>pha<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">51<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8e ff2 fs5 fc0 sc0 ls1 ws1\">2.78<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>eIn<span class=\"_ _0\"></span>dex<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">52<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y51 ff2 fs5 fc0 sc0 ls1 ws1\">2.79<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>iteWi<span class=\"_ _0\"></span>dth<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">52<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9f ff2 fs5 fc0 sc0 ls1 ws1\">2.80<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>iteH<span class=\"_ _0\"></span>eight<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">52<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8f ff2 fs5 fc0 sc0 ls1 ws1\">2.81<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>iteX<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>......................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">52<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y54 ff2 fs5 fc0 sc0 ls1 ws1\">2.82<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>iteY<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>......................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">52<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y55 ff2 fs5 fc0 sc0 ls1 ws1\">2.83<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Text<span class=\"_ _0\"></span>ureW<span class=\"_ _0\"></span>idth<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...........................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">52<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y90 ff2 fs5 fc0 sc0 ls1 ws1\">2.84<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Text<span class=\"_ _0\"></span>ureH<span class=\"_ _0\"></span>eigh<span class=\"_ _0\"></span>t<span class=\"ff1 ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">52<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y57 ff2 fs5 fc0 sc0 ls1 ws1\">2.85<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>iteCe<span class=\"_ _0\"></span>nter<span class=\"_ _0\"></span>X<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">52<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y58 ff2 fs5 fc0 sc0 ls1 ws1\">2.86<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>iteCe<span class=\"_ _0\"></span>nter<span class=\"_ _0\"></span>Y<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">53<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb1 ff2 fs5 fc0 sc0 ls1 ws1\">2.87<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>iteNu<span class=\"_ _0\"></span>mber<span class=\"_ _0\"></span>Sub<span class=\"_ _0\"></span>Imag<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">53<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb2 ff2 fs5 fc0 sc0 ls1 ws1\">2.88<span class=\"ff5 ls6 ws0\"> </span>pla<span class=\"_ _0\"></span>ceMe<span class=\"_ _0\"></span>tti<span class=\"_ _0\"></span>ng<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">53<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb3 ff2 fs5 fc0 sc0 ls1 ws1\">2.89<span class=\"ff5 ls6 ws0\"> </span>inV<span class=\"_ _0\"></span>iewR<span class=\"_ _0\"></span>ec<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">53<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb4 ff2 fs5 fc0 sc0 ls1 ws1\">2.90<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>ite<span class=\"ff1 ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">53<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 ya0 ff2 fs5 fc0 sc0 ls1 ws1\">2.91<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Fram<span class=\"_ _0\"></span>eLi<span class=\"_ _0\"></span>mit<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>...............................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">53<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb5 ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Other funct<span class=\"_ _0\"></span>ions <span class=\"lsc ws7\">of</span> MainO<span class=\"_ _0\"></span>bjec<span class=\"_ _0\"></span>t<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">53<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ya2 ff2 fs5 fc0 sc0 ls1 ws1\">3.1<span class=\"ff5 ls4 ws0\"> </span>in<span class=\"_ _0\"></span>stan<span class=\"_ _0\"></span>ceEx<span class=\"_ _0\"></span>ist<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">53<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb6 ff2 fs5 fc0 sc0 ls1 ws1\">3.2<span class=\"ff5 ls4 ws0\"> </span>ope<span class=\"_ _0\"></span>rat<span class=\"_ _0\"></span>or()<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">54<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb7 ff2 fs5 fc0 sc0 ls1 ws1\">3.3<span class=\"ff5 ls4 ws0\"> </span>so<span class=\"_ _0\"></span>rtO<span class=\"_ _0\"></span>bjArr<span class=\"_ _0\"></span>ayBy<span class=\"_ _0\"></span>X<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">54<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya5 ff2 fs5 fc0 sc0 ls1 ws1\">3.4<span class=\"ff5 ls4 ws0\"> </span>so<span class=\"_ _0\"></span>rtO<span class=\"_ _0\"></span>bjArr<span class=\"_ _0\"></span>ayBy<span class=\"_ _0\"></span>Dept<span class=\"_ _0\"></span>h<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">54<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb8 ff2 fs5 fc0 sc0 ls1 ws1\">3.5<span class=\"ff5 ls4 ws0\"> </span>ope<span class=\"_ _0\"></span>rat<span class=\"_ _0\"></span>or&lt;<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">55<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb9 ff4 fs5 fc0 sc0 ls1 ws0\">Forms for collisi<span class=\"_ _0\"></span>on masks<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">55<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y84 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Rec<span class=\"_ _0\"></span>tan<span class=\"_ _0\"></span>gle<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">55<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yba ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ci<span class=\"_ _0\"></span>rcl<span class=\"_ _0\"></span>e<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>...............................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">55<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y97 ff4 fs5 fc0 sc0 ls1 ws0\">The Parent Clas<span class=\"_ _0\"></span>ses <span class=\"lse ws9\">of</span> Mai<span class=\"_ _0\"></span>nOb<span class=\"_ _0\"></span>ject<span class=\"ff1 ls2 ws2\">......................................................................................................................................................................</span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">55<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y98 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class De<span class=\"_ _0\"></span>pth<span class=\"_ _0\"></span>Obje<span class=\"_ _0\"></span>ct<span class=\"ff1 ls2 ws2\">....................................................................................................................................................................................</span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">55<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y69 ff2 fs5 fc0 sc0 ls1 ws1\">1.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enum <span class=\"_ _0\"></span>Dept<span class=\"_ _0\"></span>h<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 lsa ws6\">56<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ya9 ff2 fs5 fc0 sc0 ls1 ws1\">1.2<span class=\"ff5 ls4 ws0\"> </span>Dep<span class=\"_ _0\"></span>thO<span class=\"_ _0\"></span>bje<span class=\"_ _0\"></span>ct<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">56<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ybb ff2 fs5 fc0 sc0 ls1 ws1\">1.3<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tDep<span class=\"_ _0\"></span>th<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">56<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9a ff2 fs5 fc0 sc0 ls1 ws1\">1.4<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tDept<span class=\"_ _0\"></span>h<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">56<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class De<span class=\"_ _0\"></span>str<span class=\"_ _0\"></span>ucti<span class=\"_ _0\"></span>ble<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">56<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ybc ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Des<span class=\"_ _0\"></span>tru<span class=\"_ _0\"></span>cti<span class=\"_ _0\"></span>ble<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">56<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ybd ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tDes<span class=\"_ _0\"></span>tro<span class=\"_ _0\"></span>yed<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">56<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>is<span class=\"_ _0\"></span>Dest<span class=\"_ _0\"></span>roy<span class=\"_ _0\"></span>ed<span class=\"ff1 ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">57<span class=\"ls1 ws0\"> </span></span></span></span></div></div><a class=\"l\" href=\"#pf32\" data-dest-detail='[50,\"XYZ\",33,431,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:641.480000px;width:470.250000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf32\" data-dest-detail='[50,\"XYZ\",33,337,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:624.040000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,713,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:414.600000px;width:470.250000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,616,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:396.620000px;width:470.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,403,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:379.180000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,202,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:343.710000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,108,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:326.270000px;width:491.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,96,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:308.290000px;width:481.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf35\" data-dest-detail='[53,\"XYZ\",33,607,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:290.850000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf36\" data-dest-detail='[54,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:237.940000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf36\" data-dest-detail='[54,\"XYZ\",87,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:220.510000px;width:514.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf36\" data-dest-detail='[54,\"XYZ\",33,183,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:167.050000px;width:514.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf37\" data-dest-detail='[55,\"XYZ\",33,498,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:96.701000px;width:481.100000px;height:17.439000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf37\" data-dest-detail='[55,\"XYZ\",33,404,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:79.265000px;width:481.150000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf38\" data-dest-detail='[56,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:8.369800px;width:481.150000px;height:17.986200px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf8\" class=\"pf w0 h0\" data-page-no=\"8\"><div class=\"pc pc8 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class V<span class=\"_ _0\"></span>isib<span class=\"_ _0\"></span>ilit<span class=\"_ _0\"></span>y<span class=\"ff1 ls2 ws2\">..........................................................................................................................................................................................</span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">57<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y44 ff2 fs5 fc0 sc0 ls1 ws1\">3.1<span class=\"ff5 ls4 ws0\"> </span>Vi<span class=\"_ _0\"></span>sib<span class=\"_ _0\"></span>ilit<span class=\"_ _0\"></span>y<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">57<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls1 ws1\">3.2<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tVis<span class=\"_ _0\"></span>ibl<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">57<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9b ff2 fs5 fc0 sc0 ls1 ws1\">3.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tVi<span class=\"_ _0\"></span>sibl<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">57<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y47 ff2 fs5 fc0 sc0 ls8 ws4\">4.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class H<span class=\"_ _0\"></span>ealth<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">57<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y48 ff2 fs5 fc0 sc0 ls1 ws1\">4.1<span class=\"ff5 ls4 ws0\"> </span>He<span class=\"_ _0\"></span>alth<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">57<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y49 ff2 fs5 fc0 sc0 ls1 ws1\">4.2<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tHe<span class=\"_ _0\"></span>alth<span class=\"ff1 ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">58<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 yae ff2 fs5 fc0 sc0 ls1 ws1\">4.3<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tMax<span class=\"_ _0\"></span>Healt<span class=\"_ _0\"></span>h<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">58<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4b ff2 fs5 fc0 sc0 ls1 ws1\">4.4<span class=\"ff5 ls4 ws0\"> </span>add<span class=\"_ _0\"></span>Heal<span class=\"_ _0\"></span>th<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">58<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4c ff2 fs5 fc0 sc0 ls1 ws1\">4.5<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tHe<span class=\"_ _0\"></span>alth<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"_ _3\"></span>............................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">58<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4d ff2 fs5 fc0 sc0 ls1 ws1\">4.6<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tMaxH<span class=\"_ _0\"></span>eal<span class=\"_ _0\"></span>th<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">58<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8d ff2 fs5 fc0 sc0 ls8 ws4\">5.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class H<span class=\"_ _0\"></span>urtE<span class=\"_ _0\"></span>ffect<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">58<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4f ff2 fs5 fc0 sc0 ls1 ws1\">5.1<span class=\"ff5 ls4 ws0\"> </span>Hu<span class=\"_ _0\"></span>rtE<span class=\"_ _0\"></span>ffect<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">58<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y50 ff2 fs5 fc0 sc0 ls1 ws1\">5.2<span class=\"ff5 ls4 ws0\"> </span>hu<span class=\"_ _0\"></span>rtSt<span class=\"_ _0\"></span>ep<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"_ _3\"></span>..............................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">59<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y51 ff2 fs5 fc0 sc0 ls1 ws1\">5.3<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tIsH<span class=\"_ _0\"></span>urt<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">59<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y52 ff2 fs5 fc0 sc0 ls1 ws1\">5.4<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tIsH<span class=\"_ _0\"></span>urt<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">59<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y53 ff2 fs5 fc0 sc0 ls8 ws4\">6.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Sc<span class=\"_ _0\"></span>ore<span class=\"_ _0\"></span>Point<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">59<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y54 ff2 fs5 fc0 sc0 ls1 ws1\">6.1<span class=\"ff5 ls4 ws0\"> </span>Sc<span class=\"_ _0\"></span>oreP<span class=\"_ _0\"></span>oint<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">59<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ybe ff2 fs5 fc0 sc0 ls1 ws1\">6.2<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tSc<span class=\"_ _0\"></span>oreP<span class=\"_ _0\"></span>oint<span class=\"ff1 ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">59<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 ybf ff2 fs5 fc0 sc0 ls1 ws1\">6.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSc<span class=\"_ _0\"></span>oreP<span class=\"_ _0\"></span>oint<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>.....................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">59<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc0 ff2 fs5 fc0 sc0 ls8 ws4\">7.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class S<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">60<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yc1 ff2 fs5 fc0 sc0 ls1 ws1\">7.1<span class=\"ff5 ls4 ws0\"> </span>S<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">60<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc2 ff2 fs5 fc0 sc0 ls1 ws1\">7.2<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tSte<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">60<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb2 ff2 fs5 fc0 sc0 ls1 ws1\">7.3<span class=\"ff5 ls4 ws0\"> </span>add<span class=\"_ _0\"></span>Step<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">60<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc3 ff2 fs5 fc0 sc0 ls1 ws1\">7.4<span class=\"ff5 ls4 ws0\"> </span>re<span class=\"_ _0\"></span>duce<span class=\"_ _0\"></span>Ste<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">60<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb4 ff2 fs5 fc0 sc0 ls1 ws1\">7.5<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSt<span class=\"_ _0\"></span>ep<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">60<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc4 ff2 fs5 fc0 sc0 ls8 ws4\">8.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class N<span class=\"_ _0\"></span>am<span class=\"_ _0\"></span>e<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">60<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ya1 ff2 fs5 fc0 sc0 ls1 ws1\">8.1<span class=\"ff5 ls4 ws0\"> </span>N<span class=\"_ _0\"></span>am<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">60<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya2 ff2 fs5 fc0 sc0 ls1 ws1\">8.2<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tNam<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">61<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb6 ff2 fs5 fc0 sc0 ls1 ws1\">8.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tNam<span class=\"_ _0\"></span>e<span class=\"ff1 ls2 ws2\">..............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">61<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 ya4 ff2 fs5 fc0 sc0 ls8 ws4\">9.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class F<span class=\"_ _0\"></span>ileP<span class=\"_ _0\"></span>ath<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">61<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ya5 ff2 fs5 fc0 sc0 ls1 ws1\">9.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ls10 wsa\">Fi</span>leP<span class=\"_ _0\"></span>ath<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">61<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya6 ff2 fs5 fc0 sc0 ls1 ws1\">9.2<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tFil<span class=\"_ _0\"></span>ePat<span class=\"_ _0\"></span>h<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">61<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y95 ff2 fs5 fc0 sc0 ls1 ws1\">9.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tFi<span class=\"_ _0\"></span>lePat<span class=\"_ _0\"></span>h<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">61<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y84 ff2 fs5 fc0 sc0 ls1 ws1\">9.4<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tFi<span class=\"_ _0\"></span>leIsL<span class=\"_ _0\"></span>oaded<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>..................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">61<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y85 ff2 fs5 fc0 sc0 ls8 ws4\">10.<span class=\"ff5 lsf ws0\"> <span class=\"ff2 ls1\">cl<span class=\"_ _0\"></span>ass T<span class=\"_ _0\"></span>y<span class=\"_ _0\"></span>pe<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">61<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y97 ff2 fs5 fc0 sc0 ls1 ws1\">10.1<span class=\"ff5 ls6 ws0\"> </span>T<span class=\"_ _0\"></span>yp<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">62<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y98 ff2 fs5 fc0 sc0 ls1 ws1\">10.2<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Typ<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">..........................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">62<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y88 ff2 fs5 fc0 sc0 ls1 ws1\">10.3<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Typ<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">62<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya9 ff4 fs5 fc0 sc0 ls1 ws0\">The Ba<span class=\"_ _0\"></span>ckg<span class=\"_ _0\"></span>roud<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">62<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ybb ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ba<span class=\"_ _0\"></span>ckg<span class=\"_ _0\"></span>round<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">62<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y6c ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Public <span class=\"_ _0\"></span>met<span class=\"_ _0\"></span>hod<span class=\"_ _0\"></span>s<span class=\"ff1\"> <span class=\"ls2 ws2\">.......................................................................................................................................................................................</span> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">62<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Bac<span class=\"_ _0\"></span>kgr<span class=\"_ _0\"></span>ound<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">62<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6e ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>s<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">62<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y6f ff4 fs5 fc0 sc0 ls1 ws4\">Bu<span class=\"_ _0\"></span>tton<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">63<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Bu<span class=\"_ _0\"></span>tto<span class=\"_ _0\"></span>n<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"_ _3\"></span>.............................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">63<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div></div><a class=\"l\" href=\"#pf38\" data-dest-detail='[56,\"XYZ\",33,560,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:782.720000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf38\" data-dest-detail='[56,\"XYZ\",33,466,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:764.680000px;width:481.000000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf38\" data-dest-detail='[56,\"XYZ\",33,149,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:711.820000px;width:480.950000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,675,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:694.390000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,581,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.900000px;width:481.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,487,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:658.910000px;width:480.950000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,393,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:641.480000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,299,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:623.490000px;width:481.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,85,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:588.570000px;width:481.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:570.580000px;width:481.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:553.150000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,334,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:500.240000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,230,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:484.950000px;width:481.050000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,136,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:466.960000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3b\" data-dest-detail='[59,\"XYZ\",33,686,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:431.490000px;width:481.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3b\" data-dest-detail='[59,\"XYZ\",33,582,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:414.050000px;width:480.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3b\" data-dest-detail='[59,\"XYZ\",33,300,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:361.200000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3b\" data-dest-detail='[59,\"XYZ\",33,112,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:325.720000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:308.290000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:290.850000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:255.380000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:237.390000px;width:481.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,302,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:219.960000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,196,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:202.520000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3d\" data-dest-detail='[61,\"XYZ\",33,299,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:78.715000px;width:492.200000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3d\" data-dest-detail='[61,\"XYZ\",33,278,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:61.279000px;width:481.050000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3d\" data-dest-detail='[61,\"XYZ\",33,154,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:43.842000px;width:481.000000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",87,787,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:25.806000px;width:513.800000px;height:18.036000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf9\" class=\"pf w0 h0\" data-page-no=\"9\"><div class=\"pc pc9 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Public <span class=\"_ _0\"></span>met<span class=\"_ _0\"></span>hod<span class=\"_ _0\"></span>s<span class=\"ff1\"> <span class=\"ls2 ws2\">.......................................................................................................................................................................................</span> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">63<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y71 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Bu<span class=\"_ _0\"></span>tton<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"_ _3\"></span>................................<span class=\"ls1 ws0\">. <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">63<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tTit<span class=\"_ _0\"></span>le<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">63<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9b ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>on<span class=\"_ _0\"></span>Cli<span class=\"_ _0\"></span>ck<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">63<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y72 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>on<span class=\"_ _0\"></span>Mou<span class=\"_ _0\"></span>seOv<span class=\"_ _0\"></span>er<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>.....................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">63<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y48 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>eve<span class=\"_ _0\"></span>nt<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">64<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y73 ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>s<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">64<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y9e ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>d<span class=\"_ _0\"></span>ra<span class=\"_ _0\"></span>w<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">64<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4b ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tTe<span class=\"_ _0\"></span>xt<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">64<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y76 ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tIsI<span class=\"_ _0\"></span>nCol<span class=\"_ _0\"></span>lisi<span class=\"_ _0\"></span>on<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">64<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4d ff2 fs5 fc0 sc0 ls1 ws1\">Adm<span class=\"_ _0\"></span>ob<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">64<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4e ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ad<span class=\"_ _0\"></span>mob<span class=\"_ _0\"></span>Manag<span class=\"_ _0\"></span>er<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>..............................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">64<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y8 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Public <span class=\"_ _0\"></span>met<span class=\"_ _0\"></span>hod<span class=\"_ _0\"></span>s<span class=\"ff1\"> <span class=\"ls2 ws2\">.......................................................................................................................................................................................</span> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">64<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y50 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Adm<span class=\"_ _0\"></span>obM<span class=\"_ _0\"></span>anag<span class=\"_ _0\"></span>er<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">64<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x8 h9 yc5 ff4 fs4 fc0 sc0 ls1 ws0\">9<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 h8 yc6 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>lo<span class=\"_ _0\"></span>adBan<span class=\"_ _0\"></span>nerA<span class=\"_ _0\"></span>d<span class=\"ff1 ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">65<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 yc7 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>sh<span class=\"_ _0\"></span>owB<span class=\"_ _0\"></span>anner<span class=\"_ _0\"></span>Ad<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">65<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc8 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>hi<span class=\"_ _0\"></span>deBan<span class=\"_ _0\"></span>nerA<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">....................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">65<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 yc9 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>lo<span class=\"_ _0\"></span>adRew<span class=\"_ _0\"></span>ardV<span class=\"_ _0\"></span>ideo<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">65<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yca ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>sh<span class=\"_ _0\"></span>owR<span class=\"_ _0\"></span>ewar<span class=\"_ _0\"></span>dVid<span class=\"_ _0\"></span>eo<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">65<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ycb ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>up<span class=\"_ _0\"></span>date<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>App<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">65<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ycc ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>ch<span class=\"_ _0\"></span>eck<span class=\"_ _0\"></span>AdOb<span class=\"_ _0\"></span>jInit<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">65<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ycd ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>ch<span class=\"_ _0\"></span>eck<span class=\"_ _0\"></span>AdRew<span class=\"_ _0\"></span>ardO<span class=\"_ _0\"></span>bjRe<span class=\"_ _0\"></span>init<span class=\"_ _0\"></span>ial<span class=\"_ _0\"></span>ize<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">65<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yce ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Other Fu<span class=\"_ _0\"></span>nctions <span class=\"lsc ws7\">of</span> Admo<span class=\"_ _0\"></span>bMan<span class=\"_ _0\"></span>ag<span class=\"_ _0\"></span>er<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">66<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ycf ff2 fs5 fc0 sc0 ls1 ws1\">3.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">ProcessEvents &amp; Wai<span class=\"_ _0\"></span>tFo<span class=\"_ _0\"></span>rFut<span class=\"_ _0\"></span>ureC<span class=\"_ _0\"></span>omp<span class=\"_ _0\"></span>leti<span class=\"_ _0\"></span>on<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">....................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">66<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yd0 ff2 fs5 fc0 sc0 ls1 ws1\">3.2<span class=\"ff5 ls4 ws0\"> </span>ch<span class=\"_ _0\"></span>eck<span class=\"_ _0\"></span>AdSt<span class=\"_ _0\"></span>ate<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>......................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">66<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yd1 ff2 fs5 fc0 sc0 ls1 ws1\">T<span class=\"_ _0\"></span>im<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">..................................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">66<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 yd2 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meT<span class=\"_ _0\"></span>ime<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">66<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yd3 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Public meth<span class=\"_ _0\"></span>ods <span class=\"lsc ws7\">of</span> GameT<span class=\"_ _0\"></span>im<span class=\"_ _0\"></span>e<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">66<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yd4 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eTi<span class=\"_ _0\"></span>me<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">66<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yd5 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>s<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">67<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 yd6 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>add<span class=\"_ _0\"></span>Tim<span class=\"_ _0\"></span>eVal<span class=\"_ _0\"></span>ue<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">67<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yd7 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tTim<span class=\"_ _0\"></span>eVa<span class=\"_ _0\"></span>lue<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">67<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yd8 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tMS<span class=\"_ _0\"></span>econ<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">........................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">67<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 yd9 ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tTim<span class=\"_ _0\"></span>eStr<span class=\"_ _0\"></span>ing<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">67<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yda ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tTim<span class=\"_ _0\"></span>eVal<span class=\"_ _0\"></span>ue<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">67<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 ydb ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tMin<span class=\"_ _0\"></span>ute<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">...........................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">67<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 ydc ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSec<span class=\"_ _0\"></span>ond<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">67<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ydd ff2 fs5 fc0 sc0 ls1 ws1\">2.10<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>MSe<span class=\"_ _0\"></span>cond<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">68<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yde ff2 fs5 fc0 sc0 ls1 ws1\">2.11<span class=\"ff5 ls6 ws0\"> </span>com<span class=\"_ _0\"></span>par<span class=\"_ _0\"></span>eTim<span class=\"_ _0\"></span>e<span class=\"ff1 ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">68<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 ydf ff2 fs5 fc0 sc0 ls1 ws1\">2.12<span class=\"ff5 ls6 ws0\"> </span>oper<span class=\"_ _0\"></span>ato<span class=\"_ _0\"></span>r=<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">68<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye0 ff2 fs5 fc0 sc0 ls1 ws1\">2.13<span class=\"ff5 ls6 ws0\"> </span>oper<span class=\"_ _0\"></span>ato<span class=\"_ _0\"></span>r&lt;&lt;<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">68<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye1 ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Other funct<span class=\"_ _0\"></span>ions <span class=\"lsc ws7\">of</span> Gam<span class=\"_ _0\"></span>eTim<span class=\"_ _0\"></span>e<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">68<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ye2 ff2 fs5 fc0 sc0 ls1 ws0\">Game co<span class=\"_ _0\"></span>ntr<span class=\"_ _0\"></span>ol<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">68<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye3 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Elements <span class=\"_ _0\"></span><span class=\"lsc ws7\">of<span class=\"ls1 ws0\"> Ga<span class=\"_ _0\"></span>meK<span class=\"_ _0\"></span>eyDat<span class=\"_ _0\"></span>a<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 lsa ws6\">68<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div></div><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,644,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:800.150000px;width:492.200000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,621,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:782.170000px;width:481.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,359,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:764.730000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,254,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:747.240000px;width:481.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,160,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:729.260000px;width:481.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:711.820000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,713,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:693.840000px;width:481.000000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,619,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.350000px;width:481.200000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,525,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:658.910000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,431,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:640.930000px;width:481.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,313,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:623.490000px;width:514.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,176,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:588.020000px;width:492.200000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,153,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:570.580000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf40\" data-dest-detail='[64,\"XYZ\",33,314,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:435.490000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf40\" data-dest-detail='[64,\"XYZ\",33,126,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:400.060000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",33,795,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:382.580000px;width:492.000000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",33,664,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:347.150000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",87,535,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:329.720000px;width:514.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",33,382,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:294.250000px;width:491.950000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",33,360,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:276.260000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",76,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:258.820000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,713,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:241.390000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,619,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:223.350000px;width:481.000000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,431,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:188.480000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,337,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:170.490000px;width:481.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,243,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:153.010000px;width:481.050000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,149,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:135.570000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,713,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:100.150000px;width:470.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:82.710000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,501,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:64.674000px;width:470.200000px;height:18.036000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,407,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:47.237000px;width:492.150000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,243,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:29.801000px;width:514.100000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:11.815000px;width:492.150000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfa\" class=\"pf w0 h0\" data-page-no=\"a\"><div class=\"pc pca w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enum <span class=\"_ _0\"></span>Virt<span class=\"_ _0\"></span>ual<span class=\"_ _0\"></span>KeyI<span class=\"_ _0\"></span>ndex<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 lsa ws6\">68<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yab ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eKe<span class=\"_ _0\"></span>yDat<span class=\"_ _0\"></span>a<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">69<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye4 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>lo<span class=\"_ _0\"></span>adRes<span class=\"_ _0\"></span>our<span class=\"_ _0\"></span>ces<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">69<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9b ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>s<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">69<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y72 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>d<span class=\"_ _0\"></span>ra<span class=\"_ _0\"></span>w<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">69<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9c ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>keyP<span class=\"_ _0\"></span>aus<span class=\"_ _0\"></span>ePre<span class=\"_ _0\"></span>ssed<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">69<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9d ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>keyL<span class=\"_ _0\"></span>eft<span class=\"_ _0\"></span>Press<span class=\"_ _0\"></span>ed<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">69<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9e ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>keyR<span class=\"_ _0\"></span>ight<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">70<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4b ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>keyU<span class=\"_ _0\"></span>pPre<span class=\"_ _0\"></span>ssed<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">70<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4c ff2 fs5 fc0 sc0 ls1 ws1\">2.10<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyD<span class=\"_ _0\"></span>ownPr<span class=\"_ _0\"></span>ess<span class=\"_ _0\"></span>ed<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">70<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4d ff2 fs5 fc0 sc0 ls1 ws1\">2.11<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyA<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed<span class=\"ff1 ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">70<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y8d ff2 fs5 fc0 sc0 ls1 ws1\">2.12<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyB<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">70<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye5 ff2 fs5 fc0 sc0 ls1 ws1\">2.13<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyA<span class=\"_ _0\"></span>Used<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">70<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye6 ff2 fs5 fc0 sc0 ls1 ws1\">2.14<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyB<span class=\"_ _0\"></span>Used<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">70<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye7 ff2 fs5 fc0 sc0 ls1 ws1\">2.15<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyL<span class=\"_ _0\"></span>eftU<span class=\"_ _0\"></span>sed<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">70<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye8 ff2 fs5 fc0 sc0 ls1 ws1\">2.16<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyRi<span class=\"_ _0\"></span>ght<span class=\"_ _0\"></span>Used<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">71<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye9 ff2 fs5 fc0 sc0 ls1 ws1\">2.17<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyUp<span class=\"_ _0\"></span>Used<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">71<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yea ff2 fs5 fc0 sc0 ls1 ws1\">2.18<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyD<span class=\"_ _0\"></span>ownUs<span class=\"_ _0\"></span>ed<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">71<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yeb ff2 fs5 fc0 sc0 ls1 ws1\">2.19<span class=\"ff5 ls6 ws0\"> </span>m_d<span class=\"_ _0\"></span>isab<span class=\"_ _0\"></span>leA<span class=\"_ _0\"></span>llKe<span class=\"_ _0\"></span>y<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">71<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yec ff2 fs5 fc0 sc0 ls1 ws1\">2.20<span class=\"ff5 ls6 ws0\"> </span>m_h<span class=\"_ _0\"></span>ide<span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Pad<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">71<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc0 ff2 fs5 fc0 sc0 ls1 ws1\">2.21<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>A<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">71<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc1 ff2 fs5 fc0 sc0 ls1 ws1\">2.22<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>B<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>.................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">71<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc2 ff2 fs5 fc0 sc0 ls1 ws1\">2.23<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>Left<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">71<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb2 ff2 fs5 fc0 sc0 ls1 ws1\">2.24<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>Right<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">72<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc3 ff2 fs5 fc0 sc0 ls1 ws1\">2.25<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>Up<span class=\"ff1 ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">72<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 yb4 ff2 fs5 fc0 sc0 ls1 ws1\">2.26<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>Down<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">72<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yed ff2 fs5 fc0 sc0 ls1 ws1\">2.27<span class=\"ff5 ls6 ws0\"> </span>m_m<span class=\"_ _0\"></span>ove<span class=\"_ _0\"></span>KeyP<span class=\"_ _0\"></span>ress<span class=\"_ _0\"></span>ed<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">......................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">72<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 yee ff2 fs5 fc0 sc0 ls1 ws1\">2.28<span class=\"ff5 ls6 ws0\"> </span>m_a<span class=\"_ _0\"></span>cti<span class=\"_ _0\"></span>onKe<span class=\"_ _0\"></span>yPre<span class=\"_ _0\"></span>ssed<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">72<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya2 ff2 fs5 fc0 sc0 ls1 ws1\">2.29<span class=\"ff5 ls6 ws0\"> </span>key<span class=\"_ _0\"></span>Left<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">72<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya3 ff2 fs5 fc0 sc0 ls1 ws1\">2.30<span class=\"ff5 ls6 ws0\"> </span>key<span class=\"_ _0\"></span>Righ<span class=\"_ _0\"></span>tPr<span class=\"_ _0\"></span>essed<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>............................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">72<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya4 ff2 fs5 fc0 sc0 ls1 ws1\">2.31<span class=\"ff5 ls6 ws0\"> </span>key<span class=\"_ _0\"></span>UpPr<span class=\"_ _0\"></span>esse<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">72<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya5 ff2 fs5 fc0 sc0 ls1 ws1\">2.32<span class=\"ff5 ls6 ws0\"> </span>key<span class=\"_ _0\"></span>Down<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">73<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya6 ff2 fs5 fc0 sc0 ls1 ws1\">2.33<span class=\"ff5 ls6 ws0\"> </span>key<span class=\"_ _0\"></span>APre<span class=\"_ _0\"></span>ssed<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>..................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">73<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y95 ff2 fs5 fc0 sc0 ls1 ws1\">2.34<span class=\"ff5 ls6 ws0\"> </span>key<span class=\"_ _0\"></span>BPre<span class=\"_ _0\"></span>ssed<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">73<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y84 ff2 fs5 fc0 sc0 ls1 ws1\">2.35<span class=\"ff5 ls6 ws0\"> </span>vir<span class=\"_ _0\"></span>tual<span class=\"_ _0\"></span>Key<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>.........................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">73<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya8 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Other funct<span class=\"_ _0\"></span>ions <span class=\"lsc ws7\">of</span> Gam<span class=\"_ _0\"></span>eKey<span class=\"_ _0\"></span>Data<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">73<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y97 ff4 fs5 fc0 sc0 ls1 ws0\">Game Sli<span class=\"_ _0\"></span>der<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">73<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y98 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Game S<span class=\"_ _0\"></span>lid<span class=\"_ _0\"></span>er<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">74<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y88 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Publics <span class=\"_ _0\"></span>elements <span class=\"lsc ws7\">of</span> <span class=\"_ _0\"></span>Game Sl<span class=\"_ _0\"></span>ider<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">74<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ya9 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">Slider Dir<span class=\"_ _0\"></span>ecti<span class=\"_ _0\"></span>on<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>..................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">74<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ybb ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eSl<span class=\"_ _0\"></span>ider<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">74<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6c ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>s<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.....................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">74<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSl<span class=\"_ _0\"></span>ider<span class=\"_ _0\"></span>Dire<span class=\"_ _0\"></span>ction<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>..............................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">74<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ybc ff2 fs5 fc0 sc0 ls1 ws0\">Game Sy<span class=\"_ _0\"></span>ste<span class=\"_ _0\"></span>m<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">74<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6f ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meS<span class=\"_ _0\"></span>yst<span class=\"_ _0\"></span>em<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>...................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">74<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Elements <span class=\"_ _0\"></span><span class=\"lsc ws7\">of<span class=\"ls1 ws0\"> Ga<span class=\"_ _0\"></span>meS<span class=\"_ _0\"></span>yst<span class=\"_ _0\"></span>em<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 lsa ws6\">75<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div></div><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,92,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:800.150000px;width:481.100000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf44\" data-dest-detail='[68,\"XYZ\",33,521,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:764.680000px;width:481.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf44\" data-dest-detail='[68,\"XYZ\",33,380,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:747.240000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf44\" data-dest-detail='[68,\"XYZ\",33,297,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:729.260000px;width:481.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf44\" data-dest-detail='[68,\"XYZ\",33,110,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:694.340000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:641.480000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:623.440000px;width:470.150000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:606.000000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,302,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:590.720000px;width:470.050000px;height:15.280000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,208,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:572.730000px;width:470.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:555.300000px;width:470.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:537.260000px;width:470.250000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:519.820000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:502.390000px;width:470.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:484.400000px;width:470.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:466.960000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:414.050000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf47\" data-dest-detail='[71,\"XYZ\",33,302,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:308.290000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf47\" data-dest-detail='[71,\"XYZ\",33,208,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:290.250000px;width:470.150000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf47\" data-dest-detail='[71,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:272.810000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,771,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:255.380000px;width:470.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:237.390000px;width:470.250000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:219.910000px;width:470.150000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:202.470000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:184.480000px;width:492.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf49\" data-dest-detail='[73,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:131.570000px;width:492.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf49\" data-dest-detail='[73,\"XYZ\",33,391,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:78.715000px;width:481.000000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf49\" data-dest-detail='[73,\"XYZ\",33,179,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:43.792000px;width:514.100000px;height:17.487000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4a\" data-dest-detail='[74,\"XYZ\",33,766,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:8.369800px;width:492.150000px;height:17.436200px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfb\" class=\"pf w0 h0\" data-page-no=\"b\"><div class=\"pc pcb w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 lsf ws0\"> </span><span class=\"ws0\">enum <span class=\"_ _0\"></span>Val<span class=\"_ _0\"></span>idat<span class=\"_ _0\"></span>ionBu<span class=\"_ _0\"></span>tto<span class=\"_ _0\"></span>n<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>......................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 lsa ws6\">75<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yab ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eSy<span class=\"_ _0\"></span>stem<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>.......................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">75<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yac ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>is<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">75<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9b ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>ke<span class=\"_ _0\"></span>yIs<span class=\"_ _0\"></span>Press<span class=\"_ _0\"></span>ed<span class=\"ff1 ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">76<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y47 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>fil<span class=\"_ _0\"></span>eEx<span class=\"_ _0\"></span>ist<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>...............................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">76<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yad ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>pl<span class=\"_ _0\"></span>aySo<span class=\"_ _0\"></span>und<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">76<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9d ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>Mpl<span class=\"_ _0\"></span>aySou<span class=\"_ _0\"></span>nd<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">76<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yae ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>pl<span class=\"_ _0\"></span>ayMu<span class=\"_ _0\"></span>sic<span class=\"ff1 ls2 ws2\">............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">76<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 yef ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>GS<span class=\"_ _0\"></span>Mpl<span class=\"_ _0\"></span>ayMus<span class=\"_ _0\"></span>ic<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">76<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf0 ff2 fs5 fc0 sc0 ls1 ws1\">2.10<span class=\"ff5 ls6 ws0\"> </span>st<span class=\"_ _0\"></span>opSou<span class=\"_ _0\"></span>nd<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">77<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf1 ff2 fs5 fc0 sc0 ls1 ws1\">2.11<span class=\"ff5 ls6 ws0\"> </span>st<span class=\"_ _0\"></span>opMu<span class=\"_ _0\"></span>sic<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">77<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf2 ff2 fs5 fc0 sc0 ls1 ws1\">2.12<span class=\"ff5 ls6 ws0\"> </span>us<span class=\"_ _0\"></span>eVibr<span class=\"_ _0\"></span>ate<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">77<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye5 ff2 fs5 fc0 sc0 ls1 ws1\">2.13<span class=\"ff5 ls6 ws0\"> </span>sav<span class=\"_ _0\"></span>eCon<span class=\"_ _0\"></span>fig<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">77<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf3 ff2 fs5 fc0 sc0 ls1 ws1\">2.14<span class=\"ff5 ls6 ws0\"> </span>loa<span class=\"_ _0\"></span>dCon<span class=\"_ _0\"></span>fig<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">77<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf4 ff2 fs5 fc0 sc0 ls1 ws1\">2.15<span class=\"ff5 ls6 ws0\"> </span>sav<span class=\"_ _0\"></span>ePadC<span class=\"_ _0\"></span>onfi<span class=\"_ _0\"></span>g<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">77<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf5 ff2 fs5 fc0 sc0 ls1 ws1\">2.16<span class=\"ff5 ls6 ws0\"> </span>loa<span class=\"_ _0\"></span>dPadC<span class=\"_ _0\"></span>onfi<span class=\"_ _0\"></span>g<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">77<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf6 ff2 fs5 fc0 sc0 ls1 ws1\">2.17<span class=\"ff5 ls6 ws0\"> </span>m_d<span class=\"_ _0\"></span>isab<span class=\"_ _0\"></span>leK<span class=\"_ _0\"></span>ey<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">77<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yea ff2 fs5 fc0 sc0 ls1 ws1\">2.18<span class=\"ff5 ls6 ws0\"> </span>m_e<span class=\"_ _0\"></span>nabl<span class=\"_ _0\"></span>eSou<span class=\"_ _0\"></span>nd<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.............................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">78<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 ybe ff2 fs5 fc0 sc0 ls1 ws1\">2.19<span class=\"ff5 ls6 ws0\"> </span>m_e<span class=\"_ _0\"></span>nabl<span class=\"_ _0\"></span>eMus<span class=\"_ _0\"></span>ic<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>..............................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">78<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf7 ff2 fs5 fc0 sc0 ls1 ws1\">2.20<span class=\"ff5 ls6 ws0\"> </span>m_e<span class=\"_ _0\"></span>nabl<span class=\"_ _0\"></span>eVi<span class=\"_ _0\"></span>brat<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">78<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc0 ff2 fs5 fc0 sc0 ls1 ws1\">2.21<span class=\"ff5 ls6 ws0\"> </span>m_k<span class=\"_ _0\"></span>eyIs<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>.............................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">78<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf8 ff2 fs5 fc0 sc0 ls1 ws1\">2.22<span class=\"ff5 ls6 ws0\"> </span>m_f<span class=\"_ _0\"></span>irst<span class=\"_ _0\"></span>Lau<span class=\"_ _0\"></span>nch<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">78<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf9 ff2 fs5 fc0 sc0 ls1 ws1\">2.23<span class=\"ff5 ls6 ws0\"> </span>m_v<span class=\"_ _0\"></span>ali<span class=\"_ _0\"></span>dati<span class=\"_ _0\"></span>onMou<span class=\"_ _0\"></span>seK<span class=\"_ _0\"></span>ey<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">78<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb2 ff2 fs5 fc0 sc0 ls1 ws1\">2.24<span class=\"ff5 ls6 ws0\"> </span>m_v<span class=\"_ _0\"></span>ali<span class=\"_ _0\"></span>dati<span class=\"_ _0\"></span>onKe<span class=\"_ _0\"></span>yboa<span class=\"_ _0\"></span>rdKe<span class=\"_ _0\"></span>y<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">78<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb3 ff2 fs5 fc0 sc0 ls1 ws1\">2.25<span class=\"ff5 ls6 ws0\"> </span>m_g<span class=\"_ _0\"></span>ame<span class=\"_ _0\"></span>Langu<span class=\"_ _0\"></span>age<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>..........................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">78<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb4 ff2 fs5 fc0 sc0 ls1 ws1\">2.26<span class=\"ff5 ls6 ws0\"> </span>m_p<span class=\"_ _0\"></span>adAl<span class=\"_ _0\"></span>pha<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">79<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya0 ff2 fs5 fc0 sc0 ls1 ws1\">2.27<span class=\"ff5 ls6 ws0\"> </span><span class=\"ws0\">Other m<span class=\"_ _0\"></span>eth<span class=\"_ _0\"></span>ods<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>...............................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">79<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yb5 ff4 fs5 fc0 sc0 ls1 ws0\">Game System Ex<span class=\"_ _0\"></span>tend<span class=\"_ _0\"></span>ed<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">79<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya2 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meS<span class=\"_ _0\"></span>yst<span class=\"_ _0\"></span>emExt<span class=\"_ _0\"></span>ended<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">79<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yfa ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Elements <span class=\"_ _0\"></span><span class=\"lsc ws7\">of<span class=\"ls1 ws0\"> Ga<span class=\"_ _0\"></span>meS<span class=\"_ _0\"></span>yst<span class=\"_ _0\"></span>emExt<span class=\"_ _0\"></span>ended<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 lsa ws6\">79<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 yb7 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eSy<span class=\"_ _0\"></span>stem<span class=\"_ _0\"></span>Ext<span class=\"_ _0\"></span>ended<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.......................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">79<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 ya5 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>in<span class=\"_ _0\"></span>itS<span class=\"_ _0\"></span>ystem<span class=\"_ _0\"></span>Dat<span class=\"_ _0\"></span>a<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">79<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb8 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>in<span class=\"_ _0\"></span>itPr<span class=\"_ _0\"></span>ogr<span class=\"_ _0\"></span>ess<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">79<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb9 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>in<span class=\"_ _0\"></span>itDa<span class=\"_ _0\"></span>ta<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">80<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y84 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>sa<span class=\"_ _0\"></span>veDat<span class=\"_ _0\"></span>a<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">80<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yba ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>lo<span class=\"_ _0\"></span>adDat<span class=\"_ _0\"></span>a<span class=\"ff1 ls2 ws2\">..............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">80<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 yfb ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>lau<span class=\"_ _0\"></span>nchO<span class=\"_ _0\"></span>ptio<span class=\"_ _0\"></span>n<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">80<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y98 ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">game play <span class=\"_ _0\"></span>vari<span class=\"_ _0\"></span>abl<span class=\"_ _0\"></span>es<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">80<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y69 ff2 fs5 fc0 sc0 ls1 ws0\">Game Fu<span class=\"_ _0\"></span>nct<span class=\"_ _0\"></span>ion<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">80<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yfc ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">General <span class=\"_ _0\"></span>Fu<span class=\"_ _0\"></span>ncti<span class=\"_ _0\"></span>on<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">80<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ybb ff2 fs5 fc0 sc0 ls1 ws1\">1.1<span class=\"ff5 ls4 ws0\"> </span>VA<span class=\"_ _0\"></span>LUE<span class=\"_ _0\"></span>_CONV<span class=\"_ _0\"></span>ERSI<span class=\"_ _0\"></span>ON<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">80<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9a ff2 fs5 fc0 sc0 ls1 ws1\">1.2<span class=\"ff5 ls4 ws0\"> </span>SE<span class=\"_ _0\"></span>CON<span class=\"_ _0\"></span>D<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">81<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">1.3<span class=\"ff5 ls4 ws0\"> </span>W<span class=\"_ _0\"></span>ITH<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>...................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">81<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ybc ff2 fs5 fc0 sc0 ls1 ws1\">1.4<span class=\"ff5 ls4 ws0\"> </span>enu<span class=\"_ _0\"></span>mTo<span class=\"_ _0\"></span>Num<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">......................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">81<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 ybd ff2 fs5 fc0 sc0 ls1 ws1\">1.5<span class=\"ff5 ls4 ws0\"> </span>w_<span class=\"_ _0\"></span>chart<span class=\"_ _0\"></span>_tT<span class=\"_ _0\"></span>oStr<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">81<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls1 ws1\">1.6<span class=\"ff5 ls4 ws0\"> </span>st<span class=\"_ _0\"></span>rToW<span class=\"_ _0\"></span>Str<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">81<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf4a\" data-dest-detail='[74,\"XYZ\",33,459,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:765.230000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4b\" data-dest-detail='[75,\"XYZ\",33,496,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:729.810000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4b\" data-dest-detail='[75,\"XYZ\",33,402,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:712.370000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4b\" data-dest-detail='[75,\"XYZ\",33,320,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:694.340000px;width:481.050000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4b\" data-dest-detail='[75,\"XYZ\",33,214,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.900000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4b\" data-dest-detail='[75,\"XYZ\",33,132,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:661.610000px;width:480.950000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:590.720000px;width:470.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:573.280000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,278,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:555.300000px;width:470.000000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,184,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:537.860000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,91,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:520.370000px;width:470.200000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:502.390000px;width:470.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:484.950000px;width:470.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,560,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:467.510000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,466,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:449.480000px;width:470.050000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:432.040000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,90,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:379.180000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4e\" data-dest-detail='[78,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:361.150000px;width:470.000000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4e\" data-dest-detail='[78,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:343.710000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4e\" data-dest-detail='[78,\"XYZ\",33,353,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:290.800000px;width:492.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4e\" data-dest-detail='[78,\"XYZ\",33,331,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:273.360000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:220.510000px;width:481.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:202.470000px;width:481.150000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:185.030000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,407,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:149.610000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,220,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:132.170000px;width:514.300000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,124,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:114.690000px;width:492.050000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,102,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:96.701000px;width:481.200000px;height:17.989000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf50\" data-dest-detail='[80,\"XYZ\",33,262,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:26.356000px;width:481.000000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf50\" data-dest-detail='[80,\"XYZ\",33,168,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:8.369800px;width:481.150000px;height:17.986200px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfc\" class=\"pf w0 h0\" data-page-no=\"c\"><div class=\"pc pcc w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws1\">1.7<span class=\"ff5 ls4 ws0\"> </span>nu<span class=\"_ _0\"></span>mToSt<span class=\"_ _0\"></span>r<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">82<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y44 ff2 fs5 fc0 sc0 ls1 ws1\">1.8<span class=\"ff5 ls4 ws0\"> </span>st<span class=\"_ _0\"></span>rToNu<span class=\"_ _0\"></span>m<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">82<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls1 ws1\">1.9<span class=\"ff5 ls4 ws0\"> </span>nu<span class=\"_ _0\"></span>mToW<span class=\"_ _0\"></span>Str<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">82<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y9b ff2 fs5 fc0 sc0 ls1 ws1\">1.10<span class=\"ff5 ls6 ws0\"> </span>wri<span class=\"_ _0\"></span>teZ<span class=\"_ _0\"></span>ero<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.......................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">82<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yfd ff2 fs5 fc0 sc0 ls1 ws1\">1.11<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>MSe<span class=\"_ _0\"></span>cond<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">82<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yfe ff2 fs5 fc0 sc0 ls1 ws1\">1.12<span class=\"ff5 ls6 ws0\"> </span>mak<span class=\"_ _0\"></span>eTim<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">82<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yff ff2 fs5 fc0 sc0 ls1 ws1\">1.13<span class=\"ff5 ls6 ws0\"> </span>ch<span class=\"_ _0\"></span>eckD<span class=\"_ _0\"></span>ateL<span class=\"_ _0\"></span>imit<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>..............................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">83<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y100 ff2 fs5 fc0 sc0 ls1 ws1\">1.14<span class=\"ff5 ls6 ws0\"> </span>sh<span class=\"_ _0\"></span>owLo<span class=\"_ _0\"></span>g<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">83<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y101 ff2 fs5 fc0 sc0 ls1 ws1\">1.15<span class=\"ff5 ls6 ws0\"> </span>arr<span class=\"_ _0\"></span>aySi<span class=\"_ _0\"></span>ze<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">83<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yf0 ff2 fs5 fc0 sc0 ls1 ws1\">1.16<span class=\"ff5 ls6 ws0\"> </span>ch<span class=\"_ _0\"></span>oose<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">83<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y102 ff2 fs5 fc0 sc0 ls1 ws1\">1.17<span class=\"ff5 ls6 ws0\"> </span>ran<span class=\"_ _0\"></span>dom<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">83<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y103 ff2 fs5 fc0 sc0 ls1 ws1\">1.18<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>VarL<span class=\"_ _0\"></span>imit<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>....................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">83<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye5 ff2 fs5 fc0 sc0 ls1 ws1\">1.19<span class=\"ff5 ls6 ws0\"> </span>is<span class=\"_ _0\"></span>In<span class=\"_ _0\"></span><span class=\"ff1 ls2 ws2\">..................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">84<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 ye6 ff2 fs5 fc0 sc0 ls1 ws1\">1.20<span class=\"ff5 ls6 ws0\"> </span>isB<span class=\"_ _0\"></span>etw<span class=\"_ _0\"></span>een<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>......................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">84<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye7 ff2 fs5 fc0 sc0 ls1 ws1\">1.21<span class=\"ff5 ls6 ws0\"> </span>isC<span class=\"_ _0\"></span>ross<span class=\"_ _0\"></span>ing<span class=\"ff1 ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">84<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 yf5 ff2 fs5 fc0 sc0 ls1 ws1\">1.22<span class=\"ff5 ls6 ws0\"> </span>si<span class=\"_ _0\"></span>d<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">84<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ye9 ff2 fs5 fc0 sc0 ls1 ws1\">1.23<span class=\"ff5 ls6 ws0\"> </span>si<span class=\"_ _0\"></span>g<span class=\"_ _0\"></span>n<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">84<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yea ff2 fs5 fc0 sc0 ls1 ws1\">1.24<span class=\"ff5 ls6 ws0\"> </span>poi<span class=\"_ _0\"></span>ntDi<span class=\"_ _0\"></span>rect<span class=\"_ _0\"></span>ion<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">84<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yeb ff2 fs5 fc0 sc0 ls1 ws1\">1.25<span class=\"ff5 ls6 ws0\"> </span>poi<span class=\"_ _0\"></span>ntDi<span class=\"_ _0\"></span>sta<span class=\"_ _0\"></span>nce<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">85<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yec ff2 fs5 fc0 sc0 ls1 ws1\">1.26<span class=\"ff5 ls6 ws0\"> </span>radT<span class=\"_ _0\"></span>oDe<span class=\"_ _0\"></span>g<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">85<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc0 ff2 fs5 fc0 sc0 ls1 ws1\">1.27<span class=\"ff5 ls6 ws0\"> </span>degT<span class=\"_ _0\"></span>oRa<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">85<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc1 ff2 fs5 fc0 sc0 ls1 ws1\">1.28<span class=\"ff5 ls6 ws0\"> </span>len<span class=\"_ _0\"></span>gth<span class=\"_ _0\"></span>DirX<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">85<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc2 ff2 fs5 fc0 sc0 ls1 ws1\">1.29<span class=\"ff5 ls6 ws0\"> </span>len<span class=\"_ _0\"></span>gth<span class=\"_ _0\"></span>DirY<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">85<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb2 ff2 fs5 fc0 sc0 ls1 ws1\">1.30<span class=\"ff5 ls6 ws0\"> </span>inc<span class=\"_ _0\"></span>reas<span class=\"_ _0\"></span>eVar<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">85<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yc3 ff2 fs5 fc0 sc0 ls1 ws1\">1.31<span class=\"ff5 ls6 ws0\"> </span>decr<span class=\"_ _0\"></span>eas<span class=\"_ _0\"></span>eVar<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>...................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">85<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb4 ff2 fs5 fc0 sc0 ls1 ws1\">1.32<span class=\"ff5 ls6 ws0\"> </span>col<span class=\"_ _0\"></span>lis<span class=\"_ _0\"></span>ionT<span class=\"_ _0\"></span>est<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">86<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya0 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Function <span class=\"_ _0\"></span><span class=\"lsc ws7\">on<span class=\"ls1 ws0\"> objects <span class=\"_ _0\"></span>SF<span class=\"_ _0\"></span>ML<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"ls2 ws2\">......................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">86<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 ya1 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tVe<span class=\"_ _0\"></span>ctor<span class=\"_ _0\"></span>2<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">..........................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">86<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 ya2 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Angl<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">86<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb6 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>XSc<span class=\"_ _0\"></span>ale<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">86<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya4 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>YSc<span class=\"_ _0\"></span>ale<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">86<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya5 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Widt<span class=\"_ _0\"></span>h<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>..............................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">87<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yb8 ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Hei<span class=\"_ _0\"></span>ght<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">87<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y95 ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSFM<span class=\"_ _0\"></span>LTex<span class=\"_ _0\"></span>tur<span class=\"_ _0\"></span>eWidt<span class=\"_ _0\"></span>h<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">87<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y84 ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSFM<span class=\"_ _0\"></span>LTex<span class=\"_ _0\"></span>tur<span class=\"_ _0\"></span>eHeig<span class=\"_ _0\"></span>ht<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">87<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 yba ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tSFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Ori<span class=\"_ _0\"></span>ginX<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>............................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">87<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y97 ff2 fs5 fc0 sc0 ls1 ws1\">2.10<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObjO<span class=\"_ _0\"></span>rig<span class=\"_ _0\"></span>inY<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">87<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y98 ff2 fs5 fc0 sc0 ls1 ws1\">2.11<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObjX<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">87<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y88 ff2 fs5 fc0 sc0 ls1 ws1\">2.12<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObjY<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">88<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 ya9 ff2 fs5 fc0 sc0 ls1 ws1\">2.13<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Angl<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">..........................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">88<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 ybb ff2 fs5 fc0 sc0 ls1 ws1\">2.14<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Rota<span class=\"_ _0\"></span>te<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">88<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6c ff2 fs5 fc0 sc0 ls1 ws1\">2.15<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Scal<span class=\"_ _0\"></span>eX_Y<span class=\"ff1 ls2 ws2\">......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">88<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">2.16<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Scal<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">...........................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">89<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y6e ff2 fs5 fc0 sc0 ls1 ws1\">2.17<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Orig<span class=\"_ _0\"></span>in<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.........................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">89<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y6f ff2 fs5 fc0 sc0 ls1 ws1\">2.18<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>X<span class=\"ff1 ls2 ws2\">..................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">89<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls1 ws1\">2.19<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Y<span class=\"ff1 ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>..................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">89<span class=\"ls1 ws0\"> </span></span></span></span></div></div><a class=\"l\" href=\"#pf51\" data-dest-detail='[81,\"XYZ\",33,231,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:731.960000px;width:470.250000px;height:15.280000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf51\" data-dest-detail='[81,\"XYZ\",33,137,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:713.970000px;width:470.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf52\" data-dest-detail='[82,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:696.540000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf52\" data-dest-detail='[82,\"XYZ\",33,195,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:625.640000px;width:470.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf53\" data-dest-detail='[83,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:590.720000px;width:470.050000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf53\" data-dest-detail='[83,\"XYZ\",33,532,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:572.730000px;width:470.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf53\" data-dest-detail='[83,\"XYZ\",33,438,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:555.300000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf53\" data-dest-detail='[83,\"XYZ\",33,344,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:537.860000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf54\" data-dest-detail='[84,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:484.400000px;width:470.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf54\" data-dest-detail='[84,\"XYZ\",33,501,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:431.490000px;width:470.000000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf54\" data-dest-detail='[84,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:414.050000px;width:470.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf54\" data-dest-detail='[84,\"XYZ\",33,77,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:378.630000px;width:470.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf55\" data-dest-detail='[85,\"XYZ\",33,640,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:361.150000px;width:470.050000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf55\" data-dest-detail='[85,\"XYZ\",33,487,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:343.710000px;width:492.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf55\" data-dest-detail='[85,\"XYZ\",33,464,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:325.720000px;width:481.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf56\" data-dest-detail='[86,\"XYZ\",33,501,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:219.960000px;width:481.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf56\" data-dest-detail='[86,\"XYZ\",33,408,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:202.520000px;width:480.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf56\" data-dest-detail='[86,\"XYZ\",33,196,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:167.050000px;width:470.250000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf56\" data-dest-detail='[86,\"XYZ\",33,80,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:149.610000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf57\" data-dest-detail='[87,\"XYZ\",33,618,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:131.620000px;width:470.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfd\" class=\"pf w0 h0\" data-page-no=\"d\"><div class=\"pc pcd w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws1\">2.20<span class=\"ff5 ls6 ws0\"> </span>cen<span class=\"_ _0\"></span>terS<span class=\"_ _0\"></span>FML<span class=\"_ _0\"></span>Obj<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">89<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y71 ff2 fs5 fc0 sc0 ls1 ws1\">2.21<span class=\"ff5 ls6 ws0\"> </span>cen<span class=\"_ _0\"></span>terS<span class=\"_ _0\"></span>FML<span class=\"_ _0\"></span>ObjX<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">89<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls1 ws1\">2.22<span class=\"ff5 ls6 ws0\"> </span>cen<span class=\"_ _0\"></span>terS<span class=\"_ _0\"></span>FML<span class=\"_ _0\"></span>ObjY<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">89<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y104 ff2 fs5 fc0 sc0 ls1 ws1\">2.23<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>X_Y<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">90<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y72 ff2 fs5 fc0 sc0 ls1 ws1\">2.24<span class=\"ff5 ls6 ws0\"> </span>mov<span class=\"_ _0\"></span>eSF<span class=\"_ _0\"></span>MLOb<span class=\"_ _0\"></span>jX<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">90<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y48 ff2 fs5 fc0 sc0 ls1 ws1\">2.25<span class=\"ff5 ls6 ws0\"> </span>mov<span class=\"_ _0\"></span>eSF<span class=\"_ _0\"></span>MLOb<span class=\"_ _0\"></span>jY<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">90<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y73 ff2 fs5 fc0 sc0 ls1 ws1\">2.26<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Size<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">90<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y74 ff2 fs5 fc0 sc0 ls1 ws1\">2.27<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Alph<span class=\"_ _0\"></span>a<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">90<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4b ff2 fs5 fc0 sc0 ls1 ws1\">2.28<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Alph<span class=\"_ _0\"></span>a2<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>........................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">91<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y76 ff2 fs5 fc0 sc0 ls1 ws1\">2.29<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Color<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...........................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">91<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4d ff2 fs5 fc0 sc0 ls1 ws1\">2.30<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>FillC<span class=\"_ _0\"></span>olo<span class=\"_ _0\"></span>r<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>......................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">91<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4e ff2 fs5 fc0 sc0 ls1 ws1\">2.31<span class=\"ff5 ls6 ws0\"> </span>sc<span class=\"_ _0\"></span>aleA<span class=\"_ _0\"></span>nimat<span class=\"_ _0\"></span>ion<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">91<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8 ff2 fs5 fc0 sc0 ls1 ws1\">2.32<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>Fram<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>........................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">91<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y50 ff2 fs5 fc0 sc0 ls1 ws1\">2.33<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Outli<span class=\"_ _0\"></span>neCo<span class=\"_ _0\"></span>lor<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">92<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y105 ff2 fs5 fc0 sc0 ls1 ws1\">2.34<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>TexRe<span class=\"_ _0\"></span>c<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>........................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">92<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y78 ff2 fs5 fc0 sc0 ls1 ws1\">2.35<span class=\"ff5 ls6 ws0\"> </span>set<span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>LObj<span class=\"_ _0\"></span>Prope<span class=\"_ _0\"></span>rti<span class=\"_ _0\"></span>es<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">..................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">92<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y79 ff2 fs5 fc0 sc0 ls1 ws1\">2.36<span class=\"ff5 ls6 ws0\"> </span>loa<span class=\"_ _0\"></span>dSF<span class=\"_ _0\"></span>MLTe<span class=\"_ _0\"></span>xtur<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>..........................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">92<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y106 ff2 fs5 fc0 sc0 ls1 ws1\">2.37<span class=\"ff5 ls6 ws0\"> </span>loa<span class=\"_ _0\"></span>dSF<span class=\"_ _0\"></span>MLFo<span class=\"_ _0\"></span>nt<span class=\"ff1 ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">92<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y7a ff2 fs5 fc0 sc0 ls1 ws1\">2.38<span class=\"ff5 ls6 ws0\"> </span>loa<span class=\"_ _0\"></span>dSF<span class=\"_ _0\"></span>MLSou<span class=\"_ _0\"></span>ndBu<span class=\"_ _0\"></span>ffer<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">92<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7b ff2 fs5 fc0 sc0 ls1 ws1\">2.39<span class=\"ff5 ls6 ws0\"> </span>loa<span class=\"_ _0\"></span>dSF<span class=\"_ _0\"></span>MLMus<span class=\"_ _0\"></span>ic<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">93<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y107 ff2 fs5 fc0 sc0 ls1 ws1\">2.40<span class=\"ff5 ls6 ws0\"> </span>ch<span class=\"_ _0\"></span>eckS<span class=\"_ _0\"></span>FMLS<span class=\"_ _0\"></span>ndSt<span class=\"_ _0\"></span>ate<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">93<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7c ff2 fs5 fc0 sc0 ls1 ws1\">2.41<span class=\"ff5 ls6 ws0\"> </span>pla<span class=\"_ _0\"></span>ySF<span class=\"_ _0\"></span>MLsn<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">93<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y59 ff2 fs5 fc0 sc0 ls1 ws1\">2.42<span class=\"ff5 ls6 ws0\"> </span>st<span class=\"_ _0\"></span>opSF<span class=\"_ _0\"></span>MLsn<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">93<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y108 ff2 fs5 fc0 sc0 ls1 ws1\">2.43<span class=\"ff5 ls6 ws0\"> </span>pau<span class=\"_ _0\"></span>seS<span class=\"_ _0\"></span>FMLs<span class=\"_ _0\"></span>nd<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">93<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y109 ff2 fs5 fc0 sc0 ls1 ws1\">2.44<span class=\"ff5 ls6 ws0\"> </span>loo<span class=\"_ _0\"></span>pSF<span class=\"_ _0\"></span>MLsn<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">94<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5c ff2 fs5 fc0 sc0 ls1 ws1\">2.45<span class=\"ff5 ls6 ws0\"> </span>col<span class=\"_ _0\"></span>lis<span class=\"_ _0\"></span>ionT<span class=\"_ _0\"></span>estSF<span class=\"_ _0\"></span>ML<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">94<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7f ff2 fs5 fc0 sc0 ls1 ws1\">2.46<span class=\"ff5 ls6 ws0\"> </span>cre<span class=\"_ _0\"></span>ateR<span class=\"_ _0\"></span>ecta<span class=\"_ _0\"></span>ngl<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">94<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y10a ff2 fs5 fc0 sc0 ls1 ws1\">2.47<span class=\"ff5 ls6 ws0\"> </span>tex<span class=\"_ _0\"></span>tSt<span class=\"_ _0\"></span>yleC<span class=\"_ _0\"></span>onfig<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">94<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5f ff2 fs5 fc0 sc0 ls1 ws1\">2.48<span class=\"ff5 ls6 ws0\"> </span>cre<span class=\"_ _0\"></span>ateT<span class=\"_ _0\"></span>ext<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">94<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y81 ff2 fs5 fc0 sc0 ls1 ws1\">2.49<span class=\"ff5 ls6 ws0\"> </span>cre<span class=\"_ _0\"></span>ateS<span class=\"_ _0\"></span>pri<span class=\"_ _0\"></span>te<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">95<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y61 ff2 fs5 fc0 sc0 ls1 ws1\">2.50<span class=\"ff5 ls6 ws0\"> </span>get<span class=\"_ _0\"></span>Cur<span class=\"_ _0\"></span>sor<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">95<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y62 ff2 fs5 fc0 sc0 ls1 ws1\">2.51<span class=\"ff5 ls6 ws0\"> </span>mou<span class=\"_ _0\"></span>seC<span class=\"_ _0\"></span>olli<span class=\"_ _0\"></span>sion<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">96<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y10b ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Other <span class=\"_ _0\"></span>fun<span class=\"_ _0\"></span>cti<span class=\"_ _0\"></span>ons<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">97<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y64 ff2 fs5 fc0 sc0 ls1 ws1\">3.1<span class=\"ff5 ls4 ws0\"> </span>cl<span class=\"_ _0\"></span>ear<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>....................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">97<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y10c ff2 fs5 fc0 sc0 ls1 ws1\">3.2<span class=\"ff5 ls4 ws0\"> </span>d<span class=\"_ _0\"></span>ra<span class=\"_ _0\"></span>w<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">97<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y10d ff2 fs5 fc0 sc0 ls1 ws1\">3.3<span class=\"ff5 ls4 ws0\"> </span>dis<span class=\"_ _0\"></span>pla<span class=\"_ _0\"></span>y<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">97<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y67 ff2 fs5 fc0 sc0 ls1 ws1\">3.4<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tFP<span class=\"_ _0\"></span>S<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">97<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y10e ff2 fs5 fc0 sc0 ls1 ws1\">3.5<span class=\"ff5 ls4 ws0\"> </span>vi<span class=\"_ _0\"></span>brat<span class=\"_ _0\"></span>e<span class=\"ff1 ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">97<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y10f ff2 fs5 fc0 sc0 ls1 ws1\">3.6<span class=\"ff5 ls4 ws0\"> </span>ope<span class=\"_ _0\"></span>nURL<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">97<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y110 ff2 fs5 fc0 sc0 ls1 ws1\">3.7<span class=\"ff5 ls4 ws0\"> </span>js<span class=\"_ _0\"></span>tri<span class=\"_ _0\"></span>ng2st<span class=\"_ _0\"></span>ring<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">97<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y111 ff2 fs5 fc0 sc0 ls1 ws1\">3.8<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tDev<span class=\"_ _0\"></span>iceI<span class=\"_ _0\"></span>d<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">98<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y112 ff2 fs5 fc0 sc0 ls1 ws0\">External <span class=\"_ _0\"></span>lib<span class=\"_ _0\"></span>rary<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _6\"></span><span class=\"ff4 ls7 ws3\">98<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Tiny File Dialogs (only for Wind<span class=\"_ _0\"></span>ows and Linu<span class=\"_ _0\"></span>x)<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">98<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y8a ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">class Ti<span class=\"_ _0\"></span>nyDi<span class=\"_ _0\"></span>alog<span class=\"_ _0\"></span>Box<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">98<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y8b ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>ti<span class=\"_ _0\"></span>nyS<span class=\"_ _0\"></span>tring<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">98<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y113 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>TI<span class=\"_ _0\"></span>NY_F<span class=\"_ _0\"></span>ILE<span class=\"_ _0\"></span>_DIA<span class=\"_ _0\"></span>LOGBO<span class=\"_ _0\"></span>X_PA<span class=\"_ _0\"></span>TH<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>..........................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">98<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf58\" data-dest-detail='[88,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:764.730000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf59\" data-dest-detail='[89,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:746.690000px;width:470.000000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf59\" data-dest-detail='[89,\"XYZ\",33,311,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:693.840000px;width:470.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf59\" data-dest-detail='[89,\"XYZ\",33,108,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:676.400000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5a\" data-dest-detail='[90,\"XYZ\",33,113,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:588.020000px;width:470.200000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5b\" data-dest-detail='[91,\"XYZ\",33,501,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:535.160000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5b\" data-dest-detail='[91,\"XYZ\",33,297,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:517.720000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5b\" data-dest-detail='[91,\"XYZ\",33,203,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:499.690000px;width:470.050000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5b\" data-dest-detail='[91,\"XYZ\",33,109,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:482.250000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5c\" data-dest-detail='[92,\"XYZ\",33,713,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:464.810000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5d\" data-dest-detail='[93,\"XYZ\",33,466,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:341.010000px;width:470.250000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5d\" data-dest-detail='[93,\"XYZ\",33,359,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:323.570000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5d\" data-dest-detail='[93,\"XYZ\",33,265,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:306.140000px;width:470.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5e\" data-dest-detail='[94,\"XYZ\",33,536,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:288.150000px;width:470.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5e\" data-dest-detail='[94,\"XYZ\",33,172,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:270.710000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5f\" data-dest-detail='[95,\"XYZ\",111,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:253.230000px;width:470.150000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",76,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:235.240000px;width:492.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,795,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:217.810000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,676,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:199.820000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,300,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:146.910000px;width:480.950000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,206,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:129.470000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,112,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:112.040000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",33,771,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:94.001000px;width:481.050000px;height:18.039000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",88,643,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:76.565000px;width:514.050000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",33,610,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:61.279000px;width:492.150000px;height:15.286000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",33,476,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:25.856000px;width:481.200000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",33,248,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:7.819800px;width:481.100000px;height:18.036200px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfe\" class=\"pf w0 h0\" data-page-no=\"e\"><div class=\"pc pce w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enum <span class=\"_ _0\"></span>Fil<span class=\"_ _0\"></span>eDial<span class=\"_ _0\"></span>ogT<span class=\"_ _0\"></span>ype<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 lsa ws6\">98<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y44 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enum <span class=\"_ _0\"></span>Dial<span class=\"_ _0\"></span>ogT<span class=\"_ _0\"></span>ype<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>...............................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 lsa ws6\">99<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enum <span class=\"_ _0\"></span>Icon<span class=\"_ _0\"></span>Typ<span class=\"_ _0\"></span>e<span class=\"ff1\"> <span class=\"ls2 ws2\">..................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff4 lsa ws6\">99<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y46 ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enumDialogTypeToStr <span class=\"_ _0\"></span>/ <span class=\"_ _0\"></span>enu<span class=\"_ _0\"></span>mI<span class=\"_ _0\"></span>conT<span class=\"_ _0\"></span>ypeT<span class=\"_ _0\"></span>oStr<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">99<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y47 ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>sh<span class=\"_ _0\"></span>owD<span class=\"_ _0\"></span>ialo<span class=\"_ _0\"></span>gBox<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">99<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y48 ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>sh<span class=\"_ _0\"></span>owFi<span class=\"_ _0\"></span>leD<span class=\"_ _0\"></span>ialo<span class=\"_ _0\"></span>gBox<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">100<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y49 ff2 fs5 fc0 sc0 ls1 ws1\">2.10<span class=\"ff5 ls6 ws0\"> </span>sh<span class=\"_ _0\"></span>owFo<span class=\"_ _0\"></span>lder<span class=\"_ _0\"></span>Dial<span class=\"_ _0\"></span>ogBox<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">100<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4a ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> </span><span class=\"lsc ws7\">Box<span class=\"ls1 ws0\"> <span class=\"ls11 wsb\">2D</span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"_ _3\"></span>...<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">100<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4b ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> </span><span class=\"ls1 ws1\">T<span class=\"_ _0\"></span>MXL<span class=\"_ _0\"></span>ite<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>................................................................................................................................<span class=\"ls1 ws0\">. <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">100<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4c ff2 fs5 fc0 sc0 ls1 ws0\">Game En<span class=\"_ _0\"></span>gine<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"_ _3\"></span>...<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">101<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4d ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meEn<span class=\"_ _0\"></span>gin<span class=\"_ _0\"></span>e<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">101<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4e ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Methods of Gam<span class=\"_ _0\"></span>eEn<span class=\"_ _0\"></span>gine<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>.......................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">101<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4f ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eEn<span class=\"_ _0\"></span>gine<span class=\"_ _0\"></span><span class=\"ff1 ls2 ws2\">......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">101<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y50 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>in<span class=\"_ _0\"></span>itEn<span class=\"_ _0\"></span>gin<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">101<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y51 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>p<span class=\"_ _0\"></span>la<span class=\"_ _0\"></span>y<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">...................................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">101<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y52 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>ba<span class=\"_ _0\"></span>sicS<span class=\"_ _0\"></span>FMLm<span class=\"_ _0\"></span>ain<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">101<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y53 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tRen<span class=\"_ _0\"></span>derW<span class=\"_ _0\"></span>indow<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...........................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">101<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y54 ff2 fs5 fc0 sc0 ls1 ws0\">Game se<span class=\"_ _0\"></span>tup<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"ls2 ws2\">................................<span class=\"_ _0\"></span>................................................................................................................................................................<span class=\"_ _3\"></span>.....<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">101<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y55 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">enum <span class=\"_ _0\"></span>Disp<span class=\"_ _0\"></span>lay<span class=\"_ _0\"></span>Opti<span class=\"_ _0\"></span>on<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">102<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y56 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Window <span class=\"_ _0\"></span>set<span class=\"_ _0\"></span>tin<span class=\"_ _0\"></span>g<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">102<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y57 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>WI<span class=\"_ _0\"></span>NDO<span class=\"_ _0\"></span>W_WID<span class=\"_ _0\"></span>TH<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ws4\">1<span class=\"ls7 ws3\">02</span><span class=\"ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y58 ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>WI<span class=\"_ _0\"></span>NDO<span class=\"_ _0\"></span>W_HEI<span class=\"_ _0\"></span>GHT<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">102<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y59 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>VI<span class=\"_ _0\"></span>EW_W<span class=\"_ _0\"></span>IDTH<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">102<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5a ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>VI<span class=\"_ _0\"></span>EW_H<span class=\"_ _0\"></span>EIGH<span class=\"_ _0\"></span>T<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>..................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">102<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5b ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>F<span class=\"_ _0\"></span>PS<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5c ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>WI<span class=\"_ _0\"></span>NDO<span class=\"_ _0\"></span>W_SET<span class=\"_ _0\"></span>TING<span class=\"_ _0\"></span>S<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5d ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Parameter <span class=\"_ _0\"></span><span class=\"lsd ws8\">of<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> v<span class=\"_ _0\"></span>alidation bu<span class=\"_ _0\"></span>tt<span class=\"_ _0\"></span>ons<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y5e ff2 fs5 fc0 sc0 ls1 ws1\">3.1<span class=\"ff5 ls4 ws0\"> </span>KE<span class=\"_ _0\"></span>Y_V<span class=\"_ _0\"></span>ALIDA<span class=\"_ _0\"></span>TION<span class=\"_ _0\"></span>_MO<span class=\"_ _0\"></span>USE<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">..............................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y5f ff2 fs5 fc0 sc0 ls1 ws1\">3.2<span class=\"ff5 lsf ws0\"> </span>KE<span class=\"_ _0\"></span>Y_V<span class=\"_ _0\"></span>ALIDA<span class=\"_ _0\"></span>TION<span class=\"_ _0\"></span>_KEY<span class=\"_ _0\"></span>BOAR<span class=\"_ _0\"></span>D<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>........................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y60 ff2 fs5 fc0 sc0 ls1 ws1\">3.3<span class=\"ff5 ls4 ws0\"> </span>KE<span class=\"_ _0\"></span>Y_C<span class=\"_ _0\"></span>ANCEL<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y61 ff2 fs5 fc0 sc0 ls8 ws4\">4.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Keyboard k<span class=\"_ _0\"></span>ey s<span class=\"_ _0\"></span>ett<span class=\"_ _0\"></span>ing<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y62 ff2 fs5 fc0 sc0 ls1 ws1\">4.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">KE<span class=\"_ _0\"></span>Y_A <span class=\"_ _0\"></span>and K<span class=\"_ _0\"></span>EY_B<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y63 ff2 fs5 fc0 sc0 ls1 ws1\">4.2<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">KE<span class=\"_ _0\"></span>Y_X <span class=\"_ _0\"></span>and K<span class=\"_ _0\"></span>EY_<span class=\"_ _0\"></span>Y<span class=\"ff1\"> <span class=\"ls2 ws2\">.............................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y64 ff2 fs5 fc0 sc0 ls1 ws1\">4.3<span class=\"ff5 ls4 ws0\"> </span>KE<span class=\"_ _0\"></span>Y_L<span class=\"_ _0\"></span>EFT<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">103<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y65 ff2 fs5 fc0 sc0 ls1 ws1\">4.4<span class=\"ff5 ls4 ws0\"> </span>KE<span class=\"_ _0\"></span>Y_RI<span class=\"_ _0\"></span>GHT<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">104<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y66 ff2 fs5 fc0 sc0 ls1 ws1\">4.5<span class=\"ff5 ls4 ws0\"> </span>KE<span class=\"_ _0\"></span>Y_UP<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">104<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y67 ff2 fs5 fc0 sc0 ls1 ws1\">4.6<span class=\"ff5 ls4 ws0\"> </span>KE<span class=\"_ _0\"></span>Y_DO<span class=\"_ _0\"></span>WN<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>.......................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">104<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y68 ff2 fs5 fc0 sc0 ls8 ws4\">5.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Default valu<span class=\"_ _0\"></span>e for <span class=\"ls12 wsc\">SFML</span> co<span class=\"_ _0\"></span>mpon<span class=\"_ _0\"></span>ent<span class=\"_ _0\"></span>s<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">104<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y69 ff2 fs5 fc0 sc0 ls1 ws1\">5.1<span class=\"ff5 ls4 ws0\"> </span>DE<span class=\"_ _0\"></span>FAUL<span class=\"_ _0\"></span>T_SF<span class=\"_ _0\"></span>ML_<span class=\"_ _0\"></span>TEXT<span class=\"_ _0\"></span>_SIZ<span class=\"_ _0\"></span>E<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">104<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6a ff2 fs5 fc0 sc0 ls1 ws1\">5.2<span class=\"ff5 ls4 ws0\"> </span>DE<span class=\"_ _0\"></span>FAUL<span class=\"_ _0\"></span>T_SF<span class=\"_ _0\"></span>ML_<span class=\"_ _0\"></span>TEXT<span class=\"_ _0\"></span>_COL<span class=\"_ _0\"></span>OR<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>........................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">104<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6b ff2 fs5 fc0 sc0 ls1 ws1\">5.3<span class=\"ff5 ls4 ws0\"> </span>DE<span class=\"_ _0\"></span>FAUL<span class=\"_ _0\"></span>T_SF<span class=\"_ _0\"></span>ML_<span class=\"_ _0\"></span>SELE<span class=\"_ _0\"></span>CTE<span class=\"_ _0\"></span>D_TEXT<span class=\"_ _0\"></span>_COL<span class=\"_ _0\"></span>OR<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.....................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">104<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6c ff2 fs5 fc0 sc0 ls1 ws1\">5.4<span class=\"ff5 ls4 ws0\"> </span>DE<span class=\"_ _0\"></span>FAUL<span class=\"_ _0\"></span>T_MS<span class=\"_ _0\"></span>G_B<span class=\"_ _0\"></span>OX_TE<span class=\"_ _0\"></span>XT_S<span class=\"_ _0\"></span>IZE<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">104<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">5.5<span class=\"ff5 ls4 ws0\"> </span>DE<span class=\"_ _0\"></span>FAUL<span class=\"_ _0\"></span>T_MS<span class=\"_ _0\"></span>G_B<span class=\"_ _0\"></span>OX_B<span class=\"_ _0\"></span>UTTO<span class=\"_ _0\"></span>N_TEX<span class=\"_ _0\"></span>T_SI<span class=\"_ _0\"></span>ZE<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.....................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">104<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6e ff2 fs5 fc0 sc0 ls1 ws1\">5.6<span class=\"ff5 ls4 ws0\"> </span>DE<span class=\"_ _0\"></span>FAUL<span class=\"_ _0\"></span>T_MS<span class=\"_ _0\"></span>G_B<span class=\"_ _0\"></span>OX_TE<span class=\"_ _0\"></span>XT_C<span class=\"_ _0\"></span>OLOR<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">105<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6f ff2 fs5 fc0 sc0 ls1 ws1\">5.7<span class=\"ff5 ls4 ws0\"> </span>DE<span class=\"_ _0\"></span>FAUL<span class=\"_ _0\"></span>T_MS<span class=\"_ _0\"></span>G_B<span class=\"_ _0\"></span>OX_SE<span class=\"_ _0\"></span>LEC<span class=\"_ _0\"></span>TED_T<span class=\"_ _0\"></span>EXT<span class=\"_ _0\"></span>_COL<span class=\"_ _0\"></span>OR<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..............................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">105<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls1 ws1\">5.8<span class=\"ff5 ls4 ws0\"> </span>DE<span class=\"_ _0\"></span>FAUL<span class=\"_ _0\"></span>T_R<span class=\"_ _0\"></span>PG_DI<span class=\"_ _0\"></span>ALO<span class=\"_ _0\"></span>G_TE<span class=\"_ _0\"></span>XT_SI<span class=\"_ _0\"></span>ZE<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">105<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf62\" data-dest-detail='[98,\"XYZ\",33,377,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:747.290000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf62\" data-dest-detail='[98,\"XYZ\",33,272,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:729.810000px;width:481.100000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf63\" data-dest-detail='[99,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:711.820000px;width:481.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf63\" data-dest-detail='[99,\"XYZ\",33,525,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:694.390000px;width:470.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf63\" data-dest-detail='[99,\"XYZ\",33,208,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:676.950000px;width:492.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf63\" data-dest-detail='[99,\"XYZ\",33,126,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:658.910000px;width:492.200000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf64\" data-dest-detail='[100,\"XYZ\",33,760,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:641.480000px;width:514.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf64\" data-dest-detail='[100,\"XYZ\",33,607,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:606.050000px;width:492.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf64\" data-dest-detail='[100,\"XYZ\",33,91,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:500.240000px;width:514.300000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf65\" data-dest-detail='[101,\"XYZ\",33,457,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:464.810000px;width:492.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf65\" data-dest-detail='[101,\"XYZ\",33,445,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:447.380000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf65\" data-dest-detail='[101,\"XYZ\",33,349,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:429.940000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf65\" data-dest-detail='[101,\"XYZ\",33,255,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:411.900000px;width:481.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf65\" data-dest-detail='[101,\"XYZ\",33,161,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:394.470000px;width:481.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",76,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:377.030000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,713,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:359.050000px;width:481.000000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,619,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:341.610000px;width:492.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,607,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:324.120000px;width:481.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,511,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.700000px;bottom:306.140000px;width:481.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,418,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:288.700000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,324,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:270.710000px;width:492.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,312,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:253.230000px;width:481.200000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,204,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:235.790000px;width:480.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,99,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:217.810000px;width:481.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:200.370000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:182.930000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:164.900000px;width:481.050000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,513,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:147.460000px;width:492.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:132.170000px;width:481.100000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,394,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:114.190000px;width:481.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,300,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:96.751000px;width:481.100000px;height:17.439000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,206,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:78.715000px;width:481.150000px;height:18.036000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,112,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:61.279000px;width:481.050000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,771,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:43.842000px;width:481.150000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:25.856000px;width:481.200000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:8.419900px;width:481.100000px;height:17.436100px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pff\" class=\"pf w0 h0\" data-page-no=\"f\"><div class=\"pc pcf w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws1\">5.9<span class=\"ff5 ls4 ws0\"> </span>DE<span class=\"_ _0\"></span>FAUL<span class=\"_ _0\"></span>T_R<span class=\"_ _0\"></span>PG_DI<span class=\"_ _0\"></span>ALO<span class=\"_ _0\"></span>G_BUT<span class=\"_ _0\"></span>TON_<span class=\"_ _0\"></span>TEXT<span class=\"_ _0\"></span>_SIZ<span class=\"_ _0\"></span>E<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">105<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y71 ff2 fs5 fc0 sc0 ls1 ws1\">5.10<span class=\"ff5 ls6 ws0\"> </span>DEF<span class=\"_ _0\"></span>AUL<span class=\"_ _0\"></span>T_RP<span class=\"_ _0\"></span>G_DI<span class=\"_ _0\"></span>ALO<span class=\"_ _0\"></span>G_TEXT<span class=\"_ _0\"></span>_COL<span class=\"_ _0\"></span>OR<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">.......................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">105<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls1 ws1\">5.11<span class=\"ff5 ls6 ws0\"> </span>DEF<span class=\"_ _0\"></span>AUL<span class=\"_ _0\"></span>T_RP<span class=\"_ _0\"></span>G_DI<span class=\"_ _0\"></span>ALO<span class=\"_ _0\"></span>G_SEL<span class=\"_ _0\"></span>ECTED<span class=\"_ _0\"></span>_TE<span class=\"_ _0\"></span>XT_C<span class=\"_ _0\"></span>OLOR<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">....................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">105<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y46 ff2 fs5 fc0 sc0 ls1 ws1\">5.12<span class=\"ff5 ls6 ws0\"> </span>DEF<span class=\"_ _0\"></span>AUL<span class=\"_ _0\"></span>T_BUT<span class=\"_ _0\"></span>TON<span class=\"_ _0\"></span>_TEX<span class=\"_ _0\"></span>T_CO<span class=\"_ _0\"></span>LOR<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>..............................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">105<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y72 ff2 fs5 fc0 sc0 ls8 ws4\">6.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Game i<span class=\"_ _0\"></span>nfor<span class=\"_ _0\"></span>mat<span class=\"_ _0\"></span>ion<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">105<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y48 ff2 fs5 fc0 sc0 ls1 ws1\">5.1<span class=\"ff5 ls4 ws0\"> </span>MA<span class=\"_ _0\"></span>JOR<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">105<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y73 ff2 fs5 fc0 sc0 ls1 ws1\">5.2<span class=\"ff5 ls4 ws0\"> </span>MI<span class=\"_ _0\"></span>NOR<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">106<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y74 ff2 fs5 fc0 sc0 ls1 ws1\">5.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tGam<span class=\"_ _0\"></span>eVe<span class=\"_ _0\"></span>rsio<span class=\"_ _0\"></span>n<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">106<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y75 ff2 fs5 fc0 sc0 ls1 ws1\">5.4<span class=\"ff5 ls4 ws0\"> </span>GAM<span class=\"_ _0\"></span>E_N<span class=\"_ _0\"></span>AME<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">106<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y76 ff2 fs5 fc0 sc0 ls1 ws1\">5.5<span class=\"ff5 ls4 ws0\"> </span>GAM<span class=\"_ _0\"></span>E_A<span class=\"_ _0\"></span>UTHO<span class=\"_ _0\"></span>R<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">106<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4d ff2 fs5 fc0 sc0 ls8 ws4\">7.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Admob set<span class=\"_ _0\"></span>tin<span class=\"_ _0\"></span>g<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">106<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4e ff2 fs5 fc0 sc0 ls1 ws1\">7.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">Ad <span class=\"ls14 wsd\">Id</span><span class=\"ff1\"> <span class=\"ls2 ws2\">................................................................................................................................................................................................</span>. <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">106<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y77 ff2 fs5 fc0 sc0 ls1 ws1\">7.1.1<span class=\"ff5 ls5 ws0\"> </span>kA<span class=\"_ _0\"></span>dMob<span class=\"_ _0\"></span>AppI<span class=\"_ _0\"></span>D<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>.............................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">106<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y50 ff2 fs5 fc0 sc0 ls1 ws1\">7.1.2<span class=\"ff5 ls5 ws0\"> </span>kB<span class=\"_ _0\"></span>anner<span class=\"_ _0\"></span>AdUn<span class=\"_ _0\"></span>it<span class=\"ff1 ws0\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................<span class=\"_ _3\"></span>............................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">106<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y51 ff2 fs5 fc0 sc0 ls1 ws1\">7.1.3<span class=\"ff5 ls5 ws0\"> </span>kRe<span class=\"_ _0\"></span>ward<span class=\"_ _0\"></span>edVi<span class=\"_ _0\"></span>deoAd<span class=\"_ _0\"></span>Unit<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">106<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y78 ff2 fs5 fc0 sc0 ls1 ws1\">7.2<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">Banner s<span class=\"_ _0\"></span>i<span class=\"_ _0\"></span>ze<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y79 ff2 fs5 fc0 sc0 ls1 ws1\">7.2.1<span class=\"ff5 ls5 ws0\"> </span>kB<span class=\"_ _0\"></span>anner<span class=\"_ _0\"></span>Widt<span class=\"_ _0\"></span>h<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y54 ff2 fs5 fc0 sc0 ls1 ws1\">7.2.2<span class=\"ff5 ls5 ws0\"> </span>kB<span class=\"_ _0\"></span>anner<span class=\"_ _0\"></span>Hei<span class=\"_ _0\"></span>ght<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7a ff2 fs5 fc0 sc0 ls1 ws1\">7.3<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">Target <span class=\"_ _0\"></span>aud<span class=\"_ _0\"></span>ienc<span class=\"_ _0\"></span>e<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y7b ff2 fs5 fc0 sc0 ls1 ws1\">7.3.1<span class=\"ff5 ls5 ws0\"> </span>kB<span class=\"_ _0\"></span>irth<span class=\"_ _0\"></span>dayDa<span class=\"_ _0\"></span>y<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y57 ff2 fs5 fc0 sc0 ls1 ws1\">7.3.2<span class=\"ff5 ls5 ws0\"> </span>kB<span class=\"_ _0\"></span>irth<span class=\"_ _0\"></span>dayM<span class=\"_ _0\"></span>onth<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7c ff2 fs5 fc0 sc0 ls1 ws1\">7.3.3<span class=\"ff5 ls5 ws0\"> </span>kB<span class=\"_ _0\"></span>irth<span class=\"_ _0\"></span>dayYe<span class=\"_ _0\"></span>ar<span class=\"ff1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y59 ff2 fs5 fc0 sc0 ls1 ws1\">7.3.4<span class=\"ff5 ls5 ws0\"> </span>kK<span class=\"_ _0\"></span>eywo<span class=\"_ _0\"></span>rds<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y7d ff2 fs5 fc0 sc0 ls8 ws4\">8.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Path <span class=\"lsc ws7\">of<span class=\"_ _0\"></span><span class=\"ls13 ws0\"> <span class=\"ls9 ws5\">the</span><span class=\"ls1\"> resource file<span class=\"_ _0\"></span>s<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>......................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y7e ff2 fs5 fc0 sc0 ls1 ws1\">8.1<span class=\"ff5 ls4 ws0\"> </span>AS<span class=\"_ _0\"></span>SETS<span class=\"_ _0\"></span>_DI<span class=\"_ _0\"></span>R<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>......................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">107<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5c ff2 fs5 fc0 sc0 ls1 ws1\">8.2<span class=\"ff5 ls4 ws0\"> </span>GUI<span class=\"_ _0\"></span>_DI<span class=\"_ _0\"></span>R<span class=\"ff1 ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">108<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y7f ff2 fs5 fc0 sc0 ls1 ws1\">8.3<span class=\"ff5 ls4 ws0\"> </span>FO<span class=\"_ _0\"></span>NT_<span class=\"_ _0\"></span>DIR<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">108<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y80 ff2 fs5 fc0 sc0 ls1 ws1\">8.4<span class=\"ff5 ls4 ws0\"> </span>SP<span class=\"_ _0\"></span>RIT<span class=\"_ _0\"></span>ES_DI<span class=\"_ _0\"></span>R<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">....................................................................................................................................................................................</span> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">108<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y5f ff2 fs5 fc0 sc0 ls1 ws1\">8.5<span class=\"ff5 ls4 ws0\"> </span>TI<span class=\"_ _0\"></span>LES<span class=\"_ _0\"></span>_DIR<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">108<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y81 ff2 fs5 fc0 sc0 ls1 ws1\">8.6<span class=\"ff5 ls4 ws0\"> </span>SF<span class=\"_ _0\"></span>X_DI<span class=\"_ _0\"></span>R<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">............................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">108<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y61 ff2 fs5 fc0 sc0 ls1 ws1\">8.7<span class=\"ff5 ls4 ws0\"> </span>MU<span class=\"_ _0\"></span>SIC<span class=\"_ _0\"></span>_DIR<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">108<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y82 ff2 fs5 fc0 sc0 ls1 ws1\">8.8<span class=\"ff5 ls4 ws0\"> </span>TM<span class=\"_ _0\"></span>X_RS<span class=\"_ _0\"></span>C_DI<span class=\"_ _0\"></span>R<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">108<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y83 ff2 fs5 fc0 sc0 ls8 ws4\">9.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Game p<span class=\"_ _0\"></span>ackage name <span class=\"_ _0\"></span>(Mob<span class=\"_ _0\"></span>ile<span class=\"_ _0\"></span>)<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">108<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y64 ff2 fs5 fc0 sc0 ls8 ws4\">10.<span class=\"ff5 lsf ws0\"> <span class=\"ff2 ls1\">Backup <span class=\"_ _0\"></span>file p<span class=\"_ _0\"></span>at<span class=\"_ _0\"></span>h<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y84 ff2 fs5 fc0 sc0 ls1 ws1\">10.1<span class=\"ff5 ls6 ws0\"> </span>DAT<span class=\"_ _0\"></span>A_PA<span class=\"_ _0\"></span>RENT<span class=\"_ _0\"></span>_DI<span class=\"_ _0\"></span>R<span class=\"ff1 ls2 ws2\">.....................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 h8 y85 ff2 fs5 fc0 sc0 ls1 ws0\">Root <span class=\"lsd ws8\">of</span> game datas <span class=\"_ _0\"></span>file<span class=\"_ _0\"></span>s.<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">.................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y86 ff2 fs5 fc0 sc0 ls1 ws1\">10.2<span class=\"ff5 ls6 ws0\"> </span>GAM<span class=\"_ _0\"></span>E_DA<span class=\"_ _0\"></span>TA_<span class=\"_ _0\"></span>FILE<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y87 ff2 fs5 fc0 sc0 ls1 ws1\">10.3<span class=\"ff5 ls6 ws0\"> </span>CON<span class=\"_ _0\"></span>FIG<span class=\"_ _0\"></span>_FIL<span class=\"_ _0\"></span>E<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">...............................................................................................................................................................................</span> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y88 ff2 fs5 fc0 sc0 ls1 ws1\">10.4<span class=\"ff5 ls6 ws0\"> </span>GAM<span class=\"_ _0\"></span>E_PA<span class=\"_ _0\"></span>D_FI<span class=\"_ _0\"></span>LE<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>..........................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y6a ff2 fs5 fc0 sc0 ls1 ws1\">Act<span class=\"_ _0\"></span>ivi<span class=\"_ _0\"></span>ty<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>............................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y89 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meAc<span class=\"_ _0\"></span>tiv<span class=\"_ _0\"></span>ity<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................<span class=\"_ _3\"></span>................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y3e ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Elements <span class=\"_ _0\"></span><span class=\"lsc ws7\">of<span class=\"ls1 ws0\"> Ga<span class=\"_ _0\"></span>meAc<span class=\"_ _0\"></span>tiv<span class=\"_ _0\"></span>ity<span class=\"ff1\"> <span class=\"ls2 ws2\">....................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y6d ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eAc<span class=\"_ _0\"></span>tivi<span class=\"_ _0\"></span>ty<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8a ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span>m_<span class=\"_ _0\"></span>gam<span class=\"_ _0\"></span>eSce<span class=\"_ _0\"></span>ne<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">...................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">109<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y8b ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>on<span class=\"_ _0\"></span>Updat<span class=\"_ _0\"></span>e<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">110<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y70 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>on<span class=\"_ _0\"></span>Draw<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">110<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:800.150000px;width:481.100000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:782.170000px;width:470.250000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,302,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:764.730000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,208,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:747.290000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:729.260000px;width:492.100000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,91,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:711.820000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:693.840000px;width:481.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.400000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:658.960000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,466,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:640.930000px;width:481.200000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,286,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:606.050000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,87,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.600000px;bottom:553.150000px;width:470.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6a\" data-dest-detail='[106,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:535.160000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6a\" data-dest-detail='[106,\"XYZ\",33,547,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:482.250000px;width:481.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6a\" data-dest-detail='[106,\"XYZ\",33,158,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:394.470000px;width:492.100000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6a\" data-dest-detail='[106,\"XYZ\",33,135,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:376.480000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:359.050000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:341.060000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:323.570000px;width:481.100000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,501,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:306.140000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,407,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:288.150000px;width:481.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,313,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:270.710000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,219,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:253.280000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,760,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.750000px;bottom:217.810000px;width:480.800000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,749,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:202.520000px;width:470.100000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,664,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:167.100000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,558,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:149.060000px;width:470.300000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,476,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:131.620000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,347,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:114.190000px;width:514.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,198,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:78.765000px;width:492.050000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,90,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:43.292000px;width:480.950000px;height:17.987000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf10\" class=\"pf w0 h0\" data-page-no=\"10\"><div class=\"pc pc10 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x7 h8 y43 ff2 fs5 fc0 sc0 ls1 ws0\">Game Le<span class=\"_ _0\"></span>vel<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................................<span class=\"_ _3\"></span>......<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">110<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y44 ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> </span><span class=\"ls1 ws1\">L<span class=\"_ _0\"></span>evel<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">......................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">110<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y45 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Integration <span class=\"lsc ws7\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> a l<span class=\"_ _0\"></span>evel<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">110<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y46 ff2 fs5 fc0 sc0 ls8 ws4\">3.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Elements <span class=\"_ _0\"></span><span class=\"ls9 ws5\">to<span class=\"ls1 ws0\"> manage l<span class=\"_ _0\"></span>eve<span class=\"_ _0\"></span>ls<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>...................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">110<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y47 ff2 fs5 fc0 sc0 ls1 ws1\">3.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">namespace <span class=\"_ _0\"></span>le<span class=\"_ _0\"></span>vel<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">...............................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">110<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y48 ff2 fs5 fc0 sc0 ls1 ws1\">3.2<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enum <span class=\"_ _0\"></span>Leve<span class=\"_ _0\"></span>lId<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>....................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">110<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y49 ff2 fs5 fc0 sc0 ls1 ws1\">3.3<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tLev<span class=\"_ _0\"></span>elM<span class=\"_ _0\"></span>ap<span class=\"ff1 ws0\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">.....................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">111<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4a ff2 fs5 fc0 sc0 ls1 ws0\">Game la<span class=\"_ _0\"></span>ngu<span class=\"_ _0\"></span>age<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">................................................................................................................................................................<span class=\"_ _3\"></span>................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">111<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y4b ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> </span><span class=\"ls1 ws1\">L<span class=\"_ _0\"></span>angu<span class=\"_ _0\"></span>ages<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">..............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">111<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4c ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Elements <span class=\"_ _0\"></span><span class=\"ls9 ws5\">to<span class=\"ls1 ws0\"> manage l<span class=\"_ _0\"></span>ang<span class=\"_ _0\"></span>uag<span class=\"_ _0\"></span>es<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">............................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">111<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y8c ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">namespace <span class=\"_ _0\"></span>l<span class=\"_ _0\"></span>an<span class=\"_ _0\"></span>g<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">111<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y8d ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enum <span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Lang<span class=\"_ _0\"></span>uag<span class=\"_ _0\"></span>e<span class=\"ff1\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.......................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">111<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y4f ff2 fs5 fc0 sc0 ls1 ws0\">Game Dialog <span class=\"_ _0\"></span><span class=\"ls15 wse\">Box<span class=\"ff1 ls1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">.............................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">112<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y8e ff2 fs5 fc0 sc0 ls8 ws4\">1.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">class Ga<span class=\"_ _0\"></span>meDi<span class=\"_ _0\"></span>alog<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">112<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y51 ff2 fs5 fc0 sc0 ls8 ws4\">2.<span class=\"ff5 ls3 ws0\"> <span class=\"ff2 ls1\">Elements <span class=\"_ _0\"></span><span class=\"lsc ws7\">of<span class=\"ls1 ws0\"> Ga<span class=\"_ _0\"></span>meDi<span class=\"_ _0\"></span>alog<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>.......................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">112<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y52 ff2 fs5 fc0 sc0 ls1 ws1\">2.1<span class=\"ff5 ls4 ws0\"> </span>Gam<span class=\"_ _0\"></span>eDia<span class=\"_ _0\"></span>log<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">......................................................................................................................................................................................</span> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">112<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y8f ff2 fs5 fc0 sc0 ls1 ws1\">2.2<span class=\"ff5 ls4 ws0\"> </span><span class=\"ws0\">enum <span class=\"_ _0\"></span>Dial<span class=\"_ _0\"></span>ogI<span class=\"_ _0\"></span>ndex<span class=\"_ _0\"></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls2 ws2\">................................................................................................................................<span class=\"_ _3\"></span>............................................<span class=\"ls1 ws0\"> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">112<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 h8 y54 ff2 fs5 fc0 sc0 ls1 ws1\">2.3<span class=\"ff5 ls4 ws0\"> </span>li<span class=\"_ _0\"></span>nkA<span class=\"_ _0\"></span>rrayT<span class=\"_ _0\"></span>oEnu<span class=\"_ _0\"></span>m<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">............................................................................................................................................................................</span> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">113<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y55 ff2 fs5 fc0 sc0 ls1 ws1\">2.4<span class=\"ff5 ls4 ws0\"> </span>s<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>p<span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">...................................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">113<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y90 ff2 fs5 fc0 sc0 ls1 ws1\">2.5<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tDia<span class=\"_ _0\"></span>log<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>...........................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">114<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y57 ff2 fs5 fc0 sc0 ls1 ws1\">2.6<span class=\"ff5 ls4 ws0\"> </span>se<span class=\"_ _0\"></span>tMou<span class=\"_ _0\"></span>seI<span class=\"_ _0\"></span>nColl<span class=\"_ _0\"></span>iso<span class=\"_ _0\"></span>n<span class=\"ff1 ws0\"> <span class=\"_ _6\"></span><span class=\"ls2 ws2\">................................<span class=\"_ _3\"></span>..........................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">114<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y58 ff2 fs5 fc0 sc0 ls1 ws1\">2.7<span class=\"ff5 ls4 ws0\"> </span>d<span class=\"_ _0\"></span>ra<span class=\"_ _0\"></span>w<span class=\"ff1 ws0\"> <span class=\"_ _1\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">114<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y59 ff2 fs5 fc0 sc0 ls1 ws1\">2.8<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tDia<span class=\"_ _0\"></span>log<span class=\"_ _0\"></span>Index<span class=\"_ _0\"></span><span class=\"ff1 ws0\"> <span class=\"ls2 ws2\">.................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff4 ls7 ws3\">114<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 h8 y7d ff2 fs5 fc0 sc0 ls1 ws1\">2.9<span class=\"ff5 ls4 ws0\"> </span>ge<span class=\"_ _0\"></span>tMou<span class=\"_ _0\"></span>seI<span class=\"_ _0\"></span>nColl<span class=\"_ _0\"></span>ison<span class=\"ff1 ws0\"> <span class=\"_ _7\"></span><span class=\"ls2 ws2\">..........................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff4 ls7 ws3\">114<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 h8 y5b ff2 fs5 fc0 sc0 ls1 ws1\">2.10<span class=\"ff5 ls6 ws0\"> </span>sh<span class=\"_ _0\"></span>owDi<span class=\"_ _0\"></span>alog<span class=\"ff1 ws0\"> <span class=\"_ _4\"></span><span class=\"ls2 ws2\">..................................................................................................................................................................................<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff4 ls7 ws3\">114<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf6d\" data-dest-detail='[109,\"XYZ\",33,525,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:800.150000px;width:514.050000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6e\" data-dest-detail='[110,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:694.390000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6e\" data-dest-detail='[110,\"XYZ\",33,359,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:676.950000px;width:514.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6e\" data-dest-detail='[110,\"XYZ\",33,326,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:658.960000px;width:492.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6e\" data-dest-detail='[110,\"XYZ\",33,267,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:641.480000px;width:492.050000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6f\" data-dest-detail='[111,\"XYZ\",33,445,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:588.620000px;width:514.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6f\" data-dest-detail='[111,\"XYZ\",33,412,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:571.180000px;width:492.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6f\" data-dest-detail='[111,\"XYZ\",33,277,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:553.150000px;width:492.150000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6f\" data-dest-detail='[111,\"XYZ\",33,256,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:535.710000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf70\" data-dest-detail='[112,\"XYZ\",33,144,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:482.850000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf71\" data-dest-detail='[113,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:465.360000px;width:481.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf71\" data-dest-detail='[113,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:429.940000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf71\" data-dest-detail='[113,\"XYZ\",33,314,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:377.030000px;width:470.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf11\" class=\"pf w0 h0\" data-page-no=\"11\"><div class=\"pc pc11 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+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KqrmtXEVmZFV1bJnbKvH/iiL+a7pkRHZIufTJ/r+K1fEuvd759PD9cXJ+dnj84uTzfbe44vfP3x07/TxFw9ONhHVxsq2zeU2ahyHozYtNw9vLIZbx8d3jm+8efvWu6+//v6br792uFhmDBFDVItoWTFmRU6VGWMOc8/tUzwj2mWsZ0SL3B8L6NwGVB8AwKvsq7Movy4SnvWRlx/cvu4D5uPibo/t+O7xt+98eLbt905OP/7i3m8/v/fFo5OH5xeP1pvHm+2maurb3lobxtPoP7/34Bf377WIMetwtbhzfHz35vHd44PXjlbLoR0slker5dFyebBcrsbFouVijFa75mmVORds1XqKoQ1DG7KiqnLesCajWtZ+x5onLyuiqs9H1Q8xj5RVTVPPaKuqmreZmTKmiCli6rne1sXUzzeb883F+fpivbnYbLfnm+mLk82js/P7Dx8+fHx6vrnYVEytZbbKNswhOk05TQc53FguXztavHl4++07N95/6423bt++uVoetFhULCLGurxzdzUau+1Bh2c8VPnsxwVUHwAAf9mqbFGLiKwaIhaLdnz3xlu3b/zw2996cHr2m08/O1lvHqwv7p+c3z95/PDx6fnZ6TQMeXi46VOfphZ1tq179x7+/Pdf1nYb1VfL8fjg6MaN41s3btw4PjpaHdyIuh0XB9mWi8VisVwtlovFYhzGli2zrcZhOcbQIiozsmVki/1el9erLyMzptpth5JV0zRdXGwvpla52k51MV2cbS7Wm4uzzeZiO617P5nGs2n7+Pz84enZw8cnJ6dn5+vzPm0XrS3GobU29anXFFVjLIaYLk5Pjper20fHt46ODxfLG4eHd28e3Ll19K1331oNuRpiETFUjD0W+0mtX1nB+Oz4BtUHAMD/LNWiL6Ja7FbXVeQq63ARt24dvHfr25vM0209PDn78v7D399/8PD09NE0fbnu9x+fnW4u+lTjOGQbp2jbGrPlJtqDi7h/7yzvnUdmVh+368X548OhHawODg8Oj44ODw4OV8vlYhwX42K5HJeLbPPsy4phnvr5tbubVN+dsZcRMW2368324iIutsuLbZ2vzx+fnT8+O3u8Pju/2GyiD4tlb61a2+3SGctcLNq47dNFtKzM6NucpoPFeOv44NbRwc3lm7cODt68deut27dvHx3dPFgdLqoi5pP1rqxdjLEuZ97u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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">18<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y117 ff6 fs0 fc3 sc0 ls1 ws0\">Getting <span class=\"_ _0\"></span>started g<span class=\"_ _0\"></span>uid<span class=\"_ _0\"></span>e<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hb y118 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y119 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y119 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y119 ff3 fs0 fc4 sc0 ls1 ws10\">In<span class=\"_ _0\"></span>troduc<span class=\"_ _0\"></span>tion<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y11a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y11b ff2 fs0 fc0 sc0 ls1 ws0\">Welcome <span class=\"ls1b ws11\">to</span> the <span class=\"ff3\">is::Engine </span>game engine <span class=\"_ _0\"></span>user guide. The purpose <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>this guid<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls16 ws0\"> <span class=\"ls1b ws11\">to</span><span class=\"ls1\"> detail how <span class=\"_ _0\"></span>the API wor<span class=\"_ _0\"></span>ks. </span></span></span></div><div class=\"t m2 xc hc y11c ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y11c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y11c ff3 fs0 fc4 sc0 ls1 ws0\">About the <span class=\"_ _0\"></span>engi<span class=\"_ _0\"></span>ne<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y11d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y11e ff2 fs0 fc0 sc0 ls1 ws0\">is::Engine <span class=\"_ _8\"> </span>is <span class=\"_ _8\"> </span>a <span class=\"_ _8\"> </span>tool <span class=\"_ _8\"> </span>that <span class=\"_ _8\"> </span>relies <span class=\"_ _8\"> </span>on <span class=\"_ _8\"> </span>the <span class=\"_ _8\"> </span>mechanisms <span class=\"_ _8\"> </span>of <span class=\"_ _8\"> </span>the <span class=\"_ _8\"> </span>SFML <span class=\"_ _8\"> </span>library <span class=\"_ _8\"> </span>to <span class=\"_ _8\"> </span>work. <span class=\"_ _8\"> </span>So <span class=\"_ _8\"> </span>if <span class=\"_ _8\"> </span>you<span class=\"_ _9\"></span> <span class=\"_ _a\"> </span>want <span class=\"_ _8\"> </span>to <span class=\"_ _8\"> </span>use <span class=\"_ _8\"> </span>this <span class=\"_ _8\"> </span>tool <span class=\"_ _8\"> </span>it <span class=\"_ _8\"> </span>is </div><div class=\"t m0 x7 hb y11f ff2 fs0 fc0 sc0 ls1 ws0\">strongly <span class=\"_ _3\"></span>advised <span class=\"_ _3\"></span>to <span class=\"_ _3\"></span>k<span class=\"_ _3\"></span>now <span class=\"_ _3\"></span>at <span class=\"_ _b\"></span>least <span class=\"_ _3\"></span>the <span class=\"_ _3\"></span>basic<span class=\"_ _3\"></span>s <span class=\"_ _3\"></span>of <span class=\"_ _3\"></span>SFML. <span class=\"_ _3\"></span>Th<span class=\"_ _3\"></span>e <span class=\"_ _3\"></span>objective <span class=\"_ _3\"></span>of <span class=\"_ _3\"></span>this<span class=\"_ _3\"></span> <span class=\"_ _3\"></span>engine <span class=\"_ _3\"></span>is <span class=\"_ _b\"></span>to <span class=\"_ _3\"></span>offer <span class=\"_ _3\"></span>you <span class=\"_ _b\"></span>features <span class=\"_ _3\"></span>t<span class=\"_ _b\"></span>hat <span class=\"_ _b\"></span>allow <span class=\"_ _3\"></span>you<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hb y120 ff2 fs0 fc0 sc0 ls1 ws0\">to <span class=\"_ _b\"></span>create <span class=\"_ _b\"></span>a<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>game <span class=\"_ _b\"></span>wi<span class=\"_ _3\"></span>th <span class=\"_ _b\"></span>the <span class=\"_ _9\"></span>most <span class=\"_ _b\"></span>fl<span class=\"_ _3\"></span>exibility <span class=\"_ _b\"></span>poss<span class=\"_ _3\"></span>ible <span class=\"_ _b\"></span>and <span class=\"_ _b\"></span>t<span class=\"_ _3\"></span>o <span class=\"_ _b\"></span>easily <span class=\"_ _9\"></span>carry <span class=\"_ _b\"></span>it <span class=\"_ _b\"></span>o<span class=\"_ _3\"></span>n <span class=\"_ _b\"></span>various<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>platforms<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>(Web<span class=\"_ _9\"></span>-HTML5, <span class=\"_ _9\"></span>Windows, </div><div class=\"t m0 x7 hb y121 ff2 fs0 fc0 sc0 ls1 ws0\">Linux, Mobile).<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hb y122 ff2 fs0 fc0 sc0 ls1 ws0\">The <span class=\"_ _3\"></span>engine <span class=\"_ _3\"></span>is <span class=\"_ _3\"></span>directly <span class=\"_ _b\"></span>delivered <span class=\"_ _3\"></span>with <span class=\"_ _3\"></span>an <span class=\"_ _3\"></span>I<span class=\"_ _3\"></span>DE <span class=\"_ _3\"></span>to <span class=\"_ _3\"></span>avoid <span class=\"_ _b\"></span>reconfiguratio<span class=\"_ _3\"></span>ns <span class=\"_ _3\"></span>and <span class=\"_ _3\"></span>to <span class=\"_ _3\"></span>star<span class=\"_ _3\"></span>t <span class=\"_ _3\"></span>quickly <span class=\"_ _b\"></span>with <span class=\"_ _3\"></span>this <span class=\"_ _3\"></span>one. <span class=\"_ _3\"></span>No<span class=\"_ _b\"></span><span class=\"ls1e ws14\">te</span> th<span class=\"_ _3\"></span>at <span class=\"_ _3\"></span>each<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hb y123 ff2 fs0 fc0 sc0 ls17 ws15\">IDE<span class=\"ls1 ws0\"> with which <span class=\"_ _3\"></span>the engin<span class=\"_ _3\"></span>e is d<span class=\"_ _3\"></span>elivered makes<span class=\"_ _3\"></span> it possibl<span class=\"_ _3\"></span>e to ca<span class=\"_ _3\"></span>rry your proj<span class=\"_ _3\"></span>ect <span class=\"ls1f ws16\">on</span> a target platfo<span class=\"_ _3\"></span>rm. <span class=\"ls20 ws17\">So</span> the <span class=\"_ _3\"></span>Mobile <span class=\"_ _3\"></span>Studio<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y124 ff2 fs0 fc0 sc0 ls1 ws0\">project lets you use th<span class=\"_ _3\"></span>e engine to develop on M<span class=\"_ _3\"></span>obile.<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hc y125 ff2 fs0 fc0 sc0 ls1 ws0\">The header which <span class=\"_ _0\"></span>gives access <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>the engine is: <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isEn<span class=\"_ _0\"></span>gine/cor<span class=\"_ _0\"></span>e/G<span class=\"_ _0\"></span>ameEng<span class=\"_ _0\"></span>ine.<span class=\"_ _0\"></span>h<span class=\"ff3 fc6\">.<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hc y126 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc yf4 ff3 fs0 fc4 sc0 ls1a\">3.</div><div class=\"t m3 xd hd yf4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc yf4 ff3 fs0 fc4 sc0 ls1 ws0\">Engine <span class=\"_ _0\"></span>str<span class=\"_ _0\"></span>ucture<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y127 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xf he y128 ff3 fs6 fc0 sc0 ls1 ws0\">is<span class=\"_ _0\"></span>Engi<span class=\"_ _0\"></span>ne <span class=\"_ _c\"> </span><span class=\"ff2 fs0 v2\">act<span class=\"_ _0\"></span>ivit<span class=\"_ _0\"></span>y <span class=\"_ _d\"> </span><span class=\"v3\">con<span class=\"_ _0\"></span>fig </span></span></div><div class=\"t m0 x1 hf y129 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h10 y12a ff2 fs6 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h10 y12b ff2 fs6 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h10 y12c ff2 fs6 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x10 h11 y12d ff3 fs6 fc0 sc0 ls1 ws0\">ass<span class=\"_ _0\"></span>ets </div><div class=\"t m0 x11 h6 y12e ff3 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x11 h6 y12f ff3 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x11 h6 y130 ff3 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x11 h6 y131 ff3 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xf h6 y132 ff3 fs4 fc0 sc0 ls1 ws0\">ma<span class=\"_ _0\"></span>in.c<span class=\"_ _0\"></span>pp </div><div class=\"t m0 x12 h6 y133 ff3 fs4 fc0 sc0 ls1 ws0\">Fi<span class=\"_ _0\"></span>l<span class=\"_ _0\"></span>e </div><div class=\"t m0 x13 h11 y12a ff3 fs6 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x13 h11 y134 ff3 fs6 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x14 h11 y135 ff3 fs6 fc0 sc0 ls1 ws0\">app_<span class=\"_ _0\"></span>src<span class=\"_ _0\"></span> </div><div class=\"t m0 x15 hb y136 ff2 fs0 fc0 sc0 ls1 ws0\">game<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span> </div><div class=\"t m0 x16 hb y137 ff2 fs0 fc0 sc0 ls1 ws0\">m_e<span class=\"_ _0\"></span>xt </div><div class=\"t m0 x17 hb y138 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x17 hb y139 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x16 hb y13a ff2 fs0 fc0 sc0 ls1 ws0\">lan<span class=\"_ _0\"></span>guage </div><div class=\"t m0 x1 hb y13b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h12 y13c ff2 fs8 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xf h12 y13d ff2 fs8 fc0 sc0 ls1 ws0\">Ga<span class=\"_ _0\"></span>m<span class=\"_ _0\"></span>e </div><div class=\"t m0 x18 hb y13e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x19 hb y13f ff2 fs0 fc0 sc0 ls1 ws0\">sce<span class=\"_ _0\"></span>nes </div><div class=\"t m0 x1a hb y140 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1a hb y141 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1b hb y142 ff2 fs0 fc0 sc0 ls1 ws0\">obj<span class=\"_ _0\"></span>ects </div><div class=\"t m0 x1c hb yb3 ff2 fs0 fc0 sc0 ls1 ws0\">leve<span class=\"_ _0\"></span>ls </div><div class=\"t m0 x1 hb y143 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y144 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y145 ff3 fs0 fc4 sc0 ls1 ws10\">3.1</div><div class=\"t m3 x1d hd y145 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y145 ff3 fs0 fc4 sc0 ls1 ws10\">app<span class=\"_ _0\"></span>_src<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y146 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb yb7 ff2 fs0 fc0 sc0 ls1 ws0\">Directory that <span class=\"_ _0\"></span>contains<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the source code <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the game. </span></span></div><div class=\"t m0 x7 hb y147 ff2 fs0 fc0 sc0 ls1 ws0\">Description of these su<span class=\"_ _3\"></span>bdirectories:<span class=\"_ _3\"></span> </div><div class=\"t m2 xc h13 y148 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y148 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y148 ff3 fs0 fc0 sc0 ls1 ws10\">activity<span class=\"ff2 ws0\">: Contains the <span class=\"ff3\">Activity </span>class <span class=\"ff6\">(click<span class=\"_ _3\"></span> here <span class=\"_ _0\"></span>for <span class=\"ls18 ws18\">more</span> information: <span class=\"ff3 fc7 ws10\">1</span>) <span class=\"_\"> </span><span class=\"ff2\">which launches the <span class=\"_ _0\"></span>different<span class=\"_ _3\"></span> scenes </span></span></span></div><div class=\"t m0 xe hb y149 ff2 fs0 fc0 sc0 ls1 ws0\">of the game and ensures th<span class=\"_ _3\"></span>eir interactions.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc h13 y14a ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y14a ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y14a ff3 fs0 fc0 sc0 ls1 ws10\">config<span class=\"ff2 ws0\">: Contains the <span class=\"_ _0\"></span><span class=\"ff3\">GameC<span class=\"_ _3\"></span>onfig.cpp <span class=\"ff2\">file <span class=\"ff6\">(click here for <span class=\"_ _0\"></span><span class=\"ls18 ws18\">more<span class=\"ls1 ws0\"> information: <span class=\"_ _3\"></span><span class=\"ff3 fc7 ws10\">1</span>) <span class=\"ff2\">which allows you <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> define the </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 xe hc y14b ff2 fs0 fc0 sc0 ls1 ws0\">general parameters of<span class=\"_ _3\"></span> the game. It als<span class=\"_ _3\"></span>o contains the file <span class=\"_ _3\"></span><span class=\"ff3\">ExtraC<span class=\"_ _3\"></span>onfig.h </span>which a<span class=\"_ _3\"></span>llows to activate / deac<span class=\"_ _3\"></span>tivate </div><div class=\"t m0 xe hb y14c ff2 fs0 fc8 sc0 ls1 ws0\">certain engine functionality.<span class=\"_ _3\"></span><span class=\"fc0\"> </span></div><div class=\"t m2 xc h13 y14d ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y14d ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y14d ff3 fs0 fc0 sc0 ls1 ws10\">gamesystem_ext<span class=\"ff2 ws0\">:<span class=\"_ _3\"></span> Contains a class de<span class=\"_ _0\"></span>rived <span class=\"ff6\">(click here for <span class=\"_ _0\"></span><span class=\"ls18 ws18\">more<span class=\"ls1 ws0\"> information: <span class=\"ff3 fc7 ws10\">1</span>)<span class=\"_ _3\"></span> <span class=\"ff2\">from <span class=\"_ _0\"></span><span class=\"ff3\">G<span class=\"_ _3\"></span>ameSystem <span class=\"ff6\">(click </span></span></span></span></span></span></span></div><div class=\"t m0 xe hc y14e ff6 fs0 fc0 sc0 ls1 ws0\">here for more informa<span class=\"_ _3\"></span>tion: <span class=\"ff3 fc7 ws10\">1</span><span class=\"ls21\">) <span class=\"_ _3\"></span></span><span class=\"ff2\">which allows you to ma<span class=\"_ _3\"></span>nipulate the gam<span class=\"_ _3\"></span>e data (save, l<span class=\"_ _3\"></span>oad, etc.).<span class=\"_ _3\"></span> </span></div><div class=\"t m2 xc h13 y14f ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y14f ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y14f ff3 fs0 fc0 sc0 ls1 ws10\">language<span class=\"ff2 ws0\">: Contains the <span class=\"ff3\">GameLanguage<span class=\"_ _3\"></span>.cpp </span>file <span class=\"_ _0\"></span><span class=\"ff6\">(click<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>he<span class=\"_ _3\"></span>re <span class=\"_ _0\"></span>for<span class=\"_ _3\"></span> <span class=\"ls18 ws18\">more</span> <span class=\"_ _0\"></span>information:<span class=\"_ _3\"></span> <span class=\"ff3 fc7 ws10\">1</span>) <span class=\"ff2\">which allows <span class=\"_ _0\"></span>you <span class=\"ls1b\">to </span></span></span></span></div><div class=\"t m0 xe hb y150 ff2 fs0 fc0 sc0 ls1 ws0\">manage everything r<span class=\"_ _3\"></span>elated to the langua<span class=\"_ _3\"></span>ges of the game.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc h13 y151 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y151 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y151 ff3 fs0 fc0 sc0 ls1 ws10\">levels<span class=\"ff2 ws0\">: Contains the <span class=\"_ _0\"></span>l<span class=\"_ _3\"></span>evels and the <span class=\"ff3\">Level.h <span class=\"_ _0\"></span><span class=\"ff2\">fil<span class=\"_ _3\"></span>e <span class=\"ff6\">(click here for <span class=\"_ _0\"></span><span class=\"ls18 ws18\">more<span class=\"ls1 ws0\"> information<span class=\"_ _3\"></span>: <span class=\"ff3 fc7 ws10\">1</span>) <span class=\"ff2\">which allows you <span class=\"ls1b\">to </span></span></span></span></span></span></span></span></div><div class=\"t m0 xe hb y152 ff2 fs0 fc0 sc0 ls1 ws0\">integrate them into th<span class=\"_ _3\"></span>e game. </div><div class=\"t m2 xc h13 y153 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y153 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y153 ff3 fs0 fc0 sc0 ls1 ws10\">objects<span class=\"ff2 ws0\">: Contains the objects that <span class=\"_ _0\"></span>will<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls22 ws19\">be<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>us<span class=\"_ _3\"></span>ed <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the different s<span class=\"_ _0\"></span>cenes<span class=\"_ _0\"></span>. </span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf12\" class=\"pf w0 h0\" data-page-no=\"12\"><div class=\"pc pc12 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbQRHAIAxFwaaDhFiIfz94QENqoYdeoLsKmPzTOxDdfQEAAHCo2wkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAIBfGE5wpMxca2337DlnVZkPAAA+FN3tCufZd9aIMB8AAKg+AAAAXvGvDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAA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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">19<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y154 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y154 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y154 ff3 fs0 fc0 sc0 ls1 ws10\">scenes<span class=\"ff2 ws0\">: Contains the different <span class=\"_ _0\"></span>sc<span class=\"_ _3\"></span>enes of the <span class=\"_ _0\"></span>game <span class=\"_ _3\"></span><span class=\"ff6\">(click here for <span class=\"_ _0\"></span><span class=\"ls18 ws18\">more<span class=\"ls1 ws0\"> information:<span class=\"_ _3\"></span> <span class=\"ff3 fc7 ws10\">1</span>) <span class=\"_ _0\"></span><span class=\"ff2\">(Introductio<span class=\"_ _3\"></span>n, Main </span></span></span></span></span></div><div class=\"t m0 xe hb y155 ff2 fs0 fc0 sc0 ls1 ws0\">menu, ...). </div><div class=\"t m0 x1 hb y156 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y157 ff3 fs0 fc4 sc0 ls1 ws10\">3.2</div><div class=\"t m3 x1d hd y157 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y157 ff3 fs0 fc4 sc0 ls1 ws10\">is<span class=\"_ _0\"></span>Engin<span class=\"_ _0\"></span>e<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y158 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y159 ff2 fs0 fc0 sc0 ls1 ws0\">Directory that <span class=\"_ _0\"></span>contains<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the source code <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>gam<span class=\"_ _3\"></span>e e<span class=\"_ _0\"></span>ngin<span class=\"_ _0\"></span>e. </span></span></div><div class=\"t m2 xc hc y15a ff3 fs0 fc4 sc0 ls1 ws10\">3.3</div><div class=\"t m3 x1d hd y15a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y15a ff3 fs0 fc4 sc0 ls1 ws10\">ass<span class=\"_ _0\"></span>ets<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y15b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y15c ff2 fs0 fc0 sc0 ls1 ws0\">Directory <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>game resource files <span class=\"_ _0\"></span>(music,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>sound effects, im<span class=\"_ _3\"></span>ages ..<span class=\"_ _0\"></span>.). </div><div class=\"t m0 x1 hb y15d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y15e ff3 fs0 fc4 sc0 ls1 ws10\">3.4</div><div class=\"t m3 x1d hd y15e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y15e ff3 fs0 fc4 sc0 ls1 ws0\">main.cpp <span class=\"_ _0\"></span>fi<span class=\"_ _0\"></span>le<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y15f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y160 ff2 fs0 fc0 sc0 ls1 ws0\">This file <span class=\"_ _0\"></span>contains the function <span class=\"_ _0\"></span>which<span class=\"_ _3\"></span> allows <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> launch the p<span class=\"_ _0\"></span>rogr<span class=\"_ _0\"></span>am. </span></span></div><div class=\"t m2 xc hc y161 ff3 fs0 fc4 sc0 ls1 ws10\">3.4.1</div><div class=\"t m3 x1f hd y161 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y161 ff3 fs0 fc4 sc0 ls1 ws10\">ma<span class=\"_ _0\"></span>in<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y162 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y21 ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0\">m<span class=\"_ _0\"></span>ain() </span></div><div class=\"t m0 x1 hb y163 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y164 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y165 ff2 fs0 fc0 sc0 ls1 ws0\">The <span class=\"_ _b\"></span>main<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>function<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>that<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>laun<span class=\"_ _3\"></span>ches <span class=\"_ _b\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _b\"></span>gam<span class=\"_ _3\"></span>e <span class=\"_ _b\"></span>engi<span class=\"_ _3\"></span>ne. <span class=\"_ _b\"></span>Insid<span class=\"_ _3\"></span>e <span class=\"_ _b\"></span>you<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>will<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>find <span class=\"_ _8\"> </span><span class=\"ff3\">GameEngine <span class=\"_ _b\"></span>g<span class=\"_ _3\"></span>ame; <span class=\"_ _9\"></span></span>which <span class=\"_ _9\"></span>initializes<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>the <span class=\"_ _9\"></span>game </div><div class=\"t m0 x7 hb y166 ff2 fs0 fc0 sc0 ls1 ws0\">eng<span class=\"_ _0\"></span>ine. </div><div class=\"t m0 x7 hc y167 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fcc\">0 <span class=\"_ _e\"> </span><span class=\"fc0\">when the program <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>finished<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>an<span class=\"_ _3\"></span>d another <span class=\"_ _0\"></span>val<span class=\"_ _3\"></span>ue <span class=\"_ _0\"></span><span class=\"ls1f ws16\">if<span class=\"ls1 ws0\"> there <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> error <span class=\"_ _0\"></span>during exec<span class=\"_ _0\"></span>ution<span class=\"_ _0\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y168 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y169 ff3 fs0 fc4 sc0 ls1 ws10\">3.4.2</div><div class=\"t m3 x1f hd y169 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y169 ff3 fs0 fc4 sc0 ls1 ws10\">gam<span class=\"_ _0\"></span>e.pla<span class=\"_ _0\"></span>y<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y16a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y16b ff2 fs0 fc0 sc0 ls1 ws0\">game<span class=\"_ _0\"></span>.pl<span class=\"_ _0\"></span>ay() </div><div class=\"t m0 x7 hc y16c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y16d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y16e ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"_ _9\"></span>to <span class=\"_ _f\"></span>use <span class=\"_ _9\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _9\"></span>main <span class=\"_ _f\"></span>loop <span class=\"_ _9\"></span>of <span class=\"_ _f\"></span>the <span class=\"_ _f\"></span>game <span class=\"_ _9\"></span>engi<span class=\"_ _3\"></span>ne <span class=\"_ _9\"></span>which <span class=\"_ _f\"></span>allows <span class=\"_ _f\"></span>you <span class=\"_ _9\"></span>to <span class=\"_ _9\"></span>la<span class=\"_ _3\"></span>unch <span class=\"_ _9\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _9\"></span>differe<span class=\"_ _3\"></span>nt <span class=\"_ _9\"></span>game <span class=\"_ _9\"></span>sc<span class=\"_ _3\"></span>enes <span class=\"_ _9\"></span>(Int<span class=\"_ _3\"></span>roduction,<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hb y16f ff2 fs0 fc0 sc0 ls1 ws0\">Main menu, ...).<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y170 ff3 fs0 fc4 sc0 ls1 ws10\">3.4.3</div><div class=\"t m3 x1f hd y170 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y170 ff3 fs0 fc4 sc0 ls1 ws10\">gam<span class=\"_ _0\"></span>e.basi<span class=\"_ _0\"></span>cSFML<span class=\"_ _0\"></span>main<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y171 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y172 ff2 fs0 fc0 sc0 ls1 ws0\">game<span class=\"_ _0\"></span>.bas<span class=\"_ _0\"></span>icSF<span class=\"_ _0\"></span>MLmain<span class=\"_ _0\"></span>() </div><div class=\"t m0 x7 hc y173 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y174 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y175 ff2 fs0 fc0 sc0 ls1 ws0\">Displays <span class=\"_ _b\"></span>a <span class=\"_ _3\"></span>cla<span class=\"_ _3\"></span>ssic <span class=\"_ _3\"></span>SF<span class=\"_ _3\"></span>ML <span class=\"_ _3\"></span>window. <span class=\"_ _3\"></span>This <span class=\"_ _b\"></span>functio<span class=\"_ _3\"></span>n <span class=\"_ _3\"></span>allows <span class=\"_ _b\"></span>you <span class=\"_ _b\"></span>to <span class=\"_ _3\"></span>use <span class=\"_ _b\"></span>your <span class=\"_ _b\"></span>own <span class=\"_ _3\"></span>r<span class=\"_ _3\"></span>endering <span class=\"_ _3\"></span>l<span class=\"_ _3\"></span>oop <span class=\"_ _3\"></span>with <span class=\"_ _b\"></span>the <span class=\"_ _b\"></span>engine. <span class=\"_ _3\"></span>V<span class=\"_ _3\"></span>ery <span class=\"_ _b\"></span>useful<span class=\"_ _b\"></span> </div><div class=\"t m0 x7 hb y176 ff2 fs0 fc0 sc0 ls1 ws0\">if <span class=\"_ _3\"></span>you<span class=\"_ _3\"></span> <span class=\"_ _b\"></span>wa<span class=\"_ _3\"></span>nt <span class=\"_ _b\"></span>to <span class=\"_ _b\"></span>use <span class=\"_ _b\"></span>a<span class=\"_ _3\"></span>n <span class=\"_ _b\"></span>SFML <span class=\"_ _9\"></span>project <span class=\"_ _b\"></span>alr<span class=\"_ _3\"></span>eady <span class=\"_ _b\"></span>under <span class=\"_ _b\"></span>d<span class=\"_ _3\"></span>evelopment <span class=\"_ _b\"></span>with <span class=\"_ _9\"></span>the <span class=\"_ _b\"></span>engi<span class=\"_ _3\"></span>ne <span class=\"_ _b\"></span>or <span class=\"_ _b\"></span>t<span class=\"_ _3\"></span>o <span class=\"_ _b\"></span>integrate <span class=\"_ _b\"></span>you<span class=\"_ _3\"></span>r <span class=\"_ _b\"></span>own<span class=\"_ _9\"></span> <span class=\"_\"> </span>components </div><div class=\"t m0 x7 hb y177 ff2 fs0 fc0 sc0 ls1d ws13\">in<span class=\"ls1 ws0\">to the engine.<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x1 hb y178 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y179 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y17a ff6 fs0 fc3 sc0 ls1 ws10\">Di<span class=\"_ _0\"></span>spla<span class=\"_ _0\"></span>y<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hb y17b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y17c ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y17c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y17c ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameDisplay </div><div class=\"t m0 x7 hc y17d ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">GameDisplay;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y17e ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/disp<span class=\"_ _0\"></span>lay/<span class=\"_ _0\"></span>GameD<span class=\"_ _0\"></span>ispla<span class=\"_ _0\"></span>y.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y17f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y180 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y181 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y182 ff2 fs0 fc0 sc0 ls1 ws0\">Abstract class that allows you <span class=\"ls1b ws11\">to</span> create the scene <span class=\"ls1c ws12\">of</span> a game. A scene <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>a<span class=\"_ _3\"></span> place where the objects <span class=\"ls1c ws12\">of</span> the game come <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>life </div><div class=\"t m0 x7 hb y183 ff2 fs0 fc0 sc0 ls1 ws0\">(Main Menu, Level, <span class=\"_ _3\"></span>etc.). This cl<span class=\"_ _3\"></span>ass offers you functions t<span class=\"_ _3\"></span>hat allow you to easil<span class=\"_ _3\"></span>y manipula<span class=\"_ _3\"></span>te the view, apply win<span class=\"_ _3\"></span>dow </div><div class=\"t m0 x7 hb y184 ff2 fs0 fc0 sc0 ls1 ws0\">events on the scene, ma<span class=\"_ _3\"></span>ke animations o<span class=\"_ _3\"></span>n texts and sprites, displa<span class=\"_ _3\"></span>y dialog boxes, etc.<span class=\"_ _b\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf13\" class=\"pf w0 h0\" data-page-no=\"13\"><div class=\"pc pc13 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcsRHDIAxA0ZDzOmYLxmMhHxUTMQHKEhQEvzeB0Kn5hZ0i4gMAAMChvlYAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOqzAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUnxUAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPqsAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACo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AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoP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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">20<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y117 ff3 fs0 fc4 sc0 ls1 ws0\">Public <span class=\"_ _0\"></span>metho<span class=\"_ _0\"></span>ds<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y185 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y185 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y185 ff3 fs0 fc4 sc0 ls1 ws10\">Game<span class=\"_ _0\"></span>Dis<span class=\"_ _0\"></span>play<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y186 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y187 ff2 fs0 fc0 sc0 ls1 ws0\">Gam<span class=\"_ _0\"></span>eDis<span class=\"_ _0\"></span>play(<span class=\"_ _0\"></span>GameSy<span class=\"_ _0\"></span>stemEx<span class=\"_ _0\"></span>tende<span class=\"_ _0\"></span>d <span class=\"_ _9\"></span>&amp;gameS<span class=\"_ _0\"></span>ysExt<span class=\"_ _0\"></span>, <span class=\"_ _9\"></span>sf::Col<span class=\"_ _0\"></span>or <span class=\"_ _9\"></span>bgCo<span class=\"_ _0\"></span>lor<span class=\"_ _0\"></span>) </div><div class=\"t m0 x7 hc y188 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y189 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y9c ff2 fs0 fc0 sc0 ls1 ws0\">Constructor which <span class=\"_ _0\"></span>allows you to create <span class=\"_ _0\"></span>a GameDisplay object, <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"ls1 ws0\"> takes <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>parameter a GameSystemExte<span class=\"_ _3\"></span>nded ob<span class=\"_ _0\"></span>ject </span></span></div><div class=\"t m0 x7 hc y18a ff6 fs0 fc0 sc0 ls1 ws0\">(click here <span class=\"_ _0\"></span>for more information: <span class=\"ff3 fc7 ws10\">1</span>)<span class=\"_ _3\"></span> <span class=\"ff2\">and <span class=\"_ _0\"></span>the background color <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the scen<span class=\"_ _0\"></span>e. </span></div><div class=\"t m0 x1 hb y18b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y18c ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y18c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y18c ff3 fs0 fc4 sc0 ls1 ws10\">st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y18d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y18e ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0\">step() = <span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 hc y18f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y190 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y191 ff2 fs0 fc0 sc0 ls1 ws0\">Method which makes <span class=\"ls1f ws16\">it<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> possible <span class=\"ls1e ws14\">to</span> <span class=\"_ _0\"></span>implement<span class=\"_ _3\"></span> the part <span class=\"_ _0\"></span>where the objects <span class=\"ls1c ws12\">of</span> the scene are <span class=\"_ _0\"></span>updated (displac<span class=\"_ _3\"></span>ement of the </span></span></div><div class=\"t m0 x7 hb ye5 ff2 fs0 fc0 sc0 ls1 ws0\">objects, detection of col<span class=\"_ _3\"></span>lision, etc).<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hb y192 ff6 fs0 fc0 sc0 ls1 ws0\">Note: When <span class=\"_ _0\"></span>the SDM is activated and the <span class=\"_ _0\"></span>user does not <span class=\"_ _0\"></span>overloa<span class=\"_ _3\"></span>d this <span class=\"_ _0\"></span>func<span class=\"_ _3\"></span>tion the SDM takes <span class=\"_ _0\"></span>care of calling this </div><div class=\"t m0 x7 hb y193 ff6 fs0 fc0 sc0 ls1 ws0\">method to automatic<span class=\"_ _3\"></span>ally update the objects of t<span class=\"_ _3\"></span>he scene and the <span class=\"_ _3\"></span>events of the wi<span class=\"_ _3\"></span>ndow.<span class=\"_ _b\"></span> </div><div class=\"t m2 xc hc y194 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y194 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y194 ff3 fs0 fc4 sc0 ls1 ws10\">dr<span class=\"_ _0\"></span>aw<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y195 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0\">draw()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y196 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y197 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y198 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y199 ff2 fs0 fc0 sc0 ls1 ws0\">Method which makes <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"ls1 ws0\"> possible <span class=\"ls1b ws11\">to</span> implement <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e part <span class=\"_ _0\"></span>where the objects <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>scene<span class=\"_ _3\"></span> will <span class=\"ls22 ws19\">be</span> dr<span class=\"_ _0\"></span>aw. </span></span></span></span></div><div class=\"t m0 x1 hb y19a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y19b ff6 fs0 fc0 sc0 ls1 ws0\">Note: When <span class=\"_ _0\"></span>the SDM is activated and the <span class=\"_ _0\"></span>user does not <span class=\"_ _0\"></span>overloa<span class=\"_ _3\"></span>d this <span class=\"_ _0\"></span>func<span class=\"_ _3\"></span>tion the SDM takes <span class=\"_ _0\"></span>care of calling this </div><div class=\"t m0 x7 hb y19c ff6 fs0 fc0 sc0 ls1 ws0\">method to automatic<span class=\"_ _3\"></span>ally draw the objects<span class=\"_ _3\"></span> of the scene.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y19d ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y19d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y19d ff3 fs0 fc4 sc0 ls1 ws0\">dra<span class=\"_ _0\"></span>wScree<span class=\"_ _0\"></span>n </div><div class=\"t m0 x7 hc y19e ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0\">d<span class=\"_ _3\"></span>rawScreen() </span></span></div><div class=\"t m0 x7 hc y19f ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1a0 ff2 fs0 fc0 sc0 ls1 ws0\">Method <span class=\"ls25 ws1b\">for</span> <span class=\"_ _0\"></span>imple<span class=\"_ _3\"></span>menting the part <span class=\"_ _0\"></span>where <span class=\"_ _3\"></span>the objects <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the game scene wi<span class=\"_ _0\"></span>ll<span class=\"_ _3\"></span> <span class=\"ls26 ws1c\">be</span> d<span class=\"_ _0\"></span>raw. </span></span></div><div class=\"t m2 xc hc y1a1 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y1a1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1a1 ff3 fs0 fc4 sc0 ls1 ws10\">show<span class=\"_ _0\"></span>Temp<span class=\"_ _0\"></span>Loadin<span class=\"_ _0\"></span>g<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1a2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1a3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">showT<span class=\"_ _3\"></span>empLoading(<span class=\"fc9 ws0\">floa<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span><span class=\"fc0\">time<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"fcc ls24 ws1d\">3.f</span><span class=\"fcc\"> * <span class=\"_ _0\"></span>is:<span class=\"_ _0\"></span>:SECOND<span class=\"_ _0\"></span><span class=\"fc0\">) </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1a4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1a5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1a6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1a7 ff2 fs0 fc0 sc0 ls1 ws0\">Displays a <span class=\"_ _0\"></span>false loading <span class=\"_ _0\"></span>scr<span class=\"_ _3\"></span>een (Useful <span class=\"ls25 ws1b\">for</span> <span class=\"_ _0\"></span>making transitions <span class=\"ls1d ws13\">in</span> the <span class=\"_ _0\"></span>same sce<span class=\"_ _0\"></span>ne). </div><div class=\"t m0 x7 hc y1a8 ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"fc0\">time <span class=\"ff2\">represents the duration <span class=\"_ _0\"></span>(in milliseconds)<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>loadin<span class=\"_ _0\"></span>g. </span></span></div><div class=\"t m0 x1 hb y1a9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1aa ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y1aa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1aa ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tOption<span class=\"_ _0\"></span>Inde<span class=\"_ _0\"></span>x<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y1ab ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y1ab ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y1ab ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>form :<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y1ac ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ad ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setOptionI<span class=\"_ _3\"></span>ndex(<span class=\"fc9 ws0\">int<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">optionIndexValue,<span class=\"_ _3\"></span> <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">callWhenClick,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">buttonScale = <span class=\"_ _0\"></span><span class=\"fcc ws10\">1.3<span class=\"_ _0\"></span>f<span class=\"fc0 ws0\">) </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y1ae ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc yfc ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1af ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>make animations <span class=\"ls1f ws16\">on</span> <span class=\"_ _0\"></span>texts and play <span class=\"_ _0\"></span>a sound when you <span class=\"_ _0\"></span>change<span class=\"_ _3\"></span> <span class=\"ls23 ws1a\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> opt<span class=\"_ _0\"></span>ion. </span></span></div><div class=\"t m2 xc h13 y1b0 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y1b0 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y1b0 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>form :<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf14\" class=\"pf w0 h0\" data-page-no=\"14\"><div class=\"pc pc14 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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PgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfcBv+3VsgjAUhWGUfwINvF5cIUNkgpB5rHQHIW36rJL2DZJSSxtJGXhwTnfLy73NBwAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPm6XRsIAAAD0SURBVAAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAADgb/X1w5wkub8u3TYl6/heno/fnNt+3aak1UVLKWlQrdWTAgBw4NMstzvLF4yYCNoVrPP6AAAAAElFTkSuQmCC\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">21<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setOptionIndex<span class=\"_ _3\"></span>(</span>int <span class=\"fc0\">o<span class=\"_ _0\"></span>ption<span class=\"_ _0\"></span>Inde<span class=\"_ _0\"></span>xValu<span class=\"_ _0\"></span>e) </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b4 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>change <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>opti<span class=\"_ _0\"></span>on. </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tText<span class=\"_ _0\"></span>Animat<span class=\"_ _0\"></span>ion<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y1b6 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y1b6 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y1b6 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>form :<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y1b7 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b8 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0\">setTextAnimation(sf::T<span class=\"_ _3\"></span>ext <span class=\"_ _0\"></span>&amp;txt,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>sf::Sprite <span class=\"_ _3\"></span>&amp;spr, <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0\">v<span class=\"_ _0\"></span>al<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y1b9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ba ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1bb ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> make <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> animation <span class=\"ls1f ws16\">on</span> <span class=\"_ _0\"></span>a <span class=\"_ _0\"></span>text<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>and a <span class=\"_ _3\"></span>sprite according<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> the choice <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> op<span class=\"_ _0\"></span>tion<span class=\"_ _0\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1bc ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y1bd ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y1bd ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y1bd ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>form :<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y1be ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1bf ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0\">setTextAnimati<span class=\"_ _3\"></span>on(sf::Text <span class=\"ls27 ws1e\">&amp;txt,</span> <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0\">&amp;var, </span>int <span class=\"fc0\">v<span class=\"_ _0\"></span>al)<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x1 hb y1c0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1c1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1c2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1c3 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> make <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> animation <span class=\"ls1f ws16\">on<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> a text <span class=\"_ _0\"></span>accordi<span class=\"_ _3\"></span>ng <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>the choice <span class=\"ls1c ws12\">of</span> <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>opti<span class=\"_ _0\"></span>on. </span></span></span></span></div><div class=\"t m2 xc hc y1c4 ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y1c4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1c4 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tView<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y1c5 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y1c5 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y1c5 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>form :<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y1c6 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1c7 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">setVi<span class=\"_ _0\"></span>ew() </span></span></div><div class=\"t m2 xc h13 y1c8 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y1c8 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y1c8 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>form :<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y1c9 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ca ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0\">setView(s<span class=\"_ _3\"></span>f::Vector2f <span class=\"ls28 ws1f\">v)</span> </span></span></div><div class=\"t m0 x1 hb y1cb ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y1cc ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y1cc ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y1cc ff6 fs0 fc0 sc0 ls1 ws0\">Third <span class=\"_ _0\"></span>form<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y1cd ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ce ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setView(</span>float <span class=\"fc0 ls29\">x, </span>float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ls28 ws1f\">y)<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y1cf ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1d0 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb yed ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>position<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>view <span class=\"ls1d ws13\">in</span> the <span class=\"_ _0\"></span>sce<span class=\"_ _0\"></span>ne. </div><div class=\"t m0 x1 hb y1d1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1d2 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y1d2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1d2 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tView<span class=\"_ _0\"></span>VarX<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1d3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1d4 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setViewVarX(</span>float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">va<span class=\"_ _0\"></span>l) </span></span></div><div class=\"t m0 x7 hc y1d5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1d6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1d7 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the <span class=\"_ _0\"></span>va<span class=\"_ _3\"></span>riable <span class=\"ff3 ws10\">m_view<span class=\"_ _0\"></span>X<span class=\"ff2 ws0\">. </span></span></div><div class=\"t m0 x1 hb y1d8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1d9 ff3 fs0 fc4 sc0 ls1 ws10\">2.10</div><div class=\"t m3 x21 hd y1d9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1d9 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tView<span class=\"_ _0\"></span>VarY </div><div class=\"t m0 x7 hc y1da ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etViewVarY(<span class=\"fc9 ws0\">flo<span class=\"_ _3\"></span>at <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y1db ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1dc ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the <span class=\"_ _0\"></span>va<span class=\"_ _3\"></span>riable <span class=\"ff3 ws10\">m_view<span class=\"_ _0\"></span>Y<span class=\"ff2 ws0\">. </span></span></div><div class=\"t m0 x1 hb y1dd ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y88 ff3 fs0 fc4 sc0 ls1 ws10\">2.11</div><div class=\"t m3 x21 hd y88 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y88 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tView<span class=\"_ _0\"></span>VarXY<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1de ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1df ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setViewVar<span class=\"_ _3\"></span>XY(<span class=\"fc9 ws0\">floa<span class=\"_ _3\"></span>t </span><span class=\"ls29 ws20\">x,</span><span class=\"ws0\"> <span class=\"_ _2\"></span><span class=\"fc9\">fl<span class=\"_ _3\"></span>oat <span class=\"fc0 ls28 ws1f\">y)</span><span class=\"fc0\"> </span></span></span></span></span></div><div class=\"t m0 x1 hb yaa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e0 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf15\" class=\"pf w0 h0\" data-page-no=\"15\"><div class=\"pc pc15 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the <span class=\"_ _0\"></span>variable<span class=\"_ _3\"></span> <span class=\"ff3\">m_viewX </span>and <span class=\"ff3 ws10\">m_vi<span class=\"_ _0\"></span>ewY<span class=\"ff2 ws0\">. </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.12</div><div class=\"t m3 x21 hd y1e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tView<span class=\"_ _0\"></span>Size<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y1e3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">setVie<span class=\"_ _3\"></span>wSize(sf::Vector2f v) </span></span></div><div class=\"t m0 x7 hc y1e4 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0\">setViewSize(flo<span class=\"_ _3\"></span>at <span class=\"_ _0\"></span><span class=\"ls29 ws20\">x,<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>float <span class=\"_ _0\"></span>y); </span></span></span></span></div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1e6 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>set view <span class=\"_ _0\"></span>positi<span class=\"_ _0\"></span>on. </div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e8 ff3 fs0 fc4 sc0 ls1 ws10\">2.13</div><div class=\"t m3 x21 hd y1e8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e8 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tWindow<span class=\"_ _0\"></span>Size<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">setWindo<span class=\"_ _3\"></span>wSize(sf::Vector2u<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls2a ws21\">v,<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">bool <span class=\"fc0\">updateViewSize = <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">false<span class=\"ff2 fc0 ls2b ws0\">) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y1ea ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1eb ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>redefine the window <span class=\"_ _0\"></span>size<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>(onl<span class=\"_ _3\"></span>y <span class=\"ls25 ws1b\">for</span> P<span class=\"_ _0\"></span>C).<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y1ec ff3 fs0 fc4 sc0 ls1 ws10\">2.14</div><div class=\"t m3 x21 hd y1ec ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1ec ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tWindow<span class=\"_ _0\"></span>Tit<span class=\"_ _0\"></span>le<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1ed ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ye8 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setW<span class=\"_ _3\"></span>indowTitle(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">const <span class=\"_ _0\"></span><span class=\"fc0\">sf::String &amp;<span class=\"_ _0\"></span>title<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y1ee ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ef ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f1 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the <span class=\"_ _0\"></span>wind<span class=\"_ _3\"></span>ow ti<span class=\"_ _0\"></span>tle. </div><div class=\"t m2 xc hc yec ff3 fs0 fc4 sc0 ls1 ws10\">2.15</div><div class=\"t m3 x21 hd yec ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc yec ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tWindow<span class=\"_ _0\"></span>BgCo<span class=\"_ _0\"></span>lor<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1f2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0\">setWindowBgC<span class=\"_ _3\"></span>olor(sf::Color <span class=\"_ _0\"></span>color) </span></span></div><div class=\"t m0 x1 hb y1f4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f7 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the background color <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the w<span class=\"_ _0\"></span>indow. </div><div class=\"t m0 x1 hb y1f8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f9 ff3 fs0 fc4 sc0 ls1 ws10\">2.16</div><div class=\"t m3 x21 hd y1f9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1f9 ff3 fs0 fc4 sc0 ls1 ws0\">loa<span class=\"_ _0\"></span>dParen<span class=\"_ _0\"></span>tRe<span class=\"_ _0\"></span>sources<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y1fa ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">bool <span class=\"fc0\">loa<span class=\"_ _3\"></span>dParentResources()<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc yee ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1fb ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1fc ff2 fs0 fc0 sc0 ls1 ws0\">Loads the <span class=\"_ _0\"></span>resou<span class=\"_ _3\"></span>rces that <span class=\"_ _0\"></span>allow you <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> display dialog b<span class=\"_ _0\"></span>oxes<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>a scene. </span></span></div><div class=\"t m0 x7 hc y1fd ff2 fs0 fc0 sc0 ls1 ws0\">It is generally used in th<span class=\"_ _3\"></span>e <span class=\"ff3\">loadResou<span class=\"_ _3\"></span>rces </span>functi<span class=\"_ _3\"></span>on of a scene.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y93 ff3 fs0 fc4 sc0 ls1 ws10\">2.17</div><div class=\"t m3 x21 hd y93 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y93 ff3 fs0 fc4 sc0 ls1 ws0\">loa<span class=\"_ _0\"></span>dReso<span class=\"_ _0\"></span>urce<span class=\"_ _0\"></span>s </div><div class=\"t m0 x7 hc y1fe ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">bool <span class=\"fc0\">loadR<span class=\"_ _3\"></span>esources() <span class=\"_ _3\"></span>= <span class=\"fcc ls2c\">0 </span></span></span></div><div class=\"t m0 x7 hc y1ff ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y200 ff2 fs0 fc0 sc0 ls1 ws0\">Allows you <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>implement<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>loading<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> resources <span class=\"_ _0\"></span>that<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>are used <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>a scene<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y201 ff3 fs0 fc4 sc0 ls1 ws10\">2.18</div><div class=\"t m3 x21 hd y201 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y201 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tIsR<span class=\"_ _0\"></span>unning<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y202 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etIsRunning(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y203 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y183 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> define <span class=\"_ _0\"></span>the execution state <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>scene<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y204 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y205 ff3 fs0 fc4 sc0 ls1 ws10\">2.19</div><div class=\"t m3 x21 hd y205 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y205 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tIsP<span class=\"_ _0\"></span>laying<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y206 ff4 fs4 fc0 sc0 ls19 wsf\">22<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf16\" class=\"pf w0 h0\" data-page-no=\"16\"><div class=\"pc pc16 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etIsPlaying(<span class=\"fc9 ws0\">bo<span class=\"_ _3\"></span>ol <span class=\"fc0\">v<span class=\"_ _0\"></span>al)<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y207 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the <span class=\"_ _0\"></span><span class=\"ff3\">m_isPla<span class=\"_ _3\"></span>ying <span class=\"ff2\">v<span class=\"_ _0\"></span>ariab<span class=\"_ _0\"></span>le. </span></span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.20</div><div class=\"t m3 x21 hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">qui<span class=\"_ _0\"></span>tSce<span class=\"_ _0\"></span>ne<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">quitScene(</span>in<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span><span class=\"fc0\">nextScene<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= -<span class=\"ls2d ws22\">1)</span> </span></span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20d ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> e<span class=\"_ _0\"></span>xit <span class=\"_ _3\"></span>the current scene <span class=\"_ _0\"></span>and move <span class=\"ls1b ws11\">to</span> another. <span class=\"ls2e ws23\">If<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ls2f ws24\">no</span> <span class=\"_ _0\"></span>sc<span class=\"_ _3\"></span>ene <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>filled the application stop<span class=\"_ _0\"></span>s. </span></span></div><div class=\"t m2 xc hc y20e ff3 fs0 fc4 sc0 ls1 ws10\">2.21</div><div class=\"t m3 x21 hd y20e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20e ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tScene<span class=\"_ _0\"></span>Star<span class=\"_ _0\"></span>t </div><div class=\"t m0 x7 hc y20f ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etSceneStart(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y210 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y211 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the <span class=\"ff3\">m_sceneStart </span>var<span class=\"_ _0\"></span>iable<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y212 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc ye8 ff3 fs0 fc4 sc0 ls1 ws10\">2.22</div><div class=\"t m3 x21 hd ye8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc ye8 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tScene<span class=\"_ _0\"></span>End </div><div class=\"t m0 x7 hc y213 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etSceneEnd(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y214 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc yec ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the <span class=\"_ _0\"></span><span class=\"ff3\">m_sceneEnd<span class=\"_ _3\"></span> <span class=\"ff2\">vari<span class=\"_ _0\"></span>able. </span></span></div><div class=\"t m0 x1 hb y215 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">2.23</div><div class=\"t m3 x21 hd y216 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y216 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tWaitT<span class=\"_ _0\"></span>ime </div><div class=\"t m0 x7 hc y217 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etWaitTime(<span class=\"fc9 ws0\">i<span class=\"_ _3\"></span>nt <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y2c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y218 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> define <span class=\"_ _0\"></span>the time <span class=\"_ _0\"></span>fro<span class=\"_ _3\"></span>m witch ob<span class=\"_ _0\"></span>jects<span class=\"_ _3\"></span> will <span class=\"ls26 ws1c\">be</span> <span class=\"_ _0\"></span>disabl<span class=\"_ _3\"></span>ed te<span class=\"_ _0\"></span>mpor<span class=\"_ _0\"></span>arily. </div><div class=\"t m2 xc hc y219 ff3 fs0 fc4 sc0 ls1 ws10\">2.24</div><div class=\"t m3 x21 hd y219 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y219 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tKeyBa<span class=\"_ _0\"></span>ckPr<span class=\"_ _0\"></span>essed </div><div class=\"t m0 x7 hc yee ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etKeyBackPress<span class=\"_ _3\"></span>ed(<span class=\"fc9 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y1fc ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y21a ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the <span class=\"_ _0\"></span><span class=\"ff3\">m_keyBackPressed<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2\">vari<span class=\"_ _0\"></span>able. </span></span></div><div class=\"t m0 x1 hb y21b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y21c ff3 fs0 fc4 sc0 ls1 ws10\">2.25</div><div class=\"t m3 x21 hd y21c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y21c ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tMous<span class=\"_ _0\"></span>eInCo<span class=\"_ _0\"></span>llisi<span class=\"_ _0\"></span>on </div><div class=\"t m0 x7 hc y21d ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">setM<span class=\"_ _3\"></span>ouseInCollision()<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc y21e ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y21f ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> con<span class=\"_ _0\"></span>firm<span class=\"_ _3\"></span> the <span class=\"_ _0\"></span>collision <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>m<span class=\"_ _3\"></span>ouse with <span class=\"_ _0\"></span><span class=\"ls30 ws25\">an<span class=\"ls1 ws0\"> ob<span class=\"_ _0\"></span>ject. </span></span></div><div class=\"t m0 x1 hb y220 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y201 ff3 fs0 fc4 sc0 ls1 ws10\">2.26</div><div class=\"t m3 x21 hd y201 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y201 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>IsRun<span class=\"_ _0\"></span>ning<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y202 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etIsRunning()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y221 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y222 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>a scene <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>run<span class=\"_ _3\"></span>ning and <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> not<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m0 x1 hb y223 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y224 ff3 fs0 fc4 sc0 ls1 ws10\">2.27</div><div class=\"t m3 x21 hd y224 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y224 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>IsPla<span class=\"_ _0\"></span>ying<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y225 ff4 fs4 fc0 sc0 ls19 wsf\">23<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf17\" class=\"pf w0 h0\" data-page-no=\"17\"><div class=\"pc pc17 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"fc0\">getIsPlaying() </span><span class=\"ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>a scene <span class=\"ls1d ws13\">is</span> active and <span class=\"_ _0\"></span><span class=\"ff3\">false<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">if<span class=\"ls1 ws0\"> no<span class=\"_ _0\"></span>t. </span></span></span></span></span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e4 ff3 fs0 fc4 sc0 ls1 ws10\">2.28</div><div class=\"t m3 x21 hd y1e4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e4 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Scene<span class=\"_ _0\"></span>Star<span class=\"_ _0\"></span>t </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etSceneStart()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y226 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>a scene <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> <span class=\"ls23 ws1a\">at</span> the <span class=\"_ _0\"></span>start <span class=\"ls1c ws12\">of</span> ex<span class=\"_ _3\"></span>ecution and <span class=\"ff3\">false </span><span class=\"ls1f ws16\">if<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"_ _3\"></span>no<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></span></span></span></span></div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.29</div><div class=\"t m3 x21 hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e9 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Scene<span class=\"_ _0\"></span>End </div><div class=\"t m0 x7 hc y1ea ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etSceneEnd()<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"fc9\">c<span class=\"_ _3\"></span>onst </span></span></span></div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1ec ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>a scene comes <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> end <span class=\"_ _0\"></span>a<span class=\"_ _3\"></span>nd <span class=\"ff3\">false<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">if<span class=\"ls1 ws0\"> not<span class=\"_ _0\"></span>. </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1ed ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y228 ff3 fs0 fc4 sc0 ls1 ws10\">2.30</div><div class=\"t m3 x21 hd y228 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y228 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Window<span class=\"_ _0\"></span>IsAct<span class=\"_ _0\"></span>ive </div><div class=\"t m0 x7 hc y1ef ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etWindowIsAc<span class=\"_ _3\"></span>tive() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y1f1 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y229 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the window <span class=\"ls1f ws16\">is</span> active <span class=\"_ _0\"></span>an<span class=\"_ _3\"></span>d <span class=\"_ _0\"></span><span class=\"ff3\">false <span class=\"ff2 ls1f ws16\">if</span><span class=\"ff2\"> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m0 x1 hb y22a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y22b ff3 fs0 fc4 sc0 ls1 ws10\">2.31</div><div class=\"t m3 x21 hd y22b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y22b ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>KeyBa<span class=\"_ _0\"></span>ckPre<span class=\"_ _0\"></span>ssed </div><div class=\"t m0 x7 hc y22c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etKeyBackPres<span class=\"_ _3\"></span>sed() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y2c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y22d ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>value<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span><span class=\"ff3\">m_keyBackPr<span class=\"_ _3\"></span>essed <span class=\"ff2\">vr<span class=\"_ _0\"></span>aiable<span class=\"_ _0\"></span>. </span></span></span></span></span></div><div class=\"t m2 xc hc y22e ff3 fs0 fc4 sc0 ls1 ws10\">2.32</div><div class=\"t m3 x21 hd y22e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y22e ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>View<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y22f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y230 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::View<span class=\"_ _3\"></span>&amp; <span class=\"_ _0\"></span>getView()<span class=\"_ _3\"></span> <span class=\"fc9 ws10\">co<span class=\"_ _0\"></span>nst<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y231 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1fc ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y232 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>view <span class=\"_ _3\"></span><span class=\"ls1c ws12\">of</span> a <span class=\"_ _0\"></span>scene<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y233 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y234 ff3 fs0 fc4 sc0 ls1 ws10\">2.33</div><div class=\"t m3 x21 hd y234 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y234 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Render<span class=\"_ _0\"></span>Wind<span class=\"_ _0\"></span>ow<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y235 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y236 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::RenderWindow&amp; g<span class=\"_ _0\"></span>etRen<span class=\"_ _0\"></span>derWin<span class=\"_ _0\"></span>dow<span class=\"_ _0\"></span>() </span></div><div class=\"t m0 x1 hb y237 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y238 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y21f ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>scene execution<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>wind<span class=\"_ _0\"></span>ow. </span></div><div class=\"t m0 x1 hb y239 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y23a ff3 fs0 fc4 sc0 ls1 ws10\">2.34</div><div class=\"t m3 x21 hd y23a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y23a ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Mouse<span class=\"_ _0\"></span>PosCu<span class=\"_ _0\"></span>rrent<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y23b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y23c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Vector2f <span class=\"_ _0\"></span>getMous<span class=\"_ _3\"></span>ePosCurrent() <span class=\"_ _0\"></span><span class=\"fc9 ws10\">const<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y23d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y23e ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y183 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>current position <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the mo<span class=\"_ _0\"></span>use. </span></div><div class=\"t m0 x1 hb y23f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y205 ff3 fs0 fc4 sc0 ls1 ws10\">2.35</div><div class=\"t m3 x21 hd y205 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y205 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Mouse<span class=\"_ _0\"></span>PosPr<span class=\"_ _0\"></span>eviou<span class=\"_ _0\"></span>s<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y206 ff4 fs4 fc0 sc0 ls19 wsf\">24<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf18\" class=\"pf w0 h0\" data-page-no=\"18\"><div class=\"pc pc18 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Vector2f <span class=\"_ _0\"></span>getMous<span class=\"_ _3\"></span>ePosPrevious()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>position that precedes the <span class=\"_ _0\"></span>current<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>mous<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>posit<span class=\"_ _0\"></span>ion. </span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.36</div><div class=\"t m3 x21 hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Render<span class=\"_ _0\"></span>Text<span class=\"_ _0\"></span>ure<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fc5 sc0 ls1 ws0\">vi<span class=\"_ _0\"></span>rtual <span class=\"_ _b\"></span><span class=\"ff2 fc0\">sf::<span class=\"_ _0\"></span>Render<span class=\"_ _0\"></span>Text<span class=\"_ _0\"></span>ure&amp;<span class=\"_ _0\"></span> <span class=\"_ _f\"></span>getR<span class=\"_ _0\"></span>ender<span class=\"_ _0\"></span>Text<span class=\"_ _0\"></span>ure() <span class=\"_ _b\"></span><span class=\"fc9 ws10\">cons<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>surface<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">on</span> which <span class=\"_ _0\"></span><span class=\"ls31 ws26\">we<span class=\"ls1 ws0\"> draw <span class=\"_ _0\"></span>the objects <span class=\"ls1c ws12\">of</span> a <span class=\"_ _0\"></span>scen<span class=\"_ _0\"></span>e. </span></span></span></div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.37</div><div class=\"t m3 x21 hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>GameS<span class=\"_ _0\"></span>ystem<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20f ff3 fs0 fc5 sc0 ls1 ws0\">vi<span class=\"_ _0\"></span>rtual <span class=\"_ _3\"></span><span class=\"ff2 fc0\">GameSys<span class=\"_ _0\"></span>temEx<span class=\"_ _0\"></span>tende<span class=\"_ _0\"></span>d&amp; <span class=\"_ _b\"></span>getGa<span class=\"_ _0\"></span>meSyste<span class=\"_ _0\"></span>m(<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x1 hb y241 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y242 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y243 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>game system extended <span class=\"_ _0\"></span>objec<span class=\"_ _0\"></span>t. </span></div><div class=\"t m0 x1 hb y244 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y245 ff3 fs0 fc4 sc0 ls1 ws10\">2.38</div><div class=\"t m3 x21 hd y245 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y245 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Font<span class=\"_ _0\"></span>Syste<span class=\"_ _0\"></span>m </div><div class=\"t m0 x7 hc y246 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Font&amp; <span class=\"_ _0\"></span>getFontSystem() </span></div><div class=\"t m0 x7 hc y247 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc ybf ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>system f<span class=\"_ _0\"></span>ont<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y1f2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f3 ff3 fs0 fc4 sc0 ls1 ws10\">2.39</div><div class=\"t m3 x21 hd y1f3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1f3 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>FontM<span class=\"_ _0\"></span>sg </div><div class=\"t m0 x7 hc y217 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Font&amp; <span class=\"_ _0\"></span>getFontMsg() </span></div><div class=\"t m0 x7 hc y248 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y218 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e dialog box <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>nt<span class=\"_ _0\"></span>. </span></div><div class=\"t m2 xc hc y1fa ff3 fs0 fc4 sc0 ls1 ws10\">2.40</div><div class=\"t m3 x21 hd y1fa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1fa ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>SprB<span class=\"_ _0\"></span>uttonS<span class=\"_ _0\"></span>elect </div><div class=\"t m0 x7 hc yee ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Sprite&amp; <span class=\"_ _0\"></span>getSprButtonSelect() </span></div><div class=\"t m0 x7 hc y249 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y21a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e opt<span class=\"_ _0\"></span>ion<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>selection<span class=\"_ _3\"></span> S<span class=\"_ _0\"></span>prite<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y21b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y21c ff3 fs0 fc4 sc0 ls1 ws10\">2.41</div><div class=\"t m3 x21 hd y21c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y21c ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Option<span class=\"_ _0\"></span>Inde<span class=\"_ _0\"></span>x </div><div class=\"t m0 x7 hc y21d ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">int <span class=\"fc0\">getO<span class=\"_ _3\"></span>ptionIndex() </span></span></div><div class=\"t m0 x7 hc y24a ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y21f ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>chosen opt<span class=\"_ _0\"></span>ion<span class=\"ff3 fcb ws10\">.</span><span class=\"ff3\"> </span></span></div><div class=\"t m0 x1 hc y239 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y23a ff3 fs0 fc4 sc0 ls1 ws10\">2.42</div><div class=\"t m3 x21 hd y23a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y23a ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Scene<span class=\"_ _0\"></span>Widt<span class=\"_ _0\"></span>h </div><div class=\"t m0 x7 hc y23c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">unsigned <span class=\"_ _0\"></span>int <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etSceneWidth()<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc y23e ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y222 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>width<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>scen<span class=\"_ _0\"></span>e<span class=\"ff3 fcb ws10\">.</span><span class=\"ff3\"> </span></span></div><div class=\"t m0 x1 hc y223 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y224 ff3 fs0 fc4 sc0 ls1 ws10\">2.43</div><div class=\"t m3 x21 hd y224 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y224 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Scene<span class=\"_ _0\"></span>Heigh<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y225 ff4 fs4 fc0 sc0 ls19 wsf\">25<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf19\" class=\"pf w0 h0\" data-page-no=\"19\"><div class=\"pc pc19 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">unsigned <span class=\"_ _0\"></span>int <span class=\"fc0\">get<span class=\"_ _0\"></span>SceneHe<span class=\"_ _0\"></span>igh<span class=\"_ _0\"></span>t() </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the he<span class=\"_ _0\"></span>ight<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the scen<span class=\"_ _0\"></span>e<span class=\"ff3 fcb ws10\">.</span><span class=\"ff3\"> </span></span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e4 ff3 fs0 fc4 sc0 ls1 ws10\">2.44</div><div class=\"t m3 x21 hd y1e4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e4 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Delta<span class=\"_ _0\"></span>Time </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">float <span class=\"fc0\">g<span class=\"_ _3\"></span>etDeltaTime()<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc y1e6 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>execution<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>time <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>secon<span class=\"_ _0\"></span>ds<span class=\"ff3 fcb ws10\">.</span><span class=\"ff3\"> </span></span></div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.45</div><div class=\"t m3 x21 hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>DELTA<span class=\"_ _0\"></span>_TIM<span class=\"_ _0\"></span>E<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ea ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"fc0\">getDELTA_TIME()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y211 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>variable DE<span class=\"_ _0\"></span>LTA_TI<span class=\"_ _0\"></span>ME<span class=\"ff3 fcb ws10\">.</span><span class=\"ff3\"> </span></span></div><div class=\"t m0 x1 hc y212 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc ye8 ff3 fs0 fc4 sc0 ls1 ws10\">2.46</div><div class=\"t m3 x21 hd ye8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc ye8 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>SprB<span class=\"_ _0\"></span>uttonS<span class=\"_ _0\"></span>elect<span class=\"_ _0\"></span>Scal<span class=\"_ _0\"></span>e </div><div class=\"t m0 x7 hc y213 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9 ws10\">float<span class=\"fc0 ws0\">&amp; get<span class=\"_ _3\"></span>SprButtonSelect<span class=\"_ _3\"></span>Scale() </span></span></div><div class=\"t m0 x7 hc y24c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc yec ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>scale <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>Selection<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>Sprite<span class=\"_ _0\"></span><span class=\"ff3 fcb ws10\">.<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hc y215 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">2.47</div><div class=\"t m3 x21 hd y216 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y216 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>ViewX<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y1f5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getViewX() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y1f7 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y24d ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the x <span class=\"_ _0\"></span>position <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the view. </span></div><div class=\"t m2 xc hc y219 ff3 fs0 fc4 sc0 ls1 ws10\">2.48</div><div class=\"t m3 x21 hd y219 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y219 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>ViewY<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc yee ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getViewY() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y249 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y232 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the y <span class=\"_ _0\"></span>position <span class=\"ls1c ws12\">of</span> the v<span class=\"_ _0\"></span>iew. </span></div><div class=\"t m0 x1 hb y233 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y234 ff3 fs0 fc4 sc0 ls1 ws10\">2.49</div><div class=\"t m3 x21 hd y234 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y234 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>View<span class=\"_ _0\"></span>W </div><div class=\"t m0 x7 hc y21d ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getViewW() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y24a ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y24e ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>width<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>view<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y24f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1ac ff3 fs0 fc4 sc0 ls1 ws10\">2.50</div><div class=\"t m3 x21 hd y1ac ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1ac ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>View<span class=\"_ _0\"></span>H </div><div class=\"t m0 x7 hc y250 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getViewH() <span class=\"_ _0\"></span><span class=\"fc9 ws10\">const<span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 hc y251 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y252 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the he<span class=\"_ _0\"></span>ight<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the vi<span class=\"_ _0\"></span>ew<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y223 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y253 ff3 fs0 fc4 sc0 ls1 ws10\">2.51</div><div class=\"t m3 x21 hd y253 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y253 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Mouse<span class=\"_ _0\"></span>InCo<span class=\"_ _0\"></span>llisi<span class=\"_ _0\"></span>on<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y254 ff4 fs4 fc0 sc0 ls19 wsf\">26<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1a\" class=\"pf w0 h0\" data-page-no=\"1a\"><div class=\"pc pc1a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcsW2FMBiF0ThCtBZiCMQSNEzBBGzEGEzAHIgpWOF/xeuilyZSCuxzNvDFzScEKSK+AAAAKNS3CQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPWZAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8JAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9JgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADV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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">27<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">get<span class=\"_ _0\"></span>Mouse<span class=\"_ _0\"></span>InCol<span class=\"_ _0\"></span>lisio<span class=\"_ _0\"></span>n() </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the mouse <span class=\"ls1d ws13\">is</span> <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> collision with <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> <span class=\"_ _3\"></span>object, <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e4 ff3 fs0 fc4 sc0 ls1 ws10\">2.52</div><div class=\"t m3 x21 hd y1e4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e4 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Mouse<span class=\"_ _0\"></span>Curren<span class=\"_ _0\"></span>tEqua<span class=\"_ _0\"></span>lToPr<span class=\"_ _0\"></span>evio<span class=\"_ _0\"></span>us </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">bool <span class=\"fc0\">g<span class=\"_ _3\"></span>etMouseCurrentEqual<span class=\"_ _3\"></span>ToPrevious() </span></span></div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y226 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the current and previous <span class=\"_ _0\"></span>position<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the mouse <span class=\"_ _0\"></span>are the same, <span class=\"ff3\">false </span><span class=\"ls1f ws16\">if<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.53</div><div class=\"t m3 x21 hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e9 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>BgCo<span class=\"_ _0\"></span>lor </div><div class=\"t m0 x7 hc y1ea ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Color&amp; <span class=\"_ _0\"></span>getBgColor() </span></div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1ec ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>background color <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the sce<span class=\"_ _0\"></span>ne. </span></div><div class=\"t m0 x1 hb y1ed ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y228 ff3 fs0 fc4 sc0 ls1 ws10\">2.54</div><div class=\"t m3 x21 hd y228 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y228 ff3 fs0 fc4 sc0 ls1 ws10\">in<span class=\"_ _0\"></span>ViewRe<span class=\"_ _0\"></span>c<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1ee ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ef ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"fc0\">inViewRec(MainObject<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>*obj, <span class=\"fc9\">bool </span>useTexRec <span class=\"_ _0\"></span>= <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">true<span class=\"ff2 fc0 ls32 ws0\">) </span></span></span></span></div><div class=\"t m0 x7 hc y1f1 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y229 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the object <span class=\"ls1d ws13\">is</span> <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the field <span class=\"ls1c ws12\">of</span> vision <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the view, <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>no<span class=\"_ _0\"></span>t. </span></span></span></span></div><div class=\"t m0 x1 hb y22a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y22b ff3 fs0 fc4 sc0 ls1 ws10\">2.55</div><div class=\"t m3 x21 hd y22b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y22b ff3 fs0 fc4 sc0 ls1 ws10\">mou<span class=\"_ _0\"></span>seCo<span class=\"_ _0\"></span>llisio<span class=\"_ _0\"></span>n<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y7c ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y7c ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y7c ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y255 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y256 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y257 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb yce ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y258 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y259 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y25a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y25b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y25c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y25d ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y60 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y25e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y25f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y260 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y261 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y262 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y263 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y264 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y265 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y266 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y267 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y268 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y269 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y26a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y26b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y26c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y111 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y26d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y26e ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">mous<span class=\"_ _3\"></span>eCollision(T <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;obj, sf::Vector2f &amp;position, <span class=\"fc9\">unsigned <span class=\"_ _0\"></span>int<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">finger = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></span></span></div></div><div class=\"c x23 y26f w4 h15\"><div class=\"t m0 x0 hb y270 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y271 ff3 fs0 fc5 sc0 ls1 ws0\">template </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x10 hc y272 ff2 fs0 fc0 sc0 ls24\">&lt;<span class=\"ff3 fc5 ls1 ws0\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1 ws0\"> </span></div></div><div class=\"c x23 y26f w4 h15\"><div class=\"t m0 x0 hb y273 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y274 ff2 fs0 fc9 sc0 ls1 ws0\">bool </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x25 hb y275 ff2 fs0 fc0 sc0 ls1 ws0\">mouseCollision(T<span class=\"_ _3\"></span> <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;obj, <span class=\"fc9\">unsigned int <span class=\"_ _0\"></span><span class=\"fc0\">finger<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></span></div></div><div class=\"c x23 y26f w4 h15\"><div class=\"t m0 x24 hc y276 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y277 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y26f w4 h15\"><div class=\"t m0 x0 hc y278 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y279 ff6 fs0 fc0 sc0 ls1 ws0\">Windows, Linux : <span class=\"ff2\">Detects <span class=\"_ _0\"></span><span class=\"ls1d ws13\">if<span class=\"ls1 ws0\"> the mouse cursor collides with <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>object <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>the sc<span class=\"_ _0\"></span>ene. </span></span></span></span></span></div><div class=\"t m0 x0 hb y27a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y27b ff6 fs0 fc0 sc0 ls1 ws0\">Mobile : <span class=\"_ _0\"></span><span class=\"ff2\">Detects<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the user touches <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the <span class=\"_ _3\"></span>scen<span class=\"_ _0\"></span>e. </span></span></span></div><div class=\"t m0 x0 hb y27c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y27d ff3 fs0 fcb sc0 ls1 ws10\">Par<span class=\"_ _0\"></span>ameter<span class=\"_ _0\"></span>:</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x27 hc y27e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y27f ff3 fs0 fc0 sc0 ls1 ws0\">obj <span class=\"_ _0\"></span><span class=\"ff2\">the object with which <span class=\"ls31 ws26\">we</span> <span class=\"_ _0\"></span>want <span class=\"ls1b ws11\">to</span> t<span class=\"_ _0\"></span>es<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></div></div><div class=\"c x23 y26f w4 h15\"><div class=\"t m0 x0 hb y280 ff2 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y281 ff3 fs0 fc0 sc0 ls1 ws0\">finger <span class=\"ff2\">represents <span class=\"_ _0\"></span>the fin<span class=\"_ _0\"></span>ger. </span></div></div><div class=\"c x23 y26f w4 h15\"><div class=\"t m0 x0 hb y282 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y283 ff3 fs0 fcb sc0 ls1 ws0\">Return </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x28 hc y284 ff3 fs0 fc0 sc0 ls1 ws0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> there <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> a collision and <span class=\"ff3\">false </span></span>if<span class=\"ls1 ws0\"> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></span></div></div><div class=\"c x23 y26f w4 h15\"><div class=\"t m0 x0 hb y285 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y286 ff6 fs0 fc0 sc0 ls1 ws0\">Example <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span> </div><div class=\"t m0 x24 hc y287 ff3 fs0 fc5 sc0 ls34 ws28\">if<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hb y288 ff2 fs0 fc0 sc0 ls1 ws0\">(mouse<span class=\"_ _0\"></span>Colli<span class=\"_ _0\"></span>sion(s<span class=\"_ _0\"></span>prite<span class=\"_ _0\"></span>))<span class=\"_ _0\"></span> </div></div><div class=\"c x23 y26f w4 h15\"><div class=\"t m0 x24 hb y289 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hb y28a ff2 fs0 fcd sc0 ls35 ws29\">//<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls36 ws2a\">Do<span class=\"ls1 ws0\"> some<span class=\"_ _0\"></span>thin<span class=\"_ _0\"></span>g<span class=\"fc0\"> </span></span></span></span></div></div><div class=\"c x23 y26f w4 h15\"><div class=\"t m0 x24 hb y28b ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div><div class=\"t m0 x2a hb y28c ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1b\" class=\"pf w0 h0\" data-page-no=\"1b\"><div class=\"pc pc1b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAHhvv45tAAIDIIzeBJhArGAIE4h5VOwg0eqt8i+jpZGYQfJed+11H6g+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfUDRUHUAAADhSURBVAAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAgJ+7X/2wJ0m6tWrKlJzjdizzt9NedZn8BQAA8CsPOZhVafpNZUkAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">28<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1e2 ff6 fs0 fc0 sc0 ls1 ws0\">Windows, Linux: <span class=\"ff2\">Detects <span class=\"ls1d ws13\">if</span> the mouse <span class=\"_ _0\"></span>cursor collides with <span class=\"ls23 ws1a\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> object <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the scen<span class=\"_ _0\"></span>e. </span></span></span></div><div class=\"t m0 x1 hb y28d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1b4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y28e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y28f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y290 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1e5 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y291 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1e6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y120 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y292 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y293 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y20e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y240 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y294 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y295 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1eb ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y296 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y243 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y212 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y228 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y297 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y298 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y299 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y29a ff3 fs0 fc4 sc0 ls1 ws10\">2.56</div><div class=\"t m3 x21 hd y29a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y29a ff3 fs0 fc4 sc0 ls1 ws0\">SDM<span class=\"_ _0\"></span>manage<span class=\"_ _0\"></span>Scen<span class=\"_ _0\"></span>e </div><div class=\"t m0 x7 hc y7b ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">SDMma<span class=\"_ _3\"></span>nageScene() </span></span></div><div class=\"t m0 x7 hc y29b ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y29c ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>manage <span class=\"ls23 ws1a\">all</span> the parts <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>scene<span class=\"_ _3\"></span> (e<span class=\"_ _0\"></span>v<span class=\"_ _3\"></span>ent, <span class=\"_ _0\"></span>updat<span class=\"_ _3\"></span>e, display, <span class=\"_ _0\"></span>dialog box<span class=\"_ _0\"></span>). </span></span></div><div class=\"t m0 x1 hb y29d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y257 ff3 fs0 fc4 sc0 ls1 ws10\">2.57</div><div class=\"t m3 x21 hd y257 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y257 ff3 fs0 fc4 sc0 ls1 ws0\">SDM<span class=\"_ _0\"></span>manage<span class=\"_ _0\"></span>Scen<span class=\"_ _0\"></span>eEven<span class=\"_ _0\"></span>ts </div><div class=\"t m0 x7 hc y29e ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">SDMma<span class=\"_ _3\"></span>nageSceneEv<span class=\"_ _3\"></span>ents() </span></span></div><div class=\"t m0 x7 hc y29f ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y5e ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> define the <span class=\"_ _0\"></span>way <span class=\"ls1f ws16\">in</span> which <span class=\"_ _0\"></span>the SDM will manage the events of the window. <span class=\"ff6 ls37 ws2b\">To</span><span class=\"ff6\"> change the mechanism override </span></div><div class=\"t m0 x7 hb y2a0 ff6 fs0 fc0 sc0 ls1 ws0\">this method<span class=\"ff2\">. </span></div><div class=\"t m2 xc hc y2a1 ff3 fs0 fc4 sc0 ls1 ws10\">2.58</div><div class=\"t m3 x21 hd y2a1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2a1 ff3 fs0 fc4 sc0 ls1 ws0\">SDM<span class=\"_ _0\"></span>manage<span class=\"_ _0\"></span>Scen<span class=\"_ _0\"></span>eMsgAn<span class=\"_ _0\"></span>swer<span class=\"_ _0\"></span>s </div><div class=\"t m0 x7 hc y2a2 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">SDMma<span class=\"_ _3\"></span>nageSceneMsgA<span class=\"_ _3\"></span>nswers() </span></span></div><div class=\"t m0 x7 hc y2a3 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2a4 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> define <span class=\"_ _0\"></span>the way <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> which <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>SDM<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>will ma<span class=\"_ _3\"></span>nage the dialog b<span class=\"_ _0\"></span>ox answers. <span class=\"ff6\">To change<span class=\"_ _3\"></span> the <span class=\"_ _0\"></span>mechanism ov<span class=\"_ _3\"></span>erride </span></span></span></div><div class=\"t m0 x7 hb y2a5 ff6 fs0 fc0 sc0 ls1 ws0\">this method<span class=\"ff2\">. </span></div><div class=\"t m2 xc hc y2a6 ff3 fs0 fc4 sc0 ls1 ws10\">2.59</div><div class=\"t m3 x21 hd y2a6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2a6 ff3 fs0 fc4 sc0 ls1 ws10\">SDM<span class=\"_ _0\"></span>callO<span class=\"_ _0\"></span>bject<span class=\"_ _0\"></span>sEve<span class=\"_ _0\"></span>nts<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y2a7 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0\">SDMcallObjects<span class=\"_ _3\"></span>Events(sf::Event &amp;e<span class=\"_ _0\"></span>vent<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x1 hb y2a8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2a9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2aa ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2ab ff2 fs0 fc0 sc0 ls1 ws0\">. Allows<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1e ws14\">to<span class=\"ls1 ws0\"> call the <span class=\"_ _0\"></span><span class=\"ff3\">event() <span class=\"ff2\">method (the event part) <span class=\"_ _0\"></span><span class=\"ls1f ws16\">of<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object located <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the SDM cont<span class=\"_ _0\"></span>aine<span class=\"_ _0\"></span>r. </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y2ac ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2ad ff3 fs0 fc4 sc0 ls1 ws10\">2.60</div><div class=\"t m3 x21 hd y2ad ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2ad ff3 fs0 fc4 sc0 ls1 ws10\">SDM<span class=\"_ _0\"></span>step<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x23 y2ae w4 h16\"><div class=\"t m0 x0 hc y2af ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y2b0 ff6 fs0 fc0 sc0 ls1 ws0\">Mobile: <span class=\"ff2\">Detects <span class=\"_ _0\"></span><span class=\"ls1d ws13\">if<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the <span class=\"_ _3\"></span>user touches <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the s<span class=\"_ _0\"></span>cene. </span></span></span></span></span></div><div class=\"t m0 x0 hb y2b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y2b2 ff3 fs0 fcb sc0 ls1 ws10\">Par<span class=\"_ _0\"></span>ameter<span class=\"_ _0\"></span>:</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x27 hc y1b5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y2ae w4 h16\"><div class=\"t m0 x0 hc y2b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y20a ff3 fs0 fc0 sc0 ls1 ws0\">obj <span class=\"_ _0\"></span><span class=\"ff2\">the object with which <span class=\"ls31 ws26\">we</span> <span class=\"_ _0\"></span>want <span class=\"ls1b ws11\">to</span> t<span class=\"_ _0\"></span>es<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></div></div><div class=\"c x23 y2ae w4 h16\"><div class=\"t m0 x0 hb y2b4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y2b5 ff3 fs0 fc0 sc0 ls1 ws0\">position <span class=\"ff2\">allows <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> recov<span class=\"_ _3\"></span>er <span class=\"_ _0\"></span>the position <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the collision po<span class=\"_ _0\"></span>int. </span></span></span></div></div><div class=\"c x23 y2ae w4 h16\"><div class=\"t m0 x0 hb y2b6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y20d ff3 fs0 fc0 sc0 ls1 ws0\">finger <span class=\"ff2\">represents <span class=\"_ _0\"></span>the fin<span class=\"_ _0\"></span>ger. </span></div></div><div class=\"c x23 y2ae w4 h16\"><div class=\"t m0 x24 hc y2b7 ff3 fs0 fcb sc0 ls1 ws0\">Return </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x28 hc y1e9 ff3 fs0 fc0 sc0 ls1 ws0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> there <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> a collision and <span class=\"ff3\">false </span></span>if<span class=\"ls1 ws0\"> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></span></div></div><div class=\"c x23 y2ae w4 h16\"><div class=\"t m0 x0 hb y2b8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y2b9 ff6 fs0 fc0 sc0 ls1 ws0\">Example <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span> </div><div class=\"t m0 x0 h17 y2ba ff6 fsa fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y2bb ff2 fs0 fc0 sc0 ls1 ws0\">sf::Vector2f <span class=\"_ _0\"></span>po<span class=\"_ _0\"></span>s;<span class=\"_ _0\"></span> </div><div class=\"t m0 x24 hc y2bc ff3 fs0 fc5 sc0 ls34 ws28\">if<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hb y2bd ff2 fs0 fc0 sc0 ls1 ws0\">(mouseC<span class=\"_ _3\"></span>ollision(s<span class=\"_ _3\"></span>prite, <span class=\"_ _2\"></span>pos)) </div></div><div class=\"c x23 y2ae w4 h16\"><div class=\"t m0 x24 hb y2be ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hb y2bf ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">cursorXPosition<span class=\"_ _3\"></span> <span class=\"_ _2\"></span>= <span class=\"_ _0\"></span>pos.x; </span></div><div class=\"t m0 x29 hb y2c0 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">curso<span class=\"_ _3\"></span>rYPosition = <span class=\"_ _0\"></span>pos<span class=\"_ _0\"></span>.y; </span></div></div><div class=\"c x23 y2ae w4 h16\"><div class=\"t m0 x24 hb y2c1 ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1c\" class=\"pf w0 h0\" data-page-no=\"1c\"><div class=\"pc pc1c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieRNgArGCIUwgfx4VO0i0eqv8ZbRKrVZyTvfa110AAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADV5wIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ScQAuoAAAA+SURBVLkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAA36pvnI4kybA1XS3JNe/nurw7/d3WkrgMAADgRx4bbhrDCIZJSgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">SDMste<span class=\"_ _0\"></span>p() </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b4 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>update<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the o<span class=\"_ _3\"></span>bjects that <span class=\"_ _0\"></span>are <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>the SDM con<span class=\"_ _0\"></span>tainer<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.61</div><div class=\"t m3 x21 hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b5 ff3 fs0 fc4 sc0 ls1 ws0\">SDM<span class=\"_ _0\"></span>draw </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">SDMd<span class=\"_ _3\"></span>raw() </span></span></div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y226 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> dr<span class=\"_ _0\"></span>aw<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>o<span class=\"_ _3\"></span>bjects <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the SDM cont<span class=\"_ _0\"></span>ainer<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.62</div><div class=\"t m3 x21 hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">cr<span class=\"_ _0\"></span>eateS<span class=\"_ _0\"></span>prite<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ea ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">createSprit<span class=\"_ _3\"></span>e(<span class=\"ff3 fc5 ws0\">std::string<span class=\"_ _3\"></span> <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;spriteName<span class=\"_ _3\"></span>, is::MainObject &amp;obj, <span class=\"_ _0\"></span>sf::IntRect<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>rec, sf::Vector2f position,<span class=\"_ _3\"></span> </span></span></span></span></span></div><div class=\"t m0 x7 hb y2c2 ff2 fs0 fc0 sc0 ls1 ws0\">sf::Vector2f origin, sf::Vect<span class=\"_ _3\"></span>or2f scale = sf::Vecto<span class=\"_ _3\"></span>r2f(<span class=\"fcc ls24 ws1d\">1.f</span><span class=\"ls38\">, <span class=\"fcc ls24 ws1d\">1.f</span></span>), unsigned in<span class=\"_ _3\"></span>t alpha = <span class=\"fcc ws10\">255</span>)<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hc y50 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2c3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2c4 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> create a sprite <span class=\"ls26 ws1c\">by</span> associating<span class=\"_ _3\"></span> a <span class=\"_ _0\"></span>t<span class=\"_ _3\"></span>exture <span class=\"ls1e ws14\">to</span> <span class=\"_ _0\"></span>it. This<span class=\"_ _3\"></span> sprite will <span class=\"ls26 ws1c\">be</span> displayed <span class=\"ls1d ws13\">if</span> and only <span class=\"ls1f ws16\">if<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ls1d ws13\">it</span> <span class=\"ls1d ws13\">is</span> <span class=\"ls1d ws13\">in</span> the field <span class=\"ls1c ws12\">of</span> the </span></span></div><div class=\"t m0 x7 hb y2c5 ff2 fs0 fc0 sc0 ls1 ws0\">view. On SDL the sprite<span class=\"_ _3\"></span> will be Blit (gam<span class=\"_ _3\"></span>e will be more optimiz<span class=\"_ _3\"></span>ed).<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y2c6 ff3 fs0 fc4 sc0 ls1 ws10\">2.63</div><div class=\"t m3 x21 hd y2c6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2c6 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>playS<span class=\"_ _0\"></span>ound<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y2c7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2c8 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">GSMplaySound(<span class=\"_ _3\"></span></span>const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp;<span class=\"_ _3\"></span> na<span class=\"_ _0\"></span>me) </span></span></span></div><div class=\"t m0 x1 hb y2c9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2ca ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2cb ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2cc ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>play a sound managed <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>GS<span class=\"_ _0\"></span>M. </div><div class=\"t m2 xc hc y2cd ff3 fs0 fc4 sc0 ls1 ws10\">2.64</div><div class=\"t m3 x21 hd y2cd ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2cd ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>playM<span class=\"_ _0\"></span>usic<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y2ce ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2cf ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GSMpla<span class=\"_ _3\"></span>yMusic(<span class=\"fc9 ws0\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; n<span class=\"_ _0\"></span>ame<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 hb y2d0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2d1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2d2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2d3 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>play a <span class=\"_ _0\"></span>music <span class=\"_ _3\"></span>managed <span class=\"ls26 ws1c\">by</span> G<span class=\"_ _0\"></span>SM.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y2d4 ff3 fs0 fc4 sc0 ls1 ws10\">2.65</div><div class=\"t m3 x21 hd y2d4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2d4 ff3 fs0 fc4 sc0 ls1 ws0\">GRM<span class=\"_ _0\"></span>useGa<span class=\"_ _0\"></span>meSyst<span class=\"_ _0\"></span>emFon<span class=\"_ _0\"></span>t </div><div class=\"t m0 x7 hc y2d5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">GRM<span class=\"_ _3\"></span>useGameSystemFont()<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc y2d6 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2d7 ff2 fs0 fc0 sc0 ls1 ws0\">Allows the <span class=\"_ _0\"></span>scene <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>use <span class=\"ff3\">GameSystem </span>fonts<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y2d8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2d9 ff3 fs0 fc4 sc0 ls1 ws10\">2.66</div><div class=\"t m3 x21 hd y2d9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2d9 ff3 fs0 fc4 sc0 ls1 ws0\">GRM<span class=\"_ _0\"></span>useGa<span class=\"_ _0\"></span>meSyst<span class=\"_ _0\"></span>emTe<span class=\"_ _0\"></span>xture </div><div class=\"t m0 x7 hc y2da ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">GRM<span class=\"_ _3\"></span>useGameSystemTex<span class=\"_ _3\"></span>ture() </span></span></div><div class=\"t m0 x7 hc y2db ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2dc ff2 fs0 fc0 sc0 ls1 ws0\">Allows the <span class=\"_ _0\"></span>scene <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>use <span class=\"ff3\">GameSystem </span>Textur<span class=\"_ _0\"></span>es. </div><div class=\"t m0 x1 hb y2dd ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2de ff3 fs0 fc4 sc0 ls1 ws10\">2.67</div><div class=\"t m3 x21 hd y2de ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2de ff3 fs0 fc4 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>useGam<span class=\"_ _0\"></span>eSys<span class=\"_ _0\"></span>temSou<span class=\"_ _0\"></span>nd </div><div class=\"t m0 x7 hc y2df ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">GSMus<span class=\"_ _3\"></span>eGameSystemSound() </span></span></div><div class=\"t m0 x7 hc y2e0 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2e1 ff2 fs0 fc0 sc0 ls1 ws0\">Allows the <span class=\"_ _0\"></span>scene <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>use <span class=\"ff3\">GameSystem </span>sound<span class=\"_ _0\"></span>s. </div><div class=\"t m0 x22 h9 y206 ff4 fs4 fc0 sc0 ls19 wsf\">29<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1d\" class=\"pf w0 h0\" data-page-no=\"1d\"><div class=\"pc pc1d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbPaqEQBCF0a5xEkN/1mps7FoFQyOpFwiPWUPXOYF5XwX5ECMzGwAAAJ36mAAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPWZAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8JAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9JgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ZkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAA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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">30<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.68</div><div class=\"t m3 x21 hd y2e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2e2 ff3 fs0 fc4 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>useGam<span class=\"_ _0\"></span>eSys<span class=\"_ _0\"></span>temMus<span class=\"_ _0\"></span>ic </div><div class=\"t m0 x7 hc y2e3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">GSMus<span class=\"_ _3\"></span>eGameSystemMusic()<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc y2e4 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1b5 ff2 fs0 fc0 sc0 ls1 ws0\">Allows the <span class=\"_ _0\"></span>scene <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>use <span class=\"ff3\">GameSystem </span>music<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.69</div><div class=\"t m3 x21 hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20a ff3 fs0 fc4 sc0 ls1 ws0\">GRM<span class=\"_ _0\"></span>useGa<span class=\"_ _0\"></span>meSyst<span class=\"_ _0\"></span>emRes<span class=\"_ _0\"></span>ourc<span class=\"_ _0\"></span>es </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">GRM<span class=\"_ _3\"></span>useGameSystemResou<span class=\"_ _3\"></span>rces() </span></span></div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2e5 ff2 fs0 fc0 sc0 ls1 ws0\">Allows the <span class=\"_ _0\"></span>scene <span class=\"ls1e ws14\">to</span> <span class=\"_ _0\"></span>use <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">all<span class=\"ls1 ws0\"> <span class=\"ff3\">GameSystem<span class=\"_ _3\"></span> </span>re<span class=\"_ _0\"></span>source<span class=\"_ _0\"></span>s. </span></span></div><div class=\"t m0 x1 hb y2e6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y294 ff3 fs0 fc4 sc0 ls1 ws10\">2.70</div><div class=\"t m3 x21 hd y294 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y294 ff3 fs0 fc4 sc0 ls1 ws0\">show<span class=\"_ _0\"></span>Mess<span class=\"_ _0\"></span>ageBo<span class=\"_ _0\"></span>x </div><div class=\"t m0 x7 hc y210 ff3 fs0 fc5 sc0 ls1 ws10\">template<span class=\"ff2 fc0 ls24\">&lt;</span><span class=\"ws0\">class <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 hc y2e7 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">showMessageB<span class=\"_ _3\"></span>ox(T <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;msgBody<span class=\"_ _3\"></span>, <span class=\"fc9\">b<span class=\"_ _0\"></span>ool <span class=\"fc0\">mbYesN<span class=\"_ _3\"></span>o <span class=\"_ _0\"></span>= <span class=\"ff3 fc5 ws10\">t<span class=\"_ _0\"></span>rue<span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y2e8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y24 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y297 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2e9 ff2 fs0 fc0 sc0 ls1 ws0\">Define parameter <span class=\"_ _0\"></span>and displays<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the dialog b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y26 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y214 ff3 fs0 fcb sc0 ls1 ws10\">Par<span class=\"_ _0\"></span>ameter<span class=\"_ _0\"></span>:<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 xe hc y229 ff3 fs0 fc0 sc0 ls1 ws0\">msgBody <span class=\"ff2\">the me<span class=\"_ _0\"></span>ssage<span class=\"_ _3\"></span> that <span class=\"_ _0\"></span>will <span class=\"ls22 ws19\">be</span> <span class=\"_ _0\"></span>displayed <span class=\"ls1b ws11\">to</span> the <span class=\"_ _0\"></span>use<span class=\"_ _0\"></span>r.<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x1 hb y22a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y22b ff3 fs0 fc0 sc0 ls1 ws0\">mbYesNo true <span class=\"ff2\">displays a <span class=\"_ _0\"></span>YES <span class=\"ls3a ws2d\">NO</span> dialog box <span class=\"_ _0\"></span>and<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3\">false <span class=\"ff2\">displ<span class=\"_ _3\"></span>ays just <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> <span class=\"ls3b ws2e\">OK</span> <span class=\"_ _0\"></span>but<span class=\"_ _0\"></span>ton. </span></span></span></span></span></div><div class=\"t m0 x1 hb y2a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y22c ff3 fs0 fc4 sc0 ls1 ws10\">2.71</div><div class=\"t m3 x21 hd y22c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y22c ff3 fs0 fc4 sc0 ls1 ws0\">co<span class=\"_ _0\"></span>ntrol<span class=\"_ _0\"></span>Event<span class=\"_ _0\"></span>Focus<span class=\"_ _0\"></span>Closi<span class=\"_ _0\"></span>ng </div><div class=\"t m0 x7 hc y1f7 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">cont<span class=\"_ _3\"></span>rolEventFocus<span class=\"_ _3\"></span>Closing() </span></span></div><div class=\"t m0 x7 hc y2ea ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y22e ff2 fs0 fc0 sc0 ls1 ws0\">Handles focus <span class=\"_ _0\"></span>and window closing events. <span class=\"_ _3\"></span><span class=\"ff6\">Used <span class=\"ls3c ws2f\">in</span> <span class=\"_ _0\"></span><span class=\"ls3d ws30\">an<span class=\"ls1 ws0\"> e<span class=\"_ _0\"></span>v<span class=\"_ _3\"></span>ent <span class=\"_ _0\"></span>loop! </span></span></span></div><div class=\"t m0 x1 hb y22f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y230 ff3 fs0 fc4 sc0 ls1 ws10\">2.72</div><div class=\"t m3 x21 hd y230 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y230 ff3 fs0 fc4 sc0 ls1 ws0\">Other <span class=\"_ _0\"></span>metho<span class=\"_ _0\"></span>ds<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y231 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2eb ff2 fs0 fc0 sc0 ls1 ws0\">These methods below have the same role <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> those above. <span class=\"_ _3\"></span>The difference here <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>that their name starting <span class=\"ffa\">with “<span class=\"ffb ws10\">GSM<span class=\"_ _3\"></span>”</span><span class=\"ff3\"> </span></span>is </span></span></div><div class=\"t m0 x7 hc y2ec ffa fs0 fc0 sc0 ls1 ws0\">replaced by “<span class=\"ffb\">GR<span class=\"_ _3\"></span>M” (Game Resource M<span class=\"_ _3\"></span>anager).<span class=\"_ _3\"></span><span class=\"ff3\"> </span></span></div><div class=\"t m0 x1 h18 y2ed ff3 fsb fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y2ee w5 h19\"><div class=\"t m0 x0 h1a y2ef ff3 fsa fc0 sc0 ls1 ws0\">Other <span class=\"_ _0\"></span>meth<span class=\"_ _0\"></span>odes </div><div class=\"t m0 x0 hb y2f0 ff2 fs0 fc0 sc0 ls1 ws0\">GRMp<span class=\"_ _0\"></span>layS<span class=\"_ _0\"></span>ound </div><div class=\"t m0 x0 hb y2f1 ff2 fs0 fc0 sc0 ls1 ws0\">GRMp<span class=\"_ _0\"></span>layM<span class=\"_ _0\"></span>usic<span class=\"_ _0\"></span> </div><div class=\"t m0 x0 hb y2f2 ff2 fs0 fc0 sc0 ls1 ws0\">GRMu<span class=\"_ _0\"></span>seG<span class=\"_ _0\"></span>ameSy<span class=\"_ _0\"></span>stemSo<span class=\"_ _0\"></span>und </div><div class=\"t m0 x0 hb y2f3 ff2 fs0 fc0 sc0 ls1 ws0\">GRMu<span class=\"_ _0\"></span>seG<span class=\"_ _0\"></span>ameSy<span class=\"_ _0\"></span>stemMu<span class=\"_ _0\"></span>sic </div></div><div class=\"c x2b y2ee w6 h19\"><div class=\"t m0 x0 h1a y2ef ff3 fsa fc0 sc0 ls1 ws0\">Main <span class=\"_ _0\"></span>Methods (abo<span class=\"_ _0\"></span>ve) </div><div class=\"t m0 x0 hb y2f0 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>playS<span class=\"_ _0\"></span>ound </div><div class=\"t m0 x0 hb y2f1 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>play<span class=\"_ _0\"></span>Music </div><div class=\"t m0 x0 hb y2f2 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>useGa<span class=\"_ _0\"></span>meSys<span class=\"_ _0\"></span>temSo<span class=\"_ _0\"></span>und </div><div class=\"t m0 x0 hb y2f3 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>useGa<span class=\"_ _0\"></span>meSys<span class=\"_ _0\"></span>temMu<span class=\"_ _0\"></span>sic </div></div><div class=\"c x7 y2f4 w7 h1b\"><div class=\"t m0 x1 hc y2f5 ff3 fs0 fc4 sc0 ls1 ws0\">Protected <span class=\"_ _0\"></span>el<span class=\"_ _0\"></span>ement<span class=\"_ _0\"></span>s<span class=\"fc0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y2f6 ff3 fs0 fc4 sc0 ls1 ws0\">enum <span class=\"_ _2\"></span>M<span class=\"_ _3\"></span>sgAnswer </div></div><div class=\"c x7 y2f4 w7 h1b\"><div class=\"t m0 x0 hc y2f7 ff3 fs0 fc5 sc0 ls1 ws0\">enum </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2c hb y2f8 ff2 fs0 fc0 sc0 ls1 ws0\">MsgAnswer;<span class=\"_ _3\"></span> </div></div><div class=\"c x7 y2f4 w7 h1b\"><div class=\"t m0 x0 hc y2f9 ff3 fs0 fc0 sc0 ls1 ws0\">En<span class=\"_ _0\"></span>umerat<span class=\"_ _0\"></span>or </div><div class=\"t m0 x0 hb y2fa ff2 fs0 fc0 sc0 ls1 ws0\">Y<span class=\"_ _0\"></span>ES </div><div class=\"t m0 x0 h17 y2fb ff2 fsa fc0 sc0 ls3e ws31\">NO<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x2b y2fc w8 h1c\"><div class=\"t m0 x0 hb y2fd ff2 fs0 fc0 sc0 ls1 ws0\">Response <span class=\"_ _0\"></span>Ye<span class=\"_ _0\"></span>s </div><div class=\"t m0 x0 h17 y2fe ff2 fsa fc0 sc0 ls1 ws0\">Response <span class=\"_ _0\"></span><span class=\"ls3f ws32\">No<span class=\"ls1 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1e\" class=\"pf w0 h0\" data-page-no=\"1e\"><div class=\"pc pc1e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcoUucYQDH8ecVOY5bkGEwCWJVwWJTxH/AYDCsXTAtTBS27oZF0IGYDBZtCodBZvAsFwYWDQsWQQxDNjkc7jiOe30WBmJwafq6vXw+6eWu/XjDfXl4LokxBgAAAHKqwwQAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4TAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6TAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6jMBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqMwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAAAy0mkC7isv1+o3LTsAAPzXxgZ75qcG7MBvSYzRCty59T4AAOTgV34ISZLYAdUHAACQf+71AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH35cHFZrxyeNJotUwAAAE+k0wTPop2mH9Y/bex+DiHUNuZKxYJNAAAA1ZcT1aPTtx8r3+o3pgAAAFRfrjSarZmFrdrx2ehwv+oDAAAy4F5fpkrFwshg3/7a663FsjUAAIAMOOvL2uyrCSMAAACZcdYHAACg+gAAAFB9AAAAqD4AAABUHwAAAI/Bf3j+Wy4u66Pl5RDC5PjQ6rtpgwAAAH/JWd/zOPpyfve8c3DcTlObAAAAT8FZX9Yqhydvlrbvf7KyWV3ZrIYQzvfe2wcAAHhcSYzRCllqNFtX1z8f/Kq352U7Tb9+/xFCKBUL3V0vzAUAAKg+AAAA/si9PgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQD8at8OWaSKwgAMz3vmdt11giIiJrX6HzRZBFkEQZNFUEzadJOCYLCJYrVb7Fo079+YvzAwhl3QsEVwRGafp93Dhe+cyylvuACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAgL9rOuHnX61W23eo+XxeudwAAMBsNmu9Xp/o829jHS2Xy8Vi4XIDAACqDwAAYMv5rw8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAD3artgAAAH/SURBVACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAPCPqu/ajY9VXXp1audgrz7ffv/p5f6v56+Pz+4e7NWmNzR1OOPddPysF1PtT5vfx251pjpXXaguV1c6fu71o/Wb1Z3f3rlfPejP9zofdXrUzqjzoy6Oujrq1qi7o+6Nejjq0agno56Oejbq+ajX43Dem1FvR30Y9eVo7duo76N+jM1/PwAA4D/xE6AzlFgH3SL5AAAAAElFTkSuQmCC\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">31<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the responses <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>at the <span class=\"_ _0\"></span>user can <span class=\"_ _0\"></span>choose<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>from<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the dialog <span class=\"_ _3\"></span>b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">3.2</div><div class=\"t m3 x1d hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">upda<span class=\"_ _0\"></span>teMs<span class=\"_ _0\"></span>gBox<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y2ff ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y300 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">updat<span class=\"_ _3\"></span>eMsgBox(<span class=\"fc9 ws0\">int <span class=\"fc0\">sliderDirection,<span class=\"_ _3\"></span> </span>bool <span class=\"fc0\">rightSideValidation, </span>floa<span class=\"_ _3\"></span>t con<span class=\"_ _0\"></span>st<span class=\"_ _3\"></span> <span class=\"fc0\">&amp;DELTA_TIME, sf::Color <span class=\"_ _0\"></span>textD<span class=\"_ _3\"></span>efaultColor <span class=\"ls24\">= </span></span></span></span></div><div class=\"t m0 x7 hb y48 ff2 fs0 fc0 sc0 ls1 ws0\">DEFAULT_MSG_BOX_TE<span class=\"_ _3\"></span>XT_COLOR, sf::Color <span class=\"_ _3\"></span>textSelectedCol<span class=\"_ _3\"></span>or = DEFAULT_MSG_B<span class=\"_ _3\"></span>OX_SELECTED_TE<span class=\"_ _3\"></span>XT_COLOR)<span class=\"_ _b\"></span> </div><div class=\"t m0 x7 hc y301 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y302 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y303 ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>information<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>dialog bo<span class=\"_ _0\"></span>x. </span></span></div><div class=\"t m0 x7 hc y304 ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y305 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y306 ff3 fs0 fc0 sc0 ls1 ws0\">sliderDirection<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2\">allows<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> manage <span class=\"_ _0\"></span><span class=\"ff3\">GameS<span class=\"_ _3\"></span>lider <span class=\"ff2\">directio<span class=\"_ _3\"></span>n </span>(click here <span class=\"_ _0\"></span><span class=\"fc3\">1 <span class=\"fc0\">fore more <span class=\"_ _0\"></span>info<span class=\"_ _0\"></span>rmat<span class=\"_ _0\"></span>ion). </span></span></span></span></span></span></div><div class=\"t m0 x1 hc y307 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y308 ff3 fs0 fc0 sc0 ls1 ws0\">rightSideValidation<span class=\"_ _3\"></span> <span class=\"ff2\">allows<span class=\"_ _3\"></span> you <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>valida<span class=\"_ _3\"></span>te <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>option <span class=\"ls26 ws1c\">by</span> clic<span class=\"_ _3\"></span>king <span class=\"ls1c ws12\">on</span> <span class=\"_ _0\"></span>the r<span class=\"_ _0\"></span>igh<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span>sid<span class=\"_ _3\"></span>e <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>a screen<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y309 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2bd ff3 fs0 fc0 sc0 ls1 ws0\">textDefaultColor<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2\">messa<span class=\"_ _3\"></span>ge <span class=\"_ _0\"></span>text <span class=\"_ _0\"></span>color<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y30a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y30b ff3 fs0 fc0 sc0 ls1 ws0\">textSelectedColor <span class=\"ff2\">button <span class=\"_ _0\"></span>te<span class=\"_ _3\"></span>xt <span class=\"_ _0\"></span>co<span class=\"_ _0\"></span>lor. </span></div><div class=\"t m2 xc hc y30c ff3 fs0 fc4 sc0 ls1 ws10\">3.3</div><div class=\"t m3 x1d hd y30c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y30c ff3 fs0 fc4 sc0 ls1 ws10\">upda<span class=\"_ _0\"></span>teT<span class=\"_ _0\"></span>imeWai<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y30d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y30e ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">updateTimeWait(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">float <span class=\"_ _0\"></span>const <span class=\"fc0\">&amp;<span class=\"_ _0\"></span>DELTA<span class=\"_ _0\"></span>_TIME<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x1 hb y29a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y30f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y310 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y311 ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>counte<span class=\"_ _3\"></span>r which <span class=\"_ _0\"></span>all<span class=\"_ _3\"></span>ows the <span class=\"_ _0\"></span>user <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> wait <span class=\"_ _0\"></span>after choosing<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> option. This avoids the <span class=\"_ _0\"></span>choices <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>loop<span class=\"_ _0\"></span>s. </span></span></span></span></div><div class=\"t m2 xc hc y312 ff3 fs0 fc4 sc0 ls1 ws10\">3.4</div><div class=\"t m3 x1d hd y312 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y312 ff3 fs0 fc4 sc0 ls1 ws0\">dra<span class=\"_ _0\"></span>wMsgBo<span class=\"_ _0\"></span>x </div><div class=\"t m0 x7 hb y256 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">drawMsgBox() </span></div><div class=\"t m0 x7 hc y313 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y314 ff2 fs0 fc0 sc0 ls1 ws0\">Displays the <span class=\"_ _0\"></span>dialog b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y259 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y91 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb h1d y315 ffc fs0 fc3 sc0 ls1 ws0\">SDM (Step <span class=\"ls40 ws33\">and</span> <span class=\"_ _0\"></span>Draw Ma<span class=\"_ _0\"></span>nager<span class=\"_ _0\"></span>)<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h1e y5f ffc fsc fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y316 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y317 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y318 ff2 fs0 fc0 sc0 ls1 ws0\">Parent class that allows a scene <span class=\"_ _0\"></span><span class=\"ls1e ws14\">to<span class=\"ls1 ws0\"> use <span class=\"_ _0\"></span>the functions that automatical<span class=\"_ _3\"></span>ly update and display the obje<span class=\"_ _0\"></span>cts of a scene. <span class=\"ls2e ws23\">It</span> also </span></span></div><div class=\"t m0 x7 hb y319 ff2 fs0 fc0 sc0 ls1 ws0\">allows to manage th<span class=\"_ _3\"></span>e display depth of obj<span class=\"_ _3\"></span>ects. </div><div class=\"t m2 xc hc y31a ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y31a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y31a ff3 fs0 fc4 sc0 ls1 ws0\">Publics elements <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>SD<span class=\"_ _0\"></span>M<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y31b ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y31b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y31b ff3 fs0 fc4 sc0 ls1 ws0\">m_S<span class=\"_ _0\"></span>DMsce<span class=\"_ _0\"></span>neObj<span class=\"_ _0\"></span>ects </div><div class=\"t m0 x7 hc y31c ff3 fs0 fc5 sc0 ls1 ws10\">std::vector<span class=\"fc4 ls41\">&lt;</span>std::shared_p<span class=\"_ _3\"></span>tr<span class=\"ff2 fc0 ws0\">&lt;MainO<span class=\"_ _3\"></span>bject&gt;&gt; <span class=\"_ _0\"></span>m_SDMsceneO<span class=\"_ _3\"></span>bjects </span></div><div class=\"t m0 x7 hc y31d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div></div><div class=\"c x7 y31e w9 h1f\"><div class=\"t m0 x0 h1d y31f ffc fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y320 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>S<span class=\"_ _3\"></span>DM </div></div><div class=\"c x7 y31e w9 h1f\"><div class=\"t m0 x0 h1a y321 ff3 fsa fc5 sc0 ls1 ws0\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d h17 y322 ff2 fsa fc0 sc0 ls1 ws0\">SDM; </div></div><div class=\"c x7 y31e w9 h1f\"><div class=\"t m0 x0 hb y28c ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/disp<span class=\"_ _0\"></span>lay/<span class=\"_ _0\"></span>SDM.h<span class=\"fc0 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1f\" class=\"pf w0 h0\" data-page-no=\"1f\"><div class=\"pc pc1f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbwQ3DIBBFwWzwhQrovzs64ADSpoacLLEzHfBtH55sR2Z+AAAAuNTXBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAACAFzzFzx8RxReYc44xPAkAAKD67rT3Lr5Aa81jAAAAF4vMtAIAAMCt/NcHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAACAtzw1j73Wcu0BAKCg3rvqK+Gc43YHAAAq8IUnAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAADwv8hMKwAAANzKuz4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQC/9uuWNQsoDMAw9+Pb3UdRRMS0WfcfXLIIMgaCJougLG1tLm0gLNhEsdotdle2vF+0sIGGFcMLgtfVzuHA83DaDQCqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqjerUQAAAADySURBVA8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPxn1be1/a2qxyd3Vy936seLL9+Pj36ff72/t3a5U8teaNH1jM+L22d9WNTRYvl7rFXr1f3qYbVRbXb73Kc398+q3T/evK7e9Pe73plamVqdejD1aOrJ1POpl1Ovpt5OvZvam9qfOpg6nPo41/NOpz5NfZ36eXN3NnU+dTHL/z8AAOAfcQW07jr0FshLdwAAAABJRU5ErkJggg==\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">32<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2e2 ff2 fs0 fc0 sc0 ls1 ws0\">Container which allows <span class=\"ls1b ws11\">to</span> store the <span class=\"_ _0\"></span>objects (derived from <span class=\"ff3\">MainO<span class=\"_ _3\"></span>bject </span>class)<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the scene which will be managed <span class=\"ls26 ws1c\">by</span> the </div><div class=\"t m0 x7 hb y323 ff2 fs0 fc0 sc0 ls1 ws0\">S<span class=\"_ _0\"></span>DM.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y187 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y187 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y187 ff3 fs0 fc4 sc0 ls1 ws10\">SDM<span class=\"_ _0\"></span>getOb<span class=\"_ _0\"></span>ject<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y324 ff2 fs0 fc0 sc0 ls1 ws0\">MainObject*<span class=\"_ _3\"></span> <span class=\"_ _2\"></span>SDMg<span class=\"_ _3\"></span>etObject(<span class=\"_ _3\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; n<span class=\"_ _0\"></span>ame<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x1 hb y189 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y325 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y326 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y327 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0 ls23 ws1a\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> object whic<span class=\"_ _3\"></span>h <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span>in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the container according <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>its nam<span class=\"_ _0\"></span>e. </span></span></span></span></div><div class=\"t m0 x1 hb y302 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y303 ff6 fs0 fc0 sc0 ls1 ws0\">Exemple <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y121 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y328 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y329 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y32a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y32b ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y32b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y32b ff3 fs0 fc4 sc0 ls1 ws0\">SDM<span class=\"_ _0\"></span>addS<span class=\"_ _0\"></span>ceneOb<span class=\"_ _0\"></span>ject </div><div class=\"t m0 x7 hc y32c ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hc y32d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">SDMaddScene<span class=\"_ _3\"></span>Object(<span class=\"ff3 fc5\">std::shared_p<span class=\"_ _3\"></span>tr</span><span class=\"ws0\">&lt;T&gt; obj, <span class=\"_ _0\"></span><span class=\"fc9\">bool <span class=\"fc0\">callStepFunction<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"ff3 fc5 ws10\">true</span>, <span class=\"fc9\">bool </span>callDrawFunction <span class=\"_ _0\"></span>= <span class=\"ff3 fc5 ws10\">true</span>, <span class=\"fc9 ws10\">co<span class=\"_ _0\"></span>nst<span class=\"fc0 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 hc y32e ff3 fs0 fc5 sc0 ls1 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; name <span class=\"_ _0\"></span>= <span class=\"_ _0\"></span><span class=\"ff3 fc7 ws10\">&quot;null<span class=\"_ _3\"></span>&quot;<span class=\"ff2 fc0 ws0\">, <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">callEventFunctio<span class=\"_ _3\"></span>n <span class=\"_ _0\"></span>= <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">false<span class=\"ff2 fc0 ls32 ws0\">) </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y32f ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y330 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> add <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>the con<span class=\"_ _0\"></span>taine<span class=\"_ _0\"></span>r. </span></span></div><div class=\"t m0 x1 hb y331 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y332 ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y333 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y334 ff3 fs0 fc0 sc0 ls1 ws0\">obj <span class=\"_ _0\"></span><span class=\"ff2\">the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>object<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>add<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 xe hc y19c ff3 fs0 fc0 sc0 ls1 ws0\">callStepFunction<span class=\"_ _3\"></span> <span class=\"ff2\">lets know <span class=\"ls1d ws13\">if</span> the SDM<span class=\"_ _3\"></span> should update the <span class=\"_ _3\"></span>object.<span class=\"_ _3\"></span> </span></div><div class=\"t m0 xe hc y335 ff3 fs0 fc0 sc0 ls1 ws0\">callDrawFunction <span class=\"_ _3\"></span><span class=\"ff2\">l<span class=\"_ _3\"></span>ets k<span class=\"_ _3\"></span>now <span class=\"_ _3\"></span>if <span class=\"_ _3\"></span>the <span class=\"_ _3\"></span>SDM<span class=\"_ _3\"></span> shou<span class=\"_ _3\"></span>ld <span class=\"_ _3\"></span>draw <span class=\"_ _3\"></span>the <span class=\"_ _3\"></span>object.<span class=\"_ _3\"></span> </span></div><div class=\"t m0 xe hc y336 ff3 fs0 fc0 sc0 ls1 ws0\">name <span class=\"ff2\">allows to give<span class=\"_ _3\"></span> a name to the object du<span class=\"_ _3\"></span>ring the addition.<span class=\"_ _3\"></span> </span></div><div class=\"t m0 xe hc y337 ff3 fs0 fc0 sc0 ls1 ws0\">callEventFunction <span class=\"ff2\">lets know <span class=\"_ _0\"></span><span class=\"ls1d ws13\">if<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>SDM shoul<span class=\"_ _3\"></span>d call the object&apos;s <span class=\"_ _0\"></span>event me<span class=\"_ _0\"></span>thod. </span></span></span></div><div class=\"t m0 x1 hb y338 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y339 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y339 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y339 ff3 fs0 fc4 sc0 ls1 ws10\">SDM<span class=\"_ _0\"></span>addS<span class=\"_ _0\"></span>prite<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y33a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y175 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">SDMaddSprite(sf::Tex<span class=\"_ _3\"></span>ture &amp;tex, </span>const </span><span class=\"ws10\">std::string<span class=\"_ _3\"></span></span><span class=\"ff2 fc0\">&amp; name , <span class=\"fc9\">float </span><span class=\"ls29 ws20\">x,</span> <span class=\"fc9\">float </span>y, <span class=\"fc9\">bool </span>center <span class=\"_ _0\"></span>= <span class=\"ff3 fc5 ws10\">false</span>, <span class=\"fc9\">int </span>depth <span class=\"ls24\">= </span></span></div><div class=\"t m0 x7 hb y176 ff2 fs0 fc0 sc0 ls1 ws0\">Dep<span class=\"_ _0\"></span>thObje<span class=\"_ _0\"></span>ct:<span class=\"_ _0\"></span>:NORMA<span class=\"_ _0\"></span>L_DEPT<span class=\"_ _0\"></span>H) </div><div class=\"t m0 x7 hc y33b ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y33c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y33d ff2 fs0 fc0 sc0 ls1 ws0\">Allows you <span class=\"ls1b ws11\">to</span> add <span class=\"_ _0\"></span>a SFML Sprite<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">in</span> the<span class=\"_ _0\"></span> container.<span class=\"_ _3\"></span> <span class=\"ls17 ws15\">It</span> wi<span class=\"_ _0\"></span>ll<span class=\"_ _3\"></span> not <span class=\"ls22 ws19\">be<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> part <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the objects <span class=\"ls1b ws11\">to</span> <span class=\"ls22 ws19\">be</span> updated but <span class=\"_ _0\"></span><span class=\"ls1f ws16\">of<span class=\"ls1 ws0\"> those <span class=\"_ _0\"></span>that will b<span class=\"_ _3\"></span>e </span></span></span></span></div><div class=\"t m0 x7 hc y33e ff2 fs0 fc0 sc0 ls1 ws0\">displayed. The Sprit<span class=\"_ _3\"></span>e will be assoc<span class=\"_ _3\"></span>iated with a <span class=\"ff3\">M<span class=\"_ _3\"></span>ainObject </span>o<span class=\"_ _3\"></span>bject. </div><div class=\"t m2 xc hc y33f ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y33f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y33f ff3 fs0 fc4 sc0 ls1 ws10\">SDM<span class=\"_ _0\"></span>setObjD<span class=\"_ _0\"></span>ept<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y340 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y341 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">SDMsetObjDept<span class=\"_ _3\"></span>h(</span>const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::s<span class=\"_ _3\"></span>tring<span class=\"ff2 fc0 ws0\">&amp; name, <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0\">de<span class=\"_ _0\"></span>pth<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 hb y342 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y343 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0\">SDMsetObjDepth(Ma<span class=\"_ _3\"></span>inObject *<span class=\"_ _0\"></span>obj,<span class=\"_ _3\"></span> <span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">dep<span class=\"_ _0\"></span>th) </span></span></span></span></div><div class=\"t m0 x1 hb y344 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y345 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y346 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the display depth <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </span></span></div></div><div class=\"c x23 y347 w4 h20\"><div class=\"t m0 x0 hb y348 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y349 ff2 fs0 fc9 sc0 ls1 ws0\">auto </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x25 hc y34a ff2 fs0 fc0 sc0 ls1 ws0\">player <span class=\"_ _0\"></span>= <span class=\"_ _2\"></span>SDM<span class=\"_ _3\"></span>getObject(<span class=\"_ _3\"></span><span class=\"ff3 fc7 ws10\">&quot;Player&quot;</span>); </div></div><div class=\"c x23 y347 w4 h20\"><div class=\"t m0 x24 hb y34b ff2 fs0 fc0 sc0 ls1 ws10\">pla<span class=\"_ _0\"></span>yer-&gt;<span class=\"_ _0\"></span>setX<span class=\"_ _0\"></span>(<span class=\"fcc\">777.<span class=\"_ _0\"></span>f<span class=\"fc0 ls32 ws35\">);<span class=\"ls1 ws0\"> </span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf20\" class=\"pf w0 h0\" data-page-no=\"20\"><div class=\"pc pc20 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQf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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">33<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb h1d y34c ffc fs0 fc3 sc0 ls1 ws0\">Game S<span class=\"_ _0\"></span>ound<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h1d y118 ffc fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y34d ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y34d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y34d ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameSound </div><div class=\"t m0 x7 hc y11b ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0 ws10\">GameSound</span><span class=\"fc4 ls43\">;</span><span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y34e ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/soun<span class=\"_ _0\"></span>d/Gam<span class=\"_ _0\"></span>eSo<span class=\"_ _0\"></span>und.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y34f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y350 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y351 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that allows <span class=\"ls1b ws11\">to</span> use <span class=\"_ _0\"></span>sounds<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the gam<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y352 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y352 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y352 ff3 fs0 fc4 sc0 ls1 ws0\">Publics elements <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Sound<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y353 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y353 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y353 ff3 fs0 fc4 sc0 ls1 ws10\">Game<span class=\"_ _0\"></span>Soun<span class=\"_ _0\"></span>d<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y354 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y355 ff2 fs0 fc0 sc0 ls1 ws10\">GameSound(<span class=\"fc9 ws0\">const<span class=\"_ _3\"></span> </span><span class=\"ff3 fc5\">st<span class=\"_ _0\"></span>d::st<span class=\"_ _3\"></span>ring<span class=\"ff2 fc0 ws0\">&amp; <span class=\"_ _0\"></span>soundName, <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"ff3 fc5 ws10\">std::string</span><span class=\"fc0\">&amp; file<span class=\"_ _0\"></span>Path<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y356 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y357 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y358 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y359 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor that allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load<span class=\"_ _3\"></span> a <span class=\"_ _0\"></span>sound and give <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"ls1 ws0\"> a n<span class=\"_ _0\"></span>ame. </span></span></div><div class=\"t m0 x1 hb y35a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc yf5 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd yf5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc yf5 ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dReso<span class=\"_ _0\"></span>urce<span class=\"_ _0\"></span>s<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y35b ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">loadResources(<span class=\"fc9 ws0\">const </span><span class=\"ff3 fc5\">std::string</span><span class=\"ws0\">&amp; f<span class=\"_ _0\"></span>ileP<span class=\"_ _0\"></span>ath<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x1 hb y35c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y35d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y35e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb yf7 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load the s<span class=\"_ _0\"></span>ound. </div><div class=\"t m0 x1 hb y35f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y360 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y360 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y360 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Soun<span class=\"_ _0\"></span>dBuffe<span class=\"_ _0\"></span>r </div><div class=\"t m0 x7 hb y361 ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Sou<span class=\"_ _0\"></span>ndBuf<span class=\"_ _0\"></span>fer&amp; <span class=\"_ _0\"></span>getSo<span class=\"_ _0\"></span>undBu<span class=\"_ _0\"></span>ffer<span class=\"_ _0\"></span>() </div><div class=\"t m0 x7 hc y362 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y363 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">Sound <span class=\"_ _0\"></span>Buffer ob<span class=\"_ _0\"></span>ject. </span></div><div class=\"t m0 x1 hb y364 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y365 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y365 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y365 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Soun<span class=\"_ _0\"></span>d </div><div class=\"t m0 x7 hb y143 ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Sou<span class=\"_ _0\"></span>nd&amp; <span class=\"_ _0\"></span>getSou<span class=\"_ _0\"></span>nd()<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y366 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y367 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">Sound <span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>ject. </span></div><div class=\"t m0 x1 hb y33b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y368 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y33d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y369 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y36a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y36b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb h1d y36c ffc fs0 fc3 sc0 ls1 ws0\">Game M<span class=\"_ _0\"></span>usic<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h1d y36d ffc fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc ydb ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd ydb ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ydb ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameMusic </div><div class=\"t m0 x7 hc y36e ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0 ws10\">GameMusic<span class=\"_ _3\"></span></span><span class=\"fc4 ls43\">;</span><span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y36f ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/soun<span class=\"_ _0\"></span>d/Gam<span class=\"_ _0\"></span>eMusi<span class=\"_ _0\"></span>c.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y370 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ydf ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf21\" class=\"pf w0 h0\" data-page-no=\"21\"><div class=\"pc pc21 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcP2tTUQCH4XNMKKFIqRDsULRjKW0nyWYpdHToUHBzKbg4SEFnh4KLFPoJhE4u0sFRBHEpFAoduvhnE7MYolyUNsQQPB0CoUMHQbw1p88zhbPdH3fIy81NTCkFAAAAMnXFBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqMwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+EwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8A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1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAEUnifgAAAGcSURBVED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAICxmfyGfH563Ookme2nw3IxZNX6+Mq7anv+vps2XdVFn11CiGtDm8O9f75dCgDA2F13pSX8C7H97OP1AS3tjODk36CgAAAAAElFTkSuQmCC\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">34<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>use musics <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the game<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y371 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y371 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y371 ff3 fs0 fc4 sc0 ls1 ws0\">Publics elements <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>GameM<span class=\"_ _0\"></span>usic<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y372 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y372 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y372 ff3 fs0 fc4 sc0 ls1 ws10\">Game<span class=\"_ _0\"></span>Musi<span class=\"_ _0\"></span>c<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y188 ff2 fs0 fc0 sc0 ls1 ws10\">GameMusic(<span class=\"fc9 ws0\">c<span class=\"_ _3\"></span>onst <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; musicName, <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"ff3 fc5 ws10\">std::string<span class=\"_ _3\"></span></span><span class=\"fc0\">&amp; <span class=\"_ _0\"></span>fi<span class=\"_ _0\"></span>lePath<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 hb y189 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y325 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y373 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y327 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor that allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load<span class=\"_ _3\"></span> a music and <span class=\"_ _0\"></span>give <span class=\"ls1d ws13\">it</span> a n<span class=\"_ _0\"></span>ame. </div><div class=\"t m0 x1 hb y374 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y375 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y375 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y375 ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dReso<span class=\"_ _0\"></span>urce<span class=\"_ _0\"></span>s<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y304 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">loadResources(<span class=\"fc9 ws0\">const </span><span class=\"ff3 fc5\">std::string</span><span class=\"ws0\">&amp; f<span class=\"_ _0\"></span>ileP<span class=\"_ _0\"></span>ath<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x1 hb y305 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y306 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y307 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y376 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load the m<span class=\"_ _0\"></span>usic. </div><div class=\"t m0 x1 hb y309 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2bd ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y2bd ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2bd ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Musi<span class=\"_ _0\"></span>c </div><div class=\"t m0 x7 hb y2c4 ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Mus<span class=\"_ _0\"></span>ic&amp; ge<span class=\"_ _0\"></span>tMus<span class=\"_ _0\"></span>ic()<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y30c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y377 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">Music ob<span class=\"_ _0\"></span>ject. </span></div><div class=\"t m0 x1 hb yc8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y378 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y310 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb yca ff6 fs0 fc3 sc0 ls1 ws0\">GSM <span class=\"_ _0\"></span>(Game<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>Sound Ma<span class=\"_ _0\"></span>nage<span class=\"_ _0\"></span>r)<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h21 y379 ff6 fsc fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y37a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y37b ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y37c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y37d ff2 fs0 fc0 sc0 ls1 ws0\">Parent class <span class=\"_ _0\"></span>that allows a <span class=\"_ _0\"></span>scene <span class=\"ls1b ws11\">to</span> add <span class=\"_ _0\"></span>and use <span class=\"_ _0\"></span>sounds<span class=\"_ _3\"></span> and musics without<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>initial<span class=\"_ _3\"></span>izing SFML ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>s. </div><div class=\"t m2 xc hc y37e ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y37e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y37e ff3 fs0 fc4 sc0 ls1 ws0\">Publics elements <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span><span class=\"ls44 ws36\">GSM<span class=\"fc0 ls1 ws0\"> </span></span></div><div class=\"t m2 xc hc ya3 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd ya3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ya3 ff3 fs0 fc4 sc0 ls1 ws0\">GSM Containers </div><div class=\"t m0 x7 hc y27f ff3 fs0 fc5 sc0 ls1 ws10\">std::vector<span class=\"ff2 fc0 ls24\">&lt;</span>std::sh<span class=\"_ _3\"></span>ared_ptr<span class=\"ff2 fc0 ws0\">&lt;Game<span class=\"_ _3\"></span>Sound&gt;&gt; <span class=\"_ _0\"></span>m_GSMsound </span></div><div class=\"t m0 x7 hc y37f ff3 fs0 fc5 sc0 ls1 ws10\">std::vector<span class=\"ff2 fc0 ls24\">&lt;</span>std::sh<span class=\"_ _3\"></span>ared_ptr<span class=\"ff2 fc0 ws0\">&lt;GameMusic<span class=\"_ _3\"></span>&gt;&gt; m_GSMmus<span class=\"_ _3\"></span>ic </span></div><div class=\"t m0 x7 hc y95 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y380 ff2 fs0 fc0 sc0 ls1 ws0\">Container which allows <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> store the sounds and musics<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1f ws16\">of<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the scene which <span class=\"_ _0\"></span>will <span class=\"ls22 ws19\">be</span> managed <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>the G<span class=\"_ _0\"></span>SM.<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x1 hb y381 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y382 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y382 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y382 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>addSo<span class=\"_ _0\"></span>und<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y383 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y87 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">void <span class=\"_ _0\"></span>G<span class=\"_ _3\"></span>SMaddSound(<span class=\"_ _3\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::stri<span class=\"_ _3\"></span>ng<span class=\"ff2 fc0 ws0\">&amp; filePath, <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">&amp; n<span class=\"_ _0\"></span>ame) </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y384 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc ya9 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y385 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>add a <span class=\"_ _0\"></span>sou<span class=\"_ _3\"></span>nd <span class=\"ls1b ws11\">to</span> the co<span class=\"_ _0\"></span>ntain<span class=\"_ _0\"></span>er. </div><div class=\"t m0 x1 hb y386 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y387 ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div></div><div class=\"c x7 y388 w9 h22\"><div class=\"t m0 x0 h17 y389 ff6 fsa fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y38a ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>GS<span class=\"_ _3\"></span>M </div></div><div class=\"c x7 y388 w9 h22\"><div class=\"t m0 x0 hc y321 ff3 fs0 fc5 sc0 ls1 ws0\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hc y38b ff2 fs0 fc0 sc0 ls1 ws10\">GSM<span class=\"ff3 fc4 ls43\">;</span><span class=\"ff3 ws0\"> </span></div></div><div class=\"c x7 y388 w9 h22\"><div class=\"t m0 x0 hc y38c ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/soun<span class=\"_ _0\"></span>d/<span class=\"ff3 ls45 ws37\">GSM</span><span class=\"ls46 ws38\">.h</span><span class=\"fc0 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf22\" class=\"pf w0 h0\" data-page-no=\"22\"><div class=\"pc pc22 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 xe hc y117 ff3 fs0 fc0 sc0 ls1 ws0\">name <span class=\"_ _0\"></span><span class=\"ff2\">sound na<span class=\"_ _0\"></span>me. </span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b2 ff3 fs0 fc0 sc0 ls1 ws0\">filePath <span class=\"_ _0\"></span><span class=\"ff2\">sound<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>file p<span class=\"_ _0\"></span>at<span class=\"_ _0\"></span>h. </span></div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>addSo<span class=\"_ _0\"></span>undOb<span class=\"_ _0\"></span>ject<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e4 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GSMaddSound<span class=\"_ _3\"></span>Object(<span class=\"ff3 fc5\">st<span class=\"_ _3\"></span>d::shared_ptr</span><span class=\"ws0\">&lt;Gam<span class=\"_ _3\"></span>eSound&gt; sound, <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">showError <span class=\"_ _0\"></span>= <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">true<span class=\"_ _3\"></span><span class=\"ff2 fc0 ls32 ws0\">) </span></span></span></span></span></span></div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1e6 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>add <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span><span class=\"ff3\">existing<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2\">sound<span class=\"_ _3\"></span> object <span class=\"_ _0\"></span>(<span class=\"ff3 ws10\">is::Gam<span class=\"_ _3\"></span>eSound</span>) <span class=\"ls1b ws11\">to</span> the <span class=\"_ _0\"></span>cont<span class=\"_ _0\"></span>ainer<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fc0 sc0 ls1 ws0\">showError <span class=\"ff2\">displays <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>error message <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> case <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> duplicate </span>of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>sound fi<span class=\"_ _0\"></span>le. </span></span></span></span></span></div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>addMu<span class=\"_ _0\"></span>sic<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ea ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">void <span class=\"_ _0\"></span>G<span class=\"_ _3\"></span>SMaddMusic(<span class=\"fc9\">c<span class=\"_ _3\"></span>onst <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">&amp; filePath, <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::<span class=\"_ _3\"></span>string<span class=\"ff2 fc0 ws0\">&amp; name<span class=\"_ _0\"></span>) </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y38d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y38e ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> add <span class=\"_ _0\"></span>a music<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> the <span class=\"_ _3\"></span>con<span class=\"_ _0\"></span>taine<span class=\"_ _0\"></span>r. </span></span></div><div class=\"t m0 x7 hc ye8 ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y213 ff3 fs0 fc0 sc0 ls1 ws0\">name <span class=\"_ _0\"></span><span class=\"ff2\">music<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>name<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y1f0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y24c ff3 fs0 fc0 sc0 ls1 ws0\">filePath <span class=\"ff2\">music <span class=\"_ _0\"></span>file<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>pat<span class=\"_ _0\"></span>h. </span></div><div class=\"t m2 xc hc ybf ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd ybf ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ybf ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>addMu<span class=\"_ _0\"></span>sicObj<span class=\"_ _0\"></span>ect<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1f2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y390 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GSMaddMusic<span class=\"_ _3\"></span>Object(<span class=\"ff3 fc5\">std<span class=\"_ _3\"></span>::shared_ptr</span><span class=\"ws0\">&lt;Gam<span class=\"_ _3\"></span>eMusic&gt;<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>sound, <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">sho<span class=\"_ _3\"></span>wError <span class=\"_ _0\"></span>= <span class=\"ff3 fc5 ws10\">true</span><span class=\"ls32\">) </span></span></span></span></span></div><div class=\"t m0 x7 hc y391 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1f7 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>add <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span><span class=\"ff3\">existing <span class=\"ff2\">music object <span class=\"_ _0\"></span>(<span class=\"ff3 ws10\">is::Gam<span class=\"_ _3\"></span>eMusic</span>) <span class=\"ls1b ws11\">to</span> the con<span class=\"_ _0\"></span>taine<span class=\"_ _0\"></span>r. </span></span></div><div class=\"t m0 x1 hb y392 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f9 ff3 fs0 fc0 sc0 ls1 ws0\">showError <span class=\"ff2\">displays <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>error message <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>case <span class=\"ls1c ws12\">of</span> duplicate <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>music fi<span class=\"_ _0\"></span>le. </span></div><div class=\"t m2 xc hc y1fa ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y1fa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1fa ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>pause<span class=\"_ _0\"></span>Soun<span class=\"_ _0\"></span>d<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y393 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ya1 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">G<span class=\"_ _3\"></span>SMpauseSound(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::stri<span class=\"_ _3\"></span>ng<span class=\"ff2 fc0 ws0\">&amp; n<span class=\"_ _0\"></span>ame) </span></span></span></span></span></div><div class=\"t m0 x1 hb y394 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y395 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y396 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>pause a <span class=\"_ _0\"></span>sou<span class=\"_ _3\"></span>nd managed <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>GSM<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y397 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc ya5 ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd ya5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ya5 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>pause<span class=\"_ _0\"></span>Soun<span class=\"_ _0\"></span>d<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y37f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y398 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">GSMstopSound(<span class=\"_ _3\"></span></span>const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp;<span class=\"_ _3\"></span> n<span class=\"_ _0\"></span>ame) </span></span></span></div><div class=\"t m0 x1 hb y399 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y39a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb yba ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>stop sound <span class=\"_ _0\"></span>ma<span class=\"_ _3\"></span>naged<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls26 ws1c\">by<span class=\"ls1 ws0\"> GS<span class=\"_ _0\"></span>M. </span></span></div><div class=\"t m0 x1 hb y39b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y39c ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y39c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y39c ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>pauseM<span class=\"_ _0\"></span>usic<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y39d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y39e ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GSMpaus<span class=\"_ _3\"></span>eMusic(<span class=\"fc9 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">&amp; n<span class=\"_ _0\"></span>ame) </span></span></span></span></span></div><div class=\"t m0 x1 hb y39f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ya9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y3a0 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>pause a <span class=\"_ _0\"></span>music man<span class=\"_ _3\"></span>aged <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>GS<span class=\"_ _0\"></span>M. </div><div class=\"t m0 x1 hb y1b0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y3a1 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y3a1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y3a1 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>stopM<span class=\"_ _0\"></span>usic<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y3a2 ff4 fs4 fc0 sc0 ls19 wsf\">35<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf23\" class=\"pf w0 h0\" data-page-no=\"23\"><div class=\"pc pc23 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzboQoqURSG0bOvgqYZDFpEzCI+mc1ms9lsPpnBbDAZhGkGOTcIl/sMZ68V7PsfYfjCRK21AAAA0Kg/JgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ZkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANVnAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUnwkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSf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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">36<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GSMstopMus<span class=\"_ _3\"></span>ic(<span class=\"fc9 ws0\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; n<span class=\"_ _0\"></span>ame<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b4 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>stop music managed <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>GSM<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.10</div><div class=\"t m3 x21 hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>delet<span class=\"_ _0\"></span>eSoun<span class=\"_ _0\"></span>d<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GSMdel<span class=\"_ _3\"></span>eteSound(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp;<span class=\"_ _3\"></span> n<span class=\"_ _0\"></span>a<span class=\"_ _0\"></span>me<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20d ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> de<span class=\"_ _0\"></span>l<span class=\"_ _3\"></span>ete <span class=\"_ _0\"></span>sou<span class=\"_ _3\"></span>nd managed <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>GSM<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.11</div><div class=\"t m3 x21 hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>delet<span class=\"_ _0\"></span>eMusi<span class=\"_ _0\"></span>c<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20f ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">G<span class=\"_ _3\"></span>SMdeleteMusi<span class=\"_ _3\"></span>c(<span class=\"fc9 ws0\">const </span><span class=\"ff3 fc5\">std::string</span><span class=\"ws0\">&amp; <span class=\"_ _0\"></span>name) </span></span></span></div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y243 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>delete music managed <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>GSM<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y244 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y245 ff3 fs0 fc4 sc0 ls1 ws10\">2.12</div><div class=\"t m3 x21 hd y245 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y245 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>getSo<span class=\"_ _0\"></span>und<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3a3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y246 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Sou<span class=\"_ _3\"></span>nd* <span class=\"_ _0\"></span>GSMgetSound(<span class=\"_ _3\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp;<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>na<span class=\"_ _0\"></span>me<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y3a4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y247 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y3a5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">a <span class=\"_ _0\"></span>sound<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the container according <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> its name<span class=\"_ _0\"></span>. </span></span></span></span></span></div><div class=\"t m0 x1 hb y3a6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y390 ff3 fs0 fc4 sc0 ls1 ws10\">2.13</div><div class=\"t m3 x21 hd y390 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y390 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>getMu<span class=\"_ _0\"></span>sic<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3a7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y391 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Music<span class=\"_ _3\"></span>* <span class=\"_ _0\"></span>GSMgetMus<span class=\"_ _3\"></span>ic(<span class=\"fc9\">const <span class=\"ff3 fc5 ws10\">st<span class=\"_ _0\"></span>d::str<span class=\"_ _3\"></span>ing<span class=\"ff2 fc0 ws0\">&amp; <span class=\"_ _0\"></span>nam<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y3a8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3a9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3aa ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f9 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">a music that <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> </span>in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e container according <span class=\"_ _0\"></span><span class=\"ls1e ws14\">to<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>its name. </span></span></span></span></span></div><div class=\"t m2 xc hc y1fa ff3 fs0 fc4 sc0 ls1 ws10\">2.14</div><div class=\"t m3 x21 hd y1fa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1fa ff3 fs0 fc4 sc0 ls1 ws0\">Other <span class=\"_ _0\"></span>metho<span class=\"_ _0\"></span>ds<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3ab ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ya1 ff2 fs0 fc0 sc0 ls1 ws0\">These methods below have the same role <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> those above. The difference here <span class=\"ls1d ws13\">is</span> that their name starting <span class=\"ffa\">with “<span class=\"ffb ws10\">GSM”</span><span class=\"ff3\"> </span></span>is </span></span></div><div class=\"t m0 x7 hc y3ac ff2 fs0 fc0 sc0 ls1 ws0\">replaced <span class=\"ffa\">by “<span class=\"ffb\">GR<span class=\"_ _3\"></span>M” (Game Resource M<span class=\"_ _3\"></span>anager).<span class=\"_ _3\"></span><span class=\"ff3\"> </span></span></span></div><div class=\"t m0 x1 h18 y3ad ff3 fsb fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y3ae wa h23\"><div class=\"t m0 x0 hc y3af ff3 fs0 fc0 sc0 ls1 ws0\">Other m<span class=\"_ _0\"></span>etho<span class=\"_ _0\"></span>des </div><div class=\"t m0 x0 hb y3b0 ff2 fs0 fc0 sc0 ls1 ws0\">GRMa<span class=\"_ _0\"></span>ddSo<span class=\"_ _0\"></span>und </div><div class=\"t m0 x0 h17 y3b1 ff2 fsa fc0 sc0 ls1 ws0\">GRM<span class=\"_ _0\"></span>addS<span class=\"_ _0\"></span>oundO<span class=\"_ _0\"></span>bje<span class=\"_ _0\"></span>ct </div><div class=\"t m0 x0 hb y2de ff2 fs0 fc0 sc0 ls1 ws0\">GRMa<span class=\"_ _0\"></span>ddMu<span class=\"_ _0\"></span>sic </div><div class=\"t m0 x0 hb y3b2 ff2 fs0 fc0 sc0 ls1 ws0\">GRMa<span class=\"_ _0\"></span>ddMu<span class=\"_ _0\"></span>sicOb<span class=\"_ _0\"></span>ject </div><div class=\"t m0 x0 hb y3b3 ff2 fs0 fc0 sc0 ls1 ws0\">GRMs<span class=\"_ _0\"></span>etSo<span class=\"_ _0\"></span>undLo<span class=\"_ _0\"></span>op </div><div class=\"t m0 x0 hb y3b4 ff2 fs0 fc0 sc0 ls1 ws0\">GRMs<span class=\"_ _0\"></span>etMu<span class=\"_ _0\"></span>sicLo<span class=\"_ _0\"></span>op </div><div class=\"t m0 x0 hb y3b5 ff2 fs0 fc0 sc0 ls1 ws0\">GRMg<span class=\"_ _0\"></span>etSo<span class=\"_ _0\"></span>und </div><div class=\"t m0 x0 hb y3b6 ff2 fs0 fc0 sc0 ls1 ws0\">GRMg<span class=\"_ _0\"></span>etMu<span class=\"_ _0\"></span>sic </div><div class=\"t m0 x0 hb y3b7 ff2 fs0 fc0 sc0 ls1 ws0\">GRMp<span class=\"_ _0\"></span>ause<span class=\"_ _0\"></span>Sound<span class=\"_ _0\"></span> </div><div class=\"t m0 x0 hb y3b8 ff2 fs0 fc0 sc0 ls1 ws0\">GRMs<span class=\"_ _0\"></span>topS<span class=\"_ _0\"></span>ound </div><div class=\"t m0 x0 hb y3b9 ff2 fs0 fc0 sc0 ls1 ws0\">GRMp<span class=\"_ _0\"></span>ause<span class=\"_ _0\"></span>Musi<span class=\"_ _0\"></span>c </div><div class=\"t m0 x0 hb y3ba ff2 fs0 fc0 sc0 ls1 ws0\">GRMs<span class=\"_ _0\"></span>topM<span class=\"_ _0\"></span>usic<span class=\"_ _0\"></span> </div><div class=\"t m0 x0 hb y3bb ff2 fs0 fc0 sc0 ls1 ws0\">GRMd<span class=\"_ _0\"></span>ele<span class=\"_ _0\"></span>teSoun<span class=\"_ _0\"></span>d </div><div class=\"t m0 x0 hb y3bc ff2 fs0 fc0 sc0 ls1 ws0\">GRMd<span class=\"_ _0\"></span>ele<span class=\"_ _0\"></span>teMusi<span class=\"_ _0\"></span>c </div></div><div class=\"c x2b y3ae wb h23\"><div class=\"t m0 x0 hc y3af ff3 fs0 fc0 sc0 ls1 ws0\">Main Me<span class=\"_ _0\"></span>thods<span class=\"_ _3\"></span> (a<span class=\"_ _0\"></span>bove) </div><div class=\"t m0 x0 hb y3b0 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>addSo<span class=\"_ _0\"></span>und </div><div class=\"t m0 x0 h17 y3b1 ff2 fsa fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>addS<span class=\"_ _0\"></span>oundO<span class=\"_ _0\"></span>bje<span class=\"_ _0\"></span>ct </div><div class=\"t m0 x0 hb y2de ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>addMu<span class=\"_ _0\"></span>sic </div><div class=\"t m0 x0 hb y3b2 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>addMu<span class=\"_ _0\"></span>sicObj<span class=\"_ _0\"></span>ect </div><div class=\"t m0 x0 hb y3b3 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>setSo<span class=\"_ _0\"></span>undL<span class=\"_ _0\"></span>oop </div><div class=\"t m0 x0 hb y3b4 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>setM<span class=\"_ _0\"></span>usicLo<span class=\"_ _0\"></span>op </div><div class=\"t m0 x0 hb y3b5 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>getSo<span class=\"_ _0\"></span>und </div><div class=\"t m0 x0 hb y3b6 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>getMu<span class=\"_ _0\"></span>sic </div><div class=\"t m0 x0 hb y3b7 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>pauseS<span class=\"_ _0\"></span>ound </div><div class=\"t m0 x0 hb y3b8 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>stop<span class=\"_ _0\"></span>Sound </div><div class=\"t m0 x0 hb y3b9 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>pause<span class=\"_ _0\"></span>Music<span class=\"_ _0\"></span> </div><div class=\"t m0 x0 hb y3ba ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>stop<span class=\"_ _0\"></span>Music </div><div class=\"t m0 x0 hb y3bb ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>delete<span class=\"_ _0\"></span>Sou<span class=\"_ _0\"></span>nd </div><div class=\"t m0 x0 hb y3bc ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>delete<span class=\"_ _0\"></span>Mus<span class=\"_ _0\"></span>ic </div></div><div class=\"c x2e y3bd wc h24\"><div class=\"t m0 x24 h1d y3be ffc fs0 fc3 sc0 ls1 ws0\">Game T<span class=\"_ _0\"></span>extu<span class=\"_ _0\"></span>re<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf24\" class=\"pf w0 h0\" data-page-no=\"24\"><div class=\"pc pc24 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfd1eTz0AAAodSURBVAAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAA+LHqOxwfSZL9bb0Zh+R1uj+vl+/5fd5txyH/aZomVw0AsHBpkYcuM3wAQPzzCJK8wJEAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">37<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y117 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameTexture </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0 ws10\">GameTexture<span class=\"_ _3\"></span></span><span class=\"fc4 ls43\">;</span><span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2e4 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/grap<span class=\"_ _0\"></span>hi<span class=\"_ _0\"></span>c/<span class=\"ff3\">GameTe<span class=\"_ _0\"></span>xtur<span class=\"_ _0\"></span>e<span class=\"ff6 ls46 ws38\">.h<span class=\"fc0 ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y3bf ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c0 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c1 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c2 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y100 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c4 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c6 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c7 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb yf2 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3c9 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3ca ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3cb ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3cc ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y35a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb yf5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3cd ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3ce ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3cf ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d0 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d1 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d2 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d4 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d6 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d7 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3d9 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3da ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3db ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3dc ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3dd ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3de ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3df ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y366 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3e0 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3e1 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3e3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y3e4 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>use fonts <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the game. </div><div class=\"t m0 x1 hb y3e5 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y3e6 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y3e6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y3e6 ff3 fs0 fc4 sc0 ls1 ws0\">Publics elements <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>Game<span class=\"_ _0\"></span>Font<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y3e7 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y3e7 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y3e7 ff3 fs0 fc4 sc0 ls1 ws10\">Game<span class=\"_ _0\"></span>Font<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3e8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3e9 ff2 fs0 fc0 sc0 ls1 ws10\">GameFont(<span class=\"fc9 ws0\">const </span><span class=\"ff3 fc5\">std::string</span><span class=\"ws0\">&amp; <span class=\"_ _0\"></span>fontNa<span class=\"_ _3\"></span>me, <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"ff3 fc5 ws10\">std::strin<span class=\"_ _3\"></span>g</span><span class=\"fc0\">&amp; <span class=\"_ _0\"></span>filePath, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">font<span class=\"_ _0\"></span>Size<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x7 hc y87 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y280 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y3ea ff2 fs0 fc0 sc0 ls1 ws0\">Constructor that allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load a font and give <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"ls1 ws0\"> a nam<span class=\"_ _0\"></span>e.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x1 hb y282 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y283 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y283 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y283 ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dReso<span class=\"_ _0\"></span>urce<span class=\"_ _0\"></span>s<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3eb ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3ec ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">loadResources(<span class=\"fc9 ws0\">const </span><span class=\"ff3 fc5\">std::string</span><span class=\"ws0\">&amp; f<span class=\"_ _0\"></span>ileP<span class=\"_ _0\"></span>ath<span class=\"_ _0\"></span>) </span></span></div></div><div class=\"c x7 y3ed wd h25\"><div class=\"t m0 x0 hc y3ee ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x0 hc y3ef ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y3f0 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>use textures <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the ga<span class=\"_ _0\"></span>me<span class=\"_ _0\"></span>. </div><div class=\"t m0 x0 hb y3f1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y1e6 ff3 fs0 fc4 sc0 ls1 ws0\">Publics elements <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>GameTe<span class=\"_ _0\"></span>xture<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 xe hc y303 ff3 fs0 fc4 sc0 ls1 ws10\">Game<span class=\"_ _0\"></span>Text<span class=\"_ _0\"></span>ure<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x7 y3ed wd h25\"><div class=\"t m0 x0 hb y3f2 ff2 fs0 fc0 sc0 ls1 ws10\">GameTexture(</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2f hc y3f3 ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"ff3 fc5 ws10\">st<span class=\"_ _0\"></span>d::st<span class=\"_ _3\"></span>ring<span class=\"ff2 fc0 ws0\">&amp; <span class=\"_ _0\"></span>textu<span class=\"_ _3\"></span>reName, <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"ff3 fc5 ws10\">std::string</span></span></span></span></div></div><div class=\"c x7 y3ed wd h25\"><div class=\"t m0 x30 hb y3f2 ff2 fs0 fc0 sc0 ls1 ws0\">&amp; <span class=\"_ _0\"></span>fi<span class=\"_ _0\"></span>lePath<span class=\"_ _0\"></span>) </div><div class=\"t m0 x0 hb y3f4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y3f5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y3f6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y3ed wd h25\"><div class=\"t m0 x0 hc y3f7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 h17 y3f8 ff2 fsa fc0 sc0 ls1 ws0\">Constructor that <span class=\"_ _0\"></span>allows <span class=\"ls47 ws39\">to</span> load <span class=\"_ _0\"></span>a texture <span class=\"_ _0\"></span>and give <span class=\"ls48 ws3a\">it</span> a n<span class=\"_ _0\"></span>ame. </div><div class=\"t m0 x0 hb y3f9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y3fa ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dReso<span class=\"_ _0\"></span>urce<span class=\"_ _0\"></span>s<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x7 y3ed wd h25\"><div class=\"t m0 x0 hc y3fb ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y3fc ff2 fs0 fc9 sc0 ls1 ws0\">void </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x25 hc y3fd ff2 fs0 fc0 sc0 ls1 ws10\">loadResources(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">const </span><span class=\"ff3 fc5\">std::string</span><span class=\"ws0\">&amp; <span class=\"_ _0\"></span>fi<span class=\"_ _0\"></span>lePat<span class=\"_ _0\"></span>h) </span></div></div><div class=\"c x7 y3ed wd h25\"><div class=\"t m0 x0 hc y3fe ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc yc6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y3ed wd h25\"><div class=\"t m0 x0 hc y3ff ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y400 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load the te<span class=\"_ _0\"></span>xtur<span class=\"_ _0\"></span>e. </div><div class=\"t m0 x0 hb y401 ff2 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y402 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Text<span class=\"_ _0\"></span>ure </div></div><div class=\"c x7 y3ed wd h25\"><div class=\"t m0 x0 hb y403 ff2 fs0 fc0 sc0 ls1 ws0\">sf::Texture&amp; <span class=\"_ _0\"></span>getTexture() </div><div class=\"t m0 x0 h1a y404 ff3 fsa fca sc0 ls1 ws0\">Source Code</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x31 h1a y405 ff3 fsa fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y3ed wd h25\"><div class=\"t m0 x0 hc y38c ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">texture ob<span class=\"_ _0\"></span>jec<span class=\"_ _0\"></span>t. </span></div></div><div class=\"c x23 y406 we h26\"><div class=\"t m0 x32 h1d y407 ffc fs0 fc3 sc0 ls1 ws0\">Game F<span class=\"_ _0\"></span>on<span class=\"_ _0\"></span>t<span class=\"fc0\"> </span></div><div class=\"t m0 x0 h1d y408 ffc fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y3de ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameFont </div></div><div class=\"c x23 y406 we h26\"><div class=\"t m0 x0 hc y409 ff3 fs0 fc5 sc0 ls1 ws0\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hc y40a ff2 fs0 fc0 sc0 ls1 ws10\">GameFont<span class=\"_ _3\"></span><span class=\"ff3 fc4 ls43\">;</span><span class=\"ff3 ws0\"> </span></div></div><div class=\"c x23 y406 we h26\"><div class=\"t m0 x0 hc y40b ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/grap<span class=\"_ _0\"></span>hi<span class=\"_ _0\"></span>c/<span class=\"ff3\">GameFo<span class=\"_ _0\"></span>nt<span class=\"ff6 ls49 ws3b\">.h<span class=\"fc0 ls1 ws0\"> </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf25\" class=\"pf w0 h0\" data-page-no=\"25\"><div class=\"pc pc25 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdPUtbUQDH4XN6Qyk6dDDQD9Fmc+jQklUQMzgUuukHKIIOjha6VXDpUDcdHB1EiIugCG6ZRArtpjhJCBIwIhJ7OgTEUajx5eR5tmS7f+6QH/clMaUUAAAAyNQLEwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+kwAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOozAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoP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PgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoP4F/7dWjDIBhFYTR3AgIKywoMwQQNYzADquxAUlvPCF2BOf4hkNiKGso57uln7gcAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfACOaqXcAAAFeSURBVAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAICfVV8/vJIk3VLV+5hsj/X9nM/7M7XNPuaaSileDQBwc/lHhi5fOAD7xYC3Zng7lwAAAABJRU5ErkJggg==\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">38<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load the f<span class=\"_ _0\"></span>on<span class=\"_ _0\"></span>t. </div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y207 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Font </div><div class=\"t m0 x7 hb y1e4 ff2 fs0 fc0 sc0 ls1 ws0\">sf::Font&amp; <span class=\"_ _2\"></span>g<span class=\"_ _3\"></span>etFont() </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fca sc0 ls1 ws0\">Source Code </div><div class=\"t m0 x7 hc y20c ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">font <span class=\"_ _0\"></span>object. </span></div><div class=\"t m0 x1 hb y1e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y2e5 ff6 fs0 fc3 sc0 ls4a ws3c\">GRM<span class=\"ls1 ws0\"> (Graphic <span class=\"_ _0\"></span>Resource<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>Manage<span class=\"_ _0\"></span>r)<span class=\"fc0\"> </span></span></div><div class=\"t m0 x1 h27 y40c ff6 fsd fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y40d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y40e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y40f ff2 fs0 fc0 sc0 ls1 ws0\">Parent class <span class=\"_ _0\"></span>that allows a <span class=\"_ _0\"></span>scene <span class=\"ls1b ws11\">to</span> add <span class=\"_ _0\"></span>and use <span class=\"_ _0\"></span>fonts<span class=\"_ _3\"></span> and textures without initializing<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>SF<span class=\"_ _3\"></span>ML o<span class=\"_ _0\"></span>bject<span class=\"_ _0\"></span>s. </div><div class=\"t m0 x1 hb y410 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y411 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y411 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y411 ff3 fs0 fc4 sc0 ls1 ws0\">Publics element <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>G<span class=\"_ _0\"></span>RM<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y412 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y412 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y412 ff3 fs0 fc4 sc0 ls1 ws0\">GRM Containers </div><div class=\"t m0 x7 hc y413 ff3 fs0 fc5 sc0 ls1 ws10\">std::vector<span class=\"ff2 fc0 ls24\">&lt;</span>std::sh<span class=\"_ _3\"></span>ared_ptr<span class=\"ff2 fc0 ws0\">&lt;GameFo<span class=\"_ _3\"></span>nt&gt;&gt; m_GRMfont </span></div><div class=\"t m0 x7 hc y38a ff3 fs0 fc5 sc0 ls1 ws10\">std::vector<span class=\"ff2 fc0 ls24\">&lt;</span>std::sh<span class=\"_ _3\"></span>ared_ptr<span class=\"ff2 fc0 ws0\">&lt;Game<span class=\"_ _3\"></span>Texture&gt;&gt; <span class=\"_ _0\"></span>m_GRMtexture </span></div><div class=\"t m0 x7 hc y414 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y415 ff2 fs0 fc0 sc0 ls1 ws0\">Container which allows <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> store the fonts <span class=\"_ _0\"></span>and textures <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>scene which will <span class=\"_ _0\"></span><span class=\"ls22 ws19\">be<span class=\"ls1 ws0\"> managed <span class=\"ls26 ws1c\">by</span> the <span class=\"_ _0\"></span>GR<span class=\"_ _0\"></span>M. </span></span></span></span></div><div class=\"t m0 x1 hb y37a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y416 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y416 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y416 ff3 fs0 fc4 sc0 ls1 ws10\">GRMa<span class=\"_ _0\"></span>ddFon<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y417 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>GRMaddF<span class=\"_ _3\"></span>ont(<span class=\"fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; nam<span class=\"_ _3\"></span>e, <span class=\"_ _0\"></span><span class=\"fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::s<span class=\"_ _3\"></span>tring<span class=\"ff2 fc0 ws0\">&amp; filePath, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">fo<span class=\"_ _0\"></span>ntSiz<span class=\"_ _0\"></span>e) </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y418 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y419 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y41a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y41b ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> add <span class=\"_ _0\"></span>a font <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> the con<span class=\"_ _0\"></span>taine<span class=\"_ _0\"></span>r. </span></span></div><div class=\"t m0 x1 hb y41c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y322 ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 xe hc y41d ff3 fs0 fc0 sc0 ls1 ws0\">name <span class=\"_ _0\"></span><span class=\"ff2\">font nam<span class=\"_ _0\"></span>e. </span></div><div class=\"t m0 x1 hb y41e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y41f ff3 fs0 fc0 sc0 ls1 ws0\">filePath <span class=\"_ _0\"></span><span class=\"ff2\">font<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>file p<span class=\"_ _0\"></span>ath<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y420 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y421 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y421 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y421 ff3 fs0 fc4 sc0 ls1 ws10\">GRMa<span class=\"_ _0\"></span>ddFon<span class=\"_ _0\"></span>tObje<span class=\"_ _0\"></span>ct<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y422 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GRMaddFont<span class=\"_ _3\"></span>Object(<span class=\"ff3 fc5\">std::shared_p<span class=\"_ _3\"></span>tr</span><span class=\"ws0\">&lt;GameFon<span class=\"_ _3\"></span>t&gt; <span class=\"_ _0\"></span>sound, <span class=\"fc9\">bool </span>showError <span class=\"_ _0\"></span>= <span class=\"ff3 fc5 ws10\">true</span><span class=\"ls32\">) </span></span></span></div><div class=\"t m0 x7 hc y423 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y424 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> add <span class=\"_ _0\"></span><span class=\"ls30 ws25\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ff3\">existing </span>font ob<span class=\"_ _0\"></span>ject (<span class=\"ff3 ws10\">is::G<span class=\"_ _3\"></span>ameFont</span>) <span class=\"ls1b ws11\">to</span> the c<span class=\"_ _0\"></span>onta<span class=\"_ _0\"></span>iner. </span></span></div><div class=\"t m0 x1 hb y425 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y426 ff3 fs0 fc0 sc0 ls1 ws0\">showError <span class=\"ff2\">displays <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>error message <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>case <span class=\"ls1c ws12\">of</span> duplicate <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the font f<span class=\"_ _0\"></span>ile. </span></div><div class=\"t m0 x1 hb y427 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y428 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y428 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y428 ff3 fs0 fc4 sc0 ls1 ws10\">GRMa<span class=\"_ _0\"></span>ddTex<span class=\"_ _0\"></span>ture<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x7 y429 w9 h28\"><div class=\"t m0 x0 hb y42a ff6 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe h1a y42b ff3 fsa fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>GRM </div></div><div class=\"c x7 y429 w9 h28\"><div class=\"t m0 x0 hc y42c ff3 fs0 fc5 sc0 ls1 ws0\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hc y42d ff2 fs0 fc0 sc0 ls1 ws10\">GRM<span class=\"ff3 fc4 ls43\">;</span><span class=\"ff3 ws0\"> </span></div></div><div class=\"c x7 y429 w9 h28\"><div class=\"t m0 x0 hc y42e ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/grap<span class=\"_ _0\"></span>hi<span class=\"_ _0\"></span>c/<span class=\"ff3\">GRM</span><span class=\"ls46 ws38\">.h</span><span class=\"fc0 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf26\" class=\"pf w0 h0\" data-page-no=\"26\"><div class=\"pc pc26 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">39<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">void <span class=\"_ _0\"></span>GRMa<span class=\"_ _3\"></span>ddTexture(<span class=\"fc9\">c<span class=\"_ _3\"></span>onst <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::st<span class=\"_ _3\"></span>ring<span class=\"ff2 fc0 ws0\">&amp; <span class=\"_ _0\"></span>name,<span class=\"_ _3\"></span> <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; file<span class=\"_ _0\"></span>Path<span class=\"_ _0\"></span>) </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b4 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> add <span class=\"_ _0\"></span>a texture <span class=\"ls1b ws11\">to</span> the <span class=\"_ _0\"></span>conta<span class=\"_ _0\"></span>iner<span class=\"_ _0\"></span>. </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fcb sc0 ls1 ws0\">Par<span class=\"_ _0\"></span>ameter<span class=\"_ _0\"></span> <span class=\"_ _3\"></span>:<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20a ff3 fs0 fc0 sc0 ls1 ws0\">name <span class=\"_ _0\"></span><span class=\"ff2\">texture<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>na<span class=\"_ _0\"></span>me.<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20c ff3 fs0 fc0 sc0 ls1 ws0\">filePath <span class=\"_ _0\"></span><span class=\"ff2\">texture<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>file pat<span class=\"_ _0\"></span>h. </span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">GRMa<span class=\"_ _0\"></span>ddTex<span class=\"_ _0\"></span>ture<span class=\"_ _0\"></span>Objec<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y20e ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GRMaddTextu<span class=\"_ _3\"></span>reObject(<span class=\"_ _3\"></span><span class=\"ff3 fc5\">std::shared_ptr</span><span class=\"ws0\">&lt;G<span class=\"_ _3\"></span>ameTexture&gt;<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>sound, <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">showError = <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">true<span class=\"ff2 fc0 ls2b ws0\">) </span></span></span></span></span></span></div><div class=\"t m0 x7 hc y20f ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y210 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>add <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span><span class=\"ff3\">existing <span class=\"ff2\">texture object (</span><span class=\"ws10\">is::GameTexture</span><span class=\"ff2\">) <span class=\"ls1b ws11\">to</span> the <span class=\"_ _0\"></span>cont<span class=\"_ _0\"></span>ainer<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x7 hc y211 ff3 fs0 fc0 sc0 ls1 ws0\">showError <span class=\"ff2\">displays <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>error message <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>case <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> duplicate <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the texture fi<span class=\"_ _0\"></span>le. </span></span></span></div><div class=\"t m0 x1 hb y212 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc ye8 ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd ye8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ye8 ff3 fs0 fc4 sc0 ls1 ws10\">GRMg<span class=\"_ _0\"></span>etFon<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y213 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Font* <span class=\"_ _0\"></span>GRMg<span class=\"_ _3\"></span>etFont(<span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::s<span class=\"_ _3\"></span>tring<span class=\"ff2 fc0 ws0\">&amp; name<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y1f0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y24c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc ybf ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">a <span class=\"_ _0\"></span>font that <span class=\"ls1d ws13\">is</span> <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>the container according <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">its<span class=\"ls1 ws0\"> n<span class=\"_ _0\"></span>ame<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y1f2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f3 ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y1f3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1f3 ff3 fs0 fc4 sc0 ls1 ws10\">GRMg<span class=\"_ _0\"></span>etTe<span class=\"_ _0\"></span>xture<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1f4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y217 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Texture*<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>GRMgetTexture(<span class=\"_ _3\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">&amp; <span class=\"_ _0\"></span>name<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y42f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y248 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y392 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f9 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">a <span class=\"_ _0\"></span>textur<span class=\"_ _3\"></span>e that <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the container according <span class=\"ls1b ws11\">to</span> <span class=\"ls1d ws13\">its</span> nam<span class=\"_ _0\"></span>e. </span></span></span></span></span></div><div class=\"t m2 xc hc y1fa ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y1fa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1fa ff3 fs0 fc4 sc0 ls1 ws10\">GRM<span class=\"_ _0\"></span>delet<span class=\"_ _0\"></span>eFont<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y393 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ya1 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GRMdele<span class=\"_ _3\"></span>teFont(<span class=\"fc9 ws0\">c<span class=\"_ _3\"></span>onst <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; n<span class=\"_ _0\"></span>ame<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 hb y394 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y395 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y396 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>delete font managed <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>GR<span class=\"_ _0\"></span>M. </div><div class=\"t m0 x1 hb y397 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc ya5 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd ya5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ya5 ff3 fs0 fc4 sc0 ls1 ws10\">GRM<span class=\"_ _0\"></span>delet<span class=\"_ _0\"></span>eText<span class=\"_ _0\"></span>ure<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y37f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y398 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GRMdeleteText<span class=\"_ _3\"></span>ure(<span class=\"fc9 ws0\">const </span><span class=\"ff3 fc5\">std::string</span><span class=\"ws0\">&amp; n<span class=\"_ _0\"></span>ame<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x1 hb y399 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y39a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb yba ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>delete<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>textu<span class=\"_ _3\"></span>re managed <span class=\"ls26 ws1c\">by</span> G<span class=\"_ _0\"></span>RM<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y430 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y431 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y432 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb h1d y202 ffc fs0 fc3 sc0 ls1 ws0\">Transition <span class=\"_ _0\"></span>Eff<span class=\"_ _0\"></span>ect<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h29 y433 ffc fsd fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h1d y434 ffc fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y435 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y435 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y435 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>T<span class=\"_ _3\"></span>ransition <span class=\"_ _0\"></span>Effect </div><div class=\"t m0 x7 hc y436 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0 ws10\">TransitionE<span class=\"_ _3\"></span>ffect</span><span class=\"fc4 ls43\">;</span><span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf27\" class=\"pf w0 h0\" data-page-no=\"27\"><div class=\"pc pc27 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9f2n/To0YhCKgig6WwEDCpsWKIIKGMqghqikh8xg8ZRAC7+OXwQSG5twjnv6mb0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAKwiHzYAAATMSURBVED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMAtq28Y1yTJ4920ZU726bO9ntd9LH1X5vymWqtXAwDcXP6RocsXTpe152TdGR2vAAAAAElFTkSuQmCC\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">40<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/grap<span class=\"_ _0\"></span>hi<span class=\"_ _0\"></span>c/<span class=\"ff3\">Transi<span class=\"_ _0\"></span>tion<span class=\"_ _0\"></span>Effect<span class=\"_ _0\"></span><span class=\"ff6 ls49 ws3b\">.h<span class=\"fc0 ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y437 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y438 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y439 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1e3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y208 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1e4 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y43a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y43b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y43c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y43d ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y43e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y43f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y440 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y2e5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y441 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y442 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y443 ff2 fs0 fc0 sc0 ls1 ws0\">Represent the <span class=\"_ _0\"></span>type <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> tr<span class=\"_ _0\"></span>a<span class=\"_ _3\"></span>nsition that will be<span class=\"_ _0\"></span>.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x1 hb y444 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y445 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y445 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y445 ff3 fs0 fc4 sc0 ls1 ws0\">Tra<span class=\"_ _0\"></span>nsitio<span class=\"_ _0\"></span>nEffe<span class=\"_ _0\"></span>ct </div><div class=\"t m0 x7 hc y2c5 ff2 fs0 fc0 sc0 ls1 ws10\">TransitionEffect(<span class=\"ff3 fc5\">is<span class=\"_ _3\"></span>::</span><span class=\"ws0\">GameDispla<span class=\"_ _3\"></span>y <span class=\"_ _0\"></span>*scene) </span></div><div class=\"t m0 x7 hc y446 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2c8 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor which takes <span class=\"_ _0\"></span>as parameter the scene <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>which the <span class=\"_ _0\"></span>transiti<span class=\"_ _3\"></span>on will <span class=\"_ _0\"></span><span class=\"ls22 ws19\">be<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>used. </span></span></span></span></div><div class=\"t m0 x1 hb y447 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y448 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y448 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y448 ff3 fs0 fc4 sc0 ls1 ws10\">st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y2cb ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y449 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">st<span class=\"_ _3\"></span>ep(<span class=\"fc9 ws0\">float const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _0\"></span>_TI<span class=\"_ _0\"></span>ME) </span></span></span></div><div class=\"t m0 x7 hc y44a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y44b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y44c ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>update object <span class=\"_ _0\"></span>(tra<span class=\"_ _0\"></span>nsit<span class=\"_ _0\"></span>ion). </div><div class=\"t m2 xc hc y44d ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y44d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y44d ff3 fs0 fc4 sc0 ls1 ws10\">dr<span class=\"_ _0\"></span>aw<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y2d2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y44e ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">draw(is::Render &amp;ren<span class=\"_ _0\"></span>der<span class=\"_ _0\"></span>); </span></div><div class=\"t m0 x1 hb y44f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y450 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y451 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y452 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>draw object <span class=\"_ _0\"></span>(tran<span class=\"_ _0\"></span>siti<span class=\"_ _0\"></span>on). </div><div class=\"t m2 xc hc y2d6 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y2d6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2d6 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tType<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y453 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y454 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setType(<span class=\"fc9 ws0\">int <span class=\"fc0\">t<span class=\"_ _0\"></span>ype)<span class=\"_ _0\"></span>; </span></span></span></div><div class=\"t m0 x1 hb y455 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y456 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2da ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define transition t<span class=\"_ _0\"></span>ype. </div><div class=\"t m0 x1 hb y457 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y458 ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y458 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y458 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Transi<span class=\"_ _0\"></span>tion<span class=\"_ _0\"></span>End<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y459 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y45a ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _8\"> </span><span class=\"fc0 ws10\">g<span class=\"_ _3\"></span>etTransitionEnd(</span>i<span class=\"_ _3\"></span>nt <span class=\"_ _0\"></span><span class=\"fc0\">type)<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9 ws10\">const<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x7 hc y45b ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y45c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y45d ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> know <span class=\"_ _0\"></span><span class=\"ls1f ws16\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the animation <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>transition<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>fini<span class=\"_ _0\"></span>shed<span class=\"_ _0\"></span>. </span></span></span></span></div></div><div class=\"c x7 y45e wf h2a\"><div class=\"t m0 x0 hc y45f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x0 hc y460 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y461 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>make transition effects <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>typ<span class=\"_ _3\"></span>e Fade <span class=\"_ _0\"></span><span class=\"ls2e ws23\">In<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>and Fade O<span class=\"_ _0\"></span>ut<span class=\"_ _0\"></span>. </span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y1b5 ff3 fs0 fc4 sc0 ls1 ws0\">Publics element <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>Transition Effe<span class=\"_ _0\"></span>ct<span class=\"fc0\"> </span></div><div class=\"t m0 xe hc y325 ff3 fs0 fc4 sc0 ls1 ws0\">Enum <span class=\"_ _0\"></span>Trans<span class=\"_ _0\"></span>ition<span class=\"fc0\"> </span></div></div><div class=\"c x7 y45e wf h2a\"><div class=\"t m0 x0 hc y462 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y463 ff3 fs0 fc5 sc0 ls1 ws0\">enum <span class=\"_ _0\"></span><span class=\"ff2 fc0\">Trans<span class=\"_ _0\"></span>ition<span class=\"_ _0\"></span>; </span></div></div><div class=\"c xc y464 w10 h2b\"><div class=\"t m0 x0 hc y465 ff3 fs0 fc0 sc0 ls1 ws0\">Tra<span class=\"_ _0\"></span>nsitio<span class=\"_ _0\"></span>n </div><div class=\"t m0 x0 hb y466 ff2 fs0 fc0 sc0 ls1 ws0\">FAD<span class=\"_ _0\"></span>E_IN </div><div class=\"t m0 x0 hb y467 ff2 fs0 fc0 sc0 ls1 ws0\">FAD<span class=\"_ _0\"></span>E_OUT </div></div><div class=\"c x33 y464 w11 h2c\"><div class=\"t m0 x0 hb y468 ff2 fs0 fc0 sc0 ls1 ws0\">Represent fade <span class=\"_ _0\"></span>out tran<span class=\"_ _0\"></span>sition<span class=\"_ _0\"></span> </div><div class=\"t m0 x0 hb y469 ff2 fs0 fc0 sc0 ls1 ws0\">Represent fade <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> tr<span class=\"_ _0\"></span>ansit<span class=\"_ _0\"></span>ion </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf28\" class=\"pf w0 h0\" data-page-no=\"28\"><div class=\"pc pc28 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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V+76AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAA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+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAMHh1uoAAAFcSURBVKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAOCX0WfIp4fbpU6SyXY8zGdDVi33j7yr1sf3u2nTRV302SmEuDa02l37+9OlAAD8u/OmtIRvIbaffbxeLWOEqvjj6J0AAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">41<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y117 ff6 fs0 fc3 sc0 ls1 ws10\">Ent<span class=\"_ _0\"></span>itie<span class=\"_ _0\"></span>s<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hb y118 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y119 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y119 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y119 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _0\"></span>MainObject </div><div class=\"t m0 x7 hc y11b ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">MainObject;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y46a ff9 fs0 fc0 sc0 ls1 ws0\">Header: <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isEng<span class=\"_ _0\"></span>ine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/M<span class=\"_ _0\"></span>ainObj<span class=\"_ _0\"></span>ect<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y11d ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y46b ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y46c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y46d ff2 fs0 fc0 sc0 ls1 ws0\">Basic <span class=\"_ _f\"></span>class <span class=\"_ _f\"></span>to <span class=\"_ _f\"></span>create <span class=\"_ _f\"></span>the <span class=\"_ _f\"></span>obj<span class=\"_ _3\"></span>ects <span class=\"_ _9\"></span>(Cha<span class=\"_ _3\"></span>racter, <span class=\"_ _f\"></span>Tiles, <span class=\"_ _f\"></span>Butto<span class=\"_ _3\"></span>n, <span class=\"_ _f\"></span>etc) <span class=\"_ _9\"></span>tha<span class=\"_ _3\"></span>t <span class=\"_ _f\"></span>will <span class=\"_ _f\"></span>be <span class=\"_ _f\"></span>used <span class=\"_ _f\"></span>in <span class=\"_ _e\"> </span>the <span class=\"_ _f\"></span>scenes. <span class=\"_ _f\"></span>It <span class=\"_ _f\"></span>offers <span class=\"_ _f\"></span>you<span class=\"_ _3\"></span> <span class=\"_ _9\"></span>fu<span class=\"_ _3\"></span>nctions </div><div class=\"t m0 x7 hb y46e ff2 fs0 fc0 sc0 ls1 ws0\">which <span class=\"_ _f\"></span>allow <span class=\"_ _f\"> </span>you <span class=\"_ _8\"> </span>to <span class=\"_ _f\"></span>control <span class=\"_ _8\"> </span>an <span class=\"_ _9\"></span>object <span class=\"_ _8\"> </span>(displacements, <span class=\"_ _f\"></span>det<span class=\"_ _3\"></span>ections <span class=\"_ _f\"></span>of <span class=\"_ _f\"></span>collision <span class=\"_ _8\"> </span>between <span class=\"_ _f\"></span>objects, <span class=\"_ _f\"> </span>c<span class=\"_ _3\"></span>alculation <span class=\"_ _f\"> </span>of <span class=\"_ _f\"> </span>d<span class=\"_ _3\"></span>istance,<span class=\"_ _9\"></span> </div><div class=\"t m0 x7 hb y46f ff2 fs0 fc0 sc0 ls1 ws0\">etc) and many oth<span class=\"_ _3\"></span>er things which ar<span class=\"_ _3\"></span>e linked to the game play of<span class=\"_ _3\"></span> the game.<span class=\"_ _b\"></span> </div><div class=\"t m2 xc hc y2e6 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y2e6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2e6 ff3 fs0 fc4 sc0 ls1 ws0\">Publics <span class=\"_ _0\"></span>elemen<span class=\"_ _3\"></span>ts <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>Main<span class=\"_ _0\"></span>Obj<span class=\"ls1c ws12\">et</span><span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y470 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y470 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y470 ff3 fs0 fc4 sc0 ls1 ws10\">Mai<span class=\"_ _0\"></span>nObje<span class=\"_ _0\"></span>ct<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y471 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y471 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y471 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _2\"></span>form<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hb y472 ff2 fs0 fc0 sc0 ls1 ws0\">Mai<span class=\"_ _0\"></span>nObje<span class=\"_ _0\"></span>ct()<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y473 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y474 ff2 fs0 fc0 sc0 ls1 ws0\">Default <span class=\"_ _0\"></span>construct<span class=\"_ _3\"></span>or <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>class<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc h13 y475 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y475 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y475 ff6 fs0 fc0 sc0 ls1 ws0\">Second form </div><div class=\"t m0 x7 hb y476 ff2 fs0 fc0 sc0 ls1 ws10\">MainObject(<span class=\"fc9 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">y) </span></span></span></span></span></div><div class=\"t m0 x7 hc y477 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y478 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor that in<span class=\"_ _0\"></span>itia<span class=\"_ _3\"></span>lizes the <span class=\"_ _0\"></span>object with <span class=\"_ _0\"></span>a starting p<span class=\"_ _0\"></span>oint. </div><div class=\"t m2 xc h13 y479 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y479 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y479 ff6 fs0 fc0 sc0 ls1 ws0\">Third <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y44c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y47a ff2 fs0 fc0 sc0 ls1 ws0\">MainObject(sf::Sprite<span class=\"_ _3\"></span> &amp;spr, <span class=\"_ _0\"></span><span class=\"fc9\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">x = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0.f<span class=\"fc0 ws0\">, <span class=\"fc9\">float </span>y <span class=\"_ _0\"></span>=<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fcc ws10\">0.<span class=\"_ _0\"></span>f<span class=\"fc0 ws0\">) </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y47b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y47c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y47d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y47e ff2 fs0 fc0 sc0 ls1 ws0\">Constructor that <span class=\"_ _0\"></span>initializes the object <span class=\"_ _0\"></span>with a <span class=\"_ _3\"></span>Sprite and <span class=\"_ _0\"></span>a starting poi<span class=\"_ _0\"></span>nt. </div><div class=\"t m2 xc h13 y47f ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y47f ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y47f ff6 fs0 fc0 sc0 ls1 ws0\">Forth <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y480 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y481 ff2 fs0 fc0 sc0 ls1 ws0\">MainObject(sf::Textur<span class=\"_ _3\"></span>e &amp;tex, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls29\">x, <span class=\"_ _3\"></span></span>float <span class=\"fc0\">y , </span>b<span class=\"_ _0\"></span>ool <span class=\"fc0\">center = <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">fal<span class=\"_ _0\"></span>se<span class=\"ff2 fc0 ws0\">) </span></span></span></span></div><div class=\"t m0 x1 hb y482 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y483 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y484 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y485 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor that <span class=\"_ _0\"></span>initializes the object <span class=\"_ _0\"></span>with a Textur<span class=\"_ _3\"></span>e, <span class=\"_ _0\"></span>sta<span class=\"_ _3\"></span>rting point and <span class=\"_ _0\"></span>center Spr<span class=\"_ _0\"></span>ite<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y486 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y486 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y486 ff3 fs0 fc4 sc0 ls1 ws0\">in<span class=\"_ _0\"></span>stance<span class=\"_ _0\"></span>Numbe<span class=\"_ _0\"></span>r </div><div class=\"t m0 x7 hc y487 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">int <span class=\"fc0\">insta<span class=\"_ _3\"></span>nceNumber; </span></span></div><div class=\"t m0 x7 hc y488 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y489 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the n<span class=\"_ _0\"></span>um<span class=\"_ _3\"></span>ber <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>instanc<span class=\"_ _3\"></span>es <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the clas<span class=\"_ _0\"></span>s. </span></div><div class=\"t m2 xc hc y48a ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y48a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y48a ff3 fs0 fc4 sc0 ls1 ws0\">m_S<span class=\"_ _0\"></span>DMcal<span class=\"_ _0\"></span>lStep<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y48b ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">m_SDMcal<span class=\"_ _3\"></span>lStep </span></div><div class=\"t m0 x7 hc y48c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf29\" class=\"pf w0 h0\" data-page-no=\"29\"><div class=\"pc pc29 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff2 fs0 fc0 sc0 ls1 ws0\">Lets know <span class=\"_ _0\"></span><span class=\"ls1d ws13\">if<span class=\"ls1 ws0\"> SDM <span class=\"_ _0\"></span>can use the <span class=\"_ _0\"></span>object&apos;s <span class=\"ff3\">s<span class=\"_ _3\"></span>tep() </span>(updat<span class=\"_ _3\"></span>e) me<span class=\"_ _0\"></span>thod. </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y1e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e2 ff3 fs0 fc4 sc0 ls1 ws0\">m_S<span class=\"_ _0\"></span>DMcal<span class=\"_ _0\"></span>lDraw<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y48d ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">m_SDMcal<span class=\"_ _3\"></span>lDraw </span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y43b ff2 fs0 fc0 sc0 ls1 ws0\">Lets know <span class=\"_ _0\"></span><span class=\"ls1f ws16\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>SDM<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>can use the <span class=\"_ _0\"></span>object&apos;s<span class=\"_ _3\"></span> <span class=\"ff3\">draw()<span class=\"_ _3\"></span> </span>meth<span class=\"_ _0\"></span>od. </span></span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y2b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2b5 ff3 fs0 fc4 sc0 ls1 ws0\">m_S<span class=\"_ _0\"></span>DMcal<span class=\"_ _0\"></span>lEvent<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y292 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">m_SDMcal<span class=\"_ _3\"></span>lEvent </span></div><div class=\"t m0 x7 hc y2e5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y294 ff2 fs0 fc0 sc0 ls1 ws0\">Lets know <span class=\"_ _0\"></span><span class=\"ls1f ws16\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the SDM can <span class=\"_ _0\"></span>use<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the object&apos;s <span class=\"ff3\">even<span class=\"_ _3\"></span>t() </span>metho<span class=\"_ _0\"></span>d. </span></span></div><div class=\"t m0 x1 hb y48e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y210 ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y210 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y210 ff3 fs0 fc4 sc0 ls1 ws10\">st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y1ec ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">step(</span>float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>const <span class=\"fc0\">&amp;DE<span class=\"_ _0\"></span>LTA_T<span class=\"_ _0\"></span>IME) </span></span></div><div class=\"t m0 x1 hb y1ed ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y228 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1ee ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ef ff2 fs0 fc0 sc0 ls1 ws0\">Allow <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>updat<span class=\"_ _3\"></span>e the object. <span class=\"ff6 ls1e ws14\">To<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ls4b ws3d\">be<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> overridden <span class=\"ls3c ws2f\">in</span> a child <span class=\"ls4c ws3e\">of</span> <span class=\"_ _0\"></span>Mai<span class=\"_ _0\"></span>nObje<span class=\"_ _0\"></span>ct! </span></span></span></span></div><div class=\"t m0 x1 hb y48f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f1 ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y1f1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1f1 ff3 fs0 fc4 sc0 ls1 ws10\">ev<span class=\"_ _0\"></span>ent<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc yec ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0\">event(sf::Event &amp;<span class=\"_ _0\"></span>ev<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x1 hb y215 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y216 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc yc1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y22c ff2 fs0 fc0 sc0 ls1 ws0\">Allow <span class=\"ls1b ws11\">to</span> implement the event part of the object. <span class=\"ff6 ls37 ws2b\">To</span><span class=\"ff6\"> <span class=\"ls4d ws3f\">be</span> overloaded <span class=\"ls3c ws2f\">in</span> a <span class=\"_ _0\"></span>chil<span class=\"_ _3\"></span>d class of MainObject <span class=\"ls3c ws2f\">if</span> the <span class=\"_ _0\"></span>variable </span></div><div class=\"t m0 x7 hb y490 ff6 fs0 fc0 sc0 ls1 ws0\">&quot;m_SDMcallEvent&quot; is <span class=\"_ _3\"></span>true! </div><div class=\"t m2 xc hc yce ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd yce ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc yce ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tXStar<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y491 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setXStart(</span>float <span class=\"fc0 ls4e ws40\">x)</span><span class=\"fc0\"> </span></span></div><div class=\"t m0 x1 hb y29f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y492 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y493 ff2 fs0 fc0 sc0 ls1 ws0\">Defines <span class=\"_ _0\"></span>the starting position <span class=\"ls4f ws41\">x.</span> </div><div class=\"t m0 x1 hb y494 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y495 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y495 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y495 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tYStar<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y496 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setYStart(</span>float <span class=\"fc0 ls50 ws42\">y)</span><span class=\"fc0\"> </span></span></div><div class=\"t m0 x1 hb y497 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y498 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y499 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y263 ff2 fs0 fc0 sc0 ls1 ws0\">Defines <span class=\"_ _0\"></span>the starting position <span class=\"ls28 ws1f\">y.</span> </div><div class=\"t m0 x1 hb y49a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y49b ff3 fs0 fc4 sc0 ls1 ws10\">2.10</div><div class=\"t m3 x21 hd y49b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y49b ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tXPrev<span class=\"_ _0\"></span>ious </div><div class=\"t m0 x7 hc y49c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etXPrevious(<span class=\"fc9 ws0\">fl<span class=\"_ _3\"></span>oat <span class=\"_ _0\"></span><span class=\"fc0\">x) </span></span></span></span></div><div class=\"t m0 x7 hc y49d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y11 ff2 fs0 fc0 sc0 ls1 ws0\">Defines <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>previous position <span class=\"ls4f ws41\">x.</span> </div><div class=\"t m0 x1 hb y49e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y49f ff3 fs0 fc4 sc0 ls1 ws10\">2.11</div><div class=\"t m3 x21 hd y49f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y49f ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tYPrev<span class=\"_ _0\"></span>ious </div><div class=\"t m0 x7 hc y4a0 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etYPrevious(<span class=\"fc9 ws0\">fl<span class=\"_ _3\"></span>oat <span class=\"_ _0\"></span><span class=\"fc0 ls51 ws43\">y)<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x22 h9 y4a1 ff4 fs4 fc0 sc0 ls19 wsf\">42<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2a\" class=\"pf w0 h0\" data-page-no=\"2a\"><div class=\"pc pc2a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Defines <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>previous position <span class=\"ls28 ws1f\">y.</span> </div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">2.12</div><div class=\"t m3 x21 hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tStart<span class=\"_ _0\"></span>Posi<span class=\"_ _0\"></span>tion<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setStartPositio<span class=\"_ _3\"></span>n(<span class=\"fc9 ws0\">fl<span class=\"_ _3\"></span>oat <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"ls1 ws0\"> <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0 ls28 ws1f\">y)<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2b5 ff2 fs0 fc0 sc0 ls1 ws0\">Sets the <span class=\"_ _0\"></span>x and y <span class=\"_ _0\"></span>start<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>positi<span class=\"_ _0\"></span>on. </div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">2.13</div><div class=\"t m3 x21 hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20d ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tX<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y4a2 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etX(<span class=\"fc9 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">x) </span></span></span></span></div><div class=\"t m0 x7 hc y1ea ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y210 ff2 fs0 fc0 sc0 ls1 ws0\">Define <span class=\"_ _0\"></span>position <span class=\"ls4f ws41\">x.</span> </div><div class=\"t m2 xc hc y211 ff3 fs0 fc4 sc0 ls1 ws10\">2.14</div><div class=\"t m3 x21 hd y211 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y211 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tY<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc ye8 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etY(<span class=\"fc9 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">y) </span></span></span></span></div><div class=\"t m0 x7 hc y213 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4a3 ff2 fs0 fc0 sc0 ls1 ws0\">Define <span class=\"_ _0\"></span>position <span class=\"ls28 ws1f\">y.</span> </div><div class=\"t m2 xc hc yec ff3 fs0 fc4 sc0 ls1 ws10\">2.15</div><div class=\"t m3 x21 hd yec ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc yec ff3 fs0 fc4 sc0 ls1 ws0\">mo<span class=\"_ _0\"></span>ve<span class=\"_ _0\"></span>X </div><div class=\"t m0 x7 hc y1f3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">m<span class=\"_ _3\"></span>oveX(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">x) </span></span></span></span></div><div class=\"t m0 x7 hc y217 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4a4 ff2 fs0 fc0 sc0 ls1 ws0\">Moves the <span class=\"_ _0\"></span>object<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1f ws16\">on<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>x-axi<span class=\"_ _0\"></span>s. </span></span></div><div class=\"t m0 x1 hb y4a5 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2ea ff3 fs0 fc4 sc0 ls1 ws10\">2.16</div><div class=\"t m3 x21 hd y2ea ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2ea ff3 fs0 fc4 sc0 ls1 ws0\">mo<span class=\"_ _0\"></span>ve<span class=\"_ _0\"></span>Y </div><div class=\"t m0 x7 hc y4a6 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">m<span class=\"_ _3\"></span>oveY(<span class=\"fc9 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">y) </span></span></span></span></div><div class=\"t m0 x7 hc y30 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1fc ff2 fs0 fc0 sc0 ls1 ws0\">Moves the <span class=\"_ _0\"></span>object<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1f ws16\">on<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>y-axis. </span></span></div><div class=\"t m2 xc hc y21a ff3 fs0 fc4 sc0 ls1 ws10\">2.17</div><div class=\"t m3 x21 hd y21a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y21a ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tPosit<span class=\"_ _0\"></span>ion<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y21b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y21c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setPosition(</span>floa<span class=\"_ _3\"></span>t <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls28 ws1f\">y)</span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y4a7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y21d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y237 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y238 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>x and y po<span class=\"_ _0\"></span>siti<span class=\"_ _0\"></span>on. </div><div class=\"t m2 xc hc y4a8 ff3 fs0 fc4 sc0 ls1 ws10\">2.18</div><div class=\"t m3 x21 hd y4a8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4a8 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tSprit<span class=\"_ _0\"></span>eSca<span class=\"_ _0\"></span>le<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y220 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y201 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setSprit<span class=\"_ _3\"></span>eScale(<span class=\"fc9 ws0\">floa<span class=\"_ _3\"></span>t </span><span class=\"ls29 ws20\">x,</span><span class=\"ws0\"> <span class=\"_ _2\"></span><span class=\"fc9\">fl<span class=\"_ _3\"></span>oat <span class=\"fc0 ls28 ws1f\">y)</span><span class=\"fc0\"> </span></span></span></span></span></div><div class=\"t m0 x1 hb y432 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y202 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y23d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y23e ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>x and y scale <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the object sprite. </div><div class=\"t m2 xc hc y4a9 ff3 fs0 fc4 sc0 ls1 ws10\">2.19</div><div class=\"t m3 x21 hd y4a9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4a9 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tSpee<span class=\"_ _0\"></span>d<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y204 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4aa ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setSpeed(</span>float <span class=\"fc0\">val<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x22 h9 y4a1 ff4 fs4 fc0 sc0 ls19 wsf\">43<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2b\" class=\"pf w0 h0\" data-page-no=\"2b\"><div class=\"pc pc2b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>speed <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>objec<span class=\"_ _0\"></span>t. </div><div class=\"t m2 xc hc y1e3 ff3 fs0 fc4 sc0 ls1 ws10\">2.20</div><div class=\"t m3 x21 hd y1e3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e3 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tHsp </div><div class=\"t m0 x7 hc y1e4 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etHsp(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">va<span class=\"_ _3\"></span>l) </span></span></span></span></div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4ab ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>horizontal sp<span class=\"_ _0\"></span>eed. </div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">2.21</div><div class=\"t m3 x21 hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20d ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tVsp </div><div class=\"t m0 x7 hc y4ac ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etVsp(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">val<span class=\"_ _3\"></span>) </span></span></span></span></div><div class=\"t m0 x7 hc y294 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1eb ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>vertica<span class=\"_ _3\"></span>l <span class=\"_ _0\"></span>speed<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1ec ff3 fs0 fc4 sc0 ls1 ws10\">2.22</div><div class=\"t m3 x21 hd y1ec ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1ec ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tAngu<span class=\"_ _0\"></span>larMov<span class=\"_ _0\"></span>e<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1ed ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y228 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setAngularMov<span class=\"_ _3\"></span>e(</span>float con<span class=\"_ _0\"></span>st<span class=\"_ _3\"></span> <span class=\"fc0\">&amp;DELTA_TIME, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">speed,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">angle<span class=\"_ _0\"></span>) </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1ee ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ef ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y48f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f1 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> move <span class=\"_ _0\"></span>the object according <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>angle and a <span class=\"_ _0\"></span>speed<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m2 xc hc ybf ff3 fs0 fc4 sc0 ls1 ws10\">2.23</div><div class=\"t m3 x21 hd ybf ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc ybf ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tFrame<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y1f3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etFrame(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y217 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4ad ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>frame <span class=\"ls1c ws12\">of</span> the o<span class=\"_ _0\"></span>bje<span class=\"_ _0\"></span>ct. </div><div class=\"t m0 x1 hb y4a5 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y218 ff3 fs0 fc4 sc0 ls1 ws10\">2.24</div><div class=\"t m3 x21 hd y218 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y218 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tFrame<span class=\"_ _0\"></span>Start </div><div class=\"t m0 x7 hc y1fa ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etFrameStart(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y30 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1fc ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>frame start <span class=\"ls1c ws12\">of</span> the ob<span class=\"_ _0\"></span>jec<span class=\"_ _0\"></span>t. </div><div class=\"t m2 xc hc y21a ff3 fs0 fc4 sc0 ls1 ws10\">2.25</div><div class=\"t m3 x21 hd y21a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y21a ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tFrame<span class=\"_ _0\"></span>End </div><div class=\"t m0 x7 hc y21c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etFrameEnd(<span class=\"fc9 ws0\">fl<span class=\"_ _3\"></span>oat <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y21d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y21e ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>frame end <span class=\"ls1c ws12\">of</span> the ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y21f ff3 fs0 fc4 sc0 ls1 ws10\">2.26</div><div class=\"t m3 x21 hd y21f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y21f ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tImage<span class=\"_ _0\"></span>Xsca<span class=\"_ _0\"></span>le </div><div class=\"t m0 x7 hc y23a ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etImageXscale(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y23c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb yfc ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>x scale <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m2 xc hc y222 ff3 fs0 fc4 sc0 ls1 ws10\">2.27</div><div class=\"t m3 x21 hd y222 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y222 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tImage<span class=\"_ _0\"></span>Yscal<span class=\"_ _0\"></span>e<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y223 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y224 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setImageYscale(</span>floa<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span><span class=\"fc0\">va<span class=\"_ _0\"></span>l) </span></span></div><div class=\"t m0 x22 h9 y225 ff4 fs4 fc0 sc0 ls19 wsf\">44<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2c\" class=\"pf w0 h0\" data-page-no=\"2c\"><div class=\"pc pc2c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1e2 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>y scale <span class=\"ls1c ws12\">of</span> the ob<span class=\"_ _0\"></span>ject. </div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">2.28</div><div class=\"t m3 x21 hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tImage<span class=\"_ _0\"></span>Scale<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e4 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setImageScale(</span>f<span class=\"_ _3\"></span>loat <span class=\"fc0\">val, <span class=\"_ _0\"></span><span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">updateXYscale = <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">false<span class=\"ff2 fc0 ls32 ws0\">) </span></span></span></span></span></span></div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4ab ff2 fs0 fc0 sc0 ls1 ws0\">Allow <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>s<span class=\"_ _3\"></span>et the <span class=\"_ _0\"></span>scal<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>variab<span class=\"_ _0\"></span>le. </div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fc0 sc0 ls1 ws10\">updateXYscale<span class=\"ff2 ws0\">:<span class=\"_ _3\"></span> Allow <span class=\"ls1b ws11\">to</span> set <span class=\"_ _0\"></span>the x and <span class=\"_ _0\"></span>y scale variable <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>object with the <span class=\"_ _0\"></span>same va<span class=\"_ _0\"></span>lue. </span></div><div class=\"t m2 xc hc y20e ff3 fs0 fc4 sc0 ls1 ws10\">2.29</div><div class=\"t m3 x21 hd y20e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20e ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tImage<span class=\"_ _0\"></span>ScaleX<span class=\"_ _0\"></span>_Y </div><div class=\"t m0 x7 hc y20f ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setImag<span class=\"_ _3\"></span>eScale(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">y) </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y242 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1ec ff2 fs0 fc0 sc0 ls1 ws0\">Set the x <span class=\"_ _0\"></span>and y scale <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m0 x1 hb y1ed ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y228 ff3 fs0 fc4 sc0 ls1 ws10\">2.30</div><div class=\"t m3 x21 hd y228 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y228 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tImage<span class=\"_ _0\"></span>Angl<span class=\"_ _0\"></span>e </div><div class=\"t m0 x7 hc y213 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etImageAngl<span class=\"_ _3\"></span>e(<span class=\"fc9 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y4a3 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y229 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>angle<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y215 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">2.31</div><div class=\"t m3 x21 hd y216 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y216 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tXOff<span class=\"_ _0\"></span>set </div><div class=\"t m0 x7 hc y1f5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etXOffset(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y4ad ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4a5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y24d ff2 fs0 fc0 sc0 ls1 ws0\">Define the <span class=\"_ _0\"></span>x offset <span class=\"ls1c ws12\">of</span> the ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y4ae ff3 fs0 fc4 sc0 ls1 ws10\">2.32</div><div class=\"t m3 x21 hd y4ae ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4ae ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tYOffse<span class=\"_ _0\"></span>t </div><div class=\"t m0 x7 hc y30 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etYOffset(<span class=\"fc9 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">val<span class=\"_ _3\"></span>) </span></span></span></span></div><div class=\"t m0 x7 hc y2eb ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y232 ff2 fs0 fc0 sc0 ls1 ws0\">Define the <span class=\"_ _0\"></span>y offset <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m0 x1 hb y233 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y234 ff3 fs0 fc4 sc0 ls1 ws10\">2.33</div><div class=\"t m3 x21 hd y234 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y234 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tXYOff<span class=\"_ _0\"></span>set<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y235 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y236 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setXYOffset(<span class=\"_ _3\"></span></span>float <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls28 ws1f\">y)</span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y237 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y238 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y21f ff2 fs0 fc0 sc0 ls1 ws0\">Defines the off<span class=\"_ _0\"></span>s<span class=\"_ _3\"></span>et x <span class=\"_ _0\"></span>and y<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject. </span></span></div><div class=\"t m0 x1 hb y239 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y23a ff3 fs0 fc4 sc0 ls1 ws10\">2.34</div><div class=\"t m3 x21 hd y23a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y23a ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tXYOff<span class=\"_ _0\"></span>set </div><div class=\"t m0 x7 hc y23c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"fc0\">setXY<span class=\"_ _3\"></span>Offset() </span></span></div><div class=\"t m0 x7 hc y23e ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y222 ff2 fs0 fc0 sc0 ls1 ws0\">Define the <span class=\"_ _0\"></span>x and y <span class=\"_ _0\"></span>offset <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e ob<span class=\"_ _0\"></span>ject based<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">on<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the center <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>object spri<span class=\"_ _0\"></span>te. </span></span></div><div class=\"t m0 x1 hb y223 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y224 ff3 fs0 fc4 sc0 ls1 ws10\">2.35</div><div class=\"t m3 x21 hd y224 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y224 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tTime<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y225 ff4 fs4 fc0 sc0 ls19 wsf\">45<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2d\" class=\"pf w0 h0\" data-page-no=\"2d\"><div class=\"pc pc2d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hb y117 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setTime(<span class=\"fc9 ws0\">float </span><span class=\"ls4f ws41\">x)</span><span class=\"ws0\"> </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y207 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>value <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>object&apos;s <span class=\"_ _3\"></span><span class=\"ff3\">m_time </span>va<span class=\"_ _0\"></span>riable<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e4 ff3 fs0 fc4 sc0 ls1 ws10\">2.36</div><div class=\"t m3 x21 hd y1e4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e4 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tImage<span class=\"_ _0\"></span>Alpha<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etImageAlpha(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y226 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>alpha image <span class=\"ls1c ws12\">of</span> the obj<span class=\"_ _0\"></span>ect. </div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.37</div><div class=\"t m3 x21 hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e9 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tImage<span class=\"_ _0\"></span>Inde<span class=\"_ _0\"></span>x </div><div class=\"t m0 x7 hc y1ea ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etImageIndex(<span class=\"fc9 ws0\">i<span class=\"_ _3\"></span>nt <span class=\"_ _2\"></span><span class=\"fc0\">va<span class=\"_ _3\"></span>l) </span></span></span></span></div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4af ff2 fs0 fc0 sc0 ls1 ws0\">Define the <span class=\"_ _0\"></span>sub image <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m2 xc hc y228 ff3 fs0 fc4 sc0 ls1 ws10\">2.38</div><div class=\"t m3 x21 hd y228 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y228 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tMaskW<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1ee ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ef ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setMaskW(<span class=\"fc9 ws0\">u<span class=\"_ _3\"></span>nsigned<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>int <span class=\"fc0\">v<span class=\"_ _0\"></span>al<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y48f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y28 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>width <span class=\"ls1c ws12\">of</span> the object&apos;s collision m<span class=\"_ _0\"></span>as<span class=\"_ _0\"></span>k. </div><div class=\"t m2 xc hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">2.39</div><div class=\"t m3 x21 hd y216 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tMaskH<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc yc1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setMaskH(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">unsigned int <span class=\"_ _0\"></span><span class=\"fc0\">va<span class=\"_ _0\"></span>l)<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x1 hb y1f6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f7 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2ea ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>height <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the object&apos;s collision m<span class=\"_ _0\"></span>as<span class=\"_ _0\"></span>k. </div><div class=\"t m2 xc hc y219 ff3 fs0 fc4 sc0 ls1 ws10\">2.40</div><div class=\"t m3 x21 hd y219 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y219 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tRecta<span class=\"_ _0\"></span>ngleM<span class=\"_ _0\"></span>ask<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y4b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc yee ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setRectangleMa<span class=\"_ _3\"></span>sk(</span>int <span class=\"fc0\">width, <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0\">h<span class=\"_ _0\"></span>eight<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y4b2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y249 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1fd ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>width and height <span class=\"_ _0\"></span><span class=\"ls1f ws16\">of<span class=\"ls1 ws0\"> the rectangle <span class=\"_ _0\"></span>coll<span class=\"_ _3\"></span>ision mask and use <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>default<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>mask. </span></span></span></span></div><div class=\"t m0 x1 hb y4b3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y93 ff3 fs0 fc4 sc0 ls1 ws10\">2.41</div><div class=\"t m3 x21 hd y93 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y93 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tCircl<span class=\"_ _0\"></span>eMas<span class=\"_ _0\"></span>k<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y4b4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1fe ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setCircleMask(</span>floa<span class=\"_ _3\"></span>t <span class=\"fc0\">r<span class=\"_ _0\"></span>adu<span class=\"_ _0\"></span>is) </span></span></div><div class=\"t m0 x1 hb y95 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ff ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y38 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>radius <span class=\"ls1c ws12\">of</span> the circle <span class=\"_ _0\"></span>col<span class=\"_ _3\"></span>lision mask and use <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>default mask.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m2 xc hc y431 ff3 fs0 fc4 sc0 ls1 ws10\">2.42</div><div class=\"t m3 x21 hd y431 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y431 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tIsAc<span class=\"_ _0\"></span>tive </div><div class=\"t m0 x7 hc y39e ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etIsActive(<span class=\"fc9 ws0\">bool<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x7 hc ya9 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4b6 ff2 fs0 fc0 sc0 ls1 ws0\">Defines the <span class=\"_ _0\"></span>activity<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>state<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject. </span></span></div><div class=\"t m2 xc hc y4aa ff3 fs0 fc4 sc0 ls1 ws10\">2.43</div><div class=\"t m3 x21 hd y4aa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4aa ff3 fs0 fc4 sc0 ls1 ws10\">upda<span class=\"_ _0\"></span>teCo<span class=\"_ _0\"></span>llisio<span class=\"_ _0\"></span>nMas<span class=\"_ _0\"></span>k<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y4b7 ff4 fs4 fc0 sc0 ls19 wsf\">46<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2e\" class=\"pf w0 h0\" data-page-no=\"2e\"><div class=\"pc pc2e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAA3M8wQUtVZYS3dV23bbMDAAA3rYMkVgAAAOjKhycAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAMA1hglaqiojfMs0Ted52gEAgH+tgyRWAAAA6MqHJwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAADg1X4d0gAIBVAU3UvAQGGpQAgSMGKQAQUd2LB4IlDhJ0KS4W/nuGefu6g+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6m2xQ1kAAACLSURBVAMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAFRdfeN0JUmGo2nLkjzzee/bv9+178qSuAwAAKAiH6MUMu2QAIPGAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y4b8 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4b8 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4b8 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>form :<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y4b9 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4ba ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">update<span class=\"_ _0\"></span>Col<span class=\"_ _0\"></span>lisionM<span class=\"_ _0\"></span>ask() </span></span></div><div class=\"t m0 x7 hc y4bb ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4bc ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4bd ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>information (size, position, etc) <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>collision mask.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x1 hb y4be ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y4bf ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4bf ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4bf ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>form: </div><div class=\"t m0 x1 hb y4c0 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4c1 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">updateCollisionM<span class=\"_ _3\"></span>ask(<span class=\"_ _3\"></span></span>int <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">int<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ls28 ws1f\">y)<span class=\"ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 hc y4c2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4c3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4c4 ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>position<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the collision mask according <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>a <span class=\"_ _3\"></span>point x <span class=\"_ _0\"></span>and y <span class=\"_ _0\"></span>diff<span class=\"_ _3\"></span>erent from <span class=\"_ _0\"></span>that<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the obje<span class=\"_ _0\"></span>ct. </span></span></div><div class=\"t m0 x1 hb y4c5 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4c6 ff3 fs0 fc4 sc0 ls1 ws10\">2.44</div><div class=\"t m3 x21 hd y4c6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4c6 ff3 fs0 fc4 sc0 ls1 ws0\">cent<span class=\"_ _0\"></span>erCo<span class=\"_ _0\"></span>llis<span class=\"_ _0\"></span>ionMask<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y4c7 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">centerCol<span class=\"_ _3\"></span>lisionMask<span class=\"_ _3\"></span>(<span class=\"fc9 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">y) </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y4c8 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4c9 ff2 fs0 fc0 sc0 ls1 ws0\">Center the <span class=\"_ _0\"></span>position <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>col<span class=\"_ _3\"></span>lision mask according <span class=\"ls1e ws14\">to</span> <span class=\"_ _0\"></span>a point x <span class=\"_ _0\"></span>and <span class=\"ls28 ws1f\">y.</span> </div><div class=\"t m0 x1 hb y4ca ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4cb ff3 fs0 fc4 sc0 ls1 ws10\">2.45</div><div class=\"t m3 x21 hd y4cb ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4cb ff3 fs0 fc4 sc0 ls1 ws10\">upda<span class=\"_ _0\"></span>teSp<span class=\"_ _0\"></span>rite<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y2c7 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y2c7 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y2c7 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y4cc ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2c9 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">update<span class=\"_ _0\"></span>Spri<span class=\"_ _0\"></span>te() </span></span></div><div class=\"t m0 x7 hc y4cd ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4ce ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4cf ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>sprit<span class=\"_ _3\"></span>e <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the object with <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e values <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>variables<span class=\"_ _3\"></span> (alpha, scale, etc.) which are <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the ob<span class=\"_ _0\"></span>ject. </span></span></div><div class=\"t m0 x1 hb y4d0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y44b ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y44b ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y44b ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y4d1 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4d2 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">updateS<span class=\"_ _3\"></span>prite(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"_ _3\"></span><span class=\"fc0 ls51 ws43\">y,</span><span class=\"fc0\"> </span>float <span class=\"_ _0\"></span><span class=\"fc0\">angle<span class=\"_ _3\"></span> = <span class=\"_ _0\"></span><span class=\"fcc ls24 ws1d\">0.f<span class=\"fc0 ls1 ws0\">, <span class=\"fc9\">int </span>alpha <span class=\"_ _0\"></span>= <span class=\"fcc ls24\">255</span>, <span class=\"fc9\">float </span>xScale = <span class=\"fcc ls24 ws1d\">1.f<span class=\"_ _0\"></span><span class=\"fc0 ls1 ws0\">,<span class=\"_ _3\"></span> <span class=\"fc9\">float </span>yScale = <span class=\"fcc ws10\">1.<span class=\"_ _0\"></span>f<span class=\"fc0 ws0\">) </span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y2d2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4d3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4d4 ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>sprite <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject with external value<span class=\"_ _0\"></span>s. </span></span></div><div class=\"t m0 x1 hb y450 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y451 ff3 fs0 fc4 sc0 ls1 ws10\">2.46</div><div class=\"t m3 x21 hd y451 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y451 ff3 fs0 fc4 sc0 ls1 ws10\">dr<span class=\"_ _0\"></span>aw<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y4d5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4d6 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0\">draw(is::Render <span class=\"_ _0\"></span>&amp;surfa<span class=\"_ _0\"></span>ce) </span></span></div><div class=\"t m0 x7 hc y453 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4d7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4d8 ff2 fs0 fc0 sc0 ls1 ws0\">Displays the <span class=\"_ _0\"></span>obj<span class=\"_ _0\"></span>ect. </div><div class=\"t m0 x1 hb y4d9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4da ff3 fs0 fc4 sc0 ls1 ws10\">2.47</div><div class=\"t m3 x21 hd y4da ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4da ff3 fs0 fc4 sc0 ls1 ws10\">dra<span class=\"_ _0\"></span>wMask<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y4db ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4dc ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">drawMa<span class=\"_ _3\"></span>sk(is::Render &amp;surface, <span class=\"_ _0\"></span>sf::Colo<span class=\"_ _3\"></span>r <span class=\"_ _0\"></span>color<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= s<span class=\"_ _0\"></span>f::<span class=\"_ _0\"></span>Color:<span class=\"_ _0\"></span>:Blue<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x7 hc y459 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4dd ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4de ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>display the <span class=\"_ _0\"></span>collisio<span class=\"_ _3\"></span>n mask that has <span class=\"_ _0\"></span>been defined (Rectangle <span class=\"_ _0\"></span><span class=\"ls1f ws16\">or<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>Circl<span class=\"_ _3\"></span>e) for the <span class=\"_ _0\"></span>object<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y4df ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y45c ff3 fs0 fc4 sc0 ls1 ws10\">2.48</div><div class=\"t m3 x21 hd y45c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y45c ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Mask<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y4e0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4e1 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">Rectangle<span class=\"_ _3\"></span>&amp; <span class=\"_ _0\"></span>g<span class=\"_ _3\"></span>etMask()<span class=\"_ _3\"></span> <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">noe<span class=\"_ _0\"></span>xce<span class=\"_ _0\"></span>pt<span class=\"fc0 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 hc y4e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4e3 ff3 fs0 fc0 sc0 ls52 ws0\"> <span class=\"ff4 fs4 ls19 wsf v4\">47<span class=\"ls1 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2f\" class=\"pf w0 h0\" data-page-no=\"2f\"><div class=\"pc pc2f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e r<span class=\"_ _0\"></span>ecta<span class=\"_ _3\"></span>ngle <span class=\"_ _0\"></span>(defaul<span class=\"_ _3\"></span>t) collision <span class=\"_ _0\"></span>mask. </span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">2.49</div><div class=\"t m3 x21 hd y1b2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Circl<span class=\"_ _0\"></span>eMask<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y1e3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"fc0\">Cir<span class=\"_ _0\"></span>cle<span class=\"_ _3\"></span>&amp; <span class=\"_ _0\"></span>getCircl<span class=\"_ _3\"></span>eMask()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5\">noexcept </span></span></span></span></div><div class=\"t m0 x7 hc y1e4 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y43b ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>circle collision<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>ma<span class=\"_ _0\"></span>sk.<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.50</div><div class=\"t m3 x21 hd y2b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2b5 ff3 fs0 fc4 sc0 ls1 ws0\">g<span class=\"_ _0\"></span>etX<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y292 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getX() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y294 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the x <span class=\"_ _0\"></span>position <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the obje<span class=\"_ _0\"></span>ct. </span></div><div class=\"t m0 x1 hb y48e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">2.51</div><div class=\"t m3 x21 hd y227 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y227 ff3 fs0 fc4 sc0 ls1 ws0\">g<span class=\"_ _0\"></span>etY<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y4af ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getY() <span class=\"_ _2\"></span><span class=\"fc9\">co<span class=\"_ _3\"></span>nst </span></span></span></div><div class=\"t m0 x7 hc y228 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1ef ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the y <span class=\"_ _0\"></span>position <span class=\"ls1c ws12\">of</span> the o<span class=\"_ _0\"></span>bje<span class=\"_ _0\"></span>ct. </span></div><div class=\"t m0 x1 hb y48f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f1 ff3 fs0 fc4 sc0 ls1 ws10\">2.52</div><div class=\"t m3 x21 hd y1f1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1f1 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>XStar<span class=\"_ _0\"></span>t </div><div class=\"t m0 x7 hc y3a5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getXStart() <span class=\"_ _2\"></span><span class=\"fc9\">c<span class=\"_ _3\"></span>onst </span></span></span></div><div class=\"t m0 x7 hc y22b ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y22c ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the x <span class=\"_ _0\"></span>start position <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>jec<span class=\"_ _0\"></span>t. </span></span></span></div><div class=\"t m0 x1 hb y4e4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2c ff3 fs0 fc4 sc0 ls1 ws10\">2.53</div><div class=\"t m3 x21 hd y2c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2c ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>YStart<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y4e5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getYStart() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y4ae ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y230 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the y <span class=\"_ _0\"></span>start position <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y231 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4e6 ff3 fs0 fc4 sc0 ls1 ws10\">2.54</div><div class=\"t m3 x21 hd y4e6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4e6 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>XPrev<span class=\"_ _0\"></span>ious </div><div class=\"t m0 x7 hc y396 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getXPrevious() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y234 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y4e7 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>previous posit<span class=\"_ _3\"></span>ion x <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the obje<span class=\"_ _0\"></span>ct. </span></span></span></div><div class=\"t m0 x1 hb y4e8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y238 ff3 fs0 fc4 sc0 ls1 ws10\">2.55</div><div class=\"t m3 x21 hd y238 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y238 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>YPrev<span class=\"_ _0\"></span>ious </div><div class=\"t m0 x7 hc y96 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getYPrevious() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y1ac ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y250 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>previous<span class=\"_ _3\"></span> position y <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the ob<span class=\"_ _0\"></span>ject. </span></div><div class=\"t m0 x1 hb y4e9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y203 ff3 fs0 fc4 sc0 ls1 ws10\">2.56</div><div class=\"t m3 x21 hd y203 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y203 ff3 fs0 fc4 sc0 ls1 ws10\">dis<span class=\"_ _0\"></span>tantT<span class=\"_ _0\"></span>oPoint<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y222 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"fc0 ws10\">distantToPoint(<span class=\"_ _3\"></span></span>float <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">y) </span><span class=\"ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x1 hb y223 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y224 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x22 h9 y225 ff4 fs4 fc0 sc0 ls19 wsf\">48<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf30\" class=\"pf w0 h0\" data-page-no=\"30\"><div class=\"pc pc30 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzboY2FUBCGUe4GiUChCSVQAh1QAIXhn6YTaqAT5gn8KrKB2XNK+BVfLlMiogIAACCpHxMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqMwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAAD+SG2ClEopRriM47jvux0AAFB9pHKepxEAAICqqkpEWAEAACArd30AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAnqw2QUrzPBvhLuu6dl1nBwAAVB8PsiyLEe7SNI0RAAB4rxIRVgAAAMjKXR8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAAAgi9oEKW3bZoRL27bTNNkBAADVRyqfz8cIl2EYVB8AAP9ZiQgrAAAAZOWuDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAMCT1SZIKSKMcJdSihEAAHjxB608ECr87jiOvu/tAADAS/nDEwAAIDNvfQAAAJl56wMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVB9/265AGQCiAouheAgYKSwVCkIARgwwo6MCGxROBCj8Rkgx/O8c9+9wFAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAK2mXvgAAAC4SURBVFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAJVV3zhdSZLhaNqyJM983vv273ftu7IkLgMAAKjIB5uUQDxvqqBvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the distance b<span class=\"_ _0\"></span>etwe<span class=\"_ _3\"></span>en the <span class=\"_ _0\"></span>obj<span class=\"_ _3\"></span>ect <span class=\"_ _0\"></span>a<span class=\"_ _3\"></span>nd a point <span class=\"_ _0\"></span>x and <span class=\"_ _0\"></span><span class=\"ls28 ws1f\">y.<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.57</div><div class=\"t m3 x21 hd y1e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">dis<span class=\"_ _0\"></span>tantT<span class=\"_ _0\"></span>oObje<span class=\"_ _0\"></span>ct<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0 ws10\">distantToO<span class=\"_ _3\"></span>bject(<span class=\"ff3 fc5\">std::sha<span class=\"_ _3\"></span>red_ptr</span><span class=\"ws0\">&lt;Ma<span class=\"_ _3\"></span>inObject&gt;<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;other, <span class=\"_ _0\"></span><span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">useSpritePositi<span class=\"_ _3\"></span>on) <span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>distance between the object <span class=\"_ _0\"></span>and anot<span class=\"_ _0\"></span>her. </span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20c ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"ff2 fc0 ls1d ws13\">if<span class=\"ls1 ws0\"> <span class=\"ff3\">useSpritePosi<span class=\"_ _3\"></span>tion </span></span>is<span class=\"ls1 ws0\"> <span class=\"ff3\">true </span><span class=\"ls31 ws26\">we</span> use the position <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>sprite<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>obj<span class=\"_ _3\"></span>ect <span class=\"ls1b ws11\">to</span> <span class=\"ls53 ws44\">do</span> the test <span class=\"ff3 ls34 ws28\">if</span><span class=\"ff3\"> not </span><span class=\"ls31 ws26\">we<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> use the </span></span></span></span></div><div class=\"t m0 x7 hb y303 ff2 fs0 fc0 sc0 ls1 ws0\">position x, y of th<span class=\"_ _3\"></span>e object. </div><div class=\"t m2 xc hc y304 ff3 fs0 fc4 sc0 ls1 ws10\">2.58</div><div class=\"t m3 x21 hd y304 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y304 ff3 fs0 fc4 sc0 ls1 ws10\">poi<span class=\"_ _0\"></span>ntDir<span class=\"_ _0\"></span>ection<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y4ea ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4ea ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4ea ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y4eb ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y442 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"fc0 ws10\">pointDirection(<span class=\"_ _3\"></span></span>float <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls51 ws43\">y)<span class=\"_ _3\"></span></span><span class=\"fc0\"> <span class=\"_ _0\"></span><span class=\"fc9 ws10\">cons<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y471 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4ec ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4ed ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4ee ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>direction<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>(angle)<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the object<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>relative<span class=\"_ _3\"></span> <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>a po<span class=\"_ _0\"></span>int<span class=\"_ _0\"></span>. </span></div><div class=\"t m2 xc h13 y4ef ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4ef ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4ef ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y4f0 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4f1 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0 ws10\">pointDirectio<span class=\"_ _3\"></span>n(<span class=\"ff3 fc5\">std::shared_pt<span class=\"_ _3\"></span>r</span><span class=\"ws0\">&lt;MainObj<span class=\"_ _3\"></span>ect&gt; <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;other) <span class=\"_ _0\"></span><span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y4f2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y12a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4f3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4f4 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>direction<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>(angl<span class=\"_ _3\"></span>e) <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the object<span class=\"_ _3\"></span> re<span class=\"_ _0\"></span>lativ<span class=\"_ _3\"></span>e <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>another.<span class=\"_ _3\"></span> Here <span class=\"_ _0\"></span>the other object <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> a <span class=\"_ _3\"></span>smart poi<span class=\"_ _0\"></span>nter<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m2 xc hc y4f5 ff3 fs0 fc4 sc0 ls1 ws10\">2.59</div><div class=\"t m3 x21 hd y4f5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4f5 ff3 fs0 fc4 sc0 ls1 ws10\">poi<span class=\"_ _0\"></span>ntDir<span class=\"_ _0\"></span>ection<span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>ite<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y4f6 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4f6 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4f6 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y4f7 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4f8 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"fc0 ws10\">pointDirection<span class=\"_ _3\"></span>Sprite(</span>floa<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls51 ws43\">y)</span><span class=\"fc0\"> <span class=\"_ _0\"></span><span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y4f9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4fa ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4fb ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4fc ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>direction<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>(angle)<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the obj<span class=\"_ _3\"></span>ect&apos;s sprite r<span class=\"_ _0\"></span>elativ<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> a point<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m2 xc h13 y4fd ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4fd ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4fd ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y4fe ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4ff ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0 ws10\">pointDirectio<span class=\"_ _3\"></span>nSprite(<span class=\"ff3 fc5\">std::sha<span class=\"_ _3\"></span>red_ptr</span><span class=\"ws0\">&lt;Main<span class=\"_ _3\"></span>Object&gt; <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;other) <span class=\"_ _0\"></span><span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y500 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y501 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y502 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>direction (angle) <span class=\"ls1c ws12\">of</span> the object&apos;s sprite <span class=\"_ _0\"></span>relative<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> ano<span class=\"_ _0\"></span>ther<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y503 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y504 ff3 fs0 fc4 sc0 ls1 ws10\">2.60</div><div class=\"t m3 x21 hd y504 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y504 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Spee<span class=\"_ _0\"></span>d </div><div class=\"t m0 x7 hc y505 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSpeed() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y506 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y507 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">object<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>spee<span class=\"_ _0\"></span>d. </span></div><div class=\"t m2 xc hc y508 ff3 fs0 fc4 sc0 ls1 ws10\">2.61</div><div class=\"t m3 x21 hd y508 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y508 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Hsp </div><div class=\"t m0 x7 hc y509 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getHsp() <span class=\"_ _2\"></span><span class=\"fc9\">co<span class=\"_ _3\"></span>nst </span></span></span></div><div class=\"t m0 x7 hc y50a ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y50b ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>horizontal speed <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </span></div><div class=\"t m0 x22 h9 y4b7 ff4 fs4 fc0 sc0 ls19 wsf\">49<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf31\" class=\"pf w0 h0\" data-page-no=\"31\"><div class=\"pc pc31 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xc hc y2e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.62</div><div class=\"t m3 x21 hd y2e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2e2 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Vsp </div><div class=\"t m0 x7 hc y2e3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getVsp() <span class=\"_ _2\"></span><span class=\"fc9\">co<span class=\"_ _3\"></span>nst </span></span></span></div><div class=\"t m0 x7 hc y2e4 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>vertica<span class=\"_ _3\"></span>l speed <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct </span></span></span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.63</div><div class=\"t m3 x21 hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20a ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Frame<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getFrame() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2e5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the n<span class=\"_ _0\"></span>um<span class=\"_ _3\"></span>ber <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>su<span class=\"_ _3\"></span>b-image that <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>being disp<span class=\"_ _0\"></span>layed<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y2e6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y294 ff3 fs0 fc4 sc0 ls1 ws10\">2.64</div><div class=\"t m3 x21 hd y294 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y294 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Frame<span class=\"_ _0\"></span>Start </div><div class=\"t m0 x7 hc y50c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getFrameStart() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y2e7 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y24 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the n<span class=\"_ _0\"></span>u<span class=\"_ _3\"></span>mber <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>st<span class=\"_ _3\"></span>art sub <span class=\"_ _0\"></span>pictur<span class=\"_ _0\"></span>e. </span></span></span></div><div class=\"t m0 x1 hb y297 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y298 ff3 fs0 fc4 sc0 ls1 ws10\">2.65</div><div class=\"t m3 x21 hd y298 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y298 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Frame<span class=\"_ _0\"></span>End </div><div class=\"t m0 x7 hc y50d ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getFrameEnd() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y229 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y22b ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the n<span class=\"_ _0\"></span>u<span class=\"_ _3\"></span>mber <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the end <span class=\"_ _0\"></span>sub pictu<span class=\"_ _0\"></span>re. </span></span></span></div><div class=\"t m0 x1 hb y2a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y22c ff3 fs0 fc4 sc0 ls1 ws10\">2.66</div><div class=\"t m3 x21 hd y22c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y22c ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>ImageX<span class=\"_ _0\"></span>sca<span class=\"_ _0\"></span>le </div><div class=\"t m0 x7 hc y2c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getImageXscale()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y218 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y50e ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e ob<span class=\"_ _0\"></span>ject&apos;s<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>x-scale<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y50f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y230 ff3 fs0 fc4 sc0 ls1 ws10\">2.67</div><div class=\"t m3 x21 hd y230 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y230 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Image<span class=\"_ _0\"></span>Yscal<span class=\"_ _0\"></span>e </div><div class=\"t m0 x7 hc y510 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getImageYscale() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y511 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y512 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e ob<span class=\"_ _0\"></span>ject&apos;s<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>y-scale.<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x1 hb y513 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4e7 ff3 fs0 fc4 sc0 ls1 ws10\">2.68</div><div class=\"t m3 x21 hd y4e7 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4e7 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Image<span class=\"_ _0\"></span>Scale </div><div class=\"t m0 x7 hc y514 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getImageScale() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y515 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y516 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>object&apos;s<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>scale<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y1ad ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y517 ff3 fs0 fc4 sc0 ls1 ws10\">2.69</div><div class=\"t m3 x21 hd y517 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y517 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Image<span class=\"_ _0\"></span>Angle<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y518 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getImageAngle() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y252 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y519 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the angle <span class=\"ls1c ws12\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the object im<span class=\"_ _0\"></span>age. </span></span></span></div><div class=\"t m0 x22 h9 y51a ff4 fs4 fc0 sc0 ls19 wsf\">50<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf32\" class=\"pf w0 h0\" data-page-no=\"32\"><div class=\"pc pc32 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xc hc y2e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.70</div><div class=\"t m3 x21 hd y2e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2e2 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>XOff<span class=\"_ _0\"></span>set </div><div class=\"t m0 x7 hc y2e3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getXOffset() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y2e4 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the obje<span class=\"_ _0\"></span>ct x of<span class=\"_ _0\"></span>fset. </span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.71</div><div class=\"t m3 x21 hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20a ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>YOff<span class=\"_ _0\"></span>set </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getYOffset() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2e5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the obje<span class=\"_ _0\"></span>ct y off<span class=\"_ _0\"></span>set. </span></div><div class=\"t m0 x1 hb y2e6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y294 ff3 fs0 fc4 sc0 ls1 ws10\">2.72</div><div class=\"t m3 x21 hd y294 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y294 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Time </div><div class=\"t m0 x7 hc y50c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getTime() <span class=\"_ _2\"></span><span class=\"fc9\">co<span class=\"_ _3\"></span>nst </span></span></span></div><div class=\"t m0 x7 hc y2e7 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y24 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the value <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the variable <span class=\"ff3 ws10\">m_<span class=\"_ _0\"></span>time<span class=\"ff2 ws0\">. </span></span></span></span></span></div><div class=\"t m0 x1 hb y297 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y298 ff3 fs0 fc4 sc0 ls1 ws10\">2.73</div><div class=\"t m3 x21 hd y298 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y298 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Insta<span class=\"_ _0\"></span>nceI<span class=\"_ _0\"></span>d </div><div class=\"t m0 x7 hc y50d ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getInstanceId() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y229 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y22b ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>object numb<span class=\"_ _0\"></span>er. </span></div><div class=\"t m0 x1 hb y2a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y51b ff3 fs0 fc4 sc0 ls1 ws10\">2.74</div><div class=\"t m3 x21 hd y51b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y51b ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>MaskW<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y51c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4ad ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">u<span class=\"_ _3\"></span>nsigned int <span class=\"_ _0\"></span><span class=\"fc0\">getMaskW()<span class=\"_ _3\"></span> <span class=\"fc9 ws10\">co<span class=\"_ _0\"></span>nst<span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y51d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y24d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y22e ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the wi<span class=\"_ _0\"></span>dth<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>collision<span class=\"_ _3\"></span> m<span class=\"_ _0\"></span>as<span class=\"_ _0\"></span>k. </span></div><div class=\"t m0 x1 hb y51e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y230 ff3 fs0 fc4 sc0 ls1 ws10\">2.75</div><div class=\"t m3 x21 hd y230 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y230 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>MaskH<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y231 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1fc ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">u<span class=\"_ _3\"></span>nsigned int <span class=\"_ _0\"></span><span class=\"fc0\">getMaskH(<span class=\"_ _3\"></span>) <span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 hc y232 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y21b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y21c ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>height<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>coll<span class=\"_ _3\"></span>ision ma<span class=\"_ _0\"></span>sk.<span class=\"_ _0\"></span> </span></span></span></div><div class=\"t m0 x1 hb y4a7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y21d ff3 fs0 fc4 sc0 ls1 ws10\">2.76</div><div class=\"t m3 x21 hd y21d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y21d ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>IsAct<span class=\"_ _0\"></span>ive </div><div class=\"t m0 x7 hc y51f ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etIsActive() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y21f ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y23a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>state <span class=\"ls1c ws12\">of</span> the ob<span class=\"_ _0\"></span>ject. </span></div><div class=\"t m0 x1 hb y23b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y23c ff3 fs0 fc4 sc0 ls1 ws10\">2.77</div><div class=\"t m3 x21 hd y23c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y23c ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Image<span class=\"_ _0\"></span>Alpha<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y251 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getImageAlpha() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y222 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y224 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>alpha image<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1f ws16\">of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </span></span></span></div><div class=\"t m0 x22 h9 y225 ff4 fs4 fc0 sc0 ls19 wsf\">51<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf33\" class=\"pf w0 h0\" data-page-no=\"33\"><div class=\"pc pc33 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xc hc y2e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.78</div><div class=\"t m3 x21 hd y2e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2e2 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Image<span class=\"_ _0\"></span>Inde<span class=\"_ _0\"></span>x </div><div class=\"t m0 x7 hc y2e3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getImageIndex() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y2e4 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>image<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>index. </span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.79</div><div class=\"t m3 x21 hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20a ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Sprit<span class=\"_ _0\"></span>eWidt<span class=\"_ _0\"></span>h </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getSpriteWidth() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2e5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>width<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>spr<span class=\"_ _0\"></span>ite. </span></div><div class=\"t m0 x1 hb y2e6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y294 ff3 fs0 fc4 sc0 ls1 ws10\">2.80</div><div class=\"t m3 x21 hd y294 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y294 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Sprit<span class=\"_ _0\"></span>eHeig<span class=\"_ _0\"></span>ht </div><div class=\"t m0 x7 hc y50c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getSpriteHeight() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y2e7 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y24 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the he<span class=\"_ _0\"></span>ight<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the spr<span class=\"_ _0\"></span>ite<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y297 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y298 ff3 fs0 fc4 sc0 ls1 ws10\">2.81</div><div class=\"t m3 x21 hd y298 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y298 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Sprit<span class=\"_ _0\"></span>eX </div><div class=\"t m0 x7 hc y50d ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSpriteX() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y229 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y22b ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the x <span class=\"_ _0\"></span>position <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the sprite<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y2a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y22c ff3 fs0 fc4 sc0 ls1 ws10\">2.82</div><div class=\"t m3 x21 hd y22c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y22c ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Sprit<span class=\"_ _0\"></span>eY </div><div class=\"t m0 x7 hc y2c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSpriteY() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y218 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y50e ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the y <span class=\"_ _0\"></span>position <span class=\"ls1c ws12\">of</span> the s<span class=\"_ _0\"></span>prite<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y50f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y230 ff3 fs0 fc4 sc0 ls1 ws10\">2.83</div><div class=\"t m3 x21 hd y230 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y230 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Text<span class=\"_ _0\"></span>ureWid<span class=\"_ _0\"></span>th </div><div class=\"t m0 x7 hc y510 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getTextureWidth() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y511 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y512 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e wi<span class=\"_ _0\"></span>dth<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the <span class=\"ffa ws10\">sprite’s</span> Te<span class=\"_ _0\"></span>xtu<span class=\"_ _0\"></span>re. </span></div><div class=\"t m0 x1 hb y513 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y236 ff3 fs0 fc4 sc0 ls1 ws10\">2.84</div><div class=\"t m3 x21 hd y236 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y236 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Text<span class=\"_ _0\"></span>ureHei<span class=\"_ _0\"></span>ght </div><div class=\"t m0 x7 hc y514 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getTextureHeight() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y515 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y516 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>height<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span><span class=\"ffa ws10\">sp<span class=\"_ _3\"></span>rite’s<span class=\"ff2 ws0\"> Texture<span class=\"_ _0\"></span>. </span></span></span></span></span></div><div class=\"t m0 x1 hb y1ad ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y517 ff3 fs0 fc4 sc0 ls1 ws10\">2.85</div><div class=\"t m3 x21 hd y517 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y517 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Sprit<span class=\"_ _0\"></span>eCent<span class=\"_ _0\"></span>erX </div><div class=\"t m0 x7 hc y518 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getSpriteCenterX()<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"fc9\">c<span class=\"_ _3\"></span>onst </span></span></span></div><div class=\"t m0 x7 hc y252 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y519 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the x <span class=\"_ _0\"></span>center <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>spri<span class=\"_ _0\"></span>te. </span></div><div class=\"t m0 x22 h9 y51a ff4 fs4 fc0 sc0 ls19 wsf\">52<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf34\" class=\"pf w0 h0\" data-page-no=\"34\"><div class=\"pc pc34 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzaQQ3DMBBE0WwUIMZg/hSMwVCmtyKo1GTzHoS5fWkqyQEAAEBTpwkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAICbuUzQUlUZ4WvOudayAwAAL62DJFYAAADoysMTAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAADgPy4TtFRVRviVvfcYww4AADy1DpJYAQAAoCsPTwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB+f9uzYBmEgCKKoRiJHJiKlhSvCFSCXQQ1EpgckUnJKoIBL3NCRQQv28V626WRfCwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAANZsZ4IuJTHCVyml1moHAAD+k18fAABAz9JaswIAAECv/PoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AADkHLpUAAACBSURBVACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAgNVVXxkfSZLTbT8sU/I635/z9Xe/L8fDMiUmAwAA2JAPeGgs70kebhwAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">53<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.86</div><div class=\"t m3 x21 hd y2e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2e2 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Sprit<span class=\"_ _0\"></span>eCent<span class=\"_ _0\"></span>erY </div><div class=\"t m0 x7 hc y2e3 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getSpriteCenterY() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></span></div><div class=\"t m0 x7 hc y2e4 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the y <span class=\"_ _0\"></span>center <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>spri<span class=\"_ _0\"></span>te. </span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.87</div><div class=\"t m3 x21 hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Sprit<span class=\"_ _0\"></span>eNumb<span class=\"_ _0\"></span>erSubI<span class=\"_ _0\"></span>mage<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0 ws10\">getSprit<span class=\"_ _3\"></span>eNumberSubImag<span class=\"_ _3\"></span>e(<span class=\"fc9 ws0\">int <span class=\"fc0\">subImageWidth) <span class=\"_ _0\"></span><span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the number <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> sub-images <span class=\"ls1c ws12\">of</span> a sprite <span class=\"_ _0\"></span>(on <span class=\"_\"> </span>the horizontal axis).<span class=\"_ _3\"></span> <span class=\"ff3\">subImageWidth <span class=\"_ _3\"></span></span>represent the size <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>sub<span class=\"_ _3\"></span>-image </span></span></span></div><div class=\"t m0 x7 hb y3f6 ff2 fs0 fc0 sc0 ls1 ws0\">(32 pixels). </div><div class=\"t m2 xc hc y376 ff3 fs0 fc4 sc0 ls1 ws10\">2.88</div><div class=\"t m3 x21 hd y376 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y376 ff3 fs0 fc4 sc0 ls1 ws10\">pla<span class=\"_ _0\"></span>ceMet<span class=\"_ _0\"></span>ting<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y4ec ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4ec ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4ec ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y4ed ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4ee ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0 ws10\">placeMetting(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">int </span><span class=\"ls29 ws20\">x,</span><span class=\"ws0\"> <span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0 ls51 ws43\">y,<span class=\"ls1 ws0\"> MainObject <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">*other<span class=\"_ _0\"></span>) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y521 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y522 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y523 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"_ _0\"></span><span class=\"ff2 ls1f ws16\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>there<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>a collision w<span class=\"_ _3\"></span>ith <span class=\"_ _0\"></span>a<span class=\"_ _3\"></span>nother object, <span class=\"ff3\">false </span><span class=\"ls1f ws16\">if</span> <span class=\"_ _0\"></span>no<span class=\"_ _0\"></span>t. </span></span></span></span></span></div><div class=\"t m0 x1 hb y475 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y524 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y524 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y524 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y4f3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y525 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"fc0 ws10\">placeMetting(</span>int <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> </span>int <span class=\"_ _0\"></span><span class=\"fc0 ls51 ws43\">y,<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::sha<span class=\"_ _3\"></span>red_ptr<span class=\"ff2 fc0 ws0\">&lt;Ma<span class=\"_ _3\"></span>inObject&gt; <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;other<span class=\"_ _0\"></span>) </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y526 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y527 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y528 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>there <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>a collision <span class=\"_ _3\"></span>with another object, <span class=\"ff3\">false </span><span class=\"ls1f ws16\">if</span> <span class=\"_ _0\"></span>not. Here the <span class=\"_ _0\"></span>other<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>object<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> a smart point<span class=\"_ _0\"></span>er<span class=\"ff3\">. </span></span></span></span></span></div><div class=\"t m0 x1 hc y529 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y52a ff3 fs0 fc4 sc0 ls1 ws10\">2.89</div><div class=\"t m3 x21 hd y52a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y52a ff3 fs0 fc4 sc0 ls1 ws10\">in<span class=\"_ _0\"></span>ViewRe<span class=\"_ _0\"></span>c<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y52b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y52c ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">inViewRec(<span class=\"_ _3\"></span>sf::View <span class=\"fc9\">const </span>&amp;view, <span class=\"_ _0\"></span><span class=\"fc9\">bool <span class=\"fc0\">useTexRec <span class=\"_ _0\"></span>=<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">true<span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x7 hc y52d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y52e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y52f ff2 fs0 fc0 sc0 ls1 ws0\">Lets know <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the object <span class=\"ls1d ws13\">is</span> <span class=\"ls1d ws13\">in</span> the rectangle <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the view. If the <span class=\"ff3\">useTexRec parameter </span>is <span class=\"ff3 ws10\">true<span class=\"_ _3\"></span></span>, the <span class=\"ff3\">sprite rectangle </span>will be </div><div class=\"t m0 x7 hc y530 ff2 fs0 fc0 sc0 ls1 ws0\">used to do the test othe<span class=\"_ _3\"></span>rwise the <span class=\"_ _3\"></span><span class=\"ff3\">rectangle mask <span class=\"_ _3\"></span></span>will be used.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y531 ff3 fs0 fc4 sc0 ls1 ws10\">2.90</div><div class=\"t m3 x21 hd y531 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y531 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Sprit<span class=\"_ _0\"></span>e </div><div class=\"t m0 x7 hc y532 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Sprite&amp; <span class=\"_ _0\"></span>getSprite() </span></div><div class=\"t m0 x7 hc ya6 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y533 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>object spri<span class=\"_ _0\"></span>te. </span></div><div class=\"t m0 x1 hb y534 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y535 ff3 fs0 fc4 sc0 ls1 ws10\">2.91</div><div class=\"t m3 x21 hd y535 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y535 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tFrame<span class=\"_ _0\"></span>Limit<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y536 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y537 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setFrame(</span>floa<span class=\"_ _3\"></span>t <span class=\"fc0\">frameStart, </span>float <span class=\"_ _0\"></span><span class=\"fc0\">frameEnd <span class=\"ls24\">= <span class=\"fcc ls54\">-<span class=\"ls2d ws22\">1.f</span></span></span>) </span></span></div><div class=\"t m0 x7 hc y538 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y88 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y539 ff2 fs0 fc0 sc0 ls1 ws0\">Defines the <span class=\"_ _0\"></span>start and end image which <span class=\"_ _0\"></span>will<span class=\"_ _3\"></span> <span class=\"ls22 ws19\">be</span> <span class=\"_ _0\"></span>used <span class=\"ls1b ws11\">to</span> animate the <span class=\"_ _0\"></span>sprite <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m0 x1 hb y53a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y89 ff3 fs0 fc4 sc0 ls1a\">3.</div><div class=\"t m3 xd hd y89 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y89 ff3 fs0 fc4 sc0 ls1 ws0\">Other <span class=\"_ _0\"></span>func<span class=\"_ _3\"></span>tions <span class=\"ls42 ws34\">of</span> Ma<span class=\"_ _0\"></span>inO<span class=\"_ _0\"></span>bject<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc ydf ff3 fs0 fc4 sc0 ls1 ws10\">3.1</div><div class=\"t m3 x1d hd ydf ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ydf ff3 fs0 fc4 sc0 ls1 ws10\">in<span class=\"_ _0\"></span>stance<span class=\"_ _0\"></span>Exis<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y53b ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y53b ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y53b ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf35\" class=\"pf w0 h0\" data-page-no=\"35\"><div class=\"pc pc35 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAgHsaTFDSuq5G4KJt26ZpsgMAgOrjTnrvRuCicRyNAABQWGSmFQAAAKry1wcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQ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AwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoD7T6Q4AAACRSURBVPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAoJrqG6crSTIcTVuW5JnPe9/+/a59V5bEZQAAABX5APgbNoXwbstnAAAAAElFTkSuQmCC\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">54<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws10\">te<span class=\"_ _0\"></span>mplate<span class=\"_ _0\"></span><span class=\"ff2 fc0\">&lt;<span class=\"ff3 fc5 ws0\">cla<span class=\"_ _0\"></span>ss <span class=\"_ _b\"></span><span class=\"ff2 fc0 ls33 ws27\">T&gt;<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0 ws10\">instanceExist(<span class=\"ff3 fc5\">std::<span class=\"_ _3\"></span>shared_p<span class=\"_ _3\"></span>tr</span><span class=\"ws0\">&lt;T&gt; <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;<span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j) </span></span></span></span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"_ _0\"></span><span class=\"ff2 ls1f ws16\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the instance exists, <span class=\"ff3\">false<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">if<span class=\"ls1 ws0\"> no<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y290 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y53c ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y53c ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y53c ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y53d ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y53e ff3 fs0 fc5 sc0 ls1 ws10\">te<span class=\"_ _0\"></span>mplate<span class=\"_ _0\"></span><span class=\"ff2 fc0\">&lt;<span class=\"ff3 fc5 ws0\">cla<span class=\"_ _0\"></span>ss <span class=\"_ _b\"></span><span class=\"ff2 fc0 ls33 ws27\">T&gt;<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y53f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y540 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">instanceExist(<span class=\"_ _3\"></span>T <span class=\"_ _0\"></span><span class=\"fc9\">const<span class=\"_ _3\"></span> <span class=\"fc0\">*<span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x7 hc y541 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y542 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y543 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"_ _0\"></span><span class=\"ff2 ls1f ws16\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the instance exists, <span class=\"ff3\">false<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">if<span class=\"ls1 ws0\"> no<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></span></span></span></span></div><div class=\"t m2 xc hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">3.2</div><div class=\"t m3 x1d hd y227 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">oper<span class=\"_ _0\"></span>ator<span class=\"_ _0\"></span>()<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y1c1 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y1c1 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y1c1 ff6 fs0 fc0 sc0 ls1 ws0\">Position <span class=\"_ _0\"></span>comp<span class=\"_ _0\"></span>arato<span class=\"_ _0\"></span>r </div><div class=\"t m0 x7 hc y544 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"_ _0\"></span><span class=\"ff2 fc0\">Compar<span class=\"_ _0\"></span>eX; </span></div><div class=\"t m0 x1 hb y545 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y546 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y547 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y129 ff2 fs0 fc0 sc0 ls1 ws0\">Functor which <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>sort the <span class=\"_ _0\"></span>objects<span class=\"_ _3\"></span> compared <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> th<span class=\"_ _3\"></span>eir position <span class=\"ls4f ws41\">x.</span> </span></span></span></span></div><div class=\"t m0 x1 hb y548 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y549 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">operator<span class=\"ff2 fc0 ls32 ws35\">()(</span>std::share<span class=\"_ _3\"></span>d_ptr<span class=\"ff2 fc0 ws0\">&lt;Ma<span class=\"_ _3\"></span>inObject&gt; <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;a, <span class=\"_ _2\"></span><span class=\"ff3 fc5 ws10\">std:<span class=\"_ _3\"></span>:shared_ptr<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">&lt;MainObje<span class=\"_ _3\"></span>ct&gt; <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;b) <span class=\"_ _2\"></span><span class=\"fc9 ws10\">const<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y54a ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">operat<span class=\"_ _3\"></span>or<span class=\"ff2 fc0 ws0\">()(MainObject<span class=\"_ _3\"></span> <span class=\"fc9\">const </span>*a, <span class=\"_ _0\"></span>MainObject<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">*b) </span><span class=\"ws10\">co<span class=\"_ _0\"></span>nst<span class=\"fc0 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x1 hb y54b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y54c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y54d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y54e ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>sort objects according <span class=\"ls1b ws11\">to</span> their <span class=\"_ _0\"></span>x posit<span class=\"_ _0\"></span>ion<span class=\"_ _0\"></span>s. </div><div class=\"t m0 x1 hb y54f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y550 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y550 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y550 ff6 fs0 fc0 sc0 ls1 ws0\">Dep<span class=\"_ _0\"></span>th <span class=\"_ _2\"></span>compara<span class=\"_ _0\"></span>tor </div><div class=\"t m0 x7 hc y551 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">CompareD<span class=\"_ _3\"></span>epth; </span></div><div class=\"t m0 x7 hc y552 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y553 ff2 fs0 fc0 sc0 ls1 ws0\">Functor which <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>sort<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>objects according<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> their dep<span class=\"_ _0\"></span>th. </span></span></span></span></div><div class=\"t m0 x1 hb y554 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y555 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">operator()<span class=\"ff2 fc0 ls55\">(</span>std::sh<span class=\"_ _3\"></span>ared_ptr<span class=\"ff2 fc0 ws0\">&lt;M<span class=\"_ _3\"></span>ainObject&gt; <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;a, <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::shared_ptr<span class=\"ff2 fc0 ws0\">&lt;Ma<span class=\"_ _3\"></span>inObject&gt;<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;b) <span class=\"_ _0\"></span><span class=\"fc9 ws10\">cons<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y274 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y556 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y557 ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>sort objects according <span class=\"ls1b ws11\">to</span> their <span class=\"_ _0\"></span>dept<span class=\"_ _0\"></span>hs. </span></span></div><div class=\"t m0 x1 hb y558 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y559 ff3 fs0 fc4 sc0 ls1 ws10\">3.3</div><div class=\"t m3 x1d hd y559 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y559 ff3 fs0 fc4 sc0 ls1 ws0\">sor<span class=\"_ _0\"></span>tObjA<span class=\"_ _0\"></span>rrayB<span class=\"_ _0\"></span>yX </div><div class=\"t m0 x7 hc y55a ff3 fs0 fc5 sc0 ls1 ws10\">template<span class=\"ff2 fc0 ls24\">&lt;</span><span class=\"ws0\">class <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x7 hc yda ff2 fs0 fc9 sc0 ls1 ws0\">voi<span class=\"_ _0\"></span>d <span class=\"_ _8\"> </span><span class=\"fc0 ws10\">sortOb<span class=\"_ _0\"></span>jArr<span class=\"_ _0\"></span>ayByX<span class=\"_ _0\"></span>(<span class=\"ff3 fc5\">std:<span class=\"_ _0\"></span>:list<span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">std:<span class=\"_ _0\"></span>:shar<span class=\"_ _0\"></span>ed_pt<span class=\"_ _0\"></span>r<span class=\"ff2 fc0 ws0\">&lt;T&gt;&gt;<span class=\"_ _0\"></span> <span class=\"_ _8\"> </span>&amp;v)<span class=\"_ _0\"></span> </span></span></span></span></span></div><div class=\"t m0 x1 hb y55b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y55c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y31b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y55d ff2 fs0 fc0 sc0 ls1 ws0\">Sort <span class=\"ls23 ws1a\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> array (<span class=\"ff3 fc5 ws10\">std::list</span>) <span class=\"ls1c ws12\">of</span> objects <span class=\"ls26 ws1c\">by</span> x <span class=\"_ _0\"></span>posit<span class=\"_ _0\"></span>ion. </span></span></div><div class=\"t m0 x1 hb y55e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y55f ff3 fs0 fc4 sc0 ls1 ws10\">3.4</div><div class=\"t m3 x1d hd y55f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y55f ff3 fs0 fc4 sc0 ls1 ws0\">sor<span class=\"_ _0\"></span>tObjA<span class=\"_ _0\"></span>rrayB<span class=\"_ _0\"></span>yDept<span class=\"_ _0\"></span>h </div><div class=\"t m0 x7 hc y560 ff3 fs0 fc5 sc0 ls1 ws10\">template<span class=\"ff2 fc0 ls24\">&lt;</span><span class=\"ws0\">class <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf36\" class=\"pf w0 h0\" data-page-no=\"36\"><div class=\"pc pc36 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbsQ3CMBRFUTtKG6VIwRCwAkuwATOwB1NlDq+ALFHRfAokRENDx885G/jJRa6s1IgoAAAAJDWYAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8JAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9JgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ZkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPDFaAI+na/r7f6wAwDAXzsedpfT3g681IiwAm/uAwBAkg/9Wo2A6gMAAMjPf30AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAgN+NGz//PM/5DtVaW5bF5QYAAEopNSK2fP7ee75DTdM0DF5xAQAA1QcAAJCdFyEAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AwLN9O2SJIAgDMDwDCweGSwtXDZoPzm4Q1GAS4xWFa+IvEIxGo2AwXDUJRqvd6C/QssgdohcUHYMKF6wiO/M8aTfOx4R9mVkAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAA8lUZAfPuH2fvH8kcAABabaFT1d2OOaD6+MXp1d3T7M0cAABabWW53l1fMge+xJQc7AAAAGTLf30AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAADg71WFrz+llOW6Yow2NwAAEEKIuWZPyXXUNE1d1zY3AAAQ3PAEAADIW+lnfQAAAHlz1gcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAH6DxbMAAAEXSURBVACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAA4H9VPw+DjfPb61EIi8fd6dbmtD/cOXsZPAwPx9/v+we97dHqpH+RUlkT2ju5mTy/2ikAAG13ebRmCPNSaV/25foEL8VjTBmGRqoAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">55<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff2 fs0 fc9 sc0 ls1 ws0\">voi<span class=\"_ _0\"></span>d <span class=\"_ _8\"> </span><span class=\"fc0 ws10\">sortOb<span class=\"_ _0\"></span>jArr<span class=\"_ _0\"></span>ayByDe<span class=\"_ _0\"></span>pth(<span class=\"ff3 fc5\">st<span class=\"_ _0\"></span>d::l<span class=\"_ _0\"></span>ist<span class=\"ff2 fc0\">&lt;<span class=\"_ _0\"></span><span class=\"ff3 fc5\">std::<span class=\"_ _0\"></span>share<span class=\"_ _0\"></span>d_ptr<span class=\"ff2 fc0 ws0\">&lt;<span class=\"_ _0\"></span>T&gt;&gt; <span class=\"_ _8\"> </span>&amp;v<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y207 ff2 fs0 fc0 sc0 ls1 ws0\">Sort <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>array (<span class=\"ff3 fc5 ws10\">std::list</span>) <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> objects <span class=\"ls26 ws1c\">by</span> dep<span class=\"_ _0\"></span>th. </span></span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">3.5</div><div class=\"t m3 x1d hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">oper<span class=\"_ _0\"></span>ator&lt;<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e5 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"ff3 fc5 ws10\">operator</span><span class=\"fc0 ls24 ws1d\">&lt;(</span>c<span class=\"_ _3\"></span>onst <span class=\"fc0\">MainObject <span class=\"_ _3\"></span>*a, </span>const <span class=\"fc0\">Ma<span class=\"_ _3\"></span>inObject &amp;b);<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hc y20c ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">operat<span class=\"_ _3\"></span>or<span class=\"ff2 fc0 ls24 ws1d\">&lt;(<span class=\"fc9 ls1 ws0\">const <span class=\"_ _0\"></span><span class=\"fc0\">Mai<span class=\"_ _3\"></span>nObject<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;b, <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">MainObject<span class=\"_ _3\"></span> *<span class=\"_ _0\"></span>a<span class=\"_ _0\"></span>); </span></span></span></span></span></span></div><div class=\"t m0 x7 hc y561 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"ff3 fc5 ws10\">operator</span><span class=\"fc0 ls24 ws1d\">&lt;(</span><span class=\"ff3 fc5 ws10\">s<span class=\"_ _3\"></span>td::share<span class=\"_ _3\"></span>d_ptr</span><span class=\"fc0\">&lt;MainO<span class=\"_ _3\"></span>bject&gt; </span>const<span class=\"_ _3\"></span> <span class=\"fc0\">&amp;a, </span>const<span class=\"_ _3\"></span> <span class=\"fc0\">MainObject <span class=\"_ _3\"></span>&amp;b) </span></div><div class=\"t m0 x7 hc y4a2 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"ff3 fc5 ws10\">operator</span><span class=\"fc0 ls24 ws1d\">&lt;(</span>c<span class=\"_ _3\"></span>onst <span class=\"fc0\">Main<span class=\"_ _3\"></span>Object &amp;b,<span class=\"_ _3\"></span> <span class=\"ff3 fc5 ws10\">std::shared_pt<span class=\"_ _3\"></span>r</span>&lt;MainObject&gt;<span class=\"_ _3\"></span> </span>const <span class=\"fc0\">&amp;a) </span></div><div class=\"t m0 x7 hc y1ea ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y210 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the position <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> object A <span class=\"ls1d ws13\">is</span> less <span class=\"_ _0\"></span>than<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that <span class=\"_ _3\"></span><span class=\"ls1c ws12\">of</span> <span class=\"ls57 ws45\">B,</span> <span class=\"_ _0\"></span><span class=\"ff3\">false <span class=\"_ _3\"></span><span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y562 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y244 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb h2d y4c9 ffc fs4 fc3 sc0 ls1 ws0\">Forms for c<span class=\"_ _0\"></span>ollision m<span class=\"_ _0\"></span>asks<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 h2d y563 ffc fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y564 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/F<span class=\"_ _0\"></span>orm.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m2 xc hc y565 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y565 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y565 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>R<span class=\"_ _3\"></span>ectangle </div><div class=\"t m0 x7 hc y138 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">Rectangle;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hc y566 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y567 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the rectangle <span class=\"_ _0\"></span>col<span class=\"_ _3\"></span>lision mask. These <span class=\"_ _0\"></span>members <span class=\"_ _3\"></span><span class=\"ff3\">m_left, m_top, m_right, m_bottom </span>allows to<span class=\"_ _3\"></span> define <span class=\"_ _0\"></span>the size of </div><div class=\"t m0 x7 hb y568 ff2 fs0 fc0 sc0 ls1 ws0\">the mask. </div><div class=\"t m2 xc hc y2ea ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y2ea ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2ea ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>Ci<span class=\"_ _3\"></span>rcle </div><div class=\"t m0 x7 hc y569 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">Circle;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hc y56a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y4e6 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the cir<span class=\"_ _0\"></span>cle<span class=\"_ _3\"></span> collision mask. These <span class=\"_ _0\"></span>members <span class=\"ff3\">m_x<span class=\"_ _3\"></span>, m_y, m_raduis <span class=\"_ _0\"></span><span class=\"ff2\">all<span class=\"_ _3\"></span>ows to define the <span class=\"_ _0\"></span>position<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>and raduis<span class=\"_ _3\"></span> <span class=\"ls1c\">of </span></span></span></div><div class=\"t m0 x7 hb y56b ff2 fs0 fc0 sc0 ls1 ws0\">the circle. </div><div class=\"t m0 x7 hb y56c ff2 fs0 fc0 sc0 ls1 ws0\">Cir<span class=\"_ _0\"></span>cle(<span class=\"_ _0\"></span>) </div><div class=\"t m0 x7 hc y56d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y56e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y56f ff2 fs0 fc0 sc0 ls1 ws0\">Default <span class=\"_ _0\"></span>constr<span class=\"_ _0\"></span>uct<span class=\"_ _0\"></span>or. </div><div class=\"t m0 x1 hb y570 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y571 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y572 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb h2d y573 ffc fs4 fc3 sc0 ls56 ws46\">The<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>Parent Classes <span class=\"ls58 ws47\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> Ma<span class=\"_ _0\"></span>inOb<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x1 h2d y39d ffc fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y345 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y345 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y345 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _0\"></span>DepthObject </div><div class=\"t m0 x7 hc y574 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">DepthObject;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y575 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Deph<span class=\"_ _0\"></span>Obje<span class=\"_ _0\"></span>ct.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y3bd ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y576 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf37\" class=\"pf w0 h0\" data-page-no=\"37\"><div class=\"pc pc37 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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BwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4A+NuuHeIgDIMBGG0zNG7BcoMlOwASBIogZ+cIJ8BzBwQCzRE4BLdAzDCD3IYBj6V7T7Xyb2q+tACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKRnMvL5h2FIcq4Yo8sNAACEEGKq2fOjLMv6vk9sqKZp8jx3uQEAgOCHJwAAQNrG/tYHAACQNm99AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAOG5qyUAAAIjSURBVABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAIA2T76Jcnu+3OoT5cdquV21RbU+v8lEdLp/9bj/b1ItncXVmAAAwQl3XxRidwx96A4d+q2brH1Y4AAAAAElFTkSuQmCC\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">56<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that provides methods <span class=\"_ _0\"></span><span class=\"ls25 ws1b\">for<span class=\"ls1 ws0\"> managing the display <span class=\"_ _0\"></span>depth <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>objects <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> a s<span class=\"_ _0\"></span>cene<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m0 x1 hb y577 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">1.1</div><div class=\"t m3 x1d hd y1e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e2 ff3 fs0 fc4 sc0 ls1 ws0\">enum <span class=\"_ _0\"></span>Depth </div><div class=\"t m0 x7 hc y207 ff3 fs0 fc5 sc0 ls1 ws0\">enum <span class=\"ff2 fc0\">Depth; </span></div><div class=\"t m0 x7 hc y4bd ff3 fs0 fc0 sc0 ls1 ws0\">En<span class=\"_ _0\"></span>umerat<span class=\"_ _0\"></span>or </div><div class=\"t m0 x7 hb y578 ff2 fs0 fc0 sc0 ls1 ws0\">VER<span class=\"_ _0\"></span>Y_BIG<span class=\"_ _0\"></span>_DEP<span class=\"_ _0\"></span>TH <span class=\"_ _10\"> </span>Very <span class=\"_ _0\"></span>big dep<span class=\"_ _0\"></span>th </div><div class=\"t m0 x7 hb y579 ff2 fs0 fc0 sc0 ls1 ws0\">BIG<span class=\"_ _0\"></span>_DEPT<span class=\"_ _0\"></span>H <span class=\"_ _11\"> </span>Big de<span class=\"_ _0\"></span>pth </div><div class=\"t m0 x7 hb y57a ff2 fs0 fc0 sc0 ls1 ws0\">NOR<span class=\"_ _0\"></span>MAL_D<span class=\"_ _0\"></span>EPTH <span class=\"_ _12\"> </span>Normal <span class=\"_ _0\"></span>dept<span class=\"_ _0\"></span>h </div><div class=\"t m0 x7 hb y57b ff2 fs0 fc0 sc0 ls1 ws0\">SMA<span class=\"_ _0\"></span>LL_D<span class=\"_ _0\"></span>EPTH <span class=\"_ _13\"> </span>Small de<span class=\"_ _0\"></span>pth </div><div class=\"t m0 x7 hb y57c ff2 fs0 fc0 sc0 ls1 ws0\">VER<span class=\"_ _0\"></span>Y_SM<span class=\"_ _0\"></span>ALL_D<span class=\"_ _0\"></span>EPTH <span class=\"_ _14\"> </span>Very <span class=\"_ _0\"></span>small dept<span class=\"_ _0\"></span>h </div><div class=\"t m0 x1 hb y57d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y57e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y57f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y190 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y580 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the depth <span class=\"_ _0\"></span>level <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </span></span></div><div class=\"t m0 x1 hb y581 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y582 ff3 fs0 fc4 sc0 ls1 ws10\">1.2</div><div class=\"t m3 x1d hd y582 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y582 ff3 fs0 fc4 sc0 ls1 ws0\">De<span class=\"_ _0\"></span>pthObj<span class=\"_ _0\"></span>ect </div><div class=\"t m0 x7 hb y583 ff2 fs0 fc0 sc0 ls1 ws10\">DepthObject(<span class=\"fc9 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0\">Depth) </span></span></div><div class=\"t m0 x7 hc y584 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y585 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define a <span class=\"_ _0\"></span>dep<span class=\"_ _0\"></span>th. </div><div class=\"t m0 x1 hb y2c7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2c8 ff3 fs0 fc4 sc0 ls1 ws10\">1.3</div><div class=\"t m3 x1d hd y2c8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2c8 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tDept<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y586 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setDepth(</span>int <span class=\"fc0\">v<span class=\"_ _0\"></span>al)<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x1 hb y587 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y588 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4cf ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y589 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>depth<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the objec<span class=\"_ _0\"></span>t. </span></span></div><div class=\"t m0 x1 hb y2ce ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2cf ff3 fs0 fc4 sc0 ls1 ws10\">1.4</div><div class=\"t m3 x1d hd y2cf ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2cf ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Dept<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y2d0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2d1 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"fc0\">getDepth() </span><span class=\"ws10\">co<span class=\"_ _0\"></span>ns<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x7 hc y58a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y58b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2d4 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>depth <span class=\"ls1c ws12\">of<span class=\"_ _3\"></span></span> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e o<span class=\"_ _0\"></span>bject<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y2a0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2d5 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y2d5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2d5 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _0\"></span>Destructible </div><div class=\"t m0 x7 hc y2d6 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">Destructible;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y58c ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Des<span class=\"_ _0\"></span>truct<span class=\"_ _0\"></span>ible<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y2d8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y58d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y58e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y58f ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that offers <span class=\"_ _0\"></span>methods <span class=\"ls1b ws11\">to</span> manage the destruction <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span><span class=\"ls30 ws25\">an<span class=\"ls1 ws0\"> o<span class=\"_ _0\"></span>bjec<span class=\"_ _0\"></span>t. </span></span></div><div class=\"t m0 x1 hb y590 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2db ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y2db ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2db ff3 fs0 fc4 sc0 ls1 ws0\">Des<span class=\"_ _0\"></span>truct<span class=\"_ _0\"></span>ible<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y591 ff2 fs0 fc0 sc0 ls1 ws0\">De<span class=\"_ _0\"></span>struct<span class=\"_ _0\"></span>ible<span class=\"_ _0\"></span>() </div><div class=\"t m0 x7 hc y2de ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y592 ff2 fs0 fc0 sc0 ls1 ws0\">Default <span class=\"_ _0\"></span>constr<span class=\"_ _0\"></span>uct<span class=\"_ _0\"></span>or. </div><div class=\"t m2 xc hc y593 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y593 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y593 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tDest<span class=\"_ _0\"></span>royed </div><div class=\"t m0 x7 hc y594 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0\">s<span class=\"_ _3\"></span>etDestroyed()<span class=\"_ _3\"></span> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf38\" class=\"pf w0 h0\" data-page-no=\"38\"><div class=\"pc pc38 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbsRGAMAwEQcTQ/6hivQOqQOx24B8lF7iSXAAAACx1mwAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFTfR9RG3e2yAQCA1/Pz98+MIwAAABarJFYAAADYyr8+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUH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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">57<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Starts the <span class=\"_ _0\"></span>destruction of an ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">isD<span class=\"_ _0\"></span>estroy<span class=\"_ _0\"></span>ed<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"fc0\">isDestroyed() </span><span class=\"ws10\">c<span class=\"_ _0\"></span>on<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>state <span class=\"ls1c ws12\">of</span> the ob<span class=\"_ _0\"></span>ject. </span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1a\">3.</div><div class=\"t m3 xd hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20d ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>Vi<span class=\"_ _3\"></span>sibility </div><div class=\"t m0 x7 hc y20e ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">Visibility; </span></div><div class=\"t m0 x7 hb y294 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Vi<span class=\"_ _0\"></span>sibili<span class=\"_ _0\"></span>ty.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y24b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y38d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y38e ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that offers me<span class=\"_ _0\"></span>thods <span class=\"ls1b ws11\">to</span> manage the <span class=\"_ _0\"></span>visibility <span class=\"ls1c ws12\">of</span> <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m2 xc hc ye8 ff3 fs0 fc4 sc0 ls1 ws10\">3.1</div><div class=\"t m3 x1d hd ye8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ye8 ff3 fs0 fc4 sc0 ls1 ws10\">Vis<span class=\"_ _0\"></span>ibil<span class=\"_ _0\"></span>ity<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y213 ff3 fs0 fc5 sc0 ls1 ws0\">explicit <span class=\"_ _0\"></span><span class=\"ff2 fc0 ws10\">Visibility(<span class=\"fc9 ws0\">bool<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">defaultVisibility <span class=\"_ _0\"></span>= <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">true<span class=\"ff2 fc0 ls2b ws0\">) </span></span></span></span></span></div><div class=\"t m0 x7 hc y24c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y595 ff2 fs0 fc0 sc0 ls1 ws0\">Class const<span class=\"_ _0\"></span>ruct<span class=\"_ _0\"></span>or. </div><div class=\"t m2 xc hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">3.2</div><div class=\"t m3 x1d hd y216 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tVisib<span class=\"_ _0\"></span>le<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc yc1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f5 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setVisible(<span class=\"fc9 ws0\">bool <span class=\"fc0\">value<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x1 hb y1f6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f7 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2ea ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>visi<span class=\"_ _3\"></span>bility <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m2 xc hc y1fa ff3 fs0 fc4 sc0 ls1 ws10\">3.3</div><div class=\"t m3 x1d hd y1fa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1fa ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Visib<span class=\"_ _0\"></span>le </div><div class=\"t m0 x7 hb ya1 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etVisible()<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"fc9\">const<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc y395 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y21a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>state <span class=\"ls1c ws12\">of</span> the ob<span class=\"_ _0\"></span>ject. </span></div><div class=\"t m0 x1 hb y21b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y93 ff3 fs0 fc4 sc0 ls1a\">4.</div><div class=\"t m3 xd hd y93 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y93 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>H<span class=\"_ _3\"></span>ealth </div><div class=\"t m0 x7 hc y1fe ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">Health;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y21e ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Hea<span class=\"_ _0\"></span>lth.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y4a8 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y239 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y23a ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that provides methods <span class=\"ls25 ws1b\">for</span> <span class=\"_ _0\"></span>managing<span class=\"_ _3\"></span> the <span class=\"_ _0\"></span>health <span class=\"ls1c ws12\">of</span> <span class=\"ls30 ws25\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> o<span class=\"_ _0\"></span>bject<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y432 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y202 ff3 fs0 fc4 sc0 ls1 ws10\">4.1</div><div class=\"t m3 x1d hd y202 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y202 ff3 fs0 fc4 sc0 ls1 ws10\">Hea<span class=\"_ _0\"></span>lth<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y596 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y596 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y596 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _2\"></span>form<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hb y49f ff2 fs0 fc0 sc0 ls1 ws10\">Health(<span class=\"fc9 ws0\">int <span class=\"fc0\">health)<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc y4a0 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf39\" class=\"pf w0 h0\" data-page-no=\"39\"><div class=\"pc pc39 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzawQ3AIAwEwTi1unB3cmmCB7FmSjjgsRKV5AEAAGCp1wQAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4TAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANXHQt1dHDIzbhQAAP9VSaywj2M9+UiqjAAAgOoDAADgRn54AgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">58<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>cla<span class=\"_ _3\"></span>ss takes <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>a parameter the health <span class=\"ls1b ws11\">to</span> <span class=\"ls22 ws19\">be<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> attributed <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the object. Here the maximum health value is </span></span></span></span></div><div class=\"t m0 x7 hb y71 ff2 fs0 fc0 sc0 ls1 ws0\">equal to the defined h<span class=\"_ _3\"></span>ealth. </div><div class=\"t m2 xc h13 y372 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y372 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y372 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y597 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y598 ff2 fs0 fc0 sc0 ls1 ws10\">Health(<span class=\"fc9 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0\">heal<span class=\"_ _3\"></span>th, <span class=\"fc9\">int </span>m<span class=\"_ _0\"></span>axHeal<span class=\"_ _0\"></span>th) </span></span></div><div class=\"t m0 x7 hc y1b6 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y599 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y59a ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>constructor takes <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>a parameter the <span class=\"_ _0\"></span>heal<span class=\"_ _3\"></span>th <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span><span class=\"ls22 ws19\">be<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>ass<span class=\"_ _3\"></span>igned <span class=\"ls1b ws11\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the object <span class=\"_ _0\"></span>and the maximum valu<span class=\"_ _0\"></span>e. </span></span></span></span></div><div class=\"t m0 x1 hb y1b9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y59b ff3 fs0 fc4 sc0 ls1 ws10\">4.2</div><div class=\"t m3 x1d hd y59b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y59b ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tHeal<span class=\"_ _0\"></span>th<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y59c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setHealth(</span>int <span class=\"fc0\">v<span class=\"_ _0\"></span>al)<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x1 hb y1bc ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y59d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y59e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y59f ff2 fs0 fc0 sc0 ls1 ws0\">Define the <span class=\"_ _0\"></span>health <span class=\"ls1c ws12\">of<span class=\"_ _3\"></span></span> the <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m0 x1 hb y5a0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5a1 ff3 fs0 fc4 sc0 ls1 ws10\">4.3</div><div class=\"t m3 x1d hd y5a1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5a1 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tMaxHe<span class=\"_ _0\"></span>alth<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y30b ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setMaxHeal<span class=\"_ _3\"></span>th(<span class=\"fc9 ws0\">int<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">va<span class=\"_ _0\"></span>l) </span></span></span></span></div><div class=\"t m0 x1 hb y5a2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5a3 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5a4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y5a5 ff2 fs0 fc0 sc0 ls1 ws0\">Defines the <span class=\"_ _0\"></span>maximum<span class=\"_ _3\"></span> he<span class=\"_ _0\"></span>alth<span class=\"_ _3\"></span> (the <span class=\"_ _0\"></span>limit<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>not <span class=\"_ _3\"></span><span class=\"ls1b ws11\">to</span> <span class=\"ls26 ws1c\">be</span> e<span class=\"_ _0\"></span>xceed<span class=\"_ _3\"></span>ed) <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the obj<span class=\"_ _0\"></span>ect. </div><div class=\"t m0 x1 hb y5a6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5a7 ff3 fs0 fc4 sc0 ls1 ws10\">4.4</div><div class=\"t m3 x1d hd y5a7 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5a7 ff3 fs0 fc4 sc0 ls1 ws10\">add<span class=\"_ _0\"></span>Healt<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y5a8 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">addHeal<span class=\"_ _3\"></span>th(<span class=\"fc9 ws0\">int <span class=\"fc0\">val = <span class=\"_ _0\"></span><span class=\"fcc ws10\">1<span class=\"fc0 ws0\">)<span class=\"_ _0\"></span> </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y5a9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5aa ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5ab ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y5ac ff2 fs0 fc0 sc0 ls1 ws0\">Add health <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> the object. Can also <span class=\"_ _0\"></span><span class=\"ls26 ws1c\">be<span class=\"ls1 ws0\"> used <span class=\"ls1b ws11\">to</span> retake<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">if<span class=\"ls1 ws0\"> you put a negative va<span class=\"_ _0\"></span>lue. </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y5ad ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5ae ff3 fs0 fc4 sc0 ls1 ws10\">4.5</div><div class=\"t m3 x1d hd y5ae ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5ae ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Heal<span class=\"_ _0\"></span>th<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y5af ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"fc0\">getHealth() </span><span class=\"ws10\">co<span class=\"_ _0\"></span>ns<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y5b0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5b1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5b2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5b3 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the he<span class=\"_ _0\"></span>alth<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the obje<span class=\"_ _0\"></span>ct. </span></div><div class=\"t m0 x1 hb y5b4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5b5 ff3 fs0 fc4 sc0 ls1 ws10\">4.6</div><div class=\"t m3 x1d hd y5b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5b5 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>MaxHe<span class=\"_ _0\"></span>alth<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y5b6 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"fc0\">getMaxHealth() </span><span class=\"ws10\">c<span class=\"_ _0\"></span>on<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y5b7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5b8 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5b9 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5ba ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>maximum<span class=\"_ _3\"></span> health (the limit <span class=\"_ _0\"></span>not <span class=\"ls1b ws11\">to</span> <span class=\"ls26 ws1c\">be</span> exceeded) <span class=\"ls1c ws12\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y5bb ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5bc ff3 fs0 fc4 sc0 ls1a\">5.</div><div class=\"t m3 xd hd y5bc ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5bc ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>Hu<span class=\"_ _3\"></span>rtEffect </div><div class=\"t m0 x7 hc y5bd ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">HurtEffect;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y5be ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Hurt<span class=\"_ _0\"></span>Effe<span class=\"_ _0\"></span>ct.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y5bf ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5c0 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5c1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb yde ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> that <span class=\"_ _0\"></span>offers methods <span class=\"ls1b ws11\">to</span> make <span class=\"ls23 ws1a\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> invulnerability effec<span class=\"_ _3\"></span>t <span class=\"ls1c ws12\">on</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object. That is, make the <span class=\"_ _0\"></span>object blink for a certain<span class=\"_ _3\"></span> time </span></span></span></span></div><div class=\"t m0 x7 hb y5c2 ff2 fs0 fc0 sc0 ls1 ws0\">(e.g. when the player<span class=\"_ _3\"></span> is attacked by<span class=\"_ _3\"></span> an enemy he <span class=\"_ _3\"></span>becomes invulnerable by <span class=\"_ _3\"></span>blinking for a limited tim<span class=\"_ _3\"></span>e).<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y5c3 ff3 fs0 fc4 sc0 ls1 ws10\">5.1</div><div class=\"t m3 x1d hd y5c3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5c3 ff3 fs0 fc4 sc0 ls1 ws10\">Hur<span class=\"_ _0\"></span>tEffe<span class=\"_ _0\"></span>ct<span class=\"fc0 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3a\" class=\"pf w0 h0\" data-page-no=\"3a\"><div class=\"pc pc3a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzZQQ3AMAwEwbgqEPMnZSgXFP24Mwx8ymeVSnIAAABY6jEBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqMwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+EwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAfOj9+f1Vte+omelujxsAADj++gAAAHarJFYAAADYyl8fAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVN9tvw5tGISiMIzyEnRtbTcgYYBKKlANEotrmADPDghEdUfoEGxRCwb5khq6QB3hHHWv/d0HAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AZdmQZUAAABuSURBVAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCP9HfkxTi9myS59KelvC1ZXQ1r/qm75/Y/2vO9uc7Zy2YAAHBAMcYQgh126AuJIiskQ7D1egAAAABJRU5ErkJggg==\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">59<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Hur<span class=\"_ _0\"></span>tEffe<span class=\"_ _0\"></span>ct(s<span class=\"_ _0\"></span>f::Spr<span class=\"_ _0\"></span>ite <span class=\"_ _9\"></span>&amp;sprP<span class=\"_ _0\"></span>arent<span class=\"_ _0\"></span>) <span class=\"_ _9\"></span>:<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y577 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b4 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>constructor takes as <span class=\"_ _0\"></span>pa<span class=\"_ _3\"></span>rameter the <span class=\"_ _0\"></span>sprite <span class=\"ls1c ws12\">on</span> <span class=\"_ _0\"></span>which the <span class=\"_ _0\"></span>invul<span class=\"_ _3\"></span>nerability effect wi<span class=\"_ _0\"></span>ll<span class=\"_ _3\"></span> be effe<span class=\"_ _0\"></span>cted. </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">5.2</div><div class=\"t m3 x1d hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">hur<span class=\"_ _0\"></span>tSte<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">hurtStep(<span class=\"fc9 ws0\">floa<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span>const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">&amp;DELT<span class=\"_ _0\"></span>A_TIM<span class=\"_ _0\"></span>E) </span></span></span></div><div class=\"t m0 x1 hb y5c4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20d ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>make the <span class=\"_ _0\"></span>invulnerability<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>anima<span class=\"_ _0\"></span>tion. </div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">5.3</div><div class=\"t m3 x1d hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tIsH<span class=\"_ _0\"></span>urt<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ea ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setIsHurt(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"fc0\">durration <span class=\"_ _0\"></span>=<span class=\"_ _3\"></span> <span class=\"fcc ws10\">1<span class=\"_ _0\"></span>00.f<span class=\"fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5c5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y5c6 ff2 fs0 fc0 sc0 ls1 ws0\">Defines <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>duration (in millisecond) of<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the ob<span class=\"_ _0\"></span>ject&apos;s<span class=\"_ _3\"></span> i<span class=\"_ _0\"></span>nvuln<span class=\"_ _0\"></span>erabi<span class=\"_ _0\"></span>lity<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y245 ff3 fs0 fc4 sc0 ls1 ws10\">5.4</div><div class=\"t m3 x1d hd y245 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y245 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>IsHurt<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y246 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etIsHurt() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></div><div class=\"t m0 x7 hc y247 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc ybf ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the object <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>invul<span class=\"_ _3\"></span>nerable, <span class=\"ff3\">false </span><span class=\"ls1f ws16\">if<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> no<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x1 hb y1f2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f3 ff3 fs0 fc4 sc0 ls1a\">6.</div><div class=\"t m3 xd hd y1f3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1f3 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>Sco<span class=\"_ _3\"></span>rePoint </div><div class=\"t m0 x7 hc y217 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">ScorePoint;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y4ad ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Sco<span class=\"_ _0\"></span>rePoi<span class=\"_ _0\"></span>nt.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y1f8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2ea ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4ae ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> that <span class=\"_ _0\"></span>offers methods <span class=\"ls25 ws1b\">for</span> managing the <span class=\"_ _0\"></span>sco<span class=\"_ _3\"></span>re <span class=\"ls1b ws11\">to</span> be assigned <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object (e.g. each enemy <span class=\"_ _0\"></span>has a particular score </span></span></div><div class=\"t m0 x7 hb y5c7 ff2 fs0 fc0 sc0 ls1 ws0\">point when it is create<span class=\"_ _3\"></span>d which is added to<span class=\"_ _3\"></span> the player&apos;s o<span class=\"_ _3\"></span>verall score when he is d<span class=\"_ _3\"></span>efeated).<span class=\"_ _b\"></span> </div><div class=\"t m2 xc hc y3ac ff3 fs0 fc4 sc0 ls1 ws10\">6.1</div><div class=\"t m3 x1d hd y3ac ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y3ac ff3 fs0 fc4 sc0 ls1 ws10\">Sco<span class=\"_ _0\"></span>rePoin<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y494 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y495 ff3 fs0 fce sc0 ls1 ws0\">explicit <span class=\"ff2 fc0 ws10\">ScorePoint(<span class=\"fc9 ws0\">int <span class=\"fc0\">point = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x7 hc y496 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5c8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y5c9 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>constructor, takes <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>a parameter the <span class=\"_ _0\"></span>point<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> assign <span class=\"ls1e ws14\">to</span> <span class=\"_ _0\"></span>the object<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y262 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5ca ff3 fs0 fc4 sc0 ls1 ws10\">6.2</div><div class=\"t m3 x1d hd y5ca ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5ca ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tScor<span class=\"_ _0\"></span>ePoint<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y49a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y571 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setScor<span class=\"_ _3\"></span>ePoint(<span class=\"fc9 ws0\">i<span class=\"_ _3\"></span>nt <span class=\"_ _0\"></span><span class=\"fc0\">poin<span class=\"_ _0\"></span>t) </span></span></span></span></div><div class=\"t m0 x1 hb y5cb ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5cc ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y5cd ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>object score p<span class=\"_ _0\"></span>oint. </div><div class=\"t m0 x1 hb y5ce ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5cf ff3 fs0 fc4 sc0 ls1 ws10\">6.3</div><div class=\"t m3 x1d hd y5cf ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5cf ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Scor<span class=\"_ _0\"></span>ePoint<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y5d0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5d1 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"fc0\">getScorePoint() </span><span class=\"ws10\">co<span class=\"_ _0\"></span>ns<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x7 hc y5d2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3b\" class=\"pf w0 h0\" data-page-no=\"3b\"><div class=\"pc pc3b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUH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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">60<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>score point assigned <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the obje<span class=\"_ _0\"></span>ct. </span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e2 ff3 fs0 fc4 sc0 ls1a\">7.</div><div class=\"t m3 xd hd y1e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e2 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>St<span class=\"_ _3\"></span>ep </div><div class=\"t m0 x7 hc y207 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">Step; </span></div><div class=\"t m0 x7 hb y300 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Ste<span class=\"_ _0\"></span>p.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y43a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y5d3 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> that <span class=\"_ _0\"></span>offers methods <span class=\"ls1b ws11\">to</span> manage the <span class=\"_ _0\"></span>diff<span class=\"_ _3\"></span>erent steps <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ls23 ws1a\">an</span> obje<span class=\"_ _0\"></span>ct (e.g. <span class=\"ls1b ws11\">to</span> take off a rocket you have <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span><span class=\"ls59 ws48\">go<span class=\"ls1 ws0\"> through </span></span></span></span></div><div class=\"t m0 x7 hb y57a ff2 fs0 fc0 sc0 ls1 ws0\">several steps).<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y303 ff3 fs0 fc4 sc0 ls1 ws10\">7.1</div><div class=\"t m3 x1d hd y303 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y303 ff3 fs0 fc4 sc0 ls1 ws10\">St<span class=\"_ _0\"></span>ep<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y3f3 ff3 fs0 fce sc0 ls1 ws0\">explicit <span class=\"ff2 fc0 ws10\">Step(<span class=\"fc9 ws0\">int <span class=\"fc0\">step <span class=\"_ _0\"></span>= <span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x1 hb y305 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y306 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y470 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2c2 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>con<span class=\"_ _0\"></span>stru<span class=\"_ _0\"></span>ctor<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y5d4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y3fa ff3 fs0 fc4 sc0 ls1 ws10\">7.2</div><div class=\"t m3 x1d hd y3fa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y3fa ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tSte<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y5d5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3fd ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setStep(<span class=\"fc9 ws0\">in<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span><span class=\"fc0\">val<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x7 hc yc6 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5d6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y30e ff2 fs0 fc0 sc0 ls1 ws0\">Defines the step <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x1 hb y29a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y30f ff3 fs0 fc4 sc0 ls1 ws10\">7.3</div><div class=\"t m3 x1d hd y30f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y30f ff3 fs0 fc4 sc0 ls1 ws0\">add<span class=\"_ _0\"></span>Step </div><div class=\"t m0 x7 hc y5d7 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0\">a<span class=\"_ _3\"></span>ddStep() </span></span></div><div class=\"t m0 x7 hc y405 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y5d8 ff2 fs0 fc0 sc0 ls1 ws0\">Advance <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>object s<span class=\"_ _0\"></span>tep<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y5d9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5da ff3 fs0 fc4 sc0 ls1 ws10\">7.4</div><div class=\"t m3 x1d hd y5da ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5da ff3 fs0 fc4 sc0 ls1 ws0\">re<span class=\"_ _0\"></span>duceSt<span class=\"_ _0\"></span>ep </div><div class=\"t m0 x7 hc y5db ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0\">reduceStep() </span></span></div><div class=\"t m0 x7 hc y492 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y315 ff2 fs0 fc0 sc0 ls1 ws0\">Reduce <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>object st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p. </div><div class=\"t m0 x1 hb y25d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y60 ff3 fs0 fc4 sc0 ls1 ws10\">7.5</div><div class=\"t m3 x1d hd y60 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y60 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Ste<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y5dc ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getStep() <span class=\"fc9 ws10\">co<span class=\"_ _0\"></span>ns<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y5c8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5c9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y499 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y263 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>step <span class=\"ls23 ws1a\">at</span> <span class=\"_ _0\"></span>which the object i<span class=\"_ _0\"></span>s<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y5dd ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5de ff3 fs0 fc4 sc0 ls1a\">8.</div><div class=\"t m3 xd hd y5de ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5de ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _0\"></span>Name </div><div class=\"t m0 x7 hc y5cc ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">Name;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y5df ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Name<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y26a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y26b ff2 fs0 fc0 sc0 ls1 ws0\">Parent class <span class=\"_ _0\"></span>that provides methods <span class=\"ls25 ws1b\">for</span> <span class=\"_ _0\"></span>managing<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the name <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ls23 ws1a\">an</span> ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y5e0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5e1 ff3 fs0 fc4 sc0 ls1 ws10\">8.1</div><div class=\"t m3 x1d hd y5e1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5e1 ff3 fs0 fc4 sc0 ls1 ws10\">Na<span class=\"_ _0\"></span>me<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y4a0 ff3 fs0 fc5 sc0 ls1 ws0\">explicit <span class=\"_ _0\"></span><span class=\"ff2 fc0 ws10\">Name(<span class=\"fc9 ws0\">c<span class=\"_ _3\"></span>onst </span><span class=\"ff3 fc5\">std::string<span class=\"_ _3\"></span></span><span class=\"ws0\">&amp; <span class=\"_ _0\"></span>name = <span class=\"_ _0\"></span><span class=\"ff3 fc7 ws10\">&quot;Unkn<span class=\"_ _0\"></span>own&quot;<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws0\">) </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3c\" class=\"pf w0 h0\" data-page-no=\"3c\"><div class=\"pc pc3c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzZUQ0AIQxEQXo5IfVvqlIWH2XGQTf8vFBJDgAAAEt9JgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ZkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANVnAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUnwkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAA4Fn/4/dX1b6jZqa7PW4AAOD46wMAANitklgBAABgK399AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD5u+3VowyAUhWGUl6Bra7sBCQNUUoFqkFhcwwR4dkAgqjtCh2CLWjDIl9TQHUo4R91rf/cBAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqrBLD58AAABrSURBVA8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAP8q/R15MU7vJkku/Wkpb0tWV8Oaf+ruuf2P9nxvrnP2shkAABxQjDGEYIcd+gJTriskalZ/aQAAAABJRU5ErkJggg==\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">61<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the <span class=\"_ _0\"></span>name<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the obje<span class=\"_ _0\"></span>ct. </span></span></div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">8.2</div><div class=\"t m3 x1d hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tName<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">setName(</span>const <span class=\"ff3 fc5 ws10\">std::string</span><span class=\"fc0\">&amp; sound<span class=\"_ _0\"></span>Name<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2b5 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> define <span class=\"_ _0\"></span>the name <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">8.3</div><div class=\"t m3 x1d hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Name<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y20e ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"ff3 fc5\">std::string <span class=\"_ _0\"></span><span class=\"ff2 fc0\">getName()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5\">noexcept </span></span></span></span></span></div><div class=\"t m0 x7 hc y20f ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y210 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>name <span class=\"ls1c ws12\">of<span class=\"_ _3\"></span></span> the <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </span></div><div class=\"t m2 xc hc y243 ff3 fs0 fc4 sc0 ls1a\">9.</div><div class=\"t m3 xd hd y243 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y243 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>FileP<span class=\"_ _3\"></span>ath </div><div class=\"t m0 x7 hc y245 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">FilePath;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y298 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Fi<span class=\"_ _0\"></span>lePath<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y48f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f1 ff2 fs0 fc0 sc0 ls1 ws0\">Parent class <span class=\"_ _0\"></span>that provides methods <span class=\"ls25 ws1b\">for</span> <span class=\"_ _0\"></span>ma<span class=\"_ _3\"></span>naging the <span class=\"_ _0\"></span>path <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>a fi<span class=\"_ _0\"></span>le. </div><div class=\"t m2 xc hc ybf ff3 fs0 fc4 sc0 ls1 ws10\">9.1</div><div class=\"t m3 x1d hd ybf ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ybf ff3 fs0 fc4 sc0 ls1 ws10\">Fil<span class=\"_ _0\"></span>ePat<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1f2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f3 ff2 fs0 fc0 sc0 ls1 ws10\">FilePath(<span class=\"fc9 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">&amp; <span class=\"_ _0\"></span>file<span class=\"_ _0\"></span>Path) </span></span></span></div><div class=\"t m0 x1 hb y1f4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y217 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f7 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the class, <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"ls1 ws0\"> takes <span class=\"ls23 ws1a\">as</span> parameter the path <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>file <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m0 x1 hb y392 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2ea ff3 fs0 fc4 sc0 ls1 ws10\">9.2</div><div class=\"t m3 x1d hd y2ea ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2ea ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tFile<span class=\"_ _0\"></span>Path<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y219 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etFilePath(<span class=\"fc9 ws0\">con<span class=\"_ _3\"></span>st <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp;<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>file<span class=\"_ _0\"></span>Path<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 hb y393 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ya1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y249 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> define <span class=\"_ _0\"></span>the file p<span class=\"_ _0\"></span>ath<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y396 ff3 fs0 fc4 sc0 ls1 ws10\">9.3</div><div class=\"t m3 x1d hd y396 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y396 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>FileP<span class=\"_ _0\"></span>ath<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y397 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ya5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5\">std::string<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 fc0\">getFil<span class=\"_ _3\"></span>ePath() <span class=\"fc9\">con<span class=\"_ _0\"></span>st <span class=\"_ _3\"></span><span class=\"ff3 fc5 ws10\">noe<span class=\"_ _0\"></span>xcept<span class=\"fc0 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 hc y37f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y398 ff3 fs0 fca sc0 ls1 ws0\">Source Code </div><div class=\"t m0 x7 hc y39a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">file <span class=\"_ _2\"></span>path.<span class=\"_ _3\"></span> </span></div><div class=\"t m2 xc hc y96 ff3 fs0 fc4 sc0 ls1 ws10\">9.4</div><div class=\"t m3 x1d hd y96 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y96 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>FileI<span class=\"_ _0\"></span>sLoa<span class=\"_ _0\"></span>ded<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y430 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y201 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">getFileIsLoade<span class=\"_ _3\"></span>d() <span class=\"_ _0\"></span><span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>s<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y98 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y384 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2\">when the <span class=\"_ _0\"></span>file has been loaded <span class=\"_ _0\"></span><span class=\"ff3\">false <span class=\"ff2\">othe<span class=\"_ _0\"></span>rwise. </span></span></span></span></div><div class=\"t m2 xc hc y5e3 ff3 fs0 fc4 sc0 ls1a\">10.</div><div class=\"t m3 x1d hd y5e3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5e3 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>T<span class=\"_ _3\"></span>ype </div><div class=\"t m0 x7 hc y5e4 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">Type;<span class=\"_ _3\"></span> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3d\" class=\"pf w0 h0\" data-page-no=\"3d\"><div class=\"pc pc3d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcsWsTUQDH8fcklNIKFjy6CO0sUjqIOJZu4lD6B3R0EZX8A/EPkIxi966SUYcKLi6C4CbaTopFaLhKsZAQo8lzCAQHN/XovXw+U7jt/bjly+UuppQCAAAAmbpgAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAABTjRk/f4wxv0OVZVkUhZsbAABQfWE8HrsJAACAjMWUkhUAAABy5b0+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg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AABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqD9FXkJ8AAAGASURBVAAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAA4HH1Ne0SERGfqShTH7F18/odr70PdZX6eKecs6sBAP7c8aM8y50TPXNfKxz56eUAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">62<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/pa<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>s/Type<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x1 hb y5e5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y2e3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5e6 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y207 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y2ff ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1b5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5e7 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5d3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5e8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y43d ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5e9 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5ea ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5eb ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5ec ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5ed ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5ee ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5ef ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f0 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb ye6 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1ec ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f1 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f2 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f4 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb yea ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f6 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f7 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y35f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y360 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb yf8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5f9 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5fa ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5fb ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5fc ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y5fd ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3dd ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3de ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y3df ff2 fs0 fc0 sc0 ls1 ws0\">This Class allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>draw a Sprite <span class=\"ls23 ws1a\">as</span> a <span class=\"_ _0\"></span>backgrou<span class=\"_ _3\"></span>nd, with the <span class=\"_ _0\"></span>possibility<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> using <span class=\"_ _0\"></span><span class=\"ls1f ws16\">it<span class=\"ls1 ws0\"> to fill a scene <span class=\"_ _0\"></span>and <span class=\"ls1b ws11\">to</span> scroll it with </span></span></div><div class=\"t m0 x7 hb y5fe ff2 fs0 fc0 sc0 ls1 ws0\">horizontal and vertica<span class=\"_ _3\"></span>l speed. </div><div class=\"t m2 xc hc y5ff ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y5ff ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5ff ff3 fs0 fc4 sc0 ls1 ws0\">Public <span class=\"_ _0\"></span>metho<span class=\"_ _0\"></span>ds<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y5b6 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y5b6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5b6 ff3 fs0 fc4 sc0 ls1 ws10\">Ba<span class=\"_ _0\"></span>ckgrou<span class=\"_ _0\"></span>nd<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y5b7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5b8 ff2 fs0 fc0 sc0 ls1 ws0\">Background(sf::Textu<span class=\"_ _3\"></span>re &amp;tex, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> </span>float <span class=\"_ _0\"></span><span class=\"fc0 ls51 ws43\">y,<span class=\"ls1 ws0\"> <span class=\"ff3 fc5 ws10\">is::</span>Gam<span class=\"_ _3\"></span>eDisplay<span class=\"_ _3\"></span> *<span class=\"_ _0\"></span>scene,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">hSpeed = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0.f<span class=\"fc0 ws0\">, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">vSp<span class=\"_ _3\"></span>eed = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0.<span class=\"_ _0\"></span>f<span class=\"fc0 ws0\">,<span class=\"_ _0\"></span> </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y5b9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x34 hc y5ba ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">fillHo<span class=\"_ _3\"></span>rizontal = <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">true<span class=\"ff2 fc0 ws0\">,<span class=\"_ _3\"></span> <span class=\"fc9\">bool </span>fillVertical = </span>tr<span class=\"_ _0\"></span>ue<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws0\">) </span></span></span></div><div class=\"t m0 x1 hb y5bb ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y600 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y601 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>cla<span class=\"_ _3\"></span>ss, <span class=\"ls1d ws13\">it</span> takes <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>parameters the texture, the position, the scene, the horizontal and <span class=\"_ _0\"></span>vertical<span class=\"_ _3\"></span> scrolling </div><div class=\"t m0 x7 hb y602 ff2 fs0 fc0 sc0 ls1 ws0\">speed and the two othe<span class=\"_ _3\"></span>r parameters which a<span class=\"_ _3\"></span>re used to ma<span class=\"_ _3\"></span>ke horizontal and v<span class=\"_ _3\"></span>ertical filling.<span class=\"_ _b\"></span> </div><div class=\"t m2 xc hc y603 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y603 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y603 ff3 fs0 fc4 sc0 ls1 ws10\">st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y604 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4e0 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">st<span class=\"_ _3\"></span>ep(<span class=\"fc9 ws0\">float const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _0\"></span>_TI<span class=\"_ _0\"></span>ME) </span></span></span></div><div class=\"t m0 x1 hb y3b4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y605 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y5c3 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>update the obje<span class=\"_ _0\"></span>ct. </div></div><div class=\"c x7 y606 w12 h2e\"><div class=\"t m0 x0 hc y607 ff2 fs0 fc0 sc0 ls1 ws0\">Parent class <span class=\"_ _0\"></span>that offers m<span class=\"_ _3\"></span>ethods <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>manage<span class=\"_ _3\"></span> the type <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>a class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>based <span class=\"ls1c ws12\">on</span> <span class=\"ls30 ws25\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ff3 fc5 ws10\">en<span class=\"_ _0\"></span>um<span class=\"ff2 fc0 ws0\">. </span></span></span></span></span></span></div></div><div class=\"c xc y608 w13 h2e\"><div class=\"t m0 x0 hc y469 ff3 fs0 fc4 sc0 ls1 ws10\">1<span class=\"_ _0\"></span>0.1<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div></div><div class=\"c x20 y608 w14 h2e\"><div class=\"t m0 x0 hc y469 ff3 fs0 fc4 sc0 ls1 ws10\">Ty<span class=\"_ _0\"></span>pe<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div></div><div class=\"c x7 y609 w15 h2f\"><div class=\"t m0 x0 hb y60a ff2 fs0 fc0 sc0 ls1 ws10\">Type(<span class=\"fc9 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0\">type<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x0 hb y60b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y60c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y20a ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y609 w15 h2f\"><div class=\"t m0 x0 hc y462 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y463 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>class,<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span>takes the type (<span class=\"ff3 fc5\">enum <span class=\"_ _0\"></span>value<span class=\"_ _3\"></span><span class=\"ff2 fc0\">) <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> p<span class=\"_ _0\"></span>aramete<span class=\"_ _0\"></span>r. </span></span></span></span></div></div><div class=\"c xc y60d w13 h2e\"><div class=\"t m0 x0 hc y469 ff3 fs0 fc4 sc0 ls1 ws10\">1<span class=\"_ _0\"></span>0.2<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div></div><div class=\"c x20 y60d w16 h2e\"><div class=\"t m0 x0 hc y469 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tType<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x7 y60e w17 h30\"><div class=\"t m0 x0 hc y60a ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ws10\">setTyp<span class=\"_ _3\"></span>e(<span class=\"fc9 ws0\">int <span class=\"fc0\">t<span class=\"_ _0\"></span>yp<span class=\"_ _0\"></span>e)<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x0 hb y60f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y610 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y1ea ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y60e w17 h30\"><div class=\"t m0 x0 h1a y611 ff3 fsa fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y612 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> define <span class=\"_ _0\"></span>the type <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>objec<span class=\"_ _0\"></span>t. </div></div><div class=\"c xc y613 w13 h2e\"><div class=\"t m0 x0 hc y614 ff3 fs0 fc4 sc0 ls1 ws10\">1<span class=\"_ _0\"></span>0.3<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div></div><div class=\"c x20 y613 w18 h2e\"><div class=\"t m0 x0 hc y614 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Type<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x7 y615 w19 h31\"><div class=\"t m0 x0 hc y616 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">getType() <span class=\"fc9 ws10\">c<span class=\"_ _0\"></span>on<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x0 hb y617 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y618 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y213 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y615 w19 h31\"><div class=\"t m0 x0 hc y619 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y61a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>type <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </span></div></div><div class=\"c x2e y61b w1a h32\"><div class=\"t m0 x0 h2d y61a ffc fs4 fc3 sc0 ls1 ws0\">The Ba<span class=\"_ _0\"></span>ckgr<span class=\"_ _0\"></span>oud<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div></div><div class=\"c x23 y61c w1b h33\"><div class=\"t m0 x2a hc y61d ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>B<span class=\"_ _3\"></span>ackground </div><div class=\"t m0 x0 hc y409 ff3 fs0 fc5 sc0 ls1 ws0\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hb y61e ff2 fs0 fc0 sc0 ls1 ws0\">Background;<span class=\"_ _3\"></span> </div></div><div class=\"c x23 y61c w1b h33\"><div class=\"t m0 x0 hb y61f ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/B<span class=\"_ _0\"></span>ackg<span class=\"_ _0\"></span>round.h<span class=\"fc0 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3e\" class=\"pf w0 h0\" data-page-no=\"3e\"><div class=\"pc pc3e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACsRWmCLEWEERaUUjICAABrfc3KgyzVdX0+n+2wiOPx2DSNHQAAUH0AAADcHf/6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AACAn/br2AYgMIrCaN4EQqW1giFMIMYwg4odJFq9Eaxgjn8HSqUa53S3vtWn+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+u46u5gAAADmSURBVAAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAAB+X311s0RERDVl+dFFbO28jsO9974sji7eKaXkagCAnzs/yrM8uQCSGjDoxsiWqQAAAABJRU5ErkJggg==\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">63<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb h2d y620 ffc fs4 fc3 sc0 ls1 ws49\">Butt<span class=\"_ _0\"></span>on<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 h2d y621 ffc fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y622 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y622 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y622 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>Bu<span class=\"_ _3\"></span>tton </div><div class=\"t m0 x7 hc y623 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">Button; </span></div><div class=\"t m0 x7 hb y624 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/enti<span class=\"_ _0\"></span>ty/B<span class=\"_ _0\"></span>utton<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y625 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y626 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y627 ff2 fs0 fc0 sc0 ls1 ws0\">This Class <span class=\"_ _0\"></span>all<span class=\"_ _3\"></span>ows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>use a button <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> a <span class=\"_ _0\"></span>scene. </span></span></div><div class=\"t m2 xc hc y628 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y628 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y628 ff3 fs0 fc4 sc0 ls1 ws0\">Public <span class=\"_ _0\"></span>metho<span class=\"_ _0\"></span>ds<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y629 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y629 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y629 ff3 fs0 fc4 sc0 ls1 ws10\">Butt<span class=\"_ _0\"></span>on<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y59f ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y59f ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y59f ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y62a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y62b ff2 fs0 fc0 sc0 ls1 ws0\">Button(sf::Textur<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>&amp;tex, <span class=\"fc9\">float </span><span class=\"ls29 ws20\">x,</span> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls51 ws43\">y,</span><span class=\"fc0\"> <span class=\"_ _0\"></span><span class=\"ff3 fc5\">std::string <span class=\"ff2 fc9\">const <span class=\"fc0\">&amp;title, </span></span>std::<span class=\"_ _3\"></span>string <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;name, <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">c<span class=\"_ _3\"></span>enter, <span class=\"ff3 fc5 ws10\">i<span class=\"_ _0\"></span>s::<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws0\">GameDi<span class=\"_ _0\"></span>splay </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hb y62c ff2 fs0 fc0 sc0 ls1 ws0\">*sc<span class=\"_ _0\"></span>ene) </div><div class=\"t m0 x7 hc y4ef ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y62d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y62e ff2 fs0 fc0 sc0 ls1 ws0\">Constructor <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>cla<span class=\"_ _3\"></span>ss, <span class=\"ls1d ws13\">it</span> takes <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>parameter the texture which will<span class=\"_ _3\"></span> <span class=\"ls26 ws1c\">be</span> <span class=\"_ _0\"></span>us<span class=\"_ _3\"></span>ed <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>the frame <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the button, the position, </span></span></div><div class=\"t m0 x7 hb y62f ffa fs0 fc0 sc0 ls1 ws0\">the title, object’s nam<span class=\"_ _3\"></span>e, center the button in r<span class=\"_ _3\"></span>elation to the postion<span class=\"_ _3\"></span> and the<span class=\"_ _3\"></span><span class=\"ff2\"> sc<span class=\"_ _3\"></span>ene in which it will<span class=\"_ _3\"></span> be used.<span class=\"_ _3\"></span> </span></div><div class=\"t m2 xc h13 y630 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y630 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y630 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y631 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y632 ff2 fs0 fc0 sc0 ls1 ws0\">Button(sf::Textur<span class=\"_ _3\"></span>e &amp;tex , <span class=\"_ _0\"></span>sf::F<span class=\"_ _3\"></span>ont &amp;font, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls29 ws20\">x,<span class=\"_ _3\"></span></span><span class=\"fc0\"> </span>float <span class=\"_ _0\"></span><span class=\"fc0 ls51 ws43\">y,<span class=\"ls1 ws0\"> <span class=\"ff3 fc5\">std::string </span><span class=\"fc9\">const </span>&amp;title, <span class=\"_ _0\"></span><span class=\"ff3 fc5\">std::st<span class=\"_ _3\"></span>ring <span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">&amp;name,<span class=\"_ _3\"></span> <span class=\"fc9\">bool </span>center, <span class=\"fc9\">int </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y633 ff2 fs0 fc0 sc0 ls1 ws0\">textSize, <span class=\"ff3 fc5 ws10\">is::</span>Gam<span class=\"_ _3\"></span>eDisplay *scene)<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hc y634 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y635 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y636 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor of the cla<span class=\"_ _3\"></span>ss, it takes <span class=\"_ _3\"></span>as parameter the <span class=\"_ _3\"></span>texture which will<span class=\"_ _3\"></span> be used as the fr<span class=\"_ _3\"></span>ame of the button, th<span class=\"_ _3\"></span>e font, the </div><div class=\"t m0 x7 hb y415 ff2 fs0 fc0 sc0 ls1 ws0\">position, the title, <span class=\"ffa ws10\">object’s</span> name, <span class=\"_ _0\"></span>c<span class=\"_ _3\"></span>enter the button <span class=\"ls1d ws13\">in</span> r<span class=\"_ _0\"></span>ela<span class=\"_ _3\"></span>tion <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the postion, text size and <span class=\"_ _0\"></span>the scene <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>which it will be </span></span></div><div class=\"t m0 x7 hb y2e ff2 fs0 fc0 sc0 ls1 ws0\">use<span class=\"_ _0\"></span>d. </div><div class=\"t m2 xc hc y637 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y637 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y637 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tTitle<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y4b2 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etTitle(<span class=\"ff3 fc5 ws0\">std::string<span class=\"_ _3\"></span> <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;ti<span class=\"_ _0\"></span>tle) </span></span></span></span></span></div><div class=\"t m0 x1 hb y638 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y639 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y63a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y63b ff2 fs0 fc0 sc0 ls1 ws0\">Define <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>button<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>titl<span class=\"_ _0\"></span>e. </div><div class=\"t m0 x1 hb y63c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y63d ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y63d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y63d ff3 fs0 fc4 sc0 ls1 ws10\">on<span class=\"_ _0\"></span>Click<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y399 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0\">onClic<span class=\"_ _3\"></span>k() = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0<span class=\"fc0 ws0\">;<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x1 hb y63e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y63f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc ya8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y382 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the action <span class=\"_ _0\"></span>tha<span class=\"_ _3\"></span>t will <span class=\"ls26 ws1c\">be</span> <span class=\"_ _0\"></span>performed when <span class=\"_ _3\"></span>we click <span class=\"ls1c ws12\">on</span> the <span class=\"_ _0\"></span>butt<span class=\"_ _0\"></span>on. </div><div class=\"t m0 x1 hb y640 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y641 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y641 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y641 ff3 fs0 fc4 sc0 ls1 ws10\">onM<span class=\"_ _0\"></span>ouse<span class=\"_ _0\"></span>Over<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y39f ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9 ws10\">void<span class=\"fc0 ls55\">(</span><span class=\"ff3 fc5 ws0\">std::s<span class=\"_ _3\"></span>tring <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"fc0\">&amp;<span class=\"_ _0\"></span>title<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y346 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y642 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y575 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6c ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>define the action <span class=\"_ _0\"></span>tha<span class=\"_ _3\"></span>t will <span class=\"ls26 ws1c\">be</span> <span class=\"_ _0\"></span>performed when <span class=\"ls5a ws4a\">we</span> hover <span class=\"_ _0\"></span>over the button with the mouse <span class=\"_ _0\"></span>(fing<span class=\"_ _3\"></span>er <span class=\"ls1f ws16\">on<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"_ _3\"></span>Mobile<span class=\"_ _0\"></span>). </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3f\" class=\"pf w0 h0\" data-page-no=\"3f\"><div class=\"pc pc3f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcv0uUcQDH8e+TIpGDZZBE+KNRzByioCHEtUDEVZfGgyCoTXC9JdBFXF0aLuof0KghhKDQrcLBoZ7F44wHxSLknr4OB4d79HD38HpND9/xwzM8b567J4kxBgAAAErqggkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPWZAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8JAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9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oPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAAZXxakAAAGPSURBVACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAPii+nb7a0REbM/L1TxG3A+X23R6vR/HzXoe4z/lnK0aAKBztVE2yydPR6tcXH4ZhqgAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">64<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hf y520 ff2 fs7 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">ev<span class=\"_ _0\"></span>ent<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9 ws10\">void<span class=\"fc0 ls55\">(</span><span class=\"ff3 fc5 ws0\">std::s<span class=\"_ _3\"></span>tring <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"fc0\">&amp;<span class=\"_ _0\"></span>title<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2ff ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b5 ff2 fs0 fc0 sc0 ls1 ws0\">Manage the <span class=\"_ _0\"></span>event part <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the but<span class=\"_ _0\"></span>ton. </div><div class=\"t m0 x1 hb y290 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">step(</span>float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>const <span class=\"fc0\">&amp;DE<span class=\"_ _0\"></span>LTA_T<span class=\"_ _0\"></span>IME) </span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2e5 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>update the obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m0 x1 hb y643 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20f ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y20f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20f ff3 fs0 fc4 sc0 ls1 ws10\">dr<span class=\"_ _0\"></span>aw<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y24b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0\">draw(is::Render <span class=\"_ _0\"></span>&amp;surfa<span class=\"_ _0\"></span>ce) </span></span></div><div class=\"t m0 x7 hc y243 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y212 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb ye8 ff2 fs0 fc0 sc0 ls1 ws0\">Display the <span class=\"_ _0\"></span>button with tit<span class=\"_ _0\"></span>le. </div><div class=\"t m0 x1 hb y3a3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y246 ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y246 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y246 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Text<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3a4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y247 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::<span class=\"_ _3\"></span>Text&amp; g<span class=\"_ _0\"></span>etTex<span class=\"_ _0\"></span>t() </span></div><div class=\"t m0 x7 hc y3a5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f3 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the text object <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e butt<span class=\"_ _0\"></span>on. </span></div><div class=\"t m0 x1 hb y3a7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y391 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y391 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y391 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>IsIn<span class=\"_ _0\"></span>Colli<span class=\"_ _0\"></span>sion<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3a8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3a9 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"ff2 fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">getIsInCollision(<span class=\"_ _3\"></span>) <span class=\"_ _0\"></span><span class=\"fc9 ws10\">const<span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y3aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1fa ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2\">when <span class=\"_ _0\"></span>the mouse (finger <span class=\"ls1f ws16\">on<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> Mobile) collides with <span class=\"_ _0\"></span>the bu<span class=\"_ _0\"></span>tton. </span></span></span></span></div><div class=\"t m0 x1 hb y4b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb yee ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y394 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y395 ff6 fs0 fc3 sc0 ls1 ws10\">Ad<span class=\"_ _0\"></span>mob<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 h21 y644 ff6 fsc fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y645 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1a9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y646 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y647 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that allows you <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> use the <span class=\"_ _0\"></span>Admob SDK <span class=\"ls1d ws13\">in</span> the <span class=\"_ _0\"></span>game.<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls2e ws23\">It<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>offers<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>functio<span class=\"_ _3\"></span>ns <span class=\"ls1b ws11\">to<span class=\"_ _3\"></span></span> <span class=\"_ _0\"></span>manag<span class=\"_ _3\"></span>e banner and <span class=\"_ _0\"></span>reward<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>video<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>ads.<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m2 xc hc y648 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y648 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y648 ff3 fs0 fc4 sc0 ls1 ws0\">Public <span class=\"_ _0\"></span>metho<span class=\"_ _0\"></span>ds<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y423 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y423 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y423 ff3 fs0 fc4 sc0 ls1 ws10\">Adm<span class=\"_ _0\"></span>obMana<span class=\"_ _0\"></span>ger<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y649 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y64a ff2 fs0 fc0 sc0 ls1 ws0\">AdmobManager(sf::R<span class=\"_ _3\"></span>enderWindow<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;window, <span class=\"_ _0\"></span>ANative<span class=\"_ _3\"></span>Activity* <span class=\"_ _0\"></span>activity, JNIEnv* <span class=\"_ _0\"></span>en<span class=\"_ _0\"></span>v)<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y64b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y64c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y64d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y64e ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>constructor, <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span>takes<span class=\"_ _3\"></span> the window, Mobile activity and <span class=\"_ _0\"></span>the JNI environement <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> p<span class=\"_ _0\"></span>aramete<span class=\"_ _0\"></span>rs. </span></span></div></div><div class=\"c x7 y64f w9 h1f\"><div class=\"t m0 x0 hb y650 ff6 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y1a4 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _0\"></span>AdmobManager </div></div><div class=\"c x7 y64f w9 h1f\"><div class=\"t m0 x0 hc y651 ff3 fs0 fc5 sc0 ls1 ws0\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hb y652 ff2 fs0 fc0 sc0 ls1 ws0\">AdmobMana<span class=\"_ _3\"></span>ger; </div></div><div class=\"c x7 y64f w9 h1f\"><div class=\"t m0 x0 hb y653 ff9 fs0 fc0 sc0 ls1 ws0\">Header: <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isEng<span class=\"_ _0\"></span>ine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/Mobi<span class=\"_ _0\"></span>le/Ad<span class=\"_ _0\"></span>mobMa<span class=\"_ _0\"></span>nager.<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf40\" class=\"pf w0 h0\" data-page-no=\"40\"><div class=\"pc pc40 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xc hc y2e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y2e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2e2 ff3 fs0 fc4 sc0 ls1 ws0\">loa<span class=\"_ _0\"></span>dBan<span class=\"_ _0\"></span>nerAd </div><div class=\"t m0 x7 hb y2e3 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">loadBannerAd()<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hc y2e4 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y300 ff2 fs0 fc0 sc0 ls1 ws0\">Request <span class=\"_ _0\"></span>for<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>banner a<span class=\"_ _0\"></span>d.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20a ff3 fs0 fc4 sc0 ls1 ws0\">show<span class=\"_ _0\"></span>Bann<span class=\"_ _0\"></span>erAd </div><div class=\"t m0 x7 hb y2b5 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">showBannerAd() </span></div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y5ec ff2 fs0 fc0 sc0 ls1 ws0\">Displays a <span class=\"_ _0\"></span>banner <span class=\"ls23 ws1a\">ad<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> provided <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>request<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>has <span class=\"_ _3\"></span>been<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>successfull<span class=\"_ _3\"></span>y e<span class=\"_ _0\"></span>xecut<span class=\"_ _0\"></span>ed. </span></span></div><div class=\"t m0 x1 hb y2e6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y294 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y294 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y294 ff3 fs0 fc4 sc0 ls1 ws0\">hid<span class=\"_ _0\"></span>eBann<span class=\"_ _0\"></span>erAd </div><div class=\"t m0 x7 hb y50c ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">hideBannerAd() </span></div><div class=\"t m0 x7 hc y2e7 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y5f2 ff2 fs0 fc0 sc0 ls5b ws4b\">Hide<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the banner ad<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y297 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y298 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y298 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y298 ff3 fs0 fc4 sc0 ls1 ws0\">loa<span class=\"_ _0\"></span>dRewa<span class=\"_ _0\"></span>rdVi<span class=\"_ _0\"></span>deo </div><div class=\"t m0 x7 hb y50d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">loadRewardVide<span class=\"_ _3\"></span>o() </span></div><div class=\"t m0 x7 hc y229 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y654 ff2 fs0 fc0 sc0 ls1 ws0\">Request a <span class=\"_ _0\"></span>reward video a<span class=\"_ _0\"></span>d.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y2a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y22c ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y22c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y22c ff3 fs0 fc4 sc0 ls1 ws0\">show<span class=\"_ _0\"></span>Rewa<span class=\"_ _0\"></span>rdVid<span class=\"_ _0\"></span>eo </div><div class=\"t m0 x7 hc y2c ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _2\"></span><span class=\"fc0\">sho<span class=\"_ _3\"></span>wRewardVid<span class=\"_ _3\"></span>eo() </span></span></div><div class=\"t m0 x7 hc y218 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y365 ff2 fs0 fc0 sc0 ls1 ws0\">Allows you <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>launch a reward video <span class=\"_ _0\"></span>ad<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y50f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y655 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fcc\">1 <span class=\"_ _0\"></span><span class=\"fc0 ls1d ws13\">if<span class=\"ls1 ws0\"> the reward video <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> launched<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>and<span class=\"_ _3\"></span> <span class=\"fcc\">0 </span><span class=\"ls1d ws13\">if</span> there <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> <span class=\"ls23 ws1a\">an</span> e<span class=\"_ _0\"></span>rror (often occurs when the <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">ad<span class=\"ls1 ws0\"> request <span class=\"ls53 ws44\">did</span> not wor<span class=\"_ _0\"></span>k). </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y656 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2eb ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y2eb ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2eb ff3 fs0 fc4 sc0 ls1 ws10\">upda<span class=\"_ _0\"></span>teSF<span class=\"_ _0\"></span>MLApp<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y511 ff3 fs0 fc5 sc0 ls1 ws0\">auto <span class=\"_ _0\"></span><span class=\"ff2 fc0 ws10\">updateSFMLApp(<span class=\"fc9 ws0\">b<span class=\"_ _3\"></span>ool <span class=\"fc0\">wh<span class=\"_ _0\"></span>iteCo<span class=\"_ _0\"></span>lor) </span></span></span></div><div class=\"t m0 x1 hb y657 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y512 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y513 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4e7 ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>SFML application <span class=\"ls1d ws13\">in</span> the background when <span class=\"ls23 ws1a\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ls23 ws1a\">ad</span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> displayed.<span class=\"_ _3\"></span> This <span class=\"_ _0\"></span>avoids the main <span class=\"_ _0\"></span>program cras<span class=\"_ _0\"></span>hing<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m0 x1 hb y4e8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y238 ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y238 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y238 ff3 fs0 fc4 sc0 ls1 ws0\">che<span class=\"_ _0\"></span>ckAdO<span class=\"_ _0\"></span>bjIni<span class=\"_ _0\"></span>t </div><div class=\"t m0 x7 hb y96 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">checkAdObjInit()<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hc y1ac ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y517 ff2 fs0 fc0 sc0 ls1 ws0\">Ensures <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>initializa<span class=\"_ _3\"></span>tion <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>Admob co<span class=\"_ _0\"></span>mpone<span class=\"_ _0\"></span>nts. </div><div class=\"t m0 x1 hb y4e9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc yfc ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd yfc ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc yfc ff3 fs0 fc4 sc0 ls1 ws10\">che<span class=\"_ _0\"></span>ckAdR<span class=\"_ _0\"></span>ewar<span class=\"_ _0\"></span>dObjRe<span class=\"_ _0\"></span>initia<span class=\"_ _0\"></span>liz<span class=\"_ _0\"></span>e<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y658 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y3a0 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">checkA<span class=\"_ _0\"></span>dRew<span class=\"_ _0\"></span>ardObj<span class=\"_ _0\"></span>Reinit<span class=\"_ _0\"></span>iali<span class=\"_ _0\"></span>ze() </span></div><div class=\"t m0 x7 hc y224 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x22 h9 y225 ff4 fs4 fc0 sc0 ls19 wsf\">65<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf41\" class=\"pf w0 h0\" data-page-no=\"41\"><div class=\"pc pc41 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcsU2GQACGYc/cABTkZwiFhAFcwg3s6SwYgc6VaKwp2IPYGEhszoLEmFhbcPc8G9yXK3hDIKSU7gAAAMjUvQkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA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AFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAASv9CgAAAFlSURBVAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAA/Lfs92Jy8vj2Mh+NDu/yzdnpppxdPHxO3mc3i5/7q+uD8/nRunyKcVgLXd6/rj++PCkAAH33fHtshL/i0N7sh+sbqsqGQxsTgVUAAAAASUVORK5CYII=\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Reset <span class=\"_ _0\"></span>Admob<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>comp<span class=\"_ _0\"></span>onent<span class=\"_ _0\"></span>s. </div><div class=\"t m2 xc hc y371 ff3 fs0 fc4 sc0 ls1a\">3.</div><div class=\"t m3 xd hd y371 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y371 ff3 fs0 fc4 sc0 ls1 ws0\">Other <span class=\"_ _0\"></span>Func<span class=\"_ _3\"></span>tions <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>AdmobM<span class=\"_ _0\"></span>anage<span class=\"_ _0\"></span>r<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y659 ff3 fs0 fc4 sc0 ls1 ws10\">3.1</div><div class=\"t m3 x1d hd y659 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y659 ff3 fs0 fc4 sc0 ls1 ws0\">ProcessEvents <span class=\"_ _0\"></span>&amp; <span class=\"_ _2\"></span>W<span class=\"_ _3\"></span>aitForFutureComp<span class=\"_ _3\"></span>letion </div><div class=\"t m0 x7 hc y188 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">bool <span class=\"fc0 ws10\">Proc<span class=\"_ _3\"></span>essEvents(</span>int <span class=\"fc0\">msec)<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc y9c ff3 fs0 fc5 sc0 ls1 ws0\">sta<span class=\"_ _0\"></span>tic <span class=\"_ _9\"></span><span class=\"ff2 fc9\">void <span class=\"_ _f\"></span><span class=\"fc0\">Wa<span class=\"_ _0\"></span>itForF<span class=\"_ _0\"></span>uture<span class=\"_ _0\"></span>Comp<span class=\"_ _0\"></span>letio<span class=\"_ _0\"></span>n(fire<span class=\"_ _0\"></span>base<span class=\"_ _0\"></span>::F<span class=\"_ _0\"></span>uture<span class=\"_ _0\"></span>Base <span class=\"_ _f\"></span>fut<span class=\"_ _0\"></span>ure) </span></span></div><div class=\"t m0 x1 hb y373 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y327 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y302 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y303 ff2 fs0 fc0 sc0 ls1 ws0\">Ensures the <span class=\"_ _0\"></span>proper functioning <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>tests <span class=\"ls1f ws16\">on</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">ad<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>compon<span class=\"_ _0\"></span>ents.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m2 xc hc y3f3 ff3 fs0 fc4 sc0 ls1 ws10\">3.2</div><div class=\"t m3 x1d hd y3f3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y3f3 ff3 fs0 fc4 sc0 ls1 ws10\">che<span class=\"_ _0\"></span>ckAdS<span class=\"_ _0\"></span>tate<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y65a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3f6 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">checkAdState(fir<span class=\"_ _3\"></span>ebase::FutureBase<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>fut<span class=\"_ _0\"></span>ure) </span></span></div><div class=\"t m0 x1 hb y470 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y376 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5d4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3fa ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the test <span class=\"ls1c ws12\">on</span> <span class=\"_ _0\"></span>the <span class=\"ls23 ws1a\">ad</span> <span class=\"_ _0\"></span>com<span class=\"_ _3\"></span>ponent was <span class=\"_ _0\"></span>success<span class=\"_ _3\"></span>ful, <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> no<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x1 hb y2c3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y65b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb yc6 ff6 fs0 fc3 sc0 ls1 ws10\">Ti<span class=\"_ _0\"></span>me<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hb y65c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y65d ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y65d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y65d ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameTime </div><div class=\"t m0 x7 hc y65e ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">GameTime;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y413 ff9 fs0 fc0 sc0 ls1 ws0\">Header: <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isEng<span class=\"_ _0\"></span>ine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/funct<span class=\"_ _0\"></span>ion<span class=\"_ _0\"></span>/GameT<span class=\"_ _0\"></span>ime.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y65f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y567 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y660 ff2 fs0 fc0 sc0 ls1 ws0\">This Class allows you <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>manipulate the game time (the stopwatch). Very useful for platform games like Super Mario </div><div class=\"t m0 x7 hb y51d ff2 fs0 fc0 sc0 ls1 ws0\">Bros or Sonic which uses<span class=\"_ _3\"></span> a stopwatch in a l<span class=\"_ _3\"></span>evel.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y661 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y661 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y661 ff3 fs0 fc4 sc0 ls1 ws0\">Public methods <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>GameTime<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc yd0 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd yd0 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc yd0 ff3 fs0 fc4 sc0 ls1 ws10\">Game<span class=\"_ _0\"></span>Time<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y662 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y662 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y662 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _2\"></span>form<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hb y663 ff2 fs0 fc0 sc0 ls1 ws0\">Gam<span class=\"_ _0\"></span>eTime<span class=\"_ _0\"></span>() </div><div class=\"t m0 x7 hc y2a1 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y664 ff2 fs0 fc0 sc0 ls1 ws0\">Default <span class=\"_ _0\"></span>construct<span class=\"_ _3\"></span>or, initializes <span class=\"_ _0\"></span>all<span class=\"_ _3\"></span> counters (minute, second, <span class=\"_ _0\"></span>millisecond)<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> zero <span class=\"_ _0\"></span>(0<span class=\"_ _0\"></span>). </span></span></div><div class=\"t m0 x1 hb y4d7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y665 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y665 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y665 ff6 fs0 fc0 sc0 ls1 ws0\">Second form </div><div class=\"t m0 x7 hb y4da ff2 fs0 fc0 sc0 ls1 ws10\">GameTime(<span class=\"fc9 ws0\">unsign<span class=\"_ _3\"></span>ed <span class=\"_ _0\"></span>int <span class=\"_ _2\"></span><span class=\"fc0\">ms) </span></span></div><div class=\"t m0 x7 hc y590 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y666 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>initialize ti<span class=\"_ _3\"></span>me with <span class=\"_ _0\"></span>milliseconds<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>which will <span class=\"ls22 ws19\">be<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> distributed <span class=\"_ _0\"></span>lat<span class=\"_ _3\"></span>er <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> min<span class=\"_ _0\"></span>ut<span class=\"_ _3\"></span>es <span class=\"_ _0\"></span>and se<span class=\"_ _0\"></span>conds. </span></span></span></span></div><div class=\"t m2 xc h13 y667 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y667 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y667 ff6 fs0 fc0 sc0 ls1 ws0\">Third <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y668 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y669 ff2 fs0 fc0 sc0 ls1 ws10\">GameTime(<span class=\"fc9 ws0\">unsign<span class=\"_ _3\"></span>ed <span class=\"_ _0\"></span>int<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ls5c ws4c\">m,<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">unsign<span class=\"_ _3\"></span>ed <span class=\"_ _0\"></span>int<span class=\"_ _3\"></span> <span class=\"fc0 ls5d ws4d\">s,<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"fc9\">unsigned int </span><span class=\"ls4b ws3d\">ms<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> = <span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y66a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5c2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y66b ff2 fs0 fc0 sc0 ls1 ws0\">Constructor <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>initialize tim<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>with<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>minutes, seconds <span class=\"_ _0\"></span>and <span class=\"_ _3\"></span>mil<span class=\"_ _0\"></span>lisec<span class=\"_ _0\"></span>onds. </div><div class=\"t m0 x22 h9 y66c ff4 fs4 fc0 sc0 ls19 wsf\">66<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf42\" class=\"pf w0 h0\" data-page-no=\"42\"><div class=\"pc pc42 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">step(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>const <span class=\"fc0\">&amp;DELTA_TIME,<span class=\"_ _3\"></span> </span>float <span class=\"_ _0\"></span>const <span class=\"fc0\">&amp;VALUE_CONVER<span class=\"_ _3\"></span>SION, </span>float <span class=\"_ _0\"></span>const <span class=\"fc0\">&amp;V<span class=\"_ _0\"></span>ALUE<span class=\"_ _0\"></span>_TIME<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2ff ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b5 ff2 fs0 fc0 sc0 ls1 ws0\">Start the <span class=\"_ _0\"></span>countdo<span class=\"_ _3\"></span>wn timer <span class=\"ls5e ws4e\">so<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>that<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span>stops <span class=\"ls23 ws1a\">at</span> zero (0<span class=\"_ _0\"></span>)<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y290 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">add<span class=\"_ _0\"></span>Time<span class=\"_ _0\"></span>Value<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2b5 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">add<span class=\"_ _3\"></span>TimeValue(<span class=\"fc9 ws0\">int<span class=\"_ _3\"></span> </span><span class=\"ls5c ws4c\">m,</span><span class=\"ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0\">s = <span class=\"_ _0\"></span><span class=\"fcc ls24\">0<span class=\"fc0 ls1\">, <span class=\"fc9\">int </span><span class=\"ls5c ws4c\">ms</span> = <span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y66d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2e5 ff2 fs0 fc0 sc0 ls1 ws0\">Add min<span class=\"_ _0\"></span>ut<span class=\"_ _3\"></span>es, <span class=\"_ _0\"></span>seconds<span class=\"_ _3\"></span> and <span class=\"_ _0\"></span>milliseconds<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the current t<span class=\"_ _0\"></span>ime<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y643 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20f ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y20f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20f ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tTime<span class=\"_ _0\"></span>Value<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y24b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y227 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">s<span class=\"_ _3\"></span>etTimeValue(<span class=\"fc9 ws0\">int<span class=\"_ _3\"></span> </span><span class=\"ls5c ws4c\">m,</span><span class=\"ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0\">s = <span class=\"_ _0\"></span><span class=\"fcc ls24\">0<span class=\"fc0 ls1\">, <span class=\"fc9\">int </span><span class=\"ls5c ws4c\">ms</span> <span class=\"_ _0\"></span>= <span class=\"fcc ws10\">0</span>) </span></span></span></span></span></span></div><div class=\"t m0 x7 hc y243 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y212 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb ye8 ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>a new minute, <span class=\"_ _0\"></span>secon<span class=\"_ _3\"></span>d <span class=\"_ _0\"></span>an<span class=\"_ _3\"></span>d millisecond<span class=\"_ _3\"></span> for <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>cu<span class=\"_ _3\"></span>rrent time<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y3a3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y246 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y246 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y246 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tMSecon<span class=\"_ _0\"></span>d </div><div class=\"t m0 x7 hb y214 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">se<span class=\"_ _3\"></span>tMSecond(<span class=\"fc9 ws0\">int<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">ms<span class=\"_ _3\"></span>) </span></span></span></div><div class=\"t m0 x7 hc ybf ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y216 ff2 fs0 fc0 sc0 ls1 ws0\">Set milliseconds <span class=\"_ _0\"></span>which <span class=\"_ _3\"></span>will <span class=\"ls22 ws19\">be</span> <span class=\"_ _0\"></span>distributed <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>minutes and s<span class=\"_ _0\"></span>econ<span class=\"_ _0\"></span>ds. </div><div class=\"t m0 x1 hb y1f4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y217 ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y217 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y217 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Time<span class=\"_ _0\"></span>String<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y42f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y248 ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5\">std::string <span class=\"_ _0\"></span><span class=\"ff2 fc0\">getTimeString()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"ff3 fc5\">no<span class=\"_ _3\"></span>except </span></span></span></span></div><div class=\"t m0 x7 hc y1f9 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y219 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">current time <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>a string (example <span class=\"_ _0\"></span><span class=\"ff3\">00: 00.<span class=\"_ _0\"></span>00<span class=\"ff2 ls5f ws4f\">).</span><span class=\"ff2\"> </span></span></span></div><div class=\"t m0 x1 hb y4b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc yee ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd yee ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc yee ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Time<span class=\"_ _0\"></span>Value<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y4b2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4e6 ff2 fs0 fc9 sc0 ls1 ws0\">unsigned <span class=\"_ _0\"></span>int <span class=\"fc0\">getTimeValue() </span><span class=\"ws10\">c<span class=\"_ _0\"></span>onst<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y1fd ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y93 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">time <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>mill<span class=\"_ _0\"></span>isecon<span class=\"_ _0\"></span>ds. </span></span></span></div><div class=\"t m0 x1 hb y4b4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1fe ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y1fe ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1fe ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Minut<span class=\"_ _0\"></span>e<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y36 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y24a ff2 fs0 fc9 sc0 ls1 ws0\">unsigned in<span class=\"_ _0\"></span>t <span class=\"fc0\">getMinute() </span><span class=\"ws10\">co<span class=\"_ _0\"></span>nst<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y96 ff3 fs0 fca sc0 ls1 ws0\">Source Code </div><div class=\"t m0 x7 hc y39c ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>minute. </span></div><div class=\"t m2 xc hc y202 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y202 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y202 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Secon<span class=\"_ _0\"></span>d<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y66e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y221 ff2 fs0 fc9 sc0 ls1 ws0\">unsigned in<span class=\"_ _0\"></span>t <span class=\"fc0\">getSecond() </span><span class=\"ws10\">c<span class=\"_ _0\"></span>ons<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y5e3 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y9a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5e4 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>secon<span class=\"_ _0\"></span>d. </span></div><div class=\"t m0 x22 h9 y4b7 ff4 fs4 fc0 sc0 ls19 wsf\">67<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf43\" class=\"pf w0 h0\" data-page-no=\"43\"><div class=\"pc pc43 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">68<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h7 y66f ff2 fs5 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.10</div><div class=\"t m3 x21 hd y2e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2e2 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>MSecon<span class=\"_ _0\"></span>d </div><div class=\"t m0 x7 hb y2e3 ff2 fs0 fc9 sc0 ls1 ws0\">unsigned <span class=\"_ _0\"></span>int <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etMSecond() <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></div><div class=\"t m0 x7 hc y2e4 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>milli<span class=\"_ _0\"></span>seco<span class=\"_ _0\"></span>nd. </span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.11</div><div class=\"t m3 x21 hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">co<span class=\"_ _0\"></span>mpareTi<span class=\"_ _0\"></span>me<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y291 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1e6 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0 ws10\">co<span class=\"_ _3\"></span>mpareTime(<span class=\"fc9 ws0\">u<span class=\"_ _3\"></span>nsigned int </span><span class=\"ls5c ws4c\">m,</span><span class=\"ws0\"> <span class=\"fc9\">unsigned int <span class=\"_ _0\"></span><span class=\"fc0\">s = <span class=\"_ _0\"></span><span class=\"fcc ls60\">0<span class=\"fc0 ls1\">, <span class=\"fc9\">unsigned int </span><span class=\"ls5c ws4c\">ms</span> <span class=\"_ _0\"></span>= <span class=\"fcc ls24\">0</span>) <span class=\"fc9 ws10\">cons<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2e5 ff2 fs0 fc0 sc0 ls1 ws0\">Compare the entered <span class=\"_ _0\"></span>time and the time <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the obj<span class=\"_ _0\"></span>ect. </div><div class=\"t m0 x1 hb y240 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ea ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the time entered <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>great<span class=\"_ _3\"></span>er than the time <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the object <span class=\"ff3\">f<span class=\"_ _3\"></span>alse </span><span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>not<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">2.12</div><div class=\"t m3 x21 hd y227 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">oper<span class=\"_ _0\"></span>ator=<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y211 ff2 fs0 fc0 sc0 ls1 ws0\">GameTime&amp; <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">operator<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">=(GameTime <span class=\"_ _0\"></span><span class=\"fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">&amp;<span class=\"_ _0\"></span>t)<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x1 hb y212 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ye8 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1ee ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ef ff2 fs0 fc0 sc0 ls1 ws0\">Equality operator <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> compare two <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>cts. </span></span></div><div class=\"t m0 x1 hb y1f0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y24c ff3 fs0 fc4 sc0 ls1 ws10\">2.13</div><div class=\"t m3 x21 hd y24c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y24c ff3 fs0 fc4 sc0 ls1 ws10\">oper<span class=\"_ _0\"></span>ator&lt;<span class=\"_ _0\"></span>&lt;<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc ybf ff3 fs0 fc5 sc0 ls1 ws0\">friend <span class=\"_ _0\"></span>std::ostream<span class=\"_ _3\"></span><span class=\"ff2 fc0\">&amp; <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">ope<span class=\"_ _3\"></span>rator<span class=\"ff2 fc0 ls24 ws1d\">&lt;&lt;(</span><span class=\"ws0\">std::<span class=\"_ _3\"></span>ostream <span class=\"_ _0\"></span><span class=\"ff2 fc0\">&amp;flux,<span class=\"_ _3\"></span> GameTime <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0 ls61 ws50\">&amp;t)</span><span class=\"fc0\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1f2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f3 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y217 ff2 fs0 fc0 sc0 ls1 ws0\">Operator <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> display the time wi<span class=\"_ _0\"></span>th<span class=\"_ _3\"></span> the <span class=\"_ _0\"></span><span class=\"ff3 ws10\">std:<span class=\"_ _0\"></span>:cout<span class=\"_ _0\"></span><span class=\"ff2 ws0\">. </span></span></span></span></div><div class=\"t m0 x1 hb y42f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y248 ff3 fs0 fc4 sc0 ls1a\">3.</div><div class=\"t m3 xd hd y248 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y248 ff3 fs0 fc4 sc0 ls1 ws0\">Other <span class=\"_ _0\"></span>funct<span class=\"_ _3\"></span>ions <span class=\"ls62 ws51\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> Ga<span class=\"_ _0\"></span>meTim<span class=\"_ _0\"></span>e<span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 hc y392 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2ea ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">operat<span class=\"_ _3\"></span>or<span class=\"ff2 fc0 ws0\">==(GameTime<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;t1, <span class=\"_ _0\"></span>GameTime <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;t2) </span></span></span></span></span></span></div><div class=\"t m0 x7 hc y670 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"ff3 fc5 ws10\">operator</span><span class=\"fc0\">&gt;(Ga<span class=\"_ _3\"></span>meTime </span>const <span class=\"fc0\">&amp;t1<span class=\"_ _3\"></span>, GameTime </span>co<span class=\"_ _3\"></span>nst <span class=\"fc0\">&amp;t2) </span></div><div class=\"t m0 x7 hc y56a ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"ff3 fc5 ws10\">operator</span><span class=\"fc0\">&lt;(Ga<span class=\"_ _3\"></span>meTime </span>const <span class=\"fc0\">&amp;t1<span class=\"_ _3\"></span>, GameTime </span>co<span class=\"_ _3\"></span>nst <span class=\"fc0\">&amp;t2) </span></div><div class=\"t m0 x7 hc y249 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y671 ff2 fs0 fc0 sc0 ls1 ws0\">These Operators <span class=\"_ _0\"></span>allow you <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> make <span class=\"_ _0\"></span>compariso<span class=\"_ _3\"></span>ns with <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>cts. </span></span></div><div class=\"t m0 x1 hb y672 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y4b4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y1fe ff6 fs0 fc3 sc0 ls1 ws0\">Game <span class=\"_ _0\"></span>cont<span class=\"_ _0\"></span>rol<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h21 y673 ff6 fsc fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ydb ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y674 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y10f ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> that <span class=\"_ _0\"></span>allows <span class=\"ls1b ws11\">to</span> manage the controls <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the game. <span class=\"ls17 ws15\">It</span> supports the <span class=\"_ _0\"></span>k<span class=\"_ _3\"></span>eyboard and the mouse on PC and b<span class=\"_ _0\"></span>ecomes <span class=\"ls23\">a </span></div><div class=\"t m0 x7 hb y424 ff2 fs0 fc0 sc0 ls1 ws0\">Virtual Game Pad on M<span class=\"_ _3\"></span>obile.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y675 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y675 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y675 ff3 fs0 fc4 sc0 ls1 ws0\">Elements <span class=\"_ _0\"></span><span class=\"ls62 ws51\">of<span class=\"ls1 ws0\"> Ga<span class=\"_ _0\"></span>meKeyDa<span class=\"_ _0\"></span>ta<span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xc hc y6c ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y6c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6c ff3 fs0 fc4 sc0 ls1 ws0\">enum <span class=\"_ _0\"></span>Virtu<span class=\"_ _0\"></span>alKey<span class=\"_ _0\"></span>Inde<span class=\"_ _0\"></span>x </div></div><div class=\"c x7 y676 w9 h34\"><div class=\"t m0 x0 hb y677 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y651 ff3 fs0 fc5 sc0 ls1 ws0\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hb y678 ff2 fs0 fc0 sc0 ls1 ws0\">GameK<span class=\"_ _0\"></span>eyDa<span class=\"_ _0\"></span>ta </div></div><div class=\"c x7 y676 w9 h34\"><div class=\"t m0 x0 hb y679 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y28c ff9 fs0 fc0 sc0 ls1 ws0\">Header: <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isEng<span class=\"_ _0\"></span>ine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/funct<span class=\"_ _0\"></span>ion<span class=\"_ _0\"></span>/GameK<span class=\"_ _0\"></span>eyDat<span class=\"_ _0\"></span>a.h<span class=\"fc0 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf44\" class=\"pf w0 h0\" data-page-no=\"44\"><div class=\"pc pc44 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAPBP+3VsAxAYAGE0N4FQaa1gCBOIMcygYgeJVm8EK/wTKQ2gkrzXXXvdB4DqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAGMm5CsAAAIfSURBVED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAADA5+rrhyNJ0m1VXabkGvdzXd59z21TpsRlAAAAP/IAKqYCj0yhAwsAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">69<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h7 y66f ff2 fs5 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">enum <span class=\"_ _0\"></span><span class=\"ff2 fc0\">Virtu<span class=\"_ _0\"></span>alKe<span class=\"_ _0\"></span>yIndex<span class=\"_ _0\"></span>; </span></div><div class=\"t m0 x1 h35 y67a ff2 fse fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y67b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y67c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y67d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y67e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y67f ff2 fs0 fc0 sc0 ls1 ws0\">Represents <span class=\"_ _0\"></span>ga<span class=\"_ _3\"></span>me <span class=\"_ _0\"></span>controls ke<span class=\"_ _0\"></span>y.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y680 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y681 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y681 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y681 ff3 fs0 fc4 sc0 ls1 ws0\">Game<span class=\"_ _0\"></span>KeyDa<span class=\"_ _0\"></span>ta </div><div class=\"t m0 x7 hc y682 ff2 fs0 fc0 sc0 ls1 ws10\">GameKeyData(<span class=\"_ _3\"></span><span class=\"ff3 fc5\">is::</span><span class=\"ws0\">GameDisplay<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>*scene) </span></div><div class=\"t m0 x7 hc y683 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y684 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor who <span class=\"_ _0\"></span>takes <span class=\"_ _3\"></span>the scene <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>a par<span class=\"_ _0\"></span>amete<span class=\"_ _0\"></span>r. </span></span></div><div class=\"t m0 x1 hb y62d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4f1 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y4f1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y4f1 ff3 fs0 fc4 sc0 ls1 ws0\">loa<span class=\"_ _0\"></span>dReso<span class=\"_ _0\"></span>urce<span class=\"_ _0\"></span>s </div><div class=\"t m0 x1 hc y4f2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y524 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">loadResourc<span class=\"_ _3\"></span>es(<span class=\"fc9 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">use<span class=\"_ _3\"></span>PadColorBlack<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">fal<span class=\"_ _0\"></span>se<span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x7 hc y685 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y686 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y687 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> load <span class=\"_ _0\"></span>the texture which will <span class=\"ls22 ws19\">be</span> <span class=\"_ _0\"></span>used <span class=\"ls1b ws11\">to</span> create the <span class=\"_ _0\"></span>keys <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the Virtual <span class=\"_ _0\"></span>Gam<span class=\"_ _3\"></span>e P<span class=\"_ _0\"></span>ad<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y527 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y688 ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"_ _0\"></span><span class=\"ff2 fc0\">:<span class=\"_ _0\"></span> </span></div><div class=\"t m0 xe hc y44c ff3 fs0 fc0 sc0 ls1 ws0\">usePadColorBlack<span class=\"_ _3\"></span> <span class=\"ff2\">change the <span class=\"_ _0\"></span>Virtual Game <span class=\"_ _0\"></span>Pad sprite <span class=\"_ _0\"></span>colo<span class=\"_ _0\"></span>r. </span></div><div class=\"t m0 x1 hb y4d2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y47b ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y47b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y47b ff3 fs0 fc4 sc0 ls1 ws0\">st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p </div><div class=\"t m0 x1 hc y47c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y47d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">st<span class=\"_ _3\"></span>ep(<span class=\"fc9 ws0\">float const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _0\"></span>_TI<span class=\"_ _0\"></span>ME) </span></span></span></div><div class=\"t m0 x1 hb y689 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y52f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y47f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y68a ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>position<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the Virtual Game <span class=\"_ _0\"></span>Pad<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">on</span> the <span class=\"_ _0\"></span>screen<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>and also detects the <span class=\"_ _0\"></span>use <span class=\"ls1f ws16\">of</span> c<span class=\"_ _0\"></span>omm<span class=\"_ _0\"></span>ands. </div><div class=\"t m2 xc hc y68b ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y68b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y68b ff3 fs0 fc4 sc0 ls1 ws0\">dr<span class=\"_ _0\"></span>aw<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hc y68c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y68d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">draw(is::Rende<span class=\"_ _3\"></span>r <span class=\"_ _0\"></span>&amp;surf<span class=\"_ _0\"></span>ace) </span></div><div class=\"t m0 x1 hb y665 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y68e ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y486 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y68f ff2 fs0 fc0 sc0 ls1 ws0\">Displays the <span class=\"_ _0\"></span>Virtual Game P<span class=\"_ _0\"></span>ad<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y690 ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y690 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y690 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyPau<span class=\"_ _0\"></span>sePre<span class=\"_ _0\"></span>ssed </div><div class=\"t m0 x7 hb y691 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">m_keyPausePr<span class=\"_ _3\"></span>essed </span></div><div class=\"t m0 x7 hc y692 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y693 ff2 fs0 fc0 sc0 ls1 ws0\">Determines <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the pause key <span class=\"ls1f ws16\">is</span> <span class=\"_ _0\"></span>pre<span class=\"_ _0\"></span>ssed<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y5c2 ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y5c2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5c2 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyLef<span class=\"_ _0\"></span>tPres<span class=\"_ _0\"></span>sed </div><div class=\"t m0 x1 hc y694 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y695 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_key<span class=\"_ _0\"></span>LeftPre<span class=\"_ _0\"></span>ssed </span></div></div><div class=\"c x7 y696 w1c h1b\"><div class=\"t m0 x0 hc y697 ff3 fs0 fc0 sc0 ls1 ws0\">En<span class=\"_ _0\"></span>umerat<span class=\"_ _0\"></span>or </div><div class=\"t m0 x0 hb y698 ff2 fs0 fc0 sc0 ls1 ws0\">V_K<span class=\"_ _0\"></span>EY_L<span class=\"_ _0\"></span>EFT </div><div class=\"t m0 x0 hb y699 ff2 fs0 fc0 sc0 ls1 ws0\">V_K<span class=\"_ _0\"></span>EY_R<span class=\"_ _0\"></span>IGHT </div><div class=\"t m0 x0 hb y69a ff2 fs0 fc0 sc0 ls1 ws0\">V_K<span class=\"_ _0\"></span>EY_UP<span class=\"_ _0\"></span> </div><div class=\"t m0 x0 hb y69b ff2 fs0 fc0 sc0 ls1 ws0\">V_K<span class=\"_ _0\"></span>EY_DOW<span class=\"_ _0\"></span>N </div><div class=\"t m0 x0 hb y69c ff2 fs0 fc0 sc0 ls1 ws0\">V_K<span class=\"_ _0\"></span>EY_A </div><div class=\"t m0 x0 hb y468 ff2 fs0 fc0 sc0 ls1 ws0\">V_K<span class=\"_ _0\"></span>EY_B </div><div class=\"t m0 x0 hb y69d ff2 fs0 fc0 sc0 ls1 ws0\">V_K<span class=\"_ _0\"></span>EY_N<span class=\"_ _0\"></span>ONE </div></div><div class=\"c x2b y696 w1d h36\"><div class=\"t m0 x0 hb y698 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>LEFT <span class=\"_ _0\"></span>ke<span class=\"_ _0\"></span>y </div><div class=\"t m0 x0 hb y699 ff2 fs0 fc0 sc0 ls1 ws0\">Represents <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>RIGHT<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>key </div><div class=\"t m0 x0 hb y69e ff2 fs0 fc0 sc0 ls1 ws0\">Represents the UP key<span class=\"_ _3\"></span> </div><div class=\"t m0 x0 hb y69f ff2 fs0 fc0 sc0 ls1 ws0\">Represents <span class=\"_ _0\"></span>the <span class=\"_ _2\"></span>DO<span class=\"_ _3\"></span>WN <span class=\"_ _0\"></span>key </div><div class=\"t m0 x0 hb y6a0 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the A key </div><div class=\"t m0 x0 hb y6a1 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the B key<span class=\"_ _3\"></span> </div><div class=\"t m0 x0 hb y463 ff2 fs0 fc0 sc0 ls3a ws2d\">No<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>ke<span class=\"_ _0\"></span>y </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf45\" class=\"pf w0 h0\" data-page-no=\"45\"><div class=\"pc pc45 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>state <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the LEFT ke<span class=\"_ _0\"></span>y.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y207 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyRig<span class=\"_ _0\"></span>htPre<span class=\"_ _0\"></span>ssed<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y1e4 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">m_keyRightP<span class=\"_ _3\"></span>ressed </span></div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y4ab ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>state <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the RIGHT ke<span class=\"_ _0\"></span>y<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20d ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyUp<span class=\"_ _0\"></span>Presse<span class=\"_ _0\"></span>d </div><div class=\"t m0 x7 hb y4ac ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">m_keyUpPress<span class=\"_ _3\"></span>ed </span></div><div class=\"t m0 x7 hc y294 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y1eb ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>stat<span class=\"_ _3\"></span>e <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the <span class=\"ls63 ws52\">UP</span> k<span class=\"_ _0\"></span>ey<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1ec ff3 fs0 fc4 sc0 ls1 ws10\">2.10</div><div class=\"t m3 x21 hd y1ec ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1ec ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyDow<span class=\"_ _0\"></span>nPress<span class=\"_ _0\"></span>ed </div><div class=\"t m0 x1 hc y2e8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y24 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_keyD<span class=\"_ _0\"></span>ownPr<span class=\"_ _0\"></span>essed </span></div><div class=\"t m0 x1 hb y1ee ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ef ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y26 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y214 ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>state <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the DOWN k<span class=\"_ _0\"></span>ey<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc yec ff3 fs0 fc4 sc0 ls1 ws10\">2.11</div><div class=\"t m3 x21 hd yec ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc yec ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyAPre<span class=\"_ _0\"></span>ssed </div><div class=\"t m0 x1 hc y215 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y22b ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_key<span class=\"_ _0\"></span>APres<span class=\"_ _0\"></span>sed </span></div><div class=\"t m0 x1 hb yc1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4e4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2c ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>stat<span class=\"_ _3\"></span>e <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>A ke<span class=\"_ _0\"></span>y.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y1f8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2ea ff3 fs0 fc4 sc0 ls1 ws10\">2.12</div><div class=\"t m3 x21 hd y2ea ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2ea ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyBPr<span class=\"_ _0\"></span>essed </div><div class=\"t m0 x7 hb y4ae ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_keyB<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed </span></div><div class=\"t m0 x1 hb y4b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc yee ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4e6 ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>stat<span class=\"_ _3\"></span>e <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>B ke<span class=\"_ _0\"></span>y.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y1fd ff3 fs0 fc4 sc0 ls1 ws10\">2.13</div><div class=\"t m3 x21 hd y1fd ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1fd ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyAUse<span class=\"_ _0\"></span>d </div><div class=\"t m0 x1 hc y4b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y93 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_key<span class=\"_ _0\"></span>AUsed </span></div><div class=\"t m0 x1 hb y4b4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1fe ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y95 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y24a ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>stat<span class=\"_ _3\"></span>e <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the A key when <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> us<span class=\"_ _0\"></span>ed<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m2 xc hc y96 ff3 fs0 fc4 sc0 ls1 ws10\">2.14</div><div class=\"t m3 x21 hd y96 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y96 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyBUs<span class=\"_ _0\"></span>ed </div><div class=\"t m0 x1 hc y430 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y431 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_keyB<span class=\"_ _0\"></span>Used </span></div><div class=\"t m0 x1 hb y98 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y384 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y221 ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>stat<span class=\"_ _3\"></span>e <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the B key when <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> us<span class=\"_ _0\"></span>ed<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m2 xc hc y5e3 ff3 fs0 fc4 sc0 ls1 ws10\">2.15</div><div class=\"t m3 x21 hd y5e3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y5e3 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyLef<span class=\"_ _0\"></span>tUse<span class=\"_ _0\"></span>d </div><div class=\"t m0 x1 hc y3e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6a2 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_key<span class=\"_ _0\"></span>LeftU<span class=\"_ _0\"></span>sed </span></div><div class=\"t m0 x22 h9 y4b7 ff4 fs4 fc0 sc0 ls19 wsf\">70<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf46\" class=\"pf w0 h0\" data-page-no=\"46\"><div class=\"pc pc46 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>stat<span class=\"_ _3\"></span>e <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>LEFT key when <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> use<span class=\"_ _0\"></span>d.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">2.16</div><div class=\"t m3 x21 hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y207 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyRig<span class=\"_ _0\"></span>htUse<span class=\"_ _0\"></span>d </div><div class=\"t m0 x1 hc y2ff ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b5 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_key<span class=\"_ _0\"></span>RightU<span class=\"_ _0\"></span>sed </span></div><div class=\"t m0 x1 hb y290 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2b5 ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>state <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the RIGHT key when<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> u<span class=\"_ _0\"></span>sed<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y66d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">2.17</div><div class=\"t m3 x21 hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20d ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyUpU<span class=\"_ _0\"></span>sed </div><div class=\"t m0 x7 hb y2e5 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_keyU<span class=\"_ _0\"></span>pUsed </span></div><div class=\"t m0 x1 hb y643 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y24b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y227 ff2 fs0 fc0 sc0 ls1 ws0\">Stores the state <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the <span class=\"ls63 ws52\">UP</span> key when <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> us<span class=\"_ _0\"></span>ed<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m2 xc hc y243 ff3 fs0 fc4 sc0 ls1 ws10\">2.18</div><div class=\"t m3 x21 hd y243 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y243 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyDow<span class=\"_ _0\"></span>nUsed </div><div class=\"t m0 x1 hc y212 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb ye8 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_keyD<span class=\"_ _0\"></span>ownUse<span class=\"_ _0\"></span>d </span></div><div class=\"t m0 x1 hb y3a3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y246 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y24c ff2 fs0 fc0 sc0 ls1 ws0\">Stores the <span class=\"_ _0\"></span>state <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the DOWN <span class=\"_ _3\"></span>key when <span class=\"_ _0\"></span><span class=\"ls1f ws16\">it<span class=\"ls1 ws0\"> <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>use<span class=\"_ _0\"></span>d.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m2 xc hc y3a5 ff3 fs0 fc4 sc0 ls1 ws10\">2.19</div><div class=\"t m3 x21 hd y3a5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y3a5 ff3 fs0 fc4 sc0 ls1 ws0\">m_d<span class=\"_ _0\"></span>isab<span class=\"_ _0\"></span>leAll<span class=\"_ _0\"></span>Key </div><div class=\"t m0 x1 hc y1f2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f3 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_dis<span class=\"_ _0\"></span>ableAl<span class=\"_ _0\"></span>lKey </span></div><div class=\"t m0 x1 hb y3a7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y391 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y42f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y248 ff2 fs0 fc0 sc0 ls1 ws0\">Disables <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">all<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>gam<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>contro<span class=\"_ _0\"></span>ls. </span></span></div><div class=\"t m0 x1 hb y3aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f9 ff3 fs0 fc4 sc0 ls1 ws10\">2.20</div><div class=\"t m3 x21 hd y1f9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1f9 ff3 fs0 fc4 sc0 ls1 ws0\">m_h<span class=\"_ _0\"></span>ideGa<span class=\"_ _0\"></span>mePad </div><div class=\"t m0 x7 hb y1fa ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">m_hide<span class=\"_ _0\"></span>GameP<span class=\"_ _0\"></span>ad </span></div><div class=\"t m0 x1 hb y3ab ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y56a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y394 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y395 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>hide the Virtual Game <span class=\"_ _0\"></span>Pad<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">on<span class=\"ls1 ws0\"> Mobile. </span></span></div><div class=\"t m2 xc hc y6a3 ff3 fs0 fc4 sc0 ls1 ws10\">2.21</div><div class=\"t m3 x21 hd y6a3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y6a3 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyboa<span class=\"_ _0\"></span>rdA </div><div class=\"t m0 x7 hb y6a4 ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Keyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>::Ke<span class=\"_ _0\"></span>y <span class=\"_ _a\"> </span>m<span class=\"_ _0\"></span>_keyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>A </div><div class=\"t m0 x7 hc y6a5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y24a ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>keyboa<span class=\"_ _3\"></span>rd <span class=\"ls64 ws53\">key</span> <span class=\"_ _0\"></span>that <span class=\"_ _0\"></span>serves<span class=\"_ _3\"></span> <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>the A <span class=\"_ _0\"></span>key<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc yba ff3 fs0 fc4 sc0 ls1 ws10\">2.22</div><div class=\"t m3 x21 hd yba ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc yba ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyboa<span class=\"_ _0\"></span>rdB </div><div class=\"t m0 x7 hb y6a6 ff2 fs0 fc0 sc0 ls1 ws0\">sf::Keyboard::Key m_k<span class=\"_ _3\"></span>eyboardB </div><div class=\"t m0 x7 hc y6a7 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y221 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>keyboa<span class=\"_ _3\"></span>rd <span class=\"ls64 ws53\">key</span> <span class=\"_ _0\"></span>that <span class=\"_ _0\"></span>serves<span class=\"_ _3\"></span> <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>the B <span class=\"_ _0\"></span>key<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y5e3 ff3 fs0 fc4 sc0 ls1 ws10\">2.23</div><div class=\"t m3 x21 hd y5e3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y5e3 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyboa<span class=\"_ _0\"></span>rdLef<span class=\"_ _0\"></span>t </div><div class=\"t m0 x1 hc y3e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6a2 ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Keyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>::Ke<span class=\"_ _0\"></span>y <span class=\"_ _9\"></span>m_keyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>Left </div><div class=\"t m0 x22 h9 y4b7 ff4 fs4 fc0 sc0 ls19 wsf\">71<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf47\" class=\"pf w0 h0\" data-page-no=\"47\"><div class=\"pc pc47 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>keyboa<span class=\"_ _3\"></span>rd <span class=\"_ _0\"></span><span class=\"ls64 ws53\">key<span class=\"ls1 ws0\"> that <span class=\"_ _0\"></span>serves as the <span class=\"_ _0\"></span>LEFT ke<span class=\"_ _0\"></span>y.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">2.24</div><div class=\"t m3 x21 hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y207 ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyboa<span class=\"_ _0\"></span>rdRig<span class=\"_ _0\"></span>ht </div><div class=\"t m0 x7 hb y1e4 ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Keyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>::Ke<span class=\"_ _0\"></span>y <span class=\"_ _a\"> </span>m_keyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>Right </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y4ab ff2 fs0 fc0 sc0 ls1 ws0\">Represents the ke<span class=\"_ _0\"></span>y<span class=\"_ _3\"></span>board <span class=\"ls64 ws53\">key</span> <span class=\"_ _0\"></span>that <span class=\"_ _0\"></span>s<span class=\"_ _3\"></span>erves <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>the RIGHT <span class=\"_ _0\"></span>key<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">2.25</div><div class=\"t m3 x21 hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20d ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyboa<span class=\"_ _0\"></span>rdUp </div><div class=\"t m0 x7 hb y4ac ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Keyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>::Ke<span class=\"_ _0\"></span>y <span class=\"_ _a\"> </span>m_<span class=\"_ _0\"></span>keybo<span class=\"_ _0\"></span>ardUp<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y294 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y1eb ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>keyboa<span class=\"_ _3\"></span>rd <span class=\"_ _0\"></span><span class=\"ls64 ws53\">key<span class=\"ls1 ws0\"> that <span class=\"_ _0\"></span>serves as<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the <span class=\"ls63 ws52\">UP</span> <span class=\"_ _0\"></span>key<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m2 xc hc y1ec ff3 fs0 fc4 sc0 ls1 ws10\">2.26</div><div class=\"t m3 x21 hd y1ec ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1ec ff3 fs0 fc4 sc0 ls1 ws0\">m_k<span class=\"_ _0\"></span>eyboa<span class=\"_ _0\"></span>rdDown<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb ye8 ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Keyb<span class=\"_ _0\"></span>oard<span class=\"_ _0\"></span>::Ke<span class=\"_ _0\"></span>y <span class=\"_ _a\"> </span>m_ke<span class=\"_ _0\"></span>yboar<span class=\"_ _0\"></span>dDown </div><div class=\"t m0 x7 hc y213 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y50d ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>keyboard <span class=\"ls64 ws53\">key</span> <span class=\"_ _0\"></span>that serves as <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e DOWN ke<span class=\"_ _0\"></span>y.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y229 ff3 fs0 fc4 sc0 ls1 ws10\">2.27</div><div class=\"t m3 x21 hd y229 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y229 ff3 fs0 fc4 sc0 ls1 ws0\">m_m<span class=\"_ _0\"></span>oveKe<span class=\"_ _0\"></span>yPres<span class=\"_ _0\"></span>sed </div><div class=\"t m0 x7 hb y216 ff2 fs0 fc0 sc0 ls1 ws0\">VirtualKeyIndex m_mov<span class=\"_ _3\"></span>eKeyPressed </div><div class=\"t m0 x7 hc y1f5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y4a4 ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>find out whether the <span class=\"_ _0\"></span>virtual<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>directional<span class=\"_ _3\"></span> keys <span class=\"_ _0\"></span>are<span class=\"_ _3\"></span> p<span class=\"_ _0\"></span>resse<span class=\"_ _0\"></span>d. </div><div class=\"t m0 x1 hb y51d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y24d ff3 fs0 fc4 sc0 ls1 ws10\">2.28</div><div class=\"t m3 x21 hd y24d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y24d ff3 fs0 fc4 sc0 ls1 ws0\">m_a<span class=\"_ _0\"></span>ctio<span class=\"_ _0\"></span>nKeyPr<span class=\"_ _0\"></span>essed<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y1fa ff2 fs0 fc0 sc0 ls1 ws0\">VirtualKeyIndex m_ac<span class=\"_ _3\"></span>tionKeyPressed </div><div class=\"t m0 x7 hc y230 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc4\"> </span></div><div class=\"t m0 x7 hb y2eb ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>find out whether the <span class=\"_ _0\"></span>virtual<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>keys <span class=\"ls65 ws54\">A,</span> B are pres<span class=\"_ _0\"></span>sed. </div><div class=\"t m2 xc hc y232 ff3 fs0 fc4 sc0 ls1 ws10\">2.29</div><div class=\"t m3 x21 hd y232 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y232 ff3 fs0 fc4 sc0 ls1 ws0\">ke<span class=\"_ _0\"></span>yLeft<span class=\"_ _0\"></span>Press<span class=\"_ _0\"></span>ed </div><div class=\"t m0 x1 hc y657 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y512 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">keyLef<span class=\"_ _0\"></span>tPre<span class=\"_ _0\"></span>ssed<span class=\"_ _0\"></span>() </span></div><div class=\"t m0 x1 hb y235 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y236 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y237 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y238 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"_ _0\"></span><span class=\"ff2 ls1f ws16\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>LEFT directional<span class=\"_ _3\"></span> key <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> presse<span class=\"_ _3\"></span>d, <span class=\"ff3\">false <span class=\"_ _0\"></span><span class=\"ff2 ls1f ws16\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>no<span class=\"_ _0\"></span>t. </span></span></span></span></span></span></span></span></div><div class=\"t m2 xc hc y21f ff3 fs0 fc4 sc0 ls1 ws10\">2.30</div><div class=\"t m3 x21 hd y21f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y21f ff3 fs0 fc4 sc0 ls1 ws0\">ke<span class=\"_ _0\"></span>yRig<span class=\"_ _0\"></span>htPres<span class=\"_ _0\"></span>sed </div><div class=\"t m0 x1 hc y24f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ac ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">keyRi<span class=\"_ _0\"></span>ghtPre<span class=\"_ _0\"></span>ssed<span class=\"_ _0\"></span>() </span></div><div class=\"t m0 x1 hb y23b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y23c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y23d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y23e ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">if<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>RIGHT<span class=\"_ _3\"></span> dire<span class=\"_ _0\"></span>ctional<span class=\"_ _3\"></span> key <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>press<span class=\"_ _3\"></span>ed, <span class=\"ff3\">false<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">if<span class=\"ls1 ws0\"> not<span class=\"_ _0\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xc hc y183 ff3 fs0 fc4 sc0 ls1 ws10\">2.31</div><div class=\"t m3 x21 hd y183 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y183 ff3 fs0 fc4 sc0 ls1 ws0\">ke<span class=\"_ _0\"></span>yUpPre<span class=\"_ _0\"></span>ssed </div><div class=\"t m0 x1 hc y6a8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6a9 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">keyUpPr<span class=\"_ _0\"></span>esse<span class=\"_ _0\"></span>d() </span></div><div class=\"t m0 x22 h9 y206 ff4 fs4 fc0 sc0 ls19 wsf\">72<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf48\" class=\"pf w0 h0\" data-page-no=\"48\"><div class=\"pc pc48 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdMWrCUADH4abEyVXFxQMoGPAMnsJ3MSdx0zs4eIkcwSUYxMUx5HUIOLRbaWx5/b4t2fLH5UeeJIsxvgEAAJCodxMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqMwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+EwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+kwAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOozAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAA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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">73<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y6aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the <span class=\"ls63 ws52\">UP</span> directional key <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>press<span class=\"_ _3\"></span>ed, <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>no<span class=\"_ _0\"></span>t. </span></span></span></span></div><div class=\"t m2 xc hc y207 ff3 fs0 fc0 sc0 ls1 ws10\">2.32</div><div class=\"t m3 x21 hd y207 ff7 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">ke<span class=\"_ _0\"></span>yDownPr<span class=\"_ _0\"></span>esse<span class=\"_ _0\"></span>d<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y2ff ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b5 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">keyDown<span class=\"_ _0\"></span>Pres<span class=\"_ _0\"></span>sed(<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x1 hb y290 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20c ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the DOWN directional key <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>pressed, <span class=\"_ _3\"></span><span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">2.33</div><div class=\"t m3 x21 hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20d ff3 fs0 fc4 sc0 ls1 ws0\">ke<span class=\"_ _0\"></span>yAPres<span class=\"_ _0\"></span>sed </div><div class=\"t m0 x7 hb y2e5 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">keyAPre<span class=\"_ _0\"></span>ssed<span class=\"_ _0\"></span>() </span></div><div class=\"t m0 x1 hb y643 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y24b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the key A <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>pressed,<span class=\"_ _3\"></span> <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> no<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m2 xc hc y243 ff3 fs0 fc4 sc0 ls1 ws10\">2.34</div><div class=\"t m3 x21 hd y243 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y243 ff3 fs0 fc4 sc0 ls1 ws0\">ke<span class=\"_ _0\"></span>yBPre<span class=\"_ _0\"></span>ssed </div><div class=\"t m0 x1 hc y212 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb ye8 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">keyBPre<span class=\"_ _0\"></span>ssed<span class=\"_ _0\"></span>() </span></div><div class=\"t m0 x1 hb y3a3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y246 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3a4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y247 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the key B <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>pressed,<span class=\"_ _3\"></span> <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> no<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m2 xc hc y3a5 ff3 fs0 fc4 sc0 ls1 ws10\">2.35</div><div class=\"t m3 x21 hd y3a5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y3a5 ff3 fs0 fc4 sc0 ls1 ws0\">vi<span class=\"_ _0\"></span>rtualK<span class=\"_ _0\"></span>eyPre<span class=\"_ _0\"></span>ssed </div><div class=\"t m0 x1 hc y1f2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f3 ff2 fs0 fc9 sc0 ls1 ws0\">boo<span class=\"_ _0\"></span>l <span class=\"_ _f\"></span><span class=\"fc0\">vir<span class=\"_ _0\"></span>tualKe<span class=\"_ _0\"></span>yPre<span class=\"_ _0\"></span>ssed(<span class=\"_ _0\"></span>Virtu<span class=\"_ _0\"></span>alKe<span class=\"_ _0\"></span>yInde<span class=\"_ _0\"></span>x <span class=\"_ _f\"></span>virt<span class=\"_ _0\"></span>ualKe<span class=\"_ _0\"></span>yIndex<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x1 hb y3a7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y391 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3a8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3a9 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the corresponding<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>virtua<span class=\"_ _3\"></span>l key <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>pressed, <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y3aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f9 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y1f9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1f9 ff3 fs0 fc4 sc0 ls1 ws0\">Other <span class=\"_ _0\"></span>func<span class=\"_ _3\"></span>tions <span class=\"ls42 ws34\">of</span> G<span class=\"_ _0\"></span>ameKey<span class=\"_ _0\"></span>Data<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1fa ff2 fs0 fc0 sc0 ls1 ws0\">These functions <span class=\"_ _0\"></span>are found <span class=\"ls1d ws13\">in</span> <span class=\"ff3\">G<span class=\"_ _0\"></span>ameKe<span class=\"_ _0\"></span>yName<span class=\"_ _0\"></span>.h. </span></div><div class=\"t m0 x1 hc y393 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb ya1 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/funct<span class=\"_ _0\"></span>ion<span class=\"_ _0\"></span>/GameK<span class=\"_ _0\"></span>eyName<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div></div><div class=\"c x23 y6ab w1e h37\"><div class=\"t m0 x2a hb y6ac ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x0 hc y6ad ff3 fs0 fc5 sc0 ls1 ws0\">inline </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2c hb y5ff ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"_ _0\"></span>char <span class=\"fc0 ws10\">*getKeyNa<span class=\"_ _3\"></span>me(</span>const <span class=\"_ _0\"></span><span class=\"fc0\">sf::<span class=\"_ _3\"></span>Keyboard::Key ke<span class=\"_ _0\"></span>y)<span class=\"_ _0\"></span> </span></div></div><div class=\"c x23 y6ab w1e h37\"><div class=\"t m0 x0 h17 y6ae ff2 fsa fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y6af ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y63c ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y6ab w1e h37\"><div class=\"t m0 x0 hc y6b0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y6b1 ff3 fs0 fcb sc0 ls1 ws0\">Return </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x28 hb y6b2 ff2 fs0 fc0 sc0 ls1 ws0\">the name <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the keyboard key <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>a <span class=\"_ _0\"></span>strin<span class=\"_ _0\"></span>g. </div><div class=\"t m0 xe hb y6b3 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div></div><div class=\"c x23 y6ab w1e h37\"><div class=\"t m0 x0 hb y6b4 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y6b5 ff3 fs0 fc5 sc0 ls1 ws0\">inline <span class=\"_ _0\"></span>std::wstring </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x35 hb y3e8 ff2 fs0 fc0 sc0 ls1 ws10\">getKeyWName(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">const </span></div></div><div class=\"c x23 y6ab w1e h37\"><div class=\"t m0 x36 hb y6b5 ff2 fs0 fc0 sc0 ls1 ws0\">sf::Keyboard::<span class=\"_ _3\"></span>Key <span class=\"_ _0\"></span>ke<span class=\"_ _0\"></span>y<span class=\"_ _0\"></span>) </div><div class=\"t m0 x0 hb y6b6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y6b7 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y6b8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y6ab w1e h37\"><div class=\"t m0 x0 hc y6b9 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y3bc ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the n<span class=\"_ _0\"></span>ame <span class=\"ls1f ws16\">of</span> the <span class=\"_ _0\"></span>keyboard<span class=\"_ _3\"></span> key <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>a <span class=\"ff3 ws10\">s<span class=\"_ _0\"></span>td::w<span class=\"_ _0\"></span>stri<span class=\"_ _0\"></span>ng<span class=\"ff2 ws0\">. </span></span></span></div></div><div class=\"c x2e y5c2 w1f h24\"><div class=\"t m0 x0 h38 y2fe ffc fsa fc3 sc0 ls1 ws0\">Game <span class=\"_ _0\"></span>Slid<span class=\"_ _0\"></span>er<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf49\" class=\"pf w0 h0\" data-page-no=\"49\"><div class=\"pc pc49 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAD+tm/HKA1EQQCGd/IiKSQEAwu2XiGFR8gJJEew9AwWop0HCKTV2iN4hOQYuxCQkCII+ywstLCwMGBevq/bcoZpfpYHqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUH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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">74<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y6aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y117 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ame <span class=\"_ _0\"></span>Slider </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0 ws10\">TransitionE<span class=\"_ _3\"></span>ffect</span><span class=\"fc4 ls43\">;</span><span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2e4 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/grap<span class=\"_ _0\"></span>hi<span class=\"_ _0\"></span>c/<span class=\"ff3\">GameS<span class=\"_ _0\"></span>lider<span class=\"_ _0\"></span><span class=\"ff6 ls46 ws38\">.h<span class=\"fc0 ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y2ff ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y43a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y43b ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that allows you <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> slide with your <span class=\"_ _0\"></span>finger <span class=\"ls1f ws16\">or</span> <span class=\"_ _0\"></span>mouse <span class=\"ls1e ws14\">to</span> <span class=\"_ _0\"></span>navigate the me<span class=\"_ _0\"></span>nu. </span></span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2b5 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y2b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2b5 ff3 fs0 fc4 sc0 ls1 ws0\">Publics elements <span class=\"ls62 ws51\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> Game Sli<span class=\"_ _0\"></span>der<span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xc hc y375 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y375 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y375 ff3 fs0 fc4 sc0 ls1 ws0\">Slider <span class=\"_ _0\"></span>Direction </div><div class=\"t m0 x7 hc y304 ff3 fs0 fc5 sc0 ls1 ws0\">enum <span class=\"ff2 fc0\">SlideDirection;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 xc hc y6ba ff3 fs0 fc0 sc0 ls1 ws0\">Sli<span class=\"_ _0\"></span>deDi<span class=\"_ _0\"></span>rectio<span class=\"_ _0\"></span>n </div><div class=\"t m0 xc hb y6bb ff2 fs0 fc0 sc0 ls1 ws0\">SLI<span class=\"_ _0\"></span>DE_NO<span class=\"_ _0\"></span>NE <span class=\"_ _15\"> </span>Represents <span class=\"ls2f ws24\">no</span> <span class=\"_ _0\"></span>sl<span class=\"_ _0\"></span>ide<span class=\"_ _0\"></span> </div><div class=\"t m0 xc hb y6bc ff2 fs0 fc0 sc0 ls1 ws0\">SLI<span class=\"_ _0\"></span>DE_UP <span class=\"_ _16\"> </span>Represents slide up </div><div class=\"t m0 xc hb y582 ff2 fs0 fc0 sc0 ls1 ws0\">SLI<span class=\"_ _0\"></span>DE_DOW<span class=\"_ _0\"></span>N <span class=\"_ _17\"> </span>Represents <span class=\"_ _0\"></span>slide <span class=\"_ _0\"></span>down </div><div class=\"t m0 xc hb y6bd ff2 fs0 fc0 sc0 ls1 ws0\">SLI<span class=\"_ _0\"></span>DE_R<span class=\"_ _0\"></span>IGHT <span class=\"_ _18\"> </span>Represents slide right </div><div class=\"t m0 xc hb y6be ff2 fs0 fc0 sc0 ls1 ws0\">SLI<span class=\"_ _0\"></span>DE_L<span class=\"_ _0\"></span>EFT <span class=\"_ _19\"> </span>Represents slide left<span class=\"_ _3\"></span> </div><div class=\"t m0 x1 hb y6bf ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6c0 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y6c1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6c2 ff2 fs0 fc0 sc0 ls1 ws0\">Represent the <span class=\"_ _0\"></span>type<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>slide<span class=\"_ _3\"></span> made <span class=\"_ _0\"></span><span class=\"ls26 ws1c\">by<span class=\"ls1 ws0\"> the u<span class=\"_ _0\"></span>se<span class=\"_ _0\"></span>r. </span></span></span></span></div><div class=\"t m0 x1 hb ybe ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y6c3 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y6c3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6c3 ff3 fs0 fc4 sc0 ls1 ws0\">Game<span class=\"_ _0\"></span>Slid<span class=\"_ _0\"></span>er </div><div class=\"t m0 x7 hc y6c4 ff2 fs0 fc0 sc0 ls1 ws10\">Gam<span class=\"_ _0\"></span>eSli<span class=\"_ _0\"></span>der(<span class=\"ff3 fc5\">is<span class=\"_ _0\"></span>::<span class=\"ff2 fc0 ws0\">Game<span class=\"_ _0\"></span>Disp<span class=\"_ _0\"></span>lay *<span class=\"_ _0\"></span>scene<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x7 hc y6c5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y6c6 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor which takes <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> parameter the scene <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>which the <span class=\"_ _0\"></span>slid<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>functio<span class=\"_ _3\"></span>n will <span class=\"_ _0\"></span><span class=\"ls22 ws19\">be<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>used. </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y6c7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y6c8 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y6c8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6c8 ff3 fs0 fc4 sc0 ls1 ws10\">st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y6c9 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6ca ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">st<span class=\"_ _3\"></span>ep(<span class=\"fc9 ws0\">float const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _0\"></span>_TI<span class=\"_ _0\"></span>ME) </span></span></span></div><div class=\"t m0 x7 hc y6cb ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y6cc ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6cd ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>update o<span class=\"_ _0\"></span>bject<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y6ce ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y6cf ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y6cf ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6cf ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Slider<span class=\"_ _0\"></span>Dire<span class=\"_ _0\"></span>ction </div><div class=\"t m0 x7 hb y6d0 ff2 fs0 fc0 sc0 ls1 ws0\">SlideDirection <span class=\"_ _0\"></span>getSlideDirection()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const </span></div><div class=\"t m0 x7 hc y6d1 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y6d2 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>type <span class=\"ls1f ws16\">of</span> slide performed <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>the user (Supports <span class=\"_ _0\"></span>cas<span class=\"_ _3\"></span>e where <span class=\"_ _0\"></span>user <span class=\"ls53 ws44\">did</span> not <span class=\"_ _0\"></span>slip)<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y6d3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y487 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y6d4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y6d5 ff6 fs0 fc3 sc0 ls1 ws0\">Game <span class=\"_ _0\"></span>Syste<span class=\"_ _0\"></span>m<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hb y5cd ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y6d6 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y6d6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6d6 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameSystem </div><div class=\"t m0 x7 hc y6d7 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">GameSystem;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y6d8 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/funct<span class=\"_ _0\"></span>ion<span class=\"_ _0\"></span>/Game<span class=\"_ _0\"></span>System<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y6d9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4a\" class=\"pf w0 h0\" data-page-no=\"4a\"><div class=\"pc pc4a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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UH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAA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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">75<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y6aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Base class which ensures<span class=\"_ _3\"></span> the sharing of gam<span class=\"_ _3\"></span>e information betw<span class=\"_ _3\"></span>een the different compon<span class=\"_ _3\"></span>ents of the game <span class=\"_ _3\"></span>engine. It </div><div class=\"t m0 x7 hc y185 ff2 fs0 fc0 sc0 ls1 ws0\">contains the global variables and functions which ensure the <span class=\"_ _0\"></span>prop<span class=\"_ _3\"></span>er functioning <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the engine. <span class=\"ff3 ls1e ws14\">It</span><span class=\"ff3\"> <span class=\"_ _0\"></span>also allows <span class=\"ls66 ws55\">to</span> <span class=\"_ _0\"></span>store </span></span></span></div><div class=\"t m0 x7 hc y6da ff3 fs0 fc0 sc0 ls1 ws0\">resources (Sound, <span class=\"_ _3\"></span>Music, Image, Fo<span class=\"_ _3\"></span>nt) permanently!<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y6db ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y6db ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6db ff3 fs0 fc4 sc0 ls1 ws0\">Elements <span class=\"ls42 ws34\">of</span> Ga<span class=\"_ _0\"></span>meSyst<span class=\"_ _0\"></span>em<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y6dc ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y6dc ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6dc ff3 fs0 fc4 sc0 ls1 ws0\">enum <span class=\"_ _2\"></span>V<span class=\"_ _3\"></span>alidationButto<span class=\"_ _3\"></span>n </div><div class=\"t m0 x7 hc y6dd ff3 fs0 fc5 sc0 ls1 ws0\">enum <span class=\"ff2 fc0\">ValidationButto<span class=\"_ _3\"></span>n; </span></div><div class=\"t m0 xc hc y6de ff3 fs0 fc0 sc0 ls1 ws0\">En<span class=\"_ _0\"></span>emerato<span class=\"_ _0\"></span>r </div><div class=\"t m0 xc hb y6df ff2 fs0 fc0 sc0 ls1 ws0\">MO<span class=\"_ _0\"></span>US<span class=\"_ _0\"></span>E <span class=\"_ _1a\"> </span>Represent the validation button <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the mouse (if <span class=\"ls1d ws13\">it</span> <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>used, <span class=\"ls1d ws13\">it</span> becomes a touch <span class=\"_ _0\"></span>action<span class=\"_ _3\"></span> on </div><div class=\"t m0 x33 hb y6e0 ff2 fs0 fc0 sc0 ls1 ws0\">Mob<span class=\"_ _0\"></span>ile) </div><div class=\"t m0 xc hb y6e1 ff2 fs0 fc0 sc0 ls1 ws0\">KEY<span class=\"_ _0\"></span>BOAR<span class=\"_ _0\"></span>D <span class=\"_ _1b\"> </span>Represent the <span class=\"_ _0\"></span>validation<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>k<span class=\"_ _3\"></span>ey <span class=\"ls1c ws12\">on</span> <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>keybo<span class=\"_ _0\"></span>ard </div><div class=\"t m0 xc hb y6e2 ff2 fs0 fc0 sc0 ls1 ws0\">ALL_<span class=\"_ _0\"></span>BUT<span class=\"_ _0\"></span>TONS <span class=\"_ _1c\"> </span>Represent the <span class=\"_ _0\"></span>valida<span class=\"_ _3\"></span>tion button <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the mouse and <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> ke<span class=\"_ _0\"></span>y<span class=\"_ _3\"></span>board (if <span class=\"ls1d ws13\">it</span> <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>used, it becomes<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls23\">a </span></div><div class=\"t m0 x33 hb y8c ff2 fs0 fc0 sc0 ls1 ws0\">touch action on Mobil<span class=\"_ _3\"></span>e) </div><div class=\"t m0 x1 hb y6e3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y32b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6e4 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y6e5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb ya ff2 fs0 fc0 sc0 ls1 ws0\">Represents the validation <span class=\"_ _0\"></span><span class=\"ls64 ws53\">key<span class=\"ls1 ws0\"> <span class=\"ls1c ws12\">on</span> <span class=\"_ _0\"></span>PC, <span class=\"ls17 ws15\">It</span> lets you know <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> button that <span class=\"_ _0\"></span>will <span class=\"ls22 ws19\">be</span> <span class=\"_ _0\"></span>used during a <span class=\"_ _0\"></span>valida<span class=\"_ _3\"></span>tion te<span class=\"_ _0\"></span>st. </span></span></div><div class=\"t m0 x1 hb y6e6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y6e7 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y6e7 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6e7 ff3 fs0 fc4 sc0 ls1 ws0\">Game<span class=\"_ _0\"></span>Syst<span class=\"_ _0\"></span>em </div><div class=\"t m0 x7 hb y6e8 ff2 fs0 fc0 sc0 ls1 ws0\">Gam<span class=\"_ _0\"></span>eSys<span class=\"_ _0\"></span>tem() </div><div class=\"t m0 x7 hc y6e9 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y6ea ff2 fs0 fc0 sc0 ls1 ws0\">Default <span class=\"_ _0\"></span>constr<span class=\"_ _0\"></span>uct<span class=\"_ _0\"></span>or. </div><div class=\"t m0 x1 hb y6eb ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y57 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y57 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y57 ff3 fs0 fc4 sc0 ls1 ws10\">is<span class=\"_ _0\"></span>Press<span class=\"_ _0\"></span>ed<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y6ec ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6ed ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0 ws10\">isP<span class=\"_ _3\"></span>ressed(<span class=\"fc9 ws0\">int <span class=\"fc0\">finger = <span class=\"_ _0\"></span><span class=\"fcc ls60\">0<span class=\"fc0 ls1\">) <span class=\"fc9 ws10\">c<span class=\"_ _0\"></span>onst<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y6ee ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">isPressed(ValidationBu<span class=\"_ _3\"></span>tton <span class=\"_ _0\"></span>validationBut<span class=\"_ _3\"></span>ton <span class=\"_ _0\"></span>= <span class=\"ff3 ws10\">ALL_BUTTONS</span>)<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9 ws10\">cons<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y6ef ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5b ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y141 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y6f0 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y6f0 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y6f0 ff6 fs0 fc0 sc0 ls1 ws0\">Windows, <span class=\"_ _0\"></span>Lin<span class=\"_ _0\"></span>ux: </div><div class=\"t m0 x1 hb y7f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6f1 ff2 fs0 fc0 sc0 ls1 ws0\">Checks <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the validation key <span class=\"ls1f ws16\">is<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> pr<span class=\"_ _0\"></span>essed<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x7 hc y5f ff2 fs0 fc0 sc0 ls1 ws0\">The <span class=\"_ _0\"></span>validatio<span class=\"_ _3\"></span>n key <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> defined </span>in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff3\">GameConfig<span class=\"_ _3\"></span>.h <span class=\"ff6\">(See here: <span class=\"fc3 ws10\">3<span class=\"_ _0\"></span>.1<span class=\"fc0\">)<span class=\"ff9 ws0\">. </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb yd3 ff9 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y6f2 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y6f2 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y6f2 ff6 fs0 fc0 sc0 ls1 ws0\">Mobile <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y6f3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6f4 ff2 fs0 fc0 sc0 ls1 ws0\">Check <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the screen <span class=\"ls1d ws13\">is</span> touched <span class=\"_ _0\"></span><span class=\"ls26 ws1c\">by<span class=\"ls1 ws0\"> the us<span class=\"_ _0\"></span>er<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y1a6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6f5 ff3 fs0 fcb sc0 ls1 ws0\">Par<span class=\"_ _0\"></span>ameter<span class=\"_ _0\"></span> <span class=\"_ _3\"></span><span class=\"ff2 fc0\">:<span class=\"_ _0\"></span> </span></div><div class=\"t m0 xe hc y6f6 ff3 fs0 fc0 sc0 ls1 ws0\">finger <span class=\"ff2\">finger <span class=\"_ _0\"></span>index (on Mob<span class=\"_ _0\"></span>ile)<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y678 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6f7 ff3 fs0 fc0 sc0 ls1 ws0\">validationButton <span class=\"_ _3\"></span><span class=\"ff2\">Represents the <span class=\"_ _0\"></span>validation<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>butto<span class=\"_ _3\"></span>n <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span><span class=\"ls22 ws19\">be<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>used<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> perform <span class=\"_ _0\"></span>the tes<span class=\"_ _0\"></span>t. </span></span></span></span></span></div><div class=\"t m0 x1 hb y6f8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6f9 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m2 xc h13 y6fa ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y6fa ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6fa ff2 fs0 fc0 sc0 ls1 ws0\">Check <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the validation key <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>keyboard <span class=\"ls1d ws13\">is</span> pressed, <span class=\"ls26 ws1c\">by</span> default this key <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span><span class=\"ff3 ws10\">ENTE<span class=\"_ _0\"></span>R<span class=\"ff2 ws0\">. </span></span></div><div class=\"t m0 x1 hb y14f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6fb ff3 fs0 fc5 sc0 ls34 ws28\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff2 fc0 ws10\">(m_game<span class=\"_ _0\"></span>Syste<span class=\"_ _0\"></span>m.i<span class=\"_ _0\"></span>sPres<span class=\"_ _0\"></span>sed(<span class=\"ff3 fc5\">is<span class=\"_ _0\"></span>::<span class=\"ff2 fc0 ws0\">Game<span class=\"_ _0\"></span>Syste<span class=\"_ _0\"></span>m::V<span class=\"_ _0\"></span>alid<span class=\"_ _0\"></span>ation<span class=\"_ _0\"></span>Butt<span class=\"_ _0\"></span>on::K<span class=\"_ _0\"></span>EYBOAR<span class=\"_ _0\"></span>D)) </span></span></span></span></div><div class=\"t m0 x7 hb y6fc ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 x29 hb y6fd ff2 fs0 fcd sc0 ls67 ws56\">//<span class=\"ls1 ws0\"> <span class=\"ls36 ws2a\">Do</span> <span class=\"_ _0\"></span>somet<span class=\"_ _0\"></span>hing<span class=\"fc0\"> </span></span></div><div class=\"t m0 x7 hb y6fe ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div><div class=\"t m2 xc h13 y53b ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y53b ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y53b ff2 fs0 fc0 sc0 ls1 ws0\">Check <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the validation button <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>mouse is pressed, <span class=\"ls26 ws1c\">by</span> default this button <span class=\"_ _0\"></span>is <span class=\"_ _3\"></span><span class=\"ff3 ws10\">LEF<span class=\"_ _0\"></span>T<span class=\"ff2 ws0\">. </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4b\" class=\"pf w0 h0\" data-page-no=\"4b\"><div class=\"pc pc4b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QH/a78ObRiEojCM8hJ0bW03IGGASipQDRKLa5gAzw4IRHVH6BBsUQsG+ZIK2h0gOUfda3/3AQCg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAFA0amEAAAS8SURBVACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAAAcSfo/8mKc3k2SXPrTUt6WrK6GNf/U3fP3P9rzvbnO2ctmAADAJsYYQrDDvn0BXCXCCa5nFY0AAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">76<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y6aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x37 hb y42b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6ff ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _2\"></span><span class=\"fc0\">k<span class=\"_ _3\"></span>eyIsPressed(sf::Mous<span class=\"_ _3\"></span>e::Button<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>button)<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y126 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y700 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y165 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y701 ff2 fs0 fc0 sc0 ls1 ws0\">Check <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the mouse button <span class=\"ls1d ws13\">is</span> p<span class=\"_ _0\"></span>resse<span class=\"_ _0\"></span>d. </div><div class=\"t m0 x7 hc y1c5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"_ _0\"></span><span class=\"ff2 ls1f ws16\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>butto<span class=\"_ _3\"></span>n <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> pressed, <span class=\"ff3\">false<span class=\"_ _3\"></span> </span></span>if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>no<span class=\"_ _0\"></span>t. </span></span></span></span></span></div><div class=\"t m0 x1 hb y1c6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1c7 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y1c7 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1c7 ff3 fs0 fc4 sc0 ls1 ws10\">fi<span class=\"_ _0\"></span>leExi<span class=\"_ _0\"></span>st<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y702 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1c8 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0 ws10\">fileExist(<span class=\"ff3 fc5 ws0\">std:<span class=\"_ _3\"></span>:string <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">&amp;fileName) <span class=\"fc9 ws10\">c<span class=\"_ _0\"></span>onst<span class=\"fc0 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1c9 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ca ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y703 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>the file exists, <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y704 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y705 ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y705 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y705 ff3 fs0 fc4 sc0 ls1 ws10\">pla<span class=\"_ _0\"></span>ySo<span class=\"_ _0\"></span>und<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y706 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y707 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">playSound(sf::Sound<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;ob<span class=\"_ _0\"></span>j) </span></div><div class=\"t m0 x1 hb y708 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y709 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y70a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y70b ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> play <span class=\"_ _0\"></span>a sound <span class=\"ls1d ws13\">if</span> the option <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>acti<span class=\"_ _0\"></span>vated<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y145 ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y145 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y145 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>playS<span class=\"_ _0\"></span>ound<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y70c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y70d ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"fc0 ws10\">GSMplaySound(<span class=\"_ _3\"></span></span>const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp;<span class=\"_ _3\"></span> na<span class=\"_ _0\"></span>me) </span></span></span></div><div class=\"t m0 x1 hb y70e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y70f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y710 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>play a <span class=\"_ _0\"></span>sound managed <span class=\"ls26 ws1c\">by</span> <span class=\"ff3\">GameSystem GS<span class=\"_ _3\"></span>M <span class=\"_ _0\"></span><span class=\"ff2\">contain<span class=\"_ _3\"></span>er <span class=\"ls1d ws13\">if</span> the <span class=\"_ _0\"></span>optio<span class=\"_ _3\"></span>n <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> acti<span class=\"_ _0\"></span>vated<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m0 x1 hb y711 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y712 ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y712 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y712 ff3 fs0 fc4 sc0 ls1 ws10\">pla<span class=\"_ _0\"></span>yMus<span class=\"_ _0\"></span>ic<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y713 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y714 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">playSound(sf::Music<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;o<span class=\"_ _0\"></span>bj<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x1 hb y715 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y716 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y717 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y99 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> play <span class=\"_ _0\"></span>a music <span class=\"ls1d ws13\">if</span> the option <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>acti<span class=\"_ _0\"></span>vated<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y718 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y718 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y718 ff3 fs0 fc4 sc0 ls1 ws10\">GSM<span class=\"_ _0\"></span>playM<span class=\"_ _0\"></span>usic<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y719 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y71a ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">GSMpla<span class=\"_ _3\"></span>yMusic(<span class=\"fc9 ws0\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; n<span class=\"_ _0\"></span>ame<span class=\"_ _0\"></span>) </span></span></span></span></span></div></div><div class=\"c x23 y71b w4 h39\"><div class=\"t m0 x24 hc y71c ff3 fs0 fc5 sc0 ls34 ws28\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff2 fc0 ws10\">(m_gameS<span class=\"_ _0\"></span>ystem.<span class=\"_ _0\"></span>isPre<span class=\"_ _0\"></span>ssed(<span class=\"_ _0\"></span><span class=\"ff3 fc5\">is<span class=\"_ _0\"></span>::<span class=\"ff2 fc0 ws0\">Game<span class=\"_ _0\"></span>Syste<span class=\"_ _0\"></span>m::V<span class=\"_ _0\"></span>alid<span class=\"_ _0\"></span>ation<span class=\"_ _0\"></span>Butt<span class=\"_ _0\"></span>on::<span class=\"_ _0\"></span>MOUSE) </span></span></span></span></div><div class=\"t m0 x24 hb y71d ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hb y71e ff2 fs0 fcd sc0 ls35 ws29\">//<span class=\"ls1 ws0\"> <span class=\"ls36 ws2a\">Do</span> <span class=\"_ _0\"></span>somet<span class=\"_ _0\"></span>hing<span class=\"fc0\"> </span></span></div></div><div class=\"c x23 y71b w4 h39\"><div class=\"t m0 x24 hb y71f ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div><div class=\"t m0 x0 hb y720 ff2 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y721 ff3 fs0 fc4 sc0 ls1 ws10\">ke<span class=\"_ _0\"></span>yIsPr<span class=\"_ _0\"></span>essed<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 xe hb y722 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div></div><div class=\"c x23 y71b w4 h39\"><div class=\"t m0 x0 hb y723 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y724 ff2 fs0 fc9 sc0 ls1 ws0\">bool </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x25 hb y1b ff2 fs0 fc0 sc0 ls1 ws0\">keyIsPresse<span class=\"_ _3\"></span>d(sf::Keyboard::Key<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>key) <span class=\"_ _0\"></span><span class=\"fc9 ws10\">const<span class=\"fc0 ws0\"> </span></span></div></div><div class=\"c x23 y71b w4 h39\"><div class=\"t m0 x24 hc y725 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y726 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y71b w4 h39\"><div class=\"t m0 x0 hc y727 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y728 ff2 fs0 fc0 sc0 ls1 ws0\">Check <span class=\"_ _0\"></span><span class=\"ls1d ws13\">if<span class=\"ls1 ws0\"> the keyboard key <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> p<span class=\"_ _0\"></span>resse<span class=\"_ _0\"></span>d. </span></span></span></span></div><div class=\"t m0 x0 hb y729 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y72a ff3 fs0 fcb sc0 ls1 ws0\">Return </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x28 hc y102 ff3 fs0 fc0 sc0 ls1 ws0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> the <span class=\"_ _0\"></span>key <span class=\"ls1d ws13\">is</span> pressed, <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></div></div><div class=\"c x23 y71b w4 h39\"><div class=\"t m0 x2a h17 y72b ff6 fsa fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4c\" class=\"pf w0 h0\" data-page-no=\"4c\"><div class=\"pc pc4c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>play a music <span class=\"_ _0\"></span>managed<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls26 ws1c\">by<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"ff3\">GameSystem <span class=\"ls68 ws57\">GSM</span> <span class=\"_ _0\"></span><span class=\"ff2\">contain<span class=\"_ _3\"></span>er <span class=\"ls1d ws13\">if</span> the <span class=\"_ _0\"></span>option<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>act<span class=\"_ _0\"></span>ivated<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m2 xc hc y1e3 ff3 fs0 fc4 sc0 ls1 ws10\">2.10</div><div class=\"t m3 x21 hd y1e3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e3 ff3 fs0 fc4 sc0 ls1 ws0\">sto<span class=\"_ _0\"></span>pSoun<span class=\"_ _0\"></span>d </div><div class=\"t m0 x7 hb y1e4 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _2\"></span><span class=\"fc0\">sto<span class=\"_ _3\"></span>pMusic(sf::Sound<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;obj) </span></div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4ab ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>stop a s<span class=\"_ _0\"></span>ound. </div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">2.11</div><div class=\"t m3 x21 hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20d ff3 fs0 fc4 sc0 ls1 ws0\">sto<span class=\"_ _0\"></span>pMusi<span class=\"_ _0\"></span>c </div><div class=\"t m0 x7 hb y4ac ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _2\"></span><span class=\"fc0\">sto<span class=\"_ _3\"></span>pSound(sf::Music<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;obj) </span></div><div class=\"t m0 x7 hc y294 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1eb ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>stop a mu<span class=\"_ _0\"></span>sic. </div><div class=\"t m2 xc hc y1ec ff3 fs0 fc4 sc0 ls1 ws10\">2.12</div><div class=\"t m3 x21 hd y1ec ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1ec ff3 fs0 fc4 sc0 ls1 ws0\">use<span class=\"_ _0\"></span>Vibrat<span class=\"_ _0\"></span>e </div><div class=\"t m0 x7 hb ye8 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0 ws10\">useVibrate(<span class=\"_ _3\"></span></span>short <span class=\"fc0\">ms) </span></div><div class=\"t m0 x7 hc y213 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y50d ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>use the <span class=\"_ _0\"></span>vib<span class=\"_ _3\"></span>rator <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>this<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>option<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">is</span> activated (only for Mobi<span class=\"_ _0\"></span>le). </div><div class=\"t m0 x7 hc y229 ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"fc0 ls69 ws58\">ms</span><span class=\"fc0\"> <span class=\"ff2\">represents <span class=\"_ _0\"></span>the duration<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the vibrator <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>milli<span class=\"_ _0\"></span>seco<span class=\"_ _0\"></span>nds. </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y22a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y22b ff3 fs0 fc4 sc0 ls1 ws10\">2.13</div><div class=\"t m3 x21 hd y22b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y22b ff3 fs0 fc4 sc0 ls1 ws10\">sav<span class=\"_ _0\"></span>eCon<span class=\"_ _0\"></span>fig<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y2a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y22c ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">saveConfig(<span class=\"ff3 fc5 ws0\">std::st<span class=\"_ _3\"></span>ring <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;file<span class=\"_ _0\"></span>Name<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y4e4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y51d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y24d ff2 fs0 fc0 sc0 ls1 ws0\">Save <span class=\"_ _0\"></span>game<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>configuration<span class=\"_ _3\"></span> d<span class=\"_ _0\"></span>a<span class=\"_ _0\"></span>ta.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y4ae ff3 fs0 fc4 sc0 ls1 ws10\">2.14</div><div class=\"t m3 x21 hd y4ae ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4ae ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dConf<span class=\"_ _0\"></span>ig<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y51e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y30 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">loadConfig(<span class=\"ff3 fc5 ws0\">std::s<span class=\"_ _3\"></span>tring <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;fi<span class=\"_ _0\"></span>leNam<span class=\"_ _0\"></span>e) </span></span></span></span></div><div class=\"t m0 x1 hb y1fb ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4e6 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y32 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y72c ff2 fs0 fc0 sc0 ls1 ws0\">Load <span class=\"_ _0\"></span>game configuration d<span class=\"_ _0\"></span>at<span class=\"_ _0\"></span>a.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y21c ff3 fs0 fc4 sc0 ls1 ws10\">2.15</div><div class=\"t m3 x21 hd y21c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y21c ff3 fs0 fc4 sc0 ls1 ws10\">sav<span class=\"_ _0\"></span>ePad<span class=\"_ _0\"></span>Config<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y4a7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y21d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">savePadConfig(<span class=\"ff3 fc5 ws0\">s<span class=\"_ _3\"></span>td::string <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;f<span class=\"_ _0\"></span>ileNa<span class=\"_ _0\"></span>me) </span></span></span></span></div><div class=\"t m0 x1 hb y36 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y24a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y72d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y72e ff2 fs0 fc0 sc0 ls1 ws0\">Save the <span class=\"_ _0\"></span>configuration<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>data <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>Virtual Game<span class=\"_ _3\"></span> P<span class=\"_ _0\"></span>ad<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y201 ff3 fs0 fc4 sc0 ls1 ws10\">2.16</div><div class=\"t m3 x21 hd y201 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y201 ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dPad<span class=\"_ _0\"></span>Confi<span class=\"_ _0\"></span>g<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y432 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y202 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">loadPadConfig(<span class=\"ff3 fc5 ws0\">s<span class=\"_ _3\"></span>td::string <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"fc0\">&amp;fi<span class=\"_ _0\"></span>leName<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y66e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y221 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y72f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y730 ff2 fs0 fc0 sc0 ls1 ws0\">Load the <span class=\"_ _0\"></span>configuration data <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>Virtual Game P<span class=\"_ _0\"></span>ad<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y4aa ff3 fs0 fc4 sc0 ls1 ws10\">2.17</div><div class=\"t m3 x21 hd y4aa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4aa ff3 fs0 fc4 sc0 ls1 ws10\">m_d<span class=\"_ _0\"></span>isab<span class=\"_ _0\"></span>leKey<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y4a1 ff4 fs4 fc0 sc0 ls19 wsf\">77<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4d\" class=\"pf w0 h0\" data-page-no=\"4d\"><div class=\"pc pc4d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hb y117 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_di<span class=\"_ _0\"></span>sableKe<span class=\"_ _0\"></span>y </span></div><div class=\"t m0 x1 hb y577 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y207 ff2 fs0 fc0 sc0 ls17 ws15\">If<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"ls1 ws0\"> </span>is<span class=\"ls1 ws0\"> <span class=\"ff3\">t<span class=\"_ _0\"></span>rue<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 ls23 ws1a\">all<span class=\"ls1 ws0\"> the engine functions <span class=\"_ _0\"></span>that manag<span class=\"_ _3\"></span>e the <span class=\"_ _0\"></span>inputs (keyboard, mouse, touch) are d<span class=\"_ _0\"></span>isab<span class=\"_ _0\"></span>led. </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.18</div><div class=\"t m3 x21 hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">m_e<span class=\"_ _0\"></span>nable<span class=\"_ _0\"></span>Soun<span class=\"_ _0\"></span>d<span class=\"_ _3\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_en<span class=\"_ _0\"></span>ableSo<span class=\"_ _0\"></span>und </span></div><div class=\"t m0 x1 hb y5c4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20d ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>find out <span class=\"ls1d ws13\">if</span> the <span class=\"_ _0\"></span>soun<span class=\"_ _3\"></span>d <span class=\"ls1d ws13\">is</span> act<span class=\"_ _0\"></span>iva<span class=\"_ _0\"></span>ted. </div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.19</div><div class=\"t m3 x21 hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">m_e<span class=\"_ _0\"></span>nable<span class=\"_ _0\"></span>Musi<span class=\"_ _0\"></span>c<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ea ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_en<span class=\"_ _0\"></span>ableMu<span class=\"_ _0\"></span>sic </span></div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5c5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y5c6 ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>find out <span class=\"ls1d ws13\">if</span> the <span class=\"_ _0\"></span>music <span class=\"ls1d ws13\">is<span class=\"_ _3\"></span></span> ac<span class=\"_ _0\"></span>tiva<span class=\"_ _0\"></span>ted. </div><div class=\"t m2 xc hc y245 ff3 fs0 fc4 sc0 ls1 ws10\">2.20</div><div class=\"t m3 x21 hd y245 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y245 ff3 fs0 fc4 sc0 ls1 ws10\">m_e<span class=\"_ _0\"></span>nable<span class=\"_ _0\"></span>Vibrat<span class=\"_ _0\"></span>e<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y213 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_en<span class=\"_ _0\"></span>ableVib<span class=\"_ _0\"></span>rat<span class=\"_ _0\"></span>e </span></div><div class=\"t m0 x1 hb y3a4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y247 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y731 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y732 ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>find out <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the vibrator <span class=\"ls1d ws13\">is</span> activated (only for Mob<span class=\"_ _0\"></span>ile). </div><div class=\"t m2 xc hc y390 ff3 fs0 fc4 sc0 ls1 ws10\">2.21</div><div class=\"t m3 x21 hd y390 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y390 ff3 fs0 fc4 sc0 ls1 ws10\">m_k<span class=\"_ _0\"></span>eyIsP<span class=\"_ _0\"></span>resse<span class=\"_ _0\"></span>d<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1f4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y217 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_ke<span class=\"_ _0\"></span>yIsPr<span class=\"_ _0\"></span>essed </span></div><div class=\"t m0 x1 hb y3a8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3a9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y392 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f9 ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>find out <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>a key / button has been <span class=\"_ _0\"></span>pres<span class=\"_ _0\"></span>sed. </div><div class=\"t m2 xc hc y4a6 ff3 fs0 fc4 sc0 ls1 ws10\">2.22</div><div class=\"t m3 x21 hd y4a6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4a6 ff3 fs0 fc4 sc0 ls1 ws10\">m_f<span class=\"_ _0\"></span>irst<span class=\"_ _0\"></span>Launc<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y393 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb ya1 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_fir<span class=\"_ _0\"></span>stLa<span class=\"_ _0\"></span>unch </span></div><div class=\"t m0 x1 hb y733 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y638 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y639 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y63a ff2 fs0 fc0 sc0 ls1 ws0\">Check <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the game <span class=\"_ _0\"></span>has<span class=\"_ _3\"></span> been launched <span class=\"ls23 ws1a\">at</span> <span class=\"_ _0\"></span>least on<span class=\"_ _0\"></span>ce. </div><div class=\"t m2 xc hc y6a4 ff3 fs0 fc4 sc0 ls1 ws10\">2.23</div><div class=\"t m3 x21 hd y6a4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y6a4 ff3 fs0 fc4 sc0 ls1 ws0\">m_va<span class=\"_ _0\"></span>lida<span class=\"_ _0\"></span>tionMo<span class=\"_ _0\"></span>useK<span class=\"_ _0\"></span>ey </div><div class=\"t m0 x7 hb y6a5 ff2 fs0 fc0 sc0 ls1 ws0\">sf::Mouse::Button <span class=\"_ _9\"></span>m_va<span class=\"_ _3\"></span>lidationMouse<span class=\"_ _3\"></span>Key </div><div class=\"t m0 x7 hc y63e ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y38 ff2 fs0 fc0 sc0 ls1 ws0\">Represent the <span class=\"_ _0\"></span>variabl<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>that<span class=\"_ _3\"></span> stores <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>validatio<span class=\"_ _3\"></span>n button <span class=\"_ _0\"></span><span class=\"ls1f ws16\">of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>mou<span class=\"_ _0\"></span>se. </span></span></div><div class=\"t m2 xc hc y39c ff3 fs0 fc4 sc0 ls1 ws10\">2.24</div><div class=\"t m3 x21 hd y39c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y39c ff3 fs0 fc4 sc0 ls1 ws0\">m_va<span class=\"_ _0\"></span>lida<span class=\"_ _0\"></span>tionK<span class=\"_ _0\"></span>eyboar<span class=\"_ _0\"></span>dKe<span class=\"_ _0\"></span>y </div><div class=\"t m0 x7 hb y39e ff2 fs0 fc0 sc0 ls1 ws0\">sf::Keyboard::Key <span class=\"_\"> </span>m_validationKey<span class=\"_ _3\"></span>boardKey </div><div class=\"t m0 x7 hc ya9 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4b6 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>variable that stores <span class=\"_ _0\"></span>the keyboard <span class=\"_ _0\"></span>valida<span class=\"_ _3\"></span>tion <span class=\"_ _0\"></span>ke<span class=\"_ _0\"></span>y. </div><div class=\"t m2 xc hc y5e4 ff3 fs0 fc4 sc0 ls1 ws10\">2.25</div><div class=\"t m3 x21 hd y5e4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y5e4 ff3 fs0 fc4 sc0 ls1 ws10\">m_ga<span class=\"_ _0\"></span>meLan<span class=\"_ _0\"></span>gua<span class=\"_ _0\"></span>ge<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y4b7 ff4 fs4 fc0 sc0 ls19 wsf\">78<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4e\" class=\"pf w0 h0\" data-page-no=\"4e\"><div class=\"pc pc4e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcMWjUVwDH8ff8X3EIiCX5e5aittsZ4yRiB033gm46OehYMggdUpfCdY1QFAm4Cc4ODsnSIRAQRFwcIsZFCHG5mCMVvJimvbwOgdTBbnr13vt8hhCS6f3+fzi+3P0vppQCAAAAmdpnAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUnwkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAMBQauR9vBijawwAALwvpaT6stLv97UfQOHa7fbeTwAK772qqko7df7VF2NUfQCF230h8HIAQJk81wcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACUI6aUcj5ejKOjozFGVxqgZL1eL4QwMjJiCoDCpZS63W7eEVRi9XU6HdUHULiZmZkQwvT0tCkAVF+z2Syt+hrZn7Cua9UHULjdd/nqujYFgOor8NSe6wMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAADmIKaWcjxdjq9VymQEKt76+HkIYGxszBQDLy8t5R1CJ1be0tBRjdHMDlGx2djaEMDU1ZQqAwqWUJiYmSqu+RvYnHB8fV30AhavrevcVwRQAqq/AU3uuDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAChHI/sTTk5OxhhdaYCSrayshBAWFhZMAVC4lJLqy83i4qI7GwAAKFksM3YBAAAK4bk+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAADw+WuYgPfNPV7d+qtvBwCAobb/i+r8mSN2QPXxAVvb/Xfbqg8AYLilZAP+FZM7AgAAIF+e6wMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6MrC5td2+M3/sh19WOxvWAAAAPpGGCf4XC09eTN988HrjrSkAAADVl5XVzsb1Ww8ePn1pCgAAYAB8wnOg/u73z179bf2P3t1fL1sDAAAYAO/1DXbuqnp496evxg40qsoaAACA6svQkeaXRgAAAAbGJzwBAABUHwAAAKoPAAAA1QcAAMDg+DaXz8vm1vbvj56HEL4+dPD0iWMGAQAAVN/Q623+ufd7903v2o37IYQL359UfQAAgOobPrvv5j198WrvL9du3P/x4rnWN83Wt4ftAwAAfFwxpWSFQXrybOXe3OMP/uv2z5e6b3rtO/MhhFPHj1658J25AAAA1QcAAMB/8h2eAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAHxcjcLPv7Ozk9+hYowxRjc3AAAQQogppZLPX1VVfuG3trZW17WbGwAAUH0AAACZ81wfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQDwT/t1bAMQGABhNDeBUGmtYAgTiDHMoGIHiVZvBCv8EymtQPJed+11HwCoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPvgKLhwAAAJbSURBVAAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAfKL6+uFIknRbVZcpucb9XJd333PblClxGQAAwI88VjXiR8aQMYIAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">79<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y734 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0\">m<span class=\"_ _0\"></span>_game<span class=\"_ _0\"></span>Langu<span class=\"_ _0\"></span>age </span></div><div class=\"t m0 x1 hb y577 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b4 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>index<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>of the <span class=\"_ _0\"></span>c<span class=\"_ _3\"></span>hosen l<span class=\"_ _0\"></span>anguag<span class=\"_ _0\"></span>e. </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.26</div><div class=\"t m3 x21 hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">m_p<span class=\"_ _0\"></span>adAlp<span class=\"_ _0\"></span>ha<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0\">m<span class=\"_ _0\"></span>_padA<span class=\"_ _0\"></span>lpha </span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y66d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20d ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>modify the transparency<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>Virtual Ga<span class=\"_ _3\"></span>me P<span class=\"_ _0\"></span>ad<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.27</div><div class=\"t m3 x21 hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e9 ff3 fs0 fc4 sc0 ls1 ws0\">Other <span class=\"_ _0\"></span>metho<span class=\"_ _0\"></span>ds<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ea ff2 fs0 fc0 sc0 ls1 ws0\">These methods below have the same role <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> those above. The difference here <span class=\"ls1d ws13\">is</span> that their name starting <span class=\"ffa\">with “<span class=\"ffb ws10\">GSM”</span><span class=\"ff3\"> </span></span>is </span></span></div><div class=\"t m0 x7 hc y376 ffa fs0 fc0 sc0 ls1 ws0\">replaced by “<span class=\"ffb\">GR<span class=\"_ _3\"></span>M” (Game Resource M<span class=\"_ _3\"></span>anager).<span class=\"_ _3\"></span><span class=\"ff3\"> </span></span></div><div class=\"t m0 x1 h3a y735 ff3 fsf fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y736 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5ad ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y737 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>derived from <span class=\"ff3\">GameSystem <span class=\"ff6\">(clic<span class=\"_ _3\"></span>k here <span class=\"_ _0\"></span>for more information: <span class=\"fc7 ls6a\">1</span><span class=\"ls6b\">)</span><span class=\"ff2\">, <span class=\"_ _0\"></span>it p<span class=\"_ _3\"></span>erforms the <span class=\"_ _0\"></span>same<span class=\"_ _3\"></span> r<span class=\"_ _0\"></span>ol<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> <span class=\"ls1d ws13\">its</span> parent. <span class=\"_ _0\"></span>Its </span></span></span></span></span></div><div class=\"t m0 x7 hb y47b ff2 fs0 fc0 sc0 ls1 ws0\">particularity is that it<span class=\"_ _3\"></span> contains new<span class=\"_ _3\"></span> elements which will<span class=\"_ _3\"></span> be used to manag<span class=\"_ _3\"></span>e the game play a<span class=\"_ _3\"></span>nd to manipulate the </div><div class=\"t m0 x7 hb y738 ff2 fs0 fc0 sc0 ls1 ws0\">different game scenes.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y70a ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y70a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y70a ff3 fs0 fc4 sc0 ls1 ws0\">Elements <span class=\"_ _0\"></span><span class=\"ls62 ws51\">of<span class=\"ls1 ws0\"> Ga<span class=\"_ _0\"></span>meSyst<span class=\"_ _0\"></span>emExt<span class=\"_ _0\"></span>ended<span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xc hc y739 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y739 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y739 ff3 fs0 fc4 sc0 ls1 ws10\">Game<span class=\"_ _0\"></span>Syst<span class=\"_ _0\"></span>emExt<span class=\"_ _0\"></span>ended<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hb y500 ff2 fs0 fc0 sc0 ls1 ws0\">Gam<span class=\"_ _0\"></span>eSys<span class=\"_ _0\"></span>temExt<span class=\"_ _0\"></span>ended<span class=\"_ _0\"></span>() </div><div class=\"t m0 x1 hb y73a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y73b ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y73c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y73d ff2 fs0 fc0 sc0 ls1 ws0\">Default <span class=\"_ _0\"></span>constr<span class=\"_ _0\"></span>uct<span class=\"_ _0\"></span>or. </div><div class=\"t m2 xc hc y73e ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y73e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y73e ff3 fs0 fc4 sc0 ls1 ws0\">in<span class=\"_ _0\"></span>itSyst<span class=\"_ _0\"></span>emDat<span class=\"_ _0\"></span>a </div><div class=\"t m0 x7 hb y73f ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">initSystemData() </span></div><div class=\"t m0 x7 hc y740 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y741 ff2 fs0 fc0 sc0 ls1 ws0\">Initializes the <span class=\"_ _0\"></span>data linked <span class=\"ls1b ws11\">to</span> the <span class=\"_ _0\"></span>game engine<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y742 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y743 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y743 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y743 ff3 fs0 fc4 sc0 ls1 ws0\">in<span class=\"_ _0\"></span>itProg<span class=\"_ _0\"></span>ress </div><div class=\"t m0 x7 hb y36f ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">initProgress() </span></div><div class=\"t m0 x7 hc y744 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div></div><div class=\"c x7 y745 w20 h3b\"><div class=\"t m0 x0 hc y746 ff3 fs0 fc0 sc0 ls1 ws0\">Other m<span class=\"_ _0\"></span>etho<span class=\"_ _0\"></span>des </div><div class=\"t m0 x0 hb y747 ff2 fs0 fc0 sc0 ls1 ws0\">GRMp<span class=\"_ _0\"></span>layS<span class=\"_ _0\"></span>ound </div><div class=\"t m0 x0 hb y42e ff2 fs0 fc0 sc0 ls1 ws0\">GRMp<span class=\"_ _0\"></span>layM<span class=\"_ _0\"></span>usic </div></div><div class=\"c x2b y745 wb h3b\"><div class=\"t m0 x0 hc y746 ff3 fs0 fc0 sc0 ls1 ws0\">Main Me<span class=\"_ _0\"></span>thods<span class=\"_ _3\"></span> (a<span class=\"_ _0\"></span>bove) </div><div class=\"t m0 x0 hb y747 ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>playS<span class=\"_ _0\"></span>ound </div><div class=\"t m0 x0 hb y42e ff2 fs0 fc0 sc0 ls1 ws0\">GSM<span class=\"_ _0\"></span>play<span class=\"_ _0\"></span>Music </div></div><div class=\"c x2e y748 w21 h3c\"><div class=\"t m0 x24 h2d y749 ffc fs4 fc3 sc0 ls1 ws0\">Game System E<span class=\"_ _0\"></span>xte<span class=\"_ _0\"></span>nded<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div></div><div class=\"c x23 y74a w22 h3d\"><div class=\"t m0 x2a hc y74b ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameSystemEx<span class=\"_ _3\"></span>tended </div><div class=\"t m0 x0 hc y74c ff3 fs0 fc5 sc0 ls1 ws0\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hb y74d ff2 fs0 fc0 sc0 ls1 ws0\">GameSystemEx<span class=\"_ _3\"></span>tended;<span class=\"_ _3\"></span> </div></div><div class=\"c x23 y74a w22 h3d\"><div class=\"t m0 x0 h17 y74e ff9 fsa fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws59\">app_<span class=\"_ _0\"></span>src<span class=\"_ _0\"></span>/game<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m_ex<span class=\"_ _0\"></span>t/Ga<span class=\"_ _0\"></span>meSys<span class=\"_ _0\"></span>tem<span class=\"_ _0\"></span>Extend<span class=\"_ _0\"></span>ed.h<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4f\" class=\"pf w0 h0\" data-page-no=\"4f\"><div class=\"pc pc4f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">80<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y734 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Initialize game <span class=\"_ _0\"></span>progress d<span class=\"_ _0\"></span>at<span class=\"_ _0\"></span>a. </div><div class=\"t m0 x1 hb y577 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y1e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">in<span class=\"_ _0\"></span>itData<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y207 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">initData(<span class=\"fc9 ws0\">bool <span class=\"fc0\">clea<span class=\"_ _3\"></span>rCurrentLevel <span class=\"_ _0\"></span>=<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">tr<span class=\"_ _0\"></span>ue<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff2 fs0 fc0 sc0 ls1 ws0\">Initializes the <span class=\"_ _0\"></span>gam<span class=\"_ _3\"></span>e play <span class=\"_ _0\"></span>data<span class=\"_ _3\"></span> (score<span class=\"_ _0\"></span>,<span class=\"_ _3\"></span> life, <span class=\"_ _0\"></span>etc.<span class=\"_ _0\"></span>). </div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y2b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2b5 ff3 fs0 fc4 sc0 ls1 ws10\">sav<span class=\"_ _0\"></span>eData<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y66d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">saveData(<span class=\"ff3 fc5 ws0\">std::s<span class=\"_ _3\"></span>tring <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"fc0\">&amp;<span class=\"_ _0\"></span>file<span class=\"_ _0\"></span>Name) </span></span></span></span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ea ff2 fs0 fc0 sc0 ls1 ws0\">Save game <span class=\"_ _0\"></span>dat<span class=\"_ _0\"></span>a. </div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y227 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dData<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y243 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">loadData(<span class=\"_ _3\"></span><span class=\"ff3 fc5 ws0\">std::string <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;fi<span class=\"_ _0\"></span>leName<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y244 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y245 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y213 ff2 fs0 fc0 sc0 ls1 ws0\">Load <span class=\"_ _0\"></span>gam<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>data. </div><div class=\"t m0 x1 hb y3a4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y247 ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y247 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y247 ff3 fs0 fc4 sc0 ls1 ws0\">m_l<span class=\"_ _0\"></span>aunch<span class=\"_ _0\"></span>Option<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y28 ff2 fs0 fc0 sc0 ls1 ws0\">Dis<span class=\"_ _0\"></span>playO<span class=\"_ _0\"></span>ption<span class=\"_ _0\"></span> m_l<span class=\"_ _0\"></span>aunchOp<span class=\"_ _0\"></span>tion<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y1f3 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1f5 ff2 fs0 fc0 sc0 ls1 ws0\">Determine the action <span class=\"ff6\">(click here <span class=\"ls6c ws5a\">to</span> see the <span class=\"_ _0\"></span>actions: <span class=\"fc7 ls6a\">1</span>) <span class=\"ff2\">that <span class=\"_ _0\"></span>will <span class=\"ls22 ws19\">be</span> <span class=\"_ _0\"></span>performed<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1f ws16\">on<span class=\"ls1 ws0\"> the different scenes <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the game. </span></span></span></span></div><div class=\"t m0 x1 hb y42f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y248 ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y248 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y248 ff3 fs0 fc4 sc0 ls1 ws0\">game <span class=\"_ _0\"></span>play varia<span class=\"_ _0\"></span>bles<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y74f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2ea ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0\">m_gameProgression </span></div><div class=\"t m0 x7 hb yb4 ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0\">m_levelNum<span class=\"_ _3\"></span>ber </span></div><div class=\"t m0 x7 hb y219 ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0\">m_currentLev<span class=\"_ _3\"></span>el </span></div><div class=\"t m0 x7 hb y22f ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0\">m_currentLives </span></div><div class=\"t m0 x7 hb y230 ff2 fs0 fc9 sc0 ls1 ws0\">in<span class=\"_ _0\"></span>t <span class=\"_ _0\"></span><span class=\"fc0\">m_cur<span class=\"_ _0\"></span>rent<span class=\"_ _0\"></span>Bonus </span></div><div class=\"t m0 x7 hb y656 ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0\">m_currentScor<span class=\"_ _3\"></span>e </span></div><div class=\"t m0 x7 hb y2eb ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0\">m_levelTime<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x1 hb yfa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y396 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y93 ff2 fs0 fc0 sc0 ls1 ws0\">Global game <span class=\"_ _0\"></span>var<span class=\"_ _0\"></span>iab<span class=\"_ _0\"></span>les. </div><div class=\"t m0 x1 hb y4a7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y236 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y95 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y1ff ff6 fs0 fc3 sc0 ls1 ws0\">Game <span class=\"_ _0\"></span>Functi<span class=\"_ _0\"></span>on<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h21 y750 ff6 fsc fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y751 ff2 fs0 fc0 sc0 ls1 ws0\">These functions allow you <span class=\"ls1b ws11\">to</span> <span class=\"ls53 ws44\">do</span> <span class=\"_ _0\"></span>conversions<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">on<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> strings, manipulate time, manipulate<span class=\"_ _3\"></span> SFML objects, <span class=\"_ _0\"></span>display<span class=\"_ _3\"></span> special </span></span></div><div class=\"t m0 x7 hb y752 ff2 fs0 fc0 sc0 ls1 ws0\">texts, use certain Mobile<span class=\"_ _3\"></span> functions, pe<span class=\"_ _3\"></span>rform geometric ca<span class=\"_ _3\"></span>lculations, perform t<span class=\"_ _3\"></span>ests on variables, us<span class=\"_ _3\"></span>e functions to </div><div class=\"t m0 x7 hb y23d ff2 fs0 fc0 sc0 ls1 ws0\">manipulate random val<span class=\"_ _3\"></span>ues, etc.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y385 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y385 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y385 ff3 fs0 fc4 sc0 ls1 ws0\">General <span class=\"_ _0\"></span>Func<span class=\"_ _0\"></span>tion<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y753 ff3 fs0 fc4 sc0 ls1 ws10\">1.1</div><div class=\"t m3 x1d hd y753 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y753 ff3 fs0 fc4 sc0 ls1 ws10\">VAL<span class=\"_ _0\"></span>UE_CO<span class=\"_ _0\"></span>NVERS<span class=\"_ _0\"></span>ION<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y754 ff3 fs0 fc6 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">float <span class=\"_ _0\"></span>const <span class=\"fc0 ws10\">VA<span class=\"_ _0\"></span>LUE_CON<span class=\"_ _0\"></span>VERS<span class=\"_ _0\"></span>ION(<span class=\"fcc\">6<span class=\"_ _0\"></span>5.f<span class=\"fc0 ls5f ws4f\">);<span class=\"ls1 ws0\"> </span></span></span></span></span></div></div><div class=\"c x7 y676 w9 h3e\"><div class=\"t m0 x0 hb y679 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y28c ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>syste<span class=\"_ _0\"></span>m/funct<span class=\"_ _0\"></span>ion<span class=\"_ _0\"></span>/GameF<span class=\"_ _0\"></span>uncti<span class=\"_ _0\"></span>on.h<span class=\"fc0 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf50\" class=\"pf w0 h0\" data-page-no=\"50\"><div class=\"pc pc50 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAMAXKhFFkSkAAABkK+f6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwCA/7ZfxzYAQWEURv8JhEprBUOYQN4YZlCxg+S1eiNY4U1EIzGASnJOd9vbfYDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1TGjYRAAAAWSSURBVAcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAPjkevRDjoiIbq3qkiKOcduX+d3n1DYl+QsAAOBXbiLEFMY/tfYDAAAAAElFTkSuQmCC\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">81<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y734 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y437 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Acts <span class=\"ls1c ws12\">on</span> <span class=\"_ _0\"></span>the timing <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> co<span class=\"_ _0\"></span>unter<span class=\"_ _0\"></span>s. </span></span></div><div class=\"t m0 x1 hb y1b3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b4 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y28e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y755 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y290 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1e5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y20b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1e6 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y120 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y226 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y46f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y20e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y240 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1ea ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y295 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1eb ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y756 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y243 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y212 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb ye8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1ee ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y298 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y757 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y4a3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y758 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb ybf ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y215 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y22b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y759 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y51b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y75a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb yb2 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y75b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y52c ff3 fs0 fc4 sc0 ls1 ws10\">1.4</div><div class=\"t m3 x1d hd y52c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y52c ff3 fs0 fc4 sc0 ls1 ws0\">en<span class=\"_ _0\"></span>umToNu<span class=\"_ _0\"></span>m </div><div class=\"t m0 x7 hc y75c ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0\">&lt; <span class=\"_ _2\"></span><span class=\"ff3 fc5\">t<span class=\"_ _3\"></span>ypename <span class=\"_ _0\"></span><span class=\"ff2 fc0\">T&gt; </span></span></span></div><div class=\"t m0 x7 hb y75d ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0\">enumToNum(<span class=\"_ _3\"></span>T val) </span></div><div class=\"t m0 x7 hc y480 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y75e ff2 fs0 fc0 sc0 ls1 ws0\">Convert <span class=\"ff3\">enum <span class=\"_ _0\"></span><span class=\"ff2 ls1e ws14\">to<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff3\">in<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x1 hc y75f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y760 ff3 fs0 fc4 sc0 ls1 ws10\">1.5</div><div class=\"t m3 x1d hd y760 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y760 ff3 fs0 fc4 sc0 ls1 ws10\">w_c<span class=\"_ _0\"></span>hart<span class=\"_ _0\"></span>_tToSt<span class=\"_ _0\"></span>r<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y761 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y710 ff3 fs0 fc5 sc0 ls1 ws0\">std::string <span class=\"ff2 fc0 ws10\">w_chart_tToStr(<span class=\"fc9 ws0\">wchar_t <span class=\"_ _0\"></span>const <span class=\"fc0\">*<span class=\"_ _0\"></span>st<span class=\"_ _0\"></span>r) </span></span></span></div><div class=\"t m0 x7 hc y6d3 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y762 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y763 ff2 fs0 fc0 sc0 ls1 ws0\">Convert <span class=\"ff3\">w_chart_t </span><span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span><span class=\"ff3\">std::<span class=\"_ _0\"></span>stri<span class=\"_ _0\"></span>ng. </span></div><div class=\"t m0 x1 hc y6d5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y764 ff3 fs0 fc4 sc0 ls1 ws10\">1.6</div><div class=\"t m3 x1d hd y764 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y764 ff3 fs0 fc4 sc0 ls1 ws10\">str<span class=\"_ _0\"></span>ToWSt<span class=\"_ _0\"></span>r<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y692 ff3 fs0 fc5 sc0 ls1 ws0\">std::wstring <span class=\"_ _0\"></span><span class=\"ff2 fc0 ws10\">strToWStr(<span class=\"fc9 ws0\">co<span class=\"_ _3\"></span>nst <span class=\"ff3 fc5\">std::string <span class=\"_ _0\"></span><span class=\"ff2 fc0\">&amp;s<span class=\"_ _0\"></span>tr<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x1 hb y765 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y766 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y767 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y768 ff2 fs0 fc0 sc0 ls1 ws0\">Convert <span class=\"_ _0\"></span><span class=\"ff3\">std::string <span class=\"ff2 ls1b ws11\">to<span class=\"_ _3\"></span></span><span class=\"ff2\"> <span class=\"_ _0\"></span><span class=\"ff3\">std::<span class=\"_ _0\"></span>wstr<span class=\"_ _0\"></span>ing. </span></span></span></div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x0 hc y76a ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hb y76b ff2 fs0 fc0 sc0 ls1 ws0\">This cre<span class=\"_ _0\"></span>ates a counter <span class=\"ls1d ws13\">in</span> milliseconds wh<span class=\"_ _3\"></span>en <span class=\"ls5a ws4a\">we</span> <span class=\"_ _0\"></span>put <span class=\"ls1d ws13\">it</span> <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the update l<span class=\"_ _0\"></span>oop<span class=\"_ _0\"></span> </div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x0 hb y76c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y76d ff2 fs0 fcd sc0 ls67\">//<span class=\"ls1 ws0\"> <span class=\"ff3\">msCpt <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">is<span class=\"ls1 ws0\"> <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span><span class=\"ff3\">integer <span class=\"ff2 ws10\">var<span class=\"_ _0\"></span>iabl<span class=\"_ _0\"></span>e</span></span></span></span></span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x38 hb y53c ff2 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x24 hb y76e ff2 fs0 fc0 sc0 ls1 ws0\">msCpt <span class=\"ls2c ws5b\">+=<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> (</span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2e hc y20c ff3 fs0 fc5 sc0 ls1 ws10\">is::<span class=\"ff2 fc0 ws0\">VALUE_CONV<span class=\"_ _3\"></span>ERSION * <span class=\"fcc ws10\">1.538f</span>) * DELTA_TIME; <span class=\"fcd ls67\">//<span class=\"ls1\"> <span class=\"ff3\">DELTA_TIME </span><span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e execution time returned <span class=\"ls26 ws1c\">by</span> the </span></span></span></div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x24 hb y76f ff2 fs0 fcd sc0 ls1 ws10\">mac<span class=\"_ _0\"></span>hine</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hb y770 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1bb ff3 fs0 fc4 sc0 ls1 ws10\">SEC<span class=\"_ _0\"></span>OND<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x0 hc y771 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y772 ff3 fs0 fc6 sc0 ls1 ws0\">static </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xd hb y773 ff2 fs0 fc9 sc0 ls1 ws0\">float const <span class=\"_ _0\"></span><span class=\"fc0 ws10\">SECO<span class=\"_ _0\"></span>ND(<span class=\"fcc\">59.<span class=\"_ _0\"></span>f<span class=\"fc0 ls6d ws5c\">);<span class=\"ls1 ws0\"> </span></span></span></span></div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x0 hb y774 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 h1a y775 ff3 fsa fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 h1a y59f ff3 fsa fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x0 hc y776 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y777 ff2 fs0 fc0 sc0 ls1 ws0\">Represent a <span class=\"_ _0\"></span>se<span class=\"_ _0\"></span>cond. </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y3fd ff3 fs0 fc4 sc0 ls1 ws10\">WI<span class=\"_ _0\"></span>TH<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x0 hc y778 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y779 ff3 fs0 fc5 sc0 ls1 ws0\">#de<span class=\"_ _0\"></span>fine <span class=\"_ _2\"></span>WITH</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x39 hb y5a3 ff2 fs0 fc0 sc0 ls1 ws0\">(_SI<span class=\"_ _0\"></span>ZE) </div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x24 hc y77a ff3 fs0 fca sc0 ls1 ws0\">Source Code</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x31 hc y77b ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x24 hb y77c ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> browse <span class=\"_ _0\"></span>a<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>vector array. </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3a hc y77d ff3 fs0 fc5 sc0 ls6e ws5d\">_I<span class=\"ls1 ws0\"> <span class=\"ff2 fc0 ls1d ws13\">is<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the coun<span class=\"_ _0\"></span>ter. </span></span></span></div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x0 hb y77e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y77f ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x24 h1a y780 ff3 fsa fc5 sc0 ls1 ws59\">WIT<span class=\"_ _0\"></span>H</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xd h1a y781 ff2 fsa fc0 sc0 ls1 ws59\">(ve<span class=\"_ _0\"></span>ctoreA<span class=\"_ _0\"></span>rray<span class=\"_ _0\"></span>.<span class=\"ff3 fc5\">siz<span class=\"_ _0\"></span>e<span class=\"ff2 fc0 ls6f ws5e\">())<span class=\"ls1 ws0\"> </span></span></span></div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x24 hb y782 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hc y783 ff2 fs0 fc0 sc0 ls1 ws10\">vec<span class=\"_ _0\"></span>toreAr<span class=\"_ _0\"></span>ray[<span class=\"_ _0\"></span><span class=\"ff3 fc5 ls70 ws5f\">_I<span class=\"ff2 fc0 ls1 ws10\">]-<span class=\"ffa\">&gt;f<span class=\"_ _0\"></span>uncti<span class=\"_ _0\"></span>on(…);<span class=\"ff2 ws0\"> </span></span></span></span></div></div><div class=\"c x23 y769 w4 h3f\"><div class=\"t m0 x24 hb y38c ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf51\" class=\"pf w0 h0\" data-page-no=\"51\"><div class=\"pc pc51 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzawRGEIBBFwR3KEwGQf3okwAlqTGNlujPgq4dXGJn5AwAA4FLNBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqMwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+EwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+kwAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOozAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwQAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAHzIU/z8EVHz4HPOMYYPAAAAVN/l9t41D96aa14AACghMtMKAAAAt3LhAwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAAD/7al57LWWZw8AAAX13lVfCeccrzsAAFCBPzwBAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAA3xOZaQUAAIBbuesDAABQfQAAAKg+AAAAVB8AAACqDwCAt/06tgEICqMw+k8gVForGMIE8sYwg4odJK/VG8EKbyIaYQbJOd1tb/cBqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+mHrD+wAAAB3SURBVAAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAADA63r0Q46IiG6t6pIijnHbl/nb59Q2JfkLAADgV24fKDS0Va2LGgAAAABJRU5ErkJggg==\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">82<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y734 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">1.7</div><div class=\"t m3 x1d hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y117 ff3 fs0 fc4 sc0 ls1 ws0\">num<span class=\"_ _0\"></span>ToStr<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y2e3 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt; </span>typen<span class=\"_ _3\"></span>ame <span class=\"ff2 fc0\">T&gt; </span></div><div class=\"t m0 x7 hc y1e3 ff3 fs0 fc5 sc0 ls1 ws0\">std::string <span class=\"_ _0\"></span><span class=\"ff2 fc0\">numToStr(T <span class=\"_ _0\"></span>val) </span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y20a ff2 fs0 fc0 sc0 ls1 ws0\">Convert n<span class=\"_ _0\"></span>um<span class=\"_ _3\"></span>eric <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span><span class=\"ff3\">std:<span class=\"_ _0\"></span>:strin<span class=\"_ _0\"></span>g. </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20c ff3 fs0 fc4 sc0 ls1 ws10\">1.8</div><div class=\"t m3 x1d hd y20c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20c ff3 fs0 fc4 sc0 ls1 ws0\">str<span class=\"_ _0\"></span>ToNum<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y561 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls60\">&lt;<span class=\"ff3 fc5 ls1\">typename <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 hc y1e9 ff2 fs0 fc0 sc0 ls1 ws0\">T <span class=\"_ _0\"></span>strToNum(<span class=\"fc9\">const <span class=\"ff3 fc5\">std::string<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 fc0\">&amp;<span class=\"_ _0\"></span>str<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x1 hb y240 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1ea ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y24b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff2 fs0 fc0 sc0 ls1 ws0\">Convert <span class=\"ff3\">st<span class=\"_ _0\"></span>d::st<span class=\"_ _3\"></span>ring <span class=\"ff2 ls1b ws11\">to</span><span class=\"ff2\"> n<span class=\"_ _0\"></span>umer<span class=\"_ _0\"></span>ic. </span></span></div><div class=\"t m2 xc hc y211 ff3 fs0 fc4 sc0 ls1 ws10\">1.9</div><div class=\"t m3 x1d hd y211 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y211 ff3 fs0 fc4 sc0 ls1 ws0\">num<span class=\"_ _0\"></span>ToWSt<span class=\"_ _0\"></span>r </div><div class=\"t m0 x7 hc ye8 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0\">&lt; <span class=\"_ _2\"></span><span class=\"ff3 fc5\">t<span class=\"_ _3\"></span>ypename <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 hc y298 ff3 fs0 fc5 sc0 ls1 ws0\">std::wstring <span class=\"_ _0\"></span><span class=\"ff2 fc0\">numToWSt<span class=\"_ _3\"></span>r(T <span class=\"_ _0\"></span>va<span class=\"_ _0\"></span>l)<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x1 hb y48f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc yec ff2 fs0 fc0 sc0 ls1 ws0\">Convert n<span class=\"_ _0\"></span>um<span class=\"_ _3\"></span>eric <span class=\"ls1b ws11\">to</span> <span class=\"ff3\">s<span class=\"_ _0\"></span>td::w<span class=\"_ _0\"></span>string<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hc y1f2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f3 ff3 fs0 fc4 sc0 ls1 ws10\">1.10</div><div class=\"t m3 x21 hd y1f3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1f3 ff3 fs0 fc4 sc0 ls1 ws0\">wri<span class=\"_ _0\"></span>teZero<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y217 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt; </span>typen<span class=\"_ _3\"></span>ame <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hc y2c ff3 fs0 fc5 sc0 ls1 ws0\">std::string <span class=\"ff2 fc0\">writeZero(T val, <span class=\"_ _0\"></span><span class=\"fc9\">int<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">zeroNumber = <span class=\"_ _0\"></span><span class=\"fcc ws10\">1<span class=\"fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x1 hb y1f8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2ea ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4ae ff2 fs0 fc0 sc0 ls1 ws0\">Draw zeros <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> front <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> a numbe<span class=\"_ _0\"></span>r. </span></span></span></span></div><div class=\"t m0 x1 hb y4b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc yee ff3 fs0 fcb sc0 ls1 ws0\">Parameter <span class=\"fc0\">zeroNumber <span class=\"ff2\">represents the <span class=\"_ _0\"></span>number <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>zero <span class=\"ls1b ws11\">to</span> d<span class=\"_ _0\"></span>ispla<span class=\"_ _0\"></span>y. </span></span></div><div class=\"t m0 x1 hb y4b2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4e6 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y32 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y72c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y397 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb ya5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y4b4 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y6b2 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y784 ff3 fs0 fc4 sc0 ls1 ws10\">1.11</div><div class=\"t m3 x21 hd y784 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y784 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>MSecon<span class=\"_ _0\"></span>d<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y785 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y340 ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0 ws10\">getMSecond(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">float <span class=\"_ _0\"></span>const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">&amp;DELT<span class=\"_ _0\"></span>A_TI<span class=\"_ _0\"></span>ME) </span></span></span></div><div class=\"t m0 x7 hc ye ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y786 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y31a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">execution time <span class=\"_ _0\"></span><span class=\"ls1d ws13\">in<span class=\"ls1 ws0\"> mil<span class=\"_ _0\"></span>lise<span class=\"_ _0\"></span>cond<span class=\"_ _0\"></span>s. </span></span></span></div><div class=\"t m0 x1 hb y787 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y788 ff3 fs0 fc4 sc0 ls1 ws10\">1.12</div><div class=\"t m3 x21 hd y788 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y788 ff3 fs0 fc4 sc0 ls1 ws10\">mak<span class=\"_ _0\"></span>eTime<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y789 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y78a ff3 fs0 fc5 sc0 ls1 ws0\">std::tm <span class=\"ff2 fc0 ws10\">makeTime(<span class=\"fc9 ws0\">int <span class=\"fc0\">year, <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0\">month, </span>int <span class=\"_ _0\"></span><span class=\"fc0\">d<span class=\"_ _0\"></span>ay) </span></span></span></span></span></div><div class=\"t m0 x7 hc y3e ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div></div><div class=\"c x23 y78b w4 h40\"><div class=\"t m0 x0 hc y78c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y78d ff2 fs0 fc9 sc0 ls1 ws0\">int </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3b hb y21a ff2 fs0 fc0 sc0 ls1 ws10\">var<span class=\"_ _0\"></span>(<span class=\"fcc\">7</span><span class=\"ls5f ws4f\">);</span><span class=\"ws0\"> </span></div></div><div class=\"c x23 y78b w4 h40\"><div class=\"t m0 x24 hc y78e ff3 fs0 fc5 sc0 ls1 ws0\">std::cout </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3c hc y21b ff2 fs0 fc0 sc0 ls24 ws1d\">&lt;&lt;<span class=\"ls1 ws0\"> <span class=\"ff3 fc5 ws10\">is::</span>writeZero(var, </span><span class=\"fcc\">2</span><span class=\"ls1 ws0\">) </span>&lt;&lt;<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::endl<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">; <span class=\"fcd ls67\">//<span class=\"ls1\"> <span class=\"_ _0\"></span>Its display <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the console <span class=\"ffa ws10\">“0<span class=\"_ _0\"></span>07”<span class=\"ff2 fc0 ws0\"> </span></span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf52\" class=\"pf w0 h0\" data-page-no=\"52\"><div class=\"pc pc52 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACqDwAAANUHAACg+qwAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANVnBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPisAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPVZAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAAC+1NF8/ud5eg5+XdcYmh8AAOqLzGw9f0TPwddac04vAAAAlNf9ru++b7kLAABU/vhvftcHAABQmz+7AAAAVB8AAACqDwAAANUHAAB82rVDGwRiKADDeQn2QkBhWYEhmIDcGMyA4nYgweIZgRVujOr6h8SjLve+z1W2r+ZPC6oPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAACAZdvU3HZmmj0AABQUEaqvhN676w4AAAUNw1Bty354AgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAD+F5npFAAAANbKWx8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AaqKA3sAAADPSURBVAAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAABZSfafzMyIijtN2N48R78vjdb/91p/rYT+PUUBrzb0AAKCyLGyN8/wCDSRD2pg2O6UAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">83<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y734 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">a<span class=\"_ _3\"></span> <span class=\"ff3 ls72 ws60\">tm</span><span class=\"ff3\"> <span class=\"_ _0\"></span>structure<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2\">representing<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>this <span class=\"_ _3\"></span>d<span class=\"_ _0\"></span>ate<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">1.13</div><div class=\"t m3 x21 hd y1b2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">che<span class=\"_ _0\"></span>ckDa<span class=\"_ _0\"></span>teLimit<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b4 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0 ws10\">checkDa<span class=\"_ _3\"></span>teLimit(<span class=\"fc9 ws0\">i<span class=\"_ _3\"></span>nt <span class=\"_ _0\"></span><span class=\"fc0\">yea<span class=\"_ _3\"></span>r, <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0\">month, </span>int <span class=\"fc0\">d<span class=\"_ _0\"></span>ay<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff2 fs0 fc0 sc0 ls1 ws0\">Check date <span class=\"_ _0\"></span>limit according <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>system da<span class=\"_ _0\"></span>te<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2b5 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y120 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y226 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y46f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y4ac ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y240 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1ea ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y48e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1eb ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y756 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y4af ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y212 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb ye8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1ee ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y298 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y757 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y4a3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y78f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb ybf ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y215 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y216 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y759 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y51b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y75a ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb yb2 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y790 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y791 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y13c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y22e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y50f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y655 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y792 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y510 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y793 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y232 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y657 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y512 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y794 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y795 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y796 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y514 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y797 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y3e8 ff3 fs0 fc4 sc0 ls1 ws10\">1.17</div><div class=\"t m3 x21 hd y3e8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y3e8 ff3 fs0 fc4 sc0 ls1 ws10\">ran<span class=\"_ _0\"></span>dom<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y798 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6b8 ff3 fs0 fc5 sc0 ls1 ws0\">inline <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"fc0 ws10\">random(</span>unsigned int <span class=\"_ _0\"></span><span class=\"fc0\">limi<span class=\"_ _0\"></span>t) </span></span></div><div class=\"t m0 x7 hc y280 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y799 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y282 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">a <span class=\"_ _0\"></span>randam value based <span class=\"ls1f ws16\">on</span> <span class=\"_ _0\"></span>the lim<span class=\"_ _0\"></span>it. </span></div><div class=\"t m2 xc hc y3eb ff3 fs0 fc4 sc0 ls1 ws10\">1.18</div><div class=\"t m3 x21 hd y3eb ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y3eb ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tVarL<span class=\"_ _0\"></span>imit </div><div class=\"t m0 x7 hc y79a ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls60\">&lt;</span>typename <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></div></div><div class=\"c x7 y79b w23 h2e\"><div class=\"t m0 x0 hc y469 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">ans<span class=\"_ _3\"></span>wer = <span class=\"_ _0\"></span>(is::checkDate<span class=\"_ _3\"></span>Limit(<span class=\"fcc ls24\">2023</span>,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fcc ls24\">1<span class=\"fc0 ls73\">, </span>1<span class=\"fc0 ls1\">) ? <span class=\"ff3 fc5\">tr<span class=\"_ _0\"></span>ue<span class=\"_ _3\"></span> <span class=\"ff2 fc0\">: <span class=\"_ _0\"></span><span class=\"ff3 fc5\">false<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 fcd ls67\">//<span class=\"ls1\"> Return <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>current date <span class=\"ls1d ws13\">is</span> 202<span class=\"_ _0\"></span>2/12<span class=\"_ _0\"></span>/31<span class=\"fc0\"> </span></span></span></span></span></span></span></span></span></div></div><div class=\"c xc y79c w13 h2e\"><div class=\"t m0 x0 hc y79d ff3 fs0 fc4 sc0 ls1 ws10\">1<span class=\"_ _0\"></span>.14<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div></div><div class=\"c x20 y79c w24 h2e\"><div class=\"t m0 x0 hc y79d ff3 fs0 fc4 sc0 ls1 ws10\">show<span class=\"_ _0\"></span>Log<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x7 y79e w25 h31\"><div class=\"t m0 x0 hc y79f ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">showLog(<span class=\"fc9 ws0\">c<span class=\"_ _3\"></span>onst </span><span class=\"ff3 fc5\">std::str<span class=\"_ _3\"></span>ing</span><span class=\"ws0\">&amp; <span class=\"_ _0\"></span>st<span class=\"_ _3\"></span>r <span class=\"_ _0\"></span>, <span class=\"fc9\">bool </span>stopApplication<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">false<span class=\"ff2 fc0 ws0\">) </span></span></span></span></div><div class=\"t m0 x0 hb y7a0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y404 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y38e ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y79e w25 h31\"><div class=\"t m0 x0 hc y747 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y612 ff2 fs0 fc0 sc0 ls1 ws0\">Displays messages <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the console. <span class=\"ls17 ws15\">If</span> <span class=\"ff3\">stopApplication<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"ff3\">true </span></span>it<span class=\"ls1 ws0\"> stops <span class=\"_ _0\"></span>the app<span class=\"_ _0\"></span>licat<span class=\"_ _0\"></span>ion. </span></span></span></div></div><div class=\"c xc y7a1 w13 h2e\"><div class=\"t m0 x0 hc y42e ff3 fs0 fc4 sc0 ls1 ws10\">1<span class=\"_ _0\"></span>.15<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div></div><div class=\"c x20 y7a1 w26 h2e\"><div class=\"t m0 x0 hc y42e ff3 fs0 fc4 sc0 ls1 ws10\">arra<span class=\"_ _0\"></span>ySiz<span class=\"_ _0\"></span>e<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x7 y7a2 w27 h41\"><div class=\"t m0 x0 hc y77e ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>size_t <span class=\"ff2 fc0\">SIZE, <span class=\"_ _0\"></span><span class=\"ff3 fc5\">class <span class=\"ff2 fc0 ls74 ws61\">T&gt;<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x0 hb y7a3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y79f ff3 fs0 fc5 sc0 ls1 ws0\">inline <span class=\"_ _0\"></span>size_<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span><span class=\"ff2 fc0\">arraySize(T <span class=\"_ _0\"></span>(&amp;arr)[<span class=\"_ _0\"></span>SIZ<span class=\"_ _0\"></span>E]) </span></div><div class=\"t m0 x0 hb y617 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y404 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y7a4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x7 y7a2 w27 h41\"><div class=\"t m0 x0 h1a y747 ff3 fsa fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y7a5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>size <span class=\"ls1c ws12\">of</span> <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>array. </span></div></div><div class=\"c xc y7a6 w13 h2e\"><div class=\"t m0 x0 hc y7a7 ff3 fs0 fc4 sc0 ls1 ws10\">1<span class=\"_ _0\"></span>.16<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div></div><div class=\"c x20 y7a6 w28 h2e\"><div class=\"t m0 x0 hc y7a7 ff3 fs0 fc4 sc0 ls1 ws10\">cho<span class=\"_ _0\"></span>ose<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x23 y7a8 w29 h42\"><div class=\"t m0 x0 hc y7a9 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">typename </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x0 hb y7aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y7ab ff2 fs0 fc0 sc0 ls1 ws0\">T <span class=\"_ _0\"></span>choos<span class=\"_ _3\"></span>e(</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3c hb y7ac ff2 fs0 fc9 sc0 ls1 ws0\">unsigned s<span class=\"_ _3\"></span>hort <span class=\"fc0\">valNumber, T x1, T<span class=\"_ _0\"></span> x2, <span class=\"_ _3\"></span>T <span class=\"ls29 ws20\">x3</span> = <span class=\"fcc ls60\">0</span>, T <span class=\"_ _0\"></span><span class=\"ls29 ws20\">x4<span class=\"ls1 ws0\"> = <span class=\"_ _0\"></span><span class=\"fcc ls60\">0<span class=\"fc0 ls1\">, T <span class=\"ls29 ws20\">x5</span> = </span><span class=\"ls24\">0<span class=\"fc0 ls1\">, T <span class=\"_ _0\"></span><span class=\"ls29 ws20\">x6<span class=\"ls1 ws0\"> = <span class=\"fcc ls60\">0</span>, T </span>x7<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>= <span class=\"fcc ls24\">0</span>, T <span class=\"_ _0\"></span><span class=\"ls29 ws20\">x8<span class=\"ls1 ws0\"> = <span class=\"fcc ls24\">0</span>, T </span>x9<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>= <span class=\"fcc\">0</span></span></span></span></span></span></span></span></span></span></span></div></div><div class=\"c x23 y7a8 w29 h42\"><div class=\"t m0 x3d hb y7ab ff2 fs0 fc0 sc0 ls1 ws0\">) </div><div class=\"t m0 x0 hb y7ad ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y7ae ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y7af ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y7a8 w29 h42\"><div class=\"t m0 x0 hc y7b0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y7b1 ff2 fs0 fc0 sc0 ls1 ws0\">Selects a <span class=\"_ _0\"></span>value r<span class=\"_ _0\"></span>andoml<span class=\"_ _0\"></span>y. </div><div class=\"t m0 x0 hc y7b2 ff3 fs0 fcb sc0 ls1 ws0\">Parameter </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x27 hc y63a ff3 fs0 fc0 sc0 ls1 ws0\">valNumber<span class=\"_ _3\"></span> <span class=\"ff2\">the <span class=\"_ _0\"></span>number <span class=\"ls1c ws12\">of</span> values <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> te<span class=\"_ _0\"></span>st<span class=\"_ _0\"></span>. </span></span></span></div></div><div class=\"c x23 y7a8 w29 h42\"><div class=\"t m0 x0 hb y7b3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y7b4 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x0 hc y7b5 ff3 fs0 fc5 sc0 ls1 ws0\">std::cout <span class=\"ff2 fc0 ls24\">&lt;&lt;<span class=\"ls1\"> </span></span>is:: <span class=\"_ _0\"></span><span class=\"ff2 fc0 ws10\">choose(<span class=\"fcc ls24\">3</span><span class=\"ws0\">,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fcc ls24 ws1d\">7,<span class=\"ls1 ws0\"> <span class=\"ls71 ws62\">12,</span> 4<span class=\"fc0\">) </span></span><span class=\"fc0\">&lt;&lt;<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::e<span class=\"_ _3\"></span>ndl<span class=\"ff2 fc0 ws0\">; <span class=\"fcd ls67\">//<span class=\"ls1\"> Its <span class=\"_ _0\"></span>display<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">in<span class=\"ls1 ws0\"> the console r<span class=\"_ _0\"></span>andoml<span class=\"_ _3\"></span>y 7 <span class=\"ls1c ws12\">or</span> <span class=\"_ _0\"></span><span class=\"ls24\">12<span class=\"ls16\"> <span class=\"ls1c ws12\">or</span><span class=\"ls1\"> 4<span class=\"_ _0\"></span><span class=\"fc0\"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf53\" class=\"pf w0 h0\" data-page-no=\"53\"><div class=\"pc pc53 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbwQ2DMAxA0brilnv2Xy8D5JiYMVrZ721gAxJfgcjMDwAAAEV9rQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcFAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+KwAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9VkBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAwB97ms8fET0HX2vNOT0AAACg+oo758hdAACg8st/ZtoCAABAVf7rAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAwK88Pcfee7v2AADQ0BhD9bVw73W7AwAAHfjCEwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAgBoiM20BAACgKmd9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAIC3/To2AggKoig6W4EhkmpBESowylCDiB7MSOVK0IIyfhOEcqF/TrbxvuSi+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAN/R00MAAAB5SURBVACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAAAfqq/ttoiIaJaivIaIo1/3eXrvc6yra4gMpJTsAgCAnN0Z++M/HwHxK5zqN+cKAAAAAElFTkSuQmCC\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">84<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y734 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setVa<span class=\"_ _3\"></span>rLimit(T &amp;var, T valMin, T <span class=\"_ _0\"></span>valM<span class=\"_ _0\"></span>ax) </span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b4 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>frame a <span class=\"_ _0\"></span>value<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">1.19</div><div class=\"t m3 x21 hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">is<span class=\"_ _0\"></span>In<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y43b ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0 ws10\">isIn(</span>unsigned short <span class=\"fc0\">valN<span class=\"_ _3\"></span>umber, </span>int const <span class=\"fc0\">var, </span>int <span class=\"fc0\">x1, </span>int <span class=\"fc0\">x2, </span>int <span class=\"fc0 ls77 ws63\">x3<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> = <span class=\"fcc ls24\">0</span><span class=\"ls73\">, </span><span class=\"fc9\">int </span>x4 = <span class=\"fcc ls24\">0</span><span class=\"ls38\">, </span><span class=\"fc9\">int </span><span class=\"ls29 ws20\">x5</span> <span class=\"_ _0\"></span><span class=\"ls2c\">= <span class=\"fcc ls24\">0</span><span class=\"ls1\">, <span class=\"fc9\">int </span><span class=\"ls29 ws20\">x6</span> <span class=\"ls24\">= <span class=\"fcc ls60\">0</span></span>, <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0 ls29 ws20\">x7</span><span class=\"fc0\"> <span class=\"ls24\">= <span class=\"fcc\">0</span></span>, </span>int </span></span></span></span></span></div><div class=\"t m0 x7 hb y57a ff2 fs0 fc0 sc0 ls1 ws0\">x8 = <span class=\"fcc ls60\">0</span><span class=\"ls73\">, </span><span class=\"fc9\">int </span>x9 = <span class=\"fcc ls24\">0</span>) </div><div class=\"t m0 x7 hc y375 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7b6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1bb ff2 fs0 fc0 sc0 ls1 ws0\">Check <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>val<span class=\"_ _3\"></span>ue <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>a variable <span class=\"ls1d ws13\">is</span> <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> a value se<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x7 hb y3f6 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y8d ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y2c2 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y7b7 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y7b8 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y7b9 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb yc5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y7ba ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4f0 ff3 fs0 fc4 sc0 ls1 ws10\">1.20</div><div class=\"t m3 x21 hd y4f0 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4f0 ff3 fs0 fc4 sc0 ls1 ws10\">is<span class=\"_ _0\"></span>Betwee<span class=\"_ _0\"></span>n<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y7bb ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4f2 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0 ws10\">isB<span class=\"_ _3\"></span>etween(<span class=\"fc9 ws0\">float </span><span class=\"ls23 ws1a\">a,</span><span class=\"ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"_ _3\"></span><span class=\"fc0 ls26 ws1c\">b,</span><span class=\"fc0\"> </span>float <span class=\"_ _0\"></span><span class=\"fc0 ls78 ws64\">c)<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x7 hc y7bc ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7bd ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y7be ff2 fs0 fc0 sc0 ls1 ws0\">Check <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>a<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>value <span class=\"ls1d ws13\">is</span> <span class=\"ls1d ws13\">in</span><span class=\"ls75\"> <span class=\"ls23 ws1a\">an</span></span> i<span class=\"_ _0\"></span>nterv<span class=\"_ _0\"></span>al. </div><div class=\"t m0 x1 hb y7bf ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y7c0 ff3 fs0 fc4 sc0 ls1 ws10\">1.21</div><div class=\"t m3 x21 hd y7c0 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y7c0 ff3 fs0 fc4 sc0 ls1 ws10\">is<span class=\"_ _0\"></span>Crossin<span class=\"_ _0\"></span>g<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y528 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y529 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0 ws10\">isCr<span class=\"_ _3\"></span>ossing(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"fc0\">l1, <span class=\"_ _0\"></span><span class=\"fc9\">float<span class=\"_ _3\"></span> <span class=\"fc0\">r1, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">l2, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">r<span class=\"_ _0\"></span>2)<span class=\"_ _0\"></span> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y7c1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y52b ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y47c ff2 fs0 fc0 sc0 ls1 ws0\">Checks <span class=\"ls1d ws13\">if</span> <span class=\"_ _0\"></span>the point <span class=\"_ _0\"></span>intersects<span class=\"_ _3\"></span> an<span class=\"_ _0\"></span>other<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y7c2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y52e ff3 fs0 fc4 sc0 ls1 ws10\">1.22</div><div class=\"t m3 x21 hd y52e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y52e ff3 fs0 fc4 sc0 ls1 ws10\">si<span class=\"_ _0\"></span>de<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y7c3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y7c4 ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0\">side(Po<span class=\"_ _3\"></span>int <span class=\"ls5c ws4c\">m,</span> Point <span class=\"_ _0\"></span>a,Poi<span class=\"_ _3\"></span>nt <span class=\"ls79 ws65\">b)</span> </span></div><div class=\"t m0 x7 hc y7c5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7c6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y7c7 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0 ls76\">-</span><span class=\"ff2 fcc\">1 <span class=\"fc0 ls1b ws11\">to</span><span class=\"fc0\"> the <span class=\"_ _0\"></span>left, <span class=\"fcc\">1 </span><span class=\"ls1e ws14\">to</span> <span class=\"_ _0\"></span>the right, <span class=\"fcc\">0 </span><span class=\"ls1d ws13\">if</span> <span class=\"ff3\">a b <span class=\"_ _0\"></span>c <span class=\"ff2\">a<span class=\"_ _3\"></span>re al<span class=\"_ _0\"></span>igned<span class=\"_ _0\"></span>. </span></span></span></span></div><div class=\"t m0 x1 hb y7c8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y7c9 ff3 fs0 fc4 sc0 ls1 ws10\">1.23</div><div class=\"t m3 x21 hd y7c9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y7c9 ff3 fs0 fc4 sc0 ls1 ws0\">si<span class=\"_ _0\"></span>gn<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y7ca ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"fc0 ws10\">sign(</span>float <span class=\"fc0\">x) </span></div><div class=\"t m0 x7 hc y4dc ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y7cb ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the sign <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> val<span class=\"_ _0\"></span>ue. </span></span></span></div><div class=\"t m0 x1 hb y691 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y7cc ff3 fs0 fc4 sc0 ls1 ws10\">1.24</div><div class=\"t m3 x21 hd y7cc ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y7cc ff3 fs0 fc4 sc0 ls1 ws0\">poi<span class=\"_ _0\"></span>ntDir<span class=\"_ _0\"></span>ection<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y7cd ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls60\">&lt;</span>typename <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y3b4 ff2 fs0 fc0 sc0 ls1 ws0\">T <span class=\"_ _0\"></span>pointDirectio<span class=\"_ _3\"></span>n(<span class=\"fc9\">float </span>x1, <span class=\"fc9\">float </span>y1, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">x2, </span>float <span class=\"fc0\">y<span class=\"_ _0\"></span>2<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x7 hc y7ce ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div></div><div class=\"c x23 y7cf w4 h43\"><div class=\"t m0 x0 hc y7d0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 h17 y7d1 ff2 fsa fc9 sc0 ls1 ws0\">int </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3b h17 y308 ff2 fsa fc0 sc0 ls1 ws59\">year<span class=\"_ _0\"></span>(<span class=\"fcc\">20<span class=\"_ _0\"></span>20<span class=\"fc0 ls6f ws5e\">);<span class=\"ls1 ws0\"> </span></span></span></div></div><div class=\"c x23 y7cf w4 h43\"><div class=\"t m0 x24 hc y7d2 ff3 fs0 fc5 sc0 ls34 ws28\">if<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hc y5d4 ff2 fs0 fc0 sc0 ls55\">(<span class=\"ff3 fc5 ls1 ws10\">is::</span><span class=\"ls1 ws10\">isIn(<span class=\"fcc ls24\">3</span><span class=\"ws0\">, year, <span class=\"fcc ls24\">2020</span><span class=\"ls73\">, </span></span><span class=\"fcc\">2012</span><span class=\"ws0\">, </span><span class=\"fcc\">2000</span></span><span class=\"ls32 ws35\">))</span><span class=\"ls1 ws0\"> <span class=\"fcd ls67\">//<span class=\"ls1\"> <span class=\"_ _0\"></span>This condition will <span class=\"ls22 ws19\">be</span> <span class=\"_ _0\"></span>true because<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>the value <span class=\"ls1c ws12\">of</span> <span class=\"ff3\">year <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">is<span class=\"ls1 ws0\"> found <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>the f<span class=\"_ _0\"></span>unction<span class=\"fc0\"> </span></span></span></span></span></span></span></div></div><div class=\"c x23 y7cf w4 h43\"><div class=\"t m0 x24 hb y746 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hb y2c3 ff2 fs0 fcd sc0 ls35 ws29\">//<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls36 ws2a\">Do<span class=\"ls1 ws0\"> some<span class=\"_ _0\"></span>thin<span class=\"_ _0\"></span>g<span class=\"fc0\"> </span></span></span></span></div></div><div class=\"c x23 y7cf w4 h43\"><div class=\"t m0 x24 hb y42e ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf54\" class=\"pf w0 h0\" data-page-no=\"54\"><div class=\"pc pc54 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">85<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y734 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Determine <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>angle betwe<span class=\"_ _3\"></span>en tw<span class=\"_ _0\"></span>o<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>poin<span class=\"_ _0\"></span>ts. </div><div class=\"t m0 x1 hb y577 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">1.25</div><div class=\"t m3 x21 hd y1e2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e2 ff3 fs0 fc4 sc0 ls1 ws10\">poi<span class=\"_ _0\"></span>ntDis<span class=\"_ _0\"></span>tanc<span class=\"_ _0\"></span>e<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4bb ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0 ws10\">pointD<span class=\"_ _3\"></span>istance(<span class=\"fc9 ws0\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">x1, <span class=\"fc9\">float </span>y1, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">x2,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">y2<span class=\"_ _0\"></span>) </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff2 fs0 fc0 sc0 ls1 ws0\">Determine <span class=\"_ _0\"></span>the distance between two <span class=\"_ _0\"></span>poin<span class=\"_ _0\"></span>ts. </div><div class=\"t m0 x1 hb y5c4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20c ff3 fs0 fc4 sc0 ls1 ws10\">1.26</div><div class=\"t m3 x21 hd y20c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20c ff3 fs0 fc4 sc0 ls1 ws0\">ra<span class=\"_ _0\"></span>dToDeg </div><div class=\"t m0 x7 hb y226 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"fc0 ws10\">radToDeg(</span>float <span class=\"_ _3\"></span><span class=\"fc0\">x) </span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y294 ff2 fs0 fc0 sc0 ls1 ws0\">Convert r<span class=\"_ _0\"></span>adia<span class=\"_ _3\"></span>nt <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>de<span class=\"_ _0\"></span>gree. </div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">1.27</div><div class=\"t m3 x21 hd y227 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y227 ff3 fs0 fc4 sc0 ls1 ws0\">deg<span class=\"_ _0\"></span>ToRad<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y4af ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"fc0 ws10\">degToRad(</span>fl<span class=\"_ _3\"></span>oat <span class=\"fc0\">x) </span></div><div class=\"t m0 x7 hc y228 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y298 ff2 fs0 fc0 sc0 ls1 ws0\">Convert degree <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>radian<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y48f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f1 ff3 fs0 fc4 sc0 ls1 ws10\">1.28</div><div class=\"t m3 x21 hd y1f1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1f1 ff3 fs0 fc4 sc0 ls1 ws10\">len<span class=\"_ _0\"></span>gthD<span class=\"_ _0\"></span>irX<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc yec ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0 ws10\">lengthDi<span class=\"_ _3\"></span>rX(<span class=\"fc9 ws0\">float <span class=\"fc0\">dir, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">a<span class=\"_ _3\"></span>ngle, <span class=\"_ _0\"></span><span class=\"fc9\">bool <span class=\"fc0\">useScreenScale = <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">false<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y215 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y216 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc yc1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>component<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> <span class=\"ls4f ws41\">x.</span> </span></span></span></div><div class=\"t m0 x1 hb y1f6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f7 ff3 fs0 fc0 sc0 ls1 ws0\">useScreenScale <span class=\"ff2\">allows <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> take into <span class=\"_ _0\"></span>account<span class=\"_ _3\"></span> the <span class=\"_ _0\"></span>scale <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the screen during c<span class=\"_ _0\"></span>alcula<span class=\"_ _0\"></span>tion<span class=\"_ _0\"></span>s. </span></span></span></div><div class=\"t m0 x1 hb y1f8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2ea ff3 fs0 fc4 sc0 ls1 ws10\">1.29</div><div class=\"t m3 x21 hd y2ea ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2ea ff3 fs0 fc4 sc0 ls1 ws10\">len<span class=\"_ _0\"></span>gthD<span class=\"_ _0\"></span>irY<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y219 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0 ws10\">lengthDi<span class=\"_ _3\"></span>rY(<span class=\"fc9 ws0\">float <span class=\"fc0\">dir, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">a<span class=\"_ _3\"></span>ngle, <span class=\"_ _0\"></span><span class=\"fc9\">bool <span class=\"fc0\">useScreenScale<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls24\">= <span class=\"ff3 fc5 ls1 ws10\">false<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y4b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc yee ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y249 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>component<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> <span class=\"ls28 ws1f\">y.</span> </span></span></span></div><div class=\"t m0 x7 hc y1fd ff3 fs0 fc0 sc0 ls1 ws0\">useScreenScale <span class=\"ff2\">allows <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> take into <span class=\"_ _0\"></span>account<span class=\"_ _3\"></span> the <span class=\"_ _0\"></span>scale <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the screen during c<span class=\"_ _0\"></span>alcula<span class=\"_ _0\"></span>tion<span class=\"_ _0\"></span>s. </span></span></span></div><div class=\"t m0 x1 hb y4b3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y93 ff3 fs0 fc4 sc0 ls1 ws10\">1.30</div><div class=\"t m3 x21 hd y93 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y93 ff3 fs0 fc4 sc0 ls1 ws0\">in<span class=\"_ _0\"></span>crease<span class=\"_ _0\"></span>Var </div><div class=\"t m0 x7 hc y398 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls60\">&lt;</span>typename <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y238 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">increaseVar(<span class=\"fc9 ws0\">c<span class=\"_ _3\"></span>onst float <span class=\"fc0\">&amp;DELTA_TIME, T <span class=\"_ _0\"></span>&amp;var, <span class=\"_ _0\"></span>T increase<span class=\"_ _3\"></span>Value, T varFinal, <span class=\"_ _0\"></span>T varMax<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x7 hc y96 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y220 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y201 ff2 fs0 fc0 sc0 ls1 ws0\">Increment a <span class=\"_ _0\"></span>variable with <span class=\"_ _0\"></span>execution<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>time. </div><div class=\"t m0 x1 hb y432 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y202 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y23d ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y23e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y658 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3a0 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y7d3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y7d4 ff3 fs0 fc4 sc0 ls1 ws10\">1.31</div><div class=\"t m3 x21 hd y7d4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y7d4 ff3 fs0 fc4 sc0 ls1 ws10\">dec<span class=\"_ _0\"></span>rease<span class=\"_ _0\"></span>Var<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x23 y7d5 w4 h44\"><div class=\"t m0 x0 hc y7d6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y7b4 ff2 fs0 fc9 sc0 ls1 ws0\">int </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3b hb y251 ff2 fs0 fc0 sc0 ls1 ws10\">var<span class=\"_ _0\"></span>(<span class=\"fcc\">0</span><span class=\"ls5f ws4f\">);</span><span class=\"ws0\"> </span></div></div><div class=\"c x23 y7d5 w4 h44\"><div class=\"t m0 x24 hc y7d7 ff3 fs0 fc5 sc0 ls1 ws10\">is::</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3b hc y7d8 ff2 fs0 fc0 sc0 ls1 ws0\">increaseVar(DELTA_TIM<span class=\"_ _3\"></span>E, var, <span class=\"fcc ls24\">1</span>, <span class=\"_ _0\"></span><span class=\"fcc ls24\">15<span class=\"fc0 ls1\">, </span>10<span class=\"fc0 ls32 ws35\">));<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fcd ls67\">//<span class=\"ls1\"> The <span class=\"_ _0\"></span>va<span class=\"_ _3\"></span>riable <span class=\"ffa ls7a\">“</span><span class=\"ff3 ws10\">var<span class=\"ffa\">”</span></span> <span class=\"_ _0\"></span>will i<span class=\"_ _3\"></span>ncrement with <span class=\"_ _0\"></span>the value <span class=\"ls24 ws1d\">1.</span> <span class=\"_ _0\"></span><span class=\"ls2e ws23\">If<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls7b ws66\">is<span class=\"_ _3\"></span><span class=\"fc0 ls1 ws0\"> </span></span></span></span></span></span></span></span></span></span></span></div></div><div class=\"c x23 y7d5 w4 h44\"><div class=\"t m0 x3e h17 y2fe ff2 fsa fcd sc0 ls7c ws67\">//<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>greater than <span class=\"_ _0\"></span><span class=\"ls7d ws68\">10<span class=\"ls1 ws0\"> <span class=\"ls48 ws3a\">it</span> becomes <span class=\"_ _0\"></span><span class=\"ls7d ws68\">15<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>and th<span class=\"_ _3\"></span>e in<span class=\"_ _0\"></span>c<span class=\"_ _3\"></span>rement s<span class=\"_ _0\"></span>tops<span class=\"fc0\"> </span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf55\" class=\"pf w0 h0\" data-page-no=\"55\"><div class=\"pc pc55 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAA+D+RmbYAAABwK7c+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAA3vbr2AYgKArDaO4EQqW1giFMIMYwg4odJFq9EaxgjLcEpRXEO6e79f2bD0D1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqtjg0u0AAAB8SURBVA8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAD5TfW23RUREsxTlNUQc/brP03ufY11dQ2QgpWQXAADk7M7YH//5AJU4K5nM8f6wAAAAAElFTkSuQmCC\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">86<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y734 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">typename </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">decr<span class=\"_ _3\"></span>easeVar(<span class=\"fc9 ws0\">const float <span class=\"fc0\">&amp;DELTA_TIME, T <span class=\"_ _0\"></span>&amp;var,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>T decreaseValue, T varFinal <span class=\"ls24\">= <span class=\"fcc\">0</span></span>, T <span class=\"_ _0\"></span>varMin = <span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2ff ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b5 ff2 fs0 fc0 sc0 ls1 ws0\">Decrement a <span class=\"_ _0\"></span>variable with <span class=\"_ _0\"></span>execution<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>ti<span class=\"_ _0\"></span>me.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y43c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y4ab ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y7d9 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y43f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y59c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y7da ff3 fs0 fc4 sc0 ls1 ws10\">1.32</div><div class=\"t m3 x21 hd y7da ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y7da ff3 fs0 fc4 sc0 ls1 ws10\">co<span class=\"_ _0\"></span>llisi<span class=\"_ _0\"></span>onTest<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y773 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y59e ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">collisionTest(Recta<span class=\"_ _3\"></span>ngle </span>const<span class=\"_ _3\"></span> <span class=\"fc0\">&amp;a, Rectangl<span class=\"_ _3\"></span>e </span>const <span class=\"fc0\">&amp;b)<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y62a ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">collisionTest(Ci<span class=\"_ _3\"></span>rcle </span>const <span class=\"fc0\">&amp;a, Circl<span class=\"_ _3\"></span>e </span>const <span class=\"fc0\">&amp;b)<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y7db ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">collisionT<span class=\"_ _3\"></span>est(Circle </span>con<span class=\"_ _3\"></span>st <span class=\"fc0\">&amp;circle, R<span class=\"_ _3\"></span>ectangle </span>const<span class=\"_ _3\"></span> <span class=\"fc0\">&amp;rec) </span></div><div class=\"t m0 x7 hb y7dc ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">collisionT<span class=\"_ _3\"></span>est(Rectangle </span>const<span class=\"_ _3\"></span> <span class=\"fc0\">&amp;rec, Circl<span class=\"_ _3\"></span>e </span>const <span class=\"_ _3\"></span><span class=\"fc0\">&amp;circle) </span></div><div class=\"t m0 x7 hc y7dd ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y7de ff2 fs0 fc0 sc0 ls1 ws0\">Test <span class=\"_ _0\"></span>the collision between the <span class=\"_ _0\"></span>Rectangle and Circle <span class=\"_ _0\"></span>collision mask<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y310 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y310 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y310 ff3 fs0 fc4 sc0 ls1 ws0\">Function <span class=\"ls42 ws34\">on</span> <span class=\"_ _0\"></span>objects<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>SFM<span class=\"_ _0\"></span>L<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y2cb ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y2cb ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2cb ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tVect<span class=\"_ _0\"></span>or2<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y7df ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y13a ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _0\"></span><span class=\"ff2 fc0\">T1, <span class=\"fc9\">typename </span>T<span class=\"_ _0\"></span>2<span class=\"_ _0\"></span>&gt; </span></div><div class=\"t m0 x1 hb y7e0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y44b ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setVecto<span class=\"_ _3\"></span>r2(T1 &amp;v, <span class=\"ls39 ws2c\">T2</span> <span class=\"ls29 ws20\">x,</span> <span class=\"_ _0\"></span><span class=\"ls39 ws2c\">T2<span class=\"ls1 ws0\"> <span class=\"ls28 ws1f\">y)</span> </span></span></span></div><div class=\"t m0 x1 hb y4d1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4d2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2d2 ff2 fs0 fc0 sc0 ls1 ws0\">Define the <span class=\"_ _0\"></span>x and <span class=\"_ _0\"></span>y<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>value<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>a Vector2 <span class=\"_ _0\"></span>(<span class=\"_ _3\"></span>Vector2f, Vector2i, <span class=\"ffa ls7e ws69\">…)<span class=\"_ _3\"></span></span> type <span class=\"_ _0\"></span>class<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y4d3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y662 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y662 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y662 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjAng<span class=\"_ _0\"></span>le </div><div class=\"t m0 x7 hc y7e1 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y7e2 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjAngle(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j)<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x1 hb y7e3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y7e4 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y4d8 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the angle <span class=\"ls1c ws12\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject. </span></span></span></div><div class=\"t m0 x1 hb y456 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4da ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y4da ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y4da ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjXSca<span class=\"_ _0\"></span>le </div><div class=\"t m0 x7 hc y4dc ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y7e5 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjXScale(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j) </span></div><div class=\"t m0 x7 hc y667 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7e6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y7e7 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the x-scale <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y45d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y66a ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y66a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y66a ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjYSca<span class=\"_ _0\"></span>le </div><div class=\"t m0 x7 hc y7e8 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div></div><div class=\"c x23 y7e9 w4 h44\"><div class=\"t m0 x0 hb y60f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y610 ff2 fs0 fc9 sc0 ls1 ws0\">int </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3b hb y2b5 ff2 fs0 fc0 sc0 ls1 ws10\">var<span class=\"_ _0\"></span>(<span class=\"fcc ls7f ws6a\">40</span><span class=\"ls5f ws4f\">);</span><span class=\"ws0\"> </span></div></div><div class=\"c x23 y7e9 w4 h44\"><div class=\"t m0 x24 hc y462 ff3 fs0 fc5 sc0 ls1 ws10\">is::</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3b hc y7ea ff2 fs0 fc0 sc0 ls1 ws0\">decreaseVar(DELTA_<span class=\"_ _3\"></span>TIME,<span class=\"_ _3\"></span> var, <span class=\"fcc ls24\">1</span><span class=\"ls73\">, <span class=\"fcc ls24\">20</span></span>, <span class=\"_ _0\"></span><span class=\"fcc ls24\">25<span class=\"fc0 ls32 ws35\">));<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fcd ls67\">//<span class=\"ls1\"> The variable <span class=\"_ _0\"></span><span class=\"ffa ls7a\">“<span class=\"ff3 ls1 ws10\">var<span class=\"ffa\">”<span class=\"ff2 ws0\"> will decrement with the <span class=\"_ _0\"></span>value <span class=\"ls24 ws1d\">1.</span> <span class=\"_ _0\"></span><span class=\"ls17 ws15\">If<span class=\"ls1 ws0\"> <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span><span class=\"ls7b ws66\">is<span class=\"fc0 ls1 ws0\"> </span></span></span></span></span></span></span></span></span></span></span></span></span></div></div><div class=\"c x23 y7e9 w4 h44\"><div class=\"t m0 x3f hb y463 ff2 fs0 fcd sc0 ls67\">//<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>less than <span class=\"ls24\">25</span> <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span>becomes <span class=\"_ _3\"></span><span class=\"ls2c ws5b\">20</span> <span class=\"_ _0\"></span>and the decrement s<span class=\"_ _0\"></span>top<span class=\"_ _0\"></span>s<span class=\"fc0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf56\" class=\"pf w0 h0\" data-page-no=\"56\"><div class=\"pc pc56 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hb y117 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjYScal<span class=\"_ _3\"></span>e(T <span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j) </span></div><div class=\"t m0 x1 hb y577 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the y-scale <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e4 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y1e4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e4 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjWid<span class=\"_ _0\"></span>th </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y4ab ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjWidth(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j) </span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>width<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </span></div><div class=\"t m0 x1 hb y240 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1ea ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y1ea ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1ea ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjHeig<span class=\"_ _0\"></span>ht </div><div class=\"t m0 x7 hc y227 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y4af ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjHeight(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j) </span></div><div class=\"t m0 x7 hc y228 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y213 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the he<span class=\"_ _0\"></span>ight<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the obje<span class=\"_ _0\"></span>ct. </span></div><div class=\"t m0 x1 hb y1f0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y24c ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y24c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y24c ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>SFMLT<span class=\"_ _0\"></span>extur<span class=\"_ _0\"></span>eWidt<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hb ybf ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0\">getSFMTextureWidth(sf::<span class=\"_ _3\"></span>Texture<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">&amp;o<span class=\"_ _0\"></span>bj<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x1 hb y1f2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f3 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y217 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>width<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>Textu<span class=\"_ _0\"></span>re. </span></div><div class=\"t m0 x1 hb y42f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y248 ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y248 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y248 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>SFMLT<span class=\"_ _0\"></span>extur<span class=\"_ _0\"></span>eHeig<span class=\"_ _0\"></span>ht<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y392 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2ea ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etSFMLTextureH<span class=\"_ _3\"></span>eight(sf::Texture<span class=\"_ _3\"></span> <span class=\"fc9\">con<span class=\"_ _0\"></span>st<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">&amp;<span class=\"_ _0\"></span>obj<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x7 hc y219 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y393 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc ya1 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the he<span class=\"_ _0\"></span>ight<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the Text<span class=\"_ _0\"></span>ure<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y394 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y638 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y638 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y638 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjOrig<span class=\"_ _0\"></span>inX </div><div class=\"t m0 x7 hc y396 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y21c ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjOrigin<span class=\"_ _3\"></span>X(T <span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j) </span></div><div class=\"t m0 x1 hb y4b4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1fe ff3 fs0 fca sc0 ls1 ws0\">Source Code </div><div class=\"t m0 x7 hc y39a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>origin <span class=\"_ _2\"></span><span class=\"ls29 ws20\">x.<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m2 xc hc y96 ff3 fs0 fc4 sc0 ls1 ws10\">2.10</div><div class=\"t m3 x21 hd y96 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y96 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjOrig<span class=\"_ _0\"></span>inY<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y430 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y201 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y432 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y202 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjOrigin<span class=\"_ _3\"></span>Y(T <span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j) </span></div><div class=\"t m0 x1 hb y384 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6a ff3 fs0 fca sc0 ls1 ws0\">Source Code </div><div class=\"t m0 x7 hc y5e3 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>origin <span class=\"_ _2\"></span><span class=\"ls51 ws43\">y.<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m2 xc hc y4aa ff3 fs0 fc4 sc0 ls1 ws10\">2.11</div><div class=\"t m3 x21 hd y4aa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4aa ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjX<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x22 h9 y4a1 ff4 fs4 fc0 sc0 ls19 wsf\">87<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf57\" class=\"pf w0 h0\" data-page-no=\"57\"><div class=\"pc pc57 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAgG/7dWwDEBgAYTQ3gVBprWAIE4gxzKBiB4lWbwQr/BMpLaCRvNdde90HqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAB1adp0AAAC1SURBVACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAJ9UXz8cSZJuq+oyJde4n+vy7ntumzIlLgMAAPiRB+H7R93P+LanAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y4b8 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4b8 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4b8 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y4b9 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4ba ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y7eb ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y7ec ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjX(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>obj<span class=\"_ _0\"></span>) </span></div><div class=\"t m2 xc h13 y7ed ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y7ed ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y7ed ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y7ee ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4bf ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y7ef ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y7f0 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjX(T<span class=\"_ _3\"></span> *<span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j)<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x7 hc y4c2 ff3 fs0 fca sc0 ls1 ws0\">Source Code </div><div class=\"t m0 x7 hc y7f1 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">position <span class=\"_ _0\"></span><span class=\"ls29 ws20\">x.<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m2 xc hc yb0 ff3 fs0 fc4 sc0 ls1 ws10\">2.12</div><div class=\"t m3 x21 hd yb0 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc yb0 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjY<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y581 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y581 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y581 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y7f2 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y7f3 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y7f4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y473 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjY(T<span class=\"_ _3\"></span> o<span class=\"_ _0\"></span>bj<span class=\"_ _0\"></span>) </span></div><div class=\"t m2 xc h13 y7f5 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y7f5 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y7f5 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y7f6 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y7f7 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y7f8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y7f9 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">getSFMLObjY(T<span class=\"_ _3\"></span> *<span class=\"_ _0\"></span>ob<span class=\"_ _0\"></span>j) </span></div><div class=\"t m0 x7 hc y2cb ff3 fs0 fca sc0 ls1 ws0\">Source Code </div><div class=\"t m0 x7 hc y7fa ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">position <span class=\"_ _0\"></span><span class=\"ls51 ws43\">y.<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m2 xc hc y7fb ff3 fs0 fc4 sc0 ls1 ws10\">2.13</div><div class=\"t m3 x21 hd y7fb ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y7fb ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjAng<span class=\"_ _0\"></span>le </div><div class=\"t m0 x7 hc y7fc ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y7fd ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjAngle(T &amp;obj, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">ang<span class=\"_ _0\"></span>le) </span></span></span></div><div class=\"t m0 x1 hb y44e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4d4 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7fe ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y663 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>angle<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y452 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y7ff ff3 fs0 fc4 sc0 ls1 ws10\">2.14</div><div class=\"t m3 x21 hd y7ff ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y7ff ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjRot<span class=\"_ _0\"></span>ate </div><div class=\"t m0 x7 hc y664 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y800 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjRotate(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;obj, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">rot<span class=\"_ _0\"></span>ationSp<span class=\"_ _0\"></span>eed) </span></span></span></div><div class=\"t m0 x1 hb y801 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y802 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y803 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y804 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>rotation <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e obje<span class=\"_ _0\"></span>ct. </div><div class=\"t m2 xc hc y666 ff3 fs0 fc4 sc0 ls1 ws10\">2.15</div><div class=\"t m3 x21 hd y666 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y666 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjSca<span class=\"_ _0\"></span>leX_Y<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y667 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y3b2 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjScaleX_Y(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;obj, <span class=\"fc9\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ls77 ws63\">x,<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0 ls28 ws1f\">y)<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y3b3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y805 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y806 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y807 ff2 fs0 fc0 sc0 ls1 ws0\">Define the <span class=\"_ _0\"></span>sca<span class=\"_ _3\"></span>le <span class=\"_ _0\"></span>x and <span class=\"ls28 ws1f\">y.</span> </div><div class=\"t m0 x1 hb y808 ff2 fs0 fc0 sc0 ls52 ws0\"> <span class=\"ff4 fs4 ls19 wsf v4\">88<span class=\"ls1 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf58\" class=\"pf w0 h0\" data-page-no=\"58\"><div class=\"pc pc58 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">2.16</div><div class=\"t m3 x21 hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y117 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjSca<span class=\"_ _0\"></span>le </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y48d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjScale(T &amp;obj, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">scale<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y43a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y43b ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>scale<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>x and y <span class=\"_ _0\"></span>with <span class=\"_ _3\"></span>the same <span class=\"_ _0\"></span>value<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.17</div><div class=\"t m3 x21 hd y2b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2b5 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjOr<span class=\"_ _0\"></span>igin </div><div class=\"t m0 x7 hc y20d ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y5ec ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjOrigin(T &amp;obj, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"ls1 ws0\"> <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0 ls28 ws1f\">y)<span class=\"ls1 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y2e6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y294 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y295 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1eb ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>origin x and <span class=\"_ _0\"></span><span class=\"ls28 ws1f\">y.<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m2 xc hc y211 ff3 fs0 fc4 sc0 ls1 ws10\">2.18</div><div class=\"t m3 x21 hd y211 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y211 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjX </div><div class=\"t m0 x7 hc ye8 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y2e9 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLObjX(T<span class=\"_ _3\"></span> &amp;obj, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls4f ws41\">x)</span><span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 hb y48f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y28 ff2 fs0 fc0 sc0 ls1 ws0\">Defines <span class=\"_ _0\"></span>the position <span class=\"_ _0\"></span><span class=\"ls4f ws41\">x.<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></div><div class=\"t m2 xc hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">2.19</div><div class=\"t m3 x21 hd y216 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y216 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjY </div><div class=\"t m0 x7 hc y1f5 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y4a4 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLObjY(T<span class=\"_ _3\"></span> &amp;obj, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls28 ws1f\">y)</span><span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 hb y4a5 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y218 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y22e ff2 fs0 fc0 sc0 ls1 ws0\">Defines <span class=\"_ _0\"></span>the position <span class=\"ls28 ws1f\">y.</span> </div><div class=\"t m0 x1 hb y51e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y30 ff3 fs0 fc4 sc0 ls1 ws10\">2.20</div><div class=\"t m3 x21 hd y30 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y30 ff3 fs0 fc4 sc0 ls1 ws0\">cent<span class=\"_ _0\"></span>erSF<span class=\"_ _0\"></span>MLObj </div><div class=\"t m0 x7 hc y4e6 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y396 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">centerSFMLObj(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;ob<span class=\"_ _0\"></span>j<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x7 hc y21c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y235 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y236 ff2 fs0 fc0 sc0 ls1 ws0\">Center the <span class=\"_ _0\"></span>object <span class=\"ls1d ws13\">in</span> x and <span class=\"ls80 ws6b\">y.</span> </div><div class=\"t m0 x1 hb y36 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y24a ff3 fs0 fc4 sc0 ls1 ws10\">2.21</div><div class=\"t m3 x21 hd y24a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y24a ff3 fs0 fc4 sc0 ls1 ws0\">cent<span class=\"_ _0\"></span>erSF<span class=\"_ _0\"></span>MLObjX<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y4a8 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y23a ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">centerSFMLObjX(T &amp;<span class=\"_ _0\"></span>obj<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x1 hb y23b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y23c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y23d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y203 ff2 fs0 fc0 sc0 ls1 ws0\">Center the <span class=\"_ _0\"></span>object <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span><span class=\"ls4f ws41\">x.<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> </span></span></div><div class=\"t m2 xc hc y183 ff3 fs0 fc4 sc0 ls1 ws10\">2.22</div><div class=\"t m3 x21 hd y183 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y183 ff3 fs0 fc4 sc0 ls1 ws10\">cent<span class=\"_ _0\"></span>erSF<span class=\"_ _0\"></span>MLObjY<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y23f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y205 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x22 h9 y206 ff4 fs4 fc0 sc0 ls19 wsf\">89<span class=\"ls1 ws0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf59\" class=\"pf w0 h0\" data-page-no=\"59\"><div class=\"pc pc59 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAANxjmWCkiDDCJTOryg4AADy0DrrbCgAAAFN5eAIAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAAD4tGuHNggEURRF85L1BBRyaWGKoAKyZVADCnogweIpgQLWbANbyuCgAUhgOMd9+9xNvuoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAfF5ngiYlMcK7zPPc970dAAD41TqotVoBAACgVT48AQAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAL5NZ4ImJTHCUyllHEc7AADwp3VQa7UCAABAq3x4AgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAASF8lkAAACkSURBVABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAACarL6yvSRJNqfFchqS2+58PR5e932/Xk1DYjIAAIAf8gAmVjjreGjslAAAAABJRU5ErkJggg==\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">90<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y809 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">centerSFMLObjY(T &amp;<span class=\"_ _0\"></span>obj<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x1 hb y577 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1e2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4bb ff2 fs0 fc0 sc0 ls1 ws0\">Center the <span class=\"_ _0\"></span>object <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span><span class=\"ls28 ws1f\">y.<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">2.23</div><div class=\"t m3 x21 hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjX_<span class=\"_ _0\"></span>Y<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y1b6 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y1b6 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y1b6 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y1b7 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b8 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y80a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ba ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjX_Y(T &amp;obj, <span class=\"_ _0\"></span>sf::Vector2f p<span class=\"_ _0\"></span>osit<span class=\"_ _0\"></span>ion) </span></div><div class=\"t m2 xc h13 y80b ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y80b ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y80b ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y80c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1bd ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y80d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1bf ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFM<span class=\"_ _3\"></span>LObjX_Y(T &amp;obj, <span class=\"fc9\">float </span><span class=\"ls29 ws20\">x,</span> <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0 ls28 ws1f\">y)<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y80e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1c1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y80f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1c3 ff2 fs0 fc0 sc0 ls1 ws0\">Defines the <span class=\"_ _0\"></span>position x and <span class=\"ls28 ws1f\">y.</span> </div><div class=\"t m2 xc hc y546 ff3 fs0 fc4 sc0 ls1 ws10\">2.24</div><div class=\"t m3 x21 hd y546 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y546 ff3 fs0 fc4 sc0 ls1 ws0\">move<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjX </div><div class=\"t m0 x7 hc y810 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y811 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">moveSFML<span class=\"_ _3\"></span>ObjY(T &amp;obj, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">spee<span class=\"_ _0\"></span>d) </span></span></span></div><div class=\"t m0 x7 hc y54a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y812 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y813 ff2 fs0 fc0 sc0 ls1 ws0\">Moves the <span class=\"_ _0\"></span>SFML object <span class=\"ls1c ws12\">on<span class=\"_ _3\"></span></span> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e x-a<span class=\"_ _0\"></span>xi<span class=\"_ _0\"></span>s. </div><div class=\"t m0 x1 hb y54d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y54e ff3 fs0 fc4 sc0 ls1 ws10\">2.25</div><div class=\"t m3 x21 hd y54e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y54e ff3 fs0 fc4 sc0 ls1 ws0\">move<span class=\"_ _0\"></span>SFML<span class=\"_ _0\"></span>ObjY </div><div class=\"t m0 x7 hc y814 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y815 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">moveSFML<span class=\"_ _3\"></span>ObjY(T &amp;obj, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">spee<span class=\"_ _0\"></span>d) </span></span></span></div><div class=\"t m0 x7 hc y816 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y817 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y553 ff2 fs0 fc0 sc0 ls1 ws0\">Moves the <span class=\"_ _0\"></span>SFML object <span class=\"ls1c ws12\">on<span class=\"_ _3\"></span></span> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>y-axi<span class=\"_ _0\"></span>s. </div><div class=\"t m2 xc hc y271 ff3 fs0 fc4 sc0 ls1 ws10\">2.26</div><div class=\"t m3 x21 hd y271 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y271 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjSiz<span class=\"_ _0\"></span>e<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y482 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y482 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y482 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y6d0 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y818 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y819 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y81a ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjSize(T &amp;obj, <span class=\"fc9\">float </span><span class=\"ls29 ws20\">x,</span> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0 ls28 ws1f\">y)</span><span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 hb y81b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 ya7 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd ya7 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb ya7 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y81c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y81d ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y97 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1dc ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjSize(T &amp;obj, <span class=\"_ _0\"></span>sf::Vector2f <span class=\"ls28 ws1f\">v)</span> </span></div><div class=\"t m0 x7 hc y99 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y81e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y81f ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>size <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>objec<span class=\"_ _0\"></span>t. </div><div class=\"t m2 xc hc y697 ff3 fs0 fc4 sc0 ls1 ws10\">2.27</div><div class=\"t m3 x21 hd y697 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y697 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjAlp<span class=\"_ _0\"></span>ha<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y820 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y820 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y820 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5a\" class=\"pf w0 h0\" data-page-no=\"5a\"><div class=\"pc pc5a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QFX+3VsAxAYAGE0N4FQaa1gCBOIMcygYgeJVm8EK/wTKY0gkve6a6/7AABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUH+1kXJwAAAB3SURBVAAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAAA+qr5+OJIk3VbVZUqucT/X5d333DZlSlwGAADwIw9M+DLp+QifWwAAAABJRU5ErkJggg==\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">91<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y809 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjAlpha(T &amp;obj, <span class=\"_ _0\"></span><span class=\"fc9\">unsign<span class=\"_ _3\"></span>ed <span class=\"_ _0\"></span>int <span class=\"fc0\">a<span class=\"_ _0\"></span>lpha) </span></span></span></div><div class=\"t m2 xc h13 y4bb ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4bb ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4bb ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y821 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y76b ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y822 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y823 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFM<span class=\"_ _3\"></span>LObjAlpha(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;o<span class=\"_ _3\"></span>bj, <span class=\"fc9\">unsigned int <span class=\"_ _0\"></span><span class=\"fc0\">alpha,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0 ls81 ws6c\">r,</span><span class=\"fc0\"> </span>int <span class=\"fc0 ls59 ws48\">g,<span class=\"ls75 ws0\"> </span></span>int <span class=\"fc0 ls79 ws65\">b)</span><span class=\"fc0\"> </span></span></span></span></span></div><div class=\"t m2 xc h13 y53e ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y53e ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y53e ff6 fs0 fc0 sc0 ls1 ws0\">Third <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y53f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4c2 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y4c3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4c4 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjAlpha(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;obj, <span class=\"fc9\">unsigned <span class=\"_ _0\"></span>int<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">alpha, sf::Uint8 rgb<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x1 hb y4c5 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y4c6 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y824 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y735 ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>transpar<span class=\"_ _3\"></span>ency. <span class=\"ff6\">Can <span class=\"_ _0\"></span>generate<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>WARN<span class=\"_ _3\"></span>INGS <span class=\"_ _0\"></span><span class=\"ls3c ws2f\">if<span class=\"ls1 ws0\"> used <span class=\"ls82 ws6d\">on</span> texts and <span class=\"_ _0\"></span>geometric<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>shape<span class=\"_ _0\"></span>s! </span></span></span></div><div class=\"t m2 xc hc y825 ff3 fs0 fc4 sc0 ls1 ws10\">2.28</div><div class=\"t m3 x21 hd y825 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y825 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjAlp<span class=\"_ _0\"></span>ha2 </div><div class=\"t m0 x7 hc y826 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y827 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjAlpha2(T &amp;obj, <span class=\"_ _0\"></span><span class=\"fc9\">unsign<span class=\"_ _3\"></span>ed <span class=\"_ _0\"></span>int <span class=\"fc0\">a<span class=\"_ _0\"></span>lpha) </span></span></span></div><div class=\"t m0 x1 hb y828 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y829 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y82a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y90 ff2 fs0 fc0 sc0 ls1 ws0\">Defines transparency for <span class=\"_ _0\"></span>text, rectangles, etc. <span class=\"ff6\">Does <span class=\"_ _0\"></span>not work for spri<span class=\"_ _0\"></span>tes! </span></div><div class=\"t m2 xc hc y82b ff3 fs0 fc4 sc0 ls1 ws10\">2.29</div><div class=\"t m3 x21 hd y82b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y82b ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjCol<span class=\"_ _0\"></span>or </div><div class=\"t m0 x7 hc y82c ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y82d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLObjColo<span class=\"_ _3\"></span>r(T <span class=\"_ _0\"></span>&amp;obj, <span class=\"_ _0\"></span>sf::Color co<span class=\"_ _0\"></span>lor) </span></div><div class=\"t m0 x7 hc y82e ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y82f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y830 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>color<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the object (Sp<span class=\"_ _0\"></span>rite<span class=\"_ _0\"></span>). </span></span></div><div class=\"t m0 x1 hb y831 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y832 ff3 fs0 fc4 sc0 ls1 ws10\">2.30</div><div class=\"t m3 x21 hd y832 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y832 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjFil<span class=\"_ _0\"></span>lCol<span class=\"_ _0\"></span>or </div><div class=\"t m0 x7 hc y833 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y834 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLObjFill<span class=\"_ _3\"></span>Color(T &amp;ob<span class=\"_ _0\"></span>j, sf::Color c<span class=\"_ _0\"></span>olor) </span></div><div class=\"t m0 x7 hc y835 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y179 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y17a ff2 fs0 fc0 sc0 ls1 ws0\">Defines the <span class=\"_ _0\"></span>color <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>object<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>(Text,<span class=\"_ _3\"></span> Rectangle, e<span class=\"_ _0\"></span>tc.)<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y836 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y837 ff3 fs0 fc4 sc0 ls1 ws10\">2.31</div><div class=\"t m3 x21 hd y837 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y837 ff3 fs0 fc4 sc0 ls1 ws0\">sca<span class=\"_ _0\"></span>leAni<span class=\"_ _0\"></span>matio<span class=\"_ _0\"></span>n </div><div class=\"t m0 x7 hc y14b ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y343 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">sca<span class=\"_ _3\"></span>leAnimation(<span class=\"fc9 ws0\">float const <span class=\"fc0\">&amp;DELTA_TIME, </span>float <span class=\"fc0\">&amp;var, <span class=\"_ _0\"></span>T &amp;obj, <span class=\"_ _0\"></span><span class=\"fc9\">sho<span class=\"_ _3\"></span>rt <span class=\"_ _0\"></span><span class=\"fc0\">varSign<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>=<span class=\"_ _3\"></span> <span class=\"fcc ls24\">1</span>, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">scaleSize = <span class=\"fcc ws10\">1<span class=\"_ _0\"></span>.f<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y838 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y839 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y83a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y83b ff2 fs0 fc0 sc0 ls1 ws0\">Allows you <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> make a <span class=\"_ _0\"></span>stretch<span class=\"_ _3\"></span> animation <span class=\"ls1f ws16\">on<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ls30 ws25\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> SFML <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>ct. </span></span></span></span></span></span></div><div class=\"t m2 xc hc y83c ff3 fs0 fc4 sc0 ls1 ws10\">2.32</div><div class=\"t m3 x21 hd y83c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y83c ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tFrame<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3bd ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y83d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setFram<span class=\"_ _3\"></span>e(sf::Sprite &amp;sprite, <span class=\"fc9\">float </span>frame, <span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">subFrame, <span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">fram<span class=\"_ _3\"></span>eSize, <span class=\"fc9\">in<span class=\"_ _0\"></span>t <span class=\"fc0\">recWidth, </span>int <span class=\"fc0\">r<span class=\"_ _0\"></span>ecHe<span class=\"_ _0\"></span>ight<span class=\"_ _0\"></span>) </span></span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5b\" class=\"pf w0 h0\" data-page-no=\"5b\"><div class=\"pc pc5b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hb y117 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setFram<span class=\"_ _3\"></span>e(sf::Sprite &amp;sprite, <span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">frame, <span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">subFram<span class=\"_ _3\"></span>e, <span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">fram<span class=\"_ _0\"></span>eSize<span class=\"_ _0\"></span>) </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4bb ff2 fs0 fc0 sc0 ls1 ws0\">Defines the <span class=\"_ _0\"></span>animation<span class=\"_ _3\"></span> <span class=\"ls1c ws12\">of</span> a <span class=\"_ _0\"></span>sprite <span class=\"ff6\">(click here <span class=\"_ _0\"></span><span class=\"ff9 fc4\">Error!<span class=\"_ _3\"></span> Reference source not found. <span class=\"ff6 fc0 ls6c ws5a\">to<span class=\"ls1 ws0\"> see how <span class=\"_ _0\"></span><span class=\"ls83 ws6e\">it<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls3c ws2f\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> u<span class=\"_ _0\"></span>sed)<span class=\"_ _0\"></span><span class=\"ff2\">. </span></span></span></span></span></span></span></span></span></div><div class=\"t m2 xc hc y1e4 ff3 fs0 fc4 sc0 ls1 ws10\">2.33</div><div class=\"t m3 x21 hd y1e4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e4 ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjOut<span class=\"_ _0\"></span>line<span class=\"_ _0\"></span>Color </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y4ab ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _3\"></span>bjOutlineColor(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;obj, sf::Colo<span class=\"_ _3\"></span>r color, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"_ _0\"></span><span class=\"fc0\">thickness<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"fcc ws10\">1<span class=\"_ _0\"></span>.f<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2e5 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>outline color and <span class=\"ls1d ws13\">its</span> <span class=\"_ _0\"></span>siz<span class=\"_ _0\"></span>e.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y240 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1ea ff3 fs0 fc4 sc0 ls1 ws10\">2.34</div><div class=\"t m3 x21 hd y1ea ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1ea ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjTe<span class=\"_ _0\"></span>xRec </div><div class=\"t m0 x7 hc y227 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y4af ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFM<span class=\"_ _3\"></span>LObjTexRec(T<span class=\"_ _3\"></span> &amp;obj, <span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"ls1 ws0\"> <span class=\"fc9\">int </span><span class=\"ls51 ws43\">y,</span> <span class=\"_ _0\"></span><span class=\"fc9\">int <span class=\"fc0 ls5a ws4a\">w,<span class=\"_ _3\"></span></span><span class=\"fc0\"> </span>in<span class=\"_ _0\"></span>t <span class=\"fc0 ls84 ws6f\">h)</span><span class=\"fc0\"> </span></span></span></span></span></span></div><div class=\"t m0 x7 hc y228 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y213 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span><span class=\"ff3 ws10\">intRe<span class=\"_ _0\"></span>ct<span class=\"ff2 ws0\">. </span></span></div><div class=\"t m0 x1 hb y1f0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f1 ff3 fs0 fc4 sc0 ls1 ws10\">2.35</div><div class=\"t m3 x21 hd y1f1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1f1 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tSFML<span class=\"_ _0\"></span>ObjPro<span class=\"_ _0\"></span>perti<span class=\"_ _0\"></span>es<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y83e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y28 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setSFM<span class=\"_ _3\"></span>LObjProperties(<span class=\"_ _3\"></span>sf::Sprite <span class=\"_ _3\"></span>&amp;obj, <span class=\"fc9\">float </span><span class=\"ls29 ws20\">x,</span> <span class=\"_ _0\"></span><span class=\"fc9\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0 ls2a ws21\">y,<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">angle = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0.f<span class=\"fc0 ws0\">, <span class=\"fc9\">int </span>alpha <span class=\"_ _0\"></span>= <span class=\"_ _3\"></span><span class=\"fcc ls24 ws1d\">255</span>, <span class=\"fc9\">float </span>xScale = <span class=\"fcc ws10\">1.f</span>, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">ySc<span class=\"_ _0\"></span>ale </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hb y83f ff2 fs0 fc0 sc0 ls1 ws0\">= <span class=\"fcc ws10\">1<span class=\"_ _0\"></span>.f<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></div><div class=\"t m0 x7 hb y840 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">setSFMLObjProperties(<span class=\"_ _3\"></span>sf::Text &amp;obj, </span>float <span class=\"fc0 ls29\">x, </span>float <span class=\"fc0 ls51 ws43\">y,</span><span class=\"fc0\"> </span>float <span class=\"fc0\">angle <span class=\"_ _0\"></span>= <span class=\"fcc ls24 ws1d\">0.f</span><span class=\"ls38\">, </span><span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">alpha<span class=\"_ _3\"></span> = <span class=\"_ _0\"></span><span class=\"fcc ws10\">255<span class=\"_ _3\"></span><span class=\"fc0 ws0\">, <span class=\"fc9\">float </span>xS<span class=\"_ _0\"></span>cal<span class=\"_ _3\"></span>e = <span class=\"_ _0\"></span><span class=\"fcc ws10\">1.f<span class=\"fc0 ws0\">, <span class=\"fc9\">float </span>yScale <span class=\"ls24\">= </span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hb y841 ff2 fs0 fcc sc0 ls2d ws22\">1.f<span class=\"fc0 ls1 ws0\">) </span></div><div class=\"t m0 x7 hb y842 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">s<span class=\"_ _3\"></span>etSFMLObjProperties(<span class=\"_ _3\"></span>sf::RectangleShape<span class=\"_ _3\"></span> &amp;obj, <span class=\"fc9\">float </span><span class=\"ls29 ws20\">x,</span> <span class=\"_ _0\"></span><span class=\"fc9\">float<span class=\"_ _3\"></span> <span class=\"fc0 ls51 ws43\">y,</span><span class=\"fc0\"> <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">angle = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0.f<span class=\"fc0 ws0\">, <span class=\"fc9\">int </span>alpha = </span><span class=\"ls24\">255</span><span class=\"fc0 ws0\">, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">x<span class=\"_ _3\"></span>Scale = <span class=\"_ _0\"></span><span class=\"fcc ws10\">1.f<span class=\"fc0 ls73 ws0\">, </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hb y843 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"fc0\">yScale = <span class=\"fcc ws10\">1.f</span>)<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y844 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">setSFMLObjProperties(<span class=\"_ _3\"></span>sf::CircleShape<span class=\"_ _3\"></span> &amp;obj, </span>float <span class=\"fc0 ls29\">x, </span>float <span class=\"fc0 ls51 ws43\">y,</span><span class=\"fc0\"> </span>float <span class=\"fc0\">angle <span class=\"_ _0\"></span>= <span class=\"fcc ls24 ws1d\">0.f</span>, <span class=\"fc9\">int </span>alpha = <span class=\"fcc ls24\">255</span><span class=\"ls73\">, </span><span class=\"fc9\">float </span>xScale = <span class=\"_ _0\"></span><span class=\"fcc ws10\">1.f<span class=\"fc0 ws0\">, <span class=\"fc9\">float </span></span></span></span></div><div class=\"t m0 x7 hb y845 ff2 fs0 fc0 sc0 ls1 ws0\">yScale = <span class=\"fcc ls24 ws1d\">1.f</span>) </div><div class=\"t m0 x7 hc y846 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y52f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y847 ff2 fs0 fc0 sc0 ls1 ws0\">Defines the <span class=\"_ _0\"></span>various properties <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span><span class=\"ls30 ws25\">an<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>SFML obje<span class=\"_ _0\"></span>ct. </span></span></div><div class=\"t m0 x1 hb y480 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y848 ff3 fs0 fc4 sc0 ls1 ws10\">2.36</div><div class=\"t m3 x21 hd y848 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y848 ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dSFM<span class=\"_ _0\"></span>LText<span class=\"_ _0\"></span>ure<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y482 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y483 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">loadSFMLTexture(sf::<span class=\"_ _3\"></span>Texture<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;obj, <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; f<span class=\"_ _0\"></span>ileP<span class=\"_ _0\"></span>ath) </span></span></span></span></div><div class=\"t m0 x7 hc y849 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y68e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y486 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load Tex<span class=\"_ _0\"></span>ture<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y84a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y84b ff3 fs0 fc4 sc0 ls1 ws10\">2.37</div><div class=\"t m3 x21 hd y84b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y84b ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dSFM<span class=\"_ _0\"></span>LFont<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y84c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y84d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">loadSFMLF<span class=\"_ _3\"></span>ont(sf::Font &amp;obj, <span class=\"fc9\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp;<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>fi<span class=\"_ _0\"></span>lePath<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x7 hc y84e ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y84f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y850 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load F<span class=\"_ _0\"></span>ont<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y851 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y852 ff3 fs0 fc4 sc0 ls1 ws10\">2.38</div><div class=\"t m3 x21 hd y852 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y852 ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dSFM<span class=\"_ _0\"></span>LSoun<span class=\"_ _0\"></span>dBuff<span class=\"_ _0\"></span>er<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y694 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">loadSFMLSoundBuf<span class=\"_ _3\"></span>fer(sf::SoundBuffer<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;obj, <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"ff3 fc5 ws10\">std::string</span><span class=\"fc0\">&amp; fi<span class=\"_ _0\"></span>lePa<span class=\"_ _0\"></span>th) </span></span></span></div><div class=\"t m0 x1 hb y853 ff2 fs0 fc0 sc0 ls52 ws0\"> <span class=\"ff4 fs4 ls19 wsf v4\">92<span class=\"ls1 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5c\" class=\"pf w0 h0\" data-page-no=\"5c\"><div class=\"pc pc5c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPuBuv45tAAIDIIzmJhAqrRUMYQIxhhlU7CDR6o1ghX8ipQkUkve6a6/7AABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAP/T0uQAAABsSURBVABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAfFB9/XAkSbqtqsuUXON+rsu777ltypS4DAAA4Ecebgcvy5G3bJ4AAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">93<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">loadSFMLSou<span class=\"_ _3\"></span>ndBuffer(sf::SoundBu<span class=\"_ _3\"></span>ffer<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;sb, <span class=\"_ _0\"></span>sf::Soun<span class=\"_ _3\"></span>d <span class=\"_ _0\"></span>&amp;snd,<span class=\"_ _3\"></span> <span class=\"_ _8\"> </span><span class=\"fc9\">const <span class=\"ff3 fc5 ws10\">st<span class=\"_ _0\"></span>d::st<span class=\"_ _3\"></span>ring<span class=\"ff2 fc0 ws0\">&amp; file<span class=\"_ _0\"></span>Pat<span class=\"_ _0\"></span>h) </span></span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y2e4 ff3 fs0 fc0 sc0 ls1 ws0\">First : <span class=\"_ _0\"></span><span class=\"ff2\">Allows <span class=\"ls1b ws11\">to</span> load <span class=\"_ _0\"></span>a resou<span class=\"_ _3\"></span>rce for <span class=\"ls23 ws1a\">an</span> <span class=\"_ _0\"></span>SFML object (Texture, <span class=\"_ _0\"></span>Sound<span class=\"_ _3\"></span> Buffer, e<span class=\"_ _0\"></span>tc.<span class=\"_ _0\"></span>). </span></div><div class=\"t m0 x1 hb y2ff ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1f hb y1b5 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> load a <span class=\"_ _0\"></span>resource fil<span class=\"_ _3\"></span>e for <span class=\"_ _0\"></span>a Sound <span class=\"_ _0\"></span>Buffer and assoc<span class=\"_ _3\"></span>iate <span class=\"ls1d ws13\">it</span> wi<span class=\"_ _0\"></span>th a s<span class=\"_ _0\"></span>ound<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.39</div><div class=\"t m3 x21 hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">loa<span class=\"_ _0\"></span>dSFM<span class=\"_ _0\"></span>LMusic<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2b5 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">loadSFMLMus<span class=\"_ _3\"></span>ic(sf::Music &amp;obj, <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"ff3 fc5 ws10\">std::string</span><span class=\"fc0\">&amp; f<span class=\"_ _0\"></span>ileP<span class=\"_ _0\"></span>ath) </span></span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2e5 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>load Mu<span class=\"_ _0\"></span>sic. </div><div class=\"t m2 xc hc y20f ff3 fs0 fc4 sc0 ls1 ws10\">2.40</div><div class=\"t m3 x21 hd y20f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y20f ff3 fs0 fc4 sc0 ls1 ws0\">che<span class=\"_ _0\"></span>ckSFM<span class=\"_ _0\"></span>LSn<span class=\"_ _0\"></span>dState<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y210 ff3 fs0 fc5 sc0 ls1 ws0\">enum <span class=\"ff2 fc0\">SFMLSndStatus<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y3fa ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 x29 hb y7f4 ff2 fs0 fc0 sc0 ls1 ws0\">Pla<span class=\"_ _0\"></span>ying,<span class=\"_ _0\"></span> </div><div class=\"t m0 x29 hb y854 ff2 fs0 fc0 sc0 ls1 ws0\">St<span class=\"_ _0\"></span>opped,<span class=\"_ _0\"></span> </div><div class=\"t m0 x29 hb y855 ff2 fs0 fc0 sc0 ls1 ws0\">Pau<span class=\"_ _0\"></span>sed </div><div class=\"t m0 x7 hb y856 ff2 fs0 fc0 sc0 ls85 ws70\">};<span class=\"ls1 ws0\"> </span></div><div class=\"t m0 x7 hc y35c ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x7 hb y857 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">checkSFML<span class=\"_ _3\"></span>SndState(T <span class=\"_ _3\"></span>&amp;obj, SFMLSndStatus<span class=\"_ _3\"></span> state)<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y858 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _b\"></span><span class=\"fc0\">checkSF<span class=\"_ _3\"></span>MLSndState(T <span class=\"_ _9\"></span>*obj, <span class=\"_ _9\"></span>SFMLSndStatus <span class=\"_ _9\"></span>state) </span></div><div class=\"t m0 x7 hc y859 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y567 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>state <span class=\"ls1c ws12\">of</span> the so<span class=\"_ _0\"></span>und. </span></div><div class=\"t m0 x1 hb y38b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y85a ff3 fs0 fc4 sc0 ls1 ws10\">2.41</div><div class=\"t m3 x21 hd y85a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y85a ff3 fs0 fc4 sc0 ls1 ws0\">pla<span class=\"_ _0\"></span>ySFML<span class=\"_ _0\"></span>snd </div><div class=\"t m0 x7 hc y37a ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y85b ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">playSFMLSnd(<span class=\"_ _3\"></span>T &amp;obj) </span></div><div class=\"t m0 x7 hb y85c ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _f\"></span><span class=\"fc0\">pla<span class=\"_ _3\"></span>ySFMLSnd(T <span class=\"_ _8\"> </span>*obj) </span></div><div class=\"t m0 x7 hc y85d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y41c ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>play sound / mus<span class=\"_ _0\"></span>ic. </div><div class=\"t m0 x1 hb y3e2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y3e3 ff3 fs0 fc4 sc0 ls1 ws10\">2.42</div><div class=\"t m3 x21 hd y3e3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y3e3 ff3 fs0 fc4 sc0 ls1 ws0\">sto<span class=\"_ _0\"></span>pSFM<span class=\"_ _0\"></span>Lsnd </div><div class=\"t m0 x7 hc y85e ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y317 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">stopSFMLSnd(T<span class=\"_ _3\"></span> &amp;obj) </span></div><div class=\"t m0 x7 hb y85f ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _f\"></span><span class=\"fc0\">stop<span class=\"_ _3\"></span>SFMLSnd(T <span class=\"_ _8\"> </span>*obj) </span></div><div class=\"t m0 x7 hc y860 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1ae ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>stop sound / mus<span class=\"_ _0\"></span>ic. </div><div class=\"t m2 xc hc y425 ff3 fs0 fc4 sc0 ls1 ws10\">2.43</div><div class=\"t m3 x21 hd y425 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y425 ff3 fs0 fc4 sc0 ls1 ws0\">pau<span class=\"_ _0\"></span>seSFM<span class=\"_ _0\"></span>Lsnd </div><div class=\"t m0 x7 hc y861 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div></div><div class=\"c x7 y862 w2a h45\"><div class=\"t m0 x0 hb y611 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hc y463 ff3 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5d\" class=\"pf w0 h0\" data-page-no=\"5d\"><div class=\"pc pc5d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">94<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">pauseSFMLSnd(T<span class=\"_ _3\"></span> &amp;obj) </span></div><div class=\"t m0 x7 hb y863 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _f\"></span><span class=\"fc0\">paus<span class=\"_ _3\"></span>eSFMLSnd(T <span class=\"_ _8\"> </span>*obj) </span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1e4 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> pause <span class=\"_ _0\"></span>sound / mu<span class=\"_ _0\"></span>sic. </div><div class=\"t m0 x1 hb y290 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1e5 ff3 fs0 fc4 sc0 ls1 ws10\">2.44</div><div class=\"t m3 x21 hd y1e5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y1e5 ff3 fs0 fc4 sc0 ls1 ws0\">loo<span class=\"_ _0\"></span>pSFML<span class=\"_ _0\"></span>snd </div><div class=\"t m0 x7 hc y20c ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y20d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">loopSFMLSnd(T<span class=\"_ _3\"></span> &amp;obj) </span></div><div class=\"t m0 x7 hb y4a2 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _f\"></span><span class=\"fc0\">loop<span class=\"_ _3\"></span>SFMLSnd(T <span class=\"_ _8\"> </span>*obj) </span></div><div class=\"t m0 x7 hc y20f ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y227 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> loop <span class=\"_ _0\"></span>sound<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>/ musi<span class=\"_ _0\"></span>c. </div><div class=\"t m2 xc hc y211 ff3 fs0 fc4 sc0 ls1 ws10\">2.45</div><div class=\"t m3 x21 hd y211 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y211 ff3 fs0 fc4 sc0 ls1 ws0\">co<span class=\"_ _0\"></span>llisi<span class=\"_ _0\"></span>onTest<span class=\"_ _0\"></span>SFML </div><div class=\"t m0 x7 hc ye8 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"ff2 fc0\">A,<span class=\"_ _3\"></span> </span>class <span class=\"ff2 fc0 ls57 ws45\">B&gt;<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m0 x7 hb y2e9 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">coll<span class=\"_ _3\"></span>isionTestSFML(A<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;objA, <span class=\"_ _0\"></span>B<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const <span class=\"fc0\">&amp;objB<span class=\"_ _0\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 hb y48f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b0 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y28 ff2 fs0 fc0 sc0 ls1 ws0\">Test the <span class=\"_ _0\"></span>collision between two <span class=\"_ _0\"></span>(2) SFML ob<span class=\"_ _0\"></span>ject<span class=\"_ _0\"></span>s. </div><div class=\"t m2 xc hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">2.46</div><div class=\"t m3 x21 hd y216 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y216 ff3 fs0 fc4 sc0 ls1 ws10\">cr<span class=\"_ _0\"></span>eateRe<span class=\"_ _0\"></span>ctan<span class=\"_ _0\"></span>gle<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc yc1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1f5 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">cr<span class=\"_ _3\"></span>eateRectangle(sf::R<span class=\"_ _3\"></span>ectangleShape<span class=\"_ _3\"></span> &amp;rec, <span class=\"_ _0\"></span>sf::Vector2f<span class=\"_ _3\"></span> re<span class=\"_ _0\"></span>cSiz<span class=\"_ _3\"></span>e, <span class=\"_ _0\"></span>sf::Colo<span class=\"_ _3\"></span>r <span class=\"_ _0\"></span>colo<span class=\"_ _3\"></span>r, <span class=\"fc9\">float </span>x <span class=\"_ _0\"></span>= <span class=\"fcc ls24 ws1d\">0.f</span>, <span class=\"_ _0\"></span><span class=\"fc9\">float <span class=\"fc0\">y <span class=\"_ _0\"></span>= <span class=\"fcc ls24 ws1d\">0.f</span>, <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">center =<span class=\"_ _0\"></span> </span></span></span></span></span></div><div class=\"t m0 x7 hc y29d ff3 fs0 fc5 sc0 ls1 ws10\">tr<span class=\"_ _0\"></span>ue<span class=\"ff2 fc0 ws0\">) </span></div><div class=\"t m0 x7 hc yce ff3 fs0 fca sc0 ls1 ws0\">Sou<span class=\"_ _0\"></span>rce <span class=\"_ _2\"></span>Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y5db ff2 fs0 fc0 sc0 ls1 ws0\">Create a <span class=\"_ _0\"></span>rectangle with <span class=\"_ _0\"></span>vario<span class=\"_ _3\"></span>us p<span class=\"_ _0\"></span>arame<span class=\"_ _0\"></span>ters<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y864 ff3 fs0 fc4 sc0 ls1 ws10\">2.47</div><div class=\"t m3 x21 hd y864 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y864 ff3 fs0 fc4 sc0 ls1 ws10\">te<span class=\"_ _0\"></span>xtSty<span class=\"_ _0\"></span>leCon<span class=\"_ _0\"></span>fig<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y5e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y493 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">textStyleCo<span class=\"_ _3\"></span>nfig(sf::Text <span class=\"ls27 ws1e\">&amp;txt,</span><span class=\"ls75\"> </span><span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">underLined,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">bool <span class=\"fc0\">boldText, </span>bool <span class=\"fc0\">it<span class=\"_ _0\"></span>alicT<span class=\"_ _0\"></span>ext) </span></span></span></span></span></div><div class=\"t m0 x1 hb y25d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y60 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y865 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y866 ff2 fs0 fc0 sc0 ls1 ws0\">Defines the <span class=\"_ _0\"></span>style <span class=\"ls1c ws12\">of</span> a <span class=\"_ _0\"></span>tex<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y5c9 ff3 fs0 fc4 sc0 ls1 ws10\">2.48</div><div class=\"t m3 x21 hd y5c9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y5c9 ff3 fs0 fc4 sc0 ls1 ws10\">cr<span class=\"_ _0\"></span>eateTe<span class=\"_ _0\"></span>xt<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y867 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y867 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y867 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y4da ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y803 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> <span class=\"fc9\">void </span>createText(sf::Font<span class=\"_ _3\"></span> <span class=\"fc9 ws10\">const</span>&amp; fnt, sf::Text &amp;txt, </span></span>T <span class=\"ff2 fc9\">const <span class=\"fc0\">&amp;text, <span class=\"_ _0\"></span><span class=\"fc9\">fl<span class=\"_ _3\"></span>oat <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> </span>float <span class=\"_ _0\"></span><span class=\"fc0\">y, <span class=\"fc9\">int </span>txtSize <span class=\"ls2c\">= </span></span></span></span></span></div><div class=\"t m0 x7 hc y868 ff2 fs0 fcc sc0 ls1 ws10\">DEFAULT_SFML<span class=\"_ _3\"></span>_TEXT_SIZE<span class=\"fc0 ls38 ws0\">, <span class=\"fc9 ls1\">bool <span class=\"fc0\">underLined = <span class=\"_ _3\"></span></span></span></span><span class=\"ff3 fc5\">false</span><span class=\"fc0 ls38 ws0\">, <span class=\"fc9 ls1\">bool <span class=\"fc0\">boldText = </span></span></span><span class=\"ff3 fc5\">f<span class=\"_ _3\"></span>alse</span><span class=\"fc0 ls38 ws0\">, <span class=\"fc9 ls1\">bool <span class=\"fc0\">italicText = </span></span></span><span class=\"ff3 fc5\">f<span class=\"_ _3\"></span>alse</span><span class=\"fc0 ws0\">) </span></div><div class=\"t m2 xc h13 y97 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y97 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y97 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y1dc ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y869 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> <span class=\"fc9\">void </span>createText(sf::Font<span class=\"_ _3\"></span> <span class=\"fc9 ws10\">const</span>&amp; fnt, sf::Text &amp;txt, </span></span>T <span class=\"ff2 fc9\">const <span class=\"fc0\">&amp;text, <span class=\"_ _0\"></span><span class=\"fc9\">fl<span class=\"_ _3\"></span>oat <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> </span>float <span class=\"_ _0\"></span><span class=\"fc0\">y, <span class=\"fc9\">bool </span>centerText<span class=\"_ _3\"></span>, <span class=\"fc9\">int </span></span></span></span></span></div><div class=\"t m0 x7 hc y86a ff2 fs0 fc0 sc0 ls1 ws0\">txtSize = <span class=\"fcc ws10\">DEFAUL<span class=\"_ _3\"></span>T_SFML_TEXT_SIZE</span><span class=\"ls73\">, <span class=\"_ _3\"></span></span><span class=\"fc9\">bool </span>underLine<span class=\"_ _3\"></span>d = <span class=\"ff3 fc5 ws10\">false</span><span class=\"ls73\">, <span class=\"_ _3\"></span></span><span class=\"fc9\">bool </span>boldText = <span class=\"ff3 fc5 ws10\">f<span class=\"_ _3\"></span>alse</span><span class=\"ls73\">, </span><span class=\"fc9\">bool </span>ital<span class=\"_ _3\"></span>icText = <span class=\"ff3 fc5 ws10\">false</span>)<span class=\"_ _3\"></span> </div><div class=\"t m2 xc h13 y26c ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y26c ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y26c ff6 fs0 fc0 sc0 ls1 ws0\">Third <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y86b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y26d ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> <span class=\"fc9\">void </span>createText(sf::Font <span class=\"fc9 ws10\">const</span>&amp; fnt, sf::Text &amp;txt, </span></span>T <span class=\"ff2 fc9\">const <span class=\"fc0\">&amp;text, </span>float <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> </span>float <span class=\"_ _0\"></span><span class=\"fc0\">y, sf::Colo<span class=\"_ _3\"></span>r color, <span class=\"fc9\">int </span></span></span></div><div class=\"t m0 x7 hc y428 ff2 fs0 fc0 sc0 ls1 ws0\">txtSize = <span class=\"fcc ws10\">DEFAUL<span class=\"_ _3\"></span>T_SFML_TEXT_SIZE</span><span class=\"ls73\">, <span class=\"_ _3\"></span></span><span class=\"fc9\">bool </span>underLine<span class=\"_ _3\"></span>d = <span class=\"ff3 fc5 ws10\">false</span><span class=\"ls73\">, <span class=\"_ _3\"></span></span><span class=\"fc9\">bool </span>boldText = <span class=\"ff3 fc5 ws10\">f<span class=\"_ _3\"></span>alse</span><span class=\"ls73\">, </span><span class=\"fc9\">bool </span>ital<span class=\"_ _3\"></span>icText = <span class=\"ff3 fc5 ws10\">false</span>)<span class=\"_ _3\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5e\" class=\"pf w0 h0\" data-page-no=\"5e\"><div class=\"pc pc5e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAO8LVxUAAADXSURBVABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAMBn9fXDkSTptqouU3KN+7ku777ntilT4jIAAIAfeQBBEUrlJg1HlwAAAABJRU5ErkJggg==\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">95<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y4b8 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y4b8 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y4b8 ff6 fs0 fc0 sc0 ls1 ws0\">Fourth <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x7 hc y438 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> <span class=\"fc9\">void <span class=\"_ _0\"></span><span class=\"fc0\">crea<span class=\"_ _3\"></span>teText(sf::Font <span class=\"fc9 ws10\">const</span>&amp; fnt, <span class=\"_ _0\"></span>sf::Te<span class=\"_ _3\"></span>xt &amp;txt, <span class=\"ff3 fc5\">T </span><span class=\"fc9\">con<span class=\"_ _0\"></span>st<span class=\"_ _3\"></span> <span class=\"fc0\">&amp;text, </span>float <span class=\"_ _0\"></span><span class=\"fc0 ls29 ws20\">x,<span class=\"ls1 ws0\"> <span class=\"fc9\">float </span>y, sf::Color <span class=\"_ _0\"></span>color, <span class=\"_ _3\"></span><span class=\"fc9\">bool </span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y86c ff2 fs0 fc0 sc0 ls1 ws0\">centerText, <span class=\"fc9\">int </span>txtS<span class=\"_ _3\"></span>ize = <span class=\"fcc ws10\">DEFA<span class=\"_ _3\"></span>ULT_SFML_TEXT_SIZE<span class=\"_ _3\"></span></span><span class=\"ls73\">, </span><span class=\"fc9\">bool </span>underLin<span class=\"_ _3\"></span>ed = <span class=\"ff3 fc5 ws10\">false</span><span class=\"ls73\">, </span><span class=\"fc9\">bool <span class=\"_ _3\"></span></span>boldText = <span class=\"ff3 fc5 ws10\">false</span><span class=\"ls38\">, </span><span class=\"fc9\">bool </span>italic<span class=\"_ _3\"></span>Text = </div><div class=\"t m0 x7 hc y86d ff3 fs0 fc5 sc0 ls1 ws10\">fa<span class=\"_ _0\"></span>lse<span class=\"ff2 fc0 ws0\">) </span></div><div class=\"t m2 xc h13 y86e ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y86e ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y86e ff6 fs0 fc0 sc0 ls1 ws0\">Fifth F<span class=\"_ _0\"></span>or<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y86f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y870 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class<span class=\"_ _3\"></span> <span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> <span class=\"fc9\">void </span>c<span class=\"_ _3\"></span>reateText(sf::Font <span class=\"fc9 ws10\">const<span class=\"_ _3\"></span></span>&amp; fnt, sf::Text &amp;t<span class=\"_ _3\"></span>xt, </span></span>T <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"fc0\">&amp;text, </span>fl<span class=\"_ _3\"></span>oat <span class=\"fc0 ls29 ws20\">x,</span><span class=\"fc0\"> </span>float <span class=\"fc0\">y, <span class=\"_ _3\"></span>sf::Color colo<span class=\"_ _3\"></span>r ,<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hb y871 ff2 fs0 fc0 sc0 ls1 ws0\">sf::Color <span class=\"_ _3\"></span>outlineColor, <span class=\"_ _3\"></span><span class=\"fc9\">bool<span class=\"_ _3\"></span> </span>c<span class=\"_ _3\"></span>enterText, <span class=\"_ _3\"></span><span class=\"fc9\">int <span class=\"_ _3\"></span></span>txtSize <span class=\"_ _3\"></span>= <span class=\"_ _3\"></span><span class=\"fcc\">DEFAUL<span class=\"_ _3\"></span>T_SFML_TEXT_SIZE, <span class=\"_ _b\"></span><span class=\"fc9\">float <span class=\"_ _3\"></span></span></span>outlineThickn<span class=\"_ _3\"></span>ess <span class=\"_ _3\"></span>= <span class=\"fcc ls24 ws1d\">1.f</span>, <span class=\"_ _3\"></span><span class=\"fc9\">boo<span class=\"_ _3\"></span>l </span></div><div class=\"t m0 x7 hc y872 ff2 fs0 fc0 sc0 ls1 ws0\">underLined = <span class=\"ff3 fc5 ws10\">false</span><span class=\"ls73\">, <span class=\"_ _3\"></span></span><span class=\"fc9\">bool </span>boldText =<span class=\"_ _3\"></span> <span class=\"ff3 fc5 ws10\">false</span><span class=\"ls73\">, </span><span class=\"fc9\">bool </span>ital<span class=\"_ _3\"></span>icText = <span class=\"ff3 fc5 ws10\">f<span class=\"_ _3\"></span>al<span class=\"ls86 ws71\">se</span></span>) </div><div class=\"t m2 xc h13 y873 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y873 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y873 ff6 fs0 fc0 sc0 ls1 ws0\">Sixth F<span class=\"_ _0\"></span>o<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x7 hc y874 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"ff2 fc0 ls24\">&lt;</span>class <span class=\"_ _3\"></span><span class=\"ff2 fc0\">T&gt; <span class=\"fc9\">void </span>createT<span class=\"_ _3\"></span>ext(sf::Font <span class=\"fc9 ws10\">const<span class=\"_ _3\"></span></span>&amp; fnt, </span><span class=\"ws10\">std::vector</span><span class=\"ff2 fc0\">&lt;s<span class=\"_ _3\"></span>f::Text&gt; &amp;txt, <span class=\"_ _3\"></span></span><span class=\"ls87\">T </span><span class=\"ff2 fc9\">const <span class=\"fc0\">&amp;t<span class=\"_ _3\"></span>ext, </span>float <span class=\"fc0\">x, </span>floa<span class=\"_ _3\"></span>t <span class=\"fc0\">y, </span></span></div><div class=\"t m0 x7 hb y875 ff2 fs0 fc0 sc0 ls1 ws0\">sf::Color color , sf::Color <span class=\"_ _0\"></span>outl<span class=\"_ _3\"></span>ineColor, <span class=\"fc9\">bool<span class=\"_ _3\"></span> </span>centerText, <span class=\"_ _0\"></span><span class=\"fc9\">in<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span><span class=\"fc0\">txtSiz<span class=\"_ _3\"></span>e = <span class=\"_ _0\"></span><span class=\"fcc\">DEFAULT_SFML<span class=\"_ _3\"></span>_TEXT_SIZE,<span class=\"_ _3\"></span> <span class=\"fc9\">float <span class=\"fc0\">outlineThickness </span></span></span></span></span></div><div class=\"t m0 x7 hc y24b ff2 fs0 fc0 sc0 ls1 ws0\">= <span class=\"_ _0\"></span><span class=\"fcc ls24\">1.f<span class=\"fc0 ls1\">,<span class=\"_ _3\"></span> <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">underLined = <span class=\"ff3 fc5 ws10\">false</span>, <span class=\"fc9\">bool </span>boldText = <span class=\"ff3 fc5 ws10\">false</span>, <span class=\"fc9\">b<span class=\"_ _0\"></span>ool<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">italicTe<span class=\"_ _3\"></span>xt = <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">fals<span class=\"_ _0\"></span>e<span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y242 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5c5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5c6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y876 ff2 fs0 fc0 sc0 ls1 ws0\">These functions <span class=\"_ _0\"></span>allow<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>create text with <span class=\"_ _0\"></span>various par<span class=\"_ _0\"></span>ameter<span class=\"_ _0\"></span>s. </span></span></div><div class=\"t m0 x1 hb y877 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y878 ff3 fs0 fc4 sc0 ls1 ws10\">2.49</div><div class=\"t m3 x21 hd y878 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y878 ff3 fs0 fc4 sc0 ls1 ws10\">cr<span class=\"_ _0\"></span>eateS<span class=\"_ _0\"></span>prite<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y5a4 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y5a4 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y5a4 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y77b ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y7de ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">createS<span class=\"_ _3\"></span>prite(sf::Texture<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;tex,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>sf::Sprite<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;spr, sf::Vector2f <span class=\"_ _0\"></span>positio<span class=\"_ _3\"></span>n, <span class=\"_ _0\"></span>sf::Vect<span class=\"_ _3\"></span>or2f origin, <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">smooth = <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">true<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x1 hb y5a7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y879 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y879 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y879 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y587 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4ce ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">c<span class=\"_ _3\"></span>reateSprite(sf::Textu<span class=\"_ _3\"></span>re &amp;tex, sf::Sprite &amp;spr, <span class=\"_ _0\"></span>sf::Int<span class=\"_ _3\"></span>Rect rec, <span class=\"_ _0\"></span>sf::Vector2<span class=\"_ _3\"></span>f position, <span class=\"_ _0\"></span>sf::Vecto<span class=\"_ _3\"></span>r2f origin, <span class=\"fc9\">bool </span></span></div><div class=\"t m0 x7 hc y87a ff2 fs0 fc0 sc0 ls1 ws0\">repeatTexture = <span class=\"ff3 fc5 ws10\">false<span class=\"_ _3\"></span></span><span class=\"ls73\">, </span><span class=\"fc9\">bool </span>s<span class=\"_ _3\"></span>mooth = <span class=\"ff3 fc5 ws10\">true</span>)<span class=\"_ _3\"></span> </div><div class=\"t m2 xc h13 y87b ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y87b ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y87b ff6 fs0 fc0 sc0 ls1 ws0\">Third <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y87c ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb yb3 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">c<span class=\"_ _3\"></span>reateSprite(sf::Textu<span class=\"_ _3\"></span>re &amp;tex, sf::Sprite &amp;spr, <span class=\"_ _0\"></span>sf::Int<span class=\"_ _3\"></span>Rect rec, <span class=\"_ _0\"></span>sf::Vector2<span class=\"_ _3\"></span>f position, <span class=\"_ _0\"></span>sf::Vecto<span class=\"_ _3\"></span>r2f origin, <span class=\"_ _0\"></span>sf::Vect<span class=\"_ _3\"></span>or2f </span></div><div class=\"t m0 x7 hc y87d ff2 fs0 fc0 sc0 ls1 ws0\">scale, <span class=\"fc9\">unsigned int<span class=\"_ _3\"></span> </span>alpha = <span class=\"fcc ws10\">255<span class=\"_ _3\"></span></span><span class=\"ls73\">, </span><span class=\"fc9\">bool </span>repeatTextu<span class=\"_ _3\"></span>re = <span class=\"ff3 fc5 ws10\">false</span><span class=\"ls73\">, <span class=\"_ _3\"></span></span><span class=\"fc9\">bool </span>smooth = <span class=\"ff3 fc5 ws10\">t<span class=\"_ _3\"></span>rue</span>) </div><div class=\"t m2 xc h13 y87e ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y87e ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y87e ff6 fs0 fc0 sc0 ls1 ws0\">Fourth <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y87f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y880 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">cr<span class=\"_ _3\"></span>eateSprite(sf::Texture<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;tex,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::vec<span class=\"_ _3\"></span>tor<span class=\"ff2 fc0 ws0\">&lt;sf::Sprite&gt; &amp;spr, <span class=\"_ _0\"></span>sf::I<span class=\"_ _3\"></span>ntRect rec, <span class=\"_ _0\"></span>sf::Vector2f<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>positio<span class=\"_ _3\"></span>n, sf::Vector2f or<span class=\"_ _0\"></span>igin, </span></span></span></div><div class=\"t m0 x7 hc y881 ff2 fs0 fc0 sc0 ls1 ws0\">sf::Vector2f scale, <span class=\"fc9\">u<span class=\"_ _3\"></span>nsigned int </span>al<span class=\"_ _3\"></span>pha = <span class=\"fcc ws10\">255</span><span class=\"ls73\">, </span><span class=\"fc9\">bool <span class=\"_ _3\"></span></span>repeatTextu<span class=\"_ _3\"></span>re = <span class=\"ff3 fc5 ws10\">false</span><span class=\"ls38\">, </span><span class=\"fc9\">bool </span>smooth <span class=\"_ _3\"></span>= <span class=\"ff3 fc5 ws10\">true</span>) </div><div class=\"t m2 xc h13 y882 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y882 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y882 ff6 fs0 fc0 sc0 ls1 ws0\">Fifth <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y883 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y884 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">createS<span class=\"_ _3\"></span>prite(sf::Texture<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;tex,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>sf::Sprite<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;spr, sf::Vector2f position, <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">center, <span class=\"fc9\">bool </span>smooth <span class=\"_ _0\"></span>= <span class=\"ff3 fc5 ws10\">true<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x1 hb y885 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y41d ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">createSprit<span class=\"_ _3\"></span>e(sf::Texture<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;tex, sf::Sprite <span class=\"_ _0\"></span>&amp;spr, <span class=\"_ _0\"></span>sf::I<span class=\"_ _3\"></span>ntRect rec, <span class=\"_ _0\"></span>sf::Vector2f position, <span class=\"_ _3\"></span><span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">center, <span class=\"fc9\">bool<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">repe<span class=\"_ _0\"></span>atTe<span class=\"_ _0\"></span>xture </span></span></span></span></span></div><div class=\"t m0 x7 hc y95 ff2 fs0 fc0 sc0 ls1 ws0\">= <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">false<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">, <span class=\"fc9\">bool <span class=\"_ _0\"></span><span class=\"fc0\">smooth = <span class=\"ff3 fc5 ws10\">tr<span class=\"_ _0\"></span>ue<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws0\">) </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y39a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y380 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc ya8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y382 ff2 fs0 fc0 sc0 ls1 ws0\">These functions <span class=\"_ _0\"></span>all<span class=\"_ _3\"></span>ow <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>cre<span class=\"_ _3\"></span>ate a <span class=\"_ _0\"></span>sprite with various <span class=\"_ _0\"></span>param<span class=\"_ _0\"></span>eter<span class=\"_ _0\"></span>s. </span></span></div><div class=\"t m2 xc hc y98 ff3 fs0 fc4 sc0 ls1 ws10\">2.50</div><div class=\"t m3 x21 hd y98 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y98 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Cursor<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y39e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y66e ff2 fs0 fc0 sc0 ls1 ws0\">sf::Vector2f <span class=\"_ _0\"></span>getCurso<span class=\"_ _3\"></span>r(sf::RenderWindow<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;window, <span class=\"fc9\">unsi<span class=\"_ _3\"></span>gned <span class=\"_ _0\"></span>int <span class=\"fc0\">finger <span class=\"_ _0\"></span>= <span class=\"_ _0\"></span><span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></div><div class=\"t m0 x7 hc y425 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y886 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the <span class=\"_ _0\"></span>position <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>the cursor <span class=\"_ _0\"></span>(touch<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">on<span class=\"ls1 ws0\"> Mobile). <span class=\"ff3\">finger </span>represents<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e f<span class=\"_ _0\"></span>inge<span class=\"_ _0\"></span>r. </span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5f\" class=\"pf w0 h0\" data-page-no=\"5f\"><div class=\"pc pc5f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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VB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAfiNKKe4CAADArXLWBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAJbqEMkAAAIKSURBVAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAPyh+p6ePyIi4vHtbnvcRXy9vH8e9ufr79eH++Mu4uon7rouOJnn2RIAAJBESeoHCsWZWtxO7pUAAAAASUVORK5CYII=\"/><div class=\"c x9 y114 w3 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">96<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">2.51</div><div class=\"t m3 x21 hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">mou<span class=\"_ _0\"></span>seCo<span class=\"_ _0\"></span>llisio<span class=\"_ _0\"></span>n<span class=\"fc0 ws0\"> </span></div><div class=\"t m2 xc h13 y887 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y887 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y887 ff6 fs0 fc0 sc0 ls1 ws0\">First <span class=\"_ _0\"></span>for<span class=\"_ _0\"></span>m </div><div class=\"t m0 x1 hb y888 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y889 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y597 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y598 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">mous<span class=\"_ _3\"></span>eCollision(sf::Ren<span class=\"_ _3\"></span>derWindow<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;window,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls39\">T <span class=\"fc9 ls1\">cons<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span><span class=\"fc0\">&amp;obj, <span class=\"fc9\">unsigned <span class=\"_ _0\"></span>int<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">finger = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0<span class=\"fc0 ws0\">)<span class=\"_ _0\"></span> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y822 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y88a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y53d ff6 fs0 fc0 sc0 ls1 ws0\">Windows, Linux: <span class=\"ff2\">Detects <span class=\"_ _0\"></span><span class=\"ls1f ws16\">if<span class=\"ls1 ws0\"> the mouse <span class=\"_ _0\"></span>cursor<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>coll<span class=\"_ _3\"></span>ides with <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> the w<span class=\"_ _0\"></span>indo<span class=\"_ _0\"></span>w. </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hb y1e7 ff6 fs0 fc0 sc0 ls1 ws0\">Mobile: <span class=\"ff2\">Detects <span class=\"_ _0\"></span><span class=\"ls1d ws13\">if<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> user touches <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the win<span class=\"_ _0\"></span>dow. </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y561 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y88b ff3 fs0 fcb sc0 ls1 ws10\">Par<span class=\"_ _0\"></span>ameter<span class=\"_ _0\"></span>:<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y88c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y542 ff3 fs0 fc0 sc0 ls1 ws0\">obj <span class=\"_ _0\"></span><span class=\"ff2\">the object with which <span class=\"ls31 ws26\">we</span> <span class=\"_ _0\"></span>want <span class=\"ls1b ws11\">to</span> t<span class=\"_ _0\"></span>es<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x1 hb y88d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y88e ff3 fs0 fc0 sc0 ls1 ws0\">finger <span class=\"ff2\">represents <span class=\"_ _0\"></span>the fin<span class=\"_ _0\"></span>ger. </span></div><div class=\"t m0 x1 hb y88f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y890 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>ere <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>a collision and <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y825 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y891 ff6 fs0 fc0 sc0 ls1 ws0\">Example <span class=\"_ _0\"></span>:<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y878 ff3 fs0 fc5 sc0 ls34 ws28\">if<span class=\"ls1 ws0\"> <span class=\"_ _2\"></span><span class=\"ff2 fc0\">(m<span class=\"_ _3\"></span>ouseCollision(<span class=\"_ _3\"></span>window, <span class=\"_ _0\"></span>spr<span class=\"_ _0\"></span>ite)) </span></span></div><div class=\"t m0 x7 hb y5a4 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 x29 hb y4f2 ff2 fs0 fcd sc0 ls67 ws56\">//<span class=\"ls1 ws0\"> <span class=\"ls36 ws2a\">Do<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> some<span class=\"_ _0\"></span>thin<span class=\"_ _0\"></span>g<span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x7 hb y892 ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y893 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y894 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y895 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y895 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y895 ff6 fs0 fc0 sc0 ls1 ws0\">Second <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>rm </div><div class=\"t m0 x1 hb y896 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y897 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls24\">&lt;<span class=\"ff3 fc5 ls1\">class </span><span class=\"ls33 ws27\">T&gt;</span><span class=\"ls1\"> </span></span></div><div class=\"t m0 x1 hb y898 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y335 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">mouseCollision(s<span class=\"_ _3\"></span>f::RenderWindo<span class=\"_ _3\"></span>w &amp;window, <span class=\"_ _0\"></span>T <span class=\"fc9\">const </span>&amp;obj, <span class=\"_ _0\"></span>sf::RectangleShap<span class=\"_ _3\"></span>e &amp;cursor, <span class=\"fc9\">unsigned int <span class=\"_ _0\"></span><span class=\"fc0\">finger = <span class=\"_ _0\"></span><span class=\"fcc ws10\">0<span class=\"_ _0\"></span><span class=\"fc0 ws0\">) </span></span></span></span></span></div><div class=\"t m0 x7 hc y4fa ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4fb ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4fc ff6 fs0 fc0 sc0 ls1 ws0\">Windows, Linux: <span class=\"ff2\">Detects <span class=\"_ _0\"></span><span class=\"ls1f ws16\">if<span class=\"ls1 ws0\"> the mouse <span class=\"_ _0\"></span>cursor<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>coll<span class=\"_ _3\"></span>ides with <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> the w<span class=\"_ _0\"></span>indo<span class=\"_ _0\"></span>w. </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hb y899 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4fd ff6 fs0 fc0 sc0 ls1 ws0\">Mobile: <span class=\"ff2\">Detects <span class=\"_ _0\"></span><span class=\"ls1d ws13\">if<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> user touches <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> object <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the win<span class=\"_ _0\"></span>dow. </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y89a ff3 fs0 fcb sc0 ls1 ws10\">Par<span class=\"_ _0\"></span>ameter<span class=\"_ _0\"></span>:<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y89b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y89c ff3 fs0 fc0 sc0 ls1 ws0\">obj <span class=\"_ _0\"></span><span class=\"ff2\">the object with which <span class=\"ls31 ws26\">we</span> <span class=\"_ _0\"></span>want <span class=\"ls1b ws11\">to</span> t<span class=\"_ _0\"></span>es<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x1 hb y89d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y502 ff3 fs0 fc0 sc0 ls1 ws0\">cursor <span class=\"ff2\">allows <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> recover the <span class=\"_ _0\"></span>position <span class=\"_ _3\"></span>of <span class=\"_ _0\"></span>the collision poi<span class=\"_ _0\"></span>nt. </span></span></span></div><div class=\"t m0 x1 hb y503 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y504 ff3 fs0 fc0 sc0 ls1 ws0\">finger <span class=\"ff2\">represents <span class=\"_ _0\"></span>the fin<span class=\"_ _0\"></span>ger. </span></div><div class=\"t m0 x1 hb y73e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y505 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>ere <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>a collision and <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x7 hb y89e ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y89f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y8a0 ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Re<span class=\"_ _0\"></span>actan<span class=\"_ _0\"></span>gleSha<span class=\"_ _0\"></span>pe <span class=\"_ _f\"></span>rec<span class=\"_ _0\"></span>; </div><div class=\"t m0 x7 hc y8a1 ff3 fs0 fc5 sc0 ls34 ws28\">if<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff2 fc0\">(mouseCollision(windo<span class=\"_ _3\"></span>w, <span class=\"_ _0\"></span>sprite, <span class=\"_ _0\"></span>rec)<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x7 hb y517 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 x29 hb y8a2 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">cursorXPosition <span class=\"_ _0\"></span>= <span class=\"_ _2\"></span>r<span class=\"_ _3\"></span>ec.getPosition.x()<span class=\"_ _3\"></span>; </span></div><div class=\"t m0 x29 hb y8a3 ff2 fs0 fc9 sc0 ls1 ws0\">float <span class=\"_ _0\"></span><span class=\"fc0\">curso<span class=\"_ _3\"></span>rYPosition = <span class=\"_ _0\"></span>rec.<span class=\"_ _0\"></span>getPo<span class=\"_ _0\"></span>siti<span class=\"_ _0\"></span>on.y(<span class=\"_ _0\"></span>); </span></div><div class=\"t m0 x7 hb y8a4 ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf60\" class=\"pf w0 h0\" data-page-no=\"60\"><div class=\"pc pc60 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1a\">3.</div><div class=\"t m3 xd hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y117 ff3 fs0 fc4 sc0 ls1 ws0\">Other <span class=\"_ _0\"></span>funct<span class=\"_ _0\"></span>ions<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y185 ff3 fs0 fc4 sc0 ls1 ws10\">3.1</div><div class=\"t m3 x1d hd y185 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y185 ff3 fs0 fc4 sc0 ls1 ws10\">cle<span class=\"_ _0\"></span>ar<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y8a5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y372 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _b\"></span><span class=\"fc0 ws10\">&lt;</span>cl<span class=\"_ _3\"></span>ass <span class=\"_ _b\"></span><span class=\"ff2 fc0\">T2, <span class=\"_ _b\"></span></span>class <span class=\"_ _9\"></span><span class=\"ff2 fc0\">T2&gt; </span></div><div class=\"t m0 x7 hb y8a6 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">clear(T &amp;render, <span class=\"_ _3\"></span><span class=\"ls39 ws2c\">T2</span> color) </span></div><div class=\"t m0 x7 hc y9c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y327 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>clear render with <span class=\"_ _0\"></span>color<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y302 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y303 ff3 fs0 fc4 sc0 ls1 ws10\">3.2</div><div class=\"t m3 x1d hd y303 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y303 ff3 fs0 fc4 sc0 ls1 ws10\">dr<span class=\"_ _0\"></span>aw<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y304 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"fc0 ls89\">&lt; </span>class <span class=\"ff2 fc0\">T2, </span>class <span class=\"ff2 fc0\">T<span class=\"_ _3\"></span>2&gt; </span></div><div class=\"t m0 x7 hb y306 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">draw(T1 <span class=\"_ _0\"></span>&amp;render, <span class=\"_ _0\"></span><span class=\"ls39 ws2c\">T2<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _2\"></span>&amp;<span class=\"_ _3\"></span>obj) </span></span></span></div><div class=\"t m0 x7 hb y308 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">draw(T1 &amp;re<span class=\"_ _3\"></span>nder, T2 *obj) </span></div><div class=\"t m0 x7 hc y2bd ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y8a7 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> dr<span class=\"_ _0\"></span>aw<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>obj<span class=\"_ _3\"></span>ect <span class=\"ls1c ws12\">on</span> r<span class=\"_ _0\"></span>ende<span class=\"_ _0\"></span>r. </div><div class=\"t m2 xc hc y8a8 ff3 fs0 fc4 sc0 ls1 ws10\">3.3</div><div class=\"t m3 x1d hd y8a8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8a8 ff3 fs0 fc4 sc0 ls1 ws0\">dis<span class=\"_ _0\"></span>play </div><div class=\"t m0 x7 hc y828 ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"fc0 ws10\">&lt;</span>cl<span class=\"_ _3\"></span>ass <span class=\"ff2 fc0\">T&gt; </span></div><div class=\"t m0 x7 hb y82a ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _2\"></span><span class=\"fc0\">dis<span class=\"_ _3\"></span>play(T <span class=\"_ _0\"></span>&amp;render) </span></div><div class=\"t m0 x7 hc y8a9 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y58 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>display r<span class=\"_ _0\"></span>ender<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y8aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y8ab ff3 fs0 fc4 sc0 ls1 ws10\">3.4</div><div class=\"t m3 x1d hd y8ab ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8ab ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tFPS </div><div class=\"t m0 x7 hc yce ff3 fs0 fc5 sc0 ls1 ws0\">template <span class=\"_ _0\"></span><span class=\"fc0 ws10\">&lt;<span class=\"fc5 ws0\">class <span class=\"_ _0\"></span><span class=\"ff2 fc0 ls39 ws2c\">T&gt;<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x7 hb y5db ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setFPS(T<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;render, <span class=\"fc9\">float<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">fp<span class=\"_ _0\"></span>s) </span></span></span></div><div class=\"t m0 x7 hc y864 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y493 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> se<span class=\"_ _0\"></span>t frame per se<span class=\"_ _0\"></span>cond<span class=\"_ _0\"></span>s. </div><div class=\"t m0 x1 hb y25d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y60 ff3 fs0 fc4 sc0 ls1 ws10\">3.5</div><div class=\"t m3 x1d hd y60 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y60 ff3 fs0 fc4 sc0 ls1 ws10\">vi<span class=\"_ _0\"></span>brate<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y25e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y8ac ff2 fs0 fc9 sc0 ls1 ws0\">int <span class=\"_ _0\"></span><span class=\"fc0 ws10\">vibrate(<span class=\"fc9 ws0\">short <span class=\"fc0\">du<span class=\"_ _0\"></span>rati<span class=\"_ _0\"></span>on) </span></span></span></div><div class=\"t m0 x7 hc y5c9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8ad ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y8ae ff2 fs0 fc0 sc0 ls1 ws0\">Launches the <span class=\"_ _0\"></span>Mobile vibr<span class=\"_ _0\"></span>ator. </div><div class=\"t m0 x1 hb y5dd ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5de ff3 fs0 fc4 sc0 ls1 ws10\">3.6</div><div class=\"t m3 x1d hd y5de ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5de ff3 fs0 fc4 sc0 ls1 ws10\">ope<span class=\"_ _0\"></span>nURL<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y572 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5cc ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">openURL(<span class=\"fc9 ws0\">const </span><span class=\"ff3 fc5\">std::string</span><span class=\"ws0\">&amp; u<span class=\"_ _0\"></span>rl<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x7 hc y269 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y26a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y26b ff2 fs0 fc0 sc0 ls1 ws0\">Open a <span class=\"_ _0\"></span>URL <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>the browser (e.g www<span class=\"_ _0\"></span>.web<span class=\"_ _0\"></span>site<span class=\"_ _0\"></span>.com). </div><div class=\"t m0 x1 hb y49e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y49f ff3 fs0 fc4 sc0 ls1 ws10\">3.7</div><div class=\"t m3 x1d hd y49f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y49f ff3 fs0 fc4 sc0 ls1 ws10\">js<span class=\"_ _0\"></span>tring2<span class=\"_ _0\"></span>stri<span class=\"_ _0\"></span>ng<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y4a0 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc0\">jstring2string(JNIEnv<span class=\"_ _3\"></span> *env, <span class=\"_ _0\"></span>jstring <span class=\"_ _0\"></span>jS<span class=\"_ _0\"></span>tr<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x1 h46 y808 ff2 fs4 fc0 sc0 ls88 ws0\"> <span class=\"ff4 ls19 wsf v4\">97<span class=\"ls1 ws0\"> </span></span></div></div><a class=\"l\" href=\"http://www.website.com/\"><div class=\"d m1\" style=\"border-style:none;position:absolute;left:173.910000px;bottom:124.750000px;width:87.470000px;height:11.780000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf61\" class=\"pf w0 h0\" data-page-no=\"61\"><div class=\"pc pc61 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzboQ1CMRSG0ZY0GAx5M9S8HViGGdiDGRiGvBm6BQaFuQgSgkVAwuWcDfqnop9ojYgCAABAUisTAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6TAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6jMBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg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AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcA3Nu3W50GgigAo3u3LaYNwWF5AxI0QYJAESSKBEdQSEwVEo8gAcsrYPG8BbaIVpSmexH8BDwCZs4RTVfe2UkmX5sBANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAoEb9ssebTqfeMQAA8N1oNKpq3sjMkseLGA6HtjUAAPBuNpuVHUE1Vl/XdRFhcwMAAJnZtm1t1edeHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAFCPfvETzufziPCmAQCAzKxw6ih77IgYDAY2N0Dllstl0zS9Xs9SALBYLGprv/Krr+s6//UBVG48Hn99AlCzzGzbtrbqc68PAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACUoF/8hJnpNQNU7v0scCIAUOdZEGWPHRF2NgAAUHP7hR8+AQAACuZeHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfTFwRvAAAAFISURBVAAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAQH36n1+2dm+eHk6aZuNy9WV/72Xz6PB6tvV8dHH38Xx6tn5wsjPZvM+0aj8cXz1Opq/WAQDgX1sbrtyeb1sHfkv+oXB6AyeemOdp3OuzAAAAAElFTkSuQmCC\"/><div class=\"c x40 y114 w2b ha\"><div class=\"t m0 x0 h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">98<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Convert <span class=\"ff3\">jstring <span class=\"_ _0\"></span><span class=\"ff2 ls1b ws11\">to<span class=\"ls75 ws0\"> <span class=\"ff3 ls1\">st<span class=\"_ _0\"></span>d::str<span class=\"_ _0\"></span>ing. </span></span></span></span></div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">3.8</div><div class=\"t m3 x1d hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Devic<span class=\"_ _0\"></span>eId<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc0\">getDeviceI<span class=\"_ _3\"></span>d(JNIEnv <span class=\"_ _0\"></span>*env, <span class=\"_ _0\"></span>ANa<span class=\"_ _3\"></span>tiveActivity<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>*ac<span class=\"_ _0\"></span>tivity<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">Mo<span class=\"_ _3\"></span>bile device <span class=\"_ _0\"></span><span class=\"ls7b ws66\">id.<span class=\"ls1 ws0\"> </span></span></span></div><div class=\"t m0 x1 hb y7ea ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y440 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x41 hb y1e9 ff6 fs0 fc3 sc0 ls1 ws0\">External <span class=\"_ _0\"></span>lib<span class=\"_ _0\"></span>rary<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hb y8af ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y8b0 ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y8b0 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8b0 ff3 fs0 fc4 sc0 ls1 ws0\">Tiny <span class=\"_ _0\"></span>File Dialogs (only <span class=\"_ _0\"></span>for <span class=\"_ _3\"></span>Windows and <span class=\"_ _0\"></span>Lin<span class=\"_ _0\"></span>ux)<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y8b1 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y8b1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8b1 ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>T<span class=\"_ _3\"></span>inyDialogBox </div><div class=\"t m0 x7 hc y8b2 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">TinyDial<span class=\"_ _3\"></span>ogBox; </span></div><div class=\"t m0 x7 hb y8b3 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>ext_l<span class=\"_ _0\"></span>ib/T<span class=\"_ _0\"></span>inyFi<span class=\"_ _0\"></span>leDia<span class=\"_ _0\"></span>logs/<span class=\"_ _0\"></span>TinyD<span class=\"_ _0\"></span>ialo<span class=\"_ _0\"></span>gsBox.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y8b4 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y65c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y8b5 ff2 fs0 fc0 sc0 ls1 ws0\">A class that allows you <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> use the Tinyfiledialogs library <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>the simplest way. It allows you <span class=\"ls1b ws11\">to</span> use the dialog boxes <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the </span></span></span></span></div><div class=\"t m0 x7 hb y4b0 ff2 fs0 fc0 sc0 ls1 ws0\">operating system (<span class=\"_ _3\"></span>Windows and Linux).<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y8b6 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y8b6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8b6 ff3 fs0 fc4 sc0 ls1 ws10\">ti<span class=\"_ _0\"></span>nyStr<span class=\"_ _0\"></span>ing<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y8b7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y8b8 ff3 fs0 fc5 sc0 ls1 ws0\">#i<span class=\"_ _0\"></span>f !def<span class=\"_ _0\"></span>ined<span class=\"_ _0\"></span>(SFML<span class=\"_ _0\"></span>_SYST<span class=\"_ _0\"></span>EM_LINU<span class=\"_ _0\"></span>X) </div><div class=\"t m0 x7 hc y8b9 ff3 fs0 fc5 sc0 ls1 ws0\">typedef <span class=\"ff2 fc9\">wchar_t co<span class=\"_ _3\"></span>nst<span class=\"fc0 ls8a\">* </span></span><span class=\"fc0 ws10\">tinyString<span class=\"ff2 ls8b ws0\">; </span></span></div><div class=\"t m0 x7 hc y1f8 ff3 fs0 fc5 sc0 ls1 ws10\">#e<span class=\"_ _0\"></span>lse<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y661 ff3 fs0 fc5 sc0 ls1 ws0\">typedef <span class=\"_ _0\"></span><span class=\"ff2 fc9\">char <span class=\"_ _2\"></span>c<span class=\"_ _3\"></span>onst<span class=\"fc0\">* <span class=\"_ _0\"></span><span class=\"ff3 ws10\">tinyString<span class=\"ff2 ls8b ws0\">; </span></span></span></span></div><div class=\"t m0 x7 hc y4b1 ff3 fs0 fc5 sc0 ls1 ws10\">#en<span class=\"_ _0\"></span>dif<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y1fb ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y249 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y32 ff2 fs0 fc0 sc0 ls1 ws0\">Custom type which al<span class=\"_ _3\"></span>lows to manipulat<span class=\"_ _3\"></span>e the data of tinyF<span class=\"_ _3\"></span>ileDialogs. When usi<span class=\"_ _3\"></span>ng tinyFileDialogs diff<span class=\"_ _3\"></span>erent data </div><div class=\"t m0 x7 hb y8ba ff2 fs0 fc0 sc0 ls1 ws0\">depending <span class=\"ls1c ws12\">on</span> the operating system. On windows the strings become <span class=\"fc9\">wchar_t const</span>* and <span class=\"ls1f ws16\">on</span> <span class=\"_ _0\"></span>Linux <span class=\"fc9\">char const</span><span class=\"ls8c ws72\">*,</span> which </div><div class=\"t m0 x7 hc y8bb ff2 fs0 fc0 sc0 ls1 ws0\">implies the use of two<span class=\"_ _3\"></span> (2) different types havi<span class=\"_ _3\"></span>ng the same purpose<span class=\"_ _3\"></span> for the same prog<span class=\"_ _3\"></span>ram. The <span class=\"_ _3\"></span><span class=\"ff3\">t<span class=\"_ _3\"></span>inyString </span>type </div><div class=\"t m0 x7 hb y8bc ff2 fs0 fc0 sc0 ls1 ws0\">overcomes this problem<span class=\"_ _3\"></span> by automatica<span class=\"_ _3\"></span>lly determining <span class=\"_ _3\"></span>the ty<span class=\"_ _3\"></span>pe that corresponds to<span class=\"_ _3\"></span> the target ope<span class=\"_ _3\"></span>rating system.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y8bd ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y8bd ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8bd ff3 fs0 fc4 sc0 ls1 ws10\">TIN<span class=\"_ _0\"></span>Y_FIL<span class=\"_ _0\"></span>E_DIA<span class=\"_ _0\"></span>LOGB<span class=\"_ _0\"></span>OX_PAT<span class=\"_ _0\"></span>H<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y8be ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"fc0\">tinyStri<span class=\"_ _3\"></span>ng <span class=\"_ _0\"></span><span class=\"ff2\">TINY<span class=\"_ _0\"></span>_FILE<span class=\"_ _0\"></span>_DIALO<span class=\"_ _0\"></span>GBOX_<span class=\"_ _0\"></span>PATH<span class=\"_ _0\"></span>; </span></span></div><div class=\"t m0 x1 hb y8bf ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y8c0 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8c1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x42 hb y8c2 ff2 fs0 fc0 sc0 ls1 ws0\">Stores file <span class=\"_ _0\"></span>path of dialog b<span class=\"_ _0\"></span>ox.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y8c3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y69 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y69 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y69 ff3 fs0 fc4 sc0 ls1 ws0\">enum <span class=\"_ _2\"></span>F<span class=\"_ _3\"></span>ileDialogType </div><div class=\"t m0 x7 hc y8c4 ff3 fs0 fc5 sc0 ls1 ws0\">enum <span class=\"ff2 fc0\">FileDialogType;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hc y8c5 ff3 fs0 fc0 sc0 ls1 ws0\">En<span class=\"_ _0\"></span>umerat<span class=\"_ _0\"></span>or </div><div class=\"t m0 x7 hb y8c6 ff2 fs0 fc0 sc0 ls1 ws0\">SAV<span class=\"_ _0\"></span>E_FI<span class=\"_ _0\"></span>LE <span class=\"_ _1d\"> </span>Save f<span class=\"_ _0\"></span>i<span class=\"_ _0\"></span>le </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf62\" class=\"pf w0 h0\" data-page-no=\"62\"><div class=\"pc pc62 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcsW1USxSA4TnDTTbDG0KG6QBasNyBRTm3AupAdGC5A9tUgE1mZ7sm8kbMecFKK6RXAXO+L7j5mbnS6N/rcWRmAwAAYFLdEgAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAATGqZe7yI+PPnT0TYaYDK1nU9PQGoLDPfvHmTmapvtvBTfQDFHQ8CxwEANfkLTwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAKCOyMyZx4t4+/ZtRNhpgMoOh0NrbbPZWAqA4jLz9+/fc0fQ/y1zj7fb7bzZAABAZVEtcwEAAEpxrw8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAAD+Ncvc411fX9tjAADgb5eXl6XmjcycebyIi4sLrzUAAHB0c3MzdwRVrL4xRkR4uQEAgMzsvVerPvf6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAADADJbpJ7y7u4sIOw0AAGRmwalj7rEj4tOnT6oPoLinp6fW2vv37y0FgOr78eNHtfabv/rGGKoPoLh1XU9PAIpXX++9WvW51wcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAADUsUw/4cPDQ0TYaYDK9vv98USwFADFZWbBqWPusSPiw4cPqg9A9bXWttutpQBQfb9+/arWfvNX3xhD9QEUt67r6QlA8errvVerPvf6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAgDqW6Sfc7XYRYacBKnt9fT2eCJYCoLjMLDh1zD12RGy3Wy83QHGHw6G1ttlsLAUA+/2+WvvNX31jDN/6AIpb1/X0BKCyzOy9V6s+9/oAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAMAMluknHGNEhJ0GqCwzjyeCpQBwIhScOuYeW+8BAADF22/yb31+1gUAAIqLmp84AQAAivDfXAAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcA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AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrvv/br0IZBKArDKC9B19Z2AxIGqKQC1SCxuIYJ8OyAQFR3hA7BFrVgkC+poQNUEs5R99rffQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfS7Rz9YAAALtSURBVAAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAAD/SX9HXozTu0mSS39aytuS1dWw5p+6e27/oz3fm+ucvWwGAAAHFGMMIdhhh77lFaMH2VGw9AAAAABJRU5ErkJggg==\"/><div class=\"c x40 y114 w2b ha\"><div class=\"t m0 x0 h9 y115 ff4 fs4 fc0 sc0 ls19 wsf\">99<span class=\"ls1 ws0\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x37 hb y8c7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y8c8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y8c9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1cd ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ce ff2 fs0 fc0 sc0 ls1 ws0\">Represents the icon <span class=\"_ _0\"></span>that will <span class=\"_ _0\"></span><span class=\"ls22 ws19\">be<span class=\"ls1 ws0\"> displayed <span class=\"ls1c ws12\">on</span> <span class=\"_ _0\"></span>the dialog b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y8ca ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y8cb ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y8cb ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8cb ff3 fs0 fc4 sc0 ls1 ws0\">enumDialogTypeT<span class=\"_ _3\"></span>oStr <span class=\"_ _0\"></span>/ <span class=\"_ _0\"></span>enum<span class=\"_ _0\"></span>IconT<span class=\"_ _0\"></span>ypeToS<span class=\"_ _0\"></span>tr<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y8cc ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"fc0\">tinyString <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">enumDial<span class=\"_ _3\"></span>ogTypeToStr(DialogTy<span class=\"_ _3\"></span>pe <span class=\"_ _0\"></span>va<span class=\"_ _0\"></span>l) </span></span></span></div><div class=\"t m0 x1 hb y8cd ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1d2 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"fc0\">tinyString <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"fc0\">enumIconTypeToStr(Icon<span class=\"_ _3\"></span>Type <span class=\"_ _0\"></span>val<span class=\"_ _0\"></span>) </span></span></span></div><div class=\"t m0 x1 hb y1d3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y8ce ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8cf ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y8d0 ff2 fs0 fc0 sc0 ls1 ws0\">These functions <span class=\"_ _0\"></span>conv<span class=\"_ _3\"></span>ert <span class=\"_ _0\"></span><span class=\"ff3 fc5\">enu<span class=\"_ _3\"></span>m <span class=\"ff2 fc0 ls1b\">to </span><span class=\"fc0\">string <span class=\"_ _0\"></span><span class=\"ff2\">which<span class=\"_ _3\"></span> will <span class=\"ls22 ws19\">be</span> <span class=\"_ _0\"></span>used later <span class=\"ls1d ws13\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the libr<span class=\"_ _0\"></span>a<span class=\"_ _3\"></span>ry f<span class=\"_ _0\"></span>uncti<span class=\"_ _0\"></span>ons. </span></span></span></span></span></div><div class=\"t m2 xc hc y8d1 ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y8d1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8d1 ff3 fs0 fc4 sc0 ls1 ws10\">show<span class=\"_ _0\"></span>Dial<span class=\"_ _0\"></span>ogBox<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y8d2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1d9 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">int <span class=\"_ _0\"></span><span class=\"fc0 ws10\">showDia<span class=\"_ _3\"></span>logBox(<span class=\"fc9 ws0\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; ti<span class=\"_ _0\"></span>tle, </span></span></span></span></span></div><div class=\"t m0 x1 hb y8d3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x43 hc y8d4 ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"ff3 fc5 ws10\">std::string</span><span class=\"fc0\">&amp;<span class=\"_ _3\"></span> msg,<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x43 hb y536 ff2 fs0 fc0 sc0 ls1 ws0\">DialogType <span class=\"_ _b\"></span>dial<span class=\"_ _3\"></span>ogType, </div><div class=\"t m0 x43 hb y8d5 ff2 fs0 fc0 sc0 ls1 ws0\">IconType iconType<span class=\"_ _3\"></span> </div><div class=\"t m0 x43 hb y88 ff2 fs0 fc0 sc0 ls1 ws0\">)<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y8d6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y53a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8d7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y8d8 ff2 fs0 fc0 sc0 ls1 ws0\">Displays a <span class=\"_ _0\"></span>message dialog b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </div></div><div class=\"c x7 y8d9 w2c h47\"><div class=\"t m0 x0 hb y607 ff2 fs0 fc0 sc0 ls1 ws0\">LOA<span class=\"_ _0\"></span>D_FI<span class=\"_ _0\"></span>LE </div></div><div class=\"c x2b y8d9 w2d h47\"><div class=\"t m0 x0 hb y607 ff2 fs0 fc0 sc0 ls1 ws0\">Load <span class=\"_ _0\"></span>fi<span class=\"_ _0\"></span>le </div></div><div class=\"c x7 y8da w2e h48\"><div class=\"t m0 x0 hc y8db ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x0 hc y8dc ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y8dd ff2 fs0 fc0 sc0 ls1 ws0\">Represents the type <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> dialog box<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>disp<span class=\"_ _0\"></span>lay. </span></span></span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y48 ff3 fs0 fc4 sc0 ls1 ws0\">2.5 enum <span class=\"_ _0\"></span>DialogType </div></div><div class=\"c x7 y8da w2e h48\"><div class=\"t m0 x0 hc y8de ff3 fs0 fc5 sc0 ls1 ws0\">enum </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2c hb y57a ff2 fs0 fc0 sc0 ls1 ws0\">DialogType; </div></div><div class=\"c x7 y8da w2e h48\"><div class=\"t m0 x0 hc y8df ff3 fs0 fc0 sc0 ls1 ws0\">En<span class=\"_ _0\"></span>umerat<span class=\"_ _0\"></span>or </div><div class=\"t m0 x0 hb y69c ff2 fs0 fc0 sc0 ls8d ws73\">OK<span class=\"ls1 ws0\"> </span></div><div class=\"t m0 x0 hb y8e0 ff2 fs0 fc0 sc0 ls1 ws0\">OK<span class=\"_ _0\"></span>CANCE<span class=\"_ _0\"></span>L </div><div class=\"t m0 x0 hb y463 ff2 fs0 fc0 sc0 ls1 ws0\">YES<span class=\"_ _0\"></span>NO </div></div><div class=\"c x2b y8da w2f h49\"><div class=\"t m0 x0 hb y8e1 ff2 fs0 fc0 sc0 ls1 ws0\">Message with <span class=\"_ _0\"></span>button <span class=\"ls8d ws73\">OK</span> </div><div class=\"t m0 x0 hb y611 ff2 fs0 fc0 sc0 ls1 ws0\">Message <span class=\"_ _0\"></span>with b<span class=\"_ _0\"></span>u<span class=\"_ _3\"></span>tton <span class=\"_ _0\"></span><span class=\"ls8e ws74\">OK<span class=\"ls1 ws0\"> <span class=\"ls8f ws75\">et</span> <span class=\"_ _0\"></span>CANCEL </span></span></div><div class=\"t m0 x0 hb y469 ff2 fs0 fc0 sc0 ls1 ws0\">Message with butt<span class=\"_ _3\"></span>on YES et NO<span class=\"_ _3\"></span> </div></div><div class=\"c x7 y8e2 w30 h4a\"><div class=\"t m0 x0 hc y8e3 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x0 hc y8e4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x0 hb y8e5 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>buttons tha<span class=\"_ _3\"></span>t will <span class=\"ls26 ws1c\">be</span> <span class=\"_ _0\"></span>displayed <span class=\"ls1f ws16\">on</span> <span class=\"_ _0\"></span>the dialog b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y8e6 ff3 fs0 fc4 sc0 ls1 ws0\">2.6 enum <span class=\"_ _0\"></span>IconType </div></div><div class=\"c x7 y8e2 w30 h4a\"><div class=\"t m0 x0 hc y42e ff3 fs0 fc5 sc0 ls1 ws0\">enum <span class=\"ff2 fc0\">IconType;<span class=\"_ _3\"></span> </span></div></div><div class=\"c x7 y8e7 w31 h19\"><div class=\"t m0 x0 hc y8e8 ff3 fs0 fc0 sc0 ls1 ws0\">En<span class=\"_ _0\"></span>umerat<span class=\"_ _0\"></span>or </div><div class=\"t m0 x0 hb y8e9 ff2 fs0 fc0 sc0 ls1 ws0\">IN<span class=\"_ _0\"></span>FO<span class=\"_ _0\"></span> </div><div class=\"t m0 x0 hb y8ea ff2 fs0 fc0 sc0 ls1 ws0\">WA<span class=\"_ _0\"></span>RNING </div><div class=\"t m0 x0 hb y8eb ff2 fs0 fc0 sc0 ls1 ws10\">ERRO<span class=\"_ _0\"></span>R</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x44 hc y8ec ff3 fs0 fc5 sc0 ls1\">_</div></div><div class=\"c x7 y8e7 w31 h19\"><div class=\"t m0 x45 hb y8eb ff2 fs0 fc0 sc0 ls1 ws0\">ICO </div><div class=\"t m0 x0 hb y8ed ff2 fs0 fc0 sc0 ls1 ws0\">QUE<span class=\"_ _0\"></span>STION </div></div><div class=\"c x2b y8e7 w32 h4b\"><div class=\"t m0 x0 hb y8ee ff2 fs0 fc0 sc0 ls1 ws0\">Dialog box <span class=\"_ _0\"></span>with <span class=\"ls23 ws1a\">an</span> INFO i<span class=\"_ _0\"></span>co<span class=\"_ _0\"></span>n </div><div class=\"t m0 x0 hb y8ef ff2 fs0 fc0 sc0 ls1 ws0\">Dialog box with an WARNING<span class=\"_ _3\"></span> icon </div><div class=\"t m0 x0 hb y8f0 ff2 fs0 fc0 sc0 ls1 ws0\">Dialog box with an<span class=\"_ _3\"></span> ERROR ic<span class=\"_ _3\"></span>on </div><div class=\"t m0 x0 hb y8f1 ff2 fs0 fc0 sc0 ls1 ws0\">Dialog <span class=\"_ _0\"></span>box <span class=\"_ _0\"></span>with <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>QUESTIO<span class=\"_ _3\"></span>N icon </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf63\" class=\"pf w0 h0\" data-page-no=\"63\"><div class=\"pc pc63 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB27NbG4SBAAzDdwkai2WDJh0ACQJFcK2tI0yAZwcEAlPDCAzBFlhqKi+HgYQBIOHneXKiZ79TbwoAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6TAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6jMBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AL1RVIcYPOm3rTQAA1QcAAMA7xZyzFQAAAH6Vf30AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAEUutUEAAABvSURBVACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAwLPB46Oc7s+nJoTxdtjNZ11RL3d9eak3h/t9tR4tmsm1ONoMAAD+UEopxmiHL3QDv2oqgLTuShoAAAAASUVORK5CYII=\"/><div class=\"c x40 y114 w2b ha\"><div class=\"t m0 x0 h9 y115 ff4 fs4 fc0 sc0 ls1 ws0\">10<span class=\"_ _0\"></span>0<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fcc\">1 <span class=\"_ _0\"></span><span class=\"fc0\">when the user <span class=\"_ _0\"></span>clic<span class=\"_ _3\"></span>ks <span class=\"ls1c ws12\">on</span> the <span class=\"ls3b ws2e\">OK</span> <span class=\"_ _0\"></span>button and <span class=\"fcc\">0 </span>when<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls90 ws76\">he<span class=\"ls1 ws0\"> clicks <span class=\"ls1c ws12\">on</span> <span class=\"_ _0\"></span>CANCEL<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">or<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> NO<span class=\"_ _0\"></span>.<span class=\"_ _0\"></span> </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y1b2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">show<span class=\"_ _0\"></span>Fil<span class=\"_ _0\"></span>eDialo<span class=\"_ _0\"></span>gBox<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"_ _0\"></span><span class=\"ff2 fc0\">showFileDia<span class=\"_ _3\"></span>logBox(FileDialogTyp<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>type<span class=\"_ _0\"></span>, </span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hc y1b5 ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; title<span class=\"_ _0\"></span>, </span></span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hc y20a ff3 fs0 fc0 sc0 ls1 ws0\">tinyString <span class=\"_ _0\"></span><span class=\"ff2\">fi<span class=\"_ _0\"></span>lterP<span class=\"_ _0\"></span>attern<span class=\"_ _0\"></span>s[], </span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hc y2b5 ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">&amp; fileName = <span class=\"_ _2\"></span><span class=\"ff3 fc7 ws10\">&quot;file<span class=\"ff2 fc0 ls91 ws77\">&quot;,<span class=\"ls1 ws0\"> </span></span></span></span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hc y20d ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"ff3 fc5 ws10\">st<span class=\"_ _0\"></span>d::st<span class=\"_ _3\"></span>ring<span class=\"ff2 fc0 ws0\">&amp; msgError<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"ff3 fc7\">&quot;Unable <span class=\"_ _0\"></span><span class=\"ls66 ws55\">to<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>access<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>file!<span class=\"_ _0\"></span>&quot;<span class=\"ff2 fc0\">, </span></span></span></span></span></span></div><div class=\"t m0 x46 hc y1e9 ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">&amp; errTitle <span class=\"_ _0\"></span>= <span class=\"ff3 fc7 ws10\">&quot;<span class=\"_ _0\"></span>Error&quot;<span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hb y1ea ff2 fs0 fc0 sc0 ls1 ws0\">)<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5c5 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y5c6 ff2 fs0 fc0 sc0 ls1 ws0\">Displays a <span class=\"_ _0\"></span>file dialog bo<span class=\"_ _0\"></span>x. </div><div class=\"t m0 x7 hc y245 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">file <span class=\"_ _0\"></span>path <span class=\"ls1d ws13\">if</span> the <span class=\"_ _0\"></span>function was successful a<span class=\"_ _3\"></span>nd <span class=\"ff3 ls92 ws78\">&quot;&quot;</span><span class=\"ff3\"> <span class=\"_ _0\"></span>(empty string) <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></span></div><div class=\"t m0 x1 hb y3a3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y246 ff3 fs0 fc4 sc0 ls1 ws10\">2.10</div><div class=\"t m3 x21 hd y246 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y246 ff3 fs0 fc4 sc0 ls1 ws10\">show<span class=\"_ _0\"></span>Fol<span class=\"_ _0\"></span>derDia<span class=\"_ _0\"></span>logBo<span class=\"_ _0\"></span>x<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3a4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y247 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"_ _0\"></span><span class=\"ff2 fc0 ws10\">showFold<span class=\"_ _3\"></span>erDialogBox(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::s<span class=\"_ _3\"></span>tring<span class=\"ff2 fc0 ws0\">&amp; <span class=\"_ _0\"></span>ti<span class=\"_ _0\"></span>tle, </span></span></span></span></div><div class=\"t m0 x46 hc y3a5 ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"ff2 fc0 ws0\">&amp; defa<span class=\"_ _0\"></span>ultPat<span class=\"_ _0\"></span>h, </span></span></div><div class=\"t m0 x1 hb y3a6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hc y390 ff3 fs0 fc5 sc0 ls1 ws0\">#if !<span class=\"_ _0\"></span>define<span class=\"_ _0\"></span>d(SF<span class=\"_ _0\"></span>ML_SY<span class=\"_ _0\"></span>STEM_L<span class=\"_ _0\"></span>INUX<span class=\"_ _0\"></span>)<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3a7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hc y391 ff2 fs0 fc0 sc0 ls1 ws0\">= <span class=\"ff3 fc7 ws10\">L&quot;<span class=\"_ _0\"></span>C:\\\\<span class=\"_ _0\"></span>&quot;<span class=\"ff2 fc0 ws0\">, </span></span></div><div class=\"t m0 x1 hb y3a8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hc y3a9 ff3 fs0 fc5 sc0 ls1 ws10\">#e<span class=\"_ _0\"></span>lse<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3aa ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hc y8f2 ff2 fs0 fc0 sc0 ls1 ws0\">= <span class=\"_ _2\"></span><span class=\"ff3 fc7 ws10\">&quot;/h<span class=\"_ _3\"></span>ome/&quot;<span class=\"ff2 fc0 ls73 ws0\">, </span></span></div><div class=\"t m0 x46 hc y4a6 ff3 fs0 fc5 sc0 ls1 ws10\">#en<span class=\"_ _0\"></span>dif<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x46 hc ya1 ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"ff3 fc5 ws10\">st<span class=\"_ _0\"></span>d::st<span class=\"_ _3\"></span>ring<span class=\"ff2 fc0 ws0\">&amp; msgError<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"ff3 fc7\">&quot;Unable <span class=\"_ _0\"></span><span class=\"ls66 ws55\">to<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>access<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>folder<span class=\"_ _0\"></span>!&quot;<span class=\"ff2 fc0\">, </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y394 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hc y395 ff2 fs0 fc9 sc0 ls1 ws0\">const <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">std::string<span class=\"_ _3\"></span><span class=\"ff2 fc0 ws0\">&amp; errTitle <span class=\"_ _0\"></span>= <span class=\"ff3 fc7 ws10\">&quot;<span class=\"_ _0\"></span>Error&quot;<span class=\"fc0 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hc ya3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x46 hb y671 ff2 fs0 fc0 sc0 ls1 ws0\">)<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc ya5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y37f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1fe ff2 fs0 fc0 sc0 ls1 ws0\">Displays a <span class=\"_ _0\"></span>folder selection <span class=\"_ _0\"></span>dia<span class=\"_ _3\"></span>log b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y399 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y39a ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">folder <span class=\"_ _0\"></span>path<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">if</span> function was <span class=\"_ _0\"></span>successful<span class=\"_ _3\"></span> and <span class=\"_ _0\"></span><span class=\"ff3 ls92 ws78\">&quot;&quot;<span class=\"ls1 ws0\"> (empty string) <span class=\"ff2 ls1d ws13\">if</span><span class=\"ff2\"> <span class=\"_ _0\"></span>no<span class=\"_ _0\"></span>t. </span></span></span></span></div><div class=\"t m2 xc hc yba ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd yba ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc yba ff3 fs0 fc4 sc0 ls1 ws0\">Box <span class=\"_ _0\"></span><span class=\"ls93 ws79\">2D<span class=\"fc0 ls1 ws0\"> </span></span></div><div class=\"t m0 x1 hc y39b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y431 ff2 fs0 fc0 sc0 ls1 ws0\">Box <span class=\"ls24 ws1d\">2D</span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> a <span class=\"_ _0\"></span>physical<span class=\"_ _3\"></span> engine<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>integra<span class=\"_ _3\"></span>ted into <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> game engine. <span class=\"ls94 ws7a\">To</span> <span class=\"_ _0\"></span>use <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">in<span class=\"ls1 ws0\"> a <span class=\"_ _0\"></span>scen<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>y<span class=\"_ _3\"></span>ou mus<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span>includ<span class=\"_ _3\"></span>e <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span>this w<span class=\"_ _0\"></span>ay:<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m0 x1 hb y39d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y39e ff3 fs0 fcf sc0 ls1 ws0\">#include <span class=\"_ _0\"></span>&quot;..<span class=\"_ _0\"></span>/../..<span class=\"_ _0\"></span>/isE<span class=\"_ _0\"></span>ngine<span class=\"_ _0\"></span>/ext<span class=\"_ _0\"></span>_lib/<span class=\"_ _0\"></span>Box2D/<span class=\"_ _0\"></span>Box2D.<span class=\"_ _0\"></span>h&quot;<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y39f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc ya9 ff3 fs0 fc4 sc0 ls1a\">3.</div><div class=\"t m3 xd hd ya9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc ya9 ff3 fs0 fc4 sc0 ls1 ws10\">TMX<span class=\"_ _0\"></span>Lite<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y4b6 ff2 fs0 fc0 sc0 ls1 ws0\">TMXLite <span class=\"ls1d ws13\">is</span> a <span class=\"_ _0\"></span>libra<span class=\"_ _3\"></span>ry that <span class=\"_ _0\"></span>all<span class=\"_ _3\"></span>ows <span class=\"ls1b ws11\">to</span> use <span class=\"ff3 fc10\">Tiled </span>editor with <span class=\"_ _0\"></span>the game engine. To use <span class=\"ls1f ws16\">it</span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">in<span class=\"ls1 ws0\"> a scene you must include </span>it<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>this </span></span></div><div class=\"t m0 x7 hb y7d3 ff2 fs0 fc0 sc0 ls1 ws0\">w<span class=\"_ _0\"></span>ay: </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf64\" class=\"pf w0 h0\" data-page-no=\"64\"><div class=\"pc pc64 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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qD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8A4N2+HfIQEAZwHL7bLquqzmbTCQJBQpSYZpJoE0WyIKiSrpJ9C/UEivIqbIKocM+T7up/F+733g4A1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAOB7EhPwLoRgBACAPxDHsRFQfXwwWB7T690OAAA/rVrKTzpFO/A8AvBtBwAA4I/5rw8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAGnBFp0AAADdSURBVKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAnyWvi0pjfdoPo6gwz11azUu5113dKufedPO8H43z7WEtLW9DyNZC/cUhvd49KQAAv243qxvhXcjam312PQAjbFQdJAEcgwAAAABJRU5ErkJggg==\"/><div class=\"c x40 y114 w2b ha\"><div class=\"t m0 x0 h9 y115 ff4 fs4 fc0 sc0 ls1 ws0\">10<span class=\"_ _0\"></span>1<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fcf sc0 ls1 ws0\">#include <span class=\"_ _0\"></span>&quot;..<span class=\"_ _0\"></span>/../..<span class=\"_ _0\"></span>/isE<span class=\"_ _0\"></span>ngine<span class=\"_ _0\"></span>/ext<span class=\"_ _0\"></span>_lib/<span class=\"_ _0\"></span>TMXLit<span class=\"_ _0\"></span>e/Map<span class=\"_ _0\"></span>.hpp&quot;<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y437 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hc y438 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y1b4 ff6 fs0 fc3 sc0 ls1 ws0\">Game <span class=\"_ _0\"></span>Engi<span class=\"_ _0\"></span>ne<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hb y8f3 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y11c ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y11c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y11c ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameEngine </div><div class=\"t m0 x7 hc y8f4 ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"ff2 fc0\">GameEngine;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y8f5 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">isE<span class=\"_ _0\"></span>ngine/<span class=\"_ _0\"></span>core/<span class=\"_ _0\"></span>GameE<span class=\"_ _0\"></span>ngine<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div><div class=\"t m0 x7 hc y8f6 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8f7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y8f8 ff2 fs0 fc0 sc0 ls1 ws0\">This Class ensures the in<span class=\"_ _0\"></span>terc<span class=\"_ _3\"></span>onnection <span class=\"ls1c ws12\">of</span> the different components <span class=\"ls1c ws12\">of</span> the engine <span class=\"_ _0\"></span>and launches<span class=\"_ _3\"></span> the ren<span class=\"_ _0\"></span>dering loop i<span class=\"_ _3\"></span>n </div><div class=\"t m0 x7 hb y8f9 ff2 fs0 fc0 sc0 ls1 ws0\">which the game will<span class=\"_ _3\"></span> take place.<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y8b1 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y8b1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8b1 ff3 fs0 fc4 sc0 ls1 ws0\">Methods of Ga<span class=\"_ _0\"></span>meEng<span class=\"_ _0\"></span>ine<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y5c5 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y5c5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5c5 ff3 fs0 fc4 sc0 ls1 ws0\">Game<span class=\"_ _0\"></span>Engin<span class=\"_ _0\"></span>e </div><div class=\"t m0 x7 hb y8fa ff2 fs0 fc0 sc0 ls1 ws0\">Gam<span class=\"_ _0\"></span>eEngi<span class=\"_ _0\"></span>ne()<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y878 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y26 ff2 fs0 fc0 sc0 ls1 ws0\">Default <span class=\"_ _0\"></span>constr<span class=\"_ _0\"></span>uct<span class=\"_ _0\"></span>or. </div><div class=\"t m0 x1 hb y1f1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4b0 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y4b0 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y4b0 ff3 fs0 fc4 sc0 ls1 ws0\">in<span class=\"_ _0\"></span>itEng<span class=\"_ _0\"></span>ine </div><div class=\"t m0 x7 hb y8b6 ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">initEngine() </span></div><div class=\"t m0 x7 hc y132 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y51c ff2 fs0 fc0 sc0 ls1 ws0\">Initializes the <span class=\"_ _0\"></span>game<span class=\"_ _3\"></span> e<span class=\"_ _0\"></span>ngin<span class=\"_ _0\"></span>e. </div><div class=\"t m0 x1 hb y2c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y51d ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y51d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y51d ff3 fs0 fc4 sc0 ls1 ws0\">pl<span class=\"_ _0\"></span>ay<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y8fb ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">play() </span></div><div class=\"t m0 x7 hc y22f ff3 fs0 fca sc0 ls1 ws0\">Sou<span class=\"_ _0\"></span>rce <span class=\"_ _2\"></span>Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y656 ff2 fs0 fc0 sc0 ls1 ws0\">Game engine <span class=\"_ _0\"></span>main render l<span class=\"_ _0\"></span>oop. </div><div class=\"t m0 x1 hb y4e6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y32 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y32 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y32 ff3 fs0 fc4 sc0 ls1 ws0\">bas<span class=\"_ _0\"></span>icSFM<span class=\"_ _0\"></span>Lmain<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y27f ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"fc0\">basicSFML<span class=\"_ _3\"></span>main() </span></div><div class=\"t m0 x7 hc y281 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y95 ff2 fs0 fc0 sc0 ls1 ws0\">Classic<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>SFML window <span class=\"_ _0\"></span>rendering <span class=\"_ _0\"></span>loo<span class=\"_ _0\"></span>p.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y8fc ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y8fc ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8fc ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Render<span class=\"_ _0\"></span>Wind<span class=\"_ _0\"></span>ow </div><div class=\"t m0 x7 hb y8fd ff2 fs0 fc0 sc0 ls1 ws0\">sf:<span class=\"_ _0\"></span>:Ren<span class=\"_ _0\"></span>derWin<span class=\"_ _0\"></span>dow&amp;<span class=\"_ _0\"></span> getRe<span class=\"_ _0\"></span>nderWi<span class=\"_ _0\"></span>ndow<span class=\"_ _0\"></span>() </div><div class=\"t m0 x7 hc y8fe ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y8ff ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">SFML win<span class=\"_ _0\"></span>dow. </span></div><div class=\"t m0 x1 hb yfc ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y900 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y3a0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y9a ff6 fs0 fc3 sc0 ls1 ws0\">Game <span class=\"_ _0\"></span>set<span class=\"_ _0\"></span>up<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf65\" class=\"pf w0 h0\" data-page-no=\"65\"><div class=\"pc pc65 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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DwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB/8q/06xEEYCAIoWoHG1nKDJj1ARQUIFEFWkdQ1PQEJEolHILAoPBbPLWpbAQazGEi4Aux7atZORuwHAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfc6q6MoAAAQxSURBVAAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAADwD0afIZ8ebpc6SSbb8TCfDVm13D/yrlof3++mTRd10WenEOLa0Gp37e9PlwIA8OvOm9ISvoXYfvbxegFxWQ/ePZidpwAAAABJRU5ErkJggg==\"/><div class=\"c x40 y114 w2b ha\"><div class=\"t m0 x0 h9 y115 ff4 fs4 fc0 sc0 ls1 ws0\">10<span class=\"_ _0\"></span>2<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y116 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">nam<span class=\"_ _0\"></span>espa<span class=\"_ _0\"></span>ce <span class=\"_ _3\"></span><span class=\"ff2 fc0\">GameC<span class=\"_ _0\"></span>onfi<span class=\"_ _0\"></span>g; </span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">app_<span class=\"_ _0\"></span>src/<span class=\"ff3\">co<span class=\"_ _0\"></span>nfig<span class=\"ff6\">/<span class=\"_ _0\"></span><span class=\"ff3\">Game<span class=\"_ _0\"></span>Config<span class=\"_ _0\"></span><span class=\"ff6 ls49 ws3b\">.h<span class=\"fc0 ls1 ws0\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y28d ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1b4 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y28e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y28f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y290 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1e5 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y291 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1e6 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y120 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y292 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y293 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y20e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y240 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y294 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y295 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y1eb ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y296 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y243 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y212 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y228 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y297 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y901 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y902 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y903 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y904 ff2 fs0 fc0 sc0 ls1 ws0\">Allows <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>manipulate th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>different scenes and menu p<span class=\"_ _0\"></span>ause<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y905 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y8c7 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y8c7 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8c7 ff3 fs0 fc4 sc0 ls1 ws0\">Window <span class=\"_ _0\"></span>sett<span class=\"_ _0\"></span>ing<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y906 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y906 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y906 ff3 fs0 fc4 sc0 ls1 ws10\">WIN<span class=\"_ _0\"></span>DOW_W<span class=\"_ _0\"></span>IDTH<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y3d7 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span>u<span class=\"_ _3\"></span>nsigned int <span class=\"fc0\">W<span class=\"_ _0\"></span>INDOW<span class=\"_ _0\"></span>_WIDT<span class=\"_ _0\"></span>H </span></span></div><div class=\"t m0 x1 hb y5fa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5fb ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5fc ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y364 ff2 fs0 fc0 sc0 ls1 ws0\">Set wi<span class=\"_ _0\"></span>ndow<span class=\"_ _3\"></span> w<span class=\"_ _0\"></span>idt<span class=\"_ _0\"></span>h. </div><div class=\"t m0 x1 hb y22e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y50f ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y50f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y50f ff3 fs0 fc4 sc0 ls1 ws10\">WIN<span class=\"_ _0\"></span>DOW_H<span class=\"_ _0\"></span>EIGHT<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y230 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y907 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span>u<span class=\"_ _3\"></span>nsigned int <span class=\"fc0\">W<span class=\"_ _0\"></span>INDOW<span class=\"_ _0\"></span>_HE<span class=\"_ _0\"></span>IGHT </span></span></div><div class=\"t m0 x7 hc y908 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y511 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y909 ff2 fs0 fc0 sc0 ls1 ws0\">Set wi<span class=\"_ _0\"></span>ndow<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>heig<span class=\"_ _0\"></span>ht. </div><div class=\"t m0 x1 hb y234 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y513 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y513 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y513 ff3 fs0 fc4 sc0 ls1 ws10\">VIE<span class=\"_ _0\"></span>W_WID<span class=\"_ _0\"></span>TH<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y236 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y90a ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>float <span class=\"fc0\">VIEW_WI<span class=\"_ _0\"></span>DTH </span></span></div><div class=\"t m0 x7 hc y14a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y24e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ab ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>view widt<span class=\"_ _0\"></span>h. </div><div class=\"t m0 x1 hb y23a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y90b ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y90b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y90b ff3 fs0 fc4 sc0 ls1 ws10\">VIE<span class=\"_ _0\"></span>W_HEI<span class=\"_ _0\"></span>GHT<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y23c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y8ff ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>float <span class=\"fc0\">VIEW_H<span class=\"_ _0\"></span>EIGHT </span></span></div><div class=\"t m0 x7 hc y90c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y222 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y90d ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>view heig<span class=\"_ _0\"></span>ht. </div></div><div class=\"c x7 y90e w33 h4c\"><div class=\"t m0 x0 hb y90f ff2 fs0 fc0 sc0 ls1 ws0\">Allows you <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> define parameters<span class=\"_ _3\"></span> </span>to<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>preconfigu<span class=\"_ _3\"></span>re these <span class=\"_ _0\"></span>parts <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the game: The <span class=\"_ _0\"></span>size<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the window <span class=\"_ _0\"></span>and the <span class=\"_ _0\"></span>view,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>The<span class=\"_ _0\"></span> </span></span></span></span></span></span></div><div class=\"t m0 x0 hb y910 ff2 fs0 fc0 sc0 ls1 ws0\">keyboard and mouse <span class=\"_ _0\"></span>keys <span class=\"ls1b ws11\">to</span> use <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> control the game, the game information (name, author,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>version),<span class=\"_ _3\"></span> path resource files </span></span></div><div class=\"t m0 x0 hb y728 ff2 fs0 fc0 sc0 ls1 ws0\">(sound, image, backup, <span class=\"_ _3\"></span>etc.) and Admob inf<span class=\"_ _3\"></span>ormation.<span class=\"_ _3\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y911 ff3 fs0 fc4 sc0 ls1 ws0\">enum <span class=\"_ _0\"></span>DisplayOption </div></div><div class=\"c x7 y90e w33 h4c\"><div class=\"t m0 x0 hc y912 ff3 fs0 fc5 sc0 ls1 ws0\">enum <span class=\"ff2 fc0\">DisplayOptio<span class=\"_ _3\"></span>n; </span></div></div><div class=\"c x7 y913 w34 h4d\"><div class=\"t m0 x0 hc y914 ff3 fs0 fc0 sc0 ls1 ws0\">En<span class=\"_ _0\"></span>umerat<span class=\"_ _0\"></span>or </div><div class=\"t m0 x0 hb y915 ff2 fs0 fc0 sc0 ls1 ws0\">RES<span class=\"_ _0\"></span>UME_<span class=\"_ _0\"></span>GAME </div><div class=\"t m0 x0 hb y916 ff2 fs0 fc0 sc0 ls1 ws0\">GAM<span class=\"_ _0\"></span>E_OPT<span class=\"_ _0\"></span>ION_R<span class=\"_ _0\"></span>ESTA<span class=\"_ _0\"></span>RT </div><div class=\"t m0 x0 hb y917 ff2 fs0 fc0 sc0 ls1 ws0\">QUIT<span class=\"_ _0\"></span>_GAM<span class=\"_ _0\"></span>E </div><div class=\"t m0 x0 h17 y918 ff2 fsa fc0 sc0 ls1 ws0\">INT<span class=\"_ _0\"></span>RO </div><div class=\"t m0 x0 hb y919 ff2 fs0 fc0 sc0 ls1 ws0\">RES<span class=\"_ _0\"></span>TART_<span class=\"_ _0\"></span>LEVE<span class=\"_ _0\"></span>L </div><div class=\"t m0 x0 hb y91a ff2 fs0 fc0 sc0 ls1 ws0\">NEX<span class=\"_ _0\"></span>T_LEV<span class=\"_ _0\"></span>EL </div><div class=\"t m0 x0 hb y91b ff2 fs0 fc0 sc0 ls1 ws0\">MAI<span class=\"_ _0\"></span>N_MEN<span class=\"_ _0\"></span>U </div><div class=\"t m0 x0 hb y91c ff2 fs0 fc0 sc0 ls1 ws0\">GAM<span class=\"_ _0\"></span>E_LEV<span class=\"_ _0\"></span>EL </div><div class=\"t m0 x0 hb y91d ff2 fs0 fc0 sc0 ls1 ws0\">GAM<span class=\"_ _0\"></span>E_OVE<span class=\"_ _0\"></span>R </div><div class=\"t m0 x0 hb y42e ff2 fs0 fc0 sc0 ls1 ws0\">GAM<span class=\"_ _0\"></span>E_END<span class=\"_ _0\"></span>_SCR<span class=\"_ _0\"></span>EEN </div></div><div class=\"c x2b y913 w35 h4e\"><div class=\"t m0 x0 hb y91e ff2 fs0 fc0 sc0 ls1 ws0\">When <span class=\"_ _0\"></span>playe<span class=\"_ _3\"></span>r <span class=\"_ _0\"></span>close pause men<span class=\"_ _0\"></span>u </div><div class=\"t m0 x0 hb y91f ff2 fs0 fc0 sc0 ls1 ws0\">Restart <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>scene with <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>restart option </div><div class=\"t m0 x0 hb y917 ff2 fs0 fc0 sc0 ls1 ws0\">When player use quit<span class=\"_ _3\"></span> option </div><div class=\"t m0 x0 h17 y920 ff2 fsa fc0 sc0 ls1 ws0\">Access the Introduction scene </div><div class=\"t m0 x0 hb y921 ff2 fs0 fc0 sc0 ls1 ws0\">Restart <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>scene <span class=\"_ _0\"></span>when <span class=\"_ _0\"></span>you<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>lose </div><div class=\"t m0 x0 hb y8e8 ff2 fs0 fc0 sc0 ls1 ws0\">Go to the next level<span class=\"_ _3\"></span> </div><div class=\"t m0 x0 hb y922 ff2 fs0 fc0 sc0 ls1 ws0\">Access <span class=\"_ _3\"></span>the<span class=\"_ _3\"></span> <span class=\"_ _3\"></span>Main <span class=\"_ _3\"></span>M<span class=\"_ _3\"></span>enu <span class=\"_ _3\"></span>sce<span class=\"_ _3\"></span>ne </div><div class=\"t m0 x0 hb y923 ff2 fs0 fc0 sc0 ls1 ws0\">Access the Game Lev<span class=\"_ _3\"></span>el scene </div><div class=\"t m0 x0 hb y924 ff2 fs0 fc0 sc0 ls1 ws0\">Access <span class=\"_ _b\"></span>the <span class=\"_ _b\"></span>Game <span class=\"_ _9\"></span>Over <span class=\"_ _b\"></span>scene </div><div class=\"t m0 x0 hb y61a ff2 fs0 fc0 sc0 ls57 ws45\">Go<span class=\"ls1 ws0\"> <span class=\"ls1b ws11\">to</span> the <span class=\"_ _0\"></span>End <span class=\"ls1f ws16\">of</span> Game scene </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf66\" class=\"pf w0 h0\" data-page-no=\"66\"><div class=\"pc pc66 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xc hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y117 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y117 ff3 fs0 fc4 sc0 ls1 ws10\">FP<span class=\"_ _0\"></span>S<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>float <span class=\"fc0\">FPS<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2ff ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b5 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>FPS (Frame Per Second) <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the g<span class=\"_ _0\"></span>ame. </span></span></div><div class=\"t m0 x1 hb y290 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y20a ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20a ff3 fs0 fc4 sc0 ls1 ws10\">WIN<span class=\"_ _0\"></span>DOW_S<span class=\"_ _0\"></span>ETTIN<span class=\"_ _0\"></span>GS<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"fc0\">is::WindowStyle W<span class=\"_ _0\"></span>INDOW<span class=\"_ _0\"></span>_SETT<span class=\"_ _0\"></span>INGS </span></span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y1e9 ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>the window st<span class=\"_ _0\"></span>yle. </div><div class=\"t m0 x1 hb y643 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20f ff3 fs0 fc4 sc0 ls1a\">3.</div><div class=\"t m3 xd hd y20f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20f ff3 fs0 fc4 sc0 ls1 ws0\">Parameter <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>validatio<span class=\"_ _3\"></span>n <span class=\"_ _0\"></span>butto<span class=\"_ _0\"></span>ns<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y308 ff3 fs0 fc4 sc0 ls1 ws10\">3.1</div><div class=\"t m3 x1d hd y308 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y308 ff3 fs0 fc4 sc0 ls1 ws10\">KEY<span class=\"_ _0\"></span>_VALID<span class=\"_ _0\"></span>ATI<span class=\"_ _0\"></span>ON_MOU<span class=\"_ _0\"></span>SE<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y309 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2bd ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Mouse::But<span class=\"_ _3\"></span>ton <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>VALI<span class=\"_ _0\"></span>DATIO<span class=\"_ _0\"></span>N_MOUS<span class=\"_ _0\"></span>E </span></div><div class=\"t m0 x1 hb y30a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y30b ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb yc6 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the b<span class=\"_ _0\"></span>utton that validates the <span class=\"_ _0\"></span>options<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>with th<span class=\"_ _3\"></span>e m<span class=\"_ _0\"></span>ouse<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y30d ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y377 ff3 fs0 fc4 sc0 ls1 ws10\">3.2</div><div class=\"t m3 x1d hd y377 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y377 ff3 fs0 fc4 sc0 ls1 ws10\">KEY<span class=\"_ _0\"></span>_VALID<span class=\"_ _0\"></span>ATI<span class=\"_ _0\"></span>ON_KEY<span class=\"_ _0\"></span>BOARD<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y29a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y30f ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>VALI<span class=\"_ _0\"></span>DATIO<span class=\"_ _0\"></span>N_KEY<span class=\"_ _0\"></span>BOARD </span></div><div class=\"t m0 x7 hc y925 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y926 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y405 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>key that validates the options <span class=\"_ _0\"></span>with the <span class=\"_ _0\"></span>keyb<span class=\"_ _0\"></span>oard. </div><div class=\"t m0 x1 hb y927 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y29d ff3 fs0 fc4 sc0 ls1 ws10\">3.3</div><div class=\"t m3 x1d hd y29d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y29d ff3 fs0 fc4 sc0 ls1 ws10\">KEY<span class=\"_ _0\"></span>_CAN<span class=\"_ _0\"></span>CEL<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y257 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5da ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>CANCE<span class=\"_ _0\"></span>L </span></div><div class=\"t m0 x7 hc y928 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y929 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y492 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the <span class=\"_ _0\"></span>key that cancels options <span class=\"_ _0\"></span>with the<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>keybo<span class=\"_ _0\"></span>ard. </div><div class=\"t m0 x1 hb y25b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y25c ff3 fs0 fc4 sc0 ls1a\">4.</div><div class=\"t m3 xd hd y25c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y25c ff3 fs0 fc4 sc0 ls1 ws0\">Keyboard <span class=\"ls95 ws7b\">key</span> s<span class=\"_ _0\"></span>etti<span class=\"_ _0\"></span>ng<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y2d5 ff3 fs0 fc4 sc0 ls1 ws10\">4.1</div><div class=\"t m3 x1d hd y2d5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2d5 ff3 fs0 fc4 sc0 ls1 ws0\">KEY<span class=\"_ _0\"></span>_A an<span class=\"_ _0\"></span>d KE<span class=\"_ _0\"></span>Y_B<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y92a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y92b ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>A </span></div><div class=\"t m0 x7 hc y453 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>B </span></div><div class=\"t m0 x7 hc y2d8 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y92c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y92d ff2 fs0 fc0 sc0 ls1 ws0\">Represents the A and B<span class=\"_ _3\"></span> button keys<span class=\"_ _3\"></span>. </div><div class=\"t m0 x1 hb y92e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y590 ff3 fs0 fc4 sc0 ls1 ws10\">4.2</div><div class=\"t m3 x1d hd y590 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y590 ff3 fs0 fc4 sc0 ls1 ws0\">KEY<span class=\"_ _0\"></span>_X a<span class=\"_ _0\"></span>nd KEY<span class=\"_ _0\"></span>_Y<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y458 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y459 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_X<span class=\"_ _0\"></span> </span></div><div class=\"t m0 x7 hc y45a ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>Y </span></div><div class=\"t m0 x7 hc y92f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y930 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y931 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the X a<span class=\"_ _3\"></span>nd Y button keys. </div><div class=\"t m0 x1 hb y932 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y933 ff3 fs0 fc4 sc0 ls1 ws10\">4.3</div><div class=\"t m3 x1d hd y933 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y933 ff3 fs0 fc4 sc0 ls1 ws10\">KEY<span class=\"_ _0\"></span>_LEFT<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y4e2 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3f ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>LEFT </span></div><div class=\"t m0 x7 hc y934 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x47 h9 y935 ff4 fs4 fc0 sc0 ls1 ws0\">10<span class=\"_ _0\"></span>3<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf67\" class=\"pf w0 h0\" data-page-no=\"67\"><div class=\"pc pc67 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the ke<span class=\"_ _0\"></span>y LE<span class=\"_ _0\"></span>FT. </div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">4.4</div><div class=\"t m3 x1d hd y1b2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">KEY<span class=\"_ _0\"></span>_RIGH<span class=\"_ _0\"></span>T<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y207 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>RIGH<span class=\"_ _0\"></span>T </span></div><div class=\"t m0 x1 hb y208 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff2 fs0 fc0 sc0 ls1 ws0\">Represents the ke<span class=\"_ _0\"></span>y RI<span class=\"_ _0\"></span>GHT. </div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2b5 ff3 fs0 fc4 sc0 ls1 ws10\">4.5</div><div class=\"t m3 x1d hd y2b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2b5 ff3 fs0 fc4 sc0 ls1 ws10\">KEY<span class=\"_ _0\"></span>_UP<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y66d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>UP </span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ea ff2 fs0 fc0 sc0 ls1 ws0\">Represents the ke<span class=\"_ _0\"></span>y U<span class=\"_ _0\"></span>P.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y241 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y242 ff3 fs0 fc4 sc0 ls1 ws10\">4.6</div><div class=\"t m3 x1d hd y242 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y242 ff3 fs0 fc4 sc0 ls1 ws10\">KEY<span class=\"_ _0\"></span>_DOWN<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y243 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _3\"></span>ey <span class=\"_ _0\"></span>KEY_<span class=\"_ _0\"></span>DOWN </span></div><div class=\"t m0 x1 hb y244 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y245 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y213 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the ke<span class=\"_ _0\"></span>y DOW<span class=\"_ _0\"></span>N<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y50d ff3 fs0 fc4 sc0 ls1a\">5.</div><div class=\"t m3 xd hd y50d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y50d ff3 fs0 fc4 sc0 ls1 ws0\">Default value <span class=\"_ _0\"></span>for SFML com<span class=\"_ _0\"></span>pone<span class=\"_ _0\"></span>nts<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y30f ff3 fs0 fc4 sc0 ls1 ws10\">5.1</div><div class=\"t m3 x1d hd y30f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y30f ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_<span class=\"_ _0\"></span>SFML_<span class=\"_ _0\"></span>TEXT_<span class=\"_ _0\"></span>SIZE<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y925 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc0\">DEFAU<span class=\"_ _0\"></span>LT_SF<span class=\"_ _0\"></span>ML_TE<span class=\"_ _0\"></span>XT_SI<span class=\"_ _0\"></span>ZE </span></span></div><div class=\"t m0 x1 hb y926 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y312 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y927 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y29d ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>defaul<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span>size <span class=\"ls1c ws12\">of</span> SFML text <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>cts. </div><div class=\"t m0 x1 hb y257 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y5da ff3 fs0 fc4 sc0 ls1 ws10\">5.2</div><div class=\"t m3 x1d hd y5da ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y5da ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_<span class=\"_ _0\"></span>SFML_<span class=\"_ _0\"></span>TEXT_<span class=\"_ _0\"></span>COLOR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y928 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::Color<span class=\"_ _3\"></span> &amp;D<span class=\"_ _0\"></span>EFAULT<span class=\"_ _0\"></span>_SF<span class=\"_ _0\"></span>ML_TEX<span class=\"_ _0\"></span>T_CO<span class=\"_ _0\"></span>LOR </span></span></div><div class=\"t m0 x1 hb y929 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y936 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y25b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y25c ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>default color <span class=\"ls25 ws1b\">for</span> SFML text <span class=\"_ _0\"></span>obje<span class=\"_ _0\"></span>cts. </div><div class=\"t m0 x1 hb y937 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y938 ff3 fs0 fc4 sc0 ls1 ws10\">5.3</div><div class=\"t m3 x1d hd y938 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y938 ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_<span class=\"_ _0\"></span>SFML_<span class=\"_ _0\"></span>SELE<span class=\"_ _0\"></span>CTED_T<span class=\"_ _0\"></span>EXT_C<span class=\"_ _0\"></span>OLOR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y939 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::Color<span class=\"_ _3\"></span> &amp;D<span class=\"_ _0\"></span>EFAULT<span class=\"_ _0\"></span>_SF<span class=\"_ _0\"></span>ML_SEL<span class=\"_ _0\"></span>ECTED<span class=\"_ _0\"></span>_TEXT_<span class=\"_ _0\"></span>COLO<span class=\"_ _0\"></span>R </span></span></div><div class=\"t m0 x1 hb y260 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y261 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y93a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y93b ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>default color <span class=\"ls1c ws12\">of</span> SFML text obje<span class=\"_ _0\"></span>cts when they are sel<span class=\"_ _0\"></span>ected<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y570 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y49b ff3 fs0 fc4 sc0 ls1 ws10\">5.4</div><div class=\"t m3 x1d hd y49b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y49b ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_M<span class=\"_ _0\"></span>SG_B<span class=\"_ _0\"></span>OX_TE<span class=\"_ _0\"></span>XT_SIZ<span class=\"_ _0\"></span>E<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y93c ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y5bd ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::Color<span class=\"_ _3\"></span> &amp;D<span class=\"_ _0\"></span>EFAULT<span class=\"_ _0\"></span>_MS<span class=\"_ _0\"></span>G_BOX_T<span class=\"_ _0\"></span>EXT_S<span class=\"_ _0\"></span>IZE </span></span></div><div class=\"t m0 x7 hc y10 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y93d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y93e ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>default size <span class=\"ls1c ws12\">of</span> SFML text <span class=\"_ _0\"></span>obj<span class=\"_ _3\"></span>ect <span class=\"_ _0\"></span>for the<span class=\"_ _3\"></span> dialog <span class=\"_ _0\"></span>bo<span class=\"_ _0\"></span>x. </div><div class=\"t m0 x1 hb y93f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y940 ff3 fs0 fc4 sc0 ls1 ws10\">5.5</div><div class=\"t m3 x1d hd y940 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y940 ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_M<span class=\"_ _0\"></span>SG_B<span class=\"_ _0\"></span>OX_BU<span class=\"_ _0\"></span>TTON_TE<span class=\"_ _0\"></span>XT_S<span class=\"_ _0\"></span>IZE<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y941 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::Color<span class=\"_ _3\"></span> &amp;D<span class=\"_ _0\"></span>EFAULT<span class=\"_ _0\"></span>_MS<span class=\"_ _0\"></span>G_BOX_<span class=\"_ _0\"></span>BUTTO<span class=\"_ _0\"></span>N_TEXT<span class=\"_ _0\"></span>_SIZ<span class=\"_ _0\"></span>E </span></span></div><div class=\"t m0 x1 h46 y853 ff2 fs4 fc0 sc0 ls96 ws0\"> <span class=\"ff4 ls1 v4\">10<span class=\"_ _0\"></span>4<span class=\"_ _0\"></span> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf68\" class=\"pf w0 h0\" data-page-no=\"68\"><div class=\"pc pc68 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1e2 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>default size <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>SFML text objects for the <span class=\"_ _0\"></span>dialog box button<span class=\"_ _0\"></span>s. </div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">5.6</div><div class=\"t m3 x1d hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_M<span class=\"_ _0\"></span>SG_B<span class=\"_ _0\"></span>OX_TE<span class=\"_ _0\"></span>XT_COLO<span class=\"_ _0\"></span>R<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::Color<span class=\"_ _3\"></span> &amp;D<span class=\"_ _0\"></span>EFAULT<span class=\"_ _0\"></span>_MS<span class=\"_ _0\"></span>G_BOX_T<span class=\"_ _0\"></span>EXT_<span class=\"_ _0\"></span>COLO<span class=\"_ _0\"></span>R<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2b5 ff2 fs0 fc0 sc0 ls1 ws0\">Define the <span class=\"_ _0\"></span>default color <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>SFML<span class=\"_ _3\"></span> te<span class=\"_ _0\"></span>xt objects for <span class=\"_ _0\"></span>the dialog bo<span class=\"_ _0\"></span>x.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">5.7</div><div class=\"t m3 x1d hd y20d ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20d ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_M<span class=\"_ _0\"></span>SG_B<span class=\"_ _0\"></span>OX_SE<span class=\"_ _0\"></span>LECTED<span class=\"_ _0\"></span>_TEX<span class=\"_ _0\"></span>T_COL<span class=\"_ _0\"></span>OR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::Color<span class=\"_ _3\"></span> &amp;D<span class=\"_ _0\"></span>EFAULT<span class=\"_ _0\"></span>_MS<span class=\"_ _0\"></span>G_BOX_<span class=\"_ _0\"></span>SELEC<span class=\"_ _0\"></span>TED_TE<span class=\"_ _0\"></span>XT_C<span class=\"_ _0\"></span>OLOR </span></span></div><div class=\"t m0 x1 hb y240 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y241 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y242 ff2 fs0 fc0 sc0 ls1 ws0\">Define the <span class=\"_ _0\"></span>default color <span class=\"ls1c ws12\">of<span class=\"_ _3\"></span></span> <span class=\"_ _0\"></span>SF<span class=\"_ _3\"></span>ML text <span class=\"_ _0\"></span>objects for the <span class=\"_ _0\"></span>dialog<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>box<span class=\"_ _3\"></span> when they<span class=\"_ _3\"></span> are <span class=\"_ _0\"></span>sele<span class=\"_ _0\"></span>cted<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y243 ff3 fs0 fc4 sc0 ls1 ws10\">5.8</div><div class=\"t m3 x1d hd y243 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y243 ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_<span class=\"_ _0\"></span>RPG_D<span class=\"_ _0\"></span>IALO<span class=\"_ _0\"></span>G_TEXT<span class=\"_ _0\"></span>_SIZE<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y244 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y245 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::Color<span class=\"_ _3\"></span> &amp;D<span class=\"_ _0\"></span>EFAULT<span class=\"_ _0\"></span>_RP<span class=\"_ _0\"></span>G_DIA<span class=\"_ _0\"></span>LOG_T<span class=\"_ _0\"></span>EXT_S<span class=\"_ _0\"></span>IZE </span></span></div><div class=\"t m0 x1 hb y3a3 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y246 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3a4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y247 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>defaul<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span>size <span class=\"_ _3\"></span><span class=\"ls1c ws12\">of</span> SFML <span class=\"_ _0\"></span>t<span class=\"_ _3\"></span>ext object <span class=\"ls25 ws1b\">for</span> <span class=\"_ _0\"></span>the RPG dialog bo<span class=\"_ _0\"></span>x.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y3a5 ff3 fs0 fc4 sc0 ls1 ws10\">5.9</div><div class=\"t m3 x1d hd y3a5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y3a5 ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_<span class=\"_ _0\"></span>RPG_D<span class=\"_ _0\"></span>IALO<span class=\"_ _0\"></span>G_BUTTON<span class=\"_ _0\"></span>_TEXT<span class=\"_ _0\"></span>_SIZE<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3a6 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y390 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::Color<span class=\"_ _3\"></span> &amp;D<span class=\"_ _0\"></span>EFAULT<span class=\"_ _0\"></span>_RP<span class=\"_ _0\"></span>G_DIA<span class=\"_ _0\"></span>LOG_BU<span class=\"_ _0\"></span>TTON<span class=\"_ _0\"></span>_TEXT<span class=\"_ _0\"></span>_SIZE </span></span></div><div class=\"t m0 x1 hb y3a7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y391 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3a8 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y3a9 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>defaul<span class=\"_ _3\"></span>t <span class=\"_ _0\"></span>size <span class=\"_ _3\"></span><span class=\"ls1c ws12\">of</span> SFML <span class=\"_ _0\"></span>t<span class=\"_ _3\"></span>ext object <span class=\"ls25 ws1b\">for</span> <span class=\"_ _0\"></span>the RPG dialog box butt<span class=\"_ _0\"></span>on. </div><div class=\"t m0 x1 hb y3aa ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y8f2 ff3 fs0 fc4 sc0 ls1 ws10\">5.10</div><div class=\"t m3 x21 hd y8f2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y8f2 ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_<span class=\"_ _0\"></span>RPG_D<span class=\"_ _0\"></span>IALO<span class=\"_ _0\"></span>G_TEXT<span class=\"_ _0\"></span>_COL<span class=\"_ _0\"></span>OR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y4a6 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">sf::Colo<span class=\"_ _3\"></span>r <span class=\"_ _0\"></span>&amp;DEFAUL<span class=\"_ _3\"></span>T_RPG_DIALOG_<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>T<span class=\"_ _0\"></span>EXT_COL<span class=\"_ _0\"></span>OR </span></span></div><div class=\"t m0 x1 hb y3ab ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y56a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y733 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y638 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>default color <span class=\"ls1c ws12\">of</span> SFML text obje<span class=\"_ _0\"></span>cts <span class=\"ls25 ws1b\">for</span> the RPG <span class=\"_ _0\"></span>dialog<span class=\"_ _3\"></span> b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y6a3 ff3 fs0 fc4 sc0 ls1 ws10\">5.11</div><div class=\"t m3 x21 hd y6a3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y6a3 ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_<span class=\"_ _0\"></span>RPG_D<span class=\"_ _0\"></span>IALO<span class=\"_ _0\"></span>G_SELEC<span class=\"_ _0\"></span>TED_<span class=\"_ _0\"></span>TEXT_<span class=\"_ _0\"></span>COLOR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y942 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6a4 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::Color<span class=\"_ _3\"></span> &amp;D<span class=\"_ _0\"></span>EFAULT<span class=\"_ _0\"></span>_RP<span class=\"_ _0\"></span>G_DIA<span class=\"_ _0\"></span>LOG_S<span class=\"_ _0\"></span>ELECT<span class=\"_ _0\"></span>ED_TEX<span class=\"_ _0\"></span>T_CO<span class=\"_ _0\"></span>LOR </span></span></div><div class=\"t m0 x1 hb y943 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6a5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y399 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y39a ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>default color <span class=\"ls1c ws12\">of</span> SFML text ob<span class=\"_ _0\"></span>jects (button Skip) for <span class=\"_ _0\"></span>the RPG dialog b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y200 ff3 fs0 fc4 sc0 ls1 ws10\">5.12</div><div class=\"t m3 x21 hd y200 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y200 ff3 fs0 fc4 sc0 ls1 ws10\">DE<span class=\"_ _0\"></span>FAULT_<span class=\"_ _0\"></span>BUTTON<span class=\"_ _0\"></span>_TEXT<span class=\"_ _0\"></span>_COLOR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y8fd ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6a6 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">sf::C<span class=\"_ _3\"></span>olor &amp; <span class=\"_ _0\"></span>DEFAUL<span class=\"_ _0\"></span>T_BUT<span class=\"_ _0\"></span>TON_T<span class=\"_ _0\"></span>EXT_<span class=\"_ _0\"></span>COLOR </span></span></div><div class=\"t m0 x1 hb y8fe ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6a7 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y39f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb ya9 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>default color <span class=\"ls1c ws12\">of</span> button <span class=\"_ _0\"></span>tex<span class=\"_ _0\"></span>t. </div><div class=\"t m2 xc hc y4b6 ff3 fs0 fc4 sc0 ls1a\">6.</div><div class=\"t m3 xd hd y4b6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y4b6 ff3 fs0 fc4 sc0 ls1 ws0\">Game <span class=\"_ _0\"></span>infor<span class=\"_ _0\"></span>mation<span class=\"_ _0\"></span><span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y941 ff3 fs0 fc4 sc0 ls1 ws10\">5.1</div><div class=\"t m3 x1d hd y941 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y941 ff3 fs0 fc4 sc0 ls1 ws10\">MAJ<span class=\"_ _0\"></span>OR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 h6 y853 ff3 fs4 fc0 sc0 ls96 ws0\"> <span class=\"ff4 ls1 v4\">10<span class=\"_ _0\"></span>5<span class=\"_ _0\"></span> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf69\" class=\"pf w0 h0\" data-page-no=\"69\"><div class=\"pc pc69 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5\">std::string<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 fc0\">MAJ<span class=\"_ _0\"></span>OR </span></span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4bb ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>major ver<span class=\"_ _0\"></span>sion<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">5.2</div><div class=\"t m3 x1d hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">MIN<span class=\"_ _0\"></span>OR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5\">std::string<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 fc0\">MIN<span class=\"_ _0\"></span>OR </span></span></span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1e8 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>minor ver<span class=\"_ _0\"></span>sion<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">5.3</div><div class=\"t m3 x1d hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>GameV<span class=\"_ _0\"></span>ersion<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20f ff3 fs0 fc5 sc0 ls1 ws0\">inline <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc0\">getGa<span class=\"_ _0\"></span>meVe<span class=\"_ _0\"></span>rsion<span class=\"_ _0\"></span>() </span></div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y211 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">version <span class=\"_ _0\"></span><span class=\"ls1f ws16\">of<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the<span class=\"_ _3\"></span> g<span class=\"_ _0\"></span>am<span class=\"_ _0\"></span>e.<span class=\"_ _0\"></span> </span></span></span></div><div class=\"t m0 x1 hb y212 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y245 ff3 fs0 fc4 sc0 ls1 ws10\">5.4</div><div class=\"t m3 x1d hd y245 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y245 ff3 fs0 fc4 sc0 ls1 ws10\">GAME<span class=\"_ _0\"></span>_NAME<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3a3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y246 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::wstrin<span class=\"_ _3\"></span>g <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">GAME_<span class=\"_ _0\"></span>NAME </span></span></div><div class=\"t m0 x1 hb y3a4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y247 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y731 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y732 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>name <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>gam<span class=\"_ _0\"></span>e. </div><div class=\"t m2 xc hc y390 ff3 fs0 fc4 sc0 ls1 ws10\">5.5</div><div class=\"t m3 x1d hd y390 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y390 ff3 fs0 fc4 sc0 ls1 ws10\">GAME<span class=\"_ _0\"></span>_AUT<span class=\"_ _0\"></span>HOR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3a7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y391 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::wstrin<span class=\"_ _3\"></span>g <span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">GAME_<span class=\"_ _0\"></span>AUTHO<span class=\"_ _0\"></span>R </span></span></div><div class=\"t m0 x1 hb y3a8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3a9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y392 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y2ea ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>name <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>author<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1fa ff3 fs0 fc4 sc0 ls1a\">7.</div><div class=\"t m3 xd hd y1fa ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1fa ff3 fs0 fc4 sc0 ls1 ws0\">Admob setting </div><div class=\"t m0 x7 hc y56a ff3 fs0 fc5 sc0 ls1 ws0\">namespace <span class=\"_ _0\"></span><span class=\"ff2 fc0\">AdmobConfig;<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hb y395 ff2 fs0 fc0 sc0 ls1 ws0\">Allows you <span class=\"ls1b ws11\">to</span> define <span class=\"_ _0\"></span>Admo<span class=\"_ _3\"></span>b information so that ads can <span class=\"ls26 ws1c\">be</span> displayed <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls1 ws0\"> the game. <span class=\"ff6\">This information <span class=\"ls3c ws2f\">is</span> provided <span class=\"ls82 ws6d\">on</span> the </span></span></span></div><div class=\"t m0 x7 hb y495 ff6 fs0 fc0 sc0 ls1 ws0\">Google Admob platform!<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y939 ff3 fs0 fc4 sc0 ls1 ws10\">7.1</div><div class=\"t m3 x1d hd y939 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y939 ff3 fs0 fc4 sc0 ls97 ws7c\">Ad<span class=\"ls1 ws0\"> <span class=\"ls98 ws7d\">Id</span><span class=\"fc0\"> </span></span></div><div class=\"t m2 xc hc y944 ff3 fs0 fc4 sc0 ls1 ws10\">7.1.1</div><div class=\"t m3 x1f hd y944 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y944 ff3 fs0 fc4 sc0 ls1 ws0\">kA<span class=\"_ _0\"></span>dMobA<span class=\"_ _0\"></span>ppID </div><div class=\"t m0 x7 hc y945 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">const<span class=\"_ _3\"></span> char* <span class=\"fc0\">kA<span class=\"_ _3\"></span>dMobAppID </span></span></div><div class=\"t m0 x7 hc y92e ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y946 ff2 fs0 fc0 sc0 ls1 ws0\">Admob <span class=\"_ _0\"></span>application <span class=\"_ _0\"></span>code. </div><div class=\"t m2 xc hc y947 ff3 fs0 fc4 sc0 ls1 ws10\">7.1.2</div><div class=\"t m3 x1f hd y947 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y947 ff3 fs0 fc4 sc0 ls1 ws0\">kBa<span class=\"_ _0\"></span>nnerA<span class=\"_ _0\"></span>dUnit </div><div class=\"t m0 x7 hc y92f ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">const char*<span class=\"_ _3\"></span> <span class=\"fc0\">kBannerAdUnit </span></span></div><div class=\"t m0 x7 hc y931 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y948 ff2 fs0 fc0 sc0 ls1 ws0\">Banner <span class=\"_ _0\"></span>code. </div><div class=\"t m2 xc hc y594 ff3 fs0 fc4 sc0 ls1 ws10\">7.1.3</div><div class=\"t m3 x1f hd y594 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y594 ff3 fs0 fc4 sc0 ls1 ws10\">kRew<span class=\"_ _0\"></span>arde<span class=\"_ _0\"></span>dVideo<span class=\"_ _0\"></span>AdUni<span class=\"_ _0\"></span>t<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x47 h9 y4a1 ff4 fs4 fc0 sc0 ls1 ws0\">10<span class=\"_ _0\"></span>6<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6a\" class=\"pf w0 h0\" data-page-no=\"6a\"><div class=\"pc pc6a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span><span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span>cha<span class=\"_ _3\"></span>r* <span class=\"fc0\">kR<span class=\"_ _0\"></span>ewarded<span class=\"_ _0\"></span>Vide<span class=\"_ _0\"></span>oAd<span class=\"_ _0\"></span>Unit </span></span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4bb ff2 fs0 fc0 sc0 ls1 ws0\">Reward <span class=\"_ _0\"></span>video co<span class=\"_ _0\"></span>de. </div><div class=\"t m2 xc hc y1b5 ff3 fs0 fc4 sc0 ls1 ws10\">7.2</div><div class=\"t m3 x1d hd y1b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b5 ff3 fs0 fc4 sc0 ls1 ws0\">Banner <span class=\"_ _0\"></span>si<span class=\"_ _0\"></span>ze<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y325 ff3 fs0 fc4 sc0 ls1 ws10\">7.2.1</div><div class=\"t m3 x1f hd y325 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y325 ff3 fs0 fc4 sc0 ls1 ws0\">kBa<span class=\"_ _0\"></span>nnerW<span class=\"_ _0\"></span>idth </div><div class=\"t m0 x7 hc y301 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">const int <span class=\"fc0\">kBa<span class=\"_ _3\"></span>nnerWidth </span></span></div><div class=\"t m0 x7 hc y375 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y328 ff2 fs0 fc0 sc0 ls1 ws0\">Set the width <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the <span class=\"ls23 ws1a\">ad</span> b<span class=\"_ _0\"></span>anner<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y3f6 ff3 fs0 fc4 sc0 ls1 ws10\">7.2.2</div><div class=\"t m3 x1f hd y3f6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y3f6 ff3 fs0 fc4 sc0 ls1 ws0\">kBa<span class=\"_ _0\"></span>nnerH<span class=\"_ _0\"></span>eight<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y308 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">const int <span class=\"fc0\">kBa<span class=\"_ _3\"></span>nnerHeight </span></span></div><div class=\"t m0 x7 hc y2bd ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y8a7 ff2 fs0 fc0 sc0 ls1 ws0\">Set the <span class=\"_ _0\"></span>height <span class=\"ls1f ws16\">of</span> the <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">ad<span class=\"ls1 ws0\"> b<span class=\"_ _0\"></span>anner. </span></span></div><div class=\"t m2 xc hc y8a8 ff3 fs0 fc4 sc0 ls1 ws10\">7.3</div><div class=\"t m3 x1d hd y8a8 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8a8 ff3 fs0 fc4 sc0 ls1 ws0\">Target <span class=\"_ _0\"></span>audie<span class=\"_ _0\"></span>nce<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y2c6 ff3 fs0 fc4 sc0 ls1 ws10\">7.3.1</div><div class=\"t m3 x1f hd y2c6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y2c6 ff3 fs0 fc4 sc0 ls1 ws0\">kB<span class=\"_ _0\"></span>irthday<span class=\"_ _0\"></span>Day </div><div class=\"t m0 x7 hc y2c8 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">const int <span class=\"fc0\">kBi<span class=\"_ _3\"></span>rthdayDay </span></span></div><div class=\"t m0 x7 hc y2ca ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y949 ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>users&apos; birth d<span class=\"_ _0\"></span>ay<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y589 ff3 fs0 fc4 sc0 ls1 ws10\">7.3.2</div><div class=\"t m3 x1f hd y589 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y589 ff3 fs0 fc4 sc0 ls1 ws0\">kB<span class=\"_ _0\"></span>irthday<span class=\"_ _0\"></span>Mont<span class=\"_ _0\"></span>h </div><div class=\"t m0 x7 hc y2cf ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">const int <span class=\"fc0\">kBi<span class=\"_ _3\"></span>rthdayMonth </span></span></div><div class=\"t m0 x7 hc y2d1 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y94a ff2 fs0 fc0 sc0 ls1 ws0\">Set <span class=\"_ _0\"></span>users&apos; birth m<span class=\"_ _0\"></span>onth<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y94b ff3 fs0 fc4 sc0 ls1 ws10\">7.3.3</div><div class=\"t m3 x1f hd y94b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y94b ff3 fs0 fc4 sc0 ls1 ws0\">kB<span class=\"_ _0\"></span>irthday<span class=\"_ _0\"></span>Year<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y94c ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"ff2 fc9\">const int <span class=\"fc0\">kBi<span class=\"_ _3\"></span>rthdayYear </span></span></div><div class=\"t m0 x7 hc y94d ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y2d7 ff2 fs0 fc0 sc0 ls1 ws0\">Define <span class=\"_ _0\"></span>us<span class=\"_ _3\"></span>ers&apos; <span class=\"_ _0\"></span>year <span class=\"ls1f ws16\">of</span> <span class=\"_ _0\"></span>bir<span class=\"_ _0\"></span>th. </div><div class=\"t m2 xc hc y558 ff3 fs0 fc4 sc0 ls1 ws10\">7.3.4</div><div class=\"t m3 x1f hd y558 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y558 ff3 fs0 fc4 sc0 ls1 ws0\">kKe<span class=\"_ _0\"></span>ywor<span class=\"_ _0\"></span>ds </div><div class=\"t m0 x7 hc y94e ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _2\"></span><span class=\"ff2 fc9\">c<span class=\"_ _3\"></span>onst <span class=\"_ _0\"></span>char<span class=\"fc0\">* <span class=\"_ _0\"></span>kKeywords[] </span></span></div><div class=\"t m0 x7 hc y946 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y947 ff2 fs0 fc0 sc0 ls1 ws0\">Keywords <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> use <span class=\"_ _0\"></span>when requesting <span class=\"ls23 ws1a\">an<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> a<span class=\"_ _0\"></span>d.<span class=\"_ _0\"></span> </span></span></span></span></div><div class=\"t m2 xc hc y94f ff3 fs0 fc4 sc0 ls1a\">8.</div><div class=\"t m3 xd hd y94f ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y94f ff3 fs0 fc4 sc0 ls1 ws0\">Path <span class=\"ls42 ws34\">of</span> <span class=\"_ _0\"></span>the resource fi<span class=\"_ _0\"></span>le<span class=\"_ _0\"></span>s<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y765 ff3 fs0 fc4 sc0 ls1 ws10\">8.1</div><div class=\"t m3 x1d hd y765 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y765 ff3 fs0 fc4 sc0 ls1 ws10\">ASS<span class=\"_ _0\"></span>ETS_D<span class=\"_ _0\"></span>IR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y950 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y951 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">ASSET<span class=\"_ _0\"></span>S_DI<span class=\"_ _0\"></span>R<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x1 hb y768 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y952 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x47 h9 y225 ff4 fs4 fc0 sc0 ls1 ws0\">10<span class=\"_ _0\"></span>7<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6b\" class=\"pf w0 h0\" data-page-no=\"6b\"><div class=\"pc pc6b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4DAAAijuQmESmsFQ5hAjGEGFTtItHojWOGfSKnVSt7rrr3uAwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb39XEAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+vrhSJJ0W1WXKbnG/VyXd99z25QpcRkAAMCPPM7/GvW870bHAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Root <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>resource fi<span class=\"_ _0\"></span>les<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">8.2</div><div class=\"t m3 x1d hd y1b2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">GUI<span class=\"_ _0\"></span>_DIR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y2e4 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">GUI_D<span class=\"_ _0\"></span>IR </span></span></div><div class=\"t m0 x1 hb y2ff ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>resource files that serve <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> a <span class=\"_ _0\"></span>graphical<span class=\"_ _3\"></span> inte<span class=\"_ _0\"></span>rface<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y2b5 ff3 fs0 fc4 sc0 ls1 ws10\">8.3</div><div class=\"t m3 x1d hd y2b5 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2b5 ff3 fs0 fc4 sc0 ls1 ws10\">FON<span class=\"_ _0\"></span>T_DIR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20d ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">FONT_<span class=\"_ _0\"></span>DIR </span></span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y240 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ea ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>resource files that serve <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>fo<span class=\"_ _0\"></span>nt<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">8.4</div><div class=\"t m3 x1d hd y227 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">SPR<span class=\"_ _0\"></span>ITES_<span class=\"_ _0\"></span>DIR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y211 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">SPRIT<span class=\"_ _0\"></span>ES_DI<span class=\"_ _0\"></span>R </span></span></div><div class=\"t m0 x1 hb y212 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y245 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y213 ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>resource files that serve <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>Spr<span class=\"_ _0\"></span>ite. </div><div class=\"t m0 x1 hb y3a4 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y247 ff3 fs0 fc4 sc0 ls1 ws10\">8.5</div><div class=\"t m3 x1d hd y247 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y247 ff3 fs0 fc4 sc0 ls1 ws10\">TIL<span class=\"_ _0\"></span>ES_D<span class=\"_ _0\"></span>IR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y3a5 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">TIL<span class=\"_ _0\"></span>ES_DI<span class=\"_ _0\"></span>R </span></span></div><div class=\"t m0 x1 hb y3a6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y390 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y217 ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>resource files that serve <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">as<span class=\"ls1 ws0\"> tiles <span class=\"_ _0\"></span>and <span class=\"_ _3\"></span>bac<span class=\"_ _0\"></span>kground<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y3a8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y3a9 ff3 fs0 fc4 sc0 ls1 ws10\">8.6</div><div class=\"t m3 x1d hd y3a9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y3a9 ff3 fs0 fc4 sc0 ls1 ws10\">SFX<span class=\"_ _0\"></span>_DIR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3aa ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1f9 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">SFX_D<span class=\"_ _0\"></span>IR </span></span></div><div class=\"t m0 x7 hc y1fa ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y393 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb ya1 ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>resource files that serve <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>S<span class=\"_ _0\"></span>FX.<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y733 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y638 ff3 fs0 fc4 sc0 ls1 ws10\">8.7</div><div class=\"t m3 x1d hd y638 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y638 ff3 fs0 fc4 sc0 ls1 ws10\">MU<span class=\"_ _0\"></span>SIC_DI<span class=\"_ _0\"></span>R<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y6a3 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">MUSIC<span class=\"_ _0\"></span>_DIR </span></span></div><div class=\"t m0 x1 hb y942 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6a4 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y37f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y398 ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>resource files that serve <span class=\"ls23 ws1a\">as</span> <span class=\"_ _0\"></span>mu<span class=\"_ _0\"></span>sic. </div><div class=\"t m0 x1 hb y953 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y63e ff3 fs0 fc4 sc0 ls1 ws10\">8.8</div><div class=\"t m3 x1d hd y63e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y63e ff3 fs0 fc4 sc0 ls1 ws10\">TMX<span class=\"_ _0\"></span>_RSC<span class=\"_ _0\"></span>_DIR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y200 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">TMX_R<span class=\"_ _0\"></span>SC_D<span class=\"_ _0\"></span>IR </span></span></div><div class=\"t m0 x1 hb y8fd ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y6a6 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8fe ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y6a7 ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the TMX Loader and Lite <span class=\"_ _0\"></span>library<span class=\"_ _3\"></span> resource f<span class=\"_ _0\"></span>iles<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y954 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y574 ff3 fs0 fc4 sc0 ls1a\">9.</div><div class=\"t m3 xd hd y574 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y574 ff3 fs0 fc4 sc0 ls1 ws0\">Game package name (<span class=\"_ _3\"></span>Mobile) </div><div class=\"t m0 x7 hc y4b6 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"_ _0\"></span><span class=\"ff2 fc9\">const <span class=\"_ _0\"></span><span class=\"fc0\">PACKAGE_NAME<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x7 hc y3a1 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x47 h9 y3a2 ff4 fs4 fc0 sc0 ls1 ws0\">10<span class=\"_ _0\"></span>8<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6c\" class=\"pf w0 h0\" data-page-no=\"6c\"><div class=\"pc pc6c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdPWhTUQCG4XNMCCEOHQyIk4NjdHRrdRIHwcFBHA06CCIOgopLKU5aqIiIbrq4iEMotoMOHSzYsQXBTv6QoYZUgkVLCamng1A6CtZbPX2e8W734w55uSdJTCkFAAAAMrXHBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqMwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+EwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+kwAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+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qg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAACvxB5AAAAF7SURBVKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAXqm+ttuSJM1SlNeQHP26z9Ozz7GuriFxMgAAgA+5AaUjf22F/c9VAAAAAElFTkSuQmCC\"/><div class=\"c x48 y114 w36 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls1 ws0\">10<span class=\"_ _0\"></span>9<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y955 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Name <span class=\"ls1f ws16\">of<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>gam<span class=\"_ _3\"></span>e package. Represents the place <span class=\"_ _0\"></span>wh<span class=\"_ _3\"></span>ere your <span class=\"_ _0\"></span>data will be saved <span class=\"_ _0\"></span><span class=\"ls1f ws16\">on<span class=\"ls1 ws0\"> Mobile. </span></span></span></span></div><div class=\"t m0 x7 hc y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">You must apply this nam<span class=\"_ _3\"></span>e for the <span class=\"_ _3\"></span><span class=\"ff3\">applicationId </span>i<span class=\"_ _3\"></span>n the <span class=\"ff3\">b<span class=\"_ _3\"></span>uild.gradle </span>file<span class=\"_ _3\"></span> </div><div class=\"t m2 xc hc y2e4 ff3 fs0 fc4 sc0 ls1a\">10.</div><div class=\"t m3 x1d hd y2e4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y2e4 ff3 fs0 fc4 sc0 ls1 ws0\">Backup file <span class=\"_ _0\"></span>pa<span class=\"_ _0\"></span>th<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y324 ff3 fs0 fc4 sc0 ls1 ws10\">10.1</div><div class=\"t m3 x21 hd y324 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y324 ff3 fs0 fc4 sc0 ls1 ws10\">DAT<span class=\"_ _0\"></span>A_PA<span class=\"_ _0\"></span>RENT_D<span class=\"_ _0\"></span>IR<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y956 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y9c ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">DATA_P<span class=\"_ _0\"></span>AREN<span class=\"_ _0\"></span>T_DIR </span></span></div><div class=\"t m0 x1 hb y373 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y327 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y302 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y303 ff2 fs0 fc0 sc0 ls1 ws0\">Root <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>game datas file<span class=\"_ _0\"></span>s. </div><div class=\"t m2 xc hc y3f3 ff3 fs0 fc4 sc0 ls1 ws10\">10.2</div><div class=\"t m3 x21 hd y3f3 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y3f3 ff3 fs0 fc4 sc0 ls1 ws10\">GAME<span class=\"_ _0\"></span>_DATA<span class=\"_ _0\"></span>_FI<span class=\"_ _0\"></span>LE<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y305 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y3f6 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">GAME_<span class=\"_ _0\"></span>DATA<span class=\"_ _0\"></span>_FIL<span class=\"_ _0\"></span>E<span class=\"_ _3\"></span> </span></span></div><div class=\"t m0 x1 hb y470 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y376 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5d4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y3fa ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls1b ws11\">to</span> the <span class=\"_ _0\"></span>game save fi<span class=\"_ _0\"></span>le. </div><div class=\"t m0 x1 hb y5d5 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y3fd ff3 fs0 fc4 sc0 ls1 ws10\">10.3</div><div class=\"t m3 x21 hd y3fd ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y3fd ff3 fs0 fc4 sc0 ls1 ws10\">CON<span class=\"_ _0\"></span>FIG_<span class=\"_ _0\"></span>FILE<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc yc6 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">CONFI<span class=\"_ _0\"></span>G_FI<span class=\"_ _0\"></span>LE </span></span></div><div class=\"t m0 x1 hb y5d6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y30e ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y957 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y402 ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>gam<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>config<span class=\"_ _3\"></span>uration fi<span class=\"_ _0\"></span>le<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y925 ff3 fs0 fc4 sc0 ls1 ws10\">10.4</div><div class=\"t m3 x21 hd y925 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y925 ff3 fs0 fc4 sc0 ls1 ws10\">GAME<span class=\"_ _0\"></span>_PAD<span class=\"_ _0\"></span>_FIL<span class=\"_ _0\"></span>E<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y926 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y405 ff3 fs0 fc5 sc0 ls1 ws0\">static <span class=\"_ _0\"></span>std::string <span class=\"ff2 fc9\">co<span class=\"_ _3\"></span>nst <span class=\"_ _0\"></span><span class=\"fc0\">GAME_<span class=\"_ _0\"></span>PAD_<span class=\"_ _0\"></span>FILE </span></span></div><div class=\"t m0 x1 hb y29c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y8ab ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5d9 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb yce ff2 fs0 fc0 sc0 ls1 ws0\">Path <span class=\"ls25 ws1b\">for</span> <span class=\"_ _0\"></span>the configuration<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>fil<span class=\"_ _3\"></span>e <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the Virtual Game Pad <span class=\"_ _0\"></span><span class=\"ls1c ws12\">on<span class=\"ls1 ws0\"> Mobile<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y29e ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y29f ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y492 ff6 fs0 fc3 sc0 ls1 ws10\">Act<span class=\"_ _0\"></span>ivit<span class=\"_ _0\"></span>y<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 h21 y958 ff6 fsc fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y959 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y41e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y41f ff2 fs0 fc0 sc0 ls1 ws0\">Allows you <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> launch the <span class=\"_ _0\"></span>different<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>gam<span class=\"_ _3\"></span>e scenes. Another special feature <span class=\"ls1c ws12\">of</span> this <span class=\"_ _0\"></span>class<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>that <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span>links the engine <span class=\"_ _0\"></span>scenes<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 hb y95a ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y95b ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y95b ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y95b ff3 fs0 fc4 sc0 ls1 ws0\">Elements <span class=\"ls42 ws34\">of</span> Ga<span class=\"_ _0\"></span>meAct<span class=\"_ _0\"></span>ivity<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y95c ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y95c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y95c ff3 fs0 fc4 sc0 ls1 ws0\">Game<span class=\"_ _0\"></span>Activ<span class=\"_ _0\"></span>ity </div><div class=\"t m0 x7 hb y3a ff2 fs0 fc0 sc0 ls1 ws0\">Gam<span class=\"_ _0\"></span>eActi<span class=\"_ _0\"></span>vity<span class=\"_ _0\"></span>(GameS<span class=\"_ _0\"></span>ystem<span class=\"_ _0\"></span>Exten<span class=\"_ _0\"></span>ded &amp;<span class=\"_ _0\"></span>gameS<span class=\"_ _0\"></span>ysExt<span class=\"_ _0\"></span>) </div><div class=\"t m0 x7 hc y384 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y7d8 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>constructor, <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span>takes as parameter the game system manager <span class=\"ff6\">(click <span class=\"_ _0\"></span>here for <span class=\"_ _0\"></span>mor<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>informa<span class=\"_ _3\"></span>tion: <span class=\"fc7 ws10\">1<span class=\"_ _0\"></span><span class=\"fc0 ls99 ws7e\">).<span class=\"ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y575 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y6c ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y6c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6c ff3 fs0 fc4 sc0 ls1 ws10\">m_ga<span class=\"_ _0\"></span>meSc<span class=\"_ _0\"></span>ene<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x7 y95d w9 h22\"><div class=\"t m0 x0 hb y95e ff6 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y37e ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameActivity </div></div><div class=\"c x7 y95d w9 h22\"><div class=\"t m0 x0 hc y95f ff3 fs0 fc5 sc0 ls1 ws0\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hb y960 ff2 fs0 fc0 sc0 ls1 ws0\">GameActivity;<span class=\"_ _3\"></span> </div></div><div class=\"c x7 y95d w9 h22\"><div class=\"t m0 x0 h17 y38c ff9 fsa fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws59\">app_<span class=\"_ _0\"></span>src<span class=\"_ _0\"></span>/acti<span class=\"_ _0\"></span>vity<span class=\"_ _0\"></span>/Game<span class=\"_ _0\"></span>Acti<span class=\"_ _0\"></span>vity<span class=\"_ _0\"></span>.h<span class=\"fc0 ws0\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6d\" class=\"pf w0 h0\" data-page-no=\"6d\"><div class=\"pc pc6d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdb2xV5R3A8ae7XVfbDlqhVIIgFBNgpNDAUMzqCCwLZsSGDGciY84mmuiQoW7OLXEBh1nG2DROcbzQoEuJkZBoqjXoYpeSRtA6hquEMvlTYFutba3t2u6m6cndi5PdNA6JzvaWXj6fV+c8tyfN/aUv+s295zk5qVQqAAAAkKW+YAQAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4jAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1GQEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8IAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9RgAAAKD6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VB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAwH9vUTabNQUAAID/K/f6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAADmqewf7qk/FkII4fbni1b07gyh86HX336u9a/zj/atjvfuNC8AAIB55XfH4MKQ7JM2jAAAAABJRU5ErkJggg==\"/><div class=\"c x48 y114 w36 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls1 ws0\">11<span class=\"_ _0\"></span>0<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y955 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fc5 sc0 ls1 ws10\">st<span class=\"_ _0\"></span>d::s<span class=\"_ _0\"></span>hared_<span class=\"_ _0\"></span>ptr<span class=\"ff2 fc0 ls24\">&lt;</span>i<span class=\"_ _0\"></span>s::<span class=\"ff2 fc0 ws0\">Gam<span class=\"_ _0\"></span>eDisp<span class=\"_ _0\"></span>lay&gt; <span class=\"_ _e\"> </span>m_g<span class=\"_ _0\"></span>ameSce<span class=\"_ _0\"></span>ne; </span></div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b2 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4bb ff2 fs0 fc0 sc0 ls1 ws0\">Instance <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the scene that will <span class=\"ls26 ws1c\">be</span> u<span class=\"_ _0\"></span>se<span class=\"_ _0\"></span>d.<span class=\"_ _0\"></span> </div><div class=\"t m2 xc hc y1e4 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y1e4 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e4 ff3 fs0 fc4 sc0 ls1 ws0\">onU<span class=\"_ _0\"></span>pdate </div><div class=\"t m0 x7 hc y1e5 ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0\">o<span class=\"_ _3\"></span>nUpdate() </span></span></div><div class=\"t m0 x7 hc y20c ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y226 ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"ls1b ws11\">to</span> <span class=\"_ _0\"></span>updat<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>sc<span class=\"_ _3\"></span>ene i<span class=\"_ _0\"></span>nfor<span class=\"_ _0\"></span>mation<span class=\"_ _0\"></span>. </div><div class=\"t m2 xc hc y1e9 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y1e9 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1e9 ff3 fs0 fc4 sc0 ls1 ws0\">onDr<span class=\"_ _0\"></span>aw </div><div class=\"t m0 x7 hc y1ea ff3 fs0 fc5 sc0 ls1 ws0\">virtual <span class=\"_ _0\"></span><span class=\"ff2 fc9\">void <span class=\"_ _2\"></span><span class=\"fc0\">o<span class=\"_ _3\"></span>nDraw() </span></span></div><div class=\"t m0 x7 hc y227 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y4af ff2 fs0 fc0 sc0 ls1 ws0\">Displays the <span class=\"_ _0\"></span>scen<span class=\"_ _0\"></span>e. </div><div class=\"t m0 x1 hb y961 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hb y297 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb y298 ff6 fs0 fc3 sc0 ls1 ws0\">Game <span class=\"_ _0\"></span>Leve<span class=\"_ _0\"></span>l<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h21 y962 ff6 fsc fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x0 hb y964 ff6 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y411 ff3 fs0 fc4 sc0 ls1 ws10\">Lev<span class=\"_ _0\"></span>el<span class=\"fc0 ws0\"> </span></div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x0 hc y965 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y966 ff2 fs0 fc0 sc0 ls17 ws15\">In<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>is::Eng<span class=\"_ _3\"></span>ine <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e game <span class=\"_ _0\"></span>levels are in<span class=\"_ _0\"></span>teg<span class=\"_ _3\"></span>er arr<span class=\"_ _0\"></span>ays contained<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>header files <span class=\"_ _0\"></span>(fil<span class=\"_ _3\"></span>e.h). These l<span class=\"_ _3\"></span>evels are <span class=\"_ _0\"></span>created thanks <span class=\"ls98 ws7d\">to</span> </span></div><div class=\"t m0 x24 hc y967 ff3 fs0 fc0 sc0 ls1 ws0\">is::Level Editor <span class=\"ff2\">(project </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x43 hb y968 ff2 fs0 fc10 sc0 ls1 ws10\">link<span class=\"_ _3\"></span><span class=\"fc0 ws0\">) which <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> delivered with <span class=\"_ _0\"></span>the eng<span class=\"_ _0\"></span>ine. </span></span></span></div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x0 h17 y969 ff2 fsa fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y96a ff9 fs0 fc0 sc0 ls1 ws0\">Header : </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x21 hc y65f ff6 fs0 fc5 sc0 ls1 ws10\">app<span class=\"_ _0\"></span>_src/<span class=\"_ _0\"></span><span class=\"ff3\">leve<span class=\"_ _0\"></span>ls<span class=\"ff6\">/</span>Le<span class=\"_ _0\"></span>vel<span class=\"ff6 ls49 ws3b\">.h<span class=\"fc0 ls1 ws0\"> </span></span></span></div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x0 hb y2f ff6 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y414 ff3 fs0 fc4 sc0 ls1 ws0\">Integration of<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>a l<span class=\"_ _0\"></span>evel<span class=\"fc0\"> </span></div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x0 hc y96b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y31 ff2 fs0 fc0 sc0 ls39 ws2c\">To<span class=\"ls1 ws0\"> integrate <span class=\"_ _0\"></span>a<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>level<span class=\"_ _3\"></span> <span class=\"ls5a ws4a\">we</span> include <span class=\"ls1d ws13\">its</span> <span class=\"_ _0\"></span>head<span class=\"_ _3\"></span>er <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>the <span class=\"ff3\">Le<span class=\"_ _3\"></span>vel.h </span>file <span class=\"_ _0\"></span><span class=\"ls1d ws13\">in<span class=\"ls1 ws0\"> this w<span class=\"_ _0\"></span>ay<span class=\"_ _0\"></span>: </span></span></span></div><div class=\"t m0 x0 hb y96c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hc y96d ff3 fs0 fc5 sc0 ls1 ws0\">#include <span class=\"_ _0\"></span>&quot;..<span class=\"_ _0\"></span>/leve<span class=\"_ _0\"></span>ls/lev<span class=\"_ _0\"></span>el_1.<span class=\"_ _0\"></span>h&quot;</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x49 hc y416 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y417 ff3 fs0 fc4 sc0 ls1 ws0\">Elements <span class=\"ls72 ws60\">to</span> <span class=\"_ _0\"></span>manage leve<span class=\"_ _0\"></span>ls<span class=\"fc0\"> </span></div><div class=\"t m0 xe hc y1fb ff3 fs0 fc4 sc0 ls1 ws0\">nam<span class=\"_ _0\"></span>espa<span class=\"_ _0\"></span>ce <span class=\"_ _0\"></span>lev<span class=\"_ _0\"></span>el </div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x24 hc y96e ff3 fs0 fc5 sc0 ls1 ws0\">namespace </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x34 hb y32 ff2 fs0 fc0 sc0 ls1 ws0\">level; </div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x24 hc y96f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y672 ff3 fs0 fc0 sc0 ls1 ws0\"> </div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x0 hc y970 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x24 hb y740 ff2 fs0 fc0 sc0 ls1 ws0\">Contains the <span class=\"_ _0\"></span>elem<span class=\"_ _3\"></span>ents which <span class=\"_ _0\"></span>are used <span class=\"ls1e ws14\">to<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> manage <span class=\"_ _0\"></span>the lev<span class=\"_ _0\"></span>els. </span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y36 ff3 fs0 fc4 sc0 ls1 ws0\">enum <span class=\"_ _2\"></span>L<span class=\"_ _3\"></span>evelId </div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x24 hc y86a ff3 fs0 fce sc0 ls1 ws0\">enum </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2c hb y380 ff2 fs0 fc0 sc0 ls1 ws0\">LevelId<span class=\"_ _3\"></span> </div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x24 hb y971 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hb y751 ff2 fs0 fc0 sc0 ls1 ws0\">LEVE<span class=\"_ _0\"></span>L_1, </div><div class=\"t m0 x29 hb y972 ff2 fs0 fc0 sc0 ls1 ws0\">LEVE<span class=\"_ _0\"></span>L_2, </div><div class=\"t m0 x29 hb y950 ff2 fs0 fcd sc0 ls35 ws29\">/*<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ffa ws10\">…<span class=\"ff2 ws0\"> <span class=\"ls9a ws7f\">*/<span class=\"_ _3\"></span></span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x29 h17 y593 ff2 fsa fc0 sc0 ls1 ws0\">, <span class=\"_ _0\"></span>LEVEL_MAX <span class=\"fcd ls7c ws67\">//</span><span class=\"fcd\"> Allows <span class=\"_ _0\"></span><span class=\"ls47 ws39\">to<span class=\"ls1 ws0\"> know the <span class=\"_ _0\"></span>total number <span class=\"ls9b ws80\">of</span> <span class=\"_ _0\"></span>integrated le<span class=\"_ _0\"></span>vel<span class=\"fc0\"> </span></span></span></span></div></div><div class=\"c x23 y963 w4 h4f\"><div class=\"t m0 x24 hb y3be ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6e\" class=\"pf w0 h0\" data-page-no=\"6e\"><div class=\"pc pc6e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbv23bQBjGYR91BDmBARfOGsoAVhtVWsGlp9ICSuMVMkc6N24MAYQU8UsRwEmRVPE/3fc8G9x7dPEzxRIRFwAAADSqMwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+EwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1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AIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcA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\"/><div class=\"c x48 y114 w36 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls1 ws0\">11<span class=\"_ _0\"></span>1<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y955 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y117 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b1 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1b2 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the inde<span class=\"_ _0\"></span>x<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1f ws16\">of<span class=\"ls1 ws0\"> each<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>level.<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>Eac<span class=\"_ _3\"></span>h time <span class=\"_ _0\"></span>a new <span class=\"_ _0\"></span>level<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">is<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> integrated into <span class=\"_ _0\"></span>the engine, you must <span class=\"_ _0\"></span>declare its ind<span class=\"_ _0\"></span>ex. </span></span></span></span></div><div class=\"t m2 xc hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">3.3</div><div class=\"t m3 x1d hd y207 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y207 ff3 fs0 fc4 sc0 ls1 ws10\">get<span class=\"_ _0\"></span>Leve<span class=\"_ _0\"></span>lMap<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y208 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fce sc0 ls1 ws0\">inline <span class=\"_ _0\"></span><span class=\"ff2 fc9\">short const<span class=\"fc0\">* getLevelMap(<span class=\"_ _3\"></span></span>int <span class=\"_ _0\"></span><span class=\"fc0\">CUR<span class=\"_ _0\"></span>RENT_L<span class=\"_ _0\"></span>EVEL<span class=\"_ _0\"></span>) </span></span></div><div class=\"t m0 x1 hb y209 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y20a ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y20b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y2b5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the leve<span class=\"_ _0\"></span>l<span class=\"_ _3\"></span> arr<span class=\"_ _0\"></span>ay enter<span class=\"_ _3\"></span>ed <span class=\"ls1d ws13\">in</span> <span class=\"_ _0\"></span>the para<span class=\"_ _0\"></span>meter<span class=\"_ _0\"></span>. </span></div><div class=\"t m0 x1 hb y1e7 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20d ff2 fs0 fc0 sc0 ls1 ws0\">Each <span class=\"ls1b ws11\">time</span> <span class=\"_ _0\"></span>a new <span class=\"_ _0\"></span>lev<span class=\"_ _3\"></span>el <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>int<span class=\"_ _3\"></span>egrated, you must enter the <span class=\"_ _0\"></span>instruction<span class=\"_ _3\"></span> that will return <span class=\"_ _0\"></span>this<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>level <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> the f<span class=\"_ _0\"></span>unct<span class=\"_ _0\"></span>ion. </span></span></div><div class=\"t m0 x7 hb y1e9 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y643 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y543 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y543 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y543 ff6 fs0 fc0 sc0 ls1 ws0\">Integration <span class=\"_ _0\"></span><span class=\"ls3c ws2f\">in<span class=\"ls1 ws0\"> f<span class=\"_ _0\"></span>unctio<span class=\"_ _0\"></span>n: </span></span></div><div class=\"t m0 x1 hb y88e ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y973 ff2 fs0 fcd sc0 ls67\">//<span class=\"ls1 ws0\"> Returns <span class=\"_ _0\"></span>the level array found <span class=\"_ _0\"></span><span class=\"ls1d ws13\">in<span class=\"ls1 ws0\"> lev<span class=\"_ _0\"></span>el_1.<span class=\"_ _0\"></span>h<span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x7 hc y974 ff3 fs0 fce sc0 ls1 ws0\">inline <span class=\"_ _0\"></span><span class=\"ff2 fc9\">short const<span class=\"fc0\">* <span class=\"_ _0\"></span>getLev<span class=\"_ _3\"></span>elMap(<span class=\"_ _3\"></span><span class=\"fc9\">int <span class=\"_ _0\"></span><span class=\"fc0\">CUR<span class=\"_ _0\"></span>RENT_L<span class=\"_ _0\"></span>EVEL<span class=\"_ _0\"></span>) </span></span></span></span></div><div class=\"t m0 x7 hb y975 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 x29 hc y976 ff3 fs0 fc5 sc0 ls1 ws0\">switch <span class=\"_ _0\"></span><span class=\"ff2 fc0\">(CU<span class=\"_ _0\"></span>RRENT<span class=\"_ _0\"></span>_LEVE<span class=\"_ _0\"></span>L) </span></div><div class=\"t m0 x29 hb y977 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 xc hc y447 ff3 fs0 fc5 sc0 ls1 ws0\">case <span class=\"_ _0\"></span><span class=\"ff2 fc0\">LEVEL_1 <span class=\"ls9f\">: </span><span class=\"ff3 fc5\">return <span class=\"_ _0\"></span><span class=\"ff2 fc0\">LEVEL_1_<span class=\"_ _3\"></span>MAP; <span class=\"ff3 fc5 ws10\">break</span>; <span class=\"fcd ls67\">//<span class=\"ls1\"> <span class=\"_ _0\"></span><span class=\"ff3\">LEVEL_<span class=\"_ _3\"></span>1_MAP <span class=\"ff2 ls1d ws13\">is</span><span class=\"ff2\"> the name <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> the <span class=\"_ _0\"></span>arra<span class=\"_ _3\"></span>y foun<span class=\"_ _0\"></span>d in <span class=\"ff3 ws10\">leve<span class=\"_ _0\"></span>l_1.<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x29 hb y925 ff2 fs0 fcd sc0 ls67 ws56\">//<span class=\"ls1 ws0\"> <span class=\"ls74 ws61\">...</span><span class=\"fc0\"> </span></span></div><div class=\"t m2 xc h13 y8b8 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y8b8 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y8b8 ff6 fs0 fc0 sc0 ls1 ws0\">Use <span class=\"_ _0\"></span><span class=\"ls3c ws2f\">in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ls3d ws30\">an<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>external <span class=\"_ _0\"></span>source <span class=\"_ _0\"></span><span class=\"ffd ls9c\">𝑓<span class=\"ff6 ls1\">ile: <span class=\"_ _0\"></span><span class=\"ff3 ls9d\">(<span class=\"ff6 ls1\">This <span class=\"_ _0\"></span><span class=\"ls3c ws2f\">is<span class=\"ls1 ws0\"> a <span class=\"_ _2\"></span>sim<span class=\"_ _3\"></span>ple <span class=\"_ _0\"></span>example <span class=\"_ _0\"></span>just <span class=\"_ _0\"></span><span class=\"ls6c ws5a\">to<span class=\"ls1 ws0\"> explain <span class=\"_ _0\"></span>the p<span class=\"_ _0\"></span>rincipl<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span><span class=\"ls6c ws5a\">to<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>you. <span class=\"_ _0\"></span><span class=\"ls37 ws2b\">To<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"lsa0 ws81\">go<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>further, </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 xe hc ycc ff6 fs0 fc0 sc0 ls1 ws0\">please refer to the Engin<span class=\"_ _3\"></span>e Demo<span class=\"ff3\">)<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hc y978 ff2 fs0 fc9 sc0 ls1 ws0\">short <span class=\"fc0\">*<span class=\"_ _0\"></span>curr<span class=\"_ _3\"></span>entLevelArray = <span class=\"_ _0\"></span>getLevelM<span class=\"_ _3\"></span>ap(<span class=\"ff3 fcc ws10\">LEVEL_1<span class=\"_ _3\"></span></span><span class=\"ls32 ws35\">);</span> <span class=\"_ _0\"></span><span class=\"fcd ls67\">//<span class=\"ls1\"> Return <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e <span class=\"_ _0\"></span>array which<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>in <span class=\"ff3 ws10\">leve<span class=\"_ _0\"></span>l_1.h<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hc y979 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hc y97a ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb hb yd0 ff6 fs0 fc3 sc0 ls1 ws0\">Game <span class=\"_ _0\"></span>lang<span class=\"_ _0\"></span>uage<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hb y3de ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y3df ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y3df ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y3df ff3 fs0 fc4 sc0 ls1 ws10\">La<span class=\"_ _0\"></span>nguag<span class=\"_ _0\"></span>es<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y97b ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y97c ff2 fs0 fc0 sc0 ls1 ws0\">Languages are <span class=\"_ _0\"></span>represented<span class=\"_ _3\"></span> <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> is::Engine <span class=\"ls26 ws1c\">by</span> <span class=\"_ _0\"></span>string arr<span class=\"_ _0\"></span>ays. </span></span></div><div class=\"t m0 x1 hb y511 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y97d ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">app_<span class=\"_ _0\"></span>src/<span class=\"ff3\">l<span class=\"_ _0\"></span>anguag<span class=\"_ _0\"></span>e<span class=\"ff6 ls9e\">/</span>Ga<span class=\"_ _0\"></span>meLan<span class=\"_ _0\"></span>guage<span class=\"ff6 ls49 ws3b\">.h<span class=\"fc0 ls1 ws0\"> </span></span></span></span></div><div class=\"t m2 xc hc y97e ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y97e ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y97e ff3 fs0 fc4 sc0 ls1 ws0\">Elements <span class=\"ls72 ws60\">to</span> <span class=\"_ _0\"></span>manage lang<span class=\"_ _0\"></span>uage<span class=\"_ _0\"></span>s<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y6b2 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y6b2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6b2 ff3 fs0 fc4 sc0 ls1 ws0\">namespace <span class=\"_ _0\"></span>lang </div><div class=\"t m0 x7 hc y6b3 ff3 fs0 fc5 sc0 ls1 ws0\">namespace <span class=\"ff2 fc0\">la<span class=\"_ _3\"></span>ng; </span></div><div class=\"t m0 x7 hc y97f ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3e9 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y980 ff2 fs0 fc0 sc0 ls1 ws0\">Used <span class=\"_ _0\"></span><span class=\"ls1b ws11\">to<span class=\"ls1 ws0\"> manage game <span class=\"_ _0\"></span>lang<span class=\"_ _0\"></span>uage<span class=\"_ _0\"></span>s. </span></span></div><div class=\"t m2 xc hc y280 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y280 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y280 ff3 fs0 fc4 sc0 ls1 ws0\">enum <span class=\"_ _2\"></span>G<span class=\"_ _3\"></span>ameLanguage </div><div class=\"t m0 x7 hc y789 ff3 fs0 fce sc0 ls1 ws0\">enum <span class=\"ff2 fc0\">GameLangua<span class=\"_ _3\"></span>ge </span></div><div class=\"t m0 x7 hb y386 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 x29 hb y428 ff2 fs0 fc0 sc0 ls1 ws0\">ENGLISH, <span class=\"_\"> </span><span class=\"fcd ls67 ws56\">///&lt;<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> Represents the <span class=\"_ _0\"></span>English <span class=\"_ _3\"></span>lang<span class=\"_ _0\"></span>uage<span class=\"fc0\"> </span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6f\" class=\"pf w0 h0\" data-page-no=\"6f\"><div class=\"pc pc6f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcA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\"/><div class=\"c x48 y114 w36 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls1 ws0\">11<span class=\"_ _0\"></span>2<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y955 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x29 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">FRANCAIS,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fcd ls67 ws56\">///&lt;<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>Represents<span class=\"_ _3\"></span> the<span class=\"_ _0\"></span> French <span class=\"_ _0\"></span>langu<span class=\"_ _0\"></span>age<span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x29 hb y981 ff2 fs0 fcd sc0 ls67 ws56\">/*<span class=\"ls1 ws0\"> <span class=\"ffa ws10\">…<span class=\"_ _0\"></span><span class=\"ff2 ws0\"> <span class=\"ls9a ws7f\">*/<span class=\"_ _3\"></span></span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x7 hb y982 ff2 fs0 fc0 sc0 ls1 ws0\">}<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hc y983 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y984 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y985 ff2 fs0 fc0 sc0 ls1 ws0\">This enumeration allows to implement<span class=\"_ _3\"></span> the index <span class=\"_ _0\"></span><span class=\"ls1c ws12\">of<span class=\"ls1 ws0\"> each language <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>order <span class=\"ls1b ws11\">to</span> provide the used more e<span class=\"_ _0\"></span>asil<span class=\"_ _3\"></span>y during the </span></span></div><div class=\"t m0 x7 hb y11e ff2 fs0 fc0 sc0 ls1 ws0\">de<span class=\"_ _0\"></span>velop<span class=\"_ _0\"></span>ment. </div><div class=\"t m0 x7 hb y986 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y987 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y352 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y352 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y352 ff6 fs0 fc0 sc0 ls1 ws0\">Create a <span class=\"_ _0\"></span>sen<span class=\"_ _0\"></span>tence:<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y988 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y989 ff3 fs0 fc5 sc0 ls1 ws0\">static std::string <span class=\"ff2 fc0\">h<span class=\"_ _3\"></span>ello_world[] = { <span class=\"_ _0\"></span><span class=\"ff3 fc7\">&quot;Hello<span class=\"_ _3\"></span> World <span class=\"_ _0\"></span>!&quot;, &quot;Salut <span class=\"lsa2 ws82\">le</span> <span class=\"_ _0\"></span>monde <span class=\"lsa3 ws83\">!&quot;</span> <span class=\"ff2 fc0 lsa4 ws84\">};<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"fcd ls67\">//<span class=\"ls1\"> <span class=\"ls39 ws2c\">To</span> put <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"ff3 ws10\">Ga<span class=\"_ _0\"></span>meLang<span class=\"_ _0\"></span>uage.<span class=\"_ _0\"></span>h<span class=\"fc0 ws0\"> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m2 xc h13 y98a ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y98a ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y98a ff6 fs0 fc0 sc0 ls1 ws0\">Use: <span class=\"ff3 lsa1\">(</span>This <span class=\"_ _0\"></span><span class=\"ls3c ws2f\">is<span class=\"ls1 ws0\"> a simple example just <span class=\"ls6c ws5a\">to</span> explain the principle <span class=\"ls6c ws5a\">to</span> you. <span class=\"ls37 ws2b\">To</span> <span class=\"_ _0\"></span><span class=\"lsa0\">go <span class=\"ls1\">further, please refer <span class=\"ls6c ws5a\">to</span> the Engine </span></span></span></span></div><div class=\"t m0 xe hc y357 ff6 fs0 fc0 sc0 ls1 ws10\">Dem<span class=\"_ _0\"></span>o<span class=\"ff3 ws0\">) </span></div><div class=\"t m0 x7 hc y359 ff2 fs0 fc0 sc0 ls1 ws0\">gameSystemExt.m_gam<span class=\"_ _3\"></span>eLanguage = <span class=\"_ _3\"></span><span class=\"ff3 fc5 ws10\">is::lang::</span><span class=\"ws10\">Gam<span class=\"_ _3\"></span>eLanguage::<span class=\"_ _3\"></span><span class=\"ff3\">ENGLISH</span></span><span class=\"ls8b\">; </span><span class=\"fcd\">// Choic<span class=\"_ _3\"></span>e of English language<span class=\"_ _3\"></span> </span></div><div class=\"t m0 x7 hc y98b ff3 fs0 fc5 sc0 ls1 ws10\">is::<span class=\"ff2 fc0\">showLog(</span>is::lan<span class=\"_ _3\"></span>g::<span class=\"ff2 fc0 ws0\">hello_world[gameSyst<span class=\"_ _3\"></span>emExt.m_ga<span class=\"_ _3\"></span>meLanguage]);<span class=\"_ _3\"></span> <span class=\"fcd ls67\">//<span class=\"ls1\"> <span class=\"lsa5 ws85\">We<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> will <span class=\"_ _0\"></span>have <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>consol<span class=\"_ _3\"></span>e: <span class=\"_ _0\"></span><span class=\"ff3\">Hello World <span class=\"lsa3\">! </span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y98c ff2 fs0 fc0 sc0 ls1 ws0\">gameSystemExt.m_gam<span class=\"_ _3\"></span>eLanguage = <span class=\"_ _3\"></span><span class=\"ff3 fc5 ws10\">is::lang::</span><span class=\"ws10\">Gam<span class=\"_ _3\"></span>eLanguage::<span class=\"_ _3\"></span><span class=\"ff3\">FRANCAIS</span></span><span class=\"ls8b\">; </span><span class=\"fcd\">// Choic<span class=\"_ _3\"></span>e of French languag<span class=\"_ _3\"></span>e<span class=\"_ _3\"></span></span> </div><div class=\"t m0 x7 hc y168 ff3 fs0 fc5 sc0 ls1 ws10\">is::<span class=\"ff2 fc0\">showLog(</span>is::lan<span class=\"_ _3\"></span>g::<span class=\"ff2 fc0 ws0\">hello_world[gameSyst<span class=\"_ _3\"></span>emExt.m_ga<span class=\"_ _3\"></span>meLanguage]);<span class=\"_ _3\"></span> <span class=\"fcd ls67 ws56\">//</span><span class=\"fcd\"> <span class=\"_ _0\"></span><span class=\"lsa6 ws86\">We<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>will<span class=\"_ _3\"></span> have <span class=\"_ _0\"></span><span class=\"ls1d ws13\">in<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>the <span class=\"_ _0\"></span>console:<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3\">Salut <span class=\"lsa2 ws82\">le<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>monde<span class=\"fc0\"> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x7 hc y331 ff3 fs0 fcd sc0 lsa7 ws87\">!&quot;<span class=\"fc0 ls1 ws0\"> </span></div><div class=\"t m0 x1 hc y332 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hc y98d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 hc y98e ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xb h46 y98f ff6 fs4 fc3 sc0 ls1 ws0\">Game Dialog <span class=\"_ _0\"></span>B<span class=\"_ _0\"></span>ox<span class=\"_ _2\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 h46 y16e ff6 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y6ee ff3 fs0 fc4 sc0 ls1a\">1.</div><div class=\"t m3 xd hd y6ee ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y6ee ff3 fs0 fc4 sc0 ls1 ws0\">class <span class=\"_ _0\"></span>GameDi<span class=\"_ _0\"></span>alog<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y6ef ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x42 hc y5b ff3 fs0 fc5 sc0 ls1 ws0\">class <span class=\"_ _0\"></span><span class=\"ff2 fc0\">GameDi<span class=\"_ _0\"></span>alog<span class=\"_ _0\"></span>; </span></div><div class=\"t m0 x7 hc y990 ff9 fs0 fc0 sc0 ls1 ws0\">Header : <span class=\"_ _0\"></span><span class=\"ff6 fc5 ws10\">app_<span class=\"_ _0\"></span>src/<span class=\"ff3\">ob<span class=\"_ _0\"></span>jects<span class=\"_ _0\"></span>/widg<span class=\"_ _0\"></span>ets/G<span class=\"_ _0\"></span>ameDia<span class=\"_ _0\"></span>log<span class=\"ff6 ls49 ws3b\">.h<span class=\"fc0 ls1 ws0\"> </span></span></span></span></div><div class=\"t m0 x1 hb y991 ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y992 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y993 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y994 ff2 fs0 fc0 sc0 ls1 ws0\">Class<span class=\"_ _3\"></span> that a<span class=\"_ _3\"></span>llows you <span class=\"ls1b ws11\">to</span> <span class=\"_ _3\"></span>displ<span class=\"_ _3\"></span>ay dia<span class=\"_ _3\"></span>log boxes <span class=\"_ _3\"></span>like <span class=\"ls1f ws16\">in</span> RPG <span class=\"_ _3\"></span>games. It<span class=\"_ _3\"></span> is c<span class=\"_ _3\"></span>losely r<span class=\"_ _3\"></span>elated t<span class=\"_ _3\"></span>o the <span class=\"_ _3\"></span>languag<span class=\"_ _3\"></span>e part o<span class=\"_ _3\"></span>f th<span class=\"_ _3\"></span>e game<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hb y995 ff6 fs0 fc0 sc0 ls1 ws0\">(click here for mor<span class=\"_ _3\"></span>e information: <span class=\"_ _3\"></span><span class=\"fc7 ls6a\">1</span><span class=\"ls6b\">)</span><span class=\"ff2\">. <span class=\"ls39 ws2c\">To</span><span class=\"ls75\"> <span class=\"ls26 ws1c\">be</span></span> able <span class=\"_ _3\"></span><span class=\"ls1b ws11\">to</span> display <span class=\"ls23\">a </span>dia<span class=\"_ _3\"></span>log you must define <span class=\"_ _3\"></span>a s<span class=\"_ _3\"></span>tring array repr<span class=\"_ _3\"></span>esenting this </span></div><div class=\"t m0 x7 hc y511 ff2 fs0 fc0 sc0 ls1 ws0\">dialog in <span class=\"ff3\">GameL<span class=\"_ _3\"></span>anguage.h<span class=\"_ _3\"></span> </span></div><div class=\"t m2 xc hc y996 ff3 fs0 fc4 sc0 ls1a\">2.</div><div class=\"t m3 xd hd y996 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y996 ff3 fs0 fc4 sc0 ls1 ws0\">Elements <span class=\"ls42 ws34\">of</span> Ga<span class=\"_ _0\"></span>meDia<span class=\"_ _0\"></span>log<span class=\"fc0\"> </span></div><div class=\"t m2 xc hc y997 ff3 fs0 fc4 sc0 ls1 ws10\">2.1</div><div class=\"t m3 x1d hd y997 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y997 ff3 fs0 fc4 sc0 ls1 ws10\">Game<span class=\"_ _0\"></span>Dial<span class=\"_ _0\"></span>og<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x7 hc y784 ff2 fs0 fc0 sc0 ls1 ws0\">GameDialog(sf::Texture<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>&amp;tex, <span class=\"_ _0\"></span>sf::Font &amp;fnt,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff3 fc5 ws10\">is::<span class=\"ff2 fc0 ws0\">GameDisplay<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>*s<span class=\"_ _0\"></span>cene) </span></span></div><div class=\"t m0 x1 hb y998 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y999 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y97f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y342 ff2 fs0 fc0 sc0 ls1 ws0\">Constructor <span class=\"ls1c ws12\">of</span> the <span class=\"_ _0\"></span>class,<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">it<span class=\"ls1 ws0\"> takes <span class=\"ls23 ws1a\">as</span> a <span class=\"_ _0\"></span>parameter texture, font and the scene <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> which<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">it</span> <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"ls1 ws0\"> use<span class=\"_ _0\"></span>d. </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y980 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y838 ff3 fs0 fc4 sc0 ls1 ws10\">2.2</div><div class=\"t m3 x1d hd y838 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y838 ff3 fs0 fc4 sc0 ls1 ws0\">en<span class=\"_ _0\"></span>um <span class=\"_ _0\"></span>Dia<span class=\"_ _0\"></span>logIn<span class=\"_ _0\"></span>dex </div><div class=\"t m0 x7 hc y788 ff3 fs0 fce sc0 ls1 ws0\">enum <span class=\"ff2 fc0\">DialogInde<span class=\"_ _3\"></span>x </span></div><div class=\"t m0 x7 hb y99a ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 x29 hc y99b ff2 fs0 fc0 sc0 ls1 ws0\">DIALOG_NONE<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= <span class=\"_ _0\"></span><span class=\"ff3 fcc ls76\">-<span class=\"ff2 ls1 ws10\">1<span class=\"fc0 ws0\">, </span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf70\" class=\"pf w0 h0\" data-page-no=\"70\"><div class=\"pc pc70 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQf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AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAMB+TjFGVwAAADgqvz4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoMUOCP8AAAGISURBVPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAwPGdf0NedJ/pkSTX1yVUZcjqe7vk3/r53vZmGG9pH7Junl0NAADgX6zNmIDr4XiuAgAAAABJRU5ErkJggg==\"/><div class=\"c x48 y114 w36 ha\"><div class=\"t m0 xa h9 y115 ff4 fs4 fc0 sc0 ls1 ws0\">11<span class=\"_ _0\"></span>3<span class=\"_ _0\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 hb y955 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x29 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">DIALOG_PLAYER_MOVE,<span class=\"_ _3\"></span> <span class=\"fcd ls67\">//<span class=\"ls1\"> Represents the <span class=\"_ _0\"></span>dialog<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>that talk<span class=\"_ _3\"></span>s about <span class=\"_ _0\"></span>how to move <span class=\"_ _0\"></span>the p<span class=\"_ _0\"></span>laye<span class=\"_ _0\"></span>r<span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x29 hb y981 ff2 fs0 fcd sc0 ls67 ws56\">/*<span class=\"ls1 ws0\"> <span class=\"ffa ws10\">…<span class=\"_ _0\"></span><span class=\"ff2 ws0\"> <span class=\"ls9a ws7f\">*/<span class=\"_ _3\"></span></span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x7 hb y982 ff2 fs0 fc0 sc0 ls85 ws70\">};<span class=\"ls1 ws0\"> </span></div><div class=\"t m0 x7 hc y983 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y984 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y985 ff2 fs0 fc0 sc0 ls1 ws0\">Represents the different <span class=\"_ _0\"></span>dial<span class=\"_ _3\"></span>ogs that will <span class=\"ls26 ws1c\">be</span> displayed in the <span class=\"_ _0\"></span>game. The information that <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>defined<span class=\"_ _3\"></span> in<span class=\"_ _0\"></span>side<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>linked <span class=\"ls1b\">to </span></div><div class=\"t m0 x7 hb y11e ff2 fs0 fc0 sc0 ls1 ws0\">the language part of th<span class=\"_ _3\"></span>e game.<span class=\"_ _3\"></span> </div><div class=\"t m0 x7 hc y986 ff2 fs0 fc0 sc0 ls1 ws0\">Each <span class=\"ls1b ws11\">time</span> <span class=\"_ _0\"></span><span class=\"ls23 ws1a\">an<span class=\"ls1 ws0\"> index <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>add<span class=\"_ _3\"></span>ed <span class=\"ls5a ws4a\">we</span> must de<span class=\"_ _0\"></span>clare<span class=\"_ _3\"></span> <span class=\"ls1d ws13\">its</span> <span class=\"_ _0\"></span>string array<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls1f ws16\">in<span class=\"ls75 ws0\"> <span class=\"ff3 ls1 ws10\">Gam<span class=\"_ _0\"></span>eLang<span class=\"_ _0\"></span>uage.<span class=\"_ _0\"></span>h<span class=\"ff2 ws0\">. </span></span></span></span></span></span></div><div class=\"t m0 x1 hb y99c ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y8f6 ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m0 x1 hb y99d ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc h13 y99e ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y99e ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hb y99e ff6 fs0 fc0 sc0 ls1 ws0\">DIALOG_PLAYER_MO<span class=\"_ _3\"></span>VE <span class=\"_ _0\"></span>dialog <span class=\"_ _0\"></span>declaration<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls3c ws2f\">in<span class=\"ls1 ws0\"> GameLanguage.h :<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x1 hb y99f ff6 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y98a ff3 fs0 fce sc0 ls1 ws0\">static std::wstring <span class=\"ff2 fc0\">dialog_player_move[]<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>= {<span class=\"ff3 fc7\">L&quot;Press <span class=\"_ _0\"></span>LEF<span class=\"_ _3\"></span>T <span class=\"ls42 ws34\">or</span> <span class=\"_ _0\"></span>RIGHT <span class=\"ls72 ws60\">to</span> <span class=\"_ _0\"></span>move.<span class=\"_ _0\"></span>\\<span class=\"lsa9 ws88\">n&quot;</span><span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x4a hc y42d ff3 fs0 fc7 sc0 ls1 ws0\">&quot;Press A <span class=\"_ _0\"></span><span class=\"ls66 ws55\">to<span class=\"ls1 ws0\"> J<span class=\"_ _0\"></span>ump.<span class=\"_ _0\"></span>&quot;<span class=\"ff2 fc0\">, </span></span></span></div><div class=\"t m0 x1 hb y9a0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x4b hc y9a1 ff3 fs0 fc7 sc0 ls1 ws0\">L&quot;Appuie sur <span class=\"_ _0\"></span>GAUCHE<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ls42 ws34\">ou<span class=\"ls1 ws0\"> DROITE<span class=\"_ _3\"></span> <span class=\"_ _0\"></span>pour <span class=\"ls72 ws60\">te</span> <span class=\"_ _0\"></span>déplacer.\\<span class=\"_ _3\"></span>n&quot; </span></span></div><div class=\"t m0 x4b hc y9a2 ff3 fs0 fc7 sc0 ls1 ws0\">&quot;Appuie sur A pou<span class=\"_ _3\"></span>r sauter.&quot;<span class=\"_ _3\"></span><span class=\"ff2 fc0 lsa4 ws84\">};<span class=\"ls1 ws0\"> </span></span></div><div class=\"t m2 xc hc y901 ff3 fs0 fc4 sc0 ls1 ws10\">2.3</div><div class=\"t m3 x1d hd y901 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y901 ff3 fs0 fc4 sc0 ls1 ws0\">lin<span class=\"_ _0\"></span>kArra<span class=\"_ _0\"></span>yToEn<span class=\"_ _0\"></span>um </div><div class=\"t m0 x7 hb y9a3 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"fc0\">linkArrayToE<span class=\"_ _3\"></span>num() </span></div><div class=\"t m0 x7 hc y9a4 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y9a5 ff2 fs0 fc0 sc0 ls1 ws0\">Connect the <span class=\"_ _0\"></span>string array found <span class=\"ls1f ws16\">in<span class=\"_ _0\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span><span class=\"ff3\">G<span class=\"_ _3\"></span>ameLanguage.h<span class=\"_ _3\"></span> <span class=\"ff2\">and <span class=\"_ _0\"></span>the dialogue in<span class=\"_ _0\"></span>dex. </span></span></span></span></div><div class=\"t m0 x7 hb y16e ff6 fs0 fc0 sc0 ls1 ws0\">Exa<span class=\"_ _0\"></span>mple: </div><div class=\"t m2 xc h13 y9a6 ff8 fs0 fc0 sc0 ls1\"></div><div class=\"t m4 x1e hd y9a6 ff5 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y9a6 ff6 fs0 fc0 sc0 ls1 ws0\">Link <span class=\"ls3d ws30\">an</span> <span class=\"_ _0\"></span>Index<span class=\"_ _3\"></span> a<span class=\"_ _0\"></span>n<span class=\"_ _3\"></span>d its string array: <span class=\"ff3 lsa8\">(</span>This <span class=\"_ _0\"></span><span class=\"ls3c ws2f\">is<span class=\"ls1 ws0\"> a <span class=\"_ _0\"></span>simpl<span class=\"_ _3\"></span>e example just <span class=\"_ _0\"></span>to expla<span class=\"_ _3\"></span>in the principle <span class=\"ls6c ws5a\">to</span> <span class=\"_ _0\"></span>you. <span class=\"ls37 ws2b\">To</span> <span class=\"lsa0\">go </span></span></span></div><div class=\"t m0 xe hc y170 ff6 fs0 fc0 sc0 ls1 ws0\">further, please refer to<span class=\"_ _3\"></span> the Engine Demo<span class=\"_ _3\"></span><span class=\"ff3\">) </span></div><div class=\"t m0 x7 hb y9a7 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">linkAr<span class=\"_ _0\"></span>rayTo<span class=\"_ _0\"></span>Enum<span class=\"_ _0\"></span>() </span></div><div class=\"t m0 x1 hb y9a8 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y9a9 ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 x7 hb y175 ff2 fs0 fcd sc0 ls67\">//<span class=\"ls1 ws0\"> <span class=\"ffa ws10\">…<span class=\"_ _2\"></span><span class=\"ff2 fc0 ws0\"> </span></span></span></div><div class=\"t m0 x7 hc y9aa ff3 fs0 fc5 sc0 ls1 ws0\">switch <span class=\"_ _0\"></span><span class=\"ff2 fc0\">(m_d<span class=\"_ _0\"></span>ialo<span class=\"_ _0\"></span>gIndex<span class=\"_ _0\"></span>) </span></div><div class=\"t m0 x1 hb y9ab ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y9ac ff2 fs0 fc0 sc0 ls1 ws0\">{<span class=\"_ _0\"></span> </div><div class=\"t m0 x1 hb y9ad ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x29 hc y63 ff3 fs0 fc5 sc0 ls1 ws0\">case <span class=\"_ _0\"></span><span class=\"ff2 fc0\">DIALOG_PLA<span class=\"_ _3\"></span>YER_MOVE:<span class=\"_ _3\"></span> <span class=\"fcd ls67\">//<span class=\"ls1\"> <span class=\"_ _0\"></span>Dialogue i<span class=\"_ _0\"></span>nd<span class=\"_ _0\"></span>ex<span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x29 hc y9ae ff2 fs0 fc0 sc0 ls1 ws0\">m_msgIndexMax = <span class=\"ff3 fc5 ws10\">is::</span><span class=\"ws10\">arraySize(<span class=\"ff3 fc5\">is::lang::</span></span>d<span class=\"_ _3\"></span>ialog_player_move);<span class=\"_ _3\"></span> <span class=\"fcd ls67\">//<span class=\"ls1\"> <span class=\"_ _0\"></span>Determines the number <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>sentences </span></span></div><div class=\"t m0 x29 hc y9af ff2 fs0 fc0 sc0 ls1 ws10\">checkMsg(<span class=\"_ _3\"></span><span class=\"ff3 fc5\">is::lang::</span><span class=\"ws0\">dialog_player_mov<span class=\"_ _3\"></span>e); <span class=\"fcd\">// Define th<span class=\"_ _3\"></span>e dialogue thanks to its st<span class=\"_ _3\"></span>ring a<span class=\"_ _3\"></span>rray</span> </span></div><div class=\"t m0 x29 hc y715 ff3 fs0 fc5 sc0 ls1 ws10\">br<span class=\"_ _0\"></span>eak<span class=\"ff2 fc0 ws0\">; </span></div><div class=\"t m0 x29 hb y9b0 ff2 fs0 fcd sc0 ls67 ws56\">//<span class=\"ls1 ws0\"> <span class=\"ffa ws10\">…<span class=\"_ _2\"></span><span class=\"ff2 fc0 ws0\"> </span></span></span></div><div class=\"t m2 xc hc y9b1 ff3 fs0 fc4 sc0 ls1 ws10\">2.4</div><div class=\"t m3 x1d hd y9b1 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y9b1 ff3 fs0 fc4 sc0 ls1 ws10\">st<span class=\"_ _0\"></span>e<span class=\"_ _0\"></span>p<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y3b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y9b2 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0 ws10\">st<span class=\"_ _3\"></span>ep(<span class=\"fc9 ws0\">const float <span class=\"_ _0\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _0\"></span>_TI<span class=\"_ _0\"></span>ME) </span></span></span></div><div class=\"t m0 x7 hc y7e8 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf71\" class=\"pf w0 h0\" data-page-no=\"71\"><div class=\"pc pc71 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jG4CgAIqieROIEaxgCBPIn0fFDhKtTsQIVvgTKbVayTnda193AQBA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8LAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9LgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9bkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAJEe4nIAAABASURBVNXnAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAHyrvn7YkiTd0rS1JNe47vP07vs421oSlwEAAPzIA0naG8r2cOVPAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h14 y1e1 ff2 fs9 fc0 sc0 ls1 ws0\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x7 hb y117 ff2 fs0 fc0 sc0 ls1 ws0\">Updates the <span class=\"_ _0\"></span>information <span class=\"ls1f ws16\">in</span> <span class=\"_ _0\"></span>the dialog <span class=\"_ _0\"></span>bo<span class=\"_ _0\"></span>x. </div><div class=\"t m0 x1 hb y1b1 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">2.5</div><div class=\"t m3 x1d hd y1b2 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1b2 ff3 fs0 fc4 sc0 ls1 ws10\">se<span class=\"_ _0\"></span>tDia<span class=\"_ _0\"></span>log<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y1b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y4bb ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">setDialog(DialogInd<span class=\"_ _3\"></span>ex <span class=\"_ _0\"></span>dial<span class=\"_ _0\"></span>ogIn<span class=\"_ _0\"></span>dex) </span></div><div class=\"t m0 x7 hc y1b5 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y209 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y20a ff2 fs0 fc0 sc0 ls1 ws0\">Defines the <span class=\"_ _0\"></span>dialog that will <span class=\"ls22 ws19\">be</span> <span class=\"_ _0\"></span>lau<span class=\"_ _0\"></span>nched<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y20b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y20c ff3 fs0 fc4 sc0 ls1 ws10\">2.6</div><div class=\"t m3 x1d hd y20c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y20c ff3 fs0 fc4 sc0 ls1 ws0\">se<span class=\"_ _0\"></span>tMous<span class=\"_ _0\"></span>eInCo<span class=\"_ _0\"></span>lliso<span class=\"_ _0\"></span>n </div><div class=\"t m0 x7 hb y226 ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _2\"></span><span class=\"fc0 ws10\">se<span class=\"_ _3\"></span>tMouseInCollison(<span class=\"_ _3\"></span><span class=\"fc9 ws0\">bool<span class=\"_ _3\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">va<span class=\"_ _3\"></span>l) </span></span></span></div><div class=\"t m0 x7 hc y1e9 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hb y294 ff2 fs0 fc0 sc0 ls1 ws0\">Force <span class=\"_ _0\"></span>th<span class=\"_ _3\"></span>e collision <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the mo<span class=\"_ _3\"></span>use cursor <span class=\"_ _0\"></span><span class=\"ls1f ws16\">or<span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>finger (on Mobile) with the <span class=\"_ _0\"></span>dialog bo<span class=\"_ _0\"></span>x.<span class=\"_ _0\"></span> </span></span></div><div class=\"t m0 x1 hb y24b ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">2.7</div><div class=\"t m3 x1d hd y227 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y227 ff3 fs0 fc4 sc0 ls1 ws10\">dr<span class=\"_ _0\"></span>aw<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y38d ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y38e ff2 fs0 fc9 sc0 ls1 ws0\">void <span class=\"_ _0\"></span><span class=\"fc0\">draw(is::Rende<span class=\"_ _3\"></span>r <span class=\"_ _0\"></span>&amp;surf<span class=\"_ _0\"></span>ace) </span></div><div class=\"t m0 x7 hc ye8 ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y38f ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y1ef ff2 fs0 fc0 sc0 ls1 ws0\">Displays the <span class=\"_ _0\"></span>dialog b<span class=\"_ _0\"></span>ox<span class=\"_ _0\"></span>. </div><div class=\"t m0 x1 hb y1f0 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y24c ff3 fs0 fc4 sc0 ls1 ws10\">2.8</div><div class=\"t m3 x1d hd y24c ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y24c ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Dialo<span class=\"_ _0\"></span>gInde<span class=\"_ _0\"></span>x </div><div class=\"t m0 x7 hb y595 ff2 fs0 fc0 sc0 ls1 ws0\">DialogIndex <span class=\"_ _0\"></span>getDialogIndex(<span class=\"_ _3\"></span>) <span class=\"_ _0\"></span><span class=\"fc9\">const </span></div><div class=\"t m0 x7 hc y216 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc y1f5 ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"ff2 fc0\">the enumerator <span class=\"ls1c ws12\">of</span> <span class=\"_ _0\"></span>the dialog that <span class=\"_ _0\"></span><span class=\"ls1d ws13\">is<span class=\"_ _3\"></span><span class=\"ls1 ws0\"> <span class=\"_ _0\"></span>displ<span class=\"_ _0\"></span>ayed. </span></span></span></div><div class=\"t m0 x1 hb y1f6 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y1f7 ff3 fs0 fc4 sc0 ls1 ws10\">2.9</div><div class=\"t m3 x1d hd y1f7 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 xe hc y1f7 ff3 fs0 fc4 sc0 ls1 ws0\">get<span class=\"_ _0\"></span>Mouse<span class=\"_ _0\"></span>InCo<span class=\"_ _0\"></span>lliso<span class=\"_ _0\"></span>n </div><div class=\"t m0 x7 hb y24d ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _2\"></span><span class=\"fc0\">g<span class=\"_ _3\"></span>etMouseInCollison()<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"fc9\">const </span></span></div><div class=\"t m0 x7 hc y219 ff3 fs0 fca sc0 ls1 ws0\">Source Code<span class=\"fc0\"> </span></div><div class=\"t m0 x7 hc yee ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2\">when <span class=\"_ _0\"></span>the mouse <span class=\"_ _0\"></span>cu<span class=\"_ _3\"></span>rsor <span class=\"ls1c ws12\">or</span> <span class=\"_ _0\"></span>the user&apos;s finger <span class=\"_ _0\"></span>(on Mobile) touches the dialog box, <span class=\"ff3\">false<span class=\"_ _3\"></span> <span class=\"_ _0\"></span><span class=\"ff2 ls1d ws13\">if<span class=\"ls1 ws0\"> no<span class=\"_ _0\"></span>t.<span class=\"_ _0\"></span> </span></span></span></span></span></div><div class=\"t m0 x1 hb y4b2 ff2 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m2 xc hc y4e6 ff3 fs0 fc4 sc0 ls1 ws10\">2.10</div><div class=\"t m3 x21 hd y4e6 ff7 fs0 fc4 sc0 ls1 ws0\"> </div><div class=\"t m0 x20 hc y4e6 ff3 fs0 fc4 sc0 ls1 ws10\">show<span class=\"_ _0\"></span>Dial<span class=\"_ _0\"></span>og<span class=\"fc0 ws0\"> </span></div><div class=\"t m0 x1 hc y9b3 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hb y72c ff2 fs0 fc9 sc0 ls1 ws0\">bool <span class=\"_ _0\"></span><span class=\"fc0\">showDialog() <span class=\"fc9 ws10\">con<span class=\"_ _0\"></span>st<span class=\"_ _0\"></span><span class=\"fc0 ws0\"> </span></span></span></div><div class=\"t m0 x7 hc y21c ff3 fs0 fca sc0 ls1 ws0\">Source <span class=\"_ _0\"></span>Co<span class=\"_ _0\"></span>de<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b4 ff3 fs0 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x7 hc y1fe ff3 fs0 fcb sc0 ls1 ws0\">Return <span class=\"fc0\">true <span class=\"ff2\">when the <span class=\"_ _0\"></span>dialo<span class=\"_ _3\"></span>g <span class=\"ls1d ws13\">is</span> <span class=\"_ _0\"></span>open and <span class=\"ff3\">false </span><span class=\"ls1d ws13\">if</span> n<span class=\"_ _0\"></span>ot<span class=\"_ _0\"></span>. </span></span></div><div class=\"t m0 x1 h46 y9b4 ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y49a ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y55a ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y690 ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 yfb ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y8d5 ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y9b5 ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y9b6 ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y9b7 ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y9b8 ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y386 ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y9b9 ff2 fs4 fc0 sc0 ls1 ws0\"> </div><div class=\"t m0 x1 h46 y808 ff2 fs4 fc0 sc0 ls96 ws0\"> <span class=\"ff4 ls1 v4\">11<span class=\"_ _0\"></span>4<span class=\"_ _0\"></span> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n</div>\n<div class=\"loading-indicator\">\n<img alt=\"\" src=\"data:image/png;base64,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\"/>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "doc/isEngine_api_doc_fr.html",
    "content": "<!DOCTYPE html>\n<!-- Created by pdf2htmlEX (https://github.com/pdf2htmlEX/pdf2htmlEX) -->\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"generator\" content=\"pdf2htmlEX\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"/>\n<style type=\"text/css\">\n/*! \n * Base CSS for pdf2htmlEX\n * Copyright 2012,2013 Lu Wang <coolwanglu@gmail.com> \n * https://github.com/pdf2htmlEX/pdf2htmlEX/blob/master/share/LICENSE\n */#sidebar{position:absolute;top:0;left:0;bottom:0;width:250px;padding:0;margin:0;overflow:auto}#page-container{position:absolute;top:0;left:0;margin:0;padding:0;border:0}@media screen{#sidebar.opened+#page-container{left:250px}#page-container{bottom:0;right:0;overflow:auto}.loading-indicator{display:none}.loading-indicator.active{display:block;position:absolute;width:64px;height:64px;top:50%;left:50%;margin-top:-32px;margin-left:-32px}.loading-indicator img{position:absolute;top:0;left:0;bottom:0;right:0}}@media print{@page{margin:0}html{margin:0}body{margin:0;-webkit-print-color-adjust:exact}#sidebar{display:none}#page-container{width:auto;height:auto;overflow:visible;background-color:transparent}.d{display:none}}.pf{position:relative;background-color:white;overflow:hidden;margin:0;border:0}.pc{position:absolute;border:0;padding:0;margin:0;top:0;left:0;width:100%;height:100%;overflow:hidden;display:block;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0}.pc.opened{display:block}.bf{position:absolute;border:0;margin:0;top:0;bottom:0;width:100%;height:100%;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}.bi{position:absolute;border:0;margin:0;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}@media print{.pf{margin:0;box-shadow:none;page-break-after:always;page-break-inside:avoid}@-moz-document url-prefix(){.pf{overflow:visible;border:1px solid #fff}.pc{overflow:visible}}}.c{position:absolute;border:0;padding:0;margin:0;overflow:hidden;display:block}.t{position:absolute;white-space:pre;font-size:1px;transform-origin:0 100%;-ms-transform-origin:0 100%;-webkit-transform-origin:0 100%;unicode-bidi:bidi-override;-moz-font-feature-settings:\"liga\" 0}.t:after{content:''}.t:before{content:'';display:inline-block}.t span{position:relative;unicode-bidi:bidi-override}._{display:inline-block;color:transparent;z-index:-1}::selection{background:rgba(127,255,255,0.4)}::-moz-selection{background:rgba(127,255,255,0.4)}.pi{display:none}.d{position:absolute;transform-origin:0 100%;-ms-transform-origin:0 100%;-webkit-transform-origin:0 100%}.it{border:0;background-color:rgba(255,255,255,0.0)}.ir:hover{cursor:pointer}</style>\n<style type=\"text/css\">\n/*! \n * Fancy styles for pdf2htmlEX\n * Copyright 2012,2013 Lu Wang <coolwanglu@gmail.com> \n * https://github.com/pdf2htmlEX/pdf2htmlEX/blob/master/share/LICENSE\n */@keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes swing{0{transform:rotate(0)}10%{transform:rotate(0)}90%{transform:rotate(720deg)}100%{transform:rotate(720deg)}}@-webkit-keyframes swing{0{-webkit-transform:rotate(0)}10%{-webkit-transform:rotate(0)}90%{-webkit-transform:rotate(720deg)}100%{-webkit-transform:rotate(720deg)}}@media screen{#sidebar{background-color:#2f3236;background-image:url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0IiBoZWlnaHQ9IjQiPgo8cmVjdCB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjNDAzYzNmIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDBMNCA0Wk00IDBMMCA0WiIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2U9IiMxZTI5MmQiPjwvcGF0aD4KPC9zdmc+\")}#outline{font-family:Georgia,Times,\"Times New Roman\",serif;font-size:13px;margin:2em 1em}#outline ul{padding:0}#outline li{list-style-type:none;margin:1em 0}#outline li>ul{margin-left:1em}#outline a,#outline a:visited,#outline a:hover,#outline a:active{line-height:1.2;color:#e8e8e8;text-overflow:ellipsis;white-space:nowrap;text-decoration:none;display:block;overflow:hidden;outline:0}#outline a:hover{color:#0cf}#page-container{background-color:#9e9e9e;background-image:url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBmaWxsPSIjOWU5ZTllIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDVMNSAwWk02IDRMNCA2Wk0tMSAxTDEgLTFaIiBzdHJva2U9IiM4ODgiIHN0cm9rZS13aWR0aD0iMSI+PC9wYXRoPgo8L3N2Zz4=\");-webkit-transition:left 500ms;transition:left 500ms}.pf{margin:13px auto;box-shadow:1px 1px 3px 1px #333;border-collapse:separate}.pc.opened{-webkit-animation:fadein 100ms;animation:fadein 100ms}.loading-indicator.active{-webkit-animation:swing 1.5s ease-in-out .01s infinite alternate none;animation:swing 1.5s ease-in-out .01s infinite alternate none}.checked{background:no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3goQDSYgDiGofgAAAslJREFUOMvtlM9LFGEYx7/vvOPM6ywuuyPFihWFBUsdNnA6KLIh+QPx4KWExULdHQ/9A9EfUodYmATDYg/iRewQzklFWxcEBcGgEplDkDtI6sw4PzrIbrOuedBb9MALD7zv+3m+z4/3Bf7bZS2bzQIAcrmcMDExcTeXy10DAFVVAQDksgFUVZ1ljD3yfd+0LOuFpmnvVVW9GHhkZAQcxwkNDQ2FSCQyRMgJxnVdy7KstKZpn7nwha6urqqfTqfPBAJAuVymlNLXoigOhfd5nmeiKL5TVTV+lmIKwAOA7u5u6Lped2BsbOwjY6yf4zgQQkAIAcedaPR9H67r3uYBQFEUFItFtLe332lpaVkUBOHK3t5eRtf1DwAwODiIubk5DA8PM8bYW1EU+wEgCIJqsCAIQAiB7/u253k2BQDDMJBKpa4mEon5eDx+UxAESJL0uK2t7XosFlvSdf0QAEmlUnlRFJ9Waho2Qghc1/U9z3uWz+eX+Wr+lL6SZfleEAQIggA8z6OpqSknimIvYyybSCReMsZ6TislhCAIAti2Dc/zejVNWwCAavN8339j27YbTg0AGGM3WltbP4WhlRWq6Q/btrs1TVsYHx+vNgqKoqBUKn2NRqPFxsbGJzzP05puUlpt0ukyOI6z7zjOwNTU1OLo6CgmJyf/gA3DgKIoWF1d/cIY24/FYgOU0pp0z/Ityzo8Pj5OTk9PbwHA+vp6zWghDC+VSiuRSOQgGo32UErJ38CO42wdHR09LBQK3zKZDDY2NupmFmF4R0cHVlZWlmRZ/iVJUn9FeWWcCCE4ODjYtG27Z2Zm5juAOmgdGAB2d3cBADs7O8uSJN2SZfl+WKlpmpumaT6Yn58vn/fs6XmbhmHMNjc3tzDGFI7jYJrm5vb29sDa2trPC/9aiqJUy5pOp4f6+vqeJ5PJBAB0dnZe/t8NBajx/z37Df5OGX8d13xzAAAAAElFTkSuQmCC)}}</style>\n<style type=\"text/css\">\n.ff0{font-family:sans-serif;visibility:hidden;}\n@font-face{font-family:ff1;src:url('data:application/font-woff;base64,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w93F7XP73QF30J3pznJ3dXdzd3f3cPd093L3dvdx93X3c/d3D3APdA9yD3YPcQ91D3MPd49wj3SPco92j3GPdY9zj3dPcE90T3JPdk9xT3VPc093z3DPdM9yz3bPcc91z3PPdy9wL3Qvci92L3EvdS9zL3evcK90r3Kvdq9xr3Wvc693b3BvdG9yb3ZvcW91b3Nvd+9w73Tvcu9273Hvde9z73cfcB90H3Ifdh9xH3Ufcx93n3CfdJ9yn3afcZ91n3Ofd19wX3Rfcl92X3FfdV9zX3ffcN9033Lfdt9x33Xfc993P3A/dD9yP3Y/cT91P3M/d79wv3S/cr92v3G/db9zv3d/cH90f3J/dn9xf3V/c393/3D/dP9y/3b/8UZ5kid7iqd6mqd7hmd6lmd7jud6nud7gRd6kRd7bd5c3tzePN683nze/N4C3oLeQt7C3iLeot5i3uLeEt6S3lLe0t4y3rLect7y3greit5K3sreKt6q3miv4iVe6gkv83Kv6tW8ureat7q3hremt5a3treO1/CaXstr9wqv9MZ463pjvfW89b0NvA29jbxx3sbeJt6m3mbe5t54bwtvS28rb2tvG29bbztve28Hb0dvJ6/Dm+BN9CZ5nd5kb4o31evydvamed3edK/H6/VmeLt4fV6/N+ANejO9Wd6u3m7e7t4e3p7eXt7e3j7evt5+3v7eAd6B3kHewd4h3qHeYd7h3hHekd5R3tHeMd6x3nHe8d4J3oneSd7J3ineqd5p3uneGd6Z3lne2d453rneed753gXehd5F3sXeJd6l3mXe5d4V3pXeVd7V3jXetd513vXeDd6N3k3ezd4t3q3ebd7t3h3end5d3t3ePd693n3e/d4D3oPeQ97D3iPeo95j3uPeE96T3lPe094z3rPec97z3gvei95L3sveK96r3mve694b3pveW97b3jveu9573vveB96H3kfex94n3qfeZ97n3hfel95X3tfeN9633nfe994P3o/eT97P3i/er95v3u/eH96f3l/e394//ihf8mVf8VVf83Xf8E3f8m3f8V3f830/8EM/8mO/zZ/Ln9ufx5/Xn8+f31/AX9BfyF/YX8Rf1F/MX9xfwl/SX8pf2l/GX9Zfzl/eX8Ff0V/JX9lfxV/VH+1X/MRPfeFnfu5X/Zpf91fzV/fX8Nf01/LX9tfxG37Tb/nt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jC3GLcZtxnbjLuNe4wHjYeMxY4fxpPGM8bzxovGysdfYb7xpHMTqqFVMikPxKgElVwkr05QZyiylVJmjzFMWKJVKjbJEWaasUFYpa5X1ykZlk7JV2a7sUHYr+5SDyhHluNKpnFLOKt3KJeWKck25rtxShkzIpDdZTC6Tz5RpCpqmmApNM03FptmmuaYK00JTlWmxqc603LTStNq0zrTB1GzabGo1tZl2mvaY9psOmY6aTpi6TKdN50wXTD2mq6Y+0w3TgBmYZbPRbDN7zH5ztjlknmqebi4yl5jLzOXm+eZF5mpzrXmpud7cYF5jbjQ3mVvMW8zbzO3mXea95gPmw+Zj5g7zSfMZ83nzRfNlc6+533zTPGgRLFqLyeKweC0BS64lbJlmmWGZZSm1zLHMsyywVFpqLEssyywrLKssay3rLRstmyxbLdstOyy7LfssBy1HLMctnZZTlrOWbsslyxXLNct1yy3LkBVZ9VaL1WX1WTOtQesUa6F1prXYOts611phXWitsi621lmXW1daV1vXWTdYm62bra3WNutO6x7rfush61HrCWuX9bT1nPWCtcd61dpnvWEdsAGbbDPabDaPzW/LtoVsU23TbUW2EluZrdw237bIVm2rtS211dsabGtsjbYmW4tti22brd22y7bXdsB22HbM1mE7aTtjO2+7aLts67X1227aBu2CXWs32R12rz1gz7WH7dPsM+yz7KX2OfZ59gX2SnuNfYl9mX2FfZV9rX29faN9k32rfbt9h323fZ/9oP2I/bi9037Kftbebb9kv2K/Zr9uv2UfciCH3mFxuBw+R6Yj6JjiKHTMdBQ7ZjvmOiocCx1VjsWOOsdyx0rHasc6xwZHs2Ozo9XR5tjp2OPY7zjkOOo44ehynHacc1xw9DiuOvocNxwDTuCUnUanzelx+p3ZzpBzqnO6s8hZ4ixzljvnOxc5q521zqXOemeDc42z0dnkbHFucW5ztjt3Ofc6DzgPO485O5wnnWec550XnZedvc5+503noEtwaV0ml8PldQVcua6wa5prhmuWq9Q1xzXPtcBV6apxLXEtc61wrXKtda13bXRtcm11bXftcO127XMddB1xHXd1uk65zrq6XZdcV1zXXNddt1xDbuTWuy1ul9vnznQH3VPche6Z7mL3bPdcd4V7obvKvdhd517uXule7V7n3uBudm92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')format(\"woff\");}.ff1{font-family:ff1;line-height:1.346191;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff2;src:url('data:application/font-woff;base64,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T92vHlAPqofUw+oR9ah6TD2unlBPqqfU0+oZ9ax6Tj2vXlAvqpfUy+oV9ap6Tb2u3lBvqrfU2+od9a56T72vPlAfqo/Ux+oT9an6TH2uvlBfqq/U1+ob9a36Tn2vflA/qp/Uz+oX9av6Tf2u/lB/qr/U3+of9a/6TwtpkAZriIZqmIZrhEZqlEZrjMZqnMZrgiZqkiZriqZqmqZrhmZqlmZrjuZqnhbWUmgptVRaai2NllZLp6XXMmgZtUxaZi2LllXLpmXXcmhxWrwW0aKarwVaTEvQErUkLaeWS8ut5dHyavm0/FoBraBWSCusFdGKasW04loJraRWSiutldHKauW08loFraJWSausVdGqatW06loNraZWS6ut1dHqavW0+loDraHWSGusNdGaas205loLraXWSmuttdHaau209loHraPWSeusddG6at207loPrafWS+ut9dH6av20/toAbaA2SBusDdGGasO04doIbaQ2ShutjdHGauO08doEbaI2SZusTdGmatO06doMbaY2S5utzdHmavO0+doCbaG2SFusLdGWasu05doKbaW2SlutrdHWauu09doGbaO2SdusbdG2atu07doObae2S9ut7dH2avu0/doB7aB2SDusHdGOase049oJ7aR2SjutndHOaue089oF7aJ2SbusXdGuate069oN7aZ2S7ut3dHuave0+9oD7aH2SHusPdGeas+059oL7aX2SnutvdHeau+099oH7aP2SfusfdG+at+079oP7af2S/ut/dH+av/0kA7psI7oqI7puE7opE7ptM7orM7pvC7ooi7psq7oqq7pum7opm7ptu7oru7pYT2FnlJPpafW0+hp9XR6ej2DnlHPpGfWs+hZ9Wx6dj2HHqfH6xE9qvt6oMf0BD1RT9Jz6rn03HoePa+eT8+vF9AL6oX0wnoRvaheTC+ul9BL6qX00noZvaxeTi+vV9Ar6pX0ynoVvapeTa+u19Br6rX02nodva5eT6+vN9Ab6o30xnoTvaneTG+ut9Bb6q301nobva3eTm+vd9A76p30znoXvaveTe+u99B76r303nofva/eT++vD9AH6oP0wfoQfag+TB+uj9BH6qP00foYfaw+Th+vT9An6pP0yfoUfao+TZ+uz9Bn6rP02focfa4+T5+vL9AX6ov0xfoSfam+TF+ur9BX6qv01foa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tyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923JfVty35bctyX3bcl9W3Lflty3JfdtyX1bct+W3Lcl923J823J823J823J823J823J823J823J823J823J823J823J823J823J823J823J823J823J823J823J823J803F803F8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8+3D8xX7fMU+X7HPV+zzFft8xT5fsc9X7PsV+37Fvl+x71fs+xX7fsW+X7HvV+z7Fft+xb5fse9X7PsV+37Fvl+x71fs+xX7fsW+X7HvV+z7/fV/v7/+7/fX//2Sfr+k3++v//vV/X51v1/d71f3+9X9fnW/X93vV/f71f1+db9f3e9X9/sl/X5Jv1/S75f0+yX9fkm/X8fv3D/4Z//i//5X//zdv/jj8fvjUX88+o/H/PHYPx754+Fznj8e77995I9Pzh+fnD8+OX98cv745Ow//H/+9Dd//Y//6u/+5d/8g7/+qz/9+fG3/+eff/Lv/O0//5s//fln//D/+Ou/+5t/+/rLf/Nvf+9f/+X/9eff+9d/+jd/+qs/P//0l//sn//tn3/xr/7yjw/887G/r/Df/cf/+u/+1Z/+5i//+m/+nX/ve/773/M/+J7/4ff8j77nf/w9/5Pv+Z9+z//se/7n3/O/+J7/5ff8r77nf/09/5vv+d9+z//ue/733/N/+J7/4/f8n77n//w9/5fv+b9+z//N8x/+f/9Nv7/4i/Yar/WK13k9Xu8fr99feP28ysuNnxs/N35u/Nz4ufFzo9woN8qNcqPcKDfKjXKj3Cg32o12o91oN9qNdqPdaDfajXZj3Bg3xo1xY9wYN8aNcWPcGDfWjXVj3Vg31o11Y91YN9aNdSNuxI24ETfiRtyIG3EjbsSNc+PcODfOjXPj3Dg3zo1z49x43HjceNx43HjceNx43HjceNx43HjdeN143XjdeN143XjdeN143Xj/uPH3OXr9vMqrvcZrveJ1Xo+XGzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6fyn85/Ofzr/6bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOS+el89J56bx0XjovnZfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z567x13jpvnbfOW+et89Z563x0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OR+ej89H56Hx0PjofnY/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56nx1vjpfna/OV+er89X56jw6j86j8+g8Oo/Oo/PoPDqPzqPz6Dw6j86j8+g8Oo/Oo/PoPDqPzqPz6Dw6j86j8+g8Oo/Oo/PoPDqPzqPz6Dw6j86j8+g8Oo/Oo/PoPDqPzqPz6Dw6j86j8+g8Oo/Oo/PoPDqPzqPz6Dw6j86j8+g8Oo/Oo/PoPDqPzqPz6Dw6j86j8+g8Oo/Oo/PoPDqPzqPz6Dw6j86j8+g8Oo/Oo/PoPDqPzqPz6Dw6j86j8+j8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX5+8fnddf/NH5379+XuXVXuO1XvE6r8fLjZ8bPzd+bvzc+Lnxc+Pnxs+Nnxs/N8qNcqPcKDfKjXKj3Cg3yo1yo91oN9qNdqPdaDfajXaj3Wg3xo1xY9wYN8aNcWPcGDfGjXFj3Vg31o11Y91YN9aNdWPdWDfiRtyIG3EjbsSNuBE34kbcODfOjXPj3Dg3zo1z49w4N86Nx43HjceNx43HjceNx43HjceNx43XjdeN143XjdeN143XjdeN1w2d83DFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxc8XDFwxUPVzxcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUFVxRcUXBFwRUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF1xRcU3BNwTUF174Vrnm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGah2sernm45uGahxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGhxsebni44eGGh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh1sebnm45eGWh/v7X/uLf/RP/unf/e2f/ulf/8v//R//i7/+p//CP9Q/+md/80/+zf/PP7imeDJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJuybgl45aMWzJu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Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPhjoc7Hu54uOPh/v7V/y8x2XVRAAAAAQACAAgAD///AA94nDXSyU9TURQG8HPuu8jG1T25m9u40q0LRdeCgpqYuFTmeZ7cacI8z/4JAu4FV5oIhEAppZRqjFEUnBgUmRQFRxy/NrHN+/LLafve6TmXmIgOEvFFvkSKThLzE1zz/JQ8fsYL8CI/h1/wS/gVv4aXeBle4VX4Da/B73gd3uBNeIu34ff8Ad7hj/An3oX3+DP8hb/C3/g7/IP34Z/8C/7Nf+C/ishTrJhY4QXjDWt1AI5XN+B+1Q8PqAF4UA3CN70UYu+sd44877y+RayH9BB5elgPw7f1CDyqR+Ex7Yen9BQc0Jvwlt6Ct+Nw/7h4c5XYXDN95JnrcphYjkg1eXLF4rd2zOK/2yU3QewmXYQ8d993jNh33JdAnu/EIdRJY5oqdqXHeog+/Q7yrr6HZ42gk/89BPRD5LxeQC7qJdSX9TK8olfgVf0WXtPr8Easz22NeeodvQvv6T14Hz2zqTE1yFpTS8rUmTq43tTDDaYBbjSNcJNpgptNM9xiWuBW0wq3mTa43bTDHaYD7jSdcJfpgrtNN9xjeuBe0wv3RSeDmRwlJQlyCpkoiZhSkiTBp+UMPk2WZFRSJAWVC3IZmSqpqKRJGpwu6XCGZMCZkonvZ0kWKtmSjUqO5MC5kgvnSR6cL/lwgRTAhVIIF0kRXCzFcImUwKVSCpdJGVwu5XCFVODOlVKJSpVUoVId3aMdt+PY44TFpqzf+pEBG0AGbRAZsiFk2IaRERtBPrCPkI+x9+jGJ5F+5yflphzOjwu4ADztpuGgC8IzbgYOuRA862bhsAvDc24OjuDMqNhp4X/LB73PAAB4nN1aCXgVRbY+vd0LEQJ01emq28kFJIGwBEWWgGxJ2EGWEPZ9CQTEQMIyiuyrIKACRnEBQUBUFJVtVGZ0FBFCQEUeIIMIjDqKC4vsIsurPt2yqTPzRuebmZf+vv9Uqv7qqv77nNPVfQs0AIjRauoZYPYbMXQYuFn3jsiBmoNGDLwL+uf0GzUM5oCpOHD5MhQBHUIKY+AmKAalwFYlrUNmo7LKeu0lFE1THOMaVnGIVfUlif3jeUpexyv6M0wHjJYZGS2gfma7NmUhs2PmHWVh9E/6hn92FH+m17fb1/U1/2bfH1nWL7JYVvWRWTAqq1/OKBiT1W/kQJiWlTU0D2YRLiFclz2iXxYU5Nw5qB/szBn2u6GwNyc3KwcOqOII+DzXq/k6z8PjI4dm5cGZkSOr3QYXFFbXTIU1tJiRv8sbqZUcpTiaQ3NiCg2ljQBJ/yvVlXq+GuaV+RZVtUWuqb227kaeoa7NuzLvbBFCmxAIbyIsReirwhXq4EIc/RdPGCVEwhJQHlpDR+gJAyAHRsEUmAXz4QlYCithDWyAjVAIO2EffApfwwk4r+laMc3VKmrVtDpamtZCy9C6an21wVqeNlqbRPPQtPrkN5rWGUKaZ3f4Vl+irkNZI4esGZoSTgtfKnLKry26X81T2Zi5fm+20beRW/yzRhoGdkhgR/j9ImMCOzeoXxHYw4E941vXDGxwntJdfZuQSf31hO4Jhf68EtuWd8ofqPCi/19STlJhxYoV5/ijVPzU71VpYWB3BfZAYNWo3rVWOuHbysGolWN9W6VYYEsHtkJgL6mrt9UYA/EtyMY3zXXmetUS0nZpe7S92r646nE11P93K01ioSI0UvfLUB4RCxw3g24exE2g41u4UeGbV1q2U0shtRRc2yLWgS5Wi7VqzIFijcLsKy2vUsvvqWU9tWhgerMRL4tXFMv3OA38+XtoQhN7B38SV6pyD3OV+bL5irnaXGOu9XqZG8x95sfmfvMT84B50Dxkfmp+YX5pHja/NY+YR82T5nnzB/OCedG8ZF62wNIs3TIs07KskD3GHmdPsCfZU+xp9n32THsWS2NNWFfWnfVifVg/lsUGskHsTpaDb3pXjptwMxZgIW7H9/ED3IEf4k7chbtxD36Ee/HPuA8/xv34CR7Ag+7b7jvuu+4Wd6u7jZS9el0uXVcZisamfPR/9TVpKpKv5oeyChtedy3XXse/4Bp+MiNdZZgyUEfNpYE6XEhVRxykqyMeGkNzlZe6QXcoZ+wx9kCiFbZioLxV3CoOlawSVgmobJWySkEVi1kOJFtxVhxUs1paLeE2e6w9Fqrb4+3xUMOeaE+EmvZkezLUsqfaUyHFnm5Ph9r2DHsG1LHvt++H2+3Z9myoaz9gb4B6TDIJd7J4VhqGsASWCkNZOkuHWawpawqzWXPWBeawbqwbLGI9WA94ivVmvWEx68v6whLWn/WHp9kANgCWsmyWDcvYYDYYlrMhbAg8w4ayobCC5fIkeJZX4pW0vrwKT9b68Vv5bVoWr8lratm8Nq+tDeINeKo2mHfgHbS7+AA+UMvhw/gwbRgfzodruXw0H63l8fF8gjacT+JTtZF8N9+t3cP38j9ro9FAQxuDFlraWAxjWBuHLrraeIxiVJuAS3CJNhGX4nJtEj6Lz2lTcSWu1KbjKlyl3YdrcZ02Aw/hl9r9eASPaPPwonOPNl/cK17Si4uN0tIbyxKyhD5DRmVUnymTZJJ+v0yT6fosuVAu0ufIxfJp/UH5nHxOnydXypX6fLlartEfluvkev0R+Zp8TV8g35B/0h+Tb8u39SflZrlZXyi3yg/0RfJDuVNfLnfJvfoKeV6e11+Ql+Vl/cVI80hLfVWkU6ST/kqkR6SXvjrSJ9JXXxfJjmTrv4/kRHL0VyPDI8P11yIjIyP119217uv6Bneju1F/293kbtI3upvdzfo7boFboG9yC91C/V13u7td3+zucA/oW+LaxbXT91B0lL4mOm6mPHfKPG2eNc/RE9P3VM8jXauoVRTiyRej5IulyRfLKF9kUFaJj3AzeWQ58sgE8q1E8q1M8q0Oyg8SoTPdrWJ0t4rT3Yqlu1WC7lZJuhOl6B5EvHug5Xv3QCukK4yl2SPNPvEnefi/bfZ/S3sNhqjskKqyQmNoAk2hGTQ39qhsUMSKsbjlsARenlfgSSqmVDypaKrGb1PRVFtFUUOeqqJIRRD3Yme0FzMqYibzKXyqihkVLyoeluIyXO7FgoqEVV4E4BHl41Hl28qvPa9WPr1EPq18eqXny54nKz9+Q74p/6R8eLPy3UK5TW6X78n35QeeDysP3i33yI/kXuXFl5X3toi0VN7bI9Iz0svzXOW3OcpfR/6de/b/96q9VefVe11OeadmfmjuDtal/8l+qoXvg+PaF9q32gntnHZJN/UYvaTu6PF6Ob2ifoteU6+rp+nN9NZ6pt5V760P0Ifoefrd+jh9ij5Tf1DP15/Ql+gr9Bf1Nfpr+pv6Jr1Q36Hv0ffrn+qH9aP6Kf28AUbIKGbYhjRKG4lGZaOakWLUNxoZLYy2Rkeju9HXyDZyjBHGaGOCMc2YZcw1HjUWGkuN54yXjHXGBuMtY7Ox3dhp7DUOGJ8bXxvHjTPGBVM3i5ixJjdds6xZwUw2q5t1zIZmE7OVmWF2Nnua/c3B5jBzlDnGnGTeZ84x55uPmU+Zy82Vam3we/OP5kazwHzf3KXWB4fUuuBb84R5zryknv8xVknLseKtclZF6xarplXXSrOaWa2tTKur1dsaYA2x8qy7rXHWFGum9aCVbz1hLbFWWC9aa6zXrDetTVahtcPaY+23PrUOW0etU9b5EIRCoWIhOyRDpUOJocqhaqGUUP1Qo1CLUNtQx1D3UN9QdignNCI0OjQhNC00KzQ39GhoYWhp6LnQS6F1oQ2ht0KbQ9tDO0N7QwdCn4e+Dh0PnQldCOvhIuHYMA+74bLhCuHkcPVwnXDDcJNwq3BGuHO4Z7h/eHB4WHhUeEx4kvLCMvYcwrGE4wknEk4mnEo4nXAG4f2EsxUmUN8E6ptAfROobwL1TaC+SdSaRMyqAY4lHE84kXAyoeLbK71WhR6zRoBezZoAvZraAXrnqU/l+vYYwnGEEwgnEU4hnEZ4H+FMwlkK06hvGvVNo75p1DeN+qZR3ybEaRXgGMJxhBMIJxEqpr3Xa1XoMTMC9GoOBejVdAxQ1bBQgKqGxVI51r8XLImwkqchlROonETlJCpXpXJVKlejcjUq16ByDSqXMd9VWJbOWdZ8X2E5Kpfzy2ahd+YA31NYgVormNu8UaimEtVUIn5lKlf2y9SrCtUk+0j1yVRfjWqqUc1tVK7uI9VUJ04NcxPhe4ReTU3i1CKs4yPx65urCb33tTQqp1G5FZVbUbkNldtQOYPKGVSuTwo0oLM1oLOlUjnVL9O4aQF6M2lMrY1JgSZU04xqmhG/OZWb+2Xq1YJqWvpI9S2pvg3VtKGatlRu5yPVtCNOBimQQaNkUE174mQSdvKR+I0DHU6C7tj4R8J3CN8l3EL4BuFWwm2E6sxOCvFTiJ9C/BTipxA/hfgpxE8hfi7xc4mfS/xc4ucSP5f4ucTPJf5yc52H3ru3wk2Em6l+PZULCAsJtxO+SfgWcQ6q9+2wdwYR9s6gcBPhZqpfT+UCwkJCdQaRTPxk4icTP5n4ycRPJn4y8ZOJn0f8POLnET+P+HnEzyN+HvHziD/FU0DhO4TvEm4hfINwK+E2QqWAyCd+PvHziZ9P/Hzi5xM/n/j5xF9B/BXEX0H8FcRfQfwVxF9B/BUeX/nYA/Z8ADvfXgAh+3H7CYixF9qLoZj9tP0clLRX2atA2i/bqyFir7fXQ7z9qv06RO0/2G+p2N9ov6vieotdoOK30H5PResOe4+K0I/tj1X+/MQ+qGLtM/szqGf/1f4S6rOirCikspvYTZDGSrFSkM7UHzRiL7MN0JjtYrugHdvDPoIMto99rFYen7BPoCM7xP4CndgX7Avowr5iX0NXdoQdg+7sO3YCerHT7DT0YWfZ99CXa1yDLG5wAwZwtbSDgTyGl4BszjiDHI4cYSh3eRwM4515N8jjPXk/GMWn8Wkwht/HZ8BYPovPhvH8Af4ATORz+TyYxBfwBTCFP8GfhKl8MX8apvNlfDnM5M/yZ2EWf56/ALP5Wr4WHuTr+Xp4iL/KX4W5/I/8bZjH3+XvwgK+hW+Bx/h2/j48znfynbDQYY4Li5zaTkN4xslz7oFVzjPOy7BeFBEl4C1RVdSEAjFcjIYdYqqYBXvFI2IhHBLPipfgMGjWELCgpFZOr2k0M7uqFWBdaAStIFOt8/qrle4IGPN3vzSCFtKKRb4EI7JNHV+QLYz8lezWyOdkCyKfkd0S+Yuyhap0iGxh5CDZrZEDZAsin5DdEvlY2a2Kt49sYeTPZLdG9pItiHxEdktkt7IFireLbGHkf8hujewkWxD5kOyWyAfKblG898kWRt4juzWynWxBZA/o6r/9CgsjnyrcFtmhsOCfV8Q1fEVc3VfE1XxFXAgUuRwocjFQ5EKgyA+BIucDRb4PFDkbKHImUOR0oMipQJGTgSLfBYocDxQ5FihyNFDiSKDEt4ES3wRKfB0o8RXZLZFzpMUl0uIEqXNY4ZZfoUiZQJHSgSLRQJF4XxE3zlfEjfiKuNJXxBW+Iq7jK+Kir4jLfEVc21fELeUr4Zb0lXBL+Eq4sb4SbnFfCbeY7xvuTb4iblFfEbeIr4gb9hVxQ74iruUr4sZ4HuFyTxfX9XRxzV+pSL1AkbqBIrcHitQJFKkdKFIrUKRmoESNQInqgRK3BUpUC5S41fcN95ZAkaqBIlUCRSoHilQKFKkYKJIUKFI+UCQxUCQhUKRcoMjNgSIVSJFkzzvcFFKk7K9UpEugROdAiU6BEh0DJToESmQGvtE+UCQjUKRdoEibQJHWgSJ3BIq0ChRpGSjSPFCkWaBI00CRJoEijQNF0gNF0gJFUgNFGgaKNAgUaUSKtCBF2pKn1CdF1Nu01//KtwXvNyMz/lHQi6erkma1U4zSUOzqL2HAAf1fpKwK7EXVaqi3y7EAVnmrPMSwF9gLcJP3y4Pxhndu1c//5er6/w36ZUmj36G8Vq+kWtWb6O6gVV5pvVr/I6+CmsvPzCd+XvzD8Y/FPxG/MP4p7/crY5wxXr31TjQmGZONKcZU9f47PX5u/Pz4BfGPxz8Zv8ib1eXLHt7QM3T5EtXOV7WPq9pFqvaXR72eZfpqqHHmQYwa6TEopsZa6M3bmKK9iSfxLP6AZ/Acnsej+JT9lf21/Y39rX3EPmofs4/b39kn7JP2Kfu0fcY+a5+zv7fP2z/YF+yL9iX7MgOmMZ0ZzGQWC7EwK6JWGzFqrVGMFWexrAQrqVYctlpucIbMYS4rww/xv/BP+Wf8c/5X/gX/kh/mX/Gv+Tf8W36EH+XH+HH+HT/BT/JT/DQ/w8/yc/x7fp7/wC/wi/wSv4yAGurqMNURUkcRLIoxeBMWw+IYiyWwJJZCG5ladiA6KFBiRB1xGK+O0lgGy+LNWA4TMBHLYwVMwopYCStjFUzGqngL3orV8DasjjWwJtbCFKyNdfB2rIv1sD42wIaYimmYjo2wMTbBltgK78DW2AbbYjvMwPaYiR2wI3bCztgFu2I37I49sCf2wt7YB/tiP+yPWTgAB2I2DsLBeCcOwbswB4fiMMzFPByOI3AkjsLf4d14D47Ge3EMjsVxOB4n4ESchJNxCk7FaTgd78MZOBPvx1k4G+fgA/ggPoRz8VFcgI/h4/gEPokLcREuxqbYDJtjC5yH8/FhzMdH8Bgex+/wBJ7C0/g9XnC+c044J51TzmnnjHPWOed875x3LjgXnUvOZQFCE7owhCksERIlRSlhCya4QOEIIaSICFfEiXgRFaVFGVFW3CwSRKIoLyqIJFFRVBKVRRVRS6SI2qKOuF3UFfVEfZEm0kVj0UQ0Fc1Ec9FCtBStxB2itWgrOoiOopPoLLqIrqK76CF6il6it+gj+op+or/IEgPEQDFIDBZ3iiHiLpEjhophIle2knfI1rKNbCvbyQzZXmbKDrKj7CQ7yy6yq+wmu8sesqfsJXvLPrKv7Cf7yyw5QA6U2XKQHCzvlEPkXTJHDpXDZK7Mk8PlCDlSjpK/k3fLe+Roea8cI8fKcXK8nCAnyklyspwip8ppcrq8T86QM+X9cpacLefIB9yj7jH3uPude8I96Z5yT7tn3LPuOfe8+4N7Ia59/CPRatHbotWjNaI1o7WijaJ3RFtH20RV1gu+EQJ9I9ToG6FO3wgN+kZo0jdCi74RhugbYZi+ERahb4QpLJ7FQ236RljH+yUFjvL31Ur3hPdFEM7iRacUXHbinFoad1KdYdqt9F2wj7vD3actc/e7B7SXvO+C2ur4/Ph8bU20fLSytjaaHk3XXo82jjbTNqgMsVk7dE1+OBZt9K/ND2ioCw6ji1FsQHnic5UhvvEilx9XUXgLZYWzKiOoXBBkAvMfzAFxfyf2fxr5t6v7VUvF/dWI/zGe/tMi/2p8P6ryVb0rGeApXKzy7WeUab0s6+XYY/woLvBzLD6uMuw5fh4bevkVU1V29bODygziXjFGjBXjxHgxQUwUk8RkMVvMEQ+IB8VDYq6YJ+aLh8Ui8ZRYLJaIp8VSsUwsF8/8bD754VdklHL/QE5pIBqKVMosjX42t7RR2aWdyBDtReZ1WabbL+aZ7N8o01yfZwb8FpnGyyT8cLQ6Pva3c47KNFezTE0r1lJrF6ukVVJlGduyVZZRr+oqyziWo7JMxHLBsv9gH4Ywi7AI1GLz2XyVX/JZvsovj7JHoQ57nj0Pt9Nqqi4vzytBPV6FV4E0XpVXg3RendeCprw2rwsteX3eHNrwlrw9dOMdeBb05wP5UBjJR/LRMI6P4ePUm/0k/rB6p39Evd8/zhepnLWE7+b7YA/fzw/AflyCy+AgPoPPwmf4PK6EL/BFXAuHcT1ugOP4FR6BM05Rld1+cKqq7GY62Sq7FXdGOw9ojjPPeVFLdl5xPtRaOLudI9oQGZIttanyITlX2yLny/naVrlMLtMKI10jXbVt7kH3K227+417RPsoLiMuQ9sXvTV6q/ZxtHm0lbaf1omv0TrR/13HCFalP64TvdVgCbzkbY5ydEe9BznxThSKOGWcchDjtHbaQKzTzsmEkk4npxtwFR2nIKJi4zzEe94PNyvvF5DgeSwkKY9tDZU8P4Wqyk+7wa0/Ox7/xfESnQpqvIpOMpSisR0aWzq9nD4Q7/RzBkIZmkEizSCJZpBMM7hFxV4cVFeRVw5q0Wzq0WwaqOjoA+kqNrKhyTW/+E2huSSo2dj4OX4OoFYUp0BTz5wioDsx6t7EqidPsprBLU4tqKiePwOhmjPIGQZdVI64CH1UNghBjsoB5WCUivAqMEPFdTt4SF19NqxU0ZcLb6kMNBkKVNZ5GHaoTPMM7FXj3fSPPzHpORhWK9xT6h5ddO5RqnwnXoI5pOqUa37D+++9Dn9HnA7TYOa/6Up8n/xtrubH6+D/tvvyW14NUNxqkEjnNBzbcVXUpjgNoaiTq5gqC0PR//NI3hglyIMTr3kj/a3P7u+39N4xK//i+X2t/vkx/LP7+zr/VWP8mK+S6UyJtKM0XT25Hub/g8vwWVwrV8t1cqv8ULW0hAZX9ypAP/sDe8eVPQpVaX9CQ57O2/JM3p334L15Fh92w+6E6d73bP4oX8Af4497X6/Vs+0pvpgv4U/zpd4XbL5OrdD9PQwrcRXtUPD2JGymvQhX9h9Emkd60J6D4d7zB4p6CtDzDrznnSqr5x3YziXl4XFqfVQFEtV6JVc9M+5V/pyi1mkPQ6pamz0DLVTPGNDVe4K//69Qez6oibKyN9SUZjdfUxMLJiuHf+AL8QXaEXks2BFJXBjA772yn9CL2VRWmSWy8qwCS2IVWSVWldVgNVktlsJqszrsdlaX1WP1WQPWkKWyO1hr1oa1Ze1YBmvPMlkH1pF1Yp1ZF3usPd6eaE+2p9rT7Rn2/fZsls6asm6sB+vN+rL+bADLZoPZEDbU3ehucje7BW6hu51VYd69TdVD/+adgJ5izVkL1pK1umEfTCi2F1y7R+QJaGUVxZNO0RuOqjcc2Tccl64/1J2//hh0w3HvDcfsG45F1x9e3rs211KW1Sm/xlBmtSmnupRNy1EGrUwZtDpl0LqUQRv5X+eMPSyBJ/N8vguX43O4Tq6R62Wh3KnUKAbpmv1zEfi/pj1irAAAeJzsfQ28T1X29977nPN7u++/c87vd+4lJMl7kiRvSboh729JCCFJkiTFIMmojEwZSWVkjIxexkhGMpIkSUZCkiRKRpLKSNK9zz7fte/dmzvNzH+e+T/P85/nfu7nLNv+7bPPfllr7bXXWnttxhljCTaSrWL2gFG3jmAFN949ajirdtOowbewxsMHjB7BCpkty7DiYpTk3bq2qiL/Df8vZA4v/ZX+l2JW286d27BU104dqrBU967XSGj8Lm4dMOoWln3rLbfewlrKnDTlMkvW47AIi7IYi8v6M1gmy2LZLIflsjyWZC7zmB/WJEumWcDyWQFrxFrI1nVkPVk/NoSNYGPYBDaVzWCz2Ty2iL3AVrA1bAPbwnayvewgO8pOsCK0lg87Qv/WWkj/Vj5N/77D6N9DC+hf/in9e+9U2aawnXPo/041+nfZVPrX7ql+n0T/F4fo36vm0r/WZPq3Zyv6N2M+/dtQ1c960b9zMtX7CVVfY/X7JhaRw8dzZrOInDCeCljEkv9GW2D8ecee9G+tgfRvZCraMkbCqRjHiqwqq8HqsYasiRz1QtaedZXf7McGyW9Vl2PM7eMhFFcDVkDOSiN93Ej/EemKRplzS9NCjtkGvg1t5u4VLMSuCCD7L7SoFcbg3wPPaJGw/2aLpv3DFjVHff8EVPWyv1PGbJGwX7PXgTIkRUlMP+P9f7p1z6Luq43vUPrZMt8vm0Mlr/+J1r1n7/gHrXvwH7buFtQ9HPAWAw4vmy5aEKYBzXwNzdZZ9gn7e7dQ8gMm+QST/IFJnnBmG/9rLR0ObP73QN1SmXKvdtsx4i1J+QTyqSSfan+ztf+1Nv8GY9MN8HID/uafyLn8rHfPaLP9rpx7JnkyA9etKJ+q8qkhn3p/p91m6/f+++hK/OIfljFxo64QwrFX2H+0V9ov26vtP9lr7FfttfZ6+w17g/2mvdF+y95kv21vtt+xt9h/trfaO+337V32B/Yn9gH7U/sz+y/2Yfsr+5j9tf2NfTw53W3lXun2cW9xR7C68gsr5LNaPuvks1E+W+SzXT675bNPPgflc0Q+38jnpHyKwkVCPpKOeG7IwOUjR5TLEeVyRHm9cDGQTxP5tJRPoXzay6erfHrJp598BslnmHxGymeMfMbLZ7J8pslnhnxmyWeufObLZ5F8npPPMvmslM+afzhj/59B/imfihUik13I+kvpYTgbxcZK+WGKpLmZUoJ4ki1gi6UMsVxKRmulFLGZbWO7JEZ/yg6zY1KSOM0Fj/Fs7vECXoVX53V4A96Yt+CteTvemffkffhAPpSP4KPDL4Yc7SzY1YAtDFilTI4AXAE40oBUTy3AFGAf49cWRv0jf+JdwB+PlvluFaNkLSM/U6d/PKmhyjdhFeMrVYx6+pzxLcFyJJ3K9UXYwpEEssJ+WXL11XJFjEpK3cqyJVV+wCpImvyEVZZ0+RmrEtIlO09S5jfs/OT05HRWM6RMVkvSZh9WR9LnLayuO0JSab3/5tovlFi0Rj7r5bNJPlvls1M+e+SzXz6H5HNUPsflc4rQjkfkkykfuQZwuQZwuQbwavKpJZ/68mkkn2bykXILbyOfjvLpLp/e8ukvnyHykasgHyWfsfKZIJ8p8nlQPjPlM1s+T8pngXwWy+cF+SyXzyr5rJXPBvlsls+2MhThlclJGNAz0savxavOfqt410/U9ndh8RHALQY88k/XY7azhgErlclJGDWXfatSaQ7WLl7lH65dd2Otv60MbP4T+X8PmmtXR/4+/5B/zA/wQ/wIP8aP85P8tNwgXZ0cl/xZcmLy3uR9yfuTP08+kHzIreae71Z3L3BruDXdWm5tt45b173Ybehe4jZyL3Ubu5e5TdymbjO3udvCvdy9Ssohbdy2bjv3Gre928Ht6HZyO7td3K5uN7e728Pt6V7rXude7/Zz+7sD3UHuEHeoO8y9tWBdwfqCDQUbCzYVbGYhTv73rVKMS3rikp64pCcu6YlLeuKSnrikJy7piUt64qcYhFIh6UlIehKSnoSkJyHpSUh6EpKehKQnIelJSHoK9wFC0pOQbReSnoSkJyHpSUh6CqVKIelJSHoSkp6EpCch6UlIehKSnoSkJyHpSUh6EpKehKQnIelJSHoSkp6EpCch503sks9e+Xwqn8PyOSafE/I5LTessrFW7P/2ilcO/12Q10F6dgitEIu4NVdyi2vYHDaPLWRL2FIpH66WsuFGKRdulzLhPikPHpGy4ElWxG2e4Lk8xSvyqrwGr8cb8ia8JS/k7XlX3ov344P4MD6Sj+Hj+WQ+jc/gs/hcPp8v4s/xZXwlX8PX8018K9/J9/D9kj8cldzhlJCUIDJFUgSikqgmaon6opFoJlqJNqKjxHcOKjwb9gPsbsCWRv4LRkmzBsqfeTaUlMVBcxq21vmq5oUGpNpWlqnZhAuN9D7AzWV6MVXni4pIHzcg1b/OSHc36lmpoRhzdo6ZX/ZX6uMZ5acacHyZUZpr9GiuAc12jjfatvms1l7z37YmXCFXhX99Nfh/t2XXsP8Tu6r/lPXqX+CExe/9RP7+f5270rt/vwYlLR4pk7Pr7761S7dZpQmSvHlCp1X5j8qU/N+G/+KY/J13zZXIbmRJ3u1ky5VomNyJ7JG7kENyB3KcneJy58EzeZIHvBKvxmvx+rwRb8Zb8Ta8I+/Oe/P+fAgfzkfxsXwCn8If5DP5bP4kX8AX8xf4cr6Kr5Wy6Wa+je/ie+W++bCk8hOSxoWIiWzhiQJRRVQXdUQD0Vi0EK1FO9FZ9BR9xEAxVIwQo8U9YpKYKqaLR8QcMU8sFEvEUrFCrBbrxEaxRWwXu8U+cVAcEd+Ik6LIsq2ElWulrIpWVauGVc9qaDWxWlqFVvu/zaEVTx0F2M+AJjelkkOZXkkOG3Cq8dbhMlx5n8Gtzbd2AhZhNRgIWLFM20YZ5dFOASlQNDHKF5VpFdKSR2i4u0yOmV/210ln56jWbj4billl4IM6TWPyN9a6snCdAc38ojLjZkDJe/5xzoPG7GCmrFo/Afv8BDz9t+EZuFH6RUkh4bcmn53PhkmZa7fE//38c/4F/4p/y7/jP/BiKXnNE/OtQvt5+/f2UvsP9jL7RXu5/ZK9yt5tf2jvsT+y99of2/vs/fZB+3P7kH3E/tI+an9rn7J/sE/bP9pFdrHDHO4Ix3Jsx3EiyXuS45MTkpOSk5NTklOT05IPui3d1m4vt7fb173BHeDe6A52b3Jvdof7a/y1/jp/vb/B3+hv8jf7W/w/+1v9d/1t/nZ/h7/Tf9/f5X/g7/Y/9Pf4H/l7/Y8LXit4veCNgjcL3ip4u0KDChf/x/YrXNGXyGepfFbIZzWwk/GN8tkin+3y2Q1aY/ygfI7I5xv5nATOMmHLJyGfXPmkQKtMVJVPDflIqUI0BBUz0VI+UqoQUqoQUqoQUqoQUqoQUqoQsg1iJKRHJqRUIaRUIaRUIWaAvpiQUoWYLx8pVQgpVQgpVQgpVQgpVQgpVQgpVQgpVQgpVQgpVQgpVQgpVQgpVQgpVYhTDKYPS0oVlpQqLClVWFKqsKRUYVUDVTBLShWWlCosKVVYUqqwpFRhSanCklKFJaUKq798pFRhSanCklKFJaUKS0oVlpQqLClVWFKqsOTqYkmpwpJShSWlCktKFZaUKiwpVVhr5SOlCktKFZaUKiwpVVhSqrCkVGHJXbAld8HWCVAcs6UIZMfkky0fTz4F8qnyd9c/0v+YmhxaEU+UKfNTNdQoU/6fWXFJGiAJo9k/Ub6M1KJW/RNl2uz9W+G/JE/8b71r9O7vj94/VVuNMq36d/Wx0pk5ppxk5icmx6TMl3iQZfLgv1t+sbpavax+1iBrmDXSGmONtyZb06wZ1ixrrjXfWmQ9Zy2zVlprrPXWJmurtdPaY+23DllHrePWKZvZETvTTtqBXcmuZtey69uN7GZ2K7uN3dHubve2+9tD7OH2KHusPcGeYj9oz7Rn20/aC+zF9guSZ6+y19ob7M32NnuX5Nmf2oftY/YJ+7TkzDEn2/GcAqeKU92p4zRwGjstnNZOO6ez09Pp4wx0hjojnNHOPc4kZ6oz3XnEmePMcxY6S5ylzgpntbPO2ehscbY7u519zkHniPONc9IpitiRRCQ3kopUjFSN1IjUizSMNIm0jBRG2ke6RnpF+kUGRYZFRkbGRMZHJkemRWZEZkXmRuZHFkWeiyyLrIysiayPbIpsjeyM7InsjxyKHI0cj5yKsmgkmhlNRoNopWi1aK1o/WijaLNoq2ibaMdo92jvaP/okOjw6Kjo2OiE6JTog9GZ0dnRJ6MLooujL0SXR1dF10Y3RDdHt0V3RfdGP40ejh6LnoiejolYLJYd82IFsSqx6rE6sQaxxrEWsdaxdrHOsZ6xPrGBsaGxEbHRsXtik2JTY9Njj8TmxObFFsaWxJbGVsRWMx5yOgmfBHwYsB/gekBYsK3WgDMBPwphuC5I2As5C3QZuz/S7wOuAhxkpOcCuoA/A1wBOA3vvoP0EMDBgFcZ7UEL7V8h/abRtv26PdZCo7XwCbCeAHwF7+5AuqDM19836hxmjAb190rAScYXr9LjQDWrr8M2Ha448lsDjJqH6pLWu8aYdDJaMh1vwePDugnplkjvBJwD+DXyMRriC6RzAZsCnm+0fIrR/isA/6Tbb/8Z6XaABwBXAm43Wv7RT7S5n9Hm+1G+mW6ztQXw18h/z4CZgChvTQa82ZhxmrUqyHENHCg4G9PsPYAfAJ6LMm8hzY3Wvq7HU+U0N7AC/lvWtcavhLcO4HlG79YCbgRcA/ilMbaTjdHop/HHrmKUGWl8pZ3RBpqXx9CvAWfjj73JwBzC20FGe0YbOGziD8GXDDjXwFXCJcKuPiF0DgOCmuwJgD2Qk4f0IZT8lW7DGeWBP05t/Drf6B2N1R3Gd28xcLKfMQLU2grGaBAlPqjfUrzlNaMvQwzMbGvAQUaZjzVWnME94Inm/IGVYrj9VyPnyzKzaUC7UPfLXq7ftY8CbkA9UaSLUfKAgSHUNqJB4nIHjRHbCkg0DhpUVI9e2E8DgtKtw0arfmaMBkHwbfvnxoyABq15yGcaKkzbZHx3uzFuRLk3Ahqzr/DnFaMvBPsD3qT7axMfu1XPjv0hII3JDMAiYwTeBny3FAcEa8Mc+OtUZo2lhHOd/KvA7mCjWUU2Tv5VYvfJv8rsAflXhT3CHmXnssfk33nscTaXVWPPyL/q7Hfy7wK2VP7VYMvlX022Rv7VYpvYZlZbNBSdWD3RRe512onuojtrL54Rv2cdxB/EBtZTykNvs+FSJtrCRoqtcu9yu3hP7GCjxPtiN7vTiTtxdreT5WSxe5wcJ4eNc/IkzYx3XMdlP3N8x2cTnApOBTbRaeu0ZZOSS5JL2L3JZcllbLIbuAG7z63oVmJT3Nvc2ezn7gJ3Afu9+1v3t2ypu9j9HfuD+6z7PHvRfcV9ha1w/+S+yv7ovua+xla5b7rvsVfcQ+4httGr6FVjb/mWb7Ft8oMOe8+P+lG23S/wC9gO/xz/HLbT3+cfYO/7B/3P2YepZCrJPko1SjVie1O3pW5jH6cnpyezfelZ6Vnsk/Si9CK2P70uvYcdSO9NH2BF6YPpg9xOH0of4k76SPoIj6SPpY/xaPq79Hc8lv4+cHi8QqcKnXiq4qyKs3hazpJw67sNfsrHTsmn08vl03L59L8un4pKoQ+PfTe4141yD8RFH0oDPoScCYCQ1MQApA2pQVyLHHDNyE1F20vWEHEZYB92qjTdM0wr+XQCvQu4DPDe0GPCGhruDa1BRXMk7K1qYKUt/BywP75IbaMVnta0DoA/I4hfr0O6CdL4Va2KE8J20tetPUadvY1vDaK+I+eu4idLvqhaReNQ3xyNMG2PC0tGhupxoDUk1ARJeLMeE8vW42A9FJZX8unN4QjYl4fzIq4O9782SSWP4Ou3A45HPSRRfoe+vI2S1PIb0CpqP5X8UM+mvTXUXtqXwIO2L8rcijoxMtRy1bsybaa5KG3z2rCdus00eqIdvgI/FZuk/imosx7qHIhfh9HsAN4oF08e2qvCsSr6JhxP3Z4zdkJJpAvxaz+U7EYrZNErpbP8Gz2e1tKiCjKnUaifUTjcKOy71SeEVN7OCr3mBCRTcamBmXedAWfL/JroBY1tb8wX4V5vjT9WTfT6ZfzaIRwfpxPG7WaDjmiWHyvaK9MdCXuRT/hD+8KPNN7aLyOnKuarPRsh09+Hdooz8IfaTL0g2aEtKOgUWjWJbcToSSjuCHOce8MyzmhjfjHCTh/82hvtaarx1izvAOed2igDGVDh0liUb8gbldII4dvdxihNRnsmFl8t099h5Gk8B2vaUXSN0XAa463rQS+Dwx4pzJwOz8zpSPfF18FbRE/ktNV0quZoNGobh3QX9KKbznEu0nzPHkjYjvbgW5F6mHf03W6v+hiWLwDFEQ+8AjnVwxxBozeQOEzRlJCzaWy3VxnU11vh/8IQ/8Mc6zHkUC8IK2g2j4Z+dIr6JgJiNCRMhbQAnon9iriS5iX0KVDU/T1aQpCoCflq/0dlaFRBucTDidM6TTT+KPp6iHg18oeD6u8O58JehN7NAKwS9sW+AD2KoHxbjVHW7aDcmw0aJwzsWFyvXD79HyifhmcX6kn59F88B5A7JUtyjNxQv/rbcgnzP03CjK2LbYxtiW2P7Y7tix2MHYl9EzsZK4rb8UQ8N56KV4xXjdeI14s3jDeJt4wXxtvHu8Z7xfvFB8WHxUfGx8THxyfHp8VnxGfF58bnxxfFn4svi6+Mr4mvj2+Kb43vjO+J748fih+NH4+fSrBEJJGZSCaCRKVEtUStRP1Eo0SzRKtEm0THRPdE70T/xJDE8MSoxNjEhMSUxIOJmYnZiScTCxKLEy8klidWJdYmNiQ2J7YldiX2Jj5NHE4cS5xInM4QGbGM7AwvoyCjSkb1jDoZDTIaZ7TIaJ3RLqNzRs+MPhkDM4ZmjMgYnXFPxqSMqRnTMx7JmJMxL2NhxpKMpRkrMlZnrMvYmLElY3vG7ox9GQczjmR8k3EyoyjTzkxk5mamMitmVs2skVkvs2Fmk8yWmYWZ7TO7ZvbK7Jc5KHNY5sjMMZnjMydnTsuckTkrc27m/MxFmc9lLstcmbkmc33mpsytmTsz92TuzzyUeTTzeOapLJYVycrMSmYFWZWyqkn+SzreNwAh/1kjsIaRZgCSjYW1kHRENtZCDv7O70EO9gAWZGiH5OCegBcj/xkjDb2NIN3LZ8gnreklkClfN1ryHWBfkvZC32b5bujh3Ean+RjAm5HzC6SHIj1C1+PglJrdWffFnqLbb9fRLbdI44qW2A1ZA9me/mjtUaO1zYze0ZgsAXwB330RcAVachfSG5DuDfgwYDvkI0dKnDnQ6uSU9pH6jp2G0ng/bcxCXz3+dgujF6TdehH9nahbSD2SfQnhdXouQsttaY+q0/qNHNKhkYaNJOa1SEMf6ACKp5CzGznQI9mkI0WPrHN1j8QdSHcHHAZYGfk9ccLzvRA6uUav3zf6DmnGPkf3PUI6qwq6PUo/dpPR63E/0d8RRn+hYXYu1P0l3AityPIr0NRFHkUZ6BKd0ygJKYe0iBFA0vmH9nGc4GVM2SYIW0zqiMD2EVmMkl10m+3vMQ7UWprlbsiZjzFpZ2A4YXVt/JpC+iqM5DlINwEEvtkXoLbXdc3WKuyWu6Jt0F6KJ1GedrnQA1P9qnxzPfJ20hi3jLOh3EWEby005u4vgKQdvY3tKRlbJxs5x/QoKW5QDxBtk7xlT0k+n64h7WkjMw26Qzsd6Irt2/Du82jPX8/GbQXXoeS5euRJ924B80OPBglDaYTH1oUyd6x2SPsOcQ/ssiIYtwjxxp/rNsRQc6wWfsX+OWrh10wDVzNV71gpNyNafoNdAcy8onTEPgvTgvAN1jRl03lRvXVFKb8l3f4fAb/TmK8sXARfAFyuR4ksC6rvZL0irL4J+BAFHHM2p1U4Nh14OFNTsXUjfk2HMNqZ1QWmyXQkR+WEZX4FiDPhvBD0PsvghJ+hhp1IA/MFToDz1wAn4N2bzuariruiBuv3us2xvmysrB/cOAJrRQyjHSGLxo26HolRIewDeKdO8zmAj6MlVQBjxmrS1+AkGD2H7BqLALEGRYDtEfDGCGghAm1F5AfgBtHOz8NTfNYhjbcWzQt2vxHsja2KBl8C37ChG1JcDvasCPA5QvP7W6NthPMnDQibr7MPJbMAA40/9ncaqtWkm/6iPUZjF3FIB1oztaperOlIcY8eBiQ7FHgsWSQj4E4ObA3iE+RAZxEheyXsMo6lOYNNmDxKcz/eVM+jM1PjqrUUv/5ar7bW63qVEQ8CNgasYaSroiRWYXGZcd6qK+rHWsYJQ24HvP7skpEMwDyU/0yXsVsjB7hk/RVwMyDaI+UNoqlwHH5h0B16IUALzsdn47+SfB5Aq4BvIq5xmOQN8ShyaO0DJ+G/lbutynIPfK7caZ0nd77ny33vBXLHVVPuc2uzOpJyw/OH9dlFkutdzBqyS1gjdqncUzdnl0uOcyVrza5ihexqub8Od9fj5K76AeynH8NO+hm5g14qd85r5J75bblr/lBy8UPsK/Y1O8FOsu95Hk/y2ryO3EtfIhqJS0VjcZloIpqKZqK5aCEuFy3FFaKVuFK0FleJQnG1aCPainbiGtFedBAdRadw9y333j3FteI6cb3oK/qJAWKQuFXcJvfii8XvxBLxrHhOPC9eEL+X+/Jl4kWxXLwkVog/ipXiZbFKvCJWiz+JNeJVsVa8JtaJ18V68YbYIHfvb4lN4m25f98q9+3bxQ65b98lPhC7xR7xlfjREpZtxa1MK8fa6UTlzi7uJORuPkfu4l25x/OdlNznVXDayn37Mrlfr+ie41Zyz5O79ZHu7e4o9w53tHunO8a9yx3r3u3e445zx7s/cye4E91J7r3uZPc+d4p7vzvV/bk7zX3AfdB9yJ3u/sKd4T7sznR/6T7iPurOcn/lzpb7/t+G+32523/OfV7u9v/krnFflTv9N92N7lvuJvdtd7P7jrvF/bO71X3X3ea+5x6Su/5zvEpeZa+Kd65X1TvPq+ad71X3LvBqerW9Ot6FXn3vIq+hd6nX3GvhXe518wZ5g70R3u3eWO9n3gRvknevN9m7z7vfe8Cb7T3u7fB2eR/4lu/4Ub/AP8ef7y/wf+Mv9J/xF/tL/Of9F/3l/j7/E3+/fyDUIvhfppKpRqnb0pPTs9KL0uvSr6fXp99Ib0i/md6Yfiu9Kf12enP6nfSW9J/TW9Pvprel30tvT+9I70y/n96V/iC9O/1hek96b/rj9L70J+n96QPpg+lD6SPpY+nv0t+nT6V/SJ9O/5guShcHLOCBCKzADpwgJzgnuCBoGVwRPBk8Ffw6mB88HSwOlgR/CJYFy4OXgpXBn4I1wavBa8GG4K1gU/B2sDl4J9gS/Dl4N9gWbA92BDuD94NdwamgOP/q/Db5bfN75F+f3ye/b/4N+f3zh+QPz789/44KnSqGfsxl4pAorcSMcq1EuVaiXCvx79NKOJMgAWANI68FGznONUjDy8S+Rv9KegcBDy3SwTsxXSYCnycH0pgDG6P9kJEmOQkSmw0fI9of2rCbRcn75JeA5OGBvZPdH2vtSKy7iNViDzPkA4pjdBHStHMzehTBLlHtBtEXZ5puv5Np9I7KnEI+dunREVq2M1urekfl4dXkDNctNNtmk4TkIWcs0gL5u5DTDOkWgAMAaRY+BYRWiKxPahY66PGnFqpewNdH1skQQ6q0hfajuqQzWM8FWVSoR+RhFsFezn4EaWhDHNrJfIs0JO8IRpW8jhxgQgQ1R0jSJbmNYk1djJ4Cqrnrh5zPASHPOW8Cvmb0+m2j7/BAcprrvkepzWQTewDwYjXyutcTfqK/k4z+wgMv0lT31+kPCD+56DANHexCIyhPVlN7tsZShTl2aIdx/qIxlrDFpI4oZPronagNthcHu2sHGivVWppraHCccRiTjgqLGDCcleAV4afd1KCFToCklcBsOs/omu3mGsOVxyfJ2aMUZZXWr8qjpEO7iLiB+dBfONixOBSBCF93njLm7k1jtGGhIhqJ2EaZhca3ehnUdyAsb3+DmqeejdvRaw26I6x7SLfKftagUxO3qeV1NVR7MOIqwHObMB9zFJ8DrQQ4RmQtIPy6otCiRkFN5DlHbYijhVQ+Cg1gDBY82lkpXO2O9BLju0TLpxWnyikdAfK5PKWpQPHGXeqtnFJ+C+ogXmrP1JhPegcFH9JlnMka61QbMEcW/IMV5xlgcDCD0yoca2BwsM+NHdpL0Ai4yOmAHdocnePMQH4lvAVNpZy18K1bALG/sr5AOoI09nKktRQXlGnVMIO7oiVKvwCqiVcPtW/EB6LY7cexW46SR2Afox56d7GxhwS9iImA0L+I8wF7GKtJGRjpZMwsdo9R6Lij0AdF4VkYRZkovP2i0GE5D4RaCUUpNEc0m/Abjs40MAdaV+LDxOsirfVsRqFdjT6OnMeMtq3RWKEgNFyRdzVmEq8j303SuxFUFEe0Bt0HcVeFP3grAo2wWlWbaDpS6UID3gcIHkv9Jb0eaX5JwxiFLiYKfm7DI9N51RgB8he41Jj3OnoeI3UMrCBsJE0ZYePDepWxWhl4NUGvvAq3oXsSwGqxB+Ud1N9KY4JaxZ45u2RkEyB0DVHoJuxLAAcjn3DsLUDQr/0cYAEgaRXXIA2KsO9BzdChRL47G//PoET03YpofFayEGiK1j6i93KtRLlWolwr8W/SSvxLMSFJb5FXrVxvUa63KNdb/Pv0FursFVm0ySpHdhDyNyUPXdrBk7cDeXCaZ23oNBZ0+PYNSJ8AfMWogdIUNQpWFeXtB3nNeg4rLexNFmRPdaKHTtDAukF2eYE1nHLEFYANkdMWaazqqv2GN4X1rNGS/br9Kr+MN4W1Gu+Sr8WFZVp7wngXVlSrk26h2TarpyEFkweFj3zIF4J285ChrC6Abxh10pg/bbS8UI8/tVD1gmYQVld1jpJaOESXVCdlqJ7uRo/IWkeeu2QpJr9nso+vRQ7lH9Fto92hQ6cIET3ZIt8JshPRvHyNNHYz1iBA8qY4AGmLI6fI6PVdRt8hL9uX6TbbdOIJPiTqnNSPhnTc/+yROaO/G43+/s7oI517wn7CmoV8w7dbnZGkMpCsrQbIIb8O7CzJb1uN806NLSZ12HRyis5R9jPaQ5Yyai1Okykc+AiwWxkMR3RyCz4MVlODFmjkoTei2bS+NmoeaOBSfbTqKH4drH9V9VN58mT9rcYoNW47zoYCFkDatai5I8otUH0cVEIj9s1lMJls0FOMtr2O8hiHEt9xjdvKd/yEnl/yHbfJC4jObFYog9sEYXFW59puM+iovsY05Qn2Vai3cGB9pjOn5MuhTu0dR8lXdBucrwCphbSTq4Jff2PgKmHFWOO7NAJvKE6VU4oV2Der0YNXuuI2L6q3ckr5LVmo6YTyQwbmm94U0JMpfgustl412kBfodZ20/gm8aGUWgm7FI5dpTmY8qYAXRMOOCN0GXuokUPeYvVRknZ1tLMElxDkEZFAGrpnsRaQNHa1jVYZfFVxV+ghrGsAgb0O6WDIXw7aKYfOQtL5xw5GPV0MjkR1UqsGGbCN0d+NZ2B1adqmE6l0WpNokE5bLwUkL7uFBu2TX8c+eFM8YGDC7RraqwzMQcttwmrSUfXQs6n8rwg3jhptm2hgBUHi2HSaAnHEidcpL8dHNVQUR35K1K8PDOwiDon1Xa2qiww6Wn12X9QKTvyTvIBwMlSQnyTp9m5RtKAp63bNGYi3nzHvhBU9NA9UKy8wQZCPQTXkDNerjACtCegeVNxaStOskSbgXsA/AcLnh+wJoqWxit14dkk5GjklmjO7sbGaA4ftx5CGHtr6GSC+Tp4hxBMUNx6oMVOgpP342fh/BiUC58VFxlu0UryCHFr7yr0pyvUW5XqLf683RXl06v/50T7Lo1P/B0Mz1lVqZXKnhGtYpriuXHNXrrn7z9LcZdXKqp/VKKtZVqusNlkds7pn9c7qnzUka3jWqKyxWROypmQ9mDUza3bWk1kLshZnvZC1PGtV1tqsDVmbs7Zl7cram/Vp1uGsY1knsk5ni+xYdna2l12QXSW7enad7AbZjbNbZLfObpfdObtndp/sgdlDs0dkj86+J3tS9tTs6dmPZM/Jnpe9MHtJ9tLsFdmrs9dlb8zekr09e3f2vuyD2Ueyv8k+mV2UY+ckcnJzUjkVc6rm1Mipl9Mwp0lOy5zCnPY5XXN65fTLGZQzLGdkzpic8TmTc6blzMiZlTM3Z37OopzncpblrMxZk7M+Z1PO1pydOXty9uccyjmaczznVC7LjeRm5iZzg9xKudVya+XWz22U2yy3VW6b3I653XN75/bPHZI7PHdU7tjcCblTch/MnZk7O/fJ3AW5i3NfyF2euyp3be6G3M2523J35e7N/TT3cO6x3BO5p/NEXiwvO8/LK8irklc9r05eg7zGeS3yWue1y+uc1zOvT97AvKF5I/JG592TNylvat70vEfy5uTNy1uYtyRvad6KvNV56/I25m3J2563O29f3sG8I3nf5J3MK0rayUQyN5lKVkxWTdZI1ks2TDZJtkwWJtsnuyZ7JfslByWHJUcmxyTHJycnpyVnJGcl5ybnJxcln0suS65MrkmuZ0oXKaCxotPGFnm53KXTKi4SvN5p5ykQNUng3Ag/zeaz8NRB+Cv0m2SDtuCporQ/FKMCmiNOp03wXaeq/i6n+mElt7vq7zrPGN/6S3h2X2Tgi7QHbqTa1oWFOjIJxT6kX0b6O8BPAYuQ/2UI+QDAjsh5D79uCaG9BjmrAH8B2M1I90LJ2Uj3B3wGcF4InS+Qvg7wLv1daptjG217TbdN7rrDlgxEeivy/wz4AeDv1dfvg6X4b3+dWvu68fVDgLRDg+ZLwI5PejdOetiWgKTfEcYsw4tMxSCDjlJQrKUcQPJQWq1rIP3sGeO/A+keZ48/jbw1X48/jbw17OyRF58YY/6engVx0Oj7TLx1h+61vR3pzYCEFTiDJFbqcSBMI+8IQT5gpBcgLQBF8bvRyKcxma3xX1FKU43bFuEwfCcochz54DmEyfC4czw9egK+BA6dNoEmUTzGwhgGmzSeO3Sy5RHdKhXTaqkx2lFjzGnEHtdj7mxAmkbjB8C/AH5ljPaXPzHO+4xxHo7yUwzsehfwCXyFvnUMZW5A+h78eqeux/k1ch5Gzi65e+f2VKQ/1vhs0iPV5nyPOi/Bu7uQHsyuL2mtnYsyfyzDoxxjxgnn4TMmMCPiTWPeKe4eadxIYzUI3xqLlhSBw/TXtKzgOPwKvaeYzpYzpUdz6CQb6ejp7CLpoaApo9rsqYjUQpxwuZr3EIJbilNn90WVWWZwZpyA4p+EtRFuSP5QowRnBPR0FFNElpf5HPUrffdygxu/QJgWRhOXfDgseTKsU33rLrQTnEHAQ0m001RvVzJwb6yaU8w1d0q4kH07fu0DmKWplei3hBuj/PMYT+AzvxElCWf2nc2HneaomWrrgho2lOEJBOsBPmJwVPriW0b62RBGX+DfyJrdMB1Bv8T3+ovRF5BPGDjboCb02qpv1EacfEzIpSUlhnCnak+YXoo0capFgLfgrdPhr7yzxnDrBo1pHKMn0H4OyuW98etRohoRZ2FcojAnG7Av4LWAxG/fMFpIc4Q1Tu52u5TOb/HZuEE4wzHjzhEDJ8F/aN238lHmR9AIWWqpJJ3MhPaf1npaR1QcoEU6raJA/kJzCdVC8DFa+xTOHEB6BtKgUHs50kSPmDsLuEE82dmGWcNaGZlA48B7spKIq9ARC7JtkE/ptwZPGKFXPXVajPwAE4AUIfQuo3e0Cgww1gI6+Qwfe2X9ojibWww43uDqm4y15ma9+pBcpGZnsTH+4GyCyuN0roWoRTbNAunNoQ13iHvgRCWd51ezTJEov+a/x2iE40NSzSnAYsVXw/Q7+HU3xrwRoAAk/o95cTAjDq0d6/VsWgPKcE7MiNMK6V8CLgAE/tt9NVSyAa3mtK59aWD1ExoHSKZSePKWplxxHGkGeJ0BwTdIjnLqouSTSH8N+CNyvkX9wwzesh+wgrH+Ev+H9UXAYide11hE9/1a52tqUiexPzJqgLTM6Rw4RS+9gyVlPlmjyTcekd7ovL2ALUcAAwXOXKj7hAcqOmKlqwBRMVkNszWGqHXnIY1RgqJbQkayKFLUJraNlUQ1pXOYa4E/dOqVotk+pyGdlrcRYdkhnwbaTZAlleyL1FqcGREYBw4/bU7RUWdofFantUkSo5PYxCVoNzEJkGIukDxGZ8hbG5CiDGNUBdnvEVFM2cAoBuhGTZvqdAzNzq8M/kDyA7WQ8smrf7qmXPKld9A7q5tuIbVZrekUG+JcrK1kGcVd7AIjycFtOE64KCsafauGntMzdmEkfxo7L8V5qur5VZ4lhGMRTfUKM2F1I86v9nGQUZV8+14pVQr2W9aMhdy8BQvvIm0p/wRrJf8s1ob1YDbrK/+SbJD8c9l2toN5bL/8S7Fj8i/Njsu/gBXJv3we4RFWwGM8xirwHJ7DKnKXu+wc7nOfVeLyj1XmtXgtVoXX5YXsXN6Zd2FN+bX8WtacX8evYy34QLk7upwPlTu/lvx2PopdwcdIieFKPpbfzVrzqXwqK+TT5DhezR/mD7M2/FH+KGvLn+JPsXb8d/xZdg1/j7/HOooeogfrJHqJXqyz6C3kair6iD6sq7hB9GfdxEBxI+shBovh7FoxQoxgN4iRYiTrL8aLR9kA8aFca+8WH0msukd8Jo6ye8UxyTEfEqflKj5bFEm++ZgVtWLscSvDymBPWFlyVX7SyrUCNs8qsC5kz1gXSbnwT9al1qXsNesySefrrGZSdnzdainXoQ1OhpPJNjnZkmI3O7lyT/WOk3SSbIuTdvLZn52KzjlsW+R45DjbntyV3MV2JPcl97GdbsSNsPfdbDeb7XLz3QL2gVvZrco+9Gp4NdjHXi2vFtvn1fXqsU+8Bt7F7IB3ideIfeY19pqxz702Xht2xGvvtWdfep28TuyoN9AbyL7yhnhD2DFvqDeUfe3d5o1k33ijvLvYce9ubzw75U30JrIib6W3khV7O733OfN2+4IL3/ZtXtuP+BFex3d9l9f1U36K1/Pz/Xx+oV/Rr8jr+5X8Svwiv45fhzfw6/n1+cV+A78Bb+Q39tvwS/2+fl/exh/nj+Nt/dn+r3k7/2n/ad7d/62/iPfwf+f/jl/rP+s/x3v5L/jLeG//JX8Vv8E/5B/hg/2j/rd8mH/CP81HphamFvK70tF0lI9N10nX4XenR6ZH8nuCSJDNxwW5QUU+JagUVOa/DM4NqvNHg1pBLf54UCeow+cG9YP6/ImgYdCQPxk0DZryp4LmweV8XtAqGMSfDoYEt/D1wYhgBN8UjAxG8reD0cFovjkYG4zl7wQTg4l8S3Bv8AT/czAvmMcPBwuCZ/gXwe+C3/Gvg2eDpfyb4MXgRX4yWBH8kX8fvBys5j8Ea4O1vDhYF7whWPBmsFHYwdZgq4gE7wXviWjwQfC9iAU/BEWiZj7Lj4i6+YX5haJhfrv8ruKS/O753UWL/J75vcXl+f3y+4nW+QPyB4ur8m/Kv0W0y781f6TolD8qf5Tolj86/07RvULnCl1Ez4q/qvgrSQHhmd2WZ57ZVZrs9eWa7HJNdrkmu1yT/T9Ok01xe8gXiNKQzSnGlPLagk8mRQpS/px0T8FIJSvtKfGltLGHi1yEXz/SOcrv7udKsgvT2GNFHP1dOglK36JdI6Uj0/W3rCfCO1vFe/gi3XwBnzq5B+oNDYqE1ldILwFMI2cH0h0AD4RQDABsipwxKPPHEDqvIGc94H2AF6v0IPQxLLkQOZcBPgp4dQgjlF8BMIWSHyKNtkUqGW1bpttmf6nbYz+pWyJ3t2HOCN2SyN0/8fX1Rp2t0QsHafi82dlaLlZxY+nsGuIO080jFKlPzTL03+R1TL5n6vYHuvUDmleHpGY6IS3KjP/LSF9kjP+HeuSpL6q/GHn7qrNH3jptjP96PQtyX6v7jhynpx5z53Gk96Ik7eDJP/xRjcmEaQ75+9G5RrqjAZYTihrs0PnaFcaYPKDxX3lipw3cxm079sMGxg7V0EakMor8pmLQYdcbOU+Xt3rqfMLzCMXFHmh8nU4f3m6Mdg9jzLchPVuPeWQF8g8i53PApwDXGqN94CfG+StjnAtQvreB22/ruYu8pqHTAOn2+LUt6vkBOVT/TI29Tjekv9Q5Jj1Gfg64BiX76bY5jYzWvogy0NyQzkmN5G16z6dmhDTWkwAXa6hmlk5sY3YcD1+5AS15CRyGRmAW4G90WnGqpjjPTedW4TFoQ2+ndFFkl8N8yV2srE3uSTaWckKKJUh7dPLYPKp5r+rLdoNzEt6S9uvKsDY6Ha68wUcaJfMMjjrR4Nj9DIztE9ZgjRReCaWIj5BDt9Wcx5awEr93aCko1h9RvVPJwD2a5aMKZ46VcCHnWqPMuYA/N2a8hBuH5e/BeHY5mydEnjmbDzuvI71PczlrSxmeQPBOwOmAozX/IVpQ8K8hjA0Pb9B0wDEixSh/rf5ibHgIoxWRM96gJuLA9Q3ORpy8r6Yd4uHUHouochygsV7QW2oNegIQ6wutHSIX73ZEGn0RGZpmrYVyxx3qnHqXQLVODTPoerHR96N65C3Mi5pfilbyssYNwhkBnRBFm1QyAGlT6EQ47glSNEK37dD5iwsMHHtGryOK+gxIt8nQOKsRO3p2WvEiwpYpSLcDJvwB6UWAv8avtQGxukWWYtbAK6K0Bq3EefQLDB6+QOE5gxZWrwUUjZ3iLlDUOPiHOzgpEOmlabzsKqB6TdEIyE+bIjdQtPpFBrxLrzVKL2isNbT6KLnopDGSNP6P6vZbdOcXVh+H9H+w7EVgc45QjAQO+IExyxQ15PPwllmiXzXOtIJgxCIrDWx/GvADQKwgzkSNYxEqPw05z+kZVJSYMmAvlKyiaZxoSmJCWGdjDRUfWAC41Pj6Af0urV8kUyneclBTLvVF9SgTsILmV5Fs1PAeynyBHFBNhHp6OX5Nan5FvaYTLir6JWER+W6Af1IkA8IiskIo6wFxYGidbWgoVVQSuu8EkhjJt5HHjV/hYx8hqwitC0RHFCORzomQbHOpxmS1CtRVtBnW0MBYI2h1OKwxSp23utBo22isaCuMOklfS7FqoOF2btGQYj86WE8jdMsYafG3GnhOJ48onipWOkG2Zfga2G2Nr9D+4hcGlZFNiaIlUaQH9CVCK3tFTTVqxaRzZ0S5GD26l0pJCHSSkSLQQiqO0ClCsjb8WvMlJTGCjkj6ovZTVBiiXIoCRfE5bRpJusOLaqCIuPiiWlvp/AidVMJbSttN1E0xLagNhEWY8TN2YYR1xs7LlD/V/B7SWKp2cy9rzKS4LMT51fmOh3Uf1WobymnlmuxyTXa5Jvs/W5Nt28ftv9rf2Sf/K5EeCjLTkh8UeCxTHCzXR5fro8v10eX66H+nPjq5Kbk1uTO5J7k/eSh5NHk8ecplcpXLdJNu4FZyq7m13PpuI7eZ28pt43Z0u7u93f7uEHe4O8od605wp7gPujPd2e6T7gJ3sfuCu9xd5a51N7ib3W3uLnev+6l72D3mnnBPe8KLedme5xV4VbzqXh25Pjb2WnitvXZeZ6+n10euhUO9Ed5o7x5vkjfVm+494s3x5nkLvSXeUm+Ft9pb5230tnjbvd3ePu+gd8T7xjvpFclVMOHnypWvol/VryHXuIZ+E7+lX+i397v6vfx+/iB/mD/SH+OP9yf70/wZ/ix/rj/fX+Q/5y/zV/pr/PX+Jn+rv9Pf4++XK9tR/7h/KsVSkVRmKpkKUpVS1VK1UvVTjVLNUq1SbVIdU91TvVP9U0NSw1OjUmNTE1JTUg+mZqZmp55MLUgtTr2QWp5alVqb2pDanNqW2pXam/o0dTh1LHUidTot0rF0dtpLF6SrpKun65Tqjeh8P+JwKK0k3X9HZ/fJ+xZ+G+qmNtqFQJYXpAOgO/UQ10ydlu5l1AwfMoH9NN3dprxAaM9E/seZOkcc0+1R30J71E3R289u5xltIz+za3RLlAcP3QpHUQc+0b/SzSfUNvKYEfDMIy89QR4nNA7kZ9/ckMc74NaCawFTgHcA1gKMA14FODOEohNgM+Rch/QppE8DTgLsD9jYSHdDyWNINwUcCtgqhPZIpOsA1gTMBETb7LpG2+4y2vYr3R5ruNESDthDf13uYv/21ycZdbYEfBqQomvQTo52WuRpRF5T2Icpn6F2GkNo56RuoGtizGwHjRviTwZ2keWK9n/QuAtEk7Rob0Q3eFBMTPLXJ897+Ajalc+eO/ED0pca45OpZ43GQY0VZs26osysVTTma5IxgznGuFHOW8Z8fQH4C8Ck0XKirEMGTdGv3yOfTh3A+0p5alLEF9IM3W2M0o2aEhV119JUpu7Jgc+98sYmiuiqIXk70Z6bdAwWJEK7vkFf5h3dzKB0g1eQXsTuZNA+tY38q5oaONPMmJ22Bn1FAW/WcyR35GE6D/ARwFsBJxizM/Mn5iVlzEttwLeNeZmi59qeqKH1R6RbI32lnneb6h9iUMpGQF/nmLRvDwT8Gcq8Y7TtZaO1Y1GeOE+hgQmIJGt3LMPlaMw/0FBR1hDNtcRePSPiGw0VtlD0F7I2LEYbtqANd6s50rQ/UqfVLHc3uCLBnsZs9jQ4QHcN7d4GH4BOS5jYTjduUV/oNkzEQKJ7clWrSLd0zOgRooyQp6lTQ2OmivrjAwa616oM8Y3PNJ5TnWodpAi2tCKsRW2DNBRfG+NPLXnGeJf620/PiHhH0yDdfWzhxEt4OrrETk5fEdCT0Qp7xqh201B91xg38QtN9epEB/WFog2BKwr4vArSK1P8j+cNirtSY+8Za8cmo8yFgAONkuZ6R6vG1WdzTiknnLXSyW1omJ5hrCNOGc7Z1OC9gwB7GVw6z4D5IXS6o+YswHnIb6e/qH59Djl9jHcJqxsZNdNa0EGPg1ol0R7xF6MGY0Wmt9Qqj7WVVnBanUV1wDcA0RdRTXMqxSuKNVT8qpvBzUYZLTRGXtDK0l7PssIWwg2S0Ogm1h80Tan8qhpLFYQ3hyA8H27UQ/ROpwIaGiXbGlR5l6ZoitGl6iduc7nBiwyo7vyhdae/gXt+mXRjA99odX4d6e+Q/hrwKHIaqtlnsCGE8w4ea4OTqzW0gaYXoguiFGUZ+9YYK7olj+QT8reG9temeOLtNDf7G6ttVT3+NnGhloBXGBRtRuuh0aaVnXyyzZUda72g01PnGjP7jTFHh4we0ZmoLI0V6ralfShDsbnpFibSzZOM9JCBLXRX4SMGf6BZoHUZspN9j0FNtwE+BEjr8l6Nw/aleh2UvdPz21RTioKgXLuewQGI4khGXaWh4jP03THG12ca70IqUFLxQKO1/Y2+ECSqrKP7a58PGEOOhzSo0qYvtgB8xsDSWxVH0pRIOHZC82qymSgc+71BU/0MrCP8vNbI6abTJDML8uOntYxOIBDl3mK82x85dTUGkmxM3vYK0pkZ2HwELEJilaYItdYQpeM2M+XBTzum7poDkJ+RonpaH2kNcjWWCjqVR2cnntbjoKw6jc6mTcJ/4jaqPbC4Kjln1Nl1qkiE2MHZtCLTaY3LDHymHQHxQLKm3mJQHCzear+53aBoksEoamYrg76IZumkAeZdnXhBGfIfoZNUquW0Z6GzT8Q9aLdyk55HFYeM0nUMDkCQfIvoJENdI+ca3Qub9vjE687XtK/ucoSlUcCGRhxY7TvobsMbdV8skoLIqkl97K5zSJIhK7ryHSMModiEbxijQSdwiKuQJEb32sFOReeyBM0I2dZGGHUaUpCSOemsCEmPDY3Z7K0x5wz9w9MaM4kfmpLeGStmUrdTUShFkSTu+p3utTqZfNAYsUlqfanLBLuLNWPhyIbWswJYzyrAelYR0bkqwYZWhR2Sf+ciUldVWNLOZyfkX/Uwahe7AFa1mrCq1YJVrTasanV4HndZXVjV6sOqdhGvxQtZA9jTOsGe1gX2tK6wp3WDPa077Gk9YE+7Fva0XrCn9YY97XrY0/rAntYX9rR+sKfdAHvaQNFDjGQ3wj42UXwoDrDHxGdy/ZgvTkt5ZYUlJAavsmzLZq9YUblCr7Yy5By/CmvYO7CGHYA17HNYww7BGvYXWMOOWDutnexYGN2Lfe0knEz2LSxjJ2AZ+w6WsZOO53js+zDaFzsF+1hxaB/jPLSPcRHaxySLibgRbof2Me6E9jEecSu75/GYd753Oc8KLWC8RmgB4zVDCxiv5XXzuvHaoR2M1/EGeUN43dAOxut7I7z7+EXe/d79/GrvAe8B3sab7c3mbb3Hvcd5u9Aaxq/xdviCt4cd7B7YwcbBDjYedrCfwQ42AXawibCDTYId7F7YwSbDDnY/7GBTYQd7DHawOf5sfxV/3D/kf8vXwLq1Cdatd2Hd2gbr1nuwbm0PIkFlviM4N7iAfwWL1glYtL6DReskLFrfw6J1KmgeDOI/hLYscV5oyxI1Q1uWqBXaskTt0JYl6oS2LFE3uDc/IurlF+Z3Fcvzu+ffKV6DBekALEifMc6E/Z69AyGlwpOeuX/TUpQqtxSVW4rKLUXllqJyS9F/jKXoy9BLTPQRE1l4f1AoZ10pZQAurixuJSHp4Gux2WEaZWhfQrq0zshpwA5ij6gl4paAV/7YujQ9oPiIhOQpNSU85S3oPrhu+HorwO9RpiXSpMciuZX85L6CN9s5xc2ZuuGeImKrdjYu3l/aNoKQc0UddoqF/q+yheK64mkS+iJZKj9WxTmQmcU9S9t2XvGw0l6MRDunsd2lsiFpZGlX1Df8og09hLiaUxTjMI1doxjCzwllXsBOYYwUWcZlZ2iLRSP8Co2Xs6ToR6b003JkCH4R9gvpQqQPGzqqvoDXos6BIbQuYPkSVi4uYOEJ67qlbRsnJdGSto1lxaVtK2QXlrbnPEC0RPb6vNLvNkF56NVKvl58ccnXVWupzjZIVyzOkJBk9nbybS4uCaGVKKqFOVolYfPiekz5CwrSHHfk+yRsX/yShKQxDXgg3yrkO1mJVrsJsKKQfy8h6ZnuNGR2mhfaWVKsALqT+2SIUTYXk0J5v7ixzCkK03aV4vVnzR10FXad4rdKxofGUM1adWPuMGt2jeInz5w1shiouWtpzOChMLaM0n80x+yQPo/m63DRXtBX3RIMFx3CtokrwygEdHua6K/x3DqFkZldXC1sG8o0A27DM9W5rmgTC/3vt5XSXUeDEkkPV1NRaHh64SOMzCnQXStFL9tKLUVk+UnjW41QZw/ERngG6Q6ATdgaVhJ1oTVosDfydxuUSLyCtPtX4VeiVtJ5nIc2NA+9KmVOOAJXFC8tnZ2mYX/VHGHvJQZq+rJH8qtkDZuBzy0wR034BRIu1DSlZrDsvPQ29FK1i69kJZYizIuAHkvUCd9VlqK7DPyvhjrbge52IX0Rv4aF2pq/SkjaskuLB8v0dfj1sNZjKdr/pepdWMO5KNlC1V+5lO7Ox7vEgTuBmq4LacT6Gjg8uPgRmVMT40MUAZuhCHeikh75cVlyIF/EwrgHG5mKiSQ6GDNyLXBgOmDz4l0yJ0XUB5hHLQS8H3E5KN3BgJ3ZE6Wz3FtzxTNgY4NXN2OFpT2i81QUm7sZSnYRl0l4fYiNkva7M8VpLdghRR+Uwdk2ao8c5yTKbIRmJeSxFNvhfcSDqgVMrqXXAqUzO4xIFLSigUaojLWSjQ11gVj7Gsk3StYgWl/yQGXVkNOPjZElbwzXPmUp6ozadmutg5hXHAFFtMKsRYC3mip7g6ZopaOTG1+Fcajkt8My5+JbawHbibtZyAMPloynGkninLQi03evD79ifYY6JxW/IOEA/NoUEH2x2yNaF/lALwbFdQZFHw9rtqoWX1ZKcVeG66z1LmbZWDusbNBCG3ChU6DBiaCmbmevd9bokKbEFYT5wGTinDcbawfw3CaNLMfa0YL1kOn1OBdqck7CPeIJlyMnE7z04ZDirBvAhd4C7AKaPaTXNfsTfmk4ksAQ8AH61V6FVjVHbcRDOuKt5gb/Jz4zBHy1N2KC3QmabVr8WPjF4vNB47gxAt+tGa4LYgBqa4acJ9Ta+kXJ6nympYjfVdJOxamIV4zmt0j4BG8qYQ+MDMkAzVGmhm4hzZG1GjV3x6+gFJplkuVswvNuSo6aj3kPpSk690K3KeQXjQrbE66SYhDwkFaKwaHUROdy1RpBvJokuiYY1frGr0Sb16OGi411+RhqPqpXbXXe+Fr409+EOitBNuiAFYF4YG/dRzn+4ci/C4iVVEwGv70KXKhjOFbOfPD8r3kow/QwsJe40AVIX4BRStCYo513oTZq/11owyBwlS+M1bYGaJAosRefyUI71R7gTFhDW0DScLfBCm6stlbwYxhlLiiSfEOcwLhBQyxHeFspBC1bFlZ5QMkfwm9R1JqeKEMrO9ZotdZfAtkbUrGc2SWlI0xzNNro0VF8twGvWooVNUNoTQXfeAQ8CrZ0cRG+ciFGgEE2BrYo/W5DjN5dmM1LirmEc8Kvkyxq96cVubimzKmNtbgGYItiX+YXgC4Ih0EvUgIP53dC8XfszBW5csiLrMpFz7PwnEy4Iv+I+aqKt2qrNTfEhAroO6BaYS/EF8kTqpBoHBCrucIQSMX2RNRA3IPw7QG89RTqJEmgkN8qSzZB785B+bfC3llvoI/3onxNJWP8FVw0XM2JH87GrxdjXgoNWe5a1kCWPBDOsp2DGQeOWTcD09pg/LFe0K2jEsfCO3v6Y5VprOThUspSa8qtmJGawJlrsDaRvWiMlsRU5EO6B9wrnhBa6YF1TVl4dvSy8F3r0jAtbgS2DMJanIV0I2ARrTVtiraHfCaEkg8fKW0P7dfuLj7KeKQW5O3jxf1lzhdFh1jJenoQqzNhKbWN7p5+HOvUdRiTy9lrLOTY4Tg0AO41hVTTFTkld0yHaToL1N/o6RiMw5wQ2tWA5/nA8x+xsl9fHMbOra1oJHzrunAubJzXEoVoA+2Fa4plIV1DjiKbCUkRGegvnexqC6oh2jSsJXKWwzbfAs42DxySpC9qeb3wrCzJP85QUN+NSjoKv/K8kqOOYDTC8b8Du5hmbDqwaA9mHNJLcXtWsq41ArwsnCOyFAmyBs8O33U+Qg3zeTZoJGxte0A6U9QX7x6HJNCr6BumbDV2JkaSdhCFWNPXgOfQKbhHwBl6QSYhDLwTvOhXqOFqwCshs92EdN8QWi8CE55gEkOs33Lwkx9nsdB3JsS61uhjP7SNRrUQO5fBBo/tC9wmHQXJkGSZb49Za1hGF0FtMPUPZMEjzQPtfb5SK+PGEjpVPSLZD9xPUejXWD2Jmige3a+NFe1ajGRHRZUh7VeXq2e5pajcUvSfYykSkjretUPrb3iqOdwxhl6kod019FKo94/ujaAIW+kZ5RG2yu1U5XaqcjvV/yw7FSs5z0LeSnQCgnz/yp6UMU6XKD8Z8pm5O9QjKH9Iij1D0ZARf4I8fJREcpGSF8M0fFps+m5lQ+agSEIj9XfpjL761mDoLKbhi7T/J08Yip7fzoiXPQLwYsAqgHQzBMWs7wTYDDm3Ik3x9A8DTmE68nhzI03xu4+pyNQhHKdrtl8y8jsAZqkY4l0QX0e3bYzRtlm6PdZIoyURpD/UX7ef+omvTzHq7KAjaytPJPI6SxlzR/cW0MmI5savNMvkdzTUGFvy24QdgrzCVJwGyJ12lTLjnwPYw+hjlh55isiv+ouRp7sizhj5isaYTzJmIVJmhN8ycg7raNHKg5R2cYifpG7RJAyHH6ny5h2nR0bdm0rnRO40xmSIgf+EsTU1bivfMPL9o+gOpr0B+x87pUdb4FSXHdWzo+6f6KTxXN0tTPffUjxooo6SW1vCPjYzxrwC4GY95vZIHflaxc1/CPlVjLF6+CfG+VpjVNsCvm3k3A3YHrVNBKRo4G8i3Rrpq/F13M5iNzPojqJ+XwrYU+OzSY/qPoD7AM812tbUaC3uA6BoMcp/u4XGSXUDxAAD/8lrkfa0ywzMN2mBWoWo4uIecBj64p0GpNsRaC4YtBikiZuPnA4GnlCMqy8AqbarDU6IyDfqnAjhYcxoOdn/jhnlyc+ZLLXdwtpIU69OYO0wytMdraBKZTUkqt9jcONXwEW/RYQt3Kcq7kQOfWsA0hTdm86SzNZUT/HiFe5dgdF4H+krw5sPCDPt6si5GbCJHlWFq1VUflge0fzFFQZPuBc13Hw2H1a3hvwVsCWgU4YnEETse3V3QhOD/1D5hppHOY1RcxLwdQPb8UWHMJzuqxhiUNOYMjVfbOQT7Vi6PeJzI5849i0ah9UaNFbzRuJsAmMo6L4H4pnnGTSbLW4FzmhqugqQ7ue4H/AG3UI1R5g7dTfDdr0KKy9Twg06VYEINKQlP+M8Bd1ScKGB1ZMMGiS/btIMHtXriPi9pkGVbgnYX4+MaqGZJg5/DuAA3XLiXeJrY/aJaxEPp3XnNkBaX8YZd0UQl8Y5CAs3QFhfGDTYwuAbFLed9GJUkrzT2/zEKnCNwU/o3pfaRslDBqRVldYa8na+U68dtPoouSjLGEka/9NG+0lyI+sm+aVjrbFeUOPAWElMJmbMMt0gNQ13RbQ3Rq8aYGXgfH8D28cD4k4FolbrI41jdIeEwtvRBp6bazRBrAh2BtJ0Y0QnTa321RoqPgCeb+chPcPAamoz3SiTr3FDUXd/oy/1ynAGum8GfRR04wjut7BwT4ZFN9wQ/lRlpfyK+APduKB4e29jbOmkwLsai8RTGlsUByZv8CsVzmueDCpQem3yHqcbSiiyJrwQbPIgQZwkdYoBJx0E7h1R58TrG6sAbkgSFIGJJBD41Stt9UYDo0h+bmJgaX2saOSJ8qN+S524oV6sNiDdFYH7TtR5HDoB2tnoNfWXJHyyEpFUdpnBKyjuFEk+Nxq8Yi3SJAXRaaM7jG/VNWi2hUFxXQzaPMegeoqQRyNGsbLIT55W6s90GUVl9BWS/egMxRpNuSqisHmOoJ+BA3QDzQmaI6yndI7AN3CGytMokS1/nFEbnUc2d2HkvW/svKw+BgegtTvLwNLKmupVq+iMwHY9+6oe6uOkUlorj7BVHmGrPMLWf3aErZv5Tr6b7+X7+ef8C/4V/5Z/x3/gxSIi5on5VqH9vP17e6n9B3uZ/aK93H7JXmXvtj+099gf2Xvtj+199n77oP25fcg+Yn9pH7W/tU/ZP9in7R/tIrvYYQ53hGM5tuM4keQ9yfHJCclJycnJKcmpyWnJB93Wbi+3t9vXvcEd4N7oDnZvcm92h/tr/LX+On+9v8Hf6G/yN/tb/D/7W/13/W3+dn+Hv9N/39/lf+Dv9j/09/gf+Xv9jwteK3i94I2CNwveKni7QoMKFzO5Uvx/dv84k3yGhVJnuHMMd32hVTc8fxeeSAz3puHKGGoNwhU1XJdD6TNcN0IZI5TOw1Nr4fm7UBINZXlrqnymy+cR+cyRj5QnrIXyWSKfpfJZIR+5+ocaCktKE+H9Z+GZwzBqZHhK1zooH7lrDM8ehhFiwxiXti0fKUPbufJJ/d++6bsc/mdD8yZ3M7/S1PwhEs5gmVbtcutYuXWs3DpWbh0rP8X1/+IprnSDdON0i3TrdLt053TPdJ/0wPTQ9Ij06PQ96Unpqenp6UfSc9Lz0gvTS9JL0yvSq9Pr0hvTW9Lb07vT+9IH00fS36RPposCO0hIeT8VVAyqBjWCelKubxK0DAqD9kHXoFfQLxgUDJNy/JhgfDA5mBbMCGYFc4P5waLguWBZsDJYE6wPNklpfGewJ9gfHAqOBseDU6EUnp+Zn8wP8ivlV8uvlV8/v1F+s/xW+W3yO+Z3L9lnO6RTJ60DaVyg1xH3ApLODxHFHMonPQT5RuJcSYTuCif/W9L3QCvp5MNTkfzrEBPCgveaii5A0flxOwvdfKA0B9DH0H0AogpyoIGwEUdQnaAhjdQ3RX1kPsX+vgKQvMsQ3yICzQHFOlc2igYoP6GoKys5tbQWZejuELqZHW2wYdngLxfdXqLvoRt1Vb+oRx30CAiy+lL7X0GZ1bq/9BZF/VFxz+/XPVLtv0r3V0B/Q/dGqJMd0MTQre4qwhbFOEFkdtES+WRvqYo+IgaVugeWIkaQPx5mijwMyTpnk66FfEcbaUxwKLL5YqOGNtRa+BCSJow0xPR10nghpp1DsddJY0czSPZzum0cumebTotU118UsI+Rhy19ke6NoPrpLeXdd9TAW5oLimlBFrMHNRYRxpL+T+Et3SsDnTfdKqTwdogu6dApD9KGdjfwlu4VoPuccNe5ipiPuyJsxMcnSqGa6Z5liurhIAaJA704xbgXVcKZIl2mOFS0gJXE20Dv7Ifx65XGzBImQH/G6a4dugPsWwPDiWZz8C6NHtkHyNb3BXBDhJDfFH7RZsiB7s3EGfJStnI0zqhYoWR5oHM33TXOUEvOwJmKeh7tNzQGqpguhDPUu7cMbCGr3Q3G/PYzZnmcnl8b+E9WBbrtgPzt6X4FNbPG7J8xp3QDL3mQ1jXmEXckkC+xTdFotul8sn5EKBIexVMheyP5+lLkEqICujOAop9GNe45OMHkQFcaId3qcN1CFQOGbMJkezdOjSkNMfkCrEVJ8Bk65aHGn+4lWqrxgeL0EN8jLkr1SM42UqY/x+xXNOaRuJ/pEQCNbIT0+hT3DjYxh75LOTSb1FqyxIIbk0+4TTchEY8luwRZpG3ACwzca2pgYF+Ne+RfQzEI6Q4wdaLkgIF1ew18227gWzeNb/wDlijR3BO+qZswyKea4qthHCKYQRWTCRYqh2gZ0RyJh5AtXdlGKCoYxV/E3dM2Yok5dNqriW6binBD1j+ywpHmnu5BphWN8IfsYy3CHOJvIoJ5hM1c7Ai9we37whNP9s9Cz3N+WPfUoqiuNJJkn6mo8SrUkDB1SwfZAFXkIYpeRp4d1DbiOSQbVNF9pLVM6eZJZqAaiJP8wagTWFpy4yDgUyHnUbeBGzw5ersuH/m46J4S3FDSCMVSMrkx3SZPlk/i4WTJofMCwzVORjEOUVo7huk6HazyDnnEPFqmJHEM4quXoz1kw8SpSeJOqu/36VapKFwUaexVA2Mp+hRoXMlRvzAgneElmYpoiuKEoRcqeiVBsp7RDTp0H0wBMIRmpybSFLUOc0crhQPOL84F/AS/0k3oL4V8QEWQege/kn2Mzi7RrS1kFS+i3gE/6dflwEbyRqFYUxSt6mbkk52H/DvoHChkDMV5iJ8AT+hcp0Wcika+tu7vGTLSWkC6WYokPbpZnjgJohGLGRo31JkOoguOHOIwFOON7ghsq7GdLGmK+1HMMFpByB+HejoMZ8Z/qXtEnDNCtinQeOTikDZV1F6y9Tm6hYr7EU0Rd8rSUHykR4z8gyK4bybaw+gvtRAcycnT+H9GSRpzyHjiEpwc2aGpQ91GSVhHHlstkd6iqUPFSKN5oTWIcIzoi2S5QXoGFQ+kOulET2djzGsYY75Wf0VU0LOmTkTSzTpEX3TjZhtg1HWA+cBS+i5h5lzdkshreoQF4repnQWtO5CWbfp1GWoj+jX5GNIRyE4qygGkKcUPW2psscl2XQ319NWzr/popomTkNRN0hSsxA7Fz1tW/GoJtdqQGZw6BuZDDlR3WdHNRiSrIBamQx6ss3X9SpaehHzaixHHowjxtHaQdH2zMbM4m0M2YQXJWk7crLfGGcWxh+q5o52RupOJcAPyDN33ZoPPOFi7HaywkeEaN9R9bDRHtMq30Bgu6mHkCRvJ86WyxkCFh/B2secTngDmG3gCG77yTSAujduniMMoyd8y8IHkc9jh1d11JBsgirCDFjp0OxTkKHUjLCDtOhUHa67HSp0irGm0nOzzhh+xTTwKe0m1YwKkXbONWaNoi3QrmJI06LYt8t0oOU0W5qMNNt00BklM7T4gaatb+giHyUOT/Bd+0N9S0ZEv1m0QJBuvBZyosdq6CuNG9wnUC8+R2eOBsSQptQQkn4jVYX5kpYHPdMNfu1AqszNQD0lWg43Zpz0srXp0D9yD4am9CEnLtGP9FHAeygPHFE8gznYJvkh4RTIt+VnQnWfwUrGv05hm343yD59dm41eqFsY4fHq0NoB/ybarVuIymkj7YxFPXTeE/jsEK+jvRXxRtrZkSaB9uZEs02wLpdEPAjfvU3TheJCdHL8BpwepZ7eHKYd4u1l/E1oLmySzI1IosrntBe7lIX+JpeGEk5xbgldOGitijZK3lhCY5rSCRCvmKZ7RL4naleCNMktascKfhKhmx1pL9wMo02YTPwBUoryBSPciIcweqkeExWPoi1+vV2NRpiDvZW4EHVSOwlPiNbIoy1crQTbzRycpKrMLmCc1WSNJS42Y61ZAStkHdl5rDPrweqw0fKvARsn/y5mD8i/huxR+XcJe0z+NWKPs7ly1J6Rf5ex38m/8FT+ctaUvc02y7p2yL8WOGl4Oc4YXsGOsa9ZK3idtMYZw6twxrAQHiht4IHSFh4o7XgeT7JreG1+CevAL+WFrBfvwruwofA0uRk+JsP4KD6K3QIfk+HwMbkVPia3wcdkJLxLbudL+LNsFPxKRouGohO7U3SRmPRL0V3OxKOij9xdzxWDJU9fIIaJkWwRvEieF8+IJewN8Zzc770l/iA2sHfERvE2OyC2SCnhc/GelCcOiV1iL/tC7BMH2Dc4h3gi9DHhmaGPCc8KTyPynPAcIs+1Mi2Xu5ZvBbyCVWCdzytbF1gX8tqhpwlvGHqa8Mahjwm/zLrCupI3C08j8sudqJPBWzpZTja/yslz0vxqJ9/J5x2dCs45vJPT1mnLu+IEYrfkkuQS3j25LLmM98BpxJ44jXgtTiP2wmnE69zKbmXe2z3XPZdf757nnsf7uLe5d/O+7jh3Eh/qTnan8RHug+5sfqe7wF3AJ7uL3d/x+9xn3ef5/e4r7it8mrvGXcMfcN90t/AH3W3ue/wR95B7iM/yKnqV+K+8Kt65fI53nleLz/XqehfxBd7F3iX8Ge9S7zK+xGvqXc6fx/nHZTj/+CJOPi7HyceXvMHeYL7CG+GN4H/0bvfu4Cu9Md5d/BVvnDee/8mb4N3HX8VZyDdwFnIDzkK+iVOQG70d3k7+lrfL+4C/7X3oHebveEe8r/lH3rfe9/yA94Mf5Yfh5/Kdn+8X8JN+Rb8SPwXflh/9C/0LeZHf2L+cF/tX+m1ENPRqEVn+bH+OyPbn+k+IPP8p/2nh+r/xXxCBv9RfKqr5y/xl4nx/hb9KVPf3+QdEbf+g/6240D/hnxLN/dP+adEqlUwlxZWpRqlGonXqttRt4qrQ20UUht4u4urQ20W0Cb1dRNv05PRk0S49Kz1LXJNelF4k2qdfT78hOqTfTL8pOqc3pbeKLun30ttFr/TO9E7RO70rvVtcn96T3iP6pT9JfyJuSB9IHxD90wfTB8WA9KH0ITEwfSR9RNyYPpY+Jgalf0gXicEBC2xxcxAJ4mJEkBFkiFFBVpAr7giSQVLcFXiBJ8YG6SAQdwcFQYEYF1QMKonxwQXBBWJi6HcjJoV+N+Le0O9GTA79bsR9weVBKzElaB20EdOCdkEH8YugU9BJ/DLoEvQUjwS9gl5iTnB90Ec8HvQL+okngv7BQPFkMCgYJH6Nc6DzcQ70aZwDXYBzoL8J7gumioXBtGC6WBzMCGaL54M5wZNiRTAv+LV4JXg6WCD+FPw2WCJeDZ4Lfi/eCFYEL4u3gtXBG+Kd4M3gHfF+8Odgq9gLr5x9wY7gA/FJ8GHwqTgYHMyPiGP5hfmdrLz8LvldrQr53fN7W+fk35B/g1Ut/8b8G63zK3Sq0MWqXnFWxV9JCSeMS/qave6n4pKet65ykYQbWaZVFC2K2bFELDeWilWMVY3ViNWLNYw1ibWMFcbax7rGesX6xQbFhsVGxsbExscmx6bFZsRmxebG5scWxZ6LLYutjK2JrY9tim2N7Yztie2PHYodjR2PnYqzeCSeGU/Gg3ileLV4rXj9eKN4s3ireJt4x3j3eO94//iQ+PD4qPjY+IT4lPiD8Znx2fEn4wvii+MvxJfHV8XXxjfEN8e3xXfF98Y/jR+OH4ufiJ9OiEQskZ3wEgWJKonqiTqJBonGiRaJ1ol2ic6Jnok+iYGJoYkRidGJexKTElMT0xOPJOYk5iUWJpYkliZWJFYn1iU2JrYktid2J/YlDiaOJL5JnEwUZdgZiYzcjFRGxYyqGTUy6mU0zGiS0TKjMKN9RteMXhn9MgZl/K/2zsfbquq693fvs/e5xHt+//59qBLjI8RaJEiUIA+REkqQICAiGkSjBAkyCM8oIeQWCUEkxKi1hkd8hhpCKSGEUiSGEERKCPIIJYgGkUeRIiUGicMapBR79vezcC9C3x/QkTvuuGvssc/+sfZa89ea8zvnmtIxveO+jtkdczsWdCzueLxjScfTHcs7VnWs7djQsalja8eOjt0d+zoOdBzuONZxouOdjtOxtlg0FotlYqVYI9Yj1jN2RaxvrH9sUGxobERsdGx8bGLsrtjU2IzY/bE5sXmxhbFHYk/ElsaWxVbEVsfWxZ6LbY5ti+2M7Ym9EjsYOxI7HjsZezd2Ju7Gu8UT8Vy8Eu8evzTeK9473i8+ID44Piw+Mj42PiE+KT45Pi0+Mz4r3hmfH18UfzT+ZPyp+DPxlfE18fXxjfEt8e3xXfG98f3xQ/Gj8Tfjb8dPxc8mvMRFiVSikKglLk5clrg80SdxdWJgYkhieGJUYlzitsSdiSmJ6Yn7ErMTcxMLEosTjyeWJJ5OLE+sSqxNbEhsSmxN7EjsTuxLHEgcThxLnEi8kzidbEtGk7FkJllKNpI9kj2TVyT7JvsnByWHJkckRyfHJycm70pOTc5I3p+ck5yXXJh8JPlEcmlyWXJFcnVyXfK55ObktuTO5J7kK8mDySPJ48mTyXeTZ1JuqlsqkcqlKqnuqUtTvVK9U/1SA1KDU8NSI1NjUxNSk1KTU9NSM1OzUp2p+alFqUdTT6aeSj2TWplak1qf2pjaktqe2pXam9qfOpQ6mnoz9XbqVOps2ktflE6lC+la+uL0ZenL033SV6cHpoekh6dHpcelb0vfmZ6Snp6+Lz07PTe9IL04/Xh6Sfrp9PL0qvTa9Ib0pvTW9I707vS+9IH04fSx9In0O+nTmbZMNBPLZFoiqpHpkemZuSLTN9M/MygzNDMiMzozPjMxc1dmamZG5v7MnMy8zMLMI5knMkszyzIrMqsz6zLPZTZntmV2Zva0NOLBzJHM8czJzLuZM1k3262lEXPZSrZ79tJsr2zvbL/sgOzg7LDsyOzY7ITspOzk7LTszOysbGd2fnZR9tHsk9mnss9kV2bXZNdnN2a3ZLdnd2X3ZvdnD2WPZt/Mvp09lT2b83IX5VK5QksXXpy7LHd5rk/u6tzA3JCWrhuVG5e7LXdnbkpuekurzc7NzS3ILc49nluSezq3PLcqt7alxzbltuZ25Hbn9uUO5A7njuVO5N7Jnc635aP5WD6TL+Ub+R75nvkr8n3z/fOD8kPzI/Kj8+PzE/N35afmZ+Tvz8/Jz8svzD/S0ltL88vyK/Kr8+vyz+U357fld+b35F/JH8wfyR/PnwxwlwW30K2QKOQKlUL3wqWFXoXehX6FAYXBhWGFkYWxhQmFSYXJhWmFmYVZhc7C/MKiwqOFJwtPtbTXysKawvrCxsKWwvbCrsLewv7CocLRwpuFtwunCmeLXvGiYqpYKNaKFxcvK15e7FO8ujiwOKQ4vDiqOK54W/HO4pSWvruvOLul7xYUF7f03ZLi0y19t6q4trihuKm4NdB0LQ13oHi4pcNOFN8pnm7prGgp1tJQpVKj1KOlha4o9S31Lw0qDS2NKI0ujW/pk7tKU0szWppjTmleaWHpkdITpaWlZaUVpdWldaXnSptL20o7S3tKr5QOlo6UjpdOlt4tnSm75W7lRDlXrpS7ly8t9yr3LvcrDygPLg8rjyyPLU8oTypPLk8rzyzPKneW55cXlR8tP1l+qvxMeWV5TXl9eWN5S3l7eVd5b3l/+VD5aPnN8tvlU+WzFa9yUSVVKVRqlYsrl1Uur/SpXF0ZWBlSGV4ZVRlXua1yZ2VKZXrlvsrsytzKgsriyuOVJZWnK8srqyprKxsqmypbKzsquyv7KgcqhyvHKicq71ROV9uq0WqsmqmWqo1qj2rP6hXVvtX+1UHVodUR1dHV8dWJ1buqU6szqvdX51TnVRdWH6k+UV1aXVZdUV1dXVd9rrq5uq26s7qn+kr1YPVI9Xj1ZPXd6pmaW+tWS9RytUqte+3SWq9a71q/2oDa4Nqw2sja2NqE2qTa5Nq02szarFpnbX5tUe3R2pO1p2rP1FbW1tTW1zbWttS213bV9tb21w7VjtberL1dO1U7W/fqF9VT9UK9Vr+4fln98nqf+tX1gfUh9eH1UfVx9dvqd9an1KfX76vPrs+tL6gvrj9eX1J/ur68vqq+tr6hvqm+tb6jvru+r36gfrh+rH6i/k79dKOtEW3EGplGqdFo9Gj0bFzR6Nvo3xjUGNoY0RjdGN+Y2LirMbUxo3F/Y05jXmNh45HGE42ljWWNFY3VjXWN5xqbG9saOxt7Gq80DjaONI43TjbebZxpus1uzUQz16w0uzcvbfZq9m72aw5oDm4Oa45sjm1OaE5qTm5Oa85szmp2Nuc3FzUfbT7ZfKr5THNlc01zfXNjc0tze3NXc29zf/NQ82gzqHEjf6jPPuHkBZDBqhUy2SLGA6Vdx30rMuH8OEAJsJZmnRwldkukUP59VxE+f7auZM0MngAPOBlM8vf5RP3JfSB6RMyDvXtYPxNzIsqC7wNPxxmt2FmHa/3sPKUoKdEXeQ2iy3Qvvjy8sfJTeHcIVUB9KHz3xJnuDlfO7IrFDjjOT7RqJVfxw4qILAtaZ2nQ+g35SsirxYMwLTjj4xdbrJXt7eGIeePCY57Zjs9xpeLKGiVvhO76cPhMRjXynp6Mj2yKNTLL9V34Yri3VzgyHjuM4MO6Pjz2O8OR8YnxT9cYMuP4v9gzgt3j79Y47FLLzNZCBIPZr4TsD2Ie8vWbOOsFCAZnSuAb8sAlEKckFoUXibgCPos9ulKxOpO5g5ef+dKegD77EOHbxSPPnD6m2cHvc0Bzd5a+qed89RiN2KVhT4yH9JthT6J4YB/WHPF2RWQd/BpEXOSd8RUvMTEn+f1d+f487XrmyU9NJSb/C7oGxAN1adnxXlGoKH43ZddSt4vdOX08UIpwG58geWHypxvEg3qF99lQi3roi7qiVFEgnipvoK8R8+W3JRoaUV6YQTxsCREPZPS7/y46GX4B7kE98YgQ4LX8rs4TWezQc0RvcL3zmp5AdDahX8lYZNcn+O6Xmqk/0687Rf/4/iyqczU+Jo+M3YX2h/Rm/Hf4YUVv52EgoLcj4VwbDAQe6sMWveHx/IVFaYd0/Btrxr9kzTvxzsXhvLcvCscQivXFsyCZmHFDFcz1TeFcGySERtjw9Y3hXEfk90QOt/PGvw8pJwruhPhBm64UN/lE2sg1I+JlIyFEk86SQJJHpS9AQkSJAkpeUWWV3prIrvjRRK/BK3DN0HAko1DRZvVQtOFp10UP3cRMwYOK457zV1rYCGkB5zs6AzYC/sV3yXiyd+f14UxFLwq/1GAjNAIGG6F+Ou9blC8NAkLC6ZS0J45i8FW68uqzm9tMrCJi5IyOLbQE0SxDq0S7+UZJyCjRLOSVeN9jH6gLMRPQ516LPm8MR9XBD/uSRZ+iLpATUbgbCaMoCMgJqnCw75XPPnHEA4h+wfWjwvmCj5DevqjRF4rIJ2ZzYzAaXjbsrclgJafVRlEQ//uZOJqoyRTNJuerRKwlsd9TKynqnNB5KhjuFq7iK8JVzApwFR6ScJxmRBoQq4B93AxSR701O9BRKwPNTq4o0olvx3sO/VymPnxS7RuifHCEd1jfIm3ikO8JGgNdDP4GLkA+sFeXIm3G+sJyIIrPaEyz+qb+OP+kb5FVFtmnnkinYJv5Gtt2zaZvfVf0buEhqGQN+kr4DGKrxt4YdHZe27ndP4kcoDXgYnaGgm4lY6Maw6gwIvZuubzXWIP086+kf7leMioKDhVt3jfEaoApNLgQ+OVy7KtwlIzVJESmiTcIRQf3cSXj5jwn+/Nk8HyQfHwR1izcQWvs1f7hbBp8TC6cIxOdsnYdNVEcyzoFb+HMD1u4wy1KOoE4YSdW4o6K2/mKYHGNmc1jOhYXO8+L2tEjiqy4P1YLGhh+5KuhKOwQ2cYtfTrhg2s26S725yI+J+3gPi+KAluD5kW+gXmVXWQylLEwI3oOucNIyxdkCb8YWsJEAY3NDBpAmEsQJIY7iJaB042Ho8pIYscaaxb7HDuH3Z9fCb/a2LR/a52Hm2aHI2wwJWSmU0cCXiDef204btQ3OA9TAu9Lbjv7VIEUZMlYoaXhJvYCkV0BsgRtYuxGC1/irVWNV8XnjF1BlOtPVB+Wb0Q2UuGKvHtQJt11rLhvtC3kJoNbZfTqFvehiz8q7uN6cOHYllDmFSHWxJF2ABNg9ih/XVLuMYvmNY9mFbYrpAEjK9gpXtrTuVfaYWHwXcTjsckdxhl+geOo9QSXiVYNwhIMAdKgp0Z7oM58zOrhBQgVLBxDM6J2dm41qyQbp3KvKFMrNfe02pHhG12h7sigjyp267GKYRV5VLwg28y5R/yup7l7dB5dQ9wafDxxUBvFwqrHOo6yGtUYOv9PT8O6YB2nY4O9+FZIXWa19cIFx9iNaJC7wusNimWl9hc5rZq8rEzBsmiEfeqkDb8AywKOGSyLxhn8rnkLIw8KR5TpsN4BpXRE2kpX+sK8+lq9RiVnQL1gDxNX9rH91ukuaO9LYesIW4/FyC600Lwv5BZYRm+e7kXqipuoteL9nc6rn/5ERls9AVe0NOQCbFpHqGJnu6SckGqe9KMnje+DmGHdIVs3qtGLcgbL9qvhLHjf0NvRRyD/+mmuJXOcvRblPxTYMC64hzdC/kJKG8yuMGQGO7XcUGZwFzx7iehNrcOKAMoHk3QBzqa12mrd64DVRhdvVt9Yucs+9MCrQUusvqn+8RRRf32F9pp0vose1F18xcMh5RjcmObLJ0cC/sIqQ0/RW9kP7GuJ9DZYT9YmoJdA7XxH397bomQ9wX/VGjHQk9I+5BW0NFRwF7ZKz7B1QEKD5MbTglXGCheL7qO6F5QtyFTwRr8N5RUeBkf0jBfCcApSXSPpSDc5RwJ+dPAV4CMCFYSEpCIz3Kc1ta+d39k92SCG8cC8Km3CChGbDQ4lq4TVDfjFzWFrtPlO2QNfsNb1yKVt7797TiNHtlj+JebiF7pe8s1nbQWikT7omigIFdbR/6brB4bUGHlLzwQFwuoSvEu3kEecvw7byGEdP6x2oe76mpBGjBv5Rewmj53TpnaFrkROgpDTOiJyd4g6MrkQSG/WkkL9Oov0Lta2sje8ScaX+AH/8kzDiUfCY1Nzb5Z6/hWNEhjQuM6wCmBlBCaJmn4nwpY1rK+ekB1hV8QyvSWHBCsIZFItsOqdb8p7hvd1pcWDU8JvZJ0bGaMK77cEVfgjnw2OfXYBBp90SdgaO5bVCpSPxQJSdmrb+LbA/zA+0ICqvS4e9LvrV8lVg1ETqgzJAC2ZHcs+G/KswR0KB+xLGpsqRlgRWjeBpvUeCKnF4JOgT6rhsTM46ylH14gO8Y24WDXYFUM0L/jGsSue1fWgo9L6VXof+9M5a/mikepCmrpaw7qibQek9S06JutGmLOIkKlIZlMpSPhsU3Ovp67BbgH31kdPeEFvhKp5y5RwxIyss7FTT3+AnerX5qjGerXt5tbfx1Vvp6/q7VzV9sW2ma3fA+xUUEPvwbZrhKDq3/Zo22NtnxSC6lohqAYKQTVICKrr2ta0/gYLR3V926bW35C2HW072/5c1XuGCU01XDV8RghTdYPqto8UpupGYapGC1M1Rpiqm4SpGidM1c2q6jNeddtvUVWf21TV57Oq2z5R9Xy+ono+XxXKqlP1fP5SWKu5qufzoLBWXxPWar6wVguEtXpI9XwWCnH1sOr5LFI9n28Id/WIcFffEu7qB+5od3rbD4Wy2ul+3/1h2xHhq34b4KucSICvctrd3e5up1uAsnI+5L7svu7EAnyVUw7qvDt/KmTVlUGdd6eP8FUfD+q8O/2C6j3OEGGqJghTNTGo3uPcLmTVpKB6j/M5Ias+77f7dWeKEFR/KQTVXCGoHhSCap4QVF8Tgmq+EFRfF4JqQbaUrTgPZWvZS5xF2XuzTziPCym1Mfu97PecnwovtUl4qc3CS72Q/Wn2Z87W7PPZ552fZ3+e/ZWzXXipl3K13LXOPmGhTgsL9e+qBX9GiKj/ECLqrGrBvx/U9nHdoBa8GwnwT245wD+5lQD/5FaDWvBuLUBBufXcS/l2txHgnNzPBPV83FEB2sm9MUA7uWMCtJM7Lqjk494cVPJxJwSVfNxbg0o+7jRhnu4NKr+704Vn+ivhmb4dRIvd7wvJtFpIph8KybRGSKYfCcm0VkimvxeSaZ2QTP8gJNN6IZmeLW4pHnA3FA8WX3d/JXzSr4VP2i980qvCJx0o/r74e/e14nulpnswqCYf8QO8USQW4I0i8QBvFEkEeKNIMqjzE0kF1eQj6aDCT+QTAYoocm2AIooMDFBEkf8ZoIgig4IKP5HrgmrykcFBNfnIjqCafORl4XveE77nTFuwf4wnNE/0DzA9O7swPV2Yni5MTxempwvT04Xp6cL0/FFiejpl8ZMTqaihpzPEhPC2mHg8MUUqYbCf2Ez57ruF1+CV84lGfyJcofmfkEdYa7bIv+q8VkRkyROVbCevXT5KT/gJMk6oWm5wDOQOTg/Pu1Pld3hHz2clY/Yu0xlisfjTid4RxcST9UVdM1FPwO9Gdtq6cJULjidKLdrXOKPr8fIoshv5unxzvPGMYt7UriAyt0SjRBz6SR3HdCWjyjXyKOE/bcfnckrXmFHSXTPUcj05YaonEcUXNtUeGXs01DfmYrzO4zchRgVai7wxIjfXvr+r9UzQBmB68Av015cqEuBSbfYe/TpZLWvv23VMhAyvHLV6WWNbkQmTSySKMnVTrpGvAa+KogU+PlDy7OVtNL6zB3UlPgh52z2+Dh+KYkhRzlN1Bp8IuJZbNWLEBd9Sb9fSNx2D6eErlipmQ9xCqA6ig623B+PzAG/XlebtOt6qvvFMeT+NZxn+wrMzzPquJeFowFnQAPzly+vH+Efnh5zFl3IlKBC4zJsUchbonyhog0d1LI8GGWagBKg0E+3Ut4AC0YwYTzTVXEwMQ1/HeAptw1xE5FeKXKkz4+AmXUPmFvu8XWVx8W2iInAnnwyp0XjGB1lxI/GmqWssP6m/VvT/c51XhMlXDDLqMrMW1QmBBO8bqns1pDdoyUQvqF1x/R/SW+SMRXVbQ9qL/LNFbzrjjw0pzadyzEFrxl+05h2f7CdFIRrtduaLSjyqIUG9DXjZzLhFFefNdac114qXRK8J59qfqCiaRqZ9Cq3OaByixFfkRyOrGNnrg5gRssRHSoNjOxXSpDszeE67PFztiihEiaCM1fO3Wb3FY3ssnEEQY9Rg8L70/pRzVOETeUVKEC0gkiou8xklovhQC/vuQiFfD2cZyex/WeeZBTyY+Ewn0+qMfGQ+c4QPVNGv6CXhW6iJ743Q04iNoR0s/UJdqyg9RF88pOdLnntXhzQJZsJQ6RiLVqk984Tu0ldEGQ1ikHANkYPNFpValHwefb5l0Sex+fEhfXovhjKWHPro85o1KmnJT2rqmBMt5vnU1pJE9Ymo/TY8Y0vvqOYiis5Cm0se+n2t3uJVl9YGdWc0suSV/32NKntj3qzZZAyv1fWSGJF7Q+0ZuU9nqNzzv/R1SMiJAXUZK4K7OsNZ45mRFWFrdDGoR8UdibgY/hWdGHQmfdskrfoPyH89E2l/o46hUqI+f6NekW+NLta3g/Awz4cTO8MWLR/1rGueCTnLxHj+Qm+HEt7Wk+eHfIruaCcmOiO8N/pw2Fvv78SDeNJt3aGv8+W7p6XukdHaeNvRLJIDH9Ibu8nmiW7WDH4haNuPqn0s1K3+1cGxfX276KcbtBpBj+h4tI6RCZ9GZmJfBfrX61TLrG0KjkGHI2mNVUlVgCXBr8ZSHRJaoVC1P0dPHmNxJdJV1pc/V9QryWb6oNkxNsztVjvd4nGOrwznmjYqW8u7SX2gigDWFzx+h94oevZuEcVKPrg/g9LU23JoeUbEKZG5ahXP60b9vE/rXbIzTRwI21gcxDWRvXrXYo0httDfII1118DgvL80wMZFrgva6MMh5US+p9GeTk/UUpvkDY3zPcTOLbsaOSDJ7D6kM+BFVN/FBXFC/RJisR+5YFSRq1N073Rr3I7pja/pK6SVvNGy2eA4Yk7gHsBiCs3jyzYzeC9mHInHWCE/ueYm6xqq1Ei+Gen3ElSh87OEhwBtb9kVUeJP2ISSfv4LOj6k84M1wqBhbLviE7oGtLfscCrxGKvpqNUq+t5N1sKHhDzwD0oOa7/x6PvS1D/Q0/iWB0UD1vXtilm2E0mardFD7zyju0AsvSpZioV8q2b/LbXPmt7uOhcbQxrYdrhX1Bxh2//v0G7HJnfBDYNpI9OACkOy7kz9qufD1tj/oP9fV7tCfX5V7YmQN9lpxpsQ0oDHWgYeRPKzGsVWFMd54ilDq+A/aD8c9tAgF7+kK9EjN+gYxCo5HmMs7cDbxe8etN0t5F/kyYUtKBAj/QaF+stuPclYjwp/D4bUa1OyiQFfGY4MCF2QWOCDI0Sa/4/GU1/Rrgh9uzBt7VR5HBdUqogKf9Mubd4u67pd/WyX9d5OtQzsHzQaspRVwK9EjY/o13GSq3eo1XoEuzeKDpXUbde6qf3bugZkQ6fu3aSWDATaw6L2f9KVkdDu9YRXMGh18aDRjDfpmulqp6pFzrt6DnVHWL+jba+zjofo7egR1qGyt/neKNY13CSt0S4Lth17leo4VAtDx43XEzaohTawack+ukRSWuMWWfl+JaBnXcmoalVF7Uzvp+q/kFhRVmHkG3wdq1Jtt5C2I6d0/W91frBaovLwJhip5ToPnT+g41U6Xo9FrSdM0qiKWvBCGJ76vsUdj6n/ynqK/NKyzCXJo7rX4L+f1cgLGRCFf0HY/9ri08/pyW+oD5+yaBsr+s/0hA3IMV3zXbV6Ala0qfQj6YFXJ7qAr4NrdIwElowyrSg22h37WS3oSWVc+P1oLVTcMl2zhrdb8kr3+j/R09BB6BSkLuOgnCVaL6YW613fGwWZRHWf3+g54OGE7DEWLKhrKq98R08jq4q1P/lgP5T20eqMSrcG4SH0jAdG56uhNeKR1YZ1PSH0L/GrqRQLBjp7dmhbUFknsEMWqf22rpf/CvnDt/twGSt6Ku7QynaKiMtMzaGr4AgdS5K7Y9XO0TUf03F/y+KS7I0idZG34LSwWI7r20WlZqcl8i6g4b/VvWRDYUny7dLCrEOR83AoeTVYO94Fz4yq0l70V7KEZSmBffQ+rus/hx9D16zQGXKE8AuJJs06TpYVLbgZcieieqbJRBICz6ynQO2Az5N96A5V3/qGvEPPqasKVsnIDaT3tywZq9GLsp6qhZRmVspkBSCLsCfJlLs5/AqfPMBn1f9EyPtUmDNVKjeFPGW8BOCEHgq/xaytJFfxNrNjlqdMJ3eh5o4MLrBWX9Ec8Uz8yeqPQdGBFpWFHNmve6ncSSVC7Dethtijy2hkPITTrdUcnqveOtNLz2E2kZ9I9RuwYNVGLWl80LKl5dH1WOHerzPY5D9WS96U1kGsJSM/Cu1q/LER8Z3xFKF30IBjP5jNLkxPF6anC9Pz3x3TE/He9d7LDmkLEH6BPA28U5X/au8ZsD49undhfbqwPl1Yny6sTxfWpwvr04X1+WPE+hhfs72vL5UhiCjgZaayK7VMtEYytaAv1eqCijtEj9jNW7tjmPr/VOP4ia6kQjvxBvLYFMMwGZ9kitt7uZOPQu4sudpgbtgLAA8s5yt6PtECshZcnQHrw5rf3qOY7BytyiKjtF6y9iumMr95o3LIyBcxmRNa4Zt9jPEs/CZonTN62j3KUn0sXGNHFGciQ5dYSOQBtWToskrvrpb9SvCzsMYzo6TjN8O4jhklYmNkVN9gjUzTHg31kBzBHjpPnOmCPYYMTmiAYidEDVl/kiM4UC05MeQ13shb1EIhNR0TIbBrnIBeIksbbyCVh+U7IC/WvUg+KbKp2IOaTGt80xPVdnCsK4kVKWYfsTLyTU0LcssYGXnKTKV9VYAweXhQ733WyBCRZU0+QJ47eqKIFFlHrbfvOuc3dOUFOPd2Hc9T3+6z3rvY4i8q5ZCH9BmLv4aEnGXvWGR2yyKyO9biLGvHIlNfAS4baHEWfhl8Z9Svxi/zcvgEU3X/zbBvJuJLNJSqOXgGx1jchGfkqpA33d/pjHxJxp9C3jPfBT2wyzdxd+4iogMnftfix0EhbZuKGuSoHdfcOXjT9OtZneluvcWqZ84eRlCdmX2QK3eGVGcy0XtcQG81i+o6LdqLWvTGzvC/sCiNJ3zDmnGrfo/JTVymqCp+Q7JjyUZVzN5gy35pzbhFFefN9XZrrh+25peK64rTGByDtZORlwrn3fQQj/Pi8HqqqXl2/Z5qSJNG5gvTw14zplKOcpoND24M6dbITKidegBkq0/QOFCTjL2NqEmDDkL2QoHoCOpJDLDov1dIk2aPJHyvr6llZ5DB4Yidt7cRqKxCeC/VMjzoDbwd/H4tfjqdQTvY+mWYNeZIcsU/ztvtKGEdQ6X9Q1o1FD5Z3mcyia09jyKKJBlPZadFY9/8/9DnTda7FJ+OvGjRJ1IRr5+98xG1nRgr6uHhq6WfzKniLgbzhGYhp9CW3vTzQeu9is+Z/qi31Fc7bxekW60v+h0ecB1fpRE+txdScDxJra+WWZCf1D2k4216F5Q2QtRF5RXhS0y1JGZtYzhf1O8xVER9GlNpRm3OmjUkHvRzl967WE/7iNXPH1jHvP129QqZc43uQp5fUL/HyBb4WlqefQeMbGSuicsio0DfYpUJT8PeH7buIHJgtAbZ7XiNqZwxT6OEnhqoFnmiGI/ZZYn6E8gW5Lm9yxK7KckWAiNlUKFEPuSdJ0uevNvIRnmi7eslA00uLzoUebhax6A6qLxyK/aVsAXb1UKxXxWegHxc6vcgMZA/M/WrkVpqsc2QLa9pdoh80CJhmFnyg9lVjQxpxV2MtXZh/Z42tZprLAp3VNianUr+1LLBsEXRjKMtz34Vq1LXqCcuNYqaluWJHnxZLfV7eFpW7yJ3nygXtrE4iGuoXBjpqzEkY/stUUJeT7tO5/sHEsm9W9Ww2N3pzvAu9yVdeVItOz1113nxgvtRy64miobNrDgE+7ZQw8/sbLVZrbUDlBlVrFn0ILE9squx/d7TGx9Sb62aGa7itaYeBk9mtz5ytdlnkDUF8g1Jgl0EV4IAhs4/b9G8tSeUq3i52d9NiDGzJ5RlVxj+xSYU/3of1zFSdKBkvm/xPnJSyBhDvZ+y5pEqC9g28IgsHKI47LMTOaRInlAU3rfU/t56jrjSvp6qeGYPmj76Cmr7TbK+Li7a6Idtr9G+SW3E9DaYBVaRaB/0BZq9qV/RDtNCSWgsCuwBVl5ISPQmdJKwvh3Zy8pRiAdTtet608PoBzOIbUmVoE+HNGD46zMWh2ITUhlCtBoR3s7QKv0Bs54Ie+iZ9Wlo+bv/qGNFhd0+uneIpR06rf4jx8iyUGTRSHtb8kct2kPeys4xNUXQYhwPxA5XOzEcfzMO9jGWKvVCwOZiH1KfgApSUY0qVgQyELmn6GbLtp9+jt7MHpdfCHnB7DkIRpmRRweBw0BKoxdMFUb1GSwX2Cx0E94D7FW0niwTg17aw4pY7c1/yI+mfg93odOJwRMzFk7FaEZQkvTk1zpGSxKdHRPedeHOVpHBrNzVkmXE+oiKOKayGnQrruEJonDjDwHhjQYH+/JljTxjRV1AIvQX6Ve0wI8CrI+ZF+yKUdb4gKekGqVdHTOrJ/8PteBE1SIPTf0e5O011jPBYh7TXazub9HxLLwBOhauhdFGYhsvRNyibbhDz3H/Te89ZVnmY8L3mvoia0MKN78yJm0Wnwr/TQUdsw5itFmtNCXxxAvuDvWQHc3mWC3rKVACvIuqYKzEp2OvqsUuosVDwipjuEV72HLgGoXuMvIf+Yllu1jHzLKugUfM0+BHpPpEixMraj9Cq/NkeVGjjl0OyUu51aKrMdZYwZszrPUI+hQ74UppH0lUU1OTasrUvER6oMfxh0BXrM2RlmgoyVV3oK6nqnGPAOsDd5g11zR4FhteZ/D4sQMploywXEYXyN/lPkerM9A5+h3bY7haYWVcZQG5Wqm5wlKbytNY9chbdgpTfpe7XbaNqPS8XcOwZD6lewdYvM9zWAXgDUtYdhr22KdDDXLe3mFUkp6tZ2LJUL8H612ZJCbnAa8g6192tX7A4tCNrFx4r87gpUGz97Yo+RqLSqEWsvW0DnLbRQ9gs7DMkcB3hDRjNObnLbr6ovWuC/cXe8viVtZQ9ZA7DI+A5gG/QhYZHsg3LAo8EV5vvAHoaGrhIJfwNrMHHHJgUsgdRkc/HPYZLWlom7qA74YUZfhOdq+xnNm/Er1/gzWzX7aeiedzdGjbG6sezJlsgHPeZmxmnZedYKi3rvO814OK1P6Lxaef0a/4ci/mK9Sqz8avq8wKV6s/4zvV842nCD9Jp9r1H5zpwvp0YX26sD7/3bE+H3Nd1/fWe896G7wfexu9n3qbvJ95m72t3j9627yfe9u9X3g7vBe9nd7/9XZ5v/R2e/u8l71XvF97/+y97h3x/sX7V++495Z30vud97b3TmZRdlD2uuyE7D3ZaW2BhA/kRWDzBtoqWJkEK7wgJz/AUR5q/Qfo5MCODPwugSY6Gwje1n/LCnVa1phTaP239LXTskWcy1r/l7f+W6tWp7WmdFrWQotn25yWjnJaFoLTkvhOS+I6LenttGS6M73131qDO7Nb/3Nb/wta/y0L22npZ6elVZ2nW//LW/+rWv8tq9HZ0Prf9F/hnP542/8EcLerJwAAAAABAAAAANtj/TYAAAAAueaYPQAAAADkXQte')format(\"woff\");}.ff2{font-family:ff2;line-height:1.088379;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff3;src:url('data:application/font-woff;base64,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/51///zzD/cfd3E393Avd7iP++Nm94/dP3b/2P1j94/dP3b/2P1j94/dP3aL3WK32C12i91it9gtdovdYrfZbXab3Wa32W12m91mt9ltdofdYXfYHXaH3WF32B12h91hd9lddpfdZXfZXXaX3WV32V12w27YDbthN+yG3bAbdsNu2D12j91j99g9do/dY/fYPXaP3Y/dj92P3Y/dj92P3Y/dj92P3Y/dH7s/dn/s/tj9sftj98fuj90fu/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr/7o1R+9+qNXf/Tqj1790as/evVHr4peFb0qelX0quhV0auiV0Wvil4VvSp6VfSq6FXRq6JXRa+KXhW9KnpV9KroVdGroldFr4peFb0qelX0quhV0auiV0Wvil4VvSp6VfSq6FXRq6JXRa+KXhW9KnpV9KroVdGroldFr4peFb0qelX0quhV0auiV0Wvil4VvSp6VfSq6FXRq6JXRa+KXhW9KnpV9KroVdGroldFr4peFb0qelX0quhV0auiV0Wvil4VvSp6VfSq6FXRq6JXRa+KXhW9KnpV9KroVdGroldFr4peFb0qelX0qulV06umV02vml41vWp61fSq6VXTq6ZXTa+aXjW9anrV9KrpVdOrpldNr5peNb1qetX0qulV06umV02vml41vWp61fSq6VXTq6ZXTa+aXjW9anrV9KrpVdOrpldNr5peNb1qetX0qulV06umV02vml41vWp61fSq6VXTq6ZXTa+aXjW9anrV9KrpVdOrpldNr5peNb1qetX0qulV06umV02vml41vWp61fSq6VXTq6ZXTa+aXjW9anrV9KrpVdOrpldNr5peNb1qetX0qulV06umV02vhl4NvRp6NfRq6NXQq6FXQ6+GXg29Gno19Gro1dCroVdDr4ZeDb0aejX0aujV0KuhV0Ovhl4NvRp6NfRq6NXQq6FXQ6+GXg29Gno19Gro1dCroVdDr4ZeDb0aejX0aujV0KuhV0Ovhl4NvRp6NfRq6NXQq6FXQ6+GXg29Gno19Gro1dCroVdDr4ZeDb0aejX0aujV0KuhV0Ovhl4NvRp6NfRq6NXQq6FXQ6+GXg29Gno19Gro1dCroVdDr4ZeDb0aejX0aujV0KuhV0Ovhl4NvRp6NfRq6dXSq6VXS6+WXi29Wnq19Grp1dKrpVdLr5ZeLb1aerX0aunV0qulV0uvll4tvVp6tfRq6dXSq6VXS6+WXi29Wnq19Grp1dKrpVdLr5ZeLb1aerX0aunV0qulV0uvll4tvVp6tfRq6dXSq6VXS6+WXi29Wnq19Grp1dKrpVdLr5ZeLb1aerX0aunV0qulV0uvll4tvVp6tfRq6dXSq6VXS6+WXi29Wnq19Grp1dKrpVdLr5ZeLb1aerX0aunV0qulV0uvll4tvVp6tfRq6dXSq6VXS69Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr0KvQq9Cr45eHb06enX06ujV0aujV0evjl4dvTp6dfTq6NXRq6NXR6+OXh29Onp19Oro1dGro1dHr45eHb06enX06ujV0aujV0evjl4dvTp6dfTq6NXRq6NXR6+OXh29Onp19Oro1dGro1dHr45eHb06enX06ujV0aujV0evjl4dvTp6dfTq6NXRq6NXR6+OXh29Onp19Oro1dGro1dHr45eHb06enX06ujV0aujV0evjl4dvTp6dfTq6NXRq6NXR6+OXh29Onp19Oro1dGro1dHr45eHb06enX06qNXH7366NVHrz569dGrj1599OqjVx+9+ujVR68+evXRq49effTqo1cfvfro1UevPnr10auPXn306qNXH7366NVHrz569dGrj1599OqjVx+9+ujVR68+evXRq49effTqo1cfvfro1UevPnr10auPXn306qNXH7366NVHrz569dGrj1599OqjVx+9+ujVR68+evXRq49effTqo1cfvfro1UevPnr10auPXn306qNXH7366NVHrz569dGrj1599OqjVx+9+ujVR68+evXRq49effTqo1cfvfro1UevPnr10auPXn306qNXH7366NVHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvTqR69+9OpHr3706kevfvQK31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvfXvj2wrcXvr3w7YVvL3x74dsL31749sK3F7698O2Fby98e+HbC99e+PbCtxe+vfDthW8vfHvh2wvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG9/e+PbGtze+vfHtjW9vfHvj2xvf3vj2xrc3vr3x7Y1vb3x749sb39749sa3N7698e2Nb298e+PbG98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH3z749sG3D7598O2Dbx98++DbB98++PbBtw++ffDtg28ffPvg2wffPvj2wbcPvn3w7YNvH3z74NsH37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffvvj2xbcvvn3x7YtvX3z74tsX37749sW3L7598e2Lb198++LbF9+++PbFty++ffHti29ffPvi2xffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3BtwffHnx78O3Btwfffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99++PbDtx++/fDth28/fPvh2w/ffvj2w7cfvv3w7YdvP3z74dsP33749sO3H7798O2Hbz98++HbD99+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')format(\"woff\");}.ff3{font-family:ff3;line-height:1.088379;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff4;src:url('data:application/font-woff;base64,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g1kGsw5mG8w+mGMwajAcyEAH9aAZtINu0A/mHMw1mHswz2C+wYKDhQeLDBYdLDZYfLDEYMnBUoOlB8sMlh0sN1h+sMJgxcFKg5UHqwxWHaw2WH2wxmDNwVqDtQfrDC4fXDEYPdh+sN1gh8Eujut4ju8ETuhETuwkTupkTu4UTumM4YzpjOWM7YzjjOuM54zvTOBM6EzkTOxM4kzqTOZM7kzhTOlM5UztTONM60znTO/M4MzozOTM7MzizOrM5szuzOGMcoaOOOpUTu00Tut0Tu/M6czlzO3M48zrzOfM7yzgLOgs5CzsLOIs6izmLO4s4SzpLOUs7SzjLOss5yzvrOCs6KzkrOys4qzqrOas7qzhrOms5aztrOOs66znrO9s4GzobORs7Ix2NnE2dTZzNne2cLZ0tnK2drZxtnW2c7Z3dnB2dHZydnZ2cXZ1dnN2d/Zw9nT2cvZ29nH2dfZz9ncOcA50DnIOdg5xDnUOcw53jnCOdI5yjnaOcY51jnOOd05wTnROck52TnFOdU5zTnfOcM50znLOds5xznXOc853LnAudC5yLnYucS51LnMud65wrnSucq52rnGuda5zrnducG50bnJudm5xbnVuc2537nDudO5y7nbuce517nPudx5wHnQech52HnEedR5zHneecJ50nnKedp5xnnWec553XnBedF5yXnZecV51XnNed95w3nTect523nHedd5z3nc+cD50PnI+dj5xPnU+cz53vnC+dL5yvna+cb51vnO+d35wfnR+cn52fnF+dX5zfnf+cP50/nL+dv5x/nUHruO6ruf6buCGbuTGbuKmbubmbuGW7hjumO5Y7tjuOO647nju+O4E7oTuRO7E7iTupO5k7uTuFO6U7lTu1O407rTudO707gzujO5M7szuLO6s7mzu7O4c7ih36IqrbuXWbuO2buf27pzuXO7c7jzuvO587vzuAu6C7kLuwu4i7qLuYu7i7hLuku5S7tLuMu6y7nLu8u4K7oruSu7K7iruqu5q7uruGu6a7lru2u467rrueu767gbuhu5G7sbuaHcTd1N3M3dzdwt3S3crd2t3G3dbdzt3e3cHd0d3J3dndxd3V3c3d3d3D3dPdy93b3cfd193P3d/9wD3QPcg92D3EPdQ9zD3cPcI90j3KPdo9xj3WPc493j3BPdE9yT3ZPcU91T3NPd0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P1vbn23szzb2yRr7ZI19ssY+WWOfrLFP1ti1xq41dq21a61da+1aa9dau9batdZe1tnLOntZZy/r7GWdvayzl3X20Tv76J199M6u9Xatt2u9XevtRG8nejvR24neTlgBYgWIFSBWgFgBYgWIFSBWgFgBYgWIFSBWgFgBYgWIFSBWgFgBYgWIFSBWgFgBYgWIFSBWgFgBYgWIFSBWgFgBYgWIFSBWgKhdU7umdk3tmto1tWtq19SuqV2r7Fpl1yq7Vtm1yq5Vdq2ya5Vdq+xaZddqu1bbtdqu1Xattmu1Xavtmu2D2D6I7YPYPojtg9g+iO2D2D6I7YPYPojtg9g+iO2D2D6I7YPYPojtg9g+iO2DtHattWutXbMBERsQsQERGxCxAREbELEBERsQsQERGxCxAREbELEBERsQ6e2abYnYlohtidiWiG2J2JaobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWqG2J2paobYnalqhtidqWVLYllW1JZVtS2ZZUtiWVbUllW1LZllS2JZVtSWVbUtmWVLYllW1JZVtS2ZZUtiWVbUllW1LZllS2JZVtSWVbUtmWVLYllW1JZVtS2ZZUNiCVDUhlA1LZgFQ2IJUNSGUDUtmAVDYglQ1IZQNS2YBUNiCVDUhlA1LZgFQ2IJUNSGUDUtmAVDYglQ1IZQNS2YBUNiCVDUhlA1LZgFQ2IJUNSGUDUtmAVDYglQ1IZQNS2YBUNiCVDUhlA1LZgFQ2IJUNSGUDUtmAVDYglQ1IZQNS2YBUNiCVDUhlA1LZgFQ2CpUtQWX5V5Z/ZflXln9l+VeWf2X5V5Z/ZflXln9l+deWf23515Z/bfnXln9t+deWf2351xZ6baHXVndtdddWd21118P/62WdPdpHt7prq7u2umvruLaOa+u4tt8EtSVd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MADCAAgDIAyAMADCAAgDIAyAMADCAAgDIAyAMADCAAgDIAyAMADCAAgDIAyAMADCAAgDIAyAMADCAAgDIAyAMADCAAgDIAyAMADCAAgDIAyAMADCAAgDIAyAMADCAAgDIAyA8EUvfNELX/TCF73wRS980Qtf9MIXvfBFL3zRC1/0whe98EUvfNELX/TCF73wRS980Qtf9MIXvfBFL3zRC1/0whe98EUvfNELX/RC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13Re03lN5zWd13ReU3dD3Q11N9TdUHdD3Q11N9TdUHdD3Q11N9TdUHdD3Q11N9TdUHdD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')format(\"woff\");}.ff4{font-family:ff4;line-height:1.096680;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff5;src:url('data:application/font-woff;base64,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')format(\"woff\");}.ff5{font-family:ff5;line-height:1.089000;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff6;src:url('data:application/font-woff;base64,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59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenUfn0Xl0Hp1H59F5dB6dR+fReXQenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp1X59V5dV6dV+fVeXVenVfn1Xl1Xp2fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+en8dH46P52fzk/np/PT+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dPzp/dP7o/NH5o/NH54/OH50/On90/uj80fmj80fnj84fnT86f3T+6PzR+aPzR+ePzh+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5q/NX56/OX52/On91/ur81fmr81fnr85fnb86f3X+6vzV+avzV+evzl+dvzp/df7q/NX5p/NP55/OP51/Ov90/un80/mn80/nn84/nX86/3T+6fzT+afzT+efzj+dfzr/dP7p/NP5p/NP55/OP51/Ov90/un80/mn80/nn84/nX86/3T+6fzT+afzT+efzj+dfzr/dP7p/NP5p/NP55/OP51/Ov90/un80/mn80/nn84/nX86/3T+6fzT+afzT+efzj+dfzr/dP7p/NP5p/NP55/OP51/Ov90/un80/mn80/nn84/nX86/3T+6fzT+afzT+efzj+dfzr/dP7p/NP5p/NP55/Ov787n19/d/77+nGNa11x1XWux/W6bPzY+LHxY+PHxo+NHxs/Nn5s/Nj4sTE2xsbYGBtjY2yMjbExNsbG2lgba2NtrI21sTbWxtpYG7ERG7ERG7ERG7ERG7ERG7VRG7VRG7VRG7VRG7VRG2fjbJyNs3E2zsbZOBtn42w8Nh4bj43HxmPjsfHYeGw8Nh4br43XxmvjtfHaeG28Nl4br43Xxmfjs/HZ+Gx8Nj4bn43PxmdD50TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TcEHFDxA0RN0TccHDDvA3pNqTbkG5Dug3VNlTbsGxDsA23NtzacGvDrQ23NtzacGvDrQ23NtzacGvDrQ23NtzacGvDrQ23NtzacGvDrQ23NtzacGvDrQ23NtzacGvDrQ23NtzacGvDrQ23NtzacGvDrQ23NtzacGvDrQ239vuyoUaCbQi2IdiGYBuCbQi2IdiGYBuCbQi2IdiGYBuCbQi2Idh+X+d6XK/LhhpXjatGdm3YtWHXfl821LhqXDWuGleN3Nrvy4YaV43U2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrQ60NtTbU2lBrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS60ttbbU2lJrS62t/7gtv7b+47b+47ZM2/qP29JtS7ct3bZ02/qP2/qP2xJvS7yt/7gt+7b+47YU3PqP2/Jwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83PJwy8MtD7c83FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbcU3FJwS8EtBbdvfv3jzz/+/ON///3r1+zzz//89e9/+WRK7jDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MtzDcwnALwy0MFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBcYLjBcYLjAcIHhAsMFhgsMFxguMFxguMBwgeECwwWGCwwXGC4wXGC4wHCB4QLDBYYLDBc/hwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxQWLCxYXLC5YXLC4YHHB4oLFBYsLFhcsLlhcsLhgccHigsUFiwsWFywuWFywuGBxweKCxcXP4eLncOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHi48HDh4cLDhYcLDxceLjxceLjwcOHhwsOFhwsPFx4uPFx4uPBw4eHCw4WHCw8XHi48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPFx5uPJw5eHKw5WHKw9XHq48XHm48nDl4crDlYcrD1cerjxcebjycOXhysOVhysPVx6uPNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfDHQ93PNzxcMfD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')format(\"woff\");}.ff6{font-family:ff6;line-height:1.172852;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff7;src:url('data:application/font-woff;base64,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AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4AoIjIDgCgiMgOAKCIyA4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uBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELgQuBC4ELiE24LhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4YLhguGC4ZKEC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sLiwuLC4sL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')format(\"woff\");}.ff7{font-family:ff7;line-height:0.981934;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff8;src:url('data:application/font-woff;base64,d09GRgABAAAAAFUMAA8AAAAA03QABAABAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAABU8AAAABwAAAAcb0U+9kdERUYAAFTQAAAAHgAAAB4AJwEWT1MvMgAAAdQAAABDAAAAVlG2fPdjbWFwAAAETAAAAIYAAAGKsYBnDWN2dCAAAAUcAAAAHAAAABxcemAnZnBnbQAABNQAAAAUAAAAFIMzwk9nbHlmAAAHXAAASFwAALnwfkF/E2hlYWQAAAFYAAAANgAAADb3v4UlaGhlYQAAAZAAAAAhAAAAJAgPBRBobXR4AAACGAAAAjQAAARAbDY50mxvY2EAAAU4AAACIgAAAiKBYlOAbWF4cAAAAbQAAAAgAAAAIAFwAVJuYW1lAABPuAAAARYAAAI6Gx1XmXBvc3QAAFDQAAAD/gAADOU2pUQocHJlcAAABOgAAAAxAAAANMUDzA4AAQAAAAEAADFLDDhfDzz1AB8D6AAAAACvhDZeAAAAAORdC2H/5/8gBMQDYQAAAAgAAgAAAAAAAHicY2BkYGBO/K/AwMDy4//z/89ZjjAARZABowAAqw0HJwAAAAABAAABEACEAAcAAAAAAAIACABAAAoAAABGAIwAAAAAeJxjYGRSYZzAwMrAxLSHqYuBgaEfQjMeZTBiZAbyGVgY4ICZAQn4OjoHMTgwKCgqMSf+VwBKJjI8AAozguQApaUJdAB4nOWTy0tVURTGv7W2SYiDIJRuYfYQUvHJJdOLmUZevak9vKCOg7KHEDkIgmjQoJniPBw1iQY6lGoiQhSlo2rSxEH4oEEhBEV0uf328dY/0YGPb5211/M7Z9uUjorHRkA1mNeItWky4YgvOuAL5mFOk2U/1WwH1G0p5cKQ9tt3nUlyx0HM2dJEyOiujykd7qvZ59Vn7Zqwq+oHl+21en1B6X/1I89JniG2Qw+8W13epXrvUQpuAU3gGOcd0U7igT9SJtaBRz1Fr1XerxQL/kR5f07+MjwOmsBHaiwpbw4KqvYZfOXKh+vJWd43OZ8u8WP4IZxWpT9T1rPFQrhF3VFmvAT3K2U3d2eG07atDnYWOzZ4jY74MDkpNfoQaFGjdVJnmD3alNW6zmmjuOPC/qxsGCO2HZwmNgef13G7oax9g7vI48zW6LlSLNgnemyr3N7Sf0uz8Dt4yjbV773ai10e6tH2IDtGfU6pxyfYsQqNXqHbiro9j068W1BdtKMecSZ7GvvoBDM2lg2w/2HmXlEu0XOW96hpFXiPBmga7uGfQaNVfBHXwKIqEz2XSjq+gKdL3yJqyYycNyQ6fsB/W51hQ/myPdSrBYP47oBlNYU1eF4XEz3H1On7mI8Z/QK5aOqL6PFLtT6AD9g6XEePNbi1pOdJOLf7LeyNKqN2oQIbHX2QnB36EBv6iDlL7kt8P7Br0OY3XKE6y+hQ/Lf/dx1Ca3Er+V9Kd+/v3fWvu3f+D6pD0t54nGNgYGBmgGAZBkYGEGgB8hjBfBaGDCAtxiAAFGFjUGBYy7BdQU5BQUFJQU3BQMFKUen/f6A8RFwWLm4JEv//+H/4f7/7L++/uP/8/pP7t+9fvvcGaj4WwMjGAJdkZAISTOgKIE4cSMABIjhBBB9+hVxwFhuMwcMLJFgZ2LnxaAMAjikdjwAAQAEALHZFILADJUUjYWgYI2hgRC14nHPgZGZmYmJkZGBg7N3B+L/VNcMFjjazsrgxaG9mZwOSG1lYgCIb2diAJAA1hwybAAAA/0P/9gIGAscAXABWAE8ANVpiWmIAAgAEACECeQAAACoAKgAqACoAVgCCAOQBOgGCAbgCAAMEAzYDaAPYBBYEFgQWBFYEjAUCBaAGXgcEBy4HdAeqB/IIOgh4CKQI0Aj8CXAJrAoWCrAK/gtwC/gMRgzeDWQNoA3uDiAOXg6QDwIPvhAAEHYQ2BE2EYIRxhJGEo4SvBMKE1AThhPOFA4UbBS0FTYVqBY0FnAWxhb6FzwXfhe6F/4YPBhqGKgY2hkGGTAZ2hpKGrQbJBueHAIcjBzcHRgddh26HegebB7KHygfih/6IEIgyCEoIYYhuiH8Ij4iiiLQI2YjkiQkJHok7CVaJgAmOiZ2JywnlihGKMIpBik6KeIqOiqOKrwq+CsyK3YsCCyaLQ4tUi2ULfwuci6mLwwvWC+0MDYwejDaMSAxdjG+MgYyZDKgMugzSjOGM9Y0YjSkNO41TDWWNeo2SjayNwo3fDgEOGQ5DjmWOgo6PjqqOyQ7eDwGPEg8rjzwPUI9ij3QPi4+aj7MPzY/cj++QEhAikDUQS5BeEHMQipCjkLmQ1xD0EQyRHxEfES+RSZFnEXQRjZGgkbeR2BHpEgESEpIoEjoSTBJjknKShJKdEqwSwBLjEvOTBhMdkzATRRNdE3cTjROpk8uT45QOFDAUTRRaFHUUk5SolMwU3JT2FQaVGxUtFT6VVhVlFX2VmBWnFboV3JXtFf+WFhYolj2WVRZuFoQWoZa+ltcW4hbtFvyXC5cbFzMXMxc+AAAeJztvQl8XNV1P37vfdu8N/vy5s2+ahZpJI2kmdFI1va02Ja8yZKxjG3ZYIM3sDEkAbMFCJiGhBRICIQSkrJk/bWBJoG2pC6lCU3Ir0ka2k+2/58kbZOUkIQ2NP8sbazx/9z7ZnmyBGnT9tP095ON5NHC3HPPPfec7/nec+5DBCURwh3kQcQhCXV/HKPi8Cck3vZK38dF4cXhT3AEXqKPc/TbAv32JyTRfnb4E5h+v+ROunMldzqJ5e9/7nPkwaXDSXIhvB3aiv4Ob8f98J6jugfzvC5ggnkOfsIRjDZcU6wG4A2Lw7g4vDSMenvwzNGnEUL8zNEDf6DPXzjgrj6N+HPPDuz2JtXkVszVlnD/Tvi/j6CvoOfx5H/C+5bU9JEDB/DkFfBjgrbiT+Ht5AxyoCg6onfiWEyPuyJhu83t4qOqj3PCKA5R4FA04uDsIvIJLifmENcYc0yDQV1LGgyswcjsUzf8aYkQM4sQq4vgE6XKGO6v9o/gdHX5l1sP9Bc43ua29z56oNphvCJn7u4clfsx4d0uLXHi7sJY8ws6h3Mn8HZ0AlmRH12qd2BN0wN21afIDjvvd7s4G8zBSudgt4HoLsGvWjkFL5tB8XUmoJknoNEJ1CUexXXp6y+3Hugq+6Ig9gH4fOLu7LCzn2/zJU/cvTPCXlD7CJzbiF8AfVtB0gK22XQ7kS0cEXiQTLAqEidaJJ7jJCwKSJEJh4kVlG2pizoMwo611K0tk9SCbGZJbVRSrMJyu+FvpVTBkaeemn3qKXLm2amlu8lVU8+CPGBEFvx7+ElkR+t0F3Y4dCfP81YFIwkrdasyjKoxioIc5lEcbJRSnx80kk5lc5VyP94lhMs9bdlOrhc/2Ztp6+tJCm19YLlHEOLysE50v1nRRXqezV8mGJaGt1oERRYFQeJlC2hDQKAMkRPIsnXSDPv+Jny4vrnM0FdOHRYmnal/UIPvMT5OsD/wf0io69y/8M+R55APtaMxtAPtAtluQ6f0Xnz6tH5735tvfMPWqcmEetup4wd37Zwfy4ZDPkufMNPNi0cXuV0LeOcFXNVhx/h4Y3VgbeBvcQmkXOo2/0GNF3V5j6PTZnlPU3kzYP6lPg0UKYlOnM7m4G9Vq7JNQV+nU/B9Imr+5b+YytV/0x/HJfrblXL9d7GISzjN9Y+ROPZrfvhacuB0qkiyGnxZ6qv2w5bLZYs4TX8kakTGUtsb5zoyu23hhMuVTMdT/CNOizSFsRCcyPvdNhETfwQ7sZK+cq6Q2eNRE3FVtsWjKXGPluXtUpff7QuVJzQCv1h7Zn1tcv1l6UIwoAXz2XaRIxb7+okTOSsnbsSSd8OUT8JESITSgqAo0WCU/449dNNo/wWn+0TYAVZ3oWfrvRjzwTcpNkd0PuzPJiKVzsqfuhJXjVZ23lGUOV4mkqejd/p4BDaz2Jcrrcv1zdpD0Y1kcmmKvKXTKRIiKj2VuZwv0rHxqmJ+7qTLP7s55IpN5RISmL6Yyut0Tw6jQ+hL+E+RiHTdhyVJtyDCc7AhediEYIqNfUBtD7Zcw+gEJJkXUWKuTZU0NVf50tGj78J/umP34vZb58HUYIwZGONF/Ix5DE5EvMDDFhcwxq0xmANqjIFXGaMqVaq5ivbivceO3fvSrdv37rngdsR8uRfv5zTwLRIKo9P6CI5E9KgvGHC7ZEtApmFC9QlBzW9VBLtN4AWJ6hn2Ig6H/KrNKkqCz+uwEwFzy7ec4W6ob2Qfdf/YNOrmFoyYJY0wbVSSzPsIaQ3+LYGBjmEImpVqmkt7ce7kDJ4V+JmDixbesnhwhhcOlcjt1WrtGzgX7vo23v9qOv1q7dFvd9X+P2N+Y6DIP+S8zH8s6AlssehgAryAEfgN6kMlBHMClwZhsTkFFp7of80ptJyGxSyxhUpM43oGRBzDp2qf+9d/5bxnXxkj98PY4LvQ86BbDsloB4ytKLoVSyJbP/BYHI3EIpFBoSaPxXx1w1Ujk6oU88BKw1t53VI65wZfdSDQEzxxgpyp/eQf/gHb2dwvxGfxXWx8CW3Ug2zu4B8l3ggd8JKjwWK5q1xqBQeyymS96VxJg49PlLNvuQs+8Nlnn30WfvOac8+Tz5A3gRXF0R36BE4k9KQvFgloXo/TocgwIPLxos/rctoEqxiN+FVFkOOxgGYBmwoFRQFsyOMGuBCm9oXFum0zoQxdGJ/P95JNYUWUMAuboMIK1bSUrkK4ZR8liX1IafbBwT/4ieBvByaDt9lvi5y23xaaCL4DPuCrMHyE8DvC7xj4yEc+svOTOz8Mf+Cfj+A/+CSEI1Q69xjJczIqoSE0id6ol/HUlL4+Ozk8VIpHwqgUzgrVoXJXZyLulTzC5HCx2+2CGDUuyGVe7PK4u7twqYW+2Gov1ee4tNLvl9CUeWJTbOV9ceIGD14pU+89hisltY866DhJl7NpNYapZ/dT36+mK9TbC33g44uEA1sXVZ92545o+NLiaDDcl4nnysVUPNRhJfgCvbiwz+PCnNhXqGbbyldV+2TsXze9JRosBR3uqRu/fEle5rDiz/buHezs8TkJNz5uVYL5qurrmfq5YzwVUwvzfQW3xM/PjQwcec/WdZtTMo+3cEQMXrAngsD9Qfzkpuvxswu0txsdgpi+Z4++17Jjfjqh7t460FVgUZOf4MXRPq6rExc6OBoyJ1o7hEVMsykgs8Ym0B6zxvb8uyKl978i/kn/JXGNvOvfE7M4NH7uR+R94A960AjajI7q7XjLFn2rNDPe29Mho/WjI5X2dFATkcR7vIMDoj3K2bEF3sDbVPxY3SeuRCl11XvRFrPqtzCkJ1LVgtOAf9NgjKBM0DuzXboiccIMVaOGTHLwyucfwqDoKlfOwoqoYOqjmFwsyaLHIl9zZCo+WtUvLvYrEhEqPTNTPZ1TG1IZERx4JB4O+O+XQWOY/Hw+pnCzQw5ZXGgvFaJ2RxlgRnsJ9/UGokmn4675vnCwq1RMJGarfamtm6bybalMh8PRk+3wuGx/6HY72mSlIzWSig9tJtZp/KFYFwzgGsgkgiHHBI3N4FvRN5hvHdLdLLfiOJ7QzKrlUVlqtdTypqskVnVPCl4U3nM94HwfvKcHTeka9np1HyIS4p0OG2e3wHc5bG+uxHkx34685jf3GnqHnQ5+QMpSg61UR3EV+64ds/oD4zsiIR7sqXIBOfPKF9/1oWi5F9974dwuX843/8S7GPaYA1kSIIvCsIfVqtsg47DwAqI5EWpGq7G6ObTio9Ush5XKocEWK+dKdOvNnTo1ftddT//jF/EXf/SDL3/lewbO0fG9+K3ky5BP7tRj2OnUXYqDAnqbVYHIaJEEUbDTaIU5s2LPwxR1ATjkNAvgZFrOVXNVDXxkVZM0KXdfbusNrht6b3BdvyW/Fd8bO54v5k+fhk/HY8eZPCVUIdeTt7J8I8fyDchuACnQeCnIFgidVgaCIPegyYallfYYWeHqqZayWqrlBvCgJgHuJCt4pISV2s9KtZ/ha7Gz9mq59ip2lqk8R86dQM9DnmFDMxDF7Xbdga0K5Kc2uhYYCTarGboU61mpeVHs5pHtBnagDqwCm65agVQHc7Y5n93O9Z54yDXq7+c8dq0N/ddyE4jNiUNjuvf89zUDsV/5xlUjV2P5GUYI7PYeti+HG/JiCrDoG7fsZ8y8MblV3pRmQXhfqfZYiZw5eyfs3S7wnXbyAoqiIlhpAvf06L0+1evjU4lkZwEweV60d4vhSBjbAdw1d4drybWEmxi4OQ8e9ZiH7GHzAI+YMwK64RjZ3hXp3wJOZfoBwJeNSCVGsavUd2wdIYLVFSq95aZKxGUn8MfujJZvJjdhq4yxbIvEpy4cue/EtuMnnLaqwzGTHei75JJKpWN9tTrRWa4e/GF3dHgo0jPV2fv4pZ21fzT24k3w6RTb91v1MNv3ogJ7D+AqpgZvoSQDZwardHL1zfh6TsBLY2e1RGmFm9TRzl7L+OL7yFgiNQQhzAHjDgJgtZGvoxzao6dwPq+3x7yerM/rceMcivFWhxjMZUUUhLGbmQ8Mz2A6rOVwyxc0s6C8WYg8FaIdl2mQYQmvoUfIK+ArFuspMqCBKEmUWjHZNtIzsj6U26SPb9vDi31TlxcSuTflOy+9Nuew4Mt3V0cKqfbOWPe4vmGzHlI7RysbJY64ivfMVdaNbuoPBKgu82AzPNjMFDqpd+P16/UN66Yybai/0pfNtKWDPts6fmoyJnaqPhHmybkEURwdxZ0cnmzYj6tOLhlGdF7UrU90Eq03T3S9gQ9ZXGWTzWULGHKEUh9E1wbQwQALy4adMTPziZJaVwGL0LhySzaVUNVN6bgVomkqPtbuUXD4ZIJyK1zgso3hOIcXCJHyv3fxokck3FBFb0tMjR+5tbfbTr4ynW8Tecyn47mAVs614S2bA36vU5zLd/U4bF67oobeuaXX7UlUd7gFS7k4eWioqg/vsNthnwXBDtqY/dnREb2LsUuCzS5CwsZILhoUCC/brQJsbpHSPYh6ZLLcJs/3waCwpm2upKKqFcgwwYuo6RHs5oJ4Yv/ll+/74SNz+H/XKtsfeWQ73l77A7qe3ee+Q6wgWwfar7fhQkHvTHZENL+EOiKhoJYUbOGQGIiJblcGBwMc7mgKBGvnahE8y3PgDlQwC1RoLJ8Ww4zdpNQMwCCwzTR1oVI/480ksYgphr1DkDutvVpiqCPc2TPkdocSYddCD35j7YXIyP6jJ/tHbuueH2qzfNJmL6RlByb8QNvmnfkCYBTO4/Tjq2b/qnLnpYend8icMNUxB/rvPPcy83PtaB3aB7McGtKHve1Wgta1xxWv0JeU2lyiUukWtTYuFNAwjreILNcSm2h9nmYbjaMh8ySHmItlpsgSEkjxR3FzXj3pbgDobhfF2tQLahh0Qd2HsWmdBH88esQj250zERtv8/rHSkeuGZs6GvdwMv7jBxNab36yv81Ve4ds18c35FJb1g/MKhBdUpcSLASu7ht2eFyh245erU9xYMsJPIXT6x2E54Rq25ba+7JtY5XizIbdQ/0hja55CuyR8iMagn2OAwEIwH7KDWtI84uIRV5uRe5+njcMmOceqAdD5mz4NEySZhvJFP5psidf1KKqw3rQKXi9gc70cDBcO0zO6LnBDTvGd2zbtuPi2Njo2L7NWxJxRPF8P/gXDtYqjfrQNPObMzP6pthA39hoKeS3KlJMyHcLPLdBLKSSYNnN+Ac7hDmUVgKFTABqxizuTD00UZK2Sh1DuRGeWIIpMa9BA1S16VUpYvdSQjHHcipV8xm5U/+Vg3hy3VYvR2yDlflD3SWe8PFIYV0qfuMx/pr7E+rwlvFt4wc1/6kRv8NfDcXAh2CLbA+ND4x1TK2XldEjrtABZ8Ji2dae6a1Wo+XOvMfZ3zt29A1bRWdhfnx6Z/lNIRHjF7cHZRKIhL0ei+T2qM7EqMEFddZjeAHy9h2ANIeH9ZFkT0EB2DFUSMplwS9XRU8Whznsb2iqRcwu37Z+NGxW0zBTUwwPYaaHtMjSQ/hk5OhjmMVzt4t+j5GvOAdGnqLJOMsqc2+zTPYr1v6uPt7tTLnsstaxZ3L0VD7e6fLYAh//3UioWPBFFyP4aszP6xuzqW2Tm7Pt/AOFKhYG9dtUmyqBb+TEDePHPjTopZkIV6h9tvb/TtooK2nLnMJzLn1rf3HT1J7e/qEGNwU5jMGLpRg3BKGdMlMGwyeC9pFIKFm1gp0yEVSvw4tRYOY2wBmFZ/jsCTouxbIwrg25wIvmsNsNMM2qOB10ZJcdIK2AXE7RDmNbBYedLMO2YLfLRjdvMrd5fPcKiGsI0oS5IFAL6FLJ6F5fh1KkTO5EImBHN+NbMZVqJaH7+nwu1uxYwhXiSdUuwo+kanly5+jPfzaK1TGYfwn9Lbkev8j0fkGdj0SMjjPyC1EA9SMJS7CEjUSyaOIjl2l9NYIOq8lKBj7I9UtPk41LT2Nfufx8meUR8zC/LcvmJ8B4YB88MpPJv5JLznVBJqlencaP1C5K46+lRn/289HaD8fYHivBQN8jX4T5dUL21Ia7uvRue2dO8/OpYMCv2sGeDJgvEpnxnrwZy5myuvPyOh51mQXpahgY16ARwAs5OYroGIYGp1qh+4xtQ/VrBw58gLj+8uLqaDbmCiv6RuxWPZIlupET8/GecCnlB/N8WXMoT3UUF3umo86ApTSuOhzlaJtHkoKj42pHLADeqjexns5x3bkrufvJV8Hn7kZv1suMvfLsnJ4qdncW4uHQ7p5id1cncnuE6vz2OT7TNirIQ5KtXdxa6hM1v03EckPZLDMwQiZ9Ca+Hl03erAF5FVZLYPNLp8DJtLiUAs6lcuCBSK6bjGBDPaVcpeT2aUYUzRleug4RqxxDhU7KeFGQSP7E5UqWu/s+8/I/f+pLB47ZeSKMDS067H0+0d2fi7UFto2Uivv2t4viYloeSgQvOvjIe58fG39zua9nsD21gwvF+vZ4JIxFz565gEB2WWSvVXn103/yi5PX3pLNLm7ZSPoz8HOOFBb3OjZvmhpXI7Wvj0jVLv2xw0e/8tDte/dnFJ5XAZ1sriQze9KxaHz/YjKKyLklUP5hdlahoFk9yrITXlYsPI8VC+gBUCDbSa0EQWsmKEsmDIhXyU9KaZry5ZIZK77oICaXYP6Sidq3sHIdJENLU0/N4t21D9OYuwNkuIxxNFGAbpfpnQwHOkChHHHwoY5YlPPyHndHu4jiMTEa8XlFl9uFKXnjXuZDi8PNEwaD9zVRBe5VMCHui1KY7meICKw9nXQbORUsaAFXYOUgNtMMsYDxLV8YLVsESSllQj+tfWvxbwJaWC28/8+ePgUIUAocPEPOfIKvzNkAomNnX9vEZ2CK90oWW2DmutmLJdGqOOwjjfzl3RAv29B20HYmo2dRm9eDImEP4q0B0ZUQBRcH+bW1la400J8Z/FlRxjybDKNjfXUyMJdlKLeU0NLlIoWEkJv4DKa1Qt7tUTY8+6HteV+A5zlt+puYhBZ5S8fbP6dxg2NX3trn+L5z3H//4ZK+eWKmNPbcK1ZH+LJ/isfeNLv7ZDxhxHy6XvfBerlRBO2GOBeN6jEJjIVXIx7e7YqEwiLyekSHy4ndsEYuU6hh61M/AjLl7i4UNU8naiyOka6rLgbrcBrWJuEuU64zjWef3NDmcwj4OZ8nGN78jcVbMJ/tuigSfi85c0mpPzfjctV+Oi7xIiZ0HbDz6OScA2IvZrJvZOf+R/QOg4di59zIqoDrhHihyKJkBU8KHlUULBJ8wo2Tk9Ws7PwDk9WO/pP0L+WkVKLVHsAP1Gz45dob8TtnfzJLzsy+yOIklSsOcsloETw8PdWCSWNET7QIL/AWSRRkKpUoACQxe/iV4rQIkZXHW9ggxkAU/GrtmUX8hdo9+G2ztc+CHN9lclA89xDYZy+6AvLrvj69hCDv6u0ptqUCTowEjkRFby8Se4odouDlZIvIUZYJY6e5NIJlLfUM2+x965I5UZ9Zsj6DtktXwM325IxzhCaTjdPNc/Qe1d86MUhXyEPT4x+0+X2CfPv4wI4LP/ChTZokL46UtzxachOOg2A48P57ioKFfw6fqN171e2A37Qr9t/z4YsOvymd7phpT99fig8kfXl78IOn3amu2eY6XMrs42DdPiTIkRkryQhKCLUCL7KaCHCNjLhc5hq1JnljnK4Nt6L+StMopSlX6aYMTvKJxUW8e3Gx9mFypvYibluawjN1edATjHujnDHl3uCbPEcoZ4BMtPjYclJvVWIchnlikbpeeD/63v5zP8J/BK/9zBfRah3FD/sANgTi/T6VF51OrMgcVk1wAlPSjY3UXE11tcqchr+ByTUIEFJ5gy+ycUPIvS/Xe+poZ49FwN/fnu8fyM7hv6n13zyyqViqJBNtqLkO72TrQJE0XQfOCsaHWWkOSMiIC5COacFi1n9zI7QkXLUipyTjNCdROO0m5Mba3+Pe6//1ikXQT+1va5fifSd+DK8+2JTFBrIILF8VRV2ClzxnmAI7nVjGn62SrwI0MwsgGsQZXXxiq21cxPuol2qMxdHzCht41jbGS0uKgJgJsnWXRJg3Z7PKFkLLFcj5Mx+ur0130xBW8tTUEEphWgHg5dJPLL79a199+yL5u81ky9KTIMezRAcLgdfNub+F+aWdetLwSzJ4SXBJMt0L4I5g/hZp5TYwC9PUwkqHRLcAVUQaP7F4GB9fPFS7F2T4CimADIV6fvkp8EdOiJiTup9FTIsaQRbelRRtNvDSrXOTeqA08VIrg6S33DqzpFaZoQEFpxhnwihLarWd23c9/OjC7OzOxx7bOUs6MyM7u11JdaRnEGxvY8+ha4f68P4PXHL88oMf+vCByy478OEb1h2QBWJxj87cOnBsW2X3llacnAfdWUD63Xoau1w6mBpvc1JvAi7d6RARrbUCfWILmLH0Gk69RatLyGWekcuIk6qvAN6TQhcKW/Bl33/1E4uLH3nf+z5Cznz+xdrLYMf/684bmS7/kOkyjgZgNeN4cFBfFxzIJUi1vyvuQEE+1dcrSljlAGk6msm6iWVbBkEcaNAsyyDDzlKOZgw5djpGD8coBcWUTYngHMPJgEgklqRr/jECjjxXJR8szQe83Z35O7ZsCMqwsbHIhR+7EVZA6PWGhkduSIW65aBT/d3xqYsjaY8c2FoJ9u5zCDaRSFs37oh3rx+M+OzXnYb1KGSHF1Lh9Vvv+tyUlwButXT+4/0bN9E3FOy7ivU1OQlrEkd58PB53N6ud/gyPrfLJuUTMS7Kww9yIkomAGfGYyrnM3NRde/+GsEfoXazQtqZuQksZDmJA1OYCXATAhrVQTema+ZtYM0deD5gG+qtgMjSaNdGh9NrOWCReZFkdj+3uPhyMavd9yw5Az5fznfuUdXiJiXW2z9Q6W2zKS7f1eX52tfwtYTvCJVPsRj+XbIA66wztnF8XJ/o07s6Cx1RpJf6IpYM702KGi9WqzhCNA7rjdmZsOaKQ2gdjZsnN77MyZeLnClo04qJosFEGoelJa2ksclLvjrFSn/3jqH+HdOd5Yv8asamXdUxNbf+iptOODm8yHGR28Y6y8XURgH8TN4Z/iS++e4Bn1MKrytWvjXXmYsmpxZCAM44IRjt2n+00nn5eofd6doXSgyNqE4XIRZiKbxPkSdPWyAPxxZ338Bh6stssPZZluvsAOtnVUv0wE3g+XoJlgj+jJYtLadmtFYK/XrUTKPIykZC31okJ2Znl+4lBgeyAdbjEhg3hOZh3HBYj1htVsOhhwJBQfR4cAjgJxhasOVB66F2WaVUEIXNw4bpsOGG06qHWidh26+Scz+KsRB61+GO1GJl3XC5+Ga94lEwOIM+f/g2vXIcP1LbcefoFAR4y1hlfdbfjz+GMMsHN4GsIpoAb8v4GhFgB0djHYu1vCkNpAd+LTJhFdamxKW5khd/79CPr/inSz9tQI8lCKpsHO4ki3NbAHvQOCfbJF7mCSBKgRMIZ1VYTDkvwC39itCWhPEgsoXZyDh39VOH77nr2N13H/nDq++CkZ9kIW4LSLGVnWvW/bMV8E/MqIG1UshPZB4bcZbhixWBrUFdvi6y8zJBOG+au+aaH3/3jb//xGV//+M3PYkP44XaK9hb+31IBNJ1fV/AYsQmwBayrCvYImKG+cEPQmCgOheX6dxAFt3NlEM2jy7X9Q6GSDX/0omlfUvH/wxW/ShFlZB7nDHwFT0TKrC4TjluGtcFma4yEmlkglSDYhuagtDtIK1kKluVAs3QtDK40y2BIdmo4CJkPCfwh5b+Ed8FW2Pz0rdmF4hmnMNvxP1sTy6YmDsAVYIE2Y4EkIeWKsCPufOyMLMUrfRrNe6O8ZRu3H/ttX9FzowuSaPc1eg1zrU5jqcTptUY2Iysl1pAbiWuFnAJ48XaBwAUPM1dffZOo94B3pssnxclU8DbgF4FNi8Yic2L/Mp5rcpJ0lpy+MDkr669lh6oj5J/GTXm1U/68MfZHh7XVWMPw74VWI0k4NUG7zpWL05smtLqxGs6J6WreNslM1dfPX2QnHn7kSNvr+vupXM3rFprgP5dtQY0OcYv1YK3Mz61nQygryyrAULo16sB+srWi46QgdPw88S57+MacaF1aDu6RM/huTl93qmPDa0raWgq43LaIPsXhrpnpFgM+7DbhcHyMs1jHQNXNk+Kz4uLGTRnHn3OMPtqM3uVRD9YHzjlbE6UGscXDASxE4xqHRIBIqLhUnNyLGw20lxWh4jLxSt/pw12ooC9KZ53uAs5yekTHB2Z7ERnxiGDs+gu/K4WD3rWuR2BkGQjzolXec4fE4c3VWAPaWNH2jB4VB4fVpRSuXjEpcZ/mA6Ogl/jkoWIi5dDHCdEg3GfGh8odtmJXe6e9ovwYyyp2w6COxSCnlGv3dZ3Ee+U3WmGbTece4WkYJ18DEflGI6SEnE3zrglPuQBO/d5/apk83ow7fYgPrA7U82bKUtqFWg2691WwVFuc6Vhqki0tEHVMeY1l67XYPofqpx801CpWLncquzVwYUvfM8miqcLPUVJjPkC22M58IS1hbmN1121YbuCN0vSBggLVxDXZ67qLoGUzr47dw1MUzvsOPcK/inYTAFidgx3dupdqBAKonQqiHi7NS75cpLoI+IKom54JVPXaZ5NJ2Pq6hQzXfmeStlg6wyyI1euV6Ow89kxgn8qyPZSce+TPVaQT1YGSicO95at/DxHopcujGJ+eusFbRb+qUSqp6v9sbZgRXVYS4Mj1Z7SOr9NkPbdus3tmrh6RzQMawZzIjzL9/PogJ5la4aCAZXLRQF+wJL5VQLm53YT6puwH5ZMMdWH1g8TGp7fPElllSUDB1WFeaZTWUqY1zeE5ua0EmQF9WVjEJHwCxB1CyfedAWp9l4znM5HH4/bHcVNuwNhSZzLxihs2KBYpz503GdVts3NeLy9mCxdBdF58Yp39drx+uqup5lNdpz7PszPhVKol/GSlL0KwBc96SAK8M6C5O1NS8FAXJK8MMMmY2Viq5rQ93WIqoxxwE4hvImoimE1Wc8f+6tFTKuK6GGkCImPis9ZeIuvqzLbK/e49oWVwdEbby8GQ7W3cLKcSU2UtyiU0OGUdcNjswq5N+Z25BI5gcOQkhzPjdy8cdt856HJtny2PVPtuy8hOkSlbWJ6TLG4DUyLC+QzKIzeoPexTgNEC3xczjBklwIKBWlfAyNL6vXpNi4cgjSWnUAKyzm75eUd5x3OCqv0FeBGSxPoIE5UWFDYiQ7sxGoJF47vWlxsyw+4u62cj3eJfrfAH8fP1CbwM6PrN0biHOaoB+J9DvcWWLvuczoR2H4bgqwlw86RE0OlzkJM4QvJhNAbUzi5yvuyKBEnQeLE2NdMW2jl5lK9dnO5d/atcqJMj2iMGmUndmCWjxjHyewUoGqAaONAuV4sYphpnDyqDKfDIbe2UeCD23pjkxMjJ5PRQltvn8+Fd7whGy0W9MGE/Vv29nzmPbOZ6EWxyGCXVyQEW5NXVMHCi+Cpp8be8cdDbhFCcdaZ2FBz39HjghXCpUj1IBFLxSu/NFleeKxTISxvgE8/YD72Qj2NVVX3SzZAh5Ige9y0Tc3n9XoAva/0rlqTOBg20S9epJqVoTb9apy401zW8KGwoA9NHLs+KZJdnLwYLWWDC+Ay/2XvyUJb7XF87R5OGM7P1X4IUhE0BbvuwXovxAV60kA5kEGBaNTgCD3vFiiohO8QM8wZ+zeeu1KiqgLh88GFhQV8tsbjs88uInLu1XNT6GEYVwUUe1hvx6GQHtZcTofdqqg+COYBjQ/6gwER1tMgqOE3Cbad17tnArHLLd2GQmZJQoYkPnoIWMTUxmnfA5hGxZ0D2d6nhScVq8UiW7BV4HirPcfv24fPLn1lQzIL6csILC62rydxkLy+pswHW9GulbymIFtoOsaoTQwiL283/DcTm5K3QWzitx157uuXPrGTqu+52vOY7PwYrOY2Qw700Pm8svBr88oPLZh4ZXhvzgV7uRe9US8xL6xCUuz3qUJAa0sL2UyxG7AiEnp72vNxSewpZto0wY9dIumFSfeY7ERrHhdpww0+cdg0/55V/LNXlfrHCDu4hUUywirYd08l2ygPAXnLBSzVXz6EQzv96mA8TcuRLesuvSotY7IL1CDkuydTsYWLRaG9IwsKXC+OhXgSikYcNptjx7FQNF/7Y7zfI1pi/X2FDbUX8Pg7cVf7FnhxFqHW/nWhCNoLHo2ekimYNX2FgnSPRMIeCZyxjaORPQIzD5t3sAEmtDqFWp9veJVzMq/arGyFadKglDboTDa50RP7kh5Z5PACxorNM2ZV5WpIhdls3FuOBt0d9tqj+KJAPNBGePtQUa/9kAlvYAUvyO6EaLpVj+B0Wm/jecpXpFy8LSYhr2SxYNO2apBHrCoXNbdS2ixvunGu12BfqePl6ic6jUpKn4Rj144Pj4yfulYfHtITnPqWbcm0AA6EZFPbbvMR4to2c/31M7OzM9ffOL219rXAB0vVoUCga3Cw/FGbwrDpRhID2d0oDjgnx/qmICzFIN3iNadDcLsgAnolq8tJi8044oZpuM7Dpo0S46Vl+821SkOUV2pC0wJO5UDpnmZhHY0bD+CpS64aKpeGrhSP9y08MTSbjV0wFQheCga1e8emq980c8FirUaeqnVvGFg4flRu++gJqv80zIGDOaionXHHHR16AaWDPg5mIag+8K553uokNOti3s1qBmrLw2ETiHaYZe+oYzQ3axc2EhLG3VWIER/riQkD1oRbKF21b7/HgTlpauRothAMRV/qUNWQ03lg1u+JBtanwuDzNmO89+KBjmD/1Ts22TxaZKQ24YBwQCyFB+/vtsN8xI0DWw8398YizM+FtulRVrGEbC5YDovIS4Iiu4hVIeBSG2UdbF4NB4ha5RsrK5Rwykiz6BmHOorHIDW/sJQFeIsXFnx7BoP4r7tSg55AuPZLfPZgZZRgY6+mAe9/AeLoGGPGdV0fL48lE4CgxkYr5YTczqsZKTyIwwSPnnfcsDKAjCLdLJZe50r74oDoDbXyDdBB+s9nSzmDJm4WDV93UFY8luKwx69bbfFkRyGXbRuOhC/eo/BknnDq3kI4kfJVHU5+b6QyUb3gylKXFb9nwUdwX3dYDdoIJ0pyMrZ+KJuWecxv6/S47Q7do7Z3+mw2iDOaJzkjzna09XRMipKhCxvoIkveDd7mcr2bYUreYVXCIdg69YaNYAAcWCgIoVUC2/Ni1mBIcKjFU5kuIzDjybqGQqs2qZZYkzxtVRojqpNj8wd4eWjXZZf5EqAFt83alqhofkJ247MPPDBaezIZATc9ygkWTguHNHzFaJ1v/T7+AfixMKuGo/KHcDgEQmsQdWASdqvNSxskHZwdMrgwwiZs0PC8jSsIUAsVrBQ5WWlk9EVC2dfG2TSNvO8OZjrT0Zls0ibhBXdw7PIwZPAL0zl/iBAhly50tOG52uenU73H/IEsVms80z3lAzENIK/Bv5Jfi3+9evHpA59avMeAULXF+jjks6xmcHX+lfx6/GvJzL/+y+LDF153bMfRG3Y/uucYDHwMv4d98Pg9qM6/4v8HZGjxr4CFZAvBHC8x/tU43yVN/nF1/lV6LRCUk9LeXEnDxy9+/MzFv/3bF5954uJb8Nmf1H7+wgtY/omBVcRzE/j7IIOX8a8+n67aAHx74T15C/VHAMeI+Xy5VYrThGA+8+g+OrrRJoANBtjIMXZHHSmf4rB9/cjDp3d90Vlal/UrpwBnRR1dGVDNIfzepSfzGxj6avCz+OMgF60HSTN+lpNki0ToITAvChYsIY72XPNYBgUJr0fQtjK41epBDH4W/nu09m3cUzuKOygGGK3dMjqKbzH2013njuPryXfAr12jF/HYmK67MBqkEaI9n8um4rFwKAAB0EpbWUSB7+5ycy5+FLm6m81MRfN52Wp/zE3ZY2Ypx4xGF9ZSWqF/WVm7ymqg1Tim93+oMcjkaP+FRJM0lRZAlXOVKvwmS+Lu4vlZWqDC8dMzBVpER7juydEK/RbB3TbrtnRUpnWhoEX/IJ7GtusdYYfdYXMEgpn5ijUX9MFre6djfEdSily8LupR6NeTXoHr78r0ykocvuxPqvZhC9XVX55LoBo3sry3S/i17odxp/+yVOJGfvkd+r7Hz53AF8Ia6Oi43sPO9JBeLhW7Cx3JhF/1eqwKGlo3OFDtt1kkgbPyQi6baQsLkaIHe5bdabByFRpSeFY54sNU0T6maXaES2t/R3CRlBleqFa68QiuUgYL4E6u0kdDF1sIWAoIbPjCIa+FUknwnxi6ej1TOQlpkyMVWIVk26b2LGUZ8xFZwaKg50Nhu4MqN2Gxcc5dStm5na6D1R1d19sZlyI7pxxOhyzmHG29SqWnazP9Vfjr0NfJtAQDrcdt+GH8LpREG/UATqX0NIo7HQrinUnVh3gvbBZncwWa3qzF9aTM00+x6YNhQdbHO7k0xGqtFJf7qvhhUYmMKHJs0OlUwOYnrGWfxyL7VYdVsvC80xZ243tUTccWFZacl51TgDaxCLkwza54YvCnlnM/J1PcHhRAOXSRnmXdWTjgsuUSKmBS3h+R2tK5RJwLWiSs+VlO5jd5/iJLDMxntc0a+pUtWuCEjAq6IqnEOdYMh0tejhKM/dWSAwNszebwdw68HC1Egr1OhxZwOD1utyyX/LVfXvUXxy2dhc5OecZ1gHaYKZDo/fl0m4+ergvztNIZY967nThqe8lke7atsHlw/ZhR/0B960uQE3pRBrxYBmezeo5610zU8K8BKZWJRjgft5qjpWftq03QgrLmCWZfw99665W3Jcko5l3mgBe+YDjgaZB846wT4xnJ1pceH98nr+6SuTdabQO6ZAl1p4PTw2xu+rmfkJfIo6iCtqAjgDK2btW3Bcd1wNBdOc3r3DQ8tK4tFrKJKBPkK/aAowyW3uw0XtZqaz5UaE3Tjraap7mVYcgWWUVyVY1lt4DVNQnmyphxokm5FrVMpFyGrnClWqbN9fXGICf2+T+m2GSbxUYsdteJ8eOqv3fTlqLff0I/7rL73bxkV47rJ2xOV3u+kAxkI371+DjeKs5fo+CTc4o8XO2MwE6S+Ks/4Ax4OiK53jbFFwxdOXGl0x6N2F3wIhSc6O0p2e1B18mJk7JidVoFi9MGX4ydnFesc2+24Ey0Iju4YNfCLfUaIzvsBYlx7ZRFgs3CcxI9+JFE2i+xssaqaL5KpHU6t8pNIrQPuKQln1jE+3dKtUfJmfe/8t/YqzF67ir8C/IVtBHtQwdhT+zfr1/k2nfBxiSPLty1cai/kE4l/T6XsFkSRnJSeCKM+xvu2yhpN1/VsTzt6Ef7zTLsZ1u/XCTZRmKh+pzEr0pN+9CMqmDWz8gqOAwe1ESHqhyr7mDdjcyhv2HA5chkEsJGXuh46za/dwhyuuTNm9M5cFMzvHN60sthLqIVHIlkZ3c+He3jyrMRNRYd6Ixc4ls3BimELKvBbU68vhyNka4dLgB7PaFuP58mxLPu5ouKiqTuDTvdu9K5bDKOfTZpQ6/Dnlc9HtHu9BXbt0xn427cNrc3ZoWIzfcm5monrYnZ9SmHJAm8RfFvsiojQ5rd3qgrn+Z2AL50gg96h64zfFev9/W4ea/LYQd/3aj89XqcnEO0LSsAdrvsnG1lFTC7jadRC9SoEGlRVMvjqrgKQjQXBdOb4KitsOLg36lZ8Q9qb5D37v3rxcVmiTD+9OzsLOtPK8Gc/o7VXqfQHDqhd+L5eX2HuH120+jgQCm3fSDlcYpCODQ1MSl0dsUkpEnWeked02zDdX5juHGwef4NKU40bxZ63ogjWoO7kYz+CE5jFkQvIzAyWMGoP2HXUdD7PmJYTdOTEtZjaJTZM1K9WhLxW+3yG48fOnT8jbL9rs/+xWm8fdMNN7734VM3b9qKb6XXTkym426F8KloJhkNRhOlEQg4iXS+TaZHk7ykBrPOgN/G6TI5gw/tf/DB/Yfwl++6+69qD8gH9u/6o2O2ax/fs+/YfVEeAlU6kc+nN3fnnTLYq9LbIyuuWFc8HdacciIQBZ8fdsZGmvXPv0NeQD3spLi3V++zZtqsSk9bOqhZUREic0GM9xRFjATRE+c8GGurHCMt6zipa1RDvWaN9jKNJn1NhRjuuXEo2N88MVONgmjaTZLEf1t7vDR4XX60ErUdVIjAyeuf+2fdjWHTOSd+9MZNc46DWLQP5GbOwKTwPB4/sn23zAmTmZmSxSur7/3GYGxTTvYG+75ZGbqCsztK+cjnARqBXxpGB/F17O4tO3jhKOsRho1Tx/T1a7jskCI2cuXzMT0y8eer3Exn3MeVM/7B1x0+fE+Y3s31x/MLi/On536rfkUXvSfie2A210KyMgMYzqi15RkzTQOCgFrdTUVTDDAXva+stKWd2ckKiVdrm/G1915UBrht2kdJNI6m0W/pQ6zTUxrXK+X1FEqXO3JJj0uCvTQ9oXNjwngqJnHTG6XU5IQ0NuqXlBTNkWmWampwaBqBmb8932M3ycSVXaHe/lLVuMSPdRzBHtPqrIKxxUS1yvwy6xL1xUWAdCy+FzD1Iaz+8wG6oe557i/uZttrfPuW62/cvP3hUze893c+ahO3Ea6StgIIxyLhJmTq1gLdZV2fGdswQRYO4S/dc/dfsc30kSOLF164/5D72sefuvyjsN/cc2oqqBRl0ZEMunne5oiEFNkXeuefD1QYHmqDWPpt0Kcd/NJ63c/4YiHuTYUcAm9jOX2LZCkO4/N41dV4Ys8QriuCuppmbS4NTXWPou5NivlKNSu2lbsIb7N5vXYLLYqGLCPq9EXJmWo+OzScyRclp2yzWyApAtfuVKM+1lNHeU56h5kTvUHvZbW52EktnFXpOB1WThEgUtDmeAsnSQ47bXRAElHk5Ylc/TqB87iu5RntyqLdKjj+aoUenTLSSy3hH9V8L774YvnFFy+rXHln5fHHK3c26q//i+r//7vO7wzu973kLTDqHHiaOt6ju5vCPYnBPfKacM8UWF8H7qUfWsDCRvkcPnv7Z9hcc+c24jtZvZud3RtH/ZuVs1kFuwIJM3zXBgkIYqdwrZ7u5YXszXG5VRycl8XDIVrTC4n785P7d0+XSveUSvgNB6b0Q2fvNArDeNRx7iUighwp1Akxpoxu0gdwpaL3q/CNNGxsJyr18eXeYjff01Uu9XBFsSsreTvTEqTWktjX2811cV5ad9KsXmCMpeF0lt0QuMIOnahiFrvSqkRpFeWyoONWkz4aug0ys8JOzeipPlcHKniJYGdP/8W9ctAe2htRqiPX/VPtZgisc+sOxWmNsj55sJ2IHC/s2fPynj33SuJgT79Ii7CVwmW54Zs2ztZ+EvRZk4MbL+QFy317tu+XvO4kfvfiIj0j5anN8476WqVAR9fqFaYjrSsdkfm8ZgfI1iskW10IVkVEbmL0ItgBrmHh/KLNMVO2MLyctW8a00rtNJsTZMqSeSkoZpUezQoBcM9MR41LQCigZn0M+w7X7iXtuKP21aloIBLxJaLl3V41kXSEL3y0L8zxhBDBX+3UvB6t1e5Qi2/C/+riOM7tmt14a55eYogdXTdc8+q41R8MaI7RjmRPb7IdGfVJL+F/JX7UjXaBNReLeo8t35a2WcXutA11YV7r7pIwihAzQKl3bQ6vTB00VDRPvshMI82KtynfVi35pIaZGMlBP7vhRKO9WUY7cAkf++6FfDgcjET75XnRun5wR4c3fP/pRKB4yWDJypP5rnJF687Evvvy3VlCG9nE4VHVs6HUAYZhKXz1CwN2womlYp9XsfTHM4A4enNbYd/OAC75LXZfZwuXSBbBRoGJyCG7ZFzdaVt5decK+8erXVPC7vCMY+Mqz2/cc+jQPR+79+jRe79329zeC+dvna1f6/mb0Cdr9C4cYX2yCda9mEzqKSnodlmkhNfD0UvNPG4wTCQmYnGfV7S7nOyOP8ey3JUdbSzvYGj4NQdKmmVL1u8YMmr3fbSWiyUs7ub1tkWSfuJvAo750SIRM39U+zJ+qXb1VwOZTCqWzERCz4KT59d1XmpVrKm3QRaz9PecEA6OjYVjFNH9X9b3S+dqWdZDxvGcUG8nJL9uD1mJ9XI+sYifon2Ds2Aj6NxB8lkYx4UCrCIsGNRDyC9xBLmcfEBz84DHBDHgFh2aHwxHQCLHWA+ng/WVSufluFr9Ks1ho5l+mWYlFDQLFDSK49K0DSJXYjcPJt2YscZJN/msvH3ph3PSyIaYm4Mk4rHa05B+b8KLs6+8//2v7L1levime5buJbEj87ceP0VirR7A38BeXda78GaWOxzVu7HHo3vtThkclM0KyMUFOaaFd9NLlKwUWgCacbvYdb4rDtPOr7VrIimPWTAPFUzGEINYLGJ9iwAz8F21b16Bh2ovXIG1RRy4ovYCHj5Ze3ER76s9hk/h9bUv4DL7+JPa2+j36rntbshtq6z6c2BAH+yuBgOo2t0RdDosOd7jExMup+iw8yIAlwSHq69VIblc4CoaMAs80OoNMoo62JaiZXROkq5frqr1GTuPbcImZVm5o6v9xG0JkSZ5oTfvmX/7+29ok8lib3m7w9ffo3iFyFtHBhaiKcgGxZ7nPzA28bXBcs/eoOZ3KAuzJ2+4IBLY1dfvoRcxESx33LnuAkUtDfWnvZ47NswstmzqOoYtdtfP1bBMjz1p7bqFHm8zFIFZR+OyxotlyKoVVMTVDtVoQy9mjaWRfftq9y4aoLu69Hn494ut3sDruD0gRwA8XxfbpyBJwGOWxS75Ah43p7y2TEWtfu1QE/KZRVu5P1uieY364pJIq6kbcu6Sujo3uTm8KXT3sS6baBabvJBtX6dYT2+Nhhp6vIzdKUbZUxoNIV8CIZV6b6Nxfsv6o7nzz29XlLFJqwTFhp1Tk//ulbVP4cXras+w9twztTtoQze8+vNGvcK/kEVWD3ip3o79fl2T4bUiQ+oGtmyR7DYREjnC8bTTCnJ22bKsw2us6eZM69vM3fxmyfzMtPu0klbqC2LaSp9u3Btm4+hFwHfgxxd/Nj41qzqkebBiHXeBBk/883e3zvGw/39D+3t/c/rd/yf3++ImPmvdQsSxw/rmQcbqIHG1O9FfK7U1NEd8i7UPsM154jevz/j/hDtO/vt6Rdm5MOvR2KKH2Z0M2O+weemZsA8CgOpjDtVnMp8VFSm+Ve5jWHYEjBtHwMvOfGMp1SnnAvTEd9kRLzhLLLpm6QEvYPb2c//AjZHvAmJvh7h/jT7AcISallS+p9ofCbsEJ98eizrsAmJnJyJA6jgfq3a0c3kxHALpnY5opGGCrct9l3Fo5gvzpVXARSadzaUaqSij0PzN3iCq15Rx1jBE+kvNDisIe781YVfDxSc+0RUayS3OxMeffKyUHs0uhh7PywSTie4rQu90YE/srXe44h2hWULcY59+ftBB+Msu452Dn//TMVDIMbLphkIms35dnlja3v9QBjLZ2rHfkF5StAOw/+eYDJdAHGR4mT5dAqAyNq71YB4d7ECg1yvTh9osuzqj+QCh5iMmmv5gtTrzDPjxEoX7FOdYFy+Wti99Z3GWnFi695X316+zAJkGQC9hkCkC8aWd1UDbnHYbz/hVhPlIWBJEUfN5OD+kqhGblVp32CwTjSl1mZbV461aCq2x45SSUYKXdjtJTzolUXcxgt+NMx0LyZBgGVlc9EfiHsEVv7Fvgpz54mZ/kNUw4BGIQT20zDiWe8OLjbs43lXXpxEbRclgRM9TKFMne9zCcoWer87hX6XPZP0DP7eI/Ytn/9zQJ3xMGRpla8z9AmRyopN11lqmYEHi6aVzEGaciHfY60/uEW1WxW6D1I49wKd10/nqa21mVu2rUtZ14eqL/gRWqZCH5e1nn2zKyda+EZP+geVIYYbKaBWmCMkFHwgDoqVCQlRyQU4bDnk9os3t4kDS5UeUK9N61GQyV+lFKmkNJwB5J+2NLTUSejz1F4Vtw/nucjmTqn37vlc/FelPau/5GP5dTpjq2n2go0eRMDhhmICSDZdvQQ1u4qdMz0HwdZdBnkefyBUKh/hoROT9QZeTTQImEAy4XaItGnJyDi4SBpeHzYpuHhQ3ZmE2A/uqD+Uyz8M8C0rffzafyJwsVvpTidq3Fp8O92aD9z9ONizCVIireNclhV4LBCUwFcJ3RCq34ONNrp/OZ64+H4oRaM+MuNpEnA62EvYVK3E+RrCv1ibzWsI/8RcFb/Km+gossgW4/3GQGlvbH6wvwBmT/o1c9d3sXtGL9Azrv1QKfhUlE/EYsim8mhP5ZEKMx0Ki201BobpKqrqyT1FdpRnTQIisf6JHdWCJJUSlevlQspL0NchdqbJt+tbTD8SxBHHRo7/y7IzPsigqpbd/pCDj2p/iSRFbS+/ZWh5U8I93TU/ccAufn0q6KiNfe99AXyxxwyP9vbPKhD12Vzo7U88Bz/2IewTmGIZIegg8DI2k1ny22G3l4+GQxvn5YCCMRL/aLzpDQS6gYSeWOBwwNb7VqX/TFmnONbBK4KQ3F7buZKmXgaRZkiUYT+Fgp89pBo+jRkcc6AH7eWKJP3z1wxfObV947F1TW9124RLIxd5ixZxU7RlRIumgz+cK3Eg4myvUc/1H8QOa2++78tTll34AEPP03OzwYO2PKNB/MhceuG3DiJcTOJ7nbWNfDGjRgUL7FqaP2Xou4kYhdLGeYzdlOPwWjjgdfCjo5lwhj2gPBkQ3ctg5l5P2zZkTpJa/OP/ZcWSVezMwl/bSc0QDRlJgzQFs8A1hNz7+kas+FQx3XMwTfrp0Oc4s/vnJuIQfexL7az/ACU6UL92Z3TyQh3Dhx7vmQuFbAVWjtT7z/5I+84Fzr5A8+SbMf5SdFtLqY2/e0lP0WtAQH+2XXBmk+bGL4GjrIuZVe3mjqxQWYx+7BlztbzwhwDhwbp6Fsb9cHTD3j9DSqFy22WxO0PFE5IKJzRB3Bc9IfvTAb7/1Cr9f8wbfURr+/T4pbflcOhbzuXSvRPjwDdGhzpDkJd/c5RM5OZ1/u2DhLZ254O333fjbkCbaN/7iTzbv9gpEDiztVgjBcnh7tC+oEI//Pk7cXlwoxikcYWen38Vn2d2LeXRUL7AubntK4e28lo9GOI/gduWzOckdi0qRUNjrkZxu4nJiU5WC6RTAzJm3LmNcpZm76dbp8RekgfWbi8B7VFgFGbuVcX4kH/J4E1ZlsPzkDxbua495RqPajddOhwBpZnxB7434lyQbrLbFUwCcXGODp/HZ2gQkZ67keq+AR8t2ezJGn4TQOCOGeZ7HlwuUjpDIygPifwdfTs+Gd57DZ0cR48tvJJthHEhP0Sm9whCqNeSh9yQrshAJ+7wAll1OwR3xSpYw/EARkORgqY3TgWlhg+c1KfMWtjIXWa+ErYZ1wQ5MGthKTee8qqgazPmox223uQBxXrpLmqntnJH+lkTcASyMBnPR4vDAsZ21iU+fPv1pfMtlLjKzb10bvuX/1l54dkb3SbY3XouXF8y8PPlP4OUzRosJfQ4O6zhR07jzs8e+8/XDz+x65vDXv3vZZ3f98pfY+uo/wJ9Xaz/95S8Ztomfewl/GdZmlD2ni3q0vlGANd35uOp0WDDq40dDUpvLKUEWLVWruG1Z09n5TPxyIUdX8XJVlV0m0c/ObxkZDxiArYtBydcLidkjo2gpsdQqCahcRUR9eGwDvXLUt2tmqyJEeznMOxcXVJm2nyU+/GBaJHzAp9msDsdWTtQHdnQmItsi1oes1sRwpehW5Ooo4VM5p6iMVANexeK94dKg1h4JWOmhTfiiaLW9DVJUq7o5mqr3RyPW99K4bxDLjIPkZPpUOxMTTl6Dnf+3cvP44YsXaksHjMKU+2uXwb+XG7iMycDOCKJgScazeLEGaRUf9bREiVJmnnttgVacGHSbBFuJ+03MvN9oFCy1KnUbsmZsE7Kcr85I9mJq8ninhT46xCQ+2blRwu3ZYDEd3OHySJa6H/0O6HNVnl5YxtOv6LP6N/L0ht27Syq+6tDLPzvyt7TW50e1H9dq+Oy36vz8L/C3WI/VfsDytAbXAq9BiTQ9BU3arJJEJMDxioxZi9Mybv41mfmVVbVVsF4aplvEPLHZbWNuJ96z8MlA6LhPG4f1u2DzoT8DnT3zlhsOHINsqdmrTX6L9cOZeXlWG8SqD5meyOvx8vV2238rL//QwqmP/q9rFrjfm8QP1I7C6l2C3wdSwetmf+zLrDfOxMsLLV7eCIR1Xp78J/DyaoldJwVyLfxs166f4bMvvFDjX/kf3gtu6PEfQY/LOHmBcvL1ajPQ3n+ck6eQ4iMLZ9lefKZ+P9L/9B70/xPvQDLuy/kTZg/n8fqtx/AyXp/8x3h9/MTvL+BnRkfpdTe/wX2mHKzxRvJtdh9qB+pHV+llXK3qA8GMRQzyxf5CLOrzih6hIxF3uwTkkvorCcjlOiQUBcDi8xKIgeaKCyMHp/7GxOSbKi6q5ilU2eV5LL71VBoZGCXzGxwS5fKl1i2iRqMKtRe8+5pte+wwKwuR/fq6t+8ig9ds69k1+7ZdeXvi5mtcbR27Hs3KnNSd61MDOXvf4MlQKOpNK9pgsfDkk5y4p3ribRtGP0Zuw5bMg/f0ihJ3cyG30NvhFNkZ7W9CX/IGyEummAzncfkCpZ6FOvUsmbh88p/E5eP3LNBMYx421jM0t6A5mhEjO+HT74FMAXQY8k5asWBzKjKEcMbmwyYKaBZKNUtet8dhxwHK5pNm+aEh1XBTKm35Qba2SrWCl678EKb37bDglKJ3v1Ey/9aYb8yVcAuRhQW/K9W52FbBZx/pd8oE/6jG/zXkZKHZT7Ti+veZHg+BzIzDZ+ozdryhTkOTLRKfrE7ir3ja/WtqssHiH1/48sLSfkOR8MEzVbK15UZAJie6Uu9jHL6FYiFYS3q2IGB2R4HNSe8BgmTTqsgQIRz2umi21yfxi+aAu5LEb4jXXGwq4k7LzNKeppSNJSfsDDQPctrZPUsdjDO22JFF8Abpo4UEm9VuY23oQS3gBLxkVditReg86vi1WHy0KoGssse0GUfN3tY9JGnb1x+LetunP/rqrV+/yyVPBWMx9S347OcxFmV90wMg9y3g01ybe10+2uzE1v1qhuf8KMT4e8omagFNCAV53uO30yp3mxX2sF912CUlGKAmHNJsnOkylV/F31tX4RW9aoMpSTdJEqOQ5aEPPpLK5eKRVxfudisT2wOn8Td20Rnw98/E22jpGiVDMO/atA0wsEStxchF8N/BKwfsOvpkCLrrJJ9FCjjpBCB/xVLAr0GuCEAXO0D284n7YVP1W4u6X22vafQR1+ySZhO/g9MPfSCyLteGt+778cLd7Qnfbt/N+Oz/xtiejK9XlN7dBoUT9xbm2PM12gAz/IT4URHthXyDPtEz2J7NWBWx2G3FKMhnAAAVu5PxGPaYyc9WpeyK2uTMKs/19JbKtMeMPsDPQA5x3Nc8ecC5HtYyVWpUsKc//dWhWCRQ6c6L80RwdFcOFkl4prdwvzPWnnRK1rcF5uUtw28KQNT/Ks5Nz0MOwqdig5CqlrtKIserE+tu+lqBiOBjSeTRqYnb3GKmcQfmXxMf2FcH84i0elXpaFf4dCjo5+htVxlJCCF6LYHkCAaI5scOLLQ8oonAb3YLmfaHtkrlqpeWY8eJUYNep+9Z7tVgctltdT5J/aEgO64+oAWmbxrWTx2pDDhtwuzCwu9jS/LEfC7+AEBnXEimB04A9JVvvAMQdKl/qNj1CsD+BX/02vXV3X/zIbviN/LhNrDBz4ANqoAS6J3pFMu6g/RxuR63EI/5OMhYJVcsChN1u4jXw9C08nrEvOkBvivBbCldTRntCCOYEty0qaKSzjlg3hAMKrdf9FaXVdF6vArOZ3b/YuFwR2EAQIhn/3Wf57HV3x3KKEpPT2eNf/6npLvb5an+McU5YZhDnDvAel1oTM0bZ/T0vgqK/xSZt1pY9wd9uIRAT1KX3XbdIveWP06r2XW2MhLQbC9X75j4y8ULjh1735EjRvPNB1mjw1pN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+VpN+WvUlAuWtZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZrytZry/9SacnzuJfRDbhq3L3/WH/9rPOuPS6rJIHfg7O/i9lH6DBQ8xZ6B0npf45kP1I00ssQV77vaEx+wSh97UvPha8tleIsj+EvoefJl9szPMMtHIezbRIFVZNmsInsCeDNlKQ6bilxb+coqKWi6Uu6vqux0p/T8gY5qzGrpxV86NTTmrspBT4ZHbOxPwdi0to+OTTkDRnTytA6RFhIhgT6iqOnmi6albWluJVMAvt1nPJMwfeRAtaO3l5y5uzAm9zt76jU3R86dQM+jEzDnGT3I5oypkfFs2pi6a9PDvYrFVQZdOeFqieYZDF5WYFjM2eZ8djvXe+Ih16i/n/PYtTZm41vxl/B20LcdhdERvZOdVztCQZs1rPo4B+9y2ilzCLoPh2hVC4RosHKf2FoCc88BS761ZdkCXu0puml2xlBfDW3ZV48f8HqGk7LU+2jjBf7S6XQ27anKoYSfv8L02tAd+gp6Hk/+x+3bazwFDU9egdD/D8VO/U94nJ2QMWrDQBBF/9qyg5oUPsEWTjoZSxYY1QLjBNS4Sb3IiySQtWKRDW5zoFwgp8khUic/zhQpggPZheXN58/MZwHc4gUK32eGe2GFEIXwCDeohMe4w6twQM+78ARz9SA8Raie6VRByGp+6fpixfmZ8Ih7n4THeIQTDuh5E55giw/hKWaqQ05fjzM8GiaqMUDz5pc35uwMCZC7/uybqh60zrWOs4zaFhYtTnwHtpYwlGx7skNTEnfUKxzpMByNna2OrSEUrEsqDgc69uw0XLRh3XGOY4+n0jOIJWmkWDCG/m1bYUrvDnbfGL1x3eAqb/raep0uYv0jyfWc/82TYIUIS9YRv2h9PU2yipZplK3/CPMJOt9g5QAAeJxt1FW0VkUYxvH9/zAA66jY3X08+917Zva2u8HuRM4noMTxiIGYGBjY3Z3Yii2oCHZ3dwd2Ky5d63ufG+di1nM1v6v5Z43svzNtVNYn+59D279X1sh6ZFOzSdn4bHI2OhuTjcumZBOyidlYGvRgOqZnBmakJ73ozUzMzCzMymy0MTtzMCd9mIu5mYd5mY/5WYAFWYiFWYRFWYzFWYIlWYqlWYZlWY7lWYEVWYl2VqaDHKOgJBBJVNSswqqsxuqswZqsxdqsw7qsx/pswIZsxMZswqZsRl/6sTlbsCVbsTXbsC3bsT07sCM7sTO7sCu7sTt70J89GUAnTfZiIIMYzN7swxCGMozhdLEv3ezHCPbnAA7kIEZyMKM4hEM5jMM5giMZzVEczTEcyxiO43hO4ETGchIncwqnchqncwZnchZncw7nch7ncwEXchEXcwmXchmXcwVXchVXcw3Xch3XM44buJGbuJlbuJXbuJ07GM+d3MXd3MO93Mf9PMAEJvIgD/Ewk3iEyUzhUR7jcZ7gSZ7iaZ7hWZ7jeV7gRV7iZV7hVV7jdd7gTd7ibd7hXd7jfT7gQz7iYz7hUz7jc77gS77ia75hKt/yHd/zAz/yEz/zC7/yG7/zB3/yF38zrZE1aDR69us/tNm32d7RGnlrWGuUrRFaI7ZGao2qNeperXc6fOW+zFfhq/QVfEVfyVflyw1zw9wwN8wNc8PcMDfMDXPD3CjcKNwo3CjcKNwo3CjcKNwo3CjcKN0o3SjdKN0o3SjdKN0o3SjdKN0IbgQ3ghvBjeBGcCO4EdwIbgQ3ohvRjehGdCO6Ed2IbkQ3ohvRjeRGciO5kdxIbiQ3khvJjeRGcqNyo3KjcqNyo3KjcqNyo3KjcqNyo3ajdqN2o3ajdqN2o3ajdqN2o657+x/s0Mw1TbPQLDWDZtRMmpWmtFxaLi2XlkvLpeXScmm5tFxaLs2kmTSTZtJMmkkzaSbNpJm0QlohrZBWSCukFdIKaYW0QlohrZRWSiulldJKaaW0UloprZRWSgvSgrQgLUgL0oK0IC1IC9KCtCgtSovSorQoLUqL0qK0KC1KS9KStCQtSUvSkrQkLUlL0pK0SlolrZJWSaukVdIqaZW0SlolrZZWS6ul1dJqabW0WlotrZamlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSWmlphaYmqJqSUWQs+BQ0Z2DbKY2rqa3YOHdw5oDhvR7G52tnf8A09xf7QAAAABAAAADAAAABYAAAACAAEAAQEPAAEABAAAAAIAAAAAAAAAAQAAAADbY/02AAAAAK+ENl4AAAAA5F0LYQ==')format(\"woff\");}.ff8{font-family:ff8;line-height:1.089000;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ff9;src:url('data:application/font-woff;base64,d09GRgABAAAAAVEAABIAAAADYeQABgBiAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAFQ5AAAABwAAAAceaeg1UdERUYAALK0AAADAQAABKjkY/ArR1BPUwAA0LgAAIAqAAF9+tdMyrtHU1VCAAC1uAAAGv0AADKuCdEXIk9TLzIAAAIQAAAAXAAAAGBWRNb6Y21hcAAABWQAAAEUAAAB8iQe/IJjdnQgAAAP6AAAAQgAAAIkPR89E2ZwZ20AAAZ4AAAG0gAADE2CFS8zZ2FzcAAAsqQAAAAQAAAAEAAUACNnbHlmAAAS1AAAWbcAAJcwJuiFJGhlYWQAAAGUAAAANgAAADYDoujCaGhlYQAAAcwAAAAiAAAAJA1CCHJobXR4AAACbAAAAvUAACVoungr9GxvY2EAABDwAAAB4wAAHBijuclobWF4cAAAAfAAAAAgAAAAIBDNAe9uYW1lAABsjAAACLoAABXk4dmeC3Bvc3QAAHVIAAA9XAAAqFNiVvONcHJlcAAADUwAAAKbAAADDNkw1r0AAQAAAAb64W2OrUJfDzz1AB8IAAAAAAC55pg9AAAAAORdC2H9+f5ACCoHBgADAAgAAgAAAAAAAHicY2BkYGBn++cAJAv//vy7hUOLIYVBjAEJsKwEAJGaBsUAAAABAAAOCwBhAAQANgADAAIAEAAvAGYAAAJCASYAAgABeJxjYGZ+yLSHgZWBg3UWqzEDA8McCM34nSGN8R8TPxMLBzMrCxsXE8sDBrb/Dgws8QxQ4BusoMCgyKCg0MfO9s+BgYGdjfGAAgPjfJAc8wPWUCClwGAGAAwlD154nO2YW0hUURSG/73WPjNdjWB6CCKyhwwnChsoQmx6KKKwC2E9RJGFhRQx3UEThNIyk8yXDG0syC5EFhQEWZSRlQ/jQ5gYpl0eIqILRIYFNbt1xqle0oixpmB/8POvfc7ae//nwGxmhl5jLgQ6B6jb4iewlgN4o3rUaPajkP1mrWo15VSD9eKfucNs00ewWTSe/JhKflOnX5pjDuDRG1HghMSLRQtFPSh09sNDjfA4WTIOwuM5CHKy4TgbUKDvyHVxJ0Xukfmo29DoZOKiXG/ybkWzrsNVum/W6Eos0AcQ4DoscmuOIpsqjVeXmj26HgHaiCDlynix1LkIeN4iqC+IliFbV5kneq/MOY0gHzCf6SVC+jx2aGCpZxqWc7eJaJg0vmfecT6aOF95Y3vIXu4+3+SuT/OVTxRA75dPFFITKYRVMmcU55sWqdMpZPKcubjhvk/3XVosvwttQjDZGZKF3mJqdQOII8jRT0DaJ/UH8RzkOFLLGURUbqbL+UDcLOdIq8y5IApL/zrpc71O7p0yb2VOsZwNFXIG7PZUo0TPNA16MnbK573T3SeRnG6+75l9fTldJf4GfuA+62Cu96/DeejkXEToGrrcmqLoUgZDeLWcsdsQUc/RrrplPEPqbkScEWjnQtEsPOINqOVVMucW2qkBZygLb7gAvQzc1/vwgF5gr9Rp9BDHE8lI6crXV0W3i4ooHa/i4wpRi4xL42OvaEUieyWQMTWe4aTo/YC9NSjr755qw+W4lwxmvp/BGajnDHPoT+9jsVgs/yM8AWNi3mWODtSnV2JLn5vOAdebg5GxvrHm8WBlHEzkd1Vmn5ueZGf5FZL1btyL++uhw8b79xJZLL+PnoLhVInZrnSqqf5VP1dhCTchzJPwlDvE54nGiSrwWBPClIJwrO+6fD8fhrCuFL8iuolnXC59rl+SvpvYxWVqKJ9VxEVKO9PUkNi85epPP7LFYrFYkkz0qvuPSrJTWCwWi8VisVgsFkvifAUJIeB3AAAAeJxjYGBgZoBgGQZGBhB4A+QxgvksDBeAtAGDApAlwKDEoMmgz2DIYMxgzeDJEM4QyRDPUMWwmWEnwwOGV0zm8u/l/yq4KNQpNCo0K/T9/w/UqcCgzqAD1mHF4MjgDdaRCNXxHK6jFqyj9////4//3/9/9/+d/7f/X/1/4f/5/+f+n/x/4v+E/93/U//H/xN+EPPA/wHn/Yv3z98/d/8o1LUkAUY2Brg2RiYgwYSuABgULKwgFhs7BwMDJxc3DwMvAx9Ekl8ATAkKCYuIiolLSDJIScvIyskrKCopq6iqAf0KAhoMmlraOrp6+gaGRsYmpmbmFpZW1ja2dvYOjk4oVrmCCDcPd0/SvYED+BKlCgAIS0yGeJyNVstvG8cZnyUlkuLDXT1s0940ne2EipOVzDROWkZVbFbk0qZYG3rQwK7stkuRAiidcmyDFlBPMlb6I3rr9aNPdE8qkEMD1EBOPQdBjzFg5FD0pv6+2SVNCSoSYnc48/se8833mq36e7/77W+ePtnxvcftrYe/bq03H9xv1Gtrv6reu/vp6i9XPqn84ucff3Tnw599UL69vOS8/96tdxdL76if2vInb//4LevmjeL1a1cX5udmzR9dKeRz2ZlMOjU9lUwYYskoUrHmuQd0oxZQXtWVKSn/6PXDMok5y1az8k7ZX465aNohMd+ihQ1vIKoVn1LORZZHlCyZ39kQfmhJl6ZKeNR6p0e3tjxbmf+yxnQfMnSz5tm2RYkSniZIeNY7skfmBnDbipAmiQ2P3+HZNxWAomL7GLc8enu09P3LjHwhxNnpBTMfGaE5yN+o1UksDET+GxJXme11RZBYpVsODDEx09pEmYyF78iYJ+PqQ5h8fgsW+7pyiQ/c3oFye/vwaC9449PXkUdtGcpwy5u9g6k2ukX/2PQGuWxN1fayAIQGxCCbA5JjACo+Gxj5u4aeJPLuyiAhMgW4b47Ndfk9oOpxgImqw2+gzL+hDM9OTyZJAmKj2Xw0i4ygVI3SkRFyn6odEsdysHQangxNsRs4+Z7qdZ56lOyAYSCSJbffprdaGzuAsBXeoC853HU9cPCk25ch1swbYFR1Dvo5vNffCzhNjEDVQZupeUf2qUVz+Hdp1qEC2Aqf/9tKhm5xX/IyDI8k/QXmTlBtHpEERZgeugq7QZl7sMYhKY/DprOx2dPBqR53JB3uHkS51zkZ5b8dmpT/j43oID6Q1IKxK3vBAZt80OFjugcyPN7TRz3RR0O+Svegzi8LIvvFY0jveG5fuW82xMExSZYuyto23XBYMAxdNrHTg/WRySC8sZ9rwnIM2FOjalv/ibaOAXasdup+DMUMOyzGlKDu+3YUd7BSunQ0fVvJkDWmS7TgmPYXoJ0uL7W2PLdu6dNTouZ9+qpovcK8tTGGjSJ4wvIrK/JRa1u1NqMs6I+GoB0VcGIcebDG/Frry6L1Mpo/9RqqEYRhQ8lGGISd4dnhrpKmCgf5fPiZG0hd/gbwvx1b1DjxyQz6xoqOEKuTnHuNrRbNbz7hUDVkvxM1jnvKrlj27Jhn4/+R45pD9qMGuOZC81vYlkd3smSDW80QHcIis8IlC4Mee6iJrs5fPaBWtqHc4qpJ+iV3fzt2FjIzTh7ugZsxCiW2zfV0PKyKXSzocNOL1lLsWs9FtewgjgFTTkeUq4+ZcjiijMUDhbgVW9vfk9+TuR3Oqjn5SVn7X7feHp22ccb/VihTiUM/X/OSViKeJawkz7IOWtkqXXe0IPsEHTM0lfxKkenQdM07tVZ9ac6i1RngeeBwBaGjfqW+NLiPigWTjFUyrjEu0Fd1e09er4A4TiTphkGcaZPHii+DXv/ys4HHVDieFfHPzik+4T91e4u7dqnBdWXZEce6T1e4N9OVb/UAe62aJ9GJULmbeiJd2edgkwzquiX41iQ8PPs6qHMLhMnMYsUpjjFy7flcW176oYl+iET/84nfX4GW6vs4gfwY2+pqaXuxlypWXFG8V5OPcp4+9uKIB8FH4dn0wc0vi0jUm8VX/mUub7XPrSY207TKuDO0PWo4I+XR+r5jTS4fXCA3R2S0jz9Zn/M1khBrA2U82xxUjWfbO94LUwj5rO09TxiJWrDmD94BzXshhahqNMEog7yQvBAtA9qeJzKa33pRFeJQU6c0oNfdoSE0lhlhhugOExFmjrAEsKkIq2os+qpwi324wFMIeo+qG94f/X4Y+OxscS1KQGS2uisooe4OjEQqT1m1t0Y5tcb4PcbvRXiK8bRaQ/qjOCSXehgolD8asCcsw+cU5nRJlOTw7Awd9CU6r02p0lO8aLAzji+Rxevgu89vAPg+HXY7bAenaZJ7ebPrU2asECxNmoGGmVgDOBpahm8BCHWRrB2lp4BRHIc++Q5v6u2zAinxPfRArVBqMdI5vcgblf1wTn2or5NUibKlI/6bgW3cCDViYYnN/MhJ6Tws7yqQuoGEt6dEdxvJOLXIT9aKkD3c6lOLe/rNWjFRRBWUK2Rp5jbfVWk9z92GQjxp34+M16ujmAF7m5SDRYsTrowF4B2QmmwLniOYyqx/ZzWbQ7Glfo8aZKO1pjTIVCg1O2g4kXwOiKqMhKEroyHW8UWEpvnkef1B2x6e/VX9wZ74LS8p3M4eJ6aw8A1ZFX54EaAnaJyZi2hBw2GYKVwuEPkrUxj/MygkbhM4MLXY7BxX5j5a/h8wUH+QAAB4nF1PS0wTURR9b6Yfhs7Mq5XpbygtFEvtEMFWIQ0vdmxpXMymfBbUmggpIIgi2oJRkE+kgY1GjRUriW6MGzePuBk2yA63Gl2oC93pkgViXeGrv0Ru3jn33HOTe99VFz59tjtq376jND1jl6dnXK/fUD11ldLFCUoXLlEaG7fLY+NzV9z5yRqp9tx5SsOjlIZGauShkcJltytnv55w1V+jMG85tpiJjfkNZonAL1+hoj6CrSW1REqbJcPde4yi3odc1pndyrK+rICi+t72i1PeQ1Ed8urZh1BpfwwfFBnFuXI4FDWvOFYYazGmRt8X4dMiXJiDyo1ZozK72OBdLkBliWKxYFRuUlQVuHaQkNslZ5skHZdsxyQUkfiwxB2VTK0S2yKBI5IOq9VI4kR9oEkMNiEUgsHynlL+gXa/izvfxFh5u8zEdmBIEZsV1OAXG/2oziv6vEjf21S7jFx1FFkP8Fy1hTeZq3jWYOQBZHgTO+i1IA0xFtABOtlhLs8ucc/BM+4j4izAwlpQB+jg0myGm2LzaBWsciW0zn0A4joUoKjakAw9gtPsFiSrQ7AZagTvSREKAAJA2UrRQhGjeELxEgpqwNSMQziIA7gRN2AfrsMydmIJ2zDCHDZhFgOcivRCYtOA1hsnByHNPXESUTSd9XWTsKIRLpXpW4Pwdpq6hFnWIeglhmWdocmWOJ3p06Gr0i7I6wBCQLT+wq20onjIoNbTR+Y9aRKuiDueNNBIuIvI/riyP3L5P2nyfztHdpKknBwdIGV/J9lNjtKin+z6O391SShJmpMDJEi9wG/vX8C/AtDZdHplQT5HJ9JHNXGSGL1z/z/WuMrBqe44YRJnNDLYrRE5leknbn9cI69o1ZbKEN4f/wltltAHAHicY+1i4GNgYA1lEGDQBpMMLEYgEgKYH0DY/z/8nwsiIWwGhn9BEDYqYKtlEGC2/f+BCajr/wKgCkFMNZiAA4pZQJz9OBQlMBTiNCCPYQXDV2JsQgWMcYy6DA8ZTgB1NzNKMvIxsjB8AotLMBoxajDsgyusYyhlOM3wi2Elw2SGWoYMRgagugcMTQx3GLYA7Ua4op7BCQgZGKIYuJBs0YMytmFxwhEweQdMljD4MkwDms8AdBMIvALagQ10McyBs2FmLmBoA2IGhg0MKUDbIcALVRvbPgYOphJg/DQC4+UBwymGTUAXhzLYwd1pxajFKAcMiynA2L3B0MNQ9O8uOI5dWAUB4/hFbnicY2Bg0IHCMIYmhlkMjxhVGL0Y0xgbGOcxsTAdYvrCbMJ8gKWJVY11BVsFewAHD8cxTiXOV1wJ3HLc+3h0eM7wtvC58P3jrxFgEcgT5BCcIbhByEnogXCViJbIK9FZYhli/8SbJKQkzkhKSN6TKpF6JD1DRktmk2yC7A+5Brlb8knyPxTmKeoorlD8oMShNEtpk9IppUfKYsoKylrKbsoTlG8oP1J+o/xNhUGlaRTihYcGEqoaqR5SE1GrUBdQX6AhpbFJ44emneYjLQOtE9p22n06HDp1ulK6Xbov9CL01ulr6e8zMDCoMpiEHxoygaGUoZGhF5EwYYDgBSMnoz5jPuMG408mHSafTC1MJ5ixmdmY3TB3MV9iIWfRZfHA0sNykRWHlY/VBmsF6y7rRwTgL+tfNiw2cjYWQOhkE2PTAoSrbC5QAD/ZfLIVsTVCgx4oMAcI+0iG5+wERuEoHEQwAQg/oEJ7FyC8ggodlIBwDRXhLiA8QXV4DQifIEPHtFFIZXjLScepzlkBA1Y5P3FRcilyueNq4NrlxuUGAqfcOdzb3F94GHh0eTzzjPPc4vnLK8prmTcXEOaNwlE4CkfhKBzWsAUIZ4zCUTgKR+EoHIWjcBSOwlE4Ckfh0IcA/mOoVQB4nMS9B2Acxb0/PrOzu9f39tpe7703SSfJKqvTqVnuXbblho1xxZViwBhsejfBKJiEEp4VSKETCIRAcJyGUwhpJHmBhCTkJX6Bl8SQ2Fr9Z3fvpJNt8l4S8vvngnx72pudb/98v9+ZESBABQBiLbUQIKAAmcchyLY9oSDZE4XHaepnbU8gAr8FjyPxY0r8+AkFbTjd9gQUPy8a/Iaw3+CvED4hBEeEC6iFf/tMhTwO8JBgNf7xeHXcIG8AECGCpBSIJhSP7aMRAp1Zx9ixHMxai0ethXxOBYNOiIIm4nHh7Uf2TquMd1MLT29Ad5/6ifAazABpzBPoMfQJakQaM8YbKAVJQwQImlYRNFQgCDqLxwt4SGNLlj1eKIr/5XPioJQ4cOrJm8vE1idv7aZGBDv8LRR/iONCaECjxAppXNMz4oCEONRxPNDEAMSKL9/ajr+nh+8BCPYIM9Hr1GHgAkmeAy7kWs0DF6NH+tUMcJEM47GR2aI4iaOg80QS2DodJ5J4nEAGNjaYjKUm8VVUBGgFfiHCYvbAIlG69Rvnt3XMH1ix8MJLH7bPvaypr73S0ZQcmiXM3Pn6rT+FVhh49v6VC5OZ7Z19K5/+uvA14Z37tl9eFOc/vlqYSTyP52MT56NSI/VqXuUCNmRbDaCNJM1mh0rkSXHqfEwFD7SY1ZAMlgp4QtK8GhsyMCjgqdz2kvCz39pnXNTQvSkXcibjy2ZRh/E8/jj2MeGOR7eX+HnQfWzk1hP3rb+oJPFw/Ebhp7AfC0oLbLzmSgVUaB/T7dMCZfZoAThY4egwZgBDKaIdRAn2E1pnasVFcysDC7HcM/zGtXPPW1Fc0XTZV68UxwLr4JeJhcQdWB52XkvMgXAbhFh/KEmyIDu8/TgezF/yE1GhIwO/Ar/8mjyH0/hHJ54DAmZeBR7bByWtwxoGso4TsiBhJ9YsmKnpFBzfIcwjt1F34+84eS2C0AkQJPCzCPFZhqKhCDo7Je2E5LZTr36TbKTu/uB5RY80zy0AoK9R64AbXPA4JLoXLuGddqB3OEnG7LDnbDaHUiVKWEE/XFE4FJjv2WTSAIoGY4st6/iGsUXS/mP5nJM3/x+/MARpUV2sCn+pA5VMWF6RYICBiigs0grix6bUeWtMp79p2ry66DPerrFZzLnKuiLReb0rAJsXhaNxA1y2jDJGuuYQtxS8boc+1LweJjfej2nxjL9LrsS0FMA7VVq6GZ0yDOyJm5SGmzBhfn+DndGFI5EwCt/HRyKk3Q2ckEVObh/nRu77eM4O0/oC/qRA7iPTKH0fTypkXQMOG/vqyhXDxpapV4YWLJekwQhaMCtsMsMdY6+fYF8/ZmhpEfmS/zc+cchU6oBFyQgYQg/lf4OBSLRU5IqFDmyrkSQsdRAyjwnF6ZZr3tq2dmRJy9rrZxM7DvTc+erH1v50euP96s/NvrTr4t1D9j1f3zFQ8VXKbQ7S9sdcprR78azL1gy6dO6Pr19+31Wtaf+fvjd83/yNa3egpZ/e1TNoKCzuFXUQAayKcAy9Kfk1JcjxLuIxNAetQtsQQkq95C+xJhOEgqQQLTrMrLUgqnTnseGsrNeS64RwDCv3LlHBIXpIVPGxG8WfxBMAjX8S26f8DBYYQAPvIR6rPQIZ9FdqoIZ9zLhPfg7DarPF4jHxKZLpdh7LDteeU7Nh6VkrpxiyofbQeoPGDxd99/i9AJD7qeUgABLgtqqGZUIg7jOa4sjnS7FBSCQIwpBA+B2CB/lg0KBR2V1Iq9EeqTg1CQPCoi1mi9ggrFWLOJEU1cZaZK976SWDEbbgt/idqDe2f2SMIehXMMhilqwKk+Y3eUj5fWNDNOyPRhobSkHihLCHsfodmoV6Yak+2JhLEZuhL0moWWuI04+dZlJFMyE8A3tIAmrhqD3W1d1o69eUy8pI12xy+anvt/cVAkZULqNod1sy+6N39y3gu7E0aACoEI6TAZAGreC7Vc50qum90WhbhtnLNzW1OVvTmVTGlcogp0bdmk63otaDfDodyHN5lD/I8Zz1SIULJFDiYIAP+I9UAiKZktaL3j5bfSdqvW2KwdVxznECsyN7oiAyL/rRPWQIFjirZFmwamFkUGKy5LqiJSjbWTCg0OBfY6sjJKtDi2/5fDGT77lpJ7FifaR/92WfuWjsLSaR9rHP6KIpBj61ZH/v5h29uQ23WJaxqy6bmdy46UZqYSTkW9e78uYNaU3k+qHKpcNzk9ayNjFzALVMa01E6fLYI7NvXrZoISWExi4lYOOyAz3DKyU/fin2fT/Bvi8JvlLlf4AAdrvNlmb38j4Hy1j6HW69DXLIZnabkfkg7zaBZ8ff5c34NyAOCPwbgo7TiD7Ix8mqB7Kxx7DLMbQk666MLVhjMXekYHxMYrb1Ix5+CFtpBrsxWoHDAiODC8zkUhExEDs3rMpNOHQUCxz5E34/8vCl1IpM48qIp2jxzqwMbpoZ3s+vfmnrD97WmhO5g8/84NLl/0E1CD8bWpqOJvIfXzv325/tXrC1rbhqgfATl/13Py0vvvbSG1/dz9slfCbqci/WZYyLwJVVToYse/lQKE27k4gCXuQ9CHgAj1SANomSB7W8VnOkoj2nJskKamyRQrcTP+Ef+vJQsU7L/KISIkn5opJrN2Kcg3mkoOt06q7bnqqkzp+fatv9qYe+fcvsjOuq5++Yn5m7qa3gnKJFDre5vOOTq6/583fumh/dQ57/PZgeWX/zojAh4QmRB+TbmAcpyFU54GN1DAE8Hrc7E7YoOQV+RVBYaUEsr9L2sxbds+Mv8UX8Vmc5yCuVKQ6433QTOuTjkJs76ON92Nh8egKHOSKVUiDFwRSfSh6ppKYQzh7F8pepHzuWBKJqyO7tWJI9ljzTT4rKd6wg6Z/m//FEZP3EJl7VyiBGnPIVwlf1voF8u28f5WjKn9p4U6yUtW5dtZ6JZG696K1UPt7U6Lp++emBSelRC4UXV84ICD5He5OwsbXDNfZfWkfL4nZhZIrsqvL5FpZPEkaq8lkbCYas2NaZpAcjOaB3I8aTRPqIN5KNPBr5coSKJEGQDfqC9wcfC1KqoOcgD5K+ZC7JJ1clb0/SWpRMulUKtUp9pKLCDLDtsyEG2SwWjFEOWniL+UjFci4W1YAdvsCZ0Iph9tjwWXKqCmne/38TGoKiE+GqsbFmUOeSIfwqTaJsgRk7NSkX9IQsw19uvTbSnHNu3bBeH4ndABmHJ+jIRHA0rJeOLEKtt7tTKPdWPLI97Rl/lwLYNzeB71flFfR5dKxOh1BzZi9vEQHzkYpC4WLzeqNRDFW80eQRvacVe09P6EofBD7IIJ/LFUKhg7xr0oGKVIs+U7zEtBtbROLFd6IUZCdtbGGPShLg/i3PGYJS+MMMxa4aW1SUlly0UXTQVomtopOSX1gIYnwsoaiSjGQY+A4TjXiMM29s3H/ra2+1bbz1s1/a8vqn2/eHZ/CdJb653NiaCM1fUOjNe1RwZzhvjsfpclkX7psvjPr6+v7wiy3Q/NboloYW4ZeLVyccXn7wkqsfvee6vVcGWwejVT9G/RLbyTTwTJXvbRk9g7OvaYhh2r1p1pAyGHwphN8h9g4+HXGk78jlbGoFcjqcWO8cxlhDCYUbMXo/UolI6ibql7WIAZgEv0Rv/WEIzslH/tVhz9BbPzqXGktc99dfkXdjJcaKK6gkJV4gLFkw5QM5Vrwvve+Fn+6tu5S1WlRkSavhXuFqp7vug5qaSxfCK7C97nIidiA95rkTLK3y3KYwmRFtNrtpJwGJIxWo1+owlNXVCJ/UVzF5shZFVdX/3VuH4vAsDsisgacFtUyjNoKJOim/l6g/e/6nv1YltqYrb+F594Jnq/MuWdR6p9+ZAMneZLK1F7U4nf0tlgQDEgjwiQTvbnB6CqixofFIpUHHllEn33mkwvASPJfEKM0WY/SiFDyOS3BykkxJXaAUxUSKg//yyEMySML/r+MLNHmQpDCijWah5PE+TIuInD5SGVo3tFCv8YX18B29vzA4XTj0fUckFLHqBK3eyZn9y0z+cFA//0MViviLo2/tkgvCTmvQSZYrCltHn/AfYx90DsRNVFcZcXbb4MI/5NNG4doPV6yaHgkSDruhKo+IgtY7XYihaQ8DaKhDtErlQq6DKl4KElbzZFCQVWVKaJBLagaRaSK7nf/ECEPhswO8rHzEynxTqrHBef35p7fWcURWvx9dzAbaVvULO8+hgTnJZjDson+Bae0Aj1dpbQGQcIUoldfnKylVTmS18uF4MypBH68y9/t8HQXWlENFY6FQPFIphF0dZHtH+5EK0VHTEUxm1VoM1SwxWZRKNcYW+Qf+XKpOBP61IYegCdYbYFWrsBIGaQUMogyMBjGIP5fOEb+dBX8Cv1dnojV9Wq5vDpuzTULng2WdjmSZlHF19fd31MOl019C3VMNueq1Hqr86vJFw6f/QgzteGT+8hNzhYEpv59AUiLvKWz3D2PeF8GhKu/TkOQcpDlNmS1IqWx0ejMoTZIcF4vEY/EjlZgTsLoiAwHAfAI1ZRGZY6ixR3o3yW2DUWa1458ZBSf2Js5abJqqcCJjs/DcjIU2ePnLszM6d1b27Nsknr339ruulFevTHv7q7y8fYKX1MKxb/728c+9BrvaWia4dOo54vl5t22F3b+/Qfjiufgn17Nx3onzpXXAhJO8ZVUOOnR7A4FA0rwXuywrsmJoZ1KHUfggr54AFJ3VsClBlOwJHC3Zv3vrECWCig4SJ31iDgRFICFmgVCu+OLsm1ZDouftd3wzrn3653ve/n18+Ponjgsn5izNpZoKHRcEXBbtnOWLP3VNP/vHd2a/+qtv3tb3379a9fsTz17WAvfceBnnbO754ZXrb5gx/drLDwu/ER6o5YLk/2DdCIEc+HSVtnxOz2ZZ1pNFbsVe7KwLbr1Ol0O6g3wuF7Jh92Y/UrGFsih7MMSHgkcqoTNyu4lS6Im6qOc4UQ0Iopr4/qUBh2BBzhOxpw9EccJ8lt3BQrUeqEBIu6E0eNmC1PyR39/hbo93K+gzsC9sW3f14vTKtc3xy6iFtCI7c0vvtsf3dVHCa75s5CzwO7Yos+amuevWEmNy/+RS4SpJNwKgGXythsBUbsAG95rce/l8vtUElKyS0CIlpaUQoFjKRyEDxeu10IS0gGUjKHKQZ02OBtRwENtPvUpIHlqE+cdXDNeKB7KTd5xgTxwvsEdFZmY+4gcMha0eolhoKlmlUgSOqHBSLdG51RKZOC6Sj0SmZ2aufXDF5jsT0We/UlPT1PAtTwvJs7VUNa2tw5vIzly7fM/VF5t//3pNZdf85e3nroQD59LYSX0t4Ejyci2SFNTKbIfR1G4y+duRL7uXb27mfQVg7OgwIuNBvqMj6rQrXU7XkYraGW1H7QejfDRypBKdqmZF2T0Zz6i+1esuZF8vSDwPfSSjD0EP9EIPgZV3Aricrcz+goe0mGlFuE6pb2ormdysO59khMN+u4+JtOY7+s9W7T+t271pZsn9xDPCz867CmvuxhmO3cT2/LLFN8/oiqvLK646MrgoInzFnwudpegaf76ytPnu1zr7Mqv2zVm9ihj7ldiH+WD8XXIh1vc8eKvK/TjIMTYuvFehKHr2Mhq/35kTS2U5Ug9wngXSfJpE5EE+beJqWRjnFLNdAue6pn0mJ3Ie5E01rZzoACTPuDS0GMTgLrrSsWOFarbn+rc+bcgkmYHYa4tKJoCvOJzuidmemOZhK7GY5aRPbEeYnkO5Jf1b9sbmn79ydeWab1639tND7fvholUb9qxeM7Qql8/O6Rtcftvybwx3wJlL1iWv2NY6tGCw95Hh2SPb2yxO4VfbLth+Xu8VfeUNF804f/milgLn8rmhD8fvL+L4PR/rvA/cXuM5ATxeTqG0Ig6AAKc3GoxHKgYCf4qZ4PHxCqtPijQ+NGHnmLjjmLhC9oxUBIPzKlz8J0aZqBJNCdHBAIMUQRM1f/Y+aGvMDf2oWnA4waQagsYfzYnmQ4mie/8gtVA4dOFQ+nRGhMmSAtKx2bPRa4w9PbMTLpSwy6M49j4kYZcdtboCiBRRmHE4kS4cbtRRfuQ/yFMmLpVFprTZbDpSMU/JN6tRuIqM5dzL8n/6Fs5NUTCQwUZ3BjSRjFTKREz1hQHyevfq65+6euHd27oY5wV1CcN1evXQooU7emx3qUjx00eYVNqrhz+77qXtDcml1w3nL9oDj7dOm0AfY4e7h+JLV0y/YTPxqWjJKn2uS83qwfx4afyv1H7MjzAYrvLDHg7pWZKM6tmQ3kirHDgXstmsOKBOzbqx8YhQDTsgCaj9LzcPQamrItKFJIxLyjS6odlq4ixF9PmWBLNQDx/RezLxqG3szlO1FgtB6VN5C1ThgHT/puF2p9hbod3ZruSph8j0RHMlwvNJzi5YbhzCNB0d/6sygWlqAXtq+m3hUuk8DkFKr4r1OliDYZrdYUg1IYdCHUBeZd6CfD7vkYqvOm1JsGKBokol1mr2aBX9W/5P35NLPNjSJ0gWu0kyvifkD/UQ0XpYxFKHRZPVrMCAld6eSjARvx4+rPcXM6nw2CvvElDntwor3jUT9kRETwC9O+7UQEhCktJZG3vhhp9CqNBl96DvLNwc8oRsFGZPqG1mz6n/JA480tXXlzv9MhlbuSaJRU6awq223cL183dfXNx6M/Gdse1DN1+/5j3JLp7DPmER5lka3FzlWSwS8vuzOquFAUwa6dKM263kaJVSdaSitIWiyBLmOMuRClcv6Rq0wpi8WuDB3gDzT+55OP7hMbDF1MevqtpgZ2l11pXQMHuJh+VgJbuEaVerjHaH3aaHv9PPMs/+dSngi+nhPXqzPzmrKFwBde5iaMI/QD2RinSWPDp8rZrfOCQchDNmz0+4vJiTlDG+pn/sv3CcWimcIuaOi+sFzF/AuSdE8CcAZGVXgF0AwvN4IEB8NyCcuvdeEccN4Li2FL2Lc/EM+FiVoylAIK3OR2s0uegB3qLVpVBCrRqtqA0JlDjEGzgIgk5nEAVHeCdbdZE4rherAEsuYExkALLn8fyTowzBknUSHETFDrgUk1CxgKq9OZqoeSV0+9Jt92g1qWaNsK9JV9m9fXrvxo78qoPPbbkro1AVWoZvX5JMl29Y4Eef7mfH+hp5Lh2jysfJJatj5du2bvjhcwd6hL2+2eFy5Xnh6BUD/Vd9/m6RR0XMo35qBMehRnC41htWHeAzmRIw2XxBymKKmCW8OcKzHIBFlKfyKH+Ip1iMctyjYq1YhES2TjmaVP2sVGs9o43k/xdGGoJWMVRX25g4MiuiovcWzThcRHSNSbUVA1AB/6Tr3LCl0rOpMzFj4/6RReVL+OEtYxaV0Z1iYWTXe2y+NdzR7o1OC2CuXT8vgBrIgfmhrtu3Lvn+p/bMifti/Sy5cUWes7Mquos99cb0vgHeVmosf/q5mdP7rnrksGivM8ffRd/C+hWaRK1WC4QR3wFeCXmbux/6HsW3ARZz901AqhAIkAEUOMSTnMWot0IDsrqMLuQa4Y3slNZidemEjf2hWL522I9P5pyyFec+6uExf8XEQFQ/aY2UjIsUwaYJLcSoiXh/7obX9q4/OGDR23zJ4m1Pru++t635KSKVnH7t0ht6LoOqxRuGlnxq6+JFne1z23rPb7SY/mzh+rseEV7b8UKHnHeLNvkC1rcIzq1q1e1mjd7CRRK02dyaP8B7IqFQGqVH+BBrMiKTcbRisnBNqEHMdQ7xDk4NVUqkUo5WVJK+TFGYbHIyCTrDSBMf1bDVqCJr3rmt13oO811JsyqjBytfcvtpjfYMM16JzXhofoVW19kxudG+wlbTv9vy3daz7NkrfMIzO9JdZ9AEmIF18ndYJ/0gAU7XtDJgtQPjteFwyn4AA8AAso7wKwMXBojOwOzAbVhlAnoP4O3ufuBb6b/QTwA/6/f5kQr5xa4kdvT9fg/Cr0M84vQxFBvh9Wx9xilqUhKr0nZRlaRsCL+tq5OMHcVxRJRB6v/ds4fCdfosabO4EIIU45acCIdrIkK3rvvd9bsfms+YovlP/uDKQ/e23yqMfUHHhNqyS25dJZSffSWbGL7ruzu2zntgW8PcrYs2jszbsm3GrhWt5LTOcHeDt2/ZaWr/JcXGZ6U1bQqhC32buhekwE9qMRwEk4yDddndNncqSSdpmxslWTaTdMHRSsp1N2/XhyJ+7BafhVoee0kXY9LgDJ8l7HJzWGNCrGmE10CRYLGvm6w2dmsWjf8tJKcU6OW09liRPSrV6NmP9kni4i0kL2TAHkLMnMQ1XEVFEIk2EC3JvTLT9Uw87nHo7YN7PrUmuqw1fRXpC1hDAa/B/qLzy08HrvzmwWzO6YqkWzIx29fReWVSa21oXnnFcJLWfr2jwZhZPHvrFadfeOC1TbotSnv7RZvQpeJapquFLimml8AAeLHK4Vaty6xxeQJkK0DXNphbWwe7DvBmUGJzNKJH+JxLo+1DFbaCKodw5HG16912O87pR3g7O2HWNTIn4o5YPS/UVoywr58oyNVjkZ/hj2ToIWst5SAmvYdRXBbHWTEuoBWIVtS95N83lWDTFM9ClEaclpUre7etmBvWdV24YwBHvDl3/vSWvos7lm5bZDF0Opw2twOLJV5o6R1cdfOXh5csIr7BFlqW3r4smU4uWV12zPe3BirdmQ3feVQ1b3kcO5cboOalLd54PytcumqJ8OoVc3rzmVDI7jRaNNrCusGOrQVi6/TenspTwkv7BvpLOx+8TO6hFQEgS9i3J8GDVck0KHQcMhrTPg8E3qTX608iXxLGYygeG63EMTCzk3ZkxxGLNbDIwI5WDBafRfS8dQ63WPXGUmFa1OxatzKPVfifHkwEFFDyCooJJ26quoSJzqTs5DGUmPMf559/kXmeWpEuaYXVVzi1kZBvxopmw1bhrTGu5tZRI7lmeOe6rqXCrZmCMR2iy4Rv1xJ7OpU7f8fCsXFy45p01Z1jP92JlfkK6kKMZTnwWM1PQwR4QkdinmkRgdB5vJ6YTRDjBIbHXyZ+gd+QKkCwBMEiQqMerWgsj+Asd7Ri1svAif11VgSX2GixP9wx2eB93SEtpnbymY9m1CGIA55pKtdERhFXNAhjJbuGTpc0wup7derwND0M7aAu/MtfTt1byLHJCGbJF9u6rVE/XdbIaxOxvyT2SnxwgVerfDBIfFCTnAsZNTqlDulEh5Xila7/bf7ORxwO+2jFMTn1yWlPQiB55XuNK0//Wx4h8WiqQ5zk016RT47gvm/eMekCH5TZFZbY9bfHHnxtY9XvEd9t7rVVOSbb2DXYxlLgtSq3uhxGXqu3eoEv5fMFUshvtdszfuBFRieJRHRIaEkvD4DOZ7OOViw2n0qv02lHKzp9Eibio5XEBOyWDSQrljXlpYRiWcharMWW4kTB9IcFzDspoH+kj6l1ggk5qbTizNwkFVKRVI+qN8nvm70ts7ricYPdx8K19o4Nb11tDRRyeuHea9UGu8W+pd4wiVmmYoO/IWO3+lC5qzLnYeGOcjmiKMPHvDaVwNYbZs2PEbdgHpvArCqPOaghkFqptKhlhAgl/FijKJucugpA9yE3YfomcukaLYRruyCIfkUjrKrOmBo5tRM7ENFaJqcmzgv7DPpqHPv4ia5EZ2tLujmdbU4j4A0jny/D0XqDoZxh9aMV1pvGLrGlNYFiSPKLiO3AAOoQ38GWHmlqahytNE3ocH33wCo3TLMTVBWLcj/QWqi1emIf0fgilD7LBxN1Pngyn0N1fkYh5YIc2bnwkY3rd0645Rs1Gioc9sxaJvrlN29XK1Eomt0/YMZO+hOUIVvA2rShRdu7e1ff2p3Iv/m8qa56KNuWMqazxbXbsa8mdsZyAaYhu+fKtfjiK7YhT8JLljU/JhetTmwFVVmQZSyLJHioFuuoQAxBmNY7HVrGzjCsHentj1itHLJyoxWr3qlRepVIeYj3siCJQHK0AiyYQdlzhCf21+cMdv/8aENxODW4ncnLSRGQwYkANywFuDre9eze3be+GgenxLZ6Fi1cnaznrJyTkDrMKxuIg6FahdO8PxhM2vfjaC1XBFggpao4HJ6r1Sp1Wv/unUNUffZaapKLBQQDkYSTyCpqgi9tHV1JK83WYGTt7p55Sy//9Nwlh18/0V4Od3c1ZB3t/ILLhtjZD+xKNVX65vH9G3qMlmUPbjognHxqEQyuGPYO7nz4wd61Kz4lfEaOX78Q5pFzpBpAC/hyrVdoPMAXCtNCzRGHWuVUOoHSiULKR2iaQjQ1WqH1JXUj04gaD/EMa0ugxAhv44IBFAyMVoLOWvJZ3887h1pMrB3HjIl9NGMPVevhNaWQii34m1FFrRMAz1FoecOWKOmhfkuLtrJzRy2Z3Tw0P40oQvJq8JUzay3Ec5sTcT8lKsvi1fGJbPb7rNuuEb0e8p1dbZFqB8Jcckiq56XBSK1W5QJOr9HkRU5nNnKAV0qx2QlcSRQn4yguFkPYgIFhcKY5glkyCcqLdZg8WVcrqLo47z85EM476wsBdQU+5xnIHZaIe9q3buvrk8t4m+/asHSboKHFysCaB+dihD5865DIrwX+F2YujZRvl7nU38+eujyfM6RCijKxHj4zvb9SeVZ45Uo5/5f8Evo95pEbfLa2Hsxm1XJaN9QyHNJB6NVprTY1IgnSSAZIZCDF8A1ZSBgRJO/inayFrUd/nWImuFLsJIu5oFVeIFJbkVSLB9F/dcghGJTUiZxcEihpIRRrKY896Q6ywXRnwqUV3REneaPtg9oFX9xcnk58t7tB55/eO3Oa6IXOS0lO6B3y4j2m6r608XfRTZKffqPKj16QYDhz8IBCkXZdwzMan8+eiJJREs2pFdO2gX2AAuQIH+XMdsNKDuo5L5flbuNIFTLYEWcf4Q1sLUcWaw9yhjd2bHi7BGmMUl+zVvyY6Gw2/7sedWZTs2kyM5e3rMm7QKT9VU9S+f7c7IWuzv61y3721ZmPDzRcqZrZ3z3HU+neuHzLly7Z9OzcZmjrX+yf2ZtoLaXarppz5yftlj8OL+mZFm5ujnVeu/T823sd3AdiDLwQ8zZCvoF930s1z6fTcABENDaL3Ww3me1IA3iHux+EfCDEhnwhpEKkH4X8h0hOb4JaZLLwNma0orXdzYvRS6ovgGo/srNKssPOHj9zqeoxVipsJD+q0SettqlkCorljaJCKmggyVabSsTP+rbtmTN3U47h1l/HdPTmU853W//k/MuFCq0SBfzplaVnZs6LTjuvI7twNXyiTPr5bav+doVQ8rQ2Bplsku8W+bULx8GL0JtYF6+p1YZcTgfLGozI4UhDIoZCWlctrHN222jFjhGpGNr1dWv7Jhz3RHl9cuvVP/T1IXFlbrUEQZZqF3Ixs7pfpYoT7oT3YUgQDpkzma6Cn9kKvTIoEK5r0g5/dus6CRKkmtGbY29iUJBNmMLlwUVlAo51VGHBcXLXFhEUwB0YFGDXJePsOePvkSHMDxNYV+WHh9JokYo0Qr3egkgt4owqE6T1pFpqrugnGnx1zc8i1gUZdhv+l/txyk/UWn+mJqO80QEG9wrNXxlW2yMRPVzVc/dtoTSD3iwLT4w9QPxtTtmDymOWH8HgqkiUKItzXjj+Hj0bzzkE7qjOOReEPlKldrrcFKW3cMjEkBQV0TE49Ls5HcXpuKDJGYKsj6pLq2uz6jSI4LplssUpdS/Z1+XFtfZ/aAxMHw2kJXaNQZpQ1CjtIDphsUYvnQpmhVfeeNirU6qbn9j9zGyFJYoJHy7t3NSgZt7quGO/TP91Y6eEX8DYJXtCu4U3PoVgbzdOncYST7726KryWPyn0DgkMQSOv4pxsB7zIwHuq/KjAHRcgFR5aYRUJpMlEfPavRZLyit97I57TS63C5PgVtExRVwq3dTUU8oLamtqrJP7UqXlDPgHe6y2JNH5jw82ud7fiiGwvLx4QuOjTaAUzSD8S2L20iaHXw+77alDd7XfZAm43Ha98OwtW3l7QC98ycFD+9ILfBGf16uHM4ir5y3P2INkuZz92M0l4VupDq+RLsNLVp+XdYbwpxWom/2H/oGQSSnqznhUGJT0PT7hL1vjSr+XAgolYAwaTRJ4XSFXCOn92Hn5dSF3KB3C0TR0F+9ympVxhtIbCA1JyzivTgNwhoZDAnZmUlStW65dPIa5wB47WpDrlsmPbPgh/1Qzwrk6AaQ6ZTXMFOUdhSXoWKqyRuMTpgUdwcRnhfHbLpnbXkqt4T2zvfmN0OdNdPeu6iB+MzAQILG9/RgGJHsrbxdeFa7/4r2z23xOh079ViLmat00S47r72Gc8xbmpRM8X6ueGZwajdpqYxCjVrsZJ6O1AzWr3qbep8bBVE1qSYTjrFgpsd5mxaHCarQbkXGEt+unNMeydTv8ZMucooMSHz+qscXWusIqMaqI/FHYVIpKmDpo8lsJd357UvGlRGsxbd3YfVoIwue3XqB4IdLRntnUSfwtCNd1XJtRWRtmNwhfLxOZm3aoPAMLYUTcZ/USyqHH6FtAFmzlvWqVIgDM8VMK3XGeM3s8ebNaFQjilCDwTjBIcmKXxa7S93P2d3hDHJJZHl9kU2QKpd4ho/KZBeyxpNgyHBP/yf69TeOwVMvnLXWQo1i3u7RUS8QUsBJbc8+s3df89/Slqz51bf/9jaFL6fa2bFfcNGfOoKltTW+GKya65lupx//DY18876EBtXF129KLOjyW/2ivBEsV77TmIWSPNbYEErEeXjpLQoHa0RpMtwtkeasNGOwOkjHbrFa7QtxB9IeKImbHFHVOLD0tTpwCIG/tL07Z2k8romFxZ/8rKsdAj37sKbZtMGVRLqC1jKmwLgbv3MA4SSbu4hz6mTOhxpEKwP0uo0pnKsx7vng5AOPj8voD6hVjBFs8MCjgt8A4nqeJ1xDrCzkLESbyhghINsJkoxwPZwrzpH5yAdzEz/CY9HbVgRAP8np9Q8io97lNNo3Njuy8zacXu79636MMBAzL+Jg3GayFjMbo8fk0SHOI93F6AA0IUBkKUSMZtiZGEffUsr7J5q9NLBDLUsVskeV6rOBgTxyV1hXBKT1gcQGpHnLi2sXGDthJ0Gc3jYlfTHSEZ81NDE97iPr6y4vWIfWI1XZm75h4fbI/PLA4Pt15vjt23V2aleoVi5JLiDNayRJPpf6mxNN0laevV3m6M5NSGMNEuo6n8v2kpu7+78B89f6/ZpLnvh+P/8LE/d8HQvX+m/LS+LkpMpPq1yX0e2DD96gsR6yqg6TLihneeYI9kc+Fz10Ahms/pPbrPXfZd3wcmsk+IklbWYXiE8QIkOYKi/izb0ifHSb2AGk+Y38dvx91S2e/2HgVEA/uIKB04ksNYsgHaqDuU9d8h7ycWvi3Qepp7EphgHgBLaAfBQ7sUSX7ceisp3hSh73pOzreFQEO5BCAMwY6fy4XD35erc6MiT1G+XwV0Xjkw1VwhJVKBVFIbN96aFChbV+we3DJRZamRYE4n9MoBxd9F3qJF/pvWjOztPLYDUutzqXhcPqOV2e1T581mEC8fDbDcuJ54lb682fOSZ4K74zIk3N92JykAoa4MomWTlkRi0KiJpcQ7JTntHDX4NBuS9PiQLwjr1bNXHDnYvrz4pSaVnx9YkrfmN0xOGswcvolrBt64cfERiLGKkBlXHnqsCiD8a8L3yKelT7rrn0GEsJiYjkxHX82a+K+tcIieIgYwJ/Nlj8DJHgR/7iWWgBiIAVyoAGs5k1mMxOgaQakkskcY7PlGvjsswSmNQeKbJEoujUxABJJk7lgTmpQMZ1uyhWzx7FYMcI5nsWvFvEHyA4fd/zcIX5+3NCS/fm3xaWv+ALzRFzxisVUqwQGG6VjOAhx3T3mlBtaLcFGaPAbxP+IEs0lQtaIU9/V4cuF7KpVbTd0957X4dKH2lK+iEVhvB2eHqPR6tPN8LccF040Ru3YpwYH55lDBc/Vnoy72BvH8ao37U9FYy566wMPCG+T95w6n3z/b5/FZNfqqEQzth8jKPEulREgJU2blUBlREoFPVpRGB5hpWKzHtR6UTkgpj1wot4Oz25EwbvlHtSqe2uGBTUf0n/CksDRuw34QRQs5fNBdYTCVokoDeMIRCk7RcXtAexTR3h9AGpQIODwQ4MZ+fy+0YrRH3WoQefx+jMtxIzyjLWpUm5WPdEikoX+ydV0SFx0KDY4oD8aiQaJMBNNGQlIkMJhvz8UZYSLGFckWSrCX51cQJtDfmZsHQxq9YS6THvzMaPZzKWa53rDEUW5W8HlF8xD1OmnOythRRk+dM/z82QbIjB9B8kCCIIMaAG7eL4lk01n7c7YfrNzP9/YOE2RziLabmvJZFpQywgPMmyG8KFMhskHwWglmEf5ET7I6EYrTBIlRxiVGEuqGz2r/RuZ5rqTLcQVXyIqOC7Xh0pidlkD37KyySFEPJCi/hSKyaNfWKvTarWodyrUkRRDtG25flWhfcdK4jPuacNrbrtg7FfEJXM2TVu2si8+a3OGX7enZWj+gTKttyf4LKHwzjJlk3SZK87rHNg0J6bh72hcOr0raCLOa1lf6WonhPsFHdl9RblPyskXYH//PlkGbtArnjyh1zOMV7mft7ImRmOSBG/igIsgXSLCc6lrkXRiCdUx6SihumMlMHqbLPI1lYqK2joUqbWP3m/cpbxx6R3regZnbYjvblpwz5otn1k598H3Pv5x0vHfDz8mPPCxreuXrPub3bri0V3XQP3xbViCogzvwzIU1zG28X7zfj4WyyncGUQ7sYicXuQd4Z2SiDBqO0NEU9bgnUMSWARhuQAgH0AVUEzhPTzywFO39uVX3XjDY5cIWXijM1JeN292q58m+Y29ae5MpsdXfXLjhpcfuJj3Xkh4WlbuuaEUzqy7olg9n0GkoxHTkQYP8X7xZAYCuFxOZzZsUXFK/IqgsEo6EYGtnYjQjt/qLCO8SsWl3d7RiptDc5yrnARwss5tzn1ODHuc3AjvTiuRnvASWQJjb0KZTo1WlCNpVR3skdghVR23JycOSvnQ8xlYae8/lmQGSTvtm8SN9vW77v31nCQbG3eRelck+o3Zm4tNztV9q6E+ENy48AvTujqTF805/QRTz1Gy8LdswacV7su2Cy/FkybhIvvgsPDamZys8Ssm8esu3huPRO2YV2w6gH0VMPgRG0gjbzwb74yjeDoicquk0vZH0iP8tsC+ALEvcHuA0Ae8AUKF3ZZfqVYoFZgteqfXiT9x+sUurc2P/CO2mr7IKUr9UQTiUiqRSR9yOELdNu86vTqDa+LpBE/ipDKZZwTjFE6goSrfXpi3Od/sXj24GgZyG2HAFcxx6aS4MngqS2S+Hcx3CU/w2artknFsuxmwlm8kgNVidbk9pNGYU+3nwzYLZxmtAI7lMLkcp0153H6/FmlHeD9HUCkRGKcmzLmGimuEn7F+8FjNsqWSatW0O+HE9gGoJ6ITy83ETVRidzLeuIuaM3fT4QvKfU3T9Go6hm95jck22VKXNuV3Td90ZLkzdmTvgUfX3ENafz8053PCA3dvuaC/P+typopkucwM73rVWbJ7ln7+4gsvvP8XrW32mg1RKawT7WAbz+dYfR7k25Fe3+nPGowZozGQQfgdMozw2bg9O5LLJUutKFZdI9McV9EqJ7LZbUisDirtAIeuauei+ubvnQxQtw6c7BR3z8JzSV/07dV92/KlgkxR4q52wVWVfqNwJDf1k6qv+Q1bLFnjcFlYvnybwZcwYJ3lS4gr52Vt+J+fTL2e0I6yZtnGL4zWXUz4HOIJyXcmeDNgXUgv5oIYWNg5qZGKlX/qZv4pkOJM0hTwCXnm7qkz/9W5pjplamKuUBBeIR7Bc7GDBl5LAZ0daWklwi9x7YmaR5xJKu5NTGnKchUxmYC1ZAKeMas7in97LZdzuyLtPUXvXXVzuue93+i2KxuvuIG41zN7cjKTetQLtvOtjEbDOlwOi8/X3xIHid5EQjw3wBLXgzgCI3w83uXKO9xFlMvnRit5xtCN+C5+tKLvwlM9187+ExNFqHqfUTwquVbMXomCpomFHiIJlLzSo37D/4cqmAK+b8Sa7WiJlZotXsyW7zCB+UPCyScswXhIJ8T0brNB1WNwBIKx7IeLi1iqc1ky4WJ/g83jwgZHlub+Wbgg1xpSlsvQYbV2W59OBZkf2Gb+PZmKfES7Jf2axntoivJIOkYBhQrrGBC5d5amOaretrbTGitc+FxxRSb1lmvK3T3BixaffvscNFzoG14uPPthc8P/o35NirsqN/ItzZzVqs+YWoCxpYPU6/mMo+T0ZEtkxuRstvJaQ7/V2qSM0KoYCkfCo5XItEZxCUdLU1XEUyWcLBYK0vQNosuc+Ld4lu00VffbYHhL12/6rqNS2oiPvcSvp4pqNpPQT1sunPxEs0mr4ex9OISIv354Khee7Yar4JfOZX3wgo7PbDkkzIdHbt579XbheXcgx51LkGNPELOqNiEmZd/D/CqAGXwcB9lAvkCGww0WwoNozkNadDgREZc0BYAuk5QKzyjlFvlTrC5pwm+qrnOSLxj7I0y8/tw+Rdoj3wnrJY6Ip99uVxkDRQ19DoK3vxQKqzguJ18tESl/jFj+mbWHf5PrPDd9p1Zt2b36Dd/MCdU4/SbWWjF2rsGx0wRCOLO2kfvN5ohnP68Td7PjLECtEqGBips8tLRuKQasLa2oNrpJk9y8leOikfjuJc+sXfaZd2659pnFpo7Nd73wm/6B7Kyeac2WyuCqG/FDF3/uihuEn39j+drP72y75dkHt7cIxzasjc/f/+3D07Zc8Fm4GVQx72YsiyiWxnI+693Pp1INbCEK8hj85BEbKqDQCF8o2GrAxpZF2REbL8Ea0dTOudP8rJP3PgzEFKS96Bi7iAXMiRQFfQiSge+t3L25P3TTu7e57QP6ys4r+4bXJPwrYMDjPzeU0YbbFzZd/sxcgrig85pFlR4krBJlIrwsycQLcphmvcIFmIRrv89XSOznDbSI8Dxatp9WqxFCd6kZHjCMtKOB4WziViObelJa8rbOn8trjScOvjvBHpX2l4fFiuzZe8ElqdJnCPNhd6U50pvrXfHIgs0fS5juelAS6VYs4vVf0U8RrGrO9HBhxople65utR27X5YsFvVB4duvEj+aKmBZvjuxfBsAD3bzHSoFUOT2862tZT9vNHWaTIFO5G8ARp43Ih7ro5E1Yis0GuN2p8ImgheVXer2iGut4xMJT3EKiPuw4xbHjh4VzVLepw2r+7QxZJVKVh+iCFM2arcni0aXobWZET4fsPiVnDfhbQkaosmz4swHklrMvmO+8MtFW6dHl52XiA3D//QNdG3o4pXlxUvvCDS4VffOaDmX3UoqMvf61dbOwMDGzt4KEtaJGOK/cb76NQnzLuJTDhtIG2yRA0plznuANygN3ghpSScAlRDhLZ/gbBaHyyKulrKcM3M1WCeS17FjWDdEtpg8aGItAcJ6AeXFBJGz1xKY7kXhlv7wig2OnmXJWa2BC1+9cdFzcxt26R6dvzY4e/buNRd/77rNryxpheGOWSl2wfRUR0fJ0dK3oHH9nYNO6x8e7+9Md3Zmem5cue3wDLcVQgmvXYn14pNYL8JiPm61YVjiigJDGLFVM3dZDfgqbLCLINcup3is7ahEUKEOxE3m41PsW656mfwoiCkkk5A4WDVoJWPw2+023eFypiGXNe1qR7/s2EWpjJzbNx8GxOAh2THSWGLlVuIFQ7wvD73CT7log5tjaBlr3ox96g8knW7jfSDWgKLRJunoH0raCUhxtkweSWlJlptETp2OugMXZfRZ3aF8JsyT4+fZ8A/9zjF85f0rpx9Y3aLQMF20ZgIfDCmUVF9fz7Jm0ypZI2+VQuWuSw4t9Ad7Nw34u3keel1zzLXYIGwMJIqu/umlLUvgF/wzjXVgGoLLxk+S38b0BUAj79RpnR7K4PSQLrcu4OKg2Yr8Af9oxRKoI00qjhSl2pjYSZAWklk5L8RRb8rxa/KJOyViHRNLGQgCmnWkGurt2VBUnHIw0z4guH+8QBXL4PS5TPvyUaPZZH3/yHr47eR5IakApgzNvfj0KTS4slct5c4Hxv+iUOO5NoEBPqVUeX3hSLQRgxnQrNZa3R5Ko1S5PeEIbQAazoTFwoobBrJeQy2cSzmR1ISeFAyFsrBROpF2cgcxJgiT44VFWDSJja+iaRLVYrrQXVZIQEIt7P8xTxkDPgb+WCzyITXCH8LbXzFRUP1Hn10nEnojE2jrbhC6NPAHUWxdlkLjWAzN6KiEMSClfIW4ado3mlq+iAihd/v56Qp8vq0haw7F6HI33bhq6elTcj/ic1X7aQFb+OakO2tlgFFNGq1Rf7bQQAb9VpKmp1ms7iRgSGtAYbEhkiJHKxwVKjTKAizWCXCitCl34wsG6SRzqT5ikE76MUg9I1G2purR2DJ+V9TvGYaougdb/MwLS/WSJz532N+NPWeI8Qf0TO+dwYTfzwh7GVuqawZ0j7i7Egz8EeMNGZmOi7M5/Dt4FePId/UQbcK9M7oVmDMhmzPre+DuUKfN4yDKZYWjZRA64HB3H2YbGXS6Gr2378n12OVfelt7ZFvdjfl0GPMpA2bxMWD0I1ssnFB6HDYlpRYvVXasIeIybmcsiaSIE7dPzXYmuFIUqyGYKwVpczpU1DmcTkw6qpFuNU1Ji4l99jN8j2+n2uX246j8mj4W0s94ruD1Ynq3MsEF8+FdOyewhOyD7oCHwrNy4lZzKhcKNQm/+6C7zWF3iIFkppz7jr+BabRjGi3Yl/qBWmtWGoxqpUJhVVs0KpMKIAVOT1QmLTJoR/CltCRKKpNNafFKApdjQ3jiqFBY61Mr4Kxfe5KheNSyq//0wwzxxR80Tp/m2NWN5jIXau35gSbhhTK6KrRoOiyWxT6IVG+nzcYIDMr9O+gGcwH3HCDGP+BVybjDGSYSmlqLDWJMNE+qz8bAGj5PgJjGQ+ltXDgcCiUwXNVTNKJ5yhmLaEJ+jQhZeQ3HmW0OswM5RsznDHqFTkfdflqp3HdUlB6OFdRkX1P0v1LF1npmPRfnM3+qdjRv3/zwCql2e8vUqu7WVeXJPuYiuOLRnVIpN1ZX4PWp5X6jVBOV+BGd6GfOFfuNUJPPpkEY5jRT+pNn3v8dmKvef3s+86H36ybu/z5UVu9PN0jjF8+6n3iCegnfn8T30/DPc+W7i16P1RaG3sm7CfAGyqGnqReBA1vRHD6h1XgI2oM0mlz4FG8GfmgT64sCb3tfoxqvaD7QaWNsDMXG2L+KYqkuPa6uj8AhfLKQLpab8lP2xgcncg0RjihqS9mri9dQCXk7lpxHU+EII/wurJ22c7AwJz/03FVtiwcIyh+etrLV5eXi05I+hrozqRF6XSG91Uq0X9ZbTq0Z2PrdS+0/1Kas0dAFx6ZHUmy2Z0mbvN74VUzfKP0icII0RltpxSk+FMqyTpfDZXa4EGuzjldsjj87QRTh1xiP3me8eo3Gi7yC5q81YCJrnkzsVyfzj1r6ASeOwYfVXe2yi+jEcoHyBj+ZVJLQtG6oFOflljy9v2lZpGPRYQXtSTHfW76mKxjJVKaF3V5bqj3j11PTO5rSa6Zv+9YepyGlI14I+PQWM9mhEm4WDkSDpa33TIvFTY0LNy+R/eDPMI1zsQw9oIV3GVg99NlO8UqDVmtGZoHXvg9I0omcY+Rfq6Z0tLaBURIW+0OxEDy5d7yGFuulA4nvtsy6e2hwc/PGl/dkt+ci+93+wrKmZNHf3kaCGX3trRt7L355s0432pbb9OnpDa2mcFW3/oh57wfNYDGfDfjNJoRUDDKZWpOneKeCHq8oVH/2Yigo8N73TYbxiukDizljy6DMmO0cClbj/uQq75fycILXk5WJYHXpo2z6Eh3yGlB5hQMsNRHvqUhvknl96DBSICwC4b/C2o7tA/NXDz99dXtjwB/2tzalrC6vw+rwcCZHSE1RpxIOjSSEsTbW41KaLVT7ZQOdO9bt/vYu483hkLd7y+W5YEqjdVp8qS2tflH3RLmsp0TdC4GdfMZ7mgERl8lyileYMJ4XeL3Ja8qakAozRENoAigg8Jr3xbYI4UdOnCo+aXP2i//yWsbQ7yQIG7KNERNCTCZrS0HqOngye3Ao++HrWDHpGgaVt05XG/pTNk7n73qy//wuz5ZXLtuyM7bqmauoxsZpF1SEr+/ZF3S2nYe+eGOse0n2ohc2zuorTG8LIWu0oTXf/jE0vcdj3yjSqCRyqI8+hrF+BKzjGy0Ws06rcYesZpvJFg5RlMmGQjqlkkWswCv/YoXjlbAVw0zrGG8+6fQhn+CMfDDR+5cEPrkD76gE3GpboY+K0bklmzeJcKReSenqxuX6yio6qYv4OZV/9KZUt8szbLX7UyxzreXaTb7PHIwHOScXT/mMu9XUnA7EuAO7d6rom/yh1v6O1YLurhH1ItozMJMwjp2QfchyTONTWI4J0Al2iOcxJVEi0UUHXYVTPK3LMGo11liBV7/vfXb8HT6gYvq9yB5BEYEHdtbus99vJ1XIjhKgEeHXGJpUbfZ1WWySPM9woq8fl8tPYs1+Qp2r24pxNiJ+IqX/E+lEncHKKyWwnl/ZcmH/wlXLn93btsTbvqTZpOc80a6hfYs/9smm1nk6fXd3z2re2RgIN6+a5vaaghZnJMiYaCV6rNyxfdPW7+y2G5NaYWzx7B2XLO/POWdO93d721ivORwoXbwH7ooGzv/6jHBSqzclK+m2cAr7oldRO7of23wUzOfTtMaMWDbujjpdEZfLF0HuUHC8Eor8GTijyIokNUDvu5nxCuv+QARmoG4fxlfP7mDka3vN9JA+Y7svzqCC8q4D0RUQmsZN0weXqRuUYjj53ly1zsH5ZrVoe394D+NLYLtfQ01vmTa7O5X9fcjmMKF2uDrNWzlr09IW4QvEs50Wq0lyt7L8f4DaiVX0M+KZNTgr9JohDWiG0CCAaKRBBG82GrHvMp6UQ6S0yEFa6PBVx38er6qwpMN5jLZKptrMa5MlVgW/Es4qgzE80fO07pjuu0vpZx55ZCwfcnIWPLMvNTmsRrJVKa8FwPZWnYsLuEEPH1QbXJAEpIUw4PmQyIDn43I47OMVx0lxS6ygdE/Y17nmhO1KntbkKqdqZorxvsRKcXpG69KbzouJdhNN+w1rFaTG6dV9b2hcnOjpBzfu68Am450+CJ/3BbWsUY1alWMH5Ngk6sMPadF21vJNJq+addhSXsIH8SuC/In4eCUB/2wiCDHi8gTjJwRbjtUxuvEKc9Jvw1T4a4pR9Q3Vwyan6oe4nfWYuEIWT7i6Uay6+dQqtiTEzDQp/omXal5HaIe2K22xfIefMdkZMO5s7D60xuTyB3TjW5UmE9v9gwcIROAAQb84dkrnTnrdei0D2xuLqXVvJIMGqh0aLRrh28SP1GaDgsOqMkErsQ7TagJB3ggpPVKbjDimwT+rleMVdVUxatMWpzp1w6Q0r4cIIhJihO9PTsCk4VT4Ge31T4OiTlLN2Cd1gMv4brKhFQGN1pAidUCnA7wjbLOH7HZPCDlSGkVOgRRjfO59WziCzHGMCcb4+PuhQMA/XgmcdLSPV3TA8YGUMtd05MzDe4pTLbElWzuyDU61v7MvRBVSFGXPVduPNlFGR6fn6pU2m29uo6rnR8NIUXt7npLEZvDy/JimY/tgz1xtYvaMTH56VNdIEKGIDpvEmnKGcVrbl+eEL8B7dAl97f2LISdrNZDTlPsHOvnWTBMX6U4m2/9bbVE5LUQ7qPINfRrzLYbRYIbyhRGECcau1dl0OqMNMVq7AyndSqQc493v2zjOMl7hTjKx8QpkJvSwnkPncFH+v8+GCeeFDtc5Jky0gnImdF+ZF9OUds+WXJcvMdUvwS+5gyxnFMnr7pF9l91iRbKP+inGGldjumwYx2d5m+6U3Z6LneKBCiM/gVe9b0mipGD56zl7AabaHzWRFtuJK/9EJAgbpELblOPz4U9JSs/1Du8ZnHV5H611etffsnDoijb4nwuNXr+P1elUSpqiE4nmOSXSkXVGM12r+FDTxv7WQLnUtaLQtRGGNmpsCa8r4vTYIslwqXnNUXn+h4lW9Cievw/kwSq+YDzFx+NFn9+mdmIK8P99GnVKXBozxjPvqxQSdDzp84xXfBwXQiGBm4RFU0VUr7v1iH2KUGrgPVorH0+B7Qg2KhVYIV9cFNe2bx8Q8fuT13SULCp/ghFeg7lAJNPbgrG7u9Cci5J/CCT1diPCQurnMYbf/q2LjKsTJpuZbIcfj4VKmz+OsbuzYc2dIj7GNIu4wg6SYC6fgMBhsDiwPNN+DN/1blardSO3BOCxIwQUAUMUpnWMqsMPx/5O8mUKngkcanZXD+0pwr1JNQUlfIImAwndrf5w60oMCiyRYiToVRKt8KJJTKAbK7jsagyH24m3oyEJBDDR/KzNlQkbW4vpcoMZfMyq1nAaCNxeDcshrdpqQySE4u5Ccox3vs+Zzabxivmk9gNxUXdNbGKSL7oYeausWJmRoqeckqBzWJUVte+zWU0BX9Su7PkRjk+uOBZXTDNtV1+mnTwV8xu8+VIEm9DLXq/Wahal09elE+c6iu0mhOcax3glaTGbAs7TOl0scJqn6WQcxGidM0CGLQYDxt6C4f14mA8jhISwrG7iPrSq2sllxqK8Sktq00hZldSkmTypVK5FTN3UJx1SWoJJuq25cZoxnx3o692/dPPVwWG6VCwWzfncwIxP3ta7ryOC/trSFgtZQ1F7ZEmhbSjje7C1Ieo3e0KO6FDryg1m3acxPSdQjniTngO8okYBM44XDqNDozAYjA6kMJp4DkdWDWfiEDfGm056SRJnImdkhlKcFUmbAr9fP4aBKFGFneL+OkLeXyeVxaTtdV9snz6vtGC5UtOxQldqjlifDj3MfabNoEz6O6Loyda8bW7F15yDqAP5Bhfct/ov3U1cJhHHc34fy+Ab1OPYJ8/kE3adjWH0JmSzJSAdRj4GAOx+wUkd9swqG4fT9Q/cKqQac9d8WW3bbn3boLrYxV9fbS+eUYrAhFSX/0AEs8soCk24YprG5i6ciE64YmeGelzYxXkcGskXwwGhG/tiMdRc1t0zqyK5YjNHYVq+hxrQbZgWDjTydgXNsjojtOl1rIKx6DhGxjWKD2o7GMSiulR+FLemiCc1ink4wnjFUt2aI8ECtNWvKyy7ed0tcxVGl08Hxjue87m11ON537rbX7wU/ieMRkxkm9D+PxvsBqJNxiKvowbKhOcRFGujToeKIl2MzqKyuJDRC8Nmo0ptcZGMKWAMOkwSSjlJSRGudhb8RGFUnJm1xVA9H16coLgvTVRn8XB9ueZfrG5Qqy2m+x9/+Ae3X+pWMGTywLQDfUpvghkrzmn3UuojzStm+zw6PPfVwsuffSG1gZlzdBD+siFCtQnTt+2+oDUrTN9/D3ZsNTr2Y19yNaYjDpbxGYtObQ8A0huPRr2k2mxM2r1AZwmQnpgiqozFouOV2Emjy+zxuMYrng9AZ21vd43XNZJEsCiWwcWyt1T6hlUAVrSKm3kkyBitlhOCUaw8UVEcRaI342VMTt3v7LMf9PeHgj438/stjjJndujeccQeXjbDGfB7mT+SPw8Gg4zOBNsaZ9xi31/Ocoq235rbokY9S7SXIrf131pImulpMn1RoknSlwiYx8eBOYIUClJtiNEkGfN63ApAMaSeosjxCnXS4wk4Aigw5gCYtNdle82eoUe1nhlWJhGLyEX7GpzH5NHE5MHI1U09sAR3zVRjj4/1avmwlnNqv+WPP3XgipntjamcrWIKzIUOoytfacRo5DutCSyo9ks/28ialERb/gLhj/cfKhctBjV92GW1t7VKNN2HZbYK02QDS/gUZ7ZYtHqbWqlyEFoLxwMl1COlxsZynFQU4E5qNYQGo11BTJ2q1YyJsob01y8ckisSxVaVG6aMVshbrhTSliu5ko0RP9F+YXSvLRz0Gxamxt70Q+N5M69zxsP+RQnC6SebroiqHY2h1xpgw7Y+Y6Lpa9Lff4VmkidWUq8AEjBPQkSQICs9T2yIKFAJ/uj6hScZ6hXhcznYJda/hZ0kP/4i9QqL4LfGVsp7NoTLqReAT0HjMdin8Bj78CCO6ijIpIClw8/3CA/oFbRwkofiTkKRT78nO4k3qs8FU56rgFFIvMEI5/dBDfVKWXixH7ZJtV3hZrITXCY9+ztjD1Sf/XX87B9Xnw2mPhs/Ohr+sV5onQZ1CrosfDBzTH72NZjmb+LvKUCINwECkZSChjSJCGq24ssKQgGyO44XpK1zR6WOiEkRDVJ4Un37lx5UC38qQzv1gvBU7o03KrBZnIOC5MEMabwAb6obpjayOEx1TIkj0milcw0GhUXU82CU/qs0lpEgEbVvmwKeNZTjeEuLuJUPSmOFmY/3f0EtvNcCTfRfhb81j472ivvboZ/cQyyRzqaK8U503llnQm0j9hEEAYhsEWSHh7fvEFeT4AhBLBGPdxKPccLz+RS5Z/yNf2wMhMeITAyBx/gT9T2QoI/hMTy8EZ23jYCdxKP4W7yK6a9+Nbld/CuhJvzNhPhN+pj4TVFW1xMriEtQTvzbo88QEPMBQemP8tb+jO906c/4Eitew/c+iQ4RFWoE6IDhGVoHdTRQZI+2tIDOo/hmM44t0Q6yRFSM8Vk75/Qk036/nqBG+jauWLmycUW8uXvjhrT8zAPEy4SFfAWPwz5N6yaGyU4ZxlI/DPnK1GEgeGjcin6J9dsGcBIj/T1lHmh1SLdar4Vam0KrdZgVtT/0nB0+UU3u8zkqkMEZvAOGigqcgaih/Bee1w9dv647brj+y9D1U/uMyzatnN+RGx78XZAf2npF96tEELYf+v96u/LgNq7zvm8P3MDi3l3c5+IiiCUOEgRBYgkeJimKFCWSlizzEE16XCmSKMmSlUSKD9Wy5VSW49gS7PpKoiBSnXTSuO5ITWrF8dHUE49bJzNN2k7iXB33D6aa2OlMHXPZt7sASVCUJ/kjnaEEYXep/a73ve977/2+71Dh1H8IrwhPPjB/pAUBK4+uUOgP6u+XXszrJDJISBytVFqtDl29sfP69wOpsL/c2bkLdUjOMwjU8vtPf0f45c/W3k+8JhPw1vLPhVefFgkAZbBPIkCSow0mN6/gPTAW7uR9DEI6MYPNwXAk7aVTUls52iEhG4VepQhEaewi97Z5A7qx3ri4vnxbgzcaLI5i3rz8nLm3GGZM23EVZWGK7SnwzgMGDuQnWJa1KScmlPZI9xC429pi8FBMYP6j9I+hjCrC29hf42UkizzCZ/U6NnlGaWQRh/EM73IEAq0OhwdxASPmou7T6cMYG4mwGPs8H4ngHsqDeZ7nqSvAwJsAR2bhU1n8PpzDuOdxTT08XmsivL6zKdW+equOzXWIAFTjj5akjWhL2+qS9Wrb0xsaC+P1JPtY/sRP9j31tbbZU8Popz7r7Zo+8OTc7Dv9uYrq4tCR8oHFcWbywZm+UF83t2ObB/3df6dScHI7eccWl95Vuavr0Px41iX2Ft75pck/WzhMRLun9pf7B9n5SUl/iwiCncP7EQ/SxfsdiNHpwkmb08GRjJdJMVCBDOOUjq9d7lU5b1DguibV0qLHTVtPv6JRx6emLB9/aL5zd9pnGtXRFmuyd3cGjdxvagL5ZMFabz4dLm8DB/JOD0WGWxdAU++btX1iqMfra3pUslnEIery/12PEpQ4LWOJ/zg9XvlT6hEme5ieWEBcSIF30wgp4YoZmkMooMUoSu4cfrlXySg/SYebdA+vj0GPxVnqtCx/ztLHs07T42L5lCKfBr+u9Q4PR6QhaAv3DqHnxd7hVGj+o70vSLr76cp13Cv1Dr+PL4tdw9P1tuF+f9b5R3YNx5U36uymLcNXYV6NGvuDe3p/50/T03tlBelYeQE9j143iTjN7Md3IMpvIaompJQTzx98uPJF9FfSvZ76PVNSvoe8idowP7Eg/d414cfiPVGl0r17URV2ULrXU7+HS/dqNX+/QTyDJJD7oZ8mkUDcoCedtItyJeKKuIJyYXGSTMaDYR/UhHjWP8T7XE7wtd6E8wIPEzyLVmvBfCRH8iRG8jrLAGmpaIF0HuPQakybbixg2VDr1wQyYq1f8Wz9am1eca0AFcfGzUvzOkaOX1zY3hO7A9j9xiAXMHmuua69HNy8Mu+ek7sThiv+CNm0Y/iBjYV5UUS7ch27hl1HMkgPjAqtLdW0OTtucBgAhtvOe4xd53ELtK3SEsyjjPCjhQvLiBlxixGtHYCWzCJSR6SK58UxsVqzuMgt/0uiHh0xjVyczo0XvNMv/uYxM0F09PiHt08mti7+z6N9B7ZG1fohpYoAJnfIrBXOjI6cms6aXGGrb7C7mXhcMbHDmx9umjk7164ds4bNrVnS3xrdvWcf3XprF93TIVz0x11WDe21qOFc/B4W6Lyt4Iow2mjXoF/yBV3QF4j1nUNIM08HqkGnw4GYKxpQRdEgcoEOmmlSA1VXKhnllZwl8ZSUCAUHUlmh+t5jQ9Xk2tICsnLcEEr5aEPqg+/VCybbQn6/WSyY/ICOkBCtUB2Y2tme+fZlhe77pYw+dfvIgZPLl2roVmSVxq9DGqMw5rR5gnsYoKlqzWTVgBkMej16ASGhKtIyYVAnyxIkYx0hcgWk1QLPWBDGbGh2HRGv1ghlJo4/Px8fDEALgg5R54p6HQbsvTVy6sROPzQZUyqvMAGrCqWz450ItnJB4PF7oL0UkW3ILNLOe8YqSLkSzO0yJIeepShITGXXrqDicSzowkjEuCZRqVe6mHkbJYS92OTcr4wo7bK3iUg8dIA6uLFmYG1yr5/aB6iZkuSRoIMyABCoL/aIF9GR+HAYPOp+SekrHHvp09vL7kSm+IuOT21vydx69NTny7sr+zv97cMJX5Qt9PmK3Z2f+TuhQufGO3N7J3LF/ouekqeVA//SMsBRnYXm/maqDbuuVJ+26ga3DD12+BaSKsD03JWfaO/ZP94VtViSW/KRnmKOtvLJxGBX1h48NDbw+NHB36fcCQ9pS23JBTmFIn4bznfvuTszurV77nB6cAKOuVGYK7+reAgJIjGkiaeV1YgzxmvJgVgMcUbIqFisDlShFUBlQ22XSlByCXP7klynQ1yzWIdFhpeItoxUFgfAdB/LoNu1SR+GCe87aKdXJ/yjluXsmNaTnz1351vdmNrEmDXC64QSf+0XWGdOmUwq23yJTtrtJnI5RZufMHO7Lrz3wvLhQMprJnLgHW4XJ3wXZiHPYp14XnFS6k1XhDmaKVXR2FpakEiFskXbKkGERUpvL8EfEdQu0VqHp9ukw1kGLLgujI20WexrtUXE1VL4GQdKmOUk90+XmMxI6wPZdmdh4LaisEPL+G16xU5C7fZrnw6liuNZqrd859HpOwa2tGgsqg7FSaW/tzPWnU9RquyB0hRrdhiVOdybyDDgMbpIhnxEbtmBeXMDsXZucnY00wRTM3G8vYclsZ8oziIBxMZrAFbxRoz6ii0mOnB5cAXXnaivI4LR1eZT35xV3J0e7Wxy6zvK/GRgLlE+URw4cXu2dP9rD5aOF4hvnSrcfvfRvaGJ0d7RN0zQkR0dv+v7z82SJnHvQ5RnGcqTQZrFt7srCB2NV3T6uhjhjLBOWjXQLyqCftNwlIgBlAi1giK7tE464La55w4WB8/98IxwDhQILcEUZra0hcwioN9NqAnscKNUvIP37Dz+3YcHdwGW3zm3N1Mca7ED2RdB+rDfQvqakQGeQxIgEa4kR30zvoM+zBes8O5t7lkYi4gpzSg9Qx+kCZrWI8mo0VbjAYpQrGMw9ebU8ptTRvhnA0OraFNpQSdYb2gure6sZwl9OT6PKkw+16XinNVpJVWTbZOoPXh797OB5pDHvNC1PLWRq9epqNskfKC3e8wfNQeEH5rDeXapztP7kKeEaL+hWMWvriCI2ednraaqWRpuEs1LRkn5Mg5WNEzleuj/Rg7Q05Emw0THJOW/PUioPHGd8Jn1Bou+GFtAleaA6+kSQWZDwu/ToafMHQ6fH463DWTTUbdR+C9I50+hXV6HdpkR6YwnK2E9nAe0TDhixSoMNM+ljOgSltIynXX3V2uMhEaCq3aKr5u0cHAtW3QlvcayBhyGE6VdrwjNxbDI7mL3/tEmT8euY0/sHD2Ric4QXeX8ZHfSpcfjE2PuTF9kQJFOw/+klfkSnbAw8ZHFvv4zn9s3krQarvZ3tu8+cvc+Wbb4N6BsS0iRD5EVkvNyo9wMd5AjOI7Os4W2thhbjbB01KGmKEVVGZWnMujdZCcn2spSAwoNa8Sqrpe82P9pPVYVU2Lv42pXUCeckmUfFX4barhQGx8ntA6/XU94gcHVcAH3NujkanVzFeUIf3OW/vy9DV9Xxwt6FfLvFkczbavaWXWdS/jTyFgDJ0rw4SdQuoGwDZTA9/4llPtfwfcOwZmEilUBcPaw2RaHu5qOOqN9ZYO2qmOliSRdKv2n+Le0+ytCORvgaxi5rnNzax1Y00gztkYzGoORlWNLe8JNacGihnSHUoF/Pqu10m6rVnhYbyeBVt2mIs2MxRmGgyKkF+6F3FF6YheG46g7oAH3aRwB+J0wMRTPDbncZjSXQ7V0zPNt4Q0H6zITrTlgNlJN1F9YXEbVV6AUvIE1KejcLkrZIAdxbE9DOXgQitcy9irFahRIRRUVnXlG1kC9XteNGvjXQ67mWIRa6F3eVAnYeVUAhpgrn6ADoiDZfopn8tEYmwhX2agOw1iVimKh7Yv0RGtakIu+GKFZlCBNcP6WjgyIi/YSUmQzK5GQlljjTexNrV1LF0Lvnm5WaghcRQzIVvSbBgZm00AN5mUubm0wM4LhdnPxhXbhZXALtydpT9iFb25uasIAuCKzKtzT8IRk96L93QV558TzL0Ff1R9lcMQaTcmGxyLS+IZMt8s6ENEGDbKXWd+Ub3TmywaHvg9yEtACi9YRsOmJh//2ms6qGdmEV8VJYTEwHAG9jlaLrJ1Ac5ZafhL8yN3pE57YnDf5HMLPsSQehf6WgjMDHL3his5ZQXQxRCw6Vo9WG+JSnFqHtevC0V8OHp9I0dmxw09M7fjsWJTJbj/8xLW2Ynq0GHfqWosto8WEU684Gxk+NMifPnlgO5ccW+zhHzyxf3vqd2Nbi7P3HL3TOzFamDp2bF89NnBCmQaRFOLhSaQSi2noUIVhdeqqpu5SauNYrPK8mc3UAgYsANMxaTuaDaLH8xkGV98wRYFHcscXyv1HLwwo9cp+76fvHRrBz2FHNpeYOrK1d+zwQABcAED43t4D2WxNhuiQJMMg0obQvK6loqGj1i/oIxVRikuppVJmfUy4AceI3UymsV1n5+2ZuDsXbh24vzy+P2jomuryfJJ8d3z9whGmkHVFOgb6p+cjmuzIfMfNJF2XtQ/KOoN0I3He7qxqQrkcEoqywaC5aol2VtIrohUvLUnTVWljdEuuoRHFDtliGLOpPixreYtCib7TfnyuK9w9waH+iN6mjzVrhQ8MtMqpj8Ryjk009Ktw33SBGRz1KkmV4qQ2Olxu2dHDGVRMvmUs06LIBfqCi9nEPTcZv/u9+a2p1owI1APIMRhb/DnUUwvi402qKOnBrUmEqCRjjLNijdRCX7lcJ6gjCvF6yCtDKpRwopBbPsunGHDMncy7B8dS/Tv6U5npB3f0faEcm9U+zA+jKBnIN/lLnKdt7qFtO58aaMZ9XDGo40vxYporjuY7Z/iAzfz3j+Q5JsJGHdam/C2p8nxPgLL8EwKAGupmC9SNH/HypN1oMhodSIVmNcqqSh4Fy6+LubAYBDU6EBktKIZoYpgcxIKHcbU3qhOO6JxByqA42upLBZ26+RRm4RYw0u9WsMv/2yA81GENpz3v/Vrv5fwmab8QhT5iL6SlFXHw+hDbUrHG2KA4xddn1yXZna/zbKsNS0sbrkuHJ+BchO1QqNxBHeiUfdugdXDh/uHOvSNJUtPSMAH1KxV3xYtNXh1x3tFuYf117ya8NHW0h3G2jbez08mfNUxLwlUf516kuKG0FJ9AJWXwRSl/c/MGLeKKWdmg3WKBeSa7GomZZRiUjPaSHDVWCyuBUu6+iUGvfFqb8qCogVCh/662GrUFHSjqvEGrvSCcfrmMKkgnpVGczKmaEyo/9WLr/gLYYwiFQ4acJteqCDhcM8uX0UetyYgLE9fggApLK8LS+Avz1gSbjMc1+irDBmgU07JYDGbIpVKJahdjFzj8IH2mSI0QKTh0SaPPDcSCXPADJpprRMOJHdtnFf7tpRZMRdIWLTiqTfpRJYqB9ovQMwJwVWUxats1oKBjoixLCV/F0uDS6eV30XNy9ptTcEmVm3qGmwtH0VHhUnRbtElr04IxUmSoVS0aS7ocXb4M+UCgrfZKfLC8JcH67UrICn1DIGiS9+1LGyNd6bBQTdSU6FIybevjLQw9i6t9cb1wUOcM0waCsiUpS5TVgCMarwslUBzNE2fUdrOedmhAWE06AlzoYxg7Fpm1qGlx5JmR0lYV/BZ2+jVm1Q9e1nl8Xp3FAh9AdZ58s/AqAoSr+C3IqIJCcET1N9LutLyfbBklhbfG3lBQ3cKhJPhKbf8bv2Xli/VnEelZTNw9/4dtM1dIBSWMh8C57v8DnQZSrgB4nK1YzY8cRxWv2XXi+GslcPg4oRJIxIHZ2cQHJ14jIWcjIh98sxKFW013zXRlu7taVdU7Hl+QkJDyD3DgT4g4ceSEkLggThz4f/i9V697enfHloXwyjOv6+PVq9/7+vUopX4ya9VM5X8P1UrkmbqpvhP5QN1R/xT5EOvvi3xD3Z/9VuR31N3ZtyK/q743+6vIN9WTgzOR31M/OPizyLfUzw5viXz78A+3H4t8R/3y6Eci31XvHzUi35v94/t3RT5Sj97/NSyZ3biFp5KtInmGmT+JfKB+qP4i8qH6lfqPyDfUz2cPRX5H/Rh3z/K76qezP4p8U13M/iXye+oXB78T+Zb6zcHfRb598/bhsch31Jf3/ibyXfXg6Ezke4ffHv1e5CNV3/83ENXA+CP1sfoE0nPlVKGC8iri/0oljJ1BCqrjT4MRB6lVC8w8VTX+NMadWqsKc5GfLL4tvi/wWWKl+k4//OjjT/RzVwQf/SrpMx86H0xyvl3op3Wtg1tXKepgow0XtsSeMxzWqCUrN3g0zTI4CJ/h+BpqtXqGAw1kMll95utSP0umdni4fo1TvshUo36dptHKUy2H6kvK31LN3r1fMi5RMNTqEdB5rD7FhA0RYOhHi8efXj1iOGCfetL+OsMcu4OkxK4rcXiD76DOMUa40EyF0f2OX/NzD9cPqwt8N3g2MN6xmxe7i7qojU7BlLYx4Vz7lU6Vnfh8HXzf0XDhm860zsbFPk+9LuDU3ughDTTrsW6LPZbdQLdcY1+LT83WknteYIROIimv3fAZ5zhbPfetT9vO6meNWbt2rU1b6hcueP0CoxsfzuN1hCt8EsZL6LLs0JJRoXRoOfg17kRnaLbyGHMFJ0heTRL55aqlia2s8enZV2uWaGbD/qK9HVvRYm0+xzB2ke+e05LseCVeysG5s/iCA3ELybLc8nrybHHNmo5Ry/4YvJF1fs44rHnE8JnDnqw/sXfzDJ1M+Nes30ps5tW5XDhglUcD+5E+a4mAC5a3vDaxPWTjXBBxmLN8hmc9r3g+ycn7tU+RGuwY8Jx6wXLEZ9wynjsbzvkpr8+o5QJoJK+CZJgRfNN4EuVVGvOvYRtrvmVG9gXfKk78TH7p5J55puGsIS05/glriqfluKqdZLibVI84RlLGYlhDEbfh0YLvaznnK8aMIiNJ+Zqi2OO8Ep92RDDfdCtWZBSXLJvJnR2js+QbJ56LjGXNeFj2RBwrT87UEhnkJLsHpL4aM2J//ev5HtNMpLt1k0je5c6QL3TqhfiPmqPm6M/RMZ/gtYuYAMuuI3U9pyLHaC8NYykY1mMDzTEe2OKe/Tm1fIdWbrKkJ00ixl6pQBmDVn3Ae75hLNKVOL96Qs+7c4ZG1udhRz/xyenkNLJjzXYY3r9hz+a77KuPVr28cvKGI7OSTpX1rAUXy1pyBDSSVdOqUXAXahknet6y/6lbXsbkC6m555PdZ1gduHLknHi7at6L5TmOas7AIQ86IT1u0uCz7UZ8McRKO+lruUYlztxm3EE4dVJD41jnPOty7ItdhRpwyh3JsY9zHRxqb8u9blqBDGfTkK+NRJIbO5TjDNGTrjrFYtL1KxP10tpWlza6dWtLvfJB+/Y4FoGGgzXl0E6T17X353rtfak3FWa74NqEPSbp2BjwwOhegReAL7HiCxu22l5gYexMMajpgkf7p+6PlZ87s/atqXkG65Mr8FAZF2rX2sjD4JRuBTFYmFODN1zYeqtjCr5dz2GIq62ufHCvfAsqNV2ejSIdZGe+gm062AY7WcO51RiHaSCvBoQngPUY2Jtok+8TkaAm2vqCrvWiAkmiOxeuw5l4aHxMGszDFdYsaahl1uSY0kUCCVbQSO03NhQmWl1UJpgigTBmE/tl2VsyEIduoQImLi0him0uQMYJwNLWtrEtODYYGOhMeexAdMior8gRExLXR3FiYToGmb1DftEeAIPK684DjjnbxcCE49Go0VOx8j2YL0yJNZF7IB5s2ReinM0C3e/rxMBYCSBY0H6Q9Dc9pjPmw4Y+kkOjLn3R801OeVuw6742QW8snbKLR/tSNm9cqsBMsWYNW2wiABpDYxQahbNtgfFts/S1WPIFIvecp8+2wdXwxJ4w76EcGNU+kg86vLY4ZvDQDv8zKi1TVERUsqahCfsS61KkmPPauMZyQJFNSCQXE2KQore1mxxAJrBfG4DkKKFcB68SSc1WIA2pziZk6Kk6wd+G/xbI56useiHc/UQy2jO7N8xsthiljrUS1gSiW6XUnZ6cbDabRTPQ7gV4+wlO9+tgump7UqQV8iW+zoadtuHsqVbeShr3vwLkctpxad41qJYvotXX3EJzS9iOLT635dz0h9VDiSyEalOZnXMxc9yaa9YwV5fJrpO9hWix8myEkFFZbrhtDeR7yXbsaFSmYu1oV96RiUW4NrIa7zBXb/Nilgl5JgiZkMSx9RSjlrDnBrncZ8pccDPdh9lGbpppZ41zSnmTv4497cmk5QHWf6gyYV6ODeq69mzD/4rtTvvutSkILcotb0rsrt5gSoov2/VkEgN0k3yXJPQ/v4pmurAVUrThm3t+gXtT7Bl1+WUtjN7xk9eE/ELQyWtBya9lTohN1lMxOe7eGKP5V5lWPLPTPmTI7pXCs71LRlp+pdm9YKOedbXjwtumhf7a96iYW+oMqPloETRMlQst3iQ716WLXW22c2nPKH54yafizZ0HNa9xidr8cpt7GbpdS7owgaYSBmFFJ8yv/3KAho/GgYZDPw5h75z2DAegPqKDF9XEsg0ORY+te5T/nfW+RQt64D5EA19S4R2XQ8ObrOXlzGHQrhIqdG6KwwG5ZYuuJ4zAA4dTEniCDwb9Y4uWtWlrb8rL6BmhP4Gu45k7gDB04AylpWvSmsrW3WVEF/ppu5Xl5BBmFL5yS5f4d7P/V0fY1e8TDscV5jJLXHCydmCob9UnuNSflHZl0MYWJnYv1X8BiowOHAAAeJxt3GXQHAeWpu1K5jQzM9uqc5LKTJKZmVFmW7bMzMzMzMzMzMzMzMz21zvbdZ/d2G9+jDLkVp63p+t+ShFzRffcXu/fH08/499Te2f1/n/+p8z+87+cntvzen4v6KW9rJf3xumN2xuvN35vwt7Eval6U/dm7M3Um7k3S2/W3my92Xtz9Obszd2bpzei1+9JT3tVr+41vbbX9Qa9eXvz9xbtLd4b2RvVW6K3ZG+p3tK9ZXrL9pbrLd9bobdib6Xeyr1Veqv2Vuut3lujt2Zvrd7avXV66/bWc1zH623VG9Pbobd9b6zjO4ET9u5yIid2Eid1Mid3Cqd0xnHGdcZzxncmcCZ0JnImdiZxJnUmcyZ3pnCmdKZypnamcaZ1pnOmd2ZwZnRmcmZ2ZnFmdWZzZnfmcOZ05nLmduZxRjh9Rxx1Kqd2Gqd1OmfgzOvM58zvLOAs6CzkLOws4izqLOYs7ox0RjlLOEs6SzlLO8s4yzrLOcs7KzgrOis5KzurOKs6qzmrO2s4azprOWs76zjrOus56zsbOBs6GzkbO5s4mzqjnc2czZ0tnC2drZytnW2cbZ3tnDHO9s4OzlhnR2cnZ2dnF2dXZzdnd2cPZ09nL2dvZx9nX2c/Z3/nAOdA5yDnYOcQ51DnMOdw5wjnSOco52jnGOdY5zjneOcE50TnJOdk5xTnVOc053TnDOdM5yznbOcc51znPOd85wLnQuci52LnEudS5zLncucK50rnKudq5xrnWuc653rnBudG5ybnZucW51bnNud25w7nTucu527nHude5z7nfucB50HnIedh5xHnUecx53HnCedJ5ynnaecZ51nnOed55wXnRecl52XnFedV5zXndecN503nLedt5x3nXec9533nA+dD5yPnY+cT51PnM+dz5wvnS+cr52vnG+db5zvne+cH50fnJ+dn5xfnV+c353fnD+dP5y/nb+cf51+35zqu63qu7wZu6EZu7CZu6mZu7hZu6Y7jjuuO547vTuBO6E7kTuxO4k7qTuZO7k7hTulO5U7tTuNO607nTu/O4M7ozuTO7M7izurO5s7uzuHO6c7lzu3O445w+6646lZu7TZu63buwJ3Xnc+d313AXdBdyF3YXcRd1F3MXdwd6Y5yl3CXdJdyl3aXcZd1l3OXd1dwV3RXcld2V3FXdVdzV3fXcNd013LXdtdx13XXc9d3N3A3dDdyN3Y3cTd1R7ubuZu7W7hbulu5W7vbuNu627lj3O3dHdyx7o7uTu7O7i7uru5u7u7uHu6e7l7u3u4+7r7ufu7+7gHuge5B7sHuIe6h7mHu4e4R7pHuUe7R7jHuse5x7vHuCe6J7knuye4p7qnuae7p7hnume5Z7tnuOe657nnu+e4F7oXuRe7F7iXupe5l7uXuFe6V7lXu1e417rXude717g3uje5N7s3uLe6t7m3u7e4d7p3uXe7d7j3uve597v3uA+6D7kPuw+4j7qPuY+7j7hPuk+5T7tPuM+6z7nPu8+4L7ovuS+7L7ivuq+5r7uvuG+6b7lvu2+477rvue+777gfuh+5H7sfuJ+6n7mfu5+4X7pfuV+7X7jfut+537vfuD+6P7k/uz+4v7q/ub+7v7h/un+5f7t/uP+6/Xs9zPNfzPN8LvNCLvNhLvNTLvNwrvNIbxxvXG88b35vAm9CbyJvYm8Sb1JvMm9ybwpvSm8qb2pvGm9abzpvem8Gb0ZvJm9mbxZvVm82b3ZvDm9Oby5vbm8cb4fU98dSrvNprvNbrvIE3rzefN7+3gLegt5C3sLeIt6i3mLe4N9Ib5S3hLekt5S3tLeMt6y3nLe+t4K3oreSt7K3ireqt5q3ureGt6a3lre2t463rreet723gbeht5G3sbeJt6o32NvM297bwtvS28rb2tvG29bbzxnjbezt4Y70dvZ28nb1dvF293bzdvT28Pb29vL29fbx9vf28/b0DvAO9g7yDvUO8Q73DvMO9I7wjvaO8o71jvGO947zjvRO8E72TvJO9U7xTvdO8070zvDO9s7yzvXO8c73zvPO9C7wLvYu8i71LvEu9y7zLvSu8K72rvKu9a7xrveu8670bvBu9m7ybvVu8W73bvNu9O7w7vbu8u717vHu9+7z7vQe8B72HvIe9R7xHvce8x70nvCe9p7ynvWe8Z73nvOe9F7wXvZe8l71XvFe917zXvTe8N723vLe9d7x3vfe8970PvA+9j7yPvU+8T73PvM+9L7wvva+8r71vvG+977zvvR+8H72fvJ+9X7xfvd+8370/vD+9v7y/vX+8f/2e7/iu7/m+H/ihH/mxn/ipn/m5X/ilP44/rj+eP74/gT+hP5E/sT+JP6k/mT+5P4U/pT+VP7U/jT+tP50/vT+DP6M/kz+zP4s/qz+bP7s/hz+nP5c/tz+PP8Lv++KrX/m13/it3/kDf15/Pn9+fwF/QX8hf2F/EX9RfzF/cX+kP8pfwl/SX8pf2l/GX9Zfzl/eX8Ff0V/JX9lfxV/VX81f3V/DX9Nfy1/bX8df11/PX9/fwN/Q38jf2N/E39Qf7W/mb+5v4W/pb+Vv7W/jb+tv54/xt/d38Mf6O/o7+Tv7u/i7+rv5u/t7+Hv6e/l7+/v4+/r7+fv7B/gH+gf5B/uH+If6h/mH+0f4R/pH+Uf7x/jH+sf5x/sn+Cf6J/kn+6f4p/qn+af7Z/hn+mf5Z/vn+Of65/nn+xf4F/oX+Rf7l/iX+pf5l/tX+Ff6V/lX+9f41/rX+df7N/g3+jf5N/u3+Lf6t/m3+3f4d/p3+Xf79/j3+vf59/sP+A/6D/kP+4/4j/qP+Y/7T/hP+k/5T/vP+M/6z/nP+y/4L/ov+S/7r/iv+q/5r/tv+G/6b/lv++/47/rv+e/7H/gf+h/5H/uf+J/6n/mf+1/4X/pf+V/73/jf+t/53/s/+D/6P/k/+7/4v/q/+b/7f/h/+n/5f/v/+P8GvcAJ3MAL/CAIwiAK4iAJ0iAL8qAIymCcYNxgvGD8YIJgwmCiYOJgkmDSYLJg8mCKYMpgqmDqYJpg2mC6YPpghmDGYKZg5mCWYNZgtmD2YI5gzmCuYO5gnmBE0A8k0KAK6qAJ2qALBsG8wXzB/MECwYLBQsHCwSLBosFiweLByGBUsESwZLBUsHSwTLBssFywfLBCsGKwUrBysEqwarBasHqwRrBmsFawdrBOsG6wXrB+sEGwYbBRsHGwSbBpMDrYLNg82CLYMtgq2DrYJtg22C4YE2wf7BCMDXYMdgp2DnYJdg12C3YP9gj2DPYK9g72CfYN9gv2Dw4IDgwOCg4ODgkODQ4LDg+OCI4MjgqODo4Jjg2OC44PTghODE4KTg5OCU4NTgtOD84IzgzOCs4OzgnODc4Lzg8uCC4MLgouDi4JLg0uCy4PrgiuDK4Krg6uCa4NrguuD24IbgxuCm4ObgluDW4Lbg/uCO4M7gruDu4J7g3uC+4PHggeDB4KHg4eCR4NHgseD54IngyeCp4OngmeDZ4Lng9eCF4MXgpeDl4JXg1eC14P3gjeDN4K3g7eCd4N3gveDz4IPgw+Cj4OPgk+DT4LPg++CL4Mvgq+Dr4Jvg2+C74Pfgh+DH4Kfg5+CX4Nfgt+D/4I/gz+Cv4O/gn+DXuhE7qhF/phEIZhFMZhEqZhFuZhEZbhOOG44Xjh+OEE4YThROHE4SThpOFk4eThFOGU4VTh1OE04bThdOH04QzhjOFM4czhLOGs4Wzh7OEc4ZzhXOHc4TzhiLAfSqhhFdZhE7ZhFw7CecP5wvnDBcIFw4XChcNFwkXDxcLFw5HhqHCJcMlwqXDpcJlw2XC5cPlwhXDFcKVw5XCVcNVwtXD1cI1wzXCtcO1wnXDdcL1w/XCDcMNwo3DjcJNw03B0uFm4ebhFuGW4Vbh1uE24bbhdOCbcPtwhHBvuGO4U7hzuEu4a7hbuHu4R7hnuFe4d7hPuG+4X7h8eEB4YHhQeHB4SHhoeFh4eHhEeGR4VHh0eEx4bHhceH54QnhieFJ4cnhKeGp4Wnh6eEZ4ZnhWeHZ4TnhueF54fXhBeGF4UXhxeEl4aXhZeHl4RXhleFV4dXhNeG14XXh/eEN4Y3hTeHN4S3hreFt4e3hHeGd4V3h3eE94b3hfeHz4QPhg+FD4cPhI+Gj4WPh4+ET4ZPhU+HT4TPhs+Fz4fvhC+GL4Uvhy+Er4avha+Hr4Rvhm+Fb4dvhO+G74Xvh9+EH4YfhR+HH4Sfhp+Fn4efhF+GX4Vfh1+E34bfhd+H/4Q/hj+FP4c/hL+Gv4W/h7+Ef4Z/hX+Hf4T/hv1IidyIy/yoyAKoyiKoyRKoyzKoyIqo3GicaPxovGjCaIJo4miiaNJokmjyaLJoymiKaOpoqmjaaJpo+mi6aMZohmjmaKZo1miWaPZotmjOaI5o7miuaN5ohFRP5JIoyqqoyZqoy4aRPNG80XzRwtEC0YLRQtHi0SLRotFi0cjo1HREtGS0VLR0tEy0bLRctHy0QrRitFK0crRKtGq0WrR6tEa0ZrRWtHa0TrRutF60frRBtGG0UbRxtEm0abR6GizaPNoi2jLaKto62ibaNtou2hMtH20QzQ22jHaKdo52iXaNdot2j3aI9oz2ivaO9on2jfaL9o/OiA6MDooOjg6JDo0Oiw6PDoiOjI6Kjo6OiY6NjouOj46IToxOik6OTolOjU6LTo9OiM6MzorOjs6Jzo3Oi86P7ogujC6KLo4uiS6NLosujy6Iroyuiq6Oromuja6Lro+uiG6Mbopujm6Jbo1ui26PbojujO6K7o7uie6N7ovuj96IHoweih6OHokejR6LHo8eiJ6Mnoqejp6Jno2ei56PnohejF6KXo5eiV6NXotej16I3ozeit6O3onejd6L3o/+iD6MPoo+jj6JPo0+iz6PPoi+jL6Kvo6+ib6Nvou+j76Ifox+in6Ofol+jX6Lfo9+iP6M/or+jv6J/o37sVO7MZe7MdBHMZRHMdJnMZZnMdFXMbjxOPG48XjxxPEE8YTxRPHk8STxpPFk8dTxFPGU8VTx9PE08bTxdPHM8QzxjPFM8ezxLPGs8Wzx3PEc8ZzxXPH88Qj4n4sscZVXMdN3MZdPIjnjeeL548XiBeMF4oXjheJF40XixePR8aj4iXiJeOl4qXjZeJl4+Xi5eMV4hXjleKV41XiVePV4tXjNeI147XiteN14nXj9eL14w3iDeON4o3jTeJN49HxZvHm8RbxlvFW8dbxNvG28XbxmHj7eId4bLxjvFO8c7xLvGu8W7x7vEe8Z7xXvHe8T7xvvF+8f3xAfGB8UHxwfEh8aHxYfHh8RHxkfFR8dHxMfGx8XHx8fEJ8YnxSfHJ8SnxqfFp8enxGfGZ8Vnx2fE58bnxefH58QXxhfFF8cXxJfGl8WXx5fEV8ZXxVfHV8TXxtfF18fXxDfGN8U3xzfEt8a3xbfHt8R3xnfFd8d3xPfG98X3x//ED8YPxQ/HD8SPxo/Fj8ePxE/GT8VPx0/Ez8bPxc/Hz8Qvxi/FL8cvxK/Gr8Wvx6/Eb8ZvxW/Hb8Tvxu/F78fvxB/GH8Ufxx/En8afxZ/Hn8Rfxl/FX8dfxN/G38Xfx9/EP8Y/xT/HP8S/xr/Fv8e/xH/Gf8V/x3/E/8b9JLnMRNvMRPgiRMoiROkiRNsiRPiqRMxknGTcZLxk8mSCZMJkomTiZJJk0mSyZPpkimTKZKpk6mSaZNpkumT2ZIZkxmSmZOZklmTWZLZk/mSOZM5krmTuZJRiT9RBJNqqROmqRNumSQzJvMl8yfLJAsmCyULJwskiyaLJYsnoxMRiVLJEsmSyVLJ8skyybLJcsnKyQrJislKyerJKsmqyWrJ2skayZrJWsn6yTrJusl6ycbJBsmGyUbJ5skmyajk82SzZMtki2TrZKtk22SbZPtkjHJ9skOydhkx2SnZOdkl2TXZLdk92SPZM9kr2TvZJ9k32S/ZP/kgOTA5KDk4OSQ5NDksOTw5IjkyOSo5OjkmOTY5Ljk+OSE5MTkpOTk5JTk1OS05PTkjOTM5Kzk7OSc5NzkvOT85ILkwuSi5OLkkuTS5LLk8uSK5MrkquTq5Jrk2uS65PrkhuTG5Kbk5uSW5NbktuT25I7kzuSu5O7knuTe5L7k/uSB5MHkoeTh5JHk0eSx5PHkieTJ5Knk6eSZ5NnkueT55IXkxeSl5OXkleTV5LXk9eSN5M3kreTt5J3k3eS95P3kg+TD5KPk4+ST5NPks+Tz5Ivky+Sr5Ovkm+Tb5Lvk++SH5Mfkp+Tn5Jfk1+S35Pfkj+TP5K/k7+Sf5N+0lzqpm3qpnwZpmEZpnCZpmmZpnhZpmY6TjpuOl46fTpBOmE6UTpxOkk6aTpZOnk6RTplOlU6dTpNOm06XTp/OkM6YzpTOnM6SzprOls6ezpHOmc6Vzp3Ok45I+6mkmlZpnTZpm3bpIJ03nS+dP10gXTBdKF04XSRdNF0sXTwdmY5Kl0iXTJdKl06XSZdNl0uXT1dIV0xXSldOV0lXTVdLV0/XSNdM10rXTtdJ103XS9dPN0g3TDdKN043STdNR6ebpZunW6RbplulW6fbpNum26Vj0u3THdKx6Y7pTunO6S7prulu6e7pHume6V7p3uk+6b7pfun+6QHpgelB6cHpIemh6WHp4ekR6ZHpUenR6THpselx6fHpCemJ6Unpyekp6anpaenp6RnpmelZ6dnpOem56Xnp+ekF6YXpRenF6SXppell6eXpFemV6VXp1ek16bXpden16Q3pjelN6c3pLemt6W3p7ekd6Z3pXend6T3pvel96f3pA+mD6UPpw+kj6aPpY+nj6RPpk+lT6dPpM+mz6XPp8+kL6YvpS+nL6Svpq+lr6evpG+mb6Vvp2+k76bvpe+n76Qfph+lH6cfpJ+mn6Wfp5+kX6ZfpV+nX6Tfpt+l36ffpD+mP6U/pz+kv6a/pb+nv6R/pn+lf6d/pP+m/WS9zMjfzMj8LsjCLsjhLsjTLsjwrsjIbJxs3Gy8bP5sgmzCbKJs4mySbNJssmzybIpsymyqbOpsmmzabLps+myGbMZspmzmbJZs1my2bPZsjmzObK5s7mycbkfUzyTSrsjprsjbrskE2bzZfNn+2QLZgtlC2cLZItmi2WLZ4NjIblS2RLZktlS2dLZMtmy2XLZ+tkK2YrZStnK2SrZqtlq2erZGtma2VrZ2tk62brZetn22QbZhtlG2cbZJtmo3ONss2z7bItsy2yrbOtsm2zbbLxmTbZztkY7Mds52ynbNdsl2z3bLdsz2yPbO9sr2zfbJ9s/2y/bMDsgOzg7KDs0OyQ7PDssOzI7Ijs6Oyo7NjsmOz47LjsxOyE7OTspOzU7JTs9Oy07MzsjOzs7Kzs3Oyc7PzsvOzC7ILs4uyi7NLskuzy7LLsyuyK7Orsquza7Jrs+uy67Mbshuzm7Kbs1uyW7PbstuzO7I7s7uyu7N7snuz+7L7sweyB7OHsoezR7JHs8eyx7Mnsiezp7Kns2eyZ7PnsuezF7IXs5eyl7NXslez17LXszeyN7O3srezd7J3s/ey97MPsg+zj7KPs0+yT7PPss+zL7Ivs6+yr7Nvsm+z77Lvsx+yH7Ofsp+zX7Jfs9+y37M/sj+zv7K/s3+yf/Ne7uRu7uV+HuRhHuVxnuRpnuV5XuRlPk4+bj5ePn4+QT5hPlE+cT5JPmk+WT55PkU+ZT5VPnU+TT5tPl0+fT5DPmM+Uz5zPks+az5bPns+Rz5nPlc+dz5PPiLv55JrXuV13uRt3uWDfN58vnz+fIF8wXyhfOF8kXzRfLF88XxkPipfIl8yXypfOl8mXzZfLl8+XyFfMV8pXzlfJV81Xy1fPV8jXzNfK187XydfN18vXz/fIN8w3yjfON8k3zQfnW+Wb55vkW+Zb5VvnW+Tb5tvl4/Jt893yMfmO+Y75Tvnu+S75rvlu+d75Hvme+V75/vk++b75fvnB+QH5gflB+eH5Ifmh+WH50fkR+ZH5Ufnx+TH5sflx+cn5CfmJ+Un56fkp+an5afnZ+Rn5mflZ+fn5Ofm5+Xn5xfkF+YX5Rfnl+SX5pfll+dX5FfmV+VX59fk1+bX5dfnN+Q35jflN+e35Lfmt+W353fkd+Z35Xfn9+T35vfl9+cP5A/mD+UP54/kj+aP5Y/nT+RP5k/lT+fP5M/mz+XP5y/kL+Yv5S/nr+Sv5q/lr+dv5G/mb+Vv5+/k7+bv5e/nH+Qf5h/lH+ef5J/mn+Wf51/kX+Zf5V/n3+Tf5t/l3+c/5D/mP+U/57/kv+a/5b/nf+R/5n/lf+f/5P8WvcIp3MIr/CIowiIq4iIp0iIr8qIoymKcYtxivGL8YoJiwmKiYuJikmLSYrJi8mKKYspiqmLqYppi2mK6YvpihmLGYqZi5mKWYtZitmL2Yo5izmKuYu5inmJE0S+k0KIq6qIp2qIrBsW8xXzF/MUCxYLFQsXCxSLFosVixeLFyGJUsUSxZLFUsXSxTLFssVyxfLFCsWKxUrFysUqxarFasXqxRrFmsVaxdrFOsW6xXrF+sUGxYbFRsXGxSbFpMbrYrNi82KLYstiq2LrYpti22K4YU2xf7FCMLXYsdip2LnYpdi12K3Yv9ij2LPYq9i72KfYt9iv2Lw4oDiwOKg4uDikOLQ4rDi+OKI4sjiqOLo4pji2OK44vTihOLE4qTi5OKU4tTitOL84ozizOKs4uzinOLc4rzi8uKC4sLiouLi4pLi0uKy4vriiuLK4qri6uKa4triuuL24obixuKm4ubiluLW4rbi/uKO4s7iruLu4p7i3uK+4vHigeLB4qHi4eKR4tHiseL54oniyeKp4unimeLZ4rni9eKF4sXipeLl4pXi1eK14v3ijeLN4q3i7eKd4t3iveLz4oPiw+Kj4uPik+LT4rPi++KL4sviq+Lr4pvi2+K74vfih+LH4qfi5+KX4tfit+L/4o/iz+Kv4u/in+LXulU7qlV/plUIZlVMZlUqZlVuZlUZblOOW45Xjl+OUE5YTlROXE5STlpOVk5eTlFOWU5VTl1OU05bTldOX05QzljOVM5czlLOWs5Wzl7OUc5ZzlXOXc5TzliLJfSqllVdZlU7ZlVw7Kecv5yvnLBcoFy4XKhctFykXLxcrFy5HlqHKJcslyqXLpcply2XK5cvlyhXLFcqVy5XKVctVytXL1co1yzXKtcu1ynXLdcr1y/XKDcsNyo3LjcpNy03J0uVm5eblFuWW5Vbl1uU25bbldOabcvtyhHFvuWO5U7lzuUu5a7lbuXu5R7lnuVe5d7lPuW+5X7l8eUB5YHlQeXB5SHloeVh5eHlEeWR5VHl0eUx5bHlceX55QnlieVJ5cnlKeWp5Wnl6eUZ5ZnlWeXZ5TnlueV55fXlBeWF5UXlxeUl5aXlZeXl5RXlleVV5dXlNeW15XXl/eUN5Y3lTeXN5S3lreVt5e3lHeWd5V3l3eU95b3lfeXz5QPhjtvN2WI0Ysqv/9dfA/v4q2/+vX/qiRo/73r6MW/1+/yoh2+OvI//1r1//vr/rfX//7z7uR8fIbbTt6udFzjxg+9IcPkgx/R4dP0vI0GD7pCJ76PPFnlT+rFU81Tw1PvFk7nrhRcaPiRsWNihsVNypuVNyouFFxo+JGzY2aGzU3am7U3Ki5UXOj5kbNjZobDTcabjTcaLjRcKPhRsONhhsNNxputNxoudFyo+VGy42WGy03Wm603Gi50XGj40bHjY4bHTc6bnTc6LjRcaPjxoAbA24MuDHgxoAbA24MuDHgxoAbg0E6/GSPGGGPfXsUe1R7rOyxtsfGHlt77OzRrvXtWt+u9e1a36717VrfrvXtWt+u9e1a366JXRO7JnZN7JrYNbFrYtfEroldE7umdq22f0Ft/4LG/gWN/TiN/TiN/TiN/TiN/TiN/TiN/TiNXWvsWmvXWrvW2rXWTrR2orU3dPaGzt7Q2Rs6+3k7e1lnL+vs5+3s5+3s5+3s2sCuDezawK4N7NrArg3s2sCuDezawK7Zx17sYy/2sRf72It97MU+9mIfe7GPvdjHXuxjL/axF/vYi33sxT72Yh97sY+92Mde7GMv9rEX+9iLfezFPvZiH3uxj73Yx17sYy/2sRf72It97MU+9mIfe7GPvahdU7umdk3tmto1tWtq19SuqV2r7Fpl1yq7Vtm1yq5Vdq2ya5Vdq+xaZddqu1bbtdqu1Xattmu1XavtWm3XbB/E9kFsH8T2QWwfxPZBbB/E9kFsH8T2QWwfxPZBbB/E9kFsH6S1azYVYlMhrV1r7Vpr12xLxLZEbEvEtkRsS8S2RGxLxLZEbEvEtkRsS8S2RGxLxLZEbEvEtkRsS8S2RGxLxLZEbEvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1L1LZEbUvUtkRtS9S2RG1LKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksq2pLItqWxLKtuSyraksi2pbEsq25LKtqSyLalsSyrbksr2obJRqGwJKluCypagsiWobAkqW4LKlqCyJahsCSpbgsqWoLYlqG0JaluC2pagtiWobQlqW4LalqC2JahtCWpbgtqWoLb8a8u/tvxry7+2/GvLv7b8a8u/tvxry7+20GsLvbbQawu9ttBrC7220GsLvbbQawu9ttBrC7220GsLvbbQawu9ttBrC7220GsLvbbQawu9ttBrC7220GsLvbbQawu9ttBrC7220GsLvbbQawu9ttBrC7220GsLvbbQawu9ttBrC7220GsLvbbQawu9ttBrC7220GsLvbbQawu9ttBrC7220GsLvba/NNT2l4ba/tJQ218aahuF2v7SUNs+1PaXhtqmorapqG0qapuK2qaitqmobSpqm4rapqK2qahtKhqbisamorGpaGwqGpuKxqaisalobCoam4rGpqKxqWhsKhr7S0Njq9HYajS2Go2tRmOr0dhqNLYaja1GY6vR2Go09peGxv7S0NiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1JY1vS2JY0tiWNbUljW9LYljS2JY1tSWNb0tiWNLYljW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlrW9LalrS2Ja1tSWtb0tqWtLYlrW1Ja1vS2pa0tiWtbUlnW9LZlnS2JZ1tSWdb0tmWdLYlnW1JZ1vS2ZZ0tiWdbUlnW9LZlnS2JZ1tSWdb0tmWdLYlnW1JZ1vS2ZZ0tiWdbUlnU9HZVHQ2FZ1NRWdT0dlUdDYVnU1FZ1PR2VR0NhWdTUVnU9HZVHQ2FZ1NRWdT0dlUdDYVnU1FZ1PR2VR0NhWdTUVnU9HZVHQ2FZ1NRWdT0dlUdDYVnU1FZ1PR2VR0NhWdTUVnU9HZVHQ2FZ1NRWdT0dlUdDYVnU1FZ1PR2VR0NhWdTUVnU9HZVHQ2FZ1NRWdT0dlUdDYVnU1FZ1PR2VR0NhWdTUXXdfHm2+y+/RbdYMTwoT98kOGDDh+q4UM9fGiGD/99z2DEiOFDf/ggwwcdPlTDh3r40Awf2uHD8IX94Xv6wz/eH/6p/vBP9Yd/qs+fGvz3QYY/jwzfI8OfR4YvlCYes93ouTfdbsy2w9/p0p22GDv6//o9Hb5Jh2/S4Zt0+CYd/jvT4c+owx9Nhz+aDn+0avjCavjCavjCavjCavjCavjCavhvuhq+uRq+uRq+uR6+uR6+uR6+uR6+uR6+uR6+uR6+uR6+uR6+uR6+uRm+uRm+uRm+uRm+uRm+uRm+uRm+uRm+uRm+uRm+uR3xP/8hbLfztmOHvyP//Q/h//y94bvb4bvb4bvb4bvb4bvb4bu74U/dDX/qbvhTd8Ofuhu+uRu+uRu+uRu+eVjLoBu+eZjNYJjNYJjNYJjNYJjNYJjNYJjNYDB8M/0MBsn/PPRHjBjBU58n4Ul5qniqeWp4annqeOJGnxt9bvS50edGnxt9bvS50edGnxt9bgg3hBvCDeGGcEO4IdwQbgg3hBvKDeWGckO5odxQbig3lBvKDeVGxY2KGxU3Km5U3Ki4UXGj4kbFjYobNTdqbtTcqLlRc6PmRs2Nmhs1N2puNNxouNFwo+FGw42GGw03Gm403Gi40XKj5UbLjZYbLTdabrTcaLnRcqPlRseNjhsdNzpudNzouNFxo+NGx42OGwNuDLgx4MaAGwNuDLgx4MaAGwNu0Hmfzvt03qfzPp336bxP530679N5n877dN6n8z6d9+m8T+d9Ou/TeZ/O+3Tep/M+nffpvE/nfTrv03mfzvt03qfzPp336bxP530679N5n877dN6n8z6d9+m8T+d9Ou/TeZ/O+3Tep/M+nffpvE/nfTrv03m/6sKN5t5mzCbbhJv9zy/D36/74eb/92/wavLuk3efvPvk3SfvPnn/L164yNw77rz96LFbjhmbLmqPi9nj4vY40h5H2eMS9rikPS7F4/DYf/7mu4z982XtcTl7XN4eV7DHFe1xJXtc2R5XscdV7XE1e1zdHtf4f36w//zFd63/9zf5PyHV96m+T/V9qu9TfZ/q+1Tfp/o+1fepvk/1farvU71QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL1QvVC9UL3w7S58uwvf7sK3u/DtLuQv5C/kL+Qv5C/kL+QvfLsL3+7Ct7vw7S58uwvf7sK3u/DtLny7C9/uwre78O0ufLsL3+7Ct7vw7S58uwvf7sK3u/DtLny7C9/uwre78O0ufLsL3+5C50LnQudC50LnQudC50LnQudC50LnQudC50LnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSucVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5RecVnVd0XtF5Rec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5Tec1ndd0XtN5TecNnTd03tB5Q+cNnTd03lB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3Q90NdTfU3VB3S90tdbfU3VJ3S90tdbd8i7d03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ctnbd03tJ5S+ct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')format(\"woff\");}.ff9{font-family:ff9;line-height:1.096680;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ffa;src:url('data:application/font-woff;base64,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')format(\"woff\");}.ffa{font-family:ffa;line-height:0.910156;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ffb;src:url('data:application/font-woff;base64,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SxqzpDFLGrOkMUsas6QxSxqzpDFLGrOkMUsas6QxSxqzpDFLGrOkMUsas6QxSxqzpDFLGrOkMUsas6QxSxqzpDFLGrOkMUsas6QxSxqzpDFLGrOkMUsas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkNUtas6Q1S1qzpDVLWrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDNLOrOkM0s6s6QzSzqzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0t6s6Q3S3qzpDdLerOkN0v6vs/+33MwatQovAd4C96Kd4V3jXeDd4t3hzd2B9gdYHeA3QF2B9gdYHeA3QF2B9gdYFewK9gV7Ap2BbuCXcGuYFewK9hV7Cp2FbuKXcWuYlexq9hV7Cp2K+xW2K2wW2G3wm6F3Qq7FXYr7FbYrbFbY7fGbo3dGrs1dmvs1titsVtjt8Fug90Guw12G+w22G2w22C3wW6D3Ra7LXZb7LbYbbHbYrfFbovdFrstdjvsdtjtsNtht8Nuh90Oux12O+x22O2x22O3x26P3R67PXZ77PbY7bELrwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8G8GoArwbwagCvBvBqAK8EXgm8Engl8ErglcArgVcCrwReCbwSeCXwSuCVwCuBVwKvBF4JvBJ4JfBK4JXAK4FXAq8EXgm8Engl8ErglcArgVcCrwReCbwSeCXwSuCVwCuBVwKvBF4JvBJ4JfBK4JXAK4FXAq8EXgm8Engl8ErglcArgVcCrwReCbwSeCXwSuCVwCuBVwKvBF4JvBJ4JfBK4JXAK4FXAq8EXgm8Engl8ErglcArgVcCrwReCbwSeCXwSuCVwCuBVwKvBF4JvBJ4JfBK4JXAK4FXAq8EXgm8Engl8ErhlcIrhVcKrxReKbxSeKXwSuGVwiuFVwqvFF4pvFJ4pfBK4ZXCK4VXCq8UXim8Unil8ErhlcIrhVcKrxReKbxSeKXwSuGVwiuFVwqvFF4pvFJ4pfBK4ZXCK4VXCq8UXim8Unil8ErhlcIrhVcKrxReKbxSeKXwSuGVwiuFVwqvFF4pvFJ4pfBK4ZXCK4VXCq8UXim8Unil8ErhlcIrhVcKrxReKbxSeKXwSuGVwiuFVwqvFF4pvFJ4pfBK4ZXCK4VXCq8UXim8Unil8ErhlcIrhVcKryp4VcGrCl5V8KqCVxW8quBVBa8qeFXBqwpeVfCqglcVvKrgVQWvKnhVwasKXlXwqoJXFbyq4FUFryp4VcGrCl5V8KqCVxW8quBVBa8qeFXBqwpeVfCqglcVvKrgVQWvKnhVwasKXlXwqoJXFbyq4FUFryp4VcGrCl5V8KqCVxW8quBVBa8qeFXBqwpeVfCqglcVvKrgVQWvKnhVwasKXlXwqoJXFbyq4FUFryp4VcGrCl5V8KqCVxW8quBVBa8qeFXBqwpeVfCqglcVvKrgVQWvKnhVwasKXlXwqoJXFbyq4FUFryp4VcGrCl5V8KqGVzW8quFVDa9qeFXDqxpe1fCqhlc1vKrhVQ2vanhVw6saXtXwqoZXNbyq4VUNr2p4VcOrGl7V8KqGVzW8quFVDa9qeFXDqxpe1fCqhlc1vKrhVQ2vanhVw6saXtXwqoZXNbyq4VUNr2p4VcOrGl7V8KqGVzW8quFVDa9qeFXDqxpe1fCqhlc1vKrhVQ2vanhVw6saXtXwqoZXNbyq4VUNr2p4VcOrGl7V8KqGVzW8quFVDa9qeFXDqxpe1fCqhlc1vKrhVQ2vanhVw6saXtXwqoZXNbyq4VUNr2p4VcOrGl7V8KqGVzW8quFVDa8aeNXAqwZeNfCqgVcNvGrgVQOvGnjVwKsGXjXwqoFXDbxq4FUDrxp41cCrBl418KqBVw28auBVA68aeNXAqwZeNfCqgVcNvGrgVQOvGnjVwKsGXjXwqoFXDbxq4FUDrxp41cCrBl418KqBVw28auBVA68aeNXAqwZeNfCqgVcNvGrgVQOvGnjVwKsGXjXwqoFXDbxq4FUDrxp41cCrBl418KqBVw28auBVA68aeNXAqwZeNfCqgVcNvGrgVQOvGnjVwKsGXjXwqoFXDbxq4FUDrxp41cCrBl418KqBVw28auBVA68aeNXAqwZeNfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4RX6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rt//f9+D/AC9hnYUAAAAAAQADAAkACgALAAf//wAPeJwl0DdOQ0EARdF3Z8b6EvpiCZR0dIQVwNqwTQk7AHqQyNhEkbNNsAlOCEqoMCVPorjSqa+QlEsMMaygEcG8W2BJgWVW7FXWFFlnw95ky96mYlfZsXfZs/c5sA85so85sU85s8+5sC+5sq+5sW+5s2vU7Xse7Eee7AZN+5kX+5U3u0Xb7tCxu3TtHj37nQ/7M0yLUAxFxVAKJbscyvZMHBVxLI4rxonYsJvxy/5OCyItph/F1E99+7cwqViYymZFNpdVFLNqXhN5PW8p5u3BAaHkO8Hx3x9feULwAHicvVKxSgNBEH2z2cQYRSSEEILFISIiFmKRKoiISETF47QQC/E4TFAvQY4rFCzFD8gnWFr4BVZ+gqVf4CfYxZ25vRhJBAWxuH0z772dmR0OBKCAe5qB9qN2B9XgOgox34pOL1AP/biDHWjjQa8HMlEBtO+tOwaZyRiB2dSR5mVktly3gTlvb9fB8oG37WBVHNo6ctb/GbOikB3IMqKNBX4YYykI2peoybkpp9uM/ADHcjbDs5aPWO7kMc7TcR1TXUmVrCicc5T9wivuIaxKO4pzApOoYhaLWMEaGnBxiBOc4wp3yBE7You3tldXUOMBz3jFe8JS3mLF4oLFmqCiDTpK7lGTbqhLjzZ7ohd6Uzpxq6Kdf8p8JYl4Quq/i/miRLAs58yjz/Ju82Y3/LJROhl9VLWEH/brgWrDt/QveqUvKn87+9+wP91U6p02/0QJlQE+0RKWdQxp/9kj3VtB/miz6w/T4j08AHic7H0LvE5V2vhaa6+19/vu9/6eK0mSJLckyUiSdJIkyW1kJEmSZCQjIxkZI2MkSUgykiTJLUmSJCRJkuSWJEmSJEmc81/7edY56znn8M3lm/l+3zf/83t/+znrrL32ujzrua3bsxhnjPmsL1vK5G397unDyt/+QL/erMqd/e64mzXofVv/PiyPSZ2GFRRASn5zm6aV9N/gf6FjeNFb/C+bOde1bt2cZbe58YZKLLttm+s1JO/FPbf1u5vF77n7nrtZEx2Tg7HM0fko5jKPhVhY5x9hURZjcZZgSZZiaZbBMllWkJNOmcNyWTlWntVnjXXtWrH2rAvrwfqwAWwIG8HGsAlsKpvJ5rLFbDlbzTawLWwX28cOsWMsH2rLf7sW/17cE/9WPYB/NzfCv4eFrktQrxX4/8gRuk7B/xMx3h+B8a8twv9D+837ofi/2o3vW7bE/z3EIf+Nj/+nVuL/lw/D//ko/P+ZOvi/rG/ya4D/i7XM1ejj2cOZ6+i/sf7M1R3HK+QD/nm7ffj34i34N7ZL55mpW8t5BY1HX+OtGmvK2mocDWWT2RyNla0a565+x8VfocaVAbMhjfHMorgLoe6LNCyW1ut3prR+vGRaVf2M+b5VKu05Z0z7Okn7F4g/+2/U1+HP8Zn631n8RSb4XD5ff63pTL4tVwElagrWlBVQPyuEvCVvqmEboLwKrDZrzjqx3pqiJrIFbJWmocPc1/gsrMctmja5217DonrIn4I4MSKAoSMaFqaFGI1jG9MJvq5wxq+XlEwru5wprftzqbSti6U9RtJ+Q9JiCx4/U77hi0jarqfJ96dS+XKN9fmAUa4U4NX957DL38mfrnO9kvYyxsk2AQxttxRh4jtoWCymOJ3SrymdYnxxOiU5FqNTE99Ow9Pm635Rqg5vnLEOvyb5roE6nH3GOiBNE+zyvafFbtu/k3ZfDL4pjl2MU7eAPCPYJfHFv77+jF9/Verr80+T9qZSUgDjzzpj2lf/W3XIPWO+JbEr5Ba57W9IifZ/Jx2/B3TRvxjFQJzsHMCwJBRj44t/PeKMX+eU+vqMJXlOqbTnnymt+0upOlx1prShTaXy7f038rWYdpSvEipTp2Ys4MlM/ZQvju9iWO/4d9L3b0AmvUWlFcbJQyDZbiKSDeO/LRnjbj7j191LfX3GkrzWpdK+esa0zUvVYewZ63BOqXyX/I18Ldaliqq4SqkMsDrS+gl4o6J+qpwO98V6oNPf2QPPAn+9Jh4idcK4WsCfHfSb4mlrEY79x7++oBh3k7TeO6XyPfuMaef/t+pwg7YyT5/vN/oN7QElN8nNWsps1XImsPACu7aCfgIrrJp+ap+5H4r1xuy/szeuLa1NMU7uL6lNSXzxr68/49dflfy6hLzHtLtKalMTP4VKi2JpG5Sqw2VnrMNHJN8RUIcOZ6xDSXlfi+/hXzrfySXyNblUvi6XyzflCvmWXCnfkavlGrlWvivXyffkevm+3CA/kBvlh3KH3Cl3yc/kQfmtPCR/lMdkvixQTHHlKk9F1CWqqbpGa/+g/xfrZ5l+VupnrX426GezfrbpZ7d+9unnoH6O6Oe4fvKDIUBgTusnGZj9gamvH00dXFMHr62fevppqJ8m+skLhhr6aaOfjvrpop/u+umln776GaCfwfoZFgxl9DNGP+P1M1k/0/QT2Mlz9LNAP0v0s/xvUd//b5Dv4iM0DdXX1HUR66rHmr1ZPzZQjzaHs1FsrB5vTmHT2Sw94lykx9Er9OhqPdukR1i72F52gB3W486TXPAQj/NMXp5X4lV5TV6XN+CNeTPegrfm7Xln3o335H14f8YLlgY0eho4O79NEZyZ37gITsuvVCJmcr6m7oLl+Ys1nJfftwhiPtPzq2s4NT9bwzn5nYve4reYP/2KfotwwqlDJcrFMM1nSn60KDzx1PEiiPEU4rcIsW5YK5p/EC9YXPPpHt0de/mXjDvfOd8xR/Ps60xqjv2QhTRPfsYqaI48xCoFHMnOk/mKs/MDjmQXao68hNXQXNmU1VTXqGtYLe8NzZ+1/235XqQpZ7l+VulnnX426meLfnboR5fG9uvnkH6O6ucEkhp39RPVj9bJXOtkrnUyr6IfPTrhdfRTXz+N9NNUP83100o/bfXTST9d9dNDP731o0c+fKB+huhnuH5G6WesfiboZ4p+putnln7m6kdLQ75UPyv0s1o/6/WzqQQXyECGFpwsOFgiXgQzQgZCGhMuTAPhgqUleapgK4Qz/xEexNILjhVsKIJYH/lf5kNrGNK6tRC62t4pHkNT0vSYkrTL6N6Df6fuXQKWXNNi1hnEqZ4w0t9FLDkbX/zrDsW+fo18vbnU12efpqQuYAcuKZW21hnTvluqDrXP2IJSaVXijPk+U8IWbcVf5a/zN/nbfC1fzzfyzXwr38F3O/WdXc5uZ4+z19nn7HcOOAedQ/J5+YJ8Ub4kX5bz5UL5inxVviE/l1/IL+VX8mv5jTwsj8ij8mf5izylHBUutHJVtspV5VUFVVFVUpVVFVVVVVPVVU1VW9VRddWl6jL1K3W5ukJdqa5SzaIfRz+JfhrdHt0Z/YwF/PXv07KMa9nAtWzgWjZwLRu4lg0gibRs4Fo2cC0b+AkGQ1GhZYPQskFo2SC0bBBaNggtG4SWDULLBq2dmNCyQWjZILRsELruQssGoWWD0LJBaNkgtGwQWjYILRuElg1CywahZYPQskFo2SC0bBBaNggtG4SWDULLBqFlg9CyQWjZILRsEJv0s1U/u/SzVz8H9HNYP8f0c1KbXLqyTuhfoXXzD/53cyiD/zLYPYBOQEXcmaw5/Xot7aayGWw2m6ft22Xatl2r7drN2qbdre3Zg9qWPc7yudSSMMmzeQVemVfjtXk93pA34XlagrbhHXkX3p334n35AD6YD+Mj+Rg+nk/m0/hMPocv4Ev4cr6Kr9MyYYuWCHv4fn6IH+UnhOYEERVpkSsqiiqiuqgj6otGoqloLlppeuespebC4jBP8ypnzXjbIthEc3RhfHutBQtTwtuCBhDG+NZabxaHwzTHcDZQ81JxiPGYc1s+owhizt01LxeGMWcKMWU3fkDDrny3hp21Hi7eilaBDWriB4qORXki7KhlSvEwthTTYwzCIWJAiRgaX/ptXy1disdgTRBi3Sh+2miJV9giDCOkdcOvsG4IH4XaroDw9f82naC0VvjntcH/3prpsfn/wKjwP0Vf/cPSr+Cngo+Kx6BuKjhRsOeflaj47X+dg7F5id1tYo4bC/r0X8FbrLMJI0SrOb/gWGHYpP+5YGeJlP9t+E/i5O/+VtZ3tOxWca2JeulR1Q49otqvR1NH2QmuTVUe5WmeyyvyKrw6r8Pr80a8KW/OW/G2vBPvynvw3rwfH8iH8OF8FB/LJ/ApfDqfxefyRXwpX8FXa97epDl7lx4RHuCH+TF+UggREnGRKcqLSqKqqCnqigaisWgmWojWor3oLLqJnqKP6C8GiaFihBgtxomJYqqYIWaLeWKxWCZWirVig9gstondYp84KI6I4yLfkY7vJJ1sp4JT2anm1HbqOQ2dJk6e0/K0Ehplags9uivUXQipNMWUzXnPIk2CWgUhyuwufEsJ6YtwuBhfAqJOwzCWhflQWY6loIynZWEpPXiwRj1IdNOwt6hw2hb1FIG92E80LEqDX9H6YxjrgBqpl5YshXCc2FYihsaXfjtUDC0RUxrbFHbiK4sgjcd60lZTiD1FY8aLvX8zBnGOLcX+wvjpTvXTwjlO59PC9c7J00JKJ7RcLBHje/HFmhOW85V8DX+Pf8A/4p/w7fwzvk88Iv7sXOrsdD5zPne+cL50vnK+dr5xvpUz5Sw5W86Rc+U8uUgulsvkbrlH7pX75H55QH4nv5c/yOPyhDyphJIqpLJUjiqnzlJnq3PUueo8db66QF2oaqha6iJ1saqn6qsGqqFqpBqrJupq7wnvSW+S95T3tDfVm+ZN92Z4M71Z3mzvRW+O95I313vZm+8t8BZ6i7xXvMXeq94S7zVvqfe6tyy6ObolujW6Lbojuus/tl2BRp+tn3n6WayfZfpZqZ+1+tmgn8362aaf3frZpx+tu/gR/RwPFJnWiFI/vn6S+snWTwX9VNZPNf1oq0Joq0LzJhNN9KOtCqGtCqGtCm2DMqGtCqGtCqHrILRVoa1HJrRVIbRVIbRVIbRVoaUHE9qqENP0o60Koa0Koa0Koa0Koa0Koa0Koa0Koa0Koa0Koa0Koa0Koa0Koa0Koa0KcYLBIqGjrQpHWxWOtiocbVU42qpwtFWhOYE52qpwtFXhaKvC0VaFo60KR1sVjrYqHG1VOF31o60KR1sVjrYqHG1VONqqcLRV4WirwtFWhaOtCkdbFY62KhxtVTjaqnC0VeFoq8JZoR9tVTjaqnC0VeFoq8LRVoWjrQpHj4IdPQp29ChYcxmT2gSSIf3E9ZOpn/L6qfRfaDWcxaKzUqgRQVsXS1Naa7b8Z3StgaYsUsrfo6fRhkC7JMoanTZNKfvG2AekRSZM24XhfxX8p3Dyj1owxfro78I2ifmX1tzQzxne+h1D2ubzu7Ioz/132y9OG6ej08Xp7vRy+joDnMHOMGekM8YZ70x2pjkznTnOAmeJs9xZ5axzNjpbnB167LTfOeQcdU5IJl0ZlWmZKyvKKrK6rCPry0ayqWwuW8m2spPsKnvI3rKfHCiHyOFylBwrJ8gpcrqW03O1hF4qV8jVcr3cJLfKXVpOH9DjrGMgnUMqrjL1+KqSHlfV1OOpBloGN1MtVGvVXnVW3VRP1Uf1V4PUUDVCjVbj1EQ1Vc1Qs9U8tVgtUyvVWrVBbVbb1G61Tx1UR9Rxle9K13eTbrZbwa3sVnNru/Xchm4TN89t6bZxO7pd3O5uL7evO8Ad7A5zR7pj3PHuZHeaO9Od4y5wl7jL3VXuOneju8Xd4e5x97uH3KPuCY95rhf10l6uV9Gr4lX36nj1vUZeU6+518pr63Xyuno9vN5eP2+gN8Qb7o3yxnoTvClad8zS+mKR1g4rvNXeem+Tt9Xb5e31DniHvWPeyZAIhULxUGaofKhSqGqoZqhuqEGocahZqEWodah9qHOoW6hnqE+of2hQaGhoRGh0aFxoYmhqaEZodmheaHFoGePOHQENOZ8C3AtwUgDlWRCG1W7nEYC7ID5Yx+ZiJcDXIMaBt8MhPBugDzAX4teQ8DcA34cYYd+qChBeBnAhwMdsreQqUqtzbK1kLVsTmWPr4PwJ4AlbrkpAzB0lSzf1xDzXQ/iKUtiYSMLP2rohHmRlUgeH1JngwVlsa2LKglY7r5D6hAC+aPEgsb23kzybA/wAYnpC+I8A3wW4htR8O6nzMHjLbP1VEsJ/gPj6AMOkRbNJGOtcidR5kq2zsxzeziR1hq+cAiilFcD2EP9rgMfg7Q6AM+Dt2RD+AeBASPNbCL9g+4tSmmoA8GpI+WeANQF2AVgOIKSRgwA+WgrDSRJuTnCFtXqiJKXJhwhWZ9kcnN8DJHzhvAn1fKskPajmhNLKWWqXNci3g0vSg6lzbYCAJZltac+ZCnCCxZXbCHIGzEuklkUQcyvAhpDyG9unNL06FyDybwahDeSaLaTcZwk2JhEMYJ17APwavhUk5bO2B5FfnO8ALiQ0M4bA90htsTcbkjpgH020JbqIW+ACdaONUYQqTG2fKBlGSsBWGBk1AMJTILwA4NMAP4I8gSpUH4AvkJh7bAzylKEokCrIg873loYNhqva9DIFcARp9eeQHvYyymak5u9b7Bl4GFJyQmmw7xy5Xs6w0FBmFYt5UwfCuUYCrCLUPpVgEtvyMMHPMtvX8hTArRADck+BFauuh5h98BZwhRwkLwBYCWKCfTKCXaWtHT0aYGexS7SFcwVrzMqzZvpXgeXp39nsRv2ryNrp3zmsC7uVVWK3619ldgfrwc5j9+nf+ex+/avKBuvfBWyo/lVjo/TvQjaBTWTV+QK+gNUS5+ixT23RSFzBWogrxZWspbaNJrMbxBQxn7UXC8Vi1lu8pqm2r3hdvM5+K5aLFayftpfeYffLmIyxB2SWzGKD5O/l79nvtcUygg1WeZoOHlIPqAfY82qwGsxmqYfUUPaCGqa560Vte4xjc9V4NYG9rK2QiWyBtkRms4XqTfUmW6F+UCfZW9pi2MHec3e5u9h6d7e7m73v/uD+wDa4x9xj7ANvufc22xjYAWxLyAt5bGeoRqgG2xXqHurOPgv/Lvw7tjv8SPgR9nn4qfBTbE/4tfBH7Ivwx+FtLD+8M7xTC/rPwp9xFf4i/AV3w1+Fv+Je+FD4EA+FD4dP8nAsL5bHs2M3xG7gOSzYL/uJ3H6m/bLG6uxRZnWWWZ3/hNUJclqCThBHeE0NR0F4AYmh8Qcg/DyEp5I0c0He98zfrPPMh/iRAL9kJ4rCnwZhZyOEnwR4FOBe1l3HLw1GeU7n/IksWAEtqpUD2sCUTusDVoCBLwGcW7I+Yh2EoXRsqTMmqCGW7pwi6UFjiIrBDqti2JgHNVlYMKUwButm8LCOYAPeyiVBSooH1FoGA89bnDg3w1vAhjM9SC9B4yEeZNOgJuKVYDyL9ZEM8vegDmgDVgSJngNlVbcpi2EJ6u/k2HjVJpiHlF6w08y0AqBzm+1BE1+qztgLps6D8lfofO61dTY43w+ltIa6tUEMQJ5HIU+Acr0Ni2+Cppl6Tsg/osPwFvuLUhrW0NQWU85FTZj/elFfHCXYftLWVrxM4Eatf7jTBGqFWOoL+H+UfIt9jbbYWnhbM2iv2gx4WEcw/IjBxq4ijjhg36o8eJtvqVF1gphLAP9LWZ/Agg5WE4rRA9b5IdIK4As5GGq1l63V8L4Aiq2QJ9g4CE0vAFR74O0ewr8jbUoDP4U0AHFPtaENxNUqXr+I5pHCXyNYOgH1mVVwrQ5/HuyHNDj5yvKCidkNpYBVJb4A+ocWmd7MDebhHQkpe0DpICsoJo1MwJFEgS2Lttq0l7TL9BS0XY6FlEBd8kPIc7qlAefx/LN0eEvAHW5N4KntQVgMC+bfMH/TdqwV4U0aY8JAUaJT/vDi/Fia+3SrZ+jwHbB/upLlRwOxR/KCPX6G+z609OBcGewyNZJzpeU+kR/sFED+chpBWwAabiL8Xqws+NbILhyvr7P0ZjC5lHAHlls56DvVAFoHUJ5VdPqleCmjCI+vI3XAWo0qqF1mdf4vsjqV/Eh+rC3PT7Xt+U+doUhOjOVpOFVbps87rZ32Tmenm9PT6eP0dwY5Q50RzmhnnDPRmerMcGY785zFzjJnpbPW2eBsdrY5u519zkHniHPcyZdS+jIps2UFWVlWk7VlPdlQNpF5sqVsIzvKLrK77CX7ygFysBwmR8oxcrycLKfJmXKOXCCXyOVylVwnN8otcofcI/fLQ/KoPKGYclVUpVWuqqiqqOqqjqqvGqmmqrlqpdqqTqqr6qF6q35qoBqihqtRaqyaoKao6WqWmqsWqaVqhVqt1qtNaqvapfaqA+qwOqZOusINuXE30y3vVnKrujXdum4Dt7HbzG3htnbbu53dbm5Pt4/b3x3kDnVHuKPdce5Ed6o7w53tznMXu8vcle5ad4O72d2me3+fe9A94h538z3p+V7Sy/YqeJW9al5tr57X0Gvi5XktvTZeR6+L193r5fX1BniDvWHeSG+MN96b7E3zZnpzvAXeEk01q7x13kZvi7fD2+Pt9w55R70TIRZyQ9FQOpQbqhiqEqoeqhOqH2oUahpqHmoVahvqFOoa6hHqHeoXGhgaEhoeGhUaG5oQmhKaHpoVmhtaFFoaWhFaHVof2hTaGtoV2hs6EDocOhY6GRbhUDgezgyXD1cKVw3XDNcNNwg3DjcLtwi3DrcPdw53C/cM9wn3Dw8KDw2PCI8OjwtPDE8NzwjPDs8LLw4vC68Mrw1vCG8ObwvvDu8LHwwfCR8P5/vS9/2kn+1X8Cv71fzafj2/od/Ez/Nb+m38jn4Xv7vfy+/rD/AH+8P8kf4Yf7w/2Z/mz/Tn+Av8Jf5yf5W/zt/ob/F3+Hv8/f4h/6h/IsIibiQaSUdyIxUjVSLVI3Ui9SONIk0jzSOtIm0jnSJdIz0ivSP9IgMjQyLDI6MiYyMTIlMi0yOzInMjiyJLIysiqyPrI5siWyO7InsjByKHI8ciJ6MiGorGo5nR8tFK0arRmtG60QbRxtFm0RbR1tH20c7RbtGe0T7R/tFB0aHREdHR0XHRidGp0RnR2dF50cXRZdGV0bXRDdHN0W3R3dF90YPRI9Hj0XwtbvxYMpYdqxCrHKsWqx2rpyVnHdALGXBCeFwA+QaAK+FcGswemfkPnEV43obN/M2XEA+WBoe5pWAtU8esg7cwr6NgjtPMbo5F24CE4wCvAfiITemBXWpmFGDWwXnR1DbI8wCp1VwS/tTWRE62dQhWCgvD8ilWV2sonJWsQ0ofRer5sq2nsxawkU0w4wFME5gLbzdCuJlNyb+0YecTwPN4CE8FuAbSv2fbZbAN8zGSE2y/aPGMcz+mjYDnYO2yOJ6dmQTDz5G2PEfai2f0B1s8o80jV5P6wLyRgn1UAmZ8VV2AYIuqyyHPN6AtkwA+C23cDeHZALcBHAzxC2GPeT2AE0vSWLG232nb7qKtgjOvXwCcA/B10uqNZ2jvbNJeyAHn9gxdwfhUDgF6qw4QZqBVXyh3jP3WGQcx2FM449ULUuJs4lxLS5QL3OOQJ1pBm2w9VW9oO9RWgZZz/go4yQJcTQOa+QDgWxDzlyLfAtx5BjB5l81BDrX1xHjzFucaCcR4FSE4x/Escsp2tqOQm9TvyFuc2UWb+RaLDW25BOlhzzEHfuSfQPw2aHUlwk1QTxdmYSXM0OP8qJNXiiYR1iTffkK4oDfABwBeG8DwwMASDs0Bjsa5cJj79GBG3LsIUu61dQjDPH1oGqSEGVzvQXg7kNAY4Mo5YPnOUNG52q7kzhKAIE/kzRCGVSZ5FcBRlh8xpZGHSKUw6y+vt5TgzLFQpgHGSfp1pO3YRzD2cS4GCHLJ6Wlli5Hk4wkNKKCirywPOu/A2z5wzuMDVosF89PByZEJELPWyjRnlJVdCrxI8M/h29bwFriYT4ZwNYg/38pAh+SDstFIyH0kBuoW2scG6tKzoC9gLSW03vIj1tbkswXgiyQ8B/I8CKVfBHAowPaWOwz2JpXEpBxDKBlTQr+oxyEMslGeDXNKhyBmopVmKMHEcYgBajR8ChClhNcZIGg0F+b+PZAq3jNQyqXBKUKZZ/sda4IrSEbiXQdvkTZ+AYirQJst/bjAER6sAKjyhFaRj1oSCCsDLoyVUOJJWFmV8JUaZaHRLETGSipj4VsFVI1a2EiG3gST4whucUXiAsvXLshMF9apHFgL8mAdyUNtAhaFwpVDkDYSVyS+sJKQP2apwg1DONNCcR6keRVimpL++o5wx90AgXrFbyHnP0IY9dcMgHgi6lrIDentE0uBNKX7CEDIzQWukUjnoBndShB+AGBDgDEo8RWAIA8F0s8O2y4xE769oyQ3Yf3RAkHeRJrHuhnuExDznO19/rweD4eMx6az9AjsbD3+PUePe8/VI7HzWBU93q2qx7nV9Pi2OqvBamq5EJyNrMMu1pL1EhhBN9Mj5xv1iDkYL98OI+X79Ah5sB4Zj9Jj4if1qHgSm8KeZlPZK2wxW8XWsw3sI/Yx28K+g7N2Eb5Aj5criXNFZXGeqCLOF1XFBaKauFBUFzVETVFL1BYXiTriYlFXXCLqiUtFfXGZaCB+JRoGI2w9vr5KNBXNRJ5oLq4TLcWNoqPopMfbj4vx4gkxQTwpJopJYrIeez8tpopnxDTxVzFdPCtmiOfETPG8mCVeELPFi2KOeEnMFS+LeWK+HqEvEq+IxXqM/roem78pVuix+dtilXhHrBHbxH7xrfhOHBU/iRPOJ3q8nqXH6X/Qo8Ph8o9yhPyzHqlfq0d616kW6nrVUt2gx3w3qtbqJtVG3axHf+1Ue9VBdVS/1uPAW1Rn9RvVRd2qR4S3qW7qdtVd3aHHhneqnuou1UvdrUeJ9+gx/+BgrK9H+g/r0eI4Pcp/Qo8Xg7WGZ9Q09Vc9bnxWzVDPqZnqeT2CfEHN1qP+H9RR9aMeNf6kjquf1Qn1izqpTql8VeBy13Gl6+mxZNiNugk3y812c9wabiP3CjdPjyVv0mPJDu6v3U7uLXpM2UWPKu91+7lz3fnuAneHu0uPHX9wj3kPeL/XI8IHvaHeH7yHvRHeaO8veiz4prfCe8tb6b3trfbWeGu9d/XY8D1vvfe+HiF+qkeIu7zd3uchL1Qj1D38u/Aj4afCr4WXhl/XY7M3wsvDb4ZXhN/So7S3w6vC74RXh9fo8dq74XXh98Lrw+/rkdsH4Y3hD8Obwh+FPw5vCX8S3hr+VI/ldoY/C38R/ip8KHw4/L0e0/0QPhr+MXws/JMe3f0cPhH+JXzSd/1Mv6J/md/Af1yP3yb4T/oT/Wf8v/qz/Bf8F/VI7mV/kf+Kv1iP597wV/hv+Sv9t/W47h1/tb/Wf9d/z1/vv+9v8D/wv/ePRRpHrow0ibSMtIncrMdy7SMdIr+J3B7pGekVy4vdwE7jO8nMVMwom6kom6kom6n4F89UwJhCXgb6rjPAOgDB8pSw10a+Y613hSOI0eYrVjSugXUTgXP4sCNJwk4QCSMFF/Y3mZ0mPwP8LQnjChqspOAeNJxhwDGjBHtPdgOIe5egVu5LpFZ1ba3U7bYm8kdbB3kpwE9tuZi/wQApHetp8sT9FxcDNmD+QVwAYQY2zDkQvoy8xZRtwFqIQEw3gN9A/BgINyC2OqTHdahi2IaRiHycYLucxbM8Qdr4EcEJxXNH21KT/28JHqC9Emxs9a7Fs0IrsZbNU8Fakgv71HA3kILRvYL9NQosankFtOVsgC60HWgJR9ayL8TAnIxzH7QXxhGqL6GxpaTtMO7DXW/Ydg8pDfZaqrsBZtu+Nq3uRNrbnLT3JtJeGH2rfaS9OLqEFnktLFSIT9zdA6MDHI97MM6Vnxmre61OOc++RVqiXOChjzXAv3oVIPSsAkowtW0C3/4CMThftBXCMDMmoEQBVj3SmKaEIB58XCmYj1InbRsx3ryFb81+wBr2rbqf4BxbhzsQ/wotwpmo7SQN7KGT39teMLyfH6SXuLY1sCRN4kiTcr2LnIVtwfm03aVoEiGsFIMnpcC/WBH9mxnOKEDILbwSZiqActzxAGF123sbIKzSyiW2DmGYn8H0HtTE+wneHiE0hjvLXiDlIg++DvjvAJDU2XnXUq+RYEjVMPeLlKBgJG5kXTdCsRcR+Fubxrz9iNShvcW82VV6sZUhsomVRZQGUFKJRpYHkVtF4LeCezizeh2Mie61MQrbGIWvGsNb1AswwyYeh/hlEMY0LYgGOZ/UishGIyEH2hKxbuF0MBvgklF8CMa/3m2kjZcRCGNMCWNPCXUWPQD+juivmy1/GQnQvlT4AULJkNJ5A+gHZS9wpQSvqvI+gGdbaYYSDMe2uP/UcCiU6+6H+sNch9cV8sQ5MeAj7y7o3wKYqVhE+h3nu4CbvHaEGnGeE3ZxotzDWR2kEBc4yIPdKao/aeOTltIMBInn4gw8ztDCDkQJe3LVyxYiF6vGAEHGogYxNAnfotQ1Wvh7wps/k7Ygbm+wpUvY7egCb7q4+xikjQc7tb3fQAzuv36aYAC1Tz6homqWHtS7hMaQtm8FWBFiRpP+urYkhQigQ3EPvJ0O4SMA90AM6Hc3z36laxvAe0qmdB8G+DTAFSRlO4iBmRAJM4oSNKCEGkqcwQC94MC8hLyccPEA+PaDktxUjK9xhvAn8hZS4mwG6kEFUrFspuIfnqlYR+YqymYqymYqSs5U/FOeRHE2I9WgbDajbDajbDbjXzybAWvHznOgAWGVQcCqgXgItDmeoML1QVy7dK0tbdawYC1engdWEKzXC7S0YcThgCbVoyRrGeLZrHUkjPuKcVU624YVjBccPPMBNp45mQS1UktJrRK2VuYcIe4cyLJ1MGebsD5wLk3hyn6vkqWbemKeH1hLA8cCAiwW5wWAzxGIb8F2clZbHIrpBJ+wTieWQhhTwqqNOYdEsY1rZymC7QkWzzjmNW1EPB8leIb9Ks7rFsP4FeLcnLXC9uL6+yyLZ5xHkp1sfdDixX0IMmbtVQWrlgrPXeH679sAYfXWwZXZDy02HFjnddDGawtwIKGxTaXafr9tuzlnCf1lzjDhebt3SavPO0N795L8cb1yJmkvru3iOSeyx1t2AIgr73jaDEYT8iuAl0BMa5LzMUtLYg3hgtdIjyDOYabIwVW8s0kNYSURd9dL3JOz0FKUoTqIwZRIRcXO8EH+GG/exkivxexb3LdjsI0nBfHM4olgXImUb85awRjfrFmfIuHZhvaCVekVkPPUkjRp5tAI1ys8MzrFUmzgV6E4TRos4QlFPDW43tK/2XvwFxt2n4QdzkCHEk8S4/kwGAubE4rHbB1cmK1yYU5DwZhR4UyFIjQGuHL2kHKXm3wC/OMeBpQnH0MYxmtmXjSbtG459AWRS+Zc4EpCpbMIRGmTT+g5SuqAfTTAUqORSwhfsZDSAEoYXCM2PAg7fMSbMN6BeTMHx4PfkBiUaZOt7JKoHWA+Rxy0PI6zEw7MpYj1AP9CakVko5GQNAakKPYF7jDBcavbxPIj1raYpC0FxWxbK1ytRliMv5qXDKP0M5SMKXHHF55BfNKUzgop3Mi31VaCGXziiRjk0DesTDM9SGUpiZGjgtkMI1s+sDVx1kLbqcRDWUfl3kiS2y7CZT1JGzdZSjMQJR7MPKDEc2C234G5UDPziXOea0hZ75KyzrPfotQ1WviU5UeDSWzLNFuugSiBMT3sKnFwpmU1KcUn9Z9k62AofCHRp5T+V1ooPgMI8wbO96S/KpTkDrHCQpxpFzshnG0pSg6B8PxSVEdSyg9KQl3/IqiSEIb5age/wh2JMNvp4LmwzJJcI2AHrPJKxS+1vGNsDPoW7Qqc7UF8lu27KJvNKJvN+NfPZpT5ov6/79uzzBf1fz6ElebsHRmuhntYVNxadvr+33H6PrQytDa0IbQ5tC20O7QvdDB0JHQ8lB+WYT+cDGeHK4Qrh6uFa4frhRuGm4Tzwi3DbcIdw13C3cO9wn3DA8KDw8PCI8NjwuPDk8PTwjPDc8ILwku0rlil9cJGrQV2hPeE92vZfzR8wmdazkf9tJ+rZX0Vv7pfx6/vN/Kb+s39Vn5bv5Pf1e/h9/b7+QP9If5wf5Q/VmuCKf50rQXmavm/VEv+1VrSb/K3+rv8vf4B/7B/zD8ZEZFQJB7JjJSPVIpUjdSM1I000DqgWaRFpLWW/p0j3bTs7xPpHxkUGRoZERkdGReZGJkamRGZHZkXWRxZFlkZWRvZENkc2RbZHdkXORg5EjkeyY/KqB9NRrOjFaKVo9WitaP1og2jTaJ50ZbRNtGO0S7R7tFe0b7RAdHB0WHRkdEx0fHRydFp0ZnROdEF0SXR5dFV0XXRjdEt0R3RPdH90UPRo9ETMRZzY9FYOpYbqxirEqseqxOrH2sUaxprHmsVaxvrFOsa6xHrHesXGxgbEhseGxUbG5sQmxKbHpsVmxtbFFsaWxFbHVsf2xTbGtsV2xs7EDscOxY7GRfxUDwez4yXj1eKV43XjNeNN4g3jjeLt4i3jrePd453i/eM94n3jw+KD42PiI+Oj4tPjE+Nz4jPjs+LL44vi6+Mr41viG+Ob4vvju+LH4wfiR+P5ydkwk8kE9mJConKiWqJ2ol6iYaJJom8RMtEm0THRJdE90SvRN/EgMTgxLDEyMSYxPjE5MS0xMzEnMSCxJLE8sSqxLrExsSWxI7EnsT+xKHE0cSJJEu6yWgyncxNVkxWSVZP1knWTzZKNk02T7ZKtk12SnZN9kj2TvZLDkwOSQ5PjkqOTU5ITklOT85Kzk0uSi5NrkiuTq5PbkpuTe5K7k0eSB5OHkueTIlUKBVPZabKpyqlqqZqpuqmGqQap5qlWqRap9qnOqe6pXqm+qT6pwalhqZGpEanxqUmpqamZqRmp+alFqeWpVam1qY2pDantqV2p/alDqaOpI6n8tMy7aeT6ex0hXTldLV07XS9dMN0k3ReumW6Tbpjuku6e7pXum96QHpwelh6ZHpMenx6cnpaemZ6TnpBekl6eXpVel16Y3pLekd6T3p/+lD6KCv0joSzFx9DGM8i40kC3F0CozRzFrkLm8YKfXXBfgEB6+0Onq2BeIUzHDDPh+M2gacN8IQ9xIuvbLkcZzXQN9CLtnQF40vjxwI8AYi7oHQ8QwbetfQY9yYYTwewcgDlWRC+FOCFANtBfMsA8sUA50LMVfC2fABVFoRPAPwO4CskDF9pPX8TjMtvgpFrAL8NoHsRhJcAfB9gDYBQN3UNqVsVWzfZEWryKoRvgnis+bkkfII9rHN46QylQ21lVVtb2QIgzqTCXJfAOVGYgeB4ggE9IuWTPsIzYXDSy8EdVRmkZx8mfefb3FT3UvivBnApwX8Ni3mZbfFvML+2FOYvtziXl5FeuNm2XUqA71icqwYQcy3EID2D7w2BcxKvEQqHU24C5kXMjDjMtOHcZLEzdkj/6CHrbYKNnpaqDfZwbg/mXXBvCEJzMg/TwG4Lgd610JsFnt1UbIaG0tK52dm3m+SMNYG2iCzwDYC8dgX4JLgFYrAX+pbqi3zbF27YUru8HSDyxX22F7CnToP/yoT2APPypMW/bAIQcnD/AHAYxLwOOf8CKTdaqnYzIYz0fDXbDnPhRaUgnVM+df8EsDvkOYeUuIrdUlTbxyCHMVaSGM79AvK8NZAbpv5dLT0b3G4kNfwQyoW9SE6SLSqUMwppaamVPNiPSEuYv+LgrwVknYCZMAEe4gSc73RaWjmJ5YqDRDa2szmjlOO4Jwhm4MQR8J8xy6YXOHv9myDenMbDVieI1EVflpHAd7jzFOQA0tuU+DXUFufDylsJjzwuRxCK2m4px7mOq0KZI3cRudeKyKXLiOwdHKR3PgasbgC4Br6F9G6fklLXdeDtIIh5lUhCIgEMnADwZ0j/KyJ1cwDWBcgCGBrFj8BOnJvgJNNNzGgELDEE0tt9GWJOkZYiPTxKckaZ9lEgk53aAC80cuxh4OUgvInwHXJli+Atf9PSLXIQago+A8I3ApU2hZiZkPIGiL9GhItKwZqstlyJaYwsrUFqXgFyWwXwXUt7SG9IGxzkHsezyC2IPkXKxDld2HlnND7MCjuwY9esnIAHIAF7lh3wpShwlQyo3ZyEe9LqFOQC8UrJsFOB6CD0OInz608RLq5MWneepQrUBUbWfQntnQ8yJwLh5yEe9KwDMgTr44JGdkHOeOUgn868fWGLjG9HBnBsSa1hfAjiTuQXrb5QbQGiNoEdysbCQX3xTEmtoXC1agPJs6qFZhb/iM3faCU8s/gc0SwtSS9g36GmKLBlObDDEdev0JuUC/3l4voS7hAcRigEy52nJVCgHwO8AfU6VwC8F7Dnk15APbII4EjA/9UQBm2iFkD6DhDTkPTmcssFBqI2fxdSoj46G+KBkuV2C40VcT3A/oQXbrDfokYz1tdhIhm+I/KhMZFgCEG/qJ0AgRORr92JAAdZ6SF3W1mHdTB9jZbVW4QGriE9hfriLdsvRnojvaH/yh+sPOdPWA5Vn7J0EZ8C5xrPlbCCJ3YSiPyF9IB7FlAToQaBPAWsHitcOfkj0SyHCEXhHo17LXU517JNrNCPMFIa7j/Fs7N42vtbCx08RbEb3qKnWqS0Hwidg50jjlsKxBv6OKym4i51gWeF37BtR2isMtgJ68BXDu70x5WrPFLzMaQt6NsA9tg6xCuDg54hciy3KjinKw5Y3OK3xrbEc9Xbbc5mnR84CM86GK8eKAHQLypgT2DOm0wfTSuMd9ATA6zucvSKAXvbHRyd4bnhBy3NmFEbUgVaqodtX5ty+9qeNZYPUmk7i3Mj35BK37UUKNATLnrRQGpPaijYs8xjgVQK6x9nMZal4yazp1iEPaPfxdhLbK6m10X6l8mW618We1//stmH+pejrb7tLJft1b9ybJ/+lWff6t9Z7Hv9q8B+0L+z2Sn9q8jDPMzO4VF+PqvEL+J1WENen9dnjXgD3oBdwa/iV7HG/Fp+LbuSt+Y3sSa8HW/HmvIOvCO7mt/B72DX8Dv5nSyP9+F92LW8H+/HmvPBfDC7jo/ko1gLvpAvZDeIJqIJayWuFlezG8U14hrWWlwr9IhCtBDXszbiBtGKtRWtRQfWXvxa/Jp1EbeIW9it4k4xhHUVq8VqNjDwF8oeEBvFp2yo2K75Z5T4SvP/E+JrTT0TxBFN8RPFMXGMTRbHxc/sKfGL47GnnbBTkc12KmmttsKp6lRlq5xqWp+949RwarHVzkVaTr0rL5eXs/fl1fJqtkHeJe9iH8jfyt+yjXKwfJB9KB+SQ9lH8mH5MPtY/kmOYlvATdg2V2gpv91Vrst2uL4bYbvcmBtnu92ktr/3uJXcSuwrt4pbhe13L3AvYF+7Dd2G7IDb2G3MvnGbuE3YQfda9zr2rXu925oddtu47dgxt6PbkZ1wH3MfY7+4L7vz2El3obud5bs73Z38Avcz9zNezT3oHuQXut+53/Hq7hH3CK/h/uj+yGu6P7k/8Vqe8hSv7XlemF/kRbwIr+ulvHP5JV59rz5v5rX12vJrvHu9gTzPG+QN4q29Id5D/CZvmDeM3+wN9/7I23p/8v7M23tjvMf5Ld4G7wN+m/eht5Xf7m3ztvO7vZ3eTn6P95n3Ge8T7C3k93rfeN/zAaFJoUn8wdDJ0Ek+JHxu+Fz+UPiO8B18aPiUr/gffM/P4KP8LD+bP+nn+mfzSf65/rn8Gf88/zw+zb/Av4D/1a/h1+DT/bp+Xf6sX8+vz2f4v/Jv4c/7v/G78XX+Hf4dfKN/p38n/9C/27+bb/Lv9e/lH/kD/AF8sz/QH8c/9p/wn+CH/Un+VP69P82fxn/yp/vP8+P+bH82z/df8ufyAn+ev1Bw/1X/VaH81/xlwvWX+28K31/jrxFRf52/TsT8jf5hEfeP+D+Ki/yf/FPiksgVkStEw8hVkevE5ZHrI9eLZpEbIjeJayLtIu1Ei0jHSGdxfaRLpJtoHekeuVO0i9wVuUv8OnJ3pLfoFLs21lx0jrWKtRJd4ASwLH4C2Mx27y+b7S6b7S6b7S6b7f6/PNuN5wZxh5wL85cSPC4Z/0Toq6spQNy3dxZ4g7qW2Iw494Z7CtGvFu4umkjS4E4jKEvNsV9huXimFL3fG8/5ULqLuzkh7PwQ3OWqxxY7CucRjSem4L7v4K4KDZ19EJ4FsDLE7IBwM4CfB1DcD/AOiOkNaV4NoHoOYt4GCGlkNsAHYNdmK0g5FGIuBfgMwEsC6I6FcAIgh5R7IAx10zaHrds8WzdtFxfVRy62NdHjpCCmi62J+5szlP42yTMH4GcAEbcfkd4Bq1+0tJY4njlE/7Cmr2fbPjKemuH8m9lVhueE0RLHfcMflsI/Yvtygv89FvNyAGkvYF62KIV5j+B/q+0F52vS9rrw1eUW5+p2CK80aYIakh3DSGMe3m3R1dQ5CMPoypx9xd117Qg2mhvrvgiHyB2GntHDIJ4hhL2tLvgCQ69keP+LgnOMZhcgrhXg6Vk4RYx+zQwXILWfYyGW7sZJfWBkLJ4Fn7nIaytgtns0xGAvNCV9cQzCL9i+cJdB/HGIOQXwPYBfk174nOB/P8H/PoL/cpB+CKH5QwAfhVLWAARKUEkII/c1gHy2QMyNEDMQYtZByioQE7N0TvnUnQJwMqS8ClJuB/gTqe0nAGG+FsfZKhPSD4I8UWph/a+0vW/uK0Fumms5y0ike+A8Odh8Ls5F4U5o9AjQgUgnzH87+NrGPdzoQxNvNXrC0qHpO/zqHSsb8a3hr5lBbniC121Qkk4wPY7+cfZdXGplr4Ne7XBPapsgH2ePyCziC6inkcaKzWZmPg9XtMQWWwdN1JaiSN9pDBwulDkK+7E2wJoA+0LKU0QaDIX0XWxvUgngvlRS6qqlEF4OsBbkM7iUBEB4J8C/AOxgpY1ziEDggtC3wZ2aCijfk5C+lS0xdAPEK4gZTXgEeScPYgosHyGvIUegxMb6OHMgfLulIpRv+JXROOMAdgQImkJUgm87QXgqwBzCiW2D28xRIxi9kE3qj2mmkrZDHzm7AfYEONZSl/GoCHOlArhAXG1ll5F4SGOo8U8S2kZZh7NfvxBJOJ3QJ+oa8FHi4vmEWlanOG3PAO8lUg79TlI9dT/B9paSYdQFziYId7WYVCjrpgNE6vJNbwZ1Gw49fjZQYD7EH4b94gUlZT7O3FPdQbWGOX+C66jgL8/F0x0dzqA1iO4IDbW6w5wJaU1gOVJKU1sK6jXUVsaOmmV7wfTd3aT+w22JCk/jgP8+hRJyJ2njSUshEk7pqMeCu2mR940WQJ3SHfC2knDKRsD5WRAGnUK1iXsewHFWxhbTJpxAkO1ah3Yq1CbyCYAgPVSehUaGQLmov+QWwhGP2jqg9WXk0iHL9dgW0yKUdajLoLYaPwH82koz91mAM5Ar4e059q3RPsJSu6F5YuXiTDBSkfG3KIn0Br1gTqfgPXEg+QVaAjAP6qI/AvQrCv50FOxoUOg7FVei6hL+xbuxQpbSjAaBGAEzo2oFxOAZGNREHxO+XmP53ZxY6A068X7LoXgPGvo2UsD7qBnNCUBY/zHeItDXJHpNRa+R9QCCFMKzGeaUF56UwDMkJ2wpqirhC8wHb5TD2/1Qr+FaEJ6C+JHIFmz7SoINzBn93sLMt5xmsYop0QOR2UMBM8cS7hEzHnK3kxjM+TvLQS6eicKzhchZV5Fv0bsrrjReDXoZeRnXqGHNTeCKIt6dh+e78JYR9OwJPGtGbdRebUr6msgc07/HCX1SvYCUCXIetYaxk58m+YNNqOIals12l57tfpc9IN4TG9jvYc77IZjzfgTmvMfDnPcTMOf9pDgmfmaTyma7y2a7/xfOdksVUTGV1NrqH/AiUT47Z4iGFVlUHCrztVDma+F/2tdCrGGsSSwv1jLWJtYx1iXWPdYr1jc2IDY4Niw2MjYmNj42OTYtNjM2J7YgtiS2PLYqti62MbYltiO2J7Y/dih2NHYizuJuPBpPx3PjFeNV4tXjdeL1443iTePN463ibeOd4l3jPeK94/3iA+ND4sPjo+Jj4xPiU+LT47Pic+OL4kvjK+Kr4+vjm+Jb47vie+MH4ofjx+InEyIRSsQTmYnyiUqJqomaibqJBonGiWaJFonWifaJzoluiZ6JPon+iUGJoYkRidGJcYmJiamJGYnZiXmJxYlliZWJtYkNic2JbYndiX2Jg4kjieOJ/KRM+slkMjtZIVk5WS1ZO1kv2TDZJJmXbJlsk+yY7JLsnuyV7JsckBycHJYcmRyTHJ+cnJyWnJmck1yQXJJcnlyVXJfcmNyS3JHck9yfPJQ8mjyRYik3FU2lU7mpiqkqqeqpOqn6qUappqnmqVaptqlOqa6pHqneqX6pgakhqeGpUamxqQmpKanpqVmpualFqaWpFanVqfWpTamtqV2pvakDqcOpY6mTaZEOpePpzHT5dKV01XTNdN10g3TjdLN0i3TrdPt053S3dM90n3T/9KD00PSI9Oj0uPTE9NT0jPTs9Lz04vSy9Mr02vSG9Ob0tvTu9L70wfSR9PF0fobM8DOSGdkZFTIqZ1TLqJ1RL6NhRpOMvIyWGW0yOmZ0yeie0Sujb8aAjMEZwzJGZozJGJ8xOWNaxsyMORkLMpZkLM9YlbEuY2PGlowdGXsy9mccyjiacSKTZbqZ0cx0Zm5mxcwqmdUz62TWz2yU2TSzeWarzLaZnTK7ZvbI7J3ZL3Ng5pDM4ZmjMsdmTsickjk9c1bm3MxFmUszV2SuzlyfuSlza+auzL2ZBzIPZx7LPJklskJZ8azMrPJZlbKqZtXMqpvVIKtxVrOsFlmts9pndc7qltUzq09W/6xBWUOzRmSNzhqXNTFrataMrNlZ87IWZy3LWpm1NmtD1uasbVm7s/ZlHcw6knU8Kz9bZvvZyezs7ArZlbOrZdfOrpfdMLtJdl52y+w22R2zu2R3z+6V3Td7QPbg7GHZI7PHZI/Pnpw9LXtm9pzsBdlLspdnr8pel70xe0v2juw92fuzD2UfzT6Rw3LcnGhOOic3p2JOlZzqOXVy6uc0ymma0zynVU7bnE45XXN65PRmxW4ycNC3Ke46AQsTd9bg3Q/oI8N4E8D0aJ2iDxE8m427R3GMjDe1oPcHnD1bbPM0uznwvhO8eflm8m1zW4q8w+ZjfEmQ2po8J1toPFngPTfg3w3vLXMyrCVv7glArwQX2rGDgPGC2SGyj7Qa9/GNI+2aEtzBoN/WAps/gJsB9gF4K8AxAA8FUMwH+ALErAGYB7c4XE/yWQjwCRKGrzSebW6LAf4Fvp0H4aEABwK8GSDUTd5J6raV1O2orY8eLwfwOpLyDVu6HHeG0l8neU4GuA0g7njC3fcvGSxZiJg/z/Ya7uVBDItFpO/+ABDHqnhWwyG9BqNssxMKR8roUeIZQjO46oTxeB8J3klwf6m+u9VizODnZttregxrcbWG4Jb22oOkv/aSHvwjwRtgVbaz/aVrWAvG4LWK6HkSgc0J3nD1ASmwL6FJvHUafQHg6H454dBlpBcuIVyMo8tnCMe9TvC2xkLc3yfxlgi8ZwVvp7iPlF6/ZCnITYYfUXrg/TETSb/jbAm5scPMTjxGuPh5knIN6bUXSvXdIdt3EmlyOMDjAHcA/I702iHSX4dIf7Ug/QU5yIaEv34EuB7ifwmgEhDOAAjxzmzLTfItSz+G088mpVxWUibIrwDuA3iJrZvMJrVdBennWC6QcPeGPAtSNoW3KIcLWxGE8WTGHAud+w2vBWk+tLRteu0lIuVeILz2VyJ7cTflizZP+TZJg3v8lxBeRn+1SNvoUehXkAb8cYjPIeZTQvm9LL3hnJtCOkSPyQctXxg6+QtJg+vIMKdk9nE3J+mJr2oMGyp91UJKyeZblFowj2duR15A2pJnOcuchMD1Vth9LHAfNNxsJPDE0iiC2zmELxYTDlpo3wqcl3uD8B3WCleX8FZ6nE/GE2Yo/XIIv8wmtEc0gqwD4RkAHyGUNryUFgMpJyAfscJSjvy2pP7SOAzC3xvJVgtqW1IeIlxuecpZQmTvIALvBV5D+flnCDOIn2hLxLd6hBvErCb13whwKsBORMJPIXhoBfAxUvpKgO+QlPdBq5cQfsEw6FwxGMJtIAxtEfcT2XIZKQXyMRoTdQroYucAKR1rdRfA2gBnkl6m1tqbhKpvIryAWqCz5UEDkWIFkajLiARGWw45Gj1947rSdsKbeE7uaUvthkNRYlxJIOoU9Df3OZEMKEnqnB4afd2O1ArlAO58QG14heVZwy/rDF+UpHAK3yD0jBxxKVAUUubVAK8B+DRAyFnuAbqqB7C9oXPGzN5k0+obifyhOnohwRt6+q5me0feCnAOwUkpHW0g6Gh1jPT7AtJ26i0IZddqEl5uZRRaCEbW3UEo5xqC7WtIi3DX/C22XHNHGr6FNSnjSw41O9xwpl4n1LgC3iK3vkwov7vtBfkl4db9EBOH8AkIt7I8Ip8E+DnEfEB6dozlRAPRvkJLdTORA8sg/lILjV13BOAxwonHrFySwNfGll5I5NJCQlEIBwAcBRDkpJwJEOXPdAijloeWOo9D+CyCga8BPkT6ei6R9tBfZt0Q8d/E0o/hbpQAvyM0sIhAoFiBlID7/XE1GU8zYH/B7iCja3D9Bddz0ad/K0urDq44XESkB57gce23RpcBnZj72uGtAJpEmx8tFrPHCfzQOV1Jq4cTyuQkf7w17dfwLVg4uA5uTiCh7QFnEQSessLxZjXLEUZ+kjzR25fCfWu40o3nJ/AME54PgLpJXNPBdfNtBPNggaCfRDNWHQrhqwjf4Wndq0kf4VmZTpZ3io1nkRIwz8oEt/gWV6DWknzQJyCObacS7kaIlvxfST4or3BPC65/4fkJPNkDHvQk3l+IvY+WFVr+iNumtqVmTAelmBN1ePsmtgJtHhyz420caNugd0WkYdR0mTZngedscPca2q6wFqnwlAmevcMzbSj9XiT9S6wsY6lebOmh2PwGHTFdZqnXwXVeIo0NZQ4ivYOwge1Bs2r/NulHaJc5d4hysgcp95CRgYEToD7MY8EJ60ks8EQYrLuVZ4vYYlYB1t3OYav0rxJ4DDsXVt+qsI/073zwHlYVVuKqwUrchbASVx1W4mqw79j3rCasxF0EK3F1eJifzy6GNbhWsAbXGtbgboI1uDawBnczrMG1hTW49rAG1wHW4H4Na3CdYA3uFliD6wxrcL+BNbgusAZ3m2gibmHdYE1tiFgtNrAJYqP4kj0jvtLS5xXxre7X18R34ju2VBwRR9nr4piWIMthBW0jrKDtgxW0A7CC9g2soB2EFbTvnE/0yP8HWEc7CutoP8I62jFYR/sJ1tGOy4fkw+yE/JO2GgvUKTeHy2CNjJ8TrJHxSsEaGT/XreHW4JWDlTJ+ntvIbcyrBCtl/AI3z+3Mq7ld3C78Sreb2403ce917+VXuf3cfrxpsF7Gr3bnutt5M1gp6wcrZffBSll/WCm7H1bKBsBK2e9gpWwgrJQ9ACtlg2Cl7EFYKRsCK2WPwkrZWO9e73H+mPe+t58vhnWuTbDO9Smsc22Dda7tsM61I3zKz+Y7g13u/CdY28qHta2CYG1LsGBtS/BgbUsIv55/i3CCVS1RI1jVEhcHq1qibrCqJS4JVrVEvWBVS1zqD/RPifqRKyLXiWWR6yO9xbuwlvQNrCV9yzgTcovcBk6qghPUydOuGVUpWzMqWzMqWzMqWzMqWzP6T10zkn3gHq/K4nFtz/QsaFpk4cPuaPGytjmMR2wBKyY438V/PNUsGHMVHCy03sWa4LS3QEvsDdhr/SvxUKFVJkayCYHlDzFo9WEY7z+bDembBbmZMO7xhrrJJgVXFFl3j1loajusYI+GsAfMwMeNDXmisP5ieMFIDb8X6aIR1jA4OfJKQeBHAdeV+hT00vBR0pYf2DYWeJW1eWL+M4MS5RAYdW7gCahbEH4X4If87CK4LPDIIjbyDA1h9smkxLcQoxbnn2JmPGveLmffALaD8Oog7ODM3liIgRGoyROg8wArF6QpKK8hzGyYus1nFQvz1COjgqJyp2qbsbA+FM5l5xWFV0J6/BZL/3XBJYWlY21Nnpi+fkEEejno2XKiYRHk+dV1/O8LlmrYvaB2ERUhVZziu4MxXcErwVuIWctz9Vc/8y1FKTcDPXD+cxH+F5AcRtl+cWB/I54jl00DWpK7xFAdX7WgQTDDH4TlnQWrSvTdm4Cx+wreLcQP4tBgeDXpO3gruxRMKd5rOA9p+m6K7UGnZeDDBnvN6R30Dq4vmP46mb+LBb6zaxXSuXgwqJtYHHgsEEilL1o6l88CZp4pqMICfwybgDYC2oYdoapD/rqi+FEWP/wY8CnOsLW3vCY3AGaQ4xDPK8BTAq4T4dizMpQF8eZtAsJYwwV69FJYT+TBlUG84SbsKeB09M1g6oYpce31q6AOYimcpwCJIQYWzCv6FiQGcp+p1RDTL7nF+85A7J39/BoNrwU6xx78mF+gy6pkec3El+ovQ+3YX80LroYVmaL+onynOOQG0OkIfPEB5AlQXgHhnfx6kAk/FtbQ6V5wRyFFIU9RmYA1NByNKZHX2hWcU8SPWPNnCeWPNn1tJQPILtOKDgVbi6gLv0I4AHA7lXy1mD1VhPlHrZQrBokEFhNZXvE8JXryeCRI6dQXvwpoG7TDTt6WGfmJt91jbk4VImlXAUTJ/x54scL5qHrgBeo1oL3HrBzGWWgJXqwMnYwi2sFnAws1miNE1UJtYvQFagSU5zvZgEA6AQddFegjvEFB892EQko23y4rcItyuB3Ca4CeUX/9ETgF6483izwTeLES+YYfdYlOG4DVxAOAsX2FeDDtesTqRMNBvYJSTN/NL5hb9BYh6seXAFe42lUP+Gg74OpywHDLgl8V8ctdgQ6VEUJvIL1xFUNCGtkz4BpN1d+w02gxp2vAEQLWVjRtZxRx3HdWIyCV4ky7lrqBRniOtQvWAuB8KJWHY4nMRDpH/XUi4BfnnUC2OBeBhEGOu83yi3qIX1ZYK8wB36ouVlYbCYC0/S6R6ljnbiAt3waPYkeA4+4teFKHdxScr+EekC3bgJdB2hs8fAwxsF4sdqNeDuosekD9G0H8Kf47De8kvIzak/G7NbyRXx5wH2AGNLvhaKJ3sI+cdyBnfIv8gn5igKqpFWS4YBFIddhBgVAU5PcLaDvQfVpHbCri7o2BLYS3DhguQAkMtpzBKsxaG4gcijmMtJpFiiBnpEPU9VqKBvT/A1As6HSHQa1eLRhX+BXV2sYzzSrYXf8xnGMCfa3TdC/iCM6PBhgOLAdnH59ZJPfQhjwX0oPNQC0WQ+errTRG/Su+AWk8B2TdhqAv1BzQ4zfywPIZV0wmB20cRywB0NRGi/0BckPsPQxWzU5oKdXRqJ0BOkk+lgWzlDuKckCIevlZ0PtUR289tRJ6cEChjjZzp0QXGzlwcSCREJoSqbZ9y6Y3FsJLYM+DRS1vgzOGNSgN2BYZ22AFr1xIdUaizgnkEsJiZa2A3r84sKiRGs1bxN4koMM2BTzgSrDnv4feAX3tfFpwITOa2sAhBVk6/jWixxGirNhd8BMrrq8vC2Sdk5v/UpF9NbiknYza2ekclI7Q9DWxEIqlR8mDNgPY0ioMOYB0MvSGtge0yNgJX/B7dLvehNYh5EHrnG8B0lJWgKxDXY8SAN8+F/SL4RSc636G1Q30GtiBfaDHgcachUBpYHehPsJ7iMU0uJ1oldWMxcZHuN9jEfTILKBPoCVzE8lWKxmMhzbUre0Lhmi4A6jucZbJgjXBfYVhIz0eB1q9HMLIs6jLbsrfrGHLAJq3fybyZ2HBIcbdXwX1kYmCrjpNIn9/kWxpA1oDqRT8bxm/UINg/NgLcDKEvcUCG3JTEe0BBgxmsNVLrG1sblxG337PAh5WwhiB0LkZEU8v6MkKV8+fMzpX94W5pYZoZHFAW8Ta3gjklfHRhXfY3ADtRT+1nYFrPiRW+nxjh6wFWgpkoAIJjHWGvZTileCULt4ype4D7htlLOSglN0QHg6ljAD8T4GxzwtsNJQb8DXYM6JbQUtWKOERYh/dYi1JuTn41q0WQFWBx4vwBhBtNud9sAeugZib8o8AHwXfVgdMIt2izbAVZA6MUORikAzU5jkAsmgh5NARIFiPYhCEOwfQeQMo4RymKUSey4OvxKnxgUQFqtsKbVxpZZ0Z7yyFmPVQQ5iFML2Jluobtu+KzW88bi1YM7NxFtGDb9g5Cjo7UcwqRvsQKBA5VN4H2hl1GWhwccpiW2u9RUUYQ1k0SuvKsjWjsjWj/51rRkpukpvlFrlVbmPBKc1gT1zgDzVYyQ5W42v/rRsp0DtXzoIy71xl3rnKvHOVeef6v+ydy+z1wxP2uG8Id6nQkyWwU9iB/UfiWDDfYHaX4A2PeJ57voUSd1jjPqC7AF5H3vYgX6FtiHuC0OPRLlu6xH0otUm54O3d7IhZAXAD8Ws8HSDehfBHgA8CnMeKPJ4L8A+u7awgBr3hdwH/ql2IT+R1AGeT8HsAbyOloM9x8CRufLJPAzgVYA+AUDfVhnz1tq2bZLY+UtmaOHeQ8Ep4++UZSn+f5DmX+FzeT/CDu35wRhD3RuHJBtzzhXvZcD4SvC+YfU/Yv/0BTrIp8S5CE+5fCv/oqXkjwX8Pi3lnl22vwfyGUph/lOD8OOmFx0jbwTu2vM3iXHYDCB7YDR3iyO8GS2MK9xvibimkH/TKALt38V5gs/ftcYK92ZZW5Q5Cz1eRfNB7AV1zgG/NqRTckwUeudDPCnpmd/AmjPsthWNNTB1eKlUf8AAhlsPNE9jGr4OwEhCDvfBcyb7AOycMvX1oOULivRRwk4rsSXrhxBnwP53Aidbrt6F5vJcCfI6rsIUSvMabW0PAe7gDfv/lfEIDDUvlf1tJPsUamrpNJyVOJ7XF/McR7K2znGKkB6YHzxZOV4Aoi7ZCPIFGInWBGQiYaVCK0AP2L3JTYyKdqKyDr8zon54jnE+kazWSfrDNGXPDPXo4l2+kZW2bXnwNYTjJYc61YM6dCJUyqNVbgXcuc8st1hNLHAdhvKEY9g+if3DkcfkHQlHopf08Q0vBvQsgcyRK19cJ575FvsK3z0P6cYBV6HfxiaUu+VNJqSu/B3gPxCwE2KmUBKD9voFI3c5E8sBtKA7cX6JegzyfhnAK4ufZHBSUruoRGniQhGeVynkDqcM9JNyJtOVzkhK+EigV0X/9dltn8aitpwAP+OJPhNqPiXuKSvkAILTF6KMThI86kz6C3Jw8gFFCe52sVDSe0GFMj3NmRuIhZTayksfQDPrsAQ8xuLPe7NJFCgcPNGZXLHiWV5zoEdQpfyJpaHgckXIfEGqfTrh4OmkdDW+zsk7Xv6jVRppdB7CdkQwoJazOwpucUGvkg3culNW45/c2K5+L6Y6Ftp7oQ8usXLUlOJx3Bq1BdIe5bQhPruCMTisLqW4yWuBVomvwFvsepGdrEBx2IPW/ykKB3ucblsp5OKlnJ/tWduNvF2EVb2p5yNKtJNrE6JEkwertJPw8kdhHSnHxVAJRm0+B8AIi1ddD/PsWGiuC6C/DCyfst0gDxvp6i/DvOkIzw225BuItF3gD010Wyjus1DI4wfo/R+owiMjhmYSSO5GeIrOq5vQDld4PkX6BewjEJMuhxj5HGkNreRpAPFkeIxDPQOCepg8JN9W2MXj6QeJ99PdZzWJgDfIV1gr13ROgE9HOQQqsBPngXTJ48gZmB2XUUqwKEYp9nOT5NGn71bZ0bLU5C0JPG+ANN+OJzMET3jhSQO7Gm8bQ49QkImHGWY42ZwLo7RRYc8CMQj+X0Ju4FmHOE7QjeOhA6r/C5iwrEA7CU1Y404+nWFCS4IklPKOJFrUPMhbPE6DFDmfTzd0h9BTdHBKeX4oq0D5pZPvajNGuIj3bleB8MKHPOwmVRi19mvNzmP/xIk4v885V5p2rzDvXf553rrv4Yr6UL+cr+Rr+Hv+Af8Q/4dv5Z3yfeET82bnU2el85nzufOF86XzlfO1843wrZ8pZcracI+fKeXKRXCyXyd1yj9wr98n98oD8Tn4vf5DH5QkzK56lclQ5dZY6W52jzlXnqfPVBepCVUPVUhepi1U9VV81UA1VI9VYNVFXe094T3qTvKe8p72p3jRvujfDm+nN8mZ7L3pzvJe8ud7L3nxvgbfQW+S94i32XvWWeK95S73XvWXRzdEt0a3RbdEd0V1M213/n92BzgLfjMGJtcAGCDS0lizM0Xot8N4ZnAoLxq3B+a/AO2SgI4I9G4G1EpylC7wKBPMNwfxPoAWDc3SBze+M1o/WooGuDM7xBRZKoHECezfQvYEWDnxUBho4OKEY6LzgLGKwuuvs089B/RzRz3H9aGs08Bghff0k9ZP977k9vKDlvz7PMvifBCsOKTdAwxEs6tQqO/tVdvar7OxX2dmvsrNf/1fOfuX0yxmYMyRneM6onLE5E3Km5EzPmZUzN2dRztKcFTmrc9bnbMrZmrMrZ2/OgZzDOcdyTuaK3FBuPDczt3xupdyquTVz6+Y2yG2c2yy3RW7r3Pa5nXO75fbM7ZPbP3dQ7tDcEbmjc8flTsydmjsjd3buvNzFuctyV+auzd2Quzl3W+7u3H25B3OP5B7PzS8ny/nlkuWyy1UoV7lctXK1y9Ur17Bck3J55VqWa1OuY7ku5YI5E/T3hjvU8G4Q9GgIo3vcfebBqF/iPbI49m+a35kV+tKoBG9xxgPG6Qr9I6LfAvTthHed4s5o8O2EPuPRC7t5+4GFLtw6qYZCSvSNAb5tVB7sdsT5WLxtFO6NQX9XLt42g/fm4lwQzHkq8H6B80sKvOCI90mJn9owluXm2PzNrBSULnBGC1c3fggwgK1GTyHy0fw2wZ5WCONJvjfzf1s416Feshg2EL99icCXLc7FmzaMd+OYu6pgphRXwEV9UgfiTZB63jLxkF6BB33q5Qgh3v4r0XfO+zaNXBTsEBTU2wR6jEAvGjCXpbAXoB/Nui16qQevkDifr3AX5Cuk3NdJ3fCe++E2f7MKgDOQeF9TF0JXhE4c0o+mr6Em6F+f0hXe7uKus3SFvlvQB4n6K8nnbUJdeIvtBEtXEnxkqka2Puj/w91hw/I92yIFM1qqvO0v43OlXP70wn4xHmtehrfomR7xg7SKfkbB0wbeyG58xSEnome4mvAt+s/Am5ewlFNAIdkB5I8FJcrLIeZxQoGUToaR8J2WZnDtXrxq3+K3xShnOOnNy0g+fyCUgzLhQksz5n6V/afvXwoV3h8F9VG7SPwc0rMrTt+nKIXQD43A+wTgJJa5CRvzgbVsRe/kBkx6DxPaqEnS9yDxJ0gpt1jaU49bGnCxZw/ZGjooCXG/6mTS1zhfinPpuGILazrqAvtWnrLtNTds4OlMvLP5aqAHbAXMpWtZ1Fe/TUDv4x5n9He1G+DnBIK0dHGWG2fpw1AKzqUvJjVE75hwnky8QGqVshRiVh+w7bjSNNamN1L0R1J6KZqk0OxkuJzgH+LV/ZYaDcUiHeYROnzW0qFoynxW6OsUcQh3huB9z/TWZzef1OEneIu35XxFcn6e5I/ea/BEEbRXkTvNjO8lvPsZ1isNLxAJj9gwaVDSDoV43NcPewAEYr4e0cI4944rFMBlAiVSZUuZZs0Fb9HB+Jm2Dg5oH9TLzuMgnSpbSkY6D2XY9F6L/EGFLTJc0BUglZ/orw7vMyEa2ex2wBjQ2h7cIuJtsbkZLhtiIdatWMp1BN4J9cHeB496KE9M2z+1tUIvWUYynGNTiq22VsYy+YLAnSWx4aBv0d+R+McIBPpBHpRHIVwD+gsxdhWE0ccYlgUy070H4lFT4B0pgHPkX7QlxJfwFu/DQZmGpwRwLRVv+EbOwrfzID3SJ97KgucGHiJSAnjc2H4bSYkovYF6Ba49gfcyvLfenJHF03LEqnFgRUzgzTC4IgbrU9helANIn0ghAm+Ugrt90Cub4bg3LAYMbS+zaXAnHnrxNF6QUZ+ij66ucAoceFassXl66NMU+Mt9OzhFYU63Ix+B71Lqddt4NUNOJBYOemY1uw5gxcr7FaHMBYTGjlkaxhqeJiXScA+oD3reIjranG9AzkJNCmnQokbvzkZyvmXriWdcJJ4Gxnt1sA7NSG7VSuLH4AE5vYLtHdPXO0hfH7f0ZlZdOwNFITwLKHmNLd34ogNK83D9Dm0YkDzqbEuB6MMS/eCKhUDJeC4ENWzlUuE0wfZZlkpd1FlvwklT5Fm0i6YT6kJbC1Y/5c8QRmsK9yYhRZEwWlOiNqRpCeGTQa8pvNNpApxZvAjeogx/idAwDb9DsI34wVEMrnLuKXizSLuhZ+sVAMHyRFsRexz1HbWgaMoz2VEmBiXeL+TtaoLJ22ytDNwNae4j6fG2LjqCQ4mNHgdxLxlKb7TK6ti+dtHC/AzCX5FyUY8jF+CYCO0N8D+Htg36/UXriFpNaNWY3ZVoLeM+n7MsTZoRCniYQ8ksYXSAK/s4UjNSdKG1yVH/IoW4QF0KVq5d0G4uWqe4e2G45QjDU8tKhiWxpemYCG0q0+/ogxk18nACx1scKrQfcHyKe372WeoyuxeADs3da8hrwJUK9lm5eINfF8sLEmUdUj7IQwV1MPsPx1r8GFiOQMjfSACUok8E58nkODJWRQ2IN+8dCuLdHfAW79cFea7eAwvtHMgHuQPH6c2g93GkM4z0+/zg9J6Lo+/xBP/PQHr0Jgh7iQX6wgfbCXfDGurCHSBQZ7QA5Qj4Fu1trP+4krmhbDcQ9LXC3sRRPM4M4O4mpK4HIR/sKRyxIg0vJ70/28aYugFuRV6gkQXqU9izgXcR474U47vxG0OHwe5K3BW2NAi7HMJ4L+ssC03rYLZBoiwaChD2+Tir2WUwer0siClIssKROPYy7gpDPYieR+fb/jVtPERKQdkFYwT3ApIS9IiHd+VlQfwNgGeUkKjjcJcI7gM5H6giGkBvvcUG+pUUHcgoe7PtBdEE8kQZ9ZTlMgk7A8H7vmBbmMsC/RRhwT1QmSyLRdlZ7DwWZ+ezS1gOa6x/VVme/l3A2ulfNXar/l3Ibte/6uwO1oPVYPf9v/auPlynKu3vtfbXefZB9Hx/nxqpUcnIqAx1ko6PhCQVDYo+xshIJUnyIqFGXZJMvBIlyRipJOkkoTIykmlKhZAxkqTCqHif/futWgvN/3Nd77nOdda1r/2svfbaa93rvu9137/7XlaY+eH20l8ja0Tp7yzrUWua1diabs2ymlnzS38trBetRVZLxBpeYL1jrbUqgT9phVjDixBr2BpYlCpgUdoAi9JWBCJmtRMJcYrVVTQWja2+QJtcD5zJDeIycZl1I3AmNwFn8jvgTH4PnEl/IExuFuPEeGuAWCietwbKomxuDZItZEtrgrxAXmw9JNvIjtajsrO83HpcXiF7WLOAJJkrJ8pHrOXy0dKqWyWnyees1fJ5ucjaIl8uaQbbZXVJf/1MviHftnYCZ/IlIhG/DhEmIhIiTEQQxiOKWmEkoqgtD9hS1LUd2xc5O2LHRIWdsAvijBBtIn4dok3EeSHORDS3G9tNREuntlNbVDpxJy4uDDEnolWIOREXhZgT0TrEnIiLw3hEUeXc59wnLnHGOeNEB7fK7Swudbu4pZFwr3Z7iZ7ute7N4nr3TvdOMci9xx0hbnVHuqPF7e5Ed6IY4j7iPiLudKe7T4mh7jPuXDHSfc19TYx2v3a/Ffe6B9yDYqx7yJNivOd6EfGwV+7VFlO8E7x6YqoX9ZJiOiIgZyEC8knEPj6F2MfZXkuvpXjaq/KqxByvvddBPON18jqLeV5X7wox37vSu0YsQDTkIkRDvoRoyMWIg3zZm+/9RSzxnvMWiqXeC94botpb6a0Wa7013nqxwdvgbREfAdmy09vnfS3+5X3rHRCfA82yxy/zy8SXfj0/Jfb6Of8kcRA4lsP+H/xbxBH/Vv82Kf3B/lDp+MP8+2TEH+ePk3H/fv9+mfAf9B+WSb/af0Pm/FX+anlyGE0nT/U3+JtkI/9T/1N5nr/N3ymb+5/7X8pK/yv/K3lx6YW+rCo7vex02aasb1lf2TbEt8h2Ib5Ftg/xLfKSEN8iO0TuiNwhL42Mi4yTHSNTI1Nlp8iSyFLZOVIdqZaXR16PvCm7RlZH/ip7RN6JvCN/G/lb5F3ZM/Je5D15beSDyAfyusjGyEbZJ/JJ5BPZN7I5slleH9kW2SZviPwz8k95Y2Rf5Ft5U+RA5DvZP/JDYMlbAhlIeXvgBL4cHESCiBwalAfl8q6gTnCCHBbUC+rJ4UE0iMt7gkJQkCNDpI0cFSJt5GjEfd6LuM8xQbPgPHlf8JvgAnl/cGHQWj4UVAVVclLQNrhUPhJ0CjrJqUGX4HI5LbgiuEJOD64MrpaPBz2CHnImIkRnIUL0SUSIPoUI0dnB0OBu+XRwTzBKPhvcG/xRLggeDB6WLwePBJNldTAl+JNcFkwLnpDLg1nBbPlW8OdggVwTPB8sletCL6XcGKwK3pSfAoezLVgTrJPbg/XBR/JfwSfBD/Lr8pblF9ix8gvLq+xkedvydna+/JLyy+xiebfybnaD8u7l3e1Ta1fVbmufVvvS2h3t05HB9A1nxX/KYPqLTRXnl8rtVi3Hq4mnrImnrImn/O+OpzzxUNSKetFa0ROjqWghWj/aMNo42izaItoq2jbaMdo12j3aO3pDtH90UHRIdHh0dHR89KHo5Oi06MzonOj86AvRJdFl0VXRNdH10Q+im6Lbo7uie6P7o9/HZKwsVicWi2ViFbEGsTNiTWLnxs6PtY61j3WOdYtdE7sudlNsQOy22NDYiNiY2AOxibEpsemxJ2NzYwtii2JLY8tjb8XWxjbENsa2xHbEdsf2xQ7GDpcEfRCvG0/Ec/GT46fFG8WbxpvHK+NV8Q7xLvGr4j3jfeP94gPjg+PD4iPjY+MT4pPij8VnxGfH58UXxhfHq+Mr4qvj6+Lvxz+Ob43vjO+JfxM/lLASXqJW4sREKlFI1E80TDRONEu0SLRKtE10THRNdE/0TtyQ6J8YlBiSGJ4YnRifeCgxOTEtMTMxJzE/8UJiSWJZYlViTWJ94oPEpsT2xK7E3sT+xPdJmSxL1knGkplkRbJB8oxkk+S5yfOTrZPtk52T3ZLXJK9L3pQckLwtOTQ5Ijkm+UByYnJKcnryyeTc5ILkouTS5PLkW8m1yQ3JjcktyR3J3cl9yYPJwyknFaTqphKpXOrk1GmpRqmmqeapylRVqkOqS+qqVM9U31S/1MDU4NSw1MjU2NSE1KTUY6kZqdmpeamFqcWp6tSK1OrUutT7qY9TW1M7U3tS36QOpa20l66VPjGdShfS9dMN043TzdIt0q3SbdMd013T3dO90zek+6cHpYekh6dHp8enH0pPTk9Lz0zPSc9Pv5Bekl6WXpVek16f/iC9Kb09vSu9N70//X1GZsoydTKxTCZTkWmQOSPTJHNu5vxM60z7TOdMt8w1mesyN2UGZG7LDM2MyIzJPJCZmJmSmZ55MjM3syCzKLM0szzzVmZtZkNmY2ZLZkdmd2Zf5mDmcNbJBtm62UQ2lz05e1q2UbZptnm2MluV7ZDtkr0q2zPbN9svOzA7ODssOzI7NjshOyn7WHZGdnZ2XnZhdnG2Orsiuzq7Lvt+9uPs1uzO7J7sN9lDOSvn5WrlTsylcoVc/VzDXONcs1yLXKtc21zHXNdc91zv3A25/rlBuSG54bnRufG5h3KTc9NyM3NzcvNzL+SW5JblVuXW5NbnPshtym3P7crtze3PfZ+X+bJ8nXwsn8lX5Bvkz8g3yZ+bPz/fOt8+3znfLX9N/rr8TfkB+dvyQ/Mj8mPyD+Qn5qfkp+efzM/NL8gvyi/NL8+/lV+b35DfmN+S35Hfnd+XP5g/XHBKCkjdQqKQK5xcOK3QqNC00LxQWagqdCh0KVxV6FnoW+hXGFgYXBhWGFkYW5hQmFR4rDCjMLswr7CwsLhQXVhRWF1YV3i/8HFha2FnYU/hm8KholX0irWKJxZTxUKxfrFhsXGxWbFFsVWxbbFjsWuxe7F38YZi/+Kg4pDi8OLo4vjiQ8XJxWnFmcU5xfnFF4pLisuKq4priuuLHxQ3FbcXdxX3FvcXv6+QFWUVdSpiFZmKiooGFWHEJz0q6/Wujv4fsSr0J6hzLGChOQpTgCgl2cHwZtDe8KXeQTKChP46eiOV/Y82Tp6TgbM6lO2fOz9YK8WOEDXgsjXstj2iCeh1oeUV9id3LmrSQoM8ROp0CtpIELvgdlQ74/BXnt+wGTYMnpheB54TnqVXFd5XvkrY2ml7YB9opVD+PfTBx3k5cjL8tHw7LJGS5yjcq/upfCwcNwOJIFbiWfgrFB6BVkl4O0Uf1KTXYjD6xjZn4SnTpvsnw1oDW45CDTDuZ6+eR3VSF64VTgG9cnFehfw9WsZoizdBA5gFSX/pJOzUX0T5jN6jK5s3/LfKawHbgEPvBy2RxyEaxBOhBcjluX2wMSvvNL0BU3VNtxw1eaISLNzq3EraYIA4cGmJ5JlJtCIz1udRzDU8FfJFzDUjdb7BePYwRuxF3RNGsfOaPfFe0+Oj3r4VT9EX9wejt/ASKDRBH03/jLV1YUcnKsGZqylfISBA/6R8PuvhV9oO1SlumHGXflGcGOc8b9A/bVeTNeUrBMRu3aaL9e7RKgZbMi33yjMPKzIRELTi0zYj/34sAsJuCGqZ8/M4CGe77rOy7N6sn6KXm55neaqBhsjgV/pUebLOfvy6DZTWA2/0MXe0HRq0R1+KQy8WYq2cszTVKdsS+9NXP2tSncpMgBlXmAgia35rUB3P9fmlpjeevereduyMm/Nu79Jz4cNzzjgwl36AZbpUM77BmOsXjblO6LlWyIhZxlzD7+fifhmwDy7sfzwJxsf5Z+oMpEq8CxFmxFCofk7Vb1HICPLk6pDTejhrx0M7HqnxA8zISt1beozJadWc0kNIXzptnPAaeeQYBlbChafFpbUe8+tyvfO0HtomLzW8oCPQN9iMFVaCtuQZqL8FX82sCUQrAIngjTGokVgJoloW6X4yB7eyiPM8HlC+mBp+rztT91BRYPfDy0p3hujeqmi549ETh4xe8dlHjqVhekfJP33a6eFdIYaC2KifwVCQbqs03SpuTPqBVFIYCvJJxlgDSUHUjLKj4yuIpFDn1MIa7dIv8U+jn7ONt9D3CKogb/ewBj34lj3EbtqjwlFyhuve2r1RH7KGUlVJcEgl5wujJrn9LyGVzkO5GU8R50UanqNH226L0eZJRYyqxEg6SnvRbcoewFuhDypbDNcvzxIzsULUBLDWXJwUpU6cNc5mFn9Dr8D97OcMXIbB28tI7RX6Wb/y8GhL5VPhGzkyR/H2x0PEhANvsEPMC7UanjHGUaU3DBgND/Prw6fHk65YKk9UATXZz99DShr1qXF54DmyJ5AaoGeFy1hqvNHCimiuR0lpSswLCb+ivU/PrKoJylGa3rrQT0JPJr9IyURqL8wSyDPMluqRVD1h/hjqSPfrX5XGxXK9QVH81caMLwp7ztIFpcnzQTPEj5AaX9IU5UEfo86j5nQN7sCHI67W2pr8N+6/q3EfHs/eNnEfRASAJ0jIOI/a0TQ8xdOgucrI7TeAluAR8phHBFKeujr7rxAi/FKB/tCDSk0GOonYjq9G6fbC24kf6UMvOp6it58oEsYZw+urIqpH6rE1USSKm5FbMn4aI690yMF6JdrsP85Co3fuKFwJKZwcmOuLnkz64XkaLk/voxQ2cSWUL+CoYh8yhJK7tgcSmT5JelPRPtEl1JeUpmdgTFwbOVg5ntQBiMBCa+pUePIlQ+dUHjZGRUP+euizR69jubEeHzVWIrnWBaAE1oev2xtirMRrNd5E8nvpBSUukrKYs8BsEODtSm+hf554rneMWYOUES9Cx4aUdyv1F0lmpIDvV+W4hw/WJf/M6bfwtEKOrd0Vo82185Lu4fEoFcWB9xqr2NzXcDyJVekC+mQJDVBSoyMqZ59u34ekU7lD2P80qBqcRMwD/aO0PWiStY2RJPYBWGn6om0gCBT/b3bcNUceuhO1TRvXHtGgL4dIFrsVpBW4q/JzcmwNPAvPCyROwe4TSkmlFTPjKmnDvIY+LBuiThtcHzBQLQ8D1XIQXwqNhbqZcy7qT9UUotaUec01Qs5DTz5oVeFcPgzPL7ETyN6LGVR7Cmqt1FHnHIt2MXVjs6bi1RgH6rccSQkO4PIs7fcxeqjpwdvMmADPaMFF9gKubo96F/Z69Ejbn+hSAl3lnsXRwDU4qgvqdXle5sf6jUrHJpd4W993+Ss0HKXLBZp+ONoSmo9Yjaf4Xn4XVqIHHK7L1UGujnXqAb+mdq+0t9DrPhvtGCehKq87ETc4yVvha6aBflDTRR4IZs5wqblxLsh7uQNlPo8jeGoL2qfHHmVo2rF+zMlBrn4cEsf+As8SvcJTJ1/Hs+CWLrJbKUlqYnauMVbZYP0VlETqvcxSjTXo8nwXaj7cNWDGXXI8ZrpirhRyjOfQDrEGRGFwJwt5J5sbvXoe/cdKdGEhoYbv9dBPubRmcFfCWe4SPkVcicoCwnVNPka5AM6pNC7YWxR24xa8kW9nPh5KvbTmnNTwaWGgBUOdr0n5MlV/hfg31iPfS8w+cUOQni5xYcSJw1ri8ZRTZv6YgWvuf8+DXAOGiLJbnTxKDBG5MTiMwlQSIQ4rmfgMfGaggSQibnTHkf0/SaXfa4pVJ6GCA9sbwYeJ1if6g9g9yFyvCb4C+yOFMCImiHbFlmiz47E4I5UV8iRoesvACVHa0LjEetxBqbBI1M0mGV9HvYsnc99/HC7pc0UDP+GS1PnEXKEGLklAc1NaE1fNf0InQUbI7fqaGCV7Ar4apUs0GWyY6vxaIMhM1JL9uS4d5s7BbNL6pGaHJXYiROirPQXsErIQ6uRiJbQCyjtorUQwqV0S0cfs/yKrRek+8vXzWp2ZzWw6XXWpsEWIGFMIJuMMDHtleJqOmw5LeyZystOmwaw5tAsRuwcuqs7aIYeElngUggl7GdoTvKimVWoXYks4L0fhmK48DsdECxj3mNSm6qHOQQPNxNHgCdDXYqZwX+Uhu1Hr87Ic11gj6kQoB/NICy1zNZ2HX1FTwuKqdJWTNFdUeD1IPYcZerhfYPQG8/C1Rx2u1lF4NonWwJkdWgkiuE9ZBrmg7F0mxuoxy0MG9qx1tlXXammdb/3Sal36Ox24qjOsTqW/M4GuamT1tHpZZwFd9Sugq5oAXdUU6KpfW8NKf82AsTrHGl/6O9eabM2yzkOOnzbI6t4OOX46AGl1KbK6dwTS6jIgrboAaXU5kFZXAGnVDUirK5H15ypkdb8aWX+uQdaf3yKre0/k+7kL+X7uBgJrOPL93AMc1gjk+/kf4LBGAYc1GjisMcBh3Yd8P2OBxhqHfD/jke/nfmCyJgCT9RAwWfPkBbKHNR8IrL/KiSVOtA3Yq90h9krIEHslPPmKfEX4IQJLlMnlcq0oD7FXIhVmgReNgLpqEmaBF2cDe9U0zAIvzgmz+4h2wFv1At6qT5jdR/QF6ur6MLuPuCnMAi/6A3t1M7BXA4C9+gOwVwOBvboF2KtBzl3O3eJW5x7nfjHYrXJvFqOAsXrWHeYOE/OAtPozkFZ/AdJqoTvJnSyed6e4U8Qid7o7V7wEpNUK92svKVYCRbULKKrPkUd+N7BUXwBLtQd55L9EHvl9yCP/dYickkGInJLlIXJK1grzyMvaIX5K1vHme1vkCSFCSrYKc//Ii0KclGwd4qRkVYiTku3CrD+yfZj1R14aZv2RHcOsP7JXiJaSvcOs8fJaIKHG+Kv8nfKBMHOP/AuwTouAdXoJWKfFwDq9DKzTEmCdXgHWaSmwTq8C61QNrNNrkZcj78llkb9HNsqPgGD6FAimrUAwbQOCaXtkT2SP/CyyN0jIHSFqxa4dIpLsWIhIsuMhIslOhIgkOxnm/rFTYSZ6Ox1m/bEvDHFGdpsQZ2S3DXFGdrsQZ2S3D7P+2JeEmejtDmEment9mIne3hxifxwRYn8cxxLhXh5IH+8YvM/OGrxPDd6nBu9Tg/epwfvU4H1q8D41eJ+fdgywPDm0B8NjpmxU2N9LeDY8esjboGQs9FzsQpjDFBZTRiSyjoqkIoaCFgjGBWFPr/KVwKPuoKaLbKG0BokPNeqENlRaKZTvmvZXWuBuRk16CWg7p2cM+36f76IvlzFj9Pi1hO+aNicgblxYFBx6rvqofVjY8u9QnmWM0oe6D2zf7og6eLszCtfrjTbhN1C4CdoDZqIObGDiEYwh/Xsz8NR6vZO2T8avjA56Br+qGCFcp41ZyxltPo654xth4aAPij4WSRsbsE6M1LIPHVlbGg2ewzES9eEtFLAvMoevhLfHXkq0C+owZwHexQhVjo9NtAXj3OjX4g6yAiUtu3iv+ASnuBIbxTwLiFWmB1V5b2jF/wI1aW3ibNYzxhYz7vXHr7Rz0L5Le9sUjBXP/2iG3jJfwyBcY0+vUFeN4B2i1Z8WOJXVGuND2/M61OQpC18yHwf6xjZp4WbU3yvH0T/tEw8b9J/WlE8UAOlfUf6Lx1H+VZr21FtuMSiTFMisLm9rync512fqNl16g4mDg52PMW/05yuLDmn1WXwj7UBtcG1pSpbgEvYS3Gff+uF+B2Pu6DdgTUa7fYr64CFEPJG2HWKm3kXNDcaIsf4K3G+C602YU/bTpD1SWtKgvWpNdUTlkPZIdU6DY6nO3qZpz3nB+IqVBtXR/pTU9KYwXNONGV9izDuzNr+s6cQn30Ocs7LHE7XRx5jx7sZctzXm+jJjrjEL7g491w7XFOPkYSn0dsBiR1paob+L3lSfUdlc3fRjLNC/Ujqoc5xF2I6Pt/ugPXoqnHfQ/lijt5XGjNA+x/wy/ThiR/r9KGV8Rsb21jOivFLg1S7t91foMVd1QJOkQEol8km3CvfJOQ9iHMDxPNiV3RW4Q4/Ta0bfmHOKK452RMqv0fotyu+NsSLHJlKSJbmuvR024zpGbzlfUf2s4vxtda8U9RaMESP29iTwItAwPYdqRVD6PK2pS1HvqwZtrDDodrmmW34v6UpZgm/AmIACPXj8vK64A0+aV4E6tMozzxSphbZbenIsXBMpRsli8HblqSayj4jFy9H+e0Zv4Z8Xf8UMss3vjW8kigHWUBfrwimHdDuHKF2M5wWacuSVurR7oU32eZ5xTanRAD3BNSWm6gORQUuMldJN95Yy3f3IqMN8HMyWktX0Sa3GgcSRQ/Q64rf7jKU39BmXOgM8hE47rJEtmirUese308/GLADqfCBqArBqMz++g5Yj8OqUgU68MrQPLupj9Lyv0Rp5JvQos76PnvgHSCeomdUjqfLXAyNArcl5IpSSlJWqz6PCa/ttg1apm5FDDgl/VZreOEOLo562Hy1T7zrLWE1noiZ//QPWCPvAOQJfVTz/dKOkHCcFUl+6Tc84S49Z5yZrfUzSJ0b5BdyWg5qK/5AnYCRVJo4jhraWxf3vcAcS1ici7CXMwie4P0fzBBt6l6oDLJvLkYQPwf4t6AE6nl0/vO9eDBxBg7BUHIkURc9An7AOdTm7NnvCNYsx34ivhsylzmlT1yKtCtwh8pHjwD4w5wjP4C4aY0sZTR640BgZ5s05CT35CyhhM+ZrMspfo+TY0kPFLF3ESsOHTGSW4o0GF1I8DZJUrWh42h2eBkHdg1gwcrMKXL8Pj+iFmkcpPsyzaqjFqTWOa3oOP8U409dq6AD2n1EH/m0HXk2FUqTOudoowc/L4LMtA37QHQjeWAvlMEjV3xj6LXRRs74HpKoPn63jYNw2qLENn8LuzH4cFEKdti5Gez5KarM/4JoymrqK4oH4dReogppDgJI+ImjRglkesBaYP0gQJfQrzDW96/9rlJQ7q9DO1SiBDbG7o+QMLtUUpXZGpIGn0H9S1PW4wzVyp7FSuHaQfU/2Rq/wRcQaSHAJylbuViiLJTB99L2L6aD/17UcUboT6Zwrhb7HBH7lfpM00+246zs152FNolc8fkUlRwbtYCeltNM7dEmdmTPi8fSOJ9BbrlDDU2qW1IflNs097CxGmGjTfSE9SHq5ucfE99rk5JfpdWSuKV6r3T3lVws9+y71ECIdQLH0M3vwuvtAgvuYEXt26Cv2cO0x3wo0SQ9S0ofE9JlbzQeFUM6Sw1Nb7onV8RXe8hLrQM+kbxbaMrE/lAXeFrR5IuoQAco949koKVPow4dm6F2C+x1RIocOURjMi+HiVyWvN6LOEZRbUe7Xz7pAFNKSoHQA36CED9F/yot/4SkDV+5Banj00K4FHwDOwgfGQaH4uQ+l5N2F1tB/mzggQxO2r4QUmI5fnSOZUjlJf7vSq4mww6iqvGy0V1BfiuJbLLRAywPLpuGdshzuA8et0MdE8fAkmN349Y+ofxjXXHGcwYl4YzOMKvgV7RhqdSf0OrVBD7RvEK2msigS7Y4Rc8kny9Am9EOX+33s3fzvDY4BJKxzO/ocM7gTbSwf43ubo4cDaYtASZ2HaClq1+BjzBvokUMSoQAqpSwwMWU29nruDNQkhZO2oYeozH3V+FIliVDnWoMmr9bPunmUsGAo6bZacyF7AN7OcghK2kDQW9oBXKLeMA4eMIPeCLTA7H7keNxZdMJ7sS9TWhx3JZ0gBzFfKlslVreycsC+pDQKcmnsXBzmYpunbVOkWEYeSOCPxE2H25buH4LOcwf39WjhNW1VUAisf2i+d9QJZMTBkd6IyKAmQHsXeONRPH8YrqGJiY+0FGC0DTOXER1G3ak0v9N+pFJpohQZh/EbrLtKXDN2isgdImGxm+DbyXsVCph610fHtukhgtCDnu9xf/GtUf8N9JNIZMQ6KM5GfYkZuxinBU3VQfvcxSvOiXWn1gJPwyU+lEg95o2CPFJ7oqdBUbRPMidXA81LVTvMq8UcgkToA33jAl3LXadj7IuV/kbEN1t+3uAnM/SMO6ej/6hPK5YNbU1hwFHTQdZXRiYRaaju8C2MGYXlx8sbVA1+Qsy7xx0cOQYjAtkadwqwoihsF/kV9pX2BXgW60syWx/HcD9GnqffUVZiJKnbcK/hDMSdAbiDHYcLpLayrz6r6ZnUK683uHEtrdXb/Q09Ae1zjyC/QMn4AFgsOZs2bNpS4noPynp4O+1LLGE9cIGIRERLDd6nBu9Tg/f5b8b72G7gnuDGrDDOJuSwIVfO/NyZNMQB1W9RgwOqwQHV4IBqcEA1OKAaHFANDqgGB2SpCAEVhTtT7+/l2dgx8Fx1ZuphFARjaLm/wb5EwscrGZvNmE9a0GnfYmQjdti009tEZNBWR2wRrfjMbs3zd45oezDPL+b+UtloYadR+duJRaL1nfmiDb+9S2sBf2W8KzMy3BXigFS+Ze7qmJ3nVLyX6KeWhoWVZygPNPqD2F33Rn4191v4lbux+UabjENmXCX3iwvwK/ovmLmA2RPgx6Y9Utn2mnLPh6cW41fGlX1Fi4sxa1HdpmyBeaENpjXuP6nnkSdQqDkl0uFWeJwQayTvwVtg/ZJ4u8oDT8sZEE92O5TckRdx3c+gCpbMWkIrMuNtxuo5ktipi+9hY+C309tDC9Mzxp6bVsZbUJNZSxjBTmsKvQf0kNCePUDTlc08QXl8EaiaGQpU/CdQPDZjhk/C9XV4C2OwT9G9sp/C+DBT93jDlnMRrgcZVsDexldsOpb+VYzcvQb9D9aU7whN/4ryX9WUr3wU9xj0/52xCh406J/2wtaa8unRoj9NtQkqchmvSEtnL9yhJaYS92eg7K5tsYrqOO9XGuPZCSXPe2IMai+DMrl2mqMOc3NsxTUsXur8ceTyUDnSI7hmjD09D//ADNKGAS+QcxpKjqFJe0BVqDPQWxg0wJFZoWlPUV2/46juEoP2qg0KvMigOiPrAelNZcvfasx49XHz/io8deizsrwiM7ZCgtB6Fzdm/JSfn2vFRflFtAefa7yRpxTBLss4VZf52kA56iR6xuMxrvifxlvopyLfJnKH9lrMuOLJ7GEFSs7OGlptjXYoBShTJhjUQg/qLowDVorNE14YJ8xcSLTw0aNIVAXjou826OEXmloEx4F88jHDK8IVwVjW13VJTyCt8irPPCQXs0SpVcnYe3I2nh9x2BiHzfq+6tsIlP3BByyjt6S0ofpZxfmnGv0h9RoZBxQN3wrbM/Ou00NOrBb920TANTKod91/oNvhBt3SM3+q0Td6O4k8OqBLm2NCyUU5Qq8mZ4fYvRYGNfIt4Mwmb1cRieib8jnfj1EaZvQW3JuyRtHPPqPNqUZNcvt+4ANDUR9oC4VEBkXxDAtJPsn8YrQfTzGumUPkRvSEpzIRtYE+qLjfZdZP64uRk+pLeU7cAqOf5Oe0ExNZnEQ7zAJwN1qm1DN4u8rTZOgzzmfa72E/jTXS3qBkzi+8duq95D/kY9RquLqZ44PZRogEZH6KK9A++sNsayr/DvsJPcqsz6xnLvGtt1HuGyPJ99LHWBd3FgJrQMQBNaWVuD7FGEn2/FW1Xtb+yFXs51HSC8Gx3YPZYY6Y243ZvwVfcYoeSYXRIHKBWGBwPKVxsaRuMNC4rq9nnKVLfnWm/jp1DhTlVzt6XfArOQO1RNChOiXH1NbggZfAqzJy2OV6x7POTL1CFU8AqoJ1lD75KEaP2NjdoAdIRjkL90fgZJzngAN6D20SXQXcun0n0DfALqmeEKnXC2P+AzwDlObETsZ0/+U03GGmAJ7gySwD1E+YD6WjMbb8Fuoh59EXgTq8Xwc9WYo+j9EUK4HK4XkojHJXsoYYE8pEau8GbySvVpwBGpdjZrJjffIoZkiBp1dxdeiQkrz0bt0ThzyBWhzPi1kK3hVVT037sW9H6QAXoz7P2iDHoM7J7DauQW/MCUgsXiXar4P2H0a5Hj5ePkUNGZkNzfr0G1Oa223wFcyhQA7GTHNpUIiN8ccsU6u3z1Rfsfanp/5ojBKlz6/wazk9+Sif1l8kkRHA5jlNzKt1scGLKE34FnIq6n690c46Pc62jZ5zBrl2mNlnukEDVxy3r+FXdzd+ZdkZtMqzbrnruRwl8++s0mtWUQ59ZaQKyAVVUo6Ql042+Ax1g9VaKin+3/TYa6XnU8djtjggwpwbOUoouxq7BuowPAEHyAV18g51UeoV5ELUim81ahrXSh8GRt5ujOs5GHOMjF0JHBBwiEpjIW7rQpRzfn5NqWvqt/WN2aEEJ2dj7hiiUc7Vq0/xZO4yWuMEOlIXaWDrz9ekz1xppGOMkbwLPI3nW8GfqTTkVgZ/WGC0xl2P0HWIp1NUSj2HJTPdEMnCPCncUUI2UQo4QCJQZ7PfwduZQ4p5tajHAkegdHVaEojNoRSmJkPkZgOUtxgyjjg+jjalaiGcL6Vdm1mEOHrUK97iXh4jTy2dmjBzp+7GNTXqu4ADetwYW0o97GFVRjBiyrjnosw9K2xZ/AntU3diybgo4muYK2SqXi8KJ/IdnuqC+kCXU08ryanwmngZnj9Im88EvbrVKmMO5XXgEiuMt9+h+6xKIOmUrcnUw7GXVDsCcgyuBa4v5gll9hDm6j0HHJgSAdxYnZrKMx+5U/ilngWnk0FFfAu5HGUB+X9f/V1Kk6TlBHYG5olzkLHXGYUvpR7+GHrCU/Y4/g+inIqSmJreBq+gfGGOy21o5wBqnkNMEH6lhYcWqs26VDo5ezVN1/zRtoAWmDWJkpfcewDk4ABj1t40ZgGr4CiNgq1xnwWEmqkhEK2pso2cABzQnVhNxCHeaViZiKeYgZIRIY7WstTpWsu03qIywVGmk4dTCzrfKKHBKgQ3bWXX4u3Uoqk9VhktH4CutdrQ5Jml5V96DSo0K3XFW43xxMoVQNzbjF2oIB1qWWa26TA78NNok9cNDUpGyX23Q7wV5eZGYy3QckKtknhS7L4d7gKWGX1jOc549iI9ehK4JwH8o+IStBhw5EdoDqD0CureXNfMrs6dCPmDaRukPnm3UV9F3qDk2a/kSMS5EJ/CfMrMrcPTYOvpdpTkuhTlFP0WorFUVB+1ROrqzC3FHR9Hj7tazhElgoWSFqSTjLKAOi70NODOJEaDVK0k7BRjlXUz5rqpsUauxp2z0AdTY4H0p8aiqLehnn1yRVKmkr8PGxRFO3BtQ7fhaiWdP6rpX2UNI+/9zhg32gzJi0IeWIMDqsEB1eCA/ptxQGeKreIz+0tnsfOys8R5xal2XnOWOa87y52VzirnTect521ntfNXZ43zjrPW+ZuzznnX+dj5xNnkbHZ2O184e5xvnf3OYeeIa7nC9UqDXO6e7bZyL/ZftcKdXYhaDyM3QmRlqL+GeSlDORvyzS2l/1D7DbGsoQYd7ukOhwyk9F/SYEVJvxclnVSU+LAo7WPFaaX/kgYiSnsnUdr1isrSf0nWig6l/5LkLa0+S/Qs/Zf0KFHaP4jSHlqU5HJp3VmitC8RpT2yKMkMUdKtxGOl/5JmIEoaiijpfqKkPYjFpf/qn8NA/f8t/w/BVmYjAAAAAQAAAADbY/02AAAAALnmmD0AAAAA5F0LYQ==')format(\"woff\");}.ffb{font-family:ffb;line-height:1.096680;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ffc;src:url('data:application/font-woff;base64,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zzsvOC86LzkvO684rzqvOa87bzhvOm85bzvvOO867znvOx84HzofOR87nzifOp85nztfOF86XzlfO9843zrfOd87Pzg/Oj85Pzu/OL86vzm/O384fzp/OX87/zj/uiOu47qu5/pu4IZu5MZu4qZu5uZu4ZbuGO6Y7lju2O447rjueO747gTuhO5E7sTuJO6k7mTu5O4U7pTuVO7U7jTutO507vTuDO6M7kzuzO4s7qzubO4od3Z3tFu54qpbu43bup3bu4M7hzunO5c7tzuPO687nzu/u4C7oLuQu7C7iLuou5i7uLuEu6S7lLu0u4y7rLucu7y7gruiu5K7sruKu6q7mru6u4a7pruWu7a7jruuu567vruBu6G7kbuxu4m7qbuZu7m7hbulu5W7tbuNu627nbu9u4O7o7uTu7O7i7uru5u7u7uHu6e7l7u3u4+7r7ufu797gHuge5B7sHuIe6h7mHu4e4R7pHuUe7R7jHuse5x7vHuCe6J7knuye4p7qnuae7p7hnume5Z7tnuOe657nnu+e4F7oXuRe7F7iXupe5l7uXuFe6V7lXu1e417rXude717g3uje5N7s3uLe6t7m3u7e4d7p3uXe7d7j3uve597v/uA+6D7kPuw+4j7qPuY+7j7hPuk+5T7tPuM+6z7nPu8+4L7ovuS+7L7ivuq+5r7uvuG+6b7lvu2+477rvue+777gfuh+5H7sfuJ+6n7mfu5+4X7pfuV+7X7jfut+537vfuD+6P7k/uz+4v7q/ub+7v7h/un+5f7t/uP+6834jme63me7wVe6EVe7CVe6mVe7hVe6Y3hjemN5Y3tjeON643nje9N4E3oTeRN7E3iTepN5k3uTeFN6U3lTe1N403rTedN783gzejN5M3szeLN6s3mjfJm90Z7lSeeerXXeK3Xeb03eHN4c3pzeXN783jzevN583sLeAt6C3kLe4t4i3qLeYt7S3hLekt5S3vLeMt6y3nLeyt4K3oreSt7q3ireqt5q3treGt6a3lre+t463rreet7G3gbeht5G3ubeJt6m3mbe1t4W3pbeVt723jbett523s7eDt6O3k7e7t4u3q7ebt7e3h7ent5e3v7ePt6+3n7ewd4B3oHeQd7h3iHeod5h3tHeEd6R3lHe8d4x3rHecd7J3gneid5J3uneKd6p3mne2d4Z3pneWd753jn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TIODaXAwDQ6mwcE0OJgGB9PgYBocTIODaXAwDQ6mwcE0OJgGB9PgYBocTIODaXAwDQ6mwcE0OJgGB9PgYBocTIODaXAwDQ6mwcE0OJgGB9PgYBocTIODaXAwDQ6mwcE0OJgGB9PgYBocTIODaXAwDQ6mwcE0OJgGh2FI/u9HNXr0aL4qvoQv5avmq+Gr5avjq+eLjYqNio2KjYqNio2KjYqNio2KjYoNYUPYEDaEDWFD2BA2hA1hQ9hQNpQNZUPZUDaUDWVD2VA2lI2ajZqNmo2ajZqNmo2ajZqNmo2ajYaNho2GjYaNho2GjYaNho2GjYaNlo2WjZaNlo2WjZaNlo2WjZaNlo2OjY6Njo2OjY6Njo2OjY6Njo2OjZ6Nno2ejZ6Nno2ejZ6Nno2ejZ6NgY2BjYGNgY2BjYGNgY2BjYENOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKLzis4rOq/ovKqHcJNRW2274VbmD4i8IvKKyCsir4i8IvKKyCsir4i8IvKKyCsir4j8vzhs4VGbb7PJxjtsvu0O/CEjVF5ReUXlFZVXVP5fFbb0/3qQzCsyr8j8vyJshf/9v7BC5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0XlF5xWdV3Re0bnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQufD7XPh9LqQupC6kLqQupC6kLqQupC6kLqQupC6kLqQu/D4Xfp8LpQulC6ULpQulC6ULv8+F3+dC6ELoQujC73Ph97nQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSudK50rnSeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeU3nNZ3XdF7TeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUPnDZ03dN7QeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUvnLZ23dN7SeUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReUfnHZ13dN7ReU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7TeU/nPZ33dN7T+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdD7Q+UDnA50PdI6HEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHD/eeLDTqHxAkkTiBxAokTSJxA4gQSJ5A4gcQJJE4gcQKJE0jcf77YoHNEnCDiBBEniDhBxAki7j9fbNA5IE4AcQKI+88XG3SOhxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjBwwkeTvBwgocTPJzg4QQPJ3g4wcMJHk7wcIKHEzyc4OEEDyd4OMHDCR5O8HCChxM8nODhBA8neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD6d4OMXDKR5O8XCKh1M8nOLhFA+neDjFwykeTvFwiodTPJzi4RQPp3g4xcMpHk7xcIqHUzyc4uEUD/efr+r/AI/przEAAAAAAQADAAkACgATAAf//wAPeJwl02dvFEkQh/Gu6Soa0OjekcHknIMDOfPdSO8OIQsdQogzxgRjDJjgNRd1d3BHdLZ3vdG7DtgmHSaKx2alKf30X2m6e6rLiXMudk7KZIWL3Hon8jNPjdxwkTTKbdwkd5yXu3IP35dmnJAW/EB+wb/Kb/h3+QP/KX/hv+Uf/FAe4X/lP/xYnuCn8gw/lxe4Vdpwu3TgTunC3dKDeyWJU9KH05LBWcninORwXvK4IEVcio46iY5Fx5yPjkfH8YnoBD7py534Cl/pvK/yXbjbj+Ix5Vxao/87r+/1PR63w87bkfCjk3AqJJwPLTF7i1vjPufj9A/TnTjl60STT/XkWt9XmXh/BbWSVSKf9Emc8inc59m5T/s0zvgMzvoszvkczvs8LvgC7vf9uOiLuORLeMAP4EE/iIf8EB72w/ilf4lH/AgenTgLp6hh/xf1oou0VmvxJb2E67QOX9bL+IpewVf1Kr6m13C91uPreh03aANu1EbqTb1Jcktv4dtKx7VJm/Advc9azdpMktAESYvSQe1Vvo+mNU2e0Qx5VumR5jSH80qPtKAF3K/9uKhFXNISHtABPKiDeEiH8LCO8LZRHSUZ0zGSV/oKv9bX+I2+wW/1LX432btxHSf5oB9IPupH/Ek/4c/6GX/RL/irCZ2NLHJi3ryLTE0xPzzFAv9Otakk02wayQybgWfaTDzLZuHZNhvPsTl4rs3F82wenm/z8QJbgMusDC+0hXiRLcKLbTFeYkvwUluKl9kyvNyW4xXGhNlKW4lX2Sq82lbjNbYGr7W1eJ2tw+uNObQNtgFvtI14k23Cm20z3mJb8Fbbyim22TaScisnqTDupFUad9KqrApvt+14h+3AO20n3mW78G7bjffYHrzX9uJ9tg/vt/34gB3gzQftIMkhO0RyeGJSmJFTTMrpcJpaHaqpZ8IZ6k/hLPVcOEc9H85TL4QL1JrALQ21gfsZ6kI9tSFwl0JiYtaYslZmrS1uc1HcHrfjjrgDd8aduCvuwt1xN+6Je3Bv3IuTcRKn4hTuY06jb8sH9rYAAAB4nOV7CXwWRdJ39THd03M8TwzhEBECxhgBwylR5BZCOESOCAoRwQQMGGI4jCgoiIiAyLKKyKFyHwriihceILiIriKyqFwiKqICIiAiHlxfTT2Ngovv7ru73+/d9/uYH/+aZ6aPqv9UV3fNdIABgMemiAyQvQcNKIaK+bcPKoKGNw3qczPMKuo9pBg2gsQycPIk+MBBgQYP4pAE50AZqAAV4Tz8zbp0bpEKl1GpFCzMsKSwZX1bOhnLp0BZKAflbb2zlQ5+t/QpLX5bI/zdGuVAtOnYMQdadr76qlTomdu5XSpMOEsb5heLzq6jd1q5mC15pvYS77t/t51TpZ3/otdzqXSl/LqD8+HJ/N5FQ2BZfu/BfeDV/PwBJfA64SbCXQXFtwyAI30H9c6HYxEyt6jfTb1ZxaLiWwew1KJb8otYOmFNwvqEDfHmINbslqhMdkmE7QdjL6zz4H7Ffdm1gwfkl7CegwfXrsMKEOuyIsR6bNDgW28czO4gHDn41pLBbMyQqC6yifZUQK0BOaoE50NlsjFAdJGVhKUJZny85thriV+aeDv9PkN+Aa+GlpeoTOL+r1cYVCEsb9mMNIieZPSLEQJhSFiOsCxhKmEZwopUrypUo18X0K9UuPC0EuedhilQDwqhBIbCSBgLk2AqzIJF8AKshLWwHjbBDvgS9sMROMEUi7FyrDJLZ5msAWvCslkHdi3ry4aw4Ww0m8Ams0fZPLaEPcdeZWvYOvYB2852sX3sMDvGJQ8SFrAlVq60couVn9IoYOwIKLzAeElCipbII0qZQlK6Q01gZnlLE1d9K4NGidqxTYnWUlpYucvKfVYeTpRPOZaQZcsl6pVtmLhfdrSVryZkuWwrNyRkefu7/KuJepU6Jn5X2pGQ1ZZTu/yCogsSPci0JRfekZ5zUaXEr4t2ZqRm9MyYk+g9w9p+8RgrJ1q51krb68XbrNyJ/ERyn5UnEteru1aOt3Iy+Q6rPivxu5G1vtFBK3+00tZvLBPlmw5K/G7WE3/HQMq75Uh5jxyFVyO/fRgeEZvxTjIos1DPMAv0NP2wfgTvKvY8e5G9xF6Rz8kX6PeNWI6xjexD8r4kcPhRfowf5yf4Sbzv8Lf42/wdvolvxV+l2HoMMqAF5KGvu3ieoucA14/pWYgz9OOI0365s4juLKA7806/YxYDN4vMk4gLzROIC365s5TuPEV3ltAdtCjS3cwz8+34Ssb/lcj+dEQh66kh+h4868nH8wmigfhYfCI+E5+LL8RXYo/4WnwjF8hF8km5RC6Vf4rslq/KT+VOuUt+KXfLvfKA/FZ+J3+UP8tjDnek4zplnfLOuc55zvlOFaeqc4FzoXORc7FTw7nEqeXUceo7DZzLnIZOI6eJ08y5MtIO+Z2Btj6uZ+k5ep5eoBfpJ/VivUQ/pZfqp/Uzepl+Vj+nn9cv6Bf1cv2Sflm/ol8NPgg2BVuCbcH2YMdptlUg2y6KIonq9P+AXQymkGWJqJiB2OzvWrPs32/PGVpxmEsRHTDiRyuKEA/BU3kzkLwFvxIu5K14K7iIt+atIYO34W3hYn4Vvwpq8I68I9Tk1/Hr4BLeg/eATP4QXwu1cJy8Bfk4Ut6BAv4R/wj68D18D/Tl3/Pv4SYcU0ehUGzGUdlP7BA7oL/4VHwKN4udYicUiV1iFwwQX4ovoVjsFrvhFrFX7IUSsU/sg4Fiv9gPg8RBeT4MlsPkMJiNo30UzJGj5RiYJ++X98NCiQcskk/IJ+AJuVguhiflU/IpWCyflk/DEvmMfAaeks/KZ2GpfF4+D0/LF+WL8Ce5Qq6AZ+T78n1YJj+UH8KzcrPcDM/JrXIrPC8/kh/BC/Iz+Rm8KD+Xn8Ny+YX8Al6SX8mv4GW5R+6BV+TX8mt4VR6UB2GFPCQPwUp5WB6G1+RP8idYJY/Ko7BaHpfH4XVHOAL+7OA/WOMYx8AbTuAEsNaJOTF40znHOQfecso4ZeAvTjmnHLztVHAqwDtORacirHMqOZXgXaeyUxnWO6lOKrznVHOqwQYnzUmDvzrpTjpsdDKcDHjfqe5Uhw+cmk5N+NDJdDJhk1PbqQ2bnbpOXdjiXOpcCludLCcLtjmXO5fDR84VzhWw3WnsNIaPnaZOU9jhNHeawydOS6clfOpkOyfhM4XTKZuhhJLsUaWVYY+rQAVstoqrOJujyqrybK6qoWqwBaqRaswWqmyVzZ5QbVVb9qTqpDqxxaqr6saWqOtUHluq8GDL1DNqGXtWbVfb2fNqh9rBXlCfqk/Zi+o79R1bro6oI+wlfbu+nb2sh+k72St6pL6brdT36HvYKj1Gj2Gr9QT9AHtdr9TvsjV6g97APtBb9Vb2od6ut7NNeofewTbrz/RnbIs+5BaxrabYzOW55iVzjI/3lKf4ei/FS+HveZW9ynyDl+Vdxv/qPeRN5u97U7yp/ENvpjeTb/Fme7P5Vm+R9wTf5i32lvDt3tPe03yH95z3Av/EW+4t5zu9Fd4K/rm3ylvLd3lveX/hX3vveO/xb7xvvW/5Ie+Id4R/5zfxm/HDfnu/Pf/B7+zn8h/9rn43ftS/3r+eH/fz/Xx+wi/0C/lJv7/fX0CwNlgnWPBh8KFwg83BZmGCrcFW4QUfBR8JP/g4+FgEwSfBJyIMdgWHRCzMDrPF+RRrKp8Way6OZg/Hd0InyUnGUV4mMeZpnHMatxfQuOpG4+peGlFj8Kkfg3H0bJrRs2lOz6YFPZsr6dm0RN7XsVbEbG7ELHuPmHUivXmbSCfeMdKJ33BaXK/8H6TTf8VTNM/7EEZxEKNg6yj6YezriDGvB0a5dzC67cGodlRsjuKQvN857pxwTuIowRGC48NVBsdHHMdFOVUexwWOCRwRbXEk4CjAMdBd9VB5OApwBKCHD9PD9Z2Rd6Nvj4l8Wr+L3rwVvXiH/gz9NAX9E30z8kz0y0e8qeiXsyN/jLwRffE573nvBfTDFeh/q73XvT97a7w3vLWRH6IXrvPe9dZ776EnHkEPbOo3Qw/s7HfxcyPvQ9/LR5/r/3ee0P9/bEQ5yq++UT1aBcqN8gO5SW6R2/6nRxEvJq1qoB4FmBFhNssb8UZ4vSlpcz2/CWfwkXwsxPmj/FGowJ/lz8K5fDl/CSryV/grUImv4CvhfP46fx2q8A18A6Tyr/hXUJXv499ANX6AH4A0jpEL1wBH+BG4SBhhIEOkilS4WFwo0qG6yBAZUFNUFzXgElFL1IJaaH8AtWUMc5+rZDnZEHJlI9kCbpctZSGMlP1lCcyXg+TtsMQpdobCc84dzjB4zbnTuQtWO3c7d+PMeK/zR5wZH3IewhntEecRnNGmOY/hjLbYWYkz1yrnEOxTFVQVVkVVVRewi9SFKp1VVxmqOqupaqrLWS11hbqCNVZNVVPWRDVXrVhTdb26nrVUN6jerJXKV8UsR5WogSxXDVaTWFf1oHqKDVGfqa/ZJPWN2o9z3EH1LXtMHVaH2Uz1o5ZslkYXZk9pT3tsqQ50EntaV9OXsud0lu7C3tLX6GL2hZ6sJ7OTeo1+g4Peo/dyjk9Ucem6bnV+rlvTzeeN3D7uVD7Ene4e5Yvc4yZVeKaaKRCZpq8pFQPNUDNWjDLjzXTxkHnUzBXzzAfmA7HEfGS2i6fMDrNDPG0+NTvFn8wu86V41uw234gXzAFzQLzqlffKixVeFS9VrPSqedXEKi/NSxervQyvuljj1fTqiDe9el498a6X5+WJ9V6+VyDe8/p6fcVfvUKvv9joFXnF4kOvxLtVbPFu824T0erQxTX3ePStCXwCZrYNRBZwsU0cwExrgTwCFeWPTiu4GVfIK+AlXFd+ApjvOf3BgSRWjdcX2fJazFAaYp7UFjpDd7gR+sMguANGwXh4EKbDHHgSlsHL8Dq8DRthG9beC4fg52jBzwIf18z+63h8THK1v53kKv8jkq/520iu9LegXI1nm0mu9jeRXOV/SPI1/wOSK/2NKFdhub+SXO1vILnKf4/ka/56kiv9dShfw3LvkFztv01ylf8Xkq/5b5Fc6a9FuRLLvUFytb+G5Cr/zyRf898Fjr/eR1ztb0V83X8T8bV/gZGfLSM/WUZ+tIz8YBk5Yhk5bBn5zjJyyDLyrWXkoGVkv2XkG8vIPsvI15aRvZaR3ZaRrywjX1pGvrBM7LJMfG6Z2GmZ+Mwy8SnJlf4B4uJ74mIPsfMJ4sp/npGgXIKRoGyCkSAlwUhQJsFIkJxgJEhKMBLEE4wEsQQjQZhgJAgSjARegpHAJBgJ3AQTgU4wEagEE4GTYCKQCSYCkfCNgCcYCcAyctIycsIyctwycizBSMAijwj8iJfgHOLl6L/ISF3LSB3LSG3LSC3LSKZlpKZlpIZlorpl4mLLRIZl4iLLRHrCN4ILLSNplpFqlpGqlpFUy0gVy0hly0ilBCPBeQlGgooJRoJzE4wEFSwj5xMjF0TeEVwSMRKU/xcZ6WCZuMoy0d4y0c4y0dYy0cb6Ro5lpLVlJNsy0tIycqVlpIVlpLllpJllpIllpLFlpJFl5ArLSEPLyGWWkSzLSAPLyKWWkfqWkcuJkabESCvylHrECAcW1af3VV0hg+1n37IT7CTnXHDNDfd5jJ/Dk3lZXo6fyyvyiaKpuEWUiIFikBgshohbRam4TQwVt4s7xDAxXNwp7hIjxEhxtxjl3BNEb5Iy2DfsIDvGjnPgjCvuco+HPM6TeBmewsvzCvwB0UT0EHnietFT3CB6id7iRpEvCkQf0VfcJApFP9Ff3CyKxABR7IwKovdyCnIjzbHXUbSWUZDxm9+n3xf2PdCpVVjN6G0Ql1TiXbHJlqh0WolLTruHanOJpUHMFovpjXRbvOZBfZCIyVARqomnQHAp5kZSLEa5hH7PjyT+nk9fWWJiqb261F7FcSvWiw14Nw3iYqaYJR4UD4nJ4mExRTwipoppYrqYIR4Vj4nHoy8SEWeoRWQTF8+IZRCI5WI5xPBeW9QhW+SItqK9uFp0Ermi69nYO9tTCtuG7cOOYecwN+yKGlUTrURr0Ua0Ex1ER9FFXHPWJ3MWDwjbhO3Cq8NOYZfwGqvRv6Ml9m+y7JRG2ahRW9ToatQo9x/1OtSoLWrUETWK/MpFu3LwSbQT7fFJdBSdQKJ1XUGhNaPARe3bQyXUvzNUDq/BvlNt71grqhPViMr/o+Moai9qjdqKekcrsHe0A3tHS7B3tAV77yGKsXfUFXtHbbH3SF/sXabykB1m37Mf2U+8kPfj/fnNvIgP4MX8Fl7CB/JBfDAfwm/lpfw2PpTfzu/gw/hwfie/i4/A9f/dfBS/h4/m9/Ix/D4+lv8BJyomuBBCCkcooYWL63pP+CIQoYiJuEgS54hkUUakiLKinCgvKohzRUVxnqgkzheVRRVc/1cV1cQFIi3KAcRFmANcHGUAoqa4RGRiFlBb1BF1RT3ZXl4lO8irZUfZSXaWXWSuvEZ2ld3ktfI62V32kHnyetlT3iB7yd7yRpkvC2Qf2VfeJAtlP8wTbpZFcoAslrfIEjkQM4bBcoi8VZbK2+RQebu8U96nXlIvq1fUq2qFWqleU6vUavW6+rNao95Qa9Wb6i31F/W2eketU++q9eo9tUH9VW1U76sP1Idqk9qstqitapv6CI+P8fgEj8/UTvW52qW+UF+qr9RutUftVV+rfVFGoA5EGYE6hMdh9T0eP6gf1U/qZ3VUHVPH1Ql1UoNmmmuhpXYwV9Da1QazBR9zhVDHdFwn6XN0si6jU3RZXU6X1xX0ubqiPk9X0udjJnGBTtMX6nR9kc7QF+vquoauqS/RmbqWrq3r6Lq6nq6vL9UNMNu4TF+uG+ordCPdWDfRTXUz3Vy30FfqlrqVztatdY5uo9vqdrq9vkp30FfrjrqT7qy76FzMUbrqbvpafZ3urnvoPH297qlv0L10b32jztcFuo/uq2/ShbqfvkWX6IF6kB6sh+hbdam+TQ/VlXUVnaqr6v76Zl2kB+hi/bnepb/QX+qv9O4o29Ff6336G71fH9AH9bful+5X7m53j7vX/drd537j7ncPuN+6h9zv3MPu9+4R9wf3R/cn92f3qHGMMtq4xhjP+CYwoYmZuEky55hkU8akmLKmnKlgzjUVzXmmkjnfVDZVTKqpbmqYmuYSk2lqmdqmjrnUNDCXmctNQ3OFaWQamyamqWlmmpsrTY5pY9qadqa9ucpcbTqaTqaz6WJyzTWmq+lmrjXXme4mz1xvepobTC/T29xo8k2B19xr4V3ptfRaedleay/Ha+O19dp57b2rvA7e1V5Hr5PX2evi5XrXeF29bt613nVed68HZlbXez29G7xeXm/vxijD8vpghnUT5lf9vP7ezZhhDfCKvVswxxroDfIGe0O8W71SzLWGerd7d3jDvOHend5d3ghvpHe3N8q7xxsd8lCEMnRCFerQDU3ohX4YhLEwHiaFOWEHjCkp7BD7Dqe+I+wHnO0Sb+4n8omYtUdvJNLpjUR3eiMxVo6Wo2EcvZEYT29hm6uFajFrRe8f2kbZKrvOTXKrs2K3vpvPxkVvIdhLwa5gPzseHAwOcZfeQvjhVeFV9HV0DM6NyTj7pkMOrsuGR++L3IPR167ozJSns2imTYJyUMlkRb9NfcQlBlcwerGpi/gklW2BZ1MwbwywvQpQGdJMByrdGnGuyUacbXDto2eallQyqtPD9qTQ6nSewWvzehz7kKN4k/9NkVKw/7uxUm1XO9Sn6jt1RJejmLkCo+UaimJ/wYikKUJuwOgYxcVEVPz4H4yHh/9OHPzbKJiM8e/XyHcqqvynRcBfo9wtGLdTTo+EOO+8SjNONNtEc81b6k1dkphr9CCcaf6q3tflo3lGV1Bb0AuL0PsGRh53Kl7y4WfGSlNsbjElZqAZZAabIeZWU2pGmrvNKHOPGW3uNWPMfWasedA8ZCabh80U84iZaqaZ6WeNsAf/hRhb/h+IsnVNPVOfYm3WWaNtC4y3LU0rk21anxF3O/xu5O3xb4q9Z0beHv+O2KtW64F/J/7uDveEe8Ovw33hN+HPMRGTMSemMCY35M15C0w/WvI2GJPb8VxweVd+LSTz7rw3lOX5vA+cz2/iN0Eqf4A/AFX5m/woVJOVZTvoJofL4XCv08/pB2Ocm52b4T5ngDMAxjojnZEYvUc5mPU6xxWD+xWGJZikHOXCH5WnQnhYxVUyTFMpqgo8pqqqi+EJVUNdActUY9UK/qzaq/awTl2tOsG7qou6BjbgLFAE76tiNQS+UqVqMexXS9WzLE09r15k1fXteji7RN+lR7I6epS+h9XX9+oJrIGeqB9iTfS7ej1rqTfo91m2/lB/gjNI9J3tGn0C55GubjWcR25we+A8UugOcEexge4Ydza7z53vrmVz3bfdnewNc9xrxnZ447xxvJp/tX81vyD4LjjO04KTIeO1wtZha143/DjcyeuFP4U/8cvDo+EJ3hD5nQyt5ST5mJwgH5AT5R/kH+WD8iE5WT4sp8hH5FQ5TU6XM+Sj8nE5U86Ss+UcOVfOk/PFJPFHcY8YLe4VY8R9YqwYJ8aL+8WEf+naA2Ki+ANliYnv6BWgFj7zKN+riKv6UVCJ8r2WlO9lU7Za8bRsNTPKJHHuKom+J/DL+OXoNY15E7yGMxLO5DgbgdLf6e/B1T/oo+C757jJkOSmuOUh2W3utoBybku3NVRw27odoBLGhD1QFSPCAZxBcczDxTjmA6gRjVOoheO0OdSJRidciqOzA2T9jT61SJ96fBjqUxH1aUj6NMbstxmtLEbyUeCgVveiR4/lY8GQbh7pFpJuyaRbinuuex5qdb5bFc4jPVNJz2puZzcX0t2ubne4mLTNJG3rkLYNSNvLMDolQSOMTeWhKWneijRvjfEjF9ph9OgBHU77WrWANK8d7X1Dja+wDErSWKHG94AmHn3SONRr9BqI4Zp1D8T1IX0ckvRJVyF3SahrmnuBWx0a4PqnOzRx89x86IOR9hAMwJh6FO7ASFoeRmGcTIWHMTq2hMeQzR6wHGNYAazHOF4KmzB2j4UdGK+nw5eRX9CaDHBFMhaqRistaBGtmKFT9L0Hurhfmrmwnp7DgtOew/92axL79DgsgiX/wfYwekf0j9p0ypqU/+hn9N+z6dQYyqB6daK9m6524wBuDbceGLcAS0df5xN7goBaqkpt1CafzTjNZ/+7tU/5SHWKgr9fP2HR2ds4VTvl7+jwX7VxioOEFnUh2jEbyrtxdi1SS/RwPVJP8BZ5i71V3lt4r4WsK+v98nXboS/b5dS5Kl1VV3VVPdVAXaGyf/Ndu6e6QfVSt0RfHdUgNVgNwbn2NjVU3a7uUMPUcHWnegAzscTX73v0GPqiHX3DXkHfrn/5Xu038TvTN+pCek8avc8UvAVvgyuL6LdBC000+6LtOPui7Tj7Yjz+Dv3oPFzdpeKckIdecwmuOEsx1o5Er2mKK8vpmL1Fb0U55of3RfEfHmTj7JV75dhfrvy2z0SJMXLcaXWiPZjj9WR1qx5NezDftbsSqaxqozpT2em0ny/R2v/8HrhTmpy+1yFx5fTv/SxpFPtRHBHHJJdu9IVbVpSpMl3WRH+4TDaRLWVbzN+6Yq52I+ZlxZiD3SFHIjsTcG0yFVci89CeP5Edr8u35Hpsdxta9KXcJw+hHSfQBg/7LudUcqo5GU4matwQNc122judnWudnk6B098pcUqd4bgCHOtMdCY7051ZzgJnibPMWe6sdNY4bzsbnE3Odmens9vZ7xx2flaglApUsqqgKqs09M/a6J2NVAuVozqoXPTLAvTwIeh/o9UENVlNV7PUArVELVPLMcNZgznNBswJt2MeuBtzvsPqZ8zuFOZyyboCZm5pmKXVxoysCWZdHTCz6onZUzHmSMNxpTgWV4iT9XQ9Sy/QS/QyvRxH3Br9Nq4VN+nteidGov36sP7ZBVe5gZvsVnAru2ludbe228Bt5LZwc9wObq7b3e3l9nWL3EHuUPcuXD1OdKe4j7sL3KXuC+5Kdw2uITe4m9zt7k7Mg/ZjtPzZAK4iAlw3VMD8JQ2jZW3MVJpgvOyAa4aepm/k9+YuzKgmYi413cwyC8wSs8wsNyvNGvO22WA2me1mp9lt9pvD5mcPPOUFXrJXwavspXnVvdpeA68R5iY5mIfkYs7RC/OLIswlhmLeMNob703ypniPenMwVizF0ftytBMMx+5Gb4u3w9vl7fUOeke8Yz73XT/mp/gV/VQ/3a/p1/Uvw3Hd0m/rd8Sxneff6Bf6xX6pf5c/xp/oT/Ef9xf4S/0Xou/N/jp/o7/F3+Hv8vf6B/0j/rGAB24QC8oFlYP0IDNoEDQJsoMOQW7QPegV9A2KgkHB0OCuYHQwPpgUTAkeDeYEi4KlwXPBy8GqaHdJsBFHwY5gV7A3OBgcCU5gnhMLy4WVw/QwM2wQNgpbRG+Zwtywe9gr7BsWhYPCoeFd4ehwfDgpnBI+Gs4JF4VLw+fCl8NV4dpwXbgx3BLuCHdhVnQwPBIei/GYG4vFUmIVY6mx9FjNWN3YZbEmsZaxtrGOsa6xvNiNscJYcWxI7I7YqNj42IOx6bE5sSdjy2Ivx1bF1sbWxTbGtsR2xHbF9sYOxn6MQ9yNJ8UrxFPjGfHa8QbxRvEW8Zx4h3huvHu8V7xvvDheGr8rPiY+MT4l/nh8QXxJfFl8eXxlfE387fiG+Kb49viu+L744fixJJkUJKUkVUqqlpSRlJlUP6lhUrOk7KT2SZ2Trk3qmVSQ1D+pJKk0aTiuhbP4eMTmhNmEOYTtLE5A7ETn3SxGV/LovJCwiLCYsISwlHAY4QjCGdHOCr6A8D3RAHFbhMIlLBMhuOIAIe3LEJ8S7iTcRYjrMxlGdxGxpCxL52WpVmDxY8JPCD8j/JzwC8Q4lYlTmTiViVOZOJWJR2XkFdFdxKhkGYvRlSstRv32o/N+dD6QzgcmNJdPET4TzVN0bujcle8Qro+uUEkj34u0kksI/xT1TudxOk+i8yQ6L0PnZejcp7o+1fWpzcBi1HKM7sboboyuJ9GVJLpyDp0nJ5CuJFOZMvINwvWE71Bu9OuzS9VTCGcSziacSziVcD7hQsInCKcTPkq4IlqP6BXYRkLOtHK2lXOtnGrlfCsXWoktujrSAHEm4WzCuYRTCecTLiSMNEgjjdNI4zTSOI10TSNd00jXNNIyjbRMp/LpVD6dyqeThelUK51qpVOtdGo/neqm27qRhenWwnRrYbq1MN1amG4tTLcWplsL062FNcjCGmRhDbKwBllYgyysQRbWIAtrkAYZpHEGaZxBGmeQxhmkcQZpnEEaZ9jy0wkjjTOpbibVzaS6mVQrk2plUq1MKp9J5WvT3XoW5xMuJHyCcDphVDKLWs6ilrOo5SzSKovqZlHdLKqbRXWzqG6WrRvxmGV5zLI8ZlkesyyPWZbHLMtjluUxy/JYQDwWEI8FxGMB8VhAPBYQjwXEYwFp0Fw/TPg44SzCOYSPEM4jXEC4iHAa4QzCxwgjvZvT7rBIPm7lLCvnWPmIlfOsXGDlIiunWTnDysdQYiwm/bJJv2zSL5s0yybNskmzbNIpm3TKofI5VD6HyueQPTlUK4dq5VCtHLInh+rm2LpojzstagHxccJZhHMIHyGcR7iAcBHhNMIZhBEj7UiHdqRDO9KhHenQjnRoRzq0Ix3akQ7t9JOEiwmXEE4jnEEYtdmJ2uxEbXaiNjtRa52otU7UWieq1YlqdaHyXahMNzrvRnW7Ud1upE83e3ce4QLCRYRPEi4mXEI4jXAGYaRPHrWZR23mUZt51GYetZlHbeZRm3nUZh61kEct5NkWouecZ/0mz/pNnvWbPOs3edZv8qzf5Fm/ybN+k2f9Js/6TZ71m0LSr5D0KyT9Ckm/QtKvkPQrJP0KSb9C0q+Q9Csk/QqpvUKrX6HVr9DqV2j1K7T6FVr9Cq1+haQfd4+RNx0jbzpG3nSMvOkYedMx8qZj5E3HSI8i0ruI9C4ivYtI4yLSuIg0LiJdi0jXYipfTOWLqXwx2VlMtYqpVjHVKqb2i6lusa37GGGkb7G1s9jaWWztLLZ2Fls7i62dxdbO4oSdpmqkB+LjhLMI5xA+QjiPcAFhpEcJ6V1CepeQ3iWkdwnpXUJ6l5DeJbb8k4SLCacRziCMbCil1kqptVJqrZTaKaV2SqmdUqpVSrWGUvmhVGYYnQ+jusOo7jDSZJi9O49wAeEiwmmEMwij3kdQCyOohRHUwghqYQS1MIJaGEEtjKAWRlALI6iFEbaFiMsR9hmMsM9ghH0GI+wzGGGfwQj7DEbYZzDCPoM+9Az60DPoQ8+gDz2DPvQM+tAz6EPPoA/pcWptMsXKmVbOtnKulVOtnG/lQiufoF5vi2YcxJmEswnnEk4lnE+4kDCxdkisF6ZYOdPK2VbOtXKqlfOtXGhlotdx1Os46nUc9TqOeh1HvY6jXsdRr+PsTJuYXadYOdPK2VbOtXKqlfOtXGhlotcZ1OsM6nUG9TqDep1Bvc6gXmdQrzOo12m00n+IcCrhu7Tqf5NwHa36FSEQOpQBXEVvGIFfz3sB4zfyAnB4X34TuPTO0aN3jjF655hEu/7Pod39ybS7vwzt4k+hXfxlabd+OXFMHIfy4qTkcK7ElAjOl8kyGSrLCrICVJEVZUVIldVlDagqL5G14QJZX14OF8kmsglcIpvJFpAps2U21JE5MgfqyiJZBPVksSyG+nKIHAKXylJZCg2csc44yHImOn+Ay50XneVwhbPF2QKNnW3ONmiiaqs60FTVV5dDc5WvCqC16qv6QhvVT/WHtmqUGg3t1QQ1Aa5WE9VE6KgmqUnQST2spkNneq96Lb1XvU4f0kehO739Koh23MMAt6bbGCa5zdwOMMft5ObDM24f9zZY497hToXN7nR3GRxxn3fXsbj7nnuQXRS9J2Ntol35rLOpZuqxUnOpyWJjTUPTgd1vOpkCNivap8+ei/bpszeiffpsU7RPn30V7dNnB8xH5iN2MNqnz76N9uOzQ14Vrwr7LtqPzw5H++7Z916+l8+ORPvu2Q/0d8cL7Y5GPD/5wWl7F6N3UCm/fB2KfgW/fpthO2E/T+VptO8hM9r3gLlmEeaYJZhbDsNx/2e9G++f9dAnzjywlTOP9L893GpnHtjr2Y/M3xzRnowzj6y/PdweZx5oy+8c+IzOONDmM4/isx2mwpkHsnTmMZqOX3+X/uYYisew3zlGnO0web85in9zjPzN8eCZx3/ol4UdcB40ghaQAx0gF7pDL+gLRTAIhsJdMBrGwySYAo/CHFgES+E5eBlWwVpYBxthSzSn8Ix/AtP/Kcz6Z/B3vl2kQig2y/vlKCXVAPWUvlPfrR/wnvCWeKu9vwCjv5j+9uxfC/4PNrtNpwAAAHic7H0NvI5F+v/M3DP3/Tz383Ke85xXVpIkIUmSJEmSJEmSJCFJkiQrSbKttbK2bSVJsrJWspIklawkSZIkyQpJJStJkqzVOf+5v9ecM+Oc7Nt/f//P7/f7+5zPfRnzzD1zzTXX27xdN+OMsZANYouZ7DX4toGs6o13Dx7Aat08+KZbWdMBvYYMZG2Y1GVYaSlK8qs6taqh/43+L3QOL/+V/lfIvEs7dmzLCjtdcXkNVti502UaOr+L23oNvpWlb7v1tltZS51TRLnM0/Uo5rOAxVhc159gSZZiaZbDMiyXZVkey2cFUU26ZBErZlVYVdaEtdDYdWBdWA/Wlw1kQ9lINoY9yCaxaWwWm8cWsaVsJVvLNrJtbCfbyw6yEmDL71hF/57Zj/6tvZv+3dCW/t2Xr3GJ8FpG/x87XuMU/X8y5YdjKP/lZfT/2C7z+yj6v9pOv7dvT/8PiIb8+pD+n7uc/n/e/fR/Po7+/7vm9H/ZxNTXlP4vVjFfk48Xjma+p/9NDWG+HjherQT051cfon/P3EX/pvbpOvN1bzmvpukYarrVYa1YZ02jUWwKm6upsknT3Ne/cXElWpwOysY0xfN13lXI+3kE/bUaHlXWX3pUWXr/Z6DDV05ZqmPOUWU7O/X+uWK9FXCgvPtR9t1/ULZTpbIen8Wf0v99ms9lgj/LF+i3NZ/J1+UKcKLmYM1ZEfezMsjb81YadgLnVWMNWFvWjQ3QHDWZLWArNA/t46GmZxkeozRvcrVMw3I85Pwoj34JvtbwqLLyw4o5qvRYb8caVCzrbT2q7LO2rJ+sVPa9Y5ZlFctqRjoWDg0r1bv+mPVylOWa6gtAUa4U6Or/e9TlHUtm6DpmuqNMed6oCAbvW44w+U9peFSOP/FYb8der/i2nPEjZe9DLe9VaulZDX+0rNpWCYcJx8ThtUo4TD4mDm+irENd/vmPUrfzP8m7faCl/nCUDCFPToS+2uDIG+W/UjFHzTvm21srvf1jLT0Maa3c0vRjln23Eg7jj4lDJXz/Yb2WukJulJv/gZbo8k9SOhfj19zlGMqTF4ILbrUcY/L7Vczxrzjm2yMrvf1jLbVELZVbanTMsr0q4RAeE4dmleo965j19kZZS2lPhSpH5evSTJdmujzTdv0oeh9F9a7/JNWvgU76hautKE+Og2Zb6Gg2yn+uYo4/+Zhvv1np7WO25L9Uqex9xyz7TCUcOh8Th59XqnfEMeudW0E3S5VUaZWr8uB1ZPVTrJ/q+qn1Y7Q/agS6/ZMj0BvyOVk86eDUCDI3AfL5pv6lrGwv5C92JJbePl3c57zd23n7ev3L0W8fpTvdskZ3OvXq0TpW2YWVcLjgR3D4LXC43cGB8l/VXqYt28upd6/+xR0BJdfLDVrLbNJ6JvLwIr+2mn5q6qeOfhocexyOGo05/+Ro1IZ1ev6ofiNPdoE1deyhyb/XkWp6e94x395a6e0nf6Ts1dAA6yqVbXuUtnDL3lUJhyeOqreOg8OaSvU+e0wctlXQ96fzT/lO72v5knxZLpavyKXyVblMviaXyzfkSvmmXCXfkqvl23KNfEeule/KdfI9uUVuldvkx3KP/Eruld/Jg7JEliqmuPJVoBLqLNVKXRz8iZ2uW1iknyX6Wa6fVfqJPOrI7m3Wz3b97NTPHv3s188h/ZREjBNNM/STidz+yNXXj+YOrrmDN9BPY/00009L/bSJphr60V6w1pCM99CPtm+8v34G6Weofkbo5/5oKqOfB/WjrSSfoh9tFfks/czVj6YGf0k/S/8R9/3/Bvk2PkbzUBPNXWewnnquOYANZsP0bHM0G8ce0vPNqWwGm61nnAv1PHqZnl2tYev1DGsb+4ztZvv0vPMIFzzG0zyfV+U1eG1enzfiTXkL3pq34x15F96d9+b9+EA+hPHSxRGP/gicU9KpHM4qaVEOp5fUqJAzpURzd+nSkkUazi8ZVA6pnhkldTWcVlKo4dyS7uW/0rtUv/uW+y7BST/srdAupd16ppYky9OTfzhUDinfhfQuQcKNsHLrj/IFS2s5/VQPx+d8p/aMv/a+Zp6W2VeY1BL7HotpmfyYVdMSuZfViCSSnSxLFGenRBLJTtMSeRarp6WyFauvLlYXs9ODP2n5bPBfVu8ZmnOimfIK/azWT6T5Nupni3526GeXfvbq54B+DhOrRdMzntSPtslc22SubTKvpZ+6+mmonyb6aa6fVvppq58O+tFzam2VGe+pn776GaCfwfoZpp+R+hmtn3H6eUg/k/QzVT96tsNn60frdK5tHte2ly/Tz0r9aE3K11eQAhnp0NIjpXsq5ItoRchAlDHpsjJIly6uKFOlm5DO/1dkkFovPVi6thwSPvLv1uNiGNO2tQz62t85Osct6Zankk6/jO3d80/a3gGY6c85yjtDnpyKdYJNjidH+Ssq5qjnjvn2x5Xe1tr9x8v6f2Ls3y+rph4Th7cr4fD7Y5X111fwRTvwl/gSvoyv4G/xd/h7/AP+Z76Vf+Kd423ztns7vM+8nd4ub7e3x9srn5JPyz/KZ+Sz8jn5vHxBvij/JD+Rn8rP5RfyL/JLuU/ulwfkX+Xf5A/KU/EyL1cVqmJVVVVT1VUNVVPVUrVVHVVX1VcNVEPVSJ2tzlHnqvPU+eoCdaFqnfwg+WHyz8mPkluTH7NIvv7rrCzjWjdwrRu41g1c6waudQPXuoFr3cC1buBaN/DDDFNRoXWD0LpBaN0gtG4QWjcIrRuE1g1C6wZtnZjQukFo3SC0bhAa92i9TWjdILRuEFo36JFgQusGoXWD0LpBaN0gtG4QWjcIrRuE1g1C6wahdYPQukFo3SC0bhBaNwitG4TWDWK9fjbpR3tR4jP97NbPPv0c1M8RzU4aWS/2n7C6JRv+b2s4Dv8D8DLASRH0Ii7i3hQt6ZdpbTeNzWRz2Hzt3y7Rvu0q7ddu0D7tdu3P7tG+7CFWwqXWhBleyKvxmrwOb8Ab82a8JW+jNWgn3pX34H14fz6ID+Uj+P18LH+QT+RT+HStG+byBVovLNVaYTVfxzfyLXwH38X38gP8sNCSIJIiK4pFdVFL1BUNRRPRXLQSbUUHze+ctddSeDRso2WVs9a8czlsqSW6LL+LtoJlJfFraVOkKb+jtptHw6FasjgbpGWuDA4RrcvzqebOfGY5pJq7apkvS1PNLqSSlO7Jt2vYXdvho3vRIfJBTf4AUU3DPlo/lEGqvxtfXp6mnlJ5yiE4UgytkOPmV/6V+ujmECYECTeXPp20xivrEaUJunjSW4Qbwd8A22VIX/ZfZhOUtgr/vjX474uZltH/B7PC/y326l/WgaXfl75/dE7JHuQfLt3x7+pVevfv12B8XsfvNjmHjAf942/hV8LZpAmS11xSerAsbcr/tXRrhZL/1/DfpMnff9exRLKJp3W3SmtL1F/PqrboGdUuPZs6wA7zaDMqybO8mFfntXhd3pA34c15K96Wd+CdeTfek/flA/hgPoyP5KP5OP4Qn8Sn8hl8Np/HF/LFWrpX8jV8Pd+kZ/2f8d18Hz/IjwghYiIt8kVVUUPUFvVFI9FUtBCtRTvRUXQR3UVv0U8MFEPEcDFKjBHjxQQxWUwTM8UcMV8sEkvEcrFKrBUbxGaxXewUe8R+cUiUeNILvYxX6FXzanp1vAZeY6+Z19Jr47X/UQ1NOrWdnt2V2S6Crjalkm15v3JL0pvvLoeks3to2T1a+xIcLSZWgPdraStLU1tUj6vLqRXS8W5b1EpfHu1RDxe9y61W5R71E5G/OFg0Ky9Db7n4U5pwIIvUX2uWMjhBbK6Q4+ZX/nWUGFUhpzK1XUh21bWuBAlPt9cupJFycyZqDfSPcojm1FMaL8qf4dX9UTjX6/6jcI135Eehyyduu1vQ4hLk9+cv8lf4q/x1vkrLwjq+QUvDFr6dfyHGifFeE2+r97H3ifep97n3hfcX70vvKzlLzpZz5Fw5T86XC+UiuURulzvkZ3Kn3CV3y6/lN/JbeUgelkeUUFLFVIEqUlXUT9QJ6kR1kjpZnaJOVaepeup0dYY6UzVWTVRT1Uw1Vy1US3VR8EjwaPBY8HjwRDAtmB7MCGYGs4LZwZzgj8Hc4JlgXvBs8FywIHg+WBi8ECwKXgxeCl4OFgevBEuSG5Ibk5uSm5Nbktv+1/Yrsuhz9DNfP4v0s0Q/y/WzSj9r9aPnUXyzfrbrZ6d+tO3i+/VzKDJk2iJK/YT6yeinUD/V9FNTP3X0o70Kob0KLZtMtNSP9iqE9iqiExdCexVCexXRXqrQOAjtVWjvkQntVQjtVQjtVQjtVWjtwYT2KsR0/WivQmivQmivQmivQmivQmivQmivQmivQmivQmivQmivQmivQmivQmivQhxm2CT0tFfhaa/C016Fp70KT3sVnvYqtCQwT3sVnvYqPO1VeNqr8LRX4WmvwtNehae9Cq+nfrRX4WmvwtNehae9Ck97FZ72KjztVXjaq/C0dfG0V+Fpr8LTXoWnvQpPexWe9iq8ZfrRXoWnvQpPexWe9io87VV42qvw9CzY07NgT8+CtZQxqV0gGdNPWj/5+qmqnxp/x7bRKpa7KkUWEdb6qDKVrWb7f8fWGmjaclr5Z+w0+RDklyRZ8x8tU8m/Mf6B0yOTdvtF6f8U/Ldo8q96MEeN0T9FbSfnP4q54R83Z5KFYdeY9vnCnizJi/+r/Revk9fV6+H18fp7g7yh3gjvfm+s96A30ZviTfdmeXO9Bd5L3lJvhbfaW+dt9LboudMub693wDssmfRlUmZlsawua8m6sqFsIpvLVrKt7CA7y26yp+wrB8jBcpgcKUfLcfIhOUlOlTO0np6nNfRiuUyulGvkerlJbtN6ereeZx2Edo6ptMrX86sael5VX8+nmmod3Fq1Ux1VF9Vd9Vb91EA1RA1Xo9QYNV5NUJPVNDVTzVHz1SK1RC1Xq9RatUFtVtvVTrVH7VeHVIkv/dDP+IV+Nb+mX8dv4Df2m/kt/TZ+e7+T39Xv4ffx+/uD/KH+CP9+f6z/oD/Rn+JP92f5c/0F/kv+Un+Fv9pf52/0t/g7/F3+Xv+AfzhggR8kg2xQHFQPagV1g4ZBk6B50CpoG3QIOgfdgp5B32BAMDgYFowMRgfjgoeCScFUbTtma3uxUFuHZcHKYE2wPtgUbAs+C3YH+4KDwZGYiMVi6Vh+rGqsRqx2rH6sUaxprEWsdaxdrGOsS6x7rHesX2xgbEhseGxUbExsfGxCbHJsWmxmbE5sfmxRbAnj3r0RD3k4XePh3Iz3OGAvwLWAON/n/Qbw8whqPyuCtyJnBmDHCMobkf4C8AXAO5z0KYCjAZcB/gJvUSt9AW8BvNjiI3/j4PMe4EjA3RYT73mLg4cTit4fbLum/sqtf+HUORTwo0p0wLlE736n3YstHah+g8MMB2eXDn0cCnzk0OQqB5+f4q0TLB1kPaTfdfA5gvwbkPaQzgU8EfAkp+QjDv7XAL5p8ZdYf/XaAO4FfN3S02Du9M7b4uDcy8F5iIMnjd2fAXGOQm51YB7gFPyKkxNef2dcZgPWRk7G/krj5XKa/AQQNIysb/nYHXGw3YRfE4BNHGyprQ1O+luHVoTVjRU5TdZ2yuB8q/ecQz1XLh4DnkMq8oN8x+EE4sabkX4L8B7AOpX4gSD2Ury3bf2G95oDtgBEbep9QIw4nZeVPZFTFelDKDnR4nBUeWCiGlfqHdHq1067Ix0e61UJ5xMcrlvmlBxpR9BwGtHzFofTOjrwDqfM55aSBocbHcrjlLl6Br0YhHTMyfmLwxW9Ko0vpX/q1PaCrVOS1HcFvBxwMPLnApYC7gIExRTJ41coudfhKOrLNXYE5acOhVcAfmkpIy+yvZaQC0lcut/BfLRDPYKkMR5CGtLnzQScjPyMhYYzPwSEvBuN9Ll9lzSA0brPOfz2gtMXotgNtnWj9yDjkqhKJ7qxoiaJ/8chHTgU+Bg5Ncp5RrALcVMgOrt2hv7fuawZq8pa6r9qrJX+O4Fdpv+qsyv134msG7uO1WA36L+arBfrzU5mt+u/U9gd+q82G6b/TmUj9F8dNkb/ncYmsImsLn+eP89OFzXEeayBOF+0YO1ES9GStRcPi8fZ5eIJPYfpIhaKF9kAsVgsZoO0l7SE3SFeFa+xweJ1sZL9VKZkit0tC2QBGy7vkfewe7THMoaNUG3Ubew+dbe6mz2lRqgRbLa6T41iT6v71Wj2R+17TGDz1EQ1iT2rvZDJbIH2ROaw59Wr6lW2TH2rjrDXtMewhb3tb/O3sTX+dn87e8f/1v+WrfUP+gfZu8HS4HW2LvID2MZYEAvY1li9WD22LdYn1od9HL8rfhfbHn8g/gD7JP54/HG2I/5y/H32afyD+GZWEt8a38pl/OP4x1zFP41/yv34F/EveBDfG9/LY/F98SM8nmqTasMLU5enLudFLDov+6HWtcc4L2u8zr7Hvc7jXue/7nWKg7y+hvewwzjhGmmmZ5EDfSZg08SHyDkP6ReQJusKvSLuQw6shH9ayQZdD+7WCPhEYmxUM6WjtYQyO0YnOrUkR/BR1kfnXx/N8rwqJZPLNRbh8wMg4fMHtPU9IDS6gIYTsJmEg/gzfoU9FFchfbXT+mURhuY8acypE3N8/nR0wuooOqAV2aJ0alm7hJuhw4UONUAHeU9U0qVDtEpSTo1BDk22OdR4OyrvPY0cosMLESZ8SzSfJXy8l9H6MEBgK8hnz6JHp9uS4kVgRfijzmiFpwx/dVq0Dultj06aiadtSa+xHUHTu8o432Jx9s4uWabhKouzgBUS14MOr1qb7PVEnb9Gnc/h16eQJsrP5DJ6CyVPLtmv008AH4yXy2kebriJW4kHUPIS5OeUvBKVQT5owv9mucJQeJzpRQT/qOfrXHwOrIhWp2O8Rjg8D9w8+PLyt/j1rKi/6ibQgWhLctEMrdxbsq2M00ydxA+/Qw0kEcBQXoD0UtD/IjZQ5zSOdhNcfiAY7QDq/FaAz0VyIc8CVrezVRpmIyh+jzG9Liqj4C+IKwCBiQKd1TPUR8uHbnkFjlJjUaYhWifeIFr9jDcp53nwz1FU2gp8biq9RKenRechzZgusLJgpPVhtAKfToyMaEiSbjjtS5z/JHpytD4CdH6Y+NDKnZGFlbYtdSfqxN6V+r3NUS3w7pVWm8l7afSB21LkQ+6oXa9ayU+ifkXSocAb3tAoLc6M1t9I+8maqOG6qDy/HxJXHzk3IWd8lGNkChzFvy0Zjd6VU0B+70jfXch/NdqjEVVxG+kvtqR4E7Ap+vtNdMbPSN+DgES9I9EpU/E9NMYZwOQSvPWb6KSAuBPpG9FHgiRNv7PyTvxjRgGSazTAD8Qnlt8MJTG/F58i/0ZI/RvR2Mkf0LvXkD8LfZmDPsJfFnfg3ZMM5vvLdQ7R8ynAhqUNjnud/428TiXflx9oz/PP2vf8t+5QZCan2mg4TXumT3kdvS5ed6+3188b6A3xhnujvDHeeG+CN9mb5s305njzvUXeEm+5t8pb623wNnvbvZ3eHm+/d8grkVKGMiMLZTVZU9aRDWRj2Uy2lG1ke9lJdpU9ZB/ZXw6SQ+UIeb8cKx+UE+UUOV3OknPlAvmSXCpXyNVyndwot8gdcpfcKw/Iw4opXyVVVhWr6qqWqqsaqiaquWql2qoOqrPqpnqqvmqAGqyGqZFqtBqnHlKT1FQ1Q81W89RCtVgtUyvVGrVebVLb1Gdqt9qnDqojvvBjftrP96v6Nfzafn2/kd/Ub+G39tv5Hf0ufne/t9/PH+gP8Yf7o/wx/nh/gj/Zn+bP9Of48/1F/hJ/ub/KX+tv8Dfr0d/p7/H3+4f8kkAGYZAJCoNqQc2gTtAgaBw0C1oGbYL2Qaega9Aj6BP0DwYFQ4MRwf3B2ODBYGIwJZgezArmBguClzTXrAhWB+uCjcGWYEewK9gbHAgOx1jMjyVj2VhxrHqsVqxurGGsSax5rFWsbaxDrHOsW6xnrG9sQGxwbFhsZGx0bFzsodik2NTYjNjs2LzYwtji2LLYytia2PrYpti22Gex3bF9sYOxI3ERj8XT8fx41XiNeO14/XijeNN4i3jreLt4x3iXePd473i/+MD4kPjw+Kj4mPj4+IT45Pi0+Mz4nPj8+KL4kvjy+Kr42viG+Ob49vjO+J74/viheEkowzDMhIVhtbBmWCdsEDYOm4UtwzZh+7BT2DXsEfYJ+4eDwqHhiPD+cGz4YDgxnBJOD2eFc8MF4Uvh0nBFuDpcF24Mt4Q7wl3h3vBAeDjBEn4imcgmihPVE7USdRMNE00SzROtEm0THRKdE90SPRN9EwMSgxPDEiMToxPjEg8lJiWmJmYkZifmJRYmFieWJVYm1iTWJzYltiU+S+xO7EscTBxJimQsmU7mJ6smayRrJ+snGyWbJlskWyfbJTsmuyS7J3sn+yUHJockhydHJcckxycnJCcnpyVnJuck5ycXJZcklydXJdcmNyQ3J7cndyb3JPcnDyVLtLoJU5lUYapaqmaqTqpBqrHWnPOgS58FnIt7wiNxg/gD5NAqBSy47I40rQTQ2Q6sDXCs5fBRyKG1BKwPKaxe0KqDrIL8OTYtaMWFA9Jtc7qzTut/q1m5X23WSICPWuvg08tiLmdYTMy66Uhb0jsf+bVYI13/0EqtX+3g2dvi6d0COsyOoLZMERyOnDlI34P0LwD/6OT/EuklSHcEHA/YEvl1QeE2SF8GeAPOXHexfTQ0p3Wj8c7o9LI0l1Wd/hLNN1akufFzQG15m9OvM2zfzfrls5bmCl6ft8fiQ56SwugLrG5KWvfCGqQEbb0r0JdCwHroI+6ne+cB/ho5fwPcjP6CVirhcNphp+9oUba2ffdh2b0adqxpdVD+2un1lGP0d6wz1rSqt9Lhsd62XR+raz48fHUW0rUdWqFOn3CjVeRClKyL9H2Wr1yJ8B+zNVOdsp+hXkQH1GDW+Wohpx9oUlCJ607ErwppUFucihzMZWifgfAUdfArIK3ly9MAkRa1kf+spTmtrHtjAF9mW8okS9Eaf5HJj9LYl/BaAtLuykqUhw8fnUXU8PcoiRz/bkeyiFY/Q5rWF2l9fW9FnjTUxtq8xDyCfGOvJ8p/j3QxYHQjlscORp5w7KxIuhXwVNhjCVCPf9j2jngjhpls7FT8CtwCopJ0eIzG9Ckrd0YGP9V+ZaT9IohVW5kTpcVf8StWdkmfkDx6f4p+NboR+HvzkQ4sxxpNRXCuU2YY0n+xfTdjhNVr8anJj/iBAd4OSDq8s+UQ72lw0QArg94gpM/AnZBm7HQW7UtE8vgFcs6yesmrhncb4NfBSM8A3Iga3raaUPvzORj9CD6Od3tW1I1GQz6H9HTArrgjPUJ72Fxhb8TH/lKstx0d70Zbj0QfZSfAoYCogePOCr8OmEDniCpWvowV+IWTJkouspxsrBJ2xhRWRcwezttYUxqOdIHVZqTBBOHWAJxPctobt2doDQQ7RT50uw8b52NngGyQPBDdIiT51b2L4K8sJ/hkZ2ndAHM3+YLVHmoq0pAv/1LAl5Dzhu2jkaaYhR7dlCYbusWRbtLnz1loLAtZHOhYOdbhWGhL9RtbG2kGkk1Dc+oL7bJSi9C30dkbjS12AhV6LbDC49PoL0cZ0rG0T9ISaZqtt3Us8j2W29Uwy+ce7A6HFuUDkTMP4/UUxmuMwyE/AexoZYF0rGgPCCkQ3VE/+I0/4HBd54ol1aeAuwCBiTwbMB85Q1D/HwAha96HVhJJk4iFSJP39ShqvsxKpStN4ipHmkj6kmgLtZEHIpCWtGeOfS3+FGbECZYyUZl+omdhJ+g58Il67nuSno2dzGrpOW9tPdeto+e4dVk9Vl/rhuh+ZDR7bqlnzZfp2XI0V74Bs+Tb9ex4mJ4Vj9Hz4Yf1jHgSm8weY1PY42wqW8ReZG+wd9i7bAPbyD5k+9g3PMGT/Hk9Xz5J1BQni1riFFFbnCrqiNNEXVFP1BeniwbiDNFQnCkaibNEY3G2aCLOEU3FuaKZOC+aYev5dStxkbhYXCIuFe3E5aKjuFZcp+fbE8UjYpJ4VEwWj4kp4nE9954mfiemiyfFDPF7MVP8QcwST4nZ4mkxR/xRzBXPiHniWTFfPCcW6Bn6C2KReFHP0Zfoufky8Zqem68Qb4iVYpX4SPxF7BX7xHfikPib96GerxfoefrP9OxwtPyFHCN/pWfql+iZ3qWqnbpMtVeX6znfFaqjulJ1Ulfp2d/Vqou6RnVV1+p54HWqu7pe9VA36BlhL9Vb3aj6qJv03PBm1U/dovqrW/Us8TY95x8RzfX1TP/nerY4Qc/yH9HzxWiv4XdqunpSzxt/r2aqP6hZ6ik9g3xazdGz/m/VAfWdnjV+rw6pv6rD6m/qiPpBlahSn/ueL/1AzyXjftLP8Qv8Qr/Ir+c398/32+i55JV6LnmNf63fzb9Ozyl76Fnl7f5gf57/nL/A3+Jv03PHb/2Dwd3BPXpGeG8wKvhZ8PNgTDA++LWeC74aLAteC5YHrwcrgzeDVcFbem74drAmeEfPEP+sZ4jbgu3BJ7EgVi/WJ35X/IH44/GX44vjr+i52Z/iS+OvxpfFX9OztNfjK+JvxFfG39Tztbfiq+Nvx9fE39Ezt3fj6+LvxdfH349/EN8Y/zC+Kf5nPZfbGv84/mn8i/je+L74N3pO9238QPy7+MH493p299f44fjf4kdCP8wPq4fnhE3Dh/X8bVL4aDg5/F34ZDg7fDr8o57JPRsuDF8IF+n53J/CZeFr4fLwdT2veyNcGa4K3wrfDteE74Rrw3fDb8KDiRaJCxItE+0TnRJX6blcl8Q1iesTNyb6Jfqn2qQuZz8SO8msVMw8vlJxfKXi+ErFf3alQsKjkOTnNIaNg+9n/CJ4PrSGoDBfkOcAYn1DdYOFxTxL3IR8nJeRZ1gPTfVADjx5eYdNe5uRfhRlcqwXFFArmBfTLNLMPYGP/4yDD8XTwVze7K3QjPU7i4P2FiL4Z9su1V+5dcLT1Enzcfjn8kLQBGmBuaT3A9KnwIuAJ090c0tKmrnHkAOfX8CH0dSO0uTDwO+lVlQbxxclmp8J+LDtI9GBaC4PO/1936GPS/Outtem/jscmjxqfV31lqW5wgkXdbqtU8FH9TuAbtjDpTmFgh+u6PxXM/SlKqCHvl+LNOYO8jbkrLC+mYKvpW5zOG2x03esfqgTbN8D4rqfIB8npFShHXfT625Of9s6/b3S6e9d+HWn098LkUaPgnYWKqInTh7JhYA4n2hmtXQeR0Y7L2q+/ZX4ypWIAK0HoL96ERAjq8AJBtuWeJfWLjCDVh8gnQduoRUGmrNcaOZfUX430HAWyh+xfaR88yveVZjpUNrk/9ShOfWui+GHVWVSoD5yytDK5Dd2FIwe2BiVl5hfiGEVeTKo63AjeuqTlFFfaOa4vRJPEsSeuMKMRr5m+d/M8ZOAqC0+AisV4BzEPOQ+zschqhMPsIJk9BtwiOO0I5UPgElAM6z9Do/R3PBpp93xpp7yeYqLM51SJO412oy4+jcYC3CCKkAOrfn0djj2DAfeYcuYX993cOhiKe8tRbqB1SFaasp1kcsDRl+da2WQpFWsjGDwDnKwduoPsDmK+hjHW5jZ+afjLazf6lHOwfpVlKYylyANqRc1Hawc3Wg05E9ti4RbrCRaDfCx9hhgRz6GM3dBL6ePjR2IeajWkBGkFRisGAjMB8XpdgZq7M6VDvXc9N0OJ5NV+hP4h3QvpNKs8mHP2ui326wG0zNx6qmVULTrY24YYI4f9ESdkJ0AchTcQhoGKxULnXGnFXVIU3C1w41Yl1NY3yO95xdYDvEhQQFWP9QQp4+PWk4zEBrPp7V9aDxJp4CxVqCetZCkWOHkrDmH0MbhSVpVoBWYZxzNEFhKmr4QbS+3rUusDvmQTR/rPxLaJsAKTIBzJhKrnYh2VkYBsj5/c7joFMsPaqXDY8TbWGGgtQj5gDNerStyCO0aiP749XdIfw34MXJg3/2L7FsSaxqyf8WSPsWBnQL4J6ckVjl8rJnIm1j5eoIEhvIEQNgFD6t8sqkjxXfi3TUVpekouQYdxAHnV/JVfoteww6qaF/4+ErFv75S8bazVnF8peL4SkXFlYp/K5IorWbkNj2+mnF8NeP4asZ/+NwFdkK9XwJ2ciw7vCyzbwLvwqM9EcwOzB0auidHJxnoZtUyQJxdlLR7RbsndMPDva9Gu1p044R2ix63/pW5fQIf0qMzscBH/cLBh+450T7aXosJ7VoSDuaO3WW2XbNLXrn1b506B1tqeDQvgFdG0LsYOdhzMWUqlaT7K2Zfpr9T/l6k4YF7TZ13n7N9POpG4Cwn5xJLc3M7cKhD84WVaN7XofYWh/4XOn0n7/cES3Oz47zWqZP2l+k0L63zDLQ+sCRakX/VDrA5IHaCvJsBsWMrvkIa8x3vM3hf0uG0iRX7bu7u0J0zujGG+aP3lR01M8toX5Ey3lanv793+kv413d4bB3g1bYVM3/EaW050uF2mm9OdnisqlPzNMtXrkQQrcxdKCpJpz6wf2ewfdy8m1MuO1WOwXtE5wsdLnrB4WHavxvg/Ep0c6CJrdjIoTntpRK1n8UuM83N6YYZ3TbDKpDZHaYzQqQHnkZ53O4S/SrypPyTw400uyf651vei2IxVOBJgs84/XL1AEbBoxGkk1oFOOH8tMOrtFYAH97cUHzE4qBwwl8BN0mngumU+G8dHiOK/cppl/TMi6Aq5h1GtxC2eQ73vuHw4VijAaL06049dzoce5kD+zhldltKGhxojM5yKODqn16AXe3oGx4gfdXFkcGb7K8KsyHvenDFHU4O1dnS6i5J6xXAU/wMaewIiwvsnE7c/Pd0o+HnIU4OcFNrLL8p3CxQOLVCK1pH1dPCSXex0GBFqxm9LTSj8HuHem6aOHCkM14k9U2NrEWQzqHRCLaz2ow0mDhi8LES2tvRaTSCji51c+QF0WqG4cw+DiZ0wsHVeMRRrt5rY2szd1JI433n9HG0w2kEScPTuaCrbY45d9HJQiPFjo41mO+275LWNRb5WUc2X3D6MtJpxTntTyf36EasuRdLevLzSvh3cXC43OGiv89jA50y9CWaj5DzakUOEcMt9FJI41yEoBMOY+zKgyAdhTRBtyRJhwu9S42WyEHvojSt6mONwpzqbGcwjGpO2pqNJ4ZTnfKJij09Sq7bO9zeybEXtMJzMmqG7T6+mnF8NeP4asZ/dDXjeCzq//mxPY/Hov7fDJ0IoIU78nwNd7GkuOH47fv/itv3seWxVbG1sQ2xzbHtsZ2xPbH9sUOxkriMh/FMvDBeLV4zXifeIN443izeMt4m3j7eKd413iPeJ94/Pig+ND4ifn98bPzB+MT4lPj0+Kz43PiC+EvaVqzQdmGdtgJb4jviu7TuPxA/HDKt55NhNizWur5WWDdsGDYJm4etwrZhh7Bz2C3sGfYNB4SDw2HhyHB0OC58SFuCqeEMbQXmaf2/WGv+lVrTrw83hdvCz8Ld4b7wYHgkIRKxRDqRn6iaqJGonaifaJRoqm1A60S7REet/bsnemvdPzAxJDE8MSoxJjE+MSExOTEtMTMxJzE/sSixJLE8sSqxNrEhsTmxPbEzsSexP3EoUZKUyTCZSRYmqyVrJuskGyQbJ5slWybbJNsnOyW7Jnsk+yT7JwclhyZHJO9Pjk0+mJyYnJKcnpyVnJtckHwpuTS5Irk6uS65MbkluSO5K7k3eSB5OMVSfiqZyqaKU9VTtVJ1Uw1TTVLNU61SbVMdUp1T3VI9U31TA1KDU8NSI1OjU+NSD6UmpaamZqRmp+alFqYWp5alVqbWpNanNqW2pT5L7U7tSx1MHUmLdCydTuenq6ZrpGun66cbpZumW6Rbp9ulO6a7pLune6f7pQemh6SHp0elx6THpyekJ6enpWem56Tnpxell6SXp1el16Y3pDent6d3pvek96cPpUtyZE6Yk8kpzKmWUzOnTk6DnMY5zXJa5rTJaZ/TKadrTo+cPjn9cwblDM0ZkXN/zticB3Mm5kzJmZ4zK2duzoKcl3KW5qzIWZ2zLmdjzpacHTm7cvbmHMg5nGEZP5PMZDPFmeqZWpm6mYaZJpnmmVaZtpkOmc6Zbpmemb6ZAZnBmWGZkZnRmXGZhzKTMlMzMzKzM/MyCzOLM8syKzNrMuszmzLbMp9ldmf2ZQ5mjuSK3FhuOjc/t2pujdzaufVzG+U2zW2R2zq3XW7H3C653XN75/bLHZg7JHd47qjcMbnjcyfkTs6dljszd07u/NxFuUtyl+euyl2buyF3c+723J25e3L35x7KLcnKbJjNZAuz1bI1s3WyDbKNs82yLbNtsu2znbJdsz2yfbL9s4OyQ7Mjsvdnx2YfzE7MTslOz87Kzs0uyL6UXZpdkV2dXZfdmN2S3ZHdld2bPaC9e5zOMHdQsN9LKygCt1UEvH5xBpvOyiIl0T0himqE+/cmwg7ODni44aQoJhFuMFNEJEG7rHRGPtfmULucbgbQCf0ii4N60sHhFEQCOM/BhOq/U88kuNcKMAfwRcDCCIpPkS4G3BNB7atEsDtyXkGZ7RGUy5CzA3AKYHMn3QIlJyB9B+BSwCcjqP6G9I2AdwN6gMBN5Tu4vWpx0zPsCJObkF6E+rcA/gXwceT/gf0cd4x+vHXC9jXAs9CLjGk3ogxOM1HUBw/rUhxrAILWKXFfROyx1DbrczSmWM+jeFiCIqbRCQtaYwgxOomK9BefIN3V6aNnKe9NtvQnyns/rUh5M15TnN5hFMQ7Tt+vAdxvaS4nIj0aEPwpsFIo6LbNzQ6HYx1C0N0RWhug2HC0a4HzVt50hyYDLIcbSfnAcrXhQFpjQxQEEz3iduRQ7C2iNk5zCDr9UWrpKX7HoggHGyyfmwgNFMlgiIPJJxjBNYgNQDLyLiI6PIkcjIL2O+1YULqvHQs1H/l/AMUSgBKwqjMKexz6b3OkIMeh/2CUn+Hw/MeAs9HKXsCDKHMh0hfh1yvQOiRFjUBOP8Bq7CMWnSSK0k0sn7tyqr4BBA/Imii5Gel67LoybCXqFLSyRatut1ge0zOD6Q7/RL/SKimtyd2FfIL3ol2KBjGHLWTmvo6iaGK0kkdre7Q6glVnUTuqXz6GeC0vWt4z8Rtwn8ncC3T0G+W4mlBgtZJ/GdXGKWoe7miK5YifcbJTPo16giif97B8K0g3Xos0nQocE8UO1zSJSv4Q1Wy08W+ALa2441SRieRBMn7A4aJuSH9PY8RVmc6RROFmjqRPQsk3HVm+AOU/AFWHA5L8LsSYbq2odeWXSGPEvTqoZ0YlDXCH4ZwIPgC4xOIgngFcBfh8BINDfD/szpVRDA+UTNsWgyeQX9/qKJIRLX0RPBsw19FpIyOdrG3lz8tsh+acKD0L6faA8yzvaUnXv3Lwv7cG8FJAWAo9ylGL05EGxfhA/PoV8r8VcQ13I8cHJGk6H5D07Syn7xgj8QYgZMqM715r0ylCEscaKgdn0m1jswflWn/soIp6js2lm6zkJ+B0nlgC+IpTP50I7uNYE4rTQydkb6mUftLRcsTDdJIXJzGNLspxOBA2ThyytkB8iPRvkAZl5PtI90A+RlaQvYAdVLDaPkbWD1Be8C7MxKMy9oJ254orWY26BqsIbrA40yq7ouiQDztySvaidUWrYW5sU4Qkuhk/xoHNHKs0xbFK5wLCThk/aq8dBTN2j1gKGwtF957J4vtWqyjsMpl7t6ucEaS9r0v5s2V621gB0Mo7AZI7DVQl3tsHGlJJaHi5C2lIh4I9Uq8j53M7mmRHjL9E8BGUrIH0o44ctUGdV1lovIj1yEkiTXqDbBYskXwOteU7eukZK/VGmrKAZImusDKuqqAG2DJxLfgkjnySxOr4tY/VdbIA+eRLPG4thYAdF4gsaSIM4YY3J3nB/vBR2hs+g9mxhFRy+NKKblp0YFnoPWhvjBGdYc9ztD3FfqN9Y7wriCcpwhNZEOw3RvH3dQ2brUQbjh3uyDV2mwVO3JuoYwvYela2R01n7Sl+LvjK3KylU/nUC7pTAr7SI1vOb3RH1sTopIh3b1sqcewA85Mdrt6Beno4EkFWlfasKDoCeWJ3Wf0jljq6hSBpMOgBQXL9V0sfqoe+nOzhrLq62kqToL1r3EAVFMcCdzVM1F26nUz7adiDUtjrozgT5T5J9C5WkcgzF/BGxE2wy9SXBhY3jh5x2mNHFAcTCe98y2NmFkY6+QYrxTTWRvPUtONrPB/i0vZOeXCmgJ9JVsPosVFI0+3qc8qtpNCea4iom8no64sszfJ03iP6L8Ye1X9x9gRKzGPPaq59Qf/ls1f1XwFbq/8KNRetZ0Vsi/4rZp/rvyrsC/1Xle3Vfz9h+/VfNXZA/53ASvRfdR7ykJ3IU7w2q8Eb8jNZM34OP4c15+fyc9n5vBVvxVrwtrwtu4BfyTuxlryL1uiteFd+LbuI9+V92cW8n+aqNvx2fju7hN/J72Rt+b38XnYpf4D/irXjC/lCdrm4UFzIOojWojW7QrQRbVhH0Va0ZVeKy0R71kl0EFewzuJKLVddRDfRjfUQ3UV3doPoJ+5jPcWbWhcME2+Jd9nd4j1tw0aJLWInGyd2aal+ROwWX7JJ2p4fYJPF99qSTRF/FYfZ4+KIF2NPeKF3IpvjneTVYsu8U/XMbYV3mravb3j1NTes9Brq2d1b8jx5HntHXiQvYmvlLdr3elfeIe9g6+QIeS97T94nR7H35c+1pH0gfynHsY0+0yK52Re+YB/5yvfZFj/0E2ybn/LTbLuf8fPZDr+GX4N94dfya7Fd/qn+qewvfjO/Gdvtt/BbsC/9ln5Ltse/xL+UfeVf5ndk+/xO/tXsoN/V78oO+7/1f8v+5j/rz2dH/Of9j1iJv9Xfyk/1P/Y/5nX8Pf4efpr/tf81r+vv9/fzev53/ne8vv+9/z0/PVCB4g2CIIjzM4JEkOCNgtzgJH5W0CRowlsHnYPO/OLg9mAYbxMMD4bzjsHI4D5+ZXB/cD+/Khgd/IJ3Dn4Z/Ip3CR4MHubXBWuDd3mv4L1gE78x2Bx8xG8NtgZb+W3Bx8HHfGB0wpDfHnwZfMOHxh6LPcbvjR2JHeEj4yfFT+L3xW+K38RHxX8IFf9ZGIR5fFxYEBbyR8Pi8AT+WHhSeBL/XXhyeDKfHp4ansqfDOuF9fiMsFHYiP8+bBw24TPDc8Pr+FPh9WFvvjq8KbyJrwtvDm/m74W3hrfy9eHt4e38/XBoOJRvCIeFE/gH4SPhI3xf+Fg4jX8TTg+n8+/DGeFT/FA4J5zDS8Jnwnm8NJwfPi94+GL4olDhy+ES4YdLw1dFGL4ZvimS4epwtUiF68J9Ih3uD78TZ4Tfhz+IsxLnJ84XzRIXJi4V5yUuS1wmWicuT1wpLk5cnbhatEt0TXQXlyV6JHqLjok+iZvF1YlbEreIaxO3JgaIbqlLUm1F91SHVAfRA/eA5dH3gM2a997ja97H17yPr3kfX/P+n7zmbc4gUux6uq1KqynkSSEtvkYcKPqVbhvCL/P7GD+IlZ/+pPvY65GebHPMWSi8q+Zaz5TaFU6EJnWlxcE/3eLgPR990dVLOJjQjdkmrBvOBnXDHDRKTwLMIGc10o0A342guBHwKuR0Q5k/RFA9jJznAFFG4xPBm6KzmLI5Sg5EzsmAvwY8KYL+SPz6A+DXgOvwK3BT+xzcplnc5CaLj5xpMfGeRU57i4l/2TFaf86pUwG+A0i0fd/SmTxxil5N8X1MTLr3LLXlHGd8adWWoi3T+V26LUxzC8wkzI1rl/5E7dMc+q+zlNdzRNtfUF42rUh57zuH/ivtKHgfOn2vgbdOszRXVyJ/PiCd7TsI2N/yWECRmHpaPvcowh2daqXoclc71GhreZtoSNxu+Jm+1EA3CRV+xelbHyeV6YsMimZ1dHYQcxf6ioek79pc4kgBcfuJFlLrftrBh+ayNyN+LqRPjkYc3o7IoVFo6IzFZ0g/asfCn4P8ncj5EvBlwA+dUXjXof9Gh/4bHPoHKD/A0l9uAbwXrbwASJxQgjRJX22UX4Gc85HTFzkvobYs0n+zfO7KqT8OcCxKnoF33wL83MH2DUCsMdN3PZRA+X6ohzQY4X+BHX36loeRpqlWsoxGuhi3yuHzmViBtF5FcQGuqaQhn0fEbTqFSdHlaNXqEUfHNnB07BtWN9KvRr6GR7XRPV6/aUU+MZH1ELucVr/E2Y4GpvPTdKukdlSPN0zkl8kF4Wla/JTNKVu3oFk7rbgTDnKvw1HO2Gntsa9M5ygax2qAVQF7oMyXjjboiPLt7Wi6GsB/vKLWVbORngv4E9TTv5IGIHg14D2AF1tt421xIKQg9qvoy5oKnO/vR/nmtsXYecj/FjnDHRkh2WmMnK+sHJGskUSQxiZ8vClIX2m5iPQbvWUszijANigPSyHSSLdFejygspLobRIDyiyCsQvSwZ+kdbzTdxqjtYBdAB+y3OXhnrlZs6H48hdZ3fUj1v+Iw9uk67Cy5f3N0YQzHP4kW4PbCD5F+jjd2hSzvlUZ3u5oOewZeq6dutGh9oqKabIF3jKkO1hKqjmm7xEky3LIUD7CbXCUDhIY9z3In4VT46UVdb73aUXb4VoNE0OBYuhTXD+KuXDNMayGYztio6ztkPRWRwdWcVppZVshu0bWyvhRs+0omLG71cF/tG3R3NHCLq4iDbnV6eMRyyF0Wl2dHX2hlmTfWAGyKZ1At/mOpCwFzeNIw6a41sTPBRxldaxrTYy/BCih2/1CpGFN5M8BoT1UYwuNDkG7ZL/kCkci7rU4kPdl9NIWK/XUFwOh64wtA7bqI8APrTbzfws4AWVa4deU/dVYH2G53fC84+WqrOUiiTVv8niF41F7tA5NMWSh+QV5Aohs61NUArrLRGvhuOOh6PtQtKbbyJFf2rGJWU4zFoS+aIKbM2oZcrAKa+zCB45cv2nl3XyXqjVs4k+thJp4jvBzFGSfLKOi76ZhTd3EjKCvcdE9JawrS0TSNF/Rom+EwGczsWboVMVh24qq7cgF1UNxo+hLWDTLgH5TuINE3pd0/CiyjIYaVDO+VSBxKkFOt1SlkhSHyHsAkL7SQXcqSFN95ORQzV9bCfJxA9CnmDUkWRc678Kj9hDlxyuCXSZZpu+L0Q4A3T0Dfcx34mg/iu7yQWbNLMz1V525m6tzzPgecvjTtQvEmbRC/5Ct03vCqX8X+Px6DY+veR9rzXs1u1usEe+ye7DyfR9Wvh/AyvdErHw/gpXvR8X34jB77Pia9/E17/+Ga95SJVRKZbTN+hciSlQtLBqpYXWWFHuPx104Hnfh/3XchVSzVMtUm1T7VKdU11SPVJ9U/9Sg1NDUiNT9qbGpB1MTU1NS01OzUnNTC1IvpZamVqRWp9alNqa2pHakdqX2pg6kDqdZ2k8n09l0cbp6ula6brphukm6ebpVum26Q7pzulu6Z7pvekB6cHpYemR6dHpc+qH0pPTU9Iz07PS89ML04vSy9Mr0mvT69Kb0tvRn6d3pfemD6SM5IieWk87Jz6maUyOndk79nEY5TXNa5LTOaZfTMadLTvec3jn9cgbmDMkZnjMqZ0zO+JwJOZNzpuXMzJmTMz9nUc6SnOU5q3LW5mzI2ZyzPWdnzp6c/TmHckoyMhNmMpnCTLVMzUydTINM40yzTMtMm0z7TKdM10yPTJ9M/8ygzNDMiMz9mbGZBzMTM1My0zOzMnMzCzIvZZZmVmRWZ9ZlNma2ZHZkdmX2Zg5kDueyXD83mZvNLc6tnlsrt25uw9wmuc1zW+W2ze2Q2zm3W27P3L65A3IH5w7LHZk7Ondc7kO5k3Kn5s7InZ07L3dh7uLcZbkrc9fkrs/dlLst97Pc3bn7cg/mHsmKbCybzuZnq2ZrZGtn62cbZZtmW2RbZ9tlO2a7ZLtne2f7ZQdmh2SHZ0dlx2THZydkJ2enZWdm52TnZxdll2SXZ1dl12Y3ZDdnt2d3Zvdk92cPZUvyZF6Yl8krzKuWVzOvTl6DvMZ5zfJa5rXJa5/XKa9rXo+8Pnn98wblDc0bkXd/3ti8B/Mm5k3Jm543K29u3oK8l/KW5q3IW523Lm9j3pa8HXm78vbmHcg7nM/y/fxkfja/OL96fq38uvkN85vkN89vld82v0N+5/xu+T3z++YPyB+cPyx/ZP7o/HH5D+VPyp+aPyN/dv68/IX5i/OX5a/MX5O/Pn9T/rb8z/J35+/LP5h/pEAUxArSBfkFVQtqFNQuqF/QqKBpQYuC1gXtCjoWdCnoXtC7oF/BwIIhBcMLRhWMKRhfMKFgcsG0gpkFcwrmFywqWFKwvGBVwdqCDQWbC7YX7CzYU7C/4FBBSaEsDAszhYWF1QprFtYpbFDYuLBZYcvCNoXtCzsVdi3sUdinsH/hoMKhhSMK7y8cW/hg4cTCKYXTC2cVzi1cUPhS4dLCFYWrC9cVbizcUrijcFfh3sIDhYeLWJFflCzKFhUXVS+qVVS3qGFRk6LmRa2K2hZ1KOpc1K2oZ1HfogHMfCnQrDUhBiJ9K9Ej75HWFnBWms62iCnOr/QNYoqkRmdO6dwHcuh8KN3QprSkVdzOzls0X8b6mCdtjqds/eTtGzzfqIjtUS1SnXSaBmfNzAk+zFkERWf4xPZLXmH7RbMS84VL+obZbKenOHlq5mUdjLd/OjCMYBXA4YDnAOYDtgV8NIKiF+C1yOkOKAD/CjgWEGX0bMKmL8dbO5G+EHAoYMsI6tlKlG4AeCpgESBwk6c6uI10cHvc4uP9zMEkALzati6vPkbrY506GwFOAhzijK9zQodOCZlvUn7qzJtoRYXOAvdwZlL0FSL6TjSdKP/ajpr5YiLxHn2r8gunLeINKr/dzMgi+JXDae7Y0Ui1duhTZEeN6GBoRaN2WaVRq+uM1wRnBH/i0O0CwBXOeG0C/KXBJMLqLAvNie/2ls9phcqcpCOepK9dUswC5VDsAqdMZ0t5I32VJY7i4NApaVqhonYpPkuxgxXFhCU6U0QJipvT0hnfVytqADPfbGullXAzq/cEKZZKK0eKr3BKtnJG7RJn7E4CvMeOnZ5Tnw5OiOAfAMdbnjej5oysN8UZryrOeJ0F+LkzXk8AQuL0nCyCE5EzD2mS9FaAucjpgHRvwATgS4CnW5lydYIcAngnyrwJSPXPqMhdgqTG/eLUfPz6KX6dYjRVlNPV8gm9Zd6lFSqS5XutXJtR6+NoOYK0YnmJI19NK9ZJa1meq/OvcmSZxv0zhycdayLc7+soy/PEbx5WzCh2M50NNF+NSjp8coFThs4MfmK5+qg6N1j9QCdADZdSRFFHXoxdwLuCvkCDGKnm/pBj++h0IfVUUNwfOrtKUajoO8p0+puiird1aHulQ59rHMqQRFzl0Kebpa3pEdGWoQzF7/697Z03y5EXhzOPsghrAc8HbA7YA/CUSlbsasurrj6U91a0X9JD+he2ZvFZJX1IsBvgbYCdHN17ggMh4wp2UEKu5WzkX25bNL8+jZwBjgYgzXApYG1Hw7dz6CAsPprfSGrKJcJo+3Ns373bHWxhYUUTwPcBfwrYyOoZYz0DB57p4E+66KdO32mMCvHuZqQ72FE23ELwVoerv3NkgaQDK64m5hSdmO5m+cpo1Eo+Hp0OFvTlqhsc3nNsBJUxfhp98bq1IzUHHBzo+0nXObgRP+/4cUj2WuxzsDrktE7e2jYrs+aOJvkMvZwxza2UJvubA9jFjpeUSH+P/BhgPUDgLPuhzAuAZE36Wu3n2la6P3GUjXass0nT3jHZaIoP3hLpPrYe10YbSGdphjn0b+lojJ4OvNhp8VqnLfqanXJ0XdpyjhlBovZeZxwP29bNFwrpJs07tqSJMH6qpYBq4nBjL8A/OPrnTCvRJGXyl460Pgi4EJCstmOvZVPA2x2b5drrUx0IjSfpe2nkId9hNZj3loVGj1G75CH81pHKgRYH40v3cPRSL6cvJzkahrwFwhYl5U+sRpXDLPQ6Ai6yvxrv8VwrKUZeDjjj9ZrDY7TXQzOdqxwpo72DAZZLDbcQx9IXIhFBXpCXTlHnUA99EdDMociy073AWo6E/tmB7zlpfNvA3Nohq/dqJX1CNzBIFw2wGsb4mbQrDYtvbNzJlksFdkAEYj7STQK6NUI7aEYvkXTQfYU7beukJQSdJupg6ePWSaetzL4MSevzTnmSMtRg9olI1uiE1U2ODJKfQ7eQ6YzQl47cke6lGxvYXTKWHX0hz994YtjJMt4UYf620y55y9hnNFFK6VY07aOdY2Xfcz3tKnZ0jC+RdThkrB1xE/2Q9q9pF4924mIORN8Fvn5h7tDf7rQy3+oBeYnD1TTLpi+D0i0T2oW81tZm+GqrHSPD/+S7Ek9iP8vc7CEa0v4XfQXwLmfsqEXybBc5VHXXJdwZk7viQfdXHG1sOLNxxR65tthIaF87msZPu89pC9HtPZKXvZD9aP4i2EAWssiDfKR8360qe4G9yKph3+1E9ob+q4HoYSdh960W26D/TkEksdrYiauDnbjTsBNXFztx9dg+tp/Vx07cGdiJa8hDXpudiT24DtiD64g9uCuxB9cJe3BXYQ+uM/bgumAP7hrswV2LPbhu2IO7Dntw3bEHdz324HpgD66XuFDrmt7YUxsp3hTvskniPT26vxO7xJfsBbFXW5GXxT5t7xeLbzXVXhHfa65aih20ddhB24kdtN3YQfsSO2h7sIP2tfeh9yH7FvtoB7CP9h320Q5iH+177KMdkvdp3josfyl/xUrVD34Rl9EeGT8x2iPjNaI9Mn6SX8+vx2tGO2X8ZL+534LXinbK+Kl+G787r+P38HvwC/zefm/e0r/dv51f6A/2B/NW0X4Zv8if53/EW2OnbDB2yu7ETtkQ7JT9FDtlQ7FTdhd2yoZhp+xu7JQNx07ZvdgpG4mdst9gp+yh4PbgYf7b4J1gF1+Efa712Of6M/a5NmOf6yPsc22J/xAW8q3RWXf+Pfa2SrC3VRrtbQkW7W0JHu1tCRE2Dq8TXrSrJepFu1rizGhXSzSKdrXEWdGulmgc7WqJs8Nh4Q+iSeL8xKViSeKyxADxFvaSvsRe0leMMyE3ys0IWBXtFmd+dM+o1vE9o+N7Rsf3jI7vGR3fM/pfu2dEX+Z7RTys04nSVhrCNzZRQ3CmWrQu3cPK7gRPjm54CzoPn8DJ6gvFkzrnNDZJw03aP+CiJUrSLeFdyOnHdrLoPLDO4Q//0JpFEZuiX3tHNQic6Bbfo5UrkD7g1P9J6fnleMJno7jtBtuC0h3lLRIkz20AOwyvW7cr6pWOjXxUkS3zNsXZuD/St7RLWb/4a6X9dbqVwSrq40q2uaynglqkGfEFUYvyNMw6L+dRFFrsvIi+gAv4CRqOB7wvis4i7uB5LIraHP16EWB7/Hoj1rt6lfzAzMxaYGVDU+NLUP50UCNKfwx/8mLkYIVN/AJ1PhFB7VtVibzr0qosikp8ejluo1j1ctymstJy3M7TPmMZPhzwesC72MkanmBaicrfgjS1ni49q6x1gy3ViRkx/6E0oSF52nNFs4iqgN1L6mooSxfrX78vbcDKVk1xAlk8yLdHHnXpCxrCf+Zf8GJd/zC+ETVHZa4ED9Thf9Xp5sihlVuKHZVwRhz3m0zk4nciXpJXaxpw8Vhp0+hsZJSW6dIVFcaOZvHZ0rfK6EM0NKN2qTN2GDWZKJ169KjRWp8Zu0ucEXwzimdjRu1VjA52+mi8vGtLtun+YlWQ+FywCDc9OuuZuRNkZtbE50ciyojtpbVY9KX5qEwReJt2dgaUrEb59eUye4oja7Q+gJOlJF/yJFCGJO5cMyL6XfPlcpq9vo62TkKdv0BMhbVI3wh4Jltahqce2UgGH0b+JEcSSQOMNzPE9eXSSvPoB4HDbbhVMQcUOK10fvm7pE9obkhY0ahdDzrQ2GFXRdSxcid/wy/WNa8Hn9+NsRvNT8VYlMuaGdkLHHmk8fqZI2XflV7Eoqg/5eNl5PHG6F3aq5W0z/Ix5KIYdXbAr9WRbsMvi3LYdyzSmVHJv5TepOFH+BUydZRO+BXgufj1I5Q8FzlLSk8sl8dX8Cv29PlfAGlMsRYqsCJH+pl64XUo3cSiO2Kryt4y8BzQ9mLTd/SLPV5O+fZWyx0Fz3B07+WsDSvbM6JzvySbdVHyI407FzUj7vK6884sij7FyldprkSZn5EGgKb9BeBFkPSJ0JkU6+UbxJSqAd6jWw90Zpi+wyoQkYL4hKJN0J5mig2LVhdh0R7RLZetgpIcVYukhtPKc082VEM67bwkslO0jylGoE7iZHr3zFJfwzzUUAvpruBnsmIhJOVG0JlOUDeJIlrpMY3K3Ao53Qr4lLibRRHbd5ZR1dCTJI6sJ7V7dtSK0QwdS+dpuBa/TgYk+9gZ0b9GkcaDHEHKvJWg8Cul55bJC98V2VBvF8batQgl4OSrojLyBEjQbMhC74pWzOsVSYS2p9G7A8GHTVG+h2MRwKXe20g/EVkEUciu1jkboluirj40UgbbIUjfPg8N+X4kL1536JaVgD+HTK1DGawSq+r8HBbtziwsk2L6VZJk0a4QaQCSrEHQ6uc7WiIFbTkf0cWehg2tXvqoTt9begooFumWX6FdaHsxG7X1RQ52x7RGjagEmytIL/0acBq/i0Wx3KwFIUl/jd8a9Yifp8fiW1CGLPtNKNPE2h0aI28gaiYNdnE0mjTK5KcRz9BNBCMFl0GrY2eB1jzF3JLBGtaPbJ+W04gPcQtSW+qxkJGoDMVcIQ1MPt5JoCqtQpMvNBGy2RI1XGrtr/dUVLOHuxXG1t8F+Z0LjiWbfidyDpdOYGU3m8hq0+oleQJ344z9ONxmIntdJfLNjK0fwA9onD+KPAfvcT6LRf6JtSzLo/LkMxgN+TNLQ/E8xqsqaAj7K6ZAG18DXXddNBbqp7DjPo88n5vxFvb1yD/xvkb6pKgGjl0M7cdGdGiD2ihCTzV4NX3Ra9dGk3U+G/Cn/CENF4LOZKNbAdJNiq6w+66NvveHSHvMLIm0E9noR62NFvUASVdMgEYieCbaohVU8hC62fLGQ4AfTh619qXnlI8g8UAnp0fU7o28ZjnX/RYa9a+RXvI86MCOZizWg6oRBYbBo76M0vj1FtA/HXELf7eURznw56djdO6Fve5Tehrk9NQyyL8pLdD5PSB3JCO9AOn0xa9Kv2dH22uSxDdKnmHRnmBkr2kP9yrn3U6AH6B1gmR/u6Pdl5G+3SkPW6+ugs8AX1rOh64g7UT8Rh7IndCuddHucH5bJKEoeQSwXdQ7rxX6iD0pcSHqfwDcSF4B6dvXDI/NwWhG1KPYtG1YI13DM9Eoe49irHeDx+YBngL6wx5J3FsRt+NLRffBitFJBpr1UORRnFjgf4VmuAE8swC2D/sydHaCZn9mz4UiCXilIzW8IirpNWD52GWIeKlOlDbaowfgoQjq+iMuornVoZINkeaJIP1qdAvx2+jSvZrOq6FP5pT21DmzSnaxMsv7MawGcSlxFMXBOhH8f0FEDfkAe62cD2kumYAOuR45pEmuQvouYzcZM5G6RHvQ4UrMEe4Fn98BeGEEtebppyEw4eRd1InGgr7nLQYDh6WAL4gFGv4p0lee+921negv7Sz8AKlpZOQlqoFmlD2M5xBpwgehgckTo5MnhdFdXYrFpfIhffdYXUrRtrSNiFq5Hh4XoLYR41lkm7ag/ogTCkrbs8jukN3UkH+FMaKdYuzoyXujd9XvUcMbPI3yEbZXAmIfx+sHf6ApPI22Jft1Pu1MvQFK0uwDrXhnQ+fQt3bOg2a4FD4PvlIsfoM1gdpRDfwb1FMbfksK6VMi6LUCJ+xjmkO8dRwe7w8TWRRrM+K669DHp4AbRp//EfMdyvk14HrwNq1vkKeK3cnK6xJlcVKBg7viUXaS1q5RkPdFfvWZjld8A2STtB8kVM9cppeNJllws0+KVQWvL8aCIhlPhew31Nb5+J7R8T2j/557RkqulxvkRrlJbmbRvmkkx9HMJfIjI23X4B99o4JidBW9dDxG1/EYXcdjdB2P0fU/OkYXnaGjczd0xor8iO2AFLn1M/h0dAvHia5hTqnQ2WFau6LotDQ/PmJzzNkieotm3k67JnYUVnDNySngIAc4OKyED3jQwYSwpagqiBvhUdygMYAdbcQOj6IyPIXoDigvbkHOfYC1ABEdypsBSHVeaNLRLOR6vPU9cq4D/A0gomfJ3zo4nAN4qq2H4iEZ3B50cJtr8fHGOpg0cNJUw7PHaH2GU2dLJ4cic9D6NJ1R6u7Qmc4r0UnV6pbaJiI2+fh0l4K+5ZBySu6zY2dOX450+o6YPd4vnT6eailPfTH9JcqPqkT5Fg79n3JGocDpO2LzeNucdikK2u8Auzp89Y1Ny0VmHsbK+YdO52G/xXw/tKNDjR4Ob1d1uN13eJvqoajf51ro9USazlLRFynojhF9mYBWW+nu14mWwwkTcw/J5fCLLQ6iG75CQTL4e0TnGo4cotgVDk2uAfzAjoUchjQiKpm4NRSVqoozCs5IefMc+g9w6E/xkA45bT1uW5TjLPSWI02xTCg+0zdOi4iepalna+5t+dyVU5nv4Had0+JZDrY3GNws9YZbSTEa7DqDZ/QrneKk2ed9Dk8CGknJQPbpFGofhx9oXCi+9iJHQ7q6ju4IUkRyuo0hHP1JeBY65R0NTLXRqom8yhn9N2x5E2OabtJcYTWwuZeGeCpiA7DqGsXoMjeiCM+yFuewsm+ikLZ/2ZHxvzocBYnTupdGTc9WSefI05GDqFQeRUi6GfBsR/dei/KIsyWur6gB5KCKWpdiXHl/AUSMK029ihqAIGL+eYMdLiVtQ5G9agLWi6ACx0roVbkY+TfaFtW1yEeUHe9eR0aIH653au7o8BtJRC2Lj6AIc90t13n32LdEfyeHqARLIWBBNJ9E8AHANg63P4AYXa5FuNDB6ikHz1OdMSKJQ4w6c7tIWEhx2AViNAqKpNWiorYhfiD+NDxDZ7ebWg1m7h5RnB66CYEzy7TeJq935IV4mM5fP1kpXeRIBO3s7XXslENt0zs3TbbgfDsuYp+jzZKAFM3xXDM61mYR9chqvIIYXW0tzoZKP1SyHWQ16NbFEMdq7HdoeOOPWw3XdqiB1nYYCpB048S6OS1OFqGd0wq+RWH2TAqcMd3vjN33Dv6034hz3+bu1wtOzR0tnQlPYzHfRY6KYnSR3jZcRzalF+TFtSYUeWuWTcuYpbCkCKNkTR52ZOc6KwUGwppQlCzTVndbXp5nodEhrv16yoHXWB4w3tfNjmYY7pS5xrZrYGNbpyix8Cgb5OJ/toPD+Y6Gv8DR20eckVpnodfc0d7uHXS68UA72J2shBpeIh6jW7Z0kr0GSs52IOlzuuH3c8dSvGFzaO1W0t1EaS2LsS/EUXRivZ4De8Mm9nNK0o0o3DAwN2+2ORDyIuHtUJQvcxfkMkea6M4H9YJO2VPfT7Law7RCsScHWQobSg4G/LmRbgYuYuWa6mIHkldMNCcJonsD1xhtE737lCO/tEf3tZUpE0XskNOXwU7NiHTrUfQ+GiPcfjD3iTs59dD9J/IifnDsMsXaxOl+gZpJS5vbS1g1d++1G64gWW7rjD7pE9dfpfpPdvjt7EqcSXpjgxlrywnLAA8d/y7F8Rhdx2N0/a+P0XULf5G/wl/lr/NVfA1fxzfwTXwL386/EOPEeK+Jt9X72PvE+9T73PvC+4v3pfeVnCVnyzlyrpwn58uFcpFcIrfLHfIzuVPukrvl1/Ib+a08JA+btfECVaSqqJ+oE9SJ6iR1sjpFnapOU/XU6eoMdaZqrJqopqqZaq5aqJbqouCR4NHgseDx4IlgWjA9mBHMDGYFs4M5wR+DucEzwbzg2eC5YEHwfLAweCFYFLwYvBS8HCwOXgmWJDckNyY3JTcntyS3Ma2N/z/7KjqLZqFevn60LYvsa3QjLrIvUSTPyJePVici6xv5mJEFib4pF/nIkeaPbHz0faXI1kR2Mdr5i9aIojgPUYTNKO5j9H0qb6Z+tNWL7tZFN9mi22ORnY5ibnpr9aNtSRSpM7qp6e3Uj/ZGI285ihUZxSSNTkNLbUci70AW/td8Vby0/X++zuPwfzycZGH1kVWGajiGJb3Tj98AO34D7PgNsOM3wI7fAPufcgOsaHDRsKKRRaOLxhU9VDSpaGrRjKLZRfOKFhYtLlpWtLJoTdH6ok1F24o+K9pdtK/oYNGRYlEcK04X5xdXLa5RXLu4fnGj4qbFLYpbF7cr7ljcpbh7ce/ifsUDi4cUDy8eVTymeHzxhOLJxdOKZxbPKZ5fvKh4SfHy4lXFa4s3FG8u3l68s3hP8f7iQ8UlVWSVsEqmSmGValVqVqlTpUGVxlWaVWlZpU2V9lU6VelapUeV6DTf6sjamFhKFHubvgFJ0c7oi5jYAzKnJqcin77xQicfEauboo/TKUITDwCRIRRWG8y3aWnXD6uX/jj7q0dfoaZYOO9G5xnNWT+KarAbEFj5hNVbyKFoWPS1bNrVwj6joq9XdrZtRZ4qM18YpbbUZ7Z+E3ecWqdvG9OJ7Ikl3VnZ13N7OhRArC8fkQ/4dpRpUNKJmQgc5ptOWHnjfUruYCbSg8JKmrzVUtjUTGceiZJ08pciSVBcBKyG0VdgaRQURUzHajl/F63jm6x0Yo6+kEorePRFcEFxhrBaLmndlb5zTHfFEA1CvYZfaT2ZToNS9McbcE6Q1sa/xa+gg0ffGMZKlFpq+2XiDNEY0eourelhbUrQ2uOdDs3Psi2qa2395hQnfWed9qpOcfiNbj7Rtz4obtMGhxOIo/5YkesUzpX7v3LK9HO4lNbQaN2sg8N7FAXkLct15isfN1p86Au+/uUOnekmDeJYyIWWPvytaLzMXvCQkhnMfMGAIpfItviVdmwH2rHjaJeDkyWNaYnlB7qZx1/Fu7R2SnuFFG9jLPJ/HUEu0eI88AztITqcQzHbTCxJ+uZ3S8szFEnL8CRRYHolzjndjqbcYbnI7DUQ5xRb7jU8QyuT7vhOdEZ5lR1f+gKAh/Ok6glbUt1XaWQrjynFW3oJObQqjugjkqKnjEL6U9sX+Z4tH1Sz+FA8EiqvaK8cUVHNt48oymZdy3sKq9wKo+xTHClaLyUNSd+4gM7x6AYG7cVfbHnPRPOiqH74AhKnL1TQjSh8v4JWs01ELlCD9BLpc1rR1bpoULSCitGnnVmK50eQvuWF9X/6UoSinZdJdhQUyfXZDoYUWxQxbEhDypmAywDHWI4ypwjoO2wX2vJGx451cJhmOcdw5i8tT9LXQgS+oa5oRRqr0Kqaw417HD78yuHDKZYP+dcsZGXfMLnV0tBENqKxxt6Bf4mDySa0Ql8sobNAxG/1He6CniQdS9+GlxhrRZGHkhY3swIPe2oi3IC7zLet2jp0o/P1FPEIPEOxYMV3EfUEaU6SJrKDsK2CvoBBUXnIOtM5HLp5QPGW6Fvd4CsTzYjiOU2KdIWJ8eNo0YB2XTHi/hklw1nZF7XplAtxuKs/SS4onhCdLrjZKYmxoP2UAFwRUO+Ir2CRFXhYUTS7P1QqSd/VhhXjB4AP3bF4Em/Vdvq+xMGK9hfIb9ltS5JtIr/C+C2LHOh8Z53T6X7ICO2FCbo9UNeBpMlxWom+jy4glQJ7W3wH0sRddIMfrahO0NWf4Ffs+5D2410hv3TvZAZ+hScjSSdjx5aiNZvImiRZ9Ovz0Aa0t4XIYebLSzFHS5A3RWl4OHwYWqRz/fhquCBuhOYRLQGvsf09yqsBVwv6KjxFxsW4cNLDdBoEo0m21cR/or0nim5FGoB2JOkEyBjbIo0g3Ss13+mi/WvYNXPmqld0F1zMtPxJt3b87fiVvI65uEtB0ayxD2XOq1Cd1F+K7UpSRmeoSDPTTh9FVIXe9unrixStmTQ5+QNkC0gL9T5GSYIc+CyxfSF96FEvKGoX3V937+WT/pyOHNqbO9PSkCKHmRsSxG+ko8gHw3d+KMqd+bXIoTntz9K+Wz07amasf+fw2w8EwVFx8OcqQJIawpmiP4IP/TGWwoK+yTbWoTOoaiRrHOoEtxs7nlMpTSOy0NKKvgJE2lt2w31TOmtxttPuUMs5nL5oBH4z3hTtjdLutpsmbwoyJUoBb45GTeLOkLwsuv3D16EG0vNTHHq6aZIs2C+KA0o+m6JvUj1W+ioz9zIlffmK7sTQfTL4ikaKyYLgu1iSvmpIlprGhfwospuw45JmfGQjKFI4RSX8P+1da7QUxbXuqu7qOdMHEJz3+6iEEMQXICoiHhCPR+QlIqISRUREL74NQUREROQVwgUkBAkSNUiQIFGCSBCPiMQgQYJcQ1ARFZGAAqIiIQTu9PeVqRJy/2ete9asqdWrp6a6umrX3rv2/vYurgjkx9UZiymtHrJKaAuKZ3lxR8OchZQRswzVcUdG7U5ze8hBj+eCQj9UGAfqaT7phBoCpBI1Z0olZp2npk3dRnvkoR1RI9IxeZUWlVI6Q/LKOvyLJbBqzLqqtZT1qMPT7bpbVE3aY83TDeUr7hZnmGvFnTL1ojetFUHkKtcj1zhkIjOI67yPLIkvslai9xczGnpvxXYouyHLvIVWa9Q6iKjheiePoi5E5EbWzKAHHqLA8RQwNkTqUifUvJSng5JLEF1wjjU+PzfUwlXMXImaDzDjYM8wqsw7yWh6mhrJu64N7/sl/Ara87C7UcNCDc2dinaIboJWIP6CGWQuScoIarOjwxg+vd7PsMZ/KOqzn3wLauzgUTxbjLtsag56L0bZij4zStg7C/XPP7Y1j/t9IjeA91DYB3HXxpb1yYegBFVtrVxoPlr3KFmzdoZZR9qighPqxD9DiSyIp4JEVsRjYC1rjDRXzR2IJeX9+8NrRW3H4ZibkqOns9qfZ2ZWI23ucM6B/DonXPtHGzs6d6MiroPrjrtvIvGI9mlv0dvPzFP0ydiQYjwfj1GzHt7R/6uharEL40yp/VOU6y2q24FfsZuO9LDokKd9NgDNULsgX6J+9T7+9ZYZPa1BMddLKPGl845T4YRcr5HTxFFOrPyJOmmnVKbFk5wznBOdduXPSU6n8udk5/Ly5xTn2vKnqXN9+fM95wZngNPMuaP8ae7cVf78wBlR/rRwpjk/d051Hneedlo5z5U/7Z2lzovOBYg4vNBZ77zlVAN/0gkRhxch4rAzsCg1wKJcAixKragUCedSkRLNnN7iLHGWMxBok5uAMxkkeolezs3AmQwGzuQW4Ez+CziTIUCY3CYmiInO7eIFscS5U1bJ85275QWygzNZVpf1himyVvZwfiYvl72dJ2Sfsrx8CkiSBXKanOGskjPLo7ZG/qI8amvlkjIP3SaXy+XOdvmKfNX5RK6Wa52dwJnsRTzilyHCRERDhIkIwqhE0SCMRxQN5UHXFY1d5VaIvBu4CVHlptySaBmiTcTZIdpEnBfiTEQ79yy3tbjAa+g1FNVewkuIjiHmRHQKMSfiohBzIjqHmBNxcRiVKGq8R71HxWXeeG+86KpqVE/RTfVSV4m+6mp1vbhO3aBuEzep+9R94m71oBol7lGj1RjxIzVVTRXD1GPqMXGfmqN+JYarX6sFYrR6Rb0ixqgv1dfiEfWNOijGqUO+FBN85UfFNL/Sbyhm+if4TcTjfsxPiTmIg3wKcZBPIwLyV4iAnOdf4F8gnvFr/Box3+/idxW/9nv4PcVCv7d/pVjkX+X3E4sRE7kUMZEvIiZyGaIhX/IX+c+J5f5v/efFCn+J/5pY6b/urxXr/XX+RrHJ3+RvE+8C2bLT3+9/Kf7mf+1/I3YDzbInUhGpEHsjTSJpsS+Sj5wkDgLHciRyR+QucTRyT+ReKSNDI8OlFxkReVRGI+Mj42UiMjEyUSYjP41Mk6nIyshrMh9ZE1krTw5j6uT3I5siW+XpkQ8jH8rzIh9Hdsp2kd2RvbI68kXkC3lx+YERWVNxasWp8pKKgRUDZW2Ib5GXhvgW2SXEt8jLQnyL7Br9cfTHslt0fHS87B59PPq47BFdHl0he0ZXRlfKK6KvRv8ge0fXRt+U10b/FP2T/GH0reif5XXRt6Nvyxuim6Ob5YDolugWeWP0/ej7cmD0g+gH8qbox9GP5aDop9FP5c3R/dGv5eDoN9F/yCHRfwaOvCuQgZQ/CrwgIocG0SAqhweVQaW8P2gUnCBHBE2CJnJkEAsS8sGgGBTl6BBpIx8OkTZyDKI/H0H059igbXCefDQ4P7hQTgw6Bp3llKAmqJHTg9qgm3ws6BH0kI8HvYIr5OzgyuBKOSe4KrhaPhFcG1wrn0Sc6FOIE30acaK/QpzovGB48IB8JngweFg+GzwS/EQuDn4aTJMvBY8FM+TKYGbwc1kXzA5+KVcFTwXz5BvBb4LFcl3wQrBCbgi9lHJLsCb4g/wQOJyPg3XBBrk92Bi8K/8WvB/8U35ZeUHlhW68smNljZuqrK281C1UXlZ5uVuq7FPZx21WeU3lNe73G9Y0rHWbN+zWsHtZ4od5TF/zVv9feUxP2VrVoVxudxp4fn1UZX1UZX1U5X92VOWJh8qKjB9rEDsxlo4VY01jLWJnxtrG2sc6xWpj3WO9Y9fE+scGxYbE7o4Ni42MjYlNiE2JzYjNjj0Zmx9bFFsSWx6ri62JrYttjG2ObY1tj+2K7YsdiB2Oy3hFvFE8Hs/Gq+LN4i3jreLnxjvEO8e7xHvG+8T7xQfEB8dvj98bHx4fFR8bnxSfGp8ZnxN/Or4gvji+NL4ivir+Rnx9fFN8S3xbfEf8s/j++MH4kbKgDxKNE8lEPnFyonni9ESbRLtEdaIm0TXRK9E3cV1iYOLWxJ2JoYkRidGJcYnJiemJWYm5iXmJhYnnE8sSKxOrE2sTGxLvJN5LfJTYmdiT+CpxKOkk/WSD5InJdLKYbJpskTwz2TbZPtkpWZvsnuydvCbZPzkoOSR5d3JYcmRyTHJCckpyRnJ28snk/OSi5JLk8mRdck1yXXJjcnNya3J7cldyX/JA8nBKpipSjVLxVDZVlWqWaplqlTo31SHVOdUl1TPVJ9UvNSA1OHV76t7U8NSo1NjUpNTU1MzUnNTTqQWpxamlqRWpVak3UutTm1JbUttSO1KfpfanDqaOpL10kG6cTqbz6ZPTzdOnp9uk26Wr0zXprule6b7p69ID07em70wPTY9Ij06PS09OT0/PSs9Nz0svTD+fXpZemV6dXpvekH4n/V76o/TO9J70V+lDGSfjZxpkTsykM8VM00yLzJmZtpn2mU6Z2kz3TO/MNZn+mUGZIZm7M8MyIzNjMhMyUzIzMrMzT2bmZxZllmSWZ+oyazLrMhszmzNbM9szuzL7Mgcyh7MyW5FtlI1ns9mqbLNsy2yr7LnZDtnO2S7Zntk+2X7ZAdnB2duz92aHZ0dlx2YnZadmZ2bnZJ/OLsguzi7Nrsiuyr6RXZ/dlN2S3Zbdkf0suz97MHsk5+WCXONcMpfPnZxrnjs91ybXLledq8l1zfXK9c1dlxuYuzV3Z25obkRudG5cbnJuem5Wbm5uXm5h7vncstzK3Orc2tyG3Du593If5Xbm9uS+yh3KO3k/3yB/Yj6dL+ab5lvkz8y3zbfPd8rX5rvne+evyffPD8oPyd+dH5YfmR+Tn5Cfkp+Rn51/Mj8/vyi/JL88X5dfk1+X35jfnN+a357fld+XP5A/XJCFikKjQryQLVQVmhVaFloVzi10KHQudCn0LPQp9CsMKAwu3F64tzC8MKowtjCpMLUwszCn8HRhQWFxYWlhRWFV4Y3C+sKmwpbCtsKOwmeF/YWDhSNFr6yANC4mi/niycXmxdOLbYrtitXFmmLXYq9i3+J1xYHFW4t3FocWRxRHF8cVJxenF2cV5xbnFRcWny8uK64sri6uLW4ovlN8r/hRcWdxT/Gr4qGSU/JLDUonltKlYqlpqUXpzFLbUvtSp1JtqXupd+maUv/SoNKQ0t2lYaWRpTGlCaUppRml2aUnS/NLi0pLSstLdaU1pXWljaXNpa2l7aVdpX2lA6XDVbKqoqpRVbwqW1VV1awqjP6E9ULVmP239mZg3yZ6hF4Feq5ow9Aede7C61CfEWBvmf00vTT65ANGcRF9QI8Zbf/3h6gBBdsPIy18RkvQa32l+a+3DfgCntBG2xtsZrTlK1jc6UOjL8WDxuPdAysF7Raz4UftjzrYp+odfAH7y16mD8zIo6NMiBqgbbvtkYX/evqL+Be9N2hTtwC/Cu1t2pZPOwd2+aIvRpJWT9hRNB5hl8EjaDvT783+3vkKO2OcT+PCjqJorSmitZbWfCXRDkZA7EUPaV2An5Y2MD5Xn1mCa+IU5FFco454FS3T9t8TPiXaHdmH3ehPV5R4rowaRAPjb3g6u/Za0PrF2TkO0SB6IrcjfdGwe2l/ID0bpEl6DJaiJq3RPC+EMSu0hoKKFHEuPHWD9lT2oRMogRkFOoESAtT5H/ScSIdKjBjj0WFtdXl21ATTEx92TbETLfDpv8W/eNYI2qS9TeFNFa1H9GjRzoHIHlpzPcw+o68UrfJEQMAmrUaY//r0RdDXyrhkWHYV0DG0tej4S1iddewgsQ/0d8G+pWKmTfrKfNLzKGvVYDUp2pJJ4UCLaATEmcciIOQ/QC0d/z0OQo8/47eIgyAy6HK0Ay+6h7cQyw0aQv4CvxITwRNWHqJtEuV6/Doca4H8waI9+lt0TBu8QzpnLj3M9H3BNqlRA3OPo7qvzYx/BxOx2aI6rrg+Fr3hzELtN+aM/8aad54E9gcz7xF4njUeh2POvGbTrBl/wprrkWaudQ8x19/J90r/P+kKFscIbGbey2aUIuRR9EoRqQS/qCKKimcvMV+bjYwATYq7Qj7so89+2pTuXaABnvrDlQ7eoi2s5PmMIq3GHdIwVyhP+LOwEoySp4fEw0rX1nFSC7ESuywvKPACojPuECtxiaEc2sV9ch5iJXC6p+LbkZKJlaCX5mzTT2bx1nkvOP79cb93+L70bytmY6ef8/Mjdd9yb/ZWxx8fj574idWrORZFVVmzgJki//TrcB8+RmIoNHrieAwF6dbGUEwxdEtfrsZQ/MhQF5EUPnw7GkkBiUDbvD6niv4frmXrjCsd00kkBb0oFm9XWAWKyEHSRjEcJfcT01tawSlrtOcW/jTtM2EdIhF44tErYU3xLmTTj/Ev+twEfm1qSu0xIJ2QPsnbYQUX1DSI89oHDyG1HfpteFYW5eY/zJi4mEft0+MZY/R/sueYI8p6nQ3lIvQT3gCN3YO08jFftrajtgENwYy03czIu8hwrXWPlahDdAbXBb0BDq7Zc8bQA2fhY8R8xtNDq9F6zn7r6UTr/B1Ssqep7xN/B/oRy/DcVtZIkja4Xl7AuL1lRol6FFEnOlsiI2vp82R0OG381AP7hO3TR0Etjrqi7i1K+nK1H6OX1ZNTrTk6ZN1nPCtHkn5gyiPWX4YZ7wZaQqmYw/0Deo1QB5RJvY4eEmI9ZAIl6FlOwzV4l7PfaGtyEu5PNrgPnndIX73GUDDL7XRTU9d5AndIgcSsQfrIC0FXkGiKbwcPqrgK/acWCoSIPtVsBPqzHXco3TCSYgje+gbM2hH8Cgp0eL0R/wJqhl4XwTPD0KaAPix2mhHWWmgHU2pueYs1epPxLyBDxTbcWW/u66whNq6EtATPs+aNlCP0w9MfSC2OaE0bV0IfJqSw+A3yhBJdchnyrpJX4w7lC9ElegcBbmNjTLx7kYn1XfxKHYC+uKPYldAj2sOMLXUe7cWNmfsKPlKf/x1n0XZbayUStcEdilVfgW/7eC9x2OBNBM/Po9eXOFDMrJYpU6yRpL93o1kvOsZ9LkroxqIGHBuj5DHy+3yLYrmv6WzWgpYy1MYpK7+w6ryP0aaXO29G43iUCqlII02mWRTV0loj9AwDoyH/jHIJSu5liBwfbqjOp1aMEdD71oVY1zwzALsAQc78tvHu6lw+nDVm3YUvWmeWp951ynHXNxp6phykfkXe6/UGkuULPIvnCBLPQuSOhWfxoEso5upoFEpJrRUz7wI5mH0NfVg8h3E4hHKAhWqpRU7biXhTaCz05bpXoc0aQyF6RuxrjjxzJAw1Y6JxLlPCU0zkbuTwhZzVaBdmGyI6uOOxaBfirzXaBevF48w+bkaMuX2paQhoCB6xtM9h9DCzivtEIoh/Z/6lgBCRGElFXWg6/kUv+ixTihtMr4iLV9BjPeQt0GhxF/9lTmGiL0HV3mjcp8ZObQTrPUJexHeh1KZ0wI5S/B6zALngQfP0sHKJxFc8OxPIHZ87TeoS1OvYf2hQ3s14OjkkcU/0ujOTNf3zxNe8D/rB3tZDDg+eL66I4yO3pKcdfINI6vL6qvtW95Br0fJaIqfwxM8N9R6PxHG744lEa5JyeqMFPgsjqfcsWLPE7NDyoFcZdGYBZJNz2DxXzwhRPJyFgYY+eUf1R/vUf4iHogTEvkBrU8QZnW2ojmeHaCROB7w79nSKcQnYv4Qi5dsWPMgvog65Y3IvxL8sbsmSkk7vgBhVQOwP9ECdK24X/svYDuqrwLa7y8A5MacKsl4APU0LhpYRlC+0kGBHINaH61FgRXjYsxA35GG/48HywDNHFfah3HXqbCXMO8J96xbINWKIuFskNRK7zTVLPZ9If8oX7AjEAPCZJgZJpPd9Pzp6wNHWMJeWFjxRo5BuRv1LwDF49irxjERTYnWon5rRcPugPqMEaHPYaCFwLZwR+yxm49eLDM93F+POQNy5kVwCWCSeQ/Cp9Y6Q+IL4uwGW1oe1SXudW7BwSdSLjsMliUF4CpGnjI9Zr60Zps061KfN8DFzTc1ZEn2MUu8BaXXh2mQuRtocyMO5EsET3L8bivW2oTVySKJ1yDeIYIV9hhFmYjqwSx1geSO2CDyZCCaNQyeCjxlreoRn4ZT1mQXQkcrXijtu7hp2W+UFZt1pBFNBt+BAGobn1kwPS/cUnFhGOwZp/mozVhxtDxKKOgl3dt9BMEE6MEpATTZvTe1C3BLOy3dwTF8dh2PiLoaZLLF2qCHL32HHxFXAPSalGCyxzGGmbXFx1IduI4gEfxMUiLkQs0A/RMeDO4l38Osc1DzBUK9cY3Hj7+EpjPt5zdCM3j/yVCTiealX470E+TkomTobny7BJRhvJ5eZ2QkzLzjSmeVUIA972jnDaeCc57RzmjrV5U8z4Kq+71xW/jQHuirMlHat0wLoqpZAV50GdNUZQFedWZ7TYc5ZwFi1csaWP62dqc7TThvk+LkEud0vRY6frkBadUNu9+5AWl0OpFUvIK2uANLqSiCt+gBpdRWy/vRFbverkfWnH7L+/BC53a9Dvp/7ke/nASCwRiLfz4PAYY1Cvp+HgMN6GDisMcBhjQUO61Hk+xkHNNZ45PuZgHw/E4HJmgxM1hRgshbKatnPWQQE1ptyWplqPwb26rMQeyVkiL0SvlwhV4hIiMASFfI1+ZaoDLFXIh3mghenA3XVKswFL1oDe9UmzAUvzgmz+4hLgbe6HnirG8PsPmIgUFc3hdl9xOAwF7wYAuzVbcBe3Q7s1R3AXt0J7NVdwF7d7d3vPSDu8R70JoqhqkbdJh4GxupZNUKNEAuBtPoNkFbPAWn1vJquZogX1Ew1UyxVc9QC8SKQVqvVl35KvA4U1S6gqHYjm/xnwFJ9DizVHmST34ts8vuRTf7LEDklgxA5JStD5JRsEGaTlw1D/JRs5C/yt8kTQoSU7BTm/pEXhTgp2TnEScmaECclLw2z/sguYdYf2S3M+iO7h1l/5PUhWkr2D3PHyxuAhBobWRPZKSeFmXvkc8A6LQXW6UVgnZYB6/QSsE7LgXX6PbBOK4B1ehlYp5XAOr0SfSn6tqyL/k90i3wXCKYPgWD6CAimj4Fg2h7dE90jP4nuC5JyR4hacRuGiCQ3HiKS3ESISHKTISLJTYW5f9x0mI/ezYRZf9yOIc7IvSTEGbm1Ic7IvTTEGbldwqw/7mVhPnq3a5iP3t0Y5qN3PwixP54IsT+eV9aWQm05tH75x+B9dtbjferxPvV4n3q8Tz3epx7vU4/3qcf7ODrCyqOdklHKtJowDqQx7MeM8UD+cZfWKeYixz5D/0pLAywfjKhRtNqeY/ZSijYAWhZLaJmxZIy9pK0Ftkxte4PPwYM3yd1idnLc73qw3kX4FFo4eI4V9qDeffBOMw6tEv4Q5nSowTVttF3QB1gT2Qf6e72/mj6wfdoO+XTvj2ghbbV5v/VfWtOBCtHeD9yhf1L7o4Bd8pn/HZZgdwczO+DtaJVH9KM72LLU7sUTuYM/C9cZa74GmCeKT7A7pM3Gx31m42V+WHqwuXenTdo7ur7cH+YTeQP14ZEQn+HpzPdBfITEHaI8iHP5xOCDOALMqMsdtss8F9xBVqEE+oDRgPIE2BLo5cPOVdH/bMVlMQu2V0JN5pThXDexRh70QP+5y+wqtJwRq7IVY8XcwSPQW/q0l+EatjQJCvH6wzvEPTTyU+gsG5dgfGiZSKImn342rm9D39gm/DZEz2nclr0uGP9Jn8YkQ6tcFxr7gNWh18XvjlsXfQ1l6qfcZdEe6ZNe5T+adaE416eZNhXm16flmOgS+iRhk1bw0GobD+jTo8/nJ7h2cM1fyR8clOwbc3Z0NXOn7dao6dL3+33U55nFCwxt09rnplBzkxkxhfoqwP1huG6Kkv20aY+UlrJob6WhOmJSSHuaazU7luoYwa5jApdYb/G6RXXouUoZemNkOP1sesaXW/NO+9ZuQycRckUiboA4UPCQky/pGb/Gmutaa64vt+Yas6B2WHPNNYXZjMB3FEnDj0daWm3ei1bzCLkEMXfEwiw2v5Lrao7dOmwngqdH6BdlFO5RtD/O6m21NSP0jNEzyTi96NFbv5UvESJD+5sZcemjACdX4PDelWbMdR3yTLy75qLgk2oS7oNzei0wDuB4PuJa1QHcYd6fV6y+EYvKFUfLN7EMa81TtLyzOLkPPzxL7etOwmbcyOot5ytm/qvlQq3plabeojViPD/mCvAien0pC7giKJueMdSlqfdlizZWW3S7ytAt35d0Rbr1ZmJMQIE+/CT+WNyBPdivQh1GBYOifFILM30DVxIOsPMtJoWSxeLtjAn3GV9NBMcjaP9tq7ewX8ommEG2edh6R3iZPMaZE2EHtKB8ALPzJsbzQkM5Op8Fc0z8Cm2yz/uta0qNvugJrrXEZB+AhNLrlyulj+ktJb5616oDfJZGVuYMfWoPDySOzqFg8fYIZJmt7fjUKOh/uxlrZJuhCr3e8e4efNGKSF5yV2oCzD4DzyFPcY0CTVABOvG7g27BRSMYvch5aI08E1qWXT+CnkRg5/YWombOjKT24H2KMYRO5T0bSknKSt3nn4TXGnlKWqXmRg45OvxV64FvoaSvmGu/OVqmVnaGtZruwSjx119ijbAPnCNGtpPnn2qVlOOkQOpLy82Ms/Tp73rP0tOYbwUj7H6D56Km5j/kCRhJrQlfbGlrQNO4HVFCwkaINfsnnnUK7s83PMGF3qXrPIhncSSJYbkf9EB/2unhfXV1iCNw24Wl5kikKMyOexvGFm26V6CHxEMtxv0qeLr2WpondS3S6iW4w4w5HAf2gTgOnvJSssaWWg0RxwetkaFf6FQ88SW8SxPM1xsob0bJsSUyhX4tIgKIF6avsngsF9I8DZJUr2j42zW2l7oHESjkZlX8FQiFjoZHaT48HtfU4rjGB+KaGIGvMc5EDFk6gPsB6jDfIpFNrQ3taVwhS/DzCnjbKpir6EnwRnjS/EWQqrcZ/Za7Fbu+Dw9hhDiFthg3ygLICI+REC+DQqjTZrHulqGkthnBNWU0dRXyQNL8V5gjag7tUQJXQi2a5zsz9xA9WkRKesRaMifLL6yScucg2plIDR99noSSM7jCUJTeMZEGdqP/pCh6brlG7jMrxePauR602h+9Yp4F+tzAJbRslUbPlIfxL7yL2I7/Rowc0ftH0jlXCv2l/fArd6OkmT7HXd9nOA9rupDFPt+iGnc+RjvEXVJv/LEpdf4CzAgRH+6n6C1XqHU+ol1qffgHhnu43TDaCTyrMegBuz/yBw/v65KTX27Wkb2meK13+pRf7c3sK+ohRA6CYl1onj78rhGgmCOYEfdA6Cv2ce1TukGT9CElI5CYEeJ3zkOfKWfJ4aktT8G6OAVP+Rvq7ICeCbQ+tWUfeArKAqL2Ip1RB35LvWe8CSUtAyyhGfoP4P4olPDqE4mvgNxX+JXyWjVAm2ehxDnjWvrgv35TlLQzUAeIGErwKtF/6gM5/IuUxgyqkBo+MRcO3hfxScyMxlwqzJOodwp5cgm0SfSxpQm7iJPwN+DXVkez5XKNeXetV1PCYlQZQ6BgzfCoL12Md2mFFmh5YDkovFPRHfffRpuU49R7ieoq8le0diauD3O14no1njgYowp+pe0Y861VRqoDPdC+4Xaw9HnuBDFiinaAdmgT+qHifh97t8hhwzG8Bmj5GfQ5bnEn6tiN8L5D8ETwZG84Suo8RHVRuwYfU0TBk0MyEghUSlmgbQ4ssddTG1GTFE7ahh6iMALePowGOQmfO82iyYnmv6oHSlgwtHRba7iQOxdPZ7kAJW0gjOKC9qWISMI4+MTKjUILjCogx+PO4iE8lzEBZ5vSvRFyEPPFmDMXq1tbOZgRj/yK+gx2Lsz26O43tilSLNFMzHso6o7UhnwSOs/LoGFYADxlrAqKiMK/WHyPSFtKc9ipNIdnDAo1Adq7wBu/w/NX4Q40MXmSkQKqDv8lEpBRF9Cd3Ffx7qBSffIZNBOiXdyH0OdqXBNvQmQ9UK6Mq+DTyXs1Whl6l3fSsW36zKQDPd/n/uJrq34U/aSk+B7ukKdRX8J46vxQ3Mugfe7iNedktimuBWYghaynJuMCvaKjQ7AnEn8FRUEPdK0oNP1ctkMbMjPKMUMQ4pwUMXeMMrH2xVp/w+zoll+w+MlcM+MeYolYn1YsF9qaS1sNanrMG0gk9bvWHT4FubFo+fELFlUzErEFxpk7OOoYsG3q1rhTgBWFSCXNr7CvdB/Bf4mmYSY+aoPtMS/Mw0VZiZGkbsO9hrcUd5ZghLHj8BnBKc3+gvRM6pXPWty4l9Hq3ectPQHt6z1Ca5RZtAmLJWfT7cLVh/ttcIexArQvsYT1QNGaF6Kl6vE+9XiferzPfzLex1WBOkHFnRB7HnLYkCtn/935NMQBNW1fjwOqxwHV44DqcUD1OKB6HFA9DqgeB/SvfRU9h8x70s/sgST2mvrEdsZv0A/AE36xv2SEuY42ZyZwWLA0kuVBa/fGKKBRKOHJZ8QCYwv16cNfm30ho1XdO1CzpbU7Z/wt4r689VYfrIzf7q2IJ+fZDT9EC7RSd8YeiDkC2uH+rSiHmp2uvuZZJMx8QW8Jnz4V189ZbTIGqbc1eo24x8J/sY8UtNgxUquvtUfEzk/Cy8SIQc866VvWWbYNtMlYMrnJssHT+7rbeiLOi+Fz3cyxz9X55NkH5mduDi8N709AfeYuboZ2iAVgpBBt8Liv8wbD0qbP4LZO0tGZn3mf3nsiyOhfYj6mc2BjYEYAnq/9d2uWab+kvYeeBJ7UAC+ojkajBZRYsP+2Zp9xdIzLpT2J+3j2/HZz34UdS56M6z54CntyntWrvhgfWIjlItTk02mthNdIt1mNkmfEPHncuhhp3Rlt9fawoTeuDn1G9rzj1sUga3W8Z62Rjta40QpeMOtC46fWW23SSsEIMcajMgsJs8aQnonkitN+gL59gGt6BuBtlmtwB5YGfT4I81rTWskTzz+36BA+PTeGa/ATnR2joaEi+VtcI35J11+AO3NAjaT8lZjTrEVjpD3Gej1q3T/FUJ2OLqZtklQ36jiq62DR3jPW2CYsqmO51ZpBjuQT1vxOP3bePQnPDOad58voCHCOD32M91gzblGFti5zrp+yektvXksz18yfxR7qU2yIuaA3lRT4mKFtj1wa2B/N/9mylY/G5tjaxvauVXOUxT/ZW8b90nfa3LwpM7W5p2Ec6CUjN/jAGnP63mmnJ4dhTD6phbyF1rKseSPNJ9+m/cxqDRgcxhbqCMP+uI6YueYpS+4eMybyWYvymXeDeQrg69OcnGhN2guJrKH34zqrt1lDP8xtpOUCs+UPt6i0i0XD9MnQ9szMIzyNgtkTyFsYS5+xqHep9daLLLodYlEszzg4aNHt4+aJ9Gxo/wZtqFyDV5i5008cbMZWt8xoZOZKsHi7thMvtWreglFqbfWWuRvImUk/m60xvMWqSW7PbHRA5ronGKnHla6lG8sP8SvX2mTrmjoJvKY6Pp8SE33QVMf1SyxAFUrwf40PJVJsqtUr9pynYABfo3Wey9DyYLOOqPMQt2VrOxpVyhHrgzXS1JrHGebddXwvR8nWeSityA2Y8YeeUmaCgFfNy8PuSx8FKYH9vA33mQOLmDJY8Xn6Ht9C8yuO5ETrudCp3NnAGvwcJfWoSbgmnYyz+kwOOQroA+qBRHW9br3RWswOuQpLcj9gZDRvfM3qA+eotTUClnakz9hqbNOqmXE972xfWvoSa5I/kz6Zkw7YJX22FLNLkN4sbU3b73+JEjgO4raIcqVXkGchkSfQl8U6cgPt/Ri9atw5FNIDdTzZHff7Ip/IGuCAjqJNZjqjJG2MsYUuJzeiBGbTbYH70Hxk1GiejJaXQD7K81Ey+h3rReMswKV1noKux40w1yBxVRssam+LJ25An1mHYwuvvs4pxqdsQ8kcQJSn1PS6GO7BWHrNf5gthTyK/eFZY4weJ90Cm6k1z3Phd2V8taUDeJRW1OLo3SoRfYD7TTHOjNW3dQD6t0kz1JdsnZN4QCJ0gHNhVhTt3YqAN16Ichx8vMwVwn5yhcKnp4CK0mhijsZleC5lATkYM6sqcAzqtB0x2gNQnqH/Fc7CP6yZItei9EF9ifFxL0X5iHkjnT+U9ABeoU+quhNzzV7Z2jL5FdtZasZZfoHx5ww2tOi/n6EBrUnWWnQlrZJYcpTMNaZP0+tteqVPhOxgrVnuW/lf4EckRliXlCOM0j/Xegvus+i5ZYa1pyw+Y1/zdFpqVqxJXYutUe5HudO06Jmnn8yz6Ie6H2eTXIhrmdmXcC7ed66pD//ZcA9Jnon3ctuAY8yHD5AaC9+XXnrK0yHWmrKvSeHUpckDuR6paVDz/wbP4rzzLciTuctogBPoSF2kgSf+fU2N4aVGOtAaSeRmogYr91rSwdaWa0xrzLmp9WRKVe76KTEpU1hyT2Rr8tQx6MFm9jTsajUHg8ShZu4utaQPdA/q6trO8JxFP9QHzuVOGSX3znwWMlDQZ+4yy8nfw/nS2vUnFo1R7hNxdhr1Cox8raETiXmRL6I/lEq/BQ6IujT3jN0sWqVGvd/Mu85dtRMcqSvWKWSZLvG+in2LmT5r2ua8TEWvEBGiMSk8tRb4IEnUJFYEZYfOiSOtVcZ1+jrqc3UvJW2jZi9Tyt+ZUuvhfCOe88VIFO41xmNMiDiAHqu5E3ngGegVMdq70OfZFpVSx64wNOzxfaldM1oIWCQtC8j/m5p+asQon9XPjDazCnpRvCkl0a3oCbXrMWiN5fdQElNGCwZ32TmzNnUdllUoOVbEdzAzyxFTfkcnt3cH1O6AqtZrnxYtfRYw5OBha9Y2mJI2AWoUeo/T3eqtb2np1BA4j9yPOyEOyIUtTiNBzrWsTFytxMBWkVegBcYpMiMhsA/k8Npa9bAZAa0F2Tz/ApRtrLKJZU+gbOJJedCdXA/vDiplDkfuEJlDkFYg4vt0Tr1TrdnB/AqgSyTyf0lq3ZR0yWPb1FqcMBqdyxPPkYnMZbwaMkB5zXGHp4STO5G3UL7MxK8smVuQ7VMHJl6e/JlcAphcnXkW8VWSGNK9oAfuAdlzIkbvNLShaYBSjCM/0qJ/8sNWVklNmHoa+UCFtVKIi6TthRZa7vRpTQKuR1qSiFJV9+0cqyd8CuPMiH/k+Awy65GZNPVpg9TJyfkZkUYcGcZfn6JO3R7WYEkEJc+zptWL8iiHPvO06HuPm+tm1hoBt5Qnoh1KPWLcpEXPNvW+ZnFFUuYp1jpl+9wjrLD+S+nAHe5kyjWzsjTvpWZIWxCR7HX/muV6HFA9DqgeB/SfjAM6TXwsdrh7vWXeS95y7/feSu8Vr8571Vvlve6t8f7gveH90Vvrvemt8/7krffe8jZ4f/be8973tnofeJ95n3t7vK+9A94R76hylFB+eZArVWvVSV0cedkJo4dDXSGM3Ag5f2ghCjX3UDMPZe228jeMBgi1tFCjDPnwkZDZlr9B+VuWN6K86xLlHaso74dF8/K3zMlFWTaLduVvdflb5puirBWWV6Ej+pa/ZT1dlPcCoszZRZkDiaHl74jyd3T5O678LWvPYnr5O6v8nVv+lvW1MOulKMtRsaz8XfnvMFD/f8v/BQX96lcAAAAAAQAAAADbY/02AAAAALnmmD0AAAAA5F0LYQ==')format(\"woff\");}.ffc{font-family:ffc;line-height:1.087402;font-style:normal;font-weight:normal;visibility:visible;}\n@font-face{font-family:ffd;src:url('data:application/font-woff;base64,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Plc+dz5PPm8+Xz5/vkC+YL5QvnC+SL5ovli+eL5EvmS+VL50vky+bL5cvny+Qr5ivlK+cr5Kvmq+Wr56vka+Zr5Wvna+Tr5uvl6+fr5BvmG+Ub5xPjrfJN803yzfPN8i3zLfKt863ybfNt8u3z7fId8x3ynfOd8l3zXfLd893yPfM98r3zvfJ9833y/fPz8gPzA/KD84PyQ/ND8sPzw/Ij8yPyo/Oj8mPzY/Lj8+PyE/MT8pPzk/JT81Py0/PT8jPzM/Kz87Pyc/Nz8vPz+/IL8wvyi/OL8kvzS/LL88vyK/Mr8qvzq/Jr82vy6/Pr8hvzG/Kb85vyW/Nb8tvz2/I78zvyu/O78nvze/L78/fyB/MH8ofzh/JH80fyx/PH8ifzJ/Kn86fyZ/Nn8ufz5/IX8xfyl/OX8lfzV/LX89fyN/M38rfzt/J383fy9/P/8g/zD/KP84/yT/NP8s/zz/Iv8y/yr/Ov8m/zb/Lv8+/yH/Mf8p/zn/Jf81/y3/Pf8j/zP/K/87/yf/txgpnMItvMIvgiIsoiIukiItsiIviqIsxijGLMYqxi7GKcYtxivGLyYoJiwmKiYuJikmLSYrJi+mKKYspiqmLqYppi2mK6YvZihmLGYqZi5mKWYtZitmL+YoRhWDQgotqqIumqItuqIv5izmKuYu5inmLeYr5i8WKBYsFioWLhYpFi0WKxYvliiWLJYqli6WKZYtliuWL1YoVixWKlYuVilWLVYrVi/WKNYs1irWLtYp1i3WK9YvNig2LDYqNi5GF5sUmxabFZsXWxRbFlsVWxfbFNsW2xXbFzsUOxY7FTsXuxS7FrsVuxd7FHsWexV7F/sU+xb7FfsXBxQHFgcVBxeHFIcWhxWHF0cURxZHFUcXxxTHFscVxxcnFCcWJxUnF6cUpxanFacXZxRnFmcVZxfnFOcW5xXnFxcUFxYXFRcXlxSXFpcVlxdXFFcWVxVXF9cU1xbXFdcXNxQ3FjcVNxe3FLcWtxW3F3cUdxZ3FXcX9xT3FvcV9xcPFA8WDxUPF48UjxaPFY8XTxRPFk8VTxfPFM8WzxXPFy8ULxYvFS8XrxSvFq8VrxdvFG8WbxVvF+8U7xbvFe8XHxQfFh8VHxefFJ8WnxWfF18UXxZfFV8X3xTfFt8V3xc/FD8WPxU/F78Uvxa/Fb8XfxR/Fn8Vfxf/FP+WI6VTuqVX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qQ2Q2gCpDZDaAKkNkNoAqQ2Q2gCpDZDaAKkNkNoAqQ2Q2gCpDZDaAKkNkNoAqQ2Q2gCpDZDaAKkNkNoAqQ2Q2gCpDZDaAKkNkNoAqQ2Q2gCpDZDaAKkNkNoAqe0/I7VZUpsltVlSmyWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pgljVnSmCWNWdKYJY1Z0pglrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJa1Z0polrVnSmiWtWdKaJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSWdWdKZJZ1Z0pklnVnSmSW9WdKbJb1Z0pslvVnSmyW9WdKbJb1Z0pslvVnSmyW9WdKbJb1Z0pslvVnSmyW9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NfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvWnjVwqsWXrXwqoVXLbxq4VULr1p41cKrFl618KqFVy28auFVC69aeNXCqxZetfCqhVctvGrhVQuvOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqoNXHbzq4FUHrzp41cGrDl518KqDVx286uBVB686eNXBqw5edfCqg1cdvOrgVQevOnjVwasOXnXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4VUPr3p41cOrHl718KqHVz286uFVD696eNXDqx5e9fCqh1c9vOrhVQ+venjVw6seXvXwqodXPbzq4RX6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkHfLujbBX27oG8X9O2Cvl3Qtwv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujbFX27om9X9O2Kvl3Rtyv6dkXfrujb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')format(\"woff\");}.ffd{font-family:ffd;line-height:1.096680;font-style:normal;font-weight:normal;visibility:visible;}\n.m6{transform:matrix(0.218750,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.218750,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.218750,0.000000,0.000000,0.250000,0,0);}\n.m5{transform:matrix(0.220000,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.220000,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.220000,0.000000,0.000000,0.250000,0,0);}\n.m8{transform:matrix(0.224490,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.224490,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.224490,0.000000,0.000000,0.250000,0,0);}\n.m4{transform:matrix(0.243243,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.243243,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.243243,0.000000,0.000000,0.250000,0,0);}\n.m3{transform:matrix(0.243750,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.243750,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.243750,0.000000,0.000000,0.250000,0,0);}\n.m2{transform:matrix(0.245000,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.245000,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.245000,0.000000,0.000000,0.250000,0,0);}\n.m7{transform:matrix(0.245097,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.245097,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.245097,0.000000,0.000000,0.250000,0,0);}\n.m0{transform:matrix(0.250000,0.000000,0.000000,0.250000,0,0);-ms-transform:matrix(0.250000,0.000000,0.000000,0.250000,0,0);-webkit-transform:matrix(0.250000,0.000000,0.000000,0.250000,0,0);}\n.m1{transform:none;-ms-transform:none;-webkit-transform:none;}\n.v1{vertical-align:-131.520000px;}\n.v5{vertical-align:-51.360000px;}\n.v2{vertical-align:-46.080000px;}\n.v4{vertical-align:-6.720000px;}\n.v0{vertical-align:0.000000px;}\n.v3{vertical-align:28.800000px;}\n.lse{letter-spacing:-1.452000px;}\n.ls49{letter-spacing:-1.276000px;}\n.ls14{letter-spacing:-1.224000px;}\n.lsa2{letter-spacing:-1.172000px;}\n.ls7c{letter-spacing:-1.152000px;}\n.ls9c{letter-spacing:-1.140000px;}\n.ls3{letter-spacing:-1.112000px;}\n.ls18{letter-spacing:-1.092000px;}\n.ls3e{letter-spacing:-1.064000px;}\n.ls11{letter-spacing:-1.056000px;}\n.ls78{letter-spacing:-1.028000px;}\n.ls8a{letter-spacing:-1.020000px;}\n.ls64{letter-spacing:-1.008000px;}\n.ls56{letter-spacing:-1.004000px;}\n.ls9e{letter-spacing:-0.992000px;}\n.lsa{letter-spacing:-0.972000px;}\n.lsa7{letter-spacing:-0.968000px;}\n.ls39{letter-spacing:-0.952000px;}\n.ls19{letter-spacing:-0.888000px;}\n.ls34{letter-spacing:-0.880000px;}\n.ls88{letter-spacing:-0.872000px;}\n.lsaa{letter-spacing:-0.868000px;}\n.ls68{letter-spacing:-0.824000px;}\n.ls67{letter-spacing:-0.820000px;}\n.lsae{letter-spacing:-0.812000px;}\n.ls1b{letter-spacing:-0.788000px;}\n.ls17{letter-spacing:-0.768000px;}\n.ls61{letter-spacing:-0.716000px;}\n.ls9a{letter-spacing:-0.544000px;}\n.ls82{letter-spacing:-0.472000px;}\n.ls76{letter-spacing:-0.380800px;}\n.ls60{letter-spacing:-0.338800px;}\n.ls4e{letter-spacing:-0.324000px;}\n.ls44{letter-spacing:-0.312400px;}\n.lsc{letter-spacing:-0.300000px;}\n.ls4f{letter-spacing:-0.296800px;}\n.ls81{letter-spacing:-0.288800px;}\n.ls74{letter-spacing:-0.242800px;}\n.ls24{letter-spacing:-0.242000px;}\n.lsab{letter-spacing:-0.211200px;}\n.ls30{letter-spacing:-0.200000px;}\n.ls57{letter-spacing:-0.199600px;}\n.ls7b{letter-spacing:-0.192400px;}\n.ls32{letter-spacing:-0.188800px;}\n.ls52{letter-spacing:-0.180800px;}\n.ls83{letter-spacing:-0.173600px;}\n.ls15{letter-spacing:-0.156000px;}\n.ls4c{letter-spacing:-0.150800px;}\n.ls55{letter-spacing:-0.148800px;}\n.ls16{letter-spacing:-0.144000px;}\n.ls98{letter-spacing:-0.141600px;}\n.ls2b{letter-spacing:-0.130800px;}\n.ls4b{letter-spacing:-0.122800px;}\n.lsac{letter-spacing:-0.108800px;}\n.ls48{letter-spacing:-0.105200px;}\n.ls92{letter-spacing:-0.095600px;}\n.ls7e{letter-spacing:-0.080800px;}\n.ls1c{letter-spacing:-0.075200px;}\n.lsa3{letter-spacing:-0.071600px;}\n.lsa9{letter-spacing:-0.058000px;}\n.ls8b{letter-spacing:-0.050000px;}\n.ls59{letter-spacing:-0.046400px;}\n.ls80{letter-spacing:-0.044400px;}\n.ls35{letter-spacing:-0.042800px;}\n.ls70{letter-spacing:-0.037640px;}\n.ls3f{letter-spacing:-0.035520px;}\n.ls2a{letter-spacing:-0.035040px;}\n.ls9f{letter-spacing:-0.031680px;}\n.ls1e{letter-spacing:-0.031200px;}\n.ls40{letter-spacing:-0.029760px;}\n.ls62{letter-spacing:-0.026880px;}\n.ls53{letter-spacing:-0.024000px;}\n.ls8c{letter-spacing:-0.017760px;}\n.ls58{letter-spacing:-0.007200px;}\n.ls84{letter-spacing:-0.000960px;}\n.ls2{letter-spacing:0.000000px;}\n.ls2e{letter-spacing:0.008640px;}\n.ls79{letter-spacing:0.013920px;}\n.ls42{letter-spacing:0.025920px;}\n.ls8f{letter-spacing:0.042400px;}\n.ls6d{letter-spacing:0.052000px;}\n.ls71{letter-spacing:0.062400px;}\n.ls6c{letter-spacing:0.063360px;}\n.lsa0{letter-spacing:0.065280px;}\n.lsa1{letter-spacing:0.076800px;}\n.ls43{letter-spacing:0.080800px;}\n.ls13{letter-spacing:0.084000px;}\n.ls87{letter-spacing:0.086400px;}\n.ls2c{letter-spacing:0.088400px;}\n.lsa8{letter-spacing:0.093600px;}\n.ls75{letter-spacing:0.099200px;}\n.ls77{letter-spacing:0.104800px;}\n.ls7f{letter-spacing:0.111200px;}\n.ls5{letter-spacing:0.120000px;}\n.ls89{letter-spacing:0.128000px;}\n.ls20{letter-spacing:0.130000px;}\n.ls51{letter-spacing:0.134400px;}\n.ls5d{letter-spacing:0.137600px;}\n.ls69{letter-spacing:0.139600px;}\n.ls5b{letter-spacing:0.141120px;}\n.ls3c{letter-spacing:0.141200px;}\n.ls28{letter-spacing:0.148800px;}\n.ls85{letter-spacing:0.150800px;}\n.ls50{letter-spacing:0.156000px;}\n.ls73{letter-spacing:0.158400px;}\n.ls2f{letter-spacing:0.167600px;}\n.ls6a{letter-spacing:0.170000px;}\n.lsb{letter-spacing:0.180000px;}\n.ls97{letter-spacing:0.182800px;}\n.ls6e{letter-spacing:0.183200px;}\n.ls2d{letter-spacing:0.185280px;}\n.lsa4{letter-spacing:0.190400px;}\n.ls12{letter-spacing:0.192000px;}\n.ls90{letter-spacing:0.192400px;}\n.ls22{letter-spacing:0.206000px;}\n.ls6f{letter-spacing:0.207200px;}\n.ls9d{letter-spacing:0.209200px;}\n.ls25{letter-spacing:0.211600px;}\n.ls5a{letter-spacing:0.213120px;}\n.ls31{letter-spacing:0.213600px;}\n.ls21{letter-spacing:0.215600px;}\n.ls9{letter-spacing:0.216000px;}\n.ls29{letter-spacing:0.238000px;}\n.ls1d{letter-spacing:0.243200px;}\n.ls47{letter-spacing:0.253600px;}\n.ls41{letter-spacing:0.254400px;}\n.ls8e{letter-spacing:0.268400px;}\n.ls9b{letter-spacing:0.276800px;}\n.ls5e{letter-spacing:0.329200px;}\n.ls5c{letter-spacing:0.331200px;}\n.lsad{letter-spacing:0.338400px;}\n.ls1a{letter-spacing:0.355200px;}\n.ls91{letter-spacing:0.357200px;}\n.ls4d{letter-spacing:0.364800px;}\n.ls96{letter-spacing:0.384400px;}\n.ls3a{letter-spacing:0.399200px;}\n.ls4a{letter-spacing:0.414720px;}\n.ls8d{letter-spacing:0.416000px;}\n.ls7a{letter-spacing:0.436000px;}\n.ls33{letter-spacing:0.444000px;}\n.ls1f{letter-spacing:0.448000px;}\n.ls63{letter-spacing:0.452000px;}\n.ls99{letter-spacing:0.468000px;}\n.ls45{letter-spacing:0.472000px;}\n.ls38{letter-spacing:0.488000px;}\n.ls6b{letter-spacing:0.488640px;}\n.lsa6{letter-spacing:0.524000px;}\n.ls36{letter-spacing:0.560000px;}\n.ls23{letter-spacing:0.568000px;}\n.ls46{letter-spacing:0.612000px;}\n.ls66{letter-spacing:0.616000px;}\n.ls37{letter-spacing:0.620000px;}\n.ls3d{letter-spacing:0.628000px;}\n.lsa5{letter-spacing:0.648000px;}\n.ls7d{letter-spacing:0.672000px;}\n.ls72{letter-spacing:0.692000px;}\n.ls5f{letter-spacing:0.720000px;}\n.ls27{letter-spacing:0.724000px;}\n.ls3b{letter-spacing:0.835200px;}\n.ls65{letter-spacing:1.315200px;}\n.ls26{letter-spacing:4.675200px;}\n.ls94{letter-spacing:7.075200px;}\n.ls93{letter-spacing:8.995200px;}\n.ls4{letter-spacing:51.048000px;}\n.ls10{letter-spacing:54.792000px;}\n.ls6{letter-spacing:75.528000px;}\n.lsf{letter-spacing:76.008000px;}\n.ls7{letter-spacing:92.232000px;}\n.ls8{letter-spacing:98.952000px;}\n.lsd{letter-spacing:99.912000px;}\n.ls0{letter-spacing:517.880000px;}\n.ls1{letter-spacing:1038.640000px;}\n.ls95{letter-spacing:1998.124800px;}\n.ls54{letter-spacing:2019.244800px;}\n.ls86{letter-spacing:2020.195200px;}\n.sc_{text-shadow:none;}\n.sc0{text-shadow:-0.015em 0 transparent,0 0.015em transparent,0.015em 0 transparent,0 -0.015em  transparent;}\n@media screen and (-webkit-min-device-pixel-ratio:0){\n.sc_{-webkit-text-stroke:0px transparent;}\n.sc0{-webkit-text-stroke:0.015em transparent;text-shadow:none;}\n}\n.ws4b{word-spacing:-39.840000px;}\n.ws0{word-spacing:-24.604800px;}\n.ws1{word-spacing:-23.492800px;}\n.ws84{word-spacing:-9.504000px;}\n.ws1d{word-spacing:-9.488800px;}\n.ws58{word-spacing:-9.484800px;}\n.ws62{word-spacing:-9.436800px;}\n.ws7f{word-spacing:-9.412800px;}\n.ws2d{word-spacing:-9.392800px;}\n.ws35{word-spacing:-9.376800px;}\n.ws1b{word-spacing:-9.332800px;}\n.ws2a{word-spacing:-9.324800px;}\n.ws77{word-spacing:-9.232800px;}\n.ws4d{word-spacing:-9.216800px;}\n.ws17{word-spacing:-9.212800px;}\n.ws27{word-spacing:-9.208800px;}\n.ws5e{word-spacing:-9.200800px;}\n.ws13{word-spacing:-9.192160px;}\n.ws2c{word-spacing:-9.164000px;}\n.ws74{word-spacing:-9.149200px;}\n.ws5{word-spacing:-9.120000px;}\n.ws86{word-spacing:-9.103200px;}\n.ws46{word-spacing:-9.096000px;}\n.ws48{word-spacing:-9.094000px;}\n.ws31{word-spacing:-9.019200px;}\n.ws37{word-spacing:-9.018400px;}\n.ws15{word-spacing:-9.008000px;}\n.ws1f{word-spacing:-9.002800px;}\n.ws55{word-spacing:-8.993120px;}\n.ws19{word-spacing:-8.980400px;}\n.ws24{word-spacing:-8.978400px;}\n.ws79{word-spacing:-8.974000px;}\n.ws1a{word-spacing:-8.970800px;}\n.ws71{word-spacing:-8.957200px;}\n.ws7e{word-spacing:-8.955200px;}\n.ws54{word-spacing:-8.948000px;}\n.ws75{word-spacing:-8.947600px;}\n.ws52{word-spacing:-8.934800px;}\n.ws22{word-spacing:-8.932400px;}\n.ws70{word-spacing:-8.923200px;}\n.ws3d{word-spacing:-8.920800px;}\n.ws3f{word-spacing:-8.920320px;}\n.ws6a{word-spacing:-8.915600px;}\n.ws1e{word-spacing:-8.913600px;}\n.ws39{word-spacing:-8.906000px;}\n.ws51{word-spacing:-8.904400px;}\n.ws47{word-spacing:-8.902400px;}\n.ws64{word-spacing:-8.897120px;}\n.ws18{word-spacing:-8.894800px;}\n.ws6d{word-spacing:-8.892800px;}\n.ws5d{word-spacing:-8.869600px;}\n.ws5a{word-spacing:-8.864000px;}\n.ws81{word-spacing:-8.858400px;}\n.ws21{word-spacing:-8.853200px;}\n.ws6b{word-spacing:-8.851200px;}\n.ws33{word-spacing:-8.845600px;}\n.ws57{word-spacing:-8.827200px;}\n.ws53{word-spacing:-8.816800px;}\n.ws32{word-spacing:-8.790720px;}\n.ws3e{word-spacing:-8.785920px;}\n.ws26{word-spacing:-8.773440px;}\n.ws14{word-spacing:-8.764800px;}\n.ws69{word-spacing:-8.763840px;}\n.ws56{word-spacing:-8.748280px;}\n.ws65{word-spacing:-8.741520px;}\n.ws41{word-spacing:-8.740800px;}\n.ws4c{word-spacing:-8.737920px;}\n.ws30{word-spacing:-8.735040px;}\n.ws16{word-spacing:-8.733600px;}\n.ws7b{word-spacing:-8.733120px;}\n.ws20{word-spacing:-8.729760px;}\n.ws2f{word-spacing:-8.729280px;}\n.ws29{word-spacing:-8.722000px;}\n.ws45{word-spacing:-8.718400px;}\n.ws6f{word-spacing:-8.714800px;}\n.ws82{word-spacing:-8.706800px;}\n.ws7d{word-spacing:-8.693200px;}\n.ws63{word-spacing:-8.684000px;}\n.ws73{word-spacing:-8.669200px;}\n.ws36{word-spacing:-8.659600px;}\n.ws85{word-spacing:-8.656000px;}\n.ws76{word-spacing:-8.623200px;}\n.ws42{word-spacing:-8.616000px;}\n.ws3a{word-spacing:-8.614000px;}\n.ws68{word-spacing:-8.591200px;}\n.ws40{word-spacing:-8.584000px;}\n.ws25{word-spacing:-8.576000px;}\n.ws5f{word-spacing:-8.572400px;}\n.ws44{word-spacing:-8.565200px;}\n.ws23{word-spacing:-8.564800px;}\n.ws1c{word-spacing:-8.522800px;}\n.ws59{word-spacing:-8.522000px;}\n.ws66{word-spacing:-8.497120px;}\n.ws3c{word-spacing:-8.468000px;}\n.ws34{word-spacing:-8.452400px;}\n.ws3b{word-spacing:-8.440800px;}\n.ws49{word-spacing:-8.426000px;}\n.ws5b{word-spacing:-8.384000px;}\n.ws67{word-spacing:-8.292800px;}\n.ws78{word-spacing:-8.220800px;}\n.ws4{word-spacing:-8.136000px;}\n.wsb{word-spacing:-8.112000px;}\n.ws7{word-spacing:-8.100000px;}\n.ws4a{word-spacing:-8.048800px;}\n.wsc{word-spacing:-8.004000px;}\n.ws60{word-spacing:-7.996800px;}\n.ws87{word-spacing:-7.952800px;}\n.ws4f{word-spacing:-7.944800px;}\n.ws50{word-spacing:-7.940800px;}\n.ws3{word-spacing:-7.920000px;}\n.ws83{word-spacing:-7.896800px;}\n.ws6c{word-spacing:-7.892800px;}\n.ws28{word-spacing:-7.884800px;}\n.ws2b{word-spacing:-7.812800px;}\n.ws80{word-spacing:-7.796800px;}\n.wsf{word-spacing:-7.776000px;}\n.ws7a{word-spacing:-7.772800px;}\n.wse{word-spacing:-7.764000px;}\n.ws43{word-spacing:-7.760800px;}\n.ws5c{word-spacing:-7.757920px;}\n.ws4e{word-spacing:-7.756800px;}\n.ws6e{word-spacing:-7.744800px;}\n.ws72{word-spacing:-7.708800px;}\n.ws2e{word-spacing:-7.700800px;}\n.ws8{word-spacing:-7.620000px;}\n.ws61{word-spacing:-7.612800px;}\n.ws7c{word-spacing:-7.592800px;}\n.ws38{word-spacing:-7.509920px;}\n.ws6{word-spacing:-7.164000px;}\n.ws10{word-spacing:-7.152000px;}\n.ws12{word-spacing:-7.032000px;}\n.wsa{word-spacing:-6.864000px;}\n.ws11{word-spacing:-6.828000px;}\n.wsd{word-spacing:-6.696000px;}\n.ws9{word-spacing:-6.684000px;}\n.ws2{word-spacing:0.000000px;}\n._8{margin-left:-9.420800px;}\n._3{margin-left:-8.220800px;}\n._5{margin-left:-7.080800px;}\n._6{margin-left:-6.056000px;}\n._7{margin-left:-4.868800px;}\n._0{margin-left:-3.735360px;}\n._4{margin-left:-2.667840px;}\n._2{margin-left:-1.609600px;}\n._1{width:1.026560px;}\n._9{width:2.027360px;}\n._a{width:4.041120px;}\n._b{width:6.044800px;}\n._e{width:7.266240px;}\n._11{width:12.454240px;}\n._19{width:110.853280px;}\n._1a{width:125.639680px;}\n._14{width:129.219520px;}\n._15{width:132.446560px;}\n._12{width:142.247200px;}\n._16{width:156.111520px;}\n._18{width:166.589440px;}\n._10{width:176.214720px;}\n._13{width:195.377760px;}\n._f{width:211.632480px;}\n._d{width:223.041440px;}\n._17{width:236.036960px;}\n._c{width:319.907200px;}\n._1c{width:596.667200px;}\n._24{width:681.311200px;}\n._1f{width:740.035360px;}\n._1b{width:762.170400px;}\n._22{width:798.106080px;}\n._20{width:806.233440px;}\n._21{width:809.659680px;}\n._23{width:813.046080px;}\n._1d{width:822.408480px;}\n._1e{width:914.064320px;}\n.fc10{color:rgb(204,0,204);}\n.fcd{color:rgb(0,128,0);}\n.fc0{color:rgb(0,0,0);}\n.fcc{color:rgb(128,128,128);}\n.fc2{color:rgb(54,94,144);}\n.fc3{color:rgb(78,129,189);}\n.fc8{color:rgb(255,0,0);}\n.fcf{color:rgb(0,0,255);}\n.fce{color:rgb(0,130,64);}\n.fc1{color:transparent;}\n.fc9{color:rgb(152,72,5);}\n.fc5{color:rgb(0,134,60);}\n.fc4{color:rgb(31,73,125);}\n.fc7{color:rgb(0,111,191);}\n.fca{color:rgb(111,47,160);}\n.fc6{color:rgb(0,153,0);}\n.fcb{color:rgb(255,0,255);}\n.fs8{font-size:3.840000px;}\n.fsb{font-size:13.920000px;}\n.fsc{font-size:15.840000px;}\n.fsa{font-size:27.840000px;}\n.fs4{font-size:36.000000px;}\n.fs6{font-size:37.920000px;}\n.fs2{font-size:39.840000px;}\n.fs9{font-size:39.936000px;}\n.fs3{font-size:44.160000px;}\n.fs5{font-size:48.000000px;}\n.fs7{font-size:72.000000px;}\n.fs0{font-size:111.840000px;}\n.fs1{font-size:192.000000px;}\n.y0{bottom:-0.500000px;}\n.y1bd{bottom:-0.120060px;}\n.y1{bottom:0.000000px;}\n.y311{bottom:2.060000px;}\n.y3ea{bottom:2.140000px;}\n.y6c0{bottom:2.160000px;}\n.y906{bottom:2.180000px;}\n.y3c2{bottom:2.210000px;}\n.y36f{bottom:2.230000px;}\n.y85e{bottom:2.260000px;}\n.y5aa{bottom:2.300000px;}\n.y275{bottom:2.304000px;}\n.y703{bottom:2.330000px;}\n.y69a{bottom:2.350000px;}\n.y767{bottom:2.400000px;}\n.y6b3{bottom:2.450000px;}\n.y612{bottom:2.500000px;}\n.y2eb{bottom:2.544000px;}\n.y866{bottom:2.590000px;}\n.y2e4{bottom:2.660000px;}\n.y872{bottom:2.690000px;}\n.y51a{bottom:2.740000px;}\n.y868{bottom:2.830000px;}\n.y60b{bottom:2.980000px;}\n.y102{bottom:3.000000px;}\n.y777{bottom:3.070000px;}\n.y398{bottom:3.140000px;}\n.y6b8{bottom:3.170000px;}\n.y733{bottom:3.260000px;}\n.y897{bottom:3.310000px;}\n.y39d{bottom:3.384000px;}\n.y53c{bottom:3.410000px;}\n.y83b{bottom:4.060000px;}\n.y91d{bottom:4.080000px;}\n.y2bb{bottom:4.150000px;}\n.y6e{bottom:10.680000px;}\n.y40{bottom:12.480000px;}\n.yee{bottom:12.840000px;}\n.y709{bottom:13.580000px;}\n.y965{bottom:13.800000px;}\n.y6bf{bottom:13.824000px;}\n.y6b1{bottom:13.870000px;}\n.y51d{bottom:13.900000px;}\n.y727{bottom:13.970000px;}\n.y765{bottom:14.400000px;}\n.y2ed{bottom:14.420000px;}\n.y699{bottom:14.470000px;}\n.y85d{bottom:14.500000px;}\n.y876{bottom:14.690000px;}\n.y871{bottom:14.810000px;}\n.y611{bottom:14.860000px;}\n.y732{bottom:14.900000px;}\n.y865{bottom:14.950000px;}\n.y519{bottom:14.980000px;}\n.y2e3{bottom:15.020000px;}\n.y60a{bottom:15.100000px;}\n.y775{bottom:15.190000px;}\n.y397{bottom:15.260000px;}\n.y274{bottom:16.460000px;}\n.y30f{bottom:24.980000px;}\n.y3e8{bottom:25.060000px;}\n.y5a8{bottom:25.130000px;}\n.y71f{bottom:25.150000px;}\n.y891{bottom:25.420000px;}\n.y904{bottom:25.580000px;}\n.y3c0{bottom:25.610000px;}\n.y36d{bottom:25.630000px;}\n.y964{bottom:25.680000px;}\n.y5e3{bottom:25.700000px;}\n.y74d{bottom:25.750000px;}\n.y726{bottom:25.970000px;}\n.y6b6{bottom:26.090000px;}\n.y6b0{bottom:26.110000px;}\n.y764{bottom:26.160000px;}\n.y51c{bottom:26.280000px;}\n.y53a{bottom:26.330000px;}\n.y697{bottom:26.470000px;}\n.y2ea{bottom:26.660000px;}\n.y895{bottom:26.710000px;}\n.y85b{bottom:26.740000px;}\n.y731{bottom:26.780000px;}\n.y867{bottom:26.830000px;}\n.y870{bottom:26.930000px;}\n.y773{bottom:27.070000px;}\n.y610{bottom:27.100000px;}\n.y518{bottom:27.120000px;}\n.y2e2{bottom:27.140000px;}\n.y875{bottom:27.170000px;}\n.y864{bottom:27.190000px;}\n.y609{bottom:27.340000px;}\n.y396{bottom:27.500000px;}\n.y6d{bottom:28.080000px;}\n.y89{bottom:28.200000px;}\n.ybb{bottom:28.680000px;}\n.y8bc{bottom:29.280000px;}\n.y3f{bottom:30.480000px;}\n.yed{bottom:30.840000px;}\n.y708{bottom:37.460000px;}\n.y74c{bottom:37.870000px;}\n.y701{bottom:38.090000px;}\n.y51b{bottom:38.640000px;}\n.y772{bottom:38.740000px;}\n.y874{bottom:38.810000px;}\n.y86f{bottom:39.170000px;}\n.y60f{bottom:39.220000px;}\n.y517{bottom:39.240000px;}\n.y2e1{bottom:39.260000px;}\n.y608{bottom:39.460000px;}\n.y863{bottom:39.550000px;}\n.y395{bottom:39.620000px;}\n.y8bb{bottom:43.200000px;}\n.y272{bottom:43.460000px;}\n.y838{bottom:45.120000px;}\n.y2b8{bottom:45.190000px;}\n.y88{bottom:45.600000px;}\n.yba{bottom:46.080000px;}\n.y6c{bottom:46.200000px;}\n.y3e{bottom:47.880000px;}\n.y101{bottom:48.360000px;}\n.y8ff{bottom:48.720000px;}\n.y71d{bottom:48.790000px;}\n.y91c{bottom:48.980000px;}\n.y725{bottom:49.010000px;}\n.y86b{bottom:49.030000px;}\n.y23e{bottom:49.200000px;}\n.y6b5{bottom:49.730000px;}\n.y696{bottom:49.750000px;}\n.y6a0{bottom:49.800000px;}\n.y72f{bottom:49.820000px;}\n.y771{bottom:50.740000px;}\n.y2e8{bottom:50.780000px;}\n.y86e{bottom:50.810000px;}\n.y7c6{bottom:50.880000px;}\n.y516{bottom:51.000000px;}\n.y2e0{bottom:51.410000px;}\n.y60e{bottom:51.460000px;}\n.y607{bottom:51.700000px;}\n.y394{bottom:51.770000px;}\n.y2d9{bottom:52.320000px;}\n.y382{bottom:52.440000px;}\n.y5da{bottom:52.560000px;}\n.y4aa{bottom:52.680000px;}\n.y1e1{bottom:52.800000px;}\n.y220{bottom:52.920000px;}\n.y23d{bottom:53.040000px;}\n.y4b2{bottom:53.160000px;}\n.y271{bottom:57.260000px;}\n.y2b6{bottom:58.510000px;}\n.y836{bottom:58.920000px;}\n.y902{bottom:60.380000px;}\n.y3e6{bottom:60.460000px;}\n.y5e1{bottom:60.500000px;}\n.y5a6{bottom:60.530000px;}\n.y91b{bottom:60.620000px;}\n.y724{bottom:60.650000px;}\n.y71c{bottom:60.670000px;}\n.y3f5{bottom:60.860000px;}\n.y30d{bottom:60.890000px;}\n.y36b{bottom:61.030000px;}\n.y700{bottom:61.130000px;}\n.y74b{bottom:61.390000px;}\n.y3be{bottom:61.510000px;}\n.y72e{bottom:61.580000px;}\n.y538{bottom:61.730000px;}\n.y894{bottom:62.140000px;}\n.y39b{bottom:62.540000px;}\n.y862{bottom:63.220000px;}\n.y60d{bottom:63.580000px;}\n.y6b{bottom:63.600000px;}\n.y606{bottom:63.820000px;}\n.y393{bottom:64.010000px;}\n.y8e4{bottom:64.440000px;}\n.y12{bottom:64.800000px;}\n.y7c5{bottom:65.160000px;}\n.y879{bottom:65.280000px;}\n.y43e{bottom:65.400000px;}\n.y164{bottom:65.520000px;}\n.y3d{bottom:65.880000px;}\n.y8ba{bottom:66.240000px;}\n.y556{bottom:66.360000px;}\n.y5b7{bottom:66.480000px;}\n.y2a4{bottom:66.600000px;}\n.y2d8{bottom:66.720000px;}\n.y749{bottom:66.960000px;}\n.y833{bottom:68.160000px;}\n.y18f{bottom:68.400000px;}\n.y270{bottom:69.020000px;}\n.y69f{bottom:69.360000px;}\n.y620{bottom:69.480000px;}\n.y617{bottom:69.600000px;}\n.y381{bottom:69.720000px;}\n.y5d9{bottom:69.840000px;}\n.y575{bottom:69.960000px;}\n.y1e0{bottom:70.080000px;}\n.y21f{bottom:70.200000px;}\n.y23c{bottom:70.320000px;}\n.y4b1{bottom:70.440000px;}\n.y369{bottom:70.800000px;}\n.y3e4{bottom:70.920000px;}\n.y5df{bottom:71.160000px;}\n.y6e8{bottom:71.280000px;}\n.y2b5{bottom:72.190000px;}\n.y86a{bottom:72.430000px;}\n.y859{bottom:72.600000px;}\n.y723{bottom:72.670000px;}\n.y835{bottom:72.720000px;}\n.y6ff{bottom:72.770000px;}\n.y259{bottom:72.840000px;}\n.y919{bottom:72.860000px;}\n.y694{bottom:73.180000px;}\n.y8b2{bottom:73.560000px;}\n.y536{bottom:73.610000px;}\n.y66f{bottom:73.680000px;}\n.y2e7{bottom:73.700000px;}\n.y849{bottom:73.990000px;}\n.y770{bottom:74.020000px;}\n.y4a9{bottom:74.040000px;}\n.y847{bottom:74.520000px;}\n.y718{bottom:74.640000px;}\n.y388{bottom:74.760000px;}\n.y60c{bottom:75.340000px;}\n.y602{bottom:75.480000px;}\n.y7dd{bottom:75.600000px;}\n.y81d{bottom:75.840000px;}\n.y605{bottom:75.940000px;}\n.y392{bottom:76.130000px;}\n.y8ee{bottom:76.320000px;}\n.y5d3{bottom:76.560000px;}\n.y7c4{bottom:77.160000px;}\n.y763{bottom:77.280000px;}\n.y30b{bottom:77.640000px;}\n.y11{bottom:77.880000px;}\n.y633{bottom:78.000000px;}\n.y4f3{bottom:78.240000px;}\n.y2a3{bottom:78.360000px;}\n.y748{bottom:78.720000px;}\n.y47a{bottom:78.840000px;}\n.y163{bottom:78.960000px;}\n.y459{bottom:79.080000px;}\n.y8fe{bottom:79.800000px;}\n.y563{bottom:79.920000px;}\n.y18e{bottom:80.040000px;}\n.y34e{bottom:80.640000px;}\n.y3bc{bottom:80.760000px;}\n.y26f{bottom:80.900000px;}\n.y6a{bottom:81.000000px;}\n.y3c{bottom:81.120000px;}\n.y616{bottom:81.240000px;}\n.y8e9{bottom:81.360000px;}\n.y98{bottom:81.600000px;}\n.y574{bottom:81.720000px;}\n.y1df{bottom:81.840000px;}\n.y447{bottom:81.960000px;}\n.y23b{bottom:82.080000px;}\n.y39a{bottom:82.220000px;}\n.y7d5{bottom:82.320000px;}\n.y893{bottom:82.420000px;}\n.y368{bottom:82.560000px;}\n.y330{bottom:82.680000px;}\n.y6be{bottom:83.040000px;}\n.y3f3{bottom:84.360000px;}\n.y258{bottom:84.480000px;}\n.y5de{bottom:84.600000px;}\n.y6fd{bottom:84.770000px;}\n.y8b1{bottom:85.320000px;}\n.y535{bottom:85.370000px;}\n.y6ae{bottom:85.680000px;}\n.y1bc{bottom:86.040000px;}\n.y846{bottom:86.280000px;}\n.y717{bottom:86.400000px;}\n.y682{bottom:86.520000px;}\n.y7a9{bottom:87.240000px;}\n.y793{bottom:87.360000px;}\n.y2e6{bottom:87.380000px;}\n.y8e3{bottom:87.480000px;}\n.y81c{bottom:87.600000px;}\n.y604{bottom:88.060000px;}\n.y391{bottom:88.250000px;}\n.y7fb{bottom:88.320000px;}\n.y547{bottom:88.560000px;}\n.y7dc{bottom:89.040000px;}\n.y932{bottom:89.520000px;}\n.y2d7{bottom:89.640000px;}\n.y632{bottom:89.760000px;}\n.y5b6{bottom:89.904000px;}\n.y13c{bottom:90.024000px;}\n.y8b9{bottom:90.144000px;}\n.y2a2{bottom:90.264000px;}\n.y71a{bottom:90.550000px;}\n.y747{bottom:90.624000px;}\n.y832{bottom:91.824000px;}\n.y18d{bottom:92.424000px;}\n.y380{bottom:93.024000px;}\n.y5d8{bottom:93.144000px;}\n.y74f{bottom:93.264000px;}\n.y61f{bottom:93.384000px;}\n.y69d{bottom:93.504000px;}\n.y573{bottom:93.624000px;}\n.y1de{bottom:93.744000px;}\n.y21e{bottom:93.864000px;}\n.y23a{bottom:93.984000px;}\n.y25a{bottom:94.320000px;}\n.y651{bottom:94.344000px;}\n.y32f{bottom:94.464000px;}\n.y40d{bottom:94.584000px;}\n.y900{bottom:94.704000px;}\n.y399{bottom:94.800000px;}\n.y3e3{bottom:94.824000px;}\n.y6e7{bottom:94.944000px;}\n.y2ec{bottom:95.280000px;}\n.y2e5{bottom:95.400000px;}\n.y858{bottom:95.544000px;}\n.y2b4{bottom:95.590000px;}\n.y917{bottom:95.780000px;}\n.y692{bottom:96.460000px;}\n.y8b0{bottom:97.224000px;}\n.y72d{bottom:97.250000px;}\n.y533{bottom:97.270000px;}\n.y4a8{bottom:97.344000px;}\n.y76e{bottom:97.420000px;}\n.y942{bottom:97.584000px;}\n.y1bb{bottom:97.824000px;}\n.y66e{bottom:97.944000px;}\n.y845{bottom:98.184000px;}\n.y716{bottom:98.304000px;}\n.ya8{bottom:98.424000px;}\n.y87{bottom:98.544000px;}\n.y3b{bottom:98.664000px;}\n.yb9{bottom:99.024000px;}\n.y69{bottom:99.144000px;}\n.y8e2{bottom:99.264000px;}\n.y81b{bottom:99.384000px;}\n.y601{bottom:99.504000px;}\n.y5d2{bottom:99.864000px;}\n.y7fa{bottom:100.100000px;}\n.y7c3{bottom:100.220000px;}\n.y762{bottom:100.460000px;}\n.y390{bottom:100.490000px;}\n.y7db{bottom:100.700000px;}\n.y10{bottom:101.180000px;}\n.y30a{bottom:101.300000px;}\n.y7b7{bottom:101.420000px;}\n.y5b5{bottom:101.660000px;}\n.y479{bottom:101.900000px;}\n.y514{bottom:102.260000px;}\n.y162{bottom:102.380000px;}\n.y458{bottom:102.500000px;}\n.y8fd{bottom:102.860000px;}\n.y562{bottom:102.980000px;}\n.y43d{bottom:103.100000px;}\n.y13b{bottom:103.220000px;}\n.y257{bottom:103.340000px;}\n.y26d{bottom:103.940000px;}\n.y3bb{bottom:104.180000px;}\n.y34d{bottom:104.300000px;}\n.y706{bottom:104.420000px;}\n.y5a4{bottom:104.540000px;}\n.y962{bottom:104.780000px;}\n.y955{bottom:104.900000px;}\n.y367{bottom:106.220000px;}\n.y2b3{bottom:107.380000px;}\n.y3f2{bottom:107.420000px;}\n.y42e{bottom:107.780000px;}\n.y5dd{bottom:108.020000px;}\n.y691{bottom:108.100000px;}\n.y6fc{bottom:108.170000px;}\n.y6ad{bottom:108.980000px;}\n.y532{bottom:109.030000px;}\n.y941{bottom:109.340000px;}\n.y66d{bottom:109.580000px;}\n.y1ba{bottom:109.700000px;}\n.y681{bottom:109.820000px;}\n.y715{bottom:110.060000px;}\n.y861{bottom:110.140000px;}\n.y6bd{bottom:110.780000px;}\n.y7a8{bottom:110.900000px;}\n.y8e1{bottom:111.140000px;}\n.y792{bottom:111.260000px;}\n.y5d1{bottom:111.620000px;}\n.y7c2{bottom:111.980000px;}\n.y38f{bottom:112.610000px;}\n.y7da{bottom:112.700000px;}\n.y583{bottom:112.940000px;}\n.y4f2{bottom:113.060000px;}\n.y2a1{bottom:113.300000px;}\n.y631{bottom:113.540000px;}\n.y478{bottom:113.660000px;}\n.y5b4{bottom:113.780000px;}\n.y7f9{bottom:113.900000px;}\n.y161{bottom:114.140000px;}\n.y457{bottom:114.260000px;}\n.yf3{bottom:114.380000px;}\n.y650{bottom:114.620000px;}\n.y561{bottom:114.740000px;}\n.y931{bottom:114.860000px;}\n.y256{bottom:115.100000px;}\n.y18c{bottom:115.460000px;}\n.y26c{bottom:115.700000px;}\n.y3ba{bottom:115.820000px;}\n.y3a{bottom:116.060000px;}\n.y50a{bottom:116.180000px;}\n.y8e8{bottom:116.300000px;}\n.ya7{bottom:116.420000px;}\n.y68{bottom:116.540000px;}\n.y1dd{bottom:116.660000px;}\n.y69c{bottom:116.780000px;}\n.y21d{bottom:116.900000px;}\n.y1ff{bottom:117.020000px;}\n.y4b4{bottom:117.140000px;}\n.y13a{bottom:117.260000px;}\n.y4b0{bottom:117.380000px;}\n.y32e{bottom:117.620000px;}\n.y34c{bottom:117.860000px;}\n.y6e6{bottom:117.980000px;}\n.y366{bottom:118.100000px;}\n.y3e2{bottom:118.220000px;}\n.y3f1{bottom:119.180000px;}\n.y2b1{bottom:119.260000px;}\n.y42d{bottom:119.540000px;}\n.y5dc{bottom:119.780000px;}\n.y8af{bottom:120.260000px;}\n.y72b{bottom:120.530000px;}\n.y76c{bottom:120.700000px;}\n.y530{bottom:120.910000px;}\n.y4a7{bottom:120.980000px;}\n.y844{bottom:121.220000px;}\n.y1b9{bottom:121.460000px;}\n.y66c{bottom:121.580000px;}\n.y714{bottom:121.940000px;}\n.y600{bottom:122.780000px;}\n.y8e0{bottom:122.900000px;}\n.y81a{bottom:123.140000px;}\n.y5d0{bottom:123.860000px;}\n.y761{bottom:124.100000px;}\n.y273{bottom:124.220000px;}\n.yf{bottom:124.460000px;}\n.y7b6{bottom:124.700000px;}\n.y38e{bottom:124.730000px;}\n.y309{bottom:124.940000px;}\n.y2a0{bottom:125.060000px;}\n.y8b8{bottom:125.300000px;}\n.y513{bottom:125.420000px;}\n.y477{bottom:125.540000px;}\n.y160{bottom:126.020000px;}\n.y456{bottom:126.140000px;}\n.y43c{bottom:126.380000px;}\n.y546{bottom:126.500000px;}\n.y560{bottom:126.620000px;}\n.y56e{bottom:126.740000px;}\n.y255{bottom:126.860000px;}\n.y18b{bottom:127.220000px;}\n.y3b9{bottom:127.700000px;}\n.y5a3{bottom:127.820000px;}\n.y8e7{bottom:128.060000px;}\n.y37f{bottom:128.180000px;}\n.y59b{bottom:128.300000px;}\n.y77a{bottom:128.420000px;}\n.y21c{bottom:128.660000px;}\n.y6bc{bottom:128.780000px;}\n.y7d4{bottom:129.260000px;}\n.y32d{bottom:129.380000px;}\n.y5e0{bottom:129.600000px;}\n.y6e5{bottom:129.740000px;}\n.y365{bottom:129.860000px;}\n.y3e1{bottom:129.980000px;}\n.y139{bottom:130.820000px;}\n.y857{bottom:130.940000px;}\n.y2b0{bottom:131.020000px;}\n.y3f0{bottom:131.060000px;}\n.yf2{bottom:131.780000px;}\n.y42c{bottom:131.900000px;}\n.y6fa{bottom:131.930000px;}\n.y6ac{bottom:132.260000px;}\n.y76b{bottom:132.460000px;}\n.y680{bottom:133.100000px;}\n.y1b8{bottom:133.340000px;}\n.y860{bottom:133.540000px;}\n.y713{bottom:133.700000px;}\n.y86{bottom:133.940000px;}\n.y39{bottom:134.060000px;}\n.y97{bottom:134.420000px;}\n.y67{bottom:134.540000px;}\n.y791{bottom:134.660000px;}\n.y7a7{bottom:134.780000px;}\n.y7c1{bottom:135.620000px;}\n.y760{bottom:135.980000px;}\n.y582{bottom:136.340000px;}\n.y555{bottom:136.460000px;}\n.y4f1{bottom:136.700000px;}\n.y29f{bottom:136.940000px;}\n.y38d{bottom:136.970000px;}\n.y630{bottom:137.060000px;}\n.y5b3{bottom:137.180000px;}\n.y476{bottom:137.300000px;}\n.y746{bottom:137.540000px;}\n.y308{bottom:137.900000px;}\n.y8fc{bottom:138.260000px;}\n.y55f{bottom:138.380000px;}\n.y254{bottom:138.500000px;}\n.y91a{bottom:138.740000px;}\n.y18a{bottom:139.100000px;}\n.y26a{bottom:139.340000px;}\n.y3b8{bottom:139.460000px;}\n.y705{bottom:139.580000px;}\n.y878{bottom:139.700000px;}\n.y901{bottom:139.800000px;}\n.y61e{bottom:139.940000px;}\n.y37e{bottom:140.060000px;}\n.y1dc{bottom:140.180000px;}\n.y1fe{bottom:140.300000px;}\n.y44b{bottom:140.420000px;}\n.y21b{bottom:140.540000px;}\n.y4af{bottom:140.660000px;}\n.y7d3{bottom:141.020000px;}\n.y32c{bottom:141.140000px;}\n.y4d0{bottom:141.260000px;}\n.y6e4{bottom:141.620000px;}\n.y364{bottom:141.740000px;}\n.y3e0{bottom:141.860000px;}\n.y856{bottom:142.820000px;}\n.y8ae{bottom:143.540000px;}\n.y42b{bottom:143.660000px;}\n.y6f9{bottom:143.690000px;}\n.y72a{bottom:143.930000px;}\n.y4a6{bottom:144.620000px;}\n.y76a{bottom:144.700000px;}\n.y915{bottom:144.740000px;}\n.y67f{bottom:144.860000px;}\n.y138{bottom:144.980000px;}\n.y39c{bottom:145.100000px;}\n.y5ff{bottom:146.060000px;}\n.y2e9{bottom:146.180000px;}\n.y68e{bottom:146.260000px;}\n.y7a6{bottom:146.540000px;}\n.y8ed{bottom:146.780000px;}\n.y7c0{bottom:147.500000px;}\n.y5cf{bottom:147.740000px;}\n.ye{bottom:147.860000px;}\n.y88f{bottom:148.340000px;}\n.y4f0{bottom:148.580000px;}\n.y29e{bottom:148.700000px;}\n.y62f{bottom:148.940000px;}\n.y512{bottom:149.060000px;}\n.y38c{bottom:149.090000px;}\n.y475{bottom:149.180000px;}\n.y15f{bottom:149.540000px;}\n.y64f{bottom:149.660000px;}\n.y66{bottom:149.780000px;}\n.y545{bottom:149.900000px;}\n.y7d9{bottom:150.020000px;}\n.y8fb{bottom:150.140000px;}\n.y253{bottom:150.260000px;}\n.y56d{bottom:150.380000px;}\n.y5a2{bottom:151.220000px;}\n.y85{bottom:151.340000px;}\n.y3b7{bottom:151.460000px;}\n.y38{bottom:151.580000px;}\n.y6bb{bottom:151.700000px;}\n.y37d{bottom:151.820000px;}\n.y96{bottom:151.940000px;}\n.y22f{bottom:152.060000px;}\n.y1fd{bottom:152.180000px;}\n.y21a{bottom:152.300000px;}\n.y4ae{bottom:152.420000px;}\n.y3f4{bottom:152.760000px;}\n.y40c{bottom:152.900000px;}\n.y189{bottom:153.140000px;}\n.y32b{bottom:153.380000px;}\n.y363{bottom:153.500000px;}\n.y3df{bottom:153.620000px;}\n.y2ae{bottom:154.660000px;}\n.y5e4{bottom:155.300000px;}\n.y42a{bottom:155.420000px;}\n.y6ab{bottom:156.140000px;}\n.y66b{bottom:156.380000px;}\n.y67e{bottom:156.740000px;}\n.y1b7{bottom:156.980000px;}\n.y8df{bottom:157.820000px;}\n.y819{bottom:157.940000px;}\n.y790{bottom:158.060000px;}\n.y843{bottom:158.180000px;}\n.y137{bottom:158.300000px;}\n.y7a5{bottom:158.780000px;}\n.y581{bottom:159.620000px;}\n.y68d{bottom:160.060000px;}\n.y8b7{bottom:160.220000px;}\n.y8ec{bottom:160.340000px;}\n.y5b2{bottom:160.460000px;}\n.y29d{bottom:160.580000px;}\n.y745{bottom:160.700000px;}\n.y7f8{bottom:160.940000px;}\n.y307{bottom:161.180000px;}\n.y38b{bottom:161.210000px;}\n.y62e{bottom:161.300000px;}\n.y707{bottom:161.400000px;}\n.y954{bottom:161.420000px;}\n.y64e{bottom:161.540000px;}\n.y918{bottom:161.660000px;}\n.y831{bottom:161.780000px;}\n.y252{bottom:162.020000px;}\n.y509{bottom:162.860000px;}\n.y268{bottom:162.980000px;}\n.y59a{bottom:163.100000px;}\n.y61d{bottom:163.340000px;}\n.y554{bottom:163.460000px;}\n.y1db{bottom:163.580000px;}\n.y37c{bottom:163.700000px;}\n.y455{bottom:163.820000px;}\n.y22e{bottom:163.940000px;}\n.y1fc{bottom:164.060000px;}\n.y219{bottom:164.180000px;}\n.y4ad{bottom:164.300000px;}\n.y34b{bottom:164.420000px;}\n.y4cf{bottom:164.780000px;}\n.y188{bottom:164.900000px;}\n.y5a1{bottom:165.260000px;}\n.y905{bottom:165.380000px;}\n.y362{bottom:165.500000px;}\n.y729{bottom:166.080000px;}\n.y855{bottom:166.220000px;}\n.y65{bottom:167.180000px;}\n.y52e{bottom:167.230000px;}\n.y8ad{bottom:167.540000px;}\n.y4a5{bottom:167.900000px;}\n.y66a{bottom:168.260000px;}\n.yd{bottom:168.500000px;}\n.y37{bottom:168.980000px;}\n.y95{bottom:169.340000px;}\n.y84{bottom:169.460000px;}\n.y8de{bottom:169.580000px;}\n.y818{bottom:169.820000px;}\n.yfa{bottom:169.940000px;}\n.y7a4{bottom:170.540000px;}\n.y75f{bottom:170.900000px;}\n.y5ce{bottom:171.140000px;}\n.y580{bottom:171.260000px;}\n.y136{bottom:171.620000px;}\n.y842{bottom:171.740000px;}\n.y4ef{bottom:172.100000px;}\n.y29c{bottom:172.340000px;}\n.y744{bottom:172.580000px;}\n.y15e{bottom:172.700000px;}\n.y544{bottom:173.180000px;}\n.y40b{bottom:173.300000px;}\n.y7d8{bottom:173.420000px;}\n.y830{bottom:173.540000px;}\n.y38a{bottom:173.570000px;}\n.y43b{bottom:173.660000px;}\n.y251{bottom:173.780000px;}\n.y3b6{bottom:174.500000px;}\n.y508{bottom:174.620000px;}\n.y306{bottom:174.740000px;}\n.y266{bottom:174.890000px;}\n.y599{bottom:174.980000px;}\n.y553{bottom:175.100000px;}\n.y615{bottom:175.220000px;}\n.y704{bottom:175.340000px;}\n.y37b{bottom:175.460000px;}\n.y572{bottom:175.580000px;}\n.y452{bottom:175.700000px;}\n.y218{bottom:175.820000px;}\n.y621{bottom:175.940000px;}\n.y34a{bottom:176.180000px;}\n.y32a{bottom:176.420000px;}\n.y187{bottom:176.780000px;}\n.y3f7{bottom:177.740000px;}\n.y5e2{bottom:178.340000px;}\n.y429{bottom:178.460000px;}\n.y6f7{bottom:178.630000px;}\n.y4ce{bottom:178.820000px;}\n.y52d{bottom:178.990000px;}\n.y8ac{bottom:179.300000px;}\n.y6aa{bottom:179.420000px;}\n.y914{bottom:179.780000px;}\n.y669{bottom:179.900000px;}\n.y854{bottom:180.020000px;}\n.y1b6{bottom:180.260000px;}\n.y67d{bottom:180.500000px;}\n.y5fe{bottom:181.100000px;}\n.y78f{bottom:181.220000px;}\n.y8dd{bottom:181.460000px;}\n.y817{bottom:181.580000px;}\n.y7bf{bottom:182.300000px;}\n.y7a3{bottom:182.420000px;}\n.y8b6{bottom:183.260000px;}\n.y8eb{bottom:183.380000px;}\n.y2d6{bottom:183.500000px;}\n.y68b{bottom:183.700000px;}\n.y5b1{bottom:183.740000px;}\n.y29b{bottom:184.220000px;}\n.y15d{bottom:184.460000px;}\n.yf1{bottom:184.580000px;}\n.y7f7{bottom:184.700000px;}\n.y64d{bottom:184.820000px;}\n.y40a{bottom:184.940000px;}\n.y55e{bottom:185.060000px;}\n.yf9{bottom:185.180000px;}\n.y64{bottom:185.300000px;}\n.y250{bottom:185.420000px;}\n.y135{bottom:185.540000px;}\n.y82f{bottom:185.780000px;}\n.y3b5{bottom:186.260000px;}\n.y507{bottom:186.500000px;}\n.ya6{bottom:186.740000px;}\n.y83{bottom:186.860000px;}\n.y36{bottom:186.980000px;}\n.y5d7{bottom:187.100000px;}\n.y454{bottom:187.220000px;}\n.yb8{bottom:187.340000px;}\n.y94{bottom:187.460000px;}\n.y1da{bottom:187.580000px;}\n.y1fb{bottom:187.700000px;}\n.y217{bottom:187.820000px;}\n.y4ac{bottom:187.940000px;}\n.y329{bottom:188.180000px;}\n.y349{bottom:188.300000px;}\n.y903{bottom:188.420000px;}\n.y3de{bottom:188.540000px;}\n.y5a0{bottom:188.660000px;}\n.y361{bottom:188.780000px;}\n.y6e3{bottom:189.020000px;}\n.y6f6{bottom:190.390000px;}\n.y4a4{bottom:191.180000px;}\n.y52b{bottom:191.230000px;}\n.y913{bottom:191.540000px;}\n.y668{bottom:192.020000px;}\n.y4cd{bottom:192.380000px;}\n.y8dc{bottom:193.220000px;}\n.y5fd{bottom:193.340000px;}\n.y816{bottom:193.460000px;}\n.y75e{bottom:194.180000px;}\n.y5cd{bottom:194.420000px;}\n.y4ee{bottom:195.140000px;}\n.y7b5{bottom:195.260000px;}\n.y474{bottom:195.740000px;}\n.y689{bottom:195.820000px;}\n.y511{bottom:195.980000px;}\n.y62d{bottom:196.220000px;}\n.y7a2{bottom:196.460000px;}\n.y543{bottom:196.580000px;}\n.y409{bottom:196.700000px;}\n.y43a{bottom:196.820000px;}\n.y24f{bottom:197.180000px;}\n.y7d7{bottom:197.300000px;}\n.y29a{bottom:197.780000px;}\n.y265{bottom:197.930000px;}\n.y305{bottom:198.140000px;}\n.y26e{bottom:198.260000px;}\n.y134{bottom:198.740000px;}\n.y916{bottom:198.860000px;}\n.y841{bottom:198.980000px;}\n.y712{bottom:199.220000px;}\n.y7d2{bottom:199.820000px;}\n.y186{bottom:200.060000px;}\n.y3dd{bottom:200.300000px;}\n.y2ab{bottom:201.340000px;}\n.y3f6{bottom:201.380000px;}\n.y428{bottom:202.100000px;}\n.y6f4{bottom:202.270000px;}\n.y63{bottom:202.700000px;}\n.y6a9{bottom:202.820000px;}\n.y52a{bottom:202.990000px;}\n.y853{bottom:203.060000px;}\n.y1b5{bottom:203.540000px;}\n.y667{bottom:203.780000px;}\n.yd2{bottom:204.260000px;}\n.y35{bottom:204.380000px;}\n.y5db{bottom:204.500000px;}\n.ya5{bottom:204.740000px;}\n.y82{bottom:204.860000px;}\n.y8db{bottom:205.100000px;}\n.y815{bottom:205.220000px;}\n.y930{bottom:205.460000px;}\n.y4ed{bottom:206.900000px;}\n.y2d5{bottom:207.140000px;}\n.y8f6{bottom:207.500000px;}\n.y473{bottom:207.620000px;}\n.y62c{bottom:207.980000px;}\n.y408{bottom:208.460000px;}\n.y8b5{bottom:208.580000px;}\n.y439{bottom:208.700000px;}\n.y24e{bottom:208.940000px;}\n.y82e{bottom:209.060000px;}\n.y264{bottom:209.690000px;}\n.y3b4{bottom:209.780000px;}\n.y506{bottom:210.020000px;}\n.y8e6{bottom:210.260000px;}\n.y37a{bottom:210.380000px;}\n.y451{bottom:210.500000px;}\n.y542{bottom:210.620000px;}\n.y1d9{bottom:210.860000px;}\n.y1fa{bottom:210.980000px;}\n.y239{bottom:211.100000px;}\n.y4ab{bottom:211.220000px;}\n.y389{bottom:211.320000px;}\n.y348{bottom:211.700000px;}\n.y328{bottom:211.820000px;}\n.y360{bottom:212.060000px;}\n.y3dc{bottom:212.180000px;}\n.y6e2{bottom:212.420000px;}\n.y961{bottom:212.780000px;}\n.y2a9{bottom:213.220000px;}\n.y6f3{bottom:214.030000px;}\n.y8ab{bottom:214.220000px;}\n.y6a8{bottom:214.580000px;}\n.y4a3{bottom:214.820000px;}\n.y528{bottom:214.870000px;}\n.y912{bottom:215.090000px;}\n.y1b4{bottom:215.300000px;}\n.y666{bottom:215.540000px;}\n.y4cc{bottom:215.660000px;}\n.y730{bottom:215.900000px;}\n.y2df{bottom:216.240000px;}\n.y15c{bottom:216.500000px;}\n.y5fc{bottom:216.620000px;}\n.y8da{bottom:216.860000px;}\n.y814{bottom:217.100000px;}\n.y92f{bottom:217.220000px;}\n.y5cc{bottom:217.820000px;}\n.y75d{bottom:218.060000px;}\n.y88e{bottom:218.180000px;}\n.y953{bottom:218.300000px;}\n.y4ec{bottom:218.780000px;}\n.y7b4{bottom:218.900000px;}\n.y743{bottom:219.260000px;}\n.y510{bottom:219.380000px;}\n.y472{bottom:219.500000px;}\n.y7a1{bottom:219.740000px;}\n.y30c{bottom:219.840000px;}\n.y62b{bottom:219.860000px;}\n.y62{bottom:220.100000px;}\n.y407{bottom:220.220000px;}\n.y8ea{bottom:220.340000px;}\n.y57f{bottom:220.460000px;}\n.y24d{bottom:220.580000px;}\n.yf8{bottom:220.700000px;}\n.y438{bottom:220.820000px;}\n.y5b0{bottom:221.300000px;}\n.y263{bottom:221.570000px;}\n.y3b3{bottom:221.780000px;}\n.y26b{bottom:221.900000px;}\n.y8e5{bottom:222.020000px;}\n.y379{bottom:222.140000px;}\n.y93{bottom:222.260000px;}\n.y34{bottom:222.380000px;}\n.y216{bottom:222.620000px;}\n.y711{bottom:222.740000px;}\n.yb7{bottom:222.860000px;}\n.y7d1{bottom:223.340000px;}\n.y185{bottom:223.460000px;}\n.y327{bottom:223.700000px;}\n.y35f{bottom:223.820000px;}\n.y2a8{bottom:224.980000px;}\n.y427{bottom:225.380000px;}\n.y59f{bottom:225.500000px;}\n.y6f1{bottom:225.910000px;}\n.y8aa{bottom:225.980000px;}\n.y852{bottom:226.580000px;}\n.y6a7{bottom:226.700000px;}\n.y911{bottom:226.970000px;}\n.y1b3{bottom:227.180000px;}\n.y4cb{bottom:227.420000px;}\n.y3ef{bottom:227.780000px;}\n.y78e{bottom:228.260000px;}\n.y8d9{bottom:228.740000px;}\n.y813{bottom:228.860000px;}\n.y952{bottom:230.060000px;}\n.y4eb{bottom:230.540000px;}\n.y2d4{bottom:230.780000px;}\n.y687{bottom:231.460000px;}\n.y742{bottom:231.500000px;}\n.y62a{bottom:231.620000px;}\n.y406{bottom:231.980000px;}\n.y24c{bottom:232.340000px;}\n.y82d{bottom:232.460000px;}\n.y505{bottom:233.060000px;}\n.y262{bottom:233.330000px;}\n.y541{bottom:233.900000px;}\n.y1d8{bottom:234.020000px;}\n.y22d{bottom:234.140000px;}\n.y1f9{bottom:234.260000px;}\n.y238{bottom:234.380000px;}\n.y215{bottom:234.500000px;}\n.y184{bottom:235.220000px;}\n.y347{bottom:235.340000px;}\n.y3db{bottom:235.700000px;}\n.y35e{bottom:235.820000px;}\n.y6e1{bottom:235.940000px;}\n.y2a7{bottom:236.860000px;}\n.y59e{bottom:237.260000px;}\n.yf0{bottom:237.500000px;}\n.y81{bottom:237.620000px;}\n.y61{bottom:238.100000px;}\n.y15b{bottom:238.220000px;}\n.y851{bottom:238.460000px;}\n.y4a2{bottom:238.580000px;}\n.y910{bottom:238.730000px;}\n.y67c{bottom:238.820000px;}\n.y1b2{bottom:238.940000px;}\n.y7be{bottom:239.540000px;}\n.ya4{bottom:239.660000px;}\n.yd1{bottom:239.780000px;}\n.y33{bottom:239.900000px;}\n.y5fb{bottom:240.020000px;}\n.yb6{bottom:240.260000px;}\n.y92{bottom:240.380000px;}\n.y812{bottom:240.740000px;}\n.y75c{bottom:241.100000px;}\n.y5cb{bottom:241.700000px;}\n.y88d{bottom:241.820000px;}\n.y951{bottom:241.940000px;}\n.y7b3{bottom:242.180000px;}\n.y4ea{bottom:242.420000px;}\n.y2d3{bottom:242.540000px;}\n.y50f{bottom:242.660000px;}\n.y471{bottom:242.780000px;}\n.y7a0{bottom:243.140000px;}\n.y629{bottom:243.500000px;}\n.y57e{bottom:243.740000px;}\n.y7d6{bottom:243.980000px;}\n.y24b{bottom:244.100000px;}\n.y299{bottom:244.220000px;}\n.y5af{bottom:244.580000px;}\n.y310{bottom:244.820000px;}\n.y840{bottom:245.180000px;}\n.y260{bottom:245.210000px;}\n.y598{bottom:245.300000px;}\n.y269{bottom:245.540000px;}\n.y504{bottom:245.660000px;}\n.y378{bottom:245.780000px;}\n.y1d7{bottom:245.900000px;}\n.y1f8{bottom:246.020000px;}\n.y446{bottom:246.140000px;}\n.y214{bottom:246.260000px;}\n.y133{bottom:246.500000px;}\n.y326{bottom:246.620000px;}\n.y7d0{bottom:246.860000px;}\n.y5a5{bottom:247.080000px;}\n.y183{bottom:247.100000px;}\n.y346{bottom:247.580000px;}\n.y2a6{bottom:248.500000px;}\n.y426{bottom:248.660000px;}\n.y4a1{bottom:250.340000px;}\n.y90f{bottom:250.610000px;}\n.y1b1{bottom:250.820000px;}\n.y67b{bottom:250.940000px;}\n.y7bd{bottom:251.300000px;}\n.y15a{bottom:251.780000px;}\n.y78d{bottom:252.140000px;}\n.y8d8{bottom:252.380000px;}\n.y75b{bottom:252.860000px;}\n.y7b2{bottom:253.940000px;}\n.y4e9{bottom:254.180000px;}\n.y2d2{bottom:254.420000px;}\n.y470{bottom:254.540000px;}\n.y8f5{bottom:254.780000px;}\n.y741{bottom:254.900000px;}\n.y64c{bottom:255.140000px;}\n.y60{bottom:255.500000px;}\n.y80{bottom:255.620000px;}\n.y24a{bottom:255.740000px;}\n.y685{bottom:255.840000px;}\n.y8fa{bottom:255.860000px;}\n.y55d{bottom:255.980000px;}\n.y56c{bottom:256.100000px;}\n.y5ae{bottom:256.340000px;}\n.y3b2{bottom:256.580000px;}\n.y597{bottom:257.060000px;}\n.yd0{bottom:257.180000px;}\n.y32{bottom:257.300000px;}\n.y6ba{bottom:257.420000px;}\n.y552{bottom:257.540000px;}\n.ya3{bottom:257.660000px;}\n.y91{bottom:257.780000px;}\n.y1d6{bottom:257.900000px;}\n.y445{bottom:258.020000px;}\n.y213{bottom:258.140000px;}\n.y3da{bottom:258.650000px;}\n.y182{bottom:258.890000px;}\n.y7f6{bottom:259.010000px;}\n.y6e0{bottom:259.370000px;}\n.y325{bottom:260.450000px;}\n.y6f0{bottom:260.710000px;}\n.y526{bottom:261.190000px;}\n.y8a9{bottom:261.530000px;}\n.y850{bottom:262.130000px;}\n.y4a0{bottom:262.250000px;}\n.y4ca{bottom:262.730000px;}\n.y665{bottom:262.970000px;}\n.y5fa{bottom:263.330000px;}\n.y6a6{bottom:263.570000px;}\n.y811{bottom:263.810000px;}\n.y75a{bottom:265.010000px;}\n.y5ca{bottom:265.130000px;}\n.y950{bottom:265.250000px;}\n.y159{bottom:265.370000px;}\n.y88c{bottom:265.610000px;}\n.y4e8{bottom:266.090000px;}\n.y7b1{bottom:266.210000px;}\n.y503{bottom:266.450000px;}\n.y79f{bottom:266.570000px;}\n.y46f{bottom:266.810000px;}\n.y64b{bottom:266.930000px;}\n.y25e{bottom:267.170000px;}\n.y57d{bottom:267.410000px;}\n.y684{bottom:267.480000px;}\n.y249{bottom:267.530000px;}\n.y345{bottom:267.650000px;}\n.y628{bottom:267.770000px;}\n.y298{bottom:267.890000px;}\n.y56b{bottom:268.010000px;}\n.y5ad{bottom:268.250000px;}\n.y30e{bottom:268.490000px;}\n.y83f{bottom:268.850000px;}\n.y596{bottom:268.970000px;}\n.y267{bottom:269.210000px;}\n.y551{bottom:269.330000px;}\n.y74e{bottom:269.450000px;}\n.y450{bottom:269.570000px;}\n.y1f7{bottom:269.690000px;}\n.y212{bottom:269.810000px;}\n.y132{bottom:270.050000px;}\n.y35d{bottom:270.530000px;}\n.y181{bottom:270.770000px;}\n.y6df{bottom:271.010000px;}\n.y5a9{bottom:272.210000px;}\n.y425{bottom:272.330000px;}\n.y7bc{bottom:272.810000px;}\n.y6ef{bottom:272.830000px;}\n.y5f{bottom:273.050000px;}\n.yf7{bottom:273.530000px;}\n.y1b0{bottom:273.890000px;}\n.y84f{bottom:274.010000px;}\n.y4c9{bottom:274.490000px;}\n.y5f9{bottom:275.090000px;}\n.ya2{bottom:275.210000px;}\n.y31{bottom:275.330000px;}\n.y8d7{bottom:275.450000px;}\n.y78c{bottom:275.570000px;}\n.yb5{bottom:275.690000px;}\n.y90{bottom:275.810000px;}\n.y6a5{bottom:276.890000px;}\n.y2d1{bottom:277.370000px;}\n.y50e{bottom:277.850000px;}\n.y740{bottom:278.090000px;}\n.y158{bottom:278.690000px;}\n.y64a{bottom:278.810000px;}\n.y502{bottom:279.050000px;}\n.y94f{bottom:279.170000px;}\n.y248{bottom:279.290000px;}\n.y344{bottom:279.410000px;}\n.y82c{bottom:279.650000px;}\n.y297{bottom:279.770000px;}\n.y3b1{bottom:280.250000px;}\n.y2de{bottom:280.370000px;}\n.y377{bottom:280.970000px;}\n.y5d6{bottom:281.090000px;}\n.y1d5{bottom:281.210000px;}\n.y47e{bottom:281.330000px;}\n.y44f{bottom:281.450000px;}\n.y1f6{bottom:281.570000px;}\n.y237{bottom:281.690000px;}\n.y131{bottom:281.810000px;}\n.y7cf{bottom:282.290000px;}\n.y3d9{bottom:282.410000px;}\n.y6e9{bottom:282.720000px;}\n.y35c{bottom:282.770000px;}\n.y7f5{bottom:283.010000px;}\n.y324{bottom:283.850000px;}\n.y7bb{bottom:284.450000px;}\n.y8a8{bottom:284.570000px;}\n.y49f{bottom:285.050000px;}\n.y525{bottom:285.220000px;}\n.y810{bottom:285.410000px;}\n.y1af{bottom:285.650000px;}\n.y6ed{bottom:286.150000px;}\n.y4c8{bottom:286.370000px;}\n.y72c{bottom:286.610000px;}\n.y8d6{bottom:287.210000px;}\n.y5f8{bottom:287.330000px;}\n.y6de{bottom:287.930000px;}\n.y5c9{bottom:288.410000px;}\n.y88b{bottom:288.890000px;}\n.y4e7{bottom:289.010000px;}\n.y92e{bottom:289.130000px;}\n.y7b0{bottom:289.610000px;}\n.y79e{bottom:289.730000px;}\n.y46e{bottom:289.850000px;}\n.y50d{bottom:289.970000px;}\n.y25c{bottom:290.210000px;}\n.y6a4{bottom:290.330000px;}\n.y7f{bottom:290.450000px;}\n.y437{bottom:290.810000px;}\n.yef{bottom:290.930000px;}\n.y5e{bottom:291.050000px;}\n.y343{bottom:291.170000px;}\n.y2dd{bottom:291.290000px;}\n.y5ac{bottom:291.410000px;}\n.y296{bottom:291.650000px;}\n.y3b0{bottom:292.130000px;}\n.y595{bottom:292.250000px;}\n.y83e{bottom:292.490000px;}\n.ya1{bottom:292.610000px;}\n.y30{bottom:292.850000px;}\n.y710{bottom:293.090000px;}\n.yb4{bottom:293.210000px;}\n.y180{bottom:294.170000px;}\n.y7ce{bottom:294.290000px;}\n.y304{bottom:295.010000px;}\n.y5a7{bottom:295.850000px;}\n.y424{bottom:295.970000px;}\n.y8a7{bottom:296.450000px;}\n.y702{bottom:297.170000px;}\n.y84e{bottom:297.290000px;}\n.y1ae{bottom:297.530000px;}\n.y67a{bottom:297.770000px;}\n.y6ec{bottom:297.790000px;}\n.y4c7{bottom:298.130000px;}\n.y664{bottom:298.730000px;}\n.y90e{bottom:298.970000px;}\n.y8d5{bottom:299.090000px;}\n.y6dd{bottom:299.690000px;}\n.y130{bottom:299.810000px;}\n.y5c8{bottom:300.050000px;}\n.y2d0{bottom:301.010000px;}\n.y303{bottom:301.370000px;}\n.y46d{bottom:301.610000px;}\n.y25b{bottom:301.970000px;}\n.y649{bottom:302.090000px;}\n.y57c{bottom:302.210000px;}\n.y436{bottom:302.570000px;}\n.y157{bottom:302.690000px;}\n.y56a{bottom:302.810000px;}\n.y342{bottom:302.930000px;}\n.y594{bottom:304.010000px;}\n.y550{bottom:304.250000px;}\n.y376{bottom:304.370000px;}\n.y1f5{bottom:304.490000px;}\n.y1d4{bottom:304.610000px;}\n.y44a{bottom:304.730000px;}\n.y211{bottom:304.850000px;}\n.y236{bottom:304.970000px;}\n.y295{bottom:305.090000px;}\n.y3af{bottom:305.570000px;}\n.y3d8{bottom:306.050000px;}\n.y35b{bottom:306.170000px;}\n.y960{bottom:306.290000px;}\n.y7ba{bottom:306.530000px;}\n.y323{bottom:307.250000px;}\n.y8a6{bottom:308.330000px;}\n.y5d{bottom:308.450000px;}\n.y523{bottom:308.500000px;}\n.y49e{bottom:308.810000px;}\n.y80f{bottom:309.410000px;}\n.y6eb{bottom:309.790000px;}\n.ycf{bottom:310.010000px;}\n.y2f{bottom:310.250000px;}\n.ya0{bottom:310.610000px;}\n.y8d4{bottom:310.850000px;}\n.y6dc{bottom:311.330000px;}\n.y940{bottom:311.450000px;}\n.y759{bottom:311.690000px;}\n.y5c7{bottom:312.410000px;}\n.y4e6{bottom:312.770000px;}\n.y302{bottom:313.130000px;}\n.y129{bottom:313.250000px;}\n.y50c{bottom:313.370000px;}\n.y46c{bottom:313.490000px;}\n.y648{bottom:313.850000px;}\n.y405{bottom:314.210000px;}\n.y501{bottom:314.330000px;}\n.y247{bottom:314.450000px;}\n.y55c{bottom:314.570000px;}\n.y341{bottom:314.690000px;}\n.y5ab{bottom:315.290000px;}\n.y54f{bottom:316.010000px;}\n.y375{bottom:316.130000px;}\n.y44e{bottom:316.250000px;}\n.y47d{bottom:316.490000px;}\n.y210{bottom:316.610000px;}\n.y17f{bottom:317.210000px;}\n.y7cd{bottom:317.330000px;}\n.y3d7{bottom:317.810000px;}\n.y7b9{bottom:318.290000px;}\n.y423{bottom:319.250000px;}\n.y7f4{bottom:320.210000px;}\n.y84d{bottom:320.690000px;}\n.y1ad{bottom:320.810000px;}\n.y322{bottom:321.050000px;}\n.y679{bottom:321.170000px;}\n.y8a5{bottom:321.770000px;}\n.y59d{bottom:322.130000px;}\n.y78b{bottom:322.370000px;}\n.y8d3{bottom:322.730000px;}\n.y6db{bottom:323.090000px;}\n.y93f{bottom:324.170000px;}\n.y2cf{bottom:324.650000px;}\n.y94e{bottom:324.890000px;}\n.y73f{bottom:325.490000px;}\n.y7e{bottom:325.850000px;}\n.y156{bottom:325.970000px;}\n.y647{bottom:326.090000px;}\n.y246{bottom:326.210000px;}\n.y55b{bottom:326.330000px;}\n.y5c{bottom:326.450000px;}\n.y8f{bottom:326.570000px;}\n.y12e{bottom:327.050000px;}\n.y57b{bottom:327.650000px;}\n.y54e{bottom:327.890000px;}\n.y9f{bottom:328.010000px;}\n.yce{bottom:328.130000px;}\n.y2e{bottom:328.250000px;}\n.y2dc{bottom:328.370000px;}\n.y20f{bottom:328.490000px;}\n.yb3{bottom:328.610000px;}\n.yec{bottom:328.730000px;}\n.y3ae{bottom:328.850000px;}\n.y35a{bottom:329.570000px;}\n.y3d6{bottom:329.690000px;}\n.y728{bottom:331.440000px;}\n.y663{bottom:331.970000px;}\n.y49d{bottom:332.330000px;}\n.y80e{bottom:332.450000px;}\n.y1ac{bottom:332.570000px;}\n.y321{bottom:332.690000px;}\n.y50b{bottom:332.930000px;}\n.y92d{bottom:333.050000px;}\n.y51e{bottom:333.360000px;}\n.y4c6{bottom:333.650000px;}\n.y5f7{bottom:334.010000px;}\n.y128{bottom:334.370000px;}\n.y6b4{bottom:334.560000px;}\n.y6da{bottom:334.850000px;}\n.y758{bottom:335.090000px;}\n.y4e5{bottom:336.050000px;}\n.y88a{bottom:336.170000px;}\n.y93e{bottom:336.290000px;}\n.y301{bottom:336.410000px;}\n.y46b{bottom:336.770000px;}\n.y404{bottom:337.610000px;}\n.y245{bottom:337.850000px;}\n.y435{bottom:338.090000px;}\n.y55a{bottom:338.210000px;}\n.y340{bottom:338.330000px;}\n.y12d{bottom:338.810000px;}\n.y593{bottom:339.290000px;}\n.y261{bottom:339.530000px;}\n.y54d{bottom:339.650000px;}\n.y374{bottom:339.770000px;}\n.y1f4{bottom:339.890000px;}\n.y12b{bottom:340.010000px;}\n.y235{bottom:340.130000px;}\n.y20e{bottom:340.250000px;}\n.y17e{bottom:340.850000px;}\n.y422{bottom:342.530000px;}\n.y7d{bottom:343.370000px;}\n.y521{bottom:343.540000px;}\n.y7f3{bottom:343.610000px;}\n.y662{bottom:343.730000px;}\n.yf6{bottom:343.850000px;}\n.y5b{bottom:343.970000px;}\n.y84c{bottom:344.090000px;}\n.y320{bottom:344.570000px;}\n.y678{bottom:344.690000px;}\n.y1ab{bottom:344.810000px;}\n.y8a4{bottom:345.050000px;}\n.y6ea{bottom:345.340000px;}\n.ycd{bottom:345.530000px;}\n.y2d{bottom:345.650000px;}\n.y5f6{bottom:345.770000px;}\n.yc2{bottom:346.010000px;}\n.y9e{bottom:346.130000px;}\n.y8d2{bottom:346.250000px;}\n.y6d9{bottom:346.610000px;}\n.y757{bottom:346.850000px;}\n.y4e4{bottom:347.810000px;}\n.y2ce{bottom:348.050000px;}\n.y300{bottom:348.170000px;}\n.y79d{bottom:348.410000px;}\n.y46a{bottom:348.530000px;}\n.y8f4{bottom:348.650000px;}\n.y73e{bottom:348.890000px;}\n.y155{bottom:349.370000px;}\n.y646{bottom:349.490000px;}\n.y244{bottom:349.610000px;}\n.y627{bottom:349.850000px;}\n.y434{bottom:349.970000px;}\n.y82b{bottom:350.090000px;}\n.y57a{bottom:351.050000px;}\n.y61c{bottom:351.290000px;}\n.y571{bottom:351.410000px;}\n.y614{bottom:351.530000px;}\n.y294{bottom:351.650000px;}\n.y12a{bottom:351.770000px;}\n.y1f3{bottom:351.890000px;}\n.y234{bottom:352.010000px;}\n.y20d{bottom:352.130000px;}\n.y3ad{bottom:352.250000px;}\n.y12f{bottom:352.370000px;}\n.y3d5{bottom:352.730000px;}\n.y359{bottom:353.090000px;}\n.y95f{bottom:353.210000px;}\n.y873{bottom:354.120000px;}\n.y86d{bottom:354.240000px;}\n.y421{bottom:354.290000px;}\n.y722{bottom:354.960000px;}\n.y92c{bottom:355.010000px;}\n.y49c{bottom:355.490000px;}\n.y520{bottom:355.660000px;}\n.y661{bottom:355.850000px;}\n.y7f2{bottom:355.970000px;}\n.y12c{bottom:356.570000px;}\n.y8a3{bottom:356.810000px;}\n.y4c5{bottom:356.930000px;}\n.y5f5{bottom:357.650000px;}\n.y6d8{bottom:358.250000px;}\n.y80d{bottom:358.610000px;}\n.y756{bottom:358.850000px;}\n.y889{bottom:359.450000px;}\n.y53b{bottom:359.690000px;}\n.y8d1{bottom:359.810000px;}\n.y4e3{bottom:360.050000px;}\n.y6b7{bottom:360.650000px;}\n.y469{bottom:360.770000px;}\n.y500{bottom:361.130000px;}\n.y5a{bottom:361.370000px;}\n.y25f{bottom:361.490000px;}\n.y33f{bottom:361.610000px;}\n.y569{bottom:361.730000px;}\n.yf5{bottom:361.850000px;}\n.y559{bottom:361.970000px;}\n.y592{bottom:362.930000px;}\n.y2c{bottom:363.050000px;}\n.y5c6{bottom:363.290000px;}\n.y70f{bottom:363.410000px;}\n.yb2{bottom:363.530000px;}\n.y7cc{bottom:364.250000px;}\n.y3d4{bottom:364.490000px;}\n.y17d{bottom:364.610000px;}\n.y579{bottom:364.970000px;}\n.y420{bottom:366.530000px;}\n.y49b{bottom:367.250000px;}\n.y6fe{bottom:367.490000px;}\n.y31f{bottom:367.850000px;}\n.y127{bottom:368.330000px;}\n.y1aa{bottom:368.450000px;}\n.y78a{bottom:369.050000px;}\n.y6d7{bottom:370.010000px;}\n.y80c{bottom:370.370000px;}\n.y2ff{bottom:371.330000px;}\n.y2cd{bottom:371.450000px;}\n.y94d{bottom:371.690000px;}\n.y8f3{bottom:371.930000px;}\n.y73d{bottom:372.170000px;}\n.y755{bottom:372.290000px;}\n.y154{bottom:372.650000px;}\n.y243{bottom:373.010000px;}\n.y82a{bottom:373.490000px;}\n.y3bd{bottom:373.920000px;}\n.y59c{bottom:374.570000px;}\n.y22c{bottom:374.690000px;}\n.y1d3{bottom:374.810000px;}\n.y20c{bottom:374.930000px;}\n.y1f2{bottom:375.050000px;}\n.y293{bottom:375.170000px;}\n.y47c{bottom:375.290000px;}\n.y7cb{bottom:375.890000px;}\n.y358{bottom:376.490000px;}\n.y3d3{bottom:376.610000px;}\n.y5c5{bottom:376.850000px;}\n.y92b{bottom:376.970000px;}\n.y7c{bottom:378.770000px;}\n.y51f{bottom:379.060000px;}\n.y49a{bottom:379.130000px;}\n.y660{bottom:379.250000px;}\n.y59{bottom:379.370000px;}\n.y90d{bottom:379.490000px;}\n.y4c4{bottom:380.210000px;}\n.y5f4{bottom:380.690000px;}\n.y789{bottom:380.810000px;}\n.yc1{bottom:380.930000px;}\n.ycc{bottom:381.050000px;}\n.y2b{bottom:381.170000px;}\n.y93d{bottom:381.290000px;}\n.yb1{bottom:381.530000px;}\n.y6d6{bottom:381.770000px;}\n.y888{bottom:382.730000px;}\n.y2cc{bottom:383.090000px;}\n.y7af{bottom:383.210000px;}\n.y539{bottom:383.330000px;}\n.y468{bottom:383.810000px;}\n.y73c{bottom:383.930000px;}\n.y79c{bottom:384.170000px;}\n.y25d{bottom:384.530000px;}\n.y242{bottom:384.770000px;}\n.y33e{bottom:384.890000px;}\n.y626{bottom:385.010000px;}\n.y90c{bottom:385.130000px;}\n.y558{bottom:385.250000px;}\n.y153{bottom:386.210000px;}\n.y54c{bottom:386.330000px;}\n.y3ee{bottom:386.450000px;}\n.y1d2{bottom:386.570000px;}\n.y4b3{bottom:386.690000px;}\n.y444{bottom:386.810000px;}\n.y70e{bottom:386.930000px;}\n.y17c{bottom:388.130000px;}\n.y578{bottom:388.490000px;}\n.y120{bottom:389.450000px;}\n.y357{bottom:389.930000px;}\n.y499{bottom:390.890000px;}\n.y31e{bottom:391.130000px;}\n.y1a9{bottom:391.490000px;}\n.y4c3{bottom:391.970000px;}\n.y677{bottom:392.090000px;}\n.y5f3{bottom:392.570000px;}\n.y788{bottom:392.930000px;}\n.y6d5{bottom:393.410000px;}\n.y887{bottom:394.490000px;}\n.y2cb{bottom:394.970000px;}\n.y8f2{bottom:395.210000px;}\n.y467{bottom:395.570000px;}\n.y73b{bottom:396.170000px;}\n.y645{bottom:396.290000px;}\n.y241{bottom:396.530000px;}\n.y33d{bottom:396.650000px;}\n.y7b{bottom:396.770000px;}\n.y58{bottom:396.890000px;}\n.y829{bottom:397.010000px;}\n.y387{bottom:397.490000px;}\n.y152{bottom:397.970000px;}\n.y54b{bottom:398.210000px;}\n.y22b{bottom:398.330000px;}\n.ycb{bottom:398.450000px;}\n.y2a{bottom:398.570000px;}\n.y292{bottom:398.690000px;}\n.y449{bottom:398.810000px;}\n.yb0{bottom:398.930000px;}\n.y443{bottom:399.050000px;}\n.y3c1{bottom:399.530000px;}\n.y3d2{bottom:400.010000px;}\n.y5c4{bottom:400.130000px;}\n.y83d{bottom:400.250000px;}\n.y126{bottom:400.850000px;}\n.y7ca{bottom:401.330000px;}\n.y17b{bottom:401.690000px;}\n.y65f{bottom:402.530000px;}\n.y498{bottom:402.770000px;}\n.y1a8{bottom:403.850000px;}\n.y11f{bottom:403.970000px;}\n.y5f2{bottom:404.690000px;}\n.y6d4{bottom:405.170000px;}\n.y7f1{bottom:405.650000px;}\n.y4e2{bottom:406.370000px;}\n.y7ae{bottom:406.490000px;}\n.y2ca{bottom:406.730000px;}\n.y537{bottom:406.970000px;}\n.y754{bottom:407.330000px;}\n.y466{bottom:407.450000px;}\n.y8b4{bottom:408.050000px;}\n.y403{bottom:408.170000px;}\n.y240{bottom:408.290000px;}\n.y386{bottom:408.410000px;}\n.y33c{bottom:408.530000px;}\n.y90b{bottom:408.650000px;}\n.y8f1{bottom:408.770000px;}\n.y584{bottom:409.440000px;}\n.y54a{bottom:409.970000px;}\n.y373{bottom:410.090000px;}\n.y151{bottom:410.210000px;}\n.y47b{bottom:410.330000px;}\n.y3d1{bottom:411.770000px;}\n.y5c3{bottom:411.890000px;}\n.y125{bottom:412.610000px;}\n.y356{bottom:413.210000px;}\n.y41f{bottom:413.570000px;}\n.y591{bottom:413.810000px;}\n.y57{bottom:414.290000px;}\n.y497{bottom:414.530000px;}\n.y6fb{bottom:414.650000px;}\n.y6b2{bottom:414.720000px;}\n.yf4{bottom:414.770000px;}\n.y7c9{bottom:414.890000px;}\n.y676{bottom:415.130000px;}\n.y11b{bottom:415.490000px;}\n.y1a7{bottom:415.730000px;}\n.y29{bottom:415.970000px;}\n.yca{bottom:416.330000px;}\n.yc0{bottom:416.450000px;}\n.y11e{bottom:416.810000px;}\n.yaf{bottom:416.930000px;}\n.y8a2{bottom:417.050000px;}\n.y4c2{bottom:417.410000px;}\n.y4e1{bottom:418.130000px;}\n.y8d0{bottom:418.250000px;}\n.y2fe{bottom:418.610000px;}\n.y2c9{bottom:418.730000px;}\n.y100{bottom:419.450000px;}\n.y753{bottom:419.570000px;}\n.y433{bottom:419.810000px;}\n.y644{bottom:419.930000px;}\n.y625{bottom:420.170000px;}\n.y828{bottom:420.290000px;}\n.y90a{bottom:420.410000px;}\n.y4ff{bottom:421.730000px;}\n.y291{bottom:421.850000px;}\n.y22a{bottom:421.970000px;}\n.y1d1{bottom:422.090000px;}\n.y20b{bottom:422.210000px;}\n.y23f{bottom:422.330000px;}\n.y794{bottom:422.450000px;}\n.y3bf{bottom:423.170000px;}\n.y3d0{bottom:423.650000px;}\n.y5c2{bottom:423.770000px;}\n.y17a{bottom:424.970000px;}\n.y41e{bottom:425.330000px;}\n.y65e{bottom:425.930000px;}\n.y496{bottom:426.410000px;}\n.y93c{bottom:426.670000px;}\n.y675{bottom:426.910000px;}\n.y869{bottom:427.200000px;}\n.y1a6{bottom:427.510000px;}\n.y5f1{bottom:427.990000px;}\n.y787{bottom:428.110000px;}\n.y7c8{bottom:428.470000px;}\n.y6d3{bottom:428.590000px;}\n.y7f0{bottom:428.950000px;}\n.y4c1{bottom:429.190000px;}\n.y124{bottom:429.550000px;}\n.y11a{bottom:429.670000px;}\n.y886{bottom:430.030000px;}\n.y8cf{bottom:430.150000px;}\n.y7ad{bottom:430.270000px;}\n.y4e0{bottom:430.390000px;}\n.y534{bottom:430.630000px;}\n.y465{bottom:430.750000px;}\n.y79b{bottom:430.870000px;}\n.y402{bottom:431.590000px;}\n.y7a{bottom:431.710000px;}\n.y432{bottom:432.070000px;}\n.yfb{bottom:432.190000px;}\n.y56{bottom:432.310000px;}\n.y121{bottom:433.510000px;}\n.y549{bottom:433.630000px;}\n.y229{bottom:433.750000px;}\n.ybf{bottom:433.870000px;}\n.y28{bottom:433.990000px;}\n.ydb{bottom:434.470000px;}\n.y80b{bottom:434.830000px;}\n.y586{bottom:435.070000px;}\n.y3cf{bottom:435.430000px;}\n.y41d{bottom:437.110000px;}\n.y355{bottom:437.230000px;}\n.y65d{bottom:437.710000px;}\n.y6f8{bottom:438.310000px;}\n.y31d{bottom:438.430000px;}\n.y674{bottom:438.790000px;}\n.y1a5{bottom:439.390000px;}\n.y5f0{bottom:439.750000px;}\n.y786{bottom:439.990000px;}\n.y6d2{bottom:440.350000px;}\n.y4c0{bottom:441.070000px;}\n.y8a1{bottom:441.310000px;}\n.y2fd{bottom:441.910000px;}\n.y2c8{bottom:442.030000px;}\n.y4df{bottom:442.150000px;}\n.y464{bottom:442.510000px;}\n.y73a{bottom:442.870000px;}\n.y123{bottom:443.110000px;}\n.y643{bottom:443.230000px;}\n.y401{bottom:443.350000px;}\n.y431{bottom:443.830000px;}\n.y827{bottom:444.070000px;}\n.y119{bottom:444.790000px;}\n.y4fe{bottom:445.150000px;}\n.y848{bottom:445.200000px;}\n.y61b{bottom:445.270000px;}\n.y540{bottom:445.390000px;}\n.y290{bottom:445.510000px;}\n.y228{bottom:445.630000px;}\n.y1d0{bottom:445.750000px;}\n.y20a{bottom:445.870000px;}\n.y80a{bottom:446.590000px;}\n.y11d{bottom:446.950000px;}\n.y3ce{bottom:447.310000px;}\n.y179{bottom:448.390000px;}\n.y3ac{bottom:448.990000px;}\n.y721{bottom:449.040000px;}\n.y55{bottom:449.710000px;}\n.y65c{bottom:449.830000px;}\n.y495{bottom:450.070000px;}\n.y31c{bottom:450.190000px;}\n.yc9{bottom:451.270000px;}\n.y27{bottom:451.390000px;}\n.y5ef{bottom:451.630000px;}\n.y1a4{bottom:451.750000px;}\n.ybe{bottom:451.870000px;}\n.y6d1{bottom:452.110000px;}\n.y6af{bottom:452.280000px;}\n.y7ef{bottom:452.350000px;}\n.y885{bottom:453.430000px;}\n.y8a0{bottom:453.670000px;}\n.y8ce{bottom:453.790000px;}\n.y7ac{bottom:453.910000px;}\n.y4de{bottom:454.030000px;}\n.y531{bottom:454.270000px;}\n.y739{bottom:454.630000px;}\n.y463{bottom:454.750000px;}\n.y86c{bottom:454.990000px;}\n.y7c7{bottom:455.350000px;}\n.y2fc{bottom:455.470000px;}\n.y568{bottom:455.590000px;}\n.y624{bottom:455.710000px;}\n.y430{bottom:455.830000px;}\n.y8f0{bottom:456.070000px;}\n.y122{bottom:456.550000px;}\n.y150{bottom:456.910000px;}\n.y53f{bottom:457.150000px;}\n.y385{bottom:457.270000px;}\n.y372{bottom:457.390000px;}\n.y1cf{bottom:457.510000px;}\n.y2db{bottom:457.630000px;}\n.y36a{bottom:458.280000px;}\n.y809{bottom:458.470000px;}\n.y585{bottom:458.710000px;}\n.y118{bottom:458.830000px;}\n.y11c{bottom:459.790000px;}\n.y178{bottom:460.150000px;}\n.y41c{bottom:460.990000px;}\n.y494{bottom:461.830000px;}\n.y31b{bottom:462.070000px;}\n.y93b{bottom:463.150000px;}\n.y5ee{bottom:463.390000px;}\n.y1a3{bottom:463.630000px;}\n.y6d0{bottom:463.870000px;}\n.y7ee{bottom:463.990000px;}\n.y4bf{bottom:464.110000px;}\n.y2c7{bottom:465.310000px;}\n.y89f{bottom:465.430000px;}\n.y92a{bottom:465.910000px;}\n.y752{bottom:466.510000px;}\n.y642{bottom:466.630000px;}\n.y884{bottom:466.870000px;}\n.y54{bottom:467.110000px;}\n.y79{bottom:467.230000px;}\n.y8e{bottom:467.710000px;}\n.y14f{bottom:468.670000px;}\n.y4fd{bottom:468.790000px;}\n.y26{bottom:468.910000px;}\n.y28f{bottom:469.150000px;}\n.ybd{bottom:469.270000px;}\n.yc8{bottom:469.390000px;}\n.y209{bottom:469.510000px;}\n.y808{bottom:470.230000px;}\n.y5c1{bottom:470.350000px;}\n.y3cd{bottom:470.710000px;}\n.y95e{bottom:470.950000px;}\n.y177{bottom:472.030000px;}\n.y117{bottom:472.390000px;}\n.y719{bottom:472.680000px;}\n.y65b{bottom:473.230000px;}\n.y493{bottom:473.710000px;}\n.y673{bottom:473.830000px;}\n.y5ed{bottom:475.270000px;}\n.y6cf{bottom:475.510000px;}\n.y4be{bottom:475.870000px;}\n.y7ed{bottom:475.990000px;}\n.y74a{bottom:476.400000px;}\n.y4dd{bottom:477.070000px;}\n.y2c6{bottom:477.190000px;}\n.y52f{bottom:477.310000px;}\n.y79a{bottom:477.670000px;}\n.y462{bottom:477.790000px;}\n.y641{bottom:478.390000px;}\n.y567{bottom:478.630000px;}\n.y33b{bottom:478.750000px;}\n.y2fb{bottom:478.870000px;}\n.y3ab{bottom:478.990000px;}\n.y8ef{bottom:479.350000px;}\n.y14e{bottom:480.550000px;}\n.y70d{bottom:480.670000px;}\n.y28e{bottom:480.910000px;}\n.y5c0{bottom:482.110000px;}\n.y176{bottom:483.790000px;}\n.y36e{bottom:483.910000px;}\n.y116{bottom:484.150000px;}\n.y41b{bottom:484.390000px;}\n.y78{bottom:484.630000px;}\n.y6f5{bottom:484.990000px;}\n.yff{bottom:485.110000px;}\n.y53{bottom:485.230000px;}\n.y492{bottom:485.470000px;}\n.y672{bottom:486.070000px;}\n.y1a2{bottom:486.670000px;}\n.yc7{bottom:486.790000px;}\n.y25{bottom:486.910000px;}\n.yda{bottom:487.270000px;}\n.ybc{bottom:487.390000px;}\n.y4bd{bottom:487.750000px;}\n.y7ab{bottom:488.830000px;}\n.y94c{bottom:488.950000px;}\n.y2c5{bottom:489.070000px;}\n.y4dc{bottom:489.430000px;}\n.y461{bottom:489.550000px;}\n.y640{bottom:490.270000px;}\n.y33a{bottom:490.510000px;}\n.y2fa{bottom:490.630000px;}\n.y3aa{bottom:490.750000px;}\n.y826{bottom:491.110000px;}\n.y6a3{bottom:491.710000px;}\n.y577{bottom:492.070000px;}\n.y384{bottom:492.190000px;}\n.y1f1{bottom:492.310000px;}\n.y2a5{bottom:492.360000px;}\n.y1ce{bottom:492.430000px;}\n.y227{bottom:492.550000px;}\n.y53e{bottom:492.670000px;}\n.y208{bottom:492.790000px;}\n.y442{bottom:492.910000px;}\n.y84b{bottom:493.870000px;}\n.y3cc{bottom:493.990000px;}\n.y95d{bottom:494.350000px;}\n.y28d{bottom:494.830000px;}\n.y175{bottom:495.670000px;}\n.y65a{bottom:496.510000px;}\n.y491{bottom:497.350000px;}\n.y720{bottom:497.830000px;}\n.y5ec{bottom:498.670000px;}\n.y6ce{bottom:499.030000px;}\n.y4bc{bottom:499.510000px;}\n.y8cd{bottom:500.470000px;}\n.y1a1{bottom:500.710000px;}\n.y2c4{bottom:500.830000px;}\n.y929{bottom:501.310000px;}\n.y460{bottom:501.430000px;}\n.y4db{bottom:501.550000px;}\n.y566{bottom:502.270000px;}\n.y623{bottom:502.390000px;}\n.y3a9{bottom:502.510000px;}\n.y52{bottom:502.630000px;}\n.y2f9{bottom:502.750000px;}\n.y7ec{bottom:502.990000px;}\n.yfe{bottom:503.110000px;}\n.y14d{bottom:503.830000px;}\n.y383{bottom:503.950000px;}\n.y3ed{bottom:504.070000px;}\n.yc6{bottom:504.190000px;}\n.y24{bottom:504.310000px;}\n.y576{bottom:504.670000px;}\n.yd9{bottom:504.790000px;}\n.y807{bottom:505.150000px;}\n.y4fc{bottom:505.990000px;}\n.y28c{bottom:506.590000px;}\n.yc{bottom:506.950000px;}\n.y115{bottom:507.310000px;}\n.y84a{bottom:507.430000px;}\n.y36c{bottom:507.550000px;}\n.y41a{bottom:507.670000px;}\n.y31a{bottom:508.390000px;}\n.y6f2{bottom:508.630000px;}\n.y490{bottom:509.110000px;}\n.y671{bottom:509.350000px;}\n.y2ba{bottom:510.070000px;}\n.y6cd{bottom:510.670000px;}\n.y785{bottom:510.910000px;}\n.y4bb{bottom:511.390000px;}\n.y8cc{bottom:512.230000px;}\n.y94b{bottom:512.590000px;}\n.y2c3{bottom:512.710000px;}\n.y6a2{bottom:512.950000px;}\n.y928{bottom:513.190000px;}\n.y738{bottom:513.910000px;}\n.y622{bottom:514.150000px;}\n.y5bf{bottom:514.270000px;}\n.y89e{bottom:514.390000px;}\n.y825{bottom:514.630000px;}\n.y63f{bottom:514.750000px;}\n.y8b3{bottom:515.470000px;}\n.y5d5{bottom:515.590000px;}\n.y69b{bottom:515.710000px;}\n.y226{bottom:515.830000px;}\n.y1f0{bottom:515.950000px;}\n.y1cd{bottom:516.070000px;}\n.y207{bottom:516.190000px;}\n.y806{bottom:516.910000px;}\n.y95c{bottom:517.390000px;}\n.y3cb{bottom:517.510000px;}\n.y14c{bottom:517.750000px;}\n.y28b{bottom:518.230000px;}\n.yb{bottom:518.350000px;}\n.y174{bottom:519.190000px;}\n.y419{bottom:519.430000px;}\n.y659{bottom:519.910000px;}\n.y51{bottom:520.030000px;}\n.y77{bottom:520.150000px;}\n.y8d{bottom:520.630000px;}\n.y48f{bottom:520.990000px;}\n.y590{bottom:521.230000px;}\n.y71e{bottom:521.470000px;}\n.y5eb{bottom:521.830000px;}\n.yd8{bottom:522.190000px;}\n.y23{bottom:522.310000px;}\n.y6cc{bottom:522.430000px;}\n.y4ba{bottom:523.150000px;}\n.y2b9{bottom:523.510000px;}\n.y1a0{bottom:523.990000px;}\n.y8cb{bottom:524.110000px;}\n.y52c{bottom:524.590000px;}\n.y4da{bottom:524.830000px;}\n.y784{bottom:524.950000px;}\n.y45f{bottom:525.310000px;}\n.y400{bottom:525.550000px;}\n.y737{bottom:525.670000px;}\n.y565{bottom:525.910000px;}\n.y3a8{bottom:526.030000px;}\n.y2f8{bottom:526.150000px;}\n.y7eb{bottom:526.630000px;}\n.y63e{bottom:526.870000px;}\n.y883{bottom:527.110000px;}\n.y5d4{bottom:527.230000px;}\n.y6b9{bottom:527.350000px;}\n.y7b8{bottom:527.470000px;}\n.y225{bottom:527.590000px;}\n.y3ec{bottom:527.710000px;}\n.y1cc{bottom:527.830000px;}\n.y206{bottom:527.950000px;}\n.y805{bottom:528.790000px;}\n.y4fb{bottom:529.150000px;}\n.y670{bottom:529.510000px;}\n.y28a{bottom:529.990000px;}\n.y683{bottom:530.160000px;}\n.y114{bottom:530.590000px;}\n.y418{bottom:531.670000px;}\n.y319{bottom:532.390000px;}\n.y173{bottom:532.750000px;}\n.y85f{bottom:533.160000px;}\n.y83c{bottom:533.710000px;}\n.y354{bottom:533.830000px;}\n.y6cb{bottom:534.190000px;}\n.y93a{bottom:534.550000px;}\n.y48e{bottom:535.030000px;}\n.y58f{bottom:535.270000px;}\n.y19f{bottom:535.750000px;}\n.y8ca{bottom:535.870000px;}\n.y2c2{bottom:535.990000px;}\n.y751{bottom:536.470000px;}\n.y4d9{bottom:536.590000px;}\n.y799{bottom:536.710000px;}\n.y927{bottom:536.830000px;}\n.y3ff{bottom:537.310000px;}\n.y5be{bottom:537.430000px;}\n.y76{bottom:537.550000px;}\n.y9d{bottom:538.030000px;}\n.y50{bottom:538.150000px;}\n.y882{bottom:538.870000px;}\n.y63d{bottom:538.990000px;}\n.y6a1{bottom:539.110000px;}\n.y61a{bottom:539.230000px;}\n.y53d{bottom:539.350000px;}\n.y224{bottom:539.470000px;}\n.y353{bottom:539.590000px;}\n.yc5{bottom:539.710000px;}\n.y22{bottom:539.830000px;}\n.yd7{bottom:540.190000px;}\n.y804{bottom:540.550000px;}\n.y14b{bottom:540.790000px;}\n.y3ca{bottom:540.910000px;}\n.y95b{bottom:541.030000px;}\n.ya{bottom:541.390000px;}\n.y289{bottom:541.750000px;}\n.y113{bottom:542.350000px;}\n.y658{bottom:543.910000px;}\n.y71b{bottom:545.230000px;}\n.y5ea{bottom:545.470000px;}\n.y6ca{bottom:545.830000px;}\n.y939{bottom:546.310000px;}\n.y892{bottom:547.680000px;}\n.y8c9{bottom:547.870000px;}\n.y19e{bottom:547.990000px;}\n.y529{bottom:548.230000px;}\n.y783{bottom:548.470000px;}\n.y4d8{bottom:548.590000px;}\n.y8f9{bottom:549.070000px;}\n.y339{bottom:549.190000px;}\n.y2f7{bottom:549.310000px;}\n.y2c1{bottom:549.430000px;}\n.y824{bottom:549.670000px;}\n.y7ea{bottom:550.390000px;}\n.y2b7{bottom:550.870000px;}\n.y70c{bottom:550.990000px;}\n.y570{bottom:551.110000px;}\n.y223{bottom:551.230000px;}\n.y1ef{bottom:551.350000px;}\n.y233{bottom:551.470000px;}\n.y2da{bottom:551.590000px;}\n.y803{bottom:552.430000px;}\n.y4fa{bottom:552.550000px;}\n.y9{bottom:552.910000px;}\n.y288{bottom:553.510000px;}\n.y318{bottom:555.430000px;}\n.y4f{bottom:555.550000px;}\n.y657{bottom:555.670000px;}\n.yfd{bottom:556.030000px;}\n.y172{bottom:556.150000px;}\n.y698{bottom:556.630000px;}\n.y21{bottom:557.230000px;}\n.ye2{bottom:557.590000px;}\n.yc4{bottom:557.710000px;}\n.y750{bottom:557.950000px;}\n.y48d{bottom:558.070000px;}\n.y58e{bottom:558.190000px;}\n.y769{bottom:558.240000px;}\n.y938{bottom:558.550000px;}\n.y7aa{bottom:559.750000px;}\n.y926{bottom:559.870000px;}\n.y8f8{bottom:560.830000px;}\n.y338{bottom:560.950000px;}\n.y881{bottom:561.550000px;}\n.y823{bottom:561.670000px;}\n.y70b{bottom:562.750000px;}\n.y548{bottom:562.870000px;}\n.y453{bottom:562.990000px;}\n.y1cb{bottom:563.110000px;}\n.y1ee{bottom:563.230000px;}\n.y232{bottom:563.350000px;}\n.y205{bottom:563.470000px;}\n.y7e9{bottom:563.830000px;}\n.y14a{bottom:564.070000px;}\n.y802{bottom:564.190000px;}\n.y8{bottom:564.430000px;}\n.y95a{bottom:564.790000px;}\n.y287{bottom:565.150000px;}\n.y112{bottom:565.390000px;}\n.y656{bottom:567.430000px;}\n.y6ee{bottom:568.870000px;}\n.y5e9{bottom:569.110000px;}\n.y6c9{bottom:569.350000px;}\n.y317{bottom:569.470000px;}\n.y171{bottom:569.710000px;}\n.y48c{bottom:569.830000px;}\n.y19d{bottom:571.030000px;}\n.y8c8{bottom:571.150000px;}\n.y527{bottom:571.270000px;}\n.y782{bottom:571.510000px;}\n.y4d7{bottom:571.630000px;}\n.y937{bottom:571.990000px;}\n.y45e{bottom:572.230000px;}\n.y798{bottom:572.470000px;}\n.y2f6{bottom:572.710000px;}\n.y2c0{bottom:572.830000px;}\n.y4e{bottom:572.950000px;}\n.y736{bottom:573.070000px;}\n.y880{bottom:573.310000px;}\n.y776{bottom:573.430000px;}\n.y8c{bottom:573.550000px;}\n.y896{bottom:574.390000px;}\n.y70a{bottom:574.510000px;}\n.y352{bottom:574.630000px;}\n.yd6{bottom:575.110000px;}\n.y20{bottom:575.230000px;}\n.yeb{bottom:575.710000px;}\n.y7{bottom:575.950000px;}\n.y4f9{bottom:576.070000px;}\n.y286{bottom:576.910000px;}\n.y7e8{bottom:577.390000px;}\n.y3c9{bottom:577.870000px;}\n.y417{bottom:578.950000px;}\n.y655{bottom:579.790000px;}\n.y6c8{bottom:580.990000px;}\n.y48b{bottom:581.710000px;}\n.y58d{bottom:581.950000px;}\n.y19c{bottom:582.790000px;}\n.y4d6{bottom:583.270000px;}\n.y781{bottom:583.390000px;}\n.y925{bottom:583.510000px;}\n.y94a{bottom:583.870000px;}\n.y3a7{bottom:584.470000px;}\n.y337{bottom:584.590000px;}\n.y822{bottom:584.830000px;}\n.y87f{bottom:584.950000px;}\n.y774{bottom:585.310000px;}\n.y557{bottom:586.030000px;}\n.y1ed{bottom:586.150000px;}\n.y1ca{bottom:586.270000px;}\n.y231{bottom:586.390000px;}\n.y619{bottom:586.510000px;}\n.y441{bottom:586.630000px;}\n.y204{bottom:586.750000px;}\n.y6{bottom:587.350000px;}\n.y149{bottom:587.950000px;}\n.y959{bottom:588.070000px;}\n.y111{bottom:588.670000px;}\n.y7e7{bottom:589.030000px;}\n.yc3{bottom:590.350000px;}\n.y75{bottom:590.470000px;}\n.y4d{bottom:590.950000px;}\n.y654{bottom:592.270000px;}\n.y316{bottom:592.390000px;}\n.ye1{bottom:592.510000px;}\n.y1f{bottom:592.630000px;}\n.y6c7{bottom:592.750000px;}\n.y170{bottom:592.990000px;}\n.yd5{bottom:593.110000px;}\n.y48a{bottom:593.470000px;}\n.y4b9{bottom:594.070000px;}\n.y8c7{bottom:594.430000px;}\n.y19b{bottom:594.670000px;}\n.y45d{bottom:595.300000px;}\n.y936{bottom:595.420000px;}\n.y4d5{bottom:595.540000px;}\n.y797{bottom:595.900000px;}\n.y3fe{bottom:596.140000px;}\n.y2f5{bottom:596.380000px;}\n.y5bd{bottom:596.500000px;}\n.y8f7{bottom:596.620000px;}\n.y336{bottom:596.740000px;}\n.y2bf{bottom:596.860000px;}\n.y949{bottom:597.340000px;}\n.y89d{bottom:597.820000px;}\n.y222{bottom:597.940000px;}\n.y371{bottom:598.060000px;}\n.y230{bottom:598.180000px;}\n.y5{bottom:598.900000px;}\n.y4f8{bottom:599.260000px;}\n.y285{bottom:600.340000px;}\n.y7e6{bottom:600.940000px;}\n.y3c8{bottom:601.180000px;}\n.y416{bottom:602.260000px;}\n.y110{bottom:602.500000px;}\n.y695{bottom:603.340000px;}\n.y653{bottom:604.060000px;}\n.y6c6{bottom:604.540000px;}\n.y16f{bottom:604.780000px;}\n.y489{bottom:605.380000px;}\n.y4b8{bottom:605.980000px;}\n.y8c6{bottom:606.220000px;}\n.y58c{bottom:607.060000px;}\n.y924{bottom:607.180000px;}\n.y796{bottom:607.660000px;}\n.y3a6{bottom:608.140000px;}\n.y5bc{bottom:608.260000px;}\n.y8b{bottom:608.380000px;}\n.y4c{bottom:608.500000px;}\n.yae{bottom:608.980000px;}\n.y45c{bottom:609.460000px;}\n.y1ec{bottom:609.820000px;}\n.y1c9{bottom:609.940000px;}\n.y203{bottom:610.060000px;}\n.y1e{bottom:610.180000px;}\n.y4{bottom:610.420000px;}\n.yd4{bottom:610.540000px;}\n.ye0{bottom:610.660000px;}\n.y63c{bottom:611.020000px;}\n.y148{bottom:611.380000px;}\n.y958{bottom:611.500000px;}\n.y2b2{bottom:611.620000px;}\n.y4f7{bottom:611.860000px;}\n.y284{bottom:612.100000px;}\n.y3c7{bottom:612.940000px;}\n.y5e8{bottom:615.820000px;}\n.y315{bottom:616.060000px;}\n.y10f{bottom:616.300000px;}\n.y16e{bottom:616.660000px;}\n.y935{bottom:617.020000px;}\n.y488{bottom:617.140000px;}\n.y4b7{bottom:617.740000px;}\n.y8c5{bottom:618.220000px;}\n.y19a{bottom:618.580000px;}\n.y780{bottom:618.820000px;}\n.y4d4{bottom:618.940000px;}\n.y795{bottom:619.540000px;}\n.y909{bottom:619.780000px;}\n.y735{bottom:619.900000px;}\n.y2f4{bottom:620.020000px;}\n.y335{bottom:620.140000px;}\n.y948{bottom:620.620000px;}\n.y801{bottom:620.860000px;}\n.y370{bottom:621.580000px;}\n.y1c8{bottom:621.700000px;}\n.y202{bottom:621.820000px;}\n.y283{bottom:623.860000px;}\n.y63b{bottom:624.580000px;}\n.y89c{bottom:624.700000px;}\n.y3c6{bottom:625.180000px;}\n.y415{bottom:625.660000px;}\n.y4b{bottom:625.900000px;}\n.y8a{bottom:626.500000px;}\n.y693{bottom:626.620000px;}\n.y5e7{bottom:627.580000px;}\n.y314{bottom:627.820000px;}\n.y6c5{bottom:627.940000px;}\n.ydf{bottom:628.060000px;}\n.y1d{bottom:628.180000px;}\n.yea{bottom:628.540000px;}\n.yd3{bottom:628.660000px;}\n.y487{bottom:629.020000px;}\n.y4b6{bottom:629.620000px;}\n.y3{bottom:630.220000px;}\n.y199{bottom:630.340000px;}\n.y4d3{bottom:630.580000px;}\n.y2f3{bottom:631.780000px;}\n.y334{bottom:631.900000px;}\n.y800{bottom:632.500000px;}\n.y4f6{bottom:632.620000px;}\n.y45b{bottom:632.740000px;}\n.y58b{bottom:632.980000px;}\n.y1eb{bottom:633.220000px;}\n.y440{bottom:633.340000px;}\n.y44d{bottom:633.460000px;}\n.y221{bottom:633.580000px;}\n.y1c7{bottom:633.700000px;}\n.y734{bottom:633.820000px;}\n.y147{bottom:634.780000px;}\n.y2af{bottom:635.260000px;}\n.y282{bottom:635.500000px;}\n.y89b{bottom:636.460000px;}\n.y3c5{bottom:636.940000px;}\n.y7e5{bottom:638.620000px;}\n.y934{bottom:638.740000px;}\n.y10e{bottom:639.460000px;}\n.y16d{bottom:639.700000px;}\n.y8c4{bottom:641.260000px;}\n.y524{bottom:641.860000px;}\n.y947{bottom:642.220000px;}\n.y77f{bottom:642.460000px;}\n.y198{bottom:642.580000px;}\n.y74{bottom:643.300000px;}\n.y313{bottom:643.420000px;}\n.y2f2{bottom:643.660000px;}\n.y333{bottom:643.780000px;}\n.y4a{bottom:643.900000px;}\n.y923{bottom:644.020000px;}\n.y7ff{bottom:644.740000px;}\n.y4f5{bottom:645.220000px;}\n.yde{bottom:645.460000px;}\n.y1c{bottom:645.580000px;}\n.ye9{bottom:646.060000px;}\n.y58a{bottom:646.540000px;}\n.y3e5{bottom:646.680000px;}\n.y281{bottom:647.260000px;}\n.y63a{bottom:647.860000px;}\n.y5e6{bottom:648.340000px;}\n.y89a{bottom:648.700000px;}\n.y603{bottom:648.720000px;}\n.y414{bottom:649.540000px;}\n.y690{bottom:650.620000px;}\n.y16c{bottom:651.460000px;}\n.y7e4{bottom:652.060000px;}\n.y486{bottom:652.660000px;}\n.y8c3{bottom:652.900000px;}\n.y10d{bottom:653.020000px;}\n.y87e{bottom:655.300000px;}\n.y821{bottom:655.420000px;}\n.y76f{bottom:655.660000px;}\n.y351{bottom:656.500000px;}\n.y1ea{bottom:656.620000px;}\n.y448{bottom:656.740000px;}\n.y1c6{bottom:656.860000px;}\n.y2be{bottom:656.980000px;}\n.y312{bottom:657.100000px;}\n.y146{bottom:658.060000px;}\n.y957{bottom:658.780000px;}\n.y2ad{bottom:658.900000px;}\n.y280{bottom:659.020000px;}\n.y933{bottom:660.820000px;}\n.y49{bottom:661.300000px;}\n.y73{bottom:661.420000px;}\n.yad{bottom:661.900000px;}\n.y1b{bottom:662.980000px;}\n.y16b{bottom:663.340000px;}\n.ye8{bottom:663.460000px;}\n.ydd{bottom:663.580000px;}\n.y946{bottom:663.940000px;}\n.y485{bottom:664.420000px;}\n.y68f{bottom:664.660000px;}\n.y522{bottom:665.020000px;}\n.y197{bottom:665.620000px;}\n.y77e{bottom:666.340000px;}\n.y10c{bottom:666.460000px;}\n.y3fd{bottom:666.580000px;}\n.y3a5{bottom:666.700000px;}\n.y332{bottom:666.820000px;}\n.y2f1{bottom:666.940000px;}\n.y87d{bottom:667.060000px;}\n.y922{bottom:667.420000px;}\n.y69e{bottom:668.260000px;}\n.y1e9{bottom:668.380000px;}\n.y4f4{bottom:668.620000px;}\n.y145{bottom:669.820000px;}\n.y27f{bottom:670.780000px;}\n.y639{bottom:671.260000px;}\n.y3e9{bottom:671.740000px;}\n.y413{bottom:672.940000px;}\n.y890{bottom:674.760000px;}\n.y7e3{bottom:675.220000px;}\n.y484{bottom:676.300000px;}\n.y652{bottom:677.020000px;}\n.y16a{bottom:677.140000px;}\n.y196{bottom:677.380000px;}\n.y564{bottom:678.460000px;}\n.y5bb{bottom:678.580000px;}\n.y9c{bottom:678.700000px;}\n.y72{bottom:678.820000px;}\n.y76d{bottom:678.940000px;}\n.yac{bottom:679.300000px;}\n.y48{bottom:679.420000px;}\n.y10b{bottom:679.900000px;}\n.y1c5{bottom:680.140000px;}\n.y1e8{bottom:680.260000px;}\n.y3eb{bottom:680.380000px;}\n.y350{bottom:680.500000px;}\n.y43f{bottom:680.620000px;}\n.y1a{bottom:680.980000px;}\n.ye7{bottom:681.460000px;}\n.y589{bottom:681.580000px;}\n.y2ac{bottom:681.940000px;}\n.y144{bottom:682.060000px;}\n.y27e{bottom:682.420000px;}\n.y638{bottom:683.020000px;}\n.y899{bottom:683.620000px;}\n.y945{bottom:685.900000px;}\n.y6c4{bottom:686.980000px;}\n.y483{bottom:688.060000px;}\n.y8c2{bottom:688.420000px;}\n.y921{bottom:689.020000px;}\n.y195{bottom:689.260000px;}\n.y77d{bottom:689.740000px;}\n.y3a4{bottom:689.980000px;}\n.y2f0{bottom:690.340000px;}\n.y87c{bottom:690.460000px;}\n.y5ba{bottom:690.580000px;}\n.y44c{bottom:691.900000px;}\n.y1e7{bottom:692.020000px;}\n.y820{bottom:692.620000px;}\n.y588{bottom:693.820000px;}\n.y27d{bottom:694.180000px;}\n.y637{bottom:695.020000px;}\n.y3e7{bottom:695.380000px;}\n.y71{bottom:696.220000px;}\n.y9b{bottom:696.700000px;}\n.y47{bottom:696.820000px;}\n.y19{bottom:698.500000px;}\n.y6c3{bottom:698.740000px;}\n.ydc{bottom:698.980000px;}\n.y7e2{bottom:699.460000px;}\n.y482{bottom:699.940000px;}\n.y8c1{bottom:700.180000px;}\n.y85a{bottom:700.200000px;}\n.y85c{bottom:700.320000px;}\n.y169{bottom:700.540000px;}\n.y77c{bottom:701.500000px;}\n.y3a3{bottom:701.740000px;}\n.y68c{bottom:701.980000px;}\n.y4b5{bottom:702.100000px;}\n.y87b{bottom:702.220000px;}\n.y45a{bottom:703.180000px;}\n.y10a{bottom:703.300000px;}\n.y1c4{bottom:703.780000px;}\n.y1e6{bottom:703.900000px;}\n.y42f{bottom:704.020000px;}\n.y331{bottom:704.140000px;}\n.y779{bottom:704.260000px;}\n.y81f{bottom:704.380000px;}\n.y143{bottom:705.340000px;}\n.y7fe{bottom:705.460000px;}\n.y2aa{bottom:705.580000px;}\n.y27c{bottom:705.940000px;}\n.y944{bottom:707.380000px;}\n.y6c2{bottom:710.620000px;}\n.y920{bottom:710.740000px;}\n.y481{bottom:711.700000px;}\n.y8c0{bottom:712.060000px;}\n.y7e1{bottom:712.900000px;}\n.y3fc{bottom:713.380000px;}\n.y77b{bottom:713.500000px;}\n.y2ef{bottom:713.740000px;}\n.y5b9{bottom:713.860000px;}\n.y3a2{bottom:713.980000px;}\n.y9a{bottom:714.100000px;}\n.y46{bottom:714.220000px;}\n.yab{bottom:714.820000px;}\n.y2{bottom:714.940000px;}\n.y109{bottom:715.060000px;}\n.y34f{bottom:715.540000px;}\n.y1e5{bottom:715.660000px;}\n.ye6{bottom:716.380000px;}\n.y18{bottom:716.500000px;}\n.y587{bottom:716.980000px;}\n.y7fd{bottom:717.340000px;}\n.y27b{bottom:717.580000px;}\n.y636{bottom:718.420000px;}\n.y412{bottom:719.620000px;}\n.y3c4{bottom:721.540000px;}\n.y480{bottom:723.580000px;}\n.y168{bottom:723.820000px;}\n.y768{bottom:723.840000px;}\n.y81e{bottom:724.540000px;}\n.y7e0{bottom:724.660000px;}\n.y834{bottom:725.040000px;}\n.y3fb{bottom:725.140000px;}\n.y3a1{bottom:725.740000px;}\n.y68a{bottom:725.980000px;}\n.y194{bottom:726.580000px;}\n.y4d2{bottom:726.940000px;}\n.y108{bottom:727.180000px;}\n.y613{bottom:727.300000px;}\n.y1c3{bottom:727.420000px;}\n.y1e4{bottom:727.540000px;}\n.y2ee{bottom:727.660000px;}\n.y142{bottom:728.740000px;}\n.y943{bottom:728.980000px;}\n.y7fc{bottom:729.220000px;}\n.y27a{bottom:729.340000px;}\n.y70{bottom:731.620000px;}\n.y45{bottom:732.220000px;}\n.y91f{bottom:732.580000px;}\n.y6c1{bottom:733.660000px;}\n.y17{bottom:733.900000px;}\n.y411{bottom:734.260000px;}\n.ye5{bottom:734.380000px;}\n.y8bf{bottom:735.700000px;}\n.y7df{bottom:736.540000px;}\n.y3fa{bottom:737.380000px;}\n.y5b8{bottom:737.500000px;}\n.y3a0{bottom:737.620000px;}\n.y908{bottom:737.740000px;}\n.y193{bottom:738.340000px;}\n.y56f{bottom:738.820000px;}\n.y618{bottom:738.940000px;}\n.y1c2{bottom:739.180000px;}\n.y1e3{bottom:739.300000px;}\n.y898{bottom:739.420000px;}\n.y107{bottom:740.380000px;}\n.y141{bottom:740.500000px;}\n.y279{bottom:741.100000px;}\n.y635{bottom:742.060000px;}\n.y83a{bottom:743.140000px;}\n.y515{bottom:746.040000px;}\n.y167{bottom:747.220000px;}\n.y410{bottom:747.700000px;}\n.y688{bottom:749.020000px;}\n.y3f9{bottom:749.140000px;}\n.y99{bottom:749.620000px;}\n.y44{bottom:749.740000px;}\n.y4d1{bottom:750.220000px;}\n.y192{bottom:750.580000px;}\n.y2bd{bottom:750.820000px;}\n.y778{bottom:750.940000px;}\n.y1c1{bottom:751.060000px;}\n.y1e2{bottom:751.180000px;}\n.y16{bottom:751.420000px;}\n.ye4{bottom:751.780000px;}\n.y106{bottom:752.140000px;}\n.y278{bottom:752.740000px;}\n.y634{bottom:754.300000px;}\n.y91e{bottom:754.660000px;}\n.y140{bottom:755.740000px;}\n.y839{bottom:756.700000px;}\n.y8be{bottom:758.980000px;}\n.y7de{bottom:760.180000px;}\n.y39f{bottom:760.660000px;}\n.y47f{bottom:760.780000px;}\n.y907{bottom:761.020000px;}\n.y166{bottom:761.260000px;}\n.y3f8{bottom:761.500000px;}\n.y3c3{bottom:762.460000px;}\n.y105{bottom:764.040000px;}\n.y277{bottom:764.520000px;}\n.y43{bottom:767.160000px;}\n.yaa{bottom:767.640000px;}\n.yfc{bottom:767.760000px;}\n.y15{bottom:769.440000px;}\n.y13f{bottom:769.800000px;}\n.ye3{bottom:769.920000px;}\n.y956{bottom:771.000000px;}\n.y40f{bottom:771.240000px;}\n.y963{bottom:771.720000px;}\n.y87a{bottom:772.440000px;}\n.y686{bottom:773.520000px;}\n.y191{bottom:773.640000px;}\n.y1c0{bottom:774.120000px;}\n.y2bc{bottom:774.240000px;}\n.y201{bottom:774.480000px;}\n.y39e{bottom:774.840000px;}\n.y276{bottom:776.520000px;}\n.y104{bottom:776.640000px;}\n.y8bd{bottom:782.520000px;}\n.y837{bottom:783.960000px;}\n.y13e{bottom:784.080000px;}\n.y5e5{bottom:784.320000px;}\n.y6f{bottom:784.560000px;}\n.y40e{bottom:784.680000px;}\n.ya9{bottom:785.040000px;}\n.y42{bottom:785.160000px;}\n.y190{bottom:785.400000px;}\n.y766{bottom:785.640000px;}\n.y1bf{bottom:786.000000px;}\n.y877{bottom:786.240000px;}\n.y14{bottom:786.840000px;}\n.y13d{bottom:797.280000px;}\n.y103{bottom:797.400000px;}\n.y200{bottom:797.760000px;}\n.y1be{bottom:797.880000px;}\n.y165{bottom:798.120000px;}\n.y13{bottom:798.840000px;}\n.y41{bottom:802.560000px;}\n.h16{height:3.341250px;}\n.h38{height:11.040000px;}\n.h20{height:11.187656px;}\n.h22{height:12.220781px;}\n.h2c{height:12.730781px;}\n.h32{height:13.080000px;}\n.h28{height:13.906406px;}\n.ha{height:15.000000px;}\n.h1e{height:23.280000px;}\n.h1b{height:24.441562px;}\n.h34{height:25.800000px;}\n.h15{height:27.662344px;}\n.h7{height:31.324219px;}\n.h1f{height:32.019844px;}\n.h27{height:32.097000px;}\n.h10{height:32.994844px;}\n.h45{height:34.200000px;}\n.hd{height:34.461600px;}\n.h48{height:34.626563px;}\n.he{height:34.665469px;}\n.h1a{height:34.749000px;}\n.h3c{height:34.920000px;}\n.hc{height:34.976719px;}\n.h31{height:35.040000px;}\n.h18{height:35.061000px;}\n.h49{height:35.280000px;}\n.hb{height:35.491875px;}\n.h40{height:35.520000px;}\n.h42{height:35.640000px;}\n.h8{height:37.423828px;}\n.h13{height:38.424375px;}\n.h6{height:38.769375px;}\n.h4{height:41.415703px;}\n.h11{height:41.765625px;}\n.h12{height:42.140625px;}\n.h9{height:43.922812px;}\n.h5{height:45.906562px;}\n.h44{height:47.520000px;}\n.h36{height:48.960000px;}\n.h33{height:59.760000px;}\n.h2a{height:59.880000px;}\n.h1c{height:60.240000px;}\n.h14{height:62.648438px;}\n.hf{height:63.465469px;}\n.h3b{height:72.480000px;}\n.h29{height:72.720000px;}\n.h26{height:72.960000px;}\n.h21{height:73.080000px;}\n.h2d{height:73.560000px;}\n.h23{height:73.680000px;}\n.h43{height:81.360000px;}\n.h39{height:81.480000px;}\n.h3e{height:81.960000px;}\n.h2f{height:84.120000px;}\n.h3f{height:86.640000px;}\n.h25{height:92.040000px;}\n.h46{height:92.400000px;}\n.h1d{height:96.360000px;}\n.h2e{height:96.840000px;}\n.h37{height:99.480000px;}\n.h2{height:116.263359px;}\n.h41{height:142.440000px;}\n.h3a{height:152.760000px;}\n.h3d{height:153.600000px;}\n.h3{height:168.562500px;}\n.h24{height:182.400000px;}\n.h19{height:260.040000px;}\n.h30{height:276.840000px;}\n.h47{height:311.760000px;}\n.h17{height:313.320000px;}\n.h35{height:356.640000px;}\n.h2b{height:387.840000px;}\n.h0{height:842.040000px;}\n.h1{height:842.500000px;}\n.w3{width:18.240000px;}\n.w15{width:21.120000px;}\n.w22{width:23.760000px;}\n.w18{width:32.880000px;}\n.w16{width:44.520000px;}\n.w8{width:57.600000px;}\n.w1b{width:58.320000px;}\n.wf{width:62.400000px;}\n.w11{width:79.080000px;}\n.w1d{width:80.160000px;}\n.wa{width:91.560000px;}\n.wc{width:92.880000px;}\n.wd{width:104.520000px;}\n.w12{width:111.600000px;}\n.w5{width:117.840000px;}\n.w7{width:122.160000px;}\n.w6{width:150.360000px;}\n.w1f{width:154.440000px;}\n.w17{width:167.280000px;}\n.w24{width:170.040000px;}\n.w21{width:187.680000px;}\n.w10{width:191.640000px;}\n.w1e{width:212.520000px;}\n.wb{width:227.400000px;}\n.w23{width:244.200000px;}\n.we{width:250.920000px;}\n.w13{width:261.240000px;}\n.w20{width:284.640000px;}\n.w9{width:465.360000px;}\n.w1a{width:466.200000px;}\n.w19{width:474.840000px;}\n.w1c{width:477.240000px;}\n.w14{width:480.240000px;}\n.w4{width:513.840000px;}\n.w2{width:594.959991px;}\n.w0{width:594.960000px;}\n.w1{width:595.500000px;}\n.x0{left:0.000000px;}\n.x24{left:1.680000px;}\n.x8{left:3.000000px;}\n.x4b{left:10.320000px;}\n.x1{left:35.399991px;}\n.x2a{left:37.824000px;}\n.x23{left:41.040000px;}\n.x6{left:42.719991px;}\n.x48{left:44.999991px;}\n.x2e{left:47.664000px;}\n.x29{left:50.999991px;}\n.x35{left:56.423991px;}\n.xa{left:60.743991px;}\n.x25{left:63.383991px;}\n.x1d{left:65.303991px;}\n.x2d{left:67.223991px;}\n.xb{left:68.783991px;}\n.x2c{left:71.063991px;}\n.x3d{left:73.103991px;}\n.x1c{left:74.783991px;}\n.x46{left:76.343991px;}\n.xc{left:78.623991px;}\n.x20{left:80.663991px;}\n.x1e{left:82.943991px;}\n.x36{left:84.383991px;}\n.xe{left:86.663991px;}\n.x28{left:87.863991px;}\n.x9{left:89.423991px;}\n.x38{left:93.743991px;}\n.x27{left:95.903991px;}\n.x26{left:98.183991px;}\n.x30{left:99.743991px;}\n.x33{left:105.259991px;}\n.x1f{left:113.419991px;}\n.x22{left:116.299991px;}\n.x2{left:117.979991px;}\n.x40{left:145.939991px;}\n.x3c{left:149.059991px;}\n.x31{left:153.019991px;}\n.xf{left:155.299991px;}\n.x41{left:159.499991px;}\n.x42{left:162.739991px;}\n.x47{left:172.609991px;}\n.x43{left:174.289991px;}\n.x39{left:194.810000px;}\n.x3b{left:199.370000px;}\n.x16{left:205.729991px;}\n.xd{left:207.289991px;}\n.x10{left:211.369991px;}\n.x32{left:215.689991px;}\n.x3e{left:219.409991px;}\n.x34{left:221.809991px;}\n.x49{left:223.849991px;}\n.x4a{left:226.369991px;}\n.x5{left:227.689991px;}\n.x17{left:252.769991px;}\n.x11{left:286.969991px;}\n.x3{left:297.549991px;}\n.x2b{left:301.440000px;}\n.x45{left:309.309991px;}\n.x18{left:334.269991px;}\n.x12{left:338.229991px;}\n.x19{left:363.909991px;}\n.x1a{left:418.659991px;}\n.x15{left:430.539991px;}\n.x37{left:465.580000px;}\n.x3a{left:470.980000px;}\n.x13{left:481.779991px;}\n.x14{left:491.859991px;}\n.x1b{left:494.379991px;}\n.x3f{left:533.280000px;}\n.x44{left:537.359991px;}\n.x7{left:538.920000px;}\n.x21{left:542.639991px;}\n.x2f{left:555.479991px;}\n.x4{left:580.439991px;}\n@media print{\n.v1{vertical-align:-175.360000pt;}\n.v5{vertical-align:-68.480000pt;}\n.v2{vertical-align:-61.440000pt;}\n.v4{vertical-align:-8.960000pt;}\n.v0{vertical-align:0.000000pt;}\n.v3{vertical-align:38.400000pt;}\n.lse{letter-spacing:-1.936000pt;}\n.ls49{letter-spacing:-1.701333pt;}\n.ls14{letter-spacing:-1.632000pt;}\n.lsa2{letter-spacing:-1.562667pt;}\n.ls7c{letter-spacing:-1.536000pt;}\n.ls9c{letter-spacing:-1.520000pt;}\n.ls3{letter-spacing:-1.482667pt;}\n.ls18{letter-spacing:-1.456000pt;}\n.ls3e{letter-spacing:-1.418667pt;}\n.ls11{letter-spacing:-1.408000pt;}\n.ls78{letter-spacing:-1.370667pt;}\n.ls8a{letter-spacing:-1.360000pt;}\n.ls64{letter-spacing:-1.344000pt;}\n.ls56{letter-spacing:-1.338667pt;}\n.ls9e{letter-spacing:-1.322667pt;}\n.lsa{letter-spacing:-1.296000pt;}\n.lsa7{letter-spacing:-1.290667pt;}\n.ls39{letter-spacing:-1.269333pt;}\n.ls19{letter-spacing:-1.184000pt;}\n.ls34{letter-spacing:-1.173333pt;}\n.ls88{letter-spacing:-1.162667pt;}\n.lsaa{letter-spacing:-1.157333pt;}\n.ls68{letter-spacing:-1.098667pt;}\n.ls67{letter-spacing:-1.093333pt;}\n.lsae{letter-spacing:-1.082667pt;}\n.ls1b{letter-spacing:-1.050667pt;}\n.ls17{letter-spacing:-1.024000pt;}\n.ls61{letter-spacing:-0.954667pt;}\n.ls9a{letter-spacing:-0.725333pt;}\n.ls82{letter-spacing:-0.629333pt;}\n.ls76{letter-spacing:-0.507733pt;}\n.ls60{letter-spacing:-0.451733pt;}\n.ls4e{letter-spacing:-0.432000pt;}\n.ls44{letter-spacing:-0.416533pt;}\n.lsc{letter-spacing:-0.400000pt;}\n.ls4f{letter-spacing:-0.395733pt;}\n.ls81{letter-spacing:-0.385067pt;}\n.ls74{letter-spacing:-0.323733pt;}\n.ls24{letter-spacing:-0.322667pt;}\n.lsab{letter-spacing:-0.281600pt;}\n.ls30{letter-spacing:-0.266667pt;}\n.ls57{letter-spacing:-0.266133pt;}\n.ls7b{letter-spacing:-0.256533pt;}\n.ls32{letter-spacing:-0.251733pt;}\n.ls52{letter-spacing:-0.241067pt;}\n.ls83{letter-spacing:-0.231467pt;}\n.ls15{letter-spacing:-0.208000pt;}\n.ls4c{letter-spacing:-0.201067pt;}\n.ls55{letter-spacing:-0.198400pt;}\n.ls16{letter-spacing:-0.192000pt;}\n.ls98{letter-spacing:-0.188800pt;}\n.ls2b{letter-spacing:-0.174400pt;}\n.ls4b{letter-spacing:-0.163733pt;}\n.lsac{letter-spacing:-0.145067pt;}\n.ls48{letter-spacing:-0.140267pt;}\n.ls92{letter-spacing:-0.127467pt;}\n.ls7e{letter-spacing:-0.107733pt;}\n.ls1c{letter-spacing:-0.100267pt;}\n.lsa3{letter-spacing:-0.095467pt;}\n.lsa9{letter-spacing:-0.077333pt;}\n.ls8b{letter-spacing:-0.066667pt;}\n.ls59{letter-spacing:-0.061867pt;}\n.ls80{letter-spacing:-0.059200pt;}\n.ls35{letter-spacing:-0.057067pt;}\n.ls70{letter-spacing:-0.050187pt;}\n.ls3f{letter-spacing:-0.047360pt;}\n.ls2a{letter-spacing:-0.046720pt;}\n.ls9f{letter-spacing:-0.042240pt;}\n.ls1e{letter-spacing:-0.041600pt;}\n.ls40{letter-spacing:-0.039680pt;}\n.ls62{letter-spacing:-0.035840pt;}\n.ls53{letter-spacing:-0.032000pt;}\n.ls8c{letter-spacing:-0.023680pt;}\n.ls58{letter-spacing:-0.009600pt;}\n.ls84{letter-spacing:-0.001280pt;}\n.ls2{letter-spacing:0.000000pt;}\n.ls2e{letter-spacing:0.011520pt;}\n.ls79{letter-spacing:0.018560pt;}\n.ls42{letter-spacing:0.034560pt;}\n.ls8f{letter-spacing:0.056533pt;}\n.ls6d{letter-spacing:0.069333pt;}\n.ls71{letter-spacing:0.083200pt;}\n.ls6c{letter-spacing:0.084480pt;}\n.lsa0{letter-spacing:0.087040pt;}\n.lsa1{letter-spacing:0.102400pt;}\n.ls43{letter-spacing:0.107733pt;}\n.ls13{letter-spacing:0.112000pt;}\n.ls87{letter-spacing:0.115200pt;}\n.ls2c{letter-spacing:0.117867pt;}\n.lsa8{letter-spacing:0.124800pt;}\n.ls75{letter-spacing:0.132267pt;}\n.ls77{letter-spacing:0.139733pt;}\n.ls7f{letter-spacing:0.148267pt;}\n.ls5{letter-spacing:0.160000pt;}\n.ls89{letter-spacing:0.170667pt;}\n.ls20{letter-spacing:0.173333pt;}\n.ls51{letter-spacing:0.179200pt;}\n.ls5d{letter-spacing:0.183467pt;}\n.ls69{letter-spacing:0.186133pt;}\n.ls5b{letter-spacing:0.188160pt;}\n.ls3c{letter-spacing:0.188267pt;}\n.ls28{letter-spacing:0.198400pt;}\n.ls85{letter-spacing:0.201067pt;}\n.ls50{letter-spacing:0.208000pt;}\n.ls73{letter-spacing:0.211200pt;}\n.ls2f{letter-spacing:0.223467pt;}\n.ls6a{letter-spacing:0.226667pt;}\n.lsb{letter-spacing:0.240000pt;}\n.ls97{letter-spacing:0.243733pt;}\n.ls6e{letter-spacing:0.244267pt;}\n.ls2d{letter-spacing:0.247040pt;}\n.lsa4{letter-spacing:0.253867pt;}\n.ls12{letter-spacing:0.256000pt;}\n.ls90{letter-spacing:0.256533pt;}\n.ls22{letter-spacing:0.274667pt;}\n.ls6f{letter-spacing:0.276267pt;}\n.ls9d{letter-spacing:0.278933pt;}\n.ls25{letter-spacing:0.282133pt;}\n.ls5a{letter-spacing:0.284160pt;}\n.ls31{letter-spacing:0.284800pt;}\n.ls21{letter-spacing:0.287467pt;}\n.ls9{letter-spacing:0.288000pt;}\n.ls29{letter-spacing:0.317333pt;}\n.ls1d{letter-spacing:0.324267pt;}\n.ls47{letter-spacing:0.338133pt;}\n.ls41{letter-spacing:0.339200pt;}\n.ls8e{letter-spacing:0.357867pt;}\n.ls9b{letter-spacing:0.369067pt;}\n.ls5e{letter-spacing:0.438933pt;}\n.ls5c{letter-spacing:0.441600pt;}\n.lsad{letter-spacing:0.451200pt;}\n.ls1a{letter-spacing:0.473600pt;}\n.ls91{letter-spacing:0.476267pt;}\n.ls4d{letter-spacing:0.486400pt;}\n.ls96{letter-spacing:0.512533pt;}\n.ls3a{letter-spacing:0.532267pt;}\n.ls4a{letter-spacing:0.552960pt;}\n.ls8d{letter-spacing:0.554667pt;}\n.ls7a{letter-spacing:0.581333pt;}\n.ls33{letter-spacing:0.592000pt;}\n.ls1f{letter-spacing:0.597333pt;}\n.ls63{letter-spacing:0.602667pt;}\n.ls99{letter-spacing:0.624000pt;}\n.ls45{letter-spacing:0.629333pt;}\n.ls38{letter-spacing:0.650667pt;}\n.ls6b{letter-spacing:0.651520pt;}\n.lsa6{letter-spacing:0.698667pt;}\n.ls36{letter-spacing:0.746667pt;}\n.ls23{letter-spacing:0.757333pt;}\n.ls46{letter-spacing:0.816000pt;}\n.ls66{letter-spacing:0.821333pt;}\n.ls37{letter-spacing:0.826667pt;}\n.ls3d{letter-spacing:0.837333pt;}\n.lsa5{letter-spacing:0.864000pt;}\n.ls7d{letter-spacing:0.896000pt;}\n.ls72{letter-spacing:0.922667pt;}\n.ls5f{letter-spacing:0.960000pt;}\n.ls27{letter-spacing:0.965333pt;}\n.ls3b{letter-spacing:1.113600pt;}\n.ls65{letter-spacing:1.753600pt;}\n.ls26{letter-spacing:6.233600pt;}\n.ls94{letter-spacing:9.433600pt;}\n.ls93{letter-spacing:11.993600pt;}\n.ls4{letter-spacing:68.064000pt;}\n.ls10{letter-spacing:73.056000pt;}\n.ls6{letter-spacing:100.704000pt;}\n.lsf{letter-spacing:101.344000pt;}\n.ls7{letter-spacing:122.976000pt;}\n.ls8{letter-spacing:131.936000pt;}\n.lsd{letter-spacing:133.216000pt;}\n.ls0{letter-spacing:690.506667pt;}\n.ls1{letter-spacing:1384.853333pt;}\n.ls95{letter-spacing:2664.166400pt;}\n.ls54{letter-spacing:2692.326400pt;}\n.ls86{letter-spacing:2693.593600pt;}\n.ws4b{word-spacing:-53.120000pt;}\n.ws0{word-spacing:-32.806400pt;}\n.ws1{word-spacing:-31.323733pt;}\n.ws84{word-spacing:-12.672000pt;}\n.ws1d{word-spacing:-12.651733pt;}\n.ws58{word-spacing:-12.646400pt;}\n.ws62{word-spacing:-12.582400pt;}\n.ws7f{word-spacing:-12.550400pt;}\n.ws2d{word-spacing:-12.523733pt;}\n.ws35{word-spacing:-12.502400pt;}\n.ws1b{word-spacing:-12.443733pt;}\n.ws2a{word-spacing:-12.433067pt;}\n.ws77{word-spacing:-12.310400pt;}\n.ws4d{word-spacing:-12.289067pt;}\n.ws17{word-spacing:-12.283733pt;}\n.ws27{word-spacing:-12.278400pt;}\n.ws5e{word-spacing:-12.267733pt;}\n.ws13{word-spacing:-12.256213pt;}\n.ws2c{word-spacing:-12.218667pt;}\n.ws74{word-spacing:-12.198933pt;}\n.ws5{word-spacing:-12.160000pt;}\n.ws86{word-spacing:-12.137600pt;}\n.ws46{word-spacing:-12.128000pt;}\n.ws48{word-spacing:-12.125333pt;}\n.ws31{word-spacing:-12.025600pt;}\n.ws37{word-spacing:-12.024533pt;}\n.ws15{word-spacing:-12.010667pt;}\n.ws1f{word-spacing:-12.003733pt;}\n.ws55{word-spacing:-11.990827pt;}\n.ws19{word-spacing:-11.973867pt;}\n.ws24{word-spacing:-11.971200pt;}\n.ws79{word-spacing:-11.965333pt;}\n.ws1a{word-spacing:-11.961067pt;}\n.ws71{word-spacing:-11.942933pt;}\n.ws7e{word-spacing:-11.940267pt;}\n.ws54{word-spacing:-11.930667pt;}\n.ws75{word-spacing:-11.930133pt;}\n.ws52{word-spacing:-11.913067pt;}\n.ws22{word-spacing:-11.909867pt;}\n.ws70{word-spacing:-11.897600pt;}\n.ws3d{word-spacing:-11.894400pt;}\n.ws3f{word-spacing:-11.893760pt;}\n.ws6a{word-spacing:-11.887467pt;}\n.ws1e{word-spacing:-11.884800pt;}\n.ws39{word-spacing:-11.874667pt;}\n.ws51{word-spacing:-11.872533pt;}\n.ws47{word-spacing:-11.869867pt;}\n.ws64{word-spacing:-11.862827pt;}\n.ws18{word-spacing:-11.859733pt;}\n.ws6d{word-spacing:-11.857067pt;}\n.ws5d{word-spacing:-11.826133pt;}\n.ws5a{word-spacing:-11.818667pt;}\n.ws81{word-spacing:-11.811200pt;}\n.ws21{word-spacing:-11.804267pt;}\n.ws6b{word-spacing:-11.801600pt;}\n.ws33{word-spacing:-11.794133pt;}\n.ws57{word-spacing:-11.769600pt;}\n.ws53{word-spacing:-11.755733pt;}\n.ws32{word-spacing:-11.720960pt;}\n.ws3e{word-spacing:-11.714560pt;}\n.ws26{word-spacing:-11.697920pt;}\n.ws14{word-spacing:-11.686400pt;}\n.ws69{word-spacing:-11.685120pt;}\n.ws56{word-spacing:-11.664373pt;}\n.ws65{word-spacing:-11.655360pt;}\n.ws41{word-spacing:-11.654400pt;}\n.ws4c{word-spacing:-11.650560pt;}\n.ws30{word-spacing:-11.646720pt;}\n.ws16{word-spacing:-11.644800pt;}\n.ws7b{word-spacing:-11.644160pt;}\n.ws20{word-spacing:-11.639680pt;}\n.ws2f{word-spacing:-11.639040pt;}\n.ws29{word-spacing:-11.629333pt;}\n.ws45{word-spacing:-11.624533pt;}\n.ws6f{word-spacing:-11.619733pt;}\n.ws82{word-spacing:-11.609067pt;}\n.ws7d{word-spacing:-11.590933pt;}\n.ws63{word-spacing:-11.578667pt;}\n.ws73{word-spacing:-11.558933pt;}\n.ws36{word-spacing:-11.546133pt;}\n.ws85{word-spacing:-11.541333pt;}\n.ws76{word-spacing:-11.497600pt;}\n.ws42{word-spacing:-11.488000pt;}\n.ws3a{word-spacing:-11.485333pt;}\n.ws68{word-spacing:-11.454933pt;}\n.ws40{word-spacing:-11.445333pt;}\n.ws25{word-spacing:-11.434667pt;}\n.ws5f{word-spacing:-11.429867pt;}\n.ws44{word-spacing:-11.420267pt;}\n.ws23{word-spacing:-11.419733pt;}\n.ws1c{word-spacing:-11.363733pt;}\n.ws59{word-spacing:-11.362667pt;}\n.ws66{word-spacing:-11.329493pt;}\n.ws3c{word-spacing:-11.290667pt;}\n.ws34{word-spacing:-11.269867pt;}\n.ws3b{word-spacing:-11.254400pt;}\n.ws49{word-spacing:-11.234667pt;}\n.ws5b{word-spacing:-11.178667pt;}\n.ws67{word-spacing:-11.057067pt;}\n.ws78{word-spacing:-10.961067pt;}\n.ws4{word-spacing:-10.848000pt;}\n.wsb{word-spacing:-10.816000pt;}\n.ws7{word-spacing:-10.800000pt;}\n.ws4a{word-spacing:-10.731733pt;}\n.wsc{word-spacing:-10.672000pt;}\n.ws60{word-spacing:-10.662400pt;}\n.ws87{word-spacing:-10.603733pt;}\n.ws4f{word-spacing:-10.593067pt;}\n.ws50{word-spacing:-10.587733pt;}\n.ws3{word-spacing:-10.560000pt;}\n.ws83{word-spacing:-10.529067pt;}\n.ws6c{word-spacing:-10.523733pt;}\n.ws28{word-spacing:-10.513067pt;}\n.ws2b{word-spacing:-10.417067pt;}\n.ws80{word-spacing:-10.395733pt;}\n.wsf{word-spacing:-10.368000pt;}\n.ws7a{word-spacing:-10.363733pt;}\n.wse{word-spacing:-10.352000pt;}\n.ws43{word-spacing:-10.347733pt;}\n.ws5c{word-spacing:-10.343893pt;}\n.ws4e{word-spacing:-10.342400pt;}\n.ws6e{word-spacing:-10.326400pt;}\n.ws72{word-spacing:-10.278400pt;}\n.ws2e{word-spacing:-10.267733pt;}\n.ws8{word-spacing:-10.160000pt;}\n.ws61{word-spacing:-10.150400pt;}\n.ws7c{word-spacing:-10.123733pt;}\n.ws38{word-spacing:-10.013227pt;}\n.ws6{word-spacing:-9.552000pt;}\n.ws10{word-spacing:-9.536000pt;}\n.ws12{word-spacing:-9.376000pt;}\n.wsa{word-spacing:-9.152000pt;}\n.ws11{word-spacing:-9.104000pt;}\n.wsd{word-spacing:-8.928000pt;}\n.ws9{word-spacing:-8.912000pt;}\n.ws2{word-spacing:0.000000pt;}\n._8{margin-left:-12.561067pt;}\n._3{margin-left:-10.961067pt;}\n._5{margin-left:-9.441067pt;}\n._6{margin-left:-8.074667pt;}\n._7{margin-left:-6.491733pt;}\n._0{margin-left:-4.980480pt;}\n._4{margin-left:-3.557120pt;}\n._2{margin-left:-2.146133pt;}\n._1{width:1.368747pt;}\n._9{width:2.703147pt;}\n._a{width:5.388160pt;}\n._b{width:8.059733pt;}\n._e{width:9.688320pt;}\n._11{width:16.605653pt;}\n._19{width:147.804373pt;}\n._1a{width:167.519573pt;}\n._14{width:172.292693pt;}\n._15{width:176.595413pt;}\n._12{width:189.662933pt;}\n._16{width:208.148693pt;}\n._18{width:222.119253pt;}\n._10{width:234.952960pt;}\n._13{width:260.503680pt;}\n._f{width:282.176640pt;}\n._d{width:297.388587pt;}\n._17{width:314.715947pt;}\n._c{width:426.542933pt;}\n._1c{width:795.556267pt;}\n._24{width:908.414933pt;}\n._1f{width:986.713813pt;}\n._1b{width:1016.227200pt;}\n._22{width:1064.141440pt;}\n._20{width:1074.977920pt;}\n._21{width:1079.546240pt;}\n._23{width:1084.061440pt;}\n._1d{width:1096.544640pt;}\n._1e{width:1218.752427pt;}\n.fs8{font-size:5.120000pt;}\n.fsb{font-size:18.560000pt;}\n.fsc{font-size:21.120000pt;}\n.fsa{font-size:37.120000pt;}\n.fs4{font-size:48.000000pt;}\n.fs6{font-size:50.560000pt;}\n.fs2{font-size:53.120000pt;}\n.fs9{font-size:53.248000pt;}\n.fs3{font-size:58.880000pt;}\n.fs5{font-size:64.000000pt;}\n.fs7{font-size:96.000000pt;}\n.fs0{font-size:149.120000pt;}\n.fs1{font-size:256.000000pt;}\n.y0{bottom:-0.666667pt;}\n.y1bd{bottom:-0.160080pt;}\n.y1{bottom:0.000000pt;}\n.y311{bottom:2.746667pt;}\n.y3ea{bottom:2.853333pt;}\n.y6c0{bottom:2.880000pt;}\n.y906{bottom:2.906667pt;}\n.y3c2{bottom:2.946667pt;}\n.y36f{bottom:2.973333pt;}\n.y85e{bottom:3.013333pt;}\n.y5aa{bottom:3.066667pt;}\n.y275{bottom:3.072000pt;}\n.y703{bottom:3.106667pt;}\n.y69a{bottom:3.133333pt;}\n.y767{bottom:3.200000pt;}\n.y6b3{bottom:3.266667pt;}\n.y612{bottom:3.333333pt;}\n.y2eb{bottom:3.392000pt;}\n.y866{bottom:3.453333pt;}\n.y2e4{bottom:3.546667pt;}\n.y872{bottom:3.586667pt;}\n.y51a{bottom:3.653333pt;}\n.y868{bottom:3.773333pt;}\n.y60b{bottom:3.973333pt;}\n.y102{bottom:4.000000pt;}\n.y777{bottom:4.093333pt;}\n.y398{bottom:4.186667pt;}\n.y6b8{bottom:4.226667pt;}\n.y733{bottom:4.346667pt;}\n.y897{bottom:4.413333pt;}\n.y39d{bottom:4.512000pt;}\n.y53c{bottom:4.546667pt;}\n.y83b{bottom:5.413333pt;}\n.y91d{bottom:5.440000pt;}\n.y2bb{bottom:5.533333pt;}\n.y6e{bottom:14.240000pt;}\n.y40{bottom:16.640000pt;}\n.yee{bottom:17.120000pt;}\n.y709{bottom:18.106667pt;}\n.y965{bottom:18.400000pt;}\n.y6bf{bottom:18.432000pt;}\n.y6b1{bottom:18.493333pt;}\n.y51d{bottom:18.533333pt;}\n.y727{bottom:18.626667pt;}\n.y765{bottom:19.200000pt;}\n.y2ed{bottom:19.226667pt;}\n.y699{bottom:19.293333pt;}\n.y85d{bottom:19.333333pt;}\n.y876{bottom:19.586667pt;}\n.y871{bottom:19.746667pt;}\n.y611{bottom:19.813333pt;}\n.y732{bottom:19.866667pt;}\n.y865{bottom:19.933333pt;}\n.y519{bottom:19.973333pt;}\n.y2e3{bottom:20.026667pt;}\n.y60a{bottom:20.133333pt;}\n.y775{bottom:20.253333pt;}\n.y397{bottom:20.346667pt;}\n.y274{bottom:21.946667pt;}\n.y30f{bottom:33.306667pt;}\n.y3e8{bottom:33.413333pt;}\n.y5a8{bottom:33.506667pt;}\n.y71f{bottom:33.533333pt;}\n.y891{bottom:33.893333pt;}\n.y904{bottom:34.106667pt;}\n.y3c0{bottom:34.146667pt;}\n.y36d{bottom:34.173333pt;}\n.y964{bottom:34.240000pt;}\n.y5e3{bottom:34.266667pt;}\n.y74d{bottom:34.333333pt;}\n.y726{bottom:34.626667pt;}\n.y6b6{bottom:34.786667pt;}\n.y6b0{bottom:34.813333pt;}\n.y764{bottom:34.880000pt;}\n.y51c{bottom:35.040000pt;}\n.y53a{bottom:35.106667pt;}\n.y697{bottom:35.293333pt;}\n.y2ea{bottom:35.546667pt;}\n.y895{bottom:35.613333pt;}\n.y85b{bottom:35.653333pt;}\n.y731{bottom:35.706667pt;}\n.y867{bottom:35.773333pt;}\n.y870{bottom:35.906667pt;}\n.y773{bottom:36.093333pt;}\n.y610{bottom:36.133333pt;}\n.y518{bottom:36.160000pt;}\n.y2e2{bottom:36.186667pt;}\n.y875{bottom:36.226667pt;}\n.y864{bottom:36.253333pt;}\n.y609{bottom:36.453333pt;}\n.y396{bottom:36.666667pt;}\n.y6d{bottom:37.440000pt;}\n.y89{bottom:37.600000pt;}\n.ybb{bottom:38.240000pt;}\n.y8bc{bottom:39.040000pt;}\n.y3f{bottom:40.640000pt;}\n.yed{bottom:41.120000pt;}\n.y708{bottom:49.946667pt;}\n.y74c{bottom:50.493333pt;}\n.y701{bottom:50.786667pt;}\n.y51b{bottom:51.520000pt;}\n.y772{bottom:51.653333pt;}\n.y874{bottom:51.746667pt;}\n.y86f{bottom:52.226667pt;}\n.y60f{bottom:52.293333pt;}\n.y517{bottom:52.320000pt;}\n.y2e1{bottom:52.346667pt;}\n.y608{bottom:52.613333pt;}\n.y863{bottom:52.733333pt;}\n.y395{bottom:52.826667pt;}\n.y8bb{bottom:57.600000pt;}\n.y272{bottom:57.946667pt;}\n.y838{bottom:60.160000pt;}\n.y2b8{bottom:60.253333pt;}\n.y88{bottom:60.800000pt;}\n.yba{bottom:61.440000pt;}\n.y6c{bottom:61.600000pt;}\n.y3e{bottom:63.840000pt;}\n.y101{bottom:64.480000pt;}\n.y8ff{bottom:64.960000pt;}\n.y71d{bottom:65.053333pt;}\n.y91c{bottom:65.306667pt;}\n.y725{bottom:65.346667pt;}\n.y86b{bottom:65.373333pt;}\n.y23e{bottom:65.600000pt;}\n.y6b5{bottom:66.306667pt;}\n.y696{bottom:66.333333pt;}\n.y6a0{bottom:66.400000pt;}\n.y72f{bottom:66.426667pt;}\n.y771{bottom:67.653333pt;}\n.y2e8{bottom:67.706667pt;}\n.y86e{bottom:67.746667pt;}\n.y7c6{bottom:67.840000pt;}\n.y516{bottom:68.000000pt;}\n.y2e0{bottom:68.546667pt;}\n.y60e{bottom:68.613333pt;}\n.y607{bottom:68.933333pt;}\n.y394{bottom:69.026667pt;}\n.y2d9{bottom:69.760000pt;}\n.y382{bottom:69.920000pt;}\n.y5da{bottom:70.080000pt;}\n.y4aa{bottom:70.240000pt;}\n.y1e1{bottom:70.400000pt;}\n.y220{bottom:70.560000pt;}\n.y23d{bottom:70.720000pt;}\n.y4b2{bottom:70.880000pt;}\n.y271{bottom:76.346667pt;}\n.y2b6{bottom:78.013333pt;}\n.y836{bottom:78.560000pt;}\n.y902{bottom:80.506667pt;}\n.y3e6{bottom:80.613333pt;}\n.y5e1{bottom:80.666667pt;}\n.y5a6{bottom:80.706667pt;}\n.y91b{bottom:80.826667pt;}\n.y724{bottom:80.866667pt;}\n.y71c{bottom:80.893333pt;}\n.y3f5{bottom:81.146667pt;}\n.y30d{bottom:81.186667pt;}\n.y36b{bottom:81.373333pt;}\n.y700{bottom:81.506667pt;}\n.y74b{bottom:81.853333pt;}\n.y3be{bottom:82.013333pt;}\n.y72e{bottom:82.106667pt;}\n.y538{bottom:82.306667pt;}\n.y894{bottom:82.853333pt;}\n.y39b{bottom:83.386667pt;}\n.y862{bottom:84.293333pt;}\n.y60d{bottom:84.773333pt;}\n.y6b{bottom:84.800000pt;}\n.y606{bottom:85.093333pt;}\n.y393{bottom:85.346667pt;}\n.y8e4{bottom:85.920000pt;}\n.y12{bottom:86.400000pt;}\n.y7c5{bottom:86.880000pt;}\n.y879{bottom:87.040000pt;}\n.y43e{bottom:87.200000pt;}\n.y164{bottom:87.360000pt;}\n.y3d{bottom:87.840000pt;}\n.y8ba{bottom:88.320000pt;}\n.y556{bottom:88.480000pt;}\n.y5b7{bottom:88.640000pt;}\n.y2a4{bottom:88.800000pt;}\n.y2d8{bottom:88.960000pt;}\n.y749{bottom:89.280000pt;}\n.y833{bottom:90.880000pt;}\n.y18f{bottom:91.200000pt;}\n.y270{bottom:92.026667pt;}\n.y69f{bottom:92.480000pt;}\n.y620{bottom:92.640000pt;}\n.y617{bottom:92.800000pt;}\n.y381{bottom:92.960000pt;}\n.y5d9{bottom:93.120000pt;}\n.y575{bottom:93.280000pt;}\n.y1e0{bottom:93.440000pt;}\n.y21f{bottom:93.600000pt;}\n.y23c{bottom:93.760000pt;}\n.y4b1{bottom:93.920000pt;}\n.y369{bottom:94.400000pt;}\n.y3e4{bottom:94.560000pt;}\n.y5df{bottom:94.880000pt;}\n.y6e8{bottom:95.040000pt;}\n.y2b5{bottom:96.253333pt;}\n.y86a{bottom:96.573333pt;}\n.y859{bottom:96.800000pt;}\n.y723{bottom:96.893333pt;}\n.y835{bottom:96.960000pt;}\n.y6ff{bottom:97.026667pt;}\n.y259{bottom:97.120000pt;}\n.y919{bottom:97.146667pt;}\n.y694{bottom:97.573333pt;}\n.y8b2{bottom:98.080000pt;}\n.y536{bottom:98.146667pt;}\n.y66f{bottom:98.240000pt;}\n.y2e7{bottom:98.266667pt;}\n.y849{bottom:98.653333pt;}\n.y770{bottom:98.693333pt;}\n.y4a9{bottom:98.720000pt;}\n.y847{bottom:99.360000pt;}\n.y718{bottom:99.520000pt;}\n.y388{bottom:99.680000pt;}\n.y60c{bottom:100.453333pt;}\n.y602{bottom:100.640000pt;}\n.y7dd{bottom:100.800000pt;}\n.y81d{bottom:101.120000pt;}\n.y605{bottom:101.253333pt;}\n.y392{bottom:101.506667pt;}\n.y8ee{bottom:101.760000pt;}\n.y5d3{bottom:102.080000pt;}\n.y7c4{bottom:102.880000pt;}\n.y763{bottom:103.040000pt;}\n.y30b{bottom:103.520000pt;}\n.y11{bottom:103.840000pt;}\n.y633{bottom:104.000000pt;}\n.y4f3{bottom:104.320000pt;}\n.y2a3{bottom:104.480000pt;}\n.y748{bottom:104.960000pt;}\n.y47a{bottom:105.120000pt;}\n.y163{bottom:105.280000pt;}\n.y459{bottom:105.440000pt;}\n.y8fe{bottom:106.400000pt;}\n.y563{bottom:106.560000pt;}\n.y18e{bottom:106.720000pt;}\n.y34e{bottom:107.520000pt;}\n.y3bc{bottom:107.680000pt;}\n.y26f{bottom:107.866667pt;}\n.y6a{bottom:108.000000pt;}\n.y3c{bottom:108.160000pt;}\n.y616{bottom:108.320000pt;}\n.y8e9{bottom:108.480000pt;}\n.y98{bottom:108.800000pt;}\n.y574{bottom:108.960000pt;}\n.y1df{bottom:109.120000pt;}\n.y447{bottom:109.280000pt;}\n.y23b{bottom:109.440000pt;}\n.y39a{bottom:109.626667pt;}\n.y7d5{bottom:109.760000pt;}\n.y893{bottom:109.893333pt;}\n.y368{bottom:110.080000pt;}\n.y330{bottom:110.240000pt;}\n.y6be{bottom:110.720000pt;}\n.y3f3{bottom:112.480000pt;}\n.y258{bottom:112.640000pt;}\n.y5de{bottom:112.800000pt;}\n.y6fd{bottom:113.026667pt;}\n.y8b1{bottom:113.760000pt;}\n.y535{bottom:113.826667pt;}\n.y6ae{bottom:114.240000pt;}\n.y1bc{bottom:114.720000pt;}\n.y846{bottom:115.040000pt;}\n.y717{bottom:115.200000pt;}\n.y682{bottom:115.360000pt;}\n.y7a9{bottom:116.320000pt;}\n.y793{bottom:116.480000pt;}\n.y2e6{bottom:116.506667pt;}\n.y8e3{bottom:116.640000pt;}\n.y81c{bottom:116.800000pt;}\n.y604{bottom:117.413333pt;}\n.y391{bottom:117.666667pt;}\n.y7fb{bottom:117.760000pt;}\n.y547{bottom:118.080000pt;}\n.y7dc{bottom:118.720000pt;}\n.y932{bottom:119.360000pt;}\n.y2d7{bottom:119.520000pt;}\n.y632{bottom:119.680000pt;}\n.y5b6{bottom:119.872000pt;}\n.y13c{bottom:120.032000pt;}\n.y8b9{bottom:120.192000pt;}\n.y2a2{bottom:120.352000pt;}\n.y71a{bottom:120.733333pt;}\n.y747{bottom:120.832000pt;}\n.y832{bottom:122.432000pt;}\n.y18d{bottom:123.232000pt;}\n.y380{bottom:124.032000pt;}\n.y5d8{bottom:124.192000pt;}\n.y74f{bottom:124.352000pt;}\n.y61f{bottom:124.512000pt;}\n.y69d{bottom:124.672000pt;}\n.y573{bottom:124.832000pt;}\n.y1de{bottom:124.992000pt;}\n.y21e{bottom:125.152000pt;}\n.y23a{bottom:125.312000pt;}\n.y25a{bottom:125.760000pt;}\n.y651{bottom:125.792000pt;}\n.y32f{bottom:125.952000pt;}\n.y40d{bottom:126.112000pt;}\n.y900{bottom:126.272000pt;}\n.y399{bottom:126.400000pt;}\n.y3e3{bottom:126.432000pt;}\n.y6e7{bottom:126.592000pt;}\n.y2ec{bottom:127.040000pt;}\n.y2e5{bottom:127.200000pt;}\n.y858{bottom:127.392000pt;}\n.y2b4{bottom:127.453333pt;}\n.y917{bottom:127.706667pt;}\n.y692{bottom:128.613333pt;}\n.y8b0{bottom:129.632000pt;}\n.y72d{bottom:129.666667pt;}\n.y533{bottom:129.693333pt;}\n.y4a8{bottom:129.792000pt;}\n.y76e{bottom:129.893333pt;}\n.y942{bottom:130.112000pt;}\n.y1bb{bottom:130.432000pt;}\n.y66e{bottom:130.592000pt;}\n.y845{bottom:130.912000pt;}\n.y716{bottom:131.072000pt;}\n.ya8{bottom:131.232000pt;}\n.y87{bottom:131.392000pt;}\n.y3b{bottom:131.552000pt;}\n.yb9{bottom:132.032000pt;}\n.y69{bottom:132.192000pt;}\n.y8e2{bottom:132.352000pt;}\n.y81b{bottom:132.512000pt;}\n.y601{bottom:132.672000pt;}\n.y5d2{bottom:133.152000pt;}\n.y7fa{bottom:133.466667pt;}\n.y7c3{bottom:133.626667pt;}\n.y762{bottom:133.946667pt;}\n.y390{bottom:133.986667pt;}\n.y7db{bottom:134.266667pt;}\n.y10{bottom:134.906667pt;}\n.y30a{bottom:135.066667pt;}\n.y7b7{bottom:135.226667pt;}\n.y5b5{bottom:135.546667pt;}\n.y479{bottom:135.866667pt;}\n.y514{bottom:136.346667pt;}\n.y162{bottom:136.506667pt;}\n.y458{bottom:136.666667pt;}\n.y8fd{bottom:137.146667pt;}\n.y562{bottom:137.306667pt;}\n.y43d{bottom:137.466667pt;}\n.y13b{bottom:137.626667pt;}\n.y257{bottom:137.786667pt;}\n.y26d{bottom:138.586667pt;}\n.y3bb{bottom:138.906667pt;}\n.y34d{bottom:139.066667pt;}\n.y706{bottom:139.226667pt;}\n.y5a4{bottom:139.386667pt;}\n.y962{bottom:139.706667pt;}\n.y955{bottom:139.866667pt;}\n.y367{bottom:141.626667pt;}\n.y2b3{bottom:143.173333pt;}\n.y3f2{bottom:143.226667pt;}\n.y42e{bottom:143.706667pt;}\n.y5dd{bottom:144.026667pt;}\n.y691{bottom:144.133333pt;}\n.y6fc{bottom:144.226667pt;}\n.y6ad{bottom:145.306667pt;}\n.y532{bottom:145.373333pt;}\n.y941{bottom:145.786667pt;}\n.y66d{bottom:146.106667pt;}\n.y1ba{bottom:146.266667pt;}\n.y681{bottom:146.426667pt;}\n.y715{bottom:146.746667pt;}\n.y861{bottom:146.853333pt;}\n.y6bd{bottom:147.706667pt;}\n.y7a8{bottom:147.866667pt;}\n.y8e1{bottom:148.186667pt;}\n.y792{bottom:148.346667pt;}\n.y5d1{bottom:148.826667pt;}\n.y7c2{bottom:149.306667pt;}\n.y38f{bottom:150.146667pt;}\n.y7da{bottom:150.266667pt;}\n.y583{bottom:150.586667pt;}\n.y4f2{bottom:150.746667pt;}\n.y2a1{bottom:151.066667pt;}\n.y631{bottom:151.386667pt;}\n.y478{bottom:151.546667pt;}\n.y5b4{bottom:151.706667pt;}\n.y7f9{bottom:151.866667pt;}\n.y161{bottom:152.186667pt;}\n.y457{bottom:152.346667pt;}\n.yf3{bottom:152.506667pt;}\n.y650{bottom:152.826667pt;}\n.y561{bottom:152.986667pt;}\n.y931{bottom:153.146667pt;}\n.y256{bottom:153.466667pt;}\n.y18c{bottom:153.946667pt;}\n.y26c{bottom:154.266667pt;}\n.y3ba{bottom:154.426667pt;}\n.y3a{bottom:154.746667pt;}\n.y50a{bottom:154.906667pt;}\n.y8e8{bottom:155.066667pt;}\n.ya7{bottom:155.226667pt;}\n.y68{bottom:155.386667pt;}\n.y1dd{bottom:155.546667pt;}\n.y69c{bottom:155.706667pt;}\n.y21d{bottom:155.866667pt;}\n.y1ff{bottom:156.026667pt;}\n.y4b4{bottom:156.186667pt;}\n.y13a{bottom:156.346667pt;}\n.y4b0{bottom:156.506667pt;}\n.y32e{bottom:156.826667pt;}\n.y34c{bottom:157.146667pt;}\n.y6e6{bottom:157.306667pt;}\n.y366{bottom:157.466667pt;}\n.y3e2{bottom:157.626667pt;}\n.y3f1{bottom:158.906667pt;}\n.y2b1{bottom:159.013333pt;}\n.y42d{bottom:159.386667pt;}\n.y5dc{bottom:159.706667pt;}\n.y8af{bottom:160.346667pt;}\n.y72b{bottom:160.706667pt;}\n.y76c{bottom:160.933333pt;}\n.y530{bottom:161.213333pt;}\n.y4a7{bottom:161.306667pt;}\n.y844{bottom:161.626667pt;}\n.y1b9{bottom:161.946667pt;}\n.y66c{bottom:162.106667pt;}\n.y714{bottom:162.586667pt;}\n.y600{bottom:163.706667pt;}\n.y8e0{bottom:163.866667pt;}\n.y81a{bottom:164.186667pt;}\n.y5d0{bottom:165.146667pt;}\n.y761{bottom:165.466667pt;}\n.y273{bottom:165.626667pt;}\n.yf{bottom:165.946667pt;}\n.y7b6{bottom:166.266667pt;}\n.y38e{bottom:166.306667pt;}\n.y309{bottom:166.586667pt;}\n.y2a0{bottom:166.746667pt;}\n.y8b8{bottom:167.066667pt;}\n.y513{bottom:167.226667pt;}\n.y477{bottom:167.386667pt;}\n.y160{bottom:168.026667pt;}\n.y456{bottom:168.186667pt;}\n.y43c{bottom:168.506667pt;}\n.y546{bottom:168.666667pt;}\n.y560{bottom:168.826667pt;}\n.y56e{bottom:168.986667pt;}\n.y255{bottom:169.146667pt;}\n.y18b{bottom:169.626667pt;}\n.y3b9{bottom:170.266667pt;}\n.y5a3{bottom:170.426667pt;}\n.y8e7{bottom:170.746667pt;}\n.y37f{bottom:170.906667pt;}\n.y59b{bottom:171.066667pt;}\n.y77a{bottom:171.226667pt;}\n.y21c{bottom:171.546667pt;}\n.y6bc{bottom:171.706667pt;}\n.y7d4{bottom:172.346667pt;}\n.y32d{bottom:172.506667pt;}\n.y5e0{bottom:172.800000pt;}\n.y6e5{bottom:172.986667pt;}\n.y365{bottom:173.146667pt;}\n.y3e1{bottom:173.306667pt;}\n.y139{bottom:174.426667pt;}\n.y857{bottom:174.586667pt;}\n.y2b0{bottom:174.693333pt;}\n.y3f0{bottom:174.746667pt;}\n.yf2{bottom:175.706667pt;}\n.y42c{bottom:175.866667pt;}\n.y6fa{bottom:175.906667pt;}\n.y6ac{bottom:176.346667pt;}\n.y76b{bottom:176.613333pt;}\n.y680{bottom:177.466667pt;}\n.y1b8{bottom:177.786667pt;}\n.y860{bottom:178.053333pt;}\n.y713{bottom:178.266667pt;}\n.y86{bottom:178.586667pt;}\n.y39{bottom:178.746667pt;}\n.y97{bottom:179.226667pt;}\n.y67{bottom:179.386667pt;}\n.y791{bottom:179.546667pt;}\n.y7a7{bottom:179.706667pt;}\n.y7c1{bottom:180.826667pt;}\n.y760{bottom:181.306667pt;}\n.y582{bottom:181.786667pt;}\n.y555{bottom:181.946667pt;}\n.y4f1{bottom:182.266667pt;}\n.y29f{bottom:182.586667pt;}\n.y38d{bottom:182.626667pt;}\n.y630{bottom:182.746667pt;}\n.y5b3{bottom:182.906667pt;}\n.y476{bottom:183.066667pt;}\n.y746{bottom:183.386667pt;}\n.y308{bottom:183.866667pt;}\n.y8fc{bottom:184.346667pt;}\n.y55f{bottom:184.506667pt;}\n.y254{bottom:184.666667pt;}\n.y91a{bottom:184.986667pt;}\n.y18a{bottom:185.466667pt;}\n.y26a{bottom:185.786667pt;}\n.y3b8{bottom:185.946667pt;}\n.y705{bottom:186.106667pt;}\n.y878{bottom:186.266667pt;}\n.y901{bottom:186.400000pt;}\n.y61e{bottom:186.586667pt;}\n.y37e{bottom:186.746667pt;}\n.y1dc{bottom:186.906667pt;}\n.y1fe{bottom:187.066667pt;}\n.y44b{bottom:187.226667pt;}\n.y21b{bottom:187.386667pt;}\n.y4af{bottom:187.546667pt;}\n.y7d3{bottom:188.026667pt;}\n.y32c{bottom:188.186667pt;}\n.y4d0{bottom:188.346667pt;}\n.y6e4{bottom:188.826667pt;}\n.y364{bottom:188.986667pt;}\n.y3e0{bottom:189.146667pt;}\n.y856{bottom:190.426667pt;}\n.y8ae{bottom:191.386667pt;}\n.y42b{bottom:191.546667pt;}\n.y6f9{bottom:191.586667pt;}\n.y72a{bottom:191.906667pt;}\n.y4a6{bottom:192.826667pt;}\n.y76a{bottom:192.933333pt;}\n.y915{bottom:192.986667pt;}\n.y67f{bottom:193.146667pt;}\n.y138{bottom:193.306667pt;}\n.y39c{bottom:193.466667pt;}\n.y5ff{bottom:194.746667pt;}\n.y2e9{bottom:194.906667pt;}\n.y68e{bottom:195.013333pt;}\n.y7a6{bottom:195.386667pt;}\n.y8ed{bottom:195.706667pt;}\n.y7c0{bottom:196.666667pt;}\n.y5cf{bottom:196.986667pt;}\n.ye{bottom:197.146667pt;}\n.y88f{bottom:197.786667pt;}\n.y4f0{bottom:198.106667pt;}\n.y29e{bottom:198.266667pt;}\n.y62f{bottom:198.586667pt;}\n.y512{bottom:198.746667pt;}\n.y38c{bottom:198.786667pt;}\n.y475{bottom:198.906667pt;}\n.y15f{bottom:199.386667pt;}\n.y64f{bottom:199.546667pt;}\n.y66{bottom:199.706667pt;}\n.y545{bottom:199.866667pt;}\n.y7d9{bottom:200.026667pt;}\n.y8fb{bottom:200.186667pt;}\n.y253{bottom:200.346667pt;}\n.y56d{bottom:200.506667pt;}\n.y5a2{bottom:201.626667pt;}\n.y85{bottom:201.786667pt;}\n.y3b7{bottom:201.946667pt;}\n.y38{bottom:202.106667pt;}\n.y6bb{bottom:202.266667pt;}\n.y37d{bottom:202.426667pt;}\n.y96{bottom:202.586667pt;}\n.y22f{bottom:202.746667pt;}\n.y1fd{bottom:202.906667pt;}\n.y21a{bottom:203.066667pt;}\n.y4ae{bottom:203.226667pt;}\n.y3f4{bottom:203.680000pt;}\n.y40c{bottom:203.866667pt;}\n.y189{bottom:204.186667pt;}\n.y32b{bottom:204.506667pt;}\n.y363{bottom:204.666667pt;}\n.y3df{bottom:204.826667pt;}\n.y2ae{bottom:206.213333pt;}\n.y5e4{bottom:207.066667pt;}\n.y42a{bottom:207.226667pt;}\n.y6ab{bottom:208.186667pt;}\n.y66b{bottom:208.506667pt;}\n.y67e{bottom:208.986667pt;}\n.y1b7{bottom:209.306667pt;}\n.y8df{bottom:210.426667pt;}\n.y819{bottom:210.586667pt;}\n.y790{bottom:210.746667pt;}\n.y843{bottom:210.906667pt;}\n.y137{bottom:211.066667pt;}\n.y7a5{bottom:211.706667pt;}\n.y581{bottom:212.826667pt;}\n.y68d{bottom:213.413333pt;}\n.y8b7{bottom:213.626667pt;}\n.y8ec{bottom:213.786667pt;}\n.y5b2{bottom:213.946667pt;}\n.y29d{bottom:214.106667pt;}\n.y745{bottom:214.266667pt;}\n.y7f8{bottom:214.586667pt;}\n.y307{bottom:214.906667pt;}\n.y38b{bottom:214.946667pt;}\n.y62e{bottom:215.066667pt;}\n.y707{bottom:215.200000pt;}\n.y954{bottom:215.226667pt;}\n.y64e{bottom:215.386667pt;}\n.y918{bottom:215.546667pt;}\n.y831{bottom:215.706667pt;}\n.y252{bottom:216.026667pt;}\n.y509{bottom:217.146667pt;}\n.y268{bottom:217.306667pt;}\n.y59a{bottom:217.466667pt;}\n.y61d{bottom:217.786667pt;}\n.y554{bottom:217.946667pt;}\n.y1db{bottom:218.106667pt;}\n.y37c{bottom:218.266667pt;}\n.y455{bottom:218.426667pt;}\n.y22e{bottom:218.586667pt;}\n.y1fc{bottom:218.746667pt;}\n.y219{bottom:218.906667pt;}\n.y4ad{bottom:219.066667pt;}\n.y34b{bottom:219.226667pt;}\n.y4cf{bottom:219.706667pt;}\n.y188{bottom:219.866667pt;}\n.y5a1{bottom:220.346667pt;}\n.y905{bottom:220.506667pt;}\n.y362{bottom:220.666667pt;}\n.y729{bottom:221.440000pt;}\n.y855{bottom:221.626667pt;}\n.y65{bottom:222.906667pt;}\n.y52e{bottom:222.973333pt;}\n.y8ad{bottom:223.386667pt;}\n.y4a5{bottom:223.866667pt;}\n.y66a{bottom:224.346667pt;}\n.yd{bottom:224.666667pt;}\n.y37{bottom:225.306667pt;}\n.y95{bottom:225.786667pt;}\n.y84{bottom:225.946667pt;}\n.y8de{bottom:226.106667pt;}\n.y818{bottom:226.426667pt;}\n.yfa{bottom:226.586667pt;}\n.y7a4{bottom:227.386667pt;}\n.y75f{bottom:227.866667pt;}\n.y5ce{bottom:228.186667pt;}\n.y580{bottom:228.346667pt;}\n.y136{bottom:228.826667pt;}\n.y842{bottom:228.986667pt;}\n.y4ef{bottom:229.466667pt;}\n.y29c{bottom:229.786667pt;}\n.y744{bottom:230.106667pt;}\n.y15e{bottom:230.266667pt;}\n.y544{bottom:230.906667pt;}\n.y40b{bottom:231.066667pt;}\n.y7d8{bottom:231.226667pt;}\n.y830{bottom:231.386667pt;}\n.y38a{bottom:231.426667pt;}\n.y43b{bottom:231.546667pt;}\n.y251{bottom:231.706667pt;}\n.y3b6{bottom:232.666667pt;}\n.y508{bottom:232.826667pt;}\n.y306{bottom:232.986667pt;}\n.y266{bottom:233.186667pt;}\n.y599{bottom:233.306667pt;}\n.y553{bottom:233.466667pt;}\n.y615{bottom:233.626667pt;}\n.y704{bottom:233.786667pt;}\n.y37b{bottom:233.946667pt;}\n.y572{bottom:234.106667pt;}\n.y452{bottom:234.266667pt;}\n.y218{bottom:234.426667pt;}\n.y621{bottom:234.586667pt;}\n.y34a{bottom:234.906667pt;}\n.y32a{bottom:235.226667pt;}\n.y187{bottom:235.706667pt;}\n.y3f7{bottom:236.986667pt;}\n.y5e2{bottom:237.786667pt;}\n.y429{bottom:237.946667pt;}\n.y6f7{bottom:238.173333pt;}\n.y4ce{bottom:238.426667pt;}\n.y52d{bottom:238.653333pt;}\n.y8ac{bottom:239.066667pt;}\n.y6aa{bottom:239.226667pt;}\n.y914{bottom:239.706667pt;}\n.y669{bottom:239.866667pt;}\n.y854{bottom:240.026667pt;}\n.y1b6{bottom:240.346667pt;}\n.y67d{bottom:240.666667pt;}\n.y5fe{bottom:241.466667pt;}\n.y78f{bottom:241.626667pt;}\n.y8dd{bottom:241.946667pt;}\n.y817{bottom:242.106667pt;}\n.y7bf{bottom:243.066667pt;}\n.y7a3{bottom:243.226667pt;}\n.y8b6{bottom:244.346667pt;}\n.y8eb{bottom:244.506667pt;}\n.y2d6{bottom:244.666667pt;}\n.y68b{bottom:244.933333pt;}\n.y5b1{bottom:244.986667pt;}\n.y29b{bottom:245.626667pt;}\n.y15d{bottom:245.946667pt;}\n.yf1{bottom:246.106667pt;}\n.y7f7{bottom:246.266667pt;}\n.y64d{bottom:246.426667pt;}\n.y40a{bottom:246.586667pt;}\n.y55e{bottom:246.746667pt;}\n.yf9{bottom:246.906667pt;}\n.y64{bottom:247.066667pt;}\n.y250{bottom:247.226667pt;}\n.y135{bottom:247.386667pt;}\n.y82f{bottom:247.706667pt;}\n.y3b5{bottom:248.346667pt;}\n.y507{bottom:248.666667pt;}\n.ya6{bottom:248.986667pt;}\n.y83{bottom:249.146667pt;}\n.y36{bottom:249.306667pt;}\n.y5d7{bottom:249.466667pt;}\n.y454{bottom:249.626667pt;}\n.yb8{bottom:249.786667pt;}\n.y94{bottom:249.946667pt;}\n.y1da{bottom:250.106667pt;}\n.y1fb{bottom:250.266667pt;}\n.y217{bottom:250.426667pt;}\n.y4ac{bottom:250.586667pt;}\n.y329{bottom:250.906667pt;}\n.y349{bottom:251.066667pt;}\n.y903{bottom:251.226667pt;}\n.y3de{bottom:251.386667pt;}\n.y5a0{bottom:251.546667pt;}\n.y361{bottom:251.706667pt;}\n.y6e3{bottom:252.026667pt;}\n.y6f6{bottom:253.853333pt;}\n.y4a4{bottom:254.906667pt;}\n.y52b{bottom:254.973333pt;}\n.y913{bottom:255.386667pt;}\n.y668{bottom:256.026667pt;}\n.y4cd{bottom:256.506667pt;}\n.y8dc{bottom:257.626667pt;}\n.y5fd{bottom:257.786667pt;}\n.y816{bottom:257.946667pt;}\n.y75e{bottom:258.906667pt;}\n.y5cd{bottom:259.226667pt;}\n.y4ee{bottom:260.186667pt;}\n.y7b5{bottom:260.346667pt;}\n.y474{bottom:260.986667pt;}\n.y689{bottom:261.093333pt;}\n.y511{bottom:261.306667pt;}\n.y62d{bottom:261.626667pt;}\n.y7a2{bottom:261.946667pt;}\n.y543{bottom:262.106667pt;}\n.y409{bottom:262.266667pt;}\n.y43a{bottom:262.426667pt;}\n.y24f{bottom:262.906667pt;}\n.y7d7{bottom:263.066667pt;}\n.y29a{bottom:263.706667pt;}\n.y265{bottom:263.906667pt;}\n.y305{bottom:264.186667pt;}\n.y26e{bottom:264.346667pt;}\n.y134{bottom:264.986667pt;}\n.y916{bottom:265.146667pt;}\n.y841{bottom:265.306667pt;}\n.y712{bottom:265.626667pt;}\n.y7d2{bottom:266.426667pt;}\n.y186{bottom:266.746667pt;}\n.y3dd{bottom:267.066667pt;}\n.y2ab{bottom:268.453333pt;}\n.y3f6{bottom:268.506667pt;}\n.y428{bottom:269.466667pt;}\n.y6f4{bottom:269.693333pt;}\n.y63{bottom:270.266667pt;}\n.y6a9{bottom:270.426667pt;}\n.y52a{bottom:270.653333pt;}\n.y853{bottom:270.746667pt;}\n.y1b5{bottom:271.386667pt;}\n.y667{bottom:271.706667pt;}\n.yd2{bottom:272.346667pt;}\n.y35{bottom:272.506667pt;}\n.y5db{bottom:272.666667pt;}\n.ya5{bottom:272.986667pt;}\n.y82{bottom:273.146667pt;}\n.y8db{bottom:273.466667pt;}\n.y815{bottom:273.626667pt;}\n.y930{bottom:273.946667pt;}\n.y4ed{bottom:275.866667pt;}\n.y2d5{bottom:276.186667pt;}\n.y8f6{bottom:276.666667pt;}\n.y473{bottom:276.826667pt;}\n.y62c{bottom:277.306667pt;}\n.y408{bottom:277.946667pt;}\n.y8b5{bottom:278.106667pt;}\n.y439{bottom:278.266667pt;}\n.y24e{bottom:278.586667pt;}\n.y82e{bottom:278.746667pt;}\n.y264{bottom:279.586667pt;}\n.y3b4{bottom:279.706667pt;}\n.y506{bottom:280.026667pt;}\n.y8e6{bottom:280.346667pt;}\n.y37a{bottom:280.506667pt;}\n.y451{bottom:280.666667pt;}\n.y542{bottom:280.826667pt;}\n.y1d9{bottom:281.146667pt;}\n.y1fa{bottom:281.306667pt;}\n.y239{bottom:281.466667pt;}\n.y4ab{bottom:281.626667pt;}\n.y389{bottom:281.760000pt;}\n.y348{bottom:282.266667pt;}\n.y328{bottom:282.426667pt;}\n.y360{bottom:282.746667pt;}\n.y3dc{bottom:282.906667pt;}\n.y6e2{bottom:283.226667pt;}\n.y961{bottom:283.706667pt;}\n.y2a9{bottom:284.293333pt;}\n.y6f3{bottom:285.373333pt;}\n.y8ab{bottom:285.626667pt;}\n.y6a8{bottom:286.106667pt;}\n.y4a3{bottom:286.426667pt;}\n.y528{bottom:286.493333pt;}\n.y912{bottom:286.786667pt;}\n.y1b4{bottom:287.066667pt;}\n.y666{bottom:287.386667pt;}\n.y4cc{bottom:287.546667pt;}\n.y730{bottom:287.866667pt;}\n.y2df{bottom:288.320000pt;}\n.y15c{bottom:288.666667pt;}\n.y5fc{bottom:288.826667pt;}\n.y8da{bottom:289.146667pt;}\n.y814{bottom:289.466667pt;}\n.y92f{bottom:289.626667pt;}\n.y5cc{bottom:290.426667pt;}\n.y75d{bottom:290.746667pt;}\n.y88e{bottom:290.906667pt;}\n.y953{bottom:291.066667pt;}\n.y4ec{bottom:291.706667pt;}\n.y7b4{bottom:291.866667pt;}\n.y743{bottom:292.346667pt;}\n.y510{bottom:292.506667pt;}\n.y472{bottom:292.666667pt;}\n.y7a1{bottom:292.986667pt;}\n.y30c{bottom:293.120000pt;}\n.y62b{bottom:293.146667pt;}\n.y62{bottom:293.466667pt;}\n.y407{bottom:293.626667pt;}\n.y8ea{bottom:293.786667pt;}\n.y57f{bottom:293.946667pt;}\n.y24d{bottom:294.106667pt;}\n.yf8{bottom:294.266667pt;}\n.y438{bottom:294.426667pt;}\n.y5b0{bottom:295.066667pt;}\n.y263{bottom:295.426667pt;}\n.y3b3{bottom:295.706667pt;}\n.y26b{bottom:295.866667pt;}\n.y8e5{bottom:296.026667pt;}\n.y379{bottom:296.186667pt;}\n.y93{bottom:296.346667pt;}\n.y34{bottom:296.506667pt;}\n.y216{bottom:296.826667pt;}\n.y711{bottom:296.986667pt;}\n.yb7{bottom:297.146667pt;}\n.y7d1{bottom:297.786667pt;}\n.y185{bottom:297.946667pt;}\n.y327{bottom:298.266667pt;}\n.y35f{bottom:298.426667pt;}\n.y2a8{bottom:299.973333pt;}\n.y427{bottom:300.506667pt;}\n.y59f{bottom:300.666667pt;}\n.y6f1{bottom:301.213333pt;}\n.y8aa{bottom:301.306667pt;}\n.y852{bottom:302.106667pt;}\n.y6a7{bottom:302.266667pt;}\n.y911{bottom:302.626667pt;}\n.y1b3{bottom:302.906667pt;}\n.y4cb{bottom:303.226667pt;}\n.y3ef{bottom:303.706667pt;}\n.y78e{bottom:304.346667pt;}\n.y8d9{bottom:304.986667pt;}\n.y813{bottom:305.146667pt;}\n.y952{bottom:306.746667pt;}\n.y4eb{bottom:307.386667pt;}\n.y2d4{bottom:307.706667pt;}\n.y687{bottom:308.613333pt;}\n.y742{bottom:308.666667pt;}\n.y62a{bottom:308.826667pt;}\n.y406{bottom:309.306667pt;}\n.y24c{bottom:309.786667pt;}\n.y82d{bottom:309.946667pt;}\n.y505{bottom:310.746667pt;}\n.y262{bottom:311.106667pt;}\n.y541{bottom:311.866667pt;}\n.y1d8{bottom:312.026667pt;}\n.y22d{bottom:312.186667pt;}\n.y1f9{bottom:312.346667pt;}\n.y238{bottom:312.506667pt;}\n.y215{bottom:312.666667pt;}\n.y184{bottom:313.626667pt;}\n.y347{bottom:313.786667pt;}\n.y3db{bottom:314.266667pt;}\n.y35e{bottom:314.426667pt;}\n.y6e1{bottom:314.586667pt;}\n.y2a7{bottom:315.813333pt;}\n.y59e{bottom:316.346667pt;}\n.yf0{bottom:316.666667pt;}\n.y81{bottom:316.826667pt;}\n.y61{bottom:317.466667pt;}\n.y15b{bottom:317.626667pt;}\n.y851{bottom:317.946667pt;}\n.y4a2{bottom:318.106667pt;}\n.y910{bottom:318.306667pt;}\n.y67c{bottom:318.426667pt;}\n.y1b2{bottom:318.586667pt;}\n.y7be{bottom:319.386667pt;}\n.ya4{bottom:319.546667pt;}\n.yd1{bottom:319.706667pt;}\n.y33{bottom:319.866667pt;}\n.y5fb{bottom:320.026667pt;}\n.yb6{bottom:320.346667pt;}\n.y92{bottom:320.506667pt;}\n.y812{bottom:320.986667pt;}\n.y75c{bottom:321.466667pt;}\n.y5cb{bottom:322.266667pt;}\n.y88d{bottom:322.426667pt;}\n.y951{bottom:322.586667pt;}\n.y7b3{bottom:322.906667pt;}\n.y4ea{bottom:323.226667pt;}\n.y2d3{bottom:323.386667pt;}\n.y50f{bottom:323.546667pt;}\n.y471{bottom:323.706667pt;}\n.y7a0{bottom:324.186667pt;}\n.y629{bottom:324.666667pt;}\n.y57e{bottom:324.986667pt;}\n.y7d6{bottom:325.306667pt;}\n.y24b{bottom:325.466667pt;}\n.y299{bottom:325.626667pt;}\n.y5af{bottom:326.106667pt;}\n.y310{bottom:326.426667pt;}\n.y840{bottom:326.906667pt;}\n.y260{bottom:326.946667pt;}\n.y598{bottom:327.066667pt;}\n.y269{bottom:327.386667pt;}\n.y504{bottom:327.546667pt;}\n.y378{bottom:327.706667pt;}\n.y1d7{bottom:327.866667pt;}\n.y1f8{bottom:328.026667pt;}\n.y446{bottom:328.186667pt;}\n.y214{bottom:328.346667pt;}\n.y133{bottom:328.666667pt;}\n.y326{bottom:328.826667pt;}\n.y7d0{bottom:329.146667pt;}\n.y5a5{bottom:329.440000pt;}\n.y183{bottom:329.466667pt;}\n.y346{bottom:330.106667pt;}\n.y2a6{bottom:331.333333pt;}\n.y426{bottom:331.546667pt;}\n.y4a1{bottom:333.786667pt;}\n.y90f{bottom:334.146667pt;}\n.y1b1{bottom:334.426667pt;}\n.y67b{bottom:334.586667pt;}\n.y7bd{bottom:335.066667pt;}\n.y15a{bottom:335.706667pt;}\n.y78d{bottom:336.186667pt;}\n.y8d8{bottom:336.506667pt;}\n.y75b{bottom:337.146667pt;}\n.y7b2{bottom:338.586667pt;}\n.y4e9{bottom:338.906667pt;}\n.y2d2{bottom:339.226667pt;}\n.y470{bottom:339.386667pt;}\n.y8f5{bottom:339.706667pt;}\n.y741{bottom:339.866667pt;}\n.y64c{bottom:340.186667pt;}\n.y60{bottom:340.666667pt;}\n.y80{bottom:340.826667pt;}\n.y24a{bottom:340.986667pt;}\n.y685{bottom:341.120000pt;}\n.y8fa{bottom:341.146667pt;}\n.y55d{bottom:341.306667pt;}\n.y56c{bottom:341.466667pt;}\n.y5ae{bottom:341.786667pt;}\n.y3b2{bottom:342.106667pt;}\n.y597{bottom:342.746667pt;}\n.yd0{bottom:342.906667pt;}\n.y32{bottom:343.066667pt;}\n.y6ba{bottom:343.226667pt;}\n.y552{bottom:343.386667pt;}\n.ya3{bottom:343.546667pt;}\n.y91{bottom:343.706667pt;}\n.y1d6{bottom:343.866667pt;}\n.y445{bottom:344.026667pt;}\n.y213{bottom:344.186667pt;}\n.y3da{bottom:344.866667pt;}\n.y182{bottom:345.186667pt;}\n.y7f6{bottom:345.346667pt;}\n.y6e0{bottom:345.826667pt;}\n.y325{bottom:347.266667pt;}\n.y6f0{bottom:347.613333pt;}\n.y526{bottom:348.253333pt;}\n.y8a9{bottom:348.706667pt;}\n.y850{bottom:349.506667pt;}\n.y4a0{bottom:349.666667pt;}\n.y4ca{bottom:350.306667pt;}\n.y665{bottom:350.626667pt;}\n.y5fa{bottom:351.106667pt;}\n.y6a6{bottom:351.426667pt;}\n.y811{bottom:351.746667pt;}\n.y75a{bottom:353.346667pt;}\n.y5ca{bottom:353.506667pt;}\n.y950{bottom:353.666667pt;}\n.y159{bottom:353.826667pt;}\n.y88c{bottom:354.146667pt;}\n.y4e8{bottom:354.786667pt;}\n.y7b1{bottom:354.946667pt;}\n.y503{bottom:355.266667pt;}\n.y79f{bottom:355.426667pt;}\n.y46f{bottom:355.746667pt;}\n.y64b{bottom:355.906667pt;}\n.y25e{bottom:356.226667pt;}\n.y57d{bottom:356.546667pt;}\n.y684{bottom:356.640000pt;}\n.y249{bottom:356.706667pt;}\n.y345{bottom:356.866667pt;}\n.y628{bottom:357.026667pt;}\n.y298{bottom:357.186667pt;}\n.y56b{bottom:357.346667pt;}\n.y5ad{bottom:357.666667pt;}\n.y30e{bottom:357.986667pt;}\n.y83f{bottom:358.466667pt;}\n.y596{bottom:358.626667pt;}\n.y267{bottom:358.946667pt;}\n.y551{bottom:359.106667pt;}\n.y74e{bottom:359.266667pt;}\n.y450{bottom:359.426667pt;}\n.y1f7{bottom:359.586667pt;}\n.y212{bottom:359.746667pt;}\n.y132{bottom:360.066667pt;}\n.y35d{bottom:360.706667pt;}\n.y181{bottom:361.026667pt;}\n.y6df{bottom:361.346667pt;}\n.y5a9{bottom:362.946667pt;}\n.y425{bottom:363.106667pt;}\n.y7bc{bottom:363.746667pt;}\n.y6ef{bottom:363.773333pt;}\n.y5f{bottom:364.066667pt;}\n.yf7{bottom:364.706667pt;}\n.y1b0{bottom:365.186667pt;}\n.y84f{bottom:365.346667pt;}\n.y4c9{bottom:365.986667pt;}\n.y5f9{bottom:366.786667pt;}\n.ya2{bottom:366.946667pt;}\n.y31{bottom:367.106667pt;}\n.y8d7{bottom:367.266667pt;}\n.y78c{bottom:367.426667pt;}\n.yb5{bottom:367.586667pt;}\n.y90{bottom:367.746667pt;}\n.y6a5{bottom:369.186667pt;}\n.y2d1{bottom:369.826667pt;}\n.y50e{bottom:370.466667pt;}\n.y740{bottom:370.786667pt;}\n.y158{bottom:371.586667pt;}\n.y64a{bottom:371.746667pt;}\n.y502{bottom:372.066667pt;}\n.y94f{bottom:372.226667pt;}\n.y248{bottom:372.386667pt;}\n.y344{bottom:372.546667pt;}\n.y82c{bottom:372.866667pt;}\n.y297{bottom:373.026667pt;}\n.y3b1{bottom:373.666667pt;}\n.y2de{bottom:373.826667pt;}\n.y377{bottom:374.626667pt;}\n.y5d6{bottom:374.786667pt;}\n.y1d5{bottom:374.946667pt;}\n.y47e{bottom:375.106667pt;}\n.y44f{bottom:375.266667pt;}\n.y1f6{bottom:375.426667pt;}\n.y237{bottom:375.586667pt;}\n.y131{bottom:375.746667pt;}\n.y7cf{bottom:376.386667pt;}\n.y3d9{bottom:376.546667pt;}\n.y6e9{bottom:376.960000pt;}\n.y35c{bottom:377.026667pt;}\n.y7f5{bottom:377.346667pt;}\n.y324{bottom:378.466667pt;}\n.y7bb{bottom:379.266667pt;}\n.y8a8{bottom:379.426667pt;}\n.y49f{bottom:380.066667pt;}\n.y525{bottom:380.293333pt;}\n.y810{bottom:380.546667pt;}\n.y1af{bottom:380.866667pt;}\n.y6ed{bottom:381.533333pt;}\n.y4c8{bottom:381.826667pt;}\n.y72c{bottom:382.146667pt;}\n.y8d6{bottom:382.946667pt;}\n.y5f8{bottom:383.106667pt;}\n.y6de{bottom:383.906667pt;}\n.y5c9{bottom:384.546667pt;}\n.y88b{bottom:385.186667pt;}\n.y4e7{bottom:385.346667pt;}\n.y92e{bottom:385.506667pt;}\n.y7b0{bottom:386.146667pt;}\n.y79e{bottom:386.306667pt;}\n.y46e{bottom:386.466667pt;}\n.y50d{bottom:386.626667pt;}\n.y25c{bottom:386.946667pt;}\n.y6a4{bottom:387.106667pt;}\n.y7f{bottom:387.266667pt;}\n.y437{bottom:387.746667pt;}\n.yef{bottom:387.906667pt;}\n.y5e{bottom:388.066667pt;}\n.y343{bottom:388.226667pt;}\n.y2dd{bottom:388.386667pt;}\n.y5ac{bottom:388.546667pt;}\n.y296{bottom:388.866667pt;}\n.y3b0{bottom:389.506667pt;}\n.y595{bottom:389.666667pt;}\n.y83e{bottom:389.986667pt;}\n.ya1{bottom:390.146667pt;}\n.y30{bottom:390.466667pt;}\n.y710{bottom:390.786667pt;}\n.yb4{bottom:390.946667pt;}\n.y180{bottom:392.226667pt;}\n.y7ce{bottom:392.386667pt;}\n.y304{bottom:393.346667pt;}\n.y5a7{bottom:394.466667pt;}\n.y424{bottom:394.626667pt;}\n.y8a7{bottom:395.266667pt;}\n.y702{bottom:396.226667pt;}\n.y84e{bottom:396.386667pt;}\n.y1ae{bottom:396.706667pt;}\n.y67a{bottom:397.026667pt;}\n.y6ec{bottom:397.053333pt;}\n.y4c7{bottom:397.506667pt;}\n.y664{bottom:398.306667pt;}\n.y90e{bottom:398.626667pt;}\n.y8d5{bottom:398.786667pt;}\n.y6dd{bottom:399.586667pt;}\n.y130{bottom:399.746667pt;}\n.y5c8{bottom:400.066667pt;}\n.y2d0{bottom:401.346667pt;}\n.y303{bottom:401.826667pt;}\n.y46d{bottom:402.146667pt;}\n.y25b{bottom:402.626667pt;}\n.y649{bottom:402.786667pt;}\n.y57c{bottom:402.946667pt;}\n.y436{bottom:403.426667pt;}\n.y157{bottom:403.586667pt;}\n.y56a{bottom:403.746667pt;}\n.y342{bottom:403.906667pt;}\n.y594{bottom:405.346667pt;}\n.y550{bottom:405.666667pt;}\n.y376{bottom:405.826667pt;}\n.y1f5{bottom:405.986667pt;}\n.y1d4{bottom:406.146667pt;}\n.y44a{bottom:406.306667pt;}\n.y211{bottom:406.466667pt;}\n.y236{bottom:406.626667pt;}\n.y295{bottom:406.786667pt;}\n.y3af{bottom:407.426667pt;}\n.y3d8{bottom:408.066667pt;}\n.y35b{bottom:408.226667pt;}\n.y960{bottom:408.386667pt;}\n.y7ba{bottom:408.706667pt;}\n.y323{bottom:409.666667pt;}\n.y8a6{bottom:411.106667pt;}\n.y5d{bottom:411.266667pt;}\n.y523{bottom:411.333333pt;}\n.y49e{bottom:411.746667pt;}\n.y80f{bottom:412.546667pt;}\n.y6eb{bottom:413.053333pt;}\n.ycf{bottom:413.346667pt;}\n.y2f{bottom:413.666667pt;}\n.ya0{bottom:414.146667pt;}\n.y8d4{bottom:414.466667pt;}\n.y6dc{bottom:415.106667pt;}\n.y940{bottom:415.266667pt;}\n.y759{bottom:415.586667pt;}\n.y5c7{bottom:416.546667pt;}\n.y4e6{bottom:417.026667pt;}\n.y302{bottom:417.506667pt;}\n.y129{bottom:417.666667pt;}\n.y50c{bottom:417.826667pt;}\n.y46c{bottom:417.986667pt;}\n.y648{bottom:418.466667pt;}\n.y405{bottom:418.946667pt;}\n.y501{bottom:419.106667pt;}\n.y247{bottom:419.266667pt;}\n.y55c{bottom:419.426667pt;}\n.y341{bottom:419.586667pt;}\n.y5ab{bottom:420.386667pt;}\n.y54f{bottom:421.346667pt;}\n.y375{bottom:421.506667pt;}\n.y44e{bottom:421.666667pt;}\n.y47d{bottom:421.986667pt;}\n.y210{bottom:422.146667pt;}\n.y17f{bottom:422.946667pt;}\n.y7cd{bottom:423.106667pt;}\n.y3d7{bottom:423.746667pt;}\n.y7b9{bottom:424.386667pt;}\n.y423{bottom:425.666667pt;}\n.y7f4{bottom:426.946667pt;}\n.y84d{bottom:427.586667pt;}\n.y1ad{bottom:427.746667pt;}\n.y322{bottom:428.066667pt;}\n.y679{bottom:428.226667pt;}\n.y8a5{bottom:429.026667pt;}\n.y59d{bottom:429.506667pt;}\n.y78b{bottom:429.826667pt;}\n.y8d3{bottom:430.306667pt;}\n.y6db{bottom:430.786667pt;}\n.y93f{bottom:432.226667pt;}\n.y2cf{bottom:432.866667pt;}\n.y94e{bottom:433.186667pt;}\n.y73f{bottom:433.986667pt;}\n.y7e{bottom:434.466667pt;}\n.y156{bottom:434.626667pt;}\n.y647{bottom:434.786667pt;}\n.y246{bottom:434.946667pt;}\n.y55b{bottom:435.106667pt;}\n.y5c{bottom:435.266667pt;}\n.y8f{bottom:435.426667pt;}\n.y12e{bottom:436.066667pt;}\n.y57b{bottom:436.866667pt;}\n.y54e{bottom:437.186667pt;}\n.y9f{bottom:437.346667pt;}\n.yce{bottom:437.506667pt;}\n.y2e{bottom:437.666667pt;}\n.y2dc{bottom:437.826667pt;}\n.y20f{bottom:437.986667pt;}\n.yb3{bottom:438.146667pt;}\n.yec{bottom:438.306667pt;}\n.y3ae{bottom:438.466667pt;}\n.y35a{bottom:439.426667pt;}\n.y3d6{bottom:439.586667pt;}\n.y728{bottom:441.920000pt;}\n.y663{bottom:442.626667pt;}\n.y49d{bottom:443.106667pt;}\n.y80e{bottom:443.266667pt;}\n.y1ac{bottom:443.426667pt;}\n.y321{bottom:443.586667pt;}\n.y50b{bottom:443.906667pt;}\n.y92d{bottom:444.066667pt;}\n.y51e{bottom:444.480000pt;}\n.y4c6{bottom:444.866667pt;}\n.y5f7{bottom:445.346667pt;}\n.y128{bottom:445.826667pt;}\n.y6b4{bottom:446.080000pt;}\n.y6da{bottom:446.466667pt;}\n.y758{bottom:446.786667pt;}\n.y4e5{bottom:448.066667pt;}\n.y88a{bottom:448.226667pt;}\n.y93e{bottom:448.386667pt;}\n.y301{bottom:448.546667pt;}\n.y46b{bottom:449.026667pt;}\n.y404{bottom:450.146667pt;}\n.y245{bottom:450.466667pt;}\n.y435{bottom:450.786667pt;}\n.y55a{bottom:450.946667pt;}\n.y340{bottom:451.106667pt;}\n.y12d{bottom:451.746667pt;}\n.y593{bottom:452.386667pt;}\n.y261{bottom:452.706667pt;}\n.y54d{bottom:452.866667pt;}\n.y374{bottom:453.026667pt;}\n.y1f4{bottom:453.186667pt;}\n.y12b{bottom:453.346667pt;}\n.y235{bottom:453.506667pt;}\n.y20e{bottom:453.666667pt;}\n.y17e{bottom:454.466667pt;}\n.y422{bottom:456.706667pt;}\n.y7d{bottom:457.826667pt;}\n.y521{bottom:458.053333pt;}\n.y7f3{bottom:458.146667pt;}\n.y662{bottom:458.306667pt;}\n.yf6{bottom:458.466667pt;}\n.y5b{bottom:458.626667pt;}\n.y84c{bottom:458.786667pt;}\n.y320{bottom:459.426667pt;}\n.y678{bottom:459.586667pt;}\n.y1ab{bottom:459.746667pt;}\n.y8a4{bottom:460.066667pt;}\n.y6ea{bottom:460.453333pt;}\n.ycd{bottom:460.706667pt;}\n.y2d{bottom:460.866667pt;}\n.y5f6{bottom:461.026667pt;}\n.yc2{bottom:461.346667pt;}\n.y9e{bottom:461.506667pt;}\n.y8d2{bottom:461.666667pt;}\n.y6d9{bottom:462.146667pt;}\n.y757{bottom:462.466667pt;}\n.y4e4{bottom:463.746667pt;}\n.y2ce{bottom:464.066667pt;}\n.y300{bottom:464.226667pt;}\n.y79d{bottom:464.546667pt;}\n.y46a{bottom:464.706667pt;}\n.y8f4{bottom:464.866667pt;}\n.y73e{bottom:465.186667pt;}\n.y155{bottom:465.826667pt;}\n.y646{bottom:465.986667pt;}\n.y244{bottom:466.146667pt;}\n.y627{bottom:466.466667pt;}\n.y434{bottom:466.626667pt;}\n.y82b{bottom:466.786667pt;}\n.y57a{bottom:468.066667pt;}\n.y61c{bottom:468.386667pt;}\n.y571{bottom:468.546667pt;}\n.y614{bottom:468.706667pt;}\n.y294{bottom:468.866667pt;}\n.y12a{bottom:469.026667pt;}\n.y1f3{bottom:469.186667pt;}\n.y234{bottom:469.346667pt;}\n.y20d{bottom:469.506667pt;}\n.y3ad{bottom:469.666667pt;}\n.y12f{bottom:469.826667pt;}\n.y3d5{bottom:470.306667pt;}\n.y359{bottom:470.786667pt;}\n.y95f{bottom:470.946667pt;}\n.y873{bottom:472.160000pt;}\n.y86d{bottom:472.320000pt;}\n.y421{bottom:472.386667pt;}\n.y722{bottom:473.280000pt;}\n.y92c{bottom:473.346667pt;}\n.y49c{bottom:473.986667pt;}\n.y520{bottom:474.213333pt;}\n.y661{bottom:474.466667pt;}\n.y7f2{bottom:474.626667pt;}\n.y12c{bottom:475.426667pt;}\n.y8a3{bottom:475.746667pt;}\n.y4c5{bottom:475.906667pt;}\n.y5f5{bottom:476.866667pt;}\n.y6d8{bottom:477.666667pt;}\n.y80d{bottom:478.146667pt;}\n.y756{bottom:478.466667pt;}\n.y889{bottom:479.266667pt;}\n.y53b{bottom:479.586667pt;}\n.y8d1{bottom:479.746667pt;}\n.y4e3{bottom:480.066667pt;}\n.y6b7{bottom:480.866667pt;}\n.y469{bottom:481.026667pt;}\n.y500{bottom:481.506667pt;}\n.y5a{bottom:481.826667pt;}\n.y25f{bottom:481.986667pt;}\n.y33f{bottom:482.146667pt;}\n.y569{bottom:482.306667pt;}\n.yf5{bottom:482.466667pt;}\n.y559{bottom:482.626667pt;}\n.y592{bottom:483.906667pt;}\n.y2c{bottom:484.066667pt;}\n.y5c6{bottom:484.386667pt;}\n.y70f{bottom:484.546667pt;}\n.yb2{bottom:484.706667pt;}\n.y7cc{bottom:485.666667pt;}\n.y3d4{bottom:485.986667pt;}\n.y17d{bottom:486.146667pt;}\n.y579{bottom:486.626667pt;}\n.y420{bottom:488.706667pt;}\n.y49b{bottom:489.666667pt;}\n.y6fe{bottom:489.986667pt;}\n.y31f{bottom:490.466667pt;}\n.y127{bottom:491.106667pt;}\n.y1aa{bottom:491.266667pt;}\n.y78a{bottom:492.066667pt;}\n.y6d7{bottom:493.346667pt;}\n.y80c{bottom:493.826667pt;}\n.y2ff{bottom:495.106667pt;}\n.y2cd{bottom:495.266667pt;}\n.y94d{bottom:495.586667pt;}\n.y8f3{bottom:495.906667pt;}\n.y73d{bottom:496.226667pt;}\n.y755{bottom:496.386667pt;}\n.y154{bottom:496.866667pt;}\n.y243{bottom:497.346667pt;}\n.y82a{bottom:497.986667pt;}\n.y3bd{bottom:498.560000pt;}\n.y59c{bottom:499.426667pt;}\n.y22c{bottom:499.586667pt;}\n.y1d3{bottom:499.746667pt;}\n.y20c{bottom:499.906667pt;}\n.y1f2{bottom:500.066667pt;}\n.y293{bottom:500.226667pt;}\n.y47c{bottom:500.386667pt;}\n.y7cb{bottom:501.186667pt;}\n.y358{bottom:501.986667pt;}\n.y3d3{bottom:502.146667pt;}\n.y5c5{bottom:502.466667pt;}\n.y92b{bottom:502.626667pt;}\n.y7c{bottom:505.026667pt;}\n.y51f{bottom:505.413333pt;}\n.y49a{bottom:505.506667pt;}\n.y660{bottom:505.666667pt;}\n.y59{bottom:505.826667pt;}\n.y90d{bottom:505.986667pt;}\n.y4c4{bottom:506.946667pt;}\n.y5f4{bottom:507.586667pt;}\n.y789{bottom:507.746667pt;}\n.yc1{bottom:507.906667pt;}\n.ycc{bottom:508.066667pt;}\n.y2b{bottom:508.226667pt;}\n.y93d{bottom:508.386667pt;}\n.yb1{bottom:508.706667pt;}\n.y6d6{bottom:509.026667pt;}\n.y888{bottom:510.306667pt;}\n.y2cc{bottom:510.786667pt;}\n.y7af{bottom:510.946667pt;}\n.y539{bottom:511.106667pt;}\n.y468{bottom:511.746667pt;}\n.y73c{bottom:511.906667pt;}\n.y79c{bottom:512.226667pt;}\n.y25d{bottom:512.706667pt;}\n.y242{bottom:513.026667pt;}\n.y33e{bottom:513.186667pt;}\n.y626{bottom:513.346667pt;}\n.y90c{bottom:513.506667pt;}\n.y558{bottom:513.666667pt;}\n.y153{bottom:514.946667pt;}\n.y54c{bottom:515.106667pt;}\n.y3ee{bottom:515.266667pt;}\n.y1d2{bottom:515.426667pt;}\n.y4b3{bottom:515.586667pt;}\n.y444{bottom:515.746667pt;}\n.y70e{bottom:515.906667pt;}\n.y17c{bottom:517.506667pt;}\n.y578{bottom:517.986667pt;}\n.y120{bottom:519.266667pt;}\n.y357{bottom:519.906667pt;}\n.y499{bottom:521.186667pt;}\n.y31e{bottom:521.506667pt;}\n.y1a9{bottom:521.986667pt;}\n.y4c3{bottom:522.626667pt;}\n.y677{bottom:522.786667pt;}\n.y5f3{bottom:523.426667pt;}\n.y788{bottom:523.906667pt;}\n.y6d5{bottom:524.546667pt;}\n.y887{bottom:525.986667pt;}\n.y2cb{bottom:526.626667pt;}\n.y8f2{bottom:526.946667pt;}\n.y467{bottom:527.426667pt;}\n.y73b{bottom:528.226667pt;}\n.y645{bottom:528.386667pt;}\n.y241{bottom:528.706667pt;}\n.y33d{bottom:528.866667pt;}\n.y7b{bottom:529.026667pt;}\n.y58{bottom:529.186667pt;}\n.y829{bottom:529.346667pt;}\n.y387{bottom:529.986667pt;}\n.y152{bottom:530.626667pt;}\n.y54b{bottom:530.946667pt;}\n.y22b{bottom:531.106667pt;}\n.ycb{bottom:531.266667pt;}\n.y2a{bottom:531.426667pt;}\n.y292{bottom:531.586667pt;}\n.y449{bottom:531.746667pt;}\n.yb0{bottom:531.906667pt;}\n.y443{bottom:532.066667pt;}\n.y3c1{bottom:532.706667pt;}\n.y3d2{bottom:533.346667pt;}\n.y5c4{bottom:533.506667pt;}\n.y83d{bottom:533.666667pt;}\n.y126{bottom:534.466667pt;}\n.y7ca{bottom:535.106667pt;}\n.y17b{bottom:535.586667pt;}\n.y65f{bottom:536.706667pt;}\n.y498{bottom:537.026667pt;}\n.y1a8{bottom:538.466667pt;}\n.y11f{bottom:538.626667pt;}\n.y5f2{bottom:539.586667pt;}\n.y6d4{bottom:540.226667pt;}\n.y7f1{bottom:540.866667pt;}\n.y4e2{bottom:541.826667pt;}\n.y7ae{bottom:541.986667pt;}\n.y2ca{bottom:542.306667pt;}\n.y537{bottom:542.626667pt;}\n.y754{bottom:543.106667pt;}\n.y466{bottom:543.266667pt;}\n.y8b4{bottom:544.066667pt;}\n.y403{bottom:544.226667pt;}\n.y240{bottom:544.386667pt;}\n.y386{bottom:544.546667pt;}\n.y33c{bottom:544.706667pt;}\n.y90b{bottom:544.866667pt;}\n.y8f1{bottom:545.026667pt;}\n.y584{bottom:545.920000pt;}\n.y54a{bottom:546.626667pt;}\n.y373{bottom:546.786667pt;}\n.y151{bottom:546.946667pt;}\n.y47b{bottom:547.106667pt;}\n.y3d1{bottom:549.026667pt;}\n.y5c3{bottom:549.186667pt;}\n.y125{bottom:550.146667pt;}\n.y356{bottom:550.946667pt;}\n.y41f{bottom:551.426667pt;}\n.y591{bottom:551.746667pt;}\n.y57{bottom:552.386667pt;}\n.y497{bottom:552.706667pt;}\n.y6fb{bottom:552.866667pt;}\n.y6b2{bottom:552.960000pt;}\n.yf4{bottom:553.026667pt;}\n.y7c9{bottom:553.186667pt;}\n.y676{bottom:553.506667pt;}\n.y11b{bottom:553.986667pt;}\n.y1a7{bottom:554.306667pt;}\n.y29{bottom:554.626667pt;}\n.yca{bottom:555.106667pt;}\n.yc0{bottom:555.266667pt;}\n.y11e{bottom:555.746667pt;}\n.yaf{bottom:555.906667pt;}\n.y8a2{bottom:556.066667pt;}\n.y4c2{bottom:556.546667pt;}\n.y4e1{bottom:557.506667pt;}\n.y8d0{bottom:557.666667pt;}\n.y2fe{bottom:558.146667pt;}\n.y2c9{bottom:558.306667pt;}\n.y100{bottom:559.266667pt;}\n.y753{bottom:559.426667pt;}\n.y433{bottom:559.746667pt;}\n.y644{bottom:559.906667pt;}\n.y625{bottom:560.226667pt;}\n.y828{bottom:560.386667pt;}\n.y90a{bottom:560.546667pt;}\n.y4ff{bottom:562.306667pt;}\n.y291{bottom:562.466667pt;}\n.y22a{bottom:562.626667pt;}\n.y1d1{bottom:562.786667pt;}\n.y20b{bottom:562.946667pt;}\n.y23f{bottom:563.106667pt;}\n.y794{bottom:563.266667pt;}\n.y3bf{bottom:564.226667pt;}\n.y3d0{bottom:564.866667pt;}\n.y5c2{bottom:565.026667pt;}\n.y17a{bottom:566.626667pt;}\n.y41e{bottom:567.106667pt;}\n.y65e{bottom:567.906667pt;}\n.y496{bottom:568.546667pt;}\n.y93c{bottom:568.893333pt;}\n.y675{bottom:569.213333pt;}\n.y869{bottom:569.600000pt;}\n.y1a6{bottom:570.013333pt;}\n.y5f1{bottom:570.653333pt;}\n.y787{bottom:570.813333pt;}\n.y7c8{bottom:571.293333pt;}\n.y6d3{bottom:571.453333pt;}\n.y7f0{bottom:571.933333pt;}\n.y4c1{bottom:572.253333pt;}\n.y124{bottom:572.733333pt;}\n.y11a{bottom:572.893333pt;}\n.y886{bottom:573.373333pt;}\n.y8cf{bottom:573.533333pt;}\n.y7ad{bottom:573.693333pt;}\n.y4e0{bottom:573.853333pt;}\n.y534{bottom:574.173333pt;}\n.y465{bottom:574.333333pt;}\n.y79b{bottom:574.493333pt;}\n.y402{bottom:575.453333pt;}\n.y7a{bottom:575.613333pt;}\n.y432{bottom:576.093333pt;}\n.yfb{bottom:576.253333pt;}\n.y56{bottom:576.413333pt;}\n.y121{bottom:578.013333pt;}\n.y549{bottom:578.173333pt;}\n.y229{bottom:578.333333pt;}\n.ybf{bottom:578.493333pt;}\n.y28{bottom:578.653333pt;}\n.ydb{bottom:579.293333pt;}\n.y80b{bottom:579.773333pt;}\n.y586{bottom:580.093333pt;}\n.y3cf{bottom:580.573333pt;}\n.y41d{bottom:582.813333pt;}\n.y355{bottom:582.973333pt;}\n.y65d{bottom:583.613333pt;}\n.y6f8{bottom:584.413333pt;}\n.y31d{bottom:584.573333pt;}\n.y674{bottom:585.053333pt;}\n.y1a5{bottom:585.853333pt;}\n.y5f0{bottom:586.333333pt;}\n.y786{bottom:586.653333pt;}\n.y6d2{bottom:587.133333pt;}\n.y4c0{bottom:588.093333pt;}\n.y8a1{bottom:588.413333pt;}\n.y2fd{bottom:589.213333pt;}\n.y2c8{bottom:589.373333pt;}\n.y4df{bottom:589.533333pt;}\n.y464{bottom:590.013333pt;}\n.y73a{bottom:590.493333pt;}\n.y123{bottom:590.813333pt;}\n.y643{bottom:590.973333pt;}\n.y401{bottom:591.133333pt;}\n.y431{bottom:591.773333pt;}\n.y827{bottom:592.093333pt;}\n.y119{bottom:593.053333pt;}\n.y4fe{bottom:593.533333pt;}\n.y848{bottom:593.600000pt;}\n.y61b{bottom:593.693333pt;}\n.y540{bottom:593.853333pt;}\n.y290{bottom:594.013333pt;}\n.y228{bottom:594.173333pt;}\n.y1d0{bottom:594.333333pt;}\n.y20a{bottom:594.493333pt;}\n.y80a{bottom:595.453333pt;}\n.y11d{bottom:595.933333pt;}\n.y3ce{bottom:596.413333pt;}\n.y179{bottom:597.853333pt;}\n.y3ac{bottom:598.653333pt;}\n.y721{bottom:598.720000pt;}\n.y55{bottom:599.613333pt;}\n.y65c{bottom:599.773333pt;}\n.y495{bottom:600.093333pt;}\n.y31c{bottom:600.253333pt;}\n.yc9{bottom:601.693333pt;}\n.y27{bottom:601.853333pt;}\n.y5ef{bottom:602.173333pt;}\n.y1a4{bottom:602.333333pt;}\n.ybe{bottom:602.493333pt;}\n.y6d1{bottom:602.813333pt;}\n.y6af{bottom:603.040000pt;}\n.y7ef{bottom:603.133333pt;}\n.y885{bottom:604.573333pt;}\n.y8a0{bottom:604.893333pt;}\n.y8ce{bottom:605.053333pt;}\n.y7ac{bottom:605.213333pt;}\n.y4de{bottom:605.373333pt;}\n.y531{bottom:605.693333pt;}\n.y739{bottom:606.173333pt;}\n.y463{bottom:606.333333pt;}\n.y86c{bottom:606.653333pt;}\n.y7c7{bottom:607.133333pt;}\n.y2fc{bottom:607.293333pt;}\n.y568{bottom:607.453333pt;}\n.y624{bottom:607.613333pt;}\n.y430{bottom:607.773333pt;}\n.y8f0{bottom:608.093333pt;}\n.y122{bottom:608.733333pt;}\n.y150{bottom:609.213333pt;}\n.y53f{bottom:609.533333pt;}\n.y385{bottom:609.693333pt;}\n.y372{bottom:609.853333pt;}\n.y1cf{bottom:610.013333pt;}\n.y2db{bottom:610.173333pt;}\n.y36a{bottom:611.040000pt;}\n.y809{bottom:611.293333pt;}\n.y585{bottom:611.613333pt;}\n.y118{bottom:611.773333pt;}\n.y11c{bottom:613.053333pt;}\n.y178{bottom:613.533333pt;}\n.y41c{bottom:614.653333pt;}\n.y494{bottom:615.773333pt;}\n.y31b{bottom:616.093333pt;}\n.y93b{bottom:617.533333pt;}\n.y5ee{bottom:617.853333pt;}\n.y1a3{bottom:618.173333pt;}\n.y6d0{bottom:618.493333pt;}\n.y7ee{bottom:618.653333pt;}\n.y4bf{bottom:618.813333pt;}\n.y2c7{bottom:620.413333pt;}\n.y89f{bottom:620.573333pt;}\n.y92a{bottom:621.213333pt;}\n.y752{bottom:622.013333pt;}\n.y642{bottom:622.173333pt;}\n.y884{bottom:622.493333pt;}\n.y54{bottom:622.813333pt;}\n.y79{bottom:622.973333pt;}\n.y8e{bottom:623.613333pt;}\n.y14f{bottom:624.893333pt;}\n.y4fd{bottom:625.053333pt;}\n.y26{bottom:625.213333pt;}\n.y28f{bottom:625.533333pt;}\n.ybd{bottom:625.693333pt;}\n.yc8{bottom:625.853333pt;}\n.y209{bottom:626.013333pt;}\n.y808{bottom:626.973333pt;}\n.y5c1{bottom:627.133333pt;}\n.y3cd{bottom:627.613333pt;}\n.y95e{bottom:627.933333pt;}\n.y177{bottom:629.373333pt;}\n.y117{bottom:629.853333pt;}\n.y719{bottom:630.240000pt;}\n.y65b{bottom:630.973333pt;}\n.y493{bottom:631.613333pt;}\n.y673{bottom:631.773333pt;}\n.y5ed{bottom:633.693333pt;}\n.y6cf{bottom:634.013333pt;}\n.y4be{bottom:634.493333pt;}\n.y7ed{bottom:634.653333pt;}\n.y74a{bottom:635.200000pt;}\n.y4dd{bottom:636.093333pt;}\n.y2c6{bottom:636.253333pt;}\n.y52f{bottom:636.413333pt;}\n.y79a{bottom:636.893333pt;}\n.y462{bottom:637.053333pt;}\n.y641{bottom:637.853333pt;}\n.y567{bottom:638.173333pt;}\n.y33b{bottom:638.333333pt;}\n.y2fb{bottom:638.493333pt;}\n.y3ab{bottom:638.653333pt;}\n.y8ef{bottom:639.133333pt;}\n.y14e{bottom:640.733333pt;}\n.y70d{bottom:640.893333pt;}\n.y28e{bottom:641.213333pt;}\n.y5c0{bottom:642.813333pt;}\n.y176{bottom:645.053333pt;}\n.y36e{bottom:645.213333pt;}\n.y116{bottom:645.533333pt;}\n.y41b{bottom:645.853333pt;}\n.y78{bottom:646.173333pt;}\n.y6f5{bottom:646.653333pt;}\n.yff{bottom:646.813333pt;}\n.y53{bottom:646.973333pt;}\n.y492{bottom:647.293333pt;}\n.y672{bottom:648.093333pt;}\n.y1a2{bottom:648.893333pt;}\n.yc7{bottom:649.053333pt;}\n.y25{bottom:649.213333pt;}\n.yda{bottom:649.693333pt;}\n.ybc{bottom:649.853333pt;}\n.y4bd{bottom:650.333333pt;}\n.y7ab{bottom:651.773333pt;}\n.y94c{bottom:651.933333pt;}\n.y2c5{bottom:652.093333pt;}\n.y4dc{bottom:652.573333pt;}\n.y461{bottom:652.733333pt;}\n.y640{bottom:653.693333pt;}\n.y33a{bottom:654.013333pt;}\n.y2fa{bottom:654.173333pt;}\n.y3aa{bottom:654.333333pt;}\n.y826{bottom:654.813333pt;}\n.y6a3{bottom:655.613333pt;}\n.y577{bottom:656.093333pt;}\n.y384{bottom:656.253333pt;}\n.y1f1{bottom:656.413333pt;}\n.y2a5{bottom:656.480000pt;}\n.y1ce{bottom:656.573333pt;}\n.y227{bottom:656.733333pt;}\n.y53e{bottom:656.893333pt;}\n.y208{bottom:657.053333pt;}\n.y442{bottom:657.213333pt;}\n.y84b{bottom:658.493333pt;}\n.y3cc{bottom:658.653333pt;}\n.y95d{bottom:659.133333pt;}\n.y28d{bottom:659.773333pt;}\n.y175{bottom:660.893333pt;}\n.y65a{bottom:662.013333pt;}\n.y491{bottom:663.133333pt;}\n.y720{bottom:663.773333pt;}\n.y5ec{bottom:664.893333pt;}\n.y6ce{bottom:665.373333pt;}\n.y4bc{bottom:666.013333pt;}\n.y8cd{bottom:667.293333pt;}\n.y1a1{bottom:667.613333pt;}\n.y2c4{bottom:667.773333pt;}\n.y929{bottom:668.413333pt;}\n.y460{bottom:668.573333pt;}\n.y4db{bottom:668.733333pt;}\n.y566{bottom:669.693333pt;}\n.y623{bottom:669.853333pt;}\n.y3a9{bottom:670.013333pt;}\n.y52{bottom:670.173333pt;}\n.y2f9{bottom:670.333333pt;}\n.y7ec{bottom:670.653333pt;}\n.yfe{bottom:670.813333pt;}\n.y14d{bottom:671.773333pt;}\n.y383{bottom:671.933333pt;}\n.y3ed{bottom:672.093333pt;}\n.yc6{bottom:672.253333pt;}\n.y24{bottom:672.413333pt;}\n.y576{bottom:672.893333pt;}\n.yd9{bottom:673.053333pt;}\n.y807{bottom:673.533333pt;}\n.y4fc{bottom:674.653333pt;}\n.y28c{bottom:675.453333pt;}\n.yc{bottom:675.933333pt;}\n.y115{bottom:676.413333pt;}\n.y84a{bottom:676.573333pt;}\n.y36c{bottom:676.733333pt;}\n.y41a{bottom:676.893333pt;}\n.y31a{bottom:677.853333pt;}\n.y6f2{bottom:678.173333pt;}\n.y490{bottom:678.813333pt;}\n.y671{bottom:679.133333pt;}\n.y2ba{bottom:680.093333pt;}\n.y6cd{bottom:680.893333pt;}\n.y785{bottom:681.213333pt;}\n.y4bb{bottom:681.853333pt;}\n.y8cc{bottom:682.973333pt;}\n.y94b{bottom:683.453333pt;}\n.y2c3{bottom:683.613333pt;}\n.y6a2{bottom:683.933333pt;}\n.y928{bottom:684.253333pt;}\n.y738{bottom:685.213333pt;}\n.y622{bottom:685.533333pt;}\n.y5bf{bottom:685.693333pt;}\n.y89e{bottom:685.853333pt;}\n.y825{bottom:686.173333pt;}\n.y63f{bottom:686.333333pt;}\n.y8b3{bottom:687.293333pt;}\n.y5d5{bottom:687.453333pt;}\n.y69b{bottom:687.613333pt;}\n.y226{bottom:687.773333pt;}\n.y1f0{bottom:687.933333pt;}\n.y1cd{bottom:688.093333pt;}\n.y207{bottom:688.253333pt;}\n.y806{bottom:689.213333pt;}\n.y95c{bottom:689.853333pt;}\n.y3cb{bottom:690.013333pt;}\n.y14c{bottom:690.333333pt;}\n.y28b{bottom:690.973333pt;}\n.yb{bottom:691.133333pt;}\n.y174{bottom:692.253333pt;}\n.y419{bottom:692.573333pt;}\n.y659{bottom:693.213333pt;}\n.y51{bottom:693.373333pt;}\n.y77{bottom:693.533333pt;}\n.y8d{bottom:694.173333pt;}\n.y48f{bottom:694.653333pt;}\n.y590{bottom:694.973333pt;}\n.y71e{bottom:695.293333pt;}\n.y5eb{bottom:695.773333pt;}\n.yd8{bottom:696.253333pt;}\n.y23{bottom:696.413333pt;}\n.y6cc{bottom:696.573333pt;}\n.y4ba{bottom:697.533333pt;}\n.y2b9{bottom:698.013333pt;}\n.y1a0{bottom:698.653333pt;}\n.y8cb{bottom:698.813333pt;}\n.y52c{bottom:699.453333pt;}\n.y4da{bottom:699.773333pt;}\n.y784{bottom:699.933333pt;}\n.y45f{bottom:700.413333pt;}\n.y400{bottom:700.733333pt;}\n.y737{bottom:700.893333pt;}\n.y565{bottom:701.213333pt;}\n.y3a8{bottom:701.373333pt;}\n.y2f8{bottom:701.533333pt;}\n.y7eb{bottom:702.173333pt;}\n.y63e{bottom:702.493333pt;}\n.y883{bottom:702.813333pt;}\n.y5d4{bottom:702.973333pt;}\n.y6b9{bottom:703.133333pt;}\n.y7b8{bottom:703.293333pt;}\n.y225{bottom:703.453333pt;}\n.y3ec{bottom:703.613333pt;}\n.y1cc{bottom:703.773333pt;}\n.y206{bottom:703.933333pt;}\n.y805{bottom:705.053333pt;}\n.y4fb{bottom:705.533333pt;}\n.y670{bottom:706.013333pt;}\n.y28a{bottom:706.653333pt;}\n.y683{bottom:706.880000pt;}\n.y114{bottom:707.453333pt;}\n.y418{bottom:708.893333pt;}\n.y319{bottom:709.853333pt;}\n.y173{bottom:710.333333pt;}\n.y85f{bottom:710.880000pt;}\n.y83c{bottom:711.613333pt;}\n.y354{bottom:711.773333pt;}\n.y6cb{bottom:712.253333pt;}\n.y93a{bottom:712.733333pt;}\n.y48e{bottom:713.373333pt;}\n.y58f{bottom:713.693333pt;}\n.y19f{bottom:714.333333pt;}\n.y8ca{bottom:714.493333pt;}\n.y2c2{bottom:714.653333pt;}\n.y751{bottom:715.293333pt;}\n.y4d9{bottom:715.453333pt;}\n.y799{bottom:715.613333pt;}\n.y927{bottom:715.773333pt;}\n.y3ff{bottom:716.413333pt;}\n.y5be{bottom:716.573333pt;}\n.y76{bottom:716.733333pt;}\n.y9d{bottom:717.373333pt;}\n.y50{bottom:717.533333pt;}\n.y882{bottom:718.493333pt;}\n.y63d{bottom:718.653333pt;}\n.y6a1{bottom:718.813333pt;}\n.y61a{bottom:718.973333pt;}\n.y53d{bottom:719.133333pt;}\n.y224{bottom:719.293333pt;}\n.y353{bottom:719.453333pt;}\n.yc5{bottom:719.613333pt;}\n.y22{bottom:719.773333pt;}\n.yd7{bottom:720.253333pt;}\n.y804{bottom:720.733333pt;}\n.y14b{bottom:721.053333pt;}\n.y3ca{bottom:721.213333pt;}\n.y95b{bottom:721.373333pt;}\n.ya{bottom:721.853333pt;}\n.y289{bottom:722.333333pt;}\n.y113{bottom:723.133333pt;}\n.y658{bottom:725.213333pt;}\n.y71b{bottom:726.973333pt;}\n.y5ea{bottom:727.293333pt;}\n.y6ca{bottom:727.773333pt;}\n.y939{bottom:728.413333pt;}\n.y892{bottom:730.240000pt;}\n.y8c9{bottom:730.493333pt;}\n.y19e{bottom:730.653333pt;}\n.y529{bottom:730.973333pt;}\n.y783{bottom:731.293333pt;}\n.y4d8{bottom:731.453333pt;}\n.y8f9{bottom:732.093333pt;}\n.y339{bottom:732.253333pt;}\n.y2f7{bottom:732.413333pt;}\n.y2c1{bottom:732.573333pt;}\n.y824{bottom:732.893333pt;}\n.y7ea{bottom:733.853333pt;}\n.y2b7{bottom:734.493333pt;}\n.y70c{bottom:734.653333pt;}\n.y570{bottom:734.813333pt;}\n.y223{bottom:734.973333pt;}\n.y1ef{bottom:735.133333pt;}\n.y233{bottom:735.293333pt;}\n.y2da{bottom:735.453333pt;}\n.y803{bottom:736.573333pt;}\n.y4fa{bottom:736.733333pt;}\n.y9{bottom:737.213333pt;}\n.y288{bottom:738.013333pt;}\n.y318{bottom:740.573333pt;}\n.y4f{bottom:740.733333pt;}\n.y657{bottom:740.893333pt;}\n.yfd{bottom:741.373333pt;}\n.y172{bottom:741.533333pt;}\n.y698{bottom:742.173333pt;}\n.y21{bottom:742.973333pt;}\n.ye2{bottom:743.453333pt;}\n.yc4{bottom:743.613333pt;}\n.y750{bottom:743.933333pt;}\n.y48d{bottom:744.093333pt;}\n.y58e{bottom:744.253333pt;}\n.y769{bottom:744.320000pt;}\n.y938{bottom:744.733333pt;}\n.y7aa{bottom:746.333333pt;}\n.y926{bottom:746.493333pt;}\n.y8f8{bottom:747.773333pt;}\n.y338{bottom:747.933333pt;}\n.y881{bottom:748.733333pt;}\n.y823{bottom:748.893333pt;}\n.y70b{bottom:750.333333pt;}\n.y548{bottom:750.493333pt;}\n.y453{bottom:750.653333pt;}\n.y1cb{bottom:750.813333pt;}\n.y1ee{bottom:750.973333pt;}\n.y232{bottom:751.133333pt;}\n.y205{bottom:751.293333pt;}\n.y7e9{bottom:751.773333pt;}\n.y14a{bottom:752.093333pt;}\n.y802{bottom:752.253333pt;}\n.y8{bottom:752.573333pt;}\n.y95a{bottom:753.053333pt;}\n.y287{bottom:753.533333pt;}\n.y112{bottom:753.853333pt;}\n.y656{bottom:756.573333pt;}\n.y6ee{bottom:758.493333pt;}\n.y5e9{bottom:758.813333pt;}\n.y6c9{bottom:759.133333pt;}\n.y317{bottom:759.293333pt;}\n.y171{bottom:759.613333pt;}\n.y48c{bottom:759.773333pt;}\n.y19d{bottom:761.373333pt;}\n.y8c8{bottom:761.533333pt;}\n.y527{bottom:761.693333pt;}\n.y782{bottom:762.013333pt;}\n.y4d7{bottom:762.173333pt;}\n.y937{bottom:762.653333pt;}\n.y45e{bottom:762.973333pt;}\n.y798{bottom:763.293333pt;}\n.y2f6{bottom:763.613333pt;}\n.y2c0{bottom:763.773333pt;}\n.y4e{bottom:763.933333pt;}\n.y736{bottom:764.093333pt;}\n.y880{bottom:764.413333pt;}\n.y776{bottom:764.573333pt;}\n.y8c{bottom:764.733333pt;}\n.y896{bottom:765.853333pt;}\n.y70a{bottom:766.013333pt;}\n.y352{bottom:766.173333pt;}\n.yd6{bottom:766.813333pt;}\n.y20{bottom:766.973333pt;}\n.yeb{bottom:767.613333pt;}\n.y7{bottom:767.933333pt;}\n.y4f9{bottom:768.093333pt;}\n.y286{bottom:769.213333pt;}\n.y7e8{bottom:769.853333pt;}\n.y3c9{bottom:770.493333pt;}\n.y417{bottom:771.933333pt;}\n.y655{bottom:773.053333pt;}\n.y6c8{bottom:774.653333pt;}\n.y48b{bottom:775.613333pt;}\n.y58d{bottom:775.933333pt;}\n.y19c{bottom:777.053333pt;}\n.y4d6{bottom:777.693333pt;}\n.y781{bottom:777.853333pt;}\n.y925{bottom:778.013333pt;}\n.y94a{bottom:778.493333pt;}\n.y3a7{bottom:779.293333pt;}\n.y337{bottom:779.453333pt;}\n.y822{bottom:779.773333pt;}\n.y87f{bottom:779.933333pt;}\n.y774{bottom:780.413333pt;}\n.y557{bottom:781.373333pt;}\n.y1ed{bottom:781.533333pt;}\n.y1ca{bottom:781.693333pt;}\n.y231{bottom:781.853333pt;}\n.y619{bottom:782.013333pt;}\n.y441{bottom:782.173333pt;}\n.y204{bottom:782.333333pt;}\n.y6{bottom:783.133333pt;}\n.y149{bottom:783.933333pt;}\n.y959{bottom:784.093333pt;}\n.y111{bottom:784.893333pt;}\n.y7e7{bottom:785.373333pt;}\n.yc3{bottom:787.133333pt;}\n.y75{bottom:787.293333pt;}\n.y4d{bottom:787.933333pt;}\n.y654{bottom:789.693333pt;}\n.y316{bottom:789.853333pt;}\n.ye1{bottom:790.013333pt;}\n.y1f{bottom:790.173333pt;}\n.y6c7{bottom:790.333333pt;}\n.y170{bottom:790.653333pt;}\n.yd5{bottom:790.813333pt;}\n.y48a{bottom:791.293333pt;}\n.y4b9{bottom:792.093333pt;}\n.y8c7{bottom:792.573333pt;}\n.y19b{bottom:792.893333pt;}\n.y45d{bottom:793.733333pt;}\n.y936{bottom:793.893333pt;}\n.y4d5{bottom:794.053333pt;}\n.y797{bottom:794.533333pt;}\n.y3fe{bottom:794.853333pt;}\n.y2f5{bottom:795.173333pt;}\n.y5bd{bottom:795.333333pt;}\n.y8f7{bottom:795.493333pt;}\n.y336{bottom:795.653333pt;}\n.y2bf{bottom:795.813333pt;}\n.y949{bottom:796.453333pt;}\n.y89d{bottom:797.093333pt;}\n.y222{bottom:797.253333pt;}\n.y371{bottom:797.413333pt;}\n.y230{bottom:797.573333pt;}\n.y5{bottom:798.533333pt;}\n.y4f8{bottom:799.013333pt;}\n.y285{bottom:800.453333pt;}\n.y7e6{bottom:801.253333pt;}\n.y3c8{bottom:801.573333pt;}\n.y416{bottom:803.013333pt;}\n.y110{bottom:803.333333pt;}\n.y695{bottom:804.453333pt;}\n.y653{bottom:805.413333pt;}\n.y6c6{bottom:806.053333pt;}\n.y16f{bottom:806.373333pt;}\n.y489{bottom:807.173333pt;}\n.y4b8{bottom:807.973333pt;}\n.y8c6{bottom:808.293333pt;}\n.y58c{bottom:809.413333pt;}\n.y924{bottom:809.573333pt;}\n.y796{bottom:810.213333pt;}\n.y3a6{bottom:810.853333pt;}\n.y5bc{bottom:811.013333pt;}\n.y8b{bottom:811.173333pt;}\n.y4c{bottom:811.333333pt;}\n.yae{bottom:811.973333pt;}\n.y45c{bottom:812.613333pt;}\n.y1ec{bottom:813.093333pt;}\n.y1c9{bottom:813.253333pt;}\n.y203{bottom:813.413333pt;}\n.y1e{bottom:813.573333pt;}\n.y4{bottom:813.893333pt;}\n.yd4{bottom:814.053333pt;}\n.ye0{bottom:814.213333pt;}\n.y63c{bottom:814.693333pt;}\n.y148{bottom:815.173333pt;}\n.y958{bottom:815.333333pt;}\n.y2b2{bottom:815.493333pt;}\n.y4f7{bottom:815.813333pt;}\n.y284{bottom:816.133333pt;}\n.y3c7{bottom:817.253333pt;}\n.y5e8{bottom:821.093333pt;}\n.y315{bottom:821.413333pt;}\n.y10f{bottom:821.733333pt;}\n.y16e{bottom:822.213333pt;}\n.y935{bottom:822.693333pt;}\n.y488{bottom:822.853333pt;}\n.y4b7{bottom:823.653333pt;}\n.y8c5{bottom:824.293333pt;}\n.y19a{bottom:824.773333pt;}\n.y780{bottom:825.093333pt;}\n.y4d4{bottom:825.253333pt;}\n.y795{bottom:826.053333pt;}\n.y909{bottom:826.373333pt;}\n.y735{bottom:826.533333pt;}\n.y2f4{bottom:826.693333pt;}\n.y335{bottom:826.853333pt;}\n.y948{bottom:827.493333pt;}\n.y801{bottom:827.813333pt;}\n.y370{bottom:828.773333pt;}\n.y1c8{bottom:828.933333pt;}\n.y202{bottom:829.093333pt;}\n.y283{bottom:831.813333pt;}\n.y63b{bottom:832.773333pt;}\n.y89c{bottom:832.933333pt;}\n.y3c6{bottom:833.573333pt;}\n.y415{bottom:834.213333pt;}\n.y4b{bottom:834.533333pt;}\n.y8a{bottom:835.333333pt;}\n.y693{bottom:835.493333pt;}\n.y5e7{bottom:836.773333pt;}\n.y314{bottom:837.093333pt;}\n.y6c5{bottom:837.253333pt;}\n.ydf{bottom:837.413333pt;}\n.y1d{bottom:837.573333pt;}\n.yea{bottom:838.053333pt;}\n.yd3{bottom:838.213333pt;}\n.y487{bottom:838.693333pt;}\n.y4b6{bottom:839.493333pt;}\n.y3{bottom:840.293333pt;}\n.y199{bottom:840.453333pt;}\n.y4d3{bottom:840.773333pt;}\n.y2f3{bottom:842.373333pt;}\n.y334{bottom:842.533333pt;}\n.y800{bottom:843.333333pt;}\n.y4f6{bottom:843.493333pt;}\n.y45b{bottom:843.653333pt;}\n.y58b{bottom:843.973333pt;}\n.y1eb{bottom:844.293333pt;}\n.y440{bottom:844.453333pt;}\n.y44d{bottom:844.613333pt;}\n.y221{bottom:844.773333pt;}\n.y1c7{bottom:844.933333pt;}\n.y734{bottom:845.093333pt;}\n.y147{bottom:846.373333pt;}\n.y2af{bottom:847.013333pt;}\n.y282{bottom:847.333333pt;}\n.y89b{bottom:848.613333pt;}\n.y3c5{bottom:849.253333pt;}\n.y7e5{bottom:851.493333pt;}\n.y934{bottom:851.653333pt;}\n.y10e{bottom:852.613333pt;}\n.y16d{bottom:852.933333pt;}\n.y8c4{bottom:855.013333pt;}\n.y524{bottom:855.813333pt;}\n.y947{bottom:856.293333pt;}\n.y77f{bottom:856.613333pt;}\n.y198{bottom:856.773333pt;}\n.y74{bottom:857.733333pt;}\n.y313{bottom:857.893333pt;}\n.y2f2{bottom:858.213333pt;}\n.y333{bottom:858.373333pt;}\n.y4a{bottom:858.533333pt;}\n.y923{bottom:858.693333pt;}\n.y7ff{bottom:859.653333pt;}\n.y4f5{bottom:860.293333pt;}\n.yde{bottom:860.613333pt;}\n.y1c{bottom:860.773333pt;}\n.ye9{bottom:861.413333pt;}\n.y58a{bottom:862.053333pt;}\n.y3e5{bottom:862.240000pt;}\n.y281{bottom:863.013333pt;}\n.y63a{bottom:863.813333pt;}\n.y5e6{bottom:864.453333pt;}\n.y89a{bottom:864.933333pt;}\n.y603{bottom:864.960000pt;}\n.y414{bottom:866.053333pt;}\n.y690{bottom:867.493333pt;}\n.y16c{bottom:868.613333pt;}\n.y7e4{bottom:869.413333pt;}\n.y486{bottom:870.213333pt;}\n.y8c3{bottom:870.533333pt;}\n.y10d{bottom:870.693333pt;}\n.y87e{bottom:873.733333pt;}\n.y821{bottom:873.893333pt;}\n.y76f{bottom:874.213333pt;}\n.y351{bottom:875.333333pt;}\n.y1ea{bottom:875.493333pt;}\n.y448{bottom:875.653333pt;}\n.y1c6{bottom:875.813333pt;}\n.y2be{bottom:875.973333pt;}\n.y312{bottom:876.133333pt;}\n.y146{bottom:877.413333pt;}\n.y957{bottom:878.373333pt;}\n.y2ad{bottom:878.533333pt;}\n.y280{bottom:878.693333pt;}\n.y933{bottom:881.093333pt;}\n.y49{bottom:881.733333pt;}\n.y73{bottom:881.893333pt;}\n.yad{bottom:882.533333pt;}\n.y1b{bottom:883.973333pt;}\n.y16b{bottom:884.453333pt;}\n.ye8{bottom:884.613333pt;}\n.ydd{bottom:884.773333pt;}\n.y946{bottom:885.253333pt;}\n.y485{bottom:885.893333pt;}\n.y68f{bottom:886.213333pt;}\n.y522{bottom:886.693333pt;}\n.y197{bottom:887.493333pt;}\n.y77e{bottom:888.453333pt;}\n.y10c{bottom:888.613333pt;}\n.y3fd{bottom:888.773333pt;}\n.y3a5{bottom:888.933333pt;}\n.y332{bottom:889.093333pt;}\n.y2f1{bottom:889.253333pt;}\n.y87d{bottom:889.413333pt;}\n.y922{bottom:889.893333pt;}\n.y69e{bottom:891.013333pt;}\n.y1e9{bottom:891.173333pt;}\n.y4f4{bottom:891.493333pt;}\n.y145{bottom:893.093333pt;}\n.y27f{bottom:894.373333pt;}\n.y639{bottom:895.013333pt;}\n.y3e9{bottom:895.653333pt;}\n.y413{bottom:897.253333pt;}\n.y890{bottom:899.680000pt;}\n.y7e3{bottom:900.293333pt;}\n.y484{bottom:901.733333pt;}\n.y652{bottom:902.693333pt;}\n.y16a{bottom:902.853333pt;}\n.y196{bottom:903.173333pt;}\n.y564{bottom:904.613333pt;}\n.y5bb{bottom:904.773333pt;}\n.y9c{bottom:904.933333pt;}\n.y72{bottom:905.093333pt;}\n.y76d{bottom:905.253333pt;}\n.yac{bottom:905.733333pt;}\n.y48{bottom:905.893333pt;}\n.y10b{bottom:906.533333pt;}\n.y1c5{bottom:906.853333pt;}\n.y1e8{bottom:907.013333pt;}\n.y3eb{bottom:907.173333pt;}\n.y350{bottom:907.333333pt;}\n.y43f{bottom:907.493333pt;}\n.y1a{bottom:907.973333pt;}\n.ye7{bottom:908.613333pt;}\n.y589{bottom:908.773333pt;}\n.y2ac{bottom:909.253333pt;}\n.y144{bottom:909.413333pt;}\n.y27e{bottom:909.893333pt;}\n.y638{bottom:910.693333pt;}\n.y899{bottom:911.493333pt;}\n.y945{bottom:914.533333pt;}\n.y6c4{bottom:915.973333pt;}\n.y483{bottom:917.413333pt;}\n.y8c2{bottom:917.893333pt;}\n.y921{bottom:918.693333pt;}\n.y195{bottom:919.013333pt;}\n.y77d{bottom:919.653333pt;}\n.y3a4{bottom:919.973333pt;}\n.y2f0{bottom:920.453333pt;}\n.y87c{bottom:920.613333pt;}\n.y5ba{bottom:920.773333pt;}\n.y44c{bottom:922.533333pt;}\n.y1e7{bottom:922.693333pt;}\n.y820{bottom:923.493333pt;}\n.y588{bottom:925.093333pt;}\n.y27d{bottom:925.573333pt;}\n.y637{bottom:926.693333pt;}\n.y3e7{bottom:927.173333pt;}\n.y71{bottom:928.293333pt;}\n.y9b{bottom:928.933333pt;}\n.y47{bottom:929.093333pt;}\n.y19{bottom:931.333333pt;}\n.y6c3{bottom:931.653333pt;}\n.ydc{bottom:931.973333pt;}\n.y7e2{bottom:932.613333pt;}\n.y482{bottom:933.253333pt;}\n.y8c1{bottom:933.573333pt;}\n.y85a{bottom:933.600000pt;}\n.y85c{bottom:933.760000pt;}\n.y169{bottom:934.053333pt;}\n.y77c{bottom:935.333333pt;}\n.y3a3{bottom:935.653333pt;}\n.y68c{bottom:935.973333pt;}\n.y4b5{bottom:936.133333pt;}\n.y87b{bottom:936.293333pt;}\n.y45a{bottom:937.573333pt;}\n.y10a{bottom:937.733333pt;}\n.y1c4{bottom:938.373333pt;}\n.y1e6{bottom:938.533333pt;}\n.y42f{bottom:938.693333pt;}\n.y331{bottom:938.853333pt;}\n.y779{bottom:939.013333pt;}\n.y81f{bottom:939.173333pt;}\n.y143{bottom:940.453333pt;}\n.y7fe{bottom:940.613333pt;}\n.y2aa{bottom:940.773333pt;}\n.y27c{bottom:941.253333pt;}\n.y944{bottom:943.173333pt;}\n.y6c2{bottom:947.493333pt;}\n.y920{bottom:947.653333pt;}\n.y481{bottom:948.933333pt;}\n.y8c0{bottom:949.413333pt;}\n.y7e1{bottom:950.533333pt;}\n.y3fc{bottom:951.173333pt;}\n.y77b{bottom:951.333333pt;}\n.y2ef{bottom:951.653333pt;}\n.y5b9{bottom:951.813333pt;}\n.y3a2{bottom:951.973333pt;}\n.y9a{bottom:952.133333pt;}\n.y46{bottom:952.293333pt;}\n.yab{bottom:953.093333pt;}\n.y2{bottom:953.253333pt;}\n.y109{bottom:953.413333pt;}\n.y34f{bottom:954.053333pt;}\n.y1e5{bottom:954.213333pt;}\n.ye6{bottom:955.173333pt;}\n.y18{bottom:955.333333pt;}\n.y587{bottom:955.973333pt;}\n.y7fd{bottom:956.453333pt;}\n.y27b{bottom:956.773333pt;}\n.y636{bottom:957.893333pt;}\n.y412{bottom:959.493333pt;}\n.y3c4{bottom:962.053333pt;}\n.y480{bottom:964.773333pt;}\n.y168{bottom:965.093333pt;}\n.y768{bottom:965.120000pt;}\n.y81e{bottom:966.053333pt;}\n.y7e0{bottom:966.213333pt;}\n.y834{bottom:966.720000pt;}\n.y3fb{bottom:966.853333pt;}\n.y3a1{bottom:967.653333pt;}\n.y68a{bottom:967.973333pt;}\n.y194{bottom:968.773333pt;}\n.y4d2{bottom:969.253333pt;}\n.y108{bottom:969.573333pt;}\n.y613{bottom:969.733333pt;}\n.y1c3{bottom:969.893333pt;}\n.y1e4{bottom:970.053333pt;}\n.y2ee{bottom:970.213333pt;}\n.y142{bottom:971.653333pt;}\n.y943{bottom:971.973333pt;}\n.y7fc{bottom:972.293333pt;}\n.y27a{bottom:972.453333pt;}\n.y70{bottom:975.493333pt;}\n.y45{bottom:976.293333pt;}\n.y91f{bottom:976.773333pt;}\n.y6c1{bottom:978.213333pt;}\n.y17{bottom:978.533333pt;}\n.y411{bottom:979.013333pt;}\n.ye5{bottom:979.173333pt;}\n.y8bf{bottom:980.933333pt;}\n.y7df{bottom:982.053333pt;}\n.y3fa{bottom:983.173333pt;}\n.y5b8{bottom:983.333333pt;}\n.y3a0{bottom:983.493333pt;}\n.y908{bottom:983.653333pt;}\n.y193{bottom:984.453333pt;}\n.y56f{bottom:985.093333pt;}\n.y618{bottom:985.253333pt;}\n.y1c2{bottom:985.573333pt;}\n.y1e3{bottom:985.733333pt;}\n.y898{bottom:985.893333pt;}\n.y107{bottom:987.173333pt;}\n.y141{bottom:987.333333pt;}\n.y279{bottom:988.133333pt;}\n.y635{bottom:989.413333pt;}\n.y83a{bottom:990.853333pt;}\n.y515{bottom:994.720000pt;}\n.y167{bottom:996.293333pt;}\n.y410{bottom:996.933333pt;}\n.y688{bottom:998.693333pt;}\n.y3f9{bottom:998.853333pt;}\n.y99{bottom:999.493333pt;}\n.y44{bottom:999.653333pt;}\n.y4d1{bottom:1000.293333pt;}\n.y192{bottom:1000.773333pt;}\n.y2bd{bottom:1001.093333pt;}\n.y778{bottom:1001.253333pt;}\n.y1c1{bottom:1001.413333pt;}\n.y1e2{bottom:1001.573333pt;}\n.y16{bottom:1001.893333pt;}\n.ye4{bottom:1002.373333pt;}\n.y106{bottom:1002.853333pt;}\n.y278{bottom:1003.653333pt;}\n.y634{bottom:1005.733333pt;}\n.y91e{bottom:1006.213333pt;}\n.y140{bottom:1007.653333pt;}\n.y839{bottom:1008.933333pt;}\n.y8be{bottom:1011.973333pt;}\n.y7de{bottom:1013.573333pt;}\n.y39f{bottom:1014.213333pt;}\n.y47f{bottom:1014.373333pt;}\n.y907{bottom:1014.693333pt;}\n.y166{bottom:1015.013333pt;}\n.y3f8{bottom:1015.333333pt;}\n.y3c3{bottom:1016.613333pt;}\n.y105{bottom:1018.720000pt;}\n.y277{bottom:1019.360000pt;}\n.y43{bottom:1022.880000pt;}\n.yaa{bottom:1023.520000pt;}\n.yfc{bottom:1023.680000pt;}\n.y15{bottom:1025.920000pt;}\n.y13f{bottom:1026.400000pt;}\n.ye3{bottom:1026.560000pt;}\n.y956{bottom:1028.000000pt;}\n.y40f{bottom:1028.320000pt;}\n.y963{bottom:1028.960000pt;}\n.y87a{bottom:1029.920000pt;}\n.y686{bottom:1031.360000pt;}\n.y191{bottom:1031.520000pt;}\n.y1c0{bottom:1032.160000pt;}\n.y2bc{bottom:1032.320000pt;}\n.y201{bottom:1032.640000pt;}\n.y39e{bottom:1033.120000pt;}\n.y276{bottom:1035.360000pt;}\n.y104{bottom:1035.520000pt;}\n.y8bd{bottom:1043.360000pt;}\n.y837{bottom:1045.280000pt;}\n.y13e{bottom:1045.440000pt;}\n.y5e5{bottom:1045.760000pt;}\n.y6f{bottom:1046.080000pt;}\n.y40e{bottom:1046.240000pt;}\n.ya9{bottom:1046.720000pt;}\n.y42{bottom:1046.880000pt;}\n.y190{bottom:1047.200000pt;}\n.y766{bottom:1047.520000pt;}\n.y1bf{bottom:1048.000000pt;}\n.y877{bottom:1048.320000pt;}\n.y14{bottom:1049.120000pt;}\n.y13d{bottom:1063.040000pt;}\n.y103{bottom:1063.200000pt;}\n.y200{bottom:1063.680000pt;}\n.y1be{bottom:1063.840000pt;}\n.y165{bottom:1064.160000pt;}\n.y13{bottom:1065.120000pt;}\n.y41{bottom:1070.080000pt;}\n.h16{height:4.455000pt;}\n.h38{height:14.720000pt;}\n.h20{height:14.916875pt;}\n.h22{height:16.294375pt;}\n.h2c{height:16.974375pt;}\n.h32{height:17.440000pt;}\n.h28{height:18.541875pt;}\n.ha{height:20.000000pt;}\n.h1e{height:31.040000pt;}\n.h1b{height:32.588750pt;}\n.h34{height:34.400000pt;}\n.h15{height:36.883125pt;}\n.h7{height:41.765625pt;}\n.h1f{height:42.693125pt;}\n.h27{height:42.796000pt;}\n.h10{height:43.993125pt;}\n.h45{height:45.600000pt;}\n.hd{height:45.948800pt;}\n.h48{height:46.168750pt;}\n.he{height:46.220625pt;}\n.h1a{height:46.332000pt;}\n.h3c{height:46.560000pt;}\n.hc{height:46.635625pt;}\n.h31{height:46.720000pt;}\n.h18{height:46.748000pt;}\n.h49{height:47.040000pt;}\n.hb{height:47.322500pt;}\n.h40{height:47.360000pt;}\n.h42{height:47.520000pt;}\n.h8{height:49.898438pt;}\n.h13{height:51.232500pt;}\n.h6{height:51.692500pt;}\n.h4{height:55.220937pt;}\n.h11{height:55.687500pt;}\n.h12{height:56.187500pt;}\n.h9{height:58.563750pt;}\n.h5{height:61.208750pt;}\n.h44{height:63.360000pt;}\n.h36{height:65.280000pt;}\n.h33{height:79.680000pt;}\n.h2a{height:79.840000pt;}\n.h1c{height:80.320000pt;}\n.h14{height:83.531250pt;}\n.hf{height:84.620625pt;}\n.h3b{height:96.640000pt;}\n.h29{height:96.960000pt;}\n.h26{height:97.280000pt;}\n.h21{height:97.440000pt;}\n.h2d{height:98.080000pt;}\n.h23{height:98.240000pt;}\n.h43{height:108.480000pt;}\n.h39{height:108.640000pt;}\n.h3e{height:109.280000pt;}\n.h2f{height:112.160000pt;}\n.h3f{height:115.520000pt;}\n.h25{height:122.720000pt;}\n.h46{height:123.200000pt;}\n.h1d{height:128.480000pt;}\n.h2e{height:129.120000pt;}\n.h37{height:132.640000pt;}\n.h2{height:155.017812pt;}\n.h41{height:189.920000pt;}\n.h3a{height:203.680000pt;}\n.h3d{height:204.800000pt;}\n.h3{height:224.750000pt;}\n.h24{height:243.200000pt;}\n.h19{height:346.720000pt;}\n.h30{height:369.120000pt;}\n.h47{height:415.680000pt;}\n.h17{height:417.760000pt;}\n.h35{height:475.520000pt;}\n.h2b{height:517.120000pt;}\n.h0{height:1122.720000pt;}\n.h1{height:1123.333333pt;}\n.w3{width:24.320000pt;}\n.w15{width:28.160000pt;}\n.w22{width:31.680000pt;}\n.w18{width:43.840000pt;}\n.w16{width:59.360000pt;}\n.w8{width:76.800000pt;}\n.w1b{width:77.760000pt;}\n.wf{width:83.200000pt;}\n.w11{width:105.440000pt;}\n.w1d{width:106.880000pt;}\n.wa{width:122.080000pt;}\n.wc{width:123.840000pt;}\n.wd{width:139.360000pt;}\n.w12{width:148.800000pt;}\n.w5{width:157.120000pt;}\n.w7{width:162.880000pt;}\n.w6{width:200.480000pt;}\n.w1f{width:205.920000pt;}\n.w17{width:223.040000pt;}\n.w24{width:226.720000pt;}\n.w21{width:250.240000pt;}\n.w10{width:255.520000pt;}\n.w1e{width:283.360000pt;}\n.wb{width:303.200000pt;}\n.w23{width:325.600000pt;}\n.we{width:334.560000pt;}\n.w13{width:348.320000pt;}\n.w20{width:379.520000pt;}\n.w9{width:620.480000pt;}\n.w1a{width:621.600000pt;}\n.w19{width:633.120000pt;}\n.w1c{width:636.320000pt;}\n.w14{width:640.320000pt;}\n.w4{width:685.120000pt;}\n.w2{width:793.279988pt;}\n.w0{width:793.280000pt;}\n.w1{width:794.000000pt;}\n.x0{left:0.000000pt;}\n.x24{left:2.240000pt;}\n.x8{left:4.000000pt;}\n.x4b{left:13.760000pt;}\n.x1{left:47.199988pt;}\n.x2a{left:50.432000pt;}\n.x23{left:54.720000pt;}\n.x6{left:56.959988pt;}\n.x48{left:59.999988pt;}\n.x2e{left:63.552000pt;}\n.x29{left:67.999988pt;}\n.x35{left:75.231988pt;}\n.xa{left:80.991988pt;}\n.x25{left:84.511988pt;}\n.x1d{left:87.071988pt;}\n.x2d{left:89.631988pt;}\n.xb{left:91.711988pt;}\n.x2c{left:94.751988pt;}\n.x3d{left:97.471988pt;}\n.x1c{left:99.711988pt;}\n.x46{left:101.791988pt;}\n.xc{left:104.831988pt;}\n.x20{left:107.551988pt;}\n.x1e{left:110.591988pt;}\n.x36{left:112.511988pt;}\n.xe{left:115.551988pt;}\n.x28{left:117.151988pt;}\n.x9{left:119.231988pt;}\n.x38{left:124.991988pt;}\n.x27{left:127.871988pt;}\n.x26{left:130.911988pt;}\n.x30{left:132.991988pt;}\n.x33{left:140.346655pt;}\n.x1f{left:151.226655pt;}\n.x22{left:155.066655pt;}\n.x2{left:157.306655pt;}\n.x40{left:194.586655pt;}\n.x3c{left:198.746655pt;}\n.x31{left:204.026655pt;}\n.xf{left:207.066655pt;}\n.x41{left:212.666655pt;}\n.x42{left:216.986655pt;}\n.x47{left:230.146655pt;}\n.x43{left:232.386655pt;}\n.x39{left:259.746667pt;}\n.x3b{left:265.826667pt;}\n.x16{left:274.306655pt;}\n.xd{left:276.386655pt;}\n.x10{left:281.826655pt;}\n.x32{left:287.586655pt;}\n.x3e{left:292.546655pt;}\n.x34{left:295.746655pt;}\n.x49{left:298.466655pt;}\n.x4a{left:301.826655pt;}\n.x5{left:303.586655pt;}\n.x17{left:337.026655pt;}\n.x11{left:382.626655pt;}\n.x3{left:396.733322pt;}\n.x2b{left:401.920000pt;}\n.x45{left:412.413322pt;}\n.x18{left:445.693322pt;}\n.x12{left:450.973322pt;}\n.x19{left:485.213322pt;}\n.x1a{left:558.213322pt;}\n.x15{left:574.053322pt;}\n.x37{left:620.773333pt;}\n.x3a{left:627.973333pt;}\n.x13{left:642.373322pt;}\n.x14{left:655.813322pt;}\n.x1b{left:659.173322pt;}\n.x3f{left:711.040000pt;}\n.x44{left:716.479988pt;}\n.x7{left:718.560000pt;}\n.x21{left:723.519988pt;}\n.x2f{left:740.639988pt;}\n.x4{left:773.919988pt;}\n}\n</style>\n<script>\n/*\n Copyright 2012 Mozilla Foundation \n Copyright 2013 Lu Wang <coolwanglu@gmail.com>\n Apachine License Version 2.0 \n*/\n(function(){function b(a,b,e,f){var c=(a.className||\"\").split(/\\s+/g);\"\"===c[0]&&c.shift();var d=c.indexOf(b);0>d&&e&&c.push(b);0<=d&&f&&c.splice(d,1);a.className=c.join(\" \");return 0<=d}if(!(\"classList\"in document.createElement(\"div\"))){var e={add:function(a){b(this.element,a,!0,!1)},contains:function(a){return b(this.element,a,!1,!1)},remove:function(a){b(this.element,a,!1,!0)},toggle:function(a){b(this.element,a,!0,!0)}};Object.defineProperty(HTMLElement.prototype,\"classList\",{get:function(){if(this._classList)return this._classList;\nvar a=Object.create(e,{element:{value:this,writable:!1,enumerable:!0}});Object.defineProperty(this,\"_classList\",{value:a,writable:!1,enumerable:!1});return a},enumerable:!0})}})();\n</script>\n<script>\n(function(){/*\n pdf2htmlEX.js: Core UI functions for pdf2htmlEX \n Copyright 2012,2013 Lu Wang <coolwanglu@gmail.com> and other contributors \n https://github.com/pdf2htmlEX/pdf2htmlEX/blob/master/share/LICENSE \n*/\nvar pdf2htmlEX=window.pdf2htmlEX=window.pdf2htmlEX||{},CSS_CLASS_NAMES={page_frame:\"pf\",page_content_box:\"pc\",page_data:\"pi\",background_image:\"bi\",link:\"l\",input_radio:\"ir\",__dummy__:\"no comma\"},DEFAULT_CONFIG={container_id:\"page-container\",sidebar_id:\"sidebar\",outline_id:\"outline\",loading_indicator_cls:\"loading-indicator\",preload_pages:3,render_timeout:100,scale_step:0.9,key_handler:!0,hashchange_handler:!0,view_history_handler:!0,__dummy__:\"no comma\"},EPS=1E-6;\nfunction invert(a){var b=a[0]*a[3]-a[1]*a[2];return[a[3]/b,-a[1]/b,-a[2]/b,a[0]/b,(a[2]*a[5]-a[3]*a[4])/b,(a[1]*a[4]-a[0]*a[5])/b]}function transform(a,b){return[a[0]*b[0]+a[2]*b[1]+a[4],a[1]*b[0]+a[3]*b[1]+a[5]]}function get_page_number(a){return parseInt(a.getAttribute(\"data-page-no\"),16)}function disable_dragstart(a){for(var b=0,c=a.length;b<c;++b)a[b].addEventListener(\"dragstart\",function(){return!1},!1)}\nfunction clone_and_extend_objs(a){for(var b={},c=0,e=arguments.length;c<e;++c){var h=arguments[c],d;for(d in h)h.hasOwnProperty(d)&&(b[d]=h[d])}return b}\nfunction Page(a){if(a){this.shown=this.loaded=!1;this.page=a;this.num=get_page_number(a);this.original_height=a.clientHeight;this.original_width=a.clientWidth;var b=a.getElementsByClassName(CSS_CLASS_NAMES.page_content_box)[0];b&&(this.content_box=b,this.original_scale=this.cur_scale=this.original_height/b.clientHeight,this.page_data=JSON.parse(a.getElementsByClassName(CSS_CLASS_NAMES.page_data)[0].getAttribute(\"data-data\")),this.ctm=this.page_data.ctm,this.ictm=invert(this.ctm),this.loaded=!0)}}\nPage.prototype={hide:function(){this.loaded&&this.shown&&(this.content_box.classList.remove(\"opened\"),this.shown=!1)},show:function(){this.loaded&&!this.shown&&(this.content_box.classList.add(\"opened\"),this.shown=!0)},rescale:function(a){this.cur_scale=0===a?this.original_scale:a;this.loaded&&(a=this.content_box.style,a.msTransform=a.webkitTransform=a.transform=\"scale(\"+this.cur_scale.toFixed(3)+\")\");a=this.page.style;a.height=this.original_height*this.cur_scale+\"px\";a.width=this.original_width*this.cur_scale+\n\"px\"},view_position:function(){var a=this.page,b=a.parentNode;return[b.scrollLeft-a.offsetLeft-a.clientLeft,b.scrollTop-a.offsetTop-a.clientTop]},height:function(){return this.page.clientHeight},width:function(){return this.page.clientWidth}};function Viewer(a){this.config=clone_and_extend_objs(DEFAULT_CONFIG,0<arguments.length?a:{});this.pages_loading=[];this.init_before_loading_content();var b=this;document.addEventListener(\"DOMContentLoaded\",function(){b.init_after_loading_content()},!1)}\nViewer.prototype={scale:1,cur_page_idx:0,first_page_idx:0,init_before_loading_content:function(){this.pre_hide_pages()},initialize_radio_button:function(){for(var a=document.getElementsByClassName(CSS_CLASS_NAMES.input_radio),b=0;b<a.length;b++)a[b].addEventListener(\"click\",function(){this.classList.toggle(\"checked\")})},init_after_loading_content:function(){this.sidebar=document.getElementById(this.config.sidebar_id);this.outline=document.getElementById(this.config.outline_id);this.container=document.getElementById(this.config.container_id);\nthis.loading_indicator=document.getElementsByClassName(this.config.loading_indicator_cls)[0];for(var a=!0,b=this.outline.childNodes,c=0,e=b.length;c<e;++c)if(\"ul\"===b[c].nodeName.toLowerCase()){a=!1;break}a||this.sidebar.classList.add(\"opened\");this.find_pages();if(0!=this.pages.length){disable_dragstart(document.getElementsByClassName(CSS_CLASS_NAMES.background_image));this.config.key_handler&&this.register_key_handler();var h=this;this.config.hashchange_handler&&window.addEventListener(\"hashchange\",\nfunction(a){h.navigate_to_dest(document.location.hash.substring(1))},!1);this.config.view_history_handler&&window.addEventListener(\"popstate\",function(a){a.state&&h.navigate_to_dest(a.state)},!1);this.container.addEventListener(\"scroll\",function(){h.update_page_idx();h.schedule_render(!0)},!1);[this.container,this.outline].forEach(function(a){a.addEventListener(\"click\",h.link_handler.bind(h),!1)});this.initialize_radio_button();this.render()}},find_pages:function(){for(var a=[],b={},c=this.container.childNodes,\ne=0,h=c.length;e<h;++e){var d=c[e];d.nodeType===Node.ELEMENT_NODE&&d.classList.contains(CSS_CLASS_NAMES.page_frame)&&(d=new Page(d),a.push(d),b[d.num]=a.length-1)}this.pages=a;this.page_map=b},load_page:function(a,b,c){var e=this.pages;if(!(a>=e.length||(e=e[a],e.loaded||this.pages_loading[a]))){var e=e.page,h=e.getAttribute(\"data-page-url\");if(h){this.pages_loading[a]=!0;var d=e.getElementsByClassName(this.config.loading_indicator_cls)[0];\"undefined\"===typeof d&&(d=this.loading_indicator.cloneNode(!0),\nd.classList.add(\"active\"),e.appendChild(d));var f=this,g=new XMLHttpRequest;g.open(\"GET\",h,!0);g.onload=function(){if(200===g.status||0===g.status){var b=document.createElement(\"div\");b.innerHTML=g.responseText;for(var d=null,b=b.childNodes,e=0,h=b.length;e<h;++e){var p=b[e];if(p.nodeType===Node.ELEMENT_NODE&&p.classList.contains(CSS_CLASS_NAMES.page_frame)){d=p;break}}b=f.pages[a];f.container.replaceChild(d,b.page);b=new Page(d);f.pages[a]=b;b.hide();b.rescale(f.scale);disable_dragstart(d.getElementsByClassName(CSS_CLASS_NAMES.background_image));\nf.schedule_render(!1);c&&c(b)}delete f.pages_loading[a]};g.send(null)}void 0===b&&(b=this.config.preload_pages);0<--b&&(f=this,setTimeout(function(){f.load_page(a+1,b)},0))}},pre_hide_pages:function(){var a=\"@media screen{.\"+CSS_CLASS_NAMES.page_content_box+\"{display:none;}}\",b=document.createElement(\"style\");b.styleSheet?b.styleSheet.cssText=a:b.appendChild(document.createTextNode(a));document.head.appendChild(b)},render:function(){for(var a=this.container,b=a.scrollTop,c=a.clientHeight,a=b-c,b=\nb+c+c,c=this.pages,e=0,h=c.length;e<h;++e){var d=c[e],f=d.page,g=f.offsetTop+f.clientTop,f=g+f.clientHeight;g<=b&&f>=a?d.loaded?d.show():this.load_page(e):d.hide()}},update_page_idx:function(){var a=this.pages,b=a.length;if(!(2>b)){for(var c=this.container,e=c.scrollTop,c=e+c.clientHeight,h=-1,d=b,f=d-h;1<f;){var g=h+Math.floor(f/2),f=a[g].page;f.offsetTop+f.clientTop+f.clientHeight>=e?d=g:h=g;f=d-h}this.first_page_idx=d;for(var g=h=this.cur_page_idx,k=0;d<b;++d){var f=a[d].page,l=f.offsetTop+f.clientTop,\nf=f.clientHeight;if(l>c)break;f=(Math.min(c,l+f)-Math.max(e,l))/f;if(d===h&&Math.abs(f-1)<=EPS){g=h;break}f>k&&(k=f,g=d)}this.cur_page_idx=g}},schedule_render:function(a){if(void 0!==this.render_timer){if(!a)return;clearTimeout(this.render_timer)}var b=this;this.render_timer=setTimeout(function(){delete b.render_timer;b.render()},this.config.render_timeout)},register_key_handler:function(){var a=this;window.addEventListener(\"DOMMouseScroll\",function(b){if(b.ctrlKey){b.preventDefault();var c=a.container,\ne=c.getBoundingClientRect(),c=[b.clientX-e.left-c.clientLeft,b.clientY-e.top-c.clientTop];a.rescale(Math.pow(a.config.scale_step,b.detail),!0,c)}},!1);window.addEventListener(\"keydown\",function(b){var c=!1,e=b.ctrlKey||b.metaKey,h=b.altKey;switch(b.keyCode){case 61:case 107:case 187:e&&(a.rescale(1/a.config.scale_step,!0),c=!0);break;case 173:case 109:case 189:e&&(a.rescale(a.config.scale_step,!0),c=!0);break;case 48:e&&(a.rescale(0,!1),c=!0);break;case 33:h?a.scroll_to(a.cur_page_idx-1):a.container.scrollTop-=\na.container.clientHeight;c=!0;break;case 34:h?a.scroll_to(a.cur_page_idx+1):a.container.scrollTop+=a.container.clientHeight;c=!0;break;case 35:a.container.scrollTop=a.container.scrollHeight;c=!0;break;case 36:a.container.scrollTop=0,c=!0}c&&b.preventDefault()},!1)},rescale:function(a,b,c){var e=this.scale;this.scale=a=0===a?1:b?e*a:a;c||(c=[0,0]);b=this.container;c[0]+=b.scrollLeft;c[1]+=b.scrollTop;for(var h=this.pages,d=h.length,f=this.first_page_idx;f<d;++f){var g=h[f].page;if(g.offsetTop+g.clientTop>=\nc[1])break}g=f-1;0>g&&(g=0);var g=h[g].page,k=g.clientWidth,f=g.clientHeight,l=g.offsetLeft+g.clientLeft,m=c[0]-l;0>m?m=0:m>k&&(m=k);k=g.offsetTop+g.clientTop;c=c[1]-k;0>c?c=0:c>f&&(c=f);for(f=0;f<d;++f)h[f].rescale(a);b.scrollLeft+=m/e*a+g.offsetLeft+g.clientLeft-m-l;b.scrollTop+=c/e*a+g.offsetTop+g.clientTop-c-k;this.schedule_render(!0)},fit_width:function(){var a=this.cur_page_idx;this.rescale(this.container.clientWidth/this.pages[a].width(),!0);this.scroll_to(a)},fit_height:function(){var a=this.cur_page_idx;\nthis.rescale(this.container.clientHeight/this.pages[a].height(),!0);this.scroll_to(a)},get_containing_page:function(a){for(;a;){if(a.nodeType===Node.ELEMENT_NODE&&a.classList.contains(CSS_CLASS_NAMES.page_frame)){a=get_page_number(a);var b=this.page_map;return a in b?this.pages[b[a]]:null}a=a.parentNode}return null},link_handler:function(a){var b=a.target,c=b.getAttribute(\"data-dest-detail\");if(c){if(this.config.view_history_handler)try{var e=this.get_current_view_hash();window.history.replaceState(e,\n\"\",\"#\"+e);window.history.pushState(c,\"\",\"#\"+c)}catch(h){}this.navigate_to_dest(c,this.get_containing_page(b));a.preventDefault()}},navigate_to_dest:function(a,b){try{var c=JSON.parse(a)}catch(e){return}if(c instanceof Array){var h=c[0],d=this.page_map;if(h in d){for(var f=d[h],h=this.pages[f],d=2,g=c.length;d<g;++d){var k=c[d];if(null!==k&&\"number\"!==typeof k)return}for(;6>c.length;)c.push(null);var g=b||this.pages[this.cur_page_idx],d=g.view_position(),d=transform(g.ictm,[d[0],g.height()-d[1]]),\ng=this.scale,l=[0,0],m=!0,k=!1,n=this.scale;switch(c[1]){case \"XYZ\":l=[null===c[2]?d[0]:c[2]*n,null===c[3]?d[1]:c[3]*n];g=c[4];if(null===g||0===g)g=this.scale;k=!0;break;case \"Fit\":case \"FitB\":l=[0,0];k=!0;break;case \"FitH\":case \"FitBH\":l=[0,null===c[2]?d[1]:c[2]*n];k=!0;break;case \"FitV\":case \"FitBV\":l=[null===c[2]?d[0]:c[2]*n,0];k=!0;break;case \"FitR\":l=[c[2]*n,c[5]*n],m=!1,k=!0}if(k){this.rescale(g,!1);var p=this,c=function(a){l=transform(a.ctm,l);m&&(l[1]=a.height()-l[1]);p.scroll_to(f,l)};h.loaded?\nc(h):(this.load_page(f,void 0,c),this.scroll_to(f))}}}},scroll_to:function(a,b){var c=this.pages;if(!(0>a||a>=c.length)){c=c[a].view_position();void 0===b&&(b=[0,0]);var e=this.container;e.scrollLeft+=b[0]-c[0];e.scrollTop+=b[1]-c[1]}},get_current_view_hash:function(){var a=[],b=this.pages[this.cur_page_idx];a.push(b.num);a.push(\"XYZ\");var c=b.view_position(),c=transform(b.ictm,[c[0],b.height()-c[1]]);a.push(c[0]/this.scale);a.push(c[1]/this.scale);a.push(this.scale);return JSON.stringify(a)}};\npdf2htmlEX.Viewer=Viewer;})();\n</script>\n<script>\ntry{\npdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});\n}catch(e){}\n</script>\n<title></title>\n</head>\n<body>\n<div id=\"sidebar\">\n<div id=\"outline\">\n</div>\n</div>\n<div id=\"page-container\">\n<div id=\"pf1\" class=\"pf w0 h0\" data-page-no=\"1\"><div class=\"pc pc1 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzd344k2Z3Y99/vRGRW9XRPV5GUuORyZtiALgToxjDsez+Cn8LwrR9CgB5CT2ADgg1bMAwbvlgB9gIrGNqVBAsyDGkpyytSEpezw5merso45+eLyMzKzKruaogURS8/HxCN6mZOVf6JjIpvnBMns6oCAACAv6SapwAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecpAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1eQoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH2eAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUn6cAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANXnKQAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8A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\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h2 y2 ff1 fs0 fc0 sc0 ls0 ws2\"> <span class=\"ff2 ls2 v1\">Guide <span class=\"_ _0\"></span><span class=\"ff3 ws0\">d’utilisation<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"_ _0\"></span><span class=\"ls3 ws1\">de<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x2 h3 y3 ff4 fs1 fc0 sc0 ls2 ws2\">is::Engine v4.0.0 </div><div class=\"t m0 x3 h4 y4 ff1 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3 h4 y5 ff1 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3 h4 y6 ff1 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3 h4 y7 ff1 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3 h4 y8 ff1 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3 h4 y9 ff1 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 h4 ya ff1 fs2 fc0 sc0 ls1 ws2\"> <span class=\"ls2 v2\"> </span></div><div class=\"t m0 x3 h4 yb ff1 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3 h4 yc ff1 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x4 h4 yd ff1 fs2 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x1 h5 ye ff1 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 h5 yf ff1 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 h5 y10 ff1 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 h5 y11 ff1 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x5 h6 y12 ff2 fs3 fc0 sc0 ls2 ws2\">© 2025 <span class=\"ff4\">Is Daouda G<span class=\"_ _2\"></span>am<span class=\"_ _2\"></span>es</span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2\" class=\"pf w0 h0\" data-page-no=\"2\"><div class=\"pc pc2 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h7 y13 ff2 fs4 fc2 sc0 ls2 ws3\">Con<span class=\"_ _2\"></span>ten<span class=\"_ _2\"></span>u<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 h8 y14 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> </span><span class=\"ls2 ws3\">I<span class=\"_ _2\"></span>ntro<span class=\"_ _2\"></span>duct<span class=\"_ _2\"></span>ion<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">18<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y15 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">A propos du mot<span class=\"_ _2\"></span>eur<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">18<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y16 ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Structure <span class=\"_ _2\"></span><span class=\"lsb ws7\">du<span class=\"ls2 ws2\"> m<span class=\"_ _2\"></span>oteu<span class=\"_ _2\"></span>r<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">18<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y17 ff2 fs4 fc0 sc0 ls2 ws3\">3.1<span class=\"ff5 ls6 ws2\"> </span>app<span class=\"_ _2\"></span>_sr<span class=\"_ _2\"></span>c<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">18<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y18 ff2 fs4 fc0 sc0 ls2 ws3\">3.2<span class=\"ff5 ls6 ws2\"> </span>is<span class=\"_ _2\"></span>Eng<span class=\"_ _2\"></span>ine<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">19<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y19 ff2 fs4 fc0 sc0 ls2 ws3\">3.3<span class=\"ff5 ls6 ws2\"> </span>as<span class=\"_ _2\"></span>set<span class=\"_ _2\"></span>s<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>..................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">19<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y1a ff2 fs4 fc0 sc0 ls2 ws3\">3.4<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">Fichier ma<span class=\"_ _2\"></span>in.c<span class=\"_ _2\"></span>pp<span class=\"ff1 ls5 ws5\">.................................................................................................................................................................................</span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">19<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y1b ff2 fs4 fc0 sc0 ls2 ws3\">3.4.1<span class=\"ff5 ls7 ws2\"> </span>m<span class=\"_ _2\"></span>ai<span class=\"_ _2\"></span>n<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">19<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y1c ff2 fs4 fc0 sc0 ls2 ws3\">3.4.2<span class=\"ff5 ls7 ws2\"> </span>gam<span class=\"_ _2\"></span>e.p<span class=\"_ _2\"></span>lay<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">19<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y1d ff2 fs4 fc0 sc0 ls2 ws3\">3.4.3<span class=\"ff5 ls7 ws2\"> </span>gam<span class=\"_ _2\"></span>e.b<span class=\"_ _2\"></span>asic<span class=\"_ _2\"></span>SFMLm<span class=\"_ _2\"></span>ain<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">19<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y1e ff2 fs4 fc0 sc0 ls2 ws3\">Dis<span class=\"_ _2\"></span>play<span class=\"_ _2\"></span><span class=\"ff1 ls5 ws5\">...............................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">19<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y1f ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meDi<span class=\"_ _2\"></span>spl<span class=\"_ _2\"></span>ay<span class=\"ff1\"> <span class=\"ls5 ws5\">..................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">19<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y20 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les méthodes pu<span class=\"_ _2\"></span>bliq<span class=\"_ _2\"></span>ues<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">20<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y21 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eDis<span class=\"_ _2\"></span>pla<span class=\"_ _2\"></span>y<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">20<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y22 ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>s<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">20<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y23 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>d<span class=\"_ _2\"></span>ra<span class=\"_ _2\"></span>w<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">20<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y24 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>dr<span class=\"_ _2\"></span>awSc<span class=\"_ _2\"></span>reen<span class=\"_ _2\"></span><span class=\"ff1 ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">20<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y25 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>sh<span class=\"_ _2\"></span>owT<span class=\"_ _2\"></span>empL<span class=\"_ _2\"></span>oadi<span class=\"_ _2\"></span>ng<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">20<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y26 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tOpt<span class=\"_ _2\"></span>ionI<span class=\"_ _2\"></span>n<span class=\"lsc ws8\">dex</span><span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">20<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y27 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tTe<span class=\"_ _2\"></span>xtAn<span class=\"_ _2\"></span>imat<span class=\"_ _2\"></span>ion<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">21<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y28 ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tVi<span class=\"_ _2\"></span>ew<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">21<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y29 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tVi<span class=\"_ _2\"></span>ewVar<span class=\"_ _2\"></span>X<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">21<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y2a ff2 fs4 fc0 sc0 ls2 ws3\">2.10<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Vie<span class=\"_ _2\"></span>wVarY<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">21<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y2b ff2 fs4 fc0 sc0 ls2 ws3\">2.11<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Vie<span class=\"_ _2\"></span>wVarX<span class=\"_ _2\"></span>Y<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">21<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y2c ff2 fs4 fc0 sc0 ls2 ws3\">2.12<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Vie<span class=\"_ _2\"></span>wSiz<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>....................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">22<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y2d ff2 fs4 fc0 sc0 ls2 ws3\">2.13<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Win<span class=\"_ _2\"></span>dowS<span class=\"_ _2\"></span>ize<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">22<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y2e ff2 fs4 fc0 sc0 ls2 ws3\">2.14<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Win<span class=\"_ _2\"></span>dowTi<span class=\"_ _2\"></span>tle<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">22<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y2f ff2 fs4 fc0 sc0 ls2 ws3\">2.15<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Win<span class=\"_ _2\"></span>dowB<span class=\"_ _2\"></span>gCol<span class=\"_ _2\"></span>or<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.......................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">22<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y30 ff2 fs4 fc0 sc0 ls2 ws3\">2.16<span class=\"ff5 ls8 ws2\"> </span>loa<span class=\"_ _2\"></span>dPar<span class=\"_ _2\"></span>entR<span class=\"_ _2\"></span>esou<span class=\"_ _2\"></span>rce<span class=\"_ _2\"></span>s<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">....................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">22<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y31 ff2 fs4 fc0 sc0 ls2 ws3\">2.17<span class=\"ff5 ls8 ws2\"> </span>loa<span class=\"_ _2\"></span>dRes<span class=\"_ _2\"></span>our<span class=\"_ _2\"></span>ces<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">22<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y32 ff2 fs4 fc0 sc0 ls2 ws3\">2.18<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>IsRu<span class=\"_ _2\"></span>nni<span class=\"_ _2\"></span>ng<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">22<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y33 ff2 fs4 fc0 sc0 ls2 ws3\">2.19<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>IsPl<span class=\"_ _2\"></span>ayi<span class=\"_ _2\"></span>ng<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">23<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y34 ff2 fs4 fc0 sc0 ls2 ws3\">2.20<span class=\"ff5 ls8 ws2\"> </span>qu<span class=\"_ _2\"></span>itSc<span class=\"_ _2\"></span>ene<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>.......................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">23<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y35 ff2 fs4 fc0 sc0 ls2 ws3\">2.21<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Sce<span class=\"_ _2\"></span>neSt<span class=\"_ _2\"></span>art<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">23<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y36 ff2 fs4 fc0 sc0 ls2 ws3\">2.22<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Sce<span class=\"_ _2\"></span>neEn<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">23<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y37 ff2 fs4 fc0 sc0 ls2 ws3\">2.23<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Wai<span class=\"_ _2\"></span>tTime<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">..................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">23<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y38 ff2 fs4 fc0 sc0 ls2 ws3\">2.24<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Key<span class=\"_ _2\"></span>Back<span class=\"_ _2\"></span>Press<span class=\"_ _2\"></span>ed<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">23<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y39 ff2 fs4 fc0 sc0 ls2 ws3\">2.25<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Mous<span class=\"_ _2\"></span>eInC<span class=\"_ _2\"></span>olli<span class=\"_ _2\"></span>sio<span class=\"_ _2\"></span>n<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">23<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y3a ff2 fs4 fc0 sc0 ls2 ws3\">2.26<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>IsRu<span class=\"_ _2\"></span>nni<span class=\"_ _2\"></span>ng<span class=\"ff1 ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">23<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y3b ff2 fs4 fc0 sc0 ls2 ws3\">2.27<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>IsPl<span class=\"_ _2\"></span>ayin<span class=\"_ _2\"></span>g<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">24<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y3c ff2 fs4 fc0 sc0 ls2 ws3\">2.28<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Sce<span class=\"_ _2\"></span>neSta<span class=\"_ _2\"></span>rt<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">24<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y3d ff2 fs4 fc0 sc0 ls2 ws3\">2.29<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Sce<span class=\"_ _2\"></span>neEn<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">24<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y3e ff2 fs4 fc0 sc0 ls2 ws3\">2.30<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Win<span class=\"_ _2\"></span>dowIs<span class=\"_ _2\"></span>Act<span class=\"_ _2\"></span>ive<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>.......<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">24<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y3f ff2 fs4 fc0 sc0 ls2 ws3\">2.31<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Key<span class=\"_ _2\"></span>Back<span class=\"_ _2\"></span>Press<span class=\"_ _2\"></span>ed<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">24<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y40 ff2 fs4 fc0 sc0 ls2 ws3\">2.32<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Vie<span class=\"_ _2\"></span>w<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">24<span class=\"ls2 ws2\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf11\" data-dest-detail='[17,\"XYZ\",33,773,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:784.450000px;width:492.200000px;height:12.340000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf11\" data-dest-detail='[17,\"XYZ\",33,712,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:767.020000px;width:492.350000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf11\" data-dest-detail='[17,\"XYZ\",33,563,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:748.980000px;width:492.450000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf11\" data-dest-detail='[17,\"XYZ\",33,279,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:731.540000px;width:481.300000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,738,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:714.110000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,703,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:696.120000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,655,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:678.630000px;width:481.450000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,609,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.600000px;bottom:660.650000px;width:470.300000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,466,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.600000px;bottom:643.210000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,370,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.600000px;bottom:625.780000px;width:470.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf12\" data-dest-detail='[18,\"XYZ\",33,214,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:607.740000px;width:514.350000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,782,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:572.870000px;width:492.300000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,759,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:554.880000px;width:481.400000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,649,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:537.440000px;width:481.450000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,515,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:519.960000px;width:481.200000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,291,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:484.540000px;width:481.300000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf13\" data-dest-detail='[19,\"XYZ\",33,162,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:466.550000px;width:481.350000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf14\" data-dest-detail='[20,\"XYZ\",33,724,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:449.060000px;width:481.200000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf14\" data-dest-detail='[20,\"XYZ\",33,521,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:431.630000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf14\" data-dest-detail='[20,\"XYZ\",33,318,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:413.640000px;width:481.350000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf14\" data-dest-detail='[20,\"XYZ\",33,119,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:378.770000px;width:470.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf15\" data-dest-detail='[21,\"XYZ\",33,771,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:360.730000px;width:470.200000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf15\" data-dest-detail='[21,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:343.290000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf15\" data-dest-detail='[21,\"XYZ\",33,560,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:325.860000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf15\" data-dest-detail='[21,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:307.870000px;width:470.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf16\" data-dest-detail='[22,\"XYZ\",33,713,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:220.090000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf17\" data-dest-detail='[23,\"XYZ\",33,338,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:10.105000px;width:470.100000px;height:18.036000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3\" class=\"pf w0 h0\" data-page-no=\"3\"><div class=\"pc pc3 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">2.33<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Mous<span class=\"_ _2\"></span>ePos<span class=\"_ _2\"></span>Cur<span class=\"_ _2\"></span>rent<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.....................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">24<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y42 ff2 fs4 fc0 sc0 ls2 ws3\">2.34<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Mous<span class=\"_ _2\"></span>ePos<span class=\"_ _2\"></span>Prev<span class=\"_ _2\"></span>iou<span class=\"_ _2\"></span>s<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">24<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls2 ws3\">2.35<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Rend<span class=\"_ _2\"></span>erWi<span class=\"_ _2\"></span>ndow<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">25<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y44 ff2 fs4 fc0 sc0 ls2 ws3\">2.36<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Rend<span class=\"_ _2\"></span>erTe<span class=\"_ _2\"></span>xtu<span class=\"_ _2\"></span>re<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">25<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y45 ff2 fs4 fc0 sc0 ls2 ws3\">2.37<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Gam<span class=\"_ _2\"></span>eSyst<span class=\"_ _2\"></span>em<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">25<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y46 ff2 fs4 fc0 sc0 ls2 ws3\">2.38<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Fon<span class=\"_ _2\"></span>tSyst<span class=\"_ _2\"></span>em<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">25<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y47 ff2 fs4 fc0 sc0 ls2 ws3\">2.39<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Fon<span class=\"_ _2\"></span>tMsg<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">25<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y48 ff2 fs4 fc0 sc0 ls2 ws3\">2.40<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>Butto<span class=\"_ _2\"></span>nSel<span class=\"_ _2\"></span>ect<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">25<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y49 ff2 fs4 fc0 sc0 ls2 ws3\">2.41<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Opt<span class=\"_ _2\"></span>ionIn<span class=\"_ _2\"></span>dex<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">25<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls2 ws3\">2.42<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Sce<span class=\"_ _2\"></span>neWi<span class=\"_ _2\"></span>dth<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">25<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4b ff2 fs4 fc0 sc0 ls2 ws3\">2.43<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Sce<span class=\"_ _2\"></span>neHe<span class=\"_ _2\"></span>ight<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">26<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4c ff2 fs4 fc0 sc0 ls2 ws3\">2.44<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Del<span class=\"_ _2\"></span>taTi<span class=\"_ _2\"></span>me<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">26<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4d ff2 fs4 fc0 sc0 ls2 ws3\">2.45<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>DELT<span class=\"_ _2\"></span>A_TI<span class=\"_ _2\"></span>ME<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">............................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">26<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y4e ff2 fs4 fc0 sc0 ls2 ws3\">2.46<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>Butto<span class=\"_ _2\"></span>nSel<span class=\"_ _2\"></span>ect<span class=\"_ _2\"></span>Scale<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">26<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4f ff2 fs4 fc0 sc0 ls2 ws3\">2.47<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Vie<span class=\"_ _2\"></span>wX<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">26<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y50 ff2 fs4 fc0 sc0 ls2 ws3\">2.48<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Vie<span class=\"_ _2\"></span>wY<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">26<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y51 ff2 fs4 fc0 sc0 ls2 ws3\">2.49<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Vie<span class=\"_ _2\"></span>wW<span class=\"ff1 ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">26<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y52 ff2 fs4 fc0 sc0 ls2 ws3\">2.50<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Vie<span class=\"_ _2\"></span>wH<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.......................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">26<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y53 ff2 fs4 fc0 sc0 ls2 ws3\">2.51<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Mous<span class=\"_ _2\"></span>eIn<span class=\"_ _2\"></span>Coll<span class=\"_ _2\"></span>isio<span class=\"_ _2\"></span>n<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">27<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y54 ff2 fs4 fc0 sc0 ls2 ws3\">2.52<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Mous<span class=\"_ _2\"></span>eCur<span class=\"_ _2\"></span>ren<span class=\"_ _2\"></span>tEqu<span class=\"_ _2\"></span>alTo<span class=\"_ _2\"></span>Prev<span class=\"_ _2\"></span>ious<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">..............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">27<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y55 ff2 fs4 fc0 sc0 ls2 ws3\">2.53<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>BgC<span class=\"_ _2\"></span>olor<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">27<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y56 ff2 fs4 fc0 sc0 ls2 ws3\">2.54<span class=\"ff5 ls8 ws2\"> </span>inV<span class=\"_ _2\"></span>iewR<span class=\"_ _2\"></span>ec<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>......................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">27<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y57 ff2 fs4 fc0 sc0 ls2 ws3\">2.55<span class=\"ff5 ls8 ws2\"> </span>mou<span class=\"_ _2\"></span>seC<span class=\"_ _2\"></span>olli<span class=\"_ _2\"></span>sion<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..............................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">27<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y58 ff2 fs4 fc0 sc0 ls2 ws3\">2.56<span class=\"ff5 ls8 ws2\"> </span>SDM<span class=\"_ _2\"></span>man<span class=\"_ _2\"></span>ageS<span class=\"_ _2\"></span>cene<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">28<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y59 ff2 fs4 fc0 sc0 ls2 ws3\">2.57<span class=\"ff5 ls8 ws2\"> </span>SDM<span class=\"_ _2\"></span>man<span class=\"_ _2\"></span>ageS<span class=\"_ _2\"></span>cene<span class=\"_ _2\"></span>Even<span class=\"_ _2\"></span>ts<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..............................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">28<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5a ff2 fs4 fc0 sc0 ls2 ws3\">2.58<span class=\"ff5 ls8 ws2\"> </span>SDM<span class=\"_ _2\"></span>man<span class=\"_ _2\"></span>ageS<span class=\"_ _2\"></span>cene<span class=\"_ _2\"></span>MsgAn<span class=\"_ _2\"></span>swe<span class=\"_ _2\"></span>rs<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">....................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">28<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5b ff2 fs4 fc0 sc0 ls2 ws3\">2.59<span class=\"ff5 ls8 ws2\"> </span>SDM<span class=\"_ _2\"></span>call<span class=\"_ _2\"></span>Obj<span class=\"_ _2\"></span>ects<span class=\"_ _2\"></span>Event<span class=\"_ _2\"></span>s<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">28<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5c ff2 fs4 fc0 sc0 ls2 ws3\">2.60<span class=\"ff5 lsd ws2\"> </span>SDM<span class=\"_ _2\"></span>st<span class=\"_ _2\"></span>ep<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">28<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5d ff2 fs4 fc0 sc0 ls2 ws3\">2.61<span class=\"ff5 ls8 ws2\"> </span>SDM<span class=\"_ _2\"></span>draw<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">29<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5e ff2 fs4 fc0 sc0 ls2 ws3\">2.62<span class=\"ff5 ls8 ws2\"> </span>cre<span class=\"_ _2\"></span>ateS<span class=\"_ _2\"></span>pri<span class=\"_ _2\"></span>te<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">29<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5f ff2 fs4 fc0 sc0 ls2 ws3\">2.63<span class=\"ff5 ls8 ws2\"> </span>GSM<span class=\"_ _2\"></span>pla<span class=\"_ _2\"></span>ySou<span class=\"_ _2\"></span>nd<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">29<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y60 ff2 fs4 fc0 sc0 ls2 ws3\">2.64<span class=\"ff5 ls8 ws2\"> </span>GSM<span class=\"_ _2\"></span>pla<span class=\"_ _2\"></span>yMus<span class=\"_ _2\"></span>ic<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>...............................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">29<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y61 ff2 fs4 fc0 sc0 ls2 ws3\">2.65<span class=\"ff5 ls8 ws2\"> </span>GRM<span class=\"_ _2\"></span>use<span class=\"_ _2\"></span>Game<span class=\"_ _2\"></span>Syst<span class=\"_ _2\"></span>emFo<span class=\"_ _2\"></span>nt<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">29<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y62 ff2 fs4 fc0 sc0 ls2 ws3\">2.66<span class=\"ff5 lsd ws2\"> </span>GRM<span class=\"_ _2\"></span>use<span class=\"_ _2\"></span>Game<span class=\"_ _2\"></span>Syst<span class=\"_ _2\"></span>emTe<span class=\"_ _2\"></span>xture<span class=\"_ _2\"></span><span class=\"ff1 ls5 ws5\">........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">29<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y63 ff2 fs4 fc0 sc0 ls2 ws3\">2.67<span class=\"ff5 ls8 ws2\"> </span>GSM<span class=\"_ _2\"></span>useG<span class=\"_ _2\"></span>ameS<span class=\"_ _2\"></span>yst<span class=\"_ _2\"></span>emS<span class=\"_ _2\"></span>ound<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">29<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y64 ff2 fs4 fc0 sc0 ls2 ws3\">2.68<span class=\"ff5 ls8 ws2\"> </span>GSM<span class=\"_ _2\"></span>useG<span class=\"_ _2\"></span>ameS<span class=\"_ _2\"></span>yst<span class=\"_ _2\"></span>emMu<span class=\"_ _2\"></span>sic<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>...........................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">30<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y65 ff2 fs4 fc0 sc0 ls2 ws3\">2.69<span class=\"ff5 lsd ws2\"> </span>GRM<span class=\"_ _2\"></span>use<span class=\"_ _2\"></span>Game<span class=\"_ _2\"></span>Syst<span class=\"_ _2\"></span>emRe<span class=\"_ _2\"></span>sour<span class=\"_ _2\"></span>ces<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">...................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">30<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y66 ff2 fs4 fc0 sc0 ls2 ws3\">2.70<span class=\"ff5 ls8 ws2\"> </span>sh<span class=\"_ _2\"></span>owMes<span class=\"_ _2\"></span>sag<span class=\"_ _2\"></span>eBox<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">30<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y67 ff2 fs4 fc0 sc0 ls2 ws3\">2.71<span class=\"ff5 ls8 ws2\"> </span>con<span class=\"_ _2\"></span>tro<span class=\"_ _2\"></span>lEven<span class=\"_ _2\"></span>tFoc<span class=\"_ _2\"></span>usCl<span class=\"_ _2\"></span>osi<span class=\"_ _2\"></span>ng<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">............................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">30<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y68 ff2 fs4 fc0 sc0 ls2 ws3\">2.72<span class=\"ff5 ls8 ws2\"> </span><span class=\"ws2\">Les autres m<span class=\"_ _2\"></span>eth<span class=\"_ _2\"></span>odes<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">30<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y69 ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Éléments <span class=\"_ _4\"></span>prot<span class=\"_ _2\"></span>égés<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lse ws9\">30<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6a ff2 fs4 fc0 sc0 ls2 ws3\">3.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Msg<span class=\"_ _2\"></span>Answ<span class=\"_ _2\"></span>er<span class=\"ff1\"> <span class=\"ls5 ws5\">..............................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lse ws9\">30<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">3.2<span class=\"ff5 ls6 ws2\"> </span>up<span class=\"_ _2\"></span>date<span class=\"_ _2\"></span>Msg<span class=\"_ _2\"></span>Box<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">31<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6c ff2 fs4 fc0 sc0 ls2 ws3\">3.3<span class=\"ff5 ls6 ws2\"> </span>up<span class=\"_ _2\"></span>date<span class=\"_ _2\"></span>Time<span class=\"_ _2\"></span>Wait<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">31<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6d ff2 fs4 fc0 sc0 ls2 ws3\">3.4<span class=\"ff5 ls6 ws2\"> </span>dr<span class=\"_ _2\"></span>awMs<span class=\"_ _2\"></span>gBo<span class=\"_ _2\"></span>x<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">31<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff6 fs4 fc0 sc0 ls2 ws2\">SDM (Step <span class=\"_ _2\"></span>and Draw M<span class=\"_ _2\"></span>anage<span class=\"_ _2\"></span>r)<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">31<span class=\"ls2 ws2\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf17\" data-dest-detail='[23,\"XYZ\",33,244,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:800.150000px;width:470.050000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf17\" data-dest-detail='[23,\"XYZ\",33,150,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:782.720000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf18\" data-dest-detail='[24,\"XYZ\",111,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:764.730000px;width:470.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf18\" data-dest-detail='[24,\"XYZ\",33,713,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:747.290000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf18\" data-dest-detail='[24,\"XYZ\",33,619,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:729.810000px;width:470.150000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf19\" data-dest-detail='[25,\"XYZ\",33,619,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:588.620000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1a\" data-dest-detail='[26,\"XYZ\",33,525,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:429.940000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1a\" data-dest-detail='[26,\"XYZ\",33,431,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:411.900000px;width:470.200000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1b\" data-dest-detail='[27,\"XYZ\",33,170,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:341.610000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1b\" data-dest-detail='[27,\"XYZ\",33,76,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.750000px;bottom:324.120000px;width:469.900000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1c\" data-dest-detail='[28,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:288.700000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1c\" data-dest-detail='[28,\"XYZ\",33,533,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:270.710000px;width:470.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1c\" data-dest-detail='[28,\"XYZ\",33,439,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:253.230000px;width:470.150000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1d\" data-dest-detail='[29,\"XYZ\",33,337,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:114.190000px;width:470.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1e\" data-dest-detail='[30,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:61.279000px;width:481.200000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1e\" data-dest-detail='[30,\"XYZ\",33,547,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:43.842000px;width:481.100000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1e\" data-dest-detail='[30,\"XYZ\",33,311,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:8.419900px;width:514.200000px;height:17.436100px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4\" class=\"pf w0 h0\" data-page-no=\"4\"><div class=\"pc pc4 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class S<span class=\"_ _2\"></span>DM<span class=\"_ _4\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">31<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6f ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments publics <span class=\"lsc ws8\">de</span> S<span class=\"_ _2\"></span>DM<span class=\"_ _4\"></span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">31<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>SDM<span class=\"_ _2\"></span>scene<span class=\"_ _2\"></span>Obje<span class=\"_ _2\"></span>cts<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">..........................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">31<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y44 ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>SD<span class=\"_ _2\"></span>Mget<span class=\"_ _2\"></span>Obje<span class=\"_ _2\"></span>ct<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">32<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y70 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>SD<span class=\"_ _2\"></span>MaddS<span class=\"_ _2\"></span>cen<span class=\"_ _2\"></span>eObj<span class=\"_ _2\"></span>ect<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..........................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">32<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y46 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>SD<span class=\"_ _2\"></span>MaddS<span class=\"_ _2\"></span>pri<span class=\"_ _2\"></span>te<span class=\"ff1 ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">32<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y71 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>SD<span class=\"_ _2\"></span>Mset<span class=\"_ _2\"></span>ObjD<span class=\"_ _2\"></span>epth<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">32<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y72 ff6 fs4 fc0 sc0 ls2 ws2\">Game So<span class=\"_ _2\"></span>und<span class=\"ff1\"> <span class=\"ls5 ws5\">......................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">32<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y73 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meS<span class=\"_ _2\"></span>ound<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y74 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments publics <span class=\"lsc ws8\">de</span> Ga<span class=\"_ _2\"></span>meS<span class=\"_ _2\"></span>oun<span class=\"_ _2\"></span>d<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>.....................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y4b ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eSo<span class=\"_ _2\"></span>und<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">........................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y4c ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>lo<span class=\"_ _2\"></span>adRes<span class=\"_ _2\"></span>our<span class=\"_ _2\"></span>ces<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y75 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSo<span class=\"_ _2\"></span>undBu<span class=\"_ _2\"></span>ffer<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4e ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSo<span class=\"_ _2\"></span>und<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4f ff6 fs4 fc0 sc0 ls2 ws2\">Game Mus<span class=\"_ _2\"></span>ic<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y76 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meMu<span class=\"_ _2\"></span>sic<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.....................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y77 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments publics <span class=\"lsc ws8\">de</span> Ga<span class=\"_ _2\"></span>meM<span class=\"_ _2\"></span>usi<span class=\"_ _2\"></span>c<span class=\"ff1\"> <span class=\"ls5 ws5\">.....................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y52 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eMu<span class=\"_ _2\"></span>sic<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">33<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y78 ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>lo<span class=\"_ _2\"></span>adRes<span class=\"_ _2\"></span>our<span class=\"_ _2\"></span>ces<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">34<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y79 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tMus<span class=\"_ _2\"></span>ic<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.............................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">34<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y55 ff2 fs4 fc0 sc0 ls2 ws2\">GSM (Game Sound <span class=\"_ _2\"></span>Mana<span class=\"_ _2\"></span>ger)<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">34<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7a ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class G<span class=\"_ _2\"></span>SM<span class=\"_ _4\"></span><span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">34<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y57 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments publics <span class=\"lsc ws8\">de</span> G<span class=\"_ _2\"></span>SM<span class=\"_ _4\"></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">34<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y7b ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">Les Conteneurs du GS<span class=\"_ _4\"></span>M<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>.....<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">34<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y7c ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>MaddS<span class=\"_ _2\"></span>ou<span class=\"_ _2\"></span>nd<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">34<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5a ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>MaddS<span class=\"_ _2\"></span>ou<span class=\"_ _2\"></span>ndOb<span class=\"_ _2\"></span>ject<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">34<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7d ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>MaddM<span class=\"_ _2\"></span>us<span class=\"_ _2\"></span>ic<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>.....................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">35<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7e ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>MaddM<span class=\"_ _2\"></span>us<span class=\"_ _2\"></span>icOb<span class=\"_ _2\"></span>ject<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>..........................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">35<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5d ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>Mpau<span class=\"_ _2\"></span>seS<span class=\"_ _2\"></span>ound<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">35<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7f ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>Msto<span class=\"_ _2\"></span>pSou<span class=\"_ _2\"></span>nd<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">35<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5f ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>Mpau<span class=\"_ _2\"></span>seMu<span class=\"_ _2\"></span>sic<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>.................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">35<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y80 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>Msto<span class=\"_ _2\"></span>pMus<span class=\"_ _2\"></span>ic<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>....................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">35<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y81 ff2 fs4 fc0 sc0 ls2 ws3\">2.10<span class=\"ff5 ls8 ws2\"> </span>GSM<span class=\"_ _2\"></span>del<span class=\"_ _2\"></span>eteS<span class=\"_ _2\"></span>ound<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">...........................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">35<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y62 ff2 fs4 fc0 sc0 ls2 ws3\">2.11<span class=\"ff5 ls8 ws2\"> </span>GSM<span class=\"_ _2\"></span>del<span class=\"_ _2\"></span>eteMu<span class=\"_ _2\"></span>sic<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">36<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y82 ff2 fs4 fc0 sc0 ls2 ws3\">2.12<span class=\"ff5 ls8 ws2\"> </span>GSM<span class=\"_ _2\"></span>getS<span class=\"_ _2\"></span>oun<span class=\"_ _2\"></span>d<span class=\"ff1 ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">36<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y83 ff2 fs4 fc0 sc0 ls2 ws3\">2.13<span class=\"ff5 ls8 ws2\"> </span>GSM<span class=\"_ _2\"></span>getM<span class=\"_ _2\"></span>usic<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">36<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y84 ff2 fs4 fc0 sc0 ls2 ws3\">2.14<span class=\"ff5 ls8 ws2\"> </span><span class=\"ws2\">Les autres m<span class=\"_ _2\"></span>eth<span class=\"_ _2\"></span>odes<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">36<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y85 ff6 fs4 fc0 sc0 ls2 ws2\">Game Te<span class=\"_ _2\"></span>xture<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"ls5 ws5\">....................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">36<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y86 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meT<span class=\"_ _2\"></span>extu<span class=\"_ _2\"></span>re<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">36<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y68 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments publics <span class=\"lsc ws8\">de</span> Ga<span class=\"_ _2\"></span>meT<span class=\"_ _2\"></span>ext<span class=\"_ _2\"></span>ure<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>..................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y87 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eTe<span class=\"_ _2\"></span>xtu<span class=\"_ _2\"></span>re<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y3c ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>lo<span class=\"_ _2\"></span>adRes<span class=\"_ _2\"></span>our<span class=\"_ _2\"></span>ces<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tTe<span class=\"_ _2\"></span>xture<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..........................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y88 ff6 fs4 fc0 sc0 ls2 ws2\">Game F<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>t<span class=\"ff1\"> <span class=\"ls5 ws5\">.........................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y89 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meF<span class=\"_ _2\"></span>ont<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments publics <span class=\"lsc ws8\">de</span> Ga<span class=\"_ _2\"></span>meF<span class=\"_ _2\"></span>ont<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div></div><a class=\"l\" href=\"#pf1e\" data-dest-detail='[30,\"XYZ\",33,159,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:782.170000px;width:492.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1f\" data-dest-detail='[31,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:747.290000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1f\" data-dest-detail='[31,\"XYZ\",33,365,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:711.820000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1f\" data-dest-detail='[31,\"XYZ\",33,242,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:693.840000px;width:481.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf1f\" data-dest-detail='[31,\"XYZ\",33,92,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:676.400000px;width:514.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:640.930000px;width:492.050000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,678,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:623.490000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,582,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:606.050000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,277,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:553.150000px;width:514.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,138,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:517.720000px;width:492.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf20\" data-dest-detail='[32,\"XYZ\",33,115,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:500.290000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:482.250000px;width:481.100000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:447.380000px;width:514.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,411,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:411.960000px;width:492.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,268,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:376.480000px;width:481.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf21\" data-dest-detail='[33,\"XYZ\",33,104,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:359.050000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:341.060000px;width:481.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:323.570000px;width:481.100000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:306.140000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:288.150000px;width:481.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,278,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:270.710000px;width:480.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,173,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:253.280000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf22\" data-dest-detail='[34,\"XYZ\",33,90,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:235.240000px;width:470.150000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf23\" data-dest-detail='[35,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:217.810000px;width:470.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf23\" data-dest-detail='[35,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:202.520000px;width:470.150000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf23\" data-dest-detail='[35,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:184.530000px;width:470.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf23\" data-dest-detail='[35,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:167.100000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf24\" data-dest-detail='[36,\"XYZ\",33,795,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:114.190000px;width:492.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf24\" data-dest-detail='[36,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:96.201000px;width:481.200000px;height:17.989000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf24\" data-dest-detail='[36,\"XYZ\",33,687,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:78.765000px;width:481.100000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf24\" data-dest-detail='[36,\"XYZ\",33,465,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:43.292000px;width:514.100000px;height:17.987000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf24\" data-dest-detail='[36,\"XYZ\",33,326,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:8.419900px;width:492.050000px;height:17.436100px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5\" class=\"pf w0 h0\" data-page-no=\"5\"><div class=\"pc pc5 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eFo<span class=\"_ _2\"></span>nt<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y42 ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>lo<span class=\"_ _2\"></span>adRes<span class=\"_ _2\"></span>our<span class=\"_ _2\"></span>ces<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tFo<span class=\"_ _2\"></span>nt<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">37<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y44 ff2 fs4 fc0 sc0 ls2 ws2\">GRM (Graphic Resource Ma<span class=\"_ _2\"></span>nage<span class=\"_ _2\"></span>r)<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>..................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">38<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y45 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class G<span class=\"_ _2\"></span>RM<span class=\"_ _4\"></span><span class=\"ff1\"> <span class=\"ls5 ws5\">................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">38<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y46 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments publics <span class=\"lsb ws7\">du<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> GR<span class=\"_ _2\"></span>M<span class=\"_ _2\"></span><span class=\"ff1 ls5 ws5\">................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">38<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y47 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">Les Conteneurs du GR<span class=\"_ _4\"></span>M<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>....................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">38<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y48 ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>GRM<span class=\"_ _2\"></span>addF<span class=\"_ _2\"></span>ont<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">38<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y49 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>GRM<span class=\"_ _2\"></span>addF<span class=\"_ _2\"></span>ont<span class=\"_ _2\"></span>Obje<span class=\"_ _2\"></span>ct<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">38<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>GRM<span class=\"_ _2\"></span>addT<span class=\"_ _2\"></span>ext<span class=\"_ _2\"></span>ure<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">38<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8a ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>GRM<span class=\"_ _2\"></span>addT<span class=\"_ _2\"></span>ext<span class=\"_ _2\"></span>ureO<span class=\"_ _2\"></span>bjec<span class=\"_ _2\"></span>t<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.......................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">39<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8b ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>GRM<span class=\"_ _2\"></span>get<span class=\"_ _2\"></span>Font<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">39<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4d ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>GRM<span class=\"_ _2\"></span>get<span class=\"_ _2\"></span>Textu<span class=\"_ _2\"></span>re<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">39<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8c ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>GRM<span class=\"_ _2\"></span>del<span class=\"_ _2\"></span>eteF<span class=\"_ _2\"></span>ont<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">39<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4f ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>GRM<span class=\"_ _2\"></span>del<span class=\"_ _2\"></span>eteT<span class=\"_ _2\"></span>extu<span class=\"_ _2\"></span>re<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">39<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y50 ff6 fs4 fc0 sc0 ls2 ws2\">Transition <span class=\"_ _4\"></span>Effec<span class=\"_ _2\"></span>t<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">39<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8d ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Transition Ef<span class=\"_ _2\"></span>fect<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">39<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y52 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les éléments <span class=\"_ _2\"></span>publics <span class=\"lsb ws7\">de</span> <span class=\"_ _2\"></span>Transition Effe<span class=\"_ _2\"></span>ct<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">39<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y53 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">Enum <span class=\"_ _2\"></span>Tra<span class=\"_ _2\"></span>nsit<span class=\"_ _2\"></span>ion<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">39<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y8e ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>Tr<span class=\"_ _2\"></span>ans<span class=\"_ _2\"></span>ition<span class=\"_ _2\"></span>Effe<span class=\"_ _2\"></span>ct<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">40<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y55 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>s<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">40<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y56 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>d<span class=\"_ _2\"></span>ra<span class=\"_ _2\"></span>w<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">40<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y57 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tTy<span class=\"_ _2\"></span>pe<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>...............................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">40<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7b ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tTr<span class=\"_ _2\"></span>ansit<span class=\"_ _2\"></span>ion<span class=\"_ _2\"></span>End<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">...............................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">40<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y59 ff2 fs4 fc0 sc0 ls2 ws3\">Ent<span class=\"_ _2\"></span>it<span class=\"_ _2\"></span>és<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">40<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5a ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ma<span class=\"_ _2\"></span>inOb<span class=\"_ _2\"></span>jec<span class=\"_ _2\"></span>t<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">40<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y5b ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments publics <span class=\"lsc ws8\">de</span> Mai<span class=\"_ _2\"></span>nOb<span class=\"_ _2\"></span>jet<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"ls5 ws5\">.......................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">41<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8f ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Ma<span class=\"_ _2\"></span>inOb<span class=\"_ _2\"></span>ject<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.........................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">41<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y5d ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>in<span class=\"_ _2\"></span>stan<span class=\"_ _2\"></span>ceNu<span class=\"_ _2\"></span>mbe<span class=\"_ _2\"></span>r<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>.................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">41<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5e ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>SDM<span class=\"_ _2\"></span>call<span class=\"_ _2\"></span>Step<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">41<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y90 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>SDM<span class=\"_ _2\"></span>call<span class=\"_ _2\"></span>Draw<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>.................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">41<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y91 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>SDM<span class=\"_ _2\"></span>call<span class=\"_ _2\"></span>Event<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>.................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">42<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y92 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>s<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">42<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y93 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>eve<span class=\"_ _2\"></span>nt<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">42<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y82 ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tXSt<span class=\"_ _2\"></span>art<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>.............................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">42<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y94 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tYSt<span class=\"_ _2\"></span>art<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>.............................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">42<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y95 ff2 fs4 fc0 sc0 ls2 ws3\">2.10<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>XPr<span class=\"_ _2\"></span>eviou<span class=\"_ _2\"></span>s<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>..................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">42<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y96 ff2 fs4 fc0 sc0 ls2 ws3\">2.11<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>YPr<span class=\"_ _2\"></span>eviou<span class=\"_ _2\"></span>s<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>..................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">42<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y97 ff2 fs4 fc0 sc0 ls2 ws3\">2.12<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Star<span class=\"_ _2\"></span>tPo<span class=\"_ _2\"></span>siti<span class=\"_ _2\"></span>on<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.............................................<span class=\"ls2 ws2\"> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">42<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y68 ff2 fs4 fc0 sc0 ls2 ws3\">2.13<span class=\"ff5 ls8 ws2\"> </span>se<span class=\"_ _4\"></span>tX<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">43<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y69 ff2 fs4 fc0 sc0 ls2 ws3\">2.14<span class=\"ff5 ls8 ws2\"> </span>se<span class=\"_ _4\"></span>tY<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">43<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y98 ff2 fs4 fc0 sc0 ls2 ws3\">2.15<span class=\"ff5 ls8 ws2\"> </span>mov<span class=\"_ _2\"></span>eX<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">43<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">2.16<span class=\"ff5 ls8 ws2\"> </span>mov<span class=\"_ _2\"></span>eY<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">43<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6c ff2 fs4 fc0 sc0 ls2 ws3\">2.17<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Pos<span class=\"_ _2\"></span>itio<span class=\"_ _2\"></span>n<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.....................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">43<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6d ff2 fs4 fc0 sc0 ls2 ws3\">2.18<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>iteS<span class=\"_ _2\"></span>cale<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">43<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls2 ws3\">2.19<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Spe<span class=\"_ _2\"></span>ed<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">43<span class=\"ls2 ws2\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf24\" data-dest-detail='[36,\"XYZ\",33,303,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:800.150000px;width:481.000000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf24\" data-dest-detail='[36,\"XYZ\",33,207,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:782.720000px;width:481.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf24\" data-dest-detail='[36,\"XYZ\",33,113,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:764.730000px;width:481.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:747.290000px;width:514.300000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,598,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:711.820000px;width:492.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,468,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.950000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,292,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:658.960000px;width:481.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf25\" data-dest-detail='[37,\"XYZ\",33,186,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:641.480000px;width:481.100000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,771,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:624.040000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:606.050000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:588.620000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:571.180000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:553.150000px;width:481.000000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,243,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:535.710000px;width:513.900000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,105,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:500.290000px;width:492.000000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf26\" data-dest-detail='[38,\"XYZ\",33,82,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:482.850000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf27\" data-dest-detail='[39,\"XYZ\",33,593,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:447.380000px;width:481.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf27\" data-dest-detail='[39,\"XYZ\",33,488,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:429.940000px;width:480.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf27\" data-dest-detail='[39,\"XYZ\",33,406,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:411.960000px;width:481.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf27\" data-dest-detail='[39,\"XYZ\",33,312,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:394.470000px;width:481.100000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf27\" data-dest-detail='[39,\"XYZ\",33,182,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:377.030000px;width:514.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf28\" data-dest-detail='[40,\"XYZ\",33,767,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:341.610000px;width:492.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf28\" data-dest-detail='[40,\"XYZ\",33,745,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:324.170000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf28\" data-dest-detail='[40,\"XYZ\",33,176,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:273.410000px;width:481.000000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf29\" data-dest-detail='[41,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:237.990000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf29\" data-dest-detail='[41,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:219.960000px;width:481.050000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf29\" data-dest-detail='[41,\"XYZ\",33,498,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:202.520000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf29\" data-dest-detail='[41,\"XYZ\",33,406,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:185.080000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf29\" data-dest-detail='[41,\"XYZ\",33,124,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:132.170000px;width:470.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2a\" data-dest-detail='[42,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:43.842000px;width:470.150000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2a\" data-dest-detail='[42,\"XYZ\",33,302,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:25.856000px;width:470.200000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6\" class=\"pf w0 h0\" data-page-no=\"6\"><div class=\"pc pc6 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">2.20<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Hsp<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">43<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6f ff2 fs4 fc0 sc0 ls2 ws3\">2.21<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Vsp<span class=\"ff1 ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">44<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls2 ws3\">2.22<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Ang<span class=\"_ _2\"></span>ular<span class=\"_ _2\"></span>Move<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">44<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y99 ff2 fs4 fc0 sc0 ls2 ws3\">2.23<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Fram<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">44<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y70 ff2 fs4 fc0 sc0 ls2 ws3\">2.24<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Fram<span class=\"_ _2\"></span>eSt<span class=\"_ _2\"></span>art<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">44<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9a ff2 fs4 fc0 sc0 ls2 ws3\">2.25<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Fram<span class=\"_ _2\"></span>eEn<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">44<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y9b ff2 fs4 fc0 sc0 ls2 ws3\">2.26<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eXs<span class=\"_ _2\"></span>cale<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>..............................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">44<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9c ff2 fs4 fc0 sc0 ls2 ws3\">2.27<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eYs<span class=\"_ _2\"></span>cale<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>..............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">44<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y49 ff2 fs4 fc0 sc0 ls2 ws3\">2.28<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eSc<span class=\"_ _2\"></span>ale<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">44<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls2 ws3\">2.29<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eSc<span class=\"_ _2\"></span>aleX<span class=\"_ _2\"></span>_Y<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">45<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4b ff2 fs4 fc0 sc0 ls2 ws3\">2.30<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eAng<span class=\"_ _2\"></span>le<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>...............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">45<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8b ff2 fs4 fc0 sc0 ls2 ws3\">2.31<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>XOf<span class=\"_ _2\"></span>fset<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.......................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">45<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4d ff2 fs4 fc0 sc0 ls2 ws3\">2.32<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>YOf<span class=\"_ _2\"></span>fset<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.......................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">45<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4e ff2 fs4 fc0 sc0 ls2 ws3\">2.33<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>XYO<span class=\"_ _2\"></span>ffse<span class=\"_ _2\"></span>t<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">45<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4f ff2 fs4 fc0 sc0 ls2 ws3\">2.34<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>XYO<span class=\"_ _2\"></span>ffse<span class=\"_ _2\"></span>t<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">45<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9d ff2 fs4 fc0 sc0 ls2 ws3\">2.35<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Tim<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">45<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y51 ff2 fs4 fc0 sc0 ls2 ws3\">2.36<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eAl<span class=\"_ _2\"></span>pha<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">45<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y52 ff2 fs4 fc0 sc0 ls2 ws3\">2.37<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eIn<span class=\"_ _2\"></span>dex<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>...............................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">46<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y78 ff2 fs4 fc0 sc0 ls2 ws3\">2.38<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Mask<span class=\"_ _2\"></span>W<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">46<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y54 ff2 fs4 fc0 sc0 ls2 ws3\">2.39<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Mask<span class=\"_ _2\"></span>H<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">46<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y55 ff2 fs4 fc0 sc0 ls2 ws3\">2.40<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Rect<span class=\"_ _2\"></span>angl<span class=\"_ _2\"></span>eMas<span class=\"_ _2\"></span>k<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">46<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7a ff2 fs4 fc0 sc0 ls2 ws3\">2.41<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Cir<span class=\"_ _2\"></span>cleM<span class=\"_ _2\"></span>ask<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">46<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y57 ff2 fs4 fc0 sc0 ls2 ws3\">2.42<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>IsAc<span class=\"_ _2\"></span>tiv<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">46<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y58 ff2 fs4 fc0 sc0 ls2 ws3\">2.43<span class=\"ff5 ls8 ws2\"> </span>upd<span class=\"_ _2\"></span>ateC<span class=\"_ _2\"></span>olli<span class=\"_ _2\"></span>sio<span class=\"_ _2\"></span>nMask<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.....................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">46<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7c ff2 fs4 fc0 sc0 ls2 ws3\">2.44<span class=\"ff5 ls8 ws2\"> </span>cen<span class=\"_ _2\"></span>terC<span class=\"_ _2\"></span>oll<span class=\"_ _2\"></span>isio<span class=\"_ _2\"></span>nMas<span class=\"_ _2\"></span>k<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">47<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5a ff2 fs4 fc0 sc0 ls2 ws3\">2.45<span class=\"ff5 ls8 ws2\"> </span>upd<span class=\"_ _2\"></span>ateS<span class=\"_ _2\"></span>pri<span class=\"_ _2\"></span>te<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">47<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9e ff2 fs4 fc0 sc0 ls2 ws3\">2.46<span class=\"ff5 ls8 ws2\"> </span>dr<span class=\"_ _4\"></span>aw<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">47<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9f ff2 fs4 fc0 sc0 ls2 ws3\">2.47<span class=\"ff5 ls8 ws2\"> </span>draw<span class=\"_ _2\"></span>Mas<span class=\"_ _2\"></span>k<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">47<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya0 ff2 fs4 fc0 sc0 ls2 ws3\">2.48<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Mask<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">47<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya1 ff2 fs4 fc0 sc0 ls2 ws3\">2.49<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Cir<span class=\"_ _2\"></span>cleM<span class=\"_ _2\"></span>ask<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">47<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya2 ff2 fs4 fc0 sc0 ls2 ws3\">2.50<span class=\"ff5 ls8 ws2\"> </span>ge<span class=\"_ _2\"></span>t<span class=\"_ _2\"></span>X<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">48<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya3 ff2 fs4 fc0 sc0 ls2 ws3\">2.51<span class=\"ff5 ls8 ws2\"> </span>ge<span class=\"_ _2\"></span>t<span class=\"_ _2\"></span>Y<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">48<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya4 ff2 fs4 fc0 sc0 ls2 ws3\">2.52<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>XSt<span class=\"_ _2\"></span>art<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>........................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">48<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y93 ff2 fs4 fc0 sc0 ls2 ws3\">2.53<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>YSt<span class=\"_ _2\"></span>art<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>........................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">48<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya5 ff2 fs4 fc0 sc0 ls2 ws3\">2.54<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>XPre<span class=\"_ _2\"></span>viou<span class=\"_ _2\"></span>s<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">48<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya6 ff2 fs4 fc0 sc0 ls2 ws3\">2.55<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>YPre<span class=\"_ _2\"></span>viou<span class=\"_ _2\"></span>s<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">48<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y95 ff2 fs4 fc0 sc0 ls2 ws3\">2.56<span class=\"ff5 ls8 ws2\"> </span>dis<span class=\"_ _2\"></span>tant<span class=\"_ _2\"></span>ToPo<span class=\"_ _2\"></span>int<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>...............................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">48<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y96 ff2 fs4 fc0 sc0 ls2 ws3\">2.57<span class=\"ff5 ls8 ws2\"> </span>dis<span class=\"_ _2\"></span>tant<span class=\"_ _2\"></span>ToO<span class=\"_ _2\"></span>bject<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">48<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y86 ff2 fs4 fc0 sc0 ls2 ws3\">2.58<span class=\"ff5 ls8 ws2\"> </span>poi<span class=\"_ _2\"></span>ntDi<span class=\"_ _2\"></span>rect<span class=\"_ _2\"></span>ion<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">49<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya7 ff2 fs4 fc0 sc0 ls2 ws3\">2.59<span class=\"ff5 ls8 ws2\"> </span>poi<span class=\"_ _2\"></span>ntDi<span class=\"_ _2\"></span>rect<span class=\"_ _2\"></span>ion<span class=\"_ _2\"></span>Sprit<span class=\"_ _2\"></span>e<span class=\"ff1 ls5 ws5\">......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">49<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 ya8 ff2 fs4 fc0 sc0 ls2 ws3\">2.60<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spee<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">........................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">49<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y6a ff2 fs4 fc0 sc0 ls2 ws3\">2.61<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Hsp<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">49<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">2.62<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Vsp<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">49<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y88 ff2 fs4 fc0 sc0 ls2 ws3\">2.63<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Fra<span class=\"_ _2\"></span>me<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">50<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6d ff2 fs4 fc0 sc0 ls2 ws3\">2.64<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Fra<span class=\"_ _2\"></span>meSt<span class=\"_ _2\"></span>art<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">50<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls2 ws3\">2.65<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Fra<span class=\"_ _2\"></span>meEn<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">50<span class=\"ls2 ws2\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf2a\" data-dest-detail='[42,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:800.150000px;width:470.100000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2b\" data-dest-detail='[43,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:764.680000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2b\" data-dest-detail='[43,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:658.910000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2c\" data-dest-detail='[44,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:641.480000px;width:470.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2c\" data-dest-detail='[44,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:570.580000px;width:470.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2c\" data-dest-detail='[44,\"XYZ\",33,79,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:517.670000px;width:470.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:482.250000px;width:470.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,560,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:464.760000px;width:470.150000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:447.330000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:429.340000px;width:470.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2d\" data-dest-detail='[45,\"XYZ\",33,185,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:394.470000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2e\" data-dest-detail='[46,\"XYZ\",33,630,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:359.000000px;width:470.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2e\" data-dest-detail='[46,\"XYZ\",33,428,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:343.710000px;width:470.150000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2e\" data-dest-detail='[46,\"XYZ\",33,334,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:325.720000px;width:470.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2e\" data-dest-detail='[46,\"XYZ\",33,240,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:308.290000px;width:470.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2e\" data-dest-detail='[46,\"XYZ\",33,135,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:290.250000px;width:470.150000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2f\" data-dest-detail='[47,\"XYZ\",33,220,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:167.050000px;width:470.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf2f\" data-dest-detail='[47,\"XYZ\",33,126,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:149.610000px;width:470.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf30\" data-dest-detail='[48,\"XYZ\",33,756,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:131.570000px;width:470.100000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf30\" data-dest-detail='[48,\"XYZ\",33,555,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:114.140000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf7\" class=\"pf w0 h0\" data-page-no=\"7\"><div class=\"pc pc7 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">2.66<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eXs<span class=\"_ _2\"></span>cale<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..............................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">50<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya9 ff2 fs4 fc0 sc0 ls2 ws3\">2.67<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eYs<span class=\"_ _2\"></span>cale<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..............................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">50<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yaa ff2 fs4 fc0 sc0 ls2 ws3\">2.68<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eSc<span class=\"_ _2\"></span>ale<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">50<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y99 ff2 fs4 fc0 sc0 ls2 ws3\">2.69<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eAng<span class=\"_ _2\"></span>le<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>...............................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">50<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y45 ff2 fs4 fc0 sc0 ls2 ws3\">2.70<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>XOff<span class=\"_ _2\"></span>set<span class=\"ff1 ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">50<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 yab ff2 fs4 fc0 sc0 ls2 ws3\">2.71<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>YOff<span class=\"_ _2\"></span>set<span class=\"ff1 ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">51<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y9b ff2 fs4 fc0 sc0 ls2 ws3\">2.72<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Tim<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">51<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yac ff2 fs4 fc0 sc0 ls2 ws3\">2.73<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Inst<span class=\"_ _2\"></span>anc<span class=\"_ _2\"></span>eId<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">51<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yad ff2 fs4 fc0 sc0 ls2 ws3\">2.74<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Mask<span class=\"_ _2\"></span>W<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>......................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">51<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls2 ws3\">2.75<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Mask<span class=\"_ _2\"></span>H<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">51<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8a ff2 fs4 fc0 sc0 ls2 ws3\">2.76<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>IsAc<span class=\"_ _2\"></span>tiv<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">51<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yae ff2 fs4 fc0 sc0 ls2 ws3\">2.77<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eAl<span class=\"_ _2\"></span>pha<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">51<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4d ff2 fs4 fc0 sc0 ls2 ws3\">2.78<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>eIn<span class=\"_ _2\"></span>dex<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>...............................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">51<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8c ff2 fs4 fc0 sc0 ls2 ws3\">2.79<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>iteWi<span class=\"_ _2\"></span>dth<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">52<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4f ff2 fs4 fc0 sc0 ls2 ws3\">2.80<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>iteH<span class=\"_ _2\"></span>eight<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">52<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9d ff2 fs4 fc0 sc0 ls2 ws3\">2.81<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>iteX<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">52<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8d ff2 fs4 fc0 sc0 ls2 ws3\">2.82<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>iteY<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">52<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y52 ff2 fs4 fc0 sc0 ls2 ws3\">2.83<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Text<span class=\"_ _2\"></span>ureW<span class=\"_ _2\"></span>idth<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">52<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y53 ff2 fs4 fc0 sc0 ls2 ws3\">2.84<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Text<span class=\"_ _2\"></span>ureH<span class=\"_ _2\"></span>eigh<span class=\"_ _2\"></span>t<span class=\"ff1 ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">52<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y8e ff2 fs4 fc0 sc0 ls2 ws3\">2.85<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>iteCe<span class=\"_ _2\"></span>nter<span class=\"_ _2\"></span>X<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">52<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y55 ff2 fs4 fc0 sc0 ls2 ws3\">2.86<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>iteCe<span class=\"_ _2\"></span>nter<span class=\"_ _2\"></span>Y<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">52<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y56 ff2 fs4 fc0 sc0 ls2 ws3\">2.87<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>iteNu<span class=\"_ _2\"></span>mber<span class=\"_ _2\"></span>Sub<span class=\"_ _2\"></span>Imag<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">53<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yaf ff2 fs4 fc0 sc0 ls2 ws3\">2.88<span class=\"ff5 ls8 ws2\"> </span>pla<span class=\"_ _2\"></span>ceMe<span class=\"_ _2\"></span>tti<span class=\"_ _2\"></span>ng<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">53<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb0 ff2 fs4 fc0 sc0 ls2 ws3\">2.89<span class=\"ff5 ls8 ws2\"> </span>inV<span class=\"_ _2\"></span>iewR<span class=\"_ _2\"></span>ec<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>......................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">53<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb1 ff2 fs4 fc0 sc0 ls2 ws3\">2.90<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>ite<span class=\"ff1 ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">53<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 yb2 ff2 fs4 fc0 sc0 ls2 ws3\">2.91<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Fram<span class=\"_ _2\"></span>eLi<span class=\"_ _2\"></span>mit<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">53<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9e ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Autres fonctions de Mai<span class=\"_ _2\"></span>nObj<span class=\"_ _2\"></span>ect<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">53<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yb3 ff2 fs4 fc0 sc0 ls2 ws3\">3.1<span class=\"ff5 ls6 ws2\"> </span>in<span class=\"_ _2\"></span>stan<span class=\"_ _2\"></span>ceEx<span class=\"_ _2\"></span>ist<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">53<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya0 ff2 fs4 fc0 sc0 ls2 ws3\">3.2<span class=\"ff5 ls6 ws2\"> </span>ope<span class=\"_ _2\"></span>rat<span class=\"_ _2\"></span>or()<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">54<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb4 ff2 fs4 fc0 sc0 ls2 ws3\">3.3<span class=\"ff5 ls6 ws2\"> </span>so<span class=\"_ _2\"></span>rtO<span class=\"_ _2\"></span>bjArr<span class=\"_ _2\"></span>ayBy<span class=\"_ _2\"></span>X<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">54<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb5 ff2 fs4 fc0 sc0 ls2 ws3\">3.4<span class=\"ff5 ls6 ws2\"> </span>so<span class=\"_ _2\"></span>rtO<span class=\"_ _2\"></span>bjArr<span class=\"_ _2\"></span>ayBy<span class=\"_ _2\"></span>Dept<span class=\"_ _2\"></span>h<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">54<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya3 ff2 fs4 fc0 sc0 ls2 ws3\">3.5<span class=\"ff5 ls6 ws2\"> </span>ope<span class=\"_ _2\"></span>rat<span class=\"_ _2\"></span>or&lt;<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">54<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb6 ff6 fs4 fc0 sc0 ls2 ws2\">Les formes p<span class=\"_ _2\"></span>our les masques c<span class=\"_ _2\"></span>ollis<span class=\"_ _2\"></span>ions<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">55<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb7 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Rec<span class=\"_ _2\"></span>tan<span class=\"_ _2\"></span>gle<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">55<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y82 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ci<span class=\"_ _2\"></span>rcl<span class=\"_ _2\"></span>e<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">55<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yb8 ff6 fs4 fc0 sc0 ls2 ws2\">Les Classes Parentes de Ma<span class=\"_ _2\"></span>inOb<span class=\"_ _2\"></span>ject<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">55<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y95 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class De<span class=\"_ _2\"></span>pth<span class=\"_ _2\"></span>Obje<span class=\"_ _2\"></span>ct<span class=\"ff1 ls5 ws5\">....................................................................................................................................................................................</span><span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">55<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y96 ff2 fs4 fc0 sc0 ls2 ws3\">1.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Dept<span class=\"_ _2\"></span>h<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lse ws9\">55<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y67 ff2 fs4 fc0 sc0 ls2 ws3\">1.2<span class=\"ff5 ls6 ws2\"> </span>Dep<span class=\"_ _2\"></span>thO<span class=\"_ _2\"></span>bje<span class=\"_ _2\"></span>ct<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">56<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya7 ff2 fs4 fc0 sc0 ls2 ws3\">1.3<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tDep<span class=\"_ _2\"></span>th<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">56<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb9 ff2 fs4 fc0 sc0 ls2 ws3\">1.4<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tDept<span class=\"_ _2\"></span>h<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">56<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y98 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class De<span class=\"_ _2\"></span>str<span class=\"_ _2\"></span>ucti<span class=\"_ _2\"></span>ble<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">56<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Des<span class=\"_ _2\"></span>tru<span class=\"_ _4\"></span>ctible<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">56<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yba ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tDes<span class=\"_ _2\"></span>tro<span class=\"_ _2\"></span>yed<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">56<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybb ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>is<span class=\"_ _2\"></span>Dest<span class=\"_ _2\"></span>roy<span class=\"_ _2\"></span>ed<span class=\"ff1 ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">56<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class V<span class=\"_ _2\"></span>isib<span class=\"_ _2\"></span>ilit<span class=\"_ _2\"></span>y<span class=\"ff1 ls5 ws5\">..........................................................................................................................................................................................</span><span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">57<span class=\"ls2 ws2\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf32\" data-dest-detail='[50,\"XYZ\",33,525,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:659.460000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf32\" data-dest-detail='[50,\"XYZ\",33,431,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:641.480000px;width:470.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:429.890000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,699,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:414.600000px;width:470.150000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,497,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:396.620000px;width:470.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,295,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:361.150000px;width:470.100000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,213,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:343.710000px;width:492.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf34\" data-dest-detail='[52,\"XYZ\",33,190,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:326.270000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf35\" data-dest-detail='[53,\"XYZ\",33,701,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:308.290000px;width:481.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf35\" data-dest-detail='[53,\"XYZ\",33,99,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:255.380000px;width:481.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf36\" data-dest-detail='[54,\"XYZ\",87,643,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:237.940000px;width:514.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf36\" data-dest-detail='[54,\"XYZ\",33,276,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:185.030000px;width:514.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf37\" data-dest-detail='[55,\"XYZ\",33,275,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:61.279000px;width:481.050000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf37\" data-dest-detail='[55,\"XYZ\",33,87,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:26.356000px;width:481.100000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf8\" class=\"pf w0 h0\" data-page-no=\"8\"><div class=\"pc pc8 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">3.1<span class=\"ff5 ls6 ws2\"> </span>Vi<span class=\"_ _2\"></span>sib<span class=\"_ _2\"></span>ilit<span class=\"_ _2\"></span>y<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">57<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y42 ff2 fs4 fc0 sc0 ls2 ws3\">3.2<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tVis<span class=\"_ _2\"></span>ibl<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">57<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls2 ws3\">3.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tVi<span class=\"_ _2\"></span>sibl<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">57<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y99 ff2 fs4 fc0 sc0 ls9 ws4\">4.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class H<span class=\"_ _2\"></span>ealth<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">57<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y45 ff2 fs4 fc0 sc0 ls2 ws3\">4.1<span class=\"ff5 ls6 ws2\"> </span>He<span class=\"_ _2\"></span>alth<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">57<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y46 ff2 fs4 fc0 sc0 ls2 ws3\">4.2<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tHe<span class=\"_ _2\"></span>alth<span class=\"ff1 ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">58<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y47 ff2 fs4 fc0 sc0 ls2 ws3\">4.3<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tMax<span class=\"_ _2\"></span>Healt<span class=\"_ _2\"></span>h<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">58<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yac ff2 fs4 fc0 sc0 ls2 ws3\">4.4<span class=\"ff5 ls6 ws2\"> </span>add<span class=\"_ _2\"></span>Heal<span class=\"_ _2\"></span>th<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">58<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y49 ff2 fs4 fc0 sc0 ls2 ws3\">4.5<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tHe<span class=\"_ _2\"></span>alth<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">58<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls2 ws3\">4.6<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tMaxH<span class=\"_ _4\"></span>ealth<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.....................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">58<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4b ff2 fs4 fc0 sc0 ls9 ws4\">5.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class H<span class=\"_ _2\"></span>urtE<span class=\"_ _2\"></span>ffect<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">58<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y8b ff2 fs4 fc0 sc0 ls2 ws3\">5.1<span class=\"ff5 ls6 ws2\"> </span>Hu<span class=\"_ _2\"></span>rtE<span class=\"_ _2\"></span>ffect<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>...........................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">58<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4d ff2 fs4 fc0 sc0 ls2 ws3\">5.2<span class=\"ff5 ls6 ws2\"> </span>hu<span class=\"_ _2\"></span>rtSt<span class=\"_ _2\"></span>ep<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">59<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4e ff2 fs4 fc0 sc0 ls2 ws3\">5.3<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tIsH<span class=\"_ _2\"></span>urt<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">59<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4f ff2 fs4 fc0 sc0 ls2 ws3\">5.4<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tIsH<span class=\"_ _2\"></span>urt<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">59<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y50 ff2 fs4 fc0 sc0 ls9 ws4\">6.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Sc<span class=\"_ _2\"></span>ore<span class=\"_ _2\"></span>Point<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">59<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y51 ff2 fs4 fc0 sc0 ls2 ws3\">6.1<span class=\"ff5 ls6 ws2\"> </span>Sc<span class=\"_ _2\"></span>oreP<span class=\"_ _2\"></span>oint<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">59<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y52 ff2 fs4 fc0 sc0 ls2 ws3\">6.2<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tSc<span class=\"_ _2\"></span>oreP<span class=\"_ _2\"></span>oint<span class=\"ff1 ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">59<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 ybc ff2 fs4 fc0 sc0 ls2 ws3\">6.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSc<span class=\"_ _2\"></span>oreP<span class=\"_ _2\"></span>oint<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">59<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybd ff2 fs4 fc0 sc0 ls9 ws4\">7.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class S<span class=\"_ _2\"></span>te<span class=\"_ _4\"></span>p<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">59<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 ybe ff2 fs4 fc0 sc0 ls2 ws3\">7.1<span class=\"ff5 ls6 ws2\"> </span>S<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"_ _1\"></span>.....<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">60<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybf ff2 fs4 fc0 sc0 ls2 ws3\">7.2<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tSte<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">60<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc0 ff2 fs4 fc0 sc0 ls2 ws3\">7.3<span class=\"ff5 ls6 ws2\"> </span>add<span class=\"_ _2\"></span>Step<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">60<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb0 ff2 fs4 fc0 sc0 ls2 ws3\">7.4<span class=\"ff5 ls6 ws2\"> </span>re<span class=\"_ _2\"></span>duce<span class=\"_ _2\"></span>Ste<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">60<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc1 ff2 fs4 fc0 sc0 ls2 ws3\">7.5<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSt<span class=\"_ _2\"></span>ep<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">60<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb2 ff2 fs4 fc0 sc0 ls9 ws4\">8.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class N<span class=\"_ _2\"></span>am<span class=\"_ _4\"></span>e<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>...............................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">60<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yc2 ff2 fs4 fc0 sc0 ls2 ws3\">8.1<span class=\"ff5 ls6 ws2\"> </span>N<span class=\"_ _2\"></span>am<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">60<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9f ff2 fs4 fc0 sc0 ls2 ws3\">8.2<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tNam<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">61<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya0 ff2 fs4 fc0 sc0 ls2 ws3\">8.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tNam<span class=\"_ _2\"></span>e<span class=\"ff1 ls5 ws5\">..............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">61<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 yb4 ff2 fs4 fc0 sc0 ls9 ws4\">9.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class F<span class=\"_ _2\"></span>ileP<span class=\"_ _2\"></span>ath<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">61<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 ya2 ff2 fs4 fc0 sc0 ls2 ws3\">9.1<span class=\"ff5 ls6 ws2\"> </span>Fi<span class=\"_ _2\"></span>lePa<span class=\"_ _2\"></span>th<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>...............................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">61<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya3 ff2 fs4 fc0 sc0 ls2 ws3\">9.2<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tFil<span class=\"_ _2\"></span>ePat<span class=\"_ _2\"></span>h<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">61<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya4 ff2 fs4 fc0 sc0 ls2 ws3\">9.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tFi<span class=\"_ _2\"></span>lePat<span class=\"_ _2\"></span>h<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">61<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y93 ff2 fs4 fc0 sc0 ls2 ws3\">9.4<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tFi<span class=\"_ _2\"></span>leIsL<span class=\"_ _2\"></span>oaded<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">61<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y82 ff2 fs4 fc0 sc0 ls9 ws4\">10.<span class=\"ff5 lsf ws2\"> <span class=\"ff2 ls2\">cl<span class=\"_ _2\"></span>ass T<span class=\"_ _4\"></span>ype<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>...........................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">61<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y83 ff2 fs4 fc0 sc0 ls2 ws3\">10.1<span class=\"ff5 ls8 ws2\"> </span>T<span class=\"_ _2\"></span>yp<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">62<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y95 ff2 fs4 fc0 sc0 ls2 ws3\">10.2<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Typ<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">..........................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">62<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y96 ff2 fs4 fc0 sc0 ls2 ws3\">10.3<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Typ<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">62<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y86 ff6 fs4 fc0 sc0 ls2 ws2\">Le Bac<span class=\"_ _2\"></span>kgr<span class=\"_ _2\"></span>oud<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">62<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya7 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ba<span class=\"_ _2\"></span>ckg<span class=\"_ _2\"></span>round<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>....................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">62<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yb9 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les méthodes pu<span class=\"_ _2\"></span>bliq<span class=\"_ _2\"></span>ues<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">62<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6a ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Bac<span class=\"_ _2\"></span>kgr<span class=\"_ _2\"></span>ound<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">62<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>s<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">62<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y6c ff6 fs4 fc0 sc0 ls2 ws2\">Le Bou<span class=\"_ _2\"></span>ton<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">63<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6d ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Bu<span class=\"_ _2\"></span>tto<span class=\"_ _2\"></span>n<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">63<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les méthodes pu<span class=\"_ _2\"></span>bliq<span class=\"_ _2\"></span>ues<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">63<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div></div><a class=\"l\" href=\"#pf38\" data-dest-detail='[56,\"XYZ\",33,631,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:800.150000px;width:481.200000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf38\" data-dest-detail='[56,\"XYZ\",33,537,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:782.720000px;width:481.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf38\" data-dest-detail='[56,\"XYZ\",33,231,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:729.810000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:711.820000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:694.390000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,560,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.900000px;width:481.050000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,466,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:658.910000px;width:481.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:641.480000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf39\" data-dest-detail='[57,\"XYZ\",33,132,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:606.000000px;width:481.150000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:588.570000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:570.580000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,381,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:517.670000px;width:481.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,289,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:500.240000px;width:480.950000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,182,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:484.950000px;width:481.150000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3a\" data-dest-detail='[58,\"XYZ\",33,100,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:466.960000px;width:492.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3b\" data-dest-detail='[59,\"XYZ\",33,733,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:449.530000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3b\" data-dest-detail='[59,\"XYZ\",33,641,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:431.490000px;width:481.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3b\" data-dest-detail='[59,\"XYZ\",33,359,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:378.630000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3b\" data-dest-detail='[59,\"XYZ\",33,171,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:343.710000px;width:481.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:325.720000px;width:481.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,724,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:308.290000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,537,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:272.810000px;width:481.000000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,443,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:255.380000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,349,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:237.390000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3c\" data-dest-detail='[60,\"XYZ\",33,243,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:219.960000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3d\" data-dest-detail='[61,\"XYZ\",33,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:184.480000px;width:470.250000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3d\" data-dest-detail='[61,\"XYZ\",33,502,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:131.620000px;width:514.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3d\" data-dest-detail='[61,\"XYZ\",33,346,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:96.701000px;width:492.050000px;height:17.439000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3d\" data-dest-detail='[61,\"XYZ\",33,325,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:78.715000px;width:481.100000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3d\" data-dest-detail='[61,\"XYZ\",33,203,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:61.279000px;width:481.200000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",87,810,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:43.842000px;width:514.250000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,667,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:8.369800px;width:492.050000px;height:17.436200px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf9\" class=\"pf w0 h0\" data-page-no=\"9\"><div class=\"pc pc9 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Bu<span class=\"_ _2\"></span>tton<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">63<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6f ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tTit<span class=\"_ _2\"></span>le<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">63<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>on<span class=\"_ _2\"></span>Cli<span class=\"_ _2\"></span>ck<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">63<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y99 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>on<span class=\"_ _2\"></span>Mou<span class=\"_ _2\"></span>seOv<span class=\"_ _2\"></span>er<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">63<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y70 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>eve<span class=\"_ _2\"></span>nt<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">63<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y46 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>s<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">64<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y71 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>d<span class=\"_ _2\"></span>ra<span class=\"_ _2\"></span>w<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">64<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9c ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tTe<span class=\"_ _2\"></span>xt<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">64<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y49 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tIsI<span class=\"_ _2\"></span>nCol<span class=\"_ _2\"></span>lisi<span class=\"_ _2\"></span>on<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">64<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y74 ff2 fs4 fc0 sc0 ls2 ws3\">Adm<span class=\"_ _2\"></span>ob<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">64<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4b ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ad<span class=\"_ _2\"></span>mob<span class=\"_ _2\"></span>Manag<span class=\"_ _2\"></span>er<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">64<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y4c ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les méthodes pu<span class=\"_ _2\"></span>bliq<span class=\"_ _2\"></span>ues<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">64<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yc3 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 lsf ws2\"> </span>Adm<span class=\"_ _2\"></span>obM<span class=\"_ _2\"></span>anag<span class=\"_ _2\"></span>er<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">64<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4e ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>lo<span class=\"_ _2\"></span>adBan<span class=\"_ _2\"></span>nerA<span class=\"_ _2\"></span>d<span class=\"ff1 ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">65<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 yc4 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>sh<span class=\"_ _2\"></span>owB<span class=\"_ _2\"></span>anner<span class=\"_ _2\"></span>Ad<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">65<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc5 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>hi<span class=\"_ _2\"></span>deBan<span class=\"_ _2\"></span>nerA<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">....................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">65<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y23 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>lo<span class=\"_ _2\"></span>adRew<span class=\"_ _2\"></span>ardV<span class=\"_ _2\"></span>ideo<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">65<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc6 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>sh<span class=\"_ _2\"></span>owR<span class=\"_ _2\"></span>ewar<span class=\"_ _2\"></span>dVid<span class=\"_ _2\"></span>eo<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">65<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc7 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>up<span class=\"_ _2\"></span>date<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>App<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">65<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc8 ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>ch<span class=\"_ _2\"></span>eck<span class=\"_ _2\"></span>AdOb<span class=\"_ _2\"></span>jInit<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">65<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc9 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>ch<span class=\"_ _2\"></span>eck<span class=\"_ _2\"></span>AdRew<span class=\"_ _2\"></span>ardO<span class=\"_ _2\"></span>bjRe<span class=\"_ _2\"></span>init<span class=\"_ _2\"></span>ial<span class=\"_ _2\"></span>ize<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">65<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybf ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Autres Fonction <span class=\"ff3 ws3\">d’A<span class=\"_ _2\"></span>dmo<span class=\"_ _2\"></span>bMan<span class=\"_ _2\"></span>ager<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">66<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yca ff2 fs4 fc0 sc0 ls2 ws3\">3.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">ProcessEvents &amp; Wai<span class=\"_ _2\"></span>tFo<span class=\"_ _2\"></span>rFut<span class=\"_ _2\"></span>ureC<span class=\"_ _2\"></span>omp<span class=\"_ _2\"></span>leti<span class=\"_ _2\"></span>on<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">....................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">66<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 ycb ff2 fs4 fc0 sc0 ls2 ws3\">3.2<span class=\"ff5 ls6 ws2\"> </span>ch<span class=\"_ _2\"></span>eck<span class=\"_ _2\"></span>AdSt<span class=\"_ _2\"></span>ate<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">66<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ycc ff2 fs4 fc0 sc0 ls2 ws3\">Te<span class=\"_ _2\"></span>mps<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">66<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb2 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meT<span class=\"_ _2\"></span>ime<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">66<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 ycd ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les meth<span class=\"_ _2\"></span>ods publiques <span class=\"lsb ws7\">de</span> Gam<span class=\"_ _4\"></span>eTim<span class=\"_ _2\"></span>e<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">66<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yce ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eTi<span class=\"_ _2\"></span>me<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">66<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ycf ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>s<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">67<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 ya1 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>add<span class=\"_ _2\"></span>Tim<span class=\"_ _2\"></span>eVal<span class=\"_ _2\"></span>ue<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>....................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">67<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya2 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tTim<span class=\"_ _2\"></span>eVa<span class=\"_ _2\"></span>lue<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">67<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd0 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tMS<span class=\"_ _2\"></span>econ<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">........................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">67<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 yd1 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tTim<span class=\"_ _2\"></span>eStr<span class=\"_ _2\"></span>ing<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">67<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y93 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tTim<span class=\"_ _2\"></span>eVal<span class=\"_ _2\"></span>ue<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">67<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 yd2 ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tMin<span class=\"_ _2\"></span>ute<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">...........................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">67<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 ya6 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSec<span class=\"_ _2\"></span>ond<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">67<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y95 ff2 fs4 fc0 sc0 ls2 ws3\">2.10<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>MSe<span class=\"_ _2\"></span>cond<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">68<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y85 ff2 fs4 fc0 sc0 ls2 ws3\">2.11<span class=\"ff5 ls8 ws2\"> </span>com<span class=\"_ _2\"></span>par<span class=\"_ _2\"></span>eTim<span class=\"_ _2\"></span>e<span class=\"ff1 ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">68<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y86 ff2 fs4 fc0 sc0 ls2 ws3\">2.12<span class=\"ff5 ls8 ws2\"> </span>oper<span class=\"_ _2\"></span>ato<span class=\"_ _2\"></span>r=<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">68<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y68 ff2 fs4 fc0 sc0 ls2 ws3\">2.13<span class=\"ff5 ls8 ws2\"> </span>oper<span class=\"_ _2\"></span>ato<span class=\"_ _2\"></span>r&lt;&lt;<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">68<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y87 ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Autres Fonctions de Gam<span class=\"_ _2\"></span>eTi<span class=\"_ _2\"></span>me<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">68<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6a ff2 fs4 fc0 sc0 ls2 ws2\">Commande du je<span class=\"_ _2\"></span>u<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">68<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meK<span class=\"_ _2\"></span>eyDat<span class=\"_ _2\"></span>a<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>.................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">68<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y88 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments <span class=\"lsc ws8\">de</span> Game<span class=\"_ _2\"></span>KeyD<span class=\"_ _2\"></span>ata<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">69<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y89 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Virt<span class=\"_ _2\"></span>ual<span class=\"_ _2\"></span>KeyI<span class=\"_ _2\"></span>ndex<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>.......................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lse ws9\">69<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eKe<span class=\"_ _2\"></span>yDat<span class=\"_ _2\"></span>a<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">69<span class=\"ls2 ws2\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,644,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:800.150000px;width:481.200000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,381,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:782.170000px;width:481.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,290,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:764.730000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,196,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:747.240000px;width:481.150000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3e\" data-dest-detail='[62,\"XYZ\",33,102,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:729.260000px;width:481.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:711.820000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:693.840000px;width:480.950000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,560,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.350000px;width:481.050000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:658.910000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,337,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:640.930000px;width:514.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,184,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:606.050000px;width:492.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf3f\" data-dest-detail='[63,\"XYZ\",33,163,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.700000px;bottom:588.020000px;width:481.100000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf40\" data-dest-detail='[64,\"XYZ\",33,311,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:484.400000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf40\" data-dest-detail='[64,\"XYZ\",33,99,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:448.980000px;width:481.000000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:431.540000px;width:492.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",33,641,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:396.070000px;width:481.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",87,512,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:378.630000px;width:514.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",33,359,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:343.160000px;width:492.000000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf41\" data-dest-detail='[65,\"XYZ\",33,337,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:325.720000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:307.740000px;width:481.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:290.300000px;width:480.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:272.860000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,407,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:237.390000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,314,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:219.960000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,220,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:201.970000px;width:480.950000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf42\" data-dest-detail='[66,\"XYZ\",33,126,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:184.480000px;width:481.050000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:149.060000px;width:470.250000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:131.620000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:114.190000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:96.151000px;width:492.100000px;height:18.039000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf43\" data-dest-detail='[67,\"XYZ\",33,220,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:78.715000px;width:514.250000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf44\" data-dest-detail='[68,\"XYZ\",33,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:43.292000px;width:492.100000px;height:17.987000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfa\" class=\"pf w0 h0\" data-page-no=\"a\"><div class=\"pc pca w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>lo<span class=\"_ _2\"></span>adRes<span class=\"_ _2\"></span>our<span class=\"_ _2\"></span>ces<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">69<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y42 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>s<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">69<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>d<span class=\"_ _2\"></span>ra<span class=\"_ _2\"></span>w<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">69<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y99 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>keyP<span class=\"_ _2\"></span>aus<span class=\"_ _2\"></span>ePre<span class=\"_ _2\"></span>ssed<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>...........................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">69<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y45 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>keyL<span class=\"_ _2\"></span>eft<span class=\"_ _2\"></span>Press<span class=\"_ _2\"></span>ed<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>..............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">70<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y46 ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>keyR<span class=\"_ _2\"></span>ight<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">70<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y47 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>keyU<span class=\"_ _2\"></span>pPre<span class=\"_ _2\"></span>ssed<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">70<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y48 ff2 fs4 fc0 sc0 ls2 ws3\">2.10<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyD<span class=\"_ _2\"></span>ownPr<span class=\"_ _2\"></span>ess<span class=\"_ _2\"></span>ed<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>......<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">70<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y49 ff2 fs4 fc0 sc0 ls2 ws3\">2.11<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyA<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed<span class=\"ff1 ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">70<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls2 ws3\">2.12<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyB<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">70<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd3 ff2 fs4 fc0 sc0 ls2 ws3\">2.13<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyA<span class=\"_ _2\"></span>Used<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">70<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd4 ff2 fs4 fc0 sc0 ls2 ws3\">2.14<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyB<span class=\"_ _2\"></span>Used<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>..................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">70<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd5 ff2 fs4 fc0 sc0 ls2 ws3\">2.15<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyL<span class=\"_ _2\"></span>eftU<span class=\"_ _2\"></span>sed<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>..............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">71<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd6 ff2 fs4 fc0 sc0 ls2 ws3\">2.16<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyRi<span class=\"_ _2\"></span>ght<span class=\"_ _2\"></span>Used<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">71<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc4 ff2 fs4 fc0 sc0 ls2 ws3\">2.17<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyUp<span class=\"_ _2\"></span>Used<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">71<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd7 ff2 fs4 fc0 sc0 ls2 ws3\">2.18<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyD<span class=\"_ _2\"></span>ownUs<span class=\"_ _2\"></span>ed<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>...........................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">71<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd8 ff2 fs4 fc0 sc0 ls2 ws3\">2.19<span class=\"ff5 ls8 ws2\"> </span>m_d<span class=\"_ _2\"></span>isab<span class=\"_ _2\"></span>leA<span class=\"_ _2\"></span>llKe<span class=\"_ _2\"></span>y<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">71<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd9 ff2 fs4 fc0 sc0 ls2 ws3\">2.20<span class=\"ff5 ls8 ws2\"> </span>m_h<span class=\"_ _4\"></span>ideGam<span class=\"_ _2\"></span>ePad<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">71<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yda ff2 fs4 fc0 sc0 ls2 ws3\">2.21<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>A<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">71<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybd ff2 fs4 fc0 sc0 ls2 ws3\">2.22<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>B<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">71<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybe ff2 fs4 fc0 sc0 ls2 ws3\">2.23<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>Left<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.............................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">72<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ydb ff2 fs4 fc0 sc0 ls2 ws3\">2.24<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>Right<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">72<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc0 ff2 fs4 fc0 sc0 ls2 ws3\">2.25<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>Up<span class=\"ff1 ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">72<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 yb0 ff2 fs4 fc0 sc0 ls2 ws3\">2.26<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>Down<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.........................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">72<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc1 ff2 fs4 fc0 sc0 ls2 ws3\">2.27<span class=\"ff5 ls8 ws2\"> </span>m_m<span class=\"_ _4\"></span>oveKey<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">72<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb2 ff2 fs4 fc0 sc0 ls2 ws3\">2.28<span class=\"ff5 ls8 ws2\"> </span>m_a<span class=\"_ _2\"></span>cti<span class=\"_ _2\"></span>onKe<span class=\"_ _2\"></span>yPre<span class=\"_ _2\"></span>ssed<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>.....................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">72<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9e ff2 fs4 fc0 sc0 ls2 ws3\">2.29<span class=\"ff5 ls8 ws2\"> </span>key<span class=\"_ _2\"></span>Left<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">72<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yce ff2 fs4 fc0 sc0 ls2 ws3\">2.30<span class=\"ff5 ls8 ws2\"> </span>key<span class=\"_ _2\"></span>Righ<span class=\"_ _2\"></span>tPr<span class=\"_ _2\"></span>essed<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">72<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya0 ff2 fs4 fc0 sc0 ls2 ws3\">2.31<span class=\"ff5 ls8 ws2\"> </span>key<span class=\"_ _2\"></span>UpPr<span class=\"_ _2\"></span>esse<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">73<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb4 ff2 fs4 fc0 sc0 ls2 ws3\">2.32<span class=\"ff5 ls8 ws2\"> </span>key<span class=\"_ _2\"></span>Down<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">73<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya2 ff2 fs4 fc0 sc0 ls2 ws3\">2.33<span class=\"ff5 ls8 ws2\"> </span>key<span class=\"_ _2\"></span>APre<span class=\"_ _2\"></span>ssed<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">73<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya3 ff2 fs4 fc0 sc0 ls2 ws3\">2.34<span class=\"ff5 ls8 ws2\"> </span>key<span class=\"_ _2\"></span>BPre<span class=\"_ _2\"></span>ssed<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">73<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb6 ff2 fs4 fc0 sc0 ls2 ws3\">2.35<span class=\"ff5 ls8 ws2\"> </span>vir<span class=\"_ _2\"></span>tual<span class=\"_ _2\"></span>Key<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">73<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y93 ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Autres fonctions de Gam<span class=\"_ _2\"></span>eKe<span class=\"_ _2\"></span>yDa<span class=\"_ _2\"></span>ta<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">73<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y82 ff6 fs4 fc0 sc0 ls2 ws2\">Game Sli<span class=\"_ _2\"></span>der<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">74<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y94 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Game S<span class=\"_ _2\"></span>lid<span class=\"_ _2\"></span>er<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">74<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y95 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments publics <span class=\"lsb ws7\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> Game Sl<span class=\"_ _2\"></span>ider<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">74<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y96 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">Slider Dir<span class=\"_ _2\"></span>ecti<span class=\"_ _2\"></span>on<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">74<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y67 ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eSl<span class=\"_ _2\"></span>ider<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">74<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y68 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>s<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.....................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">74<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y69 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSl<span class=\"_ _2\"></span>ider<span class=\"_ _2\"></span>Dire<span class=\"_ _2\"></span>ction<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">74<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y98 ff2 fs4 fc0 sc0 ls2 ws2\">Game Sy<span class=\"_ _2\"></span>stè<span class=\"_ _2\"></span>me<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">74<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meS<span class=\"_ _2\"></span>yst<span class=\"_ _2\"></span>em<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">74<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6c ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments <span class=\"lsc ws8\">de</span> Game<span class=\"_ _2\"></span>Sys<span class=\"_ _2\"></span>tem<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">75<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6d ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Val<span class=\"_ _2\"></span>idat<span class=\"_ _2\"></span>ionBu<span class=\"_ _2\"></span>tto<span class=\"_ _2\"></span>n<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lse ws9\">75<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eSy<span class=\"_ _2\"></span>stem<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">75<span class=\"ls2 ws2\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf44\" data-dest-detail='[68,\"XYZ\",33,496,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:800.150000px;width:481.100000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf44\" data-dest-detail='[68,\"XYZ\",33,343,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:782.720000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf44\" data-dest-detail='[68,\"XYZ\",33,261,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:764.730000px;width:480.950000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,537,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:676.950000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,443,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:658.910000px;width:470.100000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,349,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:641.480000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,255,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:626.190000px;width:470.100000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf45\" data-dest-detail='[69,\"XYZ\",33,161,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:608.200000px;width:470.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",111,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:590.770000px;width:470.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,724,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:572.730000px;width:470.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,631,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:555.300000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,537,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:537.860000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,443,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:519.870000px;width:470.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf46\" data-dest-detail='[70,\"XYZ\",33,349,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:502.440000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf47\" data-dest-detail='[71,\"XYZ\",33,255,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:343.760000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf47\" data-dest-detail='[71,\"XYZ\",33,150,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:325.720000px;width:470.150000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:308.290000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,713,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:290.850000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,619,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:272.860000px;width:470.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,511,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:255.380000px;width:470.150000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,418,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:237.940000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf48\" data-dest-detail='[72,\"XYZ\",33,324,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:219.960000px;width:492.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf49\" data-dest-detail='[73,\"XYZ\",87,787,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:202.520000px;width:514.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf49\" data-dest-detail='[73,\"XYZ\",33,645,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:167.050000px;width:492.000000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf49\" data-dest-detail='[73,\"XYZ\",33,347,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:114.190000px;width:481.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf49\" data-dest-detail='[73,\"XYZ\",33,124,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:79.265000px;width:514.300000px;height:17.486000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf49\" data-dest-detail='[73,\"XYZ\",33,92,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:61.279000px;width:492.050000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4a\" data-dest-detail='[74,\"XYZ\",33,696,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:43.842000px;width:492.100000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4a\" data-dest-detail='[74,\"XYZ\",33,494,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:8.369800px;width:481.050000px;height:17.486200px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfb\" class=\"pf w0 h0\" data-page-no=\"b\"><div class=\"pc pcb w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>is<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">75<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6f ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>ke<span class=\"_ _2\"></span>yIs<span class=\"_ _2\"></span>Press<span class=\"_ _2\"></span>ed<span class=\"ff1 ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">76<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>fil<span class=\"_ _2\"></span>eEx<span class=\"_ _2\"></span>ist<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">76<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y44 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>pl<span class=\"_ _2\"></span>aySo<span class=\"_ _2\"></span>und<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">76<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y70 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>Mpl<span class=\"_ _2\"></span>aySou<span class=\"_ _2\"></span>nd<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">76<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y46 ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>pl<span class=\"_ _2\"></span>ayMu<span class=\"_ _2\"></span>sic<span class=\"ff1 ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">76<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 ydc ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>GS<span class=\"_ _2\"></span>Mpl<span class=\"_ _2\"></span>ayMus<span class=\"_ _2\"></span>ic<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>....................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">77<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y1a ff2 fs4 fc0 sc0 ls2 ws3\">2.10<span class=\"ff5 ls8 ws2\"> </span>st<span class=\"_ _2\"></span>opSou<span class=\"_ _2\"></span>nd<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">77<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ydd ff2 fs4 fc0 sc0 ls2 ws3\">2.11<span class=\"ff5 ls8 ws2\"> </span>st<span class=\"_ _2\"></span>opMu<span class=\"_ _2\"></span>sic<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>.......................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">77<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yde ff2 fs4 fc0 sc0 ls2 ws3\">2.12<span class=\"ff5 ls8 ws2\"> </span>us<span class=\"_ _2\"></span>eVibr<span class=\"_ _2\"></span>ate<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>......................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">77<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ydf ff2 fs4 fc0 sc0 ls2 ws3\">2.13<span class=\"ff5 ls8 ws2\"> </span>sav<span class=\"_ _2\"></span>eCon<span class=\"_ _2\"></span>fig<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">77<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye0 ff2 fs4 fc0 sc0 ls2 ws3\">2.14<span class=\"ff5 ls8 ws2\"> </span>loa<span class=\"_ _2\"></span>dCon<span class=\"_ _2\"></span>fig<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">77<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye1 ff2 fs4 fc0 sc0 ls2 ws3\">2.15<span class=\"ff5 ls8 ws2\"> </span>sav<span class=\"_ _2\"></span>ePadC<span class=\"_ _2\"></span>onfi<span class=\"_ _2\"></span>g<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">77<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd6 ff2 fs4 fc0 sc0 ls2 ws3\">2.16<span class=\"ff5 ls8 ws2\"> </span>loa<span class=\"_ _2\"></span>dPadC<span class=\"_ _2\"></span>onfi<span class=\"_ _2\"></span>g<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">77<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye2 ff2 fs4 fc0 sc0 ls2 ws3\">2.17<span class=\"ff5 ls8 ws2\"> </span>m_d<span class=\"_ _2\"></span>isab<span class=\"_ _2\"></span>leK<span class=\"_ _2\"></span>ey<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">78<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc5 ff2 fs4 fc0 sc0 ls2 ws3\">2.18<span class=\"ff5 ls8 ws2\"> </span>m_e<span class=\"_ _2\"></span>nabl<span class=\"_ _2\"></span>eSou<span class=\"_ _2\"></span>nd<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.............................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">78<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y23 ff2 fs4 fc0 sc0 ls2 ws3\">2.19<span class=\"ff5 ls8 ws2\"> </span>m_e<span class=\"_ _2\"></span>nabl<span class=\"_ _2\"></span>eMus<span class=\"_ _2\"></span>ic<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">78<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd9 ff2 fs4 fc0 sc0 ls2 ws3\">2.20<span class=\"ff5 ls8 ws2\"> </span>m_e<span class=\"_ _2\"></span>nabl<span class=\"_ _2\"></span>eVi<span class=\"_ _2\"></span>brat<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">78<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc7 ff2 fs4 fc0 sc0 ls2 ws3\">2.21<span class=\"ff5 ls8 ws2\"> </span>m_k<span class=\"_ _2\"></span>eyIs<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">78<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc8 ff2 fs4 fc0 sc0 ls2 ws3\">2.22<span class=\"ff5 ls8 ws2\"> </span>m_f<span class=\"_ _2\"></span>irst<span class=\"_ _2\"></span>Lau<span class=\"_ _2\"></span>nch<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">78<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc9 ff2 fs4 fc0 sc0 ls2 ws3\">2.23<span class=\"ff5 ls8 ws2\"> </span>m_v<span class=\"_ _2\"></span>ali<span class=\"_ _2\"></span>dati<span class=\"_ _2\"></span>onMou<span class=\"_ _2\"></span>seK<span class=\"_ _2\"></span>ey<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\">. <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">78<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybf ff2 fs4 fc0 sc0 ls2 ws3\">2.24<span class=\"ff5 ls8 ws2\"> </span>m_v<span class=\"_ _2\"></span>ali<span class=\"_ _2\"></span>dati<span class=\"_ _2\"></span>onKe<span class=\"_ _2\"></span>yboa<span class=\"_ _2\"></span>rdKe<span class=\"_ _2\"></span>y<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>............................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">78<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc0 ff2 fs4 fc0 sc0 ls2 ws3\">2.25<span class=\"ff5 ls8 ws2\"> </span>m_g<span class=\"_ _2\"></span>ame<span class=\"_ _2\"></span>Langu<span class=\"_ _2\"></span>age<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">79<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ycb ff2 fs4 fc0 sc0 ls2 ws3\">2.26<span class=\"ff5 ls8 ws2\"> </span>m_p<span class=\"_ _2\"></span>adAl<span class=\"_ _2\"></span>pha<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>...................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">79<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ycc ff2 fs4 fc0 sc0 ls2 ws3\">2.27<span class=\"ff5 ls8 ws2\"> </span><span class=\"ws2\">Les autres m<span class=\"_ _2\"></span>éth<span class=\"_ _2\"></span>odes<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">79<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yb2 ff6 fs4 fc0 sc0 ls2 ws2\">Game System Ex<span class=\"_ _2\"></span>tend<span class=\"_ _2\"></span>ed<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">79<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ycd ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meS<span class=\"_ _2\"></span>yst<span class=\"_ _2\"></span>emExt<span class=\"_ _2\"></span>ended<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">79<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y9f ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments <span class=\"lsc ws8\">de</span> Game<span class=\"_ _2\"></span>Sys<span class=\"_ _2\"></span>tem<span class=\"_ _2\"></span>Exte<span class=\"_ _2\"></span>nded<span class=\"ff1\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">.................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">79<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 ya0 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eSy<span class=\"_ _2\"></span>stem<span class=\"_ _2\"></span>Ext<span class=\"_ _2\"></span>ended<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.......................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">79<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 ya1 ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>in<span class=\"_ _2\"></span>itS<span class=\"_ _2\"></span>ystem<span class=\"_ _2\"></span>Dat<span class=\"_ _2\"></span>a<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">79<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya2 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>in<span class=\"_ _2\"></span>itPr<span class=\"_ _2\"></span>ogr<span class=\"_ _2\"></span>ess<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">80<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y91 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>in<span class=\"_ _2\"></span>itDa<span class=\"_ _2\"></span>ta<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>...............................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">80<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd1 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>sa<span class=\"_ _2\"></span>veDat<span class=\"_ _2\"></span>a<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">80<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y93 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>lo<span class=\"_ _2\"></span>adDat<span class=\"_ _2\"></span>a<span class=\"ff1 ls5 ws5\">..............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">80<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y82 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>lau<span class=\"_ _2\"></span>nchO<span class=\"_ _2\"></span>ptio<span class=\"_ _2\"></span>n<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">80<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y83 ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">game play <span class=\"_ _2\"></span>vari<span class=\"_ _2\"></span>abl<span class=\"_ _2\"></span>es<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">80<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y84 ff2 fs4 fc0 sc0 ls2 ws2\">Game Fu<span class=\"_ _2\"></span>nct<span class=\"_ _2\"></span>ion<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">80<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y96 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Fonction Gén<span class=\"_ _2\"></span>éral<span class=\"_ _2\"></span>e<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">81<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y86 ff2 fs4 fc0 sc0 ls2 ws3\">1.1<span class=\"ff5 ls6 ws2\"> </span>VA<span class=\"_ _2\"></span>LUE<span class=\"_ _2\"></span>_CONV<span class=\"_ _2\"></span>ERSI<span class=\"_ _2\"></span>ON<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">81<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y68 ff2 fs4 fc0 sc0 ls2 ws3\">1.2<span class=\"ff5 ls6 ws2\"> </span>SE<span class=\"_ _2\"></span>CON<span class=\"_ _2\"></span>D<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">81<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y87 ff2 fs4 fc0 sc0 ls2 ws3\">1.3<span class=\"ff5 ls6 ws2\"> </span>W<span class=\"_ _2\"></span>ITH<span class=\"_ _4\"></span><span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">81<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6a ff2 fs4 fc0 sc0 ls2 ws3\">1.4<span class=\"ff5 ls6 ws2\"> </span>enu<span class=\"_ _2\"></span>mTo<span class=\"_ _2\"></span>Num<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">......................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">81<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">1.5<span class=\"ff5 ls6 ws2\"> </span>w_<span class=\"_ _2\"></span>chart<span class=\"_ _4\"></span>_tToSt<span class=\"_ _2\"></span>r<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">81<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y88 ff2 fs4 fc0 sc0 ls2 ws3\">1.6<span class=\"ff5 ls6 ws2\"> </span>st<span class=\"_ _2\"></span>rToW<span class=\"_ _2\"></span>Str<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>...........................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">82<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y89 ff2 fs4 fc0 sc0 ls2 ws3\">1.7<span class=\"ff5 ls6 ws2\"> </span>nu<span class=\"_ _2\"></span>mToSt<span class=\"_ _4\"></span>r<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">82<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls2 ws3\">1.8<span class=\"ff5 ls6 ws2\"> </span>st<span class=\"_ _2\"></span>rToNu<span class=\"_ _4\"></span>m<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">...........................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">82<span class=\"ls2 ws2\"> </span></span></span></div></div><a class=\"l\" href=\"#pf4a\" data-dest-detail='[74,\"XYZ\",33,400,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:800.150000px;width:481.100000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4b\" data-dest-detail='[75,\"XYZ\",33,424,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:764.730000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4b\" data-dest-detail='[75,\"XYZ\",33,330,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:747.290000px;width:480.950000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4b\" data-dest-detail='[75,\"XYZ\",33,236,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:729.260000px;width:481.150000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4b\" data-dest-detail='[75,\"XYZ\",33,142,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:711.820000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:696.540000px;width:481.000000px;height:15.280000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:625.640000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,302,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:608.200000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,208,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:590.220000px;width:470.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4c\" data-dest-detail='[76,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:572.780000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:555.300000px;width:470.250000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:537.310000px;width:470.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:519.870000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:502.440000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:484.400000px;width:470.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,302,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:466.960000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4d\" data-dest-detail='[77,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:431.540000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4e\" data-dest-detail='[78,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:414.100000px;width:470.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4e\" data-dest-detail='[78,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:396.070000px;width:470.050000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4e\" data-dest-detail='[78,\"XYZ\",33,584,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:378.630000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4e\" data-dest-detail='[78,\"XYZ\",33,259,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:325.720000px;width:492.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4e\" data-dest-detail='[78,\"XYZ\",33,238,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:308.290000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:255.430000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:237.390000px;width:481.000000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,513,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:219.960000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,314,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:184.530000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf4f\" data-dest-detail='[79,\"XYZ\",33,126,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:167.100000px;width:514.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf50\" data-dest-detail='[80,\"XYZ\",33,767,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:149.610000px;width:492.050000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf50\" data-dest-detail='[80,\"XYZ\",33,745,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:131.620000px;width:481.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf50\" data-dest-detail='[80,\"XYZ\",33,151,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:61.279000px;width:481.050000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf51\" data-dest-detail='[81,\"XYZ\",33,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:43.292000px;width:481.200000px;height:17.987000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfc\" class=\"pf w0 h0\" data-page-no=\"c\"><div class=\"pc pcc w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">1.9<span class=\"ff5 ls6 ws2\"> </span>nu<span class=\"_ _2\"></span>mToW<span class=\"_ _2\"></span>Str<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>........................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">82<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y42 ff2 fs4 fc0 sc0 ls2 ws3\">1.10<span class=\"ff5 ls8 ws2\"> </span>wri<span class=\"_ _2\"></span>teZ<span class=\"_ _2\"></span>ero<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">82<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye3 ff2 fs4 fc0 sc0 ls2 ws3\">1.11<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>MSe<span class=\"_ _2\"></span>cond<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">82<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye4 ff2 fs4 fc0 sc0 ls2 ws3\">1.12<span class=\"ff5 ls8 ws2\"> </span>mak<span class=\"_ _2\"></span>eTim<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">83<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye5 ff2 fs4 fc0 sc0 ls2 ws3\">1.13<span class=\"ff5 ls8 ws2\"> </span>ch<span class=\"_ _2\"></span>eckD<span class=\"_ _2\"></span>ateL<span class=\"_ _2\"></span>imit<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">83<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye6 ff2 fs4 fc0 sc0 ls2 ws3\">1.14<span class=\"ff5 ls8 ws2\"> </span>sh<span class=\"_ _2\"></span>owLo<span class=\"_ _2\"></span>g<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">83<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ydc ff2 fs4 fc0 sc0 ls2 ws3\">1.15<span class=\"ff5 ls8 ws2\"> </span>arr<span class=\"_ _2\"></span>aySi<span class=\"_ _2\"></span>ze<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">83<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye7 ff2 fs4 fc0 sc0 ls2 ws3\">1.16<span class=\"ff5 ls8 ws2\"> </span>ch<span class=\"_ _2\"></span>oose<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">83<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye8 ff2 fs4 fc0 sc0 ls2 ws3\">1.17<span class=\"ff5 ls8 ws2\"> </span>ran<span class=\"_ _2\"></span>dom<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>..........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">83<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ye9 ff2 fs4 fc0 sc0 ls2 ws3\">1.18<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>VarL<span class=\"_ _2\"></span>imit<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">84<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yea ff2 fs4 fc0 sc0 ls2 ws3\">1.19<span class=\"ff5 ls8 ws2\"> </span>is<span class=\"_ _4\"></span>In<span class=\"ff1 ls5 ws5\">..................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">84<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 yd4 ff2 fs4 fc0 sc0 ls2 ws3\">1.20<span class=\"ff5 ls8 ws2\"> </span>isB<span class=\"_ _2\"></span>etw<span class=\"_ _2\"></span>een<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">84<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd5 ff2 fs4 fc0 sc0 ls2 ws3\">1.21<span class=\"ff5 ls8 ws2\"> </span>isC<span class=\"_ _2\"></span>ross<span class=\"_ _2\"></span>ing<span class=\"ff1 ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">84<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 yeb ff2 fs4 fc0 sc0 ls2 ws3\">1.22<span class=\"ff5 ls8 ws2\"> </span>si<span class=\"_ _4\"></span>de<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">84<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc4 ff2 fs4 fc0 sc0 ls2 ws3\">1.23<span class=\"ff5 ls8 ws2\"> </span>si<span class=\"_ _4\"></span>gn<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">84<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd7 ff2 fs4 fc0 sc0 ls2 ws3\">1.24<span class=\"ff5 ls8 ws2\"> </span>poi<span class=\"_ _2\"></span>ntDi<span class=\"_ _2\"></span>rect<span class=\"_ _2\"></span>ion<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">84<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd8 ff2 fs4 fc0 sc0 ls2 ws3\">1.25<span class=\"ff5 ls8 ws2\"> </span>poi<span class=\"_ _2\"></span>ntDi<span class=\"_ _2\"></span>sta<span class=\"_ _2\"></span>nce<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">85<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yd9 ff2 fs4 fc0 sc0 ls2 ws3\">1.26<span class=\"ff5 ls8 ws2\"> </span>radT<span class=\"_ _4\"></span>oDeg<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">85<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybc ff2 fs4 fc0 sc0 ls2 ws3\">1.27<span class=\"ff5 ls8 ws2\"> </span>degT<span class=\"_ _4\"></span>oRad<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>.......................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">85<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc8 ff2 fs4 fc0 sc0 ls2 ws3\">1.28<span class=\"ff5 ls8 ws2\"> </span>len<span class=\"_ _2\"></span>gth<span class=\"_ _2\"></span>DirX<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>......................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">85<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybe ff2 fs4 fc0 sc0 ls2 ws3\">1.29<span class=\"ff5 ls8 ws2\"> </span>len<span class=\"_ _2\"></span>gth<span class=\"_ _2\"></span>DirY<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>......................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">85<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ydb ff2 fs4 fc0 sc0 ls2 ws3\">1.30<span class=\"ff5 ls8 ws2\"> </span>inc<span class=\"_ _2\"></span>reas<span class=\"_ _2\"></span>eVar<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">85<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc0 ff2 fs4 fc0 sc0 ls2 ws3\">1.31<span class=\"ff5 ls8 ws2\"> </span>decr<span class=\"_ _2\"></span>eas<span class=\"_ _2\"></span>eVar<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">86<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb0 ff2 fs4 fc0 sc0 ls2 ws3\">1.32<span class=\"ff5 ls8 ws2\"> </span>col<span class=\"_ _2\"></span>lis<span class=\"_ _2\"></span>ionT<span class=\"_ _2\"></span>est<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">86<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb1 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Fonction sur les <span class=\"_ _2\"></span>objets <span class=\"ls11 wsa\">SFML<span class=\"_ _1\"></span></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">86<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yb2 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tVe<span class=\"_ _2\"></span>ctor<span class=\"_ _2\"></span>2<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">..........................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">86<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y9e ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Angl<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">86<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yec ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>XSc<span class=\"_ _2\"></span>ale<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">86<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya0 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>YSc<span class=\"_ _2\"></span>ale<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">87<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb4 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Widt<span class=\"_ _2\"></span>h<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">87<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y90 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Hei<span class=\"_ _2\"></span>ght<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">87<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y91 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSFM<span class=\"_ _2\"></span>LTex<span class=\"_ _2\"></span>tur<span class=\"_ _2\"></span>eWidt<span class=\"_ _2\"></span>h<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>.......<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">87<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y92 ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSFM<span class=\"_ _2\"></span>LTex<span class=\"_ _2\"></span>tur<span class=\"_ _2\"></span>eHeig<span class=\"_ _2\"></span>ht<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>......<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">87<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb7 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tSFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Ori<span class=\"_ _2\"></span>ginX<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">87<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y82 ff2 fs4 fc0 sc0 ls2 ws3\">2.10<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObjO<span class=\"_ _2\"></span>rig<span class=\"_ _2\"></span>inY<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">87<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y94 ff2 fs4 fc0 sc0 ls2 ws3\">2.11<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObjX<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">88<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y95 ff2 fs4 fc0 sc0 ls2 ws3\">2.12<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObjY<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">88<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y96 ff2 fs4 fc0 sc0 ls2 ws3\">2.13<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Angl<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">..........................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">88<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y67 ff2 fs4 fc0 sc0 ls2 ws3\">2.14<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Rota<span class=\"_ _2\"></span>te<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">88<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y68 ff2 fs4 fc0 sc0 ls2 ws3\">2.15<span class=\"ff5 ls10 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Scal<span class=\"_ _2\"></span>eX_Y<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">88<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y69 ff2 fs4 fc0 sc0 ls2 ws3\">2.16<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Scal<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">...........................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">89<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y98 ff2 fs4 fc0 sc0 ls2 ws3\">2.17<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Orig<span class=\"_ _2\"></span>in<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.........................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">89<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">2.18<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>X<span class=\"ff1 ls5 ws5\">..................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">89<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y6c ff2 fs4 fc0 sc0 ls2 ws3\">2.19<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Y<span class=\"ff1 ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">89<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 yed ff2 fs4 fc0 sc0 ls2 ws3\">2.20<span class=\"ff5 ls8 ws2\"> </span>cen<span class=\"_ _2\"></span>terS<span class=\"_ _2\"></span>FML<span class=\"_ _2\"></span>Obj<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">89<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yee ff2 fs4 fc0 sc0 ls2 ws3\">2.21<span class=\"ff5 ls8 ws2\"> </span>cen<span class=\"_ _2\"></span>terS<span class=\"_ _2\"></span>FML<span class=\"_ _2\"></span>ObjX<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">89<span class=\"ls2 ws2\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf51\" data-dest-detail='[81,\"XYZ\",33,137,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:767.430000px;width:470.100000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf52\" data-dest-detail='[82,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:749.440000px;width:470.250000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf52\" data-dest-detail='[82,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:732.010000px;width:470.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf52\" data-dest-detail='[82,\"XYZ\",33,131,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:661.110000px;width:470.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf53\" data-dest-detail='[83,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:626.190000px;width:470.100000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf53\" data-dest-detail='[83,\"XYZ\",33,452,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:608.200000px;width:470.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf53\" data-dest-detail='[83,\"XYZ\",33,369,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:590.770000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf53\" data-dest-detail='[83,\"XYZ\",33,276,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:573.330000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf53\" data-dest-detail='[83,\"XYZ\",33,76,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:537.860000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf54\" data-dest-detail='[84,\"XYZ\",33,724,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:519.870000px;width:470.250000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf54\" data-dest-detail='[84,\"XYZ\",33,443,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:466.960000px;width:470.100000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf54\" data-dest-detail='[84,\"XYZ\",33,314,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:449.530000px;width:470.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf55\" data-dest-detail='[85,\"XYZ\",33,546,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:396.620000px;width:470.250000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf55\" data-dest-detail='[85,\"XYZ\",33,393,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:379.180000px;width:492.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf55\" data-dest-detail='[85,\"XYZ\",33,370,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:361.200000px;width:481.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf56\" data-dest-detail='[86,\"XYZ\",33,408,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:255.430000px;width:481.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf56\" data-dest-detail='[86,\"XYZ\",33,314,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:237.990000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf56\" data-dest-detail='[86,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:202.520000px;width:470.250000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf57\" data-dest-detail='[87,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:185.080000px;width:470.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf57\" data-dest-detail='[87,\"XYZ\",33,535,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:167.100000px;width:470.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf57\" data-dest-detail='[87,\"XYZ\",33,97,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.500000px;bottom:114.190000px;width:481.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfd\" class=\"pf w0 h0\" data-page-no=\"d\"><div class=\"pc pcd w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">2.22<span class=\"ff5 ls8 ws2\"> </span>cen<span class=\"_ _2\"></span>terS<span class=\"_ _2\"></span>FML<span class=\"_ _2\"></span>ObjY<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">90<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6f ff2 fs4 fc0 sc0 ls2 ws3\">2.23<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>X_Y<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">..............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">90<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls2 ws3\">2.24<span class=\"ff5 ls8 ws2\"> </span>mov<span class=\"_ _2\"></span>eSF<span class=\"_ _2\"></span>MLOb<span class=\"_ _2\"></span>jX<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">90<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y99 ff2 fs4 fc0 sc0 ls2 ws3\">2.25<span class=\"ff5 ls8 ws2\"> </span>mov<span class=\"_ _2\"></span>eSF<span class=\"_ _2\"></span>MLOb<span class=\"_ _2\"></span>jY<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">90<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y70 ff2 fs4 fc0 sc0 ls2 ws3\">2.26<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Size<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>.............................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">90<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y46 ff2 fs4 fc0 sc0 ls2 ws3\">2.27<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Alph<span class=\"_ _2\"></span>a<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>..........................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">91<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9b ff2 fs4 fc0 sc0 ls2 ws3\">2.28<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Alph<span class=\"_ _2\"></span>a2<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">91<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9c ff2 fs4 fc0 sc0 ls2 ws3\">2.29<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Color<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">91<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y49 ff2 fs4 fc0 sc0 ls2 ws3\">2.30<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>FillC<span class=\"_ _2\"></span>olo<span class=\"_ _2\"></span>r<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">91<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls2 ws3\">2.31<span class=\"ff5 ls8 ws2\"> </span>sc<span class=\"_ _2\"></span>aleA<span class=\"_ _2\"></span>nimat<span class=\"_ _2\"></span>ion<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>..............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">91<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4b ff2 fs4 fc0 sc0 ls2 ws3\">2.32<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>Fram<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">92<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8b ff2 fs4 fc0 sc0 ls2 ws3\">2.33<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Outli<span class=\"_ _2\"></span>neCo<span class=\"_ _2\"></span>lor<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>...............................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">92<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yc3 ff2 fs4 fc0 sc0 ls2 ws3\">2.34<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>TexRe<span class=\"_ _2\"></span>c<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">92<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4e ff2 fs4 fc0 sc0 ls2 ws3\">2.35<span class=\"ff5 ls8 ws2\"> </span>set<span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>LObj<span class=\"_ _2\"></span>Prope<span class=\"_ _2\"></span>rti<span class=\"_ _2\"></span>es<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">..................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">92<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y4f ff2 fs4 fc0 sc0 ls2 ws3\">2.36<span class=\"ff5 lsd ws2\"> </span>loa<span class=\"_ _2\"></span>dSF<span class=\"_ _2\"></span>MLTe<span class=\"_ _2\"></span>xtur<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">92<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y76 ff2 fs4 fc0 sc0 ls2 ws3\">2.37<span class=\"ff5 ls8 ws2\"> </span>loa<span class=\"_ _2\"></span>dSF<span class=\"_ _2\"></span>MLFo<span class=\"_ _2\"></span>nt<span class=\"ff1 ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">92<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y51 ff2 fs4 fc0 sc0 ls2 ws3\">2.38<span class=\"ff5 ls8 ws2\"> </span>loa<span class=\"_ _2\"></span>dSF<span class=\"_ _2\"></span>MLSou<span class=\"_ _2\"></span>ndBu<span class=\"_ _2\"></span>ffer<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">93<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y52 ff2 fs4 fc0 sc0 ls2 ws3\">2.39<span class=\"ff5 ls8 ws2\"> </span>loa<span class=\"_ _2\"></span>dSF<span class=\"_ _2\"></span>MLMus<span class=\"_ _2\"></span>ic<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">93<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y78 ff2 fs4 fc0 sc0 ls2 ws3\">2.40<span class=\"ff5 ls8 ws2\"> </span>ch<span class=\"_ _2\"></span>eckS<span class=\"_ _2\"></span>FMLS<span class=\"_ _2\"></span>ndSt<span class=\"_ _2\"></span>ate<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>......<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">93<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y54 ff2 fs4 fc0 sc0 ls2 ws3\">2.41<span class=\"ff5 ls8 ws2\"> </span>pla<span class=\"_ _2\"></span>ySF<span class=\"_ _2\"></span>MLsn<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>.................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">93<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y55 ff2 fs4 fc0 sc0 ls2 ws3\">2.42<span class=\"ff5 ls8 ws2\"> </span>st<span class=\"_ _2\"></span>opSF<span class=\"_ _2\"></span>MLsn<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">93<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7a ff2 fs4 fc0 sc0 ls2 ws3\">2.43<span class=\"ff5 ls8 ws2\"> </span>pau<span class=\"_ _2\"></span>seS<span class=\"_ _2\"></span>FMLs<span class=\"_ _2\"></span>nd<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>...............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">94<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y57 ff2 fs4 fc0 sc0 ls2 ws3\">2.44<span class=\"ff5 ls8 ws2\"> </span>loo<span class=\"_ _2\"></span>pSF<span class=\"_ _2\"></span>MLsn<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">94<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y58 ff2 fs4 fc0 sc0 ls2 ws3\">2.45<span class=\"ff5 ls8 ws2\"> </span>col<span class=\"_ _2\"></span>lis<span class=\"_ _2\"></span>ionT<span class=\"_ _2\"></span>estSF<span class=\"_ _2\"></span>ML<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.........................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">94<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7c ff2 fs4 fc0 sc0 ls2 ws3\">2.46<span class=\"ff5 ls8 ws2\"> </span>cre<span class=\"_ _2\"></span>ateR<span class=\"_ _2\"></span>ecta<span class=\"_ _2\"></span>ngl<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">94<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5a ff2 fs4 fc0 sc0 ls2 ws3\">2.47<span class=\"ff5 ls8 ws2\"> </span>tex<span class=\"_ _2\"></span>tSt<span class=\"_ _2\"></span>yleC<span class=\"_ _2\"></span>onfig<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">94<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5b ff2 fs4 fc0 sc0 ls2 ws3\">2.48<span class=\"ff5 ls8 ws2\"> </span>cre<span class=\"_ _2\"></span>ateT<span class=\"_ _2\"></span>ext<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>......................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">94<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7e ff2 fs4 fc0 sc0 ls2 ws3\">2.49<span class=\"ff5 ls8 ws2\"> </span>cre<span class=\"_ _2\"></span>ateS<span class=\"_ _2\"></span>pri<span class=\"_ _2\"></span>te<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">95<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5d ff2 fs4 fc0 sc0 ls2 ws3\">2.50<span class=\"ff5 ls8 ws2\"> </span>get<span class=\"_ _2\"></span>Cur<span class=\"_ _2\"></span>sor<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">96<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yef ff2 fs4 fc0 sc0 ls2 ws3\">2.51<span class=\"ff5 ls8 ws2\"> </span>mou<span class=\"_ _2\"></span>seC<span class=\"_ _2\"></span>olli<span class=\"_ _2\"></span>sion<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..............................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">96<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5f ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Autres fo<span class=\"_ _2\"></span>nct<span class=\"_ _2\"></span>ions<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">97<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y80 ff2 fs4 fc0 sc0 ls2 ws3\">3.1<span class=\"ff5 ls6 ws2\"> </span>cl<span class=\"_ _2\"></span>ear<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">97<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yf0 ff2 fs4 fc0 sc0 ls2 ws3\">3.2<span class=\"ff5 ls6 ws2\"> </span>d<span class=\"_ _2\"></span>ra<span class=\"_ _2\"></span>w<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">97<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y62 ff2 fs4 fc0 sc0 ls2 ws3\">3.3<span class=\"ff5 ls6 ws2\"> </span>dis<span class=\"_ _2\"></span>pla<span class=\"_ _2\"></span>y<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">................................................................................................................................................................................................</span> <span class=\"_ _6\"></span><span class=\"ff6 lsa ws6\">97<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y63 ff2 fs4 fc0 sc0 ls2 ws3\">3.4<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tFP<span class=\"_ _2\"></span>S<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">97<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yf1 ff2 fs4 fc0 sc0 ls2 ws3\">3.5<span class=\"ff5 ls6 ws2\"> </span>vi<span class=\"_ _2\"></span>brat<span class=\"_ _2\"></span>e<span class=\"ff1 ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">97<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y65 ff2 fs4 fc0 sc0 ls2 ws3\">3.6<span class=\"ff5 ls6 ws2\"> </span>ope<span class=\"_ _2\"></span>nURL<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">97<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y66 ff2 fs4 fc0 sc0 ls2 ws3\">3.7<span class=\"ff5 ls6 ws2\"> </span>js<span class=\"_ _2\"></span>tri<span class=\"_ _2\"></span>ng2st<span class=\"_ _2\"></span>ring<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>......................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">98<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yf2 ff2 fs4 fc0 sc0 ls2 ws3\">3.8<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tDev<span class=\"_ _2\"></span>iceI<span class=\"_ _2\"></span>d<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">98<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yf3 ff2 fs4 fc0 sc0 ls2 ws2\">Bibliothèque <span class=\"_ _2\"></span>ext<span class=\"_ _2\"></span>ern<span class=\"_ _2\"></span>e<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">98<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb9 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Tiny File Di<span class=\"_ _2\"></span>alogs (uniquement pour Windows <span class=\"ls12 wsb\">et</span> <span class=\"_ _2\"></span>Lin<span class=\"_ _2\"></span>ux)<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.....................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">98<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6a ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">class Ti<span class=\"_ _2\"></span>nyDi<span class=\"_ _2\"></span>alog<span class=\"_ _2\"></span>Box<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">98<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>ti<span class=\"_ _2\"></span>nyS<span class=\"_ _2\"></span>tring<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">98<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y88 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>TI<span class=\"_ _2\"></span>NY_F<span class=\"_ _2\"></span>ILE<span class=\"_ _2\"></span>_DIA<span class=\"_ _2\"></span>LOGBO<span class=\"_ _2\"></span>X_PA<span class=\"_ _2\"></span>TH<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">98<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6d ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Fil<span class=\"_ _2\"></span>eDial<span class=\"_ _2\"></span>ogT<span class=\"_ _2\"></span>ype<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.........................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lse ws9\">99<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Dial<span class=\"_ _2\"></span>ogT<span class=\"_ _2\"></span>ype<span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lse ws9\">99<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div></div><a class=\"l\" href=\"#pf59\" data-dest-detail='[89,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:782.120000px;width:470.050000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf59\" data-dest-detail='[89,\"XYZ\",33,217,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:729.260000px;width:470.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5a\" data-dest-detail='[90,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:711.820000px;width:470.250000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5b\" data-dest-detail='[91,\"XYZ\",33,748,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:623.440000px;width:470.250000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5b\" data-dest-detail='[91,\"XYZ\",33,384,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:570.580000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5b\" data-dest-detail='[91,\"XYZ\",33,180,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.750000px;bottom:553.150000px;width:469.900000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5b\" data-dest-detail='[91,\"XYZ\",33,98,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:535.110000px;width:470.250000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5c\" data-dest-detail='[92,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:517.670000px;width:470.300000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5c\" data-dest-detail='[92,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:500.240000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5d\" data-dest-detail='[93,\"XYZ\",33,349,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:376.430000px;width:470.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5d\" data-dest-detail='[93,\"XYZ\",33,241,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:359.000000px;width:470.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5d\" data-dest-detail='[93,\"XYZ\",33,147,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:341.560000px;width:470.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5e\" data-dest-detail='[94,\"XYZ\",33,426,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:323.570000px;width:470.250000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5f\" data-dest-detail='[95,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:306.140000px;width:470.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf5f\" data-dest-detail='[95,\"XYZ\",33,703,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:288.650000px;width:470.200000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,702,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:270.660000px;width:492.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,690,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:253.230000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,582,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:235.240000px;width:480.950000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,206,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:182.330000px;width:481.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf60\" data-dest-detail='[96,\"XYZ\",33,112,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:164.900000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:147.460000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",33,666,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:129.420000px;width:481.100000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:111.990000px;width:514.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",33,381,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:61.279000px;width:481.200000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf61\" data-dest-detail='[97,\"XYZ\",33,140,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:43.242000px;width:481.100000px;height:18.037000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pfe\" class=\"pf w0 h0\" data-page-no=\"e\"><div class=\"pc pce w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Icon<span class=\"_ _2\"></span>Typ<span class=\"_ _2\"></span>e<span class=\"ff1\"> <span class=\"ls5 ws5\">..................................................................................................................................................................................</span> <span class=\"_ _4\"></span><span class=\"ff6 lse ws9\">99<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y42 ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enumDialogTypeToStr <span class=\"_ _4\"></span>/ e<span class=\"_ _2\"></span>num<span class=\"_ _2\"></span>Icon<span class=\"_ _2\"></span>Type<span class=\"_ _2\"></span>ToSt<span class=\"_ _2\"></span>r<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">99<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yaa ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>sh<span class=\"_ _2\"></span>owD<span class=\"_ _2\"></span>ialo<span class=\"_ _2\"></span>gBox<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>...................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">99<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y99 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>sh<span class=\"_ _2\"></span>owFi<span class=\"_ _2\"></span>leD<span class=\"_ _2\"></span>ialo<span class=\"_ _2\"></span>gBox<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">100<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y45 ff2 fs4 fc0 sc0 ls2 ws3\">2.10<span class=\"ff5 ls8 ws2\"> </span>sh<span class=\"_ _2\"></span>owFo<span class=\"_ _2\"></span>lder<span class=\"_ _2\"></span>Dial<span class=\"_ _2\"></span>ogBox<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">100<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yab ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> </span><span class=\"ls13 wsc\">Box<span class=\"ls2 ws2\"> <span class=\"ls14 wsd\">2D</span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">100<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y9b ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> </span><span class=\"ls2 ws3\">T<span class=\"_ _2\"></span>MXL<span class=\"_ _2\"></span>ite<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\">. <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">101<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yac ff2 fs4 fc0 sc0 ls2 ws2\">Game En<span class=\"_ _2\"></span>gine<span class=\"_ _4\"></span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>...................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">101<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y49 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meEn<span class=\"_ _2\"></span>gin<span class=\"_ _2\"></span>e<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">101<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les méthodes de Gam<span class=\"_ _2\"></span>eEng<span class=\"_ _2\"></span>ine<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">101<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y8a ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eEn<span class=\"_ _2\"></span>gine<span class=\"_ _2\"></span><span class=\"ff1 ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">101<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y8b ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>in<span class=\"_ _2\"></span>itEn<span class=\"_ _2\"></span>gin<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">101<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4d ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>p<span class=\"_ _2\"></span>la<span class=\"_ _2\"></span>y<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">...................................................................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">101<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y8c ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>ba<span class=\"_ _2\"></span>sicS<span class=\"_ _2\"></span>FMLm<span class=\"_ _2\"></span>ain<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">101<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4f ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tRen<span class=\"_ _2\"></span>derW<span class=\"_ _2\"></span>indow<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">101<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y9d ff2 fs4 fc0 sc0 ls2 ws2\">Configuration <span class=\"lsb ws7\">du<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> j<span class=\"_ _4\"></span>eu<span class=\"_ _4\"></span><span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">102<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y8d ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">enum <span class=\"_ _2\"></span>Disp<span class=\"_ _2\"></span>lay<span class=\"_ _2\"></span>Opti<span class=\"_ _2\"></span>on<span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">102<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y52 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Paramètre <span class=\"_ _2\"></span><span class=\"lsb ws7\">de<span class=\"ls2 ws2\"> <span class=\"ls15 wse\">la</span> fe<span class=\"_ _2\"></span>nêtr<span class=\"_ _2\"></span>e<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">102<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y53 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>WI<span class=\"_ _2\"></span>NDO<span class=\"_ _2\"></span>W_WID<span class=\"_ _2\"></span>TH<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">102<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8e ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>WI<span class=\"_ _2\"></span>NDO<span class=\"_ _2\"></span>W_HEI<span class=\"_ _2\"></span>GHT<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">102<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y55 ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>VI<span class=\"_ _2\"></span>EW_W<span class=\"_ _2\"></span>IDTH<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">102<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y56 ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>VI<span class=\"_ _2\"></span>EW_H<span class=\"_ _2\"></span>EIGH<span class=\"_ _2\"></span>T<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yf4 ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>F<span class=\"_ _2\"></span>PS<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7b ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>WI<span class=\"_ _2\"></span>NDO<span class=\"_ _2\"></span>W_SET<span class=\"_ _2\"></span>TING<span class=\"_ _2\"></span>S<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y59 ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Paramètre <span class=\"_ _2\"></span><span class=\"lsb ws7\">des<span class=\"ls2 ws2\"> boutons <span class=\"_ _2\"></span><span class=\"lsb ws7\">de<span class=\"ls2 ws2\"> va<span class=\"_ _2\"></span>lid<span class=\"_ _2\"></span>ati<span class=\"_ _2\"></span>on<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">..................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yf5 ff2 fs4 fc0 sc0 ls2 ws3\">3.1<span class=\"ff5 ls6 ws2\"> </span>KE<span class=\"_ _2\"></span>Y_V<span class=\"_ _2\"></span>ALIDA<span class=\"_ _2\"></span>TION<span class=\"_ _2\"></span>_MO<span class=\"_ _2\"></span>USE<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">..............................................................................................................................................................</span> <span class=\"_ _7\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 yf6 ff2 fs4 fc0 sc0 ls2 ws3\">3.2<span class=\"ff5 ls6 ws2\"> </span>KE<span class=\"_ _2\"></span>Y_V<span class=\"_ _2\"></span>ALIDA<span class=\"_ _2\"></span>TION<span class=\"_ _2\"></span>_KEY<span class=\"_ _2\"></span>BOAR<span class=\"_ _2\"></span>D<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5c ff2 fs4 fc0 sc0 ls2 ws3\">3.3<span class=\"ff5 ls6 ws2\"> </span>KE<span class=\"_ _2\"></span>Y_C<span class=\"_ _2\"></span>ANCEL<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>....................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5d ff2 fs4 fc0 sc0 ls9 ws4\">4.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Paramètre <span class=\"_ _2\"></span><span class=\"lsb ws7\">des<span class=\"ls2 ws2\"> touches <span class=\"_ _2\"></span><span class=\"lsb ws7\">du<span class=\"ls2 ws2\"> c<span class=\"_ _2\"></span>lavi<span class=\"_ _2\"></span>er<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yef ff2 fs4 fc0 sc0 ls2 ws3\">4.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">KE<span class=\"_ _2\"></span>Y_A <span class=\"_ _2\"></span>et K<span class=\"_ _2\"></span>EY_B<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yf7 ff2 fs4 fc0 sc0 ls2 ws3\">4.2<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">KE<span class=\"_ _2\"></span>Y_X <span class=\"_ _2\"></span>et K<span class=\"_ _2\"></span>EY_Y<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">103<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y60 ff2 fs4 fc0 sc0 ls2 ws3\">4.3<span class=\"ff5 ls6 ws2\"> </span>KE<span class=\"_ _2\"></span>Y_L<span class=\"_ _2\"></span>EFT<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">104<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y61 ff2 fs4 fc0 sc0 ls2 ws3\">4.4<span class=\"ff5 ls6 ws2\"> </span>KE<span class=\"_ _2\"></span>Y_RI<span class=\"_ _2\"></span>GHT<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.......................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">104<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yf8 ff2 fs4 fc0 sc0 ls2 ws3\">4.5<span class=\"ff5 ls6 ws2\"> </span>KE<span class=\"_ _2\"></span>Y_UP<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>.............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">104<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y63 ff2 fs4 fc0 sc0 ls2 ws3\">4.6<span class=\"ff5 ls6 ws2\"> </span>KE<span class=\"_ _2\"></span>Y_DO<span class=\"_ _2\"></span>WN<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">104<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yf9 ff2 fs4 fc0 sc0 ls9 ws4\">5.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Valeur par <span class=\"_ _2\"></span>defaut <span class=\"lsb ws7\">des</span> compos<span class=\"_ _2\"></span>ants S<span class=\"_ _4\"></span>FML<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">104<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yfa ff2 fs4 fc0 sc0 ls2 ws3\">5.1<span class=\"ff5 ls6 ws2\"> </span>DE<span class=\"_ _2\"></span>FAUL<span class=\"_ _2\"></span>T_SF<span class=\"_ _2\"></span>ML_<span class=\"_ _2\"></span>TEXT<span class=\"_ _2\"></span>_SIZ<span class=\"_ _2\"></span>E<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">............................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">104<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y96 ff2 fs4 fc0 sc0 ls2 ws3\">5.2<span class=\"ff5 ls6 ws2\"> </span>DE<span class=\"_ _2\"></span>FAUL<span class=\"_ _2\"></span>T_SF<span class=\"_ _2\"></span>ML_<span class=\"_ _2\"></span>TEXT<span class=\"_ _2\"></span>_COL<span class=\"_ _2\"></span>OR<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">104<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y67 ff2 fs4 fc0 sc0 ls2 ws3\">5.3<span class=\"ff5 ls6 ws2\"> </span>DE<span class=\"_ _2\"></span>FAUL<span class=\"_ _2\"></span>T_SF<span class=\"_ _2\"></span>ML_<span class=\"_ _2\"></span>SELE<span class=\"_ _2\"></span>CTE<span class=\"_ _2\"></span>D_TEXT<span class=\"_ _2\"></span>_COL<span class=\"_ _2\"></span>OR<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.....<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">104<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ya7 ff2 fs4 fc0 sc0 ls2 ws3\">5.4<span class=\"ff5 ls6 ws2\"> </span>DE<span class=\"_ _2\"></span>FAUL<span class=\"_ _2\"></span>T_MS<span class=\"_ _2\"></span>G_B<span class=\"_ _2\"></span>OX_TE<span class=\"_ _2\"></span>XT_S<span class=\"_ _2\"></span>IZE<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.....................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">104<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb9 ff2 fs4 fc0 sc0 ls2 ws3\">5.5<span class=\"ff5 ls6 ws2\"> </span>DE<span class=\"_ _2\"></span>FAUL<span class=\"_ _2\"></span>T_MS<span class=\"_ _2\"></span>G_B<span class=\"_ _2\"></span>OX_B<span class=\"_ _2\"></span>UTTO<span class=\"_ _2\"></span>N_TEX<span class=\"_ _2\"></span>T_SI<span class=\"_ _2\"></span>ZE<span class=\"ff1 ws2\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">.....................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">105<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y98 ff2 fs4 fc0 sc0 ls2 ws3\">5.6<span class=\"ff5 ls6 ws2\"> </span>DE<span class=\"_ _2\"></span>FAUL<span class=\"_ _2\"></span>T_MS<span class=\"_ _2\"></span>G_B<span class=\"_ _2\"></span>OX_TE<span class=\"_ _2\"></span>XT_C<span class=\"_ _2\"></span>OLOR<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">105<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">5.7<span class=\"ff5 ls6 ws2\"> </span>DE<span class=\"_ _2\"></span>FAUL<span class=\"_ _2\"></span>T_MS<span class=\"_ _2\"></span>G_B<span class=\"_ _2\"></span>OX_SE<span class=\"_ _2\"></span>LEC<span class=\"_ _2\"></span>TED_T<span class=\"_ _2\"></span>EXT<span class=\"_ _2\"></span>_COL<span class=\"_ _2\"></span>OR<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">..............................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">105<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6c ff2 fs4 fc0 sc0 ls2 ws3\">5.8<span class=\"ff5 ls6 ws2\"> </span>DE<span class=\"_ _2\"></span>FAUL<span class=\"_ _2\"></span>T_R<span class=\"_ _2\"></span>PG_DI<span class=\"_ _2\"></span>ALO<span class=\"_ _2\"></span>G_TE<span class=\"_ _2\"></span>XT_SI<span class=\"_ _2\"></span>ZE<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">105<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 ybb ff2 fs4 fc0 sc0 ls2 ws3\">5.9<span class=\"ff5 ls6 ws2\"> </span>DE<span class=\"_ _2\"></span>FAUL<span class=\"_ _2\"></span>T_R<span class=\"_ _2\"></span>PG_DI<span class=\"_ _2\"></span>ALO<span class=\"_ _2\"></span>G_BUT<span class=\"_ _2\"></span>TON_<span class=\"_ _2\"></span>TEXT<span class=\"_ _2\"></span>_SIZ<span class=\"_ _2\"></span>E<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">105<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls2 ws3\">5.10<span class=\"ff5 ls8 ws2\"> </span>DEF<span class=\"_ _2\"></span>AUL<span class=\"_ _2\"></span>T_RP<span class=\"_ _2\"></span>G_DI<span class=\"_ _2\"></span>ALO<span class=\"_ _2\"></span>G_TE<span class=\"_ _2\"></span>XT_COL<span class=\"_ _2\"></span>OR<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">.......................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">105<span class=\"ls2 ws2\"> </span></span></span></span></span></div></div><a class=\"l\" href=\"#pf62\" data-dest-detail='[98,\"XYZ\",33,295,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:782.720000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf62\" data-dest-detail='[98,\"XYZ\",33,161,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:765.230000px;width:481.050000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf63\" data-dest-detail='[99,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:747.240000px;width:481.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf63\" data-dest-detail='[99,\"XYZ\",33,431,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:729.810000px;width:470.250000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf63\" data-dest-detail='[99,\"XYZ\",33,114,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:712.370000px;width:492.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf64\" data-dest-detail='[100,\"XYZ\",33,758,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:694.340000px;width:492.000000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf64\" data-dest-detail='[100,\"XYZ\",33,485,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:641.480000px;width:492.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf64\" data-dest-detail='[100,\"XYZ\",33,464,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:624.040000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf64\" data-dest-detail='[100,\"XYZ\",33,99,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:553.150000px;width:480.950000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf65\" data-dest-detail='[101,\"XYZ\",33,342,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:500.240000px;width:492.100000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf65\" data-dest-detail='[101,\"XYZ\",33,319,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:482.800000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf65\" data-dest-detail='[101,\"XYZ\",33,223,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:465.360000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf65\" data-dest-detail='[101,\"XYZ\",33,141,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:447.330000px;width:481.100000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,783,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:429.890000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,689,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:412.460000px;width:481.050000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,595,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:394.470000px;width:481.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,513,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:377.030000px;width:492.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,490,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:359.550000px;width:481.050000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,405,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:341.560000px;width:481.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,300,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:324.120000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,206,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:306.140000px;width:492.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,194,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:288.650000px;width:481.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf66\" data-dest-detail='[102,\"XYZ\",33,75,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:271.210000px;width:481.000000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,756,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:253.230000px;width:481.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,650,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:235.790000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,568,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:218.360000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,474,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:200.320000px;width:481.100000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,381,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:182.880000px;width:492.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,357,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:167.600000px;width:481.150000px;height:15.280000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,273,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:149.610000px;width:481.050000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,167,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:132.170000px;width:481.100000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf67\" data-dest-detail='[103,\"XYZ\",33,85,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:114.140000px;width:481.150000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:96.701000px;width:481.100000px;height:17.439000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,654,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:79.265000px;width:481.050000px;height:17.436000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,549,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:61.279000px;width:481.200000px;height:17.986000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,455,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:43.842000px;width:481.100000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,372,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:26.356000px;width:481.150000px;height:17.486000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,267,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:8.369800px;width:470.300000px;height:17.986200px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pff\" class=\"pf w0 h0\" data-page-no=\"f\"><div class=\"pc pcf w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls2 ws3\">5.11<span class=\"ff5 ls8 ws2\"> </span>DEF<span class=\"_ _2\"></span>AUL<span class=\"_ _2\"></span>T_RP<span class=\"_ _2\"></span>G_DI<span class=\"_ _2\"></span>ALO<span class=\"_ _2\"></span>G_SEL<span class=\"_ _2\"></span>ECTED<span class=\"_ _2\"></span>_TE<span class=\"_ _2\"></span>XT_C<span class=\"_ _2\"></span>OLOR<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">....................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">105<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y42 ff2 fs4 fc0 sc0 ls2 ws3\">5.12<span class=\"ff5 ls8 ws2\"> </span>DEF<span class=\"_ _2\"></span>AUL<span class=\"_ _2\"></span>T_BUT<span class=\"_ _2\"></span>TON<span class=\"_ _2\"></span>_TEX<span class=\"_ _2\"></span>T_CO<span class=\"_ _2\"></span>LOR<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">105<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y43 ff2 fs4 fc0 sc0 ls9 ws4\">6.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les informations du j<span class=\"_ _2\"></span>eu<span class=\"_ _4\"></span><span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">106<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y99 ff2 fs4 fc0 sc0 ls2 ws3\">6.1<span class=\"ff5 ls6 ws2\"> </span>MA<span class=\"_ _2\"></span>JOR<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">106<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y70 ff2 fs4 fc0 sc0 ls2 ws3\">6.2<span class=\"ff5 ls6 ws2\"> </span>MI<span class=\"_ _2\"></span>NOR<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>..............................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">106<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y46 ff2 fs4 fc0 sc0 ls2 ws3\">6.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tGam<span class=\"_ _2\"></span>eVe<span class=\"_ _2\"></span>rsio<span class=\"_ _2\"></span>n<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">106<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y47 ff2 fs4 fc0 sc0 ls2 ws3\">6.4<span class=\"ff5 ls6 ws2\"> </span>GAM<span class=\"_ _2\"></span>E_N<span class=\"_ _2\"></span>AME<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">106<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y72 ff2 fs4 fc0 sc0 ls2 ws3\">6.5<span class=\"ff5 ls6 ws2\"> </span>GAM<span class=\"_ _2\"></span>E_A<span class=\"_ _2\"></span>UTHO<span class=\"_ _2\"></span>R<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">106<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y49 ff2 fs4 fc0 sc0 ls9 ws4\">7.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Paramètre <span class=\"_ _2\"></span>Ad<span class=\"_ _2\"></span>mob<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">106<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls2 ws3\">7.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ls16 wsf\">Id</span><span class=\"ws2\"> de la <span class=\"ls17 ws10\">PUB</span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">106<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y4b ff2 fs4 fc0 sc0 ls2 ws3\">7.1.1<span class=\"ff5 ls7 ws2\"> </span>kA<span class=\"_ _2\"></span>dMob<span class=\"_ _2\"></span>AppI<span class=\"_ _2\"></span>D<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">106<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8b ff2 fs4 fc0 sc0 ls2 ws3\">7.1.2<span class=\"ff5 ls7 ws2\"> </span>kB<span class=\"_ _2\"></span>anner<span class=\"_ _2\"></span>AdUn<span class=\"_ _2\"></span>it<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y4d ff2 fs4 fc0 sc0 ls2 ws3\">7.1.3<span class=\"ff5 ls7 ws2\"> </span>kRe<span class=\"_ _2\"></span>ward<span class=\"_ _2\"></span>edVi<span class=\"_ _2\"></span>deoAd<span class=\"_ _2\"></span>Unit<span class=\"_ _4\"></span><span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.............................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y4e ff2 fs4 fc0 sc0 ls2 ws3\">7.2<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">Taille <span class=\"lsb ws7\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls15 wse\">la</span> bannière <span class=\"lsb ws7\">de</span> <span class=\"_ _2\"></span>PU<span class=\"_ _2\"></span>B<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y4f ff2 fs4 fc0 sc0 ls2 ws3\">7.2.1<span class=\"ff5 ls7 ws2\"> </span>kB<span class=\"_ _2\"></span>anner<span class=\"_ _2\"></span>Widt<span class=\"_ _2\"></span>h<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y50 ff2 fs4 fc0 sc0 ls2 ws3\">7.2.2<span class=\"ff5 ls7 ws2\"> </span>kB<span class=\"_ _2\"></span>anner<span class=\"_ _2\"></span>Hei<span class=\"_ _2\"></span>ght<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y51 ff2 fs4 fc0 sc0 ls2 ws3\">7.3<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">Publique cible <span class=\"_ _2\"></span><span class=\"lsb ws7\">de<span class=\"ls2 ws2\"> <span class=\"ls15 wse\">la</span> P<span class=\"_ _4\"></span>UB<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................<span class=\"_ _1\"></span>..................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y52 ff2 fs4 fc0 sc0 ls2 ws3\">7.3.1<span class=\"ff5 ls7 ws2\"> </span>kB<span class=\"_ _2\"></span>irth<span class=\"_ _2\"></span>dayDa<span class=\"_ _2\"></span>y<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>...............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y53 ff2 fs4 fc0 sc0 ls2 ws3\">7.3.2<span class=\"ff5 ls7 ws2\"> </span>kB<span class=\"_ _2\"></span>irth<span class=\"_ _2\"></span>dayM<span class=\"_ _2\"></span>onth<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>..........................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y54 ff2 fs4 fc0 sc0 ls2 ws3\">7.3.3<span class=\"ff5 ls7 ws2\"> </span>kB<span class=\"_ _2\"></span>irth<span class=\"_ _2\"></span>dayYe<span class=\"_ _2\"></span>ar<span class=\"ff1 ws2\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y55 ff2 fs4 fc0 sc0 ls2 ws3\">7.3.4<span class=\"ff5 ls7 ws2\"> </span>kK<span class=\"_ _2\"></span>eywo<span class=\"_ _2\"></span>rds<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">107<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yfb ff2 fs4 fc0 sc0 ls9 ws4\">8.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Chemin des fichiers ressources du je<span class=\"_ _4\"></span>u<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">108<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y57 ff2 fs4 fc0 sc0 ls2 ws3\">8.1<span class=\"ff5 ls6 ws2\"> </span>AS<span class=\"_ _2\"></span>SETS<span class=\"_ _2\"></span>_DI<span class=\"_ _2\"></span>R<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">......................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">108<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y58 ff2 fs4 fc0 sc0 ls2 ws3\">8.2<span class=\"ff5 ls6 ws2\"> </span>GUI<span class=\"_ _2\"></span>_DI<span class=\"_ _2\"></span>R<span class=\"ff1 ls5 ws5\">.............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">108<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y7c ff2 fs4 fc0 sc0 ls2 ws3\">8.3<span class=\"ff5 ls6 ws2\"> </span>FO<span class=\"_ _2\"></span>NT_<span class=\"_ _2\"></span>DIR<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.........................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">108<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5a ff2 fs4 fc0 sc0 ls2 ws3\">8.4<span class=\"ff5 ls6 ws2\"> </span>SP<span class=\"_ _2\"></span>RIT<span class=\"_ _2\"></span>ES_DI<span class=\"_ _2\"></span>R<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">....................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">108<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y5b ff2 fs4 fc0 sc0 ls2 ws3\">8.5<span class=\"ff5 ls6 ws2\"> </span>TI<span class=\"_ _2\"></span>LES<span class=\"_ _2\"></span>_DIR<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.........................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">108<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y7e ff2 fs4 fc0 sc0 ls2 ws3\">8.6<span class=\"ff5 ls6 ws2\"> </span>SF<span class=\"_ _2\"></span>X_DI<span class=\"_ _2\"></span>R<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">............................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">108<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y5d ff2 fs4 fc0 sc0 ls2 ws3\">8.7<span class=\"ff5 ls6 ws2\"> </span>MU<span class=\"_ _2\"></span>SIC<span class=\"_ _2\"></span>_DIR<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">108<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5e ff2 fs4 fc0 sc0 ls2 ws3\">8.8<span class=\"ff5 ls6 ws2\"> </span>TM<span class=\"_ _2\"></span>X_RS<span class=\"_ _2\"></span>C_DI<span class=\"_ _2\"></span>R<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">108<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y5f ff2 fs4 fc0 sc0 ls9 ws4\">9.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Nom <span class=\"lsb ws7\">du<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> package <span class=\"lsb ws7\">du</span> jeu (<span class=\"_ _2\"></span>Mobi<span class=\"_ _2\"></span>le)<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">.........................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">109<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y80 ff2 fs4 fc0 sc0 ls9 ws4\">10.<span class=\"ff5 lsf ws2\"> <span class=\"ff2 ls2\">Ch<span class=\"_ _2\"></span>emin <span class=\"lsb ws7\">des</span> fichiers <span class=\"lsb ws7\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> sau<span class=\"_ _2\"></span>vegar<span class=\"_ _2\"></span>de<span class=\"ff1 ls5 ws5\">.................................................................................................................................................</span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">109<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yb6 ff2 fs4 fc0 sc0 ls2 ws3\">10.1<span class=\"ff5 ls8 ws2\"> </span>DAT<span class=\"_ _2\"></span>A_PA<span class=\"_ _2\"></span>RENT<span class=\"_ _2\"></span>_DI<span class=\"_ _2\"></span>R<span class=\"ff1 ls5 ws5\">.....................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">109<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y93 ff2 fs4 fc0 sc0 ls2 ws3\">10.2<span class=\"ff5 ls8 ws2\"> </span>GAM<span class=\"_ _2\"></span>E_DA<span class=\"_ _2\"></span>TA_<span class=\"_ _2\"></span>FILE<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.......................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">109<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y82 ff2 fs4 fc0 sc0 ls2 ws3\">10.3<span class=\"ff5 ls8 ws2\"> </span>CON<span class=\"_ _2\"></span>FIG<span class=\"_ _2\"></span>_FIL<span class=\"_ _2\"></span>E<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">...............................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">109<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y83 ff2 fs4 fc0 sc0 ls2 ws3\">10.4<span class=\"ff5 ls8 ws2\"> </span>GAM<span class=\"_ _2\"></span>E_PA<span class=\"_ _2\"></span>D_FI<span class=\"_ _2\"></span>LE<span class=\"ff1 ws2\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">109<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y95 ff2 fs4 fc0 sc0 ls2 ws3\">Act<span class=\"_ _2\"></span>ivi<span class=\"_ _2\"></span>té<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">109<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y96 ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meAc<span class=\"_ _2\"></span>tiv<span class=\"_ _2\"></span>ity<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">109<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y86 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments <span class=\"lsc ws8\">de</span> Game<span class=\"_ _2\"></span>Act<span class=\"_ _2\"></span>ivit<span class=\"_ _2\"></span>y;<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">............................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y68 ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eAc<span class=\"_ _2\"></span>tivi<span class=\"_ _2\"></span>ty<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yb9 ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span>m_<span class=\"_ _2\"></span>gam<span class=\"_ _2\"></span>eSce<span class=\"_ _2\"></span>ne<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">...................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6a ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>on<span class=\"_ _2\"></span>Updat<span class=\"_ _2\"></span>e<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6b ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>on<span class=\"_ _2\"></span>Draw<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"_ _1\"></span>.............................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6c ff2 fs4 fc0 sc0 ls2 ws3\">Niv<span class=\"_ _2\"></span>eau<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">.............................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y6d ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les ni<span class=\"_ _2\"></span>veau<span class=\"_ _2\"></span>x<span class=\"ff1\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................................................................................<span class=\"_ _1\"></span>............................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y6e ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Intégration <span class=\"ff3 ws3\">d’un<span class=\"_ _2\"></span><span class=\"ff2 ws2\"> niv<span class=\"_ _2\"></span>eau<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></span></div></div><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,173,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:800.150000px;width:470.200000px;height:10.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf68\" data-dest-detail='[104,\"XYZ\",33,79,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:782.720000px;width:470.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,737,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:764.680000px;width:492.100000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,725,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:747.240000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,641,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:729.260000px;width:481.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,547,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:711.820000px;width:481.200000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,441,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:694.390000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,359,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.350000px;width:480.950000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf69\" data-dest-detail='[105,\"XYZ\",33,179,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:641.480000px;width:481.150000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6a\" data-dest-detail='[106,\"XYZ\",33,631,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:570.580000px;width:481.000000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6a\" data-dest-detail='[106,\"XYZ\",33,429,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:517.670000px;width:481.200000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,795,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:429.890000px;width:492.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,772,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:411.900000px;width:481.100000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,676,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:394.470000px;width:481.000000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,582,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:376.480000px;width:481.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,488,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:359.000000px;width:481.050000px;height:17.480000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,405,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:341.560000px;width:481.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,300,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:323.570000px;width:481.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,206,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:306.140000px;width:481.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6b\" data-dest-detail='[107,\"XYZ\",33,112,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:288.700000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,642,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.750000px;bottom:253.230000px;width:480.850000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,631,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:237.940000px;width:470.200000px;height:15.290000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,547,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:219.960000px;width:470.200000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,453,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:202.520000px;width:470.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,359,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:184.480000px;width:470.150000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6c\" data-dest-detail='[108,\"XYZ\",33,230,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:167.050000px;width:514.100000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6d\" data-dest-detail='[109,\"XYZ\",33,811,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:131.620000px;width:492.150000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6d\" data-dest-detail='[109,\"XYZ\",33,394,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:43.842000px;width:514.100000px;height:17.437000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf10\" class=\"pf w0 h0\" data-page-no=\"10\"><div class=\"pc pc10 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEwBhAIii3AjZwV0cQAi4jbWlYOkQjuAQQsqMYmlrK7zXXXvdBwAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0uAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1uQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1ecCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAGjnluQAAABASURBVFSfCwAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAPCt+rbxSJJc095bTc7hLvPy7rL23mriMgAAgB95AKqIHzXyv4rUAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x6 h8 y41 ff2 fs4 fc0 sc0 ls9 ws4\">3.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments pour gérer les niv<span class=\"_ _4\"></span>eaux<span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">...................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y42 ff2 fs4 fc0 sc0 ls2 ws3\">3.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">namespace <span class=\"_ _4\"></span>level<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">...............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yfc ff2 fs4 fc0 sc0 ls2 ws3\">3.2<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Leve<span class=\"_ _2\"></span>lId<span class=\"ff1\"> <span class=\"_ _3\"></span><span class=\"ls5 ws5\">....................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">110<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y99 ff2 fs4 fc0 sc0 ls2 ws3\">3.3<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tLev<span class=\"_ _2\"></span>elM<span class=\"_ _2\"></span>ap<span class=\"ff1 ws2\"> <span class=\"_ _0\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>.....................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">111<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y45 ff2 fs4 fc0 sc0 ls2 ws2\">Langage <span class=\"lsb ws7\">du<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> je<span class=\"_ _2\"></span>u<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">111<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yab ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les la<span class=\"_ _2\"></span>ngu<span class=\"_ _2\"></span>es<span class=\"ff1\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">111<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y47 ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments pour gérer les la<span class=\"_ _2\"></span>ngu<span class=\"_ _2\"></span>es<span class=\"ff1\"> <span class=\"_ _2\"></span><span class=\"ls5 ws5\">...................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">111<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yac ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">namespace <span class=\"_ _4\"></span><span class=\"ls18 ws11\">La<span class=\"_ _1\"></span><span class=\"ls19 ws12\">ng<span class=\"ff1 ls2 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>...............................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">111<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yad ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Game<span class=\"_ _2\"></span>Lang<span class=\"_ _2\"></span>uag<span class=\"_ _2\"></span>e<span class=\"ff1\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">.......................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">112<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y4a ff2 fs4 fc0 sc0 ls2 ws2\">Boite <span class=\"lsb ws7\">de</span> <span class=\"_ _2\"></span>Dialogue <span class=\"lsb ws7\">du</span> j<span class=\"_ _4\"></span>eu<span class=\"_ _2\"></span><span class=\"ff1 ls5 ws5\">.................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">112<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 h8 y8a ff2 fs4 fc0 sc0 ls9 ws4\">1.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">class Ga<span class=\"_ _2\"></span>meDi<span class=\"_ _2\"></span>alog<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">112<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yae ff2 fs4 fc0 sc0 ls9 ws4\">2.<span class=\"ff5 ls4 ws2\"> <span class=\"ff2 ls2\">Les <span class=\"_ _2\"></span>éléments <span class=\"lsc ws8\">de</span> Game<span class=\"_ _2\"></span>Dial<span class=\"_ _2\"></span>og<span class=\"ff1\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">112<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x6 h8 y4d ff2 fs4 fc0 sc0 ls2 ws3\">2.1<span class=\"ff5 ls6 ws2\"> </span>Gam<span class=\"_ _2\"></span>eDia<span class=\"_ _2\"></span>log<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">......................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">112<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y8c ff2 fs4 fc0 sc0 ls2 ws3\">2.2<span class=\"ff5 ls6 ws2\"> </span><span class=\"ws2\">enum <span class=\"_ _2\"></span>Dial<span class=\"_ _2\"></span>ogI<span class=\"_ _2\"></span>ndex<span class=\"_ _2\"></span><span class=\"ff1\"> <span class=\"_ _4\"></span><span class=\"ls5 ws5\">............................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">113<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 h8 yfd ff2 fs4 fc0 sc0 ls2 ws3\">2.3<span class=\"ff5 ls6 ws2\"> </span>li<span class=\"_ _2\"></span>nkA<span class=\"_ _2\"></span>rrayT<span class=\"_ _2\"></span>oEnu<span class=\"_ _2\"></span>m<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">............................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">113<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y9d ff2 fs4 fc0 sc0 ls2 ws3\">2.4<span class=\"ff5 ls6 ws2\"> </span>s<span class=\"_ _2\"></span>te<span class=\"_ _2\"></span>p<span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">...................................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">114<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y8d ff2 fs4 fc0 sc0 ls2 ws3\">2.5<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tDia<span class=\"_ _2\"></span>log<span class=\"ff1 ws2\"> <span class=\"_ _6\"></span><span class=\"ls5 ws5\">...........................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">114<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yfe ff2 fs4 fc0 sc0 ls2 ws3\">2.6<span class=\"ff5 ls6 ws2\"> </span>se<span class=\"_ _2\"></span>tMou<span class=\"_ _2\"></span>seI<span class=\"_ _2\"></span>nColl<span class=\"_ _2\"></span>iso<span class=\"_ _2\"></span>n<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">..........................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff6 lsa ws6\">114<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yff ff2 fs4 fc0 sc0 ls2 ws3\">2.7<span class=\"ff5 ls6 ws2\"> </span>d<span class=\"_ _2\"></span>ra<span class=\"_ _2\"></span>w<span class=\"ff1 ws2\"> <span class=\"_ _5\"></span><span class=\"ls5 ws5\">..................................................................................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">114<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 y8e ff2 fs4 fc0 sc0 ls2 ws3\">2.8<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tDia<span class=\"_ _2\"></span>log<span class=\"_ _2\"></span>Index<span class=\"_ _2\"></span><span class=\"ff1 ws2\"> <span class=\"ls5 ws5\">.................................................................................................................................................................................</span> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">114<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 h8 y55 ff2 fs4 fc0 sc0 ls2 ws3\">2.9<span class=\"ff5 ls6 ws2\"> </span>ge<span class=\"_ _2\"></span>tMou<span class=\"_ _2\"></span>seI<span class=\"_ _2\"></span>nColl<span class=\"_ _2\"></span>ison<span class=\"ff1 ws2\"> <span class=\"_ _8\"></span><span class=\"ls5 ws5\">................................<span class=\"_ _1\"></span>..........................................................................................................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">114<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x6 h8 yfb ff2 fs4 fc0 sc0 ls2 ws3\">2.10<span class=\"ff5 ls8 ws2\"> </span>sh<span class=\"_ _2\"></span>owDi<span class=\"_ _2\"></span>alog<span class=\"ff1 ws2\"> <span class=\"_ _7\"></span><span class=\"ls5 ws5\">................................................................................................................................<span class=\"_ _1\"></span>..................................................<span class=\"ls2 ws2\"> <span class=\"_ _0\"></span><span class=\"ff6 lsa ws6\">114<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x1 h9 y100 ff6 fs3 fc0 sc0 ls2 ws2\"> </div></div><a class=\"l\" href=\"#pf6e\" data-dest-detail='[110,\"XYZ\",33,626,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:747.240000px;width:481.050000px;height:18.040000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6e\" data-dest-detail='[110,\"XYZ\",33,215,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:729.810000px;width:514.200000px;height:17.430000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6e\" data-dest-detail='[110,\"XYZ\",33,183,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:712.370000px;width:492.150000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6e\" data-dest-detail='[110,\"XYZ\",33,112,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:694.390000px;width:492.050000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6e\" data-dest-detail='[110,\"XYZ\",33,100,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:676.900000px;width:481.000000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6f\" data-dest-detail='[111,\"XYZ\",33,322,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:40.500000px;bottom:641.480000px;width:514.150000px;height:17.980000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6f\" data-dest-detail='[111,\"XYZ\",33,288,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:624.040000px;width:492.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6f\" data-dest-detail='[111,\"XYZ\",33,154,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:62.600000px;bottom:606.600000px;width:492.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf6f\" data-dest-detail='[111,\"XYZ\",33,132,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:588.570000px;width:481.000000px;height:18.030000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf71\" data-dest-detail='[113,\"XYZ\",33,771,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:535.710000px;width:481.200000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf71\" data-dest-detail='[113,\"XYZ\",33,679,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:518.270000px;width:481.050000px;height:17.440000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf71\" data-dest-detail='[113,\"XYZ\",33,492,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:73.600000px;bottom:482.800000px;width:480.950000px;height:17.990000px;background-color:rgba(255,255,255,0.000001);\"></div></a><a class=\"l\" href=\"#pf71\" data-dest-detail='[113,\"XYZ\",33,196,null]'><div class=\"d m1\" style=\"border-style:none;position:absolute;left:84.550000px;bottom:429.890000px;width:470.100000px;height:17.490000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf11\" class=\"pf w0 h0\" data-page-no=\"11\"><div class=\"pc pc11 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAACAn6PRpwD40NV7fj7f+5b3/Tr5nh/E+oP6d/zqUfm+P+bf5DOVDpwP7iivu6/cQ4df1o864H7E0f/vO07q3/p3zPd8bEZE1cM/nR/nIf3+k15E1EMHx/nR8yM/WfWjv5T5wBnyR37Ff/Sh8+AR6jQGqg/4aMY9y8gkH3x7f2/P1bvv3d56r4eGmPfe/teNqqM/9MfM9w1gqv7iACrf/mTkwyOofN9fKg2ZPpxjvWr5V0Srt6PuOKI/O4JPx2c9NJav0zdBrsdBeyca/y01dzwM691jL/+q7+r73wrLaz7wTZvV/uqW+XkcDvcz+P73eGXVsaHPXu9dKWh/8Uub629y/9fJh37laHX/aPvLNZfvOTbfc5RVRGV74KT3A39+5zdQfcDPSY/TiPfemCOzL288vwady0c8METIqtbfM4rKt371uzHRjx9VVEZFzGe/9un17If3+rXeudKef2lU2x8aWWXJu5/DSL+ijgd7Ww/7Hu3uSFquW5y+H4aoiv7OlGDd+5apPCZfVOV8nEY8O9DqdPkh12+m48C8lqMqa+2A0xuW/+59+TY8frNkRdYpMt+eo7s/D3Vv8J8RrXr2it7vfSfksVTbR5V8p8/QFL3un0eO/yzJn3fNVlEtKvPsk9qPX6jTl7e9c8D1B3Pq/rxerWeeahUPHG1Z76u+qlZvXWnIU8zmwx/Q36n746FaZ793GeKC6gN+nqOfh0cVtVTZu/N6Q6wjnrr31jzNDVae9dxxaBt3Mynr0DZzGaU8dOn7rdeMipxz/fXPx2l1N2i5H3UV9deslnr/2rjMu3Hdu03Ih3Kcr9GV1aJyyblWp7HyO5cEskfLamcD7zjVWh1/wfXY6xlRVb3XEBkt6+4qRFVF7+vPZFRmVEa0qB5zrxbZTnMw63RP9IioaMNxXWYt05S994rMli3bKTEqKrLyrWMxzw7Piqyziy7neViRFe2jnbOus047nUcqjy1f52exu44+O2by7LA4Hku1vByvdeWDax4evCYRdZoJvJshvL8gon7EJaz8gfN8vnsdrB78iCxnDFB9wM9NOw4J3iq5iuF8wHD/rpP771uR0TOntk6UVOT5eKm/PWZZ/z22GP+qdKoHlifl/R/W/QHN/RVN9YOllvHWqq27y+L5QEFKvg8r+SpaH9ZDoM6maNpaYZGnjlvf0nM+xtrZjPLce/aKiDa0bK3WubzKrNzWcbxcvaKielVm5qbFcZHpaZlpZMVwXEWd6y8S/difme0YY5VVURVZm80yGXlcf1pVPTJaa+186nz9vmzrfFXeLUHNe1M6raJV3t2v9lHFX1YOb/1MHkv4OPmb9y9svd3W67nz7ERU59lU/T3tlA9ec8o5Yj7W2bqC+HRSu1tqfzYRN6yn0PtX6u6F3dkPq62X8TIq7i4aOJGB6gN+dgPf94451jHwEPcuXvfj+z60DnN4Nx6z9u3hFU0Pz6GtE4k/eqRZMfzQ9efM94ym3vpR/bhPUpyt+7v3K/X7F9kNmT6Y4//szs3jVNiaYC17LGWVFccpwOyn4f86mbMU2BA5DMPxm+Q4o1xZ2SuXhZQZGZkZGS1aRfXovWpevjvWebns1av3zGw5ZEbLoWW2tsw0RUS1yoqKqhZROS5/xONS6b52Y1ZEZszzcd3nkrgtImpoNcY6eZQZ0SrXv+CxWCrztGY6861rJD/r5FvOYvVOHp0+iUtmn11Uasez3tly2HrfjNsy49dqfHApQ2Z7d0HDUPNprUQcJ5RPCxbybm396Q/d490l6ZHvm6fLiGH9qscPnwfLyQ1UH/BzHPqczT3c23Eu2zKrkO/0UD04Isis4biOLN8diLz1IRVROfQf/fCbpUL7X/NXa1HDvRHQj1mz1N8d8Ly7zYtR0Yd3qC8XNfo7R2+uM2mRvWfvMR+naGpsbawW1e6+7HW8+6kqKu/uAIyMyB5xyOotV60tsyqnb63jLX/L9HiOWTGu/72s6OtRPZbqq8ycI6rPtcwrttYys2pNhMy2brVRPZaZwH76Xq6IOTKztVwvdLRjDZxmLU8z8nWc/hs+vkdR5VsXee72tarz2eA6flYj3hPGd+e8uze2nj+46/D9m5Mrosao4fjHqjxeFlsW/i6XJPrpEt06XdceOhtlvL34/i4H37uvsnMZqD7gZ62Ou9WdL488rmqLbPd6KPOhwcRpwBTLerXTKspl8i3vfr36d2zgWT+wOd0D73s2WrtXdO+7ee98Ju/4J8t1td7p3q9+Nljjgz/wj1Mey3FabVlWV3P0fvfmIU/LAGvJrHVZZURktmjttPPi1MZDi7kiInpFn2ueq/dlO5c+V8295l69V0W0ZT+Wts4ItrZ2XGZG5ZC5GXPIyDZmi+X9h4rlbr482wykoirm40LEZe+lnncXSmq9ae+4T8hpeejys2v4OR7O7nir8x1djzfYLbl/WnN7N/cblad4fOuxNJUPn29+aI35+ltV3qu5uwnluz/PUnHnJ8V7azaP73M3t5unewzzfhrGey7WAaoP+JkNft8ZsBwHudEj2ulK8Pn+7u8dHizXqt/zpIO3/vs9u+I/bFin7963s8H5z6wzlO24hPR+OT78se88z6yOQ+O7FVMt7g3F8oH7fPipHui5bt1594SG0zRdtazIqGyt1ntBl/cap9yclgHWusQulintXtGrpt5307w/TLtDv537bdWhR+8xTXHY92meprlP82G320/TdDjsp8M09bmqL3vLVMQwjNvN5mK73V5cbLebcRyHNmzGYbOJYYiWkZnjpl2O7bIN2zZsx9wObdNyXL8lM2Mclr9GVYu+3Ka4zI1PWf34l66zWcvlmD79jdr7nxfw8z4oTheezjZFraHOzxKnrrrr5+Nn6bSz1GmX43v7FtdQ8w+13f2fq2iV53fvnbYYWs5D5/u61F2F9naXgf3+qoS8v5Azf2B/lgzlD6oP+HkNch4qnqplAdHx2UzrXpsZVdMyWsjTHW7HgXJmO98YpZZZsb5cT7670aXW55plZFadBi15DLkaal4vXt/Nor13vdHw9h2G/ey13vqZjIga7+5VzNMn4HTzzr0H+lVEHmdw3vmMLTMwp7H/3QK51H0/0SP97kg9bpNSPXvPHhGtWqt1c4vo7fj1bdV7y555Wmk5zNnmWpcWzxX7ue/m+c3h8Ho67HrcTP3lzf75q1fPX754dXPz8ubw6uZQsezvUtWr996rt6ENw9j7PM+992WNXralM6ri9FS0PE71HTdb7L0iYjOOl9dXT66vnz159OWnj64uto8vt9fbuB7yehyvNturzXjZ2hi5iVwfvrdmSq/ote7feXreXMXdxOB65WK5B+2jemDfsmDyLNfOttqpavnWivY6PkNx2TKnnT+x/bRnZ0W7O8lmqzjeiXlvv5eHr5tVRo+WLc8z8nhGrDwthc/zjzibk7yLwlPCt3zr3F9VmWv+OWvBv0lWuUQCfEhD4fv64TBlxjgMkS2iqvdlaDDN+4y5DcPxedRZFb1XttbacFo7lJHLHgM1zRHVhnUlUUVWr6n3YRizjXM/LU1b98rcxNzmKfocmdFatBYVVT3WrTDubXdwNwLr640tZ/e9REWPWp+jlhlVPXpEXFbbRiw3QOVxeqby+MtX9bvdGiOyV2RGO3/UWl9/w9YyqnpVVcu2hEHk0Np4t+br7NPr6cZ/2+O89957b60Nw7D8sKJPwzzHvGzR2GIYY4yeObfTULmqekUOmWPMFbseu+qvdvPN7rDr083Uv321//OLF1998/Wfnn97G/22+r5qyuxZ0YYhxpab7Nn72n1rEbQ2DK3itCJz2calZ2Zr7ZQOtR6WsTyZoc9zr77cXrvORNc8xDy2lnOv/e6ytV99+uw/fPmrv/v802eX24uKx5vhk6vt9bjZZBtb9LEfomerZcuZTbYhW8y95nlsuewvWlnLLYPLTOiQQ34cN/ctd0L29fmfx704azn7Vcsh7z3sc7mJrpZ7IJcnJi57/tztCFS1VmO25dpR1Rw5x2mLoNOzat5rE7FZfqM8Tt7mshHsNK9PVrxbVbq8U4vjdYI8L7xeEcPpTBcVNfeqXm2INrY8LVtfgzRbO1sKGmfLIkxsgOoDPsjR8NtblawXivvytOisqD73ihiGltmrHyLmrD71eZ4rx2EzbCJbRUbmMm2xTNO1dXO7rKyl9Coq25AxRLSePWO9rj5Hn+Y5W9tkG/L4lLI4Xq3u0eveRfR7z+tbnjV9zKp1Y/vsueZYv9tBY11Bt4m4W66V5zOT0U9DsFrqbrlpJ++v6orIiMPhUNXH7SZbW7bWiHVSs0UbTjc/1tHdaJ6/hd77PM9VNQzDqfoiK/Iw1+HQp2mKlpvtcNnaJir2hzgsN60OUUPM0W93h+c3++9v+/e76Q9fP//Tn//83Yvnb6b9odcha8qYW/Sh9ZZza1PWknlRfei1HNKttXEcN5vNOI5VdTgchmHYjJuhteXYWEYOrbWqmhe9z33uvVfEkq21XLFYp8prrqg2ZGSrXnNvh0Ob+1hxETFWbCo+e/Lk73/9699++fmzpxfXF+PVZni0HTbD0FrWPEWvIdvYcogYlu+UpXSr9+hVPattxov4aKqv1zzH/mweL1rEkC161DwPy7zoupiyRRsqs7fssU78V0VfzjxrNZ0/5j0qYu7Tbn4zDEPLoR2XDVf0Hv3BtK7IHkNGG9bT0Nyq2nIWi5ZRx2tpFXNF9MrobTiuk1hnj6PacSJzXWuR6yY+GVHLJPfyWJHlLLeEYRuGd57SrvpA9QEf8EhnjvVeljzbvjP3+0PUsrFE9rsb/vs83Wb0zWbbhjEzemTvdZjnlmO2ITMrY91h8GysE8eVUvs59rs6TLXdRI/+5nbqvY+tMvo0z2/20z6yWlvm4OY5el/m+ZY7WB44r7aI4Ti9lxnZ1gnCsUWv6BHbcdiMbRkoDy0v2rjN1pa5uZatZWuRLXqPqnX90zrCrh69LsY2DkPWcdYu18emVc0R0bJ67/N0iN4jc2xDDmPksNRk3p/xM9f3t62+8/Y+Tbu1aR/zPtoQ7aLa0KMdInYVc8Yh6/Vhfr3fvdxP39zsfv+nr//lD3/85vXNYRin5XioWhZfVkWLbK1Vrz7PmbkZx4uLy4vNOA691T6jD60Nw7DdbC63FxfbzcXl5dXV9WYcl3+GNsQ6ITn3XlV9npc7AOdpnnv1169vnj9/Pvd56r33Pk3TNM+HqR9qOOS4203TPLVh2GzGFjH1aZqmXjVuxsycpsM8HTbbzedPn/zu06f/9bPHXzx59Ozx0+uLi824qYxtazlPvffLzThEZZ+rHzL6ZhhbLkn4sVTf1Pe3800O2bItFdgyh2FsPXuPcRirsuq4w2rVIeM2M4ZsebfSYVrXfUZVzVWH3ufe596nqrlXzLXrfTf1ea7MaG1dwdv7u3+emKNPMQ1jG9uwXKzaRGwyN9k2m+0QOWZuWhuzjdmyxXrN7Pi8jaVcq1f2yoixtdbq/NHyvc9TrTe4ZsYmh2E8LVR960GOqg9UH/DBV9/yv/31+nCtc153G5P38x3i6t7uKKf/3h96LdeWK+be53me5nma+37qu0M/HJZZirzdxc1Nv32z7xFvbt98/93zm9evp2ne7XcvXrz45vn3u9zExUUO4zrd0XtGtLY8Ca0/8JCrda7vrVNuDkNb1ss9fvzo8ePHywTL9Xbz5Zr13ogAACAASURBVNPrTy8vLrfD5eXFxcXm4qJtNtVaDGPbbIZxaJthGMdxGIehZWu5TE3ebZDYj9u39zkzNkNrmcta0LubdyKXwDjPPMn3Nz7M7/9PeZ2AjWzrAs/Wo82Zu4ibrDc1v9jv/vPrw//9zct/+ur3f/r265tpH2OO282cbbcsFp2mmPom8nLcPtpeXLXxItsm42ocH19cfvLo8dPHTx5fX3766eWzTy6X5Xctc2w5RowRU8Qc0ereoxFq3Z3obnPaftxAaTFXTL1P8zxN02E67Kb5+5e7r75+/vzVm1c3N7t5miJv58PNYXdz2O9qnofWh6HGVq2mXjEfnh36L3tup+mTTz/97d//9ldf/uLp46vry8urzeYyo9Uc87zNvBrbUFV9zl6bzTY/orm+aar90Nr62MXjnFhGi2i9cup9nnpEDMPQxnaI2C3LxHtN83yYp9007+f50Kv3OMx9d9jd3N6+udndvLm53R9uDvHtTX95u39zczNN0zKlNmRbFkS88xS/6nE45G4YchyHZVFuq9gOm6vLq19+9ovNOF5tLy4vrx5fXF1ebi82sR1i0/q2tYthuBiHi3FsrQ0tM2KoGDN6rz7NUTUOw2Zsw2n/z3X6LypqOdOObWjn1Vd1vIda9YHqAz7EcU7v69MLcrn17lh9x80qpnkNvDxuCTEvC5kyqsc8zYdp2k3T/jAd+ny7j9s38fpm//Llq+cvXrx8ffv8+fT8u9sXL1/P8zS0IXN9DvU8zxGx2YxDO96Vkq2GvInYtYw2VET1eZ57ZuS6YPLdRxuvKXr697pLR1XLnHvvvbabzbjZLG+4aNFfPc/dm+0QwzCsV9mjV82PHz9+/OTRo0fXT58++fTTT54+ffzo0fZiG5fbvNi07ThcjONms9mOwzDksld+O3bg2VrTGlsMx5mlJfaWyaW3IpD//6tvSfH1jr5l3i9bzVlTzId+O9ftJl7U/vcvdv/89cv/8/df/cu3X9fFGJs2Z+z7YX/YzX1qGeMwXGyGq3F7tdk8vbj64vrxZ48e/fLxJ188efpkHJ9ejI83cZHR+nIppard7e+Tp0dtZ7TM6st1hLODOWM4e4Ba3c3Anz1K5Xgg9Yg5Yoo8VNxO8WbqL3b7b9+8/vrVqz+8eP7H77993eeXh/3LabfvFUMb2nB9Oz96NV23TQ5tdzjM8/Ts88/+2//4u7/79S+u2/D51fbpZrxsOVYM1ceYNzGMreVHdJgsj2fsvXKOmisqW7VNRM4Rc5x28anD3HfT/PowvTns9z1vdvPzlzffP//++++fv3r9+na/30/ryvQ51puFe8R+uNhvHh9yyIjl2Rw9quY+977M977958mphl20Hhk1V597VeTymMlpORCGFrmcWlvFRU2P6/DkYvPJ4yfPPnn67JOnTx5dP7rIbcvWNk8uhyfjuBmHYdnjpWJ59GSLyqxhPcgq+twiLzbbtj648az6IiJG+76A6gM+OD16vVV9PbIy5r7+D79X9Iq5aj/V/lC3u9v9PB2qdvv+6nV89/3N19989933L/70569fvb7ZT/M8L0PaoaqmHtvtoz4Pu90hM8dxzKqqPrZ1PmMYhoyomvt6z1LVGDX0iNP2eX19eNqyH967d/Ytm89li2y57JrXo9bNL6L3dZy0DOjmab7abC/Gcblzqar3PlefK3pr6w2FbdnCpS+/+bzdjI+vLz/55OkXn3/25Refff7Zo6ePhstNbTfjxWZzdbG52IxjW8fFy/0243E3/Le2clF9P5H2q6olxeder/bz6zkO2b+52f9ff3r+f/zrV394/vymamptH32uuWrO6C1qOwxPry6uN8PjsX357NNffvmLX3zy6ZOrq8dDu87lProaI8aqIaLNEVPMU8+ch23LdVnwkhVVvUdrbdyse2zUfDyYW1SPuR/XK59f2ahalgC2jJbRhmjLssDqkctDMefIQ8Qh43Xl67nfzPNt739++eJf/vDHP3zz9es3+6mi9U1/k7dv9rtpirENmzGHipg3WV88ffxf/d1v/ptfffHLRxePN9vrYbjK2kRsWn4sN6RWVPVe87LusWerNvQ2HKoOFbvqr6f51eGwm+fXU//+5e033z7/8zff/f4Pf4q2acsXJWLZtWeqfpjmZROXGFobWhvG1sbKvD1Myx7ItbT88dTQ68GnzvTKad1gJodsWTH0yKpsw7jczTf3ZblxVY+x5stWY8zLczuyV6ue83wxtF99+cVnT59++dmnzz65vt627TBux/FqaM82wxi17PSaEWO0FtXWderVVB+oPuD/08HGD5xNTv/19jve/6jz2YH3/z759iDnVH11v/oOcx2mfrM/3Nzu3+zmm9vp5s3+djf/b//pn3//x+9v3ux2+90y8ogc5qjWht5rN/Ve1dowjGNkm+e5aq6ahzZstpuoOOx32eLx9XWf56i+Gcd1jWRURgwxXQzTJpbb5KK1NgwtI5ZtWI5bfd6rvh6tr0OoXHftnKNXVY+hDdmG6TD3HpvNZhiG2/38cp9vpuEw9XmeevXWYhyHYWiH6TDPh+UZ2S0jh+NQbD5kr/UhaVHRDzEfap6++Pzpb3/zy1//6hdffvHs+nq7HfNis72+3Dzdbh+NObZYSzCX+dRlU5nzycn3fc0ffOMDX9R690v/8GHy7rt88N8a+WM/qt76qKpcBuXZ2jTPL3bTV/v9P765/d+/+vM///6rl2928zDO2d7sDkPm5bgZ+vSotWdXl19cX/3ikye/fPrk7z/95NdPH18O0ZbNNCpyCbFYduFcEq6GluNwfKpajKe9iO6eBxgRvY6PPTnO9WWefnT3LJHTR+Td/YiRWcsdhTktD1lfdt6syGVrparo614gsbTBy5v9v/7p+//0x6//8bvXu3F7O9Wbw24/T1Md9oddTPuL7Be9f3F9+V9++Yv/+He//s3nn36yHR+N7enlpp0/4/v0yc0Hvi717leq4j0nqn/DsVlvf1TFgw88iL/4x3jnnc/2U11//hC1m+vF/vDt6/3z/f75bv/H58+/+vqbb168eD3Nc2a1Fj3rsCyfrOXLMFevihyGy+vrXjFVr6hl59ixDY/i8KTvLqoys/ep98rM5ew0z9P7juZ5nqeqHMdhGHsOh177uU99eZpIm5cLc1Fz5S7q+X4XmUNGZowRQ8ZY1WqOaT9GRJ82EVeXF88+/eTLzz//9dPL3z178mjTrrcXF+N2Mw5jRkTPqIsYl+pbdwo9VV8OkQ+ff+49mT4feIf6OZyTQPUBf824pe4PlOrtJ7zdjVrztJwro2JeF2DGcVVYZkRb92JZLiD3d4dVd4OHOG4ycnxeWc6Zc2RVLteMd/vpzW7/Zrf//mV9/d3r3//xP3/1hz9/+/3zm9vdYa6INozbnkOf56poLXO50WWeh6G11nrvkbndbDabbWarmDatj+M8DsM4DtXneZ4ePbr+4vPPLy62j6+vPv/ss+urq+WPen199ezp5rJFmw4tomWOYxvHlm0dB7+7BWaPqOUyeK7bscxz9DnmOSJiGGKe4+XLNzc3b+Z5nqf+8ub2xW29OsSr129evHr16ub1brfrfX0q37LR6P5wOEzTNB+WvRNPD22o42Kntn7+55bRWkzT4bA/XF1d/OZXv/4Pv/3N737z5bNHV1fbvL7aXl9tLrabYWhD5JCxWdNxeV5XX8bwy5A9c/0i3r39Xscvy8rquOH7Mr5aFpnm3X1h9VZanG1U+mGOsOr00LH7I8f8C0+QzvXWy+NDO5bHkmdlVTtU7iteH+bvXt1+9eLmf/nX/+d//ePv5+1FZs7z3Ocac7zabq6zXWd+/vj6d1988V98+YtfffLoyTauW1z2GOcY7m3NGLFu6dIzaym5ZVfG3iujZW6i5/qlW5+/tz4I7+3h8On5cMtPtHtps85drzslLQdmj5zaemy05QMqskXrPXuPoeXyHZER4xDzEM9b/L/svel6HEeWJXjuNTP3WBDYVwLcKZKitlJlVmZnVfV0dVV39fQT9OvUQ/Wfnumeb7q6MjuzcpNSCyVSIkGAAAhi3yLC3c3unR/mHhEAKZWyJpkSlX6++EASCAYi3M3N77nLOTuKzbPweP1w7enTg7OTIoiXUIScRBygvpAiG3NuaWHu5tXLV+emFsfSdnT/U1hEChulHlEO1FYbEIOUSEYoLo3mrYYsa9RdvNzFvtl6kMooMb4yl1fkyGtpNQkp1RE2A9ISVw6dX2CsvurbVCAIfIF+Jt08O8v9wUm2sbuztv1s5+S4z8iZcuLA8MRiSAEXKMnVCpNhZ421xjlrrSNoEXJrbNJIWq12Z2ysM94eazYnGFNaTDZcs9k0pqz1EkDm5aOT8fL2gtyXR88L+oX2c9/Li6zIz/r9k9Oz45OTk7NuN8vOQL1GM4eKD4XPgw/ig0ggFUNkiGKFOPgAwDI3EJqhmJ3ozM/Pzc/OTk9OdBppM3ENa9uGXCl5DKdK0R2HBAQlFbACQvENxrlBLScEMNL1DlTb1NewPj33nbonokbN+mrUqPF9YX2hyliXOgGDaGS0QDFIq7OMmAtQAHmlAEgRAkVrONggLMIxDrQKLmMxieG+QlUDEYJKlBok0hCCqCqZswInRTjr+26vODoJz7YPv3yysf50O8/JK3slMgmMFaUAMqxOM0u5IagEDYEIaWIbiXOWDcEaJIZajcb4xPjc7Mz05PjkWNJqcCNNms1GkrItbRk0vpEXD89oVeEbEoPfh0WoaMmyFRSnFuPj8Lh7fNo97fYPT072D48OD49OTk96/ZxNCrJZXvT6/TwvgkCJiAzYiFIQ9QpRIjLMxhBZgkpumWanJ69cvrSyND83lU62qZUknWbaStkxsYRoBy5SiHpjmdmqENTEEFYEBIpik1UgXUC9kiIGX0QKGx+AKXmRghWmDLyqmkXkAq9nIBU1DEMloB+7aCPfPceKh5wpGiVAoQWC14K5ZNpQ1WDBri+yedi/v3Fyf+3506OjI86KREBigjjRFpnJRnO23bi+uHD78spky40ncAAFZcAxbHTjfjE2HyZ19GWL+kKY+83WMX2TpyuGrG/w//ilLxuAPqELRJ6TBxyeZk+3dh893dg5Ou4WoVv4noRgDSWJGvLBTzbt29dWbi/MXut0ppK0pZrG/kLSwBoYQioSILBgx0aIQuxnBYyCo4HdSIVOh2mPKIUJA/P7sD4vKABlMCtDDIShZnC4BPAEb0omSKpW1YJIoB5cai1FiwwShmfNWApQLjjJs5PMn5zq+np3dX1t//gwQNVQpqGAh2V1JhgESAElw6lLJoimPBqCRpK0x1pTE52Zqcmp8U67lbYaHBMzXLV8E2CBJsj8/7giylOuGhQjqsvlZ+8KnuX+tPBnZ92D4+PDo9PD45PTXi8PQcn08yIrcg+QMUpGRTUoC1nDquqDt4Znp6eurVy6NDs118RMmk4lSZMp8ZqIciyWoyCDXLUwLGQUhpQMkIJMEApSsj6GkgoRUTLK+i5Ua2mQChgox/zrD0+NGjXrq1GjxncqkNVQztFVrE8uRnLnWN+wdlcZPilpKaupHD0ViFjBIiJFSMiY6BNVZltJRL0ENizEhSAAIUg3y866vV4uq1t7a5t7G5s7Ozv7vcyTSa1rgBKQDQJVFaYQJARPxqSpHUskJbGk1mgztZPjnbm5mZnJiYX5uYlOs91AM4GpVAgZMKoMMTwUsYwjfNE27Y9++AUSQFL5aHE5NCOAISWKyooyolO6t9/d3++enfUOjo8ODo4Ojk+OT3rdrPDCPiD3GsAwBuC8CP1+RmyZDaCJ49Qxk1gpLPk3rl154/rluanGRCdpJmnqkkbKzpAvetaoNU4RtT2UhAlsONZylABmgAQIIp5I4lsFjMAISm/AUv5RNbb3kUr05ACf8w98HVmfr64IHmV9JXMfjYRjjcz4XHwhnDA7zqXIJQO7QLZX+OPMP9zY/c2na1tHvZC24JJeOPNy1nBmPG3MjrVXJievzc9fmZuYcMYpmgaOosuZUGkpMlDFf/0QZUjyauBUiQSUC05z2T46XX228+z49OnB/vOz0zMRcc6kiTNqfX/KurcuX3n/6uXFJGmIaRo0UgOoQJSivRuTivggALlkhPXRV7G+QIp/JevzkfWRUsn6Bmck+pczQqz1EUSChiIlY9kgNq97SO4L1ZDYHqRL3EM4Koqt7umjjY3Vzb29gywEo6qG2VnrDBMrVKAFRyFWx61mOjnRmZmaXOh0rk5OJYCzxlpyBo5hh32/KBM5sawIAcjA0h/gPqIvxpkKFMQZ4AkBKBSFoggogDzI4Wm2c7i/8Wx792D/NCtyDxF4kLBTYwSIg85EaokshUTCvatX7lxenm+biSSZSpMGkUpA0XPOwtgi+utQdH9HwoZ1UNoV0kqV1Kaj71BfkhHRUfZKNeurUbO+GjVqfI9Y3+AWOCjCRBWSQSfhIKgMoNivFAtBZqCpFgQiAgSQZ6NMCgoigSkhdVomuo0SxwigV8hp5o+6/vDM7x/2nm49X117ur29y+RIWYICxNYwGxURCVnWI5JWK2230yQ11lLaSNrNxrXl5fmZ2amJsclx12rAGMQ7vfdgILEwUdszlMNoiVXDw4kkGjGy+zbUTUQlYNDpRVzOMYIKQZBho5dUzJurPruocJN7ZAWKgL3D081nuxtb29vPd7u9XMGqlHk96ua9AjHI1OAlFKTiLFlCyDNCmJ6auHb1ytXLK9MzY62mnW27ibaDqmpwlhNjWGEJ0MAgSwwh8hh2/QHEpdqHEoHKTrbScQtCCEAgraRZYYmS19RvTUuaHmt9jKqxFaXTyGDccVhhI2EII0CDKJMm3Cfs+7Cd5Q+3t37z+cPnR6ecpEUh3dOuBXWa6XSnvbwwf+3S8srsxEzDtRmpIl5srEqIo3oCUuZYOzT0uh5PDRIy8SESLjLGGCUEohw49djvFVtHR+t7e0/39p4fHh33zoog1pmmsanQTKvx9rUr71y7PJukLbYtAwqBELhUDikl/xk2Ziow7PAcKYZWrE+Hban0++yfcWIRVaaDq/M/GJksS0YUy3rwSp5URcGBAKuUKFGheuz9Qd+vHvUfPtt9uL29dXyUEZAadpWATeE59w1Q2yYdY8etXZicujy3sDQzNdNOWymMqhBCNcBbcRiIghQJR23MSEkj64tvzL6ym0upvDVgUaH6Wih1BcbBAF5xnIfN7cOnm1vPDg53+v1TH/p5rkRsHZhDCBK8M8w+UPCTzcaNKyu3r12ZbrmGMfPNNFFYVQ5qVSwDFgrJIVo2fDIrs4KDAmBDoJcWs2l0UQy/W3d41qhZX40aNb4fkBHWN3Lnk5dJIYAQQIVCSnlIdTFyIB1p6aIgmgMZUQCRIg3iRCkovJrMh7M87xZ+c7u/vnm4urnz9NnuSS8PykqOiZDnVjWxhpmZxBpuNlwz5Uai7ZabnR1fWpydm50cH2+OtZOGMxpgqDIkjmGdEARMkd2VYvREangolDDYEjm6JXxrd3cR8aW5dhmglKMq5bRQ3MBH6q1FARUwg0xJ/wa00CtCAAhBcHxSbD072Hi2u7q1s3eaF4GyPO9n/SIvQDDGQrTwPohEXQdVdYkbH+vcurx88/LC0lwy2bFp6qwhQyFlMMSCHFsWJSEmIk8+UzBsQsPuqKpmLBRTAJWKR/mVCJaQ0OvM+qS8Lpi0lBnEMKytbrmoLiARBFK1CCyMjORZz3++c/Lb9bUv9rZO4QsUDEmh49ZMp82bC0t3Vq5OttrjzbRlNAEsykQGSVD1ZeRsiI3GQg3DRun81/GIinpRKRm0kCiUWIgFKIACyIiOC79xeLy6tfX02fbeSbdXqI/6khoSwuXZmfdvXr+7ODuTpGNEiSrEK4KysAFgSO1wvVGV3jq/rw02j9IM75svCAWkHN5TQijr3KJRNAVgVVOO/HGcXBYuRDWAlJ2H7QYc9fOdk94XW4er2/ubBycnhfTBga1tpJz4QnatCQlRk+xUs31tdv7mpZXlyYlpgxaQiiYK4wFPodBg4FsUKlYTR9y4nCdUghqKub3RKpd5VaViraR7FHEjiHOQASSM6PIuRJ4oijN7RZ9w7MP67snjtbXtvb2TfpEFyX3IVYxxsfonImS03WxMjI0vTo7/4OaVcU6mbDLt0OI4xxoEvjAamDTeCtQ6RVLqEukLo8YDaa6XgGvWV6NmfTVq1PiesL5zIzkDe/HzooPDu14A4iCfGWV9g/8kqqIBVIAKIAhRH2muaeF9P8sPToq1zZ1Hq5ubz/bO+qHvudsPWQ4lx0nDWAfRtpVWAmfIUGgkvDA7dfPG1etXZqbHnTNIjCYMptibFABSZQIrSDwByoTYixiCkJKxxKVqZZAgIQSbWDZ2lOOJyIABfgukW0LpDYih6ZmAqjdVCtih1EDRsjW1cqsPGlkIMSmbSi2k9LhC5pERegH7R/mz54fbz3ef7+7tHxwfn/TzIobGgLUhoJ/7oGi4hhNnAnXajaXFqVs3529cac1M2HZqG9aklkl8KApLpuGsIQ65koLNQAxUSx1TigFeJUtDiN8ikAEbmNdUziVG+FJ9VoaSDtVAhqEkDVm6BglFEDUwyVkIj3e6v370/OHe3vOif6z9whRJIh0rMylfn558++qVG9MLU0hd7PgNGjmDIQV5VdHYFMjxkKqCDKyBe41ZnxSqBUeJIi3VXwQclHPVnBCYlCgHTori4ORs/dn+p482D7N8P+t1pQiMpjPjSXJjauYvrt28NtFearuUCKHwvk8shi1zCuVB8UsxqlZF1ekbUXjk329BRBcDjTVd1lASnQCIASzIKJGYKDUTJzyzUPSIvGnsZv0nx8cfPl57/Gz3OJdC2FCzYcdYLAo1BGvPkvTw0tLUzctXLs/PT7lWE3BAopoonMB6GK8WRAyNi9KRxPHsSqTGUCV4Ge0QaJDaix/4D8D6Xh5kRvHW2GhRzp9GRxAElSzLQcZYQ4bJEBQelEH70DiKmSn2u8Xa5vbjjc3tg6NTr13vxVgkSd/n3azPxnaSRjvg7srKu9eWrnbsmHGJasOKdSawoNSTZRZjBUm50ZeaVRi2LNAI66MLip9ck74aNeurUaPG94T1lcLrsWQhFN3lBtnw87nQ2LqkFGt9RmOsqQAQFEVB3ns2lCRMREH0rAi7vf7msTxe31p9vPpse6d72hdlZpf1C5gkdQ02iTHOucTahFBMdczK0vTNG9euXB6baJGh2NsGVsADIVijzqhB9CjmwguUrXNcyhCWc3rMxMxaNnmV3VUSghITG9CwxDdo9fw2WF/F8irJGFWtZOd04AwhGk23QBDLxAYqpXICxQohUeGjpClX7avlmQmEAPKEPMAHKgJ6GU568tmDx4/W1g6Peye9vAgISj5AhBCaJAmpqmSGsrEWLy9OXr08t7QwvjjXnp1sjiWWWZkk6qcbYYqzUpGfxgbVUu2yHBMVYkHZBhql21/TOEoH10s5uVUJZA5LRcOyj4IjgQ/gbpDt496Dp/v315+vHRwfFZIzTMqtBnVSWZluvnft0q25ubaKk9AMNuXEsUGlvqlSKIFtqagqpEFjDVsYLqHGa8z6QqEh48i9tJpRZKvEXiRXDUTkXAzfvaIv2Nrv/vaLtUcHewcku9nZwemJJZpLmpebY28tLr23snR5utUybFUQCoCY3XAD4/KcVfU9roxBR5bkNx+T1MooPaY2IuuL8sMIBDUxzREtxwNBqQh65qVwvNPvP9w7/PXjB6v7ez1rkaRFgKMkDdb20SxopjG2Mjt9bXn8zdtTXKbZqs0QUUsrpIYdqrqdiHqvCnZOS/sZUqiGcs1aaypdm2ovLxctvzLWp5BA3gOqxNWwL1WSKQaVOypAbAyIgkjXB7AhY0EQRQHkhNPcf75++Hh7e313/6TwPQ19ETXWsqE8cJ6NWbo6N3Pv2qXri5OTiWsQtZyzlWIqBZDAoBo1ZhlqL5XaTAPuz6NSr1Szvho166tRo8b3A1ophUS3LahSlLJ72TZSyXOU3g2l6h0JYm2qVP6kEJDl/ug43z/Idk/yf/zo/pO9o9wHFU+qtrS08xbUaLhWkjimTru5srR48/r1S5fGxjswtmQ9GogVlpFQHCKMEU+cbJJSNYZCSTPCwL6JygdIQ5AQwMSGiRkgH5vDiAc25QP6962wPlV5SSctIc/zEEpXPSI2hokqW41yyo8unh0ClKJNmwSJL1SyXxqeIA/KCgoEIZx0sfns8PGT9adbzw+PTrv90Peum5ksCySaWGMYhoKhkFhZXBy/e+fqtctTkxNpq2VdoiQ+IZdyakofrWrKsxSmjxqBLESDDxk9vV/fnilVVDN7SqVvxbmGMSWOMv0K9kAPdOTDk8PjDx+tffJk47AfOG0zWSeYSt312cn3bizdnJ9oUk7aSwkpWSeGAyBSuR5wKRIThwhJBeJVhFSVDJzj9PVlfdCgGqAyYgRaOR/E6jaV3c4BCAoVVuIe4fHJ2T99sfrR9rOjUIgx0s/NWe9Ss3V3dv7e8tKt+dm5sbRB4HKLqpRkY0GMhl5vrExK1fBdpdLzzVlfVesDQVmFVCgoeYHS0M6ECUYUEtAV2Tgu7j89+fTJo2dnR/0EucOp7xfiWy5pKSbJrbQn3pxffnN58dKEbVJpw1FSS1IqTTJUoKohtuiXdI6IBRyIYdgMP0Z8BS29dMo+1uHo6R/iavyKIFMrTlzatpd5w/LfYMtMpkycqIgICSVsoQRiVRKhEEVQCT2gYGyf+kfbh2s728+Pj/dPTk96mZBxzYQYeb/LWqzMzvzZzev35mdmm+1xRgcwgx5zghpVFtCQ9Y04ecSRz8j6StGfWCmtUaNmfTVq1Pg+sL5BxEKQOJAFDMXeq1CBEYUY4xMpUj4oaSARQJQyCSEgy4rnB8Xj1b0vvtzc2Ng5OOv3XSMzLBoswSIkjKYzY4lpmLC8OHPv1o1rH7YWYgAAIABJREFUlxemO0nDwUSpR4JQANSATeXsJj6QECtbQ0wEgXoBiCyBCsCXbXdRLDRGbZEhlW4BAz0aBQwRAxCREYtp+rZqfZH1jW7RZWA2KB9VGnTx6aIlnSMaEdmp1HJKHj98FSmVPwBEYXXjQFaJB6ODsTZXBBwe50+3D373+aO17YOs0Czz/W7IeoUGssYZRpBcQi9t6tKl6Tt3r9+6dml2cqzddKk1lmCgBsFCWQdu3KVEBxFFXYdockj8Oru0D5wlS7mQsmASrxQhClCBUeagmgG7PnyyvffrLx4/2d3pigYyFmbCNZfbY+8uL79/dXGxBeuVIc56HzIVdSaBEEFB8ZeUhtuwcXnHKl+sixkq1zO/rodTSi8MitdprAhJ5fNRHmJSUjABhtX4QF1F1+FQ8cne0S8ePny8s1MEMYD2+pNkbs3OvXXl8u3lxfm2GwM5gRnW9wQctTfj4UVsGP9Xs76y67a8YgUkyqKlW6cpQAEmkAmKnshpP3u0c/qzT3cPev2j3kkuORlwAqbgOMy1G/euXn1z5dLyWHMc2lQ4r+QJPGg5jMy/nFIURCWoqkugKlq5qo1Vq09EVMq+ghB3P6KhwTy9soHm6l1onHxUjTKa5Vs1RMRUjVxGWsZGwEWAAsQgU3lgkACFQFNkilNCDzjqFw8eb91fXT32cpj1T/I8WHCaJGRSL7Mu/fv3f7CU2uVOOuk4CnhSKfSiqkqqUWyYRppdgLJxATBaibrYOlCoUbO+GjVqfG9Yn5Za3kI6CGQhIsQMEZBRmGjiJ0IgMCHEuyVDiPpBu3lx1u1uPD/++PMnDx9tHB0F0YbCFUKcWC8ZSWg3XSvhTtNcv7L47ptv3FgZa6ewgFG1pZBeIAQhL5BK9ryaZYsqhcqE+B5HopTo6w4MWA+GN3HSi2bakSp9h0pN1dYsI29Jqh+M9tlWgyhUHh06/yqDf57/fmR9vvpJbAcdde2qfIwJUHhCn/S4KJ5u7z74fHVtfef4KM96dHoWglpRI4B1NkjRy3udTuuNN668c2/58qWxiVY6ltiEyca1Ip5BrKp5IMPMJjYmAkqWyk7F15b1VTRbR4XfRVSIvKLngzAb5zLRvX724ebznz14sn5wAINmqwHvJ1P33tXrf3HtyrWxtC1IBDwoRpGoGWHwVURPLyyX6kxzaZf+urPokkLHeKWqFaPqrhtmQWL9hQOQKTKmHuFpN/9w7fn99afPTo6yIidFi3kmadxcWn7/5rXrE2lHacxBFCIKiDEc1IuExJqSOytRqWf5e7I+aAgiQaw1UIEUBMCwqijgyZ6J5mQKooPMr+0ff/jZ6sPtgxPTUrZWxPmsIWGmmS6Ot28sTb5/53rLokFwUReGAkNJB1YQIyZzVFaotPonhhQPSqPz2KOm9DEhwyPfoViOf5WsDx7QyiGwPOclQR1VlNHBW+RS+4lKKw2tsngxqcXwBh5UEAJwXPhPNnfur298vvXs0AdJG8oJeXW5jHm9NTvzw1tX7q60J5JEQzAcnLOiHLyHauKMAVQCxQ7/kgWaIevDq1Q4rVGjZn01atT4VlmflFljIOv2TJIYk4C48JLlYhNDhr0HMUSRe1GDvMi397uP17d+8Zvf7R2eeiS5N0UggXNJq9lIx6wmyCfGWm/cvHr39vLcbKOZwMYiBWDjOIwGKjulhJQw5DVUBQxcdmyCo4jGSOQbaKQ5bJT+RM0GQRUjDZwPvkulpmG74DdifSSVoeKFj0Av0L/q5bU8nkMDDhrxIi4fVHp0aE/7nkDsBLbX9zt7Z4/Wth89fvZ89+zwJD8588SpTVpeKCs84JuN/NJC+87tq7euzc9NNpvOtRNuGMAHAzimUBQ+z1xirHMSPJFhl7y+LZ7VzXSk0FdVeQrVQEaYz4rQFznrF7968OXPHzw5NCmcDflZE+Hm4vz7b1y/OT8zn9gxhYuUL/rcx4K70cBD0dZSvXPgqz7UWqLhiX9ta6eRrIx6uldJiIrTlAogBBWUFc+gDAiJMITUUA+06/HosPvh+vona6sHeT9JUi28Vb575cpf3br67uxYk6h0DI1TXRSJVKTuTIqyplQyj29+PEtNShVRHx3UWdkqEMjkSoXhw0LWjk5+92jry62t48xnbLpeNUiLaKHRujk7fWdx4dbC9EwLxiMxsCbaduZCIdIPUveC5m2UEYoFOxrpzlAlFaOj6aARahWn186xPgYcXrGE50v2Kx052Oe4n0IDlayr7ErXUeZKIFYDJfIEAQpFT2k3D6s7+59vbT/Y3Ns+7sKmjUaLct9kHaP8+sLkX9y7vjwx1nLMUIZJEftflTX4IoOIIUqSBEAcVtea9dWoWV+NGjW+p6yvmsgaYX1xsiIoKZGCAsF7ZAU4ARt4H7rd3uZ293efPHrwxdrhcQ8mLUT6PgjINZNGs2FTm6D4yZ1rby4vLi9OTYwnhuG9kgGRRu0Vij1XiFNmIIACD2cuULnCE0CipDpwBqjMtwhEpX4+YTQkLsfYoOcjDabvGusTvCQqkpdGSIii5y9TGX8Z66PSBIIuVgIH5Pj8/4rkMmjUX9GSjHiiXoHt/e7jJ88//+Lp6vr+6RnALUXqgzD6wZ9435ue7Ny7feOdt5ZXFludRpImxqiwhISDNZ61QMhJQa4FbuF1nUOLrK9q/irnlKDEHijAOagAMtXN/eNf3//isydrx2Jz22QJCw335tLce9eWr89OjDuKlRyN1Rg1JFF6CIHhq7B8YLlGSoOyLOGFit/rzPpkdK0P/e6rpAeVF3mMYQTqqSgoOFDqCX1ALJwJhk4Yj8/6v3n67IOna0+PjnKAbJIS3Z6c+k/v3FtuNyaaxgJQdYKkrKcpnfvNNGRC3xQiWojmxLEHwkA5BBKwZ9MLst/PP9s4+O2Xj9b393tgNQwpmiSdxCxPz7515erdy5dmHVKF8TCR+5rITUUoal8yYHiE9EDB5e42cr0PevJJxIico7CoRtT4BVPyV8v6Bs4WL9nJhvmsczu0GHRZA4ShBmqgFmIqQVIafKJIFpVFkQuBrAedCB4/zz5Z37q/ufOse5ob9EK33UAn0ZmU371++Z2Vq9OtZhNJquDofknqAJICqtYYepH14Q/hYV+jRs36atSo8d1gfbHZRqhqwisFvyVOOLBX8gohwCAAp31/mmVPN3Y++M39hw/X85yca6saAUcBbpfy+FR66dLcG7eu37oyeanBraCVbTUBGkiDeGMtGxaiOPAlEAAGZILhQFVYUImvkWj8epESMcGRnutRkq/fDYcact9R1qfnuB9d4K1SVu7oZY5jg/Jo+XpSaniOcGIMnzbK/Yaa5QpSiKgPPrCwNWD2qpmSEmcBT7d79z/ferz6fG+v1+v7PMugMJZEfQj9ZuquXb10986Va5cn5ybdeNOS9KXoNp02HGkQoga93qxPqsRCRfkAARfEGagnOPFh57T/0RdrH9z/rO8lbY+LYr7dfv/qyg+uLy2POec9gicT1JEnBBiFIRijxIqA6Pk2QtFL4ldqC+IC8ft+sb7BR9ZqOjWG+ZEdKKRPeQ7fINMIRJmiD5CFscGh16Ctwv/22d4vvvxy4/gkN6bIi2Y/e2tu/ge3b95anu1Y44BUkYoaUcfD46gUVR2r6cJvzPp8yHzoucSp2gBWcgFcKE7zsLZzcn91/eH65l63641R62AwaeXuTOfu1cs3VlYmEstK8EgQ3wyNWBtASAWi1acfqe2OFP5eyAIoqfCLAR+PsrALP7CvrvKuI7PjX/+0QVbL6inDx7I3xEIZYiBm0KugGIqOKpOSeBSFqlqb2IyxncmD3f793ecfb6z3bDjqHpJkbdamhrsrK//23T9fabRTMEjhfcrcNGRUgGDjxGPJjc3oPaZGjZr11ahR4/vK+gBQCBqEvbIHkYMQerk/PM0/f7Lz0f0HXz56XGTaTMc0UJGJYWOIxtqNlZXZO3ev3rm9MDFmDQNBx0gTyUNeEMDOwRgQ5UVujGPrhEgrQZEYgpgQx5xGy1IBJIpApeX36AdgIInp8Zd/vhd2PqJvxY396wLHrw6BgBE5l4p1qEBLlRvF+aZNuvCKMeIqWd+FIiAqqZwR1khCVKA05qCyHTaX/CzvM1ubpIG4AAXFWRerT3Y+/uTh2pPdbg+qxkP6RdbPM+tMZ6K5uDB569qluzfmlufH2o4S9kY9pDDkDDfpdVUfGbC+kd5OQoDx4D7QFXmyc/TTjx48eLpJacuLht7ZrcX5v3r7zXuXZidZU4EhgRQgr5Y9oygdUAyDouajDuQVK84TzzW/NNAn0Gsblkb/w5eLP55jfaX2iAAZfKEhJU6FORp7R19IYu+4a3Co+Ozg+H/f//yT1TXPJrXW9PM3VlbevX39zuLMjDUNgRNNFK48mlGZhwOXh/b3mXOLDYxFUPQFPYG6hhcc5eHR88MPP/3i6bPtXlGkrUbUvFqcn/rRzcv/9uZl53MQyBiKCpakKrCGuWrrZR3JKpQ9jpELM0bdIIdWqTQkhfrSZNfLdhcAgH11++GghfdfeNqgYKli0GcNZSVWCMpROKxirhyJWJwTrAYySQ0KQCEGudUTgz2RT3eO/tfHv9s82FPiIstbSTrbnpiy7q/uvbXYaU91XIPJqBpRksKoNBIbu6lr1lejZn01atT43rI+APQC6xNlBWVChWrm/eFp/vmXzz+8/+izJ1uBrHWJz3OE0Gk2xlsNo/m79+7euXll5VJzrMU+Q5H3rKV2mhjJyWicyoMECarExphKU6ScUhuZzKOhU1IlcVF5FUg1n0cjrM/oqIvBSLPiiL7d+fjnu6V+8XLWp9XHlIr5VQW6MJI8H6S/qUyFV/UKGdJevRj4DY7Sub7PQeys5CFSChOSAxkIqNs/C4Q0bQixl1KH03tsb/c+e/jsk88ebTzfy5XVJb28OOv3jEW75Zbnp99/+9ab1+dnO0nDUWqQsjW/Vw/dd5H1yaCeKoCAA7gAnQVZPzz51WePP/hi9agQ15m01lztNP7y1pU3L81NNAznwQZNLJUtzUzC8KWARZxcLedWeahwcjH01Iujm+DX+nAOopNqPC1SgIG4Lkr5JYVCtBzWhQqJcBSKrVRtFZQrFcYeCx7uHf3q/uePt3e7qn0lLYpbSws/efPO3YXJCTItRYti60ApwSrMgRFABLhvroiqCohACtWuImfbU3rW7X+0/vz+o8e7+8fMBhIcZLbTubmycvvqpesTY7MkCUuUIu4VBQCXJKpg5uiKYxRMpR6vll3ug/o96/l0kEZTvsHkZ6SwX8H5Xs4I6VU1P2g1V6wXN7iXv8HyVlR2hgx6Q3Xg5IjKZ55jf4eCVNUHMiZKg8b7TA96RtJnu9Ht/fr+w0ebu32xR9283w9Tzlxq2juXl+69cX1pIk2ZNIgR33DGUZyWHGp41qyvRs36atSo8R3ncfjKO/6Fn2psoBQARJH1VcEmOMsDGZOpbu1kn36x/uDR+saz5zuHPW4v9r3Ni14jwViDF6Yb79278aP3Vjppw5G2DByV2v3RB9CzeIZHIMCAY0QS6xOkZTA31KggeCY/bGYqM76omtxKJU8ZYXY8IlMyEHsv/6GDzzk8GkTfedZHAzJ84ZxxpXR64RMNWR9i4DPyWvH5+Ip1QedF9EhJBKVQBEOMaOmuHn3jQPAqohKN2oNAyGbCe0f54429j794cv/LpzvHfZu2QbbwOUMaBktT42++ce2dO5cuL7THU5MM3OXOExi9eFKUXvKsrw9n6RVfXTpgfbELWQAP9sQ90MbB8S8+fvjx6nqPrLeNnJPrV5b/9s7yvYmkQQCVxM5o4BCskiUuC+0EYfUMAVuFLT00q0MwOEeVzsl5DUbi1zguVWjASLlvkMGRgb9caUKiACBEgWMpNJAUxgcOQEFQo0hgVbkIJGQLtlvHZ7/67NFvN7e2RE97vXGmeyvLP7598+781DQhFbCUfQZasj6SUtOytAvQi1mR0ZU4OBkavO8rcudOoU/O+r9c3fjdo8f7xydJkjatHTO81Om8c/XKW1cuTTkkquQDxDNz6hxUSeFD4Yu83WqqBlUlEBtCJXAaGyKqTY7OyVWVvcY6wqNYcZHFkZ7fXS5mwV4h61OIR5AX951z72uYyHOqtojrX0ESK92llidIwVxqro5k9hiqkvnCh65zSBMrKkGUuJnDnQb64ln3Z58+evDsqEeWfD/t78+OuTvXr/3Zm7eWp5uOkAAJ1Gig8hejbEGPfiKMGjVeL5h/+Id/qI9CjRp/AhCgqAyNR2Ub4/yYEgUMOEMpjVIQPJdJWVKyQqYAFWR2jvOPHjz/p199+qsPP1vd2ul5SpvjompQzHTSe7eW/uav3v+Pf/PmvZszTWdbBg2rRoWlIAkQibJ7gakgANbAElgAgXJ0SS953WgIQkJDMZeRAlaM/EopFroYtZyferlIl/Rctaz0cP+OE3UaVV8//xh1FivjwNFPNdq/OlA7H2lKHHh4Df8czvVRjMI9EcAMw0TMTMzQABUQwxBYhdTHglWsP7Sa9tLC+Bs3L19ZWW6laX52FvIMEhCUYc5O87W1ZxvbZ4Fco+GMNWU4r5XXRuWcGEChbG1ToArC6F+kc2Vq4GWZjj9wFCskgQTR6lmJYD24S7STF79effrrz77oFmJtYjRcXZr70Z0rb0y3JiApKZexOxEZImYqtQhHCb2CzKCaM4jx6UL3Ho1+rU79652oGlmB588gRaeRoaV2bH0kAJaUSYcHCapqYSgoiabGNq0db7byrNjZOzRJ2g3+qN/jxE5PdjrGmhCVIKFGAoswkw4c4nRAOwbCMiOMu/ypxNISkRD3Qcesa6f9X6xu/vbLLw+6vWaj0SQ0ffHW0sLfvnfvnaXpNoE8OSZn2VprjVHRoiigmjiXJmnpHSeDrl0tfWrKwjyN2niMfD2fv6Gyh50ubo1fcXG8StYXz9n5Jl7C1/7dYKTDvxpzrMzlh1JcowchCNgQW2MTA0Om0sRhhfXaNG5yLJmZniryontylBpNEnPc7+53ewWZZGys6awlMGAVqkEZ5SlWMnqOcNeo8bqgrvXVqPEnAg90AQ9Y1RTqBp0/ue87q4ZFVaBM6iAGIt4fcwo2Li9IuKFsC6XDbrGxk/3iNw8/+PizrIBrNntF4YN2mm6m6W+uTL137+71a/OddhLdlCzIEEzZJgqgdOWN3UZy3pabcFFA8kIMKHTuaS+JEfRr45iLz7nQI/na3MJfumvTS6Zkvj4qkW90uM4lDgak+wWdkHOTg6KgQhCitXEpSEnHZ2Hr+dlvP/z08y/XTnqhV6iHEzivTJBbNxZ+9Oc37l6ZnGslLSaHAGgoghfSxMFSiI7cENbcQJitksM5ufkLs4w6wvoqT8JXlVORPrKgPvGa5ExI1CanFk9VfvZo43/+7vNut9exbiz4y5NjP3n/zRvL821gjIhxkZXyCx4bSqWH2VeH6dVFNWR9jNc+ItWvSHyUn/TcCKiOilVCqbT/RjX3RYhd3+VYXFBs7p78vx8+/mD3+RPt5Q2XGvv29Ox/ef+dGwm7TDjVnPO+BmubTkziCVBwUI6+bdW8sSqrQGLmA8rsxRQCNYYNguJA5OHR6U8frH6wtl6waVpju2dXUvd/vHX3z69fmXRGgxCDrEUlZMR4aaJKv0lO6AXKrBfXPH2DreSVJ0nKRIniqwLQl1ynPPRp0JG+1vPP15d9NKrSW7FlpWwi4UJJGIXSYS//9ItHH3zx5Iv9Ezc90w+a9fo3Fxf//Z+99fZU0jGUaiiKM06NAD5IQmkiCTyQAnW5r8ZrhbrWV6PGnwgEyAGFWlIHrWROSI0BkQe8SkHR5UkIGigFjApZ5VYO2y1k7Vn2yw83//v//GBtYzfzFBQwaKR2fKJ5ab79H35y70fvXL96aWq86UqPdYIBDJVdWDR0VYgJamKiEWvwFzLQ5ytZRBef9pKM9Vf+4KXPIYwWw16fGJlefhDo64/NS16Gzj/w9Q8ePi6UDC6es/JEEZEhkAhBLajpuNOwt2+sXFlZ0BDyfhaEvCIos7F7hwerq+vdnrTbabtlQwgheJsmJjFkoEDhVQJZ5oTZUKltMdrBCwxqHzTof6RzopavsNZXIPSlz4pUHITVmCPVj56f/mp1+3m3z2wawOWJzg9uXr2zNDdukUATYj53WONRu3Dgq3PzL637F8/la46vXIovKcqf3yhirzaD44NGFu1ggSbs0qR5EvxG//QEEoyxHjOuuTTealnyUuQcxJKCrLL1hFBOCmMkV8XluFlASdpIlIVImQrFWZCd07Of3X/0wZePvUkS64z316bG/+7dt+8tzS42nBVvxRtDREyAIeKXX7pfeRBe2MLofOcC/Qv7wddf8a/27FJ1ml584Guvixf3qxc+zignpGpHIhNHI73GmTxViCNqW56ZbE1NT54J1p7vHmV5MjaeZf7k6Gys2ZkbdxbQUCgLMxt2hgwFIqKvFAurUaNmfTVq1Ph2WZ8qAY40gdpo7lRFxkERraWIjFUiJVZn+upzMn24XrDH3eyj+7v/+E/3P3+w2T0Led8nBq2Emia7eXXq7//9+3/71/durcxMthqJMagUF5hiC06ct9eRkbvz0UmN7+WCE4kC6qpBgyeAmZ0jNjQ12b5x8/LcwpwPodc7Cz7T4DUIPJ4/3/9idavraWxqojHWUEOCAuodfMOiwcylW7MhMkQ6cK7DSHTI5/RoLrTEvirWpxAidWoMp+AkB56e5b/8Yv3B5oYXbRAttFrv37r+7vVLE01rSC2TqfUgvj1GaRw1xhrSaO71e4fdEyl84oXOsrn2+FQnVSI1ZMgSyCjZqOVBAh4xxNBquEwFhktJTTZqWBgZ6U6v/6vPHn3y5eNc1BrnRK7PTf2be2+8c2Vx2lmnguABwLgobGK43g1fTfbg/N9FhdkQKEAFYmCcc2Ptdtqe7Pazo9NjY1lV9/d3SGRxYbplrWNHIo5MHEEPopwwuCZ9NWrWV6NGje8iOMpaQk05DlVq9AdBIZozKzHHvhcP8mS6bE5gezlt7ff+xz9+8tOff7S338uzoEGcgUH/6uL4f/oP/+Zv/+rtldlmiyRa1gYtgyHmwYQehqILFyVI6tvm9xUaNCgCM0wpsCBEoqrMCELMND/bun59eWpy3Be9ougbhQiC0mmWf7mx9ezwLGk302birDNSaNE1EphJhXxBosQmznEqDR+4oFkzEuu98iklqBiQEaNCBZt9H363tf3bL1ePs56BTjr37pXL79+4NNcyGrxCEmb+jg2S/omlwQCGbVqfJvsHx73TXpNt/+jYEc3NTDdbLupBOTJGCCLlYCUNWR8PEwkKZlUVQWCjTH3Vvb7/ZG3rnz/6tF/4sbGOFbk0OfGTt26/fWm2CTgVwEOEjQEbHyCi1tRZgFfO+lRVJBBzbAoQkQABgdhMttLZ2Zmzbn//4BDW5Op7/a4xdmZyvO1MAuOzjIkV5BVkmeucZY2a9dWoUeM7GobroEFyVLpNmAOzKpOAC7AX9mQ9mRz2uBd++enGf/2/fvboyTNQGkIIvmg1aXYq/ckP3/w//+7921enxhNqkc+6h4bIWWeZLZPhUl6v1OS8WG8Z+Xt92/yeLjeKyjyqBGWGYQBBQqHBGyJjSBVpQsuLnSuXF9rNtNc99T4IUV+QIdncO3n0ZFvIzox3xlKbgMgXUCJjrTOxW5hZaJT1VeYcVYX5ov/8q1trpNAQKIDYFuC+pUeHRz/7/NH6wb4abpC5tbjw41sr16YaFAQaLKsBGapZ37e3QKE+KAw1kqSf+729A4jmWVH4kDaS+dkJDSEUIbUO3hdF5hILnGN9I+OjACGoFgoxNoceZPLZxvOffXr/pPAqxIVfnpz6yb033rky1wZYgqVgCGSIjCUyTMzEph4S+4PzvRdGwFXVB89ctqBbtkzMYFZypE3L7fb48dnZ5v6eZwpMe/u77WZ7bnysRUQ5WAnWBgMBWapZX42a9dWoUeM7yvpeuBVWY+5E8KACrEiUGwG253X9KPvvP1/937/87OCwl+VFCHm7nYy1+c3by//5P/7wh+8uT41ZG7xmGYeikSTWNYgMjfw6gjJRDMHPz+2PdnjWZ+Z7GW5FGqYiQYKoChFYlZkMG1UpfM4ESyRCiUuuXZ65e/saW7O5s9MrgofLhEOwu9tHJ4fd8bTVaY25NIEIoGRISKNU/8h8T1nuo4tzhqic51/pWiNWImFlPgm6k4dPnz374PGatyaxdr7d+tHt63cXp9Og5NWZOMYFG1MiNb4V0kdahLxfZM1Gwzl3dNQ9Oj6DMYEA5uWlhQaTEWoYhoqSGMulR2BsXQcAcPRpVCVDAhRgMeY0lyc7xx+urj3Y2XHtNhV+vt3563fefOfKwgShSZqSWhaFCjSIqhKB68rRH5jvvfTbcT68HEMQrWaAo7anBvV5mBtvtjrjj59u9iWknfbu0aHPi/H2+EKnnbClaDPE5MU7NvUZq1Gzvho1anyHWR9VpggEIFQi4CbAFuqEnAfv9/zna8f/9b99+uDBfp5TI3HNhgn+ZHba/f3f/fCvf/LmzESSGjhS9YUzzphG3vUgAzaqIhJUhVRoIJ9wbvL+vLpGfdv8noZdqiqiKjqYIB1oaBrD1nAo8uC9Y244Zkia0tKl2Zn52eBD1lfSRshN3qej3dPD/W6aNDpjTZc6YREuwN6wEkZY07msxqjNPOkFFviKIKQeQdG19tFp99drG5vHR5zY8SS9u7z0g6uXZh1bQWKILUSDYTaoWd+3th2KSoAHNCHbdEmAfX5w1CfNVIJiemJiYbzVZGIPa2EsadzQUNX6KhVJFVUJZIwQe6ICvNPNPlldv7+xeWbZB50fG/vx3Tf+/MbytIErtMHC8IIgEIGqkIJYDUeZmBqvmg1qlQzSaP04VBqzCKHIms61UkuucdTtHxV9cfas30tcujA+M94gVlVRZiFhJBr+AAAgAElEQVRSU2dtatSsr0aNGt9NiFb+V6X3WiBShYKNkhNyhZgAOsqKjz7f+OnPP97e7vczKvqZz08nO+7HP7j7d3/zwzeuznccpaaw5A3BsuMAeNg0NYmFIYUSkWVjjWFihb4guFcX+v501hsZttYYQ7ZyDK9c6UDOOWsNqZCqMfDq2cjS/MTywrwh1z3shb5SsEWGvcPT7d3DXO3Y5Fij7YQCwTMZVRoq1OuoYudA9pJGXe5ebbkvQHLtKU4Nfbz59Dera31SDWFhbOwH1y/fnB5vBljAGeS+X4gkxtVzfd8i6wuaexQN44xSYgwTto96z7vdszwXUNM1VqanWhDpeWugFLx4y7ZUC9Jhh6dqVHMxAVwwd0U2jk4//nJt7fDApylCeO/q9T+/eXU+4TFVqx5SKIJAwMTkjHGWbazz1azvj3TuVRQgImuMYa5s/5Q5JMYUZ0XqGguTrb2z/MHmhh1r51Aimul05sabJqjmhXXlFENdn61Rs74aNWp8J6OcEEQ9kxCFEDKiUoEAZIWMV/QFR738lx+s/eNPP9zY2E1sS/KMfe/a5Zm/+cv3/voHNxan2ozCkLcUnR+I1IANYnMSg0gNkSGmQVb86yeX6jvm9xekzMSkTAPLNCKUYuflPBSDTLRhIIAhDFadbLpri9OznbH8tHt8eBxA6ho7JydPtndyoonJTqthmYhhikK8F2MMVCUEaOlEX43bEGhY6HvlrE9JlYKlLZ/9dmP7yeGhGpOC376y9OM3rncULYYlBQIbNtZF2fqa9X1b+yGRAkE1OLWhkKTV6oI+X9/01gixE7o8MzPbSpwSs7AFMfFQJnZoQwMCESlTJpoR73d7v3nw5IunW2i1cw2X52f/8t6dG+NpR9RkHnkGx8RExihZBRMMg020EqjXwh9hXwIxR60xHrhHECAIAQURGuwScGJtqzN+Ivpoa4tajeOz01Dk15aXOo4Ty5QHiIJNzfpqvF6w9SGoUeNPJMpxVkPwqqoIAV5hDdlAiYCLgNMMfZ/9r58++OcPHpz2+61mq+juTTTSO2/d+PGP7t68OpY4BJEGpRaBoyUxIAwSkCm7nQhyTjNDa2L3J77oRsl9jJgFF9zktfyZhUnB3nvJsw65H9yZnh9v/OrjjX/+5PHG4WHabp+q/x8//+C4e/h3P7m3PNXIWZ1JEmdUQwiBmY21GsJXOj//UZhEQdg96T47PO5574ydbHcWJiaaQAJlCChEC5MR+8ka39baJGJjVI2gwaQGc510YW5q9fAgqB5n/e39w1szi4ljNlY1FxFjXpKzIpAAoqTMhejhWX99e+es8MEWnVZ689LS7FgzgZIqjEKBUIBt2QNxzmSkxh91Xxp1+oyNnwWEYQChvEiTZKllrk9PP9qZ2Ak+I10/O/v0+eHk0nQKUKFwBK0PZY2a9dWoUeM7e69TrxBiKKOABMArQDjpIw/Z//3/fPKrDx6cZXmz3eqeHcxNuPfeuvrDP7u9vDiWWGUFoqm02qFkC6lwlISBLaXz+YW4qMafIuil36AB1TnH/UiJlCxRwjZQYOQucW9cabbHryQT9Iv7q6tbB4BznPz8Nw+LXvjP/+69lcW2MgJQeGGllJ3GYt8w7aDVg/44H5gS9FWfHR3vHx0ROGW3MjVzfXa2DTgoEECC6IcZLeZrfHvLUxG7HWJbJaeKhU778sLsxuFeDjrtna3v7nRvLraSarXqaCZDSYcjygHIilzTRiayeXS2fXQSjDPg+Wbr7tL8dAISBTw4wBKCAkzKrEbBHGUlqxVUn5hvZZuKqScPxLMNX7BLJoy5PTe3dnR4uLHuifd63fsb6+9dmp4gStmObGU1atSsr0aNGt890gdRMkxgMvL/sfemzXFcWZbgufc9XyKwEwAJLiIoLtqVKeValVVTVV01M9XVNjZm0zY/cj7MhzHr2avHaumcrMwsZUpK7eK+EyR2IBDh7u/dMx/cIxAAoa0mKZKSHwujBYJAhIf79ffuucu5pKvgKyiJIOXf/+PH739wrSiqxKsXnlyc+cVPLrz16vLxYx0hYx8+hRPECFWowBpNGFIiEBq+Rz0o1tLiex1jOGwCB16oRzXucz8xkUiIpGkiKBl7KnpivvOXf3oxmfb224/vr+6mmms6+f6H1/Mk/Zu/eH1pPjNVg6pzUKmqSpXePZ19jWQEemW5urW9VxTe5R0kJybypak8J3ydEIJRHNEW8z0byyFAKg0EGDiVpadmJ3NBBEOIDzd2tvs2O6kRcJAvmqBeK4IYEIntvf7tlZUKwjRLVF6YmT492clZf1RFmLjh+BxzAqdS5xw5vBFcaxhPC07g4UGFAIkAdJCT0+mrJ099ePNG9FrGcHdtbSvavEgiom11douW9bVo0eJZ9nEEmQzdHUhKcUGxvl3+83/55A8fXitilXfSKgycDP7Df/s3b7281ElKB1OYerUAVkh0fzZxrTyuoDUfMP5h7X74vTc44ZFmeBCjUDud0IxVWSGlT4WUYAFWTqb652+fm8zlH375wcrKbowu6069+9HNvX7/b/7yjXOnZvLUCxFoTXfgU/m2ghJWkJuDvfWdHYv0Tjpwsz7pEq4W/JBIpcFx1BjW4qmhbjGFQQQGIRhyTRZSN5NnVb+Eym45WNvrLU1OeZMETuthNF9gzc77gljv7d17uCppFikd719eOnHMISETieIZY/TOQxzgASeEG66UdW18u3I+PWsQoUuQoh7nkKWEQXRC9cXZbBYaSgbFbn/wcLt/ZqZbCbNmeGOLFi3ra9GixTPnhCuYKgxgGasgQpUy8tF29ctfffLBJ9c3e3uATXWz+ZnO3/37v3z9wvHERwWcgNFoUek00TqFg6YYiUpak7WRMQ9eDrpF7db4/WR9cZjBGPE/4X4VWx03kH0VTotOTVMTEdLBdxNBMEtoE6Y/f3l5sdv5P/7h959fXxmUiIbLN29P/g6pf/2FpVkTVWiWpIp6NiDHvXt+G98WplIR24NBryrSNHOazHUmFyanM8JbnWeP9UnhuK5oi6fm6KtSKQalCJRwwHSeL81Ob+2tRHEVbXVrszw+lQP1SD0cRctExKl3ohbZL6qd/oD5FExmJ7qXTixMkCp0oMFYz5l0DubkUFRE2xaxp7lW1TtaAhfMAuAdzaysgvPZjHPLcwv91UeFJk7xcG21mF2eyvxjMYAWLZ4DtEXJLVp8bxAJCuDIxJBG6P3N8jfvfv7uB59u9/Z84juddKLr/8f/+FdvvnJC1GJJWAqmVVH1+z3DgDKgFHB96ABSCCoFHL1j5pgJ2/WkxSFnKgwfETCIUYzg6NF0Vwkh0WwX0tPMmGgBXzIJTESylL5jnCRfP3v8v//rn7xyccknZWc6KRg+/OzKb9799NbKdgXUgozNAC6ybuhrpnHtN/g9yd3UKZ3b7g8GRZH61EOOTUwuTM0oAbN6dmEcK2ltXcanDiMjQVFRiFDIbp4tzs0IjYylVatbmyaA1FL/h4y7afAjQIqR0ayoogFVCGmWzU7ks55uEBIQtAiDakErOZ7hHq+Ib4nfH5nWf6N7TAgxcUiicgArlUjFKTo+eeXU6UmTNFIp9x49KgWhrgtu7+EWzxvaXF+LFs+1V33kXnf0/0k0ODHSnJrIruGzGxu/+d21fl9hxrB7YnH23/83f/7iyfkUpLo8dRIZq5hluXZSq8pQFc570ZHP4yAQNrurNAqNQNu21OKANcpXzU0QQFySANGMESYCCljnQwwOjFWEuBfPLPx3//XP8l+9996Hl8Xcdj/+5t2r6eSxfHJybsKHUIhY7gVUQCnOIBQIogJDddknZZkkjdgrq71BqFwiFdME3VTVGtfe4AM84R2dslHybG+Up7Z6ksHMQlQnjnCkRss0nehOlZAKkhj6vUHKWoknAADdcMGTYQ0zKQzkIKKIVlQlgLIoJjvTE50uLIaqzDo5TWKEJg4kSTaVnfvzwZtJk60xPK1Vqt7QCCiCoELlRb14IYR+fnqWVQyBgFvf2KjI2ngcfXvJWrSsr0WLFt8K5eMwULzfXSBfxA5FABQ0FOQgyXrwlx8Uf/+ry6tb2YTLY//+pTNTf/tfvfHa8mTmK2MCOBV4LzJcJTTNdahwNvzQRoJ+SDR1eAiN0suXHlSL7zZU4IflJDJe1nnA1YI03i4VUJAqkoprEh/NhD8hHEwkWgqenZ/6xaunB6v3bz0Y7Pm5vZj+y0f3Yif/87fOzrKK1oemMA9xphIFrPu3UAoESJ+gOZIKJuoD037QjnqB84AXAw3qqd6gBnjQcTjnu709nhKMBJGlylBYJU6TDNL1QpU9eEk71SA6k5xICXrWEa66F68eWtPI8wBRQNUQaLHwRDdJrazmj80jSTKfgHDIMjhn6sAqBDqyKReFkkLb1z9uzeFJxJ2O3BQfJ34RUHjxgBEhAipJmkqSweCQ+CIWKpISsQqTiWv7MFs8fxtzewpatHheWd8Re9eXbnCpqwa7qt6cv7Ne/v0/f7SxQ3Wdfm/vhaXjf/rjN1558eRUBomFBGvckgNrhQJ+7OEOOyky0uWXr87utPhe7C/jpqKAyv5D6n+HVlT/cgL4ERlq6uDqalCAMMC6qXvx1OJf/OyHy0vHQ1FVAY/Wdz++cv/Wgy2fdjKfI8bDjh+fePWcAF41UQcDqRAfSVW4odjR+M0gtaM/Ng2gxdMIS4hzTaBKtB4/anX2LTpXUixCTaWqE0EchtkINBytqdAc1RWjqSx26r36EFkBESChUK+pwKu4NE0AMwkmkRIpQzEstpMAvl02eOihw4Wq+YlSX28BPaLUbcpCgIJEBbS2KLfFc4c219eixfeHJip8TlFW8ffvfHTl6o0YOg4yOSmvvnLu9TfOT046oILRaKoE2/KzFt+6K/bYKxZNRERF2UhezM3Ovv7q1NZetrZ3+frDLUnze3cevPt+em7mzempjOIEjiKs04gN5dNh6vAJR2LI2mUEKQ50iNzfaKXV5n9m4OoqYqOA6gRh1GQnKmIhgKYikaCQbEoZxuc/CpRAZATopK5vFyPhlCJFVRK1uBD2a0JrSzzE9oevtnjaNtEEqxQCeELqgRwBCMqoNBLiKJI4D6vaVF+LlvW1aNHimaR8ApbR5xN74j78dOWzT28nqiYFWb722oU33jg7NZFZrBSa+lxNjO1u1uLb5XtfHDcnqRRVNRKkiKaJ/8EbF1a3yu3B57umsYyffHxteTZd/Plr00ldoDU2VdsEUNQqjE/UrgmIOBEBITBBlFqmVMerOQXDJEKLp7kmQmCop/WJUEFIICuDI2I0J5KmWZ2TtbpvWfZZX53mUYCEUVSdkyjqIhCJSPYG/doCy4qJIHFCi0Cs650VrRjIM2ULIGrJHrq68hZCukokkr3CKkF0AkOWZ82NHADXcvUWzxlak23R4vuyq1WiQWS7F//5n9/Z2NgTo8TdU8fzH7997uzpiSwBA4BEmDh1qUKldUtbPAN8UERESAJQEQFiDBbDzAR+8OqJS8vHfSxRYWerfOf31z+/sVKKi+qjKhVKOEIoMB1RryfIIogsSfI0ERrAQcVeaaZKcRCBUEEFZSQA2eJpLok0M1qsy4wpauoGIez1CyHVYu59N88b9g5ESAStLvUkAFGKUj2chzrAqUvTnJBgLGK1M+iHeuIDEEZVx2ZymO0poRCFtP7YU94iAyyCYHRUMRV6EFW0h5u7wQlV1LuZmZnhOtJerxYt62vRosWzuqW5PA2in3y+srLWK8tIC5MT8tMfXVw+PZl5Y2TiEoUygsHAKGTbd9Ti6e9SqgCixXp+sqom3neyxEHOn53/4asn56e6DjKRzz1cKz66cm+7jAUkQAwEKKRQQIcnPVmEADHVyae6uZqBtrW7t77dCwJToQhAQdS2ne9ZWRENjAqoCAmCpcPmoFjb3EC0BJjKsumJCdGaziubpB855GpCEROlOqgAqXMTnTzxSSQjbWdQbPaDKeCHQlcCUYUeaFttPbFnyCDEiAqsO4gdqZHYC+H2w5WogEOS+Pn5uYQgBOrb+7hFy/patGjxjG5pQXB/PbzzwTV1kyqJMrzxyvKbr5yZ7voY98AgQgQwoJkwRmvPW4ungzEpoEYtg5DGQSdJIb3EBOHVC2dfu7Q8leeJy42dy7f6n9/aKIEAELEusWxENp78PeaAmW5nppsrA2ib2zsPt7YKQRAxAWEKU0Stv0ybSX+q9qWAE3jnvHMGVMSA2CyK1c1NWEjA6Syb6mba0HSpJ6lz7HLXyh5CdXCOSBWTieZp6hSiurO3d3vlQUFGEaqybiP8wnBBM8ijxVPbIYVSN/82wSJlxCBgu6huP1oxoTpkiV+YnXOEhdZ9btGyvhYtWjwL29cBND9GogI+uXr39v21vSLmaccLf/j6+WPTuUehqASxcYYcpG1XaPEUmd5Rvq+q1kk/RotVoMXUUc1munjz5ZNzk929nZ5LOncebHx+88FesFDfCM2AeH47h6/ARJZOpoljFLA3KNZ7g76hAKqh3mOTK6qlANst+KmulI3ij6hBC8iA2CrLzd0dMXZEOl4m80Rdc21JHjLV4XUkSDE4ouPcVDd3wlRYFIO7K6u7lVVAJVIaanGXQ3bNYbNpmzd6+vZA0iCihNIkAn1yY1Bu7e4aLRHpODeX546gkWyvWIuW9bVo0eIZYH0AqjLUOuQxmhEGFIG/effDvQpFFYpB7ydvvbEwM9UBUoSO19SpYl9hUFQF0noiLb49uwWOLCkWEeecc64eDOm9T5PUqQAx9fDQiy/Mv/nyiU4nMbKCv3J75+rtTSOiWZ0VhNiT1nERNmMopjvpiZk0T5CmasJHW+XaThwQZS1EYxVjhS/J+7T4FhHNyhBJobqBd5tmW8Vgp7dbl3d2NC7NTzhCRFQlMh5ttmYIoe6Cnp2eeunFsxkMoSiLwcrm9mYVCpEI9kNZmZVVOMQWvsjsW3z7MLJf9CHeKLEK0XNj0H/348tJp1MVRU4uz88f92KgChGszc22aFlfixYtng2MidQrQMHlm73twkUIaLPT3RdOzs90slTiUGHCIKPCs9EAo3Zba/EUiN8RrvARrwppjjFzOLN07Pj8ZLSSKmsbO3cebvUDaWxUE8dybE/whjOmZKaYnejMdFJWRRnCyubWg82tUlA5RFBkqOCpHuLaK/4ULQ0i3ieJ+lhGIyKwvrP92Z27SZ6lTqQYvHDieH2FyHqQmxyRhx69FKlk6t3S7PTCZCfubgv5aGv7sxs3B9FKceJ9GZjleSjDoXcYTf9r8ZQdYtVuZyoaijJWabId4qd3126sPKRgIk26xOtnz5qhAw7KSrL2/m3Rsr4WLVo8KxuYiAyF4gVGfPDZ1a290kCiOnPy2Pkz0zPdVARK1XpQUT3aTNrFocXT8MK/meMrQD3IwRLl8gvzL5yZFa2i2Favd+/B1t5uSNR7cRDSwTzonvCsBFJpCXFidubU4pxKNGCzN7i9vt0LBjhCoOqcr2X/2d5hTz3EwHrJc5VhQLu5uXXjwQNNE09OeD1/esnXJJ0GRidw9RzvukS3Zmv1TJBUnacHM8HZ2YlLp5YmBELbLsMHN+5fX92Bg4nSpxQVl3A0RfJx9tjiadqEkFIagvel583twad37mwVA4txKklenDv28sLMpNERVFLYily3aFlfixYtngmIqAjMWHO/YsC791f3BoFKSHHu7OKxqTwXJKaOXuikbmOXZjOrBepaR6TFU/DFvx79I0WRiEAZ5mfc8unO1JSCVTDb2NjZ3u6petWEpNGopD7xdAqNiXFxemL55PHJTg5hFL21sn1jZXdgNMBoRhoR2db1PW1LIwItAPC+MD7c2r1890EhCKSC504tHp/LE61TcUHMEqgOw2I6HqoQI4w0B2aC6Ty9eHLh3OKCRmo+ubKz99mde+tVGIjQSwVR51qG9wxumAoFUVoIIDI8GpTv37h3a2uDeaeqqtk0/9GFi/PArCMr63TTslU7a9GyvhYtWjwbDk09JkoaHU7K9s5gMLBoQlie4czpqSz1nkyROcvFUkAgkRr3lepat7TFt8v3Dj358s3LrFZhFIV55dKJ6cX5LlAA3FjfXn20GQNIieQgFAOrwpOnq6xKlIMusDQzdWx2EgCdf7C6+dmNe5u9QMLIaDESkTC0zv/T9PJrJRXVRASV2dUHm3cerWneKaqqm2WvXHgxr2cu1PPbLQipbNRXOMz1UQHUko4RrLzQg6dmJl89e0qilXCF5Lcebr//6d3tIkaBCUoDRQFtHbBnbwFiqKImulGE39949MGtGxuhqgRO/eljx145Odsls0gpCoJFGLRjN1u0rK9FixZPn/I18p3DPSmSGxubRoHzlDi/OHVs2qtZI3JBgXlAAINEIlJaebIWT8HpejzOwCOJYPN7tdcOVYNVC3PdhWMdSCXCXq+/tbkXKoAQVXilPvnJ6DQFPaIizkxOLB1fzDqd0qxXFPcfrT9YXy9iFFXnvEtEk/aCP217E0DFTKqKD9c2Pr5yZbcqg6jz/vSJhdMn5j2QgkK6etgGKBSpm6C5PwuyaX9mVJi34KryWJ6+dGphfm52s9cvoHfXtj67ee/Kjfs0WiMpKwf5Z4tnwyGmTOSdfhUu39t4/+qVR4NBmSSVypmTJ19eXp4hsgo6YCfPScO3sKS0aNGyvhYtWnyV5wwzo7EZAyUIVdjc3C6r6HxiiKdOLuR5nnhVEZQYFaoQRkSIta5Ii2cf4mCkQcmoKKen06kprxKEDGWgRScgqeoSn0L0SddU0gxOkCg46Hi8uLR08viCGeHTnf7gyvUb99YeBZJUGwl48ijWO3aY9ajB0aO96EeeqgOP8Wf14BocfjT/QAgNxOpm/5Nr91e3ts250sLUzNT5F5dzqSNiZAwQONdcMsFY77PAhFRAKTSn4mG5k4xcmJ5++83Xji0s9qPtlWFjp/fR5Rs3H+0WBlVlkyscXevRsR39pY7+6uSX/N5XvtF37LIf8VUfs4zHLaE558O/iEQR7NrdtXc//mR1rxe8j15n5mZef+Wlc0tzPhKBMEIRYul9Mn6HHv68x14jvumDX/L4Atv/+o/a7r7MML7mIX3FVWjxjMG3p6BFi+c0ZENYE7ghsC9UwWZQmcAIEyVQGLd6g72yEk0RODc7612SKLVJ6dUzGpTwBIXSuCT7ep4tWnwrRG74r3yN3yNRVkElpp4KSakJVEUDEChREIUWIQohReqpfU9qyyNgiJQIiIQwqf7C7NTKwszqnbWg2I3Vx/cfzhzrTs8sLGapr+AixANuP6le34Q1tZP9nrFDzpN+f3ptj56H9mVylzKad75PoEbcSprrpCAohBqkLzIQu76z+cGd28EhVSjthanJ8yeOqyGRoS+tjupghzN0o8OIxhhjoh5koihDSCy8tby0Ju6//O6DZCrdLgbXNnv/9+/e/ds/+enJyXwuERfFsRbwpCmjAALbt3wZHu24iY2+zegF9yWn7+hT9Lyazz5VOXRGHrsmAhDUJuTJIVlvWIpFqdOtBFQhCvUQEIXIQ3OPeru/vnz92sojTnRdDBMBLy/Mvn5qdgFIAmBEx4FBAAc5HIsZ3rvDzz2cVjGRx6+Kjv3xkTHcb7QKHT4PY/8Swv1XVHk46cyD4d7DakP7XO7x98cXOAqtDHjL+lq0aPFH8zJ15Ow0QnONIyBwzkQjxRQVEZP0/uZWv6womRefat71LlVDsQfnRDOKGpzBKQmYoN4ZtV21W3xrfE8fo39H/zwWx89yrwJWUeBpLvXdVLuBPrp4b6N6tBvOLiQwU8YcKgemmfyx70cB89RABbrRZybTnn92arG/uvne7Xu9zN0t5Z9uPJKJuV8sZwvmXKA6kDFaBKHiVB0ARpJQJwQgJMyGzp9AXeNmfX8XvXFfmEc5yU1XstVeboDSNAbAxBkJMyUyeNCXzq2Tl1d3f3313q2ysMSSKrx25uRfvfLSKY8pwkVAVDUnEATi4JrRG5D9zJ8KRL3zPgNUFQScapIkHvjJ0lT/4ukPrl0eZDYQfX99Nf7+w79+/bXusa6vpIndiVHKkAlF67mPGCamhRCIl1r+dbjqw4Z5F/c46yO+2HOX5/3q11//se+7/50bHjIMnSgMqCAEklo3tyo1BJESHCAAmiLN6DJ6NewK3tva++WH11dXdyaOLVS7WxNF763XXvrbt984BuYEHNEBEFWkI6kRFLOD5E0azin769T+EWqliOO/L03quKZfOlxIRt/XDtp48xEc54r7V3WMkzXsjtKcDQ5Z3zhPc+MEgPsRBj5GOnnAhOwgsxUF5dDCyrFn0voPLetr0aLFH8vRHMqIH/wPikCkcRihsIh+URnFQEZ08o53jqSKQQCJEKWMbSL7iZG2CLzFt0f8vtHvicAs1npFJJyik+edztRgLwSJEajISHiKihpF5Ik6IBIgkUwBD/E0hriYJ68tL63s7Xz0aC0m2Xolv796f9L8z184nnuyjMiQeEeKRQsxqHNUkvspvUaVafx7t07UFzHC/bkzo6EMgNJgkUZKYDRjJl7UV8HtlLy5W/zm89WVfj+bnij627Pevbx4/MXZ2ayhUwe8VwJOjjDDx/NNAnigQ5zKsh+ePL63s35l9dFA1br5J49WqneJN994aSGbUacBQmgnSyRUNINATOoUsBGQxDk3ysnIY+kXHk2Mv+h35Lm/yHJo4MWQ8elhtiEY1cCoAq6hMImIUAKsi7yCgS7QFbS9vfJ+Vf7De9ce9svKuHb37vLc1EsXL/zi5UvzQA6kIMRG220dpbIDqXnFKF0mw+Ty+NBcSkL4x3n5kI3pweQejzItxX6CTg5ecjlgHrKf4qznxIw9H2WSKeNH0fw0PMEHVkvyUKIZtbqtHGlX+wUMrf/Qsr4WLVo8ef9n378lVACi6PeFxljR2O2kVEcEEf2CkjHFflCyRYtnFGYGmAKRiMY8zzudzubeTpVHYpAAACAASURBVMOYjLQ62ly3aOmT433Dii8RUkQIkjFL0xdPLd4rBw8Ge496RRmqu4Peu6iOTfjk+LGJNPU0BkIBr0YrUVEF4mpfyUEcVEeuprRBmDGaxQPVZkqAzQRECuFJoYkYHKFiZpGp5N4nZrZXkMrtsvroyoOr1z4HqjyTCdGXTp25dPJkRtYONGWYQJIhn5RvcJApOSt4Y2FG4yVU8fra2i6tUHe1t/o/f/jOjy6cf3t5aWnC5ea0tEQk94lJFNVGFpSEUQ1QHVI+IRzFUerGRNU6nTPytGXk6O9TvnGTf37zLoRQ9MgiSMiIJNWkpr56YrDoaM6c1CM3CNLTe7jchOIM3KjiDq10/GR7+3/75a83Q5p1uuWgtzA9uTQ/94ufvH1yInGkyiHKU7M46IgFcp/oNeXEh8oTKI50xTBbuV/LPkbulAf+i+rGBwJ+DY3jr9AIOpSQU0ZtKlS1zgWOjqXOVY4l+0Y3AkRH99xXhOzaEZQt62vRosWT94gOBBl1tIOYqQAWAXo3jIw7L3KgG+Ag8WvLO1s8064gaZQoThFAUlRJmpmArolGAxCIfAuVkQ5aT7usPy4y0mLX+5dPn9goq3c++Xy7P4D3dzfXf3X1qiT6yvzchMVQVOrV55kJgxGEExiow8Lt/Yj+9+9e5OPr0pjve5ACN+ooBEwZpK53FwEcNWUSIyFigDkdeD7YLT+4++Dy7WtApay05IXTSz9/+aWT3S5iVO8gMKUO27Zc7ZB/bdpUT2FPKs6l8vrirMSXOu765dVH28K+t4+3VjZuVg85eOvM6UuddC5zvlItTQlNah8cDgoxY4UAJEnTei0CjtRkaHUN6KH+qkM1jwed8OfZiOTx+k4Zfd/muYzxXQqCIEZqJMTgQh048YxNOtgnbrcc/OOnN391+eNStJPAtjeXF+aWZqb+4sc/nMl8SpqZOtVhGm9MVVilTnbxUA1kU4ML7BdnA1QZJiAPtMWxSbodxe/kUM/gV3X5yTfrA6SBERAg1uUFAqXpkNPun8gDnzCW3pOjDnqMjbfeQ8v6WrRo8ST9owM+kIw6B5wiTxOnETSIDUoGY6CoeAfWlfl60MM6XJ/SosUzZ/GNcyWiUEdoVVaDQT+GMlGmXhMnddqEHLlnT8qkG0/cAAocxCmGecjFTvrW6ROD3d7HN2/1q3LL7KMH99nJ6P2FyYlupwMnFVn3gwmhNIEK4Ajdr7f6/t2PcnhlO1zSdpgBRMJMGAQVUNdjKlWjaoSjliX6gtDhvf7gX67ffOfjT/tmSeInJVleOPanL1+6MDvtzIRwNXsUjrxewTc2IAeIMAxszrsfnTm+MDk1f/Pmr29cvbG7ocdm7tne+o1Pbq09+PNz53+2eHxeXB5VmcIIiRSDB1IhNJqJs2YtpyjhmyGsiI4j2ZZD0yAO9UAC4r67+91+Tx3HKa4pKgONNIrSOc04HOFSFgwdu7PT+19+f/m9BzfLqSxVh63+0kTn9NzUX/7sJ7MJp4QW4lTqHU2GNK2JNoiOCy3JOBscXgcb7+0TBIX3UQ4l9EbcSA7ypDptqEd946OpFuULeKEc7SEAQhumHuvaHgFMIEJpRpUc1HChCtzRTaPy+N04TJK3O1XL+lq0aPHH9YvGNj6rdyAjRaAKIwCkDvOzU9ndcg8mIts7/RijNTOHbRSy4/6m1RZntHj2/T42whoqAgkRO3tFv9+nReckT1yWqIK1oi1Fn7hF2xhFU/UqEIlgSpyZ7v70wtmy3//81p2Bww7t3Vs39vr93sULFxYWJlUYoycnfOLMlOZk/3Y0EatL1g75XN/j2JYc7fYaNRhodb0toBRv6oMggA6ug2D89FHvnZu3Prp3awOlF8kYj88t/OSVC6+dOZ6GiGDd3EeSwlh3M9ViKo0U5Nc9/RTCkTCQnjpFXJzJuy+d84mX61eu723vqvXVoVqLvXJ1bvMnp1+4ODcxKXXGxdHEYFqngJrQBQAqOSw4HY99NFvAsCwP0jyXLwsMPqdXf/yLsdFEAXm4/ZW1lAm0Ll00r5JDEQ1VROm47ovffLD+L59+sOWZTE33Qj9lfGF2+qUTJ95+89XpjBOkVXEm847DEY37F/cxvcv9GEVD9Oqyctu/IohC9fYF9bb1Xw0jC6M2RT2cvyUOHsrYnAoF3X6W8TGyxyM8B0dXn6GD/YQQGaOsQ19AaN50/C04jC8cGtQwChn71o1oWV+LFi3+6D4QDpZCCaQeTaQiZgiR3uHY3HSWbDilqqxvbBTliZDlXhxoKiOlADksitaixTMM50UhRlBQRfT2iioEFVEwS1zm1IEka9f4SffE1eRS6h4gkqADMwmgpobz09Px0kUPubq2uh7L7TJ+tPKwoFs3XDg+P+/9NCFGX0Fsv89HFHAICoO0JddfsijV0sNVE+YSTyjEm9PYEKRI7Jpd3+j96rMb79y61k91YnY6K3qnZ2ffPHvu/OJiJ0JKMkZNHJRBSDDuq2R+Yw39ChZcdE4QiT7SYMsT+eTL549Nzfznzz68tr1eiDiX3NnYeHjv0er69k8vvnT+2PTChCZehQ6mHnSgmjmtMzkGkNLIu1AOnRPqgTGPqCtSR+64PvfXnTrMbOo4/+cXGIYp4AQq5oiUDgFYDXxUcC1s/5+//ezK/ftJNzdnVhSLWWepk//ZS+dfPrk0k4saY4jTqWMV1IsOhWH2GU7NloSPET+O953qWPlnFOvLPgmUYYecAA6qtYrnaMYuCQGlgth42vbx5yNEwMZeHgl8y5he6LiBCn1S6VBIVGoB3KH0Cw0wGeOxgIjQNaWoY4dxYJ7G+HNXy4m3aFlfixYt/ii7oO6HeZvgL6kCI2Q8TodoFJmZ6CYKrwS4vbNTViFAQyMXOKKLY1OuhrtYu2y3eEaDHmxSIaQYtIocVFbXKystd0x0GP8YC0g/aXuu775ojAyJTzIiE5bUFPzByWNeOfgw9DfWmaVFiB/de7DVLwcvn3/r9Imu0ypAKkld0kxhsfrA9SDnkPFBdvIdFkbnF7xG7n9xGY71k31BQqU4qprWAvZREBJuVvbxzY3/99Or13fW3UTXO1aDvdNzUz946eKbp8/OQnxE4j2coApI9f9/bsyAElHAVJw6SEkMMJ/pn5xZnJv+2S8/v/KHOzf6O4M0yVX56erKva2ti6fOXjp78tzxqZlUu4l0II5wgJjRrPHLVUzVhiej7uRu1GeGQwnlIDeop4A856E8Hix43Cd7lCNubDY7ZEZ4KCgowNUqXt+pPn24+f+8+84gEV3ouCRFbzcpi5eOL/zi1VdePTnTBdRYVaHjnCMTL2ZWd1qONls213eYmxNivKGQR5TK1PtxqOXVZLz4UZvkHkGOS8YMJwyOj2SQ4XxAOXyLDP/uQBnvqKu/PsxhXrT50cMJZb/WRwQGEYrUFfHUZhkaJZZlZGQHJzqM9TUeti/X7lMt62vRosUfDfo4F4TC4JyHSIh0gm7mev3ixPHFTnZZWFWhunt/ZX13sDA/XcSgzmEsICwAResgn36fRkK3eB79QIqEEAAElbWtvf4gep9UZV80TOTMvRlNlXHYtfJkwzCuUWygAN4nUK37ZsxSSiKaBFxamE9/+qPFG/d+/dln/YJuYur2+m753uXeevGjF5bOTWezHTWDmIAURIJCcRSVWspDiXq2w3ea732RD9losx6k/s2oC1E0A++8aYwMVYQIM+nD7m4Xv7v64P1rV1eLfnCKEDuG04uLf/H2K+cmJmdVMkNiQCRUoSK1MOwf4fhVgSCWJCrwIFzAjOPrk93pl19dnp7/8PbN2xtr/WDMklXF3Ts3Pthae+nUqR+8sHRxOll0zosqhFWFKgBE6mOKksHgHFRJLwJKjFEpokojSXXaqLzwgMTH820yHJY3jqQyo0GEKtHMJ8koJCAiZijNzCUGROVeGe9sFR/cfvD+3dt3dzaq3FsCxAGr/rnp6R++/trbyy8udSUFHSCCTurdMLfn9imfjv5t0lwSalqj0miI1hXliCaqEDeyVgE8xaLBidNk1EUvQ/kXEhabOG49FJIqZEqB1YoyqrU48KAq0zSrv2oczvRjc6ndeHir3r/dsA5YAQ8QiAYAucDXJDDufzMqYKKsm6XhGkLYDBIJI7baRJUbEkpafdodZcRVSai21Qkt62vRosUf0e09zAGNGJuZSgNFHNLEz0xOeBXGKk2S3l5/Y7csI/MkMcLYRBrH/KxWIb7F80EJRD2hotjc3Lz74NFef+AVS4vzi3OzygjGOqL9pNPWdRR8GKyX4fAta3QlLYi4VN2MyqlONjh+nAEf3l+5v72rLu3vlX/45PO9tc3q1XMXTkzlcJlImqgiEQSzEqR3CnpCSJPvz+DjQxJTGLrYgNVqrWYAVJUQoXqkDBZKozjtpAW4ZfHG2tY/fXrj+upK6cCOSllNBnvx5Mm3Xr1wZmJyziUp6UZ9k6yr2+rWLBmW8h0SWfy6ITk/rJegEo5Si/2USA0Xp9OFiTMn52bfuXz5yoP7W1VhWZJNz6zu9bY/++TO7ZuXFuZfO7V0cXFuPnd5lmrmhQaBwchIWmUSq5AlaeoS7zJpaoyNsaksHNE8adKjeM5dcMZi4J2jd0PeZYFEVDhnUANLRiO9JlAZZEmf3C3D/Y3BHy7funz3znZVVon33dTKomNY6HZfWlp86+y5iwvzM0IpLU2lvnVlfwrDl3BQ0zERFdLq00/S+7QpMIhWcyyKAC5NchBWsQyRgKiqFygqg9TlvE16DQTM0I8UgxnN6DQIaWSfZBjUPKyJeQxrfwtW+yTTQbUZuSsNF5ZUa7UWEZEMUBGfIPX1fF8wIFZwQDfXpkt5pGdEBeBcU28qDQOvu6VJgzRs0Gpp5RACI6WbtFPaW9bXokWLP6bX+5ingdovlOFUVYHLEzc9gfmZidsPdyoLBty49eDC2WPZTDcQSRO721cFYHtyWzzrUMgw0CzSL+3ew4219U0AqnJ84dji/DEFVaM4Z0Qkn7CcS00XGp1/UMGRoENEU2mIjG4+EbcwMdM9l2vyYbjTr8L27sauhU/v3n6wtf7KxeUfXHhhoZskZA5OqctcDgaWFaxCouNe1Heb/j0mMQVgv4yTAJyqd01VHQFzVkQG+Hyictgl7w/K9+8/+u3Vyw+KvT0X+7s7sz47kWSvnTjzi9dfOz6XeaUjHUkjRUVkOHhblXQYY33YJ1FfyzqJFPD1xAdBVGhCrYs0veSGWGEKePP45NmFt689uvT7zz/76Pa9tY3dPO9mid/Y2f3XrY2rj+6dP33iwqkTL8zPd51OqHQpHUm7SGixorGTQyQYqxDVmDjnnHfqD8QEOd4D+HzDZQlpiLEKIRIu8eLzSBQxOmUkC2iIQWgCboV4vV/89vM7l2/c6LOKTksW2t+b9P6FJL20sPjqqVMvnlhYmu7koKIeoM6DVjZ+PY/opitROkAgdSWk1e28hiqUPkkT56EeSZ2WRAxwAeIAL977KKiIgiiMhlhU3DP2QhxUsQKhYlE31nYtoN/v93q9fr/fLwb9Qb8/GJhZczBswrUETNQ0Mx6IkNQtgv3BIHGu0+lMT051u90873Q6eZbL7GKmLmZJ1k2zTJABXZVcRMzlIl1VX+crDRZgEZ1sVJYqAmmSoKRAxAgGlBVA8T5xCZx+P+fNtKyvRYsW3yrMmmyAiJB1BgJpggvnz169t/3g0crEZHb1+o033zhzbLrj9wcGjcbHciRE36LFs0sJKEYQapSHq1s376wGIs1yZ+Wx2YmZqQ6kFCXEQItQ9y2IeNbdNyO1DQ7ro1ysEz0AEro5L/mUzL5x5viU/5d3P4UiJL4wW62KX31++craozdfunj+2PTpTupFLAZfWaJeUk9Rkf1Z86MGv+8w/ZPHiF8TnaqncjRuttFopUlE1u3uGdd6dmdn+1+vX3/vzs2eR5X5QejPTXaPu+xPz1/8+YuXFhQdMNLMYs30KK62EaHUMxLcvqE1fYPfpF5NxJwzUGmKKBqEcHTUOi2lJrkiIzOH7uLkfPcHF06c/OjarbXd3c1Br9SILFmN1cMb139789qJ2ek3Xzz/2qkzJ9QF5USUjvMC26lMU5equMQ3Sp82FhDc193/Lgh0kSwHgyRN1SXep04kQAuyBMUnO8YiWuK1gvb2+p/evveHa7eurO3ki/M2NbG7vS4xzM9OTYtMVtXPXrz4+omliwsziZGlIVRIFMn+NPKvCrU2ma4USV1Z2WyXWpf0isAFYGCoIpwADs4DDmVJEIwWLA4ie2Z7JXZDuHH//tZgb6O3vd7b6ReFKcR7lTTsiaMnOaptjjRq4hJ3aAWoNW7g05oGmtU2PZTkTvMKqER2BgP2+/WfRFcVl3eMhRAOmpApdSrrzHQmL5w+PZ13Z7qTU2meJ+gm0nWaOK3gUoXTOn+IuunUDHEQstTBpUgT0ISGKsJKTLQUo2V9LVq0+LagWpf2GAlAX7m0/K9/uLbySIxc29y6fPXBmfnZbDIfiwzuP+N3QOm7xXcaddWailSRt+48uHt/BdRoNjM1cWppeiKPUjf0kZDkWziceoIa6JQUk2FXlUKsrvEzi1aHYOCVSIQ/f/HE6Zn8tx9dvrzycCvKZlVW5nsbW6vvfXT3zOnXTp84N9Nd9G4i6yrh6jlhctgVxvcg6cejHgAiGFjF+kRnCRNZr+JWUXxw/cE7lz/bsCqkeVn2GQYLWXZhfuGvf/DmpcmpbgxTqlLRS6TQIFSpxCDm1Dm4urytziXX5J1Nq/M3sggBnUQI6ikOMFgUc0JxyHwqJAMQMeHl0oxfnjz5g6X5K3dW/nDz2tX1RxuDsuhkMcvgtLdX3Xnvo3/98Nqriyd/dPbMhWPdYC7QaQcRKAAQGpAIEsBjaCqjpJXw+ddyEYiDy0x8pFYknRKoRApIQUaLu1W4tdq7fPX6nZWVQRktTX13YnNzC4rZLHOxnLP485cu/fylS3MRM8IkNAoqTJQIVcUkS4ERVxobm/BY/UtNqI2UprkOEUJVio9AGcG6tlJZGWO0foh7kds97PSK1bW1h6uPVrc2t/u9oiorYT7VqRQmjGAQmtHKEgxSOYfEiTrXJPlFVUQC9wcFuv1ZFSwGPRlBBSoy/CsQhIUY62a8CJZWBdGYZF40UReM/TL2LW72e5+/+37mk1y8GBSc7kwcmz22OD396tlTKZA4Sb1mXnOvmUqiop3UeSiJCERTFbgELhFpW0WeveWUbF27Fi2e19jnYa4GALAYVVWAurCn7jcIcH3V/+l/ff/3H1ze2dvyqZxamvuP/+HPLp1a7KokFtVivZuZukqUdSlKW6DR4llFCE0f3f213v/+j7//9QfX+9IJlB+/eel/+HevX5hDxj5sAHWlnywk80D2BDtWjSiJCHqxREybBLoiSowI0EgEQD1Sz0QiAlgJKsV6Gd65dudXH3/2qLSQdiqoxejK8ng3e2P5zNvnTr8wk02oywXJUBSvduaGUia1asJ3kdbzAKXmcIzYfu8TpJbPCORu5Mpede3uwz9cufJwd7d0bnswgGBucnI6TV594fTPXr54PNNpMKlKFP0sy6VuTXISnQzIgOjhU3hHaNyfgxYdgkCA5OvbD8ek9B2DY4AZrJ6v4EE1soiqXpMMQDSWlfnMFYL7e8Uf7tx9//adm1vb21EKaCQ6SdKl+L0iK6vT07NvXDi/vHw8n5Cu09y5RLWmfI5QQ9KoRJKoRw3WTWai8M/pel4HLyMBFQMqogSDcc9sK9har7hy+/6VW3fWd3sVJapEgkaly70TVjNd//r5cz9+5eJSqhkwQaQgyggavMIJIFWoXOrGWKaOba7anNBG5rrupWMsS1UP9XRqQAUGogIGIRa0XuRmZQ83+ncfrNy7v7Kx20OSBjCEILX2SaIuSURlUNR9ekOZVjaJ5a6mSqiqqpC0EEVEnZM4THhLM4dURIQ0C82xqnAY8SUZQlCntdiPqKj3Iihouxb6MZAmogonhHPOe1f0C69ORGJgqCqQ3qWZ07Dbz1WnJifnZmZOLh57YWnx1LFkElDnJlUTVQ9RIFOAVMBJ29XXsr4WLVo8KdY3VtcD0kITGqQBCHB70A9vFP/p//rlnft34GKS2F/87K2/+tlrS9PdmvXVOmQmrhJHOcz6jlwpHmt5bxf5Fv92x+4LDY3yuBJ6iKSgX9pvf/fpf/7Vew92Yh/5zPzC3/271//sjeOzVqUYSNyDaJlMF5I7IJcny/qAACYSE1gjARIcCmVEICoiOEiGJGEiEUCIrtoLcctckXTu96p3rq18dP3u1qCCODAmDF21E1Pd86ePXzx9fHmqO6+Sgs65Oqwz6urRJqZOHql6+fXO/r/h1h37OI5NhZavusRf77howiHlGxbM2pBPxWYMo0bEfjFY3d26vTv48MHGRzdv7xaVZhmIjs/mss7piamfnF9+/YVjU0oJwaq+T8wrpWQiHVCZiHnpQ0pED5fRJ4dYnyJoM3XafX1rHunCKKIwSt3hGc2CxZAnmaOSSoOKgyCIBcQIV8H3gfXSrjzY/uDzW7cfbZjPd8sSXn3qQxjs9XZVbC7TxcydO7F47syZk3Nzc5l0nMtEVSRROEKbUeUc5izF8xuyPvnGd++XvMlj6TI+9gbyxecSIdrOIKTdpIrWq+JWPzza3r218ujW6uq9tY0CEr1H2gniKjMD8sipIizPzrz18otvXjg+7aBkLKMqTUKSuvoOEkoqTqEErSnDVhA6tlTsa5qMhSK0UeyFCSuiiLZZhu2BbQyKz27debS9u7K1vdnvBwrSzKWpqe6WJZyoiAPUgFiximpxMu84gwfrPK0T8aqJkxOL05mTbrc7PTWV53maZt1unudJ6pt5DLVEZ/1EiXx4K9biwZGIBgPrDrtBaTu7u73+XlVVZVH0CusVurU72N7dLUNVBSsslkQUiSqlWaBBnaQJhVUVy6rqTk2GGGNZsaqEZQrmihw4d+bkmeMLp+aPTU/kk04mvBNVKavFLP2iwLF8lfnIl1nMd0SV9qmgrfBs0eK7ygmHK6IIAAexAV5Zzn49LVvbndXd7QryybXbr758dnay07QKST2CyByUTXjzwESggwv26AU7uAS363CLfwvlG1ah2Vgupx66peMzrEZ9SlGkJNZ61UfX7z9Y20i6cxS7cGb+4ukFqVga00SgGSAK1W9DV0ABL43Swf7xCmpZF3ewu4pVWcBV3bTjkBXQ7lQ+/eryienJDy7fWN3eDWZVsF45uLHae7C9+eH16z84d/pnFy9MONcV5IoESGoNPY7ueBpoUuvAE1D3xcNX9NBNzC/wtL6U8hFjzWM15WyGj8mRwSEefenrt5EDb0vqARkSBcRYj7RABAaUQJYxrvV6N27d/ezateubW+vOWZZ0pie8UxtUs4n+9OLyzy4sLzqkEZ0IhWrWiVIGVkmaoBLECBV4rxAPrweDZ+NP5Rslikd/c7g0VJ0mookARloMKipaT7+uT2BFVhmyU5k7sTz31pm5B5vVR9dWP7lxY2VnSyVPu6n47qAqehatF7au3//w+oOOTxdnZpZPn14+ubgwpblqopK6ZnpAzckTwnHsFjrwFXkkiZOhYhIOKPYfZVI85I0f8dYHx7rVRNTYbB/1yAE1ARtxlGE6l4hkNBZmPeX6Zv/WndUbd25tbG5X5F4ZBqFyeVY3+LIonGji/WSnc3Zu5m/eeP1kjqkMWgF78CrdzJtjQUQCQgoSKKkgaSbeDYc/DjtJx7pJybq4QJoiSaJvHETr7cX17b2V9bW7Dx7eX1/b7heSdwqyJNWnifdRtCgrs2oyT5SlGtRp6jVLks5k3nF++dTpmU53fnrm2HQ+1UGidZ4OmW+MpxaXLQ0iyLSZQzPO+sbvax07v3QgUcXovGeqNjeFuSmnCqICAPRLGKAJKNgtsLXHXlmube/cXXt0f+Xh9mBPQkXvAmJPQ393C17VOe+8UAWhClaavXft1uV7K6lTJ5ifm73w4rlzpxaOARJCV9UNBzjo8Gj1QKspR8Gi+oor90mePEb+KaMphu1wqX8L2lxfixbfedQBZ7GIIPjgxvZ/+qfffnTjLvLMq739g0t/9yevLU78f+y9aXMcV5IteNzvvRGRKzaCAHeCqyiRWkuqfXnV3a+77L2ZMZuPYza/bz6M2cwzm5nu6X49vVRJpYUStVEUV3EnSALEnktE3Os+HyIiMwGCkqqrSsWySjcZjIQSYEbEzXv9+HE/x7RZYgb5jJRha2ALpUKZotiBZbBDb6vqCw3kFcC/m97BOMYxcqKXCSAFIAdywAMMRFCX9wHh2HFpHMUSiHqGl9Lwm/dvvPPOJ1l/y1lNYvu3v3zjZ2+djQgRwBpItRyvGeSt9Me7goqZGknyBZCSIpDCZprAXPSPaSisVgScg3KinJABjze7F2/e+/Lm7YdrG8E5sVHfiw/BUJhM4mMHDpw9enhhujlluK4cCzkCE0AqHDyFnCRFEKhVF8Fxee1EpVN30aJGXCX1A9RWaDPgWQn909sKI3ChXC8MYdViFg5iIGZb6k/lBiIotVeleuKFQIVArLWlezUBqkEDqY+YGAoYgVFlDwghF/REOj483syv3nly6cbNR0/WOLam7lLuK3IWmUji4wf2nz12dGF6qk2UECKFVWWMiptggMmUEKqnRhUEGbxk4J5tfo/F8TTsHVmJXGjShNJKzRSIREGBkAOpYrMfvlpcvXTzq/vLj3shD2w8JznV06zopmNWhqoFNRN3cH7m4NzUwdnaRE0bRIkx1nACagYqK/2Fp8nAXKIY9ZIAIlhTfkcAa6EqQQu0OpywpF2ukLZXEMoaABUmBKSAFG0nKPsRjXob+gpRQiArYGET2HmlHCXM64v0g6515eHSxq3HK18uLuZkSIVUWcWqEGDUw3sLjZkb9WjP9PTRgwePHdw3V9MGEBf3twKTAkhhrwAtiiZWFUEZOCPhHwAAIABJREFUUObS7h4oxh2KD2pBpufQTAIYCuMl9EO2nNPVdb39aO3u3Turq6si4qw1JX4UawyTqggAY9gwGcnaLkw1k70ze+b2zs5MTk00momlovO8wEIliqsAEWMXUMNfW2fgnfvR132aB83SGLYkQ1SzUhQUQdH1YWNjc219fbnT/fjqjRTsg4QguRSLiAWsbLwggBSGrGVrCFyn/K2T+4/OTs1PTdaNiZkbTAlgAauQTFXEWUOsXoQAsuQrbRxWtkrlfqJDM42SNkcoCxkwZuwyNUZ94xjHOHbd7EMmXrHm+X//p3cuXHuw3O27JG5E9Hc/e/3HLx2erTkTuo6VFVk/Ny42JtLS93g76isP+WIH2Y76aIz6xvH7oT4IkIMylCvOZSkYJjYuy8CAs5TnqRrqWPfPFxb//d3rva1Voz0OWy+fWfjrX3zv4OyEI5iSHhrJdGjIvTwXl6wDhk0VKqSe4EEevJHnd9c2ri0+vnZv8c6jlZ5QfWLKNZNO2s22OnUyh2emX9h/8PS+mQMTUR3GEpsySVWFiAogIiBVQ84wMxGAoPCqqsrEVFGSVJAwCqNkfpd0IBByhkIZYkoAqKQMZVJbZv1F6s8lDBDSoJBAWtihV110WspklumuqHrxPs9VxTknZARGDWcqW3lY64fF1c5nl7+6eut+TxA3WzauBdWQbVn09k43D87tObZ/fmFuz4y1HHIKWTOKrSqDSamAfsV9f37EJrS06S4oUwbAygoSQijScUIf2ApY7WX3lx5fvXnr5qPVDSS9YEAcRQlTlOY+zVKEPGKqJ5Z8V/POdLt24uiBw/v2ztSb0yYij8hwIyFnyALMZEASSkDLDB4lOUm/fRWgAHZD1FdwdMWVWCqtgYpxc1TwDyKqAeSFgkommor0FOuZLK937z56svh4eb3Ty4JkXnpgrjdSL96nlHuHUDfcsCZmrUEOzc2ePHzw0NyeqYaJAFY41RhiSAqjAVGW0g4dBoCqhGALwB28AamxwqZwM+dKM7Pbk9RncasWjGaiW96vZvmDJ4+v37594/HaqtR7wWgIlhC5yBky4uG9JTgmDt6otJv1QwcOHjl0cO9UbcpIxBqRMaDK01MAjWAIyqrl/qSVUx7cH3G/qnZF3Y4ARTULGZiImWAABJU0pGkAxfUt1bXN/vLq6sPHq4urK082tjppqLUnOnnYSkMaVMlS5IyLIoT+yv2W1b0zM8cOHlyY3z83YdvG1IypMSWAAViVVb0XQ8qG+poXiYSFYyqkdIdFBC1qW4CUXjiIYMaCMWPUN45xjGP3PT5LUza2S+bGo+7/8Q+/vbu8ub7Vh4Sj+6f/88/eev3EzETCFsIhDT41zjE7qB2gPt15YhTHkYxWrMfD2+P4D4eoCkBKOqzLgwr4AlYlnwdjDbPJUwmk15fCf/vXLz7/4stmjUl783ua//Vvf3j29KEIperJ84z6tpNJKNgvAQI4ADkoB7YCFjd7N+8v37z/8O7jpdU89bE1kTGG1OcmhMlG/cD09AsH5o/Pz7aMaZFpgCIPkwX4XC1xEg3SOSUF02DKS0uajhQikBG27+ksalu/5uDPAgiIIFwAOogpjbwMYKGmzNWgClGIIAR4QLkEF0QACakE8cIgUmIQGafGQCDEnpETUpGOyKbI3Y2tj6/dvHb3Tjd4IWNd7FwNoCzNQz+ddu7c4X0vHj90eG66ARgggkaAKahIgFHwkRXhR89Vf5iqSjmAp1yoiRS5f1DNBBRRrkgr9rgPPMny20srtx4s3rm/uLG5JWrIxTZpgE0vTa21xCzBiwQJgTQwUS2K6rHbMzU5Oz3ZjuO65clGbbIexQQHcsyWqCCAmcgCNaNmCEp1BKHKbpfAERd4alRxR71o5nNlIiIlUoWoeNEesKrYEnQzv7Gx9WRlbWllZWVjo9vPfFCyERkbSi1VCqLqfVRwYoSa4WYST9aSZhJNN+uvnjnZiNBkRAVPW9iUazmHWRDIpa1dZS+u6jWIYYBN1VIMJQ1Q8aowzJaYBJSrrqVhLQ1fPV6/dOfOneUnW8HnllWEBY6YiViJESxgobGlfbOzB+b3HT24f6bF8cANCWhW3c8FrcflhqRM9CdDfdu7KyuRpNJ6tFAIrr6JPlC4QnkgU6QBvYCeDxc++7KbZWu9fLPX76Y+95KpqKLVmsjSfsgzaEDeb9fi08cOv3RiYbZp29a0jKkBTsUVBSMp6XYFKRkFByIdSTyK7Ymk9IgH4buw4xmjvnGMYxx/lpgPAfDdLIWp9WE/vrz09//8wf1Ha7V622f9hYPzv/rlK6eOtJ0qS68WqSGBOiK7Y0RHh3Xyqhw68p0x6hvH75H1VqoT22aqROG95kICcnlgIsNsHjzq/v2/XfzyzqPMS2d9uVXnX/zkjZ//4Oxkgw1goCXq0+36Is8T6hMMLDIVKkUtu5ARCSAPyoAA9AUPV7rXbj+6tvhgsbPZU+8hYqEGPuQhS00IM/XGqfn9Lx44cmJqajbiuhpbZJKmgr8QDXnweZCcLUWxK9LySh5FBfBwnpzC0K6oT3egvmGWSJDB3A4BKP5VJS0w3fByc4YnSMn9oaQmCWzYaTm9aQBWkTxgK2A9yIbXB0+2rj+8d3fl8Wra2RLfFy/QOIktKPRTK5ifmT19ZOHF+bmjE7Vm1SNnAQuh4EmDsxaFPCKRVo7boOdLo1hVoYEK9nTYJ0yi6hXkyCv6QK4Aa9GPB6AP7Um+3u09XFr56s7dmw8edrNQb0892eh6NXG9Fcj2U0/E7Kjje9bCGROzOIGhEANWNTamVa/PTExMtFrtVrvVqDXrtobSB6LgYJVgQJbARM+a7CvINC8QVSm+QkFwjFzQSbPNzfW19c31zbXNrd6TNNzr5N4mxMxEqioh+OBV1TArVFSD9wo4a+MoiiDU2Zqs12ZnZvbtnT0wu2d2stl2iKFcFHoKZqoCVEZRzLabitwrW4qLXlYmMGuB+7X4CKjXnIwJsKLcg3ZTSZU2svSji7fvLq/eX13rBqJ6EzbyUBPSCUqjkDFRbOzkROvIoQPHjxyab7pC+Iere+JUC/VXQ9XAXeXAV1DPji1jBOAMUZ/94+5BO/5GJeSrQLt6DTL0hmEqTnmtFJWAAHgggHJgNdPl1e7S8vKDx8uPn6xubKWZbXS9gDROrLEIvh/yrkE+00jOHT967tixucjFhES04QZ3oPjXCxOLYrXZItswWkjU0lBJwI3H+saobxzjGMfuO7xXTbt5qhyzSTZ75h//v4/fvXA99VEgS4yXzx7/5U+OHJpNIkOJduG7liOmaPt0zmjFn3ayJzSW1BrHfziKFJGoABEDdo7VSyqcqdFMpB8MKNna4rff+/JffntB2LWajc7myqsvn/rVL783Oxk5wBExwkDabtAb9LyhviJhKv5mVFhL13kRgIitzRVeAYYQ+h6PV9M7y+t3lx/fevxwsbPWY5XEUuICVLIs8ki8Tqjb35x64cCRU4f3Tk5wYDZctmpZqGN2qiqZ+txQsKRlplWwTBypjaVAfVVewIP0cKfI5wC36nZJGAYMiKutQMvcFqIIjEzEh6ACUmPBVsgKjMDkiqCUq6YiaR56ebi32v3s1sOHaxsb3a2MvGcJrNYZ5yhkPWS+wbxvYvLE/v0nDh48MNGeVNQBJ6QKEjUV1oUGdq6gEoVIwYGKWSG456ofvZTjKcY/MVRR0YKGKtJrCCMAXR80TxsxQQXMwpyLpKI57FYavvzqzt1Hqw9XtjqBleoeLgva0zw1uVqo9wh5EtnYcdbvpv1uHFljrLFGJHjvgwgpnCIJ5MDETARrbRzFSa2WxLFz7un1rKAAzXze72VpluY+DxIUFEJI04yZrLVsiMBKUKVMuRuMEhedxpYKDwUlVfjMqDKLYUTGNurJRLu1d6L14tGDNWPqcVxziFCStqSK4B2zY7JQruYHVW0gowSrsGUHeUFiBajAuWJsQSXkRWGDicn0fLaZh9zajuhXqyufXL1x/e7DYJJeDuPqtVpLUk27eeKi2QYn2eOF+T3HTyzsn59rGnXVpqWEqOLNGSCoD+JzX0/iSuWHeHhsFoTaKK1V/fmPZzT6jNZdpQqroxzr0HIfIKNqihsLCiK5INdiFJBgbdEirIBX9INudsN6X96+cLmjtN7tbPQ63gSKyEuWpp12LUG/k6ge3zv/+qnTZ+ZnY8MUqO2USUEqUA9RAikRCFTSf1a5eMLlnXPjgZIx6hvHOMbxDNSXap+B9Y2tejLBJnnwKP+nX39+4bMbqal7Nmzw8rmFv/vpkYN7Es47dauO7HbFfNpWFSyOM6oMjAdDQuMYx38I9UFDmfKKGUF9CJQFynN4DyOoPVpP3/3g6ocXrna6fRFPpCePH/qbn716+tjePMstqB4ZRjDVqFgpxwECnqd+vp2oT1mFRFnV50HB1kUVHQCAfIAAarDlcWdl6/L9xeuPHyx2Njc17yEIKLLOkqFckXrr1YHa9WR2z9S+uZl987N7mkmD2BlmohhUZ7KAg9rCGtoHFYExbKMB0qjSVxr0hI5+HwDIgwvUx4MMvMSJpYopDy5BoapBkBORwIiSB3ulPrQvkgfZ9OFJt7+0sf5wafnR8vLKxlYPUWZqa1tda83kZDOynPW3JO3XLPY060fn9p46ePDIzMyUYQfAi6ahQS4yVdeq9+CSnCoKUgXqE+JQAVr33HF9QjtRHzSIiqihUOj/MMEaBljEBG8MF6oXoiEL3oPExhmcEG3keLiOtS19uNy9eOXGl7duZC7MzM1MttvB99O0q/DGGmINwasBWaNceo4r2Aq73KgULdYgkHU2chER9fq93UAEkbMh+Nx770sjcSJiZmNMIUxSmCWICFQtcSNpSfAh5BQ8i1iGY4mAesxTreb87J59s1PtZiN2LnG25hBTYZmorKUgJEqNDyWAxed5DglEsGzFuGBixSjq81Ap+1OsKZjuFKzWBIUX7fZDRljudK/cv/Pp7Zv31lYza7leFxifa4y4jijKuR3VTh068tKJucN7UMiTaGElEoRULKFujEJFAkmIDTOxAkGQpQHGGkPGGDPQ3i0+ZdiG+spT9rtFfRg05QYPZmYzYg+lRsV3O0YBZmMMjFPDSiVzHir/TA+EoFkumRAavCV6+1H66eUvv3p4rwdRSzlpv9tzxsYgm4sLurc9de7U6RcW9s02TEKwRIaIodCMVA1gCaRMQ3Rc5B4gM+b6xqhvHOMYx+67uXiIIBhF1sucjdPcLT7x/+0ff3v53loXbivtT7STn//g3I9fn9/ftjVSi1BZZO3QZyOMTiVgmF2Pt+Bx/H6oT0dQH6FM6CSn0Nc8V9vx5vyn1/77v15Y30gbsYNke6bbf/WL1187d8wCIc8sqB4xVz2HIwTf87VABy1SBcZigFVIhAp5eGL1GlIvYOussayVF4sCGSFlrOZy8/HqpTu376w82fB+w/uuhmCMRpbYqMAJxUqS5ZrnjnmmPXF4fu7I/NxMq1Y3qIESQzVLNWZLZCpKhEc7OSthRto1WWRVrpiAkVy1zMqGVOBAGxBBNRPNRDKRvsd6P6z30/tLSzfu3e3moQ8E5kxD5oOAAhshjqxNCNxPTb8/FUfH9s6e3L//6Nz0TCNuGIWXkHtnKHYOoggkqZe8byNHsQVV294I1yfgQM8p6lMdCiRXW64GH0KWuVoMwwp4lV6aEpEjZwMbgCyIpbB8UKYATj2ZpJ6DMsGTLblxq3vp2oNb9+9tpluz+2YPHTqQ1NzyyuPHyw/BiBtxP89ySK7Bq+YQr+qDKmyjNike3gfVwu5bVRWgXbk+UfWQQtSLqIB7ZIhVNM9zQ0RUMM/EzAZwPqOt1ZozrXptqt2enZ7cOz051WpM1qLJpmGFAxyBFVwuqMG9USBoEAkBGlRUJThrnbWVDAtUJQiCqwFwhYZvKFBf5RFjjBibMmVAX7Ujup7JZje7eGXx82tXVnqbpl1z7VovZL20l7go8n4ySk7M7jt75NiJuYm2URJYQwVGNyh0z4peaFV4R8QFeQsFID7Lc0T19qCoUtzLwlfdWrt91Ld8/EzRHxf17WbEoao+eDaGmKR68FS0Q4uMMJSqIiIqUBtH5dwnGaLhVGcAMiAFcqIt1durmxcuX7566w7VGv1MQDZ2dcmku9WLjJtuJa++dGRPK9o3Mz0bmQmiCOqCdxqGNqtMShAqhJiGHQXjGKO+cYxjHDs3+az4rOc9ZzjrdF1clyj69Yc3//Hdy4vrIZgoy9OJhH/x1rmfvDo/3YhiQ449kQ7Nfkc32bLeNiLaOdbvHMfvh/oKoXMoE3Fl/0a5UkYQxlovnL/41W8/vLi81g25Iu3OzzR/8ZO33njlRCNRCbBEhoOBWFLaOcxX9B/z8/N5lJHWyFKZXAVQ8YIgXIiaYFj3LwdsLFThlYQQGCmwmuudlc7lxQdXHz5Y6ne7hjNGFgKlGgeTGGeYSUSDsKiFWkVEpllPJlsTs1NT05OTE+24laBl0CK1VAXIEBUCTZaBSvCyxIEEIfiKnhCFSpnhemjRJBZ08B8E6OW0vOkfPdlYfPRoZXWtl/W9aiBWZk/oZWkx0aVMSmSNiZxxLEizlnULe2fPHTlyfG5q0iAR1BgmoKCMyKlCQ5YGL5FNyBpiAgQiCB5MMKbk+qq5vlBOqe30OvvTrgetBEdo+LV69qrB55nP2TkbWwWCkAaK2BQ/xqbItD0QhNgL9zyrMZu9cPHq6tvvf3br9mJAcE5azdprr579wfdfmp6kXNH3UMbGVtjqdde3Njc7W+udznpna6vT7eeiJipcG5iIDauI9yGEwIYrgRKtnB9IoKrKhpmZiVFwekFUhIjiyNWSWrvdbrda7WarniQTiT06Y62WIq+G1BGiQtkfSiqkwbKSiOYZALY2eDAZLiUwn7qFIUArnpmhYA8DJlP2TkvZMwgom8DcJ+oDPehSP7+1tH7t/vLFaw9gI7AqgsIzeWeoZnVPu/nq6ZOnD8w3VWOgQbCqIcBZqpwsyEJJoSri88gWn1wtGhVRuKTDqrIoQ0WpYEGJylG2gUfB84L6jDFE5TMFYJihor0es4ExYC73AlWowphBo3chAhNCUA0uspnPg2Hlmgc2QF3Ai5y/du/K7cXFpTWxCVzc7eVeUYttv7O0f+/E6QMHTu3fd7idzDrTJkTF01APAIaU4aECJrAbehJvwzJjfYEx6hvHOMaoD7kAKMr5OZCBVDjuk/m3T26///nd6/eW+/1gFROxefPMiV/++NjMZCOxZAof6BBUfHGeQ0YolDHqG8cfZoGKagh5LiFlR8aaLPO5V+vqAbEn2kzDhYv33/7g4p2HS8rkLB+Ybf3wldOvnVuYmoh9LpYoMpCQEySyTOXwR6WbAK78JJ+bK9ahFhINZmqGrHqpXqg0aJ3Sghs0gFGyClZSIBOkhD5jQ/Gol99aWbvxaPHB0pPQDzFs1s98CGBmY4No7n1QJWOVScDKXGSXBhr5rKl5O4mazWaj0Wg2Go1Go16rWTYMShKXxLAGECi0rLZDPUDgLKPlVe+DkKGN7mbqu1ne29paX9/Y7HTTzIv3lMPmNhKwYTJkDINExAdALIgJJEKKyFlrWfJstl17+cTRuamJfZPtCYdI1AkcyFapJUiVNXDRFlkMgRZKI4ohfhrK+VChH1OouRAIuwjX/CmrACX3q0PjtWrWqySHBjxWqe1pvLA1w2QdCIE0Cz4NMCZ+tLr1mw+ufnDh0tqWT5Ima67p8ounFl575eUTxw5Otq3jbZqttA2CIge6xTChwgf1uc9D7vMg4vPc70B9ZT8wwTkXuzhyUWQNU/kQErvt9w8c7M2IyxxXV1oN5RatrmoG7SUKUjv8uOCp972zjCReg2WGqqogDyDDNhK2mWDNa2qoJ+H2Zu+DL65dv3t/NVdfb7s4qQlxr1v3+YGJ5kuHD5zaN7Mw17RVaQbIlIJCAWORcGVGUdZBtTJ3LJ5StVArpSK3/Q3ryNjECL07QH34rjs8d0MJIwtsh3br8IlWHCcGPaFKCER5tQlbgc1hCnXiDFiB3nkUvrz34Mbiw0cbmzkMRaawZnB5f4LNuSMH3zp1bGHC1I2JoXk/NQSTWKj2Q6aGrEaOubz/FeorvjKP7RzGqG8c4/gLT6oVXoByxNwDKShXNhklWzBvf3b73967tLTcRSDtZdON5umj+//6FydnZlrOMnyIDTlD4nNSNWbgs1Wqr49R3zh+/ywk7XeJ1MWUh74PmbExc9JJ2cP0Uvz6nWv//s7FTNXE1iNrT8Q/fv3Mj14/MdW0VhGCqqozIHiGGqbCU0SHXZ3PGerTHe4Nla78UJgcUnkMSMnjBA8hqAVbkFNjhFkAJSUERsboAVuKTUEvx+rG1sOHj5+srCyvrG72+h6kxqoxOShT9cweFIBAHEBQsZJF6h0TEYmoSCjsv1WVFNYa4sqCWgSq0Dz4NHiKorazrTyQdVGU2H62mfkOGy/IpZB6cAlzkgekQWAMiWieU/CWEFlTMxwRHBATtxu1A3N7Dx2cn59uNi0S0botO/Q0KAW1zDToJyVVKlXmFVTct5F9SHmQkJYvZyo186u7/jwth4Kq01H5zmqJcDVYWbm9l+YbChNKv0X4QoSDjap2Mrn2YOU3735y4/Yjr3GuNsvyqQRnDtYXDuw5vrCwb26mVTNWwYWU6uC+jKj5e4bnsglZK6mZov/YkNnlhJGQ+dSyMcYYYi6aAFUBtWRHLqq8NA/NSndCoiE6VwwVooERUGp05OGVSFAHs6PVe+eREy/30iMqqTjmSGBToc3Me2u9huVO798+u/75jZu5MbWJidy6zSzN07ypdKQ9cW7fvpf2zx+ZjCYtTDGAy6qciQkZFWepjVErB8t00OWsA3HObZ/wgdDRbqivkkv6DlHf7wT8RpboLj9fDmwWy1BUqbJa9UyeiqZ9ZVID2OLC+kAw6BJWFPc29MbDh7cXFx+tdzd6RWFarM9sls7W7NkTC+dOHDnQtjVjGJpnaWKNZQawtr46MzFDI8zeAM6Mub4x6hvHOMZZNSSUBltEAUjBmRJyMn1NnvTx2dX7H164cuvGwywNCdciyydPzv30p+eOHZ6qWRYPTUM9BqlaJiLeqfIynusbx++5QkVFvKAPEmXKSHNxQaLHS/7f37n2xRe3en3pZ12YfP7A5JtvnHnr5YXZljElCUAigSHOEPMw2dIh8CMC0TYP6ucL9Q2b+ahslZSRFwpU4At7YgM2IAc2SiSGAmtAyQoWvW0GnpBBe4AHUpGNXrq0un7v0aMHj5dWt7o9Hzw4kAngACrk0HMED2FjmJi5VL1nNgr13quIFn5iRQedaESIiXwGCUkILs9NEFHycaxJDewyCanPgwSCGIhlUBzbWhLFzlAIFPLYcKsW752ePDS3d6LVmGrWGw5R6cYMC61BDFQAIalmIMvMv+g0sBUSUFAgzQkyApkIWriOV0wRE0A60vn7nKG+fATQVNe4vfFvVOZRAokY40ThBZ5MYJOprnXyT68s/stvPni82uWo1ekHZTs1Nb2wJ/rhqfbchNszPT3RasWRYVXSABLLRrcDp4pIVtoOUyqsQrtlk+U9H54KA5O/AbweyTeViqJD0XdN2/nZXcIARnVEtr9CfdvfxRD1kQd6IHilTEk4UkSpal+xtNl5+/PrV27e1iiGjVY7m900jRy1E3N4bu6lowun9+0/EGtNUQugjAZWI8oi1meluCXFiAYolLcn1uUlbrtglKhviFt12+3D84v6iqXgn/ohGkHmOrT4U4A8lU+nHBj2Q+tQKNTAR0gJPcKa6oOVJ4urvV+//xVF7TSkW50NZ9Bqxax51tn4wStnz546vj/hGpHmeY25xoZUixHS7bUHHaO+MeobxzjGMSKqUIoaZuBMKQhorZcZ1wo2uvD57V//5rM7d5eJkiiKt7orBw/v/S9/9/2Fg7Mxc8OQT0PNcmRQ2N4SDQcDtKj4jTfbcfxHI4QAgiBkmgdipWi9G27dX33v/StXry2G3DbrTZGMTe+vfvnqD988VXfQXPMsOENJZBgCDVTM+A/zJ5KKjiYQP1+oT0ed2gcpdmmZRSqVlViVU3mgNB0gwKCYnqIS7SnTIM8MEGiX/ZZJxbCFIxgBKaFor8oFm718ZWNjeWXtyZO1ldX1zW6vbxDiJAAhBO997n3ucxGJ4zhJkizLcu9BMMYSE4JSnmmWI8Q+c52OMGJRuJgmJ2NQJ47FGWGCo9hwYsRYCq3E7pme3DszPdFqNhpxK4kaTm3Bw2o1jQVRiKpn8VaFCDAGZBQmVIQIgwxglK3CKJMAKNhODVQqInKpL0wMpWLMq0qtaYj6nqPlINDwVFbN2/AeDf0cVI1klPXVOvGkMIhrW7neetg5//HV8599mQXe7OUuaTRaE6K6f37vm2f2Hap3JqLQbDYa9SSOnLUEqJKSNcV4nRTgprhJRTssQAN2tVyxysbs0uFZcK6VQWP5M8WRsBvqKx5K+b9KF/UhrhXaCXO51PJ4djq7A1XCK6UKZOCMnFfXhS7n4f7S5jsffdpJs43NTj/ParVaq9U0rA34H7104ujszHx7wgFGVPohYhPZoZFMMcweKixutj2pp3Jp1W005PZmmAFtO6Av6TtGfQPWeDfQ/C1R3wCQD37TgJIuiGIFnMIq3DbUJ5qnOURi0iQKBA/01C5leO/Cg2t3bwZj+uofri2BZWZm2ve2jh+Yf/Xk8dN7JqaNsYIYiBhPGwSPUd8Y9Y1jHOOoNuNQnc5ESqoUhDxB0ixjE4HjnvAXVxff/uCLa18tZoFzgjUcW/rpD773o9cPTbbiuqGQas3CGqJhKbo6u8aobxy/T1EihDxIYIYxXnVp03/65Z0PPr70YHFdg3HGSNqb39P+H3715rkXD1qoKZ2/wNCqd1NEAhGYB+k9CZWjfQw8R5pvOgR0g06pkSRRFTtml5S2ydUUAAAgAElEQVQ1sMiAvFSwcDkzRMoMKkX/iytXyVkyIxnEw4sKkTFkSS2DDLhsHFUSgQi8oqO6lmsqoZ+maZr2+/1e2k/TvNfvbnY6vbTX76dBtZSGCYFVY+PEx2tP8vt3V5gTF7m5ualXXj0x1TaNOho1TqKoHtXrLrKEmFC36syAGYCAggiRMsNrCCELkgNw1kVklQoZB6AcxuMSzwIRrAE7ZSsgKZkXNfBWw1NWM6XKu1begyN0Ej1fRQDdzuWhrKVtR0slw6XC6hFSTXMRB1fvCX91b/Od81e+uHa7H9QHcS4CSbtZf/nlM/v37uH+0sEJajqt12v1RhInEQqxFBIyJgC+0LlB4WxBDOtAZrRGUU2i2m/HkRINkdiwz3YAkwZO86gczTGiL0JDkFsWREil8gnCcA4Q29DTyCynqubS9yBv4ox40+vNrfSTy7eu3b7bzTNmyxDNUqfZ/j0zr710+o1jB/eqOhVVyUIQEAyzcVr4TxRViYJbluqfMLrrkN7wzB2+34IK5e3QauTWbPfrQzmq6v6oS+7r8PPT67OaK975K6jssi1xe3VNOaFoPy46O62ABEMbdhRNBqqm2IQ0RRzgUsVKru98euOzr26u5xlqEQyrandzfcLyGy+c/NG5M3stJ0S+l07U4nLQczzXN0Z94xjHOLZv0AEhFCP0gSkQCYEUBsFA8jzzIRhXy4y9/mDz389fevfCJZhmt5fXIttMzOmjB372/RcOzU9MxBQxmeF8zKjQ+7jGNo7fA/Wp5iHk4ADcW07fPv/VR59e6mSBrUPw8N3jR+b+6idvnDm2tx3DpzmBktgSIKIkSkxMgEo5I1eCPZIKTT1fqA8YmCFXRoL0jESsmvqRSgieSmUJIUhpsi5QhSgJDGCIiTiHZOrZWEN2kFqLQiAlkUBkiJkqGwlFVia0pRRi8U2FUsEQKhRgJlUEQQB80K0NvfTFvfff/TRNyVm7sDD/N3/z6uw0akajyqXagFhAChIRCarKTMYWTnOilQng4HpFJUCUinGzws5AeaSxk8EE5oHwYXGHuOpx/bpcVkdvND9Pg32jydhwbG10ChGjY2JKJKq5gj271c38k88X3/voy7uP1gWOyDgGJD+4b+LFU4faDVdj3TOZNCLEsW0kcZxEJrKwxcOX4kaGEvVRgf1KQhW7YJlnZY1MO+EEPQUjhi2RI6iPKq4Po1Ygo2uCoNDA2+ogVKyKUlxad8AuVc4VwXA36L1OdunB8pV7S7eXlle6XRdF9cjakE86eu3k0R+cOz3JGom2s4wkwFp1Vpk8kKn08rwR18uVrDAymG9TNaq0HRmBttkcack8a6kkZHRbZ6oOxiO+Y9SnvyPqo7IqobuivrLmpjrEfkVZh6FaUpxmtE9ZBGYoAaqSARBimGQzQC1liodBf/3xlUs373R8ECaf5cizicSeODh/7vixhf0ze4xpqMYVuTeK+owx4yP1WWHHt2Ac4/hLyaspBwRwQDScHBcD0Yicg/T7HZvUF/a3/I/OaT3+6PO7061Zn/bXO6uffHHlyZNHP/veq6cW5uen48TRjuOcdusWId31bXxDKeqZZckxovzDH/2733P9xmejz6gi7vIjtOvrd2TnCvjgRdDpy+eXH/72oxu3FtcyalBk2ASOui+ePPnXPz67MDcRBZW+jw0bY8RLUOXRaX4iaFF9oJHxqOf1AdBwZdOO5F63JbxlakyMEZFKlH4Pyih9zYrvFJ5kVq3TBFmViDEV/tYKFpQ6KAE+gKTgLcBNMWVGyyAmgQaFV/WKqJCbZzYgJfWMFNhUJRcE3a3eus9McMb7ZmTBWuCvwBADtmqp8HG2Wnl5qZIY5YLOMkohEwJZrswqCGJUK7GaAo5AqbQsBMCkBoHVU9nEYFUjISO7wbvBeNz2/eqP//HabeeiZ3+4ZJetU6v3uw0YA33iDbi+8NJq79LlB+c/vnpn8YmxzVajlfe6wvnZFw6dPTFfw5bT9clmVKsr16cRJ5LEwZpqgJSJmMpmTnZDyFUsG79tbQ4bO3iXIgZEVEoEQIPtQAGYp16vBTNtqkIhUaUFooBS+VcdRSgCVtjBEFmpa1r6m5OWCHC4tygRGH2vt5d7H9+4/fmdB4/7eUhqjak5n/fZyIsLB39y9oUjdThIInmdDMBwkVqjqiGIAJF1UeyKm0IKgx3joEK7bJy6/bAbfJN0txftviK+kyPvm/d5bMOh1VDlUxc98rhoSPnp8OXMShBGAKnCGyo+9UVZzlBEDIYG2WxY6gYixPud+5/efOGFI8fOX/zy4cpGRuJt3ve9z27cvrO89MrZF946vnDUGqfl06/I8hJtFwMo22oo4wxijPrGMY6/rBjNK2nosw4YECiKaoRUQdAjextz//m1PRMzv33/8sMnT5LIxrZ+9+HS//lP/3rmxMLf/PzcgbmpxJIhMkKl6DaJDnJRVNM0urNiO2LdjEpofXsu8A3wZLxv/8FO/PJMVvoGTDdIXJR2fOPpX6ijqeugownDXrWBvEM5vVP91qBIYe4tbb738Veffv7V6ron14ys9Xk/tvrjH7zykzdPNp2Hl8Qaw2b4j6gSszEsIsF7kLIxFXf2fJcLaJcV/g1vlUdAYjnAVrBERYrLWmbDIhq4mPTj7Vl7QNEBKzT838WvM4BBlbFpOQjHKhYgwwqj1U0VlUwl93noZ5oaVSViG0cMIQ1G1agY9UQFGWkZAWBRn+UZGbJsmCyDiUBkGFABF11ZXCX5HiSAYbZVvqYlI7xjHm/AGD2tM6FPrYHRWbQ/ekI9VHHkZ2XUui2rrpJqrpo9h/KQ9PSvzsEbnq8/3vrww8tffHGtn0p7ckqD9LaW5qdaL548dXhvMzH9dqztpJ7YACMmIo4cDIuqLyRzCnGegVboDsjBI3/XoacgaFe8IBAPJh64Zw8/hbLraq642YLqK0gbCJShWra4luiOUGiyMoMLlk+gQoWMEVi1cGOEFiQie4NMaS2Xqw86n165cuvRclekFsdCAdnWvnbjh6+8+MrBdkPhVJuMmCBZSi4uRUGJWA1t1/2hp45R2r6m9JvQEz37M/3UC+m73430W8kb6TM6QLGL6s/w+6HqsiepOPti/2IuCX0oRL0lW7c2hskBInppLj6+95WPrz45f/HinSdP6hNN25xc6W6+/dkXi4uP/9cfvgXrYlIjyqRAXlhxcmHLIiPlSBonEMObMe7wHMc4/hJCKrMdUmIZtEuVqYUMYFco9NyBvurnV5d+896nX919kAYKbL2QqEw2m99/7ZUfvTY/PxGx54SQGGXyQmmqGcCWagQrnklgt5V5FeSBDORBBFgls+2E021/pqdr5ONN+w+3HrQkXaqURmlbaX27GB9ViWnZN7mjXk0AiXAQEoUvl1OR/AclZcuGwAgQr2CiiISRCQJBGV5kKw/nLz387flb9xefwPvEuZD3I5IDsxO//PlLr5w9YgEHGCqbBsteKn5GdWA70vn6rOu5hOTfFi7qzgRrO3ZXflbdR7fBddVCwf/prK9IbKtEoeikEpHc52merXd6i5v48Mrjt89fAUdO0rMLs//1l9+bmzK1mIzjysCabdEfVtgDAgDvtIn7egbk6fWGsslPRlJLo1+XZX+nK6G8qYOPGG2TOd6xOIsRvsKwj1C4hAdkIBBbwARlVSIoMyDipafASp58cLPzL7+9dufWrcQiohB6m42Ijh7Y+/ILC/UYzcQ2a6ZRN40kSmJro4RdHShnsg0RgZieYj13GEZ+F8ucsMub0KfuKIsyK1gUpGp8RtpDUFUGG9WmOFUnio6iH+lSphcedj64eHlteandrGuedtaezE+3X3/x9A/OnoiAGIiACGogXLaJ2m/YOnYuMN3Vt/AZF8vfWPz5k+8x9A0/oN8WG+54iFX9Ysdz5eouKqCkHr4qFFMxXxqAHPCqD7r68ZWrFy5dfry15VotGyfU0z1o/i+/+uGxSc7Ws5lJBqV9ZGDjtG40MnklZMCaOwXUPUcOnX+yGHN94xjHX0jwIEemUfEx2lZwJMACFghAr+NfPr5n4eDf/PPbF37z/mebuXf1djfNV7r+v7/z4bUbe37x/bMvH5+M66bT844ljkyNo2IPDz6ID4YLj6WRFjaiSoHv67usdm/PG2/Z31E2sH0+ZjB3MnwFVfrtwxY6IiUGCVihAOU+GJjIxgDUS55mzGxiGxQCCMEzUtVOKjduL7774RcXry/3fbNeb7Lt93vrUzXz+ksnf/b9Uwfn2qZo7aIS+JdzYPStcpY/yzVDv+sLd7sdX0sYjE5a0bfof6LtXxmwKk7EKlde34WgqBoVp2xBDA4lMSdVdyaemTJ+fTfus7sizbe+b/RdP0EdMRChr4PyugPSEohJWVU1BC+hn0mjUQ+i/QzGsKL2aGX91x9f+5ePHqUStWptJ33KN2batVNH5o4f3FOPfC2iRmLrCSeRcy4yNmJ2piytFS4mtPt9oW+3gP7Ay5y+DUTh3SoAAhVkNdQVVgNyho/0fpqfv7n0zhc3ez6oIlt9MhnzuRNHXj199MSB+TbgIA5qq3Zp3a1xlb55DdFTn4xnXgv9ue4xoz/wOy0Jevr4/tpbQwpXdbSrQTCAgByoQ9hfN7WXX5iabF+4cuPW0pOsm9bj9vJm+N/+4YO/fvPs9042Oiwh7dWSWsGFk2g5DErbmlTGMUZ94xjHOHbFiJhsWA9Edf0vP3/92OEjv/nw0uWb92IYJrCxjx4v/z//769vLBz84Rsnj+5rWRupKucZEKBqjdqIiDTPMxgGGylhngWslOlaIAiNngU0osZAO6fExnv2HwHe7XIAD7q6pHwISopCKkSp4IOobNARosEjU1CwZfMdQQHDUEHIArOSIddgJU3znpBVE+Wiucjik/zDz+58/NmXj5c3okYratrO5uOY5fTx/W+9/MLpY3MTidEAYwv5kqpx7One4XH8iZaQamnFDf0amY+/7BiCCX1W5q2AkIqRUohCmBFDRCk4Fls3mfSFDEduqy8376x/9Mm1izcedDve2Ljw6ts7M3nswOyRfVOTTRuxr8WmUY9riYtjZ50zRV/0n7mnaunkyFrJpFCiFoBTUq++70PkelZvd/rvXL/16fXbaUoWTAjtRu3FhUNvnjl2qF2PKrv0IY2tlWTqOP6kYUY+FEYr4VCiulIGnTY4t7C/Xmu0rt28eff+xsZaoz2zuPHk7z99Z41eeO3EwalkyqskSiYvxgtJGWpKJajxaTFGfeMYxzienagUIzReDJkJhzdemJmb++nHF+98+sXVxaWVtNMH82Ym73108eNPvnjlpTN//dMXju1pJRQzw6dpCH1bc8YZG6mgaPzjQsFsMOFOGFHaUhqZi9hWhJbtqcp47/5D4XoFipEoejoDBQCthDUEgEAKHVhULT5MIOZSSG8w9jIyzBkCCDDOiIbce2WBNepir9T3/t7S1sef3br4xa3ltcyYVrO1P83Xw9bK/j2NMyePvnLm+ML+diuGgxrAAjSQS0c11DZeDs9RPj6QzNfx2Ei1gzJIthENxdTrUKCTtil/mACI12A0KiaviQ0RK0JQrypKdr2Tf37lybsfXL15dzWAJ1utLNsymu+dmnjxxKGjB2YdUvXdVrtdj22tVkA+y4aZDIhUSvWU0a9/RndUSv601GxlqFOQsAb4fvCEEOv9Tu9fPrl04d4dJdNyDfZhenryzPEjLx0/vC+BVVUNlgyPkM7j9fq8POHqZKpMOJSq2YPMq4KaEZ+dn2jXzraNu3T7dpe61DZ30vW1Tz9cR++nJ07vZydSARtTiUKhGh8fHxdj1DeOcYzjmXlc2nfWsUE/VWPo8ASm3zx8eH7q3fOX7iw+Xt/o5LmSreVEH1+7e/Wr+2+dPP7G6WMLRxr1Rmw4ySXzIZeQG8tEhcKgloMTStitOe1Z+p5jCc8/2hnLo7OU2+fFCpVHAIJhC6AtTbRLqC6AEhOUoXYoNlJoRgJgCCEoB+uUKFPt5OHR6tanF699/PGV1Q0fxZMB8cZ6L46zZiMcOjLz1utnz5482K5zSL1PETk2LNU7wVC/UgEyNF4Uf8odongUlbiPjgHfbp8xGtEVHGpxDuwqdki1iqLoUjRMhogUFASZV4rqT9Y673x068LF+0uryGkq95v5yuLemdrhA/OH9s/t39NuJuTIRabVbCRJZOPIuciwMaX6q4JI/2zNdQZKnqXhiQUZIfKMAOp704jE6p1O+u71ex/fvbOap7OTe9LFJ0fn5l4+feyFYwdmLIwiInJkLNSUG1852K7jifHnAO9tmxgftvAG5L6V1GpAX1VBCxO2ceb07OzE3194f3FrvTk307H27z+5mHrzP58+aYSjwe8yUFJRsJIKaIx4xqhvHOMYx7NOWRvHyD18GlsHw90MCejl460XT37//QsP3nn/i7VOj0y8ttlZ29zqsfu3D6/cuPn4hdPHzpzZf/hQXKtZZhc0LfosuLRUEiokP0eb+auoiq8k1YQ3xnn9d5vFD6HV6MFbPq9CS0UZgSCgwsxZlZSkAPV2ZD4fZFUNlEkYQdDJ5ObiysUvb128fG11vce2FkDrm50kaR44MB1Zfe3cwe+/cWy6ZRJWVq1FxmrI+h0lJLEbVgd0YNEwrgQ8B0tmjPW+7vbQiPwonlZK2tbWoJWiaTmWVAlasMnJ3Lm79f6Fy+c/u76yRa6+lxxHpPv3TB/ZP7FwcP/0RMNSQOg1mvXJdt2yWmucM8YYJTOsqA0Md/4sQU6pjlNIBBGItKwqqSAnvbHe+afPLl1Ze+KdYyDb2nrx0L7XTxw7vXCg7QotEbWAgTIEKDRsy2lTHW8lzxcA3LalGChUHKjf92SjZkT1KZe0Dq5hg29dv9ftp2xyit69+NVE3vzbF/bXicojjEJ5cOjYt32M+sYxjnF8fUiAIViWkMNzPbLC1MtgGD9+bf9Lp/e/c/76b89/Lnlvz9SEcfVeVy6vplfe++ztqzdOHJ974eSB44fbM62oZgkQRmAFq5AMvV2VKp+/4VZPA+XB7Q4BRGME+Ic/X3fVFtenNfQIxJUUIZXi6QEUyoYrVhT2b6qAgZIQOmkqwsbZ1S1//c7K1a8e3H7wZGm508+SoAlyiSKuJ9ps0ukT0z9449iR+WasylCVABEmYoNaEpHqNn3KQu4NpT73OJ6PhHycNu/y+dKBY8kQt1QWCDRSYCn2N1gDo1DlEIBcxQt6OW915ead9ffOX7p8437mjUsSoFeLw6HDUy+f3DNRp0ZiI+sTQ/UkaTWSJLKGYS0bY7S0Tyunp/nPeasq6k0KVRRGIoxAUKgh37L30/4/X7l+/t6tLI6NS6bUHpuc/tX3XtnXSuoWDBDBEVQkz/vOuWLJEpX7yPhseX6QPW2HfgTAWg1egkYKy+Uk5qTDz06emT0y93+/+9FXD9Yazfmtjf7bn19tm9pPTk03AKveqBowjZncMeobxzjG8U3BWo7dCakWlVUDrTkEQSaYqtOv/tOJ77124sLF2x9/fuX+0mpKNd+KDMUrPn//0vUvrl87cWj+xZOHXz41O9WKa+y4JPAKD4nCILgST6sm64dwpPpfI6f+s11lx7v6f+yA3SV5R6lsoKMEBQjMSlwBdmVCqdVppBy9ZAWjcHBUBECiaLMfbt559Onn1y9fvb+yngsSpZhgicWSn2gmL54+8MYrC4fmW4mBgyJ4CSGyxlnO8yztpS6KrLUoZNVH6b7xfP6fHujp6KIZ/f6YABwCP92RcmplmFX6ZZQGFKWvNIO0tB4DbYqu9eTG7aV/+MfzK6s5c7PRjoPvEfcXDrTPHNvbclkzsjWL2KHdaky0GpFhVbHGEHMFLmmnKu+fdXEBwmBSkJQLTwyeiH//zqMvV5fCZFOFuisbr+4/+j/+4M3DTSSA0xJbE9QQyMVaWjwO22xp3Dvwpz6LdFAqGTLhlZuQCBHZ2Fiwqua5gLjlEMifiqb+6uyrtn/5+v31Zn3KG/d/vffe/8/emzZJciRZYk9VzfyIM6/Kyqz7wlU4GtMz09MjMzs7uyO7FFKWX/iNv4I/hj+BnyhCCkUosiRX5tzu6W6gLzSAwlGoA3VfmZV3HO5upsoPHpEZmVXAoHu6F0DBFSmFDA+PyAhzczN9erx37sJ/OOZdF5arMakYW3NxG9TXWGONfdkqTFCZhobFwQwIBAjBQCmLMkfD8T7+5i/Pvv7q6rW7G3//8/fvbe5Go6jG0N0CH19/cOP63V/8fO61S2e/98rpkyutVsLOGMYxVs6RGEdVoomMl8ZQFoU457yAGBpVFQDXzxODpVm7f28O6bNQmmzfm7eJ5JipRmFiElNQBDGMa1bPfUklMWKFVNOXhaC7Q/3wk9vvffzZ/YdPR4U513VZp6wgJIS4fGzuj7/30luvL68sSMqRUDiEBOLEkyQAYJq4BC6ZlvlOIV/dXyiQBvR9E6YQUS2u7pyLRpNbdQbxTbU2vqOXivbVTegwWrap1DqMiQBotFqGTtUKs8pxwXZvY/BP71z75W+uhyoj3/ZkiuLYgj+52j97onusp7lzrdS321krzbLEOzIic3JIhG8aUJsJnn2LkYEhRicujANMIFJVGKV2dXPn//7Nz7e7XrKseLx1eWHlf/rBn55O0TKb9v4aW83hX6tY1pKfvM/z0awl3wQLM5OU65bYep1nmc6ASMTew2DRtIcqJ+ktLiev+rj9yXZlZcuNU/pf/6///L/8z/9jmxOYFXu7ed4htob2uUF9jTXW2JftsAE1bSILjMkYClMCHCnIK8QiJcwOOLOU9DorL10+/uHn999959e3bz5gynqdea5ob2fv5p2n9+9v/eIXn5w9tfzm65deeXmh1/E+9TGQMzCLGqqgwiTOZ85VZakKJpAICwFEpjEEkoSnDmSTSfj9XGPsb7OGQxJYIOLaoRcgRg1mTEYOZggxhqAKi4zITCIEDmaV2rDQe/cH739488OPrg6KIC4NlhnzOCCGIvHS7yXfe/O1N149e3yB5tuWkzmLDoER64bPqfEk9vAlStuNNfatiJ/tT9yasEU1hJgmmcKimkZz3guRliGMCt9KvdDOWH959ek/vvP+zcebkvWMpSpGiYsrK73L55ZOLqU5j53udbNelnDuOfXkHLHUuin7rdJ8OMrz7R9L1ZoaNfG5FQpGyO2zp4O/+/hamG9vjncXkJ6Yn/8P3//+CUKvgJNJ7mhComOHRuJAUvGgl6BBBV/zhrSPzSKMiPiIfOz0FDYjU4mh5TUzeXtpfnz5tX+6cvXuxnp3sfd05+E/XPn4v3v1lWXCfKdXbA/SXruqLG1E2hvU11hjjX3RAmxT1YS4X2lf76BsQGBEAWIwJ6ljdyyF19FfvrL0g4v/8fbttfd+/emnH9/d24tp0vNZF+R2Qvmraw9+fvVWf779ymsX33rtwsXVfDHjhNmMlLl2iWJpziXMpKoWIpOREEDs/SH9YKJ9kbCmvPN3M5rdRveZBgm1qEOMqjEooAYidiKwUqtCYeScc6mSM5gZKrO9YbjzaHz12qNr1+8+fLReFJpkHQMXFbmECSFJbeV07/XL59+6vHJ8wSWAM3MwZ8FZJVSjS57+PPsRD/MdNhe8sW/FLWazv00iVSziSIpQaSRxXpyPBihIHLd4MI6bI/3VJ2t//86Ve5sDZP1xEZlHi4vu9PHeuWPtlXksZNZ2aeLyrJW7JEnTNHFeRJiZSOx5dzq9KEsWgxEURAqpzNZD+e71Wx/eu1UtdHySSKj+8q0/eWOlv1wA1f7qNsudQ0eBX4P4voFb0tTizDVjTKs9pilaCgYgVTubUvLq/ObeicdXN8ZxXDr+6O79dhX/0/e/p6C03zZtevsa1NdYY439dg4MAQwodEJF4CbllhUsqoZ5jgFRnVu8tPLqiRN339764MrnH396Z31np4jESZK0O8zYLMc/fe/qrz/8bKlFb14480dvvbx6vOsdM1MqxClHICgI7BImgqnGKsQYfZKwa7bm3/9GOwV+9Y5LCpgRiRMBAQIooAqwsPMAGXwFLqJuDsLTrerm7UfXbty79+Dpzl4pnIl0stwRmBgMzTyvrsy//vqFN19bWuoZAQxlVNDKYgAYNMV7VKcqvsAXaNyyxr5VYTOyQw+t7t4jMoOqlkEJ4p0PEWUBYmSplRVuPdn++x9/8NmdrSD9VtofhqLfkVYnPX+6f+lkfzFHrmMx7WT9bqcDJ+K894mIm2Ss6vbAF/ZWEXbOAhlMU9oq7crD3Y8f3OE8q8bFYid7dfHYH58+2VEzA7m6mFafs3zQAZ/ObAFss8R8nXjPwJh2k5PZxOWoD0zb/I+ENMhBQZVBsZDRX7xx5nHYfvf61XyuNazClc/vvXLqvF/s9x2qSlt5g3ca1NdYY419sfFBMwhP11sGEGNFZMRExCJCVFfQRJh6M5AaQitPOucXTywv/PDP3v7g4+uf3Lz74Mn63nhEPhXnQBSgmyP85INrP3v/s4W53quvvPTm5TPHFjML1MnZM4GQ1AkgYkqSeql6trCzSfT9K31T1DvqZHelmnNQjWKss3wgmdCqBjgzCarDyja2BrduP/nos8+v3bg3KpQlA7z3LQJX1RigPEv73daFCyfffuvUmVNZ4gGFmHoEQSlkiZBIChNTMSUYgYj2G5Jolr31QDgeB+TzjZfW2Lfi/rL9eVs/UoMCaZoRuWgWieAAss1CP7rx6O/+6Z0nT/bAveFgm1gWc9dt25uXz/RbOp9joSVd32/7pOUzcd4lKYmIONBsOyW9oKsiGTGIIsuojMjkSTV69+rHT0fDtNemanzGdf7jG3+0BHQBlNFSNoQjjGA0s6MdXkesyfh97VESmaI+AxR1x6tZzbY6C/gmvN9mSYpSSQQARTvdxl+8/NLakwcbZRhXYZAkf/vL987+D//WY9+DaKxBfY011tjzIR/MbGYH5Jrh2gzsvZnGGMzMCSQWltkAACAASURBVDEzzKDMlJPFqioNpUt97izpY74vZ0688sPdV27cXf/42o1rN+89XnuqkKTVLSKYWiJ8Z310/f7P/u6ff37m5MqF06vf/6OzS3Pt1JE59kyxohjhGJmDI2sg3+8Z880+nsa9iUwcERANwaysbDiySm1tZ+/atTtXr33+4NFGUagk7SRZaHkBOMYYQhFD2evmFy+cu/zq+fNnu4s9pAKGiYEZDkYaGRAwIICYiZrUE44Y2NfyoKPCEQAAPQr5GzetsW/LHUYz4nwkgCuChWBpJmBb3xr/7P1bP/7NlUJ5t1LSrW6rlQqvLOWvvXT6+FLuqchdbLPvZFmepal4Zk+cTMTc7SCG80xExF6IKAkZSBXGYkAJHkf7/Onw1tM1OKej4kSr++enL7yS+Hkzb7AcsRpwmhqBpsIiNlNDeDA4symkZi35ei0a1e0bPLleOokFYirpZNMsOhmRMY8xznMzQ1UGYX9pMfub7739/7zzyx3l9UERVD98vP2nK3NMDaZvUF9jjTX2JXtsLY062RgJgE49cQNAAhKYRYUqwQyWxQIi5H0bDCOoVRFBARAf67ljry/98evHtnft1t21Dz/89KOrt7c1HbFnc3mvndjcaLDz8Y17n167+V/+/r/OdbNL58+8fvmlC2dW+p0kT5gcRSOqedhqku0ZxeHDDV8ziaHnrfL0BZjnd9kVDraS536E/eH63a/CF0egj+Y9Zwja7St8VTpywv5PpRNe+dJsVNjm1ujBw/W799c+u/nk0eYwmBgEdIwyF02GlVXFmBB6veTi2RNvXL7w2iuLiz1hgoaxIDhjBzKNFoLVLJ1RzOopxAay6VRjwtR9rXd2m0nz6Yy8tU3dNm62sK8b09gB2+vB4/3/26z+4wvpc33p97LnHmAikFTRykqNZFjY4ye7v3zv6jsff35zu0parU6vj3IrzQdvv3Lh5ZOrGSOzqpO2WnmaeKZ68idOOFE9SOvV6nOzEZPZlYhejMlGFkyjiKW4uzm68vmNMSxJU1+F11dO/PnZ0/0SGSxUBedcwVKedoQRDhqGp6qw9uxi3dg34kITaR14Bu9vCZMniWaWnjGgeTa2ish8qkFpHu5Pzh6/fefMlYePHoaxdbv/+MFvzi//1SkmMyWSZnybLbOxxhr7YsgxYzyTajEDMZxMNY7qtTjCDFq76AxhEuKpwx4NJKC0S8cvL799cfnpLn59/fFvrt2+fefeeGecpj73lPU6wpZ6H0N59ea9T2/e9uw67dbJk6sXzpx4/eWVxW4uzOJYGAIigmCiSFUzxNeCTgcfyuiL/TClo0/QUThkOMolQkeUDvZdLj0Ms2ZYx76KwzWLGWf+6CyctGc+vx1pfj+gINf90DaRmc0gKCKdRrptGv9UwCBqiNGCWVDd3tNbd9evfnbj9t1HO3vDstJRZeAc0jIjKIjMNBgUoPn5pXMXzr362uKpVZfnZmy7ZfAEDwDVThUJiVBGyFjhlFJHqbApCEYMYSghqk381ml70hGlXjrkolkTs/0DuFv2vPuEvsAvNjIji2QG0sgWjVj3Iw9KBjIjMp1geAYRnt+4+W0ZHjt8k9KXIYYaBfNsDE2mMQs2U4DyXPZG9un1jR//7JdXP78/omxubnE42gnj0fkTC5fPHludbyUYtti3E597aSdpmqcuFXhjtprjkOjw+vRs+pteCFxjYFMHK2IcQHYtfvZk/ZP79ziVlO1Yt/3G+dM9j1YAKmJxw/Feq9UCiKZTjqYVnnZkWKhhc/lGOR10xP2Ybcc8UgIyLsosTcwwKHf7WYvZLGrP8Q8vX75298GJY0ube1sq8crd+6fOnhoVlmfNRW5QX2ONNfaFK7DMLrv0vOKhQyv0lPyjPmJTPkaZwEXy01dnKToplheX//pPl7d2/vj6zbtXPvrk1u17wyqkWascV2oEaQelQnk49Os3dt+7duV//39/vNDPX37pwisvXzy12uu3ORNKiBwzgzzgADbVWDIAFmUXAJ32I9Y+Glmss5NSe6FEIIMqokU4Y8dM9bEaPNUt5EQwKKEucYWqQklIMGlqrGFtVCOYY8hs5akego+03z7CsyDGoAYmMCEoVCEENxPlJABGUWPUCAILMddytqqmgBKIldkYxGTR1IwAJwyKqpFqCrM6+UIAmUkASrPKzMyi2dYObt/ZvHn74Y3P7z3d3FPyBqk0DSGFSNr2qadisFUOd1uJ67fyNMlDxNbeaGej/GA4+s2nSRUrjePMaebM69DZLtkwgCK3K8oqk1aeryzO/dUPLv3Jq6stJoToFYkXBhwMdJBPnplsNXMb16ohU/kz3n+qsd+nZ11TX0ymL9sXhoDqTKuKVQIxRCUEAhiRp3lYw6TVjBBAIJEXweHYX04mN68dXiH3OUIABGiFStiLCRtRqFuRoGbGoITWtoc//fWNn/3qs0cbBdySkOrWg4vH++dOXVw91l/sJJ2U2gm3vWvnWeZ9mohPRbwzmKkBEDlYgGVmPaEjF+4FcXUVCKYak+T+xvBvf/1BTJJ+7lw1evX0yX4GJYwECJR716UeTG1aOD67he3XiICm4aOGL+ob4W8QnBw5QM+eYwdMnvM+JTUAeZIHxEgGx2R0ZlH+6OzJf7r2WdbNQqU//sUH//7MaZc43fdPGtTXWGONNfZVAnFf/enZjvlnl1oGohqiHm/Ryttn/+KPzm1sFtduPfjs5t079x7tDMKo0CqYccLeGVyl6jvH9iy88+HNH/3yCkznOq3TK8dOriy+8fL5Ywu9lqduSt4RSwYFlGiK9qxONRoYIBJxwmSIwTSCpnKwjgUy6QGZlbtixBC13oEYZGCCMBmxBTI1YgMHpgiOTAyY1TmwfTkoBigoRZAzFVUlIubDzsY0Ij35kAwhxCqECCEwEwmDICIiE+FrMzVD/WTt8tW5S2YCEjgyQlQNwYiZyRsQAdM6m2dVjMPKnmyOb95+dPvW3SfrW3vDEAKqQFUksHdJmiR5QijKsowxaIXxaK7nX3377Tdfvnj6eB+Gz649/q8//fXttQFgBganBgkUSw0xmgMIqbKP3BqrDEM1Ghjc8MrVx90sf+3UXD8ThEpjZBFi2adxoWfDvzbljz2Ucm6U2v8w2A/PZMFnRny/gLO+JDTJQZOCDFyjHrbJgzr5by9KId00ZGPPjsgz658JYCzBggb14sXBlKLCmCLzw8e7P/r51V9+dG23YMnaozK2XTx3aun4Qnt5Ll9sJ708aWeunUordbUyg3MsgilWod9lif62b0AM59xY7VGwkhxIw2g8n/GlEyv9TgYgEiSD1UzEMZKXf92W1tg3xLd45kybptoncigTgdd64+84vH7h3Hu3P0feejrYKqM9GevpvIkSNqivscYa+/rMMzkW1drTt+MLycLcudcvnyfG043wyWd3Pr1+68n6VhnKKow1hsFuQE1Uns9rDHulXn+wdX9978e/+ASh7LZaq8eXz5w+dfLEyuJSq9+mnNB2lDgwUy3vHoLGGMg5ElLAdIL4YFCNJMxEUDONqrqPLtgLyX7AWKEKVRiIPDkBAjhAC4QKCqiQZEQ5rAZ2ClKjSkgBpVnpCQNUTdXMVBUAi7CITL1Km1ZJAjALGiPV3e3imNmMYRrV1GAKhZF3cBxUYfvN8BQZZbAyxLKywRCbW6MHDx7fvn3nwaO1rcGoMiJyzEIsLI6JUmetjGMMg+HD7a2xOPT7nUunV06ePHnuzOnV5X6/jQyGaBZxfDlfWZlb2xsOMYIRsZeJ1F8wRJHEzI/K0rgUl7RJUe6Nnwx2ZSOcSpKVLDEfEQAYpM6p8hEH4PmVV/wMrUtjvy/f69mMvh0BhASbInMyOAOTCZkQ6lgIszlSx0YwR8bT0mvwt9vJ3pdisP2M3hHsRTMskTAQLAESsDoLWgRy5lwF2xvio083fvLuRw/WnpZVMir2kqxa6mbzbf/qxVO9dtrrtnqtpJVKnrpOy+dpkjhmIp4UF3x3Z6cBETwcl5/ffuycMwuIurJ0/MzS8baB65DcpPxWG1D3YqPEush62tPPdSxEUAeb6OypzlyvuwWUVTUS++zmg+Ovn8qbXF+D+hprrLGva9GOZcGMRHxUFEGjUeJlPrOo6Ky4M6sX/ubfXBiM8fDx8Opnt65e//zpoCjgzSjEGA0hhNEo7O2Oe70eOdoYl09vrX98d9PJJ5K43NlSrstdv3JsYXl5eWFxfq7f6uTinBuUIEKeeEmSfe+WAQTTCAaRiPiDj6oaLBhxnWTjSVyRCFEtxkkdHDtQnVhkRECLaVWpmUVFBEDGIDsUp2cBC9nBVjQhJzMzQ9CgZiAiYhCT80wCUBWBCK4zhoz9TrgSqKIFg5lWUQcDfbK2+2Rt4/6Dx0/XdwfDcjyqqgBVVoOZGPe8c0ykGmOoymLsBWnC1d6ed/raueWLl86eO7u6tNBvdXzqxREIJkA5tuEgkFGWyInVhQdPN4vNQVQiisxkFiOiEiyYGrHPU++8I1FNPGfEL6/OX1zutLhECAKD8wGIZkJGM7SxM6ISz1ap8XTPb+6k3yOsee4Bm7jbBw2mNmVvIYODCUzIiMFsTMYwpprQyQhGMgOUvuWYxY6OzJQXZDpR+dDJUREq86KIwRCcFGqPtsP7H62984tPtjeLnZ2y102PLy4VxfqJOX7r8sV+3mpnSSdL0lSyhFqpyxOfehaWI/GP7xr626cXrox2q+rR43Xvs6oY5D65dOpMWvcuG0gIBjMzKEmzOrzIi5UdxFoYFAlgMBnVi1OLcOH0mXeufwImJXx2+/afv36qCRY2qK+xxhr72tbt1AssaiiJkHsh4qBWlpbUmgEgMvQzLJxrvXb+cvHvL++WuPek+vTT29du3nj6dCsI9bKOS5LhuKyCsmtBOEQdFKHcGzPFjSTeXQv8+ZrZp2bmWPI8b7Xyi5curq6uzPVaee5EIIwkQStBXyhjyNSRM6OoiBHeO+cmG4wqokEVMDiGOChMEYAIi2TGBmFhlkkFHJGxGsFAZVEhqrAwM3NNSE0AQgyqNjlCzEQ1p+WkJnO6ySlqxlRjmDGqyqoKZWVVibJCEXRzOHjw9Mm9+w8fPHi0u7trSiKZc0kVqCpDCGaRmZ33TsSziFoFCiBlVp9yZ767vDR/fHHu8msnT67MO0LikXgVimSBoXuFFQGpd7njJKdxWXkuF/t+sZ9s7O5UYYBYgRKQKSmTuCyfn1taPX58eamXS0zioOeK5Q6dns+WuuLCEGZIMjOJGowcE9FMEu8A6tXcQbNe78Tbbry633coZiYTTVDY88Dgfq7PGCa1AgcZE4gnFC911pYn3C1WB0Zs8tIX4aIZjvLj2qQQgPY7+4xqdZKqAJO5bBTdjceDdz64deXqw43NQOa7i8sot0Ox/f3L5y+dXRJoN5csda3c5alLvaSeJ4xZswID9B1N+ClRBb+n9nSsu8MxfBrGVWchP71ywgGsgYxZhGAKI6gINfycL7gPwfs5eAaMjevVhgyjSG+9euGdzz7OsozM7j9d2wnW982W0aC+xhpr7GtzneroeLAQiQ3OHIsTjqowdoCb6sSTIXVICXOn/VtnL4EuReDJBq7feHLzzr3rn9/ZDaVBQV4Y5ChPUp8m5Xh3L1INsAwGxWDMLsSbP/sQ+DBLUxFWVWbOW+25dnZyLjvWSjqtrN/r9/qdbsdnObzDXgUK5ARMqP+r+UPD1OkzOCJXE7Q4IKqJWZ0CjOBgXNUdaYnUEfsAEKBmqmaAiMBN0oJmE1KYYBirFYAaQoWiwnhUFaOqKOP6+ubTjc2d7eHOzt7eYFSWoQoxBFWGCREzQYgXjKyIcTCu8jTNWx1VmNbUL3Hyl63sdJJTJ1bPnD6xunxsaS7vd9FJwQZSJAzPEBibqUazMJckMXWmSloOq/FoZ3c8LFOnS/Ot9e2k2C5GsaCJEB8ZuWERq7UNCxFheHq5v7jQXcraPSk9R4vBOJBzYAoxhBjFzWqFYKZpo96n9YCRoYF8f1A0M1OjOBtSP3LatHGPrabmhBGUTLnW1Jp51RS0KPYbbb/d4/Mc/lia5DIn6tEzIJogDj4fFfbhrSc/+tWnV2+v74yI4LutLJa7y3P+ey+9dupY1ubYbeVJ4rPUt7MkzZwXdkIsNQ2THip83icT/S7dBAoOsL0QNrYHRdCgAWbzrfZ85r1ZIiwQGNSgiEK1MEOD+l7gIFXNPWXTHnlmMBmTwgwocaKNfjsbhKIKujUa3Xm0feL0XDNsDeprrLHGvh4bD8dO2CWJc95gZmpVWXOQiBMWYZCRAVCDhthhLyxVQBlgjHN9nP/TZf3T5Yjv747xeL28+2D9zv0H9x482tjcHu3FVt62vFen5jRGVS3NikpJUiIeVBaLEKIazI90c2d0517htOCpRILVKMnMO59laafTabc7eZ612nm71cpbWeKYGOy9T5M0862UcodckCi8RTY1cCCpGCUjEqoKFkEgVVQliiKEENU0xhBVq7Ia7O3t7O6OR6PxeDwsxutb23vlmGqnGmxGpmwgJ6mZjcsqBmNyiW9JIuTZorFRDdJCqEDR+6TXb5flaDzaFEaScrfbOr5y/NyZ0ydPLC8tZN2WpQyxCbW8GUwpIXhnU6deoDXAVXZmKMzUsWQJt7O0ChiX5VKvvTzf2x2tV+NAZkocwYAIcwzVk8ePRjvr1c6cO72UH+/nXS7UCjD7lB0DwgyHujRHn4dB9nn39l1uamo7/0Bu1AGms2doS444XETTEk4DIlEQgyDW9c02Edbcr8NVIE5f+63srLGZrPvM1Nvvb9wfLLaJOpwZVJmCJWvb8cNrT37y3rVPbz8pybVbaVkNLO69fPH45TMri7lbSF03EWHqtHOfuDR1PhERcF2rWMO7+scOAb/v1E2goAoyiuHp7m40xKDznf7J5eOpwQNpXUxvMBjLpFyjWSRe+CgVHSgWyeRWVEDRchgYzp46+eDW9VI1zVq3Hj7+QYP6GtTXWGONfU3GWbsDA0xNrRZrY+9AJBM30VQDACJyTE4UYYTAXsSnPOmvq8sgDd6ju+JfOrlKP1gtFeOSxhVuP96983jnwaO1R48ebW3vlTE459glajHEKmo0EDkhFoUijI0QOFG1Sc4NYGEiqlSHo7hTDbA5UNUYI2AiwqYGVRKlCdmntyq1sQ8DHwumCHBFSUlpwXnF3khA7NmDSVVDDNA6a0IswsRRo6mJMJNEVSJvlKiZqqoaACYGcawpYFgkE8cezJVqLCuv7NkJs1H0bD6RuX57frFz5vTK6srS4kLen3OJn8S/BfAwgSmiWSSAiR2LMJPComkEMdWMouQSIoCitwoGDQEheuFW6odF6LbS+U7W8jwYwyzCjCZVf5qyeZFyOLhxbW1n7X55+ULnzQtz3TlLyRKEWJGZiCSiNqG0BxHPCnwDOpHGOPB2Cc9v9mvsD+Na1eKJRFYPPrGRKUyJYs3ZSREWyAxWAiUogurLZkYEMyMjCpgRdvmWjkPd0VijL5sSmdZ6DER1cRnrVMEhUlKQf7Q5evdXN/755x+tbRRZdy5PXFkNjrXx5mvnzp+Y6wva0Nyhk2bddi6ZiFCtR3rg2RrAR3OkZt+tyV/X8QVCaTYcF/Wtv9CfWz227ACxeqFg1aiAky+VUmzsxZkVdWSJ6ulRk1jDQBXSDGWF06dOvnvnJnnudHrbo2HT19egvsYaa+xrXLLr0gyewrda67xemRlQ5qnUHwyCaXNXBOJ+jR+BHcgxcpoQx7cYyBAzrHY7P7jUAU5GoAzYG2BvbzQcFrfv3nn46Mn6xsbm1va4LGEkzoFdya0SSWXQGGuBcyZikbowUmNkZgKk7sBjQohqUGarlQIRJ7p/o3E7tUwIzAWoLGKaeUirNBhRaXXzmoPIhPleEc0UVCs2RFisGT3BYiBVDWoxABDvssSHGODUOYFp1AHMsjxpL3ROLxxfmV+a6/eXjuULc9zpwHsIT2UTp+1YdeKFoYLAtdwD171CVLdjEQmESSZt8fvgauJJKTEoTXMSC3HcSrSdxuX53vbueDRa36sinDlJenPzXAx1sGGxqqoRCTaH45++9/G1O/e//73Xv/fG6aVEHKWIIVGknmJZxDI4n4t3qJsl61lgNUzVo1Wd1kC+37dNEqh0VPjNDKomEqKpRZ94YzNGZVACCYjNrFAlQgVEkJlQaSamjjmGClWZOAX4W12RaGYhBhYmYkPd3QsjNtRimxKNoyIYnLNKsVXh+pPtH/3k408/+TwG6c0vEKKW2ycXsj/+3vn5Ls0loeO569Jumrd85hOX5smEU3gi5EI0yRweolMlgsh3cL8AgFDp+vqGT1IKGA9H3VZbYAKrFwovQmxAQFMP8F2IHO/rNkxVfQ6QTUA7R7/bGY+H3OptD0drMTaor0F9jTXW2Ne2hVstLj5x4MkAOpAut2f02fgLRLn1SBMRTc+makKtQgRyNNdD1cpDzN+6MEeEYIiARowKHeyNdofljUcbj7bHw+F4b2+wNxgOB4OiKEIRUudAFENl0ZgZhBhiqIJznPkEgqAoQ9CyQByI7p1d6Lx8en6ukyrwaGN49f720/EghpLTlLyLVjfXYULrQhwQTI0mZC5TCWGFBzmAhdiLiE8T18qTLEvmF+bm5/tz/U6v12m10izjLEfLAaWRInXwctD9dsCdaEZQghEioAzlaQneQWmf1bnHCFIDG/FUTGHi9tKkupKJHJGyiHeSJ66bpQud1lw7K7YLNTjnLeix+W53Kdt6+vhJuRsAEI8qfbA5HLx39c76zttvnrt0ujeXSFnFOKoy79N2GyohVFUoiEyEmSddisAh/esvUHRo7A+EBgnMGlUNYFcaisrGRVS1AFQaolZEJkIENbYAiwx2vFcEDw8zDzVTiyrptxgRM4mwEc9OQUxF2ymAFYDAFBuDsLkXbjza+j/+9pfjIJz1XSyrYqefuZcvnjh/aqGTxrlMepnLvcuTpJX6zNUl7VO9AZsZ/COO7nd1/k8jU1YUpWrC7JiReCbMKGqA2GDULA3fCR+CZu4FA8VJlScMZgoHypJpQRB4VMZmzBrU11hjjX2dwO+Zf2kasLOpy7PvXVGETNkgpiLodaqKDh4eQEEzkRrVWC0HIIA4mIMCZvAETyBBK+V+3i6q9sVz85C6LWmiyVfbeIzhXhgMh+PxOEYLIQwHw7293eFoV9UCpcMxdraHg50NG1R5NWgNHsUH92LLgTkpeNkkSbu9lEYWgtbZSUnTtNVK2q12lqVJmiZJ4r3P0izN0izLkiTx4hbbaSfzQmAGC5xDmsAxggJk/gAFT3WyvU7b38ygpqoayeCEhYUMdFDdKdPBmxl+0iloVqO6wpKMCJPiGZoMM4mRM2ISdi5JE82T0EmrxV5rqd/a2i2KsjAfxqOB9DqnlnvH+77fSdY3dzYHw2FRQnkY9h5v37jzZOvt1y798evLp+dd6tp17iQqwD5teSKEsiirwic1jc6sY2eHUh+Ng/cHCcjMPFY1A7lEiKOZwjih1CVFSRZCZVWE7ifsFVDmSMLiOBcIBIkDk5X8LRdJJiInru5+nWHxFLCYQQ2VYVAiqA1D/NWVW//lJ1eelm01yn3VS+P8Ak4tJi+fbZ9ZylGWvbzVzfPES5KKT0WcAQGWzBDe2JTvasp8SoeJcr5L83/azgtWHQ/H6kS8Y0GSQvfrbQ+dWyvtNMLcL+p8MMDE9ps3Ses9gSaao6bBkc8nlQgw5b1i1Ixbg/oaa6yxbx4QnHD96cy/k56ZMFnS9/dyni71ul+cVgtnEQEsNbmgTaqxDtgfSaARpnVxI5yDd6YKUzCDCCQzjJIe6Ipql9AlAhGpoqwMBnYwRiCqSsQxfDFuhY3Rgw/HT66P99YU3Dp2tnfijXT5pTLtxpSiIE7xpGMTBgFVRDRinv7pCfY1bxCrfUA7IAfcR2AWVYNpAKlqVERyRAKDwkhqt1tkUgUzIbSbsi3aYf3tyfvGuhHeZlz/GfefAQaJMWstOUHkvGSp05iEqlzspcNj/c3d0WBtWBZDFj/ajXYsWVnqdzvp/NONx083Hqxt7UVS4bKym7cebqxvrD06/YM3L756tt/PJp9qmpYEnHcMTLrJmJ4/Txr7/bvXR4+wmJIaRdiwtK1BGAXzibRTBqfEkciDhExgYnDR3DCwFxtV5cZOudhJF1oIQO78t5t10mZpTetqVQJJNChQKQYBJezJxu4//vP7v/7g0yiLx+aP7+xtZjRaXWy9dHr55Hw2nzPFUa/V7qSt3GcuEXEgB+MI2IQhh2oWKzayaQUbN/OdAAcIEEMwinDGBJG6K8DkQL8NVCtGNkP2wgO/mQhMHaRVmmovUR2Smd65hhiaMWtQX2ONNfb1beE85SOfJeggGIyI9rdwnvZ0fQnn+z5LhEwRS133SVqz301B4j6gAUDTxpjKEAJiqZ0EqdSOlkGhajFqjPV7MABiFnHEEIJ3CpQGC5o4ltwTi7EojSrIsCwejtY/H5cVoZpbXnF0UrhlEAWIoYRYwysFgIxBcvDdFFAF1FgnEJZgXAtBmMEi2KARIbAphMAszEa1BLxNgGytuTDZ8XgiN3F4DGe8pIn/enABpoW1M6QSNoXXpFxXWkESSsAAVxXFyHG5uzUYbeyONooBpDUqyu1tmetIJ+Hu6vzqYnex37n/ZOvxzgjgrJUXVfjFB1fv3L779quX/uR758+stHOPEGlcgBnesROvWpmZTMFC48X9t8R704ZODqZ7wxJO1je3f/Tuh7fvP1pcOvb2G6+tLs4ZZSSJwakRmUSTIsg4YmNr9O57Vz+9+unJ5cW//vO3Xj29HMwcfbtzL6aoywdrsU0jMkNQG5YIBLB9dn3t//v7d+88WnNJlyodPbm7Mt86c+L42VOdk4u+36KUNSOX5XniU05ScgwPiCoMRkIM8EQYg1Cn2c2IZsQgJmvld6+vtdaEcUSZSGVq6FsJCgAAIABJREFUpsZUmlnt/tMh2QxqAkMvtk1aRDBba113LzAbDCQws8qMJkxU5FzSTIcG9TXWWGNf27JNZs+jJNBDiZ2JAOukb5u/krM6qzQNxoQPsnYKarY9nnl7D7DAUjCiWZxmE4mYnHNupkWujiiqBjIDKblApBqoKklVbFzEncfYvul2HzsM5zoUzOe5sVQWh9AS0UMVTE7EzSgIxxitUmJmZoC5prlh1MSdE6LAgyJHnnh8nic+jppptAh1DD8BcACpkinMIEzCbtIXMyE8mzqUBwNm+8cBAZSMZ0EhDASqi6kU9fcHxMSrhOhdSFzoZFiab83PtbbXhjGOd3fHu0NmOdbOWDR0PSXLrfmWn9sY3H+6tzUOShyR3Huyuzv89OHT7bdfOffqhWPHFpIko6iozGAk7Ih0Rg6t4eb7b22qBqKsne6O9fqdtfc/uvpkc8c/WAtl9YPvvWVJh5CaikYAPqovjXdH9psr9/753StlOV5b3+q20/MnjyeOv+VQhWbnX03dGdTKCmo2HI//8WdX/+lnvxrDp53FoqjYyjML/sKp7unTi3Ndl3lNhXuttJUmiUu8T7iuQRcyEjWh2ledrlx2qGD9WS6j72IYhM08S7/TGQxCjMHMhiOt2qy1Ot+h9YEnydnG03+RnYiadm1yqWueN8fgaEilMhuO9wRQIhh1u/1mLjSor7HGGvv6UN9hIpYjS/mzDpfYlNrxAI0cqfujww1fSqSTzm7VaFbroDsRYVY105ork4gYXIfYRff1+qYfrShKM3iX1ILv4FpAQY1UoUjEgc2gLk2o62Vuc7Pa2dlycWTMpRaqIWowKIsIu/2PrGoxRlUVEefT6Ve3yXFTds4c1Z4LgYkIBlXVGIWcE2aZQEFjmDtImE6+Pk+SnPV2ONP5PqlT00PO44G+GoNgdWkoT7slaj9KwXFmhA2kJHBieUqhQhniQj89tTq/XerT3WHQShLf7/fmUsTBFoUibWEuz5bme3O9wfWHT9f3oqWtqtUdFMX7V+89evDw3p0Tb7/50oWzx1otRDVTSxgEMtqX3jrSdUaHlbPt+fEAm3n03dn5j5ToHvnm9OUvPPC0o2qlBuFgNq6Mk7w3n45G49v31+a7d5dPnldzpgIFOInmxmNbW19//8pngwLzi6tOx4q8KNHxv+3gf0V8T//C+fb877w/Z2Zp/o2eOzRG+z3HdVSIyIAYUFYIZg/W1v/z3/70k5v3K8qQJJVJ0spOtO0vXj620PZZJo5dJmk7a+WZd4m5jElUrardMEICiNmhJc2+0uDQN23C/W6f1754Uu4fqtOgbDw/13s83ihjpbCdvT1td21/zzj4CDX/b9PX98IvcQekZJhuaoZoxIUWO7vbBGMjM1voN2J9DeprrLHGvrFewr9wvj3rG9Czh2pdMTMQXN3pR1QXULIQhGF2sFMQg3jK9z3RRQaQi8MzDUkGVjgDOUDNxhVGo5EOhm5YuCRvtdpxd7cKUSOMGU5IWE1jUKI6q8ciIiIAqqoqy5Kn5pxzruZ22CeUmXwSIpATJ8JTvBOnynb76dEaFx9SXHgWHT/HxzqgwP4iUD17ZB/6McDeSadjkHE1nO/xOeO94RDlride6mdZAsea5T4TXxbjzd1h2+GlUwvzSwvX763fuPd4NC69T5xrbQx2fvrBp7efPHnrjVffeuPs6kLuhKMaoL4WuACIrBa5qEHpTOPGvkDvkTDAIQcf3x1yv/0WNNunyOVnpgAZnsVBUyrXaYzAOSnL+PTpyByfODG3tLR058ETkSSa+/zhhp8/HWM9EQG4SpP1nfj57cfrO2WadTfWn148deyVSxcIBj0oq/7K38G+dBWgKdnvM+fbDMo/0Hjk57wP2SQnPkULComYNgpPCgvtoLgTMBMDKtDYbC/i+u1Hf/sPP1vf2nNZN8ta4zJU48Hps6fevrg0n+zO55Zm7JO81em2OinEjJQn4xAVByl1+wq49nn34jdmwtlsKImfd9kOlfPvU+LMeO18OKF6uP0YRmYO1Gm1jTYCNCIOq72IVpxcP64nNO2n+6jJ9b3QKxzTZFrUCicGmUwnNlAVbDQcO2Uzqyy0O74ZtAb1NdZYY1+X8Rfyqxl9YZMR/UuHDml3E/C8hf6o6zmpn6JpbeTRv0HP33IiEkCdlUkcQAViQ58UlEklVjmvCZtqZK2MiQIqYS+SPPtW3vvnfldXc8F/AeSaDCIf9ZG+1OjI99eDd5bnfOWjg0FMXPf/1Wp6RI7ERZVgY2LLc4ujYqXDC2+e1jfOZFnWbmWpl8yRQ6qhIEdzzmFvhLi32m31Li2eXErvPHxy/+Haxs6goMy15m9s2ec/+s17V2//9Z+98fYrJ9qeCKJsBhNSI40W1KKwZ+SIgjrVSbXGX+2da13EyyAYkU1nFDG+a5TuNgVCZgcQzyYxAzsynY4WxNlkjig8UTtxO+OYceelM2e3NnaeFsNRlHubZbz10PsMAKlJkg5Kun5/86Nrjyp1ucOx+c7Z1d6pxSxHgQD67aQbnlMLYFO08DwceMDqhIPGt1mkMYsKERSFapqIR0UWAJixwZckQ7MoCGYOlBJymItjq0bsHCQJmo6NgucHg/JHP7/96/c/Hhek2tIwlmp3vpeeu3D80rmFlbmkhW6e+jzPszxNEjgXxYmIqxmnQP7QrSkHv/LzqtkPmvr2AznfrOmsQDVTjjr92Y+5gA6V25tBI4QMUuNFhRJcPRPVJo18bDCFKglrLMo8SXq93qgqrZXuxOGV65+8fWqpxChDYmZkRPWniIaM8d1TNfyuLGxERjzVFVIDJ7XOJchAMeH1QWy1Wtev3mlB9gZ7Zrj40olm3BrU11hjjX2twO9LsMlXPx//yvN/9yogA8MMVjF0AjTgAE8QnrAy1Ojjd1EMJnxlp+V3df7kt35nPgwcGQBL4hNWk6iAIWEKIRjgEqQeiaPEixDVAM2I5r3Ly7g7LgJsuedayfJiL3v4dOfhru5UAiVV/fz247VHa5+9duHf/vC1c6vzMOdJhuNBDMMs86l3ACHabB6nDvFHUwaEeBI9qJ84rOj1XbrF6KAldQY4zaK/Q1jf7NnLTrWDPhlYa+Xpwlxvb1huF2UU/3RnlPlgLMQ8jnj8dHcQJIKZ2cJocbFzbvWYsypLEqb4299fzzliX3wazbaq7v82ydDtI34+iGGwmEWzutqcTLVSKx12S7tyc+PqZ9cX+/lfff/V1S6TqvNejapCzWFs/OmN3Z/86tqV63cHRRD2ZNrOstWF/Pxq/9Ryb7HDLQ55miSJTzLnPMSZiAkbE/2LqTr6A9zsf3BH/OD/BNh0Oh1d+mzGcQd7EBlMzXQC8pXhUHN9GaJSVDIzISGRJM9Y0Z7rd+cXHuxujYa7c8j2rOpRYhBVYzViAu+vB02m70WFfXWYgQ2mZIwgtUivioEKpqwtdwt79HRnVJTdfu/p2vpCO2mCAA3qa6yxxhpr7F+H3Zmdc2amqkTkvVdVA7F4lySJczXqU3XesU98qnDjstJhtOjZt1rtdrvd7fVbT3ZuP9zY2R0mIr7TGY9Hv/7w+sNHm//mh29cfvlMnlA36+R5O1bj3b09x0gTEq65DkmsVr5wpEIEnvRqGUhBui/09x1K9RHM6Ghuc7Zizp7nR9F+Z+iB1nXd00ZE4kBs7Va2enx5c3ewvbYLybZ3d3bIBU6cJGWl5XA0KotEkDhLzM6sHju1epyFooFZDPyVr4DZMwXGBjPwM7m+2Xw3z1Zy2tGYDh3qmqO6dNNMAZJ6gii4DHb3/pN/+Id/fvjo8dJcx4fhf/p3P/SuNaoKk8Qyt7ZbvvfR3V99dO3Oo81xBSFBLDp5srrUuXBy8dxKf6krKUXP6Hba3vskSZxzdUU384vbaUZkEy1Q+oKY2kHe1YBIEiZJTxCMLAKVQJkqU2P2CjYicq7mNS1gO5V9+qj4/NF2CK7l+s4n3vmdHVvtdxTGpkEr7zwSgwZ4N1Xta+xFjGYpkcEYJVmEKlkCIwPMlQViC9cebDwuxiaykGULab6ScYP6GtTXWGONNdbYv8rMDECN9wA452rUR+LEee+cdywEqDihxLkyBCJicVlRDYowLGMqtDzXWej1Tiz0b96883htsypC4pKguPNo+3/7P//h8quX/vu/efvCqW5RWMpZu5NbKEAVaGQKmAMndekpTQXmFQCTEu9DvroR8DviA9pMM+Nz0B2O5mAmzXx04KcTbAK8zIjIe/YWmWKW8fKx/vpGf2N3XIBGVVVGdUkrwpuYS6FhLBZTDitz7bMnF1uZZKkbVYElcb9FK699QWfpsw+PMNYc9Jwe4gih57QFkxmZMbMpENXgIH57c3Dlo9uPH28QZ0WJz27cHfzFnyUtF7wbmq1vle99ePudn7+/trWbZr1OnlRV2e4kp1eOnT95bGU+76fqSfPMt7Mkz9v7eI9e6JCDgQys4EM9lF8oBjK5BDpzmZkgIIbW+qJmZmqjypSNBUWFRzvjn1659eGte49H5Zgl6fS8b+9sja98cvfsn13OQMxkVhmbEQKMEBx8g/peZOwX66lmQJg2s6cAlFAaPrp7r0qyJE+Konjr0sW55/d7NKivscYaa6yxxn5LqzN+RKSqqKURWUicYxYhAcAk7E1ERJzzeY6sVDcYyWDsRQ2sZZhbyE90Lt168PTq7YdPtsZRMmn1LcT3P713+/7a91+/9MO3L1442fYKJykTzCqDQo1MQFJ38REBCuZaEJGU2FBDw+8cuYN+gbf9bHUnYPucllYTIhz0ASoT0iSJpo40E5vrZitLvScb20+2SwQDizlfBjKzlk8EY6r2OhlfPntqpZcmCEmSGhQsdohv71/w6PZn1n5dJ+3nib5QxONoQ6o9K1B5BCAaiEUNFi0KV2oPHm9dvX43yXtKwp7OXrygjnfGFgQf3x2886trN25+XgW4pFMUY6mKY/O982dWTx1fOHms30nVW5EJ9Tppq9WuVVpq7t86OGKz6nsvGvKbkU6g2YLP2V8OGFMJ5ia9iiYwd0CeTEYuVBgGwCeBcH99/O6vbvzy46tro2Ko5judpJVyMFXZrXD99vbaa5b3yAnIDFQG2BgguBZ8Q+L5gge3FAxEKBAMbKRG8Ll9smnXnqyXaf7/s/deTZIkyZngp2pmToIlz6os0lXVnE4PacwMBrsLckTkVvbtnu6n3dvJncg93D3gTuQEIrsgi8HsABjanFV1cZZZWckzwomZqd6De0RGZmV1V2MxO0B3aJeEZAfxCHczN9NPyfcZkr3dnZ/86Z9lX6fSYIb6Zjazmc1sZjN7qjXVa8aYxrsVhYBBxERE2rT5gJkICSccQlkHy5jrZFmSjKq6KMrRaKjeL2TdzpW1xaWlL+4/vvlwd2dY2iTrLSyNRod/94t3b9+6829/9L3vv3G+lyFhm7uMnUItxKgwTfn445YixZFG42zPB1rSyBP9ezrVBTmhQm2YcAAIgRyrM5o5igkzyepCZ22xu7P3mFSt6QhMLaqiDsHBZ1Sfmxu8dH5xkEruYEhtltHRwY9xOT7lcZrb8jiOgB61aOrUp454Stv4Px1lA+lUrMnjNLCqBOUgdmuvfrBxsD+sD4rQGQyybu/5V96M0OGoev/zjV9//uDWvY26qvPUavAW8fnz515+/uLSoNPvmK6NHUuZTTop5VlimYlNK/fy7bAjbfQjyfSJzqqe0NCwR02kShAQVA3UhBAPSt8Z9CLhxsPRz3796Sdf3D0ofbSJpwzstSzZmk6e2ySJ1lVqrj0Y5rabdpE4AjyACJ7hvW/L1qNNLEEAVYYQKsWHN+7tFD445ro+k+aX51MXlN1sC5ihvpnNbGYzm9l/hclYYIKIGgdXVaFgImWaRmIgahS0WI0zEaAssR2l1HGCOJ/OhbLc3h3GUC50O68+f3YwN7j3aG9ja/dwNLRsuoOFxwej/+c//fTjq8/99//uzeefm69jkhm2IOZxRRm1ridPuCvHlKTfQtg33cfHR5BJJk83DKfj3EvjtjeOk45ZPhuCDSYNFqGfsoPdC+UgowurC9u7ZbVVltAyBsAwE7RO4M8tdF6/cubswHYzJAkIMtGdnPpJz/J4XNFAJ/DvaHCP3q+YYqWdpDl5mspTjyZIyxQs2qqwBJLSy52HO1/cehDU1jHmlM4vLgvctZvVxv07f/+bj+7v1Wne62QdhKKXuxcuXnzzxUtnFnsUR6lD7qSb2DyzaWKNMSBiphOQ75uKAGl6jp0YFwg9oRtJqtAAaSRYjRoLIlFbBtRq69T95qPHP/vVBzcebBVi1Gaa5BFiqLYCq8WCy7spDUNZidln+vD2g5WFK2e6xoEBMYCFpRmD57dggSOAhRNuBWcDYaR6dUffv37Luq6qd8I/+cF3rcKxks4Kfmeob2Yzm9nM/kmmpz+pqvqtuxSTsP1xp5YnIhA65cGrsuE0z1IiEfVBAHWUF8PIqV1dXTgswn4ZjEW21l2ez24/4Dv3N/YOi7IYGZMo3Me31q/dWf/xO6/+5J3X5nvay5AwMWBV7dgVUFVSMIRbBMBtuo++LWMxQX08LXkGhcpEt2HC7NKoBeiRzMXRdKb2U4FVcseGzOgwpoy1xf7umXLr8JEPXn1hOXOGM9GcdG1l8OLFM7mJ/SxXgpAJEfZrCmeMKznpZIvikRwFHS/hPK7tNg5KNMSzChDxBB7qWJywyQULOBKX0d9/tPfF7Qe1pqtnLxZVlXd6o7L8+P3PPnrvXXVZJ+vG6DVWy4Ps1ecvvPjcas9pHG4uDPJeJ+11U+csM7MlZsfH4wzf8IyfHs23I8pclQbeHTF6Tl+Kpiagldo0ojwS3Y+4v3X4H//2vQeP93cOq4AExoYQRSMjsBYvXly+dO75M2tndorq11dvj7xBNndza3NzdKbQfgpmMAEpLMEY4idvim/+WHxLNl9qZD2U2lUKSlwqH6r+9vaNO1ubCxcuh9FoDv6PX7scRZm+hRzOM9Q3s5nNbGb/7EbjNNe30plotOZPOFXT2RZqsdY4e9N47dRIrcMZosRaQ8ZyVZd17TuGjEVZ1UVdpIkuPT9/+Uzn6s0HN+5vHpQ1JT3YvFL89NdXr9548L23Xn3nrfNnFw2UKpGENTNgDSIBQdFwT3KizADom1v19USsQaFNIkV1LO9GE/l1opbARWQicA1iOiFyrg1/JxMRFIm1olBBL899Hevar8z1n1uNxfpBJYEQpCwVxYXnlt54+WJi0E3ThFmM8Q3mpgk0OF7PqU+r8FSItmWDR1p1egLoHZF9TnDcNP0nEVTGbn5sXm7eoyDDNoKLqjZJWnm9vzW6vb6pNickRRXmF1Z29+Pf/PTD3a2HnHZApL6Yy9Mzi0svXDzz/Pnlro0JQj9P5wZp4kzijE0crInKoqSA/TYtCA2+a5PJbQ45trd9jGQtVCUIiNkm40FnBUU1tdB+1Kv3ir/9x4/e++y6ukyISQniHdUDZ3q5W+wPXn/59X6iCddZWnU72c7FxeHGwUiGTPGDO7fOz115Y6FD0SRgS06iUjIVwNCjeNyTS9bM/tXtuQJEg53NYnWxo8FWwz0zP78HvL+9+Yvrn3aX5nfuPXjx7Jk/uHylD3Wko1B0ku4M7s9Q38xmNrOZzeyffVMGT7OJtH45NzwvaGtBCQRWtQQYNkgtGzU1uDAULItDnSKMqsOFxH73lXPnz6/eXD+8s3mwOwrKjih/tBt//qvP7tzbePvNK2+8uLzU5bIufe0zCws1zpJahdEArSNZRvIN3PSfRhNC0DbtKVFFCQRmYh4jJyZS0rG0GZGoiIioNJFzZsNsj9qj2uJKts6mmXYDB/XDyg26vp9WQdQbNTZZzJPlhflup5tmoCRVm6pNYCwxlCDaluJOWxSVKESMNnLSngbRuCFMIVCIiqhKZGbrHACokAq0LdNUBticQITjRx1j2aYQbErij0jBRcDOYbh9f39j62BURTGq4nX3sCjKanQwOqwcSZ6Y+U7y3PnVy+eWzy715jJ0LS32uv2Oi9FbQ8aAqFGK5m9dur8BezG2xJzcZlhVpRm4dvo5K5FjQIjwUYnYZmbzwP/mk4f/8N7n19e3S004nVclgrcImY3LXXt+ZXBxdX5h0M2sdjPj2HISfYcPL8yth/rG5q7L81vr935pi8XvvXkp71XDQqs6n+tMUjuTW+NbWIjxTTUBRqD51Y6WiqJOB6v393f3+/nf/PY3IwhTWO1kZm//T77zQ44aKWZJNrtoM9Q3s5nNbGYz+10ZP4kF2z6rMcMKAYZBwoC1RhXGVYklcYg2evaVDR2LSrUCpWnPZd2s37/zaH9za1QVPsKURb1/sPfo8fr9h+fffvPypbPzDqgQjbUAqQe8h1o2Ft+iRF+DiVqMRGyJJ4yVkCgxCDtnmJsmuRBDXXkYTrOM2zQNoqLJ1KiqyFj8jkkogWObJ6n6QexciPleSbu3Hu5vb/e6+cq5S+fPn0+6PWQUrfXsItiP029RcQoeImJn2izkVBFWFIQIw7AMZmIiMkxwBMR2avE0K6uISmylBaEKFQAKIRVq6gh53ABKTYMhqwKGlFztsVcUtx5sbB8UalN2eYyoqqquS18VIsg73YX57sXVuecvrJ5bnes6pTCyFAmGSLPUgg2YQdzS5eBbVkrWnKwhxCm83RQNE3HioqKqItTYxBijbBDVPB6FX/7DvV+/9/H9rYNgcnRWWBCCp1jP53y231kbmLWBWRskKwPpJMErZ6lxzkTH0jFmsPyortZ3N3yMe+XwgxuH5+bmzr7xaprksahPCD7Oqjq/aYseIUC9aijKPBuUVez2l//3n/30zt6+IMuh80b/9PU3FlkdsFVVSZZjNgdmqG9mM5vZzGb232KTblGXNN0YY1INAkBsGWSasj5OiEGWxSE4rkvnoxyWYeuwNDEud/udfHXQ7d/Jth9vHlZFAJjBm1vbP//l+v31Oz965803X7i4kHeLGCmEBCZJEigQBJFgv6FcGvRk/xgpGRAr8ZSeARQgZ4xzIaKsRRTMzM65rquD7pcwBsbCjKuVBdCWgqe5ihqBGiZQ7mHVJIO5ztpZHdaaZ1mWpUuLS1m3X6rdD+RLtgERGgkwYMKpKTDnkKZTpaYMww1egDLimA8SChESAQGJO5pVbb2wgpjMeHwZBOIGslJbcjzJCU7IJFVUoyKqGdbY2q8ebO5WETbNg3LD+0CEPOt2OgvLi/MXzy5eOTvfTUCsZLSTdlYWOgkCEJBYACCjSk3SlSdFqd+a27tpkSRjFAIJiApjlBAJISrIUZIoofQ6PJCdfX/70e5f/vLDBzsHh6MqybouyaMoYpUhrq301uaz55bz83N2MfUdlCkKinW3u2ScyfI8OorWdjrdt54783j78Ue3H3Q6+aisf3P97vJg6Z2LK92FLNSwrmkppBnw+0aGugx0c3j43PygqlQz/s2txzc3dpUSVoEfvXHhxT/73lrYRTaHQdYdhiJ1ndkMmKG+mc1sZjOb2e8AihzzCSfW5Jd04hTT+C8SGAWB2ThikDHRJNbVRVllFBYN0hrDGs7XbmDOdM5sr8zfebC5/uhRVZfWWlW6eWfnwcZ/+eK1l955+83zK72lTqpKQWBUyNI3Va3phC97lPdjA0YURK+hqbU1YAvWVrQeKTdaeB5aKsAwGQCtAR/hPXxAjDg8rLe2R7UPVVWXZVWWZVVVdV1vrG/duHV/VNZFVRub2DQNwX/+6ceJ4yyzmTPOcKP9oACYmLjBZyd6+AjEzKLKAFubpUne6eRZ1ul15+b6WZr2u71+v9fvdfKcU4fMIXetrveEnYeBEMnXIIJhOEKT1WOioBABKbgpwASIiKGAxii1UhF1a8/f29jb3N+vwBZcVjUTg5lBSZp0e/1Orx+U7qxvSDWkUCz2k/Orc4vL84l1GoNOycUfaRYQ6FvUPkaqJCLGWREKAoEaJrAT5qjwEQEaI7a3/WdXH7734adf3N84IOc63f78vPow2l5njRfPLr1w/vyF1bl+ooM09l3MDXdslrvcJZnN5pVdp9MRQ2WIBHqlN+dffXF/d3erkCG7Owflzz69meW9N1fyzJIoJiOOWXnnNwv0MdRrsdAbFEBM8enD+Bc/f9ctLoe9zQzxTJ7/8TtvZAruY7g7Mgt5jKozmfYZ6pvZzGY2s5n9jjbmEwDwSJ+rRX7jFwhoav+kSbAYMMNapsSa6KjITG1TcnV0wyrRuqMajRksmV66sNin+w8fbe2PBKyw27vVT//+05u3dv7wne9857XzZ+ZMx4Atq0bgiFjmm3m5xw1+GHO2CEEZSMiOiVAiUCsiINqWUI5K7B2Eg4Nic2trY2PzcDja29vfOxiWVR2CKIitczaJolEkRokhtLWUMETdSAxD1tlenkdNSx+VjXeJWMPMBIWKgRgIWkXlU362+KZpT1HDVpJWPkkQHx2OihuN/AcAVlGN0IgYGeh28sWFudWV5dWVlaWlpcGgPxjYxXmIIiq8AhEMMGCJ3JGsBx8hMyiRqNc6yOO9/Tsbm2VQGKdk2KgxDJE6VCp1FD8cHpD6erQPqRCLhY69tLawsLx4YXXONWIkUAAGxFPMRd8iysC21NYoGWVSR1AStqJaiw4DlLCz6z/65MFvfvvR3XuP2Gb5/IrL3MHB7nBnd5DZ1y4uXDq7fGFlsNhxCcXUIbWcOEqcs2li8zRJO8xOyal1KmKk1qpeSO1r88uPXnrpL9/7rAyMbv+zxzv8/kfu+6+/vNBNoG4K6T2Nanhm/zpNGFFV9wQ7hf753/39IWe7O6Vj12P643e+u5gRfCA23U66V/j5bnd2yWao71+OV3T8CcIJb+n0N3/Fscaff9bwFoHwrzcURs96nU79zLNeUX2mPVzxbWCIn9nMnml9O/3W1GnZZgXrmOe+ZWIkZRbjlGG5o7bWokilSjs070w5Gh0M9w0oW8pWFlaXFjrH0odkAAAgAElEQVRf3H68/nhUa9LL87os7zwcbv2nX3zw0dwP337x+69dWB4koa4sIU1y+tJFgk57UZ9x8TihfE6nr+/0lYvRs6xgp63VCoiIqqqogpUQSWuPEBEUPmBYxoNhtbm9ff/hxqPH248ebe0Pi6hg69haZqOKEGKIqkrEHZM569IgelDXBGY2MGxSssTMxlehLuu0l+nhXlmMqnKLnEu7PZfPeeO8SYitIWUNUE8aFBBiPK29UhVQESlFilJRejawrg8VplaAj6jhYlGFHko8fHx459G+xGsSQ4NJSdHp5kvzc2urK+fWVs+eXVla6Pe7JktgGY5hpuYYKwzYi4zquL27t76xqWRskkaBdZaJVWuBhKAxxoODgyghzawhB8TDqLuV1GyQsijXohZqiVqlEj02kfTUKfO0vYS+3t315Z87/h6lZ5yMx96tp3+FHo/mEEAMx7G5m4mVyKsOfTwofOHlZ3//wa9++8lwqP251fm154ejemtvp368vzSfXry4cPnM4sXl/mo/yckjHCZEicvSToc6HXEdccnQpTVrAk0tVwINnHJK6rWsl7LkO5cu392tio39ArYK4ZPNh4PPg3n1xZcWloy0SiTT/s2XXZZ/qt8xs6fPPT39YukTu0NDvfMVwzO5n7SL5N7+RkhX/rf/9z8e2MEQCMGszi1+98ryOxfPoxqytSqi1pW7h3knnYH9Ger7l4f6ThJYn9zTvzLU9pSX9BkeZ/Yso/OMH5xdz5nN7PSV6Gt9QBVkyCaOicRZ+DrWZOGZUhPDvpRB+eJKf2l+8daDvWs31x9tb5NNup1uCKPrtx/u7G0/2Hz0g7dfvXJ2vuf+yff+kwsmngCwGOMZ+qoj69QR+MvWlq/y6yfHkqN/PPl7WODhZnX77sNbt2492twcFqWP0UcRBYijAMTWpmyMxFiVXqQ2xhIxiIkJCh98VdcgJm5qNQOixiYpByCKgySELFNKrTE2qEYqJRLgFAlgmWA0snijQUBK5jSwowAMG8NMhkQ0SowhEMggKmS872nTpCUiEGkoP5mYnTFJgoaNUzVKXH+8//DRzrsffW6MWsukYlkW5ufWzq5ePH9+be3s6vJg0IUDDb0eltg7jFs7w63tPSQ9AMFXKppYZpXEIEmtNew96losNVWqMDCOXWotH58BT2ynMlah+NKJof/NEMSzQMUji0cRhmOqj0+ekY5PNQIeqCPUoAh6/3Hx2dXbf/23P4+wjCztJaM6Hoy2rbErg/zC2cWLZ+fOLvQ6VjqIHapzp0li8zzlJKU0F5d558Ql5EAKL7CTa2wBNYieQ1xNsx+99upu/OLTBxsutSLJB/fuRV+s/bs/jawWsIBtGG1VT7tpv9b9PkN9/yze1Ne4gHpMB6jJq5PADmGpt/J//PlfbJbe9QcOklq60O/8j2+/nACDJPPF0CWZhmp1ca4OwKzCc4b6fq/WiCl9OUKjY+9HefzmIQWNIyMkRy3742fq2rJhdkTjYwoEEQKFMjGZVpsXiigCcmNlpnFsVaEY6ywpfIyOW37tsqoT68A0+a1NBY9ALFFDIv7EwimiJ5s6RNUyS/MiYJrjgxSIHtLSgB17NISm1X78vQqNBEJoKQK1jbh+/XKuSW6UFCRTq1VDQWHly3CzTK4ytWNHs4zfzL7dKO/0/6cnIWCzFPGxZwiwBkDTqpVINNHbumJjOc0yhEBVxcOyjKO+SV45n672V9cfJ/fWtx7tPmZKXKe7X+pf/eOtD24Wf/jOmz95bfXiAAlBgKqOUeASw6alqYwijskairGOwRtjjLVj4n8a088ciYaPncVGk7rp6GJE0/5uIiUItWwo2noqwgiM2BAdqpKKaaTsmW3zFhWoggkSAAUfvyaqQTXCWDImAl4QgUCoBaMaW3v+7oOtm7fu3b3/4PH2bh0sqBOCAGqdsXYA1iheGnYVR0wIEqWumTlNHSliCMTC3KhqiEoUxG4nX11e7HSy+UF/rt/rdTuJSyxTnphBJ3VERNIos7kkyfIsSZncVIR+isbH67Glu3msKi1GICYAIcSqqkajUVVWRV0PR8XwcDQqiqKqd3Z2tnf2qxAiyEeRqMSWrTNso0pZeyinaQ5YMIOdAgEITaZHdW9bb25t4OMNAGBiYHnQe+35S91ed++g+OLWBiHRAGNCbikEb1QtxBplFPDBxNADepotz82fP/fCpefOPPfc0vIgIQEUhmGIAIpjeAoFswClQhVGG9AxTgE2Ozc3Vc3T+OOZ+wB1yhWedDbSsYACThyeoAbxlBSfjpHdcRQXGZ40QoBgEC1gGn5SZQiJFxGyLlOmIIgKGPUKWBLgMMSPP9341fufX7+zPiw1S88AHEMIVcUalgf982dXzi/nZ+c0tT51Pnc2S9I8dXniksSmaUps2CVsHYxVIiFEIBjygCXYREkUUFjHxKnoK700vHSFDvevbjwMiTt02bsPHw//6i/+/Y9/fKm3ZEXloJzLcjC8DwQWRnN5DMSoTLecTs9QOrFOnQAvDHyDqYH/60CeQscBm3YO8mSSacMU3KTtMWHk9UYBOCiJoulFthaGvMp+KEDo2JxVEeuEnDfuqur//Xe/vbEzWplfsHFYbW28+cKV//lPvrtElKpaJSRdENg5ECWtazhDfTP7FxT7picen/b+E4BwUmhx7FPOOQJBpS370bFQlmEeyxW37S5gZvYSENuS97bwvWW4JpWoqpabYFkUUWfHbs8Y4jStE6R06pk0h7N0MuRjiNBsdkyiqhobCCoCZxN7JLMDacR1JdYiIG0qaYhALcglZtf++GcMM/2T/Ff9iseGLnxW5DmzmdFXRHTpyzDiSfE5gJjIGtbEEDnr4APYWra1D0GkimqVUtPpd6nzkG/e3z7Yr1w+b5LB+rb///7q3eufdv/0e5feeOlMv5dQykkDsSJUPKCpsyoaYmBwkuQx+hCCsfbpK4g+kbiTsStOgMFxn1uPagsnMuWG2AKsIr4OIgDIsKl98EE7WWoTSESMLUOJMoRMEOOlPeDWvr95b+vTL27dvPtwf1TtjcqiDiDn0ixJ522eMawVDd5r9LWIAYxLHAk0MkQ1EkvqqNvJ+r3u2ZWVc2trWZZ0u/mgl/W6ppMjNYgRvoZhOANr0NRbkoBjNBqZoaoxRhFhJufEWn5yd2p6NuNphan9DJRNxt8oOiKd5qytPbrEIaIIUIaxiIL9kW7vVI+3dx493n60+Xhze2d/b1iVFYiZmv49EpCAokAUxliyDswq6mMMPhzc2755Y72b58YlSiZNemRMVVVKurQwSCzShPOUO5ntddNeJ+27tEdJaoxzlOdEUvhaGGQtsXFBvEYhstY4M9mf9Sj6qMfnDZ++RX29LWNyKPr6SZav/C5RqSTAqAMYhiAQDb6KIQAmyfusJgp8gEkAQSVQwqOt4trN+1dvPrhxZ2Nzt4DrZHm2t3fgDHVTt7o6d2Zp7szSYHGQDdLYQZVZkyQ2GZt1jq0l54iZjTHcjCYU8E0MBdIU+jbBbQIb4h4Tg15YyOSt1zp58vH9+1WtJu1c3TrAux/+Dz/44eVOJ+2nh6NgQugMUiUI1MegEgQQkKVGuJG/XiZKZ5v8s7u42gbxn3ZZm5vcoH1X6ysGKB0cHHT7cxFUQjIY5WzjcLQh4X/9q5/Veb+3tFIc7vc1fO+Vyz967aUlQ7mOU7tjP1YxdhS/9QM2Q32/3/uBvmydPvmigXSejNBNHU6PB6Zk7DeNQRExgQEajUZENF5RJ/gOltumBJ0u5ScCNIaamZktkUQJjXhS8AFojnAE5lQVk4Me30REwwRPTj+GEBpEysyGLRGMYRgUxVBVm8XfGGMaPuxjIOtYsrSshyrtGTHz+OxoDBGfWK+fvl3S0eiczE88eV5fb5+Y2cxmQPDZXqN24ZBmrWju6GZBiDEa45ld4rKqroqqinWVpYlJ0v7C0tzi6mBha/3x4f5QhlUIwYeg1+4dPt7Z/OjupX/7w1curHaNR8ZwFFQ8MwBVIlWAOBAHOIKasaD3lNTzhHdUT65FFGEbiTtWGIUBmMi0JKVKLExgGhPJESAqwUclGGuShBWIUdlwbowCJURYG4G5wyj7NUrPh0W4fv3hhx999GB9IwiUTBWkDgJrrc173YzYhhDLqqxH2xTqTpY454iIIKmznTw7s7L43MXzy4uLy8tz8wOTpTCmXQotHWWbaCKTziB3rKSPAGaQNQxD42W/iS02XvrThpfplEIJEWq3nEY6HrCMhCGCECSIGmbriA2cgQI+YuTRteifyZ6/sGZ4bYJ/omBYYGcnrD/affBw/eH6xvbOTlGFqBSljr5s9hlrjEksJ4NYa137vd1iOCqq4EGUJC6Iv3nz2oXzK1cunRvMLc7Pdbpdl6UmY0mozBOTpDZLbNrxacflzkEkxsIZa9iSsioojvvcNG+uhjIY1FRJHuU7oNomsaStG4X7urkjOplfmX6h2ZuOqoj1NOmSY01XOu1wUAeuYeBp4r0gMc4Zp6Io6rr0kna6ZMwoqg9SeP3ks8cffnzt6vUbRR1d1rXcKYuqHg1X53r9Di8vdNaWBquLvbl+kltxQEpZ5lyaps45O7Zmq2/u9OnpRGOH9XhOVEmViEkw5/jlMwNPL5ZVdfvRpi+hbuGzh6NHf/nz//BvfvzmUj/tmURQVgdZmhhRo9oInAi7SI1DPInatNdNT73cOvESZtv9l8UbWKlNnY6ze0eqnA3tURu9b/wxdaGB4ACrkjRVCVBe7HXLorBpl4w5IArA1UP58//8t8MQrUDq0ob68oXzf/TO915ayC21ufR2yoNno3RsCs+obH+/d8XX8I+mdYaeCKO2O++xT2mTxyMalxwRRBGjGDbTqGwsjKtMkVSmia7QFGQ2AbBGVzlG772qMhmT5PTkFvUl8ZQ2r9j8pinWbR3/DpXxmaqIsGtydzK1vjf1T43LIGgymBpVVUDGpiAzqTbV8X9EJzi7ZAKa6WRQuk1bjgtUj52UHvsxz9KjNKvw/MaaADUAwElhpIjRFp4Ph4XffWAefIAH79vRRlSJ88/Nv/qTznNvhnzR2I4xs8aCr3+px6ivadxqTAQhxOBjjLGqqlExGpZFWYdaqAzihTzSzd3RjTvrdx9uVV5d1g2qUSKrX+y5P/nh23/0vRfmE7EizgLiJQYYy9YFsJcWexjSBgg+eWfTyVU6KmqB17YsvflnCAbKpAyl1hcZL+MhRpCaxIAQopRVLUwuSSLEQ40xTZV5GfzG1qOr1+988sXm/c1YR1OOiqqqjOHEJaLCzGxtVVVN+Mxa65yzTL2UVueytdWltbNry8tLc4POXJ87KWJEjEgsLLcO0XR8i8d+mUZIhIoyqWFSFUCZ0IilG2aCoIV51KzYE3B+6l4nT2tM14aHBqoCAoOIwdSkc46EH0RbbERT9Y0KCLV8pM2QTfa02JCUCqoae/uyvTtc39h48GD90ebmzt5eUZS1h/cNsLYgKsrqsChF1VgDVmaB1Eyh20nOnFm6cG71wtrCxXPzc4Os3+2micusSa11RI6QMDtjDbjpLISAyAJmgiCUj7YXbRsUhTSOr0qzlRim5BmrPMdXoPGXiZok8hM0GFPZZqbjWxeN84TTPiDpaf6JAk0vp4EyvMSi8lkn86q1aCQqqur9Dz/5h198dv9hADKyDFCMUTVmuV2c71w8tzw/lyzPZ71MLXlLPreUuryf9Z3LkyRpwF4T0JncYTQVPm5ONgKAGlVWJdXxTk4SNVhXWxyq7kW5/Wj4/qdXP7n/0Hfmdw/3lwfZINE/ev3lP3z+YiK+68teU/xKFmyVnTB5ggIpmvv9ZIz3aTs9z+hBvmSK6rSrNc7dkU4kNgEaF4ITFFaUIkAKo2qiaN1UfpEyApHrDivaC6j6+qvPd//6N+8ehnLpzOLjh/edxh+8+uqP33r1Ys/1iFKFUzWtxwwQtyNKihl96wz1/d5Rnz57PHwK9T1ZODXNTUWQtp5EVY6ycAQgRo0xJokToeBjCAEgY2yaUiOhSycKThVNtSU5Q6BYe3a2RWsRiFBtGdhVIAqJUEgMcvo6Oa7GpOPm3NFUJHMUmox1C7WYMc5TTkJFbd/c9NcE8bEJLY13CxoHkXAMsMk0wpuORI8TgGNUfGIThYyb/U6gvtMLbjEr8pyhvhnq+2dFfU00q0F9RIBQDLH2vvJVVVWjshpV9WFZeyHYtKh1Z798vHu4sbnz8PHufqXRZGmapOzjaO/lCyv//s9+8OqV1QSgIDGKMWSd8VFDhLFsWalZ4MY+3tQdT0+swBopBNSAjCvemUAEHqM+Q0qYQn2Ro8ALiQIgB7ITIpZK8Ghv9NnVO59+fu3hxmZR1165lGwYUoXJnUvSRMTHqiKJkKAaE2f7nWx5aeHi+fNXLp+7eL7fz2EEmW3zO6LwERrEGmTONAX5qoiiEIHCgCxzm8ejIyLKqc1Faao+S1RV26qKaUfiVL9q3OdzOkkWgVSPqDa0gR8aNfqGTpSZRSHa1KwYaQTXdZwcHKslHGVg6QTgbNFjVNQRwxGKUrb3dj6/ce3zL27cvbdRVCFELiupa1UYNs4YQyCNkUjTJM3zNE1Cr6cvPH/x1ZdevHjh3OJcJ0/gFEaRGiD6ujiwrFli2DZdnCliNtVu37aLawNgSdvI5TgJYmBMEyZ4VtQ3Qb4t6jtqkWrR0JQgPdo+tid9DT0mpnk02hwjao8kBbGKRoFXqlUjq02pBpVBdw+rzz6/9t4H769vbknsVr7P3GFSSE0a5/rZc+eW11bm+x3q5dzPkdpgUCdO8jxJk66hvnW5c66BfMfCKccrhnQyw1SpgXzjk1NAoiJJK0URwIkWUW9vFv/lky/+8db9ufMXdvbXDdVdE18+t/IffvTDNeWeSie2DfhKLEBtGNSgvun7mjA1nZ6MupvZBv9VYQkcNe5pE5lQmpTCH+O7dQobmieimiAcVIVBqlYCjWoynfRRLf/X33zw/r1HtLhErLpze2Dx9quv/NsfvrGoAGAqv5g5q2P0PkZ9Sm0/9gz1zVDf7zsW8uyoD8fJX/TJaJSMPy3t68RRKQYFYB1NmEpibEppdJKKihHRU+pAAeIRIiRq7X1VllVd7+/tEfPhwcGDhw9HwyExj4aHD9c3Q6UKhkKgEI0qGkWgPCmnPnkCccKzMs6/EYAYApicsWme9TqdvNtJk5QtPXfhQponWZpmed7NO1knzdOOcZz20KoLKzXd6RoRANvRMTP3sSupLRXZCXaWceAV0xiw0bf6EtQXTxshOl4I+lXtTDObob6ZfY118pjO8rhFuSlapBiiqAISYiyqclgUPkrt5XBUF15gEoHd2tm/cffh57cfDWOSd7t1OQrVIcd6cdD90ffe+v7bL51dSroOBiAlEmUgxkAQa59sguBjqG9q/Q0soU0+KUMbL/uorUQZMJPAmgJKGhFrDQAbdrXS9n5x5/7mR59ev3n7XoSro6m8VF6ikhKTTeCsiBiCSqiLYWr5ubXV11996YXLF+cHPN9Faidl60SAaQhlCAB4XFNVVmVdFmmapEli2XJTnxkjgQy7FkKpQCJp008NYgZNjYHEqAo2xthxZcQpg3Vq3BJ6ssaz6QokwpggEyKqIkyw3KDP6WtO09HSNovF1LKQaYtvRY6c9SiIEWRgxvyPURBUPbSUavtgf29/tH9Yra/v3Ljx4M7dzYODGuqIM2MSYywLhxBDrIUq4yIQSLXfzS9duPi977z+1msXlwbQgDxRAxAiawWqGYCmiClgmnQUGqRHDRiTJqIpYAU1yoIMuK9RHqJ6lCScllA4hvowVYU8lkd5AvVN52PQAm6ochRIBDFgVBHJBosArQV7Fe0eVh98cvO3v313fXMzyzJjuPbEbs5XwZGuLM5dOre6tjLXz0xmYq9jEQpLoZvzXD/vdjNrCeoiUjaJtfYoUDuF+o55p1MyL+N0aZsxaoNAxkbYqKQOIloo7o/CT689/NUXXxRaF35IpINOcr7f/+/efvv15YUlRbfBJKIeopYMmRMMszrtBdCxeu7mGTPb4r8c9cVjbpFOIDuxjDVFJ+loq0hjs94EZVHb3i1RbQAK0X/46O4vPr+1p/ZRGbYrWRqky3H3D9944buvv7yYkFVkUKtKPmaWpwaxRX0KNTPUN0N9v/f7Qp6OHo57mASoahj/TUdhKDpN+aclTDJRSEQBGENQ1DXqWrtdiFAMiBFVhf39/c3NrYOdg7s375XDqhgVZVVJiD4GX9V18JbZpQkEZV0Z4ryTE2g4GjEciCctcA32E6hlcyrqE/HTsXI6xm+tJAoCkyHTHFPrulRS05b4GzLE1JZUZHm2MDe3tLq0tnp29eyZpYV+1uO019zW4+MfpfOeFExqtkMhktMydXw66qPwFDkHehoTz2xLmKG+Ger750WAR6hPSYVUpU12aPS+ruu6qn1R1Yej8qAo66AC9hFlHUc1X715/+PPv+AkHywul1GHo8L78NLzl3/8g7dfvNg/u4AeIxMYjbEuwLBJ+pSwHIP4JOojDQTScX2nKrUrzDgvQxRhJuIKERCoAQ6KcP3W5mefXb/78NHB0BNnPtLuXlHWxMYxJyBnE0M0jPXjNMH5tbXXXnnp+csXVhbTbkYOIEFiyBmY5ruiNkwtZCEqMUZVZYCZmBteGFLRECWGYIisc8QGohRlvKRRW5vRUNDohJP4mAQskVE9CfkAnFrkOQVUTpIfa8ucePx5FdJjK/YYPI6R49Qu06I+UYC1SX3RuBVxHN4TaT9omv5A+BoFgKhm5ONwKD44Y7MQ9P694Rc37n/++ReP1rdDQJrmWZYpURm8dY4UMXoVMVADWVnq//AH33nuwsKFC71+X0lVJBiKlg2BCMJQRkMgcmzXUFiFGU+Rpq+Svo5c34maWToN9U0LFTTtpk9UeLaJwyOKlGasGBEaoRA1lbC6tFLslri3UX78+a1r1+883tp1LolRRqMhAzaBj4cXzq1evnB+Zb7fdabvzCBP+lmSMCHURJrnab/TdVmqqlGFrSVzLGpwrKrzOOpr2VsmaWOaQn1RhACyRE4EUcAWJeuj2v/s2t2ff/BByLPapjuHh5nN58j9mzfevDI/98KiW0qQqLJGpsgEEtvQlE7l8OmJiqoJSm6ZjWb2VNQnJ8avRX0t01Wb9GMZRxuord2FYQLgFYXiALQn8p9/+cF7167ve8DmvbnlJMnr3c3/5c/+4PmV3pylENVC+46tqq+KzCXt7CYoWKgZRzWz8qsZ6vuXAfnky1Hf+Jko8EcKOg1u0qaCqK3qHxPEHVX06zhC5Uvs7pYbG492dvZu3bq1s723s7MzGpXjoBqFKs71lnwpZVmKiDEmSRwxQxElEsDMOm6Va5bmGJvKK8NMaASelAAVmbREH99ipvfpqYlnrWtY4HRc5S2iqrHpGBkHJCf1HdrAwKZrsWVUV1WKNo1pzy0szJ85s3z27Nra2tmlpcVuz9j0OAgd+y1KT73i441Hjvv5+FLURzOUN0N9M9T3u0Z9J0PxR/RVUWIQkRBC7aOPcVTWB4ejYVHWQZQ4BCoDbe4OP71x7/aj3YpSSntqXF1VvcR857UX/vDty69e6AwMbIiGhO3UuqFPULbTxMPm5rdEHbNntK3HSq2jI01LkpAJ4NjmfVB53N8YffThzU8/u7q9syvKxNYHjRGqFsTOZcYmIUiSpOfOLr/xytnXXlhcnDO9Dpmm4F1JBQZIDNovafI10mCcqKwgw2gqMJssHKuIiDCZJpw2dsnGLMlHSIkmMG9yCURV25L5Nhh3qgdxGnhpCjz11OJ/PX6Fm1IQEZGozEyTwW4OK2N1C5oqQW3a1lVBfJQVbL62KZJpBOLbWKCKSkAdqBKVGElgDWcgW9WIEcYiCBQaAra36s+vPvzoo4/vb2xFyo3LCCRRCcYZRwBRhAY2fnV57vU3X3jrzUtnV9pfbKAMMRADtYhmKs/b5n7pKP3boohn3UN0HDqY0gPU6T1oGvU1fRHmNAI/ba8PjqM+QDTG6NVYgYuwo0g3Nka/+PUnn1y9VVQYjbwIUptaZogmjpeWkpdeXhr0eZBluTEJISPkhlPDvTTvZHmWddk6ATeNFG329fh9/STqO4rAHlV0KkgU04nzpuOXoMTkmvqjSjQ42o/xk82tv/rV+9e3DtCdU858Hbio3nzx8k9ee/6VVTev6lRsLJxSYrITqO84AnxinvNsx/9S1Kc4xnVMgmOq69QGI4ib5pmG1s+hLfkeRWzV2PLyf/7FX2xWdbTcG8xXo2K0vffK5Rf+pz9657UBKJKzyKCs6ovKIiZpNm79GaM+bqu/Z6hvhvp+vzeFCETHnfNN7wqDCGSIQSQSNUrDZwUiiWFUHXTyrEmvNbsOgREZzCRT7Sce5ZDKor537/6dO3evXftiff2RiDibNshNRBuSS6CVxFUFhJ3NVUnGIryTvrvJ/07kH8boCyCBEkhaejZiokn3ximoj6Zj9jiifbPWMhtVDcGLCBFbaySiIW8WEe+9iFibJElS1/VxL7DldGE7aWOUcbUINavK2tmzL7/y4uVLl5eXF/OOSRJQ2kppNU7CtMNjXLP1xrZlIEbRALC1DkQqLSxsqanGhURNwWpTeEJfY/Oe2Qz1zeyfNAQy3ecspM3CJSH4GEIUrUMoq3pU1kVRVpWv6yBiA7vHh/76w+3rD3a2Rj5ySsZK9FKNzi/2fvL2a3/4vUvnFx1HCNQZZWiIXiVaawyxStQY2RiwUUWMAmJjLMiINjoQUAETjBnn+wBheCAAEVQIbq8//u17V69d3drbQfAcpW6IUpiFSK0BIYqEuUHv1VdeeOutFy6ey1MDR+gS7HgZbXsOWzg3/ptkAp+EVMcaBlOZC25Ylht6Dzrmz8qRAtwxr3dCZshyvJuZ6Uj2+qvSVF+G+vCkhBE1SQHGsQqKiTSiHpW46NMIxGjiWcZwqNMAACAASURBVE6O2WTDdFzVOOkjHEvWUduLRBCaFPipKBR6UMRrt/Y+/ezmjRt39w+q4I2IAZyoiVGyTm6cqesiij97buW73331zdcXzy6qAhZIAaMCjVbFEhCUj+Q9zPhqHhurr/QgREIMNRsybNvL1fS7iYqosWwMoKIqqkJMpAwZX2Zj2mFteHuaUaaWaKaZTwHkYSOh8PLF/b1f/Objjz6/eVhomvejgIQRhaJmiV1bWbl04ezykrVmq5tqnrjcmoyp51wvzbMkNWSILNkUxoIbrTxw07H/RDTn9Imk4/Fq9lhSgU612U/Ei4mVm9C0UvQUIrmR8O398h8/vfnujbs7HtwdBJIY6jmnr5xf+YMXL72xPBgAqSqCWG7lrKxxAFQl+mCT5DiamXyrnUV6vyRCJxoBGGoI+qKvSmOMSZLmtXbBJgNriF0g3YFnJArUCh/19rr/5ceff3j7duimYjhoQdEvZe6tKxf/4NXXr3RcB0iaW0eVG58axwjblaBoZgQDmKG+Ger7PaO+3cOdJHcpJ019kqoAbIjq2ls2bCwptXknUV/XJk2IELz3tTC7JLWElvb5YEvv3Xl448at27fuP368OTosYvRZkgBCRNZaaxMAZVnVVZ1lmYJUxlCTOU1z59zh6LBN5DG31ZREAL344vNZnudplnU6/W630+t2stw4nh+4NtbVBCkNTAOikqdgnnDcBwAaCdi6gBIkoqjq4cFwVBYSogIbDzcrX1dltX+wv7u9s39wWFW1qFg2RMRkMZGeIBAgtTzRcKdTPOviay8aEuf6/UFv0H/9+2+du3jh/Llu3mMVBGm2JPgqqoEzqiTcOB5thZNRbTOc1hqayFyMY81E1IDq5sI20hizqT5DfTPU9ztGfQI01YACQGOEiqj6GOval3VdlGVd+9GoGhXBC1VqR2q3Dv2djd2769s7+4fKPOh0LCSUh8+trf7xT777+itne6k6QFUg4pggviiG1nCWJAQlNkqmCX9FEe+Dr8TZJM9zBaKPYBhnakURIATjsLlXv/fJ7d9++PH9jcchsmo/hsxSYpiYI7SG1NDq8qW1H3z/jfNr8yuLSZoQEwzIAamqbYXfTyQhpmPq00ssSRub4qm3ncBRR5CLpglGCdNpzEmsfvprzFcpxT0l+K/P/IFWxvzop0yrHgDPdrQnszY0uYc1nPJe5UYNILb/2j5BUk0ikjLgsJBHm8W1a/ev37i/tVMIrFKydzgsK0/WOWfVMuCd9Vcu9H78wzdefnEtt3CqHQaJSNTMGEcKiMQoviaFcQ7Wgk5WDn+pUx2BqCotSwZYxlU/3PRDYpxjbkAQMSs3BNlHY0ymiQH7IFVVEVGapcZYAUaK7TL+9tONDz7+/MH65rD0UUE2t2yLokiYelm6urRw4czK8sKgl7uUq8QcdBLtJC6zJmHOnc2TLLEJrAVITaJslSiYdkDd1/HBm622JfJuUN8Rl8F4Qo7r+QASxDqW7FKltBQ83A+fP9z64O7969tbh0yelUlyxrk8f/nsubeeu3B5IUtCHLjmptYQQtPiDxUmYujJvg8iGPvM4/Vt829bV6i5fRo6IPXeMBvnAG5CKTCJwkB1WBT7wafzgx1EQ64W/fsP7v3i/U8PArjTG8UK8L0EV87MffelS6+tnVmCWvJdTay2Hb1j6qJpTD5GfTRBfbNo/Az1/V5RX9RaEYOvVdXaxLAhMBFppIZQhOIET6BNMY05XeoSD+7tffLR1evXbuxs7akyIvsg0cMYm6XdLOOD/Q2CJ0KMscmPOeecc3VdowlQG5OmaafT6Xa7WSd5/bsvZx3XyfO808nzTpoSOyIeM5hMRC+ndYYnoROaaiiQp6tw4kjxRgE0J2gwkX2afmc7N0UhUA8f256O4WFRVuX+7sHm1taj9fWNzUc7WzvFqLbSIbhG+GGq/weqygzrLLVEphFAgKbdfFSVta/6/c6VK5deeuXKxQvn+oNuf2BMSu1iPibXFgHIkWlhXF0H74NzLknMhPCu5QYea1exMTPUN0N9M9T3O0N90oq8NbSZY9TXrJkKVZEYQuXr2nsfpKz14LDeOxhVPliXKNud/cMHG1t37q8fjHwgs3tQBGWX5r35+ZdfuvJH37/0wlo3JU25qdNUZxDqgkgTwzEGAdhYZjOm1tIY6qqumF2S9qKaUkkJUXBn/eBX71376NPrO3sj5ZRdoqAoMYQ6xopJB73O5Ytrr7/ywksvrM73rSPKLRjEpNCg6knEkUnIjtWveBqvjfWujtNXPoUhmqZ6uk4Yn2yko5adBicIVFqv3f4uUZ+AZeo30jH4NwnlP7G/PPmBo13leMe1HA9Ejk9XW3V3UYpK0kgECKBwgky06Z1EWWNrP+4exjv3H//jr989GFWlD7BW2QSJVe0dm65ND/Z2zywv/viH33nz1eeWFtB1ahWqlJImHBgB8NCAGFQNJ3PPrKLcdDFGVVEBYHScd2rKT0S1ETkwRhWiGqlRDWz7PsbUimy1VT1v646iYFjIsKjvbVV//curD3dGu3v7qgIS76sQamdwZnlueaG3tjq/PN/tZzZPTOpMbignkzvXSZw1bFmdIesMWQMmGCiZhtMmtFSwlMCYZ5892ko/jfPaMtEWHrPmNl211NCACJE0KdCgULKWhhI/29h+9/at3969ech2RBQDo4pztntl5dzrF1Z//MpqzsQMo3Dj6c0AQxnSVvK03ykghv3a+orfKtTn1YsGAhwZPoouNck5+CBRGMaSpf+fvfdskutIsgWPe0RckZlVhVLQIAACJECAINnd1K27d+R7+2zN1mzXbM12/9x+WLN99ubth1kb8frN7PQ0m6KpoBWhFaFLpLj3RoT7frg3s7IKBTY502x2szMMVigUqirFjevhx/34OQoE1QdRuiLvfHLyvbMXK9uqOC89tfJ2HPT3Lswe2bP10O7ZvXN5m6JFwYgtbZNaGu/ar4UurFWshpWvkb/oBPVN1jeD+nzsKymDeXiWRy+hDFmrBRAFQlAQYAiCWGFlGdeu3Tx54tSVy9d6vb51ibMZwayu9qxxiU0BjkGrqvI+Rimy3CcuMpla5rrT6Wzbtm1ubu7o0aN5nrVaeavFJmNyjR0vET1Rv32KCHdNZrIAxca3YU03bjNu5/jM22gYY9gmkxiJiWqq5UiolA3isHzDPFQTB0ZYkYZ8D21kAnoPUa5geXn5/v37dz+/e/fe3UePHvX7gzxv1bi3hr611DjYkHECjdGLBECsozRzSWo67Xzvvj3PPX9g585tU7M5u7VKuQ8URdN0LXXq9YosS7kWQh+iYh0SPSe8/wnqm6C+r+sSNOXimus4GmIa6jNRU36JMQaJIWoRuFeGXq/b7676qpIY6gJ0UeHi1ZsXrt+JtlVx63HPV+SIab5Nf/bmkR+8driVMkNzA/GeIZkz0BCCVygbo8SiMMzBF0B0LouwETbA3Hvc//TU1dNnL9+++3ilWxCSvDVjbFpWVVUN2BSzC8m+fTsPP/fs7t3b5jouNeSaiSeIVNEPmDWz1hKrRMBYTrQxmFnXgmskideYilA0PvEjP4NNm18bUBKvb4bpE3/WQcSvF/XV2Iu/4Gn/u9LtkZSmrht+W0O7NcOUxjXgTYxmUFai5LLcMAVoBIKi7/XOo/7Zi9fOfXbx1uefF1XlkraRVtW1c1sWjKFu9xFRPLBv92vfOfTcgbnZNgyUEFkHCSpDtUl4QtT58qhPNIp4ZgMYrfVia+vC4etgUsMwNZTVqDFCYQw33y8aBDKUkylKECPJ0R/4s+duv/fBJ+euPKzc1gqOSQiREJyT2elsYa69a9vM3Ew+O50nJiAUFiHPkqm007Ezmc0SZ52l4cRW/Whx+E5qhIRGVccmSM2Xu4w1wTOscydeN2lPY5kLNwRejsSsIC/wng2rNYFxp+qfe3D3g4uXTt+44ylvtxYgSbnqXbGyZ4ZePrT/xRcOLbRTVYSIhJAbJHX3V4RFzIhDWPf6JqjvaahPpQgFGViqmVGqqjGqKqKQTdIIBKBQFLGWp5D3jp/91w9+sxRjvm3nYx8Dkixtxe7glb37jz6z6+W92RaoImpYtk4yTa3mpPaJkDKmXkvj09/MZCaXZoL6vsmkpTfoutRaskTsK9EIaywRURgWRAJ6q7h5/faZ0+cuX77WXQkhai1yDZBIrCofQsjzvK5tM7O1ztSiWOSPHn12bn5q27Ztc3OznU7LOXKWyKLfj84alxHZelxvWOVL6ugMqEiMNU0R6+31xmbl60qpDFHf+MlsNssFaJ1L+2gcDwq2Y9Y8Wmu5gAByABBjDQKJKAYJIdQdUSIzJHgSwBBWaRQVNEJEJSKKquL2rQcPHjz8/PN79+/fX1lZHQyKqqokoKy8YWedtdaoxsqXvvI+VFNT7TRNiBQkU1NTzz777OHDh3bs3NraYslAVEOA98pMWU7E2jBOhoSToQhC8zQnG32C+iao7+uomtVz0Y0LGoYNixH0aYQ/NEJFJIJ6RRj4yNBYFYPV5aK74qtKFV7Iw36+VJz87Mbd1VBStlIqGZdbSWLx7J7tb7127Ln9W2dypKzqg4qmjhhad/KDxhCjqDJZGFOqeuWHy+XxU58dP31pqVsVJcrCp0nLsvWDshoMZjqdfft2HHlx2zMHpqc7STvNE7BClYQAVliwA3OTyCpIVaDgxntqrYK2DkjpeoBVoz7WL4J6uinqewpQ07EyHmqKxlcTsFJd9zu++CPrF0HUTf7vtwJK3nAHawA81WWCRvW6NthggEBmrYm6ljANy55AJVrFCEPkbC0fEhS9UN56cPfs+QtnTl988HnlsCPGpApemNLUpZklIwtznbffeHn3zukd8zYHjPooKyQxMVli2l8N9Wk0zKLGC4kAXA+FDKuvjWNfNBSJoCJQJTKAEeWavRoAYTIGQfBo2Z85d+fjT45fvXYzwuadBTGd1d4gVP08M9vmp3ftmN2+ODM7k7QThRaOYysznVaSpsYAjvK2m7WUWAs2NJy0q+W5I5Eo146JGpuZeWeR8Zd7vUPUN07ppCd35XiBQ5RDZAOkVE8CehUvjGjtqvLton/6+p3zN+9fvrO00gtpOj3dSal8HAfdqVZ++LkDLx95YVfbQREUbQOj6qKQigUcwRDXR/xEwu3pqE9FI4hr4oX3EpupO0OWC1BfwYyouNWVj06euHDus7Issk5nVQLSJJmaWl5Zmc3yn37vtSPbt8w7zBCltUIxKo8SUbMNVZI1V5dRjNQR6iOgTnknqG+C+r6x+0JUAIpBCCO1SoQ+IeLW9Udnzpy7/NnVx4+WVVQjqlIAC2ImAmsULxKNpayV9vu9JHEzs1M7d+7Yu2/3zp075+Y6SU6iZBMYOyQr1nMbAbBKI0G0mjNat9zI68hUk4iIN4AWAqRxxxHV6Gx9P292bNMmvb4oEbXWMa0FBgA+BAxbcMw0tIKQUXpHTUIyPEaa5zISLFURgiorNyRUWi+5p00/MFQoC11e6T9++Gh5eeXSuav37tx/+PBRVVV5nqdpKiJFUTQpQv1kyDKTiAjijme27n9+/9EXj+7cNeUceQ+AjAGbtVmToX4pmHmC+iaob4L6vm7Uh4bZ1WgaY8Reo6YhJsPrVYYYQlSJsSp9OSj7vWLQL6rKR/QrDKIpNb18++FnN+8NPA08QoipsaEaZI7e/N6xH77xwuK0TY3WnnhMUEgjagUScAC6ETfvrnxy4sLJM589XClh8qhkbWqtLbvdBLJ9bua5vbtfeO6Z/c9MdzoACZMwjaSLRVXFR0uUuoSJNWqMkQAmBhtlM24bvyl4WwM5w17fBoSkG/T11jLokbjGJr9W135wDCXiK5AZ9KnP9GmYblMcx18IDJ76n7WZw9iRpIqoDfyoO2X15GBN6KsVVmhcf54j1IMAMoBDTbD0Giv1UYMASsaYlGG9yOqguH2ze/z4zfMXby6t9m2el4qlbtckttXOrZFnds4fPbT3xed27ZpzDmCJ0NiyyVfw61MViBKJUBAFMTGJogwqAWlKlgFRCYFJnG2GJOu+OLgxn41AFDxYqT4+fuvEibN3Hix5AXFi2AE66PdaebI4N7Vz69z2hZnZTpKaYNlnCaVW88SmmUsSmyQuSVPLCcQZco007BprtEZ9ShyJBCRDm24LZPRVUF+sz9YmieeRRvmwxa06XgdRZkGMakidhWrwvgSBXdL3kVyrJ3pjtfzowuUL124tDbxaC0PMIFUKIXfmmR3bXnnuuYNbOynBqTo0Kqhm+BjOTs73L9qgDRJT9QFKxAYRiIqlSGxRqF643/vwzJmLN25XolmaUtQQfJJY8QMDeeu733n76MGcaAsoA0xQIwGOQcM4adNRgW9NmImwNgBcMyHWBKcmqG+C+r7ZxFHUVwKBscxK9+8uXzx/+frlG59dvC4BoUIsI5FNbAJwCNE5U8UqVqUgWMcz89P79u/eu3fXwUP7kpSTzLrckmXiABWJIJuAyFcofQFRtpw4YyxD4tArNtb8FkN1FbmmK5CoNMhOVVVHyiW0xmwgACH6MYcGrm12m4+bMTx/617TZpxPRUQRnSWiuofWjAbHiBhj4tIaHaLx6Wp6jUSh7pNGVRVEUQgEcCYVZSgME9fgUQBRLYGgVQ93bj+6ePHS1avXHz187H10Nu/1+lVVOpcmSa5KMUbhmE3zoFrxvpqbn33hhUNHjrywa/dCltsY1Dqwa0hlkDj0/OPJ8PAE9U1Q39eJ+iIa+gGvQ31DIDNCfQoQImLwvirLKsQYIkofB1VY7Q56hRdYZQeb3b336Oz5C3cfrfRD5rmdpy2EIg6Wt81mb33vxddeeXZx1tZ5Z/BRIdayAsu98srt3snP7l+8fPvRaj+apAzaKysFynLgWF58bu+rLx48dnBhxyylIAoKNFnjuGlCzRRgUkWIIQD1eHB9WNeEuRHQqi3gNu3zjbIc80RfbMiwGE6/jKFCM6T4P/mrnmwo1k+WvzzD7atN9UFZ10nXjOh765X0+UnURxu7khjyYcePJAjID7VtRvxA1qFC6hDvjVCf1Rr4RYkVO3BqFVEkSIzWJeO91XoQ0AuKqLfvDU5euHL64rW7y4NSbd9L6YWA6ItWwvt2LBw79OyxQ3v27khyRkpfgYKmKhEiChFSMAxVPt66t3Tz5u1+t/vMM7uf2bWj0zL1geoMBCYOi7JCqCIer8Z7j4qrNz7/13c+WB1EH61NW8qJDyJRWmnYPkdb5/Pt87Oz7Sy31HI8ldrUCFRmp6c6nSmBqXwUw1mWJwmLekCUWMEEq037VFVhCETKtW9lk3gwrAXMl948TcZC9fypNnr8a/7pVFtk1vZWygqnpKJBvSdEA8AYGANEr95LJWpzFxj3iuKXJ09/cP5ylc+XChI1ohx9Ev1UYrfNTL/58ktTaTLfzre0kAFuKJebTiQ8v/iaRag0FxuOBBgoHg3grRy/dOuj8xdvLS3HPOO83RcdFIOZNLO+mmJ69bn9Pz62f5aIfTWVGF/20iQhNRoEwoaSOtLXbixrlIQ1grpCdVh5kLX4R26C+iao74vzOhn2i3kIdei31TI3nlGb1TdrSgmpB6KuLOuFCxdPfnri6tXrVemdS30pziUMG7xoiERsjAOkCL3tOxZfeOHQoUPPzS3OJAklKXEOUoJt5iCIGk8/JeOjBTlDpNT046AxIthGlUXrSqc2Rj1WglEYOyz46rDjxsPPRy9sTbZkdITq8HsIm2I+BdWVuvqYpTE2loRmLpCodudUorrBJ4AysQ4797Q2uUMj1Cfa4DiiQskzuK6/K4jAtY1CY6DVqFNDIqLXRMFKzWAQVIOWffR7cuXKzQvnP7ty5Uq/WyhYRIkoTZOi6rJTYvbeV1WRZm7btq07dmx99dXvLW6dm55JTMJQxBCJQJbIbDBwkKGGAMbblTpxdZ+gvsn6N6K+keHNGOpbH5NlyCwQXyCWzEzGBqVBJb2iGpS+8hKiVl5WVrvFoLDWAfj8wdLJyw+uP6gi2EESeK660xl/98XnX/3e0V07Z9OklhNEJbj1+fInJy6dPn/r3lLolxpFyDmbJMYYZj16+JkfvHVo+xaaScgJjCIhtTWJQVhHzlJNiILGqKRsUdvjNYPUqgAT2zXUp+OQdszPYPQVsjVNcfzAB9A4EQz1OOu5PwKvR31P43Vu5IR+TaiPoLQ56sMG7Dfs/axNfG3aDd1wKCkgML45ssZQ34bNM/a0OURU0Sa2HpODeFVhawSkUZmMilFhtoYYKoiEaOBFI+tyL5648OCDT09fvfWwCKTgPGuTatXvGpW9u3e+cuzwsee37tu2NlnPY1dsY9ZWe2woFAhKQViYS8H12ysfvP/RieOfVkXvrde++/03v7vvme2ANtMabLw0Tc+ixJ37xZkLl0+cunDr7iNnM1UGW4C8j9a67Vu37t01vXur6eQxt8ZCEmhuuZW4PHGtPCXYJEmMyyhJ12bsuar1TmvP+YZ9p2uaKM28Va0LQARrv4JBodYZS03nblDfONlzHPUp1EhEUdg0E9ZCtQKYE9vAfckdi2i3iBVHk6eF6u1B9d/P3Lh699GjBw8B5Km1rPBBfaDgt8/PP7tn1/49u3fMtToJEkUCtAhfKaCTbn7S69Pvgq/SHv/KoGzDzUt4ooL0xBNan9fq0290qFqJjc10bVu5VOnFGw/O37xx4tKlmCaSuIFoV8UDnKQpU0fx2qFDbxzavY2owzQDZfG+t5R0WiCCGglKmjCZGlIiaewVx1RbdCyA1F+WsQRrgvomqO+LVhAUgkhghW3M8XTtEI1ejQExxRgAYbZlIONQ0yKjrwkAIBpzVgcQPaKHApqf+uDWqeOXz5+/UJYDlzqQRvHEsKktioEPpTHkUjc7O7N///59B/cdfWmvNUNDhZEjwTDraQ4pWhuxUzU6FDYY66bJ2P29/kxVXuNP0r8lhPwW7KJf5YdHzuz0hTFynVJBHDfwWR+iaIPtEw09fcZ/7bDXCFUtevr40eObt25dvnTl6tWrD+49zHgLxBLIWhdjLMoCqq1W0uv3Fhbmjhx57siLh/fu2+ZaBgwIiKjunmoURSALYvW+MMYSUxBVIcCQcYZ4qEa4aeh/4mTUCUycoL4/cdQ3knPAsI5EGzQdMV4A1trRQetpHFFEgReJMZZlVRRlWfpiUBZFWZXBe1+E2LWdy4+6p89ejL1Bi9iFquX0jVePff/t7+ZtxwkHxs0Hg98cv/Hxyat3H6wSKLdkWKMvNZTzM52Xjh56/bsHd29PHbPVhqRe575rwya08VZuBhPrptEmMZPpaVmXbhQuB/EXRmYdK6bV5TgeG5fCZqhv45P5CgZzX43fOZJix+aPS09LVvXp2fM61KdDpt548ktfcF6Jrg0VrDmrj7lIDJFaTVCJta1S7SsSFYTVQbh5u3fyzMVff/CJTTvCaekRhJUsqc7PZD9548XvvLhzcQ71Bs0sWUACpBLrLExNS43KFZtoaoon5RWZVaH7XZw4ffe//eMvtOjmXD2/d+tPv//q4UMHhKQQUWsCSBSlx+275Scnr3xy6sz9B0sub7XbHfFVrAqO5VRqdyzO7t46vzg31W6ZxARnkSYuz5IsdZlLrGVnbeoS1KVXtmwMkQE1dWeFDo3OGWPcO1obgxjfol8h01hzcscGovEasl+b42o+VapFaJWbmfsanAJDd0LUw2YR8KqrAbcfVRev37p86+bd5ce9UEWbiDVVFGZHYEt2uj29f8/uFw7seG4G0xUWUqjWpsdqrROR0pd5mus45xAAYBR25KvMGwwoUTuE1PGK64a/KkfPI53Z2t/wCzInfXpCsCabsGa5LIByGpu40YhIMTYTcZLmvtG0To4iAMNDaqWqSlRVU5e5VSFBAeVOP6AbUSjur8qnl26cuHhuqejbmdyzRlIvoQo9ANOd9vZtC3untvyHQ4eniSxR0tQMtIbwTUe3wfm8lraNhXxdHwnGNtu4LTxPcqYJ6vuCIyooCkEcapUZwJDyyJtbRZlri7YACMHEJndvZGJJESqEskqdY6Zmv1V6/fL1X7/z6w8/PD3tdlWFIUWSpcRShr4gcEL3Ht6Zm99y+MjBF18+snv3rvZUlnUMMyuDNj3SaDQ/pk/gI/ry2OuPH0Z8hZdGT//2siqZ2RhLBBEpinLQ7/uBnP3k6qUz1y9fujYYDKamZqampkQwKPoSo3OGWX0oraO9e3e/9fYbew/vTKyNCjaAVaj60LeOycCHylhLTYw1PqrCENUjm5s0lCeob4L6JmtT4Lf+3qYvDgoaVbXRK645eEFiFIkxVJX3la+KqirLqvRVWQ18fBCwoiYqf3791s3LV8ruyr49O3/6kx8cfG5PmmG5Lx8cv/xPv/7k80dF2lm0SbvsLYfeg9TE3dsXv3vshe8c3bNjPjWRDChzT4lE9GX6Ak+LY/pb4t+/JTh8veeFfrXnoU//LfTvf2TdXHPs6T+j69zuN39WY/+K0KBKzCKiotYYglZBe319sLT6r++e/uTMxZWBUjqlJmebWhZT9ndtn/nBW4e/8+L23MKqxqpU79v5lAZIVJOysoj6KAVpdGR8xT03tRRw8sqjf/jFp76syqX7W1I5tHfx+68eef7QPlgtAQ/qV7h2vTh55vKJU+ceLK2YNHN5W1RiVVmNc1PZ9vnO9tnW1qlsS24zR4lDmifWsnMuSZI0TZ1z1lpmbjjHw6EOYtOA3Y1VBzwNmv97zy/9MptmTL7xiUd6srZRV5JK0kHEnRV/5e7985/fvnLn84eDgaY52USRiCB6IiIHmnfhjf3zB3bO79i2PXMGisRQUs9NEvFaz7bZGazgWhch6kg7ofFm8Y2COgNKiHUBH2rJ80jgoJZ1giq01gxfX0mhITmZN00RnwiaWjuaK1S17vaDG7okQdQ0bPmxt4mgrq53NOYVYfgfBKOq/VgCYCaAlCkgufZQJtVTAAAAIABJREFUPj57+9T5c8tVwZ3ctDNxJCz37n3uLLVT3pKnO+an9+3a+fwze3eCZomy2nhkqDxBX3iXjV/Yp+ys39WGm6C+P4mUIiqCrFU06wJDXVFGPcRPpESiEuvOjhIJELyHwJrMsIFSzaOUim5eXfrgvY9PnDi9utxt5Z2pVnv58UqW5VniquCLsmtTs7h9YWHr3F/+1c9sYm1KSZuYaFB4UbHOuNQSfTHqm6zfxaXXteHfkeMfIlBBRX1fP7tw46OPjn/22eXV1Z5h0xx8zEliXeKMIZHoQ/mX/+Gvjx59fmrOiQBQTkGMlZXlVju1zgyKQkTyLCdmgINorR7zZEZB41F7gvomqG+y/k0rxtpOBcR12qKqsR5fjlGCj77yvgpVWZVFOahCN3AvchVCFYpef/X2nTvz84tvv/29qU7n9MV7v/rVyZt37pFzVQzdfpcYnVa2fWH26PMHXjy8Z/fWvO3IglwtXL8uQ+O1O3dy/35r8wdE1ajCzCoxxkBg6xJVjYIqohK9cmv11x9duHDlZreIPsB7TZ1D8M4Urxzb//MffXfPtowlOo5QTyFaToxJVVmCqqjhCCrLUpclv7Va/s0/njh17spUZ0rK1bmU/uf/9NOXDm8PoEjohXD20r1TJ8/fuXm3KqX0MajCWLBR1dSZPTu3Lc5MbZttb2knLSuZkcxRlrk0dcZQbfNrrbXWGmPGD6P1A/9/3NdLo/YHwSZOHUpoX3A/xHsrxZ3HS7/64MMKAJwxibVOlXwVQyzJBtXQyVt7dm47vH//7q0zHYKJmLFIAQc4hasdK2JUlbIqTeKcS4YITCFBYuSarGBGyFUAKCw4wXBMpDbMqvuBbDZAvmGe+pR0/snrM7TPKgE/alZzI8rLQ3RlxseaVLXX7xprTZISG1GOQD1QVBKFIRm9K/LZ9Qdnzp27fOvzJUU2taU93Q6qq8u9/mCVoqaMKWOf2bp4dN++w7t37pyiFsgKEMgkDT17tKMmme0E9f1eC8kNhWg43L1WYpUAEDOIVDXEGAFh5n6/m7VyRkJkoDYU4ivSwL/54OTVSzcvXbzeW6nyfDpLcl/G/mBl69a8318qyv7s3JaXX3rxlVdfmd+aK8jmrEJKalKM5EzwdA20Cer7HSf0NUob40IQEZQ4EIL4Kkg0NoUG3Lj+4ML5K6dOnRn0yxi1LMuiKERikiRZlsUY2Zpnn9335ttvHDi8mCSGFGq0LEvjjHGmNoeIElUFIK7lVvXJ6MwT1DdBfZP170V9MkR9ozQGorVsZhSJEqPW2K8oyrIM3V4cBJQhqBNNjTibtGcfLVUnT125cvVB8By9V5TWVK1c221z6LmDLx87unU2nc7IgCiKhuAgqSVreOM93QgrT8y+vrWoT1SCBsMMUZEoEolIYRRGyZYCdjqo9MqdlV+9e+bilZuFRxQbfezkDtLPXXz7zWM/evPFmVyBIoFYNaSM6KAWAGnQUFZs7/bpnz787L+9czKaVlGUOxbnjh7Y852j+7YtJoMiXL9999Oz5y7fuFMOymq1Ozszk6Z5WVWDquy0O3t3796+Y7GTpe3MtFNjEayGVsKdPGvliUsMEczY2pBsfJsSj9rtSUGRERgeCNAKCIpeCJfvr545f/HK9ZvdXs/aJM3bkmZdk/RFID6BZoSOs3PtbOf0zGvHjuakLUMdS5nRFDBN+7eGdKreA+KYnGFASKUBgUMjepCqpoJMyaxJGOCLzn0d8yzYKKwwJrswVkpWogLwY7+ugY0CKChCg4YQNdb6esqddEsN7SIhgALQV/SBQvXS9cenL126cedut/LKNs1bJrVdv8oEH7wfFCnb+ZktC53paWffPPLSlsQspjSfUBoAUe0pQoGFHKRPbqpJfjtBfb+3KLBhJqK2w5V6XLlRdY6i0KFaIzeqcjahQNev3f3oN6fOnro46IfuagVNt8zMO9vurg6qwrOp0nb39TdeePutN6e3ZmwN83BarxG+imxARBEhhqCqzqb0FF7y5K74HS5fezKMuxQCgJa9lSTJyDDUIhJ5ClGrUkXk0mc3P/zNiWvXrsUoictCCP1+f9Avpmem87ylGufntxz7zrEjRw7ObEltprXZQz39IQiNzbIxG6+vfjHqo4lG6AT1TdZXjefURO8606rrO7VpAmKU4KUsfVUE8SgGfhAqbaXLISx5vfmw+/HpKw8eViKpBKQkKZczLX/o2W3ff/3w3j3biEmEVNVBE4ajQOJJxdpxdMc12+uramBO1h8V6lPRWKM+VowkJUQRowoZNkkpKARsdTCIn91Yfvfj06fOX1VKxWuepJYR/cpz+7f97CevPLd3IadAUsWyspKnrl1bLgTElSCnrj74z3/3zuPSRUrZpdsXZl996bnt8+m1K9ePn/x4taiQZKtFGYti2oBixUydTmf74uKO7YsLc1uyxEhV5rnr5Fkrtak11rKz7KxJE1N7zw5dlWhDc29DAvlHnIdoEwsA1KStSrVS9QoPOMMBGERdKvzde/euXr9x5catz7tlNbW9MomFssZQlfBVO7WdxBW9lalWurBlZsfi/PbFuYW5uZmpNBUtK585lzHSZrpUoZVRyY1hBGigGFljzb5UONgOQJCRWAOB1wuDrxu/HVcx+EI/zGZOLlDwoNBMyRIUtVc01BpB7a5IjeEHIMqroKCoDT96ldy6/+ji1es3797vCyolsYkaVykKH7wEi9DSno2VRmkn6b7de44ePLRrYSoDFh2lSibAFJoDsEP7FEebhsNJfjtBfb+nKCAbuy71TaHNKHgtHAlT09shBCGAtMKFc1c+eP/Dc+cvl1VsZdNQFmGoCZ663SJrtd/43mvf/9GhhT1sHLFhVBpCgCFmjhpcloA0SBlFQLDWDCVZDGGC+r7+Kz+8Kep2n4jEGFV8kjKzkiIGQiSuKZsgRCipiHSX9eKFm6dOnrl69drqcnfrwrZiUPb7fWL2voox7t6948WXjr70nRemp/M0g02VDMC1Bo8OTQ43FPNGuj2bT/xNrtcE9U3Wl0Z9tX6KDk3D6vt8JMlBKhyjeh99FRzZ7mp/EKQyyfnb935z5tLxC9f70bp8C1OaMNpGDuya/dHrzx49uJhaqut/hslBGUKoWMVAiXSotjXSZazBnpmgvm8x6lON9aZTiaRijKkVp6EQoSJ4sLMuq0R7lRDzQOInl+78y68+vHNziTU3SLIsMVRkrvzBW0dePrx3z+IWVjWBrDIEMWpBevHGg7/9p/c/+7wb7FQ/8OzcwsLszOJs+9aVCw/u3yZGJH3UHViXzHayNPQWpvNtCws7ti3MzXSyxJAGQzKV59ZR6pIsT7Msdc4xMRESywT9rWSi0YnJ/Ee7mVVVoy8GxjKzhalNODSCRbWQqNbVtPBCtZBYiT7s+3949+xyv+oPBiIhcQ4GZVX54K2rZ/SpnoKryUIt5948dnShMzU/O7MlQwZwoysDO7S5MBADaYaIEFJKnsz1Nqv//tbxW3pyg0IJAaCG16k01B8CIkGAABSqZZAgMUIrNZ8vV9du37t27drdR48EykkqoAAEAGzJJUrwQSqRJE1mHfHDOy8d3Hfk8OHFuU4KSpgykFVEj5SQGrha1lUAjdCoSbKu6P0t2FcT1PfHh/rWOT+FofJ1bR5D0KY5oxX6K5IaPn3q8/ff++D69esxxiRLRKQo+lkr7/d7ZM2BA8+++eYbLxzdZp0hpeXVbnvKJnm2PnuXoiyMY8M1gV6b9qKPqctookH09a8Y42aBJgBViBVE2TgiR+RIGCD1iADVfhwivZ4+ftRfXur+zf/9X/qrgyzLmQxg2ZgYY3/Qm57uHDn6/BtvfnfH3o61KAaVIdiWITNSVH8S1NNm0X+yGSaob7K+9CXT2tezUVWkcYenofiCKqtSFISgVemrIH3PH52+8u4n528/KnuRxZmoIXX67J7F7796+OXnts2lZCJZqHGI0KjRQC2T0QgNvuiDKM2zsYyNh1L2E9T3rS4eQmvaoEqsaX3cDPpDyZAxMSKKkM2UqAxx1Zcma91d6r730WfHj19dXQFpatgyeZLVV1858OZrh/bvnMoACQrRSsyth8U7H5/5p19/nExvX6kIJrNpkltTdh+L7ycIbJSttVkq4JSq53fP71rcsrBlOjVQXyRGZjvZ9Ew7S1yTCrIxLnFJaq3lsRrz05p7oy/+8Q/4NSgdjZFTneIRyDaZMnE9w1ZBvUoFCUq+MsL68HF56eq1qzdu3V9d6YdYEZlWu2LycJ4Q2cAyyCUScl/Z4GOsSLSVJYuzs9u3Li7OTm9bWLCE1CBzNRaC0RoRxRRqmM1w5m/UkMSaW/3YayB+mszNBk1RVYiSMqJSTVDzgioiCLyiCNov41J3+eGjxw9XHq+srHb7/Z5gRV0gZ5iSxBlmET/od8tBf2FuS1WWoRyoxtTZhcX5A/v2H9y2+MJ02mq6k2Rrn476xmheRoyIw5ynnoK2jE122gT1TVDf7ysMyFoJGAhrOhuqgGnquQCEVpf18b3+f/m//r7qa1EOKl9GeEKEUeIQUb75/dffevv1+cWM2LAFMYUgxoKIolT1tlZAROr57xryRYlBQ82vIJCBHZk2TNbXGv43+3IARRU/9D7mqvRQ45KUwBIbf8BahTNUWg5gbbxy7vNfv/Ob69duBg9mJ8oiEmMQ8a12dujws2+8+cqeA/NJasQrJ0omrru8w5HmpzA5zQT1TVDfZH25Ih4UKvUHCFSGVk5aQz4FAUaJVVkEQTUSugP91/fP/cs7nzxcjsItdqmYmGXx6JFnfvrmC/u2tU1QB7SYWSFQMQIIadQYoNEaIlOrHa7laSN6JxoBh8kt/C2tHoqEGCwTMw1NNYZm47UAPhOxVbAqhFAh9MmLuqpKrtzuvfv+lTNnbw76mqYJQyUs739m7kfff/HlF7ZlRkovj/t68uLDv//nD1ZL7QU22VQUqirPCG0LX6xM5caSDIr+9JYtB597dtfW2dlErFYJo5PwdMu2UuMQDGuaOOcSm6bsEiVb26zzembRxkH3JwqTf/woXRovK1WKuo4zaUhVvGhkiLX1qA+0tjZWr+hFDaRFlOv3Vz+7fefCtVt95YFyqahAylbZGo2mGqTExpKKIkYCpdZYQxSFVAjIk7TTbm3ZMrNlenq6ZWdzm1vkeZ5lSUIYeblkI81iXSdGSkRPcjplDPLVL69msXmlOw9Qeu0O+iurqysrK0urK6vdwSAWAHsNUZpRRwIpU2TnbV7V8sexMlDHyFmdkWplecfi/PP7njmwZ/fsdFoXxdtEMyDrGweZZgvFqIhKqobVaIBGqJASDINzGAtek9CboL4J6vs9r6ocuNpxL/qqqpxzZC0BWlFt3EdEvocTJy699+5HN6/dFZ+RmDxLXGKWVh9Vvnfw0L7XXn/55df3ucSyZTBAHhSIRECEhGCfbNE3xRyCrh8rNONKBJP1+4Z/gqbzWlvcj/R9CEPzpiYU61AGugJIVeTere7xT86dOnn+wYNlAlmbGmNi9MWgl7fcsZdeeP31V3ftnbYtIiPRewLIGmJGPW5EIMNEFKM0A6SgsiydSw3byWX6Y0F9bFuj6zWhZH9DqE+G5ua1l9fQiAoclQZeiIxLkqJUD9x81P3n985/+MnZQV+mO/O+ChLL3Tu2/OyHh773yjMJkyN1qkaJhZsCuhGQkuooy2/SsEa7pS7Z8cgfeVLC+zaHCGmE2HiNIiRjHtZ1Na85R5TUqy90YEwumvcjPVyWsxdWfv3+2evXH7Tb02XZb+U03dFjR3f98AfHpnI9eeXR3/73Uw9XdLWMQRg2IYBVLYKRwoS+I78wO71v757Fxdk8SzOOCZWdlNqJbTnTTtFO2LESSZLVhCMLY5WtkhUQALse9W2SQX5b4thQSqXu9cEMpy5G2ZcO/wSuB/EVkNpWQZQjSMlGhQe8al+0G/FwKV6/c//Grc8fLa/4AFjmjHplUZZlLdPgnLPGACgrX4NNCDNATMQEFoKw0UZvUxSAARljtkzPZFnWynNm1lB75RnDZiB+6G0wruQiRb/o9Xq9Xt/HypAFQ6NWEA8rDKrjkDZTTKoyojs1LQeiWs88ipCKSkAMHWO2zc/s27Vj9/zs/oV2QpQRJUQJkQMakdHGMBqs4KZqoEBsxghZBYjQ2DxpdkhGqO9buc0mqO8PPWirVoNBN5RhanqmnuAKA++95q0WhODp3Nlbv/zl+7dvfq5qq6JKbSdJkkF3tVd2D79w8M//8me7ns0QjW0T1wa95EFBKTZ0QOQE+ySlL25iFAQ0nZ3J9v8G88Zxxu/oH6Ib3YRH9qsmlhIrsamBYuWRnvjkwqefnL569RqU0yTJ89wYLK88zvP85ZcPv/2jV7bumOWEmgIdBNwYhdT6XSIBgLF1CAZgmCY1sAnqm6wvj/oUUG6wnxKJAiGIKBubRHAA+qWK4urte3/3q3Pnbz6uAihE9r5t+ejze372/UPP7Z91zBaRNVKD7GrvTVXWkVl087BN8b0mLvGwLoT1inqT9a0sGjbbbp3rWY39aL1TecO7EyVRQoAp1VRi7i/HS1d7J07fOHHySpp1mMGmcq7//KHt+5/d/tmNx+99eqdbuUhkbcLGIorG0mmcbpmdC9M75qa2zs/MzmSQEHyRWcy3k1ZKmTMpo+3QStiygpRq7h0ZsFW2QjaCaD3q+1OID3VINwqjYNGNan6kygiE0Hx/ZMSh1R8L6lFAI41vBxRaCgaVFoUWlS6XxccXz6xUxWBQlKX3Au9j5b0XTE1vUWKpw4dyHTw86QBRaGgAqEREtbl82R8kSZIkCYFq75kan6nZ/HIxcQjBBw9F7bioqoJITqMGKGkMoqIiNfkytQnXBoyqiBJjjCEw4pGD+xZnZ3bv2LY4054CUoIjyogskQVShZWamKqAqkFF9TSzsqpR5dFdUYdI0tqoQZv7gQ0cTxjvE9T3za0AeAklBGRzEgoVmC0RSYFeF//0i//vl//yayI31Zn1PqhGIt8bLB08sP+v/+Nf7352lqL1IWQztpmFJgVFUNTagBMEJLSZIMe4isy4SaahiXzHN38yrEN9VJvohCEQWPfNBFY1tf0pRfYlQiUxyLmzt95776MbV26EKDFG51yeZoNipdXB62+89IMfvj29MEUCUSUDYiiP2aVSbfNQW7zaSa9ggvom60tfsoY5NJTeaigVUSlERDBZ26/gRU+dv/TP75y9fK8oaKrdzsuVu9Np9fM3X/rRq4cX2s6BzBghAySNsY/WVoCbmggPeQHrjaQnu+BbjvpkbAusob4hOW9DeVdYlZSjaBVYlG0FNwh862H5/ofXP/n0sxBMt98vQ6/VZpfBtufuPJZKHbNJk8QwEAKkYg1tqzu3zsxP5Z3MdDI7nbvF+S1b56YSji3HiWVH6kxMLBMPn2XtEU5GyUQYUSLAMv3poL7afQ5NYwqmqeFsRH2RmvN+WMAZm7IDoemVCRTMbNnWIk6iuhqqytgBUIoOSj+ofL+oVrr9pZX+h59+qmzBVtgpKCqpUmBGKxtIDDECcGRqtFY/FjVyMcMFFVXZkISMUB9zLTrYOIGpqojCJ+wZgRoBerAQ1c0+X061O4uzc9u3btu2ODc7O9WxyAFHSAhMjdIAAw7G1TPKNVSuaxf1TjdaGo1Qrv80yVCNCYcAZEh9H5r0WZqgvgnq++ZWDGXPOANYKSV4ci4hoUGPThw/+1//5m8fPXi0b9+BGOOjh0tZmhpHO/d0/oe/+OG+5/c7Y2OIJjVEWFland4yRSCQjliBOiz1bpq1q24ONOhpPzBZv0/Ity6LEyBqI3z15AYKzIZqNeLAWndqFVVfir6c+OT8Bx98srKy6qvgSz813YoyWFq6v7h14a/+6i+Ofue5NE98BZuADUQhgDFQbqylAVi2NOn1TVDfZH1p1IcG9TUTfXVjLip7oQAuIkXg1Plrv/iXT2/fW9ZssULaW314aP/cX/7o6CsHtraNUNk3QqnLoaY+QsERHEECNYCFPnFLbvDJ2gQTTta39MiQTb86/snYoRIZFakRNV5NKUYD2GtawS2v+nc+vP2vvzpeeF3t9YP66dmp5UE07flAXCfTCF6lSiwlpBqK3BnEQsquQ5hpp/v27DhycN/Rg3vbmUsTa1iZaoeCun6xpt2vRKIsAgKs5T9F1FeP+Woz7Dua31CocqMEVf+MGf5wndZRUwiu3WCixpIIZBlQ8b5URTodYVRZQFG10NgfhCrGTiurFAPR7kBWuv2Vbq/bL7u+vHbvwaAqi7JSjcwGgIiqxCzJYvQxCqBEXIM41WgS+6Sap6p6740x1tpak7xmJyUG8+2k5WynPb1lpjM3MzMzPTXVamfOWiAh2LqJ18BFELSFglGi5iDBQKnGmqnLoDwsgw/rG0a9UUFNf1eCmvoT1eEszFAIobaIB4gmc85f+5oMBX0RJDYmRYBUAFKXEkUc//DaO796/9Klq1tm5txivrq8kiQ2y3jPnq0///MfP/viok1ATISoFItqkGft6dnOEOY1gG+Nd/3Fp76u+/8J5PsD3y3jF2r0VR8EqJxN2BEpiWgxKJM8yYx986cvvPzqofff/fT48VPLj1cePrrfbrW3LuwJvvyvf/N3J0+c/9nPf7Jj/6x4IiAqggQRYx0Rk2Ezeccna7K+cmaHoUID0XC8iquAoEqOmHH81NV//JdT9x711WTVYNXw6vcObf/J9w8dPbDVSVEW3ZxtkmW13fKYJqc047a6EczpE7hvsv5kttsT0xvrvkDrtkkz2QQyBLYgZZSMYCg6JHPt/IevP7Nza+v//fv3Bv1qZnquqGQqy4tQpIYtQ6MP1SDGEtGoIe9LS4kltUmCiMfLy/3uCqrekf07Ccaake+eqZWNUFej1j05/VMjFtXNq3E3c6m/QutqNgSYISuR4rrbnRjQ4Sgb1YI4DZZkR5kaiRWRYXb1L4jEsZ1F1UKkbc0cgBQykyhmQkP5Va9aiGrD7oGI+hAeL60EX8YoRGBjGzSoMXGbpPRE1Gq1nHM1txMAEyeElFAP4PEQ1zERK4jIUTOMR2v9alVUoVi2BmRTGDMcGqSR6E1D1+SmQk4gF4fvTg31GnBcFxt4+Jbz6M2bZLgT1PfNxmwiSsDgBKhw6/LqyRMXTp+4cOvWnXZrtqqiYRdQugT/6X/6j8deO+hSQ0YilTEoEVln8ySNMfR6g6mpqaaxp/REa1XGRm9pQzlwEzXHyV3xzcK6caxOQ8mvtWtXn5VD5TMy1jbk+KIaqErq0nzKlP2BSzOGyXL+yZ9956VXXvjog4/Pn71899aDBw9W0sSlaXrh3NWrV//PV77z0k/+7NWZ+SnLsNYIEEV4Tch1shkma7K+/B1MazQLpVrlXMHWUozwgk9PXf67f/707qN+YOd96Dh57dizP337xZ3bpmJZQP1U1jEikDrja+Q46gGoMXlDDEd91sfs8QAyWX8SNQbZCAsAAa/zYlUdxXJihW3aKhpIhZmRWIbIoFze2t6SH5jHn73x3//lozPnb7hsuuz3IomxlGaulSU2sTFCVYXgbKqiUYQNMyekORAUgAir1I+hjYY+qzKPuAfUJPJ/gmdLrdGn60/8+oDn4Vsy0nBrxtHoyRSBFFp5bwwZ4wQsGkQVDAtj1EKZYkMOJyYDKCExNJJ+UlKvMIikmpkkqgat/fCYiUVVnNmfb5UhJ8ysPR3Fk1ougKjGUJE1hljrPhtrQpYUEtSCCWCGGQ9TohCFDNt2xpAqQC6ZAQTex15QRDJM1hLzGuQbftKgYhn+RiZAlUjXRloJxKRcv+zmLphUsyeo75sNAloBBtUqzpy+8u47n1y8cIU0mduyIwa/vPw4zfinP//xj//8mEsdikAZETFTxq6xbwcRG2pPdUaJxvpIKsO79QnU1xwVT+K8yfX6w8B+zeUbd3kenRo0dm4YLwpEZzhJktr+tKh6WnNHOHO5CaUu7Mj+/H98+9hLR3/5iw+vX7m9srpaFJEMVWU8e/bCw6UHr73xvX0H93SmHTNEVESJARVDZjIYNFmT9RXy8LVgu3ZLRyUlfHT83D/+8tP7S0Wllkw2N5P/6JXdP/vu7i0tmzA4y1QyDdFrNKzGDBN6tVAzFOzQof57/Wi8jgHQhIn1o0KTNOdbnUEAoe4YjVRbFao0vi2Uh8UI4agkUIY6SIKYUAQrWkZd6suyN521jhycl/gyICdOfqbGBPFeYtLK2jsXt25dSLO0CtELTJKv9vrLK8uhqoBgDM+00/nF7dZYR1w/XmwADakiKIjAw/ycAP4TO1mGLEMB1iwblBpkLqiRzfCqNse+RjM+jjPU6YVlZzFG7yWsm/BswoSoRtWhrglImblG46ZWBYBplGHIrsOmoKrS5pfXviAEUTDUGTyJ+lRBiW0+J5Ai1g70ANm1mVPfKLkoAGtqnMbasBpq9Ga1spapGeYbocRGtlwAVaqHUepQa0B2GPtqKvxaP4OUWRjNkPUIVU/sSyeo73d/6o9O/Pr2XrsxG3MaXaucgLD8uXz00fF33/3NvbuP2u0px+nSyr0ksT/++Zs/+ekr7Xlna3XOjgOCsi2jkGriWKH9fmGtdc6taRRhA+rjJ75CtLHY9OSPTBL9P0AkSI3oylgpkADLILIEiVEE3hpOk7TW3fJ+YE1qcxtKkYgde7f8L//7zy6eevjurz+8fPlykMBsut1i6ezVovTd3uDFVw5MTWfQ2ruhFtuKgAwlfr6Yj7OhJ/kHdDtigyRqcwJ8iR/7hi96jbkDo4AMWBxrIiCPNNYzEWP4v57lQKwgA4DBDuyEeHRVeCzz0NFFVdBTpvN/R69BxmOiPn17UENJ+OMOPrr2dxy+sbaWU/zgxMV/+OWJlUKSVmuw2stNfOuVQz/83p6tnYKkggdxSjBChtgQi1JoBniamMzrksfmsWSo2zk2ykXjUsC62SkwWd/KSuHcSP3fAAAgAElEQVSIV/y0MuLaP2uWnTK09gWHOkswvNp9bCh98fltCX/XhOLj46eiymq37wfZ/Hxnqt1aWJxX1bIqyVCyc8a5Z9IkYYaqzrRbz8y3s1StMyCoQAXgtWdUQxFunqYOgxf/iV2n+qZm6EiVSRvQpjUiHgsnJEIyQnPcvF006veHAK3n1biR4sNYumnM8BvHiL4qUI01cYA0Ui0QRc0ponWXFupGXorDDpshDDWJ6+7x2Meh7hQR12N0Zlh6alq8DB17baoIAmKwoRFGaNicKWoJFlFIjQcNmEdegDIMiQJSAZgsxhxssK7NzRN1wgnq+/qXjIolERSVZCR5pEIQtpyQklZQATG69/H//OdfvP/+e61Oa35upqx6Xrvz2/L/7f/4X2dmpqZmE3ZcJ+AAkbEgpNYMk2tq5621W/y3ngebfHza90/WH8gZsf6S0UYSLtcnBoHA1jjA1YlgTajghKBMIJuZenNGbw+9tHXfgb/4zfun33//o0ePltgkTNn509fu3nn8+MHSGz94ZXahTSEWvp9kDkZDDAoYTphs5SOUrTVrLQZaC8dNdKc/lMS9np7H0O6QIE0WPY5zRufQmCntN4T6FKLDA52gSiqWgNClpau6dC+YaZp5RmjLsqSWOrmbTt0yfE+iVoEoWorGPrpBK7eEE5rdgy3bo00HAgEShtXGwqU+MwNBCU5hIPiaBLdIgAAENKwbFrCCZbixhxkFuC7GohZY+2PVcq/f1dLDQHNXauwrbBWnSjUXb3ffP929vYoKMTXFdB5//OreP39tz1ybLRJqNOoYADeZEYNck+LQWK1wLCDQhgznqYF8EtK/xYuBBKOJvU0u+Vp2XnMrCaY5SxjgYY9HQTCGKXdp5SVI+cyC+9lbh2enzT9/8Gn+/7P35k+WXNd54Pede2/mW2uv6h1AAwQIgqS407Io2jIlmaNRODSyZc9EOBSO+U/0l0zMrxPhmQjN2GNpFCJIyeYuQiSxETu6G71V1/r2zHvPmR8y36tX1dUkQGKpNt6JFxnVr6qrMvPdPOd+Z/m+7tYk6ps3t0N7eevSpYbYheWcRR+xlzlxdEoXOt1Wh84mQqeqLoHOe1cnpmw64koYTVmTkyXAgeFjtUskxGBV1dPuf2SPNQoQEAe6Yx/38Y/fzSHEucwTp+NtM89Bm/sx80e5ODnGAGuwVP1fqQUG51uLONc8QBiONGKOJhM5XWm1oDvmIO1Rjy/cFCkeT5kRDrM+tNmV2ynLfl6eFDUXDI81Nhx5SLfoeFigvg8l52uoIJ8aQMhkMmrlKwB2bvfW1jt0/PkPbvynv/xWOdGV5Y2sQSCC5Wc+++S/+tM/znLnGlLR5huhZlYNwk6f53cXyeVBkI+/bD+w2CV81Enbo3/I8ff5oJ/lkUyz3JcHmH4pcE2goPP+C1/+zMbm5g9++A+vvfpWWabVlXVL6Tvf+e7tO7e+/s//yWNPXGjmnd7gIDTEB+coqimZOReEEqNB5vtz9KG6xXosythpPBj8iHzGsbasCjelYu/e8NWfHV57acRGdukZnHtm2beTVzIJItI4s3FDCpd6g+29gzd/FO++plm3feWzSxKwsgXxcizNrPPryj6M6622AUf8A8cLejo9pf8ukrKEDyBMqeIklTDEu7v83j/ceuXavZE6RWr4+Ntf/PTXv/SZJSeZAXSnuePZbuW+pN6v7otbkHh+XKLFuxtUmt8y8P63qocwqYm44DJo6Wmu7e380ri4/Obtu69d3/ahmUzu7R8+/+Ir/+wrn2252M6bLMuM5jIkR8ktBMt93Upks3V65NMq9DeDfPEhjB3vzyf2oALUqU82T+VeeNC/5vJ3cy1ltFmJcFa5m2sivY/Wb/YB2knEdTSIaDh5xLTZ8+h9qdOXx4LaCZx3arg4cX12tKOV04DyA24dF/5vgfo+7M0l57dbzbxDEomr651JHz/+wU+//a3v3r190Gg2O93meNzPg/zJn/zx5//p05kLCNNntMqBnxjf+LUwxMIedhT4q36Cv/IXkFDR0Ga25J5eO7+08fXNn2z+4uVXd+/tjUbDRiN7/qcv9fYPvvlH//LqYxc73eUSRdXxkVKstXhI0xLiHxLIZw++I0eDCTYt8ul8Q9KHfKLH67hKMytRFKPDvdG9G7r9SgByOww2zFbOp/JmirvNeKDlgY/NXLdl/5WDd24Nb744PrgZs2VZW+7aJUHLoQF4T3UoaCWghAiCQ1B4o0Q4fmBrl+arGX2SFTEBT+5UHM1NucvtoUd/lfI0NCmNPkrWLxovvPb2y6++1ts/zDoSMnn68Ud++wuf2lrLXERMCP7dtV3wffMYC/vvO0Dw3ScV59ykqjrnREREAG02m+fyRra04bubz37vuRdfeTNvdYf9/vb2vUmR1h/d8mUfhXdWBC8QpyGIZwiOLqijuOmQmk7ZiI555KpiZDjZlvjx+sh+Zdb9PdycOc72mu+Ex9pWlICd0vLIOQxHgDJTBaw01I9XAvlL+mD4bi77pDTVfZiS9uAwfqqIFH8pD+HCHS5Q3wf/RFepDjVCeSSAVxaaB68lhNAxv/Ot733n2b8fDoqLly+ORqOd3duf/NQn/vW/+Vcbl5vlBPBVbVwr6UxxvuqNNlss4oX9RpmI8aQfslxclsZRvFx6dHll5Svnzq/+3bPfnYwbBwcHrWb33nb/P/4f//n3f/8bn/8nV5vdrIxaqjrXcI6qSU1DEGCOcfnYVv1sLVCeAvtmZyizQXSrU5isJGQ/WnjK6ViYQQw+MvgQWu3gy6ErbsfdTPQwK4eT2Ldy7KABE+nf4aiHOzeyck9yic2s0wo+gCy90ZAcjSzJAjVBt7p6pC/oBzZXQ8CbzHUWsWpvuv/D4Hywf2g5HmhwgEVTg3o/Tq40efnNmz/46Su94bDTymPqPXn53B/+zpfPb6xqIgm3GLhb2NkwEeGciUge3Houn289Es3d3d7pj8rgXa/f//FzP1tZ+soTl1ZDzFmOnEsiTIAEybMAejinnCsr8XjRhs6mw2gAFnRh76PDrUVCcdR8OS/MLHMzvrWsjPFkr4vifi2Qo8D0YLWNXwZQ+S5P/wH0FJyjqXow5FvYAvV9NFaR0YJTud66h94JMBlannOwj//yl3/9kx//VBi2tlbu7dwx2jd+/+t/+M3faXQzClwHqSydSjIz2LzUsioWImoL+w2iguatAETVyEAwCHxn2X3py09euXThP/+nvxn0epZACeOBfutvvm8aPv/bV7KOCyIiIKkJqLIZs/hA1gq8dcXsDCk+ElOqkqM+FM6lHCs+AdY/RNiZOfNqvqI0WmiNm+tsrHnfYrFvg21ChJAQUkqlsukaBLm7XcTIXo9REVp5vpaFFdEGogidOC9qNKvpFEDQk15IEOlDaO+c3Xg7WWE4Tjz8cOf9CQghFg1mzMzLzXujH7x0/fr2TlRxcXJ+vfWVpx996uIaU4Ka+LDY8C7s7KC+iuGjKveRNAOJZi6ffupc7/e+9ux/+2FiY29/7/Vr11d/1r1y8WudpVbQBlPpnZkmkhJCaaJSUffP4Y5qsI9VYwXSVH6cgFts29/HqMHq3p7AR3X8U5qgonCduSyZZ3o5idJOCmzYL6v08X24gF9aBl2sk4fG3F/8xV98nB68qMfSIaR5mjjQe/Z29dn/79mf/MPPR4OJmBTFBJL+5//lT3/39z7vsyCe9CTAIBCQRhERV7fVGWJMlfjpYlUt7NcyJU0RCYojYJPJEEYXfHs5v3j+0mgw7vdGo2HR702a+dKNazfzZqe7tNRsOCHLqM7ROYupBJUV0Ks5Zo7IRc/U+rTpsziltzsiIzXQWBf3rL6KqsOleoI/7JdMX4TBkqUiKQ5KdzicoL+dTXZC2WccJUUyITEejTSlkAWQWkzKYT+ZTiyzfLW5frm5ejk011XaxoZIEDhY9fJAmL585Vo+oCtyAI2zfcMMdJ98zTf6nK28wXt/viwJAScjupHxRy+88b1/fGsSvcayFewbv/PMP/n8kw2i5cQ7qiIlc27h0Rd2BnIWpNascaxaPethcWEWpNttHPTLm7dvu9CgCwDW1zdWVlpNT8IFR0cjQOeUbsY7RjMwkZVcgdUDY1Nup+ppX9T63t+PMZ7iPY9E9gir2VOnHKqVfPppfvn+sl7NmEK771W5+lPfv6+J8+TrRF9/nUA+SRxu8zzUcy8u2iXOnn28an3KYz1vNFdtgQiM+/jWX3/7B9/7cae1JN2sf9C/dHnr3/+v/85lMQSPjBo1TYrQyDmtmnA221c1oi3c48J+s5AwGI3yzItIspSShUYQEilZ4tal7r/5t3/wnW/94w++97M8MI6L4aD80fd/OonF5z732MpaY8rJXBX3ZvKPCrizy8ZRM3by+BABZwRkx3OI5pAE6aNXblCVVMYkgzH6KfOtTVu+hNQnqdGKUS+qphSdd0YrioIiqjBmli+7lcuN1ceksVlaG2iCISY4QljRY86tBiMsuTo7/AGtOKi7X49hWls94lOduU2Ph5bDcybYQPiofO328Cev7N7rlY282XD2W5+89LlPPr7e9JP+wcTMZa1JtGaWLVLYCzsTa3dKBFJlmTHrgE9mSTutzmeefvy1N27sD8uyTLuHo+deeH1rfaW15RyRVbEhTsxVjU0yRRpJkGYtembVaJYe55lb2Pvrce8v9FU8yXYU9FhJ6cGoETOw9S5+ucHP2nZPHuUB7+MB759yNOp0dFBnZ2UzVUOcQr3mF8togfo+6rCvOCJflyqNXimp/t9/+Vff/68/bIR2WcThcPTMM0//4R99Y+tcC01CUI4KH1zIM9DKycRljjX4M9N6z+TcYnkv7DdZnMwbS4AmxJhQjXEYYozRuZZQpBW+9vUvriyv/be//4c77+yEkL368mvRyuVu95nO+UbTxVIjogtOmHhWZO1+aRLmfpEGO4J/el+8pM3QyLsNVB/I0VRURRGgmXcWWgO2ypRlFhyjo1o5kBRbwTmLRTmS0DDJSrjCNXy+FBudMmR0zmdkYIpQwhNuxug9p1Qx7Ub/IK6FSlPWmqU8wnvVT+h0CSnndywPtZOzVI5HUXLLw0uvv/X6te0k+aQoL51beuapixc3WlKMGl6SmWrZbrVkkale2NmzVBEKiJBwVA+0Ap958tzom1/7P/+fb49L9MfFGzdu74/Li3DipjlusnK5Vrd/KKvxZABWVRGlcjVSib4tsN8Hg/pO5fA9ca+nvWhmUDsZDAUPgIK1mgNwGofnqUebkzCd16o+9aig6bGzT7O4YDUZTY0vT7umhZ0V+3h1eBZpKKy6MMOoV4bgCVqB//1/+79eefFVgXPOTybjS5cv/vl/+J/WL7UkZ9XCKZnQGUlSxcvcNmg6Xj3/1cIW9uttSkmjAE7EV0EdhHOelFQmKkPLbW2sNPNmf3C4d7CT5zkpP/rhj86du7S5tuwzOucoZjAz41F756wtA2eswfMo8FS6J0cdI9VW5GjYxKhJqr2LOVA+yiNIdah6pYq+jPbyNMoQGcepGEkaeyuaGOexl6VBQCIZmY18W1fPY22LS0u+22UjLxyjkE4gVCKJqaB6pUpSt5oc/qCuhVr30J7IF3PWLGREIpVMRDIATuge4lqfRiGTz9+4M/r+z27e2hsp6Jx+/SuPf+0LV1u0DCZevHMuZKAjRRbbloWdBbRwn6FOCSmg3juQ5tzuQXH9xi0JYVKmshw+9ckriPBMsZh4RytLEycCB6UljVFjFBJ0VYEpxUiRWJbeORpgyXGRzH4fPZDJNB47wgHOpvq5SQmSQgPUNKmqqaZq1oPHWD+tFl0AYGqmpqqaLKmpepGZIq/VsxGcqjUce9XRl5yNTFSauVatKlW1ms+Vc/2cyUpFMiRDEmilBEiDWQoUARysipHVQAQgtfLfdOdhZma22Ch/hPbxqvXlku8fHi4vrZWT2MwzKgh8+9nnbl67E0slnVrsLnX+/D/8W59l4kkHSJUGmz42nOc0IH49yYaFLezUPOBRj2OlEqY0I5FSIcFTwQTfkqc/e3VSDnrDvd2d4eHBwcrSyt/+zbPnzv9Rd3mpvZSFjHakcCAV9jPwrNb+7FR5CwK12PyRagPrwbqP2hRORWHaksJcHAcfs2VrbXA8cCmFNPA6zLRwTLSSJimFkXMj15HOml9ec91laTWk4SFSVTCn7TJqc/fAQK0Gjz+w+24nGQDqjLKqJqBKkE1bydSgBnm4iYrFQVyZ5O1r29vbB4SDlZfPr18+t95w4ixO8yLVPOVRF9PCFvbRQr4HZM0AKExJeMFKO7v6yKW3b9zdPRymZHfuDV5/u/fZx7oUF7IWMJFMgGQJCoiICxkMpknLBLikSiHhgncwdWAyXdz89y+6T91u/c9jAg0UAQzRohpI57JqA2CVSJCZmc30BAGkWJKkeLIS86iQnI1hIN2cpDymYx73N3votJHjaJZiRu7lpvHAzMxU63CRe885CqBZLVCsLhTXiDKWGmMCsnbHQJsCPzNTVVWtznlhC9T3IXhPaTfblpB5j0gIX33hznf/7ge9gz4A5zXPw7//83+3upXRMZbwAaTeD+vsfphHW8C/hf2G2/CpLsG8BrQCMFV6o7NYjMRnzVX3qc891hse/vgHLw0G5cHevh/ib//6u3/wzX/ebjXNO1CANB0R4P0yPGcT/M1OriwijE6MVFgiEh0poVQpMUcS/eEeax4TwgxKIZh5WIZJ3ho2VtOkUD/0HLctthhJzSU5tQRf+E7ROqedK+xcYL5G1wZzMzE1Y6II6erQOe20qRQUSmVhH9T1VowN9fT/NNcw/TBqafJKo12VycQMuaeTh5rHUxSyc1C+9sbN/d39LO8Gb49fWX/04oancXrvKyEsq1nWF8BvYWd2PVsl6FaRcyw1/FNX19+8dmH3hVdBf2/34IUXX/301S8aSYJlQkX3DFbpm7Ju8Mzh6Fyl3WcxwSwOh71Op+0XUyvvd3xH3bEvFRVE7XfNtEwgIYA4gCUAhRj9tNMFIMRjCpa8n2buCEss1VKyCJOGlJjK8FSzm2ZJzZ+mQlPxtR7J8wAkXIXaMD2dilVMAEDMyiJRVcCaR4Az2hZDaZhMYAkuWObFhwrJnkhbTDUnF7ZAfR+KFeMiZI3RYdHqNCE8uBP/5q+e3d89EHEh+DKO/vWf/dmjT61XFW3XnGpknk5Tu/CHC3ufc4HHlpSRkMrluxBAwlQCIaBgeb3z21/7gmPz77/z47ElmHv91TfPndtYWv1iN+uQzsTVzfacjzkPg7c1ZOEI8U7ZyhIMTtwMBPEjPDo4RwdIBDOXt7oj5gaXygJxVAzLEFmKeEW00djciM0iX7Hu+dDZajRXGlkncw1BmNGnV+SqmCIMgtXEo0o9OfGBTPUBYhDjvILwicyAGRRQqehEH+5YbZRJ0gi7cfve3e19JLhUrq82r55vbSxJgAoAddOUtyqUC7y3sLOfyRCDKRJEZL2bXzq3/vxLr6pIUZbXb27v9dBegTdERUaBMakVKRqDOD+j7xwbVJF7iMBLWFpaUdVYasgWd/iDc0lzbte7mfdXUKuAZ+KlHpZTgxk0MhrUkAA6OFfHI3PQwAROyBIop7/XDKUhJoqdlmYlxMGOE75VVcEwW16kzeWhlzMvOC2NWP2WZgVGjSnZeFJCw2rH5jo8F42dC9T3YVvmcxhbnYaNwIC//ZvvXH/7RuYzkjHGb37zDz/1uSsSSOE7t9+5eGEL5LShbF6q5Jio6XH9lcUuYWG/Puyjndh+E0bQKmmQVHf5aywL51x3rfmlr37u9s17r77y6ngyjlF//KOfXLh84elPXc1bnjWV10z/TnFUuDjDnnc+NZgUFoEERGgJNbrSSc5pn+GHdoSpTROorAUxQJQsDhGHlAZDx/ISzWXLu3GyX1LHcFpSwQlYuFbKV9hay7LlhrRyhJCkBltUUI+IuwEgwRIrbS4HCGd/8f1GfQY16qyJ66iby9RgpAtwQcTNZG4e6oitYKIfGt7ZOej1RjmZJqNH1jefuLDeIHx9p6e9Ulj0ti3soUANFCcVfLBkrdxfurC8vtK91xsRHAwn19+5d2F5I0FCaJZlMRwP81bHZ40SmBhHCckwGuu1a703X3/ltZdecCg/8+Rjf/zNb+SB2QLzfRARbjZnB7E6NlOJqJiUUAK+8kMUwY7CuVo80QBzUCABCpSGYbThSHv9Qa/XH47G/aK4vrM9nIzHkzKlUsSTUDXVSJ7k8DTQqNXYXmXV2Hwl0thttUPIuu328tLS0tJSt9vttEIzcCJwViNAoiYhq+lkIwTIAzxB75F5D1OtL/UECe0C/i1Q34e1r6bv7/bay11m/NHfvfTCz18kfAjZeDz8zOee+d0/+BxN1DgcHp47vzqO/Ty0ifuZzU+gvpPvLmxhv66lObWCGWOkr8EAmAxClcwBSIUurbnf/8N/tru7c3Cwv7u3E2P8u299d2V5+crVLamHwKtfd5o27NkFv0BKlhK0ICKcggYHSCLGgskMfnyIx1OedCLBjwKtG0SDG6uPQ49cnIeNyzJFUTgXmlnWWOqklSWuLLW6Ic8hIcEVZDH9ZbNMq0zRVxXWU41C+MFcV9VuxHkWN53OgyjoIDkZqtMzhSpFvLiHNWQYAOH+/uTe/mQyKamSI15eD5fPdV3FZ0gBaXVnJ4/nSha2sDOI+piMXhyATGDJnJfLm62rVy7d+/nLpCuTvn39xpee2UhkTieSd7r5JGG3N5G8AY8bO5N/+Ok7r7z+xng0sXJ8eG/YyWz7YKBkGZFli03N+xjYZoScs4hiVYeuAeMEI5ihks6IQAFMgOBQAqPSev3xzt7+zt7+7sHhYDi6t79nIirOSDWqWVQYmbU6k8IVRVLLRMQ5J0KjzUDX8aSBJtMKUArrpJcYaXZvf+Q4lu2eyB3W3zKBTYaDdpatrKxsrK+e31jfXFtbW/ZthwyAA+syI0uFI9pVQwuO8bhUXyxQ3wL1fWhuku1WFxOMh/adZ/++GBWOGY3nz1/8kz/5A5t4LvOgd7C00gBLM9W62+qYMvF9g1K6wH0Lez9MyTjttJep7qlUYA9wgANqSQdAFSbE1qXG177+1W9/6++LsjMaj9966+3nnntxZb21vNbBsXluPYML1B701IiABnOIEaNBKobUghKpY6L4SNJFIOuGnKPwmaAFTRxW8jJ3wwOmnZw9F4aj4WEsxx5lTgs04aAodorhTfOjWGTBO5Gp1pECENCBU+xnCktAqiYzT1Jsvv8QW45pJdbvOog3hkSfIHDBN1o+tMDmFKY+rDmVvf7woD8G6A2rncbmUqsh6pAEVk1T2hQZL5r4F3a2sxgVRaOLaqZRJHjHRHRbrStXLv7k+ZcnKcUy3r23m1A3fcRow0mJRqM0efmld557+a3Xb+z2JyiVo9GwnQWfL5cshqXsD6zbQPOsd4Y8ZFkn46xjvwI/tKl+ET2ioTCUhlG0/niy1+tt9/v/+IvXiimvZ5G0jHGSLJmx1TSICiNoRgXMSKNPYsgsC5hW1aohuhjjaadkEKtajORIe7oq4hEVmlRTU5iZKmi+s3yAdKs/kH6Pb74ppg7RGdrBrS4vP37lymNXLq90AwSeWAXaam1iNsi3AHsL1PehR/1BkoYQ/G9//b2y1N5gvLbcimXxL77xuz6E0OWgN1habpPpzu72xurWdGP0yzcAXOSDF/a+oL6jFk8cMTkCECKpARTnSBbFmE588OUAwfO3vnr1pV/8rDc8aLv2/t7B8//48pe+/PTySme6ZmsqQjt7q9RmbJU18qiGzBCjCpOUvdHuO3s3Xtu7eX04Ggg1wzDYmB96952IVPxj8xlTB5ViaMq+W55IO1DbNujE3UZxEKi5A1NiimWalGU57JWDOzdH8MnMCQNBqqnCqm5Kb+KnCr0qUFoS6Hv/yPTd79EMTHSJTjkjBweMCoELSheTqUJC3l0/t37liZXzn8ja+UP+gGFUplEZmQXGuLzaXl5askJ9VrXUCuB0TpN+sUNZ2Jk2kqCmlEr1DdA0FtYIfmPZ5T4bFUUZ0RuVhcEZJhECf++w/PkPf/bci6/dvDccuVbyzVFkmbTVWS3GvayRr3RaTz756NoqWTUcyIObRCpWEh7DNaf9qNyf6sNMjvxkOf0BMzL2S2dneOIkbW6cQU7NNR7/yVpn7gQ/NB+Yqaz/m0y7NY8Pz5922vXpSJpSZEXCgHqAgegnvX3v8O2bt2/d3d4/HIzKGE0nsBhCiTrwpOoXiRhhmhTJdEo2SIIUk5CSp4iI1XjNqv8WTr0WM+hR7+VMorGexEMlJcEgVSHQK9G30gghKBDnHeEYHBiJnd2DN3b3/PPPOyILfmtz84mNrc9fuLAk0mgg9zUzqACex24vYXakSDFbBvXKm40R8j4Qbaxg69G6OT1HuvDjH2fUJ5lUvEXPPvv9LGt2Oks7h7t/+C9/79NfvuQ84KyzFCBqxPrqRdJXpe0HrxmZ204sNgkL+01jOBBArQm7qndqrmY6d5Qty7JG9XXWYTGOIbh/8T/87nD0X66/ve2kMerrs3/18//xT5ubG8vJlRIqHQdXFEpPd2YmT6fTU1bpk1dfwYxG8QJNxsG9t36YXv/5OS0HKiUls0HQkZyG+j78JCKhYgmGtvYjvZg5lJlO3KxNl4RzBDysGQ+cDjv0BplJ3VZJXpvpzx9hYJ1+99fANQ+I7qcBxCQSnYsMRhFLzpQmCp9cHlVcKjJRjCSODiIbunwVLXnYg2gxKgejcmBRRBvr3fZK15GilXyGVal3Y0XluWBzWdhZDxhmRkjwDSi8WC4YAyLF4d5ha+mcii/ZvdFD7nDzzeHLz7/y1qtvFKUWdJFrk+iKwhhCI2cq+49cWnv6sc0nL688stFMsdcOEDoiwGYCcFbVfMyMUg1XHyElg4FGgcFgU3JIikPl9JCsUoOHExhgCfdx5eoAACAASURBVIAFXwLxNOVxmU47z8EmO1F6tGm2UKcJr3lJOoAOFk5DkjPNmnnUBxAlxKb6tnJEbjwH9gidluy8wR/16RuoEAUrwAURb0YtYEofAGOpSDkKYmwYAgO127348ltvvX7jnX5ZlmCCSwmqmblcIE7UA0jjVBZIiUDmJXjxwlROnDA4aTWypXZnebm71O62s7CaN5reNfLc+0rUAd49sGB7dAsMpUIVyWCGZNYfjMoUB+NRfzg47PV6/f5wOBzGZIOReQ8nVF9xzJRmBdBotWOjqaplNDND6e/eG7y1c+P7z72eJax2u49fuXj14oXNZXZy5IQHwtGqShGFAwlLKAICkNkU9VX01lQ4myFAq4cgBIULadon46weBzkO9sxYSRdWWQq38Bsfs7k+I4hvf+s5OnfYGzabjbWN1c984dMuCIVgYazwm4g4GGk4fez05HuySCks7DdPStRHnpKnmu8xJueUdTJAdGWt/Ymnn7h9+8CJOjZ3tw/375Sr6/VeNqmJOKE/Y6vUQDVAtNYEn+VOEig0Sum114w7S8UoxqChIQ5SKRCesgH68K9LFB5UgQWL1TmUbJSzE3F2wmWIHePYQT2lPw3AJ6Wc3Hu+n/VUyIMy1CdXm8GcmcEUFIMzoxlhWpQSLddxiwXURuNJubc92tkL7U3XfIjLfTRMJpNxMUlEojEPLg8VBfk0GW8gjUbUesoLn76wMwv5cJQaJKCkEiqwdqOxtbl5c2c0NiLzf/t3r964cWNwUFphcZIDNAkJVDAElzX82kr7E1c/vb6cnVsNa13xWSqSilMjPaBqKUVTI+C88144E1I9fhoVlko2KxYRUwVMAI5H+KtinjzlUk6PUPw1I5e9m1z8/Pj2MTlmnZ6vHQOLx3BgTXlphpiAEgIEBzDGKE6MTj3gEA0xYgCUCe/sxdeu3Xjz1q3dyWhEG8BGapLlSS0ljVERVUwy51xiHB3mzpabebfVXO12VpeWuq12p+kvn1sW0AGBCMJABjIYNBaZl+A8p/BHah0aO+2yxdfqDjVdc6prr2bdzGCloTQrVaOWMVkJOOeHsMOR7e7v39s52N7b3Tvs98eTw3s7yELIWo2QKaVIcdgfDePwwsq5g+F4e//w+mD4k7eutTOsNMJSM//aVz6TE7lDLsjgiEa0mLTIXR7NiqIAkpeGD9Px6un9n6dVnIkQ24lyr83Fw4V9zFFftYC+/a3vVN1MqvrUpz515erSURdn7SUq7k6+6/rdYm+wsPcxjr9bK2MUEdAa7eZnP/dbv3jh7fHhrgj29vZ/9rOXN658rrucATRTVTh3FpvqWSOiY23SU7YvKDQljSkafdZZGVo4iMDpeZgP/9p07vjugb18+Odzaq0PMFIBSwxKJ1Z6i1J1eHrvckrqszgUlo0gzKXZchIe7m52Gkb9wbA/qLYPIcuazZxUs7nNHmc7ioVbX9hZ39DQtFJZY60wqYQEH1ZWVg6GfSuLYe/wzddfu3XrVu67IXRLn8E5M0spCdBw0nBgHPd3d0Js5Gh5tMQa5rxCSkCMTuAlzKBOAVVLUK2Am9QkkBWXhxDBzfsIrbpQayc080OqaikpVPPs2JN3MlF2bPMmxGws4IT3f4BflRMw4QE48+h2hlmvIWFEvK/9tBK8cTW7g5mbug6DlUQ0RINzPmSFYQiawwTYS/rO9vD2zu5PX3opmSQi0iZJx6lQwImU/V5wvi0ud6ERXMOFhm90W9lXvvA7wSHzyDM2HHMyI4UIFDflAauKnRYNSHneqNKK0wqmTeHPSSJoqXk8jxydTdtLDIyEgVkNacXgK2w7Ma7DEJCWzqUrW4VqqRaBQvX2veKtt9++cedurz8AxWcZWuFu73ZBM9EDtTujJGNrT7LOJPvuf3zxyrnzT1268PjW+Qsr3SWBQ0AK0eAE7ay+z5aQokHNZQJW69tS7cvrYDojET31k7bFLv3jjvoEL//8eq83IPzS0lpK5Re/+Hnn5slauFggC3tYrMJypirk2kb38ScevXdzOBmloih+8YtXv/rPPtFdzo68+i9tVv6IIB/no/ixL0QYtSiKlGITyFvt5uXHzj/6WWutg/4+JQL5YNQNfuVR3/MV168P93xOR30KFKACHvTQCJtucsqSxQj3rhXXXxjv3NaywGRg5YAWH/YZ5slkVEyG9LkB3tP7mr/gvlrxAvct7KxDvumMmJtfsvX3kqZYQmMqC03Safhmlo+SjUGXZU6jWVJNahonk34RJwf33raCGp1Dp9Pa2FhZ31jb3Fx59PJmFqSRhzyHlwoqiDPJ3Xzzpc1aKv20DFh1gxpULRHw3hFK1h14IgYPhU/kMTY81uDqVNinsOPTzjJ3PP1p5Vye6qhjdFqJvD8rhFSpYcCAJPX9tYpLGQDgDFK9BQOtkJRgoiDEuwyOBiQikQXRV3vz3ui51179xfV3xmqNVmuYoiaFUERiLNOkyINvB1daWmu0Lm5sXN46f351da2TdXJ4Urx3hEzbQmT6mWeEE/h5WONgkKgJUumrg6g+AyNBuhM0zjVUjUdqsRTMJrz9XKesVijdTBQb3lf10DplaC4CCoyTXb6Qf/7Cp2L65Djazu7kzt3tm4f75figaAi8j2Yj1VFRTlK5Pxz5IKl3eOul3n997oXNvP3JK4899djj51dc10Eq9mqz4aAgynYrJw2IFShNZISk+gKRAeFIE6L+bDn9MOfquAtP/rFFfcSPvv9cu9UZDsdm6ZFHL33iqZU4gW9O56fuyw8sbGFnN4khburfTIRPf+qTrz5/60Zvx/vs8KC3vz3c3FrLMnjxyVhNTJ8d4Mf5wFslHeeIEwlW2WEIoY4hyOqG27iCxhYYzgzq+7Uv/cM9nweivhJUIExRXzVjozBAJ6Da3beTIaWCcWhxCC0f/ghQbR4q4eA6KY4pWaodKdiTi43Cwh4O7Gcn3KpzrtHIR6PBJJWrG+2t1e72uF9OeoPCTVqrQsscxUNiQooak2hSR00aVctku73+je3CZXsiKZY9763RyFa7nc2N9fPnt85trK4vdTbWGgJ4wAmkUgyvJmgSPOEdnMw8vBCqGBujWYQpCSEEJBqAf0CqvZ6xPRIg4jy8nHmwKeSz03f2sx76Y/+Rp9xEGDyspgixE7rMovPgsjojq5i2ObFkgMBlngaWhrFhb1D+7LXrL1x7ez+WZRYGedgfD+1wb721nAbDOJk0nV9u5Curq5c2Ny5trT26tdryXBIJlEwoQCzMUspD7YzcTNunxjSGWAX1VLeYGiAQ75IBsEp/z0DStO7nP1nrA0B33304vrDqZkmRGqsPJg6EeHiZSQ4Z0CVLRaneHHxuj7aydLE9UjvUT98cp9feufb6OzduHfQFqiGYC0kxFDcotSzT9mRw59o7z+/0OuK+9PgTW93OxjqWHHzbE05ROMbpnoCAn85dQgzBTEyn4J5gpUNoD2TxWTj1jxvq0wHeeOMaIVmW9fuHn//iH7kgKfHEil+Qci7s4Xh6/dSHpWjRX7y4dunK+Vs3970LccI337h++fHNrNMiTciYzirlvk1RnylNAGhUOhMA4nyem6VxGXMD6Es2jNkpzSrkh4/5pl1VrNhHf9WRH9X5YMqPOn8k1CEIUDJTeJHoLAoiTFMsCAizQhnJkDufi8ukVpt4WPEeBGhmoZH5mABKLKUoYV4AV0/BzNo77WReYmELO5urGlDOZ9LAGONgMMiCU4uZ4MqFrc2l5p3bu72bB2OWMdHTnDMxMFnmnPcyGQ69z5p5q+lCCTeJOikjyW73QlmMDvuTvf3eW9cP8/xaMwuelopJt9VYX10+t7Vx4dy5jY3VlaVmq4Fq7NeISBBUgylhyF0u8GAEYkRpllARYvEkSaNMOVOmeM/meT/tQR3y0/zNfTfniAlyjhX7dC9mNYeWzspDVelRjuDlSTIZhSMcBAnoGe8O0o3te7d29n/x1ttD5QQ61GI46JVEs9Vst7rFzsFqs3nh0uVHL164sL621uZKYIMilEyQEwITU0AbGY0k1EBLSVVNI+q+RvNZo0Z6xxpXKUKxGbFoHRQJox0vfc2O82ngClMbTTUlrWhBIagV3o1iQD7dc1hCUiQ1NYNJs5nRgqv/rsGimql5H1aW8090nhw/+URP9Xqv98qNmze2d+7uHYw1KV2zs9JotEaJL27fHe8d3trZ32o2H7m49viVc4+c7ywBCgfGfC7GuenXHpCaxKe6SDWYUYy1JhIgtJopYeHIP6ao72AHg/7YZ4GURjN/4slLIFyo00j1rsyIozHRxWpZ2BkO+URKkOm0gcvd1ccfffmF66PhxPnw5ptvfXn09LI2TeY6VM7YjqXm1rKqaf8EQXO1EZdEjlW7Boh34s7YxfBdS6PzIzuf0/Ama9ozMVR84sEYpA7+hcAj66hvJjqaFcU4G/TycnI6BfhDYgJ0Wo1OqznslWpSTGQ4QmpwNsGtR3TM9Wg3FgJTCzvTppwm82aS34Ph8Mb160RTUzkeHCy13MW1c20fBmW6m9ibTFAmcU6gQjY7nZVOJxblaDA8HAxG/X5KEBdCnhNyuDOE0Ekzcw2YlUUqh4lm3uXjse7s7b325r7I6ySEFpwud8JSt725sXru3Nb5rY31jU63JQAPBpZnWZ5l/hhtFahH3nxKqDLrXFUe4+cEIEY5zqzLOcTC+1zhTBlCj7WOVr/qNIwIp6hrY6DBk+64IrPWcKoefotAJIZq94bx+r3dN25vX7t7b6ffn6iZY8WV1RafefqkS4zf+INvrLaaK21peWlQfDWgltAM9eUrUkIJqFKEUhcepWJ58zMSy2EayTRcksKpScUhlgw0Vi2baoTN4N0xYhwzhcKUoB7NABI07920AgqY1j8IJacCS1UxN0hVYFObzIlrkKQPaJsljRalTOgYN7L80fXsK6urfdVe0hfe3P35m2/e2tvr9UfRu9BqdtdWdg4Gu/s7r+3f+vGbL18+t/L0Ixc+8ci5Td+OiBXtp5gEk6nkR3VpOqecAYXqMZ8vOv9hL9z5xw717RdITuCSFo8+eqXZdjZt5Jl2eM43DCyWyMLOulVSPpV7j0O7cOF8t9M83B9KcHdu3xsXkxRVRIQ4IS10ZhLVnO/wqR485ymEJitj8mrRCDrkDYCW4qlX8NEx1dh7u9yP4nzMTnl/muViEiTWmKe6lUklpzOTcYxFMgnwIUgzh3+I40W1zlp51swDe6UYy9ImRVJzVueyTzBFLOb6FnamfX8FZuZ0BaoEmoDiXRaTBc/1lfZSu4FysNyWTz5yTu4cyqRfxMKbh4I+5I322ub55aUlV+3kNcXxeDjqD/qDw97g1va+QqreSqup7/3Rn69YmGuVBhuV5f5oEnYnr79zEPx1ErSkmhq5+8STT6wud7fW19dWlzsdn+fIAoKgeZ9/lLoptCYmnTK1VCU7T/OnPJXE3FSzzdfzjhfr09zfuV+XhYCaGACaElLDaMBV7d81wkCczvsloDRsj9LrN7dffOva63du700KzfPQbIJELG0ybgsfPbf16ScevXp+vQtmCEsNhup+TtDw8AKDsVB6mjOBGSVBExJgDiqsmU0MVkKrbv3Mz3Mpi9YFUggArT6qOiROwd8p92wqnnT//BvVUkXSM+VrJRyMzmrUZ8mM9xUQDZVmB0gKhEDmBIZMaNEkEo4KWTZobueePP/lJzb3Y3rtZu8fX33tnZ3tybgfFXkrB/1uHO5ef+fa7r3X7959dGvzq48/kQENIAd8NVOoc5cylWuw6ZTp0cVQZ3SxC2/+cUR9r778VqvRPRzs5S335FNPVEWSqOZr6RA5vpRssU4WdpZtMjHvQCIWY8fgGo2V1eBcXbI2MI0hPojoYDAIjcbZa/HkbOTseFs1zYwhSPDJAPFGZ1EBE8eTtb7ayX+EqO9ddl/yozofHtOdmh7NoCBSqLtmjj4CCUE0kp4uSJZHKwmS/mEvfJliqdtd6rR4bygSdncPd3YOrm6smRPQGdWgBsAqiY1Fe+fCzjzuM01KNSVtPInMwqjU0YRGxpgE8I7ddtCRcyV8x2W2tObs9nYxGI8TcxjubO8e9kePP/bIard5YX1Z0jhrMrWYbXUHwwY+9WhUKco0LorBcHzQ7/d6g+F4MhyNq1lx0JnQTKKZmZDtqByVkJIknZHEoMT+T++q3qa9CsALW83m+vrq5nrzwka2udbe2lxbXvYhAFPnbkovUqE9NQDVKCCc1jPcM8df08M4mCW1ZJaAVDW2ExTXuO+OQVVTSi6EejB++r1IK6EEApyv5ve0EhQiEhAqyGe9qC5zA6BfxjffuvvK2++8devu0FQbzSy0JhqL8URUL5/b/NSVS0+d37rYkmXnqsqer67CQIM50MA0uw5DAqSCa+G+LB4JuqpqxZlMokyvifWtM9RSNNOY+Mt89rRjdj6C8tRUJet7HjkPE60ep68nHTknsGcJZtO0roM5T6pBKYaGwSbMyBXKxYZ/7Gr25XPLtw8HdweD//eHPyqjFtV15O2h+RdvHr58fecHz7/1Tz/zmS8/fr4DRDVXWnMmPWyAwqSWeDfTBHU8mR1Y+PKPKerrHY5oPkgwTUtLramcjIIyXfMyZWc6vola2MLOnlVpC6sImMUIiNAFAjQjKKOxmYKUSp39rEk32Cwk1eFB5+rtFSF4FeSolLqZhQ9ouvvILu2sAWn3Xm5/hBlNPJ1xjga0UikljWJ0aqbwRvew6x8Fh1Yu7UYQsxjt8KDf7x+4sJYMMFNRm283q3cyC+y3sLML+rQSQq+m5JxLhlimO9v7EfAhBOFyp91pZEbfYd7XUa7SZmdJeHOvv9Mrx2UJ74qYrt24Xqx1l/K41oLXQY6DjnfLS36U+glem1RDWmuWKR+Xq5Fwrjkq42A06Q8nveGoPxj0h5NJaUqaiqmWlixV4n2AUZz34r0PBCeTcq8/urk9yhtluzEBJtAkRLvT2tjY2Nra3FhfPXdus9XMO200c8ym1z2Q36fYVrmtMtUdjlLXeBQEFcVkUpF/kBARkToOhiyHGVRjLM0gQnEOwkp03QgYvbKunxkMGPVLbYbSQT1vDCcvv/XGy29e3z+YDCZaqsL5OJyA6Dbyrc2NL33mmdVWON+WVec6QG6WQcEETiHarO/ewKrAWZOuuIptUwHAXHUuczF/rqp21Lg/HwLfQyScEVsd/fZjf2aeFMVqmq8jSvB5jXsefX0SrdZspyBFoVO5XcIDXgCyLVzthE2/tL/c/uSf/dGLtw9+/otXrt+5l5JYK58kG4+iC82/+v4//uyF5leffvq3nthacRwDwQiFiDNYslTGCJjz3tVB0OZnRhbdex9T1Le/09PEPGuO7XB9Y61aBRWLkR4b3l+QuSzsYXh6HZPCLImAolCjoN1ue78Xk8K5QW9YFtFlPoRA4ZnKYVRbFuF0+vtBcal+VYxxISGc8FoLb/7rGaGCCKggVT0wVeHVEWZKi7VTJBVMFKN7DwqmZ/F6QaKZZ+1GLoYU02FvuLM3HE0gHoqK5WbK7Wn89bWhF7awD2lFw8xEaGCpoJMiWX84fPvGOxQfXN7M9fLl88udBrKJZC6LZQdxyTXaIsE54fDeoBilohzH3iRKub/ViZdXNluIwZU5Bj7LsziIylg1jjoPhkiXgCL128rlJSZtltoodLmIViQrFGWZRsPxcDQc9Mfj4aQYRzVzLqRIrZoVPUglXRTdK2HIquvZOcCN3o67tkdChCIM3rc7jdXVlXNb57Y2N893m48tI6vqfgLxcA4i1UNrBm80g5qVycxUxdjMWjPVvjllIFNNtVZ8CITAtCpPaa2P4HTG21mhKG+Z9yPB9lBv7O/9w6sv39zfu3fYR2ihGTJ6p/BmF9c2vvD0U5+82Gh7n5E5EGAsk7MoHkaNVWZOqinMqjglMzJSKqF0AscpmDoZGPmAr+s33mvys5qbvB+qzXJdx7SArBYJPJaqBWCskd0DAr2BRpQERK3Wj63YeuBAgWTESgNLCAeGrUc2v3Jh5aVbwx++8Iu37+5EF1rtle2DgUCL/UH/xReu79156rGLj29utIkgzOqT8AKnlpKWAMK0D1nmWHwWrvzjiPru3t0tSzTaOUqsr6+Kg0FB07rJe14wbNYCLovVsrAzGvZnfMVVBk1LcVxZXQ7hbhFHNBkMxrFIMO9FIpIZz1y5j0eSSnb6RpuGqnujgra04983Lvbmv44JhRAiTataNiPUsUoYyZJMl5dSjA+9JzSN7Xa+vrbcbrUmPcBk515x+07/iUttEVot3nAkF7ZYJAs76yFAhCQdTVEVunb641t3tn1omkmjmT3++NVOO3dZs7ToOnkJ9EUTPMJSo7vU3hnc2N457B+6DL3dwd6SNZ7a3Oq2M7Wiv+u8ulwKTWWMMVmCJIhTmDkPkC54D3H03uCiSYRFs5SQtBnLLEaL0VK0GLXXHx8e9vu90WRSlmUUJMDBNeHylCxpVayUUi3FZGbiKkHAJP10/e7Iv76dedfUmI8OlpvZ6sryxsb65tb6xsbK0lK32ZJmixR4B4GrKHnpYGoHBb0IpZaxrxlbCBGPmvy5etNNhSFKYahYxkqiKrslQIUT4GY/vnjt2nef/3kvlWNT315SYzEqug3/qSce/9zjVy63pSXeRTYTckGoPUqq2FJqeplZ3+NRr+p8YmqqlU6cRinIX5EHeNetHvaA4gbv+7G57QZFf0kGgg/6A5SqaGoRSDCDJqjDVHc9JQ8E5wXZKsIowqL73KWVZy586cYo/ejFmz/9xS+QUndlyXu9ub93Z/fOjcO9O09dfWRj84lWsxJtd7WkgzNTTaW44yCUR7I8C/t4ob7+wdgMQvHi8paTDKlSqTyhWnKMDHexSBZ2ps1Vgd+iJqMLnU7Hh4DRBMaUKkIr8jRi64/cZtGN84FvPtwYYVJnYOeaPxf2PkAg0CiEV3plFZetznapwiIt0RKtHquZvh5eU0KbgRe21ldXlvf6h428tbfXv3Xz3tWLHZJWz8WYzqTCFs5/YWc66yeETGLpvaOgUA5Go9ffeuegNyI7SdFuNx55ZCXPNJdsOERnpT103tw4eg3IW+qbrSwLcXtXx+N+1NjwqZWHdrvZkMbYO+eZaSxVk1k1dKaGmCpKR0ZFVItqqkUZYxmjhzKrYReCGAlzoIABbI0nnRgV5sqURuPxeBSHE97eKUYjHYzHMcYq76cUBZz3NTmNMqoVk2I0KIcpdsXGcXy3P3715h3nRITijMJmo9HuNNfXVzY3N7a2tlbXlrod5N58VkeWiCMCk9IYBDSoIZW10EE1DdcIuQBmmKhVbYgGTAz7k/T6je2fvfr6wWTcL9U12mW/Xx4OmsF94fGrX/jkU1eXm23nXEQjoe2NseorrZKWYmCCRkPlZNK0gigVbrepOPp9DNbv1Qe91yDv4Ny7X27HyO1P/L3TNBB1irQVFRyvVCmMqBhoCIFRXSqAAMuRUBTtrNVwriTHCJn3a1949KvPXPzR86+9du3a3bt7oZ2HVvet3YN3fvLzrc7Sn/zT311xbDeQAR7MgVyCo6PafFLY5rLDC6f+8UJ9jrkxpVg6cWVpOWmWCAHUILao6y3s4dq4a600TSo0AQ6EWiLhxCeln/IUTXGVnh2/p0dCffUUFWi0ma4A5to7OZ2zUj4gGbl4bN/zlhEAnFJi1W5ls/ZNJRIswZKYis344R7uiMmKi4/c2tpcW1l9/dphTHZvd+/t682nP3HuwmZuJ9qZZgM0i7W1sLMK+1RZJnUBZogJvcHwjbeulWpVCLhwYbPbEpo6YauZ5SFXleh8zCMnmopyrSsNv3ZxvdXr9YLY449cXF1ZpbcI1+gGnzkpi2zGiWmmqjGmmGKMUVVVreb1T5pSTJaMqOj6y5TKmGKaqCKqlqrOkPssNJrO+7LZLLqaUvbIViOqV7OkVhRxMBz1B8PDwXBnZ39SpjJGMwhDCMEHzywUxbgEUGHQlDA7sf+fvffqlqzK0sW+Oddae++IE3G8Se8dkHgKKKDLUEXrqvtK477coXdJzxpD/6B/hx5khl40JD30HbrdfavaVReFK6Agk0yS9KQ3x5swe6+15tTDjogT6SigKEjIPUeMk5HhTpy93Pym+b6V3JgNc2XJ2suGHTMRSZrw3p1bRhv1iYnxiYnx8bFGc4QbNbCg04VLkBDYbUYTWSlRUkUg9UBkeEIXWCyKD09f/PTs+eX1dgBq9ebK6sbE2PTOLRM/fe5IBm4423Q8onAOiSpJhNtkpu4rajjoJtNK+dSmqByItKcgduepdpdA4F1Y686MHaH0Ab78BDJfBT3eLZ94x7fje94/3BHda7GzQsyIoNjTlSUhBRJBFJigYIalaIghqgJneLRm5jIeffbw1onaZ5euLrRa61HWfYiFdvO1f3jr7SPbtz2xb+9cDaSIighYMJXi9ZuuReUlPKqob2xsYqMjhW9TRisrS43padV7hVwqZ7Ky75NFjayBCGQNCqytrHrvmTlEqtdGDFsFQiiIH7pETb/ivw/87izyHLoN+Lmi0bxffT34lO+Kw/NrAKF7kMV3+X1IiALYU4/ujpUNYl+lSYBIiEZFy7aNH0KzsyrQHDE7d06d/nxldbVDGq5cvXbp0vjE+C4yAWw3A3+iQ9rOlVX2kBozC0EVa+3OyTOXbt6aByUimJoee/yxx3rUlwZJvQayZoTTVGLSlVZHNDjWsTTBRE10opZls7Mz9fqIingNrpYII0lUBBKhqlDVGAyF1EoyYiR6DUElRgkSfPAhBpUAgGFITSlvoEoQ0hilWxRegghCRyhyQsyGjYsx+hAliiIzND4CHo3C3dwHZVHkuW+1Oosra0vLK6t5JyQmlLST2q8aLGsUDEdlRIIwUHLwKiG/uXguSzhJk8QQERKD1PFoo/7EkSOjjZGJsWY9S52DM0gc6qq+JS5hk5FhdAmLMX6+vHbuGew3swAAIABJREFUxs3j589tBJ8060WnSIinJmeffeKpJ3fW99dco2wCVpWQixQ5AhGscQqoGCiIE4IFYBUcaQBFypsQ4iZKUkB4E1nRnS76MOLSuwTnewJk9BUqYsoU5P0g3AM/Qzg84A3DX65XNDE47UypDCuECKMwyogCJhhWhpBGNkqs0PXYqTmTgJm1RqpQ8dFEPTDS2Hpkz5MHdnxw5vrH5y/52JVaM3HmxLnzxUZLRMLundubiQMQURTdNE0wpGGv99SfVqjvkUF9E5kHtddzq7q21tI4PZTek837Wl4ZKcU4q3O/sofUhyVEBUQEYg0zUwi0vLwavDfsgOgSQ4YAhAhLDDZ31rrLA5DDt4maBlFE0s2jRnq6AkKkShrRRx1D4cYBOY30NVfoq+go/Ok/vwbrk4Dkofk+2ucu3gTaCiZIX/mpDD/3znD63qM+Fc1BlCV8YM+202db6yuXkmRkYWn58s2VA0d2uRQJiwEzhEA9sd97CqCqcGBlf8YwWG8/1JL7UgfKNgCDe2mhoVloyDhrfERXsdpunzxzdb0VyTpGmJnkI/stegEzYpOIIGs04COY2Zha6n23KIpCRV2SOGcTyz7vZrUasWFHKmAD1vIjyk3BIqqqUgTYkRVASFVVVaJGICaiqiIhRC8xxCCiQYPXaJxVqBB8DCFGhTIJYqEcI0FEoxZRuhpZwc5QFIKSjhgebezdOhple1e5Y5NWEdrt9vp6a3W1tb7e7rQLLxHkFKJKKoReO15ZA8OFaN7JJUaRwITM2YXl9sUrb1pmSyAgyZKpyYltW7ZsHRvbNtKYGKsnE0kYwUrUSwv5e6fOnbxwwWTZSH00b22MOrd7evJnLz05l7kGUyMi7eGnoAZqrSpFDWBDALEFDPeh6bCc+EAZGiUZCjY1VeNdR0bvpUqbMO/+XulXKlWje3e0O6ST7lezSQ/sBrz38Cm7BWL/PpWaFOhjMU4GUVBjUIrLR2g9awBaiEdRpEzsrDGoW1b4IDqTJj99bOfs9OzvP/nswq3bAZgYn7i5urr88bHri0svPvbYkdmRhiGb1gbtlP2rxlwRADyaqK/W8LbVTVIIyHdUPVyaRQnKIOpNUYUtOcv77LXVNKns4UV9PiCxiWGP4Mu91ecdFV+EIsngEnEpoqi1iYCClmQuZcmDEKRHjTJcnU9Uav2Vk//Pl0IjkIGh8uwHCUhhSv3bXmO9MAsbjYyCyPdV5gzI3oF2SL91vKd3MP5+lbj8nxOdftXvIwyxUMDIQNpJHWDQUyFOFE5g+l1u8udMVH4LJkRF7jc8mtunJg7tGr11eWJ9ox147OS5paltV59+ahvFIjGBiUkZMCA7ILkbhIrvZHzpr5++NhVR1Xpa2deFfCXQK4koSSJihAAqKlGQmppRIBAL9ZZrmU5KbCFYXpNT5/PPr3eERynK7BS//sqRERItYmbhkGlPUptShkkzx6awhTcmpA4ga5211nF0iXMcrbXlHm03+6n7glaWoOWHOaioSAlOCU5FNRIrVNgIQ41Vp6qiMYiqRlER0SBldaioSPSuLBwVkaAiAhEtNfpUoKqiPmqhCmGkhAbMVErqVEbrYWtdQFFZhPIittr5ysb66urGRqud57mPKgCMCSpB1KuAwMw5TBSDoBLUsjHWxY5eXlg6dnGt5pwWeWJZnEmaI1RPFzc2utGPjs+ETldaq3umxp5/7ODRvdumUpcQrCIdFFSSGci5M+mmElhPcb7vbvch1sC1tHfynvQl6QfbOve3+IHY+nDQ84vQ3JeKufJXPbUNPfBou3s6DzKVvRnEvTr74cjZsINhCQ4GqmCDNOlR7XAP+9acNUSZNS/O1fdPPPnJyc8+Pnvu6lrHjU2uIf7uwqXLrfD6s88+vzUbZ/gciSUyKoiCYAKsJARCWnX2PWKob+uO8TOfHxf13oezZy4+9fyekBMnlhC0r8eJUkVT+/n2CvRV9tD6CVo29ZV1HRYw3Y4yJQRkNY7k63VmQ4VEa7inwdZz3OMXhOv0qx4gXxP1lRKDIC2bvk0Paqr2mM+USYkgBN93r0lhAKbvsVz4w4MKlCAM4R7eBqEvdkWAlpwMfZnE3vb4Pc/3kWbOWjgKdGjvlksX2ydPb4DT+ZXWiVPX5mbGdm2t+RBTS1Qy16g8iBRPHrKxrOwHBf8w6Okqc3vGsQEQNCLCijHKUIBZDPI8iLOtzsaxk5/nweVFmB6vHdg5s2U8S6BAYWBBRgRMxrEqqWVjiB0bb2wIvQJDa61zsAbWqGEhEOjusN+m/LdqqQpLbHQoJVmqSUDVKLGyqkKhahPtmYhE6ZmqhJAOHh8yDTEMHo0i5WugqqGrgDApIMZoKYGnRusujNpuSHM/EaKqqhAVnm4urXS9tIq8lXe7hS9CKKtVa0mWxyJGigplFwiAEbjIxiVJEUN3sctrRUQMPi9anW2z44f3HHjqwM5D28amEk4QqOhKEKo1etsA3aE9O3zN7lKNuPOJTfjzAORGD4Z29Ceivj/ycrrvA/wlX32fStMHA65+srPf7NHXnC9PKVUVFWI4iCVkzPXUjR7ZtXWq+ZsT5y9t5IUiGZ++1Qm/+v2xzqEDv3xsqpaiK6Sap2ygKIrCKDhNq93lkUN9+/fv+ftf/X2tllmyFy9eIoYEWKrQf2XfS5OyOoLKkIUDmfnby3keiDhG79FlpyB1lkEkEWwCIwxtwL3DQ4jQ6zinIYejR9r4Z1obdJ/TrvdEv5iwr8h+R6sfVURc39wI3NU/eWdPZZ8p6IciX0oiCWCghinu3mUeezy7cjOurm8U7e65c+tbZsanRg+njdQLQQIoGlNK+PTa+744GlJVflb2DQE+AAxlol7eRwmkGqOQwibMADQiqigFQNgsrrT+7a0zV69cZWtrzjay9Ikj+8dGEyYBg/rki2RoECVkZmutcy7GWGIqZjbGWGuZub/zgr4YBtADO1+1jwOH7wwA3l33+yBw879FUdyLBlVUvC9ZdkU0KosiKESoiN4QjySmliUKFiUFqdLczFQRtRuKVpHn3hchxiAhD2sLqx2r3Y73Unh4AYqutHKOMFK02VqQikc9czCOJT96YM9zR/bsm7YZkffRGbXWGZb7gif6ciDqKzz2tXDdl0Z+X+EN9Gf7XXTf19HwryZWLTSCoiU7PjL6WNaw41ve/OSzk9duBIndwl9bWPxD9HU6+OqR2cywQw0IhJikCVNW7S+PIuqbnq4DSkzW2I2NjeUljE+DFKpMmwqX8hV5kCqr7Lsyb4mJQOKAhJSvXb65srTui65Qd+uuydpIyuQBI9EYBSmIBlmKMqzGEcMaPNW8r+yHi3IlAcBkHcgYHDm45eKVmx9+fCNL0hj53fc+a6T2Z68eYUUoKeh7lOoyzFIw5IfwUKCiuryVfYOhmF4nbZloFoVEQMC2VGb1iiAsSk45XW+F949d/eAPn5ikqdBmo3Z4//Y9u6brloyWBB+k0pOC63vQBICZBz+pb8x/vJKiVyz65SDA4GXlu1TV9Htl74sAAYhIlmV3Qz5VFQ3eq6qIimgQkYioCAoXopTllao+qo8xhkjghJFa1J0dq5lShYaVNYJ2bI1B8jwWUbpR2zGud/OVrl9Y7d5cXGaSLHOd9kZ7daWW8Oho7fnH9u2aNgmRz4V9QfWEyAA60Pur7M8VBimjD9q70AbwIXqjzMYas2fM0DNPZLXs+IXLRQgT46ProfuP777rzPPP7N8xzoCQFHEkrakiD0VmkuqiPlqoz2U0OT25trYuQRKTnDzx2Ws/OwIl6kk/D6Jbusk8Wy3pyh5WH5YRmMrd0IHYb9Dtq8udjbaEjknyp594cqxpCB0UCF21tQYZ6Ws3kIIjuN9Q15v4ZUURDQS7+w3YlVX2/XcgmDQtyQPIoCtxYpyeenzq1kJjaSnEkLXWw4kTqzu2rO3dM2bUGosCYtETp9d+dfRmz40Ow79qmVT2p27oirKouE+kNBRsUEDYlPJ1hXRFukJQbnRy/fizW//2zgdJrR5EgbBz69yrLz45McIMIS1KrNernlMVEUCHMd4Am/WbBQlDCboHQbsSpw2/ZfDgg954348yxgxQHzMPv/2uXF/vRVG0l+gTEYlRRRFVNxOAMfqosYcLNeS5qApRJI0iUVRLPtJANevqNS6UIrnCmlaRpG2/UURmiHRjUZBv11Nsnx7bPjsxVbcmgg2cJWczJvgihCC1erXwvw0TEWMUgCHD1mCgb+/D7qZrPH3AKR27cDlH9EAb8puPjllHL+7ZlsAQUhBHoBt8llRFno8Y6rMjeOKpx995571Op5vUs09PnHrp5SOuVpIocZ+oTgEBmR9KXVNlP9idkMgTkUTLYBK6dbW9tNCCwhlNXcxst1j4PHNTJstSY6BdigSCklEeVHXeQc3IqqSRIKUyHtgCpvJoK/tBoD7i/lyPMWd4Z+jgoS3LrUP//E+frK2tj9Smb9xq/+tvL7I7sG9vw5MlRNWomwzgmxwuA/JY3XykHzuprLKvP0lp4IbQHZEFYiCq+sKrAZuMQOtdOnb+2tsfn5pfazWbE7HI56bHX3rm8PZp56AaA1SI+6QZSlF1uNVqGGXhnqTcH/meqiUwG/z8stiW6K77gxzgXWhzgCE3waSqiqpCVGUACBW97J9qCCHGkjlGITCqZiRTqEcsoi9ijCFIFBVEL9ZqIWpilNSmltQo1rvXrn/e6QYp8sgyO1k/emj/4b07psfqSegQYJKkZg0B0UfApJmt1vs3Hvu4v+tubTn4IBAx9RaHZgkx0VZnf3Z0f0bu96fPLBTtbKR+eX35/XPnG0nt6LaJNLGFh0DrWb26wI8c6qMUTz/79CcnT3R9oaDr12+d+vTKUy/sJJCqGWKok4rAs7LvgQ10iZR8m86curRwe8mRMvzWyaSzePHa6SvUnhudnOZ0DOkEsrraREAqpCUl2FA1vdFIiKSRNECl19lVpfsq+4F5FKJMaikIYmbTI/t23Xhs/ZNPboRCOp3i9LkrjYnM1o9Mj9N4ZphAJfVRH95Rj7mC7yI/V1T0nZX9CXivLCYuG6r1TiaMst+aSz2HhJgDaTfEs9dv/+vbH9+c38jqjVZ7Y+fc3I+eOXD00BQFGCvQSASCxhDZmJKBZTin98VQ7Ss9e2/e7yt9Gu7JMd73LSVrzBAUjNiUa2WRICIxxhijiEJhROGDqgYNQY1XKV8DURElsu1CWoEl4Y3ol1YWrl6/BYq1LCEr43VzZN+Ow7vmtk3Uxut2BCEFnJAGEQFAznEPUVf2Te3O+oBNu5wJveEHSErIB9ZUUfiuk3RXZpPDu8TLu1curMRcGrXTiwsj5881G0/vH02tUYpkq/F6BFEfCFt31Gv1NNmwIfhu4Y8dO3Hw8M5aA8TU51UfAn6ogF9lD6+XACqTdVaFWhu4cP7a0uJyMwnil3dv3Vendb98++LiOWvs3l0HR3YdosmtQJPZgizYKlmQVTIggkpZ1Xn/purKKvtB7P+xAACbkpAaUR/y8Ub62ktPqYwcP3YZzCZJPvn0vGvwT187VAcZcFkiR9SThValAYH65jFB+IHo2Ff2EMQlNttMqE+PKQLjiFiFldDJw/kbK384ceni1dvG1Qww1mw8fmjHqy/vqzt2BFuy/huoIEoEKxEgRP0g3nAyDfdLwX0NTHhv7m5wxxjz9eDlg1+/SbCuIjEEZhjmxJGogwgpIEqFhapHFEiEqApBRZDnXsmaGhzIu6SzsbHUXr2+eCPLxkOhtdQ9tn/nM0f2TWbWFu0kTWyMiUkSGAYjcWUWNs9DLbPVrP3z+zoqEhUwREysgKgqlIACBTNqIZjgdtXsz5/ak6f85oXTeeIW1tc+vXFjenxs9ODhrRk5Ut+NaVpxdjxqqC/CjdDzLz3/d//5V4rYbDSPf3z8L157ec/Bibwj1hIn7H2uKkmaVboNlT0s0zbG8mdJsAbAe88GYCNgEQpd+vCD8+fOXlGJhGJuy6hvz7PrJq5tQscGXbl4fOHy2XTLnpG57fXZLbY5CZtALDghk4GMgssKOCJL5KiUvIUZ9Kr3Ipx/LEJcWWUPs5XiwETsKGOKnLgENtvCLzy1Y3Vl7eyFG0U0wYf3PzxFzC8/s3v7hK078j5CkTqjIRpSa/gLPPbKKvtTN3wJPhSJJWJVEURQmpb5ZDA6Adfm/fsfXPvw5AWb1okYPt+3a9ePnn2smViKqirsBAYlZadztkwWGnN33cbXS819mSNgU8jgq5wXJRb9ot9Fd4HjXqbP8J26d2UqXnvqgoZEEaQsD4WqwiYxwsYoo43GcuGXFm5fuHGj1myGghzik4f2//jZo1M11s5ag2zd8khiLAlTqSULgETVPhjKVvbNQT4AMGx6QJ96nC4MDpAAGSFnINTyJnE7E3t0564F9f/86UdTW2ZXltd/89Gxo3sOzmRsCYmrqjEeQdSXYmWh+9Jrh99++52F+ZVOpxOCvvvOB7v3vOESJoV4b60jgi8Kl2SVf1vZQ7HvqRKRtTb2DQAbo2oA5wxfutE5cfK8dTZNsvb6re3bd2yfo4wWkXdVxGrOkjtqta9ttJcujVyfGp/Zms5to9FpJE3EHJyBU0IiZAOx9jWpGbAA3Um9DeDL8LxVVtnDZQSQ9ukRiWAMDMgQmA3t2jnx0gv7RYvLNxY4cJ6Hd945ziF/5YVDzRoamU1c2fCtEiMRGQZUtEz80aa2cgX+Kvv6+7xo8MoE50iJY+j4PE8Sxy7xGgJxhOkGXLy88S9vnjx19rKYWkCXJbz4zNE3Xn16+6TTHGyQ2p6kuoJQsn7qfTDYn2kP/xM/9oveTsNCdTQEC+gBq4/ABgBICESQUrmdgNRl7SI2m7VlwWrROnPluneJgho1t3Nm+9HDe7dMj9ZRGFerk2RMCdGwtHr54Vqt9W9p576DKHWz5hNkyZbsRFChCGNpz6R9Nt1/evH6Ut7Nu90sq733yYnZF55qehpNK4nVRxD1MZR8mqU/+8Vr/+f/9n9bO5ol2fGPjx85vPeZlw4QUbdd1EczIhLx1eSo7CHa+IaKZ5xzZSO+gel2QIS3fvf+/PxCt+im9ZDUafuebdtnWVquu6pBlSMTPGsxEvO4vuLXr9++ecacH2/Obh/Zvt/M7UY2QSAoB7UFIxJFAgOpglV4iNcb/aRfZZV930xAERTLJlZSCyUDgElE65YePzwX4fVDf+XactFBntPv3v2o01l97cdPwbhMUC91H5hBiCLQMvsidJfecmWVfa2gBMoaNlYVBZSdTZ1RggeJugDu5vj03PI///bYpatLSnWNndTSE0cP/uTFoztn0kShQEJKKiCospYhCf1Bzku9Tx/Yvb1hPTKbUrVQDGnvbWoBEWYf/YUb8xduLfikxhQm0tqzT+x97MCWEUOmoKxWSzRYxJ5uLPHmL67W+rc82v1Lvkk5TihroAEBKUQgPJ7QwaZ99amn/v69d2CYs+yT8+cf377zyZmJCvKVZv7mb/7m0flroxRZLRWlLXMT589eW1leHWuOr6yszM/f3rNrb3OixjAxRmZmQ9RLaFSLu7LvHvKJSAihlNYtU21F4RnMQu+9debU8Yvz84tJQl2/+NwLh448vqdWcyDDnBhTs84pkVKIvuNIUmsMJHRbnfW17tqyX160IRgfoDDWsbEgLnUbLGBUBt9hGPt9I3Hi/vYtAIRYiQyUyxIajZDO6uXPePWag+/yyMi2A+nkDtgRUJVp/CbdJgErmDf5Scqm+YDWfPvmhdBahiqNTNTm9rrRWXD2fWUtIQECKPRln5h6TjFiCKIhTczkxGi9ObK61lpcXsuyOrG5dO3a4tL66HhzfGJEASYYWyqglXLX6P1Er/+KKkqXyr72DFViACJeCmJidpGth/WwSna1Vbz38ee/fevj+eW2FwqqjWby2OGt//XPX9w+kWqBlCllgXg2VBLDCBkFAUx9tb4fxsZJ954jVCbwCUMcZQoGGVC50NGTnidSMgImwx2ipXb3d8dO3W51NM0c0+Pb5547vH+6lpDEBMgMMYQJxBZsejcyZfVo2QJR2bc/+oOUb6FBRVIhWAtSQAIbYTRq2eVbSxJEi2AipN19/OAOa0pRlAr1PUqor/AtZy2BWc3s9M5jH39CalTl9u1b1vD2rdtqo4kxVkXJmOEjvbLKvlvUF0JAX93Ie6+qDMtK1y8s/eYf39tY64aiUMp37pn+2Rsvj041PRA0VR6hpBFdPVgTrWHnhEwR1UdiNoZQdDbWFm53VpaKjRUOuTFqjLFknIIDUsaA9WqYRPub6u6rUF+F+r7Nv1cR+96hKQs/ymlkDUfxPoY0cROTjayera23FxYXg5JJG/NLqzdvLqVZbWZ6lIm8JwZZRhkVJAJ6vBgliKwChZV9zflJEJXC+9ywZZvlEWsdFXLCfHVx7df/euyTUxdXW53V1gYZjDSzrXONv/rFC7tnaimplVi3hFhI9JxYBQlxubQJxCDu0RB9r1XFtc91eodgitJA3b7EdlwiPC2liHrPqJIqiECiHAABrxTx/I2lj8+dL5JEs1rD2deffnzf1LgjpRhq1rqS/oYdyJYAsryWg19aob7vFvsbGKtkCDAEI2ANgLKxTIT6jas3i9xn7JYWF/buPVwf4YRQ9WI+ahWevhBKTEMj9u6fePnll//1179pNBpjzcnjx040R+u//Hc/tTWCYRVVgKu4bWUPi8eqxhhm7nQ6qmqtNUxLV1Z/90/vLN9c2mgVaS3x0Nde//HMjlklD2OjaOSgth1sU9OU4qiRrnTWu2srvr2OopNQSC03LeerN9rtlbB6K711MRnfUp/cYifmbGMS2gCnZfpimPCtssq+p251Xwx70/Uto/YpG4YqoW7NkX1bjXFpdurk+ZtrbZ/a7NZy/g+/fv/29cWfvHRkajSNCu31+VAvHlKtjMr+ZJPoQ9FNspqo9YXCmDQzrUDnzq6+98GnV2/N35pfADEnRKaz78Du1195dse0kyK3htOUSCMMM9tYFEjT2AvjDJXFfc/56eiPPVnKz1JPRqWUdBMCoOUz0lf3JgZ7IPf5Z+fPB2Iv7JJsdmxk95bplKAaLJRJCVRm9u7YLBB1M/JVwb7vaDIooOQUKraLLoxnAsAGXAeCx8s7Jk4daywJt9ptBR37/NLU9P4GwVWo79ECfRYxFCEWxiZ5m37xy+evX7px/fr1eq2+tr740UfHG+O1559/ujaWiiiqXt3KHg6LMQ4ybGWRpzFm4ebih7/7+PqFy52VVm1kFEaff/H5PYd2aI2IUjKjYEZOUuQhH4shZZ5cWllxjdmRcWR+Q9Zv+dXbobvCRWuElIoNv7DQnj/XSZthYqY5t9PO7pGx/WFkq83qJXGo9mrYqnVR2fcQ8gEKo736DYVutqeqD0RIrc1Fc1845iP7ZhqNRjp2+aOT17vdouvzmHffff+T5YX5n7x89ODuLb4AWfQ5/LSs+KwucmV/wgRVQK0R4qiB8wJq3YbH8dNr7/3h0wuXr6qhbGQ8SCet0dNPH/7xj57cNpo5jYlKxkSxQIiUOI1S+CJJM+23PvWQXy84YX4I67jv0A3hPaDfwKgAtFQ+VCrBHklZwlA+REQE9qLtjr91+7awLXv2Dh8+XGdC7BgiwyQ+RGYm1hiZGYRSLkBVlSKIqGoU+05nASngCYTgTIcKpZjA1tWkqmNCzZSf3X3gg7On12XD1mpnbl57xu+fS6pr94hVeCrF3IfU1WMgy0hrdu/uPW+/826n3Rkda6ysLt++eWt6ZnZuyxSDVIkNiCIg/SjZg851GdQe3O9WBYQq+1L72H0CWpDynGIQwNFHgA3z+srGv/3T746/f0I8J2ktj/m+Q7t+9pfPTsyM2cQIGyFrjLGpIesiEFnUWdQnxY3mcB6OTJKkKbFVhUhkaGopY3DsxPXlfOHq8o0rogQiQ4FJSD1JgAoxgzclqstvCC2XifTbrhVD/9z555SvjOiFZqnUCVRiKuWoEBWARpJ85fJpWr3mEHKu17ceSCd3wFUVnt+w//TIVHj2FNDQa/AZuIgEIlEVUWOMAlHVMjcbyeyWcTLJrVsLsWg7R4XvrqyuXvj8SoDObpuTfrcUkRLpcNWzQrXnaW7eqPRLtZz8EQj9k4H+2Bjd9TGVfbeT6J5RoAeOXN97KIsShXqbpPRh3p3vZI6KjY6PlFJiby7l//K7C2/9/uTtxRU27GO7yNe3zDZ+/tpzr/3oyHQ9MTGmEuuWKQYpcnYs3sdQuHodzNJvYmKAFb2eN/6+Ryc2uTz6V69kWCEM3/qV1kw9lt0+jakSKZRzrx2lC4vrJ67cWClCOlJ3vvMfnn9snJBGn1pHIBFhZiITRYhZe3WiAHpNvfw9r5d96OyrVserIldYYstC7EEGNoExERbMASNT2bvHTq6TFJa6Qfbv3rcto6xCfY8U6hMQmwRgw8SWVMk69+RTT7zzzm8bzQYpz99aWl/tzozvnpjMWChol40nkihS7pd5VwwTKW0COu0f4RS15/XKkAdcHhI6UK+plvajjuQewAAmQNBezLLvNEQqY4siREyBWMkyd1b9yY/OvfvWhxsdH4lyhJ37tv3k9R/v2D3DDGgkjRbiDFkma2KaIEtsktaUU3Ip2VRMEiktTF3SUapPhqQZbN3D+ggoDNRK4NjpLN1sz1+MS1dNvmwoUupgHYiCmtjjrVaNnqInBGiAClQQosYIVRAJUdTB3ytAJESgQPQqIZDxzOXZrID4gkPOJGAGlCQsXT6L1WspfEFZfev+dHIHbB1kKtRXob6v61cwDcgtev0/TMxkDBtDRJY5MZwwJUyN1GyZbcxMj7Rbq7cWbooztjG23A2ffn7t8vxq0mw2R+vMBBgGkQrEA1ISaQRwoShvsSwcUZAKaQHJEbsQD6jC3skmPuhUGj5KdBMqUHWIfLdLRgZjNHQbAvi9fBBU4SG5RiESSNAC8IYUEhBgPWvZAAAgAElEQVSCSAydggRERiKiIII2BKtqNcs2In98fu1vf/XRsVOXhLUbNkBrjtefPLzlr372ox8d3j3hXC2gyZzAsBJEiUCssDCpBauXPIY8NcYIkSgTl1AF/MOYPjyM8Qb3ypa7wVbGAAmRMoiUISSgyBoJzJws+fj25ZXz6+02U9PoT/fseG7b3Ag0MaZfVuOImHo6LcNsZlzyOfV6hCv7TvBhbyIoSImY2QCOYS2MFaIgZKlDuLqxeMO3W4J6NjnVnDgymVao79Gq8FR1pNrXeiRYuBTTc6O//Hevv/Xbd7rtYmZmy5XPr/9/f/tf/pu//vf7nmxYk66u32rUm8xJu9UiuKyWPsCvJ6j2KsnvEwCstobK7pk4dAfkw1AHhipUIyREjVCyJumsddMsNWw6K/HD3594+7fv5S1Ja43F5cXtO7f9xeuv7D44q1CKahK2vYRbgCAaREPB1IKkwkURgrcu2CTYNOQjsWjE0GHbMNmGdletW5HQEt8OoY3onV+Lq51ue7FYumrGL9Rmdo3M7eGJLTZrQm2IBGuYGdZCxee5MczgqAIi7vmyCpUe5FNVxF53FRNgo5Jo7y9mgJiIqRcD73fkAwwF6WYHf2WVfS0/gQb4ali07A4gRTD9GjgBiDE3YmqHt4yNJFNTzeNnPp9fWbbZSJqOHj9//dqtxRePHvrxM/u3TdZCIEecWAsNPm/nEWoy4xJ7f4Tc1/dTflAtiP4xb6eyh8Dl/KPjRYasQlUUAhCUlERVIgCbpYANAh/gMkRFAOVEJy+tvfPOp59fWuh2yWQ1k6JmbC1LfvTM488dPbh9ciKFMTk4kgKGActkU7AFRVWNCBB1nJjeFqwikJKXi34YV56G1usXLYvhRFxZ5cm9KCpUqF3ofKvocBpsSIzsGWuMKwz1d4m+SJwObRj0x87xyv48y+u+a0xBAooEgrAlckwy2N6lACWJw+zWCVpZEOVWHm7eWpIDzeoC20dsOmn/hC8rHsikMBY//8XLvuvfe+eDEIp6vXbx4oW/+4d/eEN/eujJ2WY2g8jiJUtGCFANxDQ0CcsNqH8Z1Q9q26qDurIvD/xKnSEiVVWoEMBEZKwGo4Ju1ydZYmDWFoo//P7Em2++013PjXM+hO27t7/yyou7D8ymNeN9JMeinpl6REQMowRiMmBB05igwcfEF84ntkgSyRMKGbnEhBGT1TlvomiFfF26LfUdCR1CRPT52nxcX+guXA43z9QnZ5Ote7k5bdNRoKmcFZSqcZomnsB9XnwCCJFDoBBgymoYo1SSpyXa1z5KANPfzsk4UoIGaC/H2U96VFbZNwX8vmhbvitQR1GMYNyZJ/dMTY0+OzE+9cGJ07eX1rXwiUvXN7q/e+/jm9euv/rCE08c2EaGi3abNc+yxDoDgkghQYkMm0FCj4UykA6l9+gLHR+656HqOPluje8D0fX+qM+CjJJ4EFnDhgauqlNE8kHJihqTi7S60Sau1S3ePX7l7d9/srjUZq6JctHprK93Z2caP//5K0cPz07WLIODwKagiCgIAIgMg8goGQViTACQQKIIkzNMTlUliBDIfO/7+uirIAW9EyveYUUR11ZWy6OX2U5OTPVLbu8XYKRegXi1Ah+ukac7ondDkQ0GyBFmZ2b9ydMwLi/C/NKiYnd1Ie0jN22GUBn1hVGzevrGX79GRO++/fvMpeMTzUuXLvzdf+7MLz/3o5ePpnUCiBlE0um0k5phLt9qAAbcEO+LAWJVhFPZfc+Mu3YqvXvvkuBzNmQGFYxKRCyKNDEsaK/hX/7pnY/e/9i5unOcx3xqZvznb/z08BPbrUmKQm1CzBpCVOWS/AUAUYkAmVmNtRGURhMTUySuSNOQZxJq0s3U11GMSNLSoiNZW7O2Fq2iteTQTUlN6MSihbVr7Y1b/lamF483Z3fV9j7OcweQTRkYrzYyl317/aCIsAhr2crSa3xXWAEXgAAWlGg08IRAUT0SMcYRqxCIDABERuR+15+WvY3Vwqrs21qyrGolRjGZMbuma82X92/fOvn7j86f//xK3u0Y5qh8+vz1a1dvH9i788VnHjuye3qsnhFUJUDUQE2Z644RbJSMkimbAbTvmDjcxQhBXxAjQtVH9B2H6WjQW6lDA6cPGECKRB4GBNMviBcV5iAx95LUXNncSSnl7fD7P5z67Vt/mF8JSTY+ktY6uc+SjLL04ME9f/WXT2S1NLGmJaCIlCAMU9ZsGkRFjJBIDDgDx1QSyzKbKDCWtNQs4Ui9lmh+5MZNUQps9ipCy7sq7Y01TrPSFRwZrRcilh9cskmDDxt6rFqO3y0I5DsgOpeEXQoYiwA1VG80826XsxoInU67qhd69FBf2YmkAFREAWIYIhKPrJ69/vqrKvT+e+8XhdQb2e3bt9/+7cerK/4Xrz+bjVHRFpg8qSXRtzktC8gVsH02+8EcvDM10ZeSqQ7rapMaMrnf82KtEpSIIapiiKgUXYLi2uWVf/3nt69fveE421jZGB0dT+rJj1958fDj2xuNxHs1jpgpxoINQ9FXWShPOOKyvkcDA2pJrDPGGpeENIthJKSN4LuSdyRva5GLzyXromhRMgq/4ot1EjWUJ6bIkNtYdFaW1jbmNxav2+kL2dyBdHp3Or4NaSMXI1o2vZZEBgAbMlzmMUFWaVMkDQDFDmmbVKBWOVEgwrBhVVX1pEISWQVQBW1mECur7NtYr2oYhkii5nlBRFOpe+7A9Nz46O8/Hv/szIWNTrfVaheF+Ciffn778q2Vx/fteOHovtmJ+kQzTa1yCBAPAkjQ7ywAsxICoECCspz57j1Ce+wU948dVQvgO4IOvQa+AcyT4UO+D+M3Kdy0F1ru0agIYoRXUgeyRlPTViLGWis/cebyiZMnrl2/udESo43W6oZLnMYwMTb21NNP7tg1o5xsdKACZ5BatGOMG94ywZj1diiK6LuFFGJh6i6pu7RRo+kpJkYEcq9kYpRuYphgHjmNkbKus2RvGj4+CKQS8y45V4JgY1kiBDB6/4Nb7xeWqRbjd7skhwtxeyndgaCjAoA1TsplSDEvOtVFe+RQX+mJElFZaK8ChTJZgZDn2lj2yzdeyWrpm//21vLSwvjY7PLS+vtvH++2Oi+/8vT2vXUyGSiStXeserprS6B79oxqZ6iQntwL+e4tFOLSTQgqod9dpPA5zp+5/uZv37l25ZaIhDyGEI3hN/6rXxx5bptxFCNsQnneNYaspRiDMUy82eLeczxAHMuWfiZisCGjxmmMsFmM3vu867udkHfV51J0kbTSrM75iLaXyKScJCa2pGj50E6TFBI3Fm50lpZx9VJ9Ztf4tj2Nme3Z6CySOmzSI1xRUpAoRSVVRgk+CQ6wgA0Fa4fiBkCwdWMgBA8yQD/eqtyr9SyZ16qlVNm36lOQKlSZkTmOyjHCGt47m8797MDhPRNvvX/u8rWb1BgtgixvtJbWOreX1j49f+XJI/uefnzv3i3NZuKsWurRfemAcNAohAZuyr1M9Lg3hVCFqB/+GMHQKPUyglTKB4CgrCBYZkZgFEQFY70j5y4svvv+++cuXAAoSzNAo1cHbdTsS08/8eSzh28vrP/61/+4sLjKJnUmtYYIXlEQ5apeyHrKNDKCsNdEkRIlwNzk2M9/+vz+/dMAuDxHuMw4R/vIypWVTNjgzfNXQSIcQmIJTAUR7DCEv9+6u2fFVmfSdxmFISqHceCJMzZ7MQf7aJrWOhoRxRd5dd0eOdQnOihyKPEfgAgikzIiQi61sfQnv3yBmX/7b29KjNbUJeh7b3+4uHTrr//969t3j/lck/oI0KMoHCx52Vz/dE/BB1VRoUfb5M47en+fASAxiAgBDEvEJDR/vf35xRvvvf3B8spqmXCwCU/NzP7kJ39x5Olt9abr+rzMrYXYtS4j5rybZ5xa6mfGlAZEY9pTluYSlREzC+BgxEaXcJKZtB6KPBRFyLvq6xwy9pnWmuTb6jc63Q2/sRhaK5q3M4f6aNpg+GIlXFto3f6knY1M7n08nd6B5hTq40jHwDWhJFcHMkJECtejLIxadNFeoY3L6C7D1TC5g0dGhSgEJUIvMwmhnntcxs0ZlT5SZd+yaxE9qZJJyDCJFoUyU926o/tntm8Z//TcrXc/PH3l2i1njUubAebiSrj03tkPz9x46sDOZ47s3L2lWTeUsk1trzLMqDJge2hAeJMTcghtgktlzMEz9CA4WNm3ju4USqBhPV/SgXzYMFhQkAdHkBG1QVksB2A1x/wabi+svv3esUtXbhhjR0Z2hRA67TYHPzfR3Lp16pnnDx84MJVHvXVzPUvQ7bStTdoxFF6iBpeIS0lU81hEWIZzQKLqQyyiNzGP+fpnnzW3bZmojxhLEMCAIRJjRPLIDdhAS6gkMO0JtohkDo3EdWKkxEB5rSOzdY662fg4zN8wnPGrGs0fmqFFpB6PAKCMHgrsJQEVorq20THOxTzWrE3JVdvno4f6RJh7JLzMJKKMHgWvL7xJHASk9tXXn53dOvv//l//Ke92Eteo1bOzZ879H//7zV++8RcvvPw4ApOxPaWxfiUOEe4nzUf3/KzsUcZ+OnSf7gwQEJQRLSIogAiktLIYPvrw1Jtvvh29pmlqLYeQ79y95xdvvLpjzywxF0VIMgOCItbrNWYuim6aJGxYQVr6Iko91mlQGfglYu0VHhEzGIiAATGTM0aTNBRF7pJYWPJGcxO4Fk1X7BhcF+kMNVuUr3c7y93OsvEbdRRNjq4oQo7l49fM2JbRrXuTrftpcidGZtiNpuyESEClJgSrJ5+jtSJrt66f+qC9dL02OjG9P093jiI1pGwM833OVupTelZW2bflVBDBOYioRpVowJmzyiQEr8Y0zctP79i3e/aT09c//PjU9cXVjtY0GWNn51vdf/ngs2Onzj9xcOePntq3b/uoEAzBaBmNVqNxM1q96VyWc76fjtB+weDdpE/V2HxHPuamosY90YG7wnlljScxDISsF1coRcJyy588vfTJ6UtXr99eXe1CrYm2lecMNOqjO2Ymfvrjx/buaXBqA0U2sn/vlrX19c8vXg9FCJIY27DW+Nhtt1dhyCZpiKlRZo1Bc4Ng4A15MpKksdFgwzH6AiQikiaJeaSCZqQKURXqUfP2lrQSEcCEzFIjccu5D2p8jKutrq/Xs36yj3Rzqd2Vwx3cqWKQD4NTNTS6g0AMaV8RdX5lTURUYr3emDa22jsfOdTn2A1WMREM9/Ea1KamnDbOMGl6+LHd/9P//D/8r//L/7O2shFDbIzUW638P/3tP549f/UnP31t195GEDYWZABB1IJNGdtzAPI8ApqmrpdtVq1EXR5N8yEQl2m1ctr1Y1CDMyQolEq5LwRACBFsEdo48cmFd9/+8MqVG0TkErveWs1S+8wLT/z4lRe27Z6yqQEUppcVKA8gInWJK3Wj+xN70MLeE0woa9zLWAX3fRkmkEFJo6KkSiazGWrsC/ZFQt7nefDe53kek5xDx4V22lh1+XLSnufuQsyXjPdWfQ0dv5yvtVfk5mWe2Fmb2VvbeoDHtrDJwAkAabfBAqPaXb196XRr/lqi7XyluHnhs+lsurajrmRKaSkKHt4jShmsUdV+rVJllX1LpkQKhqEyZEOqBK9EUEpgjDGJNcl0bXJ096F9M+cvL39w8vKZKyuKTIFIyWJH3j915ZOzn+/aMvXM0YMHdk1unUicKkVYhukrm0BURUBExgCQUKiqsa5/NEXECCIYU6W7v6VxVy1P7TsPbiUV9Io2oaoqvY4hVY1RjDFkSBUxRlUFbCSbi3LiPHBzpfPRiYsnzlxcWsmLSHkhzloVxKIYSd2+3bueeWr/oT3p1GhCjEIKRu4laNEdHbGHD+w9+dl8ktRaXVaxSX2cvPXStTxixCaWRzMezSTVVob21IjZs33ymScORt+yji2ByCSJIzKP1OTpE0ArA1R29jCUWACCCCLEbp2auH71ZpEXnNUXN9a7M/WMUEptEGDAQaJGsc7dN9pSJf0ejmiMQgdapkDJ+iZAggIovARB4pK1xcWXnnyy2j3x6LG5DBNhD9OhKQ3KaZhUYJ2dmB777//H/+7Xv/rNqZOnBUTEMdD5szduXPu7l3783BNHD07OUSjIsBJDYmGM80VwziWJ6x8eZb6lSlE8wjvS4IRQURUGgVAUhYFhk/SiVJEQKRQwFsS4fbX99psfnj17vtvNrbVRQjdv7dy15Znnjj7x5P7xmSaTxNBlq8QDvfJ+IxzxZm75Di5ZUkCI7uKO4H5KgwAiJUSQiBGFgNlyZpyjqEij+ihFUF8g5D7fQFFTmylbtY5sCr9uY4tiblSKYr3rQ2x3W6ur2eJtOzo7Ors9mZqFSxkBhQcpQiez3LUkrTbAcWNh9fp5m9XTyRmiBOzABDYwltj0JK4lVOdsZd+i10iROPTFJBkCCEOol4NjJgsxCciltra1OT06cnDf3IWra+9+eP7CxYtFUM0ygetG0766cvbKW40UTx3a9cqzh3dvbQImlNyLUGstG4iIhjL+kmgMsQhkhC2jFIEXCd0O2Ngsq4Dft+kq9MjfenUTApTlQpt+P4OIrWEVQSiEDBtjCRClQrEa4qkz8yc+PX1rfmW9XWx0ijxEgA3xRqfVyJLDB3c/+8SBg/vGJ0Zd5igFFJHZB/EihSE/mrmZybFmbW2tXTBqgC0KA64bkxZdteTm5ub27picnXANl9d4I7PdsRqSmrKJxrAIiY8IZJiop6DzSAVuylEyZQWuEvfDLEU9dVOjjRHnWj4v8uLq7du6d84DDqoiDBjDRDSgbK10Gx5SH0uBzU4QCIHZgNH2UIezFy8SwDE2k2zb9Ey1deLRY3OhIeLlYU3s/mqmnpopEVQwOdf8b//jL3bv2f5ffvWbTtvXa+Mb693FhfX52//86cmzb/zlq3sPjxGRoQSM1sZ6fWSSQN2uB5AkjhjMD9onBrrc1S7ygzUm0+dvk573AADkXAZlRNYAKMgQGCZBdxUfvvPpJ8dPLSwubbQ3iJFmafDFwYN7n3nh6KGjuxrNGhkCooFG8axAr39vGGUO/3ezREXK9vU75xxrry6CoCAhKBjcK2Rh41ILJFGTFImPqfeF9xJqoWs1d9Gl0dVjbcr7DSra7Ndse9749RB8jBLa68hz2ViySV1uTY5OzaUzc9SYQFKDGoJk9Xp9pN7aiCQFustrVz5zzkzWHne1JqgBIrAVckKOiBkC8b2QXmWVfRuor6fsrICCy2pM7UltlytEWYNGJWP/f/be/EeS61oT+865S0RkZu177yu7m2STIkXtb4fGYzzD8I/zgw3D8B9nYAwbg7Ex9sCW3gwkj54Wimtza/a+1b7lGsu95/iHyKzK6m5SpN57Ukus20AjM7IyKysi7jnnO8v3WeOSlplOzOkJf/3k5I2bS+98dOvR1v4glnmp7SBZIzFZ8+3P19//7P6Z5ZnXX77y0rmV2QmbmFE3s2UoYpQqj0zkfUIMaNRQQYQMm8ShtifH6w8I+fQIySoDmudFiGJd4n1C0KgIFYKoKJGxjikKdQfVbrv/+YOd/++3t9s58jKvqlCFGAJ84p0hx/Gla5evv3zh4unp6ab3li3XmYWKEQyqoBVVwUZJDc9OZMvzk/0HbSGrJi3LEj4xhoqy7y0Ge3tPpFt27PmTk8unpmdasNovNVSInjyzYWshRiOpKnn6Jm1hFQjB8Gi0DyABA0KAd3ZxetrIncS5PC/Xd/f2FRlBgIBISnY4C0SH7Vp6gCSPAeCLEtDTqN6nECUGIAaGoYrdiMfrG+qtUWSMpamJY9T3DUR9fJRRg8bTeYAMu+N42LVNgA3m2z98ZenEyf/n//7ZrVsPEjfhnK+qan1t69/+L//72QuLP/7xXy+dniDxjWxm0C99knjv6hGkEBSAdccNnt/06GFUV1PUudYg9aidWkAQC/Q6odetfv4Pv3p4//Hu7i5bbrYaW9vr4PBXf/ODb7358tzyhG/YKlSIlUvq6VR8KWHsUwhwJORw8LIOs2QEIZWxIriO9Ixq3TxiAxY4w95yZU0IobJcOVe5JCatKlQhllWZU9H2diottjkUFAYuFBQrG7oU+oPuZrF5L1mdnVw4kcyeoHQiBmLERtbQrBEH+1J2yyDFmo9TiVs5B7JQC0GpJEJu+G10aNuPd9Px+oPGFfX+IcUBkWzdPgZDSqyKSApWOCZlNCfM8ltnvnVt5cbdzbc/vPNoc79fSRlle79tWS2jc3/77tqv5yayS6eWXr54ZnlhYno6IUEoYZiTjDVoGeGIDFnYYX8pRI+5PP+gmEGP0rIRi2qI7JIGQyWi0w9CcIllC1UDghB28nD//tZHn9z87ObtrTYoPdEeVLEqrEXiXaPps4RPLk1/581XlxeaSzMutQwEyIAUlkhRUa10GsFCBsaTTCT25OLUzm5/q9OPkQALMWDnrU0o9vY397e660no7M+InKKzC/NTTZ9ZJRQVGcASG6anNGO/IYmbgz0zJPSv+RgI1hoWnZ/yNsbUZwPRQRlvPVxdOLMsgDJLiJHU1rorIsaYQ0PwtArE8fpjXWAaTlYNL7AIIESAKYFIeuPTx7C+LPNJn0w4tzhhj6dEvnmoT2nYHkMHNuHIvK7SaDMToAixcpmLFZ27tPA//M9//19+9vEvfv6boogTrazIu2rps4/uPLr76Ac/euv73/82O5M2iA1ESWSozARAItiMN3ke1yu+Oaivjh5qAGhHeuWkzCGXUAZvjCHa2Sje/e1H779/Y3+nDUXWzKpYtDs7V65e+Iu/+cG58yeaU4lJmAjWUxSONRsMJ2NNmuNB6vMJHwjKh1yzcogRVUhk9HVr0hQedrFB6+ZPz7BEhigwRcvRJoUzA5cUVYgqVYx5UcmgK66FasGUXS47VHQo36vKLoU8cVSV7fZqp7e37Scem8a0TVveJYap0WpV1X4s+85Q2Hs4uF1Zx3YphZ0C2wirSqLEEKJ4vHeO1x8H8wEAKyBghqpGFWVlYj6IBiVGxMBg560JWJqws6+fvHZx4dbD9vuf3r/7aLUzKEWganpV7AzynU6xsdO/8enDiWZy7uzJV185d3plgg11A6DIPAqhWEbD5K0zpEFKiZIc8xH8sTJ3RAoEmEqIGGTVGAZQKVWCfhHvPtz79Oatu/cfbu+1Q4S13jQaZRUzJvXGmjjd8hfPLb969fT505NTzcSSqpQcgrPErAwZxSJMZGC8capVyLmXcpyb8ssLSae33gtFI5upxADIMi47W4mNWYNBvL6xXRb59k770vkTVy+dtgmsgQhiAIgMAd+wmHcc9R080ZFEu4ZyuuFXFubX19fdZKtfhU/v3nvtxFzDOsAox6hijp6yA0U4puMEzIuxPQ+oc0kEEgGBUaASdBUf3LypRN5aLavzZ89NWTqu9X3zUN/hzuUxTkU6ytJ06OrZ2Fip9SBwk5t//ePXL54/+5Of/qfbn93OkqYEGDIxp3/4j//48Tu33/z+G6985yJ7GMvO1YPgxx76G5+N0sPggcBQIBJFWMeGsPqg/f47H39047OdnY41noiJ4s7exuRU48f/+q/f+PbV2YUpmzKIqlAowTpjrY8aQ4Qxhum5DcTPFRySA0KZsWnW4eM4fBsTqOa0Hb03HsQ8bClhcsIxSnAwMbJNTIwhoogitoo2Ue+rcjKWXS7bxu0al3G+S0WnigMQnFOSothfK/c2XNJstSa9dQbEgJHcE3cGvd6jdtqasI0FTLfgErhM2Ekk+kL2vON1vP6lFh/R5UIdNQtAbIkgKhqUmU091CURxKoieZ+tz3xiKiw0/dy1hZcvTG/sXfvs7uZ7H958tL6dpI0kbfT7+XY37xlZ2y/ub3R/9f7N6cns0vnT1185tzg/UZZoehjPIFQgIZBNzEgv6Hj9Cxvt57C5KKBMxAgRZQUyFBW77erx6t6dB48/u31vv1t0BnkEG9eENd0qIORey8nMn1pZuPrSmWsX5udmbMM7S6plmXg2roZiohKjRGKyxgAgtUYtk0mpTDkkZtBIdGk+2djRqtM3tqGBiO30VMM0Gr3udlFWoiiLsN8ttvbyR6vt1bXB1YvLF09PTXrAg0QkRogyf6OkG2Q41Pc0GlRAEp80rX3l2vlf3btrp1qdQX99p3i8td5YnG9QAjZSq3TQwcjD0BLUMON4H74Q+bgh6pPRM4l1zMV65+HOfrfbiVU63Yx556Vz5xzhuNb3zUR9B/fM+NQT4SjXSxzF6sahLIWJraEs82fOz//3/9N/c/vjRz/9yX++d+vx/PQiI5GCVh90/uPWz371/i9eeePyW9/5tvcpEXq9gghZ5ukY/n1T1/gcnSpJGUJQZ83j+xsfvvvprZuP9nZ6ZaFGEwT41IVQXnv54l/8xfdPX1ryjo0lMIgFkKqqIrxzHuRqPks9Kkn63ABm9C1G80h1Mycd3QVk6hE/HaIrqkcXDIyhsSkGJmYlWxO+ROckizGEWFVVabjyWeFtKFtaTko1SdU0l/so21zuF3trHPsNEx2JhLzIu9RvS7U7SKYBzlQSFi73k1Jg0u6TuzJ51pspOzEL48FWI5EqaYQeA7/j9YfzEKzKQ5IAHo0FDTMnRFBlUZUIEYIaBYtGYpgGaYyhLJ0x3piyDN5idql1bj774WvLd1c7b3/44LPbD0nUJc1BUCYjxGVZ7ax2Hqx9+O5HN+dnGqdWFq5ePnNqeS7zTBDDahi+TswcX5s/CPAbn+4TkRC1UJsDkbDXre4/2Lx5++7jta1uHsqIvIoBTpJEYCNMANTGpVn7w+vnL5yaObM8OeFtahihoqLnmKx3KlUclGCyzpNpAhJjGUkYFuIpGgRY+EaSTWRFGYv5GX/qZCs+2dvL94gmHPvUhfMXVrY2dG1zr9sXx2lUNyj53uN8df3T1bX21tVTl8/MLs8kE15BpYgktWDqN8n/8ie9LKoAACAASURBVFF3KCBTgzfRxNCpuebZM6fXer0gOijLT2/enLF0an6lBncCNUcCwyM502Ps90fdoiNpPj241FpPYkegU+KjTz8n51RDCOHc6TMn5psajtIgHKO+byrwe/7WJR3aCyJyniVqFUtvfdJizpNX37x4+vTKO29/9Jt/fH9rZ6uVTXvbzEPn8YPNrZ3Nzz++d+XqpevXr8/MZURUFvAeR6gWKf7O86/Pb2ajL3X68vy/UZ+LRPT5bYAv2J7Qr3M5f09E9gXcXPrF76JDTqAv/UZK5qDcp0BAVZiqkJ/8p5/dvf1ga3O/yIOBJ5g6gJycmXjzre9ce/3s9OykMQasMChDQazGcmYyJRMjYlQ2dNBa9rvOin7hWaKRiMlQy4H0yPUnHbLQjKYYiLgWO2Iws7MaY4ymjKzRICjyJMvLWOVJKLxWSWlTMg02jUZjjordQXuj29+1QT0bA9FYhLwtQVum8gb93oDZTaZuu70V1u5NZNNslGNXUSlRxUbY4ThVd7z+gO7hiCGoZ0dqOod6yA5gA0OHcupBbVAIYI1xJmgMKEPC7K0FaWpt5uzkxfTymemNvWt3H/c+vvX41r21bn+QR81S6xMfysH2Xrfd7Txe23znw4+bqV1ZXrh65fLFCyemJtyBSMtBvwpGTd4YH3wdm2YCHYo9PFdm7imF+BHKheKAqlLHCCyGL+nhr/6XnTbUL4UoT/1u/pozv3X/wHM/U+jwrxdBGbiqsLbfe/+zJ4/XN9bXNzu9gSiioqpiGUTJuIQIilhmjcaFixdef/XspRWaTVzDGmfIaPSIluupvEhVScZwmgFMMBAwDFlWRIIxbNSQCLznFjfAUki/ouTE0txer9jc31FmGN/ebYfFhXOnl06unHqyvre2ttvthRCJmAn49LN7D+7fuXx+6a3XX7p2aaWVZsYgEgwCRlfwWQRIX9X/Hjn3443QL9QmfjZeYhDAItTt56blkzT57vWX/sPPf9nyXmVw68HquZOn5uY5Ix4x/clYcMWHU4IHp4F+Zywyfq6Oewy/5H5SGZ0owoi7QJ8JzUchFdVB7JBfly3ZCgzYAP3kwep7t+9gfnZycnJvb+tHf/fjeUeJHJ/9Y9Q3vAfkGQ6M2rPWo6FKBB7WR4SUXWZjwNypqb+a+/aZi2ff+e37n39+d6e9CyWU6il7cnv/4c1//Ojt+2+99car1y81ZhjVga+OsAKUgBRFxWgROSI6GPwTUhFhgtJBO3pdwA4S4ZE+J3A/qOfQOFFN/UfZsSBBDnGLHnzwuAFDLdb94gA/PUSov/v/L8V+8vyD4/p5w1Hv4fzGU++pf5AA0UAKQ0TEBwrKZVFaZ5kJIiCqyjKG6JOUYRFHvCsRa0/y99759MMPPh70i163L6KNRlMkFmVvaWn+2suXv/W9y3OLUy51TIe6C977IfUmkYLYwH4NJr+DZAMNNUzJPPP6kLxFR+kPPgDEVFMbPR0B8CiHYZjIkmUrXlXVlSFhRJeVqavKtCybZd4siskQCzaTbKf9RIfL/XKwG/sdDv00VqlWPuSKYHwjsCuDWMT+5l2y7Gl/GjuSlP2i6Lj5aTep5pi2/nj9IT0EYUzg5zCD8lTCcPTYjqtBw9QzgHVOpf6clOHBE0ky10guLDa+9/L0+u7lz+6uf3rz8/X1zaIsLTF7J4R2GSXHTqEbefvDh+8beyNLzOml2dcunTl/anZ2JkGERCQGiYWpy5IxIJbQOAyGmMAO7EEHtlRFhwKBAMB8FMspQxgiQ6pcw+DRjG8kqKoooGQiEMEKZREnwQBg/kpVD1XoCE6KDPtVmYfHn43YQco1z74qwMxUM+8/RxYdUBjA6WHr19NRNx+NwAnRSElRhIoQoeS9J0AEzBQJRUBRYa8tt+7sfvrp/a3dzkBiL5ZBowaoOFa1QGJtQlUsBzOJPX1q4dL5M2fOLM3OuMR7Z5AxTJ0tIGOgTAqwkgXTUa6vWkrKEMxQZ9WACRqUNThHWdoolFsNXpiudvdka28QAGK3/WR9ZfKlVmonTs5fObl0/8Hju3ceBAWTi17LqDdur91a3T93/sx3v33t+vl0UqoQ+yBjbH2qWJUVasBRlJkNEEMMZWmtsd4JiT4PBBJ0jBhPR0aZ+UWqJTKMq3dknfogNQCDFA5skkYyABLLJ6ear55Yvv3wQYTssf/FJ/eSxvzLK3OpqhaRDIVyYDOvbCJUlQCyACKGtSMcbR0btw9U50x13HIcu7Avsg4RUiAKYEAGasBGwULjhDzKoiQKCKkiBgwaxqsY7QmnaUZY26e20Z/+9qZZPrVdtLXb++H1l69MJS1SLgMyd3yiv2Goj577nOnZg8NDcZgNJBoFw0xExiHPq6h8/sryqQszq0/e/M3bv/3sxk3KfciFFUnS3Hy88x8e/+TtX7935uzJH/zoO9MzzraIiKWMisgGznmCBSARZVnWbskYJqYoUQBFHDpDZkts2HwdMgv64rLP0fqPvuglb/3K/38hk8nz63IECPRZOi59Ck+PvRBp1O9RhTLGyMTOWecciENZQdQ4a23KCBDWCrAgwScf3v/Nrz989GCryFUjx8Cpn6xC3m7vz861vv+j777++pWZxcls0g8Vuo58y/GI6qjM5NfJbnzJO599wXzxbxvfHnX9TxmsUI2JN44RorXOFT6hqgGXsR/EvKNk2FhKUld5GAuXprFnuxu+yL0WQkpsQQwVR6XJd8I2Re7Q7qoZ7FhUQqhghJiPW2qO1x+yVPBluaSxl55D5k5Hdw8RwYx2lmMknlObtDJ/ajH7wesr+53y0eruzTv3b9972M9D4tJ+KUVFeYxBhdi1mq7b3/r40zueZWqice7MyauXL51emW16sCCxyIx1zvCw1idQiUIxCmqbRXQwp1ibsPqHVFVqM6gQRDPUO7Y1qdOwUBhVYglVECvXeLJOFzEZd1RP5cs6IHTIYkwAlFhVxrKOh0MWqiqqKhFQEgKTHeb9o0gQqdstao0lPsiOEaAiRaUMqu3EMJtVfzpDFCKH9k6AKFSy3dzv3vzsTq9XXLp44ezZ+bzUh0969588fvBwbWNrvwg2L123L2VgskyOyqrUGBxJw9uGMwnLiYX577/1eivjmclkZsKlqTWsqgGiFo5whDsZz2FfJoxdl9qHERQszJGNGovE+SRQw5u5KVmcLYsy5kUpZVV2Q97uLi8tusyEEPzJ6bkGbezs3Xu4WolGSsQkvV7c/Xz1/mb+/qnsb19beensPCuiwhKrSgglRJ1PAAllEVWdS5IsiTH2Bv2skeILqsTjX11eRChDNKoUK9cNK3Vxl6AIqszWAk3GyaZ75cypvN1+sLFZNpL1nvz2s7tL03PEmLQ06ORZK5EQYBXEIdajmGyfyaA+/37HMfXu1wv2DqMxlcN8wtETGqEKAaIlFoRet99qLEAoGCQt/Xf//tc7lXbioNJwfmn+2skTU0yJKtnj6OEbiPq+KkAaj27pWa+uAu8tfC0l3Vg+kf7t3/3lD7/3vf/3//jpzuZ+r9MrYwAoxPj40erm1tbHH39y+aXzr7x27ey55aTlmAwUHKmKBRGYyFnWutFOVUUMW0OksEE0ikBBxtCw/qP6hX/Fc+TanteRPu6Y5RkGyD+Fa/MVUOJX+Bg62vyqeuS0gGoRAxU9cv1jVUUCDBtvE6JRBCQw7KGIBTGBYWJAv5O//96N9967sbvVk2jKUkIl1qbGmnZ3Z2am+eN//eNrr52emmp6a01qyNAX9NjSP+3y0D/LDx1BxuM0NWCFElljjVpiAStsFB9C6l0snSSEQaTBgAfRhAJhwCF3kjutHEpCaepKAwAIK6VK0t8ZrHcx2M2Kvcz5ivIUxVDf8HgdrxfSHNEXPaOnX60fOwIZSq2dSOz8ZGNlYeKliyt77W8/Xt++dffhoyebu+2+EGBMUfX3N/fy1E20GoXqejuuvX/7l+/eTL2ZaKTLi4tnT5+Ym52em2k1M5dYTbxJLCyeqrzUg73CpNYYHUZOyjgQpLAjChuCgELt7QhqQaYWLzQwRtlGCJMSAhCVazTFTHXdDvp0JvWIjxq9pMbUQV49NWcMMw35qRRQFauRKQKh5hJWqAF4WBsEhJQYCiKuqZHBIj4SUMt2KXiM9pcqETHKbBmWgKgolcoKnY5dXbOffX7vF79+ZJwpQhkAl5hOv5sXJdiSSdQ56xwDWlVNxCTjhdmZ86dOXTy7eHIxnWyaVpZaQs2vpapVJYCapyndvo7QW+0KDDtVsT5LtRSuhIJM9gdlf5BvbO7k3cHeQLY3W6dPLDZSu7/fnZ1uzs9NT29NzExPrW7vbu51e0FFQjnobxTFoM37O9tXL5749vUr8xMkpSakDe+gOcqucZYsNIpoRcZHGCJ/wB5UK+YoPZVM1GcGSOhF2qoHJ3zch0NBIUTyxoAUyBxfODG9t39yq9MZJM1OWd5b3/nJ2+/+dz96A2KyZgMMEoZEAzBBNUYNFRmybL/k6tELGVG9yGhEqal0kPaou9+EuLZJMuq4HdF2MpOzyoP+IGvNtgORxy70f/vp+3e317KF2bi3tzI78f2r167Mz3hViWr5+Goco76vZDr4GVgFUSHUzfNgRpZxozFBwL/5H//+8d3t99774PObd/K8ShsZkSnySqT8za8/+O27H66sLL7y6pUrV15aWGgZRyZJyAgIqKf0tdby5nq+iogcqbWstdqogI2MzQSOe1E6Mt+BI7Moz7XII1NtnkrcvWhkAfQ1ejy/Tkg2PAl8tMF1rEWWZFQjO9SykwA2JnG+ZvYCUVXGclBkmVdhViILA+R9PLy/+sEHNx7cexRDrMqQ50VVkXdJmrmyHFhjf/xf/ehb3zk/NzdFBJdaMohV39iE/hS25DNKVsNuJSKAibjOhRpjjGfAivGhkv1ee1B1d2J3m/M9KjoUexZVDZsx0kOrawuOqdIQuoWX0mtpjE21MLEgRD1Gfcfrz8a1EGzd6hjBSi1nmzN2aTo7u9J44+Xlooo77fL2ve3Pbt5aXd9oMglTv9erojrnvHVCJs9jpyw2emsfP9xyznrnfOInJ1ory4snluZPzaYLLfYMy7AWw/ZBQypUhXrLqSJIXaxTsLKBHTYXjksaqSJE1FW+GIFIRDBGDCsTCDzsOaeDZnmh32WF6bBNg/igxeEoeRSEYgSkbgclAGzJ1nhoaDQA1RijiIoIq7qDAJ/qVlUBAYbAkVUBIcrLan1n98mj9UcP24/utzud2G4Xkdj4LGiM7JRDb3cnaVibWtUYpQshEjPVaL504fTppcUzpxcX50wrs6m3zjArJA47YlVUBCA2hv+p5S+qT7PxxC1QGbUSCZIuzE52up1Br9Mte87AGWSpazV8mVvvmC1NTaRz8zOT663G2tb6bnu/W5AomaQK/PG99t3V7js3Hnz/jUs//NaF1HJRaeYcglAo2Fp1pooxL3rWJ9bYmtD5kPVOn82c/o4DL4C7evYmVGspxIqMjwpVmk795bMn1/a7HzzZTJoTW/s7urb5i5sPvnflDIgk6AQzKgEpWVICDAotQSQwPBYi1gP/PBTmVXoqHjtA88fr2ZtdCQoKBqMklHLN4SZj87e1YeJhUkcRBkWazHSVS48d0n//87ffe/wwW5wKVW/a86snTrxxYm6Gja+tx/MIXY9R3/F6FvLJs1lKIpIIEbUWxlKdkcj7xeRMqzHROH15YePRm+/89sMbNz7tdstGNkFkjaLKq4d3N7fWOh+9f/fEytLc4tT3fviK8Uw8jJvZMDODgIigolAitnZoJgICIEAYK/zwSIGQxhwpjds7/YJCpn7NNPYfaQm+Hur7emw0esBncgD5SGuRA62nOocxTP0qV5Ua8sxGBFUZDFtrjM04lqQRbLC5mr/37o27dx50O/12uwdCng9EpNHIiGNV5Ysry2986/qlaytTk5PEZC1xQmQiaQlTgdyfQMftCPWNkN4R5lsZDToRgS0UREosKKqiv7eTb22m1X6mudNAIiWbSN4oVLWCD+QNBESl2Ahr64naCC4r4pKqCqJ/CqfneB2vr+ZgJLKKZeMsFBwEIYhEbTBPtLJKsTCpF5cn/vKNE+1uaHfl3pPNG5/f39zZz4vCkiXvyyoWVchjUFZBICqJC7uVf/qkk7h7mQ5a6E+1/PzMzNLC3NLCwtxsa7LpUwdLsAYGBsrDgeY6hT6eDo91k5UAESxDrGVG1E4cWYMKzHAKgZhYVaOI6lDL7nk+lUS1NiA86sQcBcYqohLrtlMFIARmR+DRfBQRGYCCSAiRCMRsDJMZto0qqYACEARRIIIIEkK/CI+f7D58snr/0ZPtnb2iqpRYhUOfiy5bbpbaEHJwLTUUUSpVSdaI0i9Dv5GZ8ydWLl+8cHplbrHBs85NOOu95ZoxMKpRsYaMqwflWRnMQ5bXr2uoDoh0DrK19ac4Q/BIHRUlNRMzN5kVi7OsMZ9qzk82L5w7Mz87mSYu8VQWRVmWjYSiFoszzUbTL/fmNrbbq5vbW3udQZmIn93YHxT5YPCLzx7e3/rhmy9dOjNVFaaZZBJLKYNPyBiyJJASrKSWRgEGPR9DvdBhxMFEJ42HPgQLqkf0PDSKWsMnp7PrVy7c3e10QhSbtAU//+RmsPz6mVMnHZURPhI0goScEgkThCBgGYnf1qiPQTXz59hF5S/Iwh+vZy/Y6C4jBaRm7tZDyCekxigNZfoErMkg57yJPej/deOzf3x0J5lv5Si123lpYfmts6eWjTEVXK25InoMeI5R31dBfXhmUBdEZKwSQQRlUQJIEpc1HLSKkrPF2SsrS2dn//a//t47v7zzztvvb27sJUk20ZpSpW6vd+vmg7t3Hjeb/le/+vXJ08vXXr360uULzSkCiCKKEj6FZUBJoYggQyCxRpXkKOf+7+BofM4x/ULD/eKF03I0WfcVJ/u+Xtg1DDeOpCnrTpYDek8lqtugjHeOlFESMay19XhKv0udvfzO3Qd3bt5ZfbKxu9sNlZByWRbOWyWKMVRVdeHi+TffvH764uxEK3PWsSeFEgeNuVYVLBlv8Ccr8UgjChwdgel6LogYZCAaQlEUg0ExGHCMiYUIRXU5rJAaioBWxit7S8LEJQy7JPNEA6uhH6IqWbA7dpnH68/Iu6hKRAygyEwKcmSspcRyjAoRb1iZ1LmWc9MJ4pxePNP63pun2oO4sTm4/2D97oOHG1u7qsIuUWMrkagEZlH0uv2dMndSNrz6vZ5b7Xjz2Dt2TJallSWzk5PTreb87MzC3MzcdGtiwqceUbTM1Vu2bji6REpEZqhYpge8VxoRNVYW5Iwds5uqUBrK2n3hVjVUm1QcMlaNpqsNkTFmZJIpqslrKMpDRxcVIZCCvOe6PFAoYiQRREEV0Btgv1tubW9vbG5tbu3s7nV6g6IUjWTKIFVUURPVVFFDGaTIXdTEM2wDzveD9gZlZLjUxVApmMTawCK2mTZOLkwtJkgFXmEYzCAFQ1VLkUDMqqpqFEbJaS0cRjBfkzxCn3HaRKjrnIkxDW+IwK3U8PxUq6GxnJ+aWlyc9dYY1sZUs9/DgKSRuN4gd0YSn0w20tnJbG4yfbKx/WirWNvvL80vhaL3eGN7e3vv/uO1V66c/dYrl04uNyeS1BgNUFBI2KoECQWZuhdDx77f8xqZfy/3+wfAexi7w+jgFlWQKomwgQeEEaOmli8tT/74h9f/z599EJgCoR3CT37zDsCysnw+I5NZExlaaQxgpSGhrygMD8On8VBkyPn54mbUX0yjOKInVlIhxDGRXqqJL0CshDgqXDgqgQ703/3inV8+vJ0uze7tbNtB+dbpcz+4eOXaQmtCtSor8gaGS43muNSKusXjeP1uO3zkVokxxhgBGGOHCTloWeaJJ4VATVEEFZslSd6v2tuDx486n3508+Mbn7X3O1nWajabpKhiCFFAcN40Gn5xefbSpXMvv3xletGEAjapo9yaKasClAzp8ytaY0eebl/XZ6bGh+PyzzVG9GI1aNTsYfL1rAboqx9XxPHPP5ya1DpRO9ZOOMzYMQBUJAoN2N0dfPzxzQ8/+LjfL3vdQa89AHHikxgVSlmW9fPO/PL89etXr1w9MT3dNDbxKbuUoRWxAqEKORGMs2RYoxAnxP5PpdZ3gPfqI3WRdKwyTiQRsUTZ10F7f+3h1sNb+daqL7splTbmUbVwzdIkrJGgwSQw3pMaAlyapelM0xXrt/3uXa2K7ez0/Pf+29aFNzWZBjs6nsr+Z1ixruYE2AhTE40MFW9FIANsfLz17k/yjduQyAvnZ1772+zUK7DTNYPd8fpn2EaxggaAiI0OcRNEtO51KosqqnrvnPOqiIKIOoeCKkpRhryqBkXsF/pwbf/m7YfrWzsbO3uDMhA7571xvlIqY9ThlJtAIySSiDWcOueZnWFjmKCQoBImJhsrJxZazWRqotlqNppZ1szSLEuz1LgUVQQAyzrqPlEWdSBXzzWLQkFMhlSU8Fya5bqJonZKXE/0aQiiqoaJmA0P7W6IEhWBTLAoFSGMUJ+gLNDplbu73aIour1eu9Pe3+90Or08L6QykDQGCiGEEKOogpWoipKXpfOpcR5EMWqMUTWydins9Xq9ipoTs6f91GKnkH4Z1BCoaqbsqZKyS2U500hOLcxev7D0g9cvJBbWwLAQBUOVMQKNIoGZCZ44AZzqoT/96rbqYG5pyIpJw1qrRo21YGAV+kU1KGMRYh08NNOk1cygykDqbVkWZVkQ8SDP97v9TrdfRlU2QbQ3CDtdufuk+3B1u4ri0qSoYiWx0UwWZiZevnLulYtL51eyhhETY4LKsiiI4Z4eAxlDMjoG9+sH/MKQuhzkKXRUa2PV2uIptKoqtlaJhUhgK5GgGo3druRXd3Z+89GHyPza1rqzZjr1r545+4Mrl061/ATUikgsrBUlqVTB6UHQZEZnh4b9yTj4zfhdmfnjVV+scPisLtvXMYUaMCmTWoihUZyhwEaJoqn/9mc33nl8e9BAN+aLzawl8m9+9DevtCYXjOGoEqOyBKNgk5A9Pv3HqO+fFPWqaggBUGstEInioOiqUupbBFfmArHeUxhIkRedvfzena0PP/z4zp07sZJGc6KqLJMnAqgiFu9NayJJG/j+97+7uDSzuDxtG0ykKgFQMgz6AkWiw2PjGEnGXjqCEvUQHx45/qKhPnxN1PfFQ1/PhcqqGBuSrPPPNd5TOkwVjgO/QGWB9dW9Tz65efv23b29dlWFGONgUBi2dV7cGNPr9bOscfmli9devbJycmpmNvOJY0PklBgqBRkiGrofItIgIsLGkvHE9k/OLdTbQYf993F0kxFEpCoRSs17g92t9uaTYm+Ty66NhY2VMO9xs0+eNBIQTULGpayWyafNRpbONXj39rtm87OY99qN00tv/f3UpW8hmwLZY9R3jPr+HPKJEgFRFY0KgI2pZWOkHmNjVrCIxFCxsdY4VSUBjFFRUcCQEgYlijJEqgZV7A1iuxs2tvYfPX7ycG19s1N2xQo5OmCuqiU4BRBlIqaa65JIVSAiARyz1KXe2LpqBzbOK1MlURQ+cVNTrZnJLEuMhU5myfLMnOUhDxkTJ2nSyDKfOKbnN+LXE09DRQhBWUmRh7zIQ1UpCCplVQ76ea/X7Q2KbuRO4N1Ov9PphhCZWRUSNYoAJCJRJMYQY4hRVWDUeqQqQ5mJA6HRoXQGc+2vCdRoNqammgtzfPJE4tP07qO9D2+u7faN+snIqRAbhlS50zJBdDF4jQ1rmracbsob1y+/9trlxfmEINCCKRgSIDIMYAEj0agYYjPUs/i9UB/qZlsVaJQoGpWNCRHdQd7rD8oYBGSd9d57Z7MksYYIQiohxKLIi6oKUcoyFGUYFFVRVv2iygP3C7O21b63tr3Z7ufqgvGRrEh0HK6cW/7uaxdfOz83n8HGYLX0xqixI8/4tDhi/b8O+UZHR19g1EeqNEJ9GCYRpIrR+4YoKpWK7X6Fgcqnazs//eWv98oczinUQa+cPv2dKxevzk9lqg6aQRlBVZX5QBNkPMdOQ71HriuLR2Ks4/UF1ysC+SiNwFBGVWvJ8CjnTuqgQ5ZiBQYGN/flf/2HXz3Y33bzWbtsd/u7V0+f+PvvfvfVxvQ0ken0PYizNGg5IElc4mCOdTOO/fdXuBmfk56Rgz1sLQNCJCAo1PtkOIUNdWk9pgTfZOuyrJHNrky88u2VtUffvfnpzfv3Vp887oRQEJFzLKLtdrvTgXXY3f4pUE1Nty5ePn/t2pXllXnvOCiMr/tjUFYAwfuRL2VAVbRiQwBUokKYOUKgoFpebrwGOKyk6+FEnD4NjVRVpB7BUGv/OHG2iGA4yzUcfXyqPi96cCGIAJGKR4P+B2ZWRGkorzdGZiMQDSFGawyBqyAQOOu49lphjMxAgYDdrWJ1dfuTj29trG/t7u4P8jzGEGMkJu8dMymiQJ3RxZW5l1767uXLp2YWW1kzsY75gBqBhSiq0dHEIBEZKMGQ4aHA1p/u3BoB0MiQkcOrbz4C20I5uMxNLsKmMe9rVUQNkUwkr3BEIGI2CYxTBEA0ydQ7SeJAEwfvEgh7GA+yx5nS4/VnlHSt2weUrB7sIgKYzShAVCYYtkQEHQpXkchw/k4ZgLXcspbICkGmEEWrs1PVayt5FfaDbJe029HNzd7GxsbG5tbu3n6/lxMZ55IYNYqqKshYa9k4Ui5CzDulM0gsG9UQVVQjGbgE1lZ7Jdbbqdu3WhFKb6xxSW0zJYpIZGJjrTH8Rf5ipA9atweoioqoqByMTtR+RyRG0agUwFFEJIqCwQdSoVzzXStUSdSoKqBCAeixQd2TqhpVImJspH55aWF2Zmp5YXFxcWpq0qQJMzM0lqHX7uf9Ir/3SPMohRRELkJJKDEOZcXglFMd9Mu8tBm2Y/nztz94tLn+d3/z1omlCVX2ZCSW3hqCQuvKqjnUBqTfpWc+HgAAIABJREFUx5KOgJSOvETNDUpMMfXWcBZijKpE7JxjC8NiiIiUFMaxZe8MhRhKi8TCWRlwxaqOyszQxKnG7GzyYLP9YLOz2SnKEME2qrt1b3NjdfOjpanvvnrx9csrrdQUJXwCImVANEAiM1tjVRVSElvF8BIQm/rC1bfui+uidDS+QQBgmJmZMBS2t1C21AS/ujxt33z9t7dv3XzypHTWTLU+WHu0mXfXL19648yJOSVETYJ3dhRQxaiqdfrygNWnHjZVGvLv6SjgPnZgX5I+LkWsMaZOJ0QYBSlDNVSVa0wo0KkUnkDYK/SjBzs/uXFrvSiCt7HfTyWeXzz5o8vXXm3NTCsyVUodAeAItvaowswx6jte/wRLQjrGy0TM5kDegXmYsAMRJaCABDbNWs2JxsrJyfZu3mnrJx/fuvHhjb29bed9mrkYQlEURZ4by4N+3Ny48cv/8mGz0Th16uSJ0yfPXTw3NdeYnCRnIQFlDmvAFhCIDsHbMKmrqhJ5rHAkEuNBUpkZQzmjERwiIqgKVPmAkpH/yIm7+msQgRUCRZSoAoXUdtuwrXm+VSVUoojWDomzQowqUutJDXO+kJq4fOhGjTHsSAyBidhbRZ20FKoKWAYJ2nv64MHjO7fvrT7Z6Oz3i6Lq9XIRWGuc8yrIqxIkxpJzZnFp/sKF86fPnFo5MdWaynziqhIuAQ9Fd+NQW5iEDpl0uFb+GeP3pj/NLXAgSSsj9r5RExgRiMV49S3NjFIittBQMUTJWHapMQbCTNGkIJtQcBqNdc7C2JKsG6bqtWYOlOPOhOP1Z+M6htUTOqQzwdCIHz7FAUFu/ZSPmglVolALZVMtU85ImeC8IpkDrxCKqMXZVlnNlSGEKFFkd796spp3+sVuu7O32263u71+XhR94cTYlGGsiI1UG6bIXmC7/RApZM0JphBjHqsqc0mvlCIXpeHoGZE1bIyzIlKW5XOjbhozfwc9M4bZORdilBhjrImsiQiWxRslCImwqkoQlXpAi/kwfDc15zXgnDYbZqKVzU1Pz8/PLs7Ozk43Wpl6ImKbWpN5mzrjmBQSJFSh7PZjPihTjilHjxjViQaGIWKWYBgT3k96q0bybrs/yCMVnJfZTmOvX80pSNgbZiMj6XgasYeO5pO+pkmnp+n+aWhfCapg5cSRtSTRxvosGSIDMxJXrN9hiZlcjGwNB8PGkCF1BoOiHOS5kTDfskkyPTs7sbrVe7zd2W0PYoD1SZHLp58/WX20ffPzs29cv3zxXIu5pieBMZ6MkkpZFUVRZFliAFUKNWMpWSJDhl/wpOUoVtM6Uhrj3BECSCKCJNal3vjTC4SoGm/v7uz3OrbReFIMOp98srG7/5cXr1xocMLQoGUVvTdsLVQhrKGSWIJgvIeK8pCTNowyAMcB95cvBlRUQowSE4BMUge0xkq/jKUxMUEOfdSXdz+9+d6d+9uw0RvtlWkoXj5z6i9ff+XSVOYHZSNxpIF42LGgwwt9jLiPUd9XLWE8teTpBzR+0/JYYklBMiSKJGI/7HqxFhM+bc5mM53q1IXX/+pfXV1f2/385t1bn9/Z280z671t5HlV5GrYWePbBX+4ufbeuw+T5q9cSgvz0xcvn3/p0sX5pZZxVAU4BzYAbCwDNLJjHo7TkyoNWWEAAyYzVNYGdIjygggUogoY44hU5Pm8/H+EUy81MB22ypt6fB4isY6UDA0dLbOFwuZ5z1py1ptaQgEEsEgwbIn4cCK9Bl+ocQQRExFBUOTY3+nt7bRvfPDx1tZOe69f5FWMJBEhRBENQZkZTCHGIKE10Th1euX8hTMnTi/PzzVb04lPnGUecouzwoiyDPWQ6ambZwj5jpRY6U+7A4QOgtmDSQ+wMrPLWL3hVGxT03DA4DdhiDhaRCaOnIKtp9JJYLaeoyOxJjrKfex76rH0oOWxXt/x+jNJbAMyJlQw7kIOA9TxPPhwGI7HP4IOM491rwnGaSwSRC+kTJpCE69I6uRTmJXyjAaVopJBIf0yVpUEwaCiTl97nUF/b7uzu723s7O73+0MxPvmTHOiH2Le30IoGlYTFIZg4QRGoPU/jVqWlfQCG058+ty5vqEm7YgEuO4wBSBlITFKrPk/jXMusYw4iP1ty8rMbNiYoXVsNhoLCwtpkjRbzcmpyanJiYmWSzM4D2YYZmuMs8ZaawiswZGmxjAqwsCQGCipqtFCtFB16lLyqfEullFVNASJUSKbkFo0UyzMNCdPTnT2krWttUEk6xPfagUyRSALViLACyJB6Mg8gAy97j/VoPKh3JwFVC0MbH2ZVTQSg7kGhqPUIREzszXGmhitdTZxtkh8GkJSpJ1BgTL4hKZbyUKDl5pY29THa9vVoKeckkl2e/rLT57c2SqvXpj73usnF2fSZkpV1KqsDEvmXGYsM9VOzbKpK6oENS9SLwYd2UV0UDhVHQE/KI1P3KmSRh8rkFpyS4mzp5etc+burc+2NverfK/XK7PmZ4/Xehvd7545++2zi5MWxhohhIAYo3eWPbFaaBjuCNWaV1ZHdDLHuONLlgEaEcYCZIiYlEhIBaLQlAKQE21AP3q0+tvPb9/bWh8Ikc20jLOpvX7i1F9eu3plJpskaFmyyLBPlBCGY4BExw22x6jvq62nlAO+BBMecPUOYd5BF2VR5M67IbhQqaqqnoJIpxwTJ7mdmj917vLSX3XfvHNn7fH99VufPzTG5/0QKqpKEFnvksyhqPY6g253r736cP3tX7ydZnZ2bnpubvrs+dNz89NzczMus2RMHQbkvSJJff01mHA4kz20QDo8Xmtg1q2FxEep+F+M7I8etHYOvaCx47h7FPlAU98EAUJVUUBhXcKGLXGVR6gwGWNHEDKgCjBAt1uurq4/ebK2sb65s7Pf3u/2e3lRBBExZA07EeR5CVCaps1WkhcD0er0mVOvvfbquYuzrcnEeecSZyyRoRgRYmBlZmIfQfJMamCE8ZSfhnx/DhmSMVYhrTEsK8FaAxKyCXnhKAoiYkOwqAyVFoGJAyfKxql1qJiZERDZcLCaG+kb7pHmqGmcjy338fozwn44ZHSnWjHmoMueDzr9qJ57GZI4H9iSgznvI2TTQ+U7hQSS6pBYV9mBBBRgPDGMUefQgtBQr70QFKIamybMcDynMVYipepuwfvRrO103n7nQb+ze2Zl9uKpeSehX8QH6/taz9kSQhV6vV6v18vzvCr3vgT11YlFIjAbZp6ZmTlx4kzdLGisdc6laZomrpVgMoG38N4lnq2BMWCGtZx5W/O/GMNUd5QyIiHQMPM6FJhQMSCGMJWMykAYtfptkBgRDMMbcGKrhk1ZCosoEgjKFA0iI5RlX9QsLp9dWmxOzvlo2DkzPzMxNdEyREM+yKFvHcnH/74W6jlvo3G1Nx3rqzg4q3XbzqHTPuhnAZR52Ndi2FjnTIwmydjnvtcrizJWRZrozFJ2biZbm2vcvr+xutsTkPWNXsW3VnfXdzcfPrr1rWtnr105vzCTuMS7WowRERqjCFPNBmSgEjWqkmd+wVzSc3zUiDlJ6QjtAQECS9DAZbTsZhP36okFlyVT66tvf35rYqI56OWbvX2y4T9vdzc39n7wrZemW3AAnEZYUUotmyE/qNTytccm7qteKQUUDqA4UsGIUIY6BEZO1IXe71bv3L/zzuc3n7T3YpY0J1tVd3BieuqNM+e/d+HUucS3AhlVWAcNSlBCpHFO8eN1jPq+EuSTL9YBp6dgIA2JUuhIzo/gvK/NcoDEEJXIWMtEIfStNTYl0dIp0rnW9emLV185+/39b+UDbK/379x6ePvW/c2N3aJse2eVcya11qjEne32YNB7+CCZnpp4+9fvplmaeOtTOz8/f/78udNnTreaTUPETGzH7neFCMjgQMgWAUGDxKiK4dg/DtzGSEjwj2TKD3yZDEVbhsEDm7oj9UDcpVbUI6nIGCIiZ9OhhxSiihzTsAGnRD/Hxsbm/bv3Hj9ea+93yzzmRVEWRVlWMcb6z7VsqihBqzq3nmSUJMnEROPq1ZeWTywtrbSak2maZioMUJJhkBck5BPLjsnVriSUZWEdj526Guwd1Vcc9zh/DquOuA6o3Yh5RNFumARGYOsLw8wEE9jXJWhwxYn+/+y9aZMkR5Id+FTVzN3jyMi77gOF++pjeno4XFJ2yQ+U/dcrQpmVJTk7I8NudDfQB1B3VWblfcTh7mamyg/uERmZVQWg0A2iUAgTSFQiMzLSw8LcTJ/q0/eYnZEYII0hphFFskCoBTUhvKKg62IsxmueJZlDRPYSVDhvrXrB8BlIOGePjjnzOyZtaJBNTWamv8+EzNqGgMaGtJVFgTFzkTkHdRbYjImV8pKygWJ3gu2943KyW04OHWXvv/3RpUHuGVUdiYgZDKghBJ2UCtOisK8BujMR6bblmR1Ra3HADGYSIcdESprgBOLICwm3BBpNqiE1KUphJqNGMLGRJ5rPvwJGCoZ4kdYzos16RphOGX6U+24nK8gOhJQQ8yzPOsXxyV5djzWk7b1qsJTdvnH9nZUbWSbe0aCXr/V8xqBElKjxmYedqcx/x7KOfT1yaRfLmQIfWXtMG7UKFzMXoqbdrj3D2WVCKWlMdap73aVelsdyXI6GdVlGCl2W7uXBoJNfPpw83htvH441suSdqPanuzu7u4d/uvv00w/f+eS9W5dWGGoa2DmOUYnUQUSkSSC/fqr4duFe+npISMRgMYOGWMeaIStePtlYubzcv7Vy6f/77LOdUBLL0fCkdFnY3bn7X/c+euvanRuXrq90OUM0K5N5JIHmIgAaNR+Zv80X4xsgulpIyRCNKPPmUBOGwNMT+3Jr63f37j483CnJBssrkYDx5L3lpf/wySe/uLSx5n1WmTSCxfP1FzCByEhAi1rrAvV9S8iHOTFHe9677+IZfWaYPt1kGjU2s0Y7jV1jO8sgZZe1ShZgYcDYAYlt89rAlK5eWXr/g9Wq/PD4KD15svtse/uzz35bTqo6WZ7ny0uDpX4/hFCVkYBxDCVFYjreD4/vHzj3maaY9bJuv7e5vrZxeePKpc2V9ZVBjyknnRAYLG1zsZATFgNI5ppMpmouqvpDob6G1WTafgQ0beUvx4GFnDh205YXAwBpnBWMCEQBVYnhsBwNxzs7ezs7zx4/fnpwcJSiOecJ0IT9vWMo5Zl33gOksYoxgNRlkrRmx5uX1t95586NG9eWV1byzC1vdPMsE8fMRNJK5RCh4zMAihRCaEzqQGY0t1pmlT2ji1mCWcsfMMf5/HFu2uRwFtIlYCq+wBBQwwFq+xqJGBBxzkAmBGbyynJW0rUIogQkmDYLQbBg5i/GmxXiXKgFTA8am5mmXzBjNZoL/59LGZ0DjwoChMkjBdOmpTu1UItFpuoGRiQMYSiQSBPVjOgQCInAmiwEHUf3ly+3/8c//8/jk9NUVVtbzw73dt698nYGuMI3oiwAWNrb3fTrqFRm0y2C6Awr0IuD9ubtMJ3Lk5kjtHyPprLW7J/mjNX4PE+ewayqoU6m1jTei7BwQZm5ZKhLSPQZ57mQRhaFxW7RW1tfHZ/u1Wrk5eh09NXDJytr6x9cvpbpsJtRtyuFxUydEGUNXUaniPs8Mqe/folcgLFoeC3txDRQU+enx6alkhb9g4jYjEiNU5+caoKwMnedn/jhaDgajWvSeGW9v7S6urw+Wd0bbR+e7hwNy0nsdVf2Tk6PPn+0tXV07+7jT969+eE719cGQoQsKwymZprArcvia3qXTa+NXpC0nyNeKjim5L0n9hINQE7khTqcrVxbv5L//b98cf/Lp1vjJTkJcfdou19kz/50cvdw9+2b125eWt/s5j0hbsqFZK4RrLWz5M5ifBNEV0NKlAI5y30gTGD3jtLdre0HOwePnm3vD4/B7DPBRNdX+zevXPsPH7xzu7+06qQwMJpGJwOSMVtL7GQysM35jfzkQ4gF6nvV/Ju9SHhjfnue77Rvv1FVFRGz803mTYEYNCbt+I4SIQEgERCDPTJyVT1yzvu+y/q+T37lGl17pyhPL/9f/+WT+sSePt398i9f3b//YDgcwsj7vMh7ZVmNywpgERqSNlRSkyH7w0fZdlb43HvxLATj+MknH3e7Rbdb9JY6S0u9bq/byT15mlQTiDnnGtHOxjD3BxwhqLSKM9Qkpi1BoVnmWpnUgJjMLJoCKtuP906Pxnt7e1tPt46OTupatW3USHUdqyqYgojNQl1VZRk2VjZjsqos6zI6R77orK6s9gedO2/f3Ly8trG50h/kWZHnHe88ExMsNrgGsJiCpggidq5l+sDEE1Gr1Oy8TMWc6bxQ6oXMQgIiSKcHNf9o75O2djB9k9x0LbG1yt+NO3PDLW6iWiIBCSyzxvYEpPAOYjARZZdHziEZwdfslf2Co7EYb9jhMl/JszOkZ8+lGpu8hzrEpjFpivpmL8DWxPhnES0FOCMhn6P1OD4rK6ZWL/gss0lEBklgMgd4IoWxwYWI7Wfl77/YebIdXGcdvjw6DV8+OH33FjaXwGJkmpBMVROYWYTp26qjt9eullLUVqN5ro08KSdtMkRtnwI3HhQK06miaUvZa3wpEts0rmNM2yCZiNmxWWuEqIakpIYIhRik5lxdDqAmcgRzQoOl/ubmpaPjgxhqJT4Z05Od08vLx2+tpSWhLkumlmnumrwtzpisM9Ofhj4o9Iqb6BTnnpug88r/57zt242XzoANza8BAxkRNzQ3z8gypzHEhCSQwkEyuL70YkcxLCublCs99PvL1zayR0/To53JSU2us9FxNgn1Z3+49+TBk2fb7/zsg7c21nsryx0hAyxp29Vi+te1MX5fuftz8/l8h8BMb1XBUTIjAoM8yMABonAJXeHVleWrv/7wd1vX/9+7fz4en+hqfqQpVfXeo3tf7T19++rld69dubG2cqnfW5562/j5ZEzTW7aIuF+6FcKAipLlXBqdWtgdx/sHx398vHNva+fgZMKgTme577zTOMizT2+88+t3Ny5nmY+qo0ne7ZiHalKLzrt4Vn0hmek44DVcnwvU92NN2r7YGXyW4PEuIyKjs0ygc+ycJyUCkSAGS0lFWJjYJc+OGaCgKRBMMpEceScHBrhMm7eXP/zlzaqutU7PtkdbT5999eWDg4OjYDWRNMLKqsbEBkVCOQmTSQlrejcApP2dE3bkHTvPTkREQGpkb79/p9PP+73+YHmw1F/qdLt5lrFw0eEXx9vfc9bEzypjASFgUtblpKrqejQajkaj/f39/b39o+Pjsiw1JTJJtVByKYWqqmJs2U8x2iySaOQgiajoFEWnU8USwOpm/9r1a7duX7t0ZWNt1WcD9uyznvNeqDm0BdBQ16XPPKhxgwILuDG0IFJtPshWDTVpgkFY2jPaXrJIfsSynV93wBqajvmWVnvObWMmSW6mAIgbca0mbEht9ZMBGDmQN3ZK3sgruYVtw/exd52HF9qmvNtkREKrfkuA2I+4Cv3anhz2dTUAm09NN5DCWo1cQ9Mx237RfmpM1PAimu9AQYGICU0NvbHBaQrnnhAbuZFpT0Jzd3owYDEZGany8dgeH9SfffHkL/d2JV+pApCMhR9un97d2l1eWkcIuZgThrDN3g6dK63w2RLTtsbXMBCng4i8k5a+ePZkYmk5oBfYNUQgaZropu9nyoRtUXAbZDed1dIgvZZy0LA8DWowM6bElIRZHBtZY5dIVvdz9+7tmw8epAePnxiJIvvqwbMu6o//80e9PBSFaz4LJpuJFqOt0tqU2fedQokXLYf2jc7ee/Nvsw6Mp/OGKcGXpr9iZiAipWkoospRiUW6WUqJQp3IFdLhmEaTSZdZPNcxxhD6wivFxrUr/PnD8vGzo9Nh1c9zRvF0b3jyP/741b2dj96/8+nHt69f6zKdL2zauTj+RYDW6KLvH39v99cL0vYXn3DesZhAtZrGKMSZSKv8SCBFoXQly/1b2dLGp/90//7vth6ONah3MdFeXU4eP7739OmlweDn77736Z1bS6AMyIAcEIOkOZEz+qZIyl44geefZi/Kn7QJ1Ze+5RdZLjJ9w7Mu/JVX/LBe6HxG53Jas68D6ND5BDmM4Yv7jz67++DJwXGAp6wougVH5RC6zv/s7Xd+9dGV9SxbzsROyk7Xq3dal2bg3LO5SQi+sTUzYiNaSAEsUN8rwjn61jDv/DYz9xRhxkyuzTDtdTo7z7yHTdlwBBGebkfuLG9HnqGAIM993vfNMb52fe3dn1/5d+VHoUqnp+XB4eHOs50nj58+e/bs9HjI1hF4aqWfGWBTM+PJODavL8JMjohUk5rtbf+Jhb3PnIg4ISJTmCWXeZh2Ot319fVer8fMnU5neXmQF+wzTyAz9d73+0tFwWYQefGpl6ZMxuYJdY3T0/L09NQ5z0yqVpbj09PR6elJCBHA4d7ReDyelJMYIhETs6nFGFVVTWOIMcaUksEamQC1xBSJEKPGkIxURJxnJoA0xhBS7Z1fXVu7cePa5pXNG7eu550sz12n67PCe++ESQkNS3P+LZg4XxRtm1q7IZ/RxFsG7LQj0jUp6+erwS+YEz5/2vOP/YbBmfh428tOc814Z6oVIGkCMwOQGua9I3IGh8b7yGBGyUiNwQRBsAVL5m+ZWwUroKA4LRwJDBRhDeW4BpJCFZRIlJySX5wXf/s7ZtYDTue60V4YutEcrHo+XKMLBaJGKf78xtOyTwyNRQ8gTI3ZHUxNYGq1agBzZF8zH6X63/788J9/86dx7bjoUErsxDg9Onj21e7g/ffXpTGp06RJnUgyRE3OFzqNtcQay4EWXLYdeG0+jEHWZkdbYEJz7u5suGhrTRe303nq48uiVZ7V3GZkCwaYIGYhaJbYkWfJOMvKOnhPVp/m6XRl0Cuur9nk9OHO0TBNfLH08Nnw93/a/g//8E6JwBTZ8ThGoUwIQgAlUAko4Aie1Ld/6ZVCTqIXasbRi6HCtLFv/oCZTed5TENNZ5MYgcyICRnnnGVJLcaUeQ4hVLUr66ouqWLkQJZRpze4vG5b24eHR2UZydzyqXW+3KG7O3c/u3v861/c+cWnl9f6UDOKKXduRvZQRR1NKfncNdkFRmy0YBgt+Y4asY4ZWpx39Wjzhw2ot3Pv4tUGX0ix2suz1kxo9jjzru0naNoy1DQoe2GiZaZPVwbXPnz/319a/+PO9n//y19KFkhWSV5G29uvHpx8+d/+/Ozj22/dXF+5s5GtAR1AgBxQWFUbZW0YQQZVMDdGvXMOytMeTW3IzLPLtjM1J56/z+dueOM4qzbTc5wBe279iDXuV2fzfO63mz5aTDMpjXf6hYSEWpvuaARTZKaQaogBCXCM+RYhYTMr6+CKrEkuNsoZwbAb9JHJb758dPfeg7Kqg4YyECwWWtfj0Y3NS+/duvXutSvXV7OVwmeAN3O9nJqShMks+Mg9n+n00ILVuUB9rxbE8kt2ZvpWv/1iVa7zt90LXpHmtir+ustheCe+I5ITEa9cXrph6yHcnkzKsixjpZMjnOyNnjx58vjx44ODoxCSsMuyjEga0mOoExCEPbNjojShRBShRMasc2SbOoTAXB1sTYCGsEpFkYlTETJDo4PivXeOzRBC/cIpyfNC1WKMZsbMRJySNshNRERc49CbUmJmERmNxiklU2VhYSHmEEII9cw1XpXNGqNBGDSaihPvxXnvPIOROScZX728ub65dvnSxvrGaq/nfea89+KddIQdiWM+C0cas4uLHzGBiNz5oOPcSf38/9PLnv2CNcZvxt3y3MKml0HZqQhBe3IQjEgI4EYAvbFcnrqOkNGcwv1i//6b72+tY9W0xDd71DYCIJqqXi8aK/+2nwC99P75xrPjZVhobgi9uLrRNNbR1Bh9Gg0qTB0sEge1KHY0Cp/9eeuLr55MEpFzlpQAIjbmUajvbz97vHP9w81+SCgyxxZVVZwHU+MkN33RpijZhrmNLuncHvGcrtXZ48sngF42HS8l3Tz3ExMytugNGYkDFVnW6RZlHJFVOUvPpx7XWd+NNgejstoZalI9HoXf/WVr4/Lqe++tR6NAIHF1TIWTFk6TUlMhN/numyi97P1+60CEXhRqNFvxVGuggeCsRtS4ynkv5Ngco2byFVUMiZG57FztbC4VT3bLp7uTw5NUJ3LU6RT5l48OHz5++tnvVv/937/38w+vDzoSFIgtC5cFLoOCUwplNel2iynv9fz1zF9kgxy+rkzF3+H+om95Zp1LSl7cJlkYBDHzKeYkgzy/tL5xo9d7/+btf7n/4Is/3zsej31nOessTeAen4b9P9wdOLm5uvTJzSsf31hZcUhqVaWdgg0oa4NZlrV4JUR4R2egaypPRGYxamPKONuuW8Uenst30EWkPJd7PQf26CL2I5sTGefnZ+Y5hjE0TCsWdO7viQBmSVOdGpUmFgHLtKnRzFJMlgCoN0eaubGhNDSCnaNaHz7a+nxr+zf7p/tVQNKez9hAWmbAipdP//7vrq4Mbl9e3+z4XOAAMqREucw+NJqLPehigP1NW+gC9S3GX7dG6K9/rVd7CefdlMEoWe57/W5D59QaKaRPqluhrutxmoytLOuU0qOHT06Hp8dHp8dHp6PxuK7qqGoJue8YEGPUqM1mwtxU2LR5wTiesHBzpA8nk7oumwNERKjRFiMQyGf+heeRnZxMmSc2+7mZEXPz66opqTbC3gQ472BJzRBtailP4immiZmxCDNNrdzJgCuXLy8t91dXl1dWV5aX+0uD/qAvUpBj5zLnM+e8MLc1VgPaJl96UehE3/0DpP8Na+zHdLfQt/zd51HF3DcXu/XffCi37DRRNHaWdqEwRDBuRIssks3LDi3G93fb0PdzG74MYZzlU1SbCpxToAz84MneZ3+4+3R7H1mfIXVKUxaEM3VPHx/fvf/szvqA4Jw5hqUUBInFp4ZuetZ4Nm+bRn/zN/I1MPkbZzrQMpcjAAAgAElEQVTzlGfkgnY7sjLoDIfHSKFX9FZ6rpsZd7Joa+Ok9dPD47Icje3ew9Hq7x6sbi6vr7mImCGCARJQUwnpgAKRWdNW2VpIvC7DzkNFIhIyMxNhEUnJee+yLAshVFlWVj6r66yueyrdTPrdwdpqeLo7fLY3PDk9GI2IKRnbk529/+efTu7de/zLT995753N3COommrBwpaQKse2lDNbbEyYADdjIE+VVBRn+qRsuKjB8rc9KOmVvj+FNmoqjVSIalLNsqyf57eybA241u3/euPGX55sffVkZ+fgwCR3nd4kjJPIaHz84OnD//aZ3Nhc++DOW7fXl6txWilc4eYgqYGltRNRpEbdjRpQDvLkzwANacOBmUvItd2bzcbtDF7dPOUYuJhamZ9RI+hcQnXeY0rOV0WbxmIjqykaDMTnrGLM1AITCXNb7LPWphoaDTBiYwff0jgjUSIqDfu1PXp29ODR1tOdvcPT4SgG9IolAYA0PA5hstbvffzuOx+/fevSUtFn7onkDAeIvURW/68K3BaobzF+TCnjpvClZ5rOAAyhjp5cv98h6RqgClO1aHc+2EiqqdSqSlWldRVCDDHa0f7RpKxPT06Ojo9PTk4a5yVNyeeeRTSlEGsFnHNJtSzLXq+nSYk5z3MzK8syxkjMVQgvPnXMmBo3CUqqzZWzsCEl1QYK+tw5lzeZrqQBiGqmKQEQ5/I8z7Ps0qVLnU6n1++vLC8PBoN+v9fpMHsQO5eL9yJeRISZBWRNoAJosmTJUuMT1SQkWyfAWYfJ16dQF2Mx3iCsYU3nHoNahppdgNuAGVsiA2lki1Nh/MV4Q1cEuTqkAKXMbe2c/O73D3Z2Tg0+JVK2oCnzOaCUyKE7GU4ePTraezfcWC8SEZMDkiUlgQBq1rST0bSRi1476XojUmZkjpzEleXi1vUN1RIxvHVjY3WlcGTCZNIZh+VRqML2ybhOpWVfPtwdfPblf/zHD3oZRvF0KV8CIuDIiOBgDErgCERAQNnrpiBhZvPArzn1GnKNcy3q89477/I6+HE1LoOS+q7v94qVQba27Lb3jp4+3a1DhMuM8t3D4d7e8YMnB++9d/UXn9y6fWtNlE4nE8TJylKHVCmlafHTNdyWWYffHGaZ6mhi2j9Gr0vkbmYNHQmAiKSUUkpMlKtJ0NW8eOtG/unmyr0bt794+Pjes939ydBCBLvIcmzpZFRt15M/7u1v5vkvLl+7tbmxtrbc2JB4j4yJGr10Sg5GIEbbLNlmpNtmWG3Tn0zUGNcSFC0InM4Rewjm5YXmwfNzMqaNibm9aJIVLyh5aoPfoGhk9c7gJAsJwK3mgVlKESAlE+cToCAjJFBtGBmGtf753tbO0XDr8PhgGMZ1DEkTd7OOZlZWx8ea4tW11Y/f/7sP3rq2nhc+y7oMb+ZMKYEJjuhiD81iLFDfT3A0u9IZ8DOSPrVSYqZNDwfAyCCxIACDGcOuhTxhdFmTJW22tWSqZmpkB3tDEIW6Ho1GIQQQVVU1Go6Hw0lVBVMjprquj49tMlEYYnqxr1qWORhSSjFGCPIsW1rq93q9vMhhIKYsy3q9XqfT8T4jxvJyt+hknU6Rec9MzGBhcuQbIzxhca0CDoMSkCwRk3AD5+a3MlMoHDm+wJ4xA0wXeG8xfnqjodEiMbERT6k6Dd84TVufIAZTY0uNg+Ji2t5g1GdEJpIiDvbi55/v/fmrZ+PKyOVmpI0gNVuKQVU9ZzB+tlPef7x7ZeM2NwLG4qGBoACzJUBs2qY3ixD5ddpfVTWlmki92PpKj931pX7uBTc315YLcdAYQlK9vJqXYXkyGT8tk1K+c1z/5vd3Ny4NPn5/s3ACCgaGubb+AoYAFoxKQAju9dQNfP6km3nztl8Q1wgSucN5N4ZJDKM45k7q3yiuXb589VK+/ezwydO9vYPjTnel213bOqwf//fPH+08++j96x+9c/vaRr/IPUxTKC0E3+lOmQI2wxXcbkP6PLw737NGPzj4c87NoqxmiqAmmpiMysqrdrJi5Xp2Z6N7/+j2g4P9vzx+sjseHY7GNZHLs+jcSVluHR3f295d6RbLvd7K8uD65Su3r22ud50HMmI38/4wg6nGGIN6i1MPSgMTiTTuTg5t84M1Sq1t2Y9Binnp9W/asPn8c77ecYQMXtXOGo/bRWSGpMkacgjAJOS8AUo4JG5sdpPheKJPt/e+fPz42f5hFXlYpTIpXAbJlZtQrMTw6Be3rrz//rtX11eXiqKb+wJgwDX4NAYHEyKeNR+JvBkNMgvUtxjfZQefPaaUVNUswSILCXvMkcaTGXnX+PElU7Q3q5lZseLpgsO8QoH1K2vNU2blRFONQdXOqoumWpUaKjUgy+yF6ElT07FlUQ0Gn1FWNEW5xmSXiKkR/m5LcKnt02topZiKAKSQ0Nz5s65dgwDcSnzjLDfWhhzNu7KkyZI2XXowMLumc3J+AhfYbzF+QsCv7SSZnfUy/cK1/rYAoGLKbePfAvi9sWshGoxoXKU/fLHz+y8eHJ1Wk2iUa94tqhATlKiG1WaAZqT54WH95f3Dd9+5vdkDjDJmNkIM5BzAbFASmzb4JRC/fl7VIuyAzGvPOed9kSFzcnm5x6lii5NxCCku9/y1jf7pcDAen+yfaDLsHFb/+ps/rQyy92+uBiozEyDR9N6Z6omG5yHN6wz/ZjXAJn1MIM9+KevWoc6rkauSBMtiqqCFR3ald3l9cOXSxoNH+7t7k9PROMv6rsi+vL93/8GTv/x56//89c/fe+ty11tOS67QuXkwzIuezq+/cynZJsPUyKTR6zBFTfwzm59GY4dSgDCIRUNutFbknSv59Y3u2zcvb5+O725vf/Vke+f4OIxQ9HvF2vo4pJGmJ6cTN5os7R2t3L3XFV5y/lcffdhhWvK+l/leZhmziLT5N//c9ahNK+jWer80NE22xNA5Rsa5xvoXSFnOl/p4/gs6Lxdqs8JjZABoKpVTCWgFErhRjkpt7IVJsJNkB86eHIwfPXq0s7s3Gk8aYXU1rura+6zbycsyVONjcX5jbe3G8up/+fiXK3lWFEXupMmXkFkMde4dLIFUAGGiedr4YixQ309wpJRmubomXcfMjaA1kamGlBRmROzEMxEoAoRk1Phot2rWSCnB4IhpFu8ZCHDakiHNgGbnM8sKinVi5xzTTKp66r77ksAiNgpZZ9u9JYqm3lHjY2gzQyJDMrAYkYIoxhopGeDEETNnNIdKNZohqcLIUevsS9OOYwJA5aRiR1mj5tn0YIBsyoxYgL3F+IlnjRqd/Dl9tgQ4wBucgl/E91mMN3AVgDCcpC/vH3z+xf2d3RM1JrGi4ztLHRuOtaqAWGTIXI7K1SWqCg+eHn71cGfwwSXPiIlykoZ0Rk0lwNSIrbUttddtCZGIo0Jj6kQlZTGSbuGYPKNwnpREkxC5ylLH3by0UsbsNA1HE1RG9x4cffaHh8u9zsYyeQeFEgmdUel+BLdLm8CdMjxnh+BsQCAdpgkUFftuz/w4TE5Go2Gse8JiuHFpebm/8uDJwf2Hu5PqVK3QupCs9+c/7z9+8F8//eD2P/764xuXlxxJvwsiYzRqNxHNXnNOE9KeX482rQg2kpD8A81rw4NNKTXAWLX1lgRTKw0ghEa6HDEZOkhvL3evLXXe3xwcvX9n66S6++jZ/SdPtp4dxKVBTc45zoXHVdgZnvacW8qyu//0LwPnN/pLmyurmyuDteXBoMcdDyQ4h0zgaUqNNYNS1sCwxpPEZp+nJUnp/BzOzxmfg4KNDcyLUd902s9cQFsvRhMQoK3dZ1TUihpQT2XCJNq4rk/K8cHh4fb+4fbpZKvmsboYa2gS86SqsUKMzlRjyYT1PLt259Lbd966vt5dEdno+s40NNQYSS1zLhfRUBPMnXlwYSEttkB9P+kx43bO0lEt9GraypmEZE7ZqK3tNcz5FvQZVE1c24mr0HneIzcu6c2zmZAUBGZk0rASEKOZqXNMTHUdvZcXIijKZr5T0zCD4ampxhnc3C8pGBpTzQwRdo6soViYqcXm3p814jGDuLFnwFQH+IzSrmpZljUvnVRNASInTHOGqbNkXjNaCsdiLMZPI9i382l2o0aLng2s09CmNYNeJFjf6LWwf3jwu99/sb17lAxqsTforG4OyGdVXdZVZIu9XrHS61SnfFzGZHR0fPrg0c5Hdy51M40Bec4AQRNIGpWO5gCxi15ur8nbFQKEOc8MiTJwL8+EkDE8RURzReHYq04mbBuDTkXdnQlXz45CaRX5zz57uNwp/vN//NCgBk2cxGalckHL7XxN75YZ5DunBTCX+nTOJaRJPXEZd/NBqCdlOcrUrfb6/Q5GdZrUNpzA97j/3o3rVzYfPNre2joKcNXIfNYLRv//7x788e7TX/7io1///Uc3esRkDuRAjFoQqEktWQeNgccF4DffYtbqvpL+QJH+hahgGmUZyNSzEwEsatKoznGHnfMCoo5QT/LVPL/W772/vnT8/q3tsv6fW4cP9w5OT05Y4dkH00md1KIoTspy66SUrf1MJHPOO+7kdOvWZr/rV5cHK/1+v5AccETCKNCKmoiRtPI4lhgBnObKyzOYxzhzyaM2sWfcRIIzcVSiGcabCabYxcOizd9EQx0xijYKOo7p0d72wenpzvHR8WRcawpmZUzjSHW2HCxBTdQczJs6wAmWi/zdm9fv3Liy2suXs2yQZ5kQm/UMnBIxuGGbW0QMLCLiZrrfprF9N8xtB9NiLFDfT+6wfnG1SrWhf9N5W6PZhjDNmrT1uRbZNV33dO6UPm+TxGcugu0PxMOm7dcul5fch60lj51z3TVq836Y7ytuMkqOHc14ndNa4izwvCB73iqnnctnNd2CjfwnrLH25TmXW3vBTC7w3mL8dPJFACdQtNZHtCV0gsRACpd1a8lDSlBudPsXmO+NHCmlENM4pSrULEipDjFITqur2eal7tHxpBqfkAahmDu/uuxLouHBKGmsqnp7+2Bn92jj1jLHWNchy5pldM5u5bUcPM1pSpGJsxZUMECmDgQvsESIUSkpGYcN7956a3XncL8qIegfHx3/9rOHlzcHv/jkplmA1bl0NJkG8yyqWUqaZ69d09H8ATd/3l34vsEgkMI19BlHecHsXCfFmKI6igUlj2oStLZQOFsu1m5dWr1/7/joqDwZj0eJkXUPAv3TZ/d/c3frww+u/frn79654rwSkvW8sZlpBJEaWTJTFSFhmJnFyN7PuQ9ewIE/2KSdU8EBFAgsNUHMSIhYQcakBaAGTyjgElESWutksZPdMXt3Y+m4urZ/VG89O3iytb0/GUUDTIwlEI2hNZKpWoykIin96e5J5smLkJmo9vNsY3l5rTfYWB4MOr2VXtH38G03Nvl2WQs/Z5ok50EgWhuNVpd5OsHUCHwloMnZRECt9eRTQ1R9vHM0qcLJcHR0eno8Hk3qWKvWgDkeVuWoLGsz8o68NxEDSYq5BcRIGnrOXV1fuXPt8vX15cs9WcqyfuYzpoyisyimBBJzjYUENVKh4tsOQrRcAYWB3TQ4JV6cRwvUt8B+86cavTS7+lwta64U+I1Gc3NFw2brIyKbenMSt2JtOlNjPmcZSt/KZekCoDNYAw/Pu62ePbZJK9AF1xm68G6et+H7uglcjMV4kzeMJp2ioDS1DG6q8MKNk4OllOoQNcGxg8swZ1m5GD/2w2J+u2vKF6oKi6plCuPc0WC9f+Vyb2mJR8OIGCkpU8o4LfcpU+sWkYOa44P93SePn717eSV3zsGQAoTQUC9aob2ZATRek6zBVIaCm6ygGPjMItzImOFhCmXnOPcoMu0kdCltrrkP37t274/79Wnw1Nvdn/zmd/eXB707N1aBUFtwzglRDESUeSevlZTLBVz3jc83auzUiA1MmUMmpMopiRJqz7Uw5VJNYuW5Kih1XdZ3lw5O6q29o63Dk6OyjsmJuZHF/d8+uPto9+8/ufkPn7610SuCOoql94WaRCApk5mQTM1CLwz9YRU7LkYNdOZmpyCFgUhATImQGo0VRoCxwBzEwEqkhA6oJ54GPvSKyWb36L1Le8N4UoXDcvKvf/hDRQwhAwUhYzbhABrVE2ecicEMMe5MqkfHw4y3e3knY3ZmpIlgnl03z/qZ3+j0OsKZL4oiy7Ii9+LIsWBlUMyDwCYwVKKJWpliXdchhBhS0BRCqKOOR6OQtKyqcVmWZV3XdVQLgHZ6kxSrqq7rKqQEIogDqI5RnOOim7EoEGKMdaBYLxFfWV25ef3WlY311SXpe9f3vuOlz+RhHiqWRJM0jsuN2BPRfMCG817zAM2aERmLJOQC9S3Ghajua7xi/zYIR1+C7l72+B3SsV9j43vhkV8EIRe7wmIsxkt2gLbIztxwt9tmDjOL0AALSesYA4HgPNhhkRZ5E/ODU2K7kkZHttItLm8MKHcrV7qrl3P2yEglASqisWCs9F1BerIie4fjcTk6Gg33tzfr8u3UpUzYmhi4pYrRdB+fd+jm1+gWmLLW5mypaZoDZTATiVPKc+uplTRZF/J3NsNhfDQ+RHJlRX/+cqe3lHeXPl1fztVCjLEjHQQkFe/8j5uBRjMlDweIuGbPMCi8K/Iwyb2UXvMYq9oqroPTpdwtr+aDtZXOrjzaPd09DWWsq9KNSp2MDo/2Tx58ufWPP3/7Zx9c7rAcD5k8ZTnEA+aiQg3OMXn/Y5khARjErfWvkIFM58IrBWnTgwLAmeZ1RQEQZ4W/0ulMBjRRO1X9uxvLI8NOFbcOjp4eHO4cHB4Nj+oQN5YGsdIYSwDCwiJmNrG6rMKZuh5BRLzzBUtRH2VEIp6ZiLgRLwdUhGENz+ksJDMy8q7WkJKaGYFIuJF2TinFRkY0Jm3ke0Wi2DAeRzI2EJM4L2BPIkYZCalhEmGpm+Wb61dv3rhxY51WYANP3aJbeJcxEcG1FXVjMwfAmsnR+fjtnKngFOaZna3J+abPxZm0QH2L8b8f89i3fXzFy7FXbIun57167fWYocVYjNdxcyCjFgQwIEhkCZQQauiYEBypEzQy7kgJuvDre9PGnFWpQUPX09u3ry4PLieurZi4HqpYswVS9pZ5s8K5pa50BOFKJ4QTS6G/1FsbdBzbTGKLiEFkxAqeFvqUX8/d9sX1x2noSUzEAspMlXTgYlVGC+Ht6ytpnJ4+PTHIqObP/7y1sr70q5+9vVK4YMGlkDtniTUQZz/u5dH2/k97LFhaPWwRON9xGXxIRW2lS6VLVdBJGKk4ci7rDFZW+4/3x093hiejOnNZrOvhMH55b3d3a/+3v1n91c/f/fDDyz5DAEyJgdwZjEPUFMtOJz9/Ia9jhM/WBtBsU+KENUYCrdyxtTJ5jdaCMSL5BEuoRwjMLpcs73juGddZJ8BdM3t/bWkSrpYxlimVIT19cnR8PDo8Oh5ORjGllGIyC2aSuWCaiExAIg0WGkcbh8gQoJ5m2RutF/Pev1jDcxLVkqo1jZ7zXZ1RzRIpHKh1WTYxWOUFDHIgpxBNkpI3unPt+sZg5era6uoSOsRefCfLep6W2RwmRAmWcOYtSMyO2n7yhrwpz8dkdvGwWkRuC9S3GD9WaPkta4P07XDbc5di389VL8ZivFFDQWrW2i+RBrKKEIAEKLgGlRnVOccEBoJpWrg2vHmQ73wOAB3vrl8arC1nEzsd6rMadRwmBJWUC3UKdl3vuhnDa3a1n0mq69UrG2sf3LnRyUSQNCkRm5KJ0+ku24S+BAPkNdp1m6KBzrmWoPFcmAolYtoi4NiZy8j1yJf1JOjk8koebvbLcrR7WEXzByfhX3/7YGl5+Zcf3vBGSZWFUkKK+FGjPgFP+/xbTK9oWyhIiI2cOHId79k5l/usjNGnhHGlVi53s16er3b95aV8b3+49ewoOTa1SVmfntYHp9X+GF89G/7dL99ZWaalHKaYBBIgJ8myDqbFYbuAUl6nc3sqqnkhgdDcSWykRtYYqbfmJQTnCQa4DAARMykZ2DQzgG2VM83YMm+AGpJZuTyoY6pDGtc6qXVUhWFVDcvq8bOtUTk5LsuyrJIRHBshwlHeCwZVbQw2mZiFiSjEaBeAk4HNXDQBeWmk/0y10buDhSQGaZ3QFQCSkentS2tF4frd3urSYKXbHXR8l1AAS1lWiHS99wwXQa3up3F5ylwTO3MOJGgTjG16CIDOcTgZkIsKMmTPaeIuIrcF6luMv3Us+H2FGJi1En071Df7tVd4PtmrvDtaqFMsxk886FeAHBMjkdWwGhZhEXGEyRHVJ5xKJQ+NUwLoYrxpozH7EWYvQs6JUiSFg/Ou1DAa1qmKkgovvcL55V7eyTyzLneKlX7Hcb42GKz0C6SanTCLARFErR7gTCi62Zn1fN/1a3ALtFhCYVMvSmYYKyGBG5BBTOTIE6vJSu7dEj1L5aV1mYTVw/HoZBx6ef/R09N/++zB+nL/nasrDA1RHTH/qMMrIzLIVEfDoAZTmimEW+MF5SUzdkK5k56kmkIFrpxUdaWRYrdLKy6/vVwcbvQ/++Lu3tGoM1jVXu/gZLR77/GDw/2vnjz45Udvf/LRnc3lhvtHYDDEmo7Cuc/pdWOXUytqMC9Uy+0ypyZ/wFNDc6WGZ2k8rgOLc+yYyJSaGjsDQoxEoDQtjZupqZnUaTkr/KDxu7CoVqvVSev3Lteqo6RVtKhIhjpioro7HE80VVVVV1Vd19EUhJT02c4OLmhyGgSWgTsu63byosid840HvRPa3Nx07LIsy3PKvTkCAY7Q884RnIgX8cTCzMlEU2YmgISYtQ2yjcZ6QpbBPGCIbT3Uml6CKZ+TaC7Hb6awqTCEwXjGEVuotixQ32J8p9Pt4ncudNzpd9/9vn12zL59nx6IXqlv8HkIpy/6ep7owAtm+GL8lFM8ZEnYYKA4QThBdYowDqNTGx/azt14suetJDK1QIxFX9+bh/fafZAZzuXmMxNSqR2cQ1YwRUIIqQySlkizjLLVpUGvAybNnUdHHIoiY9aazJkC4gEQy8ye/Mzf+Wwnf63ORQMSNfXtFluYkSlYoSBur1+IiYvkXN4pJJbV2Bxddb2nh4Px40lEXqf45Vf768t3e/69m2tLgJJaY+P2Iz1eaAqHmxYwUAInIlUygxFJKwlkGXkWMiKzlASTnsSuq4KfhPGk1ipIqoHlZbryf3z4YO/k8/tb2ydD9HrsOodhMrq7t7f37Mv793/x4dsfv3d7rYeU0qSsBr389RDv/PrFo6DaWkOBprg9s+5oi8fTrAcDZvDIcoCSISVq1Esao8SkredxmxVhAiCwTgaiSAwFnJFzyCHJOJljpqYk2DxW0eoEvjpQWFJTa8p21hSuJzFcDAQNgMUI7zgXdsyNwFMriOe9A4kQE8lU29mZUUwOxATHwo3kpyiksf7TaVUfaCqc5ke1iHOZm/FNYQpTOEfcEr/PoKiRacvlpfk4jV5u9UkLCLNAfYtxceN+CeSbo0LaX/f69O33yJklxCte/3eMaOe+WESrr2MeQqfsr3PBYRuKWaPKeu6UasoFiw/0pVN6LvHxPEO6Db6bsoZF0jF0glpRT9LJ/uRge3iwOzk9jOXYp0k2eZaVB7mYOZ+oCYIXc/xmYj8iYhKSDAX6mc8KrSmU5sta6oAqIJIZEov0et1uZkTBEwmLEGeOHFOWZYCFGGPUvNedN/2ZNcm9fretNfrQuHB1dO7QAhmDiAQuF8cpjVaXCivrUuPbb62WQZ5uj53vHJ0e//b3j9YHg7VfLS0xUgq5kyl/bep8bc8fb1OOdathyK/bDM2nSZnmduKmMAdhUAN2cieu46oyBiOXaQFLjkJVVXXKnZ6m6talfm/53fu7J3e39w+GJ2wo8s7pqPr887tPn2x9dffhzz56573bV/udvAYzmGACawyGYdGI47QBrPXYmC9fGQC2c9+aMgYN54gKf6tl2Ga8zcB6MdRpIR/NR0pGbG21VKT9zZRQKzwjYZp2mBlnMYCUrPFNYNdaM5hQ+8I67ZQjRj8jVWu8DIgaj3VLgJqZJeaOnT9ICdS08xKICdbq+CZqYB5ASEY2lfwCAa5xblbAFDESTW0dyBrypsGSRYNas47NS+6IOABq7fpxYueNu3TuoviiKkPj80Vfw+zVBQVlgfoW4zvjKfpOr0N/1d/8hsEzX9BvVeuzF/698xd5DnYuwtgfbCiQyAzJIzJAJDz9NohACRSVrJERaQwFAJAltKQQatslzED0A5ShvkPOhL7fRaeQNO2kYmhzdjdRQQhRiISUNDIUsUJ5iNOH9f5Xw92t8vQEdbAYY1RKVljMdFLEE7E6wNV5IYN16S1DFufFGwv8INR2oYXoEYUojDPG2qQOO5PDsqjEKr+03F/KcrbCDfqdItTRSc7iHBOLNIav4lqT8vP60XLeM+x1OQa5rW3QtKmvhTaurcFMr5iY2Jtj85lE8lz1fUI36qqVV0Vr2j2adJdWd49O/vUPz27cuH3rku94cs6IajJYghoxibBXNVOINEJKZkhGam1NjQX+9QJ+09oVoWnKMjlDyTxdOgDDMdRAapxTLoVGSXVe16VUUUJCWddlpcF8zw+y1atdfvrsYP+4HJc8DhkJn5b8L394+Pn9Zx+9/87PP7nz/tsrBZAZYHDBgNhovkyYzLEDpCk9aeQGlVojSilKnNByhKTxGoeesyfH1CAYLyAq0aveN2hN8gR0cW3PmUZNG09I6LzUOMEYrikFnv/zjU+dUvP2BMR2drGpySAQMckUUpIJzyNgA0hgAhjx1I19anMFm2NNzmVWmdFyLBUwnjvkaAY4pSGyUtOmO6Vyz95NptOcgJFkDf6c5j34gn3Ic5N29sF8W/n3RQi3QH2LgecBzre8MV79sKHv+66j834M3/R4rrpB59/Xy7JFi13jBxtNr4jRc4CIpmlAAhFp2yzxYsxki09xbiXbWcPJublhliYtTEIvIGEAACAASURBVKmClodPHhw/+mM2eiDDRzo+kJQy9gSvSkiGVOeSCsej6CbUcSvX+1fv+N4KSBYz/aaivqb9yAxMylQDyuosZlXqToyjrzXVnBdFzhlJIZI5x0YsQsQNO+xM6w/PRb9Er+F+e86k9rkfyXNnqYGMiX1RaBdIBK07VG4UVYVheTyqymTZ/on+0z9/8X//p49vbLoa6s0EYGE2mREmZxycaRxvM3bD67Us+PxJT/K1UYAREnNkhgkn541JmM2phZhJ1mORqk4JfZGV9aUrud8fhrvbw0d7R6PJJFph4odHYfSHh0/2hg+2bv/svRt3NpkMsdaCAU9gEqHarIzJA+TYMcMMmqbgg2Y74HQD1NbIFzo1qvkbrp8LyQ16yb/nQiV6cZD2/M+a/raZrya96DNRGFr6aGNp/LytPdG3xUznblKbP43tzByPvn4xYC5pQV8bZNFz80HPXxp9Y6J0cR4tUN9i/HVR45twVbTYF350+I9eJJ5O88cMAJCL5K0p+p0V24x+kIYzemWNAfv+FyMjtf0VNrtAUU0CWKyASFYjDIc79/fv/7HQ/cKGnFTAMHNWeVjOMAQAI/NDt2KrNztv/bK4+h6KgUFocTe98YdAY66uUFBIVodkaKQc1QuK3GfeZT4xwXsPEiKmBu29NMtIr/17/vrLPUcVyXPnpIdJUkO/4y+tIGLpcKhfPtjL8t7hwe6fqt31Zaz9p5+TbyxzTcQxyECqicBguqD8eN5y9vWdla9PnBLA7RpgZiawiIvRnI/ea57nZVmVZV1XUYBsxfWWqbPWX97Nd/eHJ+M4KqEBk6E9qU/3tj//yxeP//6TW//ws+srXQmGFGpPmsUqZzHnATKiBKoB43bxNf8JVCy1TE/j7y3OoVd4xRdWrZ7rwHlOsNSc8ty3+WsOEnoxupw+mr1QOuH59M9Foc/5i6JvA8NeaX4Xp8kC9S3GYizGTyi8bD3jZrZxbVqSSEFtnHSWuiQQK5FObRmnzak/nBLrq2Og7zWZL1CGkhldCCpMiUwQYRVQoTr2k4MeSkfkpOPyroAoVggTscpRYkfDgGPtYvOt5fd+3bv9M+5fSshMWXhxTr/xdyaBYKZqVIVY1gEAkRHMO5dnmRc4R6DknJuG+k36n6bWfxeN4N+YPYsEzEycZ7EIUXNJvRzrA3r75uZkUm7tHROl02H1+R/vb64t/btf3nHkI9SSuLZZwQAj1vNR9Syy/5FLixHNCjgE8l5ETMS890FSlmVF0ZlMytFoMhmXiMFZWF2yTnf10trSk+3TJ9tDq0Iy0ppGZXww2TvYPfjTl/d+8entTz64OSgKRvIpkSUombgEikAE0rQVraF9skY01qMgUNZu0/ZDI4155HX+WuwlJwMZqG1dfKni3fSlLwLDb3Hq0Le66Auvw4u83wL1LcZiLMZifCfUx01DntFcrW/apU/z/83jxO90eH2fwPV1wHuz+GEqpEZnTkeACJMpOWAygQ7r3Qd8+LinwxBrZFnRW+kUOYeRjfZkPNR6WBlXbkXWbufv/Lq4/StdvhrIm5oQ8ULH843Owtg0ZDeFGuqQqiqoqUG9UJF7z8QMJlM159q8Df0EFoVRqyvSKC163+kkUa1DDF2Xrq51JrfWTkcHZRUs8fbu4b/+5t7G6toHt5cbuUszCJlI01iVZnNubQFFXn1HeQ3nqGm4pil1lkSImVRV1VhFxIlIlmVFkU8mE6lHsT7uZd4PJOeVtaWV/cN6e3d4dFp1Op2jk8NJGSuLW0cn//aX+7/6+Xv/+MGVjDtIlcUYSc0B3vM5XuyUKNv6cMyaB+gHPyy+hsI7k/Nh0Jn3lD1/zrwI773S+fA3eM5iLFDfYizGYizGdww0qS30Wevb01r0UCPt2fh8zI5KA9K89cesJ4Z+IE+BV43R9Pu/GJqy8QykYKOm316bxitYQBiN95/Gk2cujMT5vOh1i554pFpTrDUGwEbGfu3a+qf/KDd/XXeu1JYJkVt4tL/5yKbBfGSgZJTAVUhlHRrf5iL3vW7OhOlaav756TjfGJCMNIEE7CWXPP9f7L1pcyRHtiV2znX3iMgFWwGonawi2dy72dvr1lPbvHlfRpKZzCSZ/qrMZCYzbabRm9H0TL/emzuLrH3DDuQSEe736kNEJhIoFJvdTTarWHEMBAEUkMgMeLjfc5dzhDHZKNmkTtXFc/no2vrHN+5UcNPSHmyN/tOvPt5Y/um5ZdfLmiFmUgwak8Xg5mNRDiY8NZr+fGcPZh/NugFFJM9DjBpr9d6LiPc+BJfVLq9dFevpxLJld25YXFiXjdX+7fs7X9y9v7I8TMj2RpOd8WS/wu74088+uvXf/fB755eLwXLfEZG0aPTN1jQ/MGwW2doJRTd+2dO1v+sddupKGbmoN36io/K4z+X4p+2k2MHCv/w1vSd28mF4mqkufCpPiGx26Fhfhw4dOnzlAMHA1uBnXu5rZCfnPorzRk4ACVY7q+fOrQu07/k4i9zfI6qQ1FzDuQoOSBNvKgZ4j3Ftk0NvVeY05CEUGVNVjo/GB490up8JWaxmyxeL136UXX6jHm6WlkWjB8KzZrDd4RvKYhAGREM0ljFVVW1mjhj2i+V+4ZiEHiTp7IXr9zIwAc3LpwjzwKW8l1IdE2w1VHGprDc+vvGw11/bP6o+vfHwd5uff//tK1cu9YhWZN+garVvZYgdrGmo5Ynw/jleQsdCIE2vb1P8c67xB6EmMxMSZrlzLsvysixdGluaVFYOMrl6UVZXVs6d07uPdh9sHwm8yODwEAeHR1t3UnWQ3nrl8puvX9lYD14MsGC1sLVbJGhwBm8UHGcDn1HPxGMXjEavk3MKNvevmxWFoWdRxzO8KM7sxbCz9FzstGd7e3ycPJ9PP+GsKwh2rK9Dhw4d/toQs3Unast77ZdlYejPaNZ69JnBZtMazXfOnRue986or+mKKqkUA7XVLp9L0RMQq40gylLLiSB5WiynSfdCcBZHrCcQScWK9lf7b/w8v/6Tutio4B3piaDHtcTuSn/X1xGNVKPB1YZKFYAI+kU2yDNp1N1JstWPlxen1se2zbNpRqCCYOZkkIdkNM8L6/3RdGn/oL77YCJueVLhX3/30fr60vpGLziYYeZW3biMzVxJ7WREz+d34ZxSarWG+zWTniLMMtcYh4fgvA8xxrJMnnlwvlf4qp5OqumknLi+Da8vX7m0cvfh0ae3th/vlqAPoZjW+quPH396Z/cPX9x/751r775+eX1oalaX414RAGsSa0rRGXvxs3b3J/nWl37hm4I87dfZcTJzkYaRZjSDnFwj+pQT1XBWbs6e0lhqxyqyM0/N9pEFTxLLbt/vWF+HDh06/I3E7yznBVZV7R1EVWP0MAE8QUs4FR49+TB/7zDwqS9sLiAwY6Yzm+pvLJmvMIXMSnytCk773mApZWBw7ujwMFbRS0hVGQJjPZkcHmVBC4ex5Vi6NHzzH4prP4qDKzWXAB+IYBBLVKUQrjNv+E7fkm3tgQpG4Gg83Ts4dN5prE3jylI/OGqK9IQ4U3vBWr7UEEmhhaZwL4qMni4ofaXj1YG/fuVCWeUHo4eHh1qpPdo6/NfffjRYKq6/vBIEZUIQsZOROUFrJtH4d+kH+Ea38ydo66kNjwIaKSIi3gugWQhZxiJnVWrm68yhqm2qpZfgLwxXeoPtg/RoZ7q1NdqdVJL3Tf3eZ48+unnnwxuX/+nnb1+/tOJYoNYsBIHYjOMltRThC9rpgta300dLzB06FpwVODsokrbZBGlyoY1BeqK0YqRNeqDlhkaSMlcHOv4lSRZ8JhfondWxDiFwVoO1ZqZiVmq0BVVQgoDOLlBj+io2A8Tb2Ty/Q8f6OnTo0OHLD8K5SywXE7IUEYpQII4C0CItEgmEwZ/etb7VAf0zf7taa1Q7T+M3/xcR902Ks0vb00Q9ZXNLZM45OlQ6HY0n42keFWpxOhVxmTekMiIU5y4W138QrrxXD14uZdnoPBgQnUW2OWD/XIelHf7s/WgGNahRIXXSaRXLOhq8mHkiDy4IHRVteG08HeJ/l6PA4ynGRmNYWh2bQOlnWRmzVMZh7tdXly6dj7E+nI4mzvHW/a1//d2nvcF755ZDEVJdxUEWDNrseo1T4ndoZpZ/fjE0ks1Co4ScMAmWpTp5iV4sc66u63EZp6Av2HNhucByLitBHxz6uwfxcJyKzIvw1x988enNL3741is//cEbr1xZq6JpjL0seJKAF7iAlJqrO9d3gXf+rI38y0Uwv57ToqXFzWUxWzhCiNZHfSb0Mxv7FFsctRNbJK9qhnYe3giY0QDVM5eSgzBhQTNtRjdn1HFOEDmn7maWEpMChHNwYoBZWrxEZjbX7+32z471dejQocOXn4MKKFuS0nQ9AVARkgZNNCMiYiWMVAOYKEb3zDz/p6mKnu564+yIj9/Y6UioQJ3Vs7BADGzUXGAqFgU1Jof14UFVTjMz51xZRQF9cMY8LK/l19/x138Ul69PZbmiC6C3KDql1QBBP8ssdwf8d5PSQIGkZknVEqRKaVrFlExVg6AXXO7pxZwjhV/i3/advT6gwB3f+DIbnDVmIQyLXp2m0wqbq0vl1awscT+Wpm7vcPzRjZuDpfBvf/GeJFeEAjRFaseYnz1v9m9mp7QncwyEhsxgZiZeci8uc7081LFOwZV5VeeSKp+WAlYK2VzKL0z6y1v1zQd7o/GIFoxhf3ey9/vbnzwcv/HKlR+989rLG1kNVmXMkPLMGaHmIE39Sk7s2w3/+hYufWOlLvPnYUqDaVQ6cU6adsykMFWq+hDQVvjaqb92GMI5GMxoBEE2utd4are1oFUjAkBxIKiNs3tqcg8Ll8ZOqIo29uwJbZrCs1Nx7lhfhw4dOvwVmI2esWlClMXWGzM1VUc4mINmDoIESw7J8KyriqQUYWfEEyLCb4yyEhFW0eJM/4azZieBJiAhjfVoR8qj0F5PcUVeRtRJl9c2e6+8Ldd/yOWXajeMdAQFEFNqDUTQvUBijV06BlCwjDopo4KNmkuR+eDEEa5V3n0Boz/hbJtKaFozIaQlAV3mi75nnSldYchHk7Isx9s7++Lc4529T27cunzx3DtvXDVBgvoFLvnnfa+/o/s/GcHYzEta8EQmNOfVgnlXZX7sZVzWk+TrIqRe0KInIe9dPDe4+2j79qPdSULorY1VPrx18HC3/uSLrZ+8/dLPvn9tveeQrJ6WvshSSqR3cnyBzUw1OXFP4aXyjd5WgM5/lS28JcAJW2UfNKar4mQxKTAb+2u+wbjwpOeOtTQ7eyFJ0yA691ifn050bDnj/PQymDaNoly0kWhF007oxZh1ws4d6+vQoUOHvyy8NMz6b2ymZ0cAjt6LJ4ITc5RqjNEWVSnP+q5F58y5J2M5TmvaN2bfYAlWweq54BvbIEbabHE1Srt3fbVfsPZapVhVrphmg2y4KtffcNe/j+WrNYcpiXcUwpuKGekAgzhQvhPK8h2+LHPAYz9rqaNOyrqJg0VY5FlwpCnh9HmSzv3arg6NMAdSF6NxkuZIH8QNMm9IVmGYxyub/bI6dzgalVWMSR8+3v7N7z5YHvauXV33ngonC67dbCQcv2HW8Qzs9qcns01T469OCpwXEmLmkfkAL/D0FWKNqoqEQaJ34fxqvjbYHPT8rUdHB5MYzYP5wUjLyc7e1s4Xn936h3ev/fDtlweZRIgJVK2OCYD34kQMSGbuqc/qG7y5YIiWWqLfKGwBqTkF6SIZkyUFQDp6B2esbeHWnK26xTdt3gyaYIbgz9ihzVDWCJ7ezeljM0PKBcYImZNIc17YPK7WNTSR8OIQnKrCGglbHg/7Ad53VKJjfR06dOjwZwhfE+4oIWg/befQ2OQlLWmsmWqtynLrfq2irveMBJsnRixOIqXUDvadfKqe8s0ZWtOUiLBazGRG/GwmiEoaYzXZfpgOH4Z0KGmSVGvJ/er51dfeK66+ieXLkQNFHuikbQ81AsoABiXRuHN3/T3fZdLXavlFRTRUdZxOqyYuDN73enlwAkvNtJEteKq8KBuWSat9IWY0nXuRi3OuBzb5lWpajzPWa0P30tWN7aPy5u0HedE7moxv3X346999cG7lZ73V/MTjHksvyXd/hZ28pA4egMEbPBwhpCcMLkMWepIjq1ysQlWFUPpQx6zCqByt9Vz+8ualjQv3tke3H+zuHk0ofjItNbMbaWtr69HvPvjoxz/43o/efTV3EJjQJTOdkb0v3YO/qb+CwQza5As4E66e0zaT44ZKA5SogARkggQkIAIaURsMiKp7e2MjFJZUY7K6rus61ilW0+mZlz0LeVbk/SKniKmB8M5l3q8sFc2e7h0yIiO8kAYj8qabOXgxB0CNJF1Tj5zN8nXjfB3r69ChQ4e/6CA0dyw22Ry6GlWdRZppjLEuYclidfj4PnYfm+qzc9A8LUusmrQZi+e8g4tEY2/9TT37NukKI1SajDKgICBqRtKTaXIYdOrTJKAs8h5X18O1N3rX3rHlayMMoklOBpikCpZAgbhEX4NKEOZB37V5fufvSrUUY0ycVPWknBohTrLM94siOOKUlO4LRYqtVTc0aqQqANBBSDpxMIgg9+jnVaUO3uqQX3/l2rhKe1uP82y4u7tz69b9P/3xs94P31gd+oXKubZ3apv4kuf7Kj1lU3xi7wfNU7OZJwwNAFNqVU1AZz7LXB581ffTKoTSl6O63l5bCssoppU/1/frg2Kzn99/fPDg8a4O+5VWuweTrYPywai+P7WP7jz6px9878LqcNgv3MLlZlvRflIS+pvd2wxI5ExzmgaLsAhLAOkqQ0xUQM2mVTyaTg8mk9uPtkpFGeuqqsoy1ilFUzUjg9ESTM1i1DrFlFIyPUurBgZLdfRZyEOGmS2uFycioiqEE2Re+sEXedZzIQ/y8uXLgzwsF0XmGVp+jmDWB/JOu6VjfR06dOjwV8cIZzIYgHBefS/6leiKyGEZk49jb6U8G1Fn05y60BI3N7RT1dosmiSwGdRwQEYTwoTKb+z5RDiFNKMrhLKtI0jD/SQEozL4iCCA9FYG199yr7zL4aXa9WvzzWsQVWqEJbhgoLUGgCDUOl/E73QOBmYwNdOojEnKGlWtMDTqnVlw4mU+3snvfmXqaTuWziX0Z4NWkgBHmClp/V5uXtPRYan1pZX84PxyPdo5Opwg6916uJd/eHN5ZfnH37+K9gI2G0mCWdtz98Sf5Svtmc/Wdm5PXWML30iTtsjVdDuKKeKMjzUCqUKQGph5IqPzIXNHo/3JeJKZFxdcYH+zd2Vt8HBj+Pnd+3e3xkIg640Tbtzbefx4+9Hdez959/V33nx9bbUIhMxliNuRgmYJu7khgi18ladex8I03NztwOHs42guhakzymtApJQLTqoJqIx1Yqn6aOvR4739x1s7h6NxbYAwqk3VDsq6MsSUVLVddo3wK5vumMYciO05I6apXhRvnr93wVuqtW76/2mwpubo6cyUGgkEkeAl8yEIfn/7rhBi6qi9LF9bXd7c3LwwHF5fXskBDzQ7AdAO5gc59tiVhT6A2RD+cVPqydXbXD05W0LVvnrE0KFjfR06dHjmISBs7smOmYZ5e6CVo+RXrh5svHPraKdWgFYAvYX2xQWS+C3wQAVNgoqYacOzVJkMCSk6qzENRRKXUs3AZZ+GVvpcYuZqnvX8//aXoKDRG1xzprMJOEgDo5oaHUWKlSmMua4uLfWvXHfXf8Lll80vCVyPs/OAgAuABwUUAWdeGZRuyX7HaV+ERhqMeQ1Mo40mNc2oVS/0l5aKaUqDIlNHTTXFibxg8QMBR8A5NiYXLflttY8ICp25LDEiLheF03ER9osrRR43/vRF2hlF5PmNncjf31zZ2Hj1YhFMLUWytlQp4LIeTmh3HMfLi38mOeFVKs/qlTr1KZ9gIwA5N4Jhq5Pj7Lh5fpZdCDQXLA+qrqrpvS/yqi5jXUWHOojmwQ8uF8Pextqqu7+9tzMaTyoVn9c++2ir/vTf//7VTx/+44/f+f5rl1czSzGJRja9DM417QtGmqGGmTdCBY6GJt11/EocGhWfplezthqqOYIXZ2qpqs0QxME5a5RqyEREgQIJqMESqIyTiL2D9HBr/8HjR7tH++NYKzFOVTStTKsUazNtekGNnNn1GeAoJEXazKITZhRVTXVpjVSYZwJNzmB9UNNUqxqJEPLm0IkpaTNnToKshdEwUUWyuhq74IVOYTo6kr1xdn9n6MKqc061H7KNteWrF85fWF9fyZETHugBHgZLkqJ3ImYxxpANDEaoNQLBiHPlGIHAPLT5R2lWgM3dYGzRUOL0ypqrZ3dFx471dejQ4bmJoFpeAmn0AMUaLyMSoPNZb2nt8utFfyWVRw6aIfk4Ep2ekQP8dpTEaOJUaKY0U2WKqJKVVh2Uj0ejWyPsQcqMg6W1V1fyV7O4lEvtOD2D9X09dghceGt5YMP6jEzN73C+4YR5f+A2L3P5ZbgVMvMnXLZkzu+aUEzOjuQ6fPdYnxI1zKmFWjGNqGtjUiLmgb1eBi/mZa4rQShfnIIfF/9blIDkbL6vmdYSwrxI4bx4eF9Kwcvrg63RuUMdH5WItdzenv7qDzczu/r65T4IjZHOEaqpFhf+7H2mx9zvuaB889CcJ94vOH8sNMO7U7k8I6wZMhaIOUrfSQihjKGsqjIETMt6WteTcrq5FvrD8+c3Vx7uHj7Y3nu0e3C4V/mVzaosjz59tL0zun3zyo/fuHbt/NpKHmAi4sxQT0vQhV4GWIpKUUqrsmMm1rblz+i3WYxVnWoR+uBJ0VQnM6G4zJvRyDphNJ32lnoVMGlSKYbdFO882Lr7eO/mvQOVIqlMq2o0HZWpVMA8ElVpiZbMEpIB4iRQqBqa59AWRBNrCG2pPyiy0M+LELwXyUMo8izkuTo+OW1rZjHGsirLaVnXdUyprqqyLKdlNZqWkKasSlUks9qgBpdnmlibKmDmTDid2iGq+1HF4GU6PJgsPdwdBpchBtXvv/7q5XMr51cGPQglc0BGmHPjaeW9z70AFChBaUrlKRmEpoCDBZiaiqkh45csJDwxTt+dSR3r69Chw3MVR82nOk421JAiedFbv1CsLJvVgkSddQSd0QX1bbA+qjGCCUgwg9Jq1HVdxkm5f6t8EPcmSS2sDc8Xl99aO/de4EZrP3j2o/3t51eTU04LByRbhTYRa90xBE6gRnEMBdwQ9IDw6c+kO1ZfKN7XurSr1TXKqak2RswI3vV6RR48aCBF5LiQ8IJtWHhCynZeqZ+pXMB7r8FTc6S6gm6sFtdjdlRtf/FgJ8V6NEp/fP/jYdDV4evrQ4H5QIDUqOLarsBZOUzwlFE5fc5q7/yzX3uKQHBrIUc26y5zznknGkJdhSwLWVZlVQTLYOKL0BsOh8srw6Xloth6tDvZOixzn2cu39ke/7+P3v/04zs/fvf1H7x97eWLg+nUnMVhLwOQtFJLeXBMEdq0uVMJFXK2PRrUVIXo+UAz1oqUFCZ5AFmD4zom58Vz0ssf1hxHfXxwdO/B4/sPt/bGk1oRwceHh/Deu0xgNAWSWLLKoCkTOEfv6J3Pg89D1suLly5ezpzvZVme+yxY5uAAgQXnMzIXgVBIoQShiMhZJ4kZ1ExVmz5RwCxpVJ0kq6ixKUVGTEodTSbjaTWt69t37kyqelrVCjifmVlK9SilKhQWAkRGSUd7E6bKqQWkrdHHTuMgD1c2N16+cmV9ba1wEHAtEyPVCAUjM3jvZr2zTZu00IgE1BZTijlzwgRNLf3EwdSUAecqpnP10e6E6lhfhw4dnqtIE9bu83OuAprBKOIzOEJrpAoGhGXI4Kxo51up9amxAmoy0gwJ0ekU05EdHrqVI7e0b31Qetlq3VvX3npM55wE5+SrB0V/+ZVsxN6wUJRgG00lUzOKiHNJVU0BJ/DyzFjed3h2onM11HWcliVmNirB+xC8D6QZQBFpSh9dh9WTEBHnnA9B2INZwbgi/jKLg0l9dHS4vT+qq3ov8f0bt85vLP/orcs9n5exzrw4z+PNbFawn11gObnNta0SL8jdO5cPaQpvkmXmnPfOe++8z7IUsuJoElNZ+xT7hb+8ubY0GF4ZxTv3jh5v75fVNIReRLj1aLwz/vhPtx5+75WL773zvasbfirUGHNv3gw6FTiAhiRmic2kX+NooDR6cd5II9SsSpZMhv1ETtRqYen9ntmD3YO7W7uf3n1QRowmcTpNVZVoAjp4y4dZtEpTRYMjRMwlzZ28/ebr/Txb7hVLed7LQu4ZHINIkRfOMYh4aTWUm3VgCTKbR7QEAA5whD+z/jvTITIH+saKD2aoDDFHnNHCpKhSKpNp0vTapVptVOm0xLSsjo6OtvcOHo5GX4ynNQk1S0nVACdZcM7t16mc1Dis7h2m9+8fZFm2PBysLw+/d2l9tcjODfySQxY8DFUEoma5gDNRU0GEqhkoyuQAmBibSXLM5wMb1qfHrM+kS0t2rK9Dhw7fhbhTvFlUo9A12pcwQZAkveT8M+PSborQEC2hASilHgH7cXqofoy89n0RX0u/Yj5J3qnLvHfe4ZvirOYQnBoXTvomNDRCXZsvb0ZFQBPCNwn0bsV1OL732ux5VcfptGzyBkJ677xjY/UMA4X4thqrn+UMlrXe9c45ICgBMtNpobpayMsbw+loNVXTg6NpdPm97YNff3hzaXn41rVlB4sx5bmf3bKzsTaeFpe0FybSbRzh5nyvqadqu0Yp3jshCRHWPoXMxNfi/SRaqM3TPMMwyy8Mlh6s9m/df/R4/9Cc98P1fU0Pb+3d2qs/urf/k7ev/vjtq6u5myb6GPtZ1vwqNn0SUM5UVQ3JMWuGDmMZHRxCjpCNzdWwI9jdvfFnD+7f3NremkxGyXb2R2ae8AHBS88btNYUR1W5E4Iu9/ob585d3jh/fm1tLct6WSP1MAAAIABJREFUsNz3+t4vZW7g6Cm+UUk54b/esrtGMcwWC6PzFnxr3W7PWJmkk+M7HK1ojVltqbmZhXQw5xVQtcnUkQ7LFJqaxniurOJOSg8t7Sj3D+rt3Z3d3f2Dg8PReHKUNGRFFE/6I3N7B5M6HhX96frh+MMbX2wu9a9sbry0vn5hZbg+wCCYd26qdGIgFWYaVdRRWj8LANR5H4HhpFzaghqsops071hfhw4dnqsYE1CYNClLnTV5kmLm27Np1qMIilISac/Qs59NW8DQCnTWCqkVCYQ40KlqikpKlns6Sfym6pKNooTNVMkxGx9clE4zIimSQdj5rXc4YxEZaaSCdR3L6aTRB/Te9fLcyUxuseF+nVvXSX4yF2RqLouIQ6AXl+WW1ZOBjxdXsnRxbTIefTYtR9MyWvHhrUeDleXVtXcuLnmhpNRIgZxICM24X8N3ZP61OQnkC3B5F14s0bie0iDwpJAiEXVcckWe5aMqjiaVY/RAQlRLq9eWzm/0btzb+uzB7s50knzBfGVrVO1//vj+g+2PP73983evv/fGpZAVpTI4czOVTSK64zkynwxVUu9yy11trFX2Kzwex5uPdz5/cO/BweFuOTmM1VhTEvEhz1wIKmlSp8m0H4oLG+c2Ny+//OrQUQuXDUNYyrIihFzEmWWGDAhkMDDNjhczq9qJgEbNFOLa5UBrHS7MYAq1NgeT+zMHIFJVNVey7c2m0DV9/3RQGC0mTQaYo3OGLHeNrhpBM2fBIctWHTaAQ1i1ZuXlpaqOkxiPoh5O4h8/vHFwNB6V0cAsDy6ElOqtvTJo3D86uvVw+495sbm8+vKl9Zc3z28sh9UeCtI3Uq3mnUY5IRdmi2Ofx6mQ0zTvxal2d6yvQ4cO3zX6txB6tgpeDlCqaVKoUEgfHeJZcnDCs+Sqv9H3Bhq8QqAJmsTMpVpSKal0aerSxKcpWbo4dnEUtMyoxloR7Thaa9/PRkf+pudDUNRR3fxqCo7TpU3MoAooxGYyLd1URIeTWQwzJjAZqrqeTqemCmiWhaVh34sDrBG3UFWQIl3I9WSEbbPpPiGEXkJW9PJKEL0wrWZHF9cmVfrs/l6E2xlVH9x4cGF9LX/rynpfqHDHav/25AZpM/mcF6TI2lzJhk7PuF/jIjMTfxFxIVCEIknhnFLoRYoQYzJNZTUejSf7q8Pi3bfOr11a/fj2zu3tw2mC96Ga6m4VPy73dh++/8mHD370zqtvvL56FC0ECbQAc+apqcmeGX1SK40lpSR2JvHmg4dfPDr4/NHBSDnVqkxpHK1S+iwbZiGV0yzGtV7v6rUL18+fv7paLGdZkbmiH6TVR4Zr0id1NI39LBdTqqWUYEYRT1mYe2gcgtQsNqqbVAAQNvnQNpVosChRz8wIZm07ZGrH6eqmWujNNdeWDs6JzViuWgKQGhEwSIMezSENAQtiIU/Io2FkNor61lqvirpTxbsP9+48fLizv1+lmAwUr+DEbFxOt3a2vjjaH9y+P8zcz997eyX4zZ5fK7BECRqYDJosP/Z8WMx9zHPEJw1julpfx/o6dOjw3BK+uWiBGZr2TkAa/wCIiiOR3FeyAP47PXOFqJmpikWaOquat4AqR0yIZMwYPWqXplJNEIKEefJ4kfXZ13Ul+RQO3Kp5oh3qwLHwdUf7OrQLoikLJ2Myq2Os69pMCWTe93o9cSJQJ+0UEMw61vck5Vskfg0v8T708ywgiU4HWbq4Ppyo7E7S9jglc1t7R7//8ObGSn/p1TXXtGFDTksVnqjovXBttS33AwCkZsYO2pgbNu0NApc5Z2ZZsjzTXq3Tqp5Oq1hrzyEExfjIoFc2lpdXXrrweHT73u7dB7t9FwKLurJ7D0a7W9M790fXPl3553/3Xk70AwuzzOBMaDC1Uo2FrxUPDuoP7tz95P6jR4ejoyiV5pM6qaXgXe6KzNUFbTlkP/j+O+fybHMY1rNsOc97XpyZV2TadEm3B5YI4cQkIEUKRWAUmCVajUggaRJSnLhmANvI1tGAAJrOEc7uXIUC7kz7wOiUC7u9GedSvPM8gtJg1rBKEQeT2WkrAMwSYl1Qc4tmNIqJU5EBGIOL2TAZLpu9ujacvrJ5VNdbu/v3H+/+9sPP4HN1QUXG0MOqZF0KcPtffnlxOPje+Y03Lm6+dm6wFhho1iZ8jy1tFxp7WjsiOyFXoy+ub2jH+jp06PAcRklYVG5blKoTaT17mq6UtqcFQn12wh5K0ynpHDRZVDFzpmKJMVJrQUSKTNFBBQZTJuGZwnunu1n++qsJRrRR44z10ebDWo1S4PFvZeNa3BG/jq4YzDSamQCsqzgaT46ORgRgaTjoLw16lmrvgogC5pxYO17U4ZicnG55JaLSOYY8yxid1jH6ShF9f2TZL3//cfB5Unx842Yhur78s2ubuSUTTXnmTdU0iRdNSWP0ed7slAv6Fi9ueqK5Etb2Oja2BqQZCXHixbxD5hljinUVMhEfswqlTQJids5f6G9+7+LanXtbD+5vT6cpz/vq83tb43u7e7d3d954/aUfvvXapTVa6ygLF6yMeuvB+P3bdz59vH3v6OjALPpgIpYqMnnTPuTC6sorl8+/cn64nsvacFCIFI6h8WWwJFBHkejNTnpZkK07PC2x0TBpyI4RRs+G68W20kk7dkdvqnbNqmjHDcJZc9oG8/P66EKKB6321/zr1jSBztglj202DI0WDDXB1CBAghqMGUWpCknEgNTCadFXk3JlOL584b1XX7p/GG8+eHjn8db2pIyG5BzpDmJMh4f7h4ef3bz96sa5t1++/PLm2lJGqmXONV2rAjjC1FJdBe/p2DSytvwXVldVnve7nadjfR06dHhOKaC1ZkOnvAM4iy/NPVPBjs1PUHqDKZy21r5QMMEBkiAJzugAD3iYw1nH8tchqmLNOMpsKGKxXDC/agp0LK/DU4kL6GJj21XFqqoxE/DMskwA1zIbpVA7xneS8p2Ryml1GumdqHea+V6t/WRLdBfWhtcun//s9gOfFaq882D7l7/+aPiL984PaXB1aqiMExhBaVUXZ9E+9LTbyou0QptsoDRV1Xk2a6EL1DnkdI6SPEoPuspQeRenVSy0zD2Xem5ZsJ6vXznXv/dw797W/s7BgQ+9vAiff/54d+fozq2dN1698vb3Lm+sIQIPt6s/ffT5w4PR/YO93ZQq72rhURUtjtZyf2Vz9eXzF19aP3dl6M8V+Urmc0VGCIyqhILJqDPTAeGJUTSbja7TSDbD7ceU0Mhm6p0n5VvFAHtic5fW2vAM1nfmuWkCIRRomKTgpHvGTKB3oclUYL7tELHmF7ZtJI7JE9ksO2vEIMhyyFf6vavr+trFlQcH1x4djO7u7Nzb3tsdjR1lUlajqtw2fTw6/OJw/9L62vlB8W/ffqWMEEPhoGbTKmXiXAgpmjPAjKZIgCMEwYVu5+lYX4cOHZ6jM3wxQMJMcwQ06EKm8fS3PjOUL9q8IysYGGmRWc28kvYNZqUUlfQq9oWFo3dP66n8Gl4XFVSekrPWY14508ax4/ZOJx0H7DBfISJJtY5JwTrGGKMZhOaFRfDOkTw2yCJPyIp0OPOedoQAdEILPoshoW9akuvD8Na1S4cH+3v7o17R29k9/P0Hn1/YWPuvf/RSLkwKJHonSErQeX+SSx5fd75wi3S+16GhxDZTeWxJCwU0JxQxtYx+6CR5mRZuWsm44rSUqqzLQtO5fnFuqT8caN5P93cPR1VpKUmNg63qcP/Ow62jO9uT9YvLo+n49qNHj/f36F0Ejqp6Ohpn/d61jY0r5wbvXl3dHISNfHk5hCVBbpBkrJVO2oZ7J0ZEiJIEMyfyhAJP6z5nbbfiQlcjpSV3cuqbjw9LO74u7RigPbkO7WmDEZ6nnwqfdslBmJ+5RSxQ8GOlsEbft+WdBnOW6iquer867F3p98qN5Z2r6/d3qkcHR7/54KOplyoUkfawHH/x4FZxuHV1uHT3/t2fvfHmq1c3QdQRuXMmUIi42TAEBKaIkQJ6/8JZhnasr0OHDt9JJijz+tfCcWUzIW17Nt4roG27EZUu0keGyBCZ1cxqZoA2H9SSOToTmpytxIKv4/kkUE/XHE596p7Y/bszs8N8sTAljSmZsY4xpWh0JJyXLMu8LCi/2pnlrQ6nLidmdpmOPggsM99HitSyqrBW/OC1q7//4NPxZKomR6X9599+dGF95eVLy70MhqajjWz+Bqdn/PRFH2dqqIa1l8ZgTdkJMy0dEjDvhRTzLpjL1fs6uKpiWZeZTwflgVOcP1csb169fFR+fvfBo3sHWgYnWYTe29q7Nzryn2XRWURcXl+p6jKVU+/w6sXz165eeenixsUVf7XHodSZaWZTF03UIRkUoAdbFpbgGh9VAhQs9quIYS5MQ3uCd7Ufz90bjgnfGWSHf3EagAbqX3YTm9BOJ2BPPGPC5o4uDhh6M6gm68GZd+ey4kpRjC4M3744+MPdnQ9u3dqqJtlSP7E3snjzcF9rPLi/8+pLV376ox9eWvYROFLkhBeYwgvb+i4Nmk76V3ToWF+HDh2ebZwSKedMG7M5BI8bKI+/Pxntyc7Fb+W9QRZkMud+6PM3aRx+lS7RJwYljTBGW7AgWniJ/JufDxROn+yO7dZZh698P8akMVmMqOu6dSAgcx+yLNDJ3AekS7F/RVYCUwBKGrw5uuByq4eIdQlP8NJqeXTp13/4NO+tlElu3d/+L7/7KM/fuXxp4B1AQgVGU6Oc3C1e1Lm+xrm7gbZ9iWazpsYZC5hlC9s2WfrgzOXiWQeEWnzl1cEyYa0BLDxD3qOcWy4G433/6PHh4XiUHC1qPaqYO5fJw4cP15Z7L1/YeOXy5uuXL1xZzgdZyJlCfTTw5sVorasEHNuaHWECw8LUAqEwa1KFMAETjBA5k7ItCpks2pLjKUV2a3OlKk/+C8+820+fFl9lf5DjGiNxrCC22JUjCwe6F0K11WExWmQO9J0brK5sDPs/eOnch/vj9+/cvr3zONWRhonLNOrB7ft39sdvXr/83huvbRSogWSIBp8QBK6x8O08GzrW16FDh+ctLuJiFHNG2wvmuT3MbOeelWhHAZkzPxg1qUVvtVgUi4IoSIokUGkkXgihCe3MgI1fw/M5Forh2Rf61NMH0Vk3dFhYEwpVM7NpVU3LUsSpmne+KArvxIGczfrYvLjS4elBMk1haoBSjC6JWBBv6MG0L2IVC756aX175/DW49G4kjz49z/5fHNjLRTX15e9DyBpgNrJCNdOzl+9yCdI0/1hbZKw0cc847sc6UScy0KPUZD56CQXl1VxdzQe1XVf/JX11ZWhv/Ngeu9gb3w0yXp9X4SynJYHoyy4ixsrP/reaz996+rFfraUhQLWEw0AfO4IGFJdI6kT0GdwbJ6UzdxlZ3Y6RiTByRk9KEzsRO/urBn/WLFF5mfO6fvOTnxof8mObnxiCJBfmk9oXtFirY+nfnbmLAkIoIZqOvaU4Bycg6kRWeM5qDroZatF2Fheemtj+fbh9IMbn3/0xd3SyVGyTFiPJ7vvf/Lh57d/8tZrP3/rpQygR+NzES0GMRHp/Po61tehQ4fn6cy2WUKc8+PLFnid8ZiwtCUtN/+hbx3OKI02ChO0Fqtg08wmuY0zG2c6rXWqVmVaZloFq7wml7zA4Uyf+b85gHZ4Uh5UZ1HF4gm96HIhxwFJhy6GhoFUcDKZjsfTpkkuz8Jw2G/swhYzCov+BB2+JLQGaCZJaBAIXTCP5HuesaLpuWF4583XtsafTsZITHtHh3/44NMsz959/SW/RDMEzqVb7AVfnW264eScG2bFNLP5dADbvQ1JkFqDO4qZmXd0hYQsD/1a4TnppRAy1sl2Do92d7bfv3Pv3nS/8tH7LMWpi9WqyOX1c//Df/OPl9f655fyAlZQg9VMZSpTRM+HXDwseA1IIERm3bcmUIH5NtF3uoOTxzxNmwrgzIaBdjyI3RT4TlkTSdMaevLxZgk+O2sNnrl42JYHF5o1ATbW73ziRxoPd7XZaKHM270px38izs9rIZjlRVPmS4iqySw1w8E9l5maRBbmz/eGr+eDn2S9Gy9d/1/ev7UV43Q8KqtpAY1S/f6zW/ce3P+nn/74wlIQg/NItTmCRErRS9ZtMR3r69Chw3N0kvNkK8upU/5JYsRvx5zvqYGIAhGoaVEsiUV3XOuLRC1WC2pB7aC0NgN8Vrz9dci5cGbf215LPXFhTY/Z4NzmqIvbv0U6MIulcCrwWgxqF6I6+9K/F5/2G8781zMiumYJOdCm03oyLZtyQxZCr8hae2fjXBHQMK/8/ZmnYn/JJbEFBxdZDGFPV/ntxD1ji4mMr3Bp/r5UehYP0wGgE/EuhH6RVfV0ZZAdRn3zlSt/uvHgYFSKX/705sPhysrFy5tFv5cRJD0BBczN4vpGM0Pb2PuF436neA0XF/CxKQIBRKImVIFEMTozseBEUXiRyqIGBovwjw4Obmzd+d1nN+7uHZQGHySW+5qwnPdevnjxzWtXX11dO9fHgCa1epQ+qInSe5HMRAyoIQrQzXdYk0Zvxppt344XtZ1s6LT537TdmvVL79SGBOrcnmf2IPLU1f/UW9Aa13Mu3nftc12wzp0zQApUEGVRNPT4kWTxMQAh1EA1UNohS1kYUiRTPa2CeRc8DKi5kg3WVvpY7v3y3uEnn3xSqlDcWNOtvb1H+8rsgx+8du21Cys9gYQAMZhR3LwJaGEFyML1WFgi9m1vBR3r69ChwwtP+k4dUtpqTBq/rIfpmdm4Fa2fIESMonQJISIkBIUzOINTyMxOAZC/g+I6z/qYT3w6Gz3p8G0uIIXq3G3LCJNGSN0AsUbWzzBXY1dC5Ww521b9z6DHc08GgsIFgiTNnKepWYLMDeDadjQgQRPNXFXrtEqQ4KhZlq0M+v3MFUG9RUSFEeJAscQTJQGeeDbzkv1c3kEVZgoIpPW2OyU9fyo4dQqvbTBphErj32yzeNUEYDPV1UTKlFYx46sEvfx7bXKEb1WcmlflyDyJc8m5SgJ0fcleuVCM9+XGxKZ1X13+h8/uoEj//b/72UbhS0aXBJEOvn2ZGVSs1pqOGfwLRfwIx6f9PedzZi0RMiqRCO9Jq80SzdM5wAlY0xt80dsFtuvq//z81n++dSfRZ0VPDg+dpo2VlVevXnrl0uXN5aWVfj7ENI/i4LyjWACMDAxCumY5Bj6ZZKFr7rjFtknyaWvQHfOnhVrfaSInfMrq5V+5Nk+MWTzR8292UnTsKYPiTx4l0rxW54Sg0QhHukYCtDHa8CEQ0j5cBhqWHN9cHlzo5Q8u9P7L+599cuduSdZZPk76y1t3b+4e/PN77/7o6lpPWEbri2ld13Ga5wGWUqx8cABNYRSToAu1ULH5htT1Rnesr0OHDt/aEX7KnU/OoijPKI5rNCdUW5zSGb0iKLyhtlbWZVbk4zd/UY//L0/5de5Z5NAv8n1wsvA3p0k8+VUKxM5IWWvSZCokKTyOy6gaY0zNaNCc9QkdKXwi+9CMETnnibqsqsl0WkcNXvI8FEVAqkSVorO41KuRT10+Bm3m0doxn3bciiLi7fQddLr4MWs0I099RyP2NKORXIw3eZI78tn668JUmsFbAhAVl0yYMfSQoRpKPB/d5OKgLHHjARPD/uTw1qPtX/7pT//043fPeWeEiGvyAVBYatSDzcHpcXnphTkv/oJ/YztJ5zkrsZEwTSmW07wYGngwGf+v//HXf9o9GA2XMJn6g8Or51YvrZ+7en790vrKxvJwpcgGmfQ49eYdMqED/WLVnZw3TpyxD5/ugv5zbI1n5+n+3Ha9KK77FEL8lb985gM37x3PmqM7S02UT/xZyOMjvnEGXfhRaY+l84aCOhj2l3/45pXN9d989vn9gxF8XsPuHB7937//Y1W9/rNXL+aCOC6XepnC2oF2U8yaTzFr+9TF064ToOpYX4cOHZ698Pe5YiLHgQRPaHjO2lhOfPwt8KzulHu2lw8J51qaR7OFjlxBBERm1bnZSKYS6US8NjdebE0VFLCUNKWkpo4WgjseeDIFhJJM1cwUjbnZsXhsGevJNFZVmk4PYz1pmtRCQAgUMTrAz3QmpGV2Cdo2FbdczMxAmnPSzOiSx4Q2qSaNRhFSRI4ZqunJel/L+mCLGQojTOxY0MnA1IgYNYr91viV8S+4ef+Ot8him27DgH0IRYFohIgNe5cvrpcY7E13727v9Hp+f2fy219/utlf/cX3X1EikZ4Gpsb3HQbAs9WLfGHPiT/7fWLOqynMMhEDkmlUMzor3HbSo1j+b//yq09u3pHlpc1+/+jw8OULG+9cufzGKy+vLw+9VqzL4DRzPnhp5IyO9Zbtq6y2r3qi8e99ab7iD/FrelL8So9tJtDCSRC3XISNXr5cLP32s89vbm8d1aXv5Tce3y+nR8798N0rl4Z5VovMMiGk86BZigbQLWjALaaXOnSsr0OHDh06dPiWQlfqCT1+WZjfApEaP8i2XEDSEqALxszHifNZzRkwOKGIgzpSpc1KQNWSJdWkZhTH4OajLzobe6kck7OaaRrLhAgX4MznXvKsFlSEgzVkLxoijYCXhgJipjlhTZtpWZYCExEnTZNX03rJdhKQ0vh6tdoQx7KEMyWL+TVhmoWNx0UDAZq+1+bF2yz/8rxoWzbu7SYMweXRq2rKsuGgd/G8f2VS7Y8fQXycYLfU3/3m7rX1qy9vZmImjOIrkHCB5iQJOz2dL02pGKDiVOHMxGCmmpLRJ+dLh7uT8f/+L7+6ubVbDPpJtUjppc31f/Pu2xeXhmvLg8LRKqIyT/VevG/SFDMe0UqPwUl3pb9O1HVdZDmA0Ug3cv9fXVnbHOa//Pjz9+/dmqTS9cNWNfo/fvWr0fjdn731muNMQDtZ5h2QINSY3ElVm06oumN9HTp06NChw7cemTY2zViYrWHbxEhtYks9WVCQmWnXjPihFXNXnQl8NPzRgRKNVVQTihM4mkGdqUFJY1soa8SIEswMknkwTEeHR0mnRAmo91WWl8HFIpTByLaLSik1kAAjCTZSsI0ptSNIR4aWkhEKmqklc4C3WXWyqQ1aMihIOt9SPjTivs1r1zQrqLcTexRCaKTRbCaGf0x9nw/rcpJCJECEwXtVTSllXvqFXb2cj6Yrn32+7TFIpb97p/z/fnmz929ev7QGpQGVwEjSxEGYOgneL4OSEYA4Z4lqUHMm0fup8bOD6b//7QcfPN71edaj2HS0Gqf/43/7zxeWho6Eglr7LGSFz4hAOGnyJ2RXN/pGCYkPlhJKHSSRxIFnsT4Y/PC11c2l//D+H45SnQ8Gdx5v/1+/+R0l+4e3XloBnMEgLiVxhDiH+cD9LI/U7pWNME3n9NCxvg4dOnTo0OHvH/2f+uykRqexUVHXuawfIQIKTvkyCghSaDBpqxBCKBkplbOGmyUyAbUhGlLzBtRmdUpljDElTRbHk/He6PH20f3D8dTnFXxtcu9w9OtPbn2W29BrQDIAPkgoGLLQz3qDnIQXF5xkznuRQDi4RrfBN22IgAPpkBlg8Fic/Gk1LIy0lvXZTH/WEi0iGUwgzYO0YVxDW+0JqVB55v/Ic4La9qVJlgXnhIDGqlRbs/jmKxt7W+OtLcvc0tF+/OOf7pzfGC7/9JLvUdRMq+C80Ik4dIzvy5Mqhgh6ghBYoggoFeXBZPr//P7Djx/tlVlfgQF0rZf/T//0j6+sr2izkFRhThIcNdCciCzOzRFEm/7oOMTXmw4REY0xAAyOyay0QSbXhj1//fIU5X/64E9H06NsOHy0P/6PH3zcHwx+8tI5B4iTsq4dKSC8n2t2tiOJ1t0mHevr0KFDhw4dvt2odFapos3l0+1YVHNWXGjUPQ1icAqnxzZZrchLw+vmXmYJUEMEpopx4qTGaFIfHh3tHx0djI7G07JKMcIUiGZRY51SjMmSsoppXI7Gcb9M09Cr4ZLq7b3R5NObfbFeUN+wPhck6zNkESnplIQT5x29+CDiSGdwYJHnS73e8nC4vLQ0HBT9zA08Bg6BEKIZkpImhrZZU2v7YpuLo434LaGEAKQ5GqFCO0M748tdX75VyndCR4KzEUhpWl4dnYNpMCvUl/ASxL15/XI92a2qbFJWhw6/+cON1XPu9etLa0VmjFTNBOiqTl/l6ifQAUaFQWSsvL1/+Ns7jz68fX8suQtFJrrq4//8i59/b33VxaqEiPdeaCZmEY0aEplnGWzBo7KjEd8MTa/rqvBBAhAVSeF8gPlpvFCEX1y7ljT++qPP1Fy2tPxoUv6HP320UvzglfXhkKD4aClQ2PS0N2pHCxttd7d0rK9Dhw4dOnT41ihfoiYoACHETBpHqxmloVkjVC+EEgppGkKbRs5mvC8CCtRABUwUo6rePxxt7+/v7O3uH40nNSKyqE4VMcaqrqtY1ymp6XyesDWBVoNaZpqmcefgsDQXJUsiEnwiD8uUAmqSoKopE6rSJBqNomYN0wStbCWMzGDmRIJzwfsQgnfu/2fvTbskuY4ssWtm77l7LBmRkXtlVhVqQQHgAjYJ9fSwe6ZHR0fbB50jHf1QfdIH6YuWo6Za3cMVAAkCqH3NfYmMjMXd3zPTB4+IzKyFJDgAAU75PUBWLpFL+HP3sPvs2r1OzKFIJLSbabfTWe52ljqdTrPRSlxKlABzmSifWyGxgAnKYDawMhlV6Q3zCb4q7sJgM+loNfV3uTL/1us9ep1j6jzO2sDMaZL0fFNkUo5H168slZPWrz5+nnjPLM92Dn/xsbUXPmheXUzmk2UWNJqIry+lN11gbEgANoqwADJy/Vh+ubv7yYPHkZMYYHm+cXX1v/vJ9XeWupkF05JdEmIwVWY4x8QeU8cuqmxozWYhlXUEwDcAL0zTe1uEELnIjKYRDJtp+h9u3mpK659/8+koD0mz83D/4OMvHjR/cCdbzLyENPTbAAAgAElEQVQTA8GiRYVFcvP8wFlrfUr86u5szfpq1KhRo0aNb7oKNYsxVsxERKLFiRYFSifOgbiiNwaBYzAUYFAEIkAQByYoKAARiIQADEscDvK90/728dHO6fFQ4zjGcQiTGMdlkZdBzKfUpKlU1GCmZlWMH1WzdqpV7SoEIaZQaplnnihqQKlkzM6zJDABk5I4ck7MOJiGqAQwk01jGarmnYAoQoMqTNmMolJRAqakORUFTfyQs5Ojpksb4hpAAiym2eby6nq3t95tL2QuIaQExyQKVidkbDNJqFGMpsGq6C8SUqlEsBqhBCTwYapxZa5GecwI4G9B/UnTvt7L7KCyPAVVzM8gTIkTR77UpCHpYps8Z8WV9Phk9GynPy5ztXj3wXZvqd3tdFY6TbaAWAqFGFUqplzjNUcfMPgAc5gYhkSl6oOzk3/94vODgaq1eFK+d3XrH39488ZSi6ICgcWoSlZkIjYCmBlzvjCbFasy7GrO9/WvFyDMMDMxksrkKZDBEbcgLpJPs+SdzXIY/vm3vz8+HSy1WnefbWdMV/7hQ612sCx6IuJKQzBbqQs5EjVq1lejRo0aNWp8g4gxzrVh5yIxmBASohDysarnJJEUxEHZyqrPBwKMwYxoyEuUhmG0nf2z57s7B/2TYV5OgJysX4yPx8OSSb2oExUuxUclLpXCkI0YRNV8HRERiVWxxRBXteN8mngv4jk660bTYKwk7BPnk8T7LPVp4oWJmdQsRC3KUIQQilgWZShjXhaTSZ6XeR6KGJWZvBcDQKQMVVW1EhZSClmzIBsrBpNcdOKi+WiZDR7u9lvOt51rO99pNtd6vbWl3nqnsdxmB9KIGEBAInAe5IirJDZoURbRChJ4EUJl008AosWKOJ9L8l7b8fumU7z+mMlm9XVhwNibz1yz5Tk6LC7Q9a1WXp7tHAyHZTnJ6cv7++3m43/3b+4kqY8W8vGg1WqdOxXWeAORsADzGKieFeFXj5/uDSeF+cRwdW31Jzeuv7vUagOJgDELYKV5EuUFO9nKRpYuzIgZqCYSX/+SmZHFqWDbGOYMZJAYsxKJcz7xP7p67ejk7LO9XbXYH0/uv9h+cHjj3aV2ruYq0mhGmId9mkFnWniqY/tq1lejRo0aNWp846j6BnPWJyAtA2uZem/CgGig3AAh+GlDrwTGEcNxPOqf7R0e7x6fHI3Gk1IneV6URRmjEhQgJ95nFmOYKFEQppSFiAWactFMfLvZWui0u+2FhWa7laYJS5X15kBeyDtOiB1BNZahVI3RYMYk5wJNL8LTogzRLJgGNYrGMFUrVUOMQTWYRrMAKhTjohyOR/3hWf/0dHB2NszLs0ijsQUAWvXfwCREVJKdhnAWwr7BgeT01B8cJE4aiL3EXb9y5drm5nK32RQkBAdChCg8wTEydmaganKrcnipQpthZqYwIfruafHm9qPzwT9jgNhnvl16CklhC3ZtM8tDa5ifTk4ic3N7+/RjeraxsvzR95YMrDCucwP+yGGengQxpYnS7/b3f/v02QTkRFqGv7m19eHVdo+RKLxAjUDELzP1qUfQrLlHF/tGNeP7eheLZk3UWKXWzLrYzkBqHMClNZneXUyGH9wZU7z35Kkw7Q1Gn3z58PpPPyRDRlWiZzwnkbNVnCpy6zWrWV+NGjVq1KjxzaGieS9lq5GRowQQLmFgcy4wV978Y6Bf6F5/vH10tNfv98/GZ+PJ2WQyLosAQ+XeKFZ5dooRFaXFmAId5zvN1vLi0nKv1+00W01rOHNMzrnEOeecd84zJwQ/dcWcGqiwgWEwNahqZempZmYM4gg2ZiUW4XksOJuBQEIMQGeWhgoooVSdGIJZGWM1T1jGGKJODEPF2cROT/Pj05Pj0/5geDbKC2OQ95OyKGKAsDgvCFbCaWzkuD8cJg8fNrxb7S7evLJ5c2N1tcFJ5bOolJIwGFEtFBGFpgkcE3ja4DOLMRLIyXdonufV6pMq3S0k8dJIYaosgcVNymb/rJXHOCxQ5LazN/jVbx6tL3fXukmzuRhVq0nQOrbvjUxCo3oZRcqL8OnDp6eTaMYtJ1ud1vubSxtNTqKJGWCFGRGlzHNvWMOsNXS+YLVU8Bu+NGatOK2CYYAIctO7KCNCSnQyem+l+fyo9/z5MyCJal8+efrwzvV3lroBFgFHXPH96QpWqaBUT2LWrK9GjRo1atT4SxE/VVVVAMxMBoYHeZiBEImHRgeTuDsaPj0+fnZ0fDiaHA4Hp+NRHsqq8UYJYAorKJoHtRrJUruz2u5sdBfXOq0mU9NxS1zDJ5nzXhx5mCjIGCTgyvqEYAITKMHIDApU7wBVpWQaTedhfkTGVfKCwWARBpgC0VSZmMXPQ+MNqKxdFFhgUWJzzlIXkSrMtPpRVAbL13RYLJ+V5VkZhiH283zn5GR/0D88GwxDXlIoCKVFmI6Z2YKL4tTtHxw+Ohn8/O6D1Wbj1sbGjZXeVjclIymMI7GkkGhG0SIsMkiYCVWs3yvTdfbdKN6tmvEznmZXEIGzLDFLDUW0uNRxVzcXxwH3n52K98Nxfv/xi5/9C/23//7DZi8JGt088aMmfq/lEBzNuUnESRn39s+YGkDMWH5w++pm1zdJSUt2bMSAvyTgnOk9L1L1y2dPTQC/uS0RY9AsiqV6V+GcESxEB+k63FpefHFl7bNnh8125+B49+PP793493+rgBEU4AvsEbPu7dwfuGZ9NWrUqFGjRo1vssK3aXVewQwloEQqOCtt+2D88GD/8eHx7mh0MDzr55MoDGFzQkwM88Jkpee4tNBeWVxa7XSXFhaWskbX+473Te+bhJTgFRJAEVC1YMZUqdwIEaYVsWOY8GxsqWptTGcOyZQYbuZ+LmAiYrCAxIgBspkZCcxMg4WSmVE5KBBzRW4NFgqrpHEz0RwROIKigckSiVmjRKMg5IaxxkGxfBbCSVke5fnBoL93dHRwdDScTCIhaCzVolAR7Xg8siI+Fv/o4KTjeKvbfm/jyq2N1aWmkJqaJEIMKDRAofDs5nq97+hAj9nF/pEZeSeWuBCoKGMr443VTq7+aFAenUZVGQzHv//y8bX15eYPr3UazszqXt+bjizYLKGCYoh6/8m+RkdBU5FeI7tzbb0pyjpmisSJklTnetXhszewkerH1sf6GyZ9EMAwvXFUnI/UIAQ2DWoqKePG4sLZndu/erTtRHLCg+cvJkATKExFy0RSvOK7U0lG6+WrWV+NGjVq1KjxjVUys6J8TvlijOMy9on3S72/e/Doxe7u6Vm/yAdFeVYU5FySNWNecNDMuYWk0W02e63mZq+9tdTuZL6dJqn3iXOOmGHOzFNl5qgGVVEWYhBPd7enPoRTAlaVQVSxhSoYvXI+IKucRA1kybQNhari4qjTNoiBhITZmMygBsVMvqoGU6gagYX9xTpuqkPkqdqq8klkwBkScJO512gooQRK1cnK0nhza1IU/bzcPh09PzjcOTg6HucTiyROFpoFybMyT8FPDsa/3NnupO76+ur7N965vthZDtZOHIPPK3f6dgv1P2AjU/UgL5wiNI2scMJZkqjGCO006cpadjpG+XAXUpbjcpSHX378eW+h9f7N5aaHkM03FOprDRfImUEL1hF0XMTHj7c5eg6h6eT21tZiwrChYUJCiCAWIR8jcC7wfE3EG19avuqLdRLA1w+xqXeqwQhsMHVGomoWGZV4YSl17631FhcXz8rSWCYhPnqx09lcFxgTX5Dmni9VfXnUrK9GjRo1atR4Q+H4Sv3+xgfRS7W8XfheZswZEowQDcPCDs7yX21v/2p756QI46IIqkZizqVOEFXyouPcRnfxnbX1raXOcsstJNJLfNt7Z9O+ISmBjMhgShZZGFAwzLREIIOzxJnMTUPmPSWbsr6KDZnBFGYgM55yBwIbnxMWAoGqqHgzqqwSiKGmwQIBwsxVqhlXZTMxMRRmM6vDqmQmM4lmWvFDAhyJI1TBEjQtqlk5RZZaEzlpfyUeb633J/nhuHx2OHi4u7N9cjxW4ywZWmmqZuGgCDv7+18OzraayfeXlm6tr64tLmYsbhp7QUTVO7O/4g8s89dcGNIbTqXXP5BAZohqAKU+I+LSJkkZ26lc3+wd9QeD020RGo6Kx88Of/O7xysri+kSAyTTXu3sd5Fd/n1M9g09wb+CSziA+sH6o3ySU5YkDQo/vH01hbEVzGKGGEggpOD4xhQM+hM+U+PruWZ0Lj6Aga0yYxIL1V3VCQDE6AhdL+9tXfv1w8fGxI3Glw+f3rmy3oAkxISpeP3Clk/d56tZX40aNWrUqPGGelGnHiXzqoGnpgBml13+phnAqmYAhEoL0ZRYGExmDqSRywh1GJS4v93//ZMXLwanu8X4oBwrg6KyqrfYENdO/Nba6o319V4rWWln3TTNnM8EKcMzxF5lKYRZE4/AlTGIQarQB7zWq/xlO5FZsnlVYBnOy67ZG77sgDdrTJGDm22pU2WWSXPXPH4doSIhCM/mp+jiHz9jmNOYeoIYi+Ou93Ghlav1V3vH11ePJ8WL4+N7z5738+I0hBykkHFpo3J80B8/3B2tPTm6vbb+/tbajaVWx0OICJU9aUHEqfeiMFWeWtHYVE12bvP3B3cA+M8rHF8yb6nktfNjRBc3DwhE7MHkmVuKEAtAy1Lfv7pkxfjx88NhEThrffZon7NP/4f/+ocp4mKWIgLRwKpQDTk3vFZ7ACAxlpmpIeQtKn3JyIMl8v7Z6CTE0nuHfKPb2GwlTZSOk5I8ICZMYI6vadvRGzlebeH5zaDSjxMZoETzuwIqoQARiMwMTAB5wt/fvvrl519O0qRfhi+f7//3IAei3NibUTBWGMjYIPaqP2vN+mrUqFGjRo0aF4sQm+8ST/mM4RXKV7XKmJCXRZEHSRISKmMAxLOPoFJwPCkfPj66+3zvyfHwJMTCu3FEjMpRU6JOkq4vdN5ZXb2+0l1tNTpZYyGhhiMxQJWpSiCo5lxeLUfnAQDnfO2cgL1asdJrKtuXSd2rfI1eZY50Ll59HcF5pcQigrxioU5v+vMYllY+LEQtoU4jWc+S3PDecvfDjdUXZ6MH23vPjk+OR5Nx0FxR+myYtO6f5nuDJ493D28ud2+u9d5Z6y1kYkbOJTDLQ+QQE3YgRI1VIMU5O/1Ghv/ojZ+fHwii83AAoiqfQgiJ981ENRYxZeo1xxtLw8E45KMi4ngU7j7Z//Tu9g9vb+YBDVaL0SxqmXPmMe2z4rx7pW9XnDsZYExGFnE6KnKi4IgsLneyBiyFAT4gKYmJwQa50Nf+g0tY04a/DGGH0kw+PssXrW7C1a02AmLYaKaNWJaSTjSeFFoAbGAlUkBAUABkYmAF1ROZNeurUaNGjRo1/mjNTuel5LT4uNB0q2bkYKbqiIRdGJdwrpmmE6OR8XFePjw4+eLZ88e7h6eToohWRo1jhcXFzK0v9bbW1q8ud9fbjeUs7aY+IxLAUzWdpqAIMiOmKSHiP5Vd0J/+BP/Id9FXYTNv/hp9lb/DACUozb1liAScEJpZspgl64udmyu9g0nxoj96vnf44uDwaDjM8zE7GZjdPTp9fLz9+UHn/f7W7Y3Vq71uL4ELqqU6dk5EY9BQiGQzSjQ/sPQXOq1e5dZVjvR0vI/J2DlJU1flYUB0Y3VpOIplubd3PC6L/Lgffv7ru51mu3m95wER1WIEKEuixkRSyXkrTwvit224aTqGmpdhOBxNybS4pe6iGBjQWZ/ZLm3ySE3vvk3Y7A5HeCkakeZbb4TK7paAJAFVxsRMZpoXCIxMXl2+ejFr1lejRo0aNWr8CYyIQGRzK3d7fbsPAEOMiZmTtIyIJQdH9/b6v7j/+N7BwUExUkfcpHI0sjJfTLMb6+s31jdWFxfXugu9zDeEU4IzMCBmpJULp4KNySLI4OTPlRj+9ZV/gMEixdkePTHYEQm4iEpBF5xrLTRX283riwtHK72DweaTvd0vnzwelOOhaukk+uRZPt6/e+/LZ9t/c/X6++vL15dazUTErAyRGJL415WF9i2Pcc1aqwRiFudcConQPITeQuv6Jk8mOp5sn03yydg9fnr0q08fLndb6ZIDx2B5mqUWSnKe7IIslxUWZiXf29PyI4PlIY4nk0oa6Nh1FhYJlcWRXSIXNS/4Dt1xcYHv2Tnlm4kaKtMjJTAjiiiBQKqxDAjydsmYa9ZXo0aNGjVqfF01yFRiRNOwuwtzfGQv1SplGQEkzgOibNv98a8f73y2u/9sPDqxUCa+CCPOJ8sNf/v61u31jVu9lc1WJxPxLA5ghQOEjaex55FIwaYzy82Z4PQtOvoGM0QyI6vyu5jACdgJmSGUMSFqiix1Gu+003d7jfc2Ok+Pj+7v7z89OesXkxElKaX56WTw2b3t3eMfXt+8s7W83GYQRVWOoeWFz4fqFHP6/m1QPpsF+PG55ys7cYBFVUdlw/PqUmeSh8Hg7OmLg0kZx9T8/b3dlV6r/W9utV3ZaqZE1Q4BE0imP8VAEVQAPPvcW7BrQDAgGgIsWCQYGYTYSQICVAg6z4Wz+eVcs4XvCOmbhcoQjGHz8b7Z2yqTjxSIXE38VXGhF8giZgOCtYNnzfpq1KhRo0aNP4XyVQUhXRztg13McLbZQ8wlhdrIMCzD/ef7Hz94+vDo7CiEkaOYMELZ9cnVjeXvb125s7KylmZtopYhIwhNjT8JSmUAGVxVx0yJpsKiKUBC/u1bAuYqV6KKUrMoZgIGmQMZEYBoFtQaqV9aX721vPzu+pXf7u5/9mxn73SioODcURHGe/vb/eOHBys/uL11da2XCYQpJRLAYHNbFVhF/77NhpjZefa6MBORERpJoQon7srSwul6bzg43etrQHY4yH/56d1uh/72+xsNdjEGL57mqXPTszaC4uvCCP4zP3uUAGGfOLJIYI06HheGdjXxyADPG/c1K/jO3HEv0HZjA5nNXGkZRDM9thpkAgQiI1A0ByQMyGx/ji5EN+DivzXrq1GjRo0aNWpcKkAuDO6df3ghi2DqlgkjKFgJE6EB48XJ4LcPnnz2dHv3bFSQUJqKWRb1+urah9fXb612ulmaCbXMGkw+mmjkGGAGollcmFHU2UyWKiyavZ1VKVUHhcDTvAnDbIgSiGKAkREzs2M2WMPQYOku9jbbCz/a2Lx7MPj4/tNnRyeWpXniX4Ri9+mjL493v3/z2o9uXL/azgqgotE66+jy1FBTUXmifgun3Tn5IwKYGOyBdjMjCqPcOk13dX1xPBoGGm0PESDbh/2ff/zFxuqCLTUWmw0iB33ZMafauHirTiIFlEg8t5sZLBBcjPGkP1AsTT2CzJhmwZRc877vBC4156YiC70QtE4gUyACETIEyun1Gj1ZI4UjRJ2Kd92UOdKFucAaNeurUaNGjRo1Xl+D2+VS5FIZrUQ6fYsSODX6Yv/4Xz+7d293e0QWGmJmCfKt3tIPtq69t9K7sdhYEBGYkEGDRHXMpDMmSVM16cw2lKb73TAhMITettdrrQxOqkgIJqs6oqiy6MEMEjCRGWmcNsiIxThTbotb7WVXFtpXlzufPN/55f0H/XxoTFnmislkdP/ZYGz/xfWND9YX5x6t1RicmRFV4YLf1mbD7IybOnqyqZnGZiM1o6KYJE5XF5vF5sogHL8YnYKlNN7ZP/v5b+4u/P2P240klJq5aYSfodLBVcXe21X5Vq6oXqiRebIgFi1yfzAMQAD5aUMoVm0hI659/b8z9915/9XIKnmnXfQ7qjrX0TAxhOq2qcHDMgbDymjscMno2KA4F3DXrK9GjRo1atSo8Zq6EZcy2Kc9tzKqEpHzhSGqGfPhaPLLxzu/ePji+ekgJ1HWshguNrO/uXXzJ1vXb7Tay+JaAIcqN5wMrmJ4xkrzEhUG5rnSiVCRvep9BpjeGisOmk7xXWDC5wfFpqx4GjBoIINa5dQvBjMShSM451or3dV2tt5rfvL82ePd/UlZxigHeVk+2D47PM5vX/nRnRsxKsXYTDwDRnAgNZMp7+S/5HO+YCwyN7AgIhNmEGWJ77bJT0qYLveaNyAn5h6/2C8ncTDCF3cPVjo7yY9uL3el0EiWJ17MNAYlFpHkrQuqNosKz7yQpc5CjCVL48X+YQkEgkV4BlmMWpAkpkkIIUmS+q73bV3wdvmeS+cDepULLcygIZj3ZjTWPLI8eHGsJLGYNImWWg0HaETiocBU6KlVr8/mhlw1sa9ZX40aNWrUqPE65gHAzGZDJlUNooAyl4bRJFdiSfzO0cknD55+/HT/6ShG5xFjRvjg2rUP37l6Z2X5SpYtEqdqEmaGlAYiNrYIrezjqapMcJ6AN58cnM5oTT3N6W0pW4zOnzsusz66MFFJsPmxU+JYESUARmYpjAFOnb+yurXY/WLl4Pf3n+0fDZWSPMjT/X4YHI3G45/88H0RV4BIFRobTqQ63uczfvQXO91mH9B06MxAxCwwI+c4S52qliW1M15ZTK+XC8Px6eHeKAQ6PNGPP3vW6XQ/+nA95aChIIUQExEgITAM3n+FJ2L2xnYn/TV0xRjwjAS01HAZW8FUhPLM3MPt8Q+uNBzBNBBHMq2G+6we/PqO3XrPVfVFwWkGshhtGmVDSWH2xb0nxOKUuCzv3LrVgEGVHcdKC3rpDmq1XU/N+mrUqFGjRo0/oQYxzCgfRSIlCiAlDqBnR/1fffblvee7R0GCOm/ayxp3Nnof3b767upi21GC4GFEBBEzoaluExEUaepHQtPu1tSf5FyKZ3hjevrbcNxfKcSnHHDKwqe7+VPrBgILqOJoZEAgih7WATVErnQWriWNa9T+5OHOk4P+uLQI3huc/fMnn49j+PuffBgMzjgllBEkRGZyrvC1N+V3f61E93LRS+dnQUWyhEkd0pRD8CGGRQlbyCaTxTAcDU7LPNCTFycff/akt9y4c73FzgcbE0gkU5UYifntanYQkQcyoJu6KytLz45HuVou9NmjndtXbjYYMOMYEmFUgZhS18PfjQ2fucj9/HqowkpZmfJoKmzggzw8erbtGguIE6/2vRvvZAAj0rmYcy6SrxWeNeurUaNGjRo1/qQKBLMW3ZT1TaIVMBN5fnDyr7/78t6T5yUJRDJgpZl9dGProxvrV5q+kQcXovMAmTEFJgOzESmomlCjl03rKpc6rvel37wYc48GvcyVKtuHuRE/IToEZ/BGvjQN2mDf3VpeaTR+df/g7vb2JDpO2junx7+8+zhX/ugH7y+mzsBzs0u7xLlnn/3LrcqMZ07tPAE2ATvnstSrxehQIMaNheFJ91HeL0tfmD54vt/62PW631vrptAYtCQmImYmkbfoVKnU06LwgoZ3379z6+n/92vibBz12dHgRR/XuxCwaWRKYBSUwFRLAL/1C/yVWy8IhMSDCMTGXAJm6Bs+e/S0VMpYrIzrC92NTsfplOfZpWj36UCwAQapD3LN+mrUqFGjRo03U76ZvLPaMI4gJcrNnu2f/Munv//i2Y66NJhxLO6srn7v2taPttauttKs8iFQo6hwPPd9UYB53j58OZX43EGGpr6eb7HjuM58HRjzkcrLo2+zFqwZAOI43dQ3QBlgkMFYCUZsSKJ1vXtvvdVIfbstnzx6uD9Sv7h6NBn+4vf3gtlPf/QDY2050XMzT8yaBIxvnIm/ZBp07iNrOJ/9ZMcudRm8icVYxpa7cWVpMtHne8Og1B+PP/3iwfpq+29/8M5Ku2GQEMBQAn9VWSb9lZubkBmCOuIm0ztLi62GOxjGSHaUl588erHwvc31hJgRYhTyMRIUqMf6vv1lm5H2C5ebMccympMoUKAwe7x/9OnndxvNdj7Jm6Af3nkvBXsYyFQjmAF3LgkADKrTq/htp/U166tRo0aNGjXeWDzOx0uqkZIAiozj/vDT+4/uPt89iyDvROjmWvcf3rtxa2mxlyQUohlEHLRyIQAZmAVE81KEATebJbILKs6K+70k9/vPoxD/ijW7zvwnDTbfp6fLridVz08NiNO4BTCMYTxrqwIEFvIMEDOajreWUtfYkDb97Iunp6MJzJHFz+4/ctD/8qMP7bzX9yop/0Ypn866G4wLpW/1l2jlX0rExCLsvWM2Cm4yyq+udyeKg8HZaX/ondOz8KtP7i8tLDTfXW8nwtXcmgVVlreq31ftueSThSzpZOn1a1s7nz8FoV/kd59tv7O+sLTRbLInGBk5mdKCGt8+5bt4J5y22zmaRgUEanY4iY9e7O0enUq3k4+GNzdWPry9lcEYalPWl7y0l6J1Xl/N+mrUqFGjRo0/WDfaPMJbZ2nsATg4G33x+NmT7b3ADqmLLrl2fevvbm98fzFrC4CyFIsRAiQsjgAFAS7C2IxVWRUgI9FZhUNms7dEdpEHXKiISN6ajeoqis8QZ1M5hGm7rTI1JZ6viemsK6jVgRNjViar/qPKnj+HkYDYSg2qxUor+dGNjTN2//TbxwYzhNPh4Mnz3d932j9+75abD9TNGr3TpSD5yx8HvdgErNSacM7MkbFPFtOCEre50dnsL57FSVGowm3vnn76u6cLSeO9G93ME1kECoCABK+I3N7k2vJnuLl8x3YlCADH6MnE0bu3bjw4Gu+d6FkRjs7Ku48erSart5dbYkQgYXCt7fzuckES55ShhlHEg+d7j1/ssG8URfQu+d6d7y0106ysuJ2JezVpBzXpq1lfjRo1anzNxdn8o+mE0bxFNKvc7FJy8qyUfFnWxfXx/C7wPb3g6kcGNlKmCAyifb53+It7D/f7Q3CSednY2PjxrWs3er7NISUN4ChkzAaORmSQWWoawYzUTIms8h+B8XTIb97asVmDkeg8qGqqcnyL9Enn4qxpd6/ifjoLbZi3YKfHlckERiAxI6WZxrN615RQmhKisGVEithy7ofXVwj4zW8f9I/2mmmyPxr9+sEjcfLjW+9IVR5Vv6Jamq9CaQxmMxY6o6xM9gTSvjwAACAASURBVLrLHS/NDgJQA1ehhDoPpafK6scIYAYLW4SRLbYa43HoNpPv3b5eRnrwaMcKC+Q+/+Jpr9le6XVXesQgFiFweN295eK9yy59/o3Pl/8Azbr8ALr8IdtFGbMB8eLs4mxzo/qQX/6h54rrl/8ces2pYyAlMRYRjS2mW53Ohzdv/uzje2MLgxA+ffJwcaHsLb27ZAlK9QaR8x99eaDzlSdor3vONV65BF4Jv3nTWTO9v01trqZD1MqkApBFaGRJmBBg+4Pis0dP7+0dZgs9jMYb7caH73QJEEZ1c2UWfsUaiWvaV7O+GjVq1PizUYXFGkACIiExozJoBMDMAmIztUgaYMEoKEclM6hG42q/HlqFxxLirMygaZiyvbW2jd8hRI3RzAvHMlAwoYQ8jZk+3T/4f59vP43GLlso9NZC499eW7vRSxcZGURAAo5EIOYqzd0uVL5ERMxzf0aimZxvPqV2scAlusz63rJLjAnu4nOn2Z4IvbxFUj1GZO58cu7mCWIwUUJwxgAxGZHAsMSSOV7aWl0Nxf/1i+PdydlZKzsdj8aPn7R7Sx/0FnwZY1GK56A5ZZ7Ajv7UyESDBcQSwQCGCFjMxIQudu7mkWRkxmYaYyiZiZwYWYCWMK2OA3GlXBUoV/HiDPOO0TDRdihCMGtm+dpWOC73d4+98GRSfvzZ/UYr/bu/vdVucig8HKlQtFmG2ezARbVxWRZFUZalmgKsFssyFpM4HuurvUFmbjYb3nvnpgWkiCSJJAkkgdDUQlUMjpECAnC1PIABgpluFwrLgXK6jiQwwBharWT1q+kigzSKiohZXKOamaqCvEg1iVkFfpwPZLoCUBe5R77J/NHK4lGv88nZ4zxzOxT/n+cvwkL776+/u8zGI3MJzQmwUfW8Laoqop8pY9lAVrH3S7doew1XtGmu+MVTmt6eXr0ZVGf7CQzQ/E740iOJjCpRhYQxXAJ1FMgilBASmIdZDOxEwP1B/Kef/+az/YPTdrd0uNGM//i9zasZpWYlIgsR+xDNC0+XZnbyJRDU+6k166tRo0aNPxuVE3qMGq0MWuZlEVR1lhBUvcjNct6s2rGEwowMZDbfkI5MytM6iGabkjXb+w6wDhIiVUxDz8jYlA7H+Rd7J/dOz3LxiwldXWh9tLX5fqe1SCoKJ0Lg2WDWLJMBFytnApgI51+62P59zRjZpSGXt+e0mBG8S5cDXTpc9NIhOZ+FpKr9Qxc/mpm/zzdU0AzqQ9EUj5W1k/fe/acHd/ue+xoxLr7cO9psLTQMiEQJCXOcRTX+6RJPm/rKQGFc8ayLI4PnVa9NG4MMcWKwUiNIwVXpWsVFxhkxovPdA2FAmCyLadM0Mq10sb6ycjacnPTPfOr7pC8m+fMCLbHRKJTQ47PTUZGPxuPxZJIXeV4URVmamThfxjKEaARmhlkZYoiIOs92t4v7EszinIg4M1U1Ingv4iJz6RhexIvLnG8lSTtN22nSW+g2E99Ks9QhmZ3NAiREQkJgIqnumjAiBkgqvjA16pkSKFMEYgNBDTFGI3j2M6d+FeNpV7SSBXNUlA7MoCxQ4uhW6v/m6vooDL8YHo6Zn+Xh5093Mln4u42N9cbMqamSDlfaYgExwShe2Le5tMCv7gXWN+/L3G9+idofuIPNXiSdAxFMrUSMEh2shEWKzvsIOivtf//ZPz8fjIeKgpMF1o9ub/54q9eCAVrE0rmUzZOZgGa2t9Pbquj0FlCvTs36atSoUePPYwXVQBYx2LHz3jO7aFAlGJMJwYM8kQc8yAFMTGwgquSfRJBpWUgR58GyejGwrca3tbxMHGOIgBPHQCx5EvHi4Pjp9u54UlDkhaT53jtXfnjzSq/paFbZ06vFDb3mxHnDly594S0/A+gV+eNrj9Irj3/NN9HrQg/NlDRmzi8vpB/eub6n8RePH4jnSV7cf/783cXu0nLHe08EFq9fsZ4nI29z7xRiY8J5MuMsddBAaqSV30SERo5mBoUn541MyaKqmoiHgUDEIEY17xgMJigZaoiw4ECRF65tLJDuPH48YtuLg+MnX9wNByRBoyVpczzSIsSiKGMM4Koirnpjk6kTDs3UdaBA0dzY2F5ifWaqAaxExARTg5liTA4mqjzd41IhSsRlPkmdyxLvmT2zY0qdX2i3et3u8kJzvddMqk4oqNI5JETOYCDPVZ+mstyPPFVZg+AwC7GPMGUjsEFn1j5zxaoBCMRg58RRJIroeHn/ynKR8N7HgyIfwPv9g9N/6X8mo/DTm9d6Dhwgs+HN6vCDlAiznw9UMt2L3drLdM/+MC18uzgfcaVLp/P2sl3o3U/lvkaz3qlWa+vNGGSWECFAxwCYD6P9r//H/709GPVzS4Kt5PGD1eW/fe/dlSxhQ2mRpi1YInrlBmtUv5rWrK9GjRo1/pMQIwCQkBATTLywI0w3pxlwgCMkQAJygJgyE5hJI1QhTEzVlmT1Ohhn439aG0x/F8AAKVQtejKiINg/G957ut0/6WciCfHV3uLNjdVOKyGOESrM9Ub/XxWtZ/ZCjEx4zTU+uLL8YOfFiQYN5c7R0cPd/Zu9btcTmwk7soCvMtlHIFLmyOeks7JvZSjNG/1a5QqiGkw0jRqdOMfiULUX2YzFQJE1IhLBQQWREAwTQ24Y5GH36PTp7tGLw/5+/2zvdHg4HJ7RRJIkAiVNRqcHasExtaNRyDRKBJTdLMaPVLUoSxZxzhGRqoJgUJMy0HDW6Lr83IRitcdBBIJGjSHGKJmk03B7swAUwDiCYhmH4ym9VGOiJPHNxmHmEpQhS9KFVrbYbi11OsudZq/lFzyahITgp6LQSAiOyJuIJogEMiIQC0NDiEUs0jQhutBInbGKSELkhBwIiHBCa23/ge/t9W//65efDUa5NJu7g5Offfp7U/7JO1vrCRgWyQAjNoZFC1Bz4qpe6+UYD3u58Vy9Z39ss+JtuLisErdLNaFZBWlGmk+QWtXHZ4ObRnCSIRY2ck4ECRsjijFK5sKwE/V/+T//6fnpQCQJWrRKvdFr/jd3bq+3GgyNFh0Ji5BRtGrIos7lq1lfjRo1anz9MCCGOClDkYdStSQoqv8hZJ7MEQQmpmQUoaYqpqwREDCD+WKebJxZt8fZlmhNIr6tqgWmJsZGFoFAVAieHB482N2JMWRMK1nrgytLV7oNVrCwkilpbcbzV3PdEkiIWKKaxdhw7lpv6cN3bv7H+1/khlEs7+/tvL+10ey1nZKqwcx91dgDm03sMiCVxZMpaZzO9lWGM1ZN8ZKBwI4cV5ZBpRlAwsQwQQRKQUGYMPpB906LnZPjg/7x0Uk/VxuO86PB2WCS52XM1cZUnuko0TJNvBMhUwdL2blYoiy9CVcuQgZVJYCIF1tJmiRJmogIGRGTE0kT6nZSfoX1hTL0T/uqGmM0MzOEUOZ5kU+0mFjVLCMmMwsWtYwKYxFVUxiIjXgU9Kw/MHhIE4OSj/OGG7TSw2ZCmWhb7Npqb7XTXO11l1ppChFiJmSgJjGiWYTGCCb2zgkxsxhAUJiSGp3LQpWcwkUwM8hAEalhzbt/uLUZ8/zje3dDYUiaO8Pxz+49zEl/enujK+bgyBQhsKkTFmLSaQDINE2AFcZTZe5LfHjmugS7nL/y9jFBwjnJI0YkhAu+QQw4mmUzTKeYVSQaCg2RNCGSUnA0oaeF/m+ffHp/UBQuS0ENprVG+j//3ffe6bWTaAGBiR0LCGpqqo4Z9Qtnzfpq1KhR42t+VWMFlCgwR/bqSNlFo2CVBcN8N1MRVSNK50h4agYoTJV2KUYwg6b6L74gHppvKtevX98aoxewMZWggnBqeDo4PRoPyae+jO9sLL63tryUMhcxlBoThZlRvcf8V7O6VpkDAkKSRGy1kx9uLD1+0X46OCmFn54cPzg42FpayLjqwTPTV78YZxpVmyoGNdIsSR5Ks3YHGcFITETFjGGAmDEFxiTasDRK+cVp/mh/78XJ8eE4H5RxHOOkyEfDMyJSQhFDQVpSDBYSZ+tLbQuFWEwjGgUy79uSdhrp8sZClqTNRqPRaKRJ4sUEIKNA4j17YSEiEBEcUcrcSpy8olNUtbzIoyGqAjBDCFqUWgRTsQAKSlExKWyUT84mk3E+OR4Mhvl4NJkEBbFUjcwClpsFi1bEooyjYuLJxIKnuHt6loo1PLVTv9Rpb6yubK6trjCPcu2mTAwWqWQSoiIQUzOOIIugCNOpmwgznBkZQI6IAIVENIi2Wtl/eP9GQvLre/dHGkuRJ4PT+PBeHg7vrK9cX9lsQBKCacklRHjK7qbWO6rERkpmohcPDlfUpeKHc+I3032+pbfxiteRVYbFF0dvX7nbEolQNIYTNR+B/dx+8+TkN9s7nz3fk25jcjYQxM2l3v/0kw82kmZbqlAdqTrOZmZRuZqjwFvMtmvWV6NGjRrfABQUoxZlPijimXEkYXIlqDAUQACpmUbEaCFaEW1sGiZxDJVG0vXSNBOLF8eMeGZPX+M7Uq9M7SXUkDOeHB89OekHxwTrpY3by93NVpIBCovVcFN9yP7KLmBEKAisFPKi08yuddq3169sn/VHwv2yeHLS75foevjpCC7hq7hBGMMcMNOvGSso8izHhQECsRFNXTlZVczIhAKhAIaGfhn3BsPHe/sPtp8NjUchjmKchDAJsSwDKRrEYiSMZpI0PUehkIfM+a21tYxlpbO4ttjrZkkz5YaId5ylLmFyzokIC1d9vGpYjqkKQDAzg1Uelk5MXleew5J0KmOcWuRM/YhNoEBUqCGoTUIcFaGIsbAyj3ESYh50UpSD4ehkcHZ4Nnl61Dd2JIgWLKhBjbmAPT84cyI+cYl3/mTst09S/2jRue9fv77ZXeg1my2hFqPB4JIswCWAVdoJNVCERphAvDFFgxk5ARtMmc2BaJxf7zbpvWshxN+9eJEXZW54Mjg9+XxnZ7z5Y3Y3llZX2DWMqTSUBscAwGYMYwsUY2UPyRd9KfUlojFTml4aZnv7ON/0X1HMzrE5g55eHbPUBi6iQLJc/Mh4Zxi+3D7+9aOnX2zvpAtty+NCqTeWuv/jv/3wem9xodRYls47T2IwMzVVBpiZ6iG+mvXVqFGjxjfwkmajcf/F7v29o2fitbeylDUW2Ad2AVSCAhCAwlAoxhHyfPvBwfEzz9mVtVtryzdT35l5Pc5eB41fb25d49tZX0I0VYuCQujx/sHO4BRpYpO42Vu61us1DVKCwcHFaOq4fj39q2J9phEqYNOQEtOoXEz81mKnmWSnFChNj/PyLGhwbEZc9eXlTy3dKweSeF72V8JNm2ZLgAEjE4ANUs1A5UwTQxQcjsv72wcP93cORqNBCKfFpD8ZKbFNsw3ARg3nUkVWUkLcTLOlpc7KUqfbzhoOmVArSUWpmzU6aZqAE4YjGCJo4kSFAITKmMVARMZank9czXc8LmgaLz21i6mDOp91NJCZmkFNFcxIRD2HLI0GCAUgGkqzELUoy6Isz4qwn5dKNCnj/tHRzu7+0elpHoKy4ySJQBE5N1ihxqVa7tiejkct77pJsrXQef/Kxq21blsARYOJQAZjIyauSIQ3SiJZADiaQREjAjO8+IbxeDS+0mn8u+/f8M3mLx48KIu8NDpW/uT57tEg/mDz2o82r77TbjiYVI2q2aoaTcM8QbA/Jdp9ZvPytpl0nWcuGsiqIIxzC1yb2RpFmk39GU+sAfCZ0ed7h//x3uMHO/vDwlw78VrYePzhta3/6sNb15YWUxg7YmK9cMoyT9cianT1XF/N+mrUqFHjz38Bu9zIUVXVEG3cPz3Y3nn0Yv8huzDIl5aWVxvNdrAzuJJiCMVI0Yh0NpocnvW3n2///vDkqZcGU2y329575oyqV8PzH88XPTzrbctvddUVADMxYxK0H+JQ4wTgGHvN5EqvmRJIjQjCJPVS/dVSexbyECspM9pcbF/d2Hi++6xU60+K7f3D25ur81Dxr7DEBINFqMIEKvPIsqkAUKJxMI5ERhQIOXBUxruHZw+2X7w4PDydFMOYj0OhsMrIEqF0sfSGjKSbNdd7y1vd3pX2QsrUaEirlTTSxCdOmNjMEZFCiByBFWwQgoGVEoJOk0XsokeqvfrXg8j4jfX8pUDz6b+BKJJFE4DIIETwxAIY2AFGVNkbwydAEs2uoTRQqTRc6wze2Tgrykm0YdDne8d7x/2Dk7NRqcFMCco8FjuZDG0SW+wenvZ/u7O93shuLa/eXF/bXFxoOaQgUqLSHOAd2MAlTcMNEUHBXACIGGkKYlamzW7zp+9tdRYbv37w5O72C2s0h2V8tHs6OLp3uHf20bs33tvotYgQkblKoMghFHDMBtWozFEVBmYhAKoMBvO8J3zu6klvl8eLEQwI1S6FqihEq8uNQQRVc2yw0mJgNpEAKoAA96yvnzx58LtnT58OTsZapiwNFF3nf/TBjZ++f/P6YtsCvIMSIlsyHYogYMa/bUrH33RV1qhZX40aNWp8NQaoqiGWIRZFGJdxFHSo5WRwVrpElfIynoEKtbFhQpKHOBgMdw4OTwbDnRBPmEPEUHFmGBkISC9vqFM9y/edQqUYKoMVygWohDW9tDNpOZZKoEvKREy1ictfHeGrAgOI2EhBTGLoZGl3oRN3EYxGRTw+OcOVVRBVjv1f5bI0gjKiaYApgZldFfkY1UojdRKECuAs2vP++NHuzpPTwYtxuXfan0wmxAaYqaWOUyYKtthsX+l21zqLS43mYpYttRvLSdbmxBOch8jUFkbNpr+aq24KE4OnjRayquSzy06Us1YWvUTjqKrd9aW0viqEbW7EP3trVvkPk9l5As38jnYhO/08vy22oAaLwktNH5tZAc4NueqdlcWjcXE4LAeT4mQw3j8+OeyfnmoJn4zKyVkoy6gnYfTitP+0P/h8b3+12bi1tnJnY2O5Kc6RD+ACEgEDeQKxIpYIkSIIsGiqIh6REvIbzSTdWmv5bLHZ/t2z7VFZaoy58w8OTp7v/erda6sffe/9K820D0uiNRx7TgTwUGUySGlKhoSFDEasqlZG8b6+vBQ2LEfOuYzddEssAkEBIATKEniK4ElllwVMzH7z4PB3j/fv7T8vE+V2000GToulJPvH77/34cbmtVYzhQVEEEeygJjAzdNG5oqZ+rWzZn01atSo8Z9E884LRaKK9cUYQwyAimeXUBHKvBgMRmIcok4iJqWNwQW4GBcno2E4Oj0eFcfgkGYuzZhEIwozzyBiT5fCn2kaJV2/fH37nG8awKfRyjKGCBNqNf5/9t60SY4kyRJ7qmrmHlfeNxKJu7qq6+id6ZEhOUsKhTL7J/hDKcIPpAiFlJU5dme3Z7q668aNzETeZ1zuZqr8YB5H4qgudANdwLSroAKVgcgIDzNzM316vNecazbduFmHQTABcT1hH5QJxFLeAZbYN8TQyqTdyACCyLAIl5eXkmBNVZqpP7k/y1ijt8InVbwIK4OSY3YmUEKf6LgID/ZPv93deXx0ctLv9Qx9hZp5SJO5KdwkahEttpt3N6/NN/PlmdZ8M8/FeeGMyQGiEFTy5gAYJlAiNShZpRYxBbPkyhewK4SKY1Q2nbMmS1prV5QTk9iovSxSxxThbeotefRblMQBMc1rQgQjsJE5kMIUmgM5IQotdlrr7VaxaGXUXhFOLpdPzs8Pu4Pvdve6Lh9qOYjFEHGAuDO8OCi6+TF+93x78+HjX6yt3dvYuD7bagnAEIWalWUwbyYOgEIVAWQewiglaCbZipfG2tzaTGNjdvE3Xz066B4WCF0bQOxi//Bhv3vv2spHW1tbWaZAFmkmEilCGbjNJh6GQoliYIMXSWN+Vd5xzNH1l1V5KOJApAA0aIAzgByYQN4MvaBlxhF2ovHB9pPvdw6/fR7PhzYwtqLQYX++gV/euP7Z1ubnS9cWvcsQYMqkBGcgl7otrd52a9RXW2211fa2Ud9Y/XWE+jRGBXGW5c1mIwwuSh32BucghVDUwqxkMcXwontY9s8v+/1QFo0sa+adRt5mcmY2Eeibcp1qtPeeTDvYKiVtY4sayhiiQbiR560858TfIhULD9cz94EZESAQhVUICUaghuNmxjBicWU/DLr9VIGtlZb6T53iJE5HZSBmsDcWM47EA+KBYe+ieLC//93u7pOj06Nhr89QJ178DFg0uqizJluzS3c3VjbmmnO5W5zpeCIvzDTRCzfABKFKvhlSHSkZW6pyA1WMkhil3aqMNL/2il+s9KQf/4JTj1a1JfOkyy9tZ9WVjDIxNl0SytESv0dSLjWymKVpYMphxgQh9bLV7ITF1jDY324snw7s0cHpD8+f7QyHfUeaucjUU+0O+4fPuw/3D798tH1ndfXetY3rC3MLOcSgIkYMYgOilQR4EgYzGAyySMqOqdFqzN1YuT2T/7cf5n/36Ifg1DJ/WAyOL4Z798++3dn9ZHXlr27cvNFslEpQFp/1AsGLNxhMTMwQLPVf0qQOdvo7/2XdYWChxIGj5JyHGjRSUPINDrDCcDiIT48O7h/u3X/65NlRF53rgR2XkbW8tjD3xd3Nz7eurbVaMwTWfmHmmJ14AwQQMNWQr0Z9tdVWW21/HlCgkciyzLfyvDWM2aAsiqJgHrDjqBEEFsQwvLg8DsMM8Ey5l5lWYzXPFhhNmGdyUlUGjoGfjeLB9XH2M7ssFSY3YoNo1R+lIBFhSULOI7QHiCXG8HrWPhjjin6SknQCcUU/IQQYkRFFUFA2GCySGozwRpp9DJNQqopR5krPl6XunA2eHZ58v/382fHR4cV5KSSNLBfEWPrhYFWaH21u3dhYWWy5hUZjsdnseMdqCFUq2RwiTGEBFqEJUlDik0xI0whmYilNN95SEsxVMqOKqMWqb4/XPhpMq0G6+nxVwvnC6xkgF6cg6RjmYfRRL6BKJiNvSeFuwm9jZmYxEFOlv2CAqSISZWuzi8WM/WK+8+sbC/vF8Gmv//X204f7zyFiTLHhTkI8Oz18cnH+1fHxjYWFT6+vr83NLMw4SSrgkTxJxkIEggDkHIslVXnyQLshc8vzy7PNG5ut//Ld/WeXJyXxoK8loRiE3nlvd/v4s7WNz27eWGkJTFSghtIgoKYQAVALwSSVfk8A+R9G0f8ud1CCqNEwqgGZEwNUrFQUZKc93Tk+fvj84NHe7uHlWWlotOcv+2dm2JjpfH7ns082F9c6rTnvWwyxqEwwYnIggoHUGEo1a0uN+mqrrbba3vl5RsQsMGeWiTS9azmXo+zHaMNhKZFUVViItAxlDCVUvWswd1qN9U7zWu6WyNqkOUlOJKP6nwT8qG7tez9AvRklhn1hwIMyEgGbUVmWZVkmogsjUwIZJ9U14nrWPpBbeOSNE5ERaaJqNIqRQwkCWCln33I560gBHOreIGlDRM48ACqJLqPtnF8+Ojh9dHC6c3y2f3auBG40MzKKMWdanl+4vTj/6cratfmZ2XbLARzhCT7hBgYJwKnW3AgaNcIChBnE4KRawBX8m1rF6bGKUSRpePwY0qv4Km0MhqfqNKtHm8DFqeeN2Makiq8Lo7w0QkQ2FSlhMoKZaQjqnBuXolpqTyQljY64kWdz7fy6s9tluLs0//j0xuP9g+3j45PLbiShdt5V/HB2/OT85Nnlxebi/K21pesLc6tNyTnLyDyBoGpmqgQVFkANJoBBWCAN1767uTLX+u3O7ldPn1wEHcYYBuGCKPTPj44uv3ywfe/6xu2tzaW5RjuDI5BhoPBAxnBy5UtV34D+4io8CcjAEQiMIdAjBMMF4XRQPjs6fvr86PHO7kVvoETKraCmveFCg7dWl351597HqwsLDc+lZtGaIiAoyJLmogEKMSKuW6lr1FdbbbXV9g4w3ujstlTnycwijjlz0vSu5bOmL5uu6MdQhKDRYAALg0g1mKUzixr5/Ezreru5mckyacu0QeIIbBgLN6dul2nCtxpF/GymSP1RTgwZSy7es4um/X7/sj+IDBAiTNWEmFILldUz9iEhe1Ig8QGqCaCEYRkHg5IBi7HpWrOtDkWYqxbDG713JATxfcXBYHh/7+j3z/YeHJ6cDENgoUajHPTbSmsz7c252a3l+Zsr8xudxlKz6aEhlAaw80YoyQwGMyGCqRXKRE7EGRRGMVYblFXKeWRjSQUAZGJW1VcmdhmjERtpRcoyQoY2ehy9wgTERq/8bq/eJu1q518Fd2z0zPjTpjc3Ih23wY37p1lcBmY1jSECEJdBEFijCwQCmIiyqCssy0uLH83PHS2vbJ91H+wdPz07fX5xfjLoB5aYu98d7T08Pby/t/fp2voX19ZvLcw0PcSMSMw0agmYIRJACUwYhLQjWe58Y3VxaaZ9Z3n50d7xN4+fdqP1i3AO67nsrAw7z57/6/Pnd+ZadzdWttbXZpteDKZApIT9/tLV2Q1kKC9D1vYmpGb7/bh7fvrw8OjxwdHu0dkgmhpL1hITGGdeZtvx7399+8Zce7E9k2lslDFnITMbqjATs5pFM5i6RJoMqxvga9RXW221/ax+8vhE/+mKxu99y0NSgpp2W5hY2GUeuW/krt1wc0PXHboQYletVA2gaFAzJYBICBID+cZsu7nSyhYz7pBlZA7Go+TeiJBh4mbZ1R/fh4HQ12BRvTKLNpWoJH3N66dG9309tJOIFBAJzjHl4hwJoN3h4LQYDAktApmZmRClfAq/6Wqv/ZW36mi+MLCvGGybvNhSZyaIkq43cwT1BuVgOBRlC8gbvt1qR4BZGdGSrvtYVXri1BtBR6V8ZMRKCMCQ6LQM9w9Ovn789NHe4UF/2AcH8UbKGpZmWvfW1z7bXLs1my/k+YxzDaiLJSdZPiKlUJqCiEBGRnBMJMxkRJE4GszgOUnHwTSpvmO8i1BSQqO0jg0QcLo5x4t7uujSXqzBpLHAw6vGmV7j6Sfm/DSuNoKRk/EeAUIjMBuzCVf/NDYGrAwmDkQCTpCWw5qRSAAAIABJREFUDTaEqVhA4cC5uUyZQAhoqsy1OuuN9r2l+f3+8LvD868fP945PeqWwyJzF6Z6dto/uzzcPfzs2sanN65dW8jYgMgEL2JEljJJZqpWMjGhsBDbLstbzYVGfmth/uO15W93T7998vSw3y8tDKOpFhf90D89frqzO9fqbCwv3ry2cX1tqe1AAW2Cq3oaSYzIDONWyzEkurpqx2oY44lgEJm8cqP4MWGCN8hGT3/aaPDt9XcWTV85X72ZXvy91LNeZNyNtns8/H7n2f2Dg8N+96QYnpUF+UYRI0XNmVtZvjK/dHtz/d4SfrE005EyMyCygFGWAJMIlCjVABsMxMwAVMMbMCfXO22N+mqrrba3DflC0pqL0RBB7ImZiEynDwMdH01U8SO+/96kXXVswEQspBy9UNN1CrcaHQeXazgchlPQJaiADQE1sFkm1G7k83PtldnGfM65Z+fECRFpxRMzKem0MRCinxMTv0J8TtWqLCZMUpkXUu0bReJEKkEwhjkkZ4XUOIKIILCUswCgRDqVFyNAJuD2vVkOBKOY6MFdjDFzklGMQ9VchkKnpEcoPagFZWgks8RSWJFBVtNoU2tmgkQmrh2Ba+LPtwf5TEe3KhshFdVNR1EqxbzRLRVjLKOSQC0Qc491ANvudp8fHrvSMvbNRiOfbZVe2aILZYxD8xRhor7yehlKUI1shSNChEVWcmUmZ8DTy/4//bD7aP/g6ORINRJRbqEZw+Js+xc3b20uzF+fnV1oNVqMDPAGApExcQoiJAUETnktAAIijPqYFCBJFJiwEZOs0VXiFAiBaVLlSQBDRik5m6oruFLnadUzr6+f+wMcLyMu/VER7URHbQpuM5iIqCqkmObeJwDimFNVhUiVzjF4EoM6OAELsbCQkTEMRlHbThpZPt/MN2fbXyy3nxwefX94+N/3dnrE5uTC8NXJ8c559/7RxWfXV3/9izUJlJMIjJ0ZNFAJMsAnsEZGDmAyEW7NNBfajfWFuY83579/fvDg2fbh2VkJYpefR7mA278MjwZH/33vdKHT2lhcuLa89PH12QxoEbUNpOCSyKwCgmMGL0mAXNUiTI2r3OAofmBmnmImcDYVJ0uzEl8Kl6WJpFDtNldmlCBTQZAUJSDA2MBxOgbH6YXp89JSS5tVNBCDzays7h92YDFD0EqNXcdxMsNwaEVEH/r/fnX/aFieXvTOuhe9ohdUIdSWjMrYDGXH5dfXFn9x49b1heZcu9X2mBfLIExEIjCoE0pR07R8iYQBSGLSpkSaU1uN+mqrrbafxe0KoWRSJoYRJVY2IAYlVOyXo4PqhR62P0Aq8JJY1Bu+/qc/vobeYIqHe3SMEoHgHBqZi6FdlFoMqSHWp2KolyxgnxSsqCyhAb7R6LRXZtsLzbyZeecce888KsmiEcq46j2lz9KfYXyIYK98Xl9TwjgB/IADXPJbjNNf6ZpeTvcp3m/yS0oOKhnYiDHfmZlpdHrxUlm2T4+fHZ8sLC7lxKQaYkweuJBMvKupobI64vxzwEB96ZlpSTpmYiBGEFF/GLjRPCt1v98/7/ZyYwrazH1zvhM8NZRFiUlQ3Rk0vi/TLBNZLMvYL13eCY6PS/vd3uV/efD0wellXwO5BhUDVwwWW/6jrWt3N9fX5mcW260ZdgywJToTU1hqVUoXKZWcC70CcQmuBoZeTJjTq0M3CZO9wL75imeuvOEbKdPTKy/35beppqLCfC+9j3uZNIcoq/YKQcUwQ1WFBMMxE0PMRGPH88rS3PV2Y2txbn1j7XfPtp8+PxjEIL55TFycnh/0hs9PL/6HT+5dmwHUBv3Su1I8RVUSn8J6XF2YMoTNDLrayRbaK9cXZr+4vrJzdPLw2bOnRxfnrjEwNzAmJR2Enf7ZDyfdme29f/gG6zMzd1fWby8vLGbcUGRGGQAzBaXELBGomke2CiFbqKr90ybOwhVY5opK2hJrD49yg1ZtsWpGMDDzy3MJg45APyx96HjpxHGUj8CT+KbpBMZNy8sbVxxCSpUOOyMaAjBUDBWF2ulFf2d3b3vv8GDQf1ZS1wwxOjAk09DnsnRM6wtz1xau3bl2bXOxPdfpNEBC8IQcYLjxwhB3JdU5DhKMXkBvHJWorUZ9tdVW21v0k81IiYiYWCqdAxgxpUIMq7gE7MqJ9P480hu9HuIkRxZVixAHZZEVLV/kErIiwgQuyyyqKmBZns3MzS21O7N5I/OZc17E0SQK/wr09fOOhr3yqqjq0klOCb1aFZcwpaBkVpWo8TSW/WBWMwssGogcqWFleXFr9fD42akRnRyd7e4ff7K0UqldmzGBKxqMKxwa015IcuEmA1f7J28b5oFGUSUa+c4j45GOOE3k5ciziGkJNwCMpNvv7uwflWXpyaBxsSMLc84IMLWo7DMjsZQLkmqCJQLEUXlYQJqdHvv9Inyzc/jPXz3aPu8WLFFDTjqX55sby3evrX50bXml1cxhGYszBUwopVEARZWU+ZGF8Spw9yauL72Zb/wnLVDC23DMaRpTTj9xpRZemQRmUaOZZt7PN/Is84uLi9dn575q7T54vn9w2evb4ERiV4cHj0/3y95//OzO1mx71jsA5UUvazVfZMMBDCogInIAG7lGY77V2FhcuLm2sn3S2zkvHu4e7OztDVV9q8FZVmixf3F5dImds/MHh8fzjXyh4ZZnZq+tLq/Nz8w4yQQewkDaFtUMKhk8wxhwKUU96rhUK8GBK5IoA4xIDGZlABljpFdHBojBYpUffgmM8yijSuM9GgSr6IEqKls1swgAJEkJz6qco8E0mgEwMWEwKVEECqCr6Kk+Pz3fPjl9dnh40u32Q+iHMCxigJUlM8AKjVEsLDbzrdXrW6vLi63W2nxrrd1qOnJmsTQBMiKejlTQO12cNeqrrbbaavuTjEVyMzMzNYMaOHIKg5PGKtmjkw3bUinLT4UiNOoWeYeAp+rDe/F5e/X1KBkMTOJdlmd5w+fNrGj72CrL3CwQTASN3HuemZtd7bQXs0aLvTfhSAaLL0Sy/8Trf5vj86r3MVJQtGkHewzuaJSotFTHWWVARg089IGhvcmkiJIoEJnIsDzjr883fnhqoQQr7e2f7K2dtRfmHYmPkVVF3DhlaxULKKbzfXFSx1b9Qy318NYgX+rNGsct6IXm0UnmtdqKUsGBEhkzWebz84j9s9727kFZFGzUaeSbSzMzHok20BQZecAZcUj7HSAGiohqQSnmrVPnd3v9f73/6KuHzy4H0TRIiRbz0lznFzc3fnlzfbXdaAlzjM3MiypUCSYswpVHX8/jHzP1ZjFGEQHAzKoaYyTihrmFgLml+c1m68HKym8ePHl4cnBc9C8IRSP7b/uPdnsH/+k/fP6r1dUwlI60qGCwJG6c8d5vKXQVYp5lwigNpdJMlnWWFldn5693w+dbS0cX15/snzx5/vzg8sxYXCMvVS8RLvtn2z0wYpb52YOducy3Y1zqtJcXFpbn5uc67U7DN2GOUBJ5Q5bymIBFWLQI5VxBqjCuQhhGpGzEqWUwNVGOKkONDYBRfFUYMfXEjQpVYOktFSAwgY2gVBEHKTAwTUe4JHJiWCSUSo6pBHVLO+v2D8/P90+P988vTgb96Nxhv3fc7w5NNXPGEkRdCMsuk37hhFeX529ubmytzC+3251ms0nUECAEHZo4yR2TARrfTBilthr11VZbbT+jj4xUgF+xuY1qQ65w2f/xVMs/nR3mj/+I132xV34qGZExqUeWm2spFRpLHSgNQ284iBj0Cxgy12k01lqNVaa2z9pZo+2lwSx42x7eWxwfe+VAkNp09dekvoYMLpFHgEDEMJ54TRj3sRhVHUUfimtLZgLKjDkAjtBirM00V7P84Pzc5fnB4eVXT/bnm5284bIADiAyFdMXvx+PJ+gFjk/+U+6H2l51C8SrtEJXb+6Rgzyegwgqjb2wEISOTy6/fvj8YlAURUFsa4tL11cX8uQkMZNrABmUjWksSlcJaxKb92ck356e/8O33z3a3y9iNI1Nphnxn9y6ee/mxsZ8a6HVyAmiysxelU2r3dIUMSkT1LDvj7QE+YjIOWcjeQtRtAwcuJk15jey9bnmd6fr//zw/rd7zy6tQU4t6P/xX//p8Mbd/+2XnzWdOLXJcVXluUBQM/gYJSqzOIKjakdjos5sBs66i7MfrS8f3lp/enb+eP9w7+z8ZFAMzQqzAFIGNOydn4rZjLhWr9c+O2/45y3vO1k24/xM1rx740aDqMloChoO3kEYCibOgEhIxZcGaGr09JJV1TMpwKpmpqYwSdm7l4p4mas4I5FAADNiNSoNiZYaqYKfYDA1BHAAhqCopGYxar8oLoryh6e7vajd/vCyPxwU5TAURYilxUEolQnkMsdGDKNoMddwvZ3fubl1Y2NlptFod9oZ80zmnBmZecAxC6mDsQWMSmrrTbFGfbXVVtuH4HIBg6JUhThmIcBiLE01EQiAppucqoSaMaaozH4isvwZUB/sFTio6kgjgEEO4tllzue5j81cO2EwGA5NDa28Mze7sriwNttezPKcnCmXIB0xdmrFcfmW/L13+S5aKUwYUcXXUunLV4JnVSOIghTGBDIEQqjYX1C1MY7KjN5/UQpSJYNTpohIMFFamencWVnsn18OS7tA+GHnaGt1aeHakhdxMSJGCL8E+HRU88kjSn36U0Mgtb0OqE+RCE/jPZom9bySeTZjCoRuwOOj/qO94wIMppanW6tzqy3vNDpiAjvXMJAqKaBcCd9FApMoU8/4q53T/+/+9w8vTs6HQ9a4lOUreeuvNm98cuP62nwzg2kRGdrIxAlxCg4wVUGWGMCO6kTHHzfrSffPTFXHCNAUxCCDleaCzufSXJiZ6TSlQVnT7h8fFozjy7NC3X9/+ESH/B8//uTaDLPB24g/Z1T4QAZxDoCVpUZl51wmBgibhr7zLmdpN2Q+n99cXvh0Y+WkP9gdlHvnl88ODvcuLoaq5kUJpcbjYXkWVQYF26UHMpYG+ya7324feKBJ0s7zmVZjrt2ZbTYbTV6Yz5mjIxFhAQuqfCCIHEAGJhMG84hk+jX8aAQykoqC2djMYkRpxJ4CEA1BERSlIoCC6uHx2UW/d9rvXnb7w1AWZRgUw8sYj4o4UC3KQmMUIyZyIJh5kcyAYChiu5WvLi9fW1tbbduGcwuddqvVZJiASM2baVkyWeYlk8SupNCYxI7qTbFGfbXVVtuHYpElgkPkWFWkcDAqjeKUdjVV9OIT0uifKoH152G0tNfBvlddDxEbEREcaYZhA6FliM71I3wAcWZAo+mynHxm4oO4IbEakVaVfWRQfUtZurc4Pq9ktgHUxpQt5EBulOrQqT8jt5pT00piHvcvSjuMV8L77UwCooDBVCMQM5LVmcYvtzZOT3uPTi+H7Pb6xe/3TudmZ283ffJgbFqkK9HUU8WuMwZ+Vm8VfxbjKsKkU/ElnlRwgyCAcUk4LnD/rPvl4/2LaEO1djPfWpm5s7nWYvMWXWKRMLZRrEdhhhjJjFhFLkr9/c7ZP3774NHZeZln3lmuxfXlpf/p9q3Pl5Zm8lzM2FSEHLE3JdWRJAKBOG2CZklar872/TGoLxV5Jj1VVU04sOI8cWAmI/NDXWD769XVjU7rtwe7//z7L7XUzuzsebD//P39kxJ//9efXsvRMHiCw6gVPcXmysB5xlxxySSQImaZAyEITGAN9nPslmdnu83Ze2KXRXF2fe1wUBz34sHpxc7+8/3z09jMA0CaeDRRRg3lsG/FRRFMVVUZkjnJs0az0cideQw8q5PMCWWSNZxr+Cz3bnVl3RMciWPKxHsBM5gSLegrTi8zhGBliKqqGlS1KMp+iIfnlwPVooyDohiUoQghmCmgRt3B4HLYH5YFADAb2ZCtKzFAycE57w2ZwkfzasuN1sb8wsbC4kLTz7XcXKs522o3MhKCpGwp4AgsTGYlNGMhVS0DACcMYpghag36atRXW221fTCo7/D04d7xk+Ozw7IYsECS9i3FsXzwyJlOWsGkpAZ9HXPmK9kp6R2xdyauztdxeBpe8byRWJLHogiUsewPe93+WXdw2itOQaXPHRm6F6enJ4c7zx5lvp35RuKmq0hNCUkiimhM3fenfYu3NT4TxlW7yiYaJ8Sb5iYlijZCfTQq5oSRye2tz7bWfwHISOjvBcj3Y1wU7wvwU4CMgRiHwm4+y2+tLm2vX+x0h5fMl1F/8/hpq+kWP7rZZHawEfVfWu02zj1RojIiGDG9St6qtreF1DHihE0EKVXv0+gfaVoxTVASXSgOBv3f3N9+sH/YNyNmn9PNa2vrc50MsUFwphq4jNF5oYpXEwEIsD5hSHhwevr//O67572yKBmqS+3mnc3rf3Nz45PFuQWRLN0nRgSFBSiIyVQ1RhCL+DGNr9X8FH9cqM7MzHhKaSIl/YhSIqxaD06tDXjQTGd2IW/Mmfzb/cfbp2cXgdk1vzw87P/m3/73v/sPiXNMAU8QIyil3oUE/SvtxLFqjaow2MwZCEzKZtwgQGm1kYdG3jcMovXWFs42l46Gw0uW/fP+/v7h0elxtz8wACJEHGKhgDIiodB4MShscC5qWbWNEJkxsRfJssw75x8dMkiIhEhYmCkVVzAivWprYZYyxBAizIjZzEIIw2gBrohWhLIsg2pUAExGxMwKUyNQTsTGULUYy9yZxIIVbc8rndnNhcX1+cXFnJrRr83my81mR8RFCMAKG8AaIDKDhhAAeOcAYhFSI8CSOARPrX6rG51r1FdbbbV9COduRPFo59+eHfyuP7yIMaCi61TAuCJ1GXeDUfKHlWH0ZsoE7xb1vdHrjSgag9IBF2IchuGw6A1Dryi7RuqGxBAmP+w3+70DkTzLfAX6pnJpZonv5O18i7c1Pj+G+pI8k01Y1NWUmZlRxiEQ8oyjlmGIy8tjT82NtbswQ0Uezukv+hAILImqgk1P5ISFlKELreyjW9ce94bPd5/3hQYh/tuTR8vtLFtbmWUWNS9EBo3KMMdsIZgpi6RJTuSnVrs378B4Wl98SpdvRCOVFiAlahZjCowL4Gl3+LudvR8ODs9jcLlr+Hx9ufXJ1mZbOEPIzAjMlDqjRu+pGjVq5gYk3x8d/9+//fLxxQDcygLNsP9iZf1v7l7bmm92mHKYh/KI29VsVGiaOmDBmqAKCcA6gpS1vfmtOtGBSBm/RKcUKslGFRizOVM2zoxy9p2t24tu9j///qvvj87KnE/IvtzZXfsN//1ffdEiRLOhas4QhmcmGVerWKVyQDDjyA4EBgmDlEgNZmJkAEoY0EzChc2GNhuF4UKtuxh6G4uDweCyCJd9Pe31z7u9p/u7Q7NCY6FFUNMUToRjy5Ouh5qpISj6MQJRbTBZ21SlNi1RwLwy2UekqmYmzCCEEM2UwO28ZWqqaqSgVHtOZhZKFedycqbRzFio2Wy1G51bG/MtT+1G3mnInM9mm42ZvNl0JBFNQWZwVtXEYoozyUAuiVRYqmsWsAF0RWVC8N4HAWvUV1tttdU2sdAdHPTK3YghORIWEYEagBRDvNJoM9Jp+ukZj0kF47vLkrzR9VQVRJUkMbGKFC5TExBLYm8UZi/ihb0jEWUpjPRP+dA/2/jYK8cmqauPhJvG2I8IJKKI0XpEpTKMhwx/0T+47J6Oij/txz4t4aH3zZVMWKJyq4ShMHi2jeX2L+9uPAv9y8szE9o9P/3Hr37fol9+vnmtaQgRYpYxo+JBJyKpAEOVUa6krmon561PltiEdncytAqoQSQaaWlJeC8yLgnPQ/n14f6/Pnx8PBiQ96rl5ury3356e6HdcoguJXoMSYzGFGrQGMpQUlPOi/Cod/pPjx79cHqCbIaHca3V+Wxj9ddbq7dmG02Bgwq0YnUlG9EnpuIBQsWOiCoaNuHTr+2PgXwv/2gjthNALQG/1GGsLEoZ+8+WV8p7vzT/5LvTk24xYMaXj54uzszeu3FtNncNs35/MN9smhYZCwxmVnFdJh1PAijTEffqmEuTkLTvAIOMsssG5IQmkXlvucfcbGQMSjsbFJfDsn9vY2jWDbE7DBf93mW/PxiWvaE+2z0xysBkVlVQqFat4MY0OnwsQgFE0sj6StRnZsZGzHAEQCUxTKMozh3AREwQR0LMIGFeX9voNBqdVjv33gkaGbVyPyM8nzVmPDdz5wSVMqmZmIoDm1FK4fnRbm9MqDq6hWX6ZEnFLSP66ep/uF78NeqrrbbaPqTdxHlxriyKWFizkcOyUMSyjJnLHLuxDDlBKXFa2Bv0s02pNr2rfN9YouEnXk/KXlJ1/Cs4wEpGoDCIGomIVQROKJOYC4SZJvmId+P1vrvxGVXK6fQAKDEgVjEnRsdepAxlr4wDL8JMQBz90T+gVf5eHvipmDUVWaXKZAIajm6vz38eNs++7x9enAaL28fH//DVNxrp4431llDGBJAHEZuoTCo6x31bI8qR2st5a5YglL4ctKAYo6k6781QpBplxsCw0x3+687Obx88en5+ZuzFdGV+9tOtazcW5kYc+iM1bCggVRl1JCJR8YeXl//87Xe/3z/osvlYruT5Z+vLf3dn/dZ81ohGquSUZFLMO049jthcUwRlkpWsE31v+eY1OFikqkohEgRwUGGQkQ+6lMsXW6uaZcV3398/OYbGM43/8u0PA9O/+fi2Y47eF1BPHJPe47hnd3LfMqpFZyAjTvI5Sf4AIyw4ka/3kJG0ETxxllHL52UnV3SMEczKaEUIg7IchDgo9fLjfoDEiDJiGKwIoYhlEcPJ+VmEFaYhhkFRDIrhsCxCDK8bCnFChCzLm80syzIRds43HS3PtD2ZY/Ey+kMihE6z3fau5b0TcQzHSGiuYUiV/YgGqEJttH6VNLGMjuva2cSb8ItcupTkbewl2iWtgV+N+mqrrbYP6JAthnHQN0XeyDt3bn6yPLcu2jAVZiZmmKXdnhBTo1eEvKmr8/NweL7OtCplAVGERtWoMaqqVmrcAhEWx+JJmEg5UQC+W5Tyjk2vctuwQmBJfjyCioCLnec/PN9/QAaoNzNDTPrYdBUyfwCtbZRqlZJjw6k6kwCN1nb8+ebK+fDyN1+dDopS8saTw5Ny8Lt+P3yytbbUzpOj1mICjBTM05LShpq148+AAkeZM2angkBUAMFBCYNg2+eDr3Z2//XJw92TE+d8RrHT8H97b+vTtYWGImc40KTispJKI7WoUM79cRkfHV98+2zvEiBIBv1kc/Vvbq3fms/aAIKBIzDRH7MrYRmyK/od73+D6wcJ+WCV/F0YSXoEGutkGgl5osWm+3RjobR7+ObrRzu71mofXPa+efTsxuYGt/OW88MYvHMGrUKCV0oSaPJXioeRUmolvQr1rWIpIU6a5yn7R2ZmZCYGIYJSBkAIPkMjiylByfNJOC8qSrVStVSNpoPhqgLRtDQtohYxFhpUtfEKjXbYKLcmIpk4FiZmZs4YrdwzmScWYkfMBEfEZoRE06xCWgn2qZLC2ThYZUZGTEZQSvIRpjCFjSGvEGTctHq11ufFgfzjzt/aatRXW221/XzGTBlTmw0ec4szt9aW73q0Tb2XXES4OuwiIYAiAIPTUejwp+AZeveo76djMkpCWwCQqANMK0FfCiGRlpGAhVgIwpWSudK7+hJ/nvFJg6TQEWgjgxhGqA9FaacXp+VOeaxxABOzyiEYpTcwVdr4XgM/gylFhbEZK0E5sfCAkTM6RluN7O+uX8t6/a8ePOoOArLmYb/8r9/dvyiLT25srM+2G4SBAaDMVaVQU9NT/VB7+m//NrCXnnJkoF7QvpllUii2z/q//f7RN9vbR+Uwc40cutxsfHH75l9tra1kXoAccKBUMYrEPGUBRizELH1H20cX/3b/aS8IE3V8fndx+a9vrt9ebrRMUSicwSmuCDROw7zpH4nqpO+7DIGxQUBGbCNipQgyBhGX0WKJxVx+tT4fLq7F84vDYEOR427/N19///d/+0XbIOyqbauKXCUx2qoXm8YJK5oIcr4MC228pSACRiRcrVQzBgxMVAmpmyIqgEyYQLGMBCImMJsjhRhEYbGdWXVg0eh/jA1O6ZVhVJYJGFazkHhb2ESo0gCsanA0MS+nJsFRox8nLmIIjXB0+rIpuW5mVvGRVam76lxkMCpKqxfAeL3ca9RXW221ffBmozoWjoE8dzKeF7RBjs1RyVMvC0AAGdQT3BsfAe+yr4/e7EKsOvFpXLdCMPJk6QxkEE95eTFWxaDveh7e1fDQKNxNNgrhkoEsUjQjjiJZxsbWctwicVS6pB/8IR7yBouImjq7IKm8M/noGZmQZap3W825j+8tuPyfvn54Xqj6bPvisnv/0Wm//8XtG7cW5xyjUCODr9RLEiVflQ6g2gF6qzdvKtKuWk8n9WMUKWV7KAKnRfn44PybJ7uPt58f94uSOGfdXJj/67tbn2+tr+Q+0yhJW5LICCNBdmMEAkBOSY6Hxde7R/f3jgtyHrzW6vzdvY9uz3XabKQKH8xFFQNIJqEYngQ7rOrhY1wF/lSngN/6RkgAiU0qCtO2FZkMCAwYHLDo5bP11Rj1//zt18ruvDu4/+jpp7duzK3MgRKBVRVVG2/gNCXDksKFRqmB8IVAHBiJXxMVhRMZRqTGTJWmYNDAIAIzV13vqaBcOK1rhUUr1cyCKQPNPEuho6iqlSo9GOTYVaD0KhEXDdSgDDbHAGt1bxhrpUZPVUf4iIGZU5ArYd1oqhpCBHGzPbqxGGBLNF1mTI4n4dtRp0Ql/z4ibDMez0m90mvUV1tttX3opoYe+AIqanAcHEeBEQTKVQsLkPj9CRGAicHe2O8le2c8nm98EClgoFHxD6w6x1MkGVS1glV9JcYkoHfevPPuxgfVEFVB3tHnCAmxkZGBiohBUV4UxRlRyaFlEym/D69+x6ARQVI3UOJSSCy0oXSI3tCMNNNsNj+NtoCAAAAgAElEQVS6Dcr/8ftnh4OeOR+KcvDk6WWvO7h98xfryx1CBNreyWiha6UnUPdxvYMpG8HpMYWGEgqzgeqQ5HBQfLe9/+Wj7e3DkwIizQ5HXWvlv75389c3Vpa9+LKkoKSErGEM5YqaIznYAjPVvvrHZxe/f7bTYxcLXm51Pllc+WxlZlaVQmEuRhcKipEg8DlIKmd4OhcylnO8GqmhurHpba4EBSKIDQLwWNGAoGSBUVKMzAl0CWxjthXdxr/sHO2dd/v9Xunk628fbM3/tTCaQpzCXDrCfuPp0yp9xZQqMTFJ8BqxMRkReFxDYiMSE9OqGZoIIBJyNEb9CSpFU4vQSExEzExEbAqfsNagJIIQC9M4ekAgpulCYkzynVK1oBORKaBKIKkoVXjcrmgjGd2iVGYmYR5L0JDCEMsK0jGTk2phG0Dx6uE5wrgmpohVYnMi2vtaAuOaxbZGfbXVVtuHc85yEBmCnZUDQkkoFAWZk8SYDgAJ7wVQQKK/roKwb6omN1EpeLuPb3QlagpEg6KiWEvxXyZIquGpPE+rNA84lQRVIc93xkrzrsanYuQGpbbMQJRUOZDowomDoRRE4eh8VCsRyknNrH2QWgUj7hWavnYmQlSKKpzFYVxg+R8/uk4u+8cHjw76F+a4Vw5/eLZ9cXp6eHPri1vXr83NMMGBBMSjWrCRe0/jELlNPKaXel5G0fxpvruXX2LTf4+v9g9VUKdf4Cs/venC+4niyleujUZe8E/4lZQh4Wl89PL4pEbbCWkKOAHsEtQL9uT45MuHj7/d3j0ZFtHnpUUte3dWVv+XT+/eW2jPiOQwUoVGcDZN7DQuSU5hjvOi+G53d/fsnKXZztxqo/XFjevzTE1HRKRigTQCcRJESjiBXre6antnB1LF7yPTTD8EZiBGODKKEeZNRJgZS9L61ce3/69/+m2rPVPE8HTv4OHu3l9trVlKz1usgnhXWueq5Nh4XcpkxkFGZDxp9Ety6UJgmMkUCiLRyVFBo12cmNPCmZCUkpERAyYu7cpchVLV1ACzTF4OXhpgzEnDcBSPFE7wMo6YR6kqxK/AqViVJ0/lmgQ44lS8WRGYglMZxAuFrVf2HjObvhzDSKaIfiyQWiu116ivttpqex9NX3bOohEZM3nAAcJwZEKjkpUq+1XF8whVeSe9FJv8MB5TGQxVWmA2du+ImCaCdOOvPOqe+FC/L42O4yRYUQV6K3FgA2AGp5UYIxExMQPMkyrXEWf9B+L6ChyDmUY1nsAoYC5ABjJi8UwMZJ7/5ztrrYb9y9Onz48Oy1iak71u//z7R4+PTr+4e+vjG5sdQQvwGjOLnnRUAixBo6oyM4sYYKYwlVErzZQvRUaIYH0BLE4Y6pPXOM48V8tumph2yj3jFxATjbqT3jwBPCmfmwabU5815i1VIHJKiQNsKVrC1Xu8AhXZKFFM6dYZOc9WYW+MymaTgB4FiIFY4RSsoAgMI3aOL778/tnTo+O989MLKwdWxlDOzLR/ubr2v965e2tprkXmUwuTOLCAq8JMpvGXZIZXWMHY617+sPO8DJaRLXj51Y2168stcohMBE9gZ46oDIgy2QFekBYYjYrV+O8d2lTelK6Q5hAcZOz+MpEjMkOL5ZONhSfXN757sqvO7ffDV892fnFjNUNpKJJyO8gZTc2YjDGeTUrgxwcE8dS2OUKIPCrhfDk7NiVhR3Q1YmMJRFb3ML8A7WjEDv0admSisaQhMBZMnQ7X0PQyJRuxT5lNGI2qre/le316gV9p4gNP5uHlfeNH4my11aivttpq+xmCpT99K676FMwY6ggZ4ADPcFQ1yYxRHwHeRgfulAf04T1O6UJNnZeTM3R8nL5M0/fhfd+qc3FMaTLya2Bc+SYmSomUlU1ToFrIiIjptUQzfwYOmj/SCCRwoyosGvvv1X/s0pd2TAI4YKPpZWutM5N/+Si7/+jJRX/IWWtI/v7RxfOzr3/YPfrV3a27ywtzzAwjDWKRwamVh4RU47AojJkl4eSpcr8JfpoI/aU63imfrSpp46qa1nB1QU7d0C86m/aizzVKNvzo45iQvaoopun3JHutZ5dwXsWNmvTNYDydwhvnOqkiABzlM0aFwimlGVU1lqxGBgaxEyJSoFALplFcYTjsFfefHj/Y3n9+ctEd9gfBooVWxovLc/duXP/Vxvons7PNJDqZ3Fx2L/jKo/+VlGgdwk7KcNIdOpdlEYu5u7O+1PKAoASJkTMSE2IjUnrBl/4pe2nt9L7NW7i6WV/gTUqVkP6FISdkwHLuP9rc+O7Rjkqrb8XuRb8HzAJAAOmI3Wf6ZqIp5PXS5L2Y4n397BJNbS+vWxj02rehqaX6ug+g1+rl/MjnvqiFiD/UCHF1nKfemq4GPOoboEZ9tdVW2wd9wF5x4mm6roleOAuuPP47oK/7gwf7qwbg38mU00SduPqa0ynNn4jo3kfgR1ecldf84xgTAAbMZdnHS0sLzeb1uflvHm4/3T/q9QufN7pBv3n49PT07Mnqwr31lZvLC/NZ7iz6EHwYimM4ISYjikQllFKakUimi9OMIFQ14liVShthwmr4U1bKpnJsRC97aS+nGKbvXvrpDZhTAmZT/qhNQ82XP1oqTosrFD8K5tSDpzSh0nVKDpVWolpVHV5Vo6laLFjNiycFolpvaGDkOTwPQIfd8snZ+Xd7h98+2Ts8P3c+YwpCYT7L76yvfHrnxu3VxcUsa458IKIfv5HJQBHohfLkstsbDinLRGmunS3OZ3xlBafSPhmxytQY733clF+54yQpzo3FRiN3fUCJTi97593BUtvFiqOSphLXL599f5bJpT/HW9Fbu556ideor7baaqutttr+3XmZTrUN2mrPLN5uXJtd+Orx7g/Pdk4ve3CeRXb3jw8Pjh7v7N/Z3Li1uX5tYWbFuVkug4ZyWBiT+IzZiaUCSK7AlE1czYSJBHalF7DqGmJMpLFGnta4rPiVftgL8mP2ZpBv6v3ohfdMWvav9v9elBOr5D+MYmqcmkA7AMxkwnaFDogANQNYJBdWNdUYhViyTE266g7PwqOj06+fP//h6PCwGBQiZVO6g8v5LLu+tPTZ+vpn66tbc+0OiZRGGa70Tf2oKXA5GDw/PC7VnCHzsrI428lYzLjKV8qImZ4rmffa6/2wbmGihYasLM4/Ob4gwmBYbO/tb925rhCr9BuvFlbX7CO11aivttpqq6222v6ijIEc5IAIeJJ8cW5lpnVnbel3D3ce7DwfFAU7X8Cennb3ek++Pby4trLw0ercncX2nHc5Z0IwIy7IEaeU3ihTByWLZFqpaWnCdjbumhm9ODHHvlyv+Qc93T/NU6Y3eUt6DZjSkfZZorqpLJIYiIkTeBKFGGCVPiY5iWSFafQCoqHxfjc8Ozp7vH/yeO/5/uV5z0IUkGoD2Jib/cW1jS82N+7Mtpd93oqQYHBvUGuQfPzLXn//5Mw1WgB1Oq2N9VVP8DBCZANMkpaZgRRCqSiwvjc+pFsYbe9vbW5sn5wbMTv/bOc57mwpvCKOuwMpVSaTXW2wra22GvXVVltttdVW2793I4OL6gzKwoAY5VnWvLa6MN9ZW579fvvg6LJ3PhgMwf3Szo7OH5+cf7stN1dnbq2u3F5eXW83Z2A5TIwkJuZBgKFikbQgjVBBzFC1VBqlFjkQjan31KYILCYNSPSTIBjRVS2BnwKEaNyfN3abkZoK6YXs3/j1FRvntLDChCOTq6ylpSLPACooEtSBnYGUWQEFg4yhwBB0ydKDHPT63zzZ/X774LhngzLGsjASR9QiawmvzHY+u711b2NprdlomvkyMgscveyu24ip4pXZPwO6w+LkoifNmeEwNpp+caEDmGMFAoNHQt5pSGRqTGp7/80E5mHe8cbKDJsqQcTvH54oKEKUiDDSz6uiFXUqt7Ya9dVWW2211VbbX6aFCC29dyI8NGOmxtzMbDNfXV56tHfyaO9g//zyYhhKNXi/X9je9sk3h71rneM7cwt3FhduzHVWW5wnXtQk6wWNiIpgVcNcxZ2TkJNVJC6VcphBdUregF9bYmgvoD8bgUkC008r8jRAyazqOLyKJWmKuHBU7WkwJdMpQJpg3oTTVpOmeUVFYwAYAUErsn1WpHwmImho6JZ43g/3j84fHB9tX1wc9Ppnw6IIljtpOspKbavenJv//Oa1O2uzK512J/MUYlGUUTh6iaammpHjlyDf60yBoVq/LItMyxhYyHs2i7CSKz24cW6PrGr2rGHBBxS4USAw+zxjQyyLEMX3Q1mCEiVstQiTPIN9iBKktdVWo77aaqutttpqezueI5ETwDyUhTzREEqZa6zNr8+172wuP9g//f7J7vPjs6IoSp8NKC/66PbO9/Yufsj3tuY6m3PNW2sLm8sLnpH0uqr8FoxNSOUKdQolDSxS2Kj5TZPqF6qevkkB6BWWzatQreKLeQWnyY+joCREOcZ6EykXngAemug2kMYR7ztPoU02JjNKvzTSqzAygRKrAQoqQIErCtOLoT7ev/x+b//p6eVRqUdFcVIMSxGXNxyXYdB1zt27tvb5+sq9hdZmpz2beW9KhSqIM6eMvpYRyETsTUBZpU4tvgjBCEyMitfeCHFCSf+H06y1vZ9mBHMgApyQFjGE4Jt5pRcy4k6aymLXsK+2GvXVVltttdVW21+gz8gEL0REpoAKGZOxwRO1WGba+VIz35hpfbQy++zw7On+2dPji9OhmQgsXoaiO+w/7599c+pm9p4stPKNxfkbqyvr83OdzDmYU5ARj0QOKhhHgFmqPGNYgnxj3QS1VEzJPNV+R6kwFMoTtJbSa2ZV39yrwOxLzxMwpT9dlZ1O+8PETKN6TlSieyGhIwZXj4ZoFiKI2PPkijjlBo3JLAJDooHhpDfcOTraPT4+6g5PumH/5KJfKPkGIA2VtnFbMNfK1jaWbq0u3lqYWe2054SagFiVPmQmzxxACmXAMb8RLCOA1czMOz8YDIpQ0kjT7zUvr+3DwnwGGBsTdDgYEjnvMw19eeVs1tNbW436aqutttpqq+0v0mWEMo94MYmMGEqmDhCDanREHtTKZXV14eb8zOHKys5x79nRxdP9g73Ts6FEbmVDh/+fvftskiw7zjz/uJ97Q6TOylJdrYAGAZAccpZjNI6trdl86Xm9L8Z2bc3WVgyX5MxQA61Li5Qh7j3u++JGZEaWAKpAiK7u/88KgepIFXEjIus+4ee4H9fzPKuTWZk+fXrw+Vc3p9sf7O59cvPOJ7du3NgqfapcTg8fwtWwBS2GKYpmCuVqEF6fWWNVO7uah7caEz0EtfXQZBuGn9dQ5uoaXU1lXEe5zehnQ+uYdcBU5tXIylSmLPLq0AzrOS1LY6nMqCGLVb4rQ4+a3tazLl1KddWW1eY1Hjy/+ObF0wdnpw8vzh9fnJ1084u+9mGT8Xg0buJiHufLg3by0a1bn946+PBo+4Oj3Zt7k1GRIjz7dAtTKm118u4uGw3TtfNaM5pf28nTpOLWuruZm9eIRRfRDI1oVl1WL9fH+kszLfAeWA0BmS9qmjVe3GxUhp4/uTlvLt8w0QUg9QEA8H1PfeupA5L5MEhB8pQpFFFS7t6kIiybZmfkR0fbn+5vnXyw9+Ts4Ovnz//1yaMvXzx5Op9n8ep+1sdcZdbn84v5V4+X//Dl+cH0m/1J2d+Z3Do6uH3rcH+nnbiK5KZGKmnF1Mg9zTMsQpHFzP3lFpK2nu1nkiKUqQxFZobcvfgqCr4yg+/a33P9rVbRZnMzoNv1IRCpderLsK6mVDNllu5pJd37VJV6qTMtU4tOZ6fLpy9Onjw9e/Li4njenSwvTmN5lstZLmsJK1Ys6vzEMu9u7fz44w9/fPv2h/u7R9Pp/qgZNV4sskbNmhYuj9XSPDddDTxcJ713yQTSdDQ+3Nk5mXeT0biv+ez5SUz3elkjX8/bGIbLp2mY0k4Lz/dGyKpsUeuj5yej0STlWevt24em4SUWNkxpl8LkRD6Q+gAA+MEGv6tOJFdZyWxjPaYrVJdm1qZNG9/fL7d2d+4dTX7y4eGDs48+f/Hii6fPH5+eXyyij1KzmUUz63W86B7OovG+aerOo8c7X0y2xmV/a3y0v3f78OBwZ7rd+thsIhspW5m5uynCorqGOOJyk69Wc6ZyCG1lVegbloJedWFZZ7a8DG728n3NddNNrb5HpjIzJHMrTRm2GEYOiTJT5lIzLEV1payaL9JmVfMaJ7Pu2dnZk5OT44vZxbw/n3UnpxdnFzmvba8Mj3Dr0iQfK9usO63/5LNPfnx0dHdrenNn52hrslvKqGbpe9VUZpqKK221FXC9W3BVlIt37605dOg/mE5u3zj44qv7pRnP5ouHT58uP9gfWdNLZuYyH+ZtaGgyKjr7v1evX68anXXdNw8eqxQPs+w/vHu3VZaMkiFZrt5EGIrrSfIDqQ8AgB8cW+9zW48lsDRbzSnIVJi5WRniUc2IrltWZTMaHY3aw8n+RwcHf3T71rOz2ePz+cPj+f1np4+en55cLOdmfZO1TbPIWL6YzfP8eUQdue9vbd3Y291qy9i0Oxnf2N4+2tk92N7Z3RpPGxu5mliv51zfpky5WVm37JSUobRUpqdcflXYS0VKkTLzcq0XzLCGU0Og8VV1L3P4iOrwhbben5eKYsoMechraN7F6Wz+9PT08cnxk9OzWY1OfnJxcXJxcbFY9H2EueTVp7Vt+r632reRR6Pmxu7unRu7d/bGHxxMb+7v7YxHo+jGRZMSyq6r1VTcXO4mK7KsyrquK65yraXl0PzGpfWBeStF2h2P7h7sN19+G30/6/rHz47PFjGZuNS4VNbh2Cxd9fII4b14+Yasi3w66x4+fbHsPaXpuPng5o2RsqhbNaA1kyxNIXclK3hB6gMA4IcW+bIobOiFuarv+Xq7V0mLyFCYF3fPDIXSVdxV3M0so7ZZtsvog4PJfD9Pb/XPZ4un88WTWf/gZPbV48cPnz2ZLRelKaXx0jaupq/1yfnF49OzYhqVZtK007adjkaTZjT20nruT8a3dnemo9H21vb21nQ6HY3aoe/L6nJ1E4ezV5eZuV0b+Zca1kVeL/Wtd/PF+p4Pd7dKudoZJUmd1IXm8/5iNp/NZ/PF8sXJ+ZPnx6lSZcuoF93yfDG/WC4XteszbTgOZtVlyqb1YrXvzw53p7d2j+4e7N/e3bq7O7q5Pd5r2622acuwKjWLhSz7qPIMd1lxeYYNA+1tSF6xTt+WYSHbnNLwtsHMpXHTHO3t7E7GL2Z9F3pxcvH0+HR/sm8qZZihKK2maaiXzNTy0ngvDM/nWa33nx2fLZadRsX98GB/f3cs1aJ+VSHO4Z2b4alu9m5rhAFSHwAA73/qU0ZRP0SltDKsJwyZTFGsr56rclCEMq2UpmmsKGVhbuarHWEamU3bst9u3TvYWqSfLroXH+0fX9w7mXVPzpZPnj5//OzZ2WIRZs147OO2i5gv+3kfLxadqTfNh51245Lb7eNRUyaj8WjcjIq7h2c0xSaj0ahpJuPR1mQ8GY/G43HbNmNrxu6NuRf3jf6WsWrPYsNuv4wc1mx2kYta+8iu6+aLxcViPl8s5l0/Xy4Xy3k1r/Ku5rLvu65b1jif9yezLmSpSFtVTSSV0rqpRFiG19oot9r2xv7e3Rv7d2/s7YxHR9s7+5PJVtNMLNpUo2HEupmVSOtqzczijUp2Zia3GGqQKma+Hh2/bsSRJZW2HlRh5a0fX1lm6zra2bp9dHTyzePMPDufffnNo1v72zuTdigDNavGqqEMM6O5/3ukj3h0fP751/e79JS1bXvv7p2tYha9qSpDqrKiVatbo4wLUh8AAD/Y4KfLek8ObU5W07st3TRMBJOHyaxkKsJWYxXSFCGlu0xyUzucZnq3P6l3xxO7ubOM8mLWH5/dPr24OO+600V9fHzx4Omz52fnqlHdQzn8RJmn2yz7i8XclrLZhVkqI5XKcKltSik+Kk3TlHbUlOLFSxtqU8W8lOJD5U3DlryhnmdmlpmZWWtERC/1Usojo0Ys+77ru66vXe27vg8pTHm15rWkNbVtq8yyl9KVxdQoPWPsdmN35/aNw5t7O7vjZrtp9sejG1uTG9NRo7710po8e4VM5uamVJ8yN7NiJVKqbiWrZabl0NjUVVM1ZNLllMPVZa5nX7xLpcalsezG1uTezRtfPXzS1TieX/zzN/c//uj2dHJgUll1uBlKniHZMNLQVg/pazJgmrSapTH8CKLEr3C5c/Yte6ms2g2tG9j6Gz9DCmle48snz355/6FsXEz70/HHt29OpOaVH2Yiz4PUBwDAD9ewsSs3UsZldxStxtGZJEsrJlnk5fLJTJmblKtFY2bFLJRNWrtqIGFbxfe2R3VrFHbQS7OuHp/PX5zdOlt0s14ns8Xzk7Pj07Ozs9mimy2jdkXLRrFKauuOJm595qLvs5pZb2Y2W9+yPqIPl9xdNsyEsMzczHs2bI3LrLWmZN6sPs8uT7DDJGtKRESEIiRrijWeJXrrO5Na9+lkvL+7c3iwe7CztT1qtop2JuP9ra2d6XhSSmtqpJE0ymo51M98CHKm1a0ajp378J/D9kNzDaF3fYKfV8MEr87YZVJZJ7+3jX1DH482dNg2P7qx+4uDrW+PT07m9YvZ+V//8uvDvYPDopHLq5SRHsMqz1CXClfxHIbRXwsLuWpsGqFIpcnbN4QTDBMclVfjQC7Hpm+msatPXh3rqlUX2eENmKsFmbVXSt4oXX3GRd99fXrxf/3LL04zld3N7cmnB9sf7Y1GSs8mbOhc5DLzzNWTzJjdAFIfAAA/OMNywcuUt2qWYuvs92ppwNwud9CZ6dUQMqQ/t6LLgQmWQ+VQ0nZbDg+343C7prqa864/my/OLhaz2XK27JY1jmv3dDk/Wy7OLy4uLi4uFstl13cR7u6lRNoQNTKGxjNZSjMejSIyIjJiaPRp68x01aLF3Iu3rdUafa2WmZFDP8PV3PaoVuvIrS1lOplMJ9OtyWRr3O6244PReFzKdDzamjZbk9H2ZDIet5PSjIuK5MoyDD4cdlDJyrD09Sovr4dGXA7Xs8t9hZfn+xvn//ZqWeilq97htN1SHpqkf3Kw97NP7t7/b09z2pyZ/uXRsw+/fvLnH9zcGyu7iAwfe4SWdemtrydc2OrxzevfcdUZp6ZCKnR/+fXZb3Vpr//gtefB6o2OdTfVkNxliugWfduOauZ8HpqUZebXZ+f/3xdf3b+YxXg87rqdEn/504/2Xa3kVkK2GjA5vCfzmqcaQOoDAOAHkvpeOQe0N/z99V/6uhy5+SlDyW5Yr3iZEXM1HS4n43Z/0sb+Tp8ZkTU1i3rRdYvaz7tutuzmXd/XWO3H62wZdbms82W36Lqu67q+dn3fdX2Xtetr7fvIoe2lafi5w1j3CJm1TTMaj8fT6Xg0aoq3TTNq2nHbjlpvio8bTUc2DDQfNc2oacZtOy4+Ls20aVu3tinFr2bNe6pd3x1fzRIcSitmauxtj9UbPm5vfbjfQkR4xs3J6Cc3b/zT7t43L07C4/Hp6f/zz/88HZX2g8PdkUZRirvXaCNfyqSpV+tR4Qpf7zLkVfROr7d8ffC7fIfEZM2wzTaUaSFFk+aKktWHmnDahfR4Wf/m20f/9RdfhrlFPyn6+PaND2/ubUlZzcvliMdVwx4eJ5D6AADA78rVGstcFQeHEqJLOZQNU5YqslKsSY1Me2ZeJua+3l4oSX3kss8+o6/R9dHVvqtRI2qtWfs+oq9R63oEu63XnQ4ZJVJScWubpmkaL21xa7y0TWmLN8WL26jYuPVVbSvX29yG9OPKVPSZfcpUig/xr0gaRtvnxtY7fbc6ZkRWZd80zTjizmTrP/7ks//97/7+8enZ3PyL46fjrz7XxP741sFOqC77ppZ2tJ01L+u+aRG2GeOHAmmsakhDPqTU9+vfWHnlqms1t+EJN+RrVx3Kc5kWqSqrUpqrtOoXF2onGvlp3//t10/+5ouHz+bVS5au++iDu//Tzz+NRTeatqVm39VRu6oP58aTEyD1AQCA39WJ7zpGXJ0CN25FylRsDAUfZrKvesOsT1cjs9aMVeZorJEmV+MFM6+mMkhXW6jc5X41o+/y1FpS8Y0S58bEdlumm4oNaWf9/dd/okipYe3mcH+GW+ibJ/O5vvyuFFYyVcN699LU+GAyHn3wwcXp/P/4+78/sTxr4388f6iHY9sefzad7stLtKpuiuG+pQ+p7/IAD/MyVDItXbFRvaWQ9MZn/mqd7/CUspfLfavnl10+O1eVY1kO5fGQqluVFKUsQ7XouMY/Pjr7u88fPjjpvd0Z1Ysbu1v/8c/+5KP93dLV6Ppx431fLS0tU1eDGkwbC7gBUh8AAPgtnvhuXK4joCmGbiCuoqFLjKXSM4tFUSh79at+KCkvq74rfvkdMoZWnetx7L76Gbke0mCRbp6RKbsc6FAjMtVovTfxshJydVo8rNJMRSoilVWW0ayagbopM4eOL2belPWX2rXE+V069lbMpNrPxzYayZvR+D98+tGzs4v/9+svTvvlrMm/u//1ouvqx5/8+xuHU6mvatwVkq/auEqRilVq2by/V9tBiRFv8RIwu3qL4Vrki42unEpFrldnDg2RhrcWemnm0Y2nx3396y+++ZtfPP72eNbVpiwXN3Ynf/Xzz35668bYNW2LddVqjJuy3k66bvhpl6uRAVIfAAD47Z7w2rpj/GVcGNZ8Zko5zFsfMlNkZISU8szMiMwIhcncrYSG/YE2DL1zs5SVVCpkMaS+1HrLXWQqI4aWl0PMHKa6p+flWL+hiebwo8LdymU6tMsVd+npQ9DLzDS5uUtWfPi64UzehmYZ9p3bP5VKefZ9v+yWe5NRdv3ImrvTrb/87ONHF6ezk6fz1KMXL7rT2XYtOz758fZ0p5G5+VVpSq7wYZr9uhNGGaUAACAASURBVKvMRsdOJ0e8xaNguv4mw8bjk5tviQxrZ6uKpdpqiqFxq6LJudkL05Na//HZk//78198/e2x+/bUt7a8/eN7t/7i048npnGk1zpyLWez7d2tyAjluho9dJMdprbzgIHUBwAAfsux7/qStvVCTFOardtVSG4yszSFYqkwdzMfpgUOI/gkUw7L1VJDD/zV+XKmMhRa5xKTDSOpc53BwobenjJ3Ze0ihrEOl4nU1ifcuepMmutdUOYpRV1tMXS7XPuZypCtRjKstijatUrYd0NkhGc7buWZCu+7nXH746OD/+VPfqovxr94+jjSQ/6PX9+fnyz/5z/60Z9/fCOkZtVx1FzDbEa7nDtn68pV+ioDEiHenPeUtupe6+v5hqvjlZvLhze+xFQ1bBkdZkc2WUqVLsweLhf/25f/+ndffHk2623S+Ky/NR398Ycf/NXPbx9M23FmU2NsVkzZlH659LasgybrOkHqAwAAv/Mz35dbF67nQ1jaehx6rleimcUwQtA2KyRaTQxfTzTLq+WUlqseMZfnzbaRL9e9EYcEaJaRud45tZrpd9mYUvFKzwsrknv6utHG8INXZcdVpNT6ctj59t1a8piSSinFIsNKcVkr7bftn31w20opXf38yZNIv1gu/+nRg/O+eza/95effXzQrhZ4jlKT0ihStbfismGrZIRl+qqI2tDH89c+BFLY5VbVvNpvOmwiXbUbUmb2tfbqmzJKufpq1kSrM+mXp/P/9Z/+/u+e3X92dr7VTLcb3ZiWf/fhjf/4px/e2R83yrFUTK2ZMkejUWS/UVs0vZovAVIfAAD4rbvKcHlZHxrWCuZVOtRqJVq+JkcMFad1Krv6eLyhvmbXv1aX4XFzUnVenRav1sLlZlqVDUW+y+iYttGfQ1eJcVP5bh13N5VMhakUuVlKk9RRaf7d0Y3yk59spf/Ttw9mZr619dX5yck/nF90y5/fPfrw6GBqplCddRO3xlp1sZre5yWtVPNlpKLfbkaF5/eveeK/HLgiM/q+GY9Xm1dTkTE8FRtFt5gte5+MJr3padf/969e/PWjR3/z9f1+ZzRu1J+f7462/uKzj//Dj+7d3Z+MLV1qFMVWJURTeim5emPCNwMoVT+Q+gAAwO/eryo3mEke1li5vhVq9YX++tNVX7cIfbufnq8/7c1VzXD4e15PhRl27bT5snT4av3kO1ZOMZObSppCkstNHllk09Tttp3cvbnt3mb5p6ePTvvFwny+6P7P//HfHz258+9/+uOf3rm9X4pCyzRTNpZyReai1j6q2pImNxLfOz371+9amHnTRKqv0We4F2tKSvLwuqyyHDWnjd8/7/76l9/+119+c//8NLwp5zlOHW3v/8UnH/3VT350b2trZFkUni+9U7Iq86VdbeKzlNN7B6Q+AADw+0ghr/+v3Dg3LSVf12/iTclu2Ib39mEr33x1btywdeoLZXi+cpvtO7eB740H3F2+ahY5VCU9Pa1I49ChNX9652g6Hu9+vftfP//lk8WsbcdL5b/ef3B8evbww3s///DOR0c3diwVuYgcFZdS4War1pNkiLeMekUKqaznVmZaX8OUYZbm4ZbmfWT02i5tmj3p6j98/dXffvP4Xx48Pavy0XTSd83F4tObB3/5889+dmf/5vakaO4qLhX59ch3OZRkdfUQC/11L0KA1AcAAH7XAXDo1HJZZluNBn85m9mvTnHvchp71UXDf9VPWN8i81VN7/onb65XffXLvjun1earXZMaxu6FZSrNqqVMVkLbpXx2c288He3uTP7b5189PD7OUCc9Oj45O589ePr8px9//NkHN2/uTMauTiZZcW9cqay1qvbGAs/f5MmfNaJpm2GuSJeqoTSF+7M+v3ry/L99e/8fHjz89mK2kLu3TV0ctqOffXjnLz6796NbB7utIru0pdTaKzsrh3XIMRR4tV6We7WsmY2YIPUBAIDfQbZ79ZRXm9U7s1hHwGt78F7+Fvn6683eodZnlxPSXuWvNBs1y9cuILXX36ThDPs7c0o9rEBddY80VVdIZlkVJpnLrXjmJPKjnenWJx/dHG//3Rdf/fP9B0uzKO1F6hePnz86W/zy6fPP7t3+yYd3d1tNU21KfbbKkXlaY0n56N0MvYCacZvuXaiXwtRL807Pzrq///yrzx89+frk+bmybxuLbKM/GI//6rMf/dmHt350sDWxyL5Xk7GaxWChlxbamq69JtK0sRyZkA5SHwAA+F2c5G6ejm4sPLvKfqvqm9lGqlovutzcbjd0WLnaVTdktXVP0NVK0V91mauZ45LipVBqenUdqV/b8KeXbt1mhr2eB79LTTytSpK7UqvgN0xdd1eRSkrh6vJmlt3bR7d2p7du3fzHbx5/+/jJvO/D7XQ+f3r/wZcnx7949vxnH9z+6c3DW62XqqaqiV4mFVLfWz77rz0sfY1aozePomXG0xeL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AAAAQOoDAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAASH0AAAAAAFIfAAAAAIDUBwAAAAAg9QEAoqNCEQAAD99JREFUAAAASH0AAAAAAFIfAAAAAIDUBwAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAASH0AAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAIDUBwAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAASH0AAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAIDUBwAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAASH0AAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAAFIfAAAAAIDUBwAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAJD6AAAAAACkPgAAAAAAqQ8AAAAAQOoDAAAAAFIfAAAAAIDUBwAAAAAg9QEAAAAASH0AAAAAAFIffqW+7zMzIl665MgA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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">18<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h7 y101 ff2 fs4 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hb y103 ff7 fs3 fc3 sc0 ls2 ws2\">Guide de dé<span class=\"_ _2\"></span>mar<span class=\"_ _2\"></span>rage<span class=\"_ _2\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 hb y104 ff7 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y105 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y105 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y105 ff4 fs2 fc4 sc0 ls2 ws14\">In<span class=\"_ _2\"></span>troduc<span class=\"_ _2\"></span>tion<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y106 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y107 ff2 fs2 fc0 sc0 ls2 ws2\">Bienvenue dans<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le</span> guide <span class=\"ff3 ws14\">d<span class=\"_ _1\"></span>’utilisation</span><span class=\"ls1a\"> <span class=\"ls1e ws16\">du<span class=\"_ _1\"></span></span></span> moteur <span class=\"ls1f ws17\">de</span> jeu <span class=\"_ _9\"></span><span class=\"ff4 ws14\">is::Engine</span>. <span class=\"ls20 ws18\">Ce</span> gui<span class=\"_ _1\"></span>de à pou<span class=\"_ _1\"></span>r objective <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>vous<span class=\"_ _1\"></span> détailler comm<span class=\"_ _2\"></span>ent </div><div class=\"t m0 x6 he y108 ff3 fs2 fc0 sc0 ls2 ws14\">l’API<span class=\"ff2 ws2\"> f<span class=\"_ _2\"></span>onct<span class=\"_ _2\"></span>ionne<span class=\"_ _2\"></span>. </span></div><div class=\"t m0 x1 he y109 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y10a ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y10a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y10a ff4 fs2 fc4 sc0 ls2 ws2\">A <span class=\"_ _2\"></span>propos <span class=\"ls21 ws19\">du</span> m<span class=\"_ _2\"></span>oteur<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y10b ff2 fs2 fc0 sc0 ls2 ws2\">is::Engine <span class=\"_ _a\"></span>est <span class=\"_ _a\"></span>un <span class=\"_ _9\"></span>out<span class=\"_ _1\"></span>il <span class=\"_ _a\"></span>qui <span class=\"_ _a\"></span>se <span class=\"_ _a\"></span>b<span class=\"_ _2\"></span>ase<span class=\"_ _1\"></span> <span class=\"_ _a\"></span>sur <span class=\"_ _9\"></span>les <span class=\"_ _a\"></span>mécanismes<span class=\"_ _1\"></span> <span class=\"_ _a\"></span>de <span class=\"_ _9\"></span>la<span class=\"_ _1\"></span> <span class=\"_ _a\"></span>bibliothèque <span class=\"_ _a\"></span>SFML <span class=\"_ _a\"></span>pour <span class=\"_ _9\"></span>f<span class=\"_ _1\"></span>onctionner. <span class=\"_ _a\"></span>Donc <span class=\"_ _a\"></span>si <span class=\"_ _9\"></span>vou<span class=\"_ _1\"></span>s <span class=\"_ _a\"></span>voulez </div><div class=\"t m0 x6 he y10c ff2 fs2 fc0 sc0 ls2 ws2\">bien <span class=\"_ _1\"></span>u<span class=\"_ _1\"></span>tiliser <span class=\"_ _9\"></span>cet <span class=\"_ _9\"></span>outil <span class=\"_ _9\"></span>il <span class=\"_ _9\"></span>est <span class=\"_ _1\"></span>v<span class=\"_ _1\"></span>ivement <span class=\"_ _9\"></span>conseill<span class=\"_ _1\"></span>é <span class=\"_ _1\"></span>de <span class=\"_ _9\"></span>connait<span class=\"_ _1\"></span>re <span class=\"_ _1\"></span>au<span class=\"_ _9\"></span> <span class=\"_ _b\"> </span><span class=\"ff3\">minimum <span class=\"_ _9\"></span>l<span class=\"_ _1\"></span>es <span class=\"_ _1\"></span>bases<span class=\"_ _1\"></span> <span class=\"_ _1\"></span>de <span class=\"_ _9\"></span>SFML<span class=\"_ _1\"></span>. <span class=\"_ _1\"></span>L’o<span class=\"_ _1\"></span>bjectif <span class=\"_ _1\"></span>d<span class=\"_ _1\"></span>e <span class=\"_ _1\"></span>c<span class=\"_ _1\"></span>e <span class=\"_ _1\"></span>m<span class=\"_ _1\"></span>oteur <span class=\"_ _1\"></span>es<span class=\"_ _1\"></span>t<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 he y10d ff2 fs2 fc0 sc0 ls2 ws2\">de <span class=\"_ _1\"></span>vou<span class=\"_ _1\"></span>s <span class=\"_ _9\"></span>off<span class=\"_ _1\"></span>rir <span class=\"_ _9\"></span>des <span class=\"_ _9\"></span>fonct<span class=\"_ _1\"></span>inna<span class=\"_ _1\"></span>lités <span class=\"_ _9\"></span>qui <span class=\"_ _9\"></span>vous <span class=\"_ _a\"></span>permettent <span class=\"_ _9\"></span>de <span class=\"_ _a\"></span>créer<span class=\"_ _2\"></span> <span class=\"_ _9\"></span>u<span class=\"_ _1\"></span>n <span class=\"_ _9\"></span>jeu <span class=\"_ _9\"></span>av<span class=\"_ _1\"></span>ec <span class=\"_ _9\"></span>le <span class=\"_ _9\"></span>plus<span class=\"_ _1\"></span> <span class=\"_ _9\"></span>de <span class=\"_ _a\"></span>souplesse <span class=\"_ _1\"></span>possible<span class=\"_ _1\"></span> <span class=\"_ _9\"></span>et <span class=\"_ _9\"></span>d<span class=\"_ _1\"></span>e <span class=\"_ _1\"></span>l<span class=\"_ _1\"></span>e <span class=\"_ _a\"></span>por<span class=\"_ _2\"></span>ter </div><div class=\"t m0 x6 he y10e ff2 fs2 fc0 sc0 ls2 ws2\">facilement sur divers<span class=\"_ _1\"></span>es plateformes (Web<span class=\"_ _1\"></span>-HTML5,<span class=\"_ _1\"></span> Windows, Linux, Mo<span class=\"_ _1\"></span>bile). </div><div class=\"t m0 x6 he y10f ff2 fs2 fc0 sc0 ls22 ws1a\">Le<span class=\"ls2 ws2\"> moteur est di<span class=\"_ _1\"></span>rectement li<span class=\"_ _1\"></span>vré avec <span class=\"ls23 ws1b\">un</span> IDE pou<span class=\"_ _1\"></span>r vous <span class=\"_ _1\"></span>éviter<span class=\"_ _1\"></span> les r<span class=\"_ _1\"></span>econfigurations<span class=\"_ _1\"></span> <span class=\"ls24 ws1c\">et</span> <span class=\"_ _1\"></span>de d<span class=\"_ _1\"></span>émarrer rapid<span class=\"_ _1\"></span>ement av<span class=\"_ _1\"></span>ec celui </span></div><div class=\"t m0 x6 he y110 ff2 fs2 fc0 sc0 ls2 ws2\">ci. Not<span class=\"_ _1\"></span>ez <span class=\"_ _1\"></span>que <span class=\"_ _1\"></span>chaque <span class=\"_ _1\"></span>IDE <span class=\"_ _1\"></span>avec <span class=\"_ _1\"></span>le<span class=\"_ _1\"></span>quel <span class=\"_ _1\"></span>le <span class=\"_ _1\"></span>moteur <span class=\"_ _9\"></span>est<span class=\"_ _1\"></span> liv<span class=\"_ _1\"></span>ré <span class=\"_ _1\"></span>permet <span class=\"_ _1\"></span><span class=\"ls1e ws16\">de</span> <span class=\"_ _1\"></span>porter <span class=\"_ _1\"></span>votre <span class=\"_ _1\"></span>proj<span class=\"_ _1\"></span>et s<span class=\"_ _1\"></span>ur u<span class=\"_ _1\"></span>ne <span class=\"_ _1\"></span>plateform<span class=\"_ _1\"></span>e ci<span class=\"_ _1\"></span>ble. <span class=\"_ _1\"></span>Donc <span class=\"_ _1\"></span>le </div><div class=\"t m0 x6 he y111 ff3 fs2 fc0 sc0 ls2 ws2\">projet Mobile Studio<span class=\"_ _1\"></span> vous permet d’utilise<span class=\"_ _1\"></span>r le moteur po<span class=\"_ _1\"></span>ur développer sous<span class=\"_ _1\"></span> Mobile.<span class=\"_ _9\"></span><span class=\"ff2\"> </span></div><div class=\"t m0 x6 hc y112 ff3 fs2 fc0 sc0 ls2 ws14\">L’entête<span class=\"ff2 ws2\"> qui <span class=\"_ _2\"></span>permet<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’a<span class=\"_ _1\"></span>voir<span class=\"ff2 ws2\"> accès à <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> b<span class=\"_ _2\"></span>iblioth<span class=\"_ _1\"></span>èque est : <span class=\"ff9 fc5 ws14\">i<span class=\"_ _2\"></span>sEngi<span class=\"_ _2\"></span>ne/cor<span class=\"_ _2\"></span>e/Ga<span class=\"_ _2\"></span>meEng<span class=\"_ _2\"></span>ine.h<span class=\"ff4 fc6\">.<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y113 ff4 fs2 fc4 sc0 ls1c\">3.</div><div class=\"t m3 xb hd y113 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y113 ff4 fs2 fc4 sc0 ls2 ws2\">Structure <span class=\"_ _2\"></span><span class=\"ls21 ws19\">du<span class=\"ls2 ws2\"> mote<span class=\"_ _2\"></span>ur<span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 hc y114 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y115 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xd hf y116 ff4 fs5 fc0 sc0 ls2 ws2\">is<span class=\"_ _2\"></span>Engi<span class=\"_ _2\"></span>ne <span class=\"_ _c\"> </span><span class=\"ff2 fs2 v3\">act<span class=\"_ _2\"></span>ivit<span class=\"_ _2\"></span>y <span class=\"_ _d\"> </span><span class=\"v4\">con<span class=\"_ _2\"></span>fig </span></span></div><div class=\"t m0 x1 h10 y117 ff2 fs6 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 h11 y118 ff2 fs5 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 h11 y119 ff2 fs5 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 h11 y11a ff2 fs5 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xe h12 y11b ff4 fs5 fc0 sc0 ls2 ws2\">ass<span class=\"_ _2\"></span>ets </div><div class=\"t m0 xf h6 y11c ff4 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xf h6 y11d ff4 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xf h6 y28 ff4 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xf h6 y11e ff4 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x10 h13 y11f ff2 fs3 fc0 sc0 ls2 ws2\">Fic<span class=\"_ _2\"></span>hier<span class=\"_ _4\"></span> </div><div class=\"t m0 xd h6 y120 ff4 fs3 fc0 sc0 ls2 ws2\">ma<span class=\"_ _2\"></span>in.c<span class=\"_ _2\"></span>pp </div><div class=\"t m0 x11 h12 y118 ff4 fs5 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x11 h12 y121 ff4 fs5 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x12 h12 y100 ff4 fs5 fc0 sc0 ls2 ws2\">app_<span class=\"_ _2\"></span>src<span class=\"_ _2\"></span> </div><div class=\"t m0 x13 he y122 ff2 fs2 fc0 sc0 ls2 ws2\">game<span class=\"_ _2\"></span>syste<span class=\"_ _2\"></span> </div><div class=\"t m0 x14 he y123 ff2 fs2 fc0 sc0 ls2 ws2\">m_e<span class=\"_ _2\"></span>xt </div><div class=\"t m0 x15 he y124 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x15 he y125 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x14 he y126 ff2 fs2 fc0 sc0 ls2 ws2\">lan<span class=\"_ _2\"></span>guage </div><div class=\"t m0 x1 he y127 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 h14 y128 ff2 fs7 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x16 h14 y129 ff2 fs7 fc0 sc0 ls2 ws2\">Le je<span class=\"_ _4\"></span>u </div><div class=\"t m0 x17 he y12a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x18 he y12b ff2 fs2 fc0 sc0 ls2 ws2\">sce<span class=\"_ _2\"></span>nes </div><div class=\"t m0 x19 he y12c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x19 he y12d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1a he y12e ff2 fs2 fc0 sc0 ls2 ws2\">obj<span class=\"_ _2\"></span>ects </div><div class=\"t m0 x1b he y12f ff2 fs2 fc0 sc0 ls2 ws2\">leve<span class=\"_ _2\"></span>ls </div><div class=\"t m0 x1 he y130 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y131 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y132 ff4 fs2 fc4 sc0 ls2 ws14\">3.1</div><div class=\"t m3 x1c hd y132 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y132 ff4 fs2 fc4 sc0 ls2 ws14\">app<span class=\"_ _2\"></span>_src<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y133 ff2 fs2 fc0 sc0 ls2 ws2\">Repertoire qui <span class=\"_ _4\"></span>conti<span class=\"_ _1\"></span>ent <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>code source <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>jeu. </span></span></div><div class=\"t m0 x6 he yb7 ff2 fs2 fc0 sc0 ls2 ws2\">Description de ces <span class=\"_ _1\"></span>sous-répertoires:<span class=\"_ _1\"></span> </div><div class=\"t m2 xa h15 y134 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y134 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y134 ff4 fs2 fc0 sc0 ls2 ws2\">activity: <span class=\"ff2\">Contient la classe </span>Activity <span class=\"ff9\">(cliquer ici <span class=\"fc7 ls25\">1 </span>pour plus <span class=\"ffb ws14\">d’info)</span> <span class=\"ff2\">qui <span class=\"_ _2\"></span>permet<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> lancer les <span class=\"_ _2\"></span>diff<span class=\"_ _1\"></span>érentes scènes </span></span></span></span></div><div class=\"t m0 xc he y135 ff3 fs2 fc0 sc0 ls2 ws2\">du jeu et d’assurer leu<span class=\"_ _1\"></span>rs interactions.<span class=\"_ _1\"></span><span class=\"ff2\"> </span></div><div class=\"t m2 xa h15 y136 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y136 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y136 ff4 fs2 fc0 sc0 ls2 ws2\">config: <span class=\"ff2\">Contient le fichie<span class=\"_ _1\"></span>r </span>GameCo<span class=\"_ _1\"></span>nfig.cpp <span class=\"ff9\">(c<span class=\"_ _1\"></span>liquer ici <span class=\"fc7 ls25\">1 </span><span class=\"ffb\">pour plus <span class=\"_ _1\"></span>d’info) <span class=\"ff2\">qui <span class=\"_ _1\"></span>permet de définir l<span class=\"_ _1\"></span>es </span></span></span></div><div class=\"t m0 xc hc y137 ff2 fs2 fc0 sc0 ls2 ws2\">paramètres généraux du jeu. Il contient aussi <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>fichi<span class=\"_ _1\"></span>er <span class=\"ff4\">ExtraConfig.cpp<span class=\"_ _1\"></span> </span>qui <span class=\"_ _2\"></span>permet<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’activer</span> / <span class=\"_ _2\"></span>désactiver </div><div class=\"t m0 xc he y138 ff2 fs2 fc0 sc0 ls2 ws2\">certaines fonctionnal<span class=\"_ _1\"></span>ités du moteur.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa h15 y139 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y139 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y139 ff4 fs2 fc0 sc0 ls2 ws2\">gamesystem_ext: <span class=\"ff2\">Contient une <span class=\"_ _2\"></span>classe dérivée <span class=\"ff9\">(cliquer <span class=\"_ _2\"></span>ici<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc7\">1 <span class=\"fc0\">pour plus <span class=\"ffb ws14\">d’info)</span> <span class=\"ff2 ls1e ws16\">de</span><span class=\"ff2\"> <span class=\"_ _4\"></span><span class=\"ff4\">G<span class=\"_ _1\"></span>ameSystem <span class=\"ff9\">(cl<span class=\"_ _1\"></span>iquer ici <span class=\"_ _2\"></span><span class=\"fc7 ws14\">1<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 xc hc y13a ff9 fs2 fc0 sc0 ls2 ws2\">pour p<span class=\"_ _2\"></span>lus<span class=\"_ _1\"></span> <span class=\"ffb ws14\">d<span class=\"_ _2\"></span>’info)<span class=\"_ _1\"></span><span class=\"ff9 ws2\"> <span class=\"ff2\">qui permet <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> manipuler <span class=\"_ _2\"></span>les<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>données du<span class=\"_ _1\"></span> je<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span> (sauvegarde,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>chargement, ...<span class=\"_ _2\"></span>). </span></span></span></span></span></div><div class=\"t m2 xa h15 y13b ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y13b ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y13b ff4 fs2 fc0 sc0 ls2 ws2\">language: <span class=\"ff2\">Contient <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>fichier<span class=\"_ _1\"></span> <span class=\"ff4\">GameLanguage.cpp <span class=\"ff9\">(cliqu<span class=\"_ _1\"></span>er ici <span class=\"fc7 ls25\">1 </span>pour <span class=\"_ _2\"></span><span class=\"ffb\">plus d’info)<span class=\"_ _1\"></span><span class=\"ff9\"> <span class=\"ff2\">qui permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> gérer tout ce </span></span></span></span></span></span></span></span></div><div class=\"t m0 xc he y13c ff2 fs2 fc0 sc0 ls2 ws2\">qui concerne les langues <span class=\"_ _1\"></span>du j<span class=\"_ _1\"></span>eu. </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf12\" class=\"pf w0 h0\" data-page-no=\"12\"><div class=\"pc pc12 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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DwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDq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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">19<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h7 y101 ff2 fs4 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y13d ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y13d ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y13d ff4 fs2 fc0 sc0 ls2 ws2\">levels: <span class=\"ff2\">Contient les niveaux <span class=\"ls24 ws1c\">et</span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> fichier <span class=\"ff4\">Level.h <span class=\"ff9\">(cliquer ici <span class=\"fc7\">1 </span>pour plus <span class=\"ffb\">d’info) </span></span></span>qui permet <span class=\"ls1e ws16\">de</span> les intégrer dans </span></span></span></div><div class=\"t m0 xc he y13e ff2 fs2 fc0 sc0 ls2 ws2\">le jeu. </div><div class=\"t m2 xa h15 y13f ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y13f ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y13f ff4 fs2 fc0 sc0 ls2 ws2\">objects: <span class=\"_ _2\"></span><span class=\"ff2\">Conti<span class=\"_ _1\"></span>ent les <span class=\"_ _2\"></span>objets qui <span class=\"_ _2\"></span>sero<span class=\"_ _1\"></span>nt <span class=\"_ _2\"></span>util<span class=\"_ _1\"></span>isés dans <span class=\"_ _4\"></span>l<span class=\"_ _1\"></span>es différent<span class=\"_ _1\"></span>es <span class=\"_ _2\"></span>scène<span class=\"_ _2\"></span>s. </span></div><div class=\"t m2 xa h15 y140 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y140 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y140 ff4 fs2 fc0 sc0 ls2 ws2\">scenes: <span class=\"ff2\">Contient <span class=\"_ _2\"></span>les différentes scènes <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>jeu <span class=\"_ _2\"></span><span class=\"ff9\">(cliqu<span class=\"_ _1\"></span>er ici <span class=\"fc7\">1 <span class=\"_ _2\"></span><span class=\"fc0\">pour plus <span class=\"ffb ws14\">d’info)</span> <span class=\"ff2\">(Introduction,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>Menu principal, ..<span class=\"_ _2\"></span>.). </span></span></span></span></span></div><div class=\"t m0 x1 he y141 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y142 ff4 fs2 fc4 sc0 ls2 ws14\">3.2</div><div class=\"t m3 x1c hd y142 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y142 ff4 fs2 fc4 sc0 ls2 ws14\">is<span class=\"_ _2\"></span>Engin<span class=\"_ _2\"></span>e<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y143 ff2 fs2 fc0 sc0 ls2 ws2\">Repertoire qui <span class=\"_ _2\"></span>conti<span class=\"_ _1\"></span>ent <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>co<span class=\"_ _1\"></span>de source <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> moteur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> je<span class=\"_ _4\"></span>u. </span></span></span></span></div><div class=\"t m2 xa hc y144 ff4 fs2 fc4 sc0 ls2 ws14\">3.3</div><div class=\"t m3 x1c hd y144 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y144 ff4 fs2 fc4 sc0 ls2 ws14\">ass<span class=\"_ _2\"></span>ets<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y145 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y146 ff2 fs2 fc0 sc0 ls2 ws2\">Repertoire des <span class=\"_ _4\"></span>fichi<span class=\"_ _1\"></span>ers ressources<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>jeu <span class=\"_ _2\"></span>(<span class=\"_ _1\"></span>musiques, effets <span class=\"_ _2\"></span>sonor<span class=\"_ _1\"></span>es, <span class=\"_ _2\"></span>images, ...). </span></span></div><div class=\"t m2 xa hc y147 ff4 fs2 fc4 sc0 ls2 ws14\">3.4</div><div class=\"t m3 x1c hd y147 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y147 ff4 fs2 fc4 sc0 ls2 ws2\">Fichier <span class=\"_ _2\"></span>main.<span class=\"_ _2\"></span>cpp<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y148 ff2 fs2 fc0 sc0 ls20 ws18\">Ce<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>fichier contient <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>fonction qui permet <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>lancer<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> pr<span class=\"_ _2\"></span>ogramme<span class=\"_ _4\"></span>.<span class=\"_ _1\"></span> </span></span></span></div><div class=\"t m2 xa hc y149 ff4 fs2 fc4 sc0 ls2 ws14\">3.4.1</div><div class=\"t m3 x1e hd y149 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y149 ff4 fs2 fc4 sc0 ls2 ws14\">ma<span class=\"_ _2\"></span>in<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc yeb ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y14a ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">m<span class=\"_ _2\"></span>ain() </span></div><div class=\"t m0 x6 hc y14b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y14c ff2 fs2 fc0 sc0 ls22 ws1a\">La<span class=\"ls2 ws2\"> fon<span class=\"_ _2\"></span>ction <span class=\"_ _1\"></span>principale <span class=\"_ _1\"></span>qui pe<span class=\"_ _1\"></span>rmet <span class=\"ls1e ws16\">de</span> lancer <span class=\"ls27 ws1d\">le</span> moteur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>jeu.<span class=\"_ _1\"></span> A <span class=\"ff3 ws14\">l’intérieur</span> <span class=\"ff3 ws14\">d’elle</span> <span class=\"_ _2\"></span>vous<span class=\"_ _1\"></span> trouverez <span class=\"_ _1\"></span><span class=\"ff9\">GameEngine <span class=\"_ _1\"></span>game;<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff2\">qu<span class=\"_ _2\"></span>i </span></span></span></div><div class=\"t m0 x6 he y14d ff2 fs2 fc0 sc0 ls2 ws2\">permet <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’initial<span class=\"_ _1\"></span>iser<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d\">le <span class=\"ls2\">moteur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>je<span class=\"_ _2\"></span>u.<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x6 hc y14e ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fcb\">0 <span class=\"_ _e\"> </span><span class=\"fc0\">quand <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> progra<span class=\"_ _1\"></span>mme <span class=\"ff3 ws14\">c’est</span> b<span class=\"_ _2\"></span>ien terminé <span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span></span> une <span class=\"_ _2\"></span>autre<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>valeu<span class=\"_ _1\"></span>r <span class=\"ff3 ws14\">s’il</span> y <span class=\"_ _2\"></span>a une erreur lors <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’é<span class=\"_ _2\"></span>xécu<span class=\"_ _2\"></span>tion.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y14f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y150 ff4 fs2 fc4 sc0 ls2 ws14\">3.4.2</div><div class=\"t m3 x1e hd y150 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y150 ff4 fs2 fc4 sc0 ls2 ws14\">gam<span class=\"_ _2\"></span>e.pla<span class=\"_ _2\"></span>y<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y121 ff2 fs2 fc0 sc0 ls2 ws2\">game<span class=\"_ _2\"></span>.pl<span class=\"_ _2\"></span>ay() </div><div class=\"t m0 x6 hc y151 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y152 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y153 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’utiliser</span><span class=\"ls1a\"> <span class=\"ls1d ws15\">la</span></span> boucle p<span class=\"_ _1\"></span>rincipale <span class=\"ls1e ws16\">du<span class=\"_ _1\"></span></span> moteur <span class=\"_ _1\"></span>qui pe<span class=\"_ _1\"></span>rmet <span class=\"ls1f ws17\">de</span> lancer l<span class=\"_ _1\"></span>es <span class=\"_ _1\"></span>différentes sc<span class=\"_ _1\"></span>ènes <span class=\"ls1e ws16\">du<span class=\"_ _1\"></span></span> jeu (I<span class=\"_ _1\"></span>ntroduction,<span class=\"_ _1\"></span> M<span class=\"_ _2\"></span>en<span class=\"_ _2\"></span>u </div><div class=\"t m0 x6 he y154 ff2 fs2 fc0 sc0 ls2 ws2\">principal, <span class=\"_ _2\"></span><span class=\"ff3 ws14\">…)<span class=\"_ _4\"></span>.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m2 xa hc y155 ff4 fs2 fc4 sc0 ls2 ws14\">3.4.3</div><div class=\"t m3 x1e hd y155 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y155 ff4 fs2 fc4 sc0 ls2 ws14\">gam<span class=\"_ _2\"></span>e.basi<span class=\"_ _2\"></span>cSFML<span class=\"_ _2\"></span>main<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y156 ff2 fs2 fc0 sc0 ls2 ws2\">game<span class=\"_ _2\"></span>.bas<span class=\"_ _2\"></span>icSF<span class=\"_ _2\"></span>MLmain<span class=\"_ _2\"></span>() </div><div class=\"t m0 x6 hc y157 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y158 ff3 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"_ _1\"></span>d<span class=\"_ _1\"></span>’afficher <span class=\"_ _9\"></span>une <span class=\"_ _9\"></span>fenêtr<span class=\"_ _1\"></span>e <span class=\"_ _1\"></span>SFML<span class=\"_ _1\"></span><span class=\"ff2 ls26\"> </span>c<span class=\"_ _1\"></span>lassiqu<span class=\"_ _1\"></span>e. <span class=\"_ _1\"></span>C<span class=\"_ _1\"></span>ette <span class=\"_ _1\"></span>f<span class=\"_ _1\"></span>onction <span class=\"_ _9\"></span>vous <span class=\"_ _9\"></span>permet <span class=\"_ _9\"></span>d’util<span class=\"_ _1\"></span>iser <span class=\"_ _1\"></span>v<span class=\"_ _1\"></span>otre <span class=\"_ _9\"></span>propre <span class=\"_ _9\"></span>boucl<span class=\"_ _1\"></span>e <span class=\"_ _1\"></span>de<span class=\"_ _1\"></span> <span class=\"_ _1\"></span>r<span class=\"_ _1\"></span>endu <span class=\"_ _1\"></span>a<span class=\"_ _1\"></span>vec<span class=\"_ _9\"></span><span class=\"ff2\"> </span></div><div class=\"t m0 x6 he y159 ff2 fs2 fc0 sc0 ls1d ws15\">le<span class=\"ls2 ws2\"> moteur. Très util<span class=\"_ _1\"></span>e <span class=\"ls28 ws1e\">si</span> vous désir<span class=\"_ _1\"></span>ez utiliser <span class=\"ls23 ws1b\">un</span> projet SF<span class=\"_ _1\"></span>ML déjà <span class=\"ls29 ws1f\">en</span> cour <span class=\"_ _1\"></span><span class=\"ls1e ws16\">de</span> développ<span class=\"_ _1\"></span>ement avec<span class=\"_ _1\"></span> </span>le<span class=\"ls2 ws2\"> moteur <span class=\"ls2a ws20\">ou<span class=\"_ _1\"></span></span> <span class=\"ff3\">d’intégrer </span></span></div><div class=\"t m0 x6 he y15a ff2 fs2 fc0 sc0 ls2 ws2\">vos propres composant<span class=\"_ _1\"></span> au moteur.<span class=\"_ _1\"></span> </div><div class=\"t m0 x1 he y15b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y15c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc ya5 ff9 fs2 fc3 sc0 ls2 ws14\">Di<span class=\"_ _2\"></span>spla<span class=\"_ _2\"></span>y<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y15d ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m5 xa hc y15e ff4 fs2 fc4 sc0 ls2b\">1.</div><div class=\"t m6 xb hd y15e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y15e ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Game<span class=\"_ _1\"></span>Display </div><div class=\"t m0 x6 hc y15f ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">GameDisplay;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y160 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/disp<span class=\"_ _2\"></span>lay/Ga<span class=\"_ _2\"></span>meDi<span class=\"_ _2\"></span>spla<span class=\"_ _2\"></span>y.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc y161 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y162 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y163 ff2 fs2 fc0 sc0 ls2 ws2\">Classe abstraite <span class=\"_ _2\"></span>qui <span class=\"_ _1\"></span>permet <span class=\"ls1e ws16\">de</span> créer <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scène <span class=\"ff3 ws14\">d’un</span> <span class=\"_ _2\"></span>jeu. Une scène e<span class=\"_ _2\"></span>st<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> <span class=\"_ _1\"></span>endroit <span class=\"ls2a ws20\">où</span> les objets <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>jeu prennent vie (M<span class=\"_ _2\"></span>enu </span></span></span></span></div><div class=\"t m0 x6 he y164 ff2 fs2 fc0 sc0 ls2 ws2\">Principal, Niveau, <span class=\"_ _2\"></span><span class=\"ff3\">…). Cette<span class=\"ff2\"> class<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>vous offre <span class=\"_ _2\"></span>des foncti<span class=\"_ _1\"></span>ons q<span class=\"_ _2\"></span>ui<span class=\"_ _1\"></span> vous <span class=\"_ _4\"></span>p<span class=\"_ _1\"></span>ermettent<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> manipuler<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>facilement<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> v<span class=\"_ _2\"></span>ue<span class=\"_ _2\"></span>, </span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf13\" class=\"pf w0 h0\" data-page-no=\"13\"><div class=\"pc pc13 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcQQ3EIBBA0Z1NvYCH6qiiqqkPaotZB3vhQuA9BTCZyw9NIzM/AAAALOprBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPiMAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUZAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwgAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH1GAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAA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oPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAODXvh2bIAyEYRjmBxcIZIAr3MU+QsBtrC0FS2cIjuAQQopAbpOztBKbILnwPN2V+XJF3iKqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABYws4Em1RKMULtIsIIAAAs8GEpDzap67phGOxQtXmeU0p2AABA9QEAAPCV//oAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+jkKzA8AAAC+SURBVAAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAIDVVN/1cI+IiOfxlsc+4rF/Nafz59xcch77iFoftG3bqMo0Ta4nAAA/lQp5a//1BpM+/EVW1GR9AAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">20<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h7 y101 ff2 fs4 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">appliquer les <span class=\"_ _2\"></span>évenements<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> fenêtre <span class=\"_ _2\"></span>sur <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scène, <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>faire des <span class=\"_ _2\"></span>animations sur des <span class=\"_ _2\"></span>textes<span class=\"_ _1\"></span> <span class=\"ls29 ws1f\">et</span> <span class=\"_ _2\"></span>sprites,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>affich<span class=\"_ _1\"></span>er des boi<span class=\"_ _2\"></span>tes </span></span></div><div class=\"t m0 x6 he y6f ff2 fs2 fc0 sc0 ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>dialogu<span class=\"_ _1\"></span>e, <span class=\"_ _2\"></span><span class=\"ff3 ws14\">…<span class=\"_ _2\"></span><span class=\"ff2 ws2\"> </span></span></span></div><div class=\"t m5 xa hc y166 ff4 fs2 fc4 sc0 ls2b\">2.</div><div class=\"t m6 xb hd y166 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y166 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>méthodes p<span class=\"_ _2\"></span>ubliq<span class=\"_ _2\"></span>ues<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y167 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y167 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y167 ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Dis<span class=\"_ _2\"></span>play<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y168 ff2 fs2 fc0 sc0 ls2 ws2\">Gam<span class=\"_ _2\"></span>eDis<span class=\"_ _2\"></span>play(<span class=\"_ _2\"></span>GameS<span class=\"_ _2\"></span>ystemEx<span class=\"_ _2\"></span>tende<span class=\"_ _2\"></span>d <span class=\"_ _a\"></span>&amp;ga<span class=\"_ _2\"></span>meSys<span class=\"_ _2\"></span>Ext, <span class=\"_ _a\"></span>s<span class=\"_ _2\"></span>f::Col<span class=\"_ _2\"></span>or <span class=\"_ _a\"></span>bg<span class=\"_ _2\"></span>Colo<span class=\"_ _2\"></span>r) </div><div class=\"t m0 x6 hc y169 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y16a ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui per<span class=\"_ _2\"></span>met<span class=\"_ _1\"></span> de créer <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>object GameDisplay, elle pren<span class=\"_ _2\"></span>d<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> paramètre <span class=\"ls23 ws1b\">un</span> <span class=\"_ _2\"></span>objet G<span class=\"_ _2\"></span>ameSy<span class=\"_ _2\"></span>stemExt<span class=\"_ _2\"></span>ende<span class=\"_ _2\"></span>d </span></span></span></span></div><div class=\"t m0 x6 hc y16b ff9 fs2 fc0 sc0 ls2 ws2\">(cliquer ici <span class=\"ff4 fc7\">1 </span>p<span class=\"_ _2\"></span>our plus<span class=\"_ _1\"></span> <span class=\"ffb ws14\">d’info)</span> <span class=\"ff2 ls24 ws1c\">et</span><span class=\"ff2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>couleur <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>fond <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scè<span class=\"_ _2\"></span>ne. </span></span></span></div><div class=\"t m0 x1 he y16c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y16d ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y16d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y16d ff4 fs2 fc4 sc0 ls2 ws14\">st<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y16e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0\">step() = <span class=\"fcb ws14\">0<span class=\"_ _4\"></span><span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y16f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y170 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y171 ff2 fs2 fc0 sc0 ls2 ws2\">Méthode qui permet <span class=\"ff3 ws14\">d’impléme<span class=\"_ _1\"></span>nter</span> <span class=\"ls1d ws15\">la</span> partie <span class=\"ls2a ws20\">où</span> les obje<span class=\"_ _2\"></span>ts<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scène sont mise à jour (déplacement<span class=\"_ _1\"></span> des objets, </div><div class=\"t m0 x6 he y172 ff3 fs2 fc0 sc0 ls2 ws2\">détections de collision,<span class=\"_ _1\"></span> …).<span class=\"ff2\"> </span></div><div class=\"t m0 x6 hc y173 ff9 fs2 fc0 sc0 ls2 ws2\">Note : Lorsque <span class=\"ls2f ws22\">le</span> <span class=\"_ _2\"></span>SDM es<span class=\"_ _1\"></span>t activé <span class=\"ls30 ws23\">et</span> que l&apos;utilisateur <span class=\"ls31 ws24\">ne</span> surcharge pas cette <span class=\"_ _2\"></span>fonctio<span class=\"_ _1\"></span>n, <span class=\"ls2f ws22\">le</span> SDM <span class=\"_ _2\"></span>prend soin d&apos;appeler </div><div class=\"t m0 x6 hc y174 ff9 fs2 fc0 sc0 ls2 ws2\">cette méthode pour m<span class=\"_ _1\"></span>ettre à jour automatiqu<span class=\"_ _1\"></span>ement les obj<span class=\"_ _1\"></span>ets de la scène <span class=\"_ _9\"></span>et les événements d<span class=\"_ _1\"></span>e la fenêtre.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y175 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y175 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y175 ff4 fs2 fc4 sc0 ls2 ws14\">dr<span class=\"_ _2\"></span>aw<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y176 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y177 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0\">draw()<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>=<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fcb ws14\">0<span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y178 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y179 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y17a ff2 fs2 fc0 sc0 ls2 ws2\">Méthode qui <span class=\"_ _2\"></span>pe<span class=\"_ _1\"></span>rmet <span class=\"ff3 ws14\">d’implémenter</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>partie <span class=\"ls2a ws20\">où</span> les <span class=\"_ _2\"></span>objets<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scène seront dé<span class=\"_ _2\"></span>ssiné<span class=\"_ _2\"></span>s. </span></span></div><div class=\"t m0 x6 hc y17b ff9 fs2 fc0 sc0 ls2 ws2\">Note : Lorsque <span class=\"ls2f ws22\">le</span> <span class=\"_ _4\"></span>S<span class=\"_ _1\"></span>DM est activé <span class=\"ls30 ws23\">et</span> que l&apos;utilisateur <span class=\"ls31 ws24\">ne</span> surcharge <span class=\"ls32 ws25\">pas</span> <span class=\"_ _2\"></span>cette<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>fon<span class=\"_ _1\"></span>ction,<span class=\"_ _1\"></span> <span class=\"ls2f ws22\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> SDM prend <span class=\"_ _2\"></span>soin d&apos;a<span class=\"_ _1\"></span>ppeler </span></span></div><div class=\"t m0 x6 hc y17c ff9 fs2 fc0 sc0 ls2 ws2\">cette méthode pour <span class=\"_ _1\"></span>af<span class=\"ffb ls2d\">𝑓</span>icher automatiqu<span class=\"_ _1\"></span>ement les ob<span class=\"_ _1\"></span>jets de la scène.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y17d ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y17d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y17d ff4 fs2 fc4 sc0 ls2 ws2\">dra<span class=\"_ _2\"></span>wScree<span class=\"_ _2\"></span>n </div><div class=\"t m0 x6 hc y17e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">drawSc<span class=\"_ _1\"></span>reen() </span></span></div><div class=\"t m0 x6 hc y17f ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y180 ff2 fs2 fc0 sc0 ls2 ws2\">Méthode qui <span class=\"_ _2\"></span>permet<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>affic<span class=\"_ _1\"></span>her<span class=\"ff2 ws2\"> les <span class=\"_ _2\"></span>objets<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scène<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y181 ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y181 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y181 ff4 fs2 fc4 sc0 ls2 ws14\">show<span class=\"_ _2\"></span>Temp<span class=\"_ _2\"></span>Loadin<span class=\"_ _2\"></span>g<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y182 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y183 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">showTempLoad<span class=\"_ _1\"></span>ing(</span>float <span class=\"fc0\">time = <span class=\"_ _4\"></span><span class=\"fcb ls2e ws26\">3.f<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> * i<span class=\"_ _2\"></span>s::S<span class=\"_ _2\"></span>ECOND<span class=\"fc0\">) </span></span></span></span></span></div><div class=\"t m0 x1 he y184 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y185 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y186 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>affich<span class=\"_ _1\"></span>er<span class=\"ff2 ws2\"> <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>faux écra<span class=\"_ _1\"></span>n <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>chargement<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>(Utile<span class=\"_ _1\"></span> pour <span class=\"_ _2\"></span>faire des <span class=\"_ _2\"></span>transitions dans <span class=\"_ _1\"></span><span class=\"ls1d ws15\">la</span> même <span class=\"_ _2\"></span>scène<span class=\"_ _2\"></span>). </span></span></span></span></div><div class=\"t m0 x6 hc y187 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"fc0\">time <span class=\"ff2\">représente <span class=\"ls1d ws15\">la</span> duré<span class=\"_ _2\"></span>e (en <span class=\"_ _2\"></span>milliseconde)<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">du</span> <span class=\"_ _4\"></span>charge<span class=\"_ _2\"></span>ment<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y188 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y189 ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y189 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y189 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tOption<span class=\"_ _2\"></span>Inde<span class=\"_ _2\"></span>x<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y18a ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y18a ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y18a ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _2\"></span>forme :<span class=\"_ _4\"></span> </div><div class=\"t m0 x1 hc y18b ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y18c ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setOptionIndex<span class=\"_ _1\"></span>(</span>int <span class=\"fc0\">optionIndexValue, </span>bool <span class=\"_ _2\"></span><span class=\"fc0\">c<span class=\"_ _1\"></span>allWhenClick,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">buttonSc<span class=\"_ _1\"></span>ale = <span class=\"_ _4\"></span><span class=\"fcb ws14\">1.3f<span class=\"fc0 ws2\">) </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y18d ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y18e ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y18f ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>faire<span class=\"_ _1\"></span> des <span class=\"_ _4\"></span>a<span class=\"_ _1\"></span>nimations<span class=\"_ _1\"></span> sur des textes <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> jouer <span class=\"ls2c ws21\">un</span> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>on quand <span class=\"ls33 ws27\">on<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> change une o<span class=\"_ _2\"></span>ption<span class=\"_ _2\"></span>. </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf14\" class=\"pf w0 h0\" data-page-no=\"14\"><div class=\"pc pc14 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoP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6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAGK7gBkAAAEFSURBVKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAJyuvvv8TJK8r49el+R12af1dszT1ntdklEXLaVkKK017wkAwE+fAbnaf30BrckQZVRcp1EAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">21<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h7 y101 ff2 fs4 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y13d ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y13d ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y13d ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>forme :<span class=\"_ _4\"></span> </div><div class=\"t m0 x1 hc y190 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y191 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setOptionIndex<span class=\"_ _1\"></span>(</span>int <span class=\"fc0\">o<span class=\"_ _2\"></span>ption<span class=\"_ _2\"></span>Inde<span class=\"_ _2\"></span>xValu<span class=\"_ _2\"></span>e) </span></span></div><div class=\"t m0 x6 hc y192 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y193 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y194 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> change une <span class=\"_ _2\"></span>option<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y10a ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y10a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y10a ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tText<span class=\"_ _2\"></span>Animat<span class=\"_ _2\"></span>ion<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y195 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y195 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y195 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _2\"></span>forme :<span class=\"_ _4\"></span> </div><div class=\"t m0 x1 hc y196 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y197 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0\">setTextAnimation(sf::T<span class=\"_ _1\"></span>ext &amp;txt, <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>f::Sprite &amp;spr, <span class=\"_ _2\"></span><span class=\"fc8\">int <span class=\"fc0\">v<span class=\"_ _4\"></span>al) </span></span></span></span></div><div class=\"t m0 x6 hc y198 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y199 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y19a ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>faire<span class=\"_ _1\"></span> une <span class=\"_ _2\"></span>animation sur <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>tex<span class=\"_ _1\"></span>te <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> sprite <span class=\"ls29 ws1f\">en<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> fonction <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>choix<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>ne<span class=\"ff2 ws2\"> opti<span class=\"_ _2\"></span>on. </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa h15 y19b ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y19b ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y19b ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>forme :<span class=\"_ _4\"></span> </div><div class=\"t m0 x1 hc y19c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y19d ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0\">setTextAnimati<span class=\"_ _1\"></span>on(sf::Text<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;txt, <span class=\"fc8\">int </span>&amp;var, <span class=\"_ _4\"></span><span class=\"fc8\">int<span class=\"_ _1\"></span> <span class=\"fc0\">v<span class=\"_ _2\"></span>al<span class=\"_ _2\"></span>) </span></span></span></span></div><div class=\"t m0 x6 hc y19e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y19f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1a0 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> faire <span class=\"_ _2\"></span>une animation sur <span class=\"ls23 ws1b\">un</span> <span class=\"_ _4\"></span>text<span class=\"_ _1\"></span>e <span class=\"ls24 ws1c\">en</span> <span class=\"_ _2\"></span>fonctio<span class=\"_ _1\"></span>n du choix <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>une<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>optio<span class=\"_ _2\"></span>n. </span></span></span></span></div><div class=\"t m2 xa hc y1a1 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y1a1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1a1 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tView<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y1a2 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y1a2 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1a2 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _2\"></span>forme :<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y1a3 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">setVi<span class=\"_ _2\"></span>ew() </span></span></div><div class=\"t m0 x1 he y1a4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y1a5 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y1a5 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1a5 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>forme :<span class=\"_ _4\"></span> </div><div class=\"t m0 x1 hc y1a6 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1a7 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0\">setView(s<span class=\"_ _1\"></span>f::Vector2f<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"ls34 ws28\">v)<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y1a8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y1a9 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y1a9 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1a9 ff9 fs2 fc0 sc0 ls2 ws2\">Troisième <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>orme :<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y1aa ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setView(</span>float <span class=\"fc0 ls35\">x, </span>float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ls34 ws28\">y)<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x1 he y12c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ab ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1ac ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1ad ff2 fs2 fc0 sc0 ls2 ws2\">Met <span class=\"_ _2\"></span>à jour <span class=\"ls1d ws15\">la</span> position <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>v<span class=\"_ _1\"></span>ue dans <span class=\"ls1d ws15\">la</span> scè<span class=\"_ _2\"></span>ne. </span></span></div><div class=\"t m2 xa hc y1ae ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y1ae ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1ae ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tView<span class=\"_ _2\"></span>VarX<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1af ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1b0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setViewVarX(</span>float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">va<span class=\"_ _2\"></span>l) </span></span></div><div class=\"t m0 x6 hc y1b1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1b2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1b3 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir la variable <span class=\"ff4 ws14\">m_<span class=\"_ _2\"></span>viewX<span class=\"_ _2\"></span><span class=\"ff2 ws2\">. </span></span></div><div class=\"t m0 x1 he y1b4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1b5 ff4 fs2 fc4 sc0 ls2 ws14\">2.10</div><div class=\"t m3 x20 hd y1b5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1b5 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tView<span class=\"_ _2\"></span>VarY </div><div class=\"t m0 x6 hc y1b6 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setViewVa<span class=\"_ _1\"></span>rY(<span class=\"fc8 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc y1b7 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1b8 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir la variable <span class=\"ff4 ws14\">m_<span class=\"_ _2\"></span>viewY<span class=\"_ _2\"></span><span class=\"ff2 ws2\">. </span></span></div><div class=\"t m0 x1 he y1b9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ba ff4 fs2 fc4 sc0 ls2 ws14\">2.11</div><div class=\"t m3 x20 hd y1ba ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ba ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tView<span class=\"_ _2\"></span>VarXY<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1bb ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1bc ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setViewVar<span class=\"_ _1\"></span>XY(<span class=\"fc8 ws2\">fl<span class=\"_ _1\"></span>oat </span><span class=\"ls35 ws29\">x,</span><span class=\"ws2\"> <span class=\"_ _4\"></span><span class=\"fc8\">float<span class=\"_ _1\"></span> <span class=\"fc0 ls34 ws28\">y)</span><span class=\"fc0\"> </span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf15\" class=\"pf w0 h0\" data-page-no=\"15\"><div class=\"pc pc15 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c0 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>va<span class=\"_ _1\"></span>riable <span class=\"ff4\">m_viewX </span><span class=\"ls24 ws1c\">et</span><span class=\"ls1a\"> </span><span class=\"ff4 ws14\">m_<span class=\"_ _2\"></span>viewY<span class=\"_ _2\"></span><span class=\"ff2 ws2\">. </span></span></div><div class=\"t m2 xa hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">2.12</div><div class=\"t m3 x20 hd y1c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tView<span class=\"_ _2\"></span>Size<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c3 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">setVie<span class=\"_ _1\"></span>wSize(sf::Vecto<span class=\"_ _1\"></span>r2f v) </span></span></div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0\">setViewSiz<span class=\"_ _1\"></span>e(float <span class=\"_ _2\"></span><span class=\"ls35 ws29\">x,<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>float <span class=\"_ _2\"></span>y); </span></span></span></span></div><div class=\"t m0 x6 hc y1c5 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> position <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> v<span class=\"_ _2\"></span>ue.<span class=\"_ _2\"></span> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y1c7 ff4 fs2 fc4 sc0 ls2 ws14\">2.13</div><div class=\"t m3 x20 hd y1c7 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c7 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tWindow<span class=\"_ _2\"></span>Size<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c9 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">setWindo<span class=\"_ _1\"></span>wSize(sf::Vector2u<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls36 ws2a\">v,<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"fc8\">bool <span class=\"fc0\">updateViewSize<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>= <span class=\"ff4 fc5 ws14\">fa<span class=\"_ _2\"></span>lse<span class=\"ff2 fc0 ls37 ws2\">) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y1ca ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1cb ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> redéfinir <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> taille <span class=\"ls1e ws16\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>fenêtre (uniquement pour P<span class=\"_ _2\"></span>C)<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xa hc yc5 ff4 fs2 fc4 sc0 ls2 ws14\">2.14</div><div class=\"t m3 x20 hd yc5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yc5 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tWindow<span class=\"_ _2\"></span>Tit<span class=\"_ _2\"></span>le<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1cc ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1cd ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setW<span class=\"_ _1\"></span>indowTitle(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"fc0\">sf::String<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;tit<span class=\"_ _2\"></span>le) </span></span></span></span></div><div class=\"t m0 x1 he yc6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ce ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he yc8 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>titre<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>fenêtr<span class=\"_ _2\"></span>e. </span></span></span></span></div><div class=\"t m0 x1 he y1cf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1d0 ff4 fs2 fc4 sc0 ls2 ws14\">2.15</div><div class=\"t m3 x20 hd y1d0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1d0 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tWindow<span class=\"_ _2\"></span>BgCo<span class=\"_ _2\"></span>lor<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc ybf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d1 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0\">setWindowBgC<span class=\"_ _1\"></span>olor(sf::Color<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>color) </span></span></div><div class=\"t m0 x1 he y151 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc ycb ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1d2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1d3 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>couleu<span class=\"_ _1\"></span>r <span class=\"ls1e ws16\">de</span> fond <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>fenêtr<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m2 xa hc y12a ff4 fs2 fc4 sc0 ls2 ws14\">2.16</div><div class=\"t m3 x20 hd y12a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y12a ff4 fs2 fc4 sc0 ls2 ws2\">loa<span class=\"_ _2\"></span>dParen<span class=\"_ _2\"></span>tRe<span class=\"_ _2\"></span>sources<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y9f ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">bool <span class=\"fc0\">loa<span class=\"_ _1\"></span>dParentResources(<span class=\"_ _1\"></span>) </span></span></div><div class=\"t m0 x6 hc y1d4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1d5 ff2 fs2 fc0 sc0 ls2 ws2\">Charge les <span class=\"_ _2\"></span>ressources qui permettent <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’afficher<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> les <span class=\"_ _2\"></span>boites <span class=\"ls1e ws16\">de</span> dialogues dans <span class=\"_ _2\"></span>une scèn<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m0 x6 hc y1d6 ff2 fs2 fc0 sc0 ls2 ws2\">Elle <span class=\"_ _2\"></span>est généralement<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>utilisée dans <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> fonction <span class=\"ff4\">loadResou<span class=\"_ _1\"></span>rces <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>ne<span class=\"ff2 ws2\"> s<span class=\"_ _2\"></span>cène.<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x1 he y1d7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1d8 ff4 fs2 fc4 sc0 ls2 ws14\">2.17</div><div class=\"t m3 x20 hd y1d8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1d8 ff4 fs2 fc4 sc0 ls2 ws2\">loa<span class=\"_ _2\"></span>dReso<span class=\"_ _2\"></span>urce<span class=\"_ _2\"></span>s </div><div class=\"t m0 x6 hc y1d9 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">bool <span class=\"fc0\">loa<span class=\"_ _1\"></span>dResources() = <span class=\"_ _1\"></span><span class=\"fcb ls38\">0 </span></span></span></div><div class=\"t m0 x6 hc y1da ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1db ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>i<span class=\"_ _1\"></span>mplémenter<span class=\"ff2 ws2\"> <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>cha<span class=\"_ _1\"></span>rgement des <span class=\"_ _2\"></span>ressources qui<span class=\"_ _1\"></span> sont <span class=\"_ _2\"></span>utilisés dans <span class=\"_ _2\"></span>une scèn<span class=\"_ _2\"></span>e. </span></span></span></span></div><div class=\"t m2 xa hc y1dc ff4 fs2 fc4 sc0 ls2 ws14\">2.18</div><div class=\"t m3 x20 hd y1dc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1dc ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tIsR<span class=\"_ _2\"></span>unning<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y1dd ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setIsRunn<span class=\"_ _1\"></span>ing(<span class=\"fc8 ws2\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">val)<span class=\"_ _1\"></span> </span></span></span></span></div><div class=\"t m0 x6 hc y1de ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1df ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1e0 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’état<span class=\"ff2 ws2\"> </span>d’éxécution<span class=\"ff2 ws2\"> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>scène. </span></span></span></span></span></span></div><div class=\"t m0 x21 h9 y1e1 ff6 fs3 fc0 sc0 ls1b ws13\">22<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf16\" class=\"pf w0 h0\" data-page-no=\"16\"><div class=\"pc pc16 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">2.19</div><div class=\"t m3 x20 hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1be ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tIsP<span class=\"_ _2\"></span>laying<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y1c0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setIsPlaying(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">val)<span class=\"_ _1\"></span> </span></span></span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e3 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> variable <span class=\"ff4 ws14\">m<span class=\"_ _2\"></span>_isP<span class=\"_ _2\"></span>laying<span class=\"_ _2\"></span><span class=\"ff2 ws2\">. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.20</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">qui<span class=\"_ _2\"></span>tSce<span class=\"_ _2\"></span>ne<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">quitScene(</span>in<span class=\"_ _1\"></span>t <span class=\"_ _2\"></span><span class=\"fc0\">nextSc<span class=\"_ _1\"></span>ene <span class=\"_ _2\"></span>=<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>-<span class=\"ls39 ws2b\">1)</span> </span></span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1eb ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> quitter <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scene <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>cou<span class=\"_ _1\"></span>rs <span class=\"ls29 ws1f\">et</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’aller<span class=\"ff2 ws2\"> vers <span class=\"_ _2\"></span>une autre. <span class=\"ls3a ws2c\">Si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> aucune scène <span class=\"_ _2\"></span><span class=\"ff3 ws14\">n’est<span class=\"ff2 ws2\"> renseignée </span>l’application<span class=\"ff2 ws2\"> </span>s’a<span class=\"_ _2\"></span>rrête.<span class=\"_ _2\"></span><span class=\"ff2 ws2\"> </span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y1ec ff4 fs2 fc4 sc0 ls2 ws14\">2.21</div><div class=\"t m3 x20 hd y1ec ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ec ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tScene<span class=\"_ _2\"></span>Star<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 hc y1ed ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setSc<span class=\"_ _1\"></span>eneStart(<span class=\"fc8 ws2\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc y1ee ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1ef ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc yc5 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> variable <span class=\"ff4 ws14\">m<span class=\"_ _2\"></span>_scen<span class=\"_ _2\"></span>eSta<span class=\"_ _2\"></span>rt<span class=\"ff2 ws2\">. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1cc ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f0 ff4 fs2 fc4 sc0 ls2 ws14\">2.22</div><div class=\"t m3 x20 hd y1f0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f0 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tScene<span class=\"_ _2\"></span>End </div><div class=\"t m0 x6 hc y1f1 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setSc<span class=\"_ _1\"></span>eneEnd(<span class=\"fc8 ws2\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc yc8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1cf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d0 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> variable <span class=\"ff4 ws14\">m<span class=\"_ _2\"></span>_scen<span class=\"_ _2\"></span>eEn<span class=\"_ _2\"></span>d<span class=\"ff2 ws2\">. </span></span></span></span></span></span></div><div class=\"t m0 x1 he ybf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1d1 ff4 fs2 fc4 sc0 ls2 ws14\">2.23</div><div class=\"t m3 x20 hd y1d1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1d1 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tWaitT<span class=\"_ _2\"></span>ime </div><div class=\"t m0 x6 hc ycb ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setWaitTi<span class=\"_ _1\"></span>me(<span class=\"fc8 ws2\">int <span class=\"_ _2\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc y1f2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1f3 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir <span class=\"ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> temps <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> partir duquel les <span class=\"_ _2\"></span>objets seront <span class=\"_ _2\"></span>désac<span class=\"_ _1\"></span>tivés <span class=\"_ _1\"></span>tempor<span class=\"_ _2\"></span>aire<span class=\"_ _2\"></span>ments<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y1f4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc yce ff4 fs2 fc4 sc0 ls2 ws14\">2.24</div><div class=\"t m3 x20 hd yce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yce ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tKeyBa<span class=\"_ _2\"></span>ckPr<span class=\"_ _2\"></span>essed </div><div class=\"t m0 x6 hc y1f5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setKeyBac<span class=\"_ _1\"></span>kPressed(<span class=\"fc8 ws2\">bo<span class=\"_ _1\"></span>ol <span class=\"_ _4\"></span><span class=\"fc0\">val)<span class=\"_ _1\"></span> </span></span></span></span></div><div class=\"t m0 x6 hc y1f6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d6 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> variable <span class=\"ff4 ws14\">m<span class=\"_ _2\"></span>_key<span class=\"_ _2\"></span>BackPr<span class=\"_ _2\"></span>esse<span class=\"_ _2\"></span>d<span class=\"ff2 ws2\">. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1f8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f9 ff4 fs2 fc4 sc0 ls2 ws14\">2.25</div><div class=\"t m3 x20 hd y1f9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f9 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tMous<span class=\"_ _2\"></span>eInCo<span class=\"_ _2\"></span>llisi<span class=\"_ _2\"></span>on </div><div class=\"t m0 x6 hc y1fa ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">setM<span class=\"_ _1\"></span>ouseInCollision() </span></span></div><div class=\"t m0 x6 hc y1fb ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1fc ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> confirmer <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>col<span class=\"_ _1\"></span>lision <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> souris <span class=\"_ _2\"></span>av<span class=\"_ _1\"></span>ec <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> ob<span class=\"_ _2\"></span>jet. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1fd ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1fe ff4 fs2 fc4 sc0 ls2 ws14\">2.26</div><div class=\"t m3 x20 hd y1fe ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1fe ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>IsRun<span class=\"_ _2\"></span>ning<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y1ff ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getIsRun<span class=\"_ _1\"></span>ning() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y1de ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e0 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span>une scène est <span class=\"ls29 ws1f\">en<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> cours <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’exécutio<span class=\"_ _1\"></span>n<span class=\"ff2 ws2\"> <span class=\"ls24 ws1c\">et</span><span class=\"ls1a\"> </span><span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x21 h9 y1e1 ff6 fs3 fc0 sc0 ls1b ws13\">23<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf17\" class=\"pf w0 h0\" data-page-no=\"17\"><div class=\"pc pc17 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.27</div><div class=\"t m3 x20 hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>IsPla<span class=\"_ _2\"></span>ying<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y201 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getIsPlayin<span class=\"_ _1\"></span>g() <span class=\"_ _4\"></span><span class=\"fc8\">c<span class=\"_ _1\"></span>onst </span></span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span>une scène est <span class=\"_ _2\"></span>active<span class=\"_ _1\"></span> <span class=\"ls24 ws1c\">et</span> <span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> n<span class=\"_ _4\"></span>on<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y1e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.28</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Scene<span class=\"_ _2\"></span>Star<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getSceneS<span class=\"_ _1\"></span>tart() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c7 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span>une scène est <span class=\"_ _2\"></span>à son début <span class=\"ff3 ws14\">d’éxécution</span><span class=\"ls1a\"> <span class=\"ls29 ws1f\">et</span></span> <span class=\"_ _2\"></span><span class=\"ff4\">faux <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span>no<span class=\"_ _2\"></span>n. </span></span></span></span></div><div class=\"t m0 x1 he y202 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">2.29</div><div class=\"t m3 x20 hd y203 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y203 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Scene<span class=\"_ _2\"></span>End </div><div class=\"t m0 x6 hc y204 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getSceneE<span class=\"_ _1\"></span>nd() <span class=\"_ _4\"></span><span class=\"fc8\">c<span class=\"_ _1\"></span>onst </span></span></span></div><div class=\"t m0 x6 hc y205 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y22 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span>une scène arrive <span class=\"_ _2\"></span>à <span class=\"ls28 ws1e\">sa</span> fin <span class=\"ff3 ws14\">d’éxécution</span><span class=\"ls1a\"> <span class=\"ls24 ws1c\">et</span></span> <span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y206 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">2.30</div><div class=\"t m3 x20 hd y207 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y207 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Window<span class=\"_ _2\"></span>IsAct<span class=\"_ _2\"></span>ive </div><div class=\"t m0 x6 hc y208 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getWindo<span class=\"_ _1\"></span>wIsActive() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y209 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y20a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> fenêtre est <span class=\"_ _2\"></span>active<span class=\"_ _1\"></span> <span class=\"ls24 ws1c\">et</span> <span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span>no<span class=\"_ _2\"></span>n.<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x1 he y28 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">2.31</div><div class=\"t m3 x20 hd y20b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20b ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>KeyBa<span class=\"_ _2\"></span>ckPre<span class=\"_ _2\"></span>ssed </div><div class=\"t m0 x6 hc y2a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getKeyBack<span class=\"_ _1\"></span>Pressed()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y20c ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y20d ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>leur de <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> vraiable <span class=\"ff4 ws14\">m_key<span class=\"_ _2\"></span>BackP<span class=\"_ _2\"></span>resse<span class=\"_ _2\"></span>d<span class=\"ff2 ws2\">. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y20e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y20f ff4 fs2 fc4 sc0 ls2 ws14\">2.32</div><div class=\"t m3 x20 hd y20f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20f ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>View<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y210 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y211 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::View<span class=\"_ _1\"></span>&amp; <span class=\"_ _2\"></span>getView()<span class=\"_ _1\"></span> <span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y131 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y212 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y213 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>vu<span class=\"_ _1\"></span>e <span class=\"ff3 ws14\">d’une</span> <span class=\"_ _2\"></span>scène.<span class=\"_ _2\"></span> </span></span></div><div class=\"t m0 x1 he y214 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y215 ff4 fs2 fc4 sc0 ls2 ws14\">2.33</div><div class=\"t m3 x20 hd y215 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x22 hc y215 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Mouse<span class=\"_ _2\"></span>PosCu<span class=\"_ _2\"></span>rrent<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y216 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d9 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc0\">sf::V<span class=\"_ _1\"></span>ector2f getMousePosCurrent()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8 ws14\">const<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y217 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y218 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y219 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>posi<span class=\"_ _1\"></span>tion actuelle <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> sou<span class=\"_ _2\"></span>ris. </span></span></span></span></div><div class=\"t m0 x1 he y21a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y21b ff4 fs2 fc4 sc0 ls2 ws14\">2.34</div><div class=\"t m3 x20 hd y21b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y21b ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Mouse<span class=\"_ _2\"></span>PosPr<span class=\"_ _2\"></span>eviou<span class=\"_ _2\"></span>s<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y21c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y21d ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc0\">sf::V<span class=\"_ _1\"></span>ector2f getMousePosPrevious()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8 ws14\">const<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y21e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1df ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y21f ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>posi<span class=\"_ _1\"></span>tion qui précède <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> position <span class=\"_ _2\"></span>actuell<span class=\"_ _1\"></span>e <span class=\"ls1e ws16\">de</span> <span class=\"ls27 ws1d\">la</span> <span class=\"_ _4\"></span>souri<span class=\"_ _2\"></span>s. </span></span></span></span></div><div class=\"t m0 x21 h9 y220 ff6 fs3 fc0 sc0 ls1b ws13\">24<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf18\" class=\"pf w0 h0\" data-page-no=\"18\"><div class=\"pc pc18 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">2.35</div><div class=\"t m3 x20 hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Render<span class=\"_ _2\"></span>Wind<span class=\"_ _2\"></span>ow<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc0\">sf::R<span class=\"_ _1\"></span>enderWindow&amp; g<span class=\"_ _2\"></span>etRen<span class=\"_ _2\"></span>derWin<span class=\"_ _2\"></span>dow<span class=\"_ _2\"></span>() </span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1c2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>fen<span class=\"_ _1\"></span>être <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’e<span class=\"_ _1\"></span>xécution<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scène<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.36</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Render<span class=\"_ _2\"></span>Text<span class=\"_ _2\"></span>ure<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c5 ff4 fs2 fc5 sc0 ls2 ws2\">vi<span class=\"_ _2\"></span>rtual <span class=\"_ _9\"></span><span class=\"ff2 fc0\">sf::R<span class=\"_ _2\"></span>ender<span class=\"_ _2\"></span>Text<span class=\"_ _2\"></span>ure&amp; <span class=\"_ _a\"></span>g<span class=\"_ _2\"></span>etRen<span class=\"_ _2\"></span>derTe<span class=\"_ _2\"></span>xture<span class=\"_ _2\"></span>() <span class=\"_ _9\"></span><span class=\"fc8 ws14\">const</span> </span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>surfac<span class=\"_ _1\"></span>e sur <span class=\"_ _2\"></span>laqu<span class=\"_ _1\"></span>elle <span class=\"ls33 ws27\">on<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> déssine <span class=\"_ _2\"></span>les o<span class=\"_ _1\"></span>bjets <span class=\"ff3 ws14\">d’une</span> s<span class=\"_ _2\"></span>cène. </span></span></span></span></div><div class=\"t m0 x1 he y1c8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ec ff4 fs2 fc4 sc0 ls2 ws14\">2.37</div><div class=\"t m3 x20 hd y1ec ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ec ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>GameS<span class=\"_ _2\"></span>ystem<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y222 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ed ff4 fs2 fc5 sc0 ls2 ws2\">vi<span class=\"_ _2\"></span>rtual <span class=\"_ _1\"></span><span class=\"ff2 fc0\">GameSys<span class=\"_ _2\"></span>temEx<span class=\"_ _2\"></span>tended<span class=\"_ _2\"></span>&amp; <span class=\"_ _9\"></span>getGame<span class=\"_ _2\"></span>Syste<span class=\"_ _2\"></span>m() </span></div><div class=\"t m0 x6 hc y1cb ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y223 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y224 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’objet<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>game system e<span class=\"_ _2\"></span>xtende<span class=\"_ _2\"></span>d. </span></span></div><div class=\"t m0 x1 he y225 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y226 ff4 fs2 fc4 sc0 ls2 ws14\">2.38</div><div class=\"t m3 x20 hd y226 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y226 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Font<span class=\"_ _2\"></span>Syste<span class=\"_ _2\"></span>m </div><div class=\"t m0 x6 hc y227 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc0\">sf::Font<span class=\"_ _1\"></span>&amp; <span class=\"_ _4\"></span>getFo<span class=\"_ _1\"></span>ntSystem() </span></div><div class=\"t m0 x6 hc ybd ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y228 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>police <span class=\"ls1e ws16\">du</span> s<span class=\"_ _2\"></span>ystèm<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m0 x1 he y229 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y22a ff4 fs2 fc4 sc0 ls2 ws14\">2.39</div><div class=\"t m3 x20 hd y22a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y22a ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>FontM<span class=\"_ _2\"></span>sg </div><div class=\"t m0 x6 hc y22b ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc0\">sf::Font<span class=\"_ _1\"></span>&amp; <span class=\"_ _4\"></span>getFo<span class=\"_ _1\"></span>ntMsg() </span></div><div class=\"t m0 x6 hc y22c ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y12a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>police <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>boit<span class=\"_ _1\"></span>e <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>dialo<span class=\"_ _2\"></span>gue. </span></span></span></span></div><div class=\"t m0 x1 he y1f4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc yce ff4 fs2 fc4 sc0 ls2 ws14\">2.40</div><div class=\"t m3 x20 hd yce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yce ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SprB<span class=\"_ _2\"></span>uttonS<span class=\"_ _2\"></span>elect </div><div class=\"t m0 x6 hc y211 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc0\">sf::Sp<span class=\"_ _1\"></span>rite&amp; <span class=\"_ _4\"></span>g<span class=\"_ _1\"></span>etSprButtonSelect() </span></div><div class=\"t m0 x6 hc y1f6 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1d6 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> Sprite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>sél<span class=\"_ _1\"></span>ection <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>option<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1f8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y22d ff4 fs2 fc4 sc0 ls2 ws14\">2.41</div><div class=\"t m3 x20 hd y22d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y22d ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Option<span class=\"_ _2\"></span>Inde<span class=\"_ _2\"></span>x </div><div class=\"t m0 x6 hc y1d9 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">int <span class=\"fc0\">getO<span class=\"_ _1\"></span>ptionIndex() </span></span></div><div class=\"t m0 x6 hc y1da ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y22e ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l’option<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>chosie<span class=\"_ _2\"></span><span class=\"ff4 fca ws14\">.<span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 hc y22f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1fe ff4 fs2 fc4 sc0 ls2 ws14\">2.42</div><div class=\"t m3 x20 hd y1fe ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1fe ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Scene<span class=\"_ _2\"></span>Widt<span class=\"_ _2\"></span>h </div><div class=\"t m0 x6 hc y1ff ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">unsig<span class=\"_ _1\"></span>ned <span class=\"_ _4\"></span>int<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getSce<span class=\"_ _1\"></span>neWidth() </span></span></div><div class=\"t m0 x6 hc y1de ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e0 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scèn<span class=\"_ _2\"></span>e<span class=\"ff4 fca ws14\">.</span><span class=\"ff4\"> </span></span></span></span></span></div><div class=\"t m0 x21 h9 y1e1 ff6 fs3 fc0 sc0 ls1b ws13\">25<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf19\" class=\"pf w0 h0\" data-page-no=\"19\"><div class=\"pc pc19 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.43</div><div class=\"t m3 x20 hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Scene<span class=\"_ _2\"></span>Heigh<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 hc y201 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">unsig<span class=\"_ _1\"></span>ned <span class=\"_ _4\"></span>int<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getSce<span class=\"_ _1\"></span>neHeight() </span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>ha<span class=\"_ _1\"></span>uteur <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>scène<span class=\"_ _2\"></span><span class=\"ff4 fca ws14\">.<span class=\"fc0 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 hc y1e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.44</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Delta<span class=\"_ _2\"></span>Time </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">float <span class=\"fc0\">g<span class=\"_ _1\"></span>etDeltaTime() </span></span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c7 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’exécuti<span class=\"_ _1\"></span>on<span class=\"ff2 ws2\"> <span class=\"ls24 ws1c\">en</span> <span class=\"_ _2\"></span>secon<span class=\"_ _2\"></span>de<span class=\"ff4 fca ws14\">.</span><span class=\"ff4\"> </span></span></span></span></span></div><div class=\"t m0 x1 hc y202 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">2.45</div><div class=\"t m3 x20 hd y203 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>DELTA<span class=\"_ _2\"></span>_TIM<span class=\"_ _2\"></span>E<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y230 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y231 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">float <span class=\"fc0\">getDELTA_TIME()<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y232 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y233 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc yc5 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>riable D<span class=\"_ _2\"></span>ELTA_T<span class=\"_ _2\"></span>IME<span class=\"ff4 fca ws14\">.</span><span class=\"ff4\"> </span></span></span></div><div class=\"t m0 x1 hc y1cc ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1cd ff4 fs2 fc4 sc0 ls2 ws14\">2.46</div><div class=\"t m3 x20 hd y1cd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x22 hc y1cd ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SprB<span class=\"_ _2\"></span>uttonS<span class=\"_ _2\"></span>elect<span class=\"_ _2\"></span>Scal<span class=\"_ _2\"></span>e </div><div class=\"t m0 x6 hc y208 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8 ws14\">float<span class=\"fc0 ws2\">&amp; get<span class=\"_ _1\"></span>SprButton<span class=\"_ _1\"></span>SelectScale() </span></span></div><div class=\"t m0 x6 hc y209 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y20a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’echelle<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>Sprite<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>séle<span class=\"_ _2\"></span>ction<span class=\"ff4 fca ws14\">.<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 hc y28 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">2.47</div><div class=\"t m3 x20 hd y20b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20b ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>ViewX<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y2a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getVi<span class=\"_ _1\"></span>ewX() <span class=\"_ _4\"></span><span class=\"fc8\">con<span class=\"_ _1\"></span>st </span></span></span></div><div class=\"t m0 x6 hc y1d3 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y234 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>position x <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>vue<span class=\"_ _4\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y235 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2e ff4 fs2 fc4 sc0 ls2 ws14\">2.48</div><div class=\"t m3 x20 hd y2e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2e ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>ViewY<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y236 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getVi<span class=\"_ _1\"></span>ewY() <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst </span></span></span></div><div class=\"t m0 x6 hc y237 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y213 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>position y <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> v<span class=\"_ _4\"></span>ue.<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x1 he y214 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y238 ff4 fs2 fc4 sc0 ls2 ws14\">2.49</div><div class=\"t m3 x20 hd y238 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y238 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>View<span class=\"_ _2\"></span>W </div><div class=\"t m0 x6 hc y239 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getVi<span class=\"_ _1\"></span>ewW() <span class=\"_ _4\"></span><span class=\"fc8\">con<span class=\"_ _1\"></span>st </span></span></span></div><div class=\"t m0 x6 hc y217 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y219 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>vue<span class=\"_ _4\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y21a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y21b ff4 fs2 fc4 sc0 ls2 ws14\">2.50</div><div class=\"t m3 x20 hd y21b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y21b ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>View<span class=\"_ _2\"></span>H </div><div class=\"t m0 x6 hc y21d ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getVi<span class=\"_ _1\"></span>ewH() <span class=\"_ _4\"></span><span class=\"fc8 ws14\">con<span class=\"_ _1\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y23a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y23b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y23c ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>ha<span class=\"_ _1\"></span>uteur <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>vue<span class=\"_ _4\"></span>. </span></span></span></span></div><div class=\"t m0 x21 h9 y23d ff6 fs3 fc0 sc0 ls1b ws13\">26<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1a\" class=\"pf w0 h0\" data-page-no=\"1a\"><div class=\"pc pc1a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbsQ2DMBRFUTtySYFEyxwMQMsQ1AxEwUgswwo/XaqkiYIEzjkb+GGKWzhHRAIAAKBSDxMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqMwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+EwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+kwAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADV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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">27<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.51</div><div class=\"t m3 x20 hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Mouse<span class=\"_ _2\"></span>InCo<span class=\"_ _2\"></span>llisi<span class=\"_ _2\"></span>on </div><div class=\"t m0 x6 hc y201 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">bool <span class=\"fc0\">g<span class=\"_ _1\"></span>etMouseInCollision() </span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrais <span class=\"ff2 ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> sourris est <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>collision<span class=\"_ _1\"></span> avec <span class=\"_ _4\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> objet, <span class=\"ff4\">faux <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> non<span class=\"_ _2\"></span>. </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.52</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Mouse<span class=\"_ _2\"></span>Curren<span class=\"_ _2\"></span>tEqua<span class=\"_ _2\"></span>lToPr<span class=\"_ _2\"></span>evio<span class=\"_ _2\"></span>us </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">bool <span class=\"fc0\">g<span class=\"_ _1\"></span>etMouseCurrentEqual<span class=\"_ _1\"></span>ToPrevious() </span></span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c7 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrais <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>posi<span class=\"_ _1\"></span>tion actuelle <span class=\"ls24 ws1c\">et</span> précedente <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>sourris<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>so<span class=\"_ _1\"></span>nt <span class=\"_ _2\"></span>l<span class=\"_ _1\"></span>es mêmes, <span class=\"_ _2\"></span><span class=\"ff4\">fa<span class=\"_ _1\"></span>ux <span class=\"_ _1\"></span><span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span>non<span class=\"_ _4\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y202 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">2.53</div><div class=\"t m3 x20 hd y203 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y203 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>BgCo<span class=\"_ _2\"></span>lor </div><div class=\"t m0 x6 hc y204 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc0\">sf::Col<span class=\"_ _1\"></span>or&amp; <span class=\"_ _4\"></span>getBgColo<span class=\"_ _1\"></span>r() </span></div><div class=\"t m0 x6 hc y205 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y22 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>couleur <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>fond <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scène. </span></span></span></span></div><div class=\"t m0 x1 he y206 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">2.54</div><div class=\"t m3 x20 hd y207 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">in<span class=\"_ _2\"></span>ViewRe<span class=\"_ _2\"></span>c<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y24 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ce ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">bool <span class=\"fc0\">inViewRec(MainObject<span class=\"_ _1\"></span> *obj, </span>b<span class=\"_ _2\"></span>ool <span class=\"fc0\">useTexRec <span class=\"_ _2\"></span>= <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">true<span class=\"ff2 fc0 ls3c ws2\">) </span></span></span></span></div><div class=\"t m0 x6 hc yc8 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y20a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrais <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"ff3 ws14\">l’objet</span> <span class=\"_ _2\"></span><span class=\"ls3d ws2d\">se<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>trouve<span class=\"_ _1\"></span> dans <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> champ <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> vision <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>vue<span class=\"_ _1\"></span>, <span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> non<span class=\"_ _4\"></span>. </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y28 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y23f ff4 fs2 fc4 sc0 ls2 ws14\">2.55</div><div class=\"t m3 x20 hd y23f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y23f ff4 fs2 fc4 sc0 ls2 ws14\">mou<span class=\"_ _2\"></span>seCo<span class=\"_ _2\"></span>llisio<span class=\"_ _2\"></span>n<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y240 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y240 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y240 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y241 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y242 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y243 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y5a ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y244 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y245 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y246 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y247 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y157 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc yef ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y248 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y249 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y24a ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y24b ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y24c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y24d ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y24e ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y24f ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y250 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y251 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y252 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y253 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y254 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y255 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y256 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y257 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y258 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y259 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x0 he y25b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y25c ff4 fs2 fc5 sc0 ls2 ws2\">template </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xe hc y25d ff2 fs2 fc0 sc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2 ws2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2 ws2\"> </span></div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x24 he y25e ff2 fs2 fc8 sc0 ls2 ws2\">bool </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x25 he y25f ff2 fs2 fc0 sc0 ls2 ws2\">mouseCollision(T<span class=\"_ _1\"></span> <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;obj, <span class=\"fc8\">unsigned int <span class=\"_ _2\"></span><span class=\"fc0\">finger<span class=\"_ _1\"></span> = <span class=\"_ _4\"></span><span class=\"fcb ws14\">0<span class=\"fc0 ws2\">) </span></span></span></span></span></span></div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x24 hc y260 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y261 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x0 hc y262 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y263 ff9 fs2 fc0 sc0 ls2 ws2\">Windows, Linux : <span class=\"ff2\">Détecte <span class=\"ls28 ws1e\">si</span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> curseur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>souris est <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>collis<span class=\"_ _1\"></span>ion avec <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>o<span class=\"_ _1\"></span>bjet <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scène<span class=\"_ _2\"></span>. </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x0 he y264 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y265 ff9 fs2 fc0 sc0 ls2 ws2\">Mobile : <span class=\"_ _2\"></span><span class=\"ff2\">Détecte <span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’util<span class=\"_ _1\"></span>isateur<span class=\"ff2 ws2\"> touche <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>obj<span class=\"_ _1\"></span>et <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>scène<span class=\"_ _2\"></span>. </span></span></span></span></span></div><div class=\"t m0 x24 hc y266 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x27 hc y267 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x0 hc y268 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y269 ff4 fs2 fc0 sc0 ls2 ws2\">obj <span class=\"ff3 ws14\">l’objet</span><span class=\"ff2\"> <span class=\"_ _2\"></span>avec lequel <span class=\"ls33 ws27\">on</span> <span class=\"_ _4\"></span>v<span class=\"_ _1\"></span>eut faire <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>te<span class=\"_ _2\"></span>st.<span class=\"_ _2\"></span> </span></div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x0 he y26a ff2 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y26b ff4 fs2 fc0 sc0 ls2 ws2\">finger <span class=\"ff2\">représente <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’index<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> doigt<span class=\"_ _2\"></span>. </span></span></span></span></span></div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x0 he y26c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y26d ff4 fs2 fca sc0 ls2 ws2\">Retourne </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x28 hc y26e ff4 fs2 fc0 sc0 ls2 ws2\">vrais <span class=\"ff2 ls28 ws1e\">si<span class=\"ls1a ws2\"> <span class=\"ls3f ws2f\">il</span><span class=\"ls2\"> <span class=\"_ _2\"></span>y a <span class=\"_ _2\"></span>collision <span class=\"ls24 ws1c\">et</span><span class=\"ls3b\"> </span><span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x24 hc y26f ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 hc y270 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y271 ff4 fs2 fc5 sc0 ls40 ws30\">if<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 he y38 ff2 fs2 fc0 sc0 ls2 ws2\">(mouse<span class=\"_ _2\"></span>Colli<span class=\"_ _2\"></span>sion(s<span class=\"_ _2\"></span>prite<span class=\"_ _2\"></span>))<span class=\"_ _2\"></span> </div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x24 he y272 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 he y273 ff2 fs2 fcc sc0 ls41 ws31\">//<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls42 ws32\">Do<span class=\"ls2 ws2\"> some<span class=\"_ _2\"></span>thin<span class=\"_ _2\"></span>g<span class=\"fc0\"> </span></span></span></span></div></div><div class=\"c x23 y25a w4 h17\"><div class=\"t m0 x24 he y274 ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div><div class=\"t m0 x2a h18 y275 ff9 fs9 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _4\"></span>forme </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1b\" class=\"pf w0 h0\" data-page-no=\"1b\"><div class=\"pc pc1b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACg+gAAAFB9AAAAqD4AAIDsSkQ4BQAAgFbZ9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAADw3X4dmgAIBVAU5UWjO7iLAwgf3MYZBKNDOILFDYQf/yhWu0k4p7362kX1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAGSBnAkAAADKSURBVKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAAD4XH3ruCdJzmlrtSTHcPfz8trd1WpJXAYAAPAjD54XSk07la98AAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">28<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">mous<span class=\"_ _1\"></span>eCollision(T <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;obj, sf::Vector2f &amp;position, <span class=\"fc8\">unsigned <span class=\"_ _2\"></span>int<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">finger<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>= <span class=\"fcb ws14\">0<span class=\"_ _4\"></span><span class=\"fc0 ws2\">) </span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y276 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y277 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y278 ff9 fs2 fc0 sc0 ls2 ws2\">Windows, Linux : <span class=\"ff2\">Détecte <span class=\"ls28 ws1e\">si</span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> curseur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>souris est <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>collision avec <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> objet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> scè<span class=\"_ _2\"></span>ne. </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y279 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y27a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y27b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y27c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y27d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y27e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y27f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y280 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y281 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y282 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y283 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y284 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y285 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y111 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y286 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y287 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y288 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y289 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y28a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y28b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y28c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y28d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y28e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y28f ff4 fs2 fc4 sc0 ls2 ws14\">2.56</div><div class=\"t m3 x26 hd y28f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y28f ff4 fs2 fc4 sc0 ls2 ws2\">SDM<span class=\"_ _2\"></span>manage<span class=\"_ _2\"></span>Scen<span class=\"_ _2\"></span>e </div><div class=\"t m0 x6 hc y290 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">SDMma<span class=\"_ _1\"></span>nageScene() </span></span></div><div class=\"t m0 x6 hc y291 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y292 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> gérer <span class=\"_ _2\"></span>toutes<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>les<span class=\"_ _1\"></span> parties <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scene <span class=\"_ _4\"></span>(<span class=\"_ _1\"></span>évènem<span class=\"_ _1\"></span>ent, mise <span class=\"_ _2\"></span>à jour, <span class=\"_ _2\"></span>affichage<span class=\"_ _1\"></span>, boite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> di<span class=\"_ _2\"></span>alog<span class=\"_ _2\"></span>ue). </span></span></span></span></span></span></span></span></div><div class=\"t m2 xc hc y293 ff4 fs2 fc4 sc0 ls2 ws14\">2.57</div><div class=\"t m3 x26 hd y293 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y293 ff4 fs2 fc4 sc0 ls2 ws2\">SDM<span class=\"_ _2\"></span>manage<span class=\"_ _2\"></span>Scen<span class=\"_ _2\"></span>eEven<span class=\"_ _2\"></span>ts </div><div class=\"t m0 x6 hc y294 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">SDMma<span class=\"_ _1\"></span>nageSceneEv<span class=\"_ _1\"></span>ents() </span></span></div><div class=\"t m0 x6 hc y9f ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y295 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> façon dont <span class=\"_ _2\"></span>l<span class=\"_ _1\"></span>e SDM <span class=\"ls43 ws33\">va</span> <span class=\"_ _2\"></span>gérer les é<span class=\"_ _2\"></span>v<span class=\"_ _1\"></span>ènements <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> fenêtre. <span class=\"ff9\">Pour changer <span class=\"ls2f ws22\">le</span> <span class=\"_ _4\"></span>m<span class=\"_ _1\"></span>écanisme sur<span class=\"_ _2\"></span>charge<span class=\"_ _2\"></span>r </span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y296 ff9 fs2 fc0 sc0 ls2 ws2\">cette m<span class=\"_ _2\"></span>éth<span class=\"_ _2\"></span>ode. </div><div class=\"t m0 x1 hc y297 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y298 ff4 fs2 fc4 sc0 ls2 ws14\">2.58</div><div class=\"t m3 x26 hd y298 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y298 ff4 fs2 fc4 sc0 ls2 ws2\">SDM<span class=\"_ _2\"></span>manage<span class=\"_ _2\"></span>Scen<span class=\"_ _2\"></span>eMsgAn<span class=\"_ _2\"></span>swer<span class=\"_ _2\"></span>s </div><div class=\"t m0 x6 hc y299 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">SDMma<span class=\"_ _1\"></span>nageSceneMsgA<span class=\"_ _1\"></span>nswers() </span></span></div><div class=\"t m0 x6 hc y24d ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y29a ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> façon dont <span class=\"_ _2\"></span>l<span class=\"_ _1\"></span>es réponses <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> boite <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>dialogue seront gérées <span class=\"_ _1\"></span>par <span class=\"ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> SDM. <span class=\"ff9\">Pour changer <span class=\"_ _2\"></span><span class=\"ls44 ws34\">le<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y29b ff9 fs2 fc0 sc0 ls2 ws2\">mécanisme surcharger <span class=\"_ _4\"></span>ce<span class=\"_ _1\"></span>tte <span class=\"_ _2\"></span>méthode<span class=\"_ _4\"></span>. </div><div class=\"t m0 x1 hc y29c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y29d ff4 fs2 fc4 sc0 ls2 ws14\">2.59</div><div class=\"t m3 x26 hd y29d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y29d ff4 fs2 fc4 sc0 ls2 ws14\">SDM<span class=\"_ _2\"></span>callO<span class=\"_ _2\"></span>bject<span class=\"_ _2\"></span>sEve<span class=\"_ _2\"></span>nts<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y29e ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y29f ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">vo<span class=\"_ _1\"></span>id <span class=\"_ _4\"></span><span class=\"fc0\">SDMca<span class=\"_ _1\"></span>llObjects<span class=\"_ _1\"></span>Events(sf::Event &amp;e<span class=\"_ _2\"></span>vent<span class=\"_ _2\"></span>) </span></span></div><div class=\"t m0 x1 he y2a0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2a1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y2a2 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>ap<span class=\"_ _1\"></span>peler<span class=\"ff2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>m<span class=\"_ _1\"></span>éthode <span class=\"ff4\">event() </span>(la partie <span class=\"_ _2\"></span>eveneme<span class=\"_ _1\"></span>nt) <span class=\"ff3 ws14\">d’un</span> <span class=\"_ _2\"></span>objets qui <span class=\"ls3d ws2d\">se<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> trouvent dans <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>co<span class=\"_ _1\"></span>nteneur du SD<span class=\"_ _4\"></span>M. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y2a3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y2a4 ff4 fs2 fc4 sc0 ls2 ws14\">2.60</div><div class=\"t m3 x26 hd y2a4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2a4 ff4 fs2 fc4 sc0 ls2 ws14\">SDM<span class=\"_ _2\"></span>step<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x23 y2a5 w4 h19\"><div class=\"t m0 x0 hc y2a6 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y2a7 ff9 fs2 fc0 sc0 ls2 ws2\">Mobile : <span class=\"_ _2\"></span><span class=\"ff2\">Détecte <span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’util<span class=\"_ _1\"></span>isateur<span class=\"ff2 ws2\"> touche <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>obj<span class=\"_ _1\"></span>et <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>scène<span class=\"_ _2\"></span>. </span></span></span></span></span></div><div class=\"t m0 x0 he y2a8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y2a9 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x27 hc y2aa ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y2a5 w4 h19\"><div class=\"t m0 x0 hc y2ab ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y2ac ff4 fs2 fc0 sc0 ls2 ws2\">obj <span class=\"ff3 ws14\">l’objet</span><span class=\"ff2\"> <span class=\"_ _2\"></span>avec lequel <span class=\"ls33 ws27\">on</span> <span class=\"_ _4\"></span>v<span class=\"_ _1\"></span>eut faire <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>te<span class=\"_ _2\"></span>st.<span class=\"_ _2\"></span> </span></div><div class=\"t m0 xc hc y2ad ff4 fs2 fc0 sc0 ls2 ws2\">position <span class=\"ff2\">permet <span class=\"_ _2\"></span>de r<span class=\"_ _1\"></span>écupérer <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>p<span class=\"_ _1\"></span>osition <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>point <span class=\"ls1f ws17\">de</span> co<span class=\"_ _2\"></span>llisi<span class=\"_ _2\"></span>on. </span></div></div><div class=\"c x23 y2a5 w4 h19\"><div class=\"t m0 x0 he y2ae ff2 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y2af ff4 fs2 fc0 sc0 ls2 ws2\">finger <span class=\"ff2\">représente <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’index<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> doigt<span class=\"_ _2\"></span>. </span></span></span></span></span></div></div><div class=\"c x23 y2a5 w4 h19\"><div class=\"t m0 x0 he y2b0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y2b1 ff4 fs2 fca sc0 ls2 ws2\">Retourne </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x28 hc y2b2 ff4 fs2 fc0 sc0 ls2 ws2\">vrais <span class=\"ff2 ls28 ws1e\">si<span class=\"ls1a ws2\"> <span class=\"ls3f ws2f\">il</span><span class=\"ls2\"> <span class=\"_ _2\"></span>y a <span class=\"_ _2\"></span>collision <span class=\"ls24 ws1c\">et</span><span class=\"ls3b\"> </span><span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></div></div><div class=\"c x23 y2a5 w4 h19\"><div class=\"t m0 x0 h1a y2b3 ff2 fs9 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y2b4 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x24 he y2b5 ff2 fs2 fc0 sc0 ls2 ws2\">sf::Vector2f <span class=\"_ _4\"></span>pos<span class=\"_ _2\"></span>; </div><div class=\"t m0 x24 hc y2b6 ff4 fs2 fc5 sc0 ls40 ws30\">if<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 he y2b7 ff2 fs2 fc0 sc0 ls2 ws2\">(mouseC<span class=\"_ _1\"></span>ollision(s<span class=\"_ _1\"></span>prite, <span class=\"_ _4\"></span>pos))<span class=\"_ _2\"></span> </div></div><div class=\"c x23 y2a5 w4 h19\"><div class=\"t m0 x24 he y2b8 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 he y2b9 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _4\"></span><span class=\"fc0\">cursor<span class=\"_ _1\"></span>XPosition<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>= <span class=\"_ _4\"></span>pos.x<span class=\"_ _1\"></span>; </span></div><div class=\"t m0 x29 he y2ba ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">curso<span class=\"_ _1\"></span>rYPosition<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>= p<span class=\"_ _2\"></span>os.y;<span class=\"_ _2\"></span> </span></div></div><div class=\"c x23 y2a5 w4 h19\"><div class=\"t m0 x24 he y2bb ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1c\" class=\"pf w0 h0\" data-page-no=\"1c\"><div class=\"pc pc1c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">SDMste<span class=\"_ _2\"></span>p() </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2bd ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>mett<span class=\"_ _1\"></span>re à <span class=\"_ _2\"></span>jour les objets q<span class=\"_ _2\"></span>ui<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">se<span class=\"ls2 ws2\"> trouvent dans <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>conteneur <span class=\"ls1e ws16\">du</span> S<span class=\"_ _2\"></span>DM.<span class=\"_ _2\"></span> </span></span></div><div class=\"t m2 xc hc y1c3 ff4 fs2 fc4 sc0 ls2 ws14\">2.61</div><div class=\"t m3 x26 hd y1c3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c3 ff4 fs2 fc4 sc0 ls2 ws2\">SDM<span class=\"_ _2\"></span>draw </div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">SDMd<span class=\"_ _1\"></span>raw() </span></span></div><div class=\"t m0 x6 hc y1c5 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2be ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>affich<span class=\"_ _1\"></span>er<span class=\"ff2 ws2\"> les <span class=\"_ _2\"></span>objets qui se trouvent dans <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> conteneur <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>SD<span class=\"_ _2\"></span>M. </span></span></span></span></div><div class=\"t m2 xc hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">2.62</div><div class=\"t m3 x26 hd y221 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">cr<span class=\"_ _2\"></span>eateS<span class=\"_ _2\"></span>prite<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y203 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">createSprit<span class=\"_ _1\"></span>e(<span class=\"ff4 fc5 ws2\">std::string<span class=\"_ _1\"></span> <span class=\"ff2 fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;spriteNam<span class=\"_ _1\"></span>e, is::MainObject &amp;obj, sf::IntRect rec, <span class=\"_ _2\"></span>sf::Vecto<span class=\"_ _1\"></span>r2f position, </span></span></span></span></span></div><div class=\"t m0 x6 he y2bf ff2 fs2 fc0 sc0 ls2 ws2\">sf::Vector2f origin, sf::Vect<span class=\"_ _1\"></span>or2f scale = sf::V<span class=\"_ _1\"></span>ector2f(<span class=\"fcb ls2e ws26\">1.f</span><span class=\"ls45\">, <span class=\"fcb ls2e ws26\">1.f</span></span>), unsigned<span class=\"_ _1\"></span> int alpha = <span class=\"fcb ws14\">25<span class=\"_ _1\"></span>5</span>) </div><div class=\"t m0 x6 hc y2c0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2c1 ff2 fs2 fc0 sc0 ls2 ws2\">Permet créer <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> sprite <span class=\"ls24 ws1c\">en</span> lui <span class=\"_ _2\"></span>associa<span class=\"_ _1\"></span>nt une <span class=\"_ _2\"></span>textur<span class=\"_ _1\"></span>e. <span class=\"_ _2\"></span><span class=\"ls46 ws35\">Ce<span class=\"ls2 ws2\"> sprite <span class=\"_ _2\"></span>sera affiché <span class=\"ls28 ws1e\">si</span><span class=\"ls3b\"> <span class=\"ls24 ws1c\">et</span></span> se<span class=\"_ _2\"></span>ule<span class=\"_ _1\"></span>ment <span class=\"ff3 ws14\">s’il</span> e<span class=\"_ _2\"></span>st<span class=\"_ _1\"></span> dans <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> champ <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> v<span class=\"_ _2\"></span>ision </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y2c2 ff2 fs2 fc0 sc0 ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>vue. Sur SDL <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> sprite <span class=\"_ _2\"></span>s<span class=\"_ _1\"></span>era Blité <span class=\"_ _2\"></span>(jeu sera plus op<span class=\"_ _2\"></span>timisé<span class=\"_ _4\"></span>). </span></span></span></div><div class=\"t m2 xc hc y2c3 ff4 fs2 fc4 sc0 ls2 ws14\">2.63</div><div class=\"t m3 x26 hd y2c3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2c3 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>playS<span class=\"_ _2\"></span>ound<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y2c4 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2c5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMpla<span class=\"_ _1\"></span>ySound(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::strin<span class=\"_ _1\"></span>g<span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _4\"></span>ame)<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x1 he y2c6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2c7 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2c8 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>jouer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>son gérer par <span class=\"ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> GS<span class=\"_ _2\"></span>M. </span></span></span></span></div><div class=\"t m2 xc hc y2c9 ff4 fs2 fc4 sc0 ls2 ws14\">2.64</div><div class=\"t m3 x26 hd y2c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2c9 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>playM<span class=\"_ _2\"></span>usic<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y2ca ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2cb ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMpla<span class=\"_ _1\"></span>yMusic(<span class=\"fc8 ws2\">c<span class=\"_ _1\"></span>onst <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"ff2 fc0 ws2\">&amp; name<span class=\"_ _2\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 he y2cc ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2cd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2ce ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>jouer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>ne musique gérer <span class=\"_ _2\"></span>par <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>GSM<span class=\"_ _2\"></span>. </div><div class=\"t m2 xc hc y2cf ff4 fs2 fc4 sc0 ls2 ws14\">2.65</div><div class=\"t m3 x26 hd y2cf ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2cf ff4 fs2 fc4 sc0 ls2 ws2\">GRM<span class=\"_ _2\"></span>useGa<span class=\"_ _2\"></span>meSyst<span class=\"_ _2\"></span>emFon<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 hc y2d0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">GRM<span class=\"_ _1\"></span>useGameSys<span class=\"_ _1\"></span>temFont() </span></span></div><div class=\"t m0 x6 hc y2d1 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y2d2 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> à <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scéné <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’utilise<span class=\"_ _1\"></span>r<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>les<span class=\"_ _1\"></span> polices <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls1a ws2\"> <span class=\"ff4 ls2 ws14\">GameSys<span class=\"_ _2\"></span>tem<span class=\"ff2 ws2\">. </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y2d3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y2d4 ff4 fs2 fc4 sc0 ls2 ws14\">2.66</div><div class=\"t m3 x26 hd y2d4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2d4 ff4 fs2 fc4 sc0 ls2 ws2\">GRM<span class=\"_ _2\"></span>useGa<span class=\"_ _2\"></span>meSyst<span class=\"_ _2\"></span>emTe<span class=\"_ _2\"></span>xture </div><div class=\"t m0 x6 hc y2d5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">GRM<span class=\"_ _1\"></span>useGameSys<span class=\"_ _1\"></span>temTexture() </span></span></div><div class=\"t m0 x6 hc y2d6 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y29d ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> à <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scéné <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’utilise<span class=\"_ _1\"></span>r<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>les<span class=\"_ _1\"></span> textures <span class=\"ls1e ws16\">du</span><span class=\"ls1a\"> </span><span class=\"ff4 ws14\">Ga<span class=\"_ _2\"></span>meSy<span class=\"_ _2\"></span>stem<span class=\"ff2 ws2\">. </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y29e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y29f ff4 fs2 fc4 sc0 ls2 ws14\">2.67</div><div class=\"t m3 x26 hd y29f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y29f ff4 fs2 fc4 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>useGam<span class=\"_ _2\"></span>eSys<span class=\"_ _2\"></span>temSou<span class=\"_ _2\"></span>nd </div><div class=\"t m0 x6 hc y2a1 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">GSMus<span class=\"_ _1\"></span>eGameSystemSound() </span></span></div><div class=\"t m0 x6 hc y2d7 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y2d8 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>à <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scéné <span class=\"ff3 ws14\">d’utiliser</span> les sons <span class=\"ls1e ws16\">du</span><span class=\"ls1a\"> </span><span class=\"ff4 ws14\">Gam<span class=\"_ _2\"></span>eSys<span class=\"_ _2\"></span>tem<span class=\"ff2 ws2\">. </span></span></div><div class=\"t m0 x21 h9 y220 ff6 fs3 fc0 sc0 ls1b ws13\">29<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1d\" class=\"pf w0 h0\" data-page-no=\"1d\"><div class=\"pc pc1d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbPaqEQBCF0a5xEkN/1mps7FoFQyOpFwiPWUPXOYF5XwX5ECMzGwAAAJ36mAAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPWZAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8JAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9JgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ZkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAKB9+z5eRLjHAADAr8xUfV15nkf7ARS37/v/FYDivTcMQ7VT9199EaH6AIp7XwReBwDU5L8+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAADQg8jMno8XMU2T2wxQ3H3frbVxHE0BwHVdfUdQxeo7z9OTDVDccRyttW3bTAHAuq7Vqu/b/QnneY4IDzdAZe9XvmVZTAFQXLXee/mvDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAKjjr737ja2qvAM4/jxtZVAqcMVSG0ehrbpWx2TUEk2aOFg6TMiIm4FEx5gkxJjpgpple7PFGs2ShQTnps74J2YEt5CRuCFk1AQMDAVhMF0DFi2UPy61YOnqaENI27MXJ2vI/BOTlWLP+XxeNPee9r54fqfJzTf3PufEJEmyvLwYq6urY4zONECenTlzJoRwxRVXGAVAziVJ0tnZme0IymP1vffee6oPIOeeeOKJEMLq1auNAkD1XXvttXmrvpLMr7C2tlb1AeRc+ilfbW2tUQCovhyu2r4+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAID9ikiRZXl6M8+bNc5oBcq6rqyuEUFlZaRQAHDhwINsRlMfq27t3b4zRPzdAnj377LMhhHvuuccoAHIuSZL58+fnrfpKMr/Cm266SfUB5NzmzZvTdwSjAFB9OVy1fX0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAACALSjK/wubm5hijMw2QZ0eOHAkhvP7660YBkHNJkuRw1THby44xtra2qj6AnFu3bl0IYcWKFUYBoPoWLVqUt/bzWR8A2Zd+ytfc3GwUAKovh6u2rw8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAADIj5LMr3DZsmVOM0DOHTp0KIRw8OBBowBA9WXNhg0bnGMAAGDE0qVL87bkmCSJEw8AAJBV9vUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKi+nOrp6z/Z3Ts4NGQUAADAxVNiBGNpcGho54GOF15+Y9dbR0cO1s2ueP7h782sKJgPAAAw6mKSJKYwZk529zatXBtCeHD5wu8vnv/KjraHn9mS/urIKy0lxcVGBAAAjC7f8LwEygtlD9y1YPrUyXcvuXnk4N/b3zcZAABg1PmG55iqvHLKrhcfKp04IX06ODRUXig73Xs2hHDVlVPMBwAAUH3jfNzFxRfu39t5oCNNvqa5Nfb1AQAAqi8jBoeGOk6c3rr7nfVb9oYQltw655erbzcWAABA9WVE14cfLbrvqZGnDfVVEy5zHRcAAOCicA3PS2BwaKjrw4+2vXn4D1v/1n6sO4TQNLfmd4+ucA1PAABA9WUt/2q/3ZI+3rhmVeMNs8wEAAAYXe7ccCmVFBev/O/NGw4e6TIQAABg9LvDCMbSvoPH121+s3Zm+QN3LUiP9PT1pw+qKgvp05ZntoQQGuqrLrybHwAAgOobB/556l+bdrSFEO745tyZFYWevv70aQjh5jnVIYSBc+dHjqg+AABA9Y0zU8ompg+aVq6tm12RXsqlvFDW+vT9I7duBwAAGEWu5jLWBs6d39PW+dHZc+nThuurKq+cMnL1zoFz51/d/U4I4eoZ01zcBQAAUH0AAAB8FtfwBAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAADA/6PECMbYwLnze9o6X97+dgjh3eOnrps14zsLb1zY+JXP89o/vfb2Y89vveVr1b/56TKTBAAAVN8Xzsnu3qaVa0MI5YWyn6267d3jpzbtaNu0o61pbs1Lv1j52S9c9chL7ce6zRAAAFB940Dr0/dPnzr5W7fU13/30RDCrreO9vT1T586+eN/OTg09OSGnY+v3z5ypKG+ygABAIDPyb6+MVU6ccKSW+c8uHxhGnilEyeUF8rSX50+8+9PfMljz219fP32R+5dXDe7Ij0y7fJJJgkAAHxOPusbU9OnTr5wS1575wene8+mj6+pKv/El/zozm/85O7m0okTpl0+afWajWYIAACovvGhvfODR5/7S/p445pVJcXFnxaKZgUAAKi+8aSnr3/RD58c+ZRv14sPzawoGAsAAHAx2Nd3CUz60mXLF88f2afXtHLtr37/mrEAAACqLyNKJ0544K4FrU/f3/rUfemRx9dvb+/8wGQAAADVlyl11VeNfOK3p+2YgQAAAKPOvr4xdbK7d/+hE3WzK+qqr0qPXDdrRnrv9fR+DAPnzr+6+50QwtUzpjXeMMvEAAAA1Tee7D90YvWajeWFsj3rfpxetHP3PzrTXzVcXxVC6OnrT2/PsOTWOf9TfW8dfj99sG3v4dsX3GiYAACA6vuCOt179gc/X7e0ed5v//jX9EqeDy5f+GmX8RwcGtp5oONEV++Lm/akRzbtaGuor7qhtvLrdV/+tPs9AAAApGKSJKYwZtIvcG7be/jd46faj3U3za1p/Ors226pH/nCZ09ff8szW0IIDfVVdy+5+cIjH9dy72J38wMAAFQfAABAfrmGJwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1Q0jPOEAAAamSURBVAcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAAAYGyXZXt6+ffucYwAA4EKNjY25Wm9MkiTLy4uxoaEhxug/GwAASJJk//792Y6gPFbf8PCw6gMAANLqKyoqylv12dcHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAACyoCTzK+zo6IgxOtMAAECSJDlcdcz2smOMNTU1/rkBcq63tzeEUCgUjAKAo0eP5q39sl99w8PDPusDyLmWlpaRnwDkWZIkRUVFeas++/oAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AACA/CjJ/Ap7enpijM40QJ4NDAyk7whGAZBzSZLkcNUx28uOMRYKBdUHoPpCCKWlpUYBoPp6e3vz1n7Zr77h4WHVB5BzLS0tIz8ByHn1FRUV5a367OsDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAABZUJL5FQ4PD8cYnWmAPEuSJH1HMAoA7wg5XHXM9rL1HgAAkPP2i/mMXQAAgJywrw8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAcNGq79eLXogxxrjjjqeOtS+L8c/XHCzc2XLB80lvHGtfFqORAQAAjCP/AU6ZnPFmNoALAAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">30<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.68</div><div class=\"t m3 x26 hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>useGam<span class=\"_ _2\"></span>eSys<span class=\"_ _2\"></span>temMus<span class=\"_ _2\"></span>ic </div><div class=\"t m0 x6 hc y201 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">GSMus<span class=\"_ _1\"></span>eGameSystemMusic(<span class=\"_ _1\"></span>) </span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e4 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> à <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scéné <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’utilise<span class=\"_ _1\"></span>r<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>les<span class=\"_ _1\"></span> musique <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"ff4 ws14\">Game<span class=\"_ _2\"></span>System<span class=\"_ _2\"></span><span class=\"ff2 ws2\">. </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.69</div><div class=\"t m3 x26 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">GRM<span class=\"_ _2\"></span>useGa<span class=\"_ _2\"></span>meSyst<span class=\"_ _2\"></span>emRes<span class=\"_ _2\"></span>ourc<span class=\"_ _2\"></span>es </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">GRM<span class=\"_ _1\"></span>useGameSys<span class=\"_ _1\"></span>temResources() </span></span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c7 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> à <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scéné <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’utilise<span class=\"_ _1\"></span>r<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>tous<span class=\"_ _1\"></span> les <span class=\"_ _2\"></span>ressourc<span class=\"_ _1\"></span>es <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span><span class=\"ff4 ws14\">GameSy<span class=\"_ _2\"></span>stem<span class=\"ff2 ws2\">. </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y202 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">2.70</div><div class=\"t m3 x26 hd y203 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y203 ff4 fs2 fc4 sc0 ls2 ws2\">show<span class=\"_ _2\"></span>Mess<span class=\"_ _2\"></span>ageBo<span class=\"_ _2\"></span>x </div><div class=\"t m0 x6 hc y231 ff4 fs2 fc5 sc0 ls2 ws14\">template<span class=\"ff2 fc0 ls2e\">&lt;</span><span class=\"ws2\">class <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y205 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">showM<span class=\"_ _1\"></span>essageBox(T <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;msgBody<span class=\"_ _1\"></span>, <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">mbYesNo = <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">true<span class=\"_ _2\"></span><span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y2da ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y225 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y226 ff2 fs2 fc0 sc0 ls2 ws2\">Definie <span class=\"_ _2\"></span>l<span class=\"_ _1\"></span>es <span class=\"_ _2\"></span>param<span class=\"_ _1\"></span>ètres <span class=\"ls29 ws1f\">et</span> affiche <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> boite de <span class=\"_ _2\"></span>dia<span class=\"_ _2\"></span>logue. </span></span></div><div class=\"t m0 x6 hc y227 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:<span class=\"fc0\"> </span></div><div class=\"t m0 xc hc y209 ff4 fs2 fc0 sc0 ls2 ws2\">msgBody <span class=\"ff2 ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> message qui <span class=\"_ _2\"></span>sera<span class=\"_ _1\"></span> affiché <span class=\"_ _4\"></span>à<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’util<span class=\"_ _2\"></span>isate<span class=\"_ _2\"></span>ur.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y2db ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y20a ff4 fs2 fc0 sc0 ls2 ws2\">mbYesNo vrais <span class=\"_ _2\"></span><span class=\"ff2\">af<span class=\"_ _1\"></span>fiche une boite <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> dialogue <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>type OUI NON <span class=\"ls29 ws1f\">et<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff4\">faux <span class=\"_ _2\"></span><span class=\"ff2\">aff<span class=\"_ _1\"></span>iche juste <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> bouton <span class=\"_ _2\"></span>OK<span class=\"_ _2\"></span>. </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y28 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">2.71</div><div class=\"t m3 x26 hd y20b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20b ff4 fs2 fc4 sc0 ls2 ws2\">co<span class=\"_ _2\"></span>ntrol<span class=\"_ _2\"></span>Event<span class=\"_ _2\"></span>Focus<span class=\"_ _2\"></span>Closi<span class=\"_ _2\"></span>ng </div><div class=\"t m0 x6 hc y2a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">cont<span class=\"_ _1\"></span>rolEventFocus<span class=\"_ _1\"></span>Closing() </span></span></div><div class=\"t m0 x6 hc y20c ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y234 ff2 fs2 fc0 sc0 ls2 ws2\">Gère <span class=\"_ _2\"></span>les événements focus <span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span></span> fermeture <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> f<span class=\"_ _1\"></span>enêtre. <span class=\"ffb ws14\">S’utilise</span><span class=\"ff9\"> dans <span class=\"_ _2\"></span><span class=\"ls47 ws37\">une<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>bouc<span class=\"_ _1\"></span>le <span class=\"_ _2\"></span><span class=\"ffb ws14\">d’évén<span class=\"_ _1\"></span>ement<span class=\"ff9 ws2\"> ! </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hc y235 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xc hc y2dc ff4 fs2 fc4 sc0 ls2 ws14\">2.72</div><div class=\"t m3 x26 hd y2dc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2dc ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>autres meth<span class=\"_ _2\"></span>odes<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y236 ff2 fs2 fc0 sc0 ls2 ws2\">Ces méthodes <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>dessous on<span class=\"_ _1\"></span>t <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>mêm<span class=\"_ _1\"></span>e rôle <span class=\"_ _2\"></span>que celles qui sont <span class=\"ls29 ws1f\">au</span> <span class=\"_ _2\"></span>dessus,<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>différence ic<span class=\"_ _1\"></span>i est que <span class=\"_ _2\"></span>leurs noms </div><div class=\"t m0 x6 hc y2dd ff2 fs2 fc0 sc0 ls2 ws2\">commencant par <span class=\"_ _1\"></span><span class=\"ff4\">« GSM » </span>sont rempl<span class=\"_ _1\"></span>acés par <span class=\"ff4\">« GR<span class=\"_ _1\"></span>M » (Game Resou<span class=\"_ _1\"></span>rce Manager)<span class=\"_ _1\"></span>.<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x1 h1b y2de ff4 fsa fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x6 y2df w5 h1c\"><div class=\"t m0 x0 h18 y2e0 ff4 fs9 fc0 sc0 ls2 ws2\">Autres <span class=\"_ _2\"></span>met<span class=\"_ _2\"></span>hodes<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 he y2e1 ff2 fs2 fc0 sc0 ls2 ws2\">GRMp<span class=\"_ _2\"></span>layS<span class=\"_ _2\"></span>ound </div><div class=\"t m0 x0 he y2e2 ff2 fs2 fc0 sc0 ls2 ws2\">GRMp<span class=\"_ _2\"></span>layM<span class=\"_ _2\"></span>usic<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 he y2e3 ff2 fs2 fc0 sc0 ls2 ws2\">GRMu<span class=\"_ _2\"></span>seG<span class=\"_ _2\"></span>ameSy<span class=\"_ _2\"></span>stemSo<span class=\"_ _2\"></span>und </div><div class=\"t m0 x0 he y2e4 ff2 fs2 fc0 sc0 ls2 ws2\">GRMu<span class=\"_ _2\"></span>seG<span class=\"_ _2\"></span>ameSy<span class=\"_ _2\"></span>stemMu<span class=\"_ _2\"></span>sic </div></div><div class=\"c x2b y2df w6 h1c\"><div class=\"t m0 x0 h18 y2e0 ff4 fs9 fc0 sc0 ls2 ws2\">Methodes <span class=\"_ _2\"></span>Principale <span class=\"_ _2\"></span>(<span class=\"_ _1\"></span>au <span class=\"_ _2\"></span>dess<span class=\"_ _2\"></span>us) </div><div class=\"t m0 x0 he y2e1 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>playS<span class=\"_ _2\"></span>ound </div><div class=\"t m0 x0 he y2e2 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>play<span class=\"_ _2\"></span>Music </div><div class=\"t m0 x0 he y2e3 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>useGa<span class=\"_ _2\"></span>meSys<span class=\"_ _2\"></span>temSo<span class=\"_ _2\"></span>und </div><div class=\"t m0 x0 he y2e4 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>useGa<span class=\"_ _2\"></span>meSys<span class=\"_ _2\"></span>temMu<span class=\"_ _2\"></span>sic </div></div><div class=\"c x6 y2e5 w7 h1d\"><div class=\"t m0 x1 hc y2e6 ff4 fs2 fc4 sc0 ls2 ws2\">Éléments <span class=\"_ _2\"></span>pro<span class=\"_ _2\"></span>tégés<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2e7 ff4 fs2 fc4 sc0 ls2 ws2\">enum <span class=\"_ _4\"></span>MsgAnsw<span class=\"_ _1\"></span>er </div><div class=\"t m0 x0 hc y2e8 ff4 fs2 fc5 sc0 ls2 ws2\">enum </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2c he y2e9 ff2 fs2 fc0 sc0 ls2 ws2\">MsgAnswer;<span class=\"_ _1\"></span> </div></div><div class=\"c x6 y2e5 w7 h1d\"><div class=\"t m0 x0 hc y2ea ff4 fs2 fc0 sc0 ls2 ws2\">En<span class=\"_ _2\"></span>umérat<span class=\"_ _2\"></span>eur </div><div class=\"t m0 x0 he y2e3 ff2 fs2 fc0 sc0 ls2 ws2\">Y<span class=\"_ _2\"></span>ES </div><div class=\"t m0 x0 h1a y2eb ff2 fs9 fc0 sc0 ls49 ws38\">NO<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x2b y2ec w8 h1e\"><div class=\"t m0 x0 he y2ed ff2 fs2 fc0 sc0 ls2 ws2\">Réponse O<span class=\"_ _4\"></span>ui </div><div class=\"t m0 x0 h1a y275 ff2 fs9 fc0 sc0 ls2 ws2\">Réponse <span class=\"_ _4\"></span>Non<span class=\"_ _2\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1e\" class=\"pf w0 h0\" data-page-no=\"1e\"><div class=\"pc pc1e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdsSuEYQDH8edFEoPB4I/gNoOBblVyg0HZ+AOkGIyUjbIY2BiMhuvqLIqU7SZJsZHJcF1XTrrwGK5kx+Hp89neG3/dcN+e9943izEGAAAAEtVhAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUnwkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPWZAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA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qD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAAst5CoAAAFRSURBVACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAAB/r77L4ZYkeRyv8zQm9/1rdzp/nLfPeRoTTwYAANCRN1pafeoOQqcRAAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">31<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Représente les <span class=\"_ _2\"></span>réponses que <span class=\"ff3 ws14\">l’utilisateur</span> peut <span class=\"_ _2\"></span>choisir pa<span class=\"_ _1\"></span>r rapport <span class=\"_ _2\"></span>à la boite <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> d<span class=\"_ _2\"></span>ialo<span class=\"_ _2\"></span>gue. </span></span></div><div class=\"t m5 xa hc y1e2 ff4 fs2 fc4 sc0 ls2b\">3.</div><div class=\"t m6 xb hd y1e2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xb hc y1e2 ff4 fs2 fc4 sc0 ls2 ws2\">2 <span class=\"_ _b\"> </span>upda<span class=\"_ _2\"></span>teMs<span class=\"_ _2\"></span>gBox<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2ee ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">u<span class=\"_ _1\"></span>pdateMsgBox(<span class=\"fc8 ws2\">in<span class=\"_ _1\"></span>t <span class=\"fc0\">sliderDirection,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">bool<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">rightSi<span class=\"_ _1\"></span>deValidation,<span class=\"_ _1\"></span> <span class=\"fc8\">float <span class=\"_ _2\"></span>const<span class=\"_ _1\"></span> <span class=\"fc0\">&amp;DELTA_TIME, sf::Color <span class=\"_ _2\"></span>tex<span class=\"_ _1\"></span>tDefaultColor<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls38\">= </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y2ef ff2 fs2 fc0 sc0 ls2 ws2\">DEFAULT_MSG_BOX_TE<span class=\"_ _1\"></span>XT_COLOR, sf::Col<span class=\"_ _1\"></span>or selectedTextCol<span class=\"_ _1\"></span>or = <span class=\"_ _1\"></span>DEFAULT_MSG_<span class=\"_ _1\"></span>BOX_SELECTED_TE<span class=\"_ _1\"></span>XT_COLOR)<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 hc y2f0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2f1 ff2 fs2 fc0 sc0 ls2 ws2\">Met <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> jour <span class=\"_ _2\"></span>les informations <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> boite <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>dia<span class=\"_ _2\"></span>logue<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x6 hc y2f2 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2f3 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2f4 ff4 fs2 fc0 sc0 ls2 ws2\">sliderDirection <span class=\"ff2\">permet<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> gérer <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> direction <span class=\"ls1e ws16\">du</span> <span class=\"ff4\">GameSlider <span class=\"ff9\">(cliquer ici <span class=\"fc7\">1 </span>p<span class=\"_ _2\"></span>our plus<span class=\"_ _1\"></span> <span class=\"ffb ws14\">d’information)</span><span class=\"ff4 ls4b\">. </span></span></span></span></span></span></div><div class=\"t m0 xc hc y2f5 ff4 fs2 fc0 sc0 ls2 ws2\">rightSideValidation<span class=\"_ _1\"></span> <span class=\"ff3\">permet de va<span class=\"_ _1\"></span>lider une option via<span class=\"_ _1\"></span> le clic sur coté d<span class=\"_ _1\"></span>roit d’un écra<span class=\"_ _1\"></span>n. </span></div><div class=\"t m0 xc hc y2f6 ff4 fs2 fc0 sc0 ls2 ws2\">textDefaultColor <span class=\"_ _1\"></span><span class=\"ff2\">couleur du text du<span class=\"_ _1\"></span> message.<span class=\"_ _1\"></span> </span></div><div class=\"t m0 xc hc y2f7 ff4 fs2 fc0 sc0 ls2 ws2\">textSelectedColor<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff2\">couleu<span class=\"_ _1\"></span>r des <span class=\"_ _4\"></span>te<span class=\"_ _1\"></span>xtes des <span class=\"_ _2\"></span>bout<span class=\"_ _2\"></span>ons. </span></div><div class=\"t m2 xa hc y2f8 ff4 fs2 fc4 sc0 ls2 ws14\">3.3</div><div class=\"t m3 x1c hd y2f8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2f8 ff4 fs2 fc4 sc0 ls2 ws14\">upda<span class=\"_ _2\"></span>teT<span class=\"_ _2\"></span>imeWai<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y2f9 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">u<span class=\"_ _1\"></span>pdateTimeWait(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">float <span class=\"_ _2\"></span>const <span class=\"fc0\">&amp;<span class=\"_ _2\"></span>DELTA<span class=\"_ _2\"></span>_TIME<span class=\"_ _2\"></span>) </span></span></span></div><div class=\"t m0 x1 he y2fa ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2fb ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2fc ff2 fs2 fc0 sc0 ls2 ws2\">Met <span class=\"_ _2\"></span>à jour <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>ompteur<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>qui permet<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> faire <span class=\"_ _2\"></span>pati<span class=\"_ _1\"></span>enter <span class=\"ff3 ws14\">l’utilisateur</span> après <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>hoix <span class=\"ff3 ws14\">d’une</span> option. <span class=\"_ _2\"></span>C<span class=\"_ _1\"></span>eci permet <span class=\"ff3 ws14\">d’éviter</span> le<span class=\"_ _4\"></span>s </span></span></span></span></div><div class=\"t m0 x6 he y2fd ff2 fs2 fc0 sc0 ls2 ws2\">choix <span class=\"ls29 ws1f\">en</span> <span class=\"_ _4\"></span>boucle<span class=\"_ _2\"></span>s. </div><div class=\"t m2 xa hc y2fe ff4 fs2 fc4 sc0 ls2 ws14\">3.4</div><div class=\"t m3 x1c hd y2fe ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2fe ff4 fs2 fc4 sc0 ls2 ws2\">dra<span class=\"_ _2\"></span>wMsgBo<span class=\"_ _2\"></span>x </div><div class=\"t m0 x6 he y2cb ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">drawMsgBox() </span></div><div class=\"t m0 x6 hc y2ff ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y300 ff2 fs2 fc0 sc0 ls2 ws2\">Affiche <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>boite <span class=\"ls1e ws16\">de</span> di<span class=\"_ _2\"></span>alogue<span class=\"_ _2\"></span>. </div><div class=\"t m0 x1 he y301 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y302 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 h1f y303 ff7 fs2 fc3 sc0 ls2 ws2\">SDM (Step and Draw <span class=\"_ _2\"></span>Mana<span class=\"_ _2\"></span>ger)<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h20 y304 ff7 fsb fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y305 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y306 ff2 fs2 fc0 sc0 ls2 ws2\">Classe parent qui permet <span class=\"_ _2\"></span>à une <span class=\"_ _2\"></span>sc<span class=\"_ _1\"></span>ène <span class=\"ff3 ws14\">d’utiliser</span> les <span class=\"_ _4\"></span>fo<span class=\"_ _1\"></span>nctions qui <span class=\"_ _2\"></span>mett<span class=\"_ _1\"></span>ent à <span class=\"_ _4\"></span>jou<span class=\"_ _1\"></span>r <span class=\"ls24 ws1c\">et</span> affichent<span class=\"_ _1\"></span> automatiquement les obje<span class=\"_ _2\"></span>cts </div><div class=\"t m0 x6 he y307 ff3 fs2 fc0 sc0 ls2 ws14\">d’une<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>scè<span class=\"_ _1\"></span>ne. Elle permet <span class=\"_ _2\"></span>aus<span class=\"_ _1\"></span>si <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>gérer <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>profondeur <span class=\"ff3 ws14\">d’affichage</span> des o<span class=\"_ _2\"></span>bjet<span class=\"_ _2\"></span>s. </span></div><div class=\"t m2 xa hc y308 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y308 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y308 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts publics <span class=\"ls21 ws19\">de</span> <span class=\"_ _4\"></span>SDM<span class=\"_ _4\"></span><span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y309 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y309 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y309 ff4 fs2 fc4 sc0 ls2 ws2\">m_S<span class=\"_ _2\"></span>DMsce<span class=\"_ _2\"></span>neObj<span class=\"_ _2\"></span>ects </div><div class=\"t m0 x6 hc y30a ff4 fs2 fc5 sc0 ls2 ws14\">std::vector<span class=\"fc4 ls4a\">&lt;</span>std::shared_p<span class=\"_ _1\"></span>tr<span class=\"ff2 fc0 ws2\">&lt;Ma<span class=\"_ _1\"></span>inObject&gt;&gt; <span class=\"_ _2\"></span>m_SDMscen<span class=\"_ _1\"></span>eObjects </span></div><div class=\"t m0 x6 hc y30b ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div></div><div class=\"c x6 y30c w9 h21\"><div class=\"t m0 x0 h1f y30d ff7 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc h18 y30e ff4 fs9 fc4 sc0 ls2 ws2\">class <span class=\"_ _0\"></span>S<span class=\"_ _1\"></span>DM </div></div><div class=\"c x6 y30c w9 h21\"><div class=\"t m0 x0 hc y30f ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d he y310 ff2 fs2 fc0 sc0 ls2 ws2\">SDM; </div></div><div class=\"c x6 y30c w9 h21\"><div class=\"t m0 x0 hc y311 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/disp<span class=\"_ _2\"></span>lay/<span class=\"_ _2\"></span>SDM.h<span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf1f\" class=\"pf w0 h0\" data-page-no=\"1f\"><div class=\"pc pc1f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQDAp307NkEYCMMwzA8iiI3u4Bj2DiAELJ3BBZzAQrAUXMERLHQDIWXa62xsbM7GIoUL3OV5umu/pHlzBABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAAAo1cgE9OWcjQAAUIGIMAKqjz+2h/vr/bEDAEDRZtPxZbe0A79PAO52AAAAKua/PgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAIekCgEAAACrSURBVADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAKCw6juuzhERcVufuraJuC6e882+d548uraJIUkpeUEAABigTM4VPc8vTB5H4eBCAksAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">32<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff2 fs2 fc0 sc0 ls2 ws2\">Conteneur qui <span class=\"_ _2\"></span>permet<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> stock<span class=\"_ _1\"></span>er <span class=\"_ _2\"></span>les<span class=\"_ _1\"></span> obje<span class=\"_ _2\"></span>cts (dérivés <span class=\"ls1f ws17\">de</span> <span class=\"ls27 ws1d\">la<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> classe <span class=\"_ _2\"></span><span class=\"ff4 ws14\">MainObject<span class=\"ff2 ws2\">)<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> sc<span class=\"_ _1\"></span>ène qui <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>eront gérés par <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> S<span class=\"_ _2\"></span>DM<span class=\"_ _2\"></span>. </span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c0 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y1c0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c0 ff4 fs2 fc4 sc0 ls2 ws14\">SDM<span class=\"_ _2\"></span>getOb<span class=\"_ _2\"></span>ject<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y1c1 ff2 fs2 fc0 sc0 ls2 ws2\">MainObject*<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>SDMgetObj<span class=\"_ _1\"></span>ect(<span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::strin<span class=\"_ _1\"></span>g<span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _2\"></span>ame) </span></span></span></div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> object q<span class=\"_ _2\"></span>ui <span class=\"ls3d ws2d\">se</span> <span class=\"_ _2\"></span>trouve dans <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> conteneur <span class=\"ls24 ws1c\">en</span> fonction <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> son n<span class=\"_ _4\"></span>om.<span class=\"_ _2\"></span> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c5 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y312 ff2 fs2 fc8 sc0 ls2 ws2\">auto <span class=\"_ _4\"></span><span class=\"fc0\">player<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>= <span class=\"_ _4\"></span>SDM<span class=\"_ _1\"></span>getObject(<span class=\"_ _1\"></span><span class=\"ff4 fc7 ws14\">&quot;Player&quot;</span>); </span></div><div class=\"t m0 x6 he y313 ff2 fs2 fc0 sc0 ls2 ws14\">pla<span class=\"_ _2\"></span>yer-&gt;<span class=\"_ _2\"></span>setX<span class=\"_ _2\"></span>(<span class=\"fcb\">777.<span class=\"_ _2\"></span>f<span class=\"fc0 ls3c ws39\">);<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x1 he y314 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y315 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y315 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y315 ff4 fs2 fc4 sc0 ls2 ws2\">SDM<span class=\"_ _2\"></span>addS<span class=\"_ _2\"></span>ceneOb<span class=\"_ _2\"></span>ject </div><div class=\"t m0 x6 hc y316 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"ls2 ws2\"> </span></span></div><div class=\"t m0 x6 hc y317 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">SDMaddSce<span class=\"_ _1\"></span>neObject(<span class=\"ff4 fc5\">st<span class=\"_ _1\"></span>d::shared_ptr</span><span class=\"ws2\">&lt;<span class=\"_ _1\"></span>T&gt; <span class=\"_ _2\"></span>obj,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">c<span class=\"_ _1\"></span>allStepFunction<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>= <span class=\"ff4 fc5 ws14\">true</span>, <span class=\"fc8\">bool </span>callDrawFunction <span class=\"_ _2\"></span>= <span class=\"ff4 fc5 ws14\">true</span>, <span class=\"fc8 ws14\">c<span class=\"_ _2\"></span>onst<span class=\"fc0 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y318 ff4 fs2 fc5 sc0 ls2 ws14\">std::string<span class=\"ff2 fc0 ws2\">&amp; name = <span class=\"_ _4\"></span><span class=\"ff4 fc7\">&quot;nu<span class=\"_ _1\"></span>ll&quot; <span class=\"ff2 fc0\">, <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">call<span class=\"_ _1\"></span>EventFunction<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>= <span class=\"ff4 fc5 ws14\">false</span><span class=\"ls3c\">) </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y319 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y31a ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’ajouter</span> <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>objet dans <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>conte<span class=\"_ _2\"></span>neur<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x6 hc yff ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:<span class=\"fc0\"> </span></div><div class=\"t m0 xc hc y31b ff4 fs2 fc0 sc0 ls2 ws2\">obj <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’objet<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> à <span class=\"_ _2\"></span>ajou<span class=\"_ _2\"></span>ter. </span></span></div><div class=\"t m0 x1 he y31c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y31d ff4 fs2 fc0 sc0 ls2 ws2\">callStepFunction <span class=\"ff2\">permet <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>avoir <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>SDM <span class=\"_ _1\"></span>doit mettre à <span class=\"_ _2\"></span>jour <span class=\"_ _2\"></span><span class=\"ff3\">l’obj<span class=\"_ _1\"></span>et. </span></span></span></span></div><div class=\"t m0 xc hc yf4 ff4 fs2 fc0 sc0 ls2 ws2\">callDrawFunction <span class=\"ff3\">p<span class=\"_ _1\"></span>ermet de savoi<span class=\"_ _1\"></span>r si le SDM doit d<span class=\"_ _1\"></span>éssiner l’objet. </span></div><div class=\"t m0 xc hc y31e ff4 fs2 fc0 sc0 ls2 ws2\">name <span class=\"ff3\">permet de donn<span class=\"_ _1\"></span>er un nom à l’ob<span class=\"_ _1\"></span>jet lors de l’ajout.<span class=\"_ _9\"></span><span class=\"ff2\"> </span></span></div><div class=\"t m0 xc hc y31f ff4 fs2 fc0 sc0 ls2 ws2\">callEventFunction <span class=\"_ _1\"></span><span class=\"ff2\">permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>savoi<span class=\"_ _1\"></span>r <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>SDM doit appeler <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> méthode <span class=\"_ _2\"></span><span class=\"ff3\">d’évèneme<span class=\"_ _1\"></span>nt de<span class=\"ff2\"> </span><span class=\"ws14\">l’<span class=\"_ _2\"></span>obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y320 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y320 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y320 ff4 fs2 fc4 sc0 ls2 ws14\">SDM<span class=\"_ _2\"></span>addS<span class=\"_ _2\"></span>prite<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y321 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y322 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">SDMaddSprite(sf::Tex<span class=\"_ _1\"></span>ture &amp;tex, </span>const </span><span class=\"ws14\">std::string<span class=\"_ _1\"></span></span><span class=\"ff2 fc0\">&amp; name , <span class=\"fc8\">float </span>x, <span class=\"fc8\">float </span><span class=\"ls43 ws33\">y,</span> <span class=\"fc8\">bool </span>center <span class=\"_ _2\"></span>= <span class=\"ff4 fc5 ws14\">false</span>, <span class=\"fc8\">int </span>depth <span class=\"ls2e\">= </span></span></div><div class=\"t m0 x6 he y323 ff2 fs2 fc0 sc0 ls2 ws2\">Dep<span class=\"_ _2\"></span>thObje<span class=\"_ _2\"></span>ct:<span class=\"_ _2\"></span>:NORMA<span class=\"_ _2\"></span>L_DEPT<span class=\"_ _2\"></span>H) </div><div class=\"t m0 x6 hc y324 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y325 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’ajouter</span> un Sprite SFML dans <span class=\"ls1d ws15\">le</span> conteneur. Elle <span class=\"ls4c ws3a\">ne</span> <span class=\"_ _2\"></span>fe<span class=\"_ _1\"></span>ra pas partie <span class=\"_ _2\"></span>des objets à mettr<span class=\"_ _1\"></span>e à jour<span class=\"_ _2\"></span> mais <span class=\"ls1e ws16\">de</span> ceux qui </div><div class=\"t m0 x6 hc y326 ff2 fs2 fc0 sc0 ls2 ws2\">seront affichés. Le Sprit<span class=\"_ _1\"></span>e sera associé à un obj<span class=\"_ _1\"></span>et de type <span class=\"_ _1\"></span><span class=\"ff4 ws14\">MainObjec<span class=\"_ _1\"></span>t</span>. </div><div class=\"t m2 xa hc y327 ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y327 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y327 ff4 fs2 fc4 sc0 ls2 ws14\">SDM<span class=\"_ _2\"></span>setObjD<span class=\"_ _4\"></span>epth<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y328 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y186 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">SDMsetObjDept<span class=\"_ _1\"></span>h(</span>const <span class=\"ff4 fc5 ws14\">st<span class=\"_ _2\"></span>d<span class=\"_ _1\"></span>::string<span class=\"ff2 fc0 ws2\">&amp; name, <span class=\"_ _2\"></span><span class=\"fc8\">int <span class=\"fc0\">dep<span class=\"_ _2\"></span>th) </span></span></span></span></span></div><div class=\"t m0 x1 he y329 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y32a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0\">SDMsetObjDepth(Ma<span class=\"_ _1\"></span>inObject *obj, <span class=\"_ _4\"></span><span class=\"fc8\">int<span class=\"_ _1\"></span> <span class=\"fc0\">dep<span class=\"_ _2\"></span>th) </span></span></span></span></div><div class=\"t m0 x6 hc y32b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y32c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y32d ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>défi<span class=\"_ _1\"></span>nir <span class=\"_ _2\"></span>la prof<span class=\"_ _1\"></span>ondeur <span class=\"ff3 ws14\">d’affichage</span> <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>n<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>objet. </span></span></div><div class=\"t m0 x1 he y32e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y32f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 h1f y330 ff7 fs2 fc3 sc0 ls2 ws2\">Game S<span class=\"_ _2\"></span>ound<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf20\" class=\"pf w0 h0\" data-page-no=\"20\"><div class=\"pc pc20 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEA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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">33<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1be ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>GameSound </div><div class=\"t m0 x6 hc y1c0 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0 ws14\">GameSound</span><span class=\"fc4 ls4d\">;</span><span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e2 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/sound<span class=\"_ _2\"></span>/<span class=\"ff4\">Game<span class=\"_ _2\"></span>Soun<span class=\"_ _2\"></span>d<span class=\"ff9 ls4e ws3b\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 hc y1e3 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y331 ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"_ _2\"></span>permet <span class=\"ff3 ws14\">d’utiliser</span> les <span class=\"_ _2\"></span>so<span class=\"_ _1\"></span>ns dans <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>je<span class=\"_ _2\"></span>u. </div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e8 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts publics <span class=\"ls21 ws19\">de</span> <span class=\"_ _4\"></span>GameSo<span class=\"_ _2\"></span>und<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y332 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y332 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y332 ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Soun<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y333 ff2 fs2 fc0 sc0 ls2 ws14\">GameSound(<span class=\"fc8 ws2\">const<span class=\"_ _1\"></span> </span><span class=\"ff4 fc5\">st<span class=\"_ _2\"></span>d::st<span class=\"_ _1\"></span>ring<span class=\"ff2 fc0 ws2\">&amp; <span class=\"_ _2\"></span>soundName, <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"ff4 fc5 ws14\">std::string<span class=\"_ _1\"></span></span><span class=\"fc0\">&amp; <span class=\"_ _2\"></span>fileP<span class=\"_ _2\"></span>ath) </span></span></span></span></div><div class=\"t m0 x1 he y334 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y335 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y336 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui permet <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>charger <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>so<span class=\"_ _1\"></span>n <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>lui<span class=\"_ _1\"></span> donner <span class=\"_ _4\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> n<span class=\"_ _2\"></span>om.<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x1 he y337 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2c0 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y2c0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2c0 ff4 fs2 fc4 sc0 ls2 ws14\">loa<span class=\"_ _2\"></span>dReso<span class=\"_ _2\"></span>urce<span class=\"_ _2\"></span>s<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y338 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y339 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">loa<span class=\"_ _1\"></span>dResources(<span class=\"fc8 ws2\">const </span><span class=\"ff4 fc5\">std::string</span><span class=\"ws2\">&amp; f<span class=\"_ _2\"></span>ileP<span class=\"_ _2\"></span>ath) </span></span></div><div class=\"t m0 x6 hc y2f8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2f9 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>charger <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>son<span class=\"_ _2\"></span>. </div><div class=\"t m0 x1 he y33a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y33b ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y33b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y33b ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Soun<span class=\"_ _2\"></span>dBuffe<span class=\"_ _2\"></span>r </div><div class=\"t m0 x6 he y2fc ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Sou<span class=\"_ _2\"></span>ndBuf<span class=\"_ _2\"></span>fer&amp; <span class=\"_ _2\"></span>getSo<span class=\"_ _2\"></span>undBu<span class=\"_ _2\"></span>ffer<span class=\"_ _2\"></span>() </div><div class=\"t m0 x6 hc yfb ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y33c ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l<span class=\"_ _1\"></span>’instance<span class=\"ff2 ws2\"> Sound <span class=\"_ _4\"></span>Buffe<span class=\"_ _2\"></span>r. </span></span></div><div class=\"t m0 x1 he y33d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y33e ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y33e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y33e ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Soun<span class=\"_ _2\"></span>d </div><div class=\"t m0 x6 he y33f ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Sou<span class=\"_ _2\"></span>nd&amp; <span class=\"_ _2\"></span>getSou<span class=\"_ _2\"></span>nd()<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y340 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y341 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l<span class=\"_ _1\"></span>’instance<span class=\"ff2 ws2\"> S<span class=\"_ _2\"></span>ound. </span></span></div><div class=\"t m0 x1 he y342 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y343 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y344 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 h1f y345 ff7 fs2 fc3 sc0 ls2 ws2\">Game M<span class=\"_ _2\"></span>usic<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h1f y346 ff7 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y347 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y347 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y347 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Game<span class=\"_ _1\"></span>Music </div><div class=\"t m0 x6 hc y348 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0 ws14\">GameMusic<span class=\"_ _1\"></span></span><span class=\"fc4 ls4d\">;</span><span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y349 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/sound<span class=\"_ _2\"></span>/<span class=\"ff4\">GameM<span class=\"_ _2\"></span>usic<span class=\"_ _2\"></span><span class=\"ff9 ls4e ws3b\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 hc y34a ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y34b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y32c ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"_ _2\"></span>permet <span class=\"ff3 ws14\">d’utiliser</span> les <span class=\"_ _2\"></span>mus<span class=\"_ _1\"></span>iques dans <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y34c ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y34c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y34c ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts publics <span class=\"ls21 ws19\">de</span> <span class=\"_ _4\"></span>GameM<span class=\"_ _2\"></span>usic<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y34d ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y34d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y34d ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Musi<span class=\"_ _2\"></span>c<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y18d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y34e ff2 fs2 fc0 sc0 ls2 ws14\">GameMusic(<span class=\"fc8 ws2\">c<span class=\"_ _1\"></span>onst <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">s<span class=\"_ _1\"></span>td::string<span class=\"ff2 fc0 ws2\">&amp; musicName, <span class=\"_ _4\"></span><span class=\"fc8\">c<span class=\"_ _1\"></span>onst <span class=\"ff4 fc5 ws14\">std::string<span class=\"_ _1\"></span></span><span class=\"fc0\">&amp; <span class=\"_ _2\"></span>file<span class=\"_ _2\"></span>Path<span class=\"_ _2\"></span>) </span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf21\" class=\"pf w0 h0\" data-page-no=\"21\"><div class=\"pc pc21 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdv2sTYQDH4fc1IYQ4CHHwbxAtrhUUcWhxKuLgKAa6ioOgi4s4+YN2sLsOdVAcSgYHhZaKYNfSQUclQzloOCxaSrj4OgiliyC0nubyPONNuS835MPdJTGlFAAAAKioIyYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPWZAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8JAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9JgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACo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AKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1Qf8bL+OaQCEgTCM5kZGPOAFASQkuEEDCSMikMCCA5KOXauirGig72033798AACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAOkwYtYAAAF8SURBVED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAABquvm08IiLimvac5ohzePpl/dzdndMcLSmlGAgAAA2q1Pqjf77SoIxW2nAFwAAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">34<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>charger une musique <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>lui donner <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> no<span class=\"_ _4\"></span>m. </span></span></span></span></div><div class=\"t m2 xa hc y1e2 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y1e2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e2 ff4 fs2 fc4 sc0 ls2 ws14\">loa<span class=\"_ _2\"></span>dReso<span class=\"_ _2\"></span>urce<span class=\"_ _2\"></span>s<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c3 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">loa<span class=\"_ _1\"></span>dResources(<span class=\"fc8 ws2\">const </span><span class=\"ff4 fc5\">std::string</span><span class=\"ws2\">&amp; f<span class=\"_ _2\"></span>ileP<span class=\"_ _2\"></span>ath) </span></span></div><div class=\"t m0 x1 he y34f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y350 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> charger <span class=\"_ _2\"></span><span class=\"ls1d\">la <span class=\"ls2\">mus<span class=\"_ _2\"></span>ique. </span></span></span></span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y351 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y351 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y351 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Musi<span class=\"_ _2\"></span>c </div><div class=\"t m0 x6 he y1eb ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Mus<span class=\"_ _2\"></span>ic&amp; ge<span class=\"_ _2\"></span>tMus<span class=\"_ _2\"></span>ic()<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y1c9 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1ca ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l<span class=\"_ _1\"></span>’instance<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>Music<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y352 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y1ef ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y353 ff9 fs2 fc3 sc0 ls2 ws2\">GSM <span class=\"_ _2\"></span>(Game<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>Sound Ma<span class=\"_ _2\"></span>nager)<span class=\"_ _2\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 h22 y354 ff9 fsb fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y355 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y17a ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y356 ff2 fs2 fc0 sc0 ls2 ws2\">Classe parent qui permet <span class=\"_ _2\"></span>à une scène <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’ajoute<span class=\"_ _1\"></span>r<span class=\"ff2 ws2\"> <span class=\"ls24 ws1c\">et</span> </span>d’<span class=\"_ _2\"></span>utilis<span class=\"_ _1\"></span>er<span class=\"ff2 ws2\"> des sons <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span>musiqu<span class=\"_ _1\"></span>es sans <span class=\"_ _2\"></span>initial<span class=\"_ _1\"></span>iser les <span class=\"_ _2\"></span>objets SFM<span class=\"_ _2\"></span>L. </span></span></div><div class=\"t m2 xa hc y357 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y357 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y357 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts publics <span class=\"ls21 ws19\">de</span> <span class=\"_ _4\"></span>GSM<span class=\"_ _4\"></span><span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y358 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y358 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y358 ff4 fs2 fc4 sc0 ls2 ws2\">Les Conteneurs du GSM<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 hc y359 ff4 fs2 fc5 sc0 ls2 ws14\">std::vector<span class=\"ff2 fc0 ls2e\">&lt;</span>std::sh<span class=\"_ _1\"></span>ared_ptr<span class=\"ff2 fc0 ws2\">&lt;Ga<span class=\"_ _1\"></span>meSound&gt;&gt; <span class=\"_ _2\"></span>m_GSMsou<span class=\"_ _1\"></span>nd </span></div><div class=\"t m0 x6 hc y35a ff4 fs2 fc5 sc0 ls2 ws14\">std::vector<span class=\"ff2 fc0 ls2e\">&lt;</span>std::sh<span class=\"_ _1\"></span>ared_ptr<span class=\"ff2 fc0 ws2\">&lt;Ga<span class=\"_ _1\"></span>meMusic&gt;&gt; m_GSMmus<span class=\"_ _1\"></span>ic </span></div><div class=\"t m0 x6 hc y35b ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y35c ff2 fs2 fc0 sc0 ls2 ws2\">Conteneur qui <span class=\"_ _2\"></span>perme<span class=\"_ _1\"></span>t <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> stock<span class=\"_ _1\"></span>er <span class=\"_ _2\"></span>l<span class=\"_ _1\"></span>es sons e<span class=\"_ _2\"></span>t musiqu<span class=\"_ _1\"></span>es <span class=\"ls1e ws16\">de</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>sc<span class=\"_ _1\"></span>ène <span class=\"_ _2\"></span>qui seront gérés par <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> G<span class=\"_ _2\"></span>SM<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y35d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y182 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y182 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y182 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>addSo<span class=\"_ _2\"></span>und<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y35e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">void <span class=\"_ _2\"></span>GSMadd<span class=\"_ _1\"></span>Sound(<span class=\"_ _1\"></span><span class=\"fc8\">const <span class=\"ff4 fc5 ws14\">std::string</span></span>&amp;<span class=\"_ _1\"></span> name, <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::strin<span class=\"_ _1\"></span>g<span class=\"ff2 fc0 ws2\">&amp; fi<span class=\"_ _2\"></span>lePat<span class=\"_ _2\"></span>h) </span></span></span></span></div><div class=\"t m0 x1 he y35f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y360 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y361 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’ajouter</span> <span class=\"ls2c ws21\">un</span> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>on dans <span class=\"ls1d ws15\">le</span> con<span class=\"_ _2\"></span>tene<span class=\"_ _2\"></span>ur. </div><div class=\"t m0 x6 hc y362 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y363 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y364 ff4 fs2 fc0 sc0 ls2 ws2\">name <span class=\"ff2\">n<span class=\"_ _2\"></span>om<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> so<span class=\"_ _2\"></span>n.<span class=\"_ _2\"></span> </span></span></span></div><div class=\"t m0 x1 he y365 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y366 ff4 fs2 fc0 sc0 ls2 ws2\">filePath <span class=\"_ _2\"></span><span class=\"ff2\">chemin<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">du</span> <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>ichier so<span class=\"_ _4\"></span>n. </span></div><div class=\"t m0 x1 he y367 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y32f ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y32f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y32f ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>addSo<span class=\"_ _2\"></span>undOb<span class=\"_ _2\"></span>ject<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y368 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y369 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">GSMa<span class=\"_ _1\"></span>ddSoundObject(<span class=\"_ _1\"></span><span class=\"ff4 fc5\">std::shared_p<span class=\"_ _1\"></span>tr</span><span class=\"ws2\">&lt;Gam<span class=\"_ _1\"></span>eSound&gt; <span class=\"_ _2\"></span>sound, <span class=\"fc8\">bool <span class=\"_ _4\"></span><span class=\"fc0\">showEr<span class=\"_ _1\"></span>ror <span class=\"_ _2\"></span>= <span class=\"ff4 fc5 ws14\">tru<span class=\"_ _2\"></span>e<span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></span></div></div><div class=\"c x6 y36a w9 h23\"><div class=\"t m0 x0 hc y36b ff9 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y36c ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>GSM </div></div><div class=\"c x6 y36a w9 h23\"><div class=\"t m0 x0 hc y36d ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hc y36e ff2 fs2 fc0 sc0 ls2 ws14\">GSM<span class=\"ff4 fc4 ls4d\">;</span><span class=\"ff4 ws2\"> </span></div></div><div class=\"c x6 y36a w9 h23\"><div class=\"t m0 x0 hc y36f ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/sound<span class=\"_ _2\"></span>/<span class=\"ff4 ls4f ws3c\">GSM</span><span class=\"ls50 ws3d\">.h</span><span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf22\" class=\"pf w0 h0\" data-page-no=\"22\"><div class=\"pc pc22 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>ajout<span class=\"_ _1\"></span>er<span class=\"ff2 ws2\"> <span class=\"ls2c ws21\">un</span> objet <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>on (<span class=\"ff4 ws14\">is::GameSound</span>) <span class=\"ff4\">existant<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff2\">dans le con<span class=\"_ _2\"></span>teneu<span class=\"_ _2\"></span>r. </span></span></span></span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc0 sc0 ls2 ws2\">showError <span class=\"ff2\">affiche <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> me<span class=\"_ _2\"></span>ssa<span class=\"_ _1\"></span>ge <span class=\"ff3 ws14\">d’erreur</span> <span class=\"ls24 ws1c\">en</span> cas <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> doublo<span class=\"_ _1\"></span>n </span>du<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>fichier so<span class=\"_ _2\"></span>n.<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>addMu<span class=\"_ _2\"></span>sic<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">void <span class=\"_ _2\"></span>G<span class=\"_ _1\"></span>SMaddMusic(<span class=\"_ _1\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::stri<span class=\"_ _1\"></span>ng<span class=\"ff2 fc0 ws2\">&amp;name, <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"ff2 fc0 ws2\">&amp; fi<span class=\"_ _2\"></span>lePa<span class=\"_ _2\"></span>th) </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>ajout<span class=\"_ _1\"></span>er<span class=\"ff2 ws2\"> une <span class=\"_ _2\"></span>musique dans <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>conten<span class=\"_ _2\"></span>eur. </span></span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y370 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c9 ff4 fs2 fc0 sc0 ls2 ws2\">name <span class=\"ff2\">n<span class=\"_ _2\"></span>om<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> mu<span class=\"_ _2\"></span>sique<span class=\"_ _2\"></span>. </span></span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1ca ff4 fs2 fc0 sc0 ls2 ws2\">filePath <span class=\"_ _2\"></span><span class=\"ff2\">chemin<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">du</span> <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>ichier mus<span class=\"_ _2\"></span>ique<span class=\"_ _2\"></span>. </span></div><div class=\"t m2 xa hc y1ee ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y1ee ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1ee ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>addMu<span class=\"_ _2\"></span>sicObj<span class=\"_ _2\"></span>ect<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y223 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y224 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMaddMusic<span class=\"_ _1\"></span>Object(<span class=\"ff4 fc5\">std<span class=\"_ _1\"></span>::shared_ptr</span><span class=\"ws2\">&lt;Gam<span class=\"_ _1\"></span>eMusic&gt;<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>music, <span class=\"fc8\">bool <span class=\"_ _4\"></span><span class=\"fc0\">sho<span class=\"_ _1\"></span>wError = <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">tru<span class=\"_ _1\"></span>e<span class=\"ff2 fc0 ls3c ws2\">) </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y226 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1ce ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’ajout<span class=\"_ _1\"></span>er<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> objet <span class=\"_ _2\"></span>mus<span class=\"_ _1\"></span>ique (<span class=\"ff4 ws14\">is::GameMusic<span class=\"_ _1\"></span></span>) <span class=\"ff4\">existant </span>dans <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>conten<span class=\"_ _2\"></span>eur. </span></span></span></span></span></span></div><div class=\"t m0 x6 hc ybd ff4 fs2 fc0 sc0 ls2 ws2\">showError <span class=\"ff2\">affiche <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>message<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’erreur</span> <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">en<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>cas<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> doublon <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>fichier mu<span class=\"_ _2\"></span>sique. </span></span></span></div><div class=\"t m0 x1 he y372 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y228 ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y228 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y228 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>pause<span class=\"_ _2\"></span>Soun<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y229 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMpaus<span class=\"_ _1\"></span>eSound(<span class=\"fc8 ws2\">const<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">s<span class=\"_ _1\"></span>td::string<span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _2\"></span>ame<span class=\"_ _4\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 he y373 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y20c ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> mettre <span class=\"ls29 ws1f\">en</span> <span class=\"_ _4\"></span>paus<span class=\"_ _1\"></span>e <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> son gérer <span class=\"_ _2\"></span>par <span class=\"ls27 ws1d\">le</span> <span class=\"_ _2\"></span>GS<span class=\"_ _2\"></span>M. </span></span></span></span></div><div class=\"t m2 xa hc y294 ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y294 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y294 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>stop<span class=\"_ _2\"></span>Sound<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y374 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y9f ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMstop<span class=\"_ _1\"></span>Sound(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::strin<span class=\"_ _1\"></span>g<span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _2\"></span>am<span class=\"_ _2\"></span>e)<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x1 he y375 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y376 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y377 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> stopper <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> so<span class=\"_ _1\"></span>n <span class=\"_ _2\"></span>g<span class=\"_ _1\"></span>érer par <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> G<span class=\"_ _2\"></span>SM<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xa hc ya3 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd ya3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc ya3 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>pauseM<span class=\"_ _2\"></span>usic<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y378 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">vo<span class=\"_ _1\"></span>id <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMpaus<span class=\"_ _1\"></span>eMusic(<span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::stri<span class=\"_ _1\"></span>ng<span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _2\"></span>ame) </span></span></span></span></span></div><div class=\"t m0 x1 he y379 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y37a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he yb8 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> mettre <span class=\"ls29 ws1f\">en</span> <span class=\"_ _4\"></span>paus<span class=\"_ _1\"></span>e une musique <span class=\"_ _2\"></span>gérer par <span class=\"ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> GS<span class=\"_ _2\"></span>M. </span></span></span></span></div><div class=\"t m0 x1 he y37b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y37c ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y37c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y37c ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>stopM<span class=\"_ _2\"></span>usic<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y37d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y37e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMstopMus<span class=\"_ _1\"></span>ic(<span class=\"fc8 ws2\">c<span class=\"_ _1\"></span>onst <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"ff2 fc0 ws2\">&amp; name<span class=\"_ _2\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 he y37f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc ya7 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y380 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> stopper <span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>ne musique <span class=\"_ _2\"></span>gérer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>pa<span class=\"_ _1\"></span>r <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>GS<span class=\"_ _2\"></span>M. </span></span></span></span></div><div class=\"t m2 xa hc y381 ff4 fs2 fc4 sc0 ls2 ws14\">2.10</div><div class=\"t m3 x20 hd y381 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y381 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>delet<span class=\"_ _2\"></span>eSoun<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x21 h9 y382 ff6 fs3 fc0 sc0 ls1b ws13\">35<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf23\" class=\"pf w0 h0\" data-page-no=\"23\"><div class=\"pc pc23 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbr2vVbxTA8XOuV8MUMeiwTW0ii9PorzaMyoJBk0GDyWK6yWIyWEyCmMSmWatiEX8FYTCDKBpkYUXcMVyQL+wP+MJzXq9w+znPBz6899mTVRUAAAAMamIFAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+KwAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9VkBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPCgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfVYAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOqzAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoA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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">36<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMdel<span class=\"_ _1\"></span>eteSound(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _4\"></span>ame<span class=\"_ _2\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1c1 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> supprimer <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>son gérer par <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> GS<span class=\"_ _2\"></span>M. </span></span></span></span></div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">2.11</div><div class=\"t m3 x20 hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>delet<span class=\"_ _2\"></span>eMusi<span class=\"_ _2\"></span>c<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">G<span class=\"_ _1\"></span>SMdeleteMusi<span class=\"_ _1\"></span>c(<span class=\"fc8 ws2\">const<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"ff2 fc0 ws2\">&amp;<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>name) </span></span></span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c5 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1ea ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> supprimer <span class=\"_ _2\"></span>un<span class=\"_ _1\"></span>e musique gérer <span class=\"_ _2\"></span>par <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>GS<span class=\"_ _2\"></span>M. </span></span></div><div class=\"t m2 xa hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">2.12</div><div class=\"t m3 x20 hd y221 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>getSo<span class=\"_ _2\"></span>und<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ec ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Sou<span class=\"_ _1\"></span>nd* <span class=\"_ _4\"></span>G<span class=\"_ _1\"></span>SMgetSound(<span class=\"_ _1\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::str<span class=\"_ _1\"></span>ing<span class=\"ff2 fc0 ws2\">&amp; <span class=\"_ _2\"></span>name) </span></span></span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ca ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1cb ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> son qui <span class=\"ls28 ws1e\">se</span> <span class=\"_ _4\"></span>trou<span class=\"_ _1\"></span>ve dans <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>conte<span class=\"_ _1\"></span>neur <span class=\"ls24 ws1c\">en</span> fonction <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>son n<span class=\"_ _2\"></span>om<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y223 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y224 ff4 fs2 fc4 sc0 ls2 ws14\">2.13</div><div class=\"t m3 x20 hd y224 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y224 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>getMu<span class=\"_ _2\"></span>sic<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y225 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y226 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Music<span class=\"_ _1\"></span>* <span class=\"_ _2\"></span>GSMgetMus<span class=\"_ _1\"></span>ic(<span class=\"fc8\">const <span class=\"ff4 fc5 ws14\">std::string</span></span>&amp; <span class=\"_ _2\"></span>name<span class=\"_ _2\"></span>) </span></div><div class=\"t m0 x1 he y383 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y384 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y28f ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0\">une <span class=\"_ _2\"></span>musique<span class=\"_ _1\"></span> qui <span class=\"_ _4\"></span><span class=\"ls3d ws2d\">se<span class=\"ls2 ws2\"> trouve dans <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>onteneur <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>fonction <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>so<span class=\"_ _1\"></span>n n<span class=\"_ _2\"></span>om<span class=\"_ _2\"></span>. </span></span></span></div><div class=\"t m0 x1 he y385 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y290 ff4 fs2 fc4 sc0 ls2 ws14\">2.14</div><div class=\"t m3 x20 hd y290 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y290 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>autres meth<span class=\"_ _2\"></span>odes<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1d1 ff2 fs2 fc0 sc0 ls2 ws2\">Ces méthodes <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>dessous on<span class=\"_ _1\"></span>t <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>mêm<span class=\"_ _1\"></span>e rôle <span class=\"_ _2\"></span>que celles qui sont <span class=\"ls29 ws1f\">au</span> <span class=\"_ _2\"></span>dessus,<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>différence ic<span class=\"_ _1\"></span>i est que <span class=\"_ _2\"></span>leurs noms </div><div class=\"t m0 x6 hc y386 ff2 fs2 fc0 sc0 ls2 ws2\">commencant par <span class=\"_ _1\"></span><span class=\"ff4\">« GSM » </span>sont rempl<span class=\"_ _1\"></span>acés par <span class=\"ff4\">« GR<span class=\"_ _1\"></span>M » (Game R<span class=\"_ _1\"></span>esource Ma<span class=\"_ _1\"></span>nager).<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x1 h1b y387 ff4 fsa fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y388 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div><div class=\"c x6 y389 wa h24\"><div class=\"t m0 x0 hc y38a ff4 fs2 fc0 sc0 ls2 ws2\">Autres <span class=\"_ _2\"></span>metho<span class=\"_ _2\"></span>des </div><div class=\"t m0 x0 he y38b ff2 fs2 fc0 sc0 ls2 ws2\">GRMa<span class=\"_ _2\"></span>ddSo<span class=\"_ _2\"></span>und </div><div class=\"t m0 x0 he y38c ff2 fs2 fc0 sc0 ls2 ws2\">GRMa<span class=\"_ _2\"></span>ddSo<span class=\"_ _2\"></span>undObj<span class=\"_ _2\"></span>ect </div><div class=\"t m0 x0 he y38d ff2 fs2 fc0 sc0 ls2 ws2\">GRMa<span class=\"_ _2\"></span>ddMu<span class=\"_ _2\"></span>sic </div><div class=\"t m0 x0 he y38e ff2 fs2 fc0 sc0 ls2 ws2\">GRMa<span class=\"_ _2\"></span>ddMu<span class=\"_ _2\"></span>sicOb<span class=\"_ _2\"></span>ject </div><div class=\"t m0 x0 he y38f ff2 fs2 fc0 sc0 ls2 ws2\">GRMs<span class=\"_ _2\"></span>etSo<span class=\"_ _2\"></span>undLo<span class=\"_ _2\"></span>op </div><div class=\"t m0 x0 he y390 ff2 fs2 fc0 sc0 ls2 ws2\">GRMs<span class=\"_ _2\"></span>etMu<span class=\"_ _2\"></span>sicLo<span class=\"_ _2\"></span>op </div><div class=\"t m0 x0 he y391 ff2 fs2 fc0 sc0 ls2 ws2\">GRMg<span class=\"_ _2\"></span>etSo<span class=\"_ _2\"></span>und </div><div class=\"t m0 x0 he y392 ff2 fs2 fc0 sc0 ls2 ws2\">GRMg<span class=\"_ _2\"></span>etMu<span class=\"_ _2\"></span>sic </div><div class=\"t m0 x0 he y393 ff2 fs2 fc0 sc0 ls2 ws2\">GRMp<span class=\"_ _2\"></span>ause<span class=\"_ _2\"></span>Sound<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 h1a y394 ff2 fs9 fc0 sc0 ls2 ws2\">GRM<span class=\"_ _2\"></span>stop<span class=\"_ _2\"></span>Sound<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 he y395 ff2 fs2 fc0 sc0 ls2 ws2\">GRMp<span class=\"_ _2\"></span>ause<span class=\"_ _2\"></span>Musi<span class=\"_ _2\"></span>c </div><div class=\"t m0 x0 he y396 ff2 fs2 fc0 sc0 ls2 ws2\">GRMs<span class=\"_ _2\"></span>topM<span class=\"_ _2\"></span>usic<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 he y397 ff2 fs2 fc0 sc0 ls2 ws2\">GRMd<span class=\"_ _2\"></span>ele<span class=\"_ _2\"></span>teSoun<span class=\"_ _2\"></span>d </div><div class=\"t m0 x0 he y398 ff2 fs2 fc0 sc0 ls2 ws2\">GRMd<span class=\"_ _2\"></span>ele<span class=\"_ _2\"></span>teMusi<span class=\"_ _2\"></span>c </div></div><div class=\"c x2b y389 w6 h24\"><div class=\"t m0 x0 hc y38a ff4 fs2 fc0 sc0 ls2 ws2\">Methodes <span class=\"_ _2\"></span>Princip<span class=\"_ _1\"></span>ale <span class=\"_ _2\"></span>(au<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>dess<span class=\"_ _2\"></span>us) </div><div class=\"t m0 x0 he y38b ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>addSo<span class=\"_ _2\"></span>und </div><div class=\"t m0 x0 he y38c ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>addSo<span class=\"_ _2\"></span>undOb<span class=\"_ _2\"></span>ject </div><div class=\"t m0 x0 he y38d ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>addMu<span class=\"_ _2\"></span>sic </div><div class=\"t m0 x0 he y38e ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>addMu<span class=\"_ _2\"></span>sicObj<span class=\"_ _2\"></span>ect </div><div class=\"t m0 x0 he y38f ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>setSo<span class=\"_ _2\"></span>undL<span class=\"_ _2\"></span>oop </div><div class=\"t m0 x0 he y390 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>setM<span class=\"_ _2\"></span>usicLo<span class=\"_ _2\"></span>op </div><div class=\"t m0 x0 he y391 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>getSo<span class=\"_ _2\"></span>und </div><div class=\"t m0 x0 he y392 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>getMu<span class=\"_ _2\"></span>sic </div><div class=\"t m0 x0 he y393 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>pauseS<span class=\"_ _2\"></span>ound </div><div class=\"t m0 x0 h1a y394 ff2 fs9 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>stop<span class=\"_ _2\"></span>Soun<span class=\"_ _2\"></span>d </div><div class=\"t m0 x0 he y395 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>pause<span class=\"_ _2\"></span>Music<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 he y396 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>stop<span class=\"_ _2\"></span>Music </div><div class=\"t m0 x0 he y397 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>delete<span class=\"_ _2\"></span>Sou<span class=\"_ _2\"></span>nd </div><div class=\"t m0 x0 he y398 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>delete<span class=\"_ _2\"></span>Mus<span class=\"_ _2\"></span>ic </div></div><div class=\"c x23 y399 wb h25\"><div class=\"t m0 x2e h1f y39a ff7 fs2 fc3 sc0 ls2 ws2\">Game T<span class=\"_ _2\"></span>extu<span class=\"_ _2\"></span>re<span class=\"fc0\"> </span></div><div class=\"t m0 x0 h1f y39b ff7 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y39c ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>GameTex<span class=\"_ _1\"></span>ture </div></div><div class=\"c x23 y399 wb h25\"><div class=\"t m0 x0 hc y2ea ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hc y1b9 ff2 fs2 fc0 sc0 ls2 ws14\">GameTexture<span class=\"_ _1\"></span><span class=\"ff4 fc4 ls4d\">;</span><span class=\"ff4 ws2\"> </span></div></div><div class=\"c x23 y399 wb h25\"><div class=\"t m0 x0 h18 y39d ffc fs9 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws3e\">isE<span class=\"_ _2\"></span>ngine<span class=\"_ _2\"></span>/syst<span class=\"_ _2\"></span>em/<span class=\"_ _2\"></span>graph<span class=\"_ _2\"></span>ic/<span class=\"_ _2\"></span><span class=\"ff4\">GameTe<span class=\"_ _2\"></span>xtur<span class=\"_ _2\"></span>e<span class=\"ff9 ls51 ws3f\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf24\" class=\"pf w0 h0\" data-page-no=\"24\"><div class=\"pc pc24 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcsUsbYQDG4e9rgogOlbTUQdC5qDiUjkXcpIOIs0vBzZYMXdM/QALd2t21ZOxioUspFArdpOqk6GKgIbRoSEPs5xAIXQoF6dG7PM8Ubsq93JAfl7uYUgoAAAAU1C0TAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6TAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6jMBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+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DwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoHt1RngAAAFqSURBVPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAADw8+pbxz1Jck5bqyU5hrufl9furlZL4jIAAIAPeQD8cH+G4x6PnQAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">37<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"_ _2\"></span>permet <span class=\"ff3 ws14\">d’utiliser</span> des textures <span class=\"_ _2\"></span>dans <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> je<span class=\"_ _4\"></span>u. </span></span></div><div class=\"t m2 xa hc y39e ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y39e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y39e ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts publics <span class=\"ls21 ws19\">de</span> <span class=\"_ _4\"></span>GameTe<span class=\"_ _2\"></span>xture<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y39f ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y39f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y39f ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Text<span class=\"_ _2\"></span>ure<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y3a0 ff2 fs2 fc0 sc0 ls2 ws14\">GameTexture(<span class=\"fc8 ws2\">co<span class=\"_ _1\"></span>nst <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">std<span class=\"_ _1\"></span>::string<span class=\"ff2 fc0 ws2\">&amp; <span class=\"_ _2\"></span>textur<span class=\"_ _1\"></span>eName, <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst <span class=\"ff4 fc5 ws14\">std::string</span><span class=\"fc0\">&amp; <span class=\"_ _2\"></span>file<span class=\"_ _2\"></span>Path<span class=\"_ _2\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 he y3a1 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3a2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3a3 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y3a4 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui permet <span class=\"ls1e ws16\">de</span> charger une <span class=\"_ _2\"></span>texture<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> lui <span class=\"_ _2\"></span>donner <span class=\"ls23 ws1b\">un</span> n<span class=\"_ _2\"></span>om<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y3a5 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y3a5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3a5 ff4 fs2 fc4 sc0 ls2 ws14\">loa<span class=\"_ _2\"></span>dReso<span class=\"_ _2\"></span>urce<span class=\"_ _2\"></span>s<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y2f2 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">loa<span class=\"_ _1\"></span>dResources(<span class=\"fc8 ws2\">const </span><span class=\"ff4 fc5\">std::string</span><span class=\"ws2\">&amp; f<span class=\"_ _2\"></span>ileP<span class=\"_ _2\"></span>ath) </span></span></div><div class=\"t m0 x1 he y2f3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2f4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3a6 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y2f5 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> charger <span class=\"_ _2\"></span><span class=\"ls1d\">la <span class=\"ls2\">tex<span class=\"_ _2\"></span>ture. </span></span></span></span></div><div class=\"t m0 x1 he y3a7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2f6 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y2f6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2f6 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Text<span class=\"_ _2\"></span>ure </div><div class=\"t m0 x6 he y2c1 ff2 fs2 fc0 sc0 ls2 ws2\">sf::Texture&amp; <span class=\"_ _2\"></span>getTexture() </div><div class=\"t m0 x6 hc y3a8 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y3a9 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l<span class=\"_ _1\"></span>’instance<span class=\"ff2 ws2\"> Te<span class=\"_ _2\"></span>xtur<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m0 x1 he y3aa ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y3ab ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y79 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 h1f y2fc ff7 fs2 fc3 sc0 ls2 ws2\">Game F<span class=\"_ _4\"></span>ont<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h20 y3ac ff7 fsb fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3ad ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y3ae ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"_ _2\"></span>permet <span class=\"ff3 ws14\">d’utiliser</span> des <span class=\"_ _2\"></span>polices dans <span class=\"ls1d ws15\">le</span> j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y3af ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y3af ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3af ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts publics <span class=\"ls21 ws19\">de</span> <span class=\"_ _4\"></span>GameF<span class=\"_ _2\"></span>ont<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y3b0 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y3b0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3b0 ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Font<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3b1 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y30e ff2 fs2 fc0 sc0 ls2 ws14\">GameFont(<span class=\"fc8 ws2\">const </span><span class=\"ff4 fc5\">std::string</span><span class=\"ws2\">&amp; <span class=\"_ _2\"></span>fontNa<span class=\"_ _1\"></span>me, <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"ff4 fc5 ws14\">std::st<span class=\"_ _1\"></span>ring</span><span class=\"fc0\">&amp; <span class=\"_ _2\"></span>filePath,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">fo<span class=\"_ _2\"></span>ntSiz<span class=\"_ _2\"></span>e) </span></span></span></span></span></div><div class=\"t m0 x1 he y3b2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y310 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y3b3 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui permet <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>charger une police <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">et<span class=\"ls2 ws2\"> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> lui donner <span class=\"ls2c ws21\">un</span> n<span class=\"_ _4\"></span>om.<span class=\"_ _2\"></span> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y3b4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y305 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y305 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y305 ff4 fs2 fc4 sc0 ls2 ws14\">loa<span class=\"_ _2\"></span>dReso<span class=\"_ _2\"></span>urce<span class=\"_ _2\"></span>s<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3b5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3b6 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">loa<span class=\"_ _1\"></span>dResources(<span class=\"fc8 ws2\">const </span><span class=\"ff4 fc5\">std::string</span><span class=\"ws2\">&amp; f<span class=\"_ _2\"></span>ileP<span class=\"_ _2\"></span>ath) </span></span></div><div class=\"t m0 x6 hc y3b7 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3b8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y3b9 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> charger <span class=\"_ _2\"></span><span class=\"ls1d\">la <span class=\"ls2\">po<span class=\"_ _2\"></span>lice. </span></span></span></span></div><div class=\"t m0 x1 he y3ba ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y3bb ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y3bb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3bb ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Font<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y3bc ff2 fs2 fc0 sc0 ls2 ws2\">sf::Font&amp; <span class=\"_ _2\"></span>getF<span class=\"_ _2\"></span>ont(<span class=\"_ _2\"></span>) </div></div><div class=\"c x6 y3bd w9 h26\"><div class=\"t m0 x0 h27 y3be ff7 fs9 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y3bf ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>GameFont<span class=\"_ _1\"></span> </div></div><div class=\"c x6 y3bd w9 h26\"><div class=\"t m0 x0 hc y3c0 ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hc y3c1 ff2 fs2 fc0 sc0 ls2 ws14\">GameFont<span class=\"_ _1\"></span><span class=\"ff4 fc4 ls4d\">;</span><span class=\"ff4 ws2\"> </span></div></div><div class=\"c x6 y3bd w9 h26\"><div class=\"t m0 x0 hc y3c2 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/gra<span class=\"_ _2\"></span>phic/<span class=\"_ _2\"></span><span class=\"ff4\">GameFo<span class=\"_ _2\"></span>nt<span class=\"ff9 ls4e ws3b\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf25\" class=\"pf w0 h0\" data-page-no=\"25\"><div class=\"pc pc25 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcv2sTYQDH4ff18gdohnYQ7SZIBQcpOKjgPyAi4mxxLTiI6Cg4FlqKos7iIjoU8Qc6KGpAihQUad2ENoMEDEHREMLF16EQROwWD+/yPNORLLkvN+RDchdTSgEAAICK2mECAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAgD/UTMDvZhcane99OwAAlNrRA5MXTk3bgS0xpWQFhn66HgAAKvAtP4QYox1QfQAAANXnvj4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVN846fb6zVYnHwxMAQAAqL6qWX7x/ti5xSOzC5+/fLMGAADwj9RMULxmq3N5abnx7pMpAAAA1Vcp+WBw/e6rxTvPTQEAABTDPzyLjewse9JYW7p4euPxVWsAAABFZIgJCvb0xpwRAACAwvitDwAAQPUBAACg+gAAAFB9AAAAqD4AAABGwTM8/y/trz+u3HoUQji0f+/ZE4cNAgAAqL5S6vb6w+PV9c09k7uGrz94+WHrWPUBAACqr3zerm3cfrgyTLsQwvn5+zfvvd43NXHt0hn7AAAAoxVTSlYoUrPVWV3f/OtbJ48f7Pb6z958DCHsntg5Mz1lLgAAQPUBAACwLc/wBAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAGC0amN+/nmel/rzZ1kWY3QdAwAA24kppbE+/5InU7vdrtfrrmMAAED1AQAAjCP39QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gP41X4dkwAIBVAU5Y2OdrCLAYQPtjGD4GgII7jYQPjjj+JqBIVztre+7QIAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQffJaOhAAAAFySURBVAAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAAA+W33ruCdJzmlrtSTHcPfz8trd1WpJXAYAAPAjD38Sj5IOp/AcAAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">38<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l<span class=\"_ _1\"></span>’instance<span class=\"ff2 ws2\"> P<span class=\"_ _2\"></span>olice<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y3c3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y1e4 ff9 fs2 fc3 sc0 ls52 ws40\">GRM<span class=\"ls2 ws2\"> (Graphic <span class=\"_ _2\"></span>Resource<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>Manage<span class=\"_ _2\"></span>r)<span class=\"fc0\"> </span></span></div><div class=\"t m0 x1 h28 y3c4 ff9 fsc fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y3c5 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3c6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3c7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y3c8 ff2 fs2 fc0 sc0 ls2 ws2\">Classe parent qui permet <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> une <span class=\"_ _2\"></span>scène<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’a<span class=\"_ _1\"></span>jouter<span class=\"ff2 ws2\"> <span class=\"ls24 ws1c\">et</span> </span>d’utiliser<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>des textures <span class=\"ls24 ws1c\">et</span> polices sans in<span class=\"_ _2\"></span>itia<span class=\"_ _1\"></span>liser les <span class=\"_ _2\"></span>objets SFML<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y3c9 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y3c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3c9 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts publics <span class=\"ls21 ws19\">du</span> <span class=\"_ _4\"></span>GRM<span class=\"_ _4\"></span><span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y8 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8 ff4 fs2 fc4 sc0 ls2 ws2\">Les Conteneurs du GR<span class=\"_ _1\"></span>M </div><div class=\"t m0 x6 hc y3ca ff4 fs2 fc5 sc0 ls2 ws14\">std::vector<span class=\"ff2 fc0 ls2e\">&lt;</span>std::sh<span class=\"_ _1\"></span>ared_ptr<span class=\"ff2 fc0 ws2\">&lt;Ga<span class=\"_ _1\"></span>meFont&gt;&gt; m_GRMfon<span class=\"_ _1\"></span>t </span></div><div class=\"t m0 x6 hc y3cb ff4 fs2 fc5 sc0 ls2 ws14\">std::vector<span class=\"ff2 fc0 ls2e\">&lt;</span>std::sh<span class=\"_ _1\"></span>ared_ptr<span class=\"ff2 fc0 ws2\">&lt;Ga<span class=\"_ _1\"></span>meTexture&gt;&gt;<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>m_GRMtextur<span class=\"_ _1\"></span>e </span></div><div class=\"t m0 x6 hc y3cc ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y3cd ff2 fs2 fc0 sc0 ls2 ws2\">Conteneur qui <span class=\"_ _2\"></span>perme<span class=\"_ _1\"></span>t <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> stock<span class=\"_ _1\"></span>er <span class=\"_ _2\"></span>l<span class=\"_ _1\"></span>es textures <span class=\"ls24 ws1c\">et</span> polices <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scène qui <span class=\"_ _2\"></span>seront <span class=\"_ _1\"></span>gérés par <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> G<span class=\"_ _2\"></span>RM<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xa hc y3ce ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y3ce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3ce ff4 fs2 fc4 sc0 ls2 ws14\">GRMa<span class=\"_ _2\"></span>ddFon<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3cf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3d0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">void GRMaddFont(<span class=\"fc8\">const <span class=\"ff4 fc5 ws14\">std::string</span></span>&amp; name, <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::stri<span class=\"_ _1\"></span>ng<span class=\"ff2 fc0 ws2\">&amp; <span class=\"_ _2\"></span>fil<span class=\"_ _1\"></span>ePath, <span class=\"fc8\">float <span class=\"_ _4\"></span><span class=\"fc0\">fontSi<span class=\"_ _2\"></span>ze) </span></span></span></span></span></span></div><div class=\"t m0 x1 he y3d1 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3d2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y3d3 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’ajouter</span> une <span class=\"_ _2\"></span>police dans <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>conte<span class=\"_ _2\"></span>neur<span class=\"_ _2\"></span>. </div><div class=\"t m0 x1 he y3d4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3d5 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:<span class=\"fc0\"> </span></div><div class=\"t m0 xc hc y3d6 ff4 fs2 fc0 sc0 ls2 ws2\">name <span class=\"ff2\">n<span class=\"_ _2\"></span>om<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> po<span class=\"_ _2\"></span>lice<span class=\"_ _2\"></span>. </span></span></span></div><div class=\"t m0 x1 he y3d7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3d8 ff4 fs2 fc0 sc0 ls2 ws2\">filePath <span class=\"_ _2\"></span><span class=\"ff2\">chemin<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">du</span> <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>ichier po<span class=\"_ _2\"></span>lice<span class=\"_ _2\"></span>. </span></div><div class=\"t m0 x1 he y180 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y3d9 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y3d9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3d9 ff4 fs2 fc4 sc0 ls2 ws14\">GRMa<span class=\"_ _2\"></span>ddFon<span class=\"_ _2\"></span>tObje<span class=\"_ _2\"></span>ct<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y35d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3da ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GRMaddFont<span class=\"_ _1\"></span>Object(<span class=\"ff4 fc5\">std::sha<span class=\"_ _1\"></span>red_ptr</span><span class=\"ws2\">&lt;Gam<span class=\"_ _1\"></span>eFont&gt; <span class=\"_ _2\"></span>font, <span class=\"fc8\">bool </span>showError <span class=\"_ _4\"></span>= <span class=\"ff4 fc5 ws14\">true</span><span class=\"ls3c\">) </span></span></span></div><div class=\"t m0 x6 hc y3db ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y3dc ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’ajouter</span> <span class=\"_ _2\"></span>un obj<span class=\"_ _1\"></span>et font <span class=\"_ _2\"></span>(<span class=\"ff4 ws14\">is::G<span class=\"_ _1\"></span>ameFont</span>) <span class=\"ff4\">existant </span>dans <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>contene<span class=\"_ _2\"></span>ur. </span></span></div><div class=\"t m0 x1 he y3dd ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3de ff4 fs2 fc0 sc0 ls2 ws2\">showError <span class=\"ff2\">affiche <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>message<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’erreur</span> <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">en<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>cas<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> doublon <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>fichier pol<span class=\"_ _2\"></span>ice. </span></span></span></div><div class=\"t m2 xa hc y362 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y362 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y362 ff4 fs2 fc4 sc0 ls2 ws14\">GRMa<span class=\"_ _2\"></span>ddTex<span class=\"_ _2\"></span>ture<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3df ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3e0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">void GRMaddTexture(<span class=\"fc8\">c<span class=\"_ _1\"></span>onst <span class=\"ff4 fc5 ws14\">st<span class=\"_ _2\"></span>d::st<span class=\"_ _1\"></span>ring<span class=\"ff2 fc0 ws2\">&amp; name, <span class=\"_ _4\"></span><span class=\"fc8\">c<span class=\"_ _1\"></span>onst <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::str<span class=\"_ _1\"></span>ing<span class=\"ff2 fc0 ws2\">&amp; file<span class=\"_ _2\"></span>Path<span class=\"_ _2\"></span>) </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y3e1 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y3e3 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’ajouter</span> <span class=\"_ _2\"></span>une texture dans le c<span class=\"_ _2\"></span>ontene<span class=\"_ _2\"></span>ur. </div><div class=\"t m0 x1 he y330 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3e4 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:<span class=\"fc0\"> </span></div></div><div class=\"c x6 y3e5 w9 h29\"><div class=\"t m0 x0 hc y3e6 ff9 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y3e7 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>GRM </div></div><div class=\"c x6 y3e5 w9 h29\"><div class=\"t m0 x0 hc y3e8 ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hc y3e9 ff2 fs2 fc0 sc0 ls2 ws14\">GRM<span class=\"ff4 fc4 ls4d\">;</span><span class=\"ff4 ws2\"> </span></div></div><div class=\"c x6 y3e5 w9 h29\"><div class=\"t m0 x0 hc y3ea ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/gra<span class=\"_ _2\"></span>phic/<span class=\"_ _2\"></span><span class=\"ff4\">GRM<span class=\"ff9 ls50 ws3d\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf26\" class=\"pf w0 h0\" data-page-no=\"26\"><div class=\"pc pc26 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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AADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwfHSyMAAAFoSURBVAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAA/LX67p19GGOMceXi3OZ6Ncbnxz6WL830PT/0ZnO9GqPJAAAAMuQXZd2EsbeDudIAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">39<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1be ff4 fs2 fc0 sc0 ls2 ws2\">name <span class=\"ff2\">n<span class=\"_ _2\"></span>om<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> te<span class=\"_ _2\"></span>xture<span class=\"_ _2\"></span>. </span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2bc ff4 fs2 fc0 sc0 ls2 ws2\">filePath <span class=\"_ _2\"></span><span class=\"ff2\">chemin<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">du</span> <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>ichier tex<span class=\"_ _2\"></span>ture. </span></div><div class=\"t m2 xa hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y1c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">GRMa<span class=\"_ _2\"></span>ddTex<span class=\"_ _2\"></span>ture<span class=\"_ _2\"></span>Objec<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c3 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GRMaddTextur<span class=\"_ _1\"></span>eObject(<span class=\"_ _1\"></span><span class=\"ff4 fc5\">std::shared_ptr<span class=\"_ _1\"></span></span><span class=\"ws2\">&lt;GameTexture&gt; texture, <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">showError = <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">true<span class=\"ff2 fc0 ls3c ws2\">) </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y3eb ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>ajout<span class=\"_ _1\"></span>er<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> objet <span class=\"_ _2\"></span>te<span class=\"_ _1\"></span>xture <span class=\"_ _2\"></span>(<span class=\"_ _1\"></span><span class=\"ff4 ws14\">is::GameTexture</span>)<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff4\">exista<span class=\"_ _1\"></span>nt <span class=\"_ _2\"></span><span class=\"ff2\">da<span class=\"_ _1\"></span>ns <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> conte<span class=\"_ _4\"></span>neur. </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc0 sc0 ls2 ws2\">showError <span class=\"ff2\">affiche <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>message<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’erreur</span> <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">en<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>cas<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> doublon <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>fichier te<span class=\"_ _2\"></span>xture. </span></span></span></div><div class=\"t m2 xa hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y221 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">GRMg<span class=\"_ _2\"></span>etFon<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c9 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Font* <span class=\"_ _2\"></span>GRMgetFo<span class=\"_ _1\"></span>nt(<span class=\"fc8\">const<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std<span class=\"_ _1\"></span>::string<span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _2\"></span>ame) </span></span></span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ca ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1ee ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0\">une police <span class=\"_ _2\"></span>qui <span class=\"ls3d ws2d\">se<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> trouve <span class=\"_ _2\"></span>dans<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>con<span class=\"_ _1\"></span>teneur <span class=\"ls29 ws1f\">en</span> <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>onction <span class=\"ls1e ws16\">de</span> son n<span class=\"_ _2\"></span>om<span class=\"_ _2\"></span>. </span></span></span></div><div class=\"t m0 x1 he y1ef ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y353 ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y353 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y353 ff4 fs2 fc4 sc0 ls2 ws14\">GRMg<span class=\"_ _2\"></span>etTe<span class=\"_ _2\"></span>xture<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3ec ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Texture*<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>GR<span class=\"_ _1\"></span>MgetTextur<span class=\"_ _1\"></span>e(<span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::strin<span class=\"_ _1\"></span>g<span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _2\"></span>ame) </span></span></span></span></div><div class=\"t m0 x1 he y3ed ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc ybd ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0\">une <span class=\"_ _2\"></span>textur<span class=\"_ _1\"></span>e qui <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">se<span class=\"ls2 ws2\"> trouve dans <span class=\"_ _4\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>cont<span class=\"_ _1\"></span>eneur <span class=\"ls24 ws1c\">en</span> fonction <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>son no<span class=\"_ _2\"></span>m. </span></span></span></span></span></div><div class=\"t m0 x1 he y372 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y228 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y228 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y228 ff4 fs2 fc4 sc0 ls2 ws14\">GRM<span class=\"_ _2\"></span>delet<span class=\"_ _2\"></span>eFont<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y229 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GRMdeleteFont<span class=\"_ _1\"></span>(<span class=\"fc8 ws2\">const </span><span class=\"ff4 fc5\">std::string</span><span class=\"ws2\">&amp; n<span class=\"_ _2\"></span>ame) </span></span></span></div><div class=\"t m0 x1 he y373 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3ee ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y22c ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> supprimer <span class=\"_ _2\"></span>un<span class=\"_ _1\"></span>e police gérer <span class=\"_ _2\"></span>le GR<span class=\"_ _2\"></span>M. </span></span></div><div class=\"t m2 xa hc y294 ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y294 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y294 ff4 fs2 fc4 sc0 ls2 ws14\">GRM<span class=\"_ _2\"></span>delet<span class=\"_ _2\"></span>eText<span class=\"_ _2\"></span>ure<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y374 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y9f ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">GRM<span class=\"_ _1\"></span>deleteText<span class=\"_ _1\"></span>ure(<span class=\"fc8 ws2\">const<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std<span class=\"_ _1\"></span>::string<span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _4\"></span>ame)<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x1 he y375 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y376 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y377 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> supprimer une <span class=\"_ _2\"></span>te<span class=\"_ _1\"></span>xture gérer <span class=\"_ _2\"></span>par <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>GRM<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y267 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y1f8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 h1f y1f9 ff7 fs2 fc3 sc0 ls2 ws2\">Transition <span class=\"_ _4\"></span>Effec<span class=\"_ _2\"></span>t<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h20 y3ef ff7 fsb fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3f0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3f1 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3f2 ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"_ _2\"></span>permet<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>fa<span class=\"_ _1\"></span>ire des effets <span class=\"_ _2\"></span>transitio<span class=\"_ _1\"></span>n <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> type <span class=\"ff4\">Fade <span class=\"ls53 ws41\">In</span> </span><span class=\"ls29 ws1f\">et<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff4\">Fade out<span class=\"_ _2\"></span><span class=\"ff2\">. </span></span></span></span></span></span></div><div class=\"t m2 xa hc y3f3 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y3f3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3f3 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>éléments publics<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls21 ws19\">de<span class=\"ls2 ws2\"> Transition Ef<span class=\"_ _2\"></span>fect<span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xa hc y23c ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y23c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y23c ff4 fs2 fc4 sc0 ls2 ws2\">Enum <span class=\"_ _2\"></span>Trans<span class=\"_ _2\"></span>ition<span class=\"fc0\"> </span></div></div><div class=\"c x6 y3f4 w9 h26\"><div class=\"t m0 x0 h1f y3f5 ff7 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y3f6 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Transitio<span class=\"_ _1\"></span>n <span class=\"_ _4\"></span>Effec<span class=\"_ _1\"></span>t </div></div><div class=\"c x6 y3f4 w9 h26\"><div class=\"t m0 x0 hc y30f ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d hc y3f7 ff2 fs2 fc0 sc0 ls2 ws14\">TransitionEffect<span class=\"_ _1\"></span><span class=\"ff4 fc4 ls4d\">;</span><span class=\"ff4 ws2\"> </span></div></div><div class=\"c x6 y3f4 w9 h26\"><div class=\"t m0 x0 hc y311 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/gra<span class=\"_ _2\"></span>phic/<span class=\"ff4\">T<span class=\"_ _2\"></span>ransit<span class=\"_ _2\"></span>ionE<span class=\"_ _2\"></span>ffect<span class=\"_ _2\"></span><span class=\"ff9 ls4e ws3b\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf27\" class=\"pf w0 h0\" data-page-no=\"27\"><div class=\"pc pc27 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAA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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">40<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">enum <span class=\"_ _2\"></span><span class=\"ff2 fc0\">Trans<span class=\"_ _2\"></span>ition<span class=\"_ _2\"></span>; </span></div><div class=\"t m0 x1 he y190 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xa hc y191 ff4 fs2 fc0 sc0 ls2 ws2\">Tra<span class=\"_ _2\"></span>nsitio<span class=\"_ _2\"></span>n </div><div class=\"t m0 xa he y3f8 ff2 fs2 fc0 sc0 ls2 ws2\">FAD<span class=\"_ _2\"></span>E_IN <span class=\"_ _f\"> </span>Représente<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>fon<span class=\"_ _2\"></span>d<span class=\"_ _2\"></span>u </span></span></div><div class=\"t m0 xa he y3f9 ff2 fs2 fc0 sc0 ls2 ws2\">FAD<span class=\"_ _2\"></span>E_OUT <span class=\"_ _10\"> </span>Représente<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>dispa<span class=\"_ _2\"></span>ître </span></span></div><div class=\"t m0 x1 he y3fa ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y3fb ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3fc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y3a4 ff2 fs2 fc0 sc0 ls2 ws2\">Représenter <span class=\"ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> type <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>transition qui se<span class=\"_ _2\"></span>ra<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y3fd ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y3fd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3fd ff4 fs2 fc4 sc0 ls2 ws2\">Tra<span class=\"_ _2\"></span>nsitio<span class=\"_ _2\"></span>nEffe<span class=\"_ _2\"></span>ct </div><div class=\"t m0 x6 hc y74 ff2 fs2 fc0 sc0 ls2 ws14\">TransitionEffect(<span class=\"ff4 fc5\">is<span class=\"_ _1\"></span>::</span><span class=\"ws2\">GameDispl<span class=\"_ _1\"></span>ay <span class=\"_ _4\"></span>*scene) </span></div><div class=\"t m0 x6 hc y2f4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y3fe ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui pre<span class=\"_ _2\"></span>nd <span class=\"ls24 ws1c\">en</span> paramètre <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>cène dans laquelle <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> transition <span class=\"_ _2\"></span>sera uti<span class=\"_ _2\"></span>lisée<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y2c0 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y2c0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2c0 ff4 fs2 fc4 sc0 ls2 ws14\">st<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y2c1 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">st<span class=\"_ _1\"></span>ep(<span class=\"fc8 ws2\">float const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _2\"></span>_TI<span class=\"_ _2\"></span>ME) </span></span></span></div><div class=\"t m0 x1 he y3ff ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y400 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y3a9 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> mettre à <span class=\"_ _4\"></span>jou<span class=\"_ _1\"></span>r <span class=\"ff3 ws14\">l’objet</span> (tr<span class=\"_ _2\"></span>ansit<span class=\"_ _2\"></span>ion<span class=\"_ _2\"></span>). </span></span></div><div class=\"t m0 x1 he y33a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2fb ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y2fb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2fb ff4 fs2 fc4 sc0 ls2 ws14\">dr<span class=\"_ _2\"></span>aw<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y2fc ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">dra<span class=\"_ _1\"></span>w(is::Render &amp;ren<span class=\"_ _2\"></span>der<span class=\"_ _2\"></span>); </span></div><div class=\"t m0 x1 he y401 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y402 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y403 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’afficher<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’objet<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>(trans<span class=\"_ _2\"></span>ition<span class=\"_ _2\"></span>). </span></span></span></span></div><div class=\"t m2 xa hc y33e ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y33e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y33e ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tType<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y25f ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setType(<span class=\"fc8 ws2\">int <span class=\"fc0\">t<span class=\"_ _2\"></span>ype)<span class=\"_ _2\"></span>; </span></span></span></div><div class=\"t m0 x1 he y155 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y404 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y405 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> type <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> tr<span class=\"_ _2\"></span>ansit<span class=\"_ _2\"></span>ion. </span></span></span></span></div><div class=\"t m2 xa hc yef ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd yef ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc yef ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Transi<span class=\"_ _2\"></span>tion<span class=\"_ _2\"></span>End<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y249 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _b\"> </span><span class=\"fc0 ws14\">g<span class=\"_ _1\"></span>etTransitionEnd(<span class=\"_ _1\"></span></span>int <span class=\"fc0\">type) </span><span class=\"ws14\">c<span class=\"_ _2\"></span>onst<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x6 hc y299 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y406 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y407 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> savoir <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’a<span class=\"_ _1\"></span>nimation<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">de</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>transitio<span class=\"_ _1\"></span>n est te<span class=\"_ _2\"></span>rminée<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y408 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y409 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y40a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y40b ff9 fs2 fc3 sc0 ls2 ws14\">Ent<span class=\"_ _2\"></span>ités<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y40c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y32c ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y32c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y32c ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>MainObje<span class=\"_ _1\"></span>ct </div><div class=\"t m0 x6 hc y366 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">MainObject;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y40d ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/Mai<span class=\"_ _2\"></span>nObj<span class=\"_ _2\"></span>ect.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc y330 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf28\" class=\"pf w0 h0\" data-page-no=\"28\"><div class=\"pc pc28 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAvNuvQxsIoQCIgiuR9EAvFEBCQjfUQHKSIigBQwckSCr5cOZyoQTEjFu77gGA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAHWlGJoAAACzSURBVACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIAk98/UzkmStfucR58szV4P42NX23n0/gIAAP5KKRdv9wVDUu7cm/0W1QAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">41<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff3 fs2 fc0 sc0 ls2 ws2\">Classe <span class=\"_ _1\"></span>de <span class=\"_ _1\"></span>base <span class=\"_ _9\"></span>pour <span class=\"_ _1\"></span>cré<span class=\"_ _1\"></span>er <span class=\"_ _1\"></span>les <span class=\"_ _9\"></span>objets <span class=\"_ _1\"></span>(Personnage, <span class=\"_ _9\"></span>Tuiles, <span class=\"_ _1\"></span>B<span class=\"_ _1\"></span>outon, <span class=\"_ _1\"></span>…) <span class=\"_ _9\"></span>qui <span class=\"_ _1\"></span>seront<span class=\"_ _9\"></span><span class=\"ff2\"> <span class=\"_ _1\"></span>utilis<span class=\"_ _1\"></span>ées da<span class=\"_ _1\"></span>ns <span class=\"_ _1\"></span>l<span class=\"_ _1\"></span>es <span class=\"_ _1\"></span>scènes. <span class=\"_ _1\"></span>Ell<span class=\"_ _1\"></span>e <span class=\"_ _1\"></span>vous<span class=\"_ _1\"></span> <span class=\"_ _1\"></span>offre </span></div><div class=\"t m0 x6 he y40e ff2 fs2 fc0 sc0 ls2 ws2\">des <span class=\"_ _b\"> </span>fonctions <span class=\"_ _b\"> </span>qui <span class=\"_ _b\"> </span>vous<span class=\"_ _1\"></span> <span class=\"_ _b\"> </span>permettent <span class=\"_ _b\"> </span>d<span class=\"_ _1\"></span>e <span class=\"_ _b\"> </span>contrôler <span class=\"_ _b\"> </span>un <span class=\"_ _b\"> </span>ob<span class=\"_ _1\"></span>jet <span class=\"_ _b\"> </span>(<span class=\"_ _1\"></span>les <span class=\"_ _b\"> </span>d<span class=\"_ _1\"></span>éplacements, <span class=\"_ _b\"> </span>dét<span class=\"_ _1\"></span>ections <span class=\"_ _b\"> </span>de <span class=\"_ _b\"> </span>collision <span class=\"_ _b\"> </span>en<span class=\"_ _1\"></span>tre <span class=\"_ _b\"> </span>les <span class=\"_ _b\"> </span>objets,<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 he y40f ff3 fs2 fc0 sc0 ls2 ws2\">calcul de distance, …) <span class=\"_ _1\"></span>et plein d’autres choses <span class=\"_ _1\"></span>qui sont liées au game<span class=\"_ _1\"></span> play du jeu.<span class=\"_ _9\"></span><span class=\"ff2\"> </span></div><div class=\"t m2 xa hc y410 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y410 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y410 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts publics <span class=\"ls21 ws19\">de</span> <span class=\"_ _4\"></span>MainObj<span class=\"_ _2\"></span>et<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y411 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y411 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y411 ff4 fs2 fc4 sc0 ls2 ws14\">Mai<span class=\"_ _2\"></span>nObje<span class=\"_ _2\"></span>ct<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y412 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y412 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y412 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x6 he y71 ff2 fs2 fc0 sc0 ls2 ws2\">Mai<span class=\"_ _2\"></span>nObje<span class=\"_ _2\"></span>ct() </div><div class=\"t m0 x6 hc y413 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y414 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur par <span class=\"_ _2\"></span>défaut<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">la<span class=\"ls2 ws2\"> clas<span class=\"_ _2\"></span>se. </span></span></span></span></div><div class=\"t m2 xa h15 y415 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y415 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y415 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième forme </div><div class=\"t m0 x6 he y416 ff2 fs2 fc0 sc0 ls2 ws14\">MainObject(<span class=\"fc8 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0 ls35 ws29\">x,<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"_ _4\"></span><span class=\"fc0\">y) </span></span></span></span></span></div><div class=\"t m0 x6 hc y417 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y4f ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui <span class=\"_ _2\"></span><span class=\"ff3\">permet d’i<span class=\"_ _1\"></span>nitialiser<span class=\"ff2\"> </span><span class=\"ws14\">l’objet</span><span class=\"ff2\"> avec <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>p<span class=\"_ _1\"></span>oint <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>dépar<span class=\"_ _2\"></span>t. </span></span></span></span></div><div class=\"t m2 xa h15 y418 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y418 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y418 ff9 fs2 fc0 sc0 ls2 ws2\">Troisième <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y419 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y41a ff2 fs2 fc0 sc0 ls2 ws2\">MainObject(sf::Sprite<span class=\"_ _1\"></span> &amp;spr, <span class=\"_ _2\"></span><span class=\"fc8\">float<span class=\"_ _1\"></span> <span class=\"fc0\">x <span class=\"_ _2\"></span>= <span class=\"_ _2\"></span><span class=\"fcb ws14\">0.<span class=\"_ _1\"></span>f<span class=\"fc0 ws2\">, <span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">y = <span class=\"fcb ws14\">0<span class=\"_ _2\"></span>.f<span class=\"_ _4\"></span><span class=\"fc0 ws2\">) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y41b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y41c ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui <span class=\"_ _2\"></span>permet <span class=\"ff3 ws14\">d<span class=\"_ _1\"></span>’initialiser</span> <span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’objet</span> avec <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>Spri<span class=\"_ _1\"></span>te <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>p<span class=\"_ _1\"></span>oint <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> dép<span class=\"_ _2\"></span>art. </span></span></span></span></div><div class=\"t m2 xa h15 y41d ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y41d ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y41d ff9 fs2 fc0 sc0 ls2 ws2\">Quatrième <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y41e ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y41f ff2 fs2 fc0 sc0 ls2 ws2\">MainObject(sf::Textur<span class=\"_ _1\"></span>e &amp;tex, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">x, </span>float <span class=\"fc0\">y , </span>bool <span class=\"_ _2\"></span><span class=\"fc0\">center = <span class=\"ff4 fc5 ws14\">fa<span class=\"_ _2\"></span>lse<span class=\"ff2 fc0 ws2\">) </span></span></span></span></div><div class=\"t m0 x1 he y17b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y357 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y420 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui per<span class=\"_ _2\"></span>met<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’initialiser<span class=\"_ _1\"></span></span> <span class=\"ff3 ws14\">l’objet</span> <span class=\"_ _2\"></span>avec une Texture, <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> poi<span class=\"_ _2\"></span>nt <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>épart <span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span></span> cen<span class=\"_ _2\"></span>tre<span class=\"_ _1\"></span>r <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> Sp<span class=\"_ _2\"></span>rite. </span></span></span></span></div><div class=\"t m0 x1 he y421 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y422 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y422 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y422 ff4 fs2 fc4 sc0 ls2 ws2\">in<span class=\"_ _2\"></span>stance<span class=\"_ _2\"></span>Numbe<span class=\"_ _2\"></span>r </div><div class=\"t m0 x6 hc y423 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">int <span class=\"fc0\">insta<span class=\"_ _1\"></span>nceNumber; </span></span></div><div class=\"t m0 x6 hc y424 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y425 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> nombre <span class=\"ff3 ws14\">d’instance</span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d\">la <span class=\"ls2\">class<span class=\"_ _2\"></span>e. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y325 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y426 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y426 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y426 ff4 fs2 fc4 sc0 ls2 ws2\">m_S<span class=\"_ _2\"></span>DMcal<span class=\"_ _2\"></span>lStep<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y427 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">m_SDMcal<span class=\"_ _1\"></span>lStep </span></div><div class=\"t m0 x6 hc y428 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y429 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>savoir<span class=\"_ _1\"></span> <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>SDM peut utiliser <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>méthode <span class=\"ff4\">step() </span>(de mise à jour) <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y42a ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y42a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y42a ff4 fs2 fc4 sc0 ls2 ws14\">m_S<span class=\"_ _2\"></span>DMcal<span class=\"_ _2\"></span>lDraw<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y42b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y42c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y42d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y42e ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_SDM<span class=\"_ _2\"></span>callDr<span class=\"_ _2\"></span>aw </span></div><div class=\"t m0 x6 hc y258 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf29\" class=\"pf w0 h0\" data-page-no=\"29\"><div class=\"pc pc29 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> savoir <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>SDM peut <span class=\"_ _2\"></span>util<span class=\"_ _1\"></span>iser <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>m<span class=\"_ _1\"></span>éthode <span class=\"ff4\">draw() <span class=\"ff3 ws14\">(d’affichage)</span></span><span class=\"ls1a\"> <span class=\"ls1e ws16\">de</span></span> <span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c0 ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y1c0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c0 ff4 fs2 fc4 sc0 ls2 ws2\">m_S<span class=\"_ _2\"></span>DMcal<span class=\"_ _2\"></span>lEvent<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y2bd ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">m_SDMcal<span class=\"_ _1\"></span>lEvent </span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y42f ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> savoir <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>SDM peut utiliser <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>méthode <span class=\"ff4\">event() </span>(evenement) <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">st<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">step(</span>float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>const <span class=\"fc0\">&amp;DE<span class=\"_ _2\"></span>LTA_T<span class=\"_ _2\"></span>IME) </span></span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1c8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c9 ff2 fs2 fc0 sc0 ls2 ws2\">Mé<span class=\"_ _2\"></span>thode<span class=\"_ _2\"></span> qui <span class=\"_ _2\"></span>met <span class=\"_ _2\"></span>à <span class=\"ff3\">jour<span class=\"_ _2\"></span> l’ob<span class=\"_ _2\"></span>jet.<span class=\"_ _2\"></span> <span class=\"ff9\">A su<span class=\"_ _2\"></span>rchar<span class=\"_ _2\"></span>ger da<span class=\"_ _2\"></span>ns <span class=\"_ _2\"></span>la cla<span class=\"_ _2\"></span>sse <span class=\"_ _2\"></span><span class=\"ffb ls2d\">𝑓<span class=\"ff9 ls2\">ille <span class=\"_ _2\"></span>de <span class=\"_ _2\"></span>MainO<span class=\"_ _2\"></span>bject<span class=\"_ _2\"></span> <span class=\"_ _1\"></span>! </span></span></span></span></div><div class=\"t m0 x1 hc y371 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ca ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y1ca ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1ca ff4 fs2 fc4 sc0 ls2 ws14\">ev<span class=\"_ _2\"></span>ent<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y1ee ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0\">event(sf::Event &amp;<span class=\"_ _2\"></span>ev<span class=\"_ _4\"></span>) </span></span></div><div class=\"t m0 x1 he y1ef ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y353 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3ec ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f0 ff2 fs2 fc0 sc0 ls2 ws2\">Méthode <span class=\"_ _4\"></span>qui<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>permet <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’impleme<span class=\"_ _1\"></span>nter<span class=\"ff2 ws2\"> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>partie <span class=\"_ _2\"></span>evenement <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’objet.<span class=\"ff2 ws2\"> <span class=\"ff9\">A <span class=\"_ _4\"></span>surcharger dans <span class=\"_ _4\"></span><span class=\"ls2f ws22\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>classe <span class=\"_ _4\"></span><span class=\"ffb ls2d\">𝑓<span class=\"ff9 ls2\">il<span class=\"_ _1\"></span>le <span class=\"_ _4\"></span><span class=\"ls55 ws42\">de<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>MainObj<span class=\"_ _1\"></span>ect <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>i </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y3a9 ff9 fs2 fc0 sc0 ls2 ws2\">la variable &quot;m_SDMcall<span class=\"_ _1\"></span>Event&quot; est vraie!<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y2fb ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y2fb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2fb ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tXStar<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y430 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setXStart(</span>float <span class=\"fc0 ls56 ws43\">x)</span><span class=\"fc0\"> </span></span></div><div class=\"t m0 x1 he y431 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y432 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y433 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y403 ff2 fs2 fc0 sc0 ls2 ws2\">Definie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>posi<span class=\"_ _1\"></span>tion x <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>déb<span class=\"_ _2\"></span>ut. </div><div class=\"t m2 xa hc y33e ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y33e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y33e ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tYStar<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc yf5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setYStart(</span>float <span class=\"_ _2\"></span><span class=\"fc0 ls34 ws28\">y)<span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x1 he y434 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y435 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y341 ff2 fs2 fc0 sc0 ls2 ws2\">Definie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>posi<span class=\"_ _1\"></span>tion y <span class=\"ls1e ws16\">de</span> dé<span class=\"_ _2\"></span>but. </div><div class=\"t m0 x1 he y436 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y437 ff4 fs2 fc4 sc0 ls2 ws14\">2.10</div><div class=\"t m3 x20 hd y437 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y437 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tXPrev<span class=\"_ _2\"></span>ious </div><div class=\"t m0 x6 hc y249 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setXPrevious(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">x) </span></span></span></span></div><div class=\"t m0 x6 hc y299 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y438 ff2 fs2 fc0 sc0 ls2 ws2\">Definie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>positio<span class=\"_ _1\"></span>n x pr<span class=\"_ _2\"></span>écéden<span class=\"_ _2\"></span>te. </div><div class=\"t m0 x1 he y439 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y43a ff4 fs2 fc4 sc0 ls2 ws14\">2.11</div><div class=\"t m3 x20 hd y43a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y43a ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tYPrev<span class=\"_ _2\"></span>ious </div><div class=\"t m0 x6 hc y43b ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setYPr<span class=\"_ _1\"></span>evious(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">y) </span></span></span></span></div><div class=\"t m0 x6 hc y253 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y43c ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>positio<span class=\"_ _1\"></span>n <span class=\"_ _2\"></span>y<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>précéd<span class=\"_ _2\"></span>ente<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y43d ff4 fs2 fc4 sc0 ls2 ws14\">2.12</div><div class=\"t m3 x20 hd y43d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y43d ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tStart<span class=\"_ _2\"></span>Posi<span class=\"_ _2\"></span>tion<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y18e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setStart<span class=\"_ _1\"></span>Position(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0 ls35 ws29\">x,<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls34 ws28\">y)</span><span class=\"fc0\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 h13 y43e ff2 fs3 fc0 sc0 ls54 ws2\"> <span class=\"ff6 ls1b ws13 v5\">42<span class=\"ls2 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2a\" class=\"pf w0 h0\" data-page-no=\"2a\"><div class=\"pc pc2a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>position x<span class=\"_ _1\"></span> <span class=\"ls24 ws1c\">et</span> y <span class=\"_ _4\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> déb<span class=\"_ _2\"></span>ut. </span></span></div><div class=\"t m2 xa hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">2.13</div><div class=\"t m3 x20 hd y1c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c1 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tX<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y1c3 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setX(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">x) </span></span></span></span></div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y43f ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> position <span class=\"ls56 ws43\">x.</span> </span></span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ea ff4 fs2 fc4 sc0 ls2 ws14\">2.14</div><div class=\"t m3 x20 hd y1ea ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ea ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tY<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y440 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setY(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">y) </span></span></span></span></div><div class=\"t m0 x6 hc y203 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y441 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> position <span class=\"ls34 ws28\">y.</span> </span></span></div><div class=\"t m2 xa hc y232 ff4 fs2 fc4 sc0 ls2 ws14\">2.15</div><div class=\"t m3 x20 hd y232 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y232 ff4 fs2 fc4 sc0 ls2 ws2\">mo<span class=\"_ _2\"></span>ve<span class=\"_ _2\"></span>X </div><div class=\"t m0 x6 hc yc5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">moveX(<span class=\"fc8 ws2\">floa<span class=\"_ _1\"></span>t <span class=\"_ _4\"></span><span class=\"fc0\">x) </span></span></span></span></div><div class=\"t m0 x6 hc y1cd ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y442 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>bouger <span class=\"ff3 ws14\">l’obje<span class=\"_ _1\"></span>t</span> <span class=\"_ _2\"></span>sur <span class=\"ff3 ws14\">l’axe</span> des <span class=\"_ _2\"></span><span class=\"ls56 ws43\">x.<span class=\"ls2 ws2\"> </span></span></div><div class=\"t m2 xa hc yc8 ff4 fs2 fc4 sc0 ls2 ws14\">2.16</div><div class=\"t m3 x20 hd yc8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yc8 ff4 fs2 fc4 sc0 ls2 ws2\">mo<span class=\"_ _2\"></span>ve<span class=\"_ _2\"></span>Y </div><div class=\"t m0 x6 hc y1d0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">moveY(<span class=\"fc8 ws2\">fl<span class=\"_ _1\"></span>oat <span class=\"_ _4\"></span><span class=\"fc0\">y)<span class=\"_ _1\"></span> </span></span></span></span></div><div class=\"t m0 x6 hc y1d1 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y443 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>bouger <span class=\"ff3 ws14\">l’obje<span class=\"_ _1\"></span>t</span> <span class=\"_ _2\"></span>sur <span class=\"ff3 ws14\">l’axe</span> des <span class=\"_ _2\"></span><span class=\"ls34 ws28\">y.<span class=\"ls2 ws2\"> </span></span></div><div class=\"t m0 x1 he y444 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f2 ff4 fs2 fc4 sc0 ls2 ws14\">2.17</div><div class=\"t m3 x20 hd y1f2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f2 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tPosit<span class=\"_ _2\"></span>ion<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y234 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setPositio<span class=\"_ _1\"></span>n(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> </span><span class=\"ls35 ws29\">x,</span><span class=\"ws2\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls34 ws28\">y)</span><span class=\"fc0\"> </span></span></span></span></span></div><div class=\"t m0 x1 he y235 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2dc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y236 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>posi<span class=\"_ _1\"></span>tion x <span class=\"ls24 ws1c\">et</span> <span class=\"ls34 ws28\">y.</span> </div><div class=\"t m2 xa hc y237 ff4 fs2 fc4 sc0 ls2 ws14\">2.18</div><div class=\"t m3 x20 hd y237 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y237 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tSprit<span class=\"_ _2\"></span>eSca<span class=\"_ _2\"></span>le<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y212 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y445 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setSp<span class=\"_ _1\"></span>riteScale(<span class=\"fc8 ws2\">fl<span class=\"_ _1\"></span>oat </span><span class=\"ls35 ws29\">x,</span><span class=\"ws2\"> <span class=\"_ _4\"></span><span class=\"fc8\">float<span class=\"_ _1\"></span> <span class=\"fc0 ls34 ws28\">y)</span><span class=\"fc0\"> </span></span></span></span></span></div><div class=\"t m0 x1 he y446 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y238 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1fa ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ff3 ws14\">l’échelle</span> x <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span>y <span class=\"ls1e ws16\">du<span class=\"_ _1\"></span></span> spirite <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m2 xa hc y1fb ff4 fs2 fc4 sc0 ls2 ws14\">2.19</div><div class=\"t m3 x20 hd y1fb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1fb ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSpee<span class=\"_ _2\"></span>d </div><div class=\"t m0 x6 hc y22e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setSpe<span class=\"_ _1\"></span>ed(<span class=\"fc8 ws2\">float <span class=\"_ _4\"></span><span class=\"fc0\">v<span class=\"_ _1\"></span>al) </span></span></span></span></div><div class=\"t m0 x6 hc y1fe ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1ff ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>vitess<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y21e ff4 fs2 fc4 sc0 ls2 ws14\">2.20</div><div class=\"t m3 x20 hd y21e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y21e ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tHsp<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y447 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y21f ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setHsp(</span>float <span class=\"fc0\">v<span class=\"_ _2\"></span>al)<span class=\"_ _4\"></span> </span></span></div><div class=\"t m0 x21 h9 y220 ff6 fs3 fc0 sc0 ls1b ws13\">43<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2b\" class=\"pf w0 h0\" data-page-no=\"2b\"><div class=\"pc pc2b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> vitesse <span class=\"_ _2\"></span>hori<span class=\"_ _2\"></span>zonta<span class=\"_ _2\"></span>l. </span></span></div><div class=\"t m2 xa hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">2.21</div><div class=\"t m3 x20 hd y1c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c1 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tVsp </div><div class=\"t m0 x6 hc y1c3 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setVsp(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">val<span class=\"_ _1\"></span>) </span></span></span></span></div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y43f ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> vitesse <span class=\"_ _2\"></span>vert<span class=\"_ _2\"></span>ical. </span></span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y448 ff4 fs2 fc4 sc0 ls2 ws14\">2.22</div><div class=\"t m3 x20 hd y448 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y448 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tAngu<span class=\"_ _2\"></span>larMov<span class=\"_ _2\"></span>e<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y1c7 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setAngul<span class=\"_ _1\"></span>arMove(<span class=\"fc8 ws2\">floa<span class=\"_ _1\"></span>t <span class=\"_ _2\"></span>const<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">&amp;DELTA_TIME,<span class=\"_ _1\"></span> <span class=\"fc8\">float <span class=\"_ _4\"></span><span class=\"fc0\">s<span class=\"_ _1\"></span>peed, <span class=\"fc8\">float <span class=\"_ _4\"></span><span class=\"fc0\">a<span class=\"_ _1\"></span>ng<span class=\"_ _2\"></span>le) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1c8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c9 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y371 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1ca ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> bouger <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obj<span class=\"_ _1\"></span>et<span class=\"ff2 ws2\"> <span class=\"ls29 ws1f\">en<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> fonction <span class=\"ff3 ws14\">d’un</span> angle <span class=\"ls24 ws1c\">et</span> <span class=\"ff3 ws14\">d’u<span class=\"_ _1\"></span>ne</span> vite<span class=\"_ _2\"></span>sse. </span></span></span></span></span></span></div><div class=\"t m2 xa hc y1cb ff4 fs2 fc4 sc0 ls2 ws14\">2.23</div><div class=\"t m3 x20 hd y1cb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1cb ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tFrame<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y353 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setFram<span class=\"_ _1\"></span>e(<span class=\"fc8 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y227 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> cadre <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc yc8 ff4 fs2 fc4 sc0 ls2 ws14\">2.24</div><div class=\"t m3 x20 hd yc8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yc8 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tFrame<span class=\"_ _2\"></span>Start </div><div class=\"t m0 x6 hc y1d0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setFram<span class=\"_ _1\"></span>eStart(<span class=\"fc8 ws2\">fl<span class=\"_ _1\"></span>oat <span class=\"_ _4\"></span><span class=\"fc0\">val<span class=\"_ _1\"></span>) </span></span></span></span></div><div class=\"t m0 x6 hc y1d1 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y449 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>ca<span class=\"_ _1\"></span>dre <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>de<span class=\"_ _1\"></span>but <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m0 x1 he y444 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y20c ff4 fs2 fc4 sc0 ls2 ws14\">2.25</div><div class=\"t m3 x20 hd y20c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20c ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tFrame<span class=\"_ _2\"></span>End </div><div class=\"t m0 x6 hc y294 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setFram<span class=\"_ _1\"></span>eEnd(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc y2dc ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y44a ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>ca<span class=\"_ _1\"></span>dre <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> fin <span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y1f6 ff4 fs2 fc4 sc0 ls2 ws14\">2.26</div><div class=\"t m3 x20 hd y1f6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f6 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tImage<span class=\"_ _2\"></span>Xsca<span class=\"_ _2\"></span>le </div><div class=\"t m0 x6 hc y1d6 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setImag<span class=\"_ _1\"></span>eXscale(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">float <span class=\"_ _4\"></span><span class=\"fc0\">val<span class=\"_ _1\"></span>) </span></span></span></span></div><div class=\"t m0 x6 hc y1f9 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1fa ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’échelle<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> x <span class=\"_ _4\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y1fb ff4 fs2 fc4 sc0 ls2 ws14\">2.27</div><div class=\"t m3 x20 hd y1fb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1fb ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tImage<span class=\"_ _2\"></span>Yscal<span class=\"_ _2\"></span>e </div><div class=\"t m0 x6 hc y1fc ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setImag<span class=\"_ _1\"></span>eYscale(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">float <span class=\"_ _4\"></span><span class=\"fc0\">val<span class=\"_ _1\"></span>) </span></span></span></span></div><div class=\"t m0 x6 hc y44b ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1ff ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’échelle<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> y <span class=\"_ _4\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l<span class=\"_ _2\"></span>’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y21e ff4 fs2 fc4 sc0 ls2 ws14\">2.28</div><div class=\"t m3 x20 hd y21e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y21e ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tImage<span class=\"_ _2\"></span>Scale<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y447 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y21f ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setImageScale(</span>f<span class=\"_ _1\"></span>loat <span class=\"fc0\">val, <span class=\"_ _2\"></span><span class=\"fc8\">bool <span class=\"fc0\">updateXYscale = <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">fals<span class=\"_ _2\"></span>e<span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></span></div><div class=\"t m0 x21 h9 y220 ff6 fs3 fc0 sc0 ls1b ws13\">44<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2c\" class=\"pf w0 h0\" data-page-no=\"2c\"><div class=\"pc pc2c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Definie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> variable <span class=\"_ _4\"></span>scale. </span></span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc0 sc0 ls2 ws14\">updateXYscale<span class=\"ff2 ws2\">:<span class=\"_ _1\"></span> Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définie <span class=\"ff3 ws14\">l’échelle</span> x<span class=\"_ _2\"></span> <span class=\"ls24 ws1c\">et</span> y <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’objet<span class=\"ff2 ws2\"> avec une <span class=\"_ _2\"></span>même valeur<span class=\"_ _2\"></span>. </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c3 ff4 fs2 fc4 sc0 ls2 ws14\">2.29</div><div class=\"t m3 x20 hd y1c3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c3 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tImage<span class=\"_ _2\"></span>ScaleX<span class=\"_ _2\"></span>_Y<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y34f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setImageScaleX<span class=\"_ _1\"></span>_Y(</span>float <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls34 ws28\">y)</span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x1 he y44c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1ea ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ff3 ws14\">l’échelle</span> x <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">et<span class=\"ls2 ws2\"> y <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls1a ws2\"> <span class=\"ff3 ls2 ws14\">l’obj<span class=\"_ _2\"></span>et.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y44d ff4 fs2 fc4 sc0 ls2 ws14\">2.30</div><div class=\"t m3 x20 hd y44d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y44d ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tImage<span class=\"_ _2\"></span>Angl<span class=\"_ _2\"></span>e </div><div class=\"t m0 x6 hc y1ec ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setImag<span class=\"_ _1\"></span>eAngle(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc y231 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1ee ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’a<span class=\"_ _1\"></span>ngle<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1ef ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y353 ff4 fs2 fc4 sc0 ls2 ws14\">2.31</div><div class=\"t m3 x20 hd y353 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y353 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tXOff<span class=\"_ _2\"></span>set </div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setXOffs<span class=\"_ _1\"></span>et(<span class=\"fc8 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc y227 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he yc8 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>écalage x <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y372 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y228 ff4 fs2 fc4 sc0 ls2 ws14\">2.32</div><div class=\"t m3 x20 hd y228 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y228 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tYOffse<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 hc y22a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setYOffs<span class=\"_ _1\"></span>et(<span class=\"fc8 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc y2a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1d2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y20c ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>écalage y <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m2 xa hc y1f3 ff4 fs2 fc4 sc0 ls2 ws14\">2.33</div><div class=\"t m3 x20 hd y1f3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f3 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tXYOff<span class=\"_ _2\"></span>set<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1f4 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc yce ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setXYOffset(<span class=\"_ _1\"></span></span>float <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls34 ws28\">y)</span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x1 he y44e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f5 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y44f ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>écalage x <span class=\"ls24 ws1c\">et</span> y <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m0 x1 he y450 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y91 ff4 fs2 fc4 sc0 ls2 ws14\">2.34</div><div class=\"t m3 x20 hd y91 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y91 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tXYOff<span class=\"_ _2\"></span>set </div><div class=\"t m0 x6 hc y22d ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"fc0\">setXY<span class=\"_ _1\"></span>Offset() </span></span></div><div class=\"t m0 x6 hc y451 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1da ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>écalage x <span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span></span> y <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’objet<span class=\"ff2 ls1a ws2\"> <span class=\"ls29 ws1f\">en</span><span class=\"ls2\"> <span class=\"_ _2\"></span><span class=\"ls3d ws2d\">se<span class=\"ls2 ws2\"> basant <span class=\"_ _2\"></span>sur <span class=\"ls1d ws15\">le</span> centre <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> sprite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y452 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y22e ff4 fs2 fc4 sc0 ls2 ws14\">2.35</div><div class=\"t m3 x20 hd y22e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y22e ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tTime<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y1fe ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0 ws14\">setTime(</span>float <span class=\"_ _1\"></span><span class=\"fc0\">x) </span></div><div class=\"t m0 x6 hc y1dd ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1de ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>leur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> variable <span class=\"ff4\">m_time </span><span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y1df ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e0 ff4 fs2 fc4 sc0 ls2 ws14\">2.36</div><div class=\"t m3 x20 hd y1e0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e0 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tImage<span class=\"_ _2\"></span>Alpha<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x21 h9 y1e1 ff6 fs3 fc0 sc0 ls1b ws13\">45<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2d\" class=\"pf w0 h0\" data-page-no=\"2d\"><div class=\"pc pc2d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">46<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setImageAlpha(<span class=\"_ _1\"></span></span>int <span class=\"_ _2\"></span><span class=\"fc0\">va<span class=\"_ _2\"></span>l) </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2bd ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ff3 ws14\">l’image</span> <span class=\"_ _2\"></span>alpha <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m2 xa hc y1c3 ff4 fs2 fc4 sc0 ls2 ws14\">2.37</div><div class=\"t m3 x20 hd y1c3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c3 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tImage<span class=\"_ _2\"></span>Inde<span class=\"_ _2\"></span>x </div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setImag<span class=\"_ _1\"></span>eIndex(<span class=\"fc8 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0\">va<span class=\"_ _1\"></span>l) </span></span></span></span></div><div class=\"t m0 x6 hc y1c5 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2be ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>sous<span class=\"_ _1\"></span> image <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">2.38</div><div class=\"t m3 x20 hd y221 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tMaskW<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c9 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setMaskW(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">unsigned<span class=\"_ _1\"></span> in<span class=\"_ _2\"></span>t <span class=\"fc0\">va<span class=\"_ _4\"></span>l) </span></span></span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ca ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y453 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ls1e ws16\">du</span> masque <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>coll<span class=\"_ _1\"></span>ision <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc yc5 ff4 fs2 fc4 sc0 ls2 ws14\">2.39</div><div class=\"t m3 x20 hd yc5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yc5 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tMaskH<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3ec ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setMaskH(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">unsigned int <span class=\"_ _2\"></span><span class=\"fc0\">va<span class=\"_ _2\"></span>l) </span></span></span></span></div><div class=\"t m0 x1 he y3ed ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he ybd ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>ha<span class=\"_ _1\"></span>uteur du masque <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>collision <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m0 x1 he y372 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y228 ff4 fs2 fc4 sc0 ls2 ws14\">2.40</div><div class=\"t m3 x20 hd y228 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y228 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tRecta<span class=\"_ _2\"></span>ngleM<span class=\"_ _2\"></span>ask<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y229 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setRectangleMa<span class=\"_ _1\"></span>sk(</span>int <span class=\"fc0\">width, <span class=\"_ _2\"></span><span class=\"fc8\">int <span class=\"fc0\">h<span class=\"_ _2\"></span>eight<span class=\"_ _2\"></span>) </span></span></span></span></div><div class=\"t m0 x1 he y373 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3ee ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y22c ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>ha<span class=\"_ _1\"></span>uteur <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>masqu<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> collision rectangle </span>de<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’objet<span class=\"ff2 ws2\"> <span class=\"ls24 ws1c\">et</span> </span>l’utlise<span class=\"ff2 ws2\"> comme masque par <span class=\"_ _2\"></span>déf<span class=\"_ _2\"></span>aut. </span></span></span></span></div><div class=\"t m2 xa hc y294 ff4 fs2 fc4 sc0 ls2 ws14\">2.41</div><div class=\"t m3 x20 hd y294 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y294 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tCircl<span class=\"_ _2\"></span>eMas<span class=\"_ _2\"></span>k<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y374 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y9f ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setCircleMask(</span>floa<span class=\"_ _1\"></span>t <span class=\"fc0\">r<span class=\"_ _2\"></span>adu<span class=\"_ _2\"></span>is) </span></span></div><div class=\"t m0 x1 he y375 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y376 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y377 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> rayon <span class=\"ls1e ws16\">du</span> masque <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>ollision ce<span class=\"_ _1\"></span>rcle <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’<span class=\"_ _1\"></span>objet<span class=\"ff2 ws2\"> <span class=\"ls24 ws1c\">et</span> </span>l’utlise<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>comm<span class=\"_ _1\"></span>e masque par <span class=\"_ _2\"></span>déf<span class=\"_ _2\"></span>aut. </span></span></span></span></span></span></div><div class=\"t m2 xa hc ya3 ff4 fs2 fc4 sc0 ls2 ws14\">2.42</div><div class=\"t m3 x20 hd ya3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc ya3 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tIsAc<span class=\"_ _2\"></span>tive </div><div class=\"t m0 x6 hc y1d8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setIsActive(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">val) </span></span></span></span></div><div class=\"t m0 x6 hc y37a ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y454 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’activité<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’objet.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y455 ff4 fs2 fc4 sc0 ls2 ws14\">2.43</div><div class=\"t m3 x20 hd y455 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y455 ff4 fs2 fc4 sc0 ls2 ws14\">upda<span class=\"_ _2\"></span>teCo<span class=\"_ _2\"></span>llisio<span class=\"_ _2\"></span>nMas<span class=\"_ _2\"></span>k<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y66 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y66 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y66 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _2\"></span>forme :<span class=\"_ _4\"></span> </div><div class=\"t m0 x1 hc y308 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y456 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">update<span class=\"_ _2\"></span>Col<span class=\"_ _2\"></span>lisionM<span class=\"_ _2\"></span>ask() </span></span></div><div class=\"t m0 x1 he y457 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y458 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y459 ff2 fs2 fc0 sc0 ls2 ws2\">Met <span class=\"_ _2\"></span>à jour les <span class=\"_ _2\"></span>informati<span class=\"_ _1\"></span>ons (taille, position, <span class=\"_ _2\"></span><span class=\"ff3 ls57 ws44\">…)<span class=\"ff2 ls2 ws2\"> <span class=\"ls1e ws16\">du</span> masque <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>olli<span class=\"_ _2\"></span>sion<span class=\"_ _2\"></span>. </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2e\" class=\"pf w0 h0\" data-page-no=\"2e\"><div class=\"pc pc2e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbsQ2DMBCG0VxE5wFo2YZFqVnJS7i/rBAJpDjHeyP8bvwVF5n5AgAAoKi3CQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAgEdYTFBSRBihgN77tm12AADgUh1kphXq8azqHQAAVB8AAEB97voAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0A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AABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoA+LRfxyYAwgAQRbnS0h3cxQGEgNs4g2DpEI5g4wZCyoximxWE97prr/sAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAAAAFNyEAAACLSURBVNUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAADoqm+fzyTJvRytluSa3nHduj08rZbEZQAAAD/yAezeQDSp79WCAAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">47<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y13d ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y13d ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y13d ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me: </div><div class=\"t m0 x1 hc y190 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y191 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">updateCollisionM<span class=\"_ _1\"></span>ask(<span class=\"_ _1\"></span></span>int <span class=\"_ _2\"></span><span class=\"fc0 ls35 ws29\">x,<span class=\"ls2 ws2\"> <span class=\"fc8\">int <span class=\"_ _4\"></span><span class=\"fc0 ls34 ws28\">y)<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y192 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y193 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y194 ff2 fs2 fc0 sc0 ls2 ws2\">Met <span class=\"_ _2\"></span>à jour <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>p<span class=\"_ _1\"></span>osition <span class=\"ls1e ws16\">du</span> masque <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> collision<span class=\"_ _1\"></span> <span class=\"ls29 ws1f\">en</span> fonction <span class=\"ff3 ws14\">d’un</span> <span class=\"_ _2\"></span>point <span class=\"_ _1\"></span>x <span class=\"ls24 ws1c\">et</span> y <span class=\"_ _2\"></span>différents<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>c<span class=\"_ _1\"></span>elui <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y45a ff4 fs2 fc4 sc0 ls2 ws14\">2.44</div><div class=\"t m3 x20 hd y45a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y45a ff4 fs2 fc4 sc0 ls2 ws2\">cent<span class=\"_ _2\"></span>erCo<span class=\"_ _2\"></span>llis<span class=\"_ _2\"></span>ionMask<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y10b ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">centerCol<span class=\"_ _1\"></span>lisionMask<span class=\"_ _1\"></span>(<span class=\"fc8 ws2\">int <span class=\"_ _2\"></span><span class=\"fc0 ls35 ws29\">x,<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">y) </span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y45b ff2 fs2 fc0 sc0 ls2 ws2\">Centre <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>p<span class=\"_ _1\"></span>osition <span class=\"ls1e ws16\">du</span> masque <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>collision <span class=\"ls24 ws1c\">en<span class=\"_ _1\"></span></span> fonction <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>n<span class=\"ff2 ws2\"> point <span class=\"_ _2\"></span>x <span class=\"ls24 ws1c\">et</span><span class=\"ls1a\"> <span class=\"ls34 ws28\">y.</span></span> </span></span></div><div class=\"t m2 xa hc y45c ff4 fs2 fc4 sc0 ls2 ws14\">2.45</div><div class=\"t m3 x20 hd y45c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y45c ff4 fs2 fc4 sc0 ls2 ws14\">upda<span class=\"_ _2\"></span>teSp<span class=\"_ _2\"></span>rite<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y45d ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y45d ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y45d ff9 fs2 fc0 sc0 ls2 ws2\">Premier forme </div><div class=\"t m0 x6 hc y45e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">updateSpr<span class=\"_ _1\"></span>ite() </span></span></div><div class=\"t m0 x6 hc y339 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y45f ff2 fs2 fc0 sc0 ls2 ws2\">Met <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> jour <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>prite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’objet</span> avec le<span class=\"_ _2\"></span>s<span class=\"_ _1\"></span> valeurs <span class=\"_ _2\"></span>des variables<span class=\"_ _1\"></span> (alpha, scale, <span class=\"_ _2\"></span><span class=\"ff3 ls57 ws44\">…)<span class=\"ff2 ls2 ws2\"> qui <span class=\"ls28 ws1e\">se</span> <span class=\"_ _2\"></span>trouvent<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>dans <span class=\"ff3 ws14\">l’obje<span class=\"_ _4\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa h15 y460 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y460 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y460 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y461 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y462 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">updateS<span class=\"_ _1\"></span>prite(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> </span><span class=\"ls35 ws29\">x,</span><span class=\"ws2\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls43 ws33\">y,</span><span class=\"fc0\"> </span>float <span class=\"fc0\">angle = <span class=\"_ _2\"></span><span class=\"fcb ls2e ws26\">0.f<span class=\"fc0 ls2 ws2\">, <span class=\"fc8\">int </span>alpha = </span>255<span class=\"fc0 ls58 ws2\">, <span class=\"fc8 ls2\">float <span class=\"fc0\">xScale = <span class=\"_ _2\"></span><span class=\"fcb ls2e ws26\">1.f<span class=\"fc0 ls2 ws2\">, <span class=\"fc8\">float </span>yScale = <span class=\"_ _2\"></span><span class=\"fcb ws14\">1.<span class=\"_ _2\"></span>f<span class=\"fc0 ws2\">) </span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y463 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y464 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y465 ff2 fs2 fc0 sc0 ls2 ws2\">Met <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> jour <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>prite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’objet</span> avec des <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>leurs <span class=\"_ _1\"></span>exter<span class=\"_ _2\"></span>nes<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y466 ff4 fs2 fc4 sc0 ls2 ws14\">2.46</div><div class=\"t m3 x20 hd y466 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y466 ff4 fs2 fc4 sc0 ls2 ws14\">dr<span class=\"_ _2\"></span>aw<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y467 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y468 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0\">draw(is::Render <span class=\"_ _2\"></span>&amp;surfa<span class=\"_ _2\"></span>ce) </span></span></div><div class=\"t m0 x6 hc y469 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y46a ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y46b ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"_ _4\"></span><span class=\"ff3 ws14\">d<span class=\"_ _1\"></span>’afficher<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y46c ff4 fs2 fc4 sc0 ls2 ws14\">2.47</div><div class=\"t m3 x20 hd y46c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y46c ff4 fs2 fc4 sc0 ls2 ws14\">dra<span class=\"_ _2\"></span>wMask<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y46d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y46e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0\">drawMask(is::Rende<span class=\"_ _1\"></span>r &amp;surface, sf::Color <span class=\"_ _2\"></span>color = <span class=\"_ _4\"></span>sf::C<span class=\"_ _2\"></span>olor<span class=\"_ _2\"></span>::Blue<span class=\"_ _2\"></span>) </span></span></div><div class=\"t m0 x6 hc y46f ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y470 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y471 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’afficher</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> masque <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>coll<span class=\"_ _1\"></span>ision <span class=\"_ _1\"></span>qui <span class=\"_ _2\"></span>a été <span class=\"_ _2\"></span>défini (Rectangle<span class=\"_ _1\"></span> <span class=\"ls2a ws20\">ou</span> <span class=\"_ _4\"></span>C<span class=\"_ _1\"></span>ercle) pour <span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y472 ff4 fs2 fc4 sc0 ls2 ws14\">2.48</div><div class=\"t m3 x20 hd y472 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y472 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Mask<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y473 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y474 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">Rectangle&amp;<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>g<span class=\"_ _1\"></span>etMask<span class=\"_ _1\"></span>() <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5\">noexcept </span></span></span></span></div><div class=\"t m0 x6 hc y15e ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y475 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>masque <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>coll<span class=\"_ _1\"></span>ision rectangle<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>(par déf<span class=\"_ _2\"></span>aut<span class=\"_ _2\"></span>). </span></span></div><div class=\"t m0 x1 he y476 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y477 ff4 fs2 fc4 sc0 ls2 ws14\">2.49</div><div class=\"t m3 x20 hd y477 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y477 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Circl<span class=\"_ _2\"></span>eMask<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y478 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y479 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">Cir<span class=\"_ _2\"></span>cle<span class=\"_ _1\"></span>&amp; <span class=\"_ _2\"></span>getCircl<span class=\"_ _1\"></span>eMask()<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5\">noexcept </span></span></span></span></div><div class=\"t m0 x6 hc y47a ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf2f\" class=\"pf w0 h0\" data-page-no=\"2f\"><div class=\"pc pc2f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> masque <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>coll<span class=\"_ _1\"></span>ision c<span class=\"_ _2\"></span>ercle<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c0 ff4 fs2 fc4 sc0 ls2 ws14\">2.50</div><div class=\"t m3 x20 hd y1c0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c0 ff4 fs2 fc4 sc0 ls2 ws2\">g<span class=\"_ _2\"></span>etX<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y2bd ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getX()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y42f ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>position x <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">2.51</div><div class=\"t m3 x20 hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e8 ff4 fs2 fc4 sc0 ls2 ws2\">g<span class=\"_ _2\"></span>etY<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y2be ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getY() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y1c7 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y203 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>position y <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y230 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y231 ff4 fs2 fc4 sc0 ls2 ws14\">2.52</div><div class=\"t m3 x20 hd y231 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y231 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>XStar<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 hc y453 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getXSta<span class=\"_ _1\"></span>rt() <span class=\"_ _4\"></span><span class=\"fc8\">cons<span class=\"_ _1\"></span>t </span></span></span></div><div class=\"t m0 x6 hc yc5 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1cd ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>position x <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>début <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y24 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y227 ff4 fs2 fc4 sc0 ls2 ws14\">2.53</div><div class=\"t m3 x20 hd y227 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y227 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>YStart<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y28f ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getYSta<span class=\"_ _1\"></span>rt() <span class=\"_ _4\"></span><span class=\"fc8\">cons<span class=\"_ _1\"></span>t </span></span></span></div><div class=\"t m0 x6 hc y20a ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y20b ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> position <span class=\"_ _4\"></span>y<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> début <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y47b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2a ff4 fs2 fc4 sc0 ls2 ws14\">2.54</div><div class=\"t m3 x20 hd y2a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2a ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>XPrev<span class=\"_ _2\"></span>ious </div><div class=\"t m0 x6 hc y47c ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getXPr<span class=\"_ _1\"></span>evious() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y234 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y2dc ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>positi<span class=\"_ _1\"></span>on x précédente <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obj<span class=\"_ _2\"></span>et.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y47d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1d4 ff4 fs2 fc4 sc0 ls2 ws14\">2.55</div><div class=\"t m3 x20 hd y1d4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1d4 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>YPrev<span class=\"_ _2\"></span>ious </div><div class=\"t m0 x6 hc y47e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getYPrev<span class=\"_ _1\"></span>ious() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y445 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y215 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>positi<span class=\"_ _1\"></span>on <span class=\"_ _2\"></span>y<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>préc<span class=\"_ _1\"></span>édente <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y216 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1d9 ff4 fs2 fc4 sc0 ls2 ws14\">2.56</div><div class=\"t m3 x20 hd y1d9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1d9 ff4 fs2 fc4 sc0 ls2 ws14\">dis<span class=\"_ _2\"></span>tantT<span class=\"_ _2\"></span>oPoint<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y217 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">float <span class=\"fc0 ws14\">distantToPoint(<span class=\"_ _1\"></span></span>float <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">y) </span><span class=\"ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x1 he y218 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1fc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1fd ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y21b ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>distance entre <span class=\"ff3 ws14\">l’objet</span> <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> point<span class=\"_ _1\"></span> x <span class=\"ls24 ws1c\">et</span> <span class=\"ls34 ws28\">y.</span> </span></span></span></span></div><div class=\"t m0 x1 he y21c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y21d ff4 fs2 fc4 sc0 ls2 ws14\">2.57</div><div class=\"t m3 x20 hd y21d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y21d ff4 fs2 fc4 sc0 ls2 ws14\">dis<span class=\"_ _2\"></span>tantT<span class=\"_ _2\"></span>oObje<span class=\"_ _2\"></span>ct<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y21e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0 ws14\">distantToO<span class=\"_ _1\"></span>bject(<span class=\"ff4 fc5\">std::shared_ptr<span class=\"_ _1\"></span></span><span class=\"ws2\">&lt;MainObj<span class=\"_ _1\"></span>ect&gt; <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;othe<span class=\"_ _1\"></span>r, <span class=\"_ _2\"></span><span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">useSpritePositi<span class=\"_ _1\"></span>on) <span class=\"_ _2\"></span><span class=\"fc8 ws14\">const<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1df ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x21 h9 y1e1 ff6 fs3 fc0 sc0 ls1b ws13\">48<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf30\" class=\"pf w0 h0\" data-page-no=\"30\"><div class=\"pc pc30 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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PgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAALzar2MSAKEAiqK80dEOdjGA8ME2ZhAcDWEEFxsIf/xRXK0gnrO99W1X9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAH7Iq7kAAACzSURBVABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAA+Hn1reOeJDmnrdWSHMPdz8trd1erJXEZAADAhzyknkdj9xYKWwAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>dista<span class=\"_ _1\"></span>nce entre <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obj<span class=\"_ _1\"></span>et<span class=\"ff2 ws2\"> <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span>un autre. </span></span></span></span></div><div class=\"t m0 x6 hc y39e ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"ff2 fc0 ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ff4\">useSpritePosition <span class=\"_ _1\"></span></span>est <span class=\"ff4\">vrais </span><span class=\"ls2a ws20\">on</span> <span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>tilise <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>position <span class=\"ls1e ws16\">du</span> sprite <span class=\"ls1e ws16\">de</span> <span class=\"ff3 ws14\">l’objet</span> pour faire le test <span class=\"ff4 ls59 ws45\">si</span><span class=\"ff4\"> non </span><span class=\"ls2a ws20\">on</span> <span class=\"_ _2\"></span>uti<span class=\"_ _1\"></span>lise <span class=\"ls1d\">la </span></span></span></div><div class=\"t m0 x6 hc y47f ff2 fs2 fc0 sc0 ls2 ws2\">position <span class=\"ff4\">x, y <span class=\"ff3\">de l’<span class=\"_ _1\"></span>objet.</span></span> </div><div class=\"t m2 xa hc y3a0 ff4 fs2 fc4 sc0 ls2 ws14\">2.58</div><div class=\"t m3 x20 hd y3a0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y3a0 ff4 fs2 fc4 sc0 ls2 ws14\">poi<span class=\"_ _2\"></span>ntDir<span class=\"_ _2\"></span>ection<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y480 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y480 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y480 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y481 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y482 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">float <span class=\"fc0 ws14\">pointDirection(<span class=\"_ _1\"></span></span>float <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">y) </span><span class=\"ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x1 he y483 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y484 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y485 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y486 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>direction (angle) <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’objet<span class=\"ff2 ws2\"> par rapport à <span class=\"_ _4\"></span><span class=\"ls2c ws21\">un<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> poin<span class=\"_ _2\"></span>t. </span></span></span></span></span></span></div><div class=\"t m2 xa h15 y487 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y487 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y487 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y488 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y489 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0 ws14\">pointDir<span class=\"_ _1\"></span>ection(<span class=\"_ _1\"></span><span class=\"ff4 fc5\">std::shared_ptr<span class=\"_ _1\"></span></span><span class=\"ws2\">&lt;MainObjec<span class=\"_ _1\"></span>t&gt; <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;other) <span class=\"fc8 ws14\">c<span class=\"_ _2\"></span>onst<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y48a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y48b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y48c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y48d ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>direction (angle) <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’objet<span class=\"ff2 ws2\"> par rapport à <span class=\"_ _4\"></span><span class=\"ls2c ws21\">un<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> autre. Ici<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">l’autre</span> <span class=\"_ _2\"></span>objet<span class=\"_ _1\"></span> est <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>poin<span class=\"_ _2\"></span>teur. </span></span></span></span></span></span></div><div class=\"t m2 xa hc y48e ff4 fs2 fc4 sc0 ls2 ws14\">2.59</div><div class=\"t m3 x20 hd y48e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y48e ff4 fs2 fc4 sc0 ls2 ws14\">poi<span class=\"_ _2\"></span>ntDir<span class=\"_ _2\"></span>ection<span class=\"_ _2\"></span>Spr<span class=\"_ _2\"></span>ite<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y48f ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y48f ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y48f ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y490 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y491 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">float <span class=\"fc0 ws14\">pointDirection<span class=\"_ _1\"></span>Sprite(</span>fl<span class=\"_ _1\"></span>oat <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0 ls43 ws33\">y)<span class=\"ls2 ws2\"> <span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y492 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y493 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y494 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y495 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>direction (angle) <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>s<span class=\"_ _1\"></span>prite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’objet</span> par r<span class=\"_ _2\"></span>ap<span class=\"_ _1\"></span>port à <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>point<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xa h15 y496 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y496 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y496 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y497 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y498 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0 ws14\">pointDirectio<span class=\"_ _1\"></span>nSprite(<span class=\"ff4 fc5\">std::sha<span class=\"_ _1\"></span>red_ptr</span><span class=\"ws2\">&lt;Mai<span class=\"_ _1\"></span>nObject&gt; <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"fc0\">&amp;other) <span class=\"_ _4\"></span><span class=\"fc8 ws14\">const<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y499 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y49a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y49b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y49c ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>direction (angle) <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>s<span class=\"_ _1\"></span>prite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’objet</span> par r<span class=\"_ _2\"></span>ap<span class=\"_ _1\"></span>port à <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>autre<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xa hc y49d ff4 fs2 fc4 sc0 ls2 ws14\">2.60</div><div class=\"t m3 x20 hd y49d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y49d ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Spee<span class=\"_ _2\"></span>d </div><div class=\"t m0 x6 hc y49e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSp<span class=\"_ _1\"></span>eed() <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y49f ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4a0 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>vitess<span class=\"_ _1\"></span>e de <span class=\"ff3 ws14\">l<span class=\"_ _2\"></span>’objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y4a1 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y4a2 ff4 fs2 fc4 sc0 ls2 ws14\">2.61</div><div class=\"t m3 x20 hd y4a2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y4a2 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Hsp </div><div class=\"t m0 x6 hc y4a3 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getHsp()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y4a4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4a5 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> vitesse <span class=\"_ _2\"></span>h<span class=\"_ _1\"></span>orizontale<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y4a6 ff4 fs2 fc4 sc0 ls2 ws14\">2.62</div><div class=\"t m3 x20 hd y4a6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y4a6 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Vsp </div><div class=\"t m0 x6 hc y4a7 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getVsp()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y4a8 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4a9 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>vitesse v<span class=\"_ _1\"></span>erticale <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’ob<span class=\"_ _2\"></span>jet<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x21 h9 y4aa ff6 fs3 fc0 sc0 ls1b ws13\">49<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf31\" class=\"pf w0 h0\" data-page-no=\"31\"><div class=\"pc pc31 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.63</div><div class=\"t m3 x20 hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Frame<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y201 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getFrame()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">con<span class=\"_ _1\"></span>st </span></span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>numéro<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> sous <span class=\"_ _2\"></span>imag<span class=\"_ _1\"></span>e qui est <span class=\"ls24 ws1c\">en</span> <span class=\"_ _2\"></span>cours<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’<span class=\"_ _4\"></span>affichag<span class=\"_ _2\"></span>e.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.64</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Frame<span class=\"_ _2\"></span>Start </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getFrame<span class=\"_ _1\"></span>Start() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c7 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> numéro <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>sous<span class=\"_ _1\"></span> image <span class=\"ls1e ws16\">de</span> dé<span class=\"_ _4\"></span>but. </span></span></div><div class=\"t m0 x1 he y202 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">2.65</div><div class=\"t m3 x20 hd y203 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y203 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Frame<span class=\"_ _2\"></span>End </div><div class=\"t m0 x6 hc y204 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getFrameE<span class=\"_ _1\"></span>nd() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y205 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y22 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> numéro <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>sous<span class=\"_ _1\"></span> image <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>fi<span class=\"_ _2\"></span>n.<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x1 he y206 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">2.66</div><div class=\"t m3 x20 hd y207 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y207 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>ImageX<span class=\"_ _2\"></span>sca<span class=\"_ _2\"></span>le </div><div class=\"t m0 x6 hc y208 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getImage<span class=\"_ _1\"></span>Xscale()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y209 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y20a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0\">l’échelle x<span class=\"ff2\"> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y28 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">2.67</div><div class=\"t m3 x20 hd y20b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20b ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Image<span class=\"_ _2\"></span>Yscal<span class=\"_ _2\"></span>e </div><div class=\"t m0 x6 hc y2a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getImage<span class=\"_ _1\"></span>Yscale() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y20c ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y20d ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0\">l’échelle y<span class=\"ff2\"> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y20e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2dc ff4 fs2 fc4 sc0 ls2 ws14\">2.68</div><div class=\"t m3 x20 hd y2dc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2dc ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Image<span class=\"_ _2\"></span>Scale </div><div class=\"t m0 x6 hc y295 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getImage<span class=\"_ _1\"></span>Scale() <span class=\"_ _4\"></span><span class=\"fc8\">c<span class=\"_ _1\"></span>onst </span></span></span></div><div class=\"t m0 x6 hc y131 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y213 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l<span class=\"_ _1\"></span>’échelle<span class=\"ff2 ws2\"> <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y214 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y215 ff4 fs2 fc4 sc0 ls2 ws14\">2.69</div><div class=\"t m3 x20 hd y215 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y215 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Image<span class=\"_ _2\"></span>Angle<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y4ab ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getImageA<span class=\"_ _1\"></span>ngle() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y4ac ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4ad ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’angle<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’imag<span class=\"_ _1\"></span>e<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y4ae ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y4af ff4 fs2 fc4 sc0 ls2 ws14\">2.70</div><div class=\"t m3 x20 hd y4af ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y4af ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>XOff<span class=\"_ _2\"></span>set </div><div class=\"t m0 x6 hc y4b0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getXOffse<span class=\"_ _1\"></span>t() <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst </span></span></span></div><div class=\"t m0 x6 hc y23a ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4b1 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> décallage <span class=\"ls24 ws1c\">en</span> x <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x21 h9 y4b2 ff6 fs3 fc0 sc0 ls1b ws13\">50<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf32\" class=\"pf w0 h0\" data-page-no=\"32\"><div class=\"pc pc32 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.71</div><div class=\"t m3 x20 hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>YOff<span class=\"_ _2\"></span>set </div><div class=\"t m0 x6 hc y201 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getYOffse<span class=\"_ _1\"></span>t() <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst </span></span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> décallage <span class=\"ls24 ws1c\">en</span> y <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.72</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Time </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getTime()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const<span class=\"_ _1\"></span> </span></span></span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c7 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>leur de <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> variable <span class=\"ff4 ws14\">m_tim<span class=\"_ _2\"></span>e<span class=\"ff2 ws2\">. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y202 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">2.73</div><div class=\"t m3 x20 hd y203 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y203 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Insta<span class=\"_ _2\"></span>nceI<span class=\"_ _2\"></span>d </div><div class=\"t m0 x6 hc y204 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getInstanc<span class=\"_ _1\"></span>eId() <span class=\"_ _4\"></span><span class=\"fc8\">c<span class=\"_ _1\"></span>onst </span></span></span></div><div class=\"t m0 x6 hc y205 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y22 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> numéro <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’ob<span class=\"_ _4\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y206 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">2.74</div><div class=\"t m3 x20 hd y207 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>MaskW<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y24 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y227 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">u<span class=\"_ _1\"></span>nsigned int <span class=\"_ _2\"></span><span class=\"fc0\">getMask<span class=\"_ _1\"></span>W() <span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y209 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2db ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y20a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ls1f ws17\">du<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> masque <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>coll<span class=\"_ _2\"></span>ision<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y28 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">2.75</div><div class=\"t m3 x20 hd y20b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>MaskH<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y47b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">u<span class=\"_ _1\"></span>nsigned int <span class=\"_ _2\"></span><span class=\"fc0\">getMask<span class=\"_ _1\"></span>H() <span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y4b3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y20c ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1f3 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>ha<span class=\"_ _1\"></span>uteur <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>mas<span class=\"_ _1\"></span>que <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>coll<span class=\"_ _2\"></span>ision<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y12b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc yce ff4 fs2 fc4 sc0 ls2 ws14\">2.76</div><div class=\"t m3 x20 hd yce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yce ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>IsAct<span class=\"_ _2\"></span>ive </div><div class=\"t m0 x6 hc y211 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">bool<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getIsActiv<span class=\"_ _1\"></span>e() <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst </span></span></span></div><div class=\"t m0 x6 hc y1f6 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1d6 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’état<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1f8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f9 ff4 fs2 fc4 sc0 ls2 ws14\">2.77</div><div class=\"t m3 x20 hd y1f9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f9 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Image<span class=\"_ _2\"></span>Alpha<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y1fa ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getImageAlpha<span class=\"_ _1\"></span>() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y1fb ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1fc ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’image<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>alpha <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y1fd ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y44b ff4 fs2 fc4 sc0 ls2 ws14\">2.78</div><div class=\"t m3 x20 hd y44b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y44b ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Image<span class=\"_ _2\"></span>Inde<span class=\"_ _2\"></span>x </div><div class=\"t m0 x6 hc y4b4 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getImageI<span class=\"_ _1\"></span>ndex() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y21e ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y21f ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l<span class=\"_ _1\"></span>’index<span class=\"ff2 ls1a ws2\"> <span class=\"ls1e ws16\">de</span><span class=\"ls2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’im<span class=\"_ _2\"></span>age.<span class=\"ff2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x21 h9 y220 ff6 fs3 fc0 sc0 ls1b ws13\">51<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf33\" class=\"pf w0 h0\" data-page-no=\"33\"><div class=\"pc pc33 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.79</div><div class=\"t m3 x20 hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Sprit<span class=\"_ _2\"></span>eWidt<span class=\"_ _2\"></span>h </div><div class=\"t m0 x6 hc y201 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getSprit<span class=\"_ _1\"></span>eWidth() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ls1e ws16\">du</span> s<span class=\"_ _2\"></span>prite<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y1e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.80</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Sprit<span class=\"_ _2\"></span>eHeig<span class=\"_ _2\"></span>ht </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getSprit<span class=\"_ _1\"></span>eHeight() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c7 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>ha<span class=\"_ _1\"></span>uteur <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>sprite<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y202 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">2.81</div><div class=\"t m3 x20 hd y203 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y203 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Sprit<span class=\"_ _2\"></span>eX </div><div class=\"t m0 x6 hc y204 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSp<span class=\"_ _1\"></span>riteX() <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst </span></span></span></div><div class=\"t m0 x6 hc y205 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y22 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>positio<span class=\"_ _1\"></span>n <span class=\"_ _2\"></span>x <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>sprite<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y206 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">2.82</div><div class=\"t m3 x20 hd y207 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y207 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Sprit<span class=\"_ _2\"></span>eY </div><div class=\"t m0 x6 hc y208 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSp<span class=\"_ _1\"></span>riteY() <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst </span></span></span></div><div class=\"t m0 x6 hc y209 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y20a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>positio<span class=\"_ _1\"></span>n <span class=\"_ _2\"></span>y <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>spri<span class=\"_ _2\"></span>te. </span></span></div><div class=\"t m0 x1 he y28 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">2.83</div><div class=\"t m3 x20 hd y20b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20b ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Text<span class=\"_ _2\"></span>ureWid<span class=\"_ _2\"></span>th </div><div class=\"t m0 x6 hc y2a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getTexture<span class=\"_ _1\"></span>Width() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y20c ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y20d ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> largeur <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>texture <span class=\"ls1e ws16\">du</span> sp<span class=\"_ _2\"></span>rite<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y20e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2dc ff4 fs2 fc4 sc0 ls2 ws14\">2.84</div><div class=\"t m3 x20 hd y2dc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2dc ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Text<span class=\"_ _2\"></span>ureHei<span class=\"_ _2\"></span>ght </div><div class=\"t m0 x6 hc y295 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getTextureH<span class=\"_ _1\"></span>eight() <span class=\"_ _2\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y131 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y213 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>hauteur de la texture <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> s<span class=\"_ _2\"></span>prite<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y214 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y238 ff4 fs2 fc4 sc0 ls2 ws14\">2.85</div><div class=\"t m3 x20 hd y238 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y238 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Sprit<span class=\"_ _2\"></span>eCent<span class=\"_ _2\"></span>erX </div><div class=\"t m0 x6 hc y4ab ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getSprit<span class=\"_ _1\"></span>eCenterX()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y4ac ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4ad ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>centre<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>x <span class=\"ls1e ws16\">du</span> spr<span class=\"_ _2\"></span>ite<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y4ae ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y4af ff4 fs2 fc4 sc0 ls2 ws14\">2.86</div><div class=\"t m3 x20 hd y4af ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y4af ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Sprit<span class=\"_ _2\"></span>eCent<span class=\"_ _2\"></span>erY </div><div class=\"t m0 x6 hc y4b0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getSprit<span class=\"_ _1\"></span>eCenterY() <span class=\"_ _4\"></span><span class=\"fc8\">c<span class=\"_ _1\"></span>onst </span></span></span></div><div class=\"t m0 x6 hc y23a ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4b1 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>centre<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>y <span class=\"ls1f ws17\">du</span> <span class=\"_ _2\"></span>sprit<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m0 x21 h9 y4b2 ff6 fs3 fc0 sc0 ls1b ws13\">52<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf34\" class=\"pf w0 h0\" data-page-no=\"34\"><div class=\"pc pc34 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAA8G7Xjk0QiAEoDOeBRSzdwV0cQDhwG2cQLB3CEWzcQLjytkgZWxc4JMf3dWlflZ8EUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAOPbmWCTeu9GGEUSIwAAsOKFUx4ICf6o1tpaswMAAOvxwxMAAGDLvPUBAABsmbc+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQffWcyBMAAACdSURBVAAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqL5SSim30yNJ8jrfl3lKnsfP4XL9Oe/fyzwlJgMAABjIF5skQChsugl5AAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">53<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">2.87</div><div class=\"t m3 x20 hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Sprit<span class=\"_ _2\"></span>eNumb<span class=\"_ _2\"></span>erSubI<span class=\"_ _2\"></span>mage<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">int <span class=\"_ _4\"></span><span class=\"fc0 ws14\">g<span class=\"_ _1\"></span>etSpriteNum<span class=\"_ _1\"></span>berSubImage(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0\">s<span class=\"_ _1\"></span>ubImag<span class=\"_ _1\"></span>eWidth) <span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1c2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> nombre <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>sous images <span class=\"ff3 ws14\">d’une<span class=\"_ _1\"></span></span> <span class=\"_ _2\"></span>sprite (sur <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ax<span class=\"_ _1\"></span>e<span class=\"ff2 ws2\"> horizontal). <span class=\"ff4\">subImageWidth </span>représente <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> taille <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’une<span class=\"ff2 ws2\"> so<span class=\"_ _2\"></span>us<span class=\"_ _2\"></span> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y3a2 ff2 fs2 fc0 sc0 ls2 ws2\">image <span class=\"_ _2\"></span>(32 pix<span class=\"_ _2\"></span>els)<span class=\"_ _2\"></span>. </div><div class=\"t m0 x1 he y4b5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2f0 ff4 fs2 fc4 sc0 ls2 ws14\">2.88</div><div class=\"t m3 x20 hd y2f0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2f0 ff4 fs2 fc4 sc0 ls2 ws14\">pla<span class=\"_ _2\"></span>ceMet<span class=\"_ _2\"></span>ting<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y484 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y484 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y484 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y485 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y486 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0 ws14\">placeMettin<span class=\"_ _1\"></span>g(<span class=\"fc8 ws2\">int </span><span class=\"ls35 ws29\">x,</span><span class=\"ws2\"> <span class=\"fc8\">int <span class=\"_ _2\"></span><span class=\"fc0 ls43 ws33\">y,<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>Main<span class=\"_ _1\"></span>Object <span class=\"fc8\">const </span>*<span class=\"_ _2\"></span>other<span class=\"_ _2\"></span>) </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y4b6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4b8 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff3 ws14\">s’il</span><span class=\"ff2\"> <span class=\"_ _2\"></span>y a collision avec <span class=\"ls2c ws21\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> autre objet, <span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span>no<span class=\"_ _2\"></span>n. </span></span></span></span></div><div class=\"t m0 x1 he y4b9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y48b ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y48b ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y48b ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y48c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y48d ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">bool <span class=\"fc0 ws14\">placeMetting(</span>in<span class=\"_ _1\"></span>t <span class=\"_ _2\"></span><span class=\"fc0 ls35 ws29\">x,<span class=\"ls2 ws2\"> <span class=\"fc8\">int <span class=\"_ _2\"></span><span class=\"fc0 ls43 ws33\">y,<span class=\"ls2 ws2\"> <span class=\"ff4 fc5 ws14\">std::shared_ptr</span>&lt;Ma<span class=\"_ _1\"></span>inObject&gt; <span class=\"fc8\">const </span>&amp;ot<span class=\"_ _2\"></span>her) </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y48e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4ba ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4bb ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff3 ws14\">s’il</span><span class=\"ff2\"> y <span class=\"_ _2\"></span>a collision avec <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> autre objet, <span class=\"ff4\">fa<span class=\"_ _2\"></span>ux <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> non. Ici <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’aut<span class=\"_ _1\"></span>re<span class=\"ff2 ws2\"> objet est <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>pointe<span class=\"_ _2\"></span>ur. </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y4bc ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y4bd ff4 fs2 fc4 sc0 ls2 ws14\">2.89</div><div class=\"t m3 x20 hd y4bd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y4bd ff4 fs2 fc4 sc0 ls2 ws14\">in<span class=\"_ _2\"></span>ViewRe<span class=\"_ _2\"></span>c<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y4be ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4bf ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">inViewRec(<span class=\"_ _1\"></span>sf::View <span class=\"fc8\">const </span>&amp;view, <span class=\"_ _2\"></span><span class=\"fc8\">bool <span class=\"fc0\">useTexRec = <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">true<span class=\"_ _2\"></span><span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></div><div class=\"t m0 x6 hc y4c0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4c1 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4c2 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>savoir<span class=\"_ _1\"></span> <span class=\"ls28 ws1e\">si</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’obet<span class=\"ff2 ws2\"> est dans <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> rectangl<span class=\"_ _1\"></span>e <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>v<span class=\"_ _1\"></span>ue. <span class=\"ls3a ws2c\">Si</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"ff4\">paramètre useTexRec<span class=\"_ _1\"></span> </span>est <span class=\"_ _2\"></span><span class=\"ff4 ws14\">vrai<span class=\"ff2 ws2\">, <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span><span class=\"ff4\">rectangle<span class=\"_ _1\"></span> <span class=\"ls21 ws19\">du</span> <span class=\"_ _2\"></span>sprite<span class=\"_ _2\"></span> </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y1a8 ff2 fs2 fc0 sc0 ls2 ws2\">sera <span class=\"_ _2\"></span>utilis<span class=\"_ _1\"></span>é pour <span class=\"_ _2\"></span>faire <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> test sinon <span class=\"_ _2\"></span>celui <span class=\"ls1e ws16\">du</span> <span class=\"ff4\">masque <span class=\"ls21 ws19\">de</span> <span class=\"_ _2\"></span>coll<span class=\"_ _1\"></span>ision <span class=\"ff2\">serait<span class=\"_ _1\"></span> u<span class=\"_ _2\"></span>tilis<span class=\"_ _2\"></span>é. </span></span></span></span></div><div class=\"t m0 x1 he y4c3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y4c4 ff4 fs2 fc4 sc0 ls2 ws14\">2.90</div><div class=\"t m3 x20 hd y4c4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y4c4 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Sprit<span class=\"_ _2\"></span>e </div><div class=\"t m0 x6 hc y4c5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc0\">sf::Sp<span class=\"_ _1\"></span>rite&amp; <span class=\"_ _4\"></span>g<span class=\"_ _1\"></span>etSprite() </span></div><div class=\"t m0 x6 hc y4c6 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc ycf ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> sprite <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y4c7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y4c8 ff4 fs2 fc4 sc0 ls2 ws14\">2.91</div><div class=\"t m3 x20 hd y4c8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y4c8 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tFrame<span class=\"_ _2\"></span>Limit<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y4c9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4ca ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setFrame(</span>floa<span class=\"_ _1\"></span>t <span class=\"fc0\">frameStart, </span>float <span class=\"_ _4\"></span><span class=\"fc0\">f<span class=\"_ _1\"></span>rameEnd <span class=\"ls2e\">= <span class=\"fcb ls5a\">-<span class=\"ls39 ws2b\">1.f</span></span></span>) </span></span></div><div class=\"t m0 x6 hc ya4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4cb ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y4cc ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’image<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> début <span class=\"ls24 ws1c\">et</span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> fin q<span class=\"_ _2\"></span>ui<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>servira à faire <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ani<span class=\"_ _1\"></span>mation<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">du</span> sprite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’ob<span class=\"_ _4\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y4cd ff4 fs2 fc4 sc0 ls1c\">3.</div><div class=\"t m3 xb hd y4cd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4cd ff4 fs2 fc4 sc0 ls2 ws2\">Autres fonctions <span class=\"_ _2\"></span><span class=\"ls21 ws19\">de<span class=\"ls2 ws2\"> Ma<span class=\"_ _2\"></span>inObj<span class=\"_ _2\"></span>ect<span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xa hc y4ce ff4 fs2 fc4 sc0 ls2 ws14\">3.1</div><div class=\"t m3 x1c hd y4ce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4ce ff4 fs2 fc4 sc0 ls2 ws14\">in<span class=\"_ _2\"></span>stance<span class=\"_ _2\"></span>Exis<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y4cf ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y4cf ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4cf ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y40c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4d0 ff4 fs2 fc5 sc0 ls2 ws14\">te<span class=\"_ _2\"></span>mplate<span class=\"_ _2\"></span><span class=\"ff2 fc0\">&lt;<span class=\"ff4 fc5 ws2\">cla<span class=\"_ _2\"></span>ss <span class=\"_ _9\"></span><span class=\"ff2 fc0 ls3e ws2e\">T&gt;<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y3e2 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _4\"></span><span class=\"fc0 ws14\">i<span class=\"_ _1\"></span>nstanceExist(<span class=\"ff4 fc5\">std::<span class=\"_ _1\"></span>shared_p<span class=\"_ _1\"></span>tr</span><span class=\"ws2\">&lt;T&gt; <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">&amp;<span class=\"_ _2\"></span>obj<span class=\"_ _4\"></span>) </span></span></span></span></div><div class=\"t m0 x1 he y367 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y32f ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y368 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y369 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff3\">si l’instanc<span class=\"_ _1\"></span>e<span class=\"ff2\"> existe, <span class=\"ff4\">faux <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf35\" class=\"pf w0 h0\" data-page-no=\"35\"><div class=\"pc pc35 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbsQ2DUAxF0e+IkooJmIC9kFiDCRiQTXAWiBQpRQT+54zwKt/CkZkNAACAol4mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAujCYoKSIMMLjbNt2HIcdAABQfXx3XZcRAACA1lpkphUAAACq8tcHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAOCZBhOUtK6rEbitaZr2fbcDAIDq43fLshiB2xrH0QgAAH8TmWkFAACAqvz1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAICeDCYoKTONQG8iwggAAB/OJHng/IUazvOc59kOAACqDwAAoCP++gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAHi3X8ckAEIBFEV5o6Md7GIA4YNtzCA4GsIILjYQ/vijuFpBPGd769uu6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9RSVB9QAAACPSURBVAEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAADAb6tvHfckyTltrZbkGO5+Xl67u1oticsAAAA+5AEwGzrc/uLhSQAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">54<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y13d ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y13d ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y13d ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y190 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y191 ff4 fs2 fc5 sc0 ls2 ws14\">te<span class=\"_ _2\"></span>mplate<span class=\"_ _2\"></span><span class=\"ff2 fc0\">&lt;<span class=\"ff4 fc5 ws2\">cla<span class=\"_ _2\"></span>ss <span class=\"_ _9\"></span><span class=\"ff2 fc0 ls3e ws2e\">T&gt;<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 he y4d1 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">instanceExist(<span class=\"_ _1\"></span>T <span class=\"_ _2\"></span><span class=\"fc8\">const<span class=\"_ _1\"></span> <span class=\"fc0\">*<span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j)<span class=\"_ _2\"></span> </span></span></span></div><div class=\"t m0 x6 hc y4d2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y109 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y10a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff3\">si l’instanc<span class=\"_ _1\"></span>e<span class=\"ff2\"> existe, <span class=\"ff4\">faux <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">3.2</div><div class=\"t m3 x1c hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">oper<span class=\"_ _2\"></span>ator<span class=\"_ _2\"></span>()<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y197 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y197 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y197 ff9 fs2 fc0 sc0 ls2 ws2\">Comparateur <span class=\"_ _2\"></span><span class=\"ls5c ws46\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>pos<span class=\"_ _2\"></span>ition </span></span></div><div class=\"t m0 x6 hc y198 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"_ _2\"></span><span class=\"ff2 fc0\">Compar<span class=\"_ _2\"></span>eX; </span></div><div class=\"t m0 x1 he y4d3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4d4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y4d5 ff2 fs2 fc0 sc0 ls2 ws2\">Foncteur qui <span class=\"_ _2\"></span>sert à trier les <span class=\"_ _2\"></span>objets par rapport <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> leur position <span class=\"ls56 ws43\">x.</span> </div><div class=\"t m0 x1 he y4d6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4d7 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">operator<span class=\"ff2 fc0 ls3c ws39\">()(</span>std::share<span class=\"_ _1\"></span>d_ptr<span class=\"ff2 fc0 ws2\">&lt;Ma<span class=\"_ _1\"></span>inObject&gt; <span class=\"fc8\">const <span class=\"_ _4\"></span><span class=\"fc0\">&amp;a, <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::sha<span class=\"_ _1\"></span>red_ptr<span class=\"ff2 fc0 ws2\">&lt;Ma<span class=\"_ _1\"></span>inObject&gt;<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;b) <span class=\"_ _2\"></span><span class=\"fc8 ws14\">const<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y4d8 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">opera<span class=\"_ _1\"></span>tor<span class=\"ff2 fc0 ws2\">()(MainObject<span class=\"_ _1\"></span> <span class=\"fc8\">const<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">*a, MainObject <span class=\"_ _2\"></span><span class=\"fc8\">const<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">*b) <span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y4d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4da ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y4db ff2 fs2 fc0 sc0 ls2 ws2\">Sert <span class=\"_ _2\"></span>à trier <span class=\"_ _2\"></span>les objets en fonction <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>leu<span class=\"_ _1\"></span>rs positions <span class=\"ls56 ws43\">x.<span class=\"_ _1\"></span></span> </div><div class=\"t m0 x1 he y4dc ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y4dd ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y4dd ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4dd ff9 fs2 fc0 sc0 ls2 ws2\">Comparateur <span class=\"_ _2\"></span><span class=\"ls5c ws46\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>pro<span class=\"_ _2\"></span>fonde<span class=\"_ _2\"></span>ur </span></span></div><div class=\"t m0 x6 hc y4de ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"_ _2\"></span><span class=\"ff2 fc0\">Compar<span class=\"_ _2\"></span>eDep<span class=\"_ _2\"></span>th; </span></div><div class=\"t m0 x1 he y4df ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4e0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4e1 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y4e2 ff2 fs2 fc0 sc0 ls2 ws2\">Foncteur qui <span class=\"_ _2\"></span>sert à trier les objets <span class=\"_ _2\"></span>par rapport à <span class=\"_ _2\"></span>leu<span class=\"_ _1\"></span>r profo<span class=\"_ _2\"></span>ndeur<span class=\"_ _2\"></span>. </div><div class=\"t m0 x6 hc y2cc ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">operator()<span class=\"ff2 fc0 ls5b\">(</span>std::sh<span class=\"_ _1\"></span>ared_ptr<span class=\"ff2 fc0 ws2\">&lt;M<span class=\"_ _1\"></span>ainObject&gt; <span class=\"fc8\">const <span class=\"_ _4\"></span><span class=\"fc0\">&amp;a<span class=\"_ _1\"></span>, <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">std::sha<span class=\"_ _1\"></span>red_ptr<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">&lt;MainObjec<span class=\"_ _1\"></span>t&gt; <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;b) <span class=\"_ _2\"></span><span class=\"fc8 ws14\">const<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y4e3 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4e4 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y4e5 ff2 fs2 fc0 sc0 ls2 ws2\">Sert <span class=\"_ _2\"></span>à trier les <span class=\"_ _2\"></span>objets<span class=\"_ _1\"></span> <span class=\"ls29 ws1f\">en</span> fonction <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> leurs profo<span class=\"_ _2\"></span>ndeu<span class=\"_ _2\"></span>rs. </span></span></div><div class=\"t m2 xa hc y4e6 ff4 fs2 fc4 sc0 ls2 ws14\">3.3</div><div class=\"t m3 x1c hd y4e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4e6 ff4 fs2 fc4 sc0 ls2 ws2\">sor<span class=\"_ _2\"></span>tObjA<span class=\"_ _2\"></span>rrayB<span class=\"_ _2\"></span>yX </div><div class=\"t m0 x6 hc y4e7 ff4 fs2 fc5 sc0 ls2 ws14\">template<span class=\"ff2 fc0 ls2e\">&lt;</span><span class=\"ws2\">class <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y4e8 ff2 fs2 fc8 sc0 ls2 ws2\">voi<span class=\"_ _2\"></span>d <span class=\"_ _b\"> </span><span class=\"fc0 ws14\">sortOb<span class=\"_ _2\"></span>jArr<span class=\"_ _2\"></span>ayByX<span class=\"_ _2\"></span>(<span class=\"ff4 fc5\">std:<span class=\"_ _2\"></span>:list<span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">std:<span class=\"_ _2\"></span>:shar<span class=\"_ _2\"></span>ed_pt<span class=\"_ _2\"></span>r<span class=\"ff2 fc0 ws2\">&lt;T&gt;&gt;<span class=\"_ _2\"></span> <span class=\"_ _b\"> </span>&amp;v)<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x1 he y4e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4ea ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4eb ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4ec ff2 fs2 fc0 sc0 ls2 ws2\">Trie <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> tableau (<span class=\"ff4 fc5 ws14\">std::list</span>) <span class=\"ff3 ws14\">d’objets</span> <span class=\"ls29 ws1f\">en</span> <span class=\"_ _4\"></span>fo<span class=\"_ _1\"></span>nction <span class=\"ls1e ws16\">de</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>posi<span class=\"_ _1\"></span>tion <span class=\"ls56 ws43\">x.</span> </span></span></div><div class=\"t m0 x1 he y4ed ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y4ee ff4 fs2 fc4 sc0 ls2 ws14\">3.4</div><div class=\"t m3 x1c hd y4ee ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4ee ff4 fs2 fc4 sc0 ls2 ws2\">sor<span class=\"_ _2\"></span>tObjA<span class=\"_ _2\"></span>rrayB<span class=\"_ _2\"></span>yDept<span class=\"_ _2\"></span>h </div><div class=\"t m0 x6 hc y4ef ff4 fs2 fc5 sc0 ls2 ws14\">template<span class=\"ff2 fc0 ls2e\">&lt;</span><span class=\"ws2\">class <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y4f0 ff2 fs2 fc8 sc0 ls2 ws2\">voi<span class=\"_ _2\"></span>d <span class=\"_ _b\"> </span><span class=\"fc0 ws14\">sortObj<span class=\"_ _2\"></span>Arr<span class=\"_ _2\"></span>ayByDe<span class=\"_ _2\"></span>pth(<span class=\"ff4 fc5\">st<span class=\"_ _2\"></span>d::l<span class=\"_ _2\"></span>ist<span class=\"ff2 fc0\">&lt;<span class=\"_ _2\"></span><span class=\"ff4 fc5\">std::<span class=\"_ _2\"></span>share<span class=\"_ _2\"></span>d_ptr<span class=\"ff2 fc0 ws2\">&lt;<span class=\"_ _2\"></span>T&gt;&gt; <span class=\"_ _b\"> </span>&amp;v<span class=\"_ _2\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 he y4f1 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y309 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4f2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y30a ff2 fs2 fc0 sc0 ls2 ws2\">Trie <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> tableau (<span class=\"ff4 fc5 ws14\">std::list</span>) <span class=\"ff3 ws14\">d’objets</span><span class=\"ls3b\"> <span class=\"ls24 ws1c\">en</span></span> fonction <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>profon<span class=\"_ _2\"></span>deur. </span></span></span></span></div><div class=\"t m2 xa hc y4f3 ff4 fs2 fc4 sc0 ls2 ws14\">3.5</div><div class=\"t m3 x1c hd y4f3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4f3 ff4 fs2 fc4 sc0 ls2 ws14\">oper<span class=\"_ _2\"></span>ator&lt;<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf36\" class=\"pf w0 h0\" data-page-no=\"36\"><div class=\"pc pc36 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbMUoDQRiGYf8wUXBhCSzewSNYeBnP4D08g4exSZPaxmJrEZsVQgj7WwghhTZ2M/s8J5j9mGLfYiIzLwAAAGjUygQAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4TAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6TAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6jMBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAM0oJuDcw9PL53SwAwBA1Tbd5fPjvR34EZlpBU7cBwCARn70I4yA6gMAAGifd30AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAgP8rC//+vu/nea73/OM4DsPgHgMAAH+JzFzy90/TVPX5u66LCPcYAABQfQAAAEvkXR8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAA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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">55<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">operator<span class=\"ff2 fc0 ls2e ws26\">&lt;(<span class=\"_ _1\"></span><span class=\"fc8 ls2 ws2\">const <span class=\"_ _2\"></span><span class=\"fc0\">MainObject<span class=\"_ _1\"></span> *a, <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">MainObject &amp;b); </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y1c0 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">operat<span class=\"_ _1\"></span>or<span class=\"ff2 fc0 ls2e ws26\">&lt;(<span class=\"fc8 ls2 ws2\">const <span class=\"fc0\">MainObject &amp;b, <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"fc0\">MainObject *<span class=\"_ _4\"></span>a);<span class=\"_ _2\"></span> </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y1e2 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">operator<span class=\"ff2 fc0 ls2e ws26\">&lt;(<span class=\"_ _1\"></span></span>std::shared<span class=\"_ _1\"></span>_ptr<span class=\"ff2 fc0 ws2\">&lt;MainObj<span class=\"_ _1\"></span>ect&gt; <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"fc0\">&amp;a, <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">MainObject<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;b<span class=\"_ _4\"></span>) </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">operator<span class=\"ff2 fc0 ls2e ws26\">&lt;(<span class=\"fc8 ls2 ws2\">co<span class=\"_ _1\"></span>nst <span class=\"_ _4\"></span><span class=\"fc0\">Ma<span class=\"_ _1\"></span>inObject<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;b, <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::shared_p<span class=\"_ _1\"></span>tr<span class=\"ff2 fc0 ws2\">&lt;MainObject&gt;<span class=\"_ _1\"></span> <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;a<span class=\"_ _2\"></span>) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2 ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls1a ws2\"> <span class=\"ls1d ws15\">la</span><span class=\"ls2\"> position <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’objet<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> A est inférieur <span class=\"_ _2\"></span>à celui <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls5d ws47\">B,</span> <span class=\"ff4\">fa<span class=\"_ _2\"></span>ux<span class=\"_ _1\"></span> <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span>no<span class=\"_ _2\"></span>n.<span class=\"_ _2\"></span> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y4f4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y4f5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hb y4f6 ff7 fs3 fc3 sc0 ls2 ws2\">Les formes pour <span class=\"_ _2\"></span>les mas<span class=\"_ _2\"></span>ques coll<span class=\"_ _2\"></span>isio<span class=\"_ _2\"></span>ns<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hb y4f7 ff7 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4f8 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/F<span class=\"_ _2\"></span>orm.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m2 xa hc y4f9 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y4f9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4f9 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Rectangle<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 hc y4fa ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">Rectangle;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y4fb ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4fc ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">le</span> masque <span class=\"ls1e ws16\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> collision<span class=\"_ _1\"></span> rectangle. Ces membres <span class=\"ff4\">m_left, m_top, m_right, m_bottom </span>permette<span class=\"_ _1\"></span>nt <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"ls1d\">la </span></span></span></span></span></div><div class=\"t m0 x6 he y384 ff2 fs2 fc0 sc0 ls2 ws2\">taille du masque.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y4fd ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y4fd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4fd ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Circle </div><div class=\"t m0 x6 hc y4fe ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">Circle;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y4ff ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y2a ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">le</span> masque <span class=\"ls1e ws16\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> collision ce<span class=\"_ _1\"></span>rcle. Ces membres <span class=\"ff4\">m_x, m_y, m_raduis </span>permettent <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>définir <span class=\"ls1d ws15\">la</span> position et le </span></span></div><div class=\"t m0 x6 he y242 ff2 fs2 fc0 sc0 ls2 ws2\">rayon du cercle.<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 he y500 ff2 fs2 fc0 sc0 ls2 ws2\">Cir<span class=\"_ _2\"></span>cle(<span class=\"_ _2\"></span>) </div><div class=\"t m0 x6 hc y245 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y501 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"_ _2\"></span>par dé<span class=\"_ _2\"></span>fau<span class=\"_ _2\"></span>t. </div><div class=\"t m0 x1 he y157 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he yef ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y502 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hb y503 ff7 fs3 fc3 sc0 ls2 ws2\">Les Classes Parentes <span class=\"_ _4\"></span>de Main<span class=\"_ _2\"></span>Obj<span class=\"_ _2\"></span>ect<span class=\"_ _2\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 hb y504 ff7 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y505 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y505 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y505 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>DepthOb<span class=\"_ _1\"></span>ject </div><div class=\"t m0 x6 hc y506 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">DepthObject;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y507 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/Deph<span class=\"_ _2\"></span>Obje<span class=\"_ _2\"></span>ct.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc y508 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y509 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y3b8 ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"_ _2\"></span>offre des mé<span class=\"_ _2\"></span>thod<span class=\"_ _1\"></span>es pour <span class=\"_ _2\"></span>gérer<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>profondeu<span class=\"_ _1\"></span>r <span class=\"ff3 ws14\">d’affichage</span> des objets <span class=\"_ _2\"></span>dans une scè<span class=\"_ _2\"></span>ne. </div><div class=\"t m2 xa hc y50a ff4 fs2 fc4 sc0 ls2 ws14\">1.1</div><div class=\"t m3 x1c hd y50a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y50a ff4 fs2 fc4 sc0 ls2 ws2\">enum <span class=\"_ _4\"></span>Depth </div><div class=\"t m0 x6 hc y18d ff4 fs2 fc5 sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">Depth; </span></div><div class=\"t m0 x6 hc y18f ff4 fs2 fc0 sc0 ls2 ws2\">En<span class=\"_ _2\"></span>umérat<span class=\"_ _2\"></span>eur </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf37\" class=\"pf w0 h0\" data-page-no=\"37\"><div class=\"pc pc37 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVIaiH/EAAAkmSURBVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAADf0qiP9Wg7O+ZRVI43ncUpSSfd27RfPPbD+o8vvesqSQ8hWO1Ntjzfn5UdAAD+WrvV3M0HduBTwg+F0wtrv3ic/X4mOgAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">56<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x2f he y50b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y50c ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y50d ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"_ _2\"></span>offre des mé<span class=\"_ _2\"></span>thod<span class=\"_ _1\"></span>es pour <span class=\"_ _2\"></span>gérer<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>destruction<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’un</span> obje<span class=\"_ _2\"></span>t. </div><div class=\"t m0 x1 he y50e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y4e8 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y4e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4e8 ff4 fs2 fc4 sc0 ls2 ws14\">Des<span class=\"_ _2\"></span>truct<span class=\"_ _2\"></span>ible<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y50f ff2 fs2 fc0 sc0 ls2 ws2\">De<span class=\"_ _2\"></span>struct<span class=\"_ _2\"></span>ible<span class=\"_ _2\"></span>() </div><div class=\"t m0 x6 hc y510 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y511 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"_ _2\"></span>par dé<span class=\"_ _2\"></span>fau<span class=\"_ _2\"></span>t. </div><div class=\"t m2 xa hc y15e ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y15e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y15e ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tDest<span class=\"_ _2\"></span>royed </div><div class=\"t m0 x6 hc y512 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">setDestroy<span class=\"_ _1\"></span>ed() </span></span></div><div class=\"t m0 x6 hc y513 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y514 ff2 fs2 fc0 sc0 ls2 ws2\">Enclenche <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>destructio<span class=\"_ _1\"></span>n <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>n<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>objet. </span></span></div><div class=\"t m0 x1 he y13c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y4f3 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y4f3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4f3 ff4 fs2 fc4 sc0 ls2 ws14\">isD<span class=\"_ _2\"></span>estroy<span class=\"_ _2\"></span>ed<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x6 y515 wc h2a\"><div class=\"t m0 x0 he y516 ff2 fs2 fc0 sc0 ls2 ws2\">VER<span class=\"_ _2\"></span>Y_BIG<span class=\"_ _2\"></span>_DEP<span class=\"_ _2\"></span>TH </div><div class=\"t m0 x0 he y517 ff2 fs2 fc0 sc0 ls2 ws2\">BIG<span class=\"_ _2\"></span>_DEPT<span class=\"_ _2\"></span>H </div><div class=\"t m0 x0 h1a y518 ff2 fs9 fc0 sc0 ls2 ws2\">NOR<span class=\"_ _2\"></span>MAL_<span class=\"_ _2\"></span>DEPT<span class=\"_ _2\"></span>H </div><div class=\"t m0 x0 he y519 ff2 fs2 fc0 sc0 ls2 ws2\">SMA<span class=\"_ _2\"></span>LL_D<span class=\"_ _2\"></span>EPTH </div><div class=\"t m0 x0 he y51a ff2 fs2 fc0 sc0 ls2 ws2\">VER<span class=\"_ _2\"></span>Y_SM<span class=\"_ _2\"></span>ALL_D<span class=\"_ _2\"></span>EPTH </div></div><div class=\"c x2b y515 wd h2a\"><div class=\"t m0 x0 he y516 ff2 fs2 fc0 sc0 ls2 ws2\">Très <span class=\"_ _2\"></span>Grande pro<span class=\"_ _2\"></span>fon<span class=\"_ _2\"></span>deur </div><div class=\"t m0 x0 he y51b ff2 fs2 fc0 sc0 ls2 ws2\">Gra<span class=\"_ _2\"></span>nde <span class=\"_ _b\"> </span>p<span class=\"_ _2\"></span>rofon<span class=\"_ _2\"></span>deur </div><div class=\"t m0 x0 h1a y51c ff2 fs9 fc0 sc0 ls2 ws2\">Pro<span class=\"_ _2\"></span>fon<span class=\"_ _2\"></span>deur<span class=\"_ _2\"></span> <span class=\"_ _e\"> </span>nor<span class=\"_ _2\"></span>mal </div><div class=\"t m0 x0 he y51d ff2 fs2 fc0 sc0 ls2 ws2\">Petite profondeur<span class=\"_ _1\"></span> </div><div class=\"t m0 x0 he y3ea ff2 fs2 fc0 sc0 ls2 ws2\">Très pe<span class=\"_ _2\"></span>tite prof<span class=\"_ _2\"></span>onde<span class=\"_ _2\"></span>ur </div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 hc y51f ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x0 he y520 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>niv<span class=\"_ _1\"></span>eau <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> profondeur <span class=\"ff3 ws14\">d’un</span> <span class=\"_ _2\"></span>obje<span class=\"_ _2\"></span>t. </span></span></div><div class=\"t m0 x0 he y521 ff2 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y522 ff4 fs2 fc4 sc0 ls2 ws2\">De<span class=\"_ _2\"></span>pthObj<span class=\"_ _2\"></span>ect </div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 he y523 ff2 fs2 fc0 sc0 ls2 ws14\">DepthObject(</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x30 he y524 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0\">Depth)<span class=\"_ _1\"></span> </span></div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 hc y525 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y19a ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 he y526 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur pour <span class=\"_ _2\"></span>définir une <span class=\"_ _2\"></span>profon<span class=\"_ _2\"></span>deur.<span class=\"_ _2\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y527 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tDept<span class=\"_ _2\"></span>h<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 hc y528 ff4 fs2 fc5 sc0 ls2 ws2\">virtual </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1c he y529 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">s<span class=\"_ _1\"></span>etDepth(<span class=\"fc8 ws2\">int <span class=\"fc0\">v<span class=\"_ _2\"></span>al)<span class=\"_ _2\"></span> </span></span></span></div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 he y52a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 hc y52b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y52c ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 hc y52d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 he y52e ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> profondeur <span class=\"_ _2\"></span>de <span class=\"ff3 ws14\">l’objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y52f ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Dept<span class=\"_ _2\"></span>h<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 hc y530 ff4 fs2 fc5 sc0 ls2 ws2\">virtual </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1c he y531 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">getDepth() </span><span class=\"ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 he y532 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 h18 y533 ff4 fs9 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Sour<span class=\"_ _2\"></span>ce</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 h18 y534 ff4 fs9 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 hc y535 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 hc y536 ff4 fs2 fca sc0 ls2 ws2\">Retourne </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x28 he y537 ff2 fs2 fc0 sc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>profondeu<span class=\"_ _1\"></span>r <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obj<span class=\"_ _2\"></span>et.<span class=\"ff2 ws2\"> </span></span></span></span></span></div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 he y538 ff2 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y539 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Destructible </div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 hc y53a ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d he y53b ff2 fs2 fc0 sc0 ls2 ws2\">Destructible;<span class=\"_ _1\"></span> </div></div><div class=\"c x23 y51e we h2b\"><div class=\"t m0 x0 hc y53c ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/Dest<span class=\"_ _2\"></span>ructi<span class=\"_ _2\"></span>ble.<span class=\"_ _2\"></span>h<span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf38\" class=\"pf w0 h0\" data-page-no=\"38\"><div class=\"pc pc38 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">57<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">bool <span class=\"fc0\">isDestroyed() </span><span class=\"ws14\">c<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’état<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c3 ff4 fs2 fc4 sc0 ls1c\">3.</div><div class=\"t m3 xb hd y1c3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c3 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Visibili<span class=\"_ _1\"></span>ty </div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">Visibility; </span></div><div class=\"t m0 x6 hc y3eb ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/Visi<span class=\"_ _2\"></span>bili<span class=\"_ _2\"></span>ty.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc y1e9 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1eb ff2 fs2 fc0 sc0 ls2 ws2\">Class<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>qui offre <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>es méthod<span class=\"_ _1\"></span>es pour <span class=\"_ _2\"></span>gérer <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>vis<span class=\"_ _1\"></span>ibilité <span class=\"ff3 ws14\">d’un</span> objet<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y1c9 ff4 fs2 fc4 sc0 ls2 ws14\">3.1</div><div class=\"t m3 x1c hd y1c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c9 ff4 fs2 fc4 sc0 ls2 ws14\">Vis<span class=\"_ _2\"></span>ibil<span class=\"_ _2\"></span>ity<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y371 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ed ff4 fs2 fc5 sc0 ls2 ws2\">explicit <span class=\"_ _2\"></span><span class=\"ff2 fc0 ws14\">Visibility(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">defaultVisibility<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>= <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">true<span class=\"ff2 fc0 ls3c ws2\">) </span></span></span></span></span></div><div class=\"t m0 x6 hc y1cb ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y53d ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d\">la <span class=\"ls2\">clas<span class=\"_ _2\"></span>se. </span></span></div><div class=\"t m2 xa hc y1cd ff4 fs2 fc4 sc0 ls2 ws14\">3.2</div><div class=\"t m3 x1c hd y1cd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1cd ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tVisib<span class=\"_ _2\"></span>le<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y53e ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">s<span class=\"_ _1\"></span>etVisible(<span class=\"fc8 ws2\">bool <span class=\"fc0\">value<span class=\"_ _4\"></span>)<span class=\"_ _1\"></span> </span></span></span></div><div class=\"t m0 x6 hc ybd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y53f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y540 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> visibilité <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y22a ff4 fs2 fc4 sc0 ls2 ws14\">3.3</div><div class=\"t m3 x1c hd y22a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y22a ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Visib<span class=\"_ _2\"></span>le </div><div class=\"t m0 x6 he y22b ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _4\"></span><span class=\"fc0\">getVisible()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const<span class=\"_ _1\"></span> </span></span></div><div class=\"t m0 x6 hc y22c ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y12a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’état<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1f4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc yce ff4 fs2 fc4 sc0 ls1c\">4.</div><div class=\"t m3 xb hd yce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc yce ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Health </div><div class=\"t m0 x6 hc y1f5 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">Health;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y1f6 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/Hea<span class=\"_ _2\"></span>lth.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc y1f7 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y504 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y541 ff2 fs2 fc0 sc0 ls2 ws2\">Class<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>qui offre <span class=\"_ _2\"></span>des méthodes pour gérer <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>santé<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>un<span class=\"ff2 ws2\"> objet<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y542 ff4 fs2 fc4 sc0 ls2 ws14\">4.1</div><div class=\"t m3 x1c hd y542 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y542 ff4 fs2 fc4 sc0 ls2 ws14\">Hea<span class=\"_ _2\"></span>lth<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y543 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y543 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y543 ff9 fs2 fc0 sc0 ls2 ws2\">Prémière <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x6 he y544 ff2 fs2 fc0 sc0 ls2 ws14\">Health(<span class=\"fc8 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0\">health<span class=\"_ _2\"></span>) </span></span></div><div class=\"t m0 x6 hc y545 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y546 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> la classe, prend en paramètre <span class=\"ls1d ws15\">la</span> santé <span class=\"_ _2\"></span>à a<span class=\"_ _1\"></span>ttribuer à <span class=\"ff3 ws14\">l’objet.</span> Ici <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> valeur maximale<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> santé <span class=\"_ _2\"></span>est éga<span class=\"_ _1\"></span>le <span class=\"ls29\">à </span></span></span></span></span></div><div class=\"t m0 x6 he y4f2 ff2 fs2 fc0 sc0 ls2 ws2\">la santé définie.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa h15 y547 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y547 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y547 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf39\" class=\"pf w0 h0\" data-page-no=\"39\"><div class=\"pc pc39 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB27NDHYKiOIDD7mZmU7yBa5IkaYqkqwqbLngG1cxUm2i8gcRGVvT7CARJOZIgaILrfl86p53z3ym/HQAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAABkWD7j94+iKNXnT5IkjmPvGAAA+MRfHwAAwD+LQgimAAAA8K/89QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPkLBxwEAAACESURBVAAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAL8p/1rMO8vRbpjL7buLyuRQrfdql35ze1u3X/viqXGeVeubEEztzWB6vN4f5gAAkGrlUmE1bpkD3xJ+KJyew9QyJDoPWAcAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">58<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws14\">Health(<span class=\"fc8 ws2\">int <span class=\"_ _2\"></span><span class=\"fc0\">heal<span class=\"_ _1\"></span>th, <span class=\"fc8\">int </span>m<span class=\"_ _2\"></span>axHeal<span class=\"_ _2\"></span>th) </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2bd ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> clas<span class=\"_ _1\"></span>se prend <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">en<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> paramètre <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>santé à attribuer à <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obj<span class=\"_ _1\"></span>et<span class=\"ff2 ws2\"> <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> valeur m<span class=\"_ _2\"></span>axim<span class=\"_ _2\"></span>ale. </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">4.2</div><div class=\"t m3 x1c hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tHeal<span class=\"_ _2\"></span>th<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y34f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setHealth(</span>int <span class=\"fc0\">v<span class=\"_ _2\"></span>al)<span class=\"_ _4\"></span> </span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>sa<span class=\"_ _1\"></span>nté <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">4.3</div><div class=\"t m3 x1c hd y221 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tMaxHe<span class=\"_ _2\"></span>alth<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ec ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setMax<span class=\"_ _1\"></span>Health(<span class=\"fc8 ws2\">int<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">va<span class=\"_ _2\"></span>l) </span></span></span></span></div><div class=\"t m0 x1 he y222 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ed ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y548 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>sa<span class=\"_ _1\"></span>nté maximale (la <span class=\"_ _2\"></span>limit<span class=\"_ _1\"></span>e à <span class=\"_ _2\"></span><span class=\"ls5e ws48\">ne<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>pas dépasser) <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y353 ff4 fs2 fc4 sc0 ls2 ws14\">4.4</div><div class=\"t m3 x1c hd y353 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y353 ff4 fs2 fc4 sc0 ls2 ws14\">add<span class=\"_ _2\"></span>Healt<span class=\"_ _2\"></span>h<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y225 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">addHeal<span class=\"_ _1\"></span>th(<span class=\"fc8 ws2\">int <span class=\"fc0\">val = </span></span><span class=\"fcb\">1<span class=\"_ _4\"></span><span class=\"fc0 ws2\">) </span></span></span></span></div><div class=\"t m0 x1 he y3ed ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y26 ff2 fs2 fc0 sc0 ls2 ws2\">Ajoute <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>anté à <span class=\"ff3 ws14\">l’objet.</span> Peut servir <span class=\"_ _2\"></span>auss<span class=\"_ _1\"></span>i à <span class=\"_ _4\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> retancher <span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span><span class=\"ls2a ws20\">on<span class=\"ls2 ws2\"> met <span class=\"_ _2\"></span>une valeur né<span class=\"_ _2\"></span>gative<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y290 ff4 fs2 fc4 sc0 ls2 ws14\">4.5</div><div class=\"t m3 x1c hd y290 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y290 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Heal<span class=\"_ _2\"></span>th<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y549 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y291 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">int <span class=\"fc0\">getHealth() </span><span class=\"ws14\">co<span class=\"_ _2\"></span>ns<span class=\"_ _4\"></span>t<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x1 he y54a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y54b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y54c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22c ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>santé <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y294 ff4 fs2 fc4 sc0 ls2 ws14\">4.6</div><div class=\"t m3 x1c hd y294 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y294 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>MaxHe<span class=\"_ _2\"></span>alth<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y54d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y54e ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">int <span class=\"fc0\">getMaxHealth() </span><span class=\"ws14\">c<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x1 he y54f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y550 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1d5 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>santé maximale (la limite <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls5e ws48\">ne<span class=\"ls2 ws2\"> pas dépasser) <span class=\"ls1e ws16\">de</span><span class=\"ls1a\"> </span><span class=\"ff3 ws14\">l<span class=\"_ _2\"></span>’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y551 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y552 ff4 fs2 fc4 sc0 ls1c\">5.</div><div class=\"t m3 xb hd y552 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y552 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>HurtEffect<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 hc y541 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">HurtEffect;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y451 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/Hurt<span class=\"_ _2\"></span>Effe<span class=\"_ _2\"></span>ct.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x6 hc yb8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y553 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y554 ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui offre de<span class=\"_ _2\"></span>s méthodes<span class=\"_ _1\"></span> pour <span class=\"_ _2\"></span>faire un effet invulnéra<span class=\"_ _1\"></span>bilité sur <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>objet. C&apos;est-à<span class=\"_ _1\"></span>-dire faire clignoter <span class=\"ff3\">l’objet pendant </span></div><div class=\"t m0 x6 he y545 ff2 fs2 fc0 sc0 ls2 ws2\">un certain temps (e.g.<span class=\"_ _1\"></span> quand le joueu<span class=\"_ _1\"></span>r est attaqué <span class=\"_ _1\"></span>par u<span class=\"_ _1\"></span>n ennemi il devie<span class=\"_ _1\"></span>nt invunérable en clignotan<span class=\"_ _1\"></span>t pendant une </div><div class=\"t m0 x6 he y555 ff2 fs2 fc0 sc0 ls2 ws2\">durrée limitée).<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y4f2 ff4 fs2 fc4 sc0 ls2 ws14\">5.1</div><div class=\"t m3 x1c hd y4f2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4f2 ff4 fs2 fc4 sc0 ls2 ws14\">Hur<span class=\"_ _2\"></span>tEffe<span class=\"_ _2\"></span>ct<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y2d7 ff2 fs2 fc0 sc0 ls2 ws2\">Hur<span class=\"_ _2\"></span>tEffe<span class=\"_ _2\"></span>ct(s<span class=\"_ _2\"></span>f::Spr<span class=\"_ _4\"></span>ite <span class=\"_ _a\"></span>&amp;sprPar<span class=\"_ _2\"></span>ent)<span class=\"_ _2\"></span> <span class=\"_ _a\"></span>:<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y556 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3a\" class=\"pf w0 h0\" data-page-no=\"3a\"><div class=\"pc pc3a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzZsRGAMAwEQcRQiPpvSqU8FZCQIXYrsH+c3LiSHAAAACx1mgAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPWZAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8JAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAeOH6+f2r6tPnn5nu9o4BAIAn/voAAAA2qyRWAAAA2MpfHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1Xe3X4cqCINhGEYXRAYW70CGaclks5jsVouDdYPXYBURq2AUdwemCZot3ocG08pvWrArKJyTvq++7QEAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAOOYhl8AAACESURBVED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAA+KZGfaxH29kxj6JyvOksTkk66d6m/eKxH9Z/fOldV0l6CMFqb7Ll+f6s7AAA8NfareZuPrADnxJ+KJxeWOwyJOnkbWgAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">59<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> la classe prend <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> paramètre <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> sprite <span class=\"_ _2\"></span>su<span class=\"_ _1\"></span>r <span class=\"_ _2\"></span>lequel<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’eff<span class=\"_ _1\"></span>et<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>invun<span class=\"_ _1\"></span>érabilité sera é<span class=\"_ _2\"></span>ffec<span class=\"_ _2\"></span>tué. </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c0 ff4 fs2 fc4 sc0 ls2 ws14\">5.2</div><div class=\"t m3 x1c hd y1c0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c0 ff4 fs2 fc4 sc0 ls2 ws14\">hur<span class=\"_ _2\"></span>tSte<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y2bd ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">hurtStep(<span class=\"fc8 ws2\">floa<span class=\"_ _1\"></span>t <span class=\"_ _2\"></span>const<span class=\"_ _1\"></span> <span class=\"fc0\">&amp;<span class=\"_ _2\"></span>DELTA<span class=\"_ _2\"></span>_TIME<span class=\"_ _2\"></span>) </span></span></span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y331 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>faire <span class=\"ff3 ws14\">l’animation</span><span class=\"ls1a\"> </span><span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>invuné<span class=\"_ _2\"></span>rabi<span class=\"_ _2\"></span>lté.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">5.3</div><div class=\"t m3 x1c hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tIsH<span class=\"_ _2\"></span>urt<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setIsHurt(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"fc0\">durration <span class=\"_ _2\"></span>=<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fcb ws14\">100.<span class=\"_ _2\"></span>f<span class=\"fc0 ws2\">) </span></span></span></span></span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> durrée <span class=\"_ _2\"></span>(en milliseconde) de <span class=\"ff3 ws14\">l’invunérabilité</span> <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y557 ff4 fs2 fc4 sc0 ls2 ws14\">5.4</div><div class=\"t m3 x1c hd y557 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y557 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>IsHurt<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y548 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _4\"></span><span class=\"fc0\">getIsHu<span class=\"_ _1\"></span>rt() <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></div><div class=\"t m0 x6 hc y353 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff3\">si l’objet<span class=\"_ _1\"></span><span class=\"ff2\"> e<span class=\"_ _2\"></span>st<span class=\"_ _1\"></span> invunérable, <span class=\"_ _2\"></span><span class=\"ff4\">faux<span class=\"_ _1\"></span> <span class=\"ff2 ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> non<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y3ed ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f1 ff4 fs2 fc4 sc0 ls1c\">6.</div><div class=\"t m3 xb hd y1f1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1f1 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>ScorePoin<span class=\"_ _1\"></span>t </div><div class=\"t m0 x6 hc ybd ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">ScorePoint;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y1d0 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/Sco<span class=\"_ _2\"></span>rePoi<span class=\"_ _2\"></span>nt.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc ybf ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y292 ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui offre de<span class=\"_ _2\"></span>s méthodes<span class=\"_ _1\"></span> pour <span class=\"_ _2\"></span>gére<span class=\"_ _1\"></span>r <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> score à attribuer à <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> objet <span class=\"_ _2\"></span>(e.g. chaque ennemi possède un point </span></span></span></span></div><div class=\"t m0 x6 he y558 ff3 fs2 fc0 sc0 ls2 ws2\">particulier lors de sa c<span class=\"_ _1\"></span>réation qu’on ajout<span class=\"_ _1\"></span>e au score glob<span class=\"_ _1\"></span>al du joueur quand il<span class=\"_ _1\"></span> est vaincu).<span class=\"_ _9\"></span><span class=\"ff2\"> </span></div><div class=\"t m2 xa hc y559 ff4 fs2 fc4 sc0 ls2 ws14\">6.1</div><div class=\"t m3 x1c hd y559 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y559 ff4 fs2 fc4 sc0 ls2 ws14\">Sco<span class=\"_ _2\"></span>rePoin<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y434 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y55a ff4 fs2 fcd sc0 ls2 ws2\">explicit <span class=\"_ _2\"></span><span class=\"ff2 fc0 ws14\">Sco<span class=\"_ _1\"></span>rePoint(<span class=\"fc8 ws2\">int <span class=\"fc0\">point = <span class=\"_ _2\"></span><span class=\"fcb ws14\">0<span class=\"fc0 ws2\">) </span></span></span></span></span></div><div class=\"t m0 x1 he y55b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y55c ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y343 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> clas<span class=\"_ _1\"></span>se, pren<span class=\"_ _2\"></span>d<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> param<span class=\"_ _1\"></span>ètre <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>point à attrib<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>er à <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>objet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y298 ff4 fs2 fc4 sc0 ls2 ws14\">6.2</div><div class=\"t m3 x1c hd y298 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y298 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tScor<span class=\"_ _2\"></span>ePoint<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y55d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y299 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setScor<span class=\"_ _1\"></span>ePoint(<span class=\"fc8 ws2\">i<span class=\"_ _1\"></span>nt <span class=\"fc0\">p<span class=\"_ _2\"></span>oin<span class=\"_ _2\"></span>t) </span></span></span></span></div><div class=\"t m0 x1 he y24c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y24d ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y24f ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>poi<span class=\"_ _1\"></span>nt <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m0 x1 he y55e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y40b ff4 fs2 fc4 sc0 ls2 ws14\">6.3</div><div class=\"t m3 x1c hd y40b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y40b ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Scor<span class=\"_ _2\"></span>ePoint<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y253 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">int <span class=\"fc0\">getScorePoint() </span><span class=\"ws14\">co<span class=\"_ _4\"></span>nst<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x1 he y55f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y560 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y561 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y562 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> point attribué <span class=\"ls5f\">à <span class=\"_ _2\"></span><span class=\"ff3 ls2 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></div><div class=\"t m2 xa hc y563 ff4 fs2 fc4 sc0 ls1c\">7.</div><div class=\"t m3 xb hd y563 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y563 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _2\"></span>Ste<span class=\"_ _4\"></span>p<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3b\" class=\"pf w0 h0\" data-page-no=\"3b\"><div class=\"pc pc3b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzawQ3AIAwEwThKIe6/KZdyqSD5AzMVwInPSlSSCwAAgE3dJgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ZkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAv57D719VS59/ZrrbOwYAAD6rJ4kVAAAAduWHJwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">60<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"_ _2\"></span><span class=\"ff2 fc0\">Step; </span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c0 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/Step<span class=\"_ _2\"></span>.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x6 he y2bd ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui offre de<span class=\"_ _2\"></span>s méthodes<span class=\"_ _1\"></span> pour gérer les <span class=\"_ _2\"></span>diff<span class=\"_ _1\"></span>erents étapes <span class=\"ff3 ws14\">d’un</span> objet (e<span class=\"_ _2\"></span>.g.<span class=\"_ _1\"></span> pour faire <span class=\"_ _2\"></span>décole<span class=\"_ _1\"></span>r une <span class=\"_ _2\"></span>fus<span class=\"_ _1\"></span>é <span class=\"ls3f ws2f\">il</span> faut passer </div><div class=\"t m0 x6 he y3fa ff2 fs2 fc0 sc0 ls2 ws2\">par plusieurs étapes).<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y3a2 ff4 fs2 fc4 sc0 ls2 ws14\">7.1</div><div class=\"t m3 x1c hd y3a2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3a2 ff4 fs2 fc4 sc0 ls2 ws14\">St<span class=\"_ _4\"></span>ep<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y4b5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2f0 ff4 fs2 fcd sc0 ls2 ws2\">explicit <span class=\"ff2 fc0 ws14\">Step(<span class=\"fc8 ws2\">int <span class=\"fc0\">step <span class=\"_ _2\"></span>= <span class=\"fcb ws14\">0<span class=\"_ _2\"></span><span class=\"fc0 ws2\">) </span></span></span></span></span></div><div class=\"t m0 x1 he y564 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3a5 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y74 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d\">la <span class=\"ls2\">clas<span class=\"_ _2\"></span>se. </span></span></div><div class=\"t m2 xa hc y2f4 ff4 fs2 fc4 sc0 ls2 ws14\">7.2</div><div class=\"t m3 x1c hd y2f4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2f4 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tSte<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3a6 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2f5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setSt<span class=\"_ _1\"></span>ep(<span class=\"fc8 ws2\">int <span class=\"fc0\">v<span class=\"_ _4\"></span>al) </span></span></span></span></div><div class=\"t m0 x1 he y3a7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2f6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2f7 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’étap<span class=\"_ _1\"></span>e<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y565 ff4 fs2 fc4 sc0 ls2 ws14\">7.3</div><div class=\"t m3 x1c hd y565 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y565 ff4 fs2 fc4 sc0 ls2 ws2\">add<span class=\"_ _2\"></span>Step </div><div class=\"t m0 x6 hc y566 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">addStep() </span></span></div><div class=\"t m0 x6 hc y567 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y568 ff2 fs2 fc0 sc0 ls2 ws2\">Avance <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’étap<span class=\"_ _1\"></span>e<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y432 ff4 fs2 fc4 sc0 ls2 ws14\">7.4</div><div class=\"t m3 x1c hd y432 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y432 ff4 fs2 fc4 sc0 ls2 ws2\">re<span class=\"_ _2\"></span>duceSt<span class=\"_ _2\"></span>ep </div><div class=\"t m0 x6 hc y386 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">reduceSt<span class=\"_ _1\"></span>ep() </span></span></div><div class=\"t m0 x6 hc y242 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y569 ff2 fs2 fc0 sc0 ls2 ws2\">Réduit <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’<span class=\"_ _1\"></span>etape<span class=\"ff2 ws2\"> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y340 ff4 fs2 fc4 sc0 ls2 ws14\">7.5</div><div class=\"t m3 x1c hd y340 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y340 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Ste<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y5c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y341 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getStep() <span class=\"fc8 ws14\">co<span class=\"_ _2\"></span>ns<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y56a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y56b ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’étape<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>à laquelle <span class=\"_ _2\"></span><span class=\"ff3\">l<span class=\"_ _1\"></span>’objet <span class=\"ff2\">es<span class=\"_ _2\"></span>t. </span></span></span></span></div><div class=\"t m0 x1 he y56c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y299 ff4 fs2 fc4 sc0 ls1c\">8.</div><div class=\"t m3 xb hd y299 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y299 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Name </div><div class=\"t m0 x6 hc y24d ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">Name;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y24f ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/Name<span class=\"_ _2\"></span>.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x6 he y43b ff2 fs2 fc0 sc0 ls2 ws2\">Classe parent qui offre <span class=\"_ _2\"></span>des méthodes pour <span class=\"_ _2\"></span>gérer <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> nom <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’un<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>objet. </span></span></span></span></div><div class=\"t m2 xa hc y56d ff4 fs2 fc4 sc0 ls2 ws14\">8.1</div><div class=\"t m3 x1c hd y56d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y56d ff4 fs2 fc4 sc0 ls2 ws14\">Na<span class=\"_ _4\"></span>me<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y254 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y56e ff4 fs2 fc5 sc0 ls2 ws2\">explicit <span class=\"_ _2\"></span><span class=\"ff2 fc0 ws14\">Name(<span class=\"fc8 ws2\">const<span class=\"_ _1\"></span> </span><span class=\"ff4 fc5\">std::string</span><span class=\"ws2\">&amp; <span class=\"_ _2\"></span>name<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>= <span class=\"_ _2\"></span><span class=\"ff4 fc7 ws14\">&quot;Unkno<span class=\"_ _1\"></span>wn&quot;<span class=\"ff2 fc0 ls3c ws2\">) </span></span></span></span></div><div class=\"t m0 x6 hc y43d ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y563 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui per<span class=\"_ _2\"></span>met<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>définir <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>nom <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3c\" class=\"pf w0 h0\" data-page-no=\"3c\"><div class=\"pc pc3c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzaQQ3AMAwEwboqEPMnZSgXBAVQdwZBcspnpVSSCwAAgKVuEwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+kwAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOozAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwQAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4TAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAYJ3n5/evqk+ff2a62zsGAABeqyeJFQAAALbywxMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+uC0Z786BEVxAMfdzcymeAP3TpIkTZF0VWHTBc+gmplqE403kNjIin4fgSApR7IRNMGfzyed08757ZTvDgAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAAD8u+yf3z+Koq8+f5qmcRx7xwAAwCv++gAAAH5ZFEIwBQAAgF/lrw8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AG8m9Z0AAACbSURBVAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAeJS9LybNWX/dy2Q2rWlpuE0q7fKxU1udF437Pr+vHsZJZRmCqT3pjnany9UcAAC+WrGQmw/q5sC7hA8KpxuKIjgiTo4EmQAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">61<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">8.2</div><div class=\"t m3 x1c hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tName<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">setName(</span>const <span class=\"ff4 fc5 ws14\">std::string</span><span class=\"fc0\">&amp; sound<span class=\"_ _2\"></span>Name<span class=\"_ _2\"></span>) </span></span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y56f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y108 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>nom <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _4\"></span>t.<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> </span></span></div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">8.3</div><div class=\"t m3 x1c hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Name<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"ff4 fc5\">std::string <span class=\"_ _4\"></span><span class=\"ff2 fc0\">g<span class=\"_ _1\"></span>etName()<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5\">noexcept </span></span></span></span></span></div><div class=\"t m0 x6 hc y351 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> nom de <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y1c8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c9 ff4 fs2 fc4 sc0 ls1c\">9.</div><div class=\"t m3 xb hd y1c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c9 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>FilePath<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 hc y1ca ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">FilePath;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y232 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/File<span class=\"_ _2\"></span>Path.<span class=\"_ _2\"></span>h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc y570 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y53d ff2 fs2 fc0 sc0 ls2 ws2\">Classe parent qui offre <span class=\"_ _2\"></span>des méthodes pour <span class=\"_ _2\"></span>gérer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>ch<span class=\"_ _1\"></span>emin <span class=\"ff3 ws14\">d’un</span> <span class=\"_ _2\"></span>fichie<span class=\"_ _2\"></span>r. </span></span></div><div class=\"t m2 xa hc y1cd ff4 fs2 fc4 sc0 ls2 ws14\">9.1</div><div class=\"t m3 x1c hd y1cd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1cd ff4 fs2 fc4 sc0 ls2 ws14\">Fil<span class=\"_ _2\"></span>ePat<span class=\"_ _2\"></span>h<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc yc6 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ce ff2 fs2 fc0 sc0 ls2 ws14\">FilePath(<span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">&amp; <span class=\"_ _2\"></span>file<span class=\"_ _2\"></span>Path) </span></span></span></div><div class=\"t m0 x6 hc yc8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y53f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y540 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> classe, elle <span class=\"_ _2\"></span>prend<span class=\"_ _1\"></span> <span class=\"ls24 ws1c\">en</span> <span class=\"_ _2\"></span>pa<span class=\"_ _1\"></span>ramètre <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>hemin <span class=\"ls1e ws16\">du</span> fichier à <span class=\"_ _2\"></span>charger<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y1d1 ff4 fs2 fc4 sc0 ls2 ws14\">9.2</div><div class=\"t m3 x1c hd y1d1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1d1 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tFile<span class=\"_ _2\"></span>Path<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y151 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc ycb ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">setFilePa<span class=\"_ _1\"></span>th(<span class=\"fc8 ws2\">const<span class=\"_ _1\"></span> </span><span class=\"ff4 fc5\">st<span class=\"_ _2\"></span>d::st<span class=\"_ _1\"></span>ring<span class=\"ff2 fc0 ws2\">&amp; <span class=\"_ _2\"></span>fileP<span class=\"_ _2\"></span>ath) </span></span></span></span></div><div class=\"t m0 x1 he y1d2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d3 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y571 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>chemi<span class=\"_ _1\"></span>n <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>fichi<span class=\"_ _2\"></span>er. </span></span></div><div class=\"t m2 xa hc yce ff4 fs2 fc4 sc0 ls2 ws14\">9.3</div><div class=\"t m3 x1c hd yce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc yce ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>FileP<span class=\"_ _2\"></span>ath<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y44e ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"ff4 fc5\">std::string <span class=\"_ _4\"></span><span class=\"ff2 fc0\">g<span class=\"_ _1\"></span>etFilePath()<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5\">noexcep<span class=\"_ _1\"></span>t </span></span></span></span></span></div><div class=\"t m0 x6 hc y44f ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y91 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>chemin du<span class=\"_ _1\"></span> f<span class=\"_ _2\"></span>ichie<span class=\"_ _2\"></span>r. </span></span></div><div class=\"t m0 x1 he y1d7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f9 ff4 fs2 fc4 sc0 ls2 ws14\">9.4</div><div class=\"t m3 x1c hd y1f9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1f9 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>FileI<span class=\"_ _2\"></span>sLoa<span class=\"_ _2\"></span>ded<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y34 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y451 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">bool <span class=\"fc0\">getFileIsLoaded() </span><span class=\"ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y94 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y572 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y455 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrais <span class=\"ff2\">quand <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> fichier <span class=\"_ _2\"></span>a<span class=\"_ _1\"></span> été bien <span class=\"_ _2\"></span>chargé <span class=\"ff4\">faux </span>sinon<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y96 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1dc ff4 fs2 fc4 sc0 ls1c\">10.</div><div class=\"t m3 x1c hd y1dc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1dc ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Type </div><div class=\"t m0 x6 hc y68 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">Type;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y573 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/pa<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>s/Type<span class=\"_ _2\"></span>.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc y574 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y575 ff2 fs2 fc0 sc0 ls2 ws2\">Classe parent qui offre <span class=\"_ _2\"></span>des méthodes pour <span class=\"_ _2\"></span>gérer <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> type <span class=\"ff3 ws14\">d’une</span> classe <span class=\"ls29 ws1f\">en<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> fonction <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’un<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> </span><span class=\"ff4 fc5\">en<span class=\"_ _2\"></span>um<span class=\"ff2 fc0 ws2\">. </span></span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3d\" class=\"pf w0 h0\" data-page-no=\"3d\"><div class=\"pc pc3d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcMWjUYACG4T/mELVIywntIHijSC0dxFGOrg6ldHG5xdmKg+uJswhuiuuBk7p2qOImFJQ6Wp2EdmnRcFR6RUvi71AILoIgBpN7nilkunxkuJdcLokxBgAAABrqmAkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8A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AED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AGuXnCIAAAGkSURBVAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAADwbY36WI+2s2MeReV401mcknTSvU37xWM/rP/40ruukvQQgtXeZMvz/VnZAQDgr7Vbzd18YAc+JfxQOL0AycGPprS0fIkAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">62<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">10.1</div><div class=\"t m3 x20 hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">Ty<span class=\"_ _4\"></span>pe<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws14\">Type(<span class=\"fc8 ws2\">int <span class=\"_ _2\"></span><span class=\"fc0\">type<span class=\"_ _2\"></span>) </span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1c2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c3 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> classe, elle <span class=\"_ _2\"></span>prend<span class=\"_ _1\"></span> <span class=\"ls24 ws1c\">en</span> <span class=\"_ _2\"></span>param<span class=\"_ _1\"></span>ètre <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _1\"></span>type (la valeur <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’un<span class=\"ff2 ws2\"> </span><span class=\"ff4 fc5\">enu<span class=\"_ _2\"></span>m<span class=\"ff2 fc0 ls60 ws49\">).<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y34f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c4 ff4 fs2 fc4 sc0 ls2 ws14\">10.2</div><div class=\"t m3 x20 hd y1c4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c4 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tType </div><div class=\"t m0 x6 hc y1c5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setType(<span class=\"fc8 ws2\">i<span class=\"_ _1\"></span>nt <span class=\"_ _4\"></span><span class=\"fc0\">typ<span class=\"_ _1\"></span>e) </span></span></span></span></div><div class=\"t m0 x6 hc y351 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y44d ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> type <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y1c9 ff4 fs2 fc4 sc0 ls2 ws14\">10.3</div><div class=\"t m3 x20 hd y1c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c9 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Type </div><div class=\"t m0 x6 hc y441 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">getType()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></span></div><div class=\"t m0 x6 hc y232 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc yc5 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> type de <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y206 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y576 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hb y577 ff7 fs3 fc3 sc0 ls2 ws2\">Le Back<span class=\"_ _4\"></span>grou<span class=\"_ _2\"></span>d<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h2c y53 ff7 fsc fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y578 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y579 ff2 fs2 fc0 sc0 ls2 ws2\">Cette Classe permet de déssiner <span class=\"ls2c ws21\">un</span> Sprite sous <span class=\"_ _2\"></span>forme <span class=\"ff3 ws14\">d’arrière</span> plan, avec <span class=\"ls1d ws15\">la</span> possibilité <span class=\"ff3\">de l’utiliser</span> pour remplir une </div><div class=\"t m0 x6 he y57a ff2 fs2 fc0 sc0 ls2 ws2\">scène et de le faire défiler<span class=\"_ _1\"></span> avec une vitesse ho<span class=\"_ _1\"></span>rizontale et vertica<span class=\"_ _1\"></span>le.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y57b ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y57b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y57b ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>méthodes p<span class=\"_ _2\"></span>ubliq<span class=\"_ _2\"></span>ues<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y405 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y405 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y405 ff4 fs2 fc4 sc0 ls2 ws14\">Ba<span class=\"_ _2\"></span>ckgrou<span class=\"_ _2\"></span>nd<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y57c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7f ff2 fs2 fc0 sc0 ls2 ws2\">Background(sf::Textu<span class=\"_ _1\"></span>re <span class=\"_ _2\"></span>&amp;<span class=\"_ _1\"></span>tex, <span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0 ls35 ws29\">x,<span class=\"ls2 ws2\"> <span class=\"fc8\">float <span class=\"_ _4\"></span><span class=\"fc0 ls43 ws33\">y,<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"ff4 fc5 ws14\">is::</span>GameDisplay<span class=\"_ _1\"></span> *<span class=\"_ _2\"></span>scene, <span class=\"_ _1\"></span><span class=\"fc8\">float </span>hSpeed <span class=\"_ _2\"></span><span class=\"ls38\">= <span class=\"fcb ls2 ws14\">0.f</span><span class=\"ls2\">, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">vSpeed = <span class=\"fcb ws14\">0<span class=\"_ _2\"></span>.f<span class=\"_ _2\"></span><span class=\"fc0 ws2\">, </span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1c hc y57d ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">fillHo<span class=\"_ _1\"></span>rizontal = <span class=\"ff4 fc5 ws14\">true</span>, <span class=\"fc8\">bool </span>fillVertical = <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">tr<span class=\"_ _2\"></span>ue<span class=\"ff2 fc0 ws2\">)<span class=\"_ _2\"></span> </span></span></span></div><div class=\"t m0 x1 he y60 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y57e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y57f ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>clas<span class=\"_ _1\"></span>se, elle <span class=\"_ _2\"></span>prend <span class=\"ls24 ws1c\">en</span> param<span class=\"_ _1\"></span>ètre <span class=\"ls1d\">la </span>texture, la position, <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scene, la vitesse <span class=\"ls1e ws16\">de</span> défilement<span class=\"_ _1\"></span> horizontale et </div><div class=\"t m0 x6 he y4ed ff2 fs2 fc0 sc0 ls2 ws2\">vertciale et les deux autr<span class=\"_ _1\"></span>es paramètres qui s<span class=\"_ _1\"></span>ervent à faire le r<span class=\"_ _1\"></span>emplissage horizontal<span class=\"_ _1\"></span> et vertical<span class=\"_ _1\"></span>.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y2d6 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y2d6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2d6 ff4 fs2 fc4 sc0 ls2 ws14\">st<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y580 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y581 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">st<span class=\"_ _1\"></span>ep(<span class=\"fc8 ws2\">float const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _2\"></span>_TI<span class=\"_ _2\"></span>ME) </span></span></span></div><div class=\"t m0 x6 hc y582 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y583 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> mettre <span class=\"_ _2\"></span>à jour <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _4\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div></div><div class=\"c x6 y584 w9 h2d\"><div class=\"t m0 x0 h1f y3be ff7 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y585 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Background<span class=\"_ _1\"></span> </div></div><div class=\"c x6 y584 w9 h2d\"><div class=\"t m0 x0 h18 y36d ff4 fs9 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d h1a y586 ff2 fs9 fc0 sc0 ls2 ws2\">Background; </div></div><div class=\"c x6 y584 w9 h2d\"><div class=\"t m0 x0 hc y3c2 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/Ba<span class=\"_ _2\"></span>ckgro<span class=\"_ _2\"></span>und.h<span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3e\" class=\"pf w0 h0\" data-page-no=\"3e\"><div class=\"pc pc3e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAA+Cnv+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPre269DFYTBMAyjCyIDi3cgw7RksllMdqvFwbrBa7CKiFUwirsD0wTNFu9Dg2nlNw2xGxTOSd9X3/YAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAJeBusQAAAELSURBVKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAvDXqYz3azo55FJXjTWdxStJJ9zbtF4/9sP7jS++6StJDCFb7kC3P92dlBwCAv9ZuNXfzgR34lvBD4fQCWpxlWU3K208AAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">63<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hb y103 ff7 fs3 fc3 sc0 ls2 ws2\">Le Bou<span class=\"_ _2\"></span>ton<span class=\"_ _2\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 x1 hb y104 ff7 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y105 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y105 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y105 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Button </div><div class=\"t m0 x6 hc y107 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">Button; </span></div><div class=\"t m0 x6 hc y587 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/enti<span class=\"_ _2\"></span>ty/Bu<span class=\"_ _2\"></span>tton.<span class=\"_ _2\"></span>h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x6 hc y588 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y589 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y145 ff2 fs2 fc0 sc0 ls2 ws2\">Cette <span class=\"_ _2\"></span>Classe <span class=\"ff3\">permet d’utilise<span class=\"_ _1\"></span>r</span> <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> bouton dans <span class=\"_ _2\"></span>une s<span class=\"_ _2\"></span>cene. </span></span></div><div class=\"t m2 xa hc y58a ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y58a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y58a ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>méthodes p<span class=\"_ _2\"></span>ubliq<span class=\"_ _2\"></span>ues<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y58b ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y58b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y58b ff4 fs2 fc4 sc0 ls2 ws14\">Butt<span class=\"_ _2\"></span>on<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y4d4 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y4d4 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4d4 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y58c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y45d ff2 fs2 fc0 sc0 ls2 ws2\">Button(sf::Textur<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>&amp;tex, <span class=\"fc8\">float </span><span class=\"ls35\">x, </span><span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0 ls36 ws2a\">y,<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff4 fc5\">std::string <span class=\"ff2 fc8\">const <span class=\"fc0\">&amp;title, <span class=\"_ _2\"></span><span class=\"ff4 fc5\">std::str<span class=\"_ _1\"></span>ing <span class=\"ff2 fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;na<span class=\"_ _1\"></span>me, <span class=\"fc8\">bool </span>center, <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">is::<span class=\"_ _2\"></span><span class=\"ff2 fc0 ws2\">GameDi<span class=\"_ _2\"></span>splay<span class=\"_ _2\"></span> </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y58d ff2 fs2 fc0 sc0 ls2 ws2\">*sc<span class=\"_ _2\"></span>ene) </div><div class=\"t m0 x1 he y48c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y58e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y58f ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> classe, e<span class=\"_ _2\"></span>ll<span class=\"_ _1\"></span>e prend <span class=\"ls24 ws1c\">en</span> <span class=\"_ _2\"></span>param<span class=\"_ _1\"></span>ètre <span class=\"ls1d ws15\">la</span> texture <span class=\"_ _2\"></span>qui sera utiliser comme cadre <span class=\"ls1e ws16\">du</span> boutton, <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> position, <span class=\"_ _2\"></span><span class=\"ls61 ws4a\">le<span class=\"ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 he y590 ff2 fs2 fc0 sc0 ls2 ws2\">titre, <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> n<span class=\"_ _2\"></span>om <span class=\"ls1e ws16\">de</span> <span class=\"ff3 ws14\">l’objet,</span> centrer <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>bouton<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>par <span class=\"_ _1\"></span>rapport à <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>position <span class=\"ls24 ws1c\">et</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>sc<span class=\"_ _1\"></span>ene dans <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>quell<span class=\"_ _1\"></span>e <span class=\"ls3f ws2f\">il</span> <span class=\"_ _2\"></span>sera util<span class=\"_ _2\"></span>isé. </span></span></div><div class=\"t m2 xa h15 y491 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y491 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y491 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y492 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y493 ff2 fs2 fc0 sc0 ls2 ws2\">Button(sf::Textur<span class=\"_ _1\"></span>e &amp;tex , sf::Font &amp;font, <span class=\"fc8\">float </span><span class=\"ls35 ws29\">x,</span> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls43 ws33\">y,</span><span class=\"fc0\"> <span class=\"ff4 fc5\">std::string </span></span>const <span class=\"fc0\">&amp;title, <span class=\"ff4 fc5\">std::string </span></span>const <span class=\"fc0\">&amp;nam<span class=\"_ _1\"></span>e, </span>bool <span class=\"fc0\">center, </span>int </span></div><div class=\"t m0 x6 hc y178 ff2 fs2 fc0 sc0 ls2 ws2\">textSize, <span class=\"ff4 fc5 ws14\">is::</span>Gam<span class=\"_ _1\"></span>eDisplay *scene)<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 hc y355 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y591 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>clas<span class=\"_ _1\"></span>se, elle <span class=\"_ _2\"></span>prend <span class=\"ls24 ws1c\">en</span> param<span class=\"_ _1\"></span>ètre la texture qui sera utiliser comme cadre <span class=\"ls1e ws16\">du</span> boutton, <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>positio<span class=\"_ _1\"></span>n, <span class=\"ls1d\">la </span></div><div class=\"t m0 x6 he y3d2 ff3 fs2 fc0 sc0 ls2 ws2\">police de caractère, le tit<span class=\"_ _1\"></span>re, le nom de l’objet, ce<span class=\"_ _1\"></span>ntrer le bouton par ra<span class=\"_ _1\"></span>pport à la positi<span class=\"_ _1\"></span>on, la taille<span class=\"_ _9\"></span><span class=\"ff2\"> du text<span class=\"_ _1\"></span>e et la scene </span></div><div class=\"t m0 x6 he y153 ff2 fs2 fc0 sc0 ls2 ws2\">dans la quelle il sera utilis<span class=\"_ _1\"></span>é.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y592 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y592 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y592 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tTitle<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y57a ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y593 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">s<span class=\"_ _1\"></span>etTitle(<span class=\"ff4 fc5 ws2\">std::str<span class=\"_ _1\"></span>ing <span class=\"ff2 fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;tit<span class=\"_ _2\"></span>le) </span></span></span></span></span></div><div class=\"t m0 x6 hc y44e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y594 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y595 ff2 fs2 fc0 sc0 ls2 ws2\">Defnie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>tit<span class=\"_ _1\"></span>re <span class=\"ls1e ws16\">du</span> bouto<span class=\"_ _2\"></span>n. </div><div class=\"t m2 xa hc y596 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y596 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y596 ff4 fs2 fc4 sc0 ls2 ws14\">on<span class=\"_ _2\"></span>Click<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y597 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y598 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0\">onClic<span class=\"_ _1\"></span>k() = <span class=\"_ _2\"></span><span class=\"fcb ws14\">0<span class=\"fc0 ws2\">;<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x6 hc y93 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y506 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y26e ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir <span class=\"ff3 ws14\">l’action<span class=\"_ _1\"></span></span> q<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>i sera <span class=\"_ _2\"></span>éffectu<span class=\"_ _1\"></span>ée quand <span class=\"_ _2\"></span><span class=\"ls33 ws27\">on<span class=\"ls2 ws2\"> clique <span class=\"_ _2\"></span>sur <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> bou<span class=\"_ _2\"></span>ton. </span></span></span></span></div><div class=\"t m2 xa hc y599 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y599 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y599 ff4 fs2 fc4 sc0 ls2 ws14\">onM<span class=\"_ _2\"></span>ouse<span class=\"_ _2\"></span>Over<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y59a ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y85 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8 ws14\">void<span class=\"fc0 ls5b\">(</span><span class=\"ff4 fc5 ws2\">std::s<span class=\"_ _1\"></span>tring <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">&amp;<span class=\"_ _2\"></span>title<span class=\"_ _2\"></span>) </span></span></span></span></div><div class=\"t m0 x6 hc y59b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3a ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y34d ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"ff3 ws14\">l’action</span> <span class=\"_ _2\"></span>qui sera éffectuée q<span class=\"_ _2\"></span>ua<span class=\"_ _1\"></span>nd <span class=\"ls2a ws20\">on</span> <span class=\"_ _2\"></span>survol<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>bou<span class=\"_ _1\"></span>ton avec <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> sourie (doigt sur Mobi<span class=\"_ _2\"></span>le). </span></span></span></span></div><div class=\"t m2 xa hc y6a ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y6a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y6a ff4 fs2 fc4 sc0 ls2 ws14\">ev<span class=\"_ _2\"></span>ent<span class=\"fc0 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf3f\" class=\"pf w0 h0\" data-page-no=\"3f\"><div class=\"pc pc3f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcMUhUcQDH8f9LkbAhxOEm28WmanCw2c1BXKIlwUmUhmgvdFAEQQgRHJxcxEGEoqYQggRxUFHayhzkwDgUPY7jnn+Hg+MWJ+2hj89n+nPjjxvuy/u/S2KMAQAAgJx6YAIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8JAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9JgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ZkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANVnAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUnwkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAA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AFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPANjQiMEAAAGwSURBVAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAADAbZJy8fb8MdtNW62vl/eHxT4bvPaP4+HnafNU7jvfjz+rbLANwdT+mCwPv+eLOQAA1Fqv217PR+ZAVcIdhdMVwE2ZSOqmkrsAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">64<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y23e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8 ws14\">void<span class=\"fc0 ls5b\">(</span><span class=\"ff4 fc5 ws2\">std::s<span class=\"_ _1\"></span>tring <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">&amp;<span class=\"_ _2\"></span>title<span class=\"_ _2\"></span>) </span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2bd ff2 fs2 fc0 sc0 ls2 ws2\">Gère <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> partie e<span class=\"_ _2\"></span>ve<span class=\"_ _1\"></span>nement <span class=\"ls1e ws16\">du</span> b<span class=\"_ _2\"></span>outon<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">st<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y34f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0 ws14\">step(</span>float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>const <span class=\"fc0\">&amp;DE<span class=\"_ _2\"></span>LTA_T<span class=\"_ _2\"></span>IME) </span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> mettre <span class=\"_ _2\"></span>à jour <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _4\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y221 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">dr<span class=\"_ _2\"></span>aw<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ec ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"fc0\">draw(is::Render <span class=\"_ _2\"></span>&amp;surfa<span class=\"_ _2\"></span>ce) </span></span></div><div class=\"t m0 x1 he y222 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ed ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y548 ff2 fs2 fc0 sc0 ls2 ws2\">Affiche <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>bouto<span class=\"_ _1\"></span>n avec <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>titr<span class=\"_ _2\"></span>e. </div><div class=\"t m2 xa hc y353 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y353 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y353 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Text<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y225 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::<span class=\"_ _1\"></span>Text&amp; ge<span class=\"_ _2\"></span>tText<span class=\"_ _2\"></span>() </span></div><div class=\"t m0 x1 he y3ed ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc ybd ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’objet<span class=\"ff2 ws2\"> text <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> bo<span class=\"_ _2\"></span>uton. </span></span></span></span></div><div class=\"t m0 x1 he y385 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y290 ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y290 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y290 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>IsIn<span class=\"_ _2\"></span>Colli<span class=\"_ _2\"></span>sion<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y549 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">bool <span class=\"fc0\">getIsInCollision() </span><span class=\"ws14\">cons<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x1 he y373 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y54b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y54c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y59c ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2\">q<span class=\"_ _2\"></span>ua<span class=\"_ _1\"></span>nd le sourie (doigt <span class=\"_ _2\"></span>sur Mobile) est <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>collision<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>avec <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>bout<span class=\"_ _2\"></span>on. </span></span></div><div class=\"t m0 x1 he y592 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y54d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y9f ff9 fs2 fc3 sc0 ls2 ws14\">Ad<span class=\"_ _2\"></span>mob<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 h22 y59d ff9 fsb fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y59e ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y59f ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y428 ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"ff3\">permet d’utilise<span class=\"_ _1\"></span>r</span> <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> SDK Admob dans le<span class=\"_ _1\"></span> jeu. Elle offre des fonctions pour gérer les annonces de type ban<span class=\"_ _1\"></span>nière </span></span></div><div class=\"t m0 x6 he y5a0 ff2 fs2 fc0 sc0 ls2 ws2\">et vidéo récompense.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y5a1 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y5a1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5a1 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>méthodes p<span class=\"_ _2\"></span>ubliq<span class=\"_ _2\"></span>ues<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y5a2 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y5a2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5a2 ff4 fs2 fc4 sc0 ls2 ws14\">Adm<span class=\"_ _2\"></span>obMana<span class=\"_ _2\"></span>ger<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y5a3 ff2 fs2 fc0 sc0 ls2 ws2\">AdmobManager(sf::R<span class=\"_ _1\"></span>enderWindow<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;win<span class=\"_ _1\"></span>dow, <span class=\"_ _4\"></span>ANa<span class=\"_ _1\"></span>tiveAc<span class=\"_ _1\"></span>tivity* <span class=\"_ _4\"></span>ac<span class=\"_ _1\"></span>tivity, <span class=\"_ _4\"></span>JNIEnv<span class=\"_ _1\"></span>* <span class=\"_ _2\"></span>en<span class=\"_ _2\"></span>v)<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y5a4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y6a ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>la cla<span class=\"_ _1\"></span>sse, <span class=\"_ _2\"></span>elle prend <span class=\"ls24 ws1c\">en<span class=\"_ _1\"></span></span> <span class=\"_ _2\"></span>param<span class=\"_ _1\"></span>ètre <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> fenêtre, <span class=\"_ _2\"></span><span class=\"ff3\">l’activit<span class=\"_ _1\"></span>é Mobile<span class=\"_ _1\"></span><span class=\"ff2\"> <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">et<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’environnement</span> JN<span class=\"_ _2\"></span>I. </span></span></span></span></span></span></div></div><div class=\"c x6 y5a5 w9 h21\"><div class=\"t m0 x0 hc y5a6 ff9 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y5a7 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Admob<span class=\"_ _1\"></span>Manager </div></div><div class=\"c x6 y5a5 w9 h21\"><div class=\"t m0 x0 hc y5a8 ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d he y5a9 ff2 fs2 fc0 sc0 ls2 ws2\">AdmobMana<span class=\"_ _1\"></span>ger; </div></div><div class=\"c x6 y5a5 w9 h21\"><div class=\"t m0 x0 hc y5aa ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/Mobi<span class=\"_ _2\"></span>le/Ad<span class=\"_ _2\"></span>mobMa<span class=\"_ _2\"></span>nager<span class=\"_ _2\"></span>.h<span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf40\" class=\"pf w0 h0\" data-page-no=\"40\"><div class=\"pc pc40 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269DEwChAIqivGh0B3dxAOGD2ziDYHQIR7C4gfDjH8VqtArntFdfuwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhcAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpcAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAMfWlKoAAABASURBVIDqcwEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAAC+Vd867kmSc9paLckx3P28vHZ3tVoSlwEAAPzIA/A+HzqPBTcvAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">loa<span class=\"_ _2\"></span>dBan<span class=\"_ _2\"></span>nerAd </div><div class=\"t m0 x6 he y201 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">loadBannerAd()<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y108 ff2 fs2 fc0 sc0 ls2 ws2\">Lance une <span class=\"_ _2\"></span>requête pour <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’an<span class=\"_ _1\"></span>nonce<span class=\"ff2 ws2\"> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> type bann<span class=\"_ _2\"></span>ière<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">show<span class=\"_ _2\"></span>Bann<span class=\"_ _2\"></span>erAd </div><div class=\"t m0 x6 he y1e8 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">showBannerAd() </span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y44d ff2 fs2 fc0 sc0 ls2 ws2\">Affiche une b<span class=\"_ _2\"></span>anni<span class=\"_ _1\"></span>ère <span class=\"ff3 ws14\">d’annonce</span> à <span class=\"_ _2\"></span>condition<span class=\"_ _1\"></span> que <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> requête ait <span class=\"_ _2\"></span>été bien ex<span class=\"_ _2\"></span>écuté<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m2 xa hc y1c9 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y1c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c9 ff4 fs2 fc4 sc0 ls2 ws2\">hid<span class=\"_ _2\"></span>eBann<span class=\"_ _2\"></span>erAd </div><div class=\"t m0 x6 he y441 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">hideBannerAd() </span></div><div class=\"t m0 x6 hc y232 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y224 ff2 fs2 fc0 sc0 ls2 ws2\">Cache <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> bannière <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’an<span class=\"_ _2\"></span>nonce<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y1cd ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y1cd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1cd ff4 fs2 fc4 sc0 ls2 ws2\">loa<span class=\"_ _2\"></span>dRewa<span class=\"_ _2\"></span>rdVi<span class=\"_ _2\"></span>deo </div><div class=\"t m0 x6 he y208 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">loadRewardVide<span class=\"_ _1\"></span>o() </span></div><div class=\"t m0 x6 hc y209 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y228 ff2 fs2 fc0 sc0 ls2 ws2\">Lance <span class=\"_ _2\"></span>une<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>requêt<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>pour <span class=\"ff3 ws14\">l’annonce</span> <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>ty<span class=\"_ _1\"></span>pe vidéo réc<span class=\"_ _2\"></span>ompen<span class=\"_ _2\"></span>se. </div><div class=\"t m2 xa hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y20b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y20b ff4 fs2 fc4 sc0 ls2 ws2\">show<span class=\"_ _2\"></span>Rewa<span class=\"_ _2\"></span>rdVid<span class=\"_ _2\"></span>eo </div><div class=\"t m0 x6 hc y2a ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">showReward<span class=\"_ _1\"></span>Video() </span></span></div><div class=\"t m0 x6 hc y20c ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y12a ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> lancer <span class=\"_ _2\"></span>une annonce <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> type <span class=\"_ _2\"></span>vidéo réc<span class=\"_ _2\"></span>ompens<span class=\"_ _2\"></span>e. </span></span></span></span></div><div class=\"t m0 x6 hc y2dc ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fcb\">1 <span class=\"fc0 ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> vidéo ré<span class=\"_ _2\"></span>co<span class=\"_ _1\"></span>mpense <span class=\"ff3 ws14\">c’est</span> bien lancé et <span class=\"fcb\">0 </span><span class=\"ff3 ws14\">s‘il</span> y <span class=\"_ _2\"></span>a une erreur <span class=\"ls3c ws39\">(se</span> <span class=\"_ _2\"></span>produit souvent quand la requête de </span></span></span></div><div class=\"t m0 x6 he y5ab ff3 fs2 fc0 sc0 ls2 ws2\">l’annonce n’a pas fonct<span class=\"_ _1\"></span>ionné).<span class=\"_ _1\"></span><span class=\"ff2\"> </span></div><div class=\"t m2 xa hc y5ac ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y5ac ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5ac ff4 fs2 fc4 sc0 ls2 ws14\">upda<span class=\"_ _2\"></span>teSF<span class=\"_ _2\"></span>MLApp<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y5ad ff4 fs2 fc5 sc0 ls2 ws2\">auto <span class=\"_ _4\"></span><span class=\"ff2 fc0 ws14\">u<span class=\"_ _1\"></span>pdateSFMLApp(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">whit<span class=\"_ _2\"></span>eColor<span class=\"_ _2\"></span>) </span></span></span></div><div class=\"t m0 x1 he y5ae ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5af ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5b0 ff2 fs2 fc0 sc0 ls2 ws2\">Met à jour <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’application<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> SFML <span class=\"ls24 ws1c\">en</span> arrière-plan </span>lorsqu’une<span class=\"ff2 ws2\"> annonc<span class=\"_ _1\"></span>e est affichée. <span class=\"_ _2\"></span>Ceci permet<span class=\"_ _1\"></span> <span class=\"ff3\">d’eviter le</span> plantage du </span></span></div><div class=\"t m0 x6 he y2d5 ff2 fs2 fc0 sc0 ls2 ws2\">programme principal<span class=\"_ _1\"></span>. </div><div class=\"t m2 xa hc y5b1 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y5b1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5b1 ff4 fs2 fc4 sc0 ls2 ws2\">che<span class=\"_ _2\"></span>ckAdO<span class=\"_ _2\"></span>bjIni<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 he y5b2 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">checkAdObjInit()<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y5b3 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5b4 ff2 fs2 fc0 sc0 ls2 ws2\">Assure <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’initialisa<span class=\"_ _1\"></span>tion<span class=\"ff2 ws2\"> des <span class=\"_ _4\"></span>co<span class=\"_ _1\"></span>mposants <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’Adm<span class=\"_ _2\"></span>ob.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y5b5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y5b6 ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y5b6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5b6 ff4 fs2 fc4 sc0 ls2 ws14\">che<span class=\"_ _2\"></span>ckAdR<span class=\"_ _2\"></span>ewar<span class=\"_ _2\"></span>dObjRe<span class=\"_ _2\"></span>initia<span class=\"_ _2\"></span>liz<span class=\"_ _2\"></span>e<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y5b7 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">checkA<span class=\"_ _2\"></span>dRew<span class=\"_ _2\"></span>ardObj<span class=\"_ _2\"></span>Reinit<span class=\"_ _2\"></span>iali<span class=\"_ _2\"></span>ze() </span></div><div class=\"t m0 x21 h9 y220 ff6 fs3 fc0 sc0 ls1b ws13\">65<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf41\" class=\"pf w0 h0\" data-page-no=\"41\"><div class=\"pc pc41 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcsWmGQACG4Vy43kZIJQ6QIFhLlsgGgX+DFI5gl5ksrN1E0gSFNJciENKkFPR8ngn04wpfRENK6Q4AAIBM3ZsAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANVnAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUnwkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAA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\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Rénitialise les <span class=\"_ _4\"></span>composa<span class=\"_ _1\"></span>nts <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>Admob<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m2 xa hc y1e2 ff4 fs2 fc4 sc0 ls1c\">3.</div><div class=\"t m3 xb hd y1e2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e2 ff4 fs2 fc4 sc0 ls2 ws2\">Autres <span class=\"_ _2\"></span>Fonc<span class=\"_ _1\"></span>tion <span class=\"_ _2\"></span><span class=\"ffd ws4b\">d’Admob<span class=\"_ _2\"></span>Manage<span class=\"_ _2\"></span>r<span class=\"ff4 fc0 ws2\"> </span></span></div><div class=\"t m2 xa hc y5b8 ff4 fs2 fc4 sc0 ls2 ws14\">3.1</div><div class=\"t m3 x1c hd y5b8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5b8 ff4 fs2 fc4 sc0 ls2 ws2\">ProcessEvents <span class=\"_ _4\"></span>&amp;<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>Wai<span class=\"_ _1\"></span>tForFutureCompletion </div><div class=\"t m0 x6 hc y5b9 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">bool <span class=\"fc0 ws14\">Proc<span class=\"_ _1\"></span>essEvents(</span>int <span class=\"fc0\">msec)<span class=\"_ _1\"></span> </span></span></div><div class=\"t m0 x6 hc y5ba ff4 fs2 fc5 sc0 ls2 ws2\">sta<span class=\"_ _2\"></span>tic <span class=\"_ _a\"></span><span class=\"ff2 fc8\">voi<span class=\"_ _2\"></span>d <span class=\"_ _b\"></span><span class=\"fc0\">W<span class=\"_ _2\"></span>aitFor<span class=\"_ _2\"></span>Fut<span class=\"_ _2\"></span>ureCom<span class=\"_ _2\"></span>plet<span class=\"_ _2\"></span>ion(f<span class=\"_ _2\"></span>ireb<span class=\"_ _2\"></span>ase:<span class=\"_ _2\"></span>:Futur<span class=\"_ _2\"></span>eBase<span class=\"_ _2\"></span> <span class=\"_ _b\"> </span>fu<span class=\"_ _2\"></span>ture) </span></span></div><div class=\"t m0 x1 he y5bb ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y332 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y313 ff2 fs2 fc0 sc0 ls2 ws2\">Assure <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> bon <span class=\"_ _2\"></span>fonctionn<span class=\"_ _1\"></span>ement des <span class=\"_ _2\"></span>tests sur <span class=\"_ _2\"></span>l<span class=\"_ _1\"></span>es <span class=\"_ _2\"></span>composa<span class=\"_ _1\"></span>nts <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>annon<span class=\"_ _2\"></span>ces.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y335 ff4 fs2 fc4 sc0 ls2 ws14\">3.2</div><div class=\"t m3 x1c hd y335 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y335 ff4 fs2 fc4 sc0 ls2 ws14\">che<span class=\"_ _2\"></span>ckAdS<span class=\"_ _2\"></span>tate<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y5bc ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5bd ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">bool <span class=\"_ _4\"></span><span class=\"fc0\">check<span class=\"_ _1\"></span>AdState(fir<span class=\"_ _1\"></span>ebase::FutureBas<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>futur<span class=\"_ _2\"></span>e) </span></span></div><div class=\"t m0 x1 he y337 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2c0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y338 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y339 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrais <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">le</span> test <span class=\"_ _2\"></span>sur <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>omposant<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’anno<span class=\"_ _1\"></span>nce<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>a été bien effectué, <span class=\"ff4\">faux<span class=\"_ _1\"></span> </span><span class=\"ls28 ws1e\">si</span> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></span></span></div><div class=\"t m0 x1 he y5be ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y5bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y3a9 ff9 fs2 fc3 sc0 ls2 ws14\">Te<span class=\"_ _2\"></span>mps<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y5c0 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y5c1 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y5c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5c1 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>GameTime </div><div class=\"t m0 x6 hc y3ce ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0\">GameTime;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y5c2 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/funct<span class=\"_ _2\"></span>ion/G<span class=\"_ _2\"></span>ameT<span class=\"_ _2\"></span>ime.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc y5c3 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5c4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5c5 ff2 fs2 fc0 sc0 ls2 ws2\">Cette Classe permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> manipuler <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps <span class=\"ls1e ws16\">du</span> jeu (le <span class=\"_ _2\"></span>chronom<span class=\"_ _1\"></span>ètre). Très utilise pour les jeux <span class=\"ls1e ws16\">de</span> plateforme style Super </span></span></span></span></div><div class=\"t m0 x6 he y5c6 ff2 fs2 fc0 sc0 ls2 ws2\">Mario Bros ou Sonic qui<span class=\"_ _1\"></span> utilise un chro<span class=\"_ _1\"></span>nomètre dans <span class=\"_ _1\"></span>un niveau.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y1f4 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y1f4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1f4 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>methods<span class=\"_ _1\"></span> publiques <span class=\"_ _2\"></span><span class=\"ls21 ws19\">de<span class=\"ls2 ws2\"> Ga<span class=\"_ _2\"></span>meTim<span class=\"_ _2\"></span>e<span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xa hc y5c ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y5c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5c ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Time<span class=\"fc0 ws2\"> </span></div><div class=\"t m2 xa h15 y5c7 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y5c7 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5c7 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y5c8 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y5c9 ff2 fs2 fc0 sc0 ls2 ws2\">Gam<span class=\"_ _2\"></span>eTime<span class=\"_ _2\"></span>() </div><div class=\"t m0 x6 hc y5ca ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5cb ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur par <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>éfaut, initialise <span class=\"_ _2\"></span>tous<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>les compteurs (mi<span class=\"_ _1\"></span>nute, <span class=\"_ _2\"></span>s<span class=\"_ _1\"></span>econde, milliseconde) à zéro <span class=\"_ _2\"></span>(0<span class=\"_ _4\"></span>). </div><div class=\"t m2 xa h15 y5cc ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y5cc ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5cc ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième forme </div><div class=\"t m0 x6 he y5cd ff2 fs2 fc0 sc0 ls2 ws14\">GameTime(<span class=\"fc8 ws2\">unsign<span class=\"_ _1\"></span>ed <span class=\"_ _4\"></span>int <span class=\"_ _4\"></span><span class=\"fc0\">ms<span class=\"_ _1\"></span>) </span></span></div><div class=\"t m0 x6 hc y5ce ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5cf ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur pour <span class=\"_ _2\"></span>initial<span class=\"_ _1\"></span>iser <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps <span class=\"_ _2\"></span>avec<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>les millisecondes qui <span class=\"_ _2\"></span>sero<span class=\"_ _1\"></span>nt <span class=\"_ _2\"></span>distri<span class=\"_ _1\"></span>buées plus tard en minutes <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>secon<span class=\"_ _2\"></span>des. </span></span></span></span></div><div class=\"t m2 xa h15 y5d0 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y5d0 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5d0 ff9 fs2 fc0 sc0 ls2 ws2\">Troisième <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y5d1 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y5d2 ff2 fs2 fc0 sc0 ls2 ws14\">GameTime(<span class=\"fc8 ws2\">unsign<span class=\"_ _1\"></span>ed <span class=\"_ _2\"></span>int<span class=\"_ _1\"></span> <span class=\"fc0 ls62 ws4c\">m,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">unsigned<span class=\"_ _1\"></span> int <span class=\"_ _2\"></span><span class=\"fc0 ls28 ws1e\">s,<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"fc8\">unsig<span class=\"_ _1\"></span>ned int <span class=\"_ _2\"></span><span class=\"fc0 ls63 ws4d\">ms<span class=\"ls2 ws2\"> = <span class=\"_ _4\"></span><span class=\"fcb ws14\">0<span class=\"fc0 ws2\">) </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y5d3 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x21 h9 y4b2 ff6 fs3 fc0 sc0 ls1b ws13\">66<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf42\" class=\"pf w0 h0\" data-page-no=\"42\"><div class=\"pc pc42 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur pour <span class=\"_ _2\"></span>initial<span class=\"_ _1\"></span>iser <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps <span class=\"_ _2\"></span>avec<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>les<span class=\"_ _1\"></span> minutes, <span class=\"_ _2\"></span>secondes <span class=\"ls24 ws1c\">et</span> mi<span class=\"_ _2\"></span>llise<span class=\"_ _2\"></span>conde<span class=\"_ _2\"></span>s. </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y2bc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">st<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y2bd ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">step(<span class=\"fc8 ws2\">float const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;DELTA_TIME,<span class=\"_ _1\"></span> <span class=\"fc8\">float <span class=\"_ _2\"></span>const <span class=\"fc0\">&amp;VALUE_CONVERSION, </span>float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>const <span class=\"fc0\">&amp;V<span class=\"_ _2\"></span>ALUE<span class=\"_ _2\"></span>_TIME<span class=\"_ _2\"></span>) </span></span></span></span></span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y331 ff2 fs2 fc0 sc0 ls2 ws2\">Lancer <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>compt<span class=\"_ _1\"></span>e à <span class=\"_ _2\"></span>rebours <span class=\"_ _1\"></span><span class=\"ls1e ws16\">du</span> chronomètre pour q<span class=\"_ _2\"></span>u&apos;il s&apos;arrête à <span class=\"_ _2\"></span>zéro (<span class=\"_ _2\"></span>0).<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">add<span class=\"_ _2\"></span>Time<span class=\"_ _2\"></span>Value<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">add<span class=\"_ _1\"></span>TimeValue(<span class=\"fc8 ws2\">i<span class=\"_ _1\"></span>nt </span><span class=\"ls62 ws4c\">m,</span><span class=\"ws2\"> <span class=\"_ _2\"></span><span class=\"fc8\">int <span class=\"fc0\">s = <span class=\"_ _4\"></span><span class=\"fcb ls2e\">0<span class=\"fc0 ls2\">, <span class=\"_ _1\"></span><span class=\"fc8\">int </span><span class=\"ls62 ws4c\">ms</span> = <span class=\"fcb ws14\">0<span class=\"_ _4\"></span><span class=\"fc0 ws2\">) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e ff2 fs2 fc0 sc0 ls2 ws2\">Ajouter les <span class=\"_ _4\"></span>min<span class=\"_ _1\"></span>utes, les secondes <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span>les millisecond<span class=\"_ _1\"></span>es <span class=\"ls29 ws1f\">au<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps <span class=\"_ _4\"></span>actuel. </span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ca ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y1ca ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1ca ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tTime<span class=\"_ _2\"></span>Value<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y548 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">s<span class=\"_ _1\"></span>etTimeValue(<span class=\"fc8 ws2\">int<span class=\"_ _1\"></span> </span><span class=\"ls62 ws4c\">m,</span><span class=\"ws2\"> <span class=\"_ _2\"></span><span class=\"fc8\">int <span class=\"fc0\">s = <span class=\"_ _2\"></span><span class=\"fcb ls2e\">0<span class=\"fc0 ls2\">, <span class=\"fc8\">int </span><span class=\"ls62 ws4c\">ms</span> = <span class=\"fcb ws14\">0<span class=\"_ _2\"></span><span class=\"fc0 ws2\">) </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y353 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5d4 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y5d5 ff2 fs2 fc0 sc0 ls2 ws2\">Définie une <span class=\"_ _2\"></span>nouvelle minute, seconde <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span>millisecon<span class=\"_ _1\"></span>de pour <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps <span class=\"_ _2\"></span>actue<span class=\"_ _2\"></span>lle. </span></span></div><div class=\"t m2 xa hc y1f1 ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y1f1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1f1 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tMSecon<span class=\"_ _2\"></span>d </div><div class=\"t m0 x6 he y26 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setMS<span class=\"_ _1\"></span>econd(<span class=\"fc8 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0\">ms)<span class=\"_ _1\"></span> </span></span></span></div><div class=\"t m0 x6 hc y228 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y20b ff2 fs2 fc0 sc0 ls2 ws2\">Définie de<span class=\"_ _2\"></span>s<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>milliseco<span class=\"_ _1\"></span>ndes qui <span class=\"_ _4\"></span>sero<span class=\"_ _1\"></span>nt distribuées en <span class=\"_ _2\"></span>minut<span class=\"_ _1\"></span>es <span class=\"ls29 ws1f\">et<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>second<span class=\"_ _2\"></span>es. </span></span></div><div class=\"t m0 x1 he y373 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y22b ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y22b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y22b ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Time<span class=\"_ _2\"></span>String<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3ee ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22c ff2 fs2 fc8 sc0 ls2 ws2\">const <span class=\"_ _4\"></span><span class=\"ff4 fc5\">std::stri<span class=\"_ _1\"></span>ng <span class=\"_ _4\"></span><span class=\"ff2 fc0\">g<span class=\"_ _1\"></span>etTimeString() <span class=\"fc8\">const <span class=\"_ _4\"></span><span class=\"ff4 fc5\">noexcept </span></span></span></span></div><div class=\"t m0 x6 hc y294 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc yce ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps <span class=\"_ _2\"></span>actuel<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>so<span class=\"_ _1\"></span>us <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>forme d&apos;une <span class=\"_ _2\"></span>chaîn<span class=\"_ _1\"></span>e <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>ca<span class=\"_ _1\"></span>ractère (exemple <span class=\"_ _2\"></span><span class=\"ff4\">00: 00.00<span class=\"ff2 ls60 ws49\">).</span><span class=\"ff2\"> </span></span></span></span></div><div class=\"t m0 x1 he y44e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f5 ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y1f5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1f5 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Time<span class=\"_ _2\"></span>Value<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y5d6 ff2 fs2 fc8 sc0 ls2 ws2\">unsigned <span class=\"_ _2\"></span>int <span class=\"fc0\">getTimeValue() </span><span class=\"ws14\">c<span class=\"_ _2\"></span>onst<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x6 hc y91 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1d7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22d ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> temps <span class=\"ls24 ws1c\">en</span> mi<span class=\"_ _2\"></span>llise<span class=\"_ _2\"></span>conde<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y93 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y451 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y451 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y451 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Minut<span class=\"_ _2\"></span>e<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y5d7 ff2 fs2 fc8 sc0 ls2 ws2\">unsigned in<span class=\"_ _2\"></span>t <span class=\"fc0\">getMinute() </span><span class=\"ws14\">co<span class=\"_ _2\"></span>nst<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x6 hc y455 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source </div><div class=\"t m0 x6 hc y37e ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _4\"></span><span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>minute. </span></span></div><div class=\"t m2 xa hc y1dd ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y1dd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1dd ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Secon<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y5d8 ff2 fs2 fc8 sc0 ls2 ws2\">unsigned in<span class=\"_ _2\"></span>t <span class=\"fc0\">getSecond() </span><span class=\"ws14\">c<span class=\"_ _2\"></span>ons<span class=\"_ _2\"></span>t<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x6 hc y5d9 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x21 h9 y5da ff6 fs3 fc0 sc0 ls1b ws13\">67<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf43\" class=\"pf w0 h0\" data-page-no=\"43\"><div class=\"pc pc43 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">68<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> s<span class=\"_ _2\"></span>econde<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">2.10</div><div class=\"t m3 x20 hd y2bc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2bc ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>MSecon<span class=\"_ _2\"></span>d </div><div class=\"t m0 x6 he y2bd ff2 fs2 fc8 sc0 ls2 ws2\">unsigned <span class=\"_ _4\"></span>int<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">getMSeco<span class=\"_ _1\"></span>nd() <span class=\"_ _4\"></span><span class=\"fc8\">c<span class=\"_ _1\"></span>onst </span></span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> m<span class=\"_ _2\"></span>illi<span class=\"_ _2\"></span>second<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">2.11</div><div class=\"t m3 x20 hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">co<span class=\"_ _2\"></span>mpareTi<span class=\"_ _2\"></span>me<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0 ws14\">com<span class=\"_ _1\"></span>pareTime(<span class=\"fc8 ws2\">unsi<span class=\"_ _1\"></span>gned int </span><span class=\"ls62 ws4c\">m,</span><span class=\"ws2\"> <span class=\"fc8\">unsigned int <span class=\"_ _2\"></span><span class=\"fc0\">s =<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fcb ls2e\">0<span class=\"fc0 ls2\">, <span class=\"fc8\">unsigned<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>int <span class=\"fc0 ls62 ws4c\">ms</span><span class=\"fc0\"> = <span class=\"_ _2\"></span><span class=\"fcb ls2e\">0<span class=\"fc0 ls2\">) <span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e ff2 fs2 fc0 sc0 ls2 ws2\">Compare <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>t<span class=\"_ _1\"></span>emps renseig<span class=\"_ _1\"></span>né <span class=\"ls24 ws1c\">et</span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>l&apos;obje<span class=\"_ _2\"></span>t. </span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ca ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">le</span> temps r<span class=\"_ _2\"></span>enseigné<span class=\"_ _1\"></span> e<span class=\"_ _2\"></span>st supérieur <span class=\"ls29 ws1f\">au</span> temps <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>l&apos;objet<span class=\"_ _1\"></span> <span class=\"ff4\">fa<span class=\"_ _2\"></span>ux <span class=\"ff2\">sin<span class=\"_ _2\"></span>on. </span></span></span></span></span></div><div class=\"t m2 xa hc y1ee ff4 fs2 fc4 sc0 ls2 ws14\">2.12</div><div class=\"t m3 x20 hd y1ee ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ee ff4 fs2 fc4 sc0 ls2 ws14\">oper<span class=\"_ _2\"></span>ator=<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1ef ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y353 ff2 fs2 fc0 sc0 ls2 ws2\">GameTime&amp; <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">operator<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">=(GameTime <span class=\"_ _2\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _4\"></span><span class=\"fc0\">&amp;t)<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x1 he y3ec ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y227 ff2 fs2 fc0 sc0 ls2 ws2\">Opérateur <span class=\"ff3 ws14\">d’égalité</span> <span class=\"_ _2\"></span>pour comparer deux ob<span class=\"_ _2\"></span>jets <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> type te<span class=\"_ _2\"></span>mps. </span></span></div><div class=\"t m2 xa hc ybd ff4 fs2 fc4 sc0 ls2 ws14\">2.13</div><div class=\"t m3 x20 hd ybd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc ybd ff4 fs2 fc4 sc0 ls2 ws14\">oper<span class=\"_ _2\"></span>ator&lt;<span class=\"_ _2\"></span>&lt;<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y372 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y228 ff4 fs2 fc5 sc0 ls2 ws2\">friend <span class=\"_ _2\"></span>std::ostream<span class=\"_ _1\"></span><span class=\"ff2 fc0\">&amp; </span><span class=\"ws14\">operator<span class=\"ff2 fc0 ls2e ws26\">&lt;&lt;(</span></span>std::ostre<span class=\"_ _1\"></span>am <span class=\"_ _2\"></span><span class=\"ff2 fc0\">&amp;flux, GameTime<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const<span class=\"_ _1\"></span> <span class=\"fc0 ls64 ws4e\">&amp;t)</span><span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 he y229 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y373 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22b ff2 fs2 fc0 sc0 ls2 ws2\">Operateur pour <span class=\"_ _2\"></span>afficher <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps avec <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>fl<span class=\"_ _1\"></span>ux <span class=\"ff4 ws14\">st<span class=\"_ _2\"></span>d::co<span class=\"_ _2\"></span>ut<span class=\"ff2 ws2\">. </span></span></span></span></div><div class=\"t m0 x1 he y3ee ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y22c ff4 fs2 fc4 sc0 ls1c\">3.</div><div class=\"t m3 xb hd y22c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y22c ff4 fs2 fc4 sc0 ls2 ws2\">Autres <span class=\"_ _2\"></span>Fonc<span class=\"_ _1\"></span>tions <span class=\"ls21 ws19\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> GameT<span class=\"_ _2\"></span>ime<span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x6 hc y294 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">operat<span class=\"_ _1\"></span>or<span class=\"ff2 fc0 ws2\">==(GameTime<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"fc0\">&amp;t1, <span class=\"_ _4\"></span>Ga<span class=\"_ _1\"></span>meTime <span class=\"_ _2\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">&amp;t2) </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y2e ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"ff4 fc5 ws14\">operator</span><span class=\"fc0\">&gt;(Ga<span class=\"_ _1\"></span>meTime </span>c<span class=\"_ _1\"></span>onst <span class=\"fc0\">&amp;t1, GameTime </span>co<span class=\"_ _1\"></span>nst <span class=\"fc0\">&amp;t2) </span></div><div class=\"t m0 x6 hc y211 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"ff4 fc5 ws14\">operator</span><span class=\"fc0\">&lt;(Ga<span class=\"_ _1\"></span>meTime </span>c<span class=\"_ _1\"></span>onst <span class=\"fc0\">&amp;t1, GameTime </span>co<span class=\"_ _1\"></span>nst <span class=\"fc0\">&amp;t2) </span></div><div class=\"t m0 x6 hc y44f ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y32 ff2 fs2 fc0 sc0 ls2 ws2\">Ces Opérateurs <span class=\"_ _2\"></span>pe<span class=\"_ _1\"></span>rmettent <span class=\"ls1e ws16\">de</span> faire <span class=\"_ _2\"></span>des comparaisons avec les <span class=\"_ _2\"></span>objets<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>type<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>temps<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y504 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y541 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y379 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y37a ff9 fs2 fc3 sc0 ls2 ws2\">Commande <span class=\"_ _2\"></span><span class=\"ls55 ws42\">du<span class=\"ls2 ws2\"> j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span><span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 h22 y5db ff9 fsb fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y5dc ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5dd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5de ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui permet de gérer les commandes <span class=\"ls1e ws16\">du</span> je<span class=\"_ _2\"></span>u. El<span class=\"_ _1\"></span>le prend <span class=\"ls24 ws1c\">en</span> compte <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>clavier <span class=\"ls29 ws1f\">et</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>souris sur PC <span class=\"ls24 ws1c\">et</span> devient <span class=\"ls2c ws21\">un</span> Game </div><div class=\"t m0 x6 he y5df ff2 fs2 fc0 sc0 ls2 ws2\">Pad Virtuel sur Mobile.<span class=\"_ _1\"></span> </div></div><div class=\"c x6 y5e0 w9 h21\"><div class=\"t m0 x0 hc y5e1 ff9 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y5e2 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>GameKey<span class=\"_ _1\"></span>Data </div></div><div class=\"c x6 y5e0 w9 h21\"><div class=\"t m0 x0 hc y5e3 ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d he y5e4 ff2 fs2 fc0 sc0 ls2 ws2\">GameKeyData<span class=\"_ _1\"></span> </div></div><div class=\"c x6 y5e0 w9 h21\"><div class=\"t m0 x0 hc y5aa ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/funct<span class=\"_ _2\"></span>ion/G<span class=\"_ _2\"></span>ameKe<span class=\"_ _2\"></span>yDat<span class=\"_ _2\"></span>a.h<span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf44\" class=\"pf w0 h0\" data-page-no=\"44\"><div class=\"pc pc44 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqA/5pv45JAIQCKIryItjBHK4GEITfRisIjoYwgiGEP2oTR1dX4ZztrW+7AACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoMiBkywAAAIiSURBVPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAA8LH6ln5LkhzDetUx2duzKdO759LddUxcBgAA8CMPfMUDbSISib0AAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">69<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1be ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts de <span class=\"_ _2\"></span>GameKeyD<span class=\"_ _2\"></span>ata<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y5e5 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y5e5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5e5 ff4 fs2 fc4 sc0 ls2 ws2\">enum <span class=\"_ _4\"></span>VirtualKeyI<span class=\"_ _1\"></span>ndex </div><div class=\"t m0 x6 hc y39f ff4 fs2 fc5 sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">VirtualKeyI<span class=\"_ _1\"></span>ndex; </span></div><div class=\"t m0 x2f he y5e6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y5e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5e8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he ye1 ff2 fs2 fc0 sc0 ls2 ws2\">Repérsente les <span class=\"_ _2\"></span>commandes<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">du</span> <span class=\"_ _4\"></span>jeu<span class=\"_ _4\"></span>. </div><div class=\"t m2 xa hc y5e9 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y5e9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5e9 ff4 fs2 fc4 sc0 ls2 ws2\">Game<span class=\"_ _2\"></span>KeyDa<span class=\"_ _2\"></span>ta </div><div class=\"t m0 x6 hc y5ea ff2 fs2 fc0 sc0 ls2 ws14\">Gam<span class=\"_ _2\"></span>eKeyD<span class=\"_ _2\"></span>ata(<span class=\"ff4 fc5\">i<span class=\"_ _2\"></span>s::<span class=\"ff2 fc0 ws2\">G<span class=\"_ _2\"></span>ameDis<span class=\"_ _2\"></span>play <span class=\"_ _2\"></span>*scene<span class=\"_ _2\"></span>) </span></span></div><div class=\"t m0 x6 hc y5eb ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5ec ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui <span class=\"_ _2\"></span>prend <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>pa<span class=\"_ _1\"></span>ramètre <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>scène. </span></span></div><div class=\"t m2 xa hc y5ed ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y5ed ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5ed ff4 fs2 fc4 sc0 ls2 ws14\">loa<span class=\"_ _2\"></span>dReso<span class=\"_ _2\"></span>urce<span class=\"_ _2\"></span>s<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y5ee ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5ef ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">loadResourc<span class=\"_ _1\"></span>es(<span class=\"fc8 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">use<span class=\"_ _1\"></span>PadColorBlack<span class=\"_ _1\"></span> = <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">fa<span class=\"_ _2\"></span>lse<span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></div><div class=\"t m0 x1 he y5f0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5f1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5f2 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> charger <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> textur<span class=\"_ _1\"></span>e qui <span class=\"_ _2\"></span>s<span class=\"_ _1\"></span>ervira à <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>réer les touches <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>Game <span class=\"_ _1\"></span>Pad Vi<span class=\"_ _2\"></span>rtuel<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y5f3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5f4 ff4 fs2 fca sc0 ls2 ws2\">Parameter <span class=\"_ _4\"></span><span class=\"ff2 fc0\">: </span></div><div class=\"t m0 xc hc y5f5 ff4 fs2 fc0 sc0 ls2 ws2\">usePadColorBlack<span class=\"_ _1\"></span> <span class=\"ff2\">change <span class=\"ls27 ws1d\">la<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> couleur <span class=\"_ _2\"></span><span class=\"ls1f ws17\">du<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>sprite du<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>Game Pad <span class=\"_ _2\"></span>Virt<span class=\"_ _2\"></span>uel. </span></span></span></span></span></div><div class=\"t m0 x1 he y5f6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y5f7 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y5f7 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5f7 ff4 fs2 fc4 sc0 ls2 ws14\">st<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he ya0 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">st<span class=\"_ _1\"></span>ep(<span class=\"fc8 ws2\">float const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _2\"></span>_TI<span class=\"_ _2\"></span>ME) </span></span></span></div><div class=\"t m0 x6 hc y5f8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5f9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y5fa ff2 fs2 fc0 sc0 ls2 ws2\">Met <span class=\"_ _2\"></span>à jour <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>p<span class=\"_ _1\"></span>osition <span class=\"ls1e ws16\">du</span> Game Pad <span class=\"_ _2\"></span>Virtuel<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>sur<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">l’é<span class=\"_ _2\"></span>c<span class=\"_ _1\"></span>ran<span class=\"ff2 ls65 ws2\"> <span class=\"ls24 ws1c\">et</span><span class=\"ls2\"> permet <span class=\"_ _2\"></span>aussi<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>détecter<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">l’utilisation</span> des <span class=\"_ _2\"></span>comma<span class=\"_ _2\"></span>ndes<span class=\"_ _2\"></span>. </span></span></span></div><div class=\"t m2 xa hc y5fb ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y5fb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5fb ff4 fs2 fc4 sc0 ls2 ws14\">dr<span class=\"_ _2\"></span>aw<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y5fc ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">draw(is::R<span class=\"_ _1\"></span>ender <span class=\"_ _2\"></span>&amp;surf<span class=\"_ _2\"></span>ace) </span></div><div class=\"t m0 x6 hc y5fd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5fe ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y95 ff2 fs2 fc0 sc0 ls2 ws2\">Affiche <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>Game<span class=\"_ _1\"></span> Pad <span class=\"_ _2\"></span>Vir<span class=\"_ _2\"></span>tuel. </div><div class=\"t m2 xa hc y5ff ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y5ff ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5ff ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyPau<span class=\"_ _2\"></span>sePre<span class=\"_ _2\"></span>ssed </div><div class=\"t m0 x6 he y600 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">m_keyPausePr<span class=\"_ _1\"></span>essed </span></div><div class=\"t m0 x6 hc y601 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y602 ff2 fs2 fc0 sc0 ls2 ws2\">Détermine <span class=\"ls28 ws1e\">si</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> touche <span class=\"ls1e ws16\">de</span> pause est <span class=\"_ _2\"></span>appuyé<span class=\"_ _2\"></span>e. </span></span></div></div><div class=\"c x6 y603 wf h2e\"><div class=\"t m0 x0 hc y604 ff4 fs2 fc0 sc0 ls2 ws2\">En<span class=\"_ _2\"></span>umérat<span class=\"_ _2\"></span>eur </div><div class=\"t m0 x0 he y605 ff2 fs2 fc0 sc0 ls2 ws2\">V_K<span class=\"_ _2\"></span>EY_L<span class=\"_ _2\"></span>EFT </div><div class=\"t m0 x0 he y606 ff2 fs2 fc0 sc0 ls2 ws2\">V_K<span class=\"_ _2\"></span>EY_R<span class=\"_ _2\"></span>IGHT </div><div class=\"t m0 x0 he y607 ff2 fs2 fc0 sc0 ls2 ws2\">V_K<span class=\"_ _2\"></span>EY_UP<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 he y608 ff2 fs2 fc0 sc0 ls2 ws2\">V_K<span class=\"_ _2\"></span>EY_DOW<span class=\"_ _2\"></span>N </div><div class=\"t m0 x0 he y609 ff2 fs2 fc0 sc0 ls2 ws2\">V_K<span class=\"_ _2\"></span>EY_A </div><div class=\"t m0 x0 he y60a ff2 fs2 fc0 sc0 ls2 ws2\">V_K<span class=\"_ _2\"></span>EY_B </div><div class=\"t m0 x0 he y60b ff2 fs2 fc0 sc0 ls2 ws2\">V_K<span class=\"_ _2\"></span>EY_N<span class=\"_ _2\"></span>ONE </div></div><div class=\"c x2b y603 w10 h2f\"><div class=\"t m0 x0 he y60c ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touch<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>directionn<span class=\"_ _1\"></span>elle G<span class=\"_ _2\"></span>AUCHE </div><div class=\"t m0 x0 he y60d ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>touche <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>irectionnell<span class=\"_ _1\"></span>e <span class=\"_ _4\"></span>DROITE<span class=\"_ _1\"></span> </span></span></div><div class=\"t m0 x0 he y60e ff2 fs2 fc0 sc0 ls2 ws2\">Représente la touch<span class=\"_ _1\"></span>e directionnelle HAU<span class=\"_ _1\"></span>T </div><div class=\"t m0 x0 he y60f ff2 fs2 fc0 sc0 ls2 ws2\">Représente la touch<span class=\"_ _1\"></span>e directionnelle BAS<span class=\"_ _1\"></span> </div><div class=\"t m0 x0 he y610 ff2 fs2 fc0 sc0 ls2 ws2\">Représente la touch<span class=\"_ _1\"></span>e A </div><div class=\"t m0 x0 he y611 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>touch<span class=\"_ _1\"></span>e <span class=\"_ _4\"></span><span class=\"ls66\">B </span></span></span></div><div class=\"t m0 x0 he y612 ff2 fs2 fc0 sc0 ls2 ws2\">Aucune touche<span class=\"_ _1\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf45\" class=\"pf w0 h0\" data-page-no=\"45\"><div class=\"pc pc45 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyLef<span class=\"_ _2\"></span>tPres<span class=\"_ _2\"></span>sed </div><div class=\"t m0 x6 he y201 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">m_keyLeftPr<span class=\"_ _1\"></span>essed </span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y613 ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> touche <span class=\"_ _2\"></span>GAUCHE. </span></span></div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyRig<span class=\"_ _2\"></span>htPre<span class=\"_ _2\"></span>ssed<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y1e8 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">m_keyRightP<span class=\"_ _1\"></span>ressed </span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y44d ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> touche D<span class=\"_ _2\"></span>ROITE<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y1c9 ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y1c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c9 ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyUp<span class=\"_ _2\"></span>Presse<span class=\"_ _2\"></span>d </div><div class=\"t m0 x6 he y441 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">m_keyUpPress<span class=\"_ _1\"></span>ed </span></div><div class=\"t m0 x6 hc y232 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y224 ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> touche H<span class=\"_ _2\"></span>AUT. </span></span></div><div class=\"t m2 xa hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">2.10</div><div class=\"t m3 x20 hd y207 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyDow<span class=\"_ _2\"></span>nPress<span class=\"_ _2\"></span>ed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y208 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_keyD<span class=\"_ _2\"></span>ownPr<span class=\"_ _2\"></span>essed </span></div><div class=\"t m0 x6 hc y209 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y385 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y290 ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> touche B<span class=\"_ _2\"></span>AS<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">2.11</div><div class=\"t m3 x20 hd y20b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyAPre<span class=\"_ _2\"></span>ssed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y449 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_key<span class=\"_ _2\"></span>APres<span class=\"_ _2\"></span>sed </span></div><div class=\"t m0 x1 he y4b3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y20c ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y614 ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>touche <span class=\"ls67 ws4f\">A.</span> </span></span></div><div class=\"t m2 xa hc y2e ff4 fs2 fc4 sc0 ls2 ws14\">2.12</div><div class=\"t m3 x20 hd y2e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2e ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyBPr<span class=\"_ _2\"></span>essed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y211 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_keyB<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed </span></div><div class=\"t m0 x6 hc y1f6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y267 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y552 ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>touche <span class=\"ls68 ws50\">B.</span> </span></span></div><div class=\"t m2 xa hc y1f9 ff4 fs2 fc4 sc0 ls2 ws14\">2.13</div><div class=\"t m3 x20 hd y1f9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f9 ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyAUse<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y1d9 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_key<span class=\"_ _2\"></span>AUsed </span></div><div class=\"t m0 x6 hc y1da ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y615 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1db ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touche <span class=\"_ _1\"></span>A quand elle <span class=\"_ _2\"></span>est utilisé<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m2 xa hc y1fe ff4 fs2 fc4 sc0 ls2 ws14\">2.14</div><div class=\"t m3 x20 hd y1fe ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1fe ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyBUs<span class=\"_ _2\"></span>ed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y21d ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_keyB<span class=\"_ _2\"></span>Used </span></div><div class=\"t m0 x6 hc y573 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y616 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y617 ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> touche B quand elle <span class=\"_ _2\"></span>est ut<span class=\"_ _2\"></span>ilisée<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x21 h9 y4aa ff6 fs3 fc0 sc0 ls1b ws13\">70<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf46\" class=\"pf w0 h0\" data-page-no=\"46\"><div class=\"pc pc46 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">2.15</div><div class=\"t m3 x20 hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyLef<span class=\"_ _2\"></span>tUse<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_key<span class=\"_ _2\"></span>LeftU<span class=\"_ _2\"></span>sed </span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y618 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y108 ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>touche GAUCHE<span class=\"_ _1\"></span> quand elle est <span class=\"_ _4\"></span>utilisé<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.16</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyRig<span class=\"_ _2\"></span>htUse<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y350 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_key<span class=\"_ _2\"></span>RightU<span class=\"_ _2\"></span>sed </span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1eb ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>touche DROITE<span class=\"_ _1\"></span> quand elle est <span class=\"_ _4\"></span>utilisée<span class=\"_ _4\"></span>. </span></span></div><div class=\"t m2 xa hc y1c9 ff4 fs2 fc4 sc0 ls2 ws14\">2.17</div><div class=\"t m3 x20 hd y1c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c9 ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyUpU<span class=\"_ _2\"></span>sed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y619 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_keyU<span class=\"_ _2\"></span>pUsed </span></div><div class=\"t m0 x6 hc y1ee ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2b7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y61a ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touche<span class=\"_ _1\"></span> HAUT quand elle <span class=\"_ _2\"></span>est uti<span class=\"_ _2\"></span>lisée<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y1f0 ff4 fs2 fc4 sc0 ls2 ws14\">2.18</div><div class=\"t m3 x20 hd y1f0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f0 ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyDow<span class=\"_ _2\"></span>nUsed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y227 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_keyD<span class=\"_ _2\"></span>ownUse<span class=\"_ _2\"></span>d </span></div><div class=\"t m0 x6 hc ybd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y150 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y61b ff2 fs2 fc0 sc0 ls2 ws2\">Stock <span class=\"ff3 ws14\">l’état</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> touche <span class=\"_ _2\"></span>BA<span class=\"_ _1\"></span>S quand elle est <span class=\"_ _2\"></span>utili<span class=\"_ _2\"></span>sée. </span></span></div><div class=\"t m2 xa hc y22a ff4 fs2 fc4 sc0 ls2 ws14\">2.19</div><div class=\"t m3 x20 hd y22a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y22a ff4 fs2 fc4 sc0 ls2 ws14\">m_d<span class=\"_ _2\"></span>isab<span class=\"_ _2\"></span>leAll<span class=\"_ _2\"></span>Key<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y2a ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_dis<span class=\"_ _2\"></span>ableAl<span class=\"_ _2\"></span>lKey </span></div><div class=\"t m0 x1 he y3ee ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y59c ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y61c ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> désactiver <span class=\"_ _2\"></span>tous<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">les<span class=\"ls2 ws2\"> commandes <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xa hc y9f ff4 fs2 fc4 sc0 ls2 ws14\">2.20</div><div class=\"t m3 x20 hd y9f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y9f ff4 fs2 fc4 sc0 ls2 ws14\">m_h<span class=\"_ _2\"></span>ideGa<span class=\"_ _2\"></span>mePad<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y1f5 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">m_hide<span class=\"_ _2\"></span>GameP<span class=\"_ _2\"></span>ad </span></div><div class=\"t m0 x6 hc y1d5 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y596 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y32 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>cacher<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>Game<span class=\"_ _1\"></span> Pad Virtuel <span class=\"_ _2\"></span>sur<span class=\"_ _1\"></span> Mo<span class=\"_ _2\"></span>bile. </div><div class=\"t m2 xa hc y541 ff4 fs2 fc4 sc0 ls2 ws14\">2.21</div><div class=\"t m3 x20 hd y541 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y541 ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyboa<span class=\"_ _2\"></span>rdA </div><div class=\"t m0 x6 he y542 ff2 fs2 fc0 sc0 ls2 ws2\">sf::Keyboard::Key<span class=\"_ _1\"></span> m_keyboardA<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 hc y454 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y61d ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touc<span class=\"_ _1\"></span>he <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>cla<span class=\"_ _1\"></span>vier qui <span class=\"_ _2\"></span>sert de touche <span class=\"ls67 ws4f\">A.</span> </div><div class=\"t m2 xa hc y61e ff4 fs2 fc4 sc0 ls2 ws14\">2.22</div><div class=\"t m3 x20 hd y61e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y61e ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyboa<span class=\"_ _2\"></span>rdB </div><div class=\"t m0 x6 he y1dd ff2 fs2 fc0 sc0 ls2 ws2\">sf::Keyboard::Key m_k<span class=\"_ _1\"></span>eyboardB </div><div class=\"t m0 x6 hc y61f ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y620 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touc<span class=\"_ _1\"></span>he <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>cla<span class=\"_ _1\"></span>vier qui <span class=\"_ _2\"></span>sert de touche <span class=\"ls68 ws50\">B.</span> </div><div class=\"t m0 x21 h9 y382 ff6 fs3 fc0 sc0 ls1b ws13\">71<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf47\" class=\"pf w0 h0\" data-page-no=\"47\"><div class=\"pc pc47 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">2.23</div><div class=\"t m3 x20 hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyboa<span class=\"_ _2\"></span>rdLef<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Keyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>::Ke<span class=\"_ _2\"></span>y <span class=\"_ _11\"> </span>m_ke<span class=\"_ _2\"></span>yboar<span class=\"_ _2\"></span>dLef<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y613 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touc<span class=\"_ _1\"></span>he <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>cla<span class=\"_ _1\"></span>vier qui sert <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>touche<span class=\"_ _1\"></span> GAU<span class=\"_ _2\"></span>CHE. </span></span></div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.24</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyboa<span class=\"_ _2\"></span>rdRig<span class=\"_ _2\"></span>ht </div><div class=\"t m0 x6 he y1e8 ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Keyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>::Ke<span class=\"_ _2\"></span>y <span class=\"_ _11\"> </span>m_keyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>Righ<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y44d ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touc<span class=\"_ _1\"></span>he <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>cla<span class=\"_ _1\"></span>vier qui <span class=\"_ _2\"></span>sert de touche DROITE.<span class=\"_ _2\"></span> </div><div class=\"t m2 xa hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">2.25</div><div class=\"t m3 x20 hd y203 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y203 ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyboa<span class=\"_ _2\"></span>rdUp </div><div class=\"t m0 x6 he y204 ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Keyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>::Ke<span class=\"_ _2\"></span>y <span class=\"_ _11\"> </span>m_<span class=\"_ _2\"></span>keybo<span class=\"_ _2\"></span>ardUp<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y205 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y224 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touc<span class=\"_ _1\"></span>he <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>cla<span class=\"_ _1\"></span>vier qui sert <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>touche<span class=\"_ _1\"></span> HAUT<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y207 ff4 fs2 fc4 sc0 ls2 ws14\">2.26</div><div class=\"t m3 x20 hd y207 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y207 ff4 fs2 fc4 sc0 ls2 ws2\">m_k<span class=\"_ _2\"></span>eyboa<span class=\"_ _2\"></span>rdDown<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y442 ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Keyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>::Ke<span class=\"_ _2\"></span>y <span class=\"_ _11\"> </span>m_ke<span class=\"_ _2\"></span>yboar<span class=\"_ _2\"></span>dDown<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y209 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y228 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touc<span class=\"_ _1\"></span>he <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>cla<span class=\"_ _1\"></span>vier qui <span class=\"_ _2\"></span>sert de touche BAS<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y20b ff4 fs2 fc4 sc0 ls2 ws14\">2.27</div><div class=\"t m3 x20 hd y20b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20b ff4 fs2 fc4 sc0 ls2 ws2\">m_m<span class=\"_ _2\"></span>oveKe<span class=\"_ _2\"></span>yPres<span class=\"_ _2\"></span>sed </div><div class=\"t m0 x6 he y2a ff2 fs2 fc0 sc0 ls2 ws2\">VirtualKeyIndex m_mov<span class=\"_ _1\"></span>eKeyPressed </div><div class=\"t m0 x6 hc y20c ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y12a ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>savoir <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> les <span class=\"_ _2\"></span>touch<span class=\"_ _1\"></span>es directionnelles virtuelles<span class=\"_ _1\"></span> sont <span class=\"_ _2\"></span>appu<span class=\"_ _2\"></span>yées. </span></span></div><div class=\"t m2 xa hc y2dc ff4 fs2 fc4 sc0 ls2 ws14\">2.28</div><div class=\"t m3 x20 hd y2dc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2dc ff4 fs2 fc4 sc0 ls2 ws2\">m_a<span class=\"_ _2\"></span>ctio<span class=\"_ _2\"></span>nKeyPr<span class=\"_ _2\"></span>essed<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y295 ff2 fs2 fc0 sc0 ls2 ws2\">VirtualKeyIndex m_ac<span class=\"_ _1\"></span>tionKeyPressed </div><div class=\"t m0 x6 hc y131 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y91 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>savoir<span class=\"_ _1\"></span> <span class=\"ls28 ws1e\">si</span> <span class=\"_ _4\"></span>l<span class=\"_ _1\"></span>es touches virtuelles <span class=\"ls69 ws51\">A,<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> B sont <span class=\"_ _2\"></span>appuyé<span class=\"_ _2\"></span>es. </span></span></div><div class=\"t m2 xa hc y215 ff4 fs2 fc4 sc0 ls2 ws14\">2.29</div><div class=\"t m3 x20 hd y215 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y215 ff4 fs2 fc4 sc0 ls2 ws14\">ke<span class=\"_ _2\"></span>yLeft<span class=\"_ _2\"></span>Press<span class=\"_ _2\"></span>ed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y239 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">keyLef<span class=\"_ _2\"></span>tPre<span class=\"_ _2\"></span>ssed<span class=\"_ _2\"></span>() </span></div><div class=\"t m0 x6 hc y217 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y621 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y219 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> la touche <span class=\"_ _2\"></span>direction<span class=\"_ _1\"></span>nelle GAUCHE<span class=\"_ _1\"></span> e<span class=\"_ _2\"></span>st<span class=\"_ _1\"></span> appuyée,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff4\">faux <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span>non<span class=\"_ _4\"></span>. </span></span></span></span></span></div><div class=\"t m0 x1 he y21a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y21b ff4 fs2 fc4 sc0 ls2 ws14\">2.30</div><div class=\"t m3 x20 hd y21b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y21b ff4 fs2 fc4 sc0 ls2 ws14\">ke<span class=\"_ _2\"></span>yRig<span class=\"_ _2\"></span>htPres<span class=\"_ _2\"></span>sed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y4b4 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">keyRi<span class=\"_ _2\"></span>ghtPre<span class=\"_ _2\"></span>ssed<span class=\"_ _2\"></span>() </span></div><div class=\"t m0 x6 hc y21e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y447 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y21f ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> la touche <span class=\"_ _2\"></span>direction<span class=\"_ _1\"></span>nelle DROITE<span class=\"_ _1\"></span> est <span class=\"_ _2\"></span>ap<span class=\"_ _1\"></span>puyée, <span class=\"ff4\">faux <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x21 h9 y220 ff6 fs3 fc0 sc0 ls1b ws13\">72<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf48\" class=\"pf w0 h0\" data-page-no=\"48\"><div class=\"pc pc48 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbsRHAIAwEQeNx/92oPM3TATnybgf8KLmAleQBAABgqNcEAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+EwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+kwAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOozAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwQAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4TAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6TAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6jMBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKrPBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABU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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">73<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">2.31</div><div class=\"t m3 x20 hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">ke<span class=\"_ _2\"></span>yUpPre<span class=\"_ _2\"></span>ssed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">keyUpPr<span class=\"_ _2\"></span>esse<span class=\"_ _2\"></span>d() </span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1c2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c3 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> la touche directionnelle HAUT<span class=\"_ _1\"></span> e<span class=\"_ _2\"></span>st appuyée, <span class=\"ff4\">fa<span class=\"_ _2\"></span>ux <span class=\"ff2 ls28 ws1e\">si<span class=\"_ _1\"></span></span><span class=\"ff2\"> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></span></span></div><div class=\"t m0 x1 he y34f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.32</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">ke<span class=\"_ _2\"></span>yDownPr<span class=\"_ _2\"></span>esse<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y350 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">keyDown<span class=\"_ _2\"></span>Pres<span class=\"_ _2\"></span>sed(<span class=\"_ _2\"></span>) </span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> la touche <span class=\"_ _2\"></span>direction<span class=\"_ _1\"></span>nelle <span class=\"ls5d ws47\">BAS</span> est <span class=\"_ _2\"></span>appuyé<span class=\"_ _1\"></span>e, <span class=\"_ _2\"></span><span class=\"ff4\">faux<span class=\"_ _1\"></span> <span class=\"ff2 ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> non<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1c8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ec ff4 fs2 fc4 sc0 ls2 ws14\">2.33</div><div class=\"t m3 x20 hd y1ec ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ec ff4 fs2 fc4 sc0 ls2 ws14\">ke<span class=\"_ _2\"></span>yAPres<span class=\"_ _2\"></span>sed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y619 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">keyAPre<span class=\"_ _2\"></span>ssed<span class=\"_ _2\"></span>() </span></div><div class=\"t m0 x6 hc y1ee ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y223 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y224 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2 ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> touche <span class=\"_ _2\"></span>A<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>est<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>appuy<span class=\"_ _1\"></span>ée, <span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span>non<span class=\"_ _4\"></span>. </span></span></span></div><div class=\"t m0 x1 he y1cc ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y622 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y623 ff4 fs2 fc4 sc0 ls2 ws14\">2.34</div><div class=\"t m3 x20 hd y623 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y623 ff4 fs2 fc4 sc0 ls2 ws14\">ke<span class=\"_ _2\"></span>yBPre<span class=\"_ _2\"></span>ssed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y3ab ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">keyBPre<span class=\"_ _2\"></span>ssed<span class=\"_ _2\"></span>() </span></div><div class=\"t m0 x6 hc y624 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y431 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y432 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2 ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> touche <span class=\"_ _2\"></span>B<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>est<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>appuy<span class=\"_ _1\"></span>ée, <span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span>non<span class=\"_ _4\"></span>. </span></span></span></div><div class=\"t m0 x1 he y625 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y386 ff4 fs2 fc4 sc0 ls2 ws14\">2.35</div><div class=\"t m3 x20 hd y386 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y386 ff4 fs2 fc4 sc0 ls2 ws14\">vi<span class=\"_ _2\"></span>rtualK<span class=\"_ _2\"></span>eyPre<span class=\"_ _2\"></span>ssed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y626 ff2 fs2 fc8 sc0 ls2 ws2\">boo<span class=\"_ _2\"></span>l <span class=\"_ _a\"></span><span class=\"fc0\">virt<span class=\"_ _2\"></span>ualKe<span class=\"_ _2\"></span>yPre<span class=\"_ _2\"></span>ssed(V<span class=\"_ _2\"></span>irtua<span class=\"_ _2\"></span>lKeyI<span class=\"_ _2\"></span>ndex <span class=\"_ _a\"></span>vi<span class=\"_ _2\"></span>rtual<span class=\"_ _2\"></span>KeyIn<span class=\"_ _2\"></span>dex) </span></div><div class=\"t m0 x6 hc y569 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y627 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y435 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>touche<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>v<span class=\"_ _1\"></span>irtuelle <span class=\"_ _2\"></span>co<span class=\"_ _1\"></span>rrespondante est <span class=\"_ _2\"></span>appuyée, <span class=\"_ _1\"></span><span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></div><div class=\"t m0 x1 he y246 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y247 ff4 fs2 fc4 sc0 ls1c\">3.</div><div class=\"t m3 xb hd y247 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y247 ff4 fs2 fc4 sc0 ls2 ws2\">Autres fonctions <span class=\"_ _2\"></span><span class=\"ls21 ws19\">de<span class=\"ls2 ws2\"> Ga<span class=\"_ _2\"></span>meKeyD<span class=\"_ _2\"></span>ata<span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 hc y436 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y437 ff2 fs2 fc0 sc0 ls2 ws2\">Ces fonctions <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">se<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>trouv<span class=\"_ _1\"></span>ent dans <span class=\"ff4\">G<span class=\"_ _2\"></span>ameKe<span class=\"_ _2\"></span>yName.<span class=\"_ _2\"></span>h. </span></span></span></div><div class=\"t m0 x6 hc y628 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/funct<span class=\"_ _2\"></span>ion/G<span class=\"_ _2\"></span>ameKe<span class=\"_ _2\"></span>yName<span class=\"_ _2\"></span>.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x1 hc y24a ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y629 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y629 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y629 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y62a ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y62b ff4 fs2 fc5 sc0 ls2 ws2\">inline <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"_ _2\"></span>char <span class=\"fc0 ws14\">*getKeyNa<span class=\"_ _1\"></span>me(</span>const <span class=\"fc0\">sf::Keyboard::Key k<span class=\"_ _2\"></span>ey<span class=\"_ _2\"></span>) </span></span></div><div class=\"t m0 x1 he y62c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y62d ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y544 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> nom <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> touche du clavier <span class=\"_ _2\"></span>sous f<span class=\"_ _1\"></span>orme <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> chaine <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>caractèè<span class=\"_ _2\"></span>re. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y62e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y62f ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y62f ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y62f ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y630 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y513 ff4 fs2 fc5 sc0 ls2 ws2\">inline <span class=\"_ _4\"></span>std::w<span class=\"_ _1\"></span>string <span class=\"ff2 fc0 ws14\">getKeyWName(<span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"fc0\">sf::K<span class=\"_ _1\"></span>eyboard::Key<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>ke<span class=\"_ _2\"></span>y) </span></span></span></div><div class=\"t m0 x1 he y631 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5b5 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y632 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y633 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> nom de <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>touche du clavier sous forme <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> chaine <span class=\"ff4 ws14\">s<span class=\"_ _2\"></span>td::w<span class=\"_ _2\"></span>stri<span class=\"_ _2\"></span>ng<span class=\"ff2 ws2\">. </span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf49\" class=\"pf w0 h0\" data-page-no=\"49\"><div class=\"pc pc49 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQf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BwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAf7dvtzoERgEch72bSYqmYZLJGkHSJZuC6TY3IKlspppq3IHExh24D4KkHIWNTTUfe5503vpvv/PuAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUB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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">74<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 h1f y201 ff7 fs2 fc3 sc0 ls2 ws2\">Game S<span class=\"_ _2\"></span>lide<span class=\"_ _2\"></span>r<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h1f y634 ff7 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y635 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y635 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y635 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>Game<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>Slider </div><div class=\"t m0 x6 hc y636 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"ff2 fc0 ws14\">TransitionE<span class=\"_ _1\"></span>ffect</span><span class=\"fc4 ls4d\">;</span><span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y637 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/gra<span class=\"_ _2\"></span>phic/<span class=\"_ _2\"></span><span class=\"ff4\">GameSl<span class=\"_ _2\"></span>ider<span class=\"ff9 ls4e ws3b\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 hc y638 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y639 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y63a ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"_ _2\"></span>permet<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>fa<span class=\"_ _1\"></span>ire des glissades <span class=\"_ _2\"></span>avec<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1e ws16\">doigt</span> <span class=\"ls2a ws20\">ou</span> sourie pour <span class=\"_ _2\"></span>navi<span class=\"_ _1\"></span>guer dans <span class=\"_ _2\"></span>les<span class=\"_ _1\"></span> me<span class=\"_ _2\"></span>nu. </span></span></div><div class=\"t m2 xa hc y63b ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y63b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y63b ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts publics <span class=\"ls21 ws19\">de</span> <span class=\"_ _2\"></span>Ga<span class=\"_ _1\"></span>me S<span class=\"_ _2\"></span>lider<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y63c ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y63c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y63c ff4 fs2 fc4 sc0 ls2 ws2\">Slider <span class=\"_ _4\"></span>Direc<span class=\"_ _1\"></span>tion </div><div class=\"t m0 x6 hc y6 ff4 fs2 fc5 sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">SlideDirection;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 xa hc y232 ff4 fs2 fc0 sc0 ls2 ws2\">Sli<span class=\"_ _2\"></span>deDi<span class=\"_ _2\"></span>rectio<span class=\"_ _2\"></span>n </div><div class=\"t m0 xa he y223 ff2 fs2 fc0 sc0 ls2 ws2\">SLI<span class=\"_ _2\"></span>DE_NO<span class=\"_ _2\"></span>NE <span class=\"_ _12\"> </span>Représente aucune glissa<span class=\"_ _1\"></span>de </div><div class=\"t m0 xa he y63d ff2 fs2 fc0 sc0 ls2 ws2\">SLI<span class=\"_ _2\"></span>DE_UP <span class=\"_ _13\"> </span>Représente glissade ve<span class=\"_ _1\"></span>rs le haut </div><div class=\"t m0 xa he y63e ff2 fs2 fc0 sc0 ls2 ws2\">SLI<span class=\"_ _2\"></span>DE_DOW<span class=\"_ _2\"></span>N <span class=\"_ _14\"> </span>Représente glissade ve<span class=\"_ _1\"></span>rs le bas </div><div class=\"t m0 xa he y63f ff2 fs2 fc0 sc0 ls2 ws2\">SLI<span class=\"_ _2\"></span>DE_R<span class=\"_ _2\"></span>IGHT <span class=\"_ _15\"> </span>Représente glissade ve<span class=\"_ _1\"></span>rs la droite </div><div class=\"t m0 xa he y3a9 ff2 fs2 fc0 sc0 ls2 ws2\">SLI<span class=\"_ _2\"></span>DE_L<span class=\"_ _2\"></span>EFT <span class=\"_ _16\"> </span>Représente<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>glissade vers <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> ga<span class=\"_ _2\"></span>uche </span></span></div><div class=\"t m0 x1 he y640 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y641 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y642 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y643 ff2 fs2 fc0 sc0 ls2 ws2\">Représenter <span class=\"ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> type <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> glissade fait <span class=\"_ _4\"></span>pa<span class=\"_ _1\"></span>r <span class=\"ff3 ws14\">l’uti<span class=\"_ _2\"></span>lisate<span class=\"_ _2\"></span>ur.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y644 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y644 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y644 ff4 fs2 fc4 sc0 ls2 ws2\">Game<span class=\"_ _2\"></span>Slid<span class=\"_ _2\"></span>er </div><div class=\"t m0 x6 hc y645 ff2 fs2 fc0 sc0 ls2 ws14\">Gam<span class=\"_ _2\"></span>eSli<span class=\"_ _2\"></span>der(<span class=\"ff4 fc5\">is<span class=\"_ _2\"></span>::<span class=\"ff2 fc0 ws2\">Game<span class=\"_ _2\"></span>Disp<span class=\"_ _2\"></span>lay *<span class=\"_ _2\"></span>scene<span class=\"_ _2\"></span>) </span></span></div><div class=\"t m0 x6 hc y154 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y646 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur qui <span class=\"_ _2\"></span>prend en paramètre <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>cène <span class=\"_ _2\"></span>da<span class=\"_ _1\"></span>ns laquelle <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>fonction gliss<span class=\"_ _1\"></span>ade <span class=\"_ _2\"></span>s<span class=\"_ _1\"></span>era utili<span class=\"_ _2\"></span>sée. </div><div class=\"t m2 xa hc y647 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y647 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y647 ff4 fs2 fc4 sc0 ls2 ws14\">st<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y648 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y649 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">st<span class=\"_ _1\"></span>ep(<span class=\"fc8 ws2\">float const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _2\"></span>_TI<span class=\"_ _2\"></span>ME) </span></span></span></div><div class=\"t m0 x6 hc y64a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y64b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y64c ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> mettre <span class=\"_ _2\"></span>à jour <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _4\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y406 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y406 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y406 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Slider<span class=\"_ _2\"></span>Dire<span class=\"_ _2\"></span>ction </div><div class=\"t m0 x6 he y408 ff2 fs2 fc0 sc0 ls2 ws2\">SlideDirection <span class=\"_ _2\"></span>getSlideDirection()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst </span></div><div class=\"t m0 x6 hc y64d ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y64e ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> type <span class=\"ls1f ws17\">de</span> glissade <span class=\"_ _2\"></span>effectu<span class=\"_ _1\"></span>ée par <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’utilisa<span class=\"_ _1\"></span>teur<span class=\"ff2 ws2\"> (Prend <span class=\"ls29 ws1f\">en<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> charge <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>cas <span class=\"ls2a ws20\">ou</span> <span class=\"ff3 ws14\">l’utilisateur</span> <span class=\"ff3 ws14\">n’a</span> pas <span class=\"_ _2\"></span>fait<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> g<span class=\"_ _2\"></span>lissa<span class=\"_ _2\"></span>de). </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y64f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y43c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y650 ff9 fs2 fc3 sc0 ls2 ws2\">Game <span class=\"_ _2\"></span>Systè<span class=\"_ _2\"></span>me<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y651 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y368 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y368 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y368 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _2\"></span>GameSy<span class=\"_ _2\"></span>stem<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4a\" class=\"pf w0 h0\" data-page-no=\"4a\"><div class=\"pc pc4a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcr0psURTA4bvvnCYDghj9h/0E0xEUTBOsJrFMm2BRUJvFYNMiwlRBTUbFZhR8Cl/AZDTMvvmCd2bCDZ61v+8JZq29y4/NmZRz/gUAAEBQv60AAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANVnBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAICAqsLn73Q6o9Govb//4+Njbm7OPQYAAP4l5ZxLnj/A+Ckl9xgAAFB9AAAAJfJdHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoA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AED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAABAO1RWENLLy8vX15c9tE7TNLOzs/YAAIDqY4LhcPj5+WkPrXN5ean6AAD4v1LO2RYAAACi8l0fAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6vvTvh3jRAhEARj2ZTahtqOkMNwCWw9gssneZr2CiaWHMJzAQ0i21IqKhAvAWG4sbYwM39dRznuQ8BcDAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAADgvzgYQZGGYViWpaQTtW1bVZXNAgDAb0XO2RTK03XdPM8lnajv+6ZpbBYAAFQfAAAAV+71AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAIAyHXZ+/pyzlyAiDAEAAIr94d959qSU1nXd8wTGcazr2pcAAACqDwAAgO1xrw8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAPIF5fgAAAJKSURBVAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAPyovueH14iIeH98+bwcI97uPm5P5+vz0+n+63KMuEkpxZZN02TtAADwB/L2FbGHb+qqlaZpNUObAAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">75<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"_ _2\"></span><span class=\"ff2 fc0\">GameSy<span class=\"_ _2\"></span>stem<span class=\"_ _2\"></span>; </span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/funct<span class=\"_ _2\"></span>ion/G<span class=\"_ _2\"></span>ame<span class=\"_ _2\"></span>System<span class=\"_ _2\"></span>.h<span class=\"fc0 ws2\"> </span></span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2ee ff2 fs2 fc0 sc0 ls2 ws2\">Classe <span class=\"_ _1\"></span><span class=\"ls1e ws16\">de</span> base <span class=\"_ _1\"></span>qui per<span class=\"_ _1\"></span>met <span class=\"ff3 ws14\">d’a<span class=\"_ _1\"></span>ssurer</span><span class=\"ls1a\"> <span class=\"ls1d ws15\">le</span></span> partage <span class=\"_ _1\"></span>des info<span class=\"_ _1\"></span>rmations <span class=\"ls1e ws16\">du<span class=\"_ _1\"></span></span> jeu <span class=\"_ _1\"></span>entre l<span class=\"_ _1\"></span>es dif<span class=\"_ _1\"></span>férents c<span class=\"_ _1\"></span>omposants <span class=\"_ _1\"></span>du <span class=\"_ _1\"></span>moteur<span class=\"_ _1\"></span> de </div><div class=\"t m0 x6 hc y9a ff2 fs2 fc0 sc0 ls2 ws2\">jeu. Elle contient l<span class=\"_ _1\"></span>es variables<span class=\"_ _1\"></span> globales <span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span></span> fonctions qui as<span class=\"_ _1\"></span>surent le <span class=\"_ _1\"></span>bon fonction<span class=\"_ _1\"></span>nement du <span class=\"_ _1\"></span>moteur. <span class=\"_ _1\"></span><span class=\"ff9 ls6a ws52\">Elle</span><span class=\"ff9\"> permet au<span class=\"_ _1\"></span>ssi </span></div><div class=\"t m0 x6 hc y169 ff9 fs2 fc0 sc0 ls2 ws2\">de stocker des resourc<span class=\"_ _1\"></span>es (Son<span class=\"_ _1\"></span>s, Musiques, Images,<span class=\"_ _1\"></span> Polices) de façons perm<span class=\"_ _1\"></span>anentes !<span class=\"_ _9\"></span> </div><div class=\"t m2 xa hc y652 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y652 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y652 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts de <span class=\"_ _2\"></span>GameSys<span class=\"_ _2\"></span>tem<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y16b ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y16b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y16b ff4 fs2 fc4 sc0 ls2 ws2\">enum <span class=\"_ _4\"></span>Valid<span class=\"_ _1\"></span>ationButton </div><div class=\"t m0 x6 hc y16d ff4 fs2 fc5 sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">ValidationButto<span class=\"_ _1\"></span>n; </span></div><div class=\"t m0 xa hc y10f ff4 fs2 fc0 sc0 ls2 ws2\">En<span class=\"_ _2\"></span>émerat<span class=\"_ _2\"></span>eur </div><div class=\"t m0 xa he y653 ff2 fs2 fc0 sc0 ls2 ws2\">MO<span class=\"_ _4\"></span>USE <span class=\"_ _17\"> </span>Représente <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> bouton <span class=\"ls1f ws17\">de<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> validation <span class=\"_ _1\"></span>de <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>ouris (s&apos;il est <span class=\"_ _2\"></span>util<span class=\"_ _1\"></span>isé, <span class=\"ls3f ws2f\">il</span> <span class=\"_ _2\"></span>devient<span class=\"_ _1\"></span> une <span class=\"_ _2\"></span>action tactile sur </span></span></span></span></div><div class=\"t m0 x31 he y654 ff2 fs2 fc0 sc0 ls2 ws2\">Mob<span class=\"_ _2\"></span>ile) </div><div class=\"t m0 xa he y655 ff2 fs2 fc0 sc0 ls2 ws2\">KEY<span class=\"_ _2\"></span>BOAR<span class=\"_ _2\"></span>D <span class=\"_ _18\"> </span>Représente<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>bouton <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> validation du clav<span class=\"_ _2\"></span>ier </span></span></span></span></div><div class=\"t m0 xa he y656 ff2 fs2 fc0 sc0 ls2 ws2\">ALL_<span class=\"_ _2\"></span>BUT<span class=\"_ _2\"></span>TONS <span class=\"_ _19\"> </span>Représente <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> bouton <span class=\"ls1f ws17\">de<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> validation <span class=\"_ _1\"></span>de <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>ouris <span class=\"ls24 ws1c\">et</span> <span class=\"ls1e ws16\">du</span> clavier <span class=\"_ _2\"></span>(s&apos;il<span class=\"_ _1\"></span> e<span class=\"_ _2\"></span>st<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>ut<span class=\"_ _1\"></span>ilisé, il devient une </span></span></span></span></div><div class=\"t m0 x31 he y657 ff2 fs2 fc0 sc0 ls2 ws2\">action tactile sur Mobile)<span class=\"_ _1\"></span> </div><div class=\"t m0 x1 he y658 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y418 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y659 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y65a ff2 fs2 fc0 sc0 ls2 ws2\">Représenter <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>touche <span class=\"ls1e ws16\">de</span> validation sur PC, <span class=\"_ _2\"></span><span class=\"ls6d ws53\">Il<span class=\"ls2 ws2\"> p<span class=\"_ _1\"></span>ermet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> connaitre <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>b<span class=\"_ _1\"></span>outon qui <span class=\"_ _2\"></span>sera<span class=\"_ _1\"></span> utilisé <span class=\"_ _2\"></span>lors<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’un<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> te<span class=\"_ _2\"></span>st<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>valid<span class=\"_ _2\"></span>ation. </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y65b ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y65b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y65b ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Syst<span class=\"_ _2\"></span>em<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y65c ff2 fs2 fc0 sc0 ls2 ws2\">Gam<span class=\"_ _2\"></span>eSys<span class=\"_ _2\"></span>tem() </div><div class=\"t m0 x1 he y65d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y65e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y65f ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur par <span class=\"_ _2\"></span>déf<span class=\"_ _2\"></span>aut. </div><div class=\"t m2 xa hc y660 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y660 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y660 ff4 fs2 fc4 sc0 ls2 ws14\">is<span class=\"_ _2\"></span>Press<span class=\"_ _2\"></span>ed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y661 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0 ws14\">isP<span class=\"_ _1\"></span>ressed(<span class=\"fc8 ws2\">int <span class=\"fc0\">finger = <span class=\"_ _2\"></span><span class=\"fcb ls6b\">0<span class=\"fc0 ls2\">) <span class=\"fc8 ws14\">co<span class=\"_ _2\"></span>nst<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y662 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y663 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _4\"></span><span class=\"fc0\">isP<span class=\"_ _1\"></span>ressed(ValidationBu<span class=\"_ _1\"></span>tton <span class=\"_ _2\"></span>validationBut<span class=\"_ _1\"></span>ton <span class=\"_ _2\"></span>= <span class=\"ff4 ws14\">ALL_BUTTONS<span class=\"_ _1\"></span></span>) <span class=\"_ _2\"></span><span class=\"fc8 ws14\">const<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc ya0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y664 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y4c8 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y4c8 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4c8 ff9 fs2 fc0 sc0 ls2 ws2\">Windows, <span class=\"_ _2\"></span>Lin<span class=\"_ _2\"></span>ux: </div><div class=\"t m0 x6 he y665 ff2 fs2 fc0 sc0 ls2 ws2\">Vérifie <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>touche <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>lidation est app<span class=\"_ _2\"></span>uyée<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x6 hc ya4 ff2 fs2 fc0 sc0 ls22 ws1a\">La<span class=\"ls2 ws2\"> touche <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>validation est définie dans <span class=\"_ _2\"></span><span class=\"ff4\">GameC<span class=\"_ _1\"></span>onfig.h <span class=\"ff9\">(voir ici <span class=\"_ _2\"></span>: <span class=\"fc4 ws14\">3.1</span><span class=\"ls6c\">)</span><span class=\"ff4\">. </span></span></span></span></span></span></div><div class=\"t m0 x1 hc y3ef ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y666 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y666 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y666 ff9 fs2 fc0 sc0 ls2 ws2\">Mobile <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 hc y667 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y668 ff2 fs2 fc0 sc0 ls2 ws2\">Vérifie <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">si<span class=\"ls2 ws2\"> l&apos;écran est <span class=\"_ _2\"></span>touch<span class=\"_ _1\"></span>é <span class=\"_ _2\"></span>pa<span class=\"_ _1\"></span>r <span class=\"_ _2\"></span>l&apos;uti<span class=\"_ _2\"></span>lisa<span class=\"_ _2\"></span>teur. </span></span></div><div class=\"t m0 x1 he y669 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y66a ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span><span class=\"ff2 fc0\">: </span></div><div class=\"t m0 x1 he y66b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4a6 ff4 fs2 fc0 sc0 ls2 ws2\">finger <span class=\"ff2\">index <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> </span>doigt<span class=\"ls2 ws2\"> (sur Mo<span class=\"_ _2\"></span>bile<span class=\"_ _2\"></span>). </span></span></span></div><div class=\"t m0 xc hc y66c ff4 fs2 fc0 sc0 ls2 ws2\">validationButton <span class=\"ff2\">R<span class=\"_ _1\"></span>eprésente <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>bouton <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>val<span class=\"_ _1\"></span>idation à <span class=\"_ _4\"></span>u<span class=\"_ _1\"></span>tiliser pour <span class=\"_ _2\"></span>passer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> te<span class=\"_ _4\"></span>st. </span></span></span></span></span></div><div class=\"t m0 x1 he y66d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y66e ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 hc y1bc ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y66f ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y66f ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y66f ff2 fs2 fc0 sc0 ls2 ws2\">Vérifier <span class=\"ls28 ws1e\">si</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> touché <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>validation <span class=\"ls1e ws16\">du</span> clavier e<span class=\"_ _2\"></span>st<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>app<span class=\"_ _1\"></span>uiée, Par défaut <span class=\"_ _2\"></span>cette<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>touch<span class=\"_ _1\"></span>e est <span class=\"_ _2\"></span><span class=\"ff4 ws14\">ENTER<span class=\"_ _2\"></span><span class=\"ff2 ws2\">. </span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4b\" class=\"pf w0 h0\" data-page-no=\"4b\"><div class=\"pc pc4b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAAD4f/t1bMIgFEBRNI8/gTs4R9oMIAhuoysELB0iI2QIwdIM8GdIymwgKOd0r37VVX0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqJOQLSYAAAVISURBVD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAHCJ6ns+liTJu5v3rU9e7doM439Pw/2z9cmtlJIzq7W6HQAADvA9v0v88ANu+sAwAgwEewAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">76<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x2f he y670 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y671 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _4\"></span><span class=\"fc0\">keyIsPr<span class=\"_ _1\"></span>essed(sf::Mouse::B<span class=\"_ _1\"></span>utton <span class=\"_ _2\"></span>button) <span class=\"_ _2\"></span><span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y672 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y673 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y31b ff2 fs2 fc0 sc0 ls2 ws2\">Vérifiez <span class=\"ls28 ws1e\">si</span> <span class=\"_ _4\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> b<span class=\"_ _2\"></span>outon<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> souris est en<span class=\"_ _2\"></span>fon<span class=\"_ _2\"></span>cé. </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y674 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrais <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>bouto<span class=\"_ _1\"></span>n est <span class=\"_ _2\"></span>enfoncé,<span class=\"_ _1\"></span> <span class=\"ff4\">fa<span class=\"_ _2\"></span>ux<span class=\"_ _1\"></span> <span class=\"ff2\">s<span class=\"_ _2\"></span>inon. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y675 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y676 ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y676 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y676 ff4 fs2 fc4 sc0 ls2 ws14\">fi<span class=\"_ _2\"></span>leExi<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y677 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0 ws14\">fileExist(<span class=\"ff4 fc5 ws2\">std:<span class=\"_ _1\"></span>:string <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">&amp;fileName) <span class=\"fc8 ws14\">con<span class=\"_ _2\"></span>st<span class=\"fc0 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y4c4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1aa ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y12c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y678 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">le</span> fichier <span class=\"_ _2\"></span>existe,<span class=\"_ _1\"></span> <span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span>no<span class=\"_ _2\"></span>n.<span class=\"_ _2\"></span> </span></span></span></div><div class=\"t m0 x1 he y50b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y679 ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y679 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y679 ff4 fs2 fc4 sc0 ls2 ws14\">pla<span class=\"_ _2\"></span>ySo<span class=\"_ _2\"></span>und<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y67a ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">pla<span class=\"_ _1\"></span>ySound(sf::Sound<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;ob<span class=\"_ _2\"></span>j) </span></div><div class=\"t m0 x6 hc y4c9 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y67b ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>jouer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>son<span class=\"_ _1\"></span> <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> l&apos;option est activ<span class=\"_ _2\"></span>ée. </span></span></span></span></div><div class=\"t m0 x1 he y67c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1b3 ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y1b3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1b3 ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>playS<span class=\"_ _2\"></span>ound<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1b4 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1b5 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMpla<span class=\"_ _1\"></span>ySound(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::strin<span class=\"_ _1\"></span>g<span class=\"ff2 fc0 ws2\">&amp; n<span class=\"_ _4\"></span>ame)<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x6 hc y67d ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc yd ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y67e ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> jouer <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> son gérer par <span class=\"_ _4\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>conteneu<span class=\"_ _1\"></span>r <span class=\"ff4 ls6e ws54\">GSM</span><span class=\"ff4\"> <span class=\"_ _2\"></span><span class=\"ff2 ls1e ws16\">du<span class=\"ls2 ws2\"> <span class=\"ff4\">GameSystem </span><span class=\"ls28 ws1e\">si</span> l&apos;option est a<span class=\"_ _2\"></span>ctivé<span class=\"_ _2\"></span>e. </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y67f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y680 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y680 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y680 ff4 fs2 fc4 sc0 ls2 ws14\">pla<span class=\"_ _2\"></span>yMus<span class=\"_ _2\"></span>ic<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y681 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">playMusic(<span class=\"_ _1\"></span>sf::Music <span class=\"_ _2\"></span>&amp;ob<span class=\"_ _4\"></span>j) </span></div><div class=\"t m0 x6 hc y682 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div><div class=\"c x23 y683 w4 h30\"><div class=\"t m0 x24 hc y684 ff4 fs2 fc5 sc0 ls40 ws30\">if<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff2 fc0 ws14\">(m_gameS<span class=\"_ _2\"></span>ystem.<span class=\"_ _2\"></span>isPre<span class=\"_ _2\"></span>ssed(<span class=\"_ _4\"></span><span class=\"ff4 fc5\">is::<span class=\"ff2 fc0 ws2\">G<span class=\"_ _2\"></span>ameSy<span class=\"_ _2\"></span>stem<span class=\"_ _2\"></span>::Vali<span class=\"_ _2\"></span>dati<span class=\"_ _2\"></span>onBut<span class=\"_ _2\"></span>ton:<span class=\"_ _2\"></span>:KEYBOA<span class=\"_ _2\"></span>RD)) </span></span></span></span></div><div class=\"t m0 x24 he y685 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 h1a y686 ff2 fs9 fcc sc0 ls6f ws55\">//<span class=\"ls2 ws2\"> <span class=\"ls70 ws56\">Do</span> <span class=\"_ _2\"></span>some<span class=\"_ _2\"></span>thin<span class=\"_ _2\"></span>g<span class=\"fc0\"> </span></span></div></div><div class=\"c x23 y683 w4 h30\"><div class=\"t m0 x24 he y687 ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y688 ff2 fs2 fc0 sc0 ls2 ws2\">Vérifier <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> bouton <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>valida<span class=\"_ _1\"></span>tion <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>souris est appuié, Par <span class=\"_ _2\"></span>défaut <span class=\"ff3 ws14\">c’est</span> <span class=\"ls1d ws15\">le</span> bouton <span class=\"ff4 ws14\">GAUC<span class=\"_ _2\"></span>HE<span class=\"ff2 ws2\">. </span></span></span></span></span></span></span></span></div></div><div class=\"c x23 y683 w4 h30\"><div class=\"t m0 x24 hc y689 ff4 fs2 fc5 sc0 ls40 ws30\">if<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hc y68a ff2 fs2 fc0 sc0 ls2 ws14\">(m_ga<span class=\"_ _2\"></span>meSyste<span class=\"_ _2\"></span>m.isPre<span class=\"_ _2\"></span>ssed<span class=\"_ _2\"></span>(<span class=\"ff4 fc5\">i<span class=\"_ _2\"></span>s::<span class=\"ff2 fc0 ws2\">G<span class=\"_ _2\"></span>ameSy<span class=\"_ _2\"></span>stem<span class=\"_ _2\"></span>::Vali<span class=\"_ _2\"></span>dati<span class=\"_ _2\"></span>onBut<span class=\"_ _2\"></span>ton:<span class=\"_ _2\"></span>:MOUSE<span class=\"_ _2\"></span>) </span></span></div></div><div class=\"c x23 y683 w4 h30\"><div class=\"t m0 x24 he y68b ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 he y68c ff2 fs2 fcc sc0 ls41 ws31\">//<span class=\"ls2 ws2\"> <span class=\"ls1e ws16\">do</span> <span class=\"_ _2\"></span>somet<span class=\"_ _2\"></span>hing<span class=\"fc0\"> </span></span></div></div><div class=\"c x23 y683 w4 h30\"><div class=\"t m0 x24 he y68d ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div><div class=\"t m0 x0 he y68e ff2 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y68f ff4 fs2 fc4 sc0 ls2 ws14\">ke<span class=\"_ _2\"></span>yIsPr<span class=\"_ _2\"></span>essed<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 xc hc y690 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div></div><div class=\"c x23 y683 w4 h30\"><div class=\"t m0 x0 hc y691 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 he y692 ff2 fs2 fc8 sc0 ls2 ws2\">bool </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x25 he y693 ff2 fs2 fc0 sc0 ls2 ws2\">keyIsPresse<span class=\"_ _1\"></span>d(sf::Keyboard::Key<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>key) <span class=\"fc8 ws14\">c<span class=\"_ _2\"></span>onst<span class=\"fc0 ws2\"> </span></span></div></div><div class=\"c x23 y683 w4 h30\"><div class=\"t m0 x24 h18 y694 ff4 fs9 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Sour<span class=\"_ _2\"></span>ce</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 h18 y695 ff4 fs9 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y683 w4 h30\"><div class=\"t m0 x24 he y696 ff2 fs2 fc0 sc0 ls2 ws2\">Vérifiez <span class=\"ls28 ws1e\">si</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> touche <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>clavier est en<span class=\"_ _2\"></span>foncée<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x24 hc y697 ff4 fs2 fca sc0 ls2 ws2\">Retourne </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x28 hc y698 ff4 fs2 fc0 sc0 ls2 ws2\">vrais <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _1\"></span>touche est enfoncée, <span class=\"ff4\">faux <span class=\"_ _2\"></span><span class=\"ff2\">sinon<span class=\"_ _2\"></span>. </span></span></span></span></span></div></div><div class=\"c x23 y683 w4 h30\"><div class=\"t m0 x0 he y699 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x2a hc y69a ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4c\" class=\"pf w0 h0\" data-page-no=\"4c\"><div class=\"pc pc4c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>jouer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>ne musique <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">si<span class=\"ls2 ws2\"> l&apos;option est <span class=\"_ _2\"></span>activé<span class=\"_ _2\"></span>e. </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y2bc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">GSM<span class=\"_ _2\"></span>playM<span class=\"_ _2\"></span>usic<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _2\"></span><span class=\"ff2 fc8\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">GSMpla<span class=\"_ _1\"></span>yMusic(<span class=\"fc8 ws2\">c<span class=\"_ _1\"></span>onst <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"ff2 fc0 ws2\">&amp; name<span class=\"_ _2\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> jouer <span class=\"_ _2\"></span>une musique gérer par <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>conte<span class=\"_ _1\"></span>neur <span class=\"ff4\">GSM </span><span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span><span class=\"ff4\">GameSystem<span class=\"_ _1\"></span> <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> l&apos;option est act<span class=\"_ _2\"></span>ivée<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c5 ff4 fs2 fc4 sc0 ls2 ws14\">2.10</div><div class=\"t m3 x20 hd y1c5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c5 ff4 fs2 fc4 sc0 ls2 ws2\">sto<span class=\"_ _2\"></span>pSoun<span class=\"_ _2\"></span>d </div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">stopSou<span class=\"_ _1\"></span>nd(sf::Sound <span class=\"_ _2\"></span>&amp;obj) </span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>stopper un so<span class=\"_ _2\"></span>n.<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ca ff4 fs2 fc4 sc0 ls2 ws14\">2.11</div><div class=\"t m3 x20 hd y1ca ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ca ff4 fs2 fc4 sc0 ls2 ws2\">sto<span class=\"_ _2\"></span>pMusi<span class=\"_ _2\"></span>c </div><div class=\"t m0 x6 he y453 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">stopSou<span class=\"_ _1\"></span>nd(sf::Music <span class=\"_ _4\"></span>&amp;<span class=\"_ _1\"></span>obj) </span></div><div class=\"t m0 x6 hc yc5 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y69b ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> stopper <span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>ne m<span class=\"_ _2\"></span>usique<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y1ce ff4 fs2 fc4 sc0 ls2 ws14\">2.12</div><div class=\"t m3 x20 hd y1ce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ce ff4 fs2 fc4 sc0 ls2 ws2\">use<span class=\"_ _2\"></span>Vibrat<span class=\"_ _2\"></span>e </div><div class=\"t m0 x6 he y28f ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0 ws14\">useVibrate(<span class=\"_ _1\"></span></span>short <span class=\"fc0\">ms) </span></div><div class=\"t m0 x6 hc y1d0 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y23f ff2 fs2 fc0 sc0 ls2 ws2\">Permet d&apos;utiliser <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>vi<span class=\"_ _1\"></span>breur <span class=\"ls3d ws2d\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>l&apos;option<span class=\"_ _1\"></span> e<span class=\"_ _2\"></span>st<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>activé<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>(u<span class=\"_ _1\"></span>niquement pour <span class=\"_ _2\"></span>Mobile<span class=\"_ _2\"></span>). </span></span></span></span></div><div class=\"t m0 x1 he y151 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2a ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"fc0 ls71 ws57\">ms</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"ff2\">représ<span class=\"_ _1\"></span>ente <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>durée <span class=\"_ _2\"></span><span class=\"ls1f ws17\">du<span class=\"ls2 ws2\"> vibreur <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> m<span class=\"_ _2\"></span>illi<span class=\"_ _2\"></span>secon<span class=\"_ _2\"></span>de. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y4b3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y20c ff4 fs2 fc4 sc0 ls2 ws14\">2.13</div><div class=\"t m3 x20 hd y20c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y20c ff4 fs2 fc4 sc0 ls2 ws14\">sav<span class=\"_ _2\"></span>eCon<span class=\"_ _2\"></span>fig<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y1f3 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">sa<span class=\"_ _1\"></span>veConfig(<span class=\"ff4 fc5 ws2\">std::st<span class=\"_ _1\"></span>ring <span class=\"ff2 fc8\">const <span class=\"_ _4\"></span><span class=\"fc0\">&amp;file<span class=\"_ _2\"></span>Name) </span></span></span></span></div><div class=\"t m0 x1 he y1f4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y211 ff2 fs2 fc0 sc0 ls2 ws2\">Sauvegarde les <span class=\"_ _2\"></span>données<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> configurations </span>du<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>je<span class=\"_ _2\"></span>u. </span></span></div><div class=\"t m2 xa hc y44f ff4 fs2 fc4 sc0 ls2 ws14\">2.14</div><div class=\"t m3 x20 hd y44f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y44f ff4 fs2 fc4 sc0 ls2 ws14\">loa<span class=\"_ _2\"></span>dConf<span class=\"_ _2\"></span>ig<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y450 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y91 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">loa<span class=\"_ _1\"></span>dConfig(<span class=\"ff4 fc5 ws2\">std::s<span class=\"_ _1\"></span>tring <span class=\"ff2 fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;fi<span class=\"_ _2\"></span>leNam<span class=\"_ _2\"></span>e) </span></span></span></span></div><div class=\"t m0 x1 he y1d7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22d ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1d9 ff2 fs2 fc0 sc0 ls2 ws2\">Charge <span class=\"_ _2\"></span>les données <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> configurations <span class=\"ls1e ws16\">du<span class=\"_ _1\"></span></span> j<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>u. </span></span></div><div class=\"t m2 xa hc y1da ff4 fs2 fc4 sc0 ls2 ws14\">2.15</div><div class=\"t m3 x20 hd y1da ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1da ff4 fs2 fc4 sc0 ls2 ws14\">sav<span class=\"_ _2\"></span>ePad<span class=\"_ _2\"></span>Config<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y572 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22e ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">savePadConfig(<span class=\"ff4 fc5 ws2\">s<span class=\"_ _1\"></span>td::string <span class=\"ff2 fc8\">const <span class=\"_ _4\"></span><span class=\"fc0\">&amp;file<span class=\"_ _2\"></span>Name) </span></span></span></span></div><div class=\"t m0 x1 he y22f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1dc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y69c ff2 fs2 fc0 sc0 ls2 ws2\">Enregistre les <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>onnées <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> configuration <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>Game Pad V<span class=\"_ _2\"></span>irtue<span class=\"_ _2\"></span>l. </span></span></div><div class=\"t m2 xa hc y69d ff4 fs2 fc4 sc0 ls2 ws14\">2.16</div><div class=\"t m3 x20 hd y69d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y69d ff4 fs2 fc4 sc0 ls2 ws14\">loa<span class=\"_ _2\"></span>dPad<span class=\"_ _2\"></span>Confi<span class=\"_ _2\"></span>g<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y98 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5d9 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">loa<span class=\"_ _1\"></span>dPadConfig(<span class=\"ff4 fc5 ws2\">s<span class=\"_ _1\"></span>td::string <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">&amp;fi<span class=\"_ _2\"></span>leName<span class=\"_ _2\"></span>) </span></span></span></span></div><div class=\"t m0 x21 h9 y5da ff6 fs3 fc0 sc0 ls1b ws13\">77<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4d\" class=\"pf w0 h0\" data-page-no=\"4d\"><div class=\"pc pc4d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Charge les <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>onnées de configuration <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>Gam<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>Pad Vi<span class=\"_ _2\"></span>rtuel<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">2.17</div><div class=\"t m3 x20 hd y1c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">m_d<span class=\"_ _2\"></span>isab<span class=\"_ _2\"></span>leKey<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y618 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y108 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_di<span class=\"_ _2\"></span>sableKe<span class=\"_ _2\"></span>y </span></div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y44c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c5 ff3 fs2 fc0 sc0 ls2 ws14\">S’il<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>est <span class=\"ff4\">vrai </span>toutes <span class=\"_ _2\"></span>les fonctions du moteur qui <span class=\"_ _2\"></span>gère<span class=\"_ _1\"></span>nt les <span class=\"_ _2\"></span>entrées<span class=\"_ _1\"></span> (clavier, souris, <span class=\"_ _2\"></span>tacti<span class=\"_ _1\"></span>le) sont <span class=\"_ _2\"></span>désac<span class=\"_ _2\"></span>tivée<span class=\"_ _2\"></span>s. </span></div><div class=\"t m0 x1 he y69e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ea ff4 fs2 fc4 sc0 ls2 ws14\">2.18</div><div class=\"t m3 x20 hd y1ea ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ea ff4 fs2 fc4 sc0 ls2 ws14\">m_e<span class=\"_ _2\"></span>nable<span class=\"_ _2\"></span>Soun<span class=\"_ _2\"></span>d<span class=\"_ _1\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y1eb ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_enab<span class=\"_ _2\"></span>leSo<span class=\"_ _2\"></span>und </span></div><div class=\"t m0 x6 hc y1c9 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y619 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>savoi<span class=\"_ _1\"></span>r <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> son est a<span class=\"_ _2\"></span>ctivé<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y1cb ff4 fs2 fc4 sc0 ls2 ws14\">2.19</div><div class=\"t m3 x20 hd y1cb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1cb ff4 fs2 fc4 sc0 ls2 ws14\">m_e<span class=\"_ _2\"></span>nable<span class=\"_ _2\"></span>Musi<span class=\"_ _2\"></span>c<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y2b7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y61a ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_enab<span class=\"_ _2\"></span>leMu<span class=\"_ _2\"></span>sic </span></div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y227 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> savoir <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>musique est act<span class=\"_ _2\"></span>ivée<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y28f ff4 fs2 fc4 sc0 ls2 ws14\">2.20</div><div class=\"t m3 x20 hd y28f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y28f ff4 fs2 fc4 sc0 ls2 ws14\">m_e<span class=\"_ _2\"></span>nable<span class=\"_ _2\"></span>Vibrat<span class=\"_ _2\"></span>e<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y150 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y4fe ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_enab<span class=\"_ _2\"></span>leVib<span class=\"_ _2\"></span>rate<span class=\"_ _2\"></span> </span></div><div class=\"t m0 x6 hc y22a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2a ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>savoir<span class=\"_ _1\"></span> <span class=\"ls28 ws1e\">si</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> vibreur est <span class=\"_ _2\"></span>acti<span class=\"_ _2\"></span>vé. </span></span></div><div class=\"t m0 x1 he y54c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y22c ff4 fs2 fc4 sc0 ls2 ws14\">2.21</div><div class=\"t m3 x20 hd y22c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y22c ff4 fs2 fc4 sc0 ls2 ws14\">m_k<span class=\"_ _2\"></span>eyIsP<span class=\"_ _2\"></span>resse<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y61c ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_ke<span class=\"_ _2\"></span>yIsPre<span class=\"_ _2\"></span>ssed </span></div><div class=\"t m0 x6 hc y54e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1f5 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>savoi<span class=\"_ _1\"></span>r <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> une touche / <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> bouton <span class=\"_ _2\"></span>a été enf<span class=\"_ _2\"></span>oncée<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y1d5 ff4 fs2 fc4 sc0 ls2 ws14\">2.22</div><div class=\"t m3 x20 hd y1d5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1d5 ff4 fs2 fc4 sc0 ls2 ws14\">m_f<span class=\"_ _2\"></span>irst<span class=\"_ _2\"></span>Launc<span class=\"_ _2\"></span>h<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y596 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he yd0 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _e\"> </span><span class=\"fc0\">m_fir<span class=\"_ _2\"></span>stLa<span class=\"_ _2\"></span>unch </span></div><div class=\"t m0 x6 hc y541 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y451 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>vér<span class=\"_ _1\"></span>ifier <span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> jeu <span class=\"_ _2\"></span>a été lancé <span class=\"ls29 ws1f\">au</span> <span class=\"_ _2\"></span>moins une fo<span class=\"_ _4\"></span>is. </span></span></div><div class=\"t m2 xa hc y454 ff4 fs2 fc4 sc0 ls2 ws14\">2.23</div><div class=\"t m3 x20 hd y454 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y454 ff4 fs2 fc4 sc0 ls2 ws2\">m_va<span class=\"_ _2\"></span>lida<span class=\"_ _2\"></span>tionMo<span class=\"_ _2\"></span>useK<span class=\"_ _2\"></span>ey </div><div class=\"t m0 x6 he y1db ff2 fs2 fc0 sc0 ls2 ws2\">sf::Mouse::Butto<span class=\"_ _1\"></span>n <span class=\"_ _a\"></span>m_validationMouseKey<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 hc y61e ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y69c ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>riable<span class=\"_ _1\"></span> qui <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>tocke <span class=\"ls1d ws15\">le</span> b<span class=\"_ _2\"></span>outton<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>val<span class=\"_ _1\"></span>idation <span class=\"ls1f ws17\">de</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>souri<span class=\"_ _2\"></span>s. </span></span></div><div class=\"t m2 xa hc y61f ff4 fs2 fc4 sc0 ls2 ws14\">2.24</div><div class=\"t m3 x20 hd y61f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y61f ff4 fs2 fc4 sc0 ls2 ws14\">m_va<span class=\"_ _2\"></span>lida<span class=\"_ _2\"></span>tionK<span class=\"_ _2\"></span>eyboar<span class=\"_ _2\"></span>dKe<span class=\"_ _2\"></span>y<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y69f ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Keyb<span class=\"_ _2\"></span>oard<span class=\"_ _2\"></span>::Ke<span class=\"_ _2\"></span>y <span class=\"_ _a\"></span>m_v<span class=\"_ _2\"></span>alida<span class=\"_ _2\"></span>tionKe<span class=\"_ _2\"></span>yboa<span class=\"_ _2\"></span>rdKe<span class=\"_ _2\"></span>y </div><div class=\"t m0 x21 h9 y382 ff6 fs3 fc0 sc0 ls1b ws13\">78<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4e\" class=\"pf w0 h0\" data-page-no=\"4e\"><div class=\"pc pc4e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdMWgUWQDH4fecFYs0J8uYQrwrwxLEQkQLiVjLyVVXHtpZBOxiJcY2io1BrcVOsZBYeEVg7woRuUZvlWAhawpZkyAK0RAzeRYL0UK7uLjzvq8IS9Lk/Wdh+bGZTUwpBQAAAGpqhwkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIAQQqPex4sxusYAAMDX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AKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAMyfp/sAAAJeSURBVACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAA8Kn6ln5LkhzDetUx2duzKdO759LddUxcBgAA8CMPC6zwEsv6DqAAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">79<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y6a0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>riable qui <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>tocke <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>touche de validation <span class=\"_ _1\"></span>du clav<span class=\"_ _2\"></span>ier. </div><div class=\"t m2 xa hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">2.25</div><div class=\"t m3 x20 hd y1c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">m_ga<span class=\"_ _2\"></span>meLan<span class=\"_ _2\"></span>gua<span class=\"_ _2\"></span>ge<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y618 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y108 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">m<span class=\"_ _2\"></span>_game<span class=\"_ _2\"></span>Langu<span class=\"_ _2\"></span>age </span></div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y350 ff2 fs2 fc0 sc0 ls2 ws2\">Représente l&apos;index <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> la langue c<span class=\"_ _2\"></span>hoi<span class=\"_ _2\"></span>sie. </span></span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ea ff4 fs2 fc4 sc0 ls2 ws14\">2.26</div><div class=\"t m3 x20 hd y1ea ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ea ff4 fs2 fc4 sc0 ls2 ws14\">m_p<span class=\"_ _2\"></span>adAlp<span class=\"_ _2\"></span>ha<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y1eb ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">m<span class=\"_ _2\"></span>_padA<span class=\"_ _2\"></span>lpha </span></div><div class=\"t m0 x6 hc y1c9 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y222 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1ed ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> modifier <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> transparence <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>Gam<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>Pad<span class=\"_ _1\"></span> Vi<span class=\"_ _2\"></span>rtue<span class=\"_ _2\"></span>l. </span></span></span></span></div><div class=\"t m2 xa hc y1cb ff4 fs2 fc4 sc0 ls2 ws14\">2.27</div><div class=\"t m3 x20 hd y1cb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1cb ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>autres méth<span class=\"_ _2\"></span>odes<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y2b7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y6a1 ff2 fs2 fc0 sc0 ls2 ws2\">Ces méthodes <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>dessous on<span class=\"_ _1\"></span>t <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>mêm<span class=\"_ _1\"></span>e rôle <span class=\"_ _2\"></span>que celles qui sont <span class=\"ls29 ws1f\">au</span> <span class=\"_ _2\"></span>dessus,<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>différence ic<span class=\"_ _1\"></span>i est que <span class=\"_ _2\"></span>leurs noms </div><div class=\"t m0 x6 hc y3a8 ff2 fs2 fc0 sc0 ls2 ws2\">commencant par <span class=\"_ _1\"></span><span class=\"ff4\">« GSM » </span>sont rempl<span class=\"_ _1\"></span>acés par <span class=\"ff4\">« GR<span class=\"_ _1\"></span>M » (Game Resou<span class=\"_ _1\"></span>rce Manager)<span class=\"_ _1\"></span>.<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x1 hc y6a2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6a3 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y648 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y649 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y6a4 ff2 fs2 fc0 sc0 ls2 ws2\">Classe dérivée de <span class=\"ff4\">G<span class=\"_ _1\"></span>ameSystem <span class=\"_ _1\"></span><span class=\"ff9\">(cliquer ici <span class=\"fc7 ls72\">1 </span><span class=\"ffb\">pour plus d’inf<span class=\"_ _1\"></span>o)</span></span><span class=\"ls4b\">, <span class=\"_ _1\"></span></span></span>elle assure le même <span class=\"_ _1\"></span>rôle que son<span class=\"_ _1\"></span> parent. Sa<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 he y6a5 ff2 fs2 fc0 sc0 ls2 ws2\">particularité est <span class=\"ff3\">qu’elle contient de<span class=\"_ _1\"></span></span> nouveaux éléments qui serviront à <span class=\"_ _2\"></span>gér<span class=\"_ _1\"></span>er <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>game play <span class=\"ls24 ws1c\">et</span> à manipuler les différentes </div><div class=\"t m0 x6 he y6a6 ff2 fs2 fc0 sc0 ls2 ws2\">scènes de jeu.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc yb6 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd yb6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc yb6 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts de <span class=\"_ _2\"></span>GameSys<span class=\"_ _2\"></span>temE<span class=\"_ _2\"></span>xten<span class=\"_ _2\"></span>ded<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y6a7 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y6a7 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y6a7 ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Syst<span class=\"_ _2\"></span>emExt<span class=\"_ _2\"></span>ended<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y6a8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y6a9 ff2 fs2 fc0 sc0 ls2 ws2\">Gam<span class=\"_ _2\"></span>eSys<span class=\"_ _2\"></span>temExt<span class=\"_ _2\"></span>ended<span class=\"_ _2\"></span>() </div><div class=\"t m0 x6 hc y6aa ff4 fs2 fc9 sc0 ls2 ws2\">Code Source </div><div class=\"t m0 x6 he y6ab ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"_ _2\"></span>par <span class=\"_ _4\"></span>défaut.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y6ac ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y6ac ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y6ac ff4 fs2 fc4 sc0 ls2 ws2\">in<span class=\"_ _2\"></span>itSyst<span class=\"_ _2\"></span>emDat<span class=\"_ _2\"></span>a </div><div class=\"t m0 x6 he y6ad ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">initSystemData() </span></div><div class=\"t m0 x6 hc y6ae ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div></div><div class=\"c x6 y6af w11 h31\"><div class=\"t m0 x0 hc y6b0 ff4 fs2 fc0 sc0 ls2 ws2\">Autres <span class=\"_ _2\"></span>metho<span class=\"_ _2\"></span>des </div><div class=\"t m0 x0 he y6b1 ff2 fs2 fc0 sc0 ls2 ws2\">GRMp<span class=\"_ _2\"></span>layS<span class=\"_ _2\"></span>ound </div><div class=\"t m0 x0 he y36f ff2 fs2 fc0 sc0 ls2 ws2\">GRMp<span class=\"_ _2\"></span>layM<span class=\"_ _2\"></span>usic </div></div><div class=\"c x2b y6af w6 h31\"><div class=\"t m0 x0 hc y6b0 ff4 fs2 fc0 sc0 ls2 ws2\">Methodes <span class=\"_ _2\"></span>Princip<span class=\"_ _1\"></span>ale <span class=\"_ _2\"></span>(au<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>dess<span class=\"_ _2\"></span>us) </div><div class=\"t m0 x0 he y6b1 ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>playS<span class=\"_ _2\"></span>ound </div><div class=\"t m0 x0 he y36f ff2 fs2 fc0 sc0 ls2 ws2\">GSM<span class=\"_ _2\"></span>play<span class=\"_ _2\"></span>Music </div></div><div class=\"c x28 y6b2 w12 h32\"><div class=\"t m0 x24 hb y6b3 ff7 fs3 fc3 sc0 ls2 ws2\">Game System E<span class=\"_ _2\"></span>xte<span class=\"_ _2\"></span>nded<span class=\"_ _2\"></span><span class=\"fc0\"> </span></div></div><div class=\"c x23 y6b4 w13 h33\"><div class=\"t m0 x2a hc y6b5 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>GameSys<span class=\"_ _1\"></span>temExtended<span class=\"_ _1\"></span> </div><div class=\"t m0 x0 hc y6b6 ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d he y6b7 ff2 fs2 fc0 sc0 ls2 ws2\">GameSystemEx<span class=\"_ _1\"></span>tended;<span class=\"_ _1\"></span> </div></div><div class=\"c x23 y6b4 w13 h33\"><div class=\"t m0 x0 hc y6b8 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">app_<span class=\"_ _2\"></span>src/ga<span class=\"_ _2\"></span>mesys<span class=\"_ _2\"></span>tem_ex<span class=\"_ _2\"></span>t/Ga<span class=\"_ _2\"></span>meSys<span class=\"_ _2\"></span>temEx<span class=\"_ _2\"></span>tended<span class=\"_ _2\"></span>.h<span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf4f\" class=\"pf w0 h0\" data-page-no=\"4f\"><div class=\"pc pc4f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB27dDnAaCAArDeVCzkjW9AK5cASwekiaVnIELtBeoIEFyCI5AwhVIKuEAG0yzggCDaNLWYKoY9vvcup2XEfuLBQAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAcLCRCdh3s3x+X3/YAQCgaudn49uriR3YSCnFCmx9fn0bAQCg+q/85PgodkD1AQAA/H/+6wMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAHG408PP3fV/1+zdNk8Q9BgAAfpNSyqDPX3kydV3Xtq17DAAAqD4AAIAh8l8fAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAALQ0A2AAAACcSURBVFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAA/mj13V0+JEmeru9fV9Pk8fTlZDbfPS9mF2+raWIyAACAivwAo/g5x84N4aUAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">80<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y6a0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Initialise les <span class=\"_ _2\"></span>donné<span class=\"_ _1\"></span>es <span class=\"_ _2\"></span>li<span class=\"_ _1\"></span>ées <span class=\"ls5f ws58\">au<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> moteur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>je<span class=\"_ _2\"></span>u. </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c0 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y1c0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c0 ff4 fs2 fc4 sc0 ls2 ws2\">in<span class=\"_ _2\"></span>itProg<span class=\"_ _2\"></span>ress </div><div class=\"t m0 x6 he y2bd ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">initProgress() </span></div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y331 ff2 fs2 fc0 sc0 ls2 ws2\">Initialise les <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>onnées<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>p<span class=\"_ _1\"></span>rogression<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> je<span class=\"_ _4\"></span>u. </span></span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">in<span class=\"_ _2\"></span>itData<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">initData(<span class=\"fc8 ws2\">bool <span class=\"fc0\">clea<span class=\"_ _1\"></span>rCurrentLevel = <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">tr<span class=\"_ _2\"></span>ue<span class=\"ff2 fc0 ws2\">)<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e ff2 fs2 fc0 sc0 ls2 ws2\">Initialise les <span class=\"_ _2\"></span>données <span class=\"ls1e ws16\">de</span> game <span class=\"_ _2\"></span>play (score, vie, <span class=\"ff3 ws14\">…<span class=\"_ _2\"></span>).<span class=\"_ _2\"></span><span class=\"ff2 ws2\"> </span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ca ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y1ca ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1ca ff4 fs2 fc4 sc0 ls2 ws14\">sav<span class=\"_ _2\"></span>eData<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y1ee ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">sa<span class=\"_ _1\"></span>veData(<span class=\"ff4 fc5 ws2\">std::s<span class=\"_ _1\"></span>tring <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">&amp;<span class=\"_ _2\"></span>file<span class=\"_ _2\"></span>Name) </span></span></span></span></div><div class=\"t m0 x1 he y1ef ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y353 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y6b9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y5d5 ff2 fs2 fc0 sc0 ls2 ws2\">Sauvagarde les <span class=\"_ _2\"></span>données <span class=\"ls1e ws16\">du</span> j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y1f1 ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y1f1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1f1 ff4 fs2 fc4 sc0 ls2 ws14\">loa<span class=\"_ _2\"></span>dData<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc ybd ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">loadData(<span class=\"_ _1\"></span><span class=\"ff4 fc5 ws2\">std::string <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> <span class=\"fc0\">&amp;fi<span class=\"_ _2\"></span>leN<span class=\"_ _2\"></span>ame) </span></span></span></span></div><div class=\"t m0 x1 he y372 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y228 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y20b ff2 fs2 fc0 sc0 ls2 ws2\">Charge les <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>onnées <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>je<span class=\"_ _2\"></span>u. </div><div class=\"t m0 x1 he y373 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y22b ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y22b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y22b ff4 fs2 fc4 sc0 ls2 ws2\">m_l<span class=\"_ _2\"></span>aunch<span class=\"_ _2\"></span>Option<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y1f2 ff2 fs2 fc0 sc0 ls2 ws2\">Dis<span class=\"_ _2\"></span>playO<span class=\"_ _2\"></span>ption<span class=\"_ _2\"></span> m_l<span class=\"_ _2\"></span>aunchOp<span class=\"_ _2\"></span>tion<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y294 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc yce ff2 fs2 fc0 sc0 ls2 ws2\">Détermine <span class=\"ff3 ws14\">l’action</span> <span class=\"ff9\">(cliquer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>ic<span class=\"_ _1\"></span>i <span class=\"fc7\">1 <span class=\"_ _2\"></span><span class=\"fc0\">pour voir <span class=\"_ _2\"></span>les actions) <span class=\"ff2\">qui sera e<span class=\"_ _2\"></span>ffectu<span class=\"_ _1\"></span>ée <span class=\"_ _2\"></span>sur les différentes scènes <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> je<span class=\"_ _4\"></span>u. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y44e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f5 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y1f5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1f5 ff4 fs2 fc4 sc0 ls2 ws2\">game <span class=\"_ _2\"></span>play varia<span class=\"_ _4\"></span>bles<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5d6 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0\">m_gamePro<span class=\"_ _1\"></span>gression </span></div><div class=\"t m0 x6 he y551 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">m_levelNum<span class=\"_ _1\"></span>ber </span></div><div class=\"t m0 x6 he y6ba ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">m_currentLev<span class=\"_ _1\"></span>el </span></div><div class=\"t m0 x6 he y504 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">m_currentLives </span></div><div class=\"t m0 x6 he y541 ff2 fs2 fc8 sc0 ls2 ws2\">in<span class=\"_ _2\"></span>t <span class=\"_ _2\"></span><span class=\"fc0\">m_cur<span class=\"_ _2\"></span>rent<span class=\"_ _2\"></span>Bonus </span></div><div class=\"t m0 x6 he y93 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">m_currentScor<span class=\"_ _1\"></span>e </span></div><div class=\"t m0 x6 he y451 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">m_levelTime<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y94 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y615 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y554 ff2 fs2 fc0 sc0 ls2 ws2\">Les variables <span class=\"_ _2\"></span>globales <span class=\"ls1e ws16\">du</span> je<span class=\"_ _4\"></span>u. </div><div class=\"t m0 x1 he y6bb ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y6bc ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y1ff ff9 fs2 fc3 sc0 ls2 ws2\">Game <span class=\"_ _2\"></span>Functi<span class=\"_ _2\"></span>on<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h28 y6bd ff9 fsc fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x6 y6be w9 h34\"><div class=\"t m0 x0 h18 y6bf ff9 fs9 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 hc y6c0 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>system<span class=\"_ _2\"></span>/funct<span class=\"_ _2\"></span>ion/G<span class=\"_ _2\"></span>ameF<span class=\"_ _2\"></span>uncti<span class=\"_ _2\"></span>on.h<span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf50\" class=\"pf w0 h0\" data-page-no=\"50\"><div class=\"pc pc50 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdbWhV9x3A8X/MRazGaXRRuy3NrBtGYuK0pLNQG4ywQS3BPbmadaisL+qQWWTDUSitTFy3wIo4Gl9MMiTVMoVJptA6NufD8Ak7s6ttR4tOszE1S2+z3pvG7N6cvThwEV0TNzTGez+fV+f+c/Li/O558+Weh5IoigIAAAAFaowRAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6jAAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcEAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQ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AADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqA5YsFIwAAAWESURBVAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAA4LXVN37nJMnaTMfeJku1fbr+voeuPvc2MRkAAMAfuQDTmxpuffGSjgAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">81<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y6a0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Ces fonctions du <span class=\"_ _1\"></span>moteur permette<span class=\"_ _1\"></span>nt de faire des conve<span class=\"_ _1\"></span>rsions sur les chaines de carac<span class=\"_ _1\"></span>tères, manipul<span class=\"_ _1\"></span>er le temps, </div><div class=\"t m0 x6 he y40e ff2 fs2 fc0 sc0 ls2 ws2\">manipuler les objets SFML, afficher des texts spéciaux, utiliser certaines fonctionnaltés<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d’Mobile,</span> faire de<span class=\"_ _2\"></span>s calcul<span class=\"_ _1\"></span>s </div><div class=\"t m0 x6 he y40f ff2 fs2 fc0 sc0 ls2 ws2\">géométriques, faire des t<span class=\"_ _1\"></span>ests sur des varia<span class=\"_ _1\"></span>b<span class=\"ff3\">l<span class=\"_ _1\"></span>es, utiliser de<span class=\"_ _1\"></span>s fonctions pour mani<span class=\"_ _1\"></span>puler des valeu<span class=\"_ _1\"></span>rs aléatoires, …<span class=\"_ _9\"></span></span> </div><div class=\"t m2 xa hc y410 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y410 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y410 ff4 fs2 fc4 sc0 ls2 ws2\">Fonction <span class=\"_ _4\"></span>Généra<span class=\"_ _2\"></span>le<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y6c1 ff4 fs2 fc4 sc0 ls2 ws14\">1.1</div><div class=\"t m3 x1c hd y6c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y6c1 ff4 fs2 fc4 sc0 ls2 ws2\">VAL<span class=\"_ _2\"></span>UE_CO<span class=\"_ _2\"></span>NVERS<span class=\"_ _2\"></span>ION </div><div class=\"t m0 x6 hc y6c2 ff4 fs2 fc6 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">float <span class=\"_ _2\"></span>const <span class=\"fc0 ws14\">VA<span class=\"_ _2\"></span>LUE_CON<span class=\"_ _2\"></span>VERS<span class=\"_ _2\"></span>ION(<span class=\"fcb\">6<span class=\"_ _2\"></span>5.f<span class=\"fc0 ls60 ws49\">);<span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x1 he y6c3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y6c4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he ydd ff2 fs2 fc0 sc0 ls2 ws2\">Agit sur <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> timing des <span class=\"_ _2\"></span>compte<span class=\"_ _2\"></span>urs. </span></span></div><div class=\"t m0 x1 he y16c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y16d ff9 fs2 fc0 sc0 ls2 ws2\">Exe<span class=\"_ _2\"></span>mple: </div><div class=\"t m0 x1 hc y6c5 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y10f ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6c6 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6c7 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6c8 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6c9 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc ye2 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6ca ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6cb ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6cc ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6cd ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6ce ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc yda ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6cf ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d0 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d1 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d2 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d3 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc yaf ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d4 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d5 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d6 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d7 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d8 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6d9 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6da ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6db ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6dc ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6dd ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6de ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y6df ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y6e0 ff4 fs2 fc4 sc0 ls2 ws14\">1.4</div><div class=\"t m3 x1c hd y6e0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y6e0 ff4 fs2 fc4 sc0 ls2 ws2\">en<span class=\"_ _2\"></span>umToNu<span class=\"_ _2\"></span>m </div><div class=\"t m0 x6 hc y6e1 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _4\"></span><span class=\"ff2 fc0\">&lt;<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"ff4 fc5\">typename<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"ff2 fc0\">T&gt; </span></span></span></div><div class=\"t m0 x6 he y6e2 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0\">enumToNum(<span class=\"_ _1\"></span>T val) </span></div><div class=\"t m0 x6 hc y6e3 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y5a1 ff2 fs2 fc0 sc0 ls2 ws2\">Convertie <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff4\">enum </span><span class=\"ls29 ws1f\">en<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff4\">i<span class=\"_ _2\"></span>nt.<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x1 hc y32b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y6e4 ff4 fs2 fc4 sc0 ls2 ws14\">1.5</div><div class=\"t m3 x1c hd y6e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y6e4 ff4 fs2 fc4 sc0 ls2 ws14\">w_c<span class=\"_ _2\"></span>hart<span class=\"_ _2\"></span>_tToSt<span class=\"_ _2\"></span>r<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y6e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y6e6 ff4 fs2 fc5 sc0 ls2 ws2\">std::string <span class=\"ff2 fc0 ws14\">w_chart_tToStr(<span class=\"fc8 ws2\">wchar_t <span class=\"_ _2\"></span>const <span class=\"fc0\">*<span class=\"_ _4\"></span>str<span class=\"_ _2\"></span>) </span></span></span></div><div class=\"t m0 x6 hc y6e7 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y6be ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y6e8 ff2 fs2 fc0 sc0 ls2 ws2\">Convertie <span class=\"_ _2\"></span>un <span class=\"_ _1\"></span><span class=\"ff4\">w_chart_t </span><span class=\"ls29 ws1f\">en</span> <span class=\"_ _4\"></span><span class=\"ff4\">std::<span class=\"_ _2\"></span>string<span class=\"_ _2\"></span>. </span></div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x0 hc y6ea ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc he y5e8 ff2 fs2 fc0 sc0 ls2 ws2\">Ceci <span class=\"_ _2\"></span>cr<span class=\"_ _1\"></span>éer <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> compteur <span class=\"ls24 ws1c\">en</span> <span class=\"_ _2\"></span>mill<span class=\"_ _1\"></span>iseconde quand<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls33 ws27\">on<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> me<span class=\"_ _2\"></span>t dans <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>boucl<span class=\"_ _1\"></span>e <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>mis<span class=\"_ _1\"></span>e à <span class=\"_ _2\"></span>jo<span class=\"_ _2\"></span>ur </span></span></span></span></span></span></div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x24 hc y6eb ff2 fs2 fcc sc0 ls73\">//<span class=\"ls2 ws2\"> <span class=\"ff4\">msCpt <span class=\"_ _2\"></span><span class=\"ff2\">est une <span class=\"_ _2\"></span>variable<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>type <span class=\"ff4 ws14\">enti<span class=\"_ _2\"></span>er</span></span></span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x32 hc ye1 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x0 hc y6ec ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 he y6ed ff2 fs2 fc0 sc0 ls2 ws2\">msCpt <span class=\"ls2e\">+=</span> <span class=\"_ _4\"></span>(</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x28 hc y6ee ff4 fs2 fc5 sc0 ls2 ws14\">is::<span class=\"ff2 fc0 ws2\">VALUE_CONV<span class=\"_ _1\"></span>ERSION *<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fcb ws14\">1.538f<span class=\"fc0 ws2\">) * <span class=\"_ _2\"></span>DELTA_T<span class=\"_ _1\"></span>IME; <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"_ _2\"></span><span class=\"ff4\">DELTA_TI<span class=\"_ _1\"></span>ME <span class=\"ff2\">est <span class=\"_ _4\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>temps <span class=\"ff3 ws14\">d’éxécution</span> renvoyé par <span class=\"_ _2\"></span><span class=\"ls61 ws4a\">la<span class=\"fc0 ls2 ws2\"> </span></span></span></span></span></span></span></span></span></span></span></div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x24 he y6ef ff2 fs2 fcc sc0 ls2 ws14\">mac<span class=\"_ _2\"></span>hine</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc he y4f ff2 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x0 he y6f0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y418 ff4 fs2 fc4 sc0 ls2 ws14\">SEC<span class=\"_ _2\"></span>OND<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x24 hc y6f1 ff4 fs2 fc6 sc0 ls2 ws2\">static </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xb he y6f2 ff2 fs2 fc8 sc0 ls2 ws2\">float const <span class=\"_ _2\"></span><span class=\"fc0 ws14\">SECO<span class=\"_ _2\"></span>ND(<span class=\"fcb\">59.<span class=\"_ _2\"></span>f<span class=\"fc0 ls74 ws59\">);<span class=\"ls2 ws2\"> </span></span></span></span></div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x0 he y6f3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y6f4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y6f5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x0 hc y6f6 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 he y6f7 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"_ _2\"></span>une se<span class=\"_ _2\"></span>conde<span class=\"_ _2\"></span>. </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y6f8 ff4 fs2 fc4 sc0 ls2 ws14\">WI<span class=\"_ _2\"></span>TH<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x0 hc y6f9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y6fa ff4 fs2 fc5 sc0 ls2 ws2\">#de<span class=\"_ _2\"></span>fine <span class=\"_ _4\"></span>WITH</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x33 he y6fb ff2 fs2 fc0 sc0 ls2 ws2\">(_SI<span class=\"_ _2\"></span>ZE) </div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x24 hc y6fc ff4 fs2 fc9 sc0 ls2 ws2\">Code Source</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y499 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x24 he y6fd ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>parcou<span class=\"_ _1\"></span>rir <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> tableau <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> vector. </span></span></span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x34 hc y6fe ff4 fs2 fc5 sc0 ls75 ws5a\">_I<span class=\"ls1a ws2\"> <span class=\"ff2 fc0 ls2\">est <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>omp<span class=\"_ _2\"></span>teur. </span></span></span></span></div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x0 he y6ff ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y700 ff9 fs2 fc0 sc0 ls2 ws2\">Exe<span class=\"_ _2\"></span>mple: </div><div class=\"t m0 x24 hc y701 ff4 fs2 fc5 sc0 ls2 ws14\">WIT<span class=\"_ _2\"></span>H</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xb hc y1ad ff2 fs2 fc0 sc0 ls2 ws14\">(vect<span class=\"_ _2\"></span>oreA<span class=\"_ _2\"></span>rray.<span class=\"_ _2\"></span><span class=\"ff4 fc5\">size<span class=\"_ _2\"></span><span class=\"ff2 fc0 ls60 ws49\">())<span class=\"ls2 ws2\"> </span></span></span></div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x24 he y6b6 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hc y702 ff2 fs2 fc0 sc0 ls2 ws14\">vec<span class=\"_ _2\"></span>toreAr<span class=\"_ _2\"></span>ray[<span class=\"_ _2\"></span><span class=\"ff4 fc5 ls76 ws5b\">_I<span class=\"ff2 fc0 ls2 ws14\">]-<span class=\"ff3\">&gt;f<span class=\"_ _2\"></span>uncti<span class=\"_ _2\"></span>on(…);<span class=\"ff2 ws2\"> </span></span></span></span></div></div><div class=\"c x23 y6e9 w4 h35\"><div class=\"t m0 x24 he y703 ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf51\" class=\"pf w0 h0\" data-page-no=\"51\"><div class=\"pc pc51 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">82<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y6a0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">1.6</div><div class=\"t m3 x1c hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1be ff4 fs2 fc4 sc0 ls2 ws14\">str<span class=\"_ _2\"></span>ToWSt<span class=\"_ _2\"></span>r<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc5 sc0 ls2 ws2\">std::wstring <span class=\"_ _2\"></span><span class=\"ff2 fc0 ws14\">strToWSt<span class=\"_ _1\"></span>r(<span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5\">std::strin<span class=\"_ _1\"></span>g <span class=\"_ _2\"></span><span class=\"ff2 fc0\">&amp;s<span class=\"_ _2\"></span>tr<span class=\"_ _2\"></span>) </span></span></span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e3 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff2 fs2 fc0 sc0 ls2 ws2\">Convertie <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff4\">std::string </span><span class=\"ls24 ws1c\">en</span> <span class=\"_ _2\"></span><span class=\"ff4\">std::<span class=\"_ _2\"></span>wstr<span class=\"_ _2\"></span>ing. </span></span></span></div><div class=\"t m0 x1 hc y1e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">1.7</div><div class=\"t m3 x1c hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">num<span class=\"_ _2\"></span>ToStr<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y350 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt; </span>typen<span class=\"_ _1\"></span>ame <span class=\"ff2 fc0\">T&gt; </span></div><div class=\"t m0 x6 hc y2be ff4 fs2 fc5 sc0 ls2 ws2\">std::string <span class=\"_ _4\"></span><span class=\"ff2 fc0\">num<span class=\"_ _1\"></span>ToStr(T <span class=\"_ _2\"></span>val) </span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c9 ff2 fs2 fc0 sc0 ls2 ws2\">Convertie <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> n<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>mérique <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> <span class=\"ff4\">st<span class=\"_ _2\"></span>d::<span class=\"_ _2\"></span>string<span class=\"_ _2\"></span>. </span></span></span></span></span></div><div class=\"t m0 x1 hc y371 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ed ff4 fs2 fc4 sc0 ls2 ws14\">1.8</div><div class=\"t m3 x1c hd y1ed ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1ed ff4 fs2 fc4 sc0 ls2 ws2\">str<span class=\"_ _2\"></span>ToNum<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y1cb ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _4\"></span><span class=\"ff2 fc0 ls6b\">&lt;<span class=\"ff4 fc5 ls2\">typen<span class=\"_ _1\"></span>ame <span class=\"_ _4\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y353 ff2 fs2 fc0 sc0 ls2 ws2\">T <span class=\"_ _4\"></span>strToNum(<span class=\"_ _1\"></span><span class=\"fc8\">const <span class=\"ff4 fc5\">std::string<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff2 fc0\">&amp;s<span class=\"_ _4\"></span>tr) </span></span></span></div><div class=\"t m0 x1 he y3ec ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3ed ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1f1 ff2 fs2 fc0 sc0 ls2 ws2\">Convertie <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff4\">std::string </span><span class=\"ls24 ws1c\">en</span> <span class=\"ls2c ws21\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> numé<span class=\"_ _2\"></span>rique<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y28f ff4 fs2 fc4 sc0 ls2 ws14\">1.9</div><div class=\"t m3 x1c hd y28f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y28f ff4 fs2 fc4 sc0 ls2 ws2\">num<span class=\"_ _2\"></span>ToWSt<span class=\"_ _2\"></span>r </div><div class=\"t m0 x6 hc y290 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _4\"></span><span class=\"ff2 fc0\">&lt;<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"ff4 fc5\">typename<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y1d1 ff4 fs2 fc5 sc0 ls2 ws2\">std::wstring <span class=\"_ _2\"></span><span class=\"ff2 fc0\">numToWSt<span class=\"_ _1\"></span>r(T <span class=\"_ _2\"></span>va<span class=\"_ _2\"></span>l)<span class=\"_ _2\"></span> </span></div><div class=\"t m0 x1 he y373 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc ycb ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1d2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d3 ff2 fs2 fc0 sc0 ls2 ws2\">Convertie <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> n<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>mérique <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> <span class=\"ff4\">st<span class=\"_ _2\"></span>d::<span class=\"_ _2\"></span>wstrin<span class=\"_ _2\"></span>g. </span></span></span></span></span></div><div class=\"t m2 xa hc y294 ff4 fs2 fc4 sc0 ls2 ws14\">1.10</div><div class=\"t m3 x20 hd y294 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y294 ff4 fs2 fc4 sc0 ls2 ws2\">wri<span class=\"_ _2\"></span>teZero<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y9f ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt; </span>typen<span class=\"_ _1\"></span>ame <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"ls2 ws2\"> </span></span></div><div class=\"t m0 x6 hc y1d4 ff4 fs2 fc5 sc0 ls2 ws2\">std::string <span class=\"ff2 fc0\">writeZero(T val, <span class=\"_ _2\"></span><span class=\"fc8\">int<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">zeroNum<span class=\"_ _1\"></span>ber <span class=\"_ _2\"></span>= <span class=\"fcb ws14\">1<span class=\"_ _2\"></span><span class=\"fc0 ws2\">) </span></span></span></span></span></div><div class=\"t m0 x6 hc y44f ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y267 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y6ba ff2 fs2 fc0 sc0 ls2 ws2\">Dessine des <span class=\"_ _2\"></span>zeros devant <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>nomb<span class=\"_ _2\"></span>re. </div><div class=\"t m0 x6 hc y22d ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"fc0\">zeroNumber <span class=\"ff2\">représente <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>nombre <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> zéro à <span class=\"_ _2\"></span>aff<span class=\"_ _2\"></span>iche<span class=\"_ _2\"></span>r. </span></span></span></span></div><div class=\"t m0 x1 he y93 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y451 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 hc y134 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y5d7 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y704 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y1db ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y96 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y705 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y5a3 ff4 fs2 fc4 sc0 ls2 ws14\">1.11</div><div class=\"t m3 x20 hd y5a3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y5a3 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>MSecon<span class=\"_ _2\"></span>d<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y706 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0 ws14\">g<span class=\"_ _1\"></span>etMSecond(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">float <span class=\"_ _2\"></span>co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">&amp;DELT<span class=\"_ _2\"></span>A_TIM<span class=\"_ _2\"></span>E) </span></span></span></div><div class=\"t m0 x6 hc y3c ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div><div class=\"c x23 y707 w4 h36\"><div class=\"t m0 x0 hc y708 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 he y5e3 ff2 fs2 fc8 sc0 ls2 ws2\">int </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x35 he y5d7 ff2 fs2 fc0 sc0 ls2 ws14\">var<span class=\"_ _2\"></span>(<span class=\"fcb\">7</span><span class=\"ls60 ws49\">);</span><span class=\"ws2\"> </span></div></div><div class=\"c x23 y707 w4 h36\"><div class=\"t m0 x24 hc y709 ff4 fs2 fc5 sc0 ls2 ws2\">std::cout </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x36 hc y599 ff2 fs2 fc0 sc0 ls2e\">&lt;&lt;<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">is::<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">writeZero(va<span class=\"_ _1\"></span>r, <span class=\"_ _2\"></span><span class=\"fcb ls2e\">2<span class=\"fc0 ls2\">) &lt;&lt; std::endl; <span class=\"_ _2\"></span><span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"ls20 ws18\">Ça</span> <span class=\"_ _2\"></span>affiche dans <span class=\"_ _2\"></span>la co<span class=\"_ _1\"></span>nsole <span class=\"ff3 ws14\">“0<span class=\"_ _2\"></span>07”<span class=\"ff2 fc0 ws2\"> </span></span></span></span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf52\" class=\"pf w0 h0\" data-page-no=\"52\"><div class=\"pc pc52 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbsRHEIAxFwdONU0L674+UHLmMm+PvdiBB8ga7uvsDAADApb5WAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqswIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8VAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEA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qg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">83<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y6a0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> temps <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’exécuti<span class=\"_ _1\"></span>on<span class=\"ff2 ws2\"> <span class=\"ls24 ws1c\">en</span> m<span class=\"_ _2\"></span>illi<span class=\"_ _2\"></span>secon<span class=\"_ _2\"></span>de. </span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">1.12</div><div class=\"t m3 x20 hd y2bc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">mak<span class=\"_ _2\"></span>eTime<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc5 sc0 ls2 ws2\">std::tm <span class=\"ff2 fc0 ws14\">makeTime(<span class=\"fc8 ws2\">int <span class=\"fc0\">year, <span class=\"_ _2\"></span><span class=\"fc8\">int <span class=\"fc0\">month, </span>int <span class=\"_ _2\"></span><span class=\"fc0\">d<span class=\"_ _2\"></span>ay) </span></span></span></span></span></div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0\">une <span class=\"_ _2\"></span><span class=\"ff4\">structure<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>tm <span class=\"ff2\">qui représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>date<span class=\"_ _4\"></span>. </span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">1.13</div><div class=\"t m3 x20 hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">che<span class=\"_ _2\"></span>ckDa<span class=\"_ _2\"></span>teLimit<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0 ws14\">checkDa<span class=\"_ _1\"></span>teLimit(<span class=\"fc8 ws2\">int <span class=\"fc0\">year, </span>int <span class=\"_ _2\"></span><span class=\"fc0\">month, <span class=\"fc8\">int </span>d<span class=\"_ _4\"></span>ay)<span class=\"_ _2\"></span> </span></span></span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e ff2 fs2 fc0 sc0 ls2 ws2\">Verifie <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>date limite <span class=\"ls24 ws1c\">en</span> fonction <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> date <span class=\"_ _2\"></span>systeme<span class=\"_ _4\"></span>.<span class=\"_ _1\"></span> </span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ed ff9 fs2 fc0 sc0 ls2 ws2\">Exe<span class=\"_ _2\"></span>mple: </div><div class=\"t m0 x1 hc y70a ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y70b ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y70c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y53d ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y225 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y226 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc yc6 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y1ce ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y70d ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y26 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y385 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y290 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y229 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y1d1 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y47b ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y2a ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y70e ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y293 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y70f ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y294 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y12b ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y2e ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y47d ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y211 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y710 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y47e ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y1f7 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y1d6 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y446 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y238 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y711 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y1fa ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y712 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y1da ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y218 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y1fc ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y4ae ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y713 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y714 ff4 fs2 fc4 sc0 ls2 ws14\">1.17</div><div class=\"t m3 x20 hd y714 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y714 ff4 fs2 fc4 sc0 ls2 ws14\">ran<span class=\"_ _2\"></span>dom<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y715 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y716 ff4 fs2 fc5 sc0 ls2 ws2\">inline <span class=\"_ _2\"></span><span class=\"ff2 fc8\">int <span class=\"fc0 ws14\">random(</span>unsigned int <span class=\"_ _2\"></span><span class=\"fc0\">limi<span class=\"_ _2\"></span>t) </span></span></div><div class=\"t m0 x1 he y717 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y718 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div><div class=\"c x6 y719 w14 h37\"><div class=\"t m0 x0 hc y71a ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">ans<span class=\"_ _1\"></span>wer = <span class=\"_ _2\"></span>(is::checkDa<span class=\"_ _1\"></span>teLimit(<span class=\"fcb ls2e\">2023</span>,<span class=\"_ _1\"></span> <span class=\"fcb ls2e\">1</span><span class=\"ls58\">, <span class=\"_ _2\"></span><span class=\"fcb ls2e\">1<span class=\"fc0 ls2\">)<span class=\"_ _1\"></span> ? <span class=\"_ _2\"></span><span class=\"ff4 fc5\">true <span class=\"ff2 fc0\">: </span>false <span class=\"_ _2\"></span><span class=\"ff2 fcc ls73\">//<span class=\"ls2\"> Retourne <span class=\"ff4\">false <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> date <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> cours e<span class=\"_ _2\"></span>st <span class=\"_ _1\"></span>2022<span class=\"_ _2\"></span>/12/3<span class=\"_ _2\"></span>1<span class=\"fc0\"> </span></span></span></span></span></span></span></span></span></span></span></span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xa hc y71b ff4 fs2 fc4 sc0 ls2 ws2\">1<span class=\"_ _2\"></span>.14<span class=\"_ _2\"></span> <span class=\"_ _1a\"> </span>show<span class=\"_ _2\"></span>Log<span class=\"fc0\"> </span></div></div><div class=\"c x6 y719 w14 h37\"><div class=\"t m0 x0 hc y71c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 he y71d ff2 fs2 fc8 sc0 ls2 ws2\">void </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x25 hc y71e ff2 fs2 fc0 sc0 ls2 ws14\">showLog(<span class=\"fc8 ws2\">c<span class=\"_ _1\"></span>onst </span><span class=\"ff4 fc5\">std::string</span><span class=\"ws2\">&amp;<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>str, <span class=\"fc8\">b<span class=\"_ _2\"></span>ool<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">stopApplica<span class=\"_ _1\"></span>tion <span class=\"_ _2\"></span>=<span class=\"_ _1\"></span> <span class=\"ff4 fc5 ws14\">false</span><span class=\"ls3c\">) </span></span></span></span></div></div><div class=\"c x6 y719 w14 h37\"><div class=\"t m0 x0 hc y71f ff4 fs2 fc9 sc0 ls2 ws2\">Code Source</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y720 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x6 y719 w14 h37\"><div class=\"t m0 x0 hc y36f ff2 fs2 fc0 sc0 ls2 ws2\">Affiche des <span class=\"_ _4\"></span>m<span class=\"_ _1\"></span>essages dans la console. <span class=\"ls3a ws2c\">Si</span> <span class=\"_ _2\"></span><span class=\"ff4\">stopApplica<span class=\"_ _1\"></span>tion <span class=\"ff2\">est <span class=\"_ _2\"></span><span class=\"ff4\">vrai <span class=\"ff2 ls3f ws2f\">il</span><span class=\"ff2\"> arrête <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’app<span class=\"_ _2\"></span>lica<span class=\"_ _2\"></span>tion.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div></div><div class=\"c xa y721 w15 h38\"><div class=\"t m0 x0 hc y36f ff4 fs2 fc4 sc0 ls2 ws14\">1<span class=\"_ _2\"></span>.15<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div></div><div class=\"c x1f y721 w16 h38\"><div class=\"t m0 x0 hc y36f ff4 fs2 fc4 sc0 ls2 ws14\">arra<span class=\"_ _2\"></span>ySiz<span class=\"_ _2\"></span>e<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x6 y722 w17 h39\"><div class=\"t m0 x0 h18 y723 ff4 fs9 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ws3e\">&lt;<span class=\"_ _2\"></span><span class=\"ff4 fc5 ws2\">size_t <span class=\"ff2 fc0\">SIZE, </span>cla<span class=\"_ _2\"></span>ss<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls78 ws5c\">T&gt;<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x0 he y724 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 hc y725 ff4 fs2 fc5 sc0 ls2 ws2\">inline <span class=\"_ _2\"></span>size_<span class=\"_ _1\"></span>t <span class=\"_ _2\"></span><span class=\"ff2 fc0\">arraySize(T <span class=\"_ _2\"></span>(&amp;arr)[<span class=\"_ _2\"></span>SIZE]<span class=\"_ _2\"></span>) </span></div><div class=\"t m0 x0 hc y726 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc yc1 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x6 y722 w17 h39\"><div class=\"t m0 x0 hc y727 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 hc y703 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff3\">tail<span class=\"_ _1\"></span>le d’un<span class=\"ff2\"> t<span class=\"_ _2\"></span>ableau<span class=\"_ _2\"></span>. </span></span></span></span></div></div><div class=\"c xa y728 w15 h38\"><div class=\"t m0 x0 hc y3c2 ff4 fs2 fc4 sc0 ls2 ws14\">1<span class=\"_ _2\"></span>.16<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div></div><div class=\"c x1f y728 w18 h38\"><div class=\"t m0 x0 hc y3c2 ff4 fs2 fc4 sc0 ls2 ws14\">cho<span class=\"_ _2\"></span>ose<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x23 y729 w19 h3a\"><div class=\"t m0 x0 hc y72a ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">typename </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x0 he y72b ff2 fs2 fc0 sc0 ls2 ws2\">T <span class=\"_ _2\"></span>choos<span class=\"_ _1\"></span>e(</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x36 he y72c ff2 fs2 fc8 sc0 ls2 ws2\">unsigned s<span class=\"_ _1\"></span>hort <span class=\"fc0\">valNumber,<span class=\"_ _1\"></span> T x1, T <span class=\"_ _2\"></span>x2, <span class=\"_ _1\"></span>T <span class=\"ls35 ws29\">x3</span> = <span class=\"fcb ls2e\">0</span>, T <span class=\"ls35 ws29\">x4</span> <span class=\"_ _2\"></span>= <span class=\"fcb ls2e\">0</span>, T <span class=\"_ _2\"></span><span class=\"ls35 ws29\">x5<span class=\"ls2 ws2\"> = <span class=\"fcb ls2e\">0</span>, <span class=\"_ _2\"></span>T <span class=\"ls35 ws29\">x6<span class=\"_ _1\"></span></span> = <span class=\"fcb ls2e\">0</span>, T <span class=\"ls35 ws29\">x7</span> <span class=\"_ _2\"></span>= <span class=\"fcb ls2e\">0</span>, T <span class=\"_ _2\"></span><span class=\"ls35 ws29\">x8<span class=\"ls2 ws2\"> = <span class=\"fcb ls2e\">0</span>, T </span>x9<span class=\"ls2 ws2\"> = <span class=\"_ _2\"></span><span class=\"fcb\">0</span></span></span></span></span></span></div></div><div class=\"c x23 y729 w19 h3a\"><div class=\"t m0 x37 he y72b ff2 fs2 fc0 sc0 ls2 ws2\">) </div><div class=\"t m0 x0 h18 y72d ff4 fs9 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Sour<span class=\"_ _2\"></span>ce</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 h18 y5fa ff4 fs9 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y729 w19 h3a\"><div class=\"t m0 x0 he y2e7 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> faire <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> choix <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’une<span class=\"ff2 ws2\"> valeur <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>faç<span class=\"_ _1\"></span>on <span class=\"_ _2\"></span>aléat<span class=\"_ _2\"></span>oire. </span></span></span></span></span></span></div><div class=\"t m0 x0 he y72e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 hc y72f ff4 fs2 fca sc0 ls2 ws2\">Paramètre </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x38 hc y730 ff4 fs2 fc0 sc0 ls2 ws2\">valNumber<span class=\"_ _1\"></span> <span class=\"ff2 ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> nombre valeur <span class=\"_ _2\"></span>à te<span class=\"_ _2\"></span>ster. </span></span></div></div><div class=\"c x23 y729 w19 h3a\"><div class=\"t m0 x0 hc y731 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 hc y732 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 hc y733 ff4 fs2 fc5 sc0 ls2 ws2\">std::cout <span class=\"ff2 fc0 ls2e ws26\">&lt;&lt;<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff4 fc5\">is:: <span class=\"ff2 fc0 ws14\">choose(<span class=\"fcb ls6b\">3</span><span class=\"ws2\">, <span class=\"fcb ls2e ws26\">7,</span><span class=\"fcb\"> <span class=\"_ _2\"></span><span class=\"ls77 ws5d\">12,<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>4<span class=\"fc0\">) <span class=\"ls2e ws26\">&lt;&lt;<span class=\"_ _1\"></span></span> std::endl; <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"ls20 ws18\">Ça</span> <span class=\"_ _2\"></span>affiche dans <span class=\"ls1d ws15\">la</span> console <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>façon <span class=\"_ _1\"></span>aléatoire <span class=\"_ _e\"> </span>7 <span class=\"ls2a ws20\">ou</span> <span class=\"ls2e\">12</span> <span class=\"_ _2\"></span><span class=\"ls2a ws20\">ou<span class=\"ls2 ws2\"> 4<span class=\"_ _4\"></span><span class=\"fc0\"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf53\" class=\"pf w0 h0\" data-page-no=\"53\"><div class=\"pc pc53 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbwQ2EIBBA0WWjiYkF0H93NMBNmG3Cw2bmvQ4YJPFHaRHxAQAAIKmvEQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+owAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANVnBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPiMAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUZAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAABAUkfx9bfWik9gjNF7dxIAAED15bTW0r2OAQAAZH7njwhTAAAAyMq9PgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAAD4b0fNZc857T0AABR037fqK2Hv7XEHAAAq8IcnAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAADI4Ki57Ou67D0AAKD60nqex94DAEBB53mqPtUHAACQh3t9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAALyrRYQpAAAAZOVbHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1cev/TomARAKoCjKi2AHc7gaQBB+G60gOBrCCIYQ/qhNHM0gnrO99W0XAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+nbJH3YAAACGSURBVAAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAIDfVt/Sb0mSY1ivOiZ7ezZlevdcuruOicsAAAA+5AHVlDbclDEtMwAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">84<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y6a0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0\">une <span class=\"_ _2\"></span>valeur aléatoire <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>fonction <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> lim<span class=\"_ _2\"></span>ite<span class=\"_ _2\"></span>. </span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c0 ff4 fs2 fc4 sc0 ls2 ws14\">1.18</div><div class=\"t m3 x20 hd y1c0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c0 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tVarL<span class=\"_ _2\"></span>imit </div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls6b\">&lt;</span>typename <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></div><div class=\"t m0 x6 he y613 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setVa<span class=\"_ _1\"></span>rLimit(T &amp;var, T valMin, T <span class=\"_ _2\"></span>valM<span class=\"_ _2\"></span>ax) </span></div><div class=\"t m0 x6 hc y42f ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y350 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’encadrer</span> <span class=\"_ _4\"></span>u<span class=\"_ _1\"></span>ne va<span class=\"_ _2\"></span>leur. </div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ea ff4 fs2 fc4 sc0 ls2 ws14\">1.19</div><div class=\"t m3 x20 hd y1ea ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ea ff4 fs2 fc4 sc0 ls2 ws14\">is<span class=\"_ _2\"></span>In<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y734 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0 ws14\">isIn(</span>unsigned short <span class=\"fc0\">valN<span class=\"_ _1\"></span>umber, </span>int const <span class=\"fc0\">var, </span>int <span class=\"fc0\">x1, </span>int <span class=\"fc0\">x2, </span>int <span class=\"fc0 ls7a ws5e\">x3</span><span class=\"fc0\"> <span class=\"_ _2\"></span>= <span class=\"fcb ls2e\">0</span><span class=\"ls58\">, </span><span class=\"fc8\">int </span><span class=\"ls35 ws29\">x4</span> = <span class=\"fcb ls2e\">0</span><span class=\"ls58\">, </span><span class=\"fc8\">int </span><span class=\"ls35 ws29\">x5</span> <span class=\"ls38\">= <span class=\"_ _2\"></span><span class=\"fcb ls2e\">0<span class=\"fc0 ls2\">, <span class=\"fc8\">int </span><span class=\"ls35 ws29\">x6</span> <span class=\"ls2e\">= </span></span><span class=\"ls6b\">0<span class=\"fc0 ls2\">, <span class=\"fc8\">int </span><span class=\"ls35 ws29\">x7</span> <span class=\"ls2e\">= </span></span></span>0<span class=\"fc0 ls2\">, <span class=\"_ _2\"></span><span class=\"fc8\">int </span></span></span></span></span></div><div class=\"t m0 x6 he y735 ff2 fs2 fc0 sc0 ls2 ws2\">x8 = <span class=\"fcb ls6b\">0</span><span class=\"ls58\">, </span><span class=\"fc8\">int </span>x9 = <span class=\"fcb ls2e\">0</span>) </div><div class=\"t m0 x6 hc y5bd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y736 ff2 fs2 fc0 sc0 ls2 ws2\">Vérifie <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>valeur <span class=\"ff3 ws14\">d’une</span> <span class=\"_ _2\"></span>va<span class=\"_ _1\"></span>riable <span class=\"ls3d ws2d\">se<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> trouve dans <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>ensemble de<span class=\"_ _1\"></span> v<span class=\"_ _2\"></span>aleur<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y338 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y339 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 hc y5be ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y737 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y738 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y566 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y33a ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y33b ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y54 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y739 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y73a ff4 fs2 fc4 sc0 ls2 ws14\">1.20</div><div class=\"t m3 x20 hd y73a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y73a ff4 fs2 fc4 sc0 ls2 ws14\">is<span class=\"_ _2\"></span>Betwee<span class=\"_ _2\"></span>n<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y100 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0 ws14\">isB<span class=\"_ _1\"></span>etween(<span class=\"fc8 ws2\">float </span><span class=\"ls29 ws1f\">a,</span><span class=\"ws2\"> <span class=\"_ _4\"></span><span class=\"fc8\">fl<span class=\"_ _1\"></span>oat <span class=\"_ _1\"></span><span class=\"fc0 ls7b ws5f\">b,</span><span class=\"fc0\"> </span>float <span class=\"fc0 ls17 ws60\">c)</span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x6 hc y73b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y73c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y73d ff2 fs2 fc0 sc0 ls2 ws2\">Vérifies <span class=\"ls28 ws1e\">si</span> <span class=\"_ _4\"></span>u<span class=\"_ _1\"></span>ne valeur <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">se<span class=\"ls2 ws2\"> trouve dans <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> inter<span class=\"_ _2\"></span>valle. </span></span></span></span></div><div class=\"t m2 xa hc y73e ff4 fs2 fc4 sc0 ls2 ws14\">1.21</div><div class=\"t m3 x20 hd y73e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y73e ff4 fs2 fc4 sc0 ls2 ws14\">is<span class=\"_ _2\"></span>Crossin<span class=\"_ _2\"></span>g<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y73f ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0 ws14\">isCr<span class=\"_ _1\"></span>ossing(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"fc0\">l1, </span>float <span class=\"_ _2\"></span><span class=\"fc0\">r1, <span class=\"fc8\">float </span>l2, <span class=\"_ _4\"></span><span class=\"fc8\">fl<span class=\"_ _1\"></span>oat <span class=\"fc0\">r<span class=\"_ _2\"></span>2)<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x6 hc y649 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y46e ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y740 ff2 fs2 fc0 sc0 ls2 ws2\">Vérifie <span class=\"ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> point <span class=\"_ _2\"></span>intersect<span class=\"_ _1\"></span>e <span class=\"ls2c ws21\">un</span> <span class=\"_ _4\"></span>autre. </span></span></span></span></div><div class=\"t m2 xa hc y741 ff4 fs2 fc4 sc0 ls2 ws14\">1.22</div><div class=\"t m3 x20 hd y741 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y741 ff4 fs2 fc4 sc0 ls2 ws14\">si<span class=\"_ _4\"></span>de<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y742 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"_ _2\"></span><span class=\"fc0\">side(Poi<span class=\"_ _1\"></span>nt <span class=\"_ _2\"></span><span class=\"ls63 ws4d\">m,<span class=\"ls2 ws2\"> Point a,Point <span class=\"ls7c ws61\">b)</span> </span></span></span></div><div class=\"t m0 x1 he y743 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y473 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc yf1 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0 ls79\">-</span><span class=\"ff2 fcb\">1 <span class=\"fc0\">à <span class=\"_ _2\"></span>gauche, <span class=\"fcb\">1 </span>à droite, <span class=\"fcb\">0 <span class=\"_ _2\"></span><span class=\"fc0 ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ff4\">a b c </span>sont a<span class=\"_ _2\"></span>ligné<span class=\"_ _2\"></span>s. </span></span></span></span></span></div><div class=\"t m0 x1 he y744 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y745 ff4 fs2 fc4 sc0 ls2 ws14\">1.23</div><div class=\"t m3 x20 hd y745 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y745 ff4 fs2 fc4 sc0 ls2 ws2\">si<span class=\"_ _2\"></span>gn<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y746 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"fc0 ws14\">sign(</span>float <span class=\"fc0 ls35 ws29\">x)</span><span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y457 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y747 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>signe <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> v<span class=\"_ _2\"></span>aleur<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y748 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y749 ff4 fs2 fc4 sc0 ls2 ws14\">1.24</div><div class=\"t m3 x20 hd y749 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y749 ff4 fs2 fc4 sc0 ls2 ws14\">poi<span class=\"_ _2\"></span>ntDir<span class=\"_ _2\"></span>ection<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x23 y74a w4 h3b\"><div class=\"t m0 x0 hc y74b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 he y696 ff2 fs2 fc8 sc0 ls2 ws2\">int </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x35 he y2f8 ff2 fs2 fc0 sc0 ls2 ws14\">year<span class=\"_ _2\"></span>(<span class=\"fcb\">202<span class=\"_ _2\"></span>0<span class=\"fc0 ls60 ws49\">);<span class=\"ls2 ws2\"> </span></span></span></div></div><div class=\"c x23 y74a w4 h3b\"><div class=\"t m0 x24 hc y74c ff4 fs2 fc5 sc0 ls40 ws30\">if<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 hc y5bf ff2 fs2 fc0 sc0 ls5b\">(<span class=\"ff4 fc5 ls2 ws14\">is::</span><span class=\"ls2 ws14\">isIn(<span class=\"fcb ls2e\">3</span><span class=\"ws2\">, year, <span class=\"fcb ls2e\">2020</span><span class=\"ls58\">, </span></span><span class=\"fcb\">2005</span><span class=\"ws2\">, </span><span class=\"fcb\">2000</span></span><span class=\"ls3c ws39\">))</span><span class=\"ls2 ws2\"> <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"_ _4\"></span>C<span class=\"_ _1\"></span>ette condition s<span class=\"_ _1\"></span>era <span class=\"_ _2\"></span>vra<span class=\"_ _1\"></span>ie car <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> va<span class=\"_ _1\"></span>leur <span class=\"ls1e ws16\">de</span> <span class=\"ff4\">year <span class=\"_ _4\"></span><span class=\"ff2 ls7d ws62\">ce<span class=\"ls2 ws2\"> trouve <span class=\"_ _2\"></span>dans <span class=\"ls1d ws15\">la</span> f<span class=\"_ _2\"></span>onct<span class=\"_ _2\"></span>ion<span class=\"fc0\"> </span></span></span></span></span></span></span></span></span></div></div><div class=\"c x23 y74a w4 h3b\"><div class=\"t m0 x24 he y74d ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 he y640 ff2 fs2 fcc sc0 ls41 ws31\">//<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls42 ws32\">Do<span class=\"ls2 ws2\"> some<span class=\"_ _2\"></span>thin<span class=\"_ _2\"></span>g<span class=\"fc0\"> </span></span></span></span></div></div><div class=\"c x23 y74a w4 h3b\"><div class=\"t m0 x24 he y36f ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf54\" class=\"pf w0 h0\" data-page-no=\"54\"><div class=\"pc pc54 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB27NjE4SBAArDPHABN7jCOWwdQAhkG7OCkDJDOIJDCOlOJznLtJYm+b7uyntwxc8BAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPpMAAAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAA8KcOO79/kp0vUGstpXgJAACwVf76AAAAVB8AAADrlNaaFQAAALbKXx8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAPNvur4AAABbSURBVAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAAD8WH33y5QkeV7H99wlj9Pr2N+W89CfP3OXmAwAAGBFvulKJNF1nM0pAAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">85<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y6a0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">typename </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">T <span class=\"_ _2\"></span>pointDirectio<span class=\"_ _1\"></span>n(<span class=\"fc8\">float </span>x1, <span class=\"_ _2\"></span><span class=\"fc8\">floa<span class=\"_ _1\"></span>t <span class=\"fc0\">y1, <span class=\"_ _4\"></span><span class=\"fc8\">fl<span class=\"_ _1\"></span>oat <span class=\"fc0\">x2, </span>float <span class=\"_ _4\"></span><span class=\"fc0\">y2)<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y618 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y108 ff2 fs2 fc0 sc0 ls2 ws2\">Determine <span class=\"ff3 ws14\">l’angle</span> <span class=\"_ _2\"></span>entre deux <span class=\"_ _2\"></span>point<span class=\"_ _2\"></span>s. </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">1.25</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">poi<span class=\"_ _2\"></span>ntDis<span class=\"_ _2\"></span>tanc<span class=\"_ _2\"></span>e<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y3eb ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0 ws14\">pointD<span class=\"_ _1\"></span>istance(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">x1, <span class=\"fc8\">float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0\">y1, <span class=\"fc8\">float </span>x2, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">y2<span class=\"_ _2\"></span>) </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y69e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1eb ff2 fs2 fc0 sc0 ls2 ws2\">Determine <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>dista<span class=\"_ _1\"></span>nce entre <span class=\"_ _2\"></span>deux poi<span class=\"_ _2\"></span>nts. </div><div class=\"t m2 xa hc y1ec ff4 fs2 fc4 sc0 ls2 ws14\">1.26</div><div class=\"t m3 x20 hd y1ec ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ec ff4 fs2 fc4 sc0 ls2 ws2\">ra<span class=\"_ _2\"></span>dToDeg </div><div class=\"t m0 x6 he y619 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"fc0 ws14\">radToDeg(</span>float <span class=\"_ _1\"></span><span class=\"fc0\">x) </span></div><div class=\"t m0 x6 hc y1ee ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y61a ff2 fs2 fc0 sc0 ls2 ws2\">Convertie <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> radient en dé<span class=\"_ _2\"></span>grée<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y1f0 ff4 fs2 fc4 sc0 ls2 ws14\">1.27</div><div class=\"t m3 x20 hd y1f0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f0 ff4 fs2 fc4 sc0 ls2 ws2\">deg<span class=\"_ _2\"></span>ToRad<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y53e ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"fc0 ws14\">degToRad(</span>fl<span class=\"_ _1\"></span>oat <span class=\"fc0\">x) </span></div><div class=\"t m0 x6 hc ybd ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y540 ff2 fs2 fc0 sc0 ls2 ws2\">Convertie <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> dégrée en r<span class=\"_ _2\"></span>adian<span class=\"_ _2\"></span>t. </span></span></div><div class=\"t m2 xa hc y1d1 ff4 fs2 fc4 sc0 ls2 ws14\">1.28</div><div class=\"t m3 x20 hd y1d1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1d1 ff4 fs2 fc4 sc0 ls2 ws14\">len<span class=\"_ _2\"></span>gthD<span class=\"_ _2\"></span>irX<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y151 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc ycb ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0 ws14\">lengthDi<span class=\"_ _1\"></span>rX(<span class=\"fc8 ws2\">float <span class=\"fc0\">dir, <span class=\"_ _2\"></span><span class=\"fc8\">flo<span class=\"_ _1\"></span>at <span class=\"fc0\">angle, <span class=\"_ _2\"></span><span class=\"fc8\">bool <span class=\"fc0\">useScreenScale = <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">fals<span class=\"_ _2\"></span>e<span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1d2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d3 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y12a ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>composa<span class=\"_ _1\"></span>nte <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls56 ws43\">x.</span> </span></span></span></span></div><div class=\"t m0 x1 he y1f4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc yce ff4 fs2 fc0 sc0 ls2 ws2\">useScreenScale <span class=\"ff2\">permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> prendre <span class=\"ls29 ws1f\">en<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> compte <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’echell<span class=\"_ _1\"></span>e<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’écran<span class=\"ff2 ws2\"> lors <span class=\"_ _2\"></span>des cal<span class=\"_ _2\"></span>culs. </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y44e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f5 ff4 fs2 fc4 sc0 ls2 ws14\">1.29</div><div class=\"t m3 x20 hd y1f5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f5 ff4 fs2 fc4 sc0 ls2 ws14\">len<span class=\"_ _2\"></span>gthD<span class=\"_ _2\"></span>irY<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y44f ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0 ws14\">lengthDi<span class=\"_ _1\"></span>rY(<span class=\"fc8 ws2\">float <span class=\"fc0\">dir, </span>float <span class=\"_ _2\"></span><span class=\"fc0\">angle, <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">us<span class=\"_ _1\"></span>eScreenScale = <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">fals<span class=\"_ _2\"></span>e<span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y74e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y91 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1d7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22d ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>composa<span class=\"_ _1\"></span>nte <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls34 ws28\">y.</span> </span></span></span></span></div><div class=\"t m0 x1 he y93 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y451 ff4 fs2 fc0 sc0 ls2 ws2\">useScreenScale <span class=\"ff2\">permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> prendre <span class=\"ls29 ws1f\">en<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> compte <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’echell<span class=\"_ _1\"></span>e<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’écran<span class=\"ff2 ws2\"> lors <span class=\"_ _2\"></span>des cal<span class=\"_ _2\"></span>culs. </span></span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc yb8 ff4 fs2 fc4 sc0 ls2 ws14\">1.30</div><div class=\"t m3 x20 hd yb8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yb8 ff4 fs2 fc4 sc0 ls2 ws2\">in<span class=\"_ _2\"></span>crease<span class=\"_ _2\"></span>Var </div><div class=\"t m0 x6 hc y37c ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls6b\">&lt;</span>typename <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></div><div class=\"t m0 x6 he y61e ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">increaseVa<span class=\"_ _1\"></span>r(<span class=\"fc8 ws2\">const float<span class=\"_ _1\"></span> <span class=\"fc0\">&amp;DELTA_TIME, <span class=\"_ _2\"></span>T &amp;var, <span class=\"_ _2\"></span>T in<span class=\"_ _2\"></span>c<span class=\"_ _1\"></span>reaseValue,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>T varFinal, <span class=\"_ _2\"></span>T varMax<span class=\"_ _2\"></span>) </span></span></span></div><div class=\"t m0 x6 hc y1dd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y74f ff2 fs2 fc0 sc0 ls2 ws2\">Incrémente une <span class=\"_ _2\"></span>varia<span class=\"_ _1\"></span>ble avec <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>tem<span class=\"_ _1\"></span>ps <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>éxéc<span class=\"_ _2\"></span>ution<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y575 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf55\" class=\"pf w0 h0\" data-page-no=\"55\"><div class=\"pc pc55 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcu62EMBBA0TWY0DFdINF/DfRBjghhtoUXvp05p4PxJ7gyokXEBwAAgKQmSwAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAkFSvOfZ1XfYeAAAKGmNUG9lbHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAgL9qEVFw7Od57D0AABQ0z7PqAwAAIA9feAIAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAIB8evH5j+MovgLbti3L4iYAAEBWLSJKz99a8RNwnue6rm4CAABkVf2tb9/36iegd9cAAAASq/7WBwAAkJu/uQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAADA/9Zrjv2+r70HAICCpqnc01fR6rvv23EHAICCxhjlQteuAwAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAH5OiwirAAAAkJW3PgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAC+7dcxCYBQAEVRXgQ7mMPVAILw22gFwdEQRjCE8Edt4mgFhXO2t77tAqD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1S3eOm4AAACjSURBVAcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAPCJ6lv6LUlyDOtVx2Rvz6ZM755Ld9cxcRkAAMCPPNIWQG5Fb4NcAAAAAElFTkSuQmCC\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">86<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y6a0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x2f he y750 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y529 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xa hc y751 ff4 fs2 fc4 sc0 ls2 ws2\">1<span class=\"_ _2\"></span>.32<span class=\"_ _2\"></span> <span class=\"_ _1a\"> </span>co<span class=\"_ _2\"></span>llisi<span class=\"_ _2\"></span>onTest<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y6a2 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">collisionTest(R<span class=\"_ _1\"></span>ectangle <span class=\"fc8\">const </span>&amp;a, <span class=\"_ _4\"></span>Rectangl<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"fc0\">&amp;b) </span></span></span></div><div class=\"t m0 x6 he y4dc ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">collisionTest(Ci<span class=\"_ _1\"></span>rcle </span>const <span class=\"fc0\">&amp;a<span class=\"_ _1\"></span>, Circle </span>const <span class=\"fc0\">&amp;b)<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 he y752 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">collisionTest(Ci<span class=\"_ _1\"></span>rcle <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;circl<span class=\"_ _1\"></span>e, <span class=\"_ _4\"></span>R<span class=\"_ _1\"></span>ectangle<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"fc0\">&amp;re<span class=\"_ _4\"></span>c) </span></span></span></span></span></div><div class=\"t m0 x1 he y739 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y73a ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">collisionTest(R<span class=\"_ _1\"></span>ectangle<span class=\"_ _1\"></span> <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;rec,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>Circle <span class=\"fc8\">const </span>&amp;<span class=\"_ _2\"></span>circle<span class=\"_ _2\"></span>) </span></span></span></div><div class=\"t m0 x6 hc y753 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y754 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y467 ff2 fs2 fc0 sc0 ls2 ws2\">Test <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> collision entre <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> masque <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>coll<span class=\"_ _1\"></span>ision <span class=\"_ _2\"></span>Recta<span class=\"_ _1\"></span>nge <span class=\"ls24 ws1c\">et</span> Ce<span class=\"_ _2\"></span>rcle. </span></span></span></span></div><div class=\"t m2 xa hc y755 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y755 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y755 ff4 fs2 fc4 sc0 ls2 ws2\">Fonction sur <span class=\"_ _4\"></span>les<span class=\"_ _1\"></span> objets<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>SFM<span class=\"_ _4\"></span>L<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y756 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y756 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y756 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tVect<span class=\"_ _2\"></span>or2 </div><div class=\"t m0 x1 hc y757 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y758 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _2\"></span><span class=\"ff2 fc0\">T1, <span class=\"fc8\">typename </span>T<span class=\"_ _4\"></span>2&gt; </span></div><div class=\"t m0 x6 he y759 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setVecto<span class=\"_ _1\"></span>r2(T1 &amp;v, <span class=\"ls48 ws36\">T2</span> <span class=\"ls35 ws29\">x,</span> <span class=\"_ _2\"></span><span class=\"ls48 ws36\">T2<span class=\"ls2 ws2\"> <span class=\"ls34 ws28\">y)</span> </span></span></span></div><div class=\"t m0 x6 hc y5c9 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y75a ff2 fs2 fc0 sc0 ls2 ws2\">Definie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>leur x <span class=\"ls24 ws1c\">et</span> y <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’une<span class=\"ff2 ws2\"> class<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> type <span class=\"_ _2\"></span>Vecto<span class=\"_ _1\"></span>r2 (Vector2f,<span class=\"_ _1\"></span> Vector2i, <span class=\"ff3 ws14\">…<span class=\"_ _4\"></span>).<span class=\"_ _2\"></span><span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y75b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y75c ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y75c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y75c ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjAng<span class=\"_ _2\"></span>le </div><div class=\"t m0 x6 hc y75d ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y75e ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjAngle(T<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>obj)<span class=\"_ _2\"></span> </span></div><div class=\"t m0 x6 hc y75f ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc ye ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l<span class=\"_ _1\"></span>’angle<span class=\"ff2 ws2\"> <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y760 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y761 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y761 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y761 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjXSca<span class=\"_ _2\"></span>le </div><div class=\"t m0 x6 hc y762 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y763 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjXScale(T<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j) </span></div></div><div class=\"c x6 y40f w1a h3c\"><div class=\"t m0 x0 he y764 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"_ _2\"></span><span class=\"fc0 ws14\">var(<span class=\"fcb\">0<span class=\"_ _2\"></span><span class=\"fc0 ls60 ws49\">);<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x0 hc y765 ff4 fs2 fc5 sc0 ls2 ws14\">is::</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x35 he y766 ff2 fs2 fc0 sc0 ls2 ws2\">increaseVar(DELTA_TIM<span class=\"_ _1\"></span>E,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>var, <span class=\"fcb ls2e\">1</span>, <span class=\"fcb ls2e\">15</span>, <span class=\"_ _2\"></span><span class=\"fcb ls2e\">10<span class=\"fc0 ls3c ws39\">));<span class=\"ls2 ws2\"> </span></span></span></div></div><div class=\"c x6 y40f w1a h3c\"><div class=\"t m0 x39 he y765 ff2 fs2 fcc sc0 ls73\">//<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls22 ws1a\">La<span class=\"ls2 ws2\"> variable <span class=\"_ _2\"></span><span class=\"ff3 ws14\">“var”<span class=\"ff2 ws2\"> <span class=\"ls43 ws33\">va</span> </span>s’incrémenter<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> avec <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>val<span class=\"_ _1\"></span>eur <span class=\"_ _2\"></span><span class=\"ls2e ws26\">1.<span class=\"ls2 ws2\"> <span class=\"ls7e ws63\">Si</span> e<span class=\"_ _2\"></span>lle <span class=\"_ _1\"></span>e<span class=\"_ _2\"></span>st<span class=\"fc0\"> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x39 h1a y767 ff2 fs9 fcc sc0 ls7f ws64\">//<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>suppérieur à <span class=\"_ _2\"></span><span class=\"ls80 ws65\">10<span class=\"ls2 ws2\"> elle devient <span class=\"_ _2\"></span><span class=\"ls80 ws65\">15<span class=\"ls2 ws2\"> <span class=\"ls81 ws66\">et</span> <span class=\"_ _2\"></span><span class=\"ff3 ws3e\">l’incrémentation<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> </span>s<span class=\"_ _2\"></span>’arr<span class=\"_ _2\"></span>ête<span class=\"ff2 fc0 ws2\"> </span></span></span></span></span></span></span></div></div><div class=\"c xa y768 w15 h38\"><div class=\"t m0 x0 hc y3ea ff4 fs2 fc4 sc0 ls2 ws14\">1<span class=\"_ _2\"></span>.31<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div></div><div class=\"c x1f y768 w1b h38\"><div class=\"t m0 x0 hc y3ea ff4 fs2 fc4 sc0 ls2 ws14\">dec<span class=\"_ _2\"></span>rease<span class=\"_ _2\"></span>Var<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x23 y769 w1c h3d\"><div class=\"t m0 x0 hc y76a ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">typename </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x0 he y76b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 he y76c ff2 fs2 fc8 sc0 ls2 ws2\">void </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x25 he y76d ff2 fs2 fc0 sc0 ls2 ws14\">decreaseVar(<span class=\"fc8 ws2\">co<span class=\"_ _1\"></span>nst float <span class=\"_ _2\"></span><span class=\"fc0\">&amp;DEL<span class=\"_ _1\"></span>TA_TIME, T &amp;var, <span class=\"_ _2\"></span>T <span class=\"_ _2\"></span>de<span class=\"_ _1\"></span>creaseValue, T varFinal <span class=\"_ _2\"></span>= <span class=\"fcb ls6b\">0</span>, T <span class=\"_ _2\"></span>varMin = <span class=\"fcb ws14\">0</span>)<span class=\"_ _2\"></span> </span></span></div></div><div class=\"c x23 y769 w1c h3d\"><div class=\"t m0 x0 hc y76e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y76f ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y769 w1c h3d\"><div class=\"t m0 x0 he y770 ff2 fs2 fc0 sc0 ls2 ws2\">Décrémente une <span class=\"_ _2\"></span>variable<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>avec <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>temps <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>éxécu<span class=\"_ _2\"></span>tion.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m0 x0 hc y771 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 h18 y772 ff9 fs9 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x0 he y773 ff2 fs2 fc8 sc0 ls2 ws2\">int </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x35 he y774 ff2 fs2 fc0 sc0 ls2 ws14\">var<span class=\"_ _2\"></span>(<span class=\"fcb ls82 ws67\">40</span><span class=\"ls60 ws49\">);</span><span class=\"ws2\"> </span></div></div><div class=\"c x23 y769 w1c h3d\"><div class=\"t m0 x0 hc y775 ff4 fs2 fc5 sc0 ls2 ws14\">is::</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x35 he y776 ff2 fs2 fc0 sc0 ls2 ws2\">decreaseVar(DELTA_<span class=\"_ _1\"></span>TIME,<span class=\"_ _1\"></span> var, <span class=\"fcb ls2e\">1</span><span class=\"ls58\">, <span class=\"fcb ls2e\">20</span></span>, <span class=\"_ _2\"></span><span class=\"fcb ls2e\">25<span class=\"fc0 ls3c ws39\">));<span class=\"ls2 ws2\"> <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"_ _4\"></span><span class=\"ls22 ws1a\">La<span class=\"ls2 ws2\"> variable <span class=\"ff3 ws14\">“var”</span> <span class=\"ls43 ws33\">va</span> <span class=\"_ _4\"></span><span class=\"ls28 ws1e\">se<span class=\"ls2 ws2\"> décrémenter avec <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>va<span class=\"_ _1\"></span>leur <span class=\"_ _2\"></span><span class=\"ls2e ws26\">1.<span class=\"ls2 ws2\"> <span class=\"ls7e ws63\">Si</span> elle e<span class=\"_ _2\"></span>st</span></span></span></span></span></span></span></span></span></span></span></div></div><div class=\"c x23 y769 w1c h3d\"><div class=\"t m0 x3a he y775 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3b he y777 ff2 fs2 fcc sc0 ls73\">//<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>inférieur<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>à <span class=\"ls2e ws26\">25</span> elle devient <span class=\"ls2e\">20</span> <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">et<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>décrémentatio<span class=\"_ _1\"></span>n <span class=\"ff3 ws14\">s<span class=\"_ _2\"></span>’arrête<span class=\"_ _2\"></span><span class=\"ff2 fc0 ws2\"> </span></span></span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf56\" class=\"pf w0 h0\" data-page-no=\"56\"><div class=\"pc pc56 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c0 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0\">l’échelle x<span class=\"ff2\"> <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y778 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y778 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y778 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjYSca<span class=\"_ _2\"></span>le </div><div class=\"t m0 x6 hc y1c3 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y779 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjYScal<span class=\"_ _1\"></span>e(T <span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j) </span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0\">l’échelle y<span class=\"ff2\"> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ob<span class=\"_ _2\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y44d ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y44d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y44d ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjWid<span class=\"_ _2\"></span>th </div><div class=\"t m0 x6 hc y1ec ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y441 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjWidth(T<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j) </span></div><div class=\"t m0 x6 hc y232 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y233 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y353 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’ob<span class=\"_ _4\"></span>jet.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1cc ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1cd ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y1cd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1cd ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjHeig<span class=\"_ _2\"></span>ht </div><div class=\"t m0 x6 hc y1f1 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y28f ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjHeight(T<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j) </span></div><div class=\"t m0 x6 hc y1d0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc ybf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d1 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>ha<span class=\"_ _1\"></span>uteur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’obje<span class=\"_ _2\"></span>t.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y151 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc ycb ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd ycb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc ycb ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFMLT<span class=\"_ _2\"></span>extur<span class=\"_ _2\"></span>eWidt<span class=\"_ _2\"></span>h </div><div class=\"t m0 x6 he y1f2 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0\">getSFMT<span class=\"_ _1\"></span>extureWidth(sf::<span class=\"_ _1\"></span>Texture<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">const<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">&amp;ob<span class=\"_ _4\"></span>j) </span></span></span></div><div class=\"t m0 x6 hc y12a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1f4 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc yce ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ff3 ws14\">d’une</span> <span class=\"_ _2\"></span>Textu<span class=\"_ _2\"></span>re. </span></span></div><div class=\"t m0 x1 he y44e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1f5 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y1f5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1f5 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFMLT<span class=\"_ _2\"></span>extur<span class=\"_ _2\"></span>eHeig<span class=\"_ _2\"></span>ht </div><div class=\"t m0 x6 he y5d6 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0\">getSFMLTex<span class=\"_ _1\"></span>tureHeight(sf::Te<span class=\"_ _1\"></span>xture<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;o<span class=\"_ _2\"></span>bj<span class=\"_ _2\"></span>) </span></span></span></div><div class=\"t m0 x6 hc y91 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1d7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y22d ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>ha<span class=\"_ _1\"></span>uteur <span class=\"ff3 ws14\">d’une</span> Text<span class=\"_ _2\"></span>ure. </span></span></div><div class=\"t m0 x1 he y93 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y37a ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y37a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y37a ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjOrig<span class=\"_ _2\"></span>inX </div><div class=\"t m0 x6 hc yb8 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y1db ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjOrigin<span class=\"_ _1\"></span>X(T <span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j) </span></div><div class=\"t m0 x6 hc y1fe ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y77a ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y68 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’origine<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> <span class=\"ls56 ws43\">x.</span> </span></span></span></span></div><div class=\"t m2 xa hc y69d ff4 fs2 fc4 sc0 ls2 ws14\">2.10</div><div class=\"t m3 x20 hd y69d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y69d ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjOrig<span class=\"_ _2\"></span>inY </div><div class=\"t m0 x1 hc y98 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y575 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x21 h9 y4aa ff6 fs3 fc0 sc0 ls1b ws13\">87<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf57\" class=\"pf w0 h0\" data-page-no=\"57\"><div class=\"pc pc57 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAA8Nd+HZMACAVQFP0vgh3M4WoA4YNttILgaAgjGEJw1CaOZhDO2d76tguoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVG1YpDUAAAC4SURBVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqq+UsvRbkuQY1vuqyd6ezTh9ex6756qJywAAAH7kBQ6eS7uEKuXlAAAAAElFTkSuQmCC\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjOrigin<span class=\"_ _1\"></span>Y(T <span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j) </span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’origine<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> <span class=\"ls34 ws28\">y.</span> </span></span></span></span></div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">2.11</div><div class=\"t m3 x20 hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e4 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjX </div><div class=\"t m2 xa h15 y77b ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y77b ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y77b ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y77c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y77d ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y77e ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjX(T<span class=\"_ _1\"></span> o<span class=\"_ _2\"></span>bj<span class=\"_ _2\"></span>) </span></div><div class=\"t m2 xa h15 y77f ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y77f ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y77f ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y4d3 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y780 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y4d5 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjX(T<span class=\"_ _1\"></span> *<span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j) </span></div><div class=\"t m0 x1 he y781 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y782 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source </div><div class=\"t m0 x6 hc y783 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _4\"></span><span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>position <span class=\"_ _4\"></span><span class=\"ls35 ws29\">x.<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y784 ff4 fs2 fc4 sc0 ls2 ws14\">2.12</div><div class=\"t m3 x20 hd y784 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y784 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjY </div><div class=\"t m2 xa h15 y785 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y785 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y785 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y6ce ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc yda ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y6d0 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjY(T<span class=\"_ _1\"></span> o<span class=\"_ _2\"></span>bj<span class=\"_ _2\"></span>) </span></div><div class=\"t m2 xa h15 y786 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y786 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y786 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y787 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc yca ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y788 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">getSFMLObjY(T<span class=\"_ _1\"></span> *<span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j) </span></div><div class=\"t m0 x1 he y789 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y78a ff4 fs2 fc9 sc0 ls2 ws2\">Code Source </div><div class=\"t m0 x6 hc yc2 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _4\"></span><span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>position <span class=\"_ _4\"></span><span class=\"ls43 ws33\">y.<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y78b ff4 fs2 fc4 sc0 ls2 ws14\">2.13</div><div class=\"t m3 x20 hd y78b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y78b ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjAng<span class=\"_ _2\"></span>le </div><div class=\"t m0 x6 hc y664 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y78c ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjAngle(T &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">angl<span class=\"_ _2\"></span>e) </span></span></span></div><div class=\"t m0 x6 hc y78d ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y33 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y78e ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’ang<span class=\"_ _2\"></span>le.<span class=\"ff2 ws2\"> </span></span></div><div class=\"t m2 xa hc y82 ff4 fs2 fc4 sc0 ls2 ws14\">2.14</div><div class=\"t m3 x20 hd y82 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y82 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjRot<span class=\"_ _2\"></span>ate </div><div class=\"t m0 x6 hc y78f ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y790 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjRotate(T<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;obj, <span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">rota<span class=\"_ _2\"></span>tionSpe<span class=\"_ _2\"></span>ed) </span></span></span></div><div class=\"t m0 x6 hc y791 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y792 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> rotation <span class=\"ls1e ws16\">de</span> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 he y69 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m7 xa he y793 ff2 fs2 fc0 sc0 ls2 ws14\">2.15</div><div class=\"t m4 xc hd y793 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y793 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjSca<span class=\"_ _2\"></span>leX_Y<span class=\"ff2 fc0 ws2\"> </span></div><div class=\"t m0 x1 h6 y164 ff4 fs3 fc0 sc0 ls54 ws2\"> <span class=\"ff6 ls1b ws13 v5\">88<span class=\"ls2 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf58\" class=\"pf w0 h0\" data-page-no=\"58\"><div class=\"pc pc58 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjScaleX_Y(T<span class=\"_ _1\"></span> &amp;obj, <span class=\"_ _4\"></span><span class=\"fc8\">fl<span class=\"_ _1\"></span>oat <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls34 ws28\">y)</span><span class=\"fc0\"> </span></span></span></span></span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y618 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y108 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ff3 ws14\">l’échelle</span> <span class=\"_ _2\"></span>x <span class=\"ls24 ws1c\">et</span> <span class=\"ls34 ws28\">y.</span> </div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">2.16</div><div class=\"t m3 x20 hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjSca<span class=\"_ _2\"></span>le </div><div class=\"t m0 x6 hc y3eb ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y2be ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjScale(T &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">scale<span class=\"_ _2\"></span>) </span></span></span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ff3 ws14\">l’échelle</span> x <span class=\"ls24 ws1c\">et</span> y <span class=\"_ _4\"></span>av<span class=\"_ _1\"></span>ec <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>m<span class=\"_ _1\"></span>ême va<span class=\"_ _2\"></span>leur. </div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ed ff4 fs2 fc4 sc0 ls2 ws14\">2.17</div><div class=\"t m3 x20 hd y1ed ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ed ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjOr<span class=\"_ _2\"></span>igin </div><div class=\"t m0 x6 hc y1cb ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y53d ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjOrigin(T<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;obj,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> </span>float <span class=\"_ _2\"></span><span class=\"fc0 ls34 ws28\">y)<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y1cd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y53e ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ff3 ws14\">l’origine</span> <span class=\"_ _2\"></span>x <span class=\"ls24 ws1c\">et</span> <span class=\"ls34 ws28\">y.</span> </div><div class=\"t m2 xa hc ybd ff4 fs2 fc4 sc0 ls2 ws14\">2.18</div><div class=\"t m3 x20 hd ybd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc ybd ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjX </div><div class=\"t m0 x6 hc y228 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y794 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLObjX(T<span class=\"_ _1\"></span> &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls56 ws43\">x)</span><span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 he y151 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc ycb ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1f2 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> position <span class=\"ls56 ws43\">x.</span> </span></span></div><div class=\"t m2 xa hc y12a ff4 fs2 fc4 sc0 ls2 ws14\">2.19</div><div class=\"t m3 x20 hd y12a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y12a ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjY </div><div class=\"t m0 x6 hc yce ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y236 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLObjY(T<span class=\"_ _1\"></span> &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc0 ls34 ws28\">y)<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y1f6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y551 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y552 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> position <span class=\"ls34 ws28\">y.</span> </span></span></div><div class=\"t m2 xa hc y1f9 ff4 fs2 fc4 sc0 ls2 ws14\">2.20</div><div class=\"t m3 x20 hd y1f9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f9 ff4 fs2 fc4 sc0 ls2 ws2\">cent<span class=\"_ _2\"></span>erSF<span class=\"_ _2\"></span>MLObj </div><div class=\"t m0 x6 hc y542 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y94 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">ce<span class=\"_ _1\"></span>nterSFMLObj(T<span class=\"_ _1\"></span> &amp;<span class=\"_ _2\"></span>ob<span class=\"_ _2\"></span>j)<span class=\"_ _2\"></span> </span></div><div class=\"t m0 x6 hc y1fc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y6bb ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y37e ff2 fs2 fc0 sc0 ls2 ws2\">Centrer <span class=\"ff3 ws14\">l’objet</span> <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> x <span class=\"ls24 ws1c\">et</span> <span class=\"ls34 ws28\">y.</span> </span></span></div><div class=\"t m2 xa hc y1dd ff4 fs2 fc4 sc0 ls2 ws14\">2.21</div><div class=\"t m3 x20 hd y1dd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1dd ff4 fs2 fc4 sc0 ls2 ws2\">cent<span class=\"_ _2\"></span>erSF<span class=\"_ _2\"></span>MLObjX<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y573 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y381 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">c<span class=\"_ _1\"></span>enterSFMLObjX(T &amp;<span class=\"_ _2\"></span>obj<span class=\"_ _4\"></span>) </span></div><div class=\"t m0 x21 h9 y1e1 ff6 fs3 fc0 sc0 ls1b ws13\">89<span class=\"ls2 ws2\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf59\" class=\"pf w0 h0\" data-page-no=\"59\"><div class=\"pc pc59 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbwQkDIRRFUQ0jTBEDbuy/BguxD3f+tDCBQDJyTglvdxcvR0QCAABgUy8TAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6TAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6jMBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4A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VB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">90<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Centrer <span class=\"ff3 ws14\">l’objet</span> <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls56 ws43\">x.<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y1c1 ff4 fs2 fc4 sc0 ls2 ws14\">2.22</div><div class=\"t m3 x20 hd y1c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c1 ff4 fs2 fc4 sc0 ls2 ws2\">cent<span class=\"_ _2\"></span>erSF<span class=\"_ _2\"></span>MLObjY<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y1c3 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y779 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">c<span class=\"_ _1\"></span>enterSFMLObjY(T &amp;<span class=\"_ _2\"></span>obj<span class=\"_ _2\"></span>) </span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc0 sc0 ls2 ws2\">Centrer <span class=\"ff3 ws14\">l’objet</span> <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">en<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls34 ws28\">y.<span class=\"ls2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">2.23</div><div class=\"t m3 x20 hd y221 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y221 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjX_<span class=\"_ _2\"></span>Y </div><div class=\"t m2 xa h15 y795 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y795 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y795 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y796 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y797 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y798 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjX_Y(T &amp;obj, <span class=\"_ _2\"></span>sf::Vector2f p<span class=\"_ _2\"></span>osit<span class=\"_ _2\"></span>ion) </span></div><div class=\"t m2 xa h15 y4d8 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y4d8 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4d8 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y799 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y784 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y4db ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFM<span class=\"_ _1\"></span>LObjX_Y(T &amp;obj, <span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0 ls35 ws29\">x,<span class=\"ls2 ws2\"> <span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0 ls34 ws28\">y)<span class=\"ls2 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y4dc ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y79a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y531 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>posi<span class=\"_ _1\"></span>tion x <span class=\"ls24 ws1c\">et</span> <span class=\"ls34 ws28\">y.</span> </div><div class=\"t m2 xa hc y79b ff4 fs2 fc4 sc0 ls2 ws14\">2.24</div><div class=\"t m3 x20 hd y79b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y79b ff4 fs2 fc4 sc0 ls2 ws2\">move<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjX </div><div class=\"t m0 x6 hc y754 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y79c ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">mov<span class=\"_ _1\"></span>eSFMLObjY(T &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">spee<span class=\"_ _2\"></span>d) </span></span></span></div><div class=\"t m0 x6 hc y469 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y79d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y46b ff2 fs2 fc0 sc0 ls2 ws2\">Déplace <span class=\"ff3 ws14\">l’objet</span> SFML <span class=\"_ _2\"></span>sur <span class=\"ff3 ws14\">l’axe</span> des <span class=\"_ _b\"> </span><span class=\"ls56 ws43\">x.<span class=\"_ _1\"></span></span> </div><div class=\"t m2 xa hc y46c ff4 fs2 fc4 sc0 ls2 ws14\">2.25</div><div class=\"t m3 x20 hd y46c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y46c ff4 fs2 fc4 sc0 ls2 ws2\">move<span class=\"_ _2\"></span>SFML<span class=\"_ _2\"></span>ObjY </div><div class=\"t m0 x6 hc y79e ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y79f ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">mov<span class=\"_ _1\"></span>eSFMLObjY(T &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">spee<span class=\"_ _2\"></span>d) </span></span></span></div><div class=\"t m0 x6 hc y7a0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y7a1 ff2 fs2 fc0 sc0 ls2 ws2\">Déplace <span class=\"ff3 ws14\">l’objet</span> SFML <span class=\"_ _2\"></span>sur <span class=\"ff3 ws14\">l’axe</span> des <span class=\"_ _b\"> </span><span class=\"ls34 ws28\">y.<span class=\"_ _1\"></span></span> </div><div class=\"t m2 xa hc y7a2 ff4 fs2 fc4 sc0 ls2 ws14\">2.26</div><div class=\"t m3 x20 hd y7a2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y7a2 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjSiz<span class=\"_ _2\"></span>e </div><div class=\"t m2 xa h15 y7a3 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7a3 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7a3 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y7a4 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7a5 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x1 he y7a6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y7a7 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFM<span class=\"_ _1\"></span>LObjSize(T &amp;obj, <span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0 ls35 ws29\">x,<span class=\"ls2 ws2\"> <span class=\"fc8\">float </span><span class=\"ls34 ws28\">y)</span> </span></span></span></span></div><div class=\"t m2 xa h15 y7a8 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7a8 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7a8 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc yb9 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7a9 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5a\" class=\"pf w0 h0\" data-page-no=\"5a\"><div class=\"pc pc5a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AIBP+3VMAiAUQFGUF8EO5nA1gCD8NlpBcDSEEQwh/FGbOFrARThne+vbLgCoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAB8hGP0AAACMSURBVKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAADwUfUt/ZYkOYb1qmOyt2dTpnfPpbvrmLgMAADgRx5KMjnNcfV5JAAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">91<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y2d9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjSize(T &amp;obj, <span class=\"_ _2\"></span>sf::Vector2f <span class=\"ls34 ws28\">v)</span> </span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2bd ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>tail<span class=\"_ _1\"></span>le <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’<span class=\"_ _2\"></span>objet<span class=\"_ _2\"></span>.<span class=\"ff2 ws2\"> </span></span></span></span></div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">2.27</div><div class=\"t m3 x20 hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e4 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjAlp<span class=\"_ _2\"></span>ha </div><div class=\"t m2 xa h15 y3fc ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y3fc ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3fc ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y77c ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y77d ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y77e ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjAlpha(T &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">unsign<span class=\"_ _1\"></span>ed <span class=\"_ _2\"></span>int <span class=\"fc0\">alp<span class=\"_ _2\"></span>ha) </span></span></span></div><div class=\"t m2 xa h15 y77f ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y77f ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y77f ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x1 hc y4d3 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4d4 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x6 he y4d5 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFM<span class=\"_ _1\"></span>LObjAlpha(<span class=\"_ _1\"></span>T &amp;obj, <span class=\"fc8\">unsigned <span class=\"_ _2\"></span>int <span class=\"fc0\">alpha, </span>int <span class=\"_\"> </span><span class=\"fc0 ls83 ws68\">r,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">int <span class=\"fc0 ls84 ws69\">g,</span><span class=\"fc0\"> </span>int <span class=\"fc0 ls7c ws61\">b)</span><span class=\"fc0\"> </span></span></span></span></span></div><div class=\"t m2 xa h15 y4d7 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y4d7 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y4d7 ff9 fs2 fc0 sc0 ls2 ws2\">Troisième <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y7aa ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y19e ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x1 he y19f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1a0 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjAlpha(T<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;obj,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">unsigned int <span class=\"_ _2\"></span><span class=\"fc0\">alpha,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">sf<span class=\"ls2 ws2\">::Uint8 rg<span class=\"_ _2\"></span>b)<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x6 hc y1a1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7ab ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4dd ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>transpa<span class=\"_ _1\"></span>rence. <span class=\"ff9\">Peut générer des <span class=\"_ _2\"></span>WARN<span class=\"_ _1\"></span>ING <span class=\"ls85 ws6a\">si<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls23 ws1b\">on</span> <span class=\"_ _4\"></span><span class=\"ffb\">l’u<span class=\"_ _1\"></span>tilise sur<span class=\"ff9\"> des <span class=\"_ _2\"></span>textes <span class=\"ls30 ws23\">et</span> des <span class=\"_ _2\"></span>formes géométriques<span class=\"_ _1\"></span> !<span class=\"_ _4\"></span> </span></span></span></span></span></div><div class=\"t m2 xa hc y7ac ff4 fs2 fc4 sc0 ls2 ws14\">2.28</div><div class=\"t m3 x20 hd y7ac ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y7ac ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjAlp<span class=\"_ _2\"></span>ha2 </div><div class=\"t m0 x6 hc y7ad ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y7ae ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjAlpha2(T &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">u<span class=\"_ _1\"></span>nsigned <span class=\"_ _2\"></span>int <span class=\"fc0\">al<span class=\"_ _2\"></span>pha) </span></span></span></div><div class=\"t m0 x6 hc y7af ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4e3 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>transpa<span class=\"_ _1\"></span>rence pou<span class=\"_ _1\"></span>r les <span class=\"_ _2\"></span>objets <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>typ<span class=\"_ _1\"></span>e texte, <span class=\"_ _2\"></span>rectangles,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>...<span class=\"ff9 ls42 ws32\">Ne</span><span class=\"ff9\"> marche <span class=\"ls32 ws25\">pas</span> sur les sprite !<span class=\"_ _2\"></span> </span></div><div class=\"t m0 x1 hc y300 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y301 ff4 fs2 fc4 sc0 ls2 ws14\">2.29</div><div class=\"t m3 x20 hd y301 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y301 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjCol<span class=\"_ _2\"></span>or </div><div class=\"t m0 x6 hc y4e6 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y7b0 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLObjColo<span class=\"_ _1\"></span>r(T <span class=\"_ _2\"></span>&amp;obj, sf::Color <span class=\"_ _4\"></span>color<span class=\"_ _2\"></span>) </span></div><div class=\"t m0 x6 hc y7b1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7b2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y7b3 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>coul<span class=\"_ _1\"></span>eur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’objet</span> (S<span class=\"_ _2\"></span>pri<span class=\"_ _2\"></span>te). </span></span></div><div class=\"t m2 xa hc y7b4 ff4 fs2 fc4 sc0 ls2 ws14\">2.30</div><div class=\"t m3 x20 hd y7b4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y7b4 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjFil<span class=\"_ _2\"></span>lCol<span class=\"_ _2\"></span>or </div><div class=\"t m0 x6 hc y7b5 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y4ef ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">s<span class=\"_ _1\"></span>etSFMLObjFill<span class=\"_ _1\"></span>Color(T &amp;obj, <span class=\"_ _4\"></span>sf::C<span class=\"_ _1\"></span>olor co<span class=\"_ _2\"></span>lor) </span></div><div class=\"t m0 x6 hc y29e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y582 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y7b6 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>coul<span class=\"_ _1\"></span>eur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’objet<span class=\"ff2 ws2\"> (Texte, Rectangle, .<span class=\"_ _2\"></span>.)<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y7b7 ff4 fs2 fc4 sc0 ls2 ws14\">2.31</div><div class=\"t m3 x20 hd y7b7 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y7b7 ff4 fs2 fc4 sc0 ls2 ws2\">sca<span class=\"_ _2\"></span>leAni<span class=\"_ _2\"></span>matio<span class=\"_ _2\"></span>n </div><div class=\"t m0 x6 hc y4f3 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5b\" class=\"pf w0 h0\" data-page-no=\"5b\"><div class=\"pc pc5b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 he y165 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">sca<span class=\"_ _1\"></span>leAnimation(<span class=\"fc8 ws2\">float<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>co<span class=\"_ _1\"></span>nst <span class=\"fc0\">&amp;DELTA_TIME, </span>float <span class=\"fc0\">&amp;var, T <span class=\"_ _4\"></span>&amp;o<span class=\"_ _1\"></span>bj, <span class=\"fc8\">short <span class=\"_ _2\"></span><span class=\"fc0\">varSign = <span class=\"fcb ls2e\">1</span>, <span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">scal<span class=\"_ _1\"></span>eSize <span class=\"_ _2\"></span>= <span class=\"fcb ws14\">1.<span class=\"_ _4\"></span>f<span class=\"fc0 ws2\">) </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2bd ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>faire une <span class=\"_ _2\"></span>animation<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’étirement<span class=\"ff2 ws2\"> sur un objet <span class=\"_ _2\"></span>SFML. </span></span></div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">2.32</div><div class=\"t m3 x20 hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e4 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tFrame </div><div class=\"t m0 x6 he y42f ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">s<span class=\"_ _1\"></span>etFrame(sf::Sprit<span class=\"_ _1\"></span>e &amp;sprite, <span class=\"_ _2\"></span><span class=\"fc8\">float<span class=\"_ _1\"></span> <span class=\"fc0\">frame, <span class=\"_ _2\"></span><span class=\"fc8\">int<span class=\"_ _1\"></span> <span class=\"fc0\">subFrame, </span>in<span class=\"_ _2\"></span>t <span class=\"fc0\">frameSize, </span>int <span class=\"fc0\">recWidth, </span>int <span class=\"fc0\">r<span class=\"_ _2\"></span>ecHeigh<span class=\"_ _1\"></span>t) </span></span></span></span></span></div><div class=\"t m0 x6 he y3eb ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">setFrame(sf::Spr<span class=\"_ _1\"></span>ite &amp;sprite, </span>floa<span class=\"_ _1\"></span>t <span class=\"fc0\">frame, </span>int <span class=\"fc0\">su<span class=\"_ _1\"></span>bFrame, </span>int <span class=\"_ _1\"></span><span class=\"fc0\">frameSize)<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y221 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ff3 ws14\">l’animation</span> <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>n<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span>spri<span class=\"_ _1\"></span>te <span class=\"ff9\">(cliquer ici <span class=\"_ _4\"></span><span class=\"ffc fc4\">Error!<span class=\"_ _1\"></span> Reference source not found. <span class=\"ff9 fc0\">pour <span class=\"_ _2\"></span>voir<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>comment <span class=\"ls87 ws6b\">on</span> <span class=\"_ _2\"></span><span class=\"ffb ws14\">l’uti<span class=\"_ _2\"></span>lise<span class=\"_ _2\"></span>)<span class=\"ff2 ws2\">. </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y1c8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c9 ff4 fs2 fc4 sc0 ls2 ws14\">2.33</div><div class=\"t m3 x20 hd y1c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c9 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjOut<span class=\"_ _2\"></span>line<span class=\"_ _2\"></span>Color </div><div class=\"t m0 x6 hc y1ca ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y1cb ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFMLO<span class=\"_ _1\"></span>bjOutlineColor(T<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;obj, sf::Color <span class=\"_ _2\"></span>color, <span class=\"fc8\">float </span>thickness = <span class=\"_ _2\"></span><span class=\"fcb ws14\">1.<span class=\"_ _2\"></span>f<span class=\"fc0 ws2\">) </span></span></span></div><div class=\"t m0 x6 hc yc5 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7b8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y69b ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>coul<span class=\"_ _1\"></span>eur <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>cont<span class=\"_ _1\"></span>our <span class=\"ls29 ws1f\">et</span> <span class=\"_ _4\"></span><span class=\"ls28 ws1e\">sa<span class=\"ls2 ws2\"> tail<span class=\"_ _2\"></span>le. </span></span></div><div class=\"t m2 xa hc y1f1 ff4 fs2 fc4 sc0 ls2 ws14\">2.34</div><div class=\"t m3 x20 hd y1f1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f1 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjTe<span class=\"_ _2\"></span>xRec </div><div class=\"t m0 x6 hc ybd ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y540 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFM<span class=\"_ _1\"></span>LObjTexRec(T<span class=\"_ _1\"></span> &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">int <span class=\"fc0 ls35 ws29\">x,<span class=\"_ _1\"></span></span><span class=\"fc0\"> </span>int <span class=\"_ _4\"></span><span class=\"fc0 ls43 ws33\">y,<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">w, <span class=\"fc8\">int </span><span class=\"ls88 ws6c\">h)</span> </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y1d1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y151 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc ycb ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff4 ws14\">int<span class=\"_ _2\"></span>Rect<span class=\"ff2 ws2\">. </span></span></span></span></div><div class=\"t m0 x1 he y1d2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1d3 ff4 fs2 fc4 sc0 ls2 ws14\">2.35</div><div class=\"t m3 x20 hd y1d3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1d3 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tSFML<span class=\"_ _2\"></span>ObjPro<span class=\"_ _2\"></span>perti<span class=\"_ _2\"></span>es </div><div class=\"t m0 x6 he y614 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setSFM<span class=\"_ _1\"></span>LObjProperties(<span class=\"_ _1\"></span>sf::Sprite <span class=\"_ _1\"></span>&amp;obj, <span class=\"fc8\">float </span><span class=\"ls35 ws29\">x,</span> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls36 ws2a\">y,</span><span class=\"fc0\"> <span class=\"_ _4\"></span><span class=\"fc8\">floa<span class=\"_ _1\"></span>t <span class=\"fc0\">angle = <span class=\"_ _2\"></span><span class=\"fcb ls2e ws26\">0.f<span class=\"fc0 ls2 ws2\">, <span class=\"fc8\">int <span class=\"_ _2\"></span><span class=\"fc0\">alpha = <span class=\"fcb ls2e ws26\">255</span>, <span class=\"fc8\">float </span>xScale = <span class=\"_ _2\"></span><span class=\"fcb ls2e ws26\">1.f<span class=\"fc0 ls2 ws2\">, <span class=\"fc8\">float <span class=\"_ _2\"></span><span class=\"fc0\">yScale<span class=\"_ _2\"></span> </span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y54d ff2 fs2 fc0 sc0 ls2 ws2\">= <span class=\"fcb ws14\">1<span class=\"_ _2\"></span>.f<span class=\"_ _2\"></span><span class=\"fc0 ws2\">) </span></span></div><div class=\"t m0 x6 he y7b9 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">setSFMLObjProperties(<span class=\"_ _1\"></span>sf::Text &amp;obj, </span>float <span class=\"fc0 ls35\">x, </span>float <span class=\"fc0 ls43 ws33\">y,</span><span class=\"fc0\"> </span>float <span class=\"fc0\">angle <span class=\"_ _2\"></span><span class=\"ls2e\">= <span class=\"fcb ls2 ws14\">0.f</span><span class=\"ls58\">, <span class=\"fc8 ls2\">i<span class=\"_ _1\"></span>nt <span class=\"fc0\">alpha = <span class=\"_ _2\"></span><span class=\"fcb ws14\">255<span class=\"_ _1\"></span><span class=\"fc0 ws2\">, <span class=\"fc8\">float </span>xScale <span class=\"_ _2\"></span>= <span class=\"fcb ws14\">1.f</span>, <span class=\"fc8\">float </span>yScale <span class=\"ls2e\">= </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y7ba ff2 fs2 fcb sc0 ls39 ws2b\">1.f<span class=\"fc0 ls2 ws2\">) </span></div><div class=\"t m0 x6 he y7bb ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">setSFMLObjProperties(<span class=\"_ _1\"></span>sf::RectangleShape<span class=\"_ _1\"></span> &amp;obj, </span>floa<span class=\"_ _1\"></span>t <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> </span>float <span class=\"_ _2\"></span><span class=\"fc0\">y, <span class=\"fc8\">float </span>angle = <span class=\"fcb ws14\">0.f</span>, <span class=\"fc8\">int </span>alpha = <span class=\"fcb ls2e\">255</span>, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">xScale = <span class=\"fcb ls2e ws26\">1.f</span><span class=\"ls58\">, </span></span></span></span></div><div class=\"t m0 x6 he y7bc ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"fc0\">yScale = <span class=\"fcb ws14\">1.f</span>)<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 he y7bd ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">setSFMLObjProperties(<span class=\"_ _1\"></span>sf::CircleShape<span class=\"_ _1\"></span> &amp;obj, </span>float <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">fl<span class=\"_ _1\"></span>oat <span class=\"fc0 ls43 ws33\">y,</span><span class=\"fc0\"> </span>float <span class=\"_ _2\"></span><span class=\"fc0\">angle = <span class=\"fcb ws14\">0.f</span><span class=\"ls58\">, </span><span class=\"fc8\">int </span>alpha = <span class=\"fcb ls2e\">255</span><span class=\"ls58\">, <span class=\"_ _2\"></span><span class=\"fc8 ls2\">float <span class=\"fc0\">xScal<span class=\"_ _1\"></span>e = <span class=\"_ _2\"></span><span class=\"fcb ws14\">1.f<span class=\"fc0 ws2\">, <span class=\"fc8\">float </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y7be ff2 fs2 fc0 sc0 ls2 ws2\">yScale = <span class=\"fcb ls2e ws26\">1.f</span>) </div><div class=\"t m0 x6 hc y5cc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5cd ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span>les diverses propriétés <span class=\"ff3 ws14\">d’un</span> <span class=\"_ _4\"></span>o<span class=\"_ _1\"></span>bjet SFM<span class=\"_ _2\"></span>L. </div><div class=\"t m0 x1 he y7bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y7a4 ff4 fs2 fc4 sc0 ls2 ws14\">2.36</div><div class=\"t m3 x20 hd y7a4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y7a4 ff4 fs2 fc4 sc0 ls2 ws2\">loa<span class=\"_ _2\"></span>dSFM<span class=\"_ _2\"></span>LText<span class=\"_ _2\"></span>ure </div><div class=\"t m0 x6 hc y7c0 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">loa<span class=\"_ _1\"></span>dSFMLTexture(sf::<span class=\"_ _1\"></span>Texture<span class=\"_ _1\"></span> &amp;obj, <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"ff2 fc0 ws2\">&amp; f<span class=\"_ _2\"></span>ileP<span class=\"_ _2\"></span>ath) </span></span></span></span></div><div class=\"t m0 x1 he y7c1 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5d0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7c2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y7c3 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>charger une Te<span class=\"_ _2\"></span>xture. </div><div class=\"t m2 xa hc y7c4 ff4 fs2 fc4 sc0 ls2 ws14\">2.37</div><div class=\"t m3 x20 hd y7c4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y7c4 ff4 fs2 fc4 sc0 ls2 ws2\">loa<span class=\"_ _2\"></span>dSFM<span class=\"_ _2\"></span>LFont </div><div class=\"t m0 x1 hc y7c5 ff4 fs2 fc0 sc0 ls86 ws2\"> <span class=\"ff6 fs3 ls1b ws13 v5\">92<span class=\"ls2 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5c\" class=\"pf w0 h0\" data-page-no=\"5c\"><div class=\"pc pc5c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzboRXEIBBF0Z09wdAChv6biqEFBGq2hYgINrm3A/4ZkScSmfkBAADgob4mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1mQAAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1WcCAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFSfCQAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAsKXj5e+PCEdwo/M8e+92AAAA1beLtZYjuFEpxQgAALCVyEwrAAAAPJX/+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAADs4Xj5++ecjuC6iKi12gEAAP7pMz4zX54xjuC61toYww4AAKD6AAAA2IL/+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAPi1X8ckAEIBFEV5EexgDlcDCMJvoxUER0MYwRDCH7WJoxnEc7a3vu2qPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAJAv7zkAAAB+SURBVKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAA+F31Lf2WJDmG9apjsrdnU6Z3z6W765i4DAAA4EMemjMzx2Yx4rMAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">93<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y7c6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">loadSFMLF<span class=\"_ _1\"></span>ont(sf::Font &amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"ff4 fc5 ws14\">std::string</span><span class=\"fc0\">&amp; fi<span class=\"_ _2\"></span>lePa<span class=\"_ _2\"></span>th) </span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e2 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> charger <span class=\"_ _2\"></span>un<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>Font. </span></span></div><div class=\"t m0 x1 he y1e3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">2.38</div><div class=\"t m3 x20 hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e4 ff4 fs2 fc4 sc0 ls2 ws2\">loa<span class=\"_ _2\"></span>dSFM<span class=\"_ _2\"></span>LSoun<span class=\"_ _2\"></span>dBuff<span class=\"_ _2\"></span>er </div><div class=\"t m0 x1 hc y1e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">loa<span class=\"_ _1\"></span>dSFMLSoundBuff<span class=\"_ _1\"></span>er(sf::SoundBuffer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;obj, <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">&amp; <span class=\"_ _2\"></span>file<span class=\"_ _2\"></span>Path) </span></span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">loa<span class=\"_ _1\"></span>dSFMLSoundBuf<span class=\"_ _1\"></span>fer(sf::SoundBuffer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;sb, sf::Sound <span class=\"_ _2\"></span>&amp;snd, <span class=\"_ _e\"> </span><span class=\"fc8\">const <span class=\"ff4 fc5 ws14\">std::string</span></span>&amp; file<span class=\"_ _2\"></span>Pat<span class=\"_ _2\"></span>h) </span></div><div class=\"t m0 x1 he y1e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc0 sc0 ls89 ws6d\">Le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>premier : <span class=\"ff2\">Permet <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>harger <span class=\"ls23 ws1b\">un</span> <span class=\"_ _2\"></span>Soun<span class=\"_ _2\"></span>dBuffe<span class=\"_ _2\"></span>r. </span></span></div><div class=\"t m0 x1 he y1c8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ec ff4 fs2 fc0 sc0 ls89 ws6d\">Le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>second : <span class=\"ff2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>charger <span class=\"ls23 ws1b\">un</span> <span class=\"_ _4\"></span>Sou<span class=\"_ _1\"></span>ndBuffer <span class=\"ls24 ws1c\">et</span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’associer</span> à <span class=\"ls2c ws21\">un</span> s<span class=\"_ _2\"></span>on.<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ca ff4 fs2 fc4 sc0 ls2 ws14\">2.39</div><div class=\"t m3 x20 hd y1ca ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ca ff4 fs2 fc4 sc0 ls2 ws2\">loa<span class=\"_ _2\"></span>dSFM<span class=\"_ _2\"></span>LMusic </div><div class=\"t m0 x6 hc y1ee ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">loadSFMLMus<span class=\"_ _1\"></span>ic(sf::Music<span class=\"_ _1\"></span> &amp;obj, <span class=\"_ _4\"></span><span class=\"fc8\">const <span class=\"ff4 fc5 ws14\">std::string</span><span class=\"fc0\">&amp; f<span class=\"_ _2\"></span>ileP<span class=\"_ _2\"></span>ath) </span></span></span></div><div class=\"t m0 x1 he y1ef ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y224 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y6b9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y5d5 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>charger une Mus<span class=\"_ _2\"></span>ic. </div><div class=\"t m2 xa hc y1f1 ff4 fs2 fc4 sc0 ls2 ws14\">2.40</div><div class=\"t m3 x20 hd y1f1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1f1 ff4 fs2 fc4 sc0 ls2 ws2\">che<span class=\"_ _2\"></span>ckSFM<span class=\"_ _2\"></span>LSn<span class=\"_ _2\"></span>dState<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc ybd ff4 fs2 fc5 sc0 ls2 ws2\">enum <span class=\"ff2 fc0 ws14\">SFMLSndStatus<span class=\"_ _1\"></span></span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y7c7 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div><div class=\"t m0 x29 he y2fd ff2 fs2 fc0 sc0 ls2 ws2\">Pla<span class=\"_ _2\"></span>ying,<span class=\"_ _2\"></span> </div><div class=\"t m0 x29 he y7c8 ff2 fs2 fc0 sc0 ls2 ws2\">St<span class=\"_ _2\"></span>opped,<span class=\"_ _2\"></span> </div><div class=\"t m0 x29 he y7c9 ff2 fs2 fc0 sc0 ls2 ws2\">Pau<span class=\"_ _2\"></span>sed </div><div class=\"t m0 x6 he y7ca ff2 fs2 fc0 sc0 ls8a ws6e\">};<span class=\"ls2 ws2\"> </span></div><div class=\"t m0 x6 hc y17c ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x1 he y7cb ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y7cc ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">checkSFML<span class=\"_ _1\"></span>SndState(T <span class=\"_ _1\"></span>&amp;obj, SFMLS<span class=\"_ _1\"></span>ndStatus sta<span class=\"_ _1\"></span>te) </span></div><div class=\"t m0 x6 he y17e ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _9\"></span><span class=\"fc0\">check<span class=\"_ _1\"></span>SFMLSndStat<span class=\"_ _1\"></span>e(T <span class=\"_ _a\"></span>*<span class=\"_ _2\"></span>obj, <span class=\"_ _a\"></span>SFMLSndStatus <span class=\"_ _9\"></span>sta<span class=\"_ _1\"></span>te) </span></div><div class=\"t m0 x6 hc y7cd ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y7ce ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"_ _2\"></span><span class=\"ff3 fc0 ws14\">l<span class=\"_ _1\"></span>’état<span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> so<span class=\"_ _2\"></span>n.<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x1 he y7cf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y35d ff4 fs2 fc4 sc0 ls2 ws14\">2.41</div><div class=\"t m3 x20 hd y35d ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y35d ff4 fs2 fc4 sc0 ls2 ws2\">pla<span class=\"_ _2\"></span>ySFML<span class=\"_ _2\"></span>snd </div><div class=\"t m0 x6 hc y7d0 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y7d1 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">playSFMLSnd(<span class=\"_ _1\"></span>T &amp;obj)<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 he y7d2 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _b\"></span><span class=\"fc0\">playSFMLSnd(T <span class=\"_ _b\"> </span>*obj) </span></div><div class=\"t m0 x6 hc y32a ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y40c ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> jouer <span class=\"_ _2\"></span><span class=\"ls2c ws21\">un<span class=\"ls2 ws2\"> so<span class=\"_ _1\"></span>n / <span class=\"_ _2\"></span>musiq<span class=\"_ _2\"></span>ue. </span></span></span></span></div><div class=\"t m0 x1 he y7d3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y7d4 ff4 fs2 fc4 sc0 ls2 ws14\">2.42</div><div class=\"t m3 x20 hd y7d4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y7d4 ff4 fs2 fc4 sc0 ls2 ws2\">sto<span class=\"_ _2\"></span>pSFM<span class=\"_ _2\"></span>Lsnd </div><div class=\"t m0 x6 hc y367 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y7d5 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">stopSFMLSnd(T<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;ob<span class=\"_ _4\"></span>j) </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5d\" class=\"pf w0 h0\" data-page-no=\"5d\"><div class=\"pc pc5d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB27NjEwSCKIqiPLABO5jAOkwtQFjYbtYWBEOL2BIsQths3ErG0AJEZJZzsp++7PIBAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUnwkAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0mAAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAPjazgSblMQIXai1llLsAADA7/j1AQAAqD4AAAD6lNaaFQAAALbKrw8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAHUB7UQAAABaSURBVACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAP5afdfTPUnyON9ey5DMh+d+nD73ZTyuy5CYDAAAoCNvh2Ik0STRvMMAAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">94<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y7c6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">stopSFMLSnd(T<span class=\"_ _1\"></span> *<span class=\"_ _4\"></span>obj<span class=\"_ _2\"></span>) </span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1c1 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’arrêter</span> <span class=\"ls2c ws21\">un</span> <span class=\"_ _4\"></span>so<span class=\"_ _1\"></span>n / <span class=\"_ _2\"></span>musiq<span class=\"_ _2\"></span>ue. </div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c3 ff4 fs2 fc4 sc0 ls2 ws14\">2.43</div><div class=\"t m3 x20 hd y1c3 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1c3 ff4 fs2 fc4 sc0 ls2 ws2\">pau<span class=\"_ _2\"></span>seSFM<span class=\"_ _2\"></span>Lsnd </div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y1e8 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">pauseSFMLSnd(T<span class=\"_ _1\"></span> &amp;obj) </span></div><div class=\"t m0 x6 he y1c6 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _b\"></span><span class=\"fc0\">pauseSFMLSnd(T <span class=\"_ _b\"></span>*obj) </span></div><div class=\"t m0 x6 hc y440 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1ec ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>mett<span class=\"_ _1\"></span>re <span class=\"ls24 ws1c\">en</span> pause <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>son<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>/ mus<span class=\"_ _2\"></span>ique. </span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ed ff4 fs2 fc4 sc0 ls2 ws14\">2.44</div><div class=\"t m3 x20 hd y1ed ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1ed ff4 fs2 fc4 sc0 ls2 ws2\">loo<span class=\"_ _2\"></span>pSFML<span class=\"_ _2\"></span>snd </div><div class=\"t m0 x6 hc y1ee ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y224 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">loopSFMLSnd(<span class=\"_ _1\"></span>T &amp;obj)<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 he y1f0 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _b\"></span><span class=\"fc0\">loopSFMLSnd(T <span class=\"_ _b\"> </span>*obj) </span></div><div class=\"t m0 x6 hc y227 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he yc8 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> repéter <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> son / <span class=\"_ _2\"></span>musiq<span class=\"_ _2\"></span>ue. </span></span></span></span></div><div class=\"t m0 x1 he y372 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y228 ff4 fs2 fc4 sc0 ls2 ws14\">2.45</div><div class=\"t m3 x20 hd y228 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y228 ff4 fs2 fc4 sc0 ls2 ws2\">co<span class=\"_ _2\"></span>llisi<span class=\"_ _2\"></span>onTest<span class=\"_ _2\"></span>SFML </div><div class=\"t m0 x6 hc y22a ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"ff2 fc0\">A,<span class=\"_ _1\"></span> </span>class <span class=\"ff2 fc0 ls5d ws47\">B&gt;</span><span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y449 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">coll<span class=\"_ _1\"></span>isionTestSFML(A<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">const <span class=\"fc0\">&amp;objA, B <span class=\"_ _4\"></span><span class=\"fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">&amp;<span class=\"_ _2\"></span>objB) </span></span></span></span></span></div><div class=\"t m0 x1 he y1d2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1d3 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y571 ff2 fs2 fc0 sc0 ls2 ws2\">Test <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>ollision entre deux <span class=\"_ _2\"></span>(<span class=\"_ _1\"></span>2) objets S<span class=\"_ _2\"></span>FML. </div><div class=\"t m2 xa hc yce ff4 fs2 fc4 sc0 ls2 ws14\">2.46</div><div class=\"t m3 x20 hd yce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yce ff4 fs2 fc4 sc0 ls2 ws2\">cr<span class=\"_ _2\"></span>eateRe<span class=\"_ _2\"></span>ctan<span class=\"_ _2\"></span>gle </div><div class=\"t m0 x6 he y44a ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">cr<span class=\"_ _1\"></span>eateRectangle(sf::R<span class=\"_ _1\"></span>ectangleShape<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;r<span class=\"_ _1\"></span>ec, sf::Vector2f <span class=\"_ _2\"></span>recSiz<span class=\"_ _1\"></span>e, <span class=\"_ _2\"></span>sf::Color<span class=\"_ _1\"></span> color, <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0\">x <span class=\"_ _2\"></span>= <span class=\"fcb ws14\">0.f</span>, <span class=\"_ _4\"></span><span class=\"fc8\">fl<span class=\"_ _1\"></span>oat <span class=\"fc0\">y <span class=\"_ _2\"></span><span class=\"ls2e\">= <span class=\"fcb ws26\">0.f</span><span class=\"ls2\">, <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">center =<span class=\"_ _2\"></span> </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y5e ff4 fs2 fc5 sc0 ls2 ws14\">tr<span class=\"_ _2\"></span>ue<span class=\"ff2 fc0 ws2\">) </span></div><div class=\"t m0 x6 hc y56b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y24a ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y7d6 ff2 fs2 fc0 sc0 ls2 ws2\">Créer <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> r<span class=\"_ _2\"></span>ectangl<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>av<span class=\"_ _1\"></span>ec divers <span class=\"_ _2\"></span>paramè<span class=\"_ _2\"></span>tres<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc yf8 ff4 fs2 fc4 sc0 ls2 ws14\">2.47</div><div class=\"t m3 x20 hd yf8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yf8 ff4 fs2 fc4 sc0 ls2 ws2\">te<span class=\"_ _2\"></span>xtSty<span class=\"_ _2\"></span>leCon<span class=\"_ _2\"></span>fig </div><div class=\"t m0 x6 he y7d7 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">textStyleCo<span class=\"_ _1\"></span>nfig(sf::Text <span class=\"ls8b ws6f\">&amp;txt,</span> <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">und<span class=\"_ _1\"></span>erLined, <span class=\"_ _2\"></span><span class=\"fc8\">bool <span class=\"fc0\">boldT<span class=\"_ _1\"></span>ext, </span>bool <span class=\"_ _4\"></span><span class=\"fc0\">itali<span class=\"_ _2\"></span>cText<span class=\"_ _2\"></span>) </span></span></span></span></span></div><div class=\"t m0 x1 he y55e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7d8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y7d9 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> style <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’un<span class=\"ff2 ws2\"> tex<span class=\"_ _2\"></span>te. </span></span></span></span></div><div class=\"t m2 xa hc y56e ff4 fs2 fc4 sc0 ls2 ws14\">2.48</div><div class=\"t m3 x20 hd y56e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y56e ff4 fs2 fc4 sc0 ls2 ws2\">cr<span class=\"_ _2\"></span>eateTe<span class=\"_ _2\"></span>xt </div><div class=\"t m2 xa h15 y7da ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7da ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7da ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y7db ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7dc ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"ls2 ws2\"> <span class=\"fc8\">void <span class=\"_ _2\"></span><span class=\"fc0\">crea<span class=\"_ _1\"></span>teText(sf::Font <span class=\"fc8 ws14\">const<span class=\"_ _1\"></span></span>&amp; fnt, sf::Text <span class=\"ls8b ws6f\">&amp;txt,</span> <span class=\"ff4 fc5\">T <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">&amp;t<span class=\"_ _1\"></span>ext, </span>float <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls43 ws33\">y,</span><span class=\"fc0\"> </span>int <span class=\"_ _2\"></span><span class=\"fc0\">txtSize <span class=\"ls38\">= </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y7dd ff2 fs2 fcb sc0 ls2 ws14\">DEFAULT_SFML<span class=\"_ _1\"></span>_TEXT_SIZE<span class=\"fc0 ls45 ws2\">, <span class=\"fc8 ls2\">bool <span class=\"fc0\">underLined = <span class=\"_ _1\"></span></span></span></span><span class=\"ff4 fc5\">false</span><span class=\"fc0 ls45 ws2\">, <span class=\"fc8 ls2\">bool <span class=\"fc0\">boldText = </span></span></span><span class=\"ff4 fc5\">f<span class=\"_ _1\"></span>alse</span><span class=\"fc0 ls45 ws2\">, <span class=\"fc8 ls2\">bool <span class=\"fc0\">italicText = </span></span></span><span class=\"ff4 fc5\">f<span class=\"_ _1\"></span>alse</span><span class=\"fc0 ws2\">) </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5e\" class=\"pf w0 h0\" data-page-no=\"5e\"><div class=\"pc pc5e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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gOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAA3VJNkNL9/b0ROqHf7y8WCzsAAKD6+DePj49G6ISLiwvVBwDAjyoRYQUAAICs3PUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAKAN1QQp7XY7I3Tv11jrdDq1AwAAx1Uiwgr5zGYzI3TOYDB4eHiwAwAAqg8AAIC/5a4PAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAoD3VBCk9Pz8bobt6vd7NzY0dAAA4ihIRVsjn7u7OCN11dnb29PRkBwAAVB8AAABfcNcHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAPtu3YxOEgTAMw/zEOmATSJHOOWwdQAhkG11BsHQIR7BNL6TUKnUmOEuxFSV6PE+X9qvycncAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAACYz8IEWRrH0Qg5qaqqKAo7AADwhkgpWSE/dV0bISd93zdNYwcAAFQfAAAAL7zrAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAJjPwgRZSikZ4U9FhBEAAPjkH6Y8UA78jrIsp2myAwAAH+SGJwAAQM6c9QEAAOTMWR8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFzOiXsAAAG4SURBVFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAwNeq77A5RUTEZXu8DW3EeXVddrvn975b34c2wmQAAAB/5AGZgJB0e5oe2QAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">95<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y7c6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y13d ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y13d ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y13d ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"ls2 ws2\"> <span class=\"fc8\">void </span>createText(sf::Font<span class=\"_ _1\"></span> <span class=\"fc8 ws14\">const</span>&amp; fnt, sf::Text &amp;txt, </span></span>T <span class=\"ff2 fc8\">const <span class=\"fc0\">&amp;text, <span class=\"_ _2\"></span><span class=\"fc8\">fl<span class=\"_ _1\"></span>oat <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> </span>float <span class=\"fc0\">y, </span>bool <span class=\"_ _2\"></span><span class=\"fc0\">cent<span class=\"_ _1\"></span>erText, <span class=\"fc8\">int </span></span></span></span></span></div><div class=\"t m0 x6 hc y7de ff2 fs2 fc0 sc0 ls2 ws2\">txtSize = <span class=\"fcb ws14\">DEFAUL<span class=\"_ _1\"></span>T_SFML_TEXT_SIZE<span class=\"_ _1\"></span></span><span class=\"ls58\">, </span><span class=\"fc8\">bool </span>und<span class=\"_ _1\"></span>erLined = <span class=\"ff4 fc5 ws14\">false<span class=\"_ _1\"></span></span><span class=\"ls58\">, </span><span class=\"fc8\">bool </span>boldT<span class=\"_ _1\"></span>ext = <span class=\"ff4 fc5 ws14\">false</span><span class=\"ls58\">, </span><span class=\"fc8\">b<span class=\"_ _1\"></span>ool </span>italicText = <span class=\"_ _1\"></span><span class=\"ff4 fc5 ws14\">false</span>) </div><div class=\"t m2 xa h15 y7df ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7df ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7df ff9 fs2 fc0 sc0 ls2 ws2\">Troisième <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y7e0 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7e1 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"ls2 ws2\"> <span class=\"fc8\">void <span class=\"_ _2\"></span><span class=\"fc0\">crea<span class=\"_ _1\"></span>teText(sf::Font <span class=\"fc8 ws14\">const<span class=\"_ _1\"></span></span>&amp; fnt, sf::Text <span class=\"ls8b ws6f\">&amp;txt,</span> <span class=\"ff4 fc5\">T <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">&amp;t<span class=\"_ _1\"></span>ext, </span>float <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls43 ws33\">y,</span><span class=\"fc0\"> <span class=\"_ _2\"></span>sf::Color<span class=\"_ _1\"></span> color, <span class=\"fc8\">int </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y7e2 ff2 fs2 fc0 sc0 ls2 ws2\">txtSize = <span class=\"fcb ws14\">DEFAUL<span class=\"_ _1\"></span>T_SFML_TEXT_SIZE<span class=\"_ _1\"></span></span><span class=\"ls58\">, </span><span class=\"fc8\">bool </span>und<span class=\"_ _1\"></span>erLined = <span class=\"ff4 fc5 ws14\">false<span class=\"_ _1\"></span></span><span class=\"ls58\">, </span><span class=\"fc8\">bool </span>boldT<span class=\"_ _1\"></span>ext = <span class=\"ff4 fc5 ws14\">false</span><span class=\"ls58\">, </span><span class=\"fc8\">b<span class=\"_ _1\"></span>ool </span>italicText = <span class=\"_ _1\"></span><span class=\"ff4 fc5 ws14\">false</span>) </div><div class=\"t m2 xa h15 y7e3 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7e3 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7e3 ff9 fs2 fc0 sc0 ls2 ws2\">Quatrième <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x6 hc y7e4 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"ls2 ws2\"> <span class=\"fc8\">void <span class=\"_ _2\"></span><span class=\"fc0\">crea<span class=\"_ _1\"></span>teText(sf::Font <span class=\"fc8 ws14\">const<span class=\"_ _1\"></span></span>&amp; fnt, sf::Text <span class=\"ls8b ws6f\">&amp;txt,</span> <span class=\"ff4 fc5\">T <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">&amp;t<span class=\"_ _1\"></span>ext, </span>float <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> <span class=\"_ _2\"></span><span class=\"fc8\">float <span class=\"fc0 ls43 ws33\">y,</span><span class=\"fc0\"> <span class=\"_ _2\"></span>sf::Color<span class=\"_ _1\"></span> color, <span class=\"fc8\">bool </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y7e5 ff2 fs2 fc0 sc0 ls2 ws2\">centerText, <span class=\"fc8\">int </span>txtS<span class=\"_ _1\"></span>ize = <span class=\"fcb ws14\">DEF<span class=\"_ _1\"></span>AULT_SFML_TEXT_SIZE<span class=\"_ _1\"></span></span><span class=\"ls58\">, </span><span class=\"fc8\">bool<span class=\"_ _1\"></span> </span>underLined = <span class=\"ff4 fc5 ws14\">false</span><span class=\"ls58\">, <span class=\"_ _1\"></span></span><span class=\"fc8\">bool </span>bol<span class=\"_ _1\"></span>dText = <span class=\"ff4 fc5 ws14\">false</span><span class=\"ls45\">, </span><span class=\"fc8\">bool </span>italicTex<span class=\"_ _1\"></span>t = </div><div class=\"t m0 x6 hc y3c6 ff4 fs2 fc5 sc0 ls2 ws14\">fa<span class=\"_ _2\"></span>lse<span class=\"ff2 fc0 ws2\">) </span></div><div class=\"t m2 xa h15 y7e6 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7e6 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7e6 ff9 fs2 fc0 sc0 ls2 ws2\">Cinquième <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y7e7 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7e8 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class<span class=\"_ _1\"></span> <span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"ls2 ws2\"> <span class=\"fc8\">void<span class=\"_ _1\"></span> </span>createText(sf::Font <span class=\"_ _1\"></span><span class=\"fc8 ws14\">const<span class=\"_ _1\"></span></span>&amp; fnt, <span class=\"_ _1\"></span>sf::Text<span class=\"_ _1\"></span> &amp;txt, </span></span>T <span class=\"ff2 fc8\">const <span class=\"_ _1\"></span><span class=\"fc0\">&amp;text, </span>floa<span class=\"_ _1\"></span>t <span class=\"fc0 ls35 ws29\">x,</span><span class=\"fc0\"> </span>float <span class=\"fc0 ls43 ws33\">y,</span><span class=\"fc0\"> sf::Color colo<span class=\"_ _1\"></span>r ,<span class=\"_ _1\"></span> </span></span></div><div class=\"t m0 x6 he y7e9 ff2 fs2 fc0 sc0 ls2 ws2\">sf::Color <span class=\"_ _1\"></span>outlineColor,<span class=\"_ _1\"></span> <span class=\"fc8\">bo<span class=\"_ _1\"></span>ol <span class=\"_ _1\"></span></span>centerText, <span class=\"_ _1\"></span><span class=\"fc8\">int <span class=\"_ _1\"></span></span>txtSiz<span class=\"_ _1\"></span>e <span class=\"_ _1\"></span>= <span class=\"_ _1\"></span><span class=\"fcb\">DEFAULT_SFM<span class=\"_ _1\"></span>L_TEXT_SIZE, <span class=\"_ _1\"></span><span class=\"fc8\">floa<span class=\"_ _1\"></span>t <span class=\"_ _1\"></span></span></span>outlineThickn<span class=\"_ _1\"></span>ess <span class=\"_ _1\"></span>= <span class=\"_ _1\"></span><span class=\"fcb ls2e ws26\">1.f</span><span class=\"ls45\">, </span><span class=\"fc8\">bool<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y7ea ff2 fs2 fc0 sc0 ls2 ws2\">underLined = <span class=\"ff4 fc5 ws14\">false</span><span class=\"ls58\">, <span class=\"_ _1\"></span></span><span class=\"fc8\">bool </span>bol<span class=\"_ _1\"></span>dText = <span class=\"ff4 fc5 ws14\">false</span><span class=\"ls58\">, <span class=\"_ _1\"></span></span><span class=\"fc8\">bool </span>italicText = <span class=\"ff4 fc5 ws14\">f<span class=\"_ _1\"></span>alse</span>) </div><div class=\"t m2 xa h15 y7eb ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7eb ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7eb ff9 fs2 fc0 sc0 ls2 ws2\">Sixième <span class=\"_ _2\"></span>forme </div><div class=\"t m0 x1 hc y63f ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7ec ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"ff2 fc0 ls2e\">&lt;</span>class <span class=\"_ _1\"></span><span class=\"ff2 fc0\">T&gt; <span class=\"fc8\">void </span>crea<span class=\"_ _1\"></span>teText(sf::Font <span class=\"fc8 ws14\">const<span class=\"_ _1\"></span></span>&amp; fnt, </span><span class=\"ws14\">std::vect<span class=\"_ _1\"></span>or</span><span class=\"ff2 fc0\">&lt;sf::Text&gt; &amp;txt,<span class=\"_ _1\"></span> </span><span class=\"ls8c\">T </span><span class=\"ff2 fc8\">c<span class=\"_ _1\"></span>onst <span class=\"fc0\">&amp;text, </span>floa<span class=\"_ _1\"></span>t <span class=\"fc0\">x, </span>float <span class=\"fc0\">y, </span></span></div><div class=\"t m0 x6 he y461 ff2 fs2 fc0 sc0 ls2 ws2\">sf::Color color , <span class=\"_ _2\"></span>sf::Color outlineColor, <span class=\"fc8\">bool </span>centerText, <span class=\"_ _1\"></span><span class=\"fc8\">int </span>txtSize <span class=\"_ _2\"></span>= <span class=\"fcb\">DEFAULT_SFML_TEXT_SIZE,<span class=\"_ _1\"></span> <span class=\"fc8\">float </span></span>outlineThickness </div><div class=\"t m0 x6 hc y7ed ff2 fs2 fc0 sc0 ls2 ws2\">= <span class=\"_ _2\"></span><span class=\"fcb ls2e\">1.f<span class=\"fc0 ls2\">,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">bool <span class=\"fc0\">underLined = <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">fals<span class=\"_ _1\"></span>e<span class=\"ff2 fc0 ws2\">, <span class=\"fc8\">bool </span>boldText = </span>false<span class=\"ff2 fc0 ws2\">, <span class=\"_ _2\"></span><span class=\"fc8\">bool <span class=\"fc0\">italicText = <span class=\"ff4 fc5 ws14\">fals<span class=\"_ _2\"></span>e<span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y7ee ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7ef ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y7f0 ff2 fs2 fc0 sc0 ls2 ws2\">Ces fonctions <span class=\"_ _2\"></span>permette<span class=\"_ _1\"></span>nt <span class=\"ls1e ws16\">de</span> créer <span class=\"_ _4\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> texte <span class=\"_ _2\"></span>avec divers p<span class=\"_ _2\"></span>aramè<span class=\"_ _2\"></span>tres. </span></span></div><div class=\"t m2 xa hc y7f1 ff4 fs2 fc4 sc0 ls2 ws14\">2.49</div><div class=\"t m3 x20 hd y7f1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y7f1 ff4 fs2 fc4 sc0 ls2 ws2\">cr<span class=\"_ _2\"></span>eateS<span class=\"_ _2\"></span>prite </div><div class=\"t m2 xa h15 y499 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y499 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y499 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x6 hc y31f ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">createSprit<span class=\"_ _1\"></span>e(sf::Texture<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;tex, sf::Sprite &amp;spr, <span class=\"_ _2\"></span>sf::Vector2f<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>position,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>sf::Vector2f origin, <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">smooth = <span class=\"ff4 fc5 ws14\">t<span class=\"_ _2\"></span>rue<span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></div><div class=\"t m0 x1 he y7f2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y7f3 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7f3 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7f3 ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x6 he y7f4 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">cr<span class=\"_ _1\"></span>eateSprite(sf::Texture<span class=\"_ _1\"></span> &amp;tex, <span class=\"_ _2\"></span>sf::Sprite &amp;spr,<span class=\"_ _1\"></span> sf::IntRect <span class=\"_ _2\"></span>rec, sf::Vector2f position, sf::Vector2f <span class=\"_ _2\"></span>origin, <span class=\"fc8\">bool </span></span></div><div class=\"t m0 x6 hc y7ba ff2 fs2 fc0 sc0 ls2 ws2\">repeatTexture = <span class=\"ff4 fc5 ws14\">false<span class=\"_ _1\"></span></span><span class=\"ls58\">, </span><span class=\"fc8\">bool </span>s<span class=\"_ _1\"></span>mooth = <span class=\"ff4 fc5 ws14\">true</span>)<span class=\"_ _1\"></span> </div><div class=\"t m2 xa h15 y7f5 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7f5 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7f5 ff9 fs2 fc0 sc0 ls2 ws2\">Troisième <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y181 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y7f6 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">c<span class=\"_ _1\"></span>reateSprite(sf::T<span class=\"_ _1\"></span>exture &amp;tex, sf::Sprite &amp;spr, sf::IntRect rec, <span class=\"_ _2\"></span>sf::V<span class=\"_ _1\"></span>ector2f position, <span class=\"_ _2\"></span>sf::<span class=\"_ _1\"></span>Vector2f origin, sf::Vector2f </span></div><div class=\"t m0 x6 hc y1d7 ff2 fs2 fc0 sc0 ls2 ws2\">scale, <span class=\"fc8\">unsigned int<span class=\"_ _1\"></span> </span>alpha = <span class=\"fcb ws14\">2<span class=\"_ _1\"></span>55</span><span class=\"ls58\">, </span><span class=\"fc8\">bool </span>repeatT<span class=\"_ _1\"></span>exture = <span class=\"ff4 fc5 ws14\">fal<span class=\"_ _1\"></span>se</span><span class=\"ls58\">, </span><span class=\"fc8\">bool </span>smooth =<span class=\"_ _1\"></span> <span class=\"ff4 fc5 ws14\">true</span>) </div><div class=\"t m2 xa h15 y3b3 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y3b3 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3b3 ff9 fs2 fc0 sc0 ls2 ws2\">Quatrième <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y3b4 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y305 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">cr<span class=\"_ _1\"></span>eateSprite(sf::Texture<span class=\"_ _1\"></span> &amp;tex, <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::vector<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">&lt;sf::Sprite&gt; &amp;spr, <span class=\"_ _2\"></span>sf::I<span class=\"_ _1\"></span>ntRect rec, <span class=\"_ _2\"></span>sf::Vector2f<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>positio<span class=\"_ _1\"></span>n, sf::Vector2f origin, </span></span></span></div><div class=\"t m0 x6 hc y7f7 ff2 fs2 fc0 sc0 ls2 ws2\">sf::Vector2f scale, <span class=\"fc8\">u<span class=\"_ _1\"></span>nsigned int </span>a<span class=\"_ _1\"></span>lpha = <span class=\"fcb ws14\">255</span><span class=\"ls58\">, <span class=\"_ _1\"></span></span><span class=\"fc8\">bool </span>repeatT<span class=\"_ _1\"></span>exture = <span class=\"ff4 fc5 ws14\">false</span><span class=\"ls45\">, </span><span class=\"fc8\">bool </span>smooth<span class=\"_ _1\"></span> = <span class=\"ff4 fc5 ws14\">true</span>) </div><div class=\"t m2 xa h15 y7f8 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y7f8 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7f8 ff9 fs2 fc0 sc0 ls2 ws2\">Cinquème <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y512 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y476 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">createSprit<span class=\"_ _1\"></span>e(sf::Texture<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;tex, sf::Sprite &amp;spr, <span class=\"_ _4\"></span>sf::V<span class=\"_ _1\"></span>ector2f position, <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">c<span class=\"_ _1\"></span>enter, <span class=\"fc8\">bool </span>smooth <span class=\"_ _2\"></span>= <span class=\"ff4 fc5 ws14\">t<span class=\"_ _2\"></span>rue<span class=\"ff2 fc0 ws2\">)<span class=\"_ _2\"></span> </span></span></span></span></span></div><div class=\"t m0 x6 he y7f9 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">createSprit<span class=\"_ _1\"></span>e(sf::Texture<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;tex, sf::Sprite &amp;spr, <span class=\"_ _2\"></span>sf::IntR<span class=\"_ _1\"></span>ect rec, <span class=\"_ _4\"></span>sf::Vector<span class=\"_ _1\"></span>2f position, <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">center, <span class=\"fc8\">bool </span>re<span class=\"_ _2\"></span>peat<span class=\"_ _2\"></span>Texture </span></span></span></div><div class=\"t m0 x6 hc y7fa ff2 fs2 fc0 sc0 ls2 ws2\">= <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">false<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">, <span class=\"fc8\">bool <span class=\"_ _2\"></span><span class=\"fc0\">smooth = <span class=\"ff4 fc5 ws14\">tr<span class=\"_ _2\"></span>ue<span class=\"_ _2\"></span><span class=\"ff2 fc0 ws2\">) </span></span></span></span></span></span></div><div class=\"t m0 x1 he y7fb ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5d3 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf5f\" class=\"pf w0 h0\" data-page-no=\"5f\"><div class=\"pc pc5f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzcIa7iUBiG4enlAI6QVICtw5EgylJYAewGz05waBB4VlFJIIj/irGTTDLDTeg5z7OD87UVb0qpIuIXAAAAmfoyAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwQAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4TAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg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\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">96<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y7c6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Ces fonctions <span class=\"_ _2\"></span>permette<span class=\"_ _1\"></span>nt <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> créer <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>sprite avec divers <span class=\"_ _2\"></span>paramè<span class=\"_ _2\"></span>tre<span class=\"_ _2\"></span>s. </span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">2.50</div><div class=\"t m3 x20 hd y2bc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2bc ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Cursor<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y1c1 ff2 fs2 fc0 sc0 ls2 ws2\">sf::Vector2f <span class=\"_ _2\"></span>getCurso<span class=\"_ _1\"></span>r(sf::RenderWindow<span class=\"_ _1\"></span> &amp;window, <span class=\"_ _2\"></span><span class=\"fc8\">unsi<span class=\"_ _1\"></span>gned in<span class=\"_ _2\"></span>t <span class=\"fc0\">finger <span class=\"_ _2\"></span>= <span class=\"_ _2\"></span><span class=\"fcb ws14\">0<span class=\"fc0 ws2\">)<span class=\"_ _2\"></span> </span></span></span></span></div><div class=\"t m0 x6 hc y7fc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y7fd ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7fe ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>position <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>ourie (toucher sur <span class=\"_ _2\"></span>Mobile). <span class=\"ff4\">finge<span class=\"_ _1\"></span>r <span class=\"_ _2\"></span><span class=\"ff2\">représ<span class=\"_ _1\"></span>ente <span class=\"ff3 ws14\">l’index</span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> doi<span class=\"_ _2\"></span>gt. </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y27e ff4 fs2 fc4 sc0 ls2 ws14\">2.51</div><div class=\"t m3 x20 hd y27e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y27e ff4 fs2 fc4 sc0 ls2 ws2\">mou<span class=\"_ _2\"></span>seCo<span class=\"_ _2\"></span>llisio<span class=\"_ _2\"></span>n </div><div class=\"t m2 xa h15 y1e9 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y1e9 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e9 ff9 fs2 fc0 sc0 ls2 ws2\">Première <span class=\"_ _4\"></span>forme </div><div class=\"t m0 x1 hc y351 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7ff ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x1 he y800 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y801 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">mouseCollision(s<span class=\"_ _1\"></span>f::RenderWindo<span class=\"_ _1\"></span>w<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;window, T <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;obj,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">unsigned<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>int <span class=\"fc0\">finger <span class=\"_ _2\"></span>= <span class=\"fcb ws14\">0<span class=\"_ _4\"></span><span class=\"fc0 ws2\">) </span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y4f8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y4f9 ff9 fs2 fc0 sc0 ls2 ws2\">Windows, Linux : <span class=\"ff2\">Détecte <span class=\"ls28 ws1e\">si</span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> curseur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>souris est <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>collision avec <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> objet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> fe<span class=\"_ _2\"></span>nêtre<span class=\"_ _2\"></span>. </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y802 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y803 ff9 fs2 fc0 sc0 ls2 ws2\">Mobile : <span class=\"_ _2\"></span><span class=\"ff2\">Détecte <span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’util<span class=\"_ _1\"></span>isateur<span class=\"ff2 ws2\"> touche <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>obj<span class=\"_ _1\"></span>et <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>fenêtr<span class=\"_ _2\"></span>e. </span></span></span></span></span></div><div class=\"t m0 x1 he y804 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y805 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y806 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y807 ff4 fs2 fc0 sc0 ls2 ws2\">obj <span class=\"ff3 ws14\">l’objet</span><span class=\"ff2\"> <span class=\"_ _2\"></span>avec lequel <span class=\"ls33 ws27\">on</span> <span class=\"_ _4\"></span>v<span class=\"_ _1\"></span>eut faire <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>te<span class=\"_ _2\"></span>st.<span class=\"_ _2\"></span> </span></div><div class=\"t m0 xc hc y5c0 ff4 fs2 fc0 sc0 ls2 ws2\">finger <span class=\"ff2\">représente <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’index<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> doigt<span class=\"_ _2\"></span>. </span></span></span></span></span></div><div class=\"t m0 x1 he y808 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y809 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrais <span class=\"ff2 ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls1a ws2\"> <span class=\"ls3f ws2f\">il</span><span class=\"ls2\"> y a <span class=\"_ _2\"></span>collision <span class=\"ls24 ws1c\">et</span><span class=\"ls3b\"> </span><span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y80a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y80b ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y3d1 ff4 fs2 fc5 sc0 ls40 ws30\">if<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ff2 fc0\">(mouseColl<span class=\"_ _1\"></span>ision(window,<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>sprite<span class=\"_ _2\"></span>)) </span></span></div><div class=\"t m0 x6 he y152 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div><div class=\"t m0 x29 he y73c ff2 fs2 fcc sc0 ls73 ws70\">//<span class=\"ls2 ws2\"> <span class=\"ls42 ws32\">Do</span> <span class=\"_ _2\"></span>some<span class=\"_ _2\"></span>thing<span class=\"fc0\"> </span></span></div><div class=\"t m0 x6 he y80c ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div><div class=\"t m0 x1 he y80d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y678 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y80e ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y80e ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y80e ff9 fs2 fc0 sc0 ls2 ws2\">Deuxième <span class=\"_ _2\"></span>for<span class=\"_ _2\"></span>me </div><div class=\"t m0 x6 hc y80f ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _2\"></span><span class=\"ff2 fc0 ls2e\">&lt;<span class=\"ff4 fc5 ls2\">class </span><span class=\"ls3e ws2e\">T&gt;</span><span class=\"ls2\"> </span></span></div><div class=\"t m0 x1 he y702 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y810 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _2\"></span><span class=\"fc0\">mouseCollision(s<span class=\"_ _1\"></span>f::RenderWindo<span class=\"_ _1\"></span>w<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;window, T <span class=\"fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">&amp;obj,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>sf::Vector2f<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;position,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fc8\">unsigned<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>int <span class=\"fc0\">finger <span class=\"_ _2\"></span>= <span class=\"fcb ws14\">0<span class=\"_ _4\"></span><span class=\"fc0 ws2\">) </span></span></span></span></span></span></span></div><div class=\"t m0 x6 hc y811 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y812 ff9 fs2 fc0 sc0 ls2 ws2\">Windows, Linux : <span class=\"ff2\">Détecte <span class=\"ls28 ws1e\">si</span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> curseur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>souris est <span class=\"ls29 ws1f\">en</span> <span class=\"_ _2\"></span>collision avec <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> objet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> fe<span class=\"_ _2\"></span>nêtre<span class=\"_ _2\"></span>. </span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y813 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y814 ff9 fs2 fc0 sc0 ls2 ws2\">Mobile : <span class=\"_ _2\"></span><span class=\"ff2\">Détecte <span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’util<span class=\"_ _1\"></span>isateur<span class=\"ff2 ws2\"> touche <span class=\"ls2c ws21\">un</span> <span class=\"_ _2\"></span>obj<span class=\"_ _1\"></span>et <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>fenêtr<span class=\"_ _2\"></span>e. </span></span></span></span></span></div><div class=\"t m0 x1 he y815 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y816 ff4 fs2 fca sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>:<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y817 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y818 ff4 fs2 fc0 sc0 ls2 ws2\">obj <span class=\"ff3 ws14\">l’objet</span><span class=\"ff2\"> <span class=\"_ _2\"></span>avec lequel <span class=\"ls33 ws27\">on</span> <span class=\"_ _4\"></span>v<span class=\"_ _1\"></span>eut faire <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>te<span class=\"_ _2\"></span>st.<span class=\"_ _2\"></span> </span></div><div class=\"t m0 x1 he y819 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2e9 ff4 fs2 fc0 sc0 ls2 ws2\">position <span class=\"ff2\">permet <span class=\"_ _2\"></span>de r<span class=\"_ _1\"></span>écupérer <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>p<span class=\"_ _1\"></span>osition <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>point<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>collisi<span class=\"_ _2\"></span>on. </span></div><div class=\"t m0 xc hc y81a ff4 fs2 fc0 sc0 ls2 ws2\">finger <span class=\"ff2\">représente <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’index<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> doigt<span class=\"_ _2\"></span>. </span></span></span></span></span></div><div class=\"t m0 x1 he y792 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y81b ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrais <span class=\"ff2 ls28 ws1e\">si<span class=\"_ _2\"></span><span class=\"ls1a ws2\"> <span class=\"ls3f ws2f\">il</span><span class=\"ls2\"> y a <span class=\"_ _2\"></span>collision <span class=\"ls24 ws1c\">et</span><span class=\"ls3b\"> </span><span class=\"ff4\">faux </span><span class=\"ls28 ws1e\">si</span> n<span class=\"_ _2\"></span>on<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y81c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y81d ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf60\" class=\"pf w0 h0\" data-page-no=\"60\"><div class=\"pc pc60 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzZQREAMQgEwSR1X/wLRcBGx4VuB8Brip1kAQAA8KhjBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAEb7Zo7d3W4PAAADVdW0kf36AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAOCPdhJbAAAAeJVfHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqD4Dbfh3aMAhFURjOGaF5KzBHbQdo8hK2gRWaIDtER8A+T4KETZAMUAX5PnflFUf8AACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAB7FSuEAAABZSURBVABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAwC2q7/P6Jknm97StNfl1y6Mfznvsn/tak8t/XEoJV9BaM1AAALTA3w43LCo9+WKMTwAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">97<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y7c6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x2f he y81e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y81f ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y820 ff4 fs2 fc4 sc0 ls1c\">3.</div><div class=\"t m3 xb hd y820 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y820 ff4 fs2 fc4 sc0 ls2 ws2\">Autres <span class=\"_ _2\"></span>fonct<span class=\"_ _2\"></span>ions<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y5bb ff4 fs2 fc4 sc0 ls2 ws14\">3.1</div><div class=\"t m3 x1c hd y5bb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5bb ff4 fs2 fc4 sc0 ls2 ws2\">cle<span class=\"_ _2\"></span>ar </div><div class=\"t m0 x6 hc y821 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _9\"></span><span class=\"fc0 ws14\">&lt;</span>cl<span class=\"_ _1\"></span>ass <span class=\"_ _9\"></span><span class=\"ff2 fc0\">T2,<span class=\"_ _1\"></span> <span class=\"_ _9\"></span></span>class <span class=\"_ _a\"></span><span class=\"ff2 fc0\">T2&gt; </span></div><div class=\"t m0 x6 he y2f3 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">clear(T &amp;re<span class=\"_ _1\"></span>nder, <span class=\"ls48 ws36\">T2</span> col<span class=\"_ _1\"></span>or) </span></div><div class=\"t m0 x6 hc y3a6 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y822 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3\">d’éffacer le</span> <span class=\"_ _2\"></span>rendu avec une <span class=\"_ _4\"></span>couleur<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y823 ff4 fs2 fc4 sc0 ls2 ws14\">3.2</div><div class=\"t m3 x1c hd y823 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y823 ff4 fs2 fc4 sc0 ls2 ws2\">dr<span class=\"_ _2\"></span>aw<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 hc y824 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y9d ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"fc0 ls8d\">&lt; </span>class <span class=\"ff2 fc0\">T2, </span>class <span class=\"ff2 fc0\">T<span class=\"_ _1\"></span>2&gt; </span></div><div class=\"t m0 x6 he y825 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">draw(<span class=\"_ _1\"></span>T1 <span class=\"_ _4\"></span>&amp;rende<span class=\"_ _1\"></span>r, <span class=\"_ _2\"></span><span class=\"ls48 ws36\">T2<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>&amp;obj) </span></span></span></div><div class=\"t m0 x6 he y826 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">draw(T1 &amp;re<span class=\"_ _1\"></span>nder, T2 *obj) </span></div><div class=\"t m0 x6 hc y8e ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y827 ff2 fs2 fc0 sc0 ls2 ws2\">Permet déssiner <span class=\"_ _2\"></span><span class=\"ls23 ws1b\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>objet sur<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> re<span class=\"_ _2\"></span>ndu. </span></span></span></span></div><div class=\"t m0 x1 he y432 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y828 ff4 fs2 fc4 sc0 ls2 ws14\">3.3</div><div class=\"t m3 x1c hd y828 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y828 ff4 fs2 fc4 sc0 ls2 ws2\">dis<span class=\"_ _2\"></span>play </div><div class=\"t m0 x6 hc y829 ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"fc0 ws14\">&lt;</span>cl<span class=\"_ _1\"></span>ass <span class=\"ff2 fc0\">T&gt; </span></div><div class=\"t m0 x6 he y82a ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">displa<span class=\"_ _1\"></span>y(T <span class=\"_ _4\"></span>&amp;rend<span class=\"_ _1\"></span>er) </span></div><div class=\"t m0 x6 hc y82b ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc4\"> </span></div><div class=\"t m0 x6 he y55b ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’afficher<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> r<span class=\"_ _2\"></span>endu. </span></span></span></span></div><div class=\"t m0 x1 he y247 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y157 ff4 fs2 fc4 sc0 ls2 ws14\">3.4</div><div class=\"t m3 x1c hd y157 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y157 ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tFPS </div><div class=\"t m0 x6 hc y82c ff4 fs2 fc5 sc0 ls2 ws2\">template <span class=\"_ _4\"></span><span class=\"fc0 ws14\">&lt;<span class=\"fc5 ws2\">cl<span class=\"_ _1\"></span>ass <span class=\"_ _4\"></span><span class=\"ff2 fc0 ls48 ws36\">T&gt;<span class=\"_ _1\"></span><span class=\"ff4 fc4 ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 he y24a ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">setFPS(T<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;render, <span class=\"fc8\">float<span class=\"_ _1\"></span> </span>f<span class=\"_ _4\"></span>ps) </span></div><div class=\"t m0 x6 hc y82d ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y82e ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> nombre <span class=\"ff3 ws14\">d’<span class=\"_ _2\"></span>imag<span class=\"_ _1\"></span>e<span class=\"ff2 ws2\"> par <span class=\"_ _2\"></span>seconde<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>jeu<span class=\"_ _4\"></span>. </span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y82f ff4 fs2 fc4 sc0 ls2 ws14\">3.5</div><div class=\"t m3 x1c hd y82f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y82f ff4 fs2 fc4 sc0 ls2 ws2\">vi<span class=\"_ _2\"></span>brate </div><div class=\"t m0 x1 hc y830 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y831 ff2 fs2 fc8 sc0 ls2 ws2\">int <span class=\"_ _4\"></span><span class=\"fc0 ws14\">vi<span class=\"_ _1\"></span>brate(<span class=\"fc8 ws2\">short <span class=\"fc0\">du<span class=\"_ _2\"></span>rati<span class=\"_ _2\"></span>on) </span></span></span></div><div class=\"t m0 x6 hc y254 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y256 ff2 fs2 fc0 sc0 ls2 ws2\">Lance <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> vibreur <span class=\"_ _2\"></span>Mobi<span class=\"_ _2\"></span>le. </span></span></div><div class=\"t m2 xa hc y832 ff4 fs2 fc4 sc0 ls2 ws14\">3.6</div><div class=\"t m3 x1c hd y832 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y832 ff4 fs2 fc4 sc0 ls2 ws2\">ope<span class=\"_ _2\"></span>nURL </div><div class=\"t m0 x1 hc y563 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y833 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">o<span class=\"_ _1\"></span>penURL(<span class=\"fc8 ws2\">const </span><span class=\"ff4 fc5\">std::string</span><span class=\"ws2\">&amp; u<span class=\"_ _2\"></span>rl<span class=\"_ _2\"></span>) </span></span></div></div><div class=\"c x23 y834 w4 h3e\"><div class=\"t m0 x24 he y835 ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Re<span class=\"_ _2\"></span>actan<span class=\"_ _2\"></span>gleSha<span class=\"_ _2\"></span>pe <span class=\"_ _a\"></span>rec<span class=\"_ _2\"></span>; </div><div class=\"t m0 x24 hc y836 ff4 fs2 fc5 sc0 ls40 ws30\">if<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 he y837 ff2 fs2 fc0 sc0 ls2 ws2\">(mouseC<span class=\"_ _1\"></span>ollision(wi<span class=\"_ _1\"></span>ndow, <span class=\"_ _4\"></span>sprit<span class=\"_ _1\"></span>e, <span class=\"_ _2\"></span>rec<span class=\"_ _2\"></span>)) </div></div><div class=\"c x23 y834 w4 h3e\"><div class=\"t m0 x24 h1a y838 ff2 fs9 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x29 he y839 ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _4\"></span><span class=\"fc0\">cursor<span class=\"_ _1\"></span>XPosition <span class=\"_ _4\"></span>=<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>rec.getPosi<span class=\"_ _1\"></span>tion.x(); </span></div><div class=\"t m0 x29 he y83a ff2 fs2 fc8 sc0 ls2 ws2\">float <span class=\"_ _2\"></span><span class=\"fc0\">cursorYPositio<span class=\"_ _1\"></span>n <span class=\"_ _2\"></span>= rec<span class=\"_ _2\"></span>.getP<span class=\"_ _2\"></span>osit<span class=\"_ _2\"></span>ion.y<span class=\"_ _2\"></span>(); </span></div></div><div class=\"c x23 y834 w4 h3e\"><div class=\"t m0 x24 he y83b ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf61\" class=\"pf w0 h0\" data-page-no=\"61\"><div class=\"pc pc61 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdYWiUdQDH8f/pOK6btbYlS0iyepGhogSCwcw0yBerIQWCIOQoZCQiGrTeOckXiTELFUYEBi0isRyTRRFNZgbmQpIRbVCp7MUc23Ft3dZx7LheHByjXE3S23b7fF49e2734n7ci3159txFcrlcAAAAoEQtMgEAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqs8EAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+EwAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+kwAAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOozAQAAgOoDAABA9QEAAKD6AAAA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+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOrjr/br0IZBKIrCcM4IzVuBOWo7QJOXsA2s0ATZIToC9nkSJGyCZIAqwve5K6844gcAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+tuETPwAAAOSSURBVAAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAA3LL6Pq9vkmR+T9tak1+3PPrhvMf+ua81ufzHpZRwBa01AwUAQAv87QBBDWE3hWKV5gAAAABJRU5ErkJggg==\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">98<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y7c6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Ouvre <span class=\"ls2c ws21\">un</span> <span class=\"_ _4\"></span>u<span class=\"_ _1\"></span>rl dans <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>navigat<span class=\"_ _1\"></span>eur (e.g ww<span class=\"_ _2\"></span>w.web<span class=\"_ _2\"></span>site.<span class=\"_ _2\"></span>com<span class=\"_ _2\"></span>). </div><div class=\"t m2 xa hc y1e2 ff4 fs2 fc4 sc0 ls2 ws14\">3.7</div><div class=\"t m3 x1c hd y1e2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e2 ff4 fs2 fc4 sc0 ls2 ws2\">js<span class=\"_ _2\"></span>tring2<span class=\"_ _2\"></span>stri<span class=\"_ _2\"></span>ng </div><div class=\"t m0 x1 hc y1c2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c3 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc0\">jstring2str<span class=\"_ _1\"></span>ing(JNIEnv *env, jstring <span class=\"_ _4\"></span>jSt<span class=\"_ _2\"></span>r) </span></div><div class=\"t m0 x1 he y34f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff2 fs2 fc0 sc0 ls2 ws2\">Convertie <span class=\"_ _2\"></span><span class=\"ff4\">jst<span class=\"_ _1\"></span>ring <span class=\"ff2 ls24 ws1c\">en</span><span class=\"ff2\"> </span>st<span class=\"_ _2\"></span>d::st<span class=\"_ _2\"></span>ring. </span></div><div class=\"t m0 x1 hc y1e9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ea ff4 fs2 fc4 sc0 ls2 ws14\">3.8</div><div class=\"t m3 x1c hd y1ea ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1ea ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Devic<span class=\"_ _2\"></span>eId </div><div class=\"t m0 x6 hc y221 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>td::string <span class=\"ff2 fc0\">getDeviceId(JNIEnv<span class=\"_ _1\"></span> *env, <span class=\"_ _4\"></span>ANa<span class=\"_ _1\"></span>tiveActivity *<span class=\"_ _2\"></span>acti<span class=\"_ _2\"></span>vity<span class=\"_ _2\"></span>) </span></div><div class=\"t m0 x1 he y370 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c9 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y371 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ca ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’id<span class=\"ff2 ws2\"> <span class=\"_ _4\"></span><span class=\"ls1e ws16\">du<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> périphérique <span class=\"_ _2\"></span>Mobi<span class=\"_ _2\"></span>le. </span></span></span></span></div><div class=\"t m0 x1 he y70a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y223 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y224 ff9 fs2 fc3 sc0 ls2 ws2\">Bib<span class=\"_ _2\"></span>liot<span class=\"_ _2\"></span>hèque<span class=\"_ _2\"></span> <span class=\"_ _a\"></span>e<span class=\"_ _2\"></span>xte<span class=\"_ _2\"></span>rne<span class=\"fc0\"> </span></div><div class=\"t m0 x1 h22 y83c ff9 fsb fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y3cf ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3d0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y83d ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui <span class=\"_ _2\"></span><span class=\"ff3\">permet<span class=\"_ _1\"></span> d’utiliser<span class=\"ff2\"> la bibliothèqu<span class=\"_ _1\"></span>e TinyFileDialogs <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> façon </span>la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>plus simple. Elle vous permet <span class=\"ff3 ws14\">d’utiliser</span> les </span></span></span></span></div><div class=\"t m0 x6 he y153 ff3 fs2 fc0 sc0 ls2 ws2\">boites de dialogue du sys<span class=\"_ _1\"></span>tème d’exploitation<span class=\"_ _1\"></span> (Windows et Linux).<span class=\"_ _9\"></span><span class=\"ff2\"> </span></div><div class=\"t m2 xa hc y592 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y592 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y592 ff4 fs2 fc4 sc0 ls2 ws14\">ti<span class=\"_ _2\"></span>nyStr<span class=\"_ _2\"></span>ing<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y374 ff4 fs2 fc5 sc0 ls2 ws2\">#i<span class=\"_ _2\"></span>f !def<span class=\"_ _2\"></span>ined<span class=\"_ _2\"></span>(SFML<span class=\"_ _2\"></span>_SYST<span class=\"_ _2\"></span>EM_LINU<span class=\"_ _2\"></span>X) </div><div class=\"t m0 x6 hc y375 ff4 fs2 fc5 sc0 ls2 ws2\">typedef <span class=\"ff2 fc8\">wchar_t co<span class=\"_ _1\"></span>nst<span class=\"fc0 ls8e\">* </span></span><span class=\"fc0 ws14\">tinyString<span class=\"_ _1\"></span><span class=\"ff2 ls8f ws2\">; </span></span></div><div class=\"t m0 x6 hc y83e ff4 fs2 fc5 sc0 ls2 ws14\">#e<span class=\"_ _2\"></span>lse<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y83f ff4 fs2 fc5 sc0 ls2 ws2\">typedef <span class=\"_ _4\"></span><span class=\"ff2 fc8\">char<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>const<span class=\"fc0\">*<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"ff4 ws14\">tinyStri<span class=\"_ _1\"></span>ng<span class=\"ff2 ls8f ws2\">; </span></span></span></span></div><div class=\"t m0 x6 hc y840 ff4 fs2 fc5 sc0 ls2 ws14\">#en<span class=\"_ _2\"></span>dif<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y93 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y841 ff2 fs2 fc0 sc0 ls2 ws2\">Type personnalisé qui<span class=\"_ _1\"></span> permet de manipuler<span class=\"_ _1\"></span> <span class=\"ff3\">les d<span class=\"_ _1\"></span>onnées de tinyFileDia<span class=\"_ _1\"></span>logs. Lorsqu’on utilise<span class=\"_ _1\"></span> tinyFileDialogs l<span class=\"_ _1\"></span>es </span></div><div class=\"t m0 x6 he y64 ff2 fs2 fc0 sc0 ls2 ws2\">données diffèrent en fonction <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>syst<span class=\"_ _1\"></span>ème <span class=\"ff3 ws14\">d’exploitation.</span> Sur windows les chaines <span class=\"ls1e ws16\">de</span> caractères deviennent de<span class=\"_ _2\"></span>s<span class=\"_ _1\"></span> <span class=\"fc8\">wchar_t </span></div><div class=\"t m0 x6 hc y842 ff2 fs2 fc8 sc0 ls2 ws14\">const<span class=\"ff4 fc0 ls90 ws2\">* <span class=\"ff2 ls24 ws1c\">et<span class=\"ls2 ws2\"> sur Linux d<span class=\"_ _1\"></span>es <span class=\"fc8\">char const</span></span></span><span class=\"ws71\">*,</span><span class=\"ls2\"> <span class=\"ff3\">ce qui impl<span class=\"_ _1\"></span>ique l’utili<span class=\"_ _1\"></span>sation <span class=\"ff2\">de deux<span class=\"_ _1\"></span> (2) types differ<span class=\"_ _1\"></span>ents ayant le mêm<span class=\"_ _1\"></span>e but pour un </span></span></span></span></div><div class=\"t m0 x6 hc y843 ff2 fs2 fc0 sc0 ls2 ws2\">même programme<span class=\"ff4 ls91\">. </span>Le typ<span class=\"_ _1\"></span>e <span class=\"ff4\">tinyString </span>p<span class=\"_ _1\"></span>ermet de palier à ce pro<span class=\"_ _1\"></span>blème en déterminan<span class=\"_ _1\"></span>t automatiqueme<span class=\"_ _1\"></span>nt le type qui </div><div class=\"t m0 x6 he y4a6 ff3 fs2 fc0 sc0 ls2 ws2\">correspond au syst<span class=\"_ _1\"></span>ème d’exploitation<span class=\"_ _1\"></span> cible.<span class=\"_ _1\"></span><span class=\"ff2\"> </span></div><div class=\"t m2 xa hc y844 ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y844 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y844 ff4 fs2 fc4 sc0 ls2 ws14\">TIN<span class=\"_ _2\"></span>Y_FIL<span class=\"_ _2\"></span>E_DIA<span class=\"_ _2\"></span>LOGB<span class=\"_ _2\"></span>OX_PAT<span class=\"_ _2\"></span>H<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y845 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"fc0\">tinyStri<span class=\"_ _1\"></span>ng <span class=\"_ _2\"></span><span class=\"ff2\">TINY_<span class=\"_ _2\"></span>FILE<span class=\"_ _2\"></span>_DIALO<span class=\"_ _2\"></span>GBOX_<span class=\"_ _2\"></span>PATH<span class=\"_ _2\"></span>; </span></span></div><div class=\"t m0 x1 he y846 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y847 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div><div class=\"c x6 y848 w9 h3f\"><div class=\"t m0 x0 hc y849 ff9 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y84a ff4 fs2 fc4 sc0 ls2 ws2\">Tiny <span class=\"_ _2\"></span>File Dialogs <span class=\"_ _2\"></span>(un<span class=\"_ _1\"></span>iquement pour Windows et Linu<span class=\"_ _2\"></span>x)<span class=\"fc0\"> </span></div><div class=\"t m0 xc hc y84b ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>TinyDi<span class=\"_ _1\"></span>alogBox </div></div><div class=\"c x6 y848 w9 h3f\"><div class=\"t m0 x0 hc y71f ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d he y5c1 ff2 fs2 fc0 sc0 ls2 ws2\">TinyDialogBox;<span class=\"_ _1\"></span> </div></div><div class=\"c x6 y848 w9 h3f\"><div class=\"t m0 x0 hc y69a ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/e<span class=\"_ _2\"></span>xt_<span class=\"_ _2\"></span>lib/Tin<span class=\"_ _2\"></span>yFile<span class=\"_ _2\"></span>Dia<span class=\"_ _2\"></span>logs/<span class=\"_ _2\"></span>TinyD<span class=\"_ _2\"></span>ialogsB<span class=\"_ _2\"></span>ox.h<span class=\"fc0 ws2\"> </span></span></div></div><a class=\"l\" href=\"http://www.website.com/\"><div class=\"d m1\" style=\"border-style:none;position:absolute;left:193.910000px;bottom:772.290000px;width:87.480000px;height:23.380000px;background-color:rgba(255,255,255,0.000001);\"></div></a></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf62\" class=\"pf w0 h0\" data-page-no=\"62\"><div class=\"pc pc62 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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BwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAAD+Ncvc47148cIeAwAAd717967UvJGZM48X8fbtW8caAAA4evny5dwRVLH6xhgR4XADAACZ2XuvVn3e9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAgBks00/46tWriLDTAABAZqq+CT158sThBiju/fv3rbXnz59bCgAKirljNyLGGO76AIpb1/X2F4DKMrP3Xu3Gz7s+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAoI5l+gl3u11E2GmAyi4vL1trh8PBUgAUl5mqb0JnZ2cON0Bxm82mtbbdbi0FAAXF3LEbEWMMd30Axa3revsLQGWZ2XuvduPnXR8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAABQxzL9hOu6RoSdBqjsw4cPxy+CpQAoLjMLTj3/XZ/kAwAAKtdBzB27ETHGEH4AxR1v+dz1AZCZvfdqN37e9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAgBks0094cXEREXYaoLLLy8vjF8FSABSXmQWnjrnH3u12TjYAAHBXtb8DRs3YBQAAKMK7PgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAPjXLHOP9/HjR3sMAADc9ezZs1LzRmbOPF7E06dPHWsAAODo06dPc0dQxeobY0SEww0AAGRm771a9XnXBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAANSxTD/h58+fI8JOAwAAmVlw6ph77Ih4/Pixww1Q3H6/b61tt1tLAcCXL1+qtd/81TfGcNcHUNy6rre/AFSWmb33atXnXR8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAABQxzL3eI8ePbLHAJyenloEAMo2QmTmxON9+/bNsQYAACqH3+TVFxHn5+eONUBx19fXzY0fAK211q6uruaOoIrVN8aICIcboLJ1XW9/AagsM3vv1arP/+YCAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAA1LFMP+GPHz8iwk4DVHZzc3P8IlgKgOIys+DUMffYEbHdbh1ugOIOh0NrbbPZWAoA9vt9tfabv/rGGO76AIpb1/X2F4DKMrP3Xq36vOsDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAA6limn/Dm5iYi7DRAZb9+/Tp+ESwFQHGZWXDqmHvsiNhsNg43QHG/f/9urS3LYikAOBwO1dpv/uobY7jrAyhuXdfbXwAqy8zee7Xq864PAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAADMYJl+wsy0zQDFHb8FvggA1PwWxNxjR4STDQAAVG6/8IdPAACAiXnXBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwD+a7+OTRiEoigMc0YIbwXnSJsBhAduoysEUmYIR7B9vWCpm1hK6lTC93W3vMUpfgBA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAH3tRPwAAANLSURBVACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAAD4qb7365skWfrPvtVk7tbHMF73NDyPrSa3/7iUEu6gtWagAABogb+de8WcuTipFA8AAAAASUVORK5CYII=\"/><div class=\"c x7 y101 w3 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls1b ws13\">99<span class=\"ls2 ws2\"> </span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y7c6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Stocke <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>chemin <span class=\"ls1e ws16\">du<span class=\"_ _1\"></span></span> fichier <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> boite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> d<span class=\"_ _2\"></span>ialog<span class=\"_ _2\"></span>ue. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1c0 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y1c0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c0 ff4 fs2 fc4 sc0 ls2 ws2\">enum <span class=\"_ _4\"></span>FileDial<span class=\"_ _1\"></span>ogType </div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc5 sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">FileDialogType;<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x1 he y84c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y49d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y84d ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y84e ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ff3 ws14\">l’icône</span> qui <span class=\"_ _2\"></span>sera affichée sur <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> boite <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> dialogu<span class=\"_ _2\"></span>e. </span></span></span></span></div><div class=\"t m2 xa hc y84f ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y84f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y84f ff4 fs2 fc4 sc0 ls2 ws2\">enumDialogTypeT<span class=\"_ _1\"></span>oStr <span class=\"_ _2\"></span>/ <span class=\"_ _2\"></span>enumI<span class=\"_ _2\"></span>conTy<span class=\"_ _2\"></span>peToS<span class=\"_ _2\"></span>tr<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y850 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y4a1 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _4\"></span><span class=\"fc0\">tinySt<span class=\"_ _1\"></span>ring <span class=\"_ _4\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">e<span class=\"_ _2\"></span>numDia<span class=\"_ _1\"></span>logTypeToStr(Dia<span class=\"_ _1\"></span>logType<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>va<span class=\"_ _2\"></span>l) </span></span></span></div><div class=\"t m0 x1 he y851 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y852 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"fc0\">tinyString <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">enumIconTypeToStr(Icon<span class=\"_ _1\"></span>Type <span class=\"_ _2\"></span>val<span class=\"_ _2\"></span>) </span></span></span></div><div class=\"t m0 x1 he y4a3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y853 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y854 ff2 fs2 fc0 sc0 ls2 ws2\">Ces fonctions convertissent les <span class=\"ff4 fc5\">enum </span><span class=\"ls24 ws1c\">en</span> chaine <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> caractère<span class=\"_ _1\"></span> pour les passés <span class=\"_ _2\"></span>plus tard dans les fonctions de <span class=\"ls1d\">la </span></span></span></div><div class=\"t m0 x6 he y855 ff2 fs2 fc0 sc0 ls2 ws2\">bib<span class=\"_ _2\"></span>liot<span class=\"_ _2\"></span>hèque. </div><div class=\"t m2 xa hc y856 ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y856 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y856 ff4 fs2 fc4 sc0 ls2 ws14\">show<span class=\"_ _2\"></span>Dial<span class=\"_ _2\"></span>ogBox<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y857 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3f1 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">int <span class=\"_ _2\"></span><span class=\"fc0 ws14\">showDia<span class=\"_ _1\"></span>logBox(<span class=\"fc8 ws2\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">&amp; t<span class=\"_ _2\"></span>itle, </span></span></span></span></span></div><div class=\"t m0 x3c hc y858 ff2 fs2 fc8 sc0 ls2 ws2\">const <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">std::stri<span class=\"_ _1\"></span>ng<span class=\"ff2 fc0 ws2\">&amp; <span class=\"_ _4\"></span>msg,<span class=\"_ _1\"></span> </span></span></div><div class=\"t m0 x3c he y859 ff2 fs2 fc0 sc0 ls2 ws2\">DialogType <span class=\"_ _2\"></span>dia<span class=\"_ _2\"></span>logTyp<span class=\"_ _2\"></span>e, </div></div><div class=\"c x6 y85a wf h40\"><div class=\"t m0 x0 hc y85b ff4 fs2 fc0 sc0 ls2 ws2\">En<span class=\"_ _2\"></span>umérat<span class=\"_ _2\"></span>eur </div><div class=\"t m0 x0 he y60a ff2 fs2 fc0 sc0 ls2 ws2\">SAV<span class=\"_ _2\"></span>E_FI<span class=\"_ _2\"></span>LE </div><div class=\"t m0 x0 he y51a ff2 fs2 fc0 sc0 ls2 ws2\">LOA<span class=\"_ _2\"></span>D_FI<span class=\"_ _2\"></span>LE </div></div><div class=\"c x2b y85c w1d h1e\"><div class=\"t m0 x0 he y85d ff2 fs2 fc0 sc0 ls2 ws2\">Sauvegarde <span class=\"_ _4\"></span>fichie<span class=\"_ _2\"></span>r </div><div class=\"t m0 x0 he y85e ff2 fs2 fc0 sc0 ls2 ws2\">Charger <span class=\"_ _2\"></span>fich<span class=\"_ _2\"></span>ier </div></div><div class=\"c x6 y85f w1e h41\"><div class=\"t m0 x0 hc y860 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x0 he y861 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>typ<span class=\"_ _1\"></span>e <span class=\"ls1e ws16\">de</span> boite <span class=\"ls1e ws16\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> dialogue à <span class=\"_ _2\"></span>affi<span class=\"_ _2\"></span>cher. </span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xa hc y735 ff4 fs2 fc4 sc0 ls2 ws2\">2.5 <span class=\"_ _1\"></span>enum <span class=\"_ _4\"></span>D<span class=\"_ _1\"></span>ialogType </div></div><div class=\"c x6 y85f w1e h41\"><div class=\"t m0 x0 h18 y862 ff4 fs9 fc5 sc0 ls2 ws2\">enum </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2c h1a y2f5 ff2 fs9 fc0 sc0 ls2 ws2\">DialogType; </div></div><div class=\"c x6 y85f w1e h41\"><div class=\"t m0 x0 hc y863 ff4 fs2 fc0 sc0 ls2 ws2\">En<span class=\"_ _2\"></span>umérat<span class=\"_ _2\"></span>eur </div><div class=\"t m0 x0 he y864 ff2 fs2 fc0 sc0 ls11 ws72\">OK<span class=\"ls2 ws2\"> </span></div><div class=\"t m0 x0 he y865 ff2 fs2 fc0 sc0 ls2 ws2\">OK<span class=\"_ _2\"></span>CANCE<span class=\"_ _2\"></span>L </div><div class=\"t m0 x0 he y866 ff2 fs2 fc0 sc0 ls2 ws2\">YES<span class=\"_ _2\"></span>NO </div></div><div class=\"c x2b y85f w1f h42\"><div class=\"t m0 x0 he y867 ff2 fs2 fc0 sc0 ls2 ws2\">Message <span class=\"_ _2\"></span>avec<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>bouton <span class=\"ls11 ws72\">OK</span> </div><div class=\"t m0 x0 he y775 ff2 fs2 fc0 sc0 ls2 ws2\">Message <span class=\"_ _4\"></span>a<span class=\"_ _1\"></span>vec <span class=\"_ _2\"></span>bouton <span class=\"ls92 ws73\">OK</span> <span class=\"_ _4\"></span><span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>C<span class=\"_ _1\"></span>ANCEL </span></span></div><div class=\"t m0 x0 he y868 ff2 fs2 fc0 sc0 ls2 ws2\">Message avec bouton<span class=\"_ _1\"></span> YES et NO<span class=\"_ _1\"></span> </div></div><div class=\"c x6 y869 w20 h43\"><div class=\"t m0 x0 hc y86a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x0 he y86b ff2 fs2 fc0 sc0 ls2 ws2\">Représente les <span class=\"_ _2\"></span>boutons qui<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>s<span class=\"_ _1\"></span>eront affichés <span class=\"_ _2\"></span>sur <span class=\"ls1d ws15\">la</span> boite <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>dialo<span class=\"_ _2\"></span>gue.<span class=\"_ _2\"></span> </span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xa hc y86c ff4 fs2 fc4 sc0 ls2 ws2\">2.6 <span class=\"_ _1\"></span>enum <span class=\"_ _4\"></span>Ico<span class=\"_ _1\"></span>nType </div></div><div class=\"c x6 y869 w20 h43\"><div class=\"t m0 x0 h18 y2bb ff4 fs9 fc5 sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">IconType; </span></div></div><div class=\"c x6 y86d wf h33\"><div class=\"t m0 x0 hc y86e ff4 fs2 fc0 sc0 ls2 ws2\">En<span class=\"_ _2\"></span>umérat<span class=\"_ _2\"></span>eur </div><div class=\"t m0 x0 he y86f ff2 fs2 fc0 sc0 ls2 ws2\">IN<span class=\"_ _2\"></span>FO<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 he y870 ff2 fs2 fc0 sc0 ls2 ws2\">WA<span class=\"_ _2\"></span>RNING </div><div class=\"t m0 x0 he y871 ff2 fs2 fc0 sc0 ls2 ws14\">ERRO<span class=\"_ _2\"></span>R</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x3d hc y78a ff4 fs2 fc5 sc0 ls76 ws5b\">_I<span class=\"ff2 fc0 ls2 ws2\">CO </span></div></div><div class=\"c x6 y86d wf h33\"><div class=\"t m0 x0 he y872 ff2 fs2 fc0 sc0 ls2 ws2\">QUE<span class=\"_ _2\"></span>STION </div></div><div class=\"c x2b y873 w21 h44\"><div class=\"t m0 x0 he y874 ff2 fs2 fc0 sc0 ls2 ws2\">Boite <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>dialogue avec une <span class=\"_ _2\"></span>icône I<span class=\"_ _2\"></span>NFO<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 he y875 ff2 fs2 fc0 sc0 ls2 ws2\">Boite <span class=\"ls1e ws16\">de</span> dialogue <span class=\"_ _2\"></span>av<span class=\"_ _1\"></span>ec une icône WARNING </div><div class=\"t m0 x0 he y876 ff2 fs2 fc0 sc0 ls2 ws2\">Boite de dialogue avec u<span class=\"_ _1\"></span>ne icône ERROR<span class=\"_ _1\"></span> </div><div class=\"t m0 x0 he y703 ff2 fs2 fc0 sc0 ls2 ws2\">Boite <span class=\"_ _4\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>dialogu<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>avec <span class=\"_ _2\"></span>une icône <span class=\"_ _4\"></span>QUES<span class=\"_ _1\"></span>TION </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf63\" class=\"pf w0 h0\" data-page-no=\"63\"><div class=\"pc pc63 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x3c he y165 ff2 fs2 fc0 sc0 ls2 ws2\">IconType <span class=\"_ _2\"></span>icon<span class=\"_ _2\"></span>Type </div><div class=\"t m0 x1 he y877 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3c he y201 ff2 fs2 fc0 sc0 ls2 ws2\">)<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y56f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y108 ff2 fs2 fc0 sc0 ls2 ws2\">Affiche une b<span class=\"_ _2\"></span>oite <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>dia<span class=\"_ _1\"></span>logue<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>type<span class=\"_ _1\"></span> me<span class=\"_ _2\"></span>ssage<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fcb\">1 <span class=\"fc0\">lorsque <span class=\"_ _2\"></span>l&apos;utilisa<span class=\"_ _1\"></span>teur clique sur <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>bouton<span class=\"_ _1\"></span> <span class=\"ls96 ws74\">OK<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls29 ws1f\">et</span> <span class=\"fcb\">0 </span><span class=\"ff3 ws14\">lorsqu’il</span> <span class=\"_ _2\"></span>clique<span class=\"_ _1\"></span> sur <span class=\"_ _4\"></span>CA<span class=\"_ _1\"></span>NCEL<span class=\"_ _1\"></span> <span class=\"ls2a ws20\">ou</span> <span class=\"_ _2\"></span>NO<span class=\"_ _4\"></span>. </span></span></span></span></span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">show<span class=\"_ _2\"></span>Fil<span class=\"_ _2\"></span>eDialo<span class=\"_ _2\"></span>gBox<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _4\"></span>std::st<span class=\"_ _1\"></span>ring <span class=\"_ _2\"></span><span class=\"ff2 fc0\">showFileD<span class=\"_ _1\"></span>ialogBox(FileDialogTyp<span class=\"_ _1\"></span>e<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>type<span class=\"_ _2\"></span>, </span></div><div class=\"t m0 x3e hc y221 ff2 fs2 fc8 sc0 ls2 ws2\">const <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">s<span class=\"_ _1\"></span>td::string<span class=\"ff2 fc0 ws2\">&amp; ti<span class=\"_ _2\"></span>tle, </span></span></div><div class=\"t m0 x1 he y370 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3e hc y1c9 ff4 fs2 fc0 sc0 ls2 ws2\">tinyString <span class=\"_ _2\"></span><span class=\"ff2\">fi<span class=\"_ _2\"></span>lterP<span class=\"_ _2\"></span>attern<span class=\"_ _2\"></span>s[], </span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3e hc y1ca ff2 fs2 fc8 sc0 ls2 ws2\">const <span class=\"ff4 fc5 ws14\">st<span class=\"_ _2\"></span>d::st<span class=\"_ _1\"></span>ring<span class=\"ff2 fc0 ws2\">&amp; fileName = <span class=\"_ _4\"></span><span class=\"ff4 fc7 ws14\">&quot;file<span class=\"ff2 fc0 ls97 ws75\">&quot;,<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> </span></span></span></span></span></div><div class=\"t m0 x3e hc y1ee ff2 fs2 fc8 sc0 ls2 ws2\">const <span class=\"ff4 fc5 ws14\">st<span class=\"_ _2\"></span>d::st<span class=\"_ _1\"></span>ring<span class=\"ff2 fc0 ws2\">&amp; msgError = <span class=\"_ _4\"></span><span class=\"ff4 fc7\">&quot;<span class=\"_ _1\"></span>Unable <span class=\"ls98 ws76\">to</span> access <span class=\"_ _2\"></span>file!<span class=\"_ _2\"></span>&quot;<span class=\"ff2 fc0\">, </span></span></span></span></div><div class=\"t m0 x1 he y223 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3e hc y224 ff2 fs2 fc8 sc0 ls2 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">&amp; errTitle = <span class=\"_ _2\"></span><span class=\"ff4 fc7 ws14\">&quot;Error<span class=\"_ _2\"></span>&quot;<span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 hc y5d4 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3e he y5d5 ff2 fs2 fc0 sc0 ls2 ws2\">)<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y1f1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y26 ff2 fs2 fc0 sc0 ls2 ws2\">Affiche une b<span class=\"_ _2\"></span>oîte<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> dialogue <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>ty<span class=\"_ _1\"></span>pe fichie<span class=\"_ _2\"></span>r. </span></span></div><div class=\"t m0 x6 hc y228 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0\">le chemin <span class=\"ls1e ws16\">du</span> fichier <span class=\"_ _2\"></span><span class=\"ls28 ws1e\">si<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>fonction a réussi <span class=\"ls29 ws1f\">et</span><span class=\"ls93\"> <span class=\"ff4 ls99 ws77\">&quot;&quot;<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> (chaîne vide) <span class=\"_ _2\"></span><span class=\"ff2 ls28 ws1e\">si<span class=\"ls2 ws2\"> n<span class=\"_ _2\"></span>on.<span class=\"_ _2\"></span> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y549 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y22a ff4 fs2 fc4 sc0 ls2 ws14\">2.10</div><div class=\"t m3 x20 hd y22a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y22a ff4 fs2 fc4 sc0 ls2 ws14\">show<span class=\"_ _2\"></span>Fol<span class=\"_ _2\"></span>derDia<span class=\"_ _2\"></span>logBo<span class=\"_ _2\"></span>x<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y373 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y54b ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _4\"></span>std<span class=\"_ _1\"></span>::string <span class=\"ff2 fc0 ws14\">showFolderDialogBox(<span class=\"_ _1\"></span><span class=\"fc8 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"ff2 fc0 ws2\">&amp;<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>title<span class=\"_ _2\"></span>, </span></span></span></span></div><div class=\"t m0 x1 he y54c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3e hc y59c ff2 fs2 fc8 sc0 ls2 ws2\">const <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">s<span class=\"_ _1\"></span>td::string<span class=\"ff2 fc0 ws2\">&amp; defa<span class=\"_ _2\"></span>ultPat<span class=\"_ _2\"></span>h </span></span></div><div class=\"t m0 x3e hc y614 ff4 fs2 fc5 sc0 ls2 ws2\">#if <span class=\"_ _2\"></span>!defin<span class=\"_ _2\"></span>ed(<span class=\"_ _2\"></span>SFML_<span class=\"_ _2\"></span>SYSTEM_<span class=\"_ _2\"></span>LINU<span class=\"_ _2\"></span>X)<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y54d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3e hc y9f ff2 fs2 fc0 sc0 ls2 ws2\">= <span class=\"ff4 fc7 ws14\">L&quot;<span class=\"_ _2\"></span>C:\\\\<span class=\"_ _2\"></span>&quot;<span class=\"ff2 fc0 ws2\">, </span></span></div><div class=\"t m0 x1 he y375 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3e hc y550 ff4 fs2 fc5 sc0 ls2 ws14\">#e<span class=\"_ _2\"></span>lse<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x3e hc y5d6 ff2 fs2 fc0 sc0 ls2 ws2\">= <span class=\"_ _4\"></span><span class=\"ff4 fc7 ws14\">L&quot;/home/&quot;<span class=\"ff2 fc0 ls58 ws2\">, </span></span></div><div class=\"t m0 x3e hc y552 ff4 fs2 fc5 sc0 ls2 ws14\">#en<span class=\"_ _2\"></span>dif<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x3e hc y22d ff2 fs2 fc8 sc0 ls2 ws2\">const <span class=\"ff4 fc5 ws14\">st<span class=\"_ _2\"></span>d::st<span class=\"_ _1\"></span>ring<span class=\"ff2 fc0 ws2\">&amp; msgError = <span class=\"_ _4\"></span><span class=\"ff4 fc7\">&quot;<span class=\"_ _1\"></span>Unable <span class=\"ls98 ws76\">to</span> access <span class=\"_ _2\"></span>folder<span class=\"_ _2\"></span>!&quot;<span class=\"ff2 fc0\">, </span></span></span></span></div><div class=\"t m0 x1 he y379 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x3e hc y37a ff2 fs2 fc8 sc0 ls2 ws2\">const <span class=\"_ _2\"></span><span class=\"ff4 fc5 ws14\">std::string<span class=\"_ _1\"></span><span class=\"ff2 fc0 ws2\">&amp; errTitle = <span class=\"_ _2\"></span><span class=\"ff4 fc7 ws14\">&quot;Error<span class=\"_ _2\"></span>&quot;<span class=\"fc0 ws2\"> </span></span></span></span></div><div class=\"t m0 x3e he y36 ff2 fs2 fc0 sc0 ls2 ws2\">)<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y37c ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y3b7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y878 ff2 fs2 fc0 sc0 ls2 ws2\">Affiche une b<span class=\"_ _2\"></span>oite<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> dialogue <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>ty<span class=\"_ _1\"></span>pe sélection do<span class=\"_ _2\"></span>ssier<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x6 hc ya7 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0\">le chemin <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>doss<span class=\"_ _1\"></span>ier <span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>fonction<span class=\"_ _1\"></span> a réussi <span class=\"ls24 ws1c\">et</span><span class=\"ls94\"> <span class=\"ff4 ls99 ws77\">&quot;&quot;</span></span><span class=\"ff4\"> <span class=\"_ _2\"></span>(chaîne<span class=\"_ _1\"></span> vide) <span class=\"ff2 ls28 ws1e\">si</span><span class=\"ff2\"> n<span class=\"_ _4\"></span>on. </span></span></span></span></span></div><div class=\"t m2 xa hc y61f ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y61f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y61f ff4 fs2 fc4 sc0 ls2 ws2\">Box <span class=\"_ _2\"></span><span class=\"ls9a ws78\">2D<span class=\"fc0 ls2 ws2\"> </span></span></div><div class=\"t m0 x1 h6 y34e ff4 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 h6 y879 ff4 fs3 fc0 sc0 ls95 ws2\"> <span class=\"ff6 ls2 v5\">10<span class=\"_ _4\"></span>0 </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf64\" class=\"pf w0 h0\" data-page-no=\"64\"><div class=\"pc pc64 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAA/Gy/jkkAhAIoivIi2MEcrgYQhN9GKwiOhjCCIYQ/ahNHC7gI52xvfdsF1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAIgnvYoAAAGDSURBVKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAA+Lz6ln5LkhzDetUx2duzKdO759LddUxcBgAA8CMPpxiOt9tkO68AAAAASUVORK5CYII=\"/><div class=\"c x3f y101 w22 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls2 ws2\">10<span class=\"_ _4\"></span>1 </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y382 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Box <span class=\"ls2e ws26\">2D</span> <span class=\"_ _2\"></span>est <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> moteur physique<span class=\"_ _1\"></span> integer <span class=\"_ _2\"></span><span class=\"ls29 ws1f\">au<span class=\"ls2 ws2\"> moteur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>jeu. Pour <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’utilise<span class=\"_ _1\"></span>r<span class=\"ff2 ws2\"> dans une <span class=\"_ _4\"></span>sc<span class=\"_ _1\"></span>ène vous devez <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’inclure<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>cette </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y6f ff2 fs2 fc0 sc0 ls2 ws2\">façon <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 he y87a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y39f ff4 fs2 fce sc0 ls2 ws2\">#include <span class=\"_ _2\"></span>&quot;..<span class=\"_ _2\"></span>/../..<span class=\"_ _2\"></span>/isE<span class=\"_ _2\"></span>ngine<span class=\"_ _2\"></span>/ext<span class=\"_ _2\"></span>_lib/<span class=\"_ _2\"></span>Box2D/<span class=\"_ _2\"></span>Box2D.<span class=\"_ _2\"></span>h&quot;<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y3a0 ff4 fs2 fc4 sc0 ls1c\">3.</div><div class=\"t m3 xb hd y3a0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3a0 ff4 fs2 fc4 sc0 ls2 ws14\">TMX<span class=\"_ _2\"></span>Lite<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3a1 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3a2 ff2 fs2 fc0 sc0 ls2 ws2\">TMXLite est <span class=\"_ _2\"></span>une bibliothèque qui <span class=\"_ _2\"></span>vous<span class=\"_ _1\"></span> permet <span class=\"ff3\">d’utiliser l’editeur<span class=\"_ _1\"></span></span> <span class=\"ff4 fcf\">Tiled <span class=\"_ _2\"></span><span class=\"ff2 fc0\">avec <span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> moteur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>jeu. Pour <span class=\"ff3 ws14\">l’utiliser</span> <span class=\"_ _2\"></span>da<span class=\"_ _1\"></span>ns u<span class=\"_ _2\"></span>ne<span class=\"_ _2\"></span> </span></span></span></span></span></span></div><div class=\"t m0 x1 he y87b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y87c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y72 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y87d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y87e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y2f2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y334 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y335 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y4c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y336 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y87f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y880 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y881 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y882 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y883 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y24 ff2 fs2 fc0 sc0 ls2 ws2\">Cette Classe assure <span class=\"ff3 ws14\">l’interconnexion</span> des différents composants<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>moteu<span class=\"_ _1\"></span>r <span class=\"ls29 ws1f\">et</span> <span class=\"_ _2\"></span>lance la boucle <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>re<span class=\"_ _1\"></span>ndu dans laquelle le </div><div class=\"t m0 x6 he y640 ff2 fs2 fc0 sc0 ls2 ws2\">jeu va se dérouler.<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y884 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y884 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y884 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>méthode<span class=\"_ _1\"></span>s <span class=\"_ _2\"></span>de GameEngi<span class=\"_ _2\"></span>ne<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y885 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y885 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y885 ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Engin<span class=\"_ _2\"></span>e<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 he y886 ff2 fs2 fc0 sc0 ls2 ws2\">Gam<span class=\"_ _2\"></span>eEngi<span class=\"_ _2\"></span>ne() </div><div class=\"t m0 x6 hc y2ca ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y887 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y888 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"_ _2\"></span>par dé<span class=\"_ _2\"></span>fau<span class=\"_ _2\"></span>t. </div><div class=\"t m2 xa hc y889 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y889 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y889 ff4 fs2 fc4 sc0 ls2 ws2\">in<span class=\"_ _2\"></span>itEng<span class=\"_ _2\"></span>ine </div><div class=\"t m0 x6 he y88a ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">initEngine() </span></div><div class=\"t m0 x6 hc y4e6 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y88b ff2 fs2 fc0 sc0 ls2 ws2\">Initialise <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> moteur de j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y88c ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y88c ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y88c ff4 fs2 fc4 sc0 ls2 ws2\">pl<span class=\"_ _2\"></span>ay<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y88d ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">play() </span></div><div class=\"t m0 x6 hc y88e ff4 fs2 fc9 sc0 ls2 ws2\">Cod<span class=\"_ _2\"></span>e <span class=\"_ _4\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y4ee ff2 fs2 fc0 sc0 ls2 ws2\">Boucle <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>rendu principal <span class=\"ls1e ws16\">du</span> mo<span class=\"_ _2\"></span>teur<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y136 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y136 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y136 ff4 fs2 fc4 sc0 ls2 ws2\">bas<span class=\"_ _2\"></span>icSFM<span class=\"_ _2\"></span>Lmain<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y88f ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"fc0\">basicSFML<span class=\"_ _1\"></span>main() </span></div><div class=\"t m0 x6 hc y2a0 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y10 ff2 fs2 fc0 sc0 ls2 ws2\">Boucle <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>rendu <span class=\"ff3 ws14\">d’une</span> <span class=\"_ _2\"></span>fenêt<span class=\"_ _1\"></span>re SFML cla<span class=\"_ _2\"></span>ssique<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y11 ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y11 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y11 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Render<span class=\"_ _2\"></span>Wind<span class=\"_ _2\"></span>ow<span class=\"fc0 ws2\"> </span></div></div><div class=\"c x6 y890 w23 h45\"><div class=\"t m0 x0 he y891 ff2 fs2 fc0 sc0 ls2 ws2\">scène vous <span class=\"_ _2\"></span>devez <span class=\"ff3 ws14\">l’inclure</span> <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>cette façon :<span class=\"_ _2\"></span> </div><div class=\"t m0 x0 hc y85e ff4 fs2 fce sc0 ls2 ws2\">#include <span class=\"_ _2\"></span>&quot;..<span class=\"_ _2\"></span>/../..<span class=\"_ _2\"></span>/isE<span class=\"_ _2\"></span>ngine<span class=\"_ _2\"></span>/ext<span class=\"_ _2\"></span>_lib/<span class=\"_ _2\"></span>TMXLit<span class=\"_ _2\"></span>e/Map<span class=\"_ _2\"></span>.hpp&quot;<span class=\"fc0\"> </span></div></div><div class=\"c x23 y892 w24 h46\"><div class=\"t m0 x2e hc y893 ff9 fs2 fc3 sc0 ls2 ws2\">Game <span class=\"_ _2\"></span>Engi<span class=\"_ _2\"></span>ne<span class=\"fc0\"> </span></div><div class=\"t m0 x0 hc y894 ff9 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc h18 y371 ff4 fs9 fc4 sc0 ls2 ws2\">class <span class=\"_ _0\"></span>G<span class=\"_ _1\"></span>ameEngine </div></div><div class=\"c x23 y892 w24 h46\"><div class=\"t m0 x0 hc y895 ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d he y896 ff2 fs2 fc0 sc0 ls2 ws2\">GameEngin<span class=\"_ _1\"></span>e; </div></div><div class=\"c x23 y892 w24 h46\"><div class=\"t m0 x0 hc y897 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">isEn<span class=\"_ _2\"></span>gine/<span class=\"_ _2\"></span>core/Ga<span class=\"_ _2\"></span>meEn<span class=\"_ _2\"></span>gine<span class=\"_ _2\"></span>.h<span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf65\" class=\"pf w0 h0\" data-page-no=\"65\"><div class=\"pc pc65 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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fQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AH+2X8ckAEIBFEV5EexgDlcDCMJvoxUER0MYwRDCH7WJoxmUc7a3vu0CAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAIudXiEAAANQSURBVABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAAB+UX1LvyVJjmG96pjs7dmU6d1z6e46Ji4DAAD4kAesn4ZVF832PAAAAABJRU5ErkJggg==\"/><div class=\"c x3f y101 w22 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls2 ws2\">10<span class=\"_ _4\"></span>2 </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 he y382 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">sf:<span class=\"_ _2\"></span>:Ren<span class=\"_ _2\"></span>derWin<span class=\"_ _2\"></span>dow&amp; <span class=\"_ _9\"></span>get<span class=\"_ _2\"></span>RenderW<span class=\"_ _4\"></span>indow(<span class=\"_ _2\"></span>) </div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>enêtre S<span class=\"_ _2\"></span>FML. </span></span></div><div class=\"t m0 x1 he y898 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y2ee ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y34f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m8 x9 hc y1e6 ff9 fs2 fc3 sc0 ls2 ws14\">Con<span class=\"_ _1\"></span>figuration</div><div class=\"t m0 x40 hc y1e6 ff9 fs2 fc3 sc0 ls2 ws2\"> </div><div class=\"t m8 x3c hc y1e6 ff9 fs2 fc3 sc0 ls9b\">du</div><div class=\"t m0 x41 hc y1e6 ff9 fs2 fc3 sc0 ls2 ws2\"> </div><div class=\"t m8 x42 hc y1e6 ff9 fs2 fc3 sc0 ls9c\">jeu</div><div class=\"t m0 x43 hc y1e6 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y899 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3e9 ff4 fs2 fc5 sc0 ls2 ws2\">nam<span class=\"_ _2\"></span>espa<span class=\"_ _2\"></span>ce <span class=\"_ _1\"></span><span class=\"ff2 fc0\">GameC<span class=\"_ _2\"></span>onfig<span class=\"_ _2\"></span>; </span></div><div class=\"t m0 x6 hc y89a ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">app_<span class=\"_ _2\"></span>src/<span class=\"ff4\">con<span class=\"_ _2\"></span>fig<span class=\"_ _2\"></span><span class=\"ff9\">/<span class=\"ff4\">GameC<span class=\"_ _2\"></span>onfig<span class=\"_ _2\"></span><span class=\"ff9 ls4e ws3b\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 hc y89b ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y89c ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> définir des paramètres pour préconfigur<span class=\"_ _1\"></span>er ces parties du jeu : <span class=\"_ _2\"></span><span class=\"ls22 ws1a\">La<span class=\"ls2 ws2\"> taille <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> fe<span class=\"_ _2\"></span>nêt<span class=\"_ _1\"></span>re <span class=\"ls24 ws1c\">et</span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> la vue, Les touches </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y148 ff2 fs2 fc0 sc0 ls2 ws2\">du clavier et de la souris à u<span class=\"_ _1\"></span>tiliser pour<span class=\"_ _1\"></span> commander le j<span class=\"_ _1\"></span>eu, les informatio<span class=\"_ _1\"></span>ns du <span class=\"_ _1\"></span>jeu<span class=\"_ _1\"></span> (nom, auteur, ve<span class=\"_ _1\"></span>rsion), chemin des </div><div class=\"t m0 x6 he y89d ff3 fs2 fc0 sc0 ls2 ws2\">fichiers ressources (son, <span class=\"_ _1\"></span>image, sauvega<span class=\"_ _1\"></span>rde, …) et les info<span class=\"_ _1\"></span>rmations d’Admo<span class=\"_ _1\"></span>b.<span class=\"_ _1\"></span><span class=\"ff2\"> </span></div><div class=\"t m2 xa hc y70a ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y70a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y70a ff4 fs2 fc4 sc0 ls2 ws2\">enum <span class=\"_ _4\"></span>DisplayOpt<span class=\"_ _1\"></span>ion </div><div class=\"t m0 x6 hc y2b7 ff4 fs2 fc5 sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">DisplayOptio<span class=\"_ _1\"></span>n; </span></div><div class=\"t m0 x6 hc y5d4 ff4 fs2 fc0 sc0 ls2 ws2\">En<span class=\"_ _2\"></span>umérat<span class=\"_ _2\"></span>eur </div><div class=\"t m0 x6 he y89e ff2 fs2 fc0 sc0 ls2 ws2\">RES<span class=\"_ _2\"></span>UME_<span class=\"_ _2\"></span>GAME <span class=\"_ _1b\"> </span>Quand <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> joueur ferme <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>menu p<span class=\"_ _2\"></span>ause </span></span></span></span></div><div class=\"t m0 x6 he y52 ff2 fs2 fc0 sc0 ls2 ws2\">GAM<span class=\"_ _2\"></span>E_OPT<span class=\"_ _2\"></span>ION_R<span class=\"_ _2\"></span>ESTA<span class=\"_ _2\"></span>RT <span class=\"_ _1c\"> </span>Recommence <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>scène avec <span class=\"ff3 ws14\">l’option</span> <span class=\"_ _2\"></span>rest<span class=\"_ _2\"></span>art </div><div class=\"t m0 x6 he y640 ff2 fs2 fc0 sc0 ls2 ws2\">QUIT<span class=\"_ _2\"></span>_GAM<span class=\"_ _2\"></span>E <span class=\"_ _1d\"> </span>Quand <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> joueur utilise <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l<span class=\"_ _1\"></span>’option<span class=\"ff2 ws2\"> qu<span class=\"_ _2\"></span>itter </span></span></span></span></div><div class=\"t m0 x6 he y462 ff2 fs2 fc0 sc0 ls2 ws2\">INT<span class=\"_ _2\"></span>RO <span class=\"_ _1e\"> </span>Accède <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>scèn<span class=\"_ _1\"></span>e d<span class=\"_ _2\"></span>&apos;intr<span class=\"_ _2\"></span>oducti<span class=\"_ _2\"></span>on </div><div class=\"t m0 x6 he y89f ff2 fs2 fc0 sc0 ls2 ws2\">RES<span class=\"_ _2\"></span>TART_<span class=\"_ _2\"></span>LEVE<span class=\"_ _2\"></span>L <span class=\"_ _1f\"> </span>Recommence <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>scène <span class=\"_ _1\"></span>quand <span class=\"ls33 ws27\">on<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> p<span class=\"_ _2\"></span>er<span class=\"_ _4\"></span>d </span></span></div><div class=\"t m0 x6 he y8a0 ff2 fs2 fc0 sc0 ls2 ws2\">NEX<span class=\"_ _2\"></span>T_LEV<span class=\"_ _2\"></span>EL <span class=\"_ _20\"> </span>Aller <span class=\"ls29 ws1f\">au<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> niveau <span class=\"_ _2\"></span>suiv<span class=\"_ _2\"></span>ant </span></span></div><div class=\"t m0 x6 he y8a1 ff2 fs2 fc0 sc0 ls2 ws2\">MAI<span class=\"_ _2\"></span>N_MEN<span class=\"_ _2\"></span>U <span class=\"_ _21\"> </span>Accède <span class=\"_ _2\"></span>à <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scène Menu Princi<span class=\"_ _2\"></span>pal </div><div class=\"t m0 x6 he y7f0 ff2 fs2 fc0 sc0 ls2 ws2\">GAM<span class=\"_ _2\"></span>E_LEV<span class=\"_ _2\"></span>EL <span class=\"_ _22\"> </span>Accède <span class=\"_ _2\"></span>à <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scène Game Le<span class=\"_ _2\"></span>vel </div><div class=\"t m0 x6 he y8a2 ff2 fs2 fc0 sc0 ls2 ws2\">GAM<span class=\"_ _2\"></span>E_OVE<span class=\"_ _2\"></span>R <span class=\"_ _23\"> </span>Accède <span class=\"_ _2\"></span>à <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>scène Game O<span class=\"_ _2\"></span>ver<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 he y5f2 ff2 fs2 fc0 sc0 ls2 ws2\">GAM<span class=\"_ _2\"></span>E_END<span class=\"_ _2\"></span>_SCR<span class=\"_ _2\"></span>EEN <span class=\"_ _24\"> </span>Accède <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>scèn<span class=\"_ _1\"></span>e Fin <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span> </span></span></div><div class=\"t m0 x1 he y788 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y5f4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y78a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8a3 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y8a4 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> manipuler les <span class=\"_ _2\"></span>diff<span class=\"_ _1\"></span>érentes scènes <span class=\"ls24 ws1c\">et</span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> menu pause <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> je<span class=\"_ _2\"></span>u.<span class=\"_ _2\"></span> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y8a5 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y8a5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8a5 ff4 fs2 fc4 sc0 ls2 ws2\">Paramètre <span class=\"ls21 ws19\">de</span> <span class=\"_ _2\"></span><span class=\"ls9d ws79\">la<span class=\"ls2 ws2\"> f<span class=\"_ _2\"></span>enêtre<span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xa hc y8a6 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y8a6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8a6 ff4 fs2 fc4 sc0 ls2 ws14\">WIN<span class=\"_ _2\"></span>DOW_W<span class=\"_ _2\"></span>IDTH<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y8a7 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8a8 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst unsigned in<span class=\"_ _2\"></span>t <span class=\"fc0\">WINDOW<span class=\"_ _4\"></span>_WIDTH </span></span></div><div class=\"t m0 x6 hc y8a9 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y61 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> fenê<span class=\"_ _2\"></span>tre. </span></span></div><div class=\"t m0 x1 he y8aa ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y8ab ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y8ab ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8ab ff4 fs2 fc4 sc0 ls2 ws14\">WIN<span class=\"_ _2\"></span>DOW_H<span class=\"_ _2\"></span>EIGHT<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y4a4 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst unsigned in<span class=\"_ _2\"></span>t <span class=\"fc0\">WINDOW<span class=\"_ _4\"></span>_HEIGHT </span></span></div><div class=\"t m0 x1 he y8ac ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8ad ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5e4 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y8ae ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>ha<span class=\"_ _1\"></span>uteur <span class=\"ls1e ws16\">de</span> <span class=\"ls1d ws15\">la</span> fe<span class=\"_ _2\"></span>nêtr<span class=\"_ _2\"></span>e. </div><div class=\"t m2 xa hc y8af ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y8af ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8af ff4 fs2 fc4 sc0 ls2 ws14\">VIE<span class=\"_ _2\"></span>W_WID<span class=\"_ _2\"></span>TH<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y8b0 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> float <span class=\"fc0\">VI<span class=\"_ _2\"></span>EW_WI<span class=\"_ _2\"></span>DTH </span></span></div><div class=\"t m0 x1 he y8b1 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8b2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf66\" class=\"pf w0 h0\" data-page-no=\"66\"><div class=\"pc pc66 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>la<span class=\"_ _1\"></span>rgeur <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>vu<span class=\"_ _2\"></span>e.<span class=\"_ _2\"></span> </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y2bc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">VIE<span class=\"_ _2\"></span>W_HEI<span class=\"_ _2\"></span>GHT<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> float <span class=\"fc0\">VI<span class=\"_ _2\"></span>EW_H<span class=\"_ _2\"></span>EIGHT </span></span></div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y331 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> hauteur <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>vue<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y44c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y1e8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e8 ff4 fs2 fc4 sc0 ls2 ws14\">FP<span class=\"_ _4\"></span>S<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> float <span class=\"fc0\">F<span class=\"_ _2\"></span>PS<span class=\"_ _2\"></span> </span></span></div><div class=\"t m0 x6 hc y221 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>FPS (Frame Per Second) <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> je<span class=\"_ _2\"></span>u.<span class=\"_ _2\"></span> </span></span></div><div class=\"t m0 x1 he y371 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1ed ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y1ed ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1ed ff4 fs2 fc4 sc0 ls2 ws14\">WIN<span class=\"_ _2\"></span>DOW_S<span class=\"_ _2\"></span>ETTIN<span class=\"_ _2\"></span>GS<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y1cb ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">is::WindowStyle W<span class=\"_ _2\"></span>INDOW<span class=\"_ _2\"></span>_SETT<span class=\"_ _2\"></span>INGS </span></span></div><div class=\"t m0 x1 he y223 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y224 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y5d4 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y8b3 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>styl<span class=\"_ _1\"></span>e <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>fenê<span class=\"_ _2\"></span>tre. </span></span></div><div class=\"t m2 xa hc y208 ff4 fs2 fc4 sc0 ls1c\">3.</div><div class=\"t m3 xb hd y208 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y208 ff4 fs2 fc4 sc0 ls2 ws2\">Paramètre des <span class=\"_ _2\"></span>boutons<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>de <span class=\"_ _1\"></span>va<span class=\"_ _2\"></span>lidat<span class=\"_ _2\"></span>ion<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y33b ff4 fs2 fc4 sc0 ls2 ws14\">3.1</div><div class=\"t m3 x1c hd y33b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y33b ff4 fs2 fc4 sc0 ls2 ws14\">KEY<span class=\"_ _2\"></span>_VALID<span class=\"_ _2\"></span>ATI<span class=\"_ _2\"></span>ON_MOU<span class=\"_ _2\"></span>SE<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y624 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Mouse::But<span class=\"_ _1\"></span>ton <span class=\"_ _2\"></span>KEY_<span class=\"_ _2\"></span>VALI<span class=\"_ _2\"></span>DATIO<span class=\"_ _2\"></span>N_MOUS<span class=\"_ _2\"></span>E </span></div><div class=\"t m0 x1 he y431 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y432 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y433 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y8b4 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>bouton qui <span class=\"_ _2\"></span>val<span class=\"_ _1\"></span>ide les opt<span class=\"_ _2\"></span>ions<span class=\"_ _1\"></span> avec <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> s<span class=\"_ _2\"></span>ouris<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y242 ff4 fs2 fc4 sc0 ls2 ws14\">3.2</div><div class=\"t m3 x1c hd y242 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y242 ff4 fs2 fc4 sc0 ls2 ws14\">KEY<span class=\"_ _2\"></span>_VALID<span class=\"_ _2\"></span>ATI<span class=\"_ _2\"></span>ON_KEY<span class=\"_ _2\"></span>BOARD<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y569 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_<span class=\"_ _2\"></span>VALI<span class=\"_ _2\"></span>DATIO<span class=\"_ _2\"></span>N_KEYBO<span class=\"_ _2\"></span>ARD </span></div><div class=\"t m0 x1 he y627 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y435 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y341 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touc<span class=\"_ _1\"></span>he qui valide <span class=\"_ _2\"></span>les options avec <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>clavier<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y436 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y437 ff4 fs2 fc4 sc0 ls2 ws14\">3.3</div><div class=\"t m3 x1c hd y437 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y437 ff4 fs2 fc4 sc0 ls2 ws14\">KEY<span class=\"_ _2\"></span>_CAN<span class=\"_ _2\"></span>CEL<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y628 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_<span class=\"_ _2\"></span>CANCE<span class=\"_ _2\"></span>L </span></div><div class=\"t m0 x1 he y24a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y24b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he yf8 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>touc<span class=\"_ _1\"></span>he qui annule les <span class=\"_ _2\"></span>options avec <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>clavie<span class=\"_ _2\"></span>r. </div><div class=\"t m0 x1 he y8b5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y43a ff4 fs2 fc4 sc0 ls1c\">4.</div><div class=\"t m3 xb hd y43a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y43a ff4 fs2 fc4 sc0 ls2 ws2\">Paramètre des touches <span class=\"_ _4\"></span><span class=\"ls21 ws19\">du<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> c<span class=\"_ _2\"></span>lavi<span class=\"_ _2\"></span>er<span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xa hc y8b6 ff4 fs2 fc4 sc0 ls2 ws14\">4.1</div><div class=\"t m3 x1c hd y8b6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8b6 ff4 fs2 fc4 sc0 ls2 ws2\">KEY<span class=\"_ _2\"></span>_A et<span class=\"_ _2\"></span> KEY<span class=\"_ _2\"></span>_B<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y8b7 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_<span class=\"_ _2\"></span>A </span></div><div class=\"t m0 x6 hc y5b3 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_<span class=\"_ _2\"></span>B </span></div><div class=\"t m0 x1 he y8b8 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y631 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y8b9 ff2 fs2 fc0 sc0 ls2 ws2\">Représente les <span class=\"_ _2\"></span>touches des <span class=\"_ _2\"></span>boutons A <span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>t <span class=\"_ _2\"></span>B.<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 he y633 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y8ba ff4 fs2 fc4 sc0 ls2 ws14\">4.2</div><div class=\"t m3 x1c hd y8ba ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8ba ff4 fs2 fc4 sc0 ls2 ws2\">KEY<span class=\"_ _2\"></span>_X et<span class=\"_ _2\"></span> KEY_<span class=\"_ _2\"></span>Y<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y8bb ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_X </span></div><div class=\"t m0 x44 h9 y8bc ff6 fs3 fc0 sc0 ls2 ws2\">10<span class=\"_ _4\"></span>3 </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf67\" class=\"pf w0 h0\" data-page-no=\"67\"><div class=\"pc pc67 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_Y<span class=\"ff4 fc9\"> </span></span></div><div class=\"t m0 x6 hc y8bd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y8be ff2 fs2 fc0 sc0 ls2 ws2\">Représente les <span class=\"_ _2\"></span>touches des <span class=\"_ _2\"></span>boutons X <span class=\"_ _2\"></span>et<span class=\"_ _4\"></span> Y<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y8bf ff4 fs2 fc4 sc0 ls2 ws14\">4.3</div><div class=\"t m3 x1c hd y8bf ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8bf ff4 fs2 fc4 sc0 ls2 ws14\">KEY<span class=\"_ _2\"></span>_LEFT<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y168 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8c0 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_<span class=\"_ _2\"></span>LEFT </span></div><div class=\"t m0 x1 he y8c1 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8c2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y522 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>touch<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>directi<span class=\"_ _1\"></span>onnelle GAUCH<span class=\"_ _2\"></span>E. </span></span></div><div class=\"t m0 x1 he y8c3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y8c4 ff4 fs2 fc4 sc0 ls2 ws14\">4.4</div><div class=\"t m3 x1c hd y8c4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8c4 ff4 fs2 fc4 sc0 ls2 ws14\">KEY<span class=\"_ _2\"></span>_RIGH<span class=\"_ _2\"></span>T<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y8c5 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_<span class=\"_ _2\"></span>RIGHT </span></div><div class=\"t m0 x1 he y8c6 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8c7 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y8c8 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>touch<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>directi<span class=\"_ _1\"></span>onnelle DROIT<span class=\"_ _2\"></span>E. </span></span></div><div class=\"t m2 xa hc y8c9 ff4 fs2 fc4 sc0 ls2 ws14\">4.5</div><div class=\"t m3 x1c hd y8c9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8c9 ff4 fs2 fc4 sc0 ls2 ws14\">KEY<span class=\"_ _2\"></span>_UP<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y8ca ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8cb ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_<span class=\"_ _2\"></span>UP </span></div><div class=\"t m0 x1 he y8cc ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8cd ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y4dd ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>touch<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>directi<span class=\"_ _1\"></span>onnelle HAUT. </span></span></div><div class=\"t m2 xa hc y8ce ff4 fs2 fc4 sc0 ls2 ws14\">4.6</div><div class=\"t m3 x1c hd y8ce ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8ce ff4 fs2 fc4 sc0 ls2 ws14\">KEY<span class=\"_ _2\"></span>_DOWN<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y2fd ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8cf ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc0\">sf::Keyboard::K<span class=\"_ _1\"></span>ey <span class=\"_ _2\"></span>KEY_<span class=\"_ _2\"></span>DOWN </span></div><div class=\"t m0 x1 he y8d0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y7ae ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2cc ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>touch<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>directi<span class=\"_ _1\"></span>onnelle BAS<span class=\"_ _4\"></span>. </span></span></div><div class=\"t m2 xa hc y8d1 ff4 fs2 fc4 sc0 ls1c\">5.</div><div class=\"t m3 xb hd y8d1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8d1 ff4 fs2 fc4 sc0 ls2 ws2\">Valeur par <span class=\"_ _2\"></span>defaut des composants <span class=\"_ _2\"></span>SFM<span class=\"_ _2\"></span>L<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y8d2 ff4 fs2 fc4 sc0 ls2 ws14\">5.1</div><div class=\"t m3 x1c hd y8d2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8d2 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_<span class=\"_ _2\"></span>SFML_<span class=\"_ _2\"></span>TEXT_<span class=\"_ _2\"></span>SIZE<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y128 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8d3 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> <span class=\"fc0\">D<span class=\"_ _2\"></span>EFAU<span class=\"_ _2\"></span>LT_SF<span class=\"_ _2\"></span>ML_TE<span class=\"_ _2\"></span>XT_SI<span class=\"_ _2\"></span>ZE </span></span></div><div class=\"t m0 x1 he y8d4 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8d5 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8d6 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y8d7 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>tail<span class=\"_ _1\"></span>le par <span class=\"_ _2\"></span>defaut<span class=\"_ _1\"></span> des objets <span class=\"_ _2\"></span>textes SFML<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y8d8 ff4 fs2 fc4 sc0 ls2 ws14\">5.2</div><div class=\"t m3 x1c hd y8d8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8d8 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_<span class=\"_ _2\"></span>SFML_<span class=\"_ _2\"></span>TEXT_<span class=\"_ _2\"></span>COLOR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y92 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8d9 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">sf::Color <span class=\"_ _2\"></span>&amp;DEFAU<span class=\"_ _2\"></span>LT_S<span class=\"_ _2\"></span>FML_T<span class=\"_ _2\"></span>EXT_CO<span class=\"_ _2\"></span>LOR </span></span></div><div class=\"t m0 x1 he y8da ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8db ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8dc ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y8dd ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>coul<span class=\"_ _1\"></span>eur par defaut des <span class=\"_ _2\"></span>objets textes S<span class=\"_ _2\"></span>FML. </div><div class=\"t m0 x1 he y8de ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y8df ff4 fs2 fc4 sc0 ls2 ws14\">5.3</div><div class=\"t m3 x1c hd y8df ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8df ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_<span class=\"_ _2\"></span>SFML_<span class=\"_ _2\"></span>SELE<span class=\"_ _2\"></span>CTED_T<span class=\"_ _2\"></span>EXT_C<span class=\"_ _2\"></span>OLOR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y7a7 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">sf::Color <span class=\"_ _2\"></span>&amp;DEFAU<span class=\"_ _2\"></span>LT_S<span class=\"_ _2\"></span>FML_S<span class=\"_ _2\"></span>ELECT<span class=\"_ _2\"></span>ED_T<span class=\"_ _2\"></span>EXT_COL<span class=\"_ _2\"></span>OR </span></span></div><div class=\"t m0 x1 he y8e0 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8e1 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8e2 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y8e3 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>coul<span class=\"_ _1\"></span>eur par<span class=\"_ _1\"></span> defaut <span class=\"_ _2\"></span>des objets textes <span class=\"_ _2\"></span>SFML quand <span class=\"ls33 ws27\">on</span> <span class=\"_ _4\"></span>l<span class=\"_ _1\"></span>es se<span class=\"_ _4\"></span>l<span class=\"_ _1\"></span>ecti<span class=\"_ _2\"></span>onnen<span class=\"_ _2\"></span>t. </div><div class=\"t m2 xa hc y8e4 ff4 fs2 fc4 sc0 ls2 ws14\">5.4</div><div class=\"t m3 x1c hd y8e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8e4 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_M<span class=\"_ _2\"></span>SG_B<span class=\"_ _2\"></span>OX_TE<span class=\"_ _2\"></span>XT_SIZ<span class=\"_ _2\"></span>E<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 h6 y6a0 ff4 fs3 fc0 sc0 ls95 ws2\"> <span class=\"ff6 ls2 v5\">10<span class=\"_ _4\"></span>4 </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf68\" class=\"pf w0 h0\" data-page-no=\"68\"><div class=\"pc pc68 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> <span class=\"fc0\">D<span class=\"_ _2\"></span>EFAU<span class=\"_ _2\"></span>LT_MS<span class=\"_ _2\"></span>G_BOX_<span class=\"_ _2\"></span>TEXT<span class=\"_ _2\"></span>_SIZ<span class=\"_ _2\"></span>E </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1c0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1c1 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>tail<span class=\"_ _1\"></span>le par <span class=\"_ _2\"></span>defaut<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>text<span class=\"_ _1\"></span>e SFML <span class=\"_ _2\"></span>pour<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>boite <span class=\"ls1e ws16\">de</span> d<span class=\"_ _2\"></span>ialo<span class=\"_ _2\"></span>gue. </div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">5.5</div><div class=\"t m3 x1c hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e4 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_M<span class=\"_ _2\"></span>SG_B<span class=\"_ _2\"></span>OX_BU<span class=\"_ _2\"></span>TTON_TE<span class=\"_ _2\"></span>XT_S<span class=\"_ _2\"></span>IZE<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1e5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e6 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> <span class=\"fc0\">D<span class=\"_ _2\"></span>EFAU<span class=\"_ _2\"></span>LT_MS<span class=\"_ _2\"></span>G_BOX_<span class=\"_ _2\"></span>BUTTO<span class=\"_ _2\"></span>N_TEXT<span class=\"_ _2\"></span>_SI<span class=\"_ _2\"></span>ZE </span></span></div><div class=\"t m0 x1 he y1e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1e9 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y1ea ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>tail<span class=\"_ _1\"></span>le par <span class=\"_ _2\"></span>defaut<span class=\"_ _1\"></span> des objets <span class=\"_ _2\"></span>textes SFML pour les <span class=\"_ _2\"></span>boutto<span class=\"_ _1\"></span>ns <span class=\"ls1d ws15\">la</span> boite <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> d<span class=\"_ _2\"></span>ialog<span class=\"_ _2\"></span>ue. </span></span></div><div class=\"t m2 xa hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">5.6</div><div class=\"t m3 x1c hd y221 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y221 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_M<span class=\"_ _2\"></span>SG_B<span class=\"_ _2\"></span>OX_TE<span class=\"_ _2\"></span>XT_COLO<span class=\"_ _2\"></span>R<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y1c8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ec ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">sf::Color <span class=\"_ _2\"></span>&amp;DEFAU<span class=\"_ _2\"></span>LT_M<span class=\"_ _2\"></span>SG_BOX<span class=\"_ _2\"></span>_TEXT<span class=\"_ _2\"></span>_COLO<span class=\"_ _2\"></span>R </span></span></div><div class=\"t m0 x1 he y222 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1ed ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1cb ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>coul<span class=\"_ _1\"></span>eur par<span class=\"_ _1\"></span> defaut <span class=\"_ _2\"></span>des objets textes <span class=\"_ _2\"></span>SFML pour <span class=\"ls1d ws15\">la</span> b<span class=\"_ _2\"></span>oite <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>dialog<span class=\"_ _2\"></span>ue. </div><div class=\"t m0 x1 he y223 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y224 ff4 fs2 fc4 sc0 ls2 ws14\">5.7</div><div class=\"t m3 x1c hd y224 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y224 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_M<span class=\"_ _2\"></span>SG_B<span class=\"_ _2\"></span>OX_SE<span class=\"_ _2\"></span>LECTED<span class=\"_ _2\"></span>_TEX<span class=\"_ _2\"></span>T_COL<span class=\"_ _2\"></span>OR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y225 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y226 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">sf::Color <span class=\"_ _2\"></span>&amp;DEFAU<span class=\"_ _2\"></span>LT_M<span class=\"_ _2\"></span>SG_BOX<span class=\"_ _2\"></span>_SELE<span class=\"_ _2\"></span>CTED_<span class=\"_ _2\"></span>TEXT<span class=\"_ _2\"></span>_COLOR </span></span></div><div class=\"t m0 x1 he y383 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y384 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y28f ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>coul<span class=\"_ _1\"></span>eur par defaut des <span class=\"_ _2\"></span>obj<span class=\"_ _1\"></span>ets textes <span class=\"_ _2\"></span>SFML pour <span class=\"ls1d ws15\">la</span> b<span class=\"_ _2\"></span>oite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> dialogue <span class=\"_ _1\"></span>quand<span class=\"_ _1\"></span> <span class=\"ls33 ws27\">on<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> les <span class=\"_ _2\"></span>sele<span class=\"_ _2\"></span>ction<span class=\"_ _2\"></span>nent<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y385 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y290 ff4 fs2 fc4 sc0 ls2 ws14\">5.8</div><div class=\"t m3 x1c hd y290 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y290 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_<span class=\"_ _2\"></span>RPG_D<span class=\"_ _2\"></span>IALO<span class=\"_ _2\"></span>G_TEXT<span class=\"_ _2\"></span>_SIZE<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y549 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y291 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> <span class=\"fc0\">D<span class=\"_ _2\"></span>EFAU<span class=\"_ _2\"></span>LT_RP<span class=\"_ _2\"></span>G_DIA<span class=\"_ _2\"></span>LOG_T<span class=\"_ _2\"></span>EXT_S<span class=\"_ _2\"></span>IZE </span></span></div><div class=\"t m0 x1 he y54a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y54b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y54c ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y59c ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>tail<span class=\"_ _1\"></span>le par <span class=\"_ _2\"></span>defaut<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>text<span class=\"_ _1\"></span>e SFML <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> boite <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> dialogue <span class=\"_ _2\"></span>RPG<span class=\"_ _2\"></span>. </span></span></span></span></span></span></div><div class=\"t m2 xa hc y614 ff4 fs2 fc4 sc0 ls2 ws14\">5.9</div><div class=\"t m3 x1c hd y614 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y614 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_<span class=\"_ _2\"></span>RPG_D<span class=\"_ _2\"></span>IALO<span class=\"_ _2\"></span>G_BUTTON<span class=\"_ _2\"></span>_TEXT<span class=\"_ _2\"></span>_SIZE<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y54d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y54e ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> <span class=\"fc0\">D<span class=\"_ _2\"></span>EFAU<span class=\"_ _2\"></span>LT_RP<span class=\"_ _2\"></span>G_DIA<span class=\"_ _2\"></span>LOG_<span class=\"_ _2\"></span>BUTTON<span class=\"_ _2\"></span>_TEXT<span class=\"_ _2\"></span>_SIZE </span></span></div><div class=\"t m0 x1 he y54f ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y550 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1d5 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>tail<span class=\"_ _1\"></span>le par <span class=\"_ _2\"></span>defaut<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">l’o<span class=\"_ _1\"></span>bjet<span class=\"ff2 ws2\"> texte<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>SFML<span class=\"_ _1\"></span> pour <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>boutton <span class=\"_ _1\"></span><span class=\"ls1e ws16\">de</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>boite <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>dialogue RP<span class=\"_ _4\"></span>G. </span></span></span></span></div><div class=\"t m0 x1 he y551 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y552 ff4 fs2 fc4 sc0 ls2 ws14\">5.10</div><div class=\"t m3 x20 hd y552 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y552 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_<span class=\"_ _2\"></span>RPG_D<span class=\"_ _2\"></span>IALO<span class=\"_ _2\"></span>G_TEXT<span class=\"_ _2\"></span>_COL<span class=\"_ _2\"></span>OR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y504 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y541 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">sf::Color <span class=\"_ _2\"></span>&amp;DEFAU<span class=\"_ _2\"></span>LT_RP<span class=\"_ _2\"></span>G_DI<span class=\"_ _2\"></span>ALOG<span class=\"_ _2\"></span>_TEXT<span class=\"_ _2\"></span>_COLOR </span></span></div><div class=\"t m0 x1 he y8e5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8e6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y454 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>coul<span class=\"_ _1\"></span>eur par defaut des <span class=\"_ _2\"></span>obj<span class=\"_ _1\"></span>ets textes <span class=\"_ _2\"></span>SFML pour <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>boite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> dialogue RP<span class=\"_ _2\"></span>G. </span></span></div><div class=\"t m0 x1 he y704 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1db ff4 fs2 fc4 sc0 ls2 ws14\">5.11</div><div class=\"t m3 x20 hd y1db ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1db ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_<span class=\"_ _2\"></span>RPG_D<span class=\"_ _2\"></span>IALO<span class=\"_ _2\"></span>G_SELEC<span class=\"_ _2\"></span>TED_<span class=\"_ _2\"></span>TEXT_<span class=\"_ _2\"></span>COLOR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y6bb ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y61e ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">sf::Color <span class=\"_ _2\"></span>&amp;DEFAU<span class=\"_ _2\"></span>LT_RP<span class=\"_ _2\"></span>G_DI<span class=\"_ _2\"></span>ALOG<span class=\"_ _2\"></span>_SELECT<span class=\"_ _2\"></span>ED_T<span class=\"_ _2\"></span>EXT_<span class=\"_ _2\"></span>COLOR </span></span></div><div class=\"t m0 x1 he y8e7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8e8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y74f ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> couleur par defaut <span class=\"_ _2\"></span>des objets <span class=\"_ _2\"></span>text<span class=\"_ _1\"></span>es SFML <span class=\"_ _2\"></span>(bouton Passe<span class=\"_ _1\"></span>r) pour <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> b<span class=\"_ _2\"></span>oite<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>ialogue RP<span class=\"_ _4\"></span>G. </span></span></span></span></div><div class=\"t m0 x1 he y8e9 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y617 ff4 fs2 fc4 sc0 ls2 ws14\">5.12</div><div class=\"t m3 x20 hd y617 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y617 ff4 fs2 fc4 sc0 ls2 ws14\">DE<span class=\"_ _2\"></span>FAULT_<span class=\"_ _2\"></span>BUTTON<span class=\"_ _2\"></span>_TEXT<span class=\"_ _2\"></span>_COLOR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x44 h9 y2d9 ff6 fs3 fc0 sc0 ls2 ws2\">10<span class=\"_ _4\"></span>5 </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf69\" class=\"pf w0 h0\" data-page-no=\"69\"><div class=\"pc pc69 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 hc y1be ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"fc0\">sf::Color &amp; DE<span class=\"_ _2\"></span>FAULT<span class=\"_ _2\"></span>_BUTTO<span class=\"_ _2\"></span>N_TEX<span class=\"_ _2\"></span>T_CO<span class=\"_ _2\"></span>LOR </span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2bc ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1c1 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>coul<span class=\"_ _1\"></span>eur par defaut des <span class=\"_ _2\"></span>text<span class=\"_ _1\"></span>es des <span class=\"_ _2\"></span>bouto<span class=\"_ _2\"></span>ns. </div><div class=\"t m0 x1 he y1c2 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1e4 ff4 fs2 fc4 sc0 ls1c\">6.</div><div class=\"t m3 xb hd y1e4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1e4 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>inform<span class=\"_ _1\"></span>ations <span class=\"ls21 ws19\">du</span> <span class=\"_ _2\"></span><span class=\"ls9e ws7a\">jeu<span class=\"fc0 ls2 ws2\"> </span></span></div><div class=\"t m2 xa hc y3a2 ff4 fs2 fc4 sc0 ls2 ws14\">6.1</div><div class=\"t m3 x1c hd y3a2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3a2 ff4 fs2 fc4 sc0 ls2 ws14\">MAJ<span class=\"_ _2\"></span>OR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y4b5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2f0 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff4 fc5\">std::string<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff2 fc0\">MAJO<span class=\"_ _4\"></span>R </span></span></span></div><div class=\"t m0 x1 he y564 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3a5 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y74 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> version <span class=\"_ _2\"></span>maje<span class=\"_ _2\"></span>ur. </span></span></div><div class=\"t m2 xa hc y2f4 ff4 fs2 fc4 sc0 ls2 ws14\">6.2</div><div class=\"t m3 x1c hd y2f4 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2f4 ff4 fs2 fc4 sc0 ls2 ws14\">MIN<span class=\"_ _2\"></span>OR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y3a6 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2f5 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff4 fc5\">std::string<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff2 fc0\">MIN<span class=\"_ _2\"></span>OR </span></span></span></div><div class=\"t m0 x1 he y3a7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2f6 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2f7 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> version <span class=\"_ _2\"></span>mine<span class=\"_ _2\"></span>ur. </span></span></div><div class=\"t m2 xa hc y3a8 ff4 fs2 fc4 sc0 ls2 ws14\">6.3</div><div class=\"t m3 x1c hd y3a8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3a8 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>GameV<span class=\"_ _2\"></span>ersion<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y622 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y623 ff4 fs2 fc5 sc0 ls2 ws2\">inline <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc0\">getGa<span class=\"_ _2\"></span>meVe<span class=\"_ _2\"></span>rsion<span class=\"_ _2\"></span>() </span></div><div class=\"t m0 x1 he y33a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y33b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y624 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>v<span class=\"_ _1\"></span>ersion <span class=\"ls1e ws16\">du</span> j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m0 x1 he y431 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y432 ff4 fs2 fc4 sc0 ls2 ws14\">6.4</div><div class=\"t m3 x1c hd y432 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y432 ff4 fs2 fc4 sc0 ls2 ws14\">GAME<span class=\"_ _2\"></span>_NAME<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y625 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y386 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::wstrin<span class=\"_ _1\"></span>g <span class=\"ff2 fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">GAME_<span class=\"_ _2\"></span>NAME </span></span></div><div class=\"t m0 x1 he y241 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y242 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y5a ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>no<span class=\"_ _1\"></span>m <span class=\"ls1e ws16\">du</span> je<span class=\"_ _4\"></span>u. </div><div class=\"t m2 xa hc y435 ff4 fs2 fc4 sc0 ls2 ws14\">6.5</div><div class=\"t m3 x1c hd y435 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y435 ff4 fs2 fc4 sc0 ls2 ws14\">GAME<span class=\"_ _2\"></span>_AUT<span class=\"_ _2\"></span>HOR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y246 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y247 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::wstrin<span class=\"_ _1\"></span>g <span class=\"ff2 fc8\">const <span class=\"_ _2\"></span><span class=\"fc0\">GAME_<span class=\"_ _2\"></span>AUTHO<span class=\"_ _2\"></span>R </span></span></div><div class=\"t m0 x1 he y436 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y437 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y57d ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>nom <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’aut<span class=\"_ _2\"></span>eur.<span class=\"_ _2\"></span><span class=\"ff2 ws2\"> </span></span></div><div class=\"t m2 xa hc y7d6 ff4 fs2 fc4 sc0 ls1c\">7.</div><div class=\"t m3 xb hd y7d6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7d6 ff4 fs2 fc4 sc0 ls2 ws2\">Paramètre <span class=\"_ _4\"></span>Admo<span class=\"_ _1\"></span>b </div><div class=\"t m0 x6 hc y8ea ff4 fs2 fc5 sc0 ls2 ws2\">namespace <span class=\"ff2 fc0\">Admo<span class=\"_ _1\"></span>bConfig; </span></div><div class=\"t m0 x6 hc y43a ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>définir<span class=\"_ _1\"></span> le<span class=\"_ _2\"></span>s <span class=\"_ _1\"></span>informations <span class=\"ff3 ws14\">d’Admob</span> pour pouvoir afficher le<span class=\"_ _2\"></span>s<span class=\"_ _1\"></span> annonces <span class=\"_ _2\"></span>da<span class=\"_ _1\"></span>ns le jeu. <span class=\"ff9\">Ces informations sont </span></div><div class=\"t m0 x6 hc y8eb ff9 fs2 fc0 sc0 ls2 ws2\">fournies sur la pl<span class=\"_ _1\"></span>ateforme de Google Admo<span class=\"_ _1\"></span>b !<span class=\"_ _1\"></span> </div><div class=\"t m2 xa hc y8ec ff4 fs2 fc4 sc0 ls2 ws14\">7.1</div><div class=\"t m3 x1c hd y8ec ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8ec ff4 fs2 fc4 sc0 ls53 ws41\">Id<span class=\"ls2 ws2\"> <span class=\"ls21 ws19\">de</span> <span class=\"_ _2\"></span><span class=\"ls9d ws79\">la<span class=\"ls2 ws2\"> P<span class=\"_ _2\"></span>UB<span class=\"_ _2\"></span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m2 xa hc y8ed ff4 fs2 fc4 sc0 ls2 ws14\">7.1.1</div><div class=\"t m3 x1e hd y8ed ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y8ed ff4 fs2 fc4 sc0 ls2 ws2\">kA<span class=\"_ _2\"></span>dMobA<span class=\"_ _2\"></span>ppID </div><div class=\"t m0 x6 hc y81a ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">const char*<span class=\"_ _1\"></span> <span class=\"fc0\">kAdMobAppID </span></span></div><div class=\"t m0 x6 hc y601 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y8ee ff2 fs2 fc0 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">l’application</span> <span class=\"_ _2\"></span>Admob. </span></span></div><div class=\"t m0 x44 h9 y5da ff6 fs3 fc0 sc0 ls2 ws2\">10<span class=\"_ _4\"></span>6 </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6a\" class=\"pf w0 h0\" data-page-no=\"6a\"><div class=\"pc pc6a w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m2 xa hc y200 ff4 fs2 fc4 sc0 ls2 ws14\">7.1.2</div><div class=\"t m3 x1e hd y200 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y200 ff4 fs2 fc4 sc0 ls2 ws2\">kBa<span class=\"_ _2\"></span>nnerA<span class=\"_ _2\"></span>dUnit </div><div class=\"t m0 x6 hc y201 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">const char*<span class=\"_ _1\"></span> <span class=\"fc0\">kBannerAdUnit </span></span></div><div class=\"t m0 x6 hc y1e2 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y613 ff2 fs2 fc0 sc0 ls2 ws2\">Code <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>bann<span class=\"_ _2\"></span>ière. </span></span></div><div class=\"t m2 xa hc y1e6 ff4 fs2 fc4 sc0 ls2 ws14\">7.1.3</div><div class=\"t m3 x1e hd y1e6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y1e6 ff4 fs2 fc4 sc0 ls2 ws2\">kRew<span class=\"_ _2\"></span>arde<span class=\"_ _2\"></span>dVideo<span class=\"_ _2\"></span>AdUni<span class=\"_ _2\"></span>t </div><div class=\"t m0 x6 hc y1e8 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _1\"></span><span class=\"ff2 fc8\">const <span class=\"_ _1\"></span>cha<span class=\"_ _1\"></span>r* <span class=\"_ _1\"></span><span class=\"fc0\">kRewardedVid<span class=\"_ _1\"></span>eoAdUnit </span></span></div><div class=\"t m0 x6 hc y1ea ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y44d ff2 fs2 fc0 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>vid<span class=\"_ _1\"></span>éo ré<span class=\"_ _2\"></span>compe<span class=\"_ _2\"></span>nse. </span></span></div><div class=\"t m2 xa hc y203 ff4 fs2 fc4 sc0 ls2 ws14\">7.2</div><div class=\"t m3 x1c hd y203 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y203 ff4 fs2 fc4 sc0 ls2 ws2\">Taille <span class=\"ls21 ws19\">de</span> <span class=\"_ _4\"></span><span class=\"ls9d ws79\">la<span class=\"ls2 ws2\"> bannière <span class=\"ls21 ws19\">de</span> <span class=\"_ _2\"></span>PUB<span class=\"_ _4\"></span><span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xa hc y5bd ff4 fs2 fc4 sc0 ls2 ws14\">7.2.1</div><div class=\"t m3 x1e hd y5bd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y5bd ff4 fs2 fc4 sc0 ls2 ws2\">kBa<span class=\"_ _2\"></span>nnerW<span class=\"_ _2\"></span>idth </div><div class=\"t m0 x6 hc y2c0 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">const int <span class=\"fc0\">kBa<span class=\"_ _1\"></span>nnerWidth </span></span></div><div class=\"t m0 x6 hc y339 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2f8 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> largeur <span class=\"ls1e ws16\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> la bannière <span class=\"ff3 ws14\">d’an<span class=\"_ _2\"></span>non<span class=\"_ _2\"></span>ce.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y2f9 ff4 fs2 fc4 sc0 ls2 ws14\">7.2.2</div><div class=\"t m3 x1e hd y2f9 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2f9 ff4 fs2 fc4 sc0 ls2 ws2\">kBa<span class=\"_ _2\"></span>nnerH<span class=\"_ _2\"></span>eight<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y8ef ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">const int <span class=\"fc0\">kBa<span class=\"_ _1\"></span>nnerHeight </span></span></div><div class=\"t m0 x6 hc y8f0 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y432 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> hauteur <span class=\"_ _2\"></span><span class=\"ls1f ws17\">de<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>la bannière<span class=\"_ _1\"></span> <span class=\"ff3 ws14\">d<span class=\"_ _2\"></span>’anno<span class=\"_ _2\"></span>nce.<span class=\"ff2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m2 xa hc y8f1 ff4 fs2 fc4 sc0 ls2 ws14\">7.3</div><div class=\"t m3 x1c hd y8f1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8f1 ff4 fs2 fc4 sc0 ls2 ws2\">Publique <span class=\"_ _2\"></span>ci<span class=\"_ _1\"></span>ble <span class=\"ls21 ws19\">de</span> <span class=\"ls9d ws79\">la<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> P<span class=\"_ _2\"></span>UB<span class=\"fc0\"> </span></span></span></div><div class=\"t m2 xa hc y8f2 ff4 fs2 fc4 sc0 ls2 ws14\">7.3.1</div><div class=\"t m3 x1e hd y8f2 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y8f2 ff4 fs2 fc4 sc0 ls2 ws2\">kB<span class=\"_ _2\"></span>irthday<span class=\"_ _2\"></span>Day </div><div class=\"t m0 x6 hc y8f3 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">const int <span class=\"fc0\">kBi<span class=\"_ _1\"></span>rthdayDa<span class=\"_ _1\"></span>y </span></span></div><div class=\"t m0 x6 hc y8f4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2cf ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>jou<span class=\"_ _1\"></span>r <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>naissance<span class=\"_ _1\"></span> des <span class=\"_ _2\"></span>util<span class=\"_ _2\"></span>isateu<span class=\"_ _2\"></span>rs. </div><div class=\"t m2 xa hc y303 ff4 fs2 fc4 sc0 ls2 ws14\">7.3.2</div><div class=\"t m3 x1e hd y303 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y303 ff4 fs2 fc4 sc0 ls2 ws2\">kB<span class=\"_ _2\"></span>irthday<span class=\"_ _2\"></span>Mont<span class=\"_ _2\"></span>h </div><div class=\"t m0 x6 hc y740 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">const int <span class=\"fc0\">kBi<span class=\"_ _1\"></span>rthdayMonth </span></span></div><div class=\"t m0 x6 hc y8f5 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2d4 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>mo<span class=\"_ _1\"></span>is <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> naissa<span class=\"_ _1\"></span>nce des <span class=\"_ _4\"></span>utilis<span class=\"_ _2\"></span>ateurs<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m2 xa hc y8f6 ff4 fs2 fc4 sc0 ls2 ws14\">7.3.3</div><div class=\"t m3 x1e hd y8f6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y8f6 ff4 fs2 fc4 sc0 ls2 ws2\">kB<span class=\"_ _2\"></span>irthday<span class=\"_ _2\"></span>Year<span class=\"_ _2\"></span> </div><div class=\"t m0 x6 hc y29b ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"ff2 fc8\">const int <span class=\"fc0\">kBi<span class=\"_ _1\"></span>rthdayYea<span class=\"_ _1\"></span>r </span></span></div><div class=\"t m0 x6 hc y7f8 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y29f ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’a<span class=\"_ _1\"></span>nnée<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> naiss<span class=\"_ _1\"></span>ance des <span class=\"_ _2\"></span>uti<span class=\"_ _2\"></span>lisate<span class=\"_ _2\"></span>urs. </span></span></span></span></div><div class=\"t m2 xa hc y478 ff4 fs2 fc4 sc0 ls2 ws14\">7.3.4</div><div class=\"t m3 x1e hd y478 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y478 ff4 fs2 fc4 sc0 ls2 ws2\">kKe<span class=\"_ _2\"></span>ywor<span class=\"_ _2\"></span>ds </div><div class=\"t m0 x6 hc y13c ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _4\"></span><span class=\"ff2 fc8\">const<span class=\"_ _1\"></span> <span class=\"_ _4\"></span>char<span class=\"fc0\">* <span class=\"_ _2\"></span>kKeyword<span class=\"_ _1\"></span>s[] </span></span></div><div class=\"t m0 x6 hc y749 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x44 h9 y23d ff6 fs3 fc0 sc0 ls2 ws2\">10<span class=\"_ _4\"></span>7 </div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6b\" class=\"pf w0 h0\" data-page-no=\"6b\"><div class=\"pc pc6b w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPVB269jEgChAIqivAh2MIerAQTht9EKgqMhjGAI4Y/axNHVVThne+vbLgAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOpzAQAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqzwUAAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4XAAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAJvUDIgAAABBSURBVKD6XAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAIBv1bf0W5LkGNarjsnenk2Z3j2X7q5j4jIAAIAfeQBjNR7T6kj/SgAAAABJRU5ErkJggg==\"/><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h16 y1bd ff2 fs8 fc0 sc0 ls2 ws2\"><span class=\"fc1 sc0\"> </span></div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Mots-clés à <span class=\"_ _2\"></span>utiliser<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>pour faire <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>demande <span class=\"ff3 ws14\">d’une</span> an<span class=\"_ _2\"></span>nonce<span class=\"_ _2\"></span>. </div><div class=\"t m2 xa hc y39e ff4 fs2 fc4 sc0 ls1c\">8.</div><div class=\"t m3 xb hd y39e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y39e ff4 fs2 fc4 sc0 ls2 ws2\">Chemin des <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>ichiers ressources <span class=\"ls21 ws19\">du</span> <span class=\"_ _2\"></span><span class=\"ls9e ws7a\">jeu<span class=\"fc0 ls2 ws2\"> </span></span></div><div class=\"t m2 xa hc y39f ff4 fs2 fc4 sc0 ls2 ws14\">8.1</div><div class=\"t m3 x1c hd y39f ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y39f ff4 fs2 fc4 sc0 ls2 ws14\">ASS<span class=\"_ _2\"></span>ETS_D<span class=\"_ _2\"></span>IR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y3a0 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">ASSET<span class=\"_ _2\"></span>S_DIR </span></span></div><div class=\"t m0 x1 he y3a1 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3a2 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y4b5 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y2f0 ff2 fs2 fc0 sc0 ls2 ws2\">Racine <span class=\"_ _2\"></span>des fichiers <span class=\"_ _2\"></span>ress<span class=\"_ _2\"></span>ources.<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 he y564 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y3a5 ff4 fs2 fc4 sc0 ls2 ws14\">8.2</div><div class=\"t m3 x1c hd y3a5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y3a5 ff4 fs2 fc4 sc0 ls2 ws14\">GUI<span class=\"_ _2\"></span>_DIR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y2f2 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">GUI_D<span class=\"_ _2\"></span>IR </span></span></div><div class=\"t m0 x1 he y2f3 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2f4 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y8f7 ff2 fs2 fc0 sc0 ls2 ws2\">Chemin de<span class=\"_ _2\"></span>s fichiers ressources qui <span class=\"_ _2\"></span>servent d&apos;interface gr<span class=\"_ _2\"></span>aphiq<span class=\"_ _2\"></span>ue. </div><div class=\"t m0 x1 he y3a7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2f6 ff4 fs2 fc4 sc0 ls2 ws14\">8.3</div><div class=\"t m3 x1c hd y2f6 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2f6 ff4 fs2 fc4 sc0 ls2 ws14\">FON<span class=\"_ _2\"></span>T_DIR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y8f8 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y8f9 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">FONT_<span class=\"_ _2\"></span>DIR </span></span></div><div class=\"t m0 x6 hc y3a8 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y52 ff2 fs2 fc0 sc0 ls2 ws2\">Chemin de<span class=\"_ _2\"></span>s fichiers ressources qui <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>ervent <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>poli<span class=\"_ _2\"></span>ce. </div><div class=\"t m0 x1 he y33a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y33b ff4 fs2 fc4 sc0 ls2 ws14\">8.4</div><div class=\"t m3 x1c hd y33b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y33b ff4 fs2 fc4 sc0 ls2 ws14\">SPR<span class=\"_ _2\"></span>ITES_<span class=\"_ _2\"></span>DIR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y624 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">SPRIT<span class=\"_ _2\"></span>ES_DI<span class=\"_ _2\"></span>R </span></span></div><div class=\"t m0 x1 he y431 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y432 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y433 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y8b4 ff2 fs2 fc0 sc0 ls2 ws2\">Chemin de<span class=\"_ _2\"></span>s fichiers ressources qui <span class=\"_ _2\"></span>servent de Spr<span class=\"_ _2\"></span>ite. </div><div class=\"t m2 xa hc y242 ff4 fs2 fc4 sc0 ls2 ws14\">8.5</div><div class=\"t m3 x1c hd y242 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y242 ff4 fs2 fc4 sc0 ls2 ws14\">TIL<span class=\"_ _2\"></span>ES_D<span class=\"_ _2\"></span>IR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y569 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">TILES<span class=\"_ _2\"></span>_DI<span class=\"_ _2\"></span>R </span></span></div><div class=\"t m0 x1 he y627 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y435 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y341 ff2 fs2 fc0 sc0 ls2 ws2\">Chemin des <span class=\"_ _2\"></span>fichiers ressources qui <span class=\"_ _2\"></span>servent <span class=\"ls1e ws16\">de</span> tuiles <span class=\"_ _2\"></span><span class=\"ls24 ws1c\">et<span class=\"ls2 ws2\"> d&apos;arrière-plan. </span></span></div><div class=\"t m0 x1 he y436 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y437 ff4 fs2 fc4 sc0 ls2 ws14\">8.6</div><div class=\"t m3 x1c hd y437 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y437 ff4 fs2 fc4 sc0 ls2 ws14\">SFX<span class=\"_ _2\"></span>_DIR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y628 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">SFX_D<span class=\"_ _2\"></span>IR </span></span></div><div class=\"t m0 x1 he y8fa ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y24b ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he yf8 ff2 fs2 fc0 sc0 ls2 ws2\">Chemin de<span class=\"_ _2\"></span>s fichiers ressourc<span class=\"_ _1\"></span>es q<span class=\"_ _2\"></span>ui servent <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>SF<span class=\"_ _2\"></span>X. </div><div class=\"t m0 x1 he y8b5 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y43a ff4 fs2 fc4 sc0 ls2 ws14\">8.7</div><div class=\"t m3 x1c hd y43a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y43a ff4 fs2 fc4 sc0 ls2 ws14\">MU<span class=\"_ _2\"></span>SIC_DI<span class=\"_ _2\"></span>R<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y40a ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y544 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">MUSIC<span class=\"_ _2\"></span>_DIR </span></span></div><div class=\"t m0 x6 hc y8fb ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y8fc ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y546 ff2 fs2 fc0 sc0 ls2 ws2\">Chemin de<span class=\"_ _2\"></span>s fichiers ressources qui <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>ervent <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>musi<span class=\"_ _2\"></span>que. </div><div class=\"t m0 x1 he y650 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y8fd ff4 fs2 fc4 sc0 ls2 ws14\">8.8</div><div class=\"t m3 x1c hd y8fd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y8fd ff4 fs2 fc4 sc0 ls2 ws14\">TMX<span class=\"_ _2\"></span>_RSC<span class=\"_ _2\"></span>_DIR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x6 hc y8fe ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">TMX_R<span class=\"_ _2\"></span>SC_D<span class=\"_ _2\"></span>IR </span></span></div><div class=\"t m0 x1 h13 y7c5 ff2 fs3 fc0 sc0 ls95 ws2\"> <span class=\"ff6 ls2 v5\">10<span class=\"_ _4\"></span>8 </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6c\" class=\"pf w0 h0\" data-page-no=\"6c\"><div class=\"pc pc6c w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzXQREAAAjDMMC/580Hl0jor5tkAAAAeOokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1SQAAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA65MAAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcnAQAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuTwIAAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXJ8EAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+CQAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfRIAAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAANcHAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAA4PokAAAAcH0AAAC4PgAAAFwfAAAArg8AAADXBwAAgOsDAABwfQAAALg+AAAAXB8AAACuDwAAANcHAACA6wMAAMD1AQAAuD4AAABcHwAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAFwfAAAArg8AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAACuDwAAANcHAACA6wMAAMD1AQAA4PoAAABwfQAAAK4PAAAA1wcAAIDrAwAAwPUBAADg+gAAAHB9AAAAuD4AAADXBwAAgOsDAADA9QEAAOD6AAAAcH0AAAC4PgAAAFwfAACA6wMAAMD1AQAA4PoAAABwfQAAALg+AAAAXB8AAACuDwAAwPUBAADg+gAAAHB9AAAAuD4AAABcHwAAAK4PAAAA1wcAAOD6AAAAcH0AAAC4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\"/><div class=\"c x3f y101 w22 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls2 ws2\">10<span class=\"_ _4\"></span>9 </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h10 y8ff ff2 fs6 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y201 ff2 fs2 fc0 sc0 ls2 ws2\">Chemin de<span class=\"_ _2\"></span>s fichiers ressources <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>la bi<span class=\"_ _1\"></span>bliothèque TMX<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>Loa<span class=\"_ _1\"></span>der <span class=\"ls24 ws1c\">et</span> <span class=\"_ _2\"></span>Lite<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y1c1 ff4 fs2 fc4 sc0 ls1c\">9.</div><div class=\"t m3 xb hd y1c1 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1c1 ff4 fs2 fc4 sc0 ls2 ws2\">Nom <span class=\"_ _2\"></span><span class=\"ls21 ws19\">du<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>package <span class=\"ls21 ws19\">du</span> <span class=\"_ _4\"></span><span class=\"ls9f ws7b\">jeu<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>(Mobile) </span></span></span></span></div><div class=\"t m0 x6 hc y1c3 ff4 fs2 fc5 sc0 ls2 ws2\">static std::string <span class=\"_ _1\"></span><span class=\"ff2 fc8\">const <span class=\"fc0\">PAC<span class=\"_ _1\"></span>KAGE_NAME </span></span></div><div class=\"t m0 x6 hc y1c4 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y1e8 ff2 fs2 fc0 sc0 ls2 ws2\">Nom <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>package<span class=\"_ _1\"></span> <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>jeu. Représente<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>l&apos;endroit<span class=\"_ _1\"></span> <span class=\"ls2a ws20\">où</span> <span class=\"_ _2\"></span>vos données seront enregistrées sur Mobile. </div><div class=\"t m0 x6 hc y351 ff2 fs2 fc0 sc0 ls2 ws2\">Vous devez appliquer c<span class=\"_ _1\"></span>e nom pour l&apos;<span class=\"_ _1\"></span><span class=\"ff4\">applicationId<span class=\"_ _1\"></span> </span>dans le fichi<span class=\"_ _1\"></span>er <span class=\"ff4\">build.gradle<span class=\"_ _1\"></span> </span></div><div class=\"t m2 xa hc y440 ff4 fs2 fc4 sc0 ls1c\">10.</div><div class=\"t m3 x1c hd y440 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y440 ff4 fs2 fc4 sc0 ls2 ws2\">Chemin des <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>ichiers <span class=\"ls21 ws19\">de</span> sa<span class=\"_ _4\"></span>u<span class=\"_ _1\"></span>vega<span class=\"_ _2\"></span>rde<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y335 ff4 fs2 fc4 sc0 ls2 ws14\">10.1</div><div class=\"t m3 x20 hd y335 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y335 ff4 fs2 fc4 sc0 ls2 ws14\">DAT<span class=\"_ _2\"></span>A_PA<span class=\"_ _2\"></span>RENT_D<span class=\"_ _2\"></span>IR<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y5bc ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y5bd ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">DATA_P<span class=\"_ _2\"></span>ARENT<span class=\"_ _2\"></span>_DIR </span></span></div><div class=\"t m0 x1 he y337 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2c0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y338 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y339 ff2 fs2 fc0 sc0 ls2 ws2\">Racine de<span class=\"_ _2\"></span>s<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>fichiers de<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>sauvegarde<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1e ws16\">du<span class=\"ls2 ws2\"> je<span class=\"_ _4\"></span>u. </span></span></div><div class=\"t m2 xa hc y2f8 ff4 fs2 fc4 sc0 ls2 ws14\">10.2</div><div class=\"t m3 x20 hd y2f8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y2f8 ff4 fs2 fc4 sc0 ls2 ws14\">GAME<span class=\"_ _2\"></span>_DATA<span class=\"_ _2\"></span>_FI<span class=\"_ _2\"></span>LE<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y5bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3a9 ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">GAME_<span class=\"_ _2\"></span>DATA<span class=\"_ _2\"></span>_FILE </span></span></div><div class=\"t m0 x1 he y2fa ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y2fb ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2fc ff2 fs2 fc0 sc0 ls2 ws2\">Chemin pour <span class=\"_ _2\"></span>enregistrer<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> fichier <span class=\"_ _2\"></span>de sauvegard<span class=\"_ _1\"></span>e du j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc yfb ff4 fs2 fc4 sc0 ls2 ws14\">10.3</div><div class=\"t m3 x20 hd yfb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc yfb ff4 fs2 fc4 sc0 ls2 ws14\">CON<span class=\"_ _2\"></span>FIG_<span class=\"_ _2\"></span>FILE<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y828 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y33c ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">CONFI<span class=\"_ _2\"></span>G_FIL<span class=\"_ _2\"></span>E </span></span></div><div class=\"t m0 x1 he y33d ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y33e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y25f ff2 fs2 fc0 sc0 ls2 ws2\">Chemin pour <span class=\"_ _2\"></span>enregistrer <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>fic<span class=\"_ _1\"></span>hier <span class=\"_ _2\"></span>de co<span class=\"_ _1\"></span>nfiguration du<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>je<span class=\"_ _2\"></span>u. </div><div class=\"t m2 xa hc y55a ff4 fs2 fc4 sc0 ls2 ws14\">10.4</div><div class=\"t m3 x20 hd y55a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y55a ff4 fs2 fc4 sc0 ls2 ws14\">GAME<span class=\"_ _2\"></span>_PAD<span class=\"_ _2\"></span>_FIL<span class=\"_ _2\"></span>E<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y55b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y55c ff4 fs2 fc5 sc0 ls2 ws2\">static <span class=\"_ _2\"></span>std::string <span class=\"ff2 fc8\">co<span class=\"_ _1\"></span>nst <span class=\"_ _2\"></span><span class=\"fc0\">GAME_<span class=\"_ _2\"></span>PAD_<span class=\"_ _2\"></span>FILE </span></span></div><div class=\"t m0 x1 he y157 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc yef ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y249 ff2 fs2 fc0 sc0 ls2 ws2\">Chemin pour <span class=\"_ _2\"></span>enregistrer<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>fic<span class=\"_ _1\"></span>hier <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>co<span class=\"_ _1\"></span>nfiguration <span class=\"ls1e ws16\">du</span> Game Pad <span class=\"_ _2\"></span>Virtuel sur<span class=\"_ _1\"></span> M<span class=\"_ _2\"></span>obile<span class=\"_ _2\"></span>. </div><div class=\"t m0 x1 he y24a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y24b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y24c ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y24d ff9 fs2 fc3 sc0 ls2 ws14\">Act<span class=\"_ _2\"></span>ivit<span class=\"_ _2\"></span>é<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 h22 y6a8 ff9 fsb fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y365 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y366 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y900 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> lancer <span class=\"_ _2\"></span>les <span class=\"_ _1\"></span>différentes scènes <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> jeu. <span class=\"_ _2\"></span>Une autre particularité <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> cette classe est <span class=\"ff3 ws14\">q<span class=\"_ _2\"></span>u’ell<span class=\"_ _1\"></span>e<span class=\"ff2 ws2\"> relie <span class=\"_ _4\"></span>l<span class=\"_ _1\"></span>es scènes <span class=\"ls9e ws7a\">du</span> </span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y616 ff2 fs2 fc0 sc0 ls2 ws2\">mo<span class=\"_ _2\"></span>teur. </div></div><div class=\"c x6 y901 w9 h26\"><div class=\"t m0 x0 hc y902 ff9 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y903 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _4\"></span>GameActiv<span class=\"_ _1\"></span>ity </div></div><div class=\"c x6 y901 w9 h26\"><div class=\"t m0 x0 hc y904 ff4 fs2 fc5 sc0 ls2 ws2\">class </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x2d he y905 ff2 fs2 fc0 sc0 ls2 ws2\">GameActivity;<span class=\"_ _1\"></span> </div></div><div class=\"c x6 y901 w9 h26\"><div class=\"t m0 x0 hc y906 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">app_<span class=\"_ _2\"></span>src/a<span class=\"_ _2\"></span>ctivit<span class=\"_ _2\"></span>y/Gam<span class=\"_ _2\"></span>eAct<span class=\"_ _2\"></span>ivity<span class=\"_ _2\"></span>.h<span class=\"fc0 ws2\"> </span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6d\" class=\"pf w0 h0\" data-page-no=\"6d\"><div class=\"pc pc6d w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzdb2jUdQDH8e91x1jO3GyajTKtRyuJShGMBpVZT4I9SQYToQk+SNgoC/vzqEIRh0uS/iAZbA+ibIwYC5ftiSwWDgZiyXCP1OGDOeZxTXbDxs5fDwbHCOnJbb9tv16vR7e7cdw+3IO9ue/dpaIoCgAAACTUfSYAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPWZAAAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVZwIAAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVJ8JAAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9JgAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9ZkAAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANVnAgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQf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\"/><div class=\"c x3f y101 w22 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls2 ws2\">11<span class=\"_ _4\"></span>0 </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h10 y8ff ff2 fs6 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y1be ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y1be ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y1be ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts de <span class=\"_ _2\"></span>GameAct<span class=\"_ _2\"></span>ivity<span class=\"_ _2\"></span>;<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y5e5 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y5e5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5e5 ff4 fs2 fc4 sc0 ls2 ws2\">Game<span class=\"_ _2\"></span>Activ<span class=\"_ _2\"></span>ity </div><div class=\"t m0 x6 he y907 ff2 fs2 fc0 sc0 ls2 ws2\">Gam<span class=\"_ _2\"></span>eActi<span class=\"_ _2\"></span>vity<span class=\"_ _2\"></span>(GameS<span class=\"_ _2\"></span>ystem<span class=\"_ _2\"></span>Exten<span class=\"_ _2\"></span>ded &amp;<span class=\"_ _2\"></span>gameS<span class=\"_ _2\"></span>ysExt<span class=\"_ _2\"></span>) </div><div class=\"t m0 x6 hc y908 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y9a ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> clas<span class=\"_ _1\"></span>se, e<span class=\"_ _2\"></span>lle prend <span class=\"ls24 ws1c\">en</span> paramètre <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>gestionnai<span class=\"_ _1\"></span>re <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>système <span class=\"_ _1\"></span>de jeu <span class=\"_ _2\"></span><span class=\"ff9\">(cliqu<span class=\"_ _1\"></span>er ici <span class=\"_ _2\"></span><span class=\"fc7\">1 <span class=\"fc0\">pour plus <span class=\"_ _2\"></span><span class=\"ffb ws14\">d’info<span class=\"_ _2\"></span>)<span class=\"ff2 ws2\">. </span></span></span></span></span></span></span></div><div class=\"t m0 x1 he y87b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2f0 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y2f0 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2f0 ff4 fs2 fc4 sc0 ls2 ws2\">m_ga<span class=\"_ _2\"></span>meSc<span class=\"_ _2\"></span>ene </div><div class=\"t m0 x6 hc y87d ff4 fs2 fc5 sc0 ls2 ws14\">std::shared_ptr<span class=\"ff2 fc0 ls2e\">&lt;</span>is<span class=\"_ _1\"></span>::<span class=\"ff2 fc0 ws2\">GameDis<span class=\"_ _1\"></span>play&gt; <span class=\"_ _2\"></span>m_gameScene; </span></div><div class=\"t m0 x6 hc y333 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y909 ff2 fs2 fc0 sc0 ls2 ws2\">Instance <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> scène qui sera <span class=\"_ _2\"></span>util<span class=\"_ _2\"></span>isée. </span></span></div><div class=\"t m2 xa hc y5bd ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y5bd ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y5bd ff4 fs2 fc4 sc0 ls2 ws2\">onU<span class=\"_ _2\"></span>pdate </div><div class=\"t m0 x6 hc y2c0 ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">onUpdat<span class=\"_ _1\"></span>e() </span></span></div><div class=\"t m0 x6 hc y339 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y2f8 ff2 fs2 fc0 sc0 ls2 ws2\">Sert <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> mettre <span class=\"_ _2\"></span>à jour les <span class=\"_ _2\"></span>informations<span class=\"_ _1\"></span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"ls1d ws15\">la</span> scè<span class=\"_ _2\"></span>ne. </span></span></div><div class=\"t m2 xa hc y52 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y52 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y52 ff4 fs2 fc4 sc0 ls2 ws2\">onDr<span class=\"_ _2\"></span>aw </div><div class=\"t m0 x6 hc y8ef ff4 fs2 fc5 sc0 ls2 ws2\">virtual <span class=\"_ _4\"></span><span class=\"ff2 fc8\">void<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc0\">onDraw()<span class=\"_ _1\"></span> </span></span></div><div class=\"t m0 x6 hc y8f0 ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y432 ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’afficher<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>scène<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y90a ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y90b ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 he y58 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y90c ff9 fs2 fc3 sc0 ls2 ws14\">Niv<span class=\"_ _2\"></span>eau<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 h22 y90d ff9 fsb fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x0 hc y90e ff9 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y359 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>nivea<span class=\"_ _2\"></span>ux<span class=\"fc0\"> </span></div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x24 he y811 ff2 fs2 fc0 sc0 ls2 ws2\">Dans <span class=\"_ _2\"></span>is::Engin<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>les<span class=\"_ _1\"></span> niveaux <span class=\"ls1f ws17\">du</span> <span class=\"_ _2\"></span>jeu <span class=\"_ _2\"></span>so<span class=\"_ _1\"></span>nt des <span class=\"_ _4\"></span>tabl<span class=\"_ _1\"></span>eaux <span class=\"ff3 ws14\">d’entier</span> <span class=\"_ _2\"></span>cont<span class=\"_ _1\"></span>enus dans des fichiers entête (fichier.h). Ce<span class=\"_ _2\"></span>s nive<span class=\"_ _2\"></span>aux </div><div class=\"t m0 x24 hc y90f ff2 fs2 fc0 sc0 ls2 ws2\">sont <span class=\"_ _2\"></span>cré<span class=\"_ _1\"></span>és grâce <span class=\"_ _2\"></span>à <span class=\"ff3 ws14\">l’éditeur</span> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> niveau <span class=\"ff4\">is::Engi<span class=\"_ _1\"></span>ne Level <span class=\"_ _2\"></span>Editor<span class=\"_ _1\"></span> <span class=\"ff2\">(</span></span></span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x45 he y47d ff2 fs2 fcf sc0 ls2 ws2\">lien <span class=\"fc0 ls1e ws16\">du</span><span class=\"fc0\"> pr<span class=\"_ _2\"></span>ojet)<span class=\"_ _1\"></span> qui <span class=\"_ _2\"></span>est liv<span class=\"_ _1\"></span>ré avec <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> mo<span class=\"_ _2\"></span>teur. </span></span></span></div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x0 he y910 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 h48 y911 ffc fs2 fc0 sc0 ls2 ws2\">Entête : </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x46 hc y30 ff9 fs2 fc5 sc0 ls2 ws14\">app<span class=\"_ _2\"></span>_src/<span class=\"ff4\">l<span class=\"_ _2\"></span>evels<span class=\"_ _2\"></span><span class=\"ff9\">/<span class=\"ff4\">Leve<span class=\"_ _2\"></span>l<span class=\"ff9 ls4e ws3b\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></span></div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x0 hc y912 ff9 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y551 ff4 fs2 fc4 sc0 ls2 ws2\">Intégration <span class=\"ffd ws4b\">d’un</span> <span class=\"_ _2\"></span>nive<span class=\"_ _2\"></span>au<span class=\"fc0\"> </span></div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x0 hc y913 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 hc y914 ff2 fs2 fc0 sc0 ls2 ws2\">Pour <span class=\"_ _2\"></span>int<span class=\"_ _1\"></span>égrer <span class=\"ls23 ws1b\">un<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> niveau <span class=\"_ _2\"></span><span class=\"ls33 ws27\">on<span class=\"ls2 ws2\"> inclut son entête dans <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> fichier <span class=\"_ _2\"></span><span class=\"ff4\">Level.h<span class=\"_ _1\"></span> <span class=\"ff2 ls1f ws17\">de</span><span class=\"ff2\"> <span class=\"_ _2\"></span>cette<span class=\"_ _1\"></span> façon <span class=\"_ _4\"></span>: </span></span></span></span></span></span></span></span></div><div class=\"t m0 x24 hc y67e ff4 fs2 fc5 sc0 ls2 ws2\">#include <span class=\"_ _2\"></span>&quot;..<span class=\"_ _2\"></span>/leve<span class=\"_ _2\"></span>ls/lev<span class=\"_ _2\"></span>el_1.<span class=\"_ _2\"></span>h&quot;</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x47 hc y216 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x0 hc y915 ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc hc y916 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts pour gérer <span class=\"_ _2\"></span>les ni<span class=\"_ _2\"></span>veaux<span class=\"_ _2\"></span><span class=\"fc0\"> </span></div><div class=\"t m0 xc hc y64 ff4 fs2 fc4 sc0 ls2 ws2\">nam<span class=\"_ _2\"></span>espa<span class=\"_ _2\"></span>ce <span class=\"_ _4\"></span>level </div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x24 hc y917 ff4 fs2 fc5 sc0 ls2 ws2\">namespace </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x27 he y918 ff2 fs2 fc0 sc0 ls2 ws2\">level; </div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x24 hc y919 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source</div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x26 hc y91a ff4 fs2 fc0 sc0 ls2 ws2\"> </div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x0 hc y91b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x24 he y91c ff2 fs2 fc0 sc0 ls2 ws2\">Permet <span class=\"ff3 ws14\">d’utiliser</span> <span class=\"_ _2\"></span>les cont<span class=\"_ _1\"></span>enus qui <span class=\"_ _2\"></span>permett<span class=\"_ _1\"></span>ent <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> gérer <span class=\"_ _2\"></span>les ni<span class=\"_ _2\"></span>veaux.<span class=\"_ _2\"></span> </span></span></div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 xc h18 y573 ff4 fs9 fc4 sc0 ls2 ws2\">enum <span class=\"_ _4\"></span>LevelId </div></div><div class=\"c x23 y3d w4 h47\"><div class=\"t m0 x24 hc y91d ff4 fs2 fcd sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">LevelId<span class=\"_ _1\"></span> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6e\" class=\"pf w0 h0\" data-page-no=\"6e\"><div class=\"pc pc6e w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzb0YkiQRSGUauown5UBFMxAUMwLhMxIpPolwZFEe+8bAa768zUPSeD+kuFj25LRKwAAAAYVDUBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAMCgWs5jL8vi7gEAIJve+zRN2U7tWR8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAfouW89jTNLl7AADIptaMz71KRLh7AACAYVvXBAAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPhMAAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA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AABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAPj3Ws5jr9dr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\"/><div class=\"c x3f y101 w22 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls2 ws2\">11<span class=\"_ _4\"></span>1 </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h10 y8ff ff2 fs6 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div><div class=\"t m0 x29 he y276 ff2 fs2 fc0 sc0 ls2 ws2\">LEV<span class=\"_ _2\"></span>EL_1<span class=\"_ _2\"></span>, </div><div class=\"t m0 x29 he y91e ff2 fs2 fc0 sc0 ls2 ws2\">LEV<span class=\"_ _2\"></span>EL_2<span class=\"_ _2\"></span>, </div><div class=\"t m0 x29 he y91f ff2 fs2 fcc sc0 ls73 ws70\">/*<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">…<span class=\"_ _2\"></span><span class=\"ff2 ws2\"> <span class=\"lsa2 ws7c\">*/<span class=\"_ _1\"></span></span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x29 he y920 ff2 fs2 fc0 sc0 ls2 ws2\">, LEVEL_MAX <span class=\"_ _2\"></span><span class=\"fcc ls73\">//<span class=\"ls2\"> Permet <span class=\"ls1e ws16\">de</span> <span class=\"_ _4\"></span>c<span class=\"_ _1\"></span>onnaitre <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>nombre total <span class=\"ls1f ws17\">de</span> nive<span class=\"_ _2\"></span>au<span class=\"_ _1\"></span> inté<span class=\"_ _2\"></span>gré<span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x6 he y921 ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y922 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y923 ff2 fs2 fc0 sc0 ls2 ws2\">Représente <span class=\"ff3 ws14\">l’index</span> <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>chaque niveau. A chaque <span class=\"lsa3 ws7d\">fois</span> <span class=\"ff3 ws14\">qu’un</span> nouveau niveau est intégr<span class=\"_ _1\"></span>é <span class=\"ls29 ws1f\">au</span> mote<span class=\"_ _2\"></span>u<span class=\"_ _1\"></span>r <span class=\"ls33 ws27\">on<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> doit déclarer son </span></span></div><div class=\"t m0 x6 he y4d3 ff2 fs2 fc0 sc0 ls2 ws2\">in<span class=\"_ _2\"></span>dex. </div><div class=\"t m2 xa hc y924 ff4 fs2 fc4 sc0 ls2 ws14\">3.3</div><div class=\"t m3 x1c hd y924 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y924 ff4 fs2 fc4 sc0 ls2 ws14\">get<span class=\"_ _2\"></span>Leve<span class=\"_ _2\"></span>lMap<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y45d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y925 ff4 fs2 fcd sc0 ls2 ws2\">inline <span class=\"_ _2\"></span><span class=\"ff2 fc8\">short const<span class=\"fc0\">* getLevelMap(<span class=\"_ _1\"></span></span>int <span class=\"_ _4\"></span><span class=\"fc0\">CURRENT<span class=\"_ _2\"></span>_LEV<span class=\"_ _2\"></span>EL) </span></span></div><div class=\"t m0 x1 he y4d7 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y926 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y927 ff4 fs2 fca sc0 ls2 ws2\">Retourne <span class=\"ff2 fc0 ls27 ws1d\">le<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> tableau <span class=\"ls1e ws16\">du</span> n<span class=\"_ _2\"></span>iv<span class=\"_ _1\"></span>eau renseigné <span class=\"_ _2\"></span>da<span class=\"_ _1\"></span>ns <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>paramèt<span class=\"_ _2\"></span>re. </span></span></div><div class=\"t m0 x1 he y4da ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y928 ff2 fs2 fc0 sc0 ls2 ws2\">A chaque <span class=\"_ _4\"></span>f<span class=\"_ _1\"></span>ois <span class=\"ff3 ws14\">qu’un</span> nouveau niveau e<span class=\"_ _2\"></span>st<span class=\"_ _1\"></span> intégré, <span class=\"ls33 ws27\">on<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> doit rense<span class=\"_ _2\"></span>igner<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’instruct<span class=\"_ _1\"></span>ion<span class=\"ff2 ws2\"> qui renverra <span class=\"lsa4 ws7e\">ce</span> <span class=\"_ _2\"></span>niveau dans <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>foncti<span class=\"_ _2\"></span>on. </span></span></span></span></div><div class=\"t m0 x1 he y929 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y461 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m2 xa h15 y92a ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y92a ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y92a ff9 fs2 fc0 sc0 ls2 ws2\">Intégration dans <span class=\"_ _4\"></span><span class=\"lsa5 ws7f\">la<span class=\"ls2 ws2\"> fonction :<span class=\"_ _2\"></span> </span></span></div><div class=\"t m0 x1 hc y8a0 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y2fd ff2 fs2 fcc sc0 ls73\">//<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>Renvoie<span class=\"_ _1\"></span> <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> tableau <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>niveau<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>qui <span class=\"ls3d ws2d\">se<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> trouv<span class=\"_ _1\"></span>e dans <span class=\"_ _2\"></span>leve<span class=\"_ _2\"></span>l_1.h<span class=\"fc0\"> </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y828 ff4 fs2 fcd sc0 ls2 ws2\">inline <span class=\"_ _2\"></span><span class=\"ff2 fc8\">short const<span class=\"fc0\">* getLevelMap(<span class=\"_ _1\"></span></span>int <span class=\"_ _4\"></span><span class=\"fc0\">CURRENT<span class=\"_ _2\"></span>_LEV<span class=\"_ _2\"></span>EL) </span></span></div><div class=\"t m0 x6 he y2a ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div><div class=\"t m0 x29 hc y92b ff4 fs2 fc5 sc0 ls2 ws2\">switch <span class=\"_ _2\"></span><span class=\"ff2 fc0\">(CU<span class=\"_ _2\"></span>RRENT<span class=\"_ _2\"></span>_LEVE<span class=\"_ _2\"></span>L) </span></div><div class=\"t m0 x29 he y92c ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div><div class=\"t m0 xa hc y92d ff4 fs2 fc5 sc0 ls2 ws2\">case <span class=\"_ _2\"></span><span class=\"ff2 fc0\">LEVEL_1 <span class=\"lsa6\">: </span><span class=\"ff4 fc5\">return <span class=\"_ _2\"></span><span class=\"ff2 fc0\">LEVE<span class=\"_ _1\"></span>L_1_MAP;<span class=\"_ _1\"></span> <span class=\"ff4 fc5 ws14\">br<span class=\"_ _2\"></span>eak<span class=\"ff2 fc0 ls8f ws2\">; <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"ff4\">LEVEL_1_MAP<span class=\"_ _1\"></span> </span>est <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>nom <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>tableau<span class=\"_ _1\"></span> q<span class=\"_ _2\"></span>ui <span class=\"ls3d ws2d\">se<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> trouve <span class=\"_ _2\"></span>dans <span class=\"ff4 ws14\">lev<span class=\"_ _2\"></span>el_1.<span class=\"_ _2\"></span>h<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x29 he y759 ff2 fs2 fcc sc0 ls73 ws70\">//<span class=\"ls2 ws2\"> <span class=\"lsa7 ws80\">...</span><span class=\"fc0\"> </span></span></div><div class=\"t m2 xa h15 y92e ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y92e ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y92e ff9 fs2 fc0 sc0 ls2 ws2\">Utilisation <span class=\"_ _4\"></span>dans<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"ls47 ws37\">un<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span><span class=\"ffb ls2d\">𝑓<span class=\"ff9 ls2\">ic<span class=\"_ _1\"></span>hier <span class=\"_ _2\"></span>source <span class=\"_ _4\"></span>extern<span class=\"_ _1\"></span>e <span class=\"_ _4\"></span>:<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"ff4 lsa0\">(<span class=\"ff9 ls2\">Ceci <span class=\"_ _4\"></span>es<span class=\"_ _1\"></span>t <span class=\"_ _4\"></span><span class=\"ls47 ws37\">un<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>exemple <span class=\"_ _4\"></span>s<span class=\"_ _1\"></span>imple <span class=\"_ _4\"></span>j<span class=\"_ _1\"></span>uste <span class=\"_ _4\"></span>pou<span class=\"_ _1\"></span>r <span class=\"_ _2\"></span>vous <span class=\"_ _2\"></span>expliquer <span class=\"_ _4\"></span>l<span class=\"_ _1\"></span>e </span></span></span></span></span></span></span></span></div><div class=\"t m0 xc hc y90 ff9 fs2 fc0 sc0 ls2 ws2\">principe. Pour aller plu<span class=\"_ _1\"></span>s loin, v<span class=\"_ _1\"></span>euillez-v<span class=\"_ _1\"></span>ous référer à la<span class=\"_ _1\"></span> Démo du moteur<span class=\"_ _1\"></span><span class=\"ff4\">) </span></div><div class=\"t m0 x6 hc y78d ff2 fs2 fc8 sc0 ls2 ws2\">short <span class=\"fc0\">*<span class=\"_ _2\"></span>curr<span class=\"_ _1\"></span>entLevelArray = <span class=\"_ _2\"></span>getLev<span class=\"_ _1\"></span>elMap(<span class=\"ff4 fcb ws14\">LEVEL<span class=\"_ _1\"></span>_1</span><span class=\"ls3c ws39\">);</span> <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"_ _4\"></span>Retou<span class=\"_ _1\"></span>rne <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>ta<span class=\"_ _1\"></span>bleau qui <span class=\"ls28 ws1e\">se</span> <span class=\"_ _4\"></span>t<span class=\"_ _1\"></span>rouve dans <span class=\"_ _2\"></span><span class=\"ff4 ws14\">leve<span class=\"_ _2\"></span>l_1.h<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></div><div class=\"t m0 x1 hc y92 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y92f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 hc y930 ff9 fs2 fc3 sc0 ls2 ws2\">Langage <span class=\"ls55 ws42\">du</span> <span class=\"_ _4\"></span>je<span class=\"_ _2\"></span>u<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc yf9 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y7d8 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y7d8 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7d8 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>lang<span class=\"_ _2\"></span>ues<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y7d9 ff2 fs2 fc0 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>langu<span class=\"_ _1\"></span>es <span class=\"_ _2\"></span>sont représentées dans is::Engine<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>par des tableaux <span class=\"ls1f ws17\">de<span class=\"_ _4\"></span><span class=\"ls2 ws2\"> cha<span class=\"_ _2\"></span>ine. </span></span></div><div class=\"t m0 x6 hc y56e ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">app_<span class=\"_ _2\"></span>src/<span class=\"ff4\">lan<span class=\"_ _2\"></span>guage<span class=\"_ _2\"></span><span class=\"ff9 lsa1\">/<span class=\"ff4 ls2\">Game<span class=\"_ _2\"></span>Lang<span class=\"_ _2\"></span>uage<span class=\"ff9 ls4e ws3b\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></span></span></div><div class=\"t m0 x1 hc y931 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y562 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y562 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y562 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts pour gérer <span class=\"_ _2\"></span>les la<span class=\"_ _2\"></span>ngue<span class=\"_ _2\"></span>s<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y932 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y932 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y932 ff4 fs2 fc4 sc0 ls2 ws2\">nam<span class=\"_ _2\"></span>espa<span class=\"_ _2\"></span>ce <span class=\"_ _1\"></span>La<span class=\"_ _2\"></span>ng<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y30b ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y3d ff4 fs2 fc5 sc0 ls2 ws2\">nam<span class=\"_ _2\"></span>espa<span class=\"_ _2\"></span>ce <span class=\"_ _1\"></span><span class=\"ff2 fc0\">lang<span class=\"_ _2\"></span>; </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf6f\" class=\"pf w0 h0\" data-page-no=\"6f\"><div class=\"pc pc6f w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,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AwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoKufgFkAAAHYSURBVPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAdJV/D+d1fbjvs+yxuYxPz2m5mzXV4va6rj73+XZZHUeTsm5brwYAANAXbwS1lnIdYIg+AAAAAElFTkSuQmCC\"/><div class=\"c x3f y101 w22 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls2 ws2\">11<span class=\"_ _4\"></span>2 </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h10 y8ff ff2 fs6 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y1be ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y1bf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y2bc ff2 fs2 fc0 sc0 ls2 ws2\">Sert <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> gérer <span class=\"_ _2\"></span>les langues <span class=\"ls1e ws16\">du</span> je<span class=\"_ _4\"></span>u. </div><div class=\"t m2 xa hc y778 ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y778 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y778 ff4 fs2 fc4 sc0 ls2 ws2\">enum <span class=\"_ _4\"></span>GameLa<span class=\"_ _1\"></span>nguage </div><div class=\"t m0 x6 hc y1c3 ff4 fs2 fcd sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">GameLangua<span class=\"_ _1\"></span>ge </span></div><div class=\"t m0 x6 he y779 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div><div class=\"t m0 x29 he y144 ff2 fs2 fc0 sc0 ls2 ws2\">ENGLISH, <span class=\"_\"> </span><span class=\"fcc\">///&lt; Représente l<span class=\"_ _1\"></span>a langue Anglaise </span></div><div class=\"t m0 x29 he y933 ff2 fs2 fc0 sc0 ls2 ws2\">FRANCAIS,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"fcc ls73 ws70\">///&lt;<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>Représente <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>langue <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>fra<span class=\"_ _1\"></span>nçaise<span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x29 he y934 ff2 fs2 fcc sc0 ls73 ws70\">/*<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">…<span class=\"_ _2\"></span><span class=\"ff2 ws2\"> <span class=\"lsa2 ws7c\">*/<span class=\"_ _1\"></span></span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x6 he y935 ff2 fs2 fc0 sc0 ls2 ws2\">}<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 hc y936 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y937 ff2 fs2 fc0 sc0 ls2 ws2\">Cette énumération permet <span class=\"_ _4\"></span><span class=\"ff3 ws14\">d’<span class=\"_ _1\"></span>implémenter<span class=\"ff2 ws2\"> </span>l’index<span class=\"ff2 ws2\"> <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>chaq<span class=\"_ _1\"></span>ue langue<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>afin <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>pourvoir les utilisées <span class=\"_ _2\"></span>plus<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>facilement lors <span class=\"ls9e ws7a\">du</span> </span></span></span></span></div><div class=\"t m0 x6 he y938 ff2 fs2 fc0 sc0 ls2 ws2\">dé<span class=\"_ _2\"></span>velop<span class=\"_ _2\"></span>pement<span class=\"_ _2\"></span>. </div><div class=\"t m0 x1 he y939 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y93a ff9 fs2 fc0 sc0 ls2 ws2\">Exe<span class=\"_ _2\"></span>mple: </div><div class=\"t m2 xa h15 y785 ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y785 ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y785 ff9 fs2 fc0 sc0 ls2 ws2\">Créer <span class=\"_ _2\"></span><span class=\"ls47 ws37\">une<span class=\"ls2 ws2\"> ph<span class=\"_ _2\"></span>rase<span class=\"_ _2\"></span>: </span></span></div><div class=\"t m0 x1 hc y6ce ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc ybc ff4 fs2 fc5 sc0 ls2 ws2\">static std::string <span class=\"ff2 fc0\">hello_wo<span class=\"_ _1\"></span>rld[] = <span class=\"_ _2\"></span>{ <span class=\"ff4 fc7\">&quot;Hello World !&quot;, <span class=\"_ _2\"></span>&quot;Salut <span class=\"ls9d ws79\">le</span> <span class=\"_ _2\"></span>monde<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"lsa8 ws81\">!&quot;<span class=\"ls2 ws2\"> <span class=\"ff2 fc0 lsa9 ws82\">};<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"_ _4\"></span>A<span class=\"_ _1\"></span> mettre dans <span class=\"ff4 ws14\">Game<span class=\"_ _2\"></span>Langu<span class=\"_ _2\"></span>age.h<span class=\"fc0 ws2\"> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hc y6cf ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y93b ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y93b ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y93b ff9 fs2 fc0 sc0 ls2 ws2\">Utilisation : <span class=\"ff4 lsa0\">(</span>Ceci <span class=\"_ _2\"></span>est un exemple simple juste p<span class=\"_ _2\"></span>our<span class=\"_ _1\"></span> vous e<span class=\"_ _2\"></span>xpliqu<span class=\"_ _1\"></span>er <span class=\"ls2f ws22\">le</span> <span class=\"_ _2\"></span>principe.<span class=\"_ _1\"></span> Pour <span class=\"_ _2\"></span>aller plus loin, </div><div class=\"t m0 xc hc y55 ff9 fs2 fc0 sc0 ls2 ws2\">veuillez-vous référ<span class=\"_ _1\"></span>er à la Démo du mot<span class=\"_ _1\"></span>eur<span class=\"ff4\">)<span class=\"_ _1\"></span> </span></div><div class=\"t m0 x6 hc y93c ff2 fs2 fc0 sc0 ls2 ws2\">gameSystemExt.m_gam<span class=\"_ _1\"></span>eLangua<span class=\"_ _1\"></span>ge = <span class=\"ff4 fc5 ws14\">is::lan<span class=\"_ _1\"></span>g::</span><span class=\"ws14\">GameLangua<span class=\"_ _1\"></span>ge::<span class=\"ff4\">ENGLISH</span></span><span class=\"ls8f\">; </span><span class=\"fcc\">// Ch<span class=\"_ _1\"></span>oix de <span class=\"_ _1\"></span>la langue Anglaise </span></div><div class=\"t m0 x6 hc y11f ff4 fs2 fc5 sc0 ls2 ws14\">is::<span class=\"ff2 fc0\">showLog(</span>is::lan<span class=\"_ _1\"></span>g::<span class=\"ff2 fc0 ws2\">hello_world[gam<span class=\"_ _1\"></span>eSystemExt.m_ga<span class=\"_ _1\"></span>meLanguage]);<span class=\"_ _1\"></span> <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"ls92 ws73\">On</span> <span class=\"_ _2\"></span>aura dans <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>consol<span class=\"_ _1\"></span>e <span class=\"_ _2\"></span>:<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ff4\">Hello<span class=\"_ _1\"></span> World <span class=\"_ _2\"></span><span class=\"lsa8\">! </span></span></span></span></span></div><div class=\"t m0 x6 hc y93d ff2 fs2 fc0 sc0 ls2 ws2\">gameSystemExt.m_ga<span class=\"_ _1\"></span>meLangua<span class=\"_ _1\"></span>ge = <span class=\"ff4 fc5 ws14\">is::lan<span class=\"_ _1\"></span>g::</span><span class=\"ws14\">GameLangua<span class=\"_ _1\"></span>ge::<span class=\"ff4\">FRANCAIS<span class=\"_ _1\"></span></span></span><span class=\"ls8f\">; </span><span class=\"fcc\">// Choix de la la<span class=\"_ _1\"></span>ngue Française<span class=\"_ _1\"></span></span> </div><div class=\"t m0 x6 hc y53b ff4 fs2 fc5 sc0 ls2 ws14\">is::<span class=\"ff2 fc0\">showLog(</span>is::lan<span class=\"_ _1\"></span>g::<span class=\"ff2 fc0 ws2\">hello_world[gam<span class=\"_ _1\"></span>eSystemExt.m_ga<span class=\"_ _1\"></span>meLanguage]);<span class=\"_ _1\"></span> <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"_ _2\"></span><span class=\"ls96 ws74\">On<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>aura<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>da<span class=\"_ _1\"></span>ns <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>console <span class=\"_ _2\"></span>:<span class=\"_ _1\"></span> <span class=\"ff4\">Salut <span class=\"_ _4\"></span><span class=\"ls9d ws79\">le<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>monde <span class=\"lsaa ws83\">!&quot;</span><span class=\"fc0\"> </span></span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x1 hc y2ce ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y93e ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x1 hc y93f ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x9 h6 y940 ff9 fs3 fc3 sc0 ls2 ws2\">Boite <span class=\"lsab ws84\">de</span> Dialogue <span class=\"_ _2\"></span><span class=\"lsab ws84\">du<span class=\"ls2 ws2\"> j<span class=\"_ _2\"></span>eu<span class=\"_ _2\"></span><span class=\"fc0\"> </span></span></span></div><div class=\"t m0 x1 h6 y2dd ff9 fs3 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y248 ff4 fs2 fc4 sc0 ls1c\">1.</div><div class=\"t m3 xb hd y248 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y248 ff4 fs2 fc4 sc0 ls2 ws2\">class <span class=\"_ _2\"></span>GameDi<span class=\"_ _2\"></span>alog<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y57d ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x48 hc y80 ff4 fs2 fc5 sc0 ls2 ws2\">class <span class=\"_ _2\"></span><span class=\"ff2 fc0\">GameDi<span class=\"_ _2\"></span>alog<span class=\"_ _2\"></span>; </span></div><div class=\"t m0 x1 he y57e ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y406 ffc fs2 fc0 sc0 ls2 ws2\">Entête : <span class=\"_ _2\"></span><span class=\"ff9 fc5 ws14\">app_<span class=\"_ _2\"></span>src/<span class=\"ff4\">ob<span class=\"_ _2\"></span>jects<span class=\"_ _2\"></span>/widge<span class=\"_ _2\"></span>ts/Ga<span class=\"_ _2\"></span>meDia<span class=\"_ _2\"></span>log<span class=\"ff9 ls4e ws3b\">.h<span class=\"fc0 ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x6 hc y24e ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y409 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y40a ff2 fs2 fc0 sc0 ls2 ws2\">Classe qui permet <span class=\"_ _2\"></span><span class=\"ff3 ws14\">d’a<span class=\"_ _1\"></span>fficher<span class=\"ff2 ws2\"> des boites <span class=\"ls1e ws16\">de</span> dialogue <span class=\"_ _2\"></span>comm<span class=\"_ _1\"></span>e dans les <span class=\"_ _2\"></span>jeux<span class=\"_ _1\"></span> RPG. Elle est étroitement liée à <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>partie langue<span class=\"_ _1\"></span> </span></span></div><div class=\"t m0 x6 hc y136 ff2 fs2 fc0 sc0 ls2 ws2\">du jeu <span class=\"ff9\">(cliquer ici<span class=\"_ _1\"></span> <span class=\"fc7 ls25\">1 </span><span class=\"ffb\">pour plus<span class=\"_ _1\"></span> d’info). </span></span>Pour pouv<span class=\"_ _1\"></span>oir affic<span class=\"_ _1\"></span>her une dialogue vous dev<span class=\"_ _1\"></span>ez définir un tabl<span class=\"_ _1\"></span>eau de chaine </div><div class=\"t m0 x6 hc y137 ff2 fs2 fc0 sc0 ls2 ws2\">représentant ce dialogue <span class=\"_ _1\"></span>dans <span class=\"ff4 ws14\">Gam<span class=\"_ _1\"></span>eLanguage.h<span class=\"_ _1\"></span></span>. </div><div class=\"t m2 xa hc y7a7 ff4 fs2 fc4 sc0 ls1c\">2.</div><div class=\"t m3 xb hd y7a7 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7a7 ff4 fs2 fc4 sc0 ls2 ws2\">Les <span class=\"_ _2\"></span>élémen<span class=\"_ _1\"></span>ts de <span class=\"_ _2\"></span>GameDia<span class=\"_ _2\"></span>log<span class=\"fc0\"> </span></div><div class=\"t m2 xa hc y844 ff4 fs2 fc4 sc0 ls2 ws14\">2.1</div><div class=\"t m3 x1c hd y844 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y844 ff4 fs2 fc4 sc0 ls2 ws14\">Game<span class=\"_ _2\"></span>Dial<span class=\"_ _2\"></span>og<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y941 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y942 ff2 fs2 fc0 sc0 ls2 ws2\">GameDialog(sf::Texture<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>&amp;tex, <span class=\"_ _2\"></span>sf::Font<span class=\"_ _1\"></span> &amp;fnt, <span class=\"_ _4\"></span><span class=\"ff4 fc5 ws14\">is::<span class=\"ff2 fc0 ws2\">Ga<span class=\"_ _1\"></span>meDispla<span class=\"_ _1\"></span>y <span class=\"_ _2\"></span>*sc<span class=\"_ _2\"></span>ene) </span></span></div><div class=\"t m0 x6 hc y847 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf70\" class=\"pf w0 h0\" data-page-no=\"70\"><div class=\"pc pc70 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzbsY3CQBCG0TMy0oYIUQUhCRkxIXKC6INSSOiAkA4oyiJABHMBLRzimHmvg/1XDj5Z20XEDwAAAElNTAAAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6jMBAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAKK6veexxHN09AABUM51OW2vVTu1fHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoP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AKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAACA/6kvfv79fl98gfP5PJvNfAkAAKD6chqGofgCrTWfAQAAJNZFhBUAAACy8q4PAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAADg3XoTpHQ8Hu/3ux2Al8PhsNls7AAAqo88lsvl4/GwA/Ayn8+NAABldRFhBQAAgKy86wMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcA/LZrtzgIwwAARsey3gEHBLWgkQgUHkWCmcBzBBQXINh5Em6AgjtwEDLXmWHgDGT0PdXK/pgvLQCoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAgN8q0lx2jNHZAwBAavI8DyGoviS0bevGAwBAakIICVafH54AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAgL4bdF1nFwAAAP6Vtz4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9ALVjvnkAAAEtSURBVAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAABAOorv4LSq97ddlt3X59HxMSm302c1v74uy898tllUh+G4rJvGrgEAAPTFG15GXKkzz6HbAAAAAElFTkSuQmCC\"/><div class=\"c x3f y101 w22 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls2 ws2\">11<span class=\"_ _4\"></span>3 </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h10 y8ff ff2 fs6 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y165 ff2 fs2 fc0 sc0 ls2 ws2\">Constructeur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> clas<span class=\"_ _1\"></span>se, e<span class=\"_ _2\"></span>ll<span class=\"_ _1\"></span>e prend <span class=\"ls24 ws1c\">en</span> paramètre <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>texture,<span class=\"_ _1\"></span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> police <span class=\"ls24 ws1c\">et</span> </span>la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>scène dans laquelle elle <span class=\"_ _2\"></span>est ut<span class=\"_ _2\"></span>ilisée<span class=\"_ _2\"></span>. </span></span></span></span></div><div class=\"t m0 x1 he y1bf ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y2bc ff4 fs2 fc4 sc0 ls2 ws14\">2.2</div><div class=\"t m3 x1c hd y2bc ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2bc ff4 fs2 fc4 sc0 ls2 ws2\">en<span class=\"_ _2\"></span>um <span class=\"_ _4\"></span>DialogI<span class=\"_ _2\"></span>nde<span class=\"_ _2\"></span>x </div><div class=\"t m0 x6 hc y1c1 ff4 fs2 fcd sc0 ls2 ws2\">enum <span class=\"ff2 fc0\">DialogInde<span class=\"_ _1\"></span>x </span></div><div class=\"t m0 x6 he y943 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div><div class=\"t m0 x29 hc y944 ff2 fs2 fc0 sc0 ls2 ws2\">DIALOG_NONE<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>= <span class=\"ff4 fcb ls79\">-</span><span class=\"fcb ws14\">1<span class=\"_ _4\"></span><span class=\"fc0 ws2\">, </span></span></div><div class=\"t m0 x29 he y945 ff2 fs2 fc0 sc0 ls2 ws2\">DIALOG_PLAYER_MOVE, <span class=\"_ _1\"></span><span class=\"fcc ls73 ws70\">//</span><span class=\"fcc\"> Représente <span class=\"ls1d ws15\">le</span> <span class=\"_ _4\"></span>dialogue<span class=\"_ _1\"></span> qui <span class=\"_ _2\"></span>parle <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> comment <span class=\"_ _2\"></span>dépla<span class=\"_ _1\"></span>cer <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> j<span class=\"_ _2\"></span>oue<span class=\"_ _2\"></span>ur<span class=\"fc0\"> </span></span></span></span></span></span></div><div class=\"t m0 x29 he y946 ff2 fs2 fcc sc0 ls73 ws70\">/*<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">…<span class=\"_ _2\"></span><span class=\"ff2 ws2\"> <span class=\"lsa2 ws7c\">*/<span class=\"_ _1\"></span></span><span class=\"fc0\"> </span></span></span></span></div><div class=\"t m0 x6 he y947 ff2 fs2 fc0 sc0 ls8a ws6e\">};<span class=\"ls2 ws2\"> </span></div><div class=\"t m0 x6 hc y948 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y949 ff2 fs2 fc0 sc0 ls2 ws2\">Représente les <span class=\"_ _2\"></span>diff<span class=\"_ _1\"></span>érents dialogues qui seront affichés dans <span class=\"ls1d ws15\">le</span> <span class=\"_ _2\"></span>jeu.<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>Les informations<span class=\"_ _1\"></span> qui <span class=\"_ _2\"></span>sont définies<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>à <span class=\"ff3\">l’intérieur sont </span></div><div class=\"t m0 x6 he y94a ff2 fs2 fc0 sc0 ls2 ws2\">liées à la partie langu<span class=\"_ _1\"></span>e du jeu.<span class=\"_ _1\"></span> </div><div class=\"t m0 x6 hc y926 ff2 fs2 fc0 sc0 ls2 ws2\">A chaque <span class=\"_ _2\"></span><span class=\"lsa3 ws7d\">fois<span class=\"_ _1\"></span><span class=\"ls2 ws2\"> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">qu’un<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> index <span class=\"_ _2\"></span>est ajouté <span class=\"ls2a ws20\">on</span> doit <span class=\"_ _2\"></span>déclarer<span class=\"_ _1\"></span> son <span class=\"_ _2\"></span>tableau <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>chaine dans <span class=\"_ _1\"></span><span class=\"ff4 ws14\">GameLa<span class=\"_ _2\"></span>nguag<span class=\"_ _2\"></span>e.h<span class=\"ff2 ws2\">. </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y927 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m0 x1 hc y784 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa h15 y94b ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y94b ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y94b ff9 fs2 fc0 sc0 ls2 ws2\">Déclaration <span class=\"_ _2\"></span><span class=\"ls55 ws42\">du<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>dialogue<span class=\"_ _1\"></span> DIALOG_PLAYER_MO<span class=\"_ _1\"></span>VE <span class=\"_ _2\"></span>dans GameLanguage.h :<span class=\"_ _4\"></span> </span></span></div><div class=\"t m0 x1 hc y1a1 ff9 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y94c ff4 fs2 fcd sc0 ls2 ws2\">static std::wstring <span class=\"ff2 fc0\">dialog_player_move[]<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>= {<span class=\"ff4 fc7\">L&quot;Press <span class=\"_ _2\"></span>LEFT <span class=\"lsac ws85\">or</span> <span class=\"_ _2\"></span>RIGHT <span class=\"ls98 ws76\">to<span class=\"_ _1\"></span></span> <span class=\"_ _2\"></span>move.\\<span class=\"_ _2\"></span><span class=\"ls9a ws78\">n&quot;<span class=\"_ _1\"></span><span class=\"fc0 ls2 ws2\"> </span></span></span></span></div><div class=\"t m0 x1 hc y4dd ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x49 hc y2c7 ff4 fs2 fc7 sc0 ls2 ws2\">&quot;Press A <span class=\"_ _2\"></span><span class=\"lsad ws86\">to<span class=\"ls2 ws2\"> J<span class=\"_ _2\"></span>ump.<span class=\"_ _2\"></span>&quot;<span class=\"ff2 fc0\">, </span></span></span></div><div class=\"t m0 x4a hc y4df ff4 fs2 fc7 sc0 ls2 ws2\">L&quot;Appuie sur <span class=\"_ _2\"></span>G<span class=\"_ _1\"></span>AUCHE <span class=\"lsac ws85\">ou</span> DROITE <span class=\"_ _2\"></span>pou<span class=\"_ _1\"></span>r <span class=\"ls98 ws76\">te</span> <span class=\"_ _4\"></span>d<span class=\"_ _1\"></span>éplacer.\\<span class=\"_ _1\"></span>n&quot; </div><div class=\"t m0 x4a hc y2fe ff4 fs2 fc7 sc0 ls2 ws2\">&quot;Appuie sur A pou<span class=\"_ _1\"></span>r sauter.&quot;<span class=\"_ _1\"></span><span class=\"ff2 fc0 lsa9 ws82\">};<span class=\"ls2 ws2\"> </span></span></div><div class=\"t m2 xa hc y2cb ff4 fs2 fc4 sc0 ls2 ws14\">2.3</div><div class=\"t m3 x1c hd y2cb ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y2cb ff4 fs2 fc4 sc0 ls2 ws2\">lin<span class=\"_ _2\"></span>kArra<span class=\"_ _2\"></span>yToEn<span class=\"_ _2\"></span>um </div><div class=\"t m0 x6 he y94d ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"fc0\">linkArrayToE<span class=\"_ _1\"></span>num() </span></div><div class=\"t m0 x6 hc y79d ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y94e ff2 fs2 fc0 sc0 ls2 ws2\">Relie <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> tableau <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> chaine q<span class=\"_ _2\"></span>ui <span class=\"ls28 ws1e\">se</span> <span class=\"_ _2\"></span>trouve dans <span class=\"ff4\">GameLanguage.h<span class=\"_ _1\"></span> </span><span class=\"ls24 ws1c\">et<span class=\"_ _1\"></span></span> <span class=\"ff3 ws14\">l’in<span class=\"_ _2\"></span>dex<span class=\"_ _1\"></span><span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>dia<span class=\"_ _2\"></span>logue. </span></span></span></span></span></span></div><div class=\"t m0 x6 hc y342 ff9 fs2 fc0 sc0 ls2 ws2\">Exemple <span class=\"_ _2\"></span>:<span class=\"_ _2\"></span> </div><div class=\"t m2 xa h15 y94f ffa fs2 fc0 sc0 ls2\"></div><div class=\"t m4 x1d hd y94f ff5 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y94f ff9 fs2 fc0 sc0 ls2 ws2\">Lier <span class=\"ls47 ws37\">un</span> <span class=\"_ _4\"></span>In<span class=\"_ _1\"></span>dex <span class=\"ls30 ws23\">et</span> son <span class=\"_ _2\"></span>tableau<span class=\"_ _1\"></span> <span class=\"ls55 ws42\">de</span> <span class=\"_ _2\"></span>chaine <span class=\"_ _1\"></span>: <span class=\"ff4 lsa0\">(</span>Ceci <span class=\"_ _2\"></span>est un exemple simple juste pour<span class=\"_ _1\"></span> vous <span class=\"_ _2\"></span>expliquer<span class=\"_ _1\"></span> le<span class=\"_ _2\"></span> princ<span class=\"_ _1\"></span>ipe. </div><div class=\"t m0 xc hc y950 ff9 fs2 fc0 sc0 ls2 ws2\">Pour aller plus loin, veuil<span class=\"_ _1\"></span>lez<span class=\"_ _1\"></span>-vous référer à la <span class=\"_ _1\"></span>Démo du moteur<span class=\"_ _1\"></span><span class=\"ff4\">) </span></div><div class=\"t m0 x6 he y951 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">linkAr<span class=\"_ _2\"></span>rayTo<span class=\"_ _2\"></span>Enum<span class=\"_ _2\"></span>() </span></div><div class=\"t m0 x1 he y952 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y953 ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div><div class=\"t m0 x6 he y7b5 ff2 fs2 fcc sc0 ls73\">//<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">…<span class=\"_ _4\"></span><span class=\"ff2 fc0 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y43b ff4 fs2 fc5 sc0 ls2 ws2\">switch <span class=\"_ _2\"></span><span class=\"ff2 fc0\">(m_d<span class=\"_ _2\"></span>ialo<span class=\"_ _2\"></span>gIndex<span class=\"_ _2\"></span>) </span></div><div class=\"t m0 x1 he y954 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y64f ff2 fs2 fc0 sc0 ls2 ws2\">{<span class=\"_ _4\"></span> </div><div class=\"t m0 x29 hc y43c ff4 fs2 fc5 sc0 ls2 ws2\">case <span class=\"_ _2\"></span><span class=\"ff2 fc0\">DIALOG_PLA<span class=\"_ _1\"></span>YER_MOVE:<span class=\"_ _1\"></span> <span class=\"fcc ls73\">//<span class=\"ls2\"> <span class=\"_ _4\"></span><span class=\"ff3 ws14\">L’inde<span class=\"_ _1\"></span>x<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">du</span> d<span class=\"_ _2\"></span>ialo<span class=\"_ _2\"></span>gue<span class=\"fc0\"> </span></span></span></span></span></span></div><div class=\"t m0 x29 hc y955 ff2 fs2 fc0 sc0 ls2 ws2\">m_msgIndexMax = <span class=\"ff4 fc5 ws14\">is::</span><span class=\"ws14\">arraySize(<span class=\"ff4 fc5\">is::lang::</span></span>d<span class=\"_ _1\"></span>ialog_player_<span class=\"_ _1\"></span>move); <span class=\"fcc ls73\">//<span class=\"ls2\"> Détermine <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>nombre <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> phrase </span></span></span></span></span></span></div><div class=\"t m0 x29 hc y616 ff2 fs2 fc0 sc0 ls2 ws14\">checkMsg(<span class=\"_ _1\"></span><span class=\"ff4 fc5\">is::lang::</span><span class=\"ws2\">dialog_player_mov<span class=\"_ _1\"></span>e); <span class=\"fcc\">// Défi<span class=\"_ _1\"></span>nir le dial<span class=\"_ _1\"></span>ogue grâce à son tableau d<span class=\"_ _1\"></span>e chaine<span class=\"_ _1\"></span></span> </span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n<div id=\"pf71\" class=\"pf w0 h0\" data-page-no=\"71\"><div class=\"pc pc71 w0 h0\"><img class=\"bi x0 y0 w1 h1\" alt=\"\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKcAAAaVCAIAAABhzzulAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42uzZQRHAQAgEwVwqX/wLRcCejkC3A+A1xUnyAAAAMNRrBQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAQ307x+5utwcAgIWqatvIfn0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAACA/zlJbAEAAGAqvz4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVB8Btvw5tGISiMIwiOkRdaapeqisRVfUoEgwC3xGqugDBPt+kG1TBDgxC3gQ1MAThHHWv/d0HAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAIDqAwAAUH0AAACoPgAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABUHwAAAKoPAAAA1QcAAIDqAwAAQPUBAACg+gAAAFQfAAAAqg8AAADVBwAAgOoDAABA9QEAAKD6AAAAUH0AAACqDwAAANUHAACA6gMAAED1AQAAoPoAAABQfQAAAKg+AAAA1QcAAIDqAwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAgOoDAABA9QEAAKD6AAAAUH0AAACoPgAAAFQfAAAAqg8AAED1AQAAoPoAAABQfQAAAKg+AAAAVB8AAACqDwAAQPUBAACg+gAAAFB9AAAAqD4AAABUHwAAAKoPAAAA1QcAAKD6AAAAUH0AAACoPgAAAFQfAO1wSQYAAABfSURBVAAAqg8AAADVBwAAgOoDAABQfQAAAKg+AAAAVB8AAACqDwAAANUHAACA6gMAAED1AQAA7MFhPbpHfP7aLBvK/vQez6G+TM3tO3/uy3+tiuZ1zENMyWoAAABb8QcKmSgA/AjqWwAAAABJRU5ErkJggg==\"/><div class=\"c x3f y101 w22 ha\"><div class=\"t m0 x8 h9 y102 ff6 fs3 fc0 sc0 ls2 ws2\">11<span class=\"_ _4\"></span>4 </div></div><div class=\"c x0 y1 w2 h0\"><div class=\"t m0 x1 h10 y8ff ff2 fs6 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x2f he y956 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m2 xa hc y278 ff4 fs2 fc4 sc0 ls2 ws14\">2.4</div><div class=\"t m3 x1c hd y278 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y278 ff4 fs2 fc4 sc0 ls2 ws14\">st<span class=\"_ _2\"></span>e<span class=\"_ _2\"></span>p<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y141 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y142 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0 ws14\">st<span class=\"_ _1\"></span>ep(<span class=\"fc8 ws2\">const float <span class=\"_ _2\"></span><span class=\"fc0\">&amp;DELTA<span class=\"_ _2\"></span>_TI<span class=\"_ _2\"></span>ME) </span></span></span></div><div class=\"t m0 x6 hc y7fe ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y144 ff2 fs2 fc0 sc0 ls2 ws2\">Met <span class=\"_ _2\"></span>à<span class=\"_ _1\"></span> jour <span class=\"_ _2\"></span>les informations <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> boite <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>dia<span class=\"_ _2\"></span>logue<span class=\"_ _2\"></span>. </span></span></div><div class=\"t m2 xa hc y957 ff4 fs2 fc4 sc0 ls2 ws14\">2.5</div><div class=\"t m3 x1c hd y957 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y957 ff4 fs2 fc4 sc0 ls2 ws14\">se<span class=\"_ _2\"></span>tDia<span class=\"_ _2\"></span>log<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y58a ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y147 ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0\">setDia<span class=\"_ _1\"></span>log(DialogInd<span class=\"_ _1\"></span>ex <span class=\"_ _2\"></span>dialo<span class=\"_ _2\"></span>gInde<span class=\"_ _2\"></span>x) </span></div><div class=\"t m0 x6 hc y958 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y959 ff2 fs2 fc0 sc0 ls2 ws2\">Définie <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>dia<span class=\"_ _1\"></span>logue qui sera lan<span class=\"_ _2\"></span>cé. </span></span></div><div class=\"t m2 xa hc y95a ff4 fs2 fc4 sc0 ls2 ws14\">2.6</div><div class=\"t m3 x1c hd y95a ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y95a ff4 fs2 fc4 sc0 ls2 ws2\">se<span class=\"_ _2\"></span>tMous<span class=\"_ _2\"></span>eInCo<span class=\"_ _2\"></span>lliso<span class=\"_ _2\"></span>n </div><div class=\"t m0 x6 he y95b ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _4\"></span><span class=\"fc0 ws14\">setMouseI<span class=\"_ _1\"></span>nCollison(<span class=\"fc8 ws2\">bo<span class=\"_ _1\"></span>ol <span class=\"_ _4\"></span><span class=\"fc0\">va<span class=\"_ _1\"></span>l) </span></span></span></div><div class=\"t m0 x6 hc y95c ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y95d ff2 fs2 fc0 sc0 ls2 ws2\">Force <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> collision <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>curs<span class=\"_ _1\"></span>eur <span class=\"ls1e ws16\">de</span> <span class=\"ls1d ws15\">la</span> <span class=\"_ _4\"></span>souris<span class=\"_ _1\"></span> <span class=\"ls2a ws20\">ou</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">le<span class=\"ls2 ws2\"> doigt <span class=\"_ _2\"></span><span class=\"ls1e ws16\">de<span class=\"ls1a ws2\"> <span class=\"ff3 ls2 ws14\">l’u<span class=\"_ _1\"></span>tilisateur<span class=\"_ _1\"></span></span><span class=\"ls2\"> (sur Mobile) avec <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">la<span class=\"ls2 ws2\"> <span class=\"_ _2\"></span>boite <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span>dia<span class=\"_ _2\"></span>logue. </span></span></span></span></span></span></span></span></span></div><div class=\"t m2 xa hc y95e ff4 fs2 fc4 sc0 ls2 ws14\">2.7</div><div class=\"t m3 x1c hd y95e ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y95e ff4 fs2 fc4 sc0 ls2 ws14\">dr<span class=\"_ _2\"></span>aw<span class=\"_ _2\"></span><span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y585 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y11d ff2 fs2 fc8 sc0 ls2 ws2\">void <span class=\"_ _2\"></span><span class=\"fc0\">draw(is::Rende<span class=\"_ _1\"></span>r <span class=\"_ _2\"></span>&amp;surf<span class=\"_ _2\"></span>ace) </span></div><div class=\"t m0 x6 hc y3d0 ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 he y83d ff2 fs2 fc0 sc0 ls2 ws2\">Affiche <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>boite <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span>dialo<span class=\"_ _2\"></span>gue. </div><div class=\"t m2 xa hc y92b ff4 fs2 fc4 sc0 ls2 ws14\">2.8</div><div class=\"t m3 x1c hd y92b ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y92b ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Dialo<span class=\"_ _2\"></span>gInde<span class=\"_ _2\"></span>x </div><div class=\"t m0 x6 he y95f ff2 fs2 fc0 sc0 ls2 ws2\">DialogIndex <span class=\"_ _4\"></span>g<span class=\"_ _1\"></span>etDialogIndex(<span class=\"_ _1\"></span>) <span class=\"_ _4\"></span><span class=\"fc8\">const </span></div><div class=\"t m0 x6 hc y35a ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y960 ff4 fs2 fc10 sc0 ls2 ws2\">Retourne <span class=\"ff3 fc0 ws14\">l’enumérateur<span class=\"ff2 ws2\"> <span class=\"ls1e ws16\">du</span> <span class=\"_ _2\"></span>dialogue<span class=\"_ _1\"></span> <span class=\"_ _2\"></span>qui est <span class=\"_ _2\"></span>affi<span class=\"_ _2\"></span>ché. </span></span></div><div class=\"t m2 xa hc y7f5 ff4 fs2 fc4 sc0 ls2 ws14\">2.9</div><div class=\"t m3 x1c hd y7f5 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 xc hc y7f5 ff4 fs2 fc4 sc0 ls2 ws2\">get<span class=\"_ _2\"></span>Mouse<span class=\"_ _2\"></span>InCo<span class=\"_ _2\"></span>lliso<span class=\"_ _2\"></span>n </div><div class=\"t m0 x6 he y6e0 ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _4\"></span><span class=\"fc0\">getMous<span class=\"_ _1\"></span>eInCollison()<span class=\"_ _1\"></span> <span class=\"_ _4\"></span><span class=\"fc8\">const </span></span></div><div class=\"t m0 x6 hc y3db ff4 fs2 fc9 sc0 ls2 ws2\">Code Source<span class=\"fc0\"> </span></div><div class=\"t m0 x6 hc y961 ff4 fs2 fc10 sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2\">quand <span class=\"ls1d ws15\">le<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> curseur <span class=\"ls1e ws16\">de</span> <span class=\"_ _2\"></span><span class=\"ls1d ws15\">la<span class=\"ls2 ws2\"> souris <span class=\"ls2a ws20\">ou</span> <span class=\"_ _2\"></span><span class=\"ls27 ws1d\">le<span class=\"ls2 ws2\"> <span class=\"_ _4\"></span>do<span class=\"_ _1\"></span>igt <span class=\"ls1f ws17\">de</span> <span class=\"_ _2\"></span><span class=\"ff3 ws14\">l’u<span class=\"_ _1\"></span>tilisateur<span class=\"ff2 ws2\"> (sur <span class=\"_ _2\"></span>Mobile)<span class=\"_ _1\"></span> touche <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>boite <span class=\"ls1f ws17\">de</span> <span class=\"_ _4\"></span>dialogu<span class=\"_ _1\"></span>e, <span class=\"ff4\">fau<span class=\"_ _1\"></span>x </span><span class=\"lsae ws87\">si</span> </span></span></span></span></span></span></span></span></span></span></div><div class=\"t m0 x6 he y841 ff2 fs2 fc0 sc0 ls2 ws2\">n<span class=\"_ _2\"></span>on.<span class=\"_ _2\"></span> </div><div class=\"t m2 xa hc y452 ff4 fs2 fc4 sc0 ls2 ws14\">2.10</div><div class=\"t m3 x20 hd y452 ff8 fs2 fc4 sc0 ls2 ws2\"> </div><div class=\"t m0 x1f hc y452 ff4 fs2 fc4 sc0 ls2 ws14\">show<span class=\"_ _2\"></span>Dial<span class=\"_ _2\"></span>og<span class=\"fc0 ws2\"> </span></div><div class=\"t m0 x1 hc y554 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 he y6bb ff2 fs2 fc8 sc0 ls2 ws2\">bool <span class=\"_ _4\"></span><span class=\"fc0\">sho<span class=\"_ _1\"></span>wDialog() <span class=\"fc8 ws14\">con<span class=\"_ _4\"></span>st<span class=\"fc0 ws2\"> </span></span></span></div><div class=\"t m0 x6 hc y77a ff4 fs2 fc9 sc0 ls2 ws2\">Code <span class=\"_ _2\"></span>Source<span class=\"fc0\"> </span></div><div class=\"t m0 x1 hc y68 ff4 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x6 hc y962 ff4 fs2 fc10 sc0 ls2 ws2\">Retourne <span class=\"fc0\">vrai <span class=\"ff2\">quand <span class=\"ls1d ws15\">la</span> <span class=\"_ _2\"></span>boite <span class=\"ls1f ws17\">de<span class=\"_ _2\"></span><span class=\"ls2 ws2\"> dialogue est <span class=\"_ _2\"></span>ouverte <span class=\"ls24 ws1c\">et</span> <span class=\"ff4\">f<span class=\"_ _1\"></span>aux </span><span class=\"ls28 ws1e\">si</span> <span class=\"_ _2\"></span>no<span class=\"_ _2\"></span>n<span class=\"_ _2\"></span>. </span></span></span></span></div></div><div class=\"c x23 y963 w4 h49\"><div class=\"t m0 x4b hc y964 ff4 fs2 fc5 sc0 ls2 ws14\">break<span class=\"_ _4\"></span><span class=\"ff2 fc0 ws2\">; </span></div><div class=\"t m0 x0 he y965 ff2 fs2 fc0 sc0 ls2 ws2\"> </div><div class=\"t m0 x4b he y6c0 ff2 fs2 fcc sc0 ls41 ws31\">//<span class=\"ls2 ws2\"> <span class=\"ff3 ws14\">…<span class=\"_ _0\"></span><span class=\"ff2 fc0 ws2\"> </span></span></span></div></div></div><div class=\"pi\" data-data='{\"ctm\":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>\n</div>\n<div class=\"loading-indicator\">\n<img alt=\"\" src=\"data:image/png;base64,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\"/>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Sun Jun 30 21:14:40 CEST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.1.1-all.zip\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "libs/SDL2/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\nproject(SDL2)\n\n# Creates and names a library, sets it as either STATIC\n# or SHARED, and provides the relative paths to its source code.\n# You can define multiple libraries, and CMake builds them for you.\n# Gradle automatically packages shared libraries with your APK.\n\nfind_library( # Sets the name of the path variable.\n        GLESv1_CM\n\n        # Specifies the name of the NDK library that\n        # you want CMake to locate.\n        GLESv1_CM )\n\nfind_library(\n        GLESv2\n        GLESv2\n)\n\nfind_library(\n        android\n        android\n)\n\nfind_library(\n        log\n        log\n)\n\ninclude_directories(include)\n\nadd_definitions(-DGL_GLEXT_PROTOTYPES)\n\nadd_library( # Sets the name of the library.\n        SDL2\n\n        # Sets the library as a shared library.\n        SHARED\n\n\n\n        # Provides a relative path to your source file(s).\n        src/render/opengles/SDL_render_gles.c\n        src/render/opengles2/SDL_shaders_gles2.c\n        src/render/opengles2/SDL_render_gles2.c\n        src/render/opengl/SDL_shaders_gl.c\n        src/render/opengl/SDL_render_gl.c\n        src/render/SDL_render.c\n        src/render/software/SDL_blendline.c\n        src/render/software/SDL_drawline.c\n        src/render/software/SDL_blendfillrect.c\n        src/render/software/SDL_blendpoint.c\n        src/render/software/SDL_rotate.c\n        src/render/software/SDL_drawpoint.c\n        src/render/software/SDL_render_sw.c\n        src/render/SDL_yuv_sw.c\n        src/render/SDL_d3dmath.c\n        src/render/psp/SDL_render_psp.c\n        src/render/SDL_yuv_mmx.c\n        src/audio/SDL_mixer.c\n        src/audio/SDL_audiocvt.c\n        src/audio/SDL_wave.c\n        src/audio/dummy/SDL_dummyaudio.c\n        src/audio/SDL_audiodev.c\n        src/audio/android/SDL_androidaudio.c\n        src/audio/paudio/SDL_paudio.c\n        src/audio/SDL_audiotypecvt.c\n        src/audio/SDL_audio.c\n        src/core/android/SDL_android.c\n        src/cpuinfo/SDL_cpuinfo.c\n        src/file/SDL_rwops.c\n        src/timer/unix/SDL_systimer.c\n        src/timer/SDL_timer.c\n        src/test/SDL_test_assert.c\n        src/test/SDL_test_crc32.c\n        src/test/SDL_test_harness.c\n        src/test/SDL_test_md5.c\n        src/test/SDL_test_fuzzer.c\n        src/test/SDL_test_random.c\n        src/test/SDL_test_log.c\n        src/test/SDL_test_imagePrimitives.c\n        src/test/SDL_test_imagePrimitivesBlend.c\n        src/test/SDL_test_compare.c\n        src/test/SDL_test_imageFace.c\n        src/test/SDL_test_imageBlit.c\n        src/test/SDL_test_common.c\n        src/test/SDL_test_font.c\n        src/test/SDL_test_imageBlitBlend.c\n        src/events/SDL_dropevents.c\n        src/events/SDL_mouse.c\n        src/events/SDL_clipboardevents.c\n        src/events/SDL_windowevents.c\n        src/events/SDL_keyboard.c\n        src/events/SDL_gesture.c\n        src/events/SDL_quit.c\n        src/events/SDL_events.c\n        src/events/SDL_touch.c\n        src/thread/SDL_thread.c\n        src/thread/pthread/SDL_syscond.c\n        src/thread/pthread/SDL_systhread.c\n        src/thread/pthread/SDL_sysmutex.c\n        src/thread/pthread/SDL_syssem.c\n        src/thread/pthread/SDL_systls.c\n        src/haptic/SDL_haptic.c\n        src/haptic/dummy/SDL_syshaptic.c\n        src/video/SDL_video.c\n        src/video/SDL_blit_0.c\n        src/video/SDL_bmp.c\n        src/video/SDL_blit_slow.c\n        src/video/SDL_egl.c\n        src/video/SDL_blit_1.c\n        src/video/SDL_blit.c\n        src/video/SDL_RLEaccel.c\n        src/video/SDL_stretch.c\n        src/video/SDL_blit_A.c\n        src/video/SDL_pixels.c\n        src/video/SDL_blit_N.c\n        src/video/SDL_fillrect.c\n        src/video/android/SDL_androidevents.c\n        src/video/android/SDL_androidtouch.c\n        src/video/android/SDL_androidwindow.c\n        src/video/android/SDL_androidmessagebox.c\n        src/video/android/SDL_androidclipboard.c\n        src/video/android/SDL_androidkeyboard.c\n        src/video/android/SDL_androidvideo.c\n        src/video/android/SDL_androidmouse.c\n        src/video/android/SDL_androidgl.c\n        src/video/SDL_blit_copy.c\n        src/video/SDL_clipboard.c\n        src/video/SDL_blit_auto.c\n        src/video/SDL_rect.c\n        src/video/SDL_shape.c\n        src/video/SDL_surface.c\n        src/loadso/dlopen/SDL_sysloadso.c\n        src/dynapi/SDL_dynapi.c\n        src/SDL_error.c\n        src/SDL_assert.c\n        src/stdlib/SDL_stdlib.c\n        src/stdlib/SDL_malloc.c\n        src/stdlib/SDL_string.c\n        src/stdlib/SDL_getenv.c\n        src/stdlib/SDL_iconv.c\n        src/stdlib/SDL_qsort.c\n        src/SDL.c\n        src/power/android/SDL_syspower.c\n        src/power/SDL_power.c\n        src/atomic/SDL_spinlock.c\n        src/atomic/SDL_atomic.c\n        src/joystick/SDL_gamecontroller.c\n        src/joystick/SDL_joystick.c\n        src/joystick/android/SDL_sysjoystick.c\n        src/filesystem/android/SDL_sysfilesystem.c\n        src/SDL_log.c\n        src/SDL_hints.c\n\n        src/libm/s_sin.c\n        src/libm/s_cos.c\n        src/libm/s_copysign.c\n        src/libm/s_fabs.c\n        src/libm/k_rem_pio2.c\n        src/libm/k_sin.c\n        src/libm/s_atan.c\n        src/libm/k_cos.c\n        src/libm/s_scalbn.c\n        src/libm/e_pow.c\n        src/libm/e_atan2.c\n        src/libm/s_tan.c\n        src/libm/e_rem_pio2.c\n        src/libm/e_log.c\n        src/libm/e_sqrt.c\n        src/libm/s_floor.c\n        src/libm/k_tan.c\n\n       )\n\n\n# Searches for a specified prebuilt library and stores the path as a\n# variable. Because CMake includes system libraries in the search path by\n# default, you only need to specify the name of the public NDK library\n# you want to add. CMake verifies that the library exists before\n# completing its build.\n\n\n\n# Specifies libraries CMake should link to your target library. You\n# can link multiple libraries, such as libraries you define in this\n# build script, prebuilt third-party libraries, or system libraries.\n\ntarget_link_libraries( # Specifies the target library.\n        SDL2\n        GLESv1_CM\n        GLESv2\n        android\n        log\n        # Links the target library to the log library\n        # included in the NDK.\n        #${log-lib}\n        )"
  },
  {
    "path": "libs/SDL2/build.gradle",
    "content": "apply plugin: 'com.android.model.native'\n\nmodel {\n    android {\n        compileSdkVersion = gradle.sdkVersion\n        buildToolsVersion = gradle.buildToolsVersion\n\n        defaultConfig {\n            minSdkVersion.apiLevel = gradle.minSdkVersion\n            versionCode = 1\n            versionName = '1.0'\n        }\n        ndk {\n            moduleName = 'SDL2'\n            ldLibs.addAll([\"GLESv1_CM\", \"EGL\", \"GLESv2\", \"log\", \"android\", \"dl\"])\n            CFlags.addAll([\"-DGL_GLEXT_PROTOTYPES\"])\n            CFlags.addAll([\"-I\" + file(\"include/\").absolutePath,\"-DGL_GLEXT_PROTOTYPES\"])\n        }\n\n        sources {\n            main {\n                jni {\n                    source {\n                        srcDir \"src\"\n                        exclude \"audio/alsa/\"\n                        exclude \"audio/arts/\"\n                        exclude \"audio/bsd/\"\n                        exclude \"audio/coreaudio/\"\n                        exclude \"audio/directsound/\"\n                        exclude \"audio/disk/\"\n                        exclude \"audio/dsp/\"\n                        exclude \"audio/emscripten/\"\n                        exclude \"audio/esd/\"\n                        exclude \"audio/fusionsound/\"\n                        exclude \"audio/haiku/\"\n                        exclude \"audio/nacl/\"\n                        exclude \"audio/nas/\"\n                        exclude \"audio/psp/\"\n                        exclude \"audio/pulseaudio/\"\n                        exclude \"audio/qsa/\"\n                        exclude \"audio/sndio/\"\n                        exclude \"audio/sun/\"\n                        exclude \"audio/winmm/\"\n                        exclude \"audio/xaudio2/\"\n                        exclude \"core/linux/\"\n                        exclude \"core/windows/\"\n                        exclude \"core/winrt/\"\n                        exclude \"file/cocoa/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/darwin/\"\n                        exclude \"haptic/linux/\"\n                        exclude \"libm/\"\n                        exclude \"main/dummy/\"\n                        exclude \"main/android/\"\n                        exclude \"main/haiku/\"\n                        exclude \"main/nacl/\"\n                        exclude \"main/psp/\"\n                        exclude \"main/windows/\"\n                        exclude \"main/winrt/\"\n                        exclude \"joystick/bsd/\"\n                        exclude \"joystick/darwin/\"\n                        exclude \"joystick/dummy/\"\n                        exclude \"joystick/emscripten/\"\n                        exclude \"joystick/haiku/\"\n                        exclude \"joystick/iphoneos/\"\n                        exclude \"joystick/linux/\"\n                        exclude \"joystick/psp/\"\n                        exclude \"joystick/windows/\"\n                        exclude \"loadso/dummy/\"\n                        exclude \"loadso/haiku/\"\n                        exclude \"loadso/windows/\"\n                        exclude \"power/emscripten/\"\n                        exclude \"power/haiku/\"\n                        exclude \"power/linux/\"\n                        exclude \"power/macosx/\"\n                        exclude \"power/psp/\"\n                        exclude \"power/uikit/\"\n                        exclude \"power/windows/\"\n                        exclude \"power/winrt/\"\n                        exclude \"filesystem/cocoa/\"\n                        exclude \"filesystem/dummy/\"\n                        exclude \"filesystem/emscripten/\"\n                        exclude \"filesystem/haiku/\"\n                        exclude \"filesystem/nacl/\"\n                        exclude \"filesystem/unix/\"\n                        exclude \"filesystem/windows/\"\n                        exclude \"filesystem/winrt/\"\n                        exclude \"render/direct3d/\"\n                        exclude \"render/direct3d11/\"\n                        exclude \"thread/generic/\"\n                        exclude \"thread/psp/\"\n                        exclude \"thread/stdcpp/\"\n                        exclude \"thread/windows/\"\n                        exclude \"timer/dummy/\"\n                        exclude \"timer/haiku/\"\n                        exclude \"timer/psp/\"\n                        exclude \"timer/windows/\"\n                        exclude \"video/cocoa/\"\n                        exclude \"video/directfb/\"\n                        exclude \"video/dummy/\"\n                        exclude \"video/emscripten/\"\n                        exclude \"video/haiku/\"\n                        exclude \"video/mir/\"\n                        exclude \"video/nacl/\"\n                        exclude \"video/pandora/\"\n                        exclude \"video/psp/\"\n                        exclude \"video/raspberry/\"\n                        exclude \"video/uikit/\"\n                        exclude \"video/vivante/\"\n                        exclude \"video/wayland/\"\n                        exclude \"video/windows/\"\n                        exclude \"video/winrt/\"\n                        exclude \"video/x11/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/windows/\"\n                        exclude \"haptic/windows/\"\n                    }\n                }\n            }\n        }\n\n    }\n}\n\n// This is just copy out the header file and built lib into distribution\n// directory for clint application to use; it is a small overhead of this sample:\n//    both lib and app are put inside one project space [save maintenance time]\ntask(distributeLib, type : Copy) {\n    // trigger build library\n    dependsOn assemble\n    into gradle.libDistributionRoot + '/SDL2/'\n    from('build/outputs/native/release/lib') {\n        into 'lib/'\n    }\n}\n"
  },
  {
    "path": "libs/SDL2/cmake_install.cmake",
    "content": "# Install script for directory: C:/is-Engine/libs/SDL2\n\n# Set the install prefix\nif(NOT DEFINED CMAKE_INSTALL_PREFIX)\n  set(CMAKE_INSTALL_PREFIX \"C:/Program Files (x86)/Project\")\nendif()\nstring(REGEX REPLACE \"/$\" \"\" CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")\n\n# Set the install configuration name.\nif(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)\n  if(BUILD_TYPE)\n    string(REGEX REPLACE \"^[^A-Za-z0-9_]+\" \"\"\n           CMAKE_INSTALL_CONFIG_NAME \"${BUILD_TYPE}\")\n  else()\n    set(CMAKE_INSTALL_CONFIG_NAME \"Release\")\n  endif()\n  message(STATUS \"Install configuration: \\\"${CMAKE_INSTALL_CONFIG_NAME}\\\"\")\nendif()\n\n# Set the component getting installed.\nif(NOT CMAKE_INSTALL_COMPONENT)\n  if(COMPONENT)\n    message(STATUS \"Install component: \\\"${COMPONENT}\\\"\")\n    set(CMAKE_INSTALL_COMPONENT \"${COMPONENT}\")\n  else()\n    set(CMAKE_INSTALL_COMPONENT)\n  endif()\nendif()\n\n# Install shared libraries without execute permission?\nif(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n  set(CMAKE_INSTALL_SO_NO_EXE \"0\")\nendif()\n\n# Is this installation the result of a crosscompile?\nif(NOT DEFINED CMAKE_CROSSCOMPILING)\n  set(CMAKE_CROSSCOMPILING \"TRUE\")\nendif()\n\n"
  },
  {
    "path": "libs/SDL2/include/SDL.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL.h\n *\n *  Main include header for the SDL library\n */\n\n\n#ifndef _SDL_H\n#define _SDL_H\n\n#include \"SDL_main.h\"\n#include \"SDL_stdinc.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_atomic.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_clipboard.h\"\n#include \"SDL_cpuinfo.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_error.h\"\n#include \"SDL_events.h\"\n#include \"SDL_filesystem.h\"\n#include \"SDL_joystick.h\"\n#include \"SDL_gamecontroller.h\"\n#include \"SDL_haptic.h\"\n#include \"SDL_hints.h\"\n#include \"SDL_loadso.h\"\n#include \"SDL_log.h\"\n#include \"SDL_messagebox.h\"\n#include \"SDL_mutex.h\"\n#include \"SDL_power.h\"\n#include \"SDL_render.h\"\n#include \"SDL_rwops.h\"\n#include \"SDL_system.h\"\n#include \"SDL_thread.h\"\n#include \"SDL_timer.h\"\n#include \"SDL_version.h\"\n#include \"SDL_video.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* As of version 0.5, SDL is loaded dynamically into the application */\n\n/**\n *  \\name SDL_INIT_*\n *\n *  These are the flags which may be passed to SDL_Init().  You should\n *  specify the subsystems which you will be using in your application.\n */\n/* @{ */\n#define SDL_INIT_TIMER          0x00000001u\n#define SDL_INIT_AUDIO          0x00000010u\n#define SDL_INIT_VIDEO          0x00000020u  /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */\n#define SDL_INIT_JOYSTICK       0x00000200u  /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */\n#define SDL_INIT_HAPTIC         0x00001000u\n#define SDL_INIT_GAMECONTROLLER 0x00002000u  /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */\n#define SDL_INIT_EVENTS         0x00004000u\n#define SDL_INIT_NOPARACHUTE    0x00100000u  /**< compatibility; this flag is ignored. */\n#define SDL_INIT_EVERYTHING ( \\\n                SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \\\n                SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER \\\n            )\n/* @} */\n\n/**\n *  This function initializes  the subsystems specified by \\c flags\n */\nextern DECLSPEC int SDLCALL SDL_Init(Uint32 flags);\n\n/**\n *  This function initializes specific SDL subsystems\n *\n *  Subsystem initialization is ref-counted, you must call\n *  SDL_QuitSubSystem() for each SDL_InitSubSystem() to correctly\n *  shutdown a subsystem manually (or call SDL_Quit() to force shutdown).\n *  If a subsystem is already loaded then this call will\n *  increase the ref-count and return.\n */\nextern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags);\n\n/**\n *  This function cleans up specific SDL subsystems\n */\nextern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags);\n\n/**\n *  This function returns a mask of the specified subsystems which have\n *  previously been initialized.\n *\n *  If \\c flags is 0, it returns a mask of all initialized subsystems.\n */\nextern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags);\n\n/**\n *  This function cleans up all initialized subsystems. You should\n *  call it upon all exit conditions.\n */\nextern DECLSPEC void SDLCALL SDL_Quit(void);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_H */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_assert.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_assert_h\n#define _SDL_assert_h\n\n#include \"SDL_config.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef SDL_ASSERT_LEVEL\n#ifdef SDL_DEFAULT_ASSERT_LEVEL\n#define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL\n#elif defined(_DEBUG) || defined(DEBUG) || \\\n      (defined(__GNUC__) && !defined(__OPTIMIZE__))\n#define SDL_ASSERT_LEVEL 2\n#else\n#define SDL_ASSERT_LEVEL 1\n#endif\n#endif /* SDL_ASSERT_LEVEL */\n\n/*\nThese are macros and not first class functions so that the debugger breaks\non the assertion line and not in some random guts of SDL, and so each\nassert can have unique static variables associated with it.\n*/\n\n#if defined(_MSC_VER)\n/* Don't include intrin.h here because it contains C++ code */\n    extern void __cdecl __debugbreak(void);\n    #define SDL_TriggerBreakpoint() __debugbreak()\n#elif (!defined(__NACL__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))\n    #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( \"int $3\\n\\t\" )\n#elif defined(HAVE_SIGNAL_H)\n    #include <signal.h>\n    #define SDL_TriggerBreakpoint() raise(SIGTRAP)\n#else\n    /* How do we trigger breakpoints on this platform? */\n    #define SDL_TriggerBreakpoint()\n#endif\n\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */\n#   define SDL_FUNCTION __func__\n#elif ((__GNUC__ >= 2) || defined(_MSC_VER))\n#   define SDL_FUNCTION __FUNCTION__\n#else\n#   define SDL_FUNCTION \"???\"\n#endif\n#define SDL_FILE    __FILE__\n#define SDL_LINE    __LINE__\n\n/*\nsizeof (x) makes the compiler still parse the expression even without\nassertions enabled, so the code is always checked at compile time, but\ndoesn't actually generate code for it, so there are no side effects or\nexpensive checks at run time, just the constant size of what x WOULD be,\nwhich presumably gets optimized out as unused.\nThis also solves the problem of...\n\n    int somevalue = blah();\n    SDL_assert(somevalue == 1);\n\n...which would cause compiles to complain that somevalue is unused if we\ndisable assertions.\n*/\n\n/* \"while (0,0)\" fools Microsoft's compiler's /W4 warning level into thinking\n    this condition isn't constant. And looks like an owl's face! */\n#ifdef _MSC_VER  /* stupid /W4 warnings. */\n#define SDL_NULL_WHILE_LOOP_CONDITION (0,0)\n#else\n#define SDL_NULL_WHILE_LOOP_CONDITION (0)\n#endif\n\n#define SDL_disabled_assert(condition) \\\n    do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION)\n\ntypedef enum\n{\n    SDL_ASSERTION_RETRY,  /**< Retry the assert immediately. */\n    SDL_ASSERTION_BREAK,  /**< Make the debugger trigger a breakpoint. */\n    SDL_ASSERTION_ABORT,  /**< Terminate the program. */\n    SDL_ASSERTION_IGNORE,  /**< Ignore the assert. */\n    SDL_ASSERTION_ALWAYS_IGNORE  /**< Ignore the assert from now on. */\n} SDL_AssertState;\n\ntypedef struct SDL_AssertData\n{\n    int always_ignore;\n    unsigned int trigger_count;\n    const char *condition;\n    const char *filename;\n    int linenum;\n    const char *function;\n    const struct SDL_AssertData *next;\n} SDL_AssertData;\n\n#if (SDL_ASSERT_LEVEL > 0)\n\n/* Never call this directly. Use the SDL_assert* macros. */\nextern DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *,\n                                                             const char *,\n                                                             const char *, int)\n#if defined(__clang__)\n#if __has_feature(attribute_analyzer_noreturn)\n/* this tells Clang's static analysis that we're a custom assert function,\n   and that the analyzer should assume the condition was always true past this\n   SDL_assert test. */\n   __attribute__((analyzer_noreturn))\n#endif\n#endif\n;\n\n/* the do {} while(0) avoids dangling else problems:\n    if (x) SDL_assert(y); else blah();\n       ... without the do/while, the \"else\" could attach to this macro's \"if\".\n   We try to handle just the minimum we need here in a macro...the loop,\n   the static vars, and break points. The heavy lifting is handled in\n   SDL_ReportAssertion(), in SDL_assert.c.\n*/\n#define SDL_enabled_assert(condition) \\\n    do { \\\n        while ( !(condition) ) { \\\n            static struct SDL_AssertData sdl_assert_data = { \\\n                0, 0, #condition, 0, 0, 0, 0 \\\n            }; \\\n            const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \\\n            if (sdl_assert_state == SDL_ASSERTION_RETRY) { \\\n                continue; /* go again. */ \\\n            } else if (sdl_assert_state == SDL_ASSERTION_BREAK) { \\\n                SDL_TriggerBreakpoint(); \\\n            } \\\n            break; /* not retrying. */ \\\n        } \\\n    } while (SDL_NULL_WHILE_LOOP_CONDITION)\n\n#endif  /* enabled assertions support code */\n\n/* Enable various levels of assertions. */\n#if SDL_ASSERT_LEVEL == 0   /* assertions disabled */\n#   define SDL_assert(condition) SDL_disabled_assert(condition)\n#   define SDL_assert_release(condition) SDL_disabled_assert(condition)\n#   define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)\n#elif SDL_ASSERT_LEVEL == 1  /* release settings. */\n#   define SDL_assert(condition) SDL_disabled_assert(condition)\n#   define SDL_assert_release(condition) SDL_enabled_assert(condition)\n#   define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)\n#elif SDL_ASSERT_LEVEL == 2  /* normal settings. */\n#   define SDL_assert(condition) SDL_enabled_assert(condition)\n#   define SDL_assert_release(condition) SDL_enabled_assert(condition)\n#   define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)\n#elif SDL_ASSERT_LEVEL == 3  /* paranoid settings. */\n#   define SDL_assert(condition) SDL_enabled_assert(condition)\n#   define SDL_assert_release(condition) SDL_enabled_assert(condition)\n#   define SDL_assert_paranoid(condition) SDL_enabled_assert(condition)\n#else\n#   error Unknown assertion level.\n#endif\n\n/* this assertion is never disabled at any level. */\n#define SDL_assert_always(condition) SDL_enabled_assert(condition)\n\n\ntypedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)(\n                                 const SDL_AssertData* data, void* userdata);\n\n/**\n *  \\brief Set an application-defined assertion handler.\n *\n *  This allows an app to show its own assertion UI and/or force the\n *  response to an assertion failure. If the app doesn't provide this, SDL\n *  will try to do the right thing, popping up a system-specific GUI dialog,\n *  and probably minimizing any fullscreen windows.\n *\n *  This callback may fire from any thread, but it runs wrapped in a mutex, so\n *  it will only fire from one thread at a time.\n *\n *  Setting the callback to NULL restores SDL's original internal handler.\n *\n *  This callback is NOT reset to SDL's internal handler upon SDL_Quit()!\n *\n *  \\return SDL_AssertState value of how to handle the assertion failure.\n *\n *  \\param handler Callback function, called when an assertion fails.\n *  \\param userdata A pointer passed to the callback as-is.\n */\nextern DECLSPEC void SDLCALL SDL_SetAssertionHandler(\n                                            SDL_AssertionHandler handler,\n                                            void *userdata);\n\n/**\n *  \\brief Get the default assertion handler.\n *\n *  This returns the function pointer that is called by default when an\n *   assertion is triggered. This is an internal function provided by SDL,\n *   that is used for assertions when SDL_SetAssertionHandler() hasn't been\n *   used to provide a different function.\n *\n *  \\return The default SDL_AssertionHandler that is called when an assert triggers.\n */\nextern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler(void);\n\n/**\n *  \\brief Get the current assertion handler.\n *\n *  This returns the function pointer that is called when an assertion is\n *   triggered. This is either the value last passed to\n *   SDL_SetAssertionHandler(), or if no application-specified function is\n *   set, is equivalent to calling SDL_GetDefaultAssertionHandler().\n *\n *   \\param puserdata Pointer to a void*, which will store the \"userdata\"\n *                    pointer that was passed to SDL_SetAssertionHandler().\n *                    This value will always be NULL for the default handler.\n *                    If you don't care about this data, it is safe to pass\n *                    a NULL pointer to this function to ignore it.\n *  \\return The SDL_AssertionHandler that is called when an assert triggers.\n */\nextern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puserdata);\n\n/**\n *  \\brief Get a list of all assertion failures.\n *\n *  Get all assertions triggered since last call to SDL_ResetAssertionReport(),\n *  or the start of the program.\n *\n *  The proper way to examine this data looks something like this:\n *\n *  <code>\n *  const SDL_AssertData *item = SDL_GetAssertionReport();\n *  while (item) {\n *      printf(\"'%s', %s (%s:%d), triggered %u times, always ignore: %s.\\n\",\n *             item->condition, item->function, item->filename,\n *             item->linenum, item->trigger_count,\n *             item->always_ignore ? \"yes\" : \"no\");\n *      item = item->next;\n *  }\n *  </code>\n *\n *  \\return List of all assertions.\n *  \\sa SDL_ResetAssertionReport\n */\nextern DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void);\n\n/**\n *  \\brief Reset the list of all assertion failures.\n *\n *  Reset list of all assertions triggered.\n *\n *  \\sa SDL_GetAssertionReport\n */\nextern DECLSPEC void SDLCALL SDL_ResetAssertionReport(void);\n\n\n/* these had wrong naming conventions until 2.0.4. Please update your app! */\n#define SDL_assert_state SDL_AssertState\n#define SDL_assert_data SDL_AssertData\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_assert_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_atomic.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n * \\file SDL_atomic.h\n *\n * Atomic operations.\n *\n * IMPORTANT:\n * If you are not an expert in concurrent lockless programming, you should\n * only be using the atomic lock and reference counting functions in this\n * file.  In all other cases you should be protecting your data structures\n * with full mutexes.\n *\n * The list of \"safe\" functions to use are:\n *  SDL_AtomicLock()\n *  SDL_AtomicUnlock()\n *  SDL_AtomicIncRef()\n *  SDL_AtomicDecRef()\n *\n * Seriously, here be dragons!\n * ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n *\n * You can find out a little more about lockless programming and the\n * subtle issues that can arise here:\n * http://msdn.microsoft.com/en-us/library/ee418650%28v=vs.85%29.aspx\n *\n * There's also lots of good information here:\n * http://www.1024cores.net/home/lock-free-algorithms\n * http://preshing.com/\n *\n * These operations may or may not actually be implemented using\n * processor specific atomic operations. When possible they are\n * implemented as true processor specific atomic operations. When that\n * is not possible the are implemented using locks that *do* use the\n * available atomic operations.\n *\n * All of the atomic operations that modify memory are full memory barriers.\n */\n\n#ifndef _SDL_atomic_h_\n#define _SDL_atomic_h_\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_platform.h\"\n\n#include \"begin_code.h\"\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\name SDL AtomicLock\n *\n * The atomic locks are efficient spinlocks using CPU instructions,\n * but are vulnerable to starvation and can spin forever if a thread\n * holding a lock has been terminated.  For this reason you should\n * minimize the code executed inside an atomic lock and never do\n * expensive things like API or system calls while holding them.\n *\n * The atomic locks are not safe to lock recursively.\n *\n * Porting Note:\n * The spin lock functions and type are required and can not be\n * emulated because they are used in the atomic emulation code.\n */\n/* @{ */\n\ntypedef int SDL_SpinLock;\n\n/**\n * \\brief Try to lock a spin lock by setting it to a non-zero value.\n *\n * \\param lock Points to the lock.\n *\n * \\return SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already held.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock);\n\n/**\n * \\brief Lock a spin lock by setting it to a non-zero value.\n *\n * \\param lock Points to the lock.\n */\nextern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock);\n\n/**\n * \\brief Unlock a spin lock by setting it to 0. Always returns immediately\n *\n * \\param lock Points to the lock.\n */\nextern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock);\n\n/* @} *//* SDL AtomicLock */\n\n\n/**\n * The compiler barrier prevents the compiler from reordering\n * reads and writes to globally visible variables across the call.\n */\n#if defined(_MSC_VER) && (_MSC_VER > 1200)\nvoid _ReadWriteBarrier(void);\n#pragma intrinsic(_ReadWriteBarrier)\n#define SDL_CompilerBarrier()   _ReadWriteBarrier()\n#elif (defined(__GNUC__) && !defined(__EMSCRIPTEN__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))\n/* This is correct for all CPUs when using GCC or Solaris Studio 12.1+. */\n#define SDL_CompilerBarrier()   __asm__ __volatile__ (\"\" : : : \"memory\")\n#else\n#define SDL_CompilerBarrier()   \\\n{ SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); }\n#endif\n\n/**\n * Memory barriers are designed to prevent reads and writes from being\n * reordered by the compiler and being seen out of order on multi-core CPUs.\n *\n * A typical pattern would be for thread A to write some data and a flag,\n * and for thread B to read the flag and get the data. In this case you\n * would insert a release barrier between writing the data and the flag,\n * guaranteeing that the data write completes no later than the flag is\n * written, and you would insert an acquire barrier between reading the\n * flag and reading the data, to ensure that all the reads associated\n * with the flag have completed.\n *\n * In this pattern you should always see a release barrier paired with\n * an acquire barrier and you should gate the data reads/writes with a\n * single flag variable.\n *\n * For more information on these semantics, take a look at the blog post:\n * http://preshing.com/20120913/acquire-and-release-semantics\n */\n#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))\n#define SDL_MemoryBarrierRelease()   __asm__ __volatile__ (\"lwsync\" : : : \"memory\")\n#define SDL_MemoryBarrierAcquire()   __asm__ __volatile__ (\"lwsync\" : : : \"memory\")\n#elif defined(__GNUC__) && defined(__arm__)\n#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)\n#define SDL_MemoryBarrierRelease()   __asm__ __volatile__ (\"dmb ish\" : : : \"memory\")\n#define SDL_MemoryBarrierAcquire()   __asm__ __volatile__ (\"dmb ish\" : : : \"memory\")\n#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)\n#ifdef __thumb__\n/* The mcr instruction isn't available in thumb mode, use real functions */\nextern DECLSPEC void SDLCALL SDL_MemoryBarrierRelease();\nextern DECLSPEC void SDLCALL SDL_MemoryBarrierAcquire();\n#else\n#define SDL_MemoryBarrierRelease()   __asm__ __volatile__ (\"mcr p15, 0, %0, c7, c10, 5\" : : \"r\"(0) : \"memory\")\n#define SDL_MemoryBarrierAcquire()   __asm__ __volatile__ (\"mcr p15, 0, %0, c7, c10, 5\" : : \"r\"(0) : \"memory\")\n#endif /* __thumb__ */\n#else\n#define SDL_MemoryBarrierRelease()   __asm__ __volatile__ (\"\" : : : \"memory\")\n#define SDL_MemoryBarrierAcquire()   __asm__ __volatile__ (\"\" : : : \"memory\")\n#endif /* __GNUC__ && __arm__ */\n#else\n#if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))\n/* This is correct for all CPUs on Solaris when using Solaris Studio 12.1+. */\n#include <mbarrier.h>\n#define SDL_MemoryBarrierRelease()  __machine_rel_barrier()\n#define SDL_MemoryBarrierAcquire()  __machine_acq_barrier()\n#else\n/* This is correct for the x86 and x64 CPUs, and we'll expand this over time. */\n#define SDL_MemoryBarrierRelease()  SDL_CompilerBarrier()\n#define SDL_MemoryBarrierAcquire()  SDL_CompilerBarrier()\n#endif\n#endif\n\n/**\n * \\brief A type representing an atomic integer value.  It is a struct\n *        so people don't accidentally use numeric operations on it.\n */\ntypedef struct { int value; } SDL_atomic_t;\n\n/**\n * \\brief Set an atomic variable to a new value if it is currently an old value.\n *\n * \\return SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise.\n *\n * \\note If you don't know what this function is for, you shouldn't use it!\n*/\nextern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval);\n\n/**\n * \\brief Set an atomic variable to a value.\n *\n * \\return The previous value of the atomic variable.\n */\nextern DECLSPEC int SDLCALL SDL_AtomicSet(SDL_atomic_t *a, int v);\n\n/**\n * \\brief Get the value of an atomic variable\n */\nextern DECLSPEC int SDLCALL SDL_AtomicGet(SDL_atomic_t *a);\n\n/**\n * \\brief Add to an atomic variable.\n *\n * \\return The previous value of the atomic variable.\n *\n * \\note This same style can be used for any number operation\n */\nextern DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_atomic_t *a, int v);\n\n/**\n * \\brief Increment an atomic variable used as a reference count.\n */\n#ifndef SDL_AtomicIncRef\n#define SDL_AtomicIncRef(a)    SDL_AtomicAdd(a, 1)\n#endif\n\n/**\n * \\brief Decrement an atomic variable used as a reference count.\n *\n * \\return SDL_TRUE if the variable reached zero after decrementing,\n *         SDL_FALSE otherwise\n */\n#ifndef SDL_AtomicDecRef\n#define SDL_AtomicDecRef(a)    (SDL_AtomicAdd(a, -1) == 1)\n#endif\n\n/**\n * \\brief Set a pointer to a new value if it is currently an old value.\n *\n * \\return SDL_TRUE if the pointer was set, SDL_FALSE otherwise.\n *\n * \\note If you don't know what this function is for, you shouldn't use it!\n*/\nextern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void **a, void *oldval, void *newval);\n\n/**\n * \\brief Set a pointer to a value atomically.\n *\n * \\return The previous value of the pointer.\n */\nextern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v);\n\n/**\n * \\brief Get the value of a pointer atomically.\n */\nextern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n\n#include \"close_code.h\"\n\n#endif /* _SDL_atomic_h_ */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_audio.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_audio.h\n *\n *  Access to the raw audio mixing buffer for the SDL library.\n */\n\n#ifndef _SDL_audio_h\n#define _SDL_audio_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_mutex.h\"\n#include \"SDL_thread.h\"\n#include \"SDL_rwops.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief Audio format flags.\n *\n *  These are what the 16 bits in SDL_AudioFormat currently mean...\n *  (Unspecified bits are always zero).\n *\n *  \\verbatim\n    ++-----------------------sample is signed if set\n    ||\n    ||       ++-----------sample is bigendian if set\n    ||       ||\n    ||       ||          ++---sample is float if set\n    ||       ||          ||\n    ||       ||          || +---sample bit size---+\n    ||       ||          || |                     |\n    15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00\n    \\endverbatim\n *\n *  There are macros in SDL 2.0 and later to query these bits.\n */\ntypedef Uint16 SDL_AudioFormat;\n\n/**\n *  \\name Audio flags\n */\n/* @{ */\n\n#define SDL_AUDIO_MASK_BITSIZE       (0xFF)\n#define SDL_AUDIO_MASK_DATATYPE      (1<<8)\n#define SDL_AUDIO_MASK_ENDIAN        (1<<12)\n#define SDL_AUDIO_MASK_SIGNED        (1<<15)\n#define SDL_AUDIO_BITSIZE(x)         (x & SDL_AUDIO_MASK_BITSIZE)\n#define SDL_AUDIO_ISFLOAT(x)         (x & SDL_AUDIO_MASK_DATATYPE)\n#define SDL_AUDIO_ISBIGENDIAN(x)     (x & SDL_AUDIO_MASK_ENDIAN)\n#define SDL_AUDIO_ISSIGNED(x)        (x & SDL_AUDIO_MASK_SIGNED)\n#define SDL_AUDIO_ISINT(x)           (!SDL_AUDIO_ISFLOAT(x))\n#define SDL_AUDIO_ISLITTLEENDIAN(x)  (!SDL_AUDIO_ISBIGENDIAN(x))\n#define SDL_AUDIO_ISUNSIGNED(x)      (!SDL_AUDIO_ISSIGNED(x))\n\n/**\n *  \\name Audio format flags\n *\n *  Defaults to LSB byte order.\n */\n/* @{ */\n#define AUDIO_U8        0x0008  /**< Unsigned 8-bit samples */\n#define AUDIO_S8        0x8008  /**< Signed 8-bit samples */\n#define AUDIO_U16LSB    0x0010  /**< Unsigned 16-bit samples */\n#define AUDIO_S16LSB    0x8010  /**< Signed 16-bit samples */\n#define AUDIO_U16MSB    0x1010  /**< As above, but big-endian byte order */\n#define AUDIO_S16MSB    0x9010  /**< As above, but big-endian byte order */\n#define AUDIO_U16       AUDIO_U16LSB\n#define AUDIO_S16       AUDIO_S16LSB\n/* @} */\n\n/**\n *  \\name int32 support\n */\n/* @{ */\n#define AUDIO_S32LSB    0x8020  /**< 32-bit integer samples */\n#define AUDIO_S32MSB    0x9020  /**< As above, but big-endian byte order */\n#define AUDIO_S32       AUDIO_S32LSB\n/* @} */\n\n/**\n *  \\name float32 support\n */\n/* @{ */\n#define AUDIO_F32LSB    0x8120  /**< 32-bit floating point samples */\n#define AUDIO_F32MSB    0x9120  /**< As above, but big-endian byte order */\n#define AUDIO_F32       AUDIO_F32LSB\n/* @} */\n\n/**\n *  \\name Native audio byte ordering\n */\n/* @{ */\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n#define AUDIO_U16SYS    AUDIO_U16LSB\n#define AUDIO_S16SYS    AUDIO_S16LSB\n#define AUDIO_S32SYS    AUDIO_S32LSB\n#define AUDIO_F32SYS    AUDIO_F32LSB\n#else\n#define AUDIO_U16SYS    AUDIO_U16MSB\n#define AUDIO_S16SYS    AUDIO_S16MSB\n#define AUDIO_S32SYS    AUDIO_S32MSB\n#define AUDIO_F32SYS    AUDIO_F32MSB\n#endif\n/* @} */\n\n/**\n *  \\name Allow change flags\n *\n *  Which audio format changes are allowed when opening a device.\n */\n/* @{ */\n#define SDL_AUDIO_ALLOW_FREQUENCY_CHANGE    0x00000001\n#define SDL_AUDIO_ALLOW_FORMAT_CHANGE       0x00000002\n#define SDL_AUDIO_ALLOW_CHANNELS_CHANGE     0x00000004\n#define SDL_AUDIO_ALLOW_ANY_CHANGE          (SDL_AUDIO_ALLOW_FREQUENCY_CHANGE|SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_CHANNELS_CHANGE)\n/* @} */\n\n/* @} *//* Audio flags */\n\n/**\n *  This function is called when the audio device needs more data.\n *\n *  \\param userdata An application-specific parameter saved in\n *                  the SDL_AudioSpec structure\n *  \\param stream A pointer to the audio data buffer.\n *  \\param len    The length of that buffer in bytes.\n *\n *  Once the callback returns, the buffer will no longer be valid.\n *  Stereo samples are stored in a LRLRLR ordering.\n *\n *  You can choose to avoid callbacks and use SDL_QueueAudio() instead, if\n *  you like. Just open your audio device with a NULL callback.\n */\ntypedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream,\n                                            int len);\n\n/**\n *  The calculated values in this structure are calculated by SDL_OpenAudio().\n */\ntypedef struct SDL_AudioSpec\n{\n    int freq;                   /**< DSP frequency -- samples per second */\n    SDL_AudioFormat format;     /**< Audio data format */\n    Uint8 channels;             /**< Number of channels: 1 mono, 2 stereo */\n    Uint8 silence;              /**< Audio buffer silence value (calculated) */\n    Uint16 samples;             /**< Audio buffer size in samples (power of 2) */\n    Uint16 padding;             /**< Necessary for some compile environments */\n    Uint32 size;                /**< Audio buffer size in bytes (calculated) */\n    SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */\n    void *userdata;             /**< Userdata passed to callback (ignored for NULL callbacks). */\n} SDL_AudioSpec;\n\n\nstruct SDL_AudioCVT;\ntypedef void (SDLCALL * SDL_AudioFilter) (struct SDL_AudioCVT * cvt,\n                                          SDL_AudioFormat format);\n\n/**\n *  A structure to hold a set of audio conversion filters and buffers.\n */\n#ifdef __GNUC__\n/* This structure is 84 bytes on 32-bit architectures, make sure GCC doesn't\n   pad it out to 88 bytes to guarantee ABI compatibility between compilers.\n   vvv\n   The next time we rev the ABI, make sure to size the ints and add padding.\n*/\n#define SDL_AUDIOCVT_PACKED __attribute__((packed))\n#else\n#define SDL_AUDIOCVT_PACKED\n#endif\n/* */\ntypedef struct SDL_AudioCVT\n{\n    int needed;                 /**< Set to 1 if conversion possible */\n    SDL_AudioFormat src_format; /**< Source audio format */\n    SDL_AudioFormat dst_format; /**< Target audio format */\n    double rate_incr;           /**< Rate conversion increment */\n    Uint8 *buf;                 /**< Buffer to hold entire audio data */\n    int len;                    /**< Length of original audio buffer */\n    int len_cvt;                /**< Length of converted audio buffer */\n    int len_mult;               /**< buffer must be len*len_mult big */\n    double len_ratio;           /**< Given len, final size is len*len_ratio */\n    SDL_AudioFilter filters[10];        /**< Filter list */\n    int filter_index;           /**< Current audio conversion function */\n} SDL_AUDIOCVT_PACKED SDL_AudioCVT;\n\n\n/* Function prototypes */\n\n/**\n *  \\name Driver discovery functions\n *\n *  These functions return the list of built in audio drivers, in the\n *  order that they are normally initialized by default.\n */\n/* @{ */\nextern DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void);\nextern DECLSPEC const char *SDLCALL SDL_GetAudioDriver(int index);\n/* @} */\n\n/**\n *  \\name Initialization and cleanup\n *\n *  \\internal These functions are used internally, and should not be used unless\n *            you have a specific need to specify the audio driver you want to\n *            use.  You should normally use SDL_Init() or SDL_InitSubSystem().\n */\n/* @{ */\nextern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name);\nextern DECLSPEC void SDLCALL SDL_AudioQuit(void);\n/* @} */\n\n/**\n *  This function returns the name of the current audio driver, or NULL\n *  if no driver has been initialized.\n */\nextern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void);\n\n/**\n *  This function opens the audio device with the desired parameters, and\n *  returns 0 if successful, placing the actual hardware parameters in the\n *  structure pointed to by \\c obtained.  If \\c obtained is NULL, the audio\n *  data passed to the callback function will be guaranteed to be in the\n *  requested format, and will be automatically converted to the hardware\n *  audio format if necessary.  This function returns -1 if it failed\n *  to open the audio device, or couldn't set up the audio thread.\n *\n *  When filling in the desired audio spec structure,\n *    - \\c desired->freq should be the desired audio frequency in samples-per-\n *      second.\n *    - \\c desired->format should be the desired audio format.\n *    - \\c desired->samples is the desired size of the audio buffer, in\n *      samples.  This number should be a power of two, and may be adjusted by\n *      the audio driver to a value more suitable for the hardware.  Good values\n *      seem to range between 512 and 8096 inclusive, depending on the\n *      application and CPU speed.  Smaller values yield faster response time,\n *      but can lead to underflow if the application is doing heavy processing\n *      and cannot fill the audio buffer in time.  A stereo sample consists of\n *      both right and left channels in LR ordering.\n *      Note that the number of samples is directly related to time by the\n *      following formula:  \\code ms = (samples*1000)/freq \\endcode\n *    - \\c desired->size is the size in bytes of the audio buffer, and is\n *      calculated by SDL_OpenAudio().\n *    - \\c desired->silence is the value used to set the buffer to silence,\n *      and is calculated by SDL_OpenAudio().\n *    - \\c desired->callback should be set to a function that will be called\n *      when the audio device is ready for more data.  It is passed a pointer\n *      to the audio buffer, and the length in bytes of the audio buffer.\n *      This function usually runs in a separate thread, and so you should\n *      protect data structures that it accesses by calling SDL_LockAudio()\n *      and SDL_UnlockAudio() in your code. Alternately, you may pass a NULL\n *      pointer here, and call SDL_QueueAudio() with some frequency, to queue\n *      more audio samples to be played (or for capture devices, call\n *      SDL_DequeueAudio() with some frequency, to obtain audio samples).\n *    - \\c desired->userdata is passed as the first parameter to your callback\n *      function. If you passed a NULL callback, this value is ignored.\n *\n *  The audio device starts out playing silence when it's opened, and should\n *  be enabled for playing by calling \\c SDL_PauseAudio(0) when you are ready\n *  for your audio callback function to be called.  Since the audio driver\n *  may modify the requested size of the audio buffer, you should allocate\n *  any local mixing buffers after you open the audio device.\n */\nextern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired,\n                                          SDL_AudioSpec * obtained);\n\n/**\n *  SDL Audio Device IDs.\n *\n *  A successful call to SDL_OpenAudio() is always device id 1, and legacy\n *  SDL audio APIs assume you want this device ID. SDL_OpenAudioDevice() calls\n *  always returns devices >= 2 on success. The legacy calls are good both\n *  for backwards compatibility and when you don't care about multiple,\n *  specific, or capture devices.\n */\ntypedef Uint32 SDL_AudioDeviceID;\n\n/**\n *  Get the number of available devices exposed by the current driver.\n *  Only valid after a successfully initializing the audio subsystem.\n *  Returns -1 if an explicit list of devices can't be determined; this is\n *  not an error. For example, if SDL is set up to talk to a remote audio\n *  server, it can't list every one available on the Internet, but it will\n *  still allow a specific host to be specified to SDL_OpenAudioDevice().\n *\n *  In many common cases, when this function returns a value <= 0, it can still\n *  successfully open the default device (NULL for first argument of\n *  SDL_OpenAudioDevice()).\n */\nextern DECLSPEC int SDLCALL SDL_GetNumAudioDevices(int iscapture);\n\n/**\n *  Get the human-readable name of a specific audio device.\n *  Must be a value between 0 and (number of audio devices-1).\n *  Only valid after a successfully initializing the audio subsystem.\n *  The values returned by this function reflect the latest call to\n *  SDL_GetNumAudioDevices(); recall that function to redetect available\n *  hardware.\n *\n *  The string returned by this function is UTF-8 encoded, read-only, and\n *  managed internally. You are not to free it. If you need to keep the\n *  string for any length of time, you should make your own copy of it, as it\n *  will be invalid next time any of several other SDL functions is called.\n */\nextern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index,\n                                                           int iscapture);\n\n\n/**\n *  Open a specific audio device. Passing in a device name of NULL requests\n *  the most reasonable default (and is equivalent to calling SDL_OpenAudio()).\n *\n *  The device name is a UTF-8 string reported by SDL_GetAudioDeviceName(), but\n *  some drivers allow arbitrary and driver-specific strings, such as a\n *  hostname/IP address for a remote audio server, or a filename in the\n *  diskaudio driver.\n *\n *  \\return 0 on error, a valid device ID that is >= 2 on success.\n *\n *  SDL_OpenAudio(), unlike this function, always acts on device ID 1.\n */\nextern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(const char\n                                                              *device,\n                                                              int iscapture,\n                                                              const\n                                                              SDL_AudioSpec *\n                                                              desired,\n                                                              SDL_AudioSpec *\n                                                              obtained,\n                                                              int\n                                                              allowed_changes);\n\n\n\n/**\n *  \\name Audio state\n *\n *  Get the current audio state.\n */\n/* @{ */\ntypedef enum\n{\n    SDL_AUDIO_STOPPED = 0,\n    SDL_AUDIO_PLAYING,\n    SDL_AUDIO_PAUSED\n} SDL_AudioStatus;\nextern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioStatus(void);\n\nextern DECLSPEC SDL_AudioStatus SDLCALL\nSDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev);\n/* @} *//* Audio State */\n\n/**\n *  \\name Pause audio functions\n *\n *  These functions pause and unpause the audio callback processing.\n *  They should be called with a parameter of 0 after opening the audio\n *  device to start playing sound.  This is so you can safely initialize\n *  data for your callback function after opening the audio device.\n *  Silence will be written to the audio device during the pause.\n */\n/* @{ */\nextern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on);\nextern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev,\n                                                  int pause_on);\n/* @} *//* Pause audio functions */\n\n/**\n *  This function loads a WAVE from the data source, automatically freeing\n *  that source if \\c freesrc is non-zero.  For example, to load a WAVE file,\n *  you could do:\n *  \\code\n *      SDL_LoadWAV_RW(SDL_RWFromFile(\"sample.wav\", \"rb\"), 1, ...);\n *  \\endcode\n *\n *  If this function succeeds, it returns the given SDL_AudioSpec,\n *  filled with the audio data format of the wave data, and sets\n *  \\c *audio_buf to a malloc()'d buffer containing the audio data,\n *  and sets \\c *audio_len to the length of that audio buffer, in bytes.\n *  You need to free the audio buffer with SDL_FreeWAV() when you are\n *  done with it.\n *\n *  This function returns NULL and sets the SDL error message if the\n *  wave file cannot be opened, uses an unknown data format, or is\n *  corrupt.  Currently raw and MS-ADPCM WAVE files are supported.\n */\nextern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src,\n                                                      int freesrc,\n                                                      SDL_AudioSpec * spec,\n                                                      Uint8 ** audio_buf,\n                                                      Uint32 * audio_len);\n\n/**\n *  Loads a WAV from a file.\n *  Compatibility convenience function.\n */\n#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \\\n    SDL_LoadWAV_RW(SDL_RWFromFile(file, \"rb\"),1, spec,audio_buf,audio_len)\n\n/**\n *  This function frees data previously allocated with SDL_LoadWAV_RW()\n */\nextern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf);\n\n/**\n *  This function takes a source format and rate and a destination format\n *  and rate, and initializes the \\c cvt structure with information needed\n *  by SDL_ConvertAudio() to convert a buffer of audio data from one format\n *  to the other.\n *\n *  \\return -1 if the format conversion is not supported, 0 if there's\n *  no conversion needed, or 1 if the audio filter is set up.\n */\nextern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt,\n                                              SDL_AudioFormat src_format,\n                                              Uint8 src_channels,\n                                              int src_rate,\n                                              SDL_AudioFormat dst_format,\n                                              Uint8 dst_channels,\n                                              int dst_rate);\n\n/**\n *  Once you have initialized the \\c cvt structure using SDL_BuildAudioCVT(),\n *  created an audio buffer \\c cvt->buf, and filled it with \\c cvt->len bytes of\n *  audio data in the source format, this function will convert it in-place\n *  to the desired format.\n *\n *  The data conversion may expand the size of the audio data, so the buffer\n *  \\c cvt->buf should be allocated after the \\c cvt structure is initialized by\n *  SDL_BuildAudioCVT(), and should be \\c cvt->len*cvt->len_mult bytes long.\n */\nextern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt);\n\n#define SDL_MIX_MAXVOLUME 128\n/**\n *  This takes two audio buffers of the playing audio format and mixes\n *  them, performing addition, volume adjustment, and overflow clipping.\n *  The volume ranges from 0 - 128, and should be set to ::SDL_MIX_MAXVOLUME\n *  for full audio volume.  Note this does not change hardware volume.\n *  This is provided for convenience -- you can mix your own audio data.\n */\nextern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 * dst, const Uint8 * src,\n                                          Uint32 len, int volume);\n\n/**\n *  This works like SDL_MixAudio(), but you specify the audio format instead of\n *  using the format of audio device 1. Thus it can be used when no audio\n *  device is open at all.\n */\nextern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst,\n                                                const Uint8 * src,\n                                                SDL_AudioFormat format,\n                                                Uint32 len, int volume);\n\n/**\n *  Queue more audio on non-callback devices.\n *\n *  (If you are looking to retrieve queued audio from a non-callback capture\n *  device, you want SDL_DequeueAudio() instead. This will return -1 to\n *  signify an error if you use it with capture devices.)\n *\n *  SDL offers two ways to feed audio to the device: you can either supply a\n *  callback that SDL triggers with some frequency to obtain more audio\n *  (pull method), or you can supply no callback, and then SDL will expect\n *  you to supply data at regular intervals (push method) with this function.\n *\n *  There are no limits on the amount of data you can queue, short of\n *  exhaustion of address space. Queued data will drain to the device as\n *  necessary without further intervention from you. If the device needs\n *  audio but there is not enough queued, it will play silence to make up\n *  the difference. This means you will have skips in your audio playback\n *  if you aren't routinely queueing sufficient data.\n *\n *  This function copies the supplied data, so you are safe to free it when\n *  the function returns. This function is thread-safe, but queueing to the\n *  same device from two threads at once does not promise which buffer will\n *  be queued first.\n *\n *  You may not queue audio on a device that is using an application-supplied\n *  callback; doing so returns an error. You have to use the audio callback\n *  or queue audio with this function, but not both.\n *\n *  You should not call SDL_LockAudio() on the device before queueing; SDL\n *  handles locking internally for this function.\n *\n *  \\param dev The device ID to which we will queue audio.\n *  \\param data The data to queue to the device for later playback.\n *  \\param len The number of bytes (not samples!) to which (data) points.\n *  \\return zero on success, -1 on error.\n *\n *  \\sa SDL_GetQueuedAudioSize\n *  \\sa SDL_ClearQueuedAudio\n */\nextern DECLSPEC int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len);\n\n/**\n *  Dequeue more audio on non-callback devices.\n *\n *  (If you are looking to queue audio for output on a non-callback playback\n *  device, you want SDL_QueueAudio() instead. This will always return 0\n *  if you use it with playback devices.)\n *\n *  SDL offers two ways to retrieve audio from a capture device: you can\n *  either supply a callback that SDL triggers with some frequency as the\n *  device records more audio data, (push method), or you can supply no\n *  callback, and then SDL will expect you to retrieve data at regular\n *  intervals (pull method) with this function.\n *\n *  There are no limits on the amount of data you can queue, short of\n *  exhaustion of address space. Data from the device will keep queuing as\n *  necessary without further intervention from you. This means you will\n *  eventually run out of memory if you aren't routinely dequeueing data.\n *\n *  Capture devices will not queue data when paused; if you are expecting\n *  to not need captured audio for some length of time, use\n *  SDL_PauseAudioDevice() to stop the capture device from queueing more\n *  data. This can be useful during, say, level loading times. When\n *  unpaused, capture devices will start queueing data from that point,\n *  having flushed any capturable data available while paused.\n *\n *  This function is thread-safe, but dequeueing from the same device from\n *  two threads at once does not promise which thread will dequeued data\n *  first.\n *\n *  You may not dequeue audio from a device that is using an\n *  application-supplied callback; doing so returns an error. You have to use\n *  the audio callback, or dequeue audio with this function, but not both.\n *\n *  You should not call SDL_LockAudio() on the device before queueing; SDL\n *  handles locking internally for this function.\n *\n *  \\param dev The device ID from which we will dequeue audio.\n *  \\param data A pointer into where audio data should be copied.\n *  \\param len The number of bytes (not samples!) to which (data) points.\n *  \\return number of bytes dequeued, which could be less than requested.\n *\n *  \\sa SDL_GetQueuedAudioSize\n *  \\sa SDL_ClearQueuedAudio\n */\nextern DECLSPEC Uint32 SDLCALL SDL_DequeueAudio(SDL_AudioDeviceID dev, void *data, Uint32 len);\n\n/**\n *  Get the number of bytes of still-queued audio.\n *\n *  For playback device:\n *\n *    This is the number of bytes that have been queued for playback with\n *    SDL_QueueAudio(), but have not yet been sent to the hardware. This\n *    number may shrink at any time, so this only informs of pending data.\n *\n *    Once we've sent it to the hardware, this function can not decide the\n *    exact byte boundary of what has been played. It's possible that we just\n *    gave the hardware several kilobytes right before you called this\n *    function, but it hasn't played any of it yet, or maybe half of it, etc.\n *\n *  For capture devices:\n *\n *    This is the number of bytes that have been captured by the device and\n *    are waiting for you to dequeue. This number may grow at any time, so\n *    this only informs of the lower-bound of available data.\n *\n *  You may not queue audio on a device that is using an application-supplied\n *  callback; calling this function on such a device always returns 0.\n *  You have to queue audio with SDL_QueueAudio()/SDL_DequeueAudio(), or use\n *  the audio callback, but not both.\n *\n *  You should not call SDL_LockAudio() on the device before querying; SDL\n *  handles locking internally for this function.\n *\n *  \\param dev The device ID of which we will query queued audio size.\n *  \\return Number of bytes (not samples!) of queued audio.\n *\n *  \\sa SDL_QueueAudio\n *  \\sa SDL_ClearQueuedAudio\n */\nextern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev);\n\n/**\n *  Drop any queued audio data. For playback devices, this is any queued data\n *  still waiting to be submitted to the hardware. For capture devices, this\n *  is any data that was queued by the device that hasn't yet been dequeued by\n *  the application.\n *\n *  Immediately after this call, SDL_GetQueuedAudioSize() will return 0. For\n *  playback devices, the hardware will start playing silence if more audio\n *  isn't queued. Unpaused capture devices will start filling the queue again\n *  as soon as they have more data available (which, depending on the state\n *  of the hardware and the thread, could be before this function call\n *  returns!).\n *\n *  This will not prevent playback of queued audio that's already been sent\n *  to the hardware, as we can not undo that, so expect there to be some\n *  fraction of a second of audio that might still be heard. This can be\n *  useful if you want to, say, drop any pending music during a level change\n *  in your game.\n *\n *  You may not queue audio on a device that is using an application-supplied\n *  callback; calling this function on such a device is always a no-op.\n *  You have to queue audio with SDL_QueueAudio()/SDL_DequeueAudio(), or use\n *  the audio callback, but not both.\n *\n *  You should not call SDL_LockAudio() on the device before clearing the\n *  queue; SDL handles locking internally for this function.\n *\n *  This function always succeeds and thus returns void.\n *\n *  \\param dev The device ID of which to clear the audio queue.\n *\n *  \\sa SDL_QueueAudio\n *  \\sa SDL_GetQueuedAudioSize\n */\nextern DECLSPEC void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID dev);\n\n\n/**\n *  \\name Audio lock functions\n *\n *  The lock manipulated by these functions protects the callback function.\n *  During a SDL_LockAudio()/SDL_UnlockAudio() pair, you can be guaranteed that\n *  the callback function is not running.  Do not call these from the callback\n *  function or you will cause deadlock.\n */\n/* @{ */\nextern DECLSPEC void SDLCALL SDL_LockAudio(void);\nextern DECLSPEC void SDLCALL SDL_LockAudioDevice(SDL_AudioDeviceID dev);\nextern DECLSPEC void SDLCALL SDL_UnlockAudio(void);\nextern DECLSPEC void SDLCALL SDL_UnlockAudioDevice(SDL_AudioDeviceID dev);\n/* @} *//* Audio lock functions */\n\n/**\n *  This function shuts down audio processing and closes the audio device.\n */\nextern DECLSPEC void SDLCALL SDL_CloseAudio(void);\nextern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_audio_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_bits.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_bits.h\n *\n *  Functions for fiddling with bits and bitmasks.\n */\n\n#ifndef _SDL_bits_h\n#define _SDL_bits_h\n\n#include \"SDL_stdinc.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\file SDL_bits.h\n */\n\n/**\n *  Get the index of the most significant bit. Result is undefined when called\n *  with 0. This operation can also be stated as \"count leading zeroes\" and\n *  \"log base 2\".\n *\n *  \\return Index of the most significant bit, or -1 if the value is 0.\n */\nSDL_FORCE_INLINE int\nSDL_MostSignificantBitIndex32(Uint32 x)\n{\n#if defined(__GNUC__) && __GNUC__ >= 4\n    /* Count Leading Zeroes builtin in GCC.\n     * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html\n     */\n    if (x == 0) {\n        return -1;\n    }\n    return 31 - __builtin_clz(x);\n#else\n    /* Based off of Bit Twiddling Hacks by Sean Eron Anderson\n     * <seander@cs.stanford.edu>, released in the public domain.\n     * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog\n     */\n    const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};\n    const int    S[] = {1, 2, 4, 8, 16};\n\n    int msbIndex = 0;\n    int i;\n\n    if (x == 0) {\n        return -1;\n    }\n\n    for (i = 4; i >= 0; i--)\n    {\n        if (x & b[i])\n        {\n            x >>= S[i];\n            msbIndex |= S[i];\n        }\n    }\n\n    return msbIndex;\n#endif\n}\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_bits_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_blendmode.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_blendmode.h\n *\n *  Header file declaring the SDL_BlendMode enumeration\n */\n\n#ifndef _SDL_blendmode_h\n#define _SDL_blendmode_h\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief The blend mode used in SDL_RenderCopy() and drawing operations.\n */\ntypedef enum\n{\n    SDL_BLENDMODE_NONE = 0x00000000,     /**< no blending\n                                              dstRGBA = srcRGBA */\n    SDL_BLENDMODE_BLEND = 0x00000001,    /**< alpha blending\n                                              dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA))\n                                              dstA = srcA + (dstA * (1-srcA)) */\n    SDL_BLENDMODE_ADD = 0x00000002,      /**< additive blending\n                                              dstRGB = (srcRGB * srcA) + dstRGB\n                                              dstA = dstA */\n    SDL_BLENDMODE_MOD = 0x00000004       /**< color modulate\n                                              dstRGB = srcRGB * dstRGB\n                                              dstA = dstA */\n} SDL_BlendMode;\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_blendmode_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_clipboard.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n * \\file SDL_clipboard.h\n *\n * Include file for SDL clipboard handling\n */\n\n#ifndef _SDL_clipboard_h\n#define _SDL_clipboard_h\n\n#include \"SDL_stdinc.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Function prototypes */\n\n/**\n * \\brief Put UTF-8 text into the clipboard\n *\n * \\sa SDL_GetClipboardText()\n */\nextern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text);\n\n/**\n * \\brief Get UTF-8 text from the clipboard, which must be freed with SDL_free()\n *\n * \\sa SDL_SetClipboardText()\n */\nextern DECLSPEC char * SDLCALL SDL_GetClipboardText(void);\n\n/**\n * \\brief Returns a flag indicating whether the clipboard exists and contains a text string that is non-empty\n *\n * \\sa SDL_GetClipboardText()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_clipboard_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_h\n#define _SDL_config_h\n\n#include \"SDL_platform.h\"\n\n/**\n *  \\file SDL_config.h\n */\n\n/* Add any platform that doesn't build using the configure system. */\n#ifdef USING_PREMAKE_CONFIG_H\n#include \"SDL_config_premake.h\"\n#elif defined(__WIN32__)\n#include \"SDL_config_windows.h\"\n#elif defined(__WINRT__)\n#include \"SDL_config_winrt.h\"\n#elif defined(__MACOSX__)\n#include \"SDL_config_macosx.h\"\n#elif defined(__IPHONEOS__)\n#include \"SDL_config_iphoneos.h\"\n#elif defined(__ANDROID__)\n#include \"SDL_config_android.h\"\n#elif defined(__PSP__)\n#include \"SDL_config_psp.h\"\n#else\n/* This is a minimal configuration just to get SDL running on new platforms */\n#include \"SDL_config_minimal.h\"\n#endif /* platform config */\n\n#ifdef USING_GENERATED_CONFIG_H\n#error Wrong SDL_config.h, check your include path?\n#endif\n\n#endif /* _SDL_config_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config.h.cmake",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_h\n#define _SDL_config_h\n\n/**\n *  \\file SDL_config.h.in\n *\n *  This is a set of defines to configure the SDL features\n */\n\n/* General platform specific identifiers */\n#include \"SDL_platform.h\"\n\n/* C language features */\n#cmakedefine const @HAVE_CONST@\n#cmakedefine inline @HAVE_INLINE@\n#cmakedefine volatile @HAVE_VOLATILE@\n\n/* C datatypes */\n/* Define SIZEOF_VOIDP for 64/32 architectures */\n#ifdef __LP64__\n#define SIZEOF_VOIDP 8\n#else\n#define SIZEOF_VOIDP 4\n#endif\n\n#cmakedefine HAVE_GCC_ATOMICS @HAVE_GCC_ATOMICS@\n#cmakedefine HAVE_GCC_SYNC_LOCK_TEST_AND_SET @HAVE_GCC_SYNC_LOCK_TEST_AND_SET@\n\n#cmakedefine HAVE_D3D_H @HAVE_D3D_H@\n#cmakedefine HAVE_D3D11_H @HAVE_D3D11_H@\n#cmakedefine HAVE_DDRAW_H @HAVE_DDRAW_H@\n#cmakedefine HAVE_DSOUND_H @HAVE_DSOUND_H@\n#cmakedefine HAVE_DINPUT_H @HAVE_DINPUT_H@\n#cmakedefine HAVE_XAUDIO2_H @HAVE_XAUDIO2_H@\n#cmakedefine HAVE_XINPUT_H @HAVE_XINPUT_H@\n#cmakedefine HAVE_DXGI_H @HAVE_DXGI_H@\n\n/* Comment this if you want to build without any C library requirements */\n#cmakedefine HAVE_LIBC 1\n#if HAVE_LIBC\n\n/* Useful headers */\n#cmakedefine HAVE_ALLOCA_H 1\n#cmakedefine HAVE_SYS_TYPES_H 1\n#cmakedefine HAVE_STDIO_H 1\n#cmakedefine STDC_HEADERS 1\n#cmakedefine HAVE_STDLIB_H 1\n#cmakedefine HAVE_STDARG_H 1\n#cmakedefine HAVE_MALLOC_H 1\n#cmakedefine HAVE_MEMORY_H 1\n#cmakedefine HAVE_STRING_H 1\n#cmakedefine HAVE_STRINGS_H 1\n#cmakedefine HAVE_INTTYPES_H 1\n#cmakedefine HAVE_STDINT_H 1\n#cmakedefine HAVE_CTYPE_H 1\n#cmakedefine HAVE_MATH_H 1\n#cmakedefine HAVE_ICONV_H 1\n#cmakedefine HAVE_SIGNAL_H 1\n#cmakedefine HAVE_ALTIVEC_H 1\n#cmakedefine HAVE_PTHREAD_NP_H 1\n#cmakedefine HAVE_LIBUDEV_H 1\n#cmakedefine HAVE_DBUS_DBUS_H 1\n#cmakedefine HAVE_IBUS_IBUS_H 1\n#cmakedefine HAVE_FCITX_FRONTEND_H 1\n\n/* C library functions */\n#cmakedefine HAVE_MALLOC 1\n#cmakedefine HAVE_CALLOC 1\n#cmakedefine HAVE_REALLOC 1\n#cmakedefine HAVE_FREE 1\n#cmakedefine HAVE_ALLOCA 1\n#ifndef __WIN32__ /* Don't use C runtime versions of these on Windows */\n#cmakedefine HAVE_GETENV 1\n#cmakedefine HAVE_SETENV 1\n#cmakedefine HAVE_PUTENV 1\n#cmakedefine HAVE_UNSETENV 1\n#endif\n#cmakedefine HAVE_QSORT 1\n#cmakedefine HAVE_ABS 1\n#cmakedefine HAVE_BCOPY 1\n#cmakedefine HAVE_MEMSET 1\n#cmakedefine HAVE_MEMCPY 1\n#cmakedefine HAVE_MEMMOVE 1\n#cmakedefine HAVE_MEMCMP 1\n#cmakedefine HAVE_STRLEN 1\n#cmakedefine HAVE_STRLCPY 1\n#cmakedefine HAVE_STRLCAT 1\n#cmakedefine HAVE_STRDUP 1\n#cmakedefine HAVE__STRREV 1\n#cmakedefine HAVE__STRUPR 1\n#cmakedefine HAVE__STRLWR 1\n#cmakedefine HAVE_INDEX 1\n#cmakedefine HAVE_RINDEX 1\n#cmakedefine HAVE_STRCHR 1\n#cmakedefine HAVE_STRRCHR 1\n#cmakedefine HAVE_STRSTR 1\n#cmakedefine HAVE_ITOA 1\n#cmakedefine HAVE__LTOA 1\n#cmakedefine HAVE__UITOA 1\n#cmakedefine HAVE__ULTOA 1\n#cmakedefine HAVE_STRTOL 1\n#cmakedefine HAVE_STRTOUL 1\n#cmakedefine HAVE__I64TOA 1\n#cmakedefine HAVE__UI64TOA 1\n#cmakedefine HAVE_STRTOLL 1\n#cmakedefine HAVE_STRTOULL 1\n#cmakedefine HAVE_STRTOD 1\n#cmakedefine HAVE_ATOI 1\n#cmakedefine HAVE_ATOF 1\n#cmakedefine HAVE_STRCMP 1\n#cmakedefine HAVE_STRNCMP 1\n#cmakedefine HAVE__STRICMP 1\n#cmakedefine HAVE_STRCASECMP 1\n#cmakedefine HAVE__STRNICMP 1\n#cmakedefine HAVE_STRNCASECMP 1\n#cmakedefine HAVE_VSSCANF 1\n#cmakedefine HAVE_VSNPRINTF 1\n#cmakedefine HAVE_M_PI 1\n#cmakedefine HAVE_ATAN 1\n#cmakedefine HAVE_ATAN2 1\n#cmakedefine HAVE_ACOS 1\n#cmakedefine HAVE_ASIN 1\n#cmakedefine HAVE_CEIL 1\n#cmakedefine HAVE_COPYSIGN 1\n#cmakedefine HAVE_COS 1\n#cmakedefine HAVE_COSF 1\n#cmakedefine HAVE_FABS 1\n#cmakedefine HAVE_FLOOR 1\n#cmakedefine HAVE_LOG 1\n#cmakedefine HAVE_POW 1\n#cmakedefine HAVE_SCALBN 1\n#cmakedefine HAVE_SIN 1\n#cmakedefine HAVE_SINF 1\n#cmakedefine HAVE_SQRT 1\n#cmakedefine HAVE_SQRTF 1\n#cmakedefine HAVE_TAN 1\n#cmakedefine HAVE_TANF 1\n#cmakedefine HAVE_FSEEKO 1\n#cmakedefine HAVE_FSEEKO64 1\n#cmakedefine HAVE_SIGACTION 1\n#cmakedefine HAVE_SA_SIGACTION 1\n#cmakedefine HAVE_SETJMP 1\n#cmakedefine HAVE_NANOSLEEP 1\n#cmakedefine HAVE_SYSCONF 1\n#cmakedefine HAVE_SYSCTLBYNAME 1\n#cmakedefine HAVE_CLOCK_GETTIME 1\n#cmakedefine HAVE_GETPAGESIZE 1\n#cmakedefine HAVE_MPROTECT 1\n#cmakedefine HAVE_ICONV 1\n#cmakedefine HAVE_PTHREAD_SETNAME_NP 1\n#cmakedefine HAVE_PTHREAD_SET_NAME_NP 1\n#cmakedefine HAVE_SEM_TIMEDWAIT 1\n#elif __WIN32__\n#cmakedefine HAVE_STDARG_H 1\n#cmakedefine HAVE_STDDEF_H 1\n#else\n/* We may need some replacement for stdarg.h here */\n#include <stdarg.h>\n#endif /* HAVE_LIBC */\n\n/* SDL internal assertion support */\n#cmakedefine SDL_DEFAULT_ASSERT_LEVEL @SDL_DEFAULT_ASSERT_LEVEL@\n\n/* Allow disabling of core subsystems */\n#cmakedefine SDL_ATOMIC_DISABLED @SDL_ATOMIC_DISABLED@\n#cmakedefine SDL_AUDIO_DISABLED @SDL_AUDIO_DISABLED@\n#cmakedefine SDL_CPUINFO_DISABLED @SDL_CPUINFO_DISABLED@\n#cmakedefine SDL_EVENTS_DISABLED @SDL_EVENTS_DISABLED@\n#cmakedefine SDL_FILE_DISABLED @SDL_FILE_DISABLED@\n#cmakedefine SDL_JOYSTICK_DISABLED @SDL_JOYSTICK_DISABLED@\n#cmakedefine SDL_HAPTIC_DISABLED @SDL_HAPTIC_DISABLED@\n#cmakedefine SDL_LOADSO_DISABLED @SDL_LOADSO_DISABLED@\n#cmakedefine SDL_RENDER_DISABLED @SDL_RENDER_DISABLED@\n#cmakedefine SDL_THREADS_DISABLED @SDL_THREADS_DISABLED@\n#cmakedefine SDL_TIMERS_DISABLED @SDL_TIMERS_DISABLED@\n#cmakedefine SDL_VIDEO_DISABLED @SDL_VIDEO_DISABLED@\n#cmakedefine SDL_POWER_DISABLED @SDL_POWER_DISABLED@\n#cmakedefine SDL_FILESYSTEM_DISABLED @SDL_FILESYSTEM_DISABLED@\n\n/* Enable various audio drivers */\n#cmakedefine SDL_AUDIO_DRIVER_ANDROID @SDL_AUDIO_DRIVER_ANDROID@\n#cmakedefine SDL_AUDIO_DRIVER_ALSA @SDL_AUDIO_DRIVER_ALSA@\n#cmakedefine SDL_AUDIO_DRIVER_ALSA_DYNAMIC @SDL_AUDIO_DRIVER_ALSA_DYNAMIC@\n#cmakedefine SDL_AUDIO_DRIVER_ARTS @SDL_AUDIO_DRIVER_ARTS@\n#cmakedefine SDL_AUDIO_DRIVER_ARTS_DYNAMIC @SDL_AUDIO_DRIVER_ARTS_DYNAMIC@\n#cmakedefine SDL_AUDIO_DRIVER_PULSEAUDIO @SDL_AUDIO_DRIVER_PULSEAUDIO@\n#cmakedefine SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC @SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC@\n#cmakedefine SDL_AUDIO_DRIVER_HAIKU @SDL_AUDIO_DRIVER_HAIKU@\n#cmakedefine SDL_AUDIO_DRIVER_BSD @SDL_AUDIO_DRIVER_BSD@\n#cmakedefine SDL_AUDIO_DRIVER_COREAUDIO @SDL_AUDIO_DRIVER_COREAUDIO@\n#cmakedefine SDL_AUDIO_DRIVER_DISK @SDL_AUDIO_DRIVER_DISK@\n#cmakedefine SDL_AUDIO_DRIVER_DUMMY @SDL_AUDIO_DRIVER_DUMMY@\n#cmakedefine SDL_AUDIO_DRIVER_XAUDIO2 @SDL_AUDIO_DRIVER_XAUDIO2@\n#cmakedefine SDL_AUDIO_DRIVER_DSOUND @SDL_AUDIO_DRIVER_DSOUND@\n#cmakedefine SDL_AUDIO_DRIVER_ESD @SDL_AUDIO_DRIVER_ESD@\n#cmakedefine SDL_AUDIO_DRIVER_ESD_DYNAMIC @SDL_AUDIO_DRIVER_ESD_DYNAMIC@\n#cmakedefine SDL_AUDIO_DRIVER_NAS @SDL_AUDIO_DRIVER_NAS@\n#cmakedefine SDL_AUDIO_DRIVER_NAS_DYNAMIC @SDL_AUDIO_DRIVER_NAS_DYNAMIC@\n#cmakedefine SDL_AUDIO_DRIVER_SNDIO @SDL_AUDIO_DRIVER_SNDIO@\n#cmakedefine SDL_AUDIO_DRIVER_SNDIO_DYNAMIC @SDL_AUDIO_DRIVER_SNDIO_DYNAMIC@\n#cmakedefine SDL_AUDIO_DRIVER_OSS @SDL_AUDIO_DRIVER_OSS@\n#cmakedefine SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H @SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H@\n#cmakedefine SDL_AUDIO_DRIVER_PAUDIO @SDL_AUDIO_DRIVER_PAUDIO@\n#cmakedefine SDL_AUDIO_DRIVER_QSA @SDL_AUDIO_DRIVER_QSA@\n#cmakedefine SDL_AUDIO_DRIVER_SUNAUDIO @SDL_AUDIO_DRIVER_SUNAUDIO@\n#cmakedefine SDL_AUDIO_DRIVER_WINMM @SDL_AUDIO_DRIVER_WINMM@\n#cmakedefine SDL_AUDIO_DRIVER_FUSIONSOUND @SDL_AUDIO_DRIVER_FUSIONSOUND@\n#cmakedefine SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC @SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC@\n#cmakedefine SDL_AUDIO_DRIVER_EMSCRIPTEN @SDL_AUDIO_DRIVER_EMSCRIPTEN@\n\n/* Enable various input drivers */\n#cmakedefine SDL_INPUT_LINUXEV @SDL_INPUT_LINUXEV@\n#cmakedefine SDL_INPUT_LINUXKD @SDL_INPUT_LINUXKD@\n#cmakedefine SDL_INPUT_TSLIB @SDL_INPUT_TSLIB@\n#cmakedefine SDL_JOYSTICK_ANDROID @SDL_JOYSTICK_ANDROID@\n#cmakedefine SDL_JOYSTICK_HAIKU @SDL_JOYSTICK_HAIKU@\n#cmakedefine SDL_JOYSTICK_DINPUT @SDL_JOYSTICK_DINPUT@\n#cmakedefine SDL_JOYSTICK_XINPUT @SDL_JOYSTICK_XINPUT@\n#cmakedefine SDL_JOYSTICK_DUMMY @SDL_JOYSTICK_DUMMY@\n#cmakedefine SDL_JOYSTICK_IOKIT @SDL_JOYSTICK_IOKIT@\n#cmakedefine SDL_JOYSTICK_MFI @SDL_JOYSTICK_MFI@\n#cmakedefine SDL_JOYSTICK_LINUX @SDL_JOYSTICK_LINUX@\n#cmakedefine SDL_JOYSTICK_WINMM @SDL_JOYSTICK_WINMM@\n#cmakedefine SDL_JOYSTICK_USBHID @SDL_JOYSTICK_USBHID@\n#cmakedefine SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H @SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H@\n#cmakedefine SDL_JOYSTICK_EMSCRIPTEN @SDL_JOYSTICK_EMSCRIPTEN@\n#cmakedefine SDL_HAPTIC_DUMMY @SDL_HAPTIC_DUMMY@\n#cmakedefine SDL_HAPTIC_LINUX @SDL_HAPTIC_LINUX@\n#cmakedefine SDL_HAPTIC_IOKIT @SDL_HAPTIC_IOKIT@\n#cmakedefine SDL_HAPTIC_DINPUT @SDL_HAPTIC_DINPUT@\n#cmakedefine SDL_HAPTIC_XINPUT @SDL_HAPTIC_XINPUT@\n\n/* Enable various shared object loading systems */\n#cmakedefine SDL_LOADSO_HAIKU @SDL_LOADSO_HAIKU@\n#cmakedefine SDL_LOADSO_DLOPEN @SDL_LOADSO_DLOPEN@\n#cmakedefine SDL_LOADSO_DUMMY @SDL_LOADSO_DUMMY@\n#cmakedefine SDL_LOADSO_LDG @SDL_LOADSO_LDG@\n#cmakedefine SDL_LOADSO_WINDOWS @SDL_LOADSO_WINDOWS@\n\n/* Enable various threading systems */\n#cmakedefine SDL_THREAD_PTHREAD @SDL_THREAD_PTHREAD@\n#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX@\n#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP@\n#cmakedefine SDL_THREAD_WINDOWS @SDL_THREAD_WINDOWS@\n\n/* Enable various timer systems */\n#cmakedefine SDL_TIMER_HAIKU @SDL_TIMER_HAIKU@\n#cmakedefine SDL_TIMER_DUMMY @SDL_TIMER_DUMMY@\n#cmakedefine SDL_TIMER_UNIX @SDL_TIMER_UNIX@\n#cmakedefine SDL_TIMER_WINDOWS @SDL_TIMER_WINDOWS@\n#cmakedefine SDL_TIMER_WINCE @SDL_TIMER_WINCE@\n\n/* Enable various video drivers */\n#cmakedefine SDL_VIDEO_DRIVER_ANDROID @SDL_VIDEO_DRIVER_ANDROID@\n#cmakedefine SDL_VIDEO_DRIVER_HAIKU @SDL_VIDEO_DRIVER_HAIKU@\n#cmakedefine SDL_VIDEO_DRIVER_COCOA @SDL_VIDEO_DRIVER_COCOA@\n#cmakedefine SDL_VIDEO_DRIVER_DIRECTFB @SDL_VIDEO_DRIVER_DIRECTFB@\n#cmakedefine SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC @SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC@\n#cmakedefine SDL_VIDEO_DRIVER_DUMMY @SDL_VIDEO_DRIVER_DUMMY@\n#cmakedefine SDL_VIDEO_DRIVER_WINDOWS @SDL_VIDEO_DRIVER_WINDOWS@\n#cmakedefine SDL_VIDEO_DRIVER_WAYLAND @SDL_VIDEO_DRIVER_WAYLAND@\n#cmakedefine SDL_VIDEO_DRIVER_RPI @SDL_VIDEO_DRIVER_RPI@\n#cmakedefine SDL_VIDEO_DRIVER_VIVANTE @SDL_VIDEO_DRIVER_VIVANTE@\n#cmakedefine SDL_VIDEO_DRIVER_VIVANTE_VDK @SDL_VIDEO_DRIVER_VIVANTE_VDK@\n\n#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH @SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH@\n#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC@\n#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL@\n#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR@\n#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON@\n\n#cmakedefine SDL_VIDEO_DRIVER_MIR @SDL_VIDEO_DRIVER_MIR@\n#cmakedefine SDL_VIDEO_DRIVER_MIR_DYNAMIC @SDL_VIDEO_DRIVER_MIR_DYNAMIC@\n#cmakedefine SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON @SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON@\n#cmakedefine SDL_VIDEO_DRIVER_EMSCRIPTEN @SDL_VIDEO_DRIVER_EMSCRIPTEN@\n#cmakedefine SDL_VIDEO_DRIVER_X11 @SDL_VIDEO_DRIVER_X11@\n#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC @SDL_VIDEO_DRIVER_X11_DYNAMIC@\n#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT @SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT@\n#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR @SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR@\n#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA @SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA@\n#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 @SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2@\n#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR @SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR@\n#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS @SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS@\n#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE @SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE@\n#cmakedefine SDL_VIDEO_DRIVER_X11_XCURSOR @SDL_VIDEO_DRIVER_X11_XCURSOR@\n#cmakedefine SDL_VIDEO_DRIVER_X11_XDBE @SDL_VIDEO_DRIVER_X11_XDBE@\n#cmakedefine SDL_VIDEO_DRIVER_X11_XINERAMA @SDL_VIDEO_DRIVER_X11_XINERAMA@\n#cmakedefine SDL_VIDEO_DRIVER_X11_XINPUT2 @SDL_VIDEO_DRIVER_X11_XINPUT2@\n#cmakedefine SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH @SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH@\n#cmakedefine SDL_VIDEO_DRIVER_X11_XRANDR @SDL_VIDEO_DRIVER_X11_XRANDR@\n#cmakedefine SDL_VIDEO_DRIVER_X11_XSCRNSAVER @SDL_VIDEO_DRIVER_X11_XSCRNSAVER@\n#cmakedefine SDL_VIDEO_DRIVER_X11_XSHAPE @SDL_VIDEO_DRIVER_X11_XSHAPE@\n#cmakedefine SDL_VIDEO_DRIVER_X11_XVIDMODE @SDL_VIDEO_DRIVER_X11_XVIDMODE@\n#cmakedefine SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS @SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS@\n#cmakedefine SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY @SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY@\n#cmakedefine SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM @SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM@\n\n#cmakedefine SDL_VIDEO_RENDER_D3D @SDL_VIDEO_RENDER_D3D@\n#cmakedefine SDL_VIDEO_RENDER_D3D11 @SDL_VIDEO_RENDER_D3D11@\n#cmakedefine SDL_VIDEO_RENDER_OGL @SDL_VIDEO_RENDER_OGL@\n#cmakedefine SDL_VIDEO_RENDER_OGL_ES @SDL_VIDEO_RENDER_OGL_ES@\n#cmakedefine SDL_VIDEO_RENDER_OGL_ES2 @SDL_VIDEO_RENDER_OGL_ES2@\n#cmakedefine SDL_VIDEO_RENDER_DIRECTFB @SDL_VIDEO_RENDER_DIRECTFB@\n\n/* Enable OpenGL support */\n#cmakedefine SDL_VIDEO_OPENGL @SDL_VIDEO_OPENGL@\n#cmakedefine SDL_VIDEO_OPENGL_ES @SDL_VIDEO_OPENGL_ES@\n#cmakedefine SDL_VIDEO_OPENGL_ES2 @SDL_VIDEO_OPENGL_ES2@\n#cmakedefine SDL_VIDEO_OPENGL_BGL @SDL_VIDEO_OPENGL_BGL@\n#cmakedefine SDL_VIDEO_OPENGL_CGL @SDL_VIDEO_OPENGL_CGL@\n#cmakedefine SDL_VIDEO_OPENGL_GLX @SDL_VIDEO_OPENGL_GLX@\n#cmakedefine SDL_VIDEO_OPENGL_WGL @SDL_VIDEO_OPENGL_WGL@\n#cmakedefine SDL_VIDEO_OPENGL_EGL @SDL_VIDEO_OPENGL_EGL@\n#cmakedefine SDL_VIDEO_OPENGL_OSMESA @SDL_VIDEO_OPENGL_OSMESA@\n#cmakedefine SDL_VIDEO_OPENGL_OSMESA_DYNAMIC @SDL_VIDEO_OPENGL_OSMESA_DYNAMIC@\n\n/* Enable system power support */\n#cmakedefine SDL_POWER_ANDROID @SDL_POWER_ANDROID@\n#cmakedefine SDL_POWER_LINUX @SDL_POWER_LINUX@\n#cmakedefine SDL_POWER_WINDOWS @SDL_POWER_WINDOWS@\n#cmakedefine SDL_POWER_MACOSX @SDL_POWER_MACOSX@\n#cmakedefine SDL_POWER_HAIKU @SDL_POWER_HAIKU@\n#cmakedefine SDL_POWER_EMSCRIPTEN @SDL_POWER_EMSCRIPTEN@\n#cmakedefine SDL_POWER_HARDWIRED @SDL_POWER_HARDWIRED@\n\n/* Enable system filesystem support */\n#cmakedefine SDL_FILESYSTEM_ANDROID @SDL_FILESYSTEM_ANDROID@\n#cmakedefine SDL_FILESYSTEM_HAIKU @SDL_FILESYSTEM_HAIKU@\n#cmakedefine SDL_FILESYSTEM_COCOA @SDL_FILESYSTEM_COCOA@\n#cmakedefine SDL_FILESYSTEM_DUMMY @SDL_FILESYSTEM_DUMMY@\n#cmakedefine SDL_FILESYSTEM_UNIX @SDL_FILESYSTEM_UNIX@\n#cmakedefine SDL_FILESYSTEM_WINDOWS @SDL_FILESYSTEM_WINDOWS@\n#cmakedefine SDL_FILESYSTEM_EMSCRIPTEN @SDL_FILESYSTEM_EMSCRIPTEN@\n\n/* Enable assembly routines */\n#cmakedefine SDL_ASSEMBLY_ROUTINES @SDL_ASSEMBLY_ROUTINES@\n#cmakedefine SDL_ALTIVEC_BLITTERS @SDL_ALTIVEC_BLITTERS@\n\n\n/* Platform specific definitions */\n#if !defined(__WIN32__)\n#  if !defined(_STDINT_H_) && !defined(_STDINT_H) && !defined(HAVE_STDINT_H) && !defined(_HAVE_STDINT_H)\ntypedef unsigned int size_t;\ntypedef signed char int8_t;\ntypedef unsigned char uint8_t;\ntypedef signed short int16_t;\ntypedef unsigned short uint16_t;\ntypedef signed int int32_t;\ntypedef unsigned int uint32_t;\ntypedef signed long long int64_t;\ntypedef unsigned long long uint64_t;\ntypedef unsigned long uintptr_t;\n#  endif /* if (stdint.h isn't available) */\n#else /* __WIN32__ */\n#  if !defined(_STDINT_H_) && !defined(HAVE_STDINT_H) && !defined(_HAVE_STDINT_H)\n#    if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__)\n#define HAVE_STDINT_H\t1\n#    elif defined(_MSC_VER)\ntypedef signed __int8 int8_t;\ntypedef unsigned __int8 uint8_t;\ntypedef signed __int16 int16_t;\ntypedef unsigned __int16 uint16_t;\ntypedef signed __int32 int32_t;\ntypedef unsigned __int32 uint32_t;\ntypedef signed __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#      ifndef _UINTPTR_T_DEFINED\n#        ifdef  _WIN64\ntypedef unsigned __int64 uintptr_t;\n#          else\ntypedef unsigned int uintptr_t;\n#        endif\n#define _UINTPTR_T_DEFINED\n#      endif\n/* Older Visual C++ headers don't have the Win64-compatible typedefs... */\n#      if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR)))\n#define DWORD_PTR DWORD\n#      endif\n#      if ((_MSC_VER <= 1200) && (!defined(LONG_PTR)))\n#define LONG_PTR LONG\n#      endif\n#    else /* !__GNUC__ && !_MSC_VER */\ntypedef signed char int8_t;\ntypedef unsigned char uint8_t;\ntypedef signed short int16_t;\ntypedef unsigned short uint16_t;\ntypedef signed int int32_t;\ntypedef unsigned int uint32_t;\ntypedef signed long long int64_t;\ntypedef unsigned long long uint64_t;\n#      ifndef _SIZE_T_DEFINED_\n#define _SIZE_T_DEFINED_\ntypedef unsigned int size_t;\n#      endif\ntypedef unsigned int uintptr_t;\n#    endif /* __GNUC__ || _MSC_VER */\n#  endif /* !_STDINT_H_ && !HAVE_STDINT_H */\n#endif /* __WIN32__ */\n\n#endif /* _SDL_config_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config.h.in",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_h\n#define _SDL_config_h\n\n/**\n *  \\file SDL_config.h.in\n *\n *  This is a set of defines to configure the SDL features\n */\n\n/* General platform specific identifiers */\n#include \"SDL_platform.h\"\n\n/* Make sure that this isn't included by Visual C++ */\n#ifdef _MSC_VER\n#error You should run hg revert SDL_config.h \n#endif\n\n/* C language features */\n#undef const\n#undef inline\n#undef volatile\n\n/* C datatypes */\n#ifdef __LP64__\n#define SIZEOF_VOIDP 8\n#else\n#define SIZEOF_VOIDP 4\n#endif\n#undef HAVE_GCC_ATOMICS\n#undef HAVE_GCC_SYNC_LOCK_TEST_AND_SET\n\n#undef HAVE_DDRAW_H\n#undef HAVE_DINPUT_H\n#undef HAVE_DSOUND_H\n#undef HAVE_DXGI_H\n#undef HAVE_XINPUT_H\n\n/* Comment this if you want to build without any C library requirements */\n#undef HAVE_LIBC\n#if HAVE_LIBC\n\n/* Useful headers */\n#undef HAVE_ALLOCA_H\n#undef HAVE_SYS_TYPES_H\n#undef HAVE_STDIO_H\n#undef STDC_HEADERS\n#undef HAVE_STDLIB_H\n#undef HAVE_STDARG_H\n#undef HAVE_MALLOC_H\n#undef HAVE_MEMORY_H\n#undef HAVE_STRING_H\n#undef HAVE_STRINGS_H\n#undef HAVE_INTTYPES_H\n#undef HAVE_STDINT_H\n#undef HAVE_CTYPE_H\n#undef HAVE_MATH_H\n#undef HAVE_ICONV_H\n#undef HAVE_SIGNAL_H\n#undef HAVE_ALTIVEC_H\n#undef HAVE_PTHREAD_NP_H\n#undef HAVE_LIBUDEV_H\n#undef HAVE_DBUS_DBUS_H\n#undef HAVE_IBUS_IBUS_H\n#undef HAVE_FCITX_FRONTEND_H\n\n/* C library functions */\n#undef HAVE_MALLOC\n#undef HAVE_CALLOC\n#undef HAVE_REALLOC\n#undef HAVE_FREE\n#undef HAVE_ALLOCA\n#ifndef __WIN32__ /* Don't use C runtime versions of these on Windows */\n#undef HAVE_GETENV\n#undef HAVE_SETENV\n#undef HAVE_PUTENV\n#undef HAVE_UNSETENV\n#endif\n#undef HAVE_QSORT\n#undef HAVE_ABS\n#undef HAVE_BCOPY\n#undef HAVE_MEMSET\n#undef HAVE_MEMCPY\n#undef HAVE_MEMMOVE\n#undef HAVE_MEMCMP\n#undef HAVE_STRLEN\n#undef HAVE_STRLCPY\n#undef HAVE_STRLCAT\n#undef HAVE_STRDUP\n#undef HAVE__STRREV\n#undef HAVE__STRUPR\n#undef HAVE__STRLWR\n#undef HAVE_INDEX\n#undef HAVE_RINDEX\n#undef HAVE_STRCHR\n#undef HAVE_STRRCHR\n#undef HAVE_STRSTR\n#undef HAVE_ITOA\n#undef HAVE__LTOA\n#undef HAVE__UITOA\n#undef HAVE__ULTOA\n#undef HAVE_STRTOL\n#undef HAVE_STRTOUL\n#undef HAVE__I64TOA\n#undef HAVE__UI64TOA\n#undef HAVE_STRTOLL\n#undef HAVE_STRTOULL\n#undef HAVE_STRTOD\n#undef HAVE_ATOI\n#undef HAVE_ATOF\n#undef HAVE_STRCMP\n#undef HAVE_STRNCMP\n#undef HAVE__STRICMP\n#undef HAVE_STRCASECMP\n#undef HAVE__STRNICMP\n#undef HAVE_STRNCASECMP\n#undef HAVE_SSCANF\n#undef HAVE_VSSCANF\n#undef HAVE_SNPRINTF\n#undef HAVE_VSNPRINTF\n#undef HAVE_M_PI\n#undef HAVE_ATAN\n#undef HAVE_ATAN2\n#undef HAVE_ACOS\n#undef HAVE_ASIN\n#undef HAVE_CEIL\n#undef HAVE_COPYSIGN\n#undef HAVE_COS\n#undef HAVE_COSF\n#undef HAVE_FABS\n#undef HAVE_FLOOR\n#undef HAVE_LOG\n#undef HAVE_POW\n#undef HAVE_SCALBN\n#undef HAVE_SIN\n#undef HAVE_SINF\n#undef HAVE_SQRT\n#undef HAVE_SQRTF\n#undef HAVE_TAN\n#undef HAVE_TANF\n#undef HAVE_FSEEKO\n#undef HAVE_FSEEKO64\n#undef HAVE_SIGACTION\n#undef HAVE_SA_SIGACTION\n#undef HAVE_SETJMP\n#undef HAVE_NANOSLEEP\n#undef HAVE_SYSCONF\n#undef HAVE_SYSCTLBYNAME\n#undef HAVE_CLOCK_GETTIME\n#undef HAVE_GETPAGESIZE\n#undef HAVE_MPROTECT\n#undef HAVE_ICONV\n#undef HAVE_PTHREAD_SETNAME_NP\n#undef HAVE_PTHREAD_SET_NAME_NP\n#undef HAVE_SEM_TIMEDWAIT\n\n#else\n#define HAVE_STDARG_H   1\n#define HAVE_STDDEF_H   1\n#define HAVE_STDINT_H   1\n#endif /* HAVE_LIBC */\n\n/* SDL internal assertion support */\n#undef SDL_DEFAULT_ASSERT_LEVEL\n\n/* Allow disabling of core subsystems */\n#undef SDL_ATOMIC_DISABLED\n#undef SDL_AUDIO_DISABLED\n#undef SDL_CPUINFO_DISABLED\n#undef SDL_EVENTS_DISABLED\n#undef SDL_FILE_DISABLED\n#undef SDL_JOYSTICK_DISABLED\n#undef SDL_HAPTIC_DISABLED\n#undef SDL_LOADSO_DISABLED\n#undef SDL_RENDER_DISABLED\n#undef SDL_THREADS_DISABLED\n#undef SDL_TIMERS_DISABLED\n#undef SDL_VIDEO_DISABLED\n#undef SDL_POWER_DISABLED\n#undef SDL_FILESYSTEM_DISABLED\n\n/* Enable various audio drivers */\n#undef SDL_AUDIO_DRIVER_ALSA\n#undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC\n#undef SDL_AUDIO_DRIVER_ARTS\n#undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC\n#undef SDL_AUDIO_DRIVER_PULSEAUDIO\n#undef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC\n#undef SDL_AUDIO_DRIVER_HAIKU\n#undef SDL_AUDIO_DRIVER_BSD\n#undef SDL_AUDIO_DRIVER_COREAUDIO\n#undef SDL_AUDIO_DRIVER_DISK\n#undef SDL_AUDIO_DRIVER_DUMMY\n#undef SDL_AUDIO_DRIVER_ANDROID\n#undef SDL_AUDIO_DRIVER_XAUDIO2\n#undef SDL_AUDIO_DRIVER_DSOUND\n#undef SDL_AUDIO_DRIVER_ESD\n#undef SDL_AUDIO_DRIVER_ESD_DYNAMIC\n#undef SDL_AUDIO_DRIVER_NACL\n#undef SDL_AUDIO_DRIVER_NAS\n#undef SDL_AUDIO_DRIVER_NAS_DYNAMIC\n#undef SDL_AUDIO_DRIVER_SNDIO\n#undef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC\n#undef SDL_AUDIO_DRIVER_OSS\n#undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H\n#undef SDL_AUDIO_DRIVER_PAUDIO\n#undef SDL_AUDIO_DRIVER_QSA\n#undef SDL_AUDIO_DRIVER_SUNAUDIO\n#undef SDL_AUDIO_DRIVER_WINMM\n#undef SDL_AUDIO_DRIVER_FUSIONSOUND\n#undef SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC\n#undef SDL_AUDIO_DRIVER_EMSCRIPTEN\n\n/* Enable various input drivers */\n#undef SDL_INPUT_LINUXEV\n#undef SDL_INPUT_LINUXKD\n#undef SDL_INPUT_TSLIB\n#undef SDL_JOYSTICK_HAIKU\n#undef SDL_JOYSTICK_DINPUT\n#undef SDL_JOYSTICK_XINPUT\n#undef SDL_JOYSTICK_DUMMY\n#undef SDL_JOYSTICK_IOKIT\n#undef SDL_JOYSTICK_LINUX\n#undef SDL_JOYSTICK_ANDROID\n#undef SDL_JOYSTICK_WINMM\n#undef SDL_JOYSTICK_USBHID\n#undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H\n#undef SDL_JOYSTICK_EMSCRIPTEN\n#undef SDL_HAPTIC_DUMMY\n#undef SDL_HAPTIC_LINUX\n#undef SDL_HAPTIC_IOKIT\n#undef SDL_HAPTIC_DINPUT\n#undef SDL_HAPTIC_XINPUT\n\n/* Enable various shared object loading systems */\n#undef SDL_LOADSO_HAIKU\n#undef SDL_LOADSO_DLOPEN\n#undef SDL_LOADSO_DUMMY\n#undef SDL_LOADSO_LDG\n#undef SDL_LOADSO_WINDOWS\n\n/* Enable various threading systems */\n#undef SDL_THREAD_PTHREAD\n#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX\n#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP\n#undef SDL_THREAD_WINDOWS\n\n/* Enable various timer systems */\n#undef SDL_TIMER_HAIKU\n#undef SDL_TIMER_DUMMY\n#undef SDL_TIMER_UNIX\n#undef SDL_TIMER_WINDOWS\n\n/* Enable various video drivers */\n#undef SDL_VIDEO_DRIVER_HAIKU\n#undef SDL_VIDEO_DRIVER_COCOA\n#undef SDL_VIDEO_DRIVER_DIRECTFB\n#undef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC\n#undef SDL_VIDEO_DRIVER_DUMMY\n#undef SDL_VIDEO_DRIVER_WINDOWS\n#undef SDL_VIDEO_DRIVER_WAYLAND\n#undef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH\n#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC\n#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL\n#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR\n#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON\n#undef SDL_VIDEO_DRIVER_MIR\n#undef SDL_VIDEO_DRIVER_MIR_DYNAMIC\n#undef SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON\n#undef SDL_VIDEO_DRIVER_X11\n#undef SDL_VIDEO_DRIVER_RPI\n#undef SDL_VIDEO_DRIVER_ANDROID\n#undef SDL_VIDEO_DRIVER_EMSCRIPTEN\n#undef SDL_VIDEO_DRIVER_X11_DYNAMIC\n#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT\n#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR\n#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA\n#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2\n#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR\n#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS\n#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE\n#undef SDL_VIDEO_DRIVER_X11_XCURSOR\n#undef SDL_VIDEO_DRIVER_X11_XDBE\n#undef SDL_VIDEO_DRIVER_X11_XINERAMA\n#undef SDL_VIDEO_DRIVER_X11_XINPUT2\n#undef SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH\n#undef SDL_VIDEO_DRIVER_X11_XRANDR\n#undef SDL_VIDEO_DRIVER_X11_XSCRNSAVER\n#undef SDL_VIDEO_DRIVER_X11_XSHAPE\n#undef SDL_VIDEO_DRIVER_X11_XVIDMODE\n#undef SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS\n#undef SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY\n#undef SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM\n#undef SDL_VIDEO_DRIVER_NACL\n#undef SDL_VIDEO_DRIVER_VIVANTE\n#undef SDL_VIDEO_DRIVER_VIVANTE_VDK\n\n#undef SDL_VIDEO_RENDER_D3D\n#undef SDL_VIDEO_RENDER_D3D11\n#undef SDL_VIDEO_RENDER_OGL\n#undef SDL_VIDEO_RENDER_OGL_ES\n#undef SDL_VIDEO_RENDER_OGL_ES2\n#undef SDL_VIDEO_RENDER_DIRECTFB\n\n/* Enable OpenGL support */\n#undef SDL_VIDEO_OPENGL\n#undef SDL_VIDEO_OPENGL_ES\n#undef SDL_VIDEO_OPENGL_ES2\n#undef SDL_VIDEO_OPENGL_BGL\n#undef SDL_VIDEO_OPENGL_CGL\n#undef SDL_VIDEO_OPENGL_EGL\n#undef SDL_VIDEO_OPENGL_GLX\n#undef SDL_VIDEO_OPENGL_WGL\n#undef SDL_VIDEO_OPENGL_OSMESA\n#undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC\n\n/* Enable system power support */\n#undef SDL_POWER_LINUX\n#undef SDL_POWER_WINDOWS\n#undef SDL_POWER_MACOSX\n#undef SDL_POWER_HAIKU\n#undef SDL_POWER_ANDROID\n#undef SDL_POWER_EMSCRIPTEN\n#undef SDL_POWER_HARDWIRED\n\n/* Enable system filesystem support */\n#undef SDL_FILESYSTEM_HAIKU\n#undef SDL_FILESYSTEM_COCOA\n#undef SDL_FILESYSTEM_DUMMY\n#undef SDL_FILESYSTEM_UNIX\n#undef SDL_FILESYSTEM_WINDOWS\n#undef SDL_FILESYSTEM_NACL\n#undef SDL_FILESYSTEM_ANDROID\n#undef SDL_FILESYSTEM_EMSCRIPTEN\n\n/* Enable assembly routines */\n#undef SDL_ASSEMBLY_ROUTINES\n#undef SDL_ALTIVEC_BLITTERS\n\n/* Enable ime support */\n#undef SDL_USE_IME\n\n#endif /* _SDL_config_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config_android.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_android_h\n#define _SDL_config_android_h\n\n#include \"SDL_platform.h\"\n\n/**\n *  \\file SDL_config_android.h\n *\n *  This is a configuration that can be used to build SDL for Android\n */\n\n#include <stdarg.h>\n\n#define HAVE_GCC_ATOMICS    1\n\n#define HAVE_ALLOCA_H       1\n#define HAVE_SYS_TYPES_H    1\n#define HAVE_STDIO_H    1\n#define STDC_HEADERS    1\n#define HAVE_STRING_H   1\n#define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H   1\n#define HAVE_CTYPE_H    1\n#define HAVE_MATH_H 1\n#define HAVE_SIGNAL_H 1\n\n/* C library functions */\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC    1\n#define HAVE_FREE   1\n#define HAVE_ALLOCA 1\n#define HAVE_GETENV 1\n#define HAVE_SETENV 1\n#define HAVE_PUTENV 1\n#define HAVE_SETENV 1\n#define HAVE_UNSETENV   1\n#define HAVE_QSORT  1\n#define HAVE_ABS    1\n#define HAVE_BCOPY  1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE    1\n#define HAVE_MEMCMP 1\n#define HAVE_STRLEN 1\n#define HAVE_STRLCPY    1\n#define HAVE_STRLCAT    1\n#define HAVE_STRDUP 1\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR    1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL    1\n#define HAVE_STRTOLL    1\n#define HAVE_STRTOULL   1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI   1\n#define HAVE_ATOF 1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP    1\n#define HAVE_STRCASECMP 1\n#define HAVE_STRNCASECMP 1\n#define HAVE_VSSCANF 1\n#define HAVE_VSNPRINTF  1\n#define HAVE_M_PI   1\n#define HAVE_ATAN   1\n#define HAVE_ATAN2  1\n#define HAVE_ACOS  1\n#define HAVE_ASIN  1\n#define HAVE_CEIL   1\n#define HAVE_COPYSIGN   1\n#define HAVE_COS    1\n#define HAVE_COSF   1\n#define HAVE_FABS   1\n#define HAVE_FLOOR  1\n#define HAVE_LOG    1\n#define HAVE_POW    1\n#define HAVE_SCALBN 1\n#define HAVE_SIN    1\n#define HAVE_SINF   1\n#define HAVE_SQRT   1\n#define HAVE_SQRTF  1\n#define HAVE_TAN    1\n#define HAVE_TANF   1\n#define HAVE_SIGACTION 1\n#define HAVE_SETJMP 1\n#define HAVE_NANOSLEEP  1\n#define HAVE_SYSCONF    1\n#define HAVE_CLOCK_GETTIME\t1\n\n#define SIZEOF_VOIDP 4\n\n/* Enable various audio drivers */\n#define SDL_AUDIO_DRIVER_ANDROID    1\n#define SDL_AUDIO_DRIVER_DUMMY  1\n\n/* Enable various input drivers */\n#define SDL_JOYSTICK_ANDROID    1\n#define SDL_HAPTIC_DUMMY    1\n\n/* Enable various shared object loading systems */\n#define SDL_LOADSO_DLOPEN   1\n\n/* Enable various threading systems */\n#define SDL_THREAD_PTHREAD  1\n#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX  1\n\n/* Enable various timer systems */\n#define SDL_TIMER_UNIX  1\n\n/* Enable various video drivers */\n#define SDL_VIDEO_DRIVER_ANDROID 1\n\n/* Enable OpenGL ES */\n#define SDL_VIDEO_OPENGL_ES 1\n#define SDL_VIDEO_OPENGL_ES2 1\n#define SDL_VIDEO_OPENGL_EGL 1\n#define SDL_VIDEO_RENDER_OGL_ES 1\n#define SDL_VIDEO_RENDER_OGL_ES2    1\n\n/* Enable system power support */\n#define SDL_POWER_ANDROID 1\n\n/* Enable the filesystem driver */\n#define SDL_FILESYSTEM_ANDROID   1\n\n#endif /* _SDL_config_android_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config_iphoneos.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_iphoneos_h\n#define _SDL_config_iphoneos_h\n\n#include \"SDL_platform.h\"\n\n#ifdef __LP64__\n#define SIZEOF_VOIDP 8\n#else\n#define SIZEOF_VOIDP 4\n#endif\n\n#define HAVE_GCC_ATOMICS    1\n\n#define HAVE_ALLOCA_H       1\n#define HAVE_SYS_TYPES_H    1\n#define HAVE_STDIO_H    1\n#define STDC_HEADERS    1\n#define HAVE_STRING_H   1\n#define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H   1\n#define HAVE_CTYPE_H    1\n#define HAVE_MATH_H 1\n#define HAVE_SIGNAL_H   1\n\n/* C library functions */\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC    1\n#define HAVE_FREE   1\n#define HAVE_ALLOCA 1\n#define HAVE_GETENV 1\n#define HAVE_SETENV 1\n#define HAVE_PUTENV 1\n#define HAVE_SETENV 1\n#define HAVE_UNSETENV   1\n#define HAVE_QSORT  1\n#define HAVE_ABS    1\n#define HAVE_BCOPY  1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE    1\n#define HAVE_MEMCMP 1\n#define HAVE_STRLEN 1\n#define HAVE_STRLCPY    1\n#define HAVE_STRLCAT    1\n#define HAVE_STRDUP 1\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR    1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL    1\n#define HAVE_STRTOLL    1\n#define HAVE_STRTOULL   1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI   1\n#define HAVE_ATOF   1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP    1\n#define HAVE_STRCASECMP 1\n#define HAVE_STRNCASECMP 1\n#define HAVE_VSSCANF 1\n#define HAVE_VSNPRINTF  1\n#define HAVE_M_PI   1\n#define HAVE_ATAN   1\n#define HAVE_ATAN2  1\n#define HAVE_ACOS  1\n#define HAVE_ASIN  1\n#define HAVE_CEIL   1\n#define HAVE_COPYSIGN   1\n#define HAVE_COS    1\n#define HAVE_COSF   1\n#define HAVE_FABS   1\n#define HAVE_FLOOR  1\n#define HAVE_LOG    1\n#define HAVE_POW    1\n#define HAVE_SCALBN 1\n#define HAVE_SIN    1\n#define HAVE_SINF   1\n#define HAVE_SQRT   1\n#define HAVE_SQRTF  1\n#define HAVE_TAN    1\n#define HAVE_TANF   1\n#define HAVE_SIGACTION  1\n#define HAVE_SETJMP 1\n#define HAVE_NANOSLEEP  1\n#define HAVE_SYSCONF    1\n#define HAVE_SYSCTLBYNAME 1\n\n/* enable iPhone version of Core Audio driver */\n#define SDL_AUDIO_DRIVER_COREAUDIO 1\n/* Enable the dummy audio driver (src/audio/dummy/\\*.c) */\n#define SDL_AUDIO_DRIVER_DUMMY  1\n\n/* Enable the stub haptic driver (src/haptic/dummy/\\*.c) */\n#define SDL_HAPTIC_DUMMY 1\n\n/* Enable MFi joystick support */\n#define SDL_JOYSTICK_MFI 1\n\n/* Enable Unix style SO loading */\n#define SDL_LOADSO_DLOPEN 1\n\n/* Enable various threading systems */\n#define SDL_THREAD_PTHREAD  1\n#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX  1\n\n/* Enable various timer systems */\n#define SDL_TIMER_UNIX  1\n\n/* Supported video drivers */\n#define SDL_VIDEO_DRIVER_UIKIT  1\n#define SDL_VIDEO_DRIVER_DUMMY  1\n\n/* enable OpenGL ES */\n#define SDL_VIDEO_OPENGL_ES2 1\n#define SDL_VIDEO_OPENGL_ES 1\n#define SDL_VIDEO_RENDER_OGL_ES 1\n#define SDL_VIDEO_RENDER_OGL_ES2    1\n\n/* Enable system power support */\n#define SDL_POWER_UIKIT 1\n\n/* enable iPhone keyboard support */\n#define SDL_IPHONE_KEYBOARD 1\n\n/* enable iOS extended launch screen */\n#define SDL_IPHONE_LAUNCHSCREEN 1\n\n/* Set max recognized G-force from accelerometer\n   See src/joystick/uikit/SDL_sysjoystick.m for notes on why this is needed\n */\n#define SDL_IPHONE_MAX_GFORCE 5.0\n\n/* enable filesystem support */\n#define SDL_FILESYSTEM_COCOA   1\n\n#endif /* _SDL_config_iphoneos_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config_macosx.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_macosx_h\n#define _SDL_config_macosx_h\n\n#include \"SDL_platform.h\"\n\n/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */\n#include <AvailabilityMacros.h>\n\n/* This is a set of defines to configure the SDL features */\n\n#ifdef __LP64__\n    #define SIZEOF_VOIDP 8\n#else\n    #define SIZEOF_VOIDP 4\n#endif\n\n/* Useful headers */\n#define HAVE_ALLOCA_H       1\n#define HAVE_SYS_TYPES_H    1\n#define HAVE_STDIO_H    1\n#define STDC_HEADERS    1\n#define HAVE_STRING_H   1\n#define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H   1\n#define HAVE_CTYPE_H    1\n#define HAVE_MATH_H 1\n#define HAVE_SIGNAL_H   1\n\n/* C library functions */\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC    1\n#define HAVE_FREE   1\n#define HAVE_ALLOCA 1\n#define HAVE_GETENV 1\n#define HAVE_SETENV 1\n#define HAVE_PUTENV 1\n#define HAVE_UNSETENV   1\n#define HAVE_QSORT  1\n#define HAVE_ABS    1\n#define HAVE_BCOPY  1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE    1\n#define HAVE_MEMCMP 1\n#define HAVE_STRLEN 1\n#define HAVE_STRLCPY    1\n#define HAVE_STRLCAT    1\n#define HAVE_STRDUP 1\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR    1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL    1\n#define HAVE_STRTOLL    1\n#define HAVE_STRTOULL   1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI   1\n#define HAVE_ATOF   1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP    1\n#define HAVE_STRCASECMP 1\n#define HAVE_STRNCASECMP 1\n#define HAVE_VSSCANF 1\n#define HAVE_VSNPRINTF  1\n#define HAVE_CEIL   1\n#define HAVE_COPYSIGN   1\n#define HAVE_COS    1\n#define HAVE_COSF   1\n#define HAVE_FABS   1\n#define HAVE_FLOOR  1\n#define HAVE_LOG    1\n#define HAVE_POW    1\n#define HAVE_SCALBN 1\n#define HAVE_SIN    1\n#define HAVE_SINF   1\n#define HAVE_SQRT   1\n#define HAVE_SQRTF  1\n#define HAVE_TAN    1\n#define HAVE_TANF   1\n#define HAVE_SIGACTION  1\n#define HAVE_SETJMP 1\n#define HAVE_NANOSLEEP  1\n#define HAVE_SYSCONF    1\n#define HAVE_SYSCTLBYNAME 1\n#define HAVE_ATAN 1\n#define HAVE_ATAN2 1\n#define HAVE_ACOS 1\n#define HAVE_ASIN 1\n\n/* Enable various audio drivers */\n#define SDL_AUDIO_DRIVER_COREAUDIO  1\n#define SDL_AUDIO_DRIVER_DISK   1\n#define SDL_AUDIO_DRIVER_DUMMY  1\n\n/* Enable various input drivers */\n#define SDL_JOYSTICK_IOKIT  1\n#define SDL_HAPTIC_IOKIT    1\n\n/* Enable various shared object loading systems */\n#define SDL_LOADSO_DLOPEN   1\n\n/* Enable various threading systems */\n#define SDL_THREAD_PTHREAD  1\n#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX  1\n\n/* Enable various timer systems */\n#define SDL_TIMER_UNIX  1\n\n/* Enable various video drivers */\n#define SDL_VIDEO_DRIVER_COCOA  1\n#define SDL_VIDEO_DRIVER_DUMMY  1\n#undef SDL_VIDEO_DRIVER_X11\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC \"/usr/X11R6/lib/libX11.6.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT \"/usr/X11R6/lib/libXext.6.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA \"/usr/X11R6/lib/libXinerama.1.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 \"/usr/X11R6/lib/libXi.6.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR \"/usr/X11R6/lib/libXrandr.2.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS \"/usr/X11R6/lib/libXss.1.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE \"/usr/X11R6/lib/libXxf86vm.1.dylib\"\n#define SDL_VIDEO_DRIVER_X11_XDBE 1\n#define SDL_VIDEO_DRIVER_X11_XINERAMA 1\n#define SDL_VIDEO_DRIVER_X11_XRANDR 1\n#define SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1\n#define SDL_VIDEO_DRIVER_X11_XSHAPE 1\n#define SDL_VIDEO_DRIVER_X11_XVIDMODE 1\n#define SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM 1\n\n#ifdef MAC_OS_X_VERSION_10_8\n/*\n * No matter the versions targeted, this is the 10.8 or later SDK, so you have\n *  to use the external Xquartz, which is a more modern Xlib. Previous SDKs\n *  used an older Xlib.\n */\n#define SDL_VIDEO_DRIVER_X11_XINPUT2 1\n#define SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1\n#define SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY 1\n#endif\n\n#ifndef SDL_VIDEO_RENDER_OGL\n#define SDL_VIDEO_RENDER_OGL    1\n#endif\n\n/* Enable OpenGL support */\n#ifndef SDL_VIDEO_OPENGL\n#define SDL_VIDEO_OPENGL    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_CGL\n#define SDL_VIDEO_OPENGL_CGL    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_GLX\n#define SDL_VIDEO_OPENGL_GLX    1\n#endif\n\n/* Enable system power support */\n#define SDL_POWER_MACOSX 1\n\n/* enable filesystem support */\n#define SDL_FILESYSTEM_COCOA   1\n\n/* Enable assembly routines */\n#define SDL_ASSEMBLY_ROUTINES   1\n#ifdef __ppc__\n#define SDL_ALTIVEC_BLITTERS    1\n#endif\n\n#endif /* _SDL_config_macosx_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config_minimal.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_minimal_h\n#define _SDL_config_minimal_h\n\n#include \"SDL_platform.h\"\n\n/**\n *  \\file SDL_config_minimal.h\n *\n *  This is the minimal configuration that can be used to build SDL.\n */\n\n#define HAVE_STDARG_H   1\n#define HAVE_STDDEF_H   1\n\n/* Most everything except Visual Studio 2008 and earlier has stdint.h now */\n#if defined(_MSC_VER) && (_MSC_VER < 1600)\n/* Here are some reasonable defaults */\ntypedef unsigned int size_t;\ntypedef signed char int8_t;\ntypedef unsigned char uint8_t;\ntypedef signed short int16_t;\ntypedef unsigned short uint16_t;\ntypedef signed int int32_t;\ntypedef unsigned int uint32_t;\ntypedef signed long long int64_t;\ntypedef unsigned long long uint64_t;\ntypedef unsigned long uintptr_t;\n#else\n#define HAVE_STDINT_H 1\n#endif /* Visual Studio 2008 */\n\n#ifdef __GNUC__\n#define HAVE_GCC_SYNC_LOCK_TEST_AND_SET 1\n#endif\n\n/* Enable the dummy audio driver (src/audio/dummy/\\*.c) */\n#define SDL_AUDIO_DRIVER_DUMMY  1\n\n/* Enable the stub joystick driver (src/joystick/dummy/\\*.c) */\n#define SDL_JOYSTICK_DISABLED   1\n\n/* Enable the stub haptic driver (src/haptic/dummy/\\*.c) */\n#define SDL_HAPTIC_DISABLED 1\n\n/* Enable the stub shared object loader (src/loadso/dummy/\\*.c) */\n#define SDL_LOADSO_DISABLED 1\n\n/* Enable the stub thread support (src/thread/generic/\\*.c) */\n#define SDL_THREADS_DISABLED    1\n\n/* Enable the stub timer support (src/timer/dummy/\\*.c) */\n#define SDL_TIMERS_DISABLED 1\n\n/* Enable the dummy video driver (src/video/dummy/\\*.c) */\n#define SDL_VIDEO_DRIVER_DUMMY  1\n\n/* Enable the dummy filesystem driver (src/filesystem/dummy/\\*.c) */\n#define SDL_FILESYSTEM_DUMMY  1\n\n#endif /* _SDL_config_minimal_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config_pandora.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_h\n#define _SDL_config_h\n\n/* This is a set of defines to configure the SDL features */\n\n/* General platform specific identifiers */\n#include \"SDL_platform.h\"\n\n#ifdef __LP64__\n#define SIZEOF_VOIDP 8\n#else\n#define SIZEOF_VOIDP 4\n#endif\n\n#define SDL_BYTEORDER 1234\n\n#define HAVE_ALLOCA_H 1\n#define HAVE_SYS_TYPES_H 1\n#define HAVE_STDIO_H 1\n#define STDC_HEADERS 1\n#define HAVE_STDLIB_H 1\n#define HAVE_STDARG_H 1\n#define HAVE_MALLOC_H 1\n#define HAVE_MEMORY_H 1\n#define HAVE_STRING_H 1\n#define HAVE_STRINGS_H 1\n#define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H 1\n#define HAVE_CTYPE_H 1\n#define HAVE_MATH_H 1\n#define HAVE_ICONV_H 1\n#define HAVE_SIGNAL_H 1\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC 1\n#define HAVE_FREE 1\n#define HAVE_ALLOCA 1\n#define HAVE_GETENV 1\n#define HAVE_SETENV 1\n#define HAVE_PUTENV 1\n#define HAVE_UNSETENV 1\n#define HAVE_QSORT 1\n#define HAVE_ABS 1\n#define HAVE_BCOPY 1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE 1\n#define HAVE_STRLEN 1\n#define HAVE_STRDUP 1\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR 1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL 1\n#define HAVE_STRTOLL 1\n#define HAVE_STRTOULL 1\n#define HAVE_ATOI 1\n#define HAVE_ATOF 1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP 1\n#define HAVE_STRCASECMP 1\n#define HAVE_STRNCASECMP 1\n#define HAVE_VSSCANF 1\n#define HAVE_VSNPRINTF 1\n#define HAVE_M_PI 1\n#define HAVE_CEIL 1\n#define HAVE_COPYSIGN 1\n#define HAVE_COS 1\n#define HAVE_COSF 1\n#define HAVE_FABS 1\n#define HAVE_FLOOR 1\n#define HAVE_LOG 1\n#define HAVE_SCALBN 1\n#define HAVE_SIN 1\n#define HAVE_SINF 1\n#define HAVE_SQRT 1\n#define HAVE_SQRTF 1\n#define HAVE_TAN 1\n#define HAVE_TANF 1\n#define HAVE_SIGACTION 1\n#define HAVE_SETJMP 1\n#define HAVE_NANOSLEEP 1\n\n#define SDL_AUDIO_DRIVER_DUMMY 1\n#define SDL_AUDIO_DRIVER_OSS 1\n\n#define SDL_INPUT_LINUXEV 1\n#define SDL_INPUT_TSLIB 1\n#define SDL_JOYSTICK_LINUX 1\n#define SDL_HAPTIC_LINUX 1\n\n#define SDL_LOADSO_DLOPEN 1\n\n#define SDL_THREAD_PTHREAD 1\n#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1\n\n#define SDL_TIMER_UNIX 1\n#define SDL_FILESYSTEM_UNIX 1\n\n#define SDL_VIDEO_DRIVER_DUMMY 1\n#define SDL_VIDEO_DRIVER_X11 1\n#define SDL_VIDEO_DRIVER_PANDORA 1\n#define SDL_VIDEO_RENDER_OGL_ES 1\n#define SDL_VIDEO_OPENGL_ES 1\n\n#endif /* _SDL_config_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config_psp.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_psp_h\n#define _SDL_config_psp_h\n\n#include \"SDL_platform.h\"\n\n\n\n#ifdef __GNUC__\n#define HAVE_GCC_SYNC_LOCK_TEST_AND_SET 1\n#endif\n\n#define HAVE_GCC_ATOMICS    1\n\n#define HAVE_ALLOCA_H       1\n#define HAVE_SYS_TYPES_H    1\n#define HAVE_STDIO_H    1\n#define STDC_HEADERS    1\n#define HAVE_STRING_H   1\n#define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H   1\n#define HAVE_CTYPE_H    1\n#define HAVE_MATH_H 1\n#define HAVE_SIGNAL_H   1\n\n/* C library functions */\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC    1\n#define HAVE_FREE   1\n#define HAVE_ALLOCA 1\n#define HAVE_GETENV 1\n#define HAVE_SETENV 1\n#define HAVE_PUTENV 1\n#define HAVE_SETENV 1\n#define HAVE_UNSETENV   1\n#define HAVE_QSORT  1\n#define HAVE_ABS    1\n#define HAVE_BCOPY  1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE    1\n#define HAVE_MEMCMP 1\n#define HAVE_STRLEN 1\n#define HAVE_STRLCPY    1\n#define HAVE_STRLCAT    1\n#define HAVE_STRDUP 1\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR    1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL    1\n#define HAVE_STRTOLL    1\n#define HAVE_STRTOULL   1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI   1\n#define HAVE_ATOF   1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP    1\n#define HAVE_STRCASECMP 1\n#define HAVE_STRNCASECMP 1\n#define HAVE_VSSCANF 1\n#define HAVE_VSNPRINTF  1\n#define HAVE_M_PI   1\n#define HAVE_ATAN   1\n#define HAVE_ATAN2  1\n#define HAVE_ACOS  1\n#define HAVE_ASIN  1\n#define HAVE_CEIL   1\n#define HAVE_COPYSIGN   1\n#define HAVE_COS    1\n#define HAVE_COSF   1\n#define HAVE_FABS   1\n#define HAVE_FLOOR  1\n#define HAVE_LOG    1\n#define HAVE_POW    1\n#define HAVE_SCALBN 1\n#define HAVE_SIN    1\n#define HAVE_SINF   1\n#define HAVE_SQRT   1\n#define HAVE_SQRTF  1\n#define HAVE_TAN    1\n#define HAVE_TANF   1\n#define HAVE_SETJMP 1\n#define HAVE_NANOSLEEP  1\n/* #define HAVE_SYSCONF  1 */\n/* #define HAVE_SIGACTION    1 */\n\n\n/* PSP isn't that sophisticated */\n#define LACKS_SYS_MMAN_H 1\n\n/* Enable the stub thread support (src/thread/psp/\\*.c) */\n#define SDL_THREAD_PSP  1\n\n/* Enable the stub timer support (src/timer/psp/\\*.c) */\n#define SDL_TIMERS_PSP  1\n\n/* Enable the stub joystick driver (src/joystick/psp/\\*.c) */\n#define SDL_JOYSTICK_PSP        1\n\n/* Enable the stub audio driver (src/audio/psp/\\*.c) */\n#define SDL_AUDIO_DRIVER_PSP    1\n\n/* PSP video dirver */\n#define SDL_VIDEO_DRIVER_PSP   1\n\n/* PSP render dirver */\n#define SDL_VIDEO_RENDER_PSP   1\n\n#define SDL_POWER_PSP          1\n\n/* !!! FIXME: what does PSP do for filesystem stuff? */\n#define SDL_FILESYSTEM_DUMMY   1\n\n/* PSP doesn't have haptic device (src/haptic/dummy/\\*.c) */\n#define SDL_HAPTIC_DISABLED    1\n\n/* PSP can't load shared object (src/loadso/dummy/\\*.c) */\n#define SDL_LOADSO_DISABLED    1\n\n\n#endif /* _SDL_config_psp_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config_windows.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_windows_h\n#define _SDL_config_windows_h\n\n#include \"SDL_platform.h\"\n\n/* This is a set of defines to configure the SDL features */\n\n#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H)\n#if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__)\n#define HAVE_STDINT_H   1\n#elif defined(_MSC_VER)\ntypedef signed __int8 int8_t;\ntypedef unsigned __int8 uint8_t;\ntypedef signed __int16 int16_t;\ntypedef unsigned __int16 uint16_t;\ntypedef signed __int32 int32_t;\ntypedef unsigned __int32 uint32_t;\ntypedef signed __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#ifndef _UINTPTR_T_DEFINED\n#ifdef  _WIN64\ntypedef unsigned __int64 uintptr_t;\n#else\ntypedef unsigned int uintptr_t;\n#endif\n#define _UINTPTR_T_DEFINED\n#endif\n/* Older Visual C++ headers don't have the Win64-compatible typedefs... */\n#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR)))\n#define DWORD_PTR DWORD\n#endif\n#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR)))\n#define LONG_PTR LONG\n#endif\n#else /* !__GNUC__ && !_MSC_VER */\ntypedef signed char int8_t;\ntypedef unsigned char uint8_t;\ntypedef signed short int16_t;\ntypedef unsigned short uint16_t;\ntypedef signed int int32_t;\ntypedef unsigned int uint32_t;\ntypedef signed long long int64_t;\ntypedef unsigned long long uint64_t;\n#ifndef _SIZE_T_DEFINED_\n#define _SIZE_T_DEFINED_\ntypedef unsigned int size_t;\n#endif\ntypedef unsigned int uintptr_t;\n#endif /* __GNUC__ || _MSC_VER */\n#endif /* !_STDINT_H_ && !HAVE_STDINT_H */\n\n#ifdef _WIN64\n# define SIZEOF_VOIDP 8\n#else\n# define SIZEOF_VOIDP 4\n#endif\n\n#define HAVE_DDRAW_H 1\n#define HAVE_DINPUT_H 1\n#define HAVE_DSOUND_H 1\n#define HAVE_DXGI_H 1\n#define HAVE_XINPUT_H 1\n\n/* This is disabled by default to avoid C runtime dependencies and manifest requirements */\n#ifdef HAVE_LIBC\n/* Useful headers */\n#define HAVE_STDIO_H 1\n#define STDC_HEADERS 1\n#define HAVE_STRING_H 1\n#define HAVE_CTYPE_H 1\n#define HAVE_MATH_H 1\n#define HAVE_SIGNAL_H 1\n\n/* C library functions */\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC 1\n#define HAVE_FREE 1\n#define HAVE_ALLOCA 1\n#define HAVE_QSORT 1\n#define HAVE_ABS 1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE 1\n#define HAVE_MEMCMP 1\n#define HAVE_STRLEN 1\n#define HAVE__STRREV 1\n#define HAVE__STRUPR 1\n#define HAVE__STRLWR 1\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR 1\n#define HAVE_STRSTR 1\n#define HAVE__LTOA 1\n#define HAVE__ULTOA 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL 1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI 1\n#define HAVE_ATOF 1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP 1\n#define HAVE__STRICMP 1\n#define HAVE__STRNICMP 1\n#define HAVE_ATAN 1\n#define HAVE_ATAN2 1\n#define HAVE_ACOS  1\n#define HAVE_ASIN  1\n#define HAVE_CEIL 1\n#define HAVE_COS 1\n#define HAVE_COSF 1\n#define HAVE_FABS 1\n#define HAVE_FLOOR 1\n#define HAVE_LOG 1\n#define HAVE_POW 1\n#define HAVE_SIN 1\n#define HAVE_SINF 1\n#define HAVE_SQRT 1\n#define HAVE_SQRTF 1\n#define HAVE_TAN 1\n#define HAVE_TANF 1\n#if _MSC_VER >= 1800\n#define HAVE_STRTOLL 1\n#define HAVE_VSSCANF 1\n#define HAVE_COPYSIGN 1\n#define HAVE_SCALBN 1\n#endif\n#if !defined(_MSC_VER) || defined(_USE_MATH_DEFINES)\n#define HAVE_M_PI 1\n#endif\n#else\n#define HAVE_STDARG_H   1\n#define HAVE_STDDEF_H   1\n#endif\n\n/* Enable various audio drivers */\n#define SDL_AUDIO_DRIVER_DSOUND 1\n#define SDL_AUDIO_DRIVER_XAUDIO2    1\n#define SDL_AUDIO_DRIVER_WINMM  1\n#define SDL_AUDIO_DRIVER_DISK   1\n#define SDL_AUDIO_DRIVER_DUMMY  1\n\n/* Enable various input drivers */\n#define SDL_JOYSTICK_DINPUT 1\n#define SDL_JOYSTICK_XINPUT 1\n#define SDL_HAPTIC_DINPUT   1\n#define SDL_HAPTIC_XINPUT   1\n\n/* Enable various shared object loading systems */\n#define SDL_LOADSO_WINDOWS  1\n\n/* Enable various threading systems */\n#define SDL_THREAD_WINDOWS  1\n\n/* Enable various timer systems */\n#define SDL_TIMER_WINDOWS   1\n\n/* Enable various video drivers */\n#define SDL_VIDEO_DRIVER_DUMMY  1\n#define SDL_VIDEO_DRIVER_WINDOWS    1\n\n#ifndef SDL_VIDEO_RENDER_D3D\n#define SDL_VIDEO_RENDER_D3D    1\n#endif\n#ifndef SDL_VIDEO_RENDER_D3D11\n#define SDL_VIDEO_RENDER_D3D11\t0\n#endif\n\n/* Enable OpenGL support */\n#ifndef SDL_VIDEO_OPENGL\n#define SDL_VIDEO_OPENGL    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_WGL\n#define SDL_VIDEO_OPENGL_WGL    1\n#endif\n#ifndef SDL_VIDEO_RENDER_OGL\n#define SDL_VIDEO_RENDER_OGL    1\n#endif\n#ifndef SDL_VIDEO_RENDER_OGL_ES2\n#define SDL_VIDEO_RENDER_OGL_ES2    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_ES2\n#define SDL_VIDEO_OPENGL_ES2    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_EGL\n#define SDL_VIDEO_OPENGL_EGL    1\n#endif\n\n\n/* Enable system power support */\n#define SDL_POWER_WINDOWS 1\n\n/* Enable filesystem support */\n#define SDL_FILESYSTEM_WINDOWS  1\n\n/* Enable assembly routines (Win64 doesn't have inline asm) */\n#ifndef _WIN64\n#define SDL_ASSEMBLY_ROUTINES   1\n#endif\n\n#endif /* _SDL_config_windows_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config_winrt.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_winrt_h\n#define _SDL_config_winrt_h\n\n#include \"SDL_platform.h\"\n\n/* Make sure the Windows SDK's NTDDI_VERSION macro gets defined.  This is used\n   by SDL to determine which version of the Windows SDK is being used.\n*/\n#include <sdkddkver.h>\n\n/* Define possibly-undefined NTDDI values (used when compiling SDL against\n   older versions of the Windows SDK.\n*/\n#ifndef NTDDI_WINBLUE\n#define NTDDI_WINBLUE 0x06030000\n#endif\n#ifndef NTDDI_WIN10\n#define NTDDI_WIN10 0x0A000000\n#endif\n\n/* This is a set of defines to configure the SDL features */\n\n#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H)\n#if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__)\n#define HAVE_STDINT_H\t1\n#elif defined(_MSC_VER)\ntypedef signed __int8 int8_t;\ntypedef unsigned __int8 uint8_t;\ntypedef signed __int16 int16_t;\ntypedef unsigned __int16 uint16_t;\ntypedef signed __int32 int32_t;\ntypedef unsigned __int32 uint32_t;\ntypedef signed __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#ifndef _UINTPTR_T_DEFINED\n#ifdef  _WIN64\ntypedef unsigned __int64 uintptr_t;\n#else\ntypedef unsigned int uintptr_t;\n#endif\n#define _UINTPTR_T_DEFINED\n#endif\n/* Older Visual C++ headers don't have the Win64-compatible typedefs... */\n#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR)))\n#define DWORD_PTR DWORD\n#endif\n#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR)))\n#define LONG_PTR LONG\n#endif\n#else /* !__GNUC__ && !_MSC_VER */\ntypedef signed char int8_t;\ntypedef unsigned char uint8_t;\ntypedef signed short int16_t;\ntypedef unsigned short uint16_t;\ntypedef signed int int32_t;\ntypedef unsigned int uint32_t;\ntypedef signed long long int64_t;\ntypedef unsigned long long uint64_t;\n#ifndef _SIZE_T_DEFINED_\n#define _SIZE_T_DEFINED_\ntypedef unsigned int size_t;\n#endif\ntypedef unsigned int uintptr_t;\n#endif /* __GNUC__ || _MSC_VER */\n#endif /* !_STDINT_H_ && !HAVE_STDINT_H */\n\n#ifdef _WIN64\n# define SIZEOF_VOIDP 8\n#else\n# define SIZEOF_VOIDP 4\n#endif\n\n/* Useful headers */\n#define HAVE_DXGI_H 1\n#if WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP\n#define HAVE_XINPUT_H 1\n#endif\n#define HAVE_LIBC 1\n#define HAVE_STDIO_H 1\n#define STDC_HEADERS 1\n#define HAVE_STRING_H 1\n#define HAVE_CTYPE_H 1\n#define HAVE_MATH_H 1\n#define HAVE_FLOAT_H 1\n#define HAVE_SIGNAL_H 1\n\n/* C library functions */\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC 1\n#define HAVE_FREE 1\n#define HAVE_ALLOCA 1\n#define HAVE_QSORT 1\n#define HAVE_ABS 1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE 1\n#define HAVE_MEMCMP 1\n#define HAVE_STRLEN 1\n#define HAVE__STRREV 1\n#define HAVE__STRUPR 1\n//#define HAVE__STRLWR 1\t// TODO, WinRT: consider using _strlwr_s instead\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR 1\n#define HAVE_STRSTR 1\n//#define HAVE_ITOA 1   // TODO, WinRT: consider using _itoa_s instead\n//#define HAVE__LTOA 1\t// TODO, WinRT: consider using _ltoa_s instead\n//#define HAVE__ULTOA 1\t// TODO, WinRT: consider using _ultoa_s instead\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL 1\n//#define HAVE_STRTOLL 1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI 1\n#define HAVE_ATOF 1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP 1\n#define HAVE__STRICMP 1\n#define HAVE__STRNICMP 1\n#define HAVE_VSNPRINTF 1\n//#define HAVE_SSCANF 1\t// TODO, WinRT: consider using sscanf_s instead\n#define HAVE_M_PI 1\n#define HAVE_ATAN 1\n#define HAVE_ATAN2 1\n#define HAVE_CEIL 1\n#define HAVE__COPYSIGN 1\n#define HAVE_COS 1\n#define HAVE_COSF 1\n#define HAVE_FABS 1\n#define HAVE_FLOOR 1\n#define HAVE_LOG 1\n#define HAVE_POW 1\n//#define HAVE_SCALBN 1\n#define HAVE__SCALB 1\n#define HAVE_SIN 1\n#define HAVE_SINF 1\n#define HAVE_SQRT 1\n#define HAVE_SQRTF 1\n#define HAVE_TAN 1\n#define HAVE_TANF 1\n#define HAVE__FSEEKI64 1\n\n/* Enable various audio drivers */\n#define SDL_AUDIO_DRIVER_XAUDIO2\t1\n#define SDL_AUDIO_DRIVER_DISK\t1\n#define SDL_AUDIO_DRIVER_DUMMY\t1\n\n/* Enable various input drivers */\n#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP\n#define SDL_JOYSTICK_DISABLED 1\n#define SDL_HAPTIC_DISABLED\t1\n#else\n#define SDL_JOYSTICK_XINPUT 1\n#define SDL_HAPTIC_XINPUT   1\n#endif\n\n/* Enable various shared object loading systems */\n#define SDL_LOADSO_WINDOWS\t1\n\n/* Enable various threading systems */\n#if (NTDDI_VERSION >= NTDDI_WINBLUE)\n#define SDL_THREAD_WINDOWS  1\n#else\n/* WinRT on Windows 8.0 and Windows Phone 8.0 don't support CreateThread() */\n#define SDL_THREAD_STDCPP   1\n#endif\n\n/* Enable various timer systems */\n#define SDL_TIMER_WINDOWS\t1\n\n/* Enable various video drivers */\n#define SDL_VIDEO_DRIVER_WINRT\t1\n#define SDL_VIDEO_DRIVER_DUMMY  1\n\n/* Enable OpenGL ES 2.0 (via a modified ANGLE library) */\n#define SDL_VIDEO_OPENGL_ES2 1\n#define SDL_VIDEO_OPENGL_EGL 1\n\n/* Enable appropriate renderer(s) */\n#define SDL_VIDEO_RENDER_D3D11  1\n\n#if SDL_VIDEO_OPENGL_ES2\n#define SDL_VIDEO_RENDER_OGL_ES2 1\n#endif\n\n/* Enable system power support */\n#define SDL_POWER_WINRT 1\n\n/* Enable assembly routines (Win64 doesn't have inline asm) */\n#ifndef _WIN64\n#define SDL_ASSEMBLY_ROUTINES\t1\n#endif\n\n#endif /* _SDL_config_winrt_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_config_wiz.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_config_h\n#define _SDL_config_h\n\n/* This is a set of defines to configure the SDL features */\n\n/* General platform specific identifiers */\n#include \"SDL_platform.h\"\n\n#define SDL_BYTEORDER 1234\n\n#define HAVE_ALLOCA_H 1\n#define HAVE_SYS_TYPES_H 1\n#define HAVE_STDIO_H 1\n#define STDC_HEADERS 1\n#define HAVE_STDLIB_H 1\n#define HAVE_STDARG_H 1\n#define HAVE_MALLOC_H 1\n#define HAVE_MEMORY_H 1\n#define HAVE_STRING_H 1\n#define HAVE_STRINGS_H 1\n#define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H 1\n#define HAVE_CTYPE_H 1\n#define HAVE_MATH_H 1\n#define HAVE_ICONV_H 1\n#define HAVE_SIGNAL_H 1\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC 1\n#define HAVE_FREE 1\n#define HAVE_ALLOCA 1\n#define HAVE_GETENV 1\n#define HAVE_SETENV 1\n#define HAVE_PUTENV 1\n#define HAVE_UNSETENV 1\n#define HAVE_QSORT 1\n#define HAVE_ABS 1\n#define HAVE_BCOPY 1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE 1\n#define HAVE_STRLEN 1\n#define HAVE_STRDUP 1\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR 1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL 1\n#define HAVE_STRTOLL 1\n#define HAVE_STRTOULL 1\n#define HAVE_ATOI 1\n#define HAVE_ATOF 1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP 1\n#define HAVE_STRCASECMP 1\n#define HAVE_STRNCASECMP 1\n#define HAVE_VSSCANF 1\n#define HAVE_VSNPRINTF 1\n#define HAVE_M_PI 1\n#define HAVE_CEIL 1\n#define HAVE_COPYSIGN 1\n#define HAVE_COS 1\n#define HAVE_COSF 1\n#define HAVE_FABS 1\n#define HAVE_FLOOR 1\n#define HAVE_LOG 1\n#define HAVE_SCALBN 1\n#define HAVE_SIN 1\n#define HAVE_SINF 1\n#define HAVE_SQRT 1\n#define HAVE_SQRTF 1\n#define HAVE_TAN 1\n#define HAVE_TANF 1\n#define HAVE_SIGACTION 1\n#define HAVE_SETJMP 1\n#define HAVE_NANOSLEEP 1\n#define HAVE_POW 1\n\n#define SDL_AUDIO_DRIVER_DUMMY 1\n#define SDL_AUDIO_DRIVER_OSS 1\n\n#define SDL_INPUT_LINUXEV 1\n#define SDL_INPUT_TSLIB 1\n#define SDL_JOYSTICK_LINUX 1\n#define SDL_HAPTIC_LINUX 1\n\n#define SDL_LOADSO_DLOPEN 1\n\n#define SDL_THREAD_PTHREAD 1\n#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1\n\n#define SDL_TIMER_UNIX 1\n\n#define SDL_VIDEO_DRIVER_DUMMY 1\n#define SDL_VIDEO_DRIVER_PANDORA 1\n#define SDL_VIDEO_RENDER_OGL_ES 1\n#define SDL_VIDEO_OPENGL_ES 1\n\n#endif /* _SDL_config_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_copying.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n"
  },
  {
    "path": "libs/SDL2/include/SDL_cpuinfo.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_cpuinfo.h\n *\n *  CPU feature detection for SDL.\n */\n\n#ifndef _SDL_cpuinfo_h\n#define _SDL_cpuinfo_h\n\n#include \"SDL_stdinc.h\"\n\n/* Need to do this here because intrin.h has C++ code in it */\n/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */\n#if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64))\n#include <intrin.h>\n#ifndef _WIN64\n#define __MMX__\n#define __3dNOW__\n#endif\n#define __SSE__\n#define __SSE2__\n#elif defined(__MINGW64_VERSION_MAJOR)\n#include <intrin.h>\n#else\n#ifdef __ALTIVEC__\n#if HAVE_ALTIVEC_H && !defined(__APPLE_ALTIVEC__)\n#include <altivec.h>\n#undef pixel\n#endif\n#endif\n#ifdef __MMX__\n#include <mmintrin.h>\n#endif\n#ifdef __3dNOW__\n#include <mm3dnow.h>\n#endif\n#ifdef __SSE__\n#include <xmmintrin.h>\n#endif\n#ifdef __SSE2__\n#include <emmintrin.h>\n#endif\n#endif\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* This is a guess for the cacheline size used for padding.\n * Most x86 processors have a 64 byte cache line.\n * The 64-bit PowerPC processors have a 128 byte cache line.\n * We'll use the larger value to be generally safe.\n */\n#define SDL_CACHELINE_SIZE  128\n\n/**\n *  This function returns the number of CPU cores available.\n */\nextern DECLSPEC int SDLCALL SDL_GetCPUCount(void);\n\n/**\n *  This function returns the L1 cache line size of the CPU\n *\n *  This is useful for determining multi-threaded structure padding\n *  or SIMD prefetch sizes.\n */\nextern DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void);\n\n/**\n *  This function returns true if the CPU has the RDTSC instruction.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void);\n\n/**\n *  This function returns true if the CPU has AltiVec features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void);\n\n/**\n *  This function returns true if the CPU has MMX features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void);\n\n/**\n *  This function returns true if the CPU has 3DNow! features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void);\n\n/**\n *  This function returns true if the CPU has SSE features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void);\n\n/**\n *  This function returns true if the CPU has SSE2 features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void);\n\n/**\n *  This function returns true if the CPU has SSE3 features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void);\n\n/**\n *  This function returns true if the CPU has SSE4.1 features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void);\n\n/**\n *  This function returns true if the CPU has SSE4.2 features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void);\n\n/**\n *  This function returns true if the CPU has AVX features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void);\n\n/**\n *  This function returns true if the CPU has AVX2 features.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void);\n\n/**\n *  This function returns the amount of RAM configured in the system, in MB.\n */\nextern DECLSPEC int SDLCALL SDL_GetSystemRAM(void);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_cpuinfo_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_egl.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_egl.h\n *\n *  This is a simple file to encapsulate the EGL API headers.\n */\n#ifndef _MSC_VER\n\n#include <EGL/egl.h>\n#include <EGL/eglext.h>\n\n#else /* _MSC_VER */\n\n/* EGL headers for Visual Studio */\n\n#ifndef __khrplatform_h_\n#define __khrplatform_h_\n\n/*\n** Copyright (c) 2008-2009 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n/* Khronos platform-specific types and definitions.\n*\n* $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $\n*\n* Adopters may modify this file to suit their platform. Adopters are\n* encouraged to submit platform specific modifications to the Khronos\n* group so that they can be included in future versions of this file.\n* Please submit changes by sending them to the public Khronos Bugzilla\n* (http://khronos.org/bugzilla) by filing a bug against product\n* \"Khronos (general)\" component \"Registry\".\n*\n* A predefined template which fills in some of the bug fields can be\n* reached using http://tinyurl.com/khrplatform-h-bugreport, but you\n* must create a Bugzilla login first.\n*\n*\n* See the Implementer's Guidelines for information about where this file\n* should be located on your system and for more details of its use:\n*    http://www.khronos.org/registry/implementers_guide.pdf\n*\n* This file should be included as\n*        #include <KHR/khrplatform.h>\n* by Khronos client API header files that use its types and defines.\n*\n* The types in khrplatform.h should only be used to define API-specific types.\n*\n* Types defined in khrplatform.h:\n*    khronos_int8_t              signed   8  bit\n*    khronos_uint8_t             unsigned 8  bit\n*    khronos_int16_t             signed   16 bit\n*    khronos_uint16_t            unsigned 16 bit\n*    khronos_int32_t             signed   32 bit\n*    khronos_uint32_t            unsigned 32 bit\n*    khronos_int64_t             signed   64 bit\n*    khronos_uint64_t            unsigned 64 bit\n*    khronos_intptr_t            signed   same number of bits as a pointer\n*    khronos_uintptr_t           unsigned same number of bits as a pointer\n*    khronos_ssize_t             signed   size\n*    khronos_usize_t             unsigned size\n*    khronos_float_t             signed   32 bit floating point\n*    khronos_time_ns_t           unsigned 64 bit time in nanoseconds\n*    khronos_utime_nanoseconds_t unsigned time interval or absolute time in\n*                                         nanoseconds\n*    khronos_stime_nanoseconds_t signed time interval in nanoseconds\n*    khronos_boolean_enum_t      enumerated boolean type. This should\n*      only be used as a base type when a client API's boolean type is\n*      an enum. Client APIs which use an integer or other type for\n*      booleans cannot use this as the base type for their boolean.\n*\n* Tokens defined in khrplatform.h:\n*\n*    KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.\n*\n*    KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.\n*    KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.\n*\n* Calling convention macros defined in this file:\n*    KHRONOS_APICALL\n*    KHRONOS_APIENTRY\n*    KHRONOS_APIATTRIBUTES\n*\n* These may be used in function prototypes as:\n*\n*      KHRONOS_APICALL void KHRONOS_APIENTRY funcname(\n*                                  int arg1,\n*                                  int arg2) KHRONOS_APIATTRIBUTES;\n*/\n\n/*-------------------------------------------------------------------------\n* Definition of KHRONOS_APICALL\n*-------------------------------------------------------------------------\n* This precedes the return type of the function in the function prototype.\n*/\n#if defined(_WIN32) && !defined(__SCITECH_SNAP__)\n#   define KHRONOS_APICALL __declspec(dllimport)\n#elif defined (__SYMBIAN32__)\n#   define KHRONOS_APICALL IMPORT_C\n#else\n#   define KHRONOS_APICALL\n#endif\n\n/*-------------------------------------------------------------------------\n* Definition of KHRONOS_APIENTRY\n*-------------------------------------------------------------------------\n* This follows the return type of the function  and precedes the function\n* name in the function prototype.\n*/\n#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)\n/* Win32 but not WinCE */\n#   define KHRONOS_APIENTRY __stdcall\n#else\n#   define KHRONOS_APIENTRY\n#endif\n\n/*-------------------------------------------------------------------------\n* Definition of KHRONOS_APIATTRIBUTES\n*-------------------------------------------------------------------------\n* This follows the closing parenthesis of the function prototype arguments.\n*/\n#if defined (__ARMCC_2__)\n#define KHRONOS_APIATTRIBUTES __softfp\n#else\n#define KHRONOS_APIATTRIBUTES\n#endif\n\n/*-------------------------------------------------------------------------\n* basic type definitions\n*-----------------------------------------------------------------------*/\n#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)\n\n\n/*\n* Using <stdint.h>\n*/\n#include <stdint.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(__VMS ) || defined(__sgi)\n\n/*\n* Using <inttypes.h>\n*/\n#include <inttypes.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)\n\n/*\n* Win32\n*/\ntypedef __int32                 khronos_int32_t;\ntypedef unsigned __int32        khronos_uint32_t;\ntypedef __int64                 khronos_int64_t;\ntypedef unsigned __int64        khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(__sun__) || defined(__digital__)\n\n/*\n* Sun or Digital\n*/\ntypedef int                     khronos_int32_t;\ntypedef unsigned int            khronos_uint32_t;\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int                khronos_int64_t;\ntypedef unsigned long int       khronos_uint64_t;\n#else\ntypedef long long int           khronos_int64_t;\ntypedef unsigned long long int  khronos_uint64_t;\n#endif /* __arch64__ */\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif 0\n\n/*\n* Hypothetical platform with no float or int64 support\n*/\ntypedef int                     khronos_int32_t;\ntypedef unsigned int            khronos_uint32_t;\n#define KHRONOS_SUPPORT_INT64   0\n#define KHRONOS_SUPPORT_FLOAT   0\n\n#else\n\n/*\n* Generic fallback\n*/\n#include <stdint.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#endif\n\n\n/*\n* Types that are (so far) the same on all platforms\n*/\ntypedef signed   char          khronos_int8_t;\ntypedef unsigned char          khronos_uint8_t;\ntypedef signed   short int     khronos_int16_t;\ntypedef unsigned short int     khronos_uint16_t;\n\n/*\n* Types that differ between LLP64 and LP64 architectures - in LLP64,\n* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears\n* to be the only LLP64 architecture in current use.\n*/\n#ifdef _WIN64\ntypedef signed   long long int khronos_intptr_t;\ntypedef unsigned long long int khronos_uintptr_t;\ntypedef signed   long long int khronos_ssize_t;\ntypedef unsigned long long int khronos_usize_t;\n#else\ntypedef signed   long  int     khronos_intptr_t;\ntypedef unsigned long  int     khronos_uintptr_t;\ntypedef signed   long  int     khronos_ssize_t;\ntypedef unsigned long  int     khronos_usize_t;\n#endif\n\n#if KHRONOS_SUPPORT_FLOAT\n/*\n* Float type\n*/\ntypedef          float         khronos_float_t;\n#endif\n\n#if KHRONOS_SUPPORT_INT64\n/* Time types\n*\n* These types can be used to represent a time interval in nanoseconds or\n* an absolute Unadjusted System Time.  Unadjusted System Time is the number\n* of nanoseconds since some arbitrary system event (e.g. since the last\n* time the system booted).  The Unadjusted System Time is an unsigned\n* 64 bit value that wraps back to 0 every 584 years.  Time intervals\n* may be either signed or unsigned.\n*/\ntypedef khronos_uint64_t       khronos_utime_nanoseconds_t;\ntypedef khronos_int64_t        khronos_stime_nanoseconds_t;\n#endif\n\n/*\n* Dummy value used to pad enum types to 32 bits.\n*/\n#ifndef KHRONOS_MAX_ENUM\n#define KHRONOS_MAX_ENUM 0x7FFFFFFF\n#endif\n\n/*\n* Enumerated boolean type\n*\n* Values other than zero should be considered to be true.  Therefore\n* comparisons should not be made against KHRONOS_TRUE.\n*/\ntypedef enum {\n    KHRONOS_FALSE = 0,\n    KHRONOS_TRUE = 1,\n    KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM\n} khronos_boolean_enum_t;\n\n#endif /* __khrplatform_h_ */\n\n\n#ifndef __eglplatform_h_\n#define __eglplatform_h_\n\n/*\n** Copyright (c) 2007-2009 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n/* Platform-specific types and definitions for egl.h\n* $Revision: 12306 $ on $Date: 2010-08-25 09:51:28 -0700 (Wed, 25 Aug 2010) $\n*\n* Adopters may modify khrplatform.h and this file to suit their platform.\n* You are encouraged to submit all modifications to the Khronos group so that\n* they can be included in future versions of this file.  Please submit changes\n* by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)\n* by filing a bug against product \"EGL\" component \"Registry\".\n*/\n\n/*#include <KHR/khrplatform.h>*/\n\n/* Macros used in EGL function prototype declarations.\n*\n* EGL functions should be prototyped as:\n*\n* EGLAPI return-type EGLAPIENTRY eglFunction(arguments);\n* typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments);\n*\n* KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h\n*/\n\n#ifndef EGLAPI\n#define EGLAPI KHRONOS_APICALL\n#endif\n\n#ifndef EGLAPIENTRY\n#define EGLAPIENTRY  KHRONOS_APIENTRY\n#endif\n#define EGLAPIENTRYP EGLAPIENTRY*\n\n/* The types NativeDisplayType, NativeWindowType, and NativePixmapType\n* are aliases of window-system-dependent types, such as X Display * or\n* Windows Device Context. They must be defined in platform-specific\n* code below. The EGL-prefixed versions of Native*Type are the same\n* types, renamed in EGL 1.3 so all types in the API start with \"EGL\".\n*\n* Khronos STRONGLY RECOMMENDS that you use the default definitions\n* provided below, since these changes affect both binary and source\n* portability of applications using EGL running on different EGL\n* implementations.\n*/\n\n#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN 1\n#endif\n#include <windows.h>\n\n#if __WINRT__\n#include <Unknwn.h>\ntypedef IUnknown * EGLNativeWindowType;\ntypedef IUnknown * EGLNativePixmapType;\ntypedef IUnknown * EGLNativeDisplayType;\n#else\ntypedef HDC     EGLNativeDisplayType;\ntypedef HBITMAP EGLNativePixmapType;\ntypedef HWND    EGLNativeWindowType;\n#endif\n\n#elif defined(__WINSCW__) || defined(__SYMBIAN32__)  /* Symbian */\n\ntypedef int   EGLNativeDisplayType;\ntypedef void *EGLNativeWindowType;\ntypedef void *EGLNativePixmapType;\n\n#elif defined(WL_EGL_PLATFORM)\n\ntypedef struct wl_display     *EGLNativeDisplayType;\ntypedef struct wl_egl_pixmap  *EGLNativePixmapType;\ntypedef struct wl_egl_window  *EGLNativeWindowType;\n\n#elif defined(__GBM__)\n\ntypedef struct gbm_device  *EGLNativeDisplayType;\ntypedef struct gbm_bo      *EGLNativePixmapType;\ntypedef void               *EGLNativeWindowType;\n\n#elif defined(__ANDROID__) /* Android */\n\nstruct ANativeWindow;\nstruct egl_native_pixmap_t;\n\ntypedef struct ANativeWindow        *EGLNativeWindowType;\ntypedef struct egl_native_pixmap_t  *EGLNativePixmapType;\ntypedef void                        *EGLNativeDisplayType;\n\n#elif defined(MIR_EGL_PLATFORM)\n\n#include <mir_toolkit/mir_client_library.h>\ntypedef MirEGLNativeDisplayType EGLNativeDisplayType;\ntypedef void                   *EGLNativePixmapType;\ntypedef MirEGLNativeWindowType  EGLNativeWindowType;\n\n#elif defined(__unix__)\n\n#ifdef MESA_EGL_NO_X11_HEADERS\n\ntypedef void            *EGLNativeDisplayType;\ntypedef khronos_uintptr_t EGLNativePixmapType;\ntypedef khronos_uintptr_t EGLNativeWindowType;\n\n#else\n\n/* X11 (tentative)  */\n#include <X11/Xlib.h>\n#include <X11/Xutil.h>\n\ntypedef Display *EGLNativeDisplayType;\ntypedef Pixmap   EGLNativePixmapType;\ntypedef Window   EGLNativeWindowType;\n\n#endif /* MESA_EGL_NO_X11_HEADERS */\n\n#else\n#error \"Platform not recognized\"\n#endif\n\n/* EGL 1.2 types, renamed for consistency in EGL 1.3 */\ntypedef EGLNativeDisplayType NativeDisplayType;\ntypedef EGLNativePixmapType  NativePixmapType;\ntypedef EGLNativeWindowType  NativeWindowType;\n\n\n/* Define EGLint. This must be a signed integral type large enough to contain\n* all legal attribute names and values passed into and out of EGL, whether\n* their type is boolean, bitmask, enumerant (symbolic constant), integer,\n* handle, or other.  While in general a 32-bit integer will suffice, if\n* handles are 64 bit types, then EGLint should be defined as a signed 64-bit\n* integer type.\n*/\ntypedef khronos_int32_t EGLint;\n\n#endif /* __eglplatform_h */\n\n#ifndef __egl_h_\n#define __egl_h_ 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n** Copyright (c) 2013-2015 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n/*\n** This header is generated from the Khronos OpenGL / OpenGL ES XML\n** API Registry. The current version of the Registry, generator scripts\n** used to make the header, and the header can be found at\n**   http://www.opengl.org/registry/\n**\n** Khronos $Revision: 31566 $ on $Date: 2015-06-23 08:48:48 -0700 (Tue, 23 Jun 2015) $\n*/\n\n/*#include <EGL/eglplatform.h>*/\n\n/* Generated on date 20150623 */\n\n/* Generated C header for:\n * API: egl\n * Versions considered: .*\n * Versions emitted: .*\n * Default extensions included: None\n * Additional extensions included: _nomatch_^\n * Extensions removed: _nomatch_^\n */\n\n#ifndef EGL_VERSION_1_0\n#define EGL_VERSION_1_0 1\ntypedef unsigned int EGLBoolean;\ntypedef void *EGLDisplay;\ntypedef void *EGLConfig;\ntypedef void *EGLSurface;\ntypedef void *EGLContext;\ntypedef void (*__eglMustCastToProperFunctionPointerType)(void);\n#define EGL_ALPHA_SIZE                    0x3021\n#define EGL_BAD_ACCESS                    0x3002\n#define EGL_BAD_ALLOC                     0x3003\n#define EGL_BAD_ATTRIBUTE                 0x3004\n#define EGL_BAD_CONFIG                    0x3005\n#define EGL_BAD_CONTEXT                   0x3006\n#define EGL_BAD_CURRENT_SURFACE           0x3007\n#define EGL_BAD_DISPLAY                   0x3008\n#define EGL_BAD_MATCH                     0x3009\n#define EGL_BAD_NATIVE_PIXMAP             0x300A\n#define EGL_BAD_NATIVE_WINDOW             0x300B\n#define EGL_BAD_PARAMETER                 0x300C\n#define EGL_BAD_SURFACE                   0x300D\n#define EGL_BLUE_SIZE                     0x3022\n#define EGL_BUFFER_SIZE                   0x3020\n#define EGL_CONFIG_CAVEAT                 0x3027\n#define EGL_CONFIG_ID                     0x3028\n#define EGL_CORE_NATIVE_ENGINE            0x305B\n#define EGL_DEPTH_SIZE                    0x3025\n#define EGL_DONT_CARE                     ((EGLint)-1)\n#define EGL_DRAW                          0x3059\n#define EGL_EXTENSIONS                    0x3055\n#define EGL_FALSE                         0\n#define EGL_GREEN_SIZE                    0x3023\n#define EGL_HEIGHT                        0x3056\n#define EGL_LARGEST_PBUFFER               0x3058\n#define EGL_LEVEL                         0x3029\n#define EGL_MAX_PBUFFER_HEIGHT            0x302A\n#define EGL_MAX_PBUFFER_PIXELS            0x302B\n#define EGL_MAX_PBUFFER_WIDTH             0x302C\n#define EGL_NATIVE_RENDERABLE             0x302D\n#define EGL_NATIVE_VISUAL_ID              0x302E\n#define EGL_NATIVE_VISUAL_TYPE            0x302F\n#define EGL_NONE                          0x3038\n#define EGL_NON_CONFORMANT_CONFIG         0x3051\n#define EGL_NOT_INITIALIZED               0x3001\n#define EGL_NO_CONTEXT                    ((EGLContext)0)\n#define EGL_NO_DISPLAY                    ((EGLDisplay)0)\n#define EGL_NO_SURFACE                    ((EGLSurface)0)\n#define EGL_PBUFFER_BIT                   0x0001\n#define EGL_PIXMAP_BIT                    0x0002\n#define EGL_READ                          0x305A\n#define EGL_RED_SIZE                      0x3024\n#define EGL_SAMPLES                       0x3031\n#define EGL_SAMPLE_BUFFERS                0x3032\n#define EGL_SLOW_CONFIG                   0x3050\n#define EGL_STENCIL_SIZE                  0x3026\n#define EGL_SUCCESS                       0x3000\n#define EGL_SURFACE_TYPE                  0x3033\n#define EGL_TRANSPARENT_BLUE_VALUE        0x3035\n#define EGL_TRANSPARENT_GREEN_VALUE       0x3036\n#define EGL_TRANSPARENT_RED_VALUE         0x3037\n#define EGL_TRANSPARENT_RGB               0x3052\n#define EGL_TRANSPARENT_TYPE              0x3034\n#define EGL_TRUE                          1\n#define EGL_VENDOR                        0x3053\n#define EGL_VERSION                       0x3054\n#define EGL_WIDTH                         0x3057\n#define EGL_WINDOW_BIT                    0x0004\nEGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);\nEGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);\nEGLAPI EGLContext EGLAPIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);\nEGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);\nEGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);\nEGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext (EGLDisplay dpy, EGLContext ctx);\nEGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface (EGLDisplay dpy, EGLSurface surface);\nEGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);\nEGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);\nEGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay (void);\nEGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface (EGLint readdraw);\nEGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay (EGLNativeDisplayType display_id);\nEGLAPI EGLint EGLAPIENTRY eglGetError (void);\nEGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname);\nEGLAPI EGLBoolean EGLAPIENTRY eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor);\nEGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryContext (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);\nEGLAPI const char *EGLAPIENTRY eglQueryString (EGLDisplay dpy, EGLint name);\nEGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);\nEGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface surface);\nEGLAPI EGLBoolean EGLAPIENTRY eglTerminate (EGLDisplay dpy);\nEGLAPI EGLBoolean EGLAPIENTRY eglWaitGL (void);\nEGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine);\n#endif /* EGL_VERSION_1_0 */\n\n#ifndef EGL_VERSION_1_1\n#define EGL_VERSION_1_1 1\n#define EGL_BACK_BUFFER                   0x3084\n#define EGL_BIND_TO_TEXTURE_RGB           0x3039\n#define EGL_BIND_TO_TEXTURE_RGBA          0x303A\n#define EGL_CONTEXT_LOST                  0x300E\n#define EGL_MIN_SWAP_INTERVAL             0x303B\n#define EGL_MAX_SWAP_INTERVAL             0x303C\n#define EGL_MIPMAP_TEXTURE                0x3082\n#define EGL_MIPMAP_LEVEL                  0x3083\n#define EGL_NO_TEXTURE                    0x305C\n#define EGL_TEXTURE_2D                    0x305F\n#define EGL_TEXTURE_FORMAT                0x3080\n#define EGL_TEXTURE_RGB                   0x305D\n#define EGL_TEXTURE_RGBA                  0x305E\n#define EGL_TEXTURE_TARGET                0x3081\nEGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer);\nEGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer);\nEGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);\nEGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval (EGLDisplay dpy, EGLint interval);\n#endif /* EGL_VERSION_1_1 */\n\n#ifndef EGL_VERSION_1_2\n#define EGL_VERSION_1_2 1\ntypedef unsigned int EGLenum;\ntypedef void *EGLClientBuffer;\n#define EGL_ALPHA_FORMAT                  0x3088\n#define EGL_ALPHA_FORMAT_NONPRE           0x308B\n#define EGL_ALPHA_FORMAT_PRE              0x308C\n#define EGL_ALPHA_MASK_SIZE               0x303E\n#define EGL_BUFFER_PRESERVED              0x3094\n#define EGL_BUFFER_DESTROYED              0x3095\n#define EGL_CLIENT_APIS                   0x308D\n#define EGL_COLORSPACE                    0x3087\n#define EGL_COLORSPACE_sRGB               0x3089\n#define EGL_COLORSPACE_LINEAR             0x308A\n#define EGL_COLOR_BUFFER_TYPE             0x303F\n#define EGL_CONTEXT_CLIENT_TYPE           0x3097\n#define EGL_DISPLAY_SCALING               10000\n#define EGL_HORIZONTAL_RESOLUTION         0x3090\n#define EGL_LUMINANCE_BUFFER              0x308F\n#define EGL_LUMINANCE_SIZE                0x303D\n#define EGL_OPENGL_ES_BIT                 0x0001\n#define EGL_OPENVG_BIT                    0x0002\n#define EGL_OPENGL_ES_API                 0x30A0\n#define EGL_OPENVG_API                    0x30A1\n#define EGL_OPENVG_IMAGE                  0x3096\n#define EGL_PIXEL_ASPECT_RATIO            0x3092\n#define EGL_RENDERABLE_TYPE               0x3040\n#define EGL_RENDER_BUFFER                 0x3086\n#define EGL_RGB_BUFFER                    0x308E\n#define EGL_SINGLE_BUFFER                 0x3085\n#define EGL_SWAP_BEHAVIOR                 0x3093\n#define EGL_UNKNOWN                       ((EGLint)-1)\n#define EGL_VERTICAL_RESOLUTION           0x3091\nEGLAPI EGLBoolean EGLAPIENTRY eglBindAPI (EGLenum api);\nEGLAPI EGLenum EGLAPIENTRY eglQueryAPI (void);\nEGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread (void);\nEGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void);\n#endif /* EGL_VERSION_1_2 */\n\n#ifndef EGL_VERSION_1_3\n#define EGL_VERSION_1_3 1\n#define EGL_CONFORMANT                    0x3042\n#define EGL_CONTEXT_CLIENT_VERSION        0x3098\n#define EGL_MATCH_NATIVE_PIXMAP           0x3041\n#define EGL_OPENGL_ES2_BIT                0x0004\n#define EGL_VG_ALPHA_FORMAT               0x3088\n#define EGL_VG_ALPHA_FORMAT_NONPRE        0x308B\n#define EGL_VG_ALPHA_FORMAT_PRE           0x308C\n#define EGL_VG_ALPHA_FORMAT_PRE_BIT       0x0040\n#define EGL_VG_COLORSPACE                 0x3087\n#define EGL_VG_COLORSPACE_sRGB            0x3089\n#define EGL_VG_COLORSPACE_LINEAR          0x308A\n#define EGL_VG_COLORSPACE_LINEAR_BIT      0x0020\n#endif /* EGL_VERSION_1_3 */\n\n#ifndef EGL_VERSION_1_4\n#define EGL_VERSION_1_4 1\n#define EGL_DEFAULT_DISPLAY               ((EGLNativeDisplayType)0)\n#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT   0x0200\n#define EGL_MULTISAMPLE_RESOLVE           0x3099\n#define EGL_MULTISAMPLE_RESOLVE_DEFAULT   0x309A\n#define EGL_MULTISAMPLE_RESOLVE_BOX       0x309B\n#define EGL_OPENGL_API                    0x30A2\n#define EGL_OPENGL_BIT                    0x0008\n#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT   0x0400\nEGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext (void);\n#endif /* EGL_VERSION_1_4 */\n\n#ifndef EGL_VERSION_1_5\n#define EGL_VERSION_1_5 1\ntypedef void *EGLSync;\ntypedef intptr_t EGLAttrib;\ntypedef khronos_utime_nanoseconds_t EGLTime;\ntypedef void *EGLImage;\n#define EGL_CONTEXT_MAJOR_VERSION         0x3098\n#define EGL_CONTEXT_MINOR_VERSION         0x30FB\n#define EGL_CONTEXT_OPENGL_PROFILE_MASK   0x30FD\n#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD\n#define EGL_NO_RESET_NOTIFICATION         0x31BE\n#define EGL_LOSE_CONTEXT_ON_RESET         0x31BF\n#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001\n#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002\n#define EGL_CONTEXT_OPENGL_DEBUG          0x31B0\n#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1\n#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS  0x31B2\n#define EGL_OPENGL_ES3_BIT                0x00000040\n#define EGL_CL_EVENT_HANDLE               0x309C\n#define EGL_SYNC_CL_EVENT                 0x30FE\n#define EGL_SYNC_CL_EVENT_COMPLETE        0x30FF\n#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE  0x30F0\n#define EGL_SYNC_TYPE                     0x30F7\n#define EGL_SYNC_STATUS                   0x30F1\n#define EGL_SYNC_CONDITION                0x30F8\n#define EGL_SIGNALED                      0x30F2\n#define EGL_UNSIGNALED                    0x30F3\n#define EGL_SYNC_FLUSH_COMMANDS_BIT       0x0001\n#define EGL_FOREVER                       0xFFFFFFFFFFFFFFFFull\n#define EGL_TIMEOUT_EXPIRED               0x30F5\n#define EGL_CONDITION_SATISFIED           0x30F6\n#define EGL_NO_SYNC                       ((EGLSync)0)\n#define EGL_SYNC_FENCE                    0x30F9\n#define EGL_GL_COLORSPACE                 0x309D\n#define EGL_GL_COLORSPACE_SRGB            0x3089\n#define EGL_GL_COLORSPACE_LINEAR          0x308A\n#define EGL_GL_RENDERBUFFER               0x30B9\n#define EGL_GL_TEXTURE_2D                 0x30B1\n#define EGL_GL_TEXTURE_LEVEL              0x30BC\n#define EGL_GL_TEXTURE_3D                 0x30B2\n#define EGL_GL_TEXTURE_ZOFFSET            0x30BD\n#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3\n#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4\n#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5\n#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6\n#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7\n#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8\n#define EGL_IMAGE_PRESERVED               0x30D2\n#define EGL_NO_IMAGE                      ((EGLImage)0)\nEGLAPI EGLSync EGLAPIENTRY eglCreateSync (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglDestroySync (EGLDisplay dpy, EGLSync sync);\nEGLAPI EGLint EGLAPIENTRY eglClientWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);\nEGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value);\nEGLAPI EGLImage EGLAPIENTRY eglCreateImage (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage (EGLDisplay dpy, EGLImage image);\nEGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay (EGLenum platform, void *native_display, const EGLAttrib *attrib_list);\nEGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);\nEGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags);\n#endif /* EGL_VERSION_1_5 */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __egl_h_ */\n\n\n\n#ifndef __eglext_h_\n#define __eglext_h_ 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n** Copyright (c) 2013-2015 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n/*\n** This header is generated from the Khronos OpenGL / OpenGL ES XML\n** API Registry. The current version of the Registry, generator scripts\n** used to make the header, and the header can be found at\n**   http://www.opengl.org/registry/\n**\n** Khronos $Revision: 31566 $ on $Date: 2015-06-23 08:48:48 -0700 (Tue, 23 Jun 2015) $\n*/\n\n/*#include <EGL/eglplatform.h>*/\n\n#define EGL_EGLEXT_VERSION 20150623\n\n/* Generated C header for:\n * API: egl\n * Versions considered: .*\n * Versions emitted: _nomatch_^\n * Default extensions included: egl\n * Additional extensions included: _nomatch_^\n * Extensions removed: _nomatch_^\n */\n\n#ifndef EGL_KHR_cl_event\n#define EGL_KHR_cl_event 1\n#define EGL_CL_EVENT_HANDLE_KHR           0x309C\n#define EGL_SYNC_CL_EVENT_KHR             0x30FE\n#define EGL_SYNC_CL_EVENT_COMPLETE_KHR    0x30FF\n#endif /* EGL_KHR_cl_event */\n\n#ifndef EGL_KHR_cl_event2\n#define EGL_KHR_cl_event2 1\ntypedef void *EGLSyncKHR;\ntypedef intptr_t EGLAttribKHR;\ntypedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync64KHR (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list);\n#endif\n#endif /* EGL_KHR_cl_event2 */\n\n#ifndef EGL_KHR_client_get_all_proc_addresses\n#define EGL_KHR_client_get_all_proc_addresses 1\n#endif /* EGL_KHR_client_get_all_proc_addresses */\n\n#ifndef EGL_KHR_config_attribs\n#define EGL_KHR_config_attribs 1\n#define EGL_CONFORMANT_KHR                0x3042\n#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR  0x0020\n#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR   0x0040\n#endif /* EGL_KHR_config_attribs */\n\n#ifndef EGL_KHR_create_context\n#define EGL_KHR_create_context 1\n#define EGL_CONTEXT_MAJOR_VERSION_KHR     0x3098\n#define EGL_CONTEXT_MINOR_VERSION_KHR     0x30FB\n#define EGL_CONTEXT_FLAGS_KHR             0x30FC\n#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD\n#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD\n#define EGL_NO_RESET_NOTIFICATION_KHR     0x31BE\n#define EGL_LOSE_CONTEXT_ON_RESET_KHR     0x31BF\n#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR  0x00000001\n#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002\n#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004\n#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001\n#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002\n#define EGL_OPENGL_ES3_BIT_KHR            0x00000040\n#endif /* EGL_KHR_create_context */\n\n#ifndef EGL_KHR_create_context_no_error\n#define EGL_KHR_create_context_no_error 1\n#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR   0x31B3\n#endif /* EGL_KHR_create_context_no_error */\n\n#ifndef EGL_KHR_fence_sync\n#define EGL_KHR_fence_sync 1\ntypedef khronos_utime_nanoseconds_t EGLTimeKHR;\n#ifdef KHRONOS_SUPPORT_INT64\n#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0\n#define EGL_SYNC_CONDITION_KHR            0x30F8\n#define EGL_SYNC_FENCE_KHR                0x30F9\ntypedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync);\ntypedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR (EGLDisplay dpy, EGLSyncKHR sync);\nEGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);\nEGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);\n#endif\n#endif /* KHRONOS_SUPPORT_INT64 */\n#endif /* EGL_KHR_fence_sync */\n\n#ifndef EGL_KHR_get_all_proc_addresses\n#define EGL_KHR_get_all_proc_addresses 1\n#endif /* EGL_KHR_get_all_proc_addresses */\n\n#ifndef EGL_KHR_gl_colorspace\n#define EGL_KHR_gl_colorspace 1\n#define EGL_GL_COLORSPACE_KHR             0x309D\n#define EGL_GL_COLORSPACE_SRGB_KHR        0x3089\n#define EGL_GL_COLORSPACE_LINEAR_KHR      0x308A\n#endif /* EGL_KHR_gl_colorspace */\n\n#ifndef EGL_KHR_gl_renderbuffer_image\n#define EGL_KHR_gl_renderbuffer_image 1\n#define EGL_GL_RENDERBUFFER_KHR           0x30B9\n#endif /* EGL_KHR_gl_renderbuffer_image */\n\n#ifndef EGL_KHR_gl_texture_2D_image\n#define EGL_KHR_gl_texture_2D_image 1\n#define EGL_GL_TEXTURE_2D_KHR             0x30B1\n#define EGL_GL_TEXTURE_LEVEL_KHR          0x30BC\n#endif /* EGL_KHR_gl_texture_2D_image */\n\n#ifndef EGL_KHR_gl_texture_3D_image\n#define EGL_KHR_gl_texture_3D_image 1\n#define EGL_GL_TEXTURE_3D_KHR             0x30B2\n#define EGL_GL_TEXTURE_ZOFFSET_KHR        0x30BD\n#endif /* EGL_KHR_gl_texture_3D_image */\n\n#ifndef EGL_KHR_gl_texture_cubemap_image\n#define EGL_KHR_gl_texture_cubemap_image 1\n#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3\n#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4\n#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5\n#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6\n#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7\n#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8\n#endif /* EGL_KHR_gl_texture_cubemap_image */\n\n#ifndef EGL_KHR_image\n#define EGL_KHR_image 1\ntypedef void *EGLImageKHR;\n#define EGL_NATIVE_PIXMAP_KHR             0x30B0\n#define EGL_NO_IMAGE_KHR                  ((EGLImageKHR)0)\ntypedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image);\n#endif\n#endif /* EGL_KHR_image */\n\n#ifndef EGL_KHR_image_base\n#define EGL_KHR_image_base 1\n#define EGL_IMAGE_PRESERVED_KHR           0x30D2\n#endif /* EGL_KHR_image_base */\n\n#ifndef EGL_KHR_image_pixmap\n#define EGL_KHR_image_pixmap 1\n#endif /* EGL_KHR_image_pixmap */\n\n#ifndef EGL_KHR_lock_surface\n#define EGL_KHR_lock_surface 1\n#define EGL_READ_SURFACE_BIT_KHR          0x0001\n#define EGL_WRITE_SURFACE_BIT_KHR         0x0002\n#define EGL_LOCK_SURFACE_BIT_KHR          0x0080\n#define EGL_OPTIMAL_FORMAT_BIT_KHR        0x0100\n#define EGL_MATCH_FORMAT_KHR              0x3043\n#define EGL_FORMAT_RGB_565_EXACT_KHR      0x30C0\n#define EGL_FORMAT_RGB_565_KHR            0x30C1\n#define EGL_FORMAT_RGBA_8888_EXACT_KHR    0x30C2\n#define EGL_FORMAT_RGBA_8888_KHR          0x30C3\n#define EGL_MAP_PRESERVE_PIXELS_KHR       0x30C4\n#define EGL_LOCK_USAGE_HINT_KHR           0x30C5\n#define EGL_BITMAP_POINTER_KHR            0x30C6\n#define EGL_BITMAP_PITCH_KHR              0x30C7\n#define EGL_BITMAP_ORIGIN_KHR             0x30C8\n#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR   0x30C9\n#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA\n#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR  0x30CB\n#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC\n#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD\n#define EGL_LOWER_LEFT_KHR                0x30CE\n#define EGL_UPPER_LEFT_KHR                0x30CF\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay dpy, EGLSurface surface);\n#endif\n#endif /* EGL_KHR_lock_surface */\n\n#ifndef EGL_KHR_lock_surface2\n#define EGL_KHR_lock_surface2 1\n#define EGL_BITMAP_PIXEL_SIZE_KHR         0x3110\n#endif /* EGL_KHR_lock_surface2 */\n\n#ifndef EGL_KHR_lock_surface3\n#define EGL_KHR_lock_surface3 1\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface64KHR (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value);\n#endif\n#endif /* EGL_KHR_lock_surface3 */\n\n#ifndef EGL_KHR_partial_update\n#define EGL_KHR_partial_update 1\n#define EGL_BUFFER_AGE_KHR                0x313D\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglSetDamageRegionKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);\n#endif\n#endif /* EGL_KHR_partial_update */\n\n#ifndef EGL_KHR_platform_android\n#define EGL_KHR_platform_android 1\n#define EGL_PLATFORM_ANDROID_KHR          0x3141\n#endif /* EGL_KHR_platform_android */\n\n#ifndef EGL_KHR_platform_gbm\n#define EGL_KHR_platform_gbm 1\n#define EGL_PLATFORM_GBM_KHR              0x31D7\n#endif /* EGL_KHR_platform_gbm */\n\n#ifndef EGL_KHR_platform_wayland\n#define EGL_KHR_platform_wayland 1\n#define EGL_PLATFORM_WAYLAND_KHR          0x31D8\n#endif /* EGL_KHR_platform_wayland */\n\n#ifndef EGL_KHR_platform_x11\n#define EGL_KHR_platform_x11 1\n#define EGL_PLATFORM_X11_KHR              0x31D5\n#define EGL_PLATFORM_X11_SCREEN_KHR       0x31D6\n#endif /* EGL_KHR_platform_x11 */\n\n#ifndef EGL_KHR_reusable_sync\n#define EGL_KHR_reusable_sync 1\n#ifdef KHRONOS_SUPPORT_INT64\n#define EGL_SYNC_STATUS_KHR               0x30F1\n#define EGL_SIGNALED_KHR                  0x30F2\n#define EGL_UNSIGNALED_KHR                0x30F3\n#define EGL_TIMEOUT_EXPIRED_KHR           0x30F5\n#define EGL_CONDITION_SATISFIED_KHR       0x30F6\n#define EGL_SYNC_TYPE_KHR                 0x30F7\n#define EGL_SYNC_REUSABLE_KHR             0x30FA\n#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR   0x0001\n#define EGL_FOREVER_KHR                   0xFFFFFFFFFFFFFFFFull\n#define EGL_NO_SYNC_KHR                   ((EGLSyncKHR)0)\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);\n#endif\n#endif /* KHRONOS_SUPPORT_INT64 */\n#endif /* EGL_KHR_reusable_sync */\n\n#ifndef EGL_KHR_stream\n#define EGL_KHR_stream 1\ntypedef void *EGLStreamKHR;\ntypedef khronos_uint64_t EGLuint64KHR;\n#ifdef KHRONOS_SUPPORT_INT64\n#define EGL_NO_STREAM_KHR                 ((EGLStreamKHR)0)\n#define EGL_CONSUMER_LATENCY_USEC_KHR     0x3210\n#define EGL_PRODUCER_FRAME_KHR            0x3212\n#define EGL_CONSUMER_FRAME_KHR            0x3213\n#define EGL_STREAM_STATE_KHR              0x3214\n#define EGL_STREAM_STATE_CREATED_KHR      0x3215\n#define EGL_STREAM_STATE_CONNECTING_KHR   0x3216\n#define EGL_STREAM_STATE_EMPTY_KHR        0x3217\n#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218\n#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219\n#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A\n#define EGL_BAD_STREAM_KHR                0x321B\n#define EGL_BAD_STATE_KHR                 0x321C\ntypedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint *attrib_list);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR (EGLDisplay dpy, const EGLint *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR (EGLDisplay dpy, EGLStreamKHR stream);\nEGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value);\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value);\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value);\n#endif\n#endif /* KHRONOS_SUPPORT_INT64 */\n#endif /* EGL_KHR_stream */\n\n#ifndef EGL_KHR_stream_consumer_gltexture\n#define EGL_KHR_stream_consumer_gltexture 1\n#ifdef EGL_KHR_stream\n#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR (EGLDisplay dpy, EGLStreamKHR stream);\nEGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR (EGLDisplay dpy, EGLStreamKHR stream);\nEGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR (EGLDisplay dpy, EGLStreamKHR stream);\n#endif\n#endif /* EGL_KHR_stream */\n#endif /* EGL_KHR_stream_consumer_gltexture */\n\n#ifndef EGL_KHR_stream_cross_process_fd\n#define EGL_KHR_stream_cross_process_fd 1\ntypedef int EGLNativeFileDescriptorKHR;\n#ifdef EGL_KHR_stream\n#define EGL_NO_FILE_DESCRIPTOR_KHR        ((EGLNativeFileDescriptorKHR)(-1))\ntypedef EGLNativeFileDescriptorKHR (EGLAPIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);\ntypedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLNativeFileDescriptorKHR EGLAPIENTRY eglGetStreamFileDescriptorKHR (EGLDisplay dpy, EGLStreamKHR stream);\nEGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamFromFileDescriptorKHR (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor);\n#endif\n#endif /* EGL_KHR_stream */\n#endif /* EGL_KHR_stream_cross_process_fd */\n\n#ifndef EGL_KHR_stream_fifo\n#define EGL_KHR_stream_fifo 1\n#ifdef EGL_KHR_stream\n#define EGL_STREAM_FIFO_LENGTH_KHR        0x31FC\n#define EGL_STREAM_TIME_NOW_KHR           0x31FD\n#define EGL_STREAM_TIME_CONSUMER_KHR      0x31FE\n#define EGL_STREAM_TIME_PRODUCER_KHR      0x31FF\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value);\n#endif\n#endif /* EGL_KHR_stream */\n#endif /* EGL_KHR_stream_fifo */\n\n#ifndef EGL_KHR_stream_producer_aldatalocator\n#define EGL_KHR_stream_producer_aldatalocator 1\n#ifdef EGL_KHR_stream\n#endif /* EGL_KHR_stream */\n#endif /* EGL_KHR_stream_producer_aldatalocator */\n\n#ifndef EGL_KHR_stream_producer_eglsurface\n#define EGL_KHR_stream_producer_eglsurface 1\n#ifdef EGL_KHR_stream\n#define EGL_STREAM_BIT_KHR                0x0800\ntypedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list);\n#endif\n#endif /* EGL_KHR_stream */\n#endif /* EGL_KHR_stream_producer_eglsurface */\n\n#ifndef EGL_KHR_surfaceless_context\n#define EGL_KHR_surfaceless_context 1\n#endif /* EGL_KHR_surfaceless_context */\n\n#ifndef EGL_KHR_swap_buffers_with_damage\n#define EGL_KHR_swap_buffers_with_damage 1\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);\n#endif\n#endif /* EGL_KHR_swap_buffers_with_damage */\n\n#ifndef EGL_KHR_vg_parent_image\n#define EGL_KHR_vg_parent_image 1\n#define EGL_VG_PARENT_IMAGE_KHR           0x30BA\n#endif /* EGL_KHR_vg_parent_image */\n\n#ifndef EGL_KHR_wait_sync\n#define EGL_KHR_wait_sync 1\ntypedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);\n#endif\n#endif /* EGL_KHR_wait_sync */\n\n#ifndef EGL_ANDROID_blob_cache\n#define EGL_ANDROID_blob_cache 1\ntypedef khronos_ssize_t EGLsizeiANDROID;\ntypedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize);\ntypedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize);\ntypedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI void EGLAPIENTRY eglSetBlobCacheFuncsANDROID (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);\n#endif\n#endif /* EGL_ANDROID_blob_cache */\n\n#ifndef EGL_ANDROID_framebuffer_target\n#define EGL_ANDROID_framebuffer_target 1\n#define EGL_FRAMEBUFFER_TARGET_ANDROID    0x3147\n#endif /* EGL_ANDROID_framebuffer_target */\n\n#ifndef EGL_ANDROID_image_native_buffer\n#define EGL_ANDROID_image_native_buffer 1\n#define EGL_NATIVE_BUFFER_ANDROID         0x3140\n#endif /* EGL_ANDROID_image_native_buffer */\n\n#ifndef EGL_ANDROID_native_fence_sync\n#define EGL_ANDROID_native_fence_sync 1\n#define EGL_SYNC_NATIVE_FENCE_ANDROID     0x3144\n#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID  0x3145\n#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146\n#define EGL_NO_NATIVE_FENCE_FD_ANDROID    -1\ntypedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID (EGLDisplay dpy, EGLSyncKHR sync);\n#endif\n#endif /* EGL_ANDROID_native_fence_sync */\n\n#ifndef EGL_ANDROID_recordable\n#define EGL_ANDROID_recordable 1\n#define EGL_RECORDABLE_ANDROID            0x3142\n#endif /* EGL_ANDROID_recordable */\n\n#ifndef EGL_ANGLE_d3d_share_handle_client_buffer\n#define EGL_ANGLE_d3d_share_handle_client_buffer 1\n#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200\n#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */\n\n#ifndef EGL_ANGLE_device_d3d\n#define EGL_ANGLE_device_d3d 1\n#define EGL_D3D9_DEVICE_ANGLE             0x33A0\n#define EGL_D3D11_DEVICE_ANGLE            0x33A1\n#endif /* EGL_ANGLE_device_d3d */\n\n#ifndef EGL_ANGLE_query_surface_pointer\n#define EGL_ANGLE_query_surface_pointer 1\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);\n#endif\n#endif /* EGL_ANGLE_query_surface_pointer */\n\n#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle\n#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1\n#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */\n\n#ifndef EGL_ANGLE_window_fixed_size\n#define EGL_ANGLE_window_fixed_size 1\n#define EGL_FIXED_SIZE_ANGLE              0x3201\n#endif /* EGL_ANGLE_window_fixed_size */\n\n#ifndef EGL_ARM_pixmap_multisample_discard\n#define EGL_ARM_pixmap_multisample_discard 1\n#define EGL_DISCARD_SAMPLES_ARM           0x3286\n#endif /* EGL_ARM_pixmap_multisample_discard */\n\n#ifndef EGL_EXT_buffer_age\n#define EGL_EXT_buffer_age 1\n#define EGL_BUFFER_AGE_EXT                0x313D\n#endif /* EGL_EXT_buffer_age */\n\n#ifndef EGL_EXT_client_extensions\n#define EGL_EXT_client_extensions 1\n#endif /* EGL_EXT_client_extensions */\n\n#ifndef EGL_EXT_create_context_robustness\n#define EGL_EXT_create_context_robustness 1\n#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF\n#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138\n#define EGL_NO_RESET_NOTIFICATION_EXT     0x31BE\n#define EGL_LOSE_CONTEXT_ON_RESET_EXT     0x31BF\n#endif /* EGL_EXT_create_context_robustness */\n\n#ifndef EGL_EXT_device_base\n#define EGL_EXT_device_base 1\ntypedef void *EGLDeviceEXT;\n#define EGL_NO_DEVICE_EXT                 ((EGLDeviceEXT)(0))\n#define EGL_BAD_DEVICE_EXT                0x322B\n#define EGL_DEVICE_EXT                    0x322C\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value);\ntypedef const char *(EGLAPIENTRYP PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint name);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryDeviceAttribEXT (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value);\nEGLAPI const char *EGLAPIENTRY eglQueryDeviceStringEXT (EGLDeviceEXT device, EGLint name);\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryDevicesEXT (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices);\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT (EGLDisplay dpy, EGLint attribute, EGLAttrib *value);\n#endif\n#endif /* EGL_EXT_device_base */\n\n#ifndef EGL_EXT_device_drm\n#define EGL_EXT_device_drm 1\n#define EGL_DRM_DEVICE_FILE_EXT           0x3233\n#endif /* EGL_EXT_device_drm */\n\n#ifndef EGL_EXT_device_enumeration\n#define EGL_EXT_device_enumeration 1\n#endif /* EGL_EXT_device_enumeration */\n\n#ifndef EGL_EXT_device_openwf\n#define EGL_EXT_device_openwf 1\n#define EGL_OPENWF_DEVICE_ID_EXT          0x3237\n#endif /* EGL_EXT_device_openwf */\n\n#ifndef EGL_EXT_device_query\n#define EGL_EXT_device_query 1\n#endif /* EGL_EXT_device_query */\n\n#ifndef EGL_EXT_image_dma_buf_import\n#define EGL_EXT_image_dma_buf_import 1\n#define EGL_LINUX_DMA_BUF_EXT             0x3270\n#define EGL_LINUX_DRM_FOURCC_EXT          0x3271\n#define EGL_DMA_BUF_PLANE0_FD_EXT         0x3272\n#define EGL_DMA_BUF_PLANE0_OFFSET_EXT     0x3273\n#define EGL_DMA_BUF_PLANE0_PITCH_EXT      0x3274\n#define EGL_DMA_BUF_PLANE1_FD_EXT         0x3275\n#define EGL_DMA_BUF_PLANE1_OFFSET_EXT     0x3276\n#define EGL_DMA_BUF_PLANE1_PITCH_EXT      0x3277\n#define EGL_DMA_BUF_PLANE2_FD_EXT         0x3278\n#define EGL_DMA_BUF_PLANE2_OFFSET_EXT     0x3279\n#define EGL_DMA_BUF_PLANE2_PITCH_EXT      0x327A\n#define EGL_YUV_COLOR_SPACE_HINT_EXT      0x327B\n#define EGL_SAMPLE_RANGE_HINT_EXT         0x327C\n#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D\n#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E\n#define EGL_ITU_REC601_EXT                0x327F\n#define EGL_ITU_REC709_EXT                0x3280\n#define EGL_ITU_REC2020_EXT               0x3281\n#define EGL_YUV_FULL_RANGE_EXT            0x3282\n#define EGL_YUV_NARROW_RANGE_EXT          0x3283\n#define EGL_YUV_CHROMA_SITING_0_EXT       0x3284\n#define EGL_YUV_CHROMA_SITING_0_5_EXT     0x3285\n#endif /* EGL_EXT_image_dma_buf_import */\n\n#ifndef EGL_EXT_multiview_window\n#define EGL_EXT_multiview_window 1\n#define EGL_MULTIVIEW_VIEW_COUNT_EXT      0x3134\n#endif /* EGL_EXT_multiview_window */\n\n#ifndef EGL_EXT_output_base\n#define EGL_EXT_output_base 1\ntypedef void *EGLOutputLayerEXT;\ntypedef void *EGLOutputPortEXT;\n#define EGL_NO_OUTPUT_LAYER_EXT           ((EGLOutputLayerEXT)0)\n#define EGL_NO_OUTPUT_PORT_EXT            ((EGLOutputPortEXT)0)\n#define EGL_BAD_OUTPUT_LAYER_EXT          0x322D\n#define EGL_BAD_OUTPUT_PORT_EXT           0x322E\n#define EGL_SWAP_INTERVAL_EXT             0x322F\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value);\ntypedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value);\ntypedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglGetOutputLayersEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers);\nEGLAPI EGLBoolean EGLAPIENTRY eglGetOutputPortsEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports);\nEGLAPI EGLBoolean EGLAPIENTRY eglOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value);\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value);\nEGLAPI const char *EGLAPIENTRY eglQueryOutputLayerStringEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name);\nEGLAPI EGLBoolean EGLAPIENTRY eglOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value);\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value);\nEGLAPI const char *EGLAPIENTRY eglQueryOutputPortStringEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name);\n#endif\n#endif /* EGL_EXT_output_base */\n\n#ifndef EGL_EXT_output_drm\n#define EGL_EXT_output_drm 1\n#define EGL_DRM_CRTC_EXT                  0x3234\n#define EGL_DRM_PLANE_EXT                 0x3235\n#define EGL_DRM_CONNECTOR_EXT             0x3236\n#endif /* EGL_EXT_output_drm */\n\n#ifndef EGL_EXT_output_openwf\n#define EGL_EXT_output_openwf 1\n#define EGL_OPENWF_PIPELINE_ID_EXT        0x3238\n#define EGL_OPENWF_PORT_ID_EXT            0x3239\n#endif /* EGL_EXT_output_openwf */\n\n#ifndef EGL_EXT_platform_base\n#define EGL_EXT_platform_base 1\ntypedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list);\ntypedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);\ntypedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT (EGLenum platform, void *native_display, const EGLint *attrib_list);\nEGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);\nEGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);\n#endif\n#endif /* EGL_EXT_platform_base */\n\n#ifndef EGL_EXT_platform_device\n#define EGL_EXT_platform_device 1\n#define EGL_PLATFORM_DEVICE_EXT           0x313F\n#endif /* EGL_EXT_platform_device */\n\n#ifndef EGL_EXT_platform_wayland\n#define EGL_EXT_platform_wayland 1\n#define EGL_PLATFORM_WAYLAND_EXT          0x31D8\n#endif /* EGL_EXT_platform_wayland */\n\n#ifndef EGL_EXT_platform_x11\n#define EGL_EXT_platform_x11 1\n#define EGL_PLATFORM_X11_EXT              0x31D5\n#define EGL_PLATFORM_X11_SCREEN_EXT       0x31D6\n#endif /* EGL_EXT_platform_x11 */\n\n#ifndef EGL_EXT_protected_surface\n#define EGL_EXT_protected_surface 1\n#define EGL_PROTECTED_CONTENT_EXT         0x32C0\n#endif /* EGL_EXT_protected_surface */\n\n#ifndef EGL_EXT_stream_consumer_egloutput\n#define EGL_EXT_stream_consumer_egloutput 1\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerOutputEXT (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer);\n#endif\n#endif /* EGL_EXT_stream_consumer_egloutput */\n\n#ifndef EGL_EXT_swap_buffers_with_damage\n#define EGL_EXT_swap_buffers_with_damage 1\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);\n#endif\n#endif /* EGL_EXT_swap_buffers_with_damage */\n\n#ifndef EGL_EXT_yuv_surface\n#define EGL_EXT_yuv_surface 1\n#define EGL_YUV_ORDER_EXT                 0x3301\n#define EGL_YUV_NUMBER_OF_PLANES_EXT      0x3311\n#define EGL_YUV_SUBSAMPLE_EXT             0x3312\n#define EGL_YUV_DEPTH_RANGE_EXT           0x3317\n#define EGL_YUV_CSC_STANDARD_EXT          0x330A\n#define EGL_YUV_PLANE_BPP_EXT             0x331A\n#define EGL_YUV_BUFFER_EXT                0x3300\n#define EGL_YUV_ORDER_YUV_EXT             0x3302\n#define EGL_YUV_ORDER_YVU_EXT             0x3303\n#define EGL_YUV_ORDER_YUYV_EXT            0x3304\n#define EGL_YUV_ORDER_UYVY_EXT            0x3305\n#define EGL_YUV_ORDER_YVYU_EXT            0x3306\n#define EGL_YUV_ORDER_VYUY_EXT            0x3307\n#define EGL_YUV_ORDER_AYUV_EXT            0x3308\n#define EGL_YUV_SUBSAMPLE_4_2_0_EXT       0x3313\n#define EGL_YUV_SUBSAMPLE_4_2_2_EXT       0x3314\n#define EGL_YUV_SUBSAMPLE_4_4_4_EXT       0x3315\n#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT   0x3318\n#define EGL_YUV_DEPTH_RANGE_FULL_EXT      0x3319\n#define EGL_YUV_CSC_STANDARD_601_EXT      0x330B\n#define EGL_YUV_CSC_STANDARD_709_EXT      0x330C\n#define EGL_YUV_CSC_STANDARD_2020_EXT     0x330D\n#define EGL_YUV_PLANE_BPP_0_EXT           0x331B\n#define EGL_YUV_PLANE_BPP_8_EXT           0x331C\n#define EGL_YUV_PLANE_BPP_10_EXT          0x331D\n#endif /* EGL_EXT_yuv_surface */\n\n#ifndef EGL_HI_clientpixmap\n#define EGL_HI_clientpixmap 1\nstruct EGLClientPixmapHI {\n    void  *pData;\n    EGLint iWidth;\n    EGLint iHeight;\n    EGLint iStride;\n};\n#define EGL_CLIENT_PIXMAP_POINTER_HI      0x8F74\ntypedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap);\n#endif\n#endif /* EGL_HI_clientpixmap */\n\n#ifndef EGL_HI_colorformats\n#define EGL_HI_colorformats 1\n#define EGL_COLOR_FORMAT_HI               0x8F70\n#define EGL_COLOR_RGB_HI                  0x8F71\n#define EGL_COLOR_RGBA_HI                 0x8F72\n#define EGL_COLOR_ARGB_HI                 0x8F73\n#endif /* EGL_HI_colorformats */\n\n#ifndef EGL_IMG_context_priority\n#define EGL_IMG_context_priority 1\n#define EGL_CONTEXT_PRIORITY_LEVEL_IMG    0x3100\n#define EGL_CONTEXT_PRIORITY_HIGH_IMG     0x3101\n#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG   0x3102\n#define EGL_CONTEXT_PRIORITY_LOW_IMG      0x3103\n#endif /* EGL_IMG_context_priority */\n\n#ifndef EGL_MESA_drm_image\n#define EGL_MESA_drm_image 1\n#define EGL_DRM_BUFFER_FORMAT_MESA        0x31D0\n#define EGL_DRM_BUFFER_USE_MESA           0x31D1\n#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2\n#define EGL_DRM_BUFFER_MESA               0x31D3\n#define EGL_DRM_BUFFER_STRIDE_MESA        0x31D4\n#define EGL_DRM_BUFFER_USE_SCANOUT_MESA   0x00000001\n#define EGL_DRM_BUFFER_USE_SHARE_MESA     0x00000002\ntypedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride);\n#endif\n#endif /* EGL_MESA_drm_image */\n\n#ifndef EGL_MESA_image_dma_buf_export\n#define EGL_MESA_image_dma_buf_export 1\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageQueryMESA (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers);\nEGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageMESA (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets);\n#endif\n#endif /* EGL_MESA_image_dma_buf_export */\n\n#ifndef EGL_MESA_platform_gbm\n#define EGL_MESA_platform_gbm 1\n#define EGL_PLATFORM_GBM_MESA             0x31D7\n#endif /* EGL_MESA_platform_gbm */\n\n#ifndef EGL_NOK_swap_region\n#define EGL_NOK_swap_region 1\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegionNOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);\n#endif\n#endif /* EGL_NOK_swap_region */\n\n#ifndef EGL_NOK_swap_region2\n#define EGL_NOK_swap_region2 1\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegion2NOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);\n#endif\n#endif /* EGL_NOK_swap_region2 */\n\n#ifndef EGL_NOK_texture_from_pixmap\n#define EGL_NOK_texture_from_pixmap 1\n#define EGL_Y_INVERTED_NOK                0x307F\n#endif /* EGL_NOK_texture_from_pixmap */\n\n#ifndef EGL_NV_3dvision_surface\n#define EGL_NV_3dvision_surface 1\n#define EGL_AUTO_STEREO_NV                0x3136\n#endif /* EGL_NV_3dvision_surface */\n\n#ifndef EGL_NV_coverage_sample\n#define EGL_NV_coverage_sample 1\n#define EGL_COVERAGE_BUFFERS_NV           0x30E0\n#define EGL_COVERAGE_SAMPLES_NV           0x30E1\n#endif /* EGL_NV_coverage_sample */\n\n#ifndef EGL_NV_coverage_sample_resolve\n#define EGL_NV_coverage_sample_resolve 1\n#define EGL_COVERAGE_SAMPLE_RESOLVE_NV    0x3131\n#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132\n#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133\n#endif /* EGL_NV_coverage_sample_resolve */\n\n#ifndef EGL_NV_cuda_event\n#define EGL_NV_cuda_event 1\n#define EGL_CUDA_EVENT_HANDLE_NV          0x323B\n#define EGL_SYNC_CUDA_EVENT_NV            0x323C\n#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV   0x323D\n#endif /* EGL_NV_cuda_event */\n\n#ifndef EGL_NV_depth_nonlinear\n#define EGL_NV_depth_nonlinear 1\n#define EGL_DEPTH_ENCODING_NV             0x30E2\n#define EGL_DEPTH_ENCODING_NONE_NV        0\n#define EGL_DEPTH_ENCODING_NONLINEAR_NV   0x30E3\n#endif /* EGL_NV_depth_nonlinear */\n\n#ifndef EGL_NV_device_cuda\n#define EGL_NV_device_cuda 1\n#define EGL_CUDA_DEVICE_NV                0x323A\n#endif /* EGL_NV_device_cuda */\n\n#ifndef EGL_NV_native_query\n#define EGL_NV_native_query 1\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType *display_id);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeDisplayNV (EGLDisplay dpy, EGLNativeDisplayType *display_id);\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeWindowNV (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window);\nEGLAPI EGLBoolean EGLAPIENTRY eglQueryNativePixmapNV (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap);\n#endif\n#endif /* EGL_NV_native_query */\n\n#ifndef EGL_NV_post_convert_rounding\n#define EGL_NV_post_convert_rounding 1\n#endif /* EGL_NV_post_convert_rounding */\n\n#ifndef EGL_NV_post_sub_buffer\n#define EGL_NV_post_sub_buffer 1\n#define EGL_POST_SUB_BUFFER_SUPPORTED_NV  0x30BE\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height);\n#endif\n#endif /* EGL_NV_post_sub_buffer */\n\n#ifndef EGL_NV_stream_sync\n#define EGL_NV_stream_sync 1\n#define EGL_SYNC_NEW_FRAME_NV             0x321F\ntypedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLSyncKHR EGLAPIENTRY eglCreateStreamSyncNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list);\n#endif\n#endif /* EGL_NV_stream_sync */\n\n#ifndef EGL_NV_sync\n#define EGL_NV_sync 1\ntypedef void *EGLSyncNV;\ntypedef khronos_utime_nanoseconds_t EGLTimeNV;\n#ifdef KHRONOS_SUPPORT_INT64\n#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6\n#define EGL_SYNC_STATUS_NV                0x30E7\n#define EGL_SIGNALED_NV                   0x30E8\n#define EGL_UNSIGNALED_NV                 0x30E9\n#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV    0x0001\n#define EGL_FOREVER_NV                    0xFFFFFFFFFFFFFFFFull\n#define EGL_ALREADY_SIGNALED_NV           0x30EA\n#define EGL_TIMEOUT_EXPIRED_NV            0x30EB\n#define EGL_CONDITION_SATISFIED_NV        0x30EC\n#define EGL_SYNC_TYPE_NV                  0x30ED\n#define EGL_SYNC_CONDITION_NV             0x30EE\n#define EGL_SYNC_FENCE_NV                 0x30EF\n#define EGL_NO_SYNC_NV                    ((EGLSyncNV)0)\ntypedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync);\ntypedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode);\ntypedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);\nEGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync);\nEGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync);\nEGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);\nEGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode);\nEGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value);\n#endif\n#endif /* KHRONOS_SUPPORT_INT64 */\n#endif /* EGL_NV_sync */\n\n#ifndef EGL_NV_system_time\n#define EGL_NV_system_time 1\ntypedef khronos_utime_nanoseconds_t EGLuint64NV;\n#ifdef KHRONOS_SUPPORT_INT64\ntypedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void);\ntypedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void);\n#ifdef EGL_EGLEXT_PROTOTYPES\nEGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV (void);\nEGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV (void);\n#endif\n#endif /* KHRONOS_SUPPORT_INT64 */\n#endif /* EGL_NV_system_time */\n\n#ifndef EGL_TIZEN_image_native_buffer\n#define EGL_TIZEN_image_native_buffer 1\n#define EGL_NATIVE_BUFFER_TIZEN           0x32A0\n#endif /* EGL_TIZEN_image_native_buffer */\n\n#ifndef EGL_TIZEN_image_native_surface\n#define EGL_TIZEN_image_native_surface 1\n#define EGL_NATIVE_SURFACE_TIZEN          0x32A1\n#endif /* EGL_TIZEN_image_native_surface */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __eglext_h_ */\n\n\n#endif /* _MSC_VER */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_endian.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_endian.h\n *\n *  Functions for reading and writing endian-specific values\n */\n\n#ifndef _SDL_endian_h\n#define _SDL_endian_h\n\n#include \"SDL_stdinc.h\"\n\n/**\n *  \\name The two types of endianness\n */\n/* @{ */\n#define SDL_LIL_ENDIAN  1234\n#define SDL_BIG_ENDIAN  4321\n/* @} */\n\n#ifndef SDL_BYTEORDER           /* Not defined in SDL_config.h? */\n#ifdef __linux__\n#include <endian.h>\n#define SDL_BYTEORDER  __BYTE_ORDER\n#else /* __linux__ */\n#if defined(__hppa__) || \\\n    defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \\\n    (defined(__MIPS__) && defined(__MISPEB__)) || \\\n    defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \\\n    defined(__sparc__)\n#define SDL_BYTEORDER   SDL_BIG_ENDIAN\n#else\n#define SDL_BYTEORDER   SDL_LIL_ENDIAN\n#endif\n#endif /* __linux__ */\n#endif /* !SDL_BYTEORDER */\n\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\file SDL_endian.h\n */\n#if defined(__GNUC__) && defined(__i386__) && \\\n   !(__GNUC__ == 2 && __GNUC_MINOR__ == 95 /* broken gcc version */)\nSDL_FORCE_INLINE Uint16\nSDL_Swap16(Uint16 x)\n{\n  __asm__(\"xchgb %b0,%h0\": \"=q\"(x):\"0\"(x));\n    return x;\n}\n#elif defined(__GNUC__) && defined(__x86_64__)\nSDL_FORCE_INLINE Uint16\nSDL_Swap16(Uint16 x)\n{\n  __asm__(\"xchgb %b0,%h0\": \"=Q\"(x):\"0\"(x));\n    return x;\n}\n#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))\nSDL_FORCE_INLINE Uint16\nSDL_Swap16(Uint16 x)\n{\n    int result;\n\n  __asm__(\"rlwimi %0,%2,8,16,23\": \"=&r\"(result):\"0\"(x >> 8), \"r\"(x));\n    return (Uint16)result;\n}\n#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__)\nSDL_FORCE_INLINE Uint16\nSDL_Swap16(Uint16 x)\n{\n  __asm__(\"rorw #8,%0\": \"=d\"(x): \"0\"(x):\"cc\");\n    return x;\n}\n#else\nSDL_FORCE_INLINE Uint16\nSDL_Swap16(Uint16 x)\n{\n    return SDL_static_cast(Uint16, ((x << 8) | (x >> 8)));\n}\n#endif\n\n#if defined(__GNUC__) && defined(__i386__)\nSDL_FORCE_INLINE Uint32\nSDL_Swap32(Uint32 x)\n{\n  __asm__(\"bswap %0\": \"=r\"(x):\"0\"(x));\n    return x;\n}\n#elif defined(__GNUC__) && defined(__x86_64__)\nSDL_FORCE_INLINE Uint32\nSDL_Swap32(Uint32 x)\n{\n  __asm__(\"bswapl %0\": \"=r\"(x):\"0\"(x));\n    return x;\n}\n#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))\nSDL_FORCE_INLINE Uint32\nSDL_Swap32(Uint32 x)\n{\n    Uint32 result;\n\n  __asm__(\"rlwimi %0,%2,24,16,23\": \"=&r\"(result):\"0\"(x >> 24), \"r\"(x));\n  __asm__(\"rlwimi %0,%2,8,8,15\": \"=&r\"(result):\"0\"(result), \"r\"(x));\n  __asm__(\"rlwimi %0,%2,24,0,7\": \"=&r\"(result):\"0\"(result), \"r\"(x));\n    return result;\n}\n#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__)\nSDL_FORCE_INLINE Uint32\nSDL_Swap32(Uint32 x)\n{\n  __asm__(\"rorw #8,%0\\n\\tswap %0\\n\\trorw #8,%0\": \"=d\"(x): \"0\"(x):\"cc\");\n    return x;\n}\n#else\nSDL_FORCE_INLINE Uint32\nSDL_Swap32(Uint32 x)\n{\n    return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) |\n                                    ((x >> 8) & 0x0000FF00) | (x >> 24)));\n}\n#endif\n\n#if defined(__GNUC__) && defined(__i386__)\nSDL_FORCE_INLINE Uint64\nSDL_Swap64(Uint64 x)\n{\n    union\n    {\n        struct\n        {\n            Uint32 a, b;\n        } s;\n        Uint64 u;\n    } v;\n    v.u = x;\n  __asm__(\"bswapl %0 ; bswapl %1 ; xchgl %0,%1\": \"=r\"(v.s.a), \"=r\"(v.s.b):\"0\"(v.s.a),\n            \"1\"(v.s.\n                b));\n    return v.u;\n}\n#elif defined(__GNUC__) && defined(__x86_64__)\nSDL_FORCE_INLINE Uint64\nSDL_Swap64(Uint64 x)\n{\n  __asm__(\"bswapq %0\": \"=r\"(x):\"0\"(x));\n    return x;\n}\n#else\nSDL_FORCE_INLINE Uint64\nSDL_Swap64(Uint64 x)\n{\n    Uint32 hi, lo;\n\n    /* Separate into high and low 32-bit values and swap them */\n    lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF);\n    x >>= 32;\n    hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF);\n    x = SDL_Swap32(lo);\n    x <<= 32;\n    x |= SDL_Swap32(hi);\n    return (x);\n}\n#endif\n\n\nSDL_FORCE_INLINE float\nSDL_SwapFloat(float x)\n{\n    union\n    {\n        float f;\n        Uint32 ui32;\n    } swapper;\n    swapper.f = x;\n    swapper.ui32 = SDL_Swap32(swapper.ui32);\n    return swapper.f;\n}\n\n\n/**\n *  \\name Swap to native\n *  Byteswap item from the specified endianness to the native endianness.\n */\n/* @{ */\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n#define SDL_SwapLE16(X) (X)\n#define SDL_SwapLE32(X) (X)\n#define SDL_SwapLE64(X) (X)\n#define SDL_SwapFloatLE(X)  (X)\n#define SDL_SwapBE16(X) SDL_Swap16(X)\n#define SDL_SwapBE32(X) SDL_Swap32(X)\n#define SDL_SwapBE64(X) SDL_Swap64(X)\n#define SDL_SwapFloatBE(X)  SDL_SwapFloat(X)\n#else\n#define SDL_SwapLE16(X) SDL_Swap16(X)\n#define SDL_SwapLE32(X) SDL_Swap32(X)\n#define SDL_SwapLE64(X) SDL_Swap64(X)\n#define SDL_SwapFloatLE(X)  SDL_SwapFloat(X)\n#define SDL_SwapBE16(X) (X)\n#define SDL_SwapBE32(X) (X)\n#define SDL_SwapBE64(X) (X)\n#define SDL_SwapFloatBE(X)  (X)\n#endif\n/* @} *//* Swap to native */\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_endian_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_error.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_error.h\n *\n *  Simple error message routines for SDL.\n */\n\n#ifndef _SDL_error_h\n#define _SDL_error_h\n\n#include \"SDL_stdinc.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Public functions */\n/* SDL_SetError() unconditionally returns -1. */\nextern DECLSPEC int SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1);\nextern DECLSPEC const char *SDLCALL SDL_GetError(void);\nextern DECLSPEC void SDLCALL SDL_ClearError(void);\n\n/**\n *  \\name Internal error functions\n *\n *  \\internal\n *  Private error reporting function - used internally.\n */\n/* @{ */\n#define SDL_OutOfMemory()   SDL_Error(SDL_ENOMEM)\n#define SDL_Unsupported()   SDL_Error(SDL_UNSUPPORTED)\n#define SDL_InvalidParamError(param)    SDL_SetError(\"Parameter '%s' is invalid\", (param))\ntypedef enum\n{\n    SDL_ENOMEM,\n    SDL_EFREAD,\n    SDL_EFWRITE,\n    SDL_EFSEEK,\n    SDL_UNSUPPORTED,\n    SDL_LASTERROR\n} SDL_errorcode;\n/* SDL_Error() unconditionally returns -1. */\nextern DECLSPEC int SDLCALL SDL_Error(SDL_errorcode code);\n/* @} *//* Internal error functions */\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_error_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_events.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_events.h\n *\n *  Include file for SDL event handling.\n */\n\n#ifndef _SDL_events_h\n#define _SDL_events_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_video.h\"\n#include \"SDL_keyboard.h\"\n#include \"SDL_mouse.h\"\n#include \"SDL_joystick.h\"\n#include \"SDL_gamecontroller.h\"\n#include \"SDL_quit.h\"\n#include \"SDL_gesture.h\"\n#include \"SDL_touch.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* General keyboard/mouse state definitions */\n#define SDL_RELEASED    0\n#define SDL_PRESSED 1\n\n/**\n * \\brief The types of events that can be delivered.\n */\ntypedef enum\n{\n    SDL_FIRSTEVENT     = 0,     /**< Unused (do not remove) */\n\n    /* Application events */\n    SDL_QUIT           = 0x100, /**< User-requested quit */\n\n    /* These application events have special meaning on iOS, see README-ios.md for details */\n    SDL_APP_TERMINATING,        /**< The application is being terminated by the OS\n                                     Called on iOS in applicationWillTerminate()\n                                     Called on Android in onDestroy()\n                                */\n    SDL_APP_LOWMEMORY,          /**< The application is low on memory, free memory if possible.\n                                     Called on iOS in applicationDidReceiveMemoryWarning()\n                                     Called on Android in onLowMemory()\n                                */\n    SDL_APP_WILLENTERBACKGROUND, /**< The application is about to enter the background\n                                     Called on iOS in applicationWillResignActive()\n                                     Called on Android in onPause()\n                                */\n    SDL_APP_DIDENTERBACKGROUND, /**< The application did enter the background and may not get CPU for some time\n                                     Called on iOS in applicationDidEnterBackground()\n                                     Called on Android in onPause()\n                                */\n    SDL_APP_WILLENTERFOREGROUND, /**< The application is about to enter the foreground\n                                     Called on iOS in applicationWillEnterForeground()\n                                     Called on Android in onResume()\n                                */\n    SDL_APP_DIDENTERFOREGROUND, /**< The application is now interactive\n                                     Called on iOS in applicationDidBecomeActive()\n                                     Called on Android in onResume()\n                                */\n\n    /* Window events */\n    SDL_WINDOWEVENT    = 0x200, /**< Window state change */\n    SDL_SYSWMEVENT,             /**< System specific event */\n\n    /* Keyboard events */\n    SDL_KEYDOWN        = 0x300, /**< Key pressed */\n    SDL_KEYUP,                  /**< Key released */\n    SDL_TEXTEDITING,            /**< Keyboard text editing (composition) */\n    SDL_TEXTINPUT,              /**< Keyboard text input */\n    SDL_KEYMAPCHANGED,          /**< Keymap changed due to a system event such as an\n                                     input language or keyboard layout change.\n                                */\n\n    /* Mouse events */\n    SDL_MOUSEMOTION    = 0x400, /**< Mouse moved */\n    SDL_MOUSEBUTTONDOWN,        /**< Mouse button pressed */\n    SDL_MOUSEBUTTONUP,          /**< Mouse button released */\n    SDL_MOUSEWHEEL,             /**< Mouse wheel motion */\n\n    /* Joystick events */\n    SDL_JOYAXISMOTION  = 0x600, /**< Joystick axis motion */\n    SDL_JOYBALLMOTION,          /**< Joystick trackball motion */\n    SDL_JOYHATMOTION,           /**< Joystick hat position change */\n    SDL_JOYBUTTONDOWN,          /**< Joystick button pressed */\n    SDL_JOYBUTTONUP,            /**< Joystick button released */\n    SDL_JOYDEVICEADDED,         /**< A new joystick has been inserted into the system */\n    SDL_JOYDEVICEREMOVED,       /**< An opened joystick has been removed */\n\n    /* Game controller events */\n    SDL_CONTROLLERAXISMOTION  = 0x650, /**< Game controller axis motion */\n    SDL_CONTROLLERBUTTONDOWN,          /**< Game controller button pressed */\n    SDL_CONTROLLERBUTTONUP,            /**< Game controller button released */\n    SDL_CONTROLLERDEVICEADDED,         /**< A new Game controller has been inserted into the system */\n    SDL_CONTROLLERDEVICEREMOVED,       /**< An opened Game controller has been removed */\n    SDL_CONTROLLERDEVICEREMAPPED,      /**< The controller mapping was updated */\n\n    /* Touch events */\n    SDL_FINGERDOWN      = 0x700,\n    SDL_FINGERUP,\n    SDL_FINGERMOTION,\n\n    /* Gesture events */\n    SDL_DOLLARGESTURE   = 0x800,\n    SDL_DOLLARRECORD,\n    SDL_MULTIGESTURE,\n\n    /* Clipboard events */\n    SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard changed */\n\n    /* Drag and drop events */\n    SDL_DROPFILE        = 0x1000, /**< The system requests a file open */\n    SDL_DROPTEXT,                 /**< text/plain drag-and-drop event */\n    SDL_DROPBEGIN,                /**< A new set of drops is beginning (NULL filename) */\n    SDL_DROPCOMPLETE,             /**< Current set of drops is now complete (NULL filename) */\n\n    /* Audio hotplug events */\n    SDL_AUDIODEVICEADDED = 0x1100, /**< A new audio device is available */\n    SDL_AUDIODEVICEREMOVED,        /**< An audio device has been removed. */\n\n    /* Render events */\n    SDL_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset and their contents need to be updated */\n    SDL_RENDER_DEVICE_RESET, /**< The device has been reset and all textures need to be recreated */\n\n    /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use,\n     *  and should be allocated with SDL_RegisterEvents()\n     */\n    SDL_USEREVENT    = 0x8000,\n\n    /**\n     *  This last event is only for bounding internal arrays\n     */\n    SDL_LASTEVENT    = 0xFFFF\n} SDL_EventType;\n\n/**\n *  \\brief Fields shared by every event\n */\ntypedef struct SDL_CommonEvent\n{\n    Uint32 type;\n    Uint32 timestamp;\n} SDL_CommonEvent;\n\n/**\n *  \\brief Window state change event data (event.window.*)\n */\ntypedef struct SDL_WindowEvent\n{\n    Uint32 type;        /**< ::SDL_WINDOWEVENT */\n    Uint32 timestamp;\n    Uint32 windowID;    /**< The associated window */\n    Uint8 event;        /**< ::SDL_WindowEventID */\n    Uint8 padding1;\n    Uint8 padding2;\n    Uint8 padding3;\n    Sint32 data1;       /**< event dependent data */\n    Sint32 data2;       /**< event dependent data */\n} SDL_WindowEvent;\n\n/**\n *  \\brief Keyboard button event structure (event.key.*)\n */\ntypedef struct SDL_KeyboardEvent\n{\n    Uint32 type;        /**< ::SDL_KEYDOWN or ::SDL_KEYUP */\n    Uint32 timestamp;\n    Uint32 windowID;    /**< The window with keyboard focus, if any */\n    Uint8 state;        /**< ::SDL_PRESSED or ::SDL_RELEASED */\n    Uint8 repeat;       /**< Non-zero if this is a key repeat */\n    Uint8 padding2;\n    Uint8 padding3;\n    SDL_Keysym keysym;  /**< The key that was pressed or released */\n} SDL_KeyboardEvent;\n\n#define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32)\n/**\n *  \\brief Keyboard text editing event structure (event.edit.*)\n */\ntypedef struct SDL_TextEditingEvent\n{\n    Uint32 type;                                /**< ::SDL_TEXTEDITING */\n    Uint32 timestamp;\n    Uint32 windowID;                            /**< The window with keyboard focus, if any */\n    char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE];  /**< The editing text */\n    Sint32 start;                               /**< The start cursor of selected editing text */\n    Sint32 length;                              /**< The length of selected editing text */\n} SDL_TextEditingEvent;\n\n\n#define SDL_TEXTINPUTEVENT_TEXT_SIZE (32)\n/**\n *  \\brief Keyboard text input event structure (event.text.*)\n */\ntypedef struct SDL_TextInputEvent\n{\n    Uint32 type;                              /**< ::SDL_TEXTINPUT */\n    Uint32 timestamp;\n    Uint32 windowID;                          /**< The window with keyboard focus, if any */\n    char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];  /**< The input text */\n} SDL_TextInputEvent;\n\n/**\n *  \\brief Mouse motion event structure (event.motion.*)\n */\ntypedef struct SDL_MouseMotionEvent\n{\n    Uint32 type;        /**< ::SDL_MOUSEMOTION */\n    Uint32 timestamp;\n    Uint32 windowID;    /**< The window with mouse focus, if any */\n    Uint32 which;       /**< The mouse instance id, or SDL_TOUCH_MOUSEID */\n    Uint32 state;       /**< The current button state */\n    Sint32 x;           /**< X coordinate, relative to window */\n    Sint32 y;           /**< Y coordinate, relative to window */\n    Sint32 xrel;        /**< The relative motion in the X direction */\n    Sint32 yrel;        /**< The relative motion in the Y direction */\n} SDL_MouseMotionEvent;\n\n/**\n *  \\brief Mouse button event structure (event.button.*)\n */\ntypedef struct SDL_MouseButtonEvent\n{\n    Uint32 type;        /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */\n    Uint32 timestamp;\n    Uint32 windowID;    /**< The window with mouse focus, if any */\n    Uint32 which;       /**< The mouse instance id, or SDL_TOUCH_MOUSEID */\n    Uint8 button;       /**< The mouse button index */\n    Uint8 state;        /**< ::SDL_PRESSED or ::SDL_RELEASED */\n    Uint8 clicks;       /**< 1 for single-click, 2 for double-click, etc. */\n    Uint8 padding1;\n    Sint32 x;           /**< X coordinate, relative to window */\n    Sint32 y;           /**< Y coordinate, relative to window */\n} SDL_MouseButtonEvent;\n\n/**\n *  \\brief Mouse wheel event structure (event.wheel.*)\n */\ntypedef struct SDL_MouseWheelEvent\n{\n    Uint32 type;        /**< ::SDL_MOUSEWHEEL */\n    Uint32 timestamp;\n    Uint32 windowID;    /**< The window with mouse focus, if any */\n    Uint32 which;       /**< The mouse instance id, or SDL_TOUCH_MOUSEID */\n    Sint32 x;           /**< The amount scrolled horizontally, positive to the right and negative to the left */\n    Sint32 y;           /**< The amount scrolled vertically, positive away from the user and negative toward the user */\n    Uint32 direction;   /**< Set to one of the SDL_MOUSEWHEEL_* defines. When FLIPPED the values in X and Y will be opposite. Multiply by -1 to change them back */\n} SDL_MouseWheelEvent;\n\n/**\n *  \\brief Joystick axis motion event structure (event.jaxis.*)\n */\ntypedef struct SDL_JoyAxisEvent\n{\n    Uint32 type;        /**< ::SDL_JOYAXISMOTION */\n    Uint32 timestamp;\n    SDL_JoystickID which; /**< The joystick instance id */\n    Uint8 axis;         /**< The joystick axis index */\n    Uint8 padding1;\n    Uint8 padding2;\n    Uint8 padding3;\n    Sint16 value;       /**< The axis value (range: -32768 to 32767) */\n    Uint16 padding4;\n} SDL_JoyAxisEvent;\n\n/**\n *  \\brief Joystick trackball motion event structure (event.jball.*)\n */\ntypedef struct SDL_JoyBallEvent\n{\n    Uint32 type;        /**< ::SDL_JOYBALLMOTION */\n    Uint32 timestamp;\n    SDL_JoystickID which; /**< The joystick instance id */\n    Uint8 ball;         /**< The joystick trackball index */\n    Uint8 padding1;\n    Uint8 padding2;\n    Uint8 padding3;\n    Sint16 xrel;        /**< The relative motion in the X direction */\n    Sint16 yrel;        /**< The relative motion in the Y direction */\n} SDL_JoyBallEvent;\n\n/**\n *  \\brief Joystick hat position change event structure (event.jhat.*)\n */\ntypedef struct SDL_JoyHatEvent\n{\n    Uint32 type;        /**< ::SDL_JOYHATMOTION */\n    Uint32 timestamp;\n    SDL_JoystickID which; /**< The joystick instance id */\n    Uint8 hat;          /**< The joystick hat index */\n    Uint8 value;        /**< The hat position value.\n                         *   \\sa ::SDL_HAT_LEFTUP ::SDL_HAT_UP ::SDL_HAT_RIGHTUP\n                         *   \\sa ::SDL_HAT_LEFT ::SDL_HAT_CENTERED ::SDL_HAT_RIGHT\n                         *   \\sa ::SDL_HAT_LEFTDOWN ::SDL_HAT_DOWN ::SDL_HAT_RIGHTDOWN\n                         *\n                         *   Note that zero means the POV is centered.\n                         */\n    Uint8 padding1;\n    Uint8 padding2;\n} SDL_JoyHatEvent;\n\n/**\n *  \\brief Joystick button event structure (event.jbutton.*)\n */\ntypedef struct SDL_JoyButtonEvent\n{\n    Uint32 type;        /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */\n    Uint32 timestamp;\n    SDL_JoystickID which; /**< The joystick instance id */\n    Uint8 button;       /**< The joystick button index */\n    Uint8 state;        /**< ::SDL_PRESSED or ::SDL_RELEASED */\n    Uint8 padding1;\n    Uint8 padding2;\n} SDL_JoyButtonEvent;\n\n/**\n *  \\brief Joystick device event structure (event.jdevice.*)\n */\ntypedef struct SDL_JoyDeviceEvent\n{\n    Uint32 type;        /**< ::SDL_JOYDEVICEADDED or ::SDL_JOYDEVICEREMOVED */\n    Uint32 timestamp;\n    Sint32 which;       /**< The joystick device index for the ADDED event, instance id for the REMOVED event */\n} SDL_JoyDeviceEvent;\n\n\n/**\n *  \\brief Game controller axis motion event structure (event.caxis.*)\n */\ntypedef struct SDL_ControllerAxisEvent\n{\n    Uint32 type;        /**< ::SDL_CONTROLLERAXISMOTION */\n    Uint32 timestamp;\n    SDL_JoystickID which; /**< The joystick instance id */\n    Uint8 axis;         /**< The controller axis (SDL_GameControllerAxis) */\n    Uint8 padding1;\n    Uint8 padding2;\n    Uint8 padding3;\n    Sint16 value;       /**< The axis value (range: -32768 to 32767) */\n    Uint16 padding4;\n} SDL_ControllerAxisEvent;\n\n\n/**\n *  \\brief Game controller button event structure (event.cbutton.*)\n */\ntypedef struct SDL_ControllerButtonEvent\n{\n    Uint32 type;        /**< ::SDL_CONTROLLERBUTTONDOWN or ::SDL_CONTROLLERBUTTONUP */\n    Uint32 timestamp;\n    SDL_JoystickID which; /**< The joystick instance id */\n    Uint8 button;       /**< The controller button (SDL_GameControllerButton) */\n    Uint8 state;        /**< ::SDL_PRESSED or ::SDL_RELEASED */\n    Uint8 padding1;\n    Uint8 padding2;\n} SDL_ControllerButtonEvent;\n\n\n/**\n *  \\brief Controller device event structure (event.cdevice.*)\n */\ntypedef struct SDL_ControllerDeviceEvent\n{\n    Uint32 type;        /**< ::SDL_CONTROLLERDEVICEADDED, ::SDL_CONTROLLERDEVICEREMOVED, or ::SDL_CONTROLLERDEVICEREMAPPED */\n    Uint32 timestamp;\n    Sint32 which;       /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */\n} SDL_ControllerDeviceEvent;\n\n/**\n *  \\brief Audio device event structure (event.adevice.*)\n */\ntypedef struct SDL_AudioDeviceEvent\n{\n    Uint32 type;        /**< ::SDL_AUDIODEVICEADDED, or ::SDL_AUDIODEVICEREMOVED */\n    Uint32 timestamp;\n    Uint32 which;       /**< The audio device index for the ADDED event (valid until next SDL_GetNumAudioDevices() call), SDL_AudioDeviceID for the REMOVED event */\n    Uint8 iscapture;    /**< zero if an output device, non-zero if a capture device. */\n    Uint8 padding1;\n    Uint8 padding2;\n    Uint8 padding3;\n} SDL_AudioDeviceEvent;\n\n\n/**\n *  \\brief Touch finger event structure (event.tfinger.*)\n */\ntypedef struct SDL_TouchFingerEvent\n{\n    Uint32 type;        /**< ::SDL_FINGERMOTION or ::SDL_FINGERDOWN or ::SDL_FINGERUP */\n    Uint32 timestamp;\n    SDL_TouchID touchId; /**< The touch device id */\n    SDL_FingerID fingerId;\n    float x;            /**< Normalized in the range 0...1 */\n    float y;            /**< Normalized in the range 0...1 */\n    float dx;           /**< Normalized in the range -1...1 */\n    float dy;           /**< Normalized in the range -1...1 */\n    float pressure;     /**< Normalized in the range 0...1 */\n} SDL_TouchFingerEvent;\n\n\n/**\n *  \\brief Multiple Finger Gesture Event (event.mgesture.*)\n */\ntypedef struct SDL_MultiGestureEvent\n{\n    Uint32 type;        /**< ::SDL_MULTIGESTURE */\n    Uint32 timestamp;\n    SDL_TouchID touchId; /**< The touch device index */\n    float dTheta;\n    float dDist;\n    float x;\n    float y;\n    Uint16 numFingers;\n    Uint16 padding;\n} SDL_MultiGestureEvent;\n\n\n/**\n * \\brief Dollar Gesture Event (event.dgesture.*)\n */\ntypedef struct SDL_DollarGestureEvent\n{\n    Uint32 type;        /**< ::SDL_DOLLARGESTURE or ::SDL_DOLLARRECORD */\n    Uint32 timestamp;\n    SDL_TouchID touchId; /**< The touch device id */\n    SDL_GestureID gestureId;\n    Uint32 numFingers;\n    float error;\n    float x;            /**< Normalized center of gesture */\n    float y;            /**< Normalized center of gesture */\n} SDL_DollarGestureEvent;\n\n\n/**\n *  \\brief An event used to request a file open by the system (event.drop.*)\n *         This event is enabled by default, you can disable it with SDL_EventState().\n *  \\note If this event is enabled, you must free the filename in the event.\n */\ntypedef struct SDL_DropEvent\n{\n    Uint32 type;        /**< ::SDL_DROPBEGIN or ::SDL_DROPFILE or ::SDL_DROPTEXT or ::SDL_DROPCOMPLETE */\n    Uint32 timestamp;\n    char *file;         /**< The file name, which should be freed with SDL_free(), is NULL on begin/complete */\n    Uint32 windowID;    /**< The window that was dropped on, if any */\n} SDL_DropEvent;\n\n\n/**\n *  \\brief The \"quit requested\" event\n */\ntypedef struct SDL_QuitEvent\n{\n    Uint32 type;        /**< ::SDL_QUIT */\n    Uint32 timestamp;\n} SDL_QuitEvent;\n\n/**\n *  \\brief OS Specific event\n */\ntypedef struct SDL_OSEvent\n{\n    Uint32 type;        /**< ::SDL_QUIT */\n    Uint32 timestamp;\n} SDL_OSEvent;\n\n/**\n *  \\brief A user-defined event type (event.user.*)\n */\ntypedef struct SDL_UserEvent\n{\n    Uint32 type;        /**< ::SDL_USEREVENT through ::SDL_LASTEVENT-1 */\n    Uint32 timestamp;\n    Uint32 windowID;    /**< The associated window if any */\n    Sint32 code;        /**< User defined event code */\n    void *data1;        /**< User defined data pointer */\n    void *data2;        /**< User defined data pointer */\n} SDL_UserEvent;\n\n\nstruct SDL_SysWMmsg;\ntypedef struct SDL_SysWMmsg SDL_SysWMmsg;\n\n/**\n *  \\brief A video driver dependent system event (event.syswm.*)\n *         This event is disabled by default, you can enable it with SDL_EventState()\n *\n *  \\note If you want to use this event, you should include SDL_syswm.h.\n */\ntypedef struct SDL_SysWMEvent\n{\n    Uint32 type;        /**< ::SDL_SYSWMEVENT */\n    Uint32 timestamp;\n    SDL_SysWMmsg *msg;  /**< driver dependent data, defined in SDL_syswm.h */\n} SDL_SysWMEvent;\n\n/**\n *  \\brief General event structure\n */\ntypedef union SDL_Event\n{\n    Uint32 type;                    /**< Event type, shared with all events */\n    SDL_CommonEvent common;         /**< Common event data */\n    SDL_WindowEvent window;         /**< Window event data */\n    SDL_KeyboardEvent key;          /**< Keyboard event data */\n    SDL_TextEditingEvent edit;      /**< Text editing event data */\n    SDL_TextInputEvent text;        /**< Text input event data */\n    SDL_MouseMotionEvent motion;    /**< Mouse motion event data */\n    SDL_MouseButtonEvent button;    /**< Mouse button event data */\n    SDL_MouseWheelEvent wheel;      /**< Mouse wheel event data */\n    SDL_JoyAxisEvent jaxis;         /**< Joystick axis event data */\n    SDL_JoyBallEvent jball;         /**< Joystick ball event data */\n    SDL_JoyHatEvent jhat;           /**< Joystick hat event data */\n    SDL_JoyButtonEvent jbutton;     /**< Joystick button event data */\n    SDL_JoyDeviceEvent jdevice;     /**< Joystick device change event data */\n    SDL_ControllerAxisEvent caxis;      /**< Game Controller axis event data */\n    SDL_ControllerButtonEvent cbutton;  /**< Game Controller button event data */\n    SDL_ControllerDeviceEvent cdevice;  /**< Game Controller device event data */\n    SDL_AudioDeviceEvent adevice;   /**< Audio device event data */\n    SDL_QuitEvent quit;             /**< Quit request event data */\n    SDL_UserEvent user;             /**< Custom event data */\n    SDL_SysWMEvent syswm;           /**< System dependent window event data */\n    SDL_TouchFingerEvent tfinger;   /**< Touch finger event data */\n    SDL_MultiGestureEvent mgesture; /**< Gesture event data */\n    SDL_DollarGestureEvent dgesture; /**< Gesture event data */\n    SDL_DropEvent drop;             /**< Drag and drop event data */\n\n    /* This is necessary for ABI compatibility between Visual C++ and GCC\n       Visual C++ will respect the push pack pragma and use 52 bytes for\n       this structure, and GCC will use the alignment of the largest datatype\n       within the union, which is 8 bytes.\n\n       So... we'll add padding to force the size to be 56 bytes for both.\n    */\n    Uint8 padding[56];\n} SDL_Event;\n\n\n/* Function prototypes */\n\n/**\n *  Pumps the event loop, gathering events from the input devices.\n *\n *  This function updates the event queue and internal input device state.\n *\n *  This should only be run in the thread that sets the video mode.\n */\nextern DECLSPEC void SDLCALL SDL_PumpEvents(void);\n\n/* @{ */\ntypedef enum\n{\n    SDL_ADDEVENT,\n    SDL_PEEKEVENT,\n    SDL_GETEVENT\n} SDL_eventaction;\n\n/**\n *  Checks the event queue for messages and optionally returns them.\n *\n *  If \\c action is ::SDL_ADDEVENT, up to \\c numevents events will be added to\n *  the back of the event queue.\n *\n *  If \\c action is ::SDL_PEEKEVENT, up to \\c numevents events at the front\n *  of the event queue, within the specified minimum and maximum type,\n *  will be returned and will not be removed from the queue.\n *\n *  If \\c action is ::SDL_GETEVENT, up to \\c numevents events at the front\n *  of the event queue, within the specified minimum and maximum type,\n *  will be returned and will be removed from the queue.\n *\n *  \\return The number of events actually stored, or -1 if there was an error.\n *\n *  This function is thread-safe.\n */\nextern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents,\n                                           SDL_eventaction action,\n                                           Uint32 minType, Uint32 maxType);\n/* @} */\n\n/**\n *  Checks to see if certain event types are in the event queue.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type);\nextern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType);\n\n/**\n *  This function clears events from the event queue\n *  This function only affects currently queued events. If you want to make\n *  sure that all pending OS events are flushed, you can call SDL_PumpEvents()\n *  on the main thread immediately before the flush call.\n */\nextern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type);\nextern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType);\n\n/**\n *  \\brief Polls for currently pending events.\n *\n *  \\return 1 if there are any pending events, or 0 if there are none available.\n *\n *  \\param event If not NULL, the next event is removed from the queue and\n *               stored in that area.\n */\nextern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event);\n\n/**\n *  \\brief Waits indefinitely for the next available event.\n *\n *  \\return 1, or 0 if there was an error while waiting for events.\n *\n *  \\param event If not NULL, the next event is removed from the queue and\n *               stored in that area.\n */\nextern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event);\n\n/**\n *  \\brief Waits until the specified timeout (in milliseconds) for the next\n *         available event.\n *\n *  \\return 1, or 0 if there was an error while waiting for events.\n *\n *  \\param event If not NULL, the next event is removed from the queue and\n *               stored in that area.\n *  \\param timeout The timeout (in milliseconds) to wait for next event.\n */\nextern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event,\n                                                 int timeout);\n\n/**\n *  \\brief Add an event to the event queue.\n *\n *  \\return 1 on success, 0 if the event was filtered, or -1 if the event queue\n *          was full or there was some other error.\n */\nextern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event * event);\n\ntypedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event);\n\n/**\n *  Sets up a filter to process all events before they change internal state and\n *  are posted to the internal event queue.\n *\n *  The filter is prototyped as:\n *  \\code\n *      int SDL_EventFilter(void *userdata, SDL_Event * event);\n *  \\endcode\n *\n *  If the filter returns 1, then the event will be added to the internal queue.\n *  If it returns 0, then the event will be dropped from the queue, but the\n *  internal state will still be updated.  This allows selective filtering of\n *  dynamically arriving events.\n *\n *  \\warning  Be very careful of what you do in the event filter function, as\n *            it may run in a different thread!\n *\n *  There is one caveat when dealing with the ::SDL_QuitEvent event type.  The\n *  event filter is only called when the window manager desires to close the\n *  application window.  If the event filter returns 1, then the window will\n *  be closed, otherwise the window will remain open if possible.\n *\n *  If the quit event is generated by an interrupt signal, it will bypass the\n *  internal queue and be delivered to the application at the next event poll.\n */\nextern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter,\n                                                void *userdata);\n\n/**\n *  Return the current event filter - can be used to \"chain\" filters.\n *  If there is no event filter set, this function returns SDL_FALSE.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter,\n                                                    void **userdata);\n\n/**\n *  Add a function which is called when an event is added to the queue.\n */\nextern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter,\n                                               void *userdata);\n\n/**\n *  Remove an event watch function added with SDL_AddEventWatch()\n */\nextern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter,\n                                               void *userdata);\n\n/**\n *  Run the filter function on the current event queue, removing any\n *  events for which the filter returns 0.\n */\nextern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter,\n                                              void *userdata);\n\n/* @{ */\n#define SDL_QUERY   -1\n#define SDL_IGNORE   0\n#define SDL_DISABLE  0\n#define SDL_ENABLE   1\n\n/**\n *  This function allows you to set the state of processing certain events.\n *   - If \\c state is set to ::SDL_IGNORE, that event will be automatically\n *     dropped from the event queue and will not event be filtered.\n *   - If \\c state is set to ::SDL_ENABLE, that event will be processed\n *     normally.\n *   - If \\c state is set to ::SDL_QUERY, SDL_EventState() will return the\n *     current processing state of the specified event.\n */\nextern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state);\n/* @} */\n#define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY)\n\n/**\n *  This function allocates a set of user-defined events, and returns\n *  the beginning event number for that set of events.\n *\n *  If there aren't enough user-defined events left, this function\n *  returns (Uint32)-1\n */\nextern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_events_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_filesystem.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_filesystem.h\n *\n *  \\brief Include file for filesystem SDL API functions\n */\n\n#ifndef _SDL_filesystem_h\n#define _SDL_filesystem_h\n\n#include \"SDL_stdinc.h\"\n\n#include \"begin_code.h\"\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief Get the path where the application resides.\n *\n * Get the \"base path\". This is the directory where the application was run\n *  from, which is probably the installation directory, and may or may not\n *  be the process's current working directory.\n *\n * This returns an absolute path in UTF-8 encoding, and is guaranteed to\n *  end with a path separator ('\\\\' on Windows, '/' most other places).\n *\n * The pointer returned by this function is owned by you. Please call\n *  SDL_free() on the pointer when you are done with it, or it will be a\n *  memory leak. This is not necessarily a fast call, though, so you should\n *  call this once near startup and save the string if you need it.\n *\n * Some platforms can't determine the application's path, and on other\n *  platforms, this might be meaningless. In such cases, this function will\n *  return NULL.\n *\n *  \\return String of base dir in UTF-8 encoding, or NULL on error.\n *\n * \\sa SDL_GetPrefPath\n */\nextern DECLSPEC char *SDLCALL SDL_GetBasePath(void);\n\n/**\n * \\brief Get the user-and-app-specific path where files can be written.\n *\n * Get the \"pref dir\". This is meant to be where users can write personal\n *  files (preferences and save games, etc) that are specific to your\n *  application. This directory is unique per user, per application.\n *\n * This function will decide the appropriate location in the native filesystem,\n *  create the directory if necessary, and return a string of the absolute\n *  path to the directory in UTF-8 encoding.\n *\n * On Windows, the string might look like:\n *  \"C:\\\\Users\\\\bob\\\\AppData\\\\Roaming\\\\My Company\\\\My Program Name\\\\\"\n *\n * On Linux, the string might look like:\n *  \"/home/bob/.local/share/My Program Name/\"\n *\n * On Mac OS X, the string might look like:\n *  \"/Users/bob/Library/Application Support/My Program Name/\"\n *\n * (etc.)\n *\n * You specify the name of your organization (if it's not a real organization,\n *  your name or an Internet domain you own might do) and the name of your\n *  application. These should be untranslated proper names.\n *\n * Both the org and app strings may become part of a directory name, so\n *  please follow these rules:\n *\n *    - Try to use the same org string (including case-sensitivity) for\n *      all your applications that use this function.\n *    - Always use a unique app string for each one, and make sure it never\n *      changes for an app once you've decided on it.\n *    - Unicode characters are legal, as long as it's UTF-8 encoded, but...\n *    - ...only use letters, numbers, and spaces. Avoid punctuation like\n *      \"Game Name 2: Bad Guy's Revenge!\" ... \"Game Name 2\" is sufficient.\n *\n * This returns an absolute path in UTF-8 encoding, and is guaranteed to\n *  end with a path separator ('\\\\' on Windows, '/' most other places).\n *\n * The pointer returned by this function is owned by you. Please call\n *  SDL_free() on the pointer when you are done with it, or it will be a\n *  memory leak. This is not necessarily a fast call, though, so you should\n *  call this once near startup and save the string if you need it.\n *\n * You should assume the path returned by this function is the only safe\n *  place to write files (and that SDL_GetBasePath(), while it might be\n *  writable, or even the parent of the returned path, aren't where you\n *  should be writing things).\n *\n * Some platforms can't determine the pref path, and on other\n *  platforms, this might be meaningless. In such cases, this function will\n *  return NULL.\n *\n *   \\param org The name of your organization.\n *   \\param app The name of your application.\n *  \\return UTF-8 string of user dir in platform-dependent notation. NULL\n *          if there's a problem (creating directory failed, etc).\n *\n * \\sa SDL_GetBasePath\n */\nextern DECLSPEC char *SDLCALL SDL_GetPrefPath(const char *org, const char *app);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_filesystem_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_gamecontroller.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_gamecontroller.h\n *\n *  Include file for SDL game controller event handling\n */\n\n#ifndef _SDL_gamecontroller_h\n#define _SDL_gamecontroller_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_rwops.h\"\n#include \"SDL_joystick.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\file SDL_gamecontroller.h\n *\n *  In order to use these functions, SDL_Init() must have been called\n *  with the ::SDL_INIT_GAMECONTROLLER flag.  This causes SDL to scan the system\n *  for game controllers, and load appropriate drivers.\n *\n *  If you would like to receive controller updates while the application\n *  is in the background, you should set the following hint before calling\n *  SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS\n */\n\n/* The gamecontroller structure used to identify an SDL game controller */\nstruct _SDL_GameController;\ntypedef struct _SDL_GameController SDL_GameController;\n\n\ntypedef enum\n{\n    SDL_CONTROLLER_BINDTYPE_NONE = 0,\n    SDL_CONTROLLER_BINDTYPE_BUTTON,\n    SDL_CONTROLLER_BINDTYPE_AXIS,\n    SDL_CONTROLLER_BINDTYPE_HAT\n} SDL_GameControllerBindType;\n\n/**\n *  Get the SDL joystick layer binding for this controller button/axis mapping\n */\ntypedef struct SDL_GameControllerButtonBind\n{\n    SDL_GameControllerBindType bindType;\n    union\n    {\n        int button;\n        int axis;\n        struct {\n            int hat;\n            int hat_mask;\n        } hat;\n    } value;\n\n} SDL_GameControllerButtonBind;\n\n\n/**\n *  To count the number of game controllers in the system for the following:\n *  int nJoysticks = SDL_NumJoysticks();\n *  int nGameControllers = 0;\n *  for ( int i = 0; i < nJoysticks; i++ ) {\n *      if ( SDL_IsGameController(i) ) {\n *          nGameControllers++;\n *      }\n *  }\n *\n *  Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping() you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is:\n *  guid,name,mappings\n *\n *  Where GUID is the string value from SDL_JoystickGetGUIDString(), name is the human readable string for the device and mappings are controller mappings to joystick ones.\n *  Under Windows there is a reserved GUID of \"xinput\" that covers any XInput devices.\n *  The mapping format for joystick is:\n *      bX - a joystick button, index X\n *      hX.Y - hat X with value Y\n *      aX - axis X of the joystick\n *  Buttons can be used as a controller axis and vice versa.\n *\n *  This string shows an example of a valid mapping for a controller\n *  \"341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\",\n *\n */\n\n/**\n *  Load a set of mappings from a seekable SDL data stream (memory or file), filtered by the current SDL_GetPlatform()\n *  A community sourced database of controllers is available at https://raw.github.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt\n *\n *  If \\c freerw is non-zero, the stream will be closed after being read.\n * \n * \\return number of mappings added, -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW( SDL_RWops * rw, int freerw );\n\n/**\n *  Load a set of mappings from a file, filtered by the current SDL_GetPlatform()\n *\n *  Convenience macro.\n */\n#define SDL_GameControllerAddMappingsFromFile(file)   SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, \"rb\"), 1)\n\n/**\n *  Add or update an existing mapping configuration\n *\n * \\return 1 if mapping is added, 0 if updated, -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_GameControllerAddMapping( const char* mappingString );\n\n/**\n *  Get a mapping string for a GUID\n *\n *  \\return the mapping string.  Must be freed with SDL_free().  Returns NULL if no mapping is available\n */\nextern DECLSPEC char * SDLCALL SDL_GameControllerMappingForGUID( SDL_JoystickGUID guid );\n\n/**\n *  Get a mapping string for an open GameController\n *\n *  \\return the mapping string.  Must be freed with SDL_free().  Returns NULL if no mapping is available\n */\nextern DECLSPEC char * SDLCALL SDL_GameControllerMapping( SDL_GameController * gamecontroller );\n\n/**\n *  Is the joystick on this index supported by the game controller interface?\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_IsGameController(int joystick_index);\n\n\n/**\n *  Get the implementation dependent name of a game controller.\n *  This can be called before any controllers are opened.\n *  If no name can be found, this function returns NULL.\n */\nextern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_index);\n\n/**\n *  Open a game controller for use.\n *  The index passed as an argument refers to the N'th game controller on the system.\n *  This index is not the value which will identify this controller in future\n *  controller events.  The joystick's instance id (::SDL_JoystickID) will be\n *  used there instead.\n *\n *  \\return A controller identifier, or NULL if an error occurred.\n */\nextern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerOpen(int joystick_index);\n\n/**\n * Return the SDL_GameController associated with an instance id.\n */\nextern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromInstanceID(SDL_JoystickID joyid);\n\n/**\n *  Return the name for this currently opened controller\n */\nextern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller);\n\n/**\n *  Returns SDL_TRUE if the controller has been opened and currently connected,\n *  or SDL_FALSE if it has not.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_GameControllerGetAttached(SDL_GameController *gamecontroller);\n\n/**\n *  Get the underlying joystick object used by a controller\n */\nextern DECLSPEC SDL_Joystick *SDLCALL SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller);\n\n/**\n *  Enable/disable controller event polling.\n *\n *  If controller events are disabled, you must call SDL_GameControllerUpdate()\n *  yourself and check the state of the controller when you want controller\n *  information.\n *\n *  The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE.\n */\nextern DECLSPEC int SDLCALL SDL_GameControllerEventState(int state);\n\n/**\n *  Update the current state of the open game controllers.\n *\n *  This is called automatically by the event loop if any game controller\n *  events are enabled.\n */\nextern DECLSPEC void SDLCALL SDL_GameControllerUpdate(void);\n\n\n/**\n *  The list of axes available from a controller\n */\ntypedef enum\n{\n    SDL_CONTROLLER_AXIS_INVALID = -1,\n    SDL_CONTROLLER_AXIS_LEFTX,\n    SDL_CONTROLLER_AXIS_LEFTY,\n    SDL_CONTROLLER_AXIS_RIGHTX,\n    SDL_CONTROLLER_AXIS_RIGHTY,\n    SDL_CONTROLLER_AXIS_TRIGGERLEFT,\n    SDL_CONTROLLER_AXIS_TRIGGERRIGHT,\n    SDL_CONTROLLER_AXIS_MAX\n} SDL_GameControllerAxis;\n\n/**\n *  turn this string into a axis mapping\n */\nextern DECLSPEC SDL_GameControllerAxis SDLCALL SDL_GameControllerGetAxisFromString(const char *pchString);\n\n/**\n *  turn this axis enum into a string mapping\n */\nextern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis);\n\n/**\n *  Get the SDL joystick layer binding for this controller button mapping\n */\nextern DECLSPEC SDL_GameControllerButtonBind SDLCALL\nSDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller,\n                                 SDL_GameControllerAxis axis);\n\n/**\n *  Get the current state of an axis control on a game controller.\n *\n *  The state is a value ranging from -32768 to 32767 (except for the triggers,\n *  which range from 0 to 32767).\n *\n *  The axis indices start at index 0.\n */\nextern DECLSPEC Sint16 SDLCALL\nSDL_GameControllerGetAxis(SDL_GameController *gamecontroller,\n                          SDL_GameControllerAxis axis);\n\n/**\n *  The list of buttons available from a controller\n */\ntypedef enum\n{\n    SDL_CONTROLLER_BUTTON_INVALID = -1,\n    SDL_CONTROLLER_BUTTON_A,\n    SDL_CONTROLLER_BUTTON_B,\n    SDL_CONTROLLER_BUTTON_X,\n    SDL_CONTROLLER_BUTTON_Y,\n    SDL_CONTROLLER_BUTTON_BACK,\n    SDL_CONTROLLER_BUTTON_GUIDE,\n    SDL_CONTROLLER_BUTTON_START,\n    SDL_CONTROLLER_BUTTON_LEFTSTICK,\n    SDL_CONTROLLER_BUTTON_RIGHTSTICK,\n    SDL_CONTROLLER_BUTTON_LEFTSHOULDER,\n    SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,\n    SDL_CONTROLLER_BUTTON_DPAD_UP,\n    SDL_CONTROLLER_BUTTON_DPAD_DOWN,\n    SDL_CONTROLLER_BUTTON_DPAD_LEFT,\n    SDL_CONTROLLER_BUTTON_DPAD_RIGHT,\n    SDL_CONTROLLER_BUTTON_MAX\n} SDL_GameControllerButton;\n\n/**\n *  turn this string into a button mapping\n */\nextern DECLSPEC SDL_GameControllerButton SDLCALL SDL_GameControllerGetButtonFromString(const char *pchString);\n\n/**\n *  turn this button enum into a string mapping\n */\nextern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForButton(SDL_GameControllerButton button);\n\n/**\n *  Get the SDL joystick layer binding for this controller button mapping\n */\nextern DECLSPEC SDL_GameControllerButtonBind SDLCALL\nSDL_GameControllerGetBindForButton(SDL_GameController *gamecontroller,\n                                   SDL_GameControllerButton button);\n\n\n/**\n *  Get the current state of a button on a game controller.\n *\n *  The button indices start at index 0.\n */\nextern DECLSPEC Uint8 SDLCALL SDL_GameControllerGetButton(SDL_GameController *gamecontroller,\n                                                          SDL_GameControllerButton button);\n\n/**\n *  Close a controller previously opened with SDL_GameControllerOpen().\n */\nextern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecontroller);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_gamecontroller_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_gesture.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_gesture.h\n *\n *  Include file for SDL gesture event handling.\n */\n\n#ifndef _SDL_gesture_h\n#define _SDL_gesture_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_video.h\"\n\n#include \"SDL_touch.h\"\n\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef Sint64 SDL_GestureID;\n\n/* Function prototypes */\n\n/**\n *  \\brief Begin Recording a gesture on the specified touch, or all touches (-1)\n *\n *\n */\nextern DECLSPEC int SDLCALL SDL_RecordGesture(SDL_TouchID touchId);\n\n\n/**\n *  \\brief Save all currently loaded Dollar Gesture templates\n *\n *\n */\nextern DECLSPEC int SDLCALL SDL_SaveAllDollarTemplates(SDL_RWops *dst);\n\n/**\n *  \\brief Save a currently loaded Dollar Gesture template\n *\n *\n */\nextern DECLSPEC int SDLCALL SDL_SaveDollarTemplate(SDL_GestureID gestureId,SDL_RWops *dst);\n\n\n/**\n *  \\brief Load Dollar Gesture templates from a file\n *\n *\n */\nextern DECLSPEC int SDLCALL SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_gesture_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_haptic.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_haptic.h\n *\n *  \\brief The SDL Haptic subsystem allows you to control haptic (force feedback)\n *         devices.\n *\n *  The basic usage is as follows:\n *   - Initialize the Subsystem (::SDL_INIT_HAPTIC).\n *   - Open a Haptic Device.\n *    - SDL_HapticOpen() to open from index.\n *    - SDL_HapticOpenFromJoystick() to open from an existing joystick.\n *   - Create an effect (::SDL_HapticEffect).\n *   - Upload the effect with SDL_HapticNewEffect().\n *   - Run the effect with SDL_HapticRunEffect().\n *   - (optional) Free the effect with SDL_HapticDestroyEffect().\n *   - Close the haptic device with SDL_HapticClose().\n *\n * \\par Simple rumble example:\n * \\code\n *    SDL_Haptic *haptic;\n *\n *    // Open the device\n *    haptic = SDL_HapticOpen( 0 );\n *    if (haptic == NULL)\n *       return -1;\n *\n *    // Initialize simple rumble\n *    if (SDL_HapticRumbleInit( haptic ) != 0)\n *       return -1;\n *\n *    // Play effect at 50% strength for 2 seconds\n *    if (SDL_HapticRumblePlay( haptic, 0.5, 2000 ) != 0)\n *       return -1;\n *    SDL_Delay( 2000 );\n *\n *    // Clean up\n *    SDL_HapticClose( haptic );\n * \\endcode\n *\n * \\par Complete example:\n * \\code\n * int test_haptic( SDL_Joystick * joystick ) {\n *    SDL_Haptic *haptic;\n *    SDL_HapticEffect effect;\n *    int effect_id;\n *\n *    // Open the device\n *    haptic = SDL_HapticOpenFromJoystick( joystick );\n *    if (haptic == NULL) return -1; // Most likely joystick isn't haptic\n *\n *    // See if it can do sine waves\n *    if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0) {\n *       SDL_HapticClose(haptic); // No sine effect\n *       return -1;\n *    }\n *\n *    // Create the effect\n *    memset( &effect, 0, sizeof(SDL_HapticEffect) ); // 0 is safe default\n *    effect.type = SDL_HAPTIC_SINE;\n *    effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates\n *    effect.periodic.direction.dir[0] = 18000; // Force comes from south\n *    effect.periodic.period = 1000; // 1000 ms\n *    effect.periodic.magnitude = 20000; // 20000/32767 strength\n *    effect.periodic.length = 5000; // 5 seconds long\n *    effect.periodic.attack_length = 1000; // Takes 1 second to get max strength\n *    effect.periodic.fade_length = 1000; // Takes 1 second to fade away\n *\n *    // Upload the effect\n *    effect_id = SDL_HapticNewEffect( haptic, &effect );\n *\n *    // Test the effect\n *    SDL_HapticRunEffect( haptic, effect_id, 1 );\n *    SDL_Delay( 5000); // Wait for the effect to finish\n *\n *    // We destroy the effect, although closing the device also does this\n *    SDL_HapticDestroyEffect( haptic, effect_id );\n *\n *    // Close the device\n *    SDL_HapticClose(haptic);\n *\n *    return 0; // Success\n * }\n * \\endcode\n */\n\n#ifndef _SDL_haptic_h\n#define _SDL_haptic_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_joystick.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n/**\n *  \\typedef SDL_Haptic\n *\n *  \\brief The haptic structure used to identify an SDL haptic.\n *\n *  \\sa SDL_HapticOpen\n *  \\sa SDL_HapticOpenFromJoystick\n *  \\sa SDL_HapticClose\n */\nstruct _SDL_Haptic;\ntypedef struct _SDL_Haptic SDL_Haptic;\n\n\n/**\n *  \\name Haptic features\n *\n *  Different haptic features a device can have.\n */\n/* @{ */\n\n/**\n *  \\name Haptic effects\n */\n/* @{ */\n\n/**\n *  \\brief Constant effect supported.\n *\n *  Constant haptic effect.\n *\n *  \\sa SDL_HapticCondition\n */\n#define SDL_HAPTIC_CONSTANT   (1u<<0)\n\n/**\n *  \\brief Sine wave effect supported.\n *\n *  Periodic haptic effect that simulates sine waves.\n *\n *  \\sa SDL_HapticPeriodic\n */\n#define SDL_HAPTIC_SINE       (1u<<1)\n\n/**\n *  \\brief Left/Right effect supported.\n *\n *  Haptic effect for direct control over high/low frequency motors.\n *\n *  \\sa SDL_HapticLeftRight\n * \\warning this value was SDL_HAPTIC_SQUARE right before 2.0.0 shipped. Sorry,\n *          we ran out of bits, and this is important for XInput devices.\n */\n#define SDL_HAPTIC_LEFTRIGHT     (1u<<2)\n\n/* !!! FIXME: put this back when we have more bits in 2.1 */\n/* #define SDL_HAPTIC_SQUARE     (1<<2) */\n\n/**\n *  \\brief Triangle wave effect supported.\n *\n *  Periodic haptic effect that simulates triangular waves.\n *\n *  \\sa SDL_HapticPeriodic\n */\n#define SDL_HAPTIC_TRIANGLE   (1u<<3)\n\n/**\n *  \\brief Sawtoothup wave effect supported.\n *\n *  Periodic haptic effect that simulates saw tooth up waves.\n *\n *  \\sa SDL_HapticPeriodic\n */\n#define SDL_HAPTIC_SAWTOOTHUP (1u<<4)\n\n/**\n *  \\brief Sawtoothdown wave effect supported.\n *\n *  Periodic haptic effect that simulates saw tooth down waves.\n *\n *  \\sa SDL_HapticPeriodic\n */\n#define SDL_HAPTIC_SAWTOOTHDOWN (1u<<5)\n\n/**\n *  \\brief Ramp effect supported.\n *\n *  Ramp haptic effect.\n *\n *  \\sa SDL_HapticRamp\n */\n#define SDL_HAPTIC_RAMP       (1u<<6)\n\n/**\n *  \\brief Spring effect supported - uses axes position.\n *\n *  Condition haptic effect that simulates a spring.  Effect is based on the\n *  axes position.\n *\n *  \\sa SDL_HapticCondition\n */\n#define SDL_HAPTIC_SPRING     (1u<<7)\n\n/**\n *  \\brief Damper effect supported - uses axes velocity.\n *\n *  Condition haptic effect that simulates dampening.  Effect is based on the\n *  axes velocity.\n *\n *  \\sa SDL_HapticCondition\n */\n#define SDL_HAPTIC_DAMPER     (1u<<8)\n\n/**\n *  \\brief Inertia effect supported - uses axes acceleration.\n *\n *  Condition haptic effect that simulates inertia.  Effect is based on the axes\n *  acceleration.\n *\n *  \\sa SDL_HapticCondition\n */\n#define SDL_HAPTIC_INERTIA    (1u<<9)\n\n/**\n *  \\brief Friction effect supported - uses axes movement.\n *\n *  Condition haptic effect that simulates friction.  Effect is based on the\n *  axes movement.\n *\n *  \\sa SDL_HapticCondition\n */\n#define SDL_HAPTIC_FRICTION   (1u<<10)\n\n/**\n *  \\brief Custom effect is supported.\n *\n *  User defined custom haptic effect.\n */\n#define SDL_HAPTIC_CUSTOM     (1u<<11)\n\n/* @} *//* Haptic effects */\n\n/* These last few are features the device has, not effects */\n\n/**\n *  \\brief Device can set global gain.\n *\n *  Device supports setting the global gain.\n *\n *  \\sa SDL_HapticSetGain\n */\n#define SDL_HAPTIC_GAIN       (1u<<12)\n\n/**\n *  \\brief Device can set autocenter.\n *\n *  Device supports setting autocenter.\n *\n *  \\sa SDL_HapticSetAutocenter\n */\n#define SDL_HAPTIC_AUTOCENTER (1u<<13)\n\n/**\n *  \\brief Device can be queried for effect status.\n *\n *  Device can be queried for effect status.\n *\n *  \\sa SDL_HapticGetEffectStatus\n */\n#define SDL_HAPTIC_STATUS     (1u<<14)\n\n/**\n *  \\brief Device can be paused.\n *\n *  \\sa SDL_HapticPause\n *  \\sa SDL_HapticUnpause\n */\n#define SDL_HAPTIC_PAUSE      (1u<<15)\n\n\n/**\n * \\name Direction encodings\n */\n/* @{ */\n\n/**\n *  \\brief Uses polar coordinates for the direction.\n *\n *  \\sa SDL_HapticDirection\n */\n#define SDL_HAPTIC_POLAR      0\n\n/**\n *  \\brief Uses cartesian coordinates for the direction.\n *\n *  \\sa SDL_HapticDirection\n */\n#define SDL_HAPTIC_CARTESIAN  1\n\n/**\n *  \\brief Uses spherical coordinates for the direction.\n *\n *  \\sa SDL_HapticDirection\n */\n#define SDL_HAPTIC_SPHERICAL  2\n\n/* @} *//* Direction encodings */\n\n/* @} *//* Haptic features */\n\n/*\n * Misc defines.\n */\n\n/**\n * \\brief Used to play a device an infinite number of times.\n *\n * \\sa SDL_HapticRunEffect\n */\n#define SDL_HAPTIC_INFINITY   4294967295U\n\n\n/**\n *  \\brief Structure that represents a haptic direction.\n *\n *  This is the direction where the force comes from,\n *  instead of the direction in which the force is exerted.\n *\n *  Directions can be specified by:\n *   - ::SDL_HAPTIC_POLAR : Specified by polar coordinates.\n *   - ::SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates.\n *   - ::SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates.\n *\n *  Cardinal directions of the haptic device are relative to the positioning\n *  of the device.  North is considered to be away from the user.\n *\n *  The following diagram represents the cardinal directions:\n *  \\verbatim\n                 .--.\n                 |__| .-------.\n                 |=.| |.-----.|\n                 |--| ||     ||\n                 |  | |'-----'|\n                 |__|~')_____('\n                   [ COMPUTER ]\n\n\n                     North (0,-1)\n                         ^\n                         |\n                         |\n   (-1,0)  West <----[ HAPTIC ]----> East (1,0)\n                         |\n                         |\n                         v\n                      South (0,1)\n\n\n                      [ USER ]\n                        \\|||/\n                        (o o)\n                  ---ooO-(_)-Ooo---\n    \\endverbatim\n *\n *  If type is ::SDL_HAPTIC_POLAR, direction is encoded by hundredths of a\n *  degree starting north and turning clockwise.  ::SDL_HAPTIC_POLAR only uses\n *  the first \\c dir parameter.  The cardinal directions would be:\n *   - North: 0 (0 degrees)\n *   - East: 9000 (90 degrees)\n *   - South: 18000 (180 degrees)\n *   - West: 27000 (270 degrees)\n *\n *  If type is ::SDL_HAPTIC_CARTESIAN, direction is encoded by three positions\n *  (X axis, Y axis and Z axis (with 3 axes)).  ::SDL_HAPTIC_CARTESIAN uses\n *  the first three \\c dir parameters.  The cardinal directions would be:\n *   - North:  0,-1, 0\n *   - East:   1, 0, 0\n *   - South:  0, 1, 0\n *   - West:  -1, 0, 0\n *\n *  The Z axis represents the height of the effect if supported, otherwise\n *  it's unused.  In cartesian encoding (1, 2) would be the same as (2, 4), you\n *  can use any multiple you want, only the direction matters.\n *\n *  If type is ::SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations.\n *  The first two \\c dir parameters are used.  The \\c dir parameters are as\n *  follows (all values are in hundredths of degrees):\n *   - Degrees from (1, 0) rotated towards (0, 1).\n *   - Degrees towards (0, 0, 1) (device needs at least 3 axes).\n *\n *\n *  Example of force coming from the south with all encodings (force coming\n *  from the south means the user will have to pull the stick to counteract):\n *  \\code\n *  SDL_HapticDirection direction;\n *\n *  // Cartesian directions\n *  direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding.\n *  direction.dir[0] = 0; // X position\n *  direction.dir[1] = 1; // Y position\n *  // Assuming the device has 2 axes, we don't need to specify third parameter.\n *\n *  // Polar directions\n *  direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding.\n *  direction.dir[0] = 18000; // Polar only uses first parameter\n *\n *  // Spherical coordinates\n *  direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding\n *  direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters.\n *  \\endcode\n *\n *  \\sa SDL_HAPTIC_POLAR\n *  \\sa SDL_HAPTIC_CARTESIAN\n *  \\sa SDL_HAPTIC_SPHERICAL\n *  \\sa SDL_HapticEffect\n *  \\sa SDL_HapticNumAxes\n */\ntypedef struct SDL_HapticDirection\n{\n    Uint8 type;         /**< The type of encoding. */\n    Sint32 dir[3];      /**< The encoded direction. */\n} SDL_HapticDirection;\n\n\n/**\n *  \\brief A structure containing a template for a Constant effect.\n *\n *  The struct is exclusive to the ::SDL_HAPTIC_CONSTANT effect.\n *\n *  A constant effect applies a constant force in the specified direction\n *  to the joystick.\n *\n *  \\sa SDL_HAPTIC_CONSTANT\n *  \\sa SDL_HapticEffect\n */\ntypedef struct SDL_HapticConstant\n{\n    /* Header */\n    Uint16 type;            /**< ::SDL_HAPTIC_CONSTANT */\n    SDL_HapticDirection direction;  /**< Direction of the effect. */\n\n    /* Replay */\n    Uint32 length;          /**< Duration of the effect. */\n    Uint16 delay;           /**< Delay before starting the effect. */\n\n    /* Trigger */\n    Uint16 button;          /**< Button that triggers the effect. */\n    Uint16 interval;        /**< How soon it can be triggered again after button. */\n\n    /* Constant */\n    Sint16 level;           /**< Strength of the constant effect. */\n\n    /* Envelope */\n    Uint16 attack_length;   /**< Duration of the attack. */\n    Uint16 attack_level;    /**< Level at the start of the attack. */\n    Uint16 fade_length;     /**< Duration of the fade. */\n    Uint16 fade_level;      /**< Level at the end of the fade. */\n} SDL_HapticConstant;\n\n/**\n *  \\brief A structure containing a template for a Periodic effect.\n *\n *  The struct handles the following effects:\n *   - ::SDL_HAPTIC_SINE\n *   - ::SDL_HAPTIC_LEFTRIGHT\n *   - ::SDL_HAPTIC_TRIANGLE\n *   - ::SDL_HAPTIC_SAWTOOTHUP\n *   - ::SDL_HAPTIC_SAWTOOTHDOWN\n *\n *  A periodic effect consists in a wave-shaped effect that repeats itself\n *  over time.  The type determines the shape of the wave and the parameters\n *  determine the dimensions of the wave.\n *\n *  Phase is given by hundredth of a degree meaning that giving the phase a value\n *  of 9000 will displace it 25% of its period.  Here are sample values:\n *   -     0: No phase displacement.\n *   -  9000: Displaced 25% of its period.\n *   - 18000: Displaced 50% of its period.\n *   - 27000: Displaced 75% of its period.\n *   - 36000: Displaced 100% of its period, same as 0, but 0 is preferred.\n *\n *  Examples:\n *  \\verbatim\n    SDL_HAPTIC_SINE\n      __      __      __      __\n     /  \\    /  \\    /  \\    /\n    /    \\__/    \\__/    \\__/\n\n    SDL_HAPTIC_SQUARE\n     __    __    __    __    __\n    |  |  |  |  |  |  |  |  |  |\n    |  |__|  |__|  |__|  |__|  |\n\n    SDL_HAPTIC_TRIANGLE\n      /\\    /\\    /\\    /\\    /\\\n     /  \\  /  \\  /  \\  /  \\  /\n    /    \\/    \\/    \\/    \\/\n\n    SDL_HAPTIC_SAWTOOTHUP\n      /|  /|  /|  /|  /|  /|  /|\n     / | / | / | / | / | / | / |\n    /  |/  |/  |/  |/  |/  |/  |\n\n    SDL_HAPTIC_SAWTOOTHDOWN\n    \\  |\\  |\\  |\\  |\\  |\\  |\\  |\n     \\ | \\ | \\ | \\ | \\ | \\ | \\ |\n      \\|  \\|  \\|  \\|  \\|  \\|  \\|\n    \\endverbatim\n *\n *  \\sa SDL_HAPTIC_SINE\n *  \\sa SDL_HAPTIC_LEFTRIGHT\n *  \\sa SDL_HAPTIC_TRIANGLE\n *  \\sa SDL_HAPTIC_SAWTOOTHUP\n *  \\sa SDL_HAPTIC_SAWTOOTHDOWN\n *  \\sa SDL_HapticEffect\n */\ntypedef struct SDL_HapticPeriodic\n{\n    /* Header */\n    Uint16 type;        /**< ::SDL_HAPTIC_SINE, ::SDL_HAPTIC_LEFTRIGHT,\n                             ::SDL_HAPTIC_TRIANGLE, ::SDL_HAPTIC_SAWTOOTHUP or\n                             ::SDL_HAPTIC_SAWTOOTHDOWN */\n    SDL_HapticDirection direction;  /**< Direction of the effect. */\n\n    /* Replay */\n    Uint32 length;      /**< Duration of the effect. */\n    Uint16 delay;       /**< Delay before starting the effect. */\n\n    /* Trigger */\n    Uint16 button;      /**< Button that triggers the effect. */\n    Uint16 interval;    /**< How soon it can be triggered again after button. */\n\n    /* Periodic */\n    Uint16 period;      /**< Period of the wave. */\n    Sint16 magnitude;   /**< Peak value; if negative, equivalent to 180 degrees extra phase shift. */\n    Sint16 offset;      /**< Mean value of the wave. */\n    Uint16 phase;       /**< Positive phase shift given by hundredth of a degree. */\n\n    /* Envelope */\n    Uint16 attack_length;   /**< Duration of the attack. */\n    Uint16 attack_level;    /**< Level at the start of the attack. */\n    Uint16 fade_length; /**< Duration of the fade. */\n    Uint16 fade_level;  /**< Level at the end of the fade. */\n} SDL_HapticPeriodic;\n\n/**\n *  \\brief A structure containing a template for a Condition effect.\n *\n *  The struct handles the following effects:\n *   - ::SDL_HAPTIC_SPRING: Effect based on axes position.\n *   - ::SDL_HAPTIC_DAMPER: Effect based on axes velocity.\n *   - ::SDL_HAPTIC_INERTIA: Effect based on axes acceleration.\n *   - ::SDL_HAPTIC_FRICTION: Effect based on axes movement.\n *\n *  Direction is handled by condition internals instead of a direction member.\n *  The condition effect specific members have three parameters.  The first\n *  refers to the X axis, the second refers to the Y axis and the third\n *  refers to the Z axis.  The right terms refer to the positive side of the\n *  axis and the left terms refer to the negative side of the axis.  Please\n *  refer to the ::SDL_HapticDirection diagram for which side is positive and\n *  which is negative.\n *\n *  \\sa SDL_HapticDirection\n *  \\sa SDL_HAPTIC_SPRING\n *  \\sa SDL_HAPTIC_DAMPER\n *  \\sa SDL_HAPTIC_INERTIA\n *  \\sa SDL_HAPTIC_FRICTION\n *  \\sa SDL_HapticEffect\n */\ntypedef struct SDL_HapticCondition\n{\n    /* Header */\n    Uint16 type;            /**< ::SDL_HAPTIC_SPRING, ::SDL_HAPTIC_DAMPER,\n                                 ::SDL_HAPTIC_INERTIA or ::SDL_HAPTIC_FRICTION */\n    SDL_HapticDirection direction;  /**< Direction of the effect - Not used ATM. */\n\n    /* Replay */\n    Uint32 length;          /**< Duration of the effect. */\n    Uint16 delay;           /**< Delay before starting the effect. */\n\n    /* Trigger */\n    Uint16 button;          /**< Button that triggers the effect. */\n    Uint16 interval;        /**< How soon it can be triggered again after button. */\n\n    /* Condition */\n    Uint16 right_sat[3];    /**< Level when joystick is to the positive side; max 0xFFFF. */\n    Uint16 left_sat[3];     /**< Level when joystick is to the negative side; max 0xFFFF. */\n    Sint16 right_coeff[3];  /**< How fast to increase the force towards the positive side. */\n    Sint16 left_coeff[3];   /**< How fast to increase the force towards the negative side. */\n    Uint16 deadband[3];     /**< Size of the dead zone; max 0xFFFF: whole axis-range when 0-centered. */\n    Sint16 center[3];       /**< Position of the dead zone. */\n} SDL_HapticCondition;\n\n/**\n *  \\brief A structure containing a template for a Ramp effect.\n *\n *  This struct is exclusively for the ::SDL_HAPTIC_RAMP effect.\n *\n *  The ramp effect starts at start strength and ends at end strength.\n *  It augments in linear fashion.  If you use attack and fade with a ramp\n *  the effects get added to the ramp effect making the effect become\n *  quadratic instead of linear.\n *\n *  \\sa SDL_HAPTIC_RAMP\n *  \\sa SDL_HapticEffect\n */\ntypedef struct SDL_HapticRamp\n{\n    /* Header */\n    Uint16 type;            /**< ::SDL_HAPTIC_RAMP */\n    SDL_HapticDirection direction;  /**< Direction of the effect. */\n\n    /* Replay */\n    Uint32 length;          /**< Duration of the effect. */\n    Uint16 delay;           /**< Delay before starting the effect. */\n\n    /* Trigger */\n    Uint16 button;          /**< Button that triggers the effect. */\n    Uint16 interval;        /**< How soon it can be triggered again after button. */\n\n    /* Ramp */\n    Sint16 start;           /**< Beginning strength level. */\n    Sint16 end;             /**< Ending strength level. */\n\n    /* Envelope */\n    Uint16 attack_length;   /**< Duration of the attack. */\n    Uint16 attack_level;    /**< Level at the start of the attack. */\n    Uint16 fade_length;     /**< Duration of the fade. */\n    Uint16 fade_level;      /**< Level at the end of the fade. */\n} SDL_HapticRamp;\n\n/**\n * \\brief A structure containing a template for a Left/Right effect.\n *\n * This struct is exclusively for the ::SDL_HAPTIC_LEFTRIGHT effect.\n *\n * The Left/Right effect is used to explicitly control the large and small\n * motors, commonly found in modern game controllers. One motor is high\n * frequency, the other is low frequency.\n *\n * \\sa SDL_HAPTIC_LEFTRIGHT\n * \\sa SDL_HapticEffect\n */\ntypedef struct SDL_HapticLeftRight\n{\n    /* Header */\n    Uint16 type;            /**< ::SDL_HAPTIC_LEFTRIGHT */\n\n    /* Replay */\n    Uint32 length;          /**< Duration of the effect. */\n\n    /* Rumble */\n    Uint16 large_magnitude; /**< Control of the large controller motor. */\n    Uint16 small_magnitude; /**< Control of the small controller motor. */\n} SDL_HapticLeftRight;\n\n/**\n *  \\brief A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect.\n *\n *  A custom force feedback effect is much like a periodic effect, where the\n *  application can define its exact shape.  You will have to allocate the\n *  data yourself.  Data should consist of channels * samples Uint16 samples.\n *\n *  If channels is one, the effect is rotated using the defined direction.\n *  Otherwise it uses the samples in data for the different axes.\n *\n *  \\sa SDL_HAPTIC_CUSTOM\n *  \\sa SDL_HapticEffect\n */\ntypedef struct SDL_HapticCustom\n{\n    /* Header */\n    Uint16 type;            /**< ::SDL_HAPTIC_CUSTOM */\n    SDL_HapticDirection direction;  /**< Direction of the effect. */\n\n    /* Replay */\n    Uint32 length;          /**< Duration of the effect. */\n    Uint16 delay;           /**< Delay before starting the effect. */\n\n    /* Trigger */\n    Uint16 button;          /**< Button that triggers the effect. */\n    Uint16 interval;        /**< How soon it can be triggered again after button. */\n\n    /* Custom */\n    Uint8 channels;         /**< Axes to use, minimum of one. */\n    Uint16 period;          /**< Sample periods. */\n    Uint16 samples;         /**< Amount of samples. */\n    Uint16 *data;           /**< Should contain channels*samples items. */\n\n    /* Envelope */\n    Uint16 attack_length;   /**< Duration of the attack. */\n    Uint16 attack_level;    /**< Level at the start of the attack. */\n    Uint16 fade_length;     /**< Duration of the fade. */\n    Uint16 fade_level;      /**< Level at the end of the fade. */\n} SDL_HapticCustom;\n\n/**\n *  \\brief The generic template for any haptic effect.\n *\n *  All values max at 32767 (0x7FFF).  Signed values also can be negative.\n *  Time values unless specified otherwise are in milliseconds.\n *\n *  You can also pass ::SDL_HAPTIC_INFINITY to length instead of a 0-32767\n *  value.  Neither delay, interval, attack_length nor fade_length support\n *  ::SDL_HAPTIC_INFINITY.  Fade will also not be used since effect never ends.\n *\n *  Additionally, the ::SDL_HAPTIC_RAMP effect does not support a duration of\n *  ::SDL_HAPTIC_INFINITY.\n *\n *  Button triggers may not be supported on all devices, it is advised to not\n *  use them if possible.  Buttons start at index 1 instead of index 0 like\n *  the joystick.\n *\n *  If both attack_length and fade_level are 0, the envelope is not used,\n *  otherwise both values are used.\n *\n *  Common parts:\n *  \\code\n *  // Replay - All effects have this\n *  Uint32 length;        // Duration of effect (ms).\n *  Uint16 delay;         // Delay before starting effect.\n *\n *  // Trigger - All effects have this\n *  Uint16 button;        // Button that triggers effect.\n *  Uint16 interval;      // How soon before effect can be triggered again.\n *\n *  // Envelope - All effects except condition effects have this\n *  Uint16 attack_length; // Duration of the attack (ms).\n *  Uint16 attack_level;  // Level at the start of the attack.\n *  Uint16 fade_length;   // Duration of the fade out (ms).\n *  Uint16 fade_level;    // Level at the end of the fade.\n *  \\endcode\n *\n *\n *  Here we have an example of a constant effect evolution in time:\n *  \\verbatim\n    Strength\n    ^\n    |\n    |    effect level -->  _________________\n    |                     /                 \\\n    |                    /                   \\\n    |                   /                     \\\n    |                  /                       \\\n    | attack_level --> |                        \\\n    |                  |                        |  <---  fade_level\n    |\n    +--------------------------------------------------> Time\n                       [--]                 [---]\n                       attack_length        fade_length\n\n    [------------------][-----------------------]\n    delay               length\n    \\endverbatim\n *\n *  Note either the attack_level or the fade_level may be above the actual\n *  effect level.\n *\n *  \\sa SDL_HapticConstant\n *  \\sa SDL_HapticPeriodic\n *  \\sa SDL_HapticCondition\n *  \\sa SDL_HapticRamp\n *  \\sa SDL_HapticLeftRight\n *  \\sa SDL_HapticCustom\n */\ntypedef union SDL_HapticEffect\n{\n    /* Common for all force feedback effects */\n    Uint16 type;                    /**< Effect type. */\n    SDL_HapticConstant constant;    /**< Constant effect. */\n    SDL_HapticPeriodic periodic;    /**< Periodic effect. */\n    SDL_HapticCondition condition;  /**< Condition effect. */\n    SDL_HapticRamp ramp;            /**< Ramp effect. */\n    SDL_HapticLeftRight leftright;  /**< Left/Right effect. */\n    SDL_HapticCustom custom;        /**< Custom effect. */\n} SDL_HapticEffect;\n\n\n/* Function prototypes */\n/**\n *  \\brief Count the number of haptic devices attached to the system.\n *\n *  \\return Number of haptic devices detected on the system.\n */\nextern DECLSPEC int SDLCALL SDL_NumHaptics(void);\n\n/**\n *  \\brief Get the implementation dependent name of a Haptic device.\n *\n *  This can be called before any joysticks are opened.\n *  If no name can be found, this function returns NULL.\n *\n *  \\param device_index Index of the device to get its name.\n *  \\return Name of the device or NULL on error.\n *\n *  \\sa SDL_NumHaptics\n */\nextern DECLSPEC const char *SDLCALL SDL_HapticName(int device_index);\n\n/**\n *  \\brief Opens a Haptic device for usage.\n *\n *  The index passed as an argument refers to the N'th Haptic device on this\n *  system.\n *\n *  When opening a haptic device, its gain will be set to maximum and\n *  autocenter will be disabled.  To modify these values use\n *  SDL_HapticSetGain() and SDL_HapticSetAutocenter().\n *\n *  \\param device_index Index of the device to open.\n *  \\return Device identifier or NULL on error.\n *\n *  \\sa SDL_HapticIndex\n *  \\sa SDL_HapticOpenFromMouse\n *  \\sa SDL_HapticOpenFromJoystick\n *  \\sa SDL_HapticClose\n *  \\sa SDL_HapticSetGain\n *  \\sa SDL_HapticSetAutocenter\n *  \\sa SDL_HapticPause\n *  \\sa SDL_HapticStopAll\n */\nextern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpen(int device_index);\n\n/**\n *  \\brief Checks if the haptic device at index has been opened.\n *\n *  \\param device_index Index to check to see if it has been opened.\n *  \\return 1 if it has been opened or 0 if it hasn't.\n *\n *  \\sa SDL_HapticOpen\n *  \\sa SDL_HapticIndex\n */\nextern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index);\n\n/**\n *  \\brief Gets the index of a haptic device.\n *\n *  \\param haptic Haptic device to get the index of.\n *  \\return The index of the haptic device or -1 on error.\n *\n *  \\sa SDL_HapticOpen\n *  \\sa SDL_HapticOpened\n */\nextern DECLSPEC int SDLCALL SDL_HapticIndex(SDL_Haptic * haptic);\n\n/**\n *  \\brief Gets whether or not the current mouse has haptic capabilities.\n *\n *  \\return SDL_TRUE if the mouse is haptic, SDL_FALSE if it isn't.\n *\n *  \\sa SDL_HapticOpenFromMouse\n */\nextern DECLSPEC int SDLCALL SDL_MouseIsHaptic(void);\n\n/**\n *  \\brief Tries to open a haptic device from the current mouse.\n *\n *  \\return The haptic device identifier or NULL on error.\n *\n *  \\sa SDL_MouseIsHaptic\n *  \\sa SDL_HapticOpen\n */\nextern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void);\n\n/**\n *  \\brief Checks to see if a joystick has haptic features.\n *\n *  \\param joystick Joystick to test for haptic capabilities.\n *  \\return 1 if the joystick is haptic, 0 if it isn't\n *          or -1 if an error ocurred.\n *\n *  \\sa SDL_HapticOpenFromJoystick\n */\nextern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick);\n\n/**\n *  \\brief Opens a Haptic device for usage from a Joystick device.\n *\n *  You must still close the haptic device separately.  It will not be closed\n *  with the joystick.\n *\n *  When opening from a joystick you should first close the haptic device before\n *  closing the joystick device.  If not, on some implementations the haptic\n *  device will also get unallocated and you'll be unable to use force feedback\n *  on that device.\n *\n *  \\param joystick Joystick to create a haptic device from.\n *  \\return A valid haptic device identifier on success or NULL on error.\n *\n *  \\sa SDL_HapticOpen\n *  \\sa SDL_HapticClose\n */\nextern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick *\n                                                               joystick);\n\n/**\n *  \\brief Closes a Haptic device previously opened with SDL_HapticOpen().\n *\n *  \\param haptic Haptic device to close.\n */\nextern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic);\n\n/**\n *  \\brief Returns the number of effects a haptic device can store.\n *\n *  On some platforms this isn't fully supported, and therefore is an\n *  approximation.  Always check to see if your created effect was actually\n *  created and do not rely solely on SDL_HapticNumEffects().\n *\n *  \\param haptic The haptic device to query effect max.\n *  \\return The number of effects the haptic device can store or\n *          -1 on error.\n *\n *  \\sa SDL_HapticNumEffectsPlaying\n *  \\sa SDL_HapticQuery\n */\nextern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic);\n\n/**\n *  \\brief Returns the number of effects a haptic device can play at the same\n *         time.\n *\n *  This is not supported on all platforms, but will always return a value.\n *  Added here for the sake of completeness.\n *\n *  \\param haptic The haptic device to query maximum playing effects.\n *  \\return The number of effects the haptic device can play at the same time\n *          or -1 on error.\n *\n *  \\sa SDL_HapticNumEffects\n *  \\sa SDL_HapticQuery\n */\nextern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic);\n\n/**\n *  \\brief Gets the haptic device's supported features in bitwise manner.\n *\n *  Example:\n *  \\code\n *  if (SDL_HapticQuery(haptic) & SDL_HAPTIC_CONSTANT) {\n *      printf(\"We have constant haptic effect!\");\n *  }\n *  \\endcode\n *\n *  \\param haptic The haptic device to query.\n *  \\return Haptic features in bitwise manner (OR'd).\n *\n *  \\sa SDL_HapticNumEffects\n *  \\sa SDL_HapticEffectSupported\n */\nextern DECLSPEC unsigned int SDLCALL SDL_HapticQuery(SDL_Haptic * haptic);\n\n\n/**\n *  \\brief Gets the number of haptic axes the device has.\n *\n *  \\sa SDL_HapticDirection\n */\nextern DECLSPEC int SDLCALL SDL_HapticNumAxes(SDL_Haptic * haptic);\n\n/**\n *  \\brief Checks to see if effect is supported by haptic.\n *\n *  \\param haptic Haptic device to check on.\n *  \\param effect Effect to check to see if it is supported.\n *  \\return SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error.\n *\n *  \\sa SDL_HapticQuery\n *  \\sa SDL_HapticNewEffect\n */\nextern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic,\n                                                      SDL_HapticEffect *\n                                                      effect);\n\n/**\n *  \\brief Creates a new haptic effect on the device.\n *\n *  \\param haptic Haptic device to create the effect on.\n *  \\param effect Properties of the effect to create.\n *  \\return The id of the effect on success or -1 on error.\n *\n *  \\sa SDL_HapticUpdateEffect\n *  \\sa SDL_HapticRunEffect\n *  \\sa SDL_HapticDestroyEffect\n */\nextern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic,\n                                                SDL_HapticEffect * effect);\n\n/**\n *  \\brief Updates the properties of an effect.\n *\n *  Can be used dynamically, although behaviour when dynamically changing\n *  direction may be strange.  Specifically the effect may reupload itself\n *  and start playing from the start.  You cannot change the type either when\n *  running SDL_HapticUpdateEffect().\n *\n *  \\param haptic Haptic device that has the effect.\n *  \\param effect Effect to update.\n *  \\param data New effect properties to use.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticNewEffect\n *  \\sa SDL_HapticRunEffect\n *  \\sa SDL_HapticDestroyEffect\n */\nextern DECLSPEC int SDLCALL SDL_HapticUpdateEffect(SDL_Haptic * haptic,\n                                                   int effect,\n                                                   SDL_HapticEffect * data);\n\n/**\n *  \\brief Runs the haptic effect on its associated haptic device.\n *\n *  If iterations are ::SDL_HAPTIC_INFINITY, it'll run the effect over and over\n *  repeating the envelope (attack and fade) every time.  If you only want the\n *  effect to last forever, set ::SDL_HAPTIC_INFINITY in the effect's length\n *  parameter.\n *\n *  \\param haptic Haptic device to run the effect on.\n *  \\param effect Identifier of the haptic effect to run.\n *  \\param iterations Number of iterations to run the effect. Use\n *         ::SDL_HAPTIC_INFINITY for infinity.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticStopEffect\n *  \\sa SDL_HapticDestroyEffect\n *  \\sa SDL_HapticGetEffectStatus\n */\nextern DECLSPEC int SDLCALL SDL_HapticRunEffect(SDL_Haptic * haptic,\n                                                int effect,\n                                                Uint32 iterations);\n\n/**\n *  \\brief Stops the haptic effect on its associated haptic device.\n *\n *  \\param haptic Haptic device to stop the effect on.\n *  \\param effect Identifier of the effect to stop.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticRunEffect\n *  \\sa SDL_HapticDestroyEffect\n */\nextern DECLSPEC int SDLCALL SDL_HapticStopEffect(SDL_Haptic * haptic,\n                                                 int effect);\n\n/**\n *  \\brief Destroys a haptic effect on the device.\n *\n *  This will stop the effect if it's running.  Effects are automatically\n *  destroyed when the device is closed.\n *\n *  \\param haptic Device to destroy the effect on.\n *  \\param effect Identifier of the effect to destroy.\n *\n *  \\sa SDL_HapticNewEffect\n */\nextern DECLSPEC void SDLCALL SDL_HapticDestroyEffect(SDL_Haptic * haptic,\n                                                     int effect);\n\n/**\n *  \\brief Gets the status of the current effect on the haptic device.\n *\n *  Device must support the ::SDL_HAPTIC_STATUS feature.\n *\n *  \\param haptic Haptic device to query the effect status on.\n *  \\param effect Identifier of the effect to query its status.\n *  \\return 0 if it isn't playing, 1 if it is playing or -1 on error.\n *\n *  \\sa SDL_HapticRunEffect\n *  \\sa SDL_HapticStopEffect\n */\nextern DECLSPEC int SDLCALL SDL_HapticGetEffectStatus(SDL_Haptic * haptic,\n                                                      int effect);\n\n/**\n *  \\brief Sets the global gain of the device.\n *\n *  Device must support the ::SDL_HAPTIC_GAIN feature.\n *\n *  The user may specify the maximum gain by setting the environment variable\n *  SDL_HAPTIC_GAIN_MAX which should be between 0 and 100.  All calls to\n *  SDL_HapticSetGain() will scale linearly using SDL_HAPTIC_GAIN_MAX as the\n *  maximum.\n *\n *  \\param haptic Haptic device to set the gain on.\n *  \\param gain Value to set the gain to, should be between 0 and 100.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticQuery\n */\nextern DECLSPEC int SDLCALL SDL_HapticSetGain(SDL_Haptic * haptic, int gain);\n\n/**\n *  \\brief Sets the global autocenter of the device.\n *\n *  Autocenter should be between 0 and 100.  Setting it to 0 will disable\n *  autocentering.\n *\n *  Device must support the ::SDL_HAPTIC_AUTOCENTER feature.\n *\n *  \\param haptic Haptic device to set autocentering on.\n *  \\param autocenter Value to set autocenter to, 0 disables autocentering.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticQuery\n */\nextern DECLSPEC int SDLCALL SDL_HapticSetAutocenter(SDL_Haptic * haptic,\n                                                    int autocenter);\n\n/**\n *  \\brief Pauses a haptic device.\n *\n *  Device must support the ::SDL_HAPTIC_PAUSE feature.  Call\n *  SDL_HapticUnpause() to resume playback.\n *\n *  Do not modify the effects nor add new ones while the device is paused.\n *  That can cause all sorts of weird errors.\n *\n *  \\param haptic Haptic device to pause.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticUnpause\n */\nextern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic);\n\n/**\n *  \\brief Unpauses a haptic device.\n *\n *  Call to unpause after SDL_HapticPause().\n *\n *  \\param haptic Haptic device to unpause.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticPause\n */\nextern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic);\n\n/**\n *  \\brief Stops all the currently playing effects on a haptic device.\n *\n *  \\param haptic Haptic device to stop.\n *  \\return 0 on success or -1 on error.\n */\nextern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic);\n\n/**\n *  \\brief Checks to see if rumble is supported on a haptic device.\n *\n *  \\param haptic Haptic device to check to see if it supports rumble.\n *  \\return SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error.\n *\n *  \\sa SDL_HapticRumbleInit\n *  \\sa SDL_HapticRumblePlay\n *  \\sa SDL_HapticRumbleStop\n */\nextern DECLSPEC int SDLCALL SDL_HapticRumbleSupported(SDL_Haptic * haptic);\n\n/**\n *  \\brief Initializes the haptic device for simple rumble playback.\n *\n *  \\param haptic Haptic device to initialize for simple rumble playback.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticOpen\n *  \\sa SDL_HapticRumbleSupported\n *  \\sa SDL_HapticRumblePlay\n *  \\sa SDL_HapticRumbleStop\n */\nextern DECLSPEC int SDLCALL SDL_HapticRumbleInit(SDL_Haptic * haptic);\n\n/**\n *  \\brief Runs simple rumble on a haptic device\n *\n *  \\param haptic Haptic device to play rumble effect on.\n *  \\param strength Strength of the rumble to play as a 0-1 float value.\n *  \\param length Length of the rumble to play in milliseconds.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticRumbleSupported\n *  \\sa SDL_HapticRumbleInit\n *  \\sa SDL_HapticRumbleStop\n */\nextern DECLSPEC int SDLCALL SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length );\n\n/**\n *  \\brief Stops the simple rumble on a haptic device.\n *\n *  \\param haptic Haptic to stop the rumble on.\n *  \\return 0 on success or -1 on error.\n *\n *  \\sa SDL_HapticRumbleSupported\n *  \\sa SDL_HapticRumbleInit\n *  \\sa SDL_HapticRumblePlay\n */\nextern DECLSPEC int SDLCALL SDL_HapticRumbleStop(SDL_Haptic * haptic);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_haptic_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_hints.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_hints.h\n *\n *  Official documentation for SDL configuration variables\n *\n *  This file contains functions to set and get configuration hints,\n *  as well as listing each of them alphabetically.\n *\n *  The convention for naming hints is SDL_HINT_X, where \"SDL_X\" is\n *  the environment variable that can be used to override the default.\n *\n *  In general these hints are just that - they may or may not be\n *  supported or applicable on any given platform, but they provide\n *  a way for an application or user to give the library a hint as\n *  to how they would like the library to work.\n */\n\n#ifndef _SDL_hints_h\n#define _SDL_hints_h\n\n#include \"SDL_stdinc.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief  A variable controlling how 3D acceleration is used to accelerate the SDL screen surface.\n *\n *  SDL can try to accelerate the SDL screen surface by using streaming\n *  textures with a 3D rendering engine.  This variable controls whether and\n *  how this is done.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Disable 3D acceleration\n *    \"1\"       - Enable 3D acceleration, using the default renderer.\n *    \"X\"       - Enable 3D acceleration, using X where X is one of the valid rendering drivers.  (e.g. \"direct3d\", \"opengl\", etc.)\n *\n *  By default SDL tries to make a best guess for each platform whether\n *  to use acceleration or not.\n */\n#define SDL_HINT_FRAMEBUFFER_ACCELERATION   \"SDL_FRAMEBUFFER_ACCELERATION\"\n\n/**\n *  \\brief  A variable specifying which render driver to use.\n *\n *  If the application doesn't pick a specific renderer to use, this variable\n *  specifies the name of the preferred renderer.  If the preferred renderer\n *  can't be initialized, the normal default renderer is used.\n *\n *  This variable is case insensitive and can be set to the following values:\n *    \"direct3d\"\n *    \"opengl\"\n *    \"opengles2\"\n *    \"opengles\"\n *    \"software\"\n *\n *  The default varies by platform, but it's the first one in the list that\n *  is available on the current platform.\n */\n#define SDL_HINT_RENDER_DRIVER              \"SDL_RENDER_DRIVER\"\n\n/**\n *  \\brief  A variable controlling whether the OpenGL render driver uses shaders if they are available.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Disable shaders\n *    \"1\"       - Enable shaders\n *\n *  By default shaders are used if OpenGL supports them.\n */\n#define SDL_HINT_RENDER_OPENGL_SHADERS      \"SDL_RENDER_OPENGL_SHADERS\"\n\n/**\n *  \\brief  A variable controlling whether the Direct3D device is initialized for thread-safe operations.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Thread-safety is not enabled (faster)\n *    \"1\"       - Thread-safety is enabled\n *\n *  By default the Direct3D device is created with thread-safety disabled.\n */\n#define SDL_HINT_RENDER_DIRECT3D_THREADSAFE \"SDL_RENDER_DIRECT3D_THREADSAFE\"\n\n/**\n *  \\brief  A variable controlling whether to enable Direct3D 11+'s Debug Layer.\n *\n *  This variable does not have any effect on the Direct3D 9 based renderer.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Disable Debug Layer use\n *    \"1\"       - Enable Debug Layer use\n *\n *  By default, SDL does not use Direct3D Debug Layer.\n */\n#define SDL_HINT_RENDER_DIRECT3D11_DEBUG    \"SDL_RENDER_DIRECT3D11_DEBUG\"\n\n/**\n *  \\brief  A variable controlling the scaling quality\n *\n *  This variable can be set to the following values:\n *    \"0\" or \"nearest\" - Nearest pixel sampling\n *    \"1\" or \"linear\"  - Linear filtering (supported by OpenGL and Direct3D)\n *    \"2\" or \"best\"    - Currently this is the same as \"linear\"\n *\n *  By default nearest pixel sampling is used\n */\n#define SDL_HINT_RENDER_SCALE_QUALITY       \"SDL_RENDER_SCALE_QUALITY\"\n\n/**\n *  \\brief  A variable controlling whether updates to the SDL screen surface should be synchronized with the vertical refresh, to avoid tearing.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Disable vsync\n *    \"1\"       - Enable vsync\n *\n *  By default SDL does not sync screen surface updates with vertical refresh.\n */\n#define SDL_HINT_RENDER_VSYNC               \"SDL_RENDER_VSYNC\"\n\n/**\n *  \\brief  A variable controlling whether the screensaver is enabled. \n *\n *  This variable can be set to the following values:\n *    \"0\"       - Disable screensaver\n *    \"1\"       - Enable screensaver\n *\n *  By default SDL will disable the screensaver.\n */\n#define SDL_HINT_VIDEO_ALLOW_SCREENSAVER    \"SDL_VIDEO_ALLOW_SCREENSAVER\"\n\n/**\n *  \\brief  A variable controlling whether the X11 VidMode extension should be used.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Disable XVidMode\n *    \"1\"       - Enable XVidMode\n *\n *  By default SDL will use XVidMode if it is available.\n */\n#define SDL_HINT_VIDEO_X11_XVIDMODE         \"SDL_VIDEO_X11_XVIDMODE\"\n\n/**\n *  \\brief  A variable controlling whether the X11 Xinerama extension should be used.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Disable Xinerama\n *    \"1\"       - Enable Xinerama\n *\n *  By default SDL will use Xinerama if it is available.\n */\n#define SDL_HINT_VIDEO_X11_XINERAMA         \"SDL_VIDEO_X11_XINERAMA\"\n\n/**\n *  \\brief  A variable controlling whether the X11 XRandR extension should be used.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Disable XRandR\n *    \"1\"       - Enable XRandR\n *\n *  By default SDL will not use XRandR because of window manager issues.\n */\n#define SDL_HINT_VIDEO_X11_XRANDR           \"SDL_VIDEO_X11_XRANDR\"\n\n/**\n *  \\brief  A variable controlling whether the X11 _NET_WM_PING protocol should be supported.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Disable _NET_WM_PING\n *    \"1\"       - Enable _NET_WM_PING\n *\n *  By default SDL will use _NET_WM_PING, but for applications that know they\n *  will not always be able to respond to ping requests in a timely manner they can\n *  turn it off to avoid the window manager thinking the app is hung.\n *  The hint is checked in CreateWindow.\n */\n#define SDL_HINT_VIDEO_X11_NET_WM_PING      \"SDL_VIDEO_X11_NET_WM_PING\"\n\n/**\n *  \\brief  A variable controlling whether the window frame and title bar are interactive when the cursor is hidden \n *\n *  This variable can be set to the following values:\n *    \"0\"       - The window frame is not interactive when the cursor is hidden (no move, resize, etc)\n *    \"1\"       - The window frame is interactive when the cursor is hidden\n *\n *  By default SDL will allow interaction with the window frame when the cursor is hidden\n */\n#define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN    \"SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN\"\n\n/**\n *  \\brief  A variable controlling whether the windows message loop is processed by SDL \n *\n *  This variable can be set to the following values:\n *    \"0\"       - The window message loop is not run\n *    \"1\"       - The window message loop is processed in SDL_PumpEvents()\n *\n *  By default SDL will process the windows message loop\n */\n#define SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP \"SDL_WINDOWS_ENABLE_MESSAGELOOP\"\n\n/**\n *  \\brief  A variable controlling whether grabbing input grabs the keyboard\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Grab will affect only the mouse\n *    \"1\"       - Grab will affect mouse and keyboard\n *\n *  By default SDL will not grab the keyboard so system shortcuts still work.\n */\n#define SDL_HINT_GRAB_KEYBOARD              \"SDL_GRAB_KEYBOARD\"\n\n/**\n *  \\brief  A variable controlling whether relative mouse mode is implemented using mouse warping\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Relative mouse mode uses raw input\n *    \"1\"       - Relative mouse mode uses mouse warping\n *\n *  By default SDL will use raw input for relative mouse mode\n */\n#define SDL_HINT_MOUSE_RELATIVE_MODE_WARP    \"SDL_MOUSE_RELATIVE_MODE_WARP\"\n\n/**\n *  \\brief Allow mouse click events when clicking to focus an SDL window\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Ignore mouse clicks that activate a window\n *    \"1\"       - Generate events for mouse clicks that activate a window\n *\n *  By default SDL will ignore mouse clicks that activate a window\n */\n#define SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH \"SDL_MOUSE_FOCUS_CLICKTHROUGH\"\n\n/**\n *  \\brief Minimize your SDL_Window if it loses key focus when in fullscreen mode. Defaults to true.\n *\n */\n#define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS   \"SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS\"\n\n/**\n *  \\brief  A variable controlling whether the idle timer is disabled on iOS.\n *\n *  When an iOS app does not receive touches for some time, the screen is\n *  dimmed automatically. For games where the accelerometer is the only input\n *  this is problematic. This functionality can be disabled by setting this\n *  hint.\n *\n *  As of SDL 2.0.4, SDL_EnableScreenSaver() and SDL_DisableScreenSaver()\n *  accomplish the same thing on iOS. They should be preferred over this hint.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Enable idle timer\n *    \"1\"       - Disable idle timer\n */\n#define SDL_HINT_IDLE_TIMER_DISABLED \"SDL_IOS_IDLE_TIMER_DISABLED\"\n\n/**\n *  \\brief  A variable controlling which orientations are allowed on iOS.\n *\n *  In some circumstances it is necessary to be able to explicitly control\n *  which UI orientations are allowed.\n *\n *  This variable is a space delimited list of the following values:\n *    \"LandscapeLeft\", \"LandscapeRight\", \"Portrait\" \"PortraitUpsideDown\"\n */\n#define SDL_HINT_ORIENTATIONS \"SDL_IOS_ORIENTATIONS\"\n\n/**\n *  \\brief  A variable controlling whether controllers used with the Apple TV\n *  generate UI events.\n *\n * When UI events are generated by controller input, the app will be\n * backgrounded when the Apple TV remote's menu button is pressed, and when the\n * pause or B buttons on gamepads are pressed.\n *\n * More information about properly making use of controllers for the Apple TV\n * can be found here:\n * https://developer.apple.com/tvos/human-interface-guidelines/remote-and-controllers/\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Controller input does not generate UI events (the default).\n *    \"1\"       - Controller input generates UI events.\n */\n#define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS \"SDL_APPLE_TV_CONTROLLER_UI_EVENTS\"\n\n/**\n * \\brief  A variable controlling whether the Apple TV remote's joystick axes\n *         will automatically match the rotation of the remote.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - Remote orientation does not affect joystick axes (the default).\n *    \"1\"       - Joystick axes are based on the orientation of the remote.\n */\n#define SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION \"SDL_APPLE_TV_REMOTE_ALLOW_ROTATION\"\n\n/**\n *  \\brief  A variable controlling whether the Android / iOS built-in\n *  accelerometer should be listed as a joystick device, rather than listing\n *  actual joysticks only.\n *\n *  This variable can be set to the following values:\n *    \"0\"       - List only real joysticks and accept input from them\n *    \"1\"       - List real joysticks along with the accelerometer as if it were a 3 axis joystick (the default).\n */\n#define SDL_HINT_ACCELEROMETER_AS_JOYSTICK \"SDL_ACCELEROMETER_AS_JOYSTICK\"\n\n\n/**\n *  \\brief  A variable that lets you disable the detection and use of Xinput gamepad devices\n *\n *  The variable can be set to the following values:\n *    \"0\"       - Disable XInput detection (only uses direct input)\n *    \"1\"       - Enable XInput detection (the default)\n */\n#define SDL_HINT_XINPUT_ENABLED \"SDL_XINPUT_ENABLED\"\n\n\n/**\n *  \\brief  A variable that causes SDL to use the old axis and button mapping for XInput devices.\n *\n *  This hint is for backwards compatibility only and will be removed in SDL 2.1\n *\n *  The default value is \"0\".  This hint must be set before SDL_Init()\n */\n#define SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING \"SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING\"\n\n\n/**\n *  \\brief  A variable that lets you manually hint extra gamecontroller db entries\n *\n *  The variable should be newline delimited rows of gamecontroller config data, see SDL_gamecontroller.h\n *\n *  This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER)\n *  You can update mappings after the system is initialized with SDL_GameControllerMappingForGUID() and SDL_GameControllerAddMapping()\n */\n#define SDL_HINT_GAMECONTROLLERCONFIG \"SDL_GAMECONTROLLERCONFIG\"\n\n\n/**\n *  \\brief  A variable that lets you enable joystick (and gamecontroller) events even when your app is in the background.\n *\n *  The variable can be set to the following values:\n *    \"0\"       - Disable joystick & gamecontroller input events when the\n *                application is in the background.\n *    \"1\"       - Enable joystick & gamecontroller input events when the\n *                application is in the background.\n *\n *  The default value is \"0\".  This hint may be set at any time.\n */\n#define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS \"SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS\"\n\n\n/**\n *  \\brief If set to \"0\" then never set the top most bit on a SDL Window, even if the video mode expects it.\n *      This is a debugging aid for developers and not expected to be used by end users. The default is \"1\"\n *\n *  This variable can be set to the following values:\n *    \"0\"       - don't allow topmost\n *    \"1\"       - allow topmost\n */\n#define SDL_HINT_ALLOW_TOPMOST \"SDL_ALLOW_TOPMOST\"\n\n\n/**\n *  \\brief A variable that controls the timer resolution, in milliseconds.\n *\n *  The higher resolution the timer, the more frequently the CPU services\n *  timer interrupts, and the more precise delays are, but this takes up\n *  power and CPU time.  This hint is only used on Windows 7 and earlier.\n *\n *  See this blog post for more information:\n *  http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/\n *\n *  If this variable is set to \"0\", the system timer resolution is not set.\n *\n *  The default value is \"1\". This hint may be set at any time.\n */\n#define SDL_HINT_TIMER_RESOLUTION \"SDL_TIMER_RESOLUTION\"\n\n\n\n/**\n*  \\brief  A string specifying SDL's threads stack size in bytes or \"0\" for the backend's default size\n*\n*  Use this hint in case you need to set SDL's threads stack size to other than the default.\n*  This is specially useful if you build SDL against a non glibc libc library (such as musl) which\n*  provides a relatively small default thread stack size (a few kilobytes versus the default 8MB glibc uses).\n*  Support for this hint is currently available only in the pthread, Windows, and PSP backend.\n*/\n#define SDL_HINT_THREAD_STACK_SIZE              \"SDL_THREAD_STACK_SIZE\"\n\n/**\n *  \\brief If set to 1, then do not allow high-DPI windows. (\"Retina\" on Mac and iOS)\n */\n#define SDL_HINT_VIDEO_HIGHDPI_DISABLED \"SDL_VIDEO_HIGHDPI_DISABLED\"\n\n/**\n *  \\brief A variable that determines whether ctrl+click should generate a right-click event on Mac\n *\n *  If present, holding ctrl while left clicking will generate a right click\n *  event when on Mac.\n */\n#define SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK \"SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK\"\n\n/**\n*  \\brief  A variable specifying which shader compiler to preload when using the Chrome ANGLE binaries\n*\n*  SDL has EGL and OpenGL ES2 support on Windows via the ANGLE project. It\n*  can use two different sets of binaries, those compiled by the user from source\n*  or those provided by the Chrome browser. In the later case, these binaries require\n*  that SDL loads a DLL providing the shader compiler.\n*\n*  This variable can be set to the following values:\n*    \"d3dcompiler_46.dll\" - default, best for Vista or later.\n*    \"d3dcompiler_43.dll\" - for XP support.\n*    \"none\" - do not load any library, useful if you compiled ANGLE from source and included the compiler in your binaries.\n*\n*/\n#define SDL_HINT_VIDEO_WIN_D3DCOMPILER              \"SDL_VIDEO_WIN_D3DCOMPILER\"\n\n/**\n*  \\brief  A variable that is the address of another SDL_Window* (as a hex string formatted with \"%p\").\n*  \n*  If this hint is set before SDL_CreateWindowFrom() and the SDL_Window* it is set to has\n*  SDL_WINDOW_OPENGL set (and running on WGL only, currently), then two things will occur on the newly \n*  created SDL_Window:\n*\n*  1. Its pixel format will be set to the same pixel format as this SDL_Window.  This is\n*  needed for example when sharing an OpenGL context across multiple windows.\n*\n*  2. The flag SDL_WINDOW_OPENGL will be set on the new window so it can be used for\n*  OpenGL rendering.\n*\n*  This variable can be set to the following values:\n*    The address (as a string \"%p\") of the SDL_Window* that new windows created with SDL_CreateWindowFrom() should\n*    share a pixel format with.\n*/\n#define SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT    \"SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT\"\n\n/**\n *  \\brief A URL to a WinRT app's privacy policy\n *\n *  All network-enabled WinRT apps must make a privacy policy available to its\n *  users.  On Windows 8, 8.1, and RT, Microsoft mandates that this policy be\n *  be available in the Windows Settings charm, as accessed from within the app.\n *  SDL provides code to add a URL-based link there, which can point to the app's\n *  privacy policy.\n *\n *  To setup a URL to an app's privacy policy, set SDL_HINT_WINRT_PRIVACY_POLICY_URL\n *  before calling any SDL_Init() functions.  The contents of the hint should\n *  be a valid URL.  For example, \"http://www.example.com\".\n *\n *  The default value is \"\", which will prevent SDL from adding a privacy policy\n *  link to the Settings charm.  This hint should only be set during app init.\n *\n *  The label text of an app's \"Privacy Policy\" link may be customized via another\n *  hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL.\n *\n *  Please note that on Windows Phone, Microsoft does not provide standard UI\n *  for displaying a privacy policy link, and as such, SDL_HINT_WINRT_PRIVACY_POLICY_URL\n *  will not get used on that platform.  Network-enabled phone apps should display\n *  their privacy policy through some other, in-app means.\n */\n#define SDL_HINT_WINRT_PRIVACY_POLICY_URL \"SDL_WINRT_PRIVACY_POLICY_URL\"\n\n/** \\brief Label text for a WinRT app's privacy policy link\n *\n *  Network-enabled WinRT apps must include a privacy policy.  On Windows 8, 8.1, and RT,\n *  Microsoft mandates that this policy be available via the Windows Settings charm.\n *  SDL provides code to add a link there, with its label text being set via the\n *  optional hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL.\n *\n *  Please note that a privacy policy's contents are not set via this hint.  A separate\n *  hint, SDL_HINT_WINRT_PRIVACY_POLICY_URL, is used to link to the actual text of the\n *  policy.\n *\n *  The contents of this hint should be encoded as a UTF8 string.\n *\n *  The default value is \"Privacy Policy\".  This hint should only be set during app\n *  initialization, preferably before any calls to SDL_Init().\n *\n *  For additional information on linking to a privacy policy, see the documentation for\n *  SDL_HINT_WINRT_PRIVACY_POLICY_URL.\n */\n#define SDL_HINT_WINRT_PRIVACY_POLICY_LABEL \"SDL_WINRT_PRIVACY_POLICY_LABEL\"\n\n/** \\brief Allows back-button-press events on Windows Phone to be marked as handled\n *\n *  Windows Phone devices typically feature a Back button.  When pressed,\n *  the OS will emit back-button-press events, which apps are expected to\n *  handle in an appropriate manner.  If apps do not explicitly mark these\n *  events as 'Handled', then the OS will invoke its default behavior for\n *  unhandled back-button-press events, which on Windows Phone 8 and 8.1 is to\n *  terminate the app (and attempt to switch to the previous app, or to the\n *  device's home screen).\n *\n *  Setting the SDL_HINT_WINRT_HANDLE_BACK_BUTTON hint to \"1\" will cause SDL\n *  to mark back-button-press events as Handled, if and when one is sent to\n *  the app.\n *\n *  Internally, Windows Phone sends back button events as parameters to\n *  special back-button-press callback functions.  Apps that need to respond\n *  to back-button-press events are expected to register one or more\n *  callback functions for such, shortly after being launched (during the\n *  app's initialization phase).  After the back button is pressed, the OS\n *  will invoke these callbacks.  If the app's callback(s) do not explicitly\n *  mark the event as handled by the time they return, or if the app never\n *  registers one of these callback, the OS will consider the event\n *  un-handled, and it will apply its default back button behavior (terminate\n *  the app).\n *\n *  SDL registers its own back-button-press callback with the Windows Phone\n *  OS.  This callback will emit a pair of SDL key-press events (SDL_KEYDOWN\n *  and SDL_KEYUP), each with a scancode of SDL_SCANCODE_AC_BACK, after which\n *  it will check the contents of the hint, SDL_HINT_WINRT_HANDLE_BACK_BUTTON.\n *  If the hint's value is set to \"1\", the back button event's Handled\n *  property will get set to 'true'.  If the hint's value is set to something\n *  else, or if it is unset, SDL will leave the event's Handled property\n *  alone.  (By default, the OS sets this property to 'false', to note.)\n *\n *  SDL apps can either set SDL_HINT_WINRT_HANDLE_BACK_BUTTON well before a\n *  back button is pressed, or can set it in direct-response to a back button\n *  being pressed.\n *\n *  In order to get notified when a back button is pressed, SDL apps should\n *  register a callback function with SDL_AddEventWatch(), and have it listen\n *  for SDL_KEYDOWN events that have a scancode of SDL_SCANCODE_AC_BACK.\n *  (Alternatively, SDL_KEYUP events can be listened-for.  Listening for\n *  either event type is suitable.)  Any value of SDL_HINT_WINRT_HANDLE_BACK_BUTTON\n *  set by such a callback, will be applied to the OS' current\n *  back-button-press event.\n *\n *  More details on back button behavior in Windows Phone apps can be found\n *  at the following page, on Microsoft's developer site:\n *  http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj247550(v=vs.105).aspx\n */\n#define SDL_HINT_WINRT_HANDLE_BACK_BUTTON \"SDL_WINRT_HANDLE_BACK_BUTTON\"\n\n/**\n *  \\brief  A variable that dictates policy for fullscreen Spaces on Mac OS X.\n *\n *  This hint only applies to Mac OS X.\n *\n *  The variable can be set to the following values:\n *    \"0\"       - Disable Spaces support (FULLSCREEN_DESKTOP won't use them and\n *                SDL_WINDOW_RESIZABLE windows won't offer the \"fullscreen\"\n *                button on their titlebars).\n *    \"1\"       - Enable Spaces support (FULLSCREEN_DESKTOP will use them and\n *                SDL_WINDOW_RESIZABLE windows will offer the \"fullscreen\"\n *                button on their titlebars).\n *\n *  The default value is \"1\". Spaces are disabled regardless of this hint if\n *   the OS isn't at least Mac OS X Lion (10.7). This hint must be set before\n *   any windows are created.\n */\n#define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES    \"SDL_VIDEO_MAC_FULLSCREEN_SPACES\"\n\n/**\n*  \\brief  When set don't force the SDL app to become a foreground process\n*\n*  This hint only applies to Mac OS X.\n*\n*/\n#define SDL_HINT_MAC_BACKGROUND_APP    \"SDL_MAC_BACKGROUND_APP\"\n\n/**\n * \\brief Android APK expansion main file version. Should be a string number like \"1\", \"2\" etc.\n *\n * Must be set together with SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION.\n *\n * If both hints were set then SDL_RWFromFile() will look into expansion files\n * after a given relative path was not found in the internal storage and assets.\n *\n * By default this hint is not set and the APK expansion files are not searched.\n */\n#define SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION \"SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION\"\n \n/**\n * \\brief Android APK expansion patch file version. Should be a string number like \"1\", \"2\" etc.\n *\n * Must be set together with SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION.\n *\n * If both hints were set then SDL_RWFromFile() will look into expansion files\n * after a given relative path was not found in the internal storage and assets.\n *\n * By default this hint is not set and the APK expansion files are not searched.\n */\n#define SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION \"SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION\"\n\n/**\n * \\brief A variable to control whether certain IMEs should handle text editing internally instead of sending SDL_TEXTEDITING events.\n *\n * The variable can be set to the following values:\n *   \"0\"       - SDL_TEXTEDITING events are sent, and it is the application's\n *               responsibility to render the text from these events and \n *               differentiate it somehow from committed text. (default)\n *   \"1\"       - If supported by the IME then SDL_TEXTEDITING events are not sent, \n *               and text that is being composed will be rendered in its own UI.\n */\n#define SDL_HINT_IME_INTERNAL_EDITING \"SDL_IME_INTERNAL_EDITING\"\n\n /**\n * \\brief A variable to control whether mouse and touch events are to be treated together or separately\n *\n * The variable can be set to the following values:\n *   \"0\"       - Mouse events will be handled as touch events, and touch will raise fake mouse\n *               events. This is the behaviour of SDL <= 2.0.3. (default)\n *   \"1\"       - Mouse events will be handled separately from pure touch events.\n *\n * The value of this hint is used at runtime, so it can be changed at any time.\n */\n#define SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH \"SDL_ANDROID_SEPARATE_MOUSE_AND_TOUCH\"\n\n/**\n *  \\brief override the binding element for keyboard inputs for Emscripten builds\n *\n * This hint only applies to the emscripten platform\n *\n * The variable can be one of\n *    \"#window\"      - The javascript window object (this is the default)\n *    \"#document\"    - The javascript document object\n *    \"#screen\"      - the javascript window.screen object\n *    \"#canvas\"      - the WebGL canvas element\n *    any other string without a leading # sign applies to the element on the page with that ID.\n */\n#define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT   \"SDL_EMSCRIPTEN_KEYBOARD_ELEMENT\"\n\n/**\n *  \\brief Tell SDL not to catch the SIGINT or SIGTERM signals.\n *\n * This hint only applies to Unix-like platforms.\n *\n * The variable can be set to the following values:\n *   \"0\"       - SDL will install a SIGINT and SIGTERM handler, and when it\n *               catches a signal, convert it into an SDL_QUIT event.\n *   \"1\"       - SDL will not install a signal handler at all.\n */\n#define SDL_HINT_NO_SIGNAL_HANDLERS   \"SDL_NO_SIGNAL_HANDLERS\"\n\n/**\n *  \\brief Tell SDL not to generate window-close events for Alt+F4 on Windows.\n *\n * The variable can be set to the following values:\n *   \"0\"       - SDL will generate a window-close event when it sees Alt+F4.\n *   \"1\"       - SDL will only do normal key handling for Alt+F4.\n */\n#define SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4\t\"SDL_WINDOWS_NO_CLOSE_ON_ALT_F4\"\n\n/**\n *  \\brief Prevent SDL from using version 4 of the bitmap header when saving BMPs.\n *\n * The bitmap header version 4 is required for proper alpha channel support and\n * SDL will use it when required. Should this not be desired, this hint can\n * force the use of the 40 byte header version which is supported everywhere.\n *\n * The variable can be set to the following values:\n *   \"0\"       - Surfaces with a colorkey or an alpha channel are saved to a\n *               32-bit BMP file with an alpha mask. SDL will use the bitmap\n *               header version 4 and set the alpha mask accordingly.\n *   \"1\"       - Surfaces with a colorkey or an alpha channel are saved to a\n *               32-bit BMP file without an alpha mask. The alpha channel data\n *               will be in the file, but applications are going to ignore it.\n *\n * The default value is \"0\".\n */\n#define SDL_HINT_BMP_SAVE_LEGACY_FORMAT \"SDL_BMP_SAVE_LEGACY_FORMAT\"\n\n/**\n * \\brief Tell SDL not to name threads on Windows.\n *\n * The variable can be set to the following values:\n *   \"0\"       - SDL will raise the 0x406D1388 Exception to name threads.\n *               This is the default behavior of SDL <= 2.0.4. (default)\n *   \"1\"       - SDL will not raise this exception, and threads will be unnamed.\n *               For .NET languages this is required when running under a debugger.\n */\n#define SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING \"SDL_WINDOWS_DISABLE_THREAD_NAMING\"\n\n/**\n * \\brief Tell SDL which Dispmanx layer to use on a Raspberry PI\n *\n * Also known as Z-order. The variable can take a negative or positive value.\n * The default is 10000.\n */\n#define SDL_HINT_RPI_VIDEO_LAYER           \"SDL_RPI_VIDEO_LAYER\"\n\n/**\n *  \\brief  An enumeration of hint priorities\n */\ntypedef enum\n{\n    SDL_HINT_DEFAULT,\n    SDL_HINT_NORMAL,\n    SDL_HINT_OVERRIDE\n} SDL_HintPriority;\n\n\n/**\n *  \\brief Set a hint with a specific priority\n *\n *  The priority controls the behavior when setting a hint that already\n *  has a value.  Hints will replace existing hints of their priority and\n *  lower.  Environment variables are considered to have override priority.\n *\n *  \\return SDL_TRUE if the hint was set, SDL_FALSE otherwise\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name,\n                                                         const char *value,\n                                                         SDL_HintPriority priority);\n\n/**\n *  \\brief Set a hint with normal priority\n *\n *  \\return SDL_TRUE if the hint was set, SDL_FALSE otherwise\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name,\n                                             const char *value);\n\n/**\n *  \\brief Get a hint\n *\n *  \\return The string value of a hint variable.\n */\nextern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name);\n\n/**\n *  \\brief Get a hint\n *\n *  \\return The boolean value of a hint variable.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bool default_value);\n\n/**\n *  \\brief Add a function to watch a particular hint\n *\n *  \\param name The hint to watch\n *  \\param callback The function to call when the hint value changes\n *  \\param userdata A pointer to pass to the callback function\n */\ntypedef void (*SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue);\nextern DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name,\n                                                 SDL_HintCallback callback,\n                                                 void *userdata);\n\n/**\n *  \\brief Remove a function watching a particular hint\n *\n *  \\param name The hint being watched\n *  \\param callback The function being called when the hint value changes\n *  \\param userdata A pointer being passed to the callback function\n */\nextern DECLSPEC void SDLCALL SDL_DelHintCallback(const char *name,\n                                                 SDL_HintCallback callback,\n                                                 void *userdata);\n\n/**\n *  \\brief  Clear all hints\n *\n *  This function is called during SDL_Quit() to free stored hints.\n */\nextern DECLSPEC void SDLCALL SDL_ClearHints(void);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_hints_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_joystick.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_joystick.h\n *\n *  Include file for SDL joystick event handling\n *\n * The term \"device_index\" identifies currently plugged in joystick devices between 0 and SDL_NumJoysticks(), with the exact joystick\n *   behind a device_index changing as joysticks are plugged and unplugged.\n *\n * The term \"instance_id\" is the current instantiation of a joystick device in the system, if the joystick is removed and then re-inserted\n *   then it will get a new instance_id, instance_id's are monotonically increasing identifiers of a joystick plugged in.\n *\n * The term JoystickGUID is a stable 128-bit identifier for a joystick device that does not change over time, it identifies class of\n *   the device (a X360 wired controller for example). This identifier is platform dependent.\n *\n *\n */\n\n#ifndef _SDL_joystick_h\n#define _SDL_joystick_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\file SDL_joystick.h\n *\n *  In order to use these functions, SDL_Init() must have been called\n *  with the ::SDL_INIT_JOYSTICK flag.  This causes SDL to scan the system\n *  for joysticks, and load appropriate drivers.\n *\n *  If you would like to receive joystick updates while the application\n *  is in the background, you should set the following hint before calling\n *  SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS\n */\n\n/* The joystick structure used to identify an SDL joystick */\nstruct _SDL_Joystick;\ntypedef struct _SDL_Joystick SDL_Joystick;\n\n/* A structure that encodes the stable unique id for a joystick device */\ntypedef struct {\n    Uint8 data[16];\n} SDL_JoystickGUID;\n\ntypedef Sint32 SDL_JoystickID;\n\ntypedef enum\n{\n    SDL_JOYSTICK_POWER_UNKNOWN = -1,\n    SDL_JOYSTICK_POWER_EMPTY,\n    SDL_JOYSTICK_POWER_LOW,\n    SDL_JOYSTICK_POWER_MEDIUM,\n    SDL_JOYSTICK_POWER_FULL,\n    SDL_JOYSTICK_POWER_WIRED,\n    SDL_JOYSTICK_POWER_MAX\n} SDL_JoystickPowerLevel;\n\n/* Function prototypes */\n/**\n *  Count the number of joysticks attached to the system right now\n */\nextern DECLSPEC int SDLCALL SDL_NumJoysticks(void);\n\n/**\n *  Get the implementation dependent name of a joystick.\n *  This can be called before any joysticks are opened.\n *  If no name can be found, this function returns NULL.\n */\nextern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index);\n\n/**\n *  Open a joystick for use.\n *  The index passed as an argument refers to the N'th joystick on the system.\n *  This index is not the value which will identify this joystick in future\n *  joystick events.  The joystick's instance id (::SDL_JoystickID) will be used\n *  there instead.\n *\n *  \\return A joystick identifier, or NULL if an error occurred.\n */\nextern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index);\n\n/**\n * Return the SDL_Joystick associated with an instance id.\n */\nextern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromInstanceID(SDL_JoystickID joyid);\n\n/**\n *  Return the name for this currently opened joystick.\n *  If no name can be found, this function returns NULL.\n */\nextern DECLSPEC const char *SDLCALL SDL_JoystickName(SDL_Joystick * joystick);\n\n/**\n *  Return the GUID for the joystick at this index\n */\nextern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetDeviceGUID(int device_index);\n\n/**\n *  Return the GUID for this opened joystick\n */\nextern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUID(SDL_Joystick * joystick);\n\n/**\n *  Return a string representation for this guid. pszGUID must point to at least 33 bytes\n *  (32 for the string plus a NULL terminator).\n */\nextern DECLSPEC void SDLCALL SDL_JoystickGetGUIDString(SDL_JoystickGUID guid, char *pszGUID, int cbGUID);\n\n/**\n *  convert a string into a joystick formatted guid\n */\nextern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUIDFromString(const char *pchGUID);\n\n/**\n *  Returns SDL_TRUE if the joystick has been opened and currently connected, or SDL_FALSE if it has not.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAttached(SDL_Joystick * joystick);\n\n/**\n *  Get the instance ID of an opened joystick or -1 if the joystick is invalid.\n */\nextern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickInstanceID(SDL_Joystick * joystick);\n\n/**\n *  Get the number of general axis controls on a joystick.\n */\nextern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick * joystick);\n\n/**\n *  Get the number of trackballs on a joystick.\n *\n *  Joystick trackballs have only relative motion events associated\n *  with them and their state cannot be polled.\n */\nextern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick * joystick);\n\n/**\n *  Get the number of POV hats on a joystick.\n */\nextern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick * joystick);\n\n/**\n *  Get the number of buttons on a joystick.\n */\nextern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick * joystick);\n\n/**\n *  Update the current state of the open joysticks.\n *\n *  This is called automatically by the event loop if any joystick\n *  events are enabled.\n */\nextern DECLSPEC void SDLCALL SDL_JoystickUpdate(void);\n\n/**\n *  Enable/disable joystick event polling.\n *\n *  If joystick events are disabled, you must call SDL_JoystickUpdate()\n *  yourself and check the state of the joystick when you want joystick\n *  information.\n *\n *  The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE.\n */\nextern DECLSPEC int SDLCALL SDL_JoystickEventState(int state);\n\n/**\n *  Get the current state of an axis control on a joystick.\n *\n *  The state is a value ranging from -32768 to 32767.\n *\n *  The axis indices start at index 0.\n */\nextern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick * joystick,\n                                                   int axis);\n\n/**\n *  \\name Hat positions\n */\n/* @{ */\n#define SDL_HAT_CENTERED    0x00\n#define SDL_HAT_UP          0x01\n#define SDL_HAT_RIGHT       0x02\n#define SDL_HAT_DOWN        0x04\n#define SDL_HAT_LEFT        0x08\n#define SDL_HAT_RIGHTUP     (SDL_HAT_RIGHT|SDL_HAT_UP)\n#define SDL_HAT_RIGHTDOWN   (SDL_HAT_RIGHT|SDL_HAT_DOWN)\n#define SDL_HAT_LEFTUP      (SDL_HAT_LEFT|SDL_HAT_UP)\n#define SDL_HAT_LEFTDOWN    (SDL_HAT_LEFT|SDL_HAT_DOWN)\n/* @} */\n\n/**\n *  Get the current state of a POV hat on a joystick.\n *\n *  The hat indices start at index 0.\n *\n *  \\return The return value is one of the following positions:\n *           - ::SDL_HAT_CENTERED\n *           - ::SDL_HAT_UP\n *           - ::SDL_HAT_RIGHT\n *           - ::SDL_HAT_DOWN\n *           - ::SDL_HAT_LEFT\n *           - ::SDL_HAT_RIGHTUP\n *           - ::SDL_HAT_RIGHTDOWN\n *           - ::SDL_HAT_LEFTUP\n *           - ::SDL_HAT_LEFTDOWN\n */\nextern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick * joystick,\n                                                 int hat);\n\n/**\n *  Get the ball axis change since the last poll.\n *\n *  \\return 0, or -1 if you passed it invalid parameters.\n *\n *  The ball indices start at index 0.\n */\nextern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick * joystick,\n                                                int ball, int *dx, int *dy);\n\n/**\n *  Get the current state of a button on a joystick.\n *\n *  The button indices start at index 0.\n */\nextern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick * joystick,\n                                                    int button);\n\n/**\n *  Close a joystick previously opened with SDL_JoystickOpen().\n */\nextern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick * joystick);\n\n/**\n *  Return the battery level of this joystick\n */\nextern DECLSPEC SDL_JoystickPowerLevel SDLCALL SDL_JoystickCurrentPowerLevel(SDL_Joystick * joystick);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_joystick_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_keyboard.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_keyboard.h\n *\n *  Include file for SDL keyboard event handling\n */\n\n#ifndef _SDL_keyboard_h\n#define _SDL_keyboard_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_keycode.h\"\n#include \"SDL_video.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief The SDL keysym structure, used in key events.\n *\n *  \\note  If you are looking for translated character input, see the ::SDL_TEXTINPUT event.\n */\ntypedef struct SDL_Keysym\n{\n    SDL_Scancode scancode;      /**< SDL physical key code - see ::SDL_Scancode for details */\n    SDL_Keycode sym;            /**< SDL virtual key code - see ::SDL_Keycode for details */\n    Uint16 mod;                 /**< current key modifiers */\n    Uint32 unused;\n} SDL_Keysym;\n\n/* Function prototypes */\n\n/**\n *  \\brief Get the window which currently has keyboard focus.\n */\nextern DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void);\n\n/**\n *  \\brief Get a snapshot of the current state of the keyboard.\n *\n *  \\param numkeys if non-NULL, receives the length of the returned array.\n *\n *  \\return An array of key states. Indexes into this array are obtained by using ::SDL_Scancode values.\n *\n *  \\b Example:\n *  \\code\n *  const Uint8 *state = SDL_GetKeyboardState(NULL);\n *  if ( state[SDL_SCANCODE_RETURN] )   {\n *      printf(\"<RETURN> is pressed.\\n\");\n *  }\n *  \\endcode\n */\nextern DECLSPEC const Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys);\n\n/**\n *  \\brief Get the current key modifier state for the keyboard.\n */\nextern DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void);\n\n/**\n *  \\brief Set the current key modifier state for the keyboard.\n *\n *  \\note This does not change the keyboard state, only the key modifier flags.\n */\nextern DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate);\n\n/**\n *  \\brief Get the key code corresponding to the given scancode according\n *         to the current keyboard layout.\n *\n *  See ::SDL_Keycode for details.\n *\n *  \\sa SDL_GetKeyName()\n */\nextern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode);\n\n/**\n *  \\brief Get the scancode corresponding to the given key code according to the\n *         current keyboard layout.\n *\n *  See ::SDL_Scancode for details.\n *\n *  \\sa SDL_GetScancodeName()\n */\nextern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key);\n\n/**\n *  \\brief Get a human-readable name for a scancode.\n *\n *  \\return A pointer to the name for the scancode.\n *          If the scancode doesn't have a name, this function returns\n *          an empty string (\"\").\n *\n *  \\sa SDL_Scancode\n */\nextern DECLSPEC const char *SDLCALL SDL_GetScancodeName(SDL_Scancode scancode);\n\n/**\n *  \\brief Get a scancode from a human-readable name\n *\n *  \\return scancode, or SDL_SCANCODE_UNKNOWN if the name wasn't recognized\n *\n *  \\sa SDL_Scancode\n */\nextern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name);\n\n/**\n *  \\brief Get a human-readable name for a key.\n *\n *  \\return A pointer to a UTF-8 string that stays valid at least until the next\n *          call to this function. If you need it around any longer, you must\n *          copy it.  If the key doesn't have a name, this function returns an\n *          empty string (\"\").\n *\n *  \\sa SDL_Keycode\n */\nextern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDL_Keycode key);\n\n/**\n *  \\brief Get a key code from a human-readable name\n *\n *  \\return key code, or SDLK_UNKNOWN if the name wasn't recognized\n *\n *  \\sa SDL_Keycode\n */\nextern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name);\n\n/**\n *  \\brief Start accepting Unicode text input events.\n *         This function will show the on-screen keyboard if supported.\n *\n *  \\sa SDL_StopTextInput()\n *  \\sa SDL_SetTextInputRect()\n *  \\sa SDL_HasScreenKeyboardSupport()\n */\nextern DECLSPEC void SDLCALL SDL_StartTextInput(void);\n\n/**\n *  \\brief Return whether or not Unicode text input events are enabled.\n *\n *  \\sa SDL_StartTextInput()\n *  \\sa SDL_StopTextInput()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputActive(void);\n\n/**\n *  \\brief Stop receiving any text input events.\n *         This function will hide the on-screen keyboard if supported.\n *\n *  \\sa SDL_StartTextInput()\n *  \\sa SDL_HasScreenKeyboardSupport()\n */\nextern DECLSPEC void SDLCALL SDL_StopTextInput(void);\n\n/**\n *  \\brief Set the rectangle used to type Unicode text inputs.\n *         This is used as a hint for IME and on-screen keyboard placement.\n *\n *  \\sa SDL_StartTextInput()\n */\nextern DECLSPEC void SDLCALL SDL_SetTextInputRect(SDL_Rect *rect);\n\n/**\n *  \\brief Returns whether the platform has some screen keyboard support.\n *\n *  \\return SDL_TRUE if some keyboard support is available else SDL_FALSE.\n *\n *  \\note Not all screen keyboard functions are supported on all platforms.\n *\n *  \\sa SDL_IsScreenKeyboardShown()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void);\n\n/**\n *  \\brief Returns whether the screen keyboard is shown for given window.\n *\n *  \\param window The window for which screen keyboard should be queried.\n *\n *  \\return SDL_TRUE if screen keyboard is shown else SDL_FALSE.\n *\n *  \\sa SDL_HasScreenKeyboardSupport()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_IsScreenKeyboardShown(SDL_Window *window);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_keyboard_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_keycode.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_keycode.h\n *\n *  Defines constants which identify keyboard keys and modifiers.\n */\n\n#ifndef _SDL_keycode_h\n#define _SDL_keycode_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_scancode.h\"\n\n/**\n *  \\brief The SDL virtual key representation.\n *\n *  Values of this type are used to represent keyboard keys using the current\n *  layout of the keyboard.  These values include Unicode values representing\n *  the unmodified character that would be generated by pressing the key, or\n *  an SDLK_* constant for those keys that do not generate characters.\n */\ntypedef Sint32 SDL_Keycode;\n\n#define SDLK_SCANCODE_MASK (1<<30)\n#define SDL_SCANCODE_TO_KEYCODE(X)  (X | SDLK_SCANCODE_MASK)\n\nenum\n{\n    SDLK_UNKNOWN = 0,\n\n    SDLK_RETURN = '\\r',\n    SDLK_ESCAPE = '\\033',\n    SDLK_BACKSPACE = '\\b',\n    SDLK_TAB = '\\t',\n    SDLK_SPACE = ' ',\n    SDLK_EXCLAIM = '!',\n    SDLK_QUOTEDBL = '\"',\n    SDLK_HASH = '#',\n    SDLK_PERCENT = '%',\n    SDLK_DOLLAR = '$',\n    SDLK_AMPERSAND = '&',\n    SDLK_QUOTE = '\\'',\n    SDLK_LEFTPAREN = '(',\n    SDLK_RIGHTPAREN = ')',\n    SDLK_ASTERISK = '*',\n    SDLK_PLUS = '+',\n    SDLK_COMMA = ',',\n    SDLK_MINUS = '-',\n    SDLK_PERIOD = '.',\n    SDLK_SLASH = '/',\n    SDLK_0 = '0',\n    SDLK_1 = '1',\n    SDLK_2 = '2',\n    SDLK_3 = '3',\n    SDLK_4 = '4',\n    SDLK_5 = '5',\n    SDLK_6 = '6',\n    SDLK_7 = '7',\n    SDLK_8 = '8',\n    SDLK_9 = '9',\n    SDLK_COLON = ':',\n    SDLK_SEMICOLON = ';',\n    SDLK_LESS = '<',\n    SDLK_EQUALS = '=',\n    SDLK_GREATER = '>',\n    SDLK_QUESTION = '?',\n    SDLK_AT = '@',\n    /*\n       Skip uppercase letters\n     */\n    SDLK_LEFTBRACKET = '[',\n    SDLK_BACKSLASH = '\\\\',\n    SDLK_RIGHTBRACKET = ']',\n    SDLK_CARET = '^',\n    SDLK_UNDERSCORE = '_',\n    SDLK_BACKQUOTE = '`',\n    SDLK_a = 'a',\n    SDLK_b = 'b',\n    SDLK_c = 'c',\n    SDLK_d = 'd',\n    SDLK_e = 'e',\n    SDLK_f = 'f',\n    SDLK_g = 'g',\n    SDLK_h = 'h',\n    SDLK_i = 'i',\n    SDLK_j = 'j',\n    SDLK_k = 'k',\n    SDLK_l = 'l',\n    SDLK_m = 'm',\n    SDLK_n = 'n',\n    SDLK_o = 'o',\n    SDLK_p = 'p',\n    SDLK_q = 'q',\n    SDLK_r = 'r',\n    SDLK_s = 's',\n    SDLK_t = 't',\n    SDLK_u = 'u',\n    SDLK_v = 'v',\n    SDLK_w = 'w',\n    SDLK_x = 'x',\n    SDLK_y = 'y',\n    SDLK_z = 'z',\n\n    SDLK_CAPSLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK),\n\n    SDLK_F1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1),\n    SDLK_F2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2),\n    SDLK_F3 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3),\n    SDLK_F4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4),\n    SDLK_F5 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5),\n    SDLK_F6 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6),\n    SDLK_F7 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7),\n    SDLK_F8 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8),\n    SDLK_F9 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9),\n    SDLK_F10 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10),\n    SDLK_F11 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11),\n    SDLK_F12 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12),\n\n    SDLK_PRINTSCREEN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN),\n    SDLK_SCROLLLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK),\n    SDLK_PAUSE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE),\n    SDLK_INSERT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT),\n    SDLK_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME),\n    SDLK_PAGEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP),\n    SDLK_DELETE = '\\177',\n    SDLK_END = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END),\n    SDLK_PAGEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN),\n    SDLK_RIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT),\n    SDLK_LEFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT),\n    SDLK_DOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN),\n    SDLK_UP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP),\n\n    SDLK_NUMLOCKCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR),\n    SDLK_KP_DIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE),\n    SDLK_KP_MULTIPLY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY),\n    SDLK_KP_MINUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS),\n    SDLK_KP_PLUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS),\n    SDLK_KP_ENTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER),\n    SDLK_KP_1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1),\n    SDLK_KP_2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2),\n    SDLK_KP_3 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3),\n    SDLK_KP_4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4),\n    SDLK_KP_5 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5),\n    SDLK_KP_6 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6),\n    SDLK_KP_7 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7),\n    SDLK_KP_8 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8),\n    SDLK_KP_9 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9),\n    SDLK_KP_0 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0),\n    SDLK_KP_PERIOD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD),\n\n    SDLK_APPLICATION = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION),\n    SDLK_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER),\n    SDLK_KP_EQUALS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS),\n    SDLK_F13 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13),\n    SDLK_F14 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14),\n    SDLK_F15 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15),\n    SDLK_F16 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16),\n    SDLK_F17 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17),\n    SDLK_F18 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18),\n    SDLK_F19 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19),\n    SDLK_F20 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20),\n    SDLK_F21 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21),\n    SDLK_F22 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22),\n    SDLK_F23 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23),\n    SDLK_F24 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24),\n    SDLK_EXECUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE),\n    SDLK_HELP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP),\n    SDLK_MENU = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU),\n    SDLK_SELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT),\n    SDLK_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP),\n    SDLK_AGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN),\n    SDLK_UNDO = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO),\n    SDLK_CUT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT),\n    SDLK_COPY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY),\n    SDLK_PASTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE),\n    SDLK_FIND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND),\n    SDLK_MUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE),\n    SDLK_VOLUMEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP),\n    SDLK_VOLUMEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN),\n    SDLK_KP_COMMA = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA),\n    SDLK_KP_EQUALSAS400 =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400),\n\n    SDLK_ALTERASE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE),\n    SDLK_SYSREQ = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ),\n    SDLK_CANCEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL),\n    SDLK_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR),\n    SDLK_PRIOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR),\n    SDLK_RETURN2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2),\n    SDLK_SEPARATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR),\n    SDLK_OUT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT),\n    SDLK_OPER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER),\n    SDLK_CLEARAGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN),\n    SDLK_CRSEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL),\n    SDLK_EXSEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL),\n\n    SDLK_KP_00 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00),\n    SDLK_KP_000 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000),\n    SDLK_THOUSANDSSEPARATOR =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR),\n    SDLK_DECIMALSEPARATOR =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR),\n    SDLK_CURRENCYUNIT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT),\n    SDLK_CURRENCYSUBUNIT =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT),\n    SDLK_KP_LEFTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN),\n    SDLK_KP_RIGHTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN),\n    SDLK_KP_LEFTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE),\n    SDLK_KP_RIGHTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE),\n    SDLK_KP_TAB = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB),\n    SDLK_KP_BACKSPACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE),\n    SDLK_KP_A = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A),\n    SDLK_KP_B = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B),\n    SDLK_KP_C = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C),\n    SDLK_KP_D = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D),\n    SDLK_KP_E = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E),\n    SDLK_KP_F = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F),\n    SDLK_KP_XOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR),\n    SDLK_KP_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER),\n    SDLK_KP_PERCENT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT),\n    SDLK_KP_LESS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS),\n    SDLK_KP_GREATER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER),\n    SDLK_KP_AMPERSAND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND),\n    SDLK_KP_DBLAMPERSAND =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND),\n    SDLK_KP_VERTICALBAR =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR),\n    SDLK_KP_DBLVERTICALBAR =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR),\n    SDLK_KP_COLON = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON),\n    SDLK_KP_HASH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH),\n    SDLK_KP_SPACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE),\n    SDLK_KP_AT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT),\n    SDLK_KP_EXCLAM = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM),\n    SDLK_KP_MEMSTORE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE),\n    SDLK_KP_MEMRECALL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL),\n    SDLK_KP_MEMCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR),\n    SDLK_KP_MEMADD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD),\n    SDLK_KP_MEMSUBTRACT =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT),\n    SDLK_KP_MEMMULTIPLY =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY),\n    SDLK_KP_MEMDIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE),\n    SDLK_KP_PLUSMINUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS),\n    SDLK_KP_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR),\n    SDLK_KP_CLEARENTRY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY),\n    SDLK_KP_BINARY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY),\n    SDLK_KP_OCTAL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL),\n    SDLK_KP_DECIMAL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL),\n    SDLK_KP_HEXADECIMAL =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL),\n\n    SDLK_LCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL),\n    SDLK_LSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT),\n    SDLK_LALT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT),\n    SDLK_LGUI = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI),\n    SDLK_RCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL),\n    SDLK_RSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT),\n    SDLK_RALT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT),\n    SDLK_RGUI = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI),\n\n    SDLK_MODE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE),\n\n    SDLK_AUDIONEXT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIONEXT),\n    SDLK_AUDIOPREV = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPREV),\n    SDLK_AUDIOSTOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOSTOP),\n    SDLK_AUDIOPLAY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPLAY),\n    SDLK_AUDIOMUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOMUTE),\n    SDLK_MEDIASELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIASELECT),\n    SDLK_WWW = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WWW),\n    SDLK_MAIL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MAIL),\n    SDLK_CALCULATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALCULATOR),\n    SDLK_COMPUTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COMPUTER),\n    SDLK_AC_SEARCH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH),\n    SDLK_AC_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME),\n    SDLK_AC_BACK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK),\n    SDLK_AC_FORWARD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD),\n    SDLK_AC_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP),\n    SDLK_AC_REFRESH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH),\n    SDLK_AC_BOOKMARKS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS),\n\n    SDLK_BRIGHTNESSDOWN =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSDOWN),\n    SDLK_BRIGHTNESSUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSUP),\n    SDLK_DISPLAYSWITCH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DISPLAYSWITCH),\n    SDLK_KBDILLUMTOGGLE =\n        SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMTOGGLE),\n    SDLK_KBDILLUMDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMDOWN),\n    SDLK_KBDILLUMUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMUP),\n    SDLK_EJECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EJECT),\n    SDLK_SLEEP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP)\n};\n\n/**\n * \\brief Enumeration of valid key mods (possibly OR'd together).\n */\ntypedef enum\n{\n    KMOD_NONE = 0x0000,\n    KMOD_LSHIFT = 0x0001,\n    KMOD_RSHIFT = 0x0002,\n    KMOD_LCTRL = 0x0040,\n    KMOD_RCTRL = 0x0080,\n    KMOD_LALT = 0x0100,\n    KMOD_RALT = 0x0200,\n    KMOD_LGUI = 0x0400,\n    KMOD_RGUI = 0x0800,\n    KMOD_NUM = 0x1000,\n    KMOD_CAPS = 0x2000,\n    KMOD_MODE = 0x4000,\n    KMOD_RESERVED = 0x8000\n} SDL_Keymod;\n\n#define KMOD_CTRL   (KMOD_LCTRL|KMOD_RCTRL)\n#define KMOD_SHIFT  (KMOD_LSHIFT|KMOD_RSHIFT)\n#define KMOD_ALT    (KMOD_LALT|KMOD_RALT)\n#define KMOD_GUI    (KMOD_LGUI|KMOD_RGUI)\n\n#endif /* _SDL_keycode_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_loadso.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_loadso.h\n *\n *  System dependent library loading routines\n *\n *  Some things to keep in mind:\n *  \\li These functions only work on C function names.  Other languages may\n *      have name mangling and intrinsic language support that varies from\n *      compiler to compiler.\n *  \\li Make sure you declare your function pointers with the same calling\n *      convention as the actual library function.  Your code will crash\n *      mysteriously if you do not do this.\n *  \\li Avoid namespace collisions.  If you load a symbol from the library,\n *      it is not defined whether or not it goes into the global symbol\n *      namespace for the application.  If it does and it conflicts with\n *      symbols in your code or other shared libraries, you will not get\n *      the results you expect. :)\n */\n\n#ifndef _SDL_loadso_h\n#define _SDL_loadso_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  This function dynamically loads a shared object and returns a pointer\n *  to the object handle (or NULL if there was an error).\n *  The 'sofile' parameter is a system dependent name of the object file.\n */\nextern DECLSPEC void *SDLCALL SDL_LoadObject(const char *sofile);\n\n/**\n *  Given an object handle, this function looks up the address of the\n *  named function in the shared object and returns it.  This address\n *  is no longer valid after calling SDL_UnloadObject().\n */\nextern DECLSPEC void *SDLCALL SDL_LoadFunction(void *handle,\n                                               const char *name);\n\n/**\n *  Unload a shared object from memory.\n */\nextern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_loadso_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_log.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_log.h\n *\n *  Simple log messages with categories and priorities.\n *\n *  By default logs are quiet, but if you're debugging SDL you might want:\n *\n *      SDL_LogSetAllPriority(SDL_LOG_PRIORITY_WARN);\n *\n *  Here's where the messages go on different platforms:\n *      Windows: debug output stream\n *      Android: log output\n *      Others: standard error output (stderr)\n */\n\n#ifndef _SDL_log_h\n#define _SDL_log_h\n\n#include \"SDL_stdinc.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/**\n *  \\brief The maximum size of a log message\n *\n *  Messages longer than the maximum size will be truncated\n */\n#define SDL_MAX_LOG_MESSAGE 4096\n\n/**\n *  \\brief The predefined log categories\n *\n *  By default the application category is enabled at the INFO level,\n *  the assert category is enabled at the WARN level, test is enabled\n *  at the VERBOSE level and all other categories are enabled at the\n *  CRITICAL level.\n */\nenum\n{\n    SDL_LOG_CATEGORY_APPLICATION,\n    SDL_LOG_CATEGORY_ERROR,\n    SDL_LOG_CATEGORY_ASSERT,\n    SDL_LOG_CATEGORY_SYSTEM,\n    SDL_LOG_CATEGORY_AUDIO,\n    SDL_LOG_CATEGORY_VIDEO,\n    SDL_LOG_CATEGORY_RENDER,\n    SDL_LOG_CATEGORY_INPUT,\n    SDL_LOG_CATEGORY_TEST,\n\n    /* Reserved for future SDL library use */\n    SDL_LOG_CATEGORY_RESERVED1,\n    SDL_LOG_CATEGORY_RESERVED2,\n    SDL_LOG_CATEGORY_RESERVED3,\n    SDL_LOG_CATEGORY_RESERVED4,\n    SDL_LOG_CATEGORY_RESERVED5,\n    SDL_LOG_CATEGORY_RESERVED6,\n    SDL_LOG_CATEGORY_RESERVED7,\n    SDL_LOG_CATEGORY_RESERVED8,\n    SDL_LOG_CATEGORY_RESERVED9,\n    SDL_LOG_CATEGORY_RESERVED10,\n\n    /* Beyond this point is reserved for application use, e.g.\n       enum {\n           MYAPP_CATEGORY_AWESOME1 = SDL_LOG_CATEGORY_CUSTOM,\n           MYAPP_CATEGORY_AWESOME2,\n           MYAPP_CATEGORY_AWESOME3,\n           ...\n       };\n     */\n    SDL_LOG_CATEGORY_CUSTOM\n};\n\n/**\n *  \\brief The predefined log priorities\n */\ntypedef enum\n{\n    SDL_LOG_PRIORITY_VERBOSE = 1,\n    SDL_LOG_PRIORITY_DEBUG,\n    SDL_LOG_PRIORITY_INFO,\n    SDL_LOG_PRIORITY_WARN,\n    SDL_LOG_PRIORITY_ERROR,\n    SDL_LOG_PRIORITY_CRITICAL,\n    SDL_NUM_LOG_PRIORITIES\n} SDL_LogPriority;\n\n\n/**\n *  \\brief Set the priority of all log categories\n */\nextern DECLSPEC void SDLCALL SDL_LogSetAllPriority(SDL_LogPriority priority);\n\n/**\n *  \\brief Set the priority of a particular log category\n */\nextern DECLSPEC void SDLCALL SDL_LogSetPriority(int category,\n                                                SDL_LogPriority priority);\n\n/**\n *  \\brief Get the priority of a particular log category\n */\nextern DECLSPEC SDL_LogPriority SDLCALL SDL_LogGetPriority(int category);\n\n/**\n *  \\brief Reset all priorities to default.\n *\n *  \\note This is called in SDL_Quit().\n */\nextern DECLSPEC void SDLCALL SDL_LogResetPriorities(void);\n\n/**\n *  \\brief Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO\n */\nextern DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1);\n\n/**\n *  \\brief Log a message with SDL_LOG_PRIORITY_VERBOSE\n */\nextern DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);\n\n/**\n *  \\brief Log a message with SDL_LOG_PRIORITY_DEBUG\n */\nextern DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);\n\n/**\n *  \\brief Log a message with SDL_LOG_PRIORITY_INFO\n */\nextern DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);\n\n/**\n *  \\brief Log a message with SDL_LOG_PRIORITY_WARN\n */\nextern DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);\n\n/**\n *  \\brief Log a message with SDL_LOG_PRIORITY_ERROR\n */\nextern DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);\n\n/**\n *  \\brief Log a message with SDL_LOG_PRIORITY_CRITICAL\n */\nextern DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);\n\n/**\n *  \\brief Log a message with the specified category and priority.\n */\nextern DECLSPEC void SDLCALL SDL_LogMessage(int category,\n                                            SDL_LogPriority priority,\n                                            SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(3);\n\n/**\n *  \\brief Log a message with the specified category and priority.\n */\nextern DECLSPEC void SDLCALL SDL_LogMessageV(int category,\n                                             SDL_LogPriority priority,\n                                             const char *fmt, va_list ap);\n\n/**\n *  \\brief The prototype for the log output function\n */\ntypedef void (*SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message);\n\n/**\n *  \\brief Get the current log output function.\n */\nextern DECLSPEC void SDLCALL SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata);\n\n/**\n *  \\brief This function allows you to replace the default log output\n *         function with one of your own.\n */\nextern DECLSPEC void SDLCALL SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_log_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_main.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_main_h\n#define _SDL_main_h\n\n#include \"SDL_stdinc.h\"\n\n/**\n *  \\file SDL_main.h\n *\n *  Redefine main() on some platforms so that it is called by SDL.\n */\n\n#ifndef SDL_MAIN_HANDLED\n#if defined(__WIN32__)\n/* On Windows SDL provides WinMain(), which parses the command line and passes\n   the arguments to your main function.\n\n   If you provide your own WinMain(), you may define SDL_MAIN_HANDLED\n */\n#define SDL_MAIN_AVAILABLE\n\n#elif defined(__WINRT__)\n/* On WinRT, SDL provides a main function that initializes CoreApplication,\n   creating an instance of IFrameworkView in the process.\n\n   Please note that #include'ing SDL_main.h is not enough to get a main()\n   function working.  In non-XAML apps, the file,\n   src/main/winrt/SDL_WinRT_main_NonXAML.cpp, or a copy of it, must be compiled\n   into the app itself.  In XAML apps, the function, SDL_WinRTRunApp must be\n   called, with a pointer to the Direct3D-hosted XAML control passed in.\n*/\n#define SDL_MAIN_NEEDED\n\n#elif defined(__IPHONEOS__)\n/* On iOS SDL provides a main function that creates an application delegate\n   and starts the iOS application run loop.\n\n   See src/video/uikit/SDL_uikitappdelegate.m for more details.\n */\n#define SDL_MAIN_NEEDED\n\n#elif defined(__ANDROID__)\n/* On Android SDL provides a Java class in SDLActivity.java that is the\n   main activity entry point.\n\n   See README-android.md for more details on extending that class.\n */\n#define SDL_MAIN_NEEDED\n\n#elif defined(__NACL__)\n/* On NACL we use ppapi_simple to set up the application helper code,\n   then wait for the first PSE_INSTANCE_DIDCHANGEVIEW event before \n   starting the user main function.\n   All user code is run in a separate thread by ppapi_simple, thus \n   allowing for blocking io to take place via nacl_io\n*/\n#define SDL_MAIN_NEEDED\n\n#endif\n#endif /* SDL_MAIN_HANDLED */\n\n#ifdef __cplusplus\n#define C_LINKAGE   \"C\"\n#else\n#define C_LINKAGE\n#endif /* __cplusplus */\n\n/**\n *  \\file SDL_main.h\n *\n *  The application's main() function must be called with C linkage,\n *  and should be declared like this:\n *  \\code\n *  #ifdef __cplusplus\n *  extern \"C\"\n *  #endif\n *  int main(int argc, char *argv[])\n *  {\n *  }\n *  \\endcode\n */\n\n#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE)\n#define main    SDL_main\n#endif\n\n/**\n *  The prototype for the application's main() function\n */\nextern C_LINKAGE int SDL_main(int argc, char *argv[]);\n\n\n#include \"begin_code.h\"\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  This is called by the real SDL main function to let the rest of the\n *  library know that initialization was done properly.\n *\n *  Calling this yourself without knowing what you're doing can cause\n *  crashes and hard to diagnose problems with your application.\n */\nextern DECLSPEC void SDLCALL SDL_SetMainReady(void);\n\n#ifdef __WIN32__\n\n/**\n *  This can be called to set the application class at startup\n */\nextern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style,\n                                            void *hInst);\nextern DECLSPEC void SDLCALL SDL_UnregisterApp(void);\n\n#endif /* __WIN32__ */\n\n\n#ifdef __WINRT__\n\n/**\n *  \\brief Initializes and launches an SDL/WinRT application.\n *\n *  \\param mainFunction The SDL app's C-style main().\n *  \\param reserved Reserved for future use; should be NULL\n *  \\return 0 on success, -1 on failure.  On failure, use SDL_GetError to retrieve more\n *      information on the failure.\n */\nextern DECLSPEC int SDLCALL SDL_WinRTRunApp(int (*mainFunction)(int, char **), void * reserved);\n\n#endif /* __WINRT__ */\n\n\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_main_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_messagebox.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_messagebox_h\n#define _SDL_messagebox_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_video.h\"      /* For SDL_Window */\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief SDL_MessageBox flags. If supported will display warning icon, etc.\n */\ntypedef enum\n{\n    SDL_MESSAGEBOX_ERROR        = 0x00000010,   /**< error dialog */\n    SDL_MESSAGEBOX_WARNING      = 0x00000020,   /**< warning dialog */\n    SDL_MESSAGEBOX_INFORMATION  = 0x00000040    /**< informational dialog */\n} SDL_MessageBoxFlags;\n\n/**\n * \\brief Flags for SDL_MessageBoxButtonData.\n */\ntypedef enum\n{\n    SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = 0x00000001,  /**< Marks the default button when return is hit */\n    SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = 0x00000002   /**< Marks the default button when escape is hit */\n} SDL_MessageBoxButtonFlags;\n\n/**\n *  \\brief Individual button data.\n */\ntypedef struct\n{\n    Uint32 flags;       /**< ::SDL_MessageBoxButtonFlags */\n    int buttonid;       /**< User defined button id (value returned via SDL_ShowMessageBox) */\n    const char * text;  /**< The UTF-8 button text */\n} SDL_MessageBoxButtonData;\n\n/**\n * \\brief RGB value used in a message box color scheme\n */\ntypedef struct\n{\n    Uint8 r, g, b;\n} SDL_MessageBoxColor;\n\ntypedef enum\n{\n    SDL_MESSAGEBOX_COLOR_BACKGROUND,\n    SDL_MESSAGEBOX_COLOR_TEXT,\n    SDL_MESSAGEBOX_COLOR_BUTTON_BORDER,\n    SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND,\n    SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED,\n    SDL_MESSAGEBOX_COLOR_MAX\n} SDL_MessageBoxColorType;\n\n/**\n * \\brief A set of colors to use for message box dialogs\n */\ntypedef struct\n{\n    SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_MAX];\n} SDL_MessageBoxColorScheme;\n\n/**\n *  \\brief MessageBox structure containing title, text, window, etc.\n */\ntypedef struct\n{\n    Uint32 flags;                       /**< ::SDL_MessageBoxFlags */\n    SDL_Window *window;                 /**< Parent window, can be NULL */\n    const char *title;                  /**< UTF-8 title */\n    const char *message;                /**< UTF-8 message text */\n\n    int numbuttons;\n    const SDL_MessageBoxButtonData *buttons;\n\n    const SDL_MessageBoxColorScheme *colorScheme;   /**< ::SDL_MessageBoxColorScheme, can be NULL to use system settings */\n} SDL_MessageBoxData;\n\n/**\n *  \\brief Create a modal message box.\n *\n *  \\param messageboxdata The SDL_MessageBoxData structure with title, text, etc.\n *  \\param buttonid The pointer to which user id of hit button should be copied.\n *\n *  \\return -1 on error, otherwise 0 and buttonid contains user id of button\n *          hit or -1 if dialog was closed.\n *\n *  \\note This function should be called on the thread that created the parent\n *        window, or on the main thread if the messagebox has no parent.  It will\n *        block execution of that thread until the user clicks a button or\n *        closes the messagebox.\n */\nextern DECLSPEC int SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid);\n\n/**\n *  \\brief Create a simple modal message box\n *\n *  \\param flags    ::SDL_MessageBoxFlags\n *  \\param title    UTF-8 title text\n *  \\param message  UTF-8 message text\n *  \\param window   The parent window, or NULL for no parent\n *\n *  \\return 0 on success, -1 on error\n *\n *  \\sa SDL_ShowMessageBox\n */\nextern DECLSPEC int SDLCALL SDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, SDL_Window *window);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_messagebox_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_mouse.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_mouse.h\n *\n *  Include file for SDL mouse event handling.\n */\n\n#ifndef _SDL_mouse_h\n#define _SDL_mouse_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_video.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct SDL_Cursor SDL_Cursor;   /* Implementation dependent */\n\n/**\n * \\brief Cursor types for SDL_CreateSystemCursor().\n */\ntypedef enum\n{\n    SDL_SYSTEM_CURSOR_ARROW,     /**< Arrow */\n    SDL_SYSTEM_CURSOR_IBEAM,     /**< I-beam */\n    SDL_SYSTEM_CURSOR_WAIT,      /**< Wait */\n    SDL_SYSTEM_CURSOR_CROSSHAIR, /**< Crosshair */\n    SDL_SYSTEM_CURSOR_WAITARROW, /**< Small wait cursor (or Wait if not available) */\n    SDL_SYSTEM_CURSOR_SIZENWSE,  /**< Double arrow pointing northwest and southeast */\n    SDL_SYSTEM_CURSOR_SIZENESW,  /**< Double arrow pointing northeast and southwest */\n    SDL_SYSTEM_CURSOR_SIZEWE,    /**< Double arrow pointing west and east */\n    SDL_SYSTEM_CURSOR_SIZENS,    /**< Double arrow pointing north and south */\n    SDL_SYSTEM_CURSOR_SIZEALL,   /**< Four pointed arrow pointing north, south, east, and west */\n    SDL_SYSTEM_CURSOR_NO,        /**< Slashed circle or crossbones */\n    SDL_SYSTEM_CURSOR_HAND,      /**< Hand */\n    SDL_NUM_SYSTEM_CURSORS\n} SDL_SystemCursor;\n\n/**\n * \\brief Scroll direction types for the Scroll event\n */\ntypedef enum\n{\n    SDL_MOUSEWHEEL_NORMAL,    /**< The scroll direction is normal */\n    SDL_MOUSEWHEEL_FLIPPED    /**< The scroll direction is flipped / natural */\n} SDL_MouseWheelDirection;\n\n/* Function prototypes */\n\n/**\n *  \\brief Get the window which currently has mouse focus.\n */\nextern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void);\n\n/**\n *  \\brief Retrieve the current state of the mouse.\n *\n *  The current button state is returned as a button bitmask, which can\n *  be tested using the SDL_BUTTON(X) macros, and x and y are set to the\n *  mouse cursor position relative to the focus window for the currently\n *  selected mouse.  You can pass NULL for either x or y.\n */\nextern DECLSPEC Uint32 SDLCALL SDL_GetMouseState(int *x, int *y);\n\n/**\n *  \\brief Get the current state of the mouse, in relation to the desktop\n *\n *  This works just like SDL_GetMouseState(), but the coordinates will be\n *  reported relative to the top-left of the desktop. This can be useful if\n *  you need to track the mouse outside of a specific window and\n *  SDL_CaptureMouse() doesn't fit your needs. For example, it could be\n *  useful if you need to track the mouse while dragging a window, where\n *  coordinates relative to a window might not be in sync at all times.\n *\n *  \\note SDL_GetMouseState() returns the mouse position as SDL understands\n *        it from the last pump of the event queue. This function, however,\n *        queries the OS for the current mouse position, and as such, might\n *        be a slightly less efficient function. Unless you know what you're\n *        doing and have a good reason to use this function, you probably want\n *        SDL_GetMouseState() instead.\n *\n *  \\param x Returns the current X coord, relative to the desktop. Can be NULL.\n *  \\param y Returns the current Y coord, relative to the desktop. Can be NULL.\n *  \\return The current button state as a bitmask, which can be tested using the SDL_BUTTON(X) macros.\n *\n *  \\sa SDL_GetMouseState\n */\nextern DECLSPEC Uint32 SDLCALL SDL_GetGlobalMouseState(int *x, int *y);\n\n/**\n *  \\brief Retrieve the relative state of the mouse.\n *\n *  The current button state is returned as a button bitmask, which can\n *  be tested using the SDL_BUTTON(X) macros, and x and y are set to the\n *  mouse deltas since the last call to SDL_GetRelativeMouseState().\n */\nextern DECLSPEC Uint32 SDLCALL SDL_GetRelativeMouseState(int *x, int *y);\n\n/**\n *  \\brief Moves the mouse to the given position within the window.\n *\n *  \\param window The window to move the mouse into, or NULL for the current mouse focus\n *  \\param x The x coordinate within the window\n *  \\param y The y coordinate within the window\n *\n *  \\note This function generates a mouse motion event\n */\nextern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window,\n                                                   int x, int y);\n\n/**\n *  \\brief Moves the mouse to the given position in global screen space.\n *\n *  \\param x The x coordinate\n *  \\param y The y coordinate\n *  \\return 0 on success, -1 on error (usually: unsupported by a platform).\n *\n *  \\note This function generates a mouse motion event\n */\nextern DECLSPEC int SDLCALL SDL_WarpMouseGlobal(int x, int y);\n\n/**\n *  \\brief Set relative mouse mode.\n *\n *  \\param enabled Whether or not to enable relative mode\n *\n *  \\return 0 on success, or -1 if relative mode is not supported.\n *\n *  While the mouse is in relative mode, the cursor is hidden, and the\n *  driver will try to report continuous motion in the current window.\n *  Only relative motion events will be delivered, the mouse position\n *  will not change.\n *\n *  \\note This function will flush any pending mouse motion.\n *\n *  \\sa SDL_GetRelativeMouseMode()\n */\nextern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(SDL_bool enabled);\n\n/**\n *  \\brief Capture the mouse, to track input outside an SDL window.\n *\n *  \\param enabled Whether or not to enable capturing\n *\n *  Capturing enables your app to obtain mouse events globally, instead of\n *  just within your window. Not all video targets support this function.\n *  When capturing is enabled, the current window will get all mouse events,\n *  but unlike relative mode, no change is made to the cursor and it is\n *  not restrained to your window.\n *\n *  This function may also deny mouse input to other windows--both those in\n *  your application and others on the system--so you should use this\n *  function sparingly, and in small bursts. For example, you might want to\n *  track the mouse while the user is dragging something, until the user\n *  releases a mouse button. It is not recommended that you capture the mouse\n *  for long periods of time, such as the entire time your app is running.\n *\n *  While captured, mouse events still report coordinates relative to the\n *  current (foreground) window, but those coordinates may be outside the\n *  bounds of the window (including negative values). Capturing is only\n *  allowed for the foreground window. If the window loses focus while\n *  capturing, the capture will be disabled automatically.\n *\n *  While capturing is enabled, the current window will have the\n *  SDL_WINDOW_MOUSE_CAPTURE flag set.\n *\n *  \\return 0 on success, or -1 if not supported.\n */\nextern DECLSPEC int SDLCALL SDL_CaptureMouse(SDL_bool enabled);\n\n/**\n *  \\brief Query whether relative mouse mode is enabled.\n *\n *  \\sa SDL_SetRelativeMouseMode()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(void);\n\n/**\n *  \\brief Create a cursor, using the specified bitmap data and\n *         mask (in MSB format).\n *\n *  The cursor width must be a multiple of 8 bits.\n *\n *  The cursor is created in black and white according to the following:\n *  <table>\n *  <tr><td> data </td><td> mask </td><td> resulting pixel on screen </td></tr>\n *  <tr><td>  0   </td><td>  1   </td><td> White </td></tr>\n *  <tr><td>  1   </td><td>  1   </td><td> Black </td></tr>\n *  <tr><td>  0   </td><td>  0   </td><td> Transparent </td></tr>\n *  <tr><td>  1   </td><td>  0   </td><td> Inverted color if possible, black\n *                                         if not. </td></tr>\n *  </table>\n *\n *  \\sa SDL_FreeCursor()\n */\nextern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateCursor(const Uint8 * data,\n                                                     const Uint8 * mask,\n                                                     int w, int h, int hot_x,\n                                                     int hot_y);\n\n/**\n *  \\brief Create a color cursor.\n *\n *  \\sa SDL_FreeCursor()\n */\nextern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateColorCursor(SDL_Surface *surface,\n                                                          int hot_x,\n                                                          int hot_y);\n\n/**\n *  \\brief Create a system cursor.\n *\n *  \\sa SDL_FreeCursor()\n */\nextern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateSystemCursor(SDL_SystemCursor id);\n\n/**\n *  \\brief Set the active cursor.\n */\nextern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor * cursor);\n\n/**\n *  \\brief Return the active cursor.\n */\nextern DECLSPEC SDL_Cursor *SDLCALL SDL_GetCursor(void);\n\n/**\n *  \\brief Return the default cursor.\n */\nextern DECLSPEC SDL_Cursor *SDLCALL SDL_GetDefaultCursor(void);\n\n/**\n *  \\brief Frees a cursor created with SDL_CreateCursor() or similar functions.\n *\n *  \\sa SDL_CreateCursor()\n *  \\sa SDL_CreateColorCursor()\n *  \\sa SDL_CreateSystemCursor()\n */\nextern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor);\n\n/**\n *  \\brief Toggle whether or not the cursor is shown.\n *\n *  \\param toggle 1 to show the cursor, 0 to hide it, -1 to query the current\n *                state.\n *\n *  \\return 1 if the cursor is shown, or 0 if the cursor is hidden.\n */\nextern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle);\n\n/**\n *  Used as a mask when testing buttons in buttonstate.\n *   - Button 1:  Left mouse button\n *   - Button 2:  Middle mouse button\n *   - Button 3:  Right mouse button\n */\n#define SDL_BUTTON(X)       (1 << ((X)-1))\n#define SDL_BUTTON_LEFT     1\n#define SDL_BUTTON_MIDDLE   2\n#define SDL_BUTTON_RIGHT    3\n#define SDL_BUTTON_X1       4\n#define SDL_BUTTON_X2       5\n#define SDL_BUTTON_LMASK    SDL_BUTTON(SDL_BUTTON_LEFT)\n#define SDL_BUTTON_MMASK    SDL_BUTTON(SDL_BUTTON_MIDDLE)\n#define SDL_BUTTON_RMASK    SDL_BUTTON(SDL_BUTTON_RIGHT)\n#define SDL_BUTTON_X1MASK   SDL_BUTTON(SDL_BUTTON_X1)\n#define SDL_BUTTON_X2MASK   SDL_BUTTON(SDL_BUTTON_X2)\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_mouse_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_mutex.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_mutex_h\n#define _SDL_mutex_h\n\n/**\n *  \\file SDL_mutex.h\n *\n *  Functions to provide thread synchronization primitives.\n */\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  Synchronization functions which can time out return this value\n *  if they time out.\n */\n#define SDL_MUTEX_TIMEDOUT  1\n\n/**\n *  This is the timeout value which corresponds to never time out.\n */\n#define SDL_MUTEX_MAXWAIT   (~(Uint32)0)\n\n\n/**\n *  \\name Mutex functions\n */\n/* @{ */\n\n/* The SDL mutex structure, defined in SDL_sysmutex.c */\nstruct SDL_mutex;\ntypedef struct SDL_mutex SDL_mutex;\n\n/**\n *  Create a mutex, initialized unlocked.\n */\nextern DECLSPEC SDL_mutex *SDLCALL SDL_CreateMutex(void);\n\n/**\n *  Lock the mutex.\n *\n *  \\return 0, or -1 on error.\n */\n#define SDL_mutexP(m)   SDL_LockMutex(m)\nextern DECLSPEC int SDLCALL SDL_LockMutex(SDL_mutex * mutex);\n\n/**\n *  Try to lock the mutex\n *\n *  \\return 0, SDL_MUTEX_TIMEDOUT, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_TryLockMutex(SDL_mutex * mutex);\n\n/**\n *  Unlock the mutex.\n *\n *  \\return 0, or -1 on error.\n *\n *  \\warning It is an error to unlock a mutex that has not been locked by\n *           the current thread, and doing so results in undefined behavior.\n */\n#define SDL_mutexV(m)   SDL_UnlockMutex(m)\nextern DECLSPEC int SDLCALL SDL_UnlockMutex(SDL_mutex * mutex);\n\n/**\n *  Destroy a mutex.\n */\nextern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex * mutex);\n\n/* @} *//* Mutex functions */\n\n\n/**\n *  \\name Semaphore functions\n */\n/* @{ */\n\n/* The SDL semaphore structure, defined in SDL_syssem.c */\nstruct SDL_semaphore;\ntypedef struct SDL_semaphore SDL_sem;\n\n/**\n *  Create a semaphore, initialized with value, returns NULL on failure.\n */\nextern DECLSPEC SDL_sem *SDLCALL SDL_CreateSemaphore(Uint32 initial_value);\n\n/**\n *  Destroy a semaphore.\n */\nextern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem * sem);\n\n/**\n *  This function suspends the calling thread until the semaphore pointed\n *  to by \\c sem has a positive count. It then atomically decreases the\n *  semaphore count.\n */\nextern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem * sem);\n\n/**\n *  Non-blocking variant of SDL_SemWait().\n *\n *  \\return 0 if the wait succeeds, ::SDL_MUTEX_TIMEDOUT if the wait would\n *          block, and -1 on error.\n */\nextern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem * sem);\n\n/**\n *  Variant of SDL_SemWait() with a timeout in milliseconds.\n *\n *  \\return 0 if the wait succeeds, ::SDL_MUTEX_TIMEDOUT if the wait does not\n *          succeed in the allotted time, and -1 on error.\n *\n *  \\warning On some platforms this function is implemented by looping with a\n *           delay of 1 ms, and so should be avoided if possible.\n */\nextern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem * sem, Uint32 ms);\n\n/**\n *  Atomically increases the semaphore's count (not blocking).\n *\n *  \\return 0, or -1 on error.\n */\nextern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem * sem);\n\n/**\n *  Returns the current count of the semaphore.\n */\nextern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem * sem);\n\n/* @} *//* Semaphore functions */\n\n\n/**\n *  \\name Condition variable functions\n */\n/* @{ */\n\n/* The SDL condition variable structure, defined in SDL_syscond.c */\nstruct SDL_cond;\ntypedef struct SDL_cond SDL_cond;\n\n/**\n *  Create a condition variable.\n *\n *  Typical use of condition variables:\n *\n *  Thread A:\n *    SDL_LockMutex(lock);\n *    while ( ! condition ) {\n *        SDL_CondWait(cond, lock);\n *    }\n *    SDL_UnlockMutex(lock);\n *\n *  Thread B:\n *    SDL_LockMutex(lock);\n *    ...\n *    condition = true;\n *    ...\n *    SDL_CondSignal(cond);\n *    SDL_UnlockMutex(lock);\n *\n *  There is some discussion whether to signal the condition variable\n *  with the mutex locked or not.  There is some potential performance\n *  benefit to unlocking first on some platforms, but there are some\n *  potential race conditions depending on how your code is structured.\n *\n *  In general it's safer to signal the condition variable while the\n *  mutex is locked.\n */\nextern DECLSPEC SDL_cond *SDLCALL SDL_CreateCond(void);\n\n/**\n *  Destroy a condition variable.\n */\nextern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond * cond);\n\n/**\n *  Restart one of the threads that are waiting on the condition variable.\n *\n *  \\return 0 or -1 on error.\n */\nextern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond * cond);\n\n/**\n *  Restart all threads that are waiting on the condition variable.\n *\n *  \\return 0 or -1 on error.\n */\nextern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond * cond);\n\n/**\n *  Wait on the condition variable, unlocking the provided mutex.\n *\n *  \\warning The mutex must be locked before entering this function!\n *\n *  The mutex is re-locked once the condition variable is signaled.\n *\n *  \\return 0 when it is signaled, or -1 on error.\n */\nextern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex);\n\n/**\n *  Waits for at most \\c ms milliseconds, and returns 0 if the condition\n *  variable is signaled, ::SDL_MUTEX_TIMEDOUT if the condition is not\n *  signaled in the allotted time, and -1 on error.\n *\n *  \\warning On some platforms this function is implemented by looping with a\n *           delay of 1 ms, and so should be avoided if possible.\n */\nextern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond * cond,\n                                                SDL_mutex * mutex, Uint32 ms);\n\n/* @} *//* Condition variable functions */\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_mutex_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_name.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDLname_h_\n#define _SDLname_h_\n\n#if defined(__STDC__) || defined(__cplusplus)\n#define NeedFunctionPrototypes 1\n#endif\n\n#define SDL_NAME(X) SDL_##X\n\n#endif /* _SDLname_h_ */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_opengl.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_opengl.h\n *\n *  This is a simple file to encapsulate the OpenGL API headers.\n */\n\n/**\n *  \\def NO_SDL_GLEXT\n *\n *  Define this if you have your own version of glext.h and want to disable the\n *  version included in SDL_opengl.h.\n */\n\n#ifndef _SDL_opengl_h\n#define _SDL_opengl_h\n\n#include \"SDL_config.h\"\n\n#ifndef __IPHONEOS__  /* No OpenGL on iOS. */\n\n/*\n * Mesa 3-D graphics library\n *\n * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.\n * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n\n#ifndef __gl_h_\n#define __gl_h_\n\n#if defined(USE_MGL_NAMESPACE)\n#include \"gl_mangle.h\"\n#endif\n\n\n/**********************************************************************\n * Begin system-specific stuff.\n */\n\n#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__)\n#define __WIN32__\n#endif\n\n#if defined(__WIN32__) && !defined(__CYGWIN__)\n#  if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */\n#    define GLAPI __declspec(dllexport)\n#  elif (defined(_MSC_VER) || defined(__MINGW32__)) && defined(_DLL) /* tag specifying we're building for DLL runtime support */\n#    define GLAPI __declspec(dllimport)\n#  else /* for use with static link lib build of Win32 edition only */\n#    define GLAPI extern\n#  endif /* _STATIC_MESA support */\n#  if defined(__MINGW32__) && defined(GL_NO_STDCALL) || defined(UNDER_CE)  /* The generated DLLs by MingW with STDCALL are not compatible with the ones done by Microsoft's compilers */\n#    define GLAPIENTRY \n#  else\n#    define GLAPIENTRY __stdcall\n#  endif\n#elif defined(__CYGWIN__) && defined(USE_OPENGL32) /* use native windows opengl32 */\n#  define GLAPI extern\n#  define GLAPIENTRY __stdcall\n#elif (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))\n#  define GLAPI __attribute__((visibility(\"default\")))\n#  define GLAPIENTRY\n#endif /* WIN32 && !CYGWIN */\n\n/*\n * WINDOWS: Include windows.h here to define APIENTRY.\n * It is also useful when applications include this file by\n * including only glut.h, since glut.h depends on windows.h.\n * Applications needing to include windows.h with parms other\n * than \"WIN32_LEAN_AND_MEAN\" may include windows.h before\n * glut.h or gl.h.\n */\n#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__)\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN 1\n#endif\n#ifndef NOMINMAX   /* don't define min() and max(). */\n#define NOMINMAX\n#endif\n#include <windows.h>\n#endif\n\n#ifndef GLAPI\n#define GLAPI extern\n#endif\n\n#ifndef GLAPIENTRY\n#define GLAPIENTRY\n#endif\n\n#ifndef APIENTRY\n#define APIENTRY GLAPIENTRY\n#endif\n\n/* \"P\" suffix to be used for a pointer to a function */\n#ifndef APIENTRYP\n#define APIENTRYP APIENTRY *\n#endif\n\n#ifndef GLAPIENTRYP\n#define GLAPIENTRYP GLAPIENTRY *\n#endif\n\n#if defined(PRAGMA_EXPORT_SUPPORTED)\n#pragma export on\n#endif\n\n/*\n * End system-specific stuff.\n **********************************************************************/\n\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n#define GL_VERSION_1_1   1\n#define GL_VERSION_1_2   1\n#define GL_VERSION_1_3   1\n#define GL_ARB_imaging   1\n\n\n/*\n * Datatypes\n */\ntypedef unsigned int\tGLenum;\ntypedef unsigned char\tGLboolean;\ntypedef unsigned int\tGLbitfield;\ntypedef void\t\tGLvoid;\ntypedef signed char\tGLbyte;\t\t/* 1-byte signed */\ntypedef short\t\tGLshort;\t/* 2-byte signed */\ntypedef int\t\tGLint;\t\t/* 4-byte signed */\ntypedef unsigned char\tGLubyte;\t/* 1-byte unsigned */\ntypedef unsigned short\tGLushort;\t/* 2-byte unsigned */\ntypedef unsigned int\tGLuint;\t\t/* 4-byte unsigned */\ntypedef int\t\tGLsizei;\t/* 4-byte signed */\ntypedef float\t\tGLfloat;\t/* single precision float */\ntypedef float\t\tGLclampf;\t/* single precision float in [0,1] */\ntypedef double\t\tGLdouble;\t/* double precision float */\ntypedef double\t\tGLclampd;\t/* double precision float in [0,1] */\n\n\n\n/*\n * Constants\n */\n\n/* Boolean values */\n#define GL_FALSE\t\t\t\t0\n#define GL_TRUE\t\t\t\t\t1\n\n/* Data types */\n#define GL_BYTE\t\t\t\t\t0x1400\n#define GL_UNSIGNED_BYTE\t\t\t0x1401\n#define GL_SHORT\t\t\t\t0x1402\n#define GL_UNSIGNED_SHORT\t\t\t0x1403\n#define GL_INT\t\t\t\t\t0x1404\n#define GL_UNSIGNED_INT\t\t\t\t0x1405\n#define GL_FLOAT\t\t\t\t0x1406\n#define GL_2_BYTES\t\t\t\t0x1407\n#define GL_3_BYTES\t\t\t\t0x1408\n#define GL_4_BYTES\t\t\t\t0x1409\n#define GL_DOUBLE\t\t\t\t0x140A\n\n/* Primitives */\n#define GL_POINTS\t\t\t\t0x0000\n#define GL_LINES\t\t\t\t0x0001\n#define GL_LINE_LOOP\t\t\t\t0x0002\n#define GL_LINE_STRIP\t\t\t\t0x0003\n#define GL_TRIANGLES\t\t\t\t0x0004\n#define GL_TRIANGLE_STRIP\t\t\t0x0005\n#define GL_TRIANGLE_FAN\t\t\t\t0x0006\n#define GL_QUADS\t\t\t\t0x0007\n#define GL_QUAD_STRIP\t\t\t\t0x0008\n#define GL_POLYGON\t\t\t\t0x0009\n\n/* Vertex Arrays */\n#define GL_VERTEX_ARRAY\t\t\t\t0x8074\n#define GL_NORMAL_ARRAY\t\t\t\t0x8075\n#define GL_COLOR_ARRAY\t\t\t\t0x8076\n#define GL_INDEX_ARRAY\t\t\t\t0x8077\n#define GL_TEXTURE_COORD_ARRAY\t\t\t0x8078\n#define GL_EDGE_FLAG_ARRAY\t\t\t0x8079\n#define GL_VERTEX_ARRAY_SIZE\t\t\t0x807A\n#define GL_VERTEX_ARRAY_TYPE\t\t\t0x807B\n#define GL_VERTEX_ARRAY_STRIDE\t\t\t0x807C\n#define GL_NORMAL_ARRAY_TYPE\t\t\t0x807E\n#define GL_NORMAL_ARRAY_STRIDE\t\t\t0x807F\n#define GL_COLOR_ARRAY_SIZE\t\t\t0x8081\n#define GL_COLOR_ARRAY_TYPE\t\t\t0x8082\n#define GL_COLOR_ARRAY_STRIDE\t\t\t0x8083\n#define GL_INDEX_ARRAY_TYPE\t\t\t0x8085\n#define GL_INDEX_ARRAY_STRIDE\t\t\t0x8086\n#define GL_TEXTURE_COORD_ARRAY_SIZE\t\t0x8088\n#define GL_TEXTURE_COORD_ARRAY_TYPE\t\t0x8089\n#define GL_TEXTURE_COORD_ARRAY_STRIDE\t\t0x808A\n#define GL_EDGE_FLAG_ARRAY_STRIDE\t\t0x808C\n#define GL_VERTEX_ARRAY_POINTER\t\t\t0x808E\n#define GL_NORMAL_ARRAY_POINTER\t\t\t0x808F\n#define GL_COLOR_ARRAY_POINTER\t\t\t0x8090\n#define GL_INDEX_ARRAY_POINTER\t\t\t0x8091\n#define GL_TEXTURE_COORD_ARRAY_POINTER\t\t0x8092\n#define GL_EDGE_FLAG_ARRAY_POINTER\t\t0x8093\n#define GL_V2F\t\t\t\t\t0x2A20\n#define GL_V3F\t\t\t\t\t0x2A21\n#define GL_C4UB_V2F\t\t\t\t0x2A22\n#define GL_C4UB_V3F\t\t\t\t0x2A23\n#define GL_C3F_V3F\t\t\t\t0x2A24\n#define GL_N3F_V3F\t\t\t\t0x2A25\n#define GL_C4F_N3F_V3F\t\t\t\t0x2A26\n#define GL_T2F_V3F\t\t\t\t0x2A27\n#define GL_T4F_V4F\t\t\t\t0x2A28\n#define GL_T2F_C4UB_V3F\t\t\t\t0x2A29\n#define GL_T2F_C3F_V3F\t\t\t\t0x2A2A\n#define GL_T2F_N3F_V3F\t\t\t\t0x2A2B\n#define GL_T2F_C4F_N3F_V3F\t\t\t0x2A2C\n#define GL_T4F_C4F_N3F_V4F\t\t\t0x2A2D\n\n/* Matrix Mode */\n#define GL_MATRIX_MODE\t\t\t\t0x0BA0\n#define GL_MODELVIEW\t\t\t\t0x1700\n#define GL_PROJECTION\t\t\t\t0x1701\n#define GL_TEXTURE\t\t\t\t0x1702\n\n/* Points */\n#define GL_POINT_SMOOTH\t\t\t\t0x0B10\n#define GL_POINT_SIZE\t\t\t\t0x0B11\n#define GL_POINT_SIZE_GRANULARITY \t\t0x0B13\n#define GL_POINT_SIZE_RANGE\t\t\t0x0B12\n\n/* Lines */\n#define GL_LINE_SMOOTH\t\t\t\t0x0B20\n#define GL_LINE_STIPPLE\t\t\t\t0x0B24\n#define GL_LINE_STIPPLE_PATTERN\t\t\t0x0B25\n#define GL_LINE_STIPPLE_REPEAT\t\t\t0x0B26\n#define GL_LINE_WIDTH\t\t\t\t0x0B21\n#define GL_LINE_WIDTH_GRANULARITY\t\t0x0B23\n#define GL_LINE_WIDTH_RANGE\t\t\t0x0B22\n\n/* Polygons */\n#define GL_POINT\t\t\t\t0x1B00\n#define GL_LINE\t\t\t\t\t0x1B01\n#define GL_FILL\t\t\t\t\t0x1B02\n#define GL_CW\t\t\t\t\t0x0900\n#define GL_CCW\t\t\t\t\t0x0901\n#define GL_FRONT\t\t\t\t0x0404\n#define GL_BACK\t\t\t\t\t0x0405\n#define GL_POLYGON_MODE\t\t\t\t0x0B40\n#define GL_POLYGON_SMOOTH\t\t\t0x0B41\n#define GL_POLYGON_STIPPLE\t\t\t0x0B42\n#define GL_EDGE_FLAG\t\t\t\t0x0B43\n#define GL_CULL_FACE\t\t\t\t0x0B44\n#define GL_CULL_FACE_MODE\t\t\t0x0B45\n#define GL_FRONT_FACE\t\t\t\t0x0B46\n#define GL_POLYGON_OFFSET_FACTOR\t\t0x8038\n#define GL_POLYGON_OFFSET_UNITS\t\t\t0x2A00\n#define GL_POLYGON_OFFSET_POINT\t\t\t0x2A01\n#define GL_POLYGON_OFFSET_LINE\t\t\t0x2A02\n#define GL_POLYGON_OFFSET_FILL\t\t\t0x8037\n\n/* Display Lists */\n#define GL_COMPILE\t\t\t\t0x1300\n#define GL_COMPILE_AND_EXECUTE\t\t\t0x1301\n#define GL_LIST_BASE\t\t\t\t0x0B32\n#define GL_LIST_INDEX\t\t\t\t0x0B33\n#define GL_LIST_MODE\t\t\t\t0x0B30\n\n/* Depth buffer */\n#define GL_NEVER\t\t\t\t0x0200\n#define GL_LESS\t\t\t\t\t0x0201\n#define GL_EQUAL\t\t\t\t0x0202\n#define GL_LEQUAL\t\t\t\t0x0203\n#define GL_GREATER\t\t\t\t0x0204\n#define GL_NOTEQUAL\t\t\t\t0x0205\n#define GL_GEQUAL\t\t\t\t0x0206\n#define GL_ALWAYS\t\t\t\t0x0207\n#define GL_DEPTH_TEST\t\t\t\t0x0B71\n#define GL_DEPTH_BITS\t\t\t\t0x0D56\n#define GL_DEPTH_CLEAR_VALUE\t\t\t0x0B73\n#define GL_DEPTH_FUNC\t\t\t\t0x0B74\n#define GL_DEPTH_RANGE\t\t\t\t0x0B70\n#define GL_DEPTH_WRITEMASK\t\t\t0x0B72\n#define GL_DEPTH_COMPONENT\t\t\t0x1902\n\n/* Lighting */\n#define GL_LIGHTING\t\t\t\t0x0B50\n#define GL_LIGHT0\t\t\t\t0x4000\n#define GL_LIGHT1\t\t\t\t0x4001\n#define GL_LIGHT2\t\t\t\t0x4002\n#define GL_LIGHT3\t\t\t\t0x4003\n#define GL_LIGHT4\t\t\t\t0x4004\n#define GL_LIGHT5\t\t\t\t0x4005\n#define GL_LIGHT6\t\t\t\t0x4006\n#define GL_LIGHT7\t\t\t\t0x4007\n#define GL_SPOT_EXPONENT\t\t\t0x1205\n#define GL_SPOT_CUTOFF\t\t\t\t0x1206\n#define GL_CONSTANT_ATTENUATION\t\t\t0x1207\n#define GL_LINEAR_ATTENUATION\t\t\t0x1208\n#define GL_QUADRATIC_ATTENUATION\t\t0x1209\n#define GL_AMBIENT\t\t\t\t0x1200\n#define GL_DIFFUSE\t\t\t\t0x1201\n#define GL_SPECULAR\t\t\t\t0x1202\n#define GL_SHININESS\t\t\t\t0x1601\n#define GL_EMISSION\t\t\t\t0x1600\n#define GL_POSITION\t\t\t\t0x1203\n#define GL_SPOT_DIRECTION\t\t\t0x1204\n#define GL_AMBIENT_AND_DIFFUSE\t\t\t0x1602\n#define GL_COLOR_INDEXES\t\t\t0x1603\n#define GL_LIGHT_MODEL_TWO_SIDE\t\t\t0x0B52\n#define GL_LIGHT_MODEL_LOCAL_VIEWER\t\t0x0B51\n#define GL_LIGHT_MODEL_AMBIENT\t\t\t0x0B53\n#define GL_FRONT_AND_BACK\t\t\t0x0408\n#define GL_SHADE_MODEL\t\t\t\t0x0B54\n#define GL_FLAT\t\t\t\t\t0x1D00\n#define GL_SMOOTH\t\t\t\t0x1D01\n#define GL_COLOR_MATERIAL\t\t\t0x0B57\n#define GL_COLOR_MATERIAL_FACE\t\t\t0x0B55\n#define GL_COLOR_MATERIAL_PARAMETER\t\t0x0B56\n#define GL_NORMALIZE\t\t\t\t0x0BA1\n\n/* User clipping planes */\n#define GL_CLIP_PLANE0\t\t\t\t0x3000\n#define GL_CLIP_PLANE1\t\t\t\t0x3001\n#define GL_CLIP_PLANE2\t\t\t\t0x3002\n#define GL_CLIP_PLANE3\t\t\t\t0x3003\n#define GL_CLIP_PLANE4\t\t\t\t0x3004\n#define GL_CLIP_PLANE5\t\t\t\t0x3005\n\n/* Accumulation buffer */\n#define GL_ACCUM_RED_BITS\t\t\t0x0D58\n#define GL_ACCUM_GREEN_BITS\t\t\t0x0D59\n#define GL_ACCUM_BLUE_BITS\t\t\t0x0D5A\n#define GL_ACCUM_ALPHA_BITS\t\t\t0x0D5B\n#define GL_ACCUM_CLEAR_VALUE\t\t\t0x0B80\n#define GL_ACCUM\t\t\t\t0x0100\n#define GL_ADD\t\t\t\t\t0x0104\n#define GL_LOAD\t\t\t\t\t0x0101\n#define GL_MULT\t\t\t\t\t0x0103\n#define GL_RETURN\t\t\t\t0x0102\n\n/* Alpha testing */\n#define GL_ALPHA_TEST\t\t\t\t0x0BC0\n#define GL_ALPHA_TEST_REF\t\t\t0x0BC2\n#define GL_ALPHA_TEST_FUNC\t\t\t0x0BC1\n\n/* Blending */\n#define GL_BLEND\t\t\t\t0x0BE2\n#define GL_BLEND_SRC\t\t\t\t0x0BE1\n#define GL_BLEND_DST\t\t\t\t0x0BE0\n#define GL_ZERO\t\t\t\t\t0\n#define GL_ONE\t\t\t\t\t1\n#define GL_SRC_COLOR\t\t\t\t0x0300\n#define GL_ONE_MINUS_SRC_COLOR\t\t\t0x0301\n#define GL_SRC_ALPHA\t\t\t\t0x0302\n#define GL_ONE_MINUS_SRC_ALPHA\t\t\t0x0303\n#define GL_DST_ALPHA\t\t\t\t0x0304\n#define GL_ONE_MINUS_DST_ALPHA\t\t\t0x0305\n#define GL_DST_COLOR\t\t\t\t0x0306\n#define GL_ONE_MINUS_DST_COLOR\t\t\t0x0307\n#define GL_SRC_ALPHA_SATURATE\t\t\t0x0308\n\n/* Render Mode */\n#define GL_FEEDBACK\t\t\t\t0x1C01\n#define GL_RENDER\t\t\t\t0x1C00\n#define GL_SELECT\t\t\t\t0x1C02\n\n/* Feedback */\n#define GL_2D\t\t\t\t\t0x0600\n#define GL_3D\t\t\t\t\t0x0601\n#define GL_3D_COLOR\t\t\t\t0x0602\n#define GL_3D_COLOR_TEXTURE\t\t\t0x0603\n#define GL_4D_COLOR_TEXTURE\t\t\t0x0604\n#define GL_POINT_TOKEN\t\t\t\t0x0701\n#define GL_LINE_TOKEN\t\t\t\t0x0702\n#define GL_LINE_RESET_TOKEN\t\t\t0x0707\n#define GL_POLYGON_TOKEN\t\t\t0x0703\n#define GL_BITMAP_TOKEN\t\t\t\t0x0704\n#define GL_DRAW_PIXEL_TOKEN\t\t\t0x0705\n#define GL_COPY_PIXEL_TOKEN\t\t\t0x0706\n#define GL_PASS_THROUGH_TOKEN\t\t\t0x0700\n#define GL_FEEDBACK_BUFFER_POINTER\t\t0x0DF0\n#define GL_FEEDBACK_BUFFER_SIZE\t\t\t0x0DF1\n#define GL_FEEDBACK_BUFFER_TYPE\t\t\t0x0DF2\n\n/* Selection */\n#define GL_SELECTION_BUFFER_POINTER\t\t0x0DF3\n#define GL_SELECTION_BUFFER_SIZE\t\t0x0DF4\n\n/* Fog */\n#define GL_FOG\t\t\t\t\t0x0B60\n#define GL_FOG_MODE\t\t\t\t0x0B65\n#define GL_FOG_DENSITY\t\t\t\t0x0B62\n#define GL_FOG_COLOR\t\t\t\t0x0B66\n#define GL_FOG_INDEX\t\t\t\t0x0B61\n#define GL_FOG_START\t\t\t\t0x0B63\n#define GL_FOG_END\t\t\t\t0x0B64\n#define GL_LINEAR\t\t\t\t0x2601\n#define GL_EXP\t\t\t\t\t0x0800\n#define GL_EXP2\t\t\t\t\t0x0801\n\n/* Logic Ops */\n#define GL_LOGIC_OP\t\t\t\t0x0BF1\n#define GL_INDEX_LOGIC_OP\t\t\t0x0BF1\n#define GL_COLOR_LOGIC_OP\t\t\t0x0BF2\n#define GL_LOGIC_OP_MODE\t\t\t0x0BF0\n#define GL_CLEAR\t\t\t\t0x1500\n#define GL_SET\t\t\t\t\t0x150F\n#define GL_COPY\t\t\t\t\t0x1503\n#define GL_COPY_INVERTED\t\t\t0x150C\n#define GL_NOOP\t\t\t\t\t0x1505\n#define GL_INVERT\t\t\t\t0x150A\n#define GL_AND\t\t\t\t\t0x1501\n#define GL_NAND\t\t\t\t\t0x150E\n#define GL_OR\t\t\t\t\t0x1507\n#define GL_NOR\t\t\t\t\t0x1508\n#define GL_XOR\t\t\t\t\t0x1506\n#define GL_EQUIV\t\t\t\t0x1509\n#define GL_AND_REVERSE\t\t\t\t0x1502\n#define GL_AND_INVERTED\t\t\t\t0x1504\n#define GL_OR_REVERSE\t\t\t\t0x150B\n#define GL_OR_INVERTED\t\t\t\t0x150D\n\n/* Stencil */\n#define GL_STENCIL_BITS\t\t\t\t0x0D57\n#define GL_STENCIL_TEST\t\t\t\t0x0B90\n#define GL_STENCIL_CLEAR_VALUE\t\t\t0x0B91\n#define GL_STENCIL_FUNC\t\t\t\t0x0B92\n#define GL_STENCIL_VALUE_MASK\t\t\t0x0B93\n#define GL_STENCIL_FAIL\t\t\t\t0x0B94\n#define GL_STENCIL_PASS_DEPTH_FAIL\t\t0x0B95\n#define GL_STENCIL_PASS_DEPTH_PASS\t\t0x0B96\n#define GL_STENCIL_REF\t\t\t\t0x0B97\n#define GL_STENCIL_WRITEMASK\t\t\t0x0B98\n#define GL_STENCIL_INDEX\t\t\t0x1901\n#define GL_KEEP\t\t\t\t\t0x1E00\n#define GL_REPLACE\t\t\t\t0x1E01\n#define GL_INCR\t\t\t\t\t0x1E02\n#define GL_DECR\t\t\t\t\t0x1E03\n\n/* Buffers, Pixel Drawing/Reading */\n#define GL_NONE\t\t\t\t\t0\n#define GL_LEFT\t\t\t\t\t0x0406\n#define GL_RIGHT\t\t\t\t0x0407\n/*GL_FRONT\t\t\t\t\t0x0404 */\n/*GL_BACK\t\t\t\t\t0x0405 */\n/*GL_FRONT_AND_BACK\t\t\t\t0x0408 */\n#define GL_FRONT_LEFT\t\t\t\t0x0400\n#define GL_FRONT_RIGHT\t\t\t\t0x0401\n#define GL_BACK_LEFT\t\t\t\t0x0402\n#define GL_BACK_RIGHT\t\t\t\t0x0403\n#define GL_AUX0\t\t\t\t\t0x0409\n#define GL_AUX1\t\t\t\t\t0x040A\n#define GL_AUX2\t\t\t\t\t0x040B\n#define GL_AUX3\t\t\t\t\t0x040C\n#define GL_COLOR_INDEX\t\t\t\t0x1900\n#define GL_RED\t\t\t\t\t0x1903\n#define GL_GREEN\t\t\t\t0x1904\n#define GL_BLUE\t\t\t\t\t0x1905\n#define GL_ALPHA\t\t\t\t0x1906\n#define GL_LUMINANCE\t\t\t\t0x1909\n#define GL_LUMINANCE_ALPHA\t\t\t0x190A\n#define GL_ALPHA_BITS\t\t\t\t0x0D55\n#define GL_RED_BITS\t\t\t\t0x0D52\n#define GL_GREEN_BITS\t\t\t\t0x0D53\n#define GL_BLUE_BITS\t\t\t\t0x0D54\n#define GL_INDEX_BITS\t\t\t\t0x0D51\n#define GL_SUBPIXEL_BITS\t\t\t0x0D50\n#define GL_AUX_BUFFERS\t\t\t\t0x0C00\n#define GL_READ_BUFFER\t\t\t\t0x0C02\n#define GL_DRAW_BUFFER\t\t\t\t0x0C01\n#define GL_DOUBLEBUFFER\t\t\t\t0x0C32\n#define GL_STEREO\t\t\t\t0x0C33\n#define GL_BITMAP\t\t\t\t0x1A00\n#define GL_COLOR\t\t\t\t0x1800\n#define GL_DEPTH\t\t\t\t0x1801\n#define GL_STENCIL\t\t\t\t0x1802\n#define GL_DITHER\t\t\t\t0x0BD0\n#define GL_RGB\t\t\t\t\t0x1907\n#define GL_RGBA\t\t\t\t\t0x1908\n\n/* Implementation limits */\n#define GL_MAX_LIST_NESTING\t\t\t0x0B31\n#define GL_MAX_EVAL_ORDER\t\t\t0x0D30\n#define GL_MAX_LIGHTS\t\t\t\t0x0D31\n#define GL_MAX_CLIP_PLANES\t\t\t0x0D32\n#define GL_MAX_TEXTURE_SIZE\t\t\t0x0D33\n#define GL_MAX_PIXEL_MAP_TABLE\t\t\t0x0D34\n#define GL_MAX_ATTRIB_STACK_DEPTH\t\t0x0D35\n#define GL_MAX_MODELVIEW_STACK_DEPTH\t\t0x0D36\n#define GL_MAX_NAME_STACK_DEPTH\t\t\t0x0D37\n#define GL_MAX_PROJECTION_STACK_DEPTH\t\t0x0D38\n#define GL_MAX_TEXTURE_STACK_DEPTH\t\t0x0D39\n#define GL_MAX_VIEWPORT_DIMS\t\t\t0x0D3A\n#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH\t0x0D3B\n\n/* Gets */\n#define GL_ATTRIB_STACK_DEPTH\t\t\t0x0BB0\n#define GL_CLIENT_ATTRIB_STACK_DEPTH\t\t0x0BB1\n#define GL_COLOR_CLEAR_VALUE\t\t\t0x0C22\n#define GL_COLOR_WRITEMASK\t\t\t0x0C23\n#define GL_CURRENT_INDEX\t\t\t0x0B01\n#define GL_CURRENT_COLOR\t\t\t0x0B00\n#define GL_CURRENT_NORMAL\t\t\t0x0B02\n#define GL_CURRENT_RASTER_COLOR\t\t\t0x0B04\n#define GL_CURRENT_RASTER_DISTANCE\t\t0x0B09\n#define GL_CURRENT_RASTER_INDEX\t\t\t0x0B05\n#define GL_CURRENT_RASTER_POSITION\t\t0x0B07\n#define GL_CURRENT_RASTER_TEXTURE_COORDS\t0x0B06\n#define GL_CURRENT_RASTER_POSITION_VALID\t0x0B08\n#define GL_CURRENT_TEXTURE_COORDS\t\t0x0B03\n#define GL_INDEX_CLEAR_VALUE\t\t\t0x0C20\n#define GL_INDEX_MODE\t\t\t\t0x0C30\n#define GL_INDEX_WRITEMASK\t\t\t0x0C21\n#define GL_MODELVIEW_MATRIX\t\t\t0x0BA6\n#define GL_MODELVIEW_STACK_DEPTH\t\t0x0BA3\n#define GL_NAME_STACK_DEPTH\t\t\t0x0D70\n#define GL_PROJECTION_MATRIX\t\t\t0x0BA7\n#define GL_PROJECTION_STACK_DEPTH\t\t0x0BA4\n#define GL_RENDER_MODE\t\t\t\t0x0C40\n#define GL_RGBA_MODE\t\t\t\t0x0C31\n#define GL_TEXTURE_MATRIX\t\t\t0x0BA8\n#define GL_TEXTURE_STACK_DEPTH\t\t\t0x0BA5\n#define GL_VIEWPORT\t\t\t\t0x0BA2\n\n/* Evaluators */\n#define GL_AUTO_NORMAL\t\t\t\t0x0D80\n#define GL_MAP1_COLOR_4\t\t\t\t0x0D90\n#define GL_MAP1_INDEX\t\t\t\t0x0D91\n#define GL_MAP1_NORMAL\t\t\t\t0x0D92\n#define GL_MAP1_TEXTURE_COORD_1\t\t\t0x0D93\n#define GL_MAP1_TEXTURE_COORD_2\t\t\t0x0D94\n#define GL_MAP1_TEXTURE_COORD_3\t\t\t0x0D95\n#define GL_MAP1_TEXTURE_COORD_4\t\t\t0x0D96\n#define GL_MAP1_VERTEX_3\t\t\t0x0D97\n#define GL_MAP1_VERTEX_4\t\t\t0x0D98\n#define GL_MAP2_COLOR_4\t\t\t\t0x0DB0\n#define GL_MAP2_INDEX\t\t\t\t0x0DB1\n#define GL_MAP2_NORMAL\t\t\t\t0x0DB2\n#define GL_MAP2_TEXTURE_COORD_1\t\t\t0x0DB3\n#define GL_MAP2_TEXTURE_COORD_2\t\t\t0x0DB4\n#define GL_MAP2_TEXTURE_COORD_3\t\t\t0x0DB5\n#define GL_MAP2_TEXTURE_COORD_4\t\t\t0x0DB6\n#define GL_MAP2_VERTEX_3\t\t\t0x0DB7\n#define GL_MAP2_VERTEX_4\t\t\t0x0DB8\n#define GL_MAP1_GRID_DOMAIN\t\t\t0x0DD0\n#define GL_MAP1_GRID_SEGMENTS\t\t\t0x0DD1\n#define GL_MAP2_GRID_DOMAIN\t\t\t0x0DD2\n#define GL_MAP2_GRID_SEGMENTS\t\t\t0x0DD3\n#define GL_COEFF\t\t\t\t0x0A00\n#define GL_ORDER\t\t\t\t0x0A01\n#define GL_DOMAIN\t\t\t\t0x0A02\n\n/* Hints */\n#define GL_PERSPECTIVE_CORRECTION_HINT\t\t0x0C50\n#define GL_POINT_SMOOTH_HINT\t\t\t0x0C51\n#define GL_LINE_SMOOTH_HINT\t\t\t0x0C52\n#define GL_POLYGON_SMOOTH_HINT\t\t\t0x0C53\n#define GL_FOG_HINT\t\t\t\t0x0C54\n#define GL_DONT_CARE\t\t\t\t0x1100\n#define GL_FASTEST\t\t\t\t0x1101\n#define GL_NICEST\t\t\t\t0x1102\n\n/* Scissor box */\n#define GL_SCISSOR_BOX\t\t\t\t0x0C10\n#define GL_SCISSOR_TEST\t\t\t\t0x0C11\n\n/* Pixel Mode / Transfer */\n#define GL_MAP_COLOR\t\t\t\t0x0D10\n#define GL_MAP_STENCIL\t\t\t\t0x0D11\n#define GL_INDEX_SHIFT\t\t\t\t0x0D12\n#define GL_INDEX_OFFSET\t\t\t\t0x0D13\n#define GL_RED_SCALE\t\t\t\t0x0D14\n#define GL_RED_BIAS\t\t\t\t0x0D15\n#define GL_GREEN_SCALE\t\t\t\t0x0D18\n#define GL_GREEN_BIAS\t\t\t\t0x0D19\n#define GL_BLUE_SCALE\t\t\t\t0x0D1A\n#define GL_BLUE_BIAS\t\t\t\t0x0D1B\n#define GL_ALPHA_SCALE\t\t\t\t0x0D1C\n#define GL_ALPHA_BIAS\t\t\t\t0x0D1D\n#define GL_DEPTH_SCALE\t\t\t\t0x0D1E\n#define GL_DEPTH_BIAS\t\t\t\t0x0D1F\n#define GL_PIXEL_MAP_S_TO_S_SIZE\t\t0x0CB1\n#define GL_PIXEL_MAP_I_TO_I_SIZE\t\t0x0CB0\n#define GL_PIXEL_MAP_I_TO_R_SIZE\t\t0x0CB2\n#define GL_PIXEL_MAP_I_TO_G_SIZE\t\t0x0CB3\n#define GL_PIXEL_MAP_I_TO_B_SIZE\t\t0x0CB4\n#define GL_PIXEL_MAP_I_TO_A_SIZE\t\t0x0CB5\n#define GL_PIXEL_MAP_R_TO_R_SIZE\t\t0x0CB6\n#define GL_PIXEL_MAP_G_TO_G_SIZE\t\t0x0CB7\n#define GL_PIXEL_MAP_B_TO_B_SIZE\t\t0x0CB8\n#define GL_PIXEL_MAP_A_TO_A_SIZE\t\t0x0CB9\n#define GL_PIXEL_MAP_S_TO_S\t\t\t0x0C71\n#define GL_PIXEL_MAP_I_TO_I\t\t\t0x0C70\n#define GL_PIXEL_MAP_I_TO_R\t\t\t0x0C72\n#define GL_PIXEL_MAP_I_TO_G\t\t\t0x0C73\n#define GL_PIXEL_MAP_I_TO_B\t\t\t0x0C74\n#define GL_PIXEL_MAP_I_TO_A\t\t\t0x0C75\n#define GL_PIXEL_MAP_R_TO_R\t\t\t0x0C76\n#define GL_PIXEL_MAP_G_TO_G\t\t\t0x0C77\n#define GL_PIXEL_MAP_B_TO_B\t\t\t0x0C78\n#define GL_PIXEL_MAP_A_TO_A\t\t\t0x0C79\n#define GL_PACK_ALIGNMENT\t\t\t0x0D05\n#define GL_PACK_LSB_FIRST\t\t\t0x0D01\n#define GL_PACK_ROW_LENGTH\t\t\t0x0D02\n#define GL_PACK_SKIP_PIXELS\t\t\t0x0D04\n#define GL_PACK_SKIP_ROWS\t\t\t0x0D03\n#define GL_PACK_SWAP_BYTES\t\t\t0x0D00\n#define GL_UNPACK_ALIGNMENT\t\t\t0x0CF5\n#define GL_UNPACK_LSB_FIRST\t\t\t0x0CF1\n#define GL_UNPACK_ROW_LENGTH\t\t\t0x0CF2\n#define GL_UNPACK_SKIP_PIXELS\t\t\t0x0CF4\n#define GL_UNPACK_SKIP_ROWS\t\t\t0x0CF3\n#define GL_UNPACK_SWAP_BYTES\t\t\t0x0CF0\n#define GL_ZOOM_X\t\t\t\t0x0D16\n#define GL_ZOOM_Y\t\t\t\t0x0D17\n\n/* Texture mapping */\n#define GL_TEXTURE_ENV\t\t\t\t0x2300\n#define GL_TEXTURE_ENV_MODE\t\t\t0x2200\n#define GL_TEXTURE_1D\t\t\t\t0x0DE0\n#define GL_TEXTURE_2D\t\t\t\t0x0DE1\n#define GL_TEXTURE_WRAP_S\t\t\t0x2802\n#define GL_TEXTURE_WRAP_T\t\t\t0x2803\n#define GL_TEXTURE_MAG_FILTER\t\t\t0x2800\n#define GL_TEXTURE_MIN_FILTER\t\t\t0x2801\n#define GL_TEXTURE_ENV_COLOR\t\t\t0x2201\n#define GL_TEXTURE_GEN_S\t\t\t0x0C60\n#define GL_TEXTURE_GEN_T\t\t\t0x0C61\n#define GL_TEXTURE_GEN_R\t\t\t0x0C62\n#define GL_TEXTURE_GEN_Q\t\t\t0x0C63\n#define GL_TEXTURE_GEN_MODE\t\t\t0x2500\n#define GL_TEXTURE_BORDER_COLOR\t\t\t0x1004\n#define GL_TEXTURE_WIDTH\t\t\t0x1000\n#define GL_TEXTURE_HEIGHT\t\t\t0x1001\n#define GL_TEXTURE_BORDER\t\t\t0x1005\n#define GL_TEXTURE_COMPONENTS\t\t\t0x1003\n#define GL_TEXTURE_RED_SIZE\t\t\t0x805C\n#define GL_TEXTURE_GREEN_SIZE\t\t\t0x805D\n#define GL_TEXTURE_BLUE_SIZE\t\t\t0x805E\n#define GL_TEXTURE_ALPHA_SIZE\t\t\t0x805F\n#define GL_TEXTURE_LUMINANCE_SIZE\t\t0x8060\n#define GL_TEXTURE_INTENSITY_SIZE\t\t0x8061\n#define GL_NEAREST_MIPMAP_NEAREST\t\t0x2700\n#define GL_NEAREST_MIPMAP_LINEAR\t\t0x2702\n#define GL_LINEAR_MIPMAP_NEAREST\t\t0x2701\n#define GL_LINEAR_MIPMAP_LINEAR\t\t\t0x2703\n#define GL_OBJECT_LINEAR\t\t\t0x2401\n#define GL_OBJECT_PLANE\t\t\t\t0x2501\n#define GL_EYE_LINEAR\t\t\t\t0x2400\n#define GL_EYE_PLANE\t\t\t\t0x2502\n#define GL_SPHERE_MAP\t\t\t\t0x2402\n#define GL_DECAL\t\t\t\t0x2101\n#define GL_MODULATE\t\t\t\t0x2100\n#define GL_NEAREST\t\t\t\t0x2600\n#define GL_REPEAT\t\t\t\t0x2901\n#define GL_CLAMP\t\t\t\t0x2900\n#define GL_S\t\t\t\t\t0x2000\n#define GL_T\t\t\t\t\t0x2001\n#define GL_R\t\t\t\t\t0x2002\n#define GL_Q\t\t\t\t\t0x2003\n\n/* Utility */\n#define GL_VENDOR\t\t\t\t0x1F00\n#define GL_RENDERER\t\t\t\t0x1F01\n#define GL_VERSION\t\t\t\t0x1F02\n#define GL_EXTENSIONS\t\t\t\t0x1F03\n\n/* Errors */\n#define GL_NO_ERROR \t\t\t\t0\n#define GL_INVALID_ENUM\t\t\t\t0x0500\n#define GL_INVALID_VALUE\t\t\t0x0501\n#define GL_INVALID_OPERATION\t\t\t0x0502\n#define GL_STACK_OVERFLOW\t\t\t0x0503\n#define GL_STACK_UNDERFLOW\t\t\t0x0504\n#define GL_OUT_OF_MEMORY\t\t\t0x0505\n\n/* glPush/PopAttrib bits */\n#define GL_CURRENT_BIT\t\t\t\t0x00000001\n#define GL_POINT_BIT\t\t\t\t0x00000002\n#define GL_LINE_BIT\t\t\t\t0x00000004\n#define GL_POLYGON_BIT\t\t\t\t0x00000008\n#define GL_POLYGON_STIPPLE_BIT\t\t\t0x00000010\n#define GL_PIXEL_MODE_BIT\t\t\t0x00000020\n#define GL_LIGHTING_BIT\t\t\t\t0x00000040\n#define GL_FOG_BIT\t\t\t\t0x00000080\n#define GL_DEPTH_BUFFER_BIT\t\t\t0x00000100\n#define GL_ACCUM_BUFFER_BIT\t\t\t0x00000200\n#define GL_STENCIL_BUFFER_BIT\t\t\t0x00000400\n#define GL_VIEWPORT_BIT\t\t\t\t0x00000800\n#define GL_TRANSFORM_BIT\t\t\t0x00001000\n#define GL_ENABLE_BIT\t\t\t\t0x00002000\n#define GL_COLOR_BUFFER_BIT\t\t\t0x00004000\n#define GL_HINT_BIT\t\t\t\t0x00008000\n#define GL_EVAL_BIT\t\t\t\t0x00010000\n#define GL_LIST_BIT\t\t\t\t0x00020000\n#define GL_TEXTURE_BIT\t\t\t\t0x00040000\n#define GL_SCISSOR_BIT\t\t\t\t0x00080000\n#define GL_ALL_ATTRIB_BITS\t\t\t0x000FFFFF\n\n\n/* OpenGL 1.1 */\n#define GL_PROXY_TEXTURE_1D\t\t\t0x8063\n#define GL_PROXY_TEXTURE_2D\t\t\t0x8064\n#define GL_TEXTURE_PRIORITY\t\t\t0x8066\n#define GL_TEXTURE_RESIDENT\t\t\t0x8067\n#define GL_TEXTURE_BINDING_1D\t\t\t0x8068\n#define GL_TEXTURE_BINDING_2D\t\t\t0x8069\n#define GL_TEXTURE_INTERNAL_FORMAT\t\t0x1003\n#define GL_ALPHA4\t\t\t\t0x803B\n#define GL_ALPHA8\t\t\t\t0x803C\n#define GL_ALPHA12\t\t\t\t0x803D\n#define GL_ALPHA16\t\t\t\t0x803E\n#define GL_LUMINANCE4\t\t\t\t0x803F\n#define GL_LUMINANCE8\t\t\t\t0x8040\n#define GL_LUMINANCE12\t\t\t\t0x8041\n#define GL_LUMINANCE16\t\t\t\t0x8042\n#define GL_LUMINANCE4_ALPHA4\t\t\t0x8043\n#define GL_LUMINANCE6_ALPHA2\t\t\t0x8044\n#define GL_LUMINANCE8_ALPHA8\t\t\t0x8045\n#define GL_LUMINANCE12_ALPHA4\t\t\t0x8046\n#define GL_LUMINANCE12_ALPHA12\t\t\t0x8047\n#define GL_LUMINANCE16_ALPHA16\t\t\t0x8048\n#define GL_INTENSITY\t\t\t\t0x8049\n#define GL_INTENSITY4\t\t\t\t0x804A\n#define GL_INTENSITY8\t\t\t\t0x804B\n#define GL_INTENSITY12\t\t\t\t0x804C\n#define GL_INTENSITY16\t\t\t\t0x804D\n#define GL_R3_G3_B2\t\t\t\t0x2A10\n#define GL_RGB4\t\t\t\t\t0x804F\n#define GL_RGB5\t\t\t\t\t0x8050\n#define GL_RGB8\t\t\t\t\t0x8051\n#define GL_RGB10\t\t\t\t0x8052\n#define GL_RGB12\t\t\t\t0x8053\n#define GL_RGB16\t\t\t\t0x8054\n#define GL_RGBA2\t\t\t\t0x8055\n#define GL_RGBA4\t\t\t\t0x8056\n#define GL_RGB5_A1\t\t\t\t0x8057\n#define GL_RGBA8\t\t\t\t0x8058\n#define GL_RGB10_A2\t\t\t\t0x8059\n#define GL_RGBA12\t\t\t\t0x805A\n#define GL_RGBA16\t\t\t\t0x805B\n#define GL_CLIENT_PIXEL_STORE_BIT\t\t0x00000001\n#define GL_CLIENT_VERTEX_ARRAY_BIT\t\t0x00000002\n#define GL_ALL_CLIENT_ATTRIB_BITS \t\t0xFFFFFFFF\n#define GL_CLIENT_ALL_ATTRIB_BITS \t\t0xFFFFFFFF\n\n\n\n/*\n * Miscellaneous\n */\n\nGLAPI void GLAPIENTRY glClearIndex( GLfloat c );\n\nGLAPI void GLAPIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha );\n\nGLAPI void GLAPIENTRY glClear( GLbitfield mask );\n\nGLAPI void GLAPIENTRY glIndexMask( GLuint mask );\n\nGLAPI void GLAPIENTRY glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha );\n\nGLAPI void GLAPIENTRY glAlphaFunc( GLenum func, GLclampf ref );\n\nGLAPI void GLAPIENTRY glBlendFunc( GLenum sfactor, GLenum dfactor );\n\nGLAPI void GLAPIENTRY glLogicOp( GLenum opcode );\n\nGLAPI void GLAPIENTRY glCullFace( GLenum mode );\n\nGLAPI void GLAPIENTRY glFrontFace( GLenum mode );\n\nGLAPI void GLAPIENTRY glPointSize( GLfloat size );\n\nGLAPI void GLAPIENTRY glLineWidth( GLfloat width );\n\nGLAPI void GLAPIENTRY glLineStipple( GLint factor, GLushort pattern );\n\nGLAPI void GLAPIENTRY glPolygonMode( GLenum face, GLenum mode );\n\nGLAPI void GLAPIENTRY glPolygonOffset( GLfloat factor, GLfloat units );\n\nGLAPI void GLAPIENTRY glPolygonStipple( const GLubyte *mask );\n\nGLAPI void GLAPIENTRY glGetPolygonStipple( GLubyte *mask );\n\nGLAPI void GLAPIENTRY glEdgeFlag( GLboolean flag );\n\nGLAPI void GLAPIENTRY glEdgeFlagv( const GLboolean *flag );\n\nGLAPI void GLAPIENTRY glScissor( GLint x, GLint y, GLsizei width, GLsizei height);\n\nGLAPI void GLAPIENTRY glClipPlane( GLenum plane, const GLdouble *equation );\n\nGLAPI void GLAPIENTRY glGetClipPlane( GLenum plane, GLdouble *equation );\n\nGLAPI void GLAPIENTRY glDrawBuffer( GLenum mode );\n\nGLAPI void GLAPIENTRY glReadBuffer( GLenum mode );\n\nGLAPI void GLAPIENTRY glEnable( GLenum cap );\n\nGLAPI void GLAPIENTRY glDisable( GLenum cap );\n\nGLAPI GLboolean GLAPIENTRY glIsEnabled( GLenum cap );\n\n\nGLAPI void GLAPIENTRY glEnableClientState( GLenum cap );  /* 1.1 */\n\nGLAPI void GLAPIENTRY glDisableClientState( GLenum cap );  /* 1.1 */\n\n\nGLAPI void GLAPIENTRY glGetBooleanv( GLenum pname, GLboolean *params );\n\nGLAPI void GLAPIENTRY glGetDoublev( GLenum pname, GLdouble *params );\n\nGLAPI void GLAPIENTRY glGetFloatv( GLenum pname, GLfloat *params );\n\nGLAPI void GLAPIENTRY glGetIntegerv( GLenum pname, GLint *params );\n\n\nGLAPI void GLAPIENTRY glPushAttrib( GLbitfield mask );\n\nGLAPI void GLAPIENTRY glPopAttrib( void );\n\n\nGLAPI void GLAPIENTRY glPushClientAttrib( GLbitfield mask );  /* 1.1 */\n\nGLAPI void GLAPIENTRY glPopClientAttrib( void );  /* 1.1 */\n\n\nGLAPI GLint GLAPIENTRY glRenderMode( GLenum mode );\n\nGLAPI GLenum GLAPIENTRY glGetError( void );\n\nGLAPI const GLubyte * GLAPIENTRY glGetString( GLenum name );\n\nGLAPI void GLAPIENTRY glFinish( void );\n\nGLAPI void GLAPIENTRY glFlush( void );\n\nGLAPI void GLAPIENTRY glHint( GLenum target, GLenum mode );\n\n\n/*\n * Depth Buffer\n */\n\nGLAPI void GLAPIENTRY glClearDepth( GLclampd depth );\n\nGLAPI void GLAPIENTRY glDepthFunc( GLenum func );\n\nGLAPI void GLAPIENTRY glDepthMask( GLboolean flag );\n\nGLAPI void GLAPIENTRY glDepthRange( GLclampd near_val, GLclampd far_val );\n\n\n/*\n * Accumulation Buffer\n */\n\nGLAPI void GLAPIENTRY glClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha );\n\nGLAPI void GLAPIENTRY glAccum( GLenum op, GLfloat value );\n\n\n/*\n * Transformation\n */\n\nGLAPI void GLAPIENTRY glMatrixMode( GLenum mode );\n\nGLAPI void GLAPIENTRY glOrtho( GLdouble left, GLdouble right,\n                                 GLdouble bottom, GLdouble top,\n                                 GLdouble near_val, GLdouble far_val );\n\nGLAPI void GLAPIENTRY glFrustum( GLdouble left, GLdouble right,\n                                   GLdouble bottom, GLdouble top,\n                                   GLdouble near_val, GLdouble far_val );\n\nGLAPI void GLAPIENTRY glViewport( GLint x, GLint y,\n                                    GLsizei width, GLsizei height );\n\nGLAPI void GLAPIENTRY glPushMatrix( void );\n\nGLAPI void GLAPIENTRY glPopMatrix( void );\n\nGLAPI void GLAPIENTRY glLoadIdentity( void );\n\nGLAPI void GLAPIENTRY glLoadMatrixd( const GLdouble *m );\nGLAPI void GLAPIENTRY glLoadMatrixf( const GLfloat *m );\n\nGLAPI void GLAPIENTRY glMultMatrixd( const GLdouble *m );\nGLAPI void GLAPIENTRY glMultMatrixf( const GLfloat *m );\n\nGLAPI void GLAPIENTRY glRotated( GLdouble angle,\n                                   GLdouble x, GLdouble y, GLdouble z );\nGLAPI void GLAPIENTRY glRotatef( GLfloat angle,\n                                   GLfloat x, GLfloat y, GLfloat z );\n\nGLAPI void GLAPIENTRY glScaled( GLdouble x, GLdouble y, GLdouble z );\nGLAPI void GLAPIENTRY glScalef( GLfloat x, GLfloat y, GLfloat z );\n\nGLAPI void GLAPIENTRY glTranslated( GLdouble x, GLdouble y, GLdouble z );\nGLAPI void GLAPIENTRY glTranslatef( GLfloat x, GLfloat y, GLfloat z );\n\n\n/*\n * Display Lists\n */\n\nGLAPI GLboolean GLAPIENTRY glIsList( GLuint list );\n\nGLAPI void GLAPIENTRY glDeleteLists( GLuint list, GLsizei range );\n\nGLAPI GLuint GLAPIENTRY glGenLists( GLsizei range );\n\nGLAPI void GLAPIENTRY glNewList( GLuint list, GLenum mode );\n\nGLAPI void GLAPIENTRY glEndList( void );\n\nGLAPI void GLAPIENTRY glCallList( GLuint list );\n\nGLAPI void GLAPIENTRY glCallLists( GLsizei n, GLenum type,\n                                     const GLvoid *lists );\n\nGLAPI void GLAPIENTRY glListBase( GLuint base );\n\n\n/*\n * Drawing Functions\n */\n\nGLAPI void GLAPIENTRY glBegin( GLenum mode );\n\nGLAPI void GLAPIENTRY glEnd( void );\n\n\nGLAPI void GLAPIENTRY glVertex2d( GLdouble x, GLdouble y );\nGLAPI void GLAPIENTRY glVertex2f( GLfloat x, GLfloat y );\nGLAPI void GLAPIENTRY glVertex2i( GLint x, GLint y );\nGLAPI void GLAPIENTRY glVertex2s( GLshort x, GLshort y );\n\nGLAPI void GLAPIENTRY glVertex3d( GLdouble x, GLdouble y, GLdouble z );\nGLAPI void GLAPIENTRY glVertex3f( GLfloat x, GLfloat y, GLfloat z );\nGLAPI void GLAPIENTRY glVertex3i( GLint x, GLint y, GLint z );\nGLAPI void GLAPIENTRY glVertex3s( GLshort x, GLshort y, GLshort z );\n\nGLAPI void GLAPIENTRY glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w );\nGLAPI void GLAPIENTRY glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w );\nGLAPI void GLAPIENTRY glVertex4i( GLint x, GLint y, GLint z, GLint w );\nGLAPI void GLAPIENTRY glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w );\n\nGLAPI void GLAPIENTRY glVertex2dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glVertex2fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glVertex2iv( const GLint *v );\nGLAPI void GLAPIENTRY glVertex2sv( const GLshort *v );\n\nGLAPI void GLAPIENTRY glVertex3dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glVertex3fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glVertex3iv( const GLint *v );\nGLAPI void GLAPIENTRY glVertex3sv( const GLshort *v );\n\nGLAPI void GLAPIENTRY glVertex4dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glVertex4fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glVertex4iv( const GLint *v );\nGLAPI void GLAPIENTRY glVertex4sv( const GLshort *v );\n\n\nGLAPI void GLAPIENTRY glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz );\nGLAPI void GLAPIENTRY glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz );\nGLAPI void GLAPIENTRY glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz );\nGLAPI void GLAPIENTRY glNormal3i( GLint nx, GLint ny, GLint nz );\nGLAPI void GLAPIENTRY glNormal3s( GLshort nx, GLshort ny, GLshort nz );\n\nGLAPI void GLAPIENTRY glNormal3bv( const GLbyte *v );\nGLAPI void GLAPIENTRY glNormal3dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glNormal3fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glNormal3iv( const GLint *v );\nGLAPI void GLAPIENTRY glNormal3sv( const GLshort *v );\n\n\nGLAPI void GLAPIENTRY glIndexd( GLdouble c );\nGLAPI void GLAPIENTRY glIndexf( GLfloat c );\nGLAPI void GLAPIENTRY glIndexi( GLint c );\nGLAPI void GLAPIENTRY glIndexs( GLshort c );\nGLAPI void GLAPIENTRY glIndexub( GLubyte c );  /* 1.1 */\n\nGLAPI void GLAPIENTRY glIndexdv( const GLdouble *c );\nGLAPI void GLAPIENTRY glIndexfv( const GLfloat *c );\nGLAPI void GLAPIENTRY glIndexiv( const GLint *c );\nGLAPI void GLAPIENTRY glIndexsv( const GLshort *c );\nGLAPI void GLAPIENTRY glIndexubv( const GLubyte *c );  /* 1.1 */\n\nGLAPI void GLAPIENTRY glColor3b( GLbyte red, GLbyte green, GLbyte blue );\nGLAPI void GLAPIENTRY glColor3d( GLdouble red, GLdouble green, GLdouble blue );\nGLAPI void GLAPIENTRY glColor3f( GLfloat red, GLfloat green, GLfloat blue );\nGLAPI void GLAPIENTRY glColor3i( GLint red, GLint green, GLint blue );\nGLAPI void GLAPIENTRY glColor3s( GLshort red, GLshort green, GLshort blue );\nGLAPI void GLAPIENTRY glColor3ub( GLubyte red, GLubyte green, GLubyte blue );\nGLAPI void GLAPIENTRY glColor3ui( GLuint red, GLuint green, GLuint blue );\nGLAPI void GLAPIENTRY glColor3us( GLushort red, GLushort green, GLushort blue );\n\nGLAPI void GLAPIENTRY glColor4b( GLbyte red, GLbyte green,\n                                   GLbyte blue, GLbyte alpha );\nGLAPI void GLAPIENTRY glColor4d( GLdouble red, GLdouble green,\n                                   GLdouble blue, GLdouble alpha );\nGLAPI void GLAPIENTRY glColor4f( GLfloat red, GLfloat green,\n                                   GLfloat blue, GLfloat alpha );\nGLAPI void GLAPIENTRY glColor4i( GLint red, GLint green,\n                                   GLint blue, GLint alpha );\nGLAPI void GLAPIENTRY glColor4s( GLshort red, GLshort green,\n                                   GLshort blue, GLshort alpha );\nGLAPI void GLAPIENTRY glColor4ub( GLubyte red, GLubyte green,\n                                    GLubyte blue, GLubyte alpha );\nGLAPI void GLAPIENTRY glColor4ui( GLuint red, GLuint green,\n                                    GLuint blue, GLuint alpha );\nGLAPI void GLAPIENTRY glColor4us( GLushort red, GLushort green,\n                                    GLushort blue, GLushort alpha );\n\n\nGLAPI void GLAPIENTRY glColor3bv( const GLbyte *v );\nGLAPI void GLAPIENTRY glColor3dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glColor3fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glColor3iv( const GLint *v );\nGLAPI void GLAPIENTRY glColor3sv( const GLshort *v );\nGLAPI void GLAPIENTRY glColor3ubv( const GLubyte *v );\nGLAPI void GLAPIENTRY glColor3uiv( const GLuint *v );\nGLAPI void GLAPIENTRY glColor3usv( const GLushort *v );\n\nGLAPI void GLAPIENTRY glColor4bv( const GLbyte *v );\nGLAPI void GLAPIENTRY glColor4dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glColor4fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glColor4iv( const GLint *v );\nGLAPI void GLAPIENTRY glColor4sv( const GLshort *v );\nGLAPI void GLAPIENTRY glColor4ubv( const GLubyte *v );\nGLAPI void GLAPIENTRY glColor4uiv( const GLuint *v );\nGLAPI void GLAPIENTRY glColor4usv( const GLushort *v );\n\n\nGLAPI void GLAPIENTRY glTexCoord1d( GLdouble s );\nGLAPI void GLAPIENTRY glTexCoord1f( GLfloat s );\nGLAPI void GLAPIENTRY glTexCoord1i( GLint s );\nGLAPI void GLAPIENTRY glTexCoord1s( GLshort s );\n\nGLAPI void GLAPIENTRY glTexCoord2d( GLdouble s, GLdouble t );\nGLAPI void GLAPIENTRY glTexCoord2f( GLfloat s, GLfloat t );\nGLAPI void GLAPIENTRY glTexCoord2i( GLint s, GLint t );\nGLAPI void GLAPIENTRY glTexCoord2s( GLshort s, GLshort t );\n\nGLAPI void GLAPIENTRY glTexCoord3d( GLdouble s, GLdouble t, GLdouble r );\nGLAPI void GLAPIENTRY glTexCoord3f( GLfloat s, GLfloat t, GLfloat r );\nGLAPI void GLAPIENTRY glTexCoord3i( GLint s, GLint t, GLint r );\nGLAPI void GLAPIENTRY glTexCoord3s( GLshort s, GLshort t, GLshort r );\n\nGLAPI void GLAPIENTRY glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q );\nGLAPI void GLAPIENTRY glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q );\nGLAPI void GLAPIENTRY glTexCoord4i( GLint s, GLint t, GLint r, GLint q );\nGLAPI void GLAPIENTRY glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q );\n\nGLAPI void GLAPIENTRY glTexCoord1dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glTexCoord1fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glTexCoord1iv( const GLint *v );\nGLAPI void GLAPIENTRY glTexCoord1sv( const GLshort *v );\n\nGLAPI void GLAPIENTRY glTexCoord2dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glTexCoord2fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glTexCoord2iv( const GLint *v );\nGLAPI void GLAPIENTRY glTexCoord2sv( const GLshort *v );\n\nGLAPI void GLAPIENTRY glTexCoord3dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glTexCoord3fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glTexCoord3iv( const GLint *v );\nGLAPI void GLAPIENTRY glTexCoord3sv( const GLshort *v );\n\nGLAPI void GLAPIENTRY glTexCoord4dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glTexCoord4fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glTexCoord4iv( const GLint *v );\nGLAPI void GLAPIENTRY glTexCoord4sv( const GLshort *v );\n\n\nGLAPI void GLAPIENTRY glRasterPos2d( GLdouble x, GLdouble y );\nGLAPI void GLAPIENTRY glRasterPos2f( GLfloat x, GLfloat y );\nGLAPI void GLAPIENTRY glRasterPos2i( GLint x, GLint y );\nGLAPI void GLAPIENTRY glRasterPos2s( GLshort x, GLshort y );\n\nGLAPI void GLAPIENTRY glRasterPos3d( GLdouble x, GLdouble y, GLdouble z );\nGLAPI void GLAPIENTRY glRasterPos3f( GLfloat x, GLfloat y, GLfloat z );\nGLAPI void GLAPIENTRY glRasterPos3i( GLint x, GLint y, GLint z );\nGLAPI void GLAPIENTRY glRasterPos3s( GLshort x, GLshort y, GLshort z );\n\nGLAPI void GLAPIENTRY glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w );\nGLAPI void GLAPIENTRY glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w );\nGLAPI void GLAPIENTRY glRasterPos4i( GLint x, GLint y, GLint z, GLint w );\nGLAPI void GLAPIENTRY glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w );\n\nGLAPI void GLAPIENTRY glRasterPos2dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glRasterPos2fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glRasterPos2iv( const GLint *v );\nGLAPI void GLAPIENTRY glRasterPos2sv( const GLshort *v );\n\nGLAPI void GLAPIENTRY glRasterPos3dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glRasterPos3fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glRasterPos3iv( const GLint *v );\nGLAPI void GLAPIENTRY glRasterPos3sv( const GLshort *v );\n\nGLAPI void GLAPIENTRY glRasterPos4dv( const GLdouble *v );\nGLAPI void GLAPIENTRY glRasterPos4fv( const GLfloat *v );\nGLAPI void GLAPIENTRY glRasterPos4iv( const GLint *v );\nGLAPI void GLAPIENTRY glRasterPos4sv( const GLshort *v );\n\n\nGLAPI void GLAPIENTRY glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 );\nGLAPI void GLAPIENTRY glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 );\nGLAPI void GLAPIENTRY glRecti( GLint x1, GLint y1, GLint x2, GLint y2 );\nGLAPI void GLAPIENTRY glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 );\n\n\nGLAPI void GLAPIENTRY glRectdv( const GLdouble *v1, const GLdouble *v2 );\nGLAPI void GLAPIENTRY glRectfv( const GLfloat *v1, const GLfloat *v2 );\nGLAPI void GLAPIENTRY glRectiv( const GLint *v1, const GLint *v2 );\nGLAPI void GLAPIENTRY glRectsv( const GLshort *v1, const GLshort *v2 );\n\n\n/*\n * Vertex Arrays  (1.1)\n */\n\nGLAPI void GLAPIENTRY glVertexPointer( GLint size, GLenum type,\n                                       GLsizei stride, const GLvoid *ptr );\n\nGLAPI void GLAPIENTRY glNormalPointer( GLenum type, GLsizei stride,\n                                       const GLvoid *ptr );\n\nGLAPI void GLAPIENTRY glColorPointer( GLint size, GLenum type,\n                                      GLsizei stride, const GLvoid *ptr );\n\nGLAPI void GLAPIENTRY glIndexPointer( GLenum type, GLsizei stride,\n                                      const GLvoid *ptr );\n\nGLAPI void GLAPIENTRY glTexCoordPointer( GLint size, GLenum type,\n                                         GLsizei stride, const GLvoid *ptr );\n\nGLAPI void GLAPIENTRY glEdgeFlagPointer( GLsizei stride, const GLvoid *ptr );\n\nGLAPI void GLAPIENTRY glGetPointerv( GLenum pname, GLvoid **params );\n\nGLAPI void GLAPIENTRY glArrayElement( GLint i );\n\nGLAPI void GLAPIENTRY glDrawArrays( GLenum mode, GLint first, GLsizei count );\n\nGLAPI void GLAPIENTRY glDrawElements( GLenum mode, GLsizei count,\n                                      GLenum type, const GLvoid *indices );\n\nGLAPI void GLAPIENTRY glInterleavedArrays( GLenum format, GLsizei stride,\n                                           const GLvoid *pointer );\n\n/*\n * Lighting\n */\n\nGLAPI void GLAPIENTRY glShadeModel( GLenum mode );\n\nGLAPI void GLAPIENTRY glLightf( GLenum light, GLenum pname, GLfloat param );\nGLAPI void GLAPIENTRY glLighti( GLenum light, GLenum pname, GLint param );\nGLAPI void GLAPIENTRY glLightfv( GLenum light, GLenum pname,\n                                 const GLfloat *params );\nGLAPI void GLAPIENTRY glLightiv( GLenum light, GLenum pname,\n                                 const GLint *params );\n\nGLAPI void GLAPIENTRY glGetLightfv( GLenum light, GLenum pname,\n                                    GLfloat *params );\nGLAPI void GLAPIENTRY glGetLightiv( GLenum light, GLenum pname,\n                                    GLint *params );\n\nGLAPI void GLAPIENTRY glLightModelf( GLenum pname, GLfloat param );\nGLAPI void GLAPIENTRY glLightModeli( GLenum pname, GLint param );\nGLAPI void GLAPIENTRY glLightModelfv( GLenum pname, const GLfloat *params );\nGLAPI void GLAPIENTRY glLightModeliv( GLenum pname, const GLint *params );\n\nGLAPI void GLAPIENTRY glMaterialf( GLenum face, GLenum pname, GLfloat param );\nGLAPI void GLAPIENTRY glMateriali( GLenum face, GLenum pname, GLint param );\nGLAPI void GLAPIENTRY glMaterialfv( GLenum face, GLenum pname, const GLfloat *params );\nGLAPI void GLAPIENTRY glMaterialiv( GLenum face, GLenum pname, const GLint *params );\n\nGLAPI void GLAPIENTRY glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params );\nGLAPI void GLAPIENTRY glGetMaterialiv( GLenum face, GLenum pname, GLint *params );\n\nGLAPI void GLAPIENTRY glColorMaterial( GLenum face, GLenum mode );\n\n\n/*\n * Raster functions\n */\n\nGLAPI void GLAPIENTRY glPixelZoom( GLfloat xfactor, GLfloat yfactor );\n\nGLAPI void GLAPIENTRY glPixelStoref( GLenum pname, GLfloat param );\nGLAPI void GLAPIENTRY glPixelStorei( GLenum pname, GLint param );\n\nGLAPI void GLAPIENTRY glPixelTransferf( GLenum pname, GLfloat param );\nGLAPI void GLAPIENTRY glPixelTransferi( GLenum pname, GLint param );\n\nGLAPI void GLAPIENTRY glPixelMapfv( GLenum map, GLsizei mapsize,\n                                    const GLfloat *values );\nGLAPI void GLAPIENTRY glPixelMapuiv( GLenum map, GLsizei mapsize,\n                                     const GLuint *values );\nGLAPI void GLAPIENTRY glPixelMapusv( GLenum map, GLsizei mapsize,\n                                     const GLushort *values );\n\nGLAPI void GLAPIENTRY glGetPixelMapfv( GLenum map, GLfloat *values );\nGLAPI void GLAPIENTRY glGetPixelMapuiv( GLenum map, GLuint *values );\nGLAPI void GLAPIENTRY glGetPixelMapusv( GLenum map, GLushort *values );\n\nGLAPI void GLAPIENTRY glBitmap( GLsizei width, GLsizei height,\n                                GLfloat xorig, GLfloat yorig,\n                                GLfloat xmove, GLfloat ymove,\n                                const GLubyte *bitmap );\n\nGLAPI void GLAPIENTRY glReadPixels( GLint x, GLint y,\n                                    GLsizei width, GLsizei height,\n                                    GLenum format, GLenum type,\n                                    GLvoid *pixels );\n\nGLAPI void GLAPIENTRY glDrawPixels( GLsizei width, GLsizei height,\n                                    GLenum format, GLenum type,\n                                    const GLvoid *pixels );\n\nGLAPI void GLAPIENTRY glCopyPixels( GLint x, GLint y,\n                                    GLsizei width, GLsizei height,\n                                    GLenum type );\n\n/*\n * Stenciling\n */\n\nGLAPI void GLAPIENTRY glStencilFunc( GLenum func, GLint ref, GLuint mask );\n\nGLAPI void GLAPIENTRY glStencilMask( GLuint mask );\n\nGLAPI void GLAPIENTRY glStencilOp( GLenum fail, GLenum zfail, GLenum zpass );\n\nGLAPI void GLAPIENTRY glClearStencil( GLint s );\n\n\n\n/*\n * Texture mapping\n */\n\nGLAPI void GLAPIENTRY glTexGend( GLenum coord, GLenum pname, GLdouble param );\nGLAPI void GLAPIENTRY glTexGenf( GLenum coord, GLenum pname, GLfloat param );\nGLAPI void GLAPIENTRY glTexGeni( GLenum coord, GLenum pname, GLint param );\n\nGLAPI void GLAPIENTRY glTexGendv( GLenum coord, GLenum pname, const GLdouble *params );\nGLAPI void GLAPIENTRY glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params );\nGLAPI void GLAPIENTRY glTexGeniv( GLenum coord, GLenum pname, const GLint *params );\n\nGLAPI void GLAPIENTRY glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params );\nGLAPI void GLAPIENTRY glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params );\nGLAPI void GLAPIENTRY glGetTexGeniv( GLenum coord, GLenum pname, GLint *params );\n\n\nGLAPI void GLAPIENTRY glTexEnvf( GLenum target, GLenum pname, GLfloat param );\nGLAPI void GLAPIENTRY glTexEnvi( GLenum target, GLenum pname, GLint param );\n\nGLAPI void GLAPIENTRY glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params );\nGLAPI void GLAPIENTRY glTexEnviv( GLenum target, GLenum pname, const GLint *params );\n\nGLAPI void GLAPIENTRY glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params );\nGLAPI void GLAPIENTRY glGetTexEnviv( GLenum target, GLenum pname, GLint *params );\n\n\nGLAPI void GLAPIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat param );\nGLAPI void GLAPIENTRY glTexParameteri( GLenum target, GLenum pname, GLint param );\n\nGLAPI void GLAPIENTRY glTexParameterfv( GLenum target, GLenum pname,\n                                          const GLfloat *params );\nGLAPI void GLAPIENTRY glTexParameteriv( GLenum target, GLenum pname,\n                                          const GLint *params );\n\nGLAPI void GLAPIENTRY glGetTexParameterfv( GLenum target,\n                                           GLenum pname, GLfloat *params);\nGLAPI void GLAPIENTRY glGetTexParameteriv( GLenum target,\n                                           GLenum pname, GLint *params );\n\nGLAPI void GLAPIENTRY glGetTexLevelParameterfv( GLenum target, GLint level,\n                                                GLenum pname, GLfloat *params );\nGLAPI void GLAPIENTRY glGetTexLevelParameteriv( GLenum target, GLint level,\n                                                GLenum pname, GLint *params );\n\n\nGLAPI void GLAPIENTRY glTexImage1D( GLenum target, GLint level,\n                                    GLint internalFormat,\n                                    GLsizei width, GLint border,\n                                    GLenum format, GLenum type,\n                                    const GLvoid *pixels );\n\nGLAPI void GLAPIENTRY glTexImage2D( GLenum target, GLint level,\n                                    GLint internalFormat,\n                                    GLsizei width, GLsizei height,\n                                    GLint border, GLenum format, GLenum type,\n                                    const GLvoid *pixels );\n\nGLAPI void GLAPIENTRY glGetTexImage( GLenum target, GLint level,\n                                     GLenum format, GLenum type,\n                                     GLvoid *pixels );\n\n\n/* 1.1 functions */\n\nGLAPI void GLAPIENTRY glGenTextures( GLsizei n, GLuint *textures );\n\nGLAPI void GLAPIENTRY glDeleteTextures( GLsizei n, const GLuint *textures);\n\nGLAPI void GLAPIENTRY glBindTexture( GLenum target, GLuint texture );\n\nGLAPI void GLAPIENTRY glPrioritizeTextures( GLsizei n,\n                                            const GLuint *textures,\n                                            const GLclampf *priorities );\n\nGLAPI GLboolean GLAPIENTRY glAreTexturesResident( GLsizei n,\n                                                  const GLuint *textures,\n                                                  GLboolean *residences );\n\nGLAPI GLboolean GLAPIENTRY glIsTexture( GLuint texture );\n\n\nGLAPI void GLAPIENTRY glTexSubImage1D( GLenum target, GLint level,\n                                       GLint xoffset,\n                                       GLsizei width, GLenum format,\n                                       GLenum type, const GLvoid *pixels );\n\n\nGLAPI void GLAPIENTRY glTexSubImage2D( GLenum target, GLint level,\n                                       GLint xoffset, GLint yoffset,\n                                       GLsizei width, GLsizei height,\n                                       GLenum format, GLenum type,\n                                       const GLvoid *pixels );\n\n\nGLAPI void GLAPIENTRY glCopyTexImage1D( GLenum target, GLint level,\n                                        GLenum internalformat,\n                                        GLint x, GLint y,\n                                        GLsizei width, GLint border );\n\n\nGLAPI void GLAPIENTRY glCopyTexImage2D( GLenum target, GLint level,\n                                        GLenum internalformat,\n                                        GLint x, GLint y,\n                                        GLsizei width, GLsizei height,\n                                        GLint border );\n\n\nGLAPI void GLAPIENTRY glCopyTexSubImage1D( GLenum target, GLint level,\n                                           GLint xoffset, GLint x, GLint y,\n                                           GLsizei width );\n\n\nGLAPI void GLAPIENTRY glCopyTexSubImage2D( GLenum target, GLint level,\n                                           GLint xoffset, GLint yoffset,\n                                           GLint x, GLint y,\n                                           GLsizei width, GLsizei height );\n\n\n/*\n * Evaluators\n */\n\nGLAPI void GLAPIENTRY glMap1d( GLenum target, GLdouble u1, GLdouble u2,\n                               GLint stride,\n                               GLint order, const GLdouble *points );\nGLAPI void GLAPIENTRY glMap1f( GLenum target, GLfloat u1, GLfloat u2,\n                               GLint stride,\n                               GLint order, const GLfloat *points );\n\nGLAPI void GLAPIENTRY glMap2d( GLenum target,\n\t\t     GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,\n\t\t     GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,\n\t\t     const GLdouble *points );\nGLAPI void GLAPIENTRY glMap2f( GLenum target,\n\t\t     GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,\n\t\t     GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,\n\t\t     const GLfloat *points );\n\nGLAPI void GLAPIENTRY glGetMapdv( GLenum target, GLenum query, GLdouble *v );\nGLAPI void GLAPIENTRY glGetMapfv( GLenum target, GLenum query, GLfloat *v );\nGLAPI void GLAPIENTRY glGetMapiv( GLenum target, GLenum query, GLint *v );\n\nGLAPI void GLAPIENTRY glEvalCoord1d( GLdouble u );\nGLAPI void GLAPIENTRY glEvalCoord1f( GLfloat u );\n\nGLAPI void GLAPIENTRY glEvalCoord1dv( const GLdouble *u );\nGLAPI void GLAPIENTRY glEvalCoord1fv( const GLfloat *u );\n\nGLAPI void GLAPIENTRY glEvalCoord2d( GLdouble u, GLdouble v );\nGLAPI void GLAPIENTRY glEvalCoord2f( GLfloat u, GLfloat v );\n\nGLAPI void GLAPIENTRY glEvalCoord2dv( const GLdouble *u );\nGLAPI void GLAPIENTRY glEvalCoord2fv( const GLfloat *u );\n\nGLAPI void GLAPIENTRY glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 );\nGLAPI void GLAPIENTRY glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 );\n\nGLAPI void GLAPIENTRY glMapGrid2d( GLint un, GLdouble u1, GLdouble u2,\n                                   GLint vn, GLdouble v1, GLdouble v2 );\nGLAPI void GLAPIENTRY glMapGrid2f( GLint un, GLfloat u1, GLfloat u2,\n                                   GLint vn, GLfloat v1, GLfloat v2 );\n\nGLAPI void GLAPIENTRY glEvalPoint1( GLint i );\n\nGLAPI void GLAPIENTRY glEvalPoint2( GLint i, GLint j );\n\nGLAPI void GLAPIENTRY glEvalMesh1( GLenum mode, GLint i1, GLint i2 );\n\nGLAPI void GLAPIENTRY glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 );\n\n\n/*\n * Fog\n */\n\nGLAPI void GLAPIENTRY glFogf( GLenum pname, GLfloat param );\n\nGLAPI void GLAPIENTRY glFogi( GLenum pname, GLint param );\n\nGLAPI void GLAPIENTRY glFogfv( GLenum pname, const GLfloat *params );\n\nGLAPI void GLAPIENTRY glFogiv( GLenum pname, const GLint *params );\n\n\n/*\n * Selection and Feedback\n */\n\nGLAPI void GLAPIENTRY glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer );\n\nGLAPI void GLAPIENTRY glPassThrough( GLfloat token );\n\nGLAPI void GLAPIENTRY glSelectBuffer( GLsizei size, GLuint *buffer );\n\nGLAPI void GLAPIENTRY glInitNames( void );\n\nGLAPI void GLAPIENTRY glLoadName( GLuint name );\n\nGLAPI void GLAPIENTRY glPushName( GLuint name );\n\nGLAPI void GLAPIENTRY glPopName( void );\n\n\n\n/*\n * OpenGL 1.2\n */\n\n#define GL_RESCALE_NORMAL\t\t\t0x803A\n#define GL_CLAMP_TO_EDGE\t\t\t0x812F\n#define GL_MAX_ELEMENTS_VERTICES\t\t0x80E8\n#define GL_MAX_ELEMENTS_INDICES\t\t\t0x80E9\n#define GL_BGR\t\t\t\t\t0x80E0\n#define GL_BGRA\t\t\t\t\t0x80E1\n#define GL_UNSIGNED_BYTE_3_3_2\t\t\t0x8032\n#define GL_UNSIGNED_BYTE_2_3_3_REV\t\t0x8362\n#define GL_UNSIGNED_SHORT_5_6_5\t\t\t0x8363\n#define GL_UNSIGNED_SHORT_5_6_5_REV\t\t0x8364\n#define GL_UNSIGNED_SHORT_4_4_4_4\t\t0x8033\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV\t\t0x8365\n#define GL_UNSIGNED_SHORT_5_5_5_1\t\t0x8034\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV\t\t0x8366\n#define GL_UNSIGNED_INT_8_8_8_8\t\t\t0x8035\n#define GL_UNSIGNED_INT_8_8_8_8_REV\t\t0x8367\n#define GL_UNSIGNED_INT_10_10_10_2\t\t0x8036\n#define GL_UNSIGNED_INT_2_10_10_10_REV\t\t0x8368\n#define GL_LIGHT_MODEL_COLOR_CONTROL\t\t0x81F8\n#define GL_SINGLE_COLOR\t\t\t\t0x81F9\n#define GL_SEPARATE_SPECULAR_COLOR\t\t0x81FA\n#define GL_TEXTURE_MIN_LOD\t\t\t0x813A\n#define GL_TEXTURE_MAX_LOD\t\t\t0x813B\n#define GL_TEXTURE_BASE_LEVEL\t\t\t0x813C\n#define GL_TEXTURE_MAX_LEVEL\t\t\t0x813D\n#define GL_SMOOTH_POINT_SIZE_RANGE\t\t0x0B12\n#define GL_SMOOTH_POINT_SIZE_GRANULARITY\t0x0B13\n#define GL_SMOOTH_LINE_WIDTH_RANGE\t\t0x0B22\n#define GL_SMOOTH_LINE_WIDTH_GRANULARITY\t0x0B23\n#define GL_ALIASED_POINT_SIZE_RANGE\t\t0x846D\n#define GL_ALIASED_LINE_WIDTH_RANGE\t\t0x846E\n#define GL_PACK_SKIP_IMAGES\t\t\t0x806B\n#define GL_PACK_IMAGE_HEIGHT\t\t\t0x806C\n#define GL_UNPACK_SKIP_IMAGES\t\t\t0x806D\n#define GL_UNPACK_IMAGE_HEIGHT\t\t\t0x806E\n#define GL_TEXTURE_3D\t\t\t\t0x806F\n#define GL_PROXY_TEXTURE_3D\t\t\t0x8070\n#define GL_TEXTURE_DEPTH\t\t\t0x8071\n#define GL_TEXTURE_WRAP_R\t\t\t0x8072\n#define GL_MAX_3D_TEXTURE_SIZE\t\t\t0x8073\n#define GL_TEXTURE_BINDING_3D\t\t\t0x806A\n\nGLAPI void GLAPIENTRY glDrawRangeElements( GLenum mode, GLuint start,\n\tGLuint end, GLsizei count, GLenum type, const GLvoid *indices );\n\nGLAPI void GLAPIENTRY glTexImage3D( GLenum target, GLint level,\n                                      GLint internalFormat,\n                                      GLsizei width, GLsizei height,\n                                      GLsizei depth, GLint border,\n                                      GLenum format, GLenum type,\n                                      const GLvoid *pixels );\n\nGLAPI void GLAPIENTRY glTexSubImage3D( GLenum target, GLint level,\n                                         GLint xoffset, GLint yoffset,\n                                         GLint zoffset, GLsizei width,\n                                         GLsizei height, GLsizei depth,\n                                         GLenum format,\n                                         GLenum type, const GLvoid *pixels);\n\nGLAPI void GLAPIENTRY glCopyTexSubImage3D( GLenum target, GLint level,\n                                             GLint xoffset, GLint yoffset,\n                                             GLint zoffset, GLint x,\n                                             GLint y, GLsizei width,\n                                             GLsizei height );\n\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);\ntypedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n\n\n/*\n * GL_ARB_imaging\n */\n\n#define GL_CONSTANT_COLOR\t\t\t0x8001\n#define GL_ONE_MINUS_CONSTANT_COLOR\t\t0x8002\n#define GL_CONSTANT_ALPHA\t\t\t0x8003\n#define GL_ONE_MINUS_CONSTANT_ALPHA\t\t0x8004\n#define GL_COLOR_TABLE\t\t\t\t0x80D0\n#define GL_POST_CONVOLUTION_COLOR_TABLE\t\t0x80D1\n#define GL_POST_COLOR_MATRIX_COLOR_TABLE\t0x80D2\n#define GL_PROXY_COLOR_TABLE\t\t\t0x80D3\n#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE\t0x80D4\n#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE\t0x80D5\n#define GL_COLOR_TABLE_SCALE\t\t\t0x80D6\n#define GL_COLOR_TABLE_BIAS\t\t\t0x80D7\n#define GL_COLOR_TABLE_FORMAT\t\t\t0x80D8\n#define GL_COLOR_TABLE_WIDTH\t\t\t0x80D9\n#define GL_COLOR_TABLE_RED_SIZE\t\t\t0x80DA\n#define GL_COLOR_TABLE_GREEN_SIZE\t\t0x80DB\n#define GL_COLOR_TABLE_BLUE_SIZE\t\t0x80DC\n#define GL_COLOR_TABLE_ALPHA_SIZE\t\t0x80DD\n#define GL_COLOR_TABLE_LUMINANCE_SIZE\t\t0x80DE\n#define GL_COLOR_TABLE_INTENSITY_SIZE\t\t0x80DF\n#define GL_CONVOLUTION_1D\t\t\t0x8010\n#define GL_CONVOLUTION_2D\t\t\t0x8011\n#define GL_SEPARABLE_2D\t\t\t\t0x8012\n#define GL_CONVOLUTION_BORDER_MODE\t\t0x8013\n#define GL_CONVOLUTION_FILTER_SCALE\t\t0x8014\n#define GL_CONVOLUTION_FILTER_BIAS\t\t0x8015\n#define GL_REDUCE\t\t\t\t0x8016\n#define GL_CONVOLUTION_FORMAT\t\t\t0x8017\n#define GL_CONVOLUTION_WIDTH\t\t\t0x8018\n#define GL_CONVOLUTION_HEIGHT\t\t\t0x8019\n#define GL_MAX_CONVOLUTION_WIDTH\t\t0x801A\n#define GL_MAX_CONVOLUTION_HEIGHT\t\t0x801B\n#define GL_POST_CONVOLUTION_RED_SCALE\t\t0x801C\n#define GL_POST_CONVOLUTION_GREEN_SCALE\t\t0x801D\n#define GL_POST_CONVOLUTION_BLUE_SCALE\t\t0x801E\n#define GL_POST_CONVOLUTION_ALPHA_SCALE\t\t0x801F\n#define GL_POST_CONVOLUTION_RED_BIAS\t\t0x8020\n#define GL_POST_CONVOLUTION_GREEN_BIAS\t\t0x8021\n#define GL_POST_CONVOLUTION_BLUE_BIAS\t\t0x8022\n#define GL_POST_CONVOLUTION_ALPHA_BIAS\t\t0x8023\n#define GL_CONSTANT_BORDER\t\t\t0x8151\n#define GL_REPLICATE_BORDER\t\t\t0x8153\n#define GL_CONVOLUTION_BORDER_COLOR\t\t0x8154\n#define GL_COLOR_MATRIX\t\t\t\t0x80B1\n#define GL_COLOR_MATRIX_STACK_DEPTH\t\t0x80B2\n#define GL_MAX_COLOR_MATRIX_STACK_DEPTH\t\t0x80B3\n#define GL_POST_COLOR_MATRIX_RED_SCALE\t\t0x80B4\n#define GL_POST_COLOR_MATRIX_GREEN_SCALE\t0x80B5\n#define GL_POST_COLOR_MATRIX_BLUE_SCALE\t\t0x80B6\n#define GL_POST_COLOR_MATRIX_ALPHA_SCALE\t0x80B7\n#define GL_POST_COLOR_MATRIX_RED_BIAS\t\t0x80B8\n#define GL_POST_COLOR_MATRIX_GREEN_BIAS\t\t0x80B9\n#define GL_POST_COLOR_MATRIX_BLUE_BIAS\t\t0x80BA\n#define GL_POST_COLOR_MATRIX_ALPHA_BIAS\t\t0x80BB\n#define GL_HISTOGRAM\t\t\t\t0x8024\n#define GL_PROXY_HISTOGRAM\t\t\t0x8025\n#define GL_HISTOGRAM_WIDTH\t\t\t0x8026\n#define GL_HISTOGRAM_FORMAT\t\t\t0x8027\n#define GL_HISTOGRAM_RED_SIZE\t\t\t0x8028\n#define GL_HISTOGRAM_GREEN_SIZE\t\t\t0x8029\n#define GL_HISTOGRAM_BLUE_SIZE\t\t\t0x802A\n#define GL_HISTOGRAM_ALPHA_SIZE\t\t\t0x802B\n#define GL_HISTOGRAM_LUMINANCE_SIZE\t\t0x802C\n#define GL_HISTOGRAM_SINK\t\t\t0x802D\n#define GL_MINMAX\t\t\t\t0x802E\n#define GL_MINMAX_FORMAT\t\t\t0x802F\n#define GL_MINMAX_SINK\t\t\t\t0x8030\n#define GL_TABLE_TOO_LARGE\t\t\t0x8031\n#define GL_BLEND_EQUATION\t\t\t0x8009\n#define GL_MIN\t\t\t\t\t0x8007\n#define GL_MAX\t\t\t\t\t0x8008\n#define GL_FUNC_ADD\t\t\t\t0x8006\n#define GL_FUNC_SUBTRACT\t\t\t0x800A\n#define GL_FUNC_REVERSE_SUBTRACT\t\t0x800B\n#define GL_BLEND_COLOR\t\t\t\t0x8005\n\n\nGLAPI void GLAPIENTRY glColorTable( GLenum target, GLenum internalformat,\n                                    GLsizei width, GLenum format,\n                                    GLenum type, const GLvoid *table );\n\nGLAPI void GLAPIENTRY glColorSubTable( GLenum target,\n                                       GLsizei start, GLsizei count,\n                                       GLenum format, GLenum type,\n                                       const GLvoid *data );\n\nGLAPI void GLAPIENTRY glColorTableParameteriv(GLenum target, GLenum pname,\n                                              const GLint *params);\n\nGLAPI void GLAPIENTRY glColorTableParameterfv(GLenum target, GLenum pname,\n                                              const GLfloat *params);\n\nGLAPI void GLAPIENTRY glCopyColorSubTable( GLenum target, GLsizei start,\n                                           GLint x, GLint y, GLsizei width );\n\nGLAPI void GLAPIENTRY glCopyColorTable( GLenum target, GLenum internalformat,\n                                        GLint x, GLint y, GLsizei width );\n\nGLAPI void GLAPIENTRY glGetColorTable( GLenum target, GLenum format,\n                                       GLenum type, GLvoid *table );\n\nGLAPI void GLAPIENTRY glGetColorTableParameterfv( GLenum target, GLenum pname,\n                                                  GLfloat *params );\n\nGLAPI void GLAPIENTRY glGetColorTableParameteriv( GLenum target, GLenum pname,\n                                                  GLint *params );\n\nGLAPI void GLAPIENTRY glBlendEquation( GLenum mode );\n\nGLAPI void GLAPIENTRY glBlendColor( GLclampf red, GLclampf green,\n                                    GLclampf blue, GLclampf alpha );\n\nGLAPI void GLAPIENTRY glHistogram( GLenum target, GLsizei width,\n\t\t\t\t   GLenum internalformat, GLboolean sink );\n\nGLAPI void GLAPIENTRY glResetHistogram( GLenum target );\n\nGLAPI void GLAPIENTRY glGetHistogram( GLenum target, GLboolean reset,\n\t\t\t\t      GLenum format, GLenum type,\n\t\t\t\t      GLvoid *values );\n\nGLAPI void GLAPIENTRY glGetHistogramParameterfv( GLenum target, GLenum pname,\n\t\t\t\t\t\t GLfloat *params );\n\nGLAPI void GLAPIENTRY glGetHistogramParameteriv( GLenum target, GLenum pname,\n\t\t\t\t\t\t GLint *params );\n\nGLAPI void GLAPIENTRY glMinmax( GLenum target, GLenum internalformat,\n\t\t\t\tGLboolean sink );\n\nGLAPI void GLAPIENTRY glResetMinmax( GLenum target );\n\nGLAPI void GLAPIENTRY glGetMinmax( GLenum target, GLboolean reset,\n                                   GLenum format, GLenum types,\n                                   GLvoid *values );\n\nGLAPI void GLAPIENTRY glGetMinmaxParameterfv( GLenum target, GLenum pname,\n\t\t\t\t\t      GLfloat *params );\n\nGLAPI void GLAPIENTRY glGetMinmaxParameteriv( GLenum target, GLenum pname,\n\t\t\t\t\t      GLint *params );\n\nGLAPI void GLAPIENTRY glConvolutionFilter1D( GLenum target,\n\tGLenum internalformat, GLsizei width, GLenum format, GLenum type,\n\tconst GLvoid *image );\n\nGLAPI void GLAPIENTRY glConvolutionFilter2D( GLenum target,\n\tGLenum internalformat, GLsizei width, GLsizei height, GLenum format,\n\tGLenum type, const GLvoid *image );\n\nGLAPI void GLAPIENTRY glConvolutionParameterf( GLenum target, GLenum pname,\n\tGLfloat params );\n\nGLAPI void GLAPIENTRY glConvolutionParameterfv( GLenum target, GLenum pname,\n\tconst GLfloat *params );\n\nGLAPI void GLAPIENTRY glConvolutionParameteri( GLenum target, GLenum pname,\n\tGLint params );\n\nGLAPI void GLAPIENTRY glConvolutionParameteriv( GLenum target, GLenum pname,\n\tconst GLint *params );\n\nGLAPI void GLAPIENTRY glCopyConvolutionFilter1D( GLenum target,\n\tGLenum internalformat, GLint x, GLint y, GLsizei width );\n\nGLAPI void GLAPIENTRY glCopyConvolutionFilter2D( GLenum target,\n\tGLenum internalformat, GLint x, GLint y, GLsizei width,\n\tGLsizei height);\n\nGLAPI void GLAPIENTRY glGetConvolutionFilter( GLenum target, GLenum format,\n\tGLenum type, GLvoid *image );\n\nGLAPI void GLAPIENTRY glGetConvolutionParameterfv( GLenum target, GLenum pname,\n\tGLfloat *params );\n\nGLAPI void GLAPIENTRY glGetConvolutionParameteriv( GLenum target, GLenum pname,\n\tGLint *params );\n\nGLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target,\n\tGLenum internalformat, GLsizei width, GLsizei height, GLenum format,\n\tGLenum type, const GLvoid *row, const GLvoid *column );\n\nGLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format,\n\tGLenum type, GLvoid *row, GLvoid *column, GLvoid *span );\n\n\n\n\n/*\n * OpenGL 1.3\n */\n\n/* multitexture */\n#define GL_TEXTURE0\t\t\t\t0x84C0\n#define GL_TEXTURE1\t\t\t\t0x84C1\n#define GL_TEXTURE2\t\t\t\t0x84C2\n#define GL_TEXTURE3\t\t\t\t0x84C3\n#define GL_TEXTURE4\t\t\t\t0x84C4\n#define GL_TEXTURE5\t\t\t\t0x84C5\n#define GL_TEXTURE6\t\t\t\t0x84C6\n#define GL_TEXTURE7\t\t\t\t0x84C7\n#define GL_TEXTURE8\t\t\t\t0x84C8\n#define GL_TEXTURE9\t\t\t\t0x84C9\n#define GL_TEXTURE10\t\t\t\t0x84CA\n#define GL_TEXTURE11\t\t\t\t0x84CB\n#define GL_TEXTURE12\t\t\t\t0x84CC\n#define GL_TEXTURE13\t\t\t\t0x84CD\n#define GL_TEXTURE14\t\t\t\t0x84CE\n#define GL_TEXTURE15\t\t\t\t0x84CF\n#define GL_TEXTURE16\t\t\t\t0x84D0\n#define GL_TEXTURE17\t\t\t\t0x84D1\n#define GL_TEXTURE18\t\t\t\t0x84D2\n#define GL_TEXTURE19\t\t\t\t0x84D3\n#define GL_TEXTURE20\t\t\t\t0x84D4\n#define GL_TEXTURE21\t\t\t\t0x84D5\n#define GL_TEXTURE22\t\t\t\t0x84D6\n#define GL_TEXTURE23\t\t\t\t0x84D7\n#define GL_TEXTURE24\t\t\t\t0x84D8\n#define GL_TEXTURE25\t\t\t\t0x84D9\n#define GL_TEXTURE26\t\t\t\t0x84DA\n#define GL_TEXTURE27\t\t\t\t0x84DB\n#define GL_TEXTURE28\t\t\t\t0x84DC\n#define GL_TEXTURE29\t\t\t\t0x84DD\n#define GL_TEXTURE30\t\t\t\t0x84DE\n#define GL_TEXTURE31\t\t\t\t0x84DF\n#define GL_ACTIVE_TEXTURE\t\t\t0x84E0\n#define GL_CLIENT_ACTIVE_TEXTURE\t\t0x84E1\n#define GL_MAX_TEXTURE_UNITS\t\t\t0x84E2\n/* texture_cube_map */\n#define GL_NORMAL_MAP\t\t\t\t0x8511\n#define GL_REFLECTION_MAP\t\t\t0x8512\n#define GL_TEXTURE_CUBE_MAP\t\t\t0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP\t\t0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X\t\t0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X\t\t0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y\t\t0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y\t\t0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z\t\t0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z\t\t0x851A\n#define GL_PROXY_TEXTURE_CUBE_MAP\t\t0x851B\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE\t\t0x851C\n/* texture_compression */\n#define GL_COMPRESSED_ALPHA\t\t\t0x84E9\n#define GL_COMPRESSED_LUMINANCE\t\t\t0x84EA\n#define GL_COMPRESSED_LUMINANCE_ALPHA\t\t0x84EB\n#define GL_COMPRESSED_INTENSITY\t\t\t0x84EC\n#define GL_COMPRESSED_RGB\t\t\t0x84ED\n#define GL_COMPRESSED_RGBA\t\t\t0x84EE\n#define GL_TEXTURE_COMPRESSION_HINT\t\t0x84EF\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE\t0x86A0\n#define GL_TEXTURE_COMPRESSED\t\t\t0x86A1\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS\t0x86A2\n#define GL_COMPRESSED_TEXTURE_FORMATS\t\t0x86A3\n/* multisample */\n#define GL_MULTISAMPLE\t\t\t\t0x809D\n#define GL_SAMPLE_ALPHA_TO_COVERAGE\t\t0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE\t\t\t0x809F\n#define GL_SAMPLE_COVERAGE\t\t\t0x80A0\n#define GL_SAMPLE_BUFFERS\t\t\t0x80A8\n#define GL_SAMPLES\t\t\t\t0x80A9\n#define GL_SAMPLE_COVERAGE_VALUE\t\t0x80AA\n#define GL_SAMPLE_COVERAGE_INVERT\t\t0x80AB\n#define GL_MULTISAMPLE_BIT\t\t\t0x20000000\n/* transpose_matrix */\n#define GL_TRANSPOSE_MODELVIEW_MATRIX\t\t0x84E3\n#define GL_TRANSPOSE_PROJECTION_MATRIX\t\t0x84E4\n#define GL_TRANSPOSE_TEXTURE_MATRIX\t\t0x84E5\n#define GL_TRANSPOSE_COLOR_MATRIX\t\t0x84E6\n/* texture_env_combine */\n#define GL_COMBINE\t\t\t\t0x8570\n#define GL_COMBINE_RGB\t\t\t\t0x8571\n#define GL_COMBINE_ALPHA\t\t\t0x8572\n#define GL_SOURCE0_RGB\t\t\t\t0x8580\n#define GL_SOURCE1_RGB\t\t\t\t0x8581\n#define GL_SOURCE2_RGB\t\t\t\t0x8582\n#define GL_SOURCE0_ALPHA\t\t\t0x8588\n#define GL_SOURCE1_ALPHA\t\t\t0x8589\n#define GL_SOURCE2_ALPHA\t\t\t0x858A\n#define GL_OPERAND0_RGB\t\t\t\t0x8590\n#define GL_OPERAND1_RGB\t\t\t\t0x8591\n#define GL_OPERAND2_RGB\t\t\t\t0x8592\n#define GL_OPERAND0_ALPHA\t\t\t0x8598\n#define GL_OPERAND1_ALPHA\t\t\t0x8599\n#define GL_OPERAND2_ALPHA\t\t\t0x859A\n#define GL_RGB_SCALE\t\t\t\t0x8573\n#define GL_ADD_SIGNED\t\t\t\t0x8574\n#define GL_INTERPOLATE\t\t\t\t0x8575\n#define GL_SUBTRACT\t\t\t\t0x84E7\n#define GL_CONSTANT\t\t\t\t0x8576\n#define GL_PRIMARY_COLOR\t\t\t0x8577\n#define GL_PREVIOUS\t\t\t\t0x8578\n/* texture_env_dot3 */\n#define GL_DOT3_RGB\t\t\t\t0x86AE\n#define GL_DOT3_RGBA\t\t\t\t0x86AF\n/* texture_border_clamp */\n#define GL_CLAMP_TO_BORDER\t\t\t0x812D\n\nGLAPI void GLAPIENTRY glActiveTexture( GLenum texture );\n\nGLAPI void GLAPIENTRY glClientActiveTexture( GLenum texture );\n\nGLAPI void GLAPIENTRY glCompressedTexImage1D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data );\n\nGLAPI void GLAPIENTRY glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data );\n\nGLAPI void GLAPIENTRY glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data );\n\nGLAPI void GLAPIENTRY glCompressedTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data );\n\nGLAPI void GLAPIENTRY glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data );\n\nGLAPI void GLAPIENTRY glCompressedTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data );\n\nGLAPI void GLAPIENTRY glGetCompressedTexImage( GLenum target, GLint lod, GLvoid *img );\n\nGLAPI void GLAPIENTRY glMultiTexCoord1d( GLenum target, GLdouble s );\n\nGLAPI void GLAPIENTRY glMultiTexCoord1dv( GLenum target, const GLdouble *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord1f( GLenum target, GLfloat s );\n\nGLAPI void GLAPIENTRY glMultiTexCoord1fv( GLenum target, const GLfloat *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord1i( GLenum target, GLint s );\n\nGLAPI void GLAPIENTRY glMultiTexCoord1iv( GLenum target, const GLint *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord1s( GLenum target, GLshort s );\n\nGLAPI void GLAPIENTRY glMultiTexCoord1sv( GLenum target, const GLshort *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord2d( GLenum target, GLdouble s, GLdouble t );\n\nGLAPI void GLAPIENTRY glMultiTexCoord2dv( GLenum target, const GLdouble *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord2f( GLenum target, GLfloat s, GLfloat t );\n\nGLAPI void GLAPIENTRY glMultiTexCoord2fv( GLenum target, const GLfloat *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord2i( GLenum target, GLint s, GLint t );\n\nGLAPI void GLAPIENTRY glMultiTexCoord2iv( GLenum target, const GLint *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord2s( GLenum target, GLshort s, GLshort t );\n\nGLAPI void GLAPIENTRY glMultiTexCoord2sv( GLenum target, const GLshort *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord3d( GLenum target, GLdouble s, GLdouble t, GLdouble r );\n\nGLAPI void GLAPIENTRY glMultiTexCoord3dv( GLenum target, const GLdouble *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord3f( GLenum target, GLfloat s, GLfloat t, GLfloat r );\n\nGLAPI void GLAPIENTRY glMultiTexCoord3fv( GLenum target, const GLfloat *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord3i( GLenum target, GLint s, GLint t, GLint r );\n\nGLAPI void GLAPIENTRY glMultiTexCoord3iv( GLenum target, const GLint *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord3s( GLenum target, GLshort s, GLshort t, GLshort r );\n\nGLAPI void GLAPIENTRY glMultiTexCoord3sv( GLenum target, const GLshort *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord4d( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q );\n\nGLAPI void GLAPIENTRY glMultiTexCoord4dv( GLenum target, const GLdouble *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q );\n\nGLAPI void GLAPIENTRY glMultiTexCoord4fv( GLenum target, const GLfloat *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord4i( GLenum target, GLint s, GLint t, GLint r, GLint q );\n\nGLAPI void GLAPIENTRY glMultiTexCoord4iv( GLenum target, const GLint *v );\n\nGLAPI void GLAPIENTRY glMultiTexCoord4s( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q );\n\nGLAPI void GLAPIENTRY glMultiTexCoord4sv( GLenum target, const GLshort *v );\n\n\nGLAPI void GLAPIENTRY glLoadTransposeMatrixd( const GLdouble m[16] );\n\nGLAPI void GLAPIENTRY glLoadTransposeMatrixf( const GLfloat m[16] );\n\nGLAPI void GLAPIENTRY glMultTransposeMatrixd( const GLdouble m[16] );\n\nGLAPI void GLAPIENTRY glMultTransposeMatrixf( const GLfloat m[16] );\n\nGLAPI void GLAPIENTRY glSampleCoverage( GLclampf value, GLboolean invert );\n\n\ntypedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);\ntypedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img);\n\n\n\n/*\n * GL_ARB_multitexture (ARB extension 1 and OpenGL 1.2.1)\n */\n#ifndef GL_ARB_multitexture\n#define GL_ARB_multitexture 1\n\n#define GL_TEXTURE0_ARB\t\t\t\t0x84C0\n#define GL_TEXTURE1_ARB\t\t\t\t0x84C1\n#define GL_TEXTURE2_ARB\t\t\t\t0x84C2\n#define GL_TEXTURE3_ARB\t\t\t\t0x84C3\n#define GL_TEXTURE4_ARB\t\t\t\t0x84C4\n#define GL_TEXTURE5_ARB\t\t\t\t0x84C5\n#define GL_TEXTURE6_ARB\t\t\t\t0x84C6\n#define GL_TEXTURE7_ARB\t\t\t\t0x84C7\n#define GL_TEXTURE8_ARB\t\t\t\t0x84C8\n#define GL_TEXTURE9_ARB\t\t\t\t0x84C9\n#define GL_TEXTURE10_ARB\t\t\t0x84CA\n#define GL_TEXTURE11_ARB\t\t\t0x84CB\n#define GL_TEXTURE12_ARB\t\t\t0x84CC\n#define GL_TEXTURE13_ARB\t\t\t0x84CD\n#define GL_TEXTURE14_ARB\t\t\t0x84CE\n#define GL_TEXTURE15_ARB\t\t\t0x84CF\n#define GL_TEXTURE16_ARB\t\t\t0x84D0\n#define GL_TEXTURE17_ARB\t\t\t0x84D1\n#define GL_TEXTURE18_ARB\t\t\t0x84D2\n#define GL_TEXTURE19_ARB\t\t\t0x84D3\n#define GL_TEXTURE20_ARB\t\t\t0x84D4\n#define GL_TEXTURE21_ARB\t\t\t0x84D5\n#define GL_TEXTURE22_ARB\t\t\t0x84D6\n#define GL_TEXTURE23_ARB\t\t\t0x84D7\n#define GL_TEXTURE24_ARB\t\t\t0x84D8\n#define GL_TEXTURE25_ARB\t\t\t0x84D9\n#define GL_TEXTURE26_ARB\t\t\t0x84DA\n#define GL_TEXTURE27_ARB\t\t\t0x84DB\n#define GL_TEXTURE28_ARB\t\t\t0x84DC\n#define GL_TEXTURE29_ARB\t\t\t0x84DD\n#define GL_TEXTURE30_ARB\t\t\t0x84DE\n#define GL_TEXTURE31_ARB\t\t\t0x84DF\n#define GL_ACTIVE_TEXTURE_ARB\t\t\t0x84E0\n#define GL_CLIENT_ACTIVE_TEXTURE_ARB\t\t0x84E1\n#define GL_MAX_TEXTURE_UNITS_ARB\t\t0x84E2\n\nGLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture);\nGLAPI void GLAPIENTRY glClientActiveTextureARB(GLenum texture);\nGLAPI void GLAPIENTRY glMultiTexCoord1dARB(GLenum target, GLdouble s);\nGLAPI void GLAPIENTRY glMultiTexCoord1dvARB(GLenum target, const GLdouble *v);\nGLAPI void GLAPIENTRY glMultiTexCoord1fARB(GLenum target, GLfloat s);\nGLAPI void GLAPIENTRY glMultiTexCoord1fvARB(GLenum target, const GLfloat *v);\nGLAPI void GLAPIENTRY glMultiTexCoord1iARB(GLenum target, GLint s);\nGLAPI void GLAPIENTRY glMultiTexCoord1ivARB(GLenum target, const GLint *v);\nGLAPI void GLAPIENTRY glMultiTexCoord1sARB(GLenum target, GLshort s);\nGLAPI void GLAPIENTRY glMultiTexCoord1svARB(GLenum target, const GLshort *v);\nGLAPI void GLAPIENTRY glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t);\nGLAPI void GLAPIENTRY glMultiTexCoord2dvARB(GLenum target, const GLdouble *v);\nGLAPI void GLAPIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t);\nGLAPI void GLAPIENTRY glMultiTexCoord2fvARB(GLenum target, const GLfloat *v);\nGLAPI void GLAPIENTRY glMultiTexCoord2iARB(GLenum target, GLint s, GLint t);\nGLAPI void GLAPIENTRY glMultiTexCoord2ivARB(GLenum target, const GLint *v);\nGLAPI void GLAPIENTRY glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t);\nGLAPI void GLAPIENTRY glMultiTexCoord2svARB(GLenum target, const GLshort *v);\nGLAPI void GLAPIENTRY glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r);\nGLAPI void GLAPIENTRY glMultiTexCoord3dvARB(GLenum target, const GLdouble *v);\nGLAPI void GLAPIENTRY glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r);\nGLAPI void GLAPIENTRY glMultiTexCoord3fvARB(GLenum target, const GLfloat *v);\nGLAPI void GLAPIENTRY glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r);\nGLAPI void GLAPIENTRY glMultiTexCoord3ivARB(GLenum target, const GLint *v);\nGLAPI void GLAPIENTRY glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r);\nGLAPI void GLAPIENTRY glMultiTexCoord3svARB(GLenum target, const GLshort *v);\nGLAPI void GLAPIENTRY glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\nGLAPI void GLAPIENTRY glMultiTexCoord4dvARB(GLenum target, const GLdouble *v);\nGLAPI void GLAPIENTRY glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\nGLAPI void GLAPIENTRY glMultiTexCoord4fvARB(GLenum target, const GLfloat *v);\nGLAPI void GLAPIENTRY glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q);\nGLAPI void GLAPIENTRY glMultiTexCoord4ivARB(GLenum target, const GLint *v);\nGLAPI void GLAPIENTRY glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\nGLAPI void GLAPIENTRY glMultiTexCoord4svARB(GLenum target, const GLshort *v);\n\ntypedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture);\ntypedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);\n\n#endif /* GL_ARB_multitexture */\n\n\n\n/*\n * Define this token if you want \"old-style\" header file behaviour (extensions\n * defined in gl.h).  Otherwise, extensions will be included from glext.h.\n */\n#if !defined(NO_SDL_GLEXT) && !defined(GL_GLEXT_LEGACY)\n#include \"SDL_opengl_glext.h\"\n#endif  /* GL_GLEXT_LEGACY */\n\n\n\n/*\n * ???. GL_MESA_packed_depth_stencil\n * XXX obsolete\n */\n#ifndef GL_MESA_packed_depth_stencil\n#define GL_MESA_packed_depth_stencil 1\n\n#define GL_DEPTH_STENCIL_MESA\t\t\t0x8750\n#define GL_UNSIGNED_INT_24_8_MESA\t\t0x8751\n#define GL_UNSIGNED_INT_8_24_REV_MESA\t\t0x8752\n#define GL_UNSIGNED_SHORT_15_1_MESA\t\t0x8753\n#define GL_UNSIGNED_SHORT_1_15_REV_MESA\t\t0x8754\n\n#endif /* GL_MESA_packed_depth_stencil */\n\n\n#ifndef GL_ATI_blend_equation_separate\n#define GL_ATI_blend_equation_separate 1\n\n#define GL_ALPHA_BLEND_EQUATION_ATI\t        0x883D\n\nGLAPI void GLAPIENTRY glBlendEquationSeparateATI( GLenum modeRGB, GLenum modeA );\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEATIPROC) (GLenum modeRGB, GLenum modeA);\n\n#endif /* GL_ATI_blend_equation_separate */\n\n\n/* GL_OES_EGL_image */\n#ifndef GL_OES_EGL_image\ntypedef void* GLeglImageOES;\n#endif\n\n#ifndef GL_OES_EGL_image\n#define GL_OES_EGL_image 1\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);\nGLAPI void APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);\n#endif\ntypedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);\ntypedef void (APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);\n#endif\n\n\n/**\n ** NOTE!!!!!  If you add new functions to this file, or update\n ** glext.h be sure to regenerate the gl_mangle.h file.  See comments\n ** in that file for details.\n **/\n\n\n\n/**********************************************************************\n * Begin system-specific stuff\n */\n#if defined(PRAGMA_EXPORT_SUPPORTED)\n#pragma export off\n#endif\n\n/*\n * End system-specific stuff\n **********************************************************************/\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __gl_h_ */\n\n#endif /* !__IPHONEOS__ */\n\n#endif /* _SDL_opengl_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_opengl_glext.h",
    "content": "#ifndef __glext_h_\n#define __glext_h_ 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n** Copyright (c) 2013-2014 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n/*\n** This header is generated from the Khronos OpenGL / OpenGL ES XML\n** API Registry. The current version of the Registry, generator scripts\n** used to make the header, and the header can be found at\n**   http://www.opengl.org/registry/\n**\n** Khronos $Revision: 26745 $ on $Date: 2014-05-21 03:12:26 -0700 (Wed, 21 May 2014) $\n*/\n\n#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN 1\n#endif\n#include <windows.h>\n#endif\n\n#ifndef APIENTRY\n#define APIENTRY\n#endif\n#ifndef APIENTRYP\n#define APIENTRYP APIENTRY *\n#endif\n#ifndef GLAPI\n#define GLAPI extern\n#endif\n\n#define GL_GLEXT_VERSION 20140521\n\n/* Generated C header for:\n * API: gl\n * Profile: compatibility\n * Versions considered: .*\n * Versions emitted: 1\\.[2-9]|[234]\\.[0-9]\n * Default extensions included: gl\n * Additional extensions included: _nomatch_^\n * Extensions removed: _nomatch_^\n */\n\n#ifndef GL_VERSION_1_2\n#define GL_VERSION_1_2 1\n#define GL_UNSIGNED_BYTE_3_3_2            0x8032\n#define GL_UNSIGNED_SHORT_4_4_4_4         0x8033\n#define GL_UNSIGNED_SHORT_5_5_5_1         0x8034\n#define GL_UNSIGNED_INT_8_8_8_8           0x8035\n#define GL_UNSIGNED_INT_10_10_10_2        0x8036\n#define GL_TEXTURE_BINDING_3D             0x806A\n#define GL_PACK_SKIP_IMAGES               0x806B\n#define GL_PACK_IMAGE_HEIGHT              0x806C\n#define GL_UNPACK_SKIP_IMAGES             0x806D\n#define GL_UNPACK_IMAGE_HEIGHT            0x806E\n#define GL_TEXTURE_3D                     0x806F\n#define GL_PROXY_TEXTURE_3D               0x8070\n#define GL_TEXTURE_DEPTH                  0x8071\n#define GL_TEXTURE_WRAP_R                 0x8072\n#define GL_MAX_3D_TEXTURE_SIZE            0x8073\n#define GL_UNSIGNED_BYTE_2_3_3_REV        0x8362\n#define GL_UNSIGNED_SHORT_5_6_5           0x8363\n#define GL_UNSIGNED_SHORT_5_6_5_REV       0x8364\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV     0x8365\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV     0x8366\n#define GL_UNSIGNED_INT_8_8_8_8_REV       0x8367\n#define GL_UNSIGNED_INT_2_10_10_10_REV    0x8368\n#define GL_BGR                            0x80E0\n#define GL_BGRA                           0x80E1\n#define GL_MAX_ELEMENTS_VERTICES          0x80E8\n#define GL_MAX_ELEMENTS_INDICES           0x80E9\n#define GL_CLAMP_TO_EDGE                  0x812F\n#define GL_TEXTURE_MIN_LOD                0x813A\n#define GL_TEXTURE_MAX_LOD                0x813B\n#define GL_TEXTURE_BASE_LEVEL             0x813C\n#define GL_TEXTURE_MAX_LEVEL              0x813D\n#define GL_SMOOTH_POINT_SIZE_RANGE        0x0B12\n#define GL_SMOOTH_POINT_SIZE_GRANULARITY  0x0B13\n#define GL_SMOOTH_LINE_WIDTH_RANGE        0x0B22\n#define GL_SMOOTH_LINE_WIDTH_GRANULARITY  0x0B23\n#define GL_ALIASED_LINE_WIDTH_RANGE       0x846E\n#define GL_RESCALE_NORMAL                 0x803A\n#define GL_LIGHT_MODEL_COLOR_CONTROL      0x81F8\n#define GL_SINGLE_COLOR                   0x81F9\n#define GL_SEPARATE_SPECULAR_COLOR        0x81FA\n#define GL_ALIASED_POINT_SIZE_RANGE       0x846D\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);\ntypedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);\nGLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n#endif\n#endif /* GL_VERSION_1_2 */\n\n#ifndef GL_VERSION_1_3\n#define GL_VERSION_1_3 1\n#define GL_TEXTURE0                       0x84C0\n#define GL_TEXTURE1                       0x84C1\n#define GL_TEXTURE2                       0x84C2\n#define GL_TEXTURE3                       0x84C3\n#define GL_TEXTURE4                       0x84C4\n#define GL_TEXTURE5                       0x84C5\n#define GL_TEXTURE6                       0x84C6\n#define GL_TEXTURE7                       0x84C7\n#define GL_TEXTURE8                       0x84C8\n#define GL_TEXTURE9                       0x84C9\n#define GL_TEXTURE10                      0x84CA\n#define GL_TEXTURE11                      0x84CB\n#define GL_TEXTURE12                      0x84CC\n#define GL_TEXTURE13                      0x84CD\n#define GL_TEXTURE14                      0x84CE\n#define GL_TEXTURE15                      0x84CF\n#define GL_TEXTURE16                      0x84D0\n#define GL_TEXTURE17                      0x84D1\n#define GL_TEXTURE18                      0x84D2\n#define GL_TEXTURE19                      0x84D3\n#define GL_TEXTURE20                      0x84D4\n#define GL_TEXTURE21                      0x84D5\n#define GL_TEXTURE22                      0x84D6\n#define GL_TEXTURE23                      0x84D7\n#define GL_TEXTURE24                      0x84D8\n#define GL_TEXTURE25                      0x84D9\n#define GL_TEXTURE26                      0x84DA\n#define GL_TEXTURE27                      0x84DB\n#define GL_TEXTURE28                      0x84DC\n#define GL_TEXTURE29                      0x84DD\n#define GL_TEXTURE30                      0x84DE\n#define GL_TEXTURE31                      0x84DF\n#define GL_ACTIVE_TEXTURE                 0x84E0\n#define GL_MULTISAMPLE                    0x809D\n#define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE            0x809F\n#define GL_SAMPLE_COVERAGE                0x80A0\n#define GL_SAMPLE_BUFFERS                 0x80A8\n#define GL_SAMPLES                        0x80A9\n#define GL_SAMPLE_COVERAGE_VALUE          0x80AA\n#define GL_SAMPLE_COVERAGE_INVERT         0x80AB\n#define GL_TEXTURE_CUBE_MAP               0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP       0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X    0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X    0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y    0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y    0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z    0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z    0x851A\n#define GL_PROXY_TEXTURE_CUBE_MAP         0x851B\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE      0x851C\n#define GL_COMPRESSED_RGB                 0x84ED\n#define GL_COMPRESSED_RGBA                0x84EE\n#define GL_TEXTURE_COMPRESSION_HINT       0x84EF\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE  0x86A0\n#define GL_TEXTURE_COMPRESSED             0x86A1\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2\n#define GL_COMPRESSED_TEXTURE_FORMATS     0x86A3\n#define GL_CLAMP_TO_BORDER                0x812D\n#define GL_CLIENT_ACTIVE_TEXTURE          0x84E1\n#define GL_MAX_TEXTURE_UNITS              0x84E2\n#define GL_TRANSPOSE_MODELVIEW_MATRIX     0x84E3\n#define GL_TRANSPOSE_PROJECTION_MATRIX    0x84E4\n#define GL_TRANSPOSE_TEXTURE_MATRIX       0x84E5\n#define GL_TRANSPOSE_COLOR_MATRIX         0x84E6\n#define GL_MULTISAMPLE_BIT                0x20000000\n#define GL_NORMAL_MAP                     0x8511\n#define GL_REFLECTION_MAP                 0x8512\n#define GL_COMPRESSED_ALPHA               0x84E9\n#define GL_COMPRESSED_LUMINANCE           0x84EA\n#define GL_COMPRESSED_LUMINANCE_ALPHA     0x84EB\n#define GL_COMPRESSED_INTENSITY           0x84EC\n#define GL_COMBINE                        0x8570\n#define GL_COMBINE_RGB                    0x8571\n#define GL_COMBINE_ALPHA                  0x8572\n#define GL_SOURCE0_RGB                    0x8580\n#define GL_SOURCE1_RGB                    0x8581\n#define GL_SOURCE2_RGB                    0x8582\n#define GL_SOURCE0_ALPHA                  0x8588\n#define GL_SOURCE1_ALPHA                  0x8589\n#define GL_SOURCE2_ALPHA                  0x858A\n#define GL_OPERAND0_RGB                   0x8590\n#define GL_OPERAND1_RGB                   0x8591\n#define GL_OPERAND2_RGB                   0x8592\n#define GL_OPERAND0_ALPHA                 0x8598\n#define GL_OPERAND1_ALPHA                 0x8599\n#define GL_OPERAND2_ALPHA                 0x859A\n#define GL_RGB_SCALE                      0x8573\n#define GL_ADD_SIGNED                     0x8574\n#define GL_INTERPOLATE                    0x8575\n#define GL_SUBTRACT                       0x84E7\n#define GL_CONSTANT                       0x8576\n#define GL_PRIMARY_COLOR                  0x8577\n#define GL_PREVIOUS                       0x8578\n#define GL_DOT3_RGB                       0x86AE\n#define GL_DOT3_RGBA                      0x86AF\ntypedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);\ntypedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img);\ntypedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m);\ntypedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m);\ntypedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m);\ntypedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glActiveTexture (GLenum texture);\nGLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);\nGLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img);\nGLAPI void APIENTRY glClientActiveTexture (GLenum texture);\nGLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s);\nGLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v);\nGLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s);\nGLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v);\nGLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s);\nGLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v);\nGLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s);\nGLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v);\nGLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t);\nGLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v);\nGLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t);\nGLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v);\nGLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t);\nGLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v);\nGLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t);\nGLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v);\nGLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r);\nGLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v);\nGLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r);\nGLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v);\nGLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r);\nGLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v);\nGLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r);\nGLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v);\nGLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\nGLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v);\nGLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\nGLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v);\nGLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q);\nGLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v);\nGLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\nGLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v);\nGLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m);\nGLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m);\nGLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m);\nGLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m);\n#endif\n#endif /* GL_VERSION_1_3 */\n\n#ifndef GL_VERSION_1_4\n#define GL_VERSION_1_4 1\n#define GL_BLEND_DST_RGB                  0x80C8\n#define GL_BLEND_SRC_RGB                  0x80C9\n#define GL_BLEND_DST_ALPHA                0x80CA\n#define GL_BLEND_SRC_ALPHA                0x80CB\n#define GL_POINT_FADE_THRESHOLD_SIZE      0x8128\n#define GL_DEPTH_COMPONENT16              0x81A5\n#define GL_DEPTH_COMPONENT24              0x81A6\n#define GL_DEPTH_COMPONENT32              0x81A7\n#define GL_MIRRORED_REPEAT                0x8370\n#define GL_MAX_TEXTURE_LOD_BIAS           0x84FD\n#define GL_TEXTURE_LOD_BIAS               0x8501\n#define GL_INCR_WRAP                      0x8507\n#define GL_DECR_WRAP                      0x8508\n#define GL_TEXTURE_DEPTH_SIZE             0x884A\n#define GL_TEXTURE_COMPARE_MODE           0x884C\n#define GL_TEXTURE_COMPARE_FUNC           0x884D\n#define GL_POINT_SIZE_MIN                 0x8126\n#define GL_POINT_SIZE_MAX                 0x8127\n#define GL_POINT_DISTANCE_ATTENUATION     0x8129\n#define GL_GENERATE_MIPMAP                0x8191\n#define GL_GENERATE_MIPMAP_HINT           0x8192\n#define GL_FOG_COORDINATE_SOURCE          0x8450\n#define GL_FOG_COORDINATE                 0x8451\n#define GL_FRAGMENT_DEPTH                 0x8452\n#define GL_CURRENT_FOG_COORDINATE         0x8453\n#define GL_FOG_COORDINATE_ARRAY_TYPE      0x8454\n#define GL_FOG_COORDINATE_ARRAY_STRIDE    0x8455\n#define GL_FOG_COORDINATE_ARRAY_POINTER   0x8456\n#define GL_FOG_COORDINATE_ARRAY           0x8457\n#define GL_COLOR_SUM                      0x8458\n#define GL_CURRENT_SECONDARY_COLOR        0x8459\n#define GL_SECONDARY_COLOR_ARRAY_SIZE     0x845A\n#define GL_SECONDARY_COLOR_ARRAY_TYPE     0x845B\n#define GL_SECONDARY_COLOR_ARRAY_STRIDE   0x845C\n#define GL_SECONDARY_COLOR_ARRAY_POINTER  0x845D\n#define GL_SECONDARY_COLOR_ARRAY          0x845E\n#define GL_TEXTURE_FILTER_CONTROL         0x8500\n#define GL_DEPTH_TEXTURE_MODE             0x884B\n#define GL_COMPARE_R_TO_TEXTURE           0x884E\n#define GL_FUNC_ADD                       0x8006\n#define GL_FUNC_SUBTRACT                  0x800A\n#define GL_FUNC_REVERSE_SUBTRACT          0x800B\n#define GL_MIN                            0x8007\n#define GL_MAX                            0x8008\n#define GL_CONSTANT_COLOR                 0x8001\n#define GL_ONE_MINUS_CONSTANT_COLOR       0x8002\n#define GL_CONSTANT_ALPHA                 0x8003\n#define GL_ONE_MINUS_CONSTANT_ALPHA       0x8004\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\ntypedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord);\ntypedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord);\ntypedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord);\ntypedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord);\ntypedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v);\ntypedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\nGLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);\nGLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount);\nGLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param);\nGLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params);\nGLAPI void APIENTRY glFogCoordf (GLfloat coord);\nGLAPI void APIENTRY glFogCoordfv (const GLfloat *coord);\nGLAPI void APIENTRY glFogCoordd (GLdouble coord);\nGLAPI void APIENTRY glFogCoorddv (const GLdouble *coord);\nGLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue);\nGLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v);\nGLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue);\nGLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v);\nGLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue);\nGLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v);\nGLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue);\nGLAPI void APIENTRY glSecondaryColor3iv (const GLint *v);\nGLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue);\nGLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v);\nGLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue);\nGLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v);\nGLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue);\nGLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v);\nGLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue);\nGLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v);\nGLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y);\nGLAPI void APIENTRY glWindowPos2dv (const GLdouble *v);\nGLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y);\nGLAPI void APIENTRY glWindowPos2fv (const GLfloat *v);\nGLAPI void APIENTRY glWindowPos2i (GLint x, GLint y);\nGLAPI void APIENTRY glWindowPos2iv (const GLint *v);\nGLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y);\nGLAPI void APIENTRY glWindowPos2sv (const GLshort *v);\nGLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glWindowPos3dv (const GLdouble *v);\nGLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glWindowPos3fv (const GLfloat *v);\nGLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z);\nGLAPI void APIENTRY glWindowPos3iv (const GLint *v);\nGLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z);\nGLAPI void APIENTRY glWindowPos3sv (const GLshort *v);\nGLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\nGLAPI void APIENTRY glBlendEquation (GLenum mode);\n#endif\n#endif /* GL_VERSION_1_4 */\n\n#ifndef GL_VERSION_1_5\n#define GL_VERSION_1_5 1\n#include <stddef.h>\n#ifdef __MACOSX__\ntypedef long GLsizeiptr;\ntypedef long GLintptr;\n#else\ntypedef ptrdiff_t GLsizeiptr;\ntypedef ptrdiff_t GLintptr;\n#endif\n#define GL_BUFFER_SIZE                    0x8764\n#define GL_BUFFER_USAGE                   0x8765\n#define GL_QUERY_COUNTER_BITS             0x8864\n#define GL_CURRENT_QUERY                  0x8865\n#define GL_QUERY_RESULT                   0x8866\n#define GL_QUERY_RESULT_AVAILABLE         0x8867\n#define GL_ARRAY_BUFFER                   0x8892\n#define GL_ELEMENT_ARRAY_BUFFER           0x8893\n#define GL_ARRAY_BUFFER_BINDING           0x8894\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\n#define GL_READ_ONLY                      0x88B8\n#define GL_WRITE_ONLY                     0x88B9\n#define GL_READ_WRITE                     0x88BA\n#define GL_BUFFER_ACCESS                  0x88BB\n#define GL_BUFFER_MAPPED                  0x88BC\n#define GL_BUFFER_MAP_POINTER             0x88BD\n#define GL_STREAM_DRAW                    0x88E0\n#define GL_STREAM_READ                    0x88E1\n#define GL_STREAM_COPY                    0x88E2\n#define GL_STATIC_DRAW                    0x88E4\n#define GL_STATIC_READ                    0x88E5\n#define GL_STATIC_COPY                    0x88E6\n#define GL_DYNAMIC_DRAW                   0x88E8\n#define GL_DYNAMIC_READ                   0x88E9\n#define GL_DYNAMIC_COPY                   0x88EA\n#define GL_SAMPLES_PASSED                 0x8914\n#define GL_SRC1_ALPHA                     0x8589\n#define GL_VERTEX_ARRAY_BUFFER_BINDING    0x8896\n#define GL_NORMAL_ARRAY_BUFFER_BINDING    0x8897\n#define GL_COLOR_ARRAY_BUFFER_BINDING     0x8898\n#define GL_INDEX_ARRAY_BUFFER_BINDING     0x8899\n#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A\n#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B\n#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C\n#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D\n#define GL_WEIGHT_ARRAY_BUFFER_BINDING    0x889E\n#define GL_FOG_COORD_SRC                  0x8450\n#define GL_FOG_COORD                      0x8451\n#define GL_CURRENT_FOG_COORD              0x8453\n#define GL_FOG_COORD_ARRAY_TYPE           0x8454\n#define GL_FOG_COORD_ARRAY_STRIDE         0x8455\n#define GL_FOG_COORD_ARRAY_POINTER        0x8456\n#define GL_FOG_COORD_ARRAY                0x8457\n#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D\n#define GL_SRC0_RGB                       0x8580\n#define GL_SRC1_RGB                       0x8581\n#define GL_SRC2_RGB                       0x8582\n#define GL_SRC0_ALPHA                     0x8588\n#define GL_SRC2_ALPHA                     0x858A\ntypedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);\ntypedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);\ntypedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);\ntypedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);\ntypedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);\ntypedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);\ntypedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);\ntypedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);\ntypedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data);\ntypedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);\ntypedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids);\nGLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);\nGLAPI GLboolean APIENTRY glIsQuery (GLuint id);\nGLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id);\nGLAPI void APIENTRY glEndQuery (GLenum target);\nGLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer);\nGLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);\nGLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);\nGLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer);\nGLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);\nGLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);\nGLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data);\nGLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access);\nGLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target);\nGLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);\n#endif\n#endif /* GL_VERSION_1_5 */\n\n#ifndef GL_VERSION_2_0\n#define GL_VERSION_2_0 1\ntypedef char GLchar;\n#define GL_BLEND_EQUATION_RGB             0x8009\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED    0x8622\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE       0x8623\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE     0x8624\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE       0x8625\n#define GL_CURRENT_VERTEX_ATTRIB          0x8626\n#define GL_VERTEX_PROGRAM_POINT_SIZE      0x8642\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER    0x8645\n#define GL_STENCIL_BACK_FUNC              0x8800\n#define GL_STENCIL_BACK_FAIL              0x8801\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL   0x8802\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS   0x8803\n#define GL_MAX_DRAW_BUFFERS               0x8824\n#define GL_DRAW_BUFFER0                   0x8825\n#define GL_DRAW_BUFFER1                   0x8826\n#define GL_DRAW_BUFFER2                   0x8827\n#define GL_DRAW_BUFFER3                   0x8828\n#define GL_DRAW_BUFFER4                   0x8829\n#define GL_DRAW_BUFFER5                   0x882A\n#define GL_DRAW_BUFFER6                   0x882B\n#define GL_DRAW_BUFFER7                   0x882C\n#define GL_DRAW_BUFFER8                   0x882D\n#define GL_DRAW_BUFFER9                   0x882E\n#define GL_DRAW_BUFFER10                  0x882F\n#define GL_DRAW_BUFFER11                  0x8830\n#define GL_DRAW_BUFFER12                  0x8831\n#define GL_DRAW_BUFFER13                  0x8832\n#define GL_DRAW_BUFFER14                  0x8833\n#define GL_DRAW_BUFFER15                  0x8834\n#define GL_BLEND_EQUATION_ALPHA           0x883D\n#define GL_MAX_VERTEX_ATTRIBS             0x8869\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A\n#define GL_MAX_TEXTURE_IMAGE_UNITS        0x8872\n#define GL_FRAGMENT_SHADER                0x8B30\n#define GL_VERTEX_SHADER                  0x8B31\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS  0x8B4A\n#define GL_MAX_VARYING_FLOATS             0x8B4B\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D\n#define GL_SHADER_TYPE                    0x8B4F\n#define GL_FLOAT_VEC2                     0x8B50\n#define GL_FLOAT_VEC3                     0x8B51\n#define GL_FLOAT_VEC4                     0x8B52\n#define GL_INT_VEC2                       0x8B53\n#define GL_INT_VEC3                       0x8B54\n#define GL_INT_VEC4                       0x8B55\n#define GL_BOOL                           0x8B56\n#define GL_BOOL_VEC2                      0x8B57\n#define GL_BOOL_VEC3                      0x8B58\n#define GL_BOOL_VEC4                      0x8B59\n#define GL_FLOAT_MAT2                     0x8B5A\n#define GL_FLOAT_MAT3                     0x8B5B\n#define GL_FLOAT_MAT4                     0x8B5C\n#define GL_SAMPLER_1D                     0x8B5D\n#define GL_SAMPLER_2D                     0x8B5E\n#define GL_SAMPLER_3D                     0x8B5F\n#define GL_SAMPLER_CUBE                   0x8B60\n#define GL_SAMPLER_1D_SHADOW              0x8B61\n#define GL_SAMPLER_2D_SHADOW              0x8B62\n#define GL_DELETE_STATUS                  0x8B80\n#define GL_COMPILE_STATUS                 0x8B81\n#define GL_LINK_STATUS                    0x8B82\n#define GL_VALIDATE_STATUS                0x8B83\n#define GL_INFO_LOG_LENGTH                0x8B84\n#define GL_ATTACHED_SHADERS               0x8B85\n#define GL_ACTIVE_UNIFORMS                0x8B86\n#define GL_ACTIVE_UNIFORM_MAX_LENGTH      0x8B87\n#define GL_SHADER_SOURCE_LENGTH           0x8B88\n#define GL_ACTIVE_ATTRIBUTES              0x8B89\n#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH    0x8B8A\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B\n#define GL_SHADING_LANGUAGE_VERSION       0x8B8C\n#define GL_CURRENT_PROGRAM                0x8B8D\n#define GL_POINT_SPRITE_COORD_ORIGIN      0x8CA0\n#define GL_LOWER_LEFT                     0x8CA1\n#define GL_UPPER_LEFT                     0x8CA2\n#define GL_STENCIL_BACK_REF               0x8CA3\n#define GL_STENCIL_BACK_VALUE_MASK        0x8CA4\n#define GL_STENCIL_BACK_WRITEMASK         0x8CA5\n#define GL_VERTEX_PROGRAM_TWO_SIDE        0x8643\n#define GL_POINT_SPRITE                   0x8861\n#define GL_COORD_REPLACE                  0x8862\n#define GL_MAX_TEXTURE_COORDS             0x8871\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);\ntypedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);\ntypedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\ntypedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);\ntypedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);\ntypedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);\ntypedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);\ntypedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);\ntypedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void);\ntypedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);\ntypedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);\ntypedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);\ntypedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);\ntypedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);\ntypedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);\ntypedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\ntypedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);\ntypedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\ntypedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\ntypedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);\ntypedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);\ntypedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);\ntypedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader);\ntypedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);\ntypedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);\ntypedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);\ntypedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);\ntypedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);\ntypedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\ntypedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\ntypedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);\ntypedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);\ntypedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);\ntypedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\ntypedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);\nGLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);\nGLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\nGLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);\nGLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);\nGLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader);\nGLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);\nGLAPI void APIENTRY glCompileShader (GLuint shader);\nGLAPI GLuint APIENTRY glCreateProgram (void);\nGLAPI GLuint APIENTRY glCreateShader (GLenum type);\nGLAPI void APIENTRY glDeleteProgram (GLuint program);\nGLAPI void APIENTRY glDeleteShader (GLuint shader);\nGLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader);\nGLAPI void APIENTRY glDisableVertexAttribArray (GLuint index);\nGLAPI void APIENTRY glEnableVertexAttribArray (GLuint index);\nGLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\nGLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\nGLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);\nGLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);\nGLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\nGLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\nGLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);\nGLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);\nGLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);\nGLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params);\nGLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);\nGLAPI GLboolean APIENTRY glIsProgram (GLuint program);\nGLAPI GLboolean APIENTRY glIsShader (GLuint shader);\nGLAPI void APIENTRY glLinkProgram (GLuint program);\nGLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);\nGLAPI void APIENTRY glUseProgram (GLuint program);\nGLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0);\nGLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);\nGLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI void APIENTRY glUniform1i (GLint location, GLint v0);\nGLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);\nGLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glValidateProgram (GLuint program);\nGLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x);\nGLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);\nGLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x);\nGLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);\nGLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y);\nGLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z);\nGLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v);\nGLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\nGLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v);\nGLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v);\nGLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v);\nGLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);\n#endif\n#endif /* GL_VERSION_2_0 */\n\n#ifndef GL_VERSION_2_1\n#define GL_VERSION_2_1 1\n#define GL_PIXEL_PACK_BUFFER              0x88EB\n#define GL_PIXEL_UNPACK_BUFFER            0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING      0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING    0x88EF\n#define GL_FLOAT_MAT2x3                   0x8B65\n#define GL_FLOAT_MAT2x4                   0x8B66\n#define GL_FLOAT_MAT3x2                   0x8B67\n#define GL_FLOAT_MAT3x4                   0x8B68\n#define GL_FLOAT_MAT4x2                   0x8B69\n#define GL_FLOAT_MAT4x3                   0x8B6A\n#define GL_SRGB                           0x8C40\n#define GL_SRGB8                          0x8C41\n#define GL_SRGB_ALPHA                     0x8C42\n#define GL_SRGB8_ALPHA8                   0x8C43\n#define GL_COMPRESSED_SRGB                0x8C48\n#define GL_COMPRESSED_SRGB_ALPHA          0x8C49\n#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F\n#define GL_SLUMINANCE_ALPHA               0x8C44\n#define GL_SLUMINANCE8_ALPHA8             0x8C45\n#define GL_SLUMINANCE                     0x8C46\n#define GL_SLUMINANCE8                    0x8C47\n#define GL_COMPRESSED_SLUMINANCE          0x8C4A\n#define GL_COMPRESSED_SLUMINANCE_ALPHA    0x8C4B\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n#endif\n#endif /* GL_VERSION_2_1 */\n\n#ifndef GL_VERSION_3_0\n#define GL_VERSION_3_0 1\ntypedef unsigned short GLhalf;\n#define GL_COMPARE_REF_TO_TEXTURE         0x884E\n#define GL_CLIP_DISTANCE0                 0x3000\n#define GL_CLIP_DISTANCE1                 0x3001\n#define GL_CLIP_DISTANCE2                 0x3002\n#define GL_CLIP_DISTANCE3                 0x3003\n#define GL_CLIP_DISTANCE4                 0x3004\n#define GL_CLIP_DISTANCE5                 0x3005\n#define GL_CLIP_DISTANCE6                 0x3006\n#define GL_CLIP_DISTANCE7                 0x3007\n#define GL_MAX_CLIP_DISTANCES             0x0D32\n#define GL_MAJOR_VERSION                  0x821B\n#define GL_MINOR_VERSION                  0x821C\n#define GL_NUM_EXTENSIONS                 0x821D\n#define GL_CONTEXT_FLAGS                  0x821E\n#define GL_COMPRESSED_RED                 0x8225\n#define GL_COMPRESSED_RG                  0x8226\n#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001\n#define GL_RGBA32F                        0x8814\n#define GL_RGB32F                         0x8815\n#define GL_RGBA16F                        0x881A\n#define GL_RGB16F                         0x881B\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER    0x88FD\n#define GL_MAX_ARRAY_TEXTURE_LAYERS       0x88FF\n#define GL_MIN_PROGRAM_TEXEL_OFFSET       0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET       0x8905\n#define GL_CLAMP_READ_COLOR               0x891C\n#define GL_FIXED_ONLY                     0x891D\n#define GL_MAX_VARYING_COMPONENTS         0x8B4B\n#define GL_TEXTURE_1D_ARRAY               0x8C18\n#define GL_PROXY_TEXTURE_1D_ARRAY         0x8C19\n#define GL_TEXTURE_2D_ARRAY               0x8C1A\n#define GL_PROXY_TEXTURE_2D_ARRAY         0x8C1B\n#define GL_TEXTURE_BINDING_1D_ARRAY       0x8C1C\n#define GL_TEXTURE_BINDING_2D_ARRAY       0x8C1D\n#define GL_R11F_G11F_B10F                 0x8C3A\n#define GL_UNSIGNED_INT_10F_11F_11F_REV   0x8C3B\n#define GL_RGB9_E5                        0x8C3D\n#define GL_UNSIGNED_INT_5_9_9_9_REV       0x8C3E\n#define GL_TEXTURE_SHARED_SIZE            0x8C3F\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80\n#define GL_TRANSFORM_FEEDBACK_VARYINGS    0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85\n#define GL_PRIMITIVES_GENERATED           0x8C87\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88\n#define GL_RASTERIZER_DISCARD             0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B\n#define GL_INTERLEAVED_ATTRIBS            0x8C8C\n#define GL_SEPARATE_ATTRIBS               0x8C8D\n#define GL_TRANSFORM_FEEDBACK_BUFFER      0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F\n#define GL_RGBA32UI                       0x8D70\n#define GL_RGB32UI                        0x8D71\n#define GL_RGBA16UI                       0x8D76\n#define GL_RGB16UI                        0x8D77\n#define GL_RGBA8UI                        0x8D7C\n#define GL_RGB8UI                         0x8D7D\n#define GL_RGBA32I                        0x8D82\n#define GL_RGB32I                         0x8D83\n#define GL_RGBA16I                        0x8D88\n#define GL_RGB16I                         0x8D89\n#define GL_RGBA8I                         0x8D8E\n#define GL_RGB8I                          0x8D8F\n#define GL_RED_INTEGER                    0x8D94\n#define GL_GREEN_INTEGER                  0x8D95\n#define GL_BLUE_INTEGER                   0x8D96\n#define GL_RGB_INTEGER                    0x8D98\n#define GL_RGBA_INTEGER                   0x8D99\n#define GL_BGR_INTEGER                    0x8D9A\n#define GL_BGRA_INTEGER                   0x8D9B\n#define GL_SAMPLER_1D_ARRAY               0x8DC0\n#define GL_SAMPLER_2D_ARRAY               0x8DC1\n#define GL_SAMPLER_1D_ARRAY_SHADOW        0x8DC3\n#define GL_SAMPLER_2D_ARRAY_SHADOW        0x8DC4\n#define GL_SAMPLER_CUBE_SHADOW            0x8DC5\n#define GL_UNSIGNED_INT_VEC2              0x8DC6\n#define GL_UNSIGNED_INT_VEC3              0x8DC7\n#define GL_UNSIGNED_INT_VEC4              0x8DC8\n#define GL_INT_SAMPLER_1D                 0x8DC9\n#define GL_INT_SAMPLER_2D                 0x8DCA\n#define GL_INT_SAMPLER_3D                 0x8DCB\n#define GL_INT_SAMPLER_CUBE               0x8DCC\n#define GL_INT_SAMPLER_1D_ARRAY           0x8DCE\n#define GL_INT_SAMPLER_2D_ARRAY           0x8DCF\n#define GL_UNSIGNED_INT_SAMPLER_1D        0x8DD1\n#define GL_UNSIGNED_INT_SAMPLER_2D        0x8DD2\n#define GL_UNSIGNED_INT_SAMPLER_3D        0x8DD3\n#define GL_UNSIGNED_INT_SAMPLER_CUBE      0x8DD4\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY  0x8DD6\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY  0x8DD7\n#define GL_QUERY_WAIT                     0x8E13\n#define GL_QUERY_NO_WAIT                  0x8E14\n#define GL_QUERY_BY_REGION_WAIT           0x8E15\n#define GL_QUERY_BY_REGION_NO_WAIT        0x8E16\n#define GL_BUFFER_ACCESS_FLAGS            0x911F\n#define GL_BUFFER_MAP_LENGTH              0x9120\n#define GL_BUFFER_MAP_OFFSET              0x9121\n#define GL_DEPTH_COMPONENT32F             0x8CAC\n#define GL_DEPTH32F_STENCIL8              0x8CAD\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD\n#define GL_INVALID_FRAMEBUFFER_OPERATION  0x0506\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211\n#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212\n#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213\n#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214\n#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215\n#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216\n#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217\n#define GL_FRAMEBUFFER_DEFAULT            0x8218\n#define GL_FRAMEBUFFER_UNDEFINED          0x8219\n#define GL_DEPTH_STENCIL_ATTACHMENT       0x821A\n#define GL_MAX_RENDERBUFFER_SIZE          0x84E8\n#define GL_DEPTH_STENCIL                  0x84F9\n#define GL_UNSIGNED_INT_24_8              0x84FA\n#define GL_DEPTH24_STENCIL8               0x88F0\n#define GL_TEXTURE_STENCIL_SIZE           0x88F1\n#define GL_TEXTURE_RED_TYPE               0x8C10\n#define GL_TEXTURE_GREEN_TYPE             0x8C11\n#define GL_TEXTURE_BLUE_TYPE              0x8C12\n#define GL_TEXTURE_ALPHA_TYPE             0x8C13\n#define GL_TEXTURE_DEPTH_TYPE             0x8C16\n#define GL_UNSIGNED_NORMALIZED            0x8C17\n#define GL_FRAMEBUFFER_BINDING            0x8CA6\n#define GL_DRAW_FRAMEBUFFER_BINDING       0x8CA6\n#define GL_RENDERBUFFER_BINDING           0x8CA7\n#define GL_READ_FRAMEBUFFER               0x8CA8\n#define GL_DRAW_FRAMEBUFFER               0x8CA9\n#define GL_READ_FRAMEBUFFER_BINDING       0x8CAA\n#define GL_RENDERBUFFER_SAMPLES           0x8CAB\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\n#define GL_FRAMEBUFFER_COMPLETE           0x8CD5\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC\n#define GL_FRAMEBUFFER_UNSUPPORTED        0x8CDD\n#define GL_MAX_COLOR_ATTACHMENTS          0x8CDF\n#define GL_COLOR_ATTACHMENT0              0x8CE0\n#define GL_COLOR_ATTACHMENT1              0x8CE1\n#define GL_COLOR_ATTACHMENT2              0x8CE2\n#define GL_COLOR_ATTACHMENT3              0x8CE3\n#define GL_COLOR_ATTACHMENT4              0x8CE4\n#define GL_COLOR_ATTACHMENT5              0x8CE5\n#define GL_COLOR_ATTACHMENT6              0x8CE6\n#define GL_COLOR_ATTACHMENT7              0x8CE7\n#define GL_COLOR_ATTACHMENT8              0x8CE8\n#define GL_COLOR_ATTACHMENT9              0x8CE9\n#define GL_COLOR_ATTACHMENT10             0x8CEA\n#define GL_COLOR_ATTACHMENT11             0x8CEB\n#define GL_COLOR_ATTACHMENT12             0x8CEC\n#define GL_COLOR_ATTACHMENT13             0x8CED\n#define GL_COLOR_ATTACHMENT14             0x8CEE\n#define GL_COLOR_ATTACHMENT15             0x8CEF\n#define GL_DEPTH_ATTACHMENT               0x8D00\n#define GL_STENCIL_ATTACHMENT             0x8D20\n#define GL_FRAMEBUFFER                    0x8D40\n#define GL_RENDERBUFFER                   0x8D41\n#define GL_RENDERBUFFER_WIDTH             0x8D42\n#define GL_RENDERBUFFER_HEIGHT            0x8D43\n#define GL_RENDERBUFFER_INTERNAL_FORMAT   0x8D44\n#define GL_STENCIL_INDEX1                 0x8D46\n#define GL_STENCIL_INDEX4                 0x8D47\n#define GL_STENCIL_INDEX8                 0x8D48\n#define GL_STENCIL_INDEX16                0x8D49\n#define GL_RENDERBUFFER_RED_SIZE          0x8D50\n#define GL_RENDERBUFFER_GREEN_SIZE        0x8D51\n#define GL_RENDERBUFFER_BLUE_SIZE         0x8D52\n#define GL_RENDERBUFFER_ALPHA_SIZE        0x8D53\n#define GL_RENDERBUFFER_DEPTH_SIZE        0x8D54\n#define GL_RENDERBUFFER_STENCIL_SIZE      0x8D55\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56\n#define GL_MAX_SAMPLES                    0x8D57\n#define GL_INDEX                          0x8222\n#define GL_TEXTURE_LUMINANCE_TYPE         0x8C14\n#define GL_TEXTURE_INTENSITY_TYPE         0x8C15\n#define GL_FRAMEBUFFER_SRGB               0x8DB9\n#define GL_HALF_FLOAT                     0x140B\n#define GL_MAP_READ_BIT                   0x0001\n#define GL_MAP_WRITE_BIT                  0x0002\n#define GL_MAP_INVALIDATE_RANGE_BIT       0x0004\n#define GL_MAP_INVALIDATE_BUFFER_BIT      0x0008\n#define GL_MAP_FLUSH_EXPLICIT_BIT         0x0010\n#define GL_MAP_UNSYNCHRONIZED_BIT         0x0020\n#define GL_COMPRESSED_RED_RGTC1           0x8DBB\n#define GL_COMPRESSED_SIGNED_RED_RGTC1    0x8DBC\n#define GL_COMPRESSED_RG_RGTC2            0x8DBD\n#define GL_COMPRESSED_SIGNED_RG_RGTC2     0x8DBE\n#define GL_RG                             0x8227\n#define GL_RG_INTEGER                     0x8228\n#define GL_R8                             0x8229\n#define GL_R16                            0x822A\n#define GL_RG8                            0x822B\n#define GL_RG16                           0x822C\n#define GL_R16F                           0x822D\n#define GL_R32F                           0x822E\n#define GL_RG16F                          0x822F\n#define GL_RG32F                          0x8230\n#define GL_R8I                            0x8231\n#define GL_R8UI                           0x8232\n#define GL_R16I                           0x8233\n#define GL_R16UI                          0x8234\n#define GL_R32I                           0x8235\n#define GL_R32UI                          0x8236\n#define GL_RG8I                           0x8237\n#define GL_RG8UI                          0x8238\n#define GL_RG16I                          0x8239\n#define GL_RG16UI                         0x823A\n#define GL_RG32I                          0x823B\n#define GL_RG32UI                         0x823C\n#define GL_VERTEX_ARRAY_BINDING           0x85B5\n#define GL_CLAMP_VERTEX_COLOR             0x891A\n#define GL_CLAMP_FRAGMENT_COLOR           0x891B\n#define GL_ALPHA_INTEGER                  0x8D97\ntypedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\ntypedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);\ntypedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);\ntypedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index);\ntypedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index);\ntypedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index);\ntypedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);\ntypedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);\ntypedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);\ntypedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);\ntypedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\ntypedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp);\ntypedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode);\ntypedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v);\ntypedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);\ntypedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name);\ntypedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);\ntypedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);\ntypedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);\ntypedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);\ntypedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\ntypedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\ntypedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);\ntypedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);\ntypedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);\ntypedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);\ntypedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);\ntypedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);\ntypedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);\ntypedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\ntypedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\ntypedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\ntypedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);\ntypedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);\ntypedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);\ntypedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);\ntypedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\nGLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data);\nGLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);\nGLAPI void APIENTRY glEnablei (GLenum target, GLuint index);\nGLAPI void APIENTRY glDisablei (GLenum target, GLuint index);\nGLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index);\nGLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode);\nGLAPI void APIENTRY glEndTransformFeedback (void);\nGLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);\nGLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);\nGLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\nGLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp);\nGLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode);\nGLAPI void APIENTRY glEndConditionalRender (void);\nGLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x);\nGLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y);\nGLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z);\nGLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x);\nGLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y);\nGLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z);\nGLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\nGLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v);\nGLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v);\nGLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);\nGLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name);\nGLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);\nGLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0);\nGLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);\nGLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params);\nGLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);\nGLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);\nGLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);\nGLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\nGLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index);\nGLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer);\nGLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);\nGLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);\nGLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);\nGLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer);\nGLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);\nGLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);\nGLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);\nGLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target);\nGLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\nGLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\nGLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGenerateMipmap (GLenum target);\nGLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\nGLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\nGLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);\nGLAPI void APIENTRY glBindVertexArray (GLuint array);\nGLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);\nGLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);\nGLAPI GLboolean APIENTRY glIsVertexArray (GLuint array);\n#endif\n#endif /* GL_VERSION_3_0 */\n\n#ifndef GL_VERSION_3_1\n#define GL_VERSION_3_1 1\n#define GL_SAMPLER_2D_RECT                0x8B63\n#define GL_SAMPLER_2D_RECT_SHADOW         0x8B64\n#define GL_SAMPLER_BUFFER                 0x8DC2\n#define GL_INT_SAMPLER_2D_RECT            0x8DCD\n#define GL_INT_SAMPLER_BUFFER             0x8DD0\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT   0x8DD5\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER    0x8DD8\n#define GL_TEXTURE_BUFFER                 0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE        0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER         0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D\n#define GL_TEXTURE_RECTANGLE              0x84F5\n#define GL_TEXTURE_BINDING_RECTANGLE      0x84F6\n#define GL_PROXY_TEXTURE_RECTANGLE        0x84F7\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE     0x84F8\n#define GL_R8_SNORM                       0x8F94\n#define GL_RG8_SNORM                      0x8F95\n#define GL_RGB8_SNORM                     0x8F96\n#define GL_RGBA8_SNORM                    0x8F97\n#define GL_R16_SNORM                      0x8F98\n#define GL_RG16_SNORM                     0x8F99\n#define GL_RGB16_SNORM                    0x8F9A\n#define GL_RGBA16_SNORM                   0x8F9B\n#define GL_SIGNED_NORMALIZED              0x8F9C\n#define GL_PRIMITIVE_RESTART              0x8F9D\n#define GL_PRIMITIVE_RESTART_INDEX        0x8F9E\n#define GL_COPY_READ_BUFFER               0x8F36\n#define GL_COPY_WRITE_BUFFER              0x8F37\n#define GL_UNIFORM_BUFFER                 0x8A11\n#define GL_UNIFORM_BUFFER_BINDING         0x8A28\n#define GL_UNIFORM_BUFFER_START           0x8A29\n#define GL_UNIFORM_BUFFER_SIZE            0x8A2A\n#define GL_MAX_VERTEX_UNIFORM_BLOCKS      0x8A2B\n#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS    0x8A2D\n#define GL_MAX_COMBINED_UNIFORM_BLOCKS    0x8A2E\n#define GL_MAX_UNIFORM_BUFFER_BINDINGS    0x8A2F\n#define GL_MAX_UNIFORM_BLOCK_SIZE         0x8A30\n#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31\n#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33\n#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34\n#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35\n#define GL_ACTIVE_UNIFORM_BLOCKS          0x8A36\n#define GL_UNIFORM_TYPE                   0x8A37\n#define GL_UNIFORM_SIZE                   0x8A38\n#define GL_UNIFORM_NAME_LENGTH            0x8A39\n#define GL_UNIFORM_BLOCK_INDEX            0x8A3A\n#define GL_UNIFORM_OFFSET                 0x8A3B\n#define GL_UNIFORM_ARRAY_STRIDE           0x8A3C\n#define GL_UNIFORM_MATRIX_STRIDE          0x8A3D\n#define GL_UNIFORM_IS_ROW_MAJOR           0x8A3E\n#define GL_UNIFORM_BLOCK_BINDING          0x8A3F\n#define GL_UNIFORM_BLOCK_DATA_SIZE        0x8A40\n#define GL_UNIFORM_BLOCK_NAME_LENGTH      0x8A41\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS  0x8A42\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46\n#define GL_INVALID_INDEX                  0xFFFFFFFFu\ntypedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);\ntypedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer);\ntypedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index);\ntypedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\ntypedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);\ntypedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);\ntypedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);\nGLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);\nGLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer);\nGLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index);\nGLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\nGLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);\nGLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);\nGLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);\nGLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);\nGLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\n#endif\n#endif /* GL_VERSION_3_1 */\n\n#ifndef GL_VERSION_3_2\n#define GL_VERSION_3_2 1\ntypedef struct __GLsync *GLsync;\n#ifndef GLEXT_64_TYPES_DEFINED\n/* This code block is duplicated in glxext.h, so must be protected */\n#define GLEXT_64_TYPES_DEFINED\n/* Define int32_t, int64_t, and uint64_t types for UST/MSC */\n/* (as used in the GL_EXT_timer_query extension). */\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n#include <inttypes.h>\n#elif defined(__sun__) || defined(__digital__)\n#include <inttypes.h>\n#if defined(__STDC__)\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int int64_t;\ntypedef unsigned long int uint64_t;\n#else\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#endif /* __arch64__ */\n#endif /* __STDC__ */\n#elif defined( __VMS ) || defined(__sgi)\n#include <inttypes.h>\n#elif defined(__SCO__) || defined(__USLC__)\n#include <stdint.h>\n#elif defined(__UNIXOS2__) || defined(__SOL64__)\ntypedef long int int32_t;\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#elif defined(_WIN32) && defined(__GNUC__)\n#include <stdint.h>\n#elif defined(_WIN32)\ntypedef __int32 int32_t;\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#else\n/* Fallback if nothing above works */\n#include <inttypes.h>\n#endif\n#endif\ntypedef uint64_t GLuint64;\ntypedef int64_t GLint64;\n#define GL_CONTEXT_CORE_PROFILE_BIT       0x00000001\n#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002\n#define GL_LINES_ADJACENCY                0x000A\n#define GL_LINE_STRIP_ADJACENCY           0x000B\n#define GL_TRIANGLES_ADJACENCY            0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY       0x000D\n#define GL_PROGRAM_POINT_SIZE             0x8642\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8\n#define GL_GEOMETRY_SHADER                0x8DD9\n#define GL_GEOMETRY_VERTICES_OUT          0x8916\n#define GL_GEOMETRY_INPUT_TYPE            0x8917\n#define GL_GEOMETRY_OUTPUT_TYPE           0x8918\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES   0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1\n#define GL_MAX_VERTEX_OUTPUT_COMPONENTS   0x9122\n#define GL_MAX_GEOMETRY_INPUT_COMPONENTS  0x9123\n#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124\n#define GL_MAX_FRAGMENT_INPUT_COMPONENTS  0x9125\n#define GL_CONTEXT_PROFILE_MASK           0x9126\n#define GL_DEPTH_CLAMP                    0x864F\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C\n#define GL_FIRST_VERTEX_CONVENTION        0x8E4D\n#define GL_LAST_VERTEX_CONVENTION         0x8E4E\n#define GL_PROVOKING_VERTEX               0x8E4F\n#define GL_TEXTURE_CUBE_MAP_SEAMLESS      0x884F\n#define GL_MAX_SERVER_WAIT_TIMEOUT        0x9111\n#define GL_OBJECT_TYPE                    0x9112\n#define GL_SYNC_CONDITION                 0x9113\n#define GL_SYNC_STATUS                    0x9114\n#define GL_SYNC_FLAGS                     0x9115\n#define GL_SYNC_FENCE                     0x9116\n#define GL_SYNC_GPU_COMMANDS_COMPLETE     0x9117\n#define GL_UNSIGNALED                     0x9118\n#define GL_SIGNALED                       0x9119\n#define GL_ALREADY_SIGNALED               0x911A\n#define GL_TIMEOUT_EXPIRED                0x911B\n#define GL_CONDITION_SATISFIED            0x911C\n#define GL_WAIT_FAILED                    0x911D\n#define GL_TIMEOUT_IGNORED                0xFFFFFFFFFFFFFFFFull\n#define GL_SYNC_FLUSH_COMMANDS_BIT        0x00000001\n#define GL_SAMPLE_POSITION                0x8E50\n#define GL_SAMPLE_MASK                    0x8E51\n#define GL_SAMPLE_MASK_VALUE              0x8E52\n#define GL_MAX_SAMPLE_MASK_WORDS          0x8E59\n#define GL_TEXTURE_2D_MULTISAMPLE         0x9100\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE   0x9101\n#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY   0x9102\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105\n#define GL_TEXTURE_SAMPLES                0x9106\n#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107\n#define GL_SAMPLER_2D_MULTISAMPLE         0x9108\n#define GL_INT_SAMPLER_2D_MULTISAMPLE     0x9109\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A\n#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY   0x910B\n#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D\n#define GL_MAX_COLOR_TEXTURE_SAMPLES      0x910E\n#define GL_MAX_DEPTH_TEXTURE_SAMPLES      0x910F\n#define GL_MAX_INTEGER_SAMPLES            0x9110\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex);\ntypedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode);\ntypedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);\ntypedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync);\ntypedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);\ntypedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);\ntypedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);\ntypedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data);\ntypedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\ntypedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);\ntypedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val);\ntypedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);\nGLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);\nGLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);\nGLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex);\nGLAPI void APIENTRY glProvokingVertex (GLenum mode);\nGLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags);\nGLAPI GLboolean APIENTRY glIsSync (GLsync sync);\nGLAPI void APIENTRY glDeleteSync (GLsync sync);\nGLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);\nGLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);\nGLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);\nGLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\nGLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);\nGLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);\nGLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level);\nGLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val);\nGLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask);\n#endif\n#endif /* GL_VERSION_3_2 */\n\n#ifndef GL_VERSION_3_3\n#define GL_VERSION_3_3 1\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR    0x88FE\n#define GL_SRC1_COLOR                     0x88F9\n#define GL_ONE_MINUS_SRC1_COLOR           0x88FA\n#define GL_ONE_MINUS_SRC1_ALPHA           0x88FB\n#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS   0x88FC\n#define GL_ANY_SAMPLES_PASSED             0x8C2F\n#define GL_SAMPLER_BINDING                0x8919\n#define GL_RGB10_A2UI                     0x906F\n#define GL_TEXTURE_SWIZZLE_R              0x8E42\n#define GL_TEXTURE_SWIZZLE_G              0x8E43\n#define GL_TEXTURE_SWIZZLE_B              0x8E44\n#define GL_TEXTURE_SWIZZLE_A              0x8E45\n#define GL_TEXTURE_SWIZZLE_RGBA           0x8E46\n#define GL_TIME_ELAPSED                   0x88BF\n#define GL_TIMESTAMP                      0x8E28\n#define GL_INT_2_10_10_10_REV             0x8D9F\ntypedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);\ntypedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);\ntypedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);\ntypedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);\ntypedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param);\ntypedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value);\ntypedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color);\ntypedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color);\ntypedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color);\ntypedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);\nGLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name);\nGLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);\nGLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);\nGLAPI GLboolean APIENTRY glIsSampler (GLuint sampler);\nGLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler);\nGLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);\nGLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);\nGLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);\nGLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param);\nGLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param);\nGLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target);\nGLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params);\nGLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params);\nGLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);\nGLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\nGLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\nGLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\nGLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\nGLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value);\nGLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value);\nGLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value);\nGLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value);\nGLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value);\nGLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value);\nGLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords);\nGLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords);\nGLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords);\nGLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords);\nGLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color);\nGLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color);\nGLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color);\nGLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color);\nGLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color);\nGLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color);\n#endif\n#endif /* GL_VERSION_3_3 */\n\n#ifndef GL_VERSION_4_0\n#define GL_VERSION_4_0 1\n#define GL_SAMPLE_SHADING                 0x8C36\n#define GL_MIN_SAMPLE_SHADING_VALUE       0x8C37\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F\n#define GL_TEXTURE_CUBE_MAP_ARRAY         0x9009\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY   0x900B\n#define GL_SAMPLER_CUBE_MAP_ARRAY         0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW  0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY     0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F\n#define GL_DRAW_INDIRECT_BUFFER           0x8F3F\n#define GL_DRAW_INDIRECT_BUFFER_BINDING   0x8F43\n#define GL_GEOMETRY_SHADER_INVOCATIONS    0x887F\n#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A\n#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B\n#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C\n#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D\n#define GL_MAX_VERTEX_STREAMS             0x8E71\n#define GL_DOUBLE_VEC2                    0x8FFC\n#define GL_DOUBLE_VEC3                    0x8FFD\n#define GL_DOUBLE_VEC4                    0x8FFE\n#define GL_DOUBLE_MAT2                    0x8F46\n#define GL_DOUBLE_MAT3                    0x8F47\n#define GL_DOUBLE_MAT4                    0x8F48\n#define GL_DOUBLE_MAT2x3                  0x8F49\n#define GL_DOUBLE_MAT2x4                  0x8F4A\n#define GL_DOUBLE_MAT3x2                  0x8F4B\n#define GL_DOUBLE_MAT3x4                  0x8F4C\n#define GL_DOUBLE_MAT4x2                  0x8F4D\n#define GL_DOUBLE_MAT4x3                  0x8F4E\n#define GL_ACTIVE_SUBROUTINES             0x8DE5\n#define GL_ACTIVE_SUBROUTINE_UNIFORMS     0x8DE6\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47\n#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH   0x8E48\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49\n#define GL_MAX_SUBROUTINES                0x8DE7\n#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8\n#define GL_NUM_COMPATIBLE_SUBROUTINES     0x8E4A\n#define GL_COMPATIBLE_SUBROUTINES         0x8E4B\n#define GL_PATCHES                        0x000E\n#define GL_PATCH_VERTICES                 0x8E72\n#define GL_PATCH_DEFAULT_INNER_LEVEL      0x8E73\n#define GL_PATCH_DEFAULT_OUTER_LEVEL      0x8E74\n#define GL_TESS_CONTROL_OUTPUT_VERTICES   0x8E75\n#define GL_TESS_GEN_MODE                  0x8E76\n#define GL_TESS_GEN_SPACING               0x8E77\n#define GL_TESS_GEN_VERTEX_ORDER          0x8E78\n#define GL_TESS_GEN_POINT_MODE            0x8E79\n#define GL_ISOLINES                       0x8E7A\n#define GL_FRACTIONAL_ODD                 0x8E7B\n#define GL_FRACTIONAL_EVEN                0x8E7C\n#define GL_MAX_PATCH_VERTICES             0x8E7D\n#define GL_MAX_TESS_GEN_LEVEL             0x8E7E\n#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F\n#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80\n#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81\n#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82\n#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83\n#define GL_MAX_TESS_PATCH_COMPONENTS      0x8E84\n#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85\n#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86\n#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89\n#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A\n#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C\n#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D\n#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E\n#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1\n#define GL_TESS_EVALUATION_SHADER         0x8E87\n#define GL_TESS_CONTROL_SHADER            0x8E88\n#define GL_TRANSFORM_FEEDBACK             0x8E22\n#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23\n#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24\n#define GL_TRANSFORM_FEEDBACK_BINDING     0x8E25\n#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70\ntypedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\ntypedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\ntypedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect);\ntypedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x);\ntypedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params);\ntypedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name);\ntypedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);\ntypedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);\ntypedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);\ntypedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices);\ntypedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values);\ntypedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value);\ntypedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values);\ntypedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);\ntypedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);\ntypedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);\ntypedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);\ntypedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);\ntypedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id);\ntypedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream);\ntypedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id);\ntypedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index);\ntypedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMinSampleShading (GLfloat value);\nGLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode);\nGLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\nGLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst);\nGLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\nGLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect);\nGLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect);\nGLAPI void APIENTRY glUniform1d (GLint location, GLdouble x);\nGLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params);\nGLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name);\nGLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name);\nGLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);\nGLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);\nGLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);\nGLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices);\nGLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params);\nGLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values);\nGLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value);\nGLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values);\nGLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id);\nGLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);\nGLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);\nGLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id);\nGLAPI void APIENTRY glPauseTransformFeedback (void);\nGLAPI void APIENTRY glResumeTransformFeedback (void);\nGLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id);\nGLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream);\nGLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id);\nGLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index);\nGLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params);\n#endif\n#endif /* GL_VERSION_4_0 */\n\n#ifndef GL_VERSION_4_1\n#define GL_VERSION_4_1 1\n#define GL_FIXED                          0x140C\n#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A\n#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B\n#define GL_LOW_FLOAT                      0x8DF0\n#define GL_MEDIUM_FLOAT                   0x8DF1\n#define GL_HIGH_FLOAT                     0x8DF2\n#define GL_LOW_INT                        0x8DF3\n#define GL_MEDIUM_INT                     0x8DF4\n#define GL_HIGH_INT                       0x8DF5\n#define GL_SHADER_COMPILER                0x8DFA\n#define GL_SHADER_BINARY_FORMATS          0x8DF8\n#define GL_NUM_SHADER_BINARY_FORMATS      0x8DF9\n#define GL_MAX_VERTEX_UNIFORM_VECTORS     0x8DFB\n#define GL_MAX_VARYING_VECTORS            0x8DFC\n#define GL_MAX_FRAGMENT_UNIFORM_VECTORS   0x8DFD\n#define GL_RGB565                         0x8D62\n#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257\n#define GL_PROGRAM_BINARY_LENGTH          0x8741\n#define GL_NUM_PROGRAM_BINARY_FORMATS     0x87FE\n#define GL_PROGRAM_BINARY_FORMATS         0x87FF\n#define GL_VERTEX_SHADER_BIT              0x00000001\n#define GL_FRAGMENT_SHADER_BIT            0x00000002\n#define GL_GEOMETRY_SHADER_BIT            0x00000004\n#define GL_TESS_CONTROL_SHADER_BIT        0x00000008\n#define GL_TESS_EVALUATION_SHADER_BIT     0x00000010\n#define GL_ALL_SHADER_BITS                0xFFFFFFFF\n#define GL_PROGRAM_SEPARABLE              0x8258\n#define GL_ACTIVE_PROGRAM                 0x8259\n#define GL_PROGRAM_PIPELINE_BINDING       0x825A\n#define GL_MAX_VIEWPORTS                  0x825B\n#define GL_VIEWPORT_SUBPIXEL_BITS         0x825C\n#define GL_VIEWPORT_BOUNDS_RANGE          0x825D\n#define GL_LAYER_PROVOKING_VERTEX         0x825E\n#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F\n#define GL_UNDEFINED_VERTEX               0x8260\ntypedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);\ntypedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);\ntypedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);\ntypedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);\ntypedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);\ntypedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);\ntypedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);\ntypedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);\ntypedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);\ntypedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings);\ntypedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);\ntypedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines);\ntypedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines);\ntypedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);\ntypedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);\ntypedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params);\ntypedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);\ntypedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v);\ntypedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f);\ntypedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data);\ntypedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glReleaseShaderCompiler (void);\nGLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);\nGLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);\nGLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f);\nGLAPI void APIENTRY glClearDepthf (GLfloat d);\nGLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);\nGLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);\nGLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);\nGLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);\nGLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);\nGLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings);\nGLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline);\nGLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);\nGLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);\nGLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline);\nGLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);\nGLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);\nGLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);\nGLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0);\nGLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);\nGLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);\nGLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);\nGLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1);\nGLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);\nGLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);\nGLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);\nGLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline);\nGLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\nGLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x);\nGLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params);\nGLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v);\nGLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);\nGLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v);\nGLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v);\nGLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f);\nGLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data);\nGLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data);\n#endif\n#endif /* GL_VERSION_4_1 */\n\n#ifndef GL_VERSION_4_2\n#define GL_VERSION_4_2 1\n#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH  0x9127\n#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128\n#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH  0x9129\n#define GL_UNPACK_COMPRESSED_BLOCK_SIZE   0x912A\n#define GL_PACK_COMPRESSED_BLOCK_WIDTH    0x912B\n#define GL_PACK_COMPRESSED_BLOCK_HEIGHT   0x912C\n#define GL_PACK_COMPRESSED_BLOCK_DEPTH    0x912D\n#define GL_PACK_COMPRESSED_BLOCK_SIZE     0x912E\n#define GL_NUM_SAMPLE_COUNTS              0x9380\n#define GL_MIN_MAP_BUFFER_ALIGNMENT       0x90BC\n#define GL_ATOMIC_COUNTER_BUFFER          0x92C0\n#define GL_ATOMIC_COUNTER_BUFFER_BINDING  0x92C1\n#define GL_ATOMIC_COUNTER_BUFFER_START    0x92C2\n#define GL_ATOMIC_COUNTER_BUFFER_SIZE     0x92C3\n#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB\n#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0\n#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1\n#define GL_MAX_VERTEX_ATOMIC_COUNTERS     0x92D2\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS   0x92D5\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS   0x92D6\n#define GL_MAX_COMBINED_ATOMIC_COUNTERS   0x92D7\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC\n#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS  0x92D9\n#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA\n#define GL_UNSIGNED_INT_ATOMIC_COUNTER    0x92DB\n#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001\n#define GL_ELEMENT_ARRAY_BARRIER_BIT      0x00000002\n#define GL_UNIFORM_BARRIER_BIT            0x00000004\n#define GL_TEXTURE_FETCH_BARRIER_BIT      0x00000008\n#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020\n#define GL_COMMAND_BARRIER_BIT            0x00000040\n#define GL_PIXEL_BUFFER_BARRIER_BIT       0x00000080\n#define GL_TEXTURE_UPDATE_BARRIER_BIT     0x00000100\n#define GL_BUFFER_UPDATE_BARRIER_BIT      0x00000200\n#define GL_FRAMEBUFFER_BARRIER_BIT        0x00000400\n#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800\n#define GL_ATOMIC_COUNTER_BARRIER_BIT     0x00001000\n#define GL_ALL_BARRIER_BITS               0xFFFFFFFF\n#define GL_MAX_IMAGE_UNITS                0x8F38\n#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39\n#define GL_IMAGE_BINDING_NAME             0x8F3A\n#define GL_IMAGE_BINDING_LEVEL            0x8F3B\n#define GL_IMAGE_BINDING_LAYERED          0x8F3C\n#define GL_IMAGE_BINDING_LAYER            0x8F3D\n#define GL_IMAGE_BINDING_ACCESS           0x8F3E\n#define GL_IMAGE_1D                       0x904C\n#define GL_IMAGE_2D                       0x904D\n#define GL_IMAGE_3D                       0x904E\n#define GL_IMAGE_2D_RECT                  0x904F\n#define GL_IMAGE_CUBE                     0x9050\n#define GL_IMAGE_BUFFER                   0x9051\n#define GL_IMAGE_1D_ARRAY                 0x9052\n#define GL_IMAGE_2D_ARRAY                 0x9053\n#define GL_IMAGE_CUBE_MAP_ARRAY           0x9054\n#define GL_IMAGE_2D_MULTISAMPLE           0x9055\n#define GL_IMAGE_2D_MULTISAMPLE_ARRAY     0x9056\n#define GL_INT_IMAGE_1D                   0x9057\n#define GL_INT_IMAGE_2D                   0x9058\n#define GL_INT_IMAGE_3D                   0x9059\n#define GL_INT_IMAGE_2D_RECT              0x905A\n#define GL_INT_IMAGE_CUBE                 0x905B\n#define GL_INT_IMAGE_BUFFER               0x905C\n#define GL_INT_IMAGE_1D_ARRAY             0x905D\n#define GL_INT_IMAGE_2D_ARRAY             0x905E\n#define GL_INT_IMAGE_CUBE_MAP_ARRAY       0x905F\n#define GL_INT_IMAGE_2D_MULTISAMPLE       0x9060\n#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061\n#define GL_UNSIGNED_INT_IMAGE_1D          0x9062\n#define GL_UNSIGNED_INT_IMAGE_2D          0x9063\n#define GL_UNSIGNED_INT_IMAGE_3D          0x9064\n#define GL_UNSIGNED_INT_IMAGE_2D_RECT     0x9065\n#define GL_UNSIGNED_INT_IMAGE_CUBE        0x9066\n#define GL_UNSIGNED_INT_IMAGE_BUFFER      0x9067\n#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY    0x9068\n#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY    0x9069\n#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C\n#define GL_MAX_IMAGE_SAMPLES              0x906D\n#define GL_IMAGE_BINDING_FORMAT           0x906E\n#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9\n#define GL_MAX_VERTEX_IMAGE_UNIFORMS      0x90CA\n#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB\n#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC\n#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS    0x90CD\n#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS    0x90CE\n#define GL_MAX_COMBINED_IMAGE_UNIFORMS    0x90CF\n#define GL_COMPRESSED_RGBA_BPTC_UNORM     0x8E8C\n#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D\n#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E\n#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F\n#define GL_TEXTURE_IMMUTABLE_FORMAT       0x912F\ntypedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);\ntypedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);\ntypedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);\ntypedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);\ntypedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\ntypedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\ntypedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount);\ntypedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);\nGLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);\nGLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);\nGLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);\nGLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);\nGLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);\nGLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers);\nGLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\nGLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\nGLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount);\nGLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);\n#endif\n#endif /* GL_VERSION_4_2 */\n\n#ifndef GL_VERSION_4_3\n#define GL_VERSION_4_3 1\ntypedef void (APIENTRY  *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\n#define GL_NUM_SHADING_LANGUAGE_VERSIONS  0x82E9\n#define GL_VERTEX_ATTRIB_ARRAY_LONG       0x874E\n#define GL_COMPRESSED_RGB8_ETC2           0x9274\n#define GL_COMPRESSED_SRGB8_ETC2          0x9275\n#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276\n#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277\n#define GL_COMPRESSED_RGBA8_ETC2_EAC      0x9278\n#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279\n#define GL_COMPRESSED_R11_EAC             0x9270\n#define GL_COMPRESSED_SIGNED_R11_EAC      0x9271\n#define GL_COMPRESSED_RG11_EAC            0x9272\n#define GL_COMPRESSED_SIGNED_RG11_EAC     0x9273\n#define GL_PRIMITIVE_RESTART_FIXED_INDEX  0x8D69\n#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A\n#define GL_MAX_ELEMENT_INDEX              0x8D6B\n#define GL_COMPUTE_SHADER                 0x91B9\n#define GL_MAX_COMPUTE_UNIFORM_BLOCKS     0x91BB\n#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC\n#define GL_MAX_COMPUTE_IMAGE_UNIFORMS     0x91BD\n#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262\n#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263\n#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264\n#define GL_MAX_COMPUTE_ATOMIC_COUNTERS    0x8265\n#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266\n#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB\n#define GL_MAX_COMPUTE_WORK_GROUP_COUNT   0x91BE\n#define GL_MAX_COMPUTE_WORK_GROUP_SIZE    0x91BF\n#define GL_COMPUTE_WORK_GROUP_SIZE        0x8267\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED\n#define GL_DISPATCH_INDIRECT_BUFFER       0x90EE\n#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS       0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION        0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM      0x8245\n#define GL_DEBUG_SOURCE_API               0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM     0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER   0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY       0x8249\n#define GL_DEBUG_SOURCE_APPLICATION       0x824A\n#define GL_DEBUG_SOURCE_OTHER             0x824B\n#define GL_DEBUG_TYPE_ERROR               0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR  0x824E\n#define GL_DEBUG_TYPE_PORTABILITY         0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE         0x8250\n#define GL_DEBUG_TYPE_OTHER               0x8251\n#define GL_MAX_DEBUG_MESSAGE_LENGTH       0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES      0x9144\n#define GL_DEBUG_LOGGED_MESSAGES          0x9145\n#define GL_DEBUG_SEVERITY_HIGH            0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM          0x9147\n#define GL_DEBUG_SEVERITY_LOW             0x9148\n#define GL_DEBUG_TYPE_MARKER              0x8268\n#define GL_DEBUG_TYPE_PUSH_GROUP          0x8269\n#define GL_DEBUG_TYPE_POP_GROUP           0x826A\n#define GL_DEBUG_SEVERITY_NOTIFICATION    0x826B\n#define GL_MAX_DEBUG_GROUP_STACK_DEPTH    0x826C\n#define GL_DEBUG_GROUP_STACK_DEPTH        0x826D\n#define GL_BUFFER                         0x82E0\n#define GL_SHADER                         0x82E1\n#define GL_PROGRAM                        0x82E2\n#define GL_QUERY                          0x82E3\n#define GL_PROGRAM_PIPELINE               0x82E4\n#define GL_SAMPLER                        0x82E6\n#define GL_MAX_LABEL_LENGTH               0x82E8\n#define GL_DEBUG_OUTPUT                   0x92E0\n#define GL_CONTEXT_FLAG_DEBUG_BIT         0x00000002\n#define GL_MAX_UNIFORM_LOCATIONS          0x826E\n#define GL_FRAMEBUFFER_DEFAULT_WIDTH      0x9310\n#define GL_FRAMEBUFFER_DEFAULT_HEIGHT     0x9311\n#define GL_FRAMEBUFFER_DEFAULT_LAYERS     0x9312\n#define GL_FRAMEBUFFER_DEFAULT_SAMPLES    0x9313\n#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314\n#define GL_MAX_FRAMEBUFFER_WIDTH          0x9315\n#define GL_MAX_FRAMEBUFFER_HEIGHT         0x9316\n#define GL_MAX_FRAMEBUFFER_LAYERS         0x9317\n#define GL_MAX_FRAMEBUFFER_SAMPLES        0x9318\n#define GL_INTERNALFORMAT_SUPPORTED       0x826F\n#define GL_INTERNALFORMAT_PREFERRED       0x8270\n#define GL_INTERNALFORMAT_RED_SIZE        0x8271\n#define GL_INTERNALFORMAT_GREEN_SIZE      0x8272\n#define GL_INTERNALFORMAT_BLUE_SIZE       0x8273\n#define GL_INTERNALFORMAT_ALPHA_SIZE      0x8274\n#define GL_INTERNALFORMAT_DEPTH_SIZE      0x8275\n#define GL_INTERNALFORMAT_STENCIL_SIZE    0x8276\n#define GL_INTERNALFORMAT_SHARED_SIZE     0x8277\n#define GL_INTERNALFORMAT_RED_TYPE        0x8278\n#define GL_INTERNALFORMAT_GREEN_TYPE      0x8279\n#define GL_INTERNALFORMAT_BLUE_TYPE       0x827A\n#define GL_INTERNALFORMAT_ALPHA_TYPE      0x827B\n#define GL_INTERNALFORMAT_DEPTH_TYPE      0x827C\n#define GL_INTERNALFORMAT_STENCIL_TYPE    0x827D\n#define GL_MAX_WIDTH                      0x827E\n#define GL_MAX_HEIGHT                     0x827F\n#define GL_MAX_DEPTH                      0x8280\n#define GL_MAX_LAYERS                     0x8281\n#define GL_MAX_COMBINED_DIMENSIONS        0x8282\n#define GL_COLOR_COMPONENTS               0x8283\n#define GL_DEPTH_COMPONENTS               0x8284\n#define GL_STENCIL_COMPONENTS             0x8285\n#define GL_COLOR_RENDERABLE               0x8286\n#define GL_DEPTH_RENDERABLE               0x8287\n#define GL_STENCIL_RENDERABLE             0x8288\n#define GL_FRAMEBUFFER_RENDERABLE         0x8289\n#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A\n#define GL_FRAMEBUFFER_BLEND              0x828B\n#define GL_READ_PIXELS                    0x828C\n#define GL_READ_PIXELS_FORMAT             0x828D\n#define GL_READ_PIXELS_TYPE               0x828E\n#define GL_TEXTURE_IMAGE_FORMAT           0x828F\n#define GL_TEXTURE_IMAGE_TYPE             0x8290\n#define GL_GET_TEXTURE_IMAGE_FORMAT       0x8291\n#define GL_GET_TEXTURE_IMAGE_TYPE         0x8292\n#define GL_MIPMAP                         0x8293\n#define GL_MANUAL_GENERATE_MIPMAP         0x8294\n#define GL_AUTO_GENERATE_MIPMAP           0x8295\n#define GL_COLOR_ENCODING                 0x8296\n#define GL_SRGB_READ                      0x8297\n#define GL_SRGB_WRITE                     0x8298\n#define GL_FILTER                         0x829A\n#define GL_VERTEX_TEXTURE                 0x829B\n#define GL_TESS_CONTROL_TEXTURE           0x829C\n#define GL_TESS_EVALUATION_TEXTURE        0x829D\n#define GL_GEOMETRY_TEXTURE               0x829E\n#define GL_FRAGMENT_TEXTURE               0x829F\n#define GL_COMPUTE_TEXTURE                0x82A0\n#define GL_TEXTURE_SHADOW                 0x82A1\n#define GL_TEXTURE_GATHER                 0x82A2\n#define GL_TEXTURE_GATHER_SHADOW          0x82A3\n#define GL_SHADER_IMAGE_LOAD              0x82A4\n#define GL_SHADER_IMAGE_STORE             0x82A5\n#define GL_SHADER_IMAGE_ATOMIC            0x82A6\n#define GL_IMAGE_TEXEL_SIZE               0x82A7\n#define GL_IMAGE_COMPATIBILITY_CLASS      0x82A8\n#define GL_IMAGE_PIXEL_FORMAT             0x82A9\n#define GL_IMAGE_PIXEL_TYPE               0x82AA\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF\n#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1\n#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2\n#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE  0x82B3\n#define GL_CLEAR_BUFFER                   0x82B4\n#define GL_TEXTURE_VIEW                   0x82B5\n#define GL_VIEW_COMPATIBILITY_CLASS       0x82B6\n#define GL_FULL_SUPPORT                   0x82B7\n#define GL_CAVEAT_SUPPORT                 0x82B8\n#define GL_IMAGE_CLASS_4_X_32             0x82B9\n#define GL_IMAGE_CLASS_2_X_32             0x82BA\n#define GL_IMAGE_CLASS_1_X_32             0x82BB\n#define GL_IMAGE_CLASS_4_X_16             0x82BC\n#define GL_IMAGE_CLASS_2_X_16             0x82BD\n#define GL_IMAGE_CLASS_1_X_16             0x82BE\n#define GL_IMAGE_CLASS_4_X_8              0x82BF\n#define GL_IMAGE_CLASS_2_X_8              0x82C0\n#define GL_IMAGE_CLASS_1_X_8              0x82C1\n#define GL_IMAGE_CLASS_11_11_10           0x82C2\n#define GL_IMAGE_CLASS_10_10_10_2         0x82C3\n#define GL_VIEW_CLASS_128_BITS            0x82C4\n#define GL_VIEW_CLASS_96_BITS             0x82C5\n#define GL_VIEW_CLASS_64_BITS             0x82C6\n#define GL_VIEW_CLASS_48_BITS             0x82C7\n#define GL_VIEW_CLASS_32_BITS             0x82C8\n#define GL_VIEW_CLASS_24_BITS             0x82C9\n#define GL_VIEW_CLASS_16_BITS             0x82CA\n#define GL_VIEW_CLASS_8_BITS              0x82CB\n#define GL_VIEW_CLASS_S3TC_DXT1_RGB       0x82CC\n#define GL_VIEW_CLASS_S3TC_DXT1_RGBA      0x82CD\n#define GL_VIEW_CLASS_S3TC_DXT3_RGBA      0x82CE\n#define GL_VIEW_CLASS_S3TC_DXT5_RGBA      0x82CF\n#define GL_VIEW_CLASS_RGTC1_RED           0x82D0\n#define GL_VIEW_CLASS_RGTC2_RG            0x82D1\n#define GL_VIEW_CLASS_BPTC_UNORM          0x82D2\n#define GL_VIEW_CLASS_BPTC_FLOAT          0x82D3\n#define GL_UNIFORM                        0x92E1\n#define GL_UNIFORM_BLOCK                  0x92E2\n#define GL_PROGRAM_INPUT                  0x92E3\n#define GL_PROGRAM_OUTPUT                 0x92E4\n#define GL_BUFFER_VARIABLE                0x92E5\n#define GL_SHADER_STORAGE_BLOCK           0x92E6\n#define GL_VERTEX_SUBROUTINE              0x92E8\n#define GL_TESS_CONTROL_SUBROUTINE        0x92E9\n#define GL_TESS_EVALUATION_SUBROUTINE     0x92EA\n#define GL_GEOMETRY_SUBROUTINE            0x92EB\n#define GL_FRAGMENT_SUBROUTINE            0x92EC\n#define GL_COMPUTE_SUBROUTINE             0x92ED\n#define GL_VERTEX_SUBROUTINE_UNIFORM      0x92EE\n#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF\n#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0\n#define GL_GEOMETRY_SUBROUTINE_UNIFORM    0x92F1\n#define GL_FRAGMENT_SUBROUTINE_UNIFORM    0x92F2\n#define GL_COMPUTE_SUBROUTINE_UNIFORM     0x92F3\n#define GL_TRANSFORM_FEEDBACK_VARYING     0x92F4\n#define GL_ACTIVE_RESOURCES               0x92F5\n#define GL_MAX_NAME_LENGTH                0x92F6\n#define GL_MAX_NUM_ACTIVE_VARIABLES       0x92F7\n#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8\n#define GL_NAME_LENGTH                    0x92F9\n#define GL_TYPE                           0x92FA\n#define GL_ARRAY_SIZE                     0x92FB\n#define GL_OFFSET                         0x92FC\n#define GL_BLOCK_INDEX                    0x92FD\n#define GL_ARRAY_STRIDE                   0x92FE\n#define GL_MATRIX_STRIDE                  0x92FF\n#define GL_IS_ROW_MAJOR                   0x9300\n#define GL_ATOMIC_COUNTER_BUFFER_INDEX    0x9301\n#define GL_BUFFER_BINDING                 0x9302\n#define GL_BUFFER_DATA_SIZE               0x9303\n#define GL_NUM_ACTIVE_VARIABLES           0x9304\n#define GL_ACTIVE_VARIABLES               0x9305\n#define GL_REFERENCED_BY_VERTEX_SHADER    0x9306\n#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307\n#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308\n#define GL_REFERENCED_BY_GEOMETRY_SHADER  0x9309\n#define GL_REFERENCED_BY_FRAGMENT_SHADER  0x930A\n#define GL_REFERENCED_BY_COMPUTE_SHADER   0x930B\n#define GL_TOP_LEVEL_ARRAY_SIZE           0x930C\n#define GL_TOP_LEVEL_ARRAY_STRIDE         0x930D\n#define GL_LOCATION                       0x930E\n#define GL_LOCATION_INDEX                 0x930F\n#define GL_IS_PER_PATCH                   0x92E7\n#define GL_SHADER_STORAGE_BUFFER          0x90D2\n#define GL_SHADER_STORAGE_BUFFER_BINDING  0x90D3\n#define GL_SHADER_STORAGE_BUFFER_START    0x90D4\n#define GL_SHADER_STORAGE_BUFFER_SIZE     0x90D5\n#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6\n#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7\n#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8\n#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9\n#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA\n#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB\n#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC\n#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD\n#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE  0x90DE\n#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF\n#define GL_SHADER_STORAGE_BARRIER_BIT     0x00002000\n#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39\n#define GL_DEPTH_STENCIL_TEXTURE_MODE     0x90EA\n#define GL_TEXTURE_BUFFER_OFFSET          0x919D\n#define GL_TEXTURE_BUFFER_SIZE            0x919E\n#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F\n#define GL_TEXTURE_VIEW_MIN_LEVEL         0x82DB\n#define GL_TEXTURE_VIEW_NUM_LEVELS        0x82DC\n#define GL_TEXTURE_VIEW_MIN_LAYER         0x82DD\n#define GL_TEXTURE_VIEW_NUM_LAYERS        0x82DE\n#define GL_TEXTURE_IMMUTABLE_LEVELS       0x82DF\n#define GL_VERTEX_ATTRIB_BINDING          0x82D4\n#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET  0x82D5\n#define GL_VERTEX_BINDING_DIVISOR         0x82D6\n#define GL_VERTEX_BINDING_OFFSET          0x82D7\n#define GL_VERTEX_BINDING_STRIDE          0x82D8\n#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9\n#define GL_MAX_VERTEX_ATTRIB_BINDINGS     0x82DA\n#define GL_VERTEX_BINDING_BUFFER          0x8F4F\n#define GL_DISPLAY_LIST                   0x82E7\ntypedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);\ntypedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect);\ntypedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);\ntypedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);\ntypedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);\ntypedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);\ntypedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);\ntypedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params);\ntypedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);\ntypedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);\ntypedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name);\ntypedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);\ntypedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);\ntypedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);\ntypedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);\ntypedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);\ntypedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\ntypedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);\ntypedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void);\ntypedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);\ntypedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);\ntypedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label);\ntypedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);\nGLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect);\nGLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);\nGLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);\nGLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);\nGLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level);\nGLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length);\nGLAPI void APIENTRY glInvalidateBufferData (GLuint buffer);\nGLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);\nGLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);\nGLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);\nGLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);\nGLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);\nGLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);\nGLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);\nGLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);\nGLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name);\nGLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);\nGLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);\nGLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\nGLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);\nGLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);\nGLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\nGLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\nGLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam);\nGLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\nGLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message);\nGLAPI void APIENTRY glPopDebugGroup (void);\nGLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);\nGLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);\nGLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label);\nGLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);\n#endif\n#endif /* GL_VERSION_4_3 */\n\n#ifndef GL_VERSION_4_4\n#define GL_VERSION_4_4 1\n#define GL_MAX_VERTEX_ATTRIB_STRIDE       0x82E5\n#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221\n#define GL_TEXTURE_BUFFER_BINDING         0x8C2A\n#define GL_MAP_PERSISTENT_BIT             0x0040\n#define GL_MAP_COHERENT_BIT               0x0080\n#define GL_DYNAMIC_STORAGE_BIT            0x0100\n#define GL_CLIENT_STORAGE_BIT             0x0200\n#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000\n#define GL_BUFFER_IMMUTABLE_STORAGE       0x821F\n#define GL_BUFFER_STORAGE_FLAGS           0x8220\n#define GL_CLEAR_TEXTURE                  0x9365\n#define GL_LOCATION_COMPONENT             0x934A\n#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B\n#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C\n#define GL_QUERY_BUFFER                   0x9192\n#define GL_QUERY_BUFFER_BARRIER_BIT       0x00008000\n#define GL_QUERY_BUFFER_BINDING           0x9193\n#define GL_QUERY_RESULT_NO_WAIT           0x9194\n#define GL_MIRROR_CLAMP_TO_EDGE           0x8743\ntypedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);\ntypedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers);\ntypedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);\ntypedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures);\ntypedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers);\ntypedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures);\ntypedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);\nGLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers);\nGLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);\nGLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures);\nGLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers);\nGLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures);\nGLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);\n#endif\n#endif /* GL_VERSION_4_4 */\n\n#ifndef GL_ARB_ES2_compatibility\n#define GL_ARB_ES2_compatibility 1\n#endif /* GL_ARB_ES2_compatibility */\n\n#ifndef GL_ARB_ES3_compatibility\n#define GL_ARB_ES3_compatibility 1\n#endif /* GL_ARB_ES3_compatibility */\n\n#ifndef GL_ARB_arrays_of_arrays\n#define GL_ARB_arrays_of_arrays 1\n#endif /* GL_ARB_arrays_of_arrays */\n\n#ifndef GL_ARB_base_instance\n#define GL_ARB_base_instance 1\n#endif /* GL_ARB_base_instance */\n\n#ifndef GL_ARB_bindless_texture\n#define GL_ARB_bindless_texture 1\ntypedef uint64_t GLuint64EXT;\n#define GL_UNSIGNED_INT64_ARB             0x140F\ntypedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture);\ntypedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler);\ntypedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle);\ntypedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle);\ntypedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);\ntypedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access);\ntypedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle);\ntypedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value);\ntypedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values);\ntypedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle);\ntypedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture);\nGLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler);\nGLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle);\nGLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle);\nGLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);\nGLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access);\nGLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle);\nGLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value);\nGLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value);\nGLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value);\nGLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values);\nGLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle);\nGLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle);\nGLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x);\nGLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v);\nGLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params);\n#endif\n#endif /* GL_ARB_bindless_texture */\n\n#ifndef GL_ARB_blend_func_extended\n#define GL_ARB_blend_func_extended 1\n#endif /* GL_ARB_blend_func_extended */\n\n#ifndef GL_ARB_buffer_storage\n#define GL_ARB_buffer_storage 1\n#endif /* GL_ARB_buffer_storage */\n\n#ifndef GL_ARB_cl_event\n#define GL_ARB_cl_event 1\nstruct _cl_context;\nstruct _cl_event;\n#define GL_SYNC_CL_EVENT_ARB              0x8240\n#define GL_SYNC_CL_EVENT_COMPLETE_ARB     0x8241\ntypedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags);\n#endif\n#endif /* GL_ARB_cl_event */\n\n#ifndef GL_ARB_clear_buffer_object\n#define GL_ARB_clear_buffer_object 1\n#endif /* GL_ARB_clear_buffer_object */\n\n#ifndef GL_ARB_clear_texture\n#define GL_ARB_clear_texture 1\n#endif /* GL_ARB_clear_texture */\n\n#ifndef GL_ARB_color_buffer_float\n#define GL_ARB_color_buffer_float 1\n#define GL_RGBA_FLOAT_MODE_ARB            0x8820\n#define GL_CLAMP_VERTEX_COLOR_ARB         0x891A\n#define GL_CLAMP_FRAGMENT_COLOR_ARB       0x891B\n#define GL_CLAMP_READ_COLOR_ARB           0x891C\n#define GL_FIXED_ONLY_ARB                 0x891D\ntypedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp);\n#endif\n#endif /* GL_ARB_color_buffer_float */\n\n#ifndef GL_ARB_compatibility\n#define GL_ARB_compatibility 1\n#endif /* GL_ARB_compatibility */\n\n#ifndef GL_ARB_compressed_texture_pixel_storage\n#define GL_ARB_compressed_texture_pixel_storage 1\n#endif /* GL_ARB_compressed_texture_pixel_storage */\n\n#ifndef GL_ARB_compute_shader\n#define GL_ARB_compute_shader 1\n#define GL_COMPUTE_SHADER_BIT             0x00000020\n#endif /* GL_ARB_compute_shader */\n\n#ifndef GL_ARB_compute_variable_group_size\n#define GL_ARB_compute_variable_group_size 1\n#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344\n#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB\n#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345\n#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF\ntypedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z);\n#endif\n#endif /* GL_ARB_compute_variable_group_size */\n\n#ifndef GL_ARB_conservative_depth\n#define GL_ARB_conservative_depth 1\n#endif /* GL_ARB_conservative_depth */\n\n#ifndef GL_ARB_copy_buffer\n#define GL_ARB_copy_buffer 1\n#define GL_COPY_READ_BUFFER_BINDING       0x8F36\n#define GL_COPY_WRITE_BUFFER_BINDING      0x8F37\n#endif /* GL_ARB_copy_buffer */\n\n#ifndef GL_ARB_copy_image\n#define GL_ARB_copy_image 1\n#endif /* GL_ARB_copy_image */\n\n#ifndef GL_ARB_debug_output\n#define GL_ARB_debug_output 1\ntypedef void (APIENTRY  *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB   0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION_ARB    0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM_ARB  0x8245\n#define GL_DEBUG_SOURCE_API_ARB           0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB   0x8249\n#define GL_DEBUG_SOURCE_APPLICATION_ARB   0x824A\n#define GL_DEBUG_SOURCE_OTHER_ARB         0x824B\n#define GL_DEBUG_TYPE_ERROR_ARB           0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E\n#define GL_DEBUG_TYPE_PORTABILITY_ARB     0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE_ARB     0x8250\n#define GL_DEBUG_TYPE_OTHER_ARB           0x8251\n#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB   0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB  0x9144\n#define GL_DEBUG_LOGGED_MESSAGES_ARB      0x9145\n#define GL_DEBUG_SEVERITY_HIGH_ARB        0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM_ARB      0x9147\n#define GL_DEBUG_SEVERITY_LOW_ARB         0x9148\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam);\ntypedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\nGLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\nGLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam);\nGLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\n#endif\n#endif /* GL_ARB_debug_output */\n\n#ifndef GL_ARB_depth_buffer_float\n#define GL_ARB_depth_buffer_float 1\n#endif /* GL_ARB_depth_buffer_float */\n\n#ifndef GL_ARB_depth_clamp\n#define GL_ARB_depth_clamp 1\n#endif /* GL_ARB_depth_clamp */\n\n#ifndef GL_ARB_depth_texture\n#define GL_ARB_depth_texture 1\n#define GL_DEPTH_COMPONENT16_ARB          0x81A5\n#define GL_DEPTH_COMPONENT24_ARB          0x81A6\n#define GL_DEPTH_COMPONENT32_ARB          0x81A7\n#define GL_TEXTURE_DEPTH_SIZE_ARB         0x884A\n#define GL_DEPTH_TEXTURE_MODE_ARB         0x884B\n#endif /* GL_ARB_depth_texture */\n\n#ifndef GL_ARB_draw_buffers\n#define GL_ARB_draw_buffers 1\n#define GL_MAX_DRAW_BUFFERS_ARB           0x8824\n#define GL_DRAW_BUFFER0_ARB               0x8825\n#define GL_DRAW_BUFFER1_ARB               0x8826\n#define GL_DRAW_BUFFER2_ARB               0x8827\n#define GL_DRAW_BUFFER3_ARB               0x8828\n#define GL_DRAW_BUFFER4_ARB               0x8829\n#define GL_DRAW_BUFFER5_ARB               0x882A\n#define GL_DRAW_BUFFER6_ARB               0x882B\n#define GL_DRAW_BUFFER7_ARB               0x882C\n#define GL_DRAW_BUFFER8_ARB               0x882D\n#define GL_DRAW_BUFFER9_ARB               0x882E\n#define GL_DRAW_BUFFER10_ARB              0x882F\n#define GL_DRAW_BUFFER11_ARB              0x8830\n#define GL_DRAW_BUFFER12_ARB              0x8831\n#define GL_DRAW_BUFFER13_ARB              0x8832\n#define GL_DRAW_BUFFER14_ARB              0x8833\n#define GL_DRAW_BUFFER15_ARB              0x8834\ntypedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs);\n#endif\n#endif /* GL_ARB_draw_buffers */\n\n#ifndef GL_ARB_draw_buffers_blend\n#define GL_ARB_draw_buffers_blend 1\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\ntypedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst);\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode);\nGLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\nGLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst);\nGLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n#endif\n#endif /* GL_ARB_draw_buffers_blend */\n\n#ifndef GL_ARB_draw_elements_base_vertex\n#define GL_ARB_draw_elements_base_vertex 1\n#endif /* GL_ARB_draw_elements_base_vertex */\n\n#ifndef GL_ARB_draw_indirect\n#define GL_ARB_draw_indirect 1\n#endif /* GL_ARB_draw_indirect */\n\n#ifndef GL_ARB_draw_instanced\n#define GL_ARB_draw_instanced 1\ntypedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\nGLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);\n#endif\n#endif /* GL_ARB_draw_instanced */\n\n#ifndef GL_ARB_enhanced_layouts\n#define GL_ARB_enhanced_layouts 1\n#endif /* GL_ARB_enhanced_layouts */\n\n#ifndef GL_ARB_explicit_attrib_location\n#define GL_ARB_explicit_attrib_location 1\n#endif /* GL_ARB_explicit_attrib_location */\n\n#ifndef GL_ARB_explicit_uniform_location\n#define GL_ARB_explicit_uniform_location 1\n#endif /* GL_ARB_explicit_uniform_location */\n\n#ifndef GL_ARB_fragment_coord_conventions\n#define GL_ARB_fragment_coord_conventions 1\n#endif /* GL_ARB_fragment_coord_conventions */\n\n#ifndef GL_ARB_fragment_layer_viewport\n#define GL_ARB_fragment_layer_viewport 1\n#endif /* GL_ARB_fragment_layer_viewport */\n\n#ifndef GL_ARB_fragment_program\n#define GL_ARB_fragment_program 1\n#define GL_FRAGMENT_PROGRAM_ARB           0x8804\n#define GL_PROGRAM_FORMAT_ASCII_ARB       0x8875\n#define GL_PROGRAM_LENGTH_ARB             0x8627\n#define GL_PROGRAM_FORMAT_ARB             0x8876\n#define GL_PROGRAM_BINDING_ARB            0x8677\n#define GL_PROGRAM_INSTRUCTIONS_ARB       0x88A0\n#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB   0x88A1\n#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2\n#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3\n#define GL_PROGRAM_TEMPORARIES_ARB        0x88A4\n#define GL_MAX_PROGRAM_TEMPORARIES_ARB    0x88A5\n#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6\n#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7\n#define GL_PROGRAM_PARAMETERS_ARB         0x88A8\n#define GL_MAX_PROGRAM_PARAMETERS_ARB     0x88A9\n#define GL_PROGRAM_NATIVE_PARAMETERS_ARB  0x88AA\n#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB\n#define GL_PROGRAM_ATTRIBS_ARB            0x88AC\n#define GL_MAX_PROGRAM_ATTRIBS_ARB        0x88AD\n#define GL_PROGRAM_NATIVE_ATTRIBS_ARB     0x88AE\n#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF\n#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4\n#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5\n#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6\n#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB   0x8805\n#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB   0x8806\n#define GL_PROGRAM_TEX_INDIRECTIONS_ARB   0x8807\n#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808\n#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809\n#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A\n#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B\n#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C\n#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D\n#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E\n#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F\n#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810\n#define GL_PROGRAM_STRING_ARB             0x8628\n#define GL_PROGRAM_ERROR_POSITION_ARB     0x864B\n#define GL_CURRENT_MATRIX_ARB             0x8641\n#define GL_TRANSPOSE_CURRENT_MATRIX_ARB   0x88B7\n#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640\n#define GL_MAX_PROGRAM_MATRICES_ARB       0x862F\n#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E\n#define GL_MAX_TEXTURE_COORDS_ARB         0x8871\n#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB    0x8872\n#define GL_PROGRAM_ERROR_STRING_ARB       0x8874\n#define GL_MATRIX0_ARB                    0x88C0\n#define GL_MATRIX1_ARB                    0x88C1\n#define GL_MATRIX2_ARB                    0x88C2\n#define GL_MATRIX3_ARB                    0x88C3\n#define GL_MATRIX4_ARB                    0x88C4\n#define GL_MATRIX5_ARB                    0x88C5\n#define GL_MATRIX6_ARB                    0x88C6\n#define GL_MATRIX7_ARB                    0x88C7\n#define GL_MATRIX8_ARB                    0x88C8\n#define GL_MATRIX9_ARB                    0x88C9\n#define GL_MATRIX10_ARB                   0x88CA\n#define GL_MATRIX11_ARB                   0x88CB\n#define GL_MATRIX12_ARB                   0x88CC\n#define GL_MATRIX13_ARB                   0x88CD\n#define GL_MATRIX14_ARB                   0x88CE\n#define GL_MATRIX15_ARB                   0x88CF\n#define GL_MATRIX16_ARB                   0x88D0\n#define GL_MATRIX17_ARB                   0x88D1\n#define GL_MATRIX18_ARB                   0x88D2\n#define GL_MATRIX19_ARB                   0x88D3\n#define GL_MATRIX20_ARB                   0x88D4\n#define GL_MATRIX21_ARB                   0x88D5\n#define GL_MATRIX22_ARB                   0x88D6\n#define GL_MATRIX23_ARB                   0x88D7\n#define GL_MATRIX24_ARB                   0x88D8\n#define GL_MATRIX25_ARB                   0x88D9\n#define GL_MATRIX26_ARB                   0x88DA\n#define GL_MATRIX27_ARB                   0x88DB\n#define GL_MATRIX28_ARB                   0x88DC\n#define GL_MATRIX29_ARB                   0x88DD\n#define GL_MATRIX30_ARB                   0x88DE\n#define GL_MATRIX31_ARB                   0x88DF\ntypedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string);\ntypedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program);\ntypedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs);\ntypedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string);\ntypedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string);\nGLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program);\nGLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs);\nGLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs);\nGLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params);\nGLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params);\nGLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params);\nGLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params);\nGLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params);\nGLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params);\nGLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params);\nGLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params);\nGLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string);\nGLAPI GLboolean APIENTRY glIsProgramARB (GLuint program);\n#endif\n#endif /* GL_ARB_fragment_program */\n\n#ifndef GL_ARB_fragment_program_shadow\n#define GL_ARB_fragment_program_shadow 1\n#endif /* GL_ARB_fragment_program_shadow */\n\n#ifndef GL_ARB_fragment_shader\n#define GL_ARB_fragment_shader 1\n#define GL_FRAGMENT_SHADER_ARB            0x8B30\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B\n#endif /* GL_ARB_fragment_shader */\n\n#ifndef GL_ARB_framebuffer_no_attachments\n#define GL_ARB_framebuffer_no_attachments 1\n#endif /* GL_ARB_framebuffer_no_attachments */\n\n#ifndef GL_ARB_framebuffer_object\n#define GL_ARB_framebuffer_object 1\n#endif /* GL_ARB_framebuffer_object */\n\n#ifndef GL_ARB_framebuffer_sRGB\n#define GL_ARB_framebuffer_sRGB 1\n#endif /* GL_ARB_framebuffer_sRGB */\n\n#ifndef GL_KHR_context_flush_control\n#define GL_CONTEXT_RELEASE_BEHAVIOR       0x82FB\n#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC\n#endif /* GL_KHR_context_flush_control */\n\n#ifndef GL_ARB_geometry_shader4\n#define GL_ARB_geometry_shader4 1\n#define GL_LINES_ADJACENCY_ARB            0x000A\n#define GL_LINE_STRIP_ADJACENCY_ARB       0x000B\n#define GL_TRIANGLES_ADJACENCY_ARB        0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY_ARB   0x000D\n#define GL_PROGRAM_POINT_SIZE_ARB         0x8642\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9\n#define GL_GEOMETRY_SHADER_ARB            0x8DD9\n#define GL_GEOMETRY_VERTICES_OUT_ARB      0x8DDA\n#define GL_GEOMETRY_INPUT_TYPE_ARB        0x8DDB\n#define GL_GEOMETRY_OUTPUT_TYPE_ARB       0x8DDC\n#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD\n#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value);\nGLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\n#endif\n#endif /* GL_ARB_geometry_shader4 */\n\n#ifndef GL_ARB_get_program_binary\n#define GL_ARB_get_program_binary 1\n#endif /* GL_ARB_get_program_binary */\n\n#ifndef GL_ARB_gpu_shader5\n#define GL_ARB_gpu_shader5 1\n#endif /* GL_ARB_gpu_shader5 */\n\n#ifndef GL_ARB_gpu_shader_fp64\n#define GL_ARB_gpu_shader_fp64 1\n#endif /* GL_ARB_gpu_shader_fp64 */\n\n#ifndef GL_ARB_half_float_pixel\n#define GL_ARB_half_float_pixel 1\ntypedef unsigned short GLhalfARB;\n#define GL_HALF_FLOAT_ARB                 0x140B\n#endif /* GL_ARB_half_float_pixel */\n\n#ifndef GL_ARB_half_float_vertex\n#define GL_ARB_half_float_vertex 1\n#endif /* GL_ARB_half_float_vertex */\n\n#ifndef GL_ARB_imaging\n#define GL_ARB_imaging 1\n#define GL_BLEND_COLOR                    0x8005\n#define GL_BLEND_EQUATION                 0x8009\n#define GL_CONVOLUTION_1D                 0x8010\n#define GL_CONVOLUTION_2D                 0x8011\n#define GL_SEPARABLE_2D                   0x8012\n#define GL_CONVOLUTION_BORDER_MODE        0x8013\n#define GL_CONVOLUTION_FILTER_SCALE       0x8014\n#define GL_CONVOLUTION_FILTER_BIAS        0x8015\n#define GL_REDUCE                         0x8016\n#define GL_CONVOLUTION_FORMAT             0x8017\n#define GL_CONVOLUTION_WIDTH              0x8018\n#define GL_CONVOLUTION_HEIGHT             0x8019\n#define GL_MAX_CONVOLUTION_WIDTH          0x801A\n#define GL_MAX_CONVOLUTION_HEIGHT         0x801B\n#define GL_POST_CONVOLUTION_RED_SCALE     0x801C\n#define GL_POST_CONVOLUTION_GREEN_SCALE   0x801D\n#define GL_POST_CONVOLUTION_BLUE_SCALE    0x801E\n#define GL_POST_CONVOLUTION_ALPHA_SCALE   0x801F\n#define GL_POST_CONVOLUTION_RED_BIAS      0x8020\n#define GL_POST_CONVOLUTION_GREEN_BIAS    0x8021\n#define GL_POST_CONVOLUTION_BLUE_BIAS     0x8022\n#define GL_POST_CONVOLUTION_ALPHA_BIAS    0x8023\n#define GL_HISTOGRAM                      0x8024\n#define GL_PROXY_HISTOGRAM                0x8025\n#define GL_HISTOGRAM_WIDTH                0x8026\n#define GL_HISTOGRAM_FORMAT               0x8027\n#define GL_HISTOGRAM_RED_SIZE             0x8028\n#define GL_HISTOGRAM_GREEN_SIZE           0x8029\n#define GL_HISTOGRAM_BLUE_SIZE            0x802A\n#define GL_HISTOGRAM_ALPHA_SIZE           0x802B\n#define GL_HISTOGRAM_LUMINANCE_SIZE       0x802C\n#define GL_HISTOGRAM_SINK                 0x802D\n#define GL_MINMAX                         0x802E\n#define GL_MINMAX_FORMAT                  0x802F\n#define GL_MINMAX_SINK                    0x8030\n#define GL_TABLE_TOO_LARGE                0x8031\n#define GL_COLOR_MATRIX                   0x80B1\n#define GL_COLOR_MATRIX_STACK_DEPTH       0x80B2\n#define GL_MAX_COLOR_MATRIX_STACK_DEPTH   0x80B3\n#define GL_POST_COLOR_MATRIX_RED_SCALE    0x80B4\n#define GL_POST_COLOR_MATRIX_GREEN_SCALE  0x80B5\n#define GL_POST_COLOR_MATRIX_BLUE_SCALE   0x80B6\n#define GL_POST_COLOR_MATRIX_ALPHA_SCALE  0x80B7\n#define GL_POST_COLOR_MATRIX_RED_BIAS     0x80B8\n#define GL_POST_COLOR_MATRIX_GREEN_BIAS   0x80B9\n#define GL_POST_COLOR_MATRIX_BLUE_BIAS    0x80BA\n#define GL_POST_COLOR_MATRIX_ALPHA_BIAS   0x80BB\n#define GL_COLOR_TABLE                    0x80D0\n#define GL_POST_CONVOLUTION_COLOR_TABLE   0x80D1\n#define GL_POST_COLOR_MATRIX_COLOR_TABLE  0x80D2\n#define GL_PROXY_COLOR_TABLE              0x80D3\n#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4\n#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5\n#define GL_COLOR_TABLE_SCALE              0x80D6\n#define GL_COLOR_TABLE_BIAS               0x80D7\n#define GL_COLOR_TABLE_FORMAT             0x80D8\n#define GL_COLOR_TABLE_WIDTH              0x80D9\n#define GL_COLOR_TABLE_RED_SIZE           0x80DA\n#define GL_COLOR_TABLE_GREEN_SIZE         0x80DB\n#define GL_COLOR_TABLE_BLUE_SIZE          0x80DC\n#define GL_COLOR_TABLE_ALPHA_SIZE         0x80DD\n#define GL_COLOR_TABLE_LUMINANCE_SIZE     0x80DE\n#define GL_COLOR_TABLE_INTENSITY_SIZE     0x80DF\n#define GL_CONSTANT_BORDER                0x8151\n#define GL_REPLICATE_BORDER               0x8153\n#define GL_CONVOLUTION_BORDER_COLOR       0x8154\ntypedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);\ntypedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\ntypedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table);\ntypedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\ntypedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image);\ntypedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);\ntypedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);\ntypedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);\ntypedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);\ntypedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\ntypedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);\ntypedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);\nGLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table);\nGLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);\nGLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);\nGLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params);\nGLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params);\nGLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image);\nGLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);\nGLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);\nGLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);\nGLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);\nGLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\nGLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink);\nGLAPI void APIENTRY glResetHistogram (GLenum target);\nGLAPI void APIENTRY glResetMinmax (GLenum target);\n#endif\n#endif /* GL_ARB_imaging */\n\n#ifndef GL_ARB_indirect_parameters\n#define GL_ARB_indirect_parameters 1\n#define GL_PARAMETER_BUFFER_ARB           0x80EE\n#define GL_PARAMETER_BUFFER_BINDING_ARB   0x80EF\ntypedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);\nGLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);\n#endif\n#endif /* GL_ARB_indirect_parameters */\n\n#ifndef GL_ARB_instanced_arrays\n#define GL_ARB_instanced_arrays 1\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor);\n#endif\n#endif /* GL_ARB_instanced_arrays */\n\n#ifndef GL_ARB_internalformat_query\n#define GL_ARB_internalformat_query 1\n#endif /* GL_ARB_internalformat_query */\n\n#ifndef GL_ARB_internalformat_query2\n#define GL_ARB_internalformat_query2 1\n#define GL_SRGB_DECODE_ARB                0x8299\n#endif /* GL_ARB_internalformat_query2 */\n\n#ifndef GL_ARB_invalidate_subdata\n#define GL_ARB_invalidate_subdata 1\n#endif /* GL_ARB_invalidate_subdata */\n\n#ifndef GL_ARB_map_buffer_alignment\n#define GL_ARB_map_buffer_alignment 1\n#endif /* GL_ARB_map_buffer_alignment */\n\n#ifndef GL_ARB_map_buffer_range\n#define GL_ARB_map_buffer_range 1\n#endif /* GL_ARB_map_buffer_range */\n\n#ifndef GL_ARB_matrix_palette\n#define GL_ARB_matrix_palette 1\n#define GL_MATRIX_PALETTE_ARB             0x8840\n#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841\n#define GL_MAX_PALETTE_MATRICES_ARB       0x8842\n#define GL_CURRENT_PALETTE_MATRIX_ARB     0x8843\n#define GL_MATRIX_INDEX_ARRAY_ARB         0x8844\n#define GL_CURRENT_MATRIX_INDEX_ARB       0x8845\n#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB    0x8846\n#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB    0x8847\n#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB  0x8848\n#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849\ntypedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index);\ntypedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices);\ntypedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices);\ntypedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices);\ntypedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index);\nGLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices);\nGLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices);\nGLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices);\nGLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer);\n#endif\n#endif /* GL_ARB_matrix_palette */\n\n#ifndef GL_ARB_multi_bind\n#define GL_ARB_multi_bind 1\n#endif /* GL_ARB_multi_bind */\n\n#ifndef GL_ARB_multi_draw_indirect\n#define GL_ARB_multi_draw_indirect 1\n#endif /* GL_ARB_multi_draw_indirect */\n\n#ifndef GL_ARB_multisample\n#define GL_ARB_multisample 1\n#define GL_MULTISAMPLE_ARB                0x809D\n#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB   0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE_ARB        0x809F\n#define GL_SAMPLE_COVERAGE_ARB            0x80A0\n#define GL_SAMPLE_BUFFERS_ARB             0x80A8\n#define GL_SAMPLES_ARB                    0x80A9\n#define GL_SAMPLE_COVERAGE_VALUE_ARB      0x80AA\n#define GL_SAMPLE_COVERAGE_INVERT_ARB     0x80AB\n#define GL_MULTISAMPLE_BIT_ARB            0x20000000\ntypedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert);\n#endif\n#endif /* GL_ARB_multisample */\n\n#ifndef GL_ARB_multitexture\n#define GL_ARB_multitexture 1\n#define GL_TEXTURE0_ARB                   0x84C0\n#define GL_TEXTURE1_ARB                   0x84C1\n#define GL_TEXTURE2_ARB                   0x84C2\n#define GL_TEXTURE3_ARB                   0x84C3\n#define GL_TEXTURE4_ARB                   0x84C4\n#define GL_TEXTURE5_ARB                   0x84C5\n#define GL_TEXTURE6_ARB                   0x84C6\n#define GL_TEXTURE7_ARB                   0x84C7\n#define GL_TEXTURE8_ARB                   0x84C8\n#define GL_TEXTURE9_ARB                   0x84C9\n#define GL_TEXTURE10_ARB                  0x84CA\n#define GL_TEXTURE11_ARB                  0x84CB\n#define GL_TEXTURE12_ARB                  0x84CC\n#define GL_TEXTURE13_ARB                  0x84CD\n#define GL_TEXTURE14_ARB                  0x84CE\n#define GL_TEXTURE15_ARB                  0x84CF\n#define GL_TEXTURE16_ARB                  0x84D0\n#define GL_TEXTURE17_ARB                  0x84D1\n#define GL_TEXTURE18_ARB                  0x84D2\n#define GL_TEXTURE19_ARB                  0x84D3\n#define GL_TEXTURE20_ARB                  0x84D4\n#define GL_TEXTURE21_ARB                  0x84D5\n#define GL_TEXTURE22_ARB                  0x84D6\n#define GL_TEXTURE23_ARB                  0x84D7\n#define GL_TEXTURE24_ARB                  0x84D8\n#define GL_TEXTURE25_ARB                  0x84D9\n#define GL_TEXTURE26_ARB                  0x84DA\n#define GL_TEXTURE27_ARB                  0x84DB\n#define GL_TEXTURE28_ARB                  0x84DC\n#define GL_TEXTURE29_ARB                  0x84DD\n#define GL_TEXTURE30_ARB                  0x84DE\n#define GL_TEXTURE31_ARB                  0x84DF\n#define GL_ACTIVE_TEXTURE_ARB             0x84E0\n#define GL_CLIENT_ACTIVE_TEXTURE_ARB      0x84E1\n#define GL_MAX_TEXTURE_UNITS_ARB          0x84E2\ntypedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture);\ntypedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glActiveTextureARB (GLenum texture);\nGLAPI void APIENTRY glClientActiveTextureARB (GLenum texture);\nGLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s);\nGLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v);\nGLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s);\nGLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v);\nGLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s);\nGLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v);\nGLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s);\nGLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v);\nGLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t);\nGLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v);\nGLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t);\nGLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v);\nGLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t);\nGLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v);\nGLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t);\nGLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v);\nGLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r);\nGLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v);\nGLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r);\nGLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v);\nGLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r);\nGLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v);\nGLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r);\nGLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v);\nGLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\nGLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v);\nGLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\nGLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v);\nGLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q);\nGLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v);\nGLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\nGLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v);\n#endif\n#endif /* GL_ARB_multitexture */\n\n#ifndef GL_ARB_occlusion_query\n#define GL_ARB_occlusion_query 1\n#define GL_QUERY_COUNTER_BITS_ARB         0x8864\n#define GL_CURRENT_QUERY_ARB              0x8865\n#define GL_QUERY_RESULT_ARB               0x8866\n#define GL_QUERY_RESULT_AVAILABLE_ARB     0x8867\n#define GL_SAMPLES_PASSED_ARB             0x8914\ntypedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids);\ntypedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids);\ntypedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id);\ntypedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids);\nGLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids);\nGLAPI GLboolean APIENTRY glIsQueryARB (GLuint id);\nGLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id);\nGLAPI void APIENTRY glEndQueryARB (GLenum target);\nGLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params);\n#endif\n#endif /* GL_ARB_occlusion_query */\n\n#ifndef GL_ARB_occlusion_query2\n#define GL_ARB_occlusion_query2 1\n#endif /* GL_ARB_occlusion_query2 */\n\n#ifndef GL_ARB_pixel_buffer_object\n#define GL_ARB_pixel_buffer_object 1\n#define GL_PIXEL_PACK_BUFFER_ARB          0x88EB\n#define GL_PIXEL_UNPACK_BUFFER_ARB        0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING_ARB  0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF\n#endif /* GL_ARB_pixel_buffer_object */\n\n#ifndef GL_ARB_point_parameters\n#define GL_ARB_point_parameters 1\n#define GL_POINT_SIZE_MIN_ARB             0x8126\n#define GL_POINT_SIZE_MAX_ARB             0x8127\n#define GL_POINT_FADE_THRESHOLD_SIZE_ARB  0x8128\n#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params);\n#endif\n#endif /* GL_ARB_point_parameters */\n\n#ifndef GL_ARB_point_sprite\n#define GL_ARB_point_sprite 1\n#define GL_POINT_SPRITE_ARB               0x8861\n#define GL_COORD_REPLACE_ARB              0x8862\n#endif /* GL_ARB_point_sprite */\n\n#ifndef GL_ARB_program_interface_query\n#define GL_ARB_program_interface_query 1\n#endif /* GL_ARB_program_interface_query */\n\n#ifndef GL_ARB_provoking_vertex\n#define GL_ARB_provoking_vertex 1\n#endif /* GL_ARB_provoking_vertex */\n\n#ifndef GL_ARB_query_buffer_object\n#define GL_ARB_query_buffer_object 1\n#endif /* GL_ARB_query_buffer_object */\n\n#ifndef GL_ARB_robust_buffer_access_behavior\n#define GL_ARB_robust_buffer_access_behavior 1\n#endif /* GL_ARB_robust_buffer_access_behavior */\n\n#ifndef GL_ARB_robustness\n#define GL_ARB_robustness 1\n#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004\n#define GL_LOSE_CONTEXT_ON_RESET_ARB      0x8252\n#define GL_GUILTY_CONTEXT_RESET_ARB       0x8253\n#define GL_INNOCENT_CONTEXT_RESET_ARB     0x8254\n#define GL_UNKNOWN_CONTEXT_RESET_ARB      0x8255\n#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n#define GL_NO_RESET_NOTIFICATION_ARB      0x8261\ntypedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void);\ntypedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img);\ntypedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);\ntypedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img);\ntypedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);\ntypedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params);\ntypedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);\ntypedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);\ntypedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v);\ntypedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values);\ntypedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values);\ntypedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values);\ntypedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern);\ntypedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);\ntypedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);\ntypedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span);\ntypedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);\ntypedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void);\nGLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img);\nGLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);\nGLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img);\nGLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);\nGLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params);\nGLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params);\nGLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);\nGLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);\nGLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);\nGLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v);\nGLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values);\nGLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values);\nGLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values);\nGLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern);\nGLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);\nGLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);\nGLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span);\nGLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);\nGLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);\n#endif\n#endif /* GL_ARB_robustness */\n\n#ifndef GL_ARB_robustness_isolation\n#define GL_ARB_robustness_isolation 1\n#endif /* GL_ARB_robustness_isolation */\n\n#ifndef GL_ARB_sample_shading\n#define GL_ARB_sample_shading 1\n#define GL_SAMPLE_SHADING_ARB             0x8C36\n#define GL_MIN_SAMPLE_SHADING_VALUE_ARB   0x8C37\ntypedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMinSampleShadingARB (GLfloat value);\n#endif\n#endif /* GL_ARB_sample_shading */\n\n#ifndef GL_ARB_sampler_objects\n#define GL_ARB_sampler_objects 1\n#endif /* GL_ARB_sampler_objects */\n\n#ifndef GL_ARB_seamless_cube_map\n#define GL_ARB_seamless_cube_map 1\n#endif /* GL_ARB_seamless_cube_map */\n\n#ifndef GL_ARB_seamless_cubemap_per_texture\n#define GL_ARB_seamless_cubemap_per_texture 1\n#endif /* GL_ARB_seamless_cubemap_per_texture */\n\n#ifndef GL_ARB_separate_shader_objects\n#define GL_ARB_separate_shader_objects 1\n#endif /* GL_ARB_separate_shader_objects */\n\n#ifndef GL_ARB_shader_atomic_counters\n#define GL_ARB_shader_atomic_counters 1\n#endif /* GL_ARB_shader_atomic_counters */\n\n#ifndef GL_ARB_shader_bit_encoding\n#define GL_ARB_shader_bit_encoding 1\n#endif /* GL_ARB_shader_bit_encoding */\n\n#ifndef GL_ARB_shader_draw_parameters\n#define GL_ARB_shader_draw_parameters 1\n#endif /* GL_ARB_shader_draw_parameters */\n\n#ifndef GL_ARB_shader_group_vote\n#define GL_ARB_shader_group_vote 1\n#endif /* GL_ARB_shader_group_vote */\n\n#ifndef GL_ARB_shader_image_load_store\n#define GL_ARB_shader_image_load_store 1\n#endif /* GL_ARB_shader_image_load_store */\n\n#ifndef GL_ARB_shader_image_size\n#define GL_ARB_shader_image_size 1\n#endif /* GL_ARB_shader_image_size */\n\n#ifndef GL_ARB_shader_objects\n#define GL_ARB_shader_objects 1\n#ifdef __APPLE__\ntypedef void *GLhandleARB;\n#else\ntypedef unsigned int GLhandleARB;\n#endif\ntypedef char GLcharARB;\n#define GL_PROGRAM_OBJECT_ARB             0x8B40\n#define GL_SHADER_OBJECT_ARB              0x8B48\n#define GL_OBJECT_TYPE_ARB                0x8B4E\n#define GL_OBJECT_SUBTYPE_ARB             0x8B4F\n#define GL_FLOAT_VEC2_ARB                 0x8B50\n#define GL_FLOAT_VEC3_ARB                 0x8B51\n#define GL_FLOAT_VEC4_ARB                 0x8B52\n#define GL_INT_VEC2_ARB                   0x8B53\n#define GL_INT_VEC3_ARB                   0x8B54\n#define GL_INT_VEC4_ARB                   0x8B55\n#define GL_BOOL_ARB                       0x8B56\n#define GL_BOOL_VEC2_ARB                  0x8B57\n#define GL_BOOL_VEC3_ARB                  0x8B58\n#define GL_BOOL_VEC4_ARB                  0x8B59\n#define GL_FLOAT_MAT2_ARB                 0x8B5A\n#define GL_FLOAT_MAT3_ARB                 0x8B5B\n#define GL_FLOAT_MAT4_ARB                 0x8B5C\n#define GL_SAMPLER_1D_ARB                 0x8B5D\n#define GL_SAMPLER_2D_ARB                 0x8B5E\n#define GL_SAMPLER_3D_ARB                 0x8B5F\n#define GL_SAMPLER_CUBE_ARB               0x8B60\n#define GL_SAMPLER_1D_SHADOW_ARB          0x8B61\n#define GL_SAMPLER_2D_SHADOW_ARB          0x8B62\n#define GL_SAMPLER_2D_RECT_ARB            0x8B63\n#define GL_SAMPLER_2D_RECT_SHADOW_ARB     0x8B64\n#define GL_OBJECT_DELETE_STATUS_ARB       0x8B80\n#define GL_OBJECT_COMPILE_STATUS_ARB      0x8B81\n#define GL_OBJECT_LINK_STATUS_ARB         0x8B82\n#define GL_OBJECT_VALIDATE_STATUS_ARB     0x8B83\n#define GL_OBJECT_INFO_LOG_LENGTH_ARB     0x8B84\n#define GL_OBJECT_ATTACHED_OBJECTS_ARB    0x8B85\n#define GL_OBJECT_ACTIVE_UNIFORMS_ARB     0x8B86\n#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87\n#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88\ntypedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);\ntypedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname);\ntypedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);\ntypedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);\ntypedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length);\ntypedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);\ntypedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void);\ntypedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);\ntypedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);\ntypedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);\ntypedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);\ntypedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);\ntypedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);\ntypedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\ntypedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\ntypedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);\ntypedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);\ntypedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);\ntypedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\ntypedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);\ntypedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj);\ntypedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);\ntypedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params);\ntypedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj);\nGLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname);\nGLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj);\nGLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType);\nGLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length);\nGLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj);\nGLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void);\nGLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj);\nGLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj);\nGLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj);\nGLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj);\nGLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0);\nGLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1);\nGLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0);\nGLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1);\nGLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);\nGLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj);\nGLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name);\nGLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);\nGLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params);\nGLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params);\nGLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source);\n#endif\n#endif /* GL_ARB_shader_objects */\n\n#ifndef GL_ARB_shader_precision\n#define GL_ARB_shader_precision 1\n#endif /* GL_ARB_shader_precision */\n\n#ifndef GL_ARB_shader_stencil_export\n#define GL_ARB_shader_stencil_export 1\n#endif /* GL_ARB_shader_stencil_export */\n\n#ifndef GL_ARB_shader_storage_buffer_object\n#define GL_ARB_shader_storage_buffer_object 1\n#endif /* GL_ARB_shader_storage_buffer_object */\n\n#ifndef GL_ARB_shader_subroutine\n#define GL_ARB_shader_subroutine 1\n#endif /* GL_ARB_shader_subroutine */\n\n#ifndef GL_ARB_shader_texture_lod\n#define GL_ARB_shader_texture_lod 1\n#endif /* GL_ARB_shader_texture_lod */\n\n#ifndef GL_ARB_shading_language_100\n#define GL_ARB_shading_language_100 1\n#define GL_SHADING_LANGUAGE_VERSION_ARB   0x8B8C\n#endif /* GL_ARB_shading_language_100 */\n\n#ifndef GL_ARB_shading_language_420pack\n#define GL_ARB_shading_language_420pack 1\n#endif /* GL_ARB_shading_language_420pack */\n\n#ifndef GL_ARB_shading_language_include\n#define GL_ARB_shading_language_include 1\n#define GL_SHADER_INCLUDE_ARB             0x8DAE\n#define GL_NAMED_STRING_LENGTH_ARB        0x8DE9\n#define GL_NAMED_STRING_TYPE_ARB          0x8DEA\ntypedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string);\ntypedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name);\ntypedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length);\ntypedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string);\ntypedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string);\nGLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name);\nGLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length);\nGLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name);\nGLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string);\nGLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params);\n#endif\n#endif /* GL_ARB_shading_language_include */\n\n#ifndef GL_ARB_shading_language_packing\n#define GL_ARB_shading_language_packing 1\n#endif /* GL_ARB_shading_language_packing */\n\n#ifndef GL_ARB_shadow\n#define GL_ARB_shadow 1\n#define GL_TEXTURE_COMPARE_MODE_ARB       0x884C\n#define GL_TEXTURE_COMPARE_FUNC_ARB       0x884D\n#define GL_COMPARE_R_TO_TEXTURE_ARB       0x884E\n#endif /* GL_ARB_shadow */\n\n#ifndef GL_ARB_shadow_ambient\n#define GL_ARB_shadow_ambient 1\n#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF\n#endif /* GL_ARB_shadow_ambient */\n\n#ifndef GL_ARB_sparse_texture\n#define GL_ARB_sparse_texture 1\n#define GL_TEXTURE_SPARSE_ARB             0x91A6\n#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB    0x91A7\n#define GL_MIN_SPARSE_LEVEL_ARB           0x919B\n#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB     0x91A8\n#define GL_VIRTUAL_PAGE_SIZE_X_ARB        0x9195\n#define GL_VIRTUAL_PAGE_SIZE_Y_ARB        0x9196\n#define GL_VIRTUAL_PAGE_SIZE_Z_ARB        0x9197\n#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB    0x9198\n#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199\n#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A\n#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9\ntypedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident);\n#endif\n#endif /* GL_ARB_sparse_texture */\n\n#ifndef GL_ARB_stencil_texturing\n#define GL_ARB_stencil_texturing 1\n#endif /* GL_ARB_stencil_texturing */\n\n#ifndef GL_ARB_sync\n#define GL_ARB_sync 1\n#endif /* GL_ARB_sync */\n\n#ifndef GL_ARB_tessellation_shader\n#define GL_ARB_tessellation_shader 1\n#endif /* GL_ARB_tessellation_shader */\n\n#ifndef GL_ARB_texture_border_clamp\n#define GL_ARB_texture_border_clamp 1\n#define GL_CLAMP_TO_BORDER_ARB            0x812D\n#endif /* GL_ARB_texture_border_clamp */\n\n#ifndef GL_ARB_texture_buffer_object\n#define GL_ARB_texture_buffer_object 1\n#define GL_TEXTURE_BUFFER_ARB             0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB    0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER_ARB     0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D\n#define GL_TEXTURE_BUFFER_FORMAT_ARB      0x8C2E\ntypedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer);\n#endif\n#endif /* GL_ARB_texture_buffer_object */\n\n#ifndef GL_ARB_texture_buffer_object_rgb32\n#define GL_ARB_texture_buffer_object_rgb32 1\n#endif /* GL_ARB_texture_buffer_object_rgb32 */\n\n#ifndef GL_ARB_texture_buffer_range\n#define GL_ARB_texture_buffer_range 1\n#endif /* GL_ARB_texture_buffer_range */\n\n#ifndef GL_ARB_texture_compression\n#define GL_ARB_texture_compression 1\n#define GL_COMPRESSED_ALPHA_ARB           0x84E9\n#define GL_COMPRESSED_LUMINANCE_ARB       0x84EA\n#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB\n#define GL_COMPRESSED_INTENSITY_ARB       0x84EC\n#define GL_COMPRESSED_RGB_ARB             0x84ED\n#define GL_COMPRESSED_RGBA_ARB            0x84EE\n#define GL_TEXTURE_COMPRESSION_HINT_ARB   0x84EF\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0\n#define GL_TEXTURE_COMPRESSED_ARB         0x86A1\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2\n#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);\ntypedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);\nGLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img);\n#endif\n#endif /* GL_ARB_texture_compression */\n\n#ifndef GL_ARB_texture_compression_bptc\n#define GL_ARB_texture_compression_bptc 1\n#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C\n#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D\n#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E\n#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F\n#endif /* GL_ARB_texture_compression_bptc */\n\n#ifndef GL_ARB_texture_compression_rgtc\n#define GL_ARB_texture_compression_rgtc 1\n#endif /* GL_ARB_texture_compression_rgtc */\n\n#ifndef GL_ARB_texture_cube_map\n#define GL_ARB_texture_cube_map 1\n#define GL_NORMAL_MAP_ARB                 0x8511\n#define GL_REFLECTION_MAP_ARB             0x8512\n#define GL_TEXTURE_CUBE_MAP_ARB           0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARB   0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARB     0x851B\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB  0x851C\n#endif /* GL_ARB_texture_cube_map */\n\n#ifndef GL_ARB_texture_cube_map_array\n#define GL_ARB_texture_cube_map_array 1\n#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB     0x9009\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B\n#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB     0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F\n#endif /* GL_ARB_texture_cube_map_array */\n\n#ifndef GL_ARB_texture_env_add\n#define GL_ARB_texture_env_add 1\n#endif /* GL_ARB_texture_env_add */\n\n#ifndef GL_ARB_texture_env_combine\n#define GL_ARB_texture_env_combine 1\n#define GL_COMBINE_ARB                    0x8570\n#define GL_COMBINE_RGB_ARB                0x8571\n#define GL_COMBINE_ALPHA_ARB              0x8572\n#define GL_SOURCE0_RGB_ARB                0x8580\n#define GL_SOURCE1_RGB_ARB                0x8581\n#define GL_SOURCE2_RGB_ARB                0x8582\n#define GL_SOURCE0_ALPHA_ARB              0x8588\n#define GL_SOURCE1_ALPHA_ARB              0x8589\n#define GL_SOURCE2_ALPHA_ARB              0x858A\n#define GL_OPERAND0_RGB_ARB               0x8590\n#define GL_OPERAND1_RGB_ARB               0x8591\n#define GL_OPERAND2_RGB_ARB               0x8592\n#define GL_OPERAND0_ALPHA_ARB             0x8598\n#define GL_OPERAND1_ALPHA_ARB             0x8599\n#define GL_OPERAND2_ALPHA_ARB             0x859A\n#define GL_RGB_SCALE_ARB                  0x8573\n#define GL_ADD_SIGNED_ARB                 0x8574\n#define GL_INTERPOLATE_ARB                0x8575\n#define GL_SUBTRACT_ARB                   0x84E7\n#define GL_CONSTANT_ARB                   0x8576\n#define GL_PRIMARY_COLOR_ARB              0x8577\n#define GL_PREVIOUS_ARB                   0x8578\n#endif /* GL_ARB_texture_env_combine */\n\n#ifndef GL_ARB_texture_env_crossbar\n#define GL_ARB_texture_env_crossbar 1\n#endif /* GL_ARB_texture_env_crossbar */\n\n#ifndef GL_ARB_texture_env_dot3\n#define GL_ARB_texture_env_dot3 1\n#define GL_DOT3_RGB_ARB                   0x86AE\n#define GL_DOT3_RGBA_ARB                  0x86AF\n#endif /* GL_ARB_texture_env_dot3 */\n\n#ifndef GL_ARB_texture_float\n#define GL_ARB_texture_float 1\n#define GL_TEXTURE_RED_TYPE_ARB           0x8C10\n#define GL_TEXTURE_GREEN_TYPE_ARB         0x8C11\n#define GL_TEXTURE_BLUE_TYPE_ARB          0x8C12\n#define GL_TEXTURE_ALPHA_TYPE_ARB         0x8C13\n#define GL_TEXTURE_LUMINANCE_TYPE_ARB     0x8C14\n#define GL_TEXTURE_INTENSITY_TYPE_ARB     0x8C15\n#define GL_TEXTURE_DEPTH_TYPE_ARB         0x8C16\n#define GL_UNSIGNED_NORMALIZED_ARB        0x8C17\n#define GL_RGBA32F_ARB                    0x8814\n#define GL_RGB32F_ARB                     0x8815\n#define GL_ALPHA32F_ARB                   0x8816\n#define GL_INTENSITY32F_ARB               0x8817\n#define GL_LUMINANCE32F_ARB               0x8818\n#define GL_LUMINANCE_ALPHA32F_ARB         0x8819\n#define GL_RGBA16F_ARB                    0x881A\n#define GL_RGB16F_ARB                     0x881B\n#define GL_ALPHA16F_ARB                   0x881C\n#define GL_INTENSITY16F_ARB               0x881D\n#define GL_LUMINANCE16F_ARB               0x881E\n#define GL_LUMINANCE_ALPHA16F_ARB         0x881F\n#endif /* GL_ARB_texture_float */\n\n#ifndef GL_ARB_texture_gather\n#define GL_ARB_texture_gather 1\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F\n#endif /* GL_ARB_texture_gather */\n\n#ifndef GL_ARB_texture_mirror_clamp_to_edge\n#define GL_ARB_texture_mirror_clamp_to_edge 1\n#endif /* GL_ARB_texture_mirror_clamp_to_edge */\n\n#ifndef GL_ARB_texture_mirrored_repeat\n#define GL_ARB_texture_mirrored_repeat 1\n#define GL_MIRRORED_REPEAT_ARB            0x8370\n#endif /* GL_ARB_texture_mirrored_repeat */\n\n#ifndef GL_ARB_texture_multisample\n#define GL_ARB_texture_multisample 1\n#endif /* GL_ARB_texture_multisample */\n\n#ifndef GL_ARB_texture_non_power_of_two\n#define GL_ARB_texture_non_power_of_two 1\n#endif /* GL_ARB_texture_non_power_of_two */\n\n#ifndef GL_ARB_texture_query_levels\n#define GL_ARB_texture_query_levels 1\n#endif /* GL_ARB_texture_query_levels */\n\n#ifndef GL_ARB_texture_query_lod\n#define GL_ARB_texture_query_lod 1\n#endif /* GL_ARB_texture_query_lod */\n\n#ifndef GL_ARB_texture_rectangle\n#define GL_ARB_texture_rectangle 1\n#define GL_TEXTURE_RECTANGLE_ARB          0x84F5\n#define GL_TEXTURE_BINDING_RECTANGLE_ARB  0x84F6\n#define GL_PROXY_TEXTURE_RECTANGLE_ARB    0x84F7\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8\n#endif /* GL_ARB_texture_rectangle */\n\n#ifndef GL_ARB_texture_rg\n#define GL_ARB_texture_rg 1\n#endif /* GL_ARB_texture_rg */\n\n#ifndef GL_ARB_texture_rgb10_a2ui\n#define GL_ARB_texture_rgb10_a2ui 1\n#endif /* GL_ARB_texture_rgb10_a2ui */\n\n#ifndef GL_ARB_texture_stencil8\n#define GL_ARB_texture_stencil8 1\n#endif /* GL_ARB_texture_stencil8 */\n\n#ifndef GL_ARB_texture_storage\n#define GL_ARB_texture_storage 1\n#endif /* GL_ARB_texture_storage */\n\n#ifndef GL_ARB_texture_storage_multisample\n#define GL_ARB_texture_storage_multisample 1\n#endif /* GL_ARB_texture_storage_multisample */\n\n#ifndef GL_ARB_texture_swizzle\n#define GL_ARB_texture_swizzle 1\n#endif /* GL_ARB_texture_swizzle */\n\n#ifndef GL_ARB_texture_view\n#define GL_ARB_texture_view 1\n#endif /* GL_ARB_texture_view */\n\n#ifndef GL_ARB_timer_query\n#define GL_ARB_timer_query 1\n#endif /* GL_ARB_timer_query */\n\n#ifndef GL_ARB_transform_feedback2\n#define GL_ARB_transform_feedback2 1\n#define GL_TRANSFORM_FEEDBACK_PAUSED      0x8E23\n#define GL_TRANSFORM_FEEDBACK_ACTIVE      0x8E24\n#endif /* GL_ARB_transform_feedback2 */\n\n#ifndef GL_ARB_transform_feedback3\n#define GL_ARB_transform_feedback3 1\n#endif /* GL_ARB_transform_feedback3 */\n\n#ifndef GL_ARB_transform_feedback_instanced\n#define GL_ARB_transform_feedback_instanced 1\n#endif /* GL_ARB_transform_feedback_instanced */\n\n#ifndef GL_ARB_transpose_matrix\n#define GL_ARB_transpose_matrix 1\n#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3\n#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4\n#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB   0x84E5\n#define GL_TRANSPOSE_COLOR_MATRIX_ARB     0x84E6\ntypedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m);\ntypedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m);\ntypedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m);\ntypedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m);\nGLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m);\nGLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m);\nGLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m);\n#endif\n#endif /* GL_ARB_transpose_matrix */\n\n#ifndef GL_ARB_uniform_buffer_object\n#define GL_ARB_uniform_buffer_object 1\n#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS    0x8A2C\n#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45\n#endif /* GL_ARB_uniform_buffer_object */\n\n#ifndef GL_ARB_vertex_array_bgra\n#define GL_ARB_vertex_array_bgra 1\n#endif /* GL_ARB_vertex_array_bgra */\n\n#ifndef GL_ARB_vertex_array_object\n#define GL_ARB_vertex_array_object 1\n#endif /* GL_ARB_vertex_array_object */\n\n#ifndef GL_ARB_vertex_attrib_64bit\n#define GL_ARB_vertex_attrib_64bit 1\n#endif /* GL_ARB_vertex_attrib_64bit */\n\n#ifndef GL_ARB_vertex_attrib_binding\n#define GL_ARB_vertex_attrib_binding 1\n#endif /* GL_ARB_vertex_attrib_binding */\n\n#ifndef GL_ARB_vertex_blend\n#define GL_ARB_vertex_blend 1\n#define GL_MAX_VERTEX_UNITS_ARB           0x86A4\n#define GL_ACTIVE_VERTEX_UNITS_ARB        0x86A5\n#define GL_WEIGHT_SUM_UNITY_ARB           0x86A6\n#define GL_VERTEX_BLEND_ARB               0x86A7\n#define GL_CURRENT_WEIGHT_ARB             0x86A8\n#define GL_WEIGHT_ARRAY_TYPE_ARB          0x86A9\n#define GL_WEIGHT_ARRAY_STRIDE_ARB        0x86AA\n#define GL_WEIGHT_ARRAY_SIZE_ARB          0x86AB\n#define GL_WEIGHT_ARRAY_POINTER_ARB       0x86AC\n#define GL_WEIGHT_ARRAY_ARB               0x86AD\n#define GL_MODELVIEW0_ARB                 0x1700\n#define GL_MODELVIEW1_ARB                 0x850A\n#define GL_MODELVIEW2_ARB                 0x8722\n#define GL_MODELVIEW3_ARB                 0x8723\n#define GL_MODELVIEW4_ARB                 0x8724\n#define GL_MODELVIEW5_ARB                 0x8725\n#define GL_MODELVIEW6_ARB                 0x8726\n#define GL_MODELVIEW7_ARB                 0x8727\n#define GL_MODELVIEW8_ARB                 0x8728\n#define GL_MODELVIEW9_ARB                 0x8729\n#define GL_MODELVIEW10_ARB                0x872A\n#define GL_MODELVIEW11_ARB                0x872B\n#define GL_MODELVIEW12_ARB                0x872C\n#define GL_MODELVIEW13_ARB                0x872D\n#define GL_MODELVIEW14_ARB                0x872E\n#define GL_MODELVIEW15_ARB                0x872F\n#define GL_MODELVIEW16_ARB                0x8730\n#define GL_MODELVIEW17_ARB                0x8731\n#define GL_MODELVIEW18_ARB                0x8732\n#define GL_MODELVIEW19_ARB                0x8733\n#define GL_MODELVIEW20_ARB                0x8734\n#define GL_MODELVIEW21_ARB                0x8735\n#define GL_MODELVIEW22_ARB                0x8736\n#define GL_MODELVIEW23_ARB                0x8737\n#define GL_MODELVIEW24_ARB                0x8738\n#define GL_MODELVIEW25_ARB                0x8739\n#define GL_MODELVIEW26_ARB                0x873A\n#define GL_MODELVIEW27_ARB                0x873B\n#define GL_MODELVIEW28_ARB                0x873C\n#define GL_MODELVIEW29_ARB                0x873D\n#define GL_MODELVIEW30_ARB                0x873E\n#define GL_MODELVIEW31_ARB                0x873F\ntypedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights);\ntypedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights);\ntypedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights);\ntypedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights);\ntypedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights);\ntypedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights);\ntypedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights);\ntypedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights);\ntypedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights);\nGLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights);\nGLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights);\nGLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights);\nGLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights);\nGLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights);\nGLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights);\nGLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights);\nGLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glVertexBlendARB (GLint count);\n#endif\n#endif /* GL_ARB_vertex_blend */\n\n#ifndef GL_ARB_vertex_buffer_object\n#define GL_ARB_vertex_buffer_object 1\n#ifdef __MACOSX__ /* The OS X headers haven't caught up with Khronos yet */\ntypedef long GLsizeiptrARB;\ntypedef long GLintptrARB;\n#else\ntypedef ptrdiff_t GLsizeiptrARB;\ntypedef ptrdiff_t GLintptrARB;\n#endif\n#define GL_BUFFER_SIZE_ARB                0x8764\n#define GL_BUFFER_USAGE_ARB               0x8765\n#define GL_ARRAY_BUFFER_ARB               0x8892\n#define GL_ELEMENT_ARRAY_BUFFER_ARB       0x8893\n#define GL_ARRAY_BUFFER_BINDING_ARB       0x8894\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895\n#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896\n#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897\n#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898\n#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899\n#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A\n#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B\n#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C\n#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D\n#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F\n#define GL_READ_ONLY_ARB                  0x88B8\n#define GL_WRITE_ONLY_ARB                 0x88B9\n#define GL_READ_WRITE_ARB                 0x88BA\n#define GL_BUFFER_ACCESS_ARB              0x88BB\n#define GL_BUFFER_MAPPED_ARB              0x88BC\n#define GL_BUFFER_MAP_POINTER_ARB         0x88BD\n#define GL_STREAM_DRAW_ARB                0x88E0\n#define GL_STREAM_READ_ARB                0x88E1\n#define GL_STREAM_COPY_ARB                0x88E2\n#define GL_STATIC_DRAW_ARB                0x88E4\n#define GL_STATIC_READ_ARB                0x88E5\n#define GL_STATIC_COPY_ARB                0x88E6\n#define GL_DYNAMIC_DRAW_ARB               0x88E8\n#define GL_DYNAMIC_READ_ARB               0x88E9\n#define GL_DYNAMIC_COPY_ARB               0x88EA\ntypedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);\ntypedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);\ntypedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);\ntypedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage);\ntypedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data);\ntypedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data);\ntypedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access);\ntypedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer);\nGLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers);\nGLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers);\nGLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer);\nGLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage);\nGLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data);\nGLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data);\nGLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access);\nGLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target);\nGLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params);\n#endif\n#endif /* GL_ARB_vertex_buffer_object */\n\n#ifndef GL_ARB_vertex_program\n#define GL_ARB_vertex_program 1\n#define GL_COLOR_SUM_ARB                  0x8458\n#define GL_VERTEX_PROGRAM_ARB             0x8620\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB   0x8623\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB   0x8625\n#define GL_CURRENT_VERTEX_ATTRIB_ARB      0x8626\n#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB  0x8642\n#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB    0x8643\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645\n#define GL_MAX_VERTEX_ATTRIBS_ARB         0x8869\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A\n#define GL_PROGRAM_ADDRESS_REGISTERS_ARB  0x88B0\n#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1\n#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2\n#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);\ntypedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x);\nGLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x);\nGLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x);\nGLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y);\nGLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y);\nGLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z);\nGLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v);\nGLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\nGLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v);\nGLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v);\nGLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v);\nGLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index);\nGLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index);\nGLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params);\nGLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer);\n#endif\n#endif /* GL_ARB_vertex_program */\n\n#ifndef GL_ARB_vertex_shader\n#define GL_ARB_vertex_shader 1\n#define GL_VERTEX_SHADER_ARB              0x8B31\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A\n#define GL_MAX_VARYING_FLOATS_ARB         0x8B4B\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D\n#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB   0x8B89\n#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A\ntypedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name);\ntypedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);\ntypedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name);\nGLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);\nGLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name);\n#endif\n#endif /* GL_ARB_vertex_shader */\n\n#ifndef GL_ARB_vertex_type_10f_11f_11f_rev\n#define GL_ARB_vertex_type_10f_11f_11f_rev 1\n#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */\n\n#ifndef GL_ARB_vertex_type_2_10_10_10_rev\n#define GL_ARB_vertex_type_2_10_10_10_rev 1\n#endif /* GL_ARB_vertex_type_2_10_10_10_rev */\n\n#ifndef GL_ARB_viewport_array\n#define GL_ARB_viewport_array 1\n#endif /* GL_ARB_viewport_array */\n\n#ifndef GL_ARB_window_pos\n#define GL_ARB_window_pos 1\ntypedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y);\nGLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v);\nGLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y);\nGLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v);\nGLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y);\nGLAPI void APIENTRY glWindowPos2ivARB (const GLint *v);\nGLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y);\nGLAPI void APIENTRY glWindowPos2svARB (const GLshort *v);\nGLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v);\nGLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v);\nGLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z);\nGLAPI void APIENTRY glWindowPos3ivARB (const GLint *v);\nGLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z);\nGLAPI void APIENTRY glWindowPos3svARB (const GLshort *v);\n#endif\n#endif /* GL_ARB_window_pos */\n\n#ifndef GL_KHR_debug\n#define GL_KHR_debug 1\n#endif /* GL_KHR_debug */\n\n#ifndef GL_KHR_texture_compression_astc_hdr\n#define GL_KHR_texture_compression_astc_hdr 1\n#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR   0x93B0\n#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR   0x93B1\n#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR   0x93B2\n#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR   0x93B3\n#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR   0x93B4\n#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR   0x93B5\n#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR   0x93B6\n#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR   0x93B7\n#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR  0x93B8\n#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR  0x93B9\n#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR  0x93BA\n#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB\n#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC\n#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD\n#endif /* GL_KHR_texture_compression_astc_hdr */\n\n#ifndef GL_KHR_texture_compression_astc_ldr\n#define GL_KHR_texture_compression_astc_ldr 1\n#endif /* GL_KHR_texture_compression_astc_ldr */\n\n#ifndef GL_OES_byte_coordinates\n#define GL_OES_byte_coordinates 1\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s);\ntypedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t);\ntypedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r);\ntypedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q);\ntypedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x);\ntypedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y);\ntypedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z);\ntypedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s);\nGLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords);\nGLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t);\nGLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords);\nGLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r);\nGLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords);\nGLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q);\nGLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords);\nGLAPI void APIENTRY glTexCoord1bOES (GLbyte s);\nGLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords);\nGLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t);\nGLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords);\nGLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r);\nGLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords);\nGLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q);\nGLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords);\nGLAPI void APIENTRY glVertex2bOES (GLbyte x);\nGLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords);\nGLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y);\nGLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords);\nGLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z);\nGLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords);\n#endif\n#endif /* GL_OES_byte_coordinates */\n\n#ifndef GL_OES_compressed_paletted_texture\n#define GL_OES_compressed_paletted_texture 1\n#define GL_PALETTE4_RGB8_OES              0x8B90\n#define GL_PALETTE4_RGBA8_OES             0x8B91\n#define GL_PALETTE4_R5_G6_B5_OES          0x8B92\n#define GL_PALETTE4_RGBA4_OES             0x8B93\n#define GL_PALETTE4_RGB5_A1_OES           0x8B94\n#define GL_PALETTE8_RGB8_OES              0x8B95\n#define GL_PALETTE8_RGBA8_OES             0x8B96\n#define GL_PALETTE8_R5_G6_B5_OES          0x8B97\n#define GL_PALETTE8_RGBA4_OES             0x8B98\n#define GL_PALETTE8_RGB5_A1_OES           0x8B99\n#endif /* GL_OES_compressed_paletted_texture */\n\n#ifndef GL_OES_fixed_point\n#define GL_OES_fixed_point 1\ntypedef GLint GLfixed;\n#define GL_FIXED_OES                      0x140C\ntypedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref);\ntypedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);\ntypedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth);\ntypedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation);\ntypedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);\ntypedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f);\ntypedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param);\ntypedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);\ntypedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation);\ntypedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params);\ntypedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params);\ntypedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param);\ntypedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params);\ntypedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width);\ntypedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m);\ntypedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param);\ntypedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);\ntypedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz);\ntypedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params);\ntypedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size);\ntypedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units);\ntypedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z);\ntypedef void (APIENTRYP PFNGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert);\ntypedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z);\ntypedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params);\ntypedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z);\ntypedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value);\ntypedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap);\ntypedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);\ntypedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);\ntypedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue);\ntypedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components);\ntypedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params);\ntypedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u);\ntypedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v);\ntypedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer);\ntypedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params);\ntypedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params);\ntypedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params);\ntypedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v);\ntypedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values);\ntypedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params);\ntypedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params);\ntypedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component);\ntypedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component);\ntypedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m);\ntypedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points);\ntypedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points);\ntypedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2);\ntypedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2);\ntypedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token);\ntypedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values);\ntypedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor);\ntypedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities);\ntypedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y);\ntypedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z);\ntypedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w);\ntypedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2);\ntypedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2);\ntypedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s);\ntypedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t);\ntypedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r);\ntypedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q);\ntypedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param);\ntypedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params);\ntypedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x);\ntypedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y);\ntypedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords);\ntypedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z);\ntypedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref);\nGLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);\nGLAPI void APIENTRY glClearDepthxOES (GLfixed depth);\nGLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation);\nGLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);\nGLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f);\nGLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param);\nGLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param);\nGLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);\nGLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation);\nGLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params);\nGLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params);\nGLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params);\nGLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param);\nGLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param);\nGLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param);\nGLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params);\nGLAPI void APIENTRY glLineWidthxOES (GLfixed width);\nGLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m);\nGLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param);\nGLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param);\nGLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m);\nGLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);\nGLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz);\nGLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);\nGLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params);\nGLAPI void APIENTRY glPointSizexOES (GLfixed size);\nGLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units);\nGLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z);\nGLAPI void APIENTRY glSampleCoverageOES (GLfixed value, GLboolean invert);\nGLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z);\nGLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param);\nGLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params);\nGLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param);\nGLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params);\nGLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z);\nGLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value);\nGLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap);\nGLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);\nGLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);\nGLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue);\nGLAPI void APIENTRY glColor3xvOES (const GLfixed *components);\nGLAPI void APIENTRY glColor4xvOES (const GLfixed *components);\nGLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param);\nGLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params);\nGLAPI void APIENTRY glEvalCoord1xOES (GLfixed u);\nGLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v);\nGLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer);\nGLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params);\nGLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params);\nGLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params);\nGLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v);\nGLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param);\nGLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values);\nGLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params);\nGLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params);\nGLAPI void APIENTRY glIndexxOES (GLfixed component);\nGLAPI void APIENTRY glIndexxvOES (const GLfixed *component);\nGLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m);\nGLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points);\nGLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points);\nGLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2);\nGLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2);\nGLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m);\nGLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s);\nGLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords);\nGLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t);\nGLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords);\nGLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r);\nGLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords);\nGLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords);\nGLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glPassThroughxOES (GLfixed token);\nGLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values);\nGLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param);\nGLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param);\nGLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor);\nGLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities);\nGLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y);\nGLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z);\nGLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w);\nGLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2);\nGLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2);\nGLAPI void APIENTRY glTexCoord1xOES (GLfixed s);\nGLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t);\nGLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r);\nGLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q);\nGLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param);\nGLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params);\nGLAPI void APIENTRY glVertex2xOES (GLfixed x);\nGLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y);\nGLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords);\nGLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z);\nGLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords);\n#endif\n#endif /* GL_OES_fixed_point */\n\n#ifndef GL_OES_query_matrix\n#define GL_OES_query_matrix 1\ntypedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent);\n#endif\n#endif /* GL_OES_query_matrix */\n\n#ifndef GL_OES_read_format\n#define GL_OES_read_format 1\n#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A\n#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B\n#endif /* GL_OES_read_format */\n\n#ifndef GL_OES_single_precision\n#define GL_OES_single_precision 1\ntypedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth);\ntypedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation);\ntypedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f);\ntypedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);\ntypedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation);\ntypedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glClearDepthfOES (GLclampf depth);\nGLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation);\nGLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f);\nGLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);\nGLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation);\nGLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);\n#endif\n#endif /* GL_OES_single_precision */\n\n#ifndef GL_3DFX_multisample\n#define GL_3DFX_multisample 1\n#define GL_MULTISAMPLE_3DFX               0x86B2\n#define GL_SAMPLE_BUFFERS_3DFX            0x86B3\n#define GL_SAMPLES_3DFX                   0x86B4\n#define GL_MULTISAMPLE_BIT_3DFX           0x20000000\n#endif /* GL_3DFX_multisample */\n\n#ifndef GL_3DFX_tbuffer\n#define GL_3DFX_tbuffer 1\ntypedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTbufferMask3DFX (GLuint mask);\n#endif\n#endif /* GL_3DFX_tbuffer */\n\n#ifndef GL_3DFX_texture_compression_FXT1\n#define GL_3DFX_texture_compression_FXT1 1\n#define GL_COMPRESSED_RGB_FXT1_3DFX       0x86B0\n#define GL_COMPRESSED_RGBA_FXT1_3DFX      0x86B1\n#endif /* GL_3DFX_texture_compression_FXT1 */\n\n#ifndef GL_AMD_blend_minmax_factor\n#define GL_AMD_blend_minmax_factor 1\n#define GL_FACTOR_MIN_AMD                 0x901C\n#define GL_FACTOR_MAX_AMD                 0x901D\n#endif /* GL_AMD_blend_minmax_factor */\n\n#ifndef GL_AMD_conservative_depth\n#define GL_AMD_conservative_depth 1\n#endif /* GL_AMD_conservative_depth */\n\n#ifndef GL_AMD_debug_output\n#define GL_AMD_debug_output 1\ntypedef void (APIENTRY  *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);\n#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD   0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD  0x9144\n#define GL_DEBUG_LOGGED_MESSAGES_AMD      0x9145\n#define GL_DEBUG_SEVERITY_HIGH_AMD        0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM_AMD      0x9147\n#define GL_DEBUG_SEVERITY_LOW_AMD         0x9148\n#define GL_DEBUG_CATEGORY_API_ERROR_AMD   0x9149\n#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A\n#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B\n#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C\n#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D\n#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E\n#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F\n#define GL_DEBUG_CATEGORY_OTHER_AMD       0x9150\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam);\ntypedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\nGLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf);\nGLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam);\nGLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message);\n#endif\n#endif /* GL_AMD_debug_output */\n\n#ifndef GL_AMD_depth_clamp_separate\n#define GL_AMD_depth_clamp_separate 1\n#define GL_DEPTH_CLAMP_NEAR_AMD           0x901E\n#define GL_DEPTH_CLAMP_FAR_AMD            0x901F\n#endif /* GL_AMD_depth_clamp_separate */\n\n#ifndef GL_AMD_draw_buffers_blend\n#define GL_AMD_draw_buffers_blend 1\ntypedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst);\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst);\nGLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\nGLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode);\nGLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\n#endif\n#endif /* GL_AMD_draw_buffers_blend */\n\n#ifndef GL_AMD_gcn_shader\n#define GL_AMD_gcn_shader 1\n#endif /* GL_AMD_gcn_shader */\n\n#ifndef GL_AMD_gpu_shader_int64\n#define GL_AMD_gpu_shader_int64 1\ntypedef int64_t GLint64EXT;\n#define GL_INT64_NV                       0x140E\n#define GL_UNSIGNED_INT64_NV              0x140F\n#define GL_INT8_NV                        0x8FE0\n#define GL_INT8_VEC2_NV                   0x8FE1\n#define GL_INT8_VEC3_NV                   0x8FE2\n#define GL_INT8_VEC4_NV                   0x8FE3\n#define GL_INT16_NV                       0x8FE4\n#define GL_INT16_VEC2_NV                  0x8FE5\n#define GL_INT16_VEC3_NV                  0x8FE6\n#define GL_INT16_VEC4_NV                  0x8FE7\n#define GL_INT64_VEC2_NV                  0x8FE9\n#define GL_INT64_VEC3_NV                  0x8FEA\n#define GL_INT64_VEC4_NV                  0x8FEB\n#define GL_UNSIGNED_INT8_NV               0x8FEC\n#define GL_UNSIGNED_INT8_VEC2_NV          0x8FED\n#define GL_UNSIGNED_INT8_VEC3_NV          0x8FEE\n#define GL_UNSIGNED_INT8_VEC4_NV          0x8FEF\n#define GL_UNSIGNED_INT16_NV              0x8FF0\n#define GL_UNSIGNED_INT16_VEC2_NV         0x8FF1\n#define GL_UNSIGNED_INT16_VEC3_NV         0x8FF2\n#define GL_UNSIGNED_INT16_VEC4_NV         0x8FF3\n#define GL_UNSIGNED_INT64_VEC2_NV         0x8FF5\n#define GL_UNSIGNED_INT64_VEC3_NV         0x8FF6\n#define GL_UNSIGNED_INT64_VEC4_NV         0x8FF7\n#define GL_FLOAT16_NV                     0x8FF8\n#define GL_FLOAT16_VEC2_NV                0x8FF9\n#define GL_FLOAT16_VEC3_NV                0x8FFA\n#define GL_FLOAT16_VEC4_NV                0x8FFB\ntypedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x);\ntypedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y);\ntypedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);\ntypedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\ntypedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value);\ntypedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x);\ntypedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y);\ntypedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\ntypedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\ntypedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);\ntypedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params);\ntypedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x);\nGLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y);\nGLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);\nGLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\nGLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value);\nGLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value);\nGLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value);\nGLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value);\nGLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x);\nGLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y);\nGLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\nGLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\nGLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);\nGLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);\nGLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);\nGLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);\nGLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params);\nGLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params);\nGLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x);\nGLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y);\nGLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);\nGLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\nGLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);\nGLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);\nGLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);\nGLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);\nGLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x);\nGLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y);\nGLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\nGLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\nGLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\nGLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\nGLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\nGLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\n#endif\n#endif /* GL_AMD_gpu_shader_int64 */\n\n#ifndef GL_AMD_interleaved_elements\n#define GL_AMD_interleaved_elements 1\n#define GL_VERTEX_ELEMENT_SWIZZLE_AMD     0x91A4\n#define GL_VERTEX_ID_SWIZZLE_AMD          0x91A5\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param);\n#endif\n#endif /* GL_AMD_interleaved_elements */\n\n#ifndef GL_AMD_multi_draw_indirect\n#define GL_AMD_multi_draw_indirect 1\ntypedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride);\nGLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride);\n#endif\n#endif /* GL_AMD_multi_draw_indirect */\n\n#ifndef GL_AMD_name_gen_delete\n#define GL_AMD_name_gen_delete 1\n#define GL_DATA_BUFFER_AMD                0x9151\n#define GL_PERFORMANCE_MONITOR_AMD        0x9152\n#define GL_QUERY_OBJECT_AMD               0x9153\n#define GL_VERTEX_ARRAY_OBJECT_AMD        0x9154\n#define GL_SAMPLER_OBJECT_AMD             0x9155\ntypedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names);\ntypedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names);\ntypedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names);\nGLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names);\nGLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name);\n#endif\n#endif /* GL_AMD_name_gen_delete */\n\n#ifndef GL_AMD_occlusion_query_event\n#define GL_AMD_occlusion_query_event 1\n#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F\n#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001\n#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002\n#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004\n#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008\n#define GL_QUERY_ALL_EVENT_BITS_AMD       0xFFFFFFFF\ntypedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param);\n#endif\n#endif /* GL_AMD_occlusion_query_event */\n\n#ifndef GL_AMD_performance_monitor\n#define GL_AMD_performance_monitor 1\n#define GL_COUNTER_TYPE_AMD               0x8BC0\n#define GL_COUNTER_RANGE_AMD              0x8BC1\n#define GL_UNSIGNED_INT64_AMD             0x8BC2\n#define GL_PERCENTAGE_AMD                 0x8BC3\n#define GL_PERFMON_RESULT_AVAILABLE_AMD   0x8BC4\n#define GL_PERFMON_RESULT_SIZE_AMD        0x8BC5\n#define GL_PERFMON_RESULT_AMD             0x8BC6\ntypedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups);\ntypedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);\ntypedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);\ntypedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);\ntypedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data);\ntypedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);\ntypedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);\ntypedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList);\ntypedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);\ntypedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);\ntypedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups);\nGLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);\nGLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);\nGLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);\nGLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data);\nGLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors);\nGLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors);\nGLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList);\nGLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor);\nGLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor);\nGLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);\n#endif\n#endif /* GL_AMD_performance_monitor */\n\n#ifndef GL_AMD_pinned_memory\n#define GL_AMD_pinned_memory 1\n#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160\n#endif /* GL_AMD_pinned_memory */\n\n#ifndef GL_AMD_query_buffer_object\n#define GL_AMD_query_buffer_object 1\n#define GL_QUERY_BUFFER_AMD               0x9192\n#define GL_QUERY_BUFFER_BINDING_AMD       0x9193\n#define GL_QUERY_RESULT_NO_WAIT_AMD       0x9194\n#endif /* GL_AMD_query_buffer_object */\n\n#ifndef GL_AMD_sample_positions\n#define GL_AMD_sample_positions 1\n#define GL_SUBSAMPLE_DISTANCE_AMD         0x883F\ntypedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val);\n#endif\n#endif /* GL_AMD_sample_positions */\n\n#ifndef GL_AMD_seamless_cubemap_per_texture\n#define GL_AMD_seamless_cubemap_per_texture 1\n#endif /* GL_AMD_seamless_cubemap_per_texture */\n\n#ifndef GL_AMD_shader_atomic_counter_ops\n#define GL_AMD_shader_atomic_counter_ops 1\n#endif /* GL_AMD_shader_atomic_counter_ops */\n\n#ifndef GL_AMD_shader_stencil_export\n#define GL_AMD_shader_stencil_export 1\n#endif /* GL_AMD_shader_stencil_export */\n\n#ifndef GL_AMD_shader_trinary_minmax\n#define GL_AMD_shader_trinary_minmax 1\n#endif /* GL_AMD_shader_trinary_minmax */\n\n#ifndef GL_AMD_sparse_texture\n#define GL_AMD_sparse_texture 1\n#define GL_VIRTUAL_PAGE_SIZE_X_AMD        0x9195\n#define GL_VIRTUAL_PAGE_SIZE_Y_AMD        0x9196\n#define GL_VIRTUAL_PAGE_SIZE_Z_AMD        0x9197\n#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD    0x9198\n#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199\n#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A\n#define GL_MIN_SPARSE_LEVEL_AMD           0x919B\n#define GL_MIN_LOD_WARNING_AMD            0x919C\n#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001\ntypedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);\nGLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);\n#endif\n#endif /* GL_AMD_sparse_texture */\n\n#ifndef GL_AMD_stencil_operation_extended\n#define GL_AMD_stencil_operation_extended 1\n#define GL_SET_AMD                        0x874A\n#define GL_REPLACE_VALUE_AMD              0x874B\n#define GL_STENCIL_OP_VALUE_AMD           0x874C\n#define GL_STENCIL_BACK_OP_VALUE_AMD      0x874D\ntypedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value);\n#endif\n#endif /* GL_AMD_stencil_operation_extended */\n\n#ifndef GL_AMD_texture_texture4\n#define GL_AMD_texture_texture4 1\n#endif /* GL_AMD_texture_texture4 */\n\n#ifndef GL_AMD_transform_feedback3_lines_triangles\n#define GL_AMD_transform_feedback3_lines_triangles 1\n#endif /* GL_AMD_transform_feedback3_lines_triangles */\n\n#ifndef GL_AMD_transform_feedback4\n#define GL_AMD_transform_feedback4 1\n#define GL_STREAM_RASTERIZATION_AMD       0x91A0\n#endif /* GL_AMD_transform_feedback4 */\n\n#ifndef GL_AMD_vertex_shader_layer\n#define GL_AMD_vertex_shader_layer 1\n#endif /* GL_AMD_vertex_shader_layer */\n\n#ifndef GL_AMD_vertex_shader_tessellator\n#define GL_AMD_vertex_shader_tessellator 1\n#define GL_SAMPLER_BUFFER_AMD             0x9001\n#define GL_INT_SAMPLER_BUFFER_AMD         0x9002\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003\n#define GL_TESSELLATION_MODE_AMD          0x9004\n#define GL_TESSELLATION_FACTOR_AMD        0x9005\n#define GL_DISCRETE_AMD                   0x9006\n#define GL_CONTINUOUS_AMD                 0x9007\ntypedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor);\ntypedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor);\nGLAPI void APIENTRY glTessellationModeAMD (GLenum mode);\n#endif\n#endif /* GL_AMD_vertex_shader_tessellator */\n\n#ifndef GL_AMD_vertex_shader_viewport_index\n#define GL_AMD_vertex_shader_viewport_index 1\n#endif /* GL_AMD_vertex_shader_viewport_index */\n\n#ifndef GL_APPLE_aux_depth_stencil\n#define GL_APPLE_aux_depth_stencil 1\n#define GL_AUX_DEPTH_STENCIL_APPLE        0x8A14\n#endif /* GL_APPLE_aux_depth_stencil */\n\n#ifndef GL_APPLE_client_storage\n#define GL_APPLE_client_storage 1\n#define GL_UNPACK_CLIENT_STORAGE_APPLE    0x85B2\n#endif /* GL_APPLE_client_storage */\n\n#ifndef GL_APPLE_element_array\n#define GL_APPLE_element_array 1\n#define GL_ELEMENT_ARRAY_APPLE            0x8A0C\n#define GL_ELEMENT_ARRAY_TYPE_APPLE       0x8A0D\n#define GL_ELEMENT_ARRAY_POINTER_APPLE    0x8A0E\ntypedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count);\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);\ntypedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer);\nGLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count);\nGLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);\nGLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);\nGLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount);\n#endif\n#endif /* GL_APPLE_element_array */\n\n#ifndef GL_APPLE_fence\n#define GL_APPLE_fence 1\n#define GL_DRAW_PIXELS_APPLE              0x8A0A\n#define GL_FENCE_APPLE                    0x8A0B\ntypedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences);\ntypedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences);\ntypedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence);\ntypedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence);\ntypedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence);\ntypedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence);\ntypedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name);\ntypedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences);\nGLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences);\nGLAPI void APIENTRY glSetFenceAPPLE (GLuint fence);\nGLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence);\nGLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence);\nGLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence);\nGLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name);\nGLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name);\n#endif\n#endif /* GL_APPLE_fence */\n\n#ifndef GL_APPLE_float_pixels\n#define GL_APPLE_float_pixels 1\n#define GL_HALF_APPLE                     0x140B\n#define GL_RGBA_FLOAT32_APPLE             0x8814\n#define GL_RGB_FLOAT32_APPLE              0x8815\n#define GL_ALPHA_FLOAT32_APPLE            0x8816\n#define GL_INTENSITY_FLOAT32_APPLE        0x8817\n#define GL_LUMINANCE_FLOAT32_APPLE        0x8818\n#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE  0x8819\n#define GL_RGBA_FLOAT16_APPLE             0x881A\n#define GL_RGB_FLOAT16_APPLE              0x881B\n#define GL_ALPHA_FLOAT16_APPLE            0x881C\n#define GL_INTENSITY_FLOAT16_APPLE        0x881D\n#define GL_LUMINANCE_FLOAT16_APPLE        0x881E\n#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE  0x881F\n#define GL_COLOR_FLOAT_APPLE              0x8A0F\n#endif /* GL_APPLE_float_pixels */\n\n#ifndef GL_APPLE_flush_buffer_range\n#define GL_APPLE_flush_buffer_range 1\n#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12\n#define GL_BUFFER_FLUSHING_UNMAP_APPLE    0x8A13\ntypedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size);\n#endif\n#endif /* GL_APPLE_flush_buffer_range */\n\n#ifndef GL_APPLE_object_purgeable\n#define GL_APPLE_object_purgeable 1\n#define GL_BUFFER_OBJECT_APPLE            0x85B3\n#define GL_RELEASED_APPLE                 0x8A19\n#define GL_VOLATILE_APPLE                 0x8A1A\n#define GL_RETAINED_APPLE                 0x8A1B\n#define GL_UNDEFINED_APPLE                0x8A1C\n#define GL_PURGEABLE_APPLE                0x8A1D\ntypedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);\ntypedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);\ntypedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option);\nGLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option);\nGLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params);\n#endif\n#endif /* GL_APPLE_object_purgeable */\n\n#ifndef GL_APPLE_rgb_422\n#define GL_APPLE_rgb_422 1\n#define GL_RGB_422_APPLE                  0x8A1F\n#define GL_UNSIGNED_SHORT_8_8_APPLE       0x85BA\n#define GL_UNSIGNED_SHORT_8_8_REV_APPLE   0x85BB\n#define GL_RGB_RAW_422_APPLE              0x8A51\n#endif /* GL_APPLE_rgb_422 */\n\n#ifndef GL_APPLE_row_bytes\n#define GL_APPLE_row_bytes 1\n#define GL_PACK_ROW_BYTES_APPLE           0x8A15\n#define GL_UNPACK_ROW_BYTES_APPLE         0x8A16\n#endif /* GL_APPLE_row_bytes */\n\n#ifndef GL_APPLE_specular_vector\n#define GL_APPLE_specular_vector 1\n#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0\n#endif /* GL_APPLE_specular_vector */\n\n#ifndef GL_APPLE_texture_range\n#define GL_APPLE_texture_range 1\n#define GL_TEXTURE_RANGE_LENGTH_APPLE     0x85B7\n#define GL_TEXTURE_RANGE_POINTER_APPLE    0x85B8\n#define GL_TEXTURE_STORAGE_HINT_APPLE     0x85BC\n#define GL_STORAGE_PRIVATE_APPLE          0x85BD\n#define GL_STORAGE_CACHED_APPLE           0x85BE\n#define GL_STORAGE_SHARED_APPLE           0x85BF\ntypedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer);\nGLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params);\n#endif\n#endif /* GL_APPLE_texture_range */\n\n#ifndef GL_APPLE_transform_hint\n#define GL_APPLE_transform_hint 1\n#define GL_TRANSFORM_HINT_APPLE           0x85B1\n#endif /* GL_APPLE_transform_hint */\n\n#ifndef GL_APPLE_vertex_array_object\n#define GL_APPLE_vertex_array_object 1\n#define GL_VERTEX_ARRAY_BINDING_APPLE     0x85B5\ntypedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);\ntypedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays);\ntypedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays);\ntypedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array);\nGLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays);\nGLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays);\nGLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array);\n#endif\n#endif /* GL_APPLE_vertex_array_object */\n\n#ifndef GL_APPLE_vertex_array_range\n#define GL_APPLE_vertex_array_range 1\n#define GL_VERTEX_ARRAY_RANGE_APPLE       0x851D\n#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E\n#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F\n#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521\n#define GL_STORAGE_CLIENT_APPLE           0x85B4\ntypedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer);\ntypedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer);\nGLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer);\nGLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param);\n#endif\n#endif /* GL_APPLE_vertex_array_range */\n\n#ifndef GL_APPLE_vertex_program_evaluators\n#define GL_APPLE_vertex_program_evaluators 1\n#define GL_VERTEX_ATTRIB_MAP1_APPLE       0x8A00\n#define GL_VERTEX_ATTRIB_MAP2_APPLE       0x8A01\n#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE  0x8A02\n#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03\n#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04\n#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05\n#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE  0x8A06\n#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07\n#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08\n#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09\ntypedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);\ntypedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);\ntypedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname);\ntypedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);\ntypedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);\ntypedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);\ntypedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname);\nGLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname);\nGLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname);\nGLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);\nGLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);\nGLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);\nGLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);\n#endif\n#endif /* GL_APPLE_vertex_program_evaluators */\n\n#ifndef GL_APPLE_ycbcr_422\n#define GL_APPLE_ycbcr_422 1\n#define GL_YCBCR_422_APPLE                0x85B9\n#endif /* GL_APPLE_ycbcr_422 */\n\n#ifndef GL_ATI_draw_buffers\n#define GL_ATI_draw_buffers 1\n#define GL_MAX_DRAW_BUFFERS_ATI           0x8824\n#define GL_DRAW_BUFFER0_ATI               0x8825\n#define GL_DRAW_BUFFER1_ATI               0x8826\n#define GL_DRAW_BUFFER2_ATI               0x8827\n#define GL_DRAW_BUFFER3_ATI               0x8828\n#define GL_DRAW_BUFFER4_ATI               0x8829\n#define GL_DRAW_BUFFER5_ATI               0x882A\n#define GL_DRAW_BUFFER6_ATI               0x882B\n#define GL_DRAW_BUFFER7_ATI               0x882C\n#define GL_DRAW_BUFFER8_ATI               0x882D\n#define GL_DRAW_BUFFER9_ATI               0x882E\n#define GL_DRAW_BUFFER10_ATI              0x882F\n#define GL_DRAW_BUFFER11_ATI              0x8830\n#define GL_DRAW_BUFFER12_ATI              0x8831\n#define GL_DRAW_BUFFER13_ATI              0x8832\n#define GL_DRAW_BUFFER14_ATI              0x8833\n#define GL_DRAW_BUFFER15_ATI              0x8834\ntypedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs);\n#endif\n#endif /* GL_ATI_draw_buffers */\n\n#ifndef GL_ATI_element_array\n#define GL_ATI_element_array 1\n#define GL_ELEMENT_ARRAY_ATI              0x8768\n#define GL_ELEMENT_ARRAY_TYPE_ATI         0x8769\n#define GL_ELEMENT_ARRAY_POINTER_ATI      0x876A\ntypedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count);\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer);\nGLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count);\nGLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count);\n#endif\n#endif /* GL_ATI_element_array */\n\n#ifndef GL_ATI_envmap_bumpmap\n#define GL_ATI_envmap_bumpmap 1\n#define GL_BUMP_ROT_MATRIX_ATI            0x8775\n#define GL_BUMP_ROT_MATRIX_SIZE_ATI       0x8776\n#define GL_BUMP_NUM_TEX_UNITS_ATI         0x8777\n#define GL_BUMP_TEX_UNITS_ATI             0x8778\n#define GL_DUDV_ATI                       0x8779\n#define GL_DU8DV8_ATI                     0x877A\n#define GL_BUMP_ENVMAP_ATI                0x877B\n#define GL_BUMP_TARGET_ATI                0x877C\ntypedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param);\ntypedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param);\ntypedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);\ntypedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param);\nGLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param);\nGLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param);\nGLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param);\n#endif\n#endif /* GL_ATI_envmap_bumpmap */\n\n#ifndef GL_ATI_fragment_shader\n#define GL_ATI_fragment_shader 1\n#define GL_FRAGMENT_SHADER_ATI            0x8920\n#define GL_REG_0_ATI                      0x8921\n#define GL_REG_1_ATI                      0x8922\n#define GL_REG_2_ATI                      0x8923\n#define GL_REG_3_ATI                      0x8924\n#define GL_REG_4_ATI                      0x8925\n#define GL_REG_5_ATI                      0x8926\n#define GL_REG_6_ATI                      0x8927\n#define GL_REG_7_ATI                      0x8928\n#define GL_REG_8_ATI                      0x8929\n#define GL_REG_9_ATI                      0x892A\n#define GL_REG_10_ATI                     0x892B\n#define GL_REG_11_ATI                     0x892C\n#define GL_REG_12_ATI                     0x892D\n#define GL_REG_13_ATI                     0x892E\n#define GL_REG_14_ATI                     0x892F\n#define GL_REG_15_ATI                     0x8930\n#define GL_REG_16_ATI                     0x8931\n#define GL_REG_17_ATI                     0x8932\n#define GL_REG_18_ATI                     0x8933\n#define GL_REG_19_ATI                     0x8934\n#define GL_REG_20_ATI                     0x8935\n#define GL_REG_21_ATI                     0x8936\n#define GL_REG_22_ATI                     0x8937\n#define GL_REG_23_ATI                     0x8938\n#define GL_REG_24_ATI                     0x8939\n#define GL_REG_25_ATI                     0x893A\n#define GL_REG_26_ATI                     0x893B\n#define GL_REG_27_ATI                     0x893C\n#define GL_REG_28_ATI                     0x893D\n#define GL_REG_29_ATI                     0x893E\n#define GL_REG_30_ATI                     0x893F\n#define GL_REG_31_ATI                     0x8940\n#define GL_CON_0_ATI                      0x8941\n#define GL_CON_1_ATI                      0x8942\n#define GL_CON_2_ATI                      0x8943\n#define GL_CON_3_ATI                      0x8944\n#define GL_CON_4_ATI                      0x8945\n#define GL_CON_5_ATI                      0x8946\n#define GL_CON_6_ATI                      0x8947\n#define GL_CON_7_ATI                      0x8948\n#define GL_CON_8_ATI                      0x8949\n#define GL_CON_9_ATI                      0x894A\n#define GL_CON_10_ATI                     0x894B\n#define GL_CON_11_ATI                     0x894C\n#define GL_CON_12_ATI                     0x894D\n#define GL_CON_13_ATI                     0x894E\n#define GL_CON_14_ATI                     0x894F\n#define GL_CON_15_ATI                     0x8950\n#define GL_CON_16_ATI                     0x8951\n#define GL_CON_17_ATI                     0x8952\n#define GL_CON_18_ATI                     0x8953\n#define GL_CON_19_ATI                     0x8954\n#define GL_CON_20_ATI                     0x8955\n#define GL_CON_21_ATI                     0x8956\n#define GL_CON_22_ATI                     0x8957\n#define GL_CON_23_ATI                     0x8958\n#define GL_CON_24_ATI                     0x8959\n#define GL_CON_25_ATI                     0x895A\n#define GL_CON_26_ATI                     0x895B\n#define GL_CON_27_ATI                     0x895C\n#define GL_CON_28_ATI                     0x895D\n#define GL_CON_29_ATI                     0x895E\n#define GL_CON_30_ATI                     0x895F\n#define GL_CON_31_ATI                     0x8960\n#define GL_MOV_ATI                        0x8961\n#define GL_ADD_ATI                        0x8963\n#define GL_MUL_ATI                        0x8964\n#define GL_SUB_ATI                        0x8965\n#define GL_DOT3_ATI                       0x8966\n#define GL_DOT4_ATI                       0x8967\n#define GL_MAD_ATI                        0x8968\n#define GL_LERP_ATI                       0x8969\n#define GL_CND_ATI                        0x896A\n#define GL_CND0_ATI                       0x896B\n#define GL_DOT2_ADD_ATI                   0x896C\n#define GL_SECONDARY_INTERPOLATOR_ATI     0x896D\n#define GL_NUM_FRAGMENT_REGISTERS_ATI     0x896E\n#define GL_NUM_FRAGMENT_CONSTANTS_ATI     0x896F\n#define GL_NUM_PASSES_ATI                 0x8970\n#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI  0x8971\n#define GL_NUM_INSTRUCTIONS_TOTAL_ATI     0x8972\n#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973\n#define GL_NUM_LOOPBACK_COMPONENTS_ATI    0x8974\n#define GL_COLOR_ALPHA_PAIRING_ATI        0x8975\n#define GL_SWIZZLE_STR_ATI                0x8976\n#define GL_SWIZZLE_STQ_ATI                0x8977\n#define GL_SWIZZLE_STR_DR_ATI             0x8978\n#define GL_SWIZZLE_STQ_DQ_ATI             0x8979\n#define GL_SWIZZLE_STRQ_ATI               0x897A\n#define GL_SWIZZLE_STRQ_DQ_ATI            0x897B\n#define GL_RED_BIT_ATI                    0x00000001\n#define GL_GREEN_BIT_ATI                  0x00000002\n#define GL_BLUE_BIT_ATI                   0x00000004\n#define GL_2X_BIT_ATI                     0x00000001\n#define GL_4X_BIT_ATI                     0x00000002\n#define GL_8X_BIT_ATI                     0x00000004\n#define GL_HALF_BIT_ATI                   0x00000008\n#define GL_QUARTER_BIT_ATI                0x00000010\n#define GL_EIGHTH_BIT_ATI                 0x00000020\n#define GL_SATURATE_BIT_ATI               0x00000040\n#define GL_COMP_BIT_ATI                   0x00000002\n#define GL_NEGATE_BIT_ATI                 0x00000004\n#define GL_BIAS_BIT_ATI                   0x00000008\ntypedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range);\ntypedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void);\ntypedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void);\ntypedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle);\ntypedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle);\ntypedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);\ntypedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);\ntypedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);\ntypedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);\ntypedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);\ntypedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);\ntypedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range);\nGLAPI void APIENTRY glBindFragmentShaderATI (GLuint id);\nGLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id);\nGLAPI void APIENTRY glBeginFragmentShaderATI (void);\nGLAPI void APIENTRY glEndFragmentShaderATI (void);\nGLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle);\nGLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle);\nGLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);\nGLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);\nGLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);\nGLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);\nGLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);\nGLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);\nGLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value);\n#endif\n#endif /* GL_ATI_fragment_shader */\n\n#ifndef GL_ATI_map_object_buffer\n#define GL_ATI_map_object_buffer 1\ntypedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer);\nGLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer);\n#endif\n#endif /* GL_ATI_map_object_buffer */\n\n#ifndef GL_ATI_meminfo\n#define GL_ATI_meminfo 1\n#define GL_VBO_FREE_MEMORY_ATI            0x87FB\n#define GL_TEXTURE_FREE_MEMORY_ATI        0x87FC\n#define GL_RENDERBUFFER_FREE_MEMORY_ATI   0x87FD\n#endif /* GL_ATI_meminfo */\n\n#ifndef GL_ATI_pixel_format_float\n#define GL_ATI_pixel_format_float 1\n#define GL_RGBA_FLOAT_MODE_ATI            0x8820\n#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835\n#endif /* GL_ATI_pixel_format_float */\n\n#ifndef GL_ATI_pn_triangles\n#define GL_ATI_pn_triangles 1\n#define GL_PN_TRIANGLES_ATI               0x87F0\n#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1\n#define GL_PN_TRIANGLES_POINT_MODE_ATI    0x87F2\n#define GL_PN_TRIANGLES_NORMAL_MODE_ATI   0x87F3\n#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4\n#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5\n#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6\n#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7\n#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8\ntypedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param);\nGLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param);\n#endif\n#endif /* GL_ATI_pn_triangles */\n\n#ifndef GL_ATI_separate_stencil\n#define GL_ATI_separate_stencil 1\n#define GL_STENCIL_BACK_FUNC_ATI          0x8800\n#define GL_STENCIL_BACK_FAIL_ATI          0x8801\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803\ntypedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\ntypedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\nGLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);\n#endif\n#endif /* GL_ATI_separate_stencil */\n\n#ifndef GL_ATI_text_fragment_shader\n#define GL_ATI_text_fragment_shader 1\n#define GL_TEXT_FRAGMENT_SHADER_ATI       0x8200\n#endif /* GL_ATI_text_fragment_shader */\n\n#ifndef GL_ATI_texture_env_combine3\n#define GL_ATI_texture_env_combine3 1\n#define GL_MODULATE_ADD_ATI               0x8744\n#define GL_MODULATE_SIGNED_ADD_ATI        0x8745\n#define GL_MODULATE_SUBTRACT_ATI          0x8746\n#endif /* GL_ATI_texture_env_combine3 */\n\n#ifndef GL_ATI_texture_float\n#define GL_ATI_texture_float 1\n#define GL_RGBA_FLOAT32_ATI               0x8814\n#define GL_RGB_FLOAT32_ATI                0x8815\n#define GL_ALPHA_FLOAT32_ATI              0x8816\n#define GL_INTENSITY_FLOAT32_ATI          0x8817\n#define GL_LUMINANCE_FLOAT32_ATI          0x8818\n#define GL_LUMINANCE_ALPHA_FLOAT32_ATI    0x8819\n#define GL_RGBA_FLOAT16_ATI               0x881A\n#define GL_RGB_FLOAT16_ATI                0x881B\n#define GL_ALPHA_FLOAT16_ATI              0x881C\n#define GL_INTENSITY_FLOAT16_ATI          0x881D\n#define GL_LUMINANCE_FLOAT16_ATI          0x881E\n#define GL_LUMINANCE_ALPHA_FLOAT16_ATI    0x881F\n#endif /* GL_ATI_texture_float */\n\n#ifndef GL_ATI_texture_mirror_once\n#define GL_ATI_texture_mirror_once 1\n#define GL_MIRROR_CLAMP_ATI               0x8742\n#define GL_MIRROR_CLAMP_TO_EDGE_ATI       0x8743\n#endif /* GL_ATI_texture_mirror_once */\n\n#ifndef GL_ATI_vertex_array_object\n#define GL_ATI_vertex_array_object 1\n#define GL_STATIC_ATI                     0x8760\n#define GL_DYNAMIC_ATI                    0x8761\n#define GL_PRESERVE_ATI                   0x8762\n#define GL_DISCARD_ATI                    0x8763\n#define GL_OBJECT_BUFFER_SIZE_ATI         0x8764\n#define GL_OBJECT_BUFFER_USAGE_ATI        0x8765\n#define GL_ARRAY_OBJECT_BUFFER_ATI        0x8766\n#define GL_ARRAY_OBJECT_OFFSET_ATI        0x8767\ntypedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage);\ntypedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve);\ntypedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);\ntypedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);\ntypedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage);\nGLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer);\nGLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve);\nGLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params);\nGLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer);\nGLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);\nGLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params);\nGLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);\nGLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params);\n#endif\n#endif /* GL_ATI_vertex_array_object */\n\n#ifndef GL_ATI_vertex_attrib_array_object\n#define GL_ATI_vertex_attrib_array_object 1\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset);\nGLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params);\n#endif\n#endif /* GL_ATI_vertex_attrib_array_object */\n\n#ifndef GL_ATI_vertex_streams\n#define GL_ATI_vertex_streams 1\n#define GL_MAX_VERTEX_STREAMS_ATI         0x876B\n#define GL_VERTEX_STREAM0_ATI             0x876C\n#define GL_VERTEX_STREAM1_ATI             0x876D\n#define GL_VERTEX_STREAM2_ATI             0x876E\n#define GL_VERTEX_STREAM3_ATI             0x876F\n#define GL_VERTEX_STREAM4_ATI             0x8770\n#define GL_VERTEX_STREAM5_ATI             0x8771\n#define GL_VERTEX_STREAM6_ATI             0x8772\n#define GL_VERTEX_STREAM7_ATI             0x8773\n#define GL_VERTEX_SOURCE_ATI              0x8774\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz);\ntypedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords);\ntypedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream);\ntypedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x);\nGLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords);\nGLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x);\nGLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords);\nGLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x);\nGLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords);\nGLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x);\nGLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords);\nGLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y);\nGLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords);\nGLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y);\nGLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords);\nGLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y);\nGLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords);\nGLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords);\nGLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z);\nGLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords);\nGLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z);\nGLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords);\nGLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords);\nGLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords);\nGLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords);\nGLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords);\nGLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords);\nGLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords);\nGLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz);\nGLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords);\nGLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz);\nGLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords);\nGLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz);\nGLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords);\nGLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz);\nGLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords);\nGLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz);\nGLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords);\nGLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream);\nGLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param);\nGLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param);\n#endif\n#endif /* GL_ATI_vertex_streams */\n\n#ifndef GL_EXT_422_pixels\n#define GL_EXT_422_pixels 1\n#define GL_422_EXT                        0x80CC\n#define GL_422_REV_EXT                    0x80CD\n#define GL_422_AVERAGE_EXT                0x80CE\n#define GL_422_REV_AVERAGE_EXT            0x80CF\n#endif /* GL_EXT_422_pixels */\n\n#ifndef GL_EXT_abgr\n#define GL_EXT_abgr 1\n#define GL_ABGR_EXT                       0x8000\n#endif /* GL_EXT_abgr */\n\n#ifndef GL_EXT_bgra\n#define GL_EXT_bgra 1\n#define GL_BGR_EXT                        0x80E0\n#define GL_BGRA_EXT                       0x80E1\n#endif /* GL_EXT_bgra */\n\n#ifndef GL_EXT_bindable_uniform\n#define GL_EXT_bindable_uniform 1\n#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2\n#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3\n#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4\n#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT  0x8DED\n#define GL_UNIFORM_BUFFER_EXT             0x8DEE\n#define GL_UNIFORM_BUFFER_BINDING_EXT     0x8DEF\ntypedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer);\ntypedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location);\ntypedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer);\nGLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location);\nGLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location);\n#endif\n#endif /* GL_EXT_bindable_uniform */\n\n#ifndef GL_EXT_blend_color\n#define GL_EXT_blend_color 1\n#define GL_CONSTANT_COLOR_EXT             0x8001\n#define GL_ONE_MINUS_CONSTANT_COLOR_EXT   0x8002\n#define GL_CONSTANT_ALPHA_EXT             0x8003\n#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT   0x8004\n#define GL_BLEND_COLOR_EXT                0x8005\ntypedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\n#endif\n#endif /* GL_EXT_blend_color */\n\n#ifndef GL_EXT_blend_equation_separate\n#define GL_EXT_blend_equation_separate 1\n#define GL_BLEND_EQUATION_RGB_EXT         0x8009\n#define GL_BLEND_EQUATION_ALPHA_EXT       0x883D\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha);\n#endif\n#endif /* GL_EXT_blend_equation_separate */\n\n#ifndef GL_EXT_blend_func_separate\n#define GL_EXT_blend_func_separate 1\n#define GL_BLEND_DST_RGB_EXT              0x80C8\n#define GL_BLEND_SRC_RGB_EXT              0x80C9\n#define GL_BLEND_DST_ALPHA_EXT            0x80CA\n#define GL_BLEND_SRC_ALPHA_EXT            0x80CB\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\n#endif\n#endif /* GL_EXT_blend_func_separate */\n\n#ifndef GL_EXT_blend_logic_op\n#define GL_EXT_blend_logic_op 1\n#endif /* GL_EXT_blend_logic_op */\n\n#ifndef GL_EXT_blend_minmax\n#define GL_EXT_blend_minmax 1\n#define GL_MIN_EXT                        0x8007\n#define GL_MAX_EXT                        0x8008\n#define GL_FUNC_ADD_EXT                   0x8006\n#define GL_BLEND_EQUATION_EXT             0x8009\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendEquationEXT (GLenum mode);\n#endif\n#endif /* GL_EXT_blend_minmax */\n\n#ifndef GL_EXT_blend_subtract\n#define GL_EXT_blend_subtract 1\n#define GL_FUNC_SUBTRACT_EXT              0x800A\n#define GL_FUNC_REVERSE_SUBTRACT_EXT      0x800B\n#endif /* GL_EXT_blend_subtract */\n\n#ifndef GL_EXT_clip_volume_hint\n#define GL_EXT_clip_volume_hint 1\n#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT  0x80F0\n#endif /* GL_EXT_clip_volume_hint */\n\n#ifndef GL_EXT_cmyka\n#define GL_EXT_cmyka 1\n#define GL_CMYK_EXT                       0x800C\n#define GL_CMYKA_EXT                      0x800D\n#define GL_PACK_CMYK_HINT_EXT             0x800E\n#define GL_UNPACK_CMYK_HINT_EXT           0x800F\n#endif /* GL_EXT_cmyka */\n\n#ifndef GL_EXT_color_subtable\n#define GL_EXT_color_subtable 1\ntypedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\n#endif\n#endif /* GL_EXT_color_subtable */\n\n#ifndef GL_EXT_compiled_vertex_array\n#define GL_EXT_compiled_vertex_array 1\n#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT   0x81A8\n#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT   0x81A9\ntypedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);\ntypedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count);\nGLAPI void APIENTRY glUnlockArraysEXT (void);\n#endif\n#endif /* GL_EXT_compiled_vertex_array */\n\n#ifndef GL_EXT_convolution\n#define GL_EXT_convolution 1\n#define GL_CONVOLUTION_1D_EXT             0x8010\n#define GL_CONVOLUTION_2D_EXT             0x8011\n#define GL_SEPARABLE_2D_EXT               0x8012\n#define GL_CONVOLUTION_BORDER_MODE_EXT    0x8013\n#define GL_CONVOLUTION_FILTER_SCALE_EXT   0x8014\n#define GL_CONVOLUTION_FILTER_BIAS_EXT    0x8015\n#define GL_REDUCE_EXT                     0x8016\n#define GL_CONVOLUTION_FORMAT_EXT         0x8017\n#define GL_CONVOLUTION_WIDTH_EXT          0x8018\n#define GL_CONVOLUTION_HEIGHT_EXT         0x8019\n#define GL_MAX_CONVOLUTION_WIDTH_EXT      0x801A\n#define GL_MAX_CONVOLUTION_HEIGHT_EXT     0x801B\n#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C\n#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D\n#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E\n#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F\n#define GL_POST_CONVOLUTION_RED_BIAS_EXT  0x8020\n#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021\n#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022\n#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023\ntypedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params);\ntypedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\ntypedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image);\ntypedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);\ntypedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);\nGLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);\nGLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params);\nGLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params);\nGLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image);\nGLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);\nGLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);\n#endif\n#endif /* GL_EXT_convolution */\n\n#ifndef GL_EXT_coordinate_frame\n#define GL_EXT_coordinate_frame 1\n#define GL_TANGENT_ARRAY_EXT              0x8439\n#define GL_BINORMAL_ARRAY_EXT             0x843A\n#define GL_CURRENT_TANGENT_EXT            0x843B\n#define GL_CURRENT_BINORMAL_EXT           0x843C\n#define GL_TANGENT_ARRAY_TYPE_EXT         0x843E\n#define GL_TANGENT_ARRAY_STRIDE_EXT       0x843F\n#define GL_BINORMAL_ARRAY_TYPE_EXT        0x8440\n#define GL_BINORMAL_ARRAY_STRIDE_EXT      0x8441\n#define GL_TANGENT_ARRAY_POINTER_EXT      0x8442\n#define GL_BINORMAL_ARRAY_POINTER_EXT     0x8443\n#define GL_MAP1_TANGENT_EXT               0x8444\n#define GL_MAP2_TANGENT_EXT               0x8445\n#define GL_MAP1_BINORMAL_EXT              0x8446\n#define GL_MAP2_BINORMAL_EXT              0x8447\ntypedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz);\ntypedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v);\ntypedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz);\ntypedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz);\ntypedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz);\ntypedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz);\ntypedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v);\ntypedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz);\ntypedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v);\ntypedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz);\ntypedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz);\ntypedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz);\ntypedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz);\ntypedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v);\ntypedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz);\nGLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v);\nGLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz);\nGLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v);\nGLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz);\nGLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v);\nGLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz);\nGLAPI void APIENTRY glTangent3ivEXT (const GLint *v);\nGLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz);\nGLAPI void APIENTRY glTangent3svEXT (const GLshort *v);\nGLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz);\nGLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v);\nGLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz);\nGLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v);\nGLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz);\nGLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v);\nGLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz);\nGLAPI void APIENTRY glBinormal3ivEXT (const GLint *v);\nGLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz);\nGLAPI void APIENTRY glBinormal3svEXT (const GLshort *v);\nGLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer);\n#endif\n#endif /* GL_EXT_coordinate_frame */\n\n#ifndef GL_EXT_copy_texture\n#define GL_EXT_copy_texture 1\ntypedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\ntypedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\nGLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\nGLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n#endif\n#endif /* GL_EXT_copy_texture */\n\n#ifndef GL_EXT_cull_vertex\n#define GL_EXT_cull_vertex 1\n#define GL_CULL_VERTEX_EXT                0x81AA\n#define GL_CULL_VERTEX_EYE_POSITION_EXT   0x81AB\n#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC\ntypedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params);\ntypedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params);\nGLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params);\n#endif\n#endif /* GL_EXT_cull_vertex */\n\n#ifndef GL_EXT_debug_label\n#define GL_EXT_debug_label 1\n#define GL_PROGRAM_PIPELINE_OBJECT_EXT    0x8A4F\n#define GL_PROGRAM_OBJECT_EXT             0x8B40\n#define GL_SHADER_OBJECT_EXT              0x8B48\n#define GL_BUFFER_OBJECT_EXT              0x9151\n#define GL_QUERY_OBJECT_EXT               0x9153\n#define GL_VERTEX_ARRAY_OBJECT_EXT        0x9154\ntypedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label);\ntypedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label);\nGLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);\n#endif\n#endif /* GL_EXT_debug_label */\n\n#ifndef GL_EXT_debug_marker\n#define GL_EXT_debug_marker 1\ntypedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker);\ntypedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker);\ntypedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker);\nGLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker);\nGLAPI void APIENTRY glPopGroupMarkerEXT (void);\n#endif\n#endif /* GL_EXT_debug_marker */\n\n#ifndef GL_EXT_depth_bounds_test\n#define GL_EXT_depth_bounds_test 1\n#define GL_DEPTH_BOUNDS_TEST_EXT          0x8890\n#define GL_DEPTH_BOUNDS_EXT               0x8891\ntypedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax);\n#endif\n#endif /* GL_EXT_depth_bounds_test */\n\n#ifndef GL_EXT_direct_state_access\n#define GL_EXT_direct_state_access 1\n#define GL_PROGRAM_MATRIX_EXT             0x8E2D\n#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT   0x8E2E\n#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F\ntypedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m);\ntypedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m);\ntypedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m);\ntypedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m);\ntypedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode);\ntypedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\ntypedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\ntypedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode);\ntypedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode);\ntypedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);\ntypedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);\ntypedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\ntypedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\ntypedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\ntypedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels);\ntypedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param);\ntypedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params);\ntypedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\ntypedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\ntypedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\ntypedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels);\ntypedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);\ntypedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);\ntypedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data);\ntypedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data);\ntypedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data);\ntypedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index);\ntypedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index);\ntypedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index);\ntypedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data);\ntypedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits);\ntypedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img);\ntypedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m);\ntypedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m);\ntypedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m);\ntypedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m);\ntypedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage);\ntypedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data);\ntypedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access);\ntypedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params);\ntypedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer);\ntypedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer);\ntypedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params);\ntypedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params);\ntypedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params);\ntypedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params);\ntypedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);\ntypedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);\ntypedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string);\ntypedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target);\ntypedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\ntypedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target);\ntypedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);\ntypedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\ntypedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);\ntypedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face);\ntypedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);\ntypedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);\ntypedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);\ntypedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);\ntypedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param);\ntypedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param);\ntypedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param);\ntypedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param);\ntypedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);\ntypedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);\ntypedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags);\ntypedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);\ntypedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m);\nGLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m);\nGLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m);\nGLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m);\nGLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode);\nGLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\nGLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\nGLAPI void APIENTRY glMatrixPopEXT (GLenum mode);\nGLAPI void APIENTRY glMatrixPushEXT (GLenum mode);\nGLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask);\nGLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask);\nGLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\nGLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\nGLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels);\nGLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params);\nGLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture);\nGLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param);\nGLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params);\nGLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param);\nGLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params);\nGLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params);\nGLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\nGLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\nGLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels);\nGLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params);\nGLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index);\nGLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index);\nGLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data);\nGLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data);\nGLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data);\nGLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index);\nGLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index);\nGLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index);\nGLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data);\nGLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data);\nGLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img);\nGLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits);\nGLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img);\nGLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m);\nGLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m);\nGLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m);\nGLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m);\nGLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage);\nGLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data);\nGLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access);\nGLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer);\nGLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params);\nGLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data);\nGLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0);\nGLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1);\nGLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0);\nGLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1);\nGLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer);\nGLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer);\nGLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params);\nGLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params);\nGLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0);\nGLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1);\nGLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params);\nGLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params);\nGLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params);\nGLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\nGLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params);\nGLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params);\nGLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params);\nGLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params);\nGLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index);\nGLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index);\nGLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params);\nGLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params);\nGLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params);\nGLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string);\nGLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params);\nGLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params);\nGLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params);\nGLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params);\nGLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string);\nGLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params);\nGLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target);\nGLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\nGLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\nGLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target);\nGLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target);\nGLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode);\nGLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs);\nGLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode);\nGLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params);\nGLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\nGLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\nGLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face);\nGLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer);\nGLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer);\nGLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array);\nGLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array);\nGLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index);\nGLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index);\nGLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param);\nGLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param);\nGLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param);\nGLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param);\nGLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);\nGLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length);\nGLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags);\nGLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param);\nGLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params);\nGLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x);\nGLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\nGLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\nGLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\nGLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex);\nGLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor);\nGLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);\nGLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident);\nGLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor);\n#endif\n#endif /* GL_EXT_direct_state_access */\n\n#ifndef GL_EXT_draw_buffers2\n#define GL_EXT_draw_buffers2 1\ntypedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\n#endif\n#endif /* GL_EXT_draw_buffers2 */\n\n#ifndef GL_EXT_draw_instanced\n#define GL_EXT_draw_instanced 1\ntypedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount);\nGLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);\n#endif\n#endif /* GL_EXT_draw_instanced */\n\n#ifndef GL_EXT_draw_range_elements\n#define GL_EXT_draw_range_elements 1\n#define GL_MAX_ELEMENTS_VERTICES_EXT      0x80E8\n#define GL_MAX_ELEMENTS_INDICES_EXT       0x80E9\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);\n#endif\n#endif /* GL_EXT_draw_range_elements */\n\n#ifndef GL_EXT_fog_coord\n#define GL_EXT_fog_coord 1\n#define GL_FOG_COORDINATE_SOURCE_EXT      0x8450\n#define GL_FOG_COORDINATE_EXT             0x8451\n#define GL_FRAGMENT_DEPTH_EXT             0x8452\n#define GL_CURRENT_FOG_COORDINATE_EXT     0x8453\n#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT  0x8454\n#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455\n#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456\n#define GL_FOG_COORDINATE_ARRAY_EXT       0x8457\ntypedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord);\ntypedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);\ntypedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord);\ntypedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);\ntypedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFogCoordfEXT (GLfloat coord);\nGLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord);\nGLAPI void APIENTRY glFogCoorddEXT (GLdouble coord);\nGLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord);\nGLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer);\n#endif\n#endif /* GL_EXT_fog_coord */\n\n#ifndef GL_EXT_framebuffer_blit\n#define GL_EXT_framebuffer_blit 1\n#define GL_READ_FRAMEBUFFER_EXT           0x8CA8\n#define GL_DRAW_FRAMEBUFFER_EXT           0x8CA9\n#define GL_DRAW_FRAMEBUFFER_BINDING_EXT   0x8CA6\n#define GL_READ_FRAMEBUFFER_BINDING_EXT   0x8CAA\ntypedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n#endif\n#endif /* GL_EXT_framebuffer_blit */\n\n#ifndef GL_EXT_framebuffer_multisample\n#define GL_EXT_framebuffer_multisample 1\n#define GL_RENDERBUFFER_SAMPLES_EXT       0x8CAB\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56\n#define GL_MAX_SAMPLES_EXT                0x8D57\ntypedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n#endif\n#endif /* GL_EXT_framebuffer_multisample */\n\n#ifndef GL_EXT_framebuffer_multisample_blit_scaled\n#define GL_EXT_framebuffer_multisample_blit_scaled 1\n#define GL_SCALED_RESOLVE_FASTEST_EXT     0x90BA\n#define GL_SCALED_RESOLVE_NICEST_EXT      0x90BB\n#endif /* GL_EXT_framebuffer_multisample_blit_scaled */\n\n#ifndef GL_EXT_framebuffer_object\n#define GL_EXT_framebuffer_object 1\n#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506\n#define GL_MAX_RENDERBUFFER_SIZE_EXT      0x84E8\n#define GL_FRAMEBUFFER_BINDING_EXT        0x8CA6\n#define GL_RENDERBUFFER_BINDING_EXT       0x8CA7\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4\n#define GL_FRAMEBUFFER_COMPLETE_EXT       0x8CD5\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7\n#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9\n#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC\n#define GL_FRAMEBUFFER_UNSUPPORTED_EXT    0x8CDD\n#define GL_MAX_COLOR_ATTACHMENTS_EXT      0x8CDF\n#define GL_COLOR_ATTACHMENT0_EXT          0x8CE0\n#define GL_COLOR_ATTACHMENT1_EXT          0x8CE1\n#define GL_COLOR_ATTACHMENT2_EXT          0x8CE2\n#define GL_COLOR_ATTACHMENT3_EXT          0x8CE3\n#define GL_COLOR_ATTACHMENT4_EXT          0x8CE4\n#define GL_COLOR_ATTACHMENT5_EXT          0x8CE5\n#define GL_COLOR_ATTACHMENT6_EXT          0x8CE6\n#define GL_COLOR_ATTACHMENT7_EXT          0x8CE7\n#define GL_COLOR_ATTACHMENT8_EXT          0x8CE8\n#define GL_COLOR_ATTACHMENT9_EXT          0x8CE9\n#define GL_COLOR_ATTACHMENT10_EXT         0x8CEA\n#define GL_COLOR_ATTACHMENT11_EXT         0x8CEB\n#define GL_COLOR_ATTACHMENT12_EXT         0x8CEC\n#define GL_COLOR_ATTACHMENT13_EXT         0x8CED\n#define GL_COLOR_ATTACHMENT14_EXT         0x8CEE\n#define GL_COLOR_ATTACHMENT15_EXT         0x8CEF\n#define GL_DEPTH_ATTACHMENT_EXT           0x8D00\n#define GL_STENCIL_ATTACHMENT_EXT         0x8D20\n#define GL_FRAMEBUFFER_EXT                0x8D40\n#define GL_RENDERBUFFER_EXT               0x8D41\n#define GL_RENDERBUFFER_WIDTH_EXT         0x8D42\n#define GL_RENDERBUFFER_HEIGHT_EXT        0x8D43\n#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44\n#define GL_STENCIL_INDEX1_EXT             0x8D46\n#define GL_STENCIL_INDEX4_EXT             0x8D47\n#define GL_STENCIL_INDEX8_EXT             0x8D48\n#define GL_STENCIL_INDEX16_EXT            0x8D49\n#define GL_RENDERBUFFER_RED_SIZE_EXT      0x8D50\n#define GL_RENDERBUFFER_GREEN_SIZE_EXT    0x8D51\n#define GL_RENDERBUFFER_BLUE_SIZE_EXT     0x8D52\n#define GL_RENDERBUFFER_ALPHA_SIZE_EXT    0x8D53\n#define GL_RENDERBUFFER_DEPTH_SIZE_EXT    0x8D54\n#define GL_RENDERBUFFER_STENCIL_SIZE_EXT  0x8D55\ntypedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers);\ntypedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers);\ntypedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer);\ntypedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer);\ntypedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers);\ntypedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers);\ntypedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer);\nGLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer);\nGLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers);\nGLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers);\nGLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params);\nGLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer);\nGLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer);\nGLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers);\nGLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers);\nGLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target);\nGLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\nGLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\nGLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGenerateMipmapEXT (GLenum target);\n#endif\n#endif /* GL_EXT_framebuffer_object */\n\n#ifndef GL_EXT_framebuffer_sRGB\n#define GL_EXT_framebuffer_sRGB 1\n#define GL_FRAMEBUFFER_SRGB_EXT           0x8DB9\n#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT   0x8DBA\n#endif /* GL_EXT_framebuffer_sRGB */\n\n#ifndef GL_EXT_geometry_shader4\n#define GL_EXT_geometry_shader4 1\n#define GL_GEOMETRY_SHADER_EXT            0x8DD9\n#define GL_GEOMETRY_VERTICES_OUT_EXT      0x8DDA\n#define GL_GEOMETRY_INPUT_TYPE_EXT        0x8DDB\n#define GL_GEOMETRY_OUTPUT_TYPE_EXT       0x8DDC\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29\n#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD\n#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE\n#define GL_MAX_VARYING_COMPONENTS_EXT     0x8B4B\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1\n#define GL_LINES_ADJACENCY_EXT            0x000A\n#define GL_LINE_STRIP_ADJACENCY_EXT       0x000B\n#define GL_TRIANGLES_ADJACENCY_EXT        0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY_EXT   0x000D\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4\n#define GL_PROGRAM_POINT_SIZE_EXT         0x8642\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value);\n#endif\n#endif /* GL_EXT_geometry_shader4 */\n\n#ifndef GL_EXT_gpu_program_parameters\n#define GL_EXT_gpu_program_parameters 1\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params);\nGLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params);\n#endif\n#endif /* GL_EXT_gpu_program_parameters */\n\n#ifndef GL_EXT_gpu_shader4\n#define GL_EXT_gpu_shader4 1\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD\n#define GL_SAMPLER_1D_ARRAY_EXT           0x8DC0\n#define GL_SAMPLER_2D_ARRAY_EXT           0x8DC1\n#define GL_SAMPLER_BUFFER_EXT             0x8DC2\n#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT    0x8DC3\n#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT    0x8DC4\n#define GL_SAMPLER_CUBE_SHADOW_EXT        0x8DC5\n#define GL_UNSIGNED_INT_VEC2_EXT          0x8DC6\n#define GL_UNSIGNED_INT_VEC3_EXT          0x8DC7\n#define GL_UNSIGNED_INT_VEC4_EXT          0x8DC8\n#define GL_INT_SAMPLER_1D_EXT             0x8DC9\n#define GL_INT_SAMPLER_2D_EXT             0x8DCA\n#define GL_INT_SAMPLER_3D_EXT             0x8DCB\n#define GL_INT_SAMPLER_CUBE_EXT           0x8DCC\n#define GL_INT_SAMPLER_2D_RECT_EXT        0x8DCD\n#define GL_INT_SAMPLER_1D_ARRAY_EXT       0x8DCE\n#define GL_INT_SAMPLER_2D_ARRAY_EXT       0x8DCF\n#define GL_INT_SAMPLER_BUFFER_EXT         0x8DD0\n#define GL_UNSIGNED_INT_SAMPLER_1D_EXT    0x8DD1\n#define GL_UNSIGNED_INT_SAMPLER_2D_EXT    0x8DD2\n#define GL_UNSIGNED_INT_SAMPLER_3D_EXT    0x8DD3\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT  0x8DD4\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8\n#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT   0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT   0x8905\ntypedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params);\ntypedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name);\ntypedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name);\ntypedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0);\ntypedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1);\ntypedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);\ntypedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\ntypedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params);\nGLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name);\nGLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name);\nGLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0);\nGLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1);\nGLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value);\n#endif\n#endif /* GL_EXT_gpu_shader4 */\n\n#ifndef GL_EXT_histogram\n#define GL_EXT_histogram 1\n#define GL_HISTOGRAM_EXT                  0x8024\n#define GL_PROXY_HISTOGRAM_EXT            0x8025\n#define GL_HISTOGRAM_WIDTH_EXT            0x8026\n#define GL_HISTOGRAM_FORMAT_EXT           0x8027\n#define GL_HISTOGRAM_RED_SIZE_EXT         0x8028\n#define GL_HISTOGRAM_GREEN_SIZE_EXT       0x8029\n#define GL_HISTOGRAM_BLUE_SIZE_EXT        0x802A\n#define GL_HISTOGRAM_ALPHA_SIZE_EXT       0x802B\n#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT   0x802C\n#define GL_HISTOGRAM_SINK_EXT             0x802D\n#define GL_MINMAX_EXT                     0x802E\n#define GL_MINMAX_FORMAT_EXT              0x802F\n#define GL_MINMAX_SINK_EXT                0x8030\n#define GL_TABLE_TOO_LARGE_EXT            0x8031\ntypedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);\ntypedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);\ntypedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\ntypedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink);\ntypedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);\nGLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);\nGLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\nGLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink);\nGLAPI void APIENTRY glResetHistogramEXT (GLenum target);\nGLAPI void APIENTRY glResetMinmaxEXT (GLenum target);\n#endif\n#endif /* GL_EXT_histogram */\n\n#ifndef GL_EXT_index_array_formats\n#define GL_EXT_index_array_formats 1\n#define GL_IUI_V2F_EXT                    0x81AD\n#define GL_IUI_V3F_EXT                    0x81AE\n#define GL_IUI_N3F_V2F_EXT                0x81AF\n#define GL_IUI_N3F_V3F_EXT                0x81B0\n#define GL_T2F_IUI_V2F_EXT                0x81B1\n#define GL_T2F_IUI_V3F_EXT                0x81B2\n#define GL_T2F_IUI_N3F_V2F_EXT            0x81B3\n#define GL_T2F_IUI_N3F_V3F_EXT            0x81B4\n#endif /* GL_EXT_index_array_formats */\n\n#ifndef GL_EXT_index_func\n#define GL_EXT_index_func 1\n#define GL_INDEX_TEST_EXT                 0x81B5\n#define GL_INDEX_TEST_FUNC_EXT            0x81B6\n#define GL_INDEX_TEST_REF_EXT             0x81B7\ntypedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref);\n#endif\n#endif /* GL_EXT_index_func */\n\n#ifndef GL_EXT_index_material\n#define GL_EXT_index_material 1\n#define GL_INDEX_MATERIAL_EXT             0x81B8\n#define GL_INDEX_MATERIAL_PARAMETER_EXT   0x81B9\n#define GL_INDEX_MATERIAL_FACE_EXT        0x81BA\ntypedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode);\n#endif\n#endif /* GL_EXT_index_material */\n\n#ifndef GL_EXT_index_texture\n#define GL_EXT_index_texture 1\n#endif /* GL_EXT_index_texture */\n\n#ifndef GL_EXT_light_texture\n#define GL_EXT_light_texture 1\n#define GL_FRAGMENT_MATERIAL_EXT          0x8349\n#define GL_FRAGMENT_NORMAL_EXT            0x834A\n#define GL_FRAGMENT_COLOR_EXT             0x834C\n#define GL_ATTENUATION_EXT                0x834D\n#define GL_SHADOW_ATTENUATION_EXT         0x834E\n#define GL_TEXTURE_APPLICATION_MODE_EXT   0x834F\n#define GL_TEXTURE_LIGHT_EXT              0x8350\n#define GL_TEXTURE_MATERIAL_FACE_EXT      0x8351\n#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352\ntypedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode);\ntypedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname);\ntypedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glApplyTextureEXT (GLenum mode);\nGLAPI void APIENTRY glTextureLightEXT (GLenum pname);\nGLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode);\n#endif\n#endif /* GL_EXT_light_texture */\n\n#ifndef GL_EXT_misc_attribute\n#define GL_EXT_misc_attribute 1\n#endif /* GL_EXT_misc_attribute */\n\n#ifndef GL_EXT_multi_draw_arrays\n#define GL_EXT_multi_draw_arrays 1\ntypedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);\nGLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);\n#endif\n#endif /* GL_EXT_multi_draw_arrays */\n\n#ifndef GL_EXT_multisample\n#define GL_EXT_multisample 1\n#define GL_MULTISAMPLE_EXT                0x809D\n#define GL_SAMPLE_ALPHA_TO_MASK_EXT       0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE_EXT        0x809F\n#define GL_SAMPLE_MASK_EXT                0x80A0\n#define GL_1PASS_EXT                      0x80A1\n#define GL_2PASS_0_EXT                    0x80A2\n#define GL_2PASS_1_EXT                    0x80A3\n#define GL_4PASS_0_EXT                    0x80A4\n#define GL_4PASS_1_EXT                    0x80A5\n#define GL_4PASS_2_EXT                    0x80A6\n#define GL_4PASS_3_EXT                    0x80A7\n#define GL_SAMPLE_BUFFERS_EXT             0x80A8\n#define GL_SAMPLES_EXT                    0x80A9\n#define GL_SAMPLE_MASK_VALUE_EXT          0x80AA\n#define GL_SAMPLE_MASK_INVERT_EXT         0x80AB\n#define GL_SAMPLE_PATTERN_EXT             0x80AC\n#define GL_MULTISAMPLE_BIT_EXT            0x20000000\ntypedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);\ntypedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert);\nGLAPI void APIENTRY glSamplePatternEXT (GLenum pattern);\n#endif\n#endif /* GL_EXT_multisample */\n\n#ifndef GL_EXT_packed_depth_stencil\n#define GL_EXT_packed_depth_stencil 1\n#define GL_DEPTH_STENCIL_EXT              0x84F9\n#define GL_UNSIGNED_INT_24_8_EXT          0x84FA\n#define GL_DEPTH24_STENCIL8_EXT           0x88F0\n#define GL_TEXTURE_STENCIL_SIZE_EXT       0x88F1\n#endif /* GL_EXT_packed_depth_stencil */\n\n#ifndef GL_EXT_packed_float\n#define GL_EXT_packed_float 1\n#define GL_R11F_G11F_B10F_EXT             0x8C3A\n#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B\n#define GL_RGBA_SIGNED_COMPONENTS_EXT     0x8C3C\n#endif /* GL_EXT_packed_float */\n\n#ifndef GL_EXT_packed_pixels\n#define GL_EXT_packed_pixels 1\n#define GL_UNSIGNED_BYTE_3_3_2_EXT        0x8032\n#define GL_UNSIGNED_SHORT_4_4_4_4_EXT     0x8033\n#define GL_UNSIGNED_SHORT_5_5_5_1_EXT     0x8034\n#define GL_UNSIGNED_INT_8_8_8_8_EXT       0x8035\n#define GL_UNSIGNED_INT_10_10_10_2_EXT    0x8036\n#endif /* GL_EXT_packed_pixels */\n\n#ifndef GL_EXT_paletted_texture\n#define GL_EXT_paletted_texture 1\n#define GL_COLOR_INDEX1_EXT               0x80E2\n#define GL_COLOR_INDEX2_EXT               0x80E3\n#define GL_COLOR_INDEX4_EXT               0x80E4\n#define GL_COLOR_INDEX8_EXT               0x80E5\n#define GL_COLOR_INDEX12_EXT              0x80E6\n#define GL_COLOR_INDEX16_EXT              0x80E7\n#define GL_TEXTURE_INDEX_SIZE_EXT         0x80ED\ntypedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table);\ntypedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data);\ntypedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table);\nGLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data);\nGLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);\n#endif\n#endif /* GL_EXT_paletted_texture */\n\n#ifndef GL_EXT_pixel_buffer_object\n#define GL_EXT_pixel_buffer_object 1\n#define GL_PIXEL_PACK_BUFFER_EXT          0x88EB\n#define GL_PIXEL_UNPACK_BUFFER_EXT        0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING_EXT  0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF\n#endif /* GL_EXT_pixel_buffer_object */\n\n#ifndef GL_EXT_pixel_transform\n#define GL_EXT_pixel_transform 1\n#define GL_PIXEL_TRANSFORM_2D_EXT         0x8330\n#define GL_PIXEL_MAG_FILTER_EXT           0x8331\n#define GL_PIXEL_MIN_FILTER_EXT           0x8332\n#define GL_PIXEL_CUBIC_WEIGHT_EXT         0x8333\n#define GL_CUBIC_EXT                      0x8334\n#define GL_AVERAGE_EXT                    0x8335\n#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336\n#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337\n#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT  0x8338\ntypedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);\n#endif\n#endif /* GL_EXT_pixel_transform */\n\n#ifndef GL_EXT_pixel_transform_color_table\n#define GL_EXT_pixel_transform_color_table 1\n#endif /* GL_EXT_pixel_transform_color_table */\n\n#ifndef GL_EXT_point_parameters\n#define GL_EXT_point_parameters 1\n#define GL_POINT_SIZE_MIN_EXT             0x8126\n#define GL_POINT_SIZE_MAX_EXT             0x8127\n#define GL_POINT_FADE_THRESHOLD_SIZE_EXT  0x8128\n#define GL_DISTANCE_ATTENUATION_EXT       0x8129\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params);\n#endif\n#endif /* GL_EXT_point_parameters */\n\n#ifndef GL_EXT_polygon_offset\n#define GL_EXT_polygon_offset 1\n#define GL_POLYGON_OFFSET_EXT             0x8037\n#define GL_POLYGON_OFFSET_FACTOR_EXT      0x8038\n#define GL_POLYGON_OFFSET_BIAS_EXT        0x8039\ntypedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias);\n#endif\n#endif /* GL_EXT_polygon_offset */\n\n#ifndef GL_EXT_provoking_vertex\n#define GL_EXT_provoking_vertex 1\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C\n#define GL_FIRST_VERTEX_CONVENTION_EXT    0x8E4D\n#define GL_LAST_VERTEX_CONVENTION_EXT     0x8E4E\n#define GL_PROVOKING_VERTEX_EXT           0x8E4F\ntypedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProvokingVertexEXT (GLenum mode);\n#endif\n#endif /* GL_EXT_provoking_vertex */\n\n#ifndef GL_EXT_rescale_normal\n#define GL_EXT_rescale_normal 1\n#define GL_RESCALE_NORMAL_EXT             0x803A\n#endif /* GL_EXT_rescale_normal */\n\n#ifndef GL_EXT_secondary_color\n#define GL_EXT_secondary_color 1\n#define GL_COLOR_SUM_EXT                  0x8458\n#define GL_CURRENT_SECONDARY_COLOR_EXT    0x8459\n#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A\n#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B\n#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C\n#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D\n#define GL_SECONDARY_COLOR_ARRAY_EXT      0x845E\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue);\nGLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v);\nGLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue);\nGLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v);\nGLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue);\nGLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v);\nGLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue);\nGLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v);\nGLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue);\nGLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v);\nGLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue);\nGLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v);\nGLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue);\nGLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v);\nGLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue);\nGLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v);\nGLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer);\n#endif\n#endif /* GL_EXT_secondary_color */\n\n#ifndef GL_EXT_separate_shader_objects\n#define GL_EXT_separate_shader_objects 1\n#define GL_ACTIVE_PROGRAM_EXT             0x8B8D\ntypedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program);\ntypedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program);\ntypedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program);\nGLAPI void APIENTRY glActiveProgramEXT (GLuint program);\nGLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string);\n#endif\n#endif /* GL_EXT_separate_shader_objects */\n\n#ifndef GL_EXT_separate_specular_color\n#define GL_EXT_separate_specular_color 1\n#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT  0x81F8\n#define GL_SINGLE_COLOR_EXT               0x81F9\n#define GL_SEPARATE_SPECULAR_COLOR_EXT    0x81FA\n#endif /* GL_EXT_separate_specular_color */\n\n#ifndef GL_EXT_shader_image_load_formatted\n#define GL_EXT_shader_image_load_formatted 1\n#endif /* GL_EXT_shader_image_load_formatted */\n\n#ifndef GL_EXT_shader_image_load_store\n#define GL_EXT_shader_image_load_store 1\n#define GL_MAX_IMAGE_UNITS_EXT            0x8F38\n#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39\n#define GL_IMAGE_BINDING_NAME_EXT         0x8F3A\n#define GL_IMAGE_BINDING_LEVEL_EXT        0x8F3B\n#define GL_IMAGE_BINDING_LAYERED_EXT      0x8F3C\n#define GL_IMAGE_BINDING_LAYER_EXT        0x8F3D\n#define GL_IMAGE_BINDING_ACCESS_EXT       0x8F3E\n#define GL_IMAGE_1D_EXT                   0x904C\n#define GL_IMAGE_2D_EXT                   0x904D\n#define GL_IMAGE_3D_EXT                   0x904E\n#define GL_IMAGE_2D_RECT_EXT              0x904F\n#define GL_IMAGE_CUBE_EXT                 0x9050\n#define GL_IMAGE_BUFFER_EXT               0x9051\n#define GL_IMAGE_1D_ARRAY_EXT             0x9052\n#define GL_IMAGE_2D_ARRAY_EXT             0x9053\n#define GL_IMAGE_CUBE_MAP_ARRAY_EXT       0x9054\n#define GL_IMAGE_2D_MULTISAMPLE_EXT       0x9055\n#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056\n#define GL_INT_IMAGE_1D_EXT               0x9057\n#define GL_INT_IMAGE_2D_EXT               0x9058\n#define GL_INT_IMAGE_3D_EXT               0x9059\n#define GL_INT_IMAGE_2D_RECT_EXT          0x905A\n#define GL_INT_IMAGE_CUBE_EXT             0x905B\n#define GL_INT_IMAGE_BUFFER_EXT           0x905C\n#define GL_INT_IMAGE_1D_ARRAY_EXT         0x905D\n#define GL_INT_IMAGE_2D_ARRAY_EXT         0x905E\n#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT   0x905F\n#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT   0x9060\n#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061\n#define GL_UNSIGNED_INT_IMAGE_1D_EXT      0x9062\n#define GL_UNSIGNED_INT_IMAGE_2D_EXT      0x9063\n#define GL_UNSIGNED_INT_IMAGE_3D_EXT      0x9064\n#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065\n#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT    0x9066\n#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT  0x9067\n#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068\n#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069\n#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C\n#define GL_MAX_IMAGE_SAMPLES_EXT          0x906D\n#define GL_IMAGE_BINDING_FORMAT_EXT       0x906E\n#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001\n#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT  0x00000002\n#define GL_UNIFORM_BARRIER_BIT_EXT        0x00000004\n#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT  0x00000008\n#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020\n#define GL_COMMAND_BARRIER_BIT_EXT        0x00000040\n#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT   0x00000080\n#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100\n#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT  0x00000200\n#define GL_FRAMEBUFFER_BARRIER_BIT_EXT    0x00000400\n#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800\n#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000\n#define GL_ALL_BARRIER_BITS_EXT           0xFFFFFFFF\ntypedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format);\ntypedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format);\nGLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers);\n#endif\n#endif /* GL_EXT_shader_image_load_store */\n\n#ifndef GL_EXT_shader_integer_mix\n#define GL_EXT_shader_integer_mix 1\n#endif /* GL_EXT_shader_integer_mix */\n\n#ifndef GL_EXT_shadow_funcs\n#define GL_EXT_shadow_funcs 1\n#endif /* GL_EXT_shadow_funcs */\n\n#ifndef GL_EXT_shared_texture_palette\n#define GL_EXT_shared_texture_palette 1\n#define GL_SHARED_TEXTURE_PALETTE_EXT     0x81FB\n#endif /* GL_EXT_shared_texture_palette */\n\n#ifndef GL_EXT_stencil_clear_tag\n#define GL_EXT_stencil_clear_tag 1\n#define GL_STENCIL_TAG_BITS_EXT           0x88F2\n#define GL_STENCIL_CLEAR_TAG_VALUE_EXT    0x88F3\ntypedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag);\n#endif\n#endif /* GL_EXT_stencil_clear_tag */\n\n#ifndef GL_EXT_stencil_two_side\n#define GL_EXT_stencil_two_side 1\n#define GL_STENCIL_TEST_TWO_SIDE_EXT      0x8910\n#define GL_ACTIVE_STENCIL_FACE_EXT        0x8911\ntypedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face);\n#endif\n#endif /* GL_EXT_stencil_two_side */\n\n#ifndef GL_EXT_stencil_wrap\n#define GL_EXT_stencil_wrap 1\n#define GL_INCR_WRAP_EXT                  0x8507\n#define GL_DECR_WRAP_EXT                  0x8508\n#endif /* GL_EXT_stencil_wrap */\n\n#ifndef GL_EXT_subtexture\n#define GL_EXT_subtexture 1\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\n#endif\n#endif /* GL_EXT_subtexture */\n\n#ifndef GL_EXT_texture\n#define GL_EXT_texture 1\n#define GL_ALPHA4_EXT                     0x803B\n#define GL_ALPHA8_EXT                     0x803C\n#define GL_ALPHA12_EXT                    0x803D\n#define GL_ALPHA16_EXT                    0x803E\n#define GL_LUMINANCE4_EXT                 0x803F\n#define GL_LUMINANCE8_EXT                 0x8040\n#define GL_LUMINANCE12_EXT                0x8041\n#define GL_LUMINANCE16_EXT                0x8042\n#define GL_LUMINANCE4_ALPHA4_EXT          0x8043\n#define GL_LUMINANCE6_ALPHA2_EXT          0x8044\n#define GL_LUMINANCE8_ALPHA8_EXT          0x8045\n#define GL_LUMINANCE12_ALPHA4_EXT         0x8046\n#define GL_LUMINANCE12_ALPHA12_EXT        0x8047\n#define GL_LUMINANCE16_ALPHA16_EXT        0x8048\n#define GL_INTENSITY_EXT                  0x8049\n#define GL_INTENSITY4_EXT                 0x804A\n#define GL_INTENSITY8_EXT                 0x804B\n#define GL_INTENSITY12_EXT                0x804C\n#define GL_INTENSITY16_EXT                0x804D\n#define GL_RGB2_EXT                       0x804E\n#define GL_RGB4_EXT                       0x804F\n#define GL_RGB5_EXT                       0x8050\n#define GL_RGB8_EXT                       0x8051\n#define GL_RGB10_EXT                      0x8052\n#define GL_RGB12_EXT                      0x8053\n#define GL_RGB16_EXT                      0x8054\n#define GL_RGBA2_EXT                      0x8055\n#define GL_RGBA4_EXT                      0x8056\n#define GL_RGB5_A1_EXT                    0x8057\n#define GL_RGBA8_EXT                      0x8058\n#define GL_RGB10_A2_EXT                   0x8059\n#define GL_RGBA12_EXT                     0x805A\n#define GL_RGBA16_EXT                     0x805B\n#define GL_TEXTURE_RED_SIZE_EXT           0x805C\n#define GL_TEXTURE_GREEN_SIZE_EXT         0x805D\n#define GL_TEXTURE_BLUE_SIZE_EXT          0x805E\n#define GL_TEXTURE_ALPHA_SIZE_EXT         0x805F\n#define GL_TEXTURE_LUMINANCE_SIZE_EXT     0x8060\n#define GL_TEXTURE_INTENSITY_SIZE_EXT     0x8061\n#define GL_REPLACE_EXT                    0x8062\n#define GL_PROXY_TEXTURE_1D_EXT           0x8063\n#define GL_PROXY_TEXTURE_2D_EXT           0x8064\n#define GL_TEXTURE_TOO_LARGE_EXT          0x8065\n#endif /* GL_EXT_texture */\n\n#ifndef GL_EXT_texture3D\n#define GL_EXT_texture3D 1\n#define GL_PACK_SKIP_IMAGES_EXT           0x806B\n#define GL_PACK_IMAGE_HEIGHT_EXT          0x806C\n#define GL_UNPACK_SKIP_IMAGES_EXT         0x806D\n#define GL_UNPACK_IMAGE_HEIGHT_EXT        0x806E\n#define GL_TEXTURE_3D_EXT                 0x806F\n#define GL_PROXY_TEXTURE_3D_EXT           0x8070\n#define GL_TEXTURE_DEPTH_EXT              0x8071\n#define GL_TEXTURE_WRAP_R_EXT             0x8072\n#define GL_MAX_3D_TEXTURE_SIZE_EXT        0x8073\ntypedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\n#endif\n#endif /* GL_EXT_texture3D */\n\n#ifndef GL_EXT_texture_array\n#define GL_EXT_texture_array 1\n#define GL_TEXTURE_1D_ARRAY_EXT           0x8C18\n#define GL_PROXY_TEXTURE_1D_ARRAY_EXT     0x8C19\n#define GL_TEXTURE_2D_ARRAY_EXT           0x8C1A\n#define GL_PROXY_TEXTURE_2D_ARRAY_EXT     0x8C1B\n#define GL_TEXTURE_BINDING_1D_ARRAY_EXT   0x8C1C\n#define GL_TEXTURE_BINDING_2D_ARRAY_EXT   0x8C1D\n#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT   0x88FF\n#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E\n#endif /* GL_EXT_texture_array */\n\n#ifndef GL_EXT_texture_buffer_object\n#define GL_EXT_texture_buffer_object 1\n#define GL_TEXTURE_BUFFER_EXT             0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT    0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER_EXT     0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D\n#define GL_TEXTURE_BUFFER_FORMAT_EXT      0x8C2E\ntypedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer);\n#endif\n#endif /* GL_EXT_texture_buffer_object */\n\n#ifndef GL_EXT_texture_compression_latc\n#define GL_EXT_texture_compression_latc 1\n#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70\n#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71\n#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72\n#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73\n#endif /* GL_EXT_texture_compression_latc */\n\n#ifndef GL_EXT_texture_compression_rgtc\n#define GL_EXT_texture_compression_rgtc 1\n#define GL_COMPRESSED_RED_RGTC1_EXT       0x8DBB\n#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC\n#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD\n#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE\n#endif /* GL_EXT_texture_compression_rgtc */\n\n#ifndef GL_EXT_texture_compression_s3tc\n#define GL_EXT_texture_compression_s3tc 1\n#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT   0x83F0\n#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT  0x83F1\n#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT  0x83F2\n#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT  0x83F3\n#endif /* GL_EXT_texture_compression_s3tc */\n\n#ifndef GL_EXT_texture_cube_map\n#define GL_EXT_texture_cube_map 1\n#define GL_NORMAL_MAP_EXT                 0x8511\n#define GL_REFLECTION_MAP_EXT             0x8512\n#define GL_TEXTURE_CUBE_MAP_EXT           0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP_EXT   0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A\n#define GL_PROXY_TEXTURE_CUBE_MAP_EXT     0x851B\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT  0x851C\n#endif /* GL_EXT_texture_cube_map */\n\n#ifndef GL_EXT_texture_env_add\n#define GL_EXT_texture_env_add 1\n#endif /* GL_EXT_texture_env_add */\n\n#ifndef GL_EXT_texture_env_combine\n#define GL_EXT_texture_env_combine 1\n#define GL_COMBINE_EXT                    0x8570\n#define GL_COMBINE_RGB_EXT                0x8571\n#define GL_COMBINE_ALPHA_EXT              0x8572\n#define GL_RGB_SCALE_EXT                  0x8573\n#define GL_ADD_SIGNED_EXT                 0x8574\n#define GL_INTERPOLATE_EXT                0x8575\n#define GL_CONSTANT_EXT                   0x8576\n#define GL_PRIMARY_COLOR_EXT              0x8577\n#define GL_PREVIOUS_EXT                   0x8578\n#define GL_SOURCE0_RGB_EXT                0x8580\n#define GL_SOURCE1_RGB_EXT                0x8581\n#define GL_SOURCE2_RGB_EXT                0x8582\n#define GL_SOURCE0_ALPHA_EXT              0x8588\n#define GL_SOURCE1_ALPHA_EXT              0x8589\n#define GL_SOURCE2_ALPHA_EXT              0x858A\n#define GL_OPERAND0_RGB_EXT               0x8590\n#define GL_OPERAND1_RGB_EXT               0x8591\n#define GL_OPERAND2_RGB_EXT               0x8592\n#define GL_OPERAND0_ALPHA_EXT             0x8598\n#define GL_OPERAND1_ALPHA_EXT             0x8599\n#define GL_OPERAND2_ALPHA_EXT             0x859A\n#endif /* GL_EXT_texture_env_combine */\n\n#ifndef GL_EXT_texture_env_dot3\n#define GL_EXT_texture_env_dot3 1\n#define GL_DOT3_RGB_EXT                   0x8740\n#define GL_DOT3_RGBA_EXT                  0x8741\n#endif /* GL_EXT_texture_env_dot3 */\n\n#ifndef GL_EXT_texture_filter_anisotropic\n#define GL_EXT_texture_filter_anisotropic 1\n#define GL_TEXTURE_MAX_ANISOTROPY_EXT     0x84FE\n#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF\n#endif /* GL_EXT_texture_filter_anisotropic */\n\n#ifndef GL_EXT_texture_integer\n#define GL_EXT_texture_integer 1\n#define GL_RGBA32UI_EXT                   0x8D70\n#define GL_RGB32UI_EXT                    0x8D71\n#define GL_ALPHA32UI_EXT                  0x8D72\n#define GL_INTENSITY32UI_EXT              0x8D73\n#define GL_LUMINANCE32UI_EXT              0x8D74\n#define GL_LUMINANCE_ALPHA32UI_EXT        0x8D75\n#define GL_RGBA16UI_EXT                   0x8D76\n#define GL_RGB16UI_EXT                    0x8D77\n#define GL_ALPHA16UI_EXT                  0x8D78\n#define GL_INTENSITY16UI_EXT              0x8D79\n#define GL_LUMINANCE16UI_EXT              0x8D7A\n#define GL_LUMINANCE_ALPHA16UI_EXT        0x8D7B\n#define GL_RGBA8UI_EXT                    0x8D7C\n#define GL_RGB8UI_EXT                     0x8D7D\n#define GL_ALPHA8UI_EXT                   0x8D7E\n#define GL_INTENSITY8UI_EXT               0x8D7F\n#define GL_LUMINANCE8UI_EXT               0x8D80\n#define GL_LUMINANCE_ALPHA8UI_EXT         0x8D81\n#define GL_RGBA32I_EXT                    0x8D82\n#define GL_RGB32I_EXT                     0x8D83\n#define GL_ALPHA32I_EXT                   0x8D84\n#define GL_INTENSITY32I_EXT               0x8D85\n#define GL_LUMINANCE32I_EXT               0x8D86\n#define GL_LUMINANCE_ALPHA32I_EXT         0x8D87\n#define GL_RGBA16I_EXT                    0x8D88\n#define GL_RGB16I_EXT                     0x8D89\n#define GL_ALPHA16I_EXT                   0x8D8A\n#define GL_INTENSITY16I_EXT               0x8D8B\n#define GL_LUMINANCE16I_EXT               0x8D8C\n#define GL_LUMINANCE_ALPHA16I_EXT         0x8D8D\n#define GL_RGBA8I_EXT                     0x8D8E\n#define GL_RGB8I_EXT                      0x8D8F\n#define GL_ALPHA8I_EXT                    0x8D90\n#define GL_INTENSITY8I_EXT                0x8D91\n#define GL_LUMINANCE8I_EXT                0x8D92\n#define GL_LUMINANCE_ALPHA8I_EXT          0x8D93\n#define GL_RED_INTEGER_EXT                0x8D94\n#define GL_GREEN_INTEGER_EXT              0x8D95\n#define GL_BLUE_INTEGER_EXT               0x8D96\n#define GL_ALPHA_INTEGER_EXT              0x8D97\n#define GL_RGB_INTEGER_EXT                0x8D98\n#define GL_RGBA_INTEGER_EXT               0x8D99\n#define GL_BGR_INTEGER_EXT                0x8D9A\n#define GL_BGRA_INTEGER_EXT               0x8D9B\n#define GL_LUMINANCE_INTEGER_EXT          0x8D9C\n#define GL_LUMINANCE_ALPHA_INTEGER_EXT    0x8D9D\n#define GL_RGBA_INTEGER_MODE_EXT          0x8D9E\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha);\ntypedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params);\nGLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha);\nGLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha);\n#endif\n#endif /* GL_EXT_texture_integer */\n\n#ifndef GL_EXT_texture_lod_bias\n#define GL_EXT_texture_lod_bias 1\n#define GL_MAX_TEXTURE_LOD_BIAS_EXT       0x84FD\n#define GL_TEXTURE_FILTER_CONTROL_EXT     0x8500\n#define GL_TEXTURE_LOD_BIAS_EXT           0x8501\n#endif /* GL_EXT_texture_lod_bias */\n\n#ifndef GL_EXT_texture_mirror_clamp\n#define GL_EXT_texture_mirror_clamp 1\n#define GL_MIRROR_CLAMP_EXT               0x8742\n#define GL_MIRROR_CLAMP_TO_EDGE_EXT       0x8743\n#define GL_MIRROR_CLAMP_TO_BORDER_EXT     0x8912\n#endif /* GL_EXT_texture_mirror_clamp */\n\n#ifndef GL_EXT_texture_object\n#define GL_EXT_texture_object 1\n#define GL_TEXTURE_PRIORITY_EXT           0x8066\n#define GL_TEXTURE_RESIDENT_EXT           0x8067\n#define GL_TEXTURE_1D_BINDING_EXT         0x8068\n#define GL_TEXTURE_2D_BINDING_EXT         0x8069\n#define GL_TEXTURE_3D_BINDING_EXT         0x806A\ntypedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences);\ntypedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture);\ntypedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures);\ntypedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures);\ntypedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture);\ntypedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences);\nGLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture);\nGLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures);\nGLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures);\nGLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture);\nGLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities);\n#endif\n#endif /* GL_EXT_texture_object */\n\n#ifndef GL_EXT_texture_perturb_normal\n#define GL_EXT_texture_perturb_normal 1\n#define GL_PERTURB_EXT                    0x85AE\n#define GL_TEXTURE_NORMAL_EXT             0x85AF\ntypedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTextureNormalEXT (GLenum mode);\n#endif\n#endif /* GL_EXT_texture_perturb_normal */\n\n#ifndef GL_EXT_texture_sRGB\n#define GL_EXT_texture_sRGB 1\n#define GL_SRGB_EXT                       0x8C40\n#define GL_SRGB8_EXT                      0x8C41\n#define GL_SRGB_ALPHA_EXT                 0x8C42\n#define GL_SRGB8_ALPHA8_EXT               0x8C43\n#define GL_SLUMINANCE_ALPHA_EXT           0x8C44\n#define GL_SLUMINANCE8_ALPHA8_EXT         0x8C45\n#define GL_SLUMINANCE_EXT                 0x8C46\n#define GL_SLUMINANCE8_EXT                0x8C47\n#define GL_COMPRESSED_SRGB_EXT            0x8C48\n#define GL_COMPRESSED_SRGB_ALPHA_EXT      0x8C49\n#define GL_COMPRESSED_SLUMINANCE_EXT      0x8C4A\n#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B\n#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT  0x8C4C\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F\n#endif /* GL_EXT_texture_sRGB */\n\n#ifndef GL_EXT_texture_sRGB_decode\n#define GL_EXT_texture_sRGB_decode 1\n#define GL_TEXTURE_SRGB_DECODE_EXT        0x8A48\n#define GL_DECODE_EXT                     0x8A49\n#define GL_SKIP_DECODE_EXT                0x8A4A\n#endif /* GL_EXT_texture_sRGB_decode */\n\n#ifndef GL_EXT_texture_shared_exponent\n#define GL_EXT_texture_shared_exponent 1\n#define GL_RGB9_E5_EXT                    0x8C3D\n#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT   0x8C3E\n#define GL_TEXTURE_SHARED_SIZE_EXT        0x8C3F\n#endif /* GL_EXT_texture_shared_exponent */\n\n#ifndef GL_EXT_texture_snorm\n#define GL_EXT_texture_snorm 1\n#define GL_ALPHA_SNORM                    0x9010\n#define GL_LUMINANCE_SNORM                0x9011\n#define GL_LUMINANCE_ALPHA_SNORM          0x9012\n#define GL_INTENSITY_SNORM                0x9013\n#define GL_ALPHA8_SNORM                   0x9014\n#define GL_LUMINANCE8_SNORM               0x9015\n#define GL_LUMINANCE8_ALPHA8_SNORM        0x9016\n#define GL_INTENSITY8_SNORM               0x9017\n#define GL_ALPHA16_SNORM                  0x9018\n#define GL_LUMINANCE16_SNORM              0x9019\n#define GL_LUMINANCE16_ALPHA16_SNORM      0x901A\n#define GL_INTENSITY16_SNORM              0x901B\n#define GL_RED_SNORM                      0x8F90\n#define GL_RG_SNORM                       0x8F91\n#define GL_RGB_SNORM                      0x8F92\n#define GL_RGBA_SNORM                     0x8F93\n#endif /* GL_EXT_texture_snorm */\n\n#ifndef GL_EXT_texture_swizzle\n#define GL_EXT_texture_swizzle 1\n#define GL_TEXTURE_SWIZZLE_R_EXT          0x8E42\n#define GL_TEXTURE_SWIZZLE_G_EXT          0x8E43\n#define GL_TEXTURE_SWIZZLE_B_EXT          0x8E44\n#define GL_TEXTURE_SWIZZLE_A_EXT          0x8E45\n#define GL_TEXTURE_SWIZZLE_RGBA_EXT       0x8E46\n#endif /* GL_EXT_texture_swizzle */\n\n#ifndef GL_EXT_timer_query\n#define GL_EXT_timer_query 1\n#define GL_TIME_ELAPSED_EXT               0x88BF\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params);\nGLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params);\n#endif\n#endif /* GL_EXT_timer_query */\n\n#ifndef GL_EXT_transform_feedback\n#define GL_EXT_transform_feedback 1\n#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT  0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F\n#define GL_INTERLEAVED_ATTRIBS_EXT        0x8C8C\n#define GL_SEPARATE_ATTRIBS_EXT           0x8C8D\n#define GL_PRIMITIVES_GENERATED_EXT       0x8C87\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88\n#define GL_RASTERIZER_DISCARD_EXT         0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80\n#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76\ntypedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode);\ntypedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void);\ntypedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);\ntypedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer);\ntypedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);\ntypedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode);\nGLAPI void APIENTRY glEndTransformFeedbackEXT (void);\nGLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset);\nGLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer);\nGLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);\nGLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\n#endif\n#endif /* GL_EXT_transform_feedback */\n\n#ifndef GL_EXT_vertex_array\n#define GL_EXT_vertex_array 1\n#define GL_VERTEX_ARRAY_EXT               0x8074\n#define GL_NORMAL_ARRAY_EXT               0x8075\n#define GL_COLOR_ARRAY_EXT                0x8076\n#define GL_INDEX_ARRAY_EXT                0x8077\n#define GL_TEXTURE_COORD_ARRAY_EXT        0x8078\n#define GL_EDGE_FLAG_ARRAY_EXT            0x8079\n#define GL_VERTEX_ARRAY_SIZE_EXT          0x807A\n#define GL_VERTEX_ARRAY_TYPE_EXT          0x807B\n#define GL_VERTEX_ARRAY_STRIDE_EXT        0x807C\n#define GL_VERTEX_ARRAY_COUNT_EXT         0x807D\n#define GL_NORMAL_ARRAY_TYPE_EXT          0x807E\n#define GL_NORMAL_ARRAY_STRIDE_EXT        0x807F\n#define GL_NORMAL_ARRAY_COUNT_EXT         0x8080\n#define GL_COLOR_ARRAY_SIZE_EXT           0x8081\n#define GL_COLOR_ARRAY_TYPE_EXT           0x8082\n#define GL_COLOR_ARRAY_STRIDE_EXT         0x8083\n#define GL_COLOR_ARRAY_COUNT_EXT          0x8084\n#define GL_INDEX_ARRAY_TYPE_EXT           0x8085\n#define GL_INDEX_ARRAY_STRIDE_EXT         0x8086\n#define GL_INDEX_ARRAY_COUNT_EXT          0x8087\n#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT   0x8088\n#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT   0x8089\n#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A\n#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT  0x808B\n#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT     0x808C\n#define GL_EDGE_FLAG_ARRAY_COUNT_EXT      0x808D\n#define GL_VERTEX_ARRAY_POINTER_EXT       0x808E\n#define GL_NORMAL_ARRAY_POINTER_EXT       0x808F\n#define GL_COLOR_ARRAY_POINTER_EXT        0x8090\n#define GL_INDEX_ARRAY_POINTER_EXT        0x8091\n#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092\n#define GL_EDGE_FLAG_ARRAY_POINTER_EXT    0x8093\ntypedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i);\ntypedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);\ntypedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);\ntypedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer);\ntypedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params);\ntypedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer);\ntypedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer);\ntypedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);\ntypedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glArrayElementEXT (GLint i);\nGLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);\nGLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count);\nGLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer);\nGLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params);\nGLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer);\nGLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer);\nGLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);\nGLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);\n#endif\n#endif /* GL_EXT_vertex_array */\n\n#ifndef GL_EXT_vertex_array_bgra\n#define GL_EXT_vertex_array_bgra 1\n#endif /* GL_EXT_vertex_array_bgra */\n\n#ifndef GL_EXT_vertex_attrib_64bit\n#define GL_EXT_vertex_attrib_64bit 1\n#define GL_DOUBLE_VEC2_EXT                0x8FFC\n#define GL_DOUBLE_VEC3_EXT                0x8FFD\n#define GL_DOUBLE_VEC4_EXT                0x8FFE\n#define GL_DOUBLE_MAT2_EXT                0x8F46\n#define GL_DOUBLE_MAT3_EXT                0x8F47\n#define GL_DOUBLE_MAT4_EXT                0x8F48\n#define GL_DOUBLE_MAT2x3_EXT              0x8F49\n#define GL_DOUBLE_MAT2x4_EXT              0x8F4A\n#define GL_DOUBLE_MAT3x2_EXT              0x8F4B\n#define GL_DOUBLE_MAT3x4_EXT              0x8F4C\n#define GL_DOUBLE_MAT4x2_EXT              0x8F4D\n#define GL_DOUBLE_MAT4x3_EXT              0x8F4E\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x);\nGLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params);\n#endif\n#endif /* GL_EXT_vertex_attrib_64bit */\n\n#ifndef GL_EXT_vertex_shader\n#define GL_EXT_vertex_shader 1\n#define GL_VERTEX_SHADER_EXT              0x8780\n#define GL_VERTEX_SHADER_BINDING_EXT      0x8781\n#define GL_OP_INDEX_EXT                   0x8782\n#define GL_OP_NEGATE_EXT                  0x8783\n#define GL_OP_DOT3_EXT                    0x8784\n#define GL_OP_DOT4_EXT                    0x8785\n#define GL_OP_MUL_EXT                     0x8786\n#define GL_OP_ADD_EXT                     0x8787\n#define GL_OP_MADD_EXT                    0x8788\n#define GL_OP_FRAC_EXT                    0x8789\n#define GL_OP_MAX_EXT                     0x878A\n#define GL_OP_MIN_EXT                     0x878B\n#define GL_OP_SET_GE_EXT                  0x878C\n#define GL_OP_SET_LT_EXT                  0x878D\n#define GL_OP_CLAMP_EXT                   0x878E\n#define GL_OP_FLOOR_EXT                   0x878F\n#define GL_OP_ROUND_EXT                   0x8790\n#define GL_OP_EXP_BASE_2_EXT              0x8791\n#define GL_OP_LOG_BASE_2_EXT              0x8792\n#define GL_OP_POWER_EXT                   0x8793\n#define GL_OP_RECIP_EXT                   0x8794\n#define GL_OP_RECIP_SQRT_EXT              0x8795\n#define GL_OP_SUB_EXT                     0x8796\n#define GL_OP_CROSS_PRODUCT_EXT           0x8797\n#define GL_OP_MULTIPLY_MATRIX_EXT         0x8798\n#define GL_OP_MOV_EXT                     0x8799\n#define GL_OUTPUT_VERTEX_EXT              0x879A\n#define GL_OUTPUT_COLOR0_EXT              0x879B\n#define GL_OUTPUT_COLOR1_EXT              0x879C\n#define GL_OUTPUT_TEXTURE_COORD0_EXT      0x879D\n#define GL_OUTPUT_TEXTURE_COORD1_EXT      0x879E\n#define GL_OUTPUT_TEXTURE_COORD2_EXT      0x879F\n#define GL_OUTPUT_TEXTURE_COORD3_EXT      0x87A0\n#define GL_OUTPUT_TEXTURE_COORD4_EXT      0x87A1\n#define GL_OUTPUT_TEXTURE_COORD5_EXT      0x87A2\n#define GL_OUTPUT_TEXTURE_COORD6_EXT      0x87A3\n#define GL_OUTPUT_TEXTURE_COORD7_EXT      0x87A4\n#define GL_OUTPUT_TEXTURE_COORD8_EXT      0x87A5\n#define GL_OUTPUT_TEXTURE_COORD9_EXT      0x87A6\n#define GL_OUTPUT_TEXTURE_COORD10_EXT     0x87A7\n#define GL_OUTPUT_TEXTURE_COORD11_EXT     0x87A8\n#define GL_OUTPUT_TEXTURE_COORD12_EXT     0x87A9\n#define GL_OUTPUT_TEXTURE_COORD13_EXT     0x87AA\n#define GL_OUTPUT_TEXTURE_COORD14_EXT     0x87AB\n#define GL_OUTPUT_TEXTURE_COORD15_EXT     0x87AC\n#define GL_OUTPUT_TEXTURE_COORD16_EXT     0x87AD\n#define GL_OUTPUT_TEXTURE_COORD17_EXT     0x87AE\n#define GL_OUTPUT_TEXTURE_COORD18_EXT     0x87AF\n#define GL_OUTPUT_TEXTURE_COORD19_EXT     0x87B0\n#define GL_OUTPUT_TEXTURE_COORD20_EXT     0x87B1\n#define GL_OUTPUT_TEXTURE_COORD21_EXT     0x87B2\n#define GL_OUTPUT_TEXTURE_COORD22_EXT     0x87B3\n#define GL_OUTPUT_TEXTURE_COORD23_EXT     0x87B4\n#define GL_OUTPUT_TEXTURE_COORD24_EXT     0x87B5\n#define GL_OUTPUT_TEXTURE_COORD25_EXT     0x87B6\n#define GL_OUTPUT_TEXTURE_COORD26_EXT     0x87B7\n#define GL_OUTPUT_TEXTURE_COORD27_EXT     0x87B8\n#define GL_OUTPUT_TEXTURE_COORD28_EXT     0x87B9\n#define GL_OUTPUT_TEXTURE_COORD29_EXT     0x87BA\n#define GL_OUTPUT_TEXTURE_COORD30_EXT     0x87BB\n#define GL_OUTPUT_TEXTURE_COORD31_EXT     0x87BC\n#define GL_OUTPUT_FOG_EXT                 0x87BD\n#define GL_SCALAR_EXT                     0x87BE\n#define GL_VECTOR_EXT                     0x87BF\n#define GL_MATRIX_EXT                     0x87C0\n#define GL_VARIANT_EXT                    0x87C1\n#define GL_INVARIANT_EXT                  0x87C2\n#define GL_LOCAL_CONSTANT_EXT             0x87C3\n#define GL_LOCAL_EXT                      0x87C4\n#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5\n#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6\n#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7\n#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8\n#define GL_MAX_VERTEX_SHADER_LOCALS_EXT   0x87C9\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE\n#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF\n#define GL_VERTEX_SHADER_VARIANTS_EXT     0x87D0\n#define GL_VERTEX_SHADER_INVARIANTS_EXT   0x87D1\n#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2\n#define GL_VERTEX_SHADER_LOCALS_EXT       0x87D3\n#define GL_VERTEX_SHADER_OPTIMIZED_EXT    0x87D4\n#define GL_X_EXT                          0x87D5\n#define GL_Y_EXT                          0x87D6\n#define GL_Z_EXT                          0x87D7\n#define GL_W_EXT                          0x87D8\n#define GL_NEGATIVE_X_EXT                 0x87D9\n#define GL_NEGATIVE_Y_EXT                 0x87DA\n#define GL_NEGATIVE_Z_EXT                 0x87DB\n#define GL_NEGATIVE_W_EXT                 0x87DC\n#define GL_ZERO_EXT                       0x87DD\n#define GL_ONE_EXT                        0x87DE\n#define GL_NEGATIVE_ONE_EXT               0x87DF\n#define GL_NORMALIZED_RANGE_EXT           0x87E0\n#define GL_FULL_RANGE_EXT                 0x87E1\n#define GL_CURRENT_VERTEX_EXT             0x87E2\n#define GL_MVP_MATRIX_EXT                 0x87E3\n#define GL_VARIANT_VALUE_EXT              0x87E4\n#define GL_VARIANT_DATATYPE_EXT           0x87E5\n#define GL_VARIANT_ARRAY_STRIDE_EXT       0x87E6\n#define GL_VARIANT_ARRAY_TYPE_EXT         0x87E7\n#define GL_VARIANT_ARRAY_EXT              0x87E8\n#define GL_VARIANT_ARRAY_POINTER_EXT      0x87E9\n#define GL_INVARIANT_VALUE_EXT            0x87EA\n#define GL_INVARIANT_DATATYPE_EXT         0x87EB\n#define GL_LOCAL_CONSTANT_VALUE_EXT       0x87EC\n#define GL_LOCAL_CONSTANT_DATATYPE_EXT    0x87ED\ntypedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void);\ntypedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void);\ntypedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id);\ntypedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range);\ntypedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1);\ntypedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2);\ntypedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);\ntypedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);\ntypedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);\ntypedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);\ntypedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);\ntypedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components);\ntypedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr);\ntypedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr);\ntypedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr);\ntypedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr);\ntypedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr);\ntypedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr);\ntypedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr);\ntypedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr);\ntypedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr);\ntypedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr);\ntypedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr);\ntypedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);\ntypedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value);\ntypedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value);\ntypedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value);\ntypedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value);\ntypedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value);\ntypedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap);\ntypedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);\ntypedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);\ntypedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);\ntypedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data);\ntypedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);\ntypedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);\ntypedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);\ntypedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);\ntypedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);\ntypedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBeginVertexShaderEXT (void);\nGLAPI void APIENTRY glEndVertexShaderEXT (void);\nGLAPI void APIENTRY glBindVertexShaderEXT (GLuint id);\nGLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range);\nGLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id);\nGLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1);\nGLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2);\nGLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);\nGLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);\nGLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);\nGLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num);\nGLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num);\nGLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components);\nGLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr);\nGLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr);\nGLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr);\nGLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr);\nGLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr);\nGLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr);\nGLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr);\nGLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr);\nGLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr);\nGLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr);\nGLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr);\nGLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id);\nGLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id);\nGLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value);\nGLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value);\nGLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value);\nGLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value);\nGLAPI GLuint APIENTRY glBindParameterEXT (GLenum value);\nGLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap);\nGLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data);\nGLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data);\nGLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data);\nGLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data);\nGLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data);\nGLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data);\nGLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data);\nGLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data);\nGLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data);\nGLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data);\n#endif\n#endif /* GL_EXT_vertex_shader */\n\n#ifndef GL_EXT_vertex_weighting\n#define GL_EXT_vertex_weighting 1\n#define GL_MODELVIEW0_STACK_DEPTH_EXT     0x0BA3\n#define GL_MODELVIEW1_STACK_DEPTH_EXT     0x8502\n#define GL_MODELVIEW0_MATRIX_EXT          0x0BA6\n#define GL_MODELVIEW1_MATRIX_EXT          0x8506\n#define GL_VERTEX_WEIGHTING_EXT           0x8509\n#define GL_MODELVIEW0_EXT                 0x1700\n#define GL_MODELVIEW1_EXT                 0x850A\n#define GL_CURRENT_VERTEX_WEIGHT_EXT      0x850B\n#define GL_VERTEX_WEIGHT_ARRAY_EXT        0x850C\n#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT   0x850D\n#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT   0x850E\n#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F\n#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510\ntypedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight);\ntypedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight);\ntypedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight);\nGLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight);\nGLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer);\n#endif\n#endif /* GL_EXT_vertex_weighting */\n\n#ifndef GL_EXT_x11_sync_object\n#define GL_EXT_x11_sync_object 1\n#define GL_SYNC_X11_FENCE_EXT             0x90E1\ntypedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags);\n#endif\n#endif /* GL_EXT_x11_sync_object */\n\n#ifndef GL_GREMEDY_frame_terminator\n#define GL_GREMEDY_frame_terminator 1\ntypedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFrameTerminatorGREMEDY (void);\n#endif\n#endif /* GL_GREMEDY_frame_terminator */\n\n#ifndef GL_GREMEDY_string_marker\n#define GL_GREMEDY_string_marker 1\ntypedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string);\n#endif\n#endif /* GL_GREMEDY_string_marker */\n\n#ifndef GL_HP_convolution_border_modes\n#define GL_HP_convolution_border_modes 1\n#define GL_IGNORE_BORDER_HP               0x8150\n#define GL_CONSTANT_BORDER_HP             0x8151\n#define GL_REPLICATE_BORDER_HP            0x8153\n#define GL_CONVOLUTION_BORDER_COLOR_HP    0x8154\n#endif /* GL_HP_convolution_border_modes */\n\n#ifndef GL_HP_image_transform\n#define GL_HP_image_transform 1\n#define GL_IMAGE_SCALE_X_HP               0x8155\n#define GL_IMAGE_SCALE_Y_HP               0x8156\n#define GL_IMAGE_TRANSLATE_X_HP           0x8157\n#define GL_IMAGE_TRANSLATE_Y_HP           0x8158\n#define GL_IMAGE_ROTATE_ANGLE_HP          0x8159\n#define GL_IMAGE_ROTATE_ORIGIN_X_HP       0x815A\n#define GL_IMAGE_ROTATE_ORIGIN_Y_HP       0x815B\n#define GL_IMAGE_MAG_FILTER_HP            0x815C\n#define GL_IMAGE_MIN_FILTER_HP            0x815D\n#define GL_IMAGE_CUBIC_WEIGHT_HP          0x815E\n#define GL_CUBIC_HP                       0x815F\n#define GL_AVERAGE_HP                     0x8160\n#define GL_IMAGE_TRANSFORM_2D_HP          0x8161\n#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162\n#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163\ntypedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params);\n#endif\n#endif /* GL_HP_image_transform */\n\n#ifndef GL_HP_occlusion_test\n#define GL_HP_occlusion_test 1\n#define GL_OCCLUSION_TEST_HP              0x8165\n#define GL_OCCLUSION_TEST_RESULT_HP       0x8166\n#endif /* GL_HP_occlusion_test */\n\n#ifndef GL_HP_texture_lighting\n#define GL_HP_texture_lighting 1\n#define GL_TEXTURE_LIGHTING_MODE_HP       0x8167\n#define GL_TEXTURE_POST_SPECULAR_HP       0x8168\n#define GL_TEXTURE_PRE_SPECULAR_HP        0x8169\n#endif /* GL_HP_texture_lighting */\n\n#ifndef GL_IBM_cull_vertex\n#define GL_IBM_cull_vertex 1\n#define GL_CULL_VERTEX_IBM                103050\n#endif /* GL_IBM_cull_vertex */\n\n#ifndef GL_IBM_multimode_draw_arrays\n#define GL_IBM_multimode_draw_arrays 1\ntypedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride);\ntypedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride);\nGLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride);\n#endif\n#endif /* GL_IBM_multimode_draw_arrays */\n\n#ifndef GL_IBM_rasterpos_clip\n#define GL_IBM_rasterpos_clip 1\n#define GL_RASTER_POSITION_UNCLIPPED_IBM  0x19262\n#endif /* GL_IBM_rasterpos_clip */\n\n#ifndef GL_IBM_static_data\n#define GL_IBM_static_data 1\n#define GL_ALL_STATIC_DATA_IBM            103060\n#define GL_STATIC_VERTEX_ARRAY_IBM        103061\ntypedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFlushStaticDataIBM (GLenum target);\n#endif\n#endif /* GL_IBM_static_data */\n\n#ifndef GL_IBM_texture_mirrored_repeat\n#define GL_IBM_texture_mirrored_repeat 1\n#define GL_MIRRORED_REPEAT_IBM            0x8370\n#endif /* GL_IBM_texture_mirrored_repeat */\n\n#ifndef GL_IBM_vertex_array_lists\n#define GL_IBM_vertex_array_lists 1\n#define GL_VERTEX_ARRAY_LIST_IBM          103070\n#define GL_NORMAL_ARRAY_LIST_IBM          103071\n#define GL_COLOR_ARRAY_LIST_IBM           103072\n#define GL_INDEX_ARRAY_LIST_IBM           103073\n#define GL_TEXTURE_COORD_ARRAY_LIST_IBM   103074\n#define GL_EDGE_FLAG_ARRAY_LIST_IBM       103075\n#define GL_FOG_COORDINATE_ARRAY_LIST_IBM  103076\n#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077\n#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM   103080\n#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM   103081\n#define GL_COLOR_ARRAY_LIST_STRIDE_IBM    103082\n#define GL_INDEX_ARRAY_LIST_STRIDE_IBM    103083\n#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084\n#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085\n#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086\n#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087\ntypedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);\ntypedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride);\ntypedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride);\ntypedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride);\ntypedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride);\ntypedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);\ntypedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);\nGLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);\nGLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride);\nGLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride);\nGLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride);\nGLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride);\nGLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);\nGLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);\n#endif\n#endif /* GL_IBM_vertex_array_lists */\n\n#ifndef GL_INGR_blend_func_separate\n#define GL_INGR_blend_func_separate 1\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\n#endif\n#endif /* GL_INGR_blend_func_separate */\n\n#ifndef GL_INGR_color_clamp\n#define GL_INGR_color_clamp 1\n#define GL_RED_MIN_CLAMP_INGR             0x8560\n#define GL_GREEN_MIN_CLAMP_INGR           0x8561\n#define GL_BLUE_MIN_CLAMP_INGR            0x8562\n#define GL_ALPHA_MIN_CLAMP_INGR           0x8563\n#define GL_RED_MAX_CLAMP_INGR             0x8564\n#define GL_GREEN_MAX_CLAMP_INGR           0x8565\n#define GL_BLUE_MAX_CLAMP_INGR            0x8566\n#define GL_ALPHA_MAX_CLAMP_INGR           0x8567\n#endif /* GL_INGR_color_clamp */\n\n#ifndef GL_INGR_interlace_read\n#define GL_INGR_interlace_read 1\n#define GL_INTERLACE_READ_INGR            0x8568\n#endif /* GL_INGR_interlace_read */\n\n#ifndef GL_INTEL_fragment_shader_ordering\n#define GL_INTEL_fragment_shader_ordering 1\n#endif /* GL_INTEL_fragment_shader_ordering */\n\n#ifndef GL_INTEL_map_texture\n#define GL_INTEL_map_texture 1\n#define GL_TEXTURE_MEMORY_LAYOUT_INTEL    0x83FF\n#define GL_LAYOUT_DEFAULT_INTEL           0\n#define GL_LAYOUT_LINEAR_INTEL            1\n#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2\ntypedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture);\ntypedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level);\ntypedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSyncTextureINTEL (GLuint texture);\nGLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level);\nGLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout);\n#endif\n#endif /* GL_INTEL_map_texture */\n\n#ifndef GL_INTEL_parallel_arrays\n#define GL_INTEL_parallel_arrays 1\n#define GL_PARALLEL_ARRAYS_INTEL          0x83F4\n#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5\n#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6\n#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7\n#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8\ntypedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer);\ntypedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer);\ntypedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer);\ntypedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer);\nGLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer);\nGLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer);\nGLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer);\n#endif\n#endif /* GL_INTEL_parallel_arrays */\n\n#ifndef GL_INTEL_performance_query\n#define GL_INTEL_performance_query 1\n#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000\n#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001\n#define GL_PERFQUERY_WAIT_INTEL           0x83FB\n#define GL_PERFQUERY_FLUSH_INTEL          0x83FA\n#define GL_PERFQUERY_DONOT_FLUSH_INTEL    0x83F9\n#define GL_PERFQUERY_COUNTER_EVENT_INTEL  0x94F0\n#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1\n#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2\n#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3\n#define GL_PERFQUERY_COUNTER_RAW_INTEL    0x94F4\n#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5\n#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8\n#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9\n#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA\n#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB\n#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC\n#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD\n#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE\n#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF\n#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500\ntypedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle);\ntypedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle);\ntypedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle);\ntypedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle);\ntypedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId);\ntypedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId);\ntypedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);\ntypedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten);\ntypedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId);\ntypedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle);\nGLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle);\nGLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle);\nGLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle);\nGLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId);\nGLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId);\nGLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);\nGLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten);\nGLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId);\nGLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask);\n#endif\n#endif /* GL_INTEL_performance_query */\n\n#ifndef GL_MESAX_texture_stack\n#define GL_MESAX_texture_stack 1\n#define GL_TEXTURE_1D_STACK_MESAX         0x8759\n#define GL_TEXTURE_2D_STACK_MESAX         0x875A\n#define GL_PROXY_TEXTURE_1D_STACK_MESAX   0x875B\n#define GL_PROXY_TEXTURE_2D_STACK_MESAX   0x875C\n#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D\n#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E\n#endif /* GL_MESAX_texture_stack */\n\n#ifndef GL_MESA_pack_invert\n#define GL_MESA_pack_invert 1\n#define GL_PACK_INVERT_MESA               0x8758\n#endif /* GL_MESA_pack_invert */\n\n#ifndef GL_MESA_resize_buffers\n#define GL_MESA_resize_buffers 1\ntypedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glResizeBuffersMESA (void);\n#endif\n#endif /* GL_MESA_resize_buffers */\n\n#ifndef GL_MESA_window_pos\n#define GL_MESA_window_pos 1\ntypedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y);\ntypedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z);\ntypedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w);\ntypedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v);\ntypedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w);\ntypedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y);\nGLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v);\nGLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y);\nGLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v);\nGLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y);\nGLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v);\nGLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y);\nGLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v);\nGLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v);\nGLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v);\nGLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z);\nGLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v);\nGLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z);\nGLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v);\nGLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v);\nGLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v);\nGLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v);\nGLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v);\n#endif\n#endif /* GL_MESA_window_pos */\n\n#ifndef GL_MESA_ycbcr_texture\n#define GL_MESA_ycbcr_texture 1\n#define GL_UNSIGNED_SHORT_8_8_MESA        0x85BA\n#define GL_UNSIGNED_SHORT_8_8_REV_MESA    0x85BB\n#define GL_YCBCR_MESA                     0x8757\n#endif /* GL_MESA_ycbcr_texture */\n\n#ifndef GL_NVX_conditional_render\n#define GL_NVX_conditional_render 1\ntypedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id);\nGLAPI void APIENTRY glEndConditionalRenderNVX (void);\n#endif\n#endif /* GL_NVX_conditional_render */\n\n#ifndef GL_NVX_gpu_memory_info\n#define GL_NVX_gpu_memory_info 1\n#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047\n#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048\n#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049\n#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A\n#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B\n#endif /* GL_NVX_gpu_memory_info */\n\n#ifndef GL_NV_bindless_multi_draw_indirect\n#define GL_NV_bindless_multi_draw_indirect 1\ntypedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);\nGLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);\n#endif\n#endif /* GL_NV_bindless_multi_draw_indirect */\n\n#ifndef GL_NV_bindless_texture\n#define GL_NV_bindless_texture 1\ntypedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture);\ntypedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler);\ntypedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);\ntypedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle);\ntypedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);\ntypedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access);\ntypedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle);\ntypedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value);\ntypedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values);\ntypedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);\ntypedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture);\nGLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler);\nGLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle);\nGLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle);\nGLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);\nGLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access);\nGLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle);\nGLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value);\nGLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value);\nGLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value);\nGLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values);\nGLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle);\nGLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle);\n#endif\n#endif /* GL_NV_bindless_texture */\n\n#ifndef GL_NV_blend_equation_advanced\n#define GL_NV_blend_equation_advanced 1\n#define GL_BLEND_OVERLAP_NV               0x9281\n#define GL_BLEND_PREMULTIPLIED_SRC_NV     0x9280\n#define GL_BLUE_NV                        0x1905\n#define GL_COLORBURN_NV                   0x929A\n#define GL_COLORDODGE_NV                  0x9299\n#define GL_CONJOINT_NV                    0x9284\n#define GL_CONTRAST_NV                    0x92A1\n#define GL_DARKEN_NV                      0x9297\n#define GL_DIFFERENCE_NV                  0x929E\n#define GL_DISJOINT_NV                    0x9283\n#define GL_DST_ATOP_NV                    0x928F\n#define GL_DST_IN_NV                      0x928B\n#define GL_DST_NV                         0x9287\n#define GL_DST_OUT_NV                     0x928D\n#define GL_DST_OVER_NV                    0x9289\n#define GL_EXCLUSION_NV                   0x92A0\n#define GL_GREEN_NV                       0x1904\n#define GL_HARDLIGHT_NV                   0x929B\n#define GL_HARDMIX_NV                     0x92A9\n#define GL_HSL_COLOR_NV                   0x92AF\n#define GL_HSL_HUE_NV                     0x92AD\n#define GL_HSL_LUMINOSITY_NV              0x92B0\n#define GL_HSL_SATURATION_NV              0x92AE\n#define GL_INVERT_OVG_NV                  0x92B4\n#define GL_INVERT_RGB_NV                  0x92A3\n#define GL_LIGHTEN_NV                     0x9298\n#define GL_LINEARBURN_NV                  0x92A5\n#define GL_LINEARDODGE_NV                 0x92A4\n#define GL_LINEARLIGHT_NV                 0x92A7\n#define GL_MINUS_CLAMPED_NV               0x92B3\n#define GL_MINUS_NV                       0x929F\n#define GL_MULTIPLY_NV                    0x9294\n#define GL_OVERLAY_NV                     0x9296\n#define GL_PINLIGHT_NV                    0x92A8\n#define GL_PLUS_CLAMPED_ALPHA_NV          0x92B2\n#define GL_PLUS_CLAMPED_NV                0x92B1\n#define GL_PLUS_DARKER_NV                 0x9292\n#define GL_PLUS_NV                        0x9291\n#define GL_RED_NV                         0x1903\n#define GL_SCREEN_NV                      0x9295\n#define GL_SOFTLIGHT_NV                   0x929C\n#define GL_SRC_ATOP_NV                    0x928E\n#define GL_SRC_IN_NV                      0x928A\n#define GL_SRC_NV                         0x9286\n#define GL_SRC_OUT_NV                     0x928C\n#define GL_SRC_OVER_NV                    0x9288\n#define GL_UNCORRELATED_NV                0x9282\n#define GL_VIVIDLIGHT_NV                  0x92A6\n#define GL_XOR_NV                         0x1506\ntypedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value);\ntypedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value);\nGLAPI void APIENTRY glBlendBarrierNV (void);\n#endif\n#endif /* GL_NV_blend_equation_advanced */\n\n#ifndef GL_NV_blend_equation_advanced_coherent\n#define GL_NV_blend_equation_advanced_coherent 1\n#define GL_BLEND_ADVANCED_COHERENT_NV     0x9285\n#endif /* GL_NV_blend_equation_advanced_coherent */\n\n#ifndef GL_NV_blend_square\n#define GL_NV_blend_square 1\n#endif /* GL_NV_blend_square */\n\n#ifndef GL_NV_compute_program5\n#define GL_NV_compute_program5 1\n#define GL_COMPUTE_PROGRAM_NV             0x90FB\n#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC\n#endif /* GL_NV_compute_program5 */\n\n#ifndef GL_NV_conditional_render\n#define GL_NV_conditional_render 1\n#define GL_QUERY_WAIT_NV                  0x8E13\n#define GL_QUERY_NO_WAIT_NV               0x8E14\n#define GL_QUERY_BY_REGION_WAIT_NV        0x8E15\n#define GL_QUERY_BY_REGION_NO_WAIT_NV     0x8E16\ntypedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode);\ntypedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode);\nGLAPI void APIENTRY glEndConditionalRenderNV (void);\n#endif\n#endif /* GL_NV_conditional_render */\n\n#ifndef GL_NV_copy_depth_to_color\n#define GL_NV_copy_depth_to_color 1\n#define GL_DEPTH_STENCIL_TO_RGBA_NV       0x886E\n#define GL_DEPTH_STENCIL_TO_BGRA_NV       0x886F\n#endif /* GL_NV_copy_depth_to_color */\n\n#ifndef GL_NV_copy_image\n#define GL_NV_copy_image 1\ntypedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);\n#endif\n#endif /* GL_NV_copy_image */\n\n#ifndef GL_NV_deep_texture3D\n#define GL_NV_deep_texture3D 1\n#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0\n#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV   0x90D1\n#endif /* GL_NV_deep_texture3D */\n\n#ifndef GL_NV_depth_buffer_float\n#define GL_NV_depth_buffer_float 1\n#define GL_DEPTH_COMPONENT32F_NV          0x8DAB\n#define GL_DEPTH32F_STENCIL8_NV           0x8DAC\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD\n#define GL_DEPTH_BUFFER_FLOAT_MODE_NV     0x8DAF\ntypedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar);\ntypedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth);\ntypedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar);\nGLAPI void APIENTRY glClearDepthdNV (GLdouble depth);\nGLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax);\n#endif\n#endif /* GL_NV_depth_buffer_float */\n\n#ifndef GL_NV_depth_clamp\n#define GL_NV_depth_clamp 1\n#define GL_DEPTH_CLAMP_NV                 0x864F\n#endif /* GL_NV_depth_clamp */\n\n#ifndef GL_NV_draw_texture\n#define GL_NV_draw_texture 1\ntypedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1);\n#endif\n#endif /* GL_NV_draw_texture */\n\n#ifndef GL_NV_evaluators\n#define GL_NV_evaluators 1\n#define GL_EVAL_2D_NV                     0x86C0\n#define GL_EVAL_TRIANGULAR_2D_NV          0x86C1\n#define GL_MAP_TESSELLATION_NV            0x86C2\n#define GL_MAP_ATTRIB_U_ORDER_NV          0x86C3\n#define GL_MAP_ATTRIB_V_ORDER_NV          0x86C4\n#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5\n#define GL_EVAL_VERTEX_ATTRIB0_NV         0x86C6\n#define GL_EVAL_VERTEX_ATTRIB1_NV         0x86C7\n#define GL_EVAL_VERTEX_ATTRIB2_NV         0x86C8\n#define GL_EVAL_VERTEX_ATTRIB3_NV         0x86C9\n#define GL_EVAL_VERTEX_ATTRIB4_NV         0x86CA\n#define GL_EVAL_VERTEX_ATTRIB5_NV         0x86CB\n#define GL_EVAL_VERTEX_ATTRIB6_NV         0x86CC\n#define GL_EVAL_VERTEX_ATTRIB7_NV         0x86CD\n#define GL_EVAL_VERTEX_ATTRIB8_NV         0x86CE\n#define GL_EVAL_VERTEX_ATTRIB9_NV         0x86CF\n#define GL_EVAL_VERTEX_ATTRIB10_NV        0x86D0\n#define GL_EVAL_VERTEX_ATTRIB11_NV        0x86D1\n#define GL_EVAL_VERTEX_ATTRIB12_NV        0x86D2\n#define GL_EVAL_VERTEX_ATTRIB13_NV        0x86D3\n#define GL_EVAL_VERTEX_ATTRIB14_NV        0x86D4\n#define GL_EVAL_VERTEX_ATTRIB15_NV        0x86D5\n#define GL_MAX_MAP_TESSELLATION_NV        0x86D6\n#define GL_MAX_RATIONAL_EVAL_ORDER_NV     0x86D7\ntypedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points);\ntypedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points);\ntypedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points);\nGLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points);\nGLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode);\n#endif\n#endif /* GL_NV_evaluators */\n\n#ifndef GL_NV_explicit_multisample\n#define GL_NV_explicit_multisample 1\n#define GL_SAMPLE_POSITION_NV             0x8E50\n#define GL_SAMPLE_MASK_NV                 0x8E51\n#define GL_SAMPLE_MASK_VALUE_NV           0x8E52\n#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53\n#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54\n#define GL_TEXTURE_RENDERBUFFER_NV        0x8E55\n#define GL_SAMPLER_RENDERBUFFER_NV        0x8E56\n#define GL_INT_SAMPLER_RENDERBUFFER_NV    0x8E57\n#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58\n#define GL_MAX_SAMPLE_MASK_WORDS_NV       0x8E59\ntypedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val);\ntypedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask);\ntypedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val);\nGLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask);\nGLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer);\n#endif\n#endif /* GL_NV_explicit_multisample */\n\n#ifndef GL_NV_fence\n#define GL_NV_fence 1\n#define GL_ALL_COMPLETED_NV               0x84F2\n#define GL_FENCE_STATUS_NV                0x84F3\n#define GL_FENCE_CONDITION_NV             0x84F4\ntypedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences);\ntypedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences);\ntypedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence);\ntypedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence);\ntypedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence);\ntypedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences);\nGLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences);\nGLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence);\nGLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence);\nGLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params);\nGLAPI void APIENTRY glFinishFenceNV (GLuint fence);\nGLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition);\n#endif\n#endif /* GL_NV_fence */\n\n#ifndef GL_NV_float_buffer\n#define GL_NV_float_buffer 1\n#define GL_FLOAT_R_NV                     0x8880\n#define GL_FLOAT_RG_NV                    0x8881\n#define GL_FLOAT_RGB_NV                   0x8882\n#define GL_FLOAT_RGBA_NV                  0x8883\n#define GL_FLOAT_R16_NV                   0x8884\n#define GL_FLOAT_R32_NV                   0x8885\n#define GL_FLOAT_RG16_NV                  0x8886\n#define GL_FLOAT_RG32_NV                  0x8887\n#define GL_FLOAT_RGB16_NV                 0x8888\n#define GL_FLOAT_RGB32_NV                 0x8889\n#define GL_FLOAT_RGBA16_NV                0x888A\n#define GL_FLOAT_RGBA32_NV                0x888B\n#define GL_TEXTURE_FLOAT_COMPONENTS_NV    0x888C\n#define GL_FLOAT_CLEAR_COLOR_VALUE_NV     0x888D\n#define GL_FLOAT_RGBA_MODE_NV             0x888E\n#endif /* GL_NV_float_buffer */\n\n#ifndef GL_NV_fog_distance\n#define GL_NV_fog_distance 1\n#define GL_FOG_DISTANCE_MODE_NV           0x855A\n#define GL_EYE_RADIAL_NV                  0x855B\n#define GL_EYE_PLANE_ABSOLUTE_NV          0x855C\n#endif /* GL_NV_fog_distance */\n\n#ifndef GL_NV_fragment_program\n#define GL_NV_fragment_program 1\n#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868\n#define GL_FRAGMENT_PROGRAM_NV            0x8870\n#define GL_MAX_TEXTURE_COORDS_NV          0x8871\n#define GL_MAX_TEXTURE_IMAGE_UNITS_NV     0x8872\n#define GL_FRAGMENT_PROGRAM_BINDING_NV    0x8873\n#define GL_PROGRAM_ERROR_STRING_NV        0x8874\ntypedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v);\nGLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v);\nGLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params);\nGLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params);\n#endif\n#endif /* GL_NV_fragment_program */\n\n#ifndef GL_NV_fragment_program2\n#define GL_NV_fragment_program2 1\n#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4\n#define GL_MAX_PROGRAM_CALL_DEPTH_NV      0x88F5\n#define GL_MAX_PROGRAM_IF_DEPTH_NV        0x88F6\n#define GL_MAX_PROGRAM_LOOP_DEPTH_NV      0x88F7\n#define GL_MAX_PROGRAM_LOOP_COUNT_NV      0x88F8\n#endif /* GL_NV_fragment_program2 */\n\n#ifndef GL_NV_fragment_program4\n#define GL_NV_fragment_program4 1\n#endif /* GL_NV_fragment_program4 */\n\n#ifndef GL_NV_fragment_program_option\n#define GL_NV_fragment_program_option 1\n#endif /* GL_NV_fragment_program_option */\n\n#ifndef GL_NV_framebuffer_multisample_coverage\n#define GL_NV_framebuffer_multisample_coverage 1\n#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB\n#define GL_RENDERBUFFER_COLOR_SAMPLES_NV  0x8E10\n#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11\n#define GL_MULTISAMPLE_COVERAGE_MODES_NV  0x8E12\ntypedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);\n#endif\n#endif /* GL_NV_framebuffer_multisample_coverage */\n\n#ifndef GL_NV_geometry_program4\n#define GL_NV_geometry_program4 1\n#define GL_GEOMETRY_PROGRAM_NV            0x8C26\n#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27\n#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28\ntypedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit);\nGLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\n#endif\n#endif /* GL_NV_geometry_program4 */\n\n#ifndef GL_NV_geometry_shader4\n#define GL_NV_geometry_shader4 1\n#endif /* GL_NV_geometry_shader4 */\n\n#ifndef GL_NV_gpu_program4\n#define GL_NV_gpu_program4 1\n#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV    0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV    0x8905\n#define GL_PROGRAM_ATTRIB_COMPONENTS_NV   0x8906\n#define GL_PROGRAM_RESULT_COMPONENTS_NV   0x8907\n#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908\n#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909\n#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5\n#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params);\nGLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params);\nGLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\nGLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params);\nGLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params);\nGLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params);\nGLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params);\nGLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\nGLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params);\nGLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params);\nGLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params);\nGLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params);\nGLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params);\nGLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params);\n#endif\n#endif /* GL_NV_gpu_program4 */\n\n#ifndef GL_NV_gpu_program5\n#define GL_NV_gpu_program5 1\n#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A\n#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B\n#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C\n#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F\n#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44\n#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV  0x8F45\ntypedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params);\nGLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param);\n#endif\n#endif /* GL_NV_gpu_program5 */\n\n#ifndef GL_NV_gpu_program5_mem_extended\n#define GL_NV_gpu_program5_mem_extended 1\n#endif /* GL_NV_gpu_program5_mem_extended */\n\n#ifndef GL_NV_gpu_shader5\n#define GL_NV_gpu_shader5 1\n#endif /* GL_NV_gpu_shader5 */\n\n#ifndef GL_NV_half_float\n#define GL_NV_half_float 1\ntypedef unsigned short GLhalfNV;\n#define GL_HALF_FLOAT_NV                  0x140B\ntypedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y);\ntypedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z);\ntypedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);\ntypedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);\ntypedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);\ntypedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);\ntypedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s);\ntypedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t);\ntypedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r);\ntypedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);\ntypedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog);\ntypedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight);\ntypedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y);\nGLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z);\nGLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);\nGLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);\nGLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue);\nGLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);\nGLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s);\nGLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t);\nGLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r);\nGLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);\nGLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s);\nGLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v);\nGLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t);\nGLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v);\nGLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);\nGLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v);\nGLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);\nGLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v);\nGLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog);\nGLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog);\nGLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue);\nGLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v);\nGLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight);\nGLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight);\nGLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x);\nGLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v);\nGLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y);\nGLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v);\nGLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);\nGLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v);\nGLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);\nGLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v);\nGLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v);\nGLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v);\nGLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v);\nGLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v);\n#endif\n#endif /* GL_NV_half_float */\n\n#ifndef GL_NV_light_max_exponent\n#define GL_NV_light_max_exponent 1\n#define GL_MAX_SHININESS_NV               0x8504\n#define GL_MAX_SPOT_EXPONENT_NV           0x8505\n#endif /* GL_NV_light_max_exponent */\n\n#ifndef GL_NV_multisample_coverage\n#define GL_NV_multisample_coverage 1\n#define GL_COLOR_SAMPLES_NV               0x8E20\n#endif /* GL_NV_multisample_coverage */\n\n#ifndef GL_NV_multisample_filter_hint\n#define GL_NV_multisample_filter_hint 1\n#define GL_MULTISAMPLE_FILTER_HINT_NV     0x8534\n#endif /* GL_NV_multisample_filter_hint */\n\n#ifndef GL_NV_occlusion_query\n#define GL_NV_occlusion_query 1\n#define GL_PIXEL_COUNTER_BITS_NV          0x8864\n#define GL_CURRENT_OCCLUSION_QUERY_ID_NV  0x8865\n#define GL_PIXEL_COUNT_NV                 0x8866\n#define GL_PIXEL_COUNT_AVAILABLE_NV       0x8867\ntypedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids);\ntypedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids);\ntypedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void);\ntypedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids);\nGLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids);\nGLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id);\nGLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id);\nGLAPI void APIENTRY glEndOcclusionQueryNV (void);\nGLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params);\n#endif\n#endif /* GL_NV_occlusion_query */\n\n#ifndef GL_NV_packed_depth_stencil\n#define GL_NV_packed_depth_stencil 1\n#define GL_DEPTH_STENCIL_NV               0x84F9\n#define GL_UNSIGNED_INT_24_8_NV           0x84FA\n#endif /* GL_NV_packed_depth_stencil */\n\n#ifndef GL_NV_parameter_buffer_object\n#define GL_NV_parameter_buffer_object 1\n#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0\n#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1\n#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2\n#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3\n#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4\ntypedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params);\nGLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params);\nGLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params);\n#endif\n#endif /* GL_NV_parameter_buffer_object */\n\n#ifndef GL_NV_parameter_buffer_object2\n#define GL_NV_parameter_buffer_object2 1\n#endif /* GL_NV_parameter_buffer_object2 */\n\n#ifndef GL_NV_path_rendering\n#define GL_NV_path_rendering 1\n#define GL_PATH_FORMAT_SVG_NV             0x9070\n#define GL_PATH_FORMAT_PS_NV              0x9071\n#define GL_STANDARD_FONT_NAME_NV          0x9072\n#define GL_SYSTEM_FONT_NAME_NV            0x9073\n#define GL_FILE_NAME_NV                   0x9074\n#define GL_PATH_STROKE_WIDTH_NV           0x9075\n#define GL_PATH_END_CAPS_NV               0x9076\n#define GL_PATH_INITIAL_END_CAP_NV        0x9077\n#define GL_PATH_TERMINAL_END_CAP_NV       0x9078\n#define GL_PATH_JOIN_STYLE_NV             0x9079\n#define GL_PATH_MITER_LIMIT_NV            0x907A\n#define GL_PATH_DASH_CAPS_NV              0x907B\n#define GL_PATH_INITIAL_DASH_CAP_NV       0x907C\n#define GL_PATH_TERMINAL_DASH_CAP_NV      0x907D\n#define GL_PATH_DASH_OFFSET_NV            0x907E\n#define GL_PATH_CLIENT_LENGTH_NV          0x907F\n#define GL_PATH_FILL_MODE_NV              0x9080\n#define GL_PATH_FILL_MASK_NV              0x9081\n#define GL_PATH_FILL_COVER_MODE_NV        0x9082\n#define GL_PATH_STROKE_COVER_MODE_NV      0x9083\n#define GL_PATH_STROKE_MASK_NV            0x9084\n#define GL_COUNT_UP_NV                    0x9088\n#define GL_COUNT_DOWN_NV                  0x9089\n#define GL_PATH_OBJECT_BOUNDING_BOX_NV    0x908A\n#define GL_CONVEX_HULL_NV                 0x908B\n#define GL_BOUNDING_BOX_NV                0x908D\n#define GL_TRANSLATE_X_NV                 0x908E\n#define GL_TRANSLATE_Y_NV                 0x908F\n#define GL_TRANSLATE_2D_NV                0x9090\n#define GL_TRANSLATE_3D_NV                0x9091\n#define GL_AFFINE_2D_NV                   0x9092\n#define GL_AFFINE_3D_NV                   0x9094\n#define GL_TRANSPOSE_AFFINE_2D_NV         0x9096\n#define GL_TRANSPOSE_AFFINE_3D_NV         0x9098\n#define GL_UTF8_NV                        0x909A\n#define GL_UTF16_NV                       0x909B\n#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C\n#define GL_PATH_COMMAND_COUNT_NV          0x909D\n#define GL_PATH_COORD_COUNT_NV            0x909E\n#define GL_PATH_DASH_ARRAY_COUNT_NV       0x909F\n#define GL_PATH_COMPUTED_LENGTH_NV        0x90A0\n#define GL_PATH_FILL_BOUNDING_BOX_NV      0x90A1\n#define GL_PATH_STROKE_BOUNDING_BOX_NV    0x90A2\n#define GL_SQUARE_NV                      0x90A3\n#define GL_ROUND_NV                       0x90A4\n#define GL_TRIANGULAR_NV                  0x90A5\n#define GL_BEVEL_NV                       0x90A6\n#define GL_MITER_REVERT_NV                0x90A7\n#define GL_MITER_TRUNCATE_NV              0x90A8\n#define GL_SKIP_MISSING_GLYPH_NV          0x90A9\n#define GL_USE_MISSING_GLYPH_NV           0x90AA\n#define GL_PATH_ERROR_POSITION_NV         0x90AB\n#define GL_PATH_FOG_GEN_MODE_NV           0x90AC\n#define GL_ACCUM_ADJACENT_PAIRS_NV        0x90AD\n#define GL_ADJACENT_PAIRS_NV              0x90AE\n#define GL_FIRST_TO_REST_NV               0x90AF\n#define GL_PATH_GEN_MODE_NV               0x90B0\n#define GL_PATH_GEN_COEFF_NV              0x90B1\n#define GL_PATH_GEN_COLOR_FORMAT_NV       0x90B2\n#define GL_PATH_GEN_COMPONENTS_NV         0x90B3\n#define GL_PATH_STENCIL_FUNC_NV           0x90B7\n#define GL_PATH_STENCIL_REF_NV            0x90B8\n#define GL_PATH_STENCIL_VALUE_MASK_NV     0x90B9\n#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD\n#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE\n#define GL_PATH_COVER_DEPTH_FUNC_NV       0x90BF\n#define GL_PATH_DASH_OFFSET_RESET_NV      0x90B4\n#define GL_MOVE_TO_RESETS_NV              0x90B5\n#define GL_MOVE_TO_CONTINUES_NV           0x90B6\n#define GL_CLOSE_PATH_NV                  0x00\n#define GL_MOVE_TO_NV                     0x02\n#define GL_RELATIVE_MOVE_TO_NV            0x03\n#define GL_LINE_TO_NV                     0x04\n#define GL_RELATIVE_LINE_TO_NV            0x05\n#define GL_HORIZONTAL_LINE_TO_NV          0x06\n#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07\n#define GL_VERTICAL_LINE_TO_NV            0x08\n#define GL_RELATIVE_VERTICAL_LINE_TO_NV   0x09\n#define GL_QUADRATIC_CURVE_TO_NV          0x0A\n#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B\n#define GL_CUBIC_CURVE_TO_NV              0x0C\n#define GL_RELATIVE_CUBIC_CURVE_TO_NV     0x0D\n#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV   0x0E\n#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F\n#define GL_SMOOTH_CUBIC_CURVE_TO_NV       0x10\n#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11\n#define GL_SMALL_CCW_ARC_TO_NV            0x12\n#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV   0x13\n#define GL_SMALL_CW_ARC_TO_NV             0x14\n#define GL_RELATIVE_SMALL_CW_ARC_TO_NV    0x15\n#define GL_LARGE_CCW_ARC_TO_NV            0x16\n#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV   0x17\n#define GL_LARGE_CW_ARC_TO_NV             0x18\n#define GL_RELATIVE_LARGE_CW_ARC_TO_NV    0x19\n#define GL_RESTART_PATH_NV                0xF0\n#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV    0xF2\n#define GL_DUP_LAST_CUBIC_CURVE_TO_NV     0xF4\n#define GL_RECT_NV                        0xF6\n#define GL_CIRCULAR_CCW_ARC_TO_NV         0xF8\n#define GL_CIRCULAR_CW_ARC_TO_NV          0xFA\n#define GL_CIRCULAR_TANGENT_ARC_TO_NV     0xFC\n#define GL_ARC_TO_NV                      0xFE\n#define GL_RELATIVE_ARC_TO_NV             0xFF\n#define GL_BOLD_BIT_NV                    0x01\n#define GL_ITALIC_BIT_NV                  0x02\n#define GL_GLYPH_WIDTH_BIT_NV             0x01\n#define GL_GLYPH_HEIGHT_BIT_NV            0x02\n#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04\n#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08\n#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10\n#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20\n#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40\n#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80\n#define GL_GLYPH_HAS_KERNING_BIT_NV       0x100\n#define GL_FONT_X_MIN_BOUNDS_BIT_NV       0x00010000\n#define GL_FONT_Y_MIN_BOUNDS_BIT_NV       0x00020000\n#define GL_FONT_X_MAX_BOUNDS_BIT_NV       0x00040000\n#define GL_FONT_Y_MAX_BOUNDS_BIT_NV       0x00080000\n#define GL_FONT_UNITS_PER_EM_BIT_NV       0x00100000\n#define GL_FONT_ASCENDER_BIT_NV           0x00200000\n#define GL_FONT_DESCENDER_BIT_NV          0x00400000\n#define GL_FONT_HEIGHT_BIT_NV             0x00800000\n#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV  0x01000000\n#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000\n#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000\n#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000\n#define GL_FONT_HAS_KERNING_BIT_NV        0x10000000\n#define GL_PRIMARY_COLOR_NV               0x852C\n#define GL_SECONDARY_COLOR_NV             0x852D\ntypedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range);\ntypedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range);\ntypedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path);\ntypedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);\ntypedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);\ntypedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);\ntypedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);\ntypedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString);\ntypedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);\ntypedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);\ntypedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights);\ntypedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath);\ntypedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);\ntypedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues);\ntypedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value);\ntypedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value);\ntypedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value);\ntypedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray);\ntypedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask);\ntypedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units);\ntypedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask);\ntypedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask);\ntypedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);\ntypedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);\ntypedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func);\ntypedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs);\ntypedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs);\ntypedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode);\ntypedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode);\ntypedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode);\ntypedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);\ntypedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);\ntypedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value);\ntypedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value);\ntypedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands);\ntypedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords);\ntypedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray);\ntypedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);\ntypedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics);\ntypedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);\ntypedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value);\ntypedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value);\ntypedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value);\ntypedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value);\ntypedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y);\ntypedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y);\ntypedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments);\ntypedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLuint APIENTRY glGenPathsNV (GLsizei range);\nGLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range);\nGLAPI GLboolean APIENTRY glIsPathNV (GLuint path);\nGLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);\nGLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);\nGLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);\nGLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);\nGLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString);\nGLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);\nGLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);\nGLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights);\nGLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath);\nGLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);\nGLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues);\nGLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value);\nGLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value);\nGLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value);\nGLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value);\nGLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray);\nGLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask);\nGLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units);\nGLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask);\nGLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask);\nGLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);\nGLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);\nGLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func);\nGLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs);\nGLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs);\nGLAPI void APIENTRY glPathFogGenNV (GLenum genMode);\nGLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode);\nGLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode);\nGLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);\nGLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);\nGLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value);\nGLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value);\nGLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands);\nGLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords);\nGLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray);\nGLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);\nGLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics);\nGLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);\nGLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value);\nGLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value);\nGLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value);\nGLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value);\nGLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y);\nGLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y);\nGLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments);\nGLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);\n#endif\n#endif /* GL_NV_path_rendering */\n\n#ifndef GL_NV_pixel_data_range\n#define GL_NV_pixel_data_range 1\n#define GL_WRITE_PIXEL_DATA_RANGE_NV      0x8878\n#define GL_READ_PIXEL_DATA_RANGE_NV       0x8879\n#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A\n#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B\n#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C\n#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D\ntypedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer);\ntypedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer);\nGLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target);\n#endif\n#endif /* GL_NV_pixel_data_range */\n\n#ifndef GL_NV_point_sprite\n#define GL_NV_point_sprite 1\n#define GL_POINT_SPRITE_NV                0x8861\n#define GL_COORD_REPLACE_NV               0x8862\n#define GL_POINT_SPRITE_R_MODE_NV         0x8863\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param);\nGLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params);\n#endif\n#endif /* GL_NV_point_sprite */\n\n#ifndef GL_NV_present_video\n#define GL_NV_present_video 1\n#define GL_FRAME_NV                       0x8E26\n#define GL_FIELDS_NV                      0x8E27\n#define GL_CURRENT_TIME_NV                0x8E28\n#define GL_NUM_FILL_STREAMS_NV            0x8E29\n#define GL_PRESENT_TIME_NV                0x8E2A\n#define GL_PRESENT_DURATION_NV            0x8E2B\ntypedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1);\ntypedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3);\ntypedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params);\ntypedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1);\nGLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3);\nGLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params);\nGLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params);\n#endif\n#endif /* GL_NV_present_video */\n\n#ifndef GL_NV_primitive_restart\n#define GL_NV_primitive_restart 1\n#define GL_PRIMITIVE_RESTART_NV           0x8558\n#define GL_PRIMITIVE_RESTART_INDEX_NV     0x8559\ntypedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void);\ntypedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPrimitiveRestartNV (void);\nGLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index);\n#endif\n#endif /* GL_NV_primitive_restart */\n\n#ifndef GL_NV_register_combiners\n#define GL_NV_register_combiners 1\n#define GL_REGISTER_COMBINERS_NV          0x8522\n#define GL_VARIABLE_A_NV                  0x8523\n#define GL_VARIABLE_B_NV                  0x8524\n#define GL_VARIABLE_C_NV                  0x8525\n#define GL_VARIABLE_D_NV                  0x8526\n#define GL_VARIABLE_E_NV                  0x8527\n#define GL_VARIABLE_F_NV                  0x8528\n#define GL_VARIABLE_G_NV                  0x8529\n#define GL_CONSTANT_COLOR0_NV             0x852A\n#define GL_CONSTANT_COLOR1_NV             0x852B\n#define GL_SPARE0_NV                      0x852E\n#define GL_SPARE1_NV                      0x852F\n#define GL_DISCARD_NV                     0x8530\n#define GL_E_TIMES_F_NV                   0x8531\n#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532\n#define GL_UNSIGNED_IDENTITY_NV           0x8536\n#define GL_UNSIGNED_INVERT_NV             0x8537\n#define GL_EXPAND_NORMAL_NV               0x8538\n#define GL_EXPAND_NEGATE_NV               0x8539\n#define GL_HALF_BIAS_NORMAL_NV            0x853A\n#define GL_HALF_BIAS_NEGATE_NV            0x853B\n#define GL_SIGNED_IDENTITY_NV             0x853C\n#define GL_SIGNED_NEGATE_NV               0x853D\n#define GL_SCALE_BY_TWO_NV                0x853E\n#define GL_SCALE_BY_FOUR_NV               0x853F\n#define GL_SCALE_BY_ONE_HALF_NV           0x8540\n#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV   0x8541\n#define GL_COMBINER_INPUT_NV              0x8542\n#define GL_COMBINER_MAPPING_NV            0x8543\n#define GL_COMBINER_COMPONENT_USAGE_NV    0x8544\n#define GL_COMBINER_AB_DOT_PRODUCT_NV     0x8545\n#define GL_COMBINER_CD_DOT_PRODUCT_NV     0x8546\n#define GL_COMBINER_MUX_SUM_NV            0x8547\n#define GL_COMBINER_SCALE_NV              0x8548\n#define GL_COMBINER_BIAS_NV               0x8549\n#define GL_COMBINER_AB_OUTPUT_NV          0x854A\n#define GL_COMBINER_CD_OUTPUT_NV          0x854B\n#define GL_COMBINER_SUM_OUTPUT_NV         0x854C\n#define GL_MAX_GENERAL_COMBINERS_NV       0x854D\n#define GL_NUM_GENERAL_COMBINERS_NV       0x854E\n#define GL_COLOR_SUM_CLAMP_NV             0x854F\n#define GL_COMBINER0_NV                   0x8550\n#define GL_COMBINER1_NV                   0x8551\n#define GL_COMBINER2_NV                   0x8552\n#define GL_COMBINER3_NV                   0x8553\n#define GL_COMBINER4_NV                   0x8554\n#define GL_COMBINER5_NV                   0x8555\n#define GL_COMBINER6_NV                   0x8556\n#define GL_COMBINER7_NV                   0x8557\ntypedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);\ntypedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);\ntypedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);\ntypedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params);\nGLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param);\nGLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);\nGLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);\nGLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);\nGLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params);\n#endif\n#endif /* GL_NV_register_combiners */\n\n#ifndef GL_NV_register_combiners2\n#define GL_NV_register_combiners2 1\n#define GL_PER_STAGE_CONSTANTS_NV         0x8535\ntypedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params);\n#endif\n#endif /* GL_NV_register_combiners2 */\n\n#ifndef GL_NV_shader_atomic_counters\n#define GL_NV_shader_atomic_counters 1\n#endif /* GL_NV_shader_atomic_counters */\n\n#ifndef GL_NV_shader_atomic_float\n#define GL_NV_shader_atomic_float 1\n#endif /* GL_NV_shader_atomic_float */\n\n#ifndef GL_NV_shader_buffer_load\n#define GL_NV_shader_buffer_load 1\n#define GL_BUFFER_GPU_ADDRESS_NV          0x8F1D\n#define GL_GPU_ADDRESS_NV                 0x8F34\n#define GL_MAX_SHADER_BUFFER_ADDRESS_NV   0x8F35\ntypedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access);\ntypedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target);\ntypedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access);\ntypedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer);\ntypedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params);\ntypedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params);\ntypedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result);\ntypedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value);\ntypedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access);\nGLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target);\nGLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target);\nGLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access);\nGLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer);\nGLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer);\nGLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params);\nGLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params);\nGLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result);\nGLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value);\nGLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);\nGLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value);\nGLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);\n#endif\n#endif /* GL_NV_shader_buffer_load */\n\n#ifndef GL_NV_shader_buffer_store\n#define GL_NV_shader_buffer_store 1\n#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010\n#endif /* GL_NV_shader_buffer_store */\n\n#ifndef GL_NV_shader_storage_buffer_object\n#define GL_NV_shader_storage_buffer_object 1\n#endif /* GL_NV_shader_storage_buffer_object */\n\n#ifndef GL_NV_shader_thread_group\n#define GL_NV_shader_thread_group 1\n#define GL_WARP_SIZE_NV                   0x9339\n#define GL_WARPS_PER_SM_NV                0x933A\n#define GL_SM_COUNT_NV                    0x933B\n#endif /* GL_NV_shader_thread_group */\n\n#ifndef GL_NV_shader_thread_shuffle\n#define GL_NV_shader_thread_shuffle 1\n#endif /* GL_NV_shader_thread_shuffle */\n\n#ifndef GL_NV_tessellation_program5\n#define GL_NV_tessellation_program5 1\n#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV   0x86D8\n#define GL_TESS_CONTROL_PROGRAM_NV        0x891E\n#define GL_TESS_EVALUATION_PROGRAM_NV     0x891F\n#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74\n#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75\n#endif /* GL_NV_tessellation_program5 */\n\n#ifndef GL_NV_texgen_emboss\n#define GL_NV_texgen_emboss 1\n#define GL_EMBOSS_LIGHT_NV                0x855D\n#define GL_EMBOSS_CONSTANT_NV             0x855E\n#define GL_EMBOSS_MAP_NV                  0x855F\n#endif /* GL_NV_texgen_emboss */\n\n#ifndef GL_NV_texgen_reflection\n#define GL_NV_texgen_reflection 1\n#define GL_NORMAL_MAP_NV                  0x8511\n#define GL_REFLECTION_MAP_NV              0x8512\n#endif /* GL_NV_texgen_reflection */\n\n#ifndef GL_NV_texture_barrier\n#define GL_NV_texture_barrier 1\ntypedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTextureBarrierNV (void);\n#endif\n#endif /* GL_NV_texture_barrier */\n\n#ifndef GL_NV_texture_compression_vtc\n#define GL_NV_texture_compression_vtc 1\n#endif /* GL_NV_texture_compression_vtc */\n\n#ifndef GL_NV_texture_env_combine4\n#define GL_NV_texture_env_combine4 1\n#define GL_COMBINE4_NV                    0x8503\n#define GL_SOURCE3_RGB_NV                 0x8583\n#define GL_SOURCE3_ALPHA_NV               0x858B\n#define GL_OPERAND3_RGB_NV                0x8593\n#define GL_OPERAND3_ALPHA_NV              0x859B\n#endif /* GL_NV_texture_env_combine4 */\n\n#ifndef GL_NV_texture_expand_normal\n#define GL_NV_texture_expand_normal 1\n#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F\n#endif /* GL_NV_texture_expand_normal */\n\n#ifndef GL_NV_texture_multisample\n#define GL_NV_texture_multisample 1\n#define GL_TEXTURE_COVERAGE_SAMPLES_NV    0x9045\n#define GL_TEXTURE_COLOR_SAMPLES_NV       0x9046\ntypedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);\ntypedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);\ntypedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);\ntypedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);\ntypedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);\ntypedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);\nGLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);\nGLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);\nGLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);\nGLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);\nGLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);\n#endif\n#endif /* GL_NV_texture_multisample */\n\n#ifndef GL_NV_texture_rectangle\n#define GL_NV_texture_rectangle 1\n#define GL_TEXTURE_RECTANGLE_NV           0x84F5\n#define GL_TEXTURE_BINDING_RECTANGLE_NV   0x84F6\n#define GL_PROXY_TEXTURE_RECTANGLE_NV     0x84F7\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV  0x84F8\n#endif /* GL_NV_texture_rectangle */\n\n#ifndef GL_NV_texture_shader\n#define GL_NV_texture_shader 1\n#define GL_OFFSET_TEXTURE_RECTANGLE_NV    0x864C\n#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D\n#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E\n#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9\n#define GL_UNSIGNED_INT_S8_S8_8_8_NV      0x86DA\n#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV  0x86DB\n#define GL_DSDT_MAG_INTENSITY_NV          0x86DC\n#define GL_SHADER_CONSISTENT_NV           0x86DD\n#define GL_TEXTURE_SHADER_NV              0x86DE\n#define GL_SHADER_OPERATION_NV            0x86DF\n#define GL_CULL_MODES_NV                  0x86E0\n#define GL_OFFSET_TEXTURE_MATRIX_NV       0x86E1\n#define GL_OFFSET_TEXTURE_SCALE_NV        0x86E2\n#define GL_OFFSET_TEXTURE_BIAS_NV         0x86E3\n#define GL_OFFSET_TEXTURE_2D_MATRIX_NV    0x86E1\n#define GL_OFFSET_TEXTURE_2D_SCALE_NV     0x86E2\n#define GL_OFFSET_TEXTURE_2D_BIAS_NV      0x86E3\n#define GL_PREVIOUS_TEXTURE_INPUT_NV      0x86E4\n#define GL_CONST_EYE_NV                   0x86E5\n#define GL_PASS_THROUGH_NV                0x86E6\n#define GL_CULL_FRAGMENT_NV               0x86E7\n#define GL_OFFSET_TEXTURE_2D_NV           0x86E8\n#define GL_DEPENDENT_AR_TEXTURE_2D_NV     0x86E9\n#define GL_DEPENDENT_GB_TEXTURE_2D_NV     0x86EA\n#define GL_DOT_PRODUCT_NV                 0x86EC\n#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV   0x86ED\n#define GL_DOT_PRODUCT_TEXTURE_2D_NV      0x86EE\n#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0\n#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1\n#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2\n#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3\n#define GL_HILO_NV                        0x86F4\n#define GL_DSDT_NV                        0x86F5\n#define GL_DSDT_MAG_NV                    0x86F6\n#define GL_DSDT_MAG_VIB_NV                0x86F7\n#define GL_HILO16_NV                      0x86F8\n#define GL_SIGNED_HILO_NV                 0x86F9\n#define GL_SIGNED_HILO16_NV               0x86FA\n#define GL_SIGNED_RGBA_NV                 0x86FB\n#define GL_SIGNED_RGBA8_NV                0x86FC\n#define GL_SIGNED_RGB_NV                  0x86FE\n#define GL_SIGNED_RGB8_NV                 0x86FF\n#define GL_SIGNED_LUMINANCE_NV            0x8701\n#define GL_SIGNED_LUMINANCE8_NV           0x8702\n#define GL_SIGNED_LUMINANCE_ALPHA_NV      0x8703\n#define GL_SIGNED_LUMINANCE8_ALPHA8_NV    0x8704\n#define GL_SIGNED_ALPHA_NV                0x8705\n#define GL_SIGNED_ALPHA8_NV               0x8706\n#define GL_SIGNED_INTENSITY_NV            0x8707\n#define GL_SIGNED_INTENSITY8_NV           0x8708\n#define GL_DSDT8_NV                       0x8709\n#define GL_DSDT8_MAG8_NV                  0x870A\n#define GL_DSDT8_MAG8_INTENSITY8_NV       0x870B\n#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV   0x870C\n#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D\n#define GL_HI_SCALE_NV                    0x870E\n#define GL_LO_SCALE_NV                    0x870F\n#define GL_DS_SCALE_NV                    0x8710\n#define GL_DT_SCALE_NV                    0x8711\n#define GL_MAGNITUDE_SCALE_NV             0x8712\n#define GL_VIBRANCE_SCALE_NV              0x8713\n#define GL_HI_BIAS_NV                     0x8714\n#define GL_LO_BIAS_NV                     0x8715\n#define GL_DS_BIAS_NV                     0x8716\n#define GL_DT_BIAS_NV                     0x8717\n#define GL_MAGNITUDE_BIAS_NV              0x8718\n#define GL_VIBRANCE_BIAS_NV               0x8719\n#define GL_TEXTURE_BORDER_VALUES_NV       0x871A\n#define GL_TEXTURE_HI_SIZE_NV             0x871B\n#define GL_TEXTURE_LO_SIZE_NV             0x871C\n#define GL_TEXTURE_DS_SIZE_NV             0x871D\n#define GL_TEXTURE_DT_SIZE_NV             0x871E\n#define GL_TEXTURE_MAG_SIZE_NV            0x871F\n#endif /* GL_NV_texture_shader */\n\n#ifndef GL_NV_texture_shader2\n#define GL_NV_texture_shader2 1\n#define GL_DOT_PRODUCT_TEXTURE_3D_NV      0x86EF\n#endif /* GL_NV_texture_shader2 */\n\n#ifndef GL_NV_texture_shader3\n#define GL_NV_texture_shader3 1\n#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850\n#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851\n#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852\n#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853\n#define GL_OFFSET_HILO_TEXTURE_2D_NV      0x8854\n#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855\n#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856\n#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857\n#define GL_DEPENDENT_HILO_TEXTURE_2D_NV   0x8858\n#define GL_DEPENDENT_RGB_TEXTURE_3D_NV    0x8859\n#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A\n#define GL_DOT_PRODUCT_PASS_THROUGH_NV    0x885B\n#define GL_DOT_PRODUCT_TEXTURE_1D_NV      0x885C\n#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D\n#define GL_HILO8_NV                       0x885E\n#define GL_SIGNED_HILO8_NV                0x885F\n#define GL_FORCE_BLUE_TO_ONE_NV           0x8860\n#endif /* GL_NV_texture_shader3 */\n\n#ifndef GL_NV_transform_feedback\n#define GL_NV_transform_feedback 1\n#define GL_BACK_PRIMARY_COLOR_NV          0x8C77\n#define GL_BACK_SECONDARY_COLOR_NV        0x8C78\n#define GL_TEXTURE_COORD_NV               0x8C79\n#define GL_CLIP_DISTANCE_NV               0x8C7A\n#define GL_VERTEX_ID_NV                   0x8C7B\n#define GL_PRIMITIVE_ID_NV                0x8C7C\n#define GL_GENERIC_ATTRIB_NV              0x8C7D\n#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV  0x8C7E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80\n#define GL_ACTIVE_VARYINGS_NV             0x8C81\n#define GL_ACTIVE_VARYING_MAX_LENGTH_NV   0x8C82\n#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85\n#define GL_TRANSFORM_FEEDBACK_RECORD_NV   0x8C86\n#define GL_PRIMITIVES_GENERATED_NV        0x8C87\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88\n#define GL_RASTERIZER_DISCARD_NV          0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B\n#define GL_INTERLEAVED_ATTRIBS_NV         0x8C8C\n#define GL_SEPARATE_ATTRIBS_NV            0x8C8D\n#define GL_TRANSFORM_FEEDBACK_BUFFER_NV   0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F\n#define GL_LAYER_NV                       0x8DAA\n#define GL_NEXT_BUFFER_NV                 -2\n#define GL_SKIP_COMPONENTS4_NV            -3\n#define GL_SKIP_COMPONENTS3_NV            -4\n#define GL_SKIP_COMPONENTS2_NV            -5\n#define GL_SKIP_COMPONENTS1_NV            -6\ntypedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode);\ntypedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void);\ntypedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode);\ntypedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);\ntypedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer);\ntypedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode);\ntypedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name);\ntypedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\ntypedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location);\ntypedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode);\nGLAPI void APIENTRY glEndTransformFeedbackNV (void);\nGLAPI void APIENTRY glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode);\nGLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset);\nGLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer);\nGLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode);\nGLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name);\nGLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name);\nGLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\nGLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location);\nGLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode);\n#endif\n#endif /* GL_NV_transform_feedback */\n\n#ifndef GL_NV_transform_feedback2\n#define GL_NV_transform_feedback2 1\n#define GL_TRANSFORM_FEEDBACK_NV          0x8E22\n#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23\n#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24\n#define GL_TRANSFORM_FEEDBACK_BINDING_NV  0x8E25\ntypedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id);\ntypedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids);\ntypedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids);\ntypedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void);\ntypedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void);\ntypedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id);\nGLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids);\nGLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids);\nGLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id);\nGLAPI void APIENTRY glPauseTransformFeedbackNV (void);\nGLAPI void APIENTRY glResumeTransformFeedbackNV (void);\nGLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id);\n#endif\n#endif /* GL_NV_transform_feedback2 */\n\n#ifndef GL_NV_vdpau_interop\n#define GL_NV_vdpau_interop 1\ntypedef GLintptr GLvdpauSurfaceNV;\n#define GL_SURFACE_STATE_NV               0x86EB\n#define GL_SURFACE_REGISTERED_NV          0x86FD\n#define GL_SURFACE_MAPPED_NV              0x8700\n#define GL_WRITE_DISCARD_NV               0x88BE\ntypedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress);\ntypedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void);\ntypedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);\ntypedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);\ntypedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface);\ntypedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface);\ntypedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\ntypedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access);\ntypedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces);\ntypedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress);\nGLAPI void APIENTRY glVDPAUFiniNV (void);\nGLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);\nGLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);\nGLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface);\nGLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface);\nGLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\nGLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access);\nGLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces);\nGLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces);\n#endif\n#endif /* GL_NV_vdpau_interop */\n\n#ifndef GL_NV_vertex_array_range\n#define GL_NV_vertex_array_range 1\n#define GL_VERTEX_ARRAY_RANGE_NV          0x851D\n#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV   0x851E\n#define GL_VERTEX_ARRAY_RANGE_VALID_NV    0x851F\n#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520\n#define GL_VERTEX_ARRAY_RANGE_POINTER_NV  0x8521\ntypedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFlushVertexArrayRangeNV (void);\nGLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer);\n#endif\n#endif /* GL_NV_vertex_array_range */\n\n#ifndef GL_NV_vertex_array_range2\n#define GL_NV_vertex_array_range2 1\n#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533\n#endif /* GL_NV_vertex_array_range2 */\n\n#ifndef GL_NV_vertex_attrib_integer_64bit\n#define GL_NV_vertex_attrib_integer_64bit 1\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x);\nGLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y);\nGLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z);\nGLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);\nGLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v);\nGLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v);\nGLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v);\nGLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v);\nGLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x);\nGLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y);\nGLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);\nGLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);\nGLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v);\nGLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v);\nGLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v);\nGLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v);\nGLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params);\nGLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params);\nGLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride);\n#endif\n#endif /* GL_NV_vertex_attrib_integer_64bit */\n\n#ifndef GL_NV_vertex_buffer_unified_memory\n#define GL_NV_vertex_buffer_unified_memory 1\n#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E\n#define GL_ELEMENT_ARRAY_UNIFIED_NV       0x8F1F\n#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20\n#define GL_VERTEX_ARRAY_ADDRESS_NV        0x8F21\n#define GL_NORMAL_ARRAY_ADDRESS_NV        0x8F22\n#define GL_COLOR_ARRAY_ADDRESS_NV         0x8F23\n#define GL_INDEX_ARRAY_ADDRESS_NV         0x8F24\n#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25\n#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV     0x8F26\n#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27\n#define GL_FOG_COORD_ARRAY_ADDRESS_NV     0x8F28\n#define GL_ELEMENT_ARRAY_ADDRESS_NV       0x8F29\n#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV  0x8F2A\n#define GL_VERTEX_ARRAY_LENGTH_NV         0x8F2B\n#define GL_NORMAL_ARRAY_LENGTH_NV         0x8F2C\n#define GL_COLOR_ARRAY_LENGTH_NV          0x8F2D\n#define GL_INDEX_ARRAY_LENGTH_NV          0x8F2E\n#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV  0x8F2F\n#define GL_EDGE_FLAG_ARRAY_LENGTH_NV      0x8F30\n#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31\n#define GL_FOG_COORD_ARRAY_LENGTH_NV      0x8F32\n#define GL_ELEMENT_ARRAY_LENGTH_NV        0x8F33\n#define GL_DRAW_INDIRECT_UNIFIED_NV       0x8F40\n#define GL_DRAW_INDIRECT_ADDRESS_NV       0x8F41\n#define GL_DRAW_INDIRECT_LENGTH_NV        0x8F42\ntypedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);\ntypedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);\ntypedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride);\ntypedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);\ntypedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride);\ntypedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);\ntypedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);\ntypedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);\ntypedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);\nGLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride);\nGLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride);\nGLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride);\nGLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride);\nGLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);\nGLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride);\nGLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result);\n#endif\n#endif /* GL_NV_vertex_buffer_unified_memory */\n\n#ifndef GL_NV_vertex_program\n#define GL_NV_vertex_program 1\n#define GL_VERTEX_PROGRAM_NV              0x8620\n#define GL_VERTEX_STATE_PROGRAM_NV        0x8621\n#define GL_ATTRIB_ARRAY_SIZE_NV           0x8623\n#define GL_ATTRIB_ARRAY_STRIDE_NV         0x8624\n#define GL_ATTRIB_ARRAY_TYPE_NV           0x8625\n#define GL_CURRENT_ATTRIB_NV              0x8626\n#define GL_PROGRAM_LENGTH_NV              0x8627\n#define GL_PROGRAM_STRING_NV              0x8628\n#define GL_MODELVIEW_PROJECTION_NV        0x8629\n#define GL_IDENTITY_NV                    0x862A\n#define GL_INVERSE_NV                     0x862B\n#define GL_TRANSPOSE_NV                   0x862C\n#define GL_INVERSE_TRANSPOSE_NV           0x862D\n#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E\n#define GL_MAX_TRACK_MATRICES_NV          0x862F\n#define GL_MATRIX0_NV                     0x8630\n#define GL_MATRIX1_NV                     0x8631\n#define GL_MATRIX2_NV                     0x8632\n#define GL_MATRIX3_NV                     0x8633\n#define GL_MATRIX4_NV                     0x8634\n#define GL_MATRIX5_NV                     0x8635\n#define GL_MATRIX6_NV                     0x8636\n#define GL_MATRIX7_NV                     0x8637\n#define GL_CURRENT_MATRIX_STACK_DEPTH_NV  0x8640\n#define GL_CURRENT_MATRIX_NV              0x8641\n#define GL_VERTEX_PROGRAM_POINT_SIZE_NV   0x8642\n#define GL_VERTEX_PROGRAM_TWO_SIDE_NV     0x8643\n#define GL_PROGRAM_PARAMETER_NV           0x8644\n#define GL_ATTRIB_ARRAY_POINTER_NV        0x8645\n#define GL_PROGRAM_TARGET_NV              0x8646\n#define GL_PROGRAM_RESIDENT_NV            0x8647\n#define GL_TRACK_MATRIX_NV                0x8648\n#define GL_TRACK_MATRIX_TRANSFORM_NV      0x8649\n#define GL_VERTEX_PROGRAM_BINDING_NV      0x864A\n#define GL_PROGRAM_ERROR_POSITION_NV      0x864B\n#define GL_VERTEX_ATTRIB_ARRAY0_NV        0x8650\n#define GL_VERTEX_ATTRIB_ARRAY1_NV        0x8651\n#define GL_VERTEX_ATTRIB_ARRAY2_NV        0x8652\n#define GL_VERTEX_ATTRIB_ARRAY3_NV        0x8653\n#define GL_VERTEX_ATTRIB_ARRAY4_NV        0x8654\n#define GL_VERTEX_ATTRIB_ARRAY5_NV        0x8655\n#define GL_VERTEX_ATTRIB_ARRAY6_NV        0x8656\n#define GL_VERTEX_ATTRIB_ARRAY7_NV        0x8657\n#define GL_VERTEX_ATTRIB_ARRAY8_NV        0x8658\n#define GL_VERTEX_ATTRIB_ARRAY9_NV        0x8659\n#define GL_VERTEX_ATTRIB_ARRAY10_NV       0x865A\n#define GL_VERTEX_ATTRIB_ARRAY11_NV       0x865B\n#define GL_VERTEX_ATTRIB_ARRAY12_NV       0x865C\n#define GL_VERTEX_ATTRIB_ARRAY13_NV       0x865D\n#define GL_VERTEX_ATTRIB_ARRAY14_NV       0x865E\n#define GL_VERTEX_ATTRIB_ARRAY15_NV       0x865F\n#define GL_MAP1_VERTEX_ATTRIB0_4_NV       0x8660\n#define GL_MAP1_VERTEX_ATTRIB1_4_NV       0x8661\n#define GL_MAP1_VERTEX_ATTRIB2_4_NV       0x8662\n#define GL_MAP1_VERTEX_ATTRIB3_4_NV       0x8663\n#define GL_MAP1_VERTEX_ATTRIB4_4_NV       0x8664\n#define GL_MAP1_VERTEX_ATTRIB5_4_NV       0x8665\n#define GL_MAP1_VERTEX_ATTRIB6_4_NV       0x8666\n#define GL_MAP1_VERTEX_ATTRIB7_4_NV       0x8667\n#define GL_MAP1_VERTEX_ATTRIB8_4_NV       0x8668\n#define GL_MAP1_VERTEX_ATTRIB9_4_NV       0x8669\n#define GL_MAP1_VERTEX_ATTRIB10_4_NV      0x866A\n#define GL_MAP1_VERTEX_ATTRIB11_4_NV      0x866B\n#define GL_MAP1_VERTEX_ATTRIB12_4_NV      0x866C\n#define GL_MAP1_VERTEX_ATTRIB13_4_NV      0x866D\n#define GL_MAP1_VERTEX_ATTRIB14_4_NV      0x866E\n#define GL_MAP1_VERTEX_ATTRIB15_4_NV      0x866F\n#define GL_MAP2_VERTEX_ATTRIB0_4_NV       0x8670\n#define GL_MAP2_VERTEX_ATTRIB1_4_NV       0x8671\n#define GL_MAP2_VERTEX_ATTRIB2_4_NV       0x8672\n#define GL_MAP2_VERTEX_ATTRIB3_4_NV       0x8673\n#define GL_MAP2_VERTEX_ATTRIB4_4_NV       0x8674\n#define GL_MAP2_VERTEX_ATTRIB5_4_NV       0x8675\n#define GL_MAP2_VERTEX_ATTRIB6_4_NV       0x8676\n#define GL_MAP2_VERTEX_ATTRIB7_4_NV       0x8677\n#define GL_MAP2_VERTEX_ATTRIB8_4_NV       0x8678\n#define GL_MAP2_VERTEX_ATTRIB9_4_NV       0x8679\n#define GL_MAP2_VERTEX_ATTRIB10_4_NV      0x867A\n#define GL_MAP2_VERTEX_ATTRIB11_4_NV      0x867B\n#define GL_MAP2_VERTEX_ATTRIB12_4_NV      0x867C\n#define GL_MAP2_VERTEX_ATTRIB13_4_NV      0x867D\n#define GL_MAP2_VERTEX_ATTRIB14_4_NV      0x867E\n#define GL_MAP2_VERTEX_ATTRIB15_4_NV      0x867F\ntypedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences);\ntypedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id);\ntypedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs);\ntypedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs);\ntypedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program);\ntypedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer);\ntypedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program);\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs);\ntypedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences);\nGLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id);\nGLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs);\nGLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params);\nGLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs);\nGLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params);\nGLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program);\nGLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params);\nGLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer);\nGLAPI GLboolean APIENTRY glIsProgramNV (GLuint id);\nGLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program);\nGLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v);\nGLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v);\nGLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs);\nGLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform);\nGLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x);\nGLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x);\nGLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x);\nGLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y);\nGLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y);\nGLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z);\nGLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\nGLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v);\nGLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v);\nGLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v);\nGLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v);\nGLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v);\n#endif\n#endif /* GL_NV_vertex_program */\n\n#ifndef GL_NV_vertex_program1_1\n#define GL_NV_vertex_program1_1 1\n#endif /* GL_NV_vertex_program1_1 */\n\n#ifndef GL_NV_vertex_program2\n#define GL_NV_vertex_program2 1\n#endif /* GL_NV_vertex_program2 */\n\n#ifndef GL_NV_vertex_program2_option\n#define GL_NV_vertex_program2_option 1\n#endif /* GL_NV_vertex_program2_option */\n\n#ifndef GL_NV_vertex_program3\n#define GL_NV_vertex_program3 1\n#endif /* GL_NV_vertex_program3 */\n\n#ifndef GL_NV_vertex_program4\n#define GL_NV_vertex_program4 1\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x);\nGLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y);\nGLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z);\nGLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x);\nGLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y);\nGLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z);\nGLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\nGLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v);\nGLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v);\nGLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params);\n#endif\n#endif /* GL_NV_vertex_program4 */\n\n#ifndef GL_NV_video_capture\n#define GL_NV_video_capture 1\n#define GL_VIDEO_BUFFER_NV                0x9020\n#define GL_VIDEO_BUFFER_BINDING_NV        0x9021\n#define GL_FIELD_UPPER_NV                 0x9022\n#define GL_FIELD_LOWER_NV                 0x9023\n#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV   0x9024\n#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025\n#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026\n#define GL_LAST_VIDEO_CAPTURE_STATUS_NV   0x9027\n#define GL_VIDEO_BUFFER_PITCH_NV          0x9028\n#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029\n#define GL_VIDEO_COLOR_CONVERSION_MAX_NV  0x902A\n#define GL_VIDEO_COLOR_CONVERSION_MIN_NV  0x902B\n#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C\n#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D\n#define GL_PARTIAL_SUCCESS_NV             0x902E\n#define GL_SUCCESS_NV                     0x902F\n#define GL_FAILURE_NV                     0x9030\n#define GL_YCBYCR8_422_NV                 0x9031\n#define GL_YCBAYCR8A_4224_NV              0x9032\n#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV  0x9033\n#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034\n#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV  0x9035\n#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036\n#define GL_Z4Y12Z4CB12Z4CR12_444_NV       0x9037\n#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV   0x9038\n#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV  0x9039\n#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A\n#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B\n#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C\ntypedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot);\ntypedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset);\ntypedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture);\ntypedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot);\ntypedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params);\ntypedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time);\ntypedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot);\nGLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset);\nGLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture);\nGLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot);\nGLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params);\nGLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time);\nGLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params);\n#endif\n#endif /* GL_NV_video_capture */\n\n#ifndef GL_OML_interlace\n#define GL_OML_interlace 1\n#define GL_INTERLACE_OML                  0x8980\n#define GL_INTERLACE_READ_OML             0x8981\n#endif /* GL_OML_interlace */\n\n#ifndef GL_OML_resample\n#define GL_OML_resample 1\n#define GL_PACK_RESAMPLE_OML              0x8984\n#define GL_UNPACK_RESAMPLE_OML            0x8985\n#define GL_RESAMPLE_REPLICATE_OML         0x8986\n#define GL_RESAMPLE_ZERO_FILL_OML         0x8987\n#define GL_RESAMPLE_AVERAGE_OML           0x8988\n#define GL_RESAMPLE_DECIMATE_OML          0x8989\n#endif /* GL_OML_resample */\n\n#ifndef GL_OML_subsample\n#define GL_OML_subsample 1\n#define GL_FORMAT_SUBSAMPLE_24_24_OML     0x8982\n#define GL_FORMAT_SUBSAMPLE_244_244_OML   0x8983\n#endif /* GL_OML_subsample */\n\n#ifndef GL_PGI_misc_hints\n#define GL_PGI_misc_hints 1\n#define GL_PREFER_DOUBLEBUFFER_HINT_PGI   0x1A1F8\n#define GL_CONSERVE_MEMORY_HINT_PGI       0x1A1FD\n#define GL_RECLAIM_MEMORY_HINT_PGI        0x1A1FE\n#define GL_NATIVE_GRAPHICS_HANDLE_PGI     0x1A202\n#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203\n#define GL_NATIVE_GRAPHICS_END_HINT_PGI   0x1A204\n#define GL_ALWAYS_FAST_HINT_PGI           0x1A20C\n#define GL_ALWAYS_SOFT_HINT_PGI           0x1A20D\n#define GL_ALLOW_DRAW_OBJ_HINT_PGI        0x1A20E\n#define GL_ALLOW_DRAW_WIN_HINT_PGI        0x1A20F\n#define GL_ALLOW_DRAW_FRG_HINT_PGI        0x1A210\n#define GL_ALLOW_DRAW_MEM_HINT_PGI        0x1A211\n#define GL_STRICT_DEPTHFUNC_HINT_PGI      0x1A216\n#define GL_STRICT_LIGHTING_HINT_PGI       0x1A217\n#define GL_STRICT_SCISSOR_HINT_PGI        0x1A218\n#define GL_FULL_STIPPLE_HINT_PGI          0x1A219\n#define GL_CLIP_NEAR_HINT_PGI             0x1A220\n#define GL_CLIP_FAR_HINT_PGI              0x1A221\n#define GL_WIDE_LINE_HINT_PGI             0x1A222\n#define GL_BACK_NORMALS_HINT_PGI          0x1A223\ntypedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glHintPGI (GLenum target, GLint mode);\n#endif\n#endif /* GL_PGI_misc_hints */\n\n#ifndef GL_PGI_vertex_hints\n#define GL_PGI_vertex_hints 1\n#define GL_VERTEX_DATA_HINT_PGI           0x1A22A\n#define GL_VERTEX_CONSISTENT_HINT_PGI     0x1A22B\n#define GL_MATERIAL_SIDE_HINT_PGI         0x1A22C\n#define GL_MAX_VERTEX_HINT_PGI            0x1A22D\n#define GL_COLOR3_BIT_PGI                 0x00010000\n#define GL_COLOR4_BIT_PGI                 0x00020000\n#define GL_EDGEFLAG_BIT_PGI               0x00040000\n#define GL_INDEX_BIT_PGI                  0x00080000\n#define GL_MAT_AMBIENT_BIT_PGI            0x00100000\n#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000\n#define GL_MAT_DIFFUSE_BIT_PGI            0x00400000\n#define GL_MAT_EMISSION_BIT_PGI           0x00800000\n#define GL_MAT_COLOR_INDEXES_BIT_PGI      0x01000000\n#define GL_MAT_SHININESS_BIT_PGI          0x02000000\n#define GL_MAT_SPECULAR_BIT_PGI           0x04000000\n#define GL_NORMAL_BIT_PGI                 0x08000000\n#define GL_TEXCOORD1_BIT_PGI              0x10000000\n#define GL_TEXCOORD2_BIT_PGI              0x20000000\n#define GL_TEXCOORD3_BIT_PGI              0x40000000\n#define GL_TEXCOORD4_BIT_PGI              0x80000000\n#define GL_VERTEX23_BIT_PGI               0x00000004\n#define GL_VERTEX4_BIT_PGI                0x00000008\n#endif /* GL_PGI_vertex_hints */\n\n#ifndef GL_REND_screen_coordinates\n#define GL_REND_screen_coordinates 1\n#define GL_SCREEN_COORDINATES_REND        0x8490\n#define GL_INVERTED_SCREEN_W_REND         0x8491\n#endif /* GL_REND_screen_coordinates */\n\n#ifndef GL_S3_s3tc\n#define GL_S3_s3tc 1\n#define GL_RGB_S3TC                       0x83A0\n#define GL_RGB4_S3TC                      0x83A1\n#define GL_RGBA_S3TC                      0x83A2\n#define GL_RGBA4_S3TC                     0x83A3\n#define GL_RGBA_DXT5_S3TC                 0x83A4\n#define GL_RGBA4_DXT5_S3TC                0x83A5\n#endif /* GL_S3_s3tc */\n\n#ifndef GL_SGIS_detail_texture\n#define GL_SGIS_detail_texture 1\n#define GL_DETAIL_TEXTURE_2D_SGIS         0x8095\n#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096\n#define GL_LINEAR_DETAIL_SGIS             0x8097\n#define GL_LINEAR_DETAIL_ALPHA_SGIS       0x8098\n#define GL_LINEAR_DETAIL_COLOR_SGIS       0x8099\n#define GL_DETAIL_TEXTURE_LEVEL_SGIS      0x809A\n#define GL_DETAIL_TEXTURE_MODE_SGIS       0x809B\n#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C\ntypedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points);\ntypedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points);\nGLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points);\n#endif\n#endif /* GL_SGIS_detail_texture */\n\n#ifndef GL_SGIS_fog_function\n#define GL_SGIS_fog_function 1\n#define GL_FOG_FUNC_SGIS                  0x812A\n#define GL_FOG_FUNC_POINTS_SGIS           0x812B\n#define GL_MAX_FOG_FUNC_POINTS_SGIS       0x812C\ntypedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points);\ntypedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points);\nGLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points);\n#endif\n#endif /* GL_SGIS_fog_function */\n\n#ifndef GL_SGIS_generate_mipmap\n#define GL_SGIS_generate_mipmap 1\n#define GL_GENERATE_MIPMAP_SGIS           0x8191\n#define GL_GENERATE_MIPMAP_HINT_SGIS      0x8192\n#endif /* GL_SGIS_generate_mipmap */\n\n#ifndef GL_SGIS_multisample\n#define GL_SGIS_multisample 1\n#define GL_MULTISAMPLE_SGIS               0x809D\n#define GL_SAMPLE_ALPHA_TO_MASK_SGIS      0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE_SGIS       0x809F\n#define GL_SAMPLE_MASK_SGIS               0x80A0\n#define GL_1PASS_SGIS                     0x80A1\n#define GL_2PASS_0_SGIS                   0x80A2\n#define GL_2PASS_1_SGIS                   0x80A3\n#define GL_4PASS_0_SGIS                   0x80A4\n#define GL_4PASS_1_SGIS                   0x80A5\n#define GL_4PASS_2_SGIS                   0x80A6\n#define GL_4PASS_3_SGIS                   0x80A7\n#define GL_SAMPLE_BUFFERS_SGIS            0x80A8\n#define GL_SAMPLES_SGIS                   0x80A9\n#define GL_SAMPLE_MASK_VALUE_SGIS         0x80AA\n#define GL_SAMPLE_MASK_INVERT_SGIS        0x80AB\n#define GL_SAMPLE_PATTERN_SGIS            0x80AC\ntypedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert);\ntypedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert);\nGLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern);\n#endif\n#endif /* GL_SGIS_multisample */\n\n#ifndef GL_SGIS_pixel_texture\n#define GL_SGIS_pixel_texture 1\n#define GL_PIXEL_TEXTURE_SGIS             0x8353\n#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354\n#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355\n#define GL_PIXEL_GROUP_COLOR_SGIS         0x8356\ntypedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param);\nGLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params);\nGLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params);\n#endif\n#endif /* GL_SGIS_pixel_texture */\n\n#ifndef GL_SGIS_point_line_texgen\n#define GL_SGIS_point_line_texgen 1\n#define GL_EYE_DISTANCE_TO_POINT_SGIS     0x81F0\n#define GL_OBJECT_DISTANCE_TO_POINT_SGIS  0x81F1\n#define GL_EYE_DISTANCE_TO_LINE_SGIS      0x81F2\n#define GL_OBJECT_DISTANCE_TO_LINE_SGIS   0x81F3\n#define GL_EYE_POINT_SGIS                 0x81F4\n#define GL_OBJECT_POINT_SGIS              0x81F5\n#define GL_EYE_LINE_SGIS                  0x81F6\n#define GL_OBJECT_LINE_SGIS               0x81F7\n#endif /* GL_SGIS_point_line_texgen */\n\n#ifndef GL_SGIS_point_parameters\n#define GL_SGIS_point_parameters 1\n#define GL_POINT_SIZE_MIN_SGIS            0x8126\n#define GL_POINT_SIZE_MAX_SGIS            0x8127\n#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128\n#define GL_DISTANCE_ATTENUATION_SGIS      0x8129\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params);\n#endif\n#endif /* GL_SGIS_point_parameters */\n\n#ifndef GL_SGIS_sharpen_texture\n#define GL_SGIS_sharpen_texture 1\n#define GL_LINEAR_SHARPEN_SGIS            0x80AD\n#define GL_LINEAR_SHARPEN_ALPHA_SGIS      0x80AE\n#define GL_LINEAR_SHARPEN_COLOR_SGIS      0x80AF\n#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0\ntypedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points);\ntypedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points);\nGLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points);\n#endif\n#endif /* GL_SGIS_sharpen_texture */\n\n#ifndef GL_SGIS_texture4D\n#define GL_SGIS_texture4D 1\n#define GL_PACK_SKIP_VOLUMES_SGIS         0x8130\n#define GL_PACK_IMAGE_DEPTH_SGIS          0x8131\n#define GL_UNPACK_SKIP_VOLUMES_SGIS       0x8132\n#define GL_UNPACK_IMAGE_DEPTH_SGIS        0x8133\n#define GL_TEXTURE_4D_SGIS                0x8134\n#define GL_PROXY_TEXTURE_4D_SGIS          0x8135\n#define GL_TEXTURE_4DSIZE_SGIS            0x8136\n#define GL_TEXTURE_WRAP_Q_SGIS            0x8137\n#define GL_MAX_4D_TEXTURE_SIZE_SGIS       0x8138\n#define GL_TEXTURE_4D_BINDING_SGIS        0x814F\ntypedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels);\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels);\n#endif\n#endif /* GL_SGIS_texture4D */\n\n#ifndef GL_SGIS_texture_border_clamp\n#define GL_SGIS_texture_border_clamp 1\n#define GL_CLAMP_TO_BORDER_SGIS           0x812D\n#endif /* GL_SGIS_texture_border_clamp */\n\n#ifndef GL_SGIS_texture_color_mask\n#define GL_SGIS_texture_color_mask 1\n#define GL_TEXTURE_COLOR_WRITEMASK_SGIS   0x81EF\ntypedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\n#endif\n#endif /* GL_SGIS_texture_color_mask */\n\n#ifndef GL_SGIS_texture_edge_clamp\n#define GL_SGIS_texture_edge_clamp 1\n#define GL_CLAMP_TO_EDGE_SGIS             0x812F\n#endif /* GL_SGIS_texture_edge_clamp */\n\n#ifndef GL_SGIS_texture_filter4\n#define GL_SGIS_texture_filter4 1\n#define GL_FILTER4_SGIS                   0x8146\n#define GL_TEXTURE_FILTER4_SIZE_SGIS      0x8147\ntypedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights);\ntypedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights);\nGLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights);\n#endif\n#endif /* GL_SGIS_texture_filter4 */\n\n#ifndef GL_SGIS_texture_lod\n#define GL_SGIS_texture_lod 1\n#define GL_TEXTURE_MIN_LOD_SGIS           0x813A\n#define GL_TEXTURE_MAX_LOD_SGIS           0x813B\n#define GL_TEXTURE_BASE_LEVEL_SGIS        0x813C\n#define GL_TEXTURE_MAX_LEVEL_SGIS         0x813D\n#endif /* GL_SGIS_texture_lod */\n\n#ifndef GL_SGIS_texture_select\n#define GL_SGIS_texture_select 1\n#define GL_DUAL_ALPHA4_SGIS               0x8110\n#define GL_DUAL_ALPHA8_SGIS               0x8111\n#define GL_DUAL_ALPHA12_SGIS              0x8112\n#define GL_DUAL_ALPHA16_SGIS              0x8113\n#define GL_DUAL_LUMINANCE4_SGIS           0x8114\n#define GL_DUAL_LUMINANCE8_SGIS           0x8115\n#define GL_DUAL_LUMINANCE12_SGIS          0x8116\n#define GL_DUAL_LUMINANCE16_SGIS          0x8117\n#define GL_DUAL_INTENSITY4_SGIS           0x8118\n#define GL_DUAL_INTENSITY8_SGIS           0x8119\n#define GL_DUAL_INTENSITY12_SGIS          0x811A\n#define GL_DUAL_INTENSITY16_SGIS          0x811B\n#define GL_DUAL_LUMINANCE_ALPHA4_SGIS     0x811C\n#define GL_DUAL_LUMINANCE_ALPHA8_SGIS     0x811D\n#define GL_QUAD_ALPHA4_SGIS               0x811E\n#define GL_QUAD_ALPHA8_SGIS               0x811F\n#define GL_QUAD_LUMINANCE4_SGIS           0x8120\n#define GL_QUAD_LUMINANCE8_SGIS           0x8121\n#define GL_QUAD_INTENSITY4_SGIS           0x8122\n#define GL_QUAD_INTENSITY8_SGIS           0x8123\n#define GL_DUAL_TEXTURE_SELECT_SGIS       0x8124\n#define GL_QUAD_TEXTURE_SELECT_SGIS       0x8125\n#endif /* GL_SGIS_texture_select */\n\n#ifndef GL_SGIX_async\n#define GL_SGIX_async 1\n#define GL_ASYNC_MARKER_SGIX              0x8329\ntypedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker);\ntypedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp);\ntypedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp);\ntypedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range);\ntypedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range);\ntypedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker);\nGLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp);\nGLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp);\nGLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range);\nGLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range);\nGLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker);\n#endif\n#endif /* GL_SGIX_async */\n\n#ifndef GL_SGIX_async_histogram\n#define GL_SGIX_async_histogram 1\n#define GL_ASYNC_HISTOGRAM_SGIX           0x832C\n#define GL_MAX_ASYNC_HISTOGRAM_SGIX       0x832D\n#endif /* GL_SGIX_async_histogram */\n\n#ifndef GL_SGIX_async_pixel\n#define GL_SGIX_async_pixel 1\n#define GL_ASYNC_TEX_IMAGE_SGIX           0x835C\n#define GL_ASYNC_DRAW_PIXELS_SGIX         0x835D\n#define GL_ASYNC_READ_PIXELS_SGIX         0x835E\n#define GL_MAX_ASYNC_TEX_IMAGE_SGIX       0x835F\n#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX     0x8360\n#define GL_MAX_ASYNC_READ_PIXELS_SGIX     0x8361\n#endif /* GL_SGIX_async_pixel */\n\n#ifndef GL_SGIX_blend_alpha_minmax\n#define GL_SGIX_blend_alpha_minmax 1\n#define GL_ALPHA_MIN_SGIX                 0x8320\n#define GL_ALPHA_MAX_SGIX                 0x8321\n#endif /* GL_SGIX_blend_alpha_minmax */\n\n#ifndef GL_SGIX_calligraphic_fragment\n#define GL_SGIX_calligraphic_fragment 1\n#define GL_CALLIGRAPHIC_FRAGMENT_SGIX     0x8183\n#endif /* GL_SGIX_calligraphic_fragment */\n\n#ifndef GL_SGIX_clipmap\n#define GL_SGIX_clipmap 1\n#define GL_LINEAR_CLIPMAP_LINEAR_SGIX     0x8170\n#define GL_TEXTURE_CLIPMAP_CENTER_SGIX    0x8171\n#define GL_TEXTURE_CLIPMAP_FRAME_SGIX     0x8172\n#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX    0x8173\n#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174\n#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175\n#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX     0x8176\n#define GL_MAX_CLIPMAP_DEPTH_SGIX         0x8177\n#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178\n#define GL_NEAREST_CLIPMAP_NEAREST_SGIX   0x844D\n#define GL_NEAREST_CLIPMAP_LINEAR_SGIX    0x844E\n#define GL_LINEAR_CLIPMAP_NEAREST_SGIX    0x844F\n#endif /* GL_SGIX_clipmap */\n\n#ifndef GL_SGIX_convolution_accuracy\n#define GL_SGIX_convolution_accuracy 1\n#define GL_CONVOLUTION_HINT_SGIX          0x8316\n#endif /* GL_SGIX_convolution_accuracy */\n\n#ifndef GL_SGIX_depth_pass_instrument\n#define GL_SGIX_depth_pass_instrument 1\n#endif /* GL_SGIX_depth_pass_instrument */\n\n#ifndef GL_SGIX_depth_texture\n#define GL_SGIX_depth_texture 1\n#define GL_DEPTH_COMPONENT16_SGIX         0x81A5\n#define GL_DEPTH_COMPONENT24_SGIX         0x81A6\n#define GL_DEPTH_COMPONENT32_SGIX         0x81A7\n#endif /* GL_SGIX_depth_texture */\n\n#ifndef GL_SGIX_flush_raster\n#define GL_SGIX_flush_raster 1\ntypedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFlushRasterSGIX (void);\n#endif\n#endif /* GL_SGIX_flush_raster */\n\n#ifndef GL_SGIX_fog_offset\n#define GL_SGIX_fog_offset 1\n#define GL_FOG_OFFSET_SGIX                0x8198\n#define GL_FOG_OFFSET_VALUE_SGIX          0x8199\n#endif /* GL_SGIX_fog_offset */\n\n#ifndef GL_SGIX_fragment_lighting\n#define GL_SGIX_fragment_lighting 1\n#define GL_FRAGMENT_LIGHTING_SGIX         0x8400\n#define GL_FRAGMENT_COLOR_MATERIAL_SGIX   0x8401\n#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402\n#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403\n#define GL_MAX_FRAGMENT_LIGHTS_SGIX       0x8404\n#define GL_MAX_ACTIVE_LIGHTS_SGIX         0x8405\n#define GL_CURRENT_RASTER_NORMAL_SGIX     0x8406\n#define GL_LIGHT_ENV_MODE_SGIX            0x8407\n#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408\n#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409\n#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A\n#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B\n#define GL_FRAGMENT_LIGHT0_SGIX           0x840C\n#define GL_FRAGMENT_LIGHT1_SGIX           0x840D\n#define GL_FRAGMENT_LIGHT2_SGIX           0x840E\n#define GL_FRAGMENT_LIGHT3_SGIX           0x840F\n#define GL_FRAGMENT_LIGHT4_SGIX           0x8410\n#define GL_FRAGMENT_LIGHT5_SGIX           0x8411\n#define GL_FRAGMENT_LIGHT6_SGIX           0x8412\n#define GL_FRAGMENT_LIGHT7_SGIX           0x8413\ntypedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode);\ntypedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode);\nGLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param);\nGLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param);\nGLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params);\nGLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param);\nGLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params);\nGLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param);\n#endif\n#endif /* GL_SGIX_fragment_lighting */\n\n#ifndef GL_SGIX_framezoom\n#define GL_SGIX_framezoom 1\n#define GL_FRAMEZOOM_SGIX                 0x818B\n#define GL_FRAMEZOOM_FACTOR_SGIX          0x818C\n#define GL_MAX_FRAMEZOOM_FACTOR_SGIX      0x818D\ntypedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFrameZoomSGIX (GLint factor);\n#endif\n#endif /* GL_SGIX_framezoom */\n\n#ifndef GL_SGIX_igloo_interface\n#define GL_SGIX_igloo_interface 1\ntypedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params);\n#endif\n#endif /* GL_SGIX_igloo_interface */\n\n#ifndef GL_SGIX_instruments\n#define GL_SGIX_instruments 1\n#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180\n#define GL_INSTRUMENT_MEASUREMENTS_SGIX   0x8181\ntypedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void);\ntypedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer);\ntypedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p);\ntypedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker);\ntypedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void);\ntypedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI GLint APIENTRY glGetInstrumentsSGIX (void);\nGLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer);\nGLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p);\nGLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker);\nGLAPI void APIENTRY glStartInstrumentsSGIX (void);\nGLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker);\n#endif\n#endif /* GL_SGIX_instruments */\n\n#ifndef GL_SGIX_interlace\n#define GL_SGIX_interlace 1\n#define GL_INTERLACE_SGIX                 0x8094\n#endif /* GL_SGIX_interlace */\n\n#ifndef GL_SGIX_ir_instrument1\n#define GL_SGIX_ir_instrument1 1\n#define GL_IR_INSTRUMENT1_SGIX            0x817F\n#endif /* GL_SGIX_ir_instrument1 */\n\n#ifndef GL_SGIX_list_priority\n#define GL_SGIX_list_priority 1\n#define GL_LIST_PRIORITY_SGIX             0x8182\ntypedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params);\nGLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param);\nGLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params);\n#endif\n#endif /* GL_SGIX_list_priority */\n\n#ifndef GL_SGIX_pixel_texture\n#define GL_SGIX_pixel_texture 1\n#define GL_PIXEL_TEX_GEN_SGIX             0x8139\n#define GL_PIXEL_TEX_GEN_MODE_SGIX        0x832B\ntypedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode);\n#endif\n#endif /* GL_SGIX_pixel_texture */\n\n#ifndef GL_SGIX_pixel_tiles\n#define GL_SGIX_pixel_tiles 1\n#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E\n#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F\n#define GL_PIXEL_TILE_WIDTH_SGIX          0x8140\n#define GL_PIXEL_TILE_HEIGHT_SGIX         0x8141\n#define GL_PIXEL_TILE_GRID_WIDTH_SGIX     0x8142\n#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX    0x8143\n#define GL_PIXEL_TILE_GRID_DEPTH_SGIX     0x8144\n#define GL_PIXEL_TILE_CACHE_SIZE_SGIX     0x8145\n#endif /* GL_SGIX_pixel_tiles */\n\n#ifndef GL_SGIX_polynomial_ffd\n#define GL_SGIX_polynomial_ffd 1\n#define GL_TEXTURE_DEFORMATION_BIT_SGIX   0x00000001\n#define GL_GEOMETRY_DEFORMATION_BIT_SGIX  0x00000002\n#define GL_GEOMETRY_DEFORMATION_SGIX      0x8194\n#define GL_TEXTURE_DEFORMATION_SGIX       0x8195\n#define GL_DEFORMATIONS_MASK_SGIX         0x8196\n#define GL_MAX_DEFORMATION_ORDER_SGIX     0x8197\ntypedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points);\ntypedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points);\ntypedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask);\ntypedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points);\nGLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points);\nGLAPI void APIENTRY glDeformSGIX (GLbitfield mask);\nGLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask);\n#endif\n#endif /* GL_SGIX_polynomial_ffd */\n\n#ifndef GL_SGIX_reference_plane\n#define GL_SGIX_reference_plane 1\n#define GL_REFERENCE_PLANE_SGIX           0x817D\n#define GL_REFERENCE_PLANE_EQUATION_SGIX  0x817E\ntypedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation);\n#endif\n#endif /* GL_SGIX_reference_plane */\n\n#ifndef GL_SGIX_resample\n#define GL_SGIX_resample 1\n#define GL_PACK_RESAMPLE_SGIX             0x842C\n#define GL_UNPACK_RESAMPLE_SGIX           0x842D\n#define GL_RESAMPLE_REPLICATE_SGIX        0x842E\n#define GL_RESAMPLE_ZERO_FILL_SGIX        0x842F\n#define GL_RESAMPLE_DECIMATE_SGIX         0x8430\n#endif /* GL_SGIX_resample */\n\n#ifndef GL_SGIX_scalebias_hint\n#define GL_SGIX_scalebias_hint 1\n#define GL_SCALEBIAS_HINT_SGIX            0x8322\n#endif /* GL_SGIX_scalebias_hint */\n\n#ifndef GL_SGIX_shadow\n#define GL_SGIX_shadow 1\n#define GL_TEXTURE_COMPARE_SGIX           0x819A\n#define GL_TEXTURE_COMPARE_OPERATOR_SGIX  0x819B\n#define GL_TEXTURE_LEQUAL_R_SGIX          0x819C\n#define GL_TEXTURE_GEQUAL_R_SGIX          0x819D\n#endif /* GL_SGIX_shadow */\n\n#ifndef GL_SGIX_shadow_ambient\n#define GL_SGIX_shadow_ambient 1\n#define GL_SHADOW_AMBIENT_SGIX            0x80BF\n#endif /* GL_SGIX_shadow_ambient */\n\n#ifndef GL_SGIX_sprite\n#define GL_SGIX_sprite 1\n#define GL_SPRITE_SGIX                    0x8148\n#define GL_SPRITE_MODE_SGIX               0x8149\n#define GL_SPRITE_AXIS_SGIX               0x814A\n#define GL_SPRITE_TRANSLATION_SGIX        0x814B\n#define GL_SPRITE_AXIAL_SGIX              0x814C\n#define GL_SPRITE_OBJECT_ALIGNED_SGIX     0x814D\n#define GL_SPRITE_EYE_ALIGNED_SGIX        0x814E\ntypedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param);\nGLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params);\n#endif\n#endif /* GL_SGIX_sprite */\n\n#ifndef GL_SGIX_subsample\n#define GL_SGIX_subsample 1\n#define GL_PACK_SUBSAMPLE_RATE_SGIX       0x85A0\n#define GL_UNPACK_SUBSAMPLE_RATE_SGIX     0x85A1\n#define GL_PIXEL_SUBSAMPLE_4444_SGIX      0x85A2\n#define GL_PIXEL_SUBSAMPLE_2424_SGIX      0x85A3\n#define GL_PIXEL_SUBSAMPLE_4242_SGIX      0x85A4\n#endif /* GL_SGIX_subsample */\n\n#ifndef GL_SGIX_tag_sample_buffer\n#define GL_SGIX_tag_sample_buffer 1\ntypedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glTagSampleBufferSGIX (void);\n#endif\n#endif /* GL_SGIX_tag_sample_buffer */\n\n#ifndef GL_SGIX_texture_add_env\n#define GL_SGIX_texture_add_env 1\n#define GL_TEXTURE_ENV_BIAS_SGIX          0x80BE\n#endif /* GL_SGIX_texture_add_env */\n\n#ifndef GL_SGIX_texture_coordinate_clamp\n#define GL_SGIX_texture_coordinate_clamp 1\n#define GL_TEXTURE_MAX_CLAMP_S_SGIX       0x8369\n#define GL_TEXTURE_MAX_CLAMP_T_SGIX       0x836A\n#define GL_TEXTURE_MAX_CLAMP_R_SGIX       0x836B\n#endif /* GL_SGIX_texture_coordinate_clamp */\n\n#ifndef GL_SGIX_texture_lod_bias\n#define GL_SGIX_texture_lod_bias 1\n#define GL_TEXTURE_LOD_BIAS_S_SGIX        0x818E\n#define GL_TEXTURE_LOD_BIAS_T_SGIX        0x818F\n#define GL_TEXTURE_LOD_BIAS_R_SGIX        0x8190\n#endif /* GL_SGIX_texture_lod_bias */\n\n#ifndef GL_SGIX_texture_multi_buffer\n#define GL_SGIX_texture_multi_buffer 1\n#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E\n#endif /* GL_SGIX_texture_multi_buffer */\n\n#ifndef GL_SGIX_texture_scale_bias\n#define GL_SGIX_texture_scale_bias 1\n#define GL_POST_TEXTURE_FILTER_BIAS_SGIX  0x8179\n#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A\n#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B\n#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C\n#endif /* GL_SGIX_texture_scale_bias */\n\n#ifndef GL_SGIX_vertex_preclip\n#define GL_SGIX_vertex_preclip 1\n#define GL_VERTEX_PRECLIP_SGIX            0x83EE\n#define GL_VERTEX_PRECLIP_HINT_SGIX       0x83EF\n#endif /* GL_SGIX_vertex_preclip */\n\n#ifndef GL_SGIX_ycrcb\n#define GL_SGIX_ycrcb 1\n#define GL_YCRCB_422_SGIX                 0x81BB\n#define GL_YCRCB_444_SGIX                 0x81BC\n#endif /* GL_SGIX_ycrcb */\n\n#ifndef GL_SGIX_ycrcb_subsample\n#define GL_SGIX_ycrcb_subsample 1\n#endif /* GL_SGIX_ycrcb_subsample */\n\n#ifndef GL_SGIX_ycrcba\n#define GL_SGIX_ycrcba 1\n#define GL_YCRCB_SGIX                     0x8318\n#define GL_YCRCBA_SGIX                    0x8319\n#endif /* GL_SGIX_ycrcba */\n\n#ifndef GL_SGI_color_matrix\n#define GL_SGI_color_matrix 1\n#define GL_COLOR_MATRIX_SGI               0x80B1\n#define GL_COLOR_MATRIX_STACK_DEPTH_SGI   0x80B2\n#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3\n#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4\n#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5\n#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6\n#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7\n#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8\n#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9\n#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA\n#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB\n#endif /* GL_SGI_color_matrix */\n\n#ifndef GL_SGI_color_table\n#define GL_SGI_color_table 1\n#define GL_COLOR_TABLE_SGI                0x80D0\n#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1\n#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2\n#define GL_PROXY_COLOR_TABLE_SGI          0x80D3\n#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4\n#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5\n#define GL_COLOR_TABLE_SCALE_SGI          0x80D6\n#define GL_COLOR_TABLE_BIAS_SGI           0x80D7\n#define GL_COLOR_TABLE_FORMAT_SGI         0x80D8\n#define GL_COLOR_TABLE_WIDTH_SGI          0x80D9\n#define GL_COLOR_TABLE_RED_SIZE_SGI       0x80DA\n#define GL_COLOR_TABLE_GREEN_SIZE_SGI     0x80DB\n#define GL_COLOR_TABLE_BLUE_SIZE_SGI      0x80DC\n#define GL_COLOR_TABLE_ALPHA_SIZE_SGI     0x80DD\n#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE\n#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF\ntypedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);\ntypedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\ntypedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table);\ntypedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);\nGLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table);\nGLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params);\n#endif\n#endif /* GL_SGI_color_table */\n\n#ifndef GL_SGI_texture_color_table\n#define GL_SGI_texture_color_table 1\n#define GL_TEXTURE_COLOR_TABLE_SGI        0x80BC\n#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI  0x80BD\n#endif /* GL_SGI_texture_color_table */\n\n#ifndef GL_SUNX_constant_data\n#define GL_SUNX_constant_data 1\n#define GL_UNPACK_CONSTANT_DATA_SUNX      0x81D5\n#define GL_TEXTURE_CONSTANT_DATA_SUNX     0x81D6\ntypedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glFinishTextureSUNX (void);\n#endif\n#endif /* GL_SUNX_constant_data */\n\n#ifndef GL_SUN_convolution_border_modes\n#define GL_SUN_convolution_border_modes 1\n#define GL_WRAP_BORDER_SUN                0x81D4\n#endif /* GL_SUN_convolution_border_modes */\n\n#ifndef GL_SUN_global_alpha\n#define GL_SUN_global_alpha 1\n#define GL_GLOBAL_ALPHA_SUN               0x81D9\n#define GL_GLOBAL_ALPHA_FACTOR_SUN        0x81DA\ntypedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor);\ntypedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor);\ntypedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor);\ntypedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor);\ntypedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor);\ntypedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor);\ntypedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor);\ntypedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor);\nGLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor);\nGLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor);\nGLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor);\nGLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor);\nGLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor);\nGLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor);\nGLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor);\n#endif\n#endif /* GL_SUN_global_alpha */\n\n#ifndef GL_SUN_mesh_array\n#define GL_SUN_mesh_array 1\n#define GL_QUAD_MESH_SUN                  0x8614\n#define GL_TRIANGLE_MESH_SUN              0x8615\ntypedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width);\n#endif\n#endif /* GL_SUN_mesh_array */\n\n#ifndef GL_SUN_slice_accum\n#define GL_SUN_slice_accum 1\n#define GL_SLICE_ACCUM_SUN                0x85CC\n#endif /* GL_SUN_slice_accum */\n\n#ifndef GL_SUN_triangle_list\n#define GL_SUN_triangle_list 1\n#define GL_RESTART_SUN                    0x0001\n#define GL_REPLACE_MIDDLE_SUN             0x0002\n#define GL_REPLACE_OLDEST_SUN             0x0003\n#define GL_TRIANGLE_LIST_SUN              0x81D7\n#define GL_REPLACEMENT_CODE_SUN           0x81D8\n#define GL_REPLACEMENT_CODE_ARRAY_SUN     0x85C0\n#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1\n#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2\n#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3\n#define GL_R1UI_V3F_SUN                   0x85C4\n#define GL_R1UI_C4UB_V3F_SUN              0x85C5\n#define GL_R1UI_C3F_V3F_SUN               0x85C6\n#define GL_R1UI_N3F_V3F_SUN               0x85C7\n#define GL_R1UI_C4F_N3F_V3F_SUN           0x85C8\n#define GL_R1UI_T2F_V3F_SUN               0x85C9\n#define GL_R1UI_T2F_N3F_V3F_SUN           0x85CA\n#define GL_R1UI_T2F_C4F_N3F_V3F_SUN       0x85CB\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code);\nGLAPI void APIENTRY glReplacementCodeusSUN (GLushort code);\nGLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code);\nGLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code);\nGLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code);\nGLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code);\nGLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer);\n#endif\n#endif /* GL_SUN_triangle_list */\n\n#ifndef GL_SUN_vertex\n#define GL_SUN_vertex 1\ntypedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);\ntypedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\n#ifdef GL_GLEXT_PROTOTYPES\nGLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);\nGLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v);\nGLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v);\nGLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v);\nGLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v);\nGLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v);\nGLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v);\nGLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v);\nGLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v);\nGLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v);\nGLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v);\nGLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\nGLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\nGLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v);\nGLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v);\nGLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v);\nGLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v);\nGLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\nGLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v);\nGLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v);\nGLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\n#endif\n#endif /* GL_SUN_vertex */\n\n#ifndef GL_WIN_phong_shading\n#define GL_WIN_phong_shading 1\n#define GL_PHONG_WIN                      0x80EA\n#define GL_PHONG_HINT_WIN                 0x80EB\n#endif /* GL_WIN_phong_shading */\n\n#ifndef GL_WIN_specular_fog\n#define GL_WIN_specular_fog 1\n#define GL_FOG_SPECULAR_TEXTURE_WIN       0x80EC\n#endif /* GL_WIN_specular_fog */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/SDL2/include/SDL_opengles.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_opengles.h\n *\n *  This is a simple file to encapsulate the OpenGL ES 1.X API headers.\n */\n#include \"SDL_config.h\"\n\n#ifdef __IPHONEOS__\n#include <OpenGLES/ES1/gl.h>\n#include <OpenGLES/ES1/glext.h>\n#else\n#include <GLES/gl.h>\n#include <GLES/glext.h>\n#endif\n\n#ifndef APIENTRY\n#define APIENTRY\n#endif\n"
  },
  {
    "path": "libs/SDL2/include/SDL_opengles2.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_opengles2.h\n *\n *  This is a simple file to encapsulate the OpenGL ES 2.0 API headers.\n */\n#include \"SDL_config.h\"\n\n#ifndef _MSC_VER\n\n#ifdef __IPHONEOS__\n#include <OpenGLES/ES2/gl.h>\n#include <OpenGLES/ES2/glext.h>\n#else\n#include <GLES2/gl2platform.h>\n#include <GLES2/gl2.h>\n#include <GLES2/gl2ext.h>\n#endif\n\n#else /* _MSC_VER */\n\n/* OpenGL ES2 headers for Visual Studio */\n#include \"SDL_opengles2_khrplatform.h\"\n#include \"SDL_opengles2_gl2platform.h\"\n#include \"SDL_opengles2_gl2.h\"\n#include \"SDL_opengles2_gl2ext.h\"\n\n#endif /* _MSC_VER */\n\n#ifndef APIENTRY\n#define APIENTRY GL_APIENTRY\n#endif\n"
  },
  {
    "path": "libs/SDL2/include/SDL_opengles2_gl2.h",
    "content": "#ifndef __gl2_h_\n#define __gl2_h_\n\n/* $Revision: 20555 $ on $Date:: 2013-02-12 14:32:47 -0800 #$ */\n\n/*#include <GLES2/gl2platform.h>*/\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * This document is licensed under the SGI Free Software B License Version\n * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .\n */\n\n/*-------------------------------------------------------------------------\n * Data type definitions\n *-----------------------------------------------------------------------*/\n\ntypedef void             GLvoid;\ntypedef char             GLchar;\ntypedef unsigned int     GLenum;\ntypedef unsigned char    GLboolean;\ntypedef unsigned int     GLbitfield;\ntypedef khronos_int8_t   GLbyte;\ntypedef short            GLshort;\ntypedef int              GLint;\ntypedef int              GLsizei;\ntypedef khronos_uint8_t  GLubyte;\ntypedef unsigned short   GLushort;\ntypedef unsigned int     GLuint;\ntypedef khronos_float_t  GLfloat;\ntypedef khronos_float_t  GLclampf;\ntypedef khronos_int32_t  GLfixed;\n\n/* GL types for handling large vertex buffer objects */\ntypedef khronos_intptr_t GLintptr;\ntypedef khronos_ssize_t  GLsizeiptr;\n\n/* OpenGL ES core versions */\n#define GL_ES_VERSION_2_0                 1\n\n/* ClearBufferMask */\n#define GL_DEPTH_BUFFER_BIT               0x00000100\n#define GL_STENCIL_BUFFER_BIT             0x00000400\n#define GL_COLOR_BUFFER_BIT               0x00004000\n\n/* Boolean */\n#define GL_FALSE                          0\n#define GL_TRUE                           1\n\n/* BeginMode */\n#define GL_POINTS                         0x0000\n#define GL_LINES                          0x0001\n#define GL_LINE_LOOP                      0x0002\n#define GL_LINE_STRIP                     0x0003\n#define GL_TRIANGLES                      0x0004\n#define GL_TRIANGLE_STRIP                 0x0005\n#define GL_TRIANGLE_FAN                   0x0006\n\n/* AlphaFunction (not supported in ES20) */\n/*      GL_NEVER */\n/*      GL_LESS */\n/*      GL_EQUAL */\n/*      GL_LEQUAL */\n/*      GL_GREATER */\n/*      GL_NOTEQUAL */\n/*      GL_GEQUAL */\n/*      GL_ALWAYS */\n\n/* BlendingFactorDest */\n#define GL_ZERO                           0\n#define GL_ONE                            1\n#define GL_SRC_COLOR                      0x0300\n#define GL_ONE_MINUS_SRC_COLOR            0x0301\n#define GL_SRC_ALPHA                      0x0302\n#define GL_ONE_MINUS_SRC_ALPHA            0x0303\n#define GL_DST_ALPHA                      0x0304\n#define GL_ONE_MINUS_DST_ALPHA            0x0305\n\n/* BlendingFactorSrc */\n/*      GL_ZERO */\n/*      GL_ONE */\n#define GL_DST_COLOR                      0x0306\n#define GL_ONE_MINUS_DST_COLOR            0x0307\n#define GL_SRC_ALPHA_SATURATE             0x0308\n/*      GL_SRC_ALPHA */\n/*      GL_ONE_MINUS_SRC_ALPHA */\n/*      GL_DST_ALPHA */\n/*      GL_ONE_MINUS_DST_ALPHA */\n\n/* BlendEquationSeparate */\n#define GL_FUNC_ADD                       0x8006\n#define GL_BLEND_EQUATION                 0x8009\n#define GL_BLEND_EQUATION_RGB             0x8009    /* same as BLEND_EQUATION */\n#define GL_BLEND_EQUATION_ALPHA           0x883D\n\n/* BlendSubtract */\n#define GL_FUNC_SUBTRACT                  0x800A\n#define GL_FUNC_REVERSE_SUBTRACT          0x800B\n\n/* Separate Blend Functions */\n#define GL_BLEND_DST_RGB                  0x80C8\n#define GL_BLEND_SRC_RGB                  0x80C9\n#define GL_BLEND_DST_ALPHA                0x80CA\n#define GL_BLEND_SRC_ALPHA                0x80CB\n#define GL_CONSTANT_COLOR                 0x8001\n#define GL_ONE_MINUS_CONSTANT_COLOR       0x8002\n#define GL_CONSTANT_ALPHA                 0x8003\n#define GL_ONE_MINUS_CONSTANT_ALPHA       0x8004\n#define GL_BLEND_COLOR                    0x8005\n\n/* Buffer Objects */\n#define GL_ARRAY_BUFFER                   0x8892\n#define GL_ELEMENT_ARRAY_BUFFER           0x8893\n#define GL_ARRAY_BUFFER_BINDING           0x8894\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895\n\n#define GL_STREAM_DRAW                    0x88E0\n#define GL_STATIC_DRAW                    0x88E4\n#define GL_DYNAMIC_DRAW                   0x88E8\n\n#define GL_BUFFER_SIZE                    0x8764\n#define GL_BUFFER_USAGE                   0x8765\n\n#define GL_CURRENT_VERTEX_ATTRIB          0x8626\n\n/* CullFaceMode */\n#define GL_FRONT                          0x0404\n#define GL_BACK                           0x0405\n#define GL_FRONT_AND_BACK                 0x0408\n\n/* DepthFunction */\n/*      GL_NEVER */\n/*      GL_LESS */\n/*      GL_EQUAL */\n/*      GL_LEQUAL */\n/*      GL_GREATER */\n/*      GL_NOTEQUAL */\n/*      GL_GEQUAL */\n/*      GL_ALWAYS */\n\n/* EnableCap */\n#define GL_TEXTURE_2D                     0x0DE1\n#define GL_CULL_FACE                      0x0B44\n#define GL_BLEND                          0x0BE2\n#define GL_DITHER                         0x0BD0\n#define GL_STENCIL_TEST                   0x0B90\n#define GL_DEPTH_TEST                     0x0B71\n#define GL_SCISSOR_TEST                   0x0C11\n#define GL_POLYGON_OFFSET_FILL            0x8037\n#define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E\n#define GL_SAMPLE_COVERAGE                0x80A0\n\n/* ErrorCode */\n#define GL_NO_ERROR                       0\n#define GL_INVALID_ENUM                   0x0500\n#define GL_INVALID_VALUE                  0x0501\n#define GL_INVALID_OPERATION              0x0502\n#define GL_OUT_OF_MEMORY                  0x0505\n\n/* FrontFaceDirection */\n#define GL_CW                             0x0900\n#define GL_CCW                            0x0901\n\n/* GetPName */\n#define GL_LINE_WIDTH                     0x0B21\n#define GL_ALIASED_POINT_SIZE_RANGE       0x846D\n#define GL_ALIASED_LINE_WIDTH_RANGE       0x846E\n#define GL_CULL_FACE_MODE                 0x0B45\n#define GL_FRONT_FACE                     0x0B46\n#define GL_DEPTH_RANGE                    0x0B70\n#define GL_DEPTH_WRITEMASK                0x0B72\n#define GL_DEPTH_CLEAR_VALUE              0x0B73\n#define GL_DEPTH_FUNC                     0x0B74\n#define GL_STENCIL_CLEAR_VALUE            0x0B91\n#define GL_STENCIL_FUNC                   0x0B92\n#define GL_STENCIL_FAIL                   0x0B94\n#define GL_STENCIL_PASS_DEPTH_FAIL        0x0B95\n#define GL_STENCIL_PASS_DEPTH_PASS        0x0B96\n#define GL_STENCIL_REF                    0x0B97\n#define GL_STENCIL_VALUE_MASK             0x0B93\n#define GL_STENCIL_WRITEMASK              0x0B98\n#define GL_STENCIL_BACK_FUNC              0x8800\n#define GL_STENCIL_BACK_FAIL              0x8801\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL   0x8802\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS   0x8803\n#define GL_STENCIL_BACK_REF               0x8CA3\n#define GL_STENCIL_BACK_VALUE_MASK        0x8CA4\n#define GL_STENCIL_BACK_WRITEMASK         0x8CA5\n#define GL_VIEWPORT                       0x0BA2\n#define GL_SCISSOR_BOX                    0x0C10\n/*      GL_SCISSOR_TEST */\n#define GL_COLOR_CLEAR_VALUE              0x0C22\n#define GL_COLOR_WRITEMASK                0x0C23\n#define GL_UNPACK_ALIGNMENT               0x0CF5\n#define GL_PACK_ALIGNMENT                 0x0D05\n#define GL_MAX_TEXTURE_SIZE               0x0D33\n#define GL_MAX_VIEWPORT_DIMS              0x0D3A\n#define GL_SUBPIXEL_BITS                  0x0D50\n#define GL_RED_BITS                       0x0D52\n#define GL_GREEN_BITS                     0x0D53\n#define GL_BLUE_BITS                      0x0D54\n#define GL_ALPHA_BITS                     0x0D55\n#define GL_DEPTH_BITS                     0x0D56\n#define GL_STENCIL_BITS                   0x0D57\n#define GL_POLYGON_OFFSET_UNITS           0x2A00\n/*      GL_POLYGON_OFFSET_FILL */\n#define GL_POLYGON_OFFSET_FACTOR          0x8038\n#define GL_TEXTURE_BINDING_2D             0x8069\n#define GL_SAMPLE_BUFFERS                 0x80A8\n#define GL_SAMPLES                        0x80A9\n#define GL_SAMPLE_COVERAGE_VALUE          0x80AA\n#define GL_SAMPLE_COVERAGE_INVERT         0x80AB\n\n/* GetTextureParameter */\n/*      GL_TEXTURE_MAG_FILTER */\n/*      GL_TEXTURE_MIN_FILTER */\n/*      GL_TEXTURE_WRAP_S */\n/*      GL_TEXTURE_WRAP_T */\n\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2\n#define GL_COMPRESSED_TEXTURE_FORMATS     0x86A3\n\n/* HintMode */\n#define GL_DONT_CARE                      0x1100\n#define GL_FASTEST                        0x1101\n#define GL_NICEST                         0x1102\n\n/* HintTarget */\n#define GL_GENERATE_MIPMAP_HINT            0x8192\n\n/* DataType */\n#define GL_BYTE                           0x1400\n#define GL_UNSIGNED_BYTE                  0x1401\n#define GL_SHORT                          0x1402\n#define GL_UNSIGNED_SHORT                 0x1403\n#define GL_INT                            0x1404\n#define GL_UNSIGNED_INT                   0x1405\n#define GL_FLOAT                          0x1406\n#define GL_FIXED                          0x140C\n\n/* PixelFormat */\n#define GL_DEPTH_COMPONENT                0x1902\n#define GL_ALPHA                          0x1906\n#define GL_RGB                            0x1907\n#define GL_RGBA                           0x1908\n#define GL_LUMINANCE                      0x1909\n#define GL_LUMINANCE_ALPHA                0x190A\n\n/* PixelType */\n/*      GL_UNSIGNED_BYTE */\n#define GL_UNSIGNED_SHORT_4_4_4_4         0x8033\n#define GL_UNSIGNED_SHORT_5_5_5_1         0x8034\n#define GL_UNSIGNED_SHORT_5_6_5           0x8363\n\n/* Shaders */\n#define GL_FRAGMENT_SHADER                  0x8B30\n#define GL_VERTEX_SHADER                    0x8B31\n#define GL_MAX_VERTEX_ATTRIBS               0x8869\n#define GL_MAX_VERTEX_UNIFORM_VECTORS       0x8DFB\n#define GL_MAX_VARYING_VECTORS              0x8DFC\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS   0x8B4C\n#define GL_MAX_TEXTURE_IMAGE_UNITS          0x8872\n#define GL_MAX_FRAGMENT_UNIFORM_VECTORS     0x8DFD\n#define GL_SHADER_TYPE                      0x8B4F\n#define GL_DELETE_STATUS                    0x8B80\n#define GL_LINK_STATUS                      0x8B82\n#define GL_VALIDATE_STATUS                  0x8B83\n#define GL_ATTACHED_SHADERS                 0x8B85\n#define GL_ACTIVE_UNIFORMS                  0x8B86\n#define GL_ACTIVE_UNIFORM_MAX_LENGTH        0x8B87\n#define GL_ACTIVE_ATTRIBUTES                0x8B89\n#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH      0x8B8A\n#define GL_SHADING_LANGUAGE_VERSION         0x8B8C\n#define GL_CURRENT_PROGRAM                  0x8B8D\n\n/* StencilFunction */\n#define GL_NEVER                          0x0200\n#define GL_LESS                           0x0201\n#define GL_EQUAL                          0x0202\n#define GL_LEQUAL                         0x0203\n#define GL_GREATER                        0x0204\n#define GL_NOTEQUAL                       0x0205\n#define GL_GEQUAL                         0x0206\n#define GL_ALWAYS                         0x0207\n\n/* StencilOp */\n/*      GL_ZERO */\n#define GL_KEEP                           0x1E00\n#define GL_REPLACE                        0x1E01\n#define GL_INCR                           0x1E02\n#define GL_DECR                           0x1E03\n#define GL_INVERT                         0x150A\n#define GL_INCR_WRAP                      0x8507\n#define GL_DECR_WRAP                      0x8508\n\n/* StringName */\n#define GL_VENDOR                         0x1F00\n#define GL_RENDERER                       0x1F01\n#define GL_VERSION                        0x1F02\n#define GL_EXTENSIONS                     0x1F03\n\n/* TextureMagFilter */\n#define GL_NEAREST                        0x2600\n#define GL_LINEAR                         0x2601\n\n/* TextureMinFilter */\n/*      GL_NEAREST */\n/*      GL_LINEAR */\n#define GL_NEAREST_MIPMAP_NEAREST         0x2700\n#define GL_LINEAR_MIPMAP_NEAREST          0x2701\n#define GL_NEAREST_MIPMAP_LINEAR          0x2702\n#define GL_LINEAR_MIPMAP_LINEAR           0x2703\n\n/* TextureParameterName */\n#define GL_TEXTURE_MAG_FILTER             0x2800\n#define GL_TEXTURE_MIN_FILTER             0x2801\n#define GL_TEXTURE_WRAP_S                 0x2802\n#define GL_TEXTURE_WRAP_T                 0x2803\n\n/* TextureTarget */\n/*      GL_TEXTURE_2D */\n#define GL_TEXTURE                        0x1702\n\n#define GL_TEXTURE_CUBE_MAP               0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP       0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X    0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X    0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y    0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y    0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z    0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z    0x851A\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE      0x851C\n\n/* TextureUnit */\n#define GL_TEXTURE0                       0x84C0\n#define GL_TEXTURE1                       0x84C1\n#define GL_TEXTURE2                       0x84C2\n#define GL_TEXTURE3                       0x84C3\n#define GL_TEXTURE4                       0x84C4\n#define GL_TEXTURE5                       0x84C5\n#define GL_TEXTURE6                       0x84C6\n#define GL_TEXTURE7                       0x84C7\n#define GL_TEXTURE8                       0x84C8\n#define GL_TEXTURE9                       0x84C9\n#define GL_TEXTURE10                      0x84CA\n#define GL_TEXTURE11                      0x84CB\n#define GL_TEXTURE12                      0x84CC\n#define GL_TEXTURE13                      0x84CD\n#define GL_TEXTURE14                      0x84CE\n#define GL_TEXTURE15                      0x84CF\n#define GL_TEXTURE16                      0x84D0\n#define GL_TEXTURE17                      0x84D1\n#define GL_TEXTURE18                      0x84D2\n#define GL_TEXTURE19                      0x84D3\n#define GL_TEXTURE20                      0x84D4\n#define GL_TEXTURE21                      0x84D5\n#define GL_TEXTURE22                      0x84D6\n#define GL_TEXTURE23                      0x84D7\n#define GL_TEXTURE24                      0x84D8\n#define GL_TEXTURE25                      0x84D9\n#define GL_TEXTURE26                      0x84DA\n#define GL_TEXTURE27                      0x84DB\n#define GL_TEXTURE28                      0x84DC\n#define GL_TEXTURE29                      0x84DD\n#define GL_TEXTURE30                      0x84DE\n#define GL_TEXTURE31                      0x84DF\n#define GL_ACTIVE_TEXTURE                 0x84E0\n\n/* TextureWrapMode */\n#define GL_REPEAT                         0x2901\n#define GL_CLAMP_TO_EDGE                  0x812F\n#define GL_MIRRORED_REPEAT                0x8370\n\n/* Uniform Types */\n#define GL_FLOAT_VEC2                     0x8B50\n#define GL_FLOAT_VEC3                     0x8B51\n#define GL_FLOAT_VEC4                     0x8B52\n#define GL_INT_VEC2                       0x8B53\n#define GL_INT_VEC3                       0x8B54\n#define GL_INT_VEC4                       0x8B55\n#define GL_BOOL                           0x8B56\n#define GL_BOOL_VEC2                      0x8B57\n#define GL_BOOL_VEC3                      0x8B58\n#define GL_BOOL_VEC4                      0x8B59\n#define GL_FLOAT_MAT2                     0x8B5A\n#define GL_FLOAT_MAT3                     0x8B5B\n#define GL_FLOAT_MAT4                     0x8B5C\n#define GL_SAMPLER_2D                     0x8B5E\n#define GL_SAMPLER_CUBE                   0x8B60\n\n/* Vertex Arrays */\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED        0x8622\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE           0x8623\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE         0x8624\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE           0x8625\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED     0x886A\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER        0x8645\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\n\n/* Read Format */\n#define GL_IMPLEMENTATION_COLOR_READ_TYPE   0x8B9A\n#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B\n\n/* Shader Source */\n#define GL_COMPILE_STATUS                 0x8B81\n#define GL_INFO_LOG_LENGTH                0x8B84\n#define GL_SHADER_SOURCE_LENGTH           0x8B88\n#define GL_SHADER_COMPILER                0x8DFA\n\n/* Shader Binary */\n#define GL_SHADER_BINARY_FORMATS          0x8DF8\n#define GL_NUM_SHADER_BINARY_FORMATS      0x8DF9\n\n/* Shader Precision-Specified Types */\n#define GL_LOW_FLOAT                      0x8DF0\n#define GL_MEDIUM_FLOAT                   0x8DF1\n#define GL_HIGH_FLOAT                     0x8DF2\n#define GL_LOW_INT                        0x8DF3\n#define GL_MEDIUM_INT                     0x8DF4\n#define GL_HIGH_INT                       0x8DF5\n\n/* Framebuffer Object. */\n#define GL_FRAMEBUFFER                    0x8D40\n#define GL_RENDERBUFFER                   0x8D41\n\n#define GL_RGBA4                          0x8056\n#define GL_RGB5_A1                        0x8057\n#define GL_RGB565                         0x8D62\n#define GL_DEPTH_COMPONENT16              0x81A5\n#define GL_STENCIL_INDEX8                 0x8D48\n\n#define GL_RENDERBUFFER_WIDTH             0x8D42\n#define GL_RENDERBUFFER_HEIGHT            0x8D43\n#define GL_RENDERBUFFER_INTERNAL_FORMAT   0x8D44\n#define GL_RENDERBUFFER_RED_SIZE          0x8D50\n#define GL_RENDERBUFFER_GREEN_SIZE        0x8D51\n#define GL_RENDERBUFFER_BLUE_SIZE         0x8D52\n#define GL_RENDERBUFFER_ALPHA_SIZE        0x8D53\n#define GL_RENDERBUFFER_DEPTH_SIZE        0x8D54\n#define GL_RENDERBUFFER_STENCIL_SIZE      0x8D55\n\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE           0x8CD0\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME           0x8CD1\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL         0x8CD2\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3\n\n#define GL_COLOR_ATTACHMENT0              0x8CE0\n#define GL_DEPTH_ATTACHMENT               0x8D00\n#define GL_STENCIL_ATTACHMENT             0x8D20\n\n#define GL_NONE                           0\n\n#define GL_FRAMEBUFFER_COMPLETE                      0x8CD5\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT         0x8CD6\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7\n#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS         0x8CD9\n#define GL_FRAMEBUFFER_UNSUPPORTED                   0x8CDD\n\n#define GL_FRAMEBUFFER_BINDING            0x8CA6\n#define GL_RENDERBUFFER_BINDING           0x8CA7\n#define GL_MAX_RENDERBUFFER_SIZE          0x84E8\n\n#define GL_INVALID_FRAMEBUFFER_OPERATION  0x0506\n\n/*-------------------------------------------------------------------------\n * GL core functions.\n *-----------------------------------------------------------------------*/\n\nGL_APICALL void         GL_APIENTRY glActiveTexture (GLenum texture);\nGL_APICALL void         GL_APIENTRY glAttachShader (GLuint program, GLuint shader);\nGL_APICALL void         GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar* name);\nGL_APICALL void         GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);\nGL_APICALL void         GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);\nGL_APICALL void         GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);\nGL_APICALL void         GL_APIENTRY glBindTexture (GLenum target, GLuint texture);\nGL_APICALL void         GL_APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\nGL_APICALL void         GL_APIENTRY glBlendEquation ( GLenum mode );\nGL_APICALL void         GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);\nGL_APICALL void         GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);\nGL_APICALL void         GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\nGL_APICALL void         GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);\nGL_APICALL void         GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);\nGL_APICALL GLenum       GL_APIENTRY glCheckFramebufferStatus (GLenum target);\nGL_APICALL void         GL_APIENTRY glClear (GLbitfield mask);\nGL_APICALL void         GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\nGL_APICALL void         GL_APIENTRY glClearDepthf (GLclampf depth);\nGL_APICALL void         GL_APIENTRY glClearStencil (GLint s);\nGL_APICALL void         GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\nGL_APICALL void         GL_APIENTRY glCompileShader (GLuint shader);\nGL_APICALL void         GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data);\nGL_APICALL void         GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data);\nGL_APICALL void         GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\nGL_APICALL void         GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGL_APICALL GLuint       GL_APIENTRY glCreateProgram (void);\nGL_APICALL GLuint       GL_APIENTRY glCreateShader (GLenum type);\nGL_APICALL void         GL_APIENTRY glCullFace (GLenum mode);\nGL_APICALL void         GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint* buffers);\nGL_APICALL void         GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers);\nGL_APICALL void         GL_APIENTRY glDeleteProgram (GLuint program);\nGL_APICALL void         GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers);\nGL_APICALL void         GL_APIENTRY glDeleteShader (GLuint shader);\nGL_APICALL void         GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint* textures);\nGL_APICALL void         GL_APIENTRY glDepthFunc (GLenum func);\nGL_APICALL void         GL_APIENTRY glDepthMask (GLboolean flag);\nGL_APICALL void         GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar);\nGL_APICALL void         GL_APIENTRY glDetachShader (GLuint program, GLuint shader);\nGL_APICALL void         GL_APIENTRY glDisable (GLenum cap);\nGL_APICALL void         GL_APIENTRY glDisableVertexAttribArray (GLuint index);\nGL_APICALL void         GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);\nGL_APICALL void         GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);\nGL_APICALL void         GL_APIENTRY glEnable (GLenum cap);\nGL_APICALL void         GL_APIENTRY glEnableVertexAttribArray (GLuint index);\nGL_APICALL void         GL_APIENTRY glFinish (void);\nGL_APICALL void         GL_APIENTRY glFlush (void);\nGL_APICALL void         GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\nGL_APICALL void         GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGL_APICALL void         GL_APIENTRY glFrontFace (GLenum mode);\nGL_APICALL void         GL_APIENTRY glGenBuffers (GLsizei n, GLuint* buffers);\nGL_APICALL void         GL_APIENTRY glGenerateMipmap (GLenum target);\nGL_APICALL void         GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint* framebuffers);\nGL_APICALL void         GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint* renderbuffers);\nGL_APICALL void         GL_APIENTRY glGenTextures (GLsizei n, GLuint* textures);\nGL_APICALL void         GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);\nGL_APICALL void         GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);\nGL_APICALL void         GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);\nGL_APICALL GLint        GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar* name);\nGL_APICALL void         GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean* params);\nGL_APICALL void         GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params);\nGL_APICALL GLenum       GL_APIENTRY glGetError (void);\nGL_APICALL void         GL_APIENTRY glGetFloatv (GLenum pname, GLfloat* params);\nGL_APICALL void         GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params);\nGL_APICALL void         GL_APIENTRY glGetIntegerv (GLenum pname, GLint* params);\nGL_APICALL void         GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint* params);\nGL_APICALL void         GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);\nGL_APICALL void         GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params);\nGL_APICALL void         GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint* params);\nGL_APICALL void         GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);\nGL_APICALL void         GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);\nGL_APICALL void         GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);\nGL_APICALL const GLubyte* GL_APIENTRY glGetString (GLenum name);\nGL_APICALL void         GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat* params);\nGL_APICALL void         GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint* params);\nGL_APICALL void         GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat* params);\nGL_APICALL void         GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint* params);\nGL_APICALL GLint        GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar* name);\nGL_APICALL void         GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params);\nGL_APICALL void         GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params);\nGL_APICALL void         GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid** pointer);\nGL_APICALL void         GL_APIENTRY glHint (GLenum target, GLenum mode);\nGL_APICALL GLboolean    GL_APIENTRY glIsBuffer (GLuint buffer);\nGL_APICALL GLboolean    GL_APIENTRY glIsEnabled (GLenum cap);\nGL_APICALL GLboolean    GL_APIENTRY glIsFramebuffer (GLuint framebuffer);\nGL_APICALL GLboolean    GL_APIENTRY glIsProgram (GLuint program);\nGL_APICALL GLboolean    GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);\nGL_APICALL GLboolean    GL_APIENTRY glIsShader (GLuint shader);\nGL_APICALL GLboolean    GL_APIENTRY glIsTexture (GLuint texture);\nGL_APICALL void         GL_APIENTRY glLineWidth (GLfloat width);\nGL_APICALL void         GL_APIENTRY glLinkProgram (GLuint program);\nGL_APICALL void         GL_APIENTRY glPixelStorei (GLenum pname, GLint param);\nGL_APICALL void         GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);\nGL_APICALL void         GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);\nGL_APICALL void         GL_APIENTRY glReleaseShaderCompiler (void);\nGL_APICALL void         GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\nGL_APICALL void         GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert);\nGL_APICALL void         GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);\nGL_APICALL void         GL_APIENTRY glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);\nGL_APICALL void         GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);\nGL_APICALL void         GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);\nGL_APICALL void         GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);\nGL_APICALL void         GL_APIENTRY glStencilMask (GLuint mask);\nGL_APICALL void         GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);\nGL_APICALL void         GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);\nGL_APICALL void         GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass);\nGL_APICALL void         GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels);\nGL_APICALL void         GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);\nGL_APICALL void         GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat* params);\nGL_APICALL void         GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);\nGL_APICALL void         GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint* params);\nGL_APICALL void         GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels);\nGL_APICALL void         GL_APIENTRY glUniform1f (GLint location, GLfloat x);\nGL_APICALL void         GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat* v);\nGL_APICALL void         GL_APIENTRY glUniform1i (GLint location, GLint x);\nGL_APICALL void         GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint* v);\nGL_APICALL void         GL_APIENTRY glUniform2f (GLint location, GLfloat x, GLfloat y);\nGL_APICALL void         GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v);\nGL_APICALL void         GL_APIENTRY glUniform2i (GLint location, GLint x, GLint y);\nGL_APICALL void         GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint* v);\nGL_APICALL void         GL_APIENTRY glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z);\nGL_APICALL void         GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat* v);\nGL_APICALL void         GL_APIENTRY glUniform3i (GLint location, GLint x, GLint y, GLint z);\nGL_APICALL void         GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint* v);\nGL_APICALL void         GL_APIENTRY glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGL_APICALL void         GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v);\nGL_APICALL void         GL_APIENTRY glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w);\nGL_APICALL void         GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint* v);\nGL_APICALL void         GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGL_APICALL void         GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGL_APICALL void         GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nGL_APICALL void         GL_APIENTRY glUseProgram (GLuint program);\nGL_APICALL void         GL_APIENTRY glValidateProgram (GLuint program);\nGL_APICALL void         GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x);\nGL_APICALL void         GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat* values);\nGL_APICALL void         GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y);\nGL_APICALL void         GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat* values);\nGL_APICALL void         GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z);\nGL_APICALL void         GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values);\nGL_APICALL void         GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGL_APICALL void         GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values);\nGL_APICALL void         GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);\nGL_APICALL void         GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __gl2_h_ */\n\n"
  },
  {
    "path": "libs/SDL2/include/SDL_opengles2_gl2ext.h",
    "content": "#ifndef __gl2ext_h_\n#define __gl2ext_h_\n\n/* $Revision: 22801 $ on $Date:: 2013-08-21 03:20:48 -0700 #$ */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * This document is licensed under the SGI Free Software B License Version\n * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .\n */\n\n#ifndef GL_APIENTRYP\n#   define GL_APIENTRYP GL_APIENTRY*\n#endif\n\n/* New types shared by several extensions */\n\n#ifndef __gl3_h_\n/* These are defined with respect to <inttypes.h> in the\n * Apple extension spec, but they are also used by non-APPLE\n * extensions, and in the Khronos header we use the Khronos\n * portable types in khrplatform.h, which must be defined.\n */\ntypedef khronos_int64_t GLint64;\ntypedef khronos_uint64_t GLuint64;\ntypedef struct __GLsync *GLsync;\n#endif\n\n\n/*------------------------------------------------------------------------*\n * OES extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_OES_compressed_ETC1_RGB8_texture */\n#ifndef GL_OES_compressed_ETC1_RGB8_texture\n#define GL_ETC1_RGB8_OES                                        0x8D64\n#endif\n\n/* GL_OES_compressed_paletted_texture */\n#ifndef GL_OES_compressed_paletted_texture\n#define GL_PALETTE4_RGB8_OES                                    0x8B90\n#define GL_PALETTE4_RGBA8_OES                                   0x8B91\n#define GL_PALETTE4_R5_G6_B5_OES                                0x8B92\n#define GL_PALETTE4_RGBA4_OES                                   0x8B93\n#define GL_PALETTE4_RGB5_A1_OES                                 0x8B94\n#define GL_PALETTE8_RGB8_OES                                    0x8B95\n#define GL_PALETTE8_RGBA8_OES                                   0x8B96\n#define GL_PALETTE8_R5_G6_B5_OES                                0x8B97\n#define GL_PALETTE8_RGBA4_OES                                   0x8B98\n#define GL_PALETTE8_RGB5_A1_OES                                 0x8B99\n#endif\n\n/* GL_OES_depth24 */\n#ifndef GL_OES_depth24\n#define GL_DEPTH_COMPONENT24_OES                                0x81A6\n#endif\n\n/* GL_OES_depth32 */\n#ifndef GL_OES_depth32\n#define GL_DEPTH_COMPONENT32_OES                                0x81A7\n#endif\n\n/* GL_OES_depth_texture */\n/* No new tokens introduced by this extension. */\n\n/* GL_OES_EGL_image */\n#ifndef GL_OES_EGL_image\ntypedef void* GLeglImageOES;\n#endif\n\n/* GL_OES_EGL_image_external */\n#ifndef GL_OES_EGL_image_external\n/* GLeglImageOES defined in GL_OES_EGL_image already. */\n#define GL_TEXTURE_EXTERNAL_OES                                 0x8D65\n#define GL_SAMPLER_EXTERNAL_OES                                 0x8D66\n#define GL_TEXTURE_BINDING_EXTERNAL_OES                         0x8D67\n#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES                     0x8D68\n#endif\n\n/* GL_OES_element_index_uint */\n#ifndef GL_OES_element_index_uint\n#define GL_UNSIGNED_INT                                         0x1405\n#endif\n\n/* GL_OES_get_program_binary */\n#ifndef GL_OES_get_program_binary\n#define GL_PROGRAM_BINARY_LENGTH_OES                            0x8741\n#define GL_NUM_PROGRAM_BINARY_FORMATS_OES                       0x87FE\n#define GL_PROGRAM_BINARY_FORMATS_OES                           0x87FF\n#endif\n\n/* GL_OES_mapbuffer */\n#ifndef GL_OES_mapbuffer\n#define GL_WRITE_ONLY_OES                                       0x88B9\n#define GL_BUFFER_ACCESS_OES                                    0x88BB\n#define GL_BUFFER_MAPPED_OES                                    0x88BC\n#define GL_BUFFER_MAP_POINTER_OES                               0x88BD\n#endif\n\n/* GL_OES_packed_depth_stencil */\n#ifndef GL_OES_packed_depth_stencil\n#define GL_DEPTH_STENCIL_OES                                    0x84F9\n#define GL_UNSIGNED_INT_24_8_OES                                0x84FA\n#define GL_DEPTH24_STENCIL8_OES                                 0x88F0\n#endif\n\n/* GL_OES_required_internalformat */\n#ifndef GL_OES_required_internalformat\n#define GL_ALPHA8_OES                                           0x803C\n#define GL_DEPTH_COMPONENT16_OES                                0x81A5\n/* reuse GL_DEPTH_COMPONENT24_OES */\n/* reuse GL_DEPTH24_STENCIL8_OES */\n/* reuse GL_DEPTH_COMPONENT32_OES */\n#define GL_LUMINANCE4_ALPHA4_OES                                0x8043\n#define GL_LUMINANCE8_ALPHA8_OES                                0x8045\n#define GL_LUMINANCE8_OES                                       0x8040\n#define GL_RGBA4_OES                                            0x8056\n#define GL_RGB5_A1_OES                                          0x8057\n#define GL_RGB565_OES                                           0x8D62\n/* reuse GL_RGB8_OES */\n/* reuse GL_RGBA8_OES */\n/* reuse GL_RGB10_EXT */\n/* reuse GL_RGB10_A2_EXT */\n#endif\n\n/* GL_OES_rgb8_rgba8 */\n#ifndef GL_OES_rgb8_rgba8\n#define GL_RGB8_OES                                             0x8051\n#define GL_RGBA8_OES                                            0x8058\n#endif\n\n/* GL_OES_standard_derivatives */\n#ifndef GL_OES_standard_derivatives\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES                  0x8B8B\n#endif\n\n/* GL_OES_stencil1 */\n#ifndef GL_OES_stencil1\n#define GL_STENCIL_INDEX1_OES                                   0x8D46\n#endif\n\n/* GL_OES_stencil4 */\n#ifndef GL_OES_stencil4\n#define GL_STENCIL_INDEX4_OES                                   0x8D47\n#endif\n\n#ifndef GL_OES_surfaceless_context\n#define GL_FRAMEBUFFER_UNDEFINED_OES                            0x8219\n#endif\n\n/* GL_OES_texture_3D */\n#ifndef GL_OES_texture_3D\n#define GL_TEXTURE_WRAP_R_OES                                   0x8072\n#define GL_TEXTURE_3D_OES                                       0x806F\n#define GL_TEXTURE_BINDING_3D_OES                               0x806A\n#define GL_MAX_3D_TEXTURE_SIZE_OES                              0x8073\n#define GL_SAMPLER_3D_OES                                       0x8B5F\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES        0x8CD4\n#endif\n\n/* GL_OES_texture_float */\n/* No new tokens introduced by this extension. */\n\n/* GL_OES_texture_float_linear */\n/* No new tokens introduced by this extension. */\n\n/* GL_OES_texture_half_float */\n#ifndef GL_OES_texture_half_float\n#define GL_HALF_FLOAT_OES                                       0x8D61\n#endif\n\n/* GL_OES_texture_half_float_linear */\n/* No new tokens introduced by this extension. */\n\n/* GL_OES_texture_npot */\n/* No new tokens introduced by this extension. */\n\n/* GL_OES_vertex_array_object */\n#ifndef GL_OES_vertex_array_object\n#define GL_VERTEX_ARRAY_BINDING_OES                             0x85B5\n#endif\n\n/* GL_OES_vertex_half_float */\n/* GL_HALF_FLOAT_OES defined in GL_OES_texture_half_float already. */\n\n/* GL_OES_vertex_type_10_10_10_2 */\n#ifndef GL_OES_vertex_type_10_10_10_2\n#define GL_UNSIGNED_INT_10_10_10_2_OES                          0x8DF6\n#define GL_INT_10_10_10_2_OES                                   0x8DF7\n#endif\n\n/*------------------------------------------------------------------------*\n * KHR extension tokens\n *------------------------------------------------------------------------*/\n\n#ifndef GL_KHR_debug\ntypedef void (GL_APIENTRYP GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR                         0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR                 0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION_KHR                          0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM_KHR                        0x8245\n#define GL_DEBUG_SOURCE_API_KHR                                 0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR                       0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR                     0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR                         0x8249\n#define GL_DEBUG_SOURCE_APPLICATION_KHR                         0x824A\n#define GL_DEBUG_SOURCE_OTHER_KHR                               0x824B\n#define GL_DEBUG_TYPE_ERROR_KHR                                 0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR                   0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR                    0x824E\n#define GL_DEBUG_TYPE_PORTABILITY_KHR                           0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE_KHR                           0x8250\n#define GL_DEBUG_TYPE_OTHER_KHR                                 0x8251\n#define GL_DEBUG_TYPE_MARKER_KHR                                0x8268\n#define GL_DEBUG_TYPE_PUSH_GROUP_KHR                            0x8269\n#define GL_DEBUG_TYPE_POP_GROUP_KHR                             0x826A\n#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR                      0x826B\n#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR                      0x826C\n#define GL_DEBUG_GROUP_STACK_DEPTH_KHR                          0x826D\n#define GL_BUFFER_KHR                                           0x82E0\n#define GL_SHADER_KHR                                           0x82E1\n#define GL_PROGRAM_KHR                                          0x82E2\n#define GL_QUERY_KHR                                            0x82E3\n/* PROGRAM_PIPELINE only in GL */\n#define GL_SAMPLER_KHR                                          0x82E6\n/* DISPLAY_LIST only in GL */\n#define GL_MAX_LABEL_LENGTH_KHR                                 0x82E8\n#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR                         0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR                        0x9144\n#define GL_DEBUG_LOGGED_MESSAGES_KHR                            0x9145\n#define GL_DEBUG_SEVERITY_HIGH_KHR                              0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM_KHR                            0x9147\n#define GL_DEBUG_SEVERITY_LOW_KHR                               0x9148\n#define GL_DEBUG_OUTPUT_KHR                                     0x92E0\n#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR                           0x00000002\n#define GL_STACK_OVERFLOW_KHR                                   0x0503\n#define GL_STACK_UNDERFLOW_KHR                                  0x0504\n#endif\n\n#ifndef GL_KHR_texture_compression_astc_ldr\n#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR                         0x93B0\n#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR                         0x93B1\n#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR                         0x93B2\n#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR                         0x93B3\n#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR                         0x93B4\n#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR                         0x93B5\n#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR                         0x93B6\n#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR                         0x93B7\n#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR                        0x93B8\n#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR                        0x93B9\n#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR                        0x93BA\n#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR                       0x93BB\n#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR                       0x93BC\n#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR                       0x93BD\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR                 0x93D0\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR                 0x93D1\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR                 0x93D2\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR                 0x93D3\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR                 0x93D4\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR                 0x93D5\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR                 0x93D6\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR                 0x93D7\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR                0x93D8\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR                0x93D9\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR                0x93DA\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR               0x93DB\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR               0x93DC\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR               0x93DD\n#endif\n\n/*------------------------------------------------------------------------*\n * AMD extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_AMD_compressed_3DC_texture */\n#ifndef GL_AMD_compressed_3DC_texture\n#define GL_3DC_X_AMD                                            0x87F9\n#define GL_3DC_XY_AMD                                           0x87FA\n#endif\n\n/* GL_AMD_compressed_ATC_texture */\n#ifndef GL_AMD_compressed_ATC_texture\n#define GL_ATC_RGB_AMD                                          0x8C92\n#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD                          0x8C93\n#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD                      0x87EE\n#endif\n\n/* GL_AMD_performance_monitor */\n#ifndef GL_AMD_performance_monitor\n#define GL_COUNTER_TYPE_AMD                                     0x8BC0\n#define GL_COUNTER_RANGE_AMD                                    0x8BC1\n#define GL_UNSIGNED_INT64_AMD                                   0x8BC2\n#define GL_PERCENTAGE_AMD                                       0x8BC3\n#define GL_PERFMON_RESULT_AVAILABLE_AMD                         0x8BC4\n#define GL_PERFMON_RESULT_SIZE_AMD                              0x8BC5\n#define GL_PERFMON_RESULT_AMD                                   0x8BC6\n#endif\n\n/* GL_AMD_program_binary_Z400 */\n#ifndef GL_AMD_program_binary_Z400\n#define GL_Z400_BINARY_AMD                                      0x8740\n#endif\n\n/*------------------------------------------------------------------------*\n * ANGLE extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_ANGLE_depth_texture */\n#ifndef GL_ANGLE_depth_texture\n#define GL_DEPTH_COMPONENT                                      0x1902\n#define GL_DEPTH_STENCIL_OES                                    0x84F9\n#define GL_UNSIGNED_SHORT                                       0x1403\n#define GL_UNSIGNED_INT                                         0x1405\n#define GL_UNSIGNED_INT_24_8_OES                                0x84FA\n#define GL_DEPTH_COMPONENT16                                    0x81A5\n#define GL_DEPTH_COMPONENT32_OES                                0x81A7\n#define GL_DEPTH24_STENCIL8_OES                                 0x88F0\n#endif\n\n/* GL_ANGLE_framebuffer_blit */\n#ifndef GL_ANGLE_framebuffer_blit\n#define GL_READ_FRAMEBUFFER_ANGLE                               0x8CA8\n#define GL_DRAW_FRAMEBUFFER_ANGLE                               0x8CA9\n#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE                       0x8CA6\n#define GL_READ_FRAMEBUFFER_BINDING_ANGLE                       0x8CAA\n#endif\n\n/* GL_ANGLE_framebuffer_multisample */\n#ifndef GL_ANGLE_framebuffer_multisample\n#define GL_RENDERBUFFER_SAMPLES_ANGLE                           0x8CAB\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE             0x8D56\n#define GL_MAX_SAMPLES_ANGLE                                    0x8D57\n#endif\n\n/* GL_ANGLE_instanced_arrays */\n#ifndef GL_ANGLE_instanced_arrays\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE                    0x88FE\n#endif\n\n/* GL_ANGLE_pack_reverse_row_order */\n#ifndef GL_ANGLE_pack_reverse_row_order\n#define GL_PACK_REVERSE_ROW_ORDER_ANGLE                         0x93A4\n#endif\n\n/* GL_ANGLE_program_binary */\n#ifndef GL_ANGLE_program_binary\n#define GL_PROGRAM_BINARY_ANGLE                                 0x93A6\n#endif\n\n/* GL_ANGLE_texture_compression_dxt3 */\n#ifndef GL_ANGLE_texture_compression_dxt3\n#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE                      0x83F2\n#endif\n\n/* GL_ANGLE_texture_compression_dxt5 */\n#ifndef GL_ANGLE_texture_compression_dxt5\n#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE                      0x83F3\n#endif\n\n/* GL_ANGLE_texture_usage */\n#ifndef GL_ANGLE_texture_usage\n#define GL_TEXTURE_USAGE_ANGLE                                  0x93A2\n#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE                         0x93A3\n#endif\n\n/* GL_ANGLE_translated_shader_source */\n#ifndef GL_ANGLE_translated_shader_source\n#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE                0x93A0\n#endif\n\n/*------------------------------------------------------------------------*\n * APPLE extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_APPLE_copy_texture_levels */\n/* No new tokens introduced by this extension. */\n\n/* GL_APPLE_framebuffer_multisample */\n#ifndef GL_APPLE_framebuffer_multisample\n#define GL_RENDERBUFFER_SAMPLES_APPLE                           0x8CAB\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE             0x8D56\n#define GL_MAX_SAMPLES_APPLE                                    0x8D57\n#define GL_READ_FRAMEBUFFER_APPLE                               0x8CA8\n#define GL_DRAW_FRAMEBUFFER_APPLE                               0x8CA9\n#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE                       0x8CA6\n#define GL_READ_FRAMEBUFFER_BINDING_APPLE                       0x8CAA\n#endif\n\n/* GL_APPLE_rgb_422 */\n#ifndef GL_APPLE_rgb_422\n#define GL_RGB_422_APPLE                                        0x8A1F\n#define GL_UNSIGNED_SHORT_8_8_APPLE                             0x85BA\n#define GL_UNSIGNED_SHORT_8_8_REV_APPLE                         0x85BB\n#endif\n\n/* GL_APPLE_sync */\n#ifndef GL_APPLE_sync\n\n#define GL_SYNC_OBJECT_APPLE                                    0x8A53\n#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE                        0x9111\n#define GL_OBJECT_TYPE_APPLE                                    0x9112\n#define GL_SYNC_CONDITION_APPLE                                 0x9113\n#define GL_SYNC_STATUS_APPLE                                    0x9114\n#define GL_SYNC_FLAGS_APPLE                                     0x9115\n#define GL_SYNC_FENCE_APPLE                                     0x9116\n#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE                     0x9117\n#define GL_UNSIGNALED_APPLE                                     0x9118\n#define GL_SIGNALED_APPLE                                       0x9119\n#define GL_ALREADY_SIGNALED_APPLE                               0x911A\n#define GL_TIMEOUT_EXPIRED_APPLE                                0x911B\n#define GL_CONDITION_SATISFIED_APPLE                            0x911C\n#define GL_WAIT_FAILED_APPLE                                    0x911D\n#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE                        0x00000001\n#define GL_TIMEOUT_IGNORED_APPLE                                0xFFFFFFFFFFFFFFFFull\n#endif\n\n/* GL_APPLE_texture_format_BGRA8888 */\n#ifndef GL_APPLE_texture_format_BGRA8888\n#define GL_BGRA_EXT                                             0x80E1\n#endif\n\n/* GL_APPLE_texture_max_level */\n#ifndef GL_APPLE_texture_max_level\n#define GL_TEXTURE_MAX_LEVEL_APPLE                              0x813D\n#endif\n\n/*------------------------------------------------------------------------*\n * ARM extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_ARM_mali_program_binary */\n#ifndef GL_ARM_mali_program_binary\n#define GL_MALI_PROGRAM_BINARY_ARM                              0x8F61\n#endif\n\n/* GL_ARM_mali_shader_binary */\n#ifndef GL_ARM_mali_shader_binary\n#define GL_MALI_SHADER_BINARY_ARM                               0x8F60\n#endif\n\n/* GL_ARM_rgba8 */\n/* No new tokens introduced by this extension. */\n\n/*------------------------------------------------------------------------*\n * EXT extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_EXT_blend_minmax */\n#ifndef GL_EXT_blend_minmax\n#define GL_MIN_EXT                                              0x8007\n#define GL_MAX_EXT                                              0x8008\n#endif\n\n/* GL_EXT_color_buffer_half_float */\n#ifndef GL_EXT_color_buffer_half_float\n#define GL_RGBA16F_EXT                                          0x881A\n#define GL_RGB16F_EXT                                           0x881B\n#define GL_RG16F_EXT                                            0x822F\n#define GL_R16F_EXT                                             0x822D\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT            0x8211\n#define GL_UNSIGNED_NORMALIZED_EXT                              0x8C17\n#endif\n\n/* GL_EXT_debug_label */\n#ifndef GL_EXT_debug_label\n#define GL_PROGRAM_PIPELINE_OBJECT_EXT                          0x8A4F\n#define GL_PROGRAM_OBJECT_EXT                                   0x8B40\n#define GL_SHADER_OBJECT_EXT                                    0x8B48\n#define GL_BUFFER_OBJECT_EXT                                    0x9151\n#define GL_QUERY_OBJECT_EXT                                     0x9153\n#define GL_VERTEX_ARRAY_OBJECT_EXT                              0x9154\n#endif\n\n/* GL_EXT_debug_marker */\n/* No new tokens introduced by this extension. */\n\n/* GL_EXT_discard_framebuffer */\n#ifndef GL_EXT_discard_framebuffer\n#define GL_COLOR_EXT                                            0x1800\n#define GL_DEPTH_EXT                                            0x1801\n#define GL_STENCIL_EXT                                          0x1802\n#endif\n\n#ifndef GL_EXT_disjoint_timer_query\n#define GL_QUERY_COUNTER_BITS_EXT                               0x8864\n#define GL_CURRENT_QUERY_EXT                                    0x8865\n#define GL_QUERY_RESULT_EXT                                     0x8866\n#define GL_QUERY_RESULT_AVAILABLE_EXT                           0x8867\n#define GL_TIME_ELAPSED_EXT                                     0x88BF\n#define GL_TIMESTAMP_EXT                                        0x8E28\n#define GL_GPU_DISJOINT_EXT                                     0x8FBB\n#endif\n\n#ifndef GL_EXT_draw_buffers\n#define GL_EXT_draw_buffers 1\n#define GL_MAX_COLOR_ATTACHMENTS_EXT                            0x8CDF\n#define GL_MAX_DRAW_BUFFERS_EXT                                 0x8824\n#define GL_DRAW_BUFFER0_EXT                                     0x8825\n#define GL_DRAW_BUFFER1_EXT                                     0x8826\n#define GL_DRAW_BUFFER2_EXT                                     0x8827\n#define GL_DRAW_BUFFER3_EXT                                     0x8828\n#define GL_DRAW_BUFFER4_EXT                                     0x8829\n#define GL_DRAW_BUFFER5_EXT                                     0x882A\n#define GL_DRAW_BUFFER6_EXT                                     0x882B\n#define GL_DRAW_BUFFER7_EXT                                     0x882C\n#define GL_DRAW_BUFFER8_EXT                                     0x882D\n#define GL_DRAW_BUFFER9_EXT                                     0x882E\n#define GL_DRAW_BUFFER10_EXT                                    0x882F\n#define GL_DRAW_BUFFER11_EXT                                    0x8830\n#define GL_DRAW_BUFFER12_EXT                                    0x8831\n#define GL_DRAW_BUFFER13_EXT                                    0x8832\n#define GL_DRAW_BUFFER14_EXT                                    0x8833\n#define GL_DRAW_BUFFER15_EXT                                    0x8834\n#define GL_COLOR_ATTACHMENT0_EXT                                0x8CE0\n#define GL_COLOR_ATTACHMENT1_EXT                                0x8CE1\n#define GL_COLOR_ATTACHMENT2_EXT                                0x8CE2\n#define GL_COLOR_ATTACHMENT3_EXT                                0x8CE3\n#define GL_COLOR_ATTACHMENT4_EXT                                0x8CE4\n#define GL_COLOR_ATTACHMENT5_EXT                                0x8CE5\n#define GL_COLOR_ATTACHMENT6_EXT                                0x8CE6\n#define GL_COLOR_ATTACHMENT7_EXT                                0x8CE7\n#define GL_COLOR_ATTACHMENT8_EXT                                0x8CE8\n#define GL_COLOR_ATTACHMENT9_EXT                                0x8CE9\n#define GL_COLOR_ATTACHMENT10_EXT                               0x8CEA\n#define GL_COLOR_ATTACHMENT11_EXT                               0x8CEB\n#define GL_COLOR_ATTACHMENT12_EXT                               0x8CEC\n#define GL_COLOR_ATTACHMENT13_EXT                               0x8CED\n#define GL_COLOR_ATTACHMENT14_EXT                               0x8CEE\n#define GL_COLOR_ATTACHMENT15_EXT                               0x8CEF\n#endif\n\n/* GL_EXT_map_buffer_range */\n#ifndef GL_EXT_map_buffer_range\n#define GL_MAP_READ_BIT_EXT                                     0x0001\n#define GL_MAP_WRITE_BIT_EXT                                    0x0002\n#define GL_MAP_INVALIDATE_RANGE_BIT_EXT                         0x0004\n#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT                        0x0008\n#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT                           0x0010\n#define GL_MAP_UNSYNCHRONIZED_BIT_EXT                           0x0020\n#endif\n\n/* GL_EXT_multisampled_render_to_texture */\n#ifndef GL_EXT_multisampled_render_to_texture\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT           0x8D6C\n/* reuse values from GL_EXT_framebuffer_multisample (desktop extension) */\n#define GL_RENDERBUFFER_SAMPLES_EXT                             0x8CAB\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT               0x8D56\n#define GL_MAX_SAMPLES_EXT                                      0x8D57\n#endif\n\n/* GL_EXT_multiview_draw_buffers */\n#ifndef GL_EXT_multiview_draw_buffers\n#define GL_COLOR_ATTACHMENT_EXT                                 0x90F0\n#define GL_MULTIVIEW_EXT                                        0x90F1\n#define GL_DRAW_BUFFER_EXT                                      0x0C01\n#define GL_READ_BUFFER_EXT                                      0x0C02\n#define GL_MAX_MULTIVIEW_BUFFERS_EXT                            0x90F2\n#endif\n\n/* GL_EXT_multi_draw_arrays */\n/* No new tokens introduced by this extension. */\n\n/* GL_EXT_occlusion_query_boolean */\n#ifndef GL_EXT_occlusion_query_boolean\n#define GL_ANY_SAMPLES_PASSED_EXT                               0x8C2F\n#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT                  0x8D6A\n#define GL_CURRENT_QUERY_EXT                                    0x8865\n#define GL_QUERY_RESULT_EXT                                     0x8866\n#define GL_QUERY_RESULT_AVAILABLE_EXT                           0x8867\n#endif\n\n/* GL_EXT_read_format_bgra */\n#ifndef GL_EXT_read_format_bgra\n#define GL_BGRA_EXT                                             0x80E1\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT                       0x8365\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT                       0x8366\n#endif\n\n/* GL_EXT_robustness */\n#ifndef GL_EXT_robustness\n/* reuse GL_NO_ERROR */\n#define GL_GUILTY_CONTEXT_RESET_EXT                             0x8253\n#define GL_INNOCENT_CONTEXT_RESET_EXT                           0x8254\n#define GL_UNKNOWN_CONTEXT_RESET_EXT                            0x8255\n#define GL_CONTEXT_ROBUST_ACCESS_EXT                            0x90F3\n#define GL_RESET_NOTIFICATION_STRATEGY_EXT                      0x8256\n#define GL_LOSE_CONTEXT_ON_RESET_EXT                            0x8252\n#define GL_NO_RESET_NOTIFICATION_EXT                            0x8261\n#endif\n\n/* GL_EXT_separate_shader_objects */\n#ifndef GL_EXT_separate_shader_objects\n#define GL_VERTEX_SHADER_BIT_EXT                                0x00000001\n#define GL_FRAGMENT_SHADER_BIT_EXT                              0x00000002\n#define GL_ALL_SHADER_BITS_EXT                                  0xFFFFFFFF\n#define GL_PROGRAM_SEPARABLE_EXT                                0x8258\n#define GL_ACTIVE_PROGRAM_EXT                                   0x8259\n#define GL_PROGRAM_PIPELINE_BINDING_EXT                         0x825A\n#endif\n\n/* GL_EXT_shader_framebuffer_fetch */\n#ifndef GL_EXT_shader_framebuffer_fetch\n#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT                 0x8A52\n#endif\n\n/* GL_EXT_shader_texture_lod */\n/* No new tokens introduced by this extension. */\n\n/* GL_EXT_shadow_samplers */\n#ifndef GL_EXT_shadow_samplers\n#define GL_TEXTURE_COMPARE_MODE_EXT                             0x884C\n#define GL_TEXTURE_COMPARE_FUNC_EXT                             0x884D\n#define GL_COMPARE_REF_TO_TEXTURE_EXT                           0x884E\n#define GL_SAMPLER_2D_SHADOW_EXT                                0x8B62\n#endif\n\n/* GL_EXT_sRGB */\n#ifndef GL_EXT_sRGB\n#define GL_SRGB_EXT                                             0x8C40\n#define GL_SRGB_ALPHA_EXT                                       0x8C42\n#define GL_SRGB8_ALPHA8_EXT                                     0x8C43\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT            0x8210\n#endif\n\n/* GL_EXT_sRGB_write_control */\n#ifndef GL_EXT_sRGB_write_control\n#define GL_EXT_sRGB_write_control 1\n#define GL_FRAMEBUFFER_SRGB_EXT                                 0x8DB9\n#endif\n\n/* GL_EXT_texture_compression_dxt1 */\n#ifndef GL_EXT_texture_compression_dxt1\n#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT                         0x83F0\n#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT                        0x83F1\n#endif\n\n/* GL_EXT_texture_filter_anisotropic */\n#ifndef GL_EXT_texture_filter_anisotropic\n#define GL_TEXTURE_MAX_ANISOTROPY_EXT                           0x84FE\n#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT                       0x84FF\n#endif\n\n/* GL_EXT_texture_format_BGRA8888 */\n#ifndef GL_EXT_texture_format_BGRA8888\n#define GL_BGRA_EXT                                             0x80E1\n#endif\n\n/* GL_EXT_texture_rg */\n#ifndef GL_EXT_texture_rg\n#define GL_RED_EXT                                              0x1903\n#define GL_RG_EXT                                               0x8227\n#define GL_R8_EXT                                               0x8229\n#define GL_RG8_EXT                                              0x822B\n#endif\n\n/* GL_EXT_texture_sRGB_decode */\n#ifndef GL_EXT_texture_sRGB_decode\n#define GL_EXT_texture_sRGB_decode 1\n#define GL_TEXTURE_SRGB_DECODE_EXT                              0x8A48\n#define GL_DECODE_EXT                                           0x8A49\n#define GL_SKIP_DECODE_EXT                                      0x8A4A\n#endif\n\n/* GL_EXT_texture_storage */\n#ifndef GL_EXT_texture_storage\n#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT                         0x912F\n#define GL_ALPHA8_EXT                                           0x803C\n#define GL_LUMINANCE8_EXT                                       0x8040\n#define GL_LUMINANCE8_ALPHA8_EXT                                0x8045\n#define GL_RGBA32F_EXT                                          0x8814\n#define GL_RGB32F_EXT                                           0x8815\n#define GL_ALPHA32F_EXT                                         0x8816\n#define GL_LUMINANCE32F_EXT                                     0x8818\n#define GL_LUMINANCE_ALPHA32F_EXT                               0x8819\n/* reuse GL_RGBA16F_EXT */\n/* reuse GL_RGB16F_EXT */\n#define GL_ALPHA16F_EXT                                         0x881C\n#define GL_LUMINANCE16F_EXT                                     0x881E\n#define GL_LUMINANCE_ALPHA16F_EXT                               0x881F\n#define GL_RGB10_A2_EXT                                         0x8059\n#define GL_RGB10_EXT                                            0x8052\n#define GL_BGRA8_EXT                                            0x93A1\n#define GL_R8_EXT                                               0x8229\n#define GL_RG8_EXT                                              0x822B\n#define GL_R32F_EXT                                             0x822E\n#define GL_RG32F_EXT                                            0x8230\n#define GL_R16F_EXT                                             0x822D\n#define GL_RG16F_EXT                                            0x822F\n#endif\n\n/* GL_EXT_texture_type_2_10_10_10_REV */\n#ifndef GL_EXT_texture_type_2_10_10_10_REV\n#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT                      0x8368\n#endif\n\n/* GL_EXT_unpack_subimage */\n#ifndef GL_EXT_unpack_subimage\n#define GL_UNPACK_ROW_LENGTH_EXT                                0x0CF2\n#define GL_UNPACK_SKIP_ROWS_EXT                                 0x0CF3\n#define GL_UNPACK_SKIP_PIXELS_EXT                               0x0CF4\n#endif\n\n/*------------------------------------------------------------------------*\n * DMP extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_DMP_shader_binary */\n#ifndef GL_DMP_shader_binary\n#define GL_SHADER_BINARY_DMP                                    0x9250\n#endif\n\n/*------------------------------------------------------------------------*\n * FJ extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_FJ_shader_binary_GCCSO */\n#ifndef GL_FJ_shader_binary_GCCSO\n#define GL_GCCSO_SHADER_BINARY_FJ                               0x9260\n#endif\n\n/*------------------------------------------------------------------------*\n * IMG extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_IMG_program_binary */\n#ifndef GL_IMG_program_binary\n#define GL_SGX_PROGRAM_BINARY_IMG                               0x9130\n#endif\n\n/* GL_IMG_read_format */\n#ifndef GL_IMG_read_format\n#define GL_BGRA_IMG                                             0x80E1\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG                       0x8365\n#endif\n\n/* GL_IMG_shader_binary */\n#ifndef GL_IMG_shader_binary\n#define GL_SGX_BINARY_IMG                                       0x8C0A\n#endif\n\n/* GL_IMG_texture_compression_pvrtc */\n#ifndef GL_IMG_texture_compression_pvrtc\n#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG                      0x8C00\n#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG                      0x8C01\n#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG                     0x8C02\n#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG                     0x8C03\n#endif\n\n/* GL_IMG_texture_compression_pvrtc2 */\n#ifndef GL_IMG_texture_compression_pvrtc2\n#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG                     0x9137\n#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG                     0x9138\n#endif\n\n/* GL_IMG_multisampled_render_to_texture */\n#ifndef GL_IMG_multisampled_render_to_texture\n#define GL_RENDERBUFFER_SAMPLES_IMG                             0x9133\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG               0x9134\n#define GL_MAX_SAMPLES_IMG                                      0x9135\n#define GL_TEXTURE_SAMPLES_IMG                                  0x9136\n#endif\n\n/*------------------------------------------------------------------------*\n * NV extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_NV_coverage_sample */\n#ifndef GL_NV_coverage_sample\n#define GL_COVERAGE_COMPONENT_NV                                0x8ED0\n#define GL_COVERAGE_COMPONENT4_NV                               0x8ED1\n#define GL_COVERAGE_ATTACHMENT_NV                               0x8ED2\n#define GL_COVERAGE_BUFFERS_NV                                  0x8ED3\n#define GL_COVERAGE_SAMPLES_NV                                  0x8ED4\n#define GL_COVERAGE_ALL_FRAGMENTS_NV                            0x8ED5\n#define GL_COVERAGE_EDGE_FRAGMENTS_NV                           0x8ED6\n#define GL_COVERAGE_AUTOMATIC_NV                                0x8ED7\n#define GL_COVERAGE_BUFFER_BIT_NV                               0x00008000\n#endif\n\n/* GL_NV_depth_nonlinear */\n#ifndef GL_NV_depth_nonlinear\n#define GL_DEPTH_COMPONENT16_NONLINEAR_NV                       0x8E2C\n#endif\n\n/* GL_NV_draw_buffers */\n#ifndef GL_NV_draw_buffers\n#define GL_MAX_DRAW_BUFFERS_NV                                  0x8824\n#define GL_DRAW_BUFFER0_NV                                      0x8825\n#define GL_DRAW_BUFFER1_NV                                      0x8826\n#define GL_DRAW_BUFFER2_NV                                      0x8827\n#define GL_DRAW_BUFFER3_NV                                      0x8828\n#define GL_DRAW_BUFFER4_NV                                      0x8829\n#define GL_DRAW_BUFFER5_NV                                      0x882A\n#define GL_DRAW_BUFFER6_NV                                      0x882B\n#define GL_DRAW_BUFFER7_NV                                      0x882C\n#define GL_DRAW_BUFFER8_NV                                      0x882D\n#define GL_DRAW_BUFFER9_NV                                      0x882E\n#define GL_DRAW_BUFFER10_NV                                     0x882F\n#define GL_DRAW_BUFFER11_NV                                     0x8830\n#define GL_DRAW_BUFFER12_NV                                     0x8831\n#define GL_DRAW_BUFFER13_NV                                     0x8832\n#define GL_DRAW_BUFFER14_NV                                     0x8833\n#define GL_DRAW_BUFFER15_NV                                     0x8834\n#define GL_COLOR_ATTACHMENT0_NV                                 0x8CE0\n#define GL_COLOR_ATTACHMENT1_NV                                 0x8CE1\n#define GL_COLOR_ATTACHMENT2_NV                                 0x8CE2\n#define GL_COLOR_ATTACHMENT3_NV                                 0x8CE3\n#define GL_COLOR_ATTACHMENT4_NV                                 0x8CE4\n#define GL_COLOR_ATTACHMENT5_NV                                 0x8CE5\n#define GL_COLOR_ATTACHMENT6_NV                                 0x8CE6\n#define GL_COLOR_ATTACHMENT7_NV                                 0x8CE7\n#define GL_COLOR_ATTACHMENT8_NV                                 0x8CE8\n#define GL_COLOR_ATTACHMENT9_NV                                 0x8CE9\n#define GL_COLOR_ATTACHMENT10_NV                                0x8CEA\n#define GL_COLOR_ATTACHMENT11_NV                                0x8CEB\n#define GL_COLOR_ATTACHMENT12_NV                                0x8CEC\n#define GL_COLOR_ATTACHMENT13_NV                                0x8CED\n#define GL_COLOR_ATTACHMENT14_NV                                0x8CEE\n#define GL_COLOR_ATTACHMENT15_NV                                0x8CEF\n#endif\n\n/* GL_NV_draw_instanced */\n/* No new tokens introduced by this extension. */\n\n/* GL_NV_fbo_color_attachments */\n#ifndef GL_NV_fbo_color_attachments\n#define GL_MAX_COLOR_ATTACHMENTS_NV                             0x8CDF\n/* GL_COLOR_ATTACHMENT{0-15}_NV defined in GL_NV_draw_buffers already. */\n#endif\n\n/* GL_NV_fence */\n#ifndef GL_NV_fence\n#define GL_ALL_COMPLETED_NV                                     0x84F2\n#define GL_FENCE_STATUS_NV                                      0x84F3\n#define GL_FENCE_CONDITION_NV                                   0x84F4\n#endif\n\n/* GL_NV_framebuffer_blit */\n#ifndef GL_NV_framebuffer_blit\n#define GL_READ_FRAMEBUFFER_NV                                  0x8CA8\n#define GL_DRAW_FRAMEBUFFER_NV                                  0x8CA9\n#define GL_DRAW_FRAMEBUFFER_BINDING_NV                          0x8CA6\n#define GL_READ_FRAMEBUFFER_BINDING_NV                          0x8CAA\n#endif\n\n/* GL_NV_framebuffer_multisample */\n#ifndef GL_NV_framebuffer_multisample\n#define GL_RENDERBUFFER_SAMPLES_NV                              0x8CAB\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV                0x8D56\n#define GL_MAX_SAMPLES_NV                                       0x8D57\n#endif\n\n/* GL_NV_generate_mipmap_sRGB */\n/* No new tokens introduced by this extension. */\n\n/* GL_NV_instanced_arrays */\n#ifndef GL_NV_instanced_arrays\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV                       0x88FE\n#endif\n\n/* GL_NV_read_buffer */\n#ifndef GL_NV_read_buffer\n#define GL_READ_BUFFER_NV                                       0x0C02\n#endif\n\n/* GL_NV_read_buffer_front */\n/* No new tokens introduced by this extension. */\n\n/* GL_NV_read_depth */\n/* No new tokens introduced by this extension. */\n\n/* GL_NV_read_depth_stencil */\n/* No new tokens introduced by this extension. */\n\n/* GL_NV_read_stencil */\n/* No new tokens introduced by this extension. */\n\n/* GL_NV_shadow_samplers_array */\n#ifndef GL_NV_shadow_samplers_array\n#define GL_SAMPLER_2D_ARRAY_SHADOW_NV                           0x8DC4\n#endif\n\n/* GL_NV_shadow_samplers_cube */\n#ifndef GL_NV_shadow_samplers_cube\n#define GL_SAMPLER_CUBE_SHADOW_NV                               0x8DC5\n#endif\n\n/* GL_NV_sRGB_formats */\n#ifndef GL_NV_sRGB_formats\n#define GL_SLUMINANCE_NV                                        0x8C46\n#define GL_SLUMINANCE_ALPHA_NV                                  0x8C44\n#define GL_SRGB8_NV                                             0x8C41\n#define GL_SLUMINANCE8_NV                                       0x8C47\n#define GL_SLUMINANCE8_ALPHA8_NV                                0x8C45\n#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV                         0x8C4C\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV                   0x8C4D\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV                   0x8C4E\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV                   0x8C4F\n#define GL_ETC1_SRGB8_NV                                        0x88EE\n#endif\n\n/* GL_NV_texture_border_clamp */\n#ifndef GL_NV_texture_border_clamp\n#define GL_TEXTURE_BORDER_COLOR_NV                              0x1004\n#define GL_CLAMP_TO_BORDER_NV                                   0x812D\n#endif\n\n/* GL_NV_texture_compression_s3tc_update */\n/* No new tokens introduced by this extension. */\n\n/* GL_NV_texture_npot_2D_mipmap */\n/* No new tokens introduced by this extension. */\n\n/*------------------------------------------------------------------------*\n * QCOM extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_QCOM_alpha_test */\n#ifndef GL_QCOM_alpha_test\n#define GL_ALPHA_TEST_QCOM                                      0x0BC0\n#define GL_ALPHA_TEST_FUNC_QCOM                                 0x0BC1\n#define GL_ALPHA_TEST_REF_QCOM                                  0x0BC2\n#endif\n\n/* GL_QCOM_binning_control */\n#ifndef GL_QCOM_binning_control\n#define GL_BINNING_CONTROL_HINT_QCOM                            0x8FB0\n#define GL_CPU_OPTIMIZED_QCOM                                   0x8FB1\n#define GL_GPU_OPTIMIZED_QCOM                                   0x8FB2\n#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM                    0x8FB3\n#endif\n\n/* GL_QCOM_driver_control */\n/* No new tokens introduced by this extension. */\n\n/* GL_QCOM_extended_get */\n#ifndef GL_QCOM_extended_get\n#define GL_TEXTURE_WIDTH_QCOM                                   0x8BD2\n#define GL_TEXTURE_HEIGHT_QCOM                                  0x8BD3\n#define GL_TEXTURE_DEPTH_QCOM                                   0x8BD4\n#define GL_TEXTURE_INTERNAL_FORMAT_QCOM                         0x8BD5\n#define GL_TEXTURE_FORMAT_QCOM                                  0x8BD6\n#define GL_TEXTURE_TYPE_QCOM                                    0x8BD7\n#define GL_TEXTURE_IMAGE_VALID_QCOM                             0x8BD8\n#define GL_TEXTURE_NUM_LEVELS_QCOM                              0x8BD9\n#define GL_TEXTURE_TARGET_QCOM                                  0x8BDA\n#define GL_TEXTURE_OBJECT_VALID_QCOM                            0x8BDB\n#define GL_STATE_RESTORE                                        0x8BDC\n#endif\n\n/* GL_QCOM_extended_get2 */\n/* No new tokens introduced by this extension. */\n\n/* GL_QCOM_perfmon_global_mode */\n#ifndef GL_QCOM_perfmon_global_mode\n#define GL_PERFMON_GLOBAL_MODE_QCOM                             0x8FA0\n#endif\n\n/* GL_QCOM_writeonly_rendering */\n#ifndef GL_QCOM_writeonly_rendering\n#define GL_WRITEONLY_RENDERING_QCOM                             0x8823\n#endif\n\n/* GL_QCOM_tiled_rendering */\n#ifndef GL_QCOM_tiled_rendering\n#define GL_COLOR_BUFFER_BIT0_QCOM                               0x00000001\n#define GL_COLOR_BUFFER_BIT1_QCOM                               0x00000002\n#define GL_COLOR_BUFFER_BIT2_QCOM                               0x00000004\n#define GL_COLOR_BUFFER_BIT3_QCOM                               0x00000008\n#define GL_COLOR_BUFFER_BIT4_QCOM                               0x00000010\n#define GL_COLOR_BUFFER_BIT5_QCOM                               0x00000020\n#define GL_COLOR_BUFFER_BIT6_QCOM                               0x00000040\n#define GL_COLOR_BUFFER_BIT7_QCOM                               0x00000080\n#define GL_DEPTH_BUFFER_BIT0_QCOM                               0x00000100\n#define GL_DEPTH_BUFFER_BIT1_QCOM                               0x00000200\n#define GL_DEPTH_BUFFER_BIT2_QCOM                               0x00000400\n#define GL_DEPTH_BUFFER_BIT3_QCOM                               0x00000800\n#define GL_DEPTH_BUFFER_BIT4_QCOM                               0x00001000\n#define GL_DEPTH_BUFFER_BIT5_QCOM                               0x00002000\n#define GL_DEPTH_BUFFER_BIT6_QCOM                               0x00004000\n#define GL_DEPTH_BUFFER_BIT7_QCOM                               0x00008000\n#define GL_STENCIL_BUFFER_BIT0_QCOM                             0x00010000\n#define GL_STENCIL_BUFFER_BIT1_QCOM                             0x00020000\n#define GL_STENCIL_BUFFER_BIT2_QCOM                             0x00040000\n#define GL_STENCIL_BUFFER_BIT3_QCOM                             0x00080000\n#define GL_STENCIL_BUFFER_BIT4_QCOM                             0x00100000\n#define GL_STENCIL_BUFFER_BIT5_QCOM                             0x00200000\n#define GL_STENCIL_BUFFER_BIT6_QCOM                             0x00400000\n#define GL_STENCIL_BUFFER_BIT7_QCOM                             0x00800000\n#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM                         0x01000000\n#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM                         0x02000000\n#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM                         0x04000000\n#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM                         0x08000000\n#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM                         0x10000000\n#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM                         0x20000000\n#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM                         0x40000000\n#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM                         0x80000000\n#endif\n\n/*------------------------------------------------------------------------*\n * VIV extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_VIV_shader_binary */\n#ifndef GL_VIV_shader_binary\n#define GL_SHADER_BINARY_VIV                                    0x8FC4\n#endif\n\n/*------------------------------------------------------------------------*\n * End of extension tokens, start of corresponding extension functions\n *------------------------------------------------------------------------*/\n\n/*------------------------------------------------------------------------*\n * OES extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_OES_compressed_ETC1_RGB8_texture */\n#ifndef GL_OES_compressed_ETC1_RGB8_texture\n#define GL_OES_compressed_ETC1_RGB8_texture 1\n#endif\n\n/* GL_OES_compressed_paletted_texture */\n#ifndef GL_OES_compressed_paletted_texture\n#define GL_OES_compressed_paletted_texture 1\n#endif\n\n/* GL_OES_depth24 */\n#ifndef GL_OES_depth24\n#define GL_OES_depth24 1\n#endif\n\n/* GL_OES_depth32 */\n#ifndef GL_OES_depth32\n#define GL_OES_depth32 1\n#endif\n\n/* GL_OES_depth_texture */\n#ifndef GL_OES_depth_texture\n#define GL_OES_depth_texture 1\n#endif\n\n/* GL_OES_EGL_image */\n#ifndef GL_OES_EGL_image\n#define GL_OES_EGL_image 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);\nGL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);\n#endif\ntypedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);\ntypedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);\n#endif\n\n/* GL_OES_EGL_image_external */\n#ifndef GL_OES_EGL_image_external\n#define GL_OES_EGL_image_external 1\n/* glEGLImageTargetTexture2DOES defined in GL_OES_EGL_image already. */\n#endif\n\n/* GL_OES_element_index_uint */\n#ifndef GL_OES_element_index_uint\n#define GL_OES_element_index_uint 1\n#endif\n\n/* GL_OES_fbo_render_mipmap */\n#ifndef GL_OES_fbo_render_mipmap\n#define GL_OES_fbo_render_mipmap 1\n#endif\n\n/* GL_OES_fragment_precision_high */\n#ifndef GL_OES_fragment_precision_high\n#define GL_OES_fragment_precision_high 1\n#endif\n\n/* GL_OES_get_program_binary */\n#ifndef GL_OES_get_program_binary\n#define GL_OES_get_program_binary 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);\nGL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length);\n#endif\ntypedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length);\n#endif\n\n/* GL_OES_mapbuffer */\n#ifndef GL_OES_mapbuffer\n#define GL_OES_mapbuffer 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access);\nGL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target);\nGL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, GLvoid **params);\n#endif\ntypedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access);\ntypedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target);\ntypedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, GLvoid **params);\n#endif\n\n/* GL_OES_packed_depth_stencil */\n#ifndef GL_OES_packed_depth_stencil\n#define GL_OES_packed_depth_stencil 1\n#endif\n\n/* GL_OES_required_internalformat */\n#ifndef GL_OES_required_internalformat\n#define GL_OES_required_internalformat 1\n#endif\n\n/* GL_OES_rgb8_rgba8 */\n#ifndef GL_OES_rgb8_rgba8\n#define GL_OES_rgb8_rgba8 1\n#endif\n\n/* GL_OES_standard_derivatives */\n#ifndef GL_OES_standard_derivatives\n#define GL_OES_standard_derivatives 1\n#endif\n\n/* GL_OES_stencil1 */\n#ifndef GL_OES_stencil1\n#define GL_OES_stencil1 1\n#endif\n\n/* GL_OES_stencil4 */\n#ifndef GL_OES_stencil4\n#define GL_OES_stencil4 1\n#endif\n\n#ifndef GL_OES_surfaceless_context\n#define GL_OES_surfaceless_context 1\n#endif\n\n/* GL_OES_texture_3D */\n#ifndef GL_OES_texture_3D\n#define GL_OES_texture_3D 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);\nGL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);\nGL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);\nGL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);\nGL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\n#endif\ntypedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);\ntypedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);\ntypedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);\ntypedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);\ntypedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\n#endif\n\n/* GL_OES_texture_float */\n#ifndef GL_OES_texture_float\n#define GL_OES_texture_float 1\n#endif\n\n/* GL_OES_texture_float_linear */\n#ifndef GL_OES_texture_float_linear\n#define GL_OES_texture_float_linear 1\n#endif\n\n/* GL_OES_texture_half_float */\n#ifndef GL_OES_texture_half_float\n#define GL_OES_texture_half_float 1\n#endif\n\n/* GL_OES_texture_half_float_linear */\n#ifndef GL_OES_texture_half_float_linear\n#define GL_OES_texture_half_float_linear 1\n#endif\n\n/* GL_OES_texture_npot */\n#ifndef GL_OES_texture_npot\n#define GL_OES_texture_npot 1\n#endif\n\n/* GL_OES_vertex_array_object */\n#ifndef GL_OES_vertex_array_object\n#define GL_OES_vertex_array_object 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array);\nGL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays);\nGL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays);\nGL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array);\n#endif\ntypedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array);\ntypedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays);\ntypedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays);\ntypedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array);\n#endif\n\n/* GL_OES_vertex_half_float */\n#ifndef GL_OES_vertex_half_float\n#define GL_OES_vertex_half_float 1\n#endif\n\n/* GL_OES_vertex_type_10_10_10_2 */\n#ifndef GL_OES_vertex_type_10_10_10_2\n#define GL_OES_vertex_type_10_10_10_2 1\n#endif\n\n/*------------------------------------------------------------------------*\n * KHR extension functions\n *------------------------------------------------------------------------*/\n\n#ifndef GL_KHR_debug\n#define GL_KHR_debug 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glDebugMessageControlKHR (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\nGL_APICALL void GL_APIENTRY glDebugMessageInsertKHR (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\nGL_APICALL void GL_APIENTRY glDebugMessageCallbackKHR (GLDEBUGPROCKHR callback, const void *userParam);\nGL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHR (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\nGL_APICALL void GL_APIENTRY glPushDebugGroupKHR (GLenum source, GLuint id, GLsizei length, const GLchar *message);\nGL_APICALL void GL_APIENTRY glPopDebugGroupKHR (void);\nGL_APICALL void GL_APIENTRY glObjectLabelKHR (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);\nGL_APICALL void GL_APIENTRY glGetObjectLabelKHR (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);\nGL_APICALL void GL_APIENTRY glObjectPtrLabelKHR (const void *ptr, GLsizei length, const GLchar *label);\nGL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHR (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);\nGL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, GLvoid **params);\n#endif\ntypedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\ntypedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\ntypedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam);\ntypedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\ntypedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);\ntypedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void);\ntypedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);\ntypedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);\ntypedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label);\ntypedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);\ntypedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRPROC) (GLenum pname, GLvoid **params);\n#endif\n\n#ifndef GL_KHR_texture_compression_astc_ldr\n#define GL_KHR_texture_compression_astc_ldr 1\n#endif\n\n\n/*------------------------------------------------------------------------*\n * AMD extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_AMD_compressed_3DC_texture */\n#ifndef GL_AMD_compressed_3DC_texture\n#define GL_AMD_compressed_3DC_texture 1\n#endif\n\n/* GL_AMD_compressed_ATC_texture */\n#ifndef GL_AMD_compressed_ATC_texture\n#define GL_AMD_compressed_ATC_texture 1\n#endif\n\n/* AMD_performance_monitor */\n#ifndef GL_AMD_performance_monitor\n#define GL_AMD_performance_monitor 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups);\nGL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);\nGL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);\nGL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);\nGL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data);\nGL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors);\nGL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors);\nGL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList);\nGL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor);\nGL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor);\nGL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);\n#endif\ntypedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups);\ntypedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);\ntypedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);\ntypedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);\ntypedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data);\ntypedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);\ntypedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);\ntypedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList);\ntypedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);\ntypedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);\ntypedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);\n#endif\n\n/* GL_AMD_program_binary_Z400 */\n#ifndef GL_AMD_program_binary_Z400\n#define GL_AMD_program_binary_Z400 1\n#endif\n\n/*------------------------------------------------------------------------*\n * ANGLE extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_ANGLE_depth_texture */\n#ifndef GL_ANGLE_depth_texture\n#define GL_ANGLE_depth_texture 1\n#endif\n\n/* GL_ANGLE_framebuffer_blit */\n#ifndef GL_ANGLE_framebuffer_blit\n#define GL_ANGLE_framebuffer_blit 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n#endif\ntypedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n#endif\n\n/* GL_ANGLE_framebuffer_multisample */\n#ifndef GL_ANGLE_framebuffer_multisample\n#define GL_ANGLE_framebuffer_multisample 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n#endif\ntypedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n#endif\n\n#ifndef GL_ANGLE_instanced_arrays\n#define GL_ANGLE_instanced_arrays 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\nGL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);\nGL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor);\n#endif\ntypedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\ntypedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);\ntypedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor);\n#endif\n\n/* GL_ANGLE_pack_reverse_row_order */\n#ifndef GL_ANGLE_pack_reverse_row_order\n#define GL_ANGLE_pack_reverse_row_order 1\n#endif\n\n/* GL_ANGLE_program_binary */\n#ifndef GL_ANGLE_program_binary\n#define GL_ANGLE_program_binary 1\n#endif\n\n/* GL_ANGLE_texture_compression_dxt3 */\n#ifndef GL_ANGLE_texture_compression_dxt3\n#define GL_ANGLE_texture_compression_dxt3 1\n#endif\n\n/* GL_ANGLE_texture_compression_dxt5 */\n#ifndef GL_ANGLE_texture_compression_dxt5\n#define GL_ANGLE_texture_compression_dxt5 1\n#endif\n\n/* GL_ANGLE_texture_usage */\n#ifndef GL_ANGLE_texture_usage\n#define GL_ANGLE_texture_usage 1\n#endif\n\n#ifndef GL_ANGLE_translated_shader_source\n#define GL_ANGLE_translated_shader_source 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);\n#endif\ntypedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);\n#endif\n\n/*------------------------------------------------------------------------*\n * APPLE extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_APPLE_copy_texture_levels */\n#ifndef GL_APPLE_copy_texture_levels\n#define GL_APPLE_copy_texture_levels 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);\n#endif\ntypedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);\n#endif\n\n/* GL_APPLE_framebuffer_multisample */\n#ifndef GL_APPLE_framebuffer_multisample\n#define GL_APPLE_framebuffer_multisample 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\nGL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void);\n#endif /* GL_GLEXT_PROTOTYPES */\ntypedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void);\n#endif\n\n/* GL_APPLE_rgb_422 */\n#ifndef GL_APPLE_rgb_422\n#define GL_APPLE_rgb_422 1\n#endif\n\n/* GL_APPLE_sync */\n#ifndef GL_APPLE_sync\n#define GL_APPLE_sync 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags);\nGL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync);\nGL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync);\nGL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout);\nGL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout);\nGL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params);\nGL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\n#endif\ntypedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags);\ntypedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync);\ntypedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync);\ntypedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);\ntypedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);\ntypedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params);\ntypedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\n#endif\n\n/* GL_APPLE_texture_format_BGRA8888 */\n#ifndef GL_APPLE_texture_format_BGRA8888\n#define GL_APPLE_texture_format_BGRA8888 1\n#endif\n\n/* GL_APPLE_texture_max_level */\n#ifndef GL_APPLE_texture_max_level\n#define GL_APPLE_texture_max_level 1\n#endif\n\n/*------------------------------------------------------------------------*\n * ARM extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_ARM_mali_program_binary */\n#ifndef GL_ARM_mali_program_binary\n#define GL_ARM_mali_program_binary 1\n#endif\n\n/* GL_ARM_mali_shader_binary */\n#ifndef GL_ARM_mali_shader_binary\n#define GL_ARM_mali_shader_binary 1\n#endif\n\n/* GL_ARM_rgba8 */\n#ifndef GL_ARM_rgba8\n#define GL_ARM_rgba8 1\n#endif\n\n/*------------------------------------------------------------------------*\n * EXT extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_EXT_blend_minmax */\n#ifndef GL_EXT_blend_minmax\n#define GL_EXT_blend_minmax 1\n#endif\n\n/* GL_EXT_color_buffer_half_float */\n#ifndef GL_EXT_color_buffer_half_float\n#define GL_EXT_color_buffer_half_float 1\n#endif\n\n/* GL_EXT_debug_label */\n#ifndef GL_EXT_debug_label\n#define GL_EXT_debug_label 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label);\nGL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);\n#endif\ntypedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label);\ntypedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);\n#endif\n\n/* GL_EXT_debug_marker */\n#ifndef GL_EXT_debug_marker\n#define GL_EXT_debug_marker 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker);\nGL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker);\nGL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void);\n#endif\ntypedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker);\ntypedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker);\ntypedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void);\n#endif\n\n/* GL_EXT_discard_framebuffer */\n#ifndef GL_EXT_discard_framebuffer\n#define GL_EXT_discard_framebuffer 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments);\n#endif\ntypedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);\n#endif\n\n#ifndef GL_EXT_disjoint_timer_query\n#define GL_EXT_disjoint_timer_query 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids);\nGL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids);\nGL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id);\nGL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id);\nGL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target);\nGL_APICALL void GL_APIENTRY glQueryCounterEXT (GLuint id, GLenum target);\nGL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params);\nGL_APICALL void GL_APIENTRY glGetQueryObjectivEXT (GLuint id, GLenum pname, GLint *params);\nGL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params);\nGL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params);\nGL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params);\n#endif\ntypedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids);\ntypedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids);\ntypedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id);\ntypedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id);\ntypedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target);\ntypedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target);\ntypedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params);\ntypedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params);\ntypedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params);\ntypedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params);\n#endif /* GL_EXT_disjoint_timer_query */\n\n#ifndef GL_EXT_draw_buffers\n#define GL_EXT_draw_buffers 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs);\n#endif\ntypedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs);\n#endif /* GL_EXT_draw_buffers */\n\n/* GL_EXT_map_buffer_range */\n#ifndef GL_EXT_map_buffer_range\n#define GL_EXT_map_buffer_range 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void* GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\nGL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length);\n#endif\ntypedef void* (GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\ntypedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length);\n#endif\n\n/* GL_EXT_multisampled_render_to_texture */\n#ifndef GL_EXT_multisampled_render_to_texture\n#define GL_EXT_multisampled_render_to_texture 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);             \nGL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);\n#endif\ntypedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);\n#endif\n\n/* GL_EXT_multiview_draw_buffers */\n#ifndef GL_EXT_multiview_draw_buffers\n#define GL_EXT_multiview_draw_buffers 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index);\nGL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices);\nGL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data);\n#endif\ntypedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index);\ntypedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices);\ntypedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data);\n#endif\n\n#ifndef GL_EXT_multi_draw_arrays\n#define GL_EXT_multi_draw_arrays 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);\nGL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount);\n#endif /* GL_GLEXT_PROTOTYPES */\ntypedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);\ntypedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount);\n#endif\n\n/* GL_EXT_occlusion_query_boolean */\n#ifndef GL_EXT_occlusion_query_boolean\n#define GL_EXT_occlusion_query_boolean 1\n/* All entry points also exist in GL_EXT_disjoint_timer_query */\n#endif\n\n/* GL_EXT_read_format_bgra */\n#ifndef GL_EXT_read_format_bgra\n#define GL_EXT_read_format_bgra 1\n#endif\n\n/* GL_EXT_robustness */\n#ifndef GL_EXT_robustness\n#define GL_EXT_robustness 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void);\nGL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);\nGL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);\nGL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params);\n#endif\ntypedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void);\ntypedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);\ntypedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);\ntypedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);\n#endif\n\n/* GL_EXT_separate_shader_objects */\n#ifndef GL_EXT_separate_shader_objects\n#define GL_EXT_separate_shader_objects 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program);\nGL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program);\nGL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings);\nGL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline);\nGL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines);\nGL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines);\nGL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline);\nGL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value);\nGL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params);\nGL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint x);\nGL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint x, GLint y);\nGL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z);\nGL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);\nGL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat x);\nGL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat x, GLfloat y);\nGL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);\nGL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\nGL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\nGL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\nGL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\nGL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline);\nGL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\n#endif\ntypedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program);\ntypedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program);\ntypedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings);\ntypedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline);\ntypedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines);\ntypedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines);\ntypedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);\ntypedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint x);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint x, GLint y);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat x);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline);\ntypedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\n#endif\n\n/* GL_EXT_shader_framebuffer_fetch */\n#ifndef GL_EXT_shader_framebuffer_fetch\n#define GL_EXT_shader_framebuffer_fetch 1\n#endif\n\n/* GL_EXT_shader_texture_lod */\n#ifndef GL_EXT_shader_texture_lod\n#define GL_EXT_shader_texture_lod 1\n#endif\n\n/* GL_EXT_shadow_samplers */\n#ifndef GL_EXT_shadow_samplers\n#define GL_EXT_shadow_samplers 1\n#endif\n\n/* GL_EXT_sRGB */\n#ifndef GL_EXT_sRGB\n#define GL_EXT_sRGB 1\n#endif\n\n/* GL_EXT_texture_compression_dxt1 */\n#ifndef GL_EXT_texture_compression_dxt1\n#define GL_EXT_texture_compression_dxt1 1\n#endif\n\n/* GL_EXT_texture_filter_anisotropic */\n#ifndef GL_EXT_texture_filter_anisotropic\n#define GL_EXT_texture_filter_anisotropic 1\n#endif\n\n/* GL_EXT_texture_format_BGRA8888 */\n#ifndef GL_EXT_texture_format_BGRA8888\n#define GL_EXT_texture_format_BGRA8888 1\n#endif\n\n/* GL_EXT_texture_rg */\n#ifndef GL_EXT_texture_rg\n#define GL_EXT_texture_rg 1\n#endif\n\n/* GL_EXT_texture_storage */\n#ifndef GL_EXT_texture_storage\n#define GL_EXT_texture_storage 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\nGL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\nGL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\nGL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\nGL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\nGL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\n#endif\ntypedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\ntypedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\ntypedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\ntypedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\n#endif\n\n/* GL_EXT_texture_type_2_10_10_10_REV */\n#ifndef GL_EXT_texture_type_2_10_10_10_REV\n#define GL_EXT_texture_type_2_10_10_10_REV 1\n#endif\n\n/* GL_EXT_unpack_subimage */\n#ifndef GL_EXT_unpack_subimage\n#define GL_EXT_unpack_subimage 1\n#endif\n\n/*------------------------------------------------------------------------*\n * DMP extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_DMP_shader_binary */\n#ifndef GL_DMP_shader_binary\n#define GL_DMP_shader_binary 1\n#endif\n\n/*------------------------------------------------------------------------*\n * FJ extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_FJ_shader_binary_GCCSO */\n#ifndef GL_FJ_shader_binary_GCCSO\n#define GL_FJ_shader_binary_GCCSO 1\n#endif\n\n/*------------------------------------------------------------------------*\n * IMG extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_IMG_program_binary */\n#ifndef GL_IMG_program_binary\n#define GL_IMG_program_binary 1\n#endif\n\n/* GL_IMG_read_format */\n#ifndef GL_IMG_read_format\n#define GL_IMG_read_format 1\n#endif\n\n/* GL_IMG_shader_binary */\n#ifndef GL_IMG_shader_binary\n#define GL_IMG_shader_binary 1\n#endif\n\n/* GL_IMG_texture_compression_pvrtc */\n#ifndef GL_IMG_texture_compression_pvrtc\n#define GL_IMG_texture_compression_pvrtc 1\n#endif\n\n/* GL_IMG_texture_compression_pvrtc2 */\n#ifndef GL_IMG_texture_compression_pvrtc2\n#define GL_IMG_texture_compression_pvrtc2 1\n#endif\n\n/* GL_IMG_multisampled_render_to_texture */\n#ifndef GL_IMG_multisampled_render_to_texture\n#define GL_IMG_multisampled_render_to_texture 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\nGL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);\n#endif\ntypedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);\n#endif\n\n/*------------------------------------------------------------------------*\n * NV extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_NV_coverage_sample */\n#ifndef GL_NV_coverage_sample\n#define GL_NV_coverage_sample 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask);\nGL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation);\n#endif\ntypedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask);\ntypedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation);\n#endif\n\n/* GL_NV_depth_nonlinear */\n#ifndef GL_NV_depth_nonlinear\n#define GL_NV_depth_nonlinear 1\n#endif\n\n/* GL_NV_draw_buffers */\n#ifndef GL_NV_draw_buffers\n#define GL_NV_draw_buffers 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs);\n#endif\ntypedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs);\n#endif\n\n/* GL_NV_draw_instanced */\n#ifndef GL_NV_draw_instanced\n#define GL_NV_draw_instanced 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glDrawArraysInstancedNV (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\nGL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);\n#endif\ntypedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\ntypedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);\n#endif\n\n/* GL_NV_fbo_color_attachments */\n#ifndef GL_NV_fbo_color_attachments\n#define GL_NV_fbo_color_attachments 1\n#endif\n\n/* GL_NV_fence */\n#ifndef GL_NV_fence\n#define GL_NV_fence 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences);\nGL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences);\nGL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint fence);\nGL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint fence);\nGL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params);\nGL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint fence);\nGL_APICALL void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition);\n#endif\ntypedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences);\ntypedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences);\ntypedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence);\ntypedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence);\ntypedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params);\ntypedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence);\ntypedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);\n#endif\n\n/* GL_NV_framebuffer_blit */\n#ifndef GL_NV_framebuffer_blit\n#define GL_NV_framebuffer_blit 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glBlitFramebufferNV (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n#endif\ntypedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n#endif\n\n/* GL_NV_framebuffer_multisample */\n#ifndef GL_NV_framebuffer_multisample\n#define GL_NV_framebuffer_multisample 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV ( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n#endif\ntypedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) ( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n#endif\n\n/* GL_NV_generate_mipmap_sRGB */\n#ifndef GL_NV_generate_mipmap_sRGB\n#define GL_NV_generate_mipmap_sRGB 1\n#endif\n\n/* GL_NV_instanced_arrays */\n#ifndef GL_NV_instanced_arrays\n#define GL_NV_instanced_arrays 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glVertexAttribDivisorNV (GLuint index, GLuint divisor);\n#endif\ntypedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor);\n#endif\n\n/* GL_NV_read_buffer */\n#ifndef GL_NV_read_buffer\n#define GL_NV_read_buffer 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode);\n#endif\ntypedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode);\n#endif\n\n/* GL_NV_read_buffer_front */\n#ifndef GL_NV_read_buffer_front\n#define GL_NV_read_buffer_front 1\n#endif\n\n/* GL_NV_read_depth */\n#ifndef GL_NV_read_depth\n#define GL_NV_read_depth 1\n#endif\n\n/* GL_NV_read_depth_stencil */\n#ifndef GL_NV_read_depth_stencil\n#define GL_NV_read_depth_stencil 1\n#endif\n\n/* GL_NV_read_stencil */\n#ifndef GL_NV_read_stencil\n#define GL_NV_read_stencil 1\n#endif\n\n/* GL_NV_shadow_samplers_array */\n#ifndef GL_NV_shadow_samplers_array\n#define GL_NV_shadow_samplers_array 1\n#endif\n\n/* GL_NV_shadow_samplers_cube */\n#ifndef GL_NV_shadow_samplers_cube\n#define GL_NV_shadow_samplers_cube 1\n#endif\n\n/* GL_NV_sRGB_formats */\n#ifndef GL_NV_sRGB_formats\n#define GL_NV_sRGB_formats 1\n#endif\n\n/* GL_NV_texture_border_clamp */\n#ifndef GL_NV_texture_border_clamp\n#define GL_NV_texture_border_clamp 1\n#endif\n\n/* GL_NV_texture_compression_s3tc_update */\n#ifndef GL_NV_texture_compression_s3tc_update\n#define GL_NV_texture_compression_s3tc_update 1\n#endif\n\n/* GL_NV_texture_npot_2D_mipmap */\n#ifndef GL_NV_texture_npot_2D_mipmap\n#define GL_NV_texture_npot_2D_mipmap 1\n#endif\n\n/*------------------------------------------------------------------------*\n * QCOM extension functions\n *------------------------------------------------------------------------*/\n\n/* GL_QCOM_alpha_test */\n#ifndef GL_QCOM_alpha_test\n#define GL_QCOM_alpha_test 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref);\n#endif\ntypedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref);\n#endif\n\n/* GL_QCOM_binning_control */\n#ifndef GL_QCOM_binning_control\n#define GL_QCOM_binning_control 1\n#endif\n\n/* GL_QCOM_driver_control */\n#ifndef GL_QCOM_driver_control\n#define GL_QCOM_driver_control 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls);\nGL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);\nGL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl);\nGL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl);\n#endif\ntypedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls);\ntypedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);\ntypedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);\ntypedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);\n#endif\n\n/* GL_QCOM_extended_get */\n#ifndef GL_QCOM_extended_get\n#define GL_QCOM_extended_get 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures);\nGL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);\nGL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);\nGL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);\nGL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);\nGL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param);\nGL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels);\nGL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, GLvoid **params);\n#endif\ntypedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures);\ntypedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);\ntypedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);\ntypedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);\ntypedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);\ntypedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param);\ntypedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels);\ntypedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, GLvoid **params);\n#endif\n\n/* GL_QCOM_extended_get2 */\n#ifndef GL_QCOM_extended_get2\n#define GL_QCOM_extended_get2 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders);\nGL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms);\nGL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program);\nGL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length);\n#endif\ntypedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders);\ntypedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms);\ntypedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program);\ntypedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length);\n#endif\n\n/* GL_QCOM_perfmon_global_mode */\n#ifndef GL_QCOM_perfmon_global_mode\n#define GL_QCOM_perfmon_global_mode 1\n#endif\n\n/* GL_QCOM_writeonly_rendering */\n#ifndef GL_QCOM_writeonly_rendering\n#define GL_QCOM_writeonly_rendering 1\n#endif\n\n/* GL_QCOM_tiled_rendering */\n#ifndef GL_QCOM_tiled_rendering\n#define GL_QCOM_tiled_rendering 1\n#ifdef GL_GLEXT_PROTOTYPES\nGL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);\nGL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask);\n#endif\ntypedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);\ntypedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask);\n#endif\n\n/*------------------------------------------------------------------------*\n * VIV extension tokens\n *------------------------------------------------------------------------*/\n\n/* GL_VIV_shader_binary */\n#ifndef GL_VIV_shader_binary\n#define GL_VIV_shader_binary 1\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __gl2ext_h_ */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_opengles2_gl2platform.h",
    "content": "#ifndef __gl2platform_h_\n#define __gl2platform_h_\n\n/* $Revision: 10602 $ on $Date:: 2010-03-04 22:35:34 -0800 #$ */\n\n/*\n * This document is licensed under the SGI Free Software B License Version\n * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .\n */\n\n/* Platform-specific types and definitions for OpenGL ES 2.X  gl2.h\n *\n * Adopters may modify khrplatform.h and this file to suit their platform.\n * You are encouraged to submit all modifications to the Khronos group so that\n * they can be included in future versions of this file.  Please submit changes\n * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)\n * by filing a bug against product \"OpenGL-ES\" component \"Registry\".\n */\n\n/*#include <KHR/khrplatform.h>*/\n\n#ifndef GL_APICALL\n#define GL_APICALL  KHRONOS_APICALL\n#endif\n\n#ifndef GL_APIENTRY\n#define GL_APIENTRY KHRONOS_APIENTRY\n#endif\n\n#endif /* __gl2platform_h_ */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_opengles2_khrplatform.h",
    "content": "#ifndef __khrplatform_h_\n#define __khrplatform_h_\n\n/*\n** Copyright (c) 2008-2009 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n/* Khronos platform-specific types and definitions.\n *\n * $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $\n *\n * Adopters may modify this file to suit their platform. Adopters are\n * encouraged to submit platform specific modifications to the Khronos\n * group so that they can be included in future versions of this file.\n * Please submit changes by sending them to the public Khronos Bugzilla\n * (http://khronos.org/bugzilla) by filing a bug against product\n * \"Khronos (general)\" component \"Registry\".\n *\n * A predefined template which fills in some of the bug fields can be\n * reached using http://tinyurl.com/khrplatform-h-bugreport, but you\n * must create a Bugzilla login first.\n *\n *\n * See the Implementer's Guidelines for information about where this file\n * should be located on your system and for more details of its use:\n *    http://www.khronos.org/registry/implementers_guide.pdf\n *\n * This file should be included as\n *        #include <KHR/khrplatform.h>\n * by Khronos client API header files that use its types and defines.\n *\n * The types in khrplatform.h should only be used to define API-specific types.\n *\n * Types defined in khrplatform.h:\n *    khronos_int8_t              signed   8  bit\n *    khronos_uint8_t             unsigned 8  bit\n *    khronos_int16_t             signed   16 bit\n *    khronos_uint16_t            unsigned 16 bit\n *    khronos_int32_t             signed   32 bit\n *    khronos_uint32_t            unsigned 32 bit\n *    khronos_int64_t             signed   64 bit\n *    khronos_uint64_t            unsigned 64 bit\n *    khronos_intptr_t            signed   same number of bits as a pointer\n *    khronos_uintptr_t           unsigned same number of bits as a pointer\n *    khronos_ssize_t             signed   size\n *    khronos_usize_t             unsigned size\n *    khronos_float_t             signed   32 bit floating point\n *    khronos_time_ns_t           unsigned 64 bit time in nanoseconds\n *    khronos_utime_nanoseconds_t unsigned time interval or absolute time in\n *                                         nanoseconds\n *    khronos_stime_nanoseconds_t signed time interval in nanoseconds\n *    khronos_boolean_enum_t      enumerated boolean type. This should\n *      only be used as a base type when a client API's boolean type is\n *      an enum. Client APIs which use an integer or other type for\n *      booleans cannot use this as the base type for their boolean.\n *\n * Tokens defined in khrplatform.h:\n *\n *    KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.\n *\n *    KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.\n *    KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.\n *\n * Calling convention macros defined in this file:\n *    KHRONOS_APICALL\n *    KHRONOS_APIENTRY\n *    KHRONOS_APIATTRIBUTES\n *\n * These may be used in function prototypes as:\n *\n *      KHRONOS_APICALL void KHRONOS_APIENTRY funcname(\n *                                  int arg1,\n *                                  int arg2) KHRONOS_APIATTRIBUTES;\n */\n\n/*-------------------------------------------------------------------------\n * Definition of KHRONOS_APICALL\n *-------------------------------------------------------------------------\n * This precedes the return type of the function in the function prototype.\n */\n#if defined(_WIN32) && !defined(__SCITECH_SNAP__)\n#   define KHRONOS_APICALL __declspec(dllimport)\n#elif defined (__SYMBIAN32__)\n#   define KHRONOS_APICALL IMPORT_C\n#else\n#   define KHRONOS_APICALL\n#endif\n\n/*-------------------------------------------------------------------------\n * Definition of KHRONOS_APIENTRY\n *-------------------------------------------------------------------------\n * This follows the return type of the function  and precedes the function\n * name in the function prototype.\n */\n#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)\n    /* Win32 but not WinCE */\n#   define KHRONOS_APIENTRY __stdcall\n#else\n#   define KHRONOS_APIENTRY\n#endif\n\n/*-------------------------------------------------------------------------\n * Definition of KHRONOS_APIATTRIBUTES\n *-------------------------------------------------------------------------\n * This follows the closing parenthesis of the function prototype arguments.\n */\n#if defined (__ARMCC_2__)\n#define KHRONOS_APIATTRIBUTES __softfp\n#else\n#define KHRONOS_APIATTRIBUTES\n#endif\n\n/*-------------------------------------------------------------------------\n * basic type definitions\n *-----------------------------------------------------------------------*/\n#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)\n\n\n/*\n * Using <stdint.h>\n */\n#include <stdint.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(__VMS ) || defined(__sgi)\n\n/*\n * Using <inttypes.h>\n */\n#include <inttypes.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)\n\n/*\n * Win32\n */\ntypedef __int32                 khronos_int32_t;\ntypedef unsigned __int32        khronos_uint32_t;\ntypedef __int64                 khronos_int64_t;\ntypedef unsigned __int64        khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(__sun__) || defined(__digital__)\n\n/*\n * Sun or Digital\n */\ntypedef int                     khronos_int32_t;\ntypedef unsigned int            khronos_uint32_t;\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int                khronos_int64_t;\ntypedef unsigned long int       khronos_uint64_t;\n#else\ntypedef long long int           khronos_int64_t;\ntypedef unsigned long long int  khronos_uint64_t;\n#endif /* __arch64__ */\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif 0\n\n/*\n * Hypothetical platform with no float or int64 support\n */\ntypedef int                     khronos_int32_t;\ntypedef unsigned int            khronos_uint32_t;\n#define KHRONOS_SUPPORT_INT64   0\n#define KHRONOS_SUPPORT_FLOAT   0\n\n#else\n\n/*\n * Generic fallback\n */\n#include <stdint.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#endif\n\n\n/*\n * Types that are (so far) the same on all platforms\n */\ntypedef signed   char          khronos_int8_t;\ntypedef unsigned char          khronos_uint8_t;\ntypedef signed   short int     khronos_int16_t;\ntypedef unsigned short int     khronos_uint16_t;\n\n/*\n * Types that differ between LLP64 and LP64 architectures - in LLP64, \n * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears\n * to be the only LLP64 architecture in current use.\n */\n#ifdef _WIN64\ntypedef signed   long long int khronos_intptr_t;\ntypedef unsigned long long int khronos_uintptr_t;\ntypedef signed   long long int khronos_ssize_t;\ntypedef unsigned long long int khronos_usize_t;\n#else\ntypedef signed   long  int     khronos_intptr_t;\ntypedef unsigned long  int     khronos_uintptr_t;\ntypedef signed   long  int     khronos_ssize_t;\ntypedef unsigned long  int     khronos_usize_t;\n#endif\n\n#if KHRONOS_SUPPORT_FLOAT\n/*\n * Float type\n */\ntypedef          float         khronos_float_t;\n#endif\n\n#if KHRONOS_SUPPORT_INT64\n/* Time types\n *\n * These types can be used to represent a time interval in nanoseconds or\n * an absolute Unadjusted System Time.  Unadjusted System Time is the number\n * of nanoseconds since some arbitrary system event (e.g. since the last\n * time the system booted).  The Unadjusted System Time is an unsigned\n * 64 bit value that wraps back to 0 every 584 years.  Time intervals\n * may be either signed or unsigned.\n */\ntypedef khronos_uint64_t       khronos_utime_nanoseconds_t;\ntypedef khronos_int64_t        khronos_stime_nanoseconds_t;\n#endif\n\n/*\n * Dummy value used to pad enum types to 32 bits.\n */\n#ifndef KHRONOS_MAX_ENUM\n#define KHRONOS_MAX_ENUM 0x7FFFFFFF\n#endif\n\n/*\n * Enumerated boolean type\n *\n * Values other than zero should be considered to be true.  Therefore\n * comparisons should not be made against KHRONOS_TRUE.\n */\ntypedef enum {\n    KHRONOS_FALSE = 0,\n    KHRONOS_TRUE  = 1,\n    KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM\n} khronos_boolean_enum_t;\n\n#endif /* __khrplatform_h_ */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_pixels.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_pixels.h\n *\n *  Header for the enumerated pixel format definitions.\n */\n\n#ifndef _SDL_pixels_h\n#define _SDL_pixels_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_endian.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\name Transparency definitions\n *\n *  These define alpha as the opacity of a surface.\n */\n/* @{ */\n#define SDL_ALPHA_OPAQUE 255\n#define SDL_ALPHA_TRANSPARENT 0\n/* @} */\n\n/** Pixel type. */\nenum\n{\n    SDL_PIXELTYPE_UNKNOWN,\n    SDL_PIXELTYPE_INDEX1,\n    SDL_PIXELTYPE_INDEX4,\n    SDL_PIXELTYPE_INDEX8,\n    SDL_PIXELTYPE_PACKED8,\n    SDL_PIXELTYPE_PACKED16,\n    SDL_PIXELTYPE_PACKED32,\n    SDL_PIXELTYPE_ARRAYU8,\n    SDL_PIXELTYPE_ARRAYU16,\n    SDL_PIXELTYPE_ARRAYU32,\n    SDL_PIXELTYPE_ARRAYF16,\n    SDL_PIXELTYPE_ARRAYF32\n};\n\n/** Bitmap pixel order, high bit -> low bit. */\nenum\n{\n    SDL_BITMAPORDER_NONE,\n    SDL_BITMAPORDER_4321,\n    SDL_BITMAPORDER_1234\n};\n\n/** Packed component order, high bit -> low bit. */\nenum\n{\n    SDL_PACKEDORDER_NONE,\n    SDL_PACKEDORDER_XRGB,\n    SDL_PACKEDORDER_RGBX,\n    SDL_PACKEDORDER_ARGB,\n    SDL_PACKEDORDER_RGBA,\n    SDL_PACKEDORDER_XBGR,\n    SDL_PACKEDORDER_BGRX,\n    SDL_PACKEDORDER_ABGR,\n    SDL_PACKEDORDER_BGRA\n};\n\n/** Array component order, low byte -> high byte. */\n/* !!! FIXME: in 2.1, make these not overlap differently with\n   !!! FIXME:  SDL_PACKEDORDER_*, so we can simplify SDL_ISPIXELFORMAT_ALPHA */\nenum\n{\n    SDL_ARRAYORDER_NONE,\n    SDL_ARRAYORDER_RGB,\n    SDL_ARRAYORDER_RGBA,\n    SDL_ARRAYORDER_ARGB,\n    SDL_ARRAYORDER_BGR,\n    SDL_ARRAYORDER_BGRA,\n    SDL_ARRAYORDER_ABGR\n};\n\n/** Packed component layout. */\nenum\n{\n    SDL_PACKEDLAYOUT_NONE,\n    SDL_PACKEDLAYOUT_332,\n    SDL_PACKEDLAYOUT_4444,\n    SDL_PACKEDLAYOUT_1555,\n    SDL_PACKEDLAYOUT_5551,\n    SDL_PACKEDLAYOUT_565,\n    SDL_PACKEDLAYOUT_8888,\n    SDL_PACKEDLAYOUT_2101010,\n    SDL_PACKEDLAYOUT_1010102\n};\n\n#define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D)\n\n#define SDL_DEFINE_PIXELFORMAT(type, order, layout, bits, bytes) \\\n    ((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \\\n     ((bits) << 8) | ((bytes) << 0))\n\n#define SDL_PIXELFLAG(X)    (((X) >> 28) & 0x0F)\n#define SDL_PIXELTYPE(X)    (((X) >> 24) & 0x0F)\n#define SDL_PIXELORDER(X)   (((X) >> 20) & 0x0F)\n#define SDL_PIXELLAYOUT(X)  (((X) >> 16) & 0x0F)\n#define SDL_BITSPERPIXEL(X) (((X) >> 8) & 0xFF)\n#define SDL_BYTESPERPIXEL(X) \\\n    (SDL_ISPIXELFORMAT_FOURCC(X) ? \\\n        ((((X) == SDL_PIXELFORMAT_YUY2) || \\\n          ((X) == SDL_PIXELFORMAT_UYVY) || \\\n          ((X) == SDL_PIXELFORMAT_YVYU)) ? 2 : 1) : (((X) >> 0) & 0xFF))\n\n#define SDL_ISPIXELFORMAT_INDEXED(format)   \\\n    (!SDL_ISPIXELFORMAT_FOURCC(format) && \\\n     ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \\\n      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \\\n      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8)))\n\n#define SDL_ISPIXELFORMAT_PACKED(format) \\\n    (!SDL_ISPIXELFORMAT_FOURCC(format) && \\\n     ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED8) || \\\n      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED16) || \\\n      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32)))\n\n#define SDL_ISPIXELFORMAT_ARRAY(format) \\\n    (!SDL_ISPIXELFORMAT_FOURCC(format) && \\\n     ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8) || \\\n      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU16) || \\\n      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU32) || \\\n      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) || \\\n      (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32)))\n\n#define SDL_ISPIXELFORMAT_ALPHA(format)   \\\n    ((SDL_ISPIXELFORMAT_PACKED(format) && \\\n     ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \\\n      (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \\\n      (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \\\n      (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) || \\\n    (SDL_ISPIXELFORMAT_ARRAY(format) && \\\n     ((SDL_PIXELORDER(format) == SDL_ARRAYORDER_ARGB) || \\\n      (SDL_PIXELORDER(format) == SDL_ARRAYORDER_RGBA) || \\\n      (SDL_PIXELORDER(format) == SDL_ARRAYORDER_ABGR) || \\\n      (SDL_PIXELORDER(format) == SDL_ARRAYORDER_BGRA))))\n\n/* The flag is set to 1 because 0x1? is not in the printable ASCII range */\n#define SDL_ISPIXELFORMAT_FOURCC(format)    \\\n    ((format) && (SDL_PIXELFLAG(format) != 1))\n\n/* Note: If you modify this list, update SDL_GetPixelFormatName() */\nenum\n{\n    SDL_PIXELFORMAT_UNKNOWN,\n    SDL_PIXELFORMAT_INDEX1LSB =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_4321, 0,\n                               1, 0),\n    SDL_PIXELFORMAT_INDEX1MSB =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_1234, 0,\n                               1, 0),\n    SDL_PIXELFORMAT_INDEX4LSB =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_4321, 0,\n                               4, 0),\n    SDL_PIXELFORMAT_INDEX4MSB =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_1234, 0,\n                               4, 0),\n    SDL_PIXELFORMAT_INDEX8 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX8, 0, 0, 8, 1),\n    SDL_PIXELFORMAT_RGB332 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED8, SDL_PACKEDORDER_XRGB,\n                               SDL_PACKEDLAYOUT_332, 8, 1),\n    SDL_PIXELFORMAT_RGB444 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB,\n                               SDL_PACKEDLAYOUT_4444, 12, 2),\n    SDL_PIXELFORMAT_RGB555 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB,\n                               SDL_PACKEDLAYOUT_1555, 15, 2),\n    SDL_PIXELFORMAT_BGR555 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR,\n                               SDL_PACKEDLAYOUT_1555, 15, 2),\n    SDL_PIXELFORMAT_ARGB4444 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB,\n                               SDL_PACKEDLAYOUT_4444, 16, 2),\n    SDL_PIXELFORMAT_RGBA4444 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA,\n                               SDL_PACKEDLAYOUT_4444, 16, 2),\n    SDL_PIXELFORMAT_ABGR4444 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR,\n                               SDL_PACKEDLAYOUT_4444, 16, 2),\n    SDL_PIXELFORMAT_BGRA4444 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA,\n                               SDL_PACKEDLAYOUT_4444, 16, 2),\n    SDL_PIXELFORMAT_ARGB1555 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB,\n                               SDL_PACKEDLAYOUT_1555, 16, 2),\n    SDL_PIXELFORMAT_RGBA5551 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA,\n                               SDL_PACKEDLAYOUT_5551, 16, 2),\n    SDL_PIXELFORMAT_ABGR1555 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR,\n                               SDL_PACKEDLAYOUT_1555, 16, 2),\n    SDL_PIXELFORMAT_BGRA5551 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA,\n                               SDL_PACKEDLAYOUT_5551, 16, 2),\n    SDL_PIXELFORMAT_RGB565 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB,\n                               SDL_PACKEDLAYOUT_565, 16, 2),\n    SDL_PIXELFORMAT_BGR565 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR,\n                               SDL_PACKEDLAYOUT_565, 16, 2),\n    SDL_PIXELFORMAT_RGB24 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_RGB, 0,\n                               24, 3),\n    SDL_PIXELFORMAT_BGR24 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_BGR, 0,\n                               24, 3),\n    SDL_PIXELFORMAT_RGB888 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XRGB,\n                               SDL_PACKEDLAYOUT_8888, 24, 4),\n    SDL_PIXELFORMAT_RGBX8888 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBX,\n                               SDL_PACKEDLAYOUT_8888, 24, 4),\n    SDL_PIXELFORMAT_BGR888 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XBGR,\n                               SDL_PACKEDLAYOUT_8888, 24, 4),\n    SDL_PIXELFORMAT_BGRX8888 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRX,\n                               SDL_PACKEDLAYOUT_8888, 24, 4),\n    SDL_PIXELFORMAT_ARGB8888 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB,\n                               SDL_PACKEDLAYOUT_8888, 32, 4),\n    SDL_PIXELFORMAT_RGBA8888 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA,\n                               SDL_PACKEDLAYOUT_8888, 32, 4),\n    SDL_PIXELFORMAT_ABGR8888 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR,\n                               SDL_PACKEDLAYOUT_8888, 32, 4),\n    SDL_PIXELFORMAT_BGRA8888 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRA,\n                               SDL_PACKEDLAYOUT_8888, 32, 4),\n    SDL_PIXELFORMAT_ARGB2101010 =\n        SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB,\n                               SDL_PACKEDLAYOUT_2101010, 32, 4),\n\n    /* Aliases for RGBA byte arrays of color data, for the current platform */\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n    SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_RGBA8888,\n    SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_ARGB8888,\n    SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_BGRA8888,\n    SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_ABGR8888,\n#else\n    SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_ABGR8888,\n    SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_BGRA8888,\n    SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_ARGB8888,\n    SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_RGBA8888,\n#endif\n\n    SDL_PIXELFORMAT_YV12 =      /**< Planar mode: Y + V + U  (3 planes) */\n        SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'),\n    SDL_PIXELFORMAT_IYUV =      /**< Planar mode: Y + U + V  (3 planes) */\n        SDL_DEFINE_PIXELFOURCC('I', 'Y', 'U', 'V'),\n    SDL_PIXELFORMAT_YUY2 =      /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */\n        SDL_DEFINE_PIXELFOURCC('Y', 'U', 'Y', '2'),\n    SDL_PIXELFORMAT_UYVY =      /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */\n        SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'),\n    SDL_PIXELFORMAT_YVYU =      /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */\n        SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U'),\n    SDL_PIXELFORMAT_NV12 =      /**< Planar mode: Y + U/V interleaved  (2 planes) */\n        SDL_DEFINE_PIXELFOURCC('N', 'V', '1', '2'),\n    SDL_PIXELFORMAT_NV21 =      /**< Planar mode: Y + V/U interleaved  (2 planes) */\n        SDL_DEFINE_PIXELFOURCC('N', 'V', '2', '1')\n};\n\ntypedef struct SDL_Color\n{\n    Uint8 r;\n    Uint8 g;\n    Uint8 b;\n    Uint8 a;\n} SDL_Color;\n#define SDL_Colour SDL_Color\n\ntypedef struct SDL_Palette\n{\n    int ncolors;\n    SDL_Color *colors;\n    Uint32 version;\n    int refcount;\n} SDL_Palette;\n\n/**\n *  \\note Everything in the pixel format structure is read-only.\n */\ntypedef struct SDL_PixelFormat\n{\n    Uint32 format;\n    SDL_Palette *palette;\n    Uint8 BitsPerPixel;\n    Uint8 BytesPerPixel;\n    Uint8 padding[2];\n    Uint32 Rmask;\n    Uint32 Gmask;\n    Uint32 Bmask;\n    Uint32 Amask;\n    Uint8 Rloss;\n    Uint8 Gloss;\n    Uint8 Bloss;\n    Uint8 Aloss;\n    Uint8 Rshift;\n    Uint8 Gshift;\n    Uint8 Bshift;\n    Uint8 Ashift;\n    int refcount;\n    struct SDL_PixelFormat *next;\n} SDL_PixelFormat;\n\n/**\n * \\brief Get the human readable name of a pixel format\n */\nextern DECLSPEC const char* SDLCALL SDL_GetPixelFormatName(Uint32 format);\n\n/**\n *  \\brief Convert one of the enumerated pixel formats to a bpp and RGBA masks.\n *\n *  \\return SDL_TRUE, or SDL_FALSE if the conversion wasn't possible.\n *\n *  \\sa SDL_MasksToPixelFormatEnum()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_PixelFormatEnumToMasks(Uint32 format,\n                                                            int *bpp,\n                                                            Uint32 * Rmask,\n                                                            Uint32 * Gmask,\n                                                            Uint32 * Bmask,\n                                                            Uint32 * Amask);\n\n/**\n *  \\brief Convert a bpp and RGBA masks to an enumerated pixel format.\n *\n *  \\return The pixel format, or ::SDL_PIXELFORMAT_UNKNOWN if the conversion\n *          wasn't possible.\n *\n *  \\sa SDL_PixelFormatEnumToMasks()\n */\nextern DECLSPEC Uint32 SDLCALL SDL_MasksToPixelFormatEnum(int bpp,\n                                                          Uint32 Rmask,\n                                                          Uint32 Gmask,\n                                                          Uint32 Bmask,\n                                                          Uint32 Amask);\n\n/**\n *  \\brief Create an SDL_PixelFormat structure from a pixel format enum.\n */\nextern DECLSPEC SDL_PixelFormat * SDLCALL SDL_AllocFormat(Uint32 pixel_format);\n\n/**\n *  \\brief Free an SDL_PixelFormat structure.\n */\nextern DECLSPEC void SDLCALL SDL_FreeFormat(SDL_PixelFormat *format);\n\n/**\n *  \\brief Create a palette structure with the specified number of color\n *         entries.\n *\n *  \\return A new palette, or NULL if there wasn't enough memory.\n *\n *  \\note The palette entries are initialized to white.\n *\n *  \\sa SDL_FreePalette()\n */\nextern DECLSPEC SDL_Palette *SDLCALL SDL_AllocPalette(int ncolors);\n\n/**\n *  \\brief Set the palette for a pixel format structure.\n */\nextern DECLSPEC int SDLCALL SDL_SetPixelFormatPalette(SDL_PixelFormat * format,\n                                                      SDL_Palette *palette);\n\n/**\n *  \\brief Set a range of colors in a palette.\n *\n *  \\param palette    The palette to modify.\n *  \\param colors     An array of colors to copy into the palette.\n *  \\param firstcolor The index of the first palette entry to modify.\n *  \\param ncolors    The number of entries to modify.\n *\n *  \\return 0 on success, or -1 if not all of the colors could be set.\n */\nextern DECLSPEC int SDLCALL SDL_SetPaletteColors(SDL_Palette * palette,\n                                                 const SDL_Color * colors,\n                                                 int firstcolor, int ncolors);\n\n/**\n *  \\brief Free a palette created with SDL_AllocPalette().\n *\n *  \\sa SDL_AllocPalette()\n */\nextern DECLSPEC void SDLCALL SDL_FreePalette(SDL_Palette * palette);\n\n/**\n *  \\brief Maps an RGB triple to an opaque pixel value for a given pixel format.\n *\n *  \\sa SDL_MapRGBA\n */\nextern DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormat * format,\n                                          Uint8 r, Uint8 g, Uint8 b);\n\n/**\n *  \\brief Maps an RGBA quadruple to a pixel value for a given pixel format.\n *\n *  \\sa SDL_MapRGB\n */\nextern DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormat * format,\n                                           Uint8 r, Uint8 g, Uint8 b,\n                                           Uint8 a);\n\n/**\n *  \\brief Get the RGB components from a pixel of the specified format.\n *\n *  \\sa SDL_GetRGBA\n */\nextern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel,\n                                        const SDL_PixelFormat * format,\n                                        Uint8 * r, Uint8 * g, Uint8 * b);\n\n/**\n *  \\brief Get the RGBA components from a pixel of the specified format.\n *\n *  \\sa SDL_GetRGB\n */\nextern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel,\n                                         const SDL_PixelFormat * format,\n                                         Uint8 * r, Uint8 * g, Uint8 * b,\n                                         Uint8 * a);\n\n/**\n *  \\brief Calculate a 256 entry gamma ramp for a gamma value.\n */\nextern DECLSPEC void SDLCALL SDL_CalculateGammaRamp(float gamma, Uint16 * ramp);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_pixels_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_platform.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_platform.h\n *\n *  Try to get a standard set of platform defines.\n */\n\n#ifndef _SDL_platform_h\n#define _SDL_platform_h\n\n#if defined(_AIX)\n#undef __AIX__\n#define __AIX__     1\n#endif\n#if defined(__HAIKU__)\n#undef __HAIKU__\n#define __HAIKU__   1\n#endif\n#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__)\n#undef __BSDI__\n#define __BSDI__    1\n#endif\n#if defined(_arch_dreamcast)\n#undef __DREAMCAST__\n#define __DREAMCAST__   1\n#endif\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)\n#undef __FREEBSD__\n#define __FREEBSD__ 1\n#endif\n#if defined(hpux) || defined(__hpux) || defined(__hpux__)\n#undef __HPUX__\n#define __HPUX__    1\n#endif\n#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE)\n#undef __IRIX__\n#define __IRIX__    1\n#endif\n#if (defined(linux) || defined(__linux) || defined(__linux__))\n#undef __LINUX__\n#define __LINUX__   1\n#endif\n#if defined(ANDROID) || defined(__ANDROID__)\n#undef __ANDROID__\n#undef __LINUX__ /* do we need to do this? */\n#define __ANDROID__ 1\n#endif\n\n#if defined(__APPLE__)\n/* lets us know what version of Mac OS X we're compiling on */\n#include \"AvailabilityMacros.h\"\n#include \"TargetConditionals.h\"\n#if TARGET_OS_TV\n#undef __TVOS__\n#define __TVOS__ 1\n#endif\n#if TARGET_OS_IPHONE\n/* if compiling for iOS */\n#undef __IPHONEOS__\n#define __IPHONEOS__ 1\n#undef __MACOSX__\n#else\n/* if not compiling for iOS */\n#undef __MACOSX__\n#define __MACOSX__  1\n#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060\n# error SDL for Mac OS X only supports deploying on 10.6 and above.\n#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1060 */\n#endif /* TARGET_OS_IPHONE */\n#endif /* defined(__APPLE__) */\n\n#if defined(__NetBSD__)\n#undef __NETBSD__\n#define __NETBSD__  1\n#endif\n#if defined(__OpenBSD__)\n#undef __OPENBSD__\n#define __OPENBSD__ 1\n#endif\n#if defined(__OS2__)\n#undef __OS2__\n#define __OS2__     1\n#endif\n#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE)\n#undef __OSF__\n#define __OSF__     1\n#endif\n#if defined(__QNXNTO__)\n#undef __QNXNTO__\n#define __QNXNTO__  1\n#endif\n#if defined(riscos) || defined(__riscos) || defined(__riscos__)\n#undef __RISCOS__\n#define __RISCOS__  1\n#endif\n#if defined(__sun) && defined(__SVR4)\n#undef __SOLARIS__\n#define __SOLARIS__ 1\n#endif\n\n#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__)\n/* Try to find out if we're compiling for WinRT or non-WinRT */\n/* If _USING_V110_SDK71_ is defined it means we are using the v110_xp or v120_xp toolset. */\n#if (defined(_MSC_VER) && (_MSC_VER >= 1700) && !_USING_V110_SDK71_)\t/* _MSC_VER==1700 for MSVC 2012 */\n#include <winapifamily.h>\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n#undef __WINDOWS__\n#define __WINDOWS__   1\n/* See if we're compiling for WinRT: */\n#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)\n#undef __WINRT__\n#define __WINRT__ 1\n#endif\n#else\n#undef __WINDOWS__\n#define __WINDOWS__   1\n#endif /* _MSC_VER < 1700 */\n#endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */\n\n#if defined(__WINDOWS__)\n#undef __WIN32__\n#define __WIN32__ 1\n#endif\n#if defined(__PSP__)\n#undef __PSP__\n#define __PSP__ 1\n#endif\n\n/* The NACL compiler defines __native_client__ and __pnacl__\n * Ref: http://www.chromium.org/nativeclient/pnacl/stability-of-the-pnacl-bitcode-abi\n */\n#if defined(__native_client__)\n#undef __LINUX__\n#undef __NACL__\n#define __NACL__ 1\n#endif\n#if defined(__pnacl__)\n#undef __LINUX__\n#undef __PNACL__\n#define __PNACL__ 1\n/* PNACL with newlib supports static linking only */\n#define __SDL_NOGETPROCADDR__\n#endif\n\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief Gets the name of the platform.\n */\nextern DECLSPEC const char * SDLCALL SDL_GetPlatform (void);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_platform_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_power.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_power_h\n#define _SDL_power_h\n\n/**\n *  \\file SDL_power.h\n *\n *  Header for the SDL power management routines.\n */\n\n#include \"SDL_stdinc.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief The basic state for the system's power supply.\n */\ntypedef enum\n{\n    SDL_POWERSTATE_UNKNOWN,      /**< cannot determine power status */\n    SDL_POWERSTATE_ON_BATTERY,   /**< Not plugged in, running on the battery */\n    SDL_POWERSTATE_NO_BATTERY,   /**< Plugged in, no battery available */\n    SDL_POWERSTATE_CHARGING,     /**< Plugged in, charging battery */\n    SDL_POWERSTATE_CHARGED       /**< Plugged in, battery charged */\n} SDL_PowerState;\n\n\n/**\n *  \\brief Get the current power supply details.\n *\n *  \\param secs Seconds of battery life left. You can pass a NULL here if\n *              you don't care. Will return -1 if we can't determine a\n *              value, or we're not running on a battery.\n *\n *  \\param pct Percentage of battery life left, between 0 and 100. You can\n *             pass a NULL here if you don't care. Will return -1 if we\n *             can't determine a value, or we're not running on a battery.\n *\n *  \\return The state of the battery (if any).\n */\nextern DECLSPEC SDL_PowerState SDLCALL SDL_GetPowerInfo(int *secs, int *pct);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_power_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_quit.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_quit.h\n *\n *  Include file for SDL quit event handling.\n */\n\n#ifndef _SDL_quit_h\n#define _SDL_quit_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n\n/**\n *  \\file SDL_quit.h\n *\n *  An ::SDL_QUIT event is generated when the user tries to close the application\n *  window.  If it is ignored or filtered out, the window will remain open.\n *  If it is not ignored or filtered, it is queued normally and the window\n *  is allowed to close.  When the window is closed, screen updates will\n *  complete, but have no effect.\n *\n *  SDL_Init() installs signal handlers for SIGINT (keyboard interrupt)\n *  and SIGTERM (system termination request), if handlers do not already\n *  exist, that generate ::SDL_QUIT events as well.  There is no way\n *  to determine the cause of an ::SDL_QUIT event, but setting a signal\n *  handler in your application will override the default generation of\n *  quit events for that signal.\n *\n *  \\sa SDL_Quit()\n */\n\n/* There are no functions directly affecting the quit event */\n\n#define SDL_QuitRequested() \\\n        (SDL_PumpEvents(), (SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUIT,SDL_QUIT) > 0))\n\n#endif /* _SDL_quit_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_rect.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_rect.h\n *\n *  Header file for SDL_rect definition and management functions.\n */\n\n#ifndef _SDL_rect_h\n#define _SDL_rect_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_pixels.h\"\n#include \"SDL_rwops.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief  The structure that defines a point\n *\n *  \\sa SDL_EnclosePoints\n *  \\sa SDL_PointInRect\n */\ntypedef struct SDL_Point\n{\n    int x;\n    int y;\n} SDL_Point;\n\n/**\n *  \\brief A rectangle, with the origin at the upper left.\n *\n *  \\sa SDL_RectEmpty\n *  \\sa SDL_RectEquals\n *  \\sa SDL_HasIntersection\n *  \\sa SDL_IntersectRect\n *  \\sa SDL_UnionRect\n *  \\sa SDL_EnclosePoints\n */\ntypedef struct SDL_Rect\n{\n    int x, y;\n    int w, h;\n} SDL_Rect;\n\n/**\n *  \\brief Returns true if point resides inside a rectangle.\n */\nSDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r)\n{\n    return ( (p->x >= r->x) && (p->x < (r->x + r->w)) &&\n             (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE;\n}\n\n/**\n *  \\brief Returns true if the rectangle has no area.\n */\nSDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)\n{\n    return ((!r) || (r->w <= 0) || (r->h <= 0)) ? SDL_TRUE : SDL_FALSE;\n}\n\n/**\n *  \\brief Returns true if the two rectangles are equal.\n */\nSDL_FORCE_INLINE SDL_bool SDL_RectEquals(const SDL_Rect *a, const SDL_Rect *b)\n{\n    return (a && b && (a->x == b->x) && (a->y == b->y) &&\n            (a->w == b->w) && (a->h == b->h)) ? SDL_TRUE : SDL_FALSE;\n}\n\n/**\n *  \\brief Determine whether two rectangles intersect.\n *\n *  \\return SDL_TRUE if there is an intersection, SDL_FALSE otherwise.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_HasIntersection(const SDL_Rect * A,\n                                                     const SDL_Rect * B);\n\n/**\n *  \\brief Calculate the intersection of two rectangles.\n *\n *  \\return SDL_TRUE if there is an intersection, SDL_FALSE otherwise.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_IntersectRect(const SDL_Rect * A,\n                                                   const SDL_Rect * B,\n                                                   SDL_Rect * result);\n\n/**\n *  \\brief Calculate the union of two rectangles.\n */\nextern DECLSPEC void SDLCALL SDL_UnionRect(const SDL_Rect * A,\n                                           const SDL_Rect * B,\n                                           SDL_Rect * result);\n\n/**\n *  \\brief Calculate a minimal rectangle enclosing a set of points\n *\n *  \\return SDL_TRUE if any points were within the clipping rect\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_EnclosePoints(const SDL_Point * points,\n                                                   int count,\n                                                   const SDL_Rect * clip,\n                                                   SDL_Rect * result);\n\n/**\n *  \\brief Calculate the intersection of a rectangle and line segment.\n *\n *  \\return SDL_TRUE if there is an intersection, SDL_FALSE otherwise.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_IntersectRectAndLine(const SDL_Rect *\n                                                          rect, int *X1,\n                                                          int *Y1, int *X2,\n                                                          int *Y2);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_rect_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_render.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_render.h\n *\n *  Header file for SDL 2D rendering functions.\n *\n *  This API supports the following features:\n *      * single pixel points\n *      * single pixel lines\n *      * filled rectangles\n *      * texture images\n *\n *  The primitives may be drawn in opaque, blended, or additive modes.\n *\n *  The texture images may be drawn in opaque, blended, or additive modes.\n *  They can have an additional color tint or alpha modulation applied to\n *  them, and may also be stretched with linear interpolation.\n *\n *  This API is designed to accelerate simple 2D operations. You may\n *  want more functionality such as polygons and particle effects and\n *  in that case you should use SDL's OpenGL/Direct3D support or one\n *  of the many good 3D engines.\n *\n *  These functions must be called from the main thread.\n *  See this bug for details: http://bugzilla.libsdl.org/show_bug.cgi?id=1995\n */\n\n#ifndef _SDL_render_h\n#define _SDL_render_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_rect.h\"\n#include \"SDL_video.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief Flags used when creating a rendering context\n */\ntypedef enum\n{\n    SDL_RENDERER_SOFTWARE = 0x00000001,         /**< The renderer is a software fallback */\n    SDL_RENDERER_ACCELERATED = 0x00000002,      /**< The renderer uses hardware\n                                                     acceleration */\n    SDL_RENDERER_PRESENTVSYNC = 0x00000004,     /**< Present is synchronized\n                                                     with the refresh rate */\n    SDL_RENDERER_TARGETTEXTURE = 0x00000008     /**< The renderer supports\n                                                     rendering to texture */\n} SDL_RendererFlags;\n\n/**\n *  \\brief Information on the capabilities of a render driver or context.\n */\ntypedef struct SDL_RendererInfo\n{\n    const char *name;           /**< The name of the renderer */\n    Uint32 flags;               /**< Supported ::SDL_RendererFlags */\n    Uint32 num_texture_formats; /**< The number of available texture formats */\n    Uint32 texture_formats[16]; /**< The available texture formats */\n    int max_texture_width;      /**< The maximum texture width */\n    int max_texture_height;     /**< The maximum texture height */\n} SDL_RendererInfo;\n\n/**\n *  \\brief The access pattern allowed for a texture.\n */\ntypedef enum\n{\n    SDL_TEXTUREACCESS_STATIC,    /**< Changes rarely, not lockable */\n    SDL_TEXTUREACCESS_STREAMING, /**< Changes frequently, lockable */\n    SDL_TEXTUREACCESS_TARGET     /**< Texture can be used as a render target */\n} SDL_TextureAccess;\n\n/**\n *  \\brief The texture channel modulation used in SDL_RenderCopy().\n */\ntypedef enum\n{\n    SDL_TEXTUREMODULATE_NONE = 0x00000000,     /**< No modulation */\n    SDL_TEXTUREMODULATE_COLOR = 0x00000001,    /**< srcC = srcC * color */\n    SDL_TEXTUREMODULATE_ALPHA = 0x00000002     /**< srcA = srcA * alpha */\n} SDL_TextureModulate;\n\n/**\n *  \\brief Flip constants for SDL_RenderCopyEx\n */\ntypedef enum\n{\n    SDL_FLIP_NONE = 0x00000000,     /**< Do not flip */\n    SDL_FLIP_HORIZONTAL = 0x00000001,    /**< flip horizontally */\n    SDL_FLIP_VERTICAL = 0x00000002     /**< flip vertically */\n} SDL_RendererFlip;\n\n/**\n *  \\brief A structure representing rendering state\n */\nstruct SDL_Renderer;\ntypedef struct SDL_Renderer SDL_Renderer;\n\n/**\n *  \\brief An efficient driver-specific representation of pixel data\n */\nstruct SDL_Texture;\ntypedef struct SDL_Texture SDL_Texture;\n\n\n/* Function prototypes */\n\n/**\n *  \\brief Get the number of 2D rendering drivers available for the current\n *         display.\n *\n *  A render driver is a set of code that handles rendering and texture\n *  management on a particular display.  Normally there is only one, but\n *  some drivers may have several available with different capabilities.\n *\n *  \\sa SDL_GetRenderDriverInfo()\n *  \\sa SDL_CreateRenderer()\n */\nextern DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void);\n\n/**\n *  \\brief Get information about a specific 2D rendering driver for the current\n *         display.\n *\n *  \\param index The index of the driver to query information about.\n *  \\param info  A pointer to an SDL_RendererInfo struct to be filled with\n *               information on the rendering driver.\n *\n *  \\return 0 on success, -1 if the index was out of range.\n *\n *  \\sa SDL_CreateRenderer()\n */\nextern DECLSPEC int SDLCALL SDL_GetRenderDriverInfo(int index,\n                                                    SDL_RendererInfo * info);\n\n/**\n *  \\brief Create a window and default renderer\n *\n *  \\param width    The width of the window\n *  \\param height   The height of the window\n *  \\param window_flags The flags used to create the window\n *  \\param window   A pointer filled with the window, or NULL on error\n *  \\param renderer A pointer filled with the renderer, or NULL on error\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_CreateWindowAndRenderer(\n                                int width, int height, Uint32 window_flags,\n                                SDL_Window **window, SDL_Renderer **renderer);\n\n\n/**\n *  \\brief Create a 2D rendering context for a window.\n *\n *  \\param window The window where rendering is displayed.\n *  \\param index    The index of the rendering driver to initialize, or -1 to\n *                  initialize the first one supporting the requested flags.\n *  \\param flags    ::SDL_RendererFlags.\n *\n *  \\return A valid rendering context or NULL if there was an error.\n *\n *  \\sa SDL_CreateSoftwareRenderer()\n *  \\sa SDL_GetRendererInfo()\n *  \\sa SDL_DestroyRenderer()\n */\nextern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window * window,\n                                               int index, Uint32 flags);\n\n/**\n *  \\brief Create a 2D software rendering context for a surface.\n *\n *  \\param surface The surface where rendering is done.\n *\n *  \\return A valid rendering context or NULL if there was an error.\n *\n *  \\sa SDL_CreateRenderer()\n *  \\sa SDL_DestroyRenderer()\n */\nextern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface * surface);\n\n/**\n *  \\brief Get the renderer associated with a window.\n */\nextern DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window * window);\n\n/**\n *  \\brief Get information about a rendering context.\n */\nextern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer * renderer,\n                                                SDL_RendererInfo * info);\n\n/**\n *  \\brief Get the output size in pixels of a rendering context.\n */\nextern DECLSPEC int SDLCALL SDL_GetRendererOutputSize(SDL_Renderer * renderer,\n                                                      int *w, int *h);\n\n/**\n *  \\brief Create a texture for a rendering context.\n *\n *  \\param renderer The renderer.\n *  \\param format The format of the texture.\n *  \\param access One of the enumerated values in ::SDL_TextureAccess.\n *  \\param w      The width of the texture in pixels.\n *  \\param h      The height of the texture in pixels.\n *\n *  \\return The created texture is returned, or NULL if no rendering context was\n *          active,  the format was unsupported, or the width or height were out\n *          of range.\n *\n *  \\sa SDL_QueryTexture()\n *  \\sa SDL_UpdateTexture()\n *  \\sa SDL_DestroyTexture()\n */\nextern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer * renderer,\n                                                        Uint32 format,\n                                                        int access, int w,\n                                                        int h);\n\n/**\n *  \\brief Create a texture from an existing surface.\n *\n *  \\param renderer The renderer.\n *  \\param surface The surface containing pixel data used to fill the texture.\n *\n *  \\return The created texture is returned, or NULL on error.\n *\n *  \\note The surface is not modified or freed by this function.\n *\n *  \\sa SDL_QueryTexture()\n *  \\sa SDL_DestroyTexture()\n */\nextern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface);\n\n/**\n *  \\brief Query the attributes of a texture\n *\n *  \\param texture A texture to be queried.\n *  \\param format  A pointer filled in with the raw format of the texture.  The\n *                 actual format may differ, but pixel transfers will use this\n *                 format.\n *  \\param access  A pointer filled in with the actual access to the texture.\n *  \\param w       A pointer filled in with the width of the texture in pixels.\n *  \\param h       A pointer filled in with the height of the texture in pixels.\n *\n *  \\return 0 on success, or -1 if the texture is not valid.\n */\nextern DECLSPEC int SDLCALL SDL_QueryTexture(SDL_Texture * texture,\n                                             Uint32 * format, int *access,\n                                             int *w, int *h);\n\n/**\n *  \\brief Set an additional color value used in render copy operations.\n *\n *  \\param texture The texture to update.\n *  \\param r       The red color value multiplied into copy operations.\n *  \\param g       The green color value multiplied into copy operations.\n *  \\param b       The blue color value multiplied into copy operations.\n *\n *  \\return 0 on success, or -1 if the texture is not valid or color modulation\n *          is not supported.\n *\n *  \\sa SDL_GetTextureColorMod()\n */\nextern DECLSPEC int SDLCALL SDL_SetTextureColorMod(SDL_Texture * texture,\n                                                   Uint8 r, Uint8 g, Uint8 b);\n\n\n/**\n *  \\brief Get the additional color value used in render copy operations.\n *\n *  \\param texture The texture to query.\n *  \\param r         A pointer filled in with the current red color value.\n *  \\param g         A pointer filled in with the current green color value.\n *  \\param b         A pointer filled in with the current blue color value.\n *\n *  \\return 0 on success, or -1 if the texture is not valid.\n *\n *  \\sa SDL_SetTextureColorMod()\n */\nextern DECLSPEC int SDLCALL SDL_GetTextureColorMod(SDL_Texture * texture,\n                                                   Uint8 * r, Uint8 * g,\n                                                   Uint8 * b);\n\n/**\n *  \\brief Set an additional alpha value used in render copy operations.\n *\n *  \\param texture The texture to update.\n *  \\param alpha     The alpha value multiplied into copy operations.\n *\n *  \\return 0 on success, or -1 if the texture is not valid or alpha modulation\n *          is not supported.\n *\n *  \\sa SDL_GetTextureAlphaMod()\n */\nextern DECLSPEC int SDLCALL SDL_SetTextureAlphaMod(SDL_Texture * texture,\n                                                   Uint8 alpha);\n\n/**\n *  \\brief Get the additional alpha value used in render copy operations.\n *\n *  \\param texture The texture to query.\n *  \\param alpha     A pointer filled in with the current alpha value.\n *\n *  \\return 0 on success, or -1 if the texture is not valid.\n *\n *  \\sa SDL_SetTextureAlphaMod()\n */\nextern DECLSPEC int SDLCALL SDL_GetTextureAlphaMod(SDL_Texture * texture,\n                                                   Uint8 * alpha);\n\n/**\n *  \\brief Set the blend mode used for texture copy operations.\n *\n *  \\param texture The texture to update.\n *  \\param blendMode ::SDL_BlendMode to use for texture blending.\n *\n *  \\return 0 on success, or -1 if the texture is not valid or the blend mode is\n *          not supported.\n *\n *  \\note If the blend mode is not supported, the closest supported mode is\n *        chosen.\n *\n *  \\sa SDL_GetTextureBlendMode()\n */\nextern DECLSPEC int SDLCALL SDL_SetTextureBlendMode(SDL_Texture * texture,\n                                                    SDL_BlendMode blendMode);\n\n/**\n *  \\brief Get the blend mode used for texture copy operations.\n *\n *  \\param texture   The texture to query.\n *  \\param blendMode A pointer filled in with the current blend mode.\n *\n *  \\return 0 on success, or -1 if the texture is not valid.\n *\n *  \\sa SDL_SetTextureBlendMode()\n */\nextern DECLSPEC int SDLCALL SDL_GetTextureBlendMode(SDL_Texture * texture,\n                                                    SDL_BlendMode *blendMode);\n\n/**\n *  \\brief Update the given texture rectangle with new pixel data.\n *\n *  \\param texture   The texture to update\n *  \\param rect      A pointer to the rectangle of pixels to update, or NULL to\n *                   update the entire texture.\n *  \\param pixels    The raw pixel data.\n *  \\param pitch     The number of bytes in a row of pixel data, including padding between lines.\n *\n *  \\return 0 on success, or -1 if the texture is not valid.\n *\n *  \\note This is a fairly slow function.\n */\nextern DECLSPEC int SDLCALL SDL_UpdateTexture(SDL_Texture * texture,\n                                              const SDL_Rect * rect,\n                                              const void *pixels, int pitch);\n\n/**\n *  \\brief Update a rectangle within a planar YV12 or IYUV texture with new pixel data.\n *\n *  \\param texture   The texture to update\n *  \\param rect      A pointer to the rectangle of pixels to update, or NULL to\n *                   update the entire texture.\n *  \\param Yplane    The raw pixel data for the Y plane.\n *  \\param Ypitch    The number of bytes between rows of pixel data for the Y plane.\n *  \\param Uplane    The raw pixel data for the U plane.\n *  \\param Upitch    The number of bytes between rows of pixel data for the U plane.\n *  \\param Vplane    The raw pixel data for the V plane.\n *  \\param Vpitch    The number of bytes between rows of pixel data for the V plane.\n *\n *  \\return 0 on success, or -1 if the texture is not valid.\n *\n *  \\note You can use SDL_UpdateTexture() as long as your pixel data is\n *        a contiguous block of Y and U/V planes in the proper order, but\n *        this function is available if your pixel data is not contiguous.\n */\nextern DECLSPEC int SDLCALL SDL_UpdateYUVTexture(SDL_Texture * texture,\n                                                 const SDL_Rect * rect,\n                                                 const Uint8 *Yplane, int Ypitch,\n                                                 const Uint8 *Uplane, int Upitch,\n                                                 const Uint8 *Vplane, int Vpitch);\n\n/**\n *  \\brief Lock a portion of the texture for write-only pixel access.\n *\n *  \\param texture   The texture to lock for access, which was created with\n *                   ::SDL_TEXTUREACCESS_STREAMING.\n *  \\param rect      A pointer to the rectangle to lock for access. If the rect\n *                   is NULL, the entire texture will be locked.\n *  \\param pixels    This is filled in with a pointer to the locked pixels,\n *                   appropriately offset by the locked area.\n *  \\param pitch     This is filled in with the pitch of the locked pixels.\n *\n *  \\return 0 on success, or -1 if the texture is not valid or was not created with ::SDL_TEXTUREACCESS_STREAMING.\n *\n *  \\sa SDL_UnlockTexture()\n */\nextern DECLSPEC int SDLCALL SDL_LockTexture(SDL_Texture * texture,\n                                            const SDL_Rect * rect,\n                                            void **pixels, int *pitch);\n\n/**\n *  \\brief Unlock a texture, uploading the changes to video memory, if needed.\n *\n *  \\sa SDL_LockTexture()\n */\nextern DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture * texture);\n\n/**\n * \\brief Determines whether a window supports the use of render targets\n *\n * \\param renderer The renderer that will be checked\n *\n * \\return SDL_TRUE if supported, SDL_FALSE if not.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_RenderTargetSupported(SDL_Renderer *renderer);\n\n/**\n * \\brief Set a texture as the current rendering target.\n *\n * \\param renderer The renderer.\n * \\param texture The targeted texture, which must be created with the SDL_TEXTUREACCESS_TARGET flag, or NULL for the default render target\n *\n * \\return 0 on success, or -1 on error\n *\n *  \\sa SDL_GetRenderTarget()\n */\nextern DECLSPEC int SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer,\n                                                SDL_Texture *texture);\n\n/**\n * \\brief Get the current render target or NULL for the default render target.\n *\n * \\return The current render target\n *\n *  \\sa SDL_SetRenderTarget()\n */\nextern DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *renderer);\n\n/**\n *  \\brief Set device independent resolution for rendering\n *\n *  \\param renderer The renderer for which resolution should be set.\n *  \\param w      The width of the logical resolution\n *  \\param h      The height of the logical resolution\n *\n *  This function uses the viewport and scaling functionality to allow a fixed logical\n *  resolution for rendering, regardless of the actual output resolution.  If the actual\n *  output resolution doesn't have the same aspect ratio the output rendering will be\n *  centered within the output display.\n *\n *  If the output display is a window, mouse events in the window will be filtered\n *  and scaled so they seem to arrive within the logical resolution.\n *\n *  \\note If this function results in scaling or subpixel drawing by the\n *        rendering backend, it will be handled using the appropriate\n *        quality hints.\n *\n *  \\sa SDL_RenderGetLogicalSize()\n *  \\sa SDL_RenderSetScale()\n *  \\sa SDL_RenderSetViewport()\n */\nextern DECLSPEC int SDLCALL SDL_RenderSetLogicalSize(SDL_Renderer * renderer, int w, int h);\n\n/**\n *  \\brief Get device independent resolution for rendering\n *\n *  \\param renderer The renderer from which resolution should be queried.\n *  \\param w      A pointer filled with the width of the logical resolution\n *  \\param h      A pointer filled with the height of the logical resolution\n *\n *  \\sa SDL_RenderSetLogicalSize()\n */\nextern DECLSPEC void SDLCALL SDL_RenderGetLogicalSize(SDL_Renderer * renderer, int *w, int *h);\n\n/**\n *  \\brief Set whether to force integer scales for resolution-independent rendering\n *\n *  \\param renderer The renderer for which integer scaling should be set.\n *  \\param enable   Enable or disable integer scaling\n *\n *  This function restricts the logical viewport to integer values - that is, when\n *  a resolution is between two multiples of a logical size, the viewport size is\n *  rounded down to the lower multiple.\n *\n *  \\sa SDL_RenderSetLogicalSize()\n */\nextern DECLSPEC int SDLCALL SDL_RenderSetIntegerScale(SDL_Renderer * renderer,\n                                                      SDL_bool enable);\n\n/**\n *  \\brief Get whether integer scales are forced for resolution-independent rendering\n *\n *  \\param renderer The renderer from which integer scaling should be queried.\n *\n *  \\sa SDL_RenderSetIntegerScale()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_RenderGetIntegerScale(SDL_Renderer * renderer);\n\n/**\n *  \\brief Set the drawing area for rendering on the current target.\n *\n *  \\param renderer The renderer for which the drawing area should be set.\n *  \\param rect The rectangle representing the drawing area, or NULL to set the viewport to the entire target.\n *\n *  The x,y of the viewport rect represents the origin for rendering.\n *\n *  \\return 0 on success, or -1 on error\n *\n *  \\note If the window associated with the renderer is resized, the viewport is automatically reset.\n *\n *  \\sa SDL_RenderGetViewport()\n *  \\sa SDL_RenderSetLogicalSize()\n */\nextern DECLSPEC int SDLCALL SDL_RenderSetViewport(SDL_Renderer * renderer,\n                                                  const SDL_Rect * rect);\n\n/**\n *  \\brief Get the drawing area for the current target.\n *\n *  \\sa SDL_RenderSetViewport()\n */\nextern DECLSPEC void SDLCALL SDL_RenderGetViewport(SDL_Renderer * renderer,\n                                                   SDL_Rect * rect);\n\n/**\n *  \\brief Set the clip rectangle for the current target.\n *\n *  \\param renderer The renderer for which clip rectangle should be set.\n *  \\param rect   A pointer to the rectangle to set as the clip rectangle, or\n *                NULL to disable clipping.\n *\n *  \\return 0 on success, or -1 on error\n *\n *  \\sa SDL_RenderGetClipRect()\n */\nextern DECLSPEC int SDLCALL SDL_RenderSetClipRect(SDL_Renderer * renderer,\n                                                  const SDL_Rect * rect);\n\n/**\n *  \\brief Get the clip rectangle for the current target.\n *\n *  \\param renderer The renderer from which clip rectangle should be queried.\n *  \\param rect   A pointer filled in with the current clip rectangle, or\n *                an empty rectangle if clipping is disabled.\n *\n *  \\sa SDL_RenderSetClipRect()\n */\nextern DECLSPEC void SDLCALL SDL_RenderGetClipRect(SDL_Renderer * renderer,\n                                                   SDL_Rect * rect);\n\n/**\n *  \\brief Get whether clipping is enabled on the given renderer.\n *\n *  \\param renderer The renderer from which clip state should be queried.\n *\n *  \\sa SDL_RenderGetClipRect()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_RenderIsClipEnabled(SDL_Renderer * renderer);\n\n\n/**\n *  \\brief Set the drawing scale for rendering on the current target.\n *\n *  \\param renderer The renderer for which the drawing scale should be set.\n *  \\param scaleX The horizontal scaling factor\n *  \\param scaleY The vertical scaling factor\n *\n *  The drawing coordinates are scaled by the x/y scaling factors\n *  before they are used by the renderer.  This allows resolution\n *  independent drawing with a single coordinate system.\n *\n *  \\note If this results in scaling or subpixel drawing by the\n *        rendering backend, it will be handled using the appropriate\n *        quality hints.  For best results use integer scaling factors.\n *\n *  \\sa SDL_RenderGetScale()\n *  \\sa SDL_RenderSetLogicalSize()\n */\nextern DECLSPEC int SDLCALL SDL_RenderSetScale(SDL_Renderer * renderer,\n                                               float scaleX, float scaleY);\n\n/**\n *  \\brief Get the drawing scale for the current target.\n *\n *  \\param renderer The renderer from which drawing scale should be queried.\n *  \\param scaleX A pointer filled in with the horizontal scaling factor\n *  \\param scaleY A pointer filled in with the vertical scaling factor\n *\n *  \\sa SDL_RenderSetScale()\n */\nextern DECLSPEC void SDLCALL SDL_RenderGetScale(SDL_Renderer * renderer,\n                                               float *scaleX, float *scaleY);\n\n/**\n *  \\brief Set the color used for drawing operations (Rect, Line and Clear).\n *\n *  \\param renderer The renderer for which drawing color should be set.\n *  \\param r The red value used to draw on the rendering target.\n *  \\param g The green value used to draw on the rendering target.\n *  \\param b The blue value used to draw on the rendering target.\n *  \\param a The alpha value used to draw on the rendering target, usually\n *           ::SDL_ALPHA_OPAQUE (255).\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_SetRenderDrawColor(SDL_Renderer * renderer,\n                                           Uint8 r, Uint8 g, Uint8 b,\n                                           Uint8 a);\n\n/**\n *  \\brief Get the color used for drawing operations (Rect, Line and Clear).\n *\n *  \\param renderer The renderer from which drawing color should be queried.\n *  \\param r A pointer to the red value used to draw on the rendering target.\n *  \\param g A pointer to the green value used to draw on the rendering target.\n *  \\param b A pointer to the blue value used to draw on the rendering target.\n *  \\param a A pointer to the alpha value used to draw on the rendering target,\n *           usually ::SDL_ALPHA_OPAQUE (255).\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_GetRenderDrawColor(SDL_Renderer * renderer,\n                                           Uint8 * r, Uint8 * g, Uint8 * b,\n                                           Uint8 * a);\n\n/**\n *  \\brief Set the blend mode used for drawing operations (Fill and Line).\n *\n *  \\param renderer The renderer for which blend mode should be set.\n *  \\param blendMode ::SDL_BlendMode to use for blending.\n *\n *  \\return 0 on success, or -1 on error\n *\n *  \\note If the blend mode is not supported, the closest supported mode is\n *        chosen.\n *\n *  \\sa SDL_GetRenderDrawBlendMode()\n */\nextern DECLSPEC int SDLCALL SDL_SetRenderDrawBlendMode(SDL_Renderer * renderer,\n                                                       SDL_BlendMode blendMode);\n\n/**\n *  \\brief Get the blend mode used for drawing operations.\n *\n *  \\param renderer The renderer from which blend mode should be queried.\n *  \\param blendMode A pointer filled in with the current blend mode.\n *\n *  \\return 0 on success, or -1 on error\n *\n *  \\sa SDL_SetRenderDrawBlendMode()\n */\nextern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer * renderer,\n                                                       SDL_BlendMode *blendMode);\n\n/**\n *  \\brief Clear the current rendering target with the drawing color\n *\n *  This function clears the entire rendering target, ignoring the viewport and\n *  the clip rectangle.\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderClear(SDL_Renderer * renderer);\n\n/**\n *  \\brief Draw a point on the current rendering target.\n *\n *  \\param renderer The renderer which should draw a point.\n *  \\param x The x coordinate of the point.\n *  \\param y The y coordinate of the point.\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderDrawPoint(SDL_Renderer * renderer,\n                                                int x, int y);\n\n/**\n *  \\brief Draw multiple points on the current rendering target.\n *\n *  \\param renderer The renderer which should draw multiple points.\n *  \\param points The points to draw\n *  \\param count The number of points to draw\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderDrawPoints(SDL_Renderer * renderer,\n                                                 const SDL_Point * points,\n                                                 int count);\n\n/**\n *  \\brief Draw a line on the current rendering target.\n *\n *  \\param renderer The renderer which should draw a line.\n *  \\param x1 The x coordinate of the start point.\n *  \\param y1 The y coordinate of the start point.\n *  \\param x2 The x coordinate of the end point.\n *  \\param y2 The y coordinate of the end point.\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderDrawLine(SDL_Renderer * renderer,\n                                               int x1, int y1, int x2, int y2);\n\n/**\n *  \\brief Draw a series of connected lines on the current rendering target.\n *\n *  \\param renderer The renderer which should draw multiple lines.\n *  \\param points The points along the lines\n *  \\param count The number of points, drawing count-1 lines\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderDrawLines(SDL_Renderer * renderer,\n                                                const SDL_Point * points,\n                                                int count);\n\n/**\n *  \\brief Draw a rectangle on the current rendering target.\n *\n *  \\param renderer The renderer which should draw a rectangle.\n *  \\param rect A pointer to the destination rectangle, or NULL to outline the entire rendering target.\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderDrawRect(SDL_Renderer * renderer,\n                                               const SDL_Rect * rect);\n\n/**\n *  \\brief Draw some number of rectangles on the current rendering target.\n *\n *  \\param renderer The renderer which should draw multiple rectangles.\n *  \\param rects A pointer to an array of destination rectangles.\n *  \\param count The number of rectangles.\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderDrawRects(SDL_Renderer * renderer,\n                                                const SDL_Rect * rects,\n                                                int count);\n\n/**\n *  \\brief Fill a rectangle on the current rendering target with the drawing color.\n *\n *  \\param renderer The renderer which should fill a rectangle.\n *  \\param rect A pointer to the destination rectangle, or NULL for the entire\n *              rendering target.\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderFillRect(SDL_Renderer * renderer,\n                                               const SDL_Rect * rect);\n\n/**\n *  \\brief Fill some number of rectangles on the current rendering target with the drawing color.\n *\n *  \\param renderer The renderer which should fill multiple rectangles.\n *  \\param rects A pointer to an array of destination rectangles.\n *  \\param count The number of rectangles.\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderFillRects(SDL_Renderer * renderer,\n                                                const SDL_Rect * rects,\n                                                int count);\n\n/**\n *  \\brief Copy a portion of the texture to the current rendering target.\n *\n *  \\param renderer The renderer which should copy parts of a texture.\n *  \\param texture The source texture.\n *  \\param srcrect   A pointer to the source rectangle, or NULL for the entire\n *                   texture.\n *  \\param dstrect   A pointer to the destination rectangle, or NULL for the\n *                   entire rendering target.\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer,\n                                           SDL_Texture * texture,\n                                           const SDL_Rect * srcrect,\n                                           const SDL_Rect * dstrect);\n\n/**\n *  \\brief Copy a portion of the source texture to the current rendering target, rotating it by angle around the given center\n *\n *  \\param renderer The renderer which should copy parts of a texture.\n *  \\param texture The source texture.\n *  \\param srcrect   A pointer to the source rectangle, or NULL for the entire\n *                   texture.\n *  \\param dstrect   A pointer to the destination rectangle, or NULL for the\n *                   entire rendering target.\n *  \\param angle    An angle in degrees that indicates the rotation that will be applied to dstrect\n *  \\param center   A pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done around dstrect.w/2, dstrect.h/2).\n *  \\param flip     An SDL_RendererFlip value stating which flipping actions should be performed on the texture\n *\n *  \\return 0 on success, or -1 on error\n */\nextern DECLSPEC int SDLCALL SDL_RenderCopyEx(SDL_Renderer * renderer,\n                                           SDL_Texture * texture,\n                                           const SDL_Rect * srcrect,\n                                           const SDL_Rect * dstrect,\n                                           const double angle,\n                                           const SDL_Point *center,\n                                           const SDL_RendererFlip flip);\n\n/**\n *  \\brief Read pixels from the current rendering target.\n *\n *  \\param renderer The renderer from which pixels should be read.\n *  \\param rect   A pointer to the rectangle to read, or NULL for the entire\n *                render target.\n *  \\param format The desired format of the pixel data, or 0 to use the format\n *                of the rendering target\n *  \\param pixels A pointer to be filled in with the pixel data\n *  \\param pitch  The pitch of the pixels parameter.\n *\n *  \\return 0 on success, or -1 if pixel reading is not supported.\n *\n *  \\warning This is a very slow operation, and should not be used frequently.\n */\nextern DECLSPEC int SDLCALL SDL_RenderReadPixels(SDL_Renderer * renderer,\n                                                 const SDL_Rect * rect,\n                                                 Uint32 format,\n                                                 void *pixels, int pitch);\n\n/**\n *  \\brief Update the screen with rendering performed.\n */\nextern DECLSPEC void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer);\n\n/**\n *  \\brief Destroy the specified texture.\n *\n *  \\sa SDL_CreateTexture()\n *  \\sa SDL_CreateTextureFromSurface()\n */\nextern DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture * texture);\n\n/**\n *  \\brief Destroy the rendering context for a window and free associated\n *         textures.\n *\n *  \\sa SDL_CreateRenderer()\n */\nextern DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer * renderer);\n\n\n/**\n *  \\brief Bind the texture to the current OpenGL/ES/ES2 context for use with\n *         OpenGL instructions.\n *\n *  \\param texture  The SDL texture to bind\n *  \\param texw     A pointer to a float that will be filled with the texture width\n *  \\param texh     A pointer to a float that will be filled with the texture height\n *\n *  \\return 0 on success, or -1 if the operation is not supported\n */\nextern DECLSPEC int SDLCALL SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh);\n\n/**\n *  \\brief Unbind a texture from the current OpenGL/ES/ES2 context.\n *\n *  \\param texture  The SDL texture to unbind\n *\n *  \\return 0 on success, or -1 if the operation is not supported\n */\nextern DECLSPEC int SDLCALL SDL_GL_UnbindTexture(SDL_Texture *texture);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_render_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_revision.h",
    "content": "#define SDL_REVISION \"hg-10556:007dfe83abf8\"\n#define SDL_REVISION_NUMBER 10556\n"
  },
  {
    "path": "libs/SDL2/include/SDL_rwops.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_rwops.h\n *\n *  This file provides a general interface for SDL to read and write\n *  data streams.  It can easily be extended to files, memory, etc.\n */\n\n#ifndef _SDL_rwops_h\n#define _SDL_rwops_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* RWops Types */\n#define SDL_RWOPS_UNKNOWN   0U  /* Unknown stream type */\n#define SDL_RWOPS_WINFILE   1U  /* Win32 file */\n#define SDL_RWOPS_STDFILE   2U  /* Stdio file */\n#define SDL_RWOPS_JNIFILE   3U  /* Android asset */\n#define SDL_RWOPS_MEMORY    4U  /* Memory stream */\n#define SDL_RWOPS_MEMORY_RO 5U  /* Read-Only memory stream */\n\n/**\n * This is the read/write operation structure -- very basic.\n */\ntypedef struct SDL_RWops\n{\n    /**\n     *  Return the size of the file in this rwops, or -1 if unknown\n     */\n    Sint64 (SDLCALL * size) (struct SDL_RWops * context);\n\n    /**\n     *  Seek to \\c offset relative to \\c whence, one of stdio's whence values:\n     *  RW_SEEK_SET, RW_SEEK_CUR, RW_SEEK_END\n     *\n     *  \\return the final offset in the data stream, or -1 on error.\n     */\n    Sint64 (SDLCALL * seek) (struct SDL_RWops * context, Sint64 offset,\n                             int whence);\n\n    /**\n     *  Read up to \\c maxnum objects each of size \\c size from the data\n     *  stream to the area pointed at by \\c ptr.\n     *\n     *  \\return the number of objects read, or 0 at error or end of file.\n     */\n    size_t (SDLCALL * read) (struct SDL_RWops * context, void *ptr,\n                             size_t size, size_t maxnum);\n\n    /**\n     *  Write exactly \\c num objects each of size \\c size from the area\n     *  pointed at by \\c ptr to data stream.\n     *\n     *  \\return the number of objects written, or 0 at error or end of file.\n     */\n    size_t (SDLCALL * write) (struct SDL_RWops * context, const void *ptr,\n                              size_t size, size_t num);\n\n    /**\n     *  Close and free an allocated SDL_RWops structure.\n     *\n     *  \\return 0 if successful or -1 on write error when flushing data.\n     */\n    int (SDLCALL * close) (struct SDL_RWops * context);\n\n    Uint32 type;\n    union\n    {\n#if defined(__ANDROID__)\n        struct\n        {\n            void *fileNameRef;\n            void *inputStreamRef;\n            void *readableByteChannelRef;\n            void *readMethod;\n            void *assetFileDescriptorRef;\n            long position;\n            long size;\n            long offset;\n            int fd;\n        } androidio;\n#elif defined(__WIN32__)\n        struct\n        {\n            SDL_bool append;\n            void *h;\n            struct\n            {\n                void *data;\n                size_t size;\n                size_t left;\n            } buffer;\n        } windowsio;\n#endif\n\n#ifdef HAVE_STDIO_H\n        struct\n        {\n            SDL_bool autoclose;\n            FILE *fp;\n        } stdio;\n#endif\n        struct\n        {\n            Uint8 *base;\n            Uint8 *here;\n            Uint8 *stop;\n        } mem;\n        struct\n        {\n            void *data1;\n            void *data2;\n        } unknown;\n    } hidden;\n\n} SDL_RWops;\n\n\n/**\n *  \\name RWFrom functions\n *\n *  Functions to create SDL_RWops structures from various data streams.\n */\n/* @{ */\n\nextern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFile(const char *file,\n                                                  const char *mode);\n\n#ifdef HAVE_STDIO_H\nextern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(FILE * fp,\n                                                SDL_bool autoclose);\n#else\nextern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(void * fp,\n                                                SDL_bool autoclose);\n#endif\n\nextern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromMem(void *mem, int size);\nextern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromConstMem(const void *mem,\n                                                      int size);\n\n/* @} *//* RWFrom functions */\n\n\nextern DECLSPEC SDL_RWops *SDLCALL SDL_AllocRW(void);\nextern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops * area);\n\n#define RW_SEEK_SET 0       /**< Seek from the beginning of data */\n#define RW_SEEK_CUR 1       /**< Seek relative to current read point */\n#define RW_SEEK_END 2       /**< Seek relative to the end of data */\n\n/**\n *  \\name Read/write macros\n *\n *  Macros to easily read and write from an SDL_RWops structure.\n */\n/* @{ */\n#define SDL_RWsize(ctx)         (ctx)->size(ctx)\n#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence)\n#define SDL_RWtell(ctx)         (ctx)->seek(ctx, 0, RW_SEEK_CUR)\n#define SDL_RWread(ctx, ptr, size, n)   (ctx)->read(ctx, ptr, size, n)\n#define SDL_RWwrite(ctx, ptr, size, n)  (ctx)->write(ctx, ptr, size, n)\n#define SDL_RWclose(ctx)        (ctx)->close(ctx)\n/* @} *//* Read/write macros */\n\n\n/**\n *  \\name Read endian functions\n *\n *  Read an item of the specified endianness and return in native format.\n */\n/* @{ */\nextern DECLSPEC Uint8 SDLCALL SDL_ReadU8(SDL_RWops * src);\nextern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops * src);\nextern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops * src);\nextern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops * src);\nextern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops * src);\nextern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops * src);\nextern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops * src);\n/* @} *//* Read endian functions */\n\n/**\n *  \\name Write endian functions\n *\n *  Write an item of native format to the specified endianness.\n */\n/* @{ */\nextern DECLSPEC size_t SDLCALL SDL_WriteU8(SDL_RWops * dst, Uint8 value);\nextern DECLSPEC size_t SDLCALL SDL_WriteLE16(SDL_RWops * dst, Uint16 value);\nextern DECLSPEC size_t SDLCALL SDL_WriteBE16(SDL_RWops * dst, Uint16 value);\nextern DECLSPEC size_t SDLCALL SDL_WriteLE32(SDL_RWops * dst, Uint32 value);\nextern DECLSPEC size_t SDLCALL SDL_WriteBE32(SDL_RWops * dst, Uint32 value);\nextern DECLSPEC size_t SDLCALL SDL_WriteLE64(SDL_RWops * dst, Uint64 value);\nextern DECLSPEC size_t SDLCALL SDL_WriteBE64(SDL_RWops * dst, Uint64 value);\n/* @} *//* Write endian functions */\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_rwops_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_scancode.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_scancode.h\n *\n *  Defines keyboard scancodes.\n */\n\n#ifndef _SDL_scancode_h\n#define _SDL_scancode_h\n\n#include \"SDL_stdinc.h\"\n\n/**\n *  \\brief The SDL keyboard scancode representation.\n *\n *  Values of this type are used to represent keyboard keys, among other places\n *  in the \\link SDL_Keysym::scancode key.keysym.scancode \\endlink field of the\n *  SDL_Event structure.\n *\n *  The values in this enumeration are based on the USB usage page standard:\n *  http://www.usb.org/developers/devclass_docs/Hut1_12v2.pdf\n */\ntypedef enum\n{\n    SDL_SCANCODE_UNKNOWN = 0,\n\n    /**\n     *  \\name Usage page 0x07\n     *\n     *  These values are from usage page 0x07 (USB keyboard page).\n     */\n    /* @{ */\n\n    SDL_SCANCODE_A = 4,\n    SDL_SCANCODE_B = 5,\n    SDL_SCANCODE_C = 6,\n    SDL_SCANCODE_D = 7,\n    SDL_SCANCODE_E = 8,\n    SDL_SCANCODE_F = 9,\n    SDL_SCANCODE_G = 10,\n    SDL_SCANCODE_H = 11,\n    SDL_SCANCODE_I = 12,\n    SDL_SCANCODE_J = 13,\n    SDL_SCANCODE_K = 14,\n    SDL_SCANCODE_L = 15,\n    SDL_SCANCODE_M = 16,\n    SDL_SCANCODE_N = 17,\n    SDL_SCANCODE_O = 18,\n    SDL_SCANCODE_P = 19,\n    SDL_SCANCODE_Q = 20,\n    SDL_SCANCODE_R = 21,\n    SDL_SCANCODE_S = 22,\n    SDL_SCANCODE_T = 23,\n    SDL_SCANCODE_U = 24,\n    SDL_SCANCODE_V = 25,\n    SDL_SCANCODE_W = 26,\n    SDL_SCANCODE_X = 27,\n    SDL_SCANCODE_Y = 28,\n    SDL_SCANCODE_Z = 29,\n\n    SDL_SCANCODE_1 = 30,\n    SDL_SCANCODE_2 = 31,\n    SDL_SCANCODE_3 = 32,\n    SDL_SCANCODE_4 = 33,\n    SDL_SCANCODE_5 = 34,\n    SDL_SCANCODE_6 = 35,\n    SDL_SCANCODE_7 = 36,\n    SDL_SCANCODE_8 = 37,\n    SDL_SCANCODE_9 = 38,\n    SDL_SCANCODE_0 = 39,\n\n    SDL_SCANCODE_RETURN = 40,\n    SDL_SCANCODE_ESCAPE = 41,\n    SDL_SCANCODE_BACKSPACE = 42,\n    SDL_SCANCODE_TAB = 43,\n    SDL_SCANCODE_SPACE = 44,\n\n    SDL_SCANCODE_MINUS = 45,\n    SDL_SCANCODE_EQUALS = 46,\n    SDL_SCANCODE_LEFTBRACKET = 47,\n    SDL_SCANCODE_RIGHTBRACKET = 48,\n    SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return\n                                  *   key on ISO keyboards and at the right end\n                                  *   of the QWERTY row on ANSI keyboards.\n                                  *   Produces REVERSE SOLIDUS (backslash) and\n                                  *   VERTICAL LINE in a US layout, REVERSE\n                                  *   SOLIDUS and VERTICAL LINE in a UK Mac\n                                  *   layout, NUMBER SIGN and TILDE in a UK\n                                  *   Windows layout, DOLLAR SIGN and POUND SIGN\n                                  *   in a Swiss German layout, NUMBER SIGN and\n                                  *   APOSTROPHE in a German layout, GRAVE\n                                  *   ACCENT and POUND SIGN in a French Mac\n                                  *   layout, and ASTERISK and MICRO SIGN in a\n                                  *   French Windows layout.\n                                  */\n    SDL_SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code\n                                  *   instead of 49 for the same key, but all\n                                  *   OSes I've seen treat the two codes\n                                  *   identically. So, as an implementor, unless\n                                  *   your keyboard generates both of those\n                                  *   codes and your OS treats them differently,\n                                  *   you should generate SDL_SCANCODE_BACKSLASH\n                                  *   instead of this code. As a user, you\n                                  *   should not rely on this code because SDL\n                                  *   will never generate it with most (all?)\n                                  *   keyboards.\n                                  */\n    SDL_SCANCODE_SEMICOLON = 51,\n    SDL_SCANCODE_APOSTROPHE = 52,\n    SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI\n                              *   and ISO keyboards). Produces GRAVE ACCENT and\n                              *   TILDE in a US Windows layout and in US and UK\n                              *   Mac layouts on ANSI keyboards, GRAVE ACCENT\n                              *   and NOT SIGN in a UK Windows layout, SECTION\n                              *   SIGN and PLUS-MINUS SIGN in US and UK Mac\n                              *   layouts on ISO keyboards, SECTION SIGN and\n                              *   DEGREE SIGN in a Swiss German layout (Mac:\n                              *   only on ISO keyboards), CIRCUMFLEX ACCENT and\n                              *   DEGREE SIGN in a German layout (Mac: only on\n                              *   ISO keyboards), SUPERSCRIPT TWO and TILDE in a\n                              *   French Windows layout, COMMERCIAL AT and\n                              *   NUMBER SIGN in a French Mac layout on ISO\n                              *   keyboards, and LESS-THAN SIGN and GREATER-THAN\n                              *   SIGN in a Swiss German, German, or French Mac\n                              *   layout on ANSI keyboards.\n                              */\n    SDL_SCANCODE_COMMA = 54,\n    SDL_SCANCODE_PERIOD = 55,\n    SDL_SCANCODE_SLASH = 56,\n\n    SDL_SCANCODE_CAPSLOCK = 57,\n\n    SDL_SCANCODE_F1 = 58,\n    SDL_SCANCODE_F2 = 59,\n    SDL_SCANCODE_F3 = 60,\n    SDL_SCANCODE_F4 = 61,\n    SDL_SCANCODE_F5 = 62,\n    SDL_SCANCODE_F6 = 63,\n    SDL_SCANCODE_F7 = 64,\n    SDL_SCANCODE_F8 = 65,\n    SDL_SCANCODE_F9 = 66,\n    SDL_SCANCODE_F10 = 67,\n    SDL_SCANCODE_F11 = 68,\n    SDL_SCANCODE_F12 = 69,\n\n    SDL_SCANCODE_PRINTSCREEN = 70,\n    SDL_SCANCODE_SCROLLLOCK = 71,\n    SDL_SCANCODE_PAUSE = 72,\n    SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but\n                                   does send code 73, not 117) */\n    SDL_SCANCODE_HOME = 74,\n    SDL_SCANCODE_PAGEUP = 75,\n    SDL_SCANCODE_DELETE = 76,\n    SDL_SCANCODE_END = 77,\n    SDL_SCANCODE_PAGEDOWN = 78,\n    SDL_SCANCODE_RIGHT = 79,\n    SDL_SCANCODE_LEFT = 80,\n    SDL_SCANCODE_DOWN = 81,\n    SDL_SCANCODE_UP = 82,\n\n    SDL_SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards\n                                     */\n    SDL_SCANCODE_KP_DIVIDE = 84,\n    SDL_SCANCODE_KP_MULTIPLY = 85,\n    SDL_SCANCODE_KP_MINUS = 86,\n    SDL_SCANCODE_KP_PLUS = 87,\n    SDL_SCANCODE_KP_ENTER = 88,\n    SDL_SCANCODE_KP_1 = 89,\n    SDL_SCANCODE_KP_2 = 90,\n    SDL_SCANCODE_KP_3 = 91,\n    SDL_SCANCODE_KP_4 = 92,\n    SDL_SCANCODE_KP_5 = 93,\n    SDL_SCANCODE_KP_6 = 94,\n    SDL_SCANCODE_KP_7 = 95,\n    SDL_SCANCODE_KP_8 = 96,\n    SDL_SCANCODE_KP_9 = 97,\n    SDL_SCANCODE_KP_0 = 98,\n    SDL_SCANCODE_KP_PERIOD = 99,\n\n    SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO\n                                        *   keyboards have over ANSI ones,\n                                        *   located between left shift and Y.\n                                        *   Produces GRAVE ACCENT and TILDE in a\n                                        *   US or UK Mac layout, REVERSE SOLIDUS\n                                        *   (backslash) and VERTICAL LINE in a\n                                        *   US or UK Windows layout, and\n                                        *   LESS-THAN SIGN and GREATER-THAN SIGN\n                                        *   in a Swiss German, German, or French\n                                        *   layout. */\n    SDL_SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */\n    SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag,\n                               *   not a physical key - but some Mac keyboards\n                               *   do have a power key. */\n    SDL_SCANCODE_KP_EQUALS = 103,\n    SDL_SCANCODE_F13 = 104,\n    SDL_SCANCODE_F14 = 105,\n    SDL_SCANCODE_F15 = 106,\n    SDL_SCANCODE_F16 = 107,\n    SDL_SCANCODE_F17 = 108,\n    SDL_SCANCODE_F18 = 109,\n    SDL_SCANCODE_F19 = 110,\n    SDL_SCANCODE_F20 = 111,\n    SDL_SCANCODE_F21 = 112,\n    SDL_SCANCODE_F22 = 113,\n    SDL_SCANCODE_F23 = 114,\n    SDL_SCANCODE_F24 = 115,\n    SDL_SCANCODE_EXECUTE = 116,\n    SDL_SCANCODE_HELP = 117,\n    SDL_SCANCODE_MENU = 118,\n    SDL_SCANCODE_SELECT = 119,\n    SDL_SCANCODE_STOP = 120,\n    SDL_SCANCODE_AGAIN = 121,   /**< redo */\n    SDL_SCANCODE_UNDO = 122,\n    SDL_SCANCODE_CUT = 123,\n    SDL_SCANCODE_COPY = 124,\n    SDL_SCANCODE_PASTE = 125,\n    SDL_SCANCODE_FIND = 126,\n    SDL_SCANCODE_MUTE = 127,\n    SDL_SCANCODE_VOLUMEUP = 128,\n    SDL_SCANCODE_VOLUMEDOWN = 129,\n/* not sure whether there's a reason to enable these */\n/*     SDL_SCANCODE_LOCKINGCAPSLOCK = 130,  */\n/*     SDL_SCANCODE_LOCKINGNUMLOCK = 131, */\n/*     SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */\n    SDL_SCANCODE_KP_COMMA = 133,\n    SDL_SCANCODE_KP_EQUALSAS400 = 134,\n\n    SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see\n                                            footnotes in USB doc */\n    SDL_SCANCODE_INTERNATIONAL2 = 136,\n    SDL_SCANCODE_INTERNATIONAL3 = 137, /**< Yen */\n    SDL_SCANCODE_INTERNATIONAL4 = 138,\n    SDL_SCANCODE_INTERNATIONAL5 = 139,\n    SDL_SCANCODE_INTERNATIONAL6 = 140,\n    SDL_SCANCODE_INTERNATIONAL7 = 141,\n    SDL_SCANCODE_INTERNATIONAL8 = 142,\n    SDL_SCANCODE_INTERNATIONAL9 = 143,\n    SDL_SCANCODE_LANG1 = 144, /**< Hangul/English toggle */\n    SDL_SCANCODE_LANG2 = 145, /**< Hanja conversion */\n    SDL_SCANCODE_LANG3 = 146, /**< Katakana */\n    SDL_SCANCODE_LANG4 = 147, /**< Hiragana */\n    SDL_SCANCODE_LANG5 = 148, /**< Zenkaku/Hankaku */\n    SDL_SCANCODE_LANG6 = 149, /**< reserved */\n    SDL_SCANCODE_LANG7 = 150, /**< reserved */\n    SDL_SCANCODE_LANG8 = 151, /**< reserved */\n    SDL_SCANCODE_LANG9 = 152, /**< reserved */\n\n    SDL_SCANCODE_ALTERASE = 153, /**< Erase-Eaze */\n    SDL_SCANCODE_SYSREQ = 154,\n    SDL_SCANCODE_CANCEL = 155,\n    SDL_SCANCODE_CLEAR = 156,\n    SDL_SCANCODE_PRIOR = 157,\n    SDL_SCANCODE_RETURN2 = 158,\n    SDL_SCANCODE_SEPARATOR = 159,\n    SDL_SCANCODE_OUT = 160,\n    SDL_SCANCODE_OPER = 161,\n    SDL_SCANCODE_CLEARAGAIN = 162,\n    SDL_SCANCODE_CRSEL = 163,\n    SDL_SCANCODE_EXSEL = 164,\n\n    SDL_SCANCODE_KP_00 = 176,\n    SDL_SCANCODE_KP_000 = 177,\n    SDL_SCANCODE_THOUSANDSSEPARATOR = 178,\n    SDL_SCANCODE_DECIMALSEPARATOR = 179,\n    SDL_SCANCODE_CURRENCYUNIT = 180,\n    SDL_SCANCODE_CURRENCYSUBUNIT = 181,\n    SDL_SCANCODE_KP_LEFTPAREN = 182,\n    SDL_SCANCODE_KP_RIGHTPAREN = 183,\n    SDL_SCANCODE_KP_LEFTBRACE = 184,\n    SDL_SCANCODE_KP_RIGHTBRACE = 185,\n    SDL_SCANCODE_KP_TAB = 186,\n    SDL_SCANCODE_KP_BACKSPACE = 187,\n    SDL_SCANCODE_KP_A = 188,\n    SDL_SCANCODE_KP_B = 189,\n    SDL_SCANCODE_KP_C = 190,\n    SDL_SCANCODE_KP_D = 191,\n    SDL_SCANCODE_KP_E = 192,\n    SDL_SCANCODE_KP_F = 193,\n    SDL_SCANCODE_KP_XOR = 194,\n    SDL_SCANCODE_KP_POWER = 195,\n    SDL_SCANCODE_KP_PERCENT = 196,\n    SDL_SCANCODE_KP_LESS = 197,\n    SDL_SCANCODE_KP_GREATER = 198,\n    SDL_SCANCODE_KP_AMPERSAND = 199,\n    SDL_SCANCODE_KP_DBLAMPERSAND = 200,\n    SDL_SCANCODE_KP_VERTICALBAR = 201,\n    SDL_SCANCODE_KP_DBLVERTICALBAR = 202,\n    SDL_SCANCODE_KP_COLON = 203,\n    SDL_SCANCODE_KP_HASH = 204,\n    SDL_SCANCODE_KP_SPACE = 205,\n    SDL_SCANCODE_KP_AT = 206,\n    SDL_SCANCODE_KP_EXCLAM = 207,\n    SDL_SCANCODE_KP_MEMSTORE = 208,\n    SDL_SCANCODE_KP_MEMRECALL = 209,\n    SDL_SCANCODE_KP_MEMCLEAR = 210,\n    SDL_SCANCODE_KP_MEMADD = 211,\n    SDL_SCANCODE_KP_MEMSUBTRACT = 212,\n    SDL_SCANCODE_KP_MEMMULTIPLY = 213,\n    SDL_SCANCODE_KP_MEMDIVIDE = 214,\n    SDL_SCANCODE_KP_PLUSMINUS = 215,\n    SDL_SCANCODE_KP_CLEAR = 216,\n    SDL_SCANCODE_KP_CLEARENTRY = 217,\n    SDL_SCANCODE_KP_BINARY = 218,\n    SDL_SCANCODE_KP_OCTAL = 219,\n    SDL_SCANCODE_KP_DECIMAL = 220,\n    SDL_SCANCODE_KP_HEXADECIMAL = 221,\n\n    SDL_SCANCODE_LCTRL = 224,\n    SDL_SCANCODE_LSHIFT = 225,\n    SDL_SCANCODE_LALT = 226, /**< alt, option */\n    SDL_SCANCODE_LGUI = 227, /**< windows, command (apple), meta */\n    SDL_SCANCODE_RCTRL = 228,\n    SDL_SCANCODE_RSHIFT = 229,\n    SDL_SCANCODE_RALT = 230, /**< alt gr, option */\n    SDL_SCANCODE_RGUI = 231, /**< windows, command (apple), meta */\n\n    SDL_SCANCODE_MODE = 257,    /**< I'm not sure if this is really not covered\n                                 *   by any of the above, but since there's a\n                                 *   special KMOD_MODE for it I'm adding it here\n                                 */\n\n    /* @} *//* Usage page 0x07 */\n\n    /**\n     *  \\name Usage page 0x0C\n     *\n     *  These values are mapped from usage page 0x0C (USB consumer page).\n     */\n    /* @{ */\n\n    SDL_SCANCODE_AUDIONEXT = 258,\n    SDL_SCANCODE_AUDIOPREV = 259,\n    SDL_SCANCODE_AUDIOSTOP = 260,\n    SDL_SCANCODE_AUDIOPLAY = 261,\n    SDL_SCANCODE_AUDIOMUTE = 262,\n    SDL_SCANCODE_MEDIASELECT = 263,\n    SDL_SCANCODE_WWW = 264,\n    SDL_SCANCODE_MAIL = 265,\n    SDL_SCANCODE_CALCULATOR = 266,\n    SDL_SCANCODE_COMPUTER = 267,\n    SDL_SCANCODE_AC_SEARCH = 268,\n    SDL_SCANCODE_AC_HOME = 269,\n    SDL_SCANCODE_AC_BACK = 270,\n    SDL_SCANCODE_AC_FORWARD = 271,\n    SDL_SCANCODE_AC_STOP = 272,\n    SDL_SCANCODE_AC_REFRESH = 273,\n    SDL_SCANCODE_AC_BOOKMARKS = 274,\n\n    /* @} *//* Usage page 0x0C */\n\n    /**\n     *  \\name Walther keys\n     *\n     *  These are values that Christian Walther added (for mac keyboard?).\n     */\n    /* @{ */\n\n    SDL_SCANCODE_BRIGHTNESSDOWN = 275,\n    SDL_SCANCODE_BRIGHTNESSUP = 276,\n    SDL_SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display\n                                           switch, video mode switch */\n    SDL_SCANCODE_KBDILLUMTOGGLE = 278,\n    SDL_SCANCODE_KBDILLUMDOWN = 279,\n    SDL_SCANCODE_KBDILLUMUP = 280,\n    SDL_SCANCODE_EJECT = 281,\n    SDL_SCANCODE_SLEEP = 282,\n\n    SDL_SCANCODE_APP1 = 283,\n    SDL_SCANCODE_APP2 = 284,\n\n    /* @} *//* Walther keys */\n\n    /* Add any other keys here. */\n\n    SDL_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes\n                                 for array bounds */\n} SDL_Scancode;\n\n#endif /* _SDL_scancode_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_shape.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_shape_h\n#define _SDL_shape_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_pixels.h\"\n#include \"SDL_rect.h\"\n#include \"SDL_surface.h\"\n#include \"SDL_video.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** \\file SDL_shape.h\n *\n * Header file for the shaped window API.\n */\n\n#define SDL_NONSHAPEABLE_WINDOW -1\n#define SDL_INVALID_SHAPE_ARGUMENT -2\n#define SDL_WINDOW_LACKS_SHAPE -3\n\n/**\n *  \\brief Create a window that can be shaped with the specified position, dimensions, and flags.\n *\n *  \\param title The title of the window, in UTF-8 encoding.\n *  \\param x     The x position of the window, ::SDL_WINDOWPOS_CENTERED, or\n *               ::SDL_WINDOWPOS_UNDEFINED.\n *  \\param y     The y position of the window, ::SDL_WINDOWPOS_CENTERED, or\n *               ::SDL_WINDOWPOS_UNDEFINED.\n *  \\param w     The width of the window.\n *  \\param h     The height of the window.\n *  \\param flags The flags for the window, a mask of SDL_WINDOW_BORDERLESS with any of the following:\n *               ::SDL_WINDOW_OPENGL,     ::SDL_WINDOW_INPUT_GRABBED,\n *               ::SDL_WINDOW_HIDDEN,     ::SDL_WINDOW_RESIZABLE,\n *               ::SDL_WINDOW_MAXIMIZED,  ::SDL_WINDOW_MINIMIZED,\n *       ::SDL_WINDOW_BORDERLESS is always set, and ::SDL_WINDOW_FULLSCREEN is always unset.\n *\n *  \\return The window created, or NULL if window creation failed.\n *\n *  \\sa SDL_DestroyWindow()\n */\nextern DECLSPEC SDL_Window * SDLCALL SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags);\n\n/**\n * \\brief Return whether the given window is a shaped window.\n *\n * \\param window The window to query for being shaped.\n *\n * \\return SDL_TRUE if the window is a window that can be shaped, SDL_FALSE if the window is unshaped or NULL.\n * \\sa SDL_CreateShapedWindow\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_IsShapedWindow(const SDL_Window *window);\n\n/** \\brief An enum denoting the specific type of contents present in an SDL_WindowShapeParams union. */\ntypedef enum {\n    /** \\brief The default mode, a binarized alpha cutoff of 1. */\n    ShapeModeDefault,\n    /** \\brief A binarized alpha cutoff with a given integer value. */\n    ShapeModeBinarizeAlpha,\n    /** \\brief A binarized alpha cutoff with a given integer value, but with the opposite comparison. */\n    ShapeModeReverseBinarizeAlpha,\n    /** \\brief A color key is applied. */\n    ShapeModeColorKey\n} WindowShapeMode;\n\n#define SDL_SHAPEMODEALPHA(mode) (mode == ShapeModeDefault || mode == ShapeModeBinarizeAlpha || mode == ShapeModeReverseBinarizeAlpha)\n\n/** \\brief A union containing parameters for shaped windows. */\ntypedef union {\n    /** \\brief a cutoff alpha value for binarization of the window shape's alpha channel. */\n    Uint8 binarizationCutoff;\n    SDL_Color colorKey;\n} SDL_WindowShapeParams;\n\n/** \\brief A struct that tags the SDL_WindowShapeParams union with an enum describing the type of its contents. */\ntypedef struct SDL_WindowShapeMode {\n    /** \\brief The mode of these window-shape parameters. */\n    WindowShapeMode mode;\n    /** \\brief Window-shape parameters. */\n    SDL_WindowShapeParams parameters;\n} SDL_WindowShapeMode;\n\n/**\n * \\brief Set the shape and parameters of a shaped window.\n *\n * \\param window The shaped window whose parameters should be set.\n * \\param shape A surface encoding the desired shape for the window.\n * \\param shape_mode The parameters to set for the shaped window.\n *\n * \\return 0 on success, SDL_INVALID_SHAPE_ARGUMENT on invalid an invalid shape argument, or SDL_NONSHAPEABLE_WINDOW\n *           if the SDL_Window* given does not reference a valid shaped window.\n *\n * \\sa SDL_WindowShapeMode\n * \\sa SDL_GetShapedWindowMode.\n */\nextern DECLSPEC int SDLCALL SDL_SetWindowShape(SDL_Window *window,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);\n\n/**\n * \\brief Get the shape parameters of a shaped window.\n *\n * \\param window The shaped window whose parameters should be retrieved.\n * \\param shape_mode An empty shape-mode structure to fill, or NULL to check whether the window has a shape.\n *\n * \\return 0 if the window has a shape and, provided shape_mode was not NULL, shape_mode has been filled with the mode\n *           data, SDL_NONSHAPEABLE_WINDOW if the SDL_Window given is not a shaped window, or SDL_WINDOW_LACKS_SHAPE if\n *           the SDL_Window* given is a shapeable window currently lacking a shape.\n *\n * \\sa SDL_WindowShapeMode\n * \\sa SDL_SetWindowShape\n */\nextern DECLSPEC int SDLCALL SDL_GetShapedWindowMode(SDL_Window *window,SDL_WindowShapeMode *shape_mode);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_shape_h */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_stdinc.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_stdinc.h\n *\n *  This is a general header that includes C language support.\n */\n\n#ifndef _SDL_stdinc_h\n#define _SDL_stdinc_h\n\n#include \"SDL_config.h\"\n\n#ifdef HAVE_SYS_TYPES_H\n#include <sys/types.h>\n#endif\n#ifdef HAVE_STDIO_H\n#include <stdio.h>\n#endif\n#if defined(STDC_HEADERS)\n# include <stdlib.h>\n# include <stddef.h>\n# include <stdarg.h>\n#else\n# if defined(HAVE_STDLIB_H)\n#  include <stdlib.h>\n# elif defined(HAVE_MALLOC_H)\n#  include <malloc.h>\n# endif\n# if defined(HAVE_STDDEF_H)\n#  include <stddef.h>\n# endif\n# if defined(HAVE_STDARG_H)\n#  include <stdarg.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#if defined(HAVE_INTTYPES_H)\n# include <inttypes.h>\n#elif defined(HAVE_STDINT_H)\n# include <stdint.h>\n#endif\n#ifdef HAVE_CTYPE_H\n# include <ctype.h>\n#endif\n#ifdef HAVE_MATH_H\n# if defined(__WINRT__)\n/* Defining _USE_MATH_DEFINES is required to get M_PI to be defined on\n   WinRT.  See http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx\n   for more information.\n*/\n#  define _USE_MATH_DEFINES\n# endif\n# include <math.h>\n#endif\n#ifdef HAVE_FLOAT_H\n# include <float.h>\n#endif\n\n/**\n *  The number of elements in an array.\n */\n#define SDL_arraysize(array)    (sizeof(array)/sizeof(array[0]))\n#define SDL_TABLESIZE(table)    SDL_arraysize(table)\n\n/**\n *  Macro useful for building other macros with strings in them\n *\n *  e.g. #define LOG_ERROR(X) OutputDebugString(SDL_STRINGIFY_ARG(__FUNCTION__) \": \" X \"\\n\")\n */\n#define SDL_STRINGIFY_ARG(arg)  #arg\n\n/**\n *  \\name Cast operators\n *\n *  Use proper C++ casts when compiled as C++ to be compatible with the option\n *  -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above).\n */\n/* @{ */\n#ifdef __cplusplus\n#define SDL_reinterpret_cast(type, expression) reinterpret_cast<type>(expression)\n#define SDL_static_cast(type, expression) static_cast<type>(expression)\n#define SDL_const_cast(type, expression) const_cast<type>(expression)\n#else\n#define SDL_reinterpret_cast(type, expression) ((type)(expression))\n#define SDL_static_cast(type, expression) ((type)(expression))\n#define SDL_const_cast(type, expression) ((type)(expression))\n#endif\n/* @} *//* Cast operators */\n\n/* Define a four character code as a Uint32 */\n#define SDL_FOURCC(A, B, C, D) \\\n    ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \\\n     (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \\\n     (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \\\n     (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24))\n\n/**\n *  \\name Basic data types\n */\n/* @{ */\n\ntypedef enum\n{\n    SDL_FALSE = 0,\n    SDL_TRUE = 1\n} SDL_bool;\n\n/**\n * \\brief A signed 8-bit integer type.\n */\ntypedef int8_t Sint8;\n/**\n * \\brief An unsigned 8-bit integer type.\n */\ntypedef uint8_t Uint8;\n/**\n * \\brief A signed 16-bit integer type.\n */\ntypedef int16_t Sint16;\n/**\n * \\brief An unsigned 16-bit integer type.\n */\ntypedef uint16_t Uint16;\n/**\n * \\brief A signed 32-bit integer type.\n */\ntypedef int32_t Sint32;\n/**\n * \\brief An unsigned 32-bit integer type.\n */\ntypedef uint32_t Uint32;\n\n/**\n * \\brief A signed 64-bit integer type.\n */\ntypedef int64_t Sint64;\n/**\n * \\brief An unsigned 64-bit integer type.\n */\ntypedef uint64_t Uint64;\n\n/* @} *//* Basic data types */\n\n/* Make sure we have macros for printing 64 bit values.\n * <stdint.h> should define these but this is not true all platforms.\n * (for example win32) */\n#ifndef SDL_PRIs64\n#ifdef PRIs64\n#define SDL_PRIs64 PRIs64\n#elif defined(__WIN32__)\n#define SDL_PRIs64 \"I64d\"\n#elif defined(__LINUX__) && defined(__LP64__)\n#define SDL_PRIs64 \"ld\"\n#else\n#define SDL_PRIs64 \"lld\"\n#endif\n#endif\n#ifndef SDL_PRIu64\n#ifdef PRIu64\n#define SDL_PRIu64 PRIu64\n#elif defined(__WIN32__)\n#define SDL_PRIu64 \"I64u\"\n#elif defined(__LINUX__) && defined(__LP64__)\n#define SDL_PRIu64 \"lu\"\n#else\n#define SDL_PRIu64 \"llu\"\n#endif\n#endif\n#ifndef SDL_PRIx64\n#ifdef PRIx64\n#define SDL_PRIx64 PRIx64\n#elif defined(__WIN32__)\n#define SDL_PRIx64 \"I64x\"\n#elif defined(__LINUX__) && defined(__LP64__)\n#define SDL_PRIx64 \"lx\"\n#else\n#define SDL_PRIx64 \"llx\"\n#endif\n#endif\n#ifndef SDL_PRIX64\n#ifdef PRIX64\n#define SDL_PRIX64 PRIX64\n#elif defined(__WIN32__)\n#define SDL_PRIX64 \"I64X\"\n#elif defined(__LINUX__) && defined(__LP64__)\n#define SDL_PRIX64 \"lX\"\n#else\n#define SDL_PRIX64 \"llX\"\n#endif\n#endif\n\n/* Annotations to help code analysis tools */\n#ifdef SDL_DISABLE_ANALYZE_MACROS\n#define SDL_IN_BYTECAP(x)\n#define SDL_INOUT_Z_CAP(x)\n#define SDL_OUT_Z_CAP(x)\n#define SDL_OUT_CAP(x)\n#define SDL_OUT_BYTECAP(x)\n#define SDL_OUT_Z_BYTECAP(x)\n#define SDL_PRINTF_FORMAT_STRING\n#define SDL_SCANF_FORMAT_STRING\n#define SDL_PRINTF_VARARG_FUNC( fmtargnumber )\n#define SDL_SCANF_VARARG_FUNC( fmtargnumber )\n#else\n#if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */\n#include <sal.h>\n\n#define SDL_IN_BYTECAP(x) _In_bytecount_(x)\n#define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x)\n#define SDL_OUT_Z_CAP(x) _Out_z_cap_(x)\n#define SDL_OUT_CAP(x) _Out_cap_(x)\n#define SDL_OUT_BYTECAP(x) _Out_bytecap_(x)\n#define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x)\n\n#define SDL_PRINTF_FORMAT_STRING _Printf_format_string_\n#define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_\n#else\n#define SDL_IN_BYTECAP(x)\n#define SDL_INOUT_Z_CAP(x)\n#define SDL_OUT_Z_CAP(x)\n#define SDL_OUT_CAP(x)\n#define SDL_OUT_BYTECAP(x)\n#define SDL_OUT_Z_BYTECAP(x)\n#define SDL_PRINTF_FORMAT_STRING\n#define SDL_SCANF_FORMAT_STRING\n#endif\n#if defined(__GNUC__)\n#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 )))\n#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 )))\n#else\n#define SDL_PRINTF_VARARG_FUNC( fmtargnumber )\n#define SDL_SCANF_VARARG_FUNC( fmtargnumber )\n#endif\n#endif /* SDL_DISABLE_ANALYZE_MACROS */\n\n#define SDL_COMPILE_TIME_ASSERT(name, x)               \\\n       typedef int SDL_dummy_ ## name[(x) * 2 - 1]\n/** \\cond */\n#ifndef DOXYGEN_SHOULD_IGNORE_THIS\nSDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1);\nSDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1);\nSDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2);\nSDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2);\nSDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4);\nSDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4);\nSDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8);\nSDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);\n#endif /* DOXYGEN_SHOULD_IGNORE_THIS */\n/** \\endcond */\n\n/* Check to make sure enums are the size of ints, for structure packing.\n   For both Watcom C/C++ and Borland C/C++ the compiler option that makes\n   enums having the size of an int must be enabled.\n   This is \"-b\" for Borland C/C++ and \"-ei\" for Watcom C/C++ (v11).\n*/\n\n/** \\cond */\n#ifndef DOXYGEN_SHOULD_IGNORE_THIS\n#if !defined(__ANDROID__)\n   /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */\ntypedef enum\n{\n    DUMMY_ENUM_VALUE\n} SDL_DUMMY_ENUM;\n\nSDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));\n#endif\n#endif /* DOXYGEN_SHOULD_IGNORE_THIS */\n/** \\endcond */\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(HAVE_ALLOCA) && !defined(alloca)\n# if defined(HAVE_ALLOCA_H)\n#  include <alloca.h>\n# elif defined(__GNUC__)\n#  define alloca __builtin_alloca\n# elif defined(_MSC_VER)\n#  include <malloc.h>\n#  define alloca _alloca\n# elif defined(__WATCOMC__)\n#  include <malloc.h>\n# elif defined(__BORLANDC__)\n#  include <malloc.h>\n# elif defined(__DMC__)\n#  include <stdlib.h>\n# elif defined(__AIX__)\n#pragma alloca\n# elif defined(__MRC__)\nvoid *alloca(unsigned);\n# else\nchar *alloca();\n# endif\n#endif\n#ifdef HAVE_ALLOCA\n#define SDL_stack_alloc(type, count)    (type*)alloca(sizeof(type)*(count))\n#define SDL_stack_free(data)\n#else\n#define SDL_stack_alloc(type, count)    (type*)SDL_malloc(sizeof(type)*(count))\n#define SDL_stack_free(data)            SDL_free(data)\n#endif\n\nextern DECLSPEC void *SDLCALL SDL_malloc(size_t size);\nextern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size);\nextern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size);\nextern DECLSPEC void SDLCALL SDL_free(void *mem);\n\nextern DECLSPEC char *SDLCALL SDL_getenv(const char *name);\nextern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite);\n\nextern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (*compare) (const void *, const void *));\n\nextern DECLSPEC int SDLCALL SDL_abs(int x);\n\n/* !!! FIXME: these have side effects. You probably shouldn't use them. */\n/* !!! FIXME: Maybe we do forceinline functions of SDL_mini, SDL_minf, etc? */\n#define SDL_min(x, y) (((x) < (y)) ? (x) : (y))\n#define SDL_max(x, y) (((x) > (y)) ? (x) : (y))\n\nextern DECLSPEC int SDLCALL SDL_isdigit(int x);\nextern DECLSPEC int SDLCALL SDL_isspace(int x);\nextern DECLSPEC int SDLCALL SDL_toupper(int x);\nextern DECLSPEC int SDLCALL SDL_tolower(int x);\n\nextern DECLSPEC void *SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len);\n\n#define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x)))\n#define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x)))\n\n/* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */\nSDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords)\n{\n#if defined(__GNUC__) && defined(i386)\n    int u0, u1, u2;\n    __asm__ __volatile__ (\n        \"cld \\n\\t\"\n        \"rep ; stosl \\n\\t\"\n        : \"=&D\" (u0), \"=&a\" (u1), \"=&c\" (u2)\n        : \"0\" (dst), \"1\" (val), \"2\" (SDL_static_cast(Uint32, dwords))\n        : \"memory\"\n    );\n#else\n    size_t _n = (dwords + 3) / 4;\n    Uint32 *_p = SDL_static_cast(Uint32 *, dst);\n    Uint32 _val = (val);\n    if (dwords == 0)\n        return;\n    switch (dwords % 4)\n    {\n        case 0: do {    *_p++ = _val;\n        case 3:         *_p++ = _val;\n        case 2:         *_p++ = _val;\n        case 1:         *_p++ = _val;\n        } while ( --_n );\n    }\n#endif\n}\n\n\nextern DECLSPEC void *SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len);\n\nextern DECLSPEC void *SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len);\nextern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len);\n\nextern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr);\nextern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen);\nextern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen);\n\nextern DECLSPEC size_t SDLCALL SDL_strlen(const char *str);\nextern DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen);\nextern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes);\nextern DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen);\nextern DECLSPEC char *SDLCALL SDL_strdup(const char *str);\nextern DECLSPEC char *SDLCALL SDL_strrev(char *str);\nextern DECLSPEC char *SDLCALL SDL_strupr(char *str);\nextern DECLSPEC char *SDLCALL SDL_strlwr(char *str);\nextern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c);\nextern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c);\nextern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle);\n\nextern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix);\nextern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix);\nextern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix);\nextern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix);\nextern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix);\nextern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix);\n\nextern DECLSPEC int SDLCALL SDL_atoi(const char *str);\nextern DECLSPEC double SDLCALL SDL_atof(const char *str);\nextern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base);\nextern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base);\nextern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base);\nextern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base);\nextern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp);\n\nextern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2);\nextern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen);\nextern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2);\nextern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len);\n\nextern DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2);\nextern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, const char *fmt, va_list ap);\nextern DECLSPEC int SDLCALL SDL_snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ... ) SDL_PRINTF_VARARG_FUNC(3);\nextern DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, va_list ap);\n\n#ifndef HAVE_M_PI\n#ifndef M_PI\n#define M_PI    3.14159265358979323846264338327950288   /* pi */\n#endif\n#endif\n\nextern DECLSPEC double SDLCALL SDL_acos(double x);\nextern DECLSPEC double SDLCALL SDL_asin(double x);\nextern DECLSPEC double SDLCALL SDL_atan(double x);\nextern DECLSPEC double SDLCALL SDL_atan2(double x, double y);\nextern DECLSPEC double SDLCALL SDL_ceil(double x);\nextern DECLSPEC double SDLCALL SDL_copysign(double x, double y);\nextern DECLSPEC double SDLCALL SDL_cos(double x);\nextern DECLSPEC float SDLCALL SDL_cosf(float x);\nextern DECLSPEC double SDLCALL SDL_fabs(double x);\nextern DECLSPEC double SDLCALL SDL_floor(double x);\nextern DECLSPEC double SDLCALL SDL_log(double x);\nextern DECLSPEC double SDLCALL SDL_pow(double x, double y);\nextern DECLSPEC double SDLCALL SDL_scalbn(double x, int n);\nextern DECLSPEC double SDLCALL SDL_sin(double x);\nextern DECLSPEC float SDLCALL SDL_sinf(float x);\nextern DECLSPEC double SDLCALL SDL_sqrt(double x);\nextern DECLSPEC float SDLCALL SDL_sqrtf(float x);\nextern DECLSPEC double SDLCALL SDL_tan(double x);\nextern DECLSPEC float SDLCALL SDL_tanf(float x);\n\n/* The SDL implementation of iconv() returns these error codes */\n#define SDL_ICONV_ERROR     (size_t)-1\n#define SDL_ICONV_E2BIG     (size_t)-2\n#define SDL_ICONV_EILSEQ    (size_t)-3\n#define SDL_ICONV_EINVAL    (size_t)-4\n\n/* SDL_iconv_* are now always real symbols/types, not macros or inlined. */\ntypedef struct _SDL_iconv_t *SDL_iconv_t;\nextern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode,\n                                                   const char *fromcode);\nextern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd);\nextern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf,\n                                         size_t * inbytesleft, char **outbuf,\n                                         size_t * outbytesleft);\n/**\n *  This function converts a string between encodings in one pass, returning a\n *  string that must be freed with SDL_free() or NULL on error.\n */\nextern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode,\n                                               const char *fromcode,\n                                               const char *inbuf,\n                                               size_t inbytesleft);\n#define SDL_iconv_utf8_locale(S)    SDL_iconv_string(\"\", \"UTF-8\", S, SDL_strlen(S)+1)\n#define SDL_iconv_utf8_ucs2(S)      (Uint16 *)SDL_iconv_string(\"UCS-2-INTERNAL\", \"UTF-8\", S, SDL_strlen(S)+1)\n#define SDL_iconv_utf8_ucs4(S)      (Uint32 *)SDL_iconv_string(\"UCS-4-INTERNAL\", \"UTF-8\", S, SDL_strlen(S)+1)\n\n/* force builds using Clang's static analysis tools to use literal C runtime\n   here, since there are possibly tests that are ineffective otherwise. */\n#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)\n#define SDL_malloc malloc\n#define SDL_calloc calloc\n#define SDL_realloc realloc\n#define SDL_free free\n#define SDL_memset memset\n#define SDL_memcpy memcpy\n#define SDL_memmove memmove\n#define SDL_memcmp memcmp\n#define SDL_strlen strlen\n#define SDL_strlcpy strlcpy\n#define SDL_strlcat strlcat\n#define SDL_strdup strdup\n#define SDL_strchr strchr\n#define SDL_strrchr strrchr\n#define SDL_strstr strstr\n#define SDL_strcmp strcmp\n#define SDL_strncmp strncmp\n#define SDL_strcasecmp strcasecmp\n#define SDL_strncasecmp strncasecmp\n#define SDL_sscanf sscanf\n#define SDL_vsscanf vsscanf\n#define SDL_snprintf snprintf\n#define SDL_vsnprintf vsnprintf\n#endif\n\nSDL_FORCE_INLINE void *SDL_memcpy4(SDL_OUT_BYTECAP(dwords*4) void *dst, SDL_IN_BYTECAP(dwords*4) const void *src, size_t dwords)\n{\n    return SDL_memcpy(dst, src, dwords * 4);\n}\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_stdinc_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_surface.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_surface.h\n *\n *  Header file for ::SDL_Surface definition and management functions.\n */\n\n#ifndef _SDL_surface_h\n#define _SDL_surface_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_pixels.h\"\n#include \"SDL_rect.h\"\n#include \"SDL_blendmode.h\"\n#include \"SDL_rwops.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\name Surface flags\n *\n *  These are the currently supported flags for the ::SDL_Surface.\n *\n *  \\internal\n *  Used internally (read-only).\n */\n/* @{ */\n#define SDL_SWSURFACE       0           /**< Just here for compatibility */\n#define SDL_PREALLOC        0x00000001  /**< Surface uses preallocated memory */\n#define SDL_RLEACCEL        0x00000002  /**< Surface is RLE encoded */\n#define SDL_DONTFREE        0x00000004  /**< Surface is referenced internally */\n/* @} *//* Surface flags */\n\n/**\n *  Evaluates to true if the surface needs to be locked before access.\n */\n#define SDL_MUSTLOCK(S) (((S)->flags & SDL_RLEACCEL) != 0)\n\n/**\n * \\brief A collection of pixels used in software blitting.\n *\n * \\note  This structure should be treated as read-only, except for \\c pixels,\n *        which, if not NULL, contains the raw pixel data for the surface.\n */\ntypedef struct SDL_Surface\n{\n    Uint32 flags;               /**< Read-only */\n    SDL_PixelFormat *format;    /**< Read-only */\n    int w, h;                   /**< Read-only */\n    int pitch;                  /**< Read-only */\n    void *pixels;               /**< Read-write */\n\n    /** Application data associated with the surface */\n    void *userdata;             /**< Read-write */\n\n    /** information needed for surfaces requiring locks */\n    int locked;                 /**< Read-only */\n    void *lock_data;            /**< Read-only */\n\n    /** clipping information */\n    SDL_Rect clip_rect;         /**< Read-only */\n\n    /** info for fast blit mapping to other surfaces */\n    struct SDL_BlitMap *map;    /**< Private */\n\n    /** Reference count -- used when freeing surface */\n    int refcount;               /**< Read-mostly */\n} SDL_Surface;\n\n/**\n * \\brief The type of function used for surface blitting functions.\n */\ntypedef int (*SDL_blit) (struct SDL_Surface * src, SDL_Rect * srcrect,\n                         struct SDL_Surface * dst, SDL_Rect * dstrect);\n\n/**\n *  Allocate and free an RGB surface.\n *\n *  If the depth is 4 or 8 bits, an empty palette is allocated for the surface.\n *  If the depth is greater than 8 bits, the pixel format is set using the\n *  flags '[RGB]mask'.\n *\n *  If the function runs out of memory, it will return NULL.\n *\n *  \\param flags The \\c flags are obsolete and should be set to 0.\n *  \\param width The width in pixels of the surface to create.\n *  \\param height The height in pixels of the surface to create.\n *  \\param depth The depth in bits of the surface to create.\n *  \\param Rmask The red mask of the surface to create.\n *  \\param Gmask The green mask of the surface to create.\n *  \\param Bmask The blue mask of the surface to create.\n *  \\param Amask The alpha mask of the surface to create.\n */\nextern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurface\n    (Uint32 flags, int width, int height, int depth,\n     Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);\nextern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceWithFormat\n    (Uint32 flags, int width, int height, int depth, Uint32 format);\nextern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels,\n                                                              int width,\n                                                              int height,\n                                                              int depth,\n                                                              int pitch,\n                                                              Uint32 Rmask,\n                                                              Uint32 Gmask,\n                                                              Uint32 Bmask,\n                                                              Uint32 Amask);\nextern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceWithFormatFrom\n    (void *pixels, int width, int height, int depth, int pitch, Uint32 format);\nextern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface * surface);\n\n/**\n *  \\brief Set the palette used by a surface.\n *\n *  \\return 0, or -1 if the surface format doesn't use a palette.\n *\n *  \\note A single palette can be shared with many surfaces.\n */\nextern DECLSPEC int SDLCALL SDL_SetSurfacePalette(SDL_Surface * surface,\n                                                  SDL_Palette * palette);\n\n/**\n *  \\brief Sets up a surface for directly accessing the pixels.\n *\n *  Between calls to SDL_LockSurface() / SDL_UnlockSurface(), you can write\n *  to and read from \\c surface->pixels, using the pixel format stored in\n *  \\c surface->format.  Once you are done accessing the surface, you should\n *  use SDL_UnlockSurface() to release it.\n *\n *  Not all surfaces require locking.  If SDL_MUSTLOCK(surface) evaluates\n *  to 0, then you can read and write to the surface at any time, and the\n *  pixel format of the surface will not change.\n *\n *  No operating system or library calls should be made between lock/unlock\n *  pairs, as critical system locks may be held during this time.\n *\n *  SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked.\n *\n *  \\sa SDL_UnlockSurface()\n */\nextern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface * surface);\n/** \\sa SDL_LockSurface() */\nextern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface * surface);\n\n/**\n *  Load a surface from a seekable SDL data stream (memory or file).\n *\n *  If \\c freesrc is non-zero, the stream will be closed after being read.\n *\n *  The new surface should be freed with SDL_FreeSurface().\n *\n *  \\return the new surface, or NULL if there was an error.\n */\nextern DECLSPEC SDL_Surface *SDLCALL SDL_LoadBMP_RW(SDL_RWops * src,\n                                                    int freesrc);\n\n/**\n *  Load a surface from a file.\n *\n *  Convenience macro.\n */\n#define SDL_LoadBMP(file)   SDL_LoadBMP_RW(SDL_RWFromFile(file, \"rb\"), 1)\n\n/**\n *  Save a surface to a seekable SDL data stream (memory or file).\n *\n *  Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the\n *  BMP directly. Other RGB formats with 8-bit or higher get converted to a\n *  24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit\n *  surface before they are saved. YUV and paletted 1-bit and 4-bit formats are\n *  not supported.\n *\n *  If \\c freedst is non-zero, the stream will be closed after being written.\n *\n *  \\return 0 if successful or -1 if there was an error.\n */\nextern DECLSPEC int SDLCALL SDL_SaveBMP_RW\n    (SDL_Surface * surface, SDL_RWops * dst, int freedst);\n\n/**\n *  Save a surface to a file.\n *\n *  Convenience macro.\n */\n#define SDL_SaveBMP(surface, file) \\\n        SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, \"wb\"), 1)\n\n/**\n *  \\brief Sets the RLE acceleration hint for a surface.\n *\n *  \\return 0 on success, or -1 if the surface is not valid\n *\n *  \\note If RLE is enabled, colorkey and alpha blending blits are much faster,\n *        but the surface must be locked before directly accessing the pixels.\n */\nextern DECLSPEC int SDLCALL SDL_SetSurfaceRLE(SDL_Surface * surface,\n                                              int flag);\n\n/**\n *  \\brief Sets the color key (transparent pixel) in a blittable surface.\n *\n *  \\param surface The surface to update\n *  \\param flag Non-zero to enable colorkey and 0 to disable colorkey\n *  \\param key The transparent pixel in the native surface format\n *\n *  \\return 0 on success, or -1 if the surface is not valid\n *\n *  You can pass SDL_RLEACCEL to enable RLE accelerated blits.\n */\nextern DECLSPEC int SDLCALL SDL_SetColorKey(SDL_Surface * surface,\n                                            int flag, Uint32 key);\n\n/**\n *  \\brief Gets the color key (transparent pixel) in a blittable surface.\n *\n *  \\param surface The surface to update\n *  \\param key A pointer filled in with the transparent pixel in the native\n *             surface format\n *\n *  \\return 0 on success, or -1 if the surface is not valid or colorkey is not\n *          enabled.\n */\nextern DECLSPEC int SDLCALL SDL_GetColorKey(SDL_Surface * surface,\n                                            Uint32 * key);\n\n/**\n *  \\brief Set an additional color value used in blit operations.\n *\n *  \\param surface The surface to update.\n *  \\param r The red color value multiplied into blit operations.\n *  \\param g The green color value multiplied into blit operations.\n *  \\param b The blue color value multiplied into blit operations.\n *\n *  \\return 0 on success, or -1 if the surface is not valid.\n *\n *  \\sa SDL_GetSurfaceColorMod()\n */\nextern DECLSPEC int SDLCALL SDL_SetSurfaceColorMod(SDL_Surface * surface,\n                                                   Uint8 r, Uint8 g, Uint8 b);\n\n\n/**\n *  \\brief Get the additional color value used in blit operations.\n *\n *  \\param surface The surface to query.\n *  \\param r A pointer filled in with the current red color value.\n *  \\param g A pointer filled in with the current green color value.\n *  \\param b A pointer filled in with the current blue color value.\n *\n *  \\return 0 on success, or -1 if the surface is not valid.\n *\n *  \\sa SDL_SetSurfaceColorMod()\n */\nextern DECLSPEC int SDLCALL SDL_GetSurfaceColorMod(SDL_Surface * surface,\n                                                   Uint8 * r, Uint8 * g,\n                                                   Uint8 * b);\n\n/**\n *  \\brief Set an additional alpha value used in blit operations.\n *\n *  \\param surface The surface to update.\n *  \\param alpha The alpha value multiplied into blit operations.\n *\n *  \\return 0 on success, or -1 if the surface is not valid.\n *\n *  \\sa SDL_GetSurfaceAlphaMod()\n */\nextern DECLSPEC int SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface * surface,\n                                                   Uint8 alpha);\n\n/**\n *  \\brief Get the additional alpha value used in blit operations.\n *\n *  \\param surface The surface to query.\n *  \\param alpha A pointer filled in with the current alpha value.\n *\n *  \\return 0 on success, or -1 if the surface is not valid.\n *\n *  \\sa SDL_SetSurfaceAlphaMod()\n */\nextern DECLSPEC int SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface * surface,\n                                                   Uint8 * alpha);\n\n/**\n *  \\brief Set the blend mode used for blit operations.\n *\n *  \\param surface The surface to update.\n *  \\param blendMode ::SDL_BlendMode to use for blit blending.\n *\n *  \\return 0 on success, or -1 if the parameters are not valid.\n *\n *  \\sa SDL_GetSurfaceBlendMode()\n */\nextern DECLSPEC int SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface * surface,\n                                                    SDL_BlendMode blendMode);\n\n/**\n *  \\brief Get the blend mode used for blit operations.\n *\n *  \\param surface   The surface to query.\n *  \\param blendMode A pointer filled in with the current blend mode.\n *\n *  \\return 0 on success, or -1 if the surface is not valid.\n *\n *  \\sa SDL_SetSurfaceBlendMode()\n */\nextern DECLSPEC int SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface * surface,\n                                                    SDL_BlendMode *blendMode);\n\n/**\n *  Sets the clipping rectangle for the destination surface in a blit.\n *\n *  If the clip rectangle is NULL, clipping will be disabled.\n *\n *  If the clip rectangle doesn't intersect the surface, the function will\n *  return SDL_FALSE and blits will be completely clipped.  Otherwise the\n *  function returns SDL_TRUE and blits to the surface will be clipped to\n *  the intersection of the surface area and the clipping rectangle.\n *\n *  Note that blits are automatically clipped to the edges of the source\n *  and destination surfaces.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface * surface,\n                                                 const SDL_Rect * rect);\n\n/**\n *  Gets the clipping rectangle for the destination surface in a blit.\n *\n *  \\c rect must be a pointer to a valid rectangle which will be filled\n *  with the correct values.\n */\nextern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface * surface,\n                                             SDL_Rect * rect);\n\n/**\n *  Creates a new surface of the specified format, and then copies and maps\n *  the given surface to it so the blit of the converted surface will be as\n *  fast as possible.  If this function fails, it returns NULL.\n *\n *  The \\c flags parameter is passed to SDL_CreateRGBSurface() and has those\n *  semantics.  You can also pass ::SDL_RLEACCEL in the flags parameter and\n *  SDL will try to RLE accelerate colorkey and alpha blits in the resulting\n *  surface.\n */\nextern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurface\n    (SDL_Surface * src, const SDL_PixelFormat * fmt, Uint32 flags);\nextern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurfaceFormat\n    (SDL_Surface * src, Uint32 pixel_format, Uint32 flags);\n\n/**\n * \\brief Copy a block of pixels of one format to another format\n *\n *  \\return 0 on success, or -1 if there was an error\n */\nextern DECLSPEC int SDLCALL SDL_ConvertPixels(int width, int height,\n                                              Uint32 src_format,\n                                              const void * src, int src_pitch,\n                                              Uint32 dst_format,\n                                              void * dst, int dst_pitch);\n\n/**\n *  Performs a fast fill of the given rectangle with \\c color.\n *\n *  If \\c rect is NULL, the whole surface will be filled with \\c color.\n *\n *  The color should be a pixel of the format used by the surface, and\n *  can be generated by the SDL_MapRGB() function.\n *\n *  \\return 0 on success, or -1 on error.\n */\nextern DECLSPEC int SDLCALL SDL_FillRect\n    (SDL_Surface * dst, const SDL_Rect * rect, Uint32 color);\nextern DECLSPEC int SDLCALL SDL_FillRects\n    (SDL_Surface * dst, const SDL_Rect * rects, int count, Uint32 color);\n\n/**\n *  Performs a fast blit from the source surface to the destination surface.\n *\n *  This assumes that the source and destination rectangles are\n *  the same size.  If either \\c srcrect or \\c dstrect are NULL, the entire\n *  surface (\\c src or \\c dst) is copied.  The final blit rectangles are saved\n *  in \\c srcrect and \\c dstrect after all clipping is performed.\n *\n *  \\return If the blit is successful, it returns 0, otherwise it returns -1.\n *\n *  The blit function should not be called on a locked surface.\n *\n *  The blit semantics for surfaces with and without blending and colorkey\n *  are defined as follows:\n *  \\verbatim\n    RGBA->RGB:\n      Source surface blend mode set to SDL_BLENDMODE_BLEND:\n        alpha-blend (using the source alpha-channel and per-surface alpha)\n        SDL_SRCCOLORKEY ignored.\n      Source surface blend mode set to SDL_BLENDMODE_NONE:\n        copy RGB.\n        if SDL_SRCCOLORKEY set, only copy the pixels matching the\n        RGB values of the source color key, ignoring alpha in the\n        comparison.\n\n    RGB->RGBA:\n      Source surface blend mode set to SDL_BLENDMODE_BLEND:\n        alpha-blend (using the source per-surface alpha)\n      Source surface blend mode set to SDL_BLENDMODE_NONE:\n        copy RGB, set destination alpha to source per-surface alpha value.\n      both:\n        if SDL_SRCCOLORKEY set, only copy the pixels matching the\n        source color key.\n\n    RGBA->RGBA:\n      Source surface blend mode set to SDL_BLENDMODE_BLEND:\n        alpha-blend (using the source alpha-channel and per-surface alpha)\n        SDL_SRCCOLORKEY ignored.\n      Source surface blend mode set to SDL_BLENDMODE_NONE:\n        copy all of RGBA to the destination.\n        if SDL_SRCCOLORKEY set, only copy the pixels matching the\n        RGB values of the source color key, ignoring alpha in the\n        comparison.\n\n    RGB->RGB:\n      Source surface blend mode set to SDL_BLENDMODE_BLEND:\n        alpha-blend (using the source per-surface alpha)\n      Source surface blend mode set to SDL_BLENDMODE_NONE:\n        copy RGB.\n      both:\n        if SDL_SRCCOLORKEY set, only copy the pixels matching the\n        source color key.\n    \\endverbatim\n *\n *  You should call SDL_BlitSurface() unless you know exactly how SDL\n *  blitting works internally and how to use the other blit functions.\n */\n#define SDL_BlitSurface SDL_UpperBlit\n\n/**\n *  This is the public blit function, SDL_BlitSurface(), and it performs\n *  rectangle validation and clipping before passing it to SDL_LowerBlit()\n */\nextern DECLSPEC int SDLCALL SDL_UpperBlit\n    (SDL_Surface * src, const SDL_Rect * srcrect,\n     SDL_Surface * dst, SDL_Rect * dstrect);\n\n/**\n *  This is a semi-private blit function and it performs low-level surface\n *  blitting only.\n */\nextern DECLSPEC int SDLCALL SDL_LowerBlit\n    (SDL_Surface * src, SDL_Rect * srcrect,\n     SDL_Surface * dst, SDL_Rect * dstrect);\n\n/**\n *  \\brief Perform a fast, low quality, stretch blit between two surfaces of the\n *         same pixel format.\n *\n *  \\note This function uses a static buffer, and is not thread-safe.\n */\nextern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src,\n                                            const SDL_Rect * srcrect,\n                                            SDL_Surface * dst,\n                                            const SDL_Rect * dstrect);\n\n#define SDL_BlitScaled SDL_UpperBlitScaled\n\n/**\n *  This is the public scaled blit function, SDL_BlitScaled(), and it performs\n *  rectangle validation and clipping before passing it to SDL_LowerBlitScaled()\n */\nextern DECLSPEC int SDLCALL SDL_UpperBlitScaled\n    (SDL_Surface * src, const SDL_Rect * srcrect,\n    SDL_Surface * dst, SDL_Rect * dstrect);\n\n/**\n *  This is a semi-private blit function and it performs low-level surface\n *  scaled blitting only.\n */\nextern DECLSPEC int SDLCALL SDL_LowerBlitScaled\n    (SDL_Surface * src, SDL_Rect * srcrect,\n    SDL_Surface * dst, SDL_Rect * dstrect);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_surface_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_system.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_system.h\n *\n *  Include file for platform specific SDL API functions\n */\n\n#ifndef _SDL_system_h\n#define _SDL_system_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_keyboard.h\"\n#include \"SDL_render.h\"\n#include \"SDL_video.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/* Platform specific functions for Windows */\n#ifdef __WIN32__\n\t\n/**\n   \\brief Set a function that is called for every windows message, before TranslateMessage()\n*/\ntypedef void (SDLCALL * SDL_WindowsMessageHook)(void *userdata, void *hWnd, unsigned int message, Uint64 wParam, Sint64 lParam);\nextern DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata);\n\n/**\n   \\brief Returns the D3D9 adapter index that matches the specified display index.\n\n   This adapter index can be passed to IDirect3D9::CreateDevice and controls\n   on which monitor a full screen application will appear.\n*/\nextern DECLSPEC int SDLCALL SDL_Direct3D9GetAdapterIndex( int displayIndex );\n\ntypedef struct IDirect3DDevice9 IDirect3DDevice9;\n/**\n   \\brief Returns the D3D device associated with a renderer, or NULL if it's not a D3D renderer.\n\n   Once you are done using the device, you should release it to avoid a resource leak.\n */\nextern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer * renderer);\n\n/**\n   \\brief Returns the DXGI Adapter and Output indices for the specified display index.\n\n   These can be passed to EnumAdapters and EnumOutputs respectively to get the objects\n   required to create a DX10 or DX11 device and swap chain.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex );\n\n#endif /* __WIN32__ */\n\n\n/* Platform specific functions for iOS */\n#if defined(__IPHONEOS__) && __IPHONEOS__\n\n#define SDL_iOSSetAnimationCallback(window, interval, callback, callbackParam) SDL_iPhoneSetAnimationCallback(window, interval, callback, callbackParam)\nextern DECLSPEC int SDLCALL SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam);\n\n#define SDL_iOSSetEventPump(enabled) SDL_iPhoneSetEventPump(enabled)\nextern DECLSPEC void SDLCALL SDL_iPhoneSetEventPump(SDL_bool enabled);\n\n#endif /* __IPHONEOS__ */\n\n\n/* Platform specific functions for Android */\n#if defined(__ANDROID__) && __ANDROID__\n\n/**\n   \\brief Get the JNI environment for the current thread\n\n   This returns JNIEnv*, but the prototype is void* so we don't need jni.h\n */\nextern DECLSPEC void * SDLCALL SDL_AndroidGetJNIEnv();\n\n/**\n   \\brief Get the SDL Activity object for the application\n\n   This returns jobject, but the prototype is void* so we don't need jni.h\n   The jobject returned by SDL_AndroidGetActivity is a local reference.\n   It is the caller's responsibility to properly release it\n   (using env->Push/PopLocalFrame or manually with env->DeleteLocalRef)\n */\nextern DECLSPEC void * SDLCALL SDL_AndroidGetActivity();\n\n/**\n   See the official Android developer guide for more information:\n   http://developer.android.com/guide/topics/data/data-storage.html\n*/\n#define SDL_ANDROID_EXTERNAL_STORAGE_READ   0x01\n#define SDL_ANDROID_EXTERNAL_STORAGE_WRITE  0x02\n\n/**\n   \\brief Get the path used for internal storage for this application.\n\n   This path is unique to your application and cannot be written to\n   by other applications.\n */\nextern DECLSPEC const char * SDLCALL SDL_AndroidGetInternalStoragePath();\n\n/**\n   \\brief Get the current state of external storage, a bitmask of these values:\n    SDL_ANDROID_EXTERNAL_STORAGE_READ\n    SDL_ANDROID_EXTERNAL_STORAGE_WRITE\n\n   If external storage is currently unavailable, this will return 0.\n*/\nextern DECLSPEC int SDLCALL SDL_AndroidGetExternalStorageState();\n\n/**\n   \\brief Get the path used for external storage for this application.\n\n   This path is unique to your application, but is public and can be\n   written to by other applications.\n */\nextern DECLSPEC const char * SDLCALL SDL_AndroidGetExternalStoragePath();\n\n#endif /* __ANDROID__ */\n\n/* Platform specific functions for WinRT */\n#if defined(__WINRT__) && __WINRT__\n\n/**\n *  \\brief WinRT / Windows Phone path types\n */\ntypedef enum\n{\n    /** \\brief The installed app's root directory.\n        Files here are likely to be read-only. */\n    SDL_WINRT_PATH_INSTALLED_LOCATION,\n\n    /** \\brief The app's local data store.  Files may be written here */\n    SDL_WINRT_PATH_LOCAL_FOLDER,\n\n    /** \\brief The app's roaming data store.  Unsupported on Windows Phone.\n        Files written here may be copied to other machines via a network\n        connection.\n    */\n    SDL_WINRT_PATH_ROAMING_FOLDER,\n\n    /** \\brief The app's temporary data store.  Unsupported on Windows Phone.\n        Files written here may be deleted at any time. */\n    SDL_WINRT_PATH_TEMP_FOLDER\n} SDL_WinRT_Path;\n\n\n/**\n *  \\brief Retrieves a WinRT defined path on the local file system\n *\n *  \\note Documentation on most app-specific path types on WinRT\n *      can be found on MSDN, at the URL:\n *      http://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx\n *\n *  \\param pathType The type of path to retrieve.\n *  \\return A UCS-2 string (16-bit, wide-char) containing the path, or NULL\n *      if the path is not available for any reason.  Not all paths are\n *      available on all versions of Windows.  This is especially true on\n *      Windows Phone.  Check the documentation for the given\n *      SDL_WinRT_Path for more information on which path types are\n *      supported where.\n */\nextern DECLSPEC const wchar_t * SDLCALL SDL_WinRTGetFSPathUNICODE(SDL_WinRT_Path pathType);\n\n/**\n *  \\brief Retrieves a WinRT defined path on the local file system\n *\n *  \\note Documentation on most app-specific path types on WinRT\n *      can be found on MSDN, at the URL:\n *      http://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx\n *\n *  \\param pathType The type of path to retrieve.\n *  \\return A UTF-8 string (8-bit, multi-byte) containing the path, or NULL\n *      if the path is not available for any reason.  Not all paths are\n *      available on all versions of Windows.  This is especially true on\n *      Windows Phone.  Check the documentation for the given\n *      SDL_WinRT_Path for more information on which path types are\n *      supported where.\n */\nextern DECLSPEC const char * SDLCALL SDL_WinRTGetFSPathUTF8(SDL_WinRT_Path pathType);\n\n#endif /* __WINRT__ */\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_system_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_syswm.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_syswm.h\n *\n *  Include file for SDL custom system window manager hooks.\n */\n\n#ifndef _SDL_syswm_h\n#define _SDL_syswm_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_video.h\"\n#include \"SDL_version.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\file SDL_syswm.h\n *\n *  Your application has access to a special type of event ::SDL_SYSWMEVENT,\n *  which contains window-manager specific information and arrives whenever\n *  an unhandled window event occurs.  This event is ignored by default, but\n *  you can enable it with SDL_EventState().\n */\n#ifdef SDL_PROTOTYPES_ONLY\nstruct SDL_SysWMinfo;\n#else\n\n#if defined(SDL_VIDEO_DRIVER_WINDOWS)\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <windows.h>\n#endif\n\n#if defined(SDL_VIDEO_DRIVER_WINRT)\n#include <Inspectable.h>\n#endif\n\n/* This is the structure for custom window manager events */\n#if defined(SDL_VIDEO_DRIVER_X11)\n#if defined(__APPLE__) && defined(__MACH__)\n/* conflicts with Quickdraw.h */\n#define Cursor X11Cursor\n#endif\n\n#include <X11/Xlib.h>\n#include <X11/Xatom.h>\n\n#if defined(__APPLE__) && defined(__MACH__)\n/* matches the re-define above */\n#undef Cursor\n#endif\n\n#endif /* defined(SDL_VIDEO_DRIVER_X11) */\n\n#if defined(SDL_VIDEO_DRIVER_DIRECTFB)\n#include <directfb.h>\n#endif\n\n#if defined(SDL_VIDEO_DRIVER_COCOA)\n#ifdef __OBJC__\n@class NSWindow;\n#else\ntypedef struct _NSWindow NSWindow;\n#endif\n#endif\n\n#if defined(SDL_VIDEO_DRIVER_UIKIT)\n#ifdef __OBJC__\n#include <UIKit/UIKit.h>\n#else\ntypedef struct _UIWindow UIWindow;\ntypedef struct _UIViewController UIViewController;\n#endif\ntypedef Uint32 GLuint;\n#endif\n\n#if defined(SDL_VIDEO_DRIVER_ANDROID)\ntypedef struct ANativeWindow ANativeWindow;\ntypedef void *EGLSurface;\n#endif\n\n#if defined(SDL_VIDEO_DRIVER_VIVANTE)\n#include \"SDL_egl.h\"\n#endif\n\n/**\n *  These are the various supported windowing subsystems\n */\ntypedef enum\n{\n    SDL_SYSWM_UNKNOWN,\n    SDL_SYSWM_WINDOWS,\n    SDL_SYSWM_X11,\n    SDL_SYSWM_DIRECTFB,\n    SDL_SYSWM_COCOA,\n    SDL_SYSWM_UIKIT,\n    SDL_SYSWM_WAYLAND,\n    SDL_SYSWM_MIR,\n    SDL_SYSWM_WINRT,\n    SDL_SYSWM_ANDROID,\n    SDL_SYSWM_VIVANTE\n} SDL_SYSWM_TYPE;\n\n/**\n *  The custom event structure.\n */\nstruct SDL_SysWMmsg\n{\n    SDL_version version;\n    SDL_SYSWM_TYPE subsystem;\n    union\n    {\n#if defined(SDL_VIDEO_DRIVER_WINDOWS)\n        struct {\n            HWND hwnd;                  /**< The window for the message */\n            UINT msg;                   /**< The type of message */\n            WPARAM wParam;              /**< WORD message parameter */\n            LPARAM lParam;              /**< LONG message parameter */\n        } win;\n#endif\n#if defined(SDL_VIDEO_DRIVER_X11)\n        struct {\n            XEvent event;\n        } x11;\n#endif\n#if defined(SDL_VIDEO_DRIVER_DIRECTFB)\n        struct {\n            DFBEvent event;\n        } dfb;\n#endif\n#if defined(SDL_VIDEO_DRIVER_COCOA)\n        struct\n        {\n            /* Latest version of Xcode clang complains about empty structs in C v. C++:\n                 error: empty struct has size 0 in C, size 1 in C++\n             */\n            int dummy;\n            /* No Cocoa window events yet */\n        } cocoa;\n#endif\n#if defined(SDL_VIDEO_DRIVER_UIKIT)\n        struct\n        {\n            int dummy;\n            /* No UIKit window events yet */\n        } uikit;\n#endif\n#if defined(SDL_VIDEO_DRIVER_VIVANTE)\n        struct\n        {\n            int dummy;\n            /* No Vivante window events yet */\n        } vivante;\n#endif\n        /* Can't have an empty union */\n        int dummy;\n    } msg;\n};\n\n/**\n *  The custom window manager information structure.\n *\n *  When this structure is returned, it holds information about which\n *  low level system it is using, and will be one of SDL_SYSWM_TYPE.\n */\nstruct SDL_SysWMinfo\n{\n    SDL_version version;\n    SDL_SYSWM_TYPE subsystem;\n    union\n    {\n#if defined(SDL_VIDEO_DRIVER_WINDOWS)\n        struct\n        {\n            HWND window;                /**< The window handle */\n            HDC hdc;                    /**< The window device context */\n        } win;\n#endif\n#if defined(SDL_VIDEO_DRIVER_WINRT)\n        struct\n        {\n            IInspectable * window;      /**< The WinRT CoreWindow */\n        } winrt;\n#endif\n#if defined(SDL_VIDEO_DRIVER_X11)\n        struct\n        {\n            Display *display;           /**< The X11 display */\n            Window window;              /**< The X11 window */\n        } x11;\n#endif\n#if defined(SDL_VIDEO_DRIVER_DIRECTFB)\n        struct\n        {\n            IDirectFB *dfb;             /**< The directfb main interface */\n            IDirectFBWindow *window;    /**< The directfb window handle */\n            IDirectFBSurface *surface;  /**< The directfb client surface */\n        } dfb;\n#endif\n#if defined(SDL_VIDEO_DRIVER_COCOA)\n        struct\n        {\n#if defined(__OBJC__) && defined(__has_feature) && __has_feature(objc_arc)\n            NSWindow __unsafe_unretained *window; /* The Cocoa window */\n#else\n            NSWindow *window;                     /* The Cocoa window */\n#endif\n        } cocoa;\n#endif\n#if defined(SDL_VIDEO_DRIVER_UIKIT)\n        struct\n        {\n#if defined(__OBJC__) && defined(__has_feature) && __has_feature(objc_arc)\n            UIWindow __unsafe_unretained *window; /* The UIKit window */\n#else\n            UIWindow *window;                     /* The UIKit window */\n#endif\n            GLuint framebuffer; /* The GL view's Framebuffer Object. It must be bound when rendering to the screen using GL. */\n            GLuint colorbuffer; /* The GL view's color Renderbuffer Object. It must be bound when SDL_GL_SwapWindow is called. */\n            GLuint resolveFramebuffer; /* The Framebuffer Object which holds the resolve color Renderbuffer, when MSAA is used. */\n        } uikit;\n#endif\n#if defined(SDL_VIDEO_DRIVER_WAYLAND)\n        struct\n        {\n            struct wl_display *display;            /**< Wayland display */\n            struct wl_surface *surface;            /**< Wayland surface */\n            struct wl_shell_surface *shell_surface; /**< Wayland shell_surface (window manager handle) */\n        } wl;\n#endif\n#if defined(SDL_VIDEO_DRIVER_MIR)\n        struct\n        {\n            struct MirConnection *connection;  /**< Mir display server connection */\n            struct MirSurface *surface;  /**< Mir surface */\n        } mir;\n#endif\n\n#if defined(SDL_VIDEO_DRIVER_ANDROID)\n        struct\n        {\n            ANativeWindow *window;\n            EGLSurface surface;\n        } android;\n#endif\n\n#if defined(SDL_VIDEO_DRIVER_VIVANTE)\n        struct\n        {\n            EGLNativeDisplayType display;\n            EGLNativeWindowType window;\n        } vivante;\n#endif\n\n        /* Can't have an empty union */\n        int dummy;\n    } info;\n};\n\n#endif /* SDL_PROTOTYPES_ONLY */\n\ntypedef struct SDL_SysWMinfo SDL_SysWMinfo;\n\n/* Function prototypes */\n/**\n *  \\brief This function allows access to driver-dependent window information.\n *\n *  \\param window The window about which information is being requested\n *  \\param info This structure must be initialized with the SDL version, and is\n *              then filled in with information about the given window.\n *\n *  \\return SDL_TRUE if the function is implemented and the version member of\n *          the \\c info struct is valid, SDL_FALSE otherwise.\n *\n *  You typically use this function like this:\n *  \\code\n *  SDL_SysWMinfo info;\n *  SDL_VERSION(&info.version);\n *  if ( SDL_GetWindowWMInfo(window, &info) ) { ... }\n *  \\endcode\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window,\n                                                     SDL_SysWMinfo * info);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_syswm_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n#ifndef _SDL_test_h\n#define _SDL_test_h\n\n#include \"SDL.h\"\n#include \"SDL_test_common.h\"\n#include \"SDL_test_font.h\"\n#include \"SDL_test_random.h\"\n#include \"SDL_test_fuzzer.h\"\n#include \"SDL_test_crc32.h\"\n#include \"SDL_test_md5.h\"\n#include \"SDL_test_log.h\"\n#include \"SDL_test_assert.h\"\n#include \"SDL_test_harness.h\"\n#include \"SDL_test_images.h\"\n#include \"SDL_test_compare.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Global definitions */\n\n/*\n * Note: Maximum size of SDLTest log message is less than SDL's limit\n * to ensure we can fit additional information such as the timestamp.\n */\n#define SDLTEST_MAX_LOGMESSAGE_LENGTH   3584\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_assert.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_assert.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/*\n *\n * Assert API for test code and test cases\n *\n */\n\n#ifndef _SDL_test_assert_h\n#define _SDL_test_assert_h\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief Fails the assert.\n */\n#define ASSERT_FAIL     0\n\n/**\n * \\brief Passes the assert.\n */\n#define ASSERT_PASS     1\n\n/**\n * \\brief Assert that logs and break execution flow on failures.\n *\n * \\param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0).\n * \\param assertDescription Message to log with the assert describing it.\n */\nvoid SDLTest_Assert(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(2);\n\n/**\n * \\brief Assert for test cases that logs but does not break execution flow on failures. Updates assertion counters.\n *\n * \\param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0).\n * \\param assertDescription Message to log with the assert describing it.\n *\n * \\returns Returns the assertCondition so it can be used to externally to break execution flow if desired.\n */\nint SDLTest_AssertCheck(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(2);\n\n/**\n * \\brief Explicitly pass without checking an assertion condition. Updates assertion counter.\n *\n * \\param assertDescription Message to log with the assert describing it.\n */\nvoid SDLTest_AssertPass(SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(1);\n\n/**\n * \\brief Resets the assert summary counters to zero.\n */\nvoid SDLTest_ResetAssertSummary();\n\n/**\n * \\brief Logs summary of all assertions (total, pass, fail) since last reset as INFO or ERROR.\n */\nvoid SDLTest_LogAssertSummary();\n\n\n/**\n * \\brief Converts the current assert summary state to a test result.\n *\n * \\returns TEST_RESULT_PASSED, TEST_RESULT_FAILED, or TEST_RESULT_NO_ASSERT\n */\nint SDLTest_AssertSummaryToTestResult();\n\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_assert_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_common.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_common.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/* Ported from original test\\common.h file. */\n\n#ifndef _SDL_test_common_h\n#define _SDL_test_common_h\n\n#include \"SDL.h\"\n\n#if defined(__PSP__)\n#define DEFAULT_WINDOW_WIDTH  480\n#define DEFAULT_WINDOW_HEIGHT 272\n#else\n#define DEFAULT_WINDOW_WIDTH  640\n#define DEFAULT_WINDOW_HEIGHT 480\n#endif\n\n#define VERBOSE_VIDEO   0x00000001\n#define VERBOSE_MODES   0x00000002\n#define VERBOSE_RENDER  0x00000004\n#define VERBOSE_EVENT   0x00000008\n#define VERBOSE_AUDIO   0x00000010\n\ntypedef struct\n{\n    /* SDL init flags */\n    char **argv;\n    Uint32 flags;\n    Uint32 verbose;\n\n    /* Video info */\n    const char *videodriver;\n    int display;\n    const char *window_title;\n    const char *window_icon;\n    Uint32 window_flags;\n    int window_x;\n    int window_y;\n    int window_w;\n    int window_h;\n    int window_minW;\n    int window_minH;\n    int window_maxW;\n    int window_maxH;\n    int logical_w;\n    int logical_h;\n    float scale;\n    int depth;\n    int refresh_rate;\n    int num_windows;\n    SDL_Window **windows;\n\n    /* Renderer info */\n    const char *renderdriver;\n    Uint32 render_flags;\n    SDL_bool skip_renderer;\n    SDL_Renderer **renderers;\n    SDL_Texture **targets;\n\n    /* Audio info */\n    const char *audiodriver;\n    SDL_AudioSpec audiospec;\n\n    /* GL settings */\n    int gl_red_size;\n    int gl_green_size;\n    int gl_blue_size;\n    int gl_alpha_size;\n    int gl_buffer_size;\n    int gl_depth_size;\n    int gl_stencil_size;\n    int gl_double_buffer;\n    int gl_accum_red_size;\n    int gl_accum_green_size;\n    int gl_accum_blue_size;\n    int gl_accum_alpha_size;\n    int gl_stereo;\n    int gl_multisamplebuffers;\n    int gl_multisamplesamples;\n    int gl_retained_backing;\n    int gl_accelerated;\n    int gl_major_version;\n    int gl_minor_version;\n    int gl_debug;\n    int gl_profile_mask;\n} SDLTest_CommonState;\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Function prototypes */\n\n/**\n * \\brief Parse command line parameters and create common state.\n *\n * \\param argv Array of command line parameters\n * \\param flags Flags indicating which subsystem to initialize (i.e. SDL_INIT_VIDEO | SDL_INIT_AUDIO)\n *\n * \\returns Returns a newly allocated common state object.\n */\nSDLTest_CommonState *SDLTest_CommonCreateState(char **argv, Uint32 flags);\n\n/**\n * \\brief Process one common argument.\n *\n * \\param state The common state describing the test window to create.\n * \\param index The index of the argument to process in argv[].\n *\n * \\returns The number of arguments processed (i.e. 1 for --fullscreen, 2 for --video [videodriver], or -1 on error.\n */\nint SDLTest_CommonArg(SDLTest_CommonState * state, int index);\n\n/**\n * \\brief Returns common usage information\n *\n * \\param state The common state describing the test window to create.\n *\n * \\returns String with usage information\n */\nconst char *SDLTest_CommonUsage(SDLTest_CommonState * state);\n\n/**\n * \\brief Open test window.\n *\n * \\param state The common state describing the test window to create.\n *\n * \\returns True if initialization succeeded, false otherwise\n */\nSDL_bool SDLTest_CommonInit(SDLTest_CommonState * state);\n\n/**\n * \\brief Common event handler for test windows.\n *\n * \\param state The common state used to create test window.\n * \\param event The event to handle.\n * \\param done Flag indicating we are done.\n *\n */\nvoid SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done);\n\n/**\n * \\brief Close test window.\n *\n * \\param state The common state used to create test window.\n *\n */\nvoid SDLTest_CommonQuit(SDLTest_CommonState * state);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_common_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_compare.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_compare.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/*\n\n Defines comparison functions (i.e. for surfaces).\n\n*/\n\n#ifndef _SDL_test_compare_h\n#define _SDL_test_compare_h\n\n#include \"SDL.h\"\n\n#include \"SDL_test_images.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief Compares a surface and with reference image data for equality\n *\n * \\param surface Surface used in comparison\n * \\param referenceSurface Test Surface used in comparison\n * \\param allowable_error Allowable difference (=sum of squared difference for each RGB component) in blending accuracy.\n *\n * \\returns 0 if comparison succeeded, >0 (=number of pixels for which the comparison failed) if comparison failed, -1 if any of the surfaces were NULL, -2 if the surface sizes differ.\n */\nint SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_compare_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_crc32.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_crc32.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/*\n\n Implements CRC32 calculations (default output is Perl String::CRC32 compatible).\n\n*/\n\n#ifndef _SDL_test_crc32_h\n#define _SDL_test_crc32_h\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/* ------------ Definitions --------- */\n\n/* Definition shared by all CRC routines */\n\n#ifndef CrcUint32\n #define CrcUint32  unsigned int\n#endif\n#ifndef CrcUint8\n #define CrcUint8   unsigned char\n#endif\n\n#ifdef ORIGINAL_METHOD\n #define CRC32_POLY 0x04c11db7   /* AUTODIN II, Ethernet, & FDDI */\n#else\n #define CRC32_POLY 0xEDB88320   /* Perl String::CRC32 compatible */\n#endif\n\n/**\n * Data structure for CRC32 (checksum) computation\n */\n  typedef struct {\n    CrcUint32    crc32_table[256]; /* CRC table */\n  } SDLTest_Crc32Context;\n\n/* ---------- Function Prototypes ------------- */\n\n/**\n * \\brief Initialize the CRC context\n *\n * Note: The function initializes the crc table required for all crc calculations.\n *\n * \\param crcContext        pointer to context variable\n *\n * \\returns 0 for OK, -1 on error\n *\n */\n int SDLTest_Crc32Init(SDLTest_Crc32Context * crcContext);\n\n\n/**\n * \\brief calculate a crc32 from a data block\n *\n * \\param crcContext         pointer to context variable\n * \\param inBuf              input buffer to checksum\n * \\param inLen              length of input buffer\n * \\param crc32              pointer to Uint32 to store the final CRC into\n *\n * \\returns 0 for OK, -1 on error\n *\n */\nint SDLTest_crc32Calc(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32);\n\n/* Same routine broken down into three steps */\nint SDLTest_Crc32CalcStart(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32);\nint SDLTest_Crc32CalcEnd(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32);\nint SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32);\n\n\n/**\n * \\brief clean up CRC context\n *\n * \\param crcContext        pointer to context variable\n *\n * \\returns 0 for OK, -1 on error\n *\n*/\n\nint SDLTest_Crc32Done(SDLTest_Crc32Context * crcContext);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_crc32_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_font.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_font.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n#ifndef _SDL_test_font_h\n#define _SDL_test_font_h\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Function prototypes */\n\n#define FONT_CHARACTER_SIZE  8\n\n/**\n *  \\brief Draw a string in the currently set font.\n *\n *  \\param renderer The renderer to draw on.\n *  \\param x The X coordinate of the upper left corner of the character.\n *  \\param y The Y coordinate of the upper left corner of the character.\n *  \\param c The character to draw.\n *\n *  \\returns Returns 0 on success, -1 on failure.\n */\nint SDLTest_DrawCharacter( SDL_Renderer *renderer, int x, int y, char c );\n\n/**\n *  \\brief Draw a string in the currently set font.\n *\n *  \\param renderer The renderer to draw on.\n *  \\param x The X coordinate of the upper left corner of the string.\n *  \\param y The Y coordinate of the upper left corner of the string.\n *  \\param s The string to draw.\n *\n *  \\returns Returns 0 on success, -1 on failure.\n */\nint SDLTest_DrawString( SDL_Renderer * renderer, int x, int y, const char *s );\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_font_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_fuzzer.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_fuzzer.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/*\n\n  Data generators for fuzzing test data in a reproducible way.\n\n*/\n\n#ifndef _SDL_test_fuzzer_h\n#define _SDL_test_fuzzer_h\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/*\n  Based on GSOC code by Markus Kauppila <markus.kauppila@gmail.com>\n*/\n\n\n/**\n * \\file\n * Note: The fuzzer implementation uses a static instance of random context\n * internally which makes it thread-UNsafe.\n */\n\n/**\n * Initializes the fuzzer for a test\n *\n * \\param execKey Execution \"Key\" that initializes the random number generator uniquely for the test.\n *\n */\nvoid SDLTest_FuzzerInit(Uint64 execKey);\n\n\n/**\n * Returns a random Uint8\n *\n * \\returns Generated integer\n */\nUint8 SDLTest_RandomUint8();\n\n/**\n * Returns a random Sint8\n *\n * \\returns Generated signed integer\n */\nSint8 SDLTest_RandomSint8();\n\n\n/**\n * Returns a random Uint16\n *\n * \\returns Generated integer\n */\nUint16 SDLTest_RandomUint16();\n\n/**\n * Returns a random Sint16\n *\n * \\returns Generated signed integer\n */\nSint16 SDLTest_RandomSint16();\n\n\n/**\n * Returns a random integer\n *\n * \\returns Generated integer\n */\nSint32 SDLTest_RandomSint32();\n\n\n/**\n * Returns a random positive integer\n *\n * \\returns Generated integer\n */\nUint32 SDLTest_RandomUint32();\n\n/**\n * Returns random Uint64.\n *\n * \\returns Generated integer\n */\nUint64 SDLTest_RandomUint64();\n\n\n/**\n * Returns random Sint64.\n *\n * \\returns Generated signed integer\n */\nSint64 SDLTest_RandomSint64();\n\n/**\n * \\returns random float in range [0.0 - 1.0[\n */\nfloat SDLTest_RandomUnitFloat();\n\n/**\n * \\returns random double in range [0.0 - 1.0[\n */\ndouble SDLTest_RandomUnitDouble();\n\n/**\n * \\returns random float.\n *\n */\nfloat SDLTest_RandomFloat();\n\n/**\n * \\returns random double.\n *\n */\ndouble SDLTest_RandomDouble();\n\n/**\n * Returns a random boundary value for Uint8 within the given boundaries.\n * Boundaries are inclusive, see the usage examples below. If validDomain\n * is true, the function will only return valid boundaries, otherwise non-valid\n * boundaries are also possible.\n * If boundary1 > boundary2, the values are swapped\n *\n * Usage examples:\n * RandomUint8BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20\n * RandomUint8BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21\n * RandomUint8BoundaryValue(0, 99, SDL_FALSE) returns 100\n * RandomUint8BoundaryValue(0, 255, SDL_FALSE) returns 0 (error set)\n *\n * \\param boundary1 Lower boundary limit\n * \\param boundary2 Upper boundary limit\n * \\param validDomain Should the generated boundary be valid (=within the bounds) or not?\n *\n * \\returns Random boundary value for the given range and domain or 0 with error set\n */\nUint8 SDLTest_RandomUint8BoundaryValue(Uint8 boundary1, Uint8 boundary2, SDL_bool validDomain);\n\n/**\n * Returns a random boundary value for Uint16 within the given boundaries.\n * Boundaries are inclusive, see the usage examples below. If validDomain\n * is true, the function will only return valid boundaries, otherwise non-valid\n * boundaries are also possible.\n * If boundary1 > boundary2, the values are swapped\n *\n * Usage examples:\n * RandomUint16BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20\n * RandomUint16BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21\n * RandomUint16BoundaryValue(0, 99, SDL_FALSE) returns 100\n * RandomUint16BoundaryValue(0, 0xFFFF, SDL_FALSE) returns 0 (error set)\n *\n * \\param boundary1 Lower boundary limit\n * \\param boundary2 Upper boundary limit\n * \\param validDomain Should the generated boundary be valid (=within the bounds) or not?\n *\n * \\returns Random boundary value for the given range and domain or 0 with error set\n */\nUint16 SDLTest_RandomUint16BoundaryValue(Uint16 boundary1, Uint16 boundary2, SDL_bool validDomain);\n\n/**\n * Returns a random boundary value for Uint32 within the given boundaries.\n * Boundaries are inclusive, see the usage examples below. If validDomain\n * is true, the function will only return valid boundaries, otherwise non-valid\n * boundaries are also possible.\n * If boundary1 > boundary2, the values are swapped\n *\n * Usage examples:\n * RandomUint32BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20\n * RandomUint32BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21\n * RandomUint32BoundaryValue(0, 99, SDL_FALSE) returns 100\n * RandomUint32BoundaryValue(0, 0xFFFFFFFF, SDL_FALSE) returns 0 (with error set)\n *\n * \\param boundary1 Lower boundary limit\n * \\param boundary2 Upper boundary limit\n * \\param validDomain Should the generated boundary be valid (=within the bounds) or not?\n *\n * \\returns Random boundary value for the given range and domain or 0 with error set\n */\nUint32 SDLTest_RandomUint32BoundaryValue(Uint32 boundary1, Uint32 boundary2, SDL_bool validDomain);\n\n/**\n * Returns a random boundary value for Uint64 within the given boundaries.\n * Boundaries are inclusive, see the usage examples below. If validDomain\n * is true, the function will only return valid boundaries, otherwise non-valid\n * boundaries are also possible.\n * If boundary1 > boundary2, the values are swapped\n *\n * Usage examples:\n * RandomUint64BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20\n * RandomUint64BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21\n * RandomUint64BoundaryValue(0, 99, SDL_FALSE) returns 100\n * RandomUint64BoundaryValue(0, 0xFFFFFFFFFFFFFFFF, SDL_FALSE) returns 0 (with error set)\n *\n * \\param boundary1 Lower boundary limit\n * \\param boundary2 Upper boundary limit\n * \\param validDomain Should the generated boundary be valid (=within the bounds) or not?\n *\n * \\returns Random boundary value for the given range and domain or 0 with error set\n */\nUint64 SDLTest_RandomUint64BoundaryValue(Uint64 boundary1, Uint64 boundary2, SDL_bool validDomain);\n\n/**\n * Returns a random boundary value for Sint8 within the given boundaries.\n * Boundaries are inclusive, see the usage examples below. If validDomain\n * is true, the function will only return valid boundaries, otherwise non-valid\n * boundaries are also possible.\n * If boundary1 > boundary2, the values are swapped\n *\n * Usage examples:\n * RandomSint8BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20\n * RandomSint8BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9\n * RandomSint8BoundaryValue(SINT8_MIN, 99, SDL_FALSE) returns 100\n * RandomSint8BoundaryValue(SINT8_MIN, SINT8_MAX, SDL_FALSE) returns SINT8_MIN (== error value) with error set\n *\n * \\param boundary1 Lower boundary limit\n * \\param boundary2 Upper boundary limit\n * \\param validDomain Should the generated boundary be valid (=within the bounds) or not?\n *\n * \\returns Random boundary value for the given range and domain or SINT8_MIN with error set\n */\nSint8 SDLTest_RandomSint8BoundaryValue(Sint8 boundary1, Sint8 boundary2, SDL_bool validDomain);\n\n\n/**\n * Returns a random boundary value for Sint16 within the given boundaries.\n * Boundaries are inclusive, see the usage examples below. If validDomain\n * is true, the function will only return valid boundaries, otherwise non-valid\n * boundaries are also possible.\n * If boundary1 > boundary2, the values are swapped\n *\n * Usage examples:\n * RandomSint16BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20\n * RandomSint16BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9\n * RandomSint16BoundaryValue(SINT16_MIN, 99, SDL_FALSE) returns 100\n * RandomSint16BoundaryValue(SINT16_MIN, SINT16_MAX, SDL_FALSE) returns SINT16_MIN (== error value) with error set\n *\n * \\param boundary1 Lower boundary limit\n * \\param boundary2 Upper boundary limit\n * \\param validDomain Should the generated boundary be valid (=within the bounds) or not?\n *\n * \\returns Random boundary value for the given range and domain or SINT16_MIN with error set\n */\nSint16 SDLTest_RandomSint16BoundaryValue(Sint16 boundary1, Sint16 boundary2, SDL_bool validDomain);\n\n/**\n * Returns a random boundary value for Sint32 within the given boundaries.\n * Boundaries are inclusive, see the usage examples below. If validDomain\n * is true, the function will only return valid boundaries, otherwise non-valid\n * boundaries are also possible.\n * If boundary1 > boundary2, the values are swapped\n *\n * Usage examples:\n * RandomSint32BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20\n * RandomSint32BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9\n * RandomSint32BoundaryValue(SINT32_MIN, 99, SDL_FALSE) returns 100\n * RandomSint32BoundaryValue(SINT32_MIN, SINT32_MAX, SDL_FALSE) returns SINT32_MIN (== error value)\n *\n * \\param boundary1 Lower boundary limit\n * \\param boundary2 Upper boundary limit\n * \\param validDomain Should the generated boundary be valid (=within the bounds) or not?\n *\n * \\returns Random boundary value for the given range and domain or SINT32_MIN with error set\n */\nSint32 SDLTest_RandomSint32BoundaryValue(Sint32 boundary1, Sint32 boundary2, SDL_bool validDomain);\n\n/**\n * Returns a random boundary value for Sint64 within the given boundaries.\n * Boundaries are inclusive, see the usage examples below. If validDomain\n * is true, the function will only return valid boundaries, otherwise non-valid\n * boundaries are also possible.\n * If boundary1 > boundary2, the values are swapped\n *\n * Usage examples:\n * RandomSint64BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20\n * RandomSint64BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9\n * RandomSint64BoundaryValue(SINT64_MIN, 99, SDL_FALSE) returns 100\n * RandomSint64BoundaryValue(SINT64_MIN, SINT64_MAX, SDL_FALSE) returns SINT64_MIN (== error value) and error set\n *\n * \\param boundary1 Lower boundary limit\n * \\param boundary2 Upper boundary limit\n * \\param validDomain Should the generated boundary be valid (=within the bounds) or not?\n *\n * \\returns Random boundary value for the given range and domain or SINT64_MIN with error set\n */\nSint64 SDLTest_RandomSint64BoundaryValue(Sint64 boundary1, Sint64 boundary2, SDL_bool validDomain);\n\n\n/**\n * Returns integer in range [min, max] (inclusive).\n * Min and max values can be negative values.\n * If Max in smaller than min, then the values are swapped.\n * Min and max are the same value, that value will be returned.\n *\n * \\param min Minimum inclusive value of returned random number\n * \\param max Maximum inclusive value of returned random number\n *\n * \\returns Generated random integer in range\n */\nSint32 SDLTest_RandomIntegerInRange(Sint32 min, Sint32 max);\n\n\n/**\n * Generates random null-terminated string. The minimum length for\n * the string is 1 character, maximum length for the string is 255\n * characters and it can contain ASCII characters from 32 to 126.\n *\n * Note: Returned string needs to be deallocated.\n *\n * \\returns Newly allocated random string; or NULL if length was invalid or string could not be allocated.\n */\nchar * SDLTest_RandomAsciiString();\n\n\n/**\n * Generates random null-terminated string. The maximum length for\n * the string is defined by the maxLength parameter.\n * String can contain ASCII characters from 32 to 126.\n *\n * Note: Returned string needs to be deallocated.\n *\n * \\param maxLength The maximum length of the generated string.\n *\n * \\returns Newly allocated random string; or NULL if maxLength was invalid or string could not be allocated.\n */\nchar * SDLTest_RandomAsciiStringWithMaximumLength(int maxLength);\n\n\n/**\n * Generates random null-terminated string. The length for\n * the string is defined by the size parameter.\n * String can contain ASCII characters from 32 to 126.\n *\n * Note: Returned string needs to be deallocated.\n *\n * \\param size The length of the generated string\n *\n * \\returns Newly allocated random string; or NULL if size was invalid or string could not be allocated.\n */\nchar * SDLTest_RandomAsciiStringOfSize(int size);\n\n/**\n * Returns the invocation count for the fuzzer since last ...FuzzerInit.\n */\nint SDLTest_GetFuzzerInvocationCount();\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_fuzzer_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_harness.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_harness.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/*\n  Defines types for test case definitions and the test execution harness API.\n\n  Based on original GSOC code by Markus Kauppila <markus.kauppila@gmail.com>\n*/\n\n#ifndef _SDL_test_harness_h\n#define _SDL_test_harness_h\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/* ! Definitions for test case structures */\n#define TEST_ENABLED  1\n#define TEST_DISABLED 0\n\n/* ! Definition of all the possible test return values of the test case method */\n#define TEST_ABORTED        -1\n#define TEST_STARTED         0\n#define TEST_COMPLETED       1\n#define TEST_SKIPPED         2\n\n/* ! Definition of all the possible test results for the harness */\n#define TEST_RESULT_PASSED              0\n#define TEST_RESULT_FAILED              1\n#define TEST_RESULT_NO_ASSERT           2\n#define TEST_RESULT_SKIPPED             3\n#define TEST_RESULT_SETUP_FAILURE       4\n\n/* !< Function pointer to a test case setup function (run before every test) */\ntypedef void (*SDLTest_TestCaseSetUpFp)(void *arg);\n\n/* !< Function pointer to a test case function */\ntypedef int (*SDLTest_TestCaseFp)(void *arg);\n\n/* !< Function pointer to a test case teardown function (run after every test) */\ntypedef void  (*SDLTest_TestCaseTearDownFp)(void *arg);\n\n/**\n * Holds information about a single test case.\n */\ntypedef struct SDLTest_TestCaseReference {\n    /* !< Func2Stress */\n    SDLTest_TestCaseFp testCase;\n    /* !< Short name (or function name) \"Func2Stress\" */\n    char *name;\n    /* !< Long name or full description \"This test pushes func2() to the limit.\" */\n    char *description;\n    /* !< Set to TEST_ENABLED or TEST_DISABLED (test won't be run) */\n    int enabled;\n} SDLTest_TestCaseReference;\n\n/**\n * Holds information about a test suite (multiple test cases).\n */\ntypedef struct SDLTest_TestSuiteReference {\n    /* !< \"PlatformSuite\" */\n    char *name;\n    /* !< The function that is run before each test. NULL skips. */\n    SDLTest_TestCaseSetUpFp testSetUp;\n    /* !< The test cases that are run as part of the suite. Last item should be NULL. */\n    const SDLTest_TestCaseReference **testCases;\n    /* !< The function that is run after each test. NULL skips. */\n    SDLTest_TestCaseTearDownFp testTearDown;\n} SDLTest_TestSuiteReference;\n\n\n/**\n * \\brief Execute a test suite using the given run seed and execution key.\n *\n * \\param testSuites Suites containing the test case.\n * \\param userRunSeed Custom run seed provided by user, or NULL to autogenerate one.\n * \\param userExecKey Custom execution key provided by user, or 0 to autogenerate one.\n * \\param filter Filter specification. NULL disables. Case sensitive.\n * \\param testIterations Number of iterations to run each test case.\n *\n * \\returns Test run result; 0 when all tests passed, 1 if any tests failed.\n */\nint SDLTest_RunSuites(SDLTest_TestSuiteReference *testSuites[], const char *userRunSeed, Uint64 userExecKey, const char *filter, int testIterations);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_harness_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_images.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_images.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/*\n\n Defines some images for tests.\n\n*/\n\n#ifndef _SDL_test_images_h\n#define _SDL_test_images_h\n\n#include \"SDL.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *Type for test images.\n */\ntypedef struct SDLTest_SurfaceImage_s {\n  int width;\n  int height;\n  unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */\n  const char *pixel_data;\n} SDLTest_SurfaceImage_t;\n\n/* Test images */\nSDL_Surface *SDLTest_ImageBlit();\nSDL_Surface *SDLTest_ImageBlitColor();\nSDL_Surface *SDLTest_ImageBlitAlpha();\nSDL_Surface *SDLTest_ImageBlitBlendAdd();\nSDL_Surface *SDLTest_ImageBlitBlend();\nSDL_Surface *SDLTest_ImageBlitBlendMod();\nSDL_Surface *SDLTest_ImageBlitBlendNone();\nSDL_Surface *SDLTest_ImageBlitBlendAll();\nSDL_Surface *SDLTest_ImageFace();\nSDL_Surface *SDLTest_ImagePrimitives();\nSDL_Surface *SDLTest_ImagePrimitivesBlend();\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_images_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_log.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_log.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/*\n *\n *  Wrapper to log in the TEST category\n *\n */\n\n#ifndef _SDL_test_log_h\n#define _SDL_test_log_h\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief Prints given message with a timestamp in the TEST category and INFO priority.\n *\n * \\param fmt Message to be logged\n */\nvoid SDLTest_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1);\n\n/**\n * \\brief Prints given message with a timestamp in the TEST category and the ERROR priority.\n *\n * \\param fmt Message to be logged\n */\nvoid SDLTest_LogError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_log_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_md5.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_md5.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/*\n ***********************************************************************\n ** Header file for implementation of MD5                             **\n ** RSA Data Security, Inc. MD5 Message-Digest Algorithm              **\n ** Created: 2/17/90 RLR                                              **\n ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version               **\n ** Revised (for MD5): RLR 4/27/91                                    **\n **   -- G modified to have y&~z instead of y&z                       **\n **   -- FF, GG, HH modified to add in last register done             **\n **   -- Access pattern: round 2 works mod 5, round 3 works mod 3     **\n **   -- distinct additive constant for each step                     **\n **   -- round 4 added, working mod 7                                 **\n ***********************************************************************\n*/\n\n/*\n ***********************************************************************\n **  Message-digest routines:                                         **\n **  To form the message digest for a message M                       **\n **    (1) Initialize a context buffer mdContext using MD5Init        **\n **    (2) Call MD5Update on mdContext and M                          **\n **    (3) Call MD5Final on mdContext                                 **\n **  The message digest is now in mdContext->digest[0...15]           **\n ***********************************************************************\n*/\n\n#ifndef _SDL_test_md5_h\n#define _SDL_test_md5_h\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ------------ Definitions --------- */\n\n/* typedef a 32-bit type */\n  typedef unsigned long int MD5UINT4;\n\n/* Data structure for MD5 (Message-Digest) computation */\n  typedef struct {\n    MD5UINT4  i[2];     /* number of _bits_ handled mod 2^64 */\n    MD5UINT4  buf[4];       /* scratch buffer */\n    unsigned char in[64];   /* input buffer */\n    unsigned char digest[16];   /* actual digest after Md5Final call */\n  } SDLTest_Md5Context;\n\n/* ---------- Function Prototypes ------------- */\n\n/**\n * \\brief initialize the context\n *\n * \\param  mdContext        pointer to context variable\n *\n * Note: The function initializes the message-digest context\n *       mdContext. Call before each new use of the context -\n *       all fields are set to zero.\n */\n void SDLTest_Md5Init(SDLTest_Md5Context * mdContext);\n\n\n/**\n * \\brief update digest from variable length data\n *\n * \\param  mdContext       pointer to context variable\n * \\param  inBuf           pointer to data array/string\n * \\param  inLen           length of data array/string\n *\n * Note: The function updates the message-digest context to account\n *       for the presence of each of the characters inBuf[0..inLen-1]\n *       in the message whose digest is being computed.\n*/\n\n void SDLTest_Md5Update(SDLTest_Md5Context * mdContext, unsigned char *inBuf,\n                 unsigned int inLen);\n\n\n/**\n * \\brief complete digest computation\n *\n * \\param mdContext     pointer to context variable\n *\n * Note: The function terminates the message-digest computation and\n *       ends with the desired message digest in mdContext.digest[0..15].\n *       Always call before using the digest[] variable.\n*/\n\n void SDLTest_Md5Final(SDLTest_Md5Context * mdContext);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_md5_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_test_random.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_test_random.h\n *\n *  Include file for SDL test framework.\n *\n *  This code is a part of the SDL2_test library, not the main SDL library.\n */\n\n/*\n\n A \"32-bit Multiply with carry random number generator. Very fast.\n Includes a list of recommended multipliers.\n\n multiply-with-carry generator: x(n) = a*x(n-1) + carry mod 2^32.\n period: (a*2^31)-1\n\n*/\n\n#ifndef _SDL_test_random_h\n#define _SDL_test_random_h\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* --- Definitions */\n\n/*\n * Macros that return a random number in a specific format.\n */\n#define SDLTest_RandomInt(c)        ((int)SDLTest_Random(c))\n\n/*\n * Context structure for the random number generator state.\n */\n  typedef struct {\n    unsigned int a;\n    unsigned int x;\n    unsigned int c;\n    unsigned int ah;\n    unsigned int al;\n  } SDLTest_RandomContext;\n\n\n/* --- Function prototypes */\n\n/**\n *  \\brief Initialize random number generator with two integers.\n *\n *  Note: The random sequence of numbers returned by ...Random() is the\n *  same for the same two integers and has a period of 2^31.\n *\n *  \\param rndContext     pointer to context structure\n *  \\param xi         integer that defines the random sequence\n *  \\param ci         integer that defines the random sequence\n *\n */\n void SDLTest_RandomInit(SDLTest_RandomContext * rndContext, unsigned int xi,\n                  unsigned int ci);\n\n/**\n *  \\brief Initialize random number generator based on current system time.\n *\n *  \\param rndContext     pointer to context structure\n *\n */\n void SDLTest_RandomInitTime(SDLTest_RandomContext *rndContext);\n\n\n/**\n *  \\brief Initialize random number generator based on current system time.\n *\n *  Note: ...RandomInit() or ...RandomInitTime() must have been called\n *  before using this function.\n *\n *  \\param rndContext     pointer to context structure\n *\n *  \\returns A random number (32bit unsigned integer)\n *\n */\n unsigned int SDLTest_Random(SDLTest_RandomContext *rndContext);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_test_random_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_thread.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_thread_h\n#define _SDL_thread_h\n\n/**\n *  \\file SDL_thread.h\n *\n *  Header for the SDL thread management routines.\n */\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n\n/* Thread synchronization primitives */\n#include \"SDL_atomic.h\"\n#include \"SDL_mutex.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* The SDL thread structure, defined in SDL_thread.c */\nstruct SDL_Thread;\ntypedef struct SDL_Thread SDL_Thread;\n\n/* The SDL thread ID */\ntypedef unsigned long SDL_threadID;\n\n/* Thread local storage ID, 0 is the invalid ID */\ntypedef unsigned int SDL_TLSID;\n\n/**\n *  The SDL thread priority.\n *\n *  \\note On many systems you require special privileges to set high priority.\n */\ntypedef enum {\n    SDL_THREAD_PRIORITY_LOW,\n    SDL_THREAD_PRIORITY_NORMAL,\n    SDL_THREAD_PRIORITY_HIGH\n} SDL_ThreadPriority;\n\n/**\n *  The function passed to SDL_CreateThread().\n *  It is passed a void* user context parameter and returns an int.\n */\ntypedef int (SDLCALL * SDL_ThreadFunction) (void *data);\n\n#if defined(__WIN32__) && !defined(HAVE_LIBC)\n/**\n *  \\file SDL_thread.h\n *\n *  We compile SDL into a DLL. This means, that it's the DLL which\n *  creates a new thread for the calling process with the SDL_CreateThread()\n *  API. There is a problem with this, that only the RTL of the SDL.DLL will\n *  be initialized for those threads, and not the RTL of the calling\n *  application!\n *\n *  To solve this, we make a little hack here.\n *\n *  We'll always use the caller's _beginthread() and _endthread() APIs to\n *  start a new thread. This way, if it's the SDL.DLL which uses this API,\n *  then the RTL of SDL.DLL will be used to create the new thread, and if it's\n *  the application, then the RTL of the application will be used.\n *\n *  So, in short:\n *  Always use the _beginthread() and _endthread() of the calling runtime\n *  library!\n */\n#define SDL_PASSED_BEGINTHREAD_ENDTHREAD\n#include <process.h>            /* This has _beginthread() and _endthread() defined! */\n\ntypedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,\n                                                        unsigned (__stdcall *\n                                                                  func) (void\n                                                                         *),\n                                                        void *arg, unsigned,\n                                                        unsigned *threadID);\ntypedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code);\n\n/**\n *  Create a thread.\n */\nextern DECLSPEC SDL_Thread *SDLCALL\nSDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data,\n                 pfnSDL_CurrentBeginThread pfnBeginThread,\n                 pfnSDL_CurrentEndThread pfnEndThread);\n\n/**\n *  Create a thread.\n */\n#if defined(SDL_CreateThread) && SDL_DYNAMIC_API\n#undef SDL_CreateThread\n#define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)_endthreadex)\n#else\n#define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)_endthreadex)\n#endif\n\n#else\n\n/**\n *  Create a thread.\n *\n *   Thread naming is a little complicated: Most systems have very small\n *    limits for the string length (Haiku has 32 bytes, Linux currently has 16,\n *    Visual C++ 6.0 has nine!), and possibly other arbitrary rules. You'll\n *    have to see what happens with your system's debugger. The name should be\n *    UTF-8 (but using the naming limits of C identifiers is a better bet).\n *   There are no requirements for thread naming conventions, so long as the\n *    string is null-terminated UTF-8, but these guidelines are helpful in\n *    choosing a name:\n *\n *    http://stackoverflow.com/questions/149932/naming-conventions-for-threads\n *\n *   If a system imposes requirements, SDL will try to munge the string for\n *    it (truncate, etc), but the original string contents will be available\n *    from SDL_GetThreadName().\n */\nextern DECLSPEC SDL_Thread *SDLCALL\nSDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data);\n\n#endif\n\n/**\n * Get the thread name, as it was specified in SDL_CreateThread().\n *  This function returns a pointer to a UTF-8 string that names the\n *  specified thread, or NULL if it doesn't have a name. This is internal\n *  memory, not to be free()'d by the caller, and remains valid until the\n *  specified thread is cleaned up by SDL_WaitThread().\n */\nextern DECLSPEC const char *SDLCALL SDL_GetThreadName(SDL_Thread *thread);\n\n/**\n *  Get the thread identifier for the current thread.\n */\nextern DECLSPEC SDL_threadID SDLCALL SDL_ThreadID(void);\n\n/**\n *  Get the thread identifier for the specified thread.\n *\n *  Equivalent to SDL_ThreadID() if the specified thread is NULL.\n */\nextern DECLSPEC SDL_threadID SDLCALL SDL_GetThreadID(SDL_Thread * thread);\n\n/**\n *  Set the priority for the current thread\n */\nextern DECLSPEC int SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority priority);\n\n/**\n *  Wait for a thread to finish. Threads that haven't been detached will\n *  remain (as a \"zombie\") until this function cleans them up. Not doing so\n *  is a resource leak.\n *\n *  Once a thread has been cleaned up through this function, the SDL_Thread\n *  that references it becomes invalid and should not be referenced again.\n *  As such, only one thread may call SDL_WaitThread() on another.\n *\n *  The return code for the thread function is placed in the area\n *  pointed to by \\c status, if \\c status is not NULL.\n *\n *  You may not wait on a thread that has been used in a call to\n *  SDL_DetachThread(). Use either that function or this one, but not\n *  both, or behavior is undefined.\n *\n *  It is safe to pass NULL to this function; it is a no-op.\n */\nextern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status);\n\n/**\n *  A thread may be \"detached\" to signify that it should not remain until\n *  another thread has called SDL_WaitThread() on it. Detaching a thread\n *  is useful for long-running threads that nothing needs to synchronize\n *  with or further manage. When a detached thread is done, it simply\n *  goes away.\n *\n *  There is no way to recover the return code of a detached thread. If you\n *  need this, don't detach the thread and instead use SDL_WaitThread().\n *\n *  Once a thread is detached, you should usually assume the SDL_Thread isn't\n *  safe to reference again, as it will become invalid immediately upon\n *  the detached thread's exit, instead of remaining until someone has called\n *  SDL_WaitThread() to finally clean it up. As such, don't detach the same\n *  thread more than once.\n *\n *  If a thread has already exited when passed to SDL_DetachThread(), it will\n *  stop waiting for a call to SDL_WaitThread() and clean up immediately.\n *  It is not safe to detach a thread that might be used with SDL_WaitThread().\n *\n *  You may not call SDL_WaitThread() on a thread that has been detached.\n *  Use either that function or this one, but not both, or behavior is\n *  undefined.\n *\n *  It is safe to pass NULL to this function; it is a no-op.\n */\nextern DECLSPEC void SDLCALL SDL_DetachThread(SDL_Thread * thread);\n\n/**\n *  \\brief Create an identifier that is globally visible to all threads but refers to data that is thread-specific.\n *\n *  \\return The newly created thread local storage identifier, or 0 on error\n *\n *  \\code\n *  static SDL_SpinLock tls_lock;\n *  static SDL_TLSID thread_local_storage;\n * \n *  void SetMyThreadData(void *value)\n *  {\n *      if (!thread_local_storage) {\n *          SDL_AtomicLock(&tls_lock);\n *          if (!thread_local_storage) {\n *              thread_local_storage = SDL_TLSCreate();\n *          }\n *          SDL_AtomicUnlock(&tls_lock);\n *      }\n *      SDL_TLSSet(thread_local_storage, value, 0);\n *  }\n *  \n *  void *GetMyThreadData(void)\n *  {\n *      return SDL_TLSGet(thread_local_storage);\n *  }\n *  \\endcode\n *\n *  \\sa SDL_TLSGet()\n *  \\sa SDL_TLSSet()\n */\nextern DECLSPEC SDL_TLSID SDLCALL SDL_TLSCreate(void);\n\n/**\n *  \\brief Get the value associated with a thread local storage ID for the current thread.\n *\n *  \\param id The thread local storage ID\n *\n *  \\return The value associated with the ID for the current thread, or NULL if no value has been set.\n *\n *  \\sa SDL_TLSCreate()\n *  \\sa SDL_TLSSet()\n */\nextern DECLSPEC void * SDLCALL SDL_TLSGet(SDL_TLSID id);\n\n/**\n *  \\brief Set the value associated with a thread local storage ID for the current thread.\n *\n *  \\param id The thread local storage ID\n *  \\param value The value to associate with the ID for the current thread\n *  \\param destructor A function called when the thread exits, to free the value.\n *\n *  \\return 0 on success, -1 on error\n *\n *  \\sa SDL_TLSCreate()\n *  \\sa SDL_TLSGet()\n */\nextern DECLSPEC int SDLCALL SDL_TLSSet(SDL_TLSID id, const void *value, void (*destructor)(void*));\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_thread_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_timer.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_timer_h\n#define _SDL_timer_h\n\n/**\n *  \\file SDL_timer.h\n *\n *  Header for the SDL time management routines.\n */\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief Get the number of milliseconds since the SDL library initialization.\n *\n * \\note This value wraps if the program runs for more than ~49 days.\n */\nextern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void);\n\n/**\n * \\brief Compare SDL ticks values, and return true if A has passed B\n *\n * e.g. if you want to wait 100 ms, you could do this:\n *  Uint32 timeout = SDL_GetTicks() + 100;\n *  while (!SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) {\n *      ... do work until timeout has elapsed\n *  }\n */\n#define SDL_TICKS_PASSED(A, B)  ((Sint32)((B) - (A)) <= 0)\n\n/**\n * \\brief Get the current value of the high resolution counter\n */\nextern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void);\n\n/**\n * \\brief Get the count per second of the high resolution counter\n */\nextern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void);\n\n/**\n * \\brief Wait a specified number of milliseconds before returning.\n */\nextern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms);\n\n/**\n *  Function prototype for the timer callback function.\n *\n *  The callback function is passed the current timer interval and returns\n *  the next timer interval.  If the returned value is the same as the one\n *  passed in, the periodic alarm continues, otherwise a new alarm is\n *  scheduled.  If the callback returns 0, the periodic alarm is cancelled.\n */\ntypedef Uint32 (SDLCALL * SDL_TimerCallback) (Uint32 interval, void *param);\n\n/**\n * Definition of the timer ID type.\n */\ntypedef int SDL_TimerID;\n\n/**\n * \\brief Add a new timer to the pool of timers already running.\n *\n * \\return A timer ID, or 0 when an error occurs.\n */\nextern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval,\n                                                 SDL_TimerCallback callback,\n                                                 void *param);\n\n/**\n * \\brief Remove a timer knowing its ID.\n *\n * \\return A boolean value indicating success or failure.\n *\n * \\warning It is not safe to remove a timer multiple times.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID id);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_timer_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_touch.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_touch.h\n *\n *  Include file for SDL touch event handling.\n */\n\n#ifndef _SDL_touch_h\n#define _SDL_touch_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_error.h\"\n#include \"SDL_video.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef Sint64 SDL_TouchID;\ntypedef Sint64 SDL_FingerID;\n\ntypedef struct SDL_Finger\n{\n    SDL_FingerID id;\n    float x;\n    float y;\n    float pressure;\n} SDL_Finger;\n\n/* Used as the device ID for mouse events simulated with touch input */\n#define SDL_TOUCH_MOUSEID ((Uint32)-1)\n\n\n/* Function prototypes */\n\n/**\n *  \\brief Get the number of registered touch devices.\n */\nextern DECLSPEC int SDLCALL SDL_GetNumTouchDevices(void);\n\n/**\n *  \\brief Get the touch ID with the given index, or 0 if the index is invalid.\n */\nextern DECLSPEC SDL_TouchID SDLCALL SDL_GetTouchDevice(int index);\n\n/**\n *  \\brief Get the number of active fingers for a given touch device.\n */\nextern DECLSPEC int SDLCALL SDL_GetNumTouchFingers(SDL_TouchID touchID);\n\n/**\n *  \\brief Get the finger object of the given touch, with the given index.\n */\nextern DECLSPEC SDL_Finger * SDLCALL SDL_GetTouchFinger(SDL_TouchID touchID, int index);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_touch_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_types.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_types.h\n *\n *  \\deprecated\n */\n\n/* DEPRECATED */\n#include \"SDL_stdinc.h\"\n"
  },
  {
    "path": "libs/SDL2/include/SDL_version.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_version.h\n *\n *  This header defines the current SDL version.\n */\n\n#ifndef _SDL_version_h\n#define _SDL_version_h\n\n#include \"SDL_stdinc.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief Information the version of SDL in use.\n *\n *  Represents the library's version as three levels: major revision\n *  (increments with massive changes, additions, and enhancements),\n *  minor revision (increments with backwards-compatible changes to the\n *  major revision), and patchlevel (increments with fixes to the minor\n *  revision).\n *\n *  \\sa SDL_VERSION\n *  \\sa SDL_GetVersion\n */\ntypedef struct SDL_version\n{\n    Uint8 major;        /**< major version */\n    Uint8 minor;        /**< minor version */\n    Uint8 patch;        /**< update version */\n} SDL_version;\n\n/* Printable format: \"%d.%d.%d\", MAJOR, MINOR, PATCHLEVEL\n*/\n#define SDL_MAJOR_VERSION   2\n#define SDL_MINOR_VERSION   0\n#define SDL_PATCHLEVEL      5\n\n/**\n *  \\brief Macro to determine SDL version program was compiled against.\n *\n *  This macro fills in a SDL_version structure with the version of the\n *  library you compiled against. This is determined by what header the\n *  compiler uses. Note that if you dynamically linked the library, you might\n *  have a slightly newer or older version at runtime. That version can be\n *  determined with SDL_GetVersion(), which, unlike SDL_VERSION(),\n *  is not a macro.\n *\n *  \\param x A pointer to a SDL_version struct to initialize.\n *\n *  \\sa SDL_version\n *  \\sa SDL_GetVersion\n */\n#define SDL_VERSION(x)                          \\\n{                                   \\\n    (x)->major = SDL_MAJOR_VERSION;                 \\\n    (x)->minor = SDL_MINOR_VERSION;                 \\\n    (x)->patch = SDL_PATCHLEVEL;                    \\\n}\n\n/**\n *  This macro turns the version numbers into a numeric value:\n *  \\verbatim\n    (1,2,3) -> (1203)\n    \\endverbatim\n *\n *  This assumes that there will never be more than 100 patchlevels.\n */\n#define SDL_VERSIONNUM(X, Y, Z)                     \\\n    ((X)*1000 + (Y)*100 + (Z))\n\n/**\n *  This is the version number macro for the current SDL version.\n */\n#define SDL_COMPILEDVERSION \\\n    SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL)\n\n/**\n *  This macro will evaluate to true if compiled with SDL at least X.Y.Z.\n */\n#define SDL_VERSION_ATLEAST(X, Y, Z) \\\n    (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z))\n\n/**\n *  \\brief Get the version of SDL that is linked against your program.\n *\n *  If you are linking to SDL dynamically, then it is possible that the\n *  current version will be different than the version you compiled against.\n *  This function returns the current version, while SDL_VERSION() is a\n *  macro that tells you what version you compiled with.\n *\n *  \\code\n *  SDL_version compiled;\n *  SDL_version linked;\n *\n *  SDL_VERSION(&compiled);\n *  SDL_GetVersion(&linked);\n *  printf(\"We compiled against SDL version %d.%d.%d ...\\n\",\n *         compiled.major, compiled.minor, compiled.patch);\n *  printf(\"But we linked against SDL version %d.%d.%d.\\n\",\n *         linked.major, linked.minor, linked.patch);\n *  \\endcode\n *\n *  This function may be called safely at any time, even before SDL_Init().\n *\n *  \\sa SDL_VERSION\n */\nextern DECLSPEC void SDLCALL SDL_GetVersion(SDL_version * ver);\n\n/**\n *  \\brief Get the code revision of SDL that is linked against your program.\n *\n *  Returns an arbitrary string (a hash value) uniquely identifying the\n *  exact revision of the SDL library in use, and is only useful in comparing\n *  against other revisions. It is NOT an incrementing number.\n */\nextern DECLSPEC const char *SDLCALL SDL_GetRevision(void);\n\n/**\n *  \\brief Get the revision number of SDL that is linked against your program.\n *\n *  Returns a number uniquely identifying the exact revision of the SDL\n *  library in use. It is an incrementing number based on commits to\n *  hg.libsdl.org.\n */\nextern DECLSPEC int SDLCALL SDL_GetRevisionNumber(void);\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_version_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/SDL_video.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL_video.h\n *\n *  Header file for SDL video functions.\n */\n\n#ifndef _SDL_video_h\n#define _SDL_video_h\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_pixels.h\"\n#include \"SDL_rect.h\"\n#include \"SDL_surface.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  \\brief  The structure that defines a display mode\n *\n *  \\sa SDL_GetNumDisplayModes()\n *  \\sa SDL_GetDisplayMode()\n *  \\sa SDL_GetDesktopDisplayMode()\n *  \\sa SDL_GetCurrentDisplayMode()\n *  \\sa SDL_GetClosestDisplayMode()\n *  \\sa SDL_SetWindowDisplayMode()\n *  \\sa SDL_GetWindowDisplayMode()\n */\ntypedef struct\n{\n    Uint32 format;              /**< pixel format */\n    int w;                      /**< width, in screen coordinates */\n    int h;                      /**< height, in screen coordinates */\n    int refresh_rate;           /**< refresh rate (or zero for unspecified) */\n    void *driverdata;           /**< driver-specific data, initialize to 0 */\n} SDL_DisplayMode;\n\n/**\n *  \\brief The type used to identify a window\n *\n *  \\sa SDL_CreateWindow()\n *  \\sa SDL_CreateWindowFrom()\n *  \\sa SDL_DestroyWindow()\n *  \\sa SDL_GetWindowData()\n *  \\sa SDL_GetWindowFlags()\n *  \\sa SDL_GetWindowGrab()\n *  \\sa SDL_GetWindowPosition()\n *  \\sa SDL_GetWindowSize()\n *  \\sa SDL_GetWindowTitle()\n *  \\sa SDL_HideWindow()\n *  \\sa SDL_MaximizeWindow()\n *  \\sa SDL_MinimizeWindow()\n *  \\sa SDL_RaiseWindow()\n *  \\sa SDL_RestoreWindow()\n *  \\sa SDL_SetWindowData()\n *  \\sa SDL_SetWindowFullscreen()\n *  \\sa SDL_SetWindowGrab()\n *  \\sa SDL_SetWindowIcon()\n *  \\sa SDL_SetWindowPosition()\n *  \\sa SDL_SetWindowSize()\n *  \\sa SDL_SetWindowBordered()\n *  \\sa SDL_SetWindowResizable()\n *  \\sa SDL_SetWindowTitle()\n *  \\sa SDL_ShowWindow()\n */\ntypedef struct SDL_Window SDL_Window;\n\n/**\n *  \\brief The flags on a window\n *\n *  \\sa SDL_GetWindowFlags()\n */\ntypedef enum\n{\n    /* !!! FIXME: change this to name = (1<<x). */\n    SDL_WINDOW_FULLSCREEN = 0x00000001,         /**< fullscreen window */\n    SDL_WINDOW_OPENGL = 0x00000002,             /**< window usable with OpenGL context */\n    SDL_WINDOW_SHOWN = 0x00000004,              /**< window is visible */\n    SDL_WINDOW_HIDDEN = 0x00000008,             /**< window is not visible */\n    SDL_WINDOW_BORDERLESS = 0x00000010,         /**< no window decoration */\n    SDL_WINDOW_RESIZABLE = 0x00000020,          /**< window can be resized */\n    SDL_WINDOW_MINIMIZED = 0x00000040,          /**< window is minimized */\n    SDL_WINDOW_MAXIMIZED = 0x00000080,          /**< window is maximized */\n    SDL_WINDOW_INPUT_GRABBED = 0x00000100,      /**< window has grabbed input focus */\n    SDL_WINDOW_INPUT_FOCUS = 0x00000200,        /**< window has input focus */\n    SDL_WINDOW_MOUSE_FOCUS = 0x00000400,        /**< window has mouse focus */\n    SDL_WINDOW_FULLSCREEN_DESKTOP = ( SDL_WINDOW_FULLSCREEN | 0x00001000 ),\n    SDL_WINDOW_FOREIGN = 0x00000800,            /**< window not created by SDL */\n    SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000,      /**< window should be created in high-DPI mode if supported */\n    SDL_WINDOW_MOUSE_CAPTURE = 0x00004000,      /**< window has mouse captured (unrelated to INPUT_GRABBED) */\n    SDL_WINDOW_ALWAYS_ON_TOP = 0x00008000,      /**< window should always be above others */\n    SDL_WINDOW_SKIP_TASKBAR  = 0x00010000,      /**< window should not be added to the taskbar */\n    SDL_WINDOW_UTILITY       = 0x00020000,      /**< window should be treated as a utility window */\n    SDL_WINDOW_TOOLTIP       = 0x00040000,      /**< window should be treated as a tooltip */\n    SDL_WINDOW_POPUP_MENU    = 0x00080000       /**< window should be treated as a popup menu */\n} SDL_WindowFlags;\n\n/**\n *  \\brief Used to indicate that you don't care what the window position is.\n */\n#define SDL_WINDOWPOS_UNDEFINED_MASK    0x1FFF0000u\n#define SDL_WINDOWPOS_UNDEFINED_DISPLAY(X)  (SDL_WINDOWPOS_UNDEFINED_MASK|(X))\n#define SDL_WINDOWPOS_UNDEFINED         SDL_WINDOWPOS_UNDEFINED_DISPLAY(0)\n#define SDL_WINDOWPOS_ISUNDEFINED(X)    \\\n            (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK)\n\n/**\n *  \\brief Used to indicate that the window position should be centered.\n */\n#define SDL_WINDOWPOS_CENTERED_MASK    0x2FFF0000u\n#define SDL_WINDOWPOS_CENTERED_DISPLAY(X)  (SDL_WINDOWPOS_CENTERED_MASK|(X))\n#define SDL_WINDOWPOS_CENTERED         SDL_WINDOWPOS_CENTERED_DISPLAY(0)\n#define SDL_WINDOWPOS_ISCENTERED(X)    \\\n            (((X)&0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK)\n\n/**\n *  \\brief Event subtype for window events\n */\ntypedef enum\n{\n    SDL_WINDOWEVENT_NONE,           /**< Never used */\n    SDL_WINDOWEVENT_SHOWN,          /**< Window has been shown */\n    SDL_WINDOWEVENT_HIDDEN,         /**< Window has been hidden */\n    SDL_WINDOWEVENT_EXPOSED,        /**< Window has been exposed and should be\n                                         redrawn */\n    SDL_WINDOWEVENT_MOVED,          /**< Window has been moved to data1, data2\n                                     */\n    SDL_WINDOWEVENT_RESIZED,        /**< Window has been resized to data1xdata2 */\n    SDL_WINDOWEVENT_SIZE_CHANGED,   /**< The window size has changed, either as\n                                         a result of an API call or through the\n                                         system or user changing the window size. */\n    SDL_WINDOWEVENT_MINIMIZED,      /**< Window has been minimized */\n    SDL_WINDOWEVENT_MAXIMIZED,      /**< Window has been maximized */\n    SDL_WINDOWEVENT_RESTORED,       /**< Window has been restored to normal size\n                                         and position */\n    SDL_WINDOWEVENT_ENTER,          /**< Window has gained mouse focus */\n    SDL_WINDOWEVENT_LEAVE,          /**< Window has lost mouse focus */\n    SDL_WINDOWEVENT_FOCUS_GAINED,   /**< Window has gained keyboard focus */\n    SDL_WINDOWEVENT_FOCUS_LOST,     /**< Window has lost keyboard focus */\n    SDL_WINDOWEVENT_CLOSE,          /**< The window manager requests that the window be closed */\n    SDL_WINDOWEVENT_TAKE_FOCUS,     /**< Window is being offered a focus (should SetWindowInputFocus() on itself or a subwindow, or ignore) */\n    SDL_WINDOWEVENT_HIT_TEST        /**< Window had a hit test that wasn't SDL_HITTEST_NORMAL. */\n} SDL_WindowEventID;\n\n/**\n *  \\brief An opaque handle to an OpenGL context.\n */\ntypedef void *SDL_GLContext;\n\n/**\n *  \\brief OpenGL configuration attributes\n */\ntypedef enum\n{\n    SDL_GL_RED_SIZE,\n    SDL_GL_GREEN_SIZE,\n    SDL_GL_BLUE_SIZE,\n    SDL_GL_ALPHA_SIZE,\n    SDL_GL_BUFFER_SIZE,\n    SDL_GL_DOUBLEBUFFER,\n    SDL_GL_DEPTH_SIZE,\n    SDL_GL_STENCIL_SIZE,\n    SDL_GL_ACCUM_RED_SIZE,\n    SDL_GL_ACCUM_GREEN_SIZE,\n    SDL_GL_ACCUM_BLUE_SIZE,\n    SDL_GL_ACCUM_ALPHA_SIZE,\n    SDL_GL_STEREO,\n    SDL_GL_MULTISAMPLEBUFFERS,\n    SDL_GL_MULTISAMPLESAMPLES,\n    SDL_GL_ACCELERATED_VISUAL,\n    SDL_GL_RETAINED_BACKING,\n    SDL_GL_CONTEXT_MAJOR_VERSION,\n    SDL_GL_CONTEXT_MINOR_VERSION,\n    SDL_GL_CONTEXT_EGL,\n    SDL_GL_CONTEXT_FLAGS,\n    SDL_GL_CONTEXT_PROFILE_MASK,\n    SDL_GL_SHARE_WITH_CURRENT_CONTEXT,\n    SDL_GL_FRAMEBUFFER_SRGB_CAPABLE,\n    SDL_GL_CONTEXT_RELEASE_BEHAVIOR\n} SDL_GLattr;\n\ntypedef enum\n{\n    SDL_GL_CONTEXT_PROFILE_CORE           = 0x0001,\n    SDL_GL_CONTEXT_PROFILE_COMPATIBILITY  = 0x0002,\n    SDL_GL_CONTEXT_PROFILE_ES             = 0x0004 /* GLX_CONTEXT_ES2_PROFILE_BIT_EXT */\n} SDL_GLprofile;\n\ntypedef enum\n{\n    SDL_GL_CONTEXT_DEBUG_FLAG              = 0x0001,\n    SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = 0x0002,\n    SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG      = 0x0004,\n    SDL_GL_CONTEXT_RESET_ISOLATION_FLAG    = 0x0008\n} SDL_GLcontextFlag;\n\ntypedef enum\n{\n    SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE   = 0x0000,\n    SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH  = 0x0001\n} SDL_GLcontextReleaseFlag;\n\n\n/* Function prototypes */\n\n/**\n *  \\brief Get the number of video drivers compiled into SDL\n *\n *  \\sa SDL_GetVideoDriver()\n */\nextern DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void);\n\n/**\n *  \\brief Get the name of a built in video driver.\n *\n *  \\note The video drivers are presented in the order in which they are\n *        normally checked during initialization.\n *\n *  \\sa SDL_GetNumVideoDrivers()\n */\nextern DECLSPEC const char *SDLCALL SDL_GetVideoDriver(int index);\n\n/**\n *  \\brief Initialize the video subsystem, optionally specifying a video driver.\n *\n *  \\param driver_name Initialize a specific driver by name, or NULL for the\n *                     default video driver.\n *\n *  \\return 0 on success, -1 on error\n *\n *  This function initializes the video subsystem; setting up a connection\n *  to the window manager, etc, and determines the available display modes\n *  and pixel formats, but does not initialize a window or graphics mode.\n *\n *  \\sa SDL_VideoQuit()\n */\nextern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name);\n\n/**\n *  \\brief Shuts down the video subsystem.\n *\n *  This function closes all windows, and restores the original video mode.\n *\n *  \\sa SDL_VideoInit()\n */\nextern DECLSPEC void SDLCALL SDL_VideoQuit(void);\n\n/**\n *  \\brief Returns the name of the currently initialized video driver.\n *\n *  \\return The name of the current video driver or NULL if no driver\n *          has been initialized\n *\n *  \\sa SDL_GetNumVideoDrivers()\n *  \\sa SDL_GetVideoDriver()\n */\nextern DECLSPEC const char *SDLCALL SDL_GetCurrentVideoDriver(void);\n\n/**\n *  \\brief Returns the number of available video displays.\n *\n *  \\sa SDL_GetDisplayBounds()\n */\nextern DECLSPEC int SDLCALL SDL_GetNumVideoDisplays(void);\n\n/**\n *  \\brief Get the name of a display in UTF-8 encoding\n *\n *  \\return The name of a display, or NULL for an invalid display index.\n *\n *  \\sa SDL_GetNumVideoDisplays()\n */\nextern DECLSPEC const char * SDLCALL SDL_GetDisplayName(int displayIndex);\n\n/**\n *  \\brief Get the desktop area represented by a display, with the primary\n *         display located at 0,0\n *\n *  \\return 0 on success, or -1 if the index is out of range.\n *\n *  \\sa SDL_GetNumVideoDisplays()\n */\nextern DECLSPEC int SDLCALL SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect);\n\n/**\n *  \\brief Get the dots/pixels-per-inch for a display\n *\n *  \\note Diagonal, horizontal and vertical DPI can all be optionally\n *        returned if the parameter is non-NULL.\n *\n *  \\return 0 on success, or -1 if no DPI information is available or the index is out of range.\n *\n *  \\sa SDL_GetNumVideoDisplays()\n */\nextern DECLSPEC int SDLCALL SDL_GetDisplayDPI(int displayIndex, float * ddpi, float * hdpi, float * vdpi);\n\n/**\n *  \\brief Get the usable desktop area represented by a display, with the\n *         primary display located at 0,0\n *\n *  This is the same area as SDL_GetDisplayBounds() reports, but with portions\n *  reserved by the system removed. For example, on Mac OS X, this subtracts\n *  the area occupied by the menu bar and dock.\n *\n *  Setting a window to be fullscreen generally bypasses these unusable areas,\n *  so these are good guidelines for the maximum space available to a\n *  non-fullscreen window.\n *\n *  \\return 0 on success, or -1 if the index is out of range.\n *\n *  \\sa SDL_GetDisplayBounds()\n *  \\sa SDL_GetNumVideoDisplays()\n */\nextern DECLSPEC int SDLCALL SDL_GetDisplayUsableBounds(int displayIndex, SDL_Rect * rect);\n\n/**\n *  \\brief Returns the number of available display modes.\n *\n *  \\sa SDL_GetDisplayMode()\n */\nextern DECLSPEC int SDLCALL SDL_GetNumDisplayModes(int displayIndex);\n\n/**\n *  \\brief Fill in information about a specific display mode.\n *\n *  \\note The display modes are sorted in this priority:\n *        \\li bits per pixel -> more colors to fewer colors\n *        \\li width -> largest to smallest\n *        \\li height -> largest to smallest\n *        \\li refresh rate -> highest to lowest\n *\n *  \\sa SDL_GetNumDisplayModes()\n */\nextern DECLSPEC int SDLCALL SDL_GetDisplayMode(int displayIndex, int modeIndex,\n                                               SDL_DisplayMode * mode);\n\n/**\n *  \\brief Fill in information about the desktop display mode.\n */\nextern DECLSPEC int SDLCALL SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode * mode);\n\n/**\n *  \\brief Fill in information about the current display mode.\n */\nextern DECLSPEC int SDLCALL SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode * mode);\n\n\n/**\n *  \\brief Get the closest match to the requested display mode.\n *\n *  \\param displayIndex The index of display from which mode should be queried.\n *  \\param mode The desired display mode\n *  \\param closest A pointer to a display mode to be filled in with the closest\n *                 match of the available display modes.\n *\n *  \\return The passed in value \\c closest, or NULL if no matching video mode\n *          was available.\n *\n *  The available display modes are scanned, and \\c closest is filled in with the\n *  closest mode matching the requested mode and returned.  The mode format and\n *  refresh_rate default to the desktop mode if they are 0.  The modes are\n *  scanned with size being first priority, format being second priority, and\n *  finally checking the refresh_rate.  If all the available modes are too\n *  small, then NULL is returned.\n *\n *  \\sa SDL_GetNumDisplayModes()\n *  \\sa SDL_GetDisplayMode()\n */\nextern DECLSPEC SDL_DisplayMode * SDLCALL SDL_GetClosestDisplayMode(int displayIndex, const SDL_DisplayMode * mode, SDL_DisplayMode * closest);\n\n/**\n *  \\brief Get the display index associated with a window.\n *\n *  \\return the display index of the display containing the center of the\n *          window, or -1 on error.\n */\nextern DECLSPEC int SDLCALL SDL_GetWindowDisplayIndex(SDL_Window * window);\n\n/**\n *  \\brief Set the display mode used when a fullscreen window is visible.\n *\n *  By default the window's dimensions and the desktop format and refresh rate\n *  are used.\n *\n *  \\param window The window for which the display mode should be set.\n *  \\param mode The mode to use, or NULL for the default mode.\n *\n *  \\return 0 on success, or -1 if setting the display mode failed.\n *\n *  \\sa SDL_GetWindowDisplayMode()\n *  \\sa SDL_SetWindowFullscreen()\n */\nextern DECLSPEC int SDLCALL SDL_SetWindowDisplayMode(SDL_Window * window,\n                                                     const SDL_DisplayMode\n                                                         * mode);\n\n/**\n *  \\brief Fill in information about the display mode used when a fullscreen\n *         window is visible.\n *\n *  \\sa SDL_SetWindowDisplayMode()\n *  \\sa SDL_SetWindowFullscreen()\n */\nextern DECLSPEC int SDLCALL SDL_GetWindowDisplayMode(SDL_Window * window,\n                                                     SDL_DisplayMode * mode);\n\n/**\n *  \\brief Get the pixel format associated with the window.\n */\nextern DECLSPEC Uint32 SDLCALL SDL_GetWindowPixelFormat(SDL_Window * window);\n\n/**\n *  \\brief Create a window with the specified position, dimensions, and flags.\n *\n *  \\param title The title of the window, in UTF-8 encoding.\n *  \\param x     The x position of the window, ::SDL_WINDOWPOS_CENTERED, or\n *               ::SDL_WINDOWPOS_UNDEFINED.\n *  \\param y     The y position of the window, ::SDL_WINDOWPOS_CENTERED, or\n *               ::SDL_WINDOWPOS_UNDEFINED.\n *  \\param w     The width of the window, in screen coordinates.\n *  \\param h     The height of the window, in screen coordinates.\n *  \\param flags The flags for the window, a mask of any of the following:\n *               ::SDL_WINDOW_FULLSCREEN,    ::SDL_WINDOW_OPENGL,\n *               ::SDL_WINDOW_HIDDEN,        ::SDL_WINDOW_BORDERLESS,\n *               ::SDL_WINDOW_RESIZABLE,     ::SDL_WINDOW_MAXIMIZED,\n *               ::SDL_WINDOW_MINIMIZED,     ::SDL_WINDOW_INPUT_GRABBED,\n *               ::SDL_WINDOW_ALLOW_HIGHDPI.\n *\n *  \\return The created window, or NULL if window creation failed.\n *\n *  If the window is created with the SDL_WINDOW_ALLOW_HIGHDPI flag, its size\n *  in pixels may differ from its size in screen coordinates on platforms with\n *  high-DPI support (e.g. iOS and Mac OS X). Use SDL_GetWindowSize() to query\n *  the client area's size in screen coordinates, and SDL_GL_GetDrawableSize()\n *  or SDL_GetRendererOutputSize() to query the drawable size in pixels.\n *\n *  \\sa SDL_DestroyWindow()\n */\nextern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title,\n                                                      int x, int y, int w,\n                                                      int h, Uint32 flags);\n\n/**\n *  \\brief Create an SDL window from an existing native window.\n *\n *  \\param data A pointer to driver-dependent window creation data\n *\n *  \\return The created window, or NULL if window creation failed.\n *\n *  \\sa SDL_DestroyWindow()\n */\nextern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowFrom(const void *data);\n\n/**\n *  \\brief Get the numeric ID of a window, for logging purposes.\n */\nextern DECLSPEC Uint32 SDLCALL SDL_GetWindowID(SDL_Window * window);\n\n/**\n *  \\brief Get a window from a stored ID, or NULL if it doesn't exist.\n */\nextern DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromID(Uint32 id);\n\n/**\n *  \\brief Get the window flags.\n */\nextern DECLSPEC Uint32 SDLCALL SDL_GetWindowFlags(SDL_Window * window);\n\n/**\n *  \\brief Set the title of a window, in UTF-8 format.\n *\n *  \\sa SDL_GetWindowTitle()\n */\nextern DECLSPEC void SDLCALL SDL_SetWindowTitle(SDL_Window * window,\n                                                const char *title);\n\n/**\n *  \\brief Get the title of a window, in UTF-8 format.\n *\n *  \\sa SDL_SetWindowTitle()\n */\nextern DECLSPEC const char *SDLCALL SDL_GetWindowTitle(SDL_Window * window);\n\n/**\n *  \\brief Set the icon for a window.\n *\n *  \\param window The window for which the icon should be set.\n *  \\param icon The icon for the window.\n */\nextern DECLSPEC void SDLCALL SDL_SetWindowIcon(SDL_Window * window,\n                                               SDL_Surface * icon);\n\n/**\n *  \\brief Associate an arbitrary named pointer with a window.\n *\n *  \\param window   The window to associate with the pointer.\n *  \\param name     The name of the pointer.\n *  \\param userdata The associated pointer.\n *\n *  \\return The previous value associated with 'name'\n *\n *  \\note The name is case-sensitive.\n *\n *  \\sa SDL_GetWindowData()\n */\nextern DECLSPEC void* SDLCALL SDL_SetWindowData(SDL_Window * window,\n                                                const char *name,\n                                                void *userdata);\n\n/**\n *  \\brief Retrieve the data pointer associated with a window.\n *\n *  \\param window   The window to query.\n *  \\param name     The name of the pointer.\n *\n *  \\return The value associated with 'name'\n *\n *  \\sa SDL_SetWindowData()\n */\nextern DECLSPEC void *SDLCALL SDL_GetWindowData(SDL_Window * window,\n                                                const char *name);\n\n/**\n *  \\brief Set the position of a window.\n *\n *  \\param window   The window to reposition.\n *  \\param x        The x coordinate of the window in screen coordinates, or\n *                  ::SDL_WINDOWPOS_CENTERED or ::SDL_WINDOWPOS_UNDEFINED.\n *  \\param y        The y coordinate of the window in screen coordinates, or\n *                  ::SDL_WINDOWPOS_CENTERED or ::SDL_WINDOWPOS_UNDEFINED.\n *\n *  \\note The window coordinate origin is the upper left of the display.\n *\n *  \\sa SDL_GetWindowPosition()\n */\nextern DECLSPEC void SDLCALL SDL_SetWindowPosition(SDL_Window * window,\n                                                   int x, int y);\n\n/**\n *  \\brief Get the position of a window.\n *\n *  \\param window   The window to query.\n *  \\param x        Pointer to variable for storing the x position, in screen\n *                  coordinates. May be NULL.\n *  \\param y        Pointer to variable for storing the y position, in screen\n *                  coordinates. May be NULL.\n *\n *  \\sa SDL_SetWindowPosition()\n */\nextern DECLSPEC void SDLCALL SDL_GetWindowPosition(SDL_Window * window,\n                                                   int *x, int *y);\n\n/**\n *  \\brief Set the size of a window's client area.\n *\n *  \\param window   The window to resize.\n *  \\param w        The width of the window, in screen coordinates. Must be >0.\n *  \\param h        The height of the window, in screen coordinates. Must be >0.\n *\n *  \\note You can't change the size of a fullscreen window, it automatically\n *        matches the size of the display mode.\n *\n *  The window size in screen coordinates may differ from the size in pixels, if\n *  the window was created with SDL_WINDOW_ALLOW_HIGHDPI on a platform with\n *  high-dpi support (e.g. iOS or OS X). Use SDL_GL_GetDrawableSize() or\n *  SDL_GetRendererOutputSize() to get the real client area size in pixels.\n *\n *  \\sa SDL_GetWindowSize()\n */\nextern DECLSPEC void SDLCALL SDL_SetWindowSize(SDL_Window * window, int w,\n                                               int h);\n\n/**\n *  \\brief Get the size of a window's client area.\n *\n *  \\param window   The window to query.\n *  \\param w        Pointer to variable for storing the width, in screen\n *                  coordinates. May be NULL.\n *  \\param h        Pointer to variable for storing the height, in screen\n *                  coordinates. May be NULL.\n *\n *  The window size in screen coordinates may differ from the size in pixels, if\n *  the window was created with SDL_WINDOW_ALLOW_HIGHDPI on a platform with\n *  high-dpi support (e.g. iOS or OS X). Use SDL_GL_GetDrawableSize() or\n *  SDL_GetRendererOutputSize() to get the real client area size in pixels.\n *\n *  \\sa SDL_SetWindowSize()\n */\nextern DECLSPEC void SDLCALL SDL_GetWindowSize(SDL_Window * window, int *w,\n                                               int *h);\n\n/**\n *  \\brief Get the size of a window's borders (decorations) around the client area.\n *\n *  \\param window The window to query.\n *  \\param top Pointer to variable for storing the size of the top border. NULL is permitted.\n *  \\param left Pointer to variable for storing the size of the left border. NULL is permitted.\n *  \\param bottom Pointer to variable for storing the size of the bottom border. NULL is permitted.\n *  \\param right Pointer to variable for storing the size of the right border. NULL is permitted.\n *\n *  \\return 0 on success, or -1 if getting this information is not supported.\n *\n *  \\note if this function fails (returns -1), the size values will be\n *        initialized to 0, 0, 0, 0 (if a non-NULL pointer is provided), as\n *        if the window in question was borderless.\n */\nextern DECLSPEC int SDLCALL SDL_GetWindowBordersSize(SDL_Window * window,\n                                                     int *top, int *left,\n                                                     int *bottom, int *right);\n\n/**\n *  \\brief Set the minimum size of a window's client area.\n *\n *  \\param window    The window to set a new minimum size.\n *  \\param min_w     The minimum width of the window, must be >0\n *  \\param min_h     The minimum height of the window, must be >0\n *\n *  \\note You can't change the minimum size of a fullscreen window, it\n *        automatically matches the size of the display mode.\n *\n *  \\sa SDL_GetWindowMinimumSize()\n *  \\sa SDL_SetWindowMaximumSize()\n */\nextern DECLSPEC void SDLCALL SDL_SetWindowMinimumSize(SDL_Window * window,\n                                                      int min_w, int min_h);\n\n/**\n *  \\brief Get the minimum size of a window's client area.\n *\n *  \\param window   The window to query.\n *  \\param w        Pointer to variable for storing the minimum width, may be NULL\n *  \\param h        Pointer to variable for storing the minimum height, may be NULL\n *\n *  \\sa SDL_GetWindowMaximumSize()\n *  \\sa SDL_SetWindowMinimumSize()\n */\nextern DECLSPEC void SDLCALL SDL_GetWindowMinimumSize(SDL_Window * window,\n                                                      int *w, int *h);\n\n/**\n *  \\brief Set the maximum size of a window's client area.\n *\n *  \\param window    The window to set a new maximum size.\n *  \\param max_w     The maximum width of the window, must be >0\n *  \\param max_h     The maximum height of the window, must be >0\n *\n *  \\note You can't change the maximum size of a fullscreen window, it\n *        automatically matches the size of the display mode.\n *\n *  \\sa SDL_GetWindowMaximumSize()\n *  \\sa SDL_SetWindowMinimumSize()\n */\nextern DECLSPEC void SDLCALL SDL_SetWindowMaximumSize(SDL_Window * window,\n                                                      int max_w, int max_h);\n\n/**\n *  \\brief Get the maximum size of a window's client area.\n *\n *  \\param window   The window to query.\n *  \\param w        Pointer to variable for storing the maximum width, may be NULL\n *  \\param h        Pointer to variable for storing the maximum height, may be NULL\n *\n *  \\sa SDL_GetWindowMinimumSize()\n *  \\sa SDL_SetWindowMaximumSize()\n */\nextern DECLSPEC void SDLCALL SDL_GetWindowMaximumSize(SDL_Window * window,\n                                                      int *w, int *h);\n\n/**\n *  \\brief Set the border state of a window.\n *\n *  This will add or remove the window's SDL_WINDOW_BORDERLESS flag and\n *  add or remove the border from the actual window. This is a no-op if the\n *  window's border already matches the requested state.\n *\n *  \\param window The window of which to change the border state.\n *  \\param bordered SDL_FALSE to remove border, SDL_TRUE to add border.\n *\n *  \\note You can't change the border state of a fullscreen window.\n *\n *  \\sa SDL_GetWindowFlags()\n */\nextern DECLSPEC void SDLCALL SDL_SetWindowBordered(SDL_Window * window,\n                                                   SDL_bool bordered);\n\n/**\n *  \\brief Set the user-resizable state of a window.\n *\n *  This will add or remove the window's SDL_WINDOW_RESIZABLE flag and\n *  allow/disallow user resizing of the window. This is a no-op if the\n *  window's resizable state already matches the requested state.\n *\n *  \\param window The window of which to change the resizable state.\n *  \\param resizable SDL_TRUE to allow resizing, SDL_FALSE to disallow.\n *\n *  \\note You can't change the resizable state of a fullscreen window.\n *\n *  \\sa SDL_GetWindowFlags()\n */\nextern DECLSPEC void SDLCALL SDL_SetWindowResizable(SDL_Window * window,\n                                                    SDL_bool resizable);\n\n/**\n *  \\brief Show a window.\n *\n *  \\sa SDL_HideWindow()\n */\nextern DECLSPEC void SDLCALL SDL_ShowWindow(SDL_Window * window);\n\n/**\n *  \\brief Hide a window.\n *\n *  \\sa SDL_ShowWindow()\n */\nextern DECLSPEC void SDLCALL SDL_HideWindow(SDL_Window * window);\n\n/**\n *  \\brief Raise a window above other windows and set the input focus.\n */\nextern DECLSPEC void SDLCALL SDL_RaiseWindow(SDL_Window * window);\n\n/**\n *  \\brief Make a window as large as possible.\n *\n *  \\sa SDL_RestoreWindow()\n */\nextern DECLSPEC void SDLCALL SDL_MaximizeWindow(SDL_Window * window);\n\n/**\n *  \\brief Minimize a window to an iconic representation.\n *\n *  \\sa SDL_RestoreWindow()\n */\nextern DECLSPEC void SDLCALL SDL_MinimizeWindow(SDL_Window * window);\n\n/**\n *  \\brief Restore the size and position of a minimized or maximized window.\n *\n *  \\sa SDL_MaximizeWindow()\n *  \\sa SDL_MinimizeWindow()\n */\nextern DECLSPEC void SDLCALL SDL_RestoreWindow(SDL_Window * window);\n\n/**\n *  \\brief Set a window's fullscreen state.\n *\n *  \\return 0 on success, or -1 if setting the display mode failed.\n *\n *  \\sa SDL_SetWindowDisplayMode()\n *  \\sa SDL_GetWindowDisplayMode()\n */\nextern DECLSPEC int SDLCALL SDL_SetWindowFullscreen(SDL_Window * window,\n                                                    Uint32 flags);\n\n/**\n *  \\brief Get the SDL surface associated with the window.\n *\n *  \\return The window's framebuffer surface, or NULL on error.\n *\n *  A new surface will be created with the optimal format for the window,\n *  if necessary. This surface will be freed when the window is destroyed.\n *\n *  \\note You may not combine this with 3D or the rendering API on this window.\n *\n *  \\sa SDL_UpdateWindowSurface()\n *  \\sa SDL_UpdateWindowSurfaceRects()\n */\nextern DECLSPEC SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window * window);\n\n/**\n *  \\brief Copy the window surface to the screen.\n *\n *  \\return 0 on success, or -1 on error.\n *\n *  \\sa SDL_GetWindowSurface()\n *  \\sa SDL_UpdateWindowSurfaceRects()\n */\nextern DECLSPEC int SDLCALL SDL_UpdateWindowSurface(SDL_Window * window);\n\n/**\n *  \\brief Copy a number of rectangles on the window surface to the screen.\n *\n *  \\return 0 on success, or -1 on error.\n *\n *  \\sa SDL_GetWindowSurface()\n *  \\sa SDL_UpdateWindowSurface()\n */\nextern DECLSPEC int SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window * window,\n                                                         const SDL_Rect * rects,\n                                                         int numrects);\n\n/**\n *  \\brief Set a window's input grab mode.\n *\n *  \\param window The window for which the input grab mode should be set.\n *  \\param grabbed This is SDL_TRUE to grab input, and SDL_FALSE to release input.\n *\n *  If the caller enables a grab while another window is currently grabbed,\n *  the other window loses its grab in favor of the caller's window.\n *\n *  \\sa SDL_GetWindowGrab()\n */\nextern DECLSPEC void SDLCALL SDL_SetWindowGrab(SDL_Window * window,\n                                               SDL_bool grabbed);\n\n/**\n *  \\brief Get a window's input grab mode.\n *\n *  \\return This returns SDL_TRUE if input is grabbed, and SDL_FALSE otherwise.\n *\n *  \\sa SDL_SetWindowGrab()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_GetWindowGrab(SDL_Window * window);\n\n/**\n *  \\brief Get the window that currently has an input grab enabled.\n *\n *  \\return This returns the window if input is grabbed, and NULL otherwise.\n *\n *  \\sa SDL_SetWindowGrab()\n */\nextern DECLSPEC SDL_Window * SDLCALL SDL_GetGrabbedWindow(void);\n\n/**\n *  \\brief Set the brightness (gamma correction) for a window.\n *\n *  \\return 0 on success, or -1 if setting the brightness isn't supported.\n *\n *  \\sa SDL_GetWindowBrightness()\n *  \\sa SDL_SetWindowGammaRamp()\n */\nextern DECLSPEC int SDLCALL SDL_SetWindowBrightness(SDL_Window * window, float brightness);\n\n/**\n *  \\brief Get the brightness (gamma correction) for a window.\n *\n *  \\return The last brightness value passed to SDL_SetWindowBrightness()\n *\n *  \\sa SDL_SetWindowBrightness()\n */\nextern DECLSPEC float SDLCALL SDL_GetWindowBrightness(SDL_Window * window);\n\n/**\n *  \\brief Set the opacity for a window\n *\n *  \\param window The window which will be made transparent or opaque\n *  \\param opacity Opacity (0.0f - transparent, 1.0f - opaque) This will be\n *                 clamped internally between 0.0f and 1.0f.\n * \n *  \\return 0 on success, or -1 if setting the opacity isn't supported.\n *\n *  \\sa SDL_GetWindowOpacity()\n */\nextern DECLSPEC int SDLCALL SDL_SetWindowOpacity(SDL_Window * window, float opacity);\n\n/**\n *  \\brief Get the opacity of a window.\n *\n *  If transparency isn't supported on this platform, opacity will be reported\n *  as 1.0f without error.\n *\n *  \\param window The window in question.\n *  \\param out_opacity Opacity (0.0f - transparent, 1.0f - opaque)\n *\n *  \\return 0 on success, or -1 on error (invalid window, etc).\n *\n *  \\sa SDL_SetWindowOpacity()\n */\nextern DECLSPEC int SDLCALL SDL_GetWindowOpacity(SDL_Window * window, float * out_opacity);\n\n/**\n *  \\brief Sets the window as a modal for another window (TODO: reconsider this function and/or its name)\n *\n *  \\param modal_window The window that should be modal\n *  \\param parent_window The parent window\n * \n *  \\return 0 on success, or -1 otherwise.\n */\nextern DECLSPEC int SDLCALL SDL_SetWindowModalFor(SDL_Window * modal_window, SDL_Window * parent_window);\n\n/**\n *  \\brief Explicitly sets input focus to the window.\n *\n *  You almost certainly want SDL_RaiseWindow() instead of this function. Use\n *  this with caution, as you might give focus to a window that's completely\n *  obscured by other windows.\n *\n *  \\param window The window that should get the input focus\n * \n *  \\return 0 on success, or -1 otherwise.\n *  \\sa SDL_RaiseWindow()\n */\nextern DECLSPEC int SDLCALL SDL_SetWindowInputFocus(SDL_Window * window);\n\n/**\n *  \\brief Set the gamma ramp for a window.\n *\n *  \\param window The window for which the gamma ramp should be set.\n *  \\param red The translation table for the red channel, or NULL.\n *  \\param green The translation table for the green channel, or NULL.\n *  \\param blue The translation table for the blue channel, or NULL.\n *\n *  \\return 0 on success, or -1 if gamma ramps are unsupported.\n *\n *  Set the gamma translation table for the red, green, and blue channels\n *  of the video hardware.  Each table is an array of 256 16-bit quantities,\n *  representing a mapping between the input and output for that channel.\n *  The input is the index into the array, and the output is the 16-bit\n *  gamma value at that index, scaled to the output color precision.\n *\n *  \\sa SDL_GetWindowGammaRamp()\n */\nextern DECLSPEC int SDLCALL SDL_SetWindowGammaRamp(SDL_Window * window,\n                                                   const Uint16 * red,\n                                                   const Uint16 * green,\n                                                   const Uint16 * blue);\n\n/**\n *  \\brief Get the gamma ramp for a window.\n *\n *  \\param window The window from which the gamma ramp should be queried.\n *  \\param red   A pointer to a 256 element array of 16-bit quantities to hold\n *               the translation table for the red channel, or NULL.\n *  \\param green A pointer to a 256 element array of 16-bit quantities to hold\n *               the translation table for the green channel, or NULL.\n *  \\param blue  A pointer to a 256 element array of 16-bit quantities to hold\n *               the translation table for the blue channel, or NULL.\n *\n *  \\return 0 on success, or -1 if gamma ramps are unsupported.\n *\n *  \\sa SDL_SetWindowGammaRamp()\n */\nextern DECLSPEC int SDLCALL SDL_GetWindowGammaRamp(SDL_Window * window,\n                                                   Uint16 * red,\n                                                   Uint16 * green,\n                                                   Uint16 * blue);\n\n/**\n *  \\brief Possible return values from the SDL_HitTest callback.\n *\n *  \\sa SDL_HitTest\n */\ntypedef enum\n{\n    SDL_HITTEST_NORMAL,  /**< Region is normal. No special properties. */\n    SDL_HITTEST_DRAGGABLE,  /**< Region can drag entire window. */\n    SDL_HITTEST_RESIZE_TOPLEFT,\n    SDL_HITTEST_RESIZE_TOP,\n    SDL_HITTEST_RESIZE_TOPRIGHT,\n    SDL_HITTEST_RESIZE_RIGHT,\n    SDL_HITTEST_RESIZE_BOTTOMRIGHT,\n    SDL_HITTEST_RESIZE_BOTTOM,\n    SDL_HITTEST_RESIZE_BOTTOMLEFT,\n    SDL_HITTEST_RESIZE_LEFT\n} SDL_HitTestResult;\n\n/**\n *  \\brief Callback used for hit-testing.\n *\n *  \\sa SDL_SetWindowHitTest\n */\ntypedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win,\n                                                 const SDL_Point *area,\n                                                 void *data);\n\n/**\n *  \\brief Provide a callback that decides if a window region has special properties.\n *\n *  Normally windows are dragged and resized by decorations provided by the\n *  system window manager (a title bar, borders, etc), but for some apps, it\n *  makes sense to drag them from somewhere else inside the window itself; for\n *  example, one might have a borderless window that wants to be draggable\n *  from any part, or simulate its own title bar, etc.\n *\n *  This function lets the app provide a callback that designates pieces of\n *  a given window as special. This callback is run during event processing\n *  if we need to tell the OS to treat a region of the window specially; the\n *  use of this callback is known as \"hit testing.\"\n *\n *  Mouse input may not be delivered to your application if it is within\n *  a special area; the OS will often apply that input to moving the window or\n *  resizing the window and not deliver it to the application.\n *\n *  Specifying NULL for a callback disables hit-testing. Hit-testing is\n *  disabled by default.\n *\n *  Platforms that don't support this functionality will return -1\n *  unconditionally, even if you're attempting to disable hit-testing.\n *\n *  Your callback may fire at any time, and its firing does not indicate any\n *  specific behavior (for example, on Windows, this certainly might fire\n *  when the OS is deciding whether to drag your window, but it fires for lots\n *  of other reasons, too, some unrelated to anything you probably care about\n *  _and when the mouse isn't actually at the location it is testing_).\n *  Since this can fire at any time, you should try to keep your callback\n *  efficient, devoid of allocations, etc.\n *\n *  \\param window The window to set hit-testing on.\n *  \\param callback The callback to call when doing a hit-test.\n *  \\param callback_data An app-defined void pointer passed to the callback.\n *  \\return 0 on success, -1 on error (including unsupported).\n */\nextern DECLSPEC int SDLCALL SDL_SetWindowHitTest(SDL_Window * window,\n                                                 SDL_HitTest callback,\n                                                 void *callback_data);\n\n/**\n *  \\brief Destroy a window.\n */\nextern DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window * window);\n\n\n/**\n *  \\brief Returns whether the screensaver is currently enabled (default off).\n *\n *  \\sa SDL_EnableScreenSaver()\n *  \\sa SDL_DisableScreenSaver()\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_IsScreenSaverEnabled(void);\n\n/**\n *  \\brief Allow the screen to be blanked by a screensaver\n *\n *  \\sa SDL_IsScreenSaverEnabled()\n *  \\sa SDL_DisableScreenSaver()\n */\nextern DECLSPEC void SDLCALL SDL_EnableScreenSaver(void);\n\n/**\n *  \\brief Prevent the screen from being blanked by a screensaver\n *\n *  \\sa SDL_IsScreenSaverEnabled()\n *  \\sa SDL_EnableScreenSaver()\n */\nextern DECLSPEC void SDLCALL SDL_DisableScreenSaver(void);\n\n\n/**\n *  \\name OpenGL support functions\n */\n/* @{ */\n\n/**\n *  \\brief Dynamically load an OpenGL library.\n *\n *  \\param path The platform dependent OpenGL library name, or NULL to open the\n *              default OpenGL library.\n *\n *  \\return 0 on success, or -1 if the library couldn't be loaded.\n *\n *  This should be done after initializing the video driver, but before\n *  creating any OpenGL windows.  If no OpenGL library is loaded, the default\n *  library will be loaded upon creation of the first OpenGL window.\n *\n *  \\note If you do this, you need to retrieve all of the GL functions used in\n *        your program from the dynamic library using SDL_GL_GetProcAddress().\n *\n *  \\sa SDL_GL_GetProcAddress()\n *  \\sa SDL_GL_UnloadLibrary()\n */\nextern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path);\n\n/**\n *  \\brief Get the address of an OpenGL function.\n */\nextern DECLSPEC void *SDLCALL SDL_GL_GetProcAddress(const char *proc);\n\n/**\n *  \\brief Unload the OpenGL library previously loaded by SDL_GL_LoadLibrary().\n *\n *  \\sa SDL_GL_LoadLibrary()\n */\nextern DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void);\n\n/**\n *  \\brief Return true if an OpenGL extension is supported for the current\n *         context.\n */\nextern DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char\n                                                           *extension);\n\n/**\n *  \\brief Reset all previously set OpenGL context attributes to their default values\n */\nextern DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void);\n\n/**\n *  \\brief Set an OpenGL window attribute before window creation.\n */\nextern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value);\n\n/**\n *  \\brief Get the actual value for an attribute from the current context.\n */\nextern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value);\n\n/**\n *  \\brief Create an OpenGL context for use with an OpenGL window, and make it\n *         current.\n *\n *  \\sa SDL_GL_DeleteContext()\n */\nextern DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window *\n                                                           window);\n\n/**\n *  \\brief Set up an OpenGL context for rendering into an OpenGL window.\n *\n *  \\note The context must have been created with a compatible window.\n */\nextern DECLSPEC int SDLCALL SDL_GL_MakeCurrent(SDL_Window * window,\n                                               SDL_GLContext context);\n\n/**\n *  \\brief Get the currently active OpenGL window.\n */\nextern DECLSPEC SDL_Window* SDLCALL SDL_GL_GetCurrentWindow(void);\n\n/**\n *  \\brief Get the currently active OpenGL context.\n */\nextern DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void);\n\n/**\n *  \\brief Get the size of a window's underlying drawable in pixels (for use\n *         with glViewport).\n *\n *  \\param window   Window from which the drawable size should be queried\n *  \\param w        Pointer to variable for storing the width in pixels, may be NULL\n *  \\param h        Pointer to variable for storing the height in pixels, may be NULL\n *\n * This may differ from SDL_GetWindowSize() if we're rendering to a high-DPI\n * drawable, i.e. the window was created with SDL_WINDOW_ALLOW_HIGHDPI on a\n * platform with high-DPI support (Apple calls this \"Retina\"), and not disabled\n * by the SDL_HINT_VIDEO_HIGHDPI_DISABLED hint.\n *\n *  \\sa SDL_GetWindowSize()\n *  \\sa SDL_CreateWindow()\n */\nextern DECLSPEC void SDLCALL SDL_GL_GetDrawableSize(SDL_Window * window, int *w,\n                                                    int *h);\n\n/**\n *  \\brief Set the swap interval for the current OpenGL context.\n *\n *  \\param interval 0 for immediate updates, 1 for updates synchronized with the\n *                  vertical retrace. If the system supports it, you may\n *                  specify -1 to allow late swaps to happen immediately\n *                  instead of waiting for the next retrace.\n *\n *  \\return 0 on success, or -1 if setting the swap interval is not supported.\n *\n *  \\sa SDL_GL_GetSwapInterval()\n */\nextern DECLSPEC int SDLCALL SDL_GL_SetSwapInterval(int interval);\n\n/**\n *  \\brief Get the swap interval for the current OpenGL context.\n *\n *  \\return 0 if there is no vertical retrace synchronization, 1 if the buffer\n *          swap is synchronized with the vertical retrace, and -1 if late\n *          swaps happen immediately instead of waiting for the next retrace.\n *          If the system can't determine the swap interval, or there isn't a\n *          valid current context, this will return 0 as a safe default.\n *\n *  \\sa SDL_GL_SetSwapInterval()\n */\nextern DECLSPEC int SDLCALL SDL_GL_GetSwapInterval(void);\n\n/**\n * \\brief Swap the OpenGL buffers for a window, if double-buffering is\n *        supported.\n */\nextern DECLSPEC void SDLCALL SDL_GL_SwapWindow(SDL_Window * window);\n\n/**\n *  \\brief Delete an OpenGL context.\n *\n *  \\sa SDL_GL_CreateContext()\n */\nextern DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context);\n\n/* @} *//* OpenGL support functions */\n\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_video_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/include/begin_code.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file begin_code.h\n *\n *  This file sets things up for C dynamic library function definitions,\n *  static inlined functions, and structures aligned at 4-byte alignment.\n *  If you don't like ugly C preprocessor code, don't look at this file. :)\n */\n\n/* This shouldn't be nested -- included it around code only. */\n#ifdef _begin_code_h\n#error Nested inclusion of begin_code.h\n#endif\n#define _begin_code_h\n\n#ifndef SDL_DEPRECATED\n#  if (__GNUC__ >= 4)  /* technically, this arrived in gcc 3.1, but oh well. */\n#    define SDL_DEPRECATED __attribute__((deprecated))\n#  else\n#    define SDL_DEPRECATED\n#  endif\n#endif\n\n#ifndef SDL_UNUSED\n#  ifdef __GNUC__\n#    define SDL_UNUSED __attribute__((unused))\n#  else\n#    define SDL_UNUSED\n#  endif\n#endif\n\n/* Some compilers use a special export keyword */\n#ifndef DECLSPEC\n# if defined(__WIN32__) || defined(__WINRT__)\n#  ifdef __BORLANDC__\n#   ifdef BUILD_SDL\n#    define DECLSPEC\n#   else\n#    define DECLSPEC    __declspec(dllimport)\n#   endif\n#  else\n#   define DECLSPEC __declspec(dllexport)\n#  endif\n# else\n#  if defined(__GNUC__) && __GNUC__ >= 4\n#   define DECLSPEC __attribute__ ((visibility(\"default\")))\n#  else\n#   define DECLSPEC\n#  endif\n# endif\n#endif\n\n/* By default SDL uses the C calling convention */\n#ifndef SDLCALL\n#if (defined(__WIN32__) || defined(__WINRT__)) && !defined(__GNUC__)\n#define SDLCALL __cdecl\n#else\n#define SDLCALL\n#endif\n#endif /* SDLCALL */\n\n/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */\n#ifdef __SYMBIAN32__\n#undef DECLSPEC\n#define DECLSPEC\n#endif /* __SYMBIAN32__ */\n\n/* Force structure packing at 4 byte alignment.\n   This is necessary if the header is included in code which has structure\n   packing set to an alternate value, say for loading structures from disk.\n   The packing is reset to the previous value in close_code.h\n */\n#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__)\n#ifdef _MSC_VER\n#pragma warning(disable: 4103)\n#endif\n#ifdef __BORLANDC__\n#pragma nopackwarning\n#endif\n#ifdef _M_X64\n/* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */\n#pragma pack(push,8)\n#else\n#pragma pack(push,4)\n#endif\n#endif /* Compiler needs structure packing set */\n\n#ifndef SDL_INLINE\n#if defined(__GNUC__)\n#define SDL_INLINE __inline__\n#elif defined(_MSC_VER) || defined(__BORLANDC__) || \\\n      defined(__DMC__) || defined(__SC__) || \\\n      defined(__WATCOMC__) || defined(__LCC__) || \\\n      defined(__DECC)\n#define SDL_INLINE __inline\n#ifndef __inline__\n#define __inline__ __inline\n#endif\n#else\n#define SDL_INLINE inline\n#ifndef __inline__\n#define __inline__ inline\n#endif\n#endif\n#endif /* SDL_INLINE not defined */\n\n#ifndef SDL_FORCE_INLINE\n#if defined(_MSC_VER)\n#define SDL_FORCE_INLINE __forceinline\n#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) )\n#define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__\n#else\n#define SDL_FORCE_INLINE static SDL_INLINE\n#endif\n#endif /* SDL_FORCE_INLINE not defined */\n\n/* Apparently this is needed by several Windows compilers */\n#if !defined(__MACH__)\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif /* NULL */\n#endif /* ! Mac OS X - breaks precompiled headers */\n"
  },
  {
    "path": "libs/SDL2/include/close_code.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file close_code.h\n *\n *  This file reverses the effects of begin_code.h and should be included\n *  after you finish any function and structure declarations in your headers\n */\n\n#undef _begin_code_h\n\n/* Reset structure packing at previous byte alignment */\n#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__WATCOMC__)  || defined(__BORLANDC__)\n#ifdef __BORLANDC__\n#pragma nopackwarning\n#endif\n#pragma pack(pop)\n#endif /* Compiler needs structure packing set */\n"
  },
  {
    "path": "libs/SDL2/src/SDL.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"./SDL_internal.h\"\n\n#if defined(__WIN32__)\n#include \"core/windows/SDL_windows.h\"\n#endif\n\n/* Initialization code for SDL */\n\n#include \"SDL.h\"\n#include \"SDL_bits.h\"\n#include \"SDL_revision.h\"\n#include \"SDL_assert_c.h\"\n#include \"events/SDL_events_c.h\"\n#include \"haptic/SDL_haptic_c.h\"\n#include \"joystick/SDL_joystick_c.h\"\n\n/* Initialization/Cleanup routines */\n#if !SDL_TIMERS_DISABLED\nextern int SDL_TimerInit(void);\nextern void SDL_TimerQuit(void);\nextern void SDL_TicksInit(void);\nextern void SDL_TicksQuit(void);\n#endif\n#if SDL_VIDEO_DRIVER_WINDOWS\nextern int SDL_HelperWindowCreate(void);\nextern int SDL_HelperWindowDestroy(void);\n#endif\n\n\n/* The initialized subsystems */\n#ifdef SDL_MAIN_NEEDED\nstatic SDL_bool SDL_MainIsReady = SDL_FALSE;\n#else\nstatic SDL_bool SDL_MainIsReady = SDL_TRUE;\n#endif\nstatic SDL_bool SDL_bInMainQuit = SDL_FALSE;\nstatic Uint8 SDL_SubsystemRefCount[ 32 ];\n\n/* Private helper to increment a subsystem's ref counter. */\nstatic void\nSDL_PrivateSubsystemRefCountIncr(Uint32 subsystem)\n{\n    int subsystem_index = SDL_MostSignificantBitIndex32(subsystem);\n    SDL_assert(SDL_SubsystemRefCount[subsystem_index] < 255);\n    ++SDL_SubsystemRefCount[subsystem_index];\n}\n\n/* Private helper to decrement a subsystem's ref counter. */\nstatic void\nSDL_PrivateSubsystemRefCountDecr(Uint32 subsystem)\n{\n    int subsystem_index = SDL_MostSignificantBitIndex32(subsystem);\n    if (SDL_SubsystemRefCount[subsystem_index] > 0) {\n        --SDL_SubsystemRefCount[subsystem_index];\n    }\n}\n\n/* Private helper to check if a system needs init. */\nstatic SDL_bool\nSDL_PrivateShouldInitSubsystem(Uint32 subsystem)\n{\n    int subsystem_index = SDL_MostSignificantBitIndex32(subsystem);\n    SDL_assert(SDL_SubsystemRefCount[subsystem_index] < 255);\n    return (SDL_SubsystemRefCount[subsystem_index] == 0);\n}\n\n/* Private helper to check if a system needs to be quit. */\nstatic SDL_bool\nSDL_PrivateShouldQuitSubsystem(Uint32 subsystem) {\n    int subsystem_index = SDL_MostSignificantBitIndex32(subsystem);\n    if (SDL_SubsystemRefCount[subsystem_index] == 0) {\n      return SDL_FALSE;\n    }\n\n    /* If we're in SDL_Quit, we shut down every subsystem, even if refcount\n     * isn't zero.\n     */\n    return SDL_SubsystemRefCount[subsystem_index] == 1 || SDL_bInMainQuit;\n}\n\nvoid\nSDL_SetMainReady(void)\n{\n    SDL_MainIsReady = SDL_TRUE;\n}\n\nint\nSDL_InitSubSystem(Uint32 flags)\n{\n    if (!SDL_MainIsReady) {\n        SDL_SetError(\"Application didn't initialize properly, did you include SDL_main.h in the file containing your main() function?\");\n        return -1;\n    }\n\n    /* Clear the error message */\n    SDL_ClearError();\n\n    if ((flags & SDL_INIT_GAMECONTROLLER)) {\n        /* game controller implies joystick */\n        flags |= SDL_INIT_JOYSTICK;\n    }\n\n    if ((flags & (SDL_INIT_VIDEO|SDL_INIT_JOYSTICK))) {\n        /* video or joystick implies events */\n        flags |= SDL_INIT_EVENTS;\n    }\n\n#if SDL_VIDEO_DRIVER_WINDOWS\n\tif ((flags & (SDL_INIT_HAPTIC|SDL_INIT_JOYSTICK))) {\n\t\tif (SDL_HelperWindowCreate() < 0) {\n\t\t\treturn -1;\n\t\t}\n\t}\n#endif\n\n#if !SDL_TIMERS_DISABLED\n    SDL_TicksInit();\n#endif\n\n    /* Initialize the event subsystem */\n    if ((flags & SDL_INIT_EVENTS)) {\n#if !SDL_EVENTS_DISABLED\n        if (SDL_PrivateShouldInitSubsystem(SDL_INIT_EVENTS)) {\n            if (SDL_StartEventLoop() < 0) {\n                return (-1);\n            }\n            SDL_QuitInit();\n        }\n        SDL_PrivateSubsystemRefCountIncr(SDL_INIT_EVENTS);\n#else\n        return SDL_SetError(\"SDL not built with events support\");\n#endif\n    }\n\n    /* Initialize the timer subsystem */\n    if ((flags & SDL_INIT_TIMER)){\n#if !SDL_TIMERS_DISABLED\n        if (SDL_PrivateShouldInitSubsystem(SDL_INIT_TIMER)) {\n            if (SDL_TimerInit() < 0) {\n                return (-1);\n            }\n        }\n        SDL_PrivateSubsystemRefCountIncr(SDL_INIT_TIMER);\n#else\n        return SDL_SetError(\"SDL not built with timer support\");\n#endif\n    }\n\n    /* Initialize the video subsystem */\n    if ((flags & SDL_INIT_VIDEO)){\n#if !SDL_VIDEO_DISABLED\n        if (SDL_PrivateShouldInitSubsystem(SDL_INIT_VIDEO)) {\n            if (SDL_VideoInit(NULL) < 0) {\n                return (-1);\n            }\n        }\n        SDL_PrivateSubsystemRefCountIncr(SDL_INIT_VIDEO);\n#else\n        return SDL_SetError(\"SDL not built with video support\");\n#endif\n    }\n\n    /* Initialize the audio subsystem */\n    if ((flags & SDL_INIT_AUDIO)){\n#if !SDL_AUDIO_DISABLED\n        if (SDL_PrivateShouldInitSubsystem(SDL_INIT_AUDIO)) {\n            if (SDL_AudioInit(NULL) < 0) {\n                return (-1);\n            }\n        }\n        SDL_PrivateSubsystemRefCountIncr(SDL_INIT_AUDIO);\n#else\n        return SDL_SetError(\"SDL not built with audio support\");\n#endif\n    }\n\n    /* Initialize the joystick subsystem */\n    if ((flags & SDL_INIT_JOYSTICK)){\n#if !SDL_JOYSTICK_DISABLED\n        if (SDL_PrivateShouldInitSubsystem(SDL_INIT_JOYSTICK)) {\n           if (SDL_JoystickInit() < 0) {\n               return (-1);\n           }\n        }\n        SDL_PrivateSubsystemRefCountIncr(SDL_INIT_JOYSTICK);\n#else\n        return SDL_SetError(\"SDL not built with joystick support\");\n#endif\n    }\n\n    if ((flags & SDL_INIT_GAMECONTROLLER)){\n#if !SDL_JOYSTICK_DISABLED\n        if (SDL_PrivateShouldInitSubsystem(SDL_INIT_GAMECONTROLLER)) {\n            if (SDL_GameControllerInit() < 0) {\n                return (-1);\n            }\n        }\n        SDL_PrivateSubsystemRefCountIncr(SDL_INIT_GAMECONTROLLER);\n#else\n        return SDL_SetError(\"SDL not built with joystick support\");\n#endif\n    }\n\n    /* Initialize the haptic subsystem */\n    if ((flags & SDL_INIT_HAPTIC)){\n#if !SDL_HAPTIC_DISABLED\n        if (SDL_PrivateShouldInitSubsystem(SDL_INIT_HAPTIC)) {\n            if (SDL_HapticInit() < 0) {\n                return (-1);\n            }\n        }\n        SDL_PrivateSubsystemRefCountIncr(SDL_INIT_HAPTIC);\n#else\n        return SDL_SetError(\"SDL not built with haptic (force feedback) support\");\n#endif\n    }\n\n    return (0);\n}\n\nint\nSDL_Init(Uint32 flags)\n{\n    return SDL_InitSubSystem(flags);\n}\n\nvoid\nSDL_QuitSubSystem(Uint32 flags)\n{\n    /* Shut down requested initialized subsystems */\n#if !SDL_JOYSTICK_DISABLED\n    if ((flags & SDL_INIT_GAMECONTROLLER)) {\n        /* game controller implies joystick */\n        flags |= SDL_INIT_JOYSTICK;\n\n        if (SDL_PrivateShouldQuitSubsystem(SDL_INIT_GAMECONTROLLER)) {\n            SDL_GameControllerQuit();\n        }\n        SDL_PrivateSubsystemRefCountDecr(SDL_INIT_GAMECONTROLLER);\n    }\n\n    if ((flags & SDL_INIT_JOYSTICK)) {\n        /* joystick implies events */\n        flags |= SDL_INIT_EVENTS;\n\n        if (SDL_PrivateShouldQuitSubsystem(SDL_INIT_JOYSTICK)) {\n            SDL_JoystickQuit();\n        }\n        SDL_PrivateSubsystemRefCountDecr(SDL_INIT_JOYSTICK);\n    }\n#endif\n\n#if !SDL_HAPTIC_DISABLED\n    if ((flags & SDL_INIT_HAPTIC)) {\n        if (SDL_PrivateShouldQuitSubsystem(SDL_INIT_HAPTIC)) {\n            SDL_HapticQuit();\n        }\n        SDL_PrivateSubsystemRefCountDecr(SDL_INIT_HAPTIC);\n    }\n#endif\n\n#if !SDL_AUDIO_DISABLED\n    if ((flags & SDL_INIT_AUDIO)) {\n        if (SDL_PrivateShouldQuitSubsystem(SDL_INIT_AUDIO)) {\n            SDL_AudioQuit();\n        }\n        SDL_PrivateSubsystemRefCountDecr(SDL_INIT_AUDIO);\n    }\n#endif\n\n#if !SDL_VIDEO_DISABLED\n    if ((flags & SDL_INIT_VIDEO)) {\n        /* video implies events */\n        flags |= SDL_INIT_EVENTS;\n\n        if (SDL_PrivateShouldQuitSubsystem(SDL_INIT_VIDEO)) {\n            SDL_VideoQuit();\n        }\n        SDL_PrivateSubsystemRefCountDecr(SDL_INIT_VIDEO);\n    }\n#endif\n\n#if !SDL_TIMERS_DISABLED\n    if ((flags & SDL_INIT_TIMER)) {\n        if (SDL_PrivateShouldQuitSubsystem(SDL_INIT_TIMER)) {\n            SDL_TimerQuit();\n        }\n        SDL_PrivateSubsystemRefCountDecr(SDL_INIT_TIMER);\n    }\n#endif\n\n#if !SDL_EVENTS_DISABLED\n    if ((flags & SDL_INIT_EVENTS)) {\n        if (SDL_PrivateShouldQuitSubsystem(SDL_INIT_EVENTS)) {\n            SDL_QuitQuit();\n            SDL_StopEventLoop();\n        }\n        SDL_PrivateSubsystemRefCountDecr(SDL_INIT_EVENTS);\n    }\n#endif\n}\n\nUint32\nSDL_WasInit(Uint32 flags)\n{\n    int i;\n    int num_subsystems = SDL_arraysize(SDL_SubsystemRefCount);\n    Uint32 initialized = 0;\n\n    if (!flags) {\n        flags = SDL_INIT_EVERYTHING;\n    }\n\n    num_subsystems = SDL_min(num_subsystems, SDL_MostSignificantBitIndex32(flags) + 1);\n\n    /* Iterate over each bit in flags, and check the matching subsystem. */\n    for (i = 0; i < num_subsystems; ++i) {\n        if ((flags & 1) && SDL_SubsystemRefCount[i] > 0) {\n            initialized |= (1 << i);\n        }\n\n        flags >>= 1;\n    }\n\n    return initialized;\n}\n\nvoid\nSDL_Quit(void)\n{\n    SDL_bInMainQuit = SDL_TRUE;\n\n    /* Quit all subsystems */\n#if SDL_VIDEO_DRIVER_WINDOWS\n    SDL_HelperWindowDestroy();\n#endif\n    SDL_QuitSubSystem(SDL_INIT_EVERYTHING);\n\n#if !SDL_TIMERS_DISABLED\n    SDL_TicksQuit();\n#endif\n\n    SDL_ClearHints();\n    SDL_AssertionsQuit();\n    SDL_LogResetPriorities();\n\n    /* Now that every subsystem has been quit, we reset the subsystem refcount\n     * and the list of initialized subsystems.\n     */\n    SDL_memset( SDL_SubsystemRefCount, 0x0, sizeof(SDL_SubsystemRefCount) );\n\n    SDL_bInMainQuit = SDL_FALSE;\n}\n\n/* Get the library version number */\nvoid\nSDL_GetVersion(SDL_version * ver)\n{\n    SDL_VERSION(ver);\n}\n\n/* Get the library source revision */\nconst char *\nSDL_GetRevision(void)\n{\n    return SDL_REVISION;\n}\n\n/* Get the library source revision number */\nint\nSDL_GetRevisionNumber(void)\n{\n    return SDL_REVISION_NUMBER;\n}\n\n/* Get the name of the platform */\nconst char *\nSDL_GetPlatform()\n{\n#if __AIX__\n    return \"AIX\";\n#elif __ANDROID__\n    return \"Android\";\n#elif __BSDI__\n    return \"BSDI\";\n#elif __DREAMCAST__\n    return \"Dreamcast\";\n#elif __EMSCRIPTEN__\n    return \"Emscripten\";\n#elif __FREEBSD__\n    return \"FreeBSD\";\n#elif __HAIKU__\n    return \"Haiku\";\n#elif __HPUX__\n    return \"HP-UX\";\n#elif __IRIX__\n    return \"Irix\";\n#elif __LINUX__\n    return \"Linux\";\n#elif __MINT__\n    return \"Atari MiNT\";\n#elif __MACOS__\n    return \"MacOS Classic\";\n#elif __MACOSX__\n    return \"Mac OS X\";\n#elif __NACL__\n    return \"NaCl\";\n#elif __NETBSD__\n    return \"NetBSD\";\n#elif __OPENBSD__\n    return \"OpenBSD\";\n#elif __OS2__\n    return \"OS/2\";\n#elif __OSF__\n    return \"OSF/1\";\n#elif __QNXNTO__\n    return \"QNX Neutrino\";\n#elif __RISCOS__\n    return \"RISC OS\";\n#elif __SOLARIS__\n    return \"Solaris\";\n#elif __WIN32__\n    return \"Windows\";\n#elif __WINRT__\n    return \"WinRT\";\n#elif __TVOS__\n    return \"tvOS\";\n#elif __IPHONEOS__\n    return \"iOS\";\n#elif __PSP__\n    return \"PlayStation Portable\";\n#else\n    return \"Unknown (see SDL_platform.h)\";\n#endif\n}\n\n#if defined(__WIN32__)\n\n#if !defined(HAVE_LIBC) || (defined(__WATCOMC__) && defined(BUILD_DLL))\n/* Need to include DllMain() on Watcom C for some reason.. */\n\nBOOL APIENTRY\n_DllMainCRTStartup(HANDLE hModule,\n                   DWORD ul_reason_for_call, LPVOID lpReserved)\n{\n    switch (ul_reason_for_call) {\n    case DLL_PROCESS_ATTACH:\n    case DLL_THREAD_ATTACH:\n    case DLL_THREAD_DETACH:\n    case DLL_PROCESS_DETACH:\n        break;\n    }\n    return TRUE;\n}\n#endif /* building DLL with Watcom C */\n\n#endif /* __WIN32__ */\n\n/* vi: set sts=4 ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/SDL_assert.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"./SDL_internal.h\"\n\n#if defined(__WIN32__)\n#include \"core/windows/SDL_windows.h\"\n#endif\n\n#include \"SDL.h\"\n#include \"SDL_atomic.h\"\n#include \"SDL_messagebox.h\"\n#include \"SDL_video.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_assert_c.h\"\n#include \"video/SDL_sysvideo.h\"\n\n#ifdef __WIN32__\n#ifndef WS_OVERLAPPEDWINDOW\n#define WS_OVERLAPPEDWINDOW 0\n#endif\n#else  /* fprintf, _exit(), etc. */\n#include <stdio.h>\n#include <stdlib.h>\n#if ! defined(__WINRT__)\n#include <unistd.h>\n#endif\n#endif\n\nstatic SDL_assert_state\nSDL_PromptAssertion(const SDL_assert_data *data, void *userdata);\n\n/*\n * We keep all triggered assertions in a singly-linked list so we can\n *  generate a report later.\n */\nstatic SDL_assert_data *triggered_assertions = NULL;\n\nstatic SDL_mutex *assertion_mutex = NULL;\nstatic SDL_AssertionHandler assertion_handler = SDL_PromptAssertion;\nstatic void *assertion_userdata = NULL;\n\n#ifdef __GNUC__\nstatic void\ndebug_print(const char *fmt, ...) __attribute__((format (printf, 1, 2)));\n#endif\n\nstatic void\ndebug_print(const char *fmt, ...)\n{\n    va_list ap;\n    va_start(ap, fmt);\n    SDL_LogMessageV(SDL_LOG_CATEGORY_ASSERT, SDL_LOG_PRIORITY_WARN, fmt, ap);\n    va_end(ap);\n}\n\n\nstatic void SDL_AddAssertionToReport(SDL_assert_data *data)\n{\n    /* (data) is always a static struct defined with the assert macros, so\n       we don't have to worry about copying or allocating them. */\n    data->trigger_count++;\n    if (data->trigger_count == 1) {  /* not yet added? */\n        data->next = triggered_assertions;\n        triggered_assertions = data;\n    }\n}\n\n\nstatic void SDL_GenerateAssertionReport(void)\n{\n    const SDL_assert_data *item = triggered_assertions;\n\n    /* only do this if the app hasn't assigned an assertion handler. */\n    if ((item != NULL) && (assertion_handler != SDL_PromptAssertion)) {\n        debug_print(\"\\n\\nSDL assertion report.\\n\");\n        debug_print(\"All SDL assertions between last init/quit:\\n\\n\");\n\n        while (item != NULL) {\n            debug_print(\n                \"'%s'\\n\"\n                \"    * %s (%s:%d)\\n\"\n                \"    * triggered %u time%s.\\n\"\n                \"    * always ignore: %s.\\n\",\n                item->condition, item->function, item->filename,\n                item->linenum, item->trigger_count,\n                (item->trigger_count == 1) ? \"\" : \"s\",\n                item->always_ignore ? \"yes\" : \"no\");\n            item = item->next;\n        }\n        debug_print(\"\\n\");\n\n        SDL_ResetAssertionReport();\n    }\n}\n\nstatic void SDL_ExitProcess(int exitcode)\n{\n#ifdef __WIN32__\n    ExitProcess(exitcode);\n#else\n    _exit(exitcode);\n#endif\n}\n\nstatic void SDL_AbortAssertion(void)\n{\n    SDL_Quit();\n    SDL_ExitProcess(42);\n}\n\n\nstatic SDL_assert_state\nSDL_PromptAssertion(const SDL_assert_data *data, void *userdata)\n{\n#ifdef __WIN32__\n    #define ENDLINE \"\\r\\n\"\n#else\n    #define ENDLINE \"\\n\"\n#endif\n\n    const char *envr;\n    SDL_assert_state state = SDL_ASSERTION_ABORT;\n    SDL_Window *window;\n    SDL_MessageBoxData messagebox;\n    SDL_MessageBoxButtonData buttons[] = {\n        {   0,  SDL_ASSERTION_RETRY,            \"Retry\" },\n        {   0,  SDL_ASSERTION_BREAK,            \"Break\" },\n        {   0,  SDL_ASSERTION_ABORT,            \"Abort\" },\n        {   SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT,\n                SDL_ASSERTION_IGNORE,           \"Ignore\" },\n        {   SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT,\n                SDL_ASSERTION_ALWAYS_IGNORE,    \"Always Ignore\" }\n    };\n    char *message;\n    int selected;\n\n    (void) userdata;  /* unused in default handler. */\n\n    message = SDL_stack_alloc(char, SDL_MAX_LOG_MESSAGE);\n    if (!message) {\n        /* Uh oh, we're in real trouble now... */\n        return SDL_ASSERTION_ABORT;\n    }\n    SDL_snprintf(message, SDL_MAX_LOG_MESSAGE,\n                 \"Assertion failure at %s (%s:%d), triggered %u %s:\" ENDLINE\n                    \"  '%s'\",\n                 data->function, data->filename, data->linenum,\n                 data->trigger_count, (data->trigger_count == 1) ? \"time\" : \"times\",\n                 data->condition);\n\n    debug_print(\"\\n\\n%s\\n\\n\", message);\n\n    /* let env. variable override, so unit tests won't block in a GUI. */\n    envr = SDL_getenv(\"SDL_ASSERT\");\n    if (envr != NULL) {\n        SDL_stack_free(message);\n\n        if (SDL_strcmp(envr, \"abort\") == 0) {\n            return SDL_ASSERTION_ABORT;\n        } else if (SDL_strcmp(envr, \"break\") == 0) {\n            return SDL_ASSERTION_BREAK;\n        } else if (SDL_strcmp(envr, \"retry\") == 0) {\n            return SDL_ASSERTION_RETRY;\n        } else if (SDL_strcmp(envr, \"ignore\") == 0) {\n            return SDL_ASSERTION_IGNORE;\n        } else if (SDL_strcmp(envr, \"always_ignore\") == 0) {\n            return SDL_ASSERTION_ALWAYS_IGNORE;\n        } else {\n            return SDL_ASSERTION_ABORT;  /* oh well. */\n        }\n    }\n\n    /* Leave fullscreen mode, if possible (scary!) */\n    window = SDL_GetFocusWindow();\n    if (window) {\n        if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) {\n            SDL_MinimizeWindow(window);\n        } else {\n            /* !!! FIXME: ungrab the input if we're not fullscreen? */\n            /* No need to mess with the window */\n            window = NULL;\n        }\n    }\n\n    /* Show a messagebox if we can, otherwise fall back to stdio */\n    SDL_zero(messagebox);\n    messagebox.flags = SDL_MESSAGEBOX_WARNING;\n    messagebox.window = window;\n    messagebox.title = \"Assertion Failed\";\n    messagebox.message = message;\n    messagebox.numbuttons = SDL_arraysize(buttons);\n    messagebox.buttons = buttons;\n\n    if (SDL_ShowMessageBox(&messagebox, &selected) == 0) {\n        if (selected == -1) {\n            state = SDL_ASSERTION_IGNORE;\n        } else {\n            state = (SDL_assert_state)selected;\n        }\n    }\n#ifdef HAVE_STDIO_H\n    else\n    {\n        /* this is a little hacky. */\n        for ( ; ; ) {\n            char buf[32];\n            fprintf(stderr, \"Abort/Break/Retry/Ignore/AlwaysIgnore? [abriA] : \");\n            fflush(stderr);\n            if (fgets(buf, sizeof (buf), stdin) == NULL) {\n                break;\n            }\n\n            if (SDL_strcmp(buf, \"a\") == 0) {\n                state = SDL_ASSERTION_ABORT;\n                break;\n            } else if (SDL_strcmp(buf, \"b\") == 0) {\n                state = SDL_ASSERTION_BREAK;\n                break;\n            } else if (SDL_strcmp(buf, \"r\") == 0) {\n                state = SDL_ASSERTION_RETRY;\n                break;\n            } else if (SDL_strcmp(buf, \"i\") == 0) {\n                state = SDL_ASSERTION_IGNORE;\n                break;\n            } else if (SDL_strcmp(buf, \"A\") == 0) {\n                state = SDL_ASSERTION_ALWAYS_IGNORE;\n                break;\n            }\n        }\n    }\n#endif /* HAVE_STDIO_H */\n\n    /* Re-enter fullscreen mode */\n    if (window) {\n        SDL_RestoreWindow(window);\n    }\n\n    SDL_stack_free(message);\n\n    return state;\n}\n\n\nSDL_assert_state\nSDL_ReportAssertion(SDL_assert_data *data, const char *func, const char *file,\n                    int line)\n{\n    static int assertion_running = 0;\n    static SDL_SpinLock spinlock = 0;\n    SDL_assert_state state = SDL_ASSERTION_IGNORE;\n\n    SDL_AtomicLock(&spinlock);\n    if (assertion_mutex == NULL) { /* never called SDL_Init()? */\n        assertion_mutex = SDL_CreateMutex();\n        if (assertion_mutex == NULL) {\n            SDL_AtomicUnlock(&spinlock);\n            return SDL_ASSERTION_IGNORE;   /* oh well, I guess. */\n        }\n    }\n    SDL_AtomicUnlock(&spinlock);\n\n    if (SDL_LockMutex(assertion_mutex) < 0) {\n        return SDL_ASSERTION_IGNORE;   /* oh well, I guess. */\n    }\n\n    /* doing this because Visual C is upset over assigning in the macro. */\n    if (data->trigger_count == 0) {\n        data->function = func;\n        data->filename = file;\n        data->linenum = line;\n    }\n\n    SDL_AddAssertionToReport(data);\n\n    assertion_running++;\n    if (assertion_running > 1) {   /* assert during assert! Abort. */\n        if (assertion_running == 2) {\n            SDL_AbortAssertion();\n        } else if (assertion_running == 3) {  /* Abort asserted! */\n            SDL_ExitProcess(42);\n        } else {\n            while (1) { /* do nothing but spin; what else can you do?! */ }\n        }\n    }\n\n    if (!data->always_ignore) {\n        state = assertion_handler(data, assertion_userdata);\n    }\n\n    switch (state)\n    {\n        case SDL_ASSERTION_ABORT:\n            SDL_AbortAssertion();\n            return SDL_ASSERTION_IGNORE;  /* shouldn't return, but oh well. */\n\n        case SDL_ASSERTION_ALWAYS_IGNORE:\n            state = SDL_ASSERTION_IGNORE;\n            data->always_ignore = 1;\n            break;\n\n        case SDL_ASSERTION_IGNORE:\n        case SDL_ASSERTION_RETRY:\n        case SDL_ASSERTION_BREAK:\n            break;  /* macro handles these. */\n    }\n\n    assertion_running--;\n    SDL_UnlockMutex(assertion_mutex);\n\n    return state;\n}\n\n\nvoid SDL_AssertionsQuit(void)\n{\n    SDL_GenerateAssertionReport();\n    if (assertion_mutex != NULL) {\n        SDL_DestroyMutex(assertion_mutex);\n        assertion_mutex = NULL;\n    }\n}\n\nvoid SDL_SetAssertionHandler(SDL_AssertionHandler handler, void *userdata)\n{\n    if (handler != NULL) {\n        assertion_handler = handler;\n        assertion_userdata = userdata;\n    } else {\n        assertion_handler = SDL_PromptAssertion;\n        assertion_userdata = NULL;\n    }\n}\n\nconst SDL_assert_data *SDL_GetAssertionReport(void)\n{\n    return triggered_assertions;\n}\n\nvoid SDL_ResetAssertionReport(void)\n{\n    SDL_assert_data *next = NULL;\n    SDL_assert_data *item;\n    for (item = triggered_assertions; item != NULL; item = next) {\n        next = (SDL_assert_data *) item->next;\n        item->always_ignore = SDL_FALSE;\n        item->trigger_count = 0;\n        item->next = NULL;\n    }\n\n    triggered_assertions = NULL;\n}\n\nSDL_AssertionHandler SDL_GetDefaultAssertionHandler(void)\n{\n    return SDL_PromptAssertion;\n}\n\nSDL_AssertionHandler SDL_GetAssertionHandler(void **userdata)\n{\n    if (userdata != NULL) {\n        *userdata = assertion_userdata;\n    }\n    return assertion_handler;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/SDL_assert_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\nextern void SDL_AssertionsQuit(void);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/SDL_error.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"./SDL_internal.h\"\n\n/* Simple error handling in SDL */\n\n#include \"SDL_log.h\"\n#include \"SDL_error.h\"\n#include \"SDL_error_c.h\"\n\n\n/* Routine to get the thread-specific error variable */\n#if SDL_THREADS_DISABLED\n/* The default (non-thread-safe) global error variable */\nstatic SDL_error SDL_global_error;\n#define SDL_GetErrBuf() (&SDL_global_error)\n#else\nextern SDL_error *SDL_GetErrBuf(void);\n#endif /* SDL_THREADS_DISABLED */\n\n#define SDL_ERRBUFIZE   1024\n\n/* Private functions */\n\nstatic const char *\nSDL_LookupString(const char *key)\n{\n    /* FIXME: Add code to lookup key in language string hash-table */\n    return key;\n}\n\n/* Public functions */\n\nint\nSDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n    SDL_error *error;\n\n    /* Ignore call if invalid format pointer was passed */\n    if (fmt == NULL) return -1;\n\n    /* Copy in the key, mark error as valid */\n    error = SDL_GetErrBuf();\n    error->error = 1;\n    SDL_strlcpy((char *) error->key, fmt, sizeof(error->key));\n\n    va_start(ap, fmt);\n    error->argc = 0;\n    while (*fmt) {\n        if (*fmt++ == '%') {\n            while (*fmt == '.' || (*fmt >= '0' && *fmt <= '9')) {\n                ++fmt;\n            }\n            switch (*fmt++) {\n            case 0:            /* Malformed format string.. */\n                --fmt;\n                break;\n            case 'c':\n            case 'i':\n            case 'd':\n            case 'u':\n            case 'o':\n            case 'x':\n            case 'X':\n                error->args[error->argc++].value_i = va_arg(ap, int);\n                break;\n            case 'f':\n                error->args[error->argc++].value_f = va_arg(ap, double);\n                break;\n            case 'p':\n                error->args[error->argc++].value_ptr = va_arg(ap, void *);\n                break;\n            case 's':\n                {\n                    int i = error->argc;\n                    const char *str = va_arg(ap, const char *);\n                    if (str == NULL)\n                        str = \"(null)\";\n                    SDL_strlcpy((char *) error->args[i].buf, str,\n                                ERR_MAX_STRLEN);\n                    error->argc++;\n                }\n                break;\n            default:\n                break;\n            }\n            if (error->argc >= ERR_MAX_ARGS) {\n                break;\n            }\n        }\n    }\n    va_end(ap);\n\n    /* If we are in debug mode, print out an error message */\n    SDL_LogDebug(SDL_LOG_CATEGORY_ERROR, \"%s\", SDL_GetError());\n\n    return -1;\n}\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wformat-nonliteral\"\n#endif\n/* This function has a bit more overhead than most error functions\n   so that it supports internationalization and thread-safe errors.\n*/\nstatic char *\nSDL_GetErrorMsg(char *errstr, int maxlen)\n{\n    SDL_error *error;\n\n    /* Clear the error string */\n    *errstr = '\\0';\n    --maxlen;\n\n    /* Get the thread-safe error, and print it out */\n    error = SDL_GetErrBuf();\n    if (error->error) {\n        const char *fmt;\n        char *msg = errstr;\n        int len;\n        int argi;\n\n        fmt = SDL_LookupString(error->key);\n        argi = 0;\n        while (*fmt && (maxlen > 0)) {\n            if (*fmt == '%') {\n                char tmp[32], *spot = tmp;\n                *spot++ = *fmt++;\n                while ((*fmt == '.' || (*fmt >= '0' && *fmt <= '9'))\n                       && spot < (tmp + SDL_arraysize(tmp) - 2)) {\n                    *spot++ = *fmt++;\n                }\n                *spot++ = *fmt++;\n                *spot++ = '\\0';\n                switch (spot[-2]) {\n                case '%':\n                    *msg++ = '%';\n                    maxlen -= 1;\n                    break;\n                case 'c':\n                case 'i':\n                case 'd':\n                case 'u':\n                case 'o':\n                case 'x':\n                case 'X':\n                    len =\n                        SDL_snprintf(msg, maxlen, tmp,\n                                     error->args[argi++].value_i);\n                    if (len > 0) {\n                        msg += len;\n                        maxlen -= len;\n                    }\n                    break;\n\n                case 'f':\n                    len =\n                        SDL_snprintf(msg, maxlen, tmp,\n                                     error->args[argi++].value_f);\n                    if (len > 0) {\n                        msg += len;\n                        maxlen -= len;\n                    }\n                    break;\n\n                case 'p':\n                    len =\n                        SDL_snprintf(msg, maxlen, tmp,\n                                     error->args[argi++].value_ptr);\n                    if (len > 0) {\n                        msg += len;\n                        maxlen -= len;\n                    }\n                    break;\n\n                case 's':\n                    len =\n                        SDL_snprintf(msg, maxlen, tmp,\n                                     SDL_LookupString(error->args[argi++].\n                                                      buf));\n                    if (len > 0) {\n                        msg += len;\n                        maxlen -= len;\n                    }\n                    break;\n\n                }\n            } else {\n                *msg++ = *fmt++;\n                maxlen -= 1;\n            }\n        }\n\n        /* slide back if we've overshot the end of our buffer. */\n        if (maxlen < 0) {\n            msg -= (-maxlen) + 1;\n        }\n\n        *msg = 0;               /* NULL terminate the string */\n    }\n    return (errstr);\n}\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n/* Available for backwards compatibility */\nconst char *\nSDL_GetError(void)\n{\n    static char errmsg[SDL_ERRBUFIZE];\n\n    return SDL_GetErrorMsg(errmsg, SDL_ERRBUFIZE);\n}\n\nvoid\nSDL_ClearError(void)\n{\n    SDL_error *error;\n\n    error = SDL_GetErrBuf();\n    error->error = 0;\n}\n\n/* Very common errors go here */\nint\nSDL_Error(SDL_errorcode code)\n{\n    switch (code) {\n    case SDL_ENOMEM:\n        return SDL_SetError(\"Out of memory\");\n    case SDL_EFREAD:\n        return SDL_SetError(\"Error reading from datastream\");\n    case SDL_EFWRITE:\n        return SDL_SetError(\"Error writing to datastream\");\n    case SDL_EFSEEK:\n        return SDL_SetError(\"Error seeking in datastream\");\n    case SDL_UNSUPPORTED:\n        return SDL_SetError(\"That operation is not supported\");\n    default:\n        return SDL_SetError(\"Unknown SDL error\");\n    }\n}\n\n#ifdef TEST_ERROR\nint\nmain(int argc, char *argv[])\n{\n    char buffer[BUFSIZ + 1];\n\n    SDL_SetError(\"Hi there!\");\n    printf(\"Error 1: %s\\n\", SDL_GetError());\n    SDL_ClearError();\n    SDL_memset(buffer, '1', BUFSIZ);\n    buffer[BUFSIZ] = 0;\n    SDL_SetError(\"This is the error: %s (%f)\", buffer, 1.0);\n    printf(\"Error 2: %s\\n\", SDL_GetError());\n    exit(0);\n}\n#endif\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/SDL_error_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"./SDL_internal.h\"\n\n/* This file defines a structure that carries language-independent\n   error messages\n*/\n\n#ifndef _SDL_error_c_h\n#define _SDL_error_c_h\n\n#define ERR_MAX_STRLEN  128\n#define ERR_MAX_ARGS    5\n\ntypedef struct SDL_error\n{\n    /* This is a numeric value corresponding to the current error */\n    int error;\n\n    /* This is a key used to index into a language hashtable containing\n       internationalized versions of the SDL error messages.  If the key\n       is not in the hashtable, or no hashtable is available, the key is\n       used directly as an error message format string.\n     */\n    char key[ERR_MAX_STRLEN];\n\n    /* These are the arguments for the error functions */\n    int argc;\n    union\n    {\n        void *value_ptr;\n#if 0                           /* What is a character anyway?  (UNICODE issues) */\n        unsigned char value_c;\n#endif\n        int value_i;\n        double value_f;\n        char buf[ERR_MAX_STRLEN];\n    } args[ERR_MAX_ARGS];\n} SDL_error;\n\n/* Defined in SDL_thread.c */\nextern SDL_error *SDL_GetErrBuf(void);\n\n#endif /* _SDL_error_c_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/SDL_hints.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"./SDL_internal.h\"\n\n#include \"SDL_hints.h\"\n#include \"SDL_error.h\"\n\n\n/* Assuming there aren't many hints set and they aren't being queried in\n   critical performance paths, we'll just use linked lists here.\n */\ntypedef struct SDL_HintWatch {\n    SDL_HintCallback callback;\n    void *userdata;\n    struct SDL_HintWatch *next;\n} SDL_HintWatch;\n\ntypedef struct SDL_Hint {\n    char *name;\n    char *value;\n    SDL_HintPriority priority;\n    SDL_HintWatch *callbacks;\n    struct SDL_Hint *next;\n} SDL_Hint;\n\nstatic SDL_Hint *SDL_hints;\n\nSDL_bool\nSDL_SetHintWithPriority(const char *name, const char *value,\n                        SDL_HintPriority priority)\n{\n    const char *env;\n    SDL_Hint *hint;\n    SDL_HintWatch *entry;\n\n    if (!name || !value) {\n        return SDL_FALSE;\n    }\n\n    env = SDL_getenv(name);\n    if (env && priority < SDL_HINT_OVERRIDE) {\n        return SDL_FALSE;\n    }\n\n    for (hint = SDL_hints; hint; hint = hint->next) {\n        if (SDL_strcmp(name, hint->name) == 0) {\n            if (priority < hint->priority) {\n                return SDL_FALSE;\n            }\n            if (!hint->value || !value || SDL_strcmp(hint->value, value) != 0) {\n                for (entry = hint->callbacks; entry; ) {\n                    /* Save the next entry in case this one is deleted */\n                    SDL_HintWatch *next = entry->next;\n                    entry->callback(entry->userdata, name, hint->value, value);\n                    entry = next;\n                }\n                SDL_free(hint->value);\n                hint->value = value ? SDL_strdup(value) : NULL;\n            }\n            hint->priority = priority;\n            return SDL_TRUE;\n        }\n    }\n\n    /* Couldn't find the hint, add a new one */\n    hint = (SDL_Hint *)SDL_malloc(sizeof(*hint));\n    if (!hint) {\n        return SDL_FALSE;\n    }\n    hint->name = SDL_strdup(name);\n    hint->value = value ? SDL_strdup(value) : NULL;\n    hint->priority = priority;\n    hint->callbacks = NULL;\n    hint->next = SDL_hints;\n    SDL_hints = hint;\n    return SDL_TRUE;\n}\n\nSDL_bool\nSDL_SetHint(const char *name, const char *value)\n{\n    return SDL_SetHintWithPriority(name, value, SDL_HINT_NORMAL);\n}\n\nconst char *\nSDL_GetHint(const char *name)\n{\n    const char *env;\n    SDL_Hint *hint;\n\n    env = SDL_getenv(name);\n    for (hint = SDL_hints; hint; hint = hint->next) {\n        if (SDL_strcmp(name, hint->name) == 0) {\n            if (!env || hint->priority == SDL_HINT_OVERRIDE) {\n                return hint->value;\n            }\n            break;\n        }\n    }\n    return env;\n}\n\nSDL_bool\nSDL_GetHintBoolean(const char *name, SDL_bool default_value)\n{\n    const char *hint = SDL_GetHint(name);\n    if (!hint) {\n        return default_value;\n    }\n    if (*hint == '0' || SDL_strcasecmp(hint, \"false\") == 0) {\n        return SDL_FALSE;\n    }\n    return SDL_TRUE;\n}\n\nvoid\nSDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata)\n{\n    SDL_Hint *hint;\n    SDL_HintWatch *entry;\n    const char *value;\n\n    if (!name || !*name) {\n        SDL_InvalidParamError(\"name\");\n        return;\n    }\n    if (!callback) {\n        SDL_InvalidParamError(\"callback\");\n        return;\n    }\n\n    SDL_DelHintCallback(name, callback, userdata);\n\n    entry = (SDL_HintWatch *)SDL_malloc(sizeof(*entry));\n    if (!entry) {\n        SDL_OutOfMemory();\n        return;\n    }\n    entry->callback = callback;\n    entry->userdata = userdata;\n\n    for (hint = SDL_hints; hint; hint = hint->next) {\n        if (SDL_strcmp(name, hint->name) == 0) {\n            break;\n        }\n    }\n    if (!hint) {\n        /* Need to add a hint entry for this watcher */\n        hint = (SDL_Hint *)SDL_malloc(sizeof(*hint));\n        if (!hint) {\n            SDL_OutOfMemory();\n            SDL_free(entry);\n            return;\n        }\n        hint->name = SDL_strdup(name);\n        hint->value = NULL;\n        hint->priority = SDL_HINT_DEFAULT;\n        hint->callbacks = NULL;\n        hint->next = SDL_hints;\n        SDL_hints = hint;\n    }\n\n    /* Add it to the callbacks for this hint */\n    entry->next = hint->callbacks;\n    hint->callbacks = entry;\n\n    /* Now call it with the current value */\n    value = SDL_GetHint(name);\n    callback(userdata, name, value, value);\n}\n\nvoid\nSDL_DelHintCallback(const char *name, SDL_HintCallback callback, void *userdata)\n{\n    SDL_Hint *hint;\n    SDL_HintWatch *entry, *prev;\n\n    for (hint = SDL_hints; hint; hint = hint->next) {\n        if (SDL_strcmp(name, hint->name) == 0) {\n            prev = NULL;\n            for (entry = hint->callbacks; entry; entry = entry->next) {\n                if (callback == entry->callback && userdata == entry->userdata) {\n                    if (prev) {\n                        prev->next = entry->next;\n                    } else {\n                        hint->callbacks = entry->next;\n                    }\n                    SDL_free(entry);\n                    break;\n                }\n                prev = entry;\n            }\n            return;\n        }\n    }\n}\n\nvoid SDL_ClearHints(void)\n{\n    SDL_Hint *hint;\n    SDL_HintWatch *entry;\n\n    while (SDL_hints) {\n        hint = SDL_hints;\n        SDL_hints = hint->next;\n\n        SDL_free(hint->name);\n        SDL_free(hint->value);\n        for (entry = hint->callbacks; entry; ) {\n            SDL_HintWatch *freeable = entry;\n            entry = entry->next;\n            SDL_free(freeable);\n        }\n        SDL_free(hint);\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/SDL_internal.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#ifndef _SDL_internal_h\n#define _SDL_internal_h\n\n#include \"dynapi/SDL_dynapi.h\"\n\n#if SDL_DYNAMIC_API\n#include \"dynapi/SDL_dynapi_overrides.h\"\n/* force DECLSPEC and SDLCALL off...it's all internal symbols now.\n   These will have actual #defines during SDL_dynapi.c only */\n#define DECLSPEC\n#define SDLCALL\n#endif\n\n#include \"SDL_config.h\"\n\n#endif\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/SDL_log.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"./SDL_internal.h\"\n\n#if defined(__WIN32__) || defined(__WINRT__)\n#include \"core/windows/SDL_windows.h\"\n#endif\n\n/* Simple log messages in SDL */\n\n#include \"SDL_error.h\"\n#include \"SDL_log.h\"\n\n#if HAVE_STDIO_H\n#include <stdio.h>\n#endif\n\n#if defined(__ANDROID__)\n#include <android/log.h>\n#endif\n\n#define DEFAULT_PRIORITY                SDL_LOG_PRIORITY_CRITICAL\n#define DEFAULT_ASSERT_PRIORITY         SDL_LOG_PRIORITY_WARN\n#define DEFAULT_APPLICATION_PRIORITY    SDL_LOG_PRIORITY_INFO\n#define DEFAULT_TEST_PRIORITY           SDL_LOG_PRIORITY_VERBOSE\n\ntypedef struct SDL_LogLevel\n{\n    int category;\n    SDL_LogPriority priority;\n    struct SDL_LogLevel *next;\n} SDL_LogLevel;\n\n/* The default log output function */\nstatic void SDL_LogOutput(void *userdata,\n                          int category, SDL_LogPriority priority,\n                          const char *message);\n\nstatic SDL_LogLevel *SDL_loglevels;\nstatic SDL_LogPriority SDL_default_priority = DEFAULT_PRIORITY;\nstatic SDL_LogPriority SDL_assert_priority = DEFAULT_ASSERT_PRIORITY;\nstatic SDL_LogPriority SDL_application_priority = DEFAULT_APPLICATION_PRIORITY;\nstatic SDL_LogPriority SDL_test_priority = DEFAULT_TEST_PRIORITY;\nstatic SDL_LogOutputFunction SDL_log_function = SDL_LogOutput;\nstatic void *SDL_log_userdata = NULL;\n\nstatic const char *SDL_priority_prefixes[SDL_NUM_LOG_PRIORITIES] = {\n    NULL,\n    \"VERBOSE\",\n    \"DEBUG\",\n    \"INFO\",\n    \"WARN\",\n    \"ERROR\",\n    \"CRITICAL\"\n};\n\n#ifdef __ANDROID__\nstatic const char *SDL_category_prefixes[SDL_LOG_CATEGORY_RESERVED1] = {\n    \"APP\",\n    \"ERROR\",\n    \"SYSTEM\",\n    \"AUDIO\",\n    \"VIDEO\",\n    \"RENDER\",\n    \"INPUT\"\n};\n\nstatic int SDL_android_priority[SDL_NUM_LOG_PRIORITIES] = {\n    ANDROID_LOG_UNKNOWN,\n    ANDROID_LOG_VERBOSE,\n    ANDROID_LOG_DEBUG,\n    ANDROID_LOG_INFO,\n    ANDROID_LOG_WARN,\n    ANDROID_LOG_ERROR,\n    ANDROID_LOG_FATAL\n};\n#endif /* __ANDROID__ */\n\n\nvoid\nSDL_LogSetAllPriority(SDL_LogPriority priority)\n{\n    SDL_LogLevel *entry;\n\n    for (entry = SDL_loglevels; entry; entry = entry->next) {\n        entry->priority = priority;\n    }\n    SDL_default_priority = priority;\n    SDL_assert_priority = priority;\n    SDL_application_priority = priority;\n}\n\nvoid\nSDL_LogSetPriority(int category, SDL_LogPriority priority)\n{\n    SDL_LogLevel *entry;\n\n    for (entry = SDL_loglevels; entry; entry = entry->next) {\n        if (entry->category == category) {\n            entry->priority = priority;\n            return;\n        }\n    }\n\n    /* Create a new entry */\n    entry = (SDL_LogLevel *)SDL_malloc(sizeof(*entry));\n    if (entry) {\n        entry->category = category;\n        entry->priority = priority;\n        entry->next = SDL_loglevels;\n        SDL_loglevels = entry;\n    }\n}\n\nSDL_LogPriority\nSDL_LogGetPriority(int category)\n{\n    SDL_LogLevel *entry;\n\n    for (entry = SDL_loglevels; entry; entry = entry->next) {\n        if (entry->category == category) {\n            return entry->priority;\n        }\n    }\n\n    if (category == SDL_LOG_CATEGORY_TEST) {\n        return SDL_test_priority;\n    } else if (category == SDL_LOG_CATEGORY_APPLICATION) {\n        return SDL_application_priority;\n    } else if (category == SDL_LOG_CATEGORY_ASSERT) {\n        return SDL_assert_priority;\n    } else {\n        return SDL_default_priority;\n    }\n}\n\nvoid\nSDL_LogResetPriorities(void)\n{\n    SDL_LogLevel *entry;\n\n    while (SDL_loglevels) {\n        entry = SDL_loglevels;\n        SDL_loglevels = entry->next;\n        SDL_free(entry);\n    }\n\n    SDL_default_priority = DEFAULT_PRIORITY;\n    SDL_assert_priority = DEFAULT_ASSERT_PRIORITY;\n    SDL_application_priority = DEFAULT_APPLICATION_PRIORITY;\n    SDL_test_priority = DEFAULT_TEST_PRIORITY;\n}\n\nvoid\nSDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n\n    va_start(ap, fmt);\n    SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, fmt, ap);\n    va_end(ap);\n}\n\nvoid\nSDL_LogVerbose(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n\n    va_start(ap, fmt);\n    SDL_LogMessageV(category, SDL_LOG_PRIORITY_VERBOSE, fmt, ap);\n    va_end(ap);\n}\n\nvoid\nSDL_LogDebug(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n\n    va_start(ap, fmt);\n    SDL_LogMessageV(category, SDL_LOG_PRIORITY_DEBUG, fmt, ap);\n    va_end(ap);\n}\n\nvoid\nSDL_LogInfo(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n\n    va_start(ap, fmt);\n    SDL_LogMessageV(category, SDL_LOG_PRIORITY_INFO, fmt, ap);\n    va_end(ap);\n}\n\nvoid\nSDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n\n    va_start(ap, fmt);\n    SDL_LogMessageV(category, SDL_LOG_PRIORITY_WARN, fmt, ap);\n    va_end(ap);\n}\n\nvoid\nSDL_LogError(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n\n    va_start(ap, fmt);\n    SDL_LogMessageV(category, SDL_LOG_PRIORITY_ERROR, fmt, ap);\n    va_end(ap);\n}\n\nvoid\nSDL_LogCritical(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n\n    va_start(ap, fmt);\n    SDL_LogMessageV(category, SDL_LOG_PRIORITY_CRITICAL, fmt, ap);\n    va_end(ap);\n}\n\nvoid\nSDL_LogMessage(int category, SDL_LogPriority priority, SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n\n    va_start(ap, fmt);\n    SDL_LogMessageV(category, priority, fmt, ap);\n    va_end(ap);\n}\n\n#ifdef __ANDROID__\nstatic const char *\nGetCategoryPrefix(int category)\n{\n    if (category < SDL_LOG_CATEGORY_RESERVED1) {\n        return SDL_category_prefixes[category];\n    }\n    if (category < SDL_LOG_CATEGORY_CUSTOM) {\n        return \"RESERVED\";\n    }\n    return \"CUSTOM\";\n}\n#endif /* __ANDROID__ */\n\nvoid\nSDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list ap)\n{\n    char *message;\n    size_t len;\n\n    /* Nothing to do if we don't have an output function */\n    if (!SDL_log_function) {\n        return;\n    }\n\n    /* Make sure we don't exceed array bounds */\n    if ((int)priority < 0 || priority >= SDL_NUM_LOG_PRIORITIES) {\n        return;\n    }\n\n    /* See if we want to do anything with this message */\n    if (priority < SDL_LogGetPriority(category)) {\n        return;\n    }\n\n    message = SDL_stack_alloc(char, SDL_MAX_LOG_MESSAGE);\n    if (!message) {\n        return;\n    }\n\n    SDL_vsnprintf(message, SDL_MAX_LOG_MESSAGE, fmt, ap);\n\n    /* Chop off final endline. */\n    len = SDL_strlen(message);\n    if ((len > 0) && (message[len-1] == '\\n')) {\n        message[--len] = '\\0';\n        if ((len > 0) && (message[len-1] == '\\r')) {  /* catch \"\\r\\n\", too. */\n            message[--len] = '\\0';\n        }\n    }\n\n    SDL_log_function(SDL_log_userdata, category, priority, message);\n    SDL_stack_free(message);\n}\n\n#if defined(__WIN32__)\n/* Flag tracking the attachment of the console: 0=unattached, 1=attached, -1=error */\nstatic int consoleAttached = 0;\n\n/* Handle to stderr output of console. */\nstatic HANDLE stderrHandle = NULL;\n#endif\n\nstatic void\nSDL_LogOutput(void *userdata, int category, SDL_LogPriority priority,\n              const char *message)\n{\n#if defined(__WIN32__) || defined(__WINRT__)\n    /* Way too many allocations here, urgh */\n    /* Note: One can't call SDL_SetError here, since that function itself logs. */\n    {\n        char *output;\n        size_t length;\n        LPTSTR tstr;\n\n#if !defined(HAVE_STDIO_H) && !defined(__WINRT__)\n        BOOL attachResult;\n        DWORD attachError;\n        unsigned long charsWritten; \n\n        /* Maybe attach console and get stderr handle */\n        if (consoleAttached == 0) {\n            attachResult = AttachConsole(ATTACH_PARENT_PROCESS);\n            if (!attachResult) {\n                    attachError = GetLastError();\n                    if (attachError == ERROR_INVALID_HANDLE) {\n                        OutputDebugString(TEXT(\"Parent process has no console\\r\\n\"));\n                        consoleAttached = -1;\n                    } else if (attachError == ERROR_GEN_FAILURE) {\n                         OutputDebugString(TEXT(\"Could not attach to console of parent process\\r\\n\"));\n                         consoleAttached = -1;\n                    } else if (attachError == ERROR_ACCESS_DENIED) {  \n                         /* Already attached */\n                        consoleAttached = 1;\n                    } else {\n                        OutputDebugString(TEXT(\"Error attaching console\\r\\n\"));\n                        consoleAttached = -1;\n                    }\n                } else {\n                    /* Newly attached */\n                    consoleAttached = 1;\n                }\n\t\t\t\n                if (consoleAttached == 1) {\n                        stderrHandle = GetStdHandle(STD_ERROR_HANDLE);\n                }\n        }\n#endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) */\n\n        length = SDL_strlen(SDL_priority_prefixes[priority]) + 2 + SDL_strlen(message) + 1 + 1 + 1;\n        output = SDL_stack_alloc(char, length);\n        SDL_snprintf(output, length, \"%s: %s\\r\\n\", SDL_priority_prefixes[priority], message);\n        tstr = WIN_UTF8ToString(output);\n        \n        /* Output to debugger */\n        OutputDebugString(tstr);\n       \n#if !defined(HAVE_STDIO_H) && !defined(__WINRT__)\n        /* Screen output to stderr, if console was attached. */\n        if (consoleAttached == 1) {\n                if (!WriteConsole(stderrHandle, tstr, lstrlen(tstr), &charsWritten, NULL)) {\n                    OutputDebugString(TEXT(\"Error calling WriteConsole\\r\\n\"));\n                    if (GetLastError() == ERROR_NOT_ENOUGH_MEMORY) {\n                        OutputDebugString(TEXT(\"Insufficient heap memory to write message\\r\\n\"));\n                    }\n                }\n        }\n#endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) */\n\n        SDL_free(tstr);\n        SDL_stack_free(output);\n    }\n#elif defined(__ANDROID__)\n    {\n        char tag[32];\n\n        SDL_snprintf(tag, SDL_arraysize(tag), \"SDL/%s\", GetCategoryPrefix(category));\n        __android_log_write(SDL_android_priority[priority], tag, message);\n    }\n#elif defined(__APPLE__) && defined(SDL_VIDEO_DRIVER_COCOA)\n    /* Technically we don't need SDL_VIDEO_DRIVER_COCOA, but that's where this function is defined for now.\n    */\n    extern void SDL_NSLog(const char *text);\n    {\n        char *text;\n\n        text = SDL_stack_alloc(char, SDL_MAX_LOG_MESSAGE);\n        if (text) {\n            SDL_snprintf(text, SDL_MAX_LOG_MESSAGE, \"%s: %s\", SDL_priority_prefixes[priority], message);\n            SDL_NSLog(text);\n            SDL_stack_free(text);\n            return;\n        }\n    }\n#elif defined(__PSP__)\n    {\n        FILE*        pFile;\n        pFile = fopen (\"SDL_Log.txt\", \"a\");\n        fprintf(pFile, \"%s: %s\\n\", SDL_priority_prefixes[priority], message);\n        fclose (pFile);\n    }\n#endif\n#if HAVE_STDIO_H\n    fprintf(stderr, \"%s: %s\\n\", SDL_priority_prefixes[priority], message);\n#if __NACL__\n    fflush(stderr);\n#endif\n#endif\n}\n\nvoid\nSDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata)\n{\n    if (callback) {\n        *callback = SDL_log_function;\n    }\n    if (userdata) {\n        *userdata = SDL_log_userdata;\n    }\n}\n\nvoid\nSDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata)\n{\n    SDL_log_function = callback;\n    SDL_log_userdata = userdata;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/atomic/SDL_atomic.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_atomic.h\"\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1500)\n#include <intrin.h>\n#define HAVE_MSC_ATOMICS 1\n#endif\n\n#if defined(__MACOSX__)  /* !!! FIXME: should we favor gcc atomics? */\n#include <libkern/OSAtomic.h>\n#endif\n\n#if !defined(HAVE_GCC_ATOMICS) && defined(__SOLARIS__)\n#include <atomic.h>\n#endif\n\n/*\n  If any of the operations are not provided then we must emulate some\n  of them. That means we need a nice implementation of spin locks\n  that avoids the \"one big lock\" problem. We use a vector of spin\n  locks and pick which one to use based on the address of the operand\n  of the function.\n\n  To generate the index of the lock we first shift by 3 bits to get\n  rid on the zero bits that result from 32 and 64 bit allignment of\n  data. We then mask off all but 5 bits and use those 5 bits as an\n  index into the table.\n\n  Picking the lock this way insures that accesses to the same data at\n  the same time will go to the same lock. OTOH, accesses to different\n  data have only a 1/32 chance of hitting the same lock. That should\n  pretty much eliminate the chances of several atomic operations on\n  different data from waiting on the same \"big lock\". If it isn't\n  then the table of locks can be expanded to a new size so long as\n  the new size is a power of two.\n\n  Contributed by Bob Pendleton, bob@pendleton.com\n*/\n\n#if !defined(HAVE_MSC_ATOMICS) && !defined(HAVE_GCC_ATOMICS) && !defined(__MACOSX__) && !defined(__SOLARIS__)\n#define EMULATE_CAS 1\n#endif\n\n#if EMULATE_CAS\nstatic SDL_SpinLock locks[32];\n\nstatic SDL_INLINE void\nenterLock(void *a)\n{\n    uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f);\n\n    SDL_AtomicLock(&locks[index]);\n}\n\nstatic SDL_INLINE void\nleaveLock(void *a)\n{\n    uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f);\n\n    SDL_AtomicUnlock(&locks[index]);\n}\n#endif\n\n\nSDL_bool\nSDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval)\n{\n#ifdef HAVE_MSC_ATOMICS\n    return (_InterlockedCompareExchange((long*)&a->value, (long)newval, (long)oldval) == (long)oldval);\n#elif defined(__MACOSX__)  /* !!! FIXME: should we favor gcc atomics? */\n    return (SDL_bool) OSAtomicCompareAndSwap32Barrier(oldval, newval, &a->value);\n#elif defined(HAVE_GCC_ATOMICS)\n    return (SDL_bool) __sync_bool_compare_and_swap(&a->value, oldval, newval);\n#elif defined(__SOLARIS__) && defined(_LP64)\n    return (SDL_bool) ((int) atomic_cas_64((volatile uint64_t*)&a->value, (uint64_t)oldval, (uint64_t)newval) == oldval);\n#elif defined(__SOLARIS__) && !defined(_LP64)\n    return (SDL_bool) ((int) atomic_cas_32((volatile uint32_t*)&a->value, (uint32_t)oldval, (uint32_t)newval) == oldval);\n#elif EMULATE_CAS\n    SDL_bool retval = SDL_FALSE;\n\n    enterLock(a);\n    if (a->value == oldval) {\n        a->value = newval;\n        retval = SDL_TRUE;\n    }\n    leaveLock(a);\n\n    return retval;\n#else\n    #error Please define your platform.\n#endif\n}\n\nSDL_bool\nSDL_AtomicCASPtr(void **a, void *oldval, void *newval)\n{\n#if defined(HAVE_MSC_ATOMICS) && (_M_IX86)\n    return (_InterlockedCompareExchange((long*)a, (long)newval, (long)oldval) == (long)oldval);\n#elif defined(HAVE_MSC_ATOMICS) && (!_M_IX86)\n    return (_InterlockedCompareExchangePointer(a, newval, oldval) == oldval);\n#elif defined(__MACOSX__) && defined(__LP64__)   /* !!! FIXME: should we favor gcc atomics? */\n    return (SDL_bool) OSAtomicCompareAndSwap64Barrier((int64_t)oldval, (int64_t)newval, (int64_t*) a);\n#elif defined(__MACOSX__) && !defined(__LP64__)  /* !!! FIXME: should we favor gcc atomics? */\n    return (SDL_bool) OSAtomicCompareAndSwap32Barrier((int32_t)oldval, (int32_t)newval, (int32_t*) a);\n#elif defined(HAVE_GCC_ATOMICS)\n    return __sync_bool_compare_and_swap(a, oldval, newval);\n#elif defined(__SOLARIS__)\n    return (SDL_bool) (atomic_cas_ptr(a, oldval, newval) == oldval);\n#elif EMULATE_CAS\n    SDL_bool retval = SDL_FALSE;\n\n    enterLock(a);\n    if (*a == oldval) {\n        *a = newval;\n        retval = SDL_TRUE;\n    }\n    leaveLock(a);\n\n    return retval;\n#else\n    #error Please define your platform.\n#endif\n}\n\nint\nSDL_AtomicSet(SDL_atomic_t *a, int v)\n{\n#ifdef HAVE_MSC_ATOMICS\n    return _InterlockedExchange((long*)&a->value, v);\n#elif defined(HAVE_GCC_ATOMICS)\n    return __sync_lock_test_and_set(&a->value, v);\n#elif defined(__SOLARIS__) && defined(_LP64)\n    return (int) atomic_swap_64((volatile uint64_t*)&a->value, (uint64_t)v);\n#elif defined(__SOLARIS__) && !defined(_LP64)\n    return (int) atomic_swap_32((volatile uint32_t*)&a->value, (uint32_t)v);\n#else\n    int value;\n    do {\n        value = a->value;\n    } while (!SDL_AtomicCAS(a, value, v));\n    return value;\n#endif\n}\n\nvoid*\nSDL_AtomicSetPtr(void **a, void *v)\n{\n#if defined(HAVE_MSC_ATOMICS) && (_M_IX86)\n    return (void *) _InterlockedExchange((long *)a, (long) v);\n#elif defined(HAVE_MSC_ATOMICS) && (!_M_IX86)\n    return _InterlockedExchangePointer(a, v);\n#elif defined(HAVE_GCC_ATOMICS)\n    return __sync_lock_test_and_set(a, v);\n#elif defined(__SOLARIS__)\n    return atomic_swap_ptr(a, v);\n#else\n    void *value;\n    do {\n        value = *a;\n    } while (!SDL_AtomicCASPtr(a, value, v));\n    return value;\n#endif\n}\n\nint\nSDL_AtomicAdd(SDL_atomic_t *a, int v)\n{\n#ifdef HAVE_MSC_ATOMICS\n    return _InterlockedExchangeAdd((long*)&a->value, v);\n#elif defined(HAVE_GCC_ATOMICS)\n    return __sync_fetch_and_add(&a->value, v);\n#elif defined(__SOLARIS__)\n    int pv = a->value;\n    membar_consumer();\n#if defined(_LP64)\n    atomic_add_64((volatile uint64_t*)&a->value, v);\n#elif !defined(_LP64)\n    atomic_add_32((volatile uint32_t*)&a->value, v);\n#endif\n    return pv;\n#else\n    int value;\n    do {\n        value = a->value;\n    } while (!SDL_AtomicCAS(a, value, (value + v)));\n    return value;\n#endif\n}\n\nint\nSDL_AtomicGet(SDL_atomic_t *a)\n{\n    int value;\n    do {\n        value = a->value;\n    } while (!SDL_AtomicCAS(a, value, value));\n    return value;\n}\n\nvoid *\nSDL_AtomicGetPtr(void **a)\n{\n    void *value;\n    do {\n        value = *a;\n    } while (!SDL_AtomicCASPtr(a, value, value));\n    return value;\n}\n\n#ifdef __thumb__\n#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)\n__asm__(\n\"   .align 2\\n\"\n\"   .globl _SDL_MemoryBarrierRelease\\n\"\n\"   .globl _SDL_MemoryBarrierAcquire\\n\"\n\"_SDL_MemoryBarrierRelease:\\n\"\n\"_SDL_MemoryBarrierAcquire:\\n\"\n\"   mov r0, #0\\n\"\n\"   mcr p15, 0, r0, c7, c10, 5\\n\"\n\"   bx lr\\n\"\n);\n#endif\n#endif\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/atomic/SDL_spinlock.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#if defined(__WIN32__) || defined(__WINRT__)\n#include \"../core/windows/SDL_windows.h\"\n#endif\n\n#include \"SDL_atomic.h\"\n#include \"SDL_mutex.h\"\n#include \"SDL_timer.h\"\n\n#if !defined(HAVE_GCC_ATOMICS) && defined(__SOLARIS__)\n#include <atomic.h>\n#endif\n\n/* This function is where all the magic happens... */\nSDL_bool\nSDL_AtomicTryLock(SDL_SpinLock *lock)\n{\n#if SDL_ATOMIC_DISABLED\n    /* Terrible terrible damage */\n    static SDL_mutex *_spinlock_mutex;\n\n    if (!_spinlock_mutex) {\n        /* Race condition on first lock... */\n        _spinlock_mutex = SDL_CreateMutex();\n    }\n    SDL_LockMutex(_spinlock_mutex);\n    if (*lock == 0) {\n        *lock = 1;\n        SDL_UnlockMutex(_spinlock_mutex);\n        return SDL_TRUE;\n    } else {\n        SDL_UnlockMutex(_spinlock_mutex);\n        return SDL_FALSE;\n    }\n\n#elif defined(_MSC_VER)\n    SDL_COMPILE_TIME_ASSERT(locksize, sizeof(*lock) == sizeof(long));\n    return (InterlockedExchange((long*)lock, 1) == 0);\n\n#elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET\n    return (__sync_lock_test_and_set(lock, 1) == 0);\n\n#elif defined(__GNUC__) && defined(__arm__) && \\\n        (defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || \\\n         defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5TE__) || \\\n         defined(__ARM_ARCH_5TEJ__))\n    int result;\n    __asm__ __volatile__ (\n        \"swp %0, %1, [%2]\\n\"\n        : \"=&r,&r\" (result) : \"r,0\" (1), \"r,r\" (lock) : \"memory\");\n    return (result == 0);\n\n#elif defined(__GNUC__) && defined(__arm__)\n    int result;\n    __asm__ __volatile__ (\n        \"ldrex %0, [%2]\\nteq   %0, #0\\nstrexeq %0, %1, [%2]\"\n        : \"=&r\" (result) : \"r\" (1), \"r\" (lock) : \"cc\", \"memory\");\n    return (result == 0);\n\n#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))\n    int result;\n    __asm__ __volatile__(\n        \"lock ; xchgl %0, (%1)\\n\"\n        : \"=r\" (result) : \"r\" (lock), \"0\" (1) : \"cc\", \"memory\");\n    return (result == 0);\n\n#elif defined(__MACOSX__) || defined(__IPHONEOS__)\n    /* Maybe used for PowerPC, but the Intel asm or gcc atomics are favored. */\n    return OSAtomicCompareAndSwap32Barrier(0, 1, lock);\n\n#elif defined(__SOLARIS__) && defined(_LP64)\n    /* Used for Solaris with non-gcc compilers. */\n    return (SDL_bool) ((int) atomic_cas_64((volatile uint64_t*)lock, 0, 1) == 0);\n\n#elif defined(__SOLARIS__) && !defined(_LP64)\n    /* Used for Solaris with non-gcc compilers. */\n    return (SDL_bool) ((int) atomic_cas_32((volatile uint32_t*)lock, 0, 1) == 0);\n\n#else\n#error Please implement for your platform.\n    return SDL_FALSE;\n#endif\n}\n\nvoid\nSDL_AtomicLock(SDL_SpinLock *lock)\n{\n    /* FIXME: Should we have an eventual timeout? */\n    while (!SDL_AtomicTryLock(lock)) {\n        SDL_Delay(0);\n    }\n}\n\nvoid\nSDL_AtomicUnlock(SDL_SpinLock *lock)\n{\n#if defined(_MSC_VER)\n    _ReadWriteBarrier();\n    *lock = 0;\n\n#elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET\n    __sync_lock_release(lock);\n\n#elif defined(__SOLARIS__)\n    /* Used for Solaris when not using gcc. */\n    *lock = 0;\n    membar_producer();\n\n#else\n    *lock = 0;\n#endif\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_audio.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Allow access to a raw mixing buffer */\n\n#include \"SDL.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_audio_c.h\"\n#include \"SDL_sysaudio.h\"\n#include \"../thread/SDL_systhread.h\"\n\n#define _THIS SDL_AudioDevice *_this\n\nstatic SDL_AudioDriver current_audio;\nstatic SDL_AudioDevice *open_devices[16];\n\n/*\n * Not all of these will be compiled and linked in, but it's convenient\n *  to have a complete list here and saves yet-another block of #ifdefs...\n *  Please see bootstrap[], below, for the actual #ifdef mess.\n */\nextern AudioBootStrap PULSEAUDIO_bootstrap;\nextern AudioBootStrap ALSA_bootstrap;\nextern AudioBootStrap SNDIO_bootstrap;\nextern AudioBootStrap BSD_AUDIO_bootstrap;\nextern AudioBootStrap DSP_bootstrap;\nextern AudioBootStrap QSAAUDIO_bootstrap;\nextern AudioBootStrap SUNAUDIO_bootstrap;\nextern AudioBootStrap ARTS_bootstrap;\nextern AudioBootStrap ESD_bootstrap;\nextern AudioBootStrap NACLAUDIO_bootstrap;\nextern AudioBootStrap NAS_bootstrap;\nextern AudioBootStrap XAUDIO2_bootstrap;\nextern AudioBootStrap DSOUND_bootstrap;\nextern AudioBootStrap WINMM_bootstrap;\nextern AudioBootStrap PAUDIO_bootstrap;\nextern AudioBootStrap HAIKUAUDIO_bootstrap;\nextern AudioBootStrap COREAUDIO_bootstrap;\nextern AudioBootStrap DISKAUDIO_bootstrap;\nextern AudioBootStrap DUMMYAUDIO_bootstrap;\nextern AudioBootStrap FUSIONSOUND_bootstrap;\nextern AudioBootStrap ANDROIDAUDIO_bootstrap;\nextern AudioBootStrap PSPAUDIO_bootstrap;\nextern AudioBootStrap SNDIO_bootstrap;\nextern AudioBootStrap EMSCRIPTENAUDIO_bootstrap;\n\n/* Available audio drivers */\nstatic const AudioBootStrap *const bootstrap[] = {\n#if SDL_AUDIO_DRIVER_PULSEAUDIO\n    &PULSEAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_ALSA\n    &ALSA_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_SNDIO\n    &SNDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_BSD\n    &BSD_AUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_OSS\n    &DSP_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_QSA\n    &QSAAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_SUNAUDIO\n    &SUNAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_ARTS\n    &ARTS_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_ESD\n    &ESD_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_NACL\n    &NACLAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_NAS\n    &NAS_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_XAUDIO2\n    &XAUDIO2_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_DSOUND\n    &DSOUND_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_WINMM\n    &WINMM_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_PAUDIO\n    &PAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_HAIKU\n    &HAIKUAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_COREAUDIO\n    &COREAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_DISK\n    &DISKAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_DUMMY\n    &DUMMYAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_FUSIONSOUND\n    &FUSIONSOUND_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_ANDROID\n    &ANDROIDAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_PSP\n    &PSPAUDIO_bootstrap,\n#endif\n#if SDL_AUDIO_DRIVER_EMSCRIPTEN\n    &EMSCRIPTENAUDIO_bootstrap,\n#endif\n    NULL\n};\n\nstatic SDL_AudioDevice *\nget_audio_device(SDL_AudioDeviceID id)\n{\n    id--;\n    if ((id >= SDL_arraysize(open_devices)) || (open_devices[id] == NULL)) {\n        SDL_SetError(\"Invalid audio device ID\");\n        return NULL;\n    }\n\n    return open_devices[id];\n}\n\n\n/* stubs for audio drivers that don't need a specific entry point... */\nstatic void\nSDL_AudioDetectDevices_Default(void)\n{\n    /* you have to write your own implementation if these assertions fail. */\n    SDL_assert(current_audio.impl.OnlyHasDefaultOutputDevice);\n    SDL_assert(current_audio.impl.OnlyHasDefaultCaptureDevice || !current_audio.impl.HasCaptureSupport);\n\n    SDL_AddAudioDevice(SDL_FALSE, DEFAULT_OUTPUT_DEVNAME, (void *) ((size_t) 0x1));\n    if (current_audio.impl.HasCaptureSupport) {\n        SDL_AddAudioDevice(SDL_TRUE, DEFAULT_INPUT_DEVNAME, (void *) ((size_t) 0x2));\n    }\n}\n\nstatic void\nSDL_AudioThreadInit_Default(_THIS)\n{                               /* no-op. */\n}\n\nstatic void\nSDL_AudioWaitDevice_Default(_THIS)\n{                               /* no-op. */\n}\n\nstatic void\nSDL_AudioPlayDevice_Default(_THIS)\n{                               /* no-op. */\n}\n\nstatic int\nSDL_AudioGetPendingBytes_Default(_THIS)\n{\n    return 0;\n}\n\nstatic Uint8 *\nSDL_AudioGetDeviceBuf_Default(_THIS)\n{\n    return NULL;\n}\n\nstatic int\nSDL_AudioCaptureFromDevice_Default(_THIS, void *buffer, int buflen)\n{\n    return -1;  /* just fail immediately. */\n}\n\nstatic void\nSDL_AudioFlushCapture_Default(_THIS)\n{                               /* no-op. */\n}\n\nstatic void\nSDL_AudioPrepareToClose_Default(_THIS)\n{                               /* no-op. */\n}\n\nstatic void\nSDL_AudioCloseDevice_Default(_THIS)\n{                               /* no-op. */\n}\n\nstatic void\nSDL_AudioDeinitialize_Default(void)\n{                               /* no-op. */\n}\n\nstatic void\nSDL_AudioFreeDeviceHandle_Default(void *handle)\n{                               /* no-op. */\n}\n\n\nstatic int\nSDL_AudioOpenDevice_Default(_THIS, void *handle, const char *devname, int iscapture)\n{\n    return SDL_Unsupported();\n}\n\nstatic SDL_INLINE SDL_bool\nis_in_audio_device_thread(SDL_AudioDevice * device)\n{\n    /* The device thread locks the same mutex, but not through the public API.\n       This check is in case the application, in the audio callback,\n       tries to lock the thread that we've already locked from the\n       device thread...just in case we only have non-recursive mutexes. */\n    if (device->thread && (SDL_ThreadID() == device->threadid)) {\n        return SDL_TRUE;\n    }\n\n    return SDL_FALSE;\n}\n\nstatic void\nSDL_AudioLockDevice_Default(SDL_AudioDevice * device)\n{\n    if (!is_in_audio_device_thread(device)) {\n        SDL_LockMutex(device->mixer_lock);\n    }\n}\n\nstatic void\nSDL_AudioUnlockDevice_Default(SDL_AudioDevice * device)\n{\n    if (!is_in_audio_device_thread(device)) {\n        SDL_UnlockMutex(device->mixer_lock);\n    }\n}\n\nstatic void\nSDL_AudioLockOrUnlockDeviceWithNoMixerLock(SDL_AudioDevice * device)\n{\n}\n\nstatic void\nfinish_audio_entry_points_init(void)\n{\n    /*\n     * Fill in stub functions for unused driver entry points. This lets us\n     *  blindly call them without having to check for validity first.\n     */\n\n    if (current_audio.impl.SkipMixerLock) {\n        if (current_audio.impl.LockDevice == NULL) {\n            current_audio.impl.LockDevice = SDL_AudioLockOrUnlockDeviceWithNoMixerLock;\n        }\n        if (current_audio.impl.UnlockDevice == NULL) {\n            current_audio.impl.UnlockDevice = SDL_AudioLockOrUnlockDeviceWithNoMixerLock;\n        }\n    }\n\n#define FILL_STUB(x) \\\n        if (current_audio.impl.x == NULL) { \\\n            current_audio.impl.x = SDL_Audio##x##_Default; \\\n        }\n    FILL_STUB(DetectDevices);\n    FILL_STUB(OpenDevice);\n    FILL_STUB(ThreadInit);\n    FILL_STUB(WaitDevice);\n    FILL_STUB(PlayDevice);\n    FILL_STUB(GetPendingBytes);\n    FILL_STUB(GetDeviceBuf);\n    FILL_STUB(CaptureFromDevice);\n    FILL_STUB(FlushCapture);\n    FILL_STUB(PrepareToClose);\n    FILL_STUB(CloseDevice);\n    FILL_STUB(LockDevice);\n    FILL_STUB(UnlockDevice);\n    FILL_STUB(FreeDeviceHandle);\n    FILL_STUB(Deinitialize);\n#undef FILL_STUB\n}\n\n\n/* device hotplug support... */\n\nstatic int\nadd_audio_device(const char *name, void *handle, SDL_AudioDeviceItem **devices, int *devCount)\n{\n    int retval = -1;\n    const size_t size = sizeof (SDL_AudioDeviceItem) + SDL_strlen(name) + 1;\n    SDL_AudioDeviceItem *item = (SDL_AudioDeviceItem *) SDL_malloc(size);\n    if (item == NULL) {\n        return -1;\n    }\n\n    SDL_assert(handle != NULL);  /* we reserve NULL, audio backends can't use it. */\n\n    item->handle = handle;\n    SDL_strlcpy(item->name, name, size - sizeof (SDL_AudioDeviceItem));\n\n    SDL_LockMutex(current_audio.detectionLock);\n    item->next = *devices;\n    *devices = item;\n    retval = (*devCount)++;\n    SDL_UnlockMutex(current_audio.detectionLock);\n\n    return retval;\n}\n\nstatic SDL_INLINE int\nadd_capture_device(const char *name, void *handle)\n{\n    SDL_assert(current_audio.impl.HasCaptureSupport);\n    return add_audio_device(name, handle, &current_audio.inputDevices, &current_audio.inputDeviceCount);\n}\n\nstatic SDL_INLINE int\nadd_output_device(const char *name, void *handle)\n{\n    return add_audio_device(name, handle, &current_audio.outputDevices, &current_audio.outputDeviceCount);\n}\n\nstatic void\nfree_device_list(SDL_AudioDeviceItem **devices, int *devCount)\n{\n    SDL_AudioDeviceItem *item, *next;\n    for (item = *devices; item != NULL; item = next) {\n        next = item->next;\n        if (item->handle != NULL) {\n            current_audio.impl.FreeDeviceHandle(item->handle);\n        }\n        SDL_free(item);\n    }\n    *devices = NULL;\n    *devCount = 0;\n}\n\n\n/* The audio backends call this when a new device is plugged in. */\nvoid\nSDL_AddAudioDevice(const int iscapture, const char *name, void *handle)\n{\n    const int device_index = iscapture ? add_capture_device(name, handle) : add_output_device(name, handle);\n    if (device_index != -1) {\n        /* Post the event, if desired */\n        if (SDL_GetEventState(SDL_AUDIODEVICEADDED) == SDL_ENABLE) {\n            SDL_Event event;\n            SDL_zero(event);\n            event.adevice.type = SDL_AUDIODEVICEADDED;\n            event.adevice.which = device_index;\n            event.adevice.iscapture = iscapture;\n            SDL_PushEvent(&event);\n        }\n    }\n}\n\n/* The audio backends call this when a currently-opened device is lost. */\nvoid SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device)\n{\n    SDL_assert(get_audio_device(device->id) == device);\n\n    if (!SDL_AtomicGet(&device->enabled)) {\n        return;\n    }\n\n    /* Ends the audio callback and mark the device as STOPPED, but the\n       app still needs to close the device to free resources. */\n    current_audio.impl.LockDevice(device);\n    SDL_AtomicSet(&device->enabled, 0);\n    current_audio.impl.UnlockDevice(device);\n\n    /* Post the event, if desired */\n    if (SDL_GetEventState(SDL_AUDIODEVICEREMOVED) == SDL_ENABLE) {\n        SDL_Event event;\n        SDL_zero(event);\n        event.adevice.type = SDL_AUDIODEVICEREMOVED;\n        event.adevice.which = device->id;\n        event.adevice.iscapture = device->iscapture ? 1 : 0;\n        SDL_PushEvent(&event);\n    }\n}\n\nstatic void\nmark_device_removed(void *handle, SDL_AudioDeviceItem *devices, SDL_bool *removedFlag)\n{\n    SDL_AudioDeviceItem *item;\n    SDL_assert(handle != NULL);\n    for (item = devices; item != NULL; item = item->next) {\n        if (item->handle == handle) {\n            item->handle = NULL;\n            *removedFlag = SDL_TRUE;\n            return;\n        }\n    }\n}\n\n/* The audio backends call this when a device is removed from the system. */\nvoid\nSDL_RemoveAudioDevice(const int iscapture, void *handle)\n{\n    int device_index;\n    SDL_AudioDevice *device = NULL;\n\n    SDL_LockMutex(current_audio.detectionLock);\n    if (iscapture) {\n        mark_device_removed(handle, current_audio.inputDevices, &current_audio.captureDevicesRemoved);\n    } else {\n        mark_device_removed(handle, current_audio.outputDevices, &current_audio.outputDevicesRemoved);\n    }\n    for (device_index = 0; device_index < SDL_arraysize(open_devices); device_index++)\n    {\n        device = open_devices[device_index];\n        if (device != NULL && device->handle == handle)\n        {\n            SDL_OpenedAudioDeviceDisconnected(device);\n            break;\n        }\n    }\n    SDL_UnlockMutex(current_audio.detectionLock);\n\n    current_audio.impl.FreeDeviceHandle(handle);\n}\n\n\n\n/* buffer queueing support... */\n\n/* this expects that you managed thread safety elsewhere. */\nstatic void\nfree_audio_queue(SDL_AudioBufferQueue *packet)\n{\n    while (packet) {\n        SDL_AudioBufferQueue *next = packet->next;\n        SDL_free(packet);\n        packet = next;\n    }\n}\n\n/* NOTE: This assumes you'll hold the mixer lock before calling! */\nstatic int\nqueue_audio_to_device(SDL_AudioDevice *device, const Uint8 *data, Uint32 len)\n{\n    SDL_AudioBufferQueue *orighead;\n    SDL_AudioBufferQueue *origtail;\n    Uint32 origlen;\n    Uint32 datalen;\n\n    orighead = device->buffer_queue_head;\n    origtail = device->buffer_queue_tail;\n    origlen = origtail ? origtail->datalen : 0;\n\n    while (len > 0) {\n        SDL_AudioBufferQueue *packet = device->buffer_queue_tail;\n        SDL_assert(!packet || (packet->datalen <= SDL_AUDIOBUFFERQUEUE_PACKETLEN));\n        if (!packet || (packet->datalen >= SDL_AUDIOBUFFERQUEUE_PACKETLEN)) {\n            /* tail packet missing or completely full; we need a new packet. */\n            packet = device->buffer_queue_pool;\n            if (packet != NULL) {\n                /* we have one available in the pool. */\n                device->buffer_queue_pool = packet->next;\n            } else {\n                /* Have to allocate a new one! */\n                packet = (SDL_AudioBufferQueue *) SDL_malloc(sizeof (SDL_AudioBufferQueue));\n                if (packet == NULL) {\n                    /* uhoh, reset so we've queued nothing new, free what we can. */\n                    if (!origtail) {\n                        packet = device->buffer_queue_head;  /* whole queue. */\n                    } else {\n                        packet = origtail->next;  /* what we added to existing queue. */\n                        origtail->next = NULL;\n                        origtail->datalen = origlen;\n                    }\n                    device->buffer_queue_head = orighead;\n                    device->buffer_queue_tail = origtail;\n                    device->buffer_queue_pool = NULL;\n\n                    free_audio_queue(packet);  /* give back what we can. */\n\n                    return SDL_OutOfMemory();\n                }\n            }\n            packet->datalen = 0;\n            packet->startpos = 0;\n            packet->next = NULL;\n\n            SDL_assert((device->buffer_queue_head != NULL) == (device->queued_bytes != 0));\n            if (device->buffer_queue_tail == NULL) {\n                device->buffer_queue_head = packet;\n            } else {\n                device->buffer_queue_tail->next = packet;\n            }\n            device->buffer_queue_tail = packet;\n        }\n\n        datalen = SDL_min(len, SDL_AUDIOBUFFERQUEUE_PACKETLEN - packet->datalen);\n        SDL_memcpy(packet->data + packet->datalen, data, datalen);\n        data += datalen;\n        len -= datalen;\n        packet->datalen += datalen;\n        device->queued_bytes += datalen;\n    }\n\n    return 0;\n}\n\n/* NOTE: This assumes you'll hold the mixer lock before calling! */\nstatic Uint32\ndequeue_audio_from_device(SDL_AudioDevice *device, Uint8 *stream, Uint32 len)\n{\n    SDL_AudioBufferQueue *packet;\n    Uint8 *ptr = stream;\n\n    while ((len > 0) && ((packet = device->buffer_queue_head) != NULL)) {\n        const Uint32 avail = packet->datalen - packet->startpos;\n        const Uint32 cpy = SDL_min(len, avail);\n        SDL_assert(device->queued_bytes >= avail);\n\n        SDL_memcpy(ptr, packet->data + packet->startpos, cpy);\n        packet->startpos += cpy;\n        ptr += cpy;\n        device->queued_bytes -= cpy;\n        len -= cpy;\n\n        if (packet->startpos == packet->datalen) {  /* packet is done, put it in the pool. */\n            device->buffer_queue_head = packet->next;\n            SDL_assert((packet->next != NULL) || (packet == device->buffer_queue_tail));\n            packet->next = device->buffer_queue_pool;\n            device->buffer_queue_pool = packet;\n        }\n    }\n\n    SDL_assert((device->buffer_queue_head != NULL) == (device->queued_bytes != 0));\n\n    if (device->buffer_queue_head == NULL) {\n        device->buffer_queue_tail = NULL;  /* in case we drained the queue entirely. */\n    }\n\n    return (Uint32) (ptr - stream);\n}\n\nstatic void SDLCALL\nSDL_BufferQueueDrainCallback(void *userdata, Uint8 *stream, int len)\n{\n    /* this function always holds the mixer lock before being called. */\n    SDL_AudioDevice *device = (SDL_AudioDevice *) userdata;\n    Uint32 written;\n\n    SDL_assert(device != NULL);  /* this shouldn't ever happen, right?! */\n    SDL_assert(!device->iscapture);  /* this shouldn't ever happen, right?! */\n    SDL_assert(len >= 0);  /* this shouldn't ever happen, right?! */\n\n    written = dequeue_audio_from_device(device, stream, (Uint32) len);\n    stream += written;\n    len -= (int) written;\n\n    if (len > 0) {  /* fill any remaining space in the stream with silence. */\n        SDL_assert(device->buffer_queue_head == NULL);\n        SDL_memset(stream, device->spec.silence, len);\n    }\n}\n\nstatic void SDLCALL\nSDL_BufferQueueFillCallback(void *userdata, Uint8 *stream, int len)\n{\n    /* this function always holds the mixer lock before being called. */\n    SDL_AudioDevice *device = (SDL_AudioDevice *) userdata;\n\n    SDL_assert(device != NULL);  /* this shouldn't ever happen, right?! */\n    SDL_assert(device->iscapture);  /* this shouldn't ever happen, right?! */\n    SDL_assert(len >= 0);  /* this shouldn't ever happen, right?! */\n\n    /* note that if this needs to allocate more space and run out of memory,\n       we have no choice but to quietly drop the data and hope it works out\n       later, but you probably have bigger problems in this case anyhow. */\n    queue_audio_to_device(device, stream, (Uint32) len);\n}\n\nint\nSDL_QueueAudio(SDL_AudioDeviceID devid, const void *data, Uint32 len)\n{\n    SDL_AudioDevice *device = get_audio_device(devid);\n    int rc = 0;\n\n    if (!device) {\n        return -1;  /* get_audio_device() will have set the error state */\n    } else if (device->iscapture) {\n        return SDL_SetError(\"This is a capture device, queueing not allowed\");\n    } else if (device->spec.callback != SDL_BufferQueueDrainCallback) {\n        return SDL_SetError(\"Audio device has a callback, queueing not allowed\");\n    }\n\n    if (len > 0) {\n        current_audio.impl.LockDevice(device);\n        rc = queue_audio_to_device(device, data, len);\n        current_audio.impl.UnlockDevice(device);\n    }\n\n    return rc;\n}\n\nUint32\nSDL_DequeueAudio(SDL_AudioDeviceID devid, void *data, Uint32 len)\n{\n    SDL_AudioDevice *device = get_audio_device(devid);\n    Uint32 rc;\n\n    if ( (len == 0) ||  /* nothing to do? */\n         (!device) ||  /* called with bogus device id */\n         (!device->iscapture) ||  /* playback devices can't dequeue */\n         (device->spec.callback != SDL_BufferQueueFillCallback) ) { /* not set for queueing */\n        return 0;  /* just report zero bytes dequeued. */\n    }\n\n    current_audio.impl.LockDevice(device);\n    rc = dequeue_audio_from_device(device, data, len);\n    current_audio.impl.UnlockDevice(device);\n    return rc;\n}\n\nUint32\nSDL_GetQueuedAudioSize(SDL_AudioDeviceID devid)\n{\n    Uint32 retval = 0;\n    SDL_AudioDevice *device = get_audio_device(devid);\n\n    if (!device) {\n        return 0;\n    }\n\n    /* Nothing to do unless we're set up for queueing. */\n    if (device->spec.callback == SDL_BufferQueueDrainCallback) {\n        current_audio.impl.LockDevice(device);\n        retval = device->queued_bytes + current_audio.impl.GetPendingBytes(device);\n        current_audio.impl.UnlockDevice(device);\n    } else if (device->spec.callback == SDL_BufferQueueFillCallback) {\n        current_audio.impl.LockDevice(device);\n        retval = device->queued_bytes;\n        current_audio.impl.UnlockDevice(device);\n    }\n\n    return retval;\n}\n\nvoid\nSDL_ClearQueuedAudio(SDL_AudioDeviceID devid)\n{\n    SDL_AudioDevice *device = get_audio_device(devid);\n    SDL_AudioBufferQueue *packet;\n\n    if (!device) {\n        return;  /* nothing to do. */\n    }\n\n    /* Blank out the device and release the mutex. Free it afterwards. */\n    current_audio.impl.LockDevice(device);\n\n    /* merge the available pool and the current queue into one list. */\n    packet = device->buffer_queue_head;\n    if (packet) {\n        device->buffer_queue_tail->next = device->buffer_queue_pool;\n    } else {\n        packet = device->buffer_queue_pool;\n    }\n\n    /* Remove the queued packets from the device. */\n    device->buffer_queue_tail = NULL;\n    device->buffer_queue_head = NULL;\n    device->queued_bytes = 0;\n    device->buffer_queue_pool = packet;\n\n    /* Keep up to two packets in the pool to reduce future malloc pressure. */\n    if (packet) {\n        if (!packet->next) {\n            packet = NULL;  /* one packet (the only one) for the pool. */\n        } else {\n            SDL_AudioBufferQueue *next = packet->next->next;\n            packet->next->next = NULL;  /* two packets for the pool. */\n            packet = next;  /* rest will be freed. */\n        }\n    }\n\n    current_audio.impl.UnlockDevice(device);\n\n    /* free any extra packets we didn't keep in the pool. */\n    free_audio_queue(packet);\n}\n\n\n/* The general mixing thread function */\nstatic int SDLCALL\nSDL_RunAudio(void *devicep)\n{\n    SDL_AudioDevice *device = (SDL_AudioDevice *) devicep;\n    const int silence = (int) device->spec.silence;\n    const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq);\n    const int stream_len = (device->convert.needed) ? device->convert.len : device->spec.size;\n    Uint8 *stream;\n    void *udata = device->spec.userdata;\n    void (SDLCALL *callback) (void *, Uint8 *, int) = device->spec.callback;\n\n    SDL_assert(!device->iscapture);\n\n    /* The audio mixing is always a high priority thread */\n    SDL_SetThreadPriority(SDL_THREAD_PRIORITY_HIGH);\n\n    /* Perform any thread setup */\n    device->threadid = SDL_ThreadID();\n    current_audio.impl.ThreadInit(device);\n\n    /* Loop, filling the audio buffers */\n    while (!SDL_AtomicGet(&device->shutdown)) {\n        /* Fill the current buffer with sound */\n        if (device->convert.needed) {\n            stream = device->convert.buf;\n        } else if (SDL_AtomicGet(&device->enabled)) {\n            stream = current_audio.impl.GetDeviceBuf(device);\n        } else {\n            /* if the device isn't enabled, we still write to the\n               fake_stream, so the app's callback will fire with\n               a regular frequency, in case they depend on that\n               for timing or progress. They can use hotplug\n               now to know if the device failed. */\n            stream = NULL;\n        }\n\n        if (stream == NULL) {\n            stream = device->fake_stream;\n        }\n\n        /* !!! FIXME: this should be LockDevice. */\n        if ( SDL_AtomicGet(&device->enabled) ) {\n            SDL_LockMutex(device->mixer_lock);\n            if (SDL_AtomicGet(&device->paused)) {\n                SDL_memset(stream, silence, stream_len);\n            } else {\n                (*callback) (udata, stream, stream_len);\n            }\n            SDL_UnlockMutex(device->mixer_lock);\n        }\n\n        /* Convert the audio if necessary */\n        if (device->convert.needed && SDL_AtomicGet(&device->enabled)) {\n            SDL_ConvertAudio(&device->convert);\n            stream = current_audio.impl.GetDeviceBuf(device);\n            if (stream == NULL) {\n                stream = device->fake_stream;\n            } else {\n                SDL_memcpy(stream, device->convert.buf,\n                           device->convert.len_cvt);\n            }\n        }\n\n        /* Ready current buffer for play and change current buffer */\n        if (stream == device->fake_stream) {\n            SDL_Delay(delay);\n        } else {\n            current_audio.impl.PlayDevice(device);\n            current_audio.impl.WaitDevice(device);\n        }\n    }\n\n    current_audio.impl.PrepareToClose(device);\n\n    /* Wait for the audio to drain. */\n    SDL_Delay(((device->spec.samples * 1000) / device->spec.freq) * 2);\n\n    return 0;\n}\n\n/* The general capture thread function */\nstatic int SDLCALL\nSDL_CaptureAudio(void *devicep)\n{\n    SDL_AudioDevice *device = (SDL_AudioDevice *) devicep;\n    const int silence = (int) device->spec.silence;\n    const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq);\n    const int stream_len = (device->convert.needed) ? device->convert.len : device->spec.size;\n    Uint8 *stream;\n    void *udata = device->spec.userdata;\n    void (SDLCALL *callback) (void *, Uint8 *, int) = device->spec.callback;\n\n    SDL_assert(device->iscapture);\n\n    /* The audio mixing is always a high priority thread */\n    SDL_SetThreadPriority(SDL_THREAD_PRIORITY_HIGH);\n\n    /* Perform any thread setup */\n    device->threadid = SDL_ThreadID();\n    current_audio.impl.ThreadInit(device);\n\n    /* Loop, filling the audio buffers */\n    while (!SDL_AtomicGet(&device->shutdown)) {\n        int still_need;\n        Uint8 *ptr;\n\n        if (!SDL_AtomicGet(&device->enabled) || SDL_AtomicGet(&device->paused)) {\n            SDL_Delay(delay);  /* just so we don't cook the CPU. */\n            current_audio.impl.FlushCapture(device);  /* dump anything pending. */\n            continue;\n        }\n\n        /* Fill the current buffer with sound */\n        still_need = stream_len;\n        if (device->convert.needed) {\n            ptr = stream = device->convert.buf;\n        } else {\n            /* just use the \"fake\" stream to hold data read from the device. */\n            ptr = stream = device->fake_stream;\n        }\n\n        /* We still read from the device when \"paused\" to keep the state sane,\n           and block when there isn't data so this thread isn't eating CPU.\n           But we don't process it further or call the app's callback. */\n\n        while (still_need > 0) {\n            const int rc = current_audio.impl.CaptureFromDevice(device, ptr, still_need);\n            SDL_assert(rc <= still_need);  /* device should not overflow buffer. :) */\n            if (rc > 0) {\n                still_need -= rc;\n                ptr += rc;\n            } else {  /* uhoh, device failed for some reason! */\n                SDL_OpenedAudioDeviceDisconnected(device);\n                break;\n            }\n        }\n\n        if (still_need > 0) {\n            /* Keep any data we already read, silence the rest. */\n            SDL_memset(ptr, silence, still_need);\n        }\n\n        if (device->convert.needed) {\n            SDL_ConvertAudio(&device->convert);\n        }\n\n        /* !!! FIXME: this should be LockDevice. */\n        SDL_LockMutex(device->mixer_lock);\n        if (SDL_AtomicGet(&device->paused)) {\n            current_audio.impl.FlushCapture(device);  /* one snuck in! */\n        } else {\n            (*callback)(udata, stream, stream_len);\n        }\n        SDL_UnlockMutex(device->mixer_lock);\n    }\n\n    current_audio.impl.FlushCapture(device);\n\n    return 0;\n}\n\n\nstatic SDL_AudioFormat\nSDL_ParseAudioFormat(const char *string)\n{\n#define CHECK_FMT_STRING(x) if (SDL_strcmp(string, #x) == 0) return AUDIO_##x\n    CHECK_FMT_STRING(U8);\n    CHECK_FMT_STRING(S8);\n    CHECK_FMT_STRING(U16LSB);\n    CHECK_FMT_STRING(S16LSB);\n    CHECK_FMT_STRING(U16MSB);\n    CHECK_FMT_STRING(S16MSB);\n    CHECK_FMT_STRING(U16SYS);\n    CHECK_FMT_STRING(S16SYS);\n    CHECK_FMT_STRING(U16);\n    CHECK_FMT_STRING(S16);\n    CHECK_FMT_STRING(S32LSB);\n    CHECK_FMT_STRING(S32MSB);\n    CHECK_FMT_STRING(S32SYS);\n    CHECK_FMT_STRING(S32);\n    CHECK_FMT_STRING(F32LSB);\n    CHECK_FMT_STRING(F32MSB);\n    CHECK_FMT_STRING(F32SYS);\n    CHECK_FMT_STRING(F32);\n#undef CHECK_FMT_STRING\n    return 0;\n}\n\nint\nSDL_GetNumAudioDrivers(void)\n{\n    return SDL_arraysize(bootstrap) - 1;\n}\n\nconst char *\nSDL_GetAudioDriver(int index)\n{\n    if (index >= 0 && index < SDL_GetNumAudioDrivers()) {\n        return bootstrap[index]->name;\n    }\n    return NULL;\n}\n\nint\nSDL_AudioInit(const char *driver_name)\n{\n    int i = 0;\n    int initialized = 0;\n    int tried_to_init = 0;\n\n    if (SDL_WasInit(SDL_INIT_AUDIO)) {\n        SDL_AudioQuit();        /* shutdown driver if already running. */\n    }\n\n    SDL_zero(current_audio);\n    SDL_zero(open_devices);\n\n    /* Select the proper audio driver */\n    if (driver_name == NULL) {\n        driver_name = SDL_getenv(\"SDL_AUDIODRIVER\");\n    }\n\n    for (i = 0; (!initialized) && (bootstrap[i]); ++i) {\n        /* make sure we should even try this driver before doing so... */\n        const AudioBootStrap *backend = bootstrap[i];\n        if ((driver_name && (SDL_strncasecmp(backend->name, driver_name, SDL_strlen(driver_name)) != 0)) ||\n            (!driver_name && backend->demand_only)) {\n            continue;\n        }\n\n        tried_to_init = 1;\n        SDL_zero(current_audio);\n        current_audio.name = backend->name;\n        current_audio.desc = backend->desc;\n        initialized = backend->init(&current_audio.impl);\n    }\n\n    if (!initialized) {\n        /* specific drivers will set the error message if they fail... */\n        if (!tried_to_init) {\n            if (driver_name) {\n                SDL_SetError(\"Audio target '%s' not available\", driver_name);\n            } else {\n                SDL_SetError(\"No available audio device\");\n            }\n        }\n\n        SDL_zero(current_audio);\n        return -1;            /* No driver was available, so fail. */\n    }\n\n    current_audio.detectionLock = SDL_CreateMutex();\n\n    finish_audio_entry_points_init();\n\n    /* Make sure we have a list of devices available at startup. */\n    current_audio.impl.DetectDevices();\n\n    return 0;\n}\n\n/*\n * Get the current audio driver name\n */\nconst char *\nSDL_GetCurrentAudioDriver()\n{\n    return current_audio.name;\n}\n\n/* Clean out devices that we've removed but had to keep around for stability. */\nstatic void\nclean_out_device_list(SDL_AudioDeviceItem **devices, int *devCount, SDL_bool *removedFlag)\n{\n    SDL_AudioDeviceItem *item = *devices;\n    SDL_AudioDeviceItem *prev = NULL;\n    int total = 0;\n\n    while (item) {\n        SDL_AudioDeviceItem *next = item->next;\n        if (item->handle != NULL) {\n            total++;\n            prev = item;\n        } else {\n            if (prev) {\n                prev->next = next;\n            } else {\n                *devices = next;\n            }\n            SDL_free(item);\n        }\n        item = next;\n    }\n\n    *devCount = total;\n    *removedFlag = SDL_FALSE;\n}\n\n\nint\nSDL_GetNumAudioDevices(int iscapture)\n{\n    int retval = 0;\n\n    if (!SDL_WasInit(SDL_INIT_AUDIO)) {\n        return -1;\n    }\n\n    SDL_LockMutex(current_audio.detectionLock);\n    if (iscapture && current_audio.captureDevicesRemoved) {\n        clean_out_device_list(&current_audio.inputDevices, &current_audio.inputDeviceCount, &current_audio.captureDevicesRemoved);\n    }\n\n    if (!iscapture && current_audio.outputDevicesRemoved) {\n        clean_out_device_list(&current_audio.outputDevices, &current_audio.outputDeviceCount, &current_audio.outputDevicesRemoved);\n        current_audio.outputDevicesRemoved = SDL_FALSE;\n    }\n\n    retval = iscapture ? current_audio.inputDeviceCount : current_audio.outputDeviceCount;\n    SDL_UnlockMutex(current_audio.detectionLock);\n\n    return retval;\n}\n\n\nconst char *\nSDL_GetAudioDeviceName(int index, int iscapture)\n{\n    const char *retval = NULL;\n\n    if (!SDL_WasInit(SDL_INIT_AUDIO)) {\n        SDL_SetError(\"Audio subsystem is not initialized\");\n        return NULL;\n    }\n\n    if ((iscapture) && (!current_audio.impl.HasCaptureSupport)) {\n        SDL_SetError(\"No capture support\");\n        return NULL;\n    }\n\n    if (index >= 0) {\n        SDL_AudioDeviceItem *item;\n        int i;\n\n        SDL_LockMutex(current_audio.detectionLock);\n        item = iscapture ? current_audio.inputDevices : current_audio.outputDevices;\n        i = iscapture ? current_audio.inputDeviceCount : current_audio.outputDeviceCount;\n        if (index < i) {\n            for (i--; i > index; i--, item = item->next) {\n                SDL_assert(item != NULL);\n            }\n            SDL_assert(item != NULL);\n            retval = item->name;\n        }\n        SDL_UnlockMutex(current_audio.detectionLock);\n    }\n\n    if (retval == NULL) {\n        SDL_SetError(\"No such device\");\n    }\n\n    return retval;\n}\n\n\nstatic void\nclose_audio_device(SDL_AudioDevice * device)\n{\n    if (!device) {\n        return;\n    }\n\n    if (device->id > 0) {\n        SDL_AudioDevice *opendev = open_devices[device->id - 1];\n        SDL_assert((opendev == device) || (opendev == NULL));\n        if (opendev == device) {\n            open_devices[device->id - 1] = NULL;\n        }\n    }\n\n    SDL_AtomicSet(&device->shutdown, 1);\n    SDL_AtomicSet(&device->enabled, 0);\n    if (device->thread != NULL) {\n        SDL_WaitThread(device->thread, NULL);\n    }\n    if (device->mixer_lock != NULL) {\n        SDL_DestroyMutex(device->mixer_lock);\n    }\n    SDL_free(device->fake_stream);\n    if (device->convert.needed) {\n        SDL_free(device->convert.buf);\n    }\n    if (device->hidden != NULL) {\n        current_audio.impl.CloseDevice(device);\n    }\n\n    free_audio_queue(device->buffer_queue_head);\n    free_audio_queue(device->buffer_queue_pool);\n\n    SDL_free(device);\n}\n\n\n/*\n * Sanity check desired AudioSpec for SDL_OpenAudio() in (orig).\n *  Fills in a sanitized copy in (prepared).\n *  Returns non-zero if okay, zero on fatal parameters in (orig).\n */\nstatic int\nprepare_audiospec(const SDL_AudioSpec * orig, SDL_AudioSpec * prepared)\n{\n    SDL_memcpy(prepared, orig, sizeof(SDL_AudioSpec));\n\n    if (orig->freq == 0) {\n        const char *env = SDL_getenv(\"SDL_AUDIO_FREQUENCY\");\n        if ((!env) || ((prepared->freq = SDL_atoi(env)) == 0)) {\n            prepared->freq = 22050;     /* a reasonable default */\n        }\n    }\n\n    if (orig->format == 0) {\n        const char *env = SDL_getenv(\"SDL_AUDIO_FORMAT\");\n        if ((!env) || ((prepared->format = SDL_ParseAudioFormat(env)) == 0)) {\n            prepared->format = AUDIO_S16;       /* a reasonable default */\n        }\n    }\n\n    switch (orig->channels) {\n    case 0:{\n            const char *env = SDL_getenv(\"SDL_AUDIO_CHANNELS\");\n            if ((!env) || ((prepared->channels = (Uint8) SDL_atoi(env)) == 0)) {\n                prepared->channels = 2; /* a reasonable default */\n            }\n            break;\n        }\n    case 1:                    /* Mono */\n    case 2:                    /* Stereo */\n    case 4:                    /* surround */\n    case 6:                    /* surround with center and lfe */\n        break;\n    default:\n        SDL_SetError(\"Unsupported number of audio channels.\");\n        return 0;\n    }\n\n    if (orig->samples == 0) {\n        const char *env = SDL_getenv(\"SDL_AUDIO_SAMPLES\");\n        if ((!env) || ((prepared->samples = (Uint16) SDL_atoi(env)) == 0)) {\n            /* Pick a default of ~46 ms at desired frequency */\n            /* !!! FIXME: remove this when the non-Po2 resampling is in. */\n            const int samples = (prepared->freq / 1000) * 46;\n            int power2 = 1;\n            while (power2 < samples) {\n                power2 *= 2;\n            }\n            prepared->samples = power2;\n        }\n    }\n\n    /* Calculate the silence and size of the audio specification */\n    SDL_CalculateAudioSpec(prepared);\n\n    return 1;\n}\n\nstatic SDL_AudioDeviceID\nopen_audio_device(const char *devname, int iscapture,\n                  const SDL_AudioSpec * desired, SDL_AudioSpec * obtained,\n                  int allowed_changes, int min_id)\n{\n    const SDL_bool is_internal_thread = (desired->callback != NULL);\n    SDL_AudioDeviceID id = 0;\n    SDL_AudioSpec _obtained;\n    SDL_AudioDevice *device;\n    SDL_bool build_cvt;\n    void *handle = NULL;\n    int i = 0;\n\n    if (!SDL_WasInit(SDL_INIT_AUDIO)) {\n        SDL_SetError(\"Audio subsystem is not initialized\");\n        return 0;\n    }\n\n    if ((iscapture) && (!current_audio.impl.HasCaptureSupport)) {\n        SDL_SetError(\"No capture support\");\n        return 0;\n    }\n\n    /* !!! FIXME: there is a race condition here if two devices open from two threads at once. */\n    /* Find an available device ID... */\n    for (id = min_id - 1; id < SDL_arraysize(open_devices); id++) {\n        if (open_devices[id] == NULL) {\n            break;\n        }\n    }\n\n    if (id == SDL_arraysize(open_devices)) {\n        SDL_SetError(\"Too many open audio devices\");\n        return 0;\n    }\n\n    if (!obtained) {\n        obtained = &_obtained;\n    }\n    if (!prepare_audiospec(desired, obtained)) {\n        return 0;\n    }\n\n    /* If app doesn't care about a specific device, let the user override. */\n    if (devname == NULL) {\n        devname = SDL_getenv(\"SDL_AUDIO_DEVICE_NAME\");\n    }\n\n    /*\n     * Catch device names at the high level for the simple case...\n     * This lets us have a basic \"device enumeration\" for systems that\n     *  don't have multiple devices, but makes sure the device name is\n     *  always NULL when it hits the low level.\n     *\n     * Also make sure that the simple case prevents multiple simultaneous\n     *  opens of the default system device.\n     */\n\n    if ((iscapture) && (current_audio.impl.OnlyHasDefaultCaptureDevice)) {\n        if ((devname) && (SDL_strcmp(devname, DEFAULT_INPUT_DEVNAME) != 0)) {\n            SDL_SetError(\"No such device\");\n            return 0;\n        }\n        devname = NULL;\n\n        for (i = 0; i < SDL_arraysize(open_devices); i++) {\n            if ((open_devices[i]) && (open_devices[i]->iscapture)) {\n                SDL_SetError(\"Audio device already open\");\n                return 0;\n            }\n        }\n    } else if ((!iscapture) && (current_audio.impl.OnlyHasDefaultOutputDevice)) {\n        if ((devname) && (SDL_strcmp(devname, DEFAULT_OUTPUT_DEVNAME) != 0)) {\n            SDL_SetError(\"No such device\");\n            return 0;\n        }\n        devname = NULL;\n\n        for (i = 0; i < SDL_arraysize(open_devices); i++) {\n            if ((open_devices[i]) && (!open_devices[i]->iscapture)) {\n                SDL_SetError(\"Audio device already open\");\n                return 0;\n            }\n        }\n    } else if (devname != NULL) {\n        /* if the app specifies an exact string, we can pass the backend\n           an actual device handle thingey, which saves them the effort of\n           figuring out what device this was (such as, reenumerating\n           everything again to find the matching human-readable name).\n           It might still need to open a device based on the string for,\n           say, a network audio server, but this optimizes some cases. */\n        SDL_AudioDeviceItem *item;\n        SDL_LockMutex(current_audio.detectionLock);\n        for (item = iscapture ? current_audio.inputDevices : current_audio.outputDevices; item; item = item->next) {\n            if ((item->handle != NULL) && (SDL_strcmp(item->name, devname) == 0)) {\n                handle = item->handle;\n                break;\n            }\n        }\n        SDL_UnlockMutex(current_audio.detectionLock);\n    }\n\n    if (!current_audio.impl.AllowsArbitraryDeviceNames) {\n        /* has to be in our device list, or the default device. */\n        if ((handle == NULL) && (devname != NULL)) {\n            SDL_SetError(\"No such device.\");\n            return 0;\n        }\n    }\n\n    device = (SDL_AudioDevice *) SDL_calloc(1, sizeof (SDL_AudioDevice));\n    if (device == NULL) {\n        SDL_OutOfMemory();\n        return 0;\n    }\n    device->id = id + 1;\n    device->spec = *obtained;\n    device->iscapture = iscapture ? SDL_TRUE : SDL_FALSE;\n    device->handle = handle;\n\n    SDL_AtomicSet(&device->shutdown, 0);  /* just in case. */\n    SDL_AtomicSet(&device->paused, 1);\n    SDL_AtomicSet(&device->enabled, 1);\n\n    /* Create a mutex for locking the sound buffers */\n    if (!current_audio.impl.SkipMixerLock) {\n        device->mixer_lock = SDL_CreateMutex();\n        if (device->mixer_lock == NULL) {\n            close_audio_device(device);\n            SDL_SetError(\"Couldn't create mixer lock\");\n            return 0;\n        }\n    }\n\n    if (current_audio.impl.OpenDevice(device, handle, devname, iscapture) < 0) {\n        close_audio_device(device);\n        return 0;\n    }\n\n    /* if your target really doesn't need it, set it to 0x1 or something. */\n    /* otherwise, close_audio_device() won't call impl.CloseDevice(). */\n    SDL_assert(device->hidden != NULL);\n\n    /* See if we need to do any conversion */\n    build_cvt = SDL_FALSE;\n    if (obtained->freq != device->spec.freq) {\n        if (allowed_changes & SDL_AUDIO_ALLOW_FREQUENCY_CHANGE) {\n            obtained->freq = device->spec.freq;\n        } else {\n            build_cvt = SDL_TRUE;\n        }\n    }\n    if (obtained->format != device->spec.format) {\n        if (allowed_changes & SDL_AUDIO_ALLOW_FORMAT_CHANGE) {\n            obtained->format = device->spec.format;\n        } else {\n            build_cvt = SDL_TRUE;\n        }\n    }\n    if (obtained->channels != device->spec.channels) {\n        if (allowed_changes & SDL_AUDIO_ALLOW_CHANNELS_CHANGE) {\n            obtained->channels = device->spec.channels;\n        } else {\n            build_cvt = SDL_TRUE;\n        }\n    }\n\n    /* If the audio driver changes the buffer size, accept it.\n       This needs to be done after the format is modified above,\n       otherwise it might not have the correct buffer size.\n     */\n    if (device->spec.samples != obtained->samples) {\n        obtained->samples = device->spec.samples;\n        SDL_CalculateAudioSpec(obtained);\n    }\n\n    if (build_cvt) {\n        /* Build an audio conversion block */\n        if (SDL_BuildAudioCVT(&device->convert,\n                              obtained->format, obtained->channels,\n                              obtained->freq,\n                              device->spec.format, device->spec.channels,\n                              device->spec.freq) < 0) {\n            close_audio_device(device);\n            return 0;\n        }\n        if (device->convert.needed) {\n            device->convert.len = (int) (((double) device->spec.size) /\n                                         device->convert.len_ratio);\n\n            device->convert.buf =\n                (Uint8 *) SDL_malloc(device->convert.len *\n                                            device->convert.len_mult);\n            if (device->convert.buf == NULL) {\n                close_audio_device(device);\n                SDL_OutOfMemory();\n                return 0;\n            }\n        }\n    }\n\n    if (device->spec.callback == NULL) {  /* use buffer queueing? */\n        /* pool a few packets to start. Enough for two callbacks. */\n        const int packetlen = SDL_AUDIOBUFFERQUEUE_PACKETLEN;\n        const int wantbytes = ((device->convert.needed) ? device->convert.len : device->spec.size) * 2;\n        const int wantpackets = (wantbytes / packetlen) + ((wantbytes % packetlen) ? packetlen : 0);\n        for (i = 0; i < wantpackets; i++) {\n            SDL_AudioBufferQueue *packet = (SDL_AudioBufferQueue *) SDL_malloc(sizeof (SDL_AudioBufferQueue));\n            if (packet) { /* don't care if this fails, we'll deal later. */\n                packet->datalen = 0;\n                packet->startpos = 0;\n                packet->next = device->buffer_queue_pool;\n                device->buffer_queue_pool = packet;\n            }\n        }\n\n        device->spec.callback = iscapture ? SDL_BufferQueueFillCallback : SDL_BufferQueueDrainCallback;\n        device->spec.userdata = device;\n    }\n\n    /* add it to our list of open devices. */\n    open_devices[id] = device;\n\n    /* Start the audio thread if necessary */\n    if (!current_audio.impl.ProvidesOwnCallbackThread) {\n        /* Start the audio thread */\n        /* !!! FIXME: we don't force the audio thread stack size here if it calls into user code, but maybe we should? */\n        /* buffer queueing callback only needs a few bytes, so make the stack tiny. */\n        const size_t stacksize = is_internal_thread ? 64 * 1024 : 0;\n        char threadname[64];\n\n        /* Allocate a fake audio buffer; only used by our internal threads. */\n        Uint32 stream_len = (device->convert.needed) ? device->convert.len_cvt : 0;\n        if (device->spec.size > stream_len) {\n            stream_len = device->spec.size;\n        }\n        SDL_assert(stream_len > 0);\n\n        device->fake_stream = (Uint8 *) SDL_malloc(stream_len);\n        if (device->fake_stream == NULL) {\n            close_audio_device(device);\n            SDL_OutOfMemory();\n            return 0;\n        }\n\n        SDL_snprintf(threadname, sizeof (threadname), \"SDLAudioDev%d\", (int) device->id);\n        device->thread = SDL_CreateThreadInternal(iscapture ? SDL_CaptureAudio : SDL_RunAudio, threadname, stacksize, device);\n\n        if (device->thread == NULL) {\n            close_audio_device(device);\n            SDL_SetError(\"Couldn't create audio thread\");\n            return 0;\n        }\n    }\n\n    return device->id;\n}\n\n\nint\nSDL_OpenAudio(SDL_AudioSpec * desired, SDL_AudioSpec * obtained)\n{\n    SDL_AudioDeviceID id = 0;\n\n    /* Start up the audio driver, if necessary. This is legacy behaviour! */\n    if (!SDL_WasInit(SDL_INIT_AUDIO)) {\n        if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) {\n            return -1;\n        }\n    }\n\n    /* SDL_OpenAudio() is legacy and can only act on Device ID #1. */\n    if (open_devices[0] != NULL) {\n        SDL_SetError(\"Audio device is already opened\");\n        return -1;\n    }\n\n    if (obtained) {\n        id = open_audio_device(NULL, 0, desired, obtained,\n                               SDL_AUDIO_ALLOW_ANY_CHANGE, 1);\n    } else {\n        id = open_audio_device(NULL, 0, desired, NULL, 0, 1);\n    }\n\n    SDL_assert((id == 0) || (id == 1));\n    return (id == 0) ? -1 : 0;\n}\n\nSDL_AudioDeviceID\nSDL_OpenAudioDevice(const char *device, int iscapture,\n                    const SDL_AudioSpec * desired, SDL_AudioSpec * obtained,\n                    int allowed_changes)\n{\n    return open_audio_device(device, iscapture, desired, obtained,\n                             allowed_changes, 2);\n}\n\nSDL_AudioStatus\nSDL_GetAudioDeviceStatus(SDL_AudioDeviceID devid)\n{\n    SDL_AudioDevice *device = get_audio_device(devid);\n    SDL_AudioStatus status = SDL_AUDIO_STOPPED;\n    if (device && SDL_AtomicGet(&device->enabled)) {\n        if (SDL_AtomicGet(&device->paused)) {\n            status = SDL_AUDIO_PAUSED;\n        } else {\n            status = SDL_AUDIO_PLAYING;\n        }\n    }\n    return status;\n}\n\n\nSDL_AudioStatus\nSDL_GetAudioStatus(void)\n{\n    return SDL_GetAudioDeviceStatus(1);\n}\n\nvoid\nSDL_PauseAudioDevice(SDL_AudioDeviceID devid, int pause_on)\n{\n    SDL_AudioDevice *device = get_audio_device(devid);\n    if (device) {\n        current_audio.impl.LockDevice(device);\n        SDL_AtomicSet(&device->paused, pause_on ? 1 : 0);\n        current_audio.impl.UnlockDevice(device);\n    }\n}\n\nvoid\nSDL_PauseAudio(int pause_on)\n{\n    SDL_PauseAudioDevice(1, pause_on);\n}\n\n\nvoid\nSDL_LockAudioDevice(SDL_AudioDeviceID devid)\n{\n    /* Obtain a lock on the mixing buffers */\n    SDL_AudioDevice *device = get_audio_device(devid);\n    if (device) {\n        current_audio.impl.LockDevice(device);\n    }\n}\n\nvoid\nSDL_LockAudio(void)\n{\n    SDL_LockAudioDevice(1);\n}\n\nvoid\nSDL_UnlockAudioDevice(SDL_AudioDeviceID devid)\n{\n    /* Obtain a lock on the mixing buffers */\n    SDL_AudioDevice *device = get_audio_device(devid);\n    if (device) {\n        current_audio.impl.UnlockDevice(device);\n    }\n}\n\nvoid\nSDL_UnlockAudio(void)\n{\n    SDL_UnlockAudioDevice(1);\n}\n\nvoid\nSDL_CloseAudioDevice(SDL_AudioDeviceID devid)\n{\n    close_audio_device(get_audio_device(devid));\n}\n\nvoid\nSDL_CloseAudio(void)\n{\n    SDL_CloseAudioDevice(1);\n}\n\nvoid\nSDL_AudioQuit(void)\n{\n    SDL_AudioDeviceID i;\n\n    if (!current_audio.name) {  /* not initialized?! */\n        return;\n    }\n\n    for (i = 0; i < SDL_arraysize(open_devices); i++) {\n        close_audio_device(open_devices[i]);\n    }\n\n    free_device_list(&current_audio.outputDevices, &current_audio.outputDeviceCount);\n    free_device_list(&current_audio.inputDevices, &current_audio.inputDeviceCount);\n\n    /* Free the driver data */\n    current_audio.impl.Deinitialize();\n\n    SDL_DestroyMutex(current_audio.detectionLock);\n\n    SDL_zero(current_audio);\n    SDL_zero(open_devices);\n}\n\n#define NUM_FORMATS 10\nstatic int format_idx;\nstatic int format_idx_sub;\nstatic SDL_AudioFormat format_list[NUM_FORMATS][NUM_FORMATS] = {\n    {AUDIO_U8, AUDIO_S8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB,\n     AUDIO_U16MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB},\n    {AUDIO_S8, AUDIO_U8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB,\n     AUDIO_U16MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB},\n    {AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S32LSB,\n     AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_U8, AUDIO_S8},\n    {AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S32MSB,\n     AUDIO_S32LSB, AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_U8, AUDIO_S8},\n    {AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_S32LSB,\n     AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_U8, AUDIO_S8},\n    {AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_S32MSB,\n     AUDIO_S32LSB, AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_U8, AUDIO_S8},\n    {AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_S16LSB,\n     AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8},\n    {AUDIO_S32MSB, AUDIO_S32LSB, AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_S16MSB,\n     AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8},\n    {AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_S16LSB,\n     AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8},\n    {AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_S32MSB, AUDIO_S32LSB, AUDIO_S16MSB,\n     AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8},\n};\n\nSDL_AudioFormat\nSDL_FirstAudioFormat(SDL_AudioFormat format)\n{\n    for (format_idx = 0; format_idx < NUM_FORMATS; ++format_idx) {\n        if (format_list[format_idx][0] == format) {\n            break;\n        }\n    }\n    format_idx_sub = 0;\n    return SDL_NextAudioFormat();\n}\n\nSDL_AudioFormat\nSDL_NextAudioFormat(void)\n{\n    if ((format_idx == NUM_FORMATS) || (format_idx_sub == NUM_FORMATS)) {\n        return 0;\n    }\n    return format_list[format_idx][format_idx_sub++];\n}\n\nvoid\nSDL_CalculateAudioSpec(SDL_AudioSpec * spec)\n{\n    switch (spec->format) {\n    case AUDIO_U8:\n        spec->silence = 0x80;\n        break;\n    default:\n        spec->silence = 0x00;\n        break;\n    }\n    spec->size = SDL_AUDIO_BITSIZE(spec->format) / 8;\n    spec->size *= spec->channels;\n    spec->size *= spec->samples;\n}\n\n\n/*\n * Moved here from SDL_mixer.c, since it relies on internals of an opened\n *  audio device (and is deprecated, by the way!).\n */\nvoid\nSDL_MixAudio(Uint8 * dst, const Uint8 * src, Uint32 len, int volume)\n{\n    /* Mix the user-level audio format */\n    SDL_AudioDevice *device = get_audio_device(1);\n    if (device != NULL) {\n        SDL_AudioFormat format;\n        if (device->convert.needed) {\n            format = device->convert.src_format;\n        } else {\n            format = device->spec.format;\n        }\n        SDL_MixAudioFormat(dst, src, format, len, volume);\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_audio_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Functions and variables exported from SDL_audio.c for SDL_sysaudio.c */\n\n/* Functions to get a list of \"close\" audio formats */\nextern SDL_AudioFormat SDL_FirstAudioFormat(SDL_AudioFormat format);\nextern SDL_AudioFormat SDL_NextAudioFormat(void);\n\n/* Function to calculate the size and silence for a SDL_AudioSpec */\nextern void SDL_CalculateAudioSpec(SDL_AudioSpec * spec);\n\n/* this is used internally to access some autogenerated code. */\ntypedef struct\n{\n    SDL_AudioFormat src_fmt;\n    SDL_AudioFormat dst_fmt;\n    SDL_AudioFilter filter;\n} SDL_AudioTypeFilters;\nextern const SDL_AudioTypeFilters sdl_audio_type_filters[];\n\n/* this is used internally to access some autogenerated code. */\ntypedef struct\n{\n    SDL_AudioFormat fmt;\n    int channels;\n    int upsample;\n    int multiple;\n    SDL_AudioFilter filter;\n} SDL_AudioRateFilters;\nextern const SDL_AudioRateFilters sdl_audio_rate_filters[];\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_audiocvt.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Functions for audio drivers to perform runtime conversion of audio format */\n\n#include \"SDL_audio.h\"\n#include \"SDL_audio_c.h\"\n\n#include \"SDL_assert.h\"\n\n/* #define DEBUG_CONVERT */\n\n/* Effectively mix right and left channels into a single channel */\nstatic void SDLCALL\nSDL_ConvertMono(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    Sint32 sample;\n\n#ifdef DEBUG_CONVERT\n    fprintf(stderr, \"Converting to mono\\n\");\n#endif\n\tswitch (format & (SDL_AUDIO_MASK_SIGNED |\n                      SDL_AUDIO_MASK_BITSIZE |\n                      SDL_AUDIO_MASK_DATATYPE)) {\n    case AUDIO_U8:\n        {\n            Uint8 *src, *dst;\n\n            src = cvt->buf;\n            dst = cvt->buf;\n            for (i = cvt->len_cvt / 2; i; --i) {\n                sample = src[0] + src[1];\n                *dst = (Uint8) (sample / 2);\n                src += 2;\n                dst += 1;\n            }\n        }\n        break;\n\n    case AUDIO_S8:\n        {\n            Sint8 *src, *dst;\n\n            src = (Sint8 *) cvt->buf;\n            dst = (Sint8 *) cvt->buf;\n            for (i = cvt->len_cvt / 2; i; --i) {\n                sample = src[0] + src[1];\n                *dst = (Sint8) (sample / 2);\n                src += 2;\n                dst += 1;\n            }\n        }\n        break;\n\n    case AUDIO_U16:\n        {\n            Uint8 *src, *dst;\n\n            src = cvt->buf;\n            dst = cvt->buf;\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    sample = (Uint16) ((src[0] << 8) | src[1]) +\n                        (Uint16) ((src[2] << 8) | src[3]);\n                    sample /= 2;\n                    dst[1] = (sample & 0xFF);\n                    sample >>= 8;\n                    dst[0] = (sample & 0xFF);\n                    src += 4;\n                    dst += 2;\n                }\n            } else {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    sample = (Uint16) ((src[1] << 8) | src[0]) +\n                        (Uint16) ((src[3] << 8) | src[2]);\n                    sample /= 2;\n                    dst[0] = (sample & 0xFF);\n                    sample >>= 8;\n                    dst[1] = (sample & 0xFF);\n                    src += 4;\n                    dst += 2;\n                }\n            }\n        }\n        break;\n\n    case AUDIO_S16:\n        {\n            Uint8 *src, *dst;\n\n            src = cvt->buf;\n            dst = cvt->buf;\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    sample = (Sint16) ((src[0] << 8) | src[1]) +\n                        (Sint16) ((src[2] << 8) | src[3]);\n                    sample /= 2;\n                    dst[1] = (sample & 0xFF);\n                    sample >>= 8;\n                    dst[0] = (sample & 0xFF);\n                    src += 4;\n                    dst += 2;\n                }\n            } else {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    sample = (Sint16) ((src[1] << 8) | src[0]) +\n                        (Sint16) ((src[3] << 8) | src[2]);\n                    sample /= 2;\n                    dst[0] = (sample & 0xFF);\n                    sample >>= 8;\n                    dst[1] = (sample & 0xFF);\n                    src += 4;\n                    dst += 2;\n                }\n            }\n        }\n        break;\n\n    case AUDIO_S32:\n        {\n            const Uint32 *src = (const Uint32 *) cvt->buf;\n            Uint32 *dst = (Uint32 *) cvt->buf;\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 8; i; --i, src += 2) {\n                    const Sint64 added =\n                        (((Sint64) (Sint32) SDL_SwapBE32(src[0])) +\n                         ((Sint64) (Sint32) SDL_SwapBE32(src[1])));\n                    *(dst++) = SDL_SwapBE32((Uint32) ((Sint32) (added / 2)));\n                }\n            } else {\n                for (i = cvt->len_cvt / 8; i; --i, src += 2) {\n                    const Sint64 added =\n                        (((Sint64) (Sint32) SDL_SwapLE32(src[0])) +\n                         ((Sint64) (Sint32) SDL_SwapLE32(src[1])));\n                    *(dst++) = SDL_SwapLE32((Uint32) ((Sint32) (added / 2)));\n                }\n            }\n        }\n        break;\n\n    case AUDIO_F32:\n        {\n            const float *src = (const float *) cvt->buf;\n            float *dst = (float *) cvt->buf;\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 8; i; --i, src += 2) {\n                    const float src1 = SDL_SwapFloatBE(src[0]);\n                    const float src2 = SDL_SwapFloatBE(src[1]);\n                    const double added = ((double) src1) + ((double) src2);\n                    const float halved = (float) (added * 0.5);\n                    *(dst++) = SDL_SwapFloatBE(halved);\n                }\n            } else {\n                for (i = cvt->len_cvt / 8; i; --i, src += 2) {\n                    const float src1 = SDL_SwapFloatLE(src[0]);\n                    const float src2 = SDL_SwapFloatLE(src[1]);\n                    const double added = ((double) src1) + ((double) src2);\n                    const float halved = (float) (added * 0.5);\n                    *(dst++) = SDL_SwapFloatLE(halved);\n                }\n            }\n        }\n        break;\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\n\n/* Discard top 4 channels */\nstatic void SDLCALL\nSDL_ConvertStrip(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n\n#ifdef DEBUG_CONVERT\n    fprintf(stderr, \"Converting down from 6 channels to stereo\\n\");\n#endif\n\n#define strip_chans_6_to_2(type) \\\n    { \\\n        const type *src = (const type *) cvt->buf; \\\n        type *dst = (type *) cvt->buf; \\\n        for (i = cvt->len_cvt / (sizeof (type) * 6); i; --i) { \\\n            dst[0] = src[0]; \\\n            dst[1] = src[1]; \\\n            src += 6; \\\n            dst += 2; \\\n        } \\\n    }\n\n    /* this function only cares about typesize, and data as a block of bits. */\n    switch (SDL_AUDIO_BITSIZE(format)) {\n    case 8:\n        strip_chans_6_to_2(Uint8);\n        break;\n    case 16:\n        strip_chans_6_to_2(Uint16);\n        break;\n    case 32:\n        strip_chans_6_to_2(Uint32);\n        break;\n    }\n\n#undef strip_chans_6_to_2\n\n    cvt->len_cvt /= 3;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\n\n/* Discard top 2 channels of 6 */\nstatic void SDLCALL\nSDL_ConvertStrip_2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n\n#ifdef DEBUG_CONVERT\n    fprintf(stderr, \"Converting 6 down to quad\\n\");\n#endif\n\n#define strip_chans_6_to_4(type) \\\n    { \\\n        const type *src = (const type *) cvt->buf; \\\n        type *dst = (type *) cvt->buf; \\\n        for (i = cvt->len_cvt / (sizeof (type) * 6); i; --i) { \\\n            dst[0] = src[0]; \\\n            dst[1] = src[1]; \\\n            dst[2] = src[2]; \\\n            dst[3] = src[3]; \\\n            src += 6; \\\n            dst += 4; \\\n        } \\\n    }\n\n    /* this function only cares about typesize, and data as a block of bits. */\n    switch (SDL_AUDIO_BITSIZE(format)) {\n    case 8:\n        strip_chans_6_to_4(Uint8);\n        break;\n    case 16:\n        strip_chans_6_to_4(Uint16);\n        break;\n    case 32:\n        strip_chans_6_to_4(Uint32);\n        break;\n    }\n\n#undef strip_chans_6_to_4\n\n    cvt->len_cvt /= 6;\n    cvt->len_cvt *= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\n/* Duplicate a mono channel to both stereo channels */\nstatic void SDLCALL\nSDL_ConvertStereo(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n\n#ifdef DEBUG_CONVERT\n    fprintf(stderr, \"Converting to stereo\\n\");\n#endif\n\n#define dup_chans_1_to_2(type) \\\n    { \\\n        const type *src = (const type *) (cvt->buf + cvt->len_cvt); \\\n        type *dst = (type *) (cvt->buf + cvt->len_cvt * 2); \\\n        for (i = cvt->len_cvt / sizeof(type); i; --i) { \\\n            src -= 1; \\\n            dst -= 2; \\\n            dst[0] = dst[1] = *src; \\\n        } \\\n    }\n\n    /* this function only cares about typesize, and data as a block of bits. */\n    switch (SDL_AUDIO_BITSIZE(format)) {\n    case 8:\n        dup_chans_1_to_2(Uint8);\n        break;\n    case 16:\n        dup_chans_1_to_2(Uint16);\n        break;\n    case 32:\n        dup_chans_1_to_2(Uint32);\n        break;\n    }\n\n#undef dup_chans_1_to_2\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\n\n/* Duplicate a stereo channel to a pseudo-5.1 stream */\nstatic void SDLCALL\nSDL_ConvertSurround(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n\n#ifdef DEBUG_CONVERT\n    fprintf(stderr, \"Converting stereo to surround\\n\");\n#endif\n\n    switch (format & (SDL_AUDIO_MASK_SIGNED  |\n                      SDL_AUDIO_MASK_BITSIZE |\n                      SDL_AUDIO_MASK_DATATYPE)) {\n    case AUDIO_U8:\n        {\n            Uint8 *src, *dst, lf, rf, ce;\n\n            src = (Uint8 *) (cvt->buf + cvt->len_cvt);\n            dst = (Uint8 *) (cvt->buf + cvt->len_cvt * 3);\n            for (i = cvt->len_cvt; i; --i) {\n                dst -= 6;\n                src -= 2;\n                lf = src[0];\n                rf = src[1];\n                ce = (lf / 2) + (rf / 2);\n                dst[0] = lf;\n                dst[1] = rf;\n                dst[2] = lf - ce;\n                dst[3] = rf - ce;\n                dst[4] = ce;\n                dst[5] = ce;\n            }\n        }\n        break;\n\n    case AUDIO_S8:\n        {\n            Sint8 *src, *dst, lf, rf, ce;\n\n            src = (Sint8 *) cvt->buf + cvt->len_cvt;\n            dst = (Sint8 *) cvt->buf + cvt->len_cvt * 3;\n            for (i = cvt->len_cvt; i; --i) {\n                dst -= 6;\n                src -= 2;\n                lf = src[0];\n                rf = src[1];\n                ce = (lf / 2) + (rf / 2);\n                dst[0] = lf;\n                dst[1] = rf;\n                dst[2] = lf - ce;\n                dst[3] = rf - ce;\n                dst[4] = ce;\n                dst[5] = ce;\n            }\n        }\n        break;\n\n    case AUDIO_U16:\n        {\n            Uint8 *src, *dst;\n            Uint16 lf, rf, ce, lr, rr;\n\n            src = cvt->buf + cvt->len_cvt;\n            dst = cvt->buf + cvt->len_cvt * 3;\n\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    dst -= 12;\n                    src -= 4;\n                    lf = (Uint16) ((src[0] << 8) | src[1]);\n                    rf = (Uint16) ((src[2] << 8) | src[3]);\n                    ce = (lf / 2) + (rf / 2);\n                    rr = lf - ce;\n                    lr = rf - ce;\n                    dst[1] = (lf & 0xFF);\n                    dst[0] = ((lf >> 8) & 0xFF);\n                    dst[3] = (rf & 0xFF);\n                    dst[2] = ((rf >> 8) & 0xFF);\n\n                    dst[1 + 4] = (lr & 0xFF);\n                    dst[0 + 4] = ((lr >> 8) & 0xFF);\n                    dst[3 + 4] = (rr & 0xFF);\n                    dst[2 + 4] = ((rr >> 8) & 0xFF);\n\n                    dst[1 + 8] = (ce & 0xFF);\n                    dst[0 + 8] = ((ce >> 8) & 0xFF);\n                    dst[3 + 8] = (ce & 0xFF);\n                    dst[2 + 8] = ((ce >> 8) & 0xFF);\n                }\n            } else {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    dst -= 12;\n                    src -= 4;\n                    lf = (Uint16) ((src[1] << 8) | src[0]);\n                    rf = (Uint16) ((src[3] << 8) | src[2]);\n                    ce = (lf / 2) + (rf / 2);\n                    rr = lf - ce;\n                    lr = rf - ce;\n                    dst[0] = (lf & 0xFF);\n                    dst[1] = ((lf >> 8) & 0xFF);\n                    dst[2] = (rf & 0xFF);\n                    dst[3] = ((rf >> 8) & 0xFF);\n\n                    dst[0 + 4] = (lr & 0xFF);\n                    dst[1 + 4] = ((lr >> 8) & 0xFF);\n                    dst[2 + 4] = (rr & 0xFF);\n                    dst[3 + 4] = ((rr >> 8) & 0xFF);\n\n                    dst[0 + 8] = (ce & 0xFF);\n                    dst[1 + 8] = ((ce >> 8) & 0xFF);\n                    dst[2 + 8] = (ce & 0xFF);\n                    dst[3 + 8] = ((ce >> 8) & 0xFF);\n                }\n            }\n        }\n        break;\n\n    case AUDIO_S16:\n        {\n            Uint8 *src, *dst;\n            Sint16 lf, rf, ce, lr, rr;\n\n            src = cvt->buf + cvt->len_cvt;\n            dst = cvt->buf + cvt->len_cvt * 3;\n\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    dst -= 12;\n                    src -= 4;\n                    lf = (Sint16) ((src[0] << 8) | src[1]);\n                    rf = (Sint16) ((src[2] << 8) | src[3]);\n                    ce = (lf / 2) + (rf / 2);\n                    rr = lf - ce;\n                    lr = rf - ce;\n                    dst[1] = (lf & 0xFF);\n                    dst[0] = ((lf >> 8) & 0xFF);\n                    dst[3] = (rf & 0xFF);\n                    dst[2] = ((rf >> 8) & 0xFF);\n\n                    dst[1 + 4] = (lr & 0xFF);\n                    dst[0 + 4] = ((lr >> 8) & 0xFF);\n                    dst[3 + 4] = (rr & 0xFF);\n                    dst[2 + 4] = ((rr >> 8) & 0xFF);\n\n                    dst[1 + 8] = (ce & 0xFF);\n                    dst[0 + 8] = ((ce >> 8) & 0xFF);\n                    dst[3 + 8] = (ce & 0xFF);\n                    dst[2 + 8] = ((ce >> 8) & 0xFF);\n                }\n            } else {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    dst -= 12;\n                    src -= 4;\n                    lf = (Sint16) ((src[1] << 8) | src[0]);\n                    rf = (Sint16) ((src[3] << 8) | src[2]);\n                    ce = (lf / 2) + (rf / 2);\n                    rr = lf - ce;\n                    lr = rf - ce;\n                    dst[0] = (lf & 0xFF);\n                    dst[1] = ((lf >> 8) & 0xFF);\n                    dst[2] = (rf & 0xFF);\n                    dst[3] = ((rf >> 8) & 0xFF);\n\n                    dst[0 + 4] = (lr & 0xFF);\n                    dst[1 + 4] = ((lr >> 8) & 0xFF);\n                    dst[2 + 4] = (rr & 0xFF);\n                    dst[3 + 4] = ((rr >> 8) & 0xFF);\n\n                    dst[0 + 8] = (ce & 0xFF);\n                    dst[1 + 8] = ((ce >> 8) & 0xFF);\n                    dst[2 + 8] = (ce & 0xFF);\n                    dst[3 + 8] = ((ce >> 8) & 0xFF);\n                }\n            }\n        }\n        break;\n\n    case AUDIO_S32:\n        {\n            Sint32 lf, rf, ce;\n            const Uint32 *src = (const Uint32 *) (cvt->buf + cvt->len_cvt);\n            Uint32 *dst = (Uint32 *) (cvt->buf + cvt->len_cvt * 3);\n\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 8; i; --i) {\n                    dst -= 6;\n                    src -= 2;\n                    lf = (Sint32) SDL_SwapBE32(src[0]);\n                    rf = (Sint32) SDL_SwapBE32(src[1]);\n                    ce = (lf / 2) + (rf / 2);\n                    dst[0] = SDL_SwapBE32((Uint32) lf);\n                    dst[1] = SDL_SwapBE32((Uint32) rf);\n                    dst[2] = SDL_SwapBE32((Uint32) (lf - ce));\n                    dst[3] = SDL_SwapBE32((Uint32) (rf - ce));\n                    dst[4] = SDL_SwapBE32((Uint32) ce);\n                    dst[5] = SDL_SwapBE32((Uint32) ce);\n                }\n            } else {\n                for (i = cvt->len_cvt / 8; i; --i) {\n                    dst -= 6;\n                    src -= 2;\n                    lf = (Sint32) SDL_SwapLE32(src[0]);\n                    rf = (Sint32) SDL_SwapLE32(src[1]);\n                    ce = (lf / 2) + (rf / 2);\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = SDL_SwapLE32((Uint32) (lf - ce));\n                    dst[3] = SDL_SwapLE32((Uint32) (rf - ce));\n                    dst[4] = SDL_SwapLE32((Uint32) ce);\n                    dst[5] = SDL_SwapLE32((Uint32) ce);\n                }\n            }\n        }\n        break;\n\n    case AUDIO_F32:\n        {\n            float lf, rf, ce;\n            const float *src = (const float *) (cvt->buf + cvt->len_cvt);\n            float *dst = (float *) (cvt->buf + cvt->len_cvt * 3);\n\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 8; i; --i) {\n                    dst -= 6;\n                    src -= 2;\n                    lf = SDL_SwapFloatBE(src[0]);\n                    rf = SDL_SwapFloatBE(src[1]);\n                    ce = (lf * 0.5f) + (rf * 0.5f);\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = SDL_SwapFloatBE(lf - ce);\n                    dst[3] = SDL_SwapFloatBE(rf - ce);\n                    dst[4] = dst[5] = SDL_SwapFloatBE(ce);\n                }\n            } else {\n                for (i = cvt->len_cvt / 8; i; --i) {\n                    dst -= 6;\n                    src -= 2;\n                    lf = SDL_SwapFloatLE(src[0]);\n                    rf = SDL_SwapFloatLE(src[1]);\n                    ce = (lf * 0.5f) + (rf * 0.5f);\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = SDL_SwapFloatLE(lf - ce);\n                    dst[3] = SDL_SwapFloatLE(rf - ce);\n                    dst[4] = dst[5] = SDL_SwapFloatLE(ce);\n                }\n            }\n        }\n        break;\n\n    }\n    cvt->len_cvt *= 3;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\n\n/* Duplicate a stereo channel to a pseudo-4.0 stream */\nstatic void SDLCALL\nSDL_ConvertSurround_4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n\n#ifdef DEBUG_CONVERT\n    fprintf(stderr, \"Converting stereo to quad\\n\");\n#endif\n\n    switch (format & (SDL_AUDIO_MASK_SIGNED |\n                      SDL_AUDIO_MASK_BITSIZE |\n                      SDL_AUDIO_MASK_DATATYPE)) {\n    case AUDIO_U8:\n        {\n            Uint8 *src, *dst, lf, rf, ce;\n\n            src = (Uint8 *) (cvt->buf + cvt->len_cvt);\n            dst = (Uint8 *) (cvt->buf + cvt->len_cvt * 2);\n            for (i = cvt->len_cvt; i; --i) {\n                dst -= 4;\n                src -= 2;\n                lf = src[0];\n                rf = src[1];\n                ce = (lf / 2) + (rf / 2);\n                dst[0] = lf;\n                dst[1] = rf;\n                dst[2] = lf - ce;\n                dst[3] = rf - ce;\n            }\n        }\n        break;\n\n    case AUDIO_S8:\n        {\n            Sint8 *src, *dst, lf, rf, ce;\n\n            src = (Sint8 *) cvt->buf + cvt->len_cvt;\n            dst = (Sint8 *) cvt->buf + cvt->len_cvt * 2;\n            for (i = cvt->len_cvt; i; --i) {\n                dst -= 4;\n                src -= 2;\n                lf = src[0];\n                rf = src[1];\n                ce = (lf / 2) + (rf / 2);\n                dst[0] = lf;\n                dst[1] = rf;\n                dst[2] = lf - ce;\n                dst[3] = rf - ce;\n            }\n        }\n        break;\n\n    case AUDIO_U16:\n        {\n            Uint8 *src, *dst;\n            Uint16 lf, rf, ce, lr, rr;\n\n            src = cvt->buf + cvt->len_cvt;\n            dst = cvt->buf + cvt->len_cvt * 2;\n\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    dst -= 8;\n                    src -= 4;\n                    lf = (Uint16) ((src[0] << 8) | src[1]);\n                    rf = (Uint16) ((src[2] << 8) | src[3]);\n                    ce = (lf / 2) + (rf / 2);\n                    rr = lf - ce;\n                    lr = rf - ce;\n                    dst[1] = (lf & 0xFF);\n                    dst[0] = ((lf >> 8) & 0xFF);\n                    dst[3] = (rf & 0xFF);\n                    dst[2] = ((rf >> 8) & 0xFF);\n\n                    dst[1 + 4] = (lr & 0xFF);\n                    dst[0 + 4] = ((lr >> 8) & 0xFF);\n                    dst[3 + 4] = (rr & 0xFF);\n                    dst[2 + 4] = ((rr >> 8) & 0xFF);\n                }\n            } else {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    dst -= 8;\n                    src -= 4;\n                    lf = (Uint16) ((src[1] << 8) | src[0]);\n                    rf = (Uint16) ((src[3] << 8) | src[2]);\n                    ce = (lf / 2) + (rf / 2);\n                    rr = lf - ce;\n                    lr = rf - ce;\n                    dst[0] = (lf & 0xFF);\n                    dst[1] = ((lf >> 8) & 0xFF);\n                    dst[2] = (rf & 0xFF);\n                    dst[3] = ((rf >> 8) & 0xFF);\n\n                    dst[0 + 4] = (lr & 0xFF);\n                    dst[1 + 4] = ((lr >> 8) & 0xFF);\n                    dst[2 + 4] = (rr & 0xFF);\n                    dst[3 + 4] = ((rr >> 8) & 0xFF);\n                }\n            }\n        }\n        break;\n\n    case AUDIO_S16:\n        {\n            Uint8 *src, *dst;\n            Sint16 lf, rf, ce, lr, rr;\n\n            src = cvt->buf + cvt->len_cvt;\n            dst = cvt->buf + cvt->len_cvt * 2;\n\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    dst -= 8;\n                    src -= 4;\n                    lf = (Sint16) ((src[0] << 8) | src[1]);\n                    rf = (Sint16) ((src[2] << 8) | src[3]);\n                    ce = (lf / 2) + (rf / 2);\n                    rr = lf - ce;\n                    lr = rf - ce;\n                    dst[1] = (lf & 0xFF);\n                    dst[0] = ((lf >> 8) & 0xFF);\n                    dst[3] = (rf & 0xFF);\n                    dst[2] = ((rf >> 8) & 0xFF);\n\n                    dst[1 + 4] = (lr & 0xFF);\n                    dst[0 + 4] = ((lr >> 8) & 0xFF);\n                    dst[3 + 4] = (rr & 0xFF);\n                    dst[2 + 4] = ((rr >> 8) & 0xFF);\n                }\n            } else {\n                for (i = cvt->len_cvt / 4; i; --i) {\n                    dst -= 8;\n                    src -= 4;\n                    lf = (Sint16) ((src[1] << 8) | src[0]);\n                    rf = (Sint16) ((src[3] << 8) | src[2]);\n                    ce = (lf / 2) + (rf / 2);\n                    rr = lf - ce;\n                    lr = rf - ce;\n                    dst[0] = (lf & 0xFF);\n                    dst[1] = ((lf >> 8) & 0xFF);\n                    dst[2] = (rf & 0xFF);\n                    dst[3] = ((rf >> 8) & 0xFF);\n\n                    dst[0 + 4] = (lr & 0xFF);\n                    dst[1 + 4] = ((lr >> 8) & 0xFF);\n                    dst[2 + 4] = (rr & 0xFF);\n                    dst[3 + 4] = ((rr >> 8) & 0xFF);\n                }\n            }\n        }\n        break;\n\n    case AUDIO_S32:\n        {\n            const Uint32 *src = (const Uint32 *) (cvt->buf + cvt->len_cvt);\n            Uint32 *dst = (Uint32 *) (cvt->buf + cvt->len_cvt * 2);\n            Sint32 lf, rf, ce;\n\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 8; i; --i) {\n                    dst -= 4;\n                    src -= 2;\n                    lf = (Sint32) SDL_SwapBE32(src[0]);\n                    rf = (Sint32) SDL_SwapBE32(src[1]);\n                    ce = (lf / 2) + (rf / 2);\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = SDL_SwapBE32((Uint32) (lf - ce));\n                    dst[3] = SDL_SwapBE32((Uint32) (rf - ce));\n                }\n            } else {\n                for (i = cvt->len_cvt / 8; i; --i) {\n                    dst -= 4;\n                    src -= 2;\n                    lf = (Sint32) SDL_SwapLE32(src[0]);\n                    rf = (Sint32) SDL_SwapLE32(src[1]);\n                    ce = (lf / 2) + (rf / 2);\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = SDL_SwapLE32((Uint32) (lf - ce));\n                    dst[3] = SDL_SwapLE32((Uint32) (rf - ce));\n                }\n            }\n        }\n        break;\n\n    case AUDIO_F32:\n        {\n            const float *src = (const float *) (cvt->buf + cvt->len_cvt);\n            float *dst = (float *) (cvt->buf + cvt->len_cvt * 2);\n            float lf, rf, ce;\n\n            if (SDL_AUDIO_ISBIGENDIAN(format)) {\n                for (i = cvt->len_cvt / 8; i; --i) {\n                    dst -= 4;\n                    src -= 2;\n                    lf = SDL_SwapFloatBE(src[0]);\n                    rf = SDL_SwapFloatBE(src[1]);\n                    ce = (lf / 2) + (rf / 2);\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = SDL_SwapFloatBE(lf - ce);\n                    dst[3] = SDL_SwapFloatBE(rf - ce);\n                }\n            } else {\n                for (i = cvt->len_cvt / 8; i; --i) {\n                    dst -= 4;\n                    src -= 2;\n                    lf = SDL_SwapFloatLE(src[0]);\n                    rf = SDL_SwapFloatLE(src[1]);\n                    ce = (lf / 2) + (rf / 2);\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = SDL_SwapFloatLE(lf - ce);\n                    dst[3] = SDL_SwapFloatLE(rf - ce);\n                }\n            }\n        }\n        break;\n    }\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\n\nint\nSDL_ConvertAudio(SDL_AudioCVT * cvt)\n{\n    /* !!! FIXME: (cvt) should be const; stack-copy it here. */\n    /* !!! FIXME: (actually, we can't...len_cvt needs to be updated. Grr.) */\n\n    /* Make sure there's data to convert */\n    if (cvt->buf == NULL) {\n        SDL_SetError(\"No buffer allocated for conversion\");\n        return (-1);\n    }\n    /* Return okay if no conversion is necessary */\n    cvt->len_cvt = cvt->len;\n    if (cvt->filters[0] == NULL) {\n        return (0);\n    }\n\n    /* Set up the conversion and go! */\n    cvt->filter_index = 0;\n    cvt->filters[0] (cvt, cvt->src_format);\n    return (0);\n}\n\n\nstatic SDL_AudioFilter\nSDL_HandTunedTypeCVT(SDL_AudioFormat src_fmt, SDL_AudioFormat dst_fmt)\n{\n    /*\n     * Fill in any future conversions that are specialized to a\n     *  processor, platform, compiler, or library here.\n     */\n\n    return NULL;                /* no specialized converter code available. */\n}\n\n\n/*\n * Find a converter between two data types. We try to select a hand-tuned\n *  asm/vectorized/optimized function first, and then fallback to an\n *  autogenerated function that is customized to convert between two\n *  specific data types.\n */\nstatic int\nSDL_BuildAudioTypeCVT(SDL_AudioCVT * cvt,\n                      SDL_AudioFormat src_fmt, SDL_AudioFormat dst_fmt)\n{\n    if (src_fmt != dst_fmt) {\n        const Uint16 src_bitsize = SDL_AUDIO_BITSIZE(src_fmt);\n        const Uint16 dst_bitsize = SDL_AUDIO_BITSIZE(dst_fmt);\n        SDL_AudioFilter filter = SDL_HandTunedTypeCVT(src_fmt, dst_fmt);\n\n        /* No hand-tuned converter? Try the autogenerated ones. */\n        if (filter == NULL) {\n            int i;\n            for (i = 0; sdl_audio_type_filters[i].filter != NULL; i++) {\n                const SDL_AudioTypeFilters *filt = &sdl_audio_type_filters[i];\n                if ((filt->src_fmt == src_fmt) && (filt->dst_fmt == dst_fmt)) {\n                    filter = filt->filter;\n                    break;\n                }\n            }\n\n            if (filter == NULL) {\n                SDL_SetError(\"No conversion available for these formats\");\n                return -1;\n            }\n        }\n\n        /* Update (cvt) with filter details... */\n        cvt->filters[cvt->filter_index++] = filter;\n        if (src_bitsize < dst_bitsize) {\n            const int mult = (dst_bitsize / src_bitsize);\n            cvt->len_mult *= mult;\n            cvt->len_ratio *= mult;\n        } else if (src_bitsize > dst_bitsize) {\n            cvt->len_ratio /= (src_bitsize / dst_bitsize);\n        }\n\n        return 1;               /* added a converter. */\n    }\n\n    return 0;                   /* no conversion necessary. */\n}\n\n\nstatic SDL_AudioFilter\nSDL_HandTunedResampleCVT(SDL_AudioCVT * cvt, int dst_channels,\n                         int src_rate, int dst_rate)\n{\n    /*\n     * Fill in any future conversions that are specialized to a\n     *  processor, platform, compiler, or library here.\n     */\n\n    return NULL;                /* no specialized converter code available. */\n}\n\nstatic int\nSDL_FindFrequencyMultiple(const int src_rate, const int dst_rate)\n{\n    int retval = 0;\n\n    /* If we only built with the arbitrary resamplers, ignore multiples. */\n#if !LESS_RESAMPLERS\n    int lo, hi;\n    int div;\n\n    SDL_assert(src_rate != 0);\n    SDL_assert(dst_rate != 0);\n    SDL_assert(src_rate != dst_rate);\n\n    if (src_rate < dst_rate) {\n        lo = src_rate;\n        hi = dst_rate;\n    } else {\n        lo = dst_rate;\n        hi = src_rate;\n    }\n\n    /* zero means \"not a supported multiple\" ... we only do 2x and 4x. */\n    if ((hi % lo) != 0)\n        return 0;               /* not a multiple. */\n\n    div = hi / lo;\n    retval = ((div == 2) || (div == 4)) ? div : 0;\n#endif\n\n    return retval;\n}\n\nstatic int\nSDL_BuildAudioResampleCVT(SDL_AudioCVT * cvt, int dst_channels,\n                          int src_rate, int dst_rate)\n{\n    if (src_rate != dst_rate) {\n        SDL_AudioFilter filter = SDL_HandTunedResampleCVT(cvt, dst_channels,\n                                                          src_rate, dst_rate);\n\n        /* No hand-tuned converter? Try the autogenerated ones. */\n        if (filter == NULL) {\n            int i;\n            const int upsample = (src_rate < dst_rate) ? 1 : 0;\n            const int multiple =\n                SDL_FindFrequencyMultiple(src_rate, dst_rate);\n\n            for (i = 0; sdl_audio_rate_filters[i].filter != NULL; i++) {\n                const SDL_AudioRateFilters *filt = &sdl_audio_rate_filters[i];\n                if ((filt->fmt == cvt->dst_format) &&\n                    (filt->channels == dst_channels) &&\n                    (filt->upsample == upsample) &&\n                    (filt->multiple == multiple)) {\n                    filter = filt->filter;\n                    break;\n                }\n            }\n\n            if (filter == NULL) {\n                SDL_SetError(\"No conversion available for these rates\");\n                return -1;\n            }\n        }\n\n        /* Update (cvt) with filter details... */\n        cvt->filters[cvt->filter_index++] = filter;\n        if (src_rate < dst_rate) {\n            const double mult = ((double) dst_rate) / ((double) src_rate);\n            cvt->len_mult *= (int) SDL_ceil(mult);\n            cvt->len_ratio *= mult;\n        } else {\n            cvt->len_ratio /= ((double) src_rate) / ((double) dst_rate);\n        }\n\n        return 1;               /* added a converter. */\n    }\n\n    return 0;                   /* no conversion necessary. */\n}\n\n\n/* Creates a set of audio filters to convert from one format to another.\n   Returns -1 if the format conversion is not supported, 0 if there's\n   no conversion needed, or 1 if the audio filter is set up.\n*/\n\nint\nSDL_BuildAudioCVT(SDL_AudioCVT * cvt,\n                  SDL_AudioFormat src_fmt, Uint8 src_channels, int src_rate,\n                  SDL_AudioFormat dst_fmt, Uint8 dst_channels, int dst_rate)\n{\n    /*\n     * !!! FIXME: reorder filters based on which grow/shrink the buffer.\n     * !!! FIXME: ideally, we should do everything that shrinks the buffer\n     * !!! FIXME: first, so we don't have to process as many bytes in a given\n     * !!! FIXME: filter and abuse the CPU cache less. This might not be as\n     * !!! FIXME: good in practice as it sounds in theory, though.\n     */\n\n    /* Sanity check target pointer */\n    if (cvt == NULL) {\n        return SDL_InvalidParamError(\"cvt\");\n    }\n\n    /* there are no unsigned types over 16 bits, so catch this up front. */\n    if ((SDL_AUDIO_BITSIZE(src_fmt) > 16) && (!SDL_AUDIO_ISSIGNED(src_fmt))) {\n        return SDL_SetError(\"Invalid source format\");\n    }\n    if ((SDL_AUDIO_BITSIZE(dst_fmt) > 16) && (!SDL_AUDIO_ISSIGNED(dst_fmt))) {\n        return SDL_SetError(\"Invalid destination format\");\n    }\n\n    /* prevent possible divisions by zero, etc. */\n    if ((src_channels == 0) || (dst_channels == 0)) {\n        return SDL_SetError(\"Source or destination channels is zero\");\n    }\n    if ((src_rate == 0) || (dst_rate == 0)) {\n        return SDL_SetError(\"Source or destination rate is zero\");\n    }\n#ifdef DEBUG_CONVERT\n    printf(\"Build format %04x->%04x, channels %u->%u, rate %d->%d\\n\",\n           src_fmt, dst_fmt, src_channels, dst_channels, src_rate, dst_rate);\n#endif\n\n    /* Start off with no conversion necessary */\n    SDL_zerop(cvt);\n    cvt->src_format = src_fmt;\n    cvt->dst_format = dst_fmt;\n    cvt->needed = 0;\n    cvt->filter_index = 0;\n    cvt->filters[0] = NULL;\n    cvt->len_mult = 1;\n    cvt->len_ratio = 1.0;\n    cvt->rate_incr = ((double) dst_rate) / ((double) src_rate);\n\n    /* Convert data types, if necessary. Updates (cvt). */\n    if (SDL_BuildAudioTypeCVT(cvt, src_fmt, dst_fmt) == -1) {\n        return -1;              /* shouldn't happen, but just in case... */\n    }\n\n    /* Channel conversion */\n    if (src_channels != dst_channels) {\n        if ((src_channels == 1) && (dst_channels > 1)) {\n            cvt->filters[cvt->filter_index++] = SDL_ConvertStereo;\n            cvt->len_mult *= 2;\n            src_channels = 2;\n            cvt->len_ratio *= 2;\n        }\n        if ((src_channels == 2) && (dst_channels == 6)) {\n            cvt->filters[cvt->filter_index++] = SDL_ConvertSurround;\n            src_channels = 6;\n            cvt->len_mult *= 3;\n            cvt->len_ratio *= 3;\n        }\n        if ((src_channels == 2) && (dst_channels == 4)) {\n            cvt->filters[cvt->filter_index++] = SDL_ConvertSurround_4;\n            src_channels = 4;\n            cvt->len_mult *= 2;\n            cvt->len_ratio *= 2;\n        }\n        while ((src_channels * 2) <= dst_channels) {\n            cvt->filters[cvt->filter_index++] = SDL_ConvertStereo;\n            cvt->len_mult *= 2;\n            src_channels *= 2;\n            cvt->len_ratio *= 2;\n        }\n        if ((src_channels == 6) && (dst_channels <= 2)) {\n            cvt->filters[cvt->filter_index++] = SDL_ConvertStrip;\n            src_channels = 2;\n            cvt->len_ratio /= 3;\n        }\n        if ((src_channels == 6) && (dst_channels == 4)) {\n            cvt->filters[cvt->filter_index++] = SDL_ConvertStrip_2;\n            src_channels = 4;\n            cvt->len_ratio /= 2;\n        }\n        /* This assumes that 4 channel audio is in the format:\n           Left {front/back} + Right {front/back}\n           so converting to L/R stereo works properly.\n         */\n        while (((src_channels % 2) == 0) &&\n               ((src_channels / 2) >= dst_channels)) {\n            cvt->filters[cvt->filter_index++] = SDL_ConvertMono;\n            src_channels /= 2;\n            cvt->len_ratio /= 2;\n        }\n        if (src_channels != dst_channels) {\n            /* Uh oh.. */ ;\n        }\n    }\n\n    /* Do rate conversion, if necessary. Updates (cvt). */\n    if (SDL_BuildAudioResampleCVT(cvt, dst_channels, src_rate, dst_rate) ==\n        -1) {\n        return -1;              /* shouldn't happen, but just in case... */\n    }\n\n    /* Set up the filter information */\n    if (cvt->filter_index != 0) {\n        cvt->needed = 1;\n        cvt->src_format = src_fmt;\n        cvt->dst_format = dst_fmt;\n        cvt->len = 0;\n        cvt->buf = NULL;\n        cvt->filters[cvt->filter_index] = NULL;\n    }\n    return (cvt->needed);\n}\n\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_audiodev.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Get the name of the audio device we use for output */\n\n#if SDL_AUDIO_DRIVER_BSD || SDL_AUDIO_DRIVER_OSS || SDL_AUDIO_DRIVER_SUNAUDIO\n\n#include <fcntl.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h> /* For close() */\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_audiodev_c.h\"\n\n#ifndef _PATH_DEV_DSP\n#if defined(__NETBSD__) || defined(__OPENBSD__)\n#define _PATH_DEV_DSP  \"/dev/audio\"\n#else\n#define _PATH_DEV_DSP  \"/dev/dsp\"\n#endif\n#endif\n#ifndef _PATH_DEV_DSP24\n#define _PATH_DEV_DSP24 \"/dev/sound/dsp\"\n#endif\n#ifndef _PATH_DEV_AUDIO\n#define _PATH_DEV_AUDIO \"/dev/audio\"\n#endif\n\nstatic void\ntest_device(const int iscapture, const char *fname, int flags, int (*test) (int fd))\n{\n    struct stat sb;\n    if ((stat(fname, &sb) == 0) && (S_ISCHR(sb.st_mode))) {\n        const int audio_fd = open(fname, flags, 0);\n        if (audio_fd >= 0) {\n            const int okay = test(audio_fd);\n            close(audio_fd);\n            if (okay) {\n                static size_t dummyhandle = 0;\n                dummyhandle++;\n                SDL_assert(dummyhandle != 0);\n                SDL_AddAudioDevice(iscapture, fname, (void *) dummyhandle);\n            }\n        }\n    }\n}\n\nstatic int\ntest_stub(int fd)\n{\n    return 1;\n}\n\nstatic void\nSDL_EnumUnixAudioDevices_Internal(const int iscapture, const int classic, int (*test)(int))\n{\n    const int flags = iscapture ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT;\n    const char *audiodev;\n    char audiopath[1024];\n\n    if (test == NULL)\n        test = test_stub;\n\n    /* Figure out what our audio device is */\n    if (((audiodev = SDL_getenv(\"SDL_PATH_DSP\")) == NULL) &&\n        ((audiodev = SDL_getenv(\"AUDIODEV\")) == NULL)) {\n        if (classic) {\n            audiodev = _PATH_DEV_AUDIO;\n        } else {\n            struct stat sb;\n\n            /* Added support for /dev/sound/\\* in Linux 2.4 */\n            if (((stat(\"/dev/sound\", &sb) == 0) && S_ISDIR(sb.st_mode))\n                && ((stat(_PATH_DEV_DSP24, &sb) == 0)\n                    && S_ISCHR(sb.st_mode))) {\n                audiodev = _PATH_DEV_DSP24;\n            } else {\n                audiodev = _PATH_DEV_DSP;\n            }\n        }\n    }\n    test_device(iscapture, audiodev, flags, test);\n\n    if (SDL_strlen(audiodev) < (sizeof(audiopath) - 3)) {\n        int instance = 0;\n        while (instance++ <= 64) {\n            SDL_snprintf(audiopath, SDL_arraysize(audiopath),\n                         \"%s%d\", audiodev, instance);\n            test_device(iscapture, audiopath, flags, test);\n        }\n    }\n}\n\nvoid\nSDL_EnumUnixAudioDevices(const int classic, int (*test)(int))\n{\n    SDL_EnumUnixAudioDevices_Internal(SDL_TRUE, classic, test);\n    SDL_EnumUnixAudioDevices_Internal(SDL_FALSE, classic, test);\n}\n\n#endif /* Audio driver selection */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_audiodev_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"SDL.h\"\n#include \"../SDL_internal.h\"\n#include \"SDL_sysaudio.h\"\n\n/* Open the audio device for playback, and don't block if busy */\n/* #define USE_BLOCKING_WRITES */\n\n#ifdef USE_BLOCKING_WRITES\n#define OPEN_FLAGS_OUTPUT O_WRONLY\n#define OPEN_FLAGS_INPUT O_RDONLY\n#else\n#define OPEN_FLAGS_OUTPUT (O_WRONLY|O_NONBLOCK)\n#define OPEN_FLAGS_INPUT (O_RDONLY|O_NONBLOCK)\n#endif\n\nextern void SDL_EnumUnixAudioDevices(const int classic, int (*test)(int));\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_audiotypecvt.c",
    "content": "/* DO NOT EDIT!  This file is generated by sdlgenaudiocvt.pl */\n/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"../SDL_internal.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_audio_c.h\"\n\n#ifndef DEBUG_CONVERT\n#define DEBUG_CONVERT 0\n#endif\n\n\n/* If you can guarantee your data and need space, you can eliminate code... */\n\n/* Just build the arbitrary resamplers if you're saving code space. */\n#ifndef LESS_RESAMPLERS\n#define LESS_RESAMPLERS 0\n#endif\n\n/* Don't build any resamplers if you're REALLY saving code space. */\n#ifndef NO_RESAMPLERS\n#define NO_RESAMPLERS 0\n#endif\n\n/* Don't build any type converters if you're saving code space. */\n#ifndef NO_CONVERTERS\n#define NO_CONVERTERS 0\n#endif\n\n\n/* *INDENT-OFF* */\n\n#define DIVBY127 0.0078740157480315f\n#define DIVBY32767 3.05185094759972e-05f\n#define DIVBY2147483647 4.6566128752458e-10f\n\n#if !NO_CONVERTERS\n\nstatic void SDLCALL\nSDL_Convert_U8_to_S8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Sint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U8 to AUDIO_S8.\\n\");\n#endif\n\n    src = (const Uint8 *) cvt->buf;\n    dst = (Sint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, ++src, ++dst) {\n        const Sint8 val = ((*src) ^ 0x80);\n        *dst = ((Sint8) val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U8_to_U16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U8 to AUDIO_U16LSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Uint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Uint16 val = (((Uint16) *src) << 8);\n        *dst = SDL_SwapLE16(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U8_to_S16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U8 to AUDIO_S16LSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Sint16 val = (((Sint16) ((*src) ^ 0x80)) << 8);\n        *dst = ((Sint16) SDL_SwapLE16(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U8_to_U16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U8 to AUDIO_U16MSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Uint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Uint16 val = (((Uint16) *src) << 8);\n        *dst = SDL_SwapBE16(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U8_to_S16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U8 to AUDIO_S16MSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Sint16 val = (((Sint16) ((*src) ^ 0x80)) << 8);\n        *dst = ((Sint16) SDL_SwapBE16(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U8_to_S32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U8 to AUDIO_S32LSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 4)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((*src) ^ 0x80)) << 24);\n        *dst = ((Sint32) SDL_SwapLE32(val));\n    }\n\n    cvt->len_cvt *= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U8_to_S32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U8 to AUDIO_S32MSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 4)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((*src) ^ 0x80)) << 24);\n        *dst = ((Sint32) SDL_SwapBE32(val));\n    }\n\n    cvt->len_cvt *= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U8_to_F32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U8 to AUDIO_F32LSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const float val = ((((float) *src) * DIVBY127) - 1.0f);\n        *dst = SDL_SwapFloatLE(val);\n    }\n\n    cvt->len_cvt *= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U8_to_F32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U8 to AUDIO_F32MSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const float val = ((((float) *src) * DIVBY127) - 1.0f);\n        *dst = SDL_SwapFloatBE(val);\n    }\n\n    cvt->len_cvt *= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S8_to_U8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Uint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S8 to AUDIO_U8.\\n\");\n#endif\n\n    src = (const Uint8 *) cvt->buf;\n    dst = (Uint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, ++src, ++dst) {\n        const Uint8 val = ((((Sint8) *src)) ^ 0x80);\n        *dst = val;\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S8_to_U16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S8 to AUDIO_U16LSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Uint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Uint16 val = (((Uint16) ((((Sint8) *src)) ^ 0x80)) << 8);\n        *dst = SDL_SwapLE16(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S8_to_S16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S8 to AUDIO_S16LSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Sint16 val = (((Sint16) ((Sint8) *src)) << 8);\n        *dst = ((Sint16) SDL_SwapLE16(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S8_to_U16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S8 to AUDIO_U16MSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Uint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Uint16 val = (((Uint16) ((((Sint8) *src)) ^ 0x80)) << 8);\n        *dst = SDL_SwapBE16(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S8_to_S16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S8 to AUDIO_S16MSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Sint16 val = (((Sint16) ((Sint8) *src)) << 8);\n        *dst = ((Sint16) SDL_SwapBE16(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S8_to_S32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S8 to AUDIO_S32LSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 4)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((Sint8) *src)) << 24);\n        *dst = ((Sint32) SDL_SwapLE32(val));\n    }\n\n    cvt->len_cvt *= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S8_to_S32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S8 to AUDIO_S32MSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 4)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((Sint8) *src)) << 24);\n        *dst = ((Sint32) SDL_SwapBE32(val));\n    }\n\n    cvt->len_cvt *= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S8_to_F32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S8 to AUDIO_F32LSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const float val = (((float) ((Sint8) *src)) * DIVBY127);\n        *dst = SDL_SwapFloatLE(val);\n    }\n\n    cvt->len_cvt *= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S8_to_F32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint8 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S8 to AUDIO_F32MSB.\\n\");\n#endif\n\n    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {\n        const float val = (((float) ((Sint8) *src)) * DIVBY127);\n        *dst = SDL_SwapFloatBE(val);\n    }\n\n    cvt->len_cvt *= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16LSB_to_U8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16LSB to AUDIO_U8.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint8 val = ((Uint8) (SDL_SwapLE16(*src) >> 8));\n        *dst = val;\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16LSB_to_S8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16LSB to AUDIO_S8.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint8 val = ((Sint8) (((SDL_SwapLE16(*src)) ^ 0x8000) >> 8));\n        *dst = ((Sint8) val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16LSB_to_S16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16LSB to AUDIO_S16LSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint16 val = ((SDL_SwapLE16(*src)) ^ 0x8000);\n        *dst = ((Sint16) SDL_SwapLE16(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16LSB_to_U16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16LSB to AUDIO_U16MSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint16 val = SDL_SwapLE16(*src);\n        *dst = SDL_SwapBE16(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16LSB_to_S16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16LSB to AUDIO_S16MSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint16 val = ((SDL_SwapLE16(*src)) ^ 0x8000);\n        *dst = ((Sint16) SDL_SwapBE16(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16LSB_to_S32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16LSB to AUDIO_S32LSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((SDL_SwapLE16(*src)) ^ 0x8000)) << 16);\n        *dst = ((Sint32) SDL_SwapLE32(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16LSB_to_S32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16LSB to AUDIO_S32MSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((SDL_SwapLE16(*src)) ^ 0x8000)) << 16);\n        *dst = ((Sint32) SDL_SwapBE32(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16LSB_to_F32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16LSB to AUDIO_F32LSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const float val = ((((float) SDL_SwapLE16(*src)) * DIVBY32767) - 1.0f);\n        *dst = SDL_SwapFloatLE(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16LSB_to_F32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16LSB to AUDIO_F32MSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const float val = ((((float) SDL_SwapLE16(*src)) * DIVBY32767) - 1.0f);\n        *dst = SDL_SwapFloatBE(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16LSB_to_U8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16LSB to AUDIO_U8.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint8 val = ((Uint8) (((((Sint16) SDL_SwapLE16(*src))) ^ 0x8000) >> 8));\n        *dst = val;\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16LSB_to_S8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16LSB to AUDIO_S8.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint8 val = ((Sint8) (((Sint16) SDL_SwapLE16(*src)) >> 8));\n        *dst = ((Sint8) val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16LSB_to_U16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16LSB to AUDIO_U16LSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint16 val = ((((Sint16) SDL_SwapLE16(*src))) ^ 0x8000);\n        *dst = SDL_SwapLE16(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16LSB_to_U16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16LSB to AUDIO_U16MSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint16 val = ((((Sint16) SDL_SwapLE16(*src))) ^ 0x8000);\n        *dst = SDL_SwapBE16(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16LSB_to_S16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16LSB to AUDIO_S16MSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) SDL_SwapLE16(*src));\n        *dst = ((Sint16) SDL_SwapBE16(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16LSB_to_S32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16LSB to AUDIO_S32LSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((Sint16) SDL_SwapLE16(*src))) << 16);\n        *dst = ((Sint32) SDL_SwapLE32(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16LSB_to_S32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16LSB to AUDIO_S32MSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((Sint16) SDL_SwapLE16(*src))) << 16);\n        *dst = ((Sint32) SDL_SwapBE32(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16LSB_to_F32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16LSB to AUDIO_F32LSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const float val = (((float) ((Sint16) SDL_SwapLE16(*src))) * DIVBY32767);\n        *dst = SDL_SwapFloatLE(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16LSB_to_F32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16LSB to AUDIO_F32MSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const float val = (((float) ((Sint16) SDL_SwapLE16(*src))) * DIVBY32767);\n        *dst = SDL_SwapFloatBE(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16MSB_to_U8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16MSB to AUDIO_U8.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint8 val = ((Uint8) (SDL_SwapBE16(*src) >> 8));\n        *dst = val;\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16MSB_to_S8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16MSB to AUDIO_S8.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint8 val = ((Sint8) (((SDL_SwapBE16(*src)) ^ 0x8000) >> 8));\n        *dst = ((Sint8) val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16MSB_to_U16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16MSB to AUDIO_U16LSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint16 val = SDL_SwapBE16(*src);\n        *dst = SDL_SwapLE16(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16MSB_to_S16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16MSB to AUDIO_S16LSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint16 val = ((SDL_SwapBE16(*src)) ^ 0x8000);\n        *dst = ((Sint16) SDL_SwapLE16(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16MSB_to_S16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16MSB to AUDIO_S16MSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint16 val = ((SDL_SwapBE16(*src)) ^ 0x8000);\n        *dst = ((Sint16) SDL_SwapBE16(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16MSB_to_S32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16MSB to AUDIO_S32LSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((SDL_SwapBE16(*src)) ^ 0x8000)) << 16);\n        *dst = ((Sint32) SDL_SwapLE32(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16MSB_to_S32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16MSB to AUDIO_S32MSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((SDL_SwapBE16(*src)) ^ 0x8000)) << 16);\n        *dst = ((Sint32) SDL_SwapBE32(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16MSB_to_F32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16MSB to AUDIO_F32LSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const float val = ((((float) SDL_SwapBE16(*src)) * DIVBY32767) - 1.0f);\n        *dst = SDL_SwapFloatLE(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_U16MSB_to_F32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_U16MSB to AUDIO_F32MSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const float val = ((((float) SDL_SwapBE16(*src)) * DIVBY32767) - 1.0f);\n        *dst = SDL_SwapFloatBE(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16MSB_to_U8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16MSB to AUDIO_U8.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint8 val = ((Uint8) (((((Sint16) SDL_SwapBE16(*src))) ^ 0x8000) >> 8));\n        *dst = val;\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16MSB_to_S8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16MSB to AUDIO_S8.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint8 val = ((Sint8) (((Sint16) SDL_SwapBE16(*src)) >> 8));\n        *dst = ((Sint8) val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16MSB_to_U16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16MSB to AUDIO_U16LSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint16 val = ((((Sint16) SDL_SwapBE16(*src))) ^ 0x8000);\n        *dst = SDL_SwapLE16(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16MSB_to_S16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16MSB to AUDIO_S16LSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) SDL_SwapBE16(*src));\n        *dst = ((Sint16) SDL_SwapLE16(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16MSB_to_U16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16MSB to AUDIO_U16MSB.\\n\");\n#endif\n\n    src = (const Uint16 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, ++src, ++dst) {\n        const Uint16 val = ((((Sint16) SDL_SwapBE16(*src))) ^ 0x8000);\n        *dst = SDL_SwapBE16(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16MSB_to_S32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16MSB to AUDIO_S32LSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((Sint16) SDL_SwapBE16(*src))) << 16);\n        *dst = ((Sint32) SDL_SwapLE32(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16MSB_to_S32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16MSB to AUDIO_S32MSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const Sint32 val = (((Sint32) ((Sint16) SDL_SwapBE16(*src))) << 16);\n        *dst = ((Sint32) SDL_SwapBE32(val));\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16MSB_to_F32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16MSB to AUDIO_F32LSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const float val = (((float) ((Sint16) SDL_SwapBE16(*src))) * DIVBY32767);\n        *dst = SDL_SwapFloatLE(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S16MSB_to_F32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint16 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S16MSB to AUDIO_F32MSB.\\n\");\n#endif\n\n    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;\n    for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {\n        const float val = (((float) ((Sint16) SDL_SwapBE16(*src))) * DIVBY32767);\n        *dst = SDL_SwapFloatBE(val);\n    }\n\n    cvt->len_cvt *= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32LSB_to_U8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Uint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32LSB to AUDIO_U8.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Uint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Uint8 val = ((Uint8) (((((Sint32) SDL_SwapLE32(*src))) ^ 0x80000000) >> 24));\n        *dst = val;\n    }\n\n    cvt->len_cvt /= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32LSB_to_S8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Sint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32LSB to AUDIO_S8.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Sint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Sint8 val = ((Sint8) (((Sint32) SDL_SwapLE32(*src)) >> 24));\n        *dst = ((Sint8) val);\n    }\n\n    cvt->len_cvt /= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32LSB_to_U16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32LSB to AUDIO_U16LSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Uint16 val = ((Uint16) (((((Sint32) SDL_SwapLE32(*src))) ^ 0x80000000) >> 16));\n        *dst = SDL_SwapLE16(val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32LSB_to_S16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32LSB to AUDIO_S16LSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) (((Sint32) SDL_SwapLE32(*src)) >> 16));\n        *dst = ((Sint16) SDL_SwapLE16(val));\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32LSB_to_U16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32LSB to AUDIO_U16MSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Uint16 val = ((Uint16) (((((Sint32) SDL_SwapLE32(*src))) ^ 0x80000000) >> 16));\n        *dst = SDL_SwapBE16(val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32LSB_to_S16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32LSB to AUDIO_S16MSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) (((Sint32) SDL_SwapLE32(*src)) >> 16));\n        *dst = ((Sint16) SDL_SwapBE16(val));\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32LSB_to_S32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32LSB to AUDIO_S32MSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Sint32 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Sint32 val = ((Sint32) SDL_SwapLE32(*src));\n        *dst = ((Sint32) SDL_SwapBE32(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32LSB_to_F32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32LSB to AUDIO_F32LSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (float *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const float val = (((float) ((Sint32) SDL_SwapLE32(*src))) * DIVBY2147483647);\n        *dst = SDL_SwapFloatLE(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32LSB_to_F32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32LSB to AUDIO_F32MSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (float *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const float val = (((float) ((Sint32) SDL_SwapLE32(*src))) * DIVBY2147483647);\n        *dst = SDL_SwapFloatBE(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32MSB_to_U8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Uint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32MSB to AUDIO_U8.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Uint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Uint8 val = ((Uint8) (((((Sint32) SDL_SwapBE32(*src))) ^ 0x80000000) >> 24));\n        *dst = val;\n    }\n\n    cvt->len_cvt /= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32MSB_to_S8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Sint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32MSB to AUDIO_S8.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Sint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Sint8 val = ((Sint8) (((Sint32) SDL_SwapBE32(*src)) >> 24));\n        *dst = ((Sint8) val);\n    }\n\n    cvt->len_cvt /= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32MSB_to_U16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32MSB to AUDIO_U16LSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Uint16 val = ((Uint16) (((((Sint32) SDL_SwapBE32(*src))) ^ 0x80000000) >> 16));\n        *dst = SDL_SwapLE16(val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32MSB_to_S16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32MSB to AUDIO_S16LSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) (((Sint32) SDL_SwapBE32(*src)) >> 16));\n        *dst = ((Sint16) SDL_SwapLE16(val));\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32MSB_to_U16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32MSB to AUDIO_U16MSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Uint16 val = ((Uint16) (((((Sint32) SDL_SwapBE32(*src))) ^ 0x80000000) >> 16));\n        *dst = SDL_SwapBE16(val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32MSB_to_S16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32MSB to AUDIO_S16MSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) (((Sint32) SDL_SwapBE32(*src)) >> 16));\n        *dst = ((Sint16) SDL_SwapBE16(val));\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32MSB_to_S32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32MSB to AUDIO_S32LSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (Sint32 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const Sint32 val = ((Sint32) SDL_SwapBE32(*src));\n        *dst = ((Sint32) SDL_SwapLE32(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32MSB_to_F32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32MSB to AUDIO_F32LSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (float *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const float val = (((float) ((Sint32) SDL_SwapBE32(*src))) * DIVBY2147483647);\n        *dst = SDL_SwapFloatLE(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_S32MSB_to_F32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const Uint32 *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_S32MSB to AUDIO_F32MSB.\\n\");\n#endif\n\n    src = (const Uint32 *) cvt->buf;\n    dst = (float *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (Uint32); i; --i, ++src, ++dst) {\n        const float val = (((float) ((Sint32) SDL_SwapBE32(*src))) * DIVBY2147483647);\n        *dst = SDL_SwapFloatBE(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32LSB_to_U8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Uint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32LSB to AUDIO_U8.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Uint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Uint8 val = ((Uint8) ((SDL_SwapFloatLE(*src) + 1.0f) * 127.0f));\n        *dst = val;\n    }\n\n    cvt->len_cvt /= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32LSB_to_S8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32LSB to AUDIO_S8.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint8 val = ((Sint8) (SDL_SwapFloatLE(*src) * 127.0f));\n        *dst = ((Sint8) val);\n    }\n\n    cvt->len_cvt /= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32LSB_to_U16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32LSB to AUDIO_U16LSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Uint16 val = ((Uint16) ((SDL_SwapFloatLE(*src) + 1.0f) * 32767.0f));\n        *dst = SDL_SwapLE16(val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32LSB_to_S16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32LSB to AUDIO_S16LSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) (SDL_SwapFloatLE(*src) * 32767.0f));\n        *dst = ((Sint16) SDL_SwapLE16(val));\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32LSB_to_U16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32LSB to AUDIO_U16MSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Uint16 val = ((Uint16) ((SDL_SwapFloatLE(*src) + 1.0f) * 32767.0f));\n        *dst = SDL_SwapBE16(val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32LSB_to_S16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32LSB to AUDIO_S16MSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) (SDL_SwapFloatLE(*src) * 32767.0f));\n        *dst = ((Sint16) SDL_SwapBE16(val));\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32LSB_to_S32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32LSB to AUDIO_S32LSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint32 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint32 val = ((Sint32) (SDL_SwapFloatLE(*src) * 2147483647.0));\n        *dst = ((Sint32) SDL_SwapLE32(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32LSB_to_S32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32LSB to AUDIO_S32MSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint32 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint32 val = ((Sint32) (SDL_SwapFloatLE(*src) * 2147483647.0));\n        *dst = ((Sint32) SDL_SwapBE32(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32LSB_to_F32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32LSB to AUDIO_F32MSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (float *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const float val = SDL_SwapFloatLE(*src);\n        *dst = SDL_SwapFloatBE(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32MSB_to_U8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Uint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32MSB to AUDIO_U8.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Uint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Uint8 val = ((Uint8) ((SDL_SwapFloatBE(*src) + 1.0f) * 127.0f));\n        *dst = val;\n    }\n\n    cvt->len_cvt /= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32MSB_to_S8(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint8 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32MSB to AUDIO_S8.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint8 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint8 val = ((Sint8) (SDL_SwapFloatBE(*src) * 127.0f));\n        *dst = ((Sint8) val);\n    }\n\n    cvt->len_cvt /= 4;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S8);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32MSB_to_U16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32MSB to AUDIO_U16LSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Uint16 val = ((Uint16) ((SDL_SwapFloatBE(*src) + 1.0f) * 32767.0f));\n        *dst = SDL_SwapLE16(val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32MSB_to_S16LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32MSB to AUDIO_S16LSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) (SDL_SwapFloatBE(*src) * 32767.0f));\n        *dst = ((Sint16) SDL_SwapLE16(val));\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32MSB_to_U16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Uint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32MSB to AUDIO_U16MSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Uint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Uint16 val = ((Uint16) ((SDL_SwapFloatBE(*src) + 1.0f) * 32767.0f));\n        *dst = SDL_SwapBE16(val);\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_U16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32MSB_to_S16MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint16 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32MSB to AUDIO_S16MSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint16 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint16 val = ((Sint16) (SDL_SwapFloatBE(*src) * 32767.0f));\n        *dst = ((Sint16) SDL_SwapBE16(val));\n    }\n\n    cvt->len_cvt /= 2;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S16MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32MSB_to_S32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32MSB to AUDIO_S32LSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint32 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint32 val = ((Sint32) (SDL_SwapFloatBE(*src) * 2147483647.0));\n        *dst = ((Sint32) SDL_SwapLE32(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32LSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32MSB_to_S32MSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    Sint32 *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32MSB to AUDIO_S32MSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (Sint32 *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const Sint32 val = ((Sint32) (SDL_SwapFloatBE(*src) * 2147483647.0));\n        *dst = ((Sint32) SDL_SwapBE32(val));\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_S32MSB);\n    }\n}\n\nstatic void SDLCALL\nSDL_Convert_F32MSB_to_F32LSB(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const float *src;\n    float *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_F32MSB to AUDIO_F32LSB.\\n\");\n#endif\n\n    src = (const float *) cvt->buf;\n    dst = (float *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {\n        const float val = SDL_SwapFloatBE(*src);\n        *dst = SDL_SwapFloatLE(val);\n    }\n\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_F32LSB);\n    }\n}\n\n#endif  /* !NO_CONVERTERS */\n\n\nconst SDL_AudioTypeFilters sdl_audio_type_filters[] =\n{\n#if !NO_CONVERTERS\n    { AUDIO_U8, AUDIO_S8, SDL_Convert_U8_to_S8 },\n    { AUDIO_U8, AUDIO_U16LSB, SDL_Convert_U8_to_U16LSB },\n    { AUDIO_U8, AUDIO_S16LSB, SDL_Convert_U8_to_S16LSB },\n    { AUDIO_U8, AUDIO_U16MSB, SDL_Convert_U8_to_U16MSB },\n    { AUDIO_U8, AUDIO_S16MSB, SDL_Convert_U8_to_S16MSB },\n    { AUDIO_U8, AUDIO_S32LSB, SDL_Convert_U8_to_S32LSB },\n    { AUDIO_U8, AUDIO_S32MSB, SDL_Convert_U8_to_S32MSB },\n    { AUDIO_U8, AUDIO_F32LSB, SDL_Convert_U8_to_F32LSB },\n    { AUDIO_U8, AUDIO_F32MSB, SDL_Convert_U8_to_F32MSB },\n    { AUDIO_S8, AUDIO_U8, SDL_Convert_S8_to_U8 },\n    { AUDIO_S8, AUDIO_U16LSB, SDL_Convert_S8_to_U16LSB },\n    { AUDIO_S8, AUDIO_S16LSB, SDL_Convert_S8_to_S16LSB },\n    { AUDIO_S8, AUDIO_U16MSB, SDL_Convert_S8_to_U16MSB },\n    { AUDIO_S8, AUDIO_S16MSB, SDL_Convert_S8_to_S16MSB },\n    { AUDIO_S8, AUDIO_S32LSB, SDL_Convert_S8_to_S32LSB },\n    { AUDIO_S8, AUDIO_S32MSB, SDL_Convert_S8_to_S32MSB },\n    { AUDIO_S8, AUDIO_F32LSB, SDL_Convert_S8_to_F32LSB },\n    { AUDIO_S8, AUDIO_F32MSB, SDL_Convert_S8_to_F32MSB },\n    { AUDIO_U16LSB, AUDIO_U8, SDL_Convert_U16LSB_to_U8 },\n    { AUDIO_U16LSB, AUDIO_S8, SDL_Convert_U16LSB_to_S8 },\n    { AUDIO_U16LSB, AUDIO_S16LSB, SDL_Convert_U16LSB_to_S16LSB },\n    { AUDIO_U16LSB, AUDIO_U16MSB, SDL_Convert_U16LSB_to_U16MSB },\n    { AUDIO_U16LSB, AUDIO_S16MSB, SDL_Convert_U16LSB_to_S16MSB },\n    { AUDIO_U16LSB, AUDIO_S32LSB, SDL_Convert_U16LSB_to_S32LSB },\n    { AUDIO_U16LSB, AUDIO_S32MSB, SDL_Convert_U16LSB_to_S32MSB },\n    { AUDIO_U16LSB, AUDIO_F32LSB, SDL_Convert_U16LSB_to_F32LSB },\n    { AUDIO_U16LSB, AUDIO_F32MSB, SDL_Convert_U16LSB_to_F32MSB },\n    { AUDIO_S16LSB, AUDIO_U8, SDL_Convert_S16LSB_to_U8 },\n    { AUDIO_S16LSB, AUDIO_S8, SDL_Convert_S16LSB_to_S8 },\n    { AUDIO_S16LSB, AUDIO_U16LSB, SDL_Convert_S16LSB_to_U16LSB },\n    { AUDIO_S16LSB, AUDIO_U16MSB, SDL_Convert_S16LSB_to_U16MSB },\n    { AUDIO_S16LSB, AUDIO_S16MSB, SDL_Convert_S16LSB_to_S16MSB },\n    { AUDIO_S16LSB, AUDIO_S32LSB, SDL_Convert_S16LSB_to_S32LSB },\n    { AUDIO_S16LSB, AUDIO_S32MSB, SDL_Convert_S16LSB_to_S32MSB },\n    { AUDIO_S16LSB, AUDIO_F32LSB, SDL_Convert_S16LSB_to_F32LSB },\n    { AUDIO_S16LSB, AUDIO_F32MSB, SDL_Convert_S16LSB_to_F32MSB },\n    { AUDIO_U16MSB, AUDIO_U8, SDL_Convert_U16MSB_to_U8 },\n    { AUDIO_U16MSB, AUDIO_S8, SDL_Convert_U16MSB_to_S8 },\n    { AUDIO_U16MSB, AUDIO_U16LSB, SDL_Convert_U16MSB_to_U16LSB },\n    { AUDIO_U16MSB, AUDIO_S16LSB, SDL_Convert_U16MSB_to_S16LSB },\n    { AUDIO_U16MSB, AUDIO_S16MSB, SDL_Convert_U16MSB_to_S16MSB },\n    { AUDIO_U16MSB, AUDIO_S32LSB, SDL_Convert_U16MSB_to_S32LSB },\n    { AUDIO_U16MSB, AUDIO_S32MSB, SDL_Convert_U16MSB_to_S32MSB },\n    { AUDIO_U16MSB, AUDIO_F32LSB, SDL_Convert_U16MSB_to_F32LSB },\n    { AUDIO_U16MSB, AUDIO_F32MSB, SDL_Convert_U16MSB_to_F32MSB },\n    { AUDIO_S16MSB, AUDIO_U8, SDL_Convert_S16MSB_to_U8 },\n    { AUDIO_S16MSB, AUDIO_S8, SDL_Convert_S16MSB_to_S8 },\n    { AUDIO_S16MSB, AUDIO_U16LSB, SDL_Convert_S16MSB_to_U16LSB },\n    { AUDIO_S16MSB, AUDIO_S16LSB, SDL_Convert_S16MSB_to_S16LSB },\n    { AUDIO_S16MSB, AUDIO_U16MSB, SDL_Convert_S16MSB_to_U16MSB },\n    { AUDIO_S16MSB, AUDIO_S32LSB, SDL_Convert_S16MSB_to_S32LSB },\n    { AUDIO_S16MSB, AUDIO_S32MSB, SDL_Convert_S16MSB_to_S32MSB },\n    { AUDIO_S16MSB, AUDIO_F32LSB, SDL_Convert_S16MSB_to_F32LSB },\n    { AUDIO_S16MSB, AUDIO_F32MSB, SDL_Convert_S16MSB_to_F32MSB },\n    { AUDIO_S32LSB, AUDIO_U8, SDL_Convert_S32LSB_to_U8 },\n    { AUDIO_S32LSB, AUDIO_S8, SDL_Convert_S32LSB_to_S8 },\n    { AUDIO_S32LSB, AUDIO_U16LSB, SDL_Convert_S32LSB_to_U16LSB },\n    { AUDIO_S32LSB, AUDIO_S16LSB, SDL_Convert_S32LSB_to_S16LSB },\n    { AUDIO_S32LSB, AUDIO_U16MSB, SDL_Convert_S32LSB_to_U16MSB },\n    { AUDIO_S32LSB, AUDIO_S16MSB, SDL_Convert_S32LSB_to_S16MSB },\n    { AUDIO_S32LSB, AUDIO_S32MSB, SDL_Convert_S32LSB_to_S32MSB },\n    { AUDIO_S32LSB, AUDIO_F32LSB, SDL_Convert_S32LSB_to_F32LSB },\n    { AUDIO_S32LSB, AUDIO_F32MSB, SDL_Convert_S32LSB_to_F32MSB },\n    { AUDIO_S32MSB, AUDIO_U8, SDL_Convert_S32MSB_to_U8 },\n    { AUDIO_S32MSB, AUDIO_S8, SDL_Convert_S32MSB_to_S8 },\n    { AUDIO_S32MSB, AUDIO_U16LSB, SDL_Convert_S32MSB_to_U16LSB },\n    { AUDIO_S32MSB, AUDIO_S16LSB, SDL_Convert_S32MSB_to_S16LSB },\n    { AUDIO_S32MSB, AUDIO_U16MSB, SDL_Convert_S32MSB_to_U16MSB },\n    { AUDIO_S32MSB, AUDIO_S16MSB, SDL_Convert_S32MSB_to_S16MSB },\n    { AUDIO_S32MSB, AUDIO_S32LSB, SDL_Convert_S32MSB_to_S32LSB },\n    { AUDIO_S32MSB, AUDIO_F32LSB, SDL_Convert_S32MSB_to_F32LSB },\n    { AUDIO_S32MSB, AUDIO_F32MSB, SDL_Convert_S32MSB_to_F32MSB },\n    { AUDIO_F32LSB, AUDIO_U8, SDL_Convert_F32LSB_to_U8 },\n    { AUDIO_F32LSB, AUDIO_S8, SDL_Convert_F32LSB_to_S8 },\n    { AUDIO_F32LSB, AUDIO_U16LSB, SDL_Convert_F32LSB_to_U16LSB },\n    { AUDIO_F32LSB, AUDIO_S16LSB, SDL_Convert_F32LSB_to_S16LSB },\n    { AUDIO_F32LSB, AUDIO_U16MSB, SDL_Convert_F32LSB_to_U16MSB },\n    { AUDIO_F32LSB, AUDIO_S16MSB, SDL_Convert_F32LSB_to_S16MSB },\n    { AUDIO_F32LSB, AUDIO_S32LSB, SDL_Convert_F32LSB_to_S32LSB },\n    { AUDIO_F32LSB, AUDIO_S32MSB, SDL_Convert_F32LSB_to_S32MSB },\n    { AUDIO_F32LSB, AUDIO_F32MSB, SDL_Convert_F32LSB_to_F32MSB },\n    { AUDIO_F32MSB, AUDIO_U8, SDL_Convert_F32MSB_to_U8 },\n    { AUDIO_F32MSB, AUDIO_S8, SDL_Convert_F32MSB_to_S8 },\n    { AUDIO_F32MSB, AUDIO_U16LSB, SDL_Convert_F32MSB_to_U16LSB },\n    { AUDIO_F32MSB, AUDIO_S16LSB, SDL_Convert_F32MSB_to_S16LSB },\n    { AUDIO_F32MSB, AUDIO_U16MSB, SDL_Convert_F32MSB_to_U16MSB },\n    { AUDIO_F32MSB, AUDIO_S16MSB, SDL_Convert_F32MSB_to_S16MSB },\n    { AUDIO_F32MSB, AUDIO_S32LSB, SDL_Convert_F32MSB_to_S32LSB },\n    { AUDIO_F32MSB, AUDIO_S32MSB, SDL_Convert_F32MSB_to_S32MSB },\n    { AUDIO_F32MSB, AUDIO_F32LSB, SDL_Convert_F32MSB_to_F32LSB },\n#endif  /* !NO_CONVERTERS */\n    { 0, 0, NULL }\n};\n\n\n#if !NO_RESAMPLERS\n\nstatic void SDLCALL\nSDL_Upsample_U8_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U8, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 16;\n    const int dstsize = (int) (((double)(cvt->len_cvt/1)) * cvt->rate_incr) * 1;\n    register int eps = 0;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 1;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Uint8 sample0 = src[0];\n    Uint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = sample0;\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U8, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 16;\n    const int dstsize = (int) (((double)(cvt->len_cvt/1)) * cvt->rate_incr) * 1;\n    register int eps = 0;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Uint8 sample0 = src[0];\n    Uint8 last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = sample0;\n            dst++;\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U8, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 2;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Uint8 sample1 = src[1];\n    Uint8 sample0 = src[0];\n    Uint8 last_sample1 = sample1;\n    Uint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = sample1;\n        dst[0] = sample0;\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (Uint8) ((((Sint16) src[1]) + ((Sint16) last_sample1)) >> 1);\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U8, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Uint8 sample0 = src[0];\n    Uint8 sample1 = src[1];\n    Uint8 last_sample0 = sample0;\n    Uint8 last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = sample0;\n            dst[1] = sample1;\n            dst += 2;\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            sample1 = (Uint8) ((((Sint16) src[1]) + ((Sint16) last_sample1)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U8, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 4;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Uint8 sample3 = src[3];\n    Uint8 sample2 = src[2];\n    Uint8 sample1 = src[1];\n    Uint8 sample0 = src[0];\n    Uint8 last_sample3 = sample3;\n    Uint8 last_sample2 = sample2;\n    Uint8 last_sample1 = sample1;\n    Uint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = sample3;\n        dst[2] = sample2;\n        dst[1] = sample1;\n        dst[0] = sample0;\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (Uint8) ((((Sint16) src[3]) + ((Sint16) last_sample3)) >> 1);\n            sample2 = (Uint8) ((((Sint16) src[2]) + ((Sint16) last_sample2)) >> 1);\n            sample1 = (Uint8) ((((Sint16) src[1]) + ((Sint16) last_sample1)) >> 1);\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U8, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Uint8 sample0 = src[0];\n    Uint8 sample1 = src[1];\n    Uint8 sample2 = src[2];\n    Uint8 sample3 = src[3];\n    Uint8 last_sample0 = sample0;\n    Uint8 last_sample1 = sample1;\n    Uint8 last_sample2 = sample2;\n    Uint8 last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = sample0;\n            dst[1] = sample1;\n            dst[2] = sample2;\n            dst[3] = sample3;\n            dst += 4;\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            sample1 = (Uint8) ((((Sint16) src[1]) + ((Sint16) last_sample1)) >> 1);\n            sample2 = (Uint8) ((((Sint16) src[2]) + ((Sint16) last_sample2)) >> 1);\n            sample3 = (Uint8) ((((Sint16) src[3]) + ((Sint16) last_sample3)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U8, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 96;\n    const int dstsize = (int) (((double)(cvt->len_cvt/6)) * cvt->rate_incr) * 6;\n    register int eps = 0;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 6;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Uint8 sample5 = src[5];\n    Uint8 sample4 = src[4];\n    Uint8 sample3 = src[3];\n    Uint8 sample2 = src[2];\n    Uint8 sample1 = src[1];\n    Uint8 sample0 = src[0];\n    Uint8 last_sample5 = sample5;\n    Uint8 last_sample4 = sample4;\n    Uint8 last_sample3 = sample3;\n    Uint8 last_sample2 = sample2;\n    Uint8 last_sample1 = sample1;\n    Uint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = sample5;\n        dst[4] = sample4;\n        dst[3] = sample3;\n        dst[2] = sample2;\n        dst[1] = sample1;\n        dst[0] = sample0;\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (Uint8) ((((Sint16) src[5]) + ((Sint16) last_sample5)) >> 1);\n            sample4 = (Uint8) ((((Sint16) src[4]) + ((Sint16) last_sample4)) >> 1);\n            sample3 = (Uint8) ((((Sint16) src[3]) + ((Sint16) last_sample3)) >> 1);\n            sample2 = (Uint8) ((((Sint16) src[2]) + ((Sint16) last_sample2)) >> 1);\n            sample1 = (Uint8) ((((Sint16) src[1]) + ((Sint16) last_sample1)) >> 1);\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U8, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 96;\n    const int dstsize = (int) (((double)(cvt->len_cvt/6)) * cvt->rate_incr) * 6;\n    register int eps = 0;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Uint8 sample0 = src[0];\n    Uint8 sample1 = src[1];\n    Uint8 sample2 = src[2];\n    Uint8 sample3 = src[3];\n    Uint8 sample4 = src[4];\n    Uint8 sample5 = src[5];\n    Uint8 last_sample0 = sample0;\n    Uint8 last_sample1 = sample1;\n    Uint8 last_sample2 = sample2;\n    Uint8 last_sample3 = sample3;\n    Uint8 last_sample4 = sample4;\n    Uint8 last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = sample0;\n            dst[1] = sample1;\n            dst[2] = sample2;\n            dst[3] = sample3;\n            dst[4] = sample4;\n            dst[5] = sample5;\n            dst += 6;\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            sample1 = (Uint8) ((((Sint16) src[1]) + ((Sint16) last_sample1)) >> 1);\n            sample2 = (Uint8) ((((Sint16) src[2]) + ((Sint16) last_sample2)) >> 1);\n            sample3 = (Uint8) ((((Sint16) src[3]) + ((Sint16) last_sample3)) >> 1);\n            sample4 = (Uint8) ((((Sint16) src[4]) + ((Sint16) last_sample4)) >> 1);\n            sample5 = (Uint8) ((((Sint16) src[5]) + ((Sint16) last_sample5)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U8, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 8;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Uint8 sample7 = src[7];\n    Uint8 sample6 = src[6];\n    Uint8 sample5 = src[5];\n    Uint8 sample4 = src[4];\n    Uint8 sample3 = src[3];\n    Uint8 sample2 = src[2];\n    Uint8 sample1 = src[1];\n    Uint8 sample0 = src[0];\n    Uint8 last_sample7 = sample7;\n    Uint8 last_sample6 = sample6;\n    Uint8 last_sample5 = sample5;\n    Uint8 last_sample4 = sample4;\n    Uint8 last_sample3 = sample3;\n    Uint8 last_sample2 = sample2;\n    Uint8 last_sample1 = sample1;\n    Uint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = sample7;\n        dst[6] = sample6;\n        dst[5] = sample5;\n        dst[4] = sample4;\n        dst[3] = sample3;\n        dst[2] = sample2;\n        dst[1] = sample1;\n        dst[0] = sample0;\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (Uint8) ((((Sint16) src[7]) + ((Sint16) last_sample7)) >> 1);\n            sample6 = (Uint8) ((((Sint16) src[6]) + ((Sint16) last_sample6)) >> 1);\n            sample5 = (Uint8) ((((Sint16) src[5]) + ((Sint16) last_sample5)) >> 1);\n            sample4 = (Uint8) ((((Sint16) src[4]) + ((Sint16) last_sample4)) >> 1);\n            sample3 = (Uint8) ((((Sint16) src[3]) + ((Sint16) last_sample3)) >> 1);\n            sample2 = (Uint8) ((((Sint16) src[2]) + ((Sint16) last_sample2)) >> 1);\n            sample1 = (Uint8) ((((Sint16) src[1]) + ((Sint16) last_sample1)) >> 1);\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U8, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Uint8 sample0 = src[0];\n    Uint8 sample1 = src[1];\n    Uint8 sample2 = src[2];\n    Uint8 sample3 = src[3];\n    Uint8 sample4 = src[4];\n    Uint8 sample5 = src[5];\n    Uint8 sample6 = src[6];\n    Uint8 sample7 = src[7];\n    Uint8 last_sample0 = sample0;\n    Uint8 last_sample1 = sample1;\n    Uint8 last_sample2 = sample2;\n    Uint8 last_sample3 = sample3;\n    Uint8 last_sample4 = sample4;\n    Uint8 last_sample5 = sample5;\n    Uint8 last_sample6 = sample6;\n    Uint8 last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = sample0;\n            dst[1] = sample1;\n            dst[2] = sample2;\n            dst[3] = sample3;\n            dst[4] = sample4;\n            dst[5] = sample5;\n            dst[6] = sample6;\n            dst[7] = sample7;\n            dst += 8;\n            sample0 = (Uint8) ((((Sint16) src[0]) + ((Sint16) last_sample0)) >> 1);\n            sample1 = (Uint8) ((((Sint16) src[1]) + ((Sint16) last_sample1)) >> 1);\n            sample2 = (Uint8) ((((Sint16) src[2]) + ((Sint16) last_sample2)) >> 1);\n            sample3 = (Uint8) ((((Sint16) src[3]) + ((Sint16) last_sample3)) >> 1);\n            sample4 = (Uint8) ((((Sint16) src[4]) + ((Sint16) last_sample4)) >> 1);\n            sample5 = (Uint8) ((((Sint16) src[5]) + ((Sint16) last_sample5)) >> 1);\n            sample6 = (Uint8) ((((Sint16) src[6]) + ((Sint16) last_sample6)) >> 1);\n            sample7 = (Uint8) ((((Sint16) src[7]) + ((Sint16) last_sample7)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S8, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 16;\n    const int dstsize = (int) (((double)(cvt->len_cvt/1)) * cvt->rate_incr) * 1;\n    register int eps = 0;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 1;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = ((Sint8) sample0);\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S8, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 16;\n    const int dstsize = (int) (((double)(cvt->len_cvt/1)) * cvt->rate_incr) * 1;\n    register int eps = 0;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint8) sample0);\n            dst++;\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S8, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 2;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint8 sample1 = ((Sint8) src[1]);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 last_sample1 = sample1;\n    Sint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = ((Sint8) sample1);\n        dst[0] = ((Sint8) sample0);\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (Sint8) ((((Sint16) ((Sint8) src[1])) + ((Sint16) last_sample1)) >> 1);\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S8, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 sample1 = ((Sint8) src[1]);\n    Sint8 last_sample0 = sample0;\n    Sint8 last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint8) sample0);\n            dst[1] = ((Sint8) sample1);\n            dst += 2;\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            sample1 = (Sint8) ((((Sint16) ((Sint8) src[1])) + ((Sint16) last_sample1)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S8, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 4;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint8 sample3 = ((Sint8) src[3]);\n    Sint8 sample2 = ((Sint8) src[2]);\n    Sint8 sample1 = ((Sint8) src[1]);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 last_sample3 = sample3;\n    Sint8 last_sample2 = sample2;\n    Sint8 last_sample1 = sample1;\n    Sint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = ((Sint8) sample3);\n        dst[2] = ((Sint8) sample2);\n        dst[1] = ((Sint8) sample1);\n        dst[0] = ((Sint8) sample0);\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (Sint8) ((((Sint16) ((Sint8) src[3])) + ((Sint16) last_sample3)) >> 1);\n            sample2 = (Sint8) ((((Sint16) ((Sint8) src[2])) + ((Sint16) last_sample2)) >> 1);\n            sample1 = (Sint8) ((((Sint16) ((Sint8) src[1])) + ((Sint16) last_sample1)) >> 1);\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S8, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 sample1 = ((Sint8) src[1]);\n    Sint8 sample2 = ((Sint8) src[2]);\n    Sint8 sample3 = ((Sint8) src[3]);\n    Sint8 last_sample0 = sample0;\n    Sint8 last_sample1 = sample1;\n    Sint8 last_sample2 = sample2;\n    Sint8 last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint8) sample0);\n            dst[1] = ((Sint8) sample1);\n            dst[2] = ((Sint8) sample2);\n            dst[3] = ((Sint8) sample3);\n            dst += 4;\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            sample1 = (Sint8) ((((Sint16) ((Sint8) src[1])) + ((Sint16) last_sample1)) >> 1);\n            sample2 = (Sint8) ((((Sint16) ((Sint8) src[2])) + ((Sint16) last_sample2)) >> 1);\n            sample3 = (Sint8) ((((Sint16) ((Sint8) src[3])) + ((Sint16) last_sample3)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S8, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 96;\n    const int dstsize = (int) (((double)(cvt->len_cvt/6)) * cvt->rate_incr) * 6;\n    register int eps = 0;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 6;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint8 sample5 = ((Sint8) src[5]);\n    Sint8 sample4 = ((Sint8) src[4]);\n    Sint8 sample3 = ((Sint8) src[3]);\n    Sint8 sample2 = ((Sint8) src[2]);\n    Sint8 sample1 = ((Sint8) src[1]);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 last_sample5 = sample5;\n    Sint8 last_sample4 = sample4;\n    Sint8 last_sample3 = sample3;\n    Sint8 last_sample2 = sample2;\n    Sint8 last_sample1 = sample1;\n    Sint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = ((Sint8) sample5);\n        dst[4] = ((Sint8) sample4);\n        dst[3] = ((Sint8) sample3);\n        dst[2] = ((Sint8) sample2);\n        dst[1] = ((Sint8) sample1);\n        dst[0] = ((Sint8) sample0);\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (Sint8) ((((Sint16) ((Sint8) src[5])) + ((Sint16) last_sample5)) >> 1);\n            sample4 = (Sint8) ((((Sint16) ((Sint8) src[4])) + ((Sint16) last_sample4)) >> 1);\n            sample3 = (Sint8) ((((Sint16) ((Sint8) src[3])) + ((Sint16) last_sample3)) >> 1);\n            sample2 = (Sint8) ((((Sint16) ((Sint8) src[2])) + ((Sint16) last_sample2)) >> 1);\n            sample1 = (Sint8) ((((Sint16) ((Sint8) src[1])) + ((Sint16) last_sample1)) >> 1);\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S8, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 96;\n    const int dstsize = (int) (((double)(cvt->len_cvt/6)) * cvt->rate_incr) * 6;\n    register int eps = 0;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 sample1 = ((Sint8) src[1]);\n    Sint8 sample2 = ((Sint8) src[2]);\n    Sint8 sample3 = ((Sint8) src[3]);\n    Sint8 sample4 = ((Sint8) src[4]);\n    Sint8 sample5 = ((Sint8) src[5]);\n    Sint8 last_sample0 = sample0;\n    Sint8 last_sample1 = sample1;\n    Sint8 last_sample2 = sample2;\n    Sint8 last_sample3 = sample3;\n    Sint8 last_sample4 = sample4;\n    Sint8 last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint8) sample0);\n            dst[1] = ((Sint8) sample1);\n            dst[2] = ((Sint8) sample2);\n            dst[3] = ((Sint8) sample3);\n            dst[4] = ((Sint8) sample4);\n            dst[5] = ((Sint8) sample5);\n            dst += 6;\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            sample1 = (Sint8) ((((Sint16) ((Sint8) src[1])) + ((Sint16) last_sample1)) >> 1);\n            sample2 = (Sint8) ((((Sint16) ((Sint8) src[2])) + ((Sint16) last_sample2)) >> 1);\n            sample3 = (Sint8) ((((Sint16) ((Sint8) src[3])) + ((Sint16) last_sample3)) >> 1);\n            sample4 = (Sint8) ((((Sint16) ((Sint8) src[4])) + ((Sint16) last_sample4)) >> 1);\n            sample5 = (Sint8) ((((Sint16) ((Sint8) src[5])) + ((Sint16) last_sample5)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S8, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 8;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint8 sample7 = ((Sint8) src[7]);\n    Sint8 sample6 = ((Sint8) src[6]);\n    Sint8 sample5 = ((Sint8) src[5]);\n    Sint8 sample4 = ((Sint8) src[4]);\n    Sint8 sample3 = ((Sint8) src[3]);\n    Sint8 sample2 = ((Sint8) src[2]);\n    Sint8 sample1 = ((Sint8) src[1]);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 last_sample7 = sample7;\n    Sint8 last_sample6 = sample6;\n    Sint8 last_sample5 = sample5;\n    Sint8 last_sample4 = sample4;\n    Sint8 last_sample3 = sample3;\n    Sint8 last_sample2 = sample2;\n    Sint8 last_sample1 = sample1;\n    Sint8 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = ((Sint8) sample7);\n        dst[6] = ((Sint8) sample6);\n        dst[5] = ((Sint8) sample5);\n        dst[4] = ((Sint8) sample4);\n        dst[3] = ((Sint8) sample3);\n        dst[2] = ((Sint8) sample2);\n        dst[1] = ((Sint8) sample1);\n        dst[0] = ((Sint8) sample0);\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (Sint8) ((((Sint16) ((Sint8) src[7])) + ((Sint16) last_sample7)) >> 1);\n            sample6 = (Sint8) ((((Sint16) ((Sint8) src[6])) + ((Sint16) last_sample6)) >> 1);\n            sample5 = (Sint8) ((((Sint16) ((Sint8) src[5])) + ((Sint16) last_sample5)) >> 1);\n            sample4 = (Sint8) ((((Sint16) ((Sint8) src[4])) + ((Sint16) last_sample4)) >> 1);\n            sample3 = (Sint8) ((((Sint16) ((Sint8) src[3])) + ((Sint16) last_sample3)) >> 1);\n            sample2 = (Sint8) ((((Sint16) ((Sint8) src[2])) + ((Sint16) last_sample2)) >> 1);\n            sample1 = (Sint8) ((((Sint16) ((Sint8) src[1])) + ((Sint16) last_sample1)) >> 1);\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S8, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint8 sample0 = ((Sint8) src[0]);\n    Sint8 sample1 = ((Sint8) src[1]);\n    Sint8 sample2 = ((Sint8) src[2]);\n    Sint8 sample3 = ((Sint8) src[3]);\n    Sint8 sample4 = ((Sint8) src[4]);\n    Sint8 sample5 = ((Sint8) src[5]);\n    Sint8 sample6 = ((Sint8) src[6]);\n    Sint8 sample7 = ((Sint8) src[7]);\n    Sint8 last_sample0 = sample0;\n    Sint8 last_sample1 = sample1;\n    Sint8 last_sample2 = sample2;\n    Sint8 last_sample3 = sample3;\n    Sint8 last_sample4 = sample4;\n    Sint8 last_sample5 = sample5;\n    Sint8 last_sample6 = sample6;\n    Sint8 last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint8) sample0);\n            dst[1] = ((Sint8) sample1);\n            dst[2] = ((Sint8) sample2);\n            dst[3] = ((Sint8) sample3);\n            dst[4] = ((Sint8) sample4);\n            dst[5] = ((Sint8) sample5);\n            dst[6] = ((Sint8) sample6);\n            dst[7] = ((Sint8) sample7);\n            dst += 8;\n            sample0 = (Sint8) ((((Sint16) ((Sint8) src[0])) + ((Sint16) last_sample0)) >> 1);\n            sample1 = (Sint8) ((((Sint16) ((Sint8) src[1])) + ((Sint16) last_sample1)) >> 1);\n            sample2 = (Sint8) ((((Sint16) ((Sint8) src[2])) + ((Sint16) last_sample2)) >> 1);\n            sample3 = (Sint8) ((((Sint16) ((Sint8) src[3])) + ((Sint16) last_sample3)) >> 1);\n            sample4 = (Sint8) ((((Sint16) ((Sint8) src[4])) + ((Sint16) last_sample4)) >> 1);\n            sample5 = (Sint8) ((((Sint16) ((Sint8) src[5])) + ((Sint16) last_sample5)) >> 1);\n            sample6 = (Sint8) ((((Sint16) ((Sint8) src[6])) + ((Sint16) last_sample6)) >> 1);\n            sample7 = (Sint8) ((((Sint16) ((Sint8) src[7])) + ((Sint16) last_sample7)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16LSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 1;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = SDL_SwapLE16(sample0);\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16LSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapLE16(sample0);\n            dst++;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16LSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample1 = SDL_SwapLE16(src[1]);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = SDL_SwapLE16(sample1);\n        dst[0] = SDL_SwapLE16(sample0);\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (Uint16) ((((Sint32) SDL_SwapLE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16LSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 sample1 = SDL_SwapLE16(src[1]);\n    Uint16 last_sample0 = sample0;\n    Uint16 last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapLE16(sample0);\n            dst[1] = SDL_SwapLE16(sample1);\n            dst += 2;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapLE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16LSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample3 = SDL_SwapLE16(src[3]);\n    Uint16 sample2 = SDL_SwapLE16(src[2]);\n    Uint16 sample1 = SDL_SwapLE16(src[1]);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = SDL_SwapLE16(sample3);\n        dst[2] = SDL_SwapLE16(sample2);\n        dst[1] = SDL_SwapLE16(sample1);\n        dst[0] = SDL_SwapLE16(sample0);\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (Uint16) ((((Sint32) SDL_SwapLE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapLE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapLE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16LSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 sample1 = SDL_SwapLE16(src[1]);\n    Uint16 sample2 = SDL_SwapLE16(src[2]);\n    Uint16 sample3 = SDL_SwapLE16(src[3]);\n    Uint16 last_sample0 = sample0;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapLE16(sample0);\n            dst[1] = SDL_SwapLE16(sample1);\n            dst[2] = SDL_SwapLE16(sample2);\n            dst[3] = SDL_SwapLE16(sample3);\n            dst += 4;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapLE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapLE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapLE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16LSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 192;\n    const int dstsize = (int) (((double)(cvt->len_cvt/12)) * cvt->rate_incr) * 12;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 6;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample5 = SDL_SwapLE16(src[5]);\n    Uint16 sample4 = SDL_SwapLE16(src[4]);\n    Uint16 sample3 = SDL_SwapLE16(src[3]);\n    Uint16 sample2 = SDL_SwapLE16(src[2]);\n    Uint16 sample1 = SDL_SwapLE16(src[1]);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 last_sample5 = sample5;\n    Uint16 last_sample4 = sample4;\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = SDL_SwapLE16(sample5);\n        dst[4] = SDL_SwapLE16(sample4);\n        dst[3] = SDL_SwapLE16(sample3);\n        dst[2] = SDL_SwapLE16(sample2);\n        dst[1] = SDL_SwapLE16(sample1);\n        dst[0] = SDL_SwapLE16(sample0);\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (Uint16) ((((Sint32) SDL_SwapLE16(src[5])) + ((Sint32) last_sample5)) >> 1);\n            sample4 = (Uint16) ((((Sint32) SDL_SwapLE16(src[4])) + ((Sint32) last_sample4)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapLE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapLE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapLE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16LSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 192;\n    const int dstsize = (int) (((double)(cvt->len_cvt/12)) * cvt->rate_incr) * 12;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 sample1 = SDL_SwapLE16(src[1]);\n    Uint16 sample2 = SDL_SwapLE16(src[2]);\n    Uint16 sample3 = SDL_SwapLE16(src[3]);\n    Uint16 sample4 = SDL_SwapLE16(src[4]);\n    Uint16 sample5 = SDL_SwapLE16(src[5]);\n    Uint16 last_sample0 = sample0;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample4 = sample4;\n    Uint16 last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapLE16(sample0);\n            dst[1] = SDL_SwapLE16(sample1);\n            dst[2] = SDL_SwapLE16(sample2);\n            dst[3] = SDL_SwapLE16(sample3);\n            dst[4] = SDL_SwapLE16(sample4);\n            dst[5] = SDL_SwapLE16(sample5);\n            dst += 6;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapLE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapLE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapLE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample4 = (Uint16) ((((Sint32) SDL_SwapLE16(src[4])) + ((Sint32) last_sample4)) >> 1);\n            sample5 = (Uint16) ((((Sint32) SDL_SwapLE16(src[5])) + ((Sint32) last_sample5)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16LSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 8;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample7 = SDL_SwapLE16(src[7]);\n    Uint16 sample6 = SDL_SwapLE16(src[6]);\n    Uint16 sample5 = SDL_SwapLE16(src[5]);\n    Uint16 sample4 = SDL_SwapLE16(src[4]);\n    Uint16 sample3 = SDL_SwapLE16(src[3]);\n    Uint16 sample2 = SDL_SwapLE16(src[2]);\n    Uint16 sample1 = SDL_SwapLE16(src[1]);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 last_sample7 = sample7;\n    Uint16 last_sample6 = sample6;\n    Uint16 last_sample5 = sample5;\n    Uint16 last_sample4 = sample4;\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = SDL_SwapLE16(sample7);\n        dst[6] = SDL_SwapLE16(sample6);\n        dst[5] = SDL_SwapLE16(sample5);\n        dst[4] = SDL_SwapLE16(sample4);\n        dst[3] = SDL_SwapLE16(sample3);\n        dst[2] = SDL_SwapLE16(sample2);\n        dst[1] = SDL_SwapLE16(sample1);\n        dst[0] = SDL_SwapLE16(sample0);\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (Uint16) ((((Sint32) SDL_SwapLE16(src[7])) + ((Sint32) last_sample7)) >> 1);\n            sample6 = (Uint16) ((((Sint32) SDL_SwapLE16(src[6])) + ((Sint32) last_sample6)) >> 1);\n            sample5 = (Uint16) ((((Sint32) SDL_SwapLE16(src[5])) + ((Sint32) last_sample5)) >> 1);\n            sample4 = (Uint16) ((((Sint32) SDL_SwapLE16(src[4])) + ((Sint32) last_sample4)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapLE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapLE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapLE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16LSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapLE16(src[0]);\n    Uint16 sample1 = SDL_SwapLE16(src[1]);\n    Uint16 sample2 = SDL_SwapLE16(src[2]);\n    Uint16 sample3 = SDL_SwapLE16(src[3]);\n    Uint16 sample4 = SDL_SwapLE16(src[4]);\n    Uint16 sample5 = SDL_SwapLE16(src[5]);\n    Uint16 sample6 = SDL_SwapLE16(src[6]);\n    Uint16 sample7 = SDL_SwapLE16(src[7]);\n    Uint16 last_sample0 = sample0;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample4 = sample4;\n    Uint16 last_sample5 = sample5;\n    Uint16 last_sample6 = sample6;\n    Uint16 last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapLE16(sample0);\n            dst[1] = SDL_SwapLE16(sample1);\n            dst[2] = SDL_SwapLE16(sample2);\n            dst[3] = SDL_SwapLE16(sample3);\n            dst[4] = SDL_SwapLE16(sample4);\n            dst[5] = SDL_SwapLE16(sample5);\n            dst[6] = SDL_SwapLE16(sample6);\n            dst[7] = SDL_SwapLE16(sample7);\n            dst += 8;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapLE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapLE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapLE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapLE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample4 = (Uint16) ((((Sint32) SDL_SwapLE16(src[4])) + ((Sint32) last_sample4)) >> 1);\n            sample5 = (Uint16) ((((Sint32) SDL_SwapLE16(src[5])) + ((Sint32) last_sample5)) >> 1);\n            sample6 = (Uint16) ((((Sint32) SDL_SwapLE16(src[6])) + ((Sint32) last_sample6)) >> 1);\n            sample7 = (Uint16) ((((Sint32) SDL_SwapLE16(src[7])) + ((Sint32) last_sample7)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16LSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 1;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16LSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n            dst++;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16LSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample1 = ((Sint16) SDL_SwapLE16(src[1]));\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = ((Sint16) SDL_SwapLE16(sample1));\n        dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16LSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 sample1 = ((Sint16) SDL_SwapLE16(src[1]));\n    Sint16 last_sample0 = sample0;\n    Sint16 last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n            dst[1] = ((Sint16) SDL_SwapLE16(sample1));\n            dst += 2;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16LSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample3 = ((Sint16) SDL_SwapLE16(src[3]));\n    Sint16 sample2 = ((Sint16) SDL_SwapLE16(src[2]));\n    Sint16 sample1 = ((Sint16) SDL_SwapLE16(src[1]));\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = ((Sint16) SDL_SwapLE16(sample3));\n        dst[2] = ((Sint16) SDL_SwapLE16(sample2));\n        dst[1] = ((Sint16) SDL_SwapLE16(sample1));\n        dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16LSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 sample1 = ((Sint16) SDL_SwapLE16(src[1]));\n    Sint16 sample2 = ((Sint16) SDL_SwapLE16(src[2]));\n    Sint16 sample3 = ((Sint16) SDL_SwapLE16(src[3]));\n    Sint16 last_sample0 = sample0;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n            dst[1] = ((Sint16) SDL_SwapLE16(sample1));\n            dst[2] = ((Sint16) SDL_SwapLE16(sample2));\n            dst[3] = ((Sint16) SDL_SwapLE16(sample3));\n            dst += 4;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16LSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 192;\n    const int dstsize = (int) (((double)(cvt->len_cvt/12)) * cvt->rate_incr) * 12;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 6;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample5 = ((Sint16) SDL_SwapLE16(src[5]));\n    Sint16 sample4 = ((Sint16) SDL_SwapLE16(src[4]));\n    Sint16 sample3 = ((Sint16) SDL_SwapLE16(src[3]));\n    Sint16 sample2 = ((Sint16) SDL_SwapLE16(src[2]));\n    Sint16 sample1 = ((Sint16) SDL_SwapLE16(src[1]));\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 last_sample5 = sample5;\n    Sint16 last_sample4 = sample4;\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = ((Sint16) SDL_SwapLE16(sample5));\n        dst[4] = ((Sint16) SDL_SwapLE16(sample4));\n        dst[3] = ((Sint16) SDL_SwapLE16(sample3));\n        dst[2] = ((Sint16) SDL_SwapLE16(sample2));\n        dst[1] = ((Sint16) SDL_SwapLE16(sample1));\n        dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[5]))) + ((Sint32) last_sample5)) >> 1);\n            sample4 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[4]))) + ((Sint32) last_sample4)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16LSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 192;\n    const int dstsize = (int) (((double)(cvt->len_cvt/12)) * cvt->rate_incr) * 12;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 sample1 = ((Sint16) SDL_SwapLE16(src[1]));\n    Sint16 sample2 = ((Sint16) SDL_SwapLE16(src[2]));\n    Sint16 sample3 = ((Sint16) SDL_SwapLE16(src[3]));\n    Sint16 sample4 = ((Sint16) SDL_SwapLE16(src[4]));\n    Sint16 sample5 = ((Sint16) SDL_SwapLE16(src[5]));\n    Sint16 last_sample0 = sample0;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample4 = sample4;\n    Sint16 last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n            dst[1] = ((Sint16) SDL_SwapLE16(sample1));\n            dst[2] = ((Sint16) SDL_SwapLE16(sample2));\n            dst[3] = ((Sint16) SDL_SwapLE16(sample3));\n            dst[4] = ((Sint16) SDL_SwapLE16(sample4));\n            dst[5] = ((Sint16) SDL_SwapLE16(sample5));\n            dst += 6;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample4 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[4]))) + ((Sint32) last_sample4)) >> 1);\n            sample5 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[5]))) + ((Sint32) last_sample5)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16LSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 8;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample7 = ((Sint16) SDL_SwapLE16(src[7]));\n    Sint16 sample6 = ((Sint16) SDL_SwapLE16(src[6]));\n    Sint16 sample5 = ((Sint16) SDL_SwapLE16(src[5]));\n    Sint16 sample4 = ((Sint16) SDL_SwapLE16(src[4]));\n    Sint16 sample3 = ((Sint16) SDL_SwapLE16(src[3]));\n    Sint16 sample2 = ((Sint16) SDL_SwapLE16(src[2]));\n    Sint16 sample1 = ((Sint16) SDL_SwapLE16(src[1]));\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 last_sample7 = sample7;\n    Sint16 last_sample6 = sample6;\n    Sint16 last_sample5 = sample5;\n    Sint16 last_sample4 = sample4;\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = ((Sint16) SDL_SwapLE16(sample7));\n        dst[6] = ((Sint16) SDL_SwapLE16(sample6));\n        dst[5] = ((Sint16) SDL_SwapLE16(sample5));\n        dst[4] = ((Sint16) SDL_SwapLE16(sample4));\n        dst[3] = ((Sint16) SDL_SwapLE16(sample3));\n        dst[2] = ((Sint16) SDL_SwapLE16(sample2));\n        dst[1] = ((Sint16) SDL_SwapLE16(sample1));\n        dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[7]))) + ((Sint32) last_sample7)) >> 1);\n            sample6 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[6]))) + ((Sint32) last_sample6)) >> 1);\n            sample5 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[5]))) + ((Sint32) last_sample5)) >> 1);\n            sample4 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[4]))) + ((Sint32) last_sample4)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16LSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapLE16(src[0]));\n    Sint16 sample1 = ((Sint16) SDL_SwapLE16(src[1]));\n    Sint16 sample2 = ((Sint16) SDL_SwapLE16(src[2]));\n    Sint16 sample3 = ((Sint16) SDL_SwapLE16(src[3]));\n    Sint16 sample4 = ((Sint16) SDL_SwapLE16(src[4]));\n    Sint16 sample5 = ((Sint16) SDL_SwapLE16(src[5]));\n    Sint16 sample6 = ((Sint16) SDL_SwapLE16(src[6]));\n    Sint16 sample7 = ((Sint16) SDL_SwapLE16(src[7]));\n    Sint16 last_sample0 = sample0;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample4 = sample4;\n    Sint16 last_sample5 = sample5;\n    Sint16 last_sample6 = sample6;\n    Sint16 last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapLE16(sample0));\n            dst[1] = ((Sint16) SDL_SwapLE16(sample1));\n            dst[2] = ((Sint16) SDL_SwapLE16(sample2));\n            dst[3] = ((Sint16) SDL_SwapLE16(sample3));\n            dst[4] = ((Sint16) SDL_SwapLE16(sample4));\n            dst[5] = ((Sint16) SDL_SwapLE16(sample5));\n            dst[6] = ((Sint16) SDL_SwapLE16(sample6));\n            dst[7] = ((Sint16) SDL_SwapLE16(sample7));\n            dst += 8;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample4 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[4]))) + ((Sint32) last_sample4)) >> 1);\n            sample5 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[5]))) + ((Sint32) last_sample5)) >> 1);\n            sample6 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[6]))) + ((Sint32) last_sample6)) >> 1);\n            sample7 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapLE16(src[7]))) + ((Sint32) last_sample7)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16MSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 1;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = SDL_SwapBE16(sample0);\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16MSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapBE16(sample0);\n            dst++;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16MSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample1 = SDL_SwapBE16(src[1]);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = SDL_SwapBE16(sample1);\n        dst[0] = SDL_SwapBE16(sample0);\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (Uint16) ((((Sint32) SDL_SwapBE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16MSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 sample1 = SDL_SwapBE16(src[1]);\n    Uint16 last_sample0 = sample0;\n    Uint16 last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapBE16(sample0);\n            dst[1] = SDL_SwapBE16(sample1);\n            dst += 2;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapBE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16MSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample3 = SDL_SwapBE16(src[3]);\n    Uint16 sample2 = SDL_SwapBE16(src[2]);\n    Uint16 sample1 = SDL_SwapBE16(src[1]);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = SDL_SwapBE16(sample3);\n        dst[2] = SDL_SwapBE16(sample2);\n        dst[1] = SDL_SwapBE16(sample1);\n        dst[0] = SDL_SwapBE16(sample0);\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (Uint16) ((((Sint32) SDL_SwapBE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapBE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapBE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16MSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 sample1 = SDL_SwapBE16(src[1]);\n    Uint16 sample2 = SDL_SwapBE16(src[2]);\n    Uint16 sample3 = SDL_SwapBE16(src[3]);\n    Uint16 last_sample0 = sample0;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapBE16(sample0);\n            dst[1] = SDL_SwapBE16(sample1);\n            dst[2] = SDL_SwapBE16(sample2);\n            dst[3] = SDL_SwapBE16(sample3);\n            dst += 4;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapBE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapBE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapBE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16MSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 192;\n    const int dstsize = (int) (((double)(cvt->len_cvt/12)) * cvt->rate_incr) * 12;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 6;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample5 = SDL_SwapBE16(src[5]);\n    Uint16 sample4 = SDL_SwapBE16(src[4]);\n    Uint16 sample3 = SDL_SwapBE16(src[3]);\n    Uint16 sample2 = SDL_SwapBE16(src[2]);\n    Uint16 sample1 = SDL_SwapBE16(src[1]);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 last_sample5 = sample5;\n    Uint16 last_sample4 = sample4;\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = SDL_SwapBE16(sample5);\n        dst[4] = SDL_SwapBE16(sample4);\n        dst[3] = SDL_SwapBE16(sample3);\n        dst[2] = SDL_SwapBE16(sample2);\n        dst[1] = SDL_SwapBE16(sample1);\n        dst[0] = SDL_SwapBE16(sample0);\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (Uint16) ((((Sint32) SDL_SwapBE16(src[5])) + ((Sint32) last_sample5)) >> 1);\n            sample4 = (Uint16) ((((Sint32) SDL_SwapBE16(src[4])) + ((Sint32) last_sample4)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapBE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapBE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapBE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16MSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 192;\n    const int dstsize = (int) (((double)(cvt->len_cvt/12)) * cvt->rate_incr) * 12;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 sample1 = SDL_SwapBE16(src[1]);\n    Uint16 sample2 = SDL_SwapBE16(src[2]);\n    Uint16 sample3 = SDL_SwapBE16(src[3]);\n    Uint16 sample4 = SDL_SwapBE16(src[4]);\n    Uint16 sample5 = SDL_SwapBE16(src[5]);\n    Uint16 last_sample0 = sample0;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample4 = sample4;\n    Uint16 last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapBE16(sample0);\n            dst[1] = SDL_SwapBE16(sample1);\n            dst[2] = SDL_SwapBE16(sample2);\n            dst[3] = SDL_SwapBE16(sample3);\n            dst[4] = SDL_SwapBE16(sample4);\n            dst[5] = SDL_SwapBE16(sample5);\n            dst += 6;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapBE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapBE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapBE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample4 = (Uint16) ((((Sint32) SDL_SwapBE16(src[4])) + ((Sint32) last_sample4)) >> 1);\n            sample5 = (Uint16) ((((Sint32) SDL_SwapBE16(src[5])) + ((Sint32) last_sample5)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_U16MSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 8;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Uint16 sample7 = SDL_SwapBE16(src[7]);\n    Uint16 sample6 = SDL_SwapBE16(src[6]);\n    Uint16 sample5 = SDL_SwapBE16(src[5]);\n    Uint16 sample4 = SDL_SwapBE16(src[4]);\n    Uint16 sample3 = SDL_SwapBE16(src[3]);\n    Uint16 sample2 = SDL_SwapBE16(src[2]);\n    Uint16 sample1 = SDL_SwapBE16(src[1]);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 last_sample7 = sample7;\n    Uint16 last_sample6 = sample6;\n    Uint16 last_sample5 = sample5;\n    Uint16 last_sample4 = sample4;\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = SDL_SwapBE16(sample7);\n        dst[6] = SDL_SwapBE16(sample6);\n        dst[5] = SDL_SwapBE16(sample5);\n        dst[4] = SDL_SwapBE16(sample4);\n        dst[3] = SDL_SwapBE16(sample3);\n        dst[2] = SDL_SwapBE16(sample2);\n        dst[1] = SDL_SwapBE16(sample1);\n        dst[0] = SDL_SwapBE16(sample0);\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (Uint16) ((((Sint32) SDL_SwapBE16(src[7])) + ((Sint32) last_sample7)) >> 1);\n            sample6 = (Uint16) ((((Sint32) SDL_SwapBE16(src[6])) + ((Sint32) last_sample6)) >> 1);\n            sample5 = (Uint16) ((((Sint32) SDL_SwapBE16(src[5])) + ((Sint32) last_sample5)) >> 1);\n            sample4 = (Uint16) ((((Sint32) SDL_SwapBE16(src[4])) + ((Sint32) last_sample4)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapBE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapBE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapBE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_U16MSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Uint16 sample0 = SDL_SwapBE16(src[0]);\n    Uint16 sample1 = SDL_SwapBE16(src[1]);\n    Uint16 sample2 = SDL_SwapBE16(src[2]);\n    Uint16 sample3 = SDL_SwapBE16(src[3]);\n    Uint16 sample4 = SDL_SwapBE16(src[4]);\n    Uint16 sample5 = SDL_SwapBE16(src[5]);\n    Uint16 sample6 = SDL_SwapBE16(src[6]);\n    Uint16 sample7 = SDL_SwapBE16(src[7]);\n    Uint16 last_sample0 = sample0;\n    Uint16 last_sample1 = sample1;\n    Uint16 last_sample2 = sample2;\n    Uint16 last_sample3 = sample3;\n    Uint16 last_sample4 = sample4;\n    Uint16 last_sample5 = sample5;\n    Uint16 last_sample6 = sample6;\n    Uint16 last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapBE16(sample0);\n            dst[1] = SDL_SwapBE16(sample1);\n            dst[2] = SDL_SwapBE16(sample2);\n            dst[3] = SDL_SwapBE16(sample3);\n            dst[4] = SDL_SwapBE16(sample4);\n            dst[5] = SDL_SwapBE16(sample5);\n            dst[6] = SDL_SwapBE16(sample6);\n            dst[7] = SDL_SwapBE16(sample7);\n            dst += 8;\n            sample0 = (Uint16) ((((Sint32) SDL_SwapBE16(src[0])) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Uint16) ((((Sint32) SDL_SwapBE16(src[1])) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Uint16) ((((Sint32) SDL_SwapBE16(src[2])) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Uint16) ((((Sint32) SDL_SwapBE16(src[3])) + ((Sint32) last_sample3)) >> 1);\n            sample4 = (Uint16) ((((Sint32) SDL_SwapBE16(src[4])) + ((Sint32) last_sample4)) >> 1);\n            sample5 = (Uint16) ((((Sint32) SDL_SwapBE16(src[5])) + ((Sint32) last_sample5)) >> 1);\n            sample6 = (Uint16) ((((Sint32) SDL_SwapBE16(src[6])) + ((Sint32) last_sample6)) >> 1);\n            sample7 = (Uint16) ((((Sint32) SDL_SwapBE16(src[7])) + ((Sint32) last_sample7)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16MSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 1;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16MSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 32;\n    const int dstsize = (int) (((double)(cvt->len_cvt/2)) * cvt->rate_incr) * 2;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n            dst++;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16MSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample1 = ((Sint16) SDL_SwapBE16(src[1]));\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = ((Sint16) SDL_SwapBE16(sample1));\n        dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16MSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 sample1 = ((Sint16) SDL_SwapBE16(src[1]));\n    Sint16 last_sample0 = sample0;\n    Sint16 last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n            dst[1] = ((Sint16) SDL_SwapBE16(sample1));\n            dst += 2;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16MSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample3 = ((Sint16) SDL_SwapBE16(src[3]));\n    Sint16 sample2 = ((Sint16) SDL_SwapBE16(src[2]));\n    Sint16 sample1 = ((Sint16) SDL_SwapBE16(src[1]));\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = ((Sint16) SDL_SwapBE16(sample3));\n        dst[2] = ((Sint16) SDL_SwapBE16(sample2));\n        dst[1] = ((Sint16) SDL_SwapBE16(sample1));\n        dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16MSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 sample1 = ((Sint16) SDL_SwapBE16(src[1]));\n    Sint16 sample2 = ((Sint16) SDL_SwapBE16(src[2]));\n    Sint16 sample3 = ((Sint16) SDL_SwapBE16(src[3]));\n    Sint16 last_sample0 = sample0;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n            dst[1] = ((Sint16) SDL_SwapBE16(sample1));\n            dst[2] = ((Sint16) SDL_SwapBE16(sample2));\n            dst[3] = ((Sint16) SDL_SwapBE16(sample3));\n            dst += 4;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16MSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 192;\n    const int dstsize = (int) (((double)(cvt->len_cvt/12)) * cvt->rate_incr) * 12;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 6;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample5 = ((Sint16) SDL_SwapBE16(src[5]));\n    Sint16 sample4 = ((Sint16) SDL_SwapBE16(src[4]));\n    Sint16 sample3 = ((Sint16) SDL_SwapBE16(src[3]));\n    Sint16 sample2 = ((Sint16) SDL_SwapBE16(src[2]));\n    Sint16 sample1 = ((Sint16) SDL_SwapBE16(src[1]));\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 last_sample5 = sample5;\n    Sint16 last_sample4 = sample4;\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = ((Sint16) SDL_SwapBE16(sample5));\n        dst[4] = ((Sint16) SDL_SwapBE16(sample4));\n        dst[3] = ((Sint16) SDL_SwapBE16(sample3));\n        dst[2] = ((Sint16) SDL_SwapBE16(sample2));\n        dst[1] = ((Sint16) SDL_SwapBE16(sample1));\n        dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[5]))) + ((Sint32) last_sample5)) >> 1);\n            sample4 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[4]))) + ((Sint32) last_sample4)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16MSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 192;\n    const int dstsize = (int) (((double)(cvt->len_cvt/12)) * cvt->rate_incr) * 12;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 sample1 = ((Sint16) SDL_SwapBE16(src[1]));\n    Sint16 sample2 = ((Sint16) SDL_SwapBE16(src[2]));\n    Sint16 sample3 = ((Sint16) SDL_SwapBE16(src[3]));\n    Sint16 sample4 = ((Sint16) SDL_SwapBE16(src[4]));\n    Sint16 sample5 = ((Sint16) SDL_SwapBE16(src[5]));\n    Sint16 last_sample0 = sample0;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample4 = sample4;\n    Sint16 last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n            dst[1] = ((Sint16) SDL_SwapBE16(sample1));\n            dst[2] = ((Sint16) SDL_SwapBE16(sample2));\n            dst[3] = ((Sint16) SDL_SwapBE16(sample3));\n            dst[4] = ((Sint16) SDL_SwapBE16(sample4));\n            dst[5] = ((Sint16) SDL_SwapBE16(sample5));\n            dst += 6;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample4 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[4]))) + ((Sint32) last_sample4)) >> 1);\n            sample5 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[5]))) + ((Sint32) last_sample5)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S16MSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 8;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint16 sample7 = ((Sint16) SDL_SwapBE16(src[7]));\n    Sint16 sample6 = ((Sint16) SDL_SwapBE16(src[6]));\n    Sint16 sample5 = ((Sint16) SDL_SwapBE16(src[5]));\n    Sint16 sample4 = ((Sint16) SDL_SwapBE16(src[4]));\n    Sint16 sample3 = ((Sint16) SDL_SwapBE16(src[3]));\n    Sint16 sample2 = ((Sint16) SDL_SwapBE16(src[2]));\n    Sint16 sample1 = ((Sint16) SDL_SwapBE16(src[1]));\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 last_sample7 = sample7;\n    Sint16 last_sample6 = sample6;\n    Sint16 last_sample5 = sample5;\n    Sint16 last_sample4 = sample4;\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = ((Sint16) SDL_SwapBE16(sample7));\n        dst[6] = ((Sint16) SDL_SwapBE16(sample6));\n        dst[5] = ((Sint16) SDL_SwapBE16(sample5));\n        dst[4] = ((Sint16) SDL_SwapBE16(sample4));\n        dst[3] = ((Sint16) SDL_SwapBE16(sample3));\n        dst[2] = ((Sint16) SDL_SwapBE16(sample2));\n        dst[1] = ((Sint16) SDL_SwapBE16(sample1));\n        dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[7]))) + ((Sint32) last_sample7)) >> 1);\n            sample6 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[6]))) + ((Sint32) last_sample6)) >> 1);\n            sample5 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[5]))) + ((Sint32) last_sample5)) >> 1);\n            sample4 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[4]))) + ((Sint32) last_sample4)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S16MSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint16 sample0 = ((Sint16) SDL_SwapBE16(src[0]));\n    Sint16 sample1 = ((Sint16) SDL_SwapBE16(src[1]));\n    Sint16 sample2 = ((Sint16) SDL_SwapBE16(src[2]));\n    Sint16 sample3 = ((Sint16) SDL_SwapBE16(src[3]));\n    Sint16 sample4 = ((Sint16) SDL_SwapBE16(src[4]));\n    Sint16 sample5 = ((Sint16) SDL_SwapBE16(src[5]));\n    Sint16 sample6 = ((Sint16) SDL_SwapBE16(src[6]));\n    Sint16 sample7 = ((Sint16) SDL_SwapBE16(src[7]));\n    Sint16 last_sample0 = sample0;\n    Sint16 last_sample1 = sample1;\n    Sint16 last_sample2 = sample2;\n    Sint16 last_sample3 = sample3;\n    Sint16 last_sample4 = sample4;\n    Sint16 last_sample5 = sample5;\n    Sint16 last_sample6 = sample6;\n    Sint16 last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint16) SDL_SwapBE16(sample0));\n            dst[1] = ((Sint16) SDL_SwapBE16(sample1));\n            dst[2] = ((Sint16) SDL_SwapBE16(sample2));\n            dst[3] = ((Sint16) SDL_SwapBE16(sample3));\n            dst[4] = ((Sint16) SDL_SwapBE16(sample4));\n            dst[5] = ((Sint16) SDL_SwapBE16(sample5));\n            dst[6] = ((Sint16) SDL_SwapBE16(sample6));\n            dst[7] = ((Sint16) SDL_SwapBE16(sample7));\n            dst += 8;\n            sample0 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[0]))) + ((Sint32) last_sample0)) >> 1);\n            sample1 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[1]))) + ((Sint32) last_sample1)) >> 1);\n            sample2 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[2]))) + ((Sint32) last_sample2)) >> 1);\n            sample3 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[3]))) + ((Sint32) last_sample3)) >> 1);\n            sample4 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[4]))) + ((Sint32) last_sample4)) >> 1);\n            sample5 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[5]))) + ((Sint32) last_sample5)) >> 1);\n            sample6 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[6]))) + ((Sint32) last_sample6)) >> 1);\n            sample7 = (Sint16) ((((Sint32) ((Sint16) SDL_SwapBE16(src[7]))) + ((Sint32) last_sample7)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32LSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 1;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32LSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n            dst++;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32LSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample1 = ((Sint32) SDL_SwapLE32(src[1]));\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = ((Sint32) SDL_SwapLE32(sample1));\n        dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32LSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 sample1 = ((Sint32) SDL_SwapLE32(src[1]));\n    Sint32 last_sample0 = sample0;\n    Sint32 last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n            dst[1] = ((Sint32) SDL_SwapLE32(sample1));\n            dst += 2;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32LSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample3 = ((Sint32) SDL_SwapLE32(src[3]));\n    Sint32 sample2 = ((Sint32) SDL_SwapLE32(src[2]));\n    Sint32 sample1 = ((Sint32) SDL_SwapLE32(src[1]));\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = ((Sint32) SDL_SwapLE32(sample3));\n        dst[2] = ((Sint32) SDL_SwapLE32(sample2));\n        dst[1] = ((Sint32) SDL_SwapLE32(sample1));\n        dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32LSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 sample1 = ((Sint32) SDL_SwapLE32(src[1]));\n    Sint32 sample2 = ((Sint32) SDL_SwapLE32(src[2]));\n    Sint32 sample3 = ((Sint32) SDL_SwapLE32(src[3]));\n    Sint32 last_sample0 = sample0;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n            dst[1] = ((Sint32) SDL_SwapLE32(sample1));\n            dst[2] = ((Sint32) SDL_SwapLE32(sample2));\n            dst[3] = ((Sint32) SDL_SwapLE32(sample3));\n            dst += 4;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32LSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 384;\n    const int dstsize = (int) (((double)(cvt->len_cvt/24)) * cvt->rate_incr) * 24;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 6;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample5 = ((Sint32) SDL_SwapLE32(src[5]));\n    Sint32 sample4 = ((Sint32) SDL_SwapLE32(src[4]));\n    Sint32 sample3 = ((Sint32) SDL_SwapLE32(src[3]));\n    Sint32 sample2 = ((Sint32) SDL_SwapLE32(src[2]));\n    Sint32 sample1 = ((Sint32) SDL_SwapLE32(src[1]));\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 last_sample5 = sample5;\n    Sint32 last_sample4 = sample4;\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = ((Sint32) SDL_SwapLE32(sample5));\n        dst[4] = ((Sint32) SDL_SwapLE32(sample4));\n        dst[3] = ((Sint32) SDL_SwapLE32(sample3));\n        dst[2] = ((Sint32) SDL_SwapLE32(sample2));\n        dst[1] = ((Sint32) SDL_SwapLE32(sample1));\n        dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[5]))) + ((Sint64) last_sample5)) >> 1);\n            sample4 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[4]))) + ((Sint64) last_sample4)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32LSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 384;\n    const int dstsize = (int) (((double)(cvt->len_cvt/24)) * cvt->rate_incr) * 24;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 sample1 = ((Sint32) SDL_SwapLE32(src[1]));\n    Sint32 sample2 = ((Sint32) SDL_SwapLE32(src[2]));\n    Sint32 sample3 = ((Sint32) SDL_SwapLE32(src[3]));\n    Sint32 sample4 = ((Sint32) SDL_SwapLE32(src[4]));\n    Sint32 sample5 = ((Sint32) SDL_SwapLE32(src[5]));\n    Sint32 last_sample0 = sample0;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample4 = sample4;\n    Sint32 last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n            dst[1] = ((Sint32) SDL_SwapLE32(sample1));\n            dst[2] = ((Sint32) SDL_SwapLE32(sample2));\n            dst[3] = ((Sint32) SDL_SwapLE32(sample3));\n            dst[4] = ((Sint32) SDL_SwapLE32(sample4));\n            dst[5] = ((Sint32) SDL_SwapLE32(sample5));\n            dst += 6;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample4 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[4]))) + ((Sint64) last_sample4)) >> 1);\n            sample5 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[5]))) + ((Sint64) last_sample5)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32LSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 512;\n    const int dstsize = (int) (((double)(cvt->len_cvt/32)) * cvt->rate_incr) * 32;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 8;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample7 = ((Sint32) SDL_SwapLE32(src[7]));\n    Sint32 sample6 = ((Sint32) SDL_SwapLE32(src[6]));\n    Sint32 sample5 = ((Sint32) SDL_SwapLE32(src[5]));\n    Sint32 sample4 = ((Sint32) SDL_SwapLE32(src[4]));\n    Sint32 sample3 = ((Sint32) SDL_SwapLE32(src[3]));\n    Sint32 sample2 = ((Sint32) SDL_SwapLE32(src[2]));\n    Sint32 sample1 = ((Sint32) SDL_SwapLE32(src[1]));\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 last_sample7 = sample7;\n    Sint32 last_sample6 = sample6;\n    Sint32 last_sample5 = sample5;\n    Sint32 last_sample4 = sample4;\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = ((Sint32) SDL_SwapLE32(sample7));\n        dst[6] = ((Sint32) SDL_SwapLE32(sample6));\n        dst[5] = ((Sint32) SDL_SwapLE32(sample5));\n        dst[4] = ((Sint32) SDL_SwapLE32(sample4));\n        dst[3] = ((Sint32) SDL_SwapLE32(sample3));\n        dst[2] = ((Sint32) SDL_SwapLE32(sample2));\n        dst[1] = ((Sint32) SDL_SwapLE32(sample1));\n        dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[7]))) + ((Sint64) last_sample7)) >> 1);\n            sample6 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[6]))) + ((Sint64) last_sample6)) >> 1);\n            sample5 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[5]))) + ((Sint64) last_sample5)) >> 1);\n            sample4 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[4]))) + ((Sint64) last_sample4)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32LSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 512;\n    const int dstsize = (int) (((double)(cvt->len_cvt/32)) * cvt->rate_incr) * 32;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapLE32(src[0]));\n    Sint32 sample1 = ((Sint32) SDL_SwapLE32(src[1]));\n    Sint32 sample2 = ((Sint32) SDL_SwapLE32(src[2]));\n    Sint32 sample3 = ((Sint32) SDL_SwapLE32(src[3]));\n    Sint32 sample4 = ((Sint32) SDL_SwapLE32(src[4]));\n    Sint32 sample5 = ((Sint32) SDL_SwapLE32(src[5]));\n    Sint32 sample6 = ((Sint32) SDL_SwapLE32(src[6]));\n    Sint32 sample7 = ((Sint32) SDL_SwapLE32(src[7]));\n    Sint32 last_sample0 = sample0;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample4 = sample4;\n    Sint32 last_sample5 = sample5;\n    Sint32 last_sample6 = sample6;\n    Sint32 last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapLE32(sample0));\n            dst[1] = ((Sint32) SDL_SwapLE32(sample1));\n            dst[2] = ((Sint32) SDL_SwapLE32(sample2));\n            dst[3] = ((Sint32) SDL_SwapLE32(sample3));\n            dst[4] = ((Sint32) SDL_SwapLE32(sample4));\n            dst[5] = ((Sint32) SDL_SwapLE32(sample5));\n            dst[6] = ((Sint32) SDL_SwapLE32(sample6));\n            dst[7] = ((Sint32) SDL_SwapLE32(sample7));\n            dst += 8;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample4 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[4]))) + ((Sint64) last_sample4)) >> 1);\n            sample5 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[5]))) + ((Sint64) last_sample5)) >> 1);\n            sample6 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[6]))) + ((Sint64) last_sample6)) >> 1);\n            sample7 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapLE32(src[7]))) + ((Sint64) last_sample7)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32MSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 1;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32MSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n            dst++;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32MSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample1 = ((Sint32) SDL_SwapBE32(src[1]));\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = ((Sint32) SDL_SwapBE32(sample1));\n        dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32MSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 sample1 = ((Sint32) SDL_SwapBE32(src[1]));\n    Sint32 last_sample0 = sample0;\n    Sint32 last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n            dst[1] = ((Sint32) SDL_SwapBE32(sample1));\n            dst += 2;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32MSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample3 = ((Sint32) SDL_SwapBE32(src[3]));\n    Sint32 sample2 = ((Sint32) SDL_SwapBE32(src[2]));\n    Sint32 sample1 = ((Sint32) SDL_SwapBE32(src[1]));\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = ((Sint32) SDL_SwapBE32(sample3));\n        dst[2] = ((Sint32) SDL_SwapBE32(sample2));\n        dst[1] = ((Sint32) SDL_SwapBE32(sample1));\n        dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32MSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 sample1 = ((Sint32) SDL_SwapBE32(src[1]));\n    Sint32 sample2 = ((Sint32) SDL_SwapBE32(src[2]));\n    Sint32 sample3 = ((Sint32) SDL_SwapBE32(src[3]));\n    Sint32 last_sample0 = sample0;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n            dst[1] = ((Sint32) SDL_SwapBE32(sample1));\n            dst[2] = ((Sint32) SDL_SwapBE32(sample2));\n            dst[3] = ((Sint32) SDL_SwapBE32(sample3));\n            dst += 4;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32MSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 384;\n    const int dstsize = (int) (((double)(cvt->len_cvt/24)) * cvt->rate_incr) * 24;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 6;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample5 = ((Sint32) SDL_SwapBE32(src[5]));\n    Sint32 sample4 = ((Sint32) SDL_SwapBE32(src[4]));\n    Sint32 sample3 = ((Sint32) SDL_SwapBE32(src[3]));\n    Sint32 sample2 = ((Sint32) SDL_SwapBE32(src[2]));\n    Sint32 sample1 = ((Sint32) SDL_SwapBE32(src[1]));\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 last_sample5 = sample5;\n    Sint32 last_sample4 = sample4;\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = ((Sint32) SDL_SwapBE32(sample5));\n        dst[4] = ((Sint32) SDL_SwapBE32(sample4));\n        dst[3] = ((Sint32) SDL_SwapBE32(sample3));\n        dst[2] = ((Sint32) SDL_SwapBE32(sample2));\n        dst[1] = ((Sint32) SDL_SwapBE32(sample1));\n        dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[5]))) + ((Sint64) last_sample5)) >> 1);\n            sample4 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[4]))) + ((Sint64) last_sample4)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32MSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 384;\n    const int dstsize = (int) (((double)(cvt->len_cvt/24)) * cvt->rate_incr) * 24;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 sample1 = ((Sint32) SDL_SwapBE32(src[1]));\n    Sint32 sample2 = ((Sint32) SDL_SwapBE32(src[2]));\n    Sint32 sample3 = ((Sint32) SDL_SwapBE32(src[3]));\n    Sint32 sample4 = ((Sint32) SDL_SwapBE32(src[4]));\n    Sint32 sample5 = ((Sint32) SDL_SwapBE32(src[5]));\n    Sint32 last_sample0 = sample0;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample4 = sample4;\n    Sint32 last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n            dst[1] = ((Sint32) SDL_SwapBE32(sample1));\n            dst[2] = ((Sint32) SDL_SwapBE32(sample2));\n            dst[3] = ((Sint32) SDL_SwapBE32(sample3));\n            dst[4] = ((Sint32) SDL_SwapBE32(sample4));\n            dst[5] = ((Sint32) SDL_SwapBE32(sample5));\n            dst += 6;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample4 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[4]))) + ((Sint64) last_sample4)) >> 1);\n            sample5 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[5]))) + ((Sint64) last_sample5)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_S32MSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 512;\n    const int dstsize = (int) (((double)(cvt->len_cvt/32)) * cvt->rate_incr) * 32;\n    register int eps = 0;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 8;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint32 sample7 = ((Sint32) SDL_SwapBE32(src[7]));\n    Sint32 sample6 = ((Sint32) SDL_SwapBE32(src[6]));\n    Sint32 sample5 = ((Sint32) SDL_SwapBE32(src[5]));\n    Sint32 sample4 = ((Sint32) SDL_SwapBE32(src[4]));\n    Sint32 sample3 = ((Sint32) SDL_SwapBE32(src[3]));\n    Sint32 sample2 = ((Sint32) SDL_SwapBE32(src[2]));\n    Sint32 sample1 = ((Sint32) SDL_SwapBE32(src[1]));\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 last_sample7 = sample7;\n    Sint32 last_sample6 = sample6;\n    Sint32 last_sample5 = sample5;\n    Sint32 last_sample4 = sample4;\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = ((Sint32) SDL_SwapBE32(sample7));\n        dst[6] = ((Sint32) SDL_SwapBE32(sample6));\n        dst[5] = ((Sint32) SDL_SwapBE32(sample5));\n        dst[4] = ((Sint32) SDL_SwapBE32(sample4));\n        dst[3] = ((Sint32) SDL_SwapBE32(sample3));\n        dst[2] = ((Sint32) SDL_SwapBE32(sample2));\n        dst[1] = ((Sint32) SDL_SwapBE32(sample1));\n        dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[7]))) + ((Sint64) last_sample7)) >> 1);\n            sample6 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[6]))) + ((Sint64) last_sample6)) >> 1);\n            sample5 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[5]))) + ((Sint64) last_sample5)) >> 1);\n            sample4 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[4]))) + ((Sint64) last_sample4)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_S32MSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 512;\n    const int dstsize = (int) (((double)(cvt->len_cvt/32)) * cvt->rate_incr) * 32;\n    register int eps = 0;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint32 sample0 = ((Sint32) SDL_SwapBE32(src[0]));\n    Sint32 sample1 = ((Sint32) SDL_SwapBE32(src[1]));\n    Sint32 sample2 = ((Sint32) SDL_SwapBE32(src[2]));\n    Sint32 sample3 = ((Sint32) SDL_SwapBE32(src[3]));\n    Sint32 sample4 = ((Sint32) SDL_SwapBE32(src[4]));\n    Sint32 sample5 = ((Sint32) SDL_SwapBE32(src[5]));\n    Sint32 sample6 = ((Sint32) SDL_SwapBE32(src[6]));\n    Sint32 sample7 = ((Sint32) SDL_SwapBE32(src[7]));\n    Sint32 last_sample0 = sample0;\n    Sint32 last_sample1 = sample1;\n    Sint32 last_sample2 = sample2;\n    Sint32 last_sample3 = sample3;\n    Sint32 last_sample4 = sample4;\n    Sint32 last_sample5 = sample5;\n    Sint32 last_sample6 = sample6;\n    Sint32 last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = ((Sint32) SDL_SwapBE32(sample0));\n            dst[1] = ((Sint32) SDL_SwapBE32(sample1));\n            dst[2] = ((Sint32) SDL_SwapBE32(sample2));\n            dst[3] = ((Sint32) SDL_SwapBE32(sample3));\n            dst[4] = ((Sint32) SDL_SwapBE32(sample4));\n            dst[5] = ((Sint32) SDL_SwapBE32(sample5));\n            dst[6] = ((Sint32) SDL_SwapBE32(sample6));\n            dst[7] = ((Sint32) SDL_SwapBE32(sample7));\n            dst += 8;\n            sample0 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[0]))) + ((Sint64) last_sample0)) >> 1);\n            sample1 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[1]))) + ((Sint64) last_sample1)) >> 1);\n            sample2 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[2]))) + ((Sint64) last_sample2)) >> 1);\n            sample3 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[3]))) + ((Sint64) last_sample3)) >> 1);\n            sample4 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[4]))) + ((Sint64) last_sample4)) >> 1);\n            sample5 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[5]))) + ((Sint64) last_sample5)) >> 1);\n            sample6 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[6]))) + ((Sint64) last_sample6)) >> 1);\n            sample7 = (Sint32) ((((Sint64) ((Sint32) SDL_SwapBE32(src[7]))) + ((Sint64) last_sample7)) >> 1);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32LSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 1;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 1;\n    const float *target = ((const float *) cvt->buf);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = SDL_SwapFloatLE(sample0);\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32LSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatLE(sample0);\n            dst++;\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32LSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 2;\n    const float *target = ((const float *) cvt->buf);\n    float sample1 = SDL_SwapFloatLE(src[1]);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float last_sample1 = sample1;\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = SDL_SwapFloatLE(sample1);\n        dst[0] = SDL_SwapFloatLE(sample0);\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (float) ((((double) SDL_SwapFloatLE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32LSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float sample1 = SDL_SwapFloatLE(src[1]);\n    float last_sample0 = sample0;\n    float last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatLE(sample0);\n            dst[1] = SDL_SwapFloatLE(sample1);\n            dst += 2;\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatLE(src[1])) + ((double) last_sample1)) * 0.5);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32LSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 4;\n    const float *target = ((const float *) cvt->buf);\n    float sample3 = SDL_SwapFloatLE(src[3]);\n    float sample2 = SDL_SwapFloatLE(src[2]);\n    float sample1 = SDL_SwapFloatLE(src[1]);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float last_sample3 = sample3;\n    float last_sample2 = sample2;\n    float last_sample1 = sample1;\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = SDL_SwapFloatLE(sample3);\n        dst[2] = SDL_SwapFloatLE(sample2);\n        dst[1] = SDL_SwapFloatLE(sample1);\n        dst[0] = SDL_SwapFloatLE(sample0);\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (float) ((((double) SDL_SwapFloatLE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatLE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatLE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32LSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float sample1 = SDL_SwapFloatLE(src[1]);\n    float sample2 = SDL_SwapFloatLE(src[2]);\n    float sample3 = SDL_SwapFloatLE(src[3]);\n    float last_sample0 = sample0;\n    float last_sample1 = sample1;\n    float last_sample2 = sample2;\n    float last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatLE(sample0);\n            dst[1] = SDL_SwapFloatLE(sample1);\n            dst[2] = SDL_SwapFloatLE(sample2);\n            dst[3] = SDL_SwapFloatLE(sample3);\n            dst += 4;\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatLE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatLE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatLE(src[3])) + ((double) last_sample3)) * 0.5);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32LSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 384;\n    const int dstsize = (int) (((double)(cvt->len_cvt/24)) * cvt->rate_incr) * 24;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 6;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 6;\n    const float *target = ((const float *) cvt->buf);\n    float sample5 = SDL_SwapFloatLE(src[5]);\n    float sample4 = SDL_SwapFloatLE(src[4]);\n    float sample3 = SDL_SwapFloatLE(src[3]);\n    float sample2 = SDL_SwapFloatLE(src[2]);\n    float sample1 = SDL_SwapFloatLE(src[1]);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float last_sample5 = sample5;\n    float last_sample4 = sample4;\n    float last_sample3 = sample3;\n    float last_sample2 = sample2;\n    float last_sample1 = sample1;\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = SDL_SwapFloatLE(sample5);\n        dst[4] = SDL_SwapFloatLE(sample4);\n        dst[3] = SDL_SwapFloatLE(sample3);\n        dst[2] = SDL_SwapFloatLE(sample2);\n        dst[1] = SDL_SwapFloatLE(sample1);\n        dst[0] = SDL_SwapFloatLE(sample0);\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (float) ((((double) SDL_SwapFloatLE(src[5])) + ((double) last_sample5)) * 0.5);\n            sample4 = (float) ((((double) SDL_SwapFloatLE(src[4])) + ((double) last_sample4)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatLE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatLE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatLE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32LSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 384;\n    const int dstsize = (int) (((double)(cvt->len_cvt/24)) * cvt->rate_incr) * 24;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float sample1 = SDL_SwapFloatLE(src[1]);\n    float sample2 = SDL_SwapFloatLE(src[2]);\n    float sample3 = SDL_SwapFloatLE(src[3]);\n    float sample4 = SDL_SwapFloatLE(src[4]);\n    float sample5 = SDL_SwapFloatLE(src[5]);\n    float last_sample0 = sample0;\n    float last_sample1 = sample1;\n    float last_sample2 = sample2;\n    float last_sample3 = sample3;\n    float last_sample4 = sample4;\n    float last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatLE(sample0);\n            dst[1] = SDL_SwapFloatLE(sample1);\n            dst[2] = SDL_SwapFloatLE(sample2);\n            dst[3] = SDL_SwapFloatLE(sample3);\n            dst[4] = SDL_SwapFloatLE(sample4);\n            dst[5] = SDL_SwapFloatLE(sample5);\n            dst += 6;\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatLE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatLE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatLE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample4 = (float) ((((double) SDL_SwapFloatLE(src[4])) + ((double) last_sample4)) * 0.5);\n            sample5 = (float) ((((double) SDL_SwapFloatLE(src[5])) + ((double) last_sample5)) * 0.5);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32LSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 512;\n    const int dstsize = (int) (((double)(cvt->len_cvt/32)) * cvt->rate_incr) * 32;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 8;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 8;\n    const float *target = ((const float *) cvt->buf);\n    float sample7 = SDL_SwapFloatLE(src[7]);\n    float sample6 = SDL_SwapFloatLE(src[6]);\n    float sample5 = SDL_SwapFloatLE(src[5]);\n    float sample4 = SDL_SwapFloatLE(src[4]);\n    float sample3 = SDL_SwapFloatLE(src[3]);\n    float sample2 = SDL_SwapFloatLE(src[2]);\n    float sample1 = SDL_SwapFloatLE(src[1]);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float last_sample7 = sample7;\n    float last_sample6 = sample6;\n    float last_sample5 = sample5;\n    float last_sample4 = sample4;\n    float last_sample3 = sample3;\n    float last_sample2 = sample2;\n    float last_sample1 = sample1;\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = SDL_SwapFloatLE(sample7);\n        dst[6] = SDL_SwapFloatLE(sample6);\n        dst[5] = SDL_SwapFloatLE(sample5);\n        dst[4] = SDL_SwapFloatLE(sample4);\n        dst[3] = SDL_SwapFloatLE(sample3);\n        dst[2] = SDL_SwapFloatLE(sample2);\n        dst[1] = SDL_SwapFloatLE(sample1);\n        dst[0] = SDL_SwapFloatLE(sample0);\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (float) ((((double) SDL_SwapFloatLE(src[7])) + ((double) last_sample7)) * 0.5);\n            sample6 = (float) ((((double) SDL_SwapFloatLE(src[6])) + ((double) last_sample6)) * 0.5);\n            sample5 = (float) ((((double) SDL_SwapFloatLE(src[5])) + ((double) last_sample5)) * 0.5);\n            sample4 = (float) ((((double) SDL_SwapFloatLE(src[4])) + ((double) last_sample4)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatLE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatLE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatLE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32LSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 512;\n    const int dstsize = (int) (((double)(cvt->len_cvt/32)) * cvt->rate_incr) * 32;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatLE(src[0]);\n    float sample1 = SDL_SwapFloatLE(src[1]);\n    float sample2 = SDL_SwapFloatLE(src[2]);\n    float sample3 = SDL_SwapFloatLE(src[3]);\n    float sample4 = SDL_SwapFloatLE(src[4]);\n    float sample5 = SDL_SwapFloatLE(src[5]);\n    float sample6 = SDL_SwapFloatLE(src[6]);\n    float sample7 = SDL_SwapFloatLE(src[7]);\n    float last_sample0 = sample0;\n    float last_sample1 = sample1;\n    float last_sample2 = sample2;\n    float last_sample3 = sample3;\n    float last_sample4 = sample4;\n    float last_sample5 = sample5;\n    float last_sample6 = sample6;\n    float last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatLE(sample0);\n            dst[1] = SDL_SwapFloatLE(sample1);\n            dst[2] = SDL_SwapFloatLE(sample2);\n            dst[3] = SDL_SwapFloatLE(sample3);\n            dst[4] = SDL_SwapFloatLE(sample4);\n            dst[5] = SDL_SwapFloatLE(sample5);\n            dst[6] = SDL_SwapFloatLE(sample6);\n            dst[7] = SDL_SwapFloatLE(sample7);\n            dst += 8;\n            sample0 = (float) ((((double) SDL_SwapFloatLE(src[0])) + ((double) last_sample0)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatLE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatLE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatLE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample4 = (float) ((((double) SDL_SwapFloatLE(src[4])) + ((double) last_sample4)) * 0.5);\n            sample5 = (float) ((((double) SDL_SwapFloatLE(src[5])) + ((double) last_sample5)) * 0.5);\n            sample6 = (float) ((((double) SDL_SwapFloatLE(src[6])) + ((double) last_sample6)) * 0.5);\n            sample7 = (float) ((((double) SDL_SwapFloatLE(src[7])) + ((double) last_sample7)) * 0.5);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32MSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 1;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 1;\n    const float *target = ((const float *) cvt->buf);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[0] = SDL_SwapFloatBE(sample0);\n        dst--;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src--;\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_1c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32MSB, 1 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 64;\n    const int dstsize = (int) (((double)(cvt->len_cvt/4)) * cvt->rate_incr) * 4;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float last_sample0 = sample0;\n    while (dst < target) {\n        src++;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatBE(sample0);\n            dst++;\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample0 = sample0;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32MSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 2;\n    const float *target = ((const float *) cvt->buf);\n    float sample1 = SDL_SwapFloatBE(src[1]);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float last_sample1 = sample1;\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[1] = SDL_SwapFloatBE(sample1);\n        dst[0] = SDL_SwapFloatBE(sample0);\n        dst -= 2;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 2;\n            sample1 = (float) ((((double) SDL_SwapFloatBE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_2c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32MSB, 2 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 128;\n    const int dstsize = (int) (((double)(cvt->len_cvt/8)) * cvt->rate_incr) * 8;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float sample1 = SDL_SwapFloatBE(src[1]);\n    float last_sample0 = sample0;\n    float last_sample1 = sample1;\n    while (dst < target) {\n        src += 2;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatBE(sample0);\n            dst[1] = SDL_SwapFloatBE(sample1);\n            dst += 2;\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatBE(src[1])) + ((double) last_sample1)) * 0.5);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32MSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 4;\n    const float *target = ((const float *) cvt->buf);\n    float sample3 = SDL_SwapFloatBE(src[3]);\n    float sample2 = SDL_SwapFloatBE(src[2]);\n    float sample1 = SDL_SwapFloatBE(src[1]);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float last_sample3 = sample3;\n    float last_sample2 = sample2;\n    float last_sample1 = sample1;\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[3] = SDL_SwapFloatBE(sample3);\n        dst[2] = SDL_SwapFloatBE(sample2);\n        dst[1] = SDL_SwapFloatBE(sample1);\n        dst[0] = SDL_SwapFloatBE(sample0);\n        dst -= 4;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 4;\n            sample3 = (float) ((((double) SDL_SwapFloatBE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatBE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatBE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_4c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32MSB, 4 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 256;\n    const int dstsize = (int) (((double)(cvt->len_cvt/16)) * cvt->rate_incr) * 16;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float sample1 = SDL_SwapFloatBE(src[1]);\n    float sample2 = SDL_SwapFloatBE(src[2]);\n    float sample3 = SDL_SwapFloatBE(src[3]);\n    float last_sample0 = sample0;\n    float last_sample1 = sample1;\n    float last_sample2 = sample2;\n    float last_sample3 = sample3;\n    while (dst < target) {\n        src += 4;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatBE(sample0);\n            dst[1] = SDL_SwapFloatBE(sample1);\n            dst[2] = SDL_SwapFloatBE(sample2);\n            dst[3] = SDL_SwapFloatBE(sample3);\n            dst += 4;\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatBE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatBE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatBE(src[3])) + ((double) last_sample3)) * 0.5);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32MSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 384;\n    const int dstsize = (int) (((double)(cvt->len_cvt/24)) * cvt->rate_incr) * 24;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 6;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 6;\n    const float *target = ((const float *) cvt->buf);\n    float sample5 = SDL_SwapFloatBE(src[5]);\n    float sample4 = SDL_SwapFloatBE(src[4]);\n    float sample3 = SDL_SwapFloatBE(src[3]);\n    float sample2 = SDL_SwapFloatBE(src[2]);\n    float sample1 = SDL_SwapFloatBE(src[1]);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float last_sample5 = sample5;\n    float last_sample4 = sample4;\n    float last_sample3 = sample3;\n    float last_sample2 = sample2;\n    float last_sample1 = sample1;\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[5] = SDL_SwapFloatBE(sample5);\n        dst[4] = SDL_SwapFloatBE(sample4);\n        dst[3] = SDL_SwapFloatBE(sample3);\n        dst[2] = SDL_SwapFloatBE(sample2);\n        dst[1] = SDL_SwapFloatBE(sample1);\n        dst[0] = SDL_SwapFloatBE(sample0);\n        dst -= 6;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 6;\n            sample5 = (float) ((((double) SDL_SwapFloatBE(src[5])) + ((double) last_sample5)) * 0.5);\n            sample4 = (float) ((((double) SDL_SwapFloatBE(src[4])) + ((double) last_sample4)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatBE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatBE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatBE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_6c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32MSB, 6 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 384;\n    const int dstsize = (int) (((double)(cvt->len_cvt/24)) * cvt->rate_incr) * 24;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float sample1 = SDL_SwapFloatBE(src[1]);\n    float sample2 = SDL_SwapFloatBE(src[2]);\n    float sample3 = SDL_SwapFloatBE(src[3]);\n    float sample4 = SDL_SwapFloatBE(src[4]);\n    float sample5 = SDL_SwapFloatBE(src[5]);\n    float last_sample0 = sample0;\n    float last_sample1 = sample1;\n    float last_sample2 = sample2;\n    float last_sample3 = sample3;\n    float last_sample4 = sample4;\n    float last_sample5 = sample5;\n    while (dst < target) {\n        src += 6;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatBE(sample0);\n            dst[1] = SDL_SwapFloatBE(sample1);\n            dst[2] = SDL_SwapFloatBE(sample2);\n            dst[3] = SDL_SwapFloatBE(sample3);\n            dst[4] = SDL_SwapFloatBE(sample4);\n            dst[5] = SDL_SwapFloatBE(sample5);\n            dst += 6;\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatBE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatBE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatBE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample4 = (float) ((((double) SDL_SwapFloatBE(src[4])) + ((double) last_sample4)) * 0.5);\n            sample5 = (float) ((((double) SDL_SwapFloatBE(src[5])) + ((double) last_sample5)) * 0.5);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample arbitrary (x%f) AUDIO_F32MSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 512;\n    const int dstsize = (int) (((double)(cvt->len_cvt/32)) * cvt->rate_incr) * 32;\n    register int eps = 0;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 8;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 8;\n    const float *target = ((const float *) cvt->buf);\n    float sample7 = SDL_SwapFloatBE(src[7]);\n    float sample6 = SDL_SwapFloatBE(src[6]);\n    float sample5 = SDL_SwapFloatBE(src[5]);\n    float sample4 = SDL_SwapFloatBE(src[4]);\n    float sample3 = SDL_SwapFloatBE(src[3]);\n    float sample2 = SDL_SwapFloatBE(src[2]);\n    float sample1 = SDL_SwapFloatBE(src[1]);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float last_sample7 = sample7;\n    float last_sample6 = sample6;\n    float last_sample5 = sample5;\n    float last_sample4 = sample4;\n    float last_sample3 = sample3;\n    float last_sample2 = sample2;\n    float last_sample1 = sample1;\n    float last_sample0 = sample0;\n    while (dst >= target) {\n        dst[7] = SDL_SwapFloatBE(sample7);\n        dst[6] = SDL_SwapFloatBE(sample6);\n        dst[5] = SDL_SwapFloatBE(sample5);\n        dst[4] = SDL_SwapFloatBE(sample4);\n        dst[3] = SDL_SwapFloatBE(sample3);\n        dst[2] = SDL_SwapFloatBE(sample2);\n        dst[1] = SDL_SwapFloatBE(sample1);\n        dst[0] = SDL_SwapFloatBE(sample0);\n        dst -= 8;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            src -= 8;\n            sample7 = (float) ((((double) SDL_SwapFloatBE(src[7])) + ((double) last_sample7)) * 0.5);\n            sample6 = (float) ((((double) SDL_SwapFloatBE(src[6])) + ((double) last_sample6)) * 0.5);\n            sample5 = (float) ((((double) SDL_SwapFloatBE(src[5])) + ((double) last_sample5)) * 0.5);\n            sample4 = (float) ((((double) SDL_SwapFloatBE(src[4])) + ((double) last_sample4)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatBE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatBE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatBE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            last_sample7 = sample7;\n            last_sample6 = sample6;\n            last_sample5 = sample5;\n            last_sample4 = sample4;\n            last_sample3 = sample3;\n            last_sample2 = sample2;\n            last_sample1 = sample1;\n            last_sample0 = sample0;\n            eps -= dstsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_8c(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample arbitrary (x%f) AUDIO_F32MSB, 8 channels.\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - 512;\n    const int dstsize = (int) (((double)(cvt->len_cvt/32)) * cvt->rate_incr) * 32;\n    register int eps = 0;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    float sample0 = SDL_SwapFloatBE(src[0]);\n    float sample1 = SDL_SwapFloatBE(src[1]);\n    float sample2 = SDL_SwapFloatBE(src[2]);\n    float sample3 = SDL_SwapFloatBE(src[3]);\n    float sample4 = SDL_SwapFloatBE(src[4]);\n    float sample5 = SDL_SwapFloatBE(src[5]);\n    float sample6 = SDL_SwapFloatBE(src[6]);\n    float sample7 = SDL_SwapFloatBE(src[7]);\n    float last_sample0 = sample0;\n    float last_sample1 = sample1;\n    float last_sample2 = sample2;\n    float last_sample3 = sample3;\n    float last_sample4 = sample4;\n    float last_sample5 = sample5;\n    float last_sample6 = sample6;\n    float last_sample7 = sample7;\n    while (dst < target) {\n        src += 8;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\n            dst[0] = SDL_SwapFloatBE(sample0);\n            dst[1] = SDL_SwapFloatBE(sample1);\n            dst[2] = SDL_SwapFloatBE(sample2);\n            dst[3] = SDL_SwapFloatBE(sample3);\n            dst[4] = SDL_SwapFloatBE(sample4);\n            dst[5] = SDL_SwapFloatBE(sample5);\n            dst[6] = SDL_SwapFloatBE(sample6);\n            dst[7] = SDL_SwapFloatBE(sample7);\n            dst += 8;\n            sample0 = (float) ((((double) SDL_SwapFloatBE(src[0])) + ((double) last_sample0)) * 0.5);\n            sample1 = (float) ((((double) SDL_SwapFloatBE(src[1])) + ((double) last_sample1)) * 0.5);\n            sample2 = (float) ((((double) SDL_SwapFloatBE(src[2])) + ((double) last_sample2)) * 0.5);\n            sample3 = (float) ((((double) SDL_SwapFloatBE(src[3])) + ((double) last_sample3)) * 0.5);\n            sample4 = (float) ((((double) SDL_SwapFloatBE(src[4])) + ((double) last_sample4)) * 0.5);\n            sample5 = (float) ((((double) SDL_SwapFloatBE(src[5])) + ((double) last_sample5)) * 0.5);\n            sample6 = (float) ((((double) SDL_SwapFloatBE(src[6])) + ((double) last_sample6)) * 0.5);\n            sample7 = (float) ((((double) SDL_SwapFloatBE(src[7])) + ((double) last_sample7)) * 0.5);\n            last_sample0 = sample0;\n            last_sample1 = sample1;\n            last_sample2 = sample2;\n            last_sample3 = sample3;\n            last_sample4 = sample4;\n            last_sample5 = sample5;\n            last_sample6 = sample6;\n            last_sample7 = sample7;\n            eps -= srcsize;\n        }\n    }\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\n\n#if !LESS_RESAMPLERS\n\nstatic void SDLCALL\nSDL_Upsample_U8_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U8, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 1 * 2;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        src--;\n        dst[1] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[0] = (Uint8) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U8, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        src += 2;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U8, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 1 * 4;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        src--;\n        dst[3] = (Uint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[2] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[0] = (Uint8) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U8, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        src += 4;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U8, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 2 * 2;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample0 = (Sint16) src[0];\n        src -= 2;\n        dst[3] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) sample1;\n        dst[0] = (Uint8) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U8, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    Sint16 last_sample1 = (Sint16) src[1];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        const Sint16 sample1 = (Sint16) src[1];\n        src += 4;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U8, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 2 * 4;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample0 = (Sint16) src[0];\n        src -= 2;\n        dst[7] = (Uint8) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[6] = (Uint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[5] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Uint8) (((3 * sample1) + last_sample1) >> 2);\n        dst[2] = (Uint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[1] = (Uint8) sample1;\n        dst[0] = (Uint8) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U8, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    Sint16 last_sample1 = (Sint16) src[1];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        const Sint16 sample1 = (Sint16) src[1];\n        src += 8;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U8, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 4 * 2;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample0 = (Sint16) src[0];\n        src -= 4;\n        dst[7] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[6] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[5] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Uint8) sample3;\n        dst[2] = (Uint8) sample2;\n        dst[1] = (Uint8) sample1;\n        dst[0] = (Uint8) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U8, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample3 = (Sint16) src[3];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample3 = (Sint16) src[3];\n        src += 8;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint8) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U8, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 4 * 4;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample0 = (Sint16) src[0];\n        src -= 4;\n        dst[15] = (Uint8) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[14] = (Uint8) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[13] = (Uint8) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[12] = (Uint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[11] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Uint8) (((3 * sample3) + last_sample3) >> 2);\n        dst[6] = (Uint8) (((3 * sample2) + last_sample2) >> 2);\n        dst[5] = (Uint8) (((3 * sample1) + last_sample1) >> 2);\n        dst[4] = (Uint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[3] = (Uint8) sample3;\n        dst[2] = (Uint8) sample2;\n        dst[1] = (Uint8) sample1;\n        dst[0] = (Uint8) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U8, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample3 = (Sint16) src[3];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample3 = (Sint16) src[3];\n        src += 16;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint8) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U8, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 6 * 2;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample5 = (Sint16) src[5];\n    Sint16 last_sample4 = (Sint16) src[4];\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample5 = (Sint16) src[5];\n        const Sint16 sample4 = (Sint16) src[4];\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample0 = (Sint16) src[0];\n        src -= 6;\n        dst[11] = (Uint8) ((sample5 + last_sample5) >> 1);\n        dst[10] = (Uint8) ((sample4 + last_sample4) >> 1);\n        dst[9] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[8] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[7] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[6] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[5] = (Uint8) sample5;\n        dst[4] = (Uint8) sample4;\n        dst[3] = (Uint8) sample3;\n        dst[2] = (Uint8) sample2;\n        dst[1] = (Uint8) sample1;\n        dst[0] = (Uint8) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U8, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample4 = (Sint16) src[4];\n    Sint16 last_sample5 = (Sint16) src[5];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample4 = (Sint16) src[4];\n        const Sint16 sample5 = (Sint16) src[5];\n        src += 12;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint8) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint8) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U8, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 6 * 4;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample5 = (Sint16) src[5];\n    Sint16 last_sample4 = (Sint16) src[4];\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample5 = (Sint16) src[5];\n        const Sint16 sample4 = (Sint16) src[4];\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample0 = (Sint16) src[0];\n        src -= 6;\n        dst[23] = (Uint8) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[22] = (Uint8) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[21] = (Uint8) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[20] = (Uint8) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[19] = (Uint8) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[18] = (Uint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[17] = (Uint8) ((sample5 + last_sample5) >> 1);\n        dst[16] = (Uint8) ((sample4 + last_sample4) >> 1);\n        dst[15] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[14] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[13] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[12] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[11] = (Uint8) (((3 * sample5) + last_sample5) >> 2);\n        dst[10] = (Uint8) (((3 * sample4) + last_sample4) >> 2);\n        dst[9] = (Uint8) (((3 * sample3) + last_sample3) >> 2);\n        dst[8] = (Uint8) (((3 * sample2) + last_sample2) >> 2);\n        dst[7] = (Uint8) (((3 * sample1) + last_sample1) >> 2);\n        dst[6] = (Uint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[5] = (Uint8) sample5;\n        dst[4] = (Uint8) sample4;\n        dst[3] = (Uint8) sample3;\n        dst[2] = (Uint8) sample2;\n        dst[1] = (Uint8) sample1;\n        dst[0] = (Uint8) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U8, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample4 = (Sint16) src[4];\n    Sint16 last_sample5 = (Sint16) src[5];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample4 = (Sint16) src[4];\n        const Sint16 sample5 = (Sint16) src[5];\n        src += 24;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint8) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint8) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U8, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 8 * 2;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample7 = (Sint16) src[7];\n    Sint16 last_sample6 = (Sint16) src[6];\n    Sint16 last_sample5 = (Sint16) src[5];\n    Sint16 last_sample4 = (Sint16) src[4];\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample7 = (Sint16) src[7];\n        const Sint16 sample6 = (Sint16) src[6];\n        const Sint16 sample5 = (Sint16) src[5];\n        const Sint16 sample4 = (Sint16) src[4];\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample0 = (Sint16) src[0];\n        src -= 8;\n        dst[15] = (Uint8) ((sample7 + last_sample7) >> 1);\n        dst[14] = (Uint8) ((sample6 + last_sample6) >> 1);\n        dst[13] = (Uint8) ((sample5 + last_sample5) >> 1);\n        dst[12] = (Uint8) ((sample4 + last_sample4) >> 1);\n        dst[11] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Uint8) sample7;\n        dst[6] = (Uint8) sample6;\n        dst[5] = (Uint8) sample5;\n        dst[4] = (Uint8) sample4;\n        dst[3] = (Uint8) sample3;\n        dst[2] = (Uint8) sample2;\n        dst[1] = (Uint8) sample1;\n        dst[0] = (Uint8) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U8, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample4 = (Sint16) src[4];\n    Sint16 last_sample5 = (Sint16) src[5];\n    Sint16 last_sample6 = (Sint16) src[6];\n    Sint16 last_sample7 = (Sint16) src[7];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample4 = (Sint16) src[4];\n        const Sint16 sample5 = (Sint16) src[5];\n        const Sint16 sample6 = (Sint16) src[6];\n        const Sint16 sample7 = (Sint16) src[7];\n        src += 16;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint8) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint8) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Uint8) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Uint8) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U8_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U8, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint8 *dst = ((Uint8 *) (cvt->buf + dstsize)) - 8 * 4;\n    const Uint8 *src = ((Uint8 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Uint8 *target = ((const Uint8 *) cvt->buf);\n    Sint16 last_sample7 = (Sint16) src[7];\n    Sint16 last_sample6 = (Sint16) src[6];\n    Sint16 last_sample5 = (Sint16) src[5];\n    Sint16 last_sample4 = (Sint16) src[4];\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample0 = (Sint16) src[0];\n    while (dst >= target) {\n        const Sint16 sample7 = (Sint16) src[7];\n        const Sint16 sample6 = (Sint16) src[6];\n        const Sint16 sample5 = (Sint16) src[5];\n        const Sint16 sample4 = (Sint16) src[4];\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample0 = (Sint16) src[0];\n        src -= 8;\n        dst[31] = (Uint8) ((sample7 + (3 * last_sample7)) >> 2);\n        dst[30] = (Uint8) ((sample6 + (3 * last_sample6)) >> 2);\n        dst[29] = (Uint8) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[28] = (Uint8) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[27] = (Uint8) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[26] = (Uint8) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[25] = (Uint8) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[24] = (Uint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[23] = (Uint8) ((sample7 + last_sample7) >> 1);\n        dst[22] = (Uint8) ((sample6 + last_sample6) >> 1);\n        dst[21] = (Uint8) ((sample5 + last_sample5) >> 1);\n        dst[20] = (Uint8) ((sample4 + last_sample4) >> 1);\n        dst[19] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[18] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[17] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[16] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[15] = (Uint8) (((3 * sample7) + last_sample7) >> 2);\n        dst[14] = (Uint8) (((3 * sample6) + last_sample6) >> 2);\n        dst[13] = (Uint8) (((3 * sample5) + last_sample5) >> 2);\n        dst[12] = (Uint8) (((3 * sample4) + last_sample4) >> 2);\n        dst[11] = (Uint8) (((3 * sample3) + last_sample3) >> 2);\n        dst[10] = (Uint8) (((3 * sample2) + last_sample2) >> 2);\n        dst[9] = (Uint8) (((3 * sample1) + last_sample1) >> 2);\n        dst[8] = (Uint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[7] = (Uint8) sample7;\n        dst[6] = (Uint8) sample6;\n        dst[5] = (Uint8) sample5;\n        dst[4] = (Uint8) sample4;\n        dst[3] = (Uint8) sample3;\n        dst[2] = (Uint8) sample2;\n        dst[1] = (Uint8) sample1;\n        dst[0] = (Uint8) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U8_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U8, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint8 *dst = (Uint8 *) cvt->buf;\n    const Uint8 *src = (Uint8 *) cvt->buf;\n    const Uint8 *target = (const Uint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) src[0];\n    Sint16 last_sample1 = (Sint16) src[1];\n    Sint16 last_sample2 = (Sint16) src[2];\n    Sint16 last_sample3 = (Sint16) src[3];\n    Sint16 last_sample4 = (Sint16) src[4];\n    Sint16 last_sample5 = (Sint16) src[5];\n    Sint16 last_sample6 = (Sint16) src[6];\n    Sint16 last_sample7 = (Sint16) src[7];\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) src[0];\n        const Sint16 sample1 = (Sint16) src[1];\n        const Sint16 sample2 = (Sint16) src[2];\n        const Sint16 sample3 = (Sint16) src[3];\n        const Sint16 sample4 = (Sint16) src[4];\n        const Sint16 sample5 = (Sint16) src[5];\n        const Sint16 sample6 = (Sint16) src[6];\n        const Sint16 sample7 = (Sint16) src[7];\n        src += 32;\n        dst[0] = (Uint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint8) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint8) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint8) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Uint8) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Uint8) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S8, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 1 * 2;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src--;\n        dst[1] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[0] = (Sint8) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S8, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src += 2;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S8, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 1 * 4;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src--;\n        dst[3] = (Sint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[2] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[0] = (Sint8) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S8, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src += 4;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S8, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 2 * 2;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src -= 2;\n        dst[3] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) sample1;\n        dst[0] = (Sint8) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S8, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        src += 4;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S8, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 2 * 4;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src -= 2;\n        dst[7] = (Sint8) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[6] = (Sint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[5] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint8) (((3 * sample1) + last_sample1) >> 2);\n        dst[2] = (Sint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[1] = (Sint8) sample1;\n        dst[0] = (Sint8) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S8, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        src += 8;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S8, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 4 * 2;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src -= 4;\n        dst[7] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[6] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[5] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint8) sample3;\n        dst[2] = (Sint8) sample2;\n        dst[1] = (Sint8) sample1;\n        dst[0] = (Sint8) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S8, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        src += 8;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint8) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S8, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 4 * 4;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src -= 4;\n        dst[15] = (Sint8) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[14] = (Sint8) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[13] = (Sint8) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[12] = (Sint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[11] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint8) (((3 * sample3) + last_sample3) >> 2);\n        dst[6] = (Sint8) (((3 * sample2) + last_sample2) >> 2);\n        dst[5] = (Sint8) (((3 * sample1) + last_sample1) >> 2);\n        dst[4] = (Sint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[3] = (Sint8) sample3;\n        dst[2] = (Sint8) sample2;\n        dst[1] = (Sint8) sample1;\n        dst[0] = (Sint8) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S8, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        src += 16;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint8) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S8, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 6 * 2;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample5 = (Sint16) ((Sint8) src[5]);\n    Sint16 last_sample4 = (Sint16) ((Sint8) src[4]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample5 = (Sint16) ((Sint8) src[5]);\n        const Sint16 sample4 = (Sint16) ((Sint8) src[4]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src -= 6;\n        dst[11] = (Sint8) ((sample5 + last_sample5) >> 1);\n        dst[10] = (Sint8) ((sample4 + last_sample4) >> 1);\n        dst[9] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[8] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[7] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[6] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[5] = (Sint8) sample5;\n        dst[4] = (Sint8) sample4;\n        dst[3] = (Sint8) sample3;\n        dst[2] = (Sint8) sample2;\n        dst[1] = (Sint8) sample1;\n        dst[0] = (Sint8) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S8, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample4 = (Sint16) ((Sint8) src[4]);\n    Sint16 last_sample5 = (Sint16) ((Sint8) src[5]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample4 = (Sint16) ((Sint8) src[4]);\n        const Sint16 sample5 = (Sint16) ((Sint8) src[5]);\n        src += 12;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint8) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint8) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S8, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 6 * 4;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample5 = (Sint16) ((Sint8) src[5]);\n    Sint16 last_sample4 = (Sint16) ((Sint8) src[4]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample5 = (Sint16) ((Sint8) src[5]);\n        const Sint16 sample4 = (Sint16) ((Sint8) src[4]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src -= 6;\n        dst[23] = (Sint8) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[22] = (Sint8) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[21] = (Sint8) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[20] = (Sint8) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[19] = (Sint8) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[18] = (Sint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[17] = (Sint8) ((sample5 + last_sample5) >> 1);\n        dst[16] = (Sint8) ((sample4 + last_sample4) >> 1);\n        dst[15] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[14] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[13] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[12] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[11] = (Sint8) (((3 * sample5) + last_sample5) >> 2);\n        dst[10] = (Sint8) (((3 * sample4) + last_sample4) >> 2);\n        dst[9] = (Sint8) (((3 * sample3) + last_sample3) >> 2);\n        dst[8] = (Sint8) (((3 * sample2) + last_sample2) >> 2);\n        dst[7] = (Sint8) (((3 * sample1) + last_sample1) >> 2);\n        dst[6] = (Sint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[5] = (Sint8) sample5;\n        dst[4] = (Sint8) sample4;\n        dst[3] = (Sint8) sample3;\n        dst[2] = (Sint8) sample2;\n        dst[1] = (Sint8) sample1;\n        dst[0] = (Sint8) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S8, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample4 = (Sint16) ((Sint8) src[4]);\n    Sint16 last_sample5 = (Sint16) ((Sint8) src[5]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample4 = (Sint16) ((Sint8) src[4]);\n        const Sint16 sample5 = (Sint16) ((Sint8) src[5]);\n        src += 24;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint8) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint8) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S8, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 8 * 2;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample7 = (Sint16) ((Sint8) src[7]);\n    Sint16 last_sample6 = (Sint16) ((Sint8) src[6]);\n    Sint16 last_sample5 = (Sint16) ((Sint8) src[5]);\n    Sint16 last_sample4 = (Sint16) ((Sint8) src[4]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample7 = (Sint16) ((Sint8) src[7]);\n        const Sint16 sample6 = (Sint16) ((Sint8) src[6]);\n        const Sint16 sample5 = (Sint16) ((Sint8) src[5]);\n        const Sint16 sample4 = (Sint16) ((Sint8) src[4]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src -= 8;\n        dst[15] = (Sint8) ((sample7 + last_sample7) >> 1);\n        dst[14] = (Sint8) ((sample6 + last_sample6) >> 1);\n        dst[13] = (Sint8) ((sample5 + last_sample5) >> 1);\n        dst[12] = (Sint8) ((sample4 + last_sample4) >> 1);\n        dst[11] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint8) sample7;\n        dst[6] = (Sint8) sample6;\n        dst[5] = (Sint8) sample5;\n        dst[4] = (Sint8) sample4;\n        dst[3] = (Sint8) sample3;\n        dst[2] = (Sint8) sample2;\n        dst[1] = (Sint8) sample1;\n        dst[0] = (Sint8) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S8, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample4 = (Sint16) ((Sint8) src[4]);\n    Sint16 last_sample5 = (Sint16) ((Sint8) src[5]);\n    Sint16 last_sample6 = (Sint16) ((Sint8) src[6]);\n    Sint16 last_sample7 = (Sint16) ((Sint8) src[7]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample4 = (Sint16) ((Sint8) src[4]);\n        const Sint16 sample5 = (Sint16) ((Sint8) src[5]);\n        const Sint16 sample6 = (Sint16) ((Sint8) src[6]);\n        const Sint16 sample7 = (Sint16) ((Sint8) src[7]);\n        src += 16;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint8) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint8) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint8) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint8) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S8_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S8, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint8 *dst = ((Sint8 *) (cvt->buf + dstsize)) - 8 * 4;\n    const Sint8 *src = ((Sint8 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint8 *target = ((const Sint8 *) cvt->buf);\n    Sint16 last_sample7 = (Sint16) ((Sint8) src[7]);\n    Sint16 last_sample6 = (Sint16) ((Sint8) src[6]);\n    Sint16 last_sample5 = (Sint16) ((Sint8) src[5]);\n    Sint16 last_sample4 = (Sint16) ((Sint8) src[4]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    while (dst >= target) {\n        const Sint16 sample7 = (Sint16) ((Sint8) src[7]);\n        const Sint16 sample6 = (Sint16) ((Sint8) src[6]);\n        const Sint16 sample5 = (Sint16) ((Sint8) src[5]);\n        const Sint16 sample4 = (Sint16) ((Sint8) src[4]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        src -= 8;\n        dst[31] = (Sint8) ((sample7 + (3 * last_sample7)) >> 2);\n        dst[30] = (Sint8) ((sample6 + (3 * last_sample6)) >> 2);\n        dst[29] = (Sint8) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[28] = (Sint8) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[27] = (Sint8) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[26] = (Sint8) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[25] = (Sint8) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[24] = (Sint8) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[23] = (Sint8) ((sample7 + last_sample7) >> 1);\n        dst[22] = (Sint8) ((sample6 + last_sample6) >> 1);\n        dst[21] = (Sint8) ((sample5 + last_sample5) >> 1);\n        dst[20] = (Sint8) ((sample4 + last_sample4) >> 1);\n        dst[19] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[18] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[17] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[16] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[15] = (Sint8) (((3 * sample7) + last_sample7) >> 2);\n        dst[14] = (Sint8) (((3 * sample6) + last_sample6) >> 2);\n        dst[13] = (Sint8) (((3 * sample5) + last_sample5) >> 2);\n        dst[12] = (Sint8) (((3 * sample4) + last_sample4) >> 2);\n        dst[11] = (Sint8) (((3 * sample3) + last_sample3) >> 2);\n        dst[10] = (Sint8) (((3 * sample2) + last_sample2) >> 2);\n        dst[9] = (Sint8) (((3 * sample1) + last_sample1) >> 2);\n        dst[8] = (Sint8) (((3 * sample0) + last_sample0) >> 2);\n        dst[7] = (Sint8) sample7;\n        dst[6] = (Sint8) sample6;\n        dst[5] = (Sint8) sample5;\n        dst[4] = (Sint8) sample4;\n        dst[3] = (Sint8) sample3;\n        dst[2] = (Sint8) sample2;\n        dst[1] = (Sint8) sample1;\n        dst[0] = (Sint8) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S8_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S8, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint8 *dst = (Sint8 *) cvt->buf;\n    const Sint8 *src = (Sint8 *) cvt->buf;\n    const Sint8 *target = (const Sint8 *) (cvt->buf + dstsize);\n    Sint16 last_sample0 = (Sint16) ((Sint8) src[0]);\n    Sint16 last_sample1 = (Sint16) ((Sint8) src[1]);\n    Sint16 last_sample2 = (Sint16) ((Sint8) src[2]);\n    Sint16 last_sample3 = (Sint16) ((Sint8) src[3]);\n    Sint16 last_sample4 = (Sint16) ((Sint8) src[4]);\n    Sint16 last_sample5 = (Sint16) ((Sint8) src[5]);\n    Sint16 last_sample6 = (Sint16) ((Sint8) src[6]);\n    Sint16 last_sample7 = (Sint16) ((Sint8) src[7]);\n    while (dst < target) {\n        const Sint16 sample0 = (Sint16) ((Sint8) src[0]);\n        const Sint16 sample1 = (Sint16) ((Sint8) src[1]);\n        const Sint16 sample2 = (Sint16) ((Sint8) src[2]);\n        const Sint16 sample3 = (Sint16) ((Sint8) src[3]);\n        const Sint16 sample4 = (Sint16) ((Sint8) src[4]);\n        const Sint16 sample5 = (Sint16) ((Sint8) src[5]);\n        const Sint16 sample6 = (Sint16) ((Sint8) src[6]);\n        const Sint16 sample7 = (Sint16) ((Sint8) src[7]);\n        src += 32;\n        dst[0] = (Sint8) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint8) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint8) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint8) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint8) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint8) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint8) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint8) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 1 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src--;\n        dst[1] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[0] = (Uint16) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src += 2;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 1 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src--;\n        dst[3] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[2] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[0] = (Uint16) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src += 4;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 2 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src -= 2;\n        dst[3] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        src += 4;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 2 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src -= 2;\n        dst[7] = (Uint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[6] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[5] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Uint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[2] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        src += 8;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 4 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src -= 4;\n        dst[7] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[6] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[5] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        src += 8;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 4 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src -= 4;\n        dst[15] = (Uint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[14] = (Uint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[13] = (Uint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[12] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[11] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Uint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[6] = (Uint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[5] = (Uint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[4] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        src += 16;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 6 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample5 = (Sint32) SDL_SwapLE16(src[5]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapLE16(src[4]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample5 = (Sint32) SDL_SwapLE16(src[5]);\n        const Sint32 sample4 = (Sint32) SDL_SwapLE16(src[4]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src -= 6;\n        dst[11] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[10] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[9] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[8] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[7] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[6] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[5] = (Uint16) sample5;\n        dst[4] = (Uint16) sample4;\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapLE16(src[4]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapLE16(src[5]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample4 = (Sint32) SDL_SwapLE16(src[4]);\n        const Sint32 sample5 = (Sint32) SDL_SwapLE16(src[5]);\n        src += 12;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint16) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 6 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample5 = (Sint32) SDL_SwapLE16(src[5]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapLE16(src[4]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample5 = (Sint32) SDL_SwapLE16(src[5]);\n        const Sint32 sample4 = (Sint32) SDL_SwapLE16(src[4]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src -= 6;\n        dst[23] = (Uint16) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[22] = (Uint16) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[21] = (Uint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[20] = (Uint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[19] = (Uint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[18] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[17] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[16] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[15] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[14] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[13] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[12] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[11] = (Uint16) (((3 * sample5) + last_sample5) >> 2);\n        dst[10] = (Uint16) (((3 * sample4) + last_sample4) >> 2);\n        dst[9] = (Uint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[8] = (Uint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[7] = (Uint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[6] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[5] = (Uint16) sample5;\n        dst[4] = (Uint16) sample4;\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapLE16(src[4]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapLE16(src[5]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample4 = (Sint32) SDL_SwapLE16(src[4]);\n        const Sint32 sample5 = (Sint32) SDL_SwapLE16(src[5]);\n        src += 24;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint16) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 8 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample7 = (Sint32) SDL_SwapLE16(src[7]);\n    Sint32 last_sample6 = (Sint32) SDL_SwapLE16(src[6]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapLE16(src[5]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapLE16(src[4]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample7 = (Sint32) SDL_SwapLE16(src[7]);\n        const Sint32 sample6 = (Sint32) SDL_SwapLE16(src[6]);\n        const Sint32 sample5 = (Sint32) SDL_SwapLE16(src[5]);\n        const Sint32 sample4 = (Sint32) SDL_SwapLE16(src[4]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src -= 8;\n        dst[15] = (Uint16) ((sample7 + last_sample7) >> 1);\n        dst[14] = (Uint16) ((sample6 + last_sample6) >> 1);\n        dst[13] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[12] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[11] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Uint16) sample7;\n        dst[6] = (Uint16) sample6;\n        dst[5] = (Uint16) sample5;\n        dst[4] = (Uint16) sample4;\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapLE16(src[4]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapLE16(src[5]);\n    Sint32 last_sample6 = (Sint32) SDL_SwapLE16(src[6]);\n    Sint32 last_sample7 = (Sint32) SDL_SwapLE16(src[7]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample4 = (Sint32) SDL_SwapLE16(src[4]);\n        const Sint32 sample5 = (Sint32) SDL_SwapLE16(src[5]);\n        const Sint32 sample6 = (Sint32) SDL_SwapLE16(src[6]);\n        const Sint32 sample7 = (Sint32) SDL_SwapLE16(src[7]);\n        src += 16;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Uint16) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Uint16) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16LSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 8 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample7 = (Sint32) SDL_SwapLE16(src[7]);\n    Sint32 last_sample6 = (Sint32) SDL_SwapLE16(src[6]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapLE16(src[5]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapLE16(src[4]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample7 = (Sint32) SDL_SwapLE16(src[7]);\n        const Sint32 sample6 = (Sint32) SDL_SwapLE16(src[6]);\n        const Sint32 sample5 = (Sint32) SDL_SwapLE16(src[5]);\n        const Sint32 sample4 = (Sint32) SDL_SwapLE16(src[4]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        src -= 8;\n        dst[31] = (Uint16) ((sample7 + (3 * last_sample7)) >> 2);\n        dst[30] = (Uint16) ((sample6 + (3 * last_sample6)) >> 2);\n        dst[29] = (Uint16) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[28] = (Uint16) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[27] = (Uint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[26] = (Uint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[25] = (Uint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[24] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[23] = (Uint16) ((sample7 + last_sample7) >> 1);\n        dst[22] = (Uint16) ((sample6 + last_sample6) >> 1);\n        dst[21] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[20] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[19] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[18] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[17] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[16] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[15] = (Uint16) (((3 * sample7) + last_sample7) >> 2);\n        dst[14] = (Uint16) (((3 * sample6) + last_sample6) >> 2);\n        dst[13] = (Uint16) (((3 * sample5) + last_sample5) >> 2);\n        dst[12] = (Uint16) (((3 * sample4) + last_sample4) >> 2);\n        dst[11] = (Uint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[10] = (Uint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[9] = (Uint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[8] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[7] = (Uint16) sample7;\n        dst[6] = (Uint16) sample6;\n        dst[5] = (Uint16) sample5;\n        dst[4] = (Uint16) sample4;\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16LSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapLE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapLE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapLE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapLE16(src[3]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapLE16(src[4]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapLE16(src[5]);\n    Sint32 last_sample6 = (Sint32) SDL_SwapLE16(src[6]);\n    Sint32 last_sample7 = (Sint32) SDL_SwapLE16(src[7]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapLE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapLE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapLE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapLE16(src[3]);\n        const Sint32 sample4 = (Sint32) SDL_SwapLE16(src[4]);\n        const Sint32 sample5 = (Sint32) SDL_SwapLE16(src[5]);\n        const Sint32 sample6 = (Sint32) SDL_SwapLE16(src[6]);\n        const Sint32 sample7 = (Sint32) SDL_SwapLE16(src[7]);\n        src += 32;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Uint16) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Uint16) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 1 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src--;\n        dst[1] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[0] = (Sint16) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src += 2;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 1 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src--;\n        dst[3] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[2] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[0] = (Sint16) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src += 4;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 2 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src -= 2;\n        dst[3] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        src += 4;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 2 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src -= 2;\n        dst[7] = (Sint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[6] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[5] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[2] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        src += 8;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 4 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src -= 4;\n        dst[7] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[6] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[5] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        src += 8;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 4 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src -= 4;\n        dst[15] = (Sint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[14] = (Sint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[13] = (Sint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[12] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[11] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[6] = (Sint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[5] = (Sint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[4] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        src += 16;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 6 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src -= 6;\n        dst[11] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[10] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[9] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[8] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[7] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[6] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[5] = (Sint16) sample5;\n        dst[4] = (Sint16) sample4;\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n        src += 12;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint16) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 6 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src -= 6;\n        dst[23] = (Sint16) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[22] = (Sint16) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[21] = (Sint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[20] = (Sint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[19] = (Sint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[18] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[17] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[16] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[15] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[14] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[13] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[12] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[11] = (Sint16) (((3 * sample5) + last_sample5) >> 2);\n        dst[10] = (Sint16) (((3 * sample4) + last_sample4) >> 2);\n        dst[9] = (Sint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[8] = (Sint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[7] = (Sint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[6] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[5] = (Sint16) sample5;\n        dst[4] = (Sint16) sample4;\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n        src += 24;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint16) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 8 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample7 = (Sint32) ((Sint16) SDL_SwapLE16(src[7]));\n    Sint32 last_sample6 = (Sint32) ((Sint16) SDL_SwapLE16(src[6]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample7 = (Sint32) ((Sint16) SDL_SwapLE16(src[7]));\n        const Sint32 sample6 = (Sint32) ((Sint16) SDL_SwapLE16(src[6]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src -= 8;\n        dst[15] = (Sint16) ((sample7 + last_sample7) >> 1);\n        dst[14] = (Sint16) ((sample6 + last_sample6) >> 1);\n        dst[13] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[12] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[11] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint16) sample7;\n        dst[6] = (Sint16) sample6;\n        dst[5] = (Sint16) sample5;\n        dst[4] = (Sint16) sample4;\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n    Sint32 last_sample6 = (Sint32) ((Sint16) SDL_SwapLE16(src[6]));\n    Sint32 last_sample7 = (Sint32) ((Sint16) SDL_SwapLE16(src[7]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n        const Sint32 sample6 = (Sint32) ((Sint16) SDL_SwapLE16(src[6]));\n        const Sint32 sample7 = (Sint32) ((Sint16) SDL_SwapLE16(src[7]));\n        src += 16;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint16) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint16) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16LSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 8 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample7 = (Sint32) ((Sint16) SDL_SwapLE16(src[7]));\n    Sint32 last_sample6 = (Sint32) ((Sint16) SDL_SwapLE16(src[6]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample7 = (Sint32) ((Sint16) SDL_SwapLE16(src[7]));\n        const Sint32 sample6 = (Sint32) ((Sint16) SDL_SwapLE16(src[6]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        src -= 8;\n        dst[31] = (Sint16) ((sample7 + (3 * last_sample7)) >> 2);\n        dst[30] = (Sint16) ((sample6 + (3 * last_sample6)) >> 2);\n        dst[29] = (Sint16) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[28] = (Sint16) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[27] = (Sint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[26] = (Sint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[25] = (Sint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[24] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[23] = (Sint16) ((sample7 + last_sample7) >> 1);\n        dst[22] = (Sint16) ((sample6 + last_sample6) >> 1);\n        dst[21] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[20] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[19] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[18] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[17] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[16] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[15] = (Sint16) (((3 * sample7) + last_sample7) >> 2);\n        dst[14] = (Sint16) (((3 * sample6) + last_sample6) >> 2);\n        dst[13] = (Sint16) (((3 * sample5) + last_sample5) >> 2);\n        dst[12] = (Sint16) (((3 * sample4) + last_sample4) >> 2);\n        dst[11] = (Sint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[10] = (Sint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[9] = (Sint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[8] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[7] = (Sint16) sample7;\n        dst[6] = (Sint16) sample6;\n        dst[5] = (Sint16) sample5;\n        dst[4] = (Sint16) sample4;\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16LSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n    Sint32 last_sample6 = (Sint32) ((Sint16) SDL_SwapLE16(src[6]));\n    Sint32 last_sample7 = (Sint32) ((Sint16) SDL_SwapLE16(src[7]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapLE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapLE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapLE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapLE16(src[3]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapLE16(src[4]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapLE16(src[5]));\n        const Sint32 sample6 = (Sint32) ((Sint16) SDL_SwapLE16(src[6]));\n        const Sint32 sample7 = (Sint32) ((Sint16) SDL_SwapLE16(src[7]));\n        src += 32;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint16) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint16) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 1 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src--;\n        dst[1] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[0] = (Uint16) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src += 2;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 1 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src--;\n        dst[3] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[2] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[0] = (Uint16) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src += 4;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 2 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src -= 2;\n        dst[3] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        src += 4;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 2 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src -= 2;\n        dst[7] = (Uint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[6] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[5] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Uint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[2] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        src += 8;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 4 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src -= 4;\n        dst[7] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[6] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[5] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        src += 8;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 4 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src -= 4;\n        dst[15] = (Uint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[14] = (Uint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[13] = (Uint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[12] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[11] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Uint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[6] = (Uint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[5] = (Uint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[4] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        src += 16;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 6 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample5 = (Sint32) SDL_SwapBE16(src[5]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapBE16(src[4]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample5 = (Sint32) SDL_SwapBE16(src[5]);\n        const Sint32 sample4 = (Sint32) SDL_SwapBE16(src[4]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src -= 6;\n        dst[11] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[10] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[9] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[8] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[7] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[6] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[5] = (Uint16) sample5;\n        dst[4] = (Uint16) sample4;\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapBE16(src[4]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapBE16(src[5]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample4 = (Sint32) SDL_SwapBE16(src[4]);\n        const Sint32 sample5 = (Sint32) SDL_SwapBE16(src[5]);\n        src += 12;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint16) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 6 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample5 = (Sint32) SDL_SwapBE16(src[5]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapBE16(src[4]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample5 = (Sint32) SDL_SwapBE16(src[5]);\n        const Sint32 sample4 = (Sint32) SDL_SwapBE16(src[4]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src -= 6;\n        dst[23] = (Uint16) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[22] = (Uint16) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[21] = (Uint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[20] = (Uint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[19] = (Uint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[18] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[17] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[16] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[15] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[14] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[13] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[12] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[11] = (Uint16) (((3 * sample5) + last_sample5) >> 2);\n        dst[10] = (Uint16) (((3 * sample4) + last_sample4) >> 2);\n        dst[9] = (Uint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[8] = (Uint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[7] = (Uint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[6] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[5] = (Uint16) sample5;\n        dst[4] = (Uint16) sample4;\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapBE16(src[4]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapBE16(src[5]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample4 = (Sint32) SDL_SwapBE16(src[4]);\n        const Sint32 sample5 = (Sint32) SDL_SwapBE16(src[5]);\n        src += 24;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint16) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_U16MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 8 * 2;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample7 = (Sint32) SDL_SwapBE16(src[7]);\n    Sint32 last_sample6 = (Sint32) SDL_SwapBE16(src[6]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapBE16(src[5]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapBE16(src[4]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample7 = (Sint32) SDL_SwapBE16(src[7]);\n        const Sint32 sample6 = (Sint32) SDL_SwapBE16(src[6]);\n        const Sint32 sample5 = (Sint32) SDL_SwapBE16(src[5]);\n        const Sint32 sample4 = (Sint32) SDL_SwapBE16(src[4]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src -= 8;\n        dst[15] = (Uint16) ((sample7 + last_sample7) >> 1);\n        dst[14] = (Uint16) ((sample6 + last_sample6) >> 1);\n        dst[13] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[12] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[11] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Uint16) sample7;\n        dst[6] = (Uint16) sample6;\n        dst[5] = (Uint16) sample5;\n        dst[4] = (Uint16) sample4;\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_U16MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapBE16(src[4]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapBE16(src[5]);\n    Sint32 last_sample6 = (Sint32) SDL_SwapBE16(src[6]);\n    Sint32 last_sample7 = (Sint32) SDL_SwapBE16(src[7]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample4 = (Sint32) SDL_SwapBE16(src[4]);\n        const Sint32 sample5 = (Sint32) SDL_SwapBE16(src[5]);\n        const Sint32 sample6 = (Sint32) SDL_SwapBE16(src[6]);\n        const Sint32 sample7 = (Sint32) SDL_SwapBE16(src[7]);\n        src += 16;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Uint16) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Uint16) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_U16MSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_U16MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Uint16 *dst = ((Uint16 *) (cvt->buf + dstsize)) - 8 * 4;\n    const Uint16 *src = ((Uint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Uint16 *target = ((const Uint16 *) cvt->buf);\n    Sint32 last_sample7 = (Sint32) SDL_SwapBE16(src[7]);\n    Sint32 last_sample6 = (Sint32) SDL_SwapBE16(src[6]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapBE16(src[5]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapBE16(src[4]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    while (dst >= target) {\n        const Sint32 sample7 = (Sint32) SDL_SwapBE16(src[7]);\n        const Sint32 sample6 = (Sint32) SDL_SwapBE16(src[6]);\n        const Sint32 sample5 = (Sint32) SDL_SwapBE16(src[5]);\n        const Sint32 sample4 = (Sint32) SDL_SwapBE16(src[4]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        src -= 8;\n        dst[31] = (Uint16) ((sample7 + (3 * last_sample7)) >> 2);\n        dst[30] = (Uint16) ((sample6 + (3 * last_sample6)) >> 2);\n        dst[29] = (Uint16) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[28] = (Uint16) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[27] = (Uint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[26] = (Uint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[25] = (Uint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[24] = (Uint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[23] = (Uint16) ((sample7 + last_sample7) >> 1);\n        dst[22] = (Uint16) ((sample6 + last_sample6) >> 1);\n        dst[21] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[20] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[19] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[18] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[17] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[16] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[15] = (Uint16) (((3 * sample7) + last_sample7) >> 2);\n        dst[14] = (Uint16) (((3 * sample6) + last_sample6) >> 2);\n        dst[13] = (Uint16) (((3 * sample5) + last_sample5) >> 2);\n        dst[12] = (Uint16) (((3 * sample4) + last_sample4) >> 2);\n        dst[11] = (Uint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[10] = (Uint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[9] = (Uint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[8] = (Uint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[7] = (Uint16) sample7;\n        dst[6] = (Uint16) sample6;\n        dst[5] = (Uint16) sample5;\n        dst[4] = (Uint16) sample4;\n        dst[3] = (Uint16) sample3;\n        dst[2] = (Uint16) sample2;\n        dst[1] = (Uint16) sample1;\n        dst[0] = (Uint16) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_U16MSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_U16MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Uint16 *dst = (Uint16 *) cvt->buf;\n    const Uint16 *src = (Uint16 *) cvt->buf;\n    const Uint16 *target = (const Uint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) SDL_SwapBE16(src[0]);\n    Sint32 last_sample1 = (Sint32) SDL_SwapBE16(src[1]);\n    Sint32 last_sample2 = (Sint32) SDL_SwapBE16(src[2]);\n    Sint32 last_sample3 = (Sint32) SDL_SwapBE16(src[3]);\n    Sint32 last_sample4 = (Sint32) SDL_SwapBE16(src[4]);\n    Sint32 last_sample5 = (Sint32) SDL_SwapBE16(src[5]);\n    Sint32 last_sample6 = (Sint32) SDL_SwapBE16(src[6]);\n    Sint32 last_sample7 = (Sint32) SDL_SwapBE16(src[7]);\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) SDL_SwapBE16(src[0]);\n        const Sint32 sample1 = (Sint32) SDL_SwapBE16(src[1]);\n        const Sint32 sample2 = (Sint32) SDL_SwapBE16(src[2]);\n        const Sint32 sample3 = (Sint32) SDL_SwapBE16(src[3]);\n        const Sint32 sample4 = (Sint32) SDL_SwapBE16(src[4]);\n        const Sint32 sample5 = (Sint32) SDL_SwapBE16(src[5]);\n        const Sint32 sample6 = (Sint32) SDL_SwapBE16(src[6]);\n        const Sint32 sample7 = (Sint32) SDL_SwapBE16(src[7]);\n        src += 32;\n        dst[0] = (Uint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Uint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Uint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Uint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Uint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Uint16) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Uint16) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Uint16) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 1 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src--;\n        dst[1] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[0] = (Sint16) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src += 2;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 1 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src--;\n        dst[3] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[2] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[0] = (Sint16) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src += 4;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 2 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src -= 2;\n        dst[3] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        src += 4;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 2 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src -= 2;\n        dst[7] = (Sint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[6] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[5] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[2] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        src += 8;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 4 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src -= 4;\n        dst[7] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[6] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[5] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        src += 8;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 4 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src -= 4;\n        dst[15] = (Sint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[14] = (Sint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[13] = (Sint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[12] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[11] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[6] = (Sint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[5] = (Sint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[4] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        src += 16;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 6 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src -= 6;\n        dst[11] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[10] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[9] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[8] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[7] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[6] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[5] = (Sint16) sample5;\n        dst[4] = (Sint16) sample4;\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n        src += 12;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint16) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 6 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src -= 6;\n        dst[23] = (Sint16) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[22] = (Sint16) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[21] = (Sint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[20] = (Sint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[19] = (Sint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[18] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[17] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[16] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[15] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[14] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[13] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[12] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[11] = (Sint16) (((3 * sample5) + last_sample5) >> 2);\n        dst[10] = (Sint16) (((3 * sample4) + last_sample4) >> 2);\n        dst[9] = (Sint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[8] = (Sint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[7] = (Sint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[6] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[5] = (Sint16) sample5;\n        dst[4] = (Sint16) sample4;\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n        src += 24;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint16) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S16MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 8 * 2;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample7 = (Sint32) ((Sint16) SDL_SwapBE16(src[7]));\n    Sint32 last_sample6 = (Sint32) ((Sint16) SDL_SwapBE16(src[6]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample7 = (Sint32) ((Sint16) SDL_SwapBE16(src[7]));\n        const Sint32 sample6 = (Sint32) ((Sint16) SDL_SwapBE16(src[6]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src -= 8;\n        dst[15] = (Sint16) ((sample7 + last_sample7) >> 1);\n        dst[14] = (Sint16) ((sample6 + last_sample6) >> 1);\n        dst[13] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[12] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[11] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint16) sample7;\n        dst[6] = (Sint16) sample6;\n        dst[5] = (Sint16) sample5;\n        dst[4] = (Sint16) sample4;\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S16MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n    Sint32 last_sample6 = (Sint32) ((Sint16) SDL_SwapBE16(src[6]));\n    Sint32 last_sample7 = (Sint32) ((Sint16) SDL_SwapBE16(src[7]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n        const Sint32 sample6 = (Sint32) ((Sint16) SDL_SwapBE16(src[6]));\n        const Sint32 sample7 = (Sint32) ((Sint16) SDL_SwapBE16(src[7]));\n        src += 16;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint16) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint16) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S16MSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S16MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 8 * 4;\n    const Sint16 *src = ((Sint16 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint16 *target = ((const Sint16 *) cvt->buf);\n    Sint32 last_sample7 = (Sint32) ((Sint16) SDL_SwapBE16(src[7]));\n    Sint32 last_sample6 = (Sint32) ((Sint16) SDL_SwapBE16(src[6]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    while (dst >= target) {\n        const Sint32 sample7 = (Sint32) ((Sint16) SDL_SwapBE16(src[7]));\n        const Sint32 sample6 = (Sint32) ((Sint16) SDL_SwapBE16(src[6]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        src -= 8;\n        dst[31] = (Sint16) ((sample7 + (3 * last_sample7)) >> 2);\n        dst[30] = (Sint16) ((sample6 + (3 * last_sample6)) >> 2);\n        dst[29] = (Sint16) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[28] = (Sint16) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[27] = (Sint16) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[26] = (Sint16) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[25] = (Sint16) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[24] = (Sint16) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[23] = (Sint16) ((sample7 + last_sample7) >> 1);\n        dst[22] = (Sint16) ((sample6 + last_sample6) >> 1);\n        dst[21] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[20] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[19] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[18] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[17] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[16] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[15] = (Sint16) (((3 * sample7) + last_sample7) >> 2);\n        dst[14] = (Sint16) (((3 * sample6) + last_sample6) >> 2);\n        dst[13] = (Sint16) (((3 * sample5) + last_sample5) >> 2);\n        dst[12] = (Sint16) (((3 * sample4) + last_sample4) >> 2);\n        dst[11] = (Sint16) (((3 * sample3) + last_sample3) >> 2);\n        dst[10] = (Sint16) (((3 * sample2) + last_sample2) >> 2);\n        dst[9] = (Sint16) (((3 * sample1) + last_sample1) >> 2);\n        dst[8] = (Sint16) (((3 * sample0) + last_sample0) >> 2);\n        dst[7] = (Sint16) sample7;\n        dst[6] = (Sint16) sample6;\n        dst[5] = (Sint16) sample5;\n        dst[4] = (Sint16) sample4;\n        dst[3] = (Sint16) sample3;\n        dst[2] = (Sint16) sample2;\n        dst[1] = (Sint16) sample1;\n        dst[0] = (Sint16) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S16MSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S16MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint16 *dst = (Sint16 *) cvt->buf;\n    const Sint16 *src = (Sint16 *) cvt->buf;\n    const Sint16 *target = (const Sint16 *) (cvt->buf + dstsize);\n    Sint32 last_sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n    Sint32 last_sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n    Sint32 last_sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n    Sint32 last_sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n    Sint32 last_sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n    Sint32 last_sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n    Sint32 last_sample6 = (Sint32) ((Sint16) SDL_SwapBE16(src[6]));\n    Sint32 last_sample7 = (Sint32) ((Sint16) SDL_SwapBE16(src[7]));\n    while (dst < target) {\n        const Sint32 sample0 = (Sint32) ((Sint16) SDL_SwapBE16(src[0]));\n        const Sint32 sample1 = (Sint32) ((Sint16) SDL_SwapBE16(src[1]));\n        const Sint32 sample2 = (Sint32) ((Sint16) SDL_SwapBE16(src[2]));\n        const Sint32 sample3 = (Sint32) ((Sint16) SDL_SwapBE16(src[3]));\n        const Sint32 sample4 = (Sint32) ((Sint16) SDL_SwapBE16(src[4]));\n        const Sint32 sample5 = (Sint32) ((Sint16) SDL_SwapBE16(src[5]));\n        const Sint32 sample6 = (Sint32) ((Sint16) SDL_SwapBE16(src[6]));\n        const Sint32 sample7 = (Sint32) ((Sint16) SDL_SwapBE16(src[7]));\n        src += 32;\n        dst[0] = (Sint16) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint16) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint16) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint16) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint16) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint16) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint16) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint16) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 1 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src--;\n        dst[1] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[0] = (Sint32) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src += 2;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 1 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src--;\n        dst[3] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[2] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[0] = (Sint32) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src += 4;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 2 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src -= 2;\n        dst[3] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        src += 4;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 2 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src -= 2;\n        dst[7] = (Sint32) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[6] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[5] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint32) (((3 * sample1) + last_sample1) >> 2);\n        dst[2] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        src += 8;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 4 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src -= 4;\n        dst[7] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[6] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[5] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        src += 8;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 4 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src -= 4;\n        dst[15] = (Sint32) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[14] = (Sint32) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[13] = (Sint32) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[12] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[11] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint32) (((3 * sample3) + last_sample3) >> 2);\n        dst[6] = (Sint32) (((3 * sample2) + last_sample2) >> 2);\n        dst[5] = (Sint32) (((3 * sample1) + last_sample1) >> 2);\n        dst[4] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        src += 16;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 6 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src -= 6;\n        dst[11] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[10] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[9] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[8] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[7] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[6] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[5] = (Sint32) sample5;\n        dst[4] = (Sint32) sample4;\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n        src += 12;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint32) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 6 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src -= 6;\n        dst[23] = (Sint32) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[22] = (Sint32) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[21] = (Sint32) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[20] = (Sint32) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[19] = (Sint32) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[18] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[17] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[16] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[15] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[14] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[13] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[12] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[11] = (Sint32) (((3 * sample5) + last_sample5) >> 2);\n        dst[10] = (Sint32) (((3 * sample4) + last_sample4) >> 2);\n        dst[9] = (Sint32) (((3 * sample3) + last_sample3) >> 2);\n        dst[8] = (Sint32) (((3 * sample2) + last_sample2) >> 2);\n        dst[7] = (Sint32) (((3 * sample1) + last_sample1) >> 2);\n        dst[6] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[5] = (Sint32) sample5;\n        dst[4] = (Sint32) sample4;\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n        src += 24;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint32) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 8 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample7 = (Sint64) ((Sint32) SDL_SwapLE32(src[7]));\n    Sint64 last_sample6 = (Sint64) ((Sint32) SDL_SwapLE32(src[6]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample7 = (Sint64) ((Sint32) SDL_SwapLE32(src[7]));\n        const Sint64 sample6 = (Sint64) ((Sint32) SDL_SwapLE32(src[6]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src -= 8;\n        dst[15] = (Sint32) ((sample7 + last_sample7) >> 1);\n        dst[14] = (Sint32) ((sample6 + last_sample6) >> 1);\n        dst[13] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[12] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[11] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint32) sample7;\n        dst[6] = (Sint32) sample6;\n        dst[5] = (Sint32) sample5;\n        dst[4] = (Sint32) sample4;\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n    Sint64 last_sample6 = (Sint64) ((Sint32) SDL_SwapLE32(src[6]));\n    Sint64 last_sample7 = (Sint64) ((Sint32) SDL_SwapLE32(src[7]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n        const Sint64 sample6 = (Sint64) ((Sint32) SDL_SwapLE32(src[6]));\n        const Sint64 sample7 = (Sint64) ((Sint32) SDL_SwapLE32(src[7]));\n        src += 16;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint32) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint32) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32LSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 8 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample7 = (Sint64) ((Sint32) SDL_SwapLE32(src[7]));\n    Sint64 last_sample6 = (Sint64) ((Sint32) SDL_SwapLE32(src[6]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample7 = (Sint64) ((Sint32) SDL_SwapLE32(src[7]));\n        const Sint64 sample6 = (Sint64) ((Sint32) SDL_SwapLE32(src[6]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        src -= 8;\n        dst[31] = (Sint32) ((sample7 + (3 * last_sample7)) >> 2);\n        dst[30] = (Sint32) ((sample6 + (3 * last_sample6)) >> 2);\n        dst[29] = (Sint32) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[28] = (Sint32) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[27] = (Sint32) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[26] = (Sint32) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[25] = (Sint32) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[24] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[23] = (Sint32) ((sample7 + last_sample7) >> 1);\n        dst[22] = (Sint32) ((sample6 + last_sample6) >> 1);\n        dst[21] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[20] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[19] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[18] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[17] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[16] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[15] = (Sint32) (((3 * sample7) + last_sample7) >> 2);\n        dst[14] = (Sint32) (((3 * sample6) + last_sample6) >> 2);\n        dst[13] = (Sint32) (((3 * sample5) + last_sample5) >> 2);\n        dst[12] = (Sint32) (((3 * sample4) + last_sample4) >> 2);\n        dst[11] = (Sint32) (((3 * sample3) + last_sample3) >> 2);\n        dst[10] = (Sint32) (((3 * sample2) + last_sample2) >> 2);\n        dst[9] = (Sint32) (((3 * sample1) + last_sample1) >> 2);\n        dst[8] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[7] = (Sint32) sample7;\n        dst[6] = (Sint32) sample6;\n        dst[5] = (Sint32) sample5;\n        dst[4] = (Sint32) sample4;\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32LSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n    Sint64 last_sample6 = (Sint64) ((Sint32) SDL_SwapLE32(src[6]));\n    Sint64 last_sample7 = (Sint64) ((Sint32) SDL_SwapLE32(src[7]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapLE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapLE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapLE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapLE32(src[3]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapLE32(src[4]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapLE32(src[5]));\n        const Sint64 sample6 = (Sint64) ((Sint32) SDL_SwapLE32(src[6]));\n        const Sint64 sample7 = (Sint64) ((Sint32) SDL_SwapLE32(src[7]));\n        src += 32;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint32) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint32) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 1 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src--;\n        dst[1] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[0] = (Sint32) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src += 2;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 1 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 1;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src--;\n        dst[3] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[2] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[0] = (Sint32) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src += 4;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 2 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src -= 2;\n        dst[3] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        src += 4;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 2 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 2;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src -= 2;\n        dst[7] = (Sint32) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[6] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[5] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint32) (((3 * sample1) + last_sample1) >> 2);\n        dst[2] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        src += 8;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 4 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src -= 4;\n        dst[7] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[6] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[5] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[4] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        src += 8;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 4 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 4;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src -= 4;\n        dst[15] = (Sint32) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[14] = (Sint32) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[13] = (Sint32) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[12] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[11] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint32) (((3 * sample3) + last_sample3) >> 2);\n        dst[6] = (Sint32) (((3 * sample2) + last_sample2) >> 2);\n        dst[5] = (Sint32) (((3 * sample1) + last_sample1) >> 2);\n        dst[4] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        src += 16;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 6 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src -= 6;\n        dst[11] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[10] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[9] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[8] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[7] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[6] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[5] = (Sint32) sample5;\n        dst[4] = (Sint32) sample4;\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n        src += 12;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint32) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 6 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 6;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src -= 6;\n        dst[23] = (Sint32) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[22] = (Sint32) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[21] = (Sint32) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[20] = (Sint32) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[19] = (Sint32) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[18] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[17] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[16] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[15] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[14] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[13] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[12] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[11] = (Sint32) (((3 * sample5) + last_sample5) >> 2);\n        dst[10] = (Sint32) (((3 * sample4) + last_sample4) >> 2);\n        dst[9] = (Sint32) (((3 * sample3) + last_sample3) >> 2);\n        dst[8] = (Sint32) (((3 * sample2) + last_sample2) >> 2);\n        dst[7] = (Sint32) (((3 * sample1) + last_sample1) >> 2);\n        dst[6] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[5] = (Sint32) sample5;\n        dst[4] = (Sint32) sample4;\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n        src += 24;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint32) ((sample5 + last_sample5) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_S32MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 8 * 2;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample7 = (Sint64) ((Sint32) SDL_SwapBE32(src[7]));\n    Sint64 last_sample6 = (Sint64) ((Sint32) SDL_SwapBE32(src[6]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample7 = (Sint64) ((Sint32) SDL_SwapBE32(src[7]));\n        const Sint64 sample6 = (Sint64) ((Sint32) SDL_SwapBE32(src[6]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src -= 8;\n        dst[15] = (Sint32) ((sample7 + last_sample7) >> 1);\n        dst[14] = (Sint32) ((sample6 + last_sample6) >> 1);\n        dst[13] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[12] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[11] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[10] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[9] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[8] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[7] = (Sint32) sample7;\n        dst[6] = (Sint32) sample6;\n        dst[5] = (Sint32) sample5;\n        dst[4] = (Sint32) sample4;\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_S32MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n    Sint64 last_sample6 = (Sint64) ((Sint32) SDL_SwapBE32(src[6]));\n    Sint64 last_sample7 = (Sint64) ((Sint32) SDL_SwapBE32(src[7]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n        const Sint64 sample6 = (Sint64) ((Sint32) SDL_SwapBE32(src[6]));\n        const Sint64 sample7 = (Sint64) ((Sint32) SDL_SwapBE32(src[7]));\n        src += 16;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint32) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint32) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_S32MSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_S32MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    Sint32 *dst = ((Sint32 *) (cvt->buf + dstsize)) - 8 * 4;\n    const Sint32 *src = ((Sint32 *) (cvt->buf + cvt->len_cvt)) - 8;\n    const Sint32 *target = ((const Sint32 *) cvt->buf);\n    Sint64 last_sample7 = (Sint64) ((Sint32) SDL_SwapBE32(src[7]));\n    Sint64 last_sample6 = (Sint64) ((Sint32) SDL_SwapBE32(src[6]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    while (dst >= target) {\n        const Sint64 sample7 = (Sint64) ((Sint32) SDL_SwapBE32(src[7]));\n        const Sint64 sample6 = (Sint64) ((Sint32) SDL_SwapBE32(src[6]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        src -= 8;\n        dst[31] = (Sint32) ((sample7 + (3 * last_sample7)) >> 2);\n        dst[30] = (Sint32) ((sample6 + (3 * last_sample6)) >> 2);\n        dst[29] = (Sint32) ((sample5 + (3 * last_sample5)) >> 2);\n        dst[28] = (Sint32) ((sample4 + (3 * last_sample4)) >> 2);\n        dst[27] = (Sint32) ((sample3 + (3 * last_sample3)) >> 2);\n        dst[26] = (Sint32) ((sample2 + (3 * last_sample2)) >> 2);\n        dst[25] = (Sint32) ((sample1 + (3 * last_sample1)) >> 2);\n        dst[24] = (Sint32) ((sample0 + (3 * last_sample0)) >> 2);\n        dst[23] = (Sint32) ((sample7 + last_sample7) >> 1);\n        dst[22] = (Sint32) ((sample6 + last_sample6) >> 1);\n        dst[21] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[20] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[19] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[18] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[17] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[16] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[15] = (Sint32) (((3 * sample7) + last_sample7) >> 2);\n        dst[14] = (Sint32) (((3 * sample6) + last_sample6) >> 2);\n        dst[13] = (Sint32) (((3 * sample5) + last_sample5) >> 2);\n        dst[12] = (Sint32) (((3 * sample4) + last_sample4) >> 2);\n        dst[11] = (Sint32) (((3 * sample3) + last_sample3) >> 2);\n        dst[10] = (Sint32) (((3 * sample2) + last_sample2) >> 2);\n        dst[9] = (Sint32) (((3 * sample1) + last_sample1) >> 2);\n        dst[8] = (Sint32) (((3 * sample0) + last_sample0) >> 2);\n        dst[7] = (Sint32) sample7;\n        dst[6] = (Sint32) sample6;\n        dst[5] = (Sint32) sample5;\n        dst[4] = (Sint32) sample4;\n        dst[3] = (Sint32) sample3;\n        dst[2] = (Sint32) sample2;\n        dst[1] = (Sint32) sample1;\n        dst[0] = (Sint32) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_S32MSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_S32MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    Sint32 *dst = (Sint32 *) cvt->buf;\n    const Sint32 *src = (Sint32 *) cvt->buf;\n    const Sint32 *target = (const Sint32 *) (cvt->buf + dstsize);\n    Sint64 last_sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n    Sint64 last_sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n    Sint64 last_sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n    Sint64 last_sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n    Sint64 last_sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n    Sint64 last_sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n    Sint64 last_sample6 = (Sint64) ((Sint32) SDL_SwapBE32(src[6]));\n    Sint64 last_sample7 = (Sint64) ((Sint32) SDL_SwapBE32(src[7]));\n    while (dst < target) {\n        const Sint64 sample0 = (Sint64) ((Sint32) SDL_SwapBE32(src[0]));\n        const Sint64 sample1 = (Sint64) ((Sint32) SDL_SwapBE32(src[1]));\n        const Sint64 sample2 = (Sint64) ((Sint32) SDL_SwapBE32(src[2]));\n        const Sint64 sample3 = (Sint64) ((Sint32) SDL_SwapBE32(src[3]));\n        const Sint64 sample4 = (Sint64) ((Sint32) SDL_SwapBE32(src[4]));\n        const Sint64 sample5 = (Sint64) ((Sint32) SDL_SwapBE32(src[5]));\n        const Sint64 sample6 = (Sint64) ((Sint32) SDL_SwapBE32(src[6]));\n        const Sint64 sample7 = (Sint64) ((Sint32) SDL_SwapBE32(src[7]));\n        src += 32;\n        dst[0] = (Sint32) ((sample0 + last_sample0) >> 1);\n        dst[1] = (Sint32) ((sample1 + last_sample1) >> 1);\n        dst[2] = (Sint32) ((sample2 + last_sample2) >> 1);\n        dst[3] = (Sint32) ((sample3 + last_sample3) >> 1);\n        dst[4] = (Sint32) ((sample4 + last_sample4) >> 1);\n        dst[5] = (Sint32) ((sample5 + last_sample5) >> 1);\n        dst[6] = (Sint32) ((sample6 + last_sample6) >> 1);\n        dst[7] = (Sint32) ((sample7 + last_sample7) >> 1);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 1 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 1;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src--;\n        dst[1] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[0] = (float) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src += 2;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 1 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 1;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src--;\n        dst[3] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[2] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[0] = (float) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32LSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src += 4;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 2 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 2;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src -= 2;\n        dst[3] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        src += 4;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 2 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 2;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src -= 2;\n        dst[7] = (float) ((sample1 + (3.0 * last_sample1)) * 0.25);\n        dst[6] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[5] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[4] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[3] = (float) (((3.0 * sample1) + last_sample1) * 0.25);\n        dst[2] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32LSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        src += 8;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 4 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 4;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src -= 4;\n        dst[7] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[6] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[5] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[4] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        src += 8;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 4 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 4;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src -= 4;\n        dst[15] = (float) ((sample3 + (3.0 * last_sample3)) * 0.25);\n        dst[14] = (float) ((sample2 + (3.0 * last_sample2)) * 0.25);\n        dst[13] = (float) ((sample1 + (3.0 * last_sample1)) * 0.25);\n        dst[12] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[11] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[10] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[9] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[8] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[7] = (float) (((3.0 * sample3) + last_sample3) * 0.25);\n        dst[6] = (float) (((3.0 * sample2) + last_sample2) * 0.25);\n        dst[5] = (float) (((3.0 * sample1) + last_sample1) * 0.25);\n        dst[4] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32LSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        src += 16;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 6 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 6;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample5 = (double) SDL_SwapFloatLE(src[5]);\n    double last_sample4 = (double) SDL_SwapFloatLE(src[4]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample5 = (double) SDL_SwapFloatLE(src[5]);\n        const double sample4 = (double) SDL_SwapFloatLE(src[4]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src -= 6;\n        dst[11] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[10] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[9] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[8] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[7] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[6] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[5] = (float) sample5;\n        dst[4] = (float) sample4;\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample4 = (double) SDL_SwapFloatLE(src[4]);\n    double last_sample5 = (double) SDL_SwapFloatLE(src[5]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample4 = (double) SDL_SwapFloatLE(src[4]);\n        const double sample5 = (double) SDL_SwapFloatLE(src[5]);\n        src += 12;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[4] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[5] = (float) ((sample5 + last_sample5) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 6 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 6;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample5 = (double) SDL_SwapFloatLE(src[5]);\n    double last_sample4 = (double) SDL_SwapFloatLE(src[4]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample5 = (double) SDL_SwapFloatLE(src[5]);\n        const double sample4 = (double) SDL_SwapFloatLE(src[4]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src -= 6;\n        dst[23] = (float) ((sample5 + (3.0 * last_sample5)) * 0.25);\n        dst[22] = (float) ((sample4 + (3.0 * last_sample4)) * 0.25);\n        dst[21] = (float) ((sample3 + (3.0 * last_sample3)) * 0.25);\n        dst[20] = (float) ((sample2 + (3.0 * last_sample2)) * 0.25);\n        dst[19] = (float) ((sample1 + (3.0 * last_sample1)) * 0.25);\n        dst[18] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[17] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[16] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[15] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[14] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[13] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[12] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[11] = (float) (((3.0 * sample5) + last_sample5) * 0.25);\n        dst[10] = (float) (((3.0 * sample4) + last_sample4) * 0.25);\n        dst[9] = (float) (((3.0 * sample3) + last_sample3) * 0.25);\n        dst[8] = (float) (((3.0 * sample2) + last_sample2) * 0.25);\n        dst[7] = (float) (((3.0 * sample1) + last_sample1) * 0.25);\n        dst[6] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[5] = (float) sample5;\n        dst[4] = (float) sample4;\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32LSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample4 = (double) SDL_SwapFloatLE(src[4]);\n    double last_sample5 = (double) SDL_SwapFloatLE(src[5]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample4 = (double) SDL_SwapFloatLE(src[4]);\n        const double sample5 = (double) SDL_SwapFloatLE(src[5]);\n        src += 24;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[4] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[5] = (float) ((sample5 + last_sample5) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 8 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 8;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample7 = (double) SDL_SwapFloatLE(src[7]);\n    double last_sample6 = (double) SDL_SwapFloatLE(src[6]);\n    double last_sample5 = (double) SDL_SwapFloatLE(src[5]);\n    double last_sample4 = (double) SDL_SwapFloatLE(src[4]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample7 = (double) SDL_SwapFloatLE(src[7]);\n        const double sample6 = (double) SDL_SwapFloatLE(src[6]);\n        const double sample5 = (double) SDL_SwapFloatLE(src[5]);\n        const double sample4 = (double) SDL_SwapFloatLE(src[4]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src -= 8;\n        dst[15] = (float) ((sample7 + last_sample7) * 0.5);\n        dst[14] = (float) ((sample6 + last_sample6) * 0.5);\n        dst[13] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[12] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[11] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[10] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[9] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[8] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[7] = (float) sample7;\n        dst[6] = (float) sample6;\n        dst[5] = (float) sample5;\n        dst[4] = (float) sample4;\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample4 = (double) SDL_SwapFloatLE(src[4]);\n    double last_sample5 = (double) SDL_SwapFloatLE(src[5]);\n    double last_sample6 = (double) SDL_SwapFloatLE(src[6]);\n    double last_sample7 = (double) SDL_SwapFloatLE(src[7]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample4 = (double) SDL_SwapFloatLE(src[4]);\n        const double sample5 = (double) SDL_SwapFloatLE(src[5]);\n        const double sample6 = (double) SDL_SwapFloatLE(src[6]);\n        const double sample7 = (double) SDL_SwapFloatLE(src[7]);\n        src += 16;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[4] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[5] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[6] = (float) ((sample6 + last_sample6) * 0.5);\n        dst[7] = (float) ((sample7 + last_sample7) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32LSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 8 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 8;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample7 = (double) SDL_SwapFloatLE(src[7]);\n    double last_sample6 = (double) SDL_SwapFloatLE(src[6]);\n    double last_sample5 = (double) SDL_SwapFloatLE(src[5]);\n    double last_sample4 = (double) SDL_SwapFloatLE(src[4]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    while (dst >= target) {\n        const double sample7 = (double) SDL_SwapFloatLE(src[7]);\n        const double sample6 = (double) SDL_SwapFloatLE(src[6]);\n        const double sample5 = (double) SDL_SwapFloatLE(src[5]);\n        const double sample4 = (double) SDL_SwapFloatLE(src[4]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        src -= 8;\n        dst[31] = (float) ((sample7 + (3.0 * last_sample7)) * 0.25);\n        dst[30] = (float) ((sample6 + (3.0 * last_sample6)) * 0.25);\n        dst[29] = (float) ((sample5 + (3.0 * last_sample5)) * 0.25);\n        dst[28] = (float) ((sample4 + (3.0 * last_sample4)) * 0.25);\n        dst[27] = (float) ((sample3 + (3.0 * last_sample3)) * 0.25);\n        dst[26] = (float) ((sample2 + (3.0 * last_sample2)) * 0.25);\n        dst[25] = (float) ((sample1 + (3.0 * last_sample1)) * 0.25);\n        dst[24] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[23] = (float) ((sample7 + last_sample7) * 0.5);\n        dst[22] = (float) ((sample6 + last_sample6) * 0.5);\n        dst[21] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[20] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[19] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[18] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[17] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[16] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[15] = (float) (((3.0 * sample7) + last_sample7) * 0.25);\n        dst[14] = (float) (((3.0 * sample6) + last_sample6) * 0.25);\n        dst[13] = (float) (((3.0 * sample5) + last_sample5) * 0.25);\n        dst[12] = (float) (((3.0 * sample4) + last_sample4) * 0.25);\n        dst[11] = (float) (((3.0 * sample3) + last_sample3) * 0.25);\n        dst[10] = (float) (((3.0 * sample2) + last_sample2) * 0.25);\n        dst[9] = (float) (((3.0 * sample1) + last_sample1) * 0.25);\n        dst[8] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[7] = (float) sample7;\n        dst[6] = (float) sample6;\n        dst[5] = (float) sample5;\n        dst[4] = (float) sample4;\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32LSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32LSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatLE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatLE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatLE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatLE(src[3]);\n    double last_sample4 = (double) SDL_SwapFloatLE(src[4]);\n    double last_sample5 = (double) SDL_SwapFloatLE(src[5]);\n    double last_sample6 = (double) SDL_SwapFloatLE(src[6]);\n    double last_sample7 = (double) SDL_SwapFloatLE(src[7]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatLE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatLE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatLE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatLE(src[3]);\n        const double sample4 = (double) SDL_SwapFloatLE(src[4]);\n        const double sample5 = (double) SDL_SwapFloatLE(src[5]);\n        const double sample6 = (double) SDL_SwapFloatLE(src[6]);\n        const double sample7 = (double) SDL_SwapFloatLE(src[7]);\n        src += 32;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[4] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[5] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[6] = (float) ((sample6 + last_sample6) * 0.5);\n        dst[7] = (float) ((sample7 + last_sample7) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 1 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 1;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src--;\n        dst[1] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[0] = (float) sample0;\n        last_sample0 = sample0;\n        dst -= 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_1c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src += 2;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 1 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 1;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src--;\n        dst[3] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[2] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[0] = (float) sample0;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_1c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32MSB, 1 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src += 4;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        last_sample0 = sample0;\n        dst++;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 2 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 2;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src -= 2;\n        dst[3] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_2c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        src += 4;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 2 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 2;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src -= 2;\n        dst[7] = (float) ((sample1 + (3.0 * last_sample1)) * 0.25);\n        dst[6] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[5] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[4] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[3] = (float) (((3.0 * sample1) + last_sample1) * 0.25);\n        dst[2] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_2c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32MSB, 2 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        src += 8;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        dst += 2;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 4 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 4;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src -= 4;\n        dst[7] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[6] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[5] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[4] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_4c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        src += 8;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 4 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 4;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src -= 4;\n        dst[15] = (float) ((sample3 + (3.0 * last_sample3)) * 0.25);\n        dst[14] = (float) ((sample2 + (3.0 * last_sample2)) * 0.25);\n        dst[13] = (float) ((sample1 + (3.0 * last_sample1)) * 0.25);\n        dst[12] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[11] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[10] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[9] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[8] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[7] = (float) (((3.0 * sample3) + last_sample3) * 0.25);\n        dst[6] = (float) (((3.0 * sample2) + last_sample2) * 0.25);\n        dst[5] = (float) (((3.0 * sample1) + last_sample1) * 0.25);\n        dst[4] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_4c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32MSB, 4 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        src += 16;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        dst += 4;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 6 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 6;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample5 = (double) SDL_SwapFloatBE(src[5]);\n    double last_sample4 = (double) SDL_SwapFloatBE(src[4]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample5 = (double) SDL_SwapFloatBE(src[5]);\n        const double sample4 = (double) SDL_SwapFloatBE(src[4]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src -= 6;\n        dst[11] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[10] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[9] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[8] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[7] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[6] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[5] = (float) sample5;\n        dst[4] = (float) sample4;\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 12;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_6c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample4 = (double) SDL_SwapFloatBE(src[4]);\n    double last_sample5 = (double) SDL_SwapFloatBE(src[5]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample4 = (double) SDL_SwapFloatBE(src[4]);\n        const double sample5 = (double) SDL_SwapFloatBE(src[5]);\n        src += 12;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[4] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[5] = (float) ((sample5 + last_sample5) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 6 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 6;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample5 = (double) SDL_SwapFloatBE(src[5]);\n    double last_sample4 = (double) SDL_SwapFloatBE(src[4]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample5 = (double) SDL_SwapFloatBE(src[5]);\n        const double sample4 = (double) SDL_SwapFloatBE(src[4]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src -= 6;\n        dst[23] = (float) ((sample5 + (3.0 * last_sample5)) * 0.25);\n        dst[22] = (float) ((sample4 + (3.0 * last_sample4)) * 0.25);\n        dst[21] = (float) ((sample3 + (3.0 * last_sample3)) * 0.25);\n        dst[20] = (float) ((sample2 + (3.0 * last_sample2)) * 0.25);\n        dst[19] = (float) ((sample1 + (3.0 * last_sample1)) * 0.25);\n        dst[18] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[17] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[16] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[15] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[14] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[13] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[12] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[11] = (float) (((3.0 * sample5) + last_sample5) * 0.25);\n        dst[10] = (float) (((3.0 * sample4) + last_sample4) * 0.25);\n        dst[9] = (float) (((3.0 * sample3) + last_sample3) * 0.25);\n        dst[8] = (float) (((3.0 * sample2) + last_sample2) * 0.25);\n        dst[7] = (float) (((3.0 * sample1) + last_sample1) * 0.25);\n        dst[6] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[5] = (float) sample5;\n        dst[4] = (float) sample4;\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 24;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_6c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32MSB, 6 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample4 = (double) SDL_SwapFloatBE(src[4]);\n    double last_sample5 = (double) SDL_SwapFloatBE(src[5]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample4 = (double) SDL_SwapFloatBE(src[4]);\n        const double sample5 = (double) SDL_SwapFloatBE(src[5]);\n        src += 24;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[4] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[5] = (float) ((sample5 + last_sample5) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        dst += 6;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x2) AUDIO_F32MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 2;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 8 * 2;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 8;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample7 = (double) SDL_SwapFloatBE(src[7]);\n    double last_sample6 = (double) SDL_SwapFloatBE(src[6]);\n    double last_sample5 = (double) SDL_SwapFloatBE(src[5]);\n    double last_sample4 = (double) SDL_SwapFloatBE(src[4]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample7 = (double) SDL_SwapFloatBE(src[7]);\n        const double sample6 = (double) SDL_SwapFloatBE(src[6]);\n        const double sample5 = (double) SDL_SwapFloatBE(src[5]);\n        const double sample4 = (double) SDL_SwapFloatBE(src[4]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src -= 8;\n        dst[15] = (float) ((sample7 + last_sample7) * 0.5);\n        dst[14] = (float) ((sample6 + last_sample6) * 0.5);\n        dst[13] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[12] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[11] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[10] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[9] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[8] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[7] = (float) sample7;\n        dst[6] = (float) sample6;\n        dst[5] = (float) sample5;\n        dst[4] = (float) sample4;\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 16;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_8c_x2(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x2) AUDIO_F32MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 2;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample4 = (double) SDL_SwapFloatBE(src[4]);\n    double last_sample5 = (double) SDL_SwapFloatBE(src[5]);\n    double last_sample6 = (double) SDL_SwapFloatBE(src[6]);\n    double last_sample7 = (double) SDL_SwapFloatBE(src[7]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample4 = (double) SDL_SwapFloatBE(src[4]);\n        const double sample5 = (double) SDL_SwapFloatBE(src[5]);\n        const double sample6 = (double) SDL_SwapFloatBE(src[6]);\n        const double sample7 = (double) SDL_SwapFloatBE(src[7]);\n        src += 16;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[4] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[5] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[6] = (float) ((sample6 + last_sample6) * 0.5);\n        dst[7] = (float) ((sample7 + last_sample7) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Upsample_F32MSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Upsample (x4) AUDIO_F32MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt * 4;\n    float *dst = ((float *) (cvt->buf + dstsize)) - 8 * 4;\n    const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - 8;\n    const float *target = ((const float *) cvt->buf);\n    double last_sample7 = (double) SDL_SwapFloatBE(src[7]);\n    double last_sample6 = (double) SDL_SwapFloatBE(src[6]);\n    double last_sample5 = (double) SDL_SwapFloatBE(src[5]);\n    double last_sample4 = (double) SDL_SwapFloatBE(src[4]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    while (dst >= target) {\n        const double sample7 = (double) SDL_SwapFloatBE(src[7]);\n        const double sample6 = (double) SDL_SwapFloatBE(src[6]);\n        const double sample5 = (double) SDL_SwapFloatBE(src[5]);\n        const double sample4 = (double) SDL_SwapFloatBE(src[4]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        src -= 8;\n        dst[31] = (float) ((sample7 + (3.0 * last_sample7)) * 0.25);\n        dst[30] = (float) ((sample6 + (3.0 * last_sample6)) * 0.25);\n        dst[29] = (float) ((sample5 + (3.0 * last_sample5)) * 0.25);\n        dst[28] = (float) ((sample4 + (3.0 * last_sample4)) * 0.25);\n        dst[27] = (float) ((sample3 + (3.0 * last_sample3)) * 0.25);\n        dst[26] = (float) ((sample2 + (3.0 * last_sample2)) * 0.25);\n        dst[25] = (float) ((sample1 + (3.0 * last_sample1)) * 0.25);\n        dst[24] = (float) ((sample0 + (3.0 * last_sample0)) * 0.25);\n        dst[23] = (float) ((sample7 + last_sample7) * 0.5);\n        dst[22] = (float) ((sample6 + last_sample6) * 0.5);\n        dst[21] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[20] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[19] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[18] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[17] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[16] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[15] = (float) (((3.0 * sample7) + last_sample7) * 0.25);\n        dst[14] = (float) (((3.0 * sample6) + last_sample6) * 0.25);\n        dst[13] = (float) (((3.0 * sample5) + last_sample5) * 0.25);\n        dst[12] = (float) (((3.0 * sample4) + last_sample4) * 0.25);\n        dst[11] = (float) (((3.0 * sample3) + last_sample3) * 0.25);\n        dst[10] = (float) (((3.0 * sample2) + last_sample2) * 0.25);\n        dst[9] = (float) (((3.0 * sample1) + last_sample1) * 0.25);\n        dst[8] = (float) (((3.0 * sample0) + last_sample0) * 0.25);\n        dst[7] = (float) sample7;\n        dst[6] = (float) sample6;\n        dst[5] = (float) sample5;\n        dst[4] = (float) sample4;\n        dst[3] = (float) sample3;\n        dst[2] = (float) sample2;\n        dst[1] = (float) sample1;\n        dst[0] = (float) sample0;\n        last_sample7 = sample7;\n        last_sample6 = sample6;\n        last_sample5 = sample5;\n        last_sample4 = sample4;\n        last_sample3 = sample3;\n        last_sample2 = sample2;\n        last_sample1 = sample1;\n        last_sample0 = sample0;\n        dst -= 32;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nstatic void SDLCALL\nSDL_Downsample_F32MSB_8c_x4(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Downsample (x4) AUDIO_F32MSB, 8 channels.\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt / 4;\n    float *dst = (float *) cvt->buf;\n    const float *src = (float *) cvt->buf;\n    const float *target = (const float *) (cvt->buf + dstsize);\n    double last_sample0 = (double) SDL_SwapFloatBE(src[0]);\n    double last_sample1 = (double) SDL_SwapFloatBE(src[1]);\n    double last_sample2 = (double) SDL_SwapFloatBE(src[2]);\n    double last_sample3 = (double) SDL_SwapFloatBE(src[3]);\n    double last_sample4 = (double) SDL_SwapFloatBE(src[4]);\n    double last_sample5 = (double) SDL_SwapFloatBE(src[5]);\n    double last_sample6 = (double) SDL_SwapFloatBE(src[6]);\n    double last_sample7 = (double) SDL_SwapFloatBE(src[7]);\n    while (dst < target) {\n        const double sample0 = (double) SDL_SwapFloatBE(src[0]);\n        const double sample1 = (double) SDL_SwapFloatBE(src[1]);\n        const double sample2 = (double) SDL_SwapFloatBE(src[2]);\n        const double sample3 = (double) SDL_SwapFloatBE(src[3]);\n        const double sample4 = (double) SDL_SwapFloatBE(src[4]);\n        const double sample5 = (double) SDL_SwapFloatBE(src[5]);\n        const double sample6 = (double) SDL_SwapFloatBE(src[6]);\n        const double sample7 = (double) SDL_SwapFloatBE(src[7]);\n        src += 32;\n        dst[0] = (float) ((sample0 + last_sample0) * 0.5);\n        dst[1] = (float) ((sample1 + last_sample1) * 0.5);\n        dst[2] = (float) ((sample2 + last_sample2) * 0.5);\n        dst[3] = (float) ((sample3 + last_sample3) * 0.5);\n        dst[4] = (float) ((sample4 + last_sample4) * 0.5);\n        dst[5] = (float) ((sample5 + last_sample5) * 0.5);\n        dst[6] = (float) ((sample6 + last_sample6) * 0.5);\n        dst[7] = (float) ((sample7 + last_sample7) * 0.5);\n        last_sample0 = sample0;\n        last_sample1 = sample1;\n        last_sample2 = sample2;\n        last_sample3 = sample3;\n        last_sample4 = sample4;\n        last_sample5 = sample5;\n        last_sample6 = sample6;\n        last_sample7 = sample7;\n        dst += 8;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\n#endif  /* !LESS_RESAMPLERS */\n#endif  /* !NO_RESAMPLERS */\n\n\nconst SDL_AudioRateFilters sdl_audio_rate_filters[] =\n{\n#if !NO_RESAMPLERS\n    { AUDIO_U8, 1, 0, 0, SDL_Downsample_U8_1c },\n    { AUDIO_U8, 1, 1, 0, SDL_Upsample_U8_1c },\n    { AUDIO_U8, 2, 0, 0, SDL_Downsample_U8_2c },\n    { AUDIO_U8, 2, 1, 0, SDL_Upsample_U8_2c },\n    { AUDIO_U8, 4, 0, 0, SDL_Downsample_U8_4c },\n    { AUDIO_U8, 4, 1, 0, SDL_Upsample_U8_4c },\n    { AUDIO_U8, 6, 0, 0, SDL_Downsample_U8_6c },\n    { AUDIO_U8, 6, 1, 0, SDL_Upsample_U8_6c },\n    { AUDIO_U8, 8, 0, 0, SDL_Downsample_U8_8c },\n    { AUDIO_U8, 8, 1, 0, SDL_Upsample_U8_8c },\n    { AUDIO_S8, 1, 0, 0, SDL_Downsample_S8_1c },\n    { AUDIO_S8, 1, 1, 0, SDL_Upsample_S8_1c },\n    { AUDIO_S8, 2, 0, 0, SDL_Downsample_S8_2c },\n    { AUDIO_S8, 2, 1, 0, SDL_Upsample_S8_2c },\n    { AUDIO_S8, 4, 0, 0, SDL_Downsample_S8_4c },\n    { AUDIO_S8, 4, 1, 0, SDL_Upsample_S8_4c },\n    { AUDIO_S8, 6, 0, 0, SDL_Downsample_S8_6c },\n    { AUDIO_S8, 6, 1, 0, SDL_Upsample_S8_6c },\n    { AUDIO_S8, 8, 0, 0, SDL_Downsample_S8_8c },\n    { AUDIO_S8, 8, 1, 0, SDL_Upsample_S8_8c },\n    { AUDIO_U16LSB, 1, 0, 0, SDL_Downsample_U16LSB_1c },\n    { AUDIO_U16LSB, 1, 1, 0, SDL_Upsample_U16LSB_1c },\n    { AUDIO_U16LSB, 2, 0, 0, SDL_Downsample_U16LSB_2c },\n    { AUDIO_U16LSB, 2, 1, 0, SDL_Upsample_U16LSB_2c },\n    { AUDIO_U16LSB, 4, 0, 0, SDL_Downsample_U16LSB_4c },\n    { AUDIO_U16LSB, 4, 1, 0, SDL_Upsample_U16LSB_4c },\n    { AUDIO_U16LSB, 6, 0, 0, SDL_Downsample_U16LSB_6c },\n    { AUDIO_U16LSB, 6, 1, 0, SDL_Upsample_U16LSB_6c },\n    { AUDIO_U16LSB, 8, 0, 0, SDL_Downsample_U16LSB_8c },\n    { AUDIO_U16LSB, 8, 1, 0, SDL_Upsample_U16LSB_8c },\n    { AUDIO_S16LSB, 1, 0, 0, SDL_Downsample_S16LSB_1c },\n    { AUDIO_S16LSB, 1, 1, 0, SDL_Upsample_S16LSB_1c },\n    { AUDIO_S16LSB, 2, 0, 0, SDL_Downsample_S16LSB_2c },\n    { AUDIO_S16LSB, 2, 1, 0, SDL_Upsample_S16LSB_2c },\n    { AUDIO_S16LSB, 4, 0, 0, SDL_Downsample_S16LSB_4c },\n    { AUDIO_S16LSB, 4, 1, 0, SDL_Upsample_S16LSB_4c },\n    { AUDIO_S16LSB, 6, 0, 0, SDL_Downsample_S16LSB_6c },\n    { AUDIO_S16LSB, 6, 1, 0, SDL_Upsample_S16LSB_6c },\n    { AUDIO_S16LSB, 8, 0, 0, SDL_Downsample_S16LSB_8c },\n    { AUDIO_S16LSB, 8, 1, 0, SDL_Upsample_S16LSB_8c },\n    { AUDIO_U16MSB, 1, 0, 0, SDL_Downsample_U16MSB_1c },\n    { AUDIO_U16MSB, 1, 1, 0, SDL_Upsample_U16MSB_1c },\n    { AUDIO_U16MSB, 2, 0, 0, SDL_Downsample_U16MSB_2c },\n    { AUDIO_U16MSB, 2, 1, 0, SDL_Upsample_U16MSB_2c },\n    { AUDIO_U16MSB, 4, 0, 0, SDL_Downsample_U16MSB_4c },\n    { AUDIO_U16MSB, 4, 1, 0, SDL_Upsample_U16MSB_4c },\n    { AUDIO_U16MSB, 6, 0, 0, SDL_Downsample_U16MSB_6c },\n    { AUDIO_U16MSB, 6, 1, 0, SDL_Upsample_U16MSB_6c },\n    { AUDIO_U16MSB, 8, 0, 0, SDL_Downsample_U16MSB_8c },\n    { AUDIO_U16MSB, 8, 1, 0, SDL_Upsample_U16MSB_8c },\n    { AUDIO_S16MSB, 1, 0, 0, SDL_Downsample_S16MSB_1c },\n    { AUDIO_S16MSB, 1, 1, 0, SDL_Upsample_S16MSB_1c },\n    { AUDIO_S16MSB, 2, 0, 0, SDL_Downsample_S16MSB_2c },\n    { AUDIO_S16MSB, 2, 1, 0, SDL_Upsample_S16MSB_2c },\n    { AUDIO_S16MSB, 4, 0, 0, SDL_Downsample_S16MSB_4c },\n    { AUDIO_S16MSB, 4, 1, 0, SDL_Upsample_S16MSB_4c },\n    { AUDIO_S16MSB, 6, 0, 0, SDL_Downsample_S16MSB_6c },\n    { AUDIO_S16MSB, 6, 1, 0, SDL_Upsample_S16MSB_6c },\n    { AUDIO_S16MSB, 8, 0, 0, SDL_Downsample_S16MSB_8c },\n    { AUDIO_S16MSB, 8, 1, 0, SDL_Upsample_S16MSB_8c },\n    { AUDIO_S32LSB, 1, 0, 0, SDL_Downsample_S32LSB_1c },\n    { AUDIO_S32LSB, 1, 1, 0, SDL_Upsample_S32LSB_1c },\n    { AUDIO_S32LSB, 2, 0, 0, SDL_Downsample_S32LSB_2c },\n    { AUDIO_S32LSB, 2, 1, 0, SDL_Upsample_S32LSB_2c },\n    { AUDIO_S32LSB, 4, 0, 0, SDL_Downsample_S32LSB_4c },\n    { AUDIO_S32LSB, 4, 1, 0, SDL_Upsample_S32LSB_4c },\n    { AUDIO_S32LSB, 6, 0, 0, SDL_Downsample_S32LSB_6c },\n    { AUDIO_S32LSB, 6, 1, 0, SDL_Upsample_S32LSB_6c },\n    { AUDIO_S32LSB, 8, 0, 0, SDL_Downsample_S32LSB_8c },\n    { AUDIO_S32LSB, 8, 1, 0, SDL_Upsample_S32LSB_8c },\n    { AUDIO_S32MSB, 1, 0, 0, SDL_Downsample_S32MSB_1c },\n    { AUDIO_S32MSB, 1, 1, 0, SDL_Upsample_S32MSB_1c },\n    { AUDIO_S32MSB, 2, 0, 0, SDL_Downsample_S32MSB_2c },\n    { AUDIO_S32MSB, 2, 1, 0, SDL_Upsample_S32MSB_2c },\n    { AUDIO_S32MSB, 4, 0, 0, SDL_Downsample_S32MSB_4c },\n    { AUDIO_S32MSB, 4, 1, 0, SDL_Upsample_S32MSB_4c },\n    { AUDIO_S32MSB, 6, 0, 0, SDL_Downsample_S32MSB_6c },\n    { AUDIO_S32MSB, 6, 1, 0, SDL_Upsample_S32MSB_6c },\n    { AUDIO_S32MSB, 8, 0, 0, SDL_Downsample_S32MSB_8c },\n    { AUDIO_S32MSB, 8, 1, 0, SDL_Upsample_S32MSB_8c },\n    { AUDIO_F32LSB, 1, 0, 0, SDL_Downsample_F32LSB_1c },\n    { AUDIO_F32LSB, 1, 1, 0, SDL_Upsample_F32LSB_1c },\n    { AUDIO_F32LSB, 2, 0, 0, SDL_Downsample_F32LSB_2c },\n    { AUDIO_F32LSB, 2, 1, 0, SDL_Upsample_F32LSB_2c },\n    { AUDIO_F32LSB, 4, 0, 0, SDL_Downsample_F32LSB_4c },\n    { AUDIO_F32LSB, 4, 1, 0, SDL_Upsample_F32LSB_4c },\n    { AUDIO_F32LSB, 6, 0, 0, SDL_Downsample_F32LSB_6c },\n    { AUDIO_F32LSB, 6, 1, 0, SDL_Upsample_F32LSB_6c },\n    { AUDIO_F32LSB, 8, 0, 0, SDL_Downsample_F32LSB_8c },\n    { AUDIO_F32LSB, 8, 1, 0, SDL_Upsample_F32LSB_8c },\n    { AUDIO_F32MSB, 1, 0, 0, SDL_Downsample_F32MSB_1c },\n    { AUDIO_F32MSB, 1, 1, 0, SDL_Upsample_F32MSB_1c },\n    { AUDIO_F32MSB, 2, 0, 0, SDL_Downsample_F32MSB_2c },\n    { AUDIO_F32MSB, 2, 1, 0, SDL_Upsample_F32MSB_2c },\n    { AUDIO_F32MSB, 4, 0, 0, SDL_Downsample_F32MSB_4c },\n    { AUDIO_F32MSB, 4, 1, 0, SDL_Upsample_F32MSB_4c },\n    { AUDIO_F32MSB, 6, 0, 0, SDL_Downsample_F32MSB_6c },\n    { AUDIO_F32MSB, 6, 1, 0, SDL_Upsample_F32MSB_6c },\n    { AUDIO_F32MSB, 8, 0, 0, SDL_Downsample_F32MSB_8c },\n    { AUDIO_F32MSB, 8, 1, 0, SDL_Upsample_F32MSB_8c },\n#if !LESS_RESAMPLERS\n    { AUDIO_U8, 1, 0, 2, SDL_Downsample_U8_1c_x2 },\n    { AUDIO_U8, 1, 1, 2, SDL_Upsample_U8_1c_x2 },\n    { AUDIO_U8, 1, 0, 4, SDL_Downsample_U8_1c_x4 },\n    { AUDIO_U8, 1, 1, 4, SDL_Upsample_U8_1c_x4 },\n    { AUDIO_U8, 2, 0, 2, SDL_Downsample_U8_2c_x2 },\n    { AUDIO_U8, 2, 1, 2, SDL_Upsample_U8_2c_x2 },\n    { AUDIO_U8, 2, 0, 4, SDL_Downsample_U8_2c_x4 },\n    { AUDIO_U8, 2, 1, 4, SDL_Upsample_U8_2c_x4 },\n    { AUDIO_U8, 4, 0, 2, SDL_Downsample_U8_4c_x2 },\n    { AUDIO_U8, 4, 1, 2, SDL_Upsample_U8_4c_x2 },\n    { AUDIO_U8, 4, 0, 4, SDL_Downsample_U8_4c_x4 },\n    { AUDIO_U8, 4, 1, 4, SDL_Upsample_U8_4c_x4 },\n    { AUDIO_U8, 6, 0, 2, SDL_Downsample_U8_6c_x2 },\n    { AUDIO_U8, 6, 1, 2, SDL_Upsample_U8_6c_x2 },\n    { AUDIO_U8, 6, 0, 4, SDL_Downsample_U8_6c_x4 },\n    { AUDIO_U8, 6, 1, 4, SDL_Upsample_U8_6c_x4 },\n    { AUDIO_U8, 8, 0, 2, SDL_Downsample_U8_8c_x2 },\n    { AUDIO_U8, 8, 1, 2, SDL_Upsample_U8_8c_x2 },\n    { AUDIO_U8, 8, 0, 4, SDL_Downsample_U8_8c_x4 },\n    { AUDIO_U8, 8, 1, 4, SDL_Upsample_U8_8c_x4 },\n    { AUDIO_S8, 1, 0, 2, SDL_Downsample_S8_1c_x2 },\n    { AUDIO_S8, 1, 1, 2, SDL_Upsample_S8_1c_x2 },\n    { AUDIO_S8, 1, 0, 4, SDL_Downsample_S8_1c_x4 },\n    { AUDIO_S8, 1, 1, 4, SDL_Upsample_S8_1c_x4 },\n    { AUDIO_S8, 2, 0, 2, SDL_Downsample_S8_2c_x2 },\n    { AUDIO_S8, 2, 1, 2, SDL_Upsample_S8_2c_x2 },\n    { AUDIO_S8, 2, 0, 4, SDL_Downsample_S8_2c_x4 },\n    { AUDIO_S8, 2, 1, 4, SDL_Upsample_S8_2c_x4 },\n    { AUDIO_S8, 4, 0, 2, SDL_Downsample_S8_4c_x2 },\n    { AUDIO_S8, 4, 1, 2, SDL_Upsample_S8_4c_x2 },\n    { AUDIO_S8, 4, 0, 4, SDL_Downsample_S8_4c_x4 },\n    { AUDIO_S8, 4, 1, 4, SDL_Upsample_S8_4c_x4 },\n    { AUDIO_S8, 6, 0, 2, SDL_Downsample_S8_6c_x2 },\n    { AUDIO_S8, 6, 1, 2, SDL_Upsample_S8_6c_x2 },\n    { AUDIO_S8, 6, 0, 4, SDL_Downsample_S8_6c_x4 },\n    { AUDIO_S8, 6, 1, 4, SDL_Upsample_S8_6c_x4 },\n    { AUDIO_S8, 8, 0, 2, SDL_Downsample_S8_8c_x2 },\n    { AUDIO_S8, 8, 1, 2, SDL_Upsample_S8_8c_x2 },\n    { AUDIO_S8, 8, 0, 4, SDL_Downsample_S8_8c_x4 },\n    { AUDIO_S8, 8, 1, 4, SDL_Upsample_S8_8c_x4 },\n    { AUDIO_U16LSB, 1, 0, 2, SDL_Downsample_U16LSB_1c_x2 },\n    { AUDIO_U16LSB, 1, 1, 2, SDL_Upsample_U16LSB_1c_x2 },\n    { AUDIO_U16LSB, 1, 0, 4, SDL_Downsample_U16LSB_1c_x4 },\n    { AUDIO_U16LSB, 1, 1, 4, SDL_Upsample_U16LSB_1c_x4 },\n    { AUDIO_U16LSB, 2, 0, 2, SDL_Downsample_U16LSB_2c_x2 },\n    { AUDIO_U16LSB, 2, 1, 2, SDL_Upsample_U16LSB_2c_x2 },\n    { AUDIO_U16LSB, 2, 0, 4, SDL_Downsample_U16LSB_2c_x4 },\n    { AUDIO_U16LSB, 2, 1, 4, SDL_Upsample_U16LSB_2c_x4 },\n    { AUDIO_U16LSB, 4, 0, 2, SDL_Downsample_U16LSB_4c_x2 },\n    { AUDIO_U16LSB, 4, 1, 2, SDL_Upsample_U16LSB_4c_x2 },\n    { AUDIO_U16LSB, 4, 0, 4, SDL_Downsample_U16LSB_4c_x4 },\n    { AUDIO_U16LSB, 4, 1, 4, SDL_Upsample_U16LSB_4c_x4 },\n    { AUDIO_U16LSB, 6, 0, 2, SDL_Downsample_U16LSB_6c_x2 },\n    { AUDIO_U16LSB, 6, 1, 2, SDL_Upsample_U16LSB_6c_x2 },\n    { AUDIO_U16LSB, 6, 0, 4, SDL_Downsample_U16LSB_6c_x4 },\n    { AUDIO_U16LSB, 6, 1, 4, SDL_Upsample_U16LSB_6c_x4 },\n    { AUDIO_U16LSB, 8, 0, 2, SDL_Downsample_U16LSB_8c_x2 },\n    { AUDIO_U16LSB, 8, 1, 2, SDL_Upsample_U16LSB_8c_x2 },\n    { AUDIO_U16LSB, 8, 0, 4, SDL_Downsample_U16LSB_8c_x4 },\n    { AUDIO_U16LSB, 8, 1, 4, SDL_Upsample_U16LSB_8c_x4 },\n    { AUDIO_S16LSB, 1, 0, 2, SDL_Downsample_S16LSB_1c_x2 },\n    { AUDIO_S16LSB, 1, 1, 2, SDL_Upsample_S16LSB_1c_x2 },\n    { AUDIO_S16LSB, 1, 0, 4, SDL_Downsample_S16LSB_1c_x4 },\n    { AUDIO_S16LSB, 1, 1, 4, SDL_Upsample_S16LSB_1c_x4 },\n    { AUDIO_S16LSB, 2, 0, 2, SDL_Downsample_S16LSB_2c_x2 },\n    { AUDIO_S16LSB, 2, 1, 2, SDL_Upsample_S16LSB_2c_x2 },\n    { AUDIO_S16LSB, 2, 0, 4, SDL_Downsample_S16LSB_2c_x4 },\n    { AUDIO_S16LSB, 2, 1, 4, SDL_Upsample_S16LSB_2c_x4 },\n    { AUDIO_S16LSB, 4, 0, 2, SDL_Downsample_S16LSB_4c_x2 },\n    { AUDIO_S16LSB, 4, 1, 2, SDL_Upsample_S16LSB_4c_x2 },\n    { AUDIO_S16LSB, 4, 0, 4, SDL_Downsample_S16LSB_4c_x4 },\n    { AUDIO_S16LSB, 4, 1, 4, SDL_Upsample_S16LSB_4c_x4 },\n    { AUDIO_S16LSB, 6, 0, 2, SDL_Downsample_S16LSB_6c_x2 },\n    { AUDIO_S16LSB, 6, 1, 2, SDL_Upsample_S16LSB_6c_x2 },\n    { AUDIO_S16LSB, 6, 0, 4, SDL_Downsample_S16LSB_6c_x4 },\n    { AUDIO_S16LSB, 6, 1, 4, SDL_Upsample_S16LSB_6c_x4 },\n    { AUDIO_S16LSB, 8, 0, 2, SDL_Downsample_S16LSB_8c_x2 },\n    { AUDIO_S16LSB, 8, 1, 2, SDL_Upsample_S16LSB_8c_x2 },\n    { AUDIO_S16LSB, 8, 0, 4, SDL_Downsample_S16LSB_8c_x4 },\n    { AUDIO_S16LSB, 8, 1, 4, SDL_Upsample_S16LSB_8c_x4 },\n    { AUDIO_U16MSB, 1, 0, 2, SDL_Downsample_U16MSB_1c_x2 },\n    { AUDIO_U16MSB, 1, 1, 2, SDL_Upsample_U16MSB_1c_x2 },\n    { AUDIO_U16MSB, 1, 0, 4, SDL_Downsample_U16MSB_1c_x4 },\n    { AUDIO_U16MSB, 1, 1, 4, SDL_Upsample_U16MSB_1c_x4 },\n    { AUDIO_U16MSB, 2, 0, 2, SDL_Downsample_U16MSB_2c_x2 },\n    { AUDIO_U16MSB, 2, 1, 2, SDL_Upsample_U16MSB_2c_x2 },\n    { AUDIO_U16MSB, 2, 0, 4, SDL_Downsample_U16MSB_2c_x4 },\n    { AUDIO_U16MSB, 2, 1, 4, SDL_Upsample_U16MSB_2c_x4 },\n    { AUDIO_U16MSB, 4, 0, 2, SDL_Downsample_U16MSB_4c_x2 },\n    { AUDIO_U16MSB, 4, 1, 2, SDL_Upsample_U16MSB_4c_x2 },\n    { AUDIO_U16MSB, 4, 0, 4, SDL_Downsample_U16MSB_4c_x4 },\n    { AUDIO_U16MSB, 4, 1, 4, SDL_Upsample_U16MSB_4c_x4 },\n    { AUDIO_U16MSB, 6, 0, 2, SDL_Downsample_U16MSB_6c_x2 },\n    { AUDIO_U16MSB, 6, 1, 2, SDL_Upsample_U16MSB_6c_x2 },\n    { AUDIO_U16MSB, 6, 0, 4, SDL_Downsample_U16MSB_6c_x4 },\n    { AUDIO_U16MSB, 6, 1, 4, SDL_Upsample_U16MSB_6c_x4 },\n    { AUDIO_U16MSB, 8, 0, 2, SDL_Downsample_U16MSB_8c_x2 },\n    { AUDIO_U16MSB, 8, 1, 2, SDL_Upsample_U16MSB_8c_x2 },\n    { AUDIO_U16MSB, 8, 0, 4, SDL_Downsample_U16MSB_8c_x4 },\n    { AUDIO_U16MSB, 8, 1, 4, SDL_Upsample_U16MSB_8c_x4 },\n    { AUDIO_S16MSB, 1, 0, 2, SDL_Downsample_S16MSB_1c_x2 },\n    { AUDIO_S16MSB, 1, 1, 2, SDL_Upsample_S16MSB_1c_x2 },\n    { AUDIO_S16MSB, 1, 0, 4, SDL_Downsample_S16MSB_1c_x4 },\n    { AUDIO_S16MSB, 1, 1, 4, SDL_Upsample_S16MSB_1c_x4 },\n    { AUDIO_S16MSB, 2, 0, 2, SDL_Downsample_S16MSB_2c_x2 },\n    { AUDIO_S16MSB, 2, 1, 2, SDL_Upsample_S16MSB_2c_x2 },\n    { AUDIO_S16MSB, 2, 0, 4, SDL_Downsample_S16MSB_2c_x4 },\n    { AUDIO_S16MSB, 2, 1, 4, SDL_Upsample_S16MSB_2c_x4 },\n    { AUDIO_S16MSB, 4, 0, 2, SDL_Downsample_S16MSB_4c_x2 },\n    { AUDIO_S16MSB, 4, 1, 2, SDL_Upsample_S16MSB_4c_x2 },\n    { AUDIO_S16MSB, 4, 0, 4, SDL_Downsample_S16MSB_4c_x4 },\n    { AUDIO_S16MSB, 4, 1, 4, SDL_Upsample_S16MSB_4c_x4 },\n    { AUDIO_S16MSB, 6, 0, 2, SDL_Downsample_S16MSB_6c_x2 },\n    { AUDIO_S16MSB, 6, 1, 2, SDL_Upsample_S16MSB_6c_x2 },\n    { AUDIO_S16MSB, 6, 0, 4, SDL_Downsample_S16MSB_6c_x4 },\n    { AUDIO_S16MSB, 6, 1, 4, SDL_Upsample_S16MSB_6c_x4 },\n    { AUDIO_S16MSB, 8, 0, 2, SDL_Downsample_S16MSB_8c_x2 },\n    { AUDIO_S16MSB, 8, 1, 2, SDL_Upsample_S16MSB_8c_x2 },\n    { AUDIO_S16MSB, 8, 0, 4, SDL_Downsample_S16MSB_8c_x4 },\n    { AUDIO_S16MSB, 8, 1, 4, SDL_Upsample_S16MSB_8c_x4 },\n    { AUDIO_S32LSB, 1, 0, 2, SDL_Downsample_S32LSB_1c_x2 },\n    { AUDIO_S32LSB, 1, 1, 2, SDL_Upsample_S32LSB_1c_x2 },\n    { AUDIO_S32LSB, 1, 0, 4, SDL_Downsample_S32LSB_1c_x4 },\n    { AUDIO_S32LSB, 1, 1, 4, SDL_Upsample_S32LSB_1c_x4 },\n    { AUDIO_S32LSB, 2, 0, 2, SDL_Downsample_S32LSB_2c_x2 },\n    { AUDIO_S32LSB, 2, 1, 2, SDL_Upsample_S32LSB_2c_x2 },\n    { AUDIO_S32LSB, 2, 0, 4, SDL_Downsample_S32LSB_2c_x4 },\n    { AUDIO_S32LSB, 2, 1, 4, SDL_Upsample_S32LSB_2c_x4 },\n    { AUDIO_S32LSB, 4, 0, 2, SDL_Downsample_S32LSB_4c_x2 },\n    { AUDIO_S32LSB, 4, 1, 2, SDL_Upsample_S32LSB_4c_x2 },\n    { AUDIO_S32LSB, 4, 0, 4, SDL_Downsample_S32LSB_4c_x4 },\n    { AUDIO_S32LSB, 4, 1, 4, SDL_Upsample_S32LSB_4c_x4 },\n    { AUDIO_S32LSB, 6, 0, 2, SDL_Downsample_S32LSB_6c_x2 },\n    { AUDIO_S32LSB, 6, 1, 2, SDL_Upsample_S32LSB_6c_x2 },\n    { AUDIO_S32LSB, 6, 0, 4, SDL_Downsample_S32LSB_6c_x4 },\n    { AUDIO_S32LSB, 6, 1, 4, SDL_Upsample_S32LSB_6c_x4 },\n    { AUDIO_S32LSB, 8, 0, 2, SDL_Downsample_S32LSB_8c_x2 },\n    { AUDIO_S32LSB, 8, 1, 2, SDL_Upsample_S32LSB_8c_x2 },\n    { AUDIO_S32LSB, 8, 0, 4, SDL_Downsample_S32LSB_8c_x4 },\n    { AUDIO_S32LSB, 8, 1, 4, SDL_Upsample_S32LSB_8c_x4 },\n    { AUDIO_S32MSB, 1, 0, 2, SDL_Downsample_S32MSB_1c_x2 },\n    { AUDIO_S32MSB, 1, 1, 2, SDL_Upsample_S32MSB_1c_x2 },\n    { AUDIO_S32MSB, 1, 0, 4, SDL_Downsample_S32MSB_1c_x4 },\n    { AUDIO_S32MSB, 1, 1, 4, SDL_Upsample_S32MSB_1c_x4 },\n    { AUDIO_S32MSB, 2, 0, 2, SDL_Downsample_S32MSB_2c_x2 },\n    { AUDIO_S32MSB, 2, 1, 2, SDL_Upsample_S32MSB_2c_x2 },\n    { AUDIO_S32MSB, 2, 0, 4, SDL_Downsample_S32MSB_2c_x4 },\n    { AUDIO_S32MSB, 2, 1, 4, SDL_Upsample_S32MSB_2c_x4 },\n    { AUDIO_S32MSB, 4, 0, 2, SDL_Downsample_S32MSB_4c_x2 },\n    { AUDIO_S32MSB, 4, 1, 2, SDL_Upsample_S32MSB_4c_x2 },\n    { AUDIO_S32MSB, 4, 0, 4, SDL_Downsample_S32MSB_4c_x4 },\n    { AUDIO_S32MSB, 4, 1, 4, SDL_Upsample_S32MSB_4c_x4 },\n    { AUDIO_S32MSB, 6, 0, 2, SDL_Downsample_S32MSB_6c_x2 },\n    { AUDIO_S32MSB, 6, 1, 2, SDL_Upsample_S32MSB_6c_x2 },\n    { AUDIO_S32MSB, 6, 0, 4, SDL_Downsample_S32MSB_6c_x4 },\n    { AUDIO_S32MSB, 6, 1, 4, SDL_Upsample_S32MSB_6c_x4 },\n    { AUDIO_S32MSB, 8, 0, 2, SDL_Downsample_S32MSB_8c_x2 },\n    { AUDIO_S32MSB, 8, 1, 2, SDL_Upsample_S32MSB_8c_x2 },\n    { AUDIO_S32MSB, 8, 0, 4, SDL_Downsample_S32MSB_8c_x4 },\n    { AUDIO_S32MSB, 8, 1, 4, SDL_Upsample_S32MSB_8c_x4 },\n    { AUDIO_F32LSB, 1, 0, 2, SDL_Downsample_F32LSB_1c_x2 },\n    { AUDIO_F32LSB, 1, 1, 2, SDL_Upsample_F32LSB_1c_x2 },\n    { AUDIO_F32LSB, 1, 0, 4, SDL_Downsample_F32LSB_1c_x4 },\n    { AUDIO_F32LSB, 1, 1, 4, SDL_Upsample_F32LSB_1c_x4 },\n    { AUDIO_F32LSB, 2, 0, 2, SDL_Downsample_F32LSB_2c_x2 },\n    { AUDIO_F32LSB, 2, 1, 2, SDL_Upsample_F32LSB_2c_x2 },\n    { AUDIO_F32LSB, 2, 0, 4, SDL_Downsample_F32LSB_2c_x4 },\n    { AUDIO_F32LSB, 2, 1, 4, SDL_Upsample_F32LSB_2c_x4 },\n    { AUDIO_F32LSB, 4, 0, 2, SDL_Downsample_F32LSB_4c_x2 },\n    { AUDIO_F32LSB, 4, 1, 2, SDL_Upsample_F32LSB_4c_x2 },\n    { AUDIO_F32LSB, 4, 0, 4, SDL_Downsample_F32LSB_4c_x4 },\n    { AUDIO_F32LSB, 4, 1, 4, SDL_Upsample_F32LSB_4c_x4 },\n    { AUDIO_F32LSB, 6, 0, 2, SDL_Downsample_F32LSB_6c_x2 },\n    { AUDIO_F32LSB, 6, 1, 2, SDL_Upsample_F32LSB_6c_x2 },\n    { AUDIO_F32LSB, 6, 0, 4, SDL_Downsample_F32LSB_6c_x4 },\n    { AUDIO_F32LSB, 6, 1, 4, SDL_Upsample_F32LSB_6c_x4 },\n    { AUDIO_F32LSB, 8, 0, 2, SDL_Downsample_F32LSB_8c_x2 },\n    { AUDIO_F32LSB, 8, 1, 2, SDL_Upsample_F32LSB_8c_x2 },\n    { AUDIO_F32LSB, 8, 0, 4, SDL_Downsample_F32LSB_8c_x4 },\n    { AUDIO_F32LSB, 8, 1, 4, SDL_Upsample_F32LSB_8c_x4 },\n    { AUDIO_F32MSB, 1, 0, 2, SDL_Downsample_F32MSB_1c_x2 },\n    { AUDIO_F32MSB, 1, 1, 2, SDL_Upsample_F32MSB_1c_x2 },\n    { AUDIO_F32MSB, 1, 0, 4, SDL_Downsample_F32MSB_1c_x4 },\n    { AUDIO_F32MSB, 1, 1, 4, SDL_Upsample_F32MSB_1c_x4 },\n    { AUDIO_F32MSB, 2, 0, 2, SDL_Downsample_F32MSB_2c_x2 },\n    { AUDIO_F32MSB, 2, 1, 2, SDL_Upsample_F32MSB_2c_x2 },\n    { AUDIO_F32MSB, 2, 0, 4, SDL_Downsample_F32MSB_2c_x4 },\n    { AUDIO_F32MSB, 2, 1, 4, SDL_Upsample_F32MSB_2c_x4 },\n    { AUDIO_F32MSB, 4, 0, 2, SDL_Downsample_F32MSB_4c_x2 },\n    { AUDIO_F32MSB, 4, 1, 2, SDL_Upsample_F32MSB_4c_x2 },\n    { AUDIO_F32MSB, 4, 0, 4, SDL_Downsample_F32MSB_4c_x4 },\n    { AUDIO_F32MSB, 4, 1, 4, SDL_Upsample_F32MSB_4c_x4 },\n    { AUDIO_F32MSB, 6, 0, 2, SDL_Downsample_F32MSB_6c_x2 },\n    { AUDIO_F32MSB, 6, 1, 2, SDL_Upsample_F32MSB_6c_x2 },\n    { AUDIO_F32MSB, 6, 0, 4, SDL_Downsample_F32MSB_6c_x4 },\n    { AUDIO_F32MSB, 6, 1, 4, SDL_Upsample_F32MSB_6c_x4 },\n    { AUDIO_F32MSB, 8, 0, 2, SDL_Downsample_F32MSB_8c_x2 },\n    { AUDIO_F32MSB, 8, 1, 2, SDL_Upsample_F32MSB_8c_x2 },\n    { AUDIO_F32MSB, 8, 0, 4, SDL_Downsample_F32MSB_8c_x4 },\n    { AUDIO_F32MSB, 8, 1, 4, SDL_Upsample_F32MSB_8c_x4 },\n#endif  /* !LESS_RESAMPLERS */\n#endif  /* !NO_RESAMPLERS */\n    { 0, 0, 0, 0, NULL }\n};\n\n/* 390 converters generated. */\n\n/* *INDENT-ON* */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_mixer.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* This provides the default mixing callback for the SDL audio routines */\n\n#include \"SDL_cpuinfo.h\"\n#include \"SDL_timer.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_sysaudio.h\"\n\n/* This table is used to add two sound values together and pin\n * the value to avoid overflow.  (used with permission from ARDI)\n * Changed to use 0xFE instead of 0xFF for better sound quality.\n */\nstatic const Uint8 mix8[] = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,\n    0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,\n    0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,\n    0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24,\n    0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,\n    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A,\n    0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,\n    0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,\n    0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B,\n    0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,\n    0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,\n    0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C,\n    0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,\n    0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92,\n    0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D,\n    0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,\n    0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3,\n    0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE,\n    0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9,\n    0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4,\n    0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,\n    0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA,\n    0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5,\n    0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,\n    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE\n};\n\n/* The volume ranges from 0 - 128 */\n#define ADJUST_VOLUME(s, v) (s = (s*v)/SDL_MIX_MAXVOLUME)\n#define ADJUST_VOLUME_U8(s, v)  (s = (((s-128)*v)/SDL_MIX_MAXVOLUME)+128)\n\n\nvoid\nSDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format,\n                   Uint32 len, int volume)\n{\n    if (volume == 0) {\n        return;\n    }\n\n    switch (format) {\n\n    case AUDIO_U8:\n        {\n#if defined(__GNUC__) && defined(__M68000__) && !defined(__mcoldfire__) && defined(SDL_ASSEMBLY_ROUTINES)\n            SDL_MixAudio_m68k_U8((char *) dst, (char *) src,\n                                 (unsigned long) len, (long) volume,\n                                 (char *) mix8);\n#else\n            Uint8 src_sample;\n\n            while (len--) {\n                src_sample = *src;\n                ADJUST_VOLUME_U8(src_sample, volume);\n                *dst = mix8[*dst + src_sample];\n                ++dst;\n                ++src;\n            }\n#endif\n        }\n        break;\n\n    case AUDIO_S8:\n        {\n            Sint8 *dst8, *src8;\n            Sint8 src_sample;\n            int dst_sample;\n            const int max_audioval = ((1 << (8 - 1)) - 1);\n            const int min_audioval = -(1 << (8 - 1));\n\n            src8 = (Sint8 *) src;\n            dst8 = (Sint8 *) dst;\n            while (len--) {\n                src_sample = *src8;\n                ADJUST_VOLUME(src_sample, volume);\n                dst_sample = *dst8 + src_sample;\n                if (dst_sample > max_audioval) {\n                    *dst8 = max_audioval;\n                } else if (dst_sample < min_audioval) {\n                    *dst8 = min_audioval;\n                } else {\n                    *dst8 = dst_sample;\n                }\n                ++dst8;\n                ++src8;\n            }\n        }\n        break;\n\n    case AUDIO_S16LSB:\n        {\n            Sint16 src1, src2;\n            int dst_sample;\n            const int max_audioval = ((1 << (16 - 1)) - 1);\n            const int min_audioval = -(1 << (16 - 1));\n\n            len /= 2;\n            while (len--) {\n                src1 = ((src[1]) << 8 | src[0]);\n                ADJUST_VOLUME(src1, volume);\n                src2 = ((dst[1]) << 8 | dst[0]);\n                src += 2;\n                dst_sample = src1 + src2;\n                if (dst_sample > max_audioval) {\n                    dst_sample = max_audioval;\n                } else if (dst_sample < min_audioval) {\n                    dst_sample = min_audioval;\n                }\n                dst[0] = dst_sample & 0xFF;\n                dst_sample >>= 8;\n                dst[1] = dst_sample & 0xFF;\n                dst += 2;\n            }\n        }\n        break;\n\n    case AUDIO_S16MSB:\n        {\n#if defined(__GNUC__) && defined(__M68000__) && !defined(__mcoldfire__) && defined(SDL_ASSEMBLY_ROUTINES)\n            SDL_MixAudio_m68k_S16MSB((short *) dst, (short *) src,\n                                     (unsigned long) len, (long) volume);\n#else\n            Sint16 src1, src2;\n            int dst_sample;\n            const int max_audioval = ((1 << (16 - 1)) - 1);\n            const int min_audioval = -(1 << (16 - 1));\n\n            len /= 2;\n            while (len--) {\n                src1 = ((src[0]) << 8 | src[1]);\n                ADJUST_VOLUME(src1, volume);\n                src2 = ((dst[0]) << 8 | dst[1]);\n                src += 2;\n                dst_sample = src1 + src2;\n                if (dst_sample > max_audioval) {\n                    dst_sample = max_audioval;\n                } else if (dst_sample < min_audioval) {\n                    dst_sample = min_audioval;\n                }\n                dst[1] = dst_sample & 0xFF;\n                dst_sample >>= 8;\n                dst[0] = dst_sample & 0xFF;\n                dst += 2;\n            }\n#endif\n        }\n        break;\n\n    case AUDIO_U16LSB:\n        {\n            Uint16 src1, src2;\n            int dst_sample;\n            const int max_audioval = 0xFFFF;\n\n            len /= 2;\n            while (len--) {\n                src1 = ((src[1]) << 8 | src[0]);\n                ADJUST_VOLUME(src1, volume);\n                src2 = ((dst[1]) << 8 | dst[0]);\n                src += 2;\n                dst_sample = src1 + src2;\n                if (dst_sample > max_audioval) {\n                    dst_sample = max_audioval;\n                }\n                dst[0] = dst_sample & 0xFF;\n                dst_sample >>= 8;\n                dst[1] = dst_sample & 0xFF;\n                dst += 2;\n            }\n        }\n        break;\n\n    case AUDIO_U16MSB:\n        {\n            Uint16 src1, src2;\n            int dst_sample;\n            const int max_audioval = 0xFFFF;\n\n            len /= 2;\n            while (len--) {\n                src1 = ((src[0]) << 8 | src[1]);\n                ADJUST_VOLUME(src1, volume);\n                src2 = ((dst[0]) << 8 | dst[1]);\n                src += 2;\n                dst_sample = src1 + src2;\n                if (dst_sample > max_audioval) {\n                    dst_sample = max_audioval;\n                }\n                dst[1] = dst_sample & 0xFF;\n                dst_sample >>= 8;\n                dst[0] = dst_sample & 0xFF;\n                dst += 2;\n            }\n        }\n        break;\n\n    case AUDIO_S32LSB:\n        {\n            const Uint32 *src32 = (Uint32 *) src;\n            Uint32 *dst32 = (Uint32 *) dst;\n            Sint64 src1, src2;\n            Sint64 dst_sample;\n            const Sint64 max_audioval = ((((Sint64) 1) << (32 - 1)) - 1);\n            const Sint64 min_audioval = -(((Sint64) 1) << (32 - 1));\n\n            len /= 4;\n            while (len--) {\n                src1 = (Sint64) ((Sint32) SDL_SwapLE32(*src32));\n                src32++;\n                ADJUST_VOLUME(src1, volume);\n                src2 = (Sint64) ((Sint32) SDL_SwapLE32(*dst32));\n                dst_sample = src1 + src2;\n                if (dst_sample > max_audioval) {\n                    dst_sample = max_audioval;\n                } else if (dst_sample < min_audioval) {\n                    dst_sample = min_audioval;\n                }\n                *(dst32++) = SDL_SwapLE32((Uint32) ((Sint32) dst_sample));\n            }\n        }\n        break;\n\n    case AUDIO_S32MSB:\n        {\n            const Uint32 *src32 = (Uint32 *) src;\n            Uint32 *dst32 = (Uint32 *) dst;\n            Sint64 src1, src2;\n            Sint64 dst_sample;\n            const Sint64 max_audioval = ((((Sint64) 1) << (32 - 1)) - 1);\n            const Sint64 min_audioval = -(((Sint64) 1) << (32 - 1));\n\n            len /= 4;\n            while (len--) {\n                src1 = (Sint64) ((Sint32) SDL_SwapBE32(*src32));\n                src32++;\n                ADJUST_VOLUME(src1, volume);\n                src2 = (Sint64) ((Sint32) SDL_SwapBE32(*dst32));\n                dst_sample = src1 + src2;\n                if (dst_sample > max_audioval) {\n                    dst_sample = max_audioval;\n                } else if (dst_sample < min_audioval) {\n                    dst_sample = min_audioval;\n                }\n                *(dst32++) = SDL_SwapBE32((Uint32) ((Sint32) dst_sample));\n            }\n        }\n        break;\n\n    case AUDIO_F32LSB:\n        {\n            const float fmaxvolume = 1.0f / ((float) SDL_MIX_MAXVOLUME);\n            const float fvolume = (float) volume;\n            const float *src32 = (float *) src;\n            float *dst32 = (float *) dst;\n            float src1, src2;\n            double dst_sample;\n            /* !!! FIXME: are these right? */\n            const double max_audioval = 3.402823466e+38F;\n            const double min_audioval = -3.402823466e+38F;\n\n            len /= 4;\n            while (len--) {\n                src1 = ((SDL_SwapFloatLE(*src32) * fvolume) * fmaxvolume);\n                src2 = SDL_SwapFloatLE(*dst32);\n                src32++;\n\n                dst_sample = ((double) src1) + ((double) src2);\n                if (dst_sample > max_audioval) {\n                    dst_sample = max_audioval;\n                } else if (dst_sample < min_audioval) {\n                    dst_sample = min_audioval;\n                }\n                *(dst32++) = SDL_SwapFloatLE((float) dst_sample);\n            }\n        }\n        break;\n\n    case AUDIO_F32MSB:\n        {\n            const float fmaxvolume = 1.0f / ((float) SDL_MIX_MAXVOLUME);\n            const float fvolume = (float) volume;\n            const float *src32 = (float *) src;\n            float *dst32 = (float *) dst;\n            float src1, src2;\n            double dst_sample;\n            /* !!! FIXME: are these right? */\n            const double max_audioval = 3.402823466e+38F;\n            const double min_audioval = -3.402823466e+38F;\n\n            len /= 4;\n            while (len--) {\n                src1 = ((SDL_SwapFloatBE(*src32) * fvolume) * fmaxvolume);\n                src2 = SDL_SwapFloatBE(*dst32);\n                src32++;\n\n                dst_sample = ((double) src1) + ((double) src2);\n                if (dst_sample > max_audioval) {\n                    dst_sample = max_audioval;\n                } else if (dst_sample < min_audioval) {\n                    dst_sample = min_audioval;\n                }\n                *(dst32++) = SDL_SwapFloatBE((float) dst_sample);\n            }\n        }\n        break;\n\n    default:                   /* If this happens... FIXME! */\n        SDL_SetError(\"SDL_MixAudioFormat(): unknown audio format\");\n        return;\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_sysaudio.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_sysaudio_h\n#define _SDL_sysaudio_h\n\n#include \"SDL_mutex.h\"\n#include \"SDL_thread.h\"\n\n/* !!! FIXME: These are wordy and unlocalized... */\n#define DEFAULT_OUTPUT_DEVNAME \"System audio output device\"\n#define DEFAULT_INPUT_DEVNAME \"System audio capture device\"\n\n/* The SDL audio driver */\ntypedef struct SDL_AudioDevice SDL_AudioDevice;\n#define _THIS   SDL_AudioDevice *_this\n\n/* Audio targets should call this as devices are added to the system (such as\n   a USB headset being plugged in), and should also be called for\n   for every device found during DetectDevices(). */\nextern void SDL_AddAudioDevice(const int iscapture, const char *name, void *handle);\n\n/* Audio targets should call this as devices are removed, so SDL can update\n   its list of available devices. */\nextern void SDL_RemoveAudioDevice(const int iscapture, void *handle);\n\n/* Audio targets should call this if an opened audio device is lost while\n   being used. This can happen due to i/o errors, or a device being unplugged,\n   etc. If the device is totally gone, please also call SDL_RemoveAudioDevice()\n   as appropriate so SDL's list of devices is accurate. */\nextern void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device);\n\n\n/* This is the size of a packet when using SDL_QueueAudio(). We allocate\n   these as necessary and pool them, under the assumption that we'll\n   eventually end up with a handful that keep recycling, meeting whatever\n   the app needs. We keep packing data tightly as more arrives to avoid\n   wasting space, and if we get a giant block of data, we'll split them\n   into multiple packets behind the scenes. My expectation is that most\n   apps will have 2-3 of these in the pool. 8k should cover most needs, but\n   if this is crippling for some embedded system, we can #ifdef this.\n   The system preallocates enough packets for 2 callbacks' worth of data. */\n#define SDL_AUDIOBUFFERQUEUE_PACKETLEN (8 * 1024)\n\n/* Used by apps that queue audio instead of using the callback. */\ntypedef struct SDL_AudioBufferQueue\n{\n    Uint8 data[SDL_AUDIOBUFFERQUEUE_PACKETLEN];  /* packet data. */\n    Uint32 datalen;  /* bytes currently in use in this packet. */\n    Uint32 startpos;  /* bytes currently consumed in this packet. */\n    struct SDL_AudioBufferQueue *next;  /* next item in linked list. */\n} SDL_AudioBufferQueue;\n\ntypedef struct SDL_AudioDriverImpl\n{\n    void (*DetectDevices) (void);\n    int (*OpenDevice) (_THIS, void *handle, const char *devname, int iscapture);\n    void (*ThreadInit) (_THIS); /* Called by audio thread at start */\n    void (*WaitDevice) (_THIS);\n    void (*PlayDevice) (_THIS);\n    int (*GetPendingBytes) (_THIS);\n    Uint8 *(*GetDeviceBuf) (_THIS);\n    int (*CaptureFromDevice) (_THIS, void *buffer, int buflen);\n    void (*FlushCapture) (_THIS);\n    void (*PrepareToClose) (_THIS);  /**< Called between run and draining wait for playback devices */\n    void (*CloseDevice) (_THIS);\n    void (*LockDevice) (_THIS);\n    void (*UnlockDevice) (_THIS);\n    void (*FreeDeviceHandle) (void *handle);  /**< SDL is done with handle from SDL_AddAudioDevice() */\n    void (*Deinitialize) (void);\n\n    /* !!! FIXME: add pause(), so we can optimize instead of mixing silence. */\n\n    /* Some flags to push duplicate code into the core and reduce #ifdefs. */\n    /* !!! FIXME: these should be SDL_bool */\n    int ProvidesOwnCallbackThread;\n    int SkipMixerLock;\n    int HasCaptureSupport;\n    int OnlyHasDefaultOutputDevice;\n    int OnlyHasDefaultCaptureDevice;\n    int AllowsArbitraryDeviceNames;\n} SDL_AudioDriverImpl;\n\n\ntypedef struct SDL_AudioDeviceItem\n{\n    void *handle;\n    struct SDL_AudioDeviceItem *next;\n    #if (defined(__GNUC__) && (__GNUC__ <= 2))\n    char name[1];  /* actually variable length. */\n    #else\n    char name[];\n    #endif\n} SDL_AudioDeviceItem;\n\n\ntypedef struct SDL_AudioDriver\n{\n    /* * * */\n    /* The name of this audio driver */\n    const char *name;\n\n    /* * * */\n    /* The description of this audio driver */\n    const char *desc;\n\n    SDL_AudioDriverImpl impl;\n\n    /* A mutex for device detection */\n    SDL_mutex *detectionLock;\n    SDL_bool captureDevicesRemoved;\n    SDL_bool outputDevicesRemoved;\n    int outputDeviceCount;\n    int inputDeviceCount;\n    SDL_AudioDeviceItem *outputDevices;\n    SDL_AudioDeviceItem *inputDevices;\n} SDL_AudioDriver;\n\n\n/* Streamer */\ntypedef struct\n{\n    Uint8 *buffer;\n    int max_len;                /* the maximum length in bytes */\n    int read_pos, write_pos;    /* the position of the write and read heads in bytes */\n} SDL_AudioStreamer;\n\n\n/* Define the SDL audio driver structure */\nstruct SDL_AudioDevice\n{\n    /* * * */\n    /* Data common to all devices */\n    SDL_AudioDeviceID id;\n\n    /* The current audio specification (shared with audio thread) */\n    SDL_AudioSpec spec;\n\n    /* An audio conversion block for audio format emulation */\n    SDL_AudioCVT convert;\n\n    /* The streamer, if sample rate conversion necessitates it */\n    int use_streamer;\n    SDL_AudioStreamer streamer;\n\n    /* Current state flags */\n    SDL_atomic_t shutdown; /* true if we are signaling the play thread to end. */\n    SDL_atomic_t enabled;  /* true if device is functioning and connected. */\n    SDL_atomic_t paused;\n    SDL_bool iscapture;\n\n    /* Fake audio buffer for when the audio hardware is busy */\n    Uint8 *fake_stream;\n\n    /* A mutex for locking the mixing buffers */\n    SDL_mutex *mixer_lock;\n\n    /* A thread to feed the audio device */\n    SDL_Thread *thread;\n    SDL_threadID threadid;\n\n    /* Queued buffers (if app not using callback). */\n    SDL_AudioBufferQueue *buffer_queue_head; /* device fed from here. */\n    SDL_AudioBufferQueue *buffer_queue_tail; /* queue fills to here. */\n    SDL_AudioBufferQueue *buffer_queue_pool; /* these are unused packets. */\n    Uint32 queued_bytes;  /* number of bytes of audio data in the queue. */\n\n    /* * * */\n    /* Data private to this driver */\n    struct SDL_PrivateAudioData *hidden;\n\n    void *handle;\n};\n#undef _THIS\n\ntypedef struct AudioBootStrap\n{\n    const char *name;\n    const char *desc;\n    int (*init) (SDL_AudioDriverImpl * impl);\n    int demand_only;  /* 1==request explicitly, or it won't be available. */\n} AudioBootStrap;\n\n#endif /* _SDL_sysaudio_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_wave.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Microsoft WAVE file loading routines */\n\n#include \"SDL_audio.h\"\n#include \"SDL_wave.h\"\n\n\nstatic int ReadChunk(SDL_RWops * src, Chunk * chunk);\n\nstruct MS_ADPCM_decodestate\n{\n    Uint8 hPredictor;\n    Uint16 iDelta;\n    Sint16 iSamp1;\n    Sint16 iSamp2;\n};\nstatic struct MS_ADPCM_decoder\n{\n    WaveFMT wavefmt;\n    Uint16 wSamplesPerBlock;\n    Uint16 wNumCoef;\n    Sint16 aCoeff[7][2];\n    /* * * */\n    struct MS_ADPCM_decodestate state[2];\n} MS_ADPCM_state;\n\nstatic int\nInitMS_ADPCM(WaveFMT * format)\n{\n    Uint8 *rogue_feel;\n    int i;\n\n    /* Set the rogue pointer to the MS_ADPCM specific data */\n    MS_ADPCM_state.wavefmt.encoding = SDL_SwapLE16(format->encoding);\n    MS_ADPCM_state.wavefmt.channels = SDL_SwapLE16(format->channels);\n    MS_ADPCM_state.wavefmt.frequency = SDL_SwapLE32(format->frequency);\n    MS_ADPCM_state.wavefmt.byterate = SDL_SwapLE32(format->byterate);\n    MS_ADPCM_state.wavefmt.blockalign = SDL_SwapLE16(format->blockalign);\n    MS_ADPCM_state.wavefmt.bitspersample =\n        SDL_SwapLE16(format->bitspersample);\n    rogue_feel = (Uint8 *) format + sizeof(*format);\n    if (sizeof(*format) == 16) {\n        /* const Uint16 extra_info = ((rogue_feel[1] << 8) | rogue_feel[0]); */\n        rogue_feel += sizeof(Uint16);\n    }\n    MS_ADPCM_state.wSamplesPerBlock = ((rogue_feel[1] << 8) | rogue_feel[0]);\n    rogue_feel += sizeof(Uint16);\n    MS_ADPCM_state.wNumCoef = ((rogue_feel[1] << 8) | rogue_feel[0]);\n    rogue_feel += sizeof(Uint16);\n    if (MS_ADPCM_state.wNumCoef != 7) {\n        SDL_SetError(\"Unknown set of MS_ADPCM coefficients\");\n        return (-1);\n    }\n    for (i = 0; i < MS_ADPCM_state.wNumCoef; ++i) {\n        MS_ADPCM_state.aCoeff[i][0] = ((rogue_feel[1] << 8) | rogue_feel[0]);\n        rogue_feel += sizeof(Uint16);\n        MS_ADPCM_state.aCoeff[i][1] = ((rogue_feel[1] << 8) | rogue_feel[0]);\n        rogue_feel += sizeof(Uint16);\n    }\n    return (0);\n}\n\nstatic Sint32\nMS_ADPCM_nibble(struct MS_ADPCM_decodestate *state,\n                Uint8 nybble, Sint16 * coeff)\n{\n    const Sint32 max_audioval = ((1 << (16 - 1)) - 1);\n    const Sint32 min_audioval = -(1 << (16 - 1));\n    const Sint32 adaptive[] = {\n        230, 230, 230, 230, 307, 409, 512, 614,\n        768, 614, 512, 409, 307, 230, 230, 230\n    };\n    Sint32 new_sample, delta;\n\n    new_sample = ((state->iSamp1 * coeff[0]) +\n                  (state->iSamp2 * coeff[1])) / 256;\n    if (nybble & 0x08) {\n        new_sample += state->iDelta * (nybble - 0x10);\n    } else {\n        new_sample += state->iDelta * nybble;\n    }\n    if (new_sample < min_audioval) {\n        new_sample = min_audioval;\n    } else if (new_sample > max_audioval) {\n        new_sample = max_audioval;\n    }\n    delta = ((Sint32) state->iDelta * adaptive[nybble]) / 256;\n    if (delta < 16) {\n        delta = 16;\n    }\n    state->iDelta = (Uint16) delta;\n    state->iSamp2 = state->iSamp1;\n    state->iSamp1 = (Sint16) new_sample;\n    return (new_sample);\n}\n\nstatic int\nMS_ADPCM_decode(Uint8 ** audio_buf, Uint32 * audio_len)\n{\n    struct MS_ADPCM_decodestate *state[2];\n    Uint8 *freeable, *encoded, *decoded;\n    Sint32 encoded_len, samplesleft;\n    Sint8 nybble;\n    Uint8 stereo;\n    Sint16 *coeff[2];\n    Sint32 new_sample;\n\n    /* Allocate the proper sized output buffer */\n    encoded_len = *audio_len;\n    encoded = *audio_buf;\n    freeable = *audio_buf;\n    *audio_len = (encoded_len / MS_ADPCM_state.wavefmt.blockalign) *\n        MS_ADPCM_state.wSamplesPerBlock *\n        MS_ADPCM_state.wavefmt.channels * sizeof(Sint16);\n    *audio_buf = (Uint8 *) SDL_malloc(*audio_len);\n    if (*audio_buf == NULL) {\n        return SDL_OutOfMemory();\n    }\n    decoded = *audio_buf;\n\n    /* Get ready... Go! */\n    stereo = (MS_ADPCM_state.wavefmt.channels == 2);\n    state[0] = &MS_ADPCM_state.state[0];\n    state[1] = &MS_ADPCM_state.state[stereo];\n    while (encoded_len >= MS_ADPCM_state.wavefmt.blockalign) {\n        /* Grab the initial information for this block */\n        state[0]->hPredictor = *encoded++;\n        if (stereo) {\n            state[1]->hPredictor = *encoded++;\n        }\n        state[0]->iDelta = ((encoded[1] << 8) | encoded[0]);\n        encoded += sizeof(Sint16);\n        if (stereo) {\n            state[1]->iDelta = ((encoded[1] << 8) | encoded[0]);\n            encoded += sizeof(Sint16);\n        }\n        state[0]->iSamp1 = ((encoded[1] << 8) | encoded[0]);\n        encoded += sizeof(Sint16);\n        if (stereo) {\n            state[1]->iSamp1 = ((encoded[1] << 8) | encoded[0]);\n            encoded += sizeof(Sint16);\n        }\n        state[0]->iSamp2 = ((encoded[1] << 8) | encoded[0]);\n        encoded += sizeof(Sint16);\n        if (stereo) {\n            state[1]->iSamp2 = ((encoded[1] << 8) | encoded[0]);\n            encoded += sizeof(Sint16);\n        }\n        coeff[0] = MS_ADPCM_state.aCoeff[state[0]->hPredictor];\n        coeff[1] = MS_ADPCM_state.aCoeff[state[1]->hPredictor];\n\n        /* Store the two initial samples we start with */\n        decoded[0] = state[0]->iSamp2 & 0xFF;\n        decoded[1] = state[0]->iSamp2 >> 8;\n        decoded += 2;\n        if (stereo) {\n            decoded[0] = state[1]->iSamp2 & 0xFF;\n            decoded[1] = state[1]->iSamp2 >> 8;\n            decoded += 2;\n        }\n        decoded[0] = state[0]->iSamp1 & 0xFF;\n        decoded[1] = state[0]->iSamp1 >> 8;\n        decoded += 2;\n        if (stereo) {\n            decoded[0] = state[1]->iSamp1 & 0xFF;\n            decoded[1] = state[1]->iSamp1 >> 8;\n            decoded += 2;\n        }\n\n        /* Decode and store the other samples in this block */\n        samplesleft = (MS_ADPCM_state.wSamplesPerBlock - 2) *\n            MS_ADPCM_state.wavefmt.channels;\n        while (samplesleft > 0) {\n            nybble = (*encoded) >> 4;\n            new_sample = MS_ADPCM_nibble(state[0], nybble, coeff[0]);\n            decoded[0] = new_sample & 0xFF;\n            new_sample >>= 8;\n            decoded[1] = new_sample & 0xFF;\n            decoded += 2;\n\n            nybble = (*encoded) & 0x0F;\n            new_sample = MS_ADPCM_nibble(state[1], nybble, coeff[1]);\n            decoded[0] = new_sample & 0xFF;\n            new_sample >>= 8;\n            decoded[1] = new_sample & 0xFF;\n            decoded += 2;\n\n            ++encoded;\n            samplesleft -= 2;\n        }\n        encoded_len -= MS_ADPCM_state.wavefmt.blockalign;\n    }\n    SDL_free(freeable);\n    return (0);\n}\n\nstruct IMA_ADPCM_decodestate\n{\n    Sint32 sample;\n    Sint8 index;\n};\nstatic struct IMA_ADPCM_decoder\n{\n    WaveFMT wavefmt;\n    Uint16 wSamplesPerBlock;\n    /* * * */\n    struct IMA_ADPCM_decodestate state[2];\n} IMA_ADPCM_state;\n\nstatic int\nInitIMA_ADPCM(WaveFMT * format)\n{\n    Uint8 *rogue_feel;\n\n    /* Set the rogue pointer to the IMA_ADPCM specific data */\n    IMA_ADPCM_state.wavefmt.encoding = SDL_SwapLE16(format->encoding);\n    IMA_ADPCM_state.wavefmt.channels = SDL_SwapLE16(format->channels);\n    IMA_ADPCM_state.wavefmt.frequency = SDL_SwapLE32(format->frequency);\n    IMA_ADPCM_state.wavefmt.byterate = SDL_SwapLE32(format->byterate);\n    IMA_ADPCM_state.wavefmt.blockalign = SDL_SwapLE16(format->blockalign);\n    IMA_ADPCM_state.wavefmt.bitspersample =\n        SDL_SwapLE16(format->bitspersample);\n    rogue_feel = (Uint8 *) format + sizeof(*format);\n    if (sizeof(*format) == 16) {\n        /* const Uint16 extra_info = ((rogue_feel[1] << 8) | rogue_feel[0]); */\n        rogue_feel += sizeof(Uint16);\n    }\n    IMA_ADPCM_state.wSamplesPerBlock = ((rogue_feel[1] << 8) | rogue_feel[0]);\n    return (0);\n}\n\nstatic Sint32\nIMA_ADPCM_nibble(struct IMA_ADPCM_decodestate *state, Uint8 nybble)\n{\n    const Sint32 max_audioval = ((1 << (16 - 1)) - 1);\n    const Sint32 min_audioval = -(1 << (16 - 1));\n    const int index_table[16] = {\n        -1, -1, -1, -1,\n        2, 4, 6, 8,\n        -1, -1, -1, -1,\n        2, 4, 6, 8\n    };\n    const Sint32 step_table[89] = {\n        7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31,\n        34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130,\n        143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408,\n        449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282,\n        1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,\n        3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630,\n        9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350,\n        22385, 24623, 27086, 29794, 32767\n    };\n    Sint32 delta, step;\n\n    /* Compute difference and new sample value */\n    if (state->index > 88) {\n        state->index = 88;\n    } else if (state->index < 0) {\n        state->index = 0;\n    }\n    /* explicit cast to avoid gcc warning about using 'char' as array index */\n    step = step_table[(int)state->index];\n    delta = step >> 3;\n    if (nybble & 0x04)\n        delta += step;\n    if (nybble & 0x02)\n        delta += (step >> 1);\n    if (nybble & 0x01)\n        delta += (step >> 2);\n    if (nybble & 0x08)\n        delta = -delta;\n    state->sample += delta;\n\n    /* Update index value */\n    state->index += index_table[nybble];\n\n    /* Clamp output sample */\n    if (state->sample > max_audioval) {\n        state->sample = max_audioval;\n    } else if (state->sample < min_audioval) {\n        state->sample = min_audioval;\n    }\n    return (state->sample);\n}\n\n/* Fill the decode buffer with a channel block of data (8 samples) */\nstatic void\nFill_IMA_ADPCM_block(Uint8 * decoded, Uint8 * encoded,\n                     int channel, int numchannels,\n                     struct IMA_ADPCM_decodestate *state)\n{\n    int i;\n    Sint8 nybble;\n    Sint32 new_sample;\n\n    decoded += (channel * 2);\n    for (i = 0; i < 4; ++i) {\n        nybble = (*encoded) & 0x0F;\n        new_sample = IMA_ADPCM_nibble(state, nybble);\n        decoded[0] = new_sample & 0xFF;\n        new_sample >>= 8;\n        decoded[1] = new_sample & 0xFF;\n        decoded += 2 * numchannels;\n\n        nybble = (*encoded) >> 4;\n        new_sample = IMA_ADPCM_nibble(state, nybble);\n        decoded[0] = new_sample & 0xFF;\n        new_sample >>= 8;\n        decoded[1] = new_sample & 0xFF;\n        decoded += 2 * numchannels;\n\n        ++encoded;\n    }\n}\n\nstatic int\nIMA_ADPCM_decode(Uint8 ** audio_buf, Uint32 * audio_len)\n{\n    struct IMA_ADPCM_decodestate *state;\n    Uint8 *freeable, *encoded, *decoded;\n    Sint32 encoded_len, samplesleft;\n    unsigned int c, channels;\n\n    /* Check to make sure we have enough variables in the state array */\n    channels = IMA_ADPCM_state.wavefmt.channels;\n    if (channels > SDL_arraysize(IMA_ADPCM_state.state)) {\n        SDL_SetError(\"IMA ADPCM decoder can only handle %u channels\",\n                     (unsigned int)SDL_arraysize(IMA_ADPCM_state.state));\n        return (-1);\n    }\n    state = IMA_ADPCM_state.state;\n\n    /* Allocate the proper sized output buffer */\n    encoded_len = *audio_len;\n    encoded = *audio_buf;\n    freeable = *audio_buf;\n    *audio_len = (encoded_len / IMA_ADPCM_state.wavefmt.blockalign) *\n        IMA_ADPCM_state.wSamplesPerBlock *\n        IMA_ADPCM_state.wavefmt.channels * sizeof(Sint16);\n    *audio_buf = (Uint8 *) SDL_malloc(*audio_len);\n    if (*audio_buf == NULL) {\n        return SDL_OutOfMemory();\n    }\n    decoded = *audio_buf;\n\n    /* Get ready... Go! */\n    while (encoded_len >= IMA_ADPCM_state.wavefmt.blockalign) {\n        /* Grab the initial information for this block */\n        for (c = 0; c < channels; ++c) {\n            /* Fill the state information for this block */\n            state[c].sample = ((encoded[1] << 8) | encoded[0]);\n            encoded += 2;\n            if (state[c].sample & 0x8000) {\n                state[c].sample -= 0x10000;\n            }\n            state[c].index = *encoded++;\n            /* Reserved byte in buffer header, should be 0 */\n            if (*encoded++ != 0) {\n                /* Uh oh, corrupt data?  Buggy code? */ ;\n            }\n\n            /* Store the initial sample we start with */\n            decoded[0] = (Uint8) (state[c].sample & 0xFF);\n            decoded[1] = (Uint8) (state[c].sample >> 8);\n            decoded += 2;\n        }\n\n        /* Decode and store the other samples in this block */\n        samplesleft = (IMA_ADPCM_state.wSamplesPerBlock - 1) * channels;\n        while (samplesleft > 0) {\n            for (c = 0; c < channels; ++c) {\n                Fill_IMA_ADPCM_block(decoded, encoded,\n                                     c, channels, &state[c]);\n                encoded += 4;\n                samplesleft -= 8;\n            }\n            decoded += (channels * 8 * 2);\n        }\n        encoded_len -= IMA_ADPCM_state.wavefmt.blockalign;\n    }\n    SDL_free(freeable);\n    return (0);\n}\n\nSDL_AudioSpec *\nSDL_LoadWAV_RW(SDL_RWops * src, int freesrc,\n               SDL_AudioSpec * spec, Uint8 ** audio_buf, Uint32 * audio_len)\n{\n    int was_error;\n    Chunk chunk;\n    int lenread;\n    int IEEE_float_encoded, MS_ADPCM_encoded, IMA_ADPCM_encoded;\n    int samplesize;\n\n    /* WAV magic header */\n    Uint32 RIFFchunk;\n    Uint32 wavelen = 0;\n    Uint32 WAVEmagic;\n    Uint32 headerDiff = 0;\n\n    /* FMT chunk */\n    WaveFMT *format = NULL;\n\n    SDL_zero(chunk);\n\n    /* Make sure we are passed a valid data source */\n    was_error = 0;\n    if (src == NULL) {\n        was_error = 1;\n        goto done;\n    }\n\n    /* Check the magic header */\n    RIFFchunk = SDL_ReadLE32(src);\n    wavelen = SDL_ReadLE32(src);\n    if (wavelen == WAVE) {      /* The RIFFchunk has already been read */\n        WAVEmagic = wavelen;\n        wavelen = RIFFchunk;\n        RIFFchunk = RIFF;\n    } else {\n        WAVEmagic = SDL_ReadLE32(src);\n    }\n    if ((RIFFchunk != RIFF) || (WAVEmagic != WAVE)) {\n        SDL_SetError(\"Unrecognized file type (not WAVE)\");\n        was_error = 1;\n        goto done;\n    }\n    headerDiff += sizeof(Uint32);       /* for WAVE */\n\n    /* Read the audio data format chunk */\n    chunk.data = NULL;\n    do {\n        SDL_free(chunk.data);\n        chunk.data = NULL;\n        lenread = ReadChunk(src, &chunk);\n        if (lenread < 0) {\n            was_error = 1;\n            goto done;\n        }\n        /* 2 Uint32's for chunk header+len, plus the lenread */\n        headerDiff += lenread + 2 * sizeof(Uint32);\n    } while ((chunk.magic == FACT) || (chunk.magic == LIST) || (chunk.magic == BEXT) || (chunk.magic == JUNK));\n\n    /* Decode the audio data format */\n    format = (WaveFMT *) chunk.data;\n    if (chunk.magic != FMT) {\n        SDL_SetError(\"Complex WAVE files not supported\");\n        was_error = 1;\n        goto done;\n    }\n    IEEE_float_encoded = MS_ADPCM_encoded = IMA_ADPCM_encoded = 0;\n    switch (SDL_SwapLE16(format->encoding)) {\n    case PCM_CODE:\n        /* We can understand this */\n        break;\n    case IEEE_FLOAT_CODE:\n        IEEE_float_encoded = 1;\n        /* We can understand this */\n        break;\n    case MS_ADPCM_CODE:\n        /* Try to understand this */\n        if (InitMS_ADPCM(format) < 0) {\n            was_error = 1;\n            goto done;\n        }\n        MS_ADPCM_encoded = 1;\n        break;\n    case IMA_ADPCM_CODE:\n        /* Try to understand this */\n        if (InitIMA_ADPCM(format) < 0) {\n            was_error = 1;\n            goto done;\n        }\n        IMA_ADPCM_encoded = 1;\n        break;\n    case MP3_CODE:\n        SDL_SetError(\"MPEG Layer 3 data not supported\");\n        was_error = 1;\n        goto done;\n    default:\n        SDL_SetError(\"Unknown WAVE data format: 0x%.4x\",\n                     SDL_SwapLE16(format->encoding));\n        was_error = 1;\n        goto done;\n    }\n    SDL_zerop(spec);\n    spec->freq = SDL_SwapLE32(format->frequency);\n\n    if (IEEE_float_encoded) {\n        if ((SDL_SwapLE16(format->bitspersample)) != 32) {\n            was_error = 1;\n        } else {\n            spec->format = AUDIO_F32;\n        }\n    } else {\n        switch (SDL_SwapLE16(format->bitspersample)) {\n        case 4:\n            if (MS_ADPCM_encoded || IMA_ADPCM_encoded) {\n                spec->format = AUDIO_S16;\n            } else {\n                was_error = 1;\n            }\n            break;\n        case 8:\n            spec->format = AUDIO_U8;\n            break;\n        case 16:\n            spec->format = AUDIO_S16;\n            break;\n        case 32:\n            spec->format = AUDIO_S32;\n            break;\n        default:\n            was_error = 1;\n            break;\n        }\n    }\n\n    if (was_error) {\n        SDL_SetError(\"Unknown %d-bit PCM data format\",\n                     SDL_SwapLE16(format->bitspersample));\n        goto done;\n    }\n    spec->channels = (Uint8) SDL_SwapLE16(format->channels);\n    spec->samples = 4096;       /* Good default buffer size */\n\n    /* Read the audio data chunk */\n    *audio_buf = NULL;\n    do {\n        SDL_free(*audio_buf);\n        *audio_buf = NULL;\n        lenread = ReadChunk(src, &chunk);\n        if (lenread < 0) {\n            was_error = 1;\n            goto done;\n        }\n        *audio_len = lenread;\n        *audio_buf = chunk.data;\n        if (chunk.magic != DATA)\n            headerDiff += lenread + 2 * sizeof(Uint32);\n    } while (chunk.magic != DATA);\n    headerDiff += 2 * sizeof(Uint32);   /* for the data chunk and len */\n\n    if (MS_ADPCM_encoded) {\n        if (MS_ADPCM_decode(audio_buf, audio_len) < 0) {\n            was_error = 1;\n            goto done;\n        }\n    }\n    if (IMA_ADPCM_encoded) {\n        if (IMA_ADPCM_decode(audio_buf, audio_len) < 0) {\n            was_error = 1;\n            goto done;\n        }\n    }\n\n    /* Don't return a buffer that isn't a multiple of samplesize */\n    samplesize = ((SDL_AUDIO_BITSIZE(spec->format)) / 8) * spec->channels;\n    *audio_len &= ~(samplesize - 1);\n\n  done:\n    SDL_free(format);\n    if (src) {\n        if (freesrc) {\n            SDL_RWclose(src);\n        } else {\n            /* seek to the end of the file (given by the RIFF chunk) */\n            SDL_RWseek(src, wavelen - chunk.length - headerDiff, RW_SEEK_CUR);\n        }\n    }\n    if (was_error) {\n        spec = NULL;\n    }\n    return (spec);\n}\n\n/* Since the WAV memory is allocated in the shared library, it must also\n   be freed here.  (Necessary under Win32, VC++)\n */\nvoid\nSDL_FreeWAV(Uint8 * audio_buf)\n{\n    SDL_free(audio_buf);\n}\n\nstatic int\nReadChunk(SDL_RWops * src, Chunk * chunk)\n{\n    chunk->magic = SDL_ReadLE32(src);\n    chunk->length = SDL_ReadLE32(src);\n    chunk->data = (Uint8 *) SDL_malloc(chunk->length);\n    if (chunk->data == NULL) {\n        return SDL_OutOfMemory();\n    }\n    if (SDL_RWread(src, chunk->data, chunk->length, 1) != 1) {\n        SDL_free(chunk->data);\n        chunk->data = NULL;\n        return SDL_Error(SDL_EFREAD);\n    }\n    return (chunk->length);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/SDL_wave.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* WAVE files are little-endian */\n\n/*******************************************/\n/* Define values for Microsoft WAVE format */\n/*******************************************/\n#define RIFF            0x46464952      /* \"RIFF\" */\n#define WAVE            0x45564157      /* \"WAVE\" */\n#define FACT            0x74636166      /* \"fact\" */\n#define LIST            0x5453494c      /* \"LIST\" */\n#define BEXT            0x74786562      /* \"bext\" */\n#define JUNK            0x4B4E554A      /* \"JUNK\" */\n#define FMT             0x20746D66      /* \"fmt \" */\n#define DATA            0x61746164      /* \"data\" */\n#define PCM_CODE        0x0001\n#define MS_ADPCM_CODE   0x0002\n#define IEEE_FLOAT_CODE 0x0003\n#define IMA_ADPCM_CODE  0x0011\n#define MP3_CODE        0x0055\n#define WAVE_MONO       1\n#define WAVE_STEREO     2\n\n/* Normally, these three chunks come consecutively in a WAVE file */\ntypedef struct WaveFMT\n{\n/* Not saved in the chunk we read:\n    Uint32  FMTchunk;\n    Uint32  fmtlen;\n*/\n    Uint16 encoding;\n    Uint16 channels;            /* 1 = mono, 2 = stereo */\n    Uint32 frequency;           /* One of 11025, 22050, or 44100 Hz */\n    Uint32 byterate;            /* Average bytes per second */\n    Uint16 blockalign;          /* Bytes per sample block */\n    Uint16 bitspersample;       /* One of 8, 12, 16, or 4 for ADPCM */\n} WaveFMT;\n\n/* The general chunk found in the WAVE file */\ntypedef struct Chunk\n{\n    Uint32 magic;\n    Uint32 length;\n    Uint8 *data;\n} Chunk;\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/android/SDL_androidaudio.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_AUDIO_DRIVER_ANDROID\n\n/* Output audio to Android */\n\n#include \"SDL_assert.h\"\n#include \"SDL_audio.h\"\n#include \"../SDL_audio_c.h\"\n#include \"SDL_androidaudio.h\"\n\n#include \"../../core/android/SDL_android.h\"\n\n#include <android/log.h>\n\nstatic SDL_AudioDevice* audioDevice = NULL;\nstatic SDL_AudioDevice* captureDevice = NULL;\n\nstatic int\nANDROIDAUDIO_OpenDevice(_THIS, void *handle, const char *devname, int iscapture)\n{\n    SDL_AudioFormat test_format;\n\n    SDL_assert((captureDevice == NULL) || !iscapture);\n    SDL_assert((audioDevice == NULL) || iscapture);\n\n    if (iscapture) {\n        captureDevice = this;\n    } else {\n        audioDevice = this;\n    }\n\n    this->hidden = (struct SDL_PrivateAudioData *) SDL_calloc(1, (sizeof *this->hidden));\n    if (this->hidden == NULL) {\n        return SDL_OutOfMemory();\n    }\n\n    test_format = SDL_FirstAudioFormat(this->spec.format);\n    while (test_format != 0) { /* no \"UNKNOWN\" constant */\n        if ((test_format == AUDIO_U8) || (test_format == AUDIO_S16LSB)) {\n            this->spec.format = test_format;\n            break;\n        }\n        test_format = SDL_NextAudioFormat();\n    }\n\n    if (test_format == 0) {\n        /* Didn't find a compatible format :( */\n        return SDL_SetError(\"No compatible audio format!\");\n    }\n\n    if (this->spec.channels > 1) {\n        this->spec.channels = 2;\n    } else {\n        this->spec.channels = 1;\n    }\n\n    if (this->spec.freq < 8000) {\n        this->spec.freq = 8000;\n    }\n    if (this->spec.freq > 48000) {\n        this->spec.freq = 48000;\n    }\n\n    /* TODO: pass in/return a (Java) device ID */\n    this->spec.samples = Android_JNI_OpenAudioDevice(iscapture, this->spec.freq, this->spec.format == AUDIO_U8 ? 0 : 1, this->spec.channels, this->spec.samples);\n\n    if (this->spec.samples == 0) {\n        /* Init failed? */\n        return SDL_SetError(\"Java-side initialization failed!\");\n    }\n\n    SDL_CalculateAudioSpec(&this->spec);\n\n    return 0;\n}\n\nstatic void\nANDROIDAUDIO_PlayDevice(_THIS)\n{\n    Android_JNI_WriteAudioBuffer();\n}\n\nstatic Uint8 *\nANDROIDAUDIO_GetDeviceBuf(_THIS)\n{\n    return Android_JNI_GetAudioBuffer();\n}\n\nstatic int\nANDROIDAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen)\n{\n    return Android_JNI_CaptureAudioBuffer(buffer, buflen);\n}\n\nstatic void\nANDROIDAUDIO_FlushCapture(_THIS)\n{\n    Android_JNI_FlushCapturedAudio();\n}\n\nstatic void\nANDROIDAUDIO_CloseDevice(_THIS)\n{\n    /* At this point SDL_CloseAudioDevice via close_audio_device took care of terminating the audio thread\n       so it's safe to terminate the Java side buffer and AudioTrack\n     */\n    Android_JNI_CloseAudioDevice(this->iscapture);\n    if (this->iscapture) {\n        SDL_assert(captureDevice == this);\n        captureDevice = NULL;\n    } else {\n        SDL_assert(audioDevice == this);\n        audioDevice = NULL;\n    }\n    SDL_free(this->hidden);\n}\n\nstatic int\nANDROIDAUDIO_Init(SDL_AudioDriverImpl * impl)\n{\n    /* Set the function pointers */\n    impl->OpenDevice = ANDROIDAUDIO_OpenDevice;\n    impl->PlayDevice = ANDROIDAUDIO_PlayDevice;\n    impl->GetDeviceBuf = ANDROIDAUDIO_GetDeviceBuf;\n    impl->CloseDevice = ANDROIDAUDIO_CloseDevice;\n    impl->CaptureFromDevice = ANDROIDAUDIO_CaptureFromDevice;\n    impl->FlushCapture = ANDROIDAUDIO_FlushCapture;\n\n    /* and the capabilities */\n    impl->HasCaptureSupport = SDL_TRUE;\n    impl->OnlyHasDefaultOutputDevice = 1;\n    impl->OnlyHasDefaultCaptureDevice = 1;\n\n    return 1;   /* this audio target is available. */\n}\n\nAudioBootStrap ANDROIDAUDIO_bootstrap = {\n    \"android\", \"SDL Android audio driver\", ANDROIDAUDIO_Init, 0\n};\n\n/* Pause (block) all non already paused audio devices by taking their mixer lock */\nvoid ANDROIDAUDIO_PauseDevices(void)\n{\n    /* TODO: Handle multiple devices? */\n    struct SDL_PrivateAudioData *private;\n    if(audioDevice != NULL && audioDevice->hidden != NULL) {\n        private = (struct SDL_PrivateAudioData *) audioDevice->hidden;\n        if (SDL_AtomicGet(&audioDevice->paused)) {\n            /* The device is already paused, leave it alone */\n            private->resume = SDL_FALSE;\n        }\n        else {\n            SDL_LockMutex(audioDevice->mixer_lock);\n            SDL_AtomicSet(&audioDevice->paused, 1);\n            private->resume = SDL_TRUE;\n        }\n    }\n\n    if(captureDevice != NULL && captureDevice->hidden != NULL) {\n        private = (struct SDL_PrivateAudioData *) captureDevice->hidden;\n        if (SDL_AtomicGet(&captureDevice->paused)) {\n            /* The device is already paused, leave it alone */\n            private->resume = SDL_FALSE;\n        }\n        else {\n            SDL_LockMutex(captureDevice->mixer_lock);\n            SDL_AtomicSet(&captureDevice->paused, 1);\n            private->resume = SDL_TRUE;\n        }\n    }\n}\n\n/* Resume (unblock) all non already paused audio devices by releasing their mixer lock */\nvoid ANDROIDAUDIO_ResumeDevices(void)\n{\n    /* TODO: Handle multiple devices? */\n    struct SDL_PrivateAudioData *private;\n    if(audioDevice != NULL && audioDevice->hidden != NULL) {\n        private = (struct SDL_PrivateAudioData *) audioDevice->hidden;\n        if (private->resume) {\n            SDL_AtomicSet(&audioDevice->paused, 0);\n            private->resume = SDL_FALSE;\n            SDL_UnlockMutex(audioDevice->mixer_lock);\n        }\n    }\n\n    if(captureDevice != NULL && captureDevice->hidden != NULL) {\n        private = (struct SDL_PrivateAudioData *) captureDevice->hidden;\n        if (private->resume) {\n            SDL_AtomicSet(&captureDevice->paused, 0);\n            private->resume = SDL_FALSE;\n            SDL_UnlockMutex(captureDevice->mixer_lock);\n        }\n    }\n}\n\n\n#endif /* SDL_AUDIO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n\n"
  },
  {
    "path": "libs/SDL2/src/audio/android/SDL_androidaudio.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef _SDL_androidaudio_h\n#define _SDL_androidaudio_h\n\n#include \"../SDL_sysaudio.h\"\n\n/* Hidden \"this\" pointer for the audio functions */\n#define _THIS   SDL_AudioDevice *this\n\nstruct SDL_PrivateAudioData\n{\n    /* Resume device if it was paused automatically */\n    int resume;\n};\n\n#endif /* _SDL_androidaudio_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/dummy/SDL_dummyaudio.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n/* Output audio to nowhere... */\n\n#include \"SDL_timer.h\"\n#include \"SDL_audio.h\"\n#include \"../SDL_audio_c.h\"\n#include \"SDL_dummyaudio.h\"\n\nstatic int\nDUMMYAUDIO_OpenDevice(_THIS, void *handle, const char *devname, int iscapture)\n{\n    return 0;                   /* always succeeds. */\n}\n\nstatic int\nDUMMYAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen)\n{\n    /* Delay to make this sort of simulate real audio input. */\n    SDL_Delay((this->spec.samples * 1000) / this->spec.freq);\n\n    /* always return a full buffer of silence. */\n    SDL_memset(buffer, this->spec.silence, buflen);\n    return buflen;\n}\n\nstatic int\nDUMMYAUDIO_Init(SDL_AudioDriverImpl * impl)\n{\n    /* Set the function pointers */\n    impl->OpenDevice = DUMMYAUDIO_OpenDevice;\n    impl->CaptureFromDevice = DUMMYAUDIO_CaptureFromDevice;\n\n    impl->OnlyHasDefaultOutputDevice = 1;\n    impl->OnlyHasDefaultCaptureDevice = 1;\n    impl->HasCaptureSupport = SDL_TRUE;\n\n    return 1;   /* this audio target is available. */\n}\n\nAudioBootStrap DUMMYAUDIO_bootstrap = {\n    \"dummy\", \"SDL dummy audio driver\", DUMMYAUDIO_Init, 1\n};\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/dummy/SDL_dummyaudio.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef _SDL_dummyaudio_h\n#define _SDL_dummyaudio_h\n\n#include \"../SDL_sysaudio.h\"\n\n/* Hidden \"this\" pointer for the audio functions */\n#define _THIS   SDL_AudioDevice *this\n\nstruct SDL_PrivateAudioData\n{\n    /* The file descriptor for the audio device */\n    Uint8 *mixbuf;\n    Uint32 mixlen;\n    Uint32 write_delay;\n    Uint32 initial_calls;\n};\n\n#endif /* _SDL_dummyaudio_h */\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/paudio/SDL_paudio.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_AUDIO_DRIVER_PAUDIO\n\n/* Allow access to a raw mixing buffer */\n\n#include <errno.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <sys/time.h>\n#include <sys/ioctl.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#include \"SDL_timer.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_stdinc.h\"\n#include \"../SDL_audio_c.h\"\n#include \"SDL_paudio.h\"\n\n#define DEBUG_AUDIO 0\n\n/* A conflict within AIX 4.3.3 <sys/> headers and probably others as well.\n * I guess nobody ever uses audio... Shame over AIX header files.  */\n#include <sys/machine.h>\n#undef BIG_ENDIAN\n#include <sys/audio.h>\n\n/* Open the audio device for playback, and don't block if busy */\n/* #define OPEN_FLAGS   (O_WRONLY|O_NONBLOCK) */\n#define OPEN_FLAGS  O_WRONLY\n\n/* Get the name of the audio device we use for output */\n\n#ifndef _PATH_DEV_DSP\n#define _PATH_DEV_DSP   \"/dev/%caud%c/%c\"\n#endif\n\nstatic char devsettings[][3] = {\n    {'p', '0', '1'}, {'p', '0', '2'}, {'p', '0', '3'}, {'p', '0', '4'},\n    {'p', '1', '1'}, {'p', '1', '2'}, {'p', '1', '3'}, {'p', '1', '4'},\n    {'p', '2', '1'}, {'p', '2', '2'}, {'p', '2', '3'}, {'p', '2', '4'},\n    {'p', '3', '1'}, {'p', '3', '2'}, {'p', '3', '3'}, {'p', '3', '4'},\n    {'b', '0', '1'}, {'b', '0', '2'}, {'b', '0', '3'}, {'b', '0', '4'},\n    {'b', '1', '1'}, {'b', '1', '2'}, {'b', '1', '3'}, {'b', '1', '4'},\n    {'b', '2', '1'}, {'b', '2', '2'}, {'b', '2', '3'}, {'b', '2', '4'},\n    {'b', '3', '1'}, {'b', '3', '2'}, {'b', '3', '3'}, {'b', '3', '4'},\n    {'\\0', '\\0', '\\0'}\n};\n\nstatic int\nOpenUserDefinedDevice(char *path, int maxlen, int flags)\n{\n    const char *audiodev;\n    int fd;\n\n    /* Figure out what our audio device is */\n    if ((audiodev = SDL_getenv(\"SDL_PATH_DSP\")) == NULL) {\n        audiodev = SDL_getenv(\"AUDIODEV\");\n    }\n    if (audiodev == NULL) {\n        return -1;\n    }\n    fd = open(audiodev, flags, 0);\n    if (path != NULL) {\n        SDL_strlcpy(path, audiodev, maxlen);\n        path[maxlen - 1] = '\\0';\n    }\n    return fd;\n}\n\nstatic int\nOpenAudioPath(char *path, int maxlen, int flags, int classic)\n{\n    struct stat sb;\n    int cycle = 0;\n    int fd = OpenUserDefinedDevice(path, maxlen, flags);\n\n    if (fd != -1) {\n        return fd;\n    }\n\n    /* !!! FIXME: do we really need a table here? */\n    while (devsettings[cycle][0] != '\\0') {\n        char audiopath[1024];\n        SDL_snprintf(audiopath, SDL_arraysize(audiopath),\n                     _PATH_DEV_DSP,\n                     devsettings[cycle][0],\n                     devsettings[cycle][1], devsettings[cycle][2]);\n\n        if (stat(audiopath, &sb) == 0) {\n            fd = open(audiopath, flags, 0);\n            if (fd >= 0) {\n                if (path != NULL) {\n                    SDL_strlcpy(path, audiopath, maxlen);\n                }\n                return fd;\n            }\n        }\n    }\n    return -1;\n}\n\n/* This function waits until it is possible to write a full sound buffer */\nstatic void\nPAUDIO_WaitDevice(_THIS)\n{\n    fd_set fdset;\n\n    /* See if we need to use timed audio synchronization */\n    if (this->hidden->frame_ticks) {\n        /* Use timer for general audio synchronization */\n        Sint32 ticks;\n\n        ticks = ((Sint32) (this->hidden->next_frame - SDL_GetTicks())) - FUDGE_TICKS;\n        if (ticks > 0) {\n            SDL_Delay(ticks);\n        }\n    } else {\n        audio_buffer paud_bufinfo;\n\n        /* Use select() for audio synchronization */\n        struct timeval timeout;\n        FD_ZERO(&fdset);\n        FD_SET(this->hidden->audio_fd, &fdset);\n\n        if (ioctl(this->hidden->audio_fd, AUDIO_BUFFER, &paud_bufinfo) < 0) {\n#ifdef DEBUG_AUDIO\n            fprintf(stderr, \"Couldn't get audio buffer information\\n\");\n#endif\n            timeout.tv_sec = 10;\n            timeout.tv_usec = 0;\n        } else {\n            long ms_in_buf = paud_bufinfo.write_buf_time;\n            timeout.tv_sec = ms_in_buf / 1000;\n            ms_in_buf = ms_in_buf - timeout.tv_sec * 1000;\n            timeout.tv_usec = ms_in_buf * 1000;\n#ifdef DEBUG_AUDIO\n            fprintf(stderr,\n                    \"Waiting for write_buf_time=%ld,%ld\\n\",\n                    timeout.tv_sec, timeout.tv_usec);\n#endif\n        }\n\n#ifdef DEBUG_AUDIO\n        fprintf(stderr, \"Waiting for audio to get ready\\n\");\n#endif\n        if (select(this->hidden->audio_fd + 1, NULL, &fdset, NULL, &timeout)\n            <= 0) {\n            const char *message =\n                \"Audio timeout - buggy audio driver? (disabled)\";\n            /*\n             * In general we should never print to the screen,\n             * but in this case we have no other way of letting\n             * the user know what happened.\n             */\n            fprintf(stderr, \"SDL: %s - %s\\n\", strerror(errno), message);\n            SDL_OpenedAudioDeviceDisconnected(this);\n            /* Don't try to close - may hang */\n            this->hidden->audio_fd = -1;\n#ifdef DEBUG_AUDIO\n            fprintf(stderr, \"Done disabling audio\\n\");\n#endif\n        }\n#ifdef DEBUG_AUDIO\n        fprintf(stderr, \"Ready!\\n\");\n#endif\n    }\n}\n\nstatic void\nPAUDIO_PlayDevice(_THIS)\n{\n    int written = 0;\n    const Uint8 *mixbuf = this->hidden->mixbuf;\n    const size_t mixlen = this->hidden->mixlen;\n\n    /* Write the audio data, checking for EAGAIN on broken audio drivers */\n    do {\n        written = write(this->hidden->audio_fd, mixbuf, mixlen);\n        if ((written < 0) && ((errno == 0) || (errno == EAGAIN))) {\n            SDL_Delay(1);       /* Let a little CPU time go by */\n        }\n    } while ((written < 0) &&\n             ((errno == 0) || (errno == EAGAIN) || (errno == EINTR)));\n\n    /* If timer synchronization is enabled, set the next write frame */\n    if (this->hidden->frame_ticks) {\n        this->hidden->next_frame += this->hidden->frame_ticks;\n    }\n\n    /* If we couldn't write, assume fatal error for now */\n    if (written < 0) {\n        SDL_OpenedAudioDeviceDisconnected(this);\n    }\n#ifdef DEBUG_AUDIO\n    fprintf(stderr, \"Wrote %d bytes of audio data\\n\", written);\n#endif\n}\n\nstatic Uint8 *\nPAUDIO_GetDeviceBuf(_THIS)\n{\n    return this->hidden->mixbuf;\n}\n\nstatic void\nPAUDIO_CloseDevice(_THIS)\n{\n    if (this->hidden->audio_fd >= 0) {\n        close(this->hidden->audio_fd);\n    }\n    SDL_free(this->hidden->mixbuf);\n    SDL_free(this->hidden);\n}\n\nstatic int\nPAUDIO_OpenDevice(_THIS, void *handle, const char *devname, int iscapture)\n{\n    const char *workaround = SDL_getenv(\"SDL_DSP_NOSELECT\");\n    char audiodev[1024];\n    const char *err = NULL;\n    int format;\n    int bytes_per_sample;\n    SDL_AudioFormat test_format;\n    audio_init paud_init;\n    audio_buffer paud_bufinfo;\n    audio_status paud_status;\n    audio_control paud_control;\n    audio_change paud_change;\n    int fd = -1;\n\n    /* Initialize all variables that we clean on shutdown */\n    this->hidden = (struct SDL_PrivateAudioData *)\n        SDL_malloc((sizeof *this->hidden));\n    if (this->hidden == NULL) {\n        return SDL_OutOfMemory();\n    }\n    SDL_zerop(this->hidden);\n\n    /* Open the audio device */\n    fd = OpenAudioPath(audiodev, sizeof(audiodev), OPEN_FLAGS, 0);\n    this->hidden->audio_fd = fd;\n    if (fd < 0) {\n        return SDL_SetError(\"Couldn't open %s: %s\", audiodev, strerror(errno));\n    }\n\n    /*\n     * We can't set the buffer size - just ask the device for the maximum\n     * that we can have.\n     */\n    if (ioctl(fd, AUDIO_BUFFER, &paud_bufinfo) < 0) {\n        return SDL_SetError(\"Couldn't get audio buffer information\");\n    }\n\n    if (this->spec.channels > 1)\n        this->spec.channels = 2;\n    else\n        this->spec.channels = 1;\n\n    /*\n     * Fields in the audio_init structure:\n     *\n     * Ignored by us:\n     *\n     * paud.loadpath[LOAD_PATH]; * DSP code to load, MWave chip only?\n     * paud.slot_number;         * slot number of the adapter\n     * paud.device_id;           * adapter identification number\n     *\n     * Input:\n     *\n     * paud.srate;           * the sampling rate in Hz\n     * paud.bits_per_sample; * 8, 16, 32, ...\n     * paud.bsize;           * block size for this rate\n     * paud.mode;            * ADPCM, PCM, MU_LAW, A_LAW, SOURCE_MIX\n     * paud.channels;        * 1=mono, 2=stereo\n     * paud.flags;           * FIXED - fixed length data\n     *                       * LEFT_ALIGNED, RIGHT_ALIGNED (var len only)\n     *                       * TWOS_COMPLEMENT - 2's complement data\n     *                       * SIGNED - signed? comment seems wrong in sys/audio.h\n     *                       * BIG_ENDIAN\n     * paud.operation;       * PLAY, RECORD\n     *\n     * Output:\n     *\n     * paud.flags;           * PITCH            - pitch is supported\n     *                       * INPUT            - input is supported\n     *                       * OUTPUT           - output is supported\n     *                       * MONITOR          - monitor is supported\n     *                       * VOLUME           - volume is supported\n     *                       * VOLUME_DELAY     - volume delay is supported\n     *                       * BALANCE          - balance is supported\n     *                       * BALANCE_DELAY    - balance delay is supported\n     *                       * TREBLE           - treble control is supported\n     *                       * BASS             - bass control is supported\n     *                       * BESTFIT_PROVIDED - best fit returned\n     *                       * LOAD_CODE        - DSP load needed\n     * paud.rc;              * NO_PLAY         - DSP code can't do play requests\n     *                       * NO_RECORD       - DSP code can't do record requests\n     *                       * INVALID_REQUEST - request was invalid\n     *                       * CONFLICT        - conflict with open's flags\n     *                       * OVERLOADED      - out of DSP MIPS or memory\n     * paud.position_resolution; * smallest increment for position\n     */\n\n    paud_init.srate = this->spec.freq;\n    paud_init.mode = PCM;\n    paud_init.operation = PLAY;\n    paud_init.channels = this->spec.channels;\n\n    /* Try for a closest match on audio format */\n    format = 0;\n    for (test_format = SDL_FirstAudioFormat(this->spec.format);\n         !format && test_format;) {\n#ifdef DEBUG_AUDIO\n        fprintf(stderr, \"Trying format 0x%4.4x\\n\", test_format);\n#endif\n        switch (test_format) {\n        case AUDIO_U8:\n            bytes_per_sample = 1;\n            paud_init.bits_per_sample = 8;\n            paud_init.flags = TWOS_COMPLEMENT | FIXED;\n            format = 1;\n            break;\n        case AUDIO_S8:\n            bytes_per_sample = 1;\n            paud_init.bits_per_sample = 8;\n            paud_init.flags = SIGNED | TWOS_COMPLEMENT | FIXED;\n            format = 1;\n            break;\n        case AUDIO_S16LSB:\n            bytes_per_sample = 2;\n            paud_init.bits_per_sample = 16;\n            paud_init.flags = SIGNED | TWOS_COMPLEMENT | FIXED;\n            format = 1;\n            break;\n        case AUDIO_S16MSB:\n            bytes_per_sample = 2;\n            paud_init.bits_per_sample = 16;\n            paud_init.flags = BIG_ENDIAN | SIGNED | TWOS_COMPLEMENT | FIXED;\n            format = 1;\n            break;\n        case AUDIO_U16LSB:\n            bytes_per_sample = 2;\n            paud_init.bits_per_sample = 16;\n            paud_init.flags = TWOS_COMPLEMENT | FIXED;\n            format = 1;\n            break;\n        case AUDIO_U16MSB:\n            bytes_per_sample = 2;\n            paud_init.bits_per_sample = 16;\n            paud_init.flags = BIG_ENDIAN | TWOS_COMPLEMENT | FIXED;\n            format = 1;\n            break;\n        default:\n            break;\n        }\n        if (!format) {\n            test_format = SDL_NextAudioFormat();\n        }\n    }\n    if (format == 0) {\n#ifdef DEBUG_AUDIO\n        fprintf(stderr, \"Couldn't find any hardware audio formats\\n\");\n#endif\n        return SDL_SetError(\"Couldn't find any hardware audio formats\");\n    }\n    this->spec.format = test_format;\n\n    /*\n     * We know the buffer size and the max number of subsequent writes\n     *  that can be pending. If more than one can pend, allow the application\n     *  to do something like double buffering between our write buffer and\n     *  the device's own buffer that we are filling with write() anyway.\n     *\n     * We calculate this->spec.samples like this because\n     *  SDL_CalculateAudioSpec() will give put paud_bufinfo.write_buf_cap\n     *  (or paud_bufinfo.write_buf_cap/2) into this->spec.size in return.\n     */\n    if (paud_bufinfo.request_buf_cap == 1) {\n        this->spec.samples = paud_bufinfo.write_buf_cap\n            / bytes_per_sample / this->spec.channels;\n    } else {\n        this->spec.samples = paud_bufinfo.write_buf_cap\n            / bytes_per_sample / this->spec.channels / 2;\n    }\n    paud_init.bsize = bytes_per_sample * this->spec.channels;\n\n    SDL_CalculateAudioSpec(&this->spec);\n\n    /*\n     * The AIX paud device init can't modify the values of the audio_init\n     * structure that we pass to it. So we don't need any recalculation\n     * of this stuff and no reinit call as in linux dsp code.\n     *\n     * /dev/paud supports all of the encoding formats, so we don't need\n     * to do anything like reopening the device, either.\n     */\n    if (ioctl(fd, AUDIO_INIT, &paud_init) < 0) {\n        switch (paud_init.rc) {\n        case 1:\n            err = \"Couldn't set audio format: DSP can't do play requests\";\n            break;\n        case 2:\n            err = \"Couldn't set audio format: DSP can't do record requests\";\n            break;\n        case 4:\n            err = \"Couldn't set audio format: request was invalid\";\n            break;\n        case 5:\n            err = \"Couldn't set audio format: conflict with open's flags\";\n            break;\n        case 6:\n            err = \"Couldn't set audio format: out of DSP MIPS or memory\";\n            break;\n        default:\n            err = \"Couldn't set audio format: not documented in sys/audio.h\";\n            break;\n        }\n    }\n\n    if (err != NULL) {\n        return SDL_SetError(\"Paudio: %s\", err);\n    }\n\n    /* Allocate mixing buffer */\n    this->hidden->mixlen = this->spec.size;\n    this->hidden->mixbuf = (Uint8 *) SDL_malloc(this->hidden->mixlen);\n    if (this->hidden->mixbuf == NULL) {\n        return SDL_OutOfMemory();\n    }\n    SDL_memset(this->hidden->mixbuf, this->spec.silence, this->spec.size);\n\n    /*\n     * Set some paramters: full volume, first speaker that we can find.\n     * Ignore the other settings for now.\n     */\n    paud_change.input = AUDIO_IGNORE;   /* the new input source */\n    paud_change.output = OUTPUT_1;      /* EXTERNAL_SPEAKER,INTERNAL_SPEAKER,OUTPUT_1 */\n    paud_change.monitor = AUDIO_IGNORE; /* the new monitor state */\n    paud_change.volume = 0x7fffffff;    /* volume level [0-0x7fffffff] */\n    paud_change.volume_delay = AUDIO_IGNORE;    /* the new volume delay */\n    paud_change.balance = 0x3fffffff;   /* the new balance */\n    paud_change.balance_delay = AUDIO_IGNORE;   /* the new balance delay */\n    paud_change.treble = AUDIO_IGNORE;  /* the new treble state */\n    paud_change.bass = AUDIO_IGNORE;    /* the new bass state */\n    paud_change.pitch = AUDIO_IGNORE;   /* the new pitch state */\n\n    paud_control.ioctl_request = AUDIO_CHANGE;\n    paud_control.request_info = (char *) &paud_change;\n    if (ioctl(fd, AUDIO_CONTROL, &paud_control) < 0) {\n#ifdef DEBUG_AUDIO\n        fprintf(stderr, \"Can't change audio display settings\\n\");\n#endif\n    }\n\n    /*\n     * Tell the device to expect data. Actual start will wait for\n     * the first write() call.\n     */\n    paud_control.ioctl_request = AUDIO_START;\n    paud_control.position = 0;\n    if (ioctl(fd, AUDIO_CONTROL, &paud_control) < 0) {\n#ifdef DEBUG_AUDIO\n        fprintf(stderr, \"Can't start audio play\\n\");\n#endif\n        return SDL_SetError(\"Can't start audio play\");\n    }\n\n    /* Check to see if we need to use select() workaround */\n    if (workaround != NULL) {\n        this->hidden->frame_ticks = (float) (this->spec.samples * 1000) /\n            this->spec.freq;\n        this->hidden->next_frame = SDL_GetTicks() + this->hidden->frame_ticks;\n    }\n\n    /* We're ready to rock and roll. :-) */\n    return 0;\n}\n\nstatic int\nPAUDIO_Init(SDL_AudioDriverImpl * impl)\n{\n    /* !!! FIXME: not right for device enum? */\n    int fd = OpenAudioPath(NULL, 0, OPEN_FLAGS, 0);\n    if (fd < 0) {\n        SDL_SetError(\"PAUDIO: Couldn't open audio device\");\n        return 0;\n    }\n    close(fd);\n\n    /* Set the function pointers */\n    impl->OpenDevice = DSP_OpenDevice;\n    impl->PlayDevice = DSP_PlayDevice;\n    impl->PlayDevice = DSP_WaitDevice;\n    impl->GetDeviceBuf = DSP_GetDeviceBuf;\n    impl->CloseDevice = DSP_CloseDevice;\n    impl->OnlyHasDefaultOutputDevice = 1;       /* !!! FIXME: add device enum! */\n\n    return 1;   /* this audio target is available. */\n}\n\nAudioBootStrap PAUDIO_bootstrap = {\n    \"paud\", \"AIX Paudio\", PAUDIO_Init, 0\n};\n\n#endif /* SDL_AUDIO_DRIVER_PAUDIO */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/paudio/SDL_paudio.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef _SDL_paudaudio_h\n#define _SDL_paudaudio_h\n\n#include \"../SDL_sysaudio.h\"\n\n/* Hidden \"this\" pointer for the audio functions */\n#define _THIS   SDL_AudioDevice *this\n\nstruct SDL_PrivateAudioData\n{\n    /* The file descriptor for the audio device */\n    int audio_fd;\n\n    /* Raw mixing buffer */\n    Uint8 *mixbuf;\n    int mixlen;\n\n    /* Support for audio timing using a timer, in addition to select() */\n    float frame_ticks;\n    float next_frame;\n};\n#define FUDGE_TICKS 10      /* The scheduler overhead ticks per frame */\n\n#endif /* _SDL_paudaudio_h */\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/audio/sdlgenaudiocvt.pl",
    "content": "#!/usr/bin/perl -w\n\nuse warnings;\nuse strict;\n\nmy @audiotypes = qw(\n    U8\n    S8\n    U16LSB\n    S16LSB\n    U16MSB\n    S16MSB\n    S32LSB\n    S32MSB\n    F32LSB\n    F32MSB\n);\n\nmy @channels = ( 1, 2, 4, 6, 8 );\nmy %funcs;\nmy $custom_converters = 0;\n\n\nsub getTypeConvertHashId {\n    my ($from, $to) = @_;\n    return \"TYPECONVERTER $from/$to\";\n}\n\n\nsub getResamplerHashId {\n    my ($from, $channels, $upsample, $multiple) = @_;\n    return \"RESAMPLER $from/$channels/$upsample/$multiple\";\n}\n\n\nsub outputHeader {\n    print <<EOF;\n/* DO NOT EDIT!  This file is generated by sdlgenaudiocvt.pl */\n/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken\\@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"../SDL_internal.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_audio_c.h\"\n\n#ifndef DEBUG_CONVERT\n#define DEBUG_CONVERT 0\n#endif\n\n\n/* If you can guarantee your data and need space, you can eliminate code... */\n\n/* Just build the arbitrary resamplers if you're saving code space. */\n#ifndef LESS_RESAMPLERS\n#define LESS_RESAMPLERS 0\n#endif\n\n/* Don't build any resamplers if you're REALLY saving code space. */\n#ifndef NO_RESAMPLERS\n#define NO_RESAMPLERS 0\n#endif\n\n/* Don't build any type converters if you're saving code space. */\n#ifndef NO_CONVERTERS\n#define NO_CONVERTERS 0\n#endif\n\n\n/* *INDENT-OFF* */\n\nEOF\n\n    my @vals = ( 127, 32767, 2147483647 );\n    foreach (@vals) {\n        my $val = $_;\n        my $fval = 1.0 / $val;\n        print(\"#define DIVBY${val} ${fval}f\\n\");\n    }\n\n    print(\"\\n\");\n}\n\nsub outputFooter {\n    print <<EOF;\n/* $custom_converters converters generated. */\n\n/* *INDENT-ON* */\n\n/* vi: set ts=4 sw=4 expandtab: */\nEOF\n}\n\nsub splittype {\n    my $t = shift;\n    my ($signed, $size, $endian) = $t =~ /([USF])(\\d+)([LM]SB|)/;\n    my $float = ($signed eq 'F') ? 1 : 0;\n    $signed = (($float) or ($signed eq 'S')) ? 1 : 0;\n    $endian = 'NONE' if ($endian eq '');\n\n    my $ctype = '';\n    if ($float) {\n        $ctype = (($size == 32) ? 'float' : 'double');\n    } else {\n        $ctype = (($signed) ? 'S' : 'U') . \"int${size}\";\n    }\n\n    return ($signed, $float, $size, $endian, $ctype);\n}\n\nsub getSwapFunc {\n    my ($size, $signed, $float, $endian, $val) = @_;\n    my $BEorLE = (($endian eq 'MSB') ? 'BE' : 'LE');\n    my $code = '';\n\n    if ($float) {\n        $code = \"SDL_SwapFloat${BEorLE}($val)\";\n    } else {\n        if ($size > 8) {\n            $code = \"SDL_Swap${BEorLE}${size}($val)\";\n        } else {\n            $code = $val;\n        }\n\n        if (($signed) and (!$float)) {\n            $code = \"((Sint${size}) $code)\";\n        }\n    }\n\n    return \"${code}\";\n}\n\n\nsub maxIntVal {\n    my $size = shift;\n    if ($size == 8) {\n        return 0x7F;\n    } elsif ($size == 16) {\n        return 0x7FFF;\n    } elsif ($size == 32) {\n        return 0x7FFFFFFF;\n    }\n\n    die(\"bug in script.\\n\");\n}\n\nsub getFloatToIntMult {\n    my $size = shift;\n    my $val = maxIntVal($size) . '.0';\n    $val .= 'f' if ($size < 32);\n    return $val;\n}\n\nsub getIntToFloatDivBy {\n    my $size = shift;\n    return 'DIVBY' . maxIntVal($size);\n}\n\nsub getSignFlipVal {\n    my $size = shift;\n    if ($size == 8) {\n        return '0x80';\n    } elsif ($size == 16) {\n        return '0x8000';\n    } elsif ($size == 32) {\n        return '0x80000000';\n    }\n\n    die(\"bug in script.\\n\");\n}\n\nsub buildCvtFunc {\n    my ($from, $to) = @_;\n    my ($fsigned, $ffloat, $fsize, $fendian, $fctype) = splittype($from);\n    my ($tsigned, $tfloat, $tsize, $tendian, $tctype) = splittype($to);\n    my $diffs = 0;\n    $diffs++ if ($fsize != $tsize);\n    $diffs++ if ($fsigned != $tsigned);\n    $diffs++ if ($ffloat != $tfloat);\n    $diffs++ if ($fendian ne $tendian);\n\n    return if ($diffs == 0);\n\n    my $hashid = getTypeConvertHashId($from, $to);\n    if (1) { # !!! FIXME: if ($diffs > 1) {\n        my $sym = \"SDL_Convert_${from}_to_${to}\";\n        $funcs{$hashid} = $sym;\n        $custom_converters++;\n\n        # Always unsigned for ints, for possible byteswaps.\n        my $srctype = (($ffloat) ? 'float' : \"Uint${fsize}\");\n\n        print <<EOF;\nstatic void SDLCALL\n${sym}(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n    int i;\n    const $srctype *src;\n    $tctype *dst;\n\n#if DEBUG_CONVERT\n    fprintf(stderr, \"Converting AUDIO_${from} to AUDIO_${to}.\\\\n\");\n#endif\n\nEOF\n\n        if ($fsize < $tsize) {\n            my $mult = $tsize / $fsize;\n            print <<EOF;\n    src = ((const $srctype *) (cvt->buf + cvt->len_cvt)) - 1;\n    dst = (($tctype *) (cvt->buf + cvt->len_cvt * $mult)) - 1;\n    for (i = cvt->len_cvt / sizeof ($srctype); i; --i, --src, --dst) {\nEOF\n        } else {\n            print <<EOF;\n    src = (const $srctype *) cvt->buf;\n    dst = ($tctype *) cvt->buf;\n    for (i = cvt->len_cvt / sizeof ($srctype); i; --i, ++src, ++dst) {\nEOF\n        }\n\n        # Have to convert to/from float/int.\n        # !!! FIXME: cast through double for int32<->float?\n        my $code = getSwapFunc($fsize, $fsigned, $ffloat, $fendian, '*src');\n        if ($ffloat != $tfloat) {\n            if ($ffloat) {\n                my $mult = getFloatToIntMult($tsize);\n                if (!$tsigned) {   # bump from -1.0f/1.0f to 0.0f/2.0f\n                    $code = \"($code + 1.0f)\";\n                }\n                $code = \"(($tctype) ($code * $mult))\";\n            } else {\n                # $divby will be the reciprocal, to avoid pipeline stalls\n                #  from floating point division...so multiply it.\n                my $divby = getIntToFloatDivBy($fsize);\n                $code = \"(((float) $code) * $divby)\";\n                if (!$fsigned) {   # bump from 0.0f/2.0f to -1.0f/1.0f.\n                    $code = \"($code - 1.0f)\";\n                }\n            }\n        } else {\n            # All integer conversions here.\n            if ($fsigned != $tsigned) {\n                my $signflipval = getSignFlipVal($fsize);\n                $code = \"(($code) ^ $signflipval)\";\n            }\n\n            my $shiftval = abs($fsize - $tsize);\n            if ($fsize < $tsize) {\n                $code = \"((($tctype) $code) << $shiftval)\";\n            } elsif ($fsize > $tsize) {\n                $code = \"(($tctype) ($code >> $shiftval))\";\n            }\n        }\n\n        my $swap = getSwapFunc($tsize, $tsigned, $tfloat, $tendian, 'val');\n\n        print <<EOF;\n        const $tctype val = $code;\n        *dst = ${swap};\n    }\n\nEOF\n\n        if ($fsize > $tsize) {\n            my $divby = $fsize / $tsize;\n            print(\"    cvt->len_cvt /= $divby;\\n\");\n        } elsif ($fsize < $tsize) {\n            my $mult = $tsize / $fsize;\n            print(\"    cvt->len_cvt *= $mult;\\n\");\n        }\n\n        print <<EOF;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, AUDIO_$to);\n    }\n}\n\nEOF\n\n    } else {\n        if ($fsigned != $tsigned) {\n            $funcs{$hashid} = 'SDL_ConvertSigned';\n        } elsif ($ffloat != $tfloat) {\n            $funcs{$hashid} = 'SDL_ConvertFloat';\n        } elsif ($fsize != $tsize) {\n            $funcs{$hashid} = 'SDL_ConvertSize';\n        } elsif ($fendian ne $tendian) {\n            $funcs{$hashid} = 'SDL_ConvertEndian';\n        } else {\n            die(\"error in script.\\n\");\n        }\n    }\n}\n\n\nsub buildTypeConverters {\n    print \"#if !NO_CONVERTERS\\n\\n\";\n    foreach (@audiotypes) {\n        my $from = $_;\n        foreach (@audiotypes) {\n            my $to = $_;\n            buildCvtFunc($from, $to);\n        }\n    }\n    print \"#endif  /* !NO_CONVERTERS */\\n\\n\\n\";\n\n    print \"const SDL_AudioTypeFilters sdl_audio_type_filters[] =\\n{\\n\";\n    print \"#if !NO_CONVERTERS\\n\";\n    foreach (@audiotypes) {\n        my $from = $_;\n        foreach (@audiotypes) {\n            my $to = $_;\n            if ($from ne $to) {\n                my $hashid = getTypeConvertHashId($from, $to);\n                my $sym = $funcs{$hashid};\n                print(\"    { AUDIO_$from, AUDIO_$to, $sym },\\n\");\n            }\n        }\n    }\n    print \"#endif  /* !NO_CONVERTERS */\\n\";\n\n    print(\"    { 0, 0, NULL }\\n\");\n    print \"};\\n\\n\\n\";\n}\n\nsub getBiggerCtype {\n    my ($isfloat, $size) = @_;\n\n    if ($isfloat) {\n        if ($size == 32) {\n            return 'double';\n        }\n        die(\"bug in script.\\n\");\n    }\n\n    if ($size == 8) {\n        return 'Sint16';\n    } elsif ($size == 16) {\n        return 'Sint32'\n    } elsif ($size == 32) {\n        return 'Sint64'\n    }\n\n    die(\"bug in script.\\n\");\n}\n\n\n# These handle arbitrary resamples...44100Hz to 48000Hz, for example.\n# Man, this code is skanky.\nsub buildArbitraryResampleFunc {\n    # !!! FIXME: we do a lot of unnecessary and ugly casting in here, due to getSwapFunc().\n    my ($from, $channels, $upsample) = @_;\n    my ($fsigned, $ffloat, $fsize, $fendian, $fctype) = splittype($from);\n\n    my $bigger = getBiggerCtype($ffloat, $fsize);\n    my $interp = ($ffloat) ? '* 0.5' : '>> 1';\n\n    my $resample = ($upsample) ? 'Upsample' : 'Downsample';\n    my $hashid = getResamplerHashId($from, $channels, $upsample, 0);\n    my $sym = \"SDL_${resample}_${from}_${channels}c\";\n    $funcs{$hashid} = $sym;\n    $custom_converters++;\n\n    my $fudge = $fsize * $channels * 2;  # !!! FIXME\n    my $eps_adjust = ($upsample) ? 'dstsize' : 'srcsize';\n    my $incr = '';\n    my $incr2 = '';\n    my $block_align = $channels * $fsize/8;\n\n\n    # !!! FIXME: DEBUG_CONVERT should report frequencies.\n    print <<EOF;\nstatic void SDLCALL\n${sym}(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"$resample arbitrary (x%f) AUDIO_${from}, ${channels} channels.\\\\n\", cvt->rate_incr);\n#endif\n\n    const int srcsize = cvt->len_cvt - $fudge;\n    const int dstsize = (int) (((double)(cvt->len_cvt/${block_align})) * cvt->rate_incr) * ${block_align};\n    register int eps = 0;\nEOF\n\n    my $endcomparison = '!=';\n\n    # Upsampling (growing the buffer) needs to work backwards, since we\n    #  overwrite the buffer as we go.\n    if ($upsample) {\n        $endcomparison = '>=';  # dst > target\n        print <<EOF;\n    $fctype *dst = (($fctype *) (cvt->buf + dstsize)) - $channels;\n    const $fctype *src = (($fctype *) (cvt->buf + cvt->len_cvt)) - $channels;\n    const $fctype *target = ((const $fctype *) cvt->buf);\nEOF\n    } else {\n        $endcomparison = '<';  # dst < target\n        print <<EOF;\n    $fctype *dst = ($fctype *) cvt->buf;\n    const $fctype *src = ($fctype *) cvt->buf;\n    const $fctype *target = (const $fctype *) (cvt->buf + dstsize);\nEOF\n    }\n\n    for (my $i = 0; $i < $channels; $i++) {\n        my $idx = ($upsample) ? (($channels - $i) - 1) : $i;\n        my $val = getSwapFunc($fsize, $fsigned, $ffloat, $fendian, \"src[$idx]\");\n        print <<EOF;\n    $fctype sample${idx} = $val;\nEOF\n    }\n\n    for (my $i = 0; $i < $channels; $i++) {\n        my $idx = ($upsample) ? (($channels - $i) - 1) : $i;\n        print <<EOF;\n    $fctype last_sample${idx} = sample${idx};\nEOF\n    }\n\n    print <<EOF;\n    while (dst $endcomparison target) {\nEOF\n\n    if ($upsample) {\n        for (my $i = 0; $i < $channels; $i++) {\n            # !!! FIXME: don't do this swap every write, just when the samples change.\n            my $idx = (($channels - $i) - 1);\n            my $val = getSwapFunc($fsize, $fsigned, $ffloat, $fendian, \"sample${idx}\");\n            print <<EOF;\n        dst[$idx] = $val;\nEOF\n        }\n\n        $incr = ($channels == 1) ? 'dst--' : \"dst -= $channels\";\n        $incr2 = ($channels == 1) ? 'src--' : \"src -= $channels\";\n\n        print <<EOF;\n        $incr;\n        eps += srcsize;\n        if ((eps << 1) >= dstsize) {\n            $incr2;\nEOF\n    } else {  # downsample.\n        $incr = ($channels == 1) ? 'src++' : \"src += $channels\";\n        print <<EOF;\n        $incr;\n        eps += dstsize;\n        if ((eps << 1) >= srcsize) {\nEOF\n        for (my $i = 0; $i < $channels; $i++) {\n            my $val = getSwapFunc($fsize, $fsigned, $ffloat, $fendian, \"sample${i}\");\n            print <<EOF;\n            dst[$i] = $val;\nEOF\n        }\n\n        $incr = ($channels == 1) ? 'dst++' : \"dst += $channels\";\n        print <<EOF;\n            $incr;\nEOF\n    }\n\n    for (my $i = 0; $i < $channels; $i++) {\n        my $idx = ($upsample) ? (($channels - $i) - 1) : $i;\n        my $swapped = getSwapFunc($fsize, $fsigned, $ffloat, $fendian, \"src[$idx]\");\n        print <<EOF;\n            sample${idx} = ($fctype) (((($bigger) $swapped) + (($bigger) last_sample${idx})) $interp);\nEOF\n    }\n\n    for (my $i = 0; $i < $channels; $i++) {\n        my $idx = ($upsample) ? (($channels - $i) - 1) : $i;\n        print <<EOF;\n            last_sample${idx} = sample${idx};\nEOF\n    }\n\n    print <<EOF;\n            eps -= $eps_adjust;\n        }\n    }\nEOF\n\n        print <<EOF;\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nEOF\n\n}\n\n# These handle clean resamples...doubling and quadrupling the sample rate, etc.\nsub buildMultipleResampleFunc {\n    # !!! FIXME: we do a lot of unnecessary and ugly casting in here, due to getSwapFunc().\n    my ($from, $channels, $upsample, $multiple) = @_;\n    my ($fsigned, $ffloat, $fsize, $fendian, $fctype) = splittype($from);\n\n    my $bigger = getBiggerCtype($ffloat, $fsize);\n    my $interp = ($ffloat) ? '* 0.5' : '>> 1';\n    my $interp2 = ($ffloat) ? '* 0.25' : '>> 2';\n    my $mult3 = ($ffloat) ? '3.0' : '3';\n    my $lencvtop = ($upsample) ? '*' : '/';\n\n    my $resample = ($upsample) ? 'Upsample' : 'Downsample';\n    my $hashid = getResamplerHashId($from, $channels, $upsample, $multiple);\n    my $sym = \"SDL_${resample}_${from}_${channels}c_x${multiple}\";\n    $funcs{$hashid} = $sym;\n    $custom_converters++;\n\n    # !!! FIXME: DEBUG_CONVERT should report frequencies.\n    print <<EOF;\nstatic void SDLCALL\n${sym}(SDL_AudioCVT * cvt, SDL_AudioFormat format)\n{\n#if DEBUG_CONVERT\n    fprintf(stderr, \"$resample (x${multiple}) AUDIO_${from}, ${channels} channels.\\\\n\");\n#endif\n\n    const int dstsize = cvt->len_cvt $lencvtop $multiple;\nEOF\n\n    my $endcomparison = '!=';\n\n    # Upsampling (growing the buffer) needs to work backwards, since we\n    #  overwrite the buffer as we go.\n    if ($upsample) {\n        $endcomparison = '>=';  # dst > target\n        print <<EOF;\n    $fctype *dst = (($fctype *) (cvt->buf + dstsize)) - $channels * $multiple;\n    const $fctype *src = (($fctype *) (cvt->buf + cvt->len_cvt)) - $channels;\n    const $fctype *target = ((const $fctype *) cvt->buf);\nEOF\n    } else {\n        $endcomparison = '<';  # dst < target\n        print <<EOF;\n    $fctype *dst = ($fctype *) cvt->buf;\n    const $fctype *src = ($fctype *) cvt->buf;\n    const $fctype *target = (const $fctype *) (cvt->buf + dstsize);\nEOF\n    }\n\n    for (my $i = 0; $i < $channels; $i++) {\n        my $idx = ($upsample) ? (($channels - $i) - 1) : $i;\n        my $val = getSwapFunc($fsize, $fsigned, $ffloat, $fendian, \"src[$idx]\");\n        print <<EOF;\n    $bigger last_sample${idx} = ($bigger) $val;\nEOF\n    }\n\n    print <<EOF;\n    while (dst $endcomparison target) {\nEOF\n\n    for (my $i = 0; $i < $channels; $i++) {\n        my $idx = ($upsample) ? (($channels - $i) - 1) : $i;\n        my $val = getSwapFunc($fsize, $fsigned, $ffloat, $fendian, \"src[$idx]\");\n        print <<EOF;\n        const $bigger sample${idx} = ($bigger) $val;\nEOF\n    }\n\n    my $incr = '';\n    if ($upsample) {\n        $incr = ($channels == 1) ? 'src--' : \"src -= $channels\";\n    } else {\n        my $amount = $channels * $multiple;\n        $incr = \"src += $amount\";  # can't ever be 1, so no \"++\" version.\n    }\n\n\n    print <<EOF;\n        $incr;\nEOF\n\n    # !!! FIXME: This really begs for some Altivec or SSE, etc.\n    if ($upsample) {\n        if ($multiple == 2) {\n            for (my $i = $channels-1; $i >= 0; $i--) {\n                my $dsti = $i + $channels;\n                print <<EOF;\n        dst[$dsti] = ($fctype) ((sample${i} + last_sample${i}) $interp);\nEOF\n            }\n            for (my $i = $channels-1; $i >= 0; $i--) {\n                my $dsti = $i;\n                print <<EOF;\n        dst[$dsti] = ($fctype) sample${i};\nEOF\n            }\n        } elsif ($multiple == 4) {\n            for (my $i = $channels-1; $i >= 0; $i--) {\n                my $dsti = $i + ($channels * 3);\n                print <<EOF;\n        dst[$dsti] = ($fctype) ((sample${i} + ($mult3 * last_sample${i})) $interp2);\nEOF\n            }\n\n            for (my $i = $channels-1; $i >= 0; $i--) {\n                my $dsti = $i + ($channels * 2);\n                print <<EOF;\n        dst[$dsti] = ($fctype) ((sample${i} + last_sample${i}) $interp);\nEOF\n            }\n\n            for (my $i = $channels-1; $i >= 0; $i--) {\n                my $dsti = $i + ($channels * 1);\n                print <<EOF;\n        dst[$dsti] = ($fctype) ((($mult3 * sample${i}) + last_sample${i}) $interp2);\nEOF\n            }\n\n            for (my $i = $channels-1; $i >= 0; $i--) {\n                my $dsti = $i + ($channels * 0);\n                print <<EOF;\n        dst[$dsti] = ($fctype) sample${i};\nEOF\n            }\n        } else {\n            die('bug in program.');  # we only handle x2 and x4.\n        }\n    } else {  # downsample.\n        if ($multiple == 2) {\n            for (my $i = 0; $i < $channels; $i++) {\n                print <<EOF;\n        dst[$i] = ($fctype) ((sample${i} + last_sample${i}) $interp);\nEOF\n            }\n        } elsif ($multiple == 4) {\n            # !!! FIXME: interpolate all 4 samples?\n            for (my $i = 0; $i < $channels; $i++) {\n                print <<EOF;\n        dst[$i] = ($fctype) ((sample${i} + last_sample${i}) $interp);\nEOF\n            }\n        } else {\n            die('bug in program.');  # we only handle x2 and x4.\n        }\n    }\n\n    for (my $i = 0; $i < $channels; $i++) {\n        my $idx = ($upsample) ? (($channels - $i) - 1) : $i;\n        print <<EOF;\n        last_sample${idx} = sample${idx};\nEOF\n    }\n\n    if ($upsample) {\n        my $amount = $channels * $multiple;\n        $incr = \"dst -= $amount\";  # can't ever be 1, so no \"--\" version.\n    } else {\n        $incr = ($channels == 1) ? 'dst++' : \"dst += $channels\";\n    }\n\n    print <<EOF;\n        $incr;\n    }\n\n    cvt->len_cvt = dstsize;\n    if (cvt->filters[++cvt->filter_index]) {\n        cvt->filters[cvt->filter_index] (cvt, format);\n    }\n}\n\nEOF\n\n}\n\nsub buildResamplers {\n    print \"#if !NO_RESAMPLERS\\n\\n\";\n    foreach (@audiotypes) {\n        my $from = $_;\n        foreach (@channels) {\n            my $channel = $_;\n            buildArbitraryResampleFunc($from, $channel, 1);\n            buildArbitraryResampleFunc($from, $channel, 0);\n        }\n    }\n\n    print \"\\n#if !LESS_RESAMPLERS\\n\\n\";\n    foreach (@audiotypes) {\n        my $from = $_;\n        foreach (@channels) {\n            my $channel = $_;\n            for (my $multiple = 2; $multiple <= 4; $multiple += 2) {\n                buildMultipleResampleFunc($from, $channel, 1, $multiple);\n                buildMultipleResampleFunc($from, $channel, 0, $multiple);\n            }\n        }\n    }\n\n    print \"#endif  /* !LESS_RESAMPLERS */\\n\";\n    print \"#endif  /* !NO_RESAMPLERS */\\n\\n\\n\";\n\n    print \"const SDL_AudioRateFilters sdl_audio_rate_filters[] =\\n{\\n\";\n    print \"#if !NO_RESAMPLERS\\n\";\n    foreach (@audiotypes) {\n        my $from = $_;\n        foreach (@channels) {\n            my $channel = $_;\n            for (my $upsample = 0; $upsample <= 1; $upsample++) {\n                my $hashid = getResamplerHashId($from, $channel, $upsample, 0);\n                my $sym = $funcs{$hashid};\n                print(\"    { AUDIO_$from, $channel, $upsample, 0, $sym },\\n\");\n            }\n        }\n    }\n\n    print \"#if !LESS_RESAMPLERS\\n\";\n    foreach (@audiotypes) {\n        my $from = $_;\n        foreach (@channels) {\n            my $channel = $_;\n            for (my $multiple = 2; $multiple <= 4; $multiple += 2) {\n                for (my $upsample = 0; $upsample <= 1; $upsample++) {\n                    my $hashid = getResamplerHashId($from, $channel, $upsample, $multiple);\n                    my $sym = $funcs{$hashid};\n                    print(\"    { AUDIO_$from, $channel, $upsample, $multiple, $sym },\\n\");\n                }\n            }\n        }\n    }\n\n    print \"#endif  /* !LESS_RESAMPLERS */\\n\";\n    print \"#endif  /* !NO_RESAMPLERS */\\n\";\n    print(\"    { 0, 0, 0, 0, NULL }\\n\");\n    print \"};\\n\\n\";\n}\n\n\n# mainline ...\n\noutputHeader();\nbuildTypeConverters();\nbuildResamplers();\noutputFooter();\n\nexit 0;\n\n# end of sdlgenaudiocvt.pl ...\n\n"
  },
  {
    "path": "libs/SDL2/src/core/android/SDL_android.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n#include \"SDL_stdinc.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_hints.h\"\n#include \"SDL_log.h\"\n\n#ifdef __ANDROID__\n\n#include \"SDL_system.h\"\n#include \"SDL_android.h\"\n#include <EGL/egl.h>\n\n#include \"../../events/SDL_events_c.h\"\n#include \"../../video/android/SDL_androidkeyboard.h\"\n#include \"../../video/android/SDL_androidmouse.h\"\n#include \"../../video/android/SDL_androidtouch.h\"\n#include \"../../video/android/SDL_androidvideo.h\"\n#include \"../../video/android/SDL_androidwindow.h\"\n#include \"../../joystick/android/SDL_sysjoystick_c.h\"\n\n#include <android/log.h>\n#include <pthread.h>\n#include <sys/types.h>\n#include <unistd.h>\n#define LOG_TAG \"SDL_android\"\n/* #define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) */\n/* #define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) */\n#define LOGI(...) do {} while (0)\n#define LOGE(...) do {} while (0)\n\n/* Uncomment this to log messages entering and exiting methods in this file */\n/* #define DEBUG_JNI */\n\nstatic void Android_JNI_ThreadDestroyed(void*);\n\n/*******************************************************************************\n This file links the Java side of Android with libsdl\n*******************************************************************************/\n#include <jni.h>\n#include <android/log.h>\n\n\n/*******************************************************************************\n                               Globals\n*******************************************************************************/\nstatic pthread_key_t mThreadKey;\nstatic JavaVM* mJavaVM;\n\n/* Main activity */\nstatic jclass mActivityClass;\n\n/* method signatures */\nstatic jmethodID midGetNativeSurface;\nstatic jmethodID midAudioOpen;\nstatic jmethodID midAudioWriteShortBuffer;\nstatic jmethodID midAudioWriteByteBuffer;\nstatic jmethodID midAudioClose;\nstatic jmethodID midCaptureOpen;\nstatic jmethodID midCaptureReadShortBuffer;\nstatic jmethodID midCaptureReadByteBuffer;\nstatic jmethodID midCaptureClose;\nstatic jmethodID midPollInputDevices;\n\n/* Accelerometer data storage */\nstatic float fLastAccelerometer[3];\nstatic SDL_bool bHasNewData;\n\n/*******************************************************************************\n                 Functions called by JNI\n*******************************************************************************/\n\n/* Library init */\nJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)\n{\n    JNIEnv *env;\n    mJavaVM = vm;\n    LOGI(\"JNI_OnLoad called\");\n    if ((*mJavaVM)->GetEnv(mJavaVM, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {\n        LOGE(\"Failed to get the environment using GetEnv()\");\n        return -1;\n    }\n    /*\n     * Create mThreadKey so we can keep track of the JNIEnv assigned to each thread\n     * Refer to http://developer.android.com/guide/practices/design/jni.html for the rationale behind this\n     */\n    if (pthread_key_create(&mThreadKey, Android_JNI_ThreadDestroyed) != 0) {\n        __android_log_print(ANDROID_LOG_ERROR, \"SDL\", \"Error initializing pthread key\");\n    }\n    Android_JNI_SetupThread();\n\n    return JNI_VERSION_1_4;\n}\n\n/* Called before SDL_main() to initialize JNI bindings */\nJNIEXPORT void JNICALL SDL_Android_Init(JNIEnv* mEnv, jclass cls)\n{\n    __android_log_print(ANDROID_LOG_INFO, \"SDL\", \"SDL_Android_Init()\");\n\n    Android_JNI_SetupThread();\n\n    mActivityClass = (jclass)((*mEnv)->NewGlobalRef(mEnv, cls));\n\n    midGetNativeSurface = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"getNativeSurface\",\"()Landroid/view/Surface;\");\n    midAudioOpen = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"audioOpen\", \"(IZZI)I\");\n    midAudioWriteShortBuffer = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"audioWriteShortBuffer\", \"([S)V\");\n    midAudioWriteByteBuffer = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"audioWriteByteBuffer\", \"([B)V\");\n    midAudioClose = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"audioClose\", \"()V\");\n    midCaptureOpen = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"captureOpen\", \"(IZZI)I\");\n    midCaptureReadShortBuffer = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"captureReadShortBuffer\", \"([SZ)I\");\n    midCaptureReadByteBuffer = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"captureReadByteBuffer\", \"([BZ)I\");\n    midCaptureClose = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"captureClose\", \"()V\");\n    midPollInputDevices = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n                                \"pollInputDevices\", \"()V\");\n\n    bHasNewData = SDL_FALSE;\n\n    if (!midGetNativeSurface ||\n       !midAudioOpen || !midAudioWriteShortBuffer || !midAudioWriteByteBuffer || !midAudioClose ||\n       !midCaptureOpen || !midCaptureReadShortBuffer || !midCaptureReadByteBuffer || !midCaptureClose ||\n       !midPollInputDevices) {\n        __android_log_print(ANDROID_LOG_WARN, \"SDL\", \"SDL: Couldn't locate Java callbacks, check that they're named and typed correctly\");\n    }\n    __android_log_print(ANDROID_LOG_INFO, \"SDL\", \"SDL_Android_Init() finished!\");\n}\n\n/* Drop file */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeDropFile(\n                                    JNIEnv* env, jclass jcls,\n                                    jstring filename)\n{\n    const char *path = (*env)->GetStringUTFChars(env, filename, NULL);\n    SDL_SendDropFile(NULL, path);\n    (*env)->ReleaseStringUTFChars(env, filename, path);\n    SDL_SendDropComplete(NULL);\n}\n\n/* Resize */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeResize(\n                                    JNIEnv* env, jclass jcls,\n                                    jint width, jint height, jint format, jfloat rate)\n{\n    Android_SetScreenResolution(width, height, format, rate);\n}\n\n/* Paddown */\nJNIEXPORT jint JNICALL Java_com_author_isengine_SDLActivity_onNativePadDown(\n                                    JNIEnv* env, jclass jcls,\n                                    jint device_id, jint keycode)\n{\n    return Android_OnPadDown(device_id, keycode);\n}\n\n/* Padup */\nJNIEXPORT jint JNICALL Java_com_author_isengine_SDLActivity_onNativePadUp(\n                                   JNIEnv* env, jclass jcls,\n                                   jint device_id, jint keycode)\n{\n    return Android_OnPadUp(device_id, keycode);\n}\n\n/* Joy */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeJoy(\n                                    JNIEnv* env, jclass jcls,\n                                    jint device_id, jint axis, jfloat value)\n{\n    Android_OnJoy(device_id, axis, value);\n}\n\n/* POV Hat */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeHat(\n                                    JNIEnv* env, jclass jcls,\n                                    jint device_id, jint hat_id, jint x, jint y)\n{\n    Android_OnHat(device_id, hat_id, x, y);\n}\n\n\nJNIEXPORT jint JNICALL Java_com_author_isengine_SDLActivity_nativeAddJoystick(\n    JNIEnv* env, jclass jcls,\n    jint device_id, jstring device_name, jint is_accelerometer, \n    jint nbuttons, jint naxes, jint nhats, jint nballs)\n{\n    int retval;\n    const char *name = (*env)->GetStringUTFChars(env, device_name, NULL);\n\n    retval = Android_AddJoystick(device_id, name, (SDL_bool) is_accelerometer, nbuttons, naxes, nhats, nballs);\n\n    (*env)->ReleaseStringUTFChars(env, device_name, name);\n    \n    return retval;\n}\n\nJNIEXPORT jint JNICALL Java_com_author_isengine_SDLActivity_nativeRemoveJoystick(\n    JNIEnv* env, jclass jcls, jint device_id)\n{\n    return Android_RemoveJoystick(device_id);\n}\n\n\n/* Surface Created */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeSurfaceChanged(JNIEnv* env, jclass jcls)\n{\n    SDL_WindowData *data;\n    SDL_VideoDevice *_this;\n\n    if (Android_Window == NULL || Android_Window->driverdata == NULL ) {\n        return;\n    }\n    \n    _this =  SDL_GetVideoDevice();\n    data =  (SDL_WindowData *) Android_Window->driverdata;\n    \n    /* If the surface has been previously destroyed by onNativeSurfaceDestroyed, recreate it here */\n    if (data->egl_surface == EGL_NO_SURFACE) {\n        if(data->native_window) {\n            ANativeWindow_release(data->native_window);\n        }\n        data->native_window = Android_JNI_GetNativeWindow();\n        data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->native_window);\n    }\n    \n    /* GL Context handling is done in the event loop because this function is run from the Java thread */\n    \n}\n\n/* Surface Destroyed */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeSurfaceDestroyed(JNIEnv* env, jclass jcls)\n{\n    /* We have to clear the current context and destroy the egl surface here\n     * Otherwise there's BAD_NATIVE_WINDOW errors coming from eglCreateWindowSurface on resume\n     * Ref: http://stackoverflow.com/questions/8762589/eglcreatewindowsurface-on-ics-and-switching-from-2d-to-3d\n     */\n    SDL_WindowData *data;\n    SDL_VideoDevice *_this;\n    \n    if (Android_Window == NULL || Android_Window->driverdata == NULL ) {\n        return;\n    }\n    \n    _this =  SDL_GetVideoDevice();\n    data = (SDL_WindowData *) Android_Window->driverdata;\n    \n    if (data->egl_surface != EGL_NO_SURFACE) {\n        SDL_EGL_MakeCurrent(_this, NULL, NULL);\n        SDL_EGL_DestroySurface(_this, data->egl_surface);\n        data->egl_surface = EGL_NO_SURFACE;\n    }\n    \n    /* GL Context handling is done in the event loop because this function is run from the Java thread */\n\n}\n\n/* Keydown */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeKeyDown(\n                                    JNIEnv* env, jclass jcls, jint keycode)\n{\n    Android_OnKeyDown(keycode);\n}\n\n/* Keyup */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeKeyUp(\n                                    JNIEnv* env, jclass jcls, jint keycode)\n{\n    Android_OnKeyUp(keycode);\n}\n\n/* Keyboard Focus Lost */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeKeyboardFocusLost(\n                                    JNIEnv* env, jclass jcls)\n{\n    /* Calling SDL_StopTextInput will take care of hiding the keyboard and cleaning up the DummyText widget */\n    SDL_StopTextInput();\n}\n\n\n/* Touch */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeTouch(\n                                    JNIEnv* env, jclass jcls,\n                                    jint touch_device_id_in, jint pointer_finger_id_in,\n                                    jint action, jfloat x, jfloat y, jfloat p)\n{\n    Android_OnTouch(touch_device_id_in, pointer_finger_id_in, action, x, y, p);\n}\n\n/* Mouse */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeMouse(\n                                    JNIEnv* env, jclass jcls,\n                                    jint button, jint action, jfloat x, jfloat y)\n{\n    Android_OnMouse(button, action, x, y);\n}\n\n/* Accelerometer */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_onNativeAccel(\n                                    JNIEnv* env, jclass jcls,\n                                    jfloat x, jfloat y, jfloat z)\n{\n    fLastAccelerometer[0] = x;\n    fLastAccelerometer[1] = y;\n    fLastAccelerometer[2] = z;\n    bHasNewData = SDL_TRUE;\n}\n\n/* Low memory */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_nativeLowMemory(\n                                    JNIEnv* env, jclass cls)\n{\n    SDL_SendAppEvent(SDL_APP_LOWMEMORY);\n}\n\n/* Quit */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_nativeQuit(\n                                    JNIEnv* env, jclass cls)\n{\n    /* Discard previous events. The user should have handled state storage\n     * in SDL_APP_WILLENTERBACKGROUND. After nativeQuit() is called, no\n     * events other than SDL_QUIT and SDL_APP_TERMINATING should fire */\n    SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);\n    /* Inject a SDL_QUIT event */\n    SDL_SendQuit();\n    SDL_SendAppEvent(SDL_APP_TERMINATING);\n    /* Resume the event loop so that the app can catch SDL_QUIT which\n     * should now be the top event in the event queue. */\n    if (!SDL_SemValue(Android_ResumeSem)) SDL_SemPost(Android_ResumeSem);\n}\n\n/* Pause */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_nativePause(\n                                    JNIEnv* env, jclass cls)\n{\n    __android_log_print(ANDROID_LOG_VERBOSE, \"SDL\", \"nativePause()\");\n    if (Android_Window) {\n        SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);\n        SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);\n        SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND);\n        SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND);\n    \n        /* *After* sending the relevant events, signal the pause semaphore \n         * so the event loop knows to pause and (optionally) block itself */\n        if (!SDL_SemValue(Android_PauseSem)) SDL_SemPost(Android_PauseSem);\n    }\n}\n\n/* Resume */\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLActivity_nativeResume(\n                                    JNIEnv* env, jclass cls)\n{\n    __android_log_print(ANDROID_LOG_VERBOSE, \"SDL\", \"nativeResume()\");\n\n    if (Android_Window) {\n        SDL_SendAppEvent(SDL_APP_WILLENTERFOREGROUND);\n        SDL_SendAppEvent(SDL_APP_DIDENTERFOREGROUND);\n        SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_FOCUS_GAINED, 0, 0);\n        SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESTORED, 0, 0);\n        /* Signal the resume semaphore so the event loop knows to resume and restore the GL Context\n         * We can't restore the GL Context here because it needs to be done on the SDL main thread\n         * and this function will be called from the Java thread instead.\n         */\n        if (!SDL_SemValue(Android_ResumeSem)) SDL_SemPost(Android_ResumeSem);\n    }\n}\n\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLInputConnection_nativeCommitText(\n                                    JNIEnv* env, jclass cls,\n                                    jstring text, jint newCursorPosition)\n{\n    const char *utftext = (*env)->GetStringUTFChars(env, text, NULL);\n\n    SDL_SendKeyboardText(utftext);\n\n    (*env)->ReleaseStringUTFChars(env, text, utftext);\n}\n\nJNIEXPORT void JNICALL Java_com_author_isengine_SDLInputConnection_nativeSetComposingText(\n                                    JNIEnv* env, jclass cls,\n                                    jstring text, jint newCursorPosition)\n{\n    const char *utftext = (*env)->GetStringUTFChars(env, text, NULL);\n\n    SDL_SendEditingText(utftext, 0, 0);\n\n    (*env)->ReleaseStringUTFChars(env, text, utftext);\n}\n\nJNIEXPORT jstring JNICALL Java_com_author_isengine_SDLActivity_nativeGetHint(JNIEnv* env, jclass cls, jstring name) {\n    const char *utfname = (*env)->GetStringUTFChars(env, name, NULL);\n    const char *hint = SDL_GetHint(utfname);\n\n    jstring result = (*env)->NewStringUTF(env, hint);\n    (*env)->ReleaseStringUTFChars(env, name, utfname);\n\n    return result;\n}\n\n/*******************************************************************************\n             Functions called by SDL into Java\n*******************************************************************************/\n\nstatic int s_active = 0;\nstruct LocalReferenceHolder\n{\n    JNIEnv *m_env;\n    const char *m_func;\n};\n\nstatic struct LocalReferenceHolder LocalReferenceHolder_Setup(const char *func)\n{\n    struct LocalReferenceHolder refholder;\n    refholder.m_env = NULL;\n    refholder.m_func = func;\n#ifdef DEBUG_JNI\n    SDL_Log(\"Entering function %s\", func);\n#endif\n    return refholder;\n}\n\nstatic SDL_bool LocalReferenceHolder_Init(struct LocalReferenceHolder *refholder, JNIEnv *env)\n{\n    const int capacity = 16;\n    if ((*env)->PushLocalFrame(env, capacity) < 0) {\n        SDL_SetError(\"Failed to allocate enough JVM local references\");\n        return SDL_FALSE;\n    }\n    ++s_active;\n    refholder->m_env = env;\n    return SDL_TRUE;\n}\n\nstatic void LocalReferenceHolder_Cleanup(struct LocalReferenceHolder *refholder)\n{\n#ifdef DEBUG_JNI\n    SDL_Log(\"Leaving function %s\", refholder->m_func);\n#endif\n    if (refholder->m_env) {\n        JNIEnv* env = refholder->m_env;\n        (*env)->PopLocalFrame(env, NULL);\n        --s_active;\n    }\n}\n\nstatic SDL_bool LocalReferenceHolder_IsActive(void)\n{\n    return s_active > 0;\n}\n\nANativeWindow* Android_JNI_GetNativeWindow(void)\n{\n    ANativeWindow* anw;\n    jobject s;\n    JNIEnv *env = Android_JNI_GetEnv();\n\n    s = (*env)->CallStaticObjectMethod(env, mActivityClass, midGetNativeSurface);\n    anw = ANativeWindow_fromSurface(env, s);\n    (*env)->DeleteLocalRef(env, s);\n  \n    return anw;\n}\n\nvoid Android_JNI_SetActivityTitle(const char *title)\n{\n    jmethodID mid;\n    JNIEnv *mEnv = Android_JNI_GetEnv();\n    mid = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\"setActivityTitle\",\"(Ljava/lang/String;)Z\");\n    if (mid) {\n        jstring jtitle = (jstring)((*mEnv)->NewStringUTF(mEnv, title));\n        (*mEnv)->CallStaticBooleanMethod(mEnv, mActivityClass, mid, jtitle);\n        (*mEnv)->DeleteLocalRef(mEnv, jtitle);\n    }\n}\n\nSDL_bool Android_JNI_GetAccelerometerValues(float values[3])\n{\n    int i;\n    SDL_bool retval = SDL_FALSE;\n\n    if (bHasNewData) {\n        for (i = 0; i < 3; ++i) {\n            values[i] = fLastAccelerometer[i];\n        }\n        bHasNewData = SDL_FALSE;\n        retval = SDL_TRUE;\n    }\n\n    return retval;\n}\n\nstatic void Android_JNI_ThreadDestroyed(void* value)\n{\n    /* The thread is being destroyed, detach it from the Java VM and set the mThreadKey value to NULL as required */\n    JNIEnv *env = (JNIEnv*) value;\n    if (env != NULL) {\n        (*mJavaVM)->DetachCurrentThread(mJavaVM);\n        pthread_setspecific(mThreadKey, NULL);\n    }\n}\n\nJNIEnv* Android_JNI_GetEnv(void)\n{\n    /* From http://developer.android.com/guide/practices/jni.html\n     * All threads are Linux threads, scheduled by the kernel.\n     * They're usually started from managed code (using Thread.start), but they can also be created elsewhere and then\n     * attached to the JavaVM. For example, a thread started with pthread_create can be attached with the\n     * JNI AttachCurrentThread or AttachCurrentThreadAsDaemon functions. Until a thread is attached, it has no JNIEnv,\n     * and cannot make JNI calls.\n     * Attaching a natively-created thread causes a java.lang.Thread object to be constructed and added to the \"main\"\n     * ThreadGroup, making it visible to the debugger. Calling AttachCurrentThread on an already-attached thread\n     * is a no-op.\n     * Note: You can call this function any number of times for the same thread, there's no harm in it\n     */\n\n    JNIEnv *env;\n    int status = (*mJavaVM)->AttachCurrentThread(mJavaVM, &env, NULL);\n    if(status < 0) {\n        LOGE(\"failed to attach current thread\");\n        return 0;\n    }\n\n    /* From http://developer.android.com/guide/practices/jni.html\n     * Threads attached through JNI must call DetachCurrentThread before they exit. If coding this directly is awkward,\n     * in Android 2.0 (Eclair) and higher you can use pthread_key_create to define a destructor function that will be\n     * called before the thread exits, and call DetachCurrentThread from there. (Use that key with pthread_setspecific\n     * to store the JNIEnv in thread-local-storage; that way it'll be passed into your destructor as the argument.)\n     * Note: The destructor is not called unless the stored value is != NULL\n     * Note: You can call this function any number of times for the same thread, there's no harm in it\n     *       (except for some lost CPU cycles)\n     */\n    pthread_setspecific(mThreadKey, (void*) env);\n\n    return env;\n}\n\nint Android_JNI_SetupThread(void)\n{\n    Android_JNI_GetEnv();\n    return 1;\n}\n\n/*\n * Audio support\n */\nstatic jboolean audioBuffer16Bit = JNI_FALSE;\nstatic jobject audioBuffer = NULL;\nstatic void* audioBufferPinned = NULL;\nstatic jboolean captureBuffer16Bit = JNI_FALSE;\nstatic jobject captureBuffer = NULL;\n\nint Android_JNI_OpenAudioDevice(int iscapture, int sampleRate, int is16Bit, int channelCount, int desiredBufferFrames)\n{\n    jboolean audioBufferStereo;\n    int audioBufferFrames;\n    jobject jbufobj = NULL;\n    jboolean isCopy;\n\n    JNIEnv *env = Android_JNI_GetEnv();\n\n    if (!env) {\n        LOGE(\"callback_handler: failed to attach current thread\");\n    }\n    Android_JNI_SetupThread();\n\n    audioBufferStereo = channelCount > 1;\n\n    if (iscapture) {\n        __android_log_print(ANDROID_LOG_VERBOSE, \"SDL\", \"SDL audio: opening device for capture\");\n        captureBuffer16Bit = is16Bit;\n        if ((*env)->CallStaticIntMethod(env, mActivityClass, midCaptureOpen, sampleRate, audioBuffer16Bit, audioBufferStereo, desiredBufferFrames) != 0) {\n            /* Error during audio initialization */\n            __android_log_print(ANDROID_LOG_WARN, \"SDL\", \"SDL audio: error on AudioRecord initialization!\");\n            return 0;\n        }\n    } else {\n        __android_log_print(ANDROID_LOG_VERBOSE, \"SDL\", \"SDL audio: opening device for output\");\n        audioBuffer16Bit = is16Bit;\n        if ((*env)->CallStaticIntMethod(env, mActivityClass, midAudioOpen, sampleRate, audioBuffer16Bit, audioBufferStereo, desiredBufferFrames) != 0) {\n            /* Error during audio initialization */\n            __android_log_print(ANDROID_LOG_WARN, \"SDL\", \"SDL audio: error on AudioTrack initialization!\");\n            return 0;\n        }\n    }\n\n    /* Allocating the audio buffer from the Java side and passing it as the return value for audioInit no longer works on\n     * Android >= 4.2 due to a \"stale global reference\" error. So now we allocate this buffer directly from this side. */\n\n    if (is16Bit) {\n        jshortArray audioBufferLocal = (*env)->NewShortArray(env, desiredBufferFrames * (audioBufferStereo ? 2 : 1));\n        if (audioBufferLocal) {\n            jbufobj = (*env)->NewGlobalRef(env, audioBufferLocal);\n            (*env)->DeleteLocalRef(env, audioBufferLocal);\n        }\n    }\n    else {\n        jbyteArray audioBufferLocal = (*env)->NewByteArray(env, desiredBufferFrames * (audioBufferStereo ? 2 : 1));\n        if (audioBufferLocal) {\n            jbufobj = (*env)->NewGlobalRef(env, audioBufferLocal);\n            (*env)->DeleteLocalRef(env, audioBufferLocal);\n        }\n    }\n\n    if (jbufobj == NULL) {\n        __android_log_print(ANDROID_LOG_WARN, \"SDL\", \"SDL audio: could not allocate an audio buffer!\");\n        return 0;\n    }\n\n    if (iscapture) {\n        captureBuffer = jbufobj;\n    } else {\n        audioBuffer = jbufobj;\n    }\n\n    isCopy = JNI_FALSE;\n\n    if (is16Bit) {\n        if (!iscapture) {\n            audioBufferPinned = (*env)->GetShortArrayElements(env, (jshortArray)audioBuffer, &isCopy);\n        }\n        audioBufferFrames = (*env)->GetArrayLength(env, (jshortArray)audioBuffer);\n    } else {\n        if (!iscapture) {\n            audioBufferPinned = (*env)->GetByteArrayElements(env, (jbyteArray)audioBuffer, &isCopy);\n        }\n        audioBufferFrames = (*env)->GetArrayLength(env, (jbyteArray)audioBuffer);\n    }\n\n    if (audioBufferStereo) {\n        audioBufferFrames /= 2;\n    }\n\n    return audioBufferFrames;\n}\n\nvoid * Android_JNI_GetAudioBuffer(void)\n{\n    return audioBufferPinned;\n}\n\nvoid Android_JNI_WriteAudioBuffer(void)\n{\n    JNIEnv *mAudioEnv = Android_JNI_GetEnv();\n\n    if (audioBuffer16Bit) {\n        (*mAudioEnv)->ReleaseShortArrayElements(mAudioEnv, (jshortArray)audioBuffer, (jshort *)audioBufferPinned, JNI_COMMIT);\n        (*mAudioEnv)->CallStaticVoidMethod(mAudioEnv, mActivityClass, midAudioWriteShortBuffer, (jshortArray)audioBuffer);\n    } else {\n        (*mAudioEnv)->ReleaseByteArrayElements(mAudioEnv, (jbyteArray)audioBuffer, (jbyte *)audioBufferPinned, JNI_COMMIT);\n        (*mAudioEnv)->CallStaticVoidMethod(mAudioEnv, mActivityClass, midAudioWriteByteBuffer, (jbyteArray)audioBuffer);\n    }\n\n    /* JNI_COMMIT means the changes are committed to the VM but the buffer remains pinned */\n}\n\nint Android_JNI_CaptureAudioBuffer(void *buffer, int buflen)\n{\n    JNIEnv *env = Android_JNI_GetEnv();\n    jboolean isCopy = JNI_FALSE;\n    jint br;\n\n    if (captureBuffer16Bit) {\n        SDL_assert((*env)->GetArrayLength(env, (jshortArray)captureBuffer) == (buflen / 2));\n        br = (*env)->CallStaticIntMethod(env, mActivityClass, midCaptureReadShortBuffer, (jshortArray)captureBuffer, JNI_TRUE);\n        if (br > 0) {\n            jshort *ptr = (*env)->GetShortArrayElements(env, (jshortArray)captureBuffer, &isCopy);\n            br *= 2;\n            SDL_memcpy(buffer, ptr, br);\n            (*env)->ReleaseShortArrayElements(env, (jshortArray)captureBuffer, (jshort *)ptr, JNI_ABORT);\n        }\n    } else {\n        SDL_assert((*env)->GetArrayLength(env, (jshortArray)captureBuffer) == buflen);\n        br = (*env)->CallStaticIntMethod(env, mActivityClass, midCaptureReadByteBuffer, (jbyteArray)captureBuffer, JNI_TRUE);\n        if (br > 0) {\n            jbyte *ptr = (*env)->GetByteArrayElements(env, (jbyteArray)captureBuffer, &isCopy);\n            SDL_memcpy(buffer, ptr, br);\n            (*env)->ReleaseByteArrayElements(env, (jbyteArray)captureBuffer, (jbyte *)ptr, JNI_ABORT);\n        }\n    }\n\n    return (int) br;\n}\n\nvoid Android_JNI_FlushCapturedAudio(void)\n{\n    JNIEnv *env = Android_JNI_GetEnv();\n    #if 0  /* !!! FIXME: this needs API 23, or it'll do blocking reads and never end. */\n    if (captureBuffer16Bit) {\n        const jint len = (*env)->GetArrayLength(env, (jshortArray)captureBuffer);\n        while ((*env)->CallStaticIntMethod(env, mActivityClass, midCaptureReadShortBuffer, (jshortArray)captureBuffer, JNI_FALSE) == len) { /* spin */ }\n    } else {\n        const jint len = (*env)->GetArrayLength(env, (jbyteArray)captureBuffer);\n        while ((*env)->CallStaticIntMethod(env, mActivityClass, midCaptureReadByteBuffer, (jbyteArray)captureBuffer, JNI_FALSE) == len) { /* spin */ }\n    }\n    #else\n    if (captureBuffer16Bit) {\n        (*env)->CallStaticIntMethod(env, mActivityClass, midCaptureReadShortBuffer, (jshortArray)captureBuffer, JNI_FALSE);\n    } else {\n        (*env)->CallStaticIntMethod(env, mActivityClass, midCaptureReadByteBuffer, (jbyteArray)captureBuffer, JNI_FALSE);\n    }\n    #endif\n}\n\nvoid Android_JNI_CloseAudioDevice(const int iscapture)\n{\n    JNIEnv *env = Android_JNI_GetEnv();\n\n    if (iscapture) {\n        (*env)->CallStaticVoidMethod(env, mActivityClass, midCaptureClose);\n        if (captureBuffer) {\n            (*env)->DeleteGlobalRef(env, captureBuffer);\n            captureBuffer = NULL;\n        }\n    } else {\n        (*env)->CallStaticVoidMethod(env, mActivityClass, midAudioClose);\n        if (audioBuffer) {\n            (*env)->DeleteGlobalRef(env, audioBuffer);\n            audioBuffer = NULL;\n            audioBufferPinned = NULL;\n        }\n    }\n}\n\n/* Test for an exception and call SDL_SetError with its detail if one occurs */\n/* If the parameter silent is truthy then SDL_SetError() will not be called. */\nstatic SDL_bool Android_JNI_ExceptionOccurred(SDL_bool silent)\n{\n    JNIEnv *mEnv = Android_JNI_GetEnv();\n    jthrowable exception;\n\n    SDL_assert(LocalReferenceHolder_IsActive());\n\n    exception = (*mEnv)->ExceptionOccurred(mEnv);\n    if (exception != NULL) {\n        jmethodID mid;\n\n        /* Until this happens most JNI operations have undefined behaviour */\n        (*mEnv)->ExceptionClear(mEnv);\n\n        if (!silent) {\n            jclass exceptionClass = (*mEnv)->GetObjectClass(mEnv, exception);\n            jclass classClass = (*mEnv)->FindClass(mEnv, \"java/lang/Class\");\n            jstring exceptionName;\n            const char* exceptionNameUTF8;\n            jstring exceptionMessage;\n\n            mid = (*mEnv)->GetMethodID(mEnv, classClass, \"getName\", \"()Ljava/lang/String;\");\n            exceptionName = (jstring)(*mEnv)->CallObjectMethod(mEnv, exceptionClass, mid);\n            exceptionNameUTF8 = (*mEnv)->GetStringUTFChars(mEnv, exceptionName, 0);\n\n            mid = (*mEnv)->GetMethodID(mEnv, exceptionClass, \"getMessage\", \"()Ljava/lang/String;\");\n            exceptionMessage = (jstring)(*mEnv)->CallObjectMethod(mEnv, exception, mid);\n\n            if (exceptionMessage != NULL) {\n                const char* exceptionMessageUTF8 = (*mEnv)->GetStringUTFChars(mEnv, exceptionMessage, 0);\n                SDL_SetError(\"%s: %s\", exceptionNameUTF8, exceptionMessageUTF8);\n                (*mEnv)->ReleaseStringUTFChars(mEnv, exceptionMessage, exceptionMessageUTF8);\n            } else {\n                SDL_SetError(\"%s\", exceptionNameUTF8);\n            }\n\n            (*mEnv)->ReleaseStringUTFChars(mEnv, exceptionName, exceptionNameUTF8);\n        }\n\n        return SDL_TRUE;\n    }\n\n    return SDL_FALSE;\n}\n\nstatic int Internal_Android_JNI_FileOpen(SDL_RWops* ctx)\n{\n    struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__);\n\n    int result = 0;\n\n    jmethodID mid;\n    jobject context;\n    jobject assetManager;\n    jobject inputStream;\n    jclass channels;\n    jobject readableByteChannel;\n    jstring fileNameJString;\n    jobject fd;\n    jclass fdCls;\n    jfieldID descriptor;\n\n    JNIEnv *mEnv = Android_JNI_GetEnv();\n    if (!LocalReferenceHolder_Init(&refs, mEnv)) {\n        goto failure;\n    }\n\n    fileNameJString = (jstring)ctx->hidden.androidio.fileNameRef;\n    ctx->hidden.androidio.position = 0;\n\n    /* context = SDLActivity.getContext(); */\n    mid = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,\n            \"getContext\",\"()Landroid/content/Context;\");\n    context = (*mEnv)->CallStaticObjectMethod(mEnv, mActivityClass, mid);\n\n\n    /* assetManager = context.getAssets(); */\n    mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, context),\n            \"getAssets\", \"()Landroid/content/res/AssetManager;\");\n    assetManager = (*mEnv)->CallObjectMethod(mEnv, context, mid);\n\n    /* First let's try opening the file to obtain an AssetFileDescriptor.\n    * This method reads the files directly from the APKs using standard *nix calls\n    */\n    mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, assetManager), \"openFd\", \"(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;\");\n    inputStream = (*mEnv)->CallObjectMethod(mEnv, assetManager, mid, fileNameJString);\n    if (Android_JNI_ExceptionOccurred(SDL_TRUE)) {\n        goto fallback;\n    }\n\n    mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, inputStream), \"getStartOffset\", \"()J\");\n    ctx->hidden.androidio.offset = (*mEnv)->CallLongMethod(mEnv, inputStream, mid);\n    if (Android_JNI_ExceptionOccurred(SDL_TRUE)) {\n        goto fallback;\n    }\n\n    mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, inputStream), \"getDeclaredLength\", \"()J\");\n    ctx->hidden.androidio.size = (*mEnv)->CallLongMethod(mEnv, inputStream, mid);\n    if (Android_JNI_ExceptionOccurred(SDL_TRUE)) {\n        goto fallback;\n    }\n\n    mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, inputStream), \"getFileDescriptor\", \"()Ljava/io/FileDescriptor;\");\n    fd = (*mEnv)->CallObjectMethod(mEnv, inputStream, mid);\n    fdCls = (*mEnv)->GetObjectClass(mEnv, fd);\n    descriptor = (*mEnv)->GetFieldID(mEnv, fdCls, \"descriptor\", \"I\");\n    ctx->hidden.androidio.fd = (*mEnv)->GetIntField(mEnv, fd, descriptor);\n    ctx->hidden.androidio.assetFileDescriptorRef = (*mEnv)->NewGlobalRef(mEnv, inputStream);\n\n    /* Seek to the correct offset in the file. */\n    lseek(ctx->hidden.androidio.fd, (off_t)ctx->hidden.androidio.offset, SEEK_SET);\n\n    if (0) {\nfallback:\n        /* Disabled log message because of spam on the Nexus 7 */\n        /* __android_log_print(ANDROID_LOG_DEBUG, \"SDL\", \"Falling back to legacy InputStream method for opening file\"); */\n\n        /* Try the old method using InputStream */\n        ctx->hidden.androidio.assetFileDescriptorRef = NULL;\n\n        /* inputStream = assetManager.open(<filename>); */\n        mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, assetManager),\n                \"open\", \"(Ljava/lang/String;I)Ljava/io/InputStream;\");\n        inputStream = (*mEnv)->CallObjectMethod(mEnv, assetManager, mid, fileNameJString, 1 /* ACCESS_RANDOM */);\n        if (Android_JNI_ExceptionOccurred(SDL_FALSE)) {\n            /* Try fallback to APK expansion files */\n            mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, context),\n                \"openAPKExpansionInputStream\", \"(Ljava/lang/String;)Ljava/io/InputStream;\");\n            if (!mid) {\n                SDL_SetError(\"No openAPKExpansionInputStream() in Java class\");\n                goto failure; /* Java class is missing the required method */\n            }\n            inputStream = (*mEnv)->CallObjectMethod(mEnv, context, mid, fileNameJString);\n\n            /* Exception is checked first because it always needs to be cleared.\n             * If no exception occurred then the last SDL error message is kept.\n             */\n            if (Android_JNI_ExceptionOccurred(SDL_FALSE) || !inputStream) {\n                goto failure;\n            }\n        }\n\n        ctx->hidden.androidio.inputStreamRef = (*mEnv)->NewGlobalRef(mEnv, inputStream);\n\n        /* Despite all the visible documentation on [Asset]InputStream claiming\n         * that the .available() method is not guaranteed to return the entire file\n         * size, comments in <sdk>/samples/<ver>/ApiDemos/src/com/example/ ...\n         * android/apis/content/ReadAsset.java imply that Android's\n         * AssetInputStream.available() /will/ always return the total file size\n        */\n        \n        /* size = inputStream.available(); */\n        mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, inputStream),\n                \"available\", \"()I\");\n        ctx->hidden.androidio.size = (long)(*mEnv)->CallIntMethod(mEnv, inputStream, mid);\n        if (Android_JNI_ExceptionOccurred(SDL_FALSE)) {\n            goto failure;\n        }\n\n        /* readableByteChannel = Channels.newChannel(inputStream); */\n        channels = (*mEnv)->FindClass(mEnv, \"java/nio/channels/Channels\");\n        mid = (*mEnv)->GetStaticMethodID(mEnv, channels,\n                \"newChannel\",\n                \"(Ljava/io/InputStream;)Ljava/nio/channels/ReadableByteChannel;\");\n        readableByteChannel = (*mEnv)->CallStaticObjectMethod(\n                mEnv, channels, mid, inputStream);\n        if (Android_JNI_ExceptionOccurred(SDL_FALSE)) {\n            goto failure;\n        }\n\n        ctx->hidden.androidio.readableByteChannelRef =\n            (*mEnv)->NewGlobalRef(mEnv, readableByteChannel);\n\n        /* Store .read id for reading purposes */\n        mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, readableByteChannel),\n                \"read\", \"(Ljava/nio/ByteBuffer;)I\");\n        ctx->hidden.androidio.readMethod = mid;\n    }\n\n    if (0) {\nfailure:\n        result = -1;\n\n        (*mEnv)->DeleteGlobalRef(mEnv, (jobject)ctx->hidden.androidio.fileNameRef);\n\n        if(ctx->hidden.androidio.inputStreamRef != NULL) {\n            (*mEnv)->DeleteGlobalRef(mEnv, (jobject)ctx->hidden.androidio.inputStreamRef);\n        }\n\n        if(ctx->hidden.androidio.readableByteChannelRef != NULL) {\n            (*mEnv)->DeleteGlobalRef(mEnv, (jobject)ctx->hidden.androidio.readableByteChannelRef);\n        }\n\n        if(ctx->hidden.androidio.assetFileDescriptorRef != NULL) {\n            (*mEnv)->DeleteGlobalRef(mEnv, (jobject)ctx->hidden.androidio.assetFileDescriptorRef);\n        }\n\n    }\n    \n    LocalReferenceHolder_Cleanup(&refs);\n    return result;\n}\n\nint Android_JNI_FileOpen(SDL_RWops* ctx,\n        const char* fileName, const char* mode)\n{\n    struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__);\n    JNIEnv *mEnv = Android_JNI_GetEnv();\n    int retval;\n    jstring fileNameJString;\n\n    if (!LocalReferenceHolder_Init(&refs, mEnv)) {\n        LocalReferenceHolder_Cleanup(&refs);        \n        return -1;\n    }\n\n    if (!ctx) {\n        LocalReferenceHolder_Cleanup(&refs);\n        return -1;\n    }\n\n    fileNameJString = (*mEnv)->NewStringUTF(mEnv, fileName);\n    ctx->hidden.androidio.fileNameRef = (*mEnv)->NewGlobalRef(mEnv, fileNameJString);\n    ctx->hidden.androidio.inputStreamRef = NULL;\n    ctx->hidden.androidio.readableByteChannelRef = NULL;\n    ctx->hidden.androidio.readMethod = NULL;\n    ctx->hidden.androidio.assetFileDescriptorRef = NULL;\n\n    retval = Internal_Android_JNI_FileOpen(ctx);\n    LocalReferenceHolder_Cleanup(&refs);\n    return retval;\n}\n\nsize_t Android_JNI_FileRead(SDL_RWops* ctx, void* buffer,\n        size_t size, size_t maxnum)\n{\n    struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__);\n\n    if (ctx->hidden.androidio.assetFileDescriptorRef) {\n        size_t bytesMax = size * maxnum;\n        size_t result;\n        if (ctx->hidden.androidio.size != -1 /* UNKNOWN_LENGTH */ && ctx->hidden.androidio.position + bytesMax > ctx->hidden.androidio.size) {\n            bytesMax = ctx->hidden.androidio.size - ctx->hidden.androidio.position;\n        }\n        result = read(ctx->hidden.androidio.fd, buffer, bytesMax );\n        if (result > 0) {\n            ctx->hidden.androidio.position += result;\n            LocalReferenceHolder_Cleanup(&refs);\n            return result / size;\n        }\n        LocalReferenceHolder_Cleanup(&refs);\n        return 0;\n    } else {\n        jlong bytesRemaining = (jlong) (size * maxnum);\n        jlong bytesMax = (jlong) (ctx->hidden.androidio.size -  ctx->hidden.androidio.position);\n        int bytesRead = 0;\n        JNIEnv *mEnv;\n        jobject readableByteChannel;\n        jmethodID readMethod;\n        jobject byteBuffer;\n\n        /* Don't read more bytes than those that remain in the file, otherwise we get an exception */\n        if (bytesRemaining >  bytesMax) bytesRemaining = bytesMax;\n\n        mEnv = Android_JNI_GetEnv();\n        if (!LocalReferenceHolder_Init(&refs, mEnv)) {\n            LocalReferenceHolder_Cleanup(&refs);            \n            return 0;\n        }\n\n        readableByteChannel = (jobject)ctx->hidden.androidio.readableByteChannelRef;\n        readMethod = (jmethodID)ctx->hidden.androidio.readMethod;\n        byteBuffer = (*mEnv)->NewDirectByteBuffer(mEnv, buffer, bytesRemaining);\n\n        while (bytesRemaining > 0) {\n            /* result = readableByteChannel.read(...); */\n            int result = (*mEnv)->CallIntMethod(mEnv, readableByteChannel, readMethod, byteBuffer);\n\n            if (Android_JNI_ExceptionOccurred(SDL_FALSE)) {\n                LocalReferenceHolder_Cleanup(&refs);            \n                return 0;\n            }\n\n            if (result < 0) {\n                break;\n            }\n\n            bytesRemaining -= result;\n            bytesRead += result;\n            ctx->hidden.androidio.position += result;\n        }\n        LocalReferenceHolder_Cleanup(&refs);                    \n        return bytesRead / size;\n    }\n}\n\nsize_t Android_JNI_FileWrite(SDL_RWops* ctx, const void* buffer,\n        size_t size, size_t num)\n{\n    SDL_SetError(\"Cannot write to Android package filesystem\");\n    return 0;\n}\n\nstatic int Internal_Android_JNI_FileClose(SDL_RWops* ctx, SDL_bool release)\n{\n    struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__);\n\n    int result = 0;\n    JNIEnv *mEnv = Android_JNI_GetEnv();\n\n    if (!LocalReferenceHolder_Init(&refs, mEnv)) {\n        LocalReferenceHolder_Cleanup(&refs);\n        return SDL_SetError(\"Failed to allocate enough JVM local references\");\n    }\n\n    if (ctx) {\n        if (release) {\n            (*mEnv)->DeleteGlobalRef(mEnv, (jobject)ctx->hidden.androidio.fileNameRef);\n        }\n\n        if (ctx->hidden.androidio.assetFileDescriptorRef) {\n            jobject inputStream = (jobject)ctx->hidden.androidio.assetFileDescriptorRef;\n            jmethodID mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, inputStream),\n                    \"close\", \"()V\");\n            (*mEnv)->CallVoidMethod(mEnv, inputStream, mid);\n            (*mEnv)->DeleteGlobalRef(mEnv, (jobject)ctx->hidden.androidio.assetFileDescriptorRef);\n            if (Android_JNI_ExceptionOccurred(SDL_FALSE)) {\n                result = -1;\n            }\n        }\n        else {\n            jobject inputStream = (jobject)ctx->hidden.androidio.inputStreamRef;\n\n            /* inputStream.close(); */\n            jmethodID mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, inputStream),\n                    \"close\", \"()V\");\n            (*mEnv)->CallVoidMethod(mEnv, inputStream, mid);\n            (*mEnv)->DeleteGlobalRef(mEnv, (jobject)ctx->hidden.androidio.inputStreamRef);\n            (*mEnv)->DeleteGlobalRef(mEnv, (jobject)ctx->hidden.androidio.readableByteChannelRef);\n            if (Android_JNI_ExceptionOccurred(SDL_FALSE)) {\n                result = -1;\n            }\n        }\n\n        if (release) {\n            SDL_FreeRW(ctx);\n        }\n    }\n\n    LocalReferenceHolder_Cleanup(&refs);\n    return result;\n}\n\n\nSint64 Android_JNI_FileSize(SDL_RWops* ctx)\n{\n    return ctx->hidden.androidio.size;\n}\n\nSint64 Android_JNI_FileSeek(SDL_RWops* ctx, Sint64 offset, int whence)\n{\n    if (ctx->hidden.androidio.assetFileDescriptorRef) {\n        off_t ret;\n        switch (whence) {\n            case RW_SEEK_SET:\n                if (ctx->hidden.androidio.size != -1 /* UNKNOWN_LENGTH */ && offset > ctx->hidden.androidio.size) offset = ctx->hidden.androidio.size;\n                offset += ctx->hidden.androidio.offset;\n                break;\n            case RW_SEEK_CUR:\n                offset += ctx->hidden.androidio.position;\n                if (ctx->hidden.androidio.size != -1 /* UNKNOWN_LENGTH */ && offset > ctx->hidden.androidio.size) offset = ctx->hidden.androidio.size;\n                offset += ctx->hidden.androidio.offset;\n                break;\n            case RW_SEEK_END:\n                offset = ctx->hidden.androidio.offset + ctx->hidden.androidio.size + offset;\n                break;\n            default:\n                return SDL_SetError(\"Unknown value for 'whence'\");\n        }\n        whence = SEEK_SET;\n\n        ret = lseek(ctx->hidden.androidio.fd, (off_t)offset, SEEK_SET);\n        if (ret == -1) return -1;\n        ctx->hidden.androidio.position = ret - ctx->hidden.androidio.offset;\n    } else {\n        Sint64 newPosition;\n        Sint64 movement;\n\n        switch (whence) {\n            case RW_SEEK_SET:\n                newPosition = offset;\n                break;\n            case RW_SEEK_CUR:\n                newPosition = ctx->hidden.androidio.position + offset;\n                break;\n            case RW_SEEK_END:\n                newPosition = ctx->hidden.androidio.size + offset;\n                break;\n            default:\n                return SDL_SetError(\"Unknown value for 'whence'\");\n        }\n\n        /* Validate the new position */\n        if (newPosition < 0) {\n            return SDL_Error(SDL_EFSEEK);\n        }\n        if (newPosition > ctx->hidden.androidio.size) {\n            newPosition = ctx->hidden.androidio.size;\n        }\n\n        movement = newPosition - ctx->hidden.androidio.position;\n        if (movement > 0) {\n            unsigned char buffer[4096];\n\n            /* The easy case where we're seeking forwards */\n            while (movement > 0) {\n                Sint64 amount = sizeof (buffer);\n                size_t result;\n                if (amount > movement) {\n                    amount = movement;\n                }\n                result = Android_JNI_FileRead(ctx, buffer, 1, amount);\n                if (result <= 0) {\n                    /* Failed to read/skip the required amount, so fail */\n                    return -1;\n                }\n\n                movement -= result;\n            }\n\n        } else if (movement < 0) {\n            /* We can't seek backwards so we have to reopen the file and seek */\n            /* forwards which obviously isn't very efficient */\n            Internal_Android_JNI_FileClose(ctx, SDL_FALSE);\n            Internal_Android_JNI_FileOpen(ctx);\n            Android_JNI_FileSeek(ctx, newPosition, RW_SEEK_SET);\n        }\n    }\n\n    return ctx->hidden.androidio.position;\n\n}\n\nint Android_JNI_FileClose(SDL_RWops* ctx)\n{\n    return Internal_Android_JNI_FileClose(ctx, SDL_TRUE);\n}\n\n/* returns a new global reference which needs to be released later */\nstatic jobject Android_JNI_GetSystemServiceObject(const char* name)\n{\n    struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__);\n    JNIEnv* env = Android_JNI_GetEnv();\n    jobject retval = NULL;\n    jstring service;\n    jmethodID mid;\n    jobject context;\n    jobject manager;\n\n    if (!LocalReferenceHolder_Init(&refs, env)) {\n        LocalReferenceHolder_Cleanup(&refs);\n        return NULL;\n    }\n\n    service = (*env)->NewStringUTF(env, name);\n\n    mid = (*env)->GetStaticMethodID(env, mActivityClass, \"getContext\", \"()Landroid/content/Context;\");\n    context = (*env)->CallStaticObjectMethod(env, mActivityClass, mid);\n\n    mid = (*env)->GetMethodID(env, mActivityClass, \"getSystemServiceFromUiThread\", \"(Ljava/lang/String;)Ljava/lang/Object;\");\n    manager = (*env)->CallObjectMethod(env, context, mid, service);\n\n    (*env)->DeleteLocalRef(env, service);\n\n    retval = manager ? (*env)->NewGlobalRef(env, manager) : NULL;\n    LocalReferenceHolder_Cleanup(&refs);\n    return retval;\n}\n\n#define SETUP_CLIPBOARD(error) \\\n    struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__); \\\n    JNIEnv* env = Android_JNI_GetEnv(); \\\n    jobject clipboard; \\\n    if (!LocalReferenceHolder_Init(&refs, env)) { \\\n        LocalReferenceHolder_Cleanup(&refs); \\\n        return error; \\\n    } \\\n    clipboard = Android_JNI_GetSystemServiceObject(\"clipboard\"); \\\n    if (!clipboard) { \\\n        LocalReferenceHolder_Cleanup(&refs); \\\n        return error; \\\n    }\n\n#define CLEANUP_CLIPBOARD() \\\n    LocalReferenceHolder_Cleanup(&refs);\n\nint Android_JNI_SetClipboardText(const char* text)\n{\n    /* Watch out for C89 scoping rules because of the macro */\n    SETUP_CLIPBOARD(-1)\n\n    /* Nest the following in a scope to avoid C89 declaration rules triggered by the macro */\n    {\n        jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, clipboard), \"setText\", \"(Ljava/lang/CharSequence;)V\");\n        jstring string = (*env)->NewStringUTF(env, text);\n        (*env)->CallVoidMethod(env, clipboard, mid, string);\n        (*env)->DeleteGlobalRef(env, clipboard);\n        (*env)->DeleteLocalRef(env, string);\n    }\n    CLEANUP_CLIPBOARD();\n\n    return 0;\n}\n\nchar* Android_JNI_GetClipboardText(void)\n{\n    /* Watch out for C89 scoping rules because of the macro */\n    SETUP_CLIPBOARD(SDL_strdup(\"\"))\n\n    /* Nest the following in a scope to avoid C89 declaration rules triggered by the macro */\n    {\n        jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, clipboard), \"getText\", \"()Ljava/lang/CharSequence;\");\n        jobject sequence = (*env)->CallObjectMethod(env, clipboard, mid);\n        (*env)->DeleteGlobalRef(env, clipboard);\n        if (sequence) {\n            jstring string;\n            const char* utf;\n            mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, sequence), \"toString\", \"()Ljava/lang/String;\");\n            string = (jstring)((*env)->CallObjectMethod(env, sequence, mid));\n            utf = (*env)->GetStringUTFChars(env, string, 0);\n            if (utf) {\n                char* text = SDL_strdup(utf);\n                (*env)->ReleaseStringUTFChars(env, string, utf);\n\n                CLEANUP_CLIPBOARD();\n\n                return text;\n            }\n        }\n    }\n    CLEANUP_CLIPBOARD();    \n\n    return SDL_strdup(\"\");\n}\n\nSDL_bool Android_JNI_HasClipboardText(void)\n{\n    jmethodID mid;\n    jboolean has;\n    /* Watch out for C89 scoping rules because of the macro */\n    SETUP_CLIPBOARD(SDL_FALSE)\n\n    mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, clipboard), \"hasText\", \"()Z\");\n    has = (*env)->CallBooleanMethod(env, clipboard, mid);\n    (*env)->DeleteGlobalRef(env, clipboard);\n\n    CLEANUP_CLIPBOARD();\n    \n    return has ? SDL_TRUE : SDL_FALSE;\n}\n\n\n/* returns 0 on success or -1 on error (others undefined then)\n * returns truthy or falsy value in plugged, charged and battery\n * returns the value in seconds and percent or -1 if not available\n */\nint Android_JNI_GetPowerInfo(int* plugged, int* charged, int* battery, int* seconds, int* percent)\n{\n    struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__);\n    JNIEnv* env = Android_JNI_GetEnv();\n    jmethodID mid;\n    jobject context;\n    jstring action;\n    jclass cls;\n    jobject filter;\n    jobject intent;\n    jstring iname;\n    jmethodID imid;\n    jstring bname;\n    jmethodID bmid;\n    if (!LocalReferenceHolder_Init(&refs, env)) {\n        LocalReferenceHolder_Cleanup(&refs);\n        return -1;\n    }\n\n\n    mid = (*env)->GetStaticMethodID(env, mActivityClass, \"getContext\", \"()Landroid/content/Context;\");\n    context = (*env)->CallStaticObjectMethod(env, mActivityClass, mid);\n\n    action = (*env)->NewStringUTF(env, \"android.intent.action.BATTERY_CHANGED\");\n\n    cls = (*env)->FindClass(env, \"android/content/IntentFilter\");\n\n    mid = (*env)->GetMethodID(env, cls, \"<init>\", \"(Ljava/lang/String;)V\");\n    filter = (*env)->NewObject(env, cls, mid, action);\n\n    (*env)->DeleteLocalRef(env, action);\n\n    mid = (*env)->GetMethodID(env, mActivityClass, \"registerReceiver\", \"(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;\");\n    intent = (*env)->CallObjectMethod(env, context, mid, NULL, filter);\n\n    (*env)->DeleteLocalRef(env, filter);\n\n    cls = (*env)->GetObjectClass(env, intent);\n\n    imid = (*env)->GetMethodID(env, cls, \"getIntExtra\", \"(Ljava/lang/String;I)I\");\n\n    /* Watch out for C89 scoping rules because of the macro */\n#define GET_INT_EXTRA(var, key) \\\n    int var; \\\n    iname = (*env)->NewStringUTF(env, key); \\\n    var = (*env)->CallIntMethod(env, intent, imid, iname, -1); \\\n    (*env)->DeleteLocalRef(env, iname);\n\n    bmid = (*env)->GetMethodID(env, cls, \"getBooleanExtra\", \"(Ljava/lang/String;Z)Z\");\n\n    /* Watch out for C89 scoping rules because of the macro */\n#define GET_BOOL_EXTRA(var, key) \\\n    int var; \\\n    bname = (*env)->NewStringUTF(env, key); \\\n    var = (*env)->CallBooleanMethod(env, intent, bmid, bname, JNI_FALSE); \\\n    (*env)->DeleteLocalRef(env, bname);\n\n    if (plugged) {\n        /* Watch out for C89 scoping rules because of the macro */\n        GET_INT_EXTRA(plug, \"plugged\") /* == BatteryManager.EXTRA_PLUGGED (API 5) */\n        if (plug == -1) {\n            LocalReferenceHolder_Cleanup(&refs);\n            return -1;\n        }\n        /* 1 == BatteryManager.BATTERY_PLUGGED_AC */\n        /* 2 == BatteryManager.BATTERY_PLUGGED_USB */\n        *plugged = (0 < plug) ? 1 : 0;\n    }\n\n    if (charged) {\n        /* Watch out for C89 scoping rules because of the macro */\n        GET_INT_EXTRA(status, \"status\") /* == BatteryManager.EXTRA_STATUS (API 5) */\n        if (status == -1) {\n            LocalReferenceHolder_Cleanup(&refs);\n            return -1;\n        }\n        /* 5 == BatteryManager.BATTERY_STATUS_FULL */\n        *charged = (status == 5) ? 1 : 0;\n    }\n\n    if (battery) {\n        GET_BOOL_EXTRA(present, \"present\") /* == BatteryManager.EXTRA_PRESENT (API 5) */\n        *battery = present ? 1 : 0;\n    }\n\n    if (seconds) {\n        *seconds = -1; /* not possible */\n    }\n\n    if (percent) {\n        int level;\n        int scale;\n        \n        /* Watch out for C89 scoping rules because of the macro */\n        {\n            GET_INT_EXTRA(level_temp, \"level\") /* == BatteryManager.EXTRA_LEVEL (API 5) */\n            level = level_temp;\n        }\n        /* Watch out for C89 scoping rules because of the macro */\n        {\n            GET_INT_EXTRA(scale_temp, \"scale\") /* == BatteryManager.EXTRA_SCALE (API 5) */\n            scale = scale_temp;\n        }\n        \n        if ((level == -1) || (scale == -1)) {\n            LocalReferenceHolder_Cleanup(&refs);\n            return -1;\n        }\n        *percent = level * 100 / scale;\n    }\n\n    (*env)->DeleteLocalRef(env, intent);\n\n    LocalReferenceHolder_Cleanup(&refs);\n    return 0;\n}\n\n/* returns number of found touch devices as return value and ids in parameter ids */\nint Android_JNI_GetTouchDeviceIds(int **ids) {\n    JNIEnv *env = Android_JNI_GetEnv();\n    jint sources = 4098; /* == InputDevice.SOURCE_TOUCHSCREEN */\n    jmethodID mid = (*env)->GetStaticMethodID(env, mActivityClass, \"inputGetInputDeviceIds\", \"(I)[I\");\n    jintArray array = (jintArray) (*env)->CallStaticObjectMethod(env, mActivityClass, mid, sources);\n    int number = 0;\n    *ids = NULL;\n    if (array) {\n        number = (int) (*env)->GetArrayLength(env, array);\n        if (0 < number) {\n            jint* elements = (*env)->GetIntArrayElements(env, array, NULL);\n            if (elements) {\n                int i;\n                *ids = SDL_malloc(number * sizeof (**ids));\n                for (i = 0; i < number; ++i) { /* not assuming sizeof (jint) == sizeof (int) */\n                    (*ids)[i] = elements[i];\n                }\n                (*env)->ReleaseIntArrayElements(env, array, elements, JNI_ABORT);\n            }\n        }\n        (*env)->DeleteLocalRef(env, array);\n    }\n    return number;\n}\n\nvoid Android_JNI_PollInputDevices(void)\n{\n    JNIEnv *env = Android_JNI_GetEnv();\n    (*env)->CallStaticVoidMethod(env, mActivityClass, midPollInputDevices);    \n}\n\n/* See SDLActivity.java for constants. */\n#define COMMAND_SET_KEEP_SCREEN_ON    5\n\n/* sends message to be handled on the UI event dispatch thread */\nint Android_JNI_SendMessage(int command, int param)\n{\n    JNIEnv *env = Android_JNI_GetEnv();\n    jmethodID mid;\n    jboolean success;\n    if (!env) {\n        return -1;\n    }\n    mid = (*env)->GetStaticMethodID(env, mActivityClass, \"sendMessage\", \"(II)Z\");\n    if (!mid) {\n        return -1;\n    }\n    success = (*env)->CallStaticBooleanMethod(env, mActivityClass, mid, command, param);\n    return success ? 0 : -1;\n}\n\nvoid Android_JNI_SuspendScreenSaver(SDL_bool suspend)\n{\n    Android_JNI_SendMessage(COMMAND_SET_KEEP_SCREEN_ON, (suspend == SDL_FALSE) ? 0 : 1);\n}\n\nvoid Android_JNI_ShowTextInput(SDL_Rect *inputRect)\n{\n    JNIEnv *env = Android_JNI_GetEnv();\n    jmethodID mid;\n    if (!env) {\n        return;\n    }\n\n    mid = (*env)->GetStaticMethodID(env, mActivityClass, \"showTextInput\", \"(IIII)Z\");\n    if (!mid) {\n        return;\n    }\n    (*env)->CallStaticBooleanMethod(env, mActivityClass, mid,\n                               inputRect->x,\n                               inputRect->y,\n                               inputRect->w,\n                               inputRect->h );\n}\n\nvoid Android_JNI_HideTextInput(void)\n{\n    /* has to match Activity constant */\n    const int COMMAND_TEXTEDIT_HIDE = 3;\n    Android_JNI_SendMessage(COMMAND_TEXTEDIT_HIDE, 0);\n}\n\nint Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)\n{\n    JNIEnv *env;\n    jclass clazz;\n    jmethodID mid;\n    jobject context;\n    jstring title;\n    jstring message;\n    jintArray button_flags;\n    jintArray button_ids;\n    jobjectArray button_texts;\n    jintArray colors;\n    jobject text;\n    jint temp;\n    int i;\n\n    env = Android_JNI_GetEnv();\n\n    /* convert parameters */\n\n    clazz = (*env)->FindClass(env, \"java/lang/String\");\n\n    title = (*env)->NewStringUTF(env, messageboxdata->title);\n    message = (*env)->NewStringUTF(env, messageboxdata->message);\n\n    button_flags = (*env)->NewIntArray(env, messageboxdata->numbuttons);\n    button_ids = (*env)->NewIntArray(env, messageboxdata->numbuttons);\n    button_texts = (*env)->NewObjectArray(env, messageboxdata->numbuttons,\n        clazz, NULL);\n    for (i = 0; i < messageboxdata->numbuttons; ++i) {\n        temp = messageboxdata->buttons[i].flags;\n        (*env)->SetIntArrayRegion(env, button_flags, i, 1, &temp);\n        temp = messageboxdata->buttons[i].buttonid;\n        (*env)->SetIntArrayRegion(env, button_ids, i, 1, &temp);\n        text = (*env)->NewStringUTF(env, messageboxdata->buttons[i].text);\n        (*env)->SetObjectArrayElement(env, button_texts, i, text);\n        (*env)->DeleteLocalRef(env, text);\n    }\n\n    if (messageboxdata->colorScheme) {\n        colors = (*env)->NewIntArray(env, SDL_MESSAGEBOX_COLOR_MAX);\n        for (i = 0; i < SDL_MESSAGEBOX_COLOR_MAX; ++i) {\n            temp = (0xFF << 24) |\n                   (messageboxdata->colorScheme->colors[i].r << 16) |\n                   (messageboxdata->colorScheme->colors[i].g << 8) |\n                   (messageboxdata->colorScheme->colors[i].b << 0);\n            (*env)->SetIntArrayRegion(env, colors, i, 1, &temp);\n        }\n    } else {\n        colors = NULL;\n    }\n\n    (*env)->DeleteLocalRef(env, clazz);\n\n    /* call function */\n\n    mid = (*env)->GetStaticMethodID(env, mActivityClass, \"getContext\",\"()Landroid/content/Context;\");\n\n    context = (*env)->CallStaticObjectMethod(env, mActivityClass, mid);\n\n    clazz = (*env)->GetObjectClass(env, context);\n\n    mid = (*env)->GetMethodID(env, clazz,\n        \"messageboxShowMessageBox\", \"(ILjava/lang/String;Ljava/lang/String;[I[I[Ljava/lang/String;[I)I\");\n    *buttonid = (*env)->CallIntMethod(env, context, mid,\n        messageboxdata->flags,\n        title,\n        message,\n        button_flags,\n        button_ids,\n        button_texts,\n        colors);\n\n    (*env)->DeleteLocalRef(env, context);\n    (*env)->DeleteLocalRef(env, clazz);\n\n    /* delete parameters */\n\n    (*env)->DeleteLocalRef(env, title);\n    (*env)->DeleteLocalRef(env, message);\n    (*env)->DeleteLocalRef(env, button_flags);\n    (*env)->DeleteLocalRef(env, button_ids);\n    (*env)->DeleteLocalRef(env, button_texts);\n    (*env)->DeleteLocalRef(env, colors);\n\n    return 0;\n}\n\n/*\n//////////////////////////////////////////////////////////////////////////////\n//\n// Functions exposed to SDL applications in SDL_system.h\n//////////////////////////////////////////////////////////////////////////////\n*/\n\nvoid *SDL_AndroidGetJNIEnv()\n{\n    return Android_JNI_GetEnv();\n}\n\n\n\nvoid *SDL_AndroidGetActivity()\n{\n    /* See SDL_system.h for caveats on using this function. */\n\n    jmethodID mid;\n\n    JNIEnv *env = Android_JNI_GetEnv();\n    if (!env) {\n        return NULL;\n    }\n\n    /* return SDLActivity.getContext(); */\n    mid = (*env)->GetStaticMethodID(env, mActivityClass,\n            \"getContext\",\"()Landroid/content/Context;\");\n    return (*env)->CallStaticObjectMethod(env, mActivityClass, mid);\n}\n\nconst char * SDL_AndroidGetInternalStoragePath()\n{\n    static char *s_AndroidInternalFilesPath = NULL;\n\n    if (!s_AndroidInternalFilesPath) {\n        struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__);\n        jmethodID mid;\n        jobject context;\n        jobject fileObject;\n        jstring pathString;\n        const char *path;\n\n        JNIEnv *env = Android_JNI_GetEnv();\n        if (!LocalReferenceHolder_Init(&refs, env)) {\n            LocalReferenceHolder_Cleanup(&refs);\n            return NULL;\n        }\n\n        /* context = SDLActivity.getContext(); */\n        mid = (*env)->GetStaticMethodID(env, mActivityClass,\n                \"getContext\",\"()Landroid/content/Context;\");\n        context = (*env)->CallStaticObjectMethod(env, mActivityClass, mid);\n\n        /* fileObj = context.getFilesDir(); */\n        mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context),\n                \"getFilesDir\", \"()Ljava/io/File;\");\n        fileObject = (*env)->CallObjectMethod(env, context, mid);\n        if (!fileObject) {\n            SDL_SetError(\"Couldn't get internal directory\");\n            LocalReferenceHolder_Cleanup(&refs);\n            return NULL;\n        }\n\n        /* path = fileObject.getAbsolutePath(); */\n        mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, fileObject),\n                \"getAbsolutePath\", \"()Ljava/lang/String;\");\n        pathString = (jstring)(*env)->CallObjectMethod(env, fileObject, mid);\n\n        path = (*env)->GetStringUTFChars(env, pathString, NULL);\n        s_AndroidInternalFilesPath = SDL_strdup(path);\n        (*env)->ReleaseStringUTFChars(env, pathString, path);\n\n        LocalReferenceHolder_Cleanup(&refs);\n    }\n    return s_AndroidInternalFilesPath;\n}\n\nint SDL_AndroidGetExternalStorageState()\n{\n    struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__);\n    jmethodID mid;\n    jclass cls;\n    jstring stateString;\n    const char *state;\n    int stateFlags;\n\n    JNIEnv *env = Android_JNI_GetEnv();\n    if (!LocalReferenceHolder_Init(&refs, env)) {\n        LocalReferenceHolder_Cleanup(&refs);\n        return 0;\n    }\n\n    cls = (*env)->FindClass(env, \"android/os/Environment\");\n    mid = (*env)->GetStaticMethodID(env, cls,\n            \"getExternalStorageState\", \"()Ljava/lang/String;\");\n    stateString = (jstring)(*env)->CallStaticObjectMethod(env, cls, mid);\n\n    state = (*env)->GetStringUTFChars(env, stateString, NULL);\n\n    /* Print an info message so people debugging know the storage state */\n    __android_log_print(ANDROID_LOG_INFO, \"SDL\", \"external storage state: %s\", state);\n\n    if (SDL_strcmp(state, \"mounted\") == 0) {\n        stateFlags = SDL_ANDROID_EXTERNAL_STORAGE_READ |\n                     SDL_ANDROID_EXTERNAL_STORAGE_WRITE;\n    } else if (SDL_strcmp(state, \"mounted_ro\") == 0) {\n        stateFlags = SDL_ANDROID_EXTERNAL_STORAGE_READ;\n    } else {\n        stateFlags = 0;\n    }\n    (*env)->ReleaseStringUTFChars(env, stateString, state);\n\n    LocalReferenceHolder_Cleanup(&refs);\n    return stateFlags;\n}\n\nconst char * SDL_AndroidGetExternalStoragePath()\n{\n    static char *s_AndroidExternalFilesPath = NULL;\n\n    if (!s_AndroidExternalFilesPath) {\n        struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__);\n        jmethodID mid;\n        jobject context;\n        jobject fileObject;\n        jstring pathString;\n        const char *path;\n\n        JNIEnv *env = Android_JNI_GetEnv();\n        if (!LocalReferenceHolder_Init(&refs, env)) {\n            LocalReferenceHolder_Cleanup(&refs);\n            return NULL;\n        }\n\n        /* context = SDLActivity.getContext(); */\n        mid = (*env)->GetStaticMethodID(env, mActivityClass,\n                \"getContext\",\"()Landroid/content/Context;\");\n        context = (*env)->CallStaticObjectMethod(env, mActivityClass, mid);\n\n        /* fileObj = context.getExternalFilesDir(); */\n        mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context),\n                \"getExternalFilesDir\", \"(Ljava/lang/String;)Ljava/io/File;\");\n        fileObject = (*env)->CallObjectMethod(env, context, mid, NULL);\n        if (!fileObject) {\n            SDL_SetError(\"Couldn't get external directory\");\n            LocalReferenceHolder_Cleanup(&refs);\n            return NULL;\n        }\n\n        /* path = fileObject.getAbsolutePath(); */\n        mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, fileObject),\n                \"getAbsolutePath\", \"()Ljava/lang/String;\");\n        pathString = (jstring)(*env)->CallObjectMethod(env, fileObject, mid);\n\n        path = (*env)->GetStringUTFChars(env, pathString, NULL);\n        s_AndroidExternalFilesPath = SDL_strdup(path);\n        (*env)->ReleaseStringUTFChars(env, pathString, path);\n\n        LocalReferenceHolder_Cleanup(&refs);\n    }\n    return s_AndroidExternalFilesPath;\n}\n\njclass Android_JNI_GetActivityClass(void)\n{\n    return mActivityClass;\n}\n\n#endif /* __ANDROID__ */\n\n/* vi: set ts=4 sw=4 expandtab: */\n\n"
  },
  {
    "path": "libs/SDL2/src/core/android/SDL_android.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\n/* *INDENT-OFF* */\nextern \"C\" {\n/* *INDENT-ON* */\n#endif\n\n#include <EGL/eglplatform.h>\n#include <android/native_window_jni.h>\n\n#include \"SDL_rect.h\"\n\n/* Interface from the SDL library into the Android Java activity */\nextern void Android_JNI_SetActivityTitle(const char *title);\nextern SDL_bool Android_JNI_GetAccelerometerValues(float values[3]);\nextern void Android_JNI_ShowTextInput(SDL_Rect *inputRect);\nextern void Android_JNI_HideTextInput(void);\nextern ANativeWindow* Android_JNI_GetNativeWindow(void);\n\n/* Audio support */\nextern int Android_JNI_OpenAudioDevice(int iscapture, int sampleRate, int is16Bit, int channelCount, int desiredBufferFrames);\nextern void* Android_JNI_GetAudioBuffer(void);\nextern void Android_JNI_WriteAudioBuffer(void);\nextern int Android_JNI_CaptureAudioBuffer(void *buffer, int buflen);\nextern void Android_JNI_FlushCapturedAudio(void);\nextern void Android_JNI_CloseAudioDevice(const int iscapture);\n\n#include \"SDL_rwops.h\"\n\nint Android_JNI_FileOpen(SDL_RWops* ctx, const char* fileName, const char* mode);\nSint64 Android_JNI_FileSize(SDL_RWops* ctx);\nSint64 Android_JNI_FileSeek(SDL_RWops* ctx, Sint64 offset, int whence);\nsize_t Android_JNI_FileRead(SDL_RWops* ctx, void* buffer, size_t size, size_t maxnum);\nsize_t Android_JNI_FileWrite(SDL_RWops* ctx, const void* buffer, size_t size, size_t num);\nint Android_JNI_FileClose(SDL_RWops* ctx);\n\n/* Clipboard support */\nint Android_JNI_SetClipboardText(const char* text);\nchar* Android_JNI_GetClipboardText(void);\nSDL_bool Android_JNI_HasClipboardText(void);\n\n/* Power support */\nint Android_JNI_GetPowerInfo(int* plugged, int* charged, int* battery, int* seconds, int* percent);\n\n/* Joystick support */\nvoid Android_JNI_PollInputDevices(void);\n\n/* Video */\nvoid Android_JNI_SuspendScreenSaver(SDL_bool suspend);\n\n/* Touch support */\nint Android_JNI_GetTouchDeviceIds(int **ids);\n\n/* Threads */\n#include <jni.h>\nJNIEnv *Android_JNI_GetEnv(void);\nint Android_JNI_SetupThread(void);\njclass Android_JNI_GetActivityClass(void);\n\n/* Generic messages */\nint Android_JNI_SendMessage(int command, int param);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n/* *INDENT-OFF* */\n}\n/* *INDENT-ON* */\n#endif\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/cpuinfo/SDL_cpuinfo.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#ifdef TEST_MAIN\n#include \"SDL_config.h\"\n#else\n#include \"../SDL_internal.h\"\n#endif\n\n#if defined(__WIN32__)\n#include \"../core/windows/SDL_windows.h\"\n#endif\n\n/* CPU feature detection for SDL */\n\n#include \"SDL_cpuinfo.h\"\n\n#ifdef HAVE_SYSCONF\n#include <unistd.h>\n#endif\n#ifdef HAVE_SYSCTLBYNAME\n#include <sys/types.h>\n#include <sys/sysctl.h>\n#endif\n#if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))\n#include <sys/sysctl.h>         /* For AltiVec check */\n#elif defined(__OpenBSD__) && defined(__powerpc__)\n#include <sys/param.h>\n#include <sys/sysctl.h> /* For AltiVec check */\n#include <machine/cpu.h>\n#elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP\n#include <signal.h>\n#include <setjmp.h>\n#endif\n\n#define CPU_HAS_RDTSC   0x00000001\n#define CPU_HAS_ALTIVEC 0x00000002\n#define CPU_HAS_MMX     0x00000004\n#define CPU_HAS_3DNOW   0x00000008\n#define CPU_HAS_SSE     0x00000010\n#define CPU_HAS_SSE2    0x00000020\n#define CPU_HAS_SSE3    0x00000040\n#define CPU_HAS_SSE41   0x00000100\n#define CPU_HAS_SSE42   0x00000200\n#define CPU_HAS_AVX     0x00000400\n#define CPU_HAS_AVX2    0x00000800\n\n#if SDL_ALTIVEC_BLITTERS && HAVE_SETJMP && !__MACOSX__ && !__OpenBSD__\n/* This is the brute force way of detecting instruction sets...\n   the idea is borrowed from the libmpeg2 library - thanks!\n */\nstatic jmp_buf jmpbuf;\nstatic void\nillegal_instruction(int sig)\n{\n    longjmp(jmpbuf, 1);\n}\n#endif /* HAVE_SETJMP */\n\nstatic int\nCPU_haveCPUID(void)\n{\n    int has_CPUID = 0;\n/* *INDENT-OFF* */\n#ifndef SDL_CPUINFO_DISABLED\n#if defined(__GNUC__) && defined(i386)\n    __asm__ (\n\"        pushfl                      # Get original EFLAGS             \\n\"\n\"        popl    %%eax                                                 \\n\"\n\"        movl    %%eax,%%ecx                                           \\n\"\n\"        xorl    $0x200000,%%eax     # Flip ID bit in EFLAGS           \\n\"\n\"        pushl   %%eax               # Save new EFLAGS value on stack  \\n\"\n\"        popfl                       # Replace current EFLAGS value    \\n\"\n\"        pushfl                      # Get new EFLAGS                  \\n\"\n\"        popl    %%eax               # Store new EFLAGS in EAX         \\n\"\n\"        xorl    %%ecx,%%eax         # Can not toggle ID bit,          \\n\"\n\"        jz      1f                  # Processor=80486                 \\n\"\n\"        movl    $1,%0               # We have CPUID support           \\n\"\n\"1:                                                                    \\n\"\n    : \"=m\" (has_CPUID)\n    :\n    : \"%eax\", \"%ecx\"\n    );\n#elif defined(__GNUC__) && defined(__x86_64__)\n/* Technically, if this is being compiled under __x86_64__ then it has \n   CPUid by definition.  But it's nice to be able to prove it.  :)      */\n    __asm__ (\n\"        pushfq                      # Get original EFLAGS             \\n\"\n\"        popq    %%rax                                                 \\n\"\n\"        movq    %%rax,%%rcx                                           \\n\"\n\"        xorl    $0x200000,%%eax     # Flip ID bit in EFLAGS           \\n\"\n\"        pushq   %%rax               # Save new EFLAGS value on stack  \\n\"\n\"        popfq                       # Replace current EFLAGS value    \\n\"\n\"        pushfq                      # Get new EFLAGS                  \\n\"\n\"        popq    %%rax               # Store new EFLAGS in EAX         \\n\"\n\"        xorl    %%ecx,%%eax         # Can not toggle ID bit,          \\n\"\n\"        jz      1f                  # Processor=80486                 \\n\"\n\"        movl    $1,%0               # We have CPUID support           \\n\"\n\"1:                                                                    \\n\"\n    : \"=m\" (has_CPUID)\n    :\n    : \"%rax\", \"%rcx\"\n    );\n#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)\n    __asm {\n        pushfd                      ; Get original EFLAGS\n        pop     eax\n        mov     ecx, eax\n        xor     eax, 200000h        ; Flip ID bit in EFLAGS\n        push    eax                 ; Save new EFLAGS value on stack\n        popfd                       ; Replace current EFLAGS value\n        pushfd                      ; Get new EFLAGS\n        pop     eax                 ; Store new EFLAGS in EAX\n        xor     eax, ecx            ; Can not toggle ID bit,\n        jz      done                ; Processor=80486\n        mov     has_CPUID,1         ; We have CPUID support\ndone:\n    }\n#elif defined(_MSC_VER) && defined(_M_X64)\n    has_CPUID = 1;\n#elif defined(__sun) && defined(__i386)\n    __asm (\n\"       pushfl                 \\n\"\n\"       popl    %eax           \\n\"\n\"       movl    %eax,%ecx      \\n\"\n\"       xorl    $0x200000,%eax \\n\"\n\"       pushl   %eax           \\n\"\n\"       popfl                  \\n\"\n\"       pushfl                 \\n\"\n\"       popl    %eax           \\n\"\n\"       xorl    %ecx,%eax      \\n\"\n\"       jz      1f             \\n\"\n\"       movl    $1,-8(%ebp)    \\n\"\n\"1:                            \\n\"\n    );\n#elif defined(__sun) && defined(__amd64)\n    __asm (\n\"       pushfq                 \\n\"\n\"       popq    %rax           \\n\"\n\"       movq    %rax,%rcx      \\n\"\n\"       xorl    $0x200000,%eax \\n\"\n\"       pushq   %rax           \\n\"\n\"       popfq                  \\n\"\n\"       pushfq                 \\n\"\n\"       popq    %rax           \\n\"\n\"       xorl    %ecx,%eax      \\n\"\n\"       jz      1f             \\n\"\n\"       movl    $1,-8(%rbp)    \\n\"\n\"1:                            \\n\"\n    );\n#endif\n#endif\n/* *INDENT-ON* */\n    return has_CPUID;\n}\n\n#if defined(__GNUC__) && defined(i386)\n#define cpuid(func, a, b, c, d) \\\n    __asm__ __volatile__ ( \\\n\"        pushl %%ebx        \\n\" \\\n\"        xorl %%ecx,%%ecx   \\n\" \\\n\"        cpuid              \\n\" \\\n\"        movl %%ebx, %%esi  \\n\" \\\n\"        popl %%ebx         \\n\" : \\\n            \"=a\" (a), \"=S\" (b), \"=c\" (c), \"=d\" (d) : \"a\" (func))\n#elif defined(__GNUC__) && defined(__x86_64__)\n#define cpuid(func, a, b, c, d) \\\n    __asm__ __volatile__ ( \\\n\"        pushq %%rbx        \\n\" \\\n\"        xorq %%rcx,%%rcx   \\n\" \\\n\"        cpuid              \\n\" \\\n\"        movq %%rbx, %%rsi  \\n\" \\\n\"        popq %%rbx         \\n\" : \\\n            \"=a\" (a), \"=S\" (b), \"=c\" (c), \"=d\" (d) : \"a\" (func))\n#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)\n#define cpuid(func, a, b, c, d) \\\n    __asm { \\\n        __asm mov eax, func \\\n        __asm xor ecx, ecx \\\n        __asm cpuid \\\n        __asm mov a, eax \\\n        __asm mov b, ebx \\\n        __asm mov c, ecx \\\n        __asm mov d, edx \\\n}\n#elif defined(_MSC_VER) && defined(_M_X64)\n#define cpuid(func, a, b, c, d) \\\n{ \\\n    int CPUInfo[4]; \\\n    __cpuid(CPUInfo, func); \\\n    a = CPUInfo[0]; \\\n    b = CPUInfo[1]; \\\n    c = CPUInfo[2]; \\\n    d = CPUInfo[3]; \\\n}\n#else\n#define cpuid(func, a, b, c, d) \\\n    a = b = c = d = 0\n#endif\n\nstatic int\nCPU_getCPUIDFeatures(void)\n{\n    int features = 0;\n    int a, b, c, d;\n\n    cpuid(0, a, b, c, d);\n    if (a >= 1) {\n        cpuid(1, a, b, c, d);\n        features = d;\n    }\n    return features;\n}\n\nstatic SDL_bool\nCPU_OSSavesYMM(void)\n{\n    int a, b, c, d;\n\n    /* Check to make sure we can call xgetbv */\n    cpuid(0, a, b, c, d);\n    if (a < 1) {\n        return SDL_FALSE;\n    }\n    cpuid(1, a, b, c, d);\n    if (!(c & 0x08000000)) {\n        return SDL_FALSE;\n    }\n\n    /* Call xgetbv to see if YMM register state is saved */\n    a = 0;\n#if defined(__GNUC__) && (defined(i386) || defined(__x86_64__))\n    asm(\".byte 0x0f, 0x01, 0xd0\" : \"=a\" (a) : \"c\" (0) : \"%edx\");\n#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) && (_MSC_FULL_VER >= 160040219) /* VS2010 SP1 */\n    a = (int)_xgetbv(0);\n#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)\n    __asm\n    {\n        xor ecx, ecx\n        _asm _emit 0x0f _asm _emit 0x01 _asm _emit 0xd0\n        mov a, eax\n    }\n#endif\n    return ((a & 6) == 6) ? SDL_TRUE : SDL_FALSE;\n}\n\nstatic int\nCPU_haveRDTSC(void)\n{\n    if (CPU_haveCPUID()) {\n        return (CPU_getCPUIDFeatures() & 0x00000010);\n    }\n    return 0;\n}\n\nstatic int\nCPU_haveAltiVec(void)\n{\n    volatile int altivec = 0;\n#ifndef SDL_CPUINFO_DISABLED\n#if (defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))) || (defined(__OpenBSD__) && defined(__powerpc__))\n#ifdef __OpenBSD__\n    int selectors[2] = { CTL_MACHDEP, CPU_ALTIVEC };\n#else\n    int selectors[2] = { CTL_HW, HW_VECTORUNIT };\n#endif\n    int hasVectorUnit = 0;\n    size_t length = sizeof(hasVectorUnit);\n    int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0);\n    if (0 == error)\n        altivec = (hasVectorUnit != 0);\n#elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP\n    void (*handler) (int sig);\n    handler = signal(SIGILL, illegal_instruction);\n    if (setjmp(jmpbuf) == 0) {\n        asm volatile (\"mtspr 256, %0\\n\\t\" \"vand %%v0, %%v0, %%v0\"::\"r\" (-1));\n        altivec = 1;\n    }\n    signal(SIGILL, handler);\n#endif\n#endif\n    return altivec;\n}\n\nstatic int\nCPU_haveMMX(void)\n{\n    if (CPU_haveCPUID()) {\n        return (CPU_getCPUIDFeatures() & 0x00800000);\n    }\n    return 0;\n}\n\nstatic int\nCPU_have3DNow(void)\n{\n    if (CPU_haveCPUID()) {\n        int a, b, c, d;\n\n        cpuid(0x80000000, a, b, c, d);\n        if (a >= 0x80000001) {\n            cpuid(0x80000001, a, b, c, d);\n            return (d & 0x80000000);\n        }\n    }\n    return 0;\n}\n\nstatic int\nCPU_haveSSE(void)\n{\n    if (CPU_haveCPUID()) {\n        return (CPU_getCPUIDFeatures() & 0x02000000);\n    }\n    return 0;\n}\n\nstatic int\nCPU_haveSSE2(void)\n{\n    if (CPU_haveCPUID()) {\n        return (CPU_getCPUIDFeatures() & 0x04000000);\n    }\n    return 0;\n}\n\nstatic int\nCPU_haveSSE3(void)\n{\n    if (CPU_haveCPUID()) {\n        int a, b, c, d;\n\n        cpuid(0, a, b, c, d);\n        if (a >= 1) {\n            cpuid(1, a, b, c, d);\n            return (c & 0x00000001);\n        }\n    }\n    return 0;\n}\n\nstatic int\nCPU_haveSSE41(void)\n{\n    if (CPU_haveCPUID()) {\n        int a, b, c, d;\n\n        cpuid(0, a, b, c, d);\n        if (a >= 1) {\n            cpuid(1, a, b, c, d);\n            return (c & 0x00080000);\n        }\n    }\n    return 0;\n}\n\nstatic int\nCPU_haveSSE42(void)\n{\n    if (CPU_haveCPUID()) {\n        int a, b, c, d;\n\n        cpuid(0, a, b, c, d);\n        if (a >= 1) {\n            cpuid(1, a, b, c, d);\n            return (c & 0x00100000);\n        }\n    }\n    return 0;\n}\n\nstatic int\nCPU_haveAVX(void)\n{\n    if (CPU_haveCPUID() && CPU_OSSavesYMM()) {\n        int a, b, c, d;\n\n        cpuid(0, a, b, c, d);\n        if (a >= 1) {\n            cpuid(1, a, b, c, d);\n            return (c & 0x10000000);\n        }\n    }\n    return 0;\n}\n\nstatic int\nCPU_haveAVX2(void)\n{\n    if (CPU_haveCPUID() && CPU_OSSavesYMM()) {\n        int a, b, c, d;\n\n        cpuid(0, a, b, c, d);\n        if (a >= 7) {\n            cpuid(7, a, b, c, d);\n            return (b & 0x00000020);\n        }\n    }\n    return 0;\n}\n\nstatic int SDL_CPUCount = 0;\n\nint\nSDL_GetCPUCount(void)\n{\n    if (!SDL_CPUCount) {\n#ifndef SDL_CPUINFO_DISABLED\n#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)\n        if (SDL_CPUCount <= 0) {\n            SDL_CPUCount = (int)sysconf(_SC_NPROCESSORS_ONLN);\n        }\n#endif\n#ifdef HAVE_SYSCTLBYNAME\n        if (SDL_CPUCount <= 0) {\n            size_t size = sizeof(SDL_CPUCount);\n            sysctlbyname(\"hw.ncpu\", &SDL_CPUCount, &size, NULL, 0);\n        }\n#endif\n#ifdef __WIN32__\n        if (SDL_CPUCount <= 0) {\n            SYSTEM_INFO info;\n            GetSystemInfo(&info);\n            SDL_CPUCount = info.dwNumberOfProcessors;\n        }\n#endif\n#endif\n        /* There has to be at least 1, right? :) */\n        if (SDL_CPUCount <= 0) {\n            SDL_CPUCount = 1;\n        }\n    }\n    return SDL_CPUCount;\n}\n\n/* Oh, such a sweet sweet trick, just not very useful. :) */\nstatic const char *\nSDL_GetCPUType(void)\n{\n    static char SDL_CPUType[13];\n\n    if (!SDL_CPUType[0]) {\n        int i = 0;\n\n        if (CPU_haveCPUID()) {\n            int a, b, c, d;\n            cpuid(0x00000000, a, b, c, d);\n            (void) a;\n            SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;\n            SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;\n            SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;\n            SDL_CPUType[i++] = (char)(b & 0xff);\n\n            SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;\n            SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;\n            SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;\n            SDL_CPUType[i++] = (char)(d & 0xff);\n\n            SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;\n            SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;\n            SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;\n            SDL_CPUType[i++] = (char)(c & 0xff);\n        }\n        if (!SDL_CPUType[0]) {\n            SDL_strlcpy(SDL_CPUType, \"Unknown\", sizeof(SDL_CPUType));\n        }\n    }\n    return SDL_CPUType;\n}\n\n\n#ifdef TEST_MAIN  /* !!! FIXME: only used for test at the moment. */\nstatic const char *\nSDL_GetCPUName(void)\n{\n    static char SDL_CPUName[48];\n\n    if (!SDL_CPUName[0]) {\n        int i = 0;\n        int a, b, c, d;\n\n        if (CPU_haveCPUID()) {\n            cpuid(0x80000000, a, b, c, d);\n            if (a >= 0x80000004) {\n                cpuid(0x80000002, a, b, c, d);\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                cpuid(0x80000003, a, b, c, d);\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                cpuid(0x80000004, a, b, c, d);\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(a & 0xff); a >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(b & 0xff); b >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(c & 0xff); c >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n                SDL_CPUName[i++] = (char)(d & 0xff); d >>= 8;\n            }\n        }\n        if (!SDL_CPUName[0]) {\n            SDL_strlcpy(SDL_CPUName, \"Unknown\", sizeof(SDL_CPUName));\n        }\n    }\n    return SDL_CPUName;\n}\n#endif\n\nint\nSDL_GetCPUCacheLineSize(void)\n{\n    const char *cpuType = SDL_GetCPUType();\n    int a, b, c, d;\n    (void) a; (void) b; (void) c; (void) d;\n    if (SDL_strcmp(cpuType, \"GenuineIntel\") == 0) {\n        cpuid(0x00000001, a, b, c, d);\n        return (((b >> 8) & 0xff) * 8);\n    } else if (SDL_strcmp(cpuType, \"AuthenticAMD\") == 0) {\n        cpuid(0x80000005, a, b, c, d);\n        return (c & 0xff);\n    } else {\n        /* Just make a guess here... */\n        return SDL_CACHELINE_SIZE;\n    }\n}\n\nstatic Uint32 SDL_CPUFeatures = 0xFFFFFFFF;\n\nstatic Uint32\nSDL_GetCPUFeatures(void)\n{\n    if (SDL_CPUFeatures == 0xFFFFFFFF) {\n        SDL_CPUFeatures = 0;\n        if (CPU_haveRDTSC()) {\n            SDL_CPUFeatures |= CPU_HAS_RDTSC;\n        }\n        if (CPU_haveAltiVec()) {\n            SDL_CPUFeatures |= CPU_HAS_ALTIVEC;\n        }\n        if (CPU_haveMMX()) {\n            SDL_CPUFeatures |= CPU_HAS_MMX;\n        }\n        if (CPU_have3DNow()) {\n            SDL_CPUFeatures |= CPU_HAS_3DNOW;\n        }\n        if (CPU_haveSSE()) {\n            SDL_CPUFeatures |= CPU_HAS_SSE;\n        }\n        if (CPU_haveSSE2()) {\n            SDL_CPUFeatures |= CPU_HAS_SSE2;\n        }\n        if (CPU_haveSSE3()) {\n            SDL_CPUFeatures |= CPU_HAS_SSE3;\n        }\n        if (CPU_haveSSE41()) {\n            SDL_CPUFeatures |= CPU_HAS_SSE41;\n        }\n        if (CPU_haveSSE42()) {\n            SDL_CPUFeatures |= CPU_HAS_SSE42;\n        }\n        if (CPU_haveAVX()) {\n            SDL_CPUFeatures |= CPU_HAS_AVX;\n        }\n        if (CPU_haveAVX2()) {\n            SDL_CPUFeatures |= CPU_HAS_AVX2;\n        }\n    }\n    return SDL_CPUFeatures;\n}\n\nSDL_bool\nSDL_HasRDTSC(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_RDTSC) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_HasAltiVec(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_ALTIVEC) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_HasMMX(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_MMX) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_Has3DNow(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_3DNOW) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_HasSSE(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_SSE) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_HasSSE2(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_SSE2) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_HasSSE3(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_SSE3) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_HasSSE41(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_SSE41) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_HasSSE42(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_SSE42) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_HasAVX(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_AVX) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_HasAVX2(void)\n{\n    if (SDL_GetCPUFeatures() & CPU_HAS_AVX2) {\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\nstatic int SDL_SystemRAM = 0;\n\nint\nSDL_GetSystemRAM(void)\n{\n    if (!SDL_SystemRAM) {\n#ifndef SDL_CPUINFO_DISABLED\n#if defined(HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)\n        if (SDL_SystemRAM <= 0) {\n            SDL_SystemRAM = (int)((Sint64)sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) / (1024*1024));\n        }\n#endif\n#ifdef HAVE_SYSCTLBYNAME\n        if (SDL_SystemRAM <= 0) {\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)\n#ifdef HW_REALMEM\n            int mib[2] = {CTL_HW, HW_REALMEM};\n#else\n            /* might only report up to 2 GiB */\n            int mib[2] = {CTL_HW, HW_PHYSMEM};\n#endif /* HW_REALMEM */\n#else\n            int mib[2] = {CTL_HW, HW_MEMSIZE};\n#endif /* __FreeBSD__ || __FreeBSD_kernel__ */\n            Uint64 memsize = 0;\n            size_t len = sizeof(memsize);\n            \n            if (sysctl(mib, 2, &memsize, &len, NULL, 0) == 0) {\n                SDL_SystemRAM = (int)(memsize / (1024*1024));\n            }\n        }\n#endif\n#ifdef __WIN32__\n        if (SDL_SystemRAM <= 0) {\n            MEMORYSTATUSEX stat;\n            stat.dwLength = sizeof(stat);\n            if (GlobalMemoryStatusEx(&stat)) {\n                SDL_SystemRAM = (int)(stat.ullTotalPhys / (1024 * 1024));\n            }\n        }\n#endif\n#endif\n    }\n    return SDL_SystemRAM;\n}\n\n\n#ifdef TEST_MAIN\n\n#include <stdio.h>\n\nint\nmain()\n{\n    printf(\"CPU count: %d\\n\", SDL_GetCPUCount());\n    printf(\"CPU type: %s\\n\", SDL_GetCPUType());\n    printf(\"CPU name: %s\\n\", SDL_GetCPUName());\n    printf(\"CacheLine size: %d\\n\", SDL_GetCPUCacheLineSize());\n    printf(\"RDTSC: %d\\n\", SDL_HasRDTSC());\n    printf(\"Altivec: %d\\n\", SDL_HasAltiVec());\n    printf(\"MMX: %d\\n\", SDL_HasMMX());\n    printf(\"3DNow: %d\\n\", SDL_Has3DNow());\n    printf(\"SSE: %d\\n\", SDL_HasSSE());\n    printf(\"SSE2: %d\\n\", SDL_HasSSE2());\n    printf(\"SSE3: %d\\n\", SDL_HasSSE3());\n    printf(\"SSE4.1: %d\\n\", SDL_HasSSE41());\n    printf(\"SSE4.2: %d\\n\", SDL_HasSSE42());\n    printf(\"AVX: %d\\n\", SDL_HasAVX());\n    printf(\"AVX2: %d\\n\", SDL_HasAVX2());\n    printf(\"RAM: %d MB\\n\", SDL_GetSystemRAM());\n    return 0;\n}\n\n#endif /* TEST_MAIN */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/dynapi/SDL_dynapi.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"SDL_config.h\"\n#include \"SDL_dynapi.h\"\n\n#if SDL_DYNAMIC_API\n\n#include \"SDL.h\"\n\n/* !!! FIXME: Shouldn't these be included in SDL.h? */\n#include \"SDL_shape.h\"\n#include \"SDL_syswm.h\"\n\n/* This is the version of the dynamic API. This doesn't match the SDL version\n   and should not change until there's been a major revamp in API/ABI.\n   So 2.0.5 adds functions over 2.0.4? This number doesn't change;\n   the sizeof (jump_table) changes instead. But 2.1.0 changes how a function\n   works in an incompatible way or removes a function? This number changes,\n   since sizeof (jump_table) isn't sufficient anymore. It's likely\n   we'll forget to bump every time we add a function, so this is the\n   failsafe switch for major API change decisions. Respect it and use it\n   sparingly. */\n#define SDL_DYNAPI_VERSION 1\n\nstatic void SDL_InitDynamicAPI(void);\n\n\n/* BE CAREFUL CALLING ANY SDL CODE IN HERE, IT WILL BLOW UP.\n   Even self-contained stuff might call SDL_Error and break everything. */\n\n\n/* behold, the macro salsa! */\n\n/* !!! FIXME: ...disabled...until we write it.  :) */\n#define DISABLE_JUMP_MAGIC 1\n\n#if DISABLE_JUMP_MAGIC\n/* Can't use the macro for varargs nonsense. This is atrocious. */\n#define SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, logname, prio) \\\n    _static void SDL_Log##logname##name(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \\\n        va_list ap; initcall; va_start(ap, fmt); \\\n        jump_table.SDL_LogMessageV(category, SDL_LOG_PRIORITY_##prio, fmt, ap); \\\n        va_end(ap); \\\n    }\n\n#define SDL_DYNAPI_VARARGS(_static, name, initcall) \\\n    _static int SDL_SetError##name(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \\\n        char buf[512]; /* !!! FIXME: dynamic allocation */ \\\n        va_list ap; initcall; va_start(ap, fmt); \\\n        jump_table.SDL_vsnprintf(buf, sizeof (buf), fmt, ap); \\\n        va_end(ap); \\\n        return jump_table.SDL_SetError(\"%s\", buf); \\\n    } \\\n    _static int SDL_sscanf##name(const char *buf, SDL_SCANF_FORMAT_STRING const char *fmt, ...) { \\\n        int retval; va_list ap; initcall; va_start(ap, fmt); \\\n        retval = jump_table.SDL_vsscanf(buf, fmt, ap); \\\n        va_end(ap); \\\n        return retval; \\\n    } \\\n    _static int SDL_snprintf##name(SDL_OUT_Z_CAP(maxlen) char *buf, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \\\n        int retval; va_list ap; initcall; va_start(ap, fmt); \\\n        retval = jump_table.SDL_vsnprintf(buf, maxlen, fmt, ap); \\\n        va_end(ap); \\\n        return retval; \\\n    } \\\n    _static void SDL_Log##name(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \\\n        va_list ap; initcall; va_start(ap, fmt); \\\n        jump_table.SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, fmt, ap); \\\n        va_end(ap); \\\n    } \\\n    _static void SDL_LogMessage##name(int category, SDL_LogPriority priority, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \\\n        va_list ap; initcall; va_start(ap, fmt); \\\n        jump_table.SDL_LogMessageV(category, priority, fmt, ap); \\\n        va_end(ap); \\\n    } \\\n    SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Verbose, VERBOSE) \\\n    SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Debug, DEBUG) \\\n    SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Info, INFO) \\\n    SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Warn, WARN) \\\n    SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Error, ERROR) \\\n    SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Critical, CRITICAL)\n#endif\n\n\n/* Typedefs for function pointers for jump table, and predeclare funcs */\n/* The DEFAULT funcs will init jump table and then call real function. */\n/* The REAL funcs are the actual functions, name-mangled to not clash. */\n#define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \\\n    typedef rc (*SDL_DYNAPIFN_##fn) params; \\\n    static rc fn##_DEFAULT params; \\\n    extern rc fn##_REAL params;\n#include \"SDL_dynapi_procs.h\"\n#undef SDL_DYNAPI_PROC\n\n/* The jump table! */\ntypedef struct {\n    #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) SDL_DYNAPIFN_##fn fn;\n    #include \"SDL_dynapi_procs.h\"\n    #undef SDL_DYNAPI_PROC\n} SDL_DYNAPI_jump_table;\n\n/* Predeclare the default functions for initializing the jump table. */\n#define SDL_DYNAPI_PROC(rc,fn,params,args,ret) static rc fn##_DEFAULT params;\n#include \"SDL_dynapi_procs.h\"\n#undef SDL_DYNAPI_PROC\n\n/* The actual jump table. */\nstatic SDL_DYNAPI_jump_table jump_table = {\n    #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) fn##_DEFAULT,\n    #include \"SDL_dynapi_procs.h\"\n    #undef SDL_DYNAPI_PROC\n};\n\n/* Default functions init the function table then call right thing. */\n#if DISABLE_JUMP_MAGIC\n#define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \\\n    static rc fn##_DEFAULT params { \\\n        SDL_InitDynamicAPI(); \\\n        ret jump_table.fn args; \\\n    }\n#define SDL_DYNAPI_PROC_NO_VARARGS 1\n#include \"SDL_dynapi_procs.h\"\n#undef SDL_DYNAPI_PROC\n#undef SDL_DYNAPI_PROC_NO_VARARGS\nSDL_DYNAPI_VARARGS(static, _DEFAULT, SDL_InitDynamicAPI())\n#else\n/* !!! FIXME: need the jump magic. */\n#error Write me.\n#endif\n\n/* Public API functions to jump into the jump table. */\n#if DISABLE_JUMP_MAGIC\n#define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \\\n    rc fn params { ret jump_table.fn args; }\n#define SDL_DYNAPI_PROC_NO_VARARGS 1\n#include \"SDL_dynapi_procs.h\"\n#undef SDL_DYNAPI_PROC\n#undef SDL_DYNAPI_PROC_NO_VARARGS\nSDL_DYNAPI_VARARGS(,,)\n#else\n/* !!! FIXME: need the jump magic. */\n#error Write me.\n#endif\n\n\n\n/* Here's the exported entry point that fills in the jump table. */\n/*  Use specific types when an \"int\" might suffice to keep this sane. */\ntypedef Sint32 (SDLCALL *SDL_DYNAPI_ENTRYFN)(Uint32 apiver, void *table, Uint32 tablesize);\nextern DECLSPEC Sint32 SDLCALL SDL_DYNAPI_entry(Uint32, void *, Uint32);\n\nSint32\nSDL_DYNAPI_entry(Uint32 apiver, void *table, Uint32 tablesize)\n{\n    SDL_DYNAPI_jump_table *output_jump_table = (SDL_DYNAPI_jump_table *) table;\n\n    if (apiver != SDL_DYNAPI_VERSION) {\n        /* !!! FIXME: can maybe handle older versions? */\n        return -1;  /* not compatible. */\n    } else if (tablesize > sizeof (jump_table)) {\n        return -1;  /* newer version of SDL with functions we can't provide. */\n    }\n\n    /* Init our jump table first. */\n    #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) jump_table.fn = fn##_REAL;\n    #include \"SDL_dynapi_procs.h\"\n    #undef SDL_DYNAPI_PROC\n\n    /* Then the external table... */\n    if (output_jump_table != &jump_table) {\n        jump_table.SDL_memcpy(output_jump_table, &jump_table, tablesize);\n    }\n\n    /* Safe to call SDL functions now; jump table is initialized! */\n\n    return 0;  /* success! */\n}\n\n\n/* Obviously we can't use SDL_LoadObject() to load SDL.  :)  */\n/* Also obviously, we never close the loaded library. */\n#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__)\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN 1\n#endif\n#include <windows.h>\nstatic SDL_INLINE void *get_sdlapi_entry(const char *fname, const char *sym)\n{\n    HANDLE lib = LoadLibraryA(fname);\n    void *retval = NULL;\n    if (lib) {\n        retval = GetProcAddress(lib, sym);\n        if (retval == NULL) {\n            FreeLibrary(lib);\n        }\n    }\n    return retval;\n}\n\n#elif defined(__HAIKU__)\n#include <os/kernel/image.h>\nstatic SDL_INLINE void *get_sdlapi_entry(const char *fname, const char *sym)\n{\n    image_id lib = load_add_on(fname);\n    void *retval = NULL;\n    if (lib >= 0) {\n        if (get_image_symbol(lib, sym, B_SYMBOL_TYPE_TEXT, &retval) != B_NO_ERROR) {\n            unload_add_on(lib);\n            retval = NULL;\n        }\n    }\n    return retval;\n}\n#elif defined(unix) || defined(__unix__) || defined(__APPLE__)\n#include <dlfcn.h>\nstatic SDL_INLINE void *get_sdlapi_entry(const char *fname, const char *sym)\n{\n    void *lib = dlopen(fname, RTLD_NOW | RTLD_LOCAL);\n    void *retval = NULL;\n    if (lib != NULL) {\n        retval = dlsym(lib, sym);\n        if (retval == NULL) {\n            dlclose(lib);\n        }\n    }\n    return retval;\n}\n#else\n#error Please define your platform.\n#endif\n\n\nstatic void\nSDL_InitDynamicAPILocked(void)\n{\n    const char *libname = SDL_getenv_REAL(\"SDL_DYNAMIC_API\");\n    SDL_DYNAPI_ENTRYFN entry = SDL_DYNAPI_entry;  /* funcs from here by default. */\n\n    if (libname) {\n        entry = (SDL_DYNAPI_ENTRYFN) get_sdlapi_entry(libname, \"SDL_DYNAPI_entry\");\n        if (!entry) {\n            /* !!! FIXME: fail to startup here instead? */\n            /* !!! FIXME: definitely warn user. */\n            /* Just fill in the function pointers from this library. */\n            entry = SDL_DYNAPI_entry;\n        }\n    }\n\n    if (entry(SDL_DYNAPI_VERSION, &jump_table, sizeof (jump_table)) < 0) {\n        /* !!! FIXME: fail to startup here instead? */\n        /* !!! FIXME: definitely warn user. */\n        /* Just fill in the function pointers from this library. */\n        if (entry != SDL_DYNAPI_entry) {\n            if (!SDL_DYNAPI_entry(SDL_DYNAPI_VERSION, &jump_table, sizeof (jump_table))) {\n                /* !!! FIXME: now we're screwed. Should definitely abort now. */\n            }\n        }\n    }\n\n    /* we intentionally never close the newly-loaded lib, of course. */\n}\n\nstatic void\nSDL_InitDynamicAPI(void)\n{\n    /* So the theory is that every function in the jump table defaults to\n     *  calling this function, and then replaces itself with a version that\n     *  doesn't call this function anymore. But it's possible that, in an\n     *  extreme corner case, you can have a second thread hit this function\n     *  while the jump table is being initialized by the first.\n     * In this case, a spinlock is really painful compared to what spinlocks\n     *  _should_ be used for, but this would only happen once, and should be\n     *  insanely rare, as you would have to spin a thread outside of SDL (as\n     *  SDL_CreateThread() would also call this function before building the\n     *  new thread).\n     */\n    static SDL_bool already_initialized = SDL_FALSE;\n\n    /* SDL_AtomicLock calls SDL mutex functions to emulate if\n       SDL_ATOMIC_DISABLED, which we can't do here, so in such a\n       configuration, you're on your own. */\n    #if !SDL_ATOMIC_DISABLED\n    static SDL_SpinLock lock = 0;\n    SDL_AtomicLock_REAL(&lock);\n    #endif\n\n    if (!already_initialized) {\n        SDL_InitDynamicAPILocked();\n        already_initialized = SDL_TRUE;\n    }\n\n    #if !SDL_ATOMIC_DISABLED\n    SDL_AtomicUnlock_REAL(&lock);\n    #endif\n}\n\n#endif  /* SDL_DYNAMIC_API */\n\n/* vi: set ts=4 sw=4 expandtab: */\n\n"
  },
  {
    "path": "libs/SDL2/src/dynapi/SDL_dynapi.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_dynapi_h\n#define _SDL_dynapi_h\n\n/* IMPORTANT:\n   This is the master switch to disabling the dynamic API. We made it so you\n   have to hand-edit an internal source file in SDL to turn it off; you\n   can do it if you want it badly enough, but hopefully you won't want to.\n   You should understand the ramifications of turning this off: it makes it\n   hard to update your SDL in the field, and impossible if you've statically\n   linked SDL into your app. Understand that platforms change, and if we can't\n   drop in an updated SDL, your application can definitely break some time\n   in the future, even if it's fine today.\n   To be sure, as new system-level video and audio APIs are introduced, an\n   updated SDL can transparently take advantage of them, but your program will\n   not without this feature. Think hard before turning it off.\n*/\n#ifdef SDL_DYNAMIC_API  /* Tried to force it on the command line? */\n#error Nope, you have to edit this file to force this off.\n#endif\n\n#ifdef __APPLE__\n#include \"TargetConditionals.h\"\n#endif\n\n#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE  /* probably not useful on iOS. */\n#define SDL_DYNAMIC_API 0\n#elif defined(__native_client__) && __native_client__  /* probably not useful on NACL. */\n#define SDL_DYNAMIC_API 0\n#elif defined(__EMSCRIPTEN__) && __EMSCRIPTEN__  /* probably not useful on Emscripten. */\n#define SDL_DYNAMIC_API 0\n#elif defined(SDL_BUILDING_WINRT) && SDL_BUILDING_WINRT  /* probably not useful on WinRT, given current .dll loading restrictions */\n#define SDL_DYNAMIC_API 0\n#elif defined(__PSP__) && __PSP__\n#define SDL_DYNAMIC_API 0\n#elif defined(__clang_analyzer__)\n#define SDL_DYNAMIC_API 0  /* Turn off for static analysis, so reports are more clear. */\n#endif\n\n/* everyone else. This is where we turn on the API if nothing forced it off. */\n#ifndef SDL_DYNAMIC_API\n#define SDL_DYNAMIC_API 1\n#endif\n\n#endif\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/dynapi/SDL_dynapi_overrides.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* vi: set ts=4 sw=4 expandtab: */\n\n/* DO NOT EDIT THIS FILE BY HAND. It is autogenerated by gendynapi.pl. */\n\n#if !SDL_DYNAMIC_API\n#error You should not be here.\n#endif\n\n/* so annoying. */\n#if defined(__thumb__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__))\n#define SDL_MemoryBarrierRelease SDL_MemoryBarrierRelease_REAL\n#define SDL_MemoryBarrierAcquire SDL_MemoryBarrierAcquire_REAL\n#endif\n\n#define SDL_SetError SDL_SetError_REAL\n#define SDL_Log SDL_Log_REAL\n#define SDL_LogVerbose SDL_LogVerbose_REAL\n#define SDL_LogDebug SDL_LogDebug_REAL\n#define SDL_LogInfo SDL_LogInfo_REAL\n#define SDL_LogWarn SDL_LogWarn_REAL\n#define SDL_LogError SDL_LogError_REAL\n#define SDL_LogCritical SDL_LogCritical_REAL\n#define SDL_LogMessage SDL_LogMessage_REAL\n#define SDL_sscanf SDL_sscanf_REAL\n#define SDL_snprintf SDL_snprintf_REAL\n#define SDL_CreateThread SDL_CreateThread_REAL\n#define SDL_RWFromFP SDL_RWFromFP_REAL\n#define SDL_RegisterApp SDL_RegisterApp_REAL\n#define SDL_UnregisterApp SDL_UnregisterApp_REAL\n#define SDL_Direct3D9GetAdapterIndex SDL_Direct3D9GetAdapterIndex_REAL\n#define SDL_RenderGetD3D9Device SDL_RenderGetD3D9Device_REAL\n#define SDL_iPhoneSetAnimationCallback SDL_iPhoneSetAnimationCallback_REAL\n#define SDL_iPhoneSetEventPump SDL_iPhoneSetEventPump_REAL\n#define SDL_AndroidGetJNIEnv SDL_AndroidGetJNIEnv_REAL\n#define SDL_AndroidGetActivity SDL_AndroidGetActivity_REAL\n#define SDL_AndroidGetInternalStoragePath SDL_AndroidGetInternalStoragePath_REAL\n#define SDL_AndroidGetExternalStorageState SDL_AndroidGetExternalStorageState_REAL\n#define SDL_AndroidGetExternalStoragePath SDL_AndroidGetExternalStoragePath_REAL\n#define SDL_Init SDL_Init_REAL\n#define SDL_InitSubSystem SDL_InitSubSystem_REAL\n#define SDL_QuitSubSystem SDL_QuitSubSystem_REAL\n#define SDL_WasInit SDL_WasInit_REAL\n#define SDL_Quit SDL_Quit_REAL\n#define SDL_ReportAssertion SDL_ReportAssertion_REAL\n#define SDL_SetAssertionHandler SDL_SetAssertionHandler_REAL\n#define SDL_GetAssertionReport SDL_GetAssertionReport_REAL\n#define SDL_ResetAssertionReport SDL_ResetAssertionReport_REAL\n#define SDL_AtomicTryLock SDL_AtomicTryLock_REAL\n#define SDL_AtomicLock SDL_AtomicLock_REAL\n#define SDL_AtomicUnlock SDL_AtomicUnlock_REAL\n#define SDL_AtomicCAS SDL_AtomicCAS_REAL\n#define SDL_AtomicSet SDL_AtomicSet_REAL\n#define SDL_AtomicGet SDL_AtomicGet_REAL\n#define SDL_AtomicAdd SDL_AtomicAdd_REAL\n#define SDL_AtomicCASPtr SDL_AtomicCASPtr_REAL\n#define SDL_AtomicSetPtr SDL_AtomicSetPtr_REAL\n#define SDL_AtomicGetPtr SDL_AtomicGetPtr_REAL\n#define SDL_GetNumAudioDrivers SDL_GetNumAudioDrivers_REAL\n#define SDL_GetAudioDriver SDL_GetAudioDriver_REAL\n#define SDL_AudioInit SDL_AudioInit_REAL\n#define SDL_AudioQuit SDL_AudioQuit_REAL\n#define SDL_GetCurrentAudioDriver SDL_GetCurrentAudioDriver_REAL\n#define SDL_OpenAudio SDL_OpenAudio_REAL\n#define SDL_GetNumAudioDevices SDL_GetNumAudioDevices_REAL\n#define SDL_GetAudioDeviceName SDL_GetAudioDeviceName_REAL\n#define SDL_OpenAudioDevice SDL_OpenAudioDevice_REAL\n#define SDL_GetAudioStatus SDL_GetAudioStatus_REAL\n#define SDL_GetAudioDeviceStatus SDL_GetAudioDeviceStatus_REAL\n#define SDL_PauseAudio SDL_PauseAudio_REAL\n#define SDL_PauseAudioDevice SDL_PauseAudioDevice_REAL\n#define SDL_LoadWAV_RW SDL_LoadWAV_RW_REAL\n#define SDL_FreeWAV SDL_FreeWAV_REAL\n#define SDL_BuildAudioCVT SDL_BuildAudioCVT_REAL\n#define SDL_ConvertAudio SDL_ConvertAudio_REAL\n#define SDL_MixAudio SDL_MixAudio_REAL\n#define SDL_MixAudioFormat SDL_MixAudioFormat_REAL\n#define SDL_LockAudio SDL_LockAudio_REAL\n#define SDL_LockAudioDevice SDL_LockAudioDevice_REAL\n#define SDL_UnlockAudio SDL_UnlockAudio_REAL\n#define SDL_UnlockAudioDevice SDL_UnlockAudioDevice_REAL\n#define SDL_CloseAudio SDL_CloseAudio_REAL\n#define SDL_CloseAudioDevice SDL_CloseAudioDevice_REAL\n#define SDL_SetClipboardText SDL_SetClipboardText_REAL\n#define SDL_GetClipboardText SDL_GetClipboardText_REAL\n#define SDL_HasClipboardText SDL_HasClipboardText_REAL\n#define SDL_GetCPUCount SDL_GetCPUCount_REAL\n#define SDL_GetCPUCacheLineSize SDL_GetCPUCacheLineSize_REAL\n#define SDL_HasRDTSC SDL_HasRDTSC_REAL\n#define SDL_HasAltiVec SDL_HasAltiVec_REAL\n#define SDL_HasMMX SDL_HasMMX_REAL\n#define SDL_Has3DNow SDL_Has3DNow_REAL\n#define SDL_HasSSE SDL_HasSSE_REAL\n#define SDL_HasSSE2 SDL_HasSSE2_REAL\n#define SDL_HasSSE3 SDL_HasSSE3_REAL\n#define SDL_HasSSE41 SDL_HasSSE41_REAL\n#define SDL_HasSSE42 SDL_HasSSE42_REAL\n#define SDL_GetSystemRAM SDL_GetSystemRAM_REAL\n#define SDL_GetError SDL_GetError_REAL\n#define SDL_ClearError SDL_ClearError_REAL\n#define SDL_Error SDL_Error_REAL\n#define SDL_PumpEvents SDL_PumpEvents_REAL\n#define SDL_PeepEvents SDL_PeepEvents_REAL\n#define SDL_HasEvent SDL_HasEvent_REAL\n#define SDL_HasEvents SDL_HasEvents_REAL\n#define SDL_FlushEvent SDL_FlushEvent_REAL\n#define SDL_FlushEvents SDL_FlushEvents_REAL\n#define SDL_PollEvent SDL_PollEvent_REAL\n#define SDL_WaitEvent SDL_WaitEvent_REAL\n#define SDL_WaitEventTimeout SDL_WaitEventTimeout_REAL\n#define SDL_PushEvent SDL_PushEvent_REAL\n#define SDL_SetEventFilter SDL_SetEventFilter_REAL\n#define SDL_GetEventFilter SDL_GetEventFilter_REAL\n#define SDL_AddEventWatch SDL_AddEventWatch_REAL\n#define SDL_DelEventWatch SDL_DelEventWatch_REAL\n#define SDL_FilterEvents SDL_FilterEvents_REAL\n#define SDL_EventState SDL_EventState_REAL\n#define SDL_RegisterEvents SDL_RegisterEvents_REAL\n#define SDL_GetBasePath SDL_GetBasePath_REAL\n#define SDL_GetPrefPath SDL_GetPrefPath_REAL\n#define SDL_GameControllerAddMapping SDL_GameControllerAddMapping_REAL\n#define SDL_GameControllerMappingForGUID SDL_GameControllerMappingForGUID_REAL\n#define SDL_GameControllerMapping SDL_GameControllerMapping_REAL\n#define SDL_IsGameController SDL_IsGameController_REAL\n#define SDL_GameControllerNameForIndex SDL_GameControllerNameForIndex_REAL\n#define SDL_GameControllerOpen SDL_GameControllerOpen_REAL\n#define SDL_GameControllerName SDL_GameControllerName_REAL\n#define SDL_GameControllerGetAttached SDL_GameControllerGetAttached_REAL\n#define SDL_GameControllerGetJoystick SDL_GameControllerGetJoystick_REAL\n#define SDL_GameControllerEventState SDL_GameControllerEventState_REAL\n#define SDL_GameControllerUpdate SDL_GameControllerUpdate_REAL\n#define SDL_GameControllerGetAxisFromString SDL_GameControllerGetAxisFromString_REAL\n#define SDL_GameControllerGetStringForAxis SDL_GameControllerGetStringForAxis_REAL\n#define SDL_GameControllerGetBindForAxis SDL_GameControllerGetBindForAxis_REAL\n#define SDL_GameControllerGetAxis SDL_GameControllerGetAxis_REAL\n#define SDL_GameControllerGetButtonFromString SDL_GameControllerGetButtonFromString_REAL\n#define SDL_GameControllerGetStringForButton SDL_GameControllerGetStringForButton_REAL\n#define SDL_GameControllerGetBindForButton SDL_GameControllerGetBindForButton_REAL\n#define SDL_GameControllerGetButton SDL_GameControllerGetButton_REAL\n#define SDL_GameControllerClose SDL_GameControllerClose_REAL\n#define SDL_RecordGesture SDL_RecordGesture_REAL\n#define SDL_SaveAllDollarTemplates SDL_SaveAllDollarTemplates_REAL\n#define SDL_SaveDollarTemplate SDL_SaveDollarTemplate_REAL\n#define SDL_LoadDollarTemplates SDL_LoadDollarTemplates_REAL\n#define SDL_NumHaptics SDL_NumHaptics_REAL\n#define SDL_HapticName SDL_HapticName_REAL\n#define SDL_HapticOpen SDL_HapticOpen_REAL\n#define SDL_HapticOpened SDL_HapticOpened_REAL\n#define SDL_HapticIndex SDL_HapticIndex_REAL\n#define SDL_MouseIsHaptic SDL_MouseIsHaptic_REAL\n#define SDL_HapticOpenFromMouse SDL_HapticOpenFromMouse_REAL\n#define SDL_JoystickIsHaptic SDL_JoystickIsHaptic_REAL\n#define SDL_HapticOpenFromJoystick SDL_HapticOpenFromJoystick_REAL\n#define SDL_HapticClose SDL_HapticClose_REAL\n#define SDL_HapticNumEffects SDL_HapticNumEffects_REAL\n#define SDL_HapticNumEffectsPlaying SDL_HapticNumEffectsPlaying_REAL\n#define SDL_HapticQuery SDL_HapticQuery_REAL\n#define SDL_HapticNumAxes SDL_HapticNumAxes_REAL\n#define SDL_HapticEffectSupported SDL_HapticEffectSupported_REAL\n#define SDL_HapticNewEffect SDL_HapticNewEffect_REAL\n#define SDL_HapticUpdateEffect SDL_HapticUpdateEffect_REAL\n#define SDL_HapticRunEffect SDL_HapticRunEffect_REAL\n#define SDL_HapticStopEffect SDL_HapticStopEffect_REAL\n#define SDL_HapticDestroyEffect SDL_HapticDestroyEffect_REAL\n#define SDL_HapticGetEffectStatus SDL_HapticGetEffectStatus_REAL\n#define SDL_HapticSetGain SDL_HapticSetGain_REAL\n#define SDL_HapticSetAutocenter SDL_HapticSetAutocenter_REAL\n#define SDL_HapticPause SDL_HapticPause_REAL\n#define SDL_HapticUnpause SDL_HapticUnpause_REAL\n#define SDL_HapticStopAll SDL_HapticStopAll_REAL\n#define SDL_HapticRumbleSupported SDL_HapticRumbleSupported_REAL\n#define SDL_HapticRumbleInit SDL_HapticRumbleInit_REAL\n#define SDL_HapticRumblePlay SDL_HapticRumblePlay_REAL\n#define SDL_HapticRumbleStop SDL_HapticRumbleStop_REAL\n#define SDL_SetHintWithPriority SDL_SetHintWithPriority_REAL\n#define SDL_SetHint SDL_SetHint_REAL\n#define SDL_GetHint SDL_GetHint_REAL\n#define SDL_AddHintCallback SDL_AddHintCallback_REAL\n#define SDL_DelHintCallback SDL_DelHintCallback_REAL\n#define SDL_ClearHints SDL_ClearHints_REAL\n#define SDL_NumJoysticks SDL_NumJoysticks_REAL\n#define SDL_JoystickNameForIndex SDL_JoystickNameForIndex_REAL\n#define SDL_JoystickOpen SDL_JoystickOpen_REAL\n#define SDL_JoystickName SDL_JoystickName_REAL\n#define SDL_JoystickGetDeviceGUID SDL_JoystickGetDeviceGUID_REAL\n#define SDL_JoystickGetGUID SDL_JoystickGetGUID_REAL\n#define SDL_JoystickGetGUIDString SDL_JoystickGetGUIDString_REAL\n#define SDL_JoystickGetGUIDFromString SDL_JoystickGetGUIDFromString_REAL\n#define SDL_JoystickGetAttached SDL_JoystickGetAttached_REAL\n#define SDL_JoystickInstanceID SDL_JoystickInstanceID_REAL\n#define SDL_JoystickNumAxes SDL_JoystickNumAxes_REAL\n#define SDL_JoystickNumBalls SDL_JoystickNumBalls_REAL\n#define SDL_JoystickNumHats SDL_JoystickNumHats_REAL\n#define SDL_JoystickNumButtons SDL_JoystickNumButtons_REAL\n#define SDL_JoystickUpdate SDL_JoystickUpdate_REAL\n#define SDL_JoystickEventState SDL_JoystickEventState_REAL\n#define SDL_JoystickGetAxis SDL_JoystickGetAxis_REAL\n#define SDL_JoystickGetHat SDL_JoystickGetHat_REAL\n#define SDL_JoystickGetBall SDL_JoystickGetBall_REAL\n#define SDL_JoystickGetButton SDL_JoystickGetButton_REAL\n#define SDL_JoystickClose SDL_JoystickClose_REAL\n#define SDL_GetKeyboardFocus SDL_GetKeyboardFocus_REAL\n#define SDL_GetKeyboardState SDL_GetKeyboardState_REAL\n#define SDL_GetModState SDL_GetModState_REAL\n#define SDL_SetModState SDL_SetModState_REAL\n#define SDL_GetKeyFromScancode SDL_GetKeyFromScancode_REAL\n#define SDL_GetScancodeFromKey SDL_GetScancodeFromKey_REAL\n#define SDL_GetScancodeName SDL_GetScancodeName_REAL\n#define SDL_GetScancodeFromName SDL_GetScancodeFromName_REAL\n#define SDL_GetKeyName SDL_GetKeyName_REAL\n#define SDL_GetKeyFromName SDL_GetKeyFromName_REAL\n#define SDL_StartTextInput SDL_StartTextInput_REAL\n#define SDL_IsTextInputActive SDL_IsTextInputActive_REAL\n#define SDL_StopTextInput SDL_StopTextInput_REAL\n#define SDL_SetTextInputRect SDL_SetTextInputRect_REAL\n#define SDL_HasScreenKeyboardSupport SDL_HasScreenKeyboardSupport_REAL\n#define SDL_IsScreenKeyboardShown SDL_IsScreenKeyboardShown_REAL\n#define SDL_LoadObject SDL_LoadObject_REAL\n#define SDL_LoadFunction SDL_LoadFunction_REAL\n#define SDL_UnloadObject SDL_UnloadObject_REAL\n#define SDL_LogSetAllPriority SDL_LogSetAllPriority_REAL\n#define SDL_LogSetPriority SDL_LogSetPriority_REAL\n#define SDL_LogGetPriority SDL_LogGetPriority_REAL\n#define SDL_LogResetPriorities SDL_LogResetPriorities_REAL\n#define SDL_LogMessageV SDL_LogMessageV_REAL\n#define SDL_LogGetOutputFunction SDL_LogGetOutputFunction_REAL\n#define SDL_LogSetOutputFunction SDL_LogSetOutputFunction_REAL\n#define SDL_SetMainReady SDL_SetMainReady_REAL\n#define SDL_ShowMessageBox SDL_ShowMessageBox_REAL\n#define SDL_ShowSimpleMessageBox SDL_ShowSimpleMessageBox_REAL\n#define SDL_GetMouseFocus SDL_GetMouseFocus_REAL\n#define SDL_GetMouseState SDL_GetMouseState_REAL\n#define SDL_GetRelativeMouseState SDL_GetRelativeMouseState_REAL\n#define SDL_WarpMouseInWindow SDL_WarpMouseInWindow_REAL\n#define SDL_SetRelativeMouseMode SDL_SetRelativeMouseMode_REAL\n#define SDL_GetRelativeMouseMode SDL_GetRelativeMouseMode_REAL\n#define SDL_CreateCursor SDL_CreateCursor_REAL\n#define SDL_CreateColorCursor SDL_CreateColorCursor_REAL\n#define SDL_CreateSystemCursor SDL_CreateSystemCursor_REAL\n#define SDL_SetCursor SDL_SetCursor_REAL\n#define SDL_GetCursor SDL_GetCursor_REAL\n#define SDL_GetDefaultCursor SDL_GetDefaultCursor_REAL\n#define SDL_FreeCursor SDL_FreeCursor_REAL\n#define SDL_ShowCursor SDL_ShowCursor_REAL\n#define SDL_CreateMutex SDL_CreateMutex_REAL\n#define SDL_LockMutex SDL_LockMutex_REAL\n#define SDL_TryLockMutex SDL_TryLockMutex_REAL\n#define SDL_UnlockMutex SDL_UnlockMutex_REAL\n#define SDL_DestroyMutex SDL_DestroyMutex_REAL\n#define SDL_CreateSemaphore SDL_CreateSemaphore_REAL\n#define SDL_DestroySemaphore SDL_DestroySemaphore_REAL\n#define SDL_SemWait SDL_SemWait_REAL\n#define SDL_SemTryWait SDL_SemTryWait_REAL\n#define SDL_SemWaitTimeout SDL_SemWaitTimeout_REAL\n#define SDL_SemPost SDL_SemPost_REAL\n#define SDL_SemValue SDL_SemValue_REAL\n#define SDL_CreateCond SDL_CreateCond_REAL\n#define SDL_DestroyCond SDL_DestroyCond_REAL\n#define SDL_CondSignal SDL_CondSignal_REAL\n#define SDL_CondBroadcast SDL_CondBroadcast_REAL\n#define SDL_CondWait SDL_CondWait_REAL\n#define SDL_CondWaitTimeout SDL_CondWaitTimeout_REAL\n#define SDL_GetPixelFormatName SDL_GetPixelFormatName_REAL\n#define SDL_PixelFormatEnumToMasks SDL_PixelFormatEnumToMasks_REAL\n#define SDL_MasksToPixelFormatEnum SDL_MasksToPixelFormatEnum_REAL\n#define SDL_AllocFormat SDL_AllocFormat_REAL\n#define SDL_FreeFormat SDL_FreeFormat_REAL\n#define SDL_AllocPalette SDL_AllocPalette_REAL\n#define SDL_SetPixelFormatPalette SDL_SetPixelFormatPalette_REAL\n#define SDL_SetPaletteColors SDL_SetPaletteColors_REAL\n#define SDL_FreePalette SDL_FreePalette_REAL\n#define SDL_MapRGB SDL_MapRGB_REAL\n#define SDL_MapRGBA SDL_MapRGBA_REAL\n#define SDL_GetRGB SDL_GetRGB_REAL\n#define SDL_GetRGBA SDL_GetRGBA_REAL\n#define SDL_CalculateGammaRamp SDL_CalculateGammaRamp_REAL\n#define SDL_GetPlatform SDL_GetPlatform_REAL\n#define SDL_GetPowerInfo SDL_GetPowerInfo_REAL\n#define SDL_HasIntersection SDL_HasIntersection_REAL\n#define SDL_IntersectRect SDL_IntersectRect_REAL\n#define SDL_UnionRect SDL_UnionRect_REAL\n#define SDL_EnclosePoints SDL_EnclosePoints_REAL\n#define SDL_IntersectRectAndLine SDL_IntersectRectAndLine_REAL\n#define SDL_GetNumRenderDrivers SDL_GetNumRenderDrivers_REAL\n#define SDL_GetRenderDriverInfo SDL_GetRenderDriverInfo_REAL\n#define SDL_CreateWindowAndRenderer SDL_CreateWindowAndRenderer_REAL\n#define SDL_CreateRenderer SDL_CreateRenderer_REAL\n#define SDL_CreateSoftwareRenderer SDL_CreateSoftwareRenderer_REAL\n#define SDL_GetRenderer SDL_GetRenderer_REAL\n#define SDL_GetRendererInfo SDL_GetRendererInfo_REAL\n#define SDL_GetRendererOutputSize SDL_GetRendererOutputSize_REAL\n#define SDL_CreateTexture SDL_CreateTexture_REAL\n#define SDL_CreateTextureFromSurface SDL_CreateTextureFromSurface_REAL\n#define SDL_QueryTexture SDL_QueryTexture_REAL\n#define SDL_SetTextureColorMod SDL_SetTextureColorMod_REAL\n#define SDL_GetTextureColorMod SDL_GetTextureColorMod_REAL\n#define SDL_SetTextureAlphaMod SDL_SetTextureAlphaMod_REAL\n#define SDL_GetTextureAlphaMod SDL_GetTextureAlphaMod_REAL\n#define SDL_SetTextureBlendMode SDL_SetTextureBlendMode_REAL\n#define SDL_GetTextureBlendMode SDL_GetTextureBlendMode_REAL\n#define SDL_UpdateTexture SDL_UpdateTexture_REAL\n#define SDL_UpdateYUVTexture SDL_UpdateYUVTexture_REAL\n#define SDL_LockTexture SDL_LockTexture_REAL\n#define SDL_UnlockTexture SDL_UnlockTexture_REAL\n#define SDL_RenderTargetSupported SDL_RenderTargetSupported_REAL\n#define SDL_SetRenderTarget SDL_SetRenderTarget_REAL\n#define SDL_GetRenderTarget SDL_GetRenderTarget_REAL\n#define SDL_RenderSetLogicalSize SDL_RenderSetLogicalSize_REAL\n#define SDL_RenderGetLogicalSize SDL_RenderGetLogicalSize_REAL\n#define SDL_RenderSetViewport SDL_RenderSetViewport_REAL\n#define SDL_RenderGetViewport SDL_RenderGetViewport_REAL\n#define SDL_RenderSetClipRect SDL_RenderSetClipRect_REAL\n#define SDL_RenderGetClipRect SDL_RenderGetClipRect_REAL\n#define SDL_RenderSetScale SDL_RenderSetScale_REAL\n#define SDL_RenderGetScale SDL_RenderGetScale_REAL\n#define SDL_SetRenderDrawColor SDL_SetRenderDrawColor_REAL\n#define SDL_GetRenderDrawColor SDL_GetRenderDrawColor_REAL\n#define SDL_SetRenderDrawBlendMode SDL_SetRenderDrawBlendMode_REAL\n#define SDL_GetRenderDrawBlendMode SDL_GetRenderDrawBlendMode_REAL\n#define SDL_RenderClear SDL_RenderClear_REAL\n#define SDL_RenderDrawPoint SDL_RenderDrawPoint_REAL\n#define SDL_RenderDrawPoints SDL_RenderDrawPoints_REAL\n#define SDL_RenderDrawLine SDL_RenderDrawLine_REAL\n#define SDL_RenderDrawLines SDL_RenderDrawLines_REAL\n#define SDL_RenderDrawRect SDL_RenderDrawRect_REAL\n#define SDL_RenderDrawRects SDL_RenderDrawRects_REAL\n#define SDL_RenderFillRect SDL_RenderFillRect_REAL\n#define SDL_RenderFillRects SDL_RenderFillRects_REAL\n#define SDL_RenderCopy SDL_RenderCopy_REAL\n#define SDL_RenderCopyEx SDL_RenderCopyEx_REAL\n#define SDL_RenderReadPixels SDL_RenderReadPixels_REAL\n#define SDL_RenderPresent SDL_RenderPresent_REAL\n#define SDL_DestroyTexture SDL_DestroyTexture_REAL\n#define SDL_DestroyRenderer SDL_DestroyRenderer_REAL\n#define SDL_GL_BindTexture SDL_GL_BindTexture_REAL\n#define SDL_GL_UnbindTexture SDL_GL_UnbindTexture_REAL\n#define SDL_RWFromFile SDL_RWFromFile_REAL\n#define SDL_RWFromMem SDL_RWFromMem_REAL\n#define SDL_RWFromConstMem SDL_RWFromConstMem_REAL\n#define SDL_AllocRW SDL_AllocRW_REAL\n#define SDL_FreeRW SDL_FreeRW_REAL\n#define SDL_ReadU8 SDL_ReadU8_REAL\n#define SDL_ReadLE16 SDL_ReadLE16_REAL\n#define SDL_ReadBE16 SDL_ReadBE16_REAL\n#define SDL_ReadLE32 SDL_ReadLE32_REAL\n#define SDL_ReadBE32 SDL_ReadBE32_REAL\n#define SDL_ReadLE64 SDL_ReadLE64_REAL\n#define SDL_ReadBE64 SDL_ReadBE64_REAL\n#define SDL_WriteU8 SDL_WriteU8_REAL\n#define SDL_WriteLE16 SDL_WriteLE16_REAL\n#define SDL_WriteBE16 SDL_WriteBE16_REAL\n#define SDL_WriteLE32 SDL_WriteLE32_REAL\n#define SDL_WriteBE32 SDL_WriteBE32_REAL\n#define SDL_WriteLE64 SDL_WriteLE64_REAL\n#define SDL_WriteBE64 SDL_WriteBE64_REAL\n#define SDL_CreateShapedWindow SDL_CreateShapedWindow_REAL\n#define SDL_IsShapedWindow SDL_IsShapedWindow_REAL\n#define SDL_SetWindowShape SDL_SetWindowShape_REAL\n#define SDL_GetShapedWindowMode SDL_GetShapedWindowMode_REAL\n#define SDL_malloc SDL_malloc_REAL\n#define SDL_calloc SDL_calloc_REAL\n#define SDL_realloc SDL_realloc_REAL\n#define SDL_free SDL_free_REAL\n#define SDL_getenv SDL_getenv_REAL\n#define SDL_setenv SDL_setenv_REAL\n#define SDL_qsort SDL_qsort_REAL\n#define SDL_abs SDL_abs_REAL\n#define SDL_isdigit SDL_isdigit_REAL\n#define SDL_isspace SDL_isspace_REAL\n#define SDL_toupper SDL_toupper_REAL\n#define SDL_tolower SDL_tolower_REAL\n#define SDL_memset SDL_memset_REAL\n#define SDL_memcpy SDL_memcpy_REAL\n#define SDL_memmove SDL_memmove_REAL\n#define SDL_memcmp SDL_memcmp_REAL\n#define SDL_wcslen SDL_wcslen_REAL\n#define SDL_wcslcpy SDL_wcslcpy_REAL\n#define SDL_wcslcat SDL_wcslcat_REAL\n#define SDL_strlen SDL_strlen_REAL\n#define SDL_strlcpy SDL_strlcpy_REAL\n#define SDL_utf8strlcpy SDL_utf8strlcpy_REAL\n#define SDL_strlcat SDL_strlcat_REAL\n#define SDL_strdup SDL_strdup_REAL\n#define SDL_strrev SDL_strrev_REAL\n#define SDL_strupr SDL_strupr_REAL\n#define SDL_strlwr SDL_strlwr_REAL\n#define SDL_strchr SDL_strchr_REAL\n#define SDL_strrchr SDL_strrchr_REAL\n#define SDL_strstr SDL_strstr_REAL\n#define SDL_itoa SDL_itoa_REAL\n#define SDL_uitoa SDL_uitoa_REAL\n#define SDL_ltoa SDL_ltoa_REAL\n#define SDL_ultoa SDL_ultoa_REAL\n#define SDL_lltoa SDL_lltoa_REAL\n#define SDL_ulltoa SDL_ulltoa_REAL\n#define SDL_atoi SDL_atoi_REAL\n#define SDL_atof SDL_atof_REAL\n#define SDL_strtol SDL_strtol_REAL\n#define SDL_strtoul SDL_strtoul_REAL\n#define SDL_strtoll SDL_strtoll_REAL\n#define SDL_strtoull SDL_strtoull_REAL\n#define SDL_strtod SDL_strtod_REAL\n#define SDL_strcmp SDL_strcmp_REAL\n#define SDL_strncmp SDL_strncmp_REAL\n#define SDL_strcasecmp SDL_strcasecmp_REAL\n#define SDL_strncasecmp SDL_strncasecmp_REAL\n#define SDL_vsnprintf SDL_vsnprintf_REAL\n#define SDL_acos SDL_acos_REAL\n#define SDL_asin SDL_asin_REAL\n#define SDL_atan SDL_atan_REAL\n#define SDL_atan2 SDL_atan2_REAL\n#define SDL_ceil SDL_ceil_REAL\n#define SDL_copysign SDL_copysign_REAL\n#define SDL_cos SDL_cos_REAL\n#define SDL_cosf SDL_cosf_REAL\n#define SDL_fabs SDL_fabs_REAL\n#define SDL_floor SDL_floor_REAL\n#define SDL_log SDL_log_REAL\n#define SDL_pow SDL_pow_REAL\n#define SDL_scalbn SDL_scalbn_REAL\n#define SDL_sin SDL_sin_REAL\n#define SDL_sinf SDL_sinf_REAL\n#define SDL_sqrt SDL_sqrt_REAL\n#define SDL_iconv_open SDL_iconv_open_REAL\n#define SDL_iconv_close SDL_iconv_close_REAL\n#define SDL_iconv SDL_iconv_REAL\n#define SDL_iconv_string SDL_iconv_string_REAL\n#define SDL_CreateRGBSurfaceWithFormat SDL_CreateRGBSurfaceWithFormat_REAL\n#define SDL_CreateRGBSurfaceWithFormatFrom SDL_CreateRGBSurfaceWithFormatFrom_REAL\n#define SDL_CreateRGBSurface SDL_CreateRGBSurface_REAL\n#define SDL_CreateRGBSurfaceFrom SDL_CreateRGBSurfaceFrom_REAL\n#define SDL_FreeSurface SDL_FreeSurface_REAL\n#define SDL_SetSurfacePalette SDL_SetSurfacePalette_REAL\n#define SDL_LockSurface SDL_LockSurface_REAL\n#define SDL_UnlockSurface SDL_UnlockSurface_REAL\n#define SDL_LoadBMP_RW SDL_LoadBMP_RW_REAL\n#define SDL_SaveBMP_RW SDL_SaveBMP_RW_REAL\n#define SDL_SetSurfaceRLE SDL_SetSurfaceRLE_REAL\n#define SDL_SetColorKey SDL_SetColorKey_REAL\n#define SDL_GetColorKey SDL_GetColorKey_REAL\n#define SDL_SetSurfaceColorMod SDL_SetSurfaceColorMod_REAL\n#define SDL_GetSurfaceColorMod SDL_GetSurfaceColorMod_REAL\n#define SDL_SetSurfaceAlphaMod SDL_SetSurfaceAlphaMod_REAL\n#define SDL_GetSurfaceAlphaMod SDL_GetSurfaceAlphaMod_REAL\n#define SDL_SetSurfaceBlendMode SDL_SetSurfaceBlendMode_REAL\n#define SDL_GetSurfaceBlendMode SDL_GetSurfaceBlendMode_REAL\n#define SDL_SetClipRect SDL_SetClipRect_REAL\n#define SDL_GetClipRect SDL_GetClipRect_REAL\n#define SDL_ConvertSurface SDL_ConvertSurface_REAL\n#define SDL_ConvertSurfaceFormat SDL_ConvertSurfaceFormat_REAL\n#define SDL_ConvertPixels SDL_ConvertPixels_REAL\n#define SDL_FillRect SDL_FillRect_REAL\n#define SDL_FillRects SDL_FillRects_REAL\n#define SDL_UpperBlit SDL_UpperBlit_REAL\n#define SDL_LowerBlit SDL_LowerBlit_REAL\n#define SDL_SoftStretch SDL_SoftStretch_REAL\n#define SDL_UpperBlitScaled SDL_UpperBlitScaled_REAL\n#define SDL_LowerBlitScaled SDL_LowerBlitScaled_REAL\n#define SDL_GetWindowWMInfo SDL_GetWindowWMInfo_REAL\n#define SDL_GetThreadName SDL_GetThreadName_REAL\n#define SDL_ThreadID SDL_ThreadID_REAL\n#define SDL_GetThreadID SDL_GetThreadID_REAL\n#define SDL_SetThreadPriority SDL_SetThreadPriority_REAL\n#define SDL_WaitThread SDL_WaitThread_REAL\n#define SDL_DetachThread SDL_DetachThread_REAL\n#define SDL_TLSCreate SDL_TLSCreate_REAL\n#define SDL_TLSGet SDL_TLSGet_REAL\n#define SDL_TLSSet SDL_TLSSet_REAL\n#define SDL_GetTicks SDL_GetTicks_REAL\n#define SDL_GetPerformanceCounter SDL_GetPerformanceCounter_REAL\n#define SDL_GetPerformanceFrequency SDL_GetPerformanceFrequency_REAL\n#define SDL_Delay SDL_Delay_REAL\n#define SDL_AddTimer SDL_AddTimer_REAL\n#define SDL_RemoveTimer SDL_RemoveTimer_REAL\n#define SDL_GetNumTouchDevices SDL_GetNumTouchDevices_REAL\n#define SDL_GetTouchDevice SDL_GetTouchDevice_REAL\n#define SDL_GetNumTouchFingers SDL_GetNumTouchFingers_REAL\n#define SDL_GetTouchFinger SDL_GetTouchFinger_REAL\n#define SDL_GetVersion SDL_GetVersion_REAL\n#define SDL_GetRevision SDL_GetRevision_REAL\n#define SDL_GetRevisionNumber SDL_GetRevisionNumber_REAL\n#define SDL_GetNumVideoDrivers SDL_GetNumVideoDrivers_REAL\n#define SDL_GetVideoDriver SDL_GetVideoDriver_REAL\n#define SDL_VideoInit SDL_VideoInit_REAL\n#define SDL_VideoQuit SDL_VideoQuit_REAL\n#define SDL_GetCurrentVideoDriver SDL_GetCurrentVideoDriver_REAL\n#define SDL_GetNumVideoDisplays SDL_GetNumVideoDisplays_REAL\n#define SDL_GetDisplayName SDL_GetDisplayName_REAL\n#define SDL_GetDisplayBounds SDL_GetDisplayBounds_REAL\n#define SDL_GetDisplayDPI SDL_GetDisplayDPI_REAL\n#define SDL_GetNumDisplayModes SDL_GetNumDisplayModes_REAL\n#define SDL_GetDisplayMode SDL_GetDisplayMode_REAL\n#define SDL_GetDesktopDisplayMode SDL_GetDesktopDisplayMode_REAL\n#define SDL_GetCurrentDisplayMode SDL_GetCurrentDisplayMode_REAL\n#define SDL_GetClosestDisplayMode SDL_GetClosestDisplayMode_REAL\n#define SDL_GetWindowDisplayIndex SDL_GetWindowDisplayIndex_REAL\n#define SDL_SetWindowDisplayMode SDL_SetWindowDisplayMode_REAL\n#define SDL_GetWindowDisplayMode SDL_GetWindowDisplayMode_REAL\n#define SDL_GetWindowPixelFormat SDL_GetWindowPixelFormat_REAL\n#define SDL_CreateWindow SDL_CreateWindow_REAL\n#define SDL_CreateWindowFrom SDL_CreateWindowFrom_REAL\n#define SDL_GetWindowID SDL_GetWindowID_REAL\n#define SDL_GetWindowFromID SDL_GetWindowFromID_REAL\n#define SDL_GetWindowFlags SDL_GetWindowFlags_REAL\n#define SDL_SetWindowTitle SDL_SetWindowTitle_REAL\n#define SDL_GetWindowTitle SDL_GetWindowTitle_REAL\n#define SDL_SetWindowIcon SDL_SetWindowIcon_REAL\n#define SDL_SetWindowData SDL_SetWindowData_REAL\n#define SDL_GetWindowData SDL_GetWindowData_REAL\n#define SDL_SetWindowPosition SDL_SetWindowPosition_REAL\n#define SDL_GetWindowPosition SDL_GetWindowPosition_REAL\n#define SDL_SetWindowSize SDL_SetWindowSize_REAL\n#define SDL_GetWindowSize SDL_GetWindowSize_REAL\n#define SDL_SetWindowMinimumSize SDL_SetWindowMinimumSize_REAL\n#define SDL_GetWindowMinimumSize SDL_GetWindowMinimumSize_REAL\n#define SDL_SetWindowMaximumSize SDL_SetWindowMaximumSize_REAL\n#define SDL_GetWindowMaximumSize SDL_GetWindowMaximumSize_REAL\n#define SDL_SetWindowBordered SDL_SetWindowBordered_REAL\n#define SDL_ShowWindow SDL_ShowWindow_REAL\n#define SDL_HideWindow SDL_HideWindow_REAL\n#define SDL_RaiseWindow SDL_RaiseWindow_REAL\n#define SDL_MaximizeWindow SDL_MaximizeWindow_REAL\n#define SDL_MinimizeWindow SDL_MinimizeWindow_REAL\n#define SDL_RestoreWindow SDL_RestoreWindow_REAL\n#define SDL_SetWindowFullscreen SDL_SetWindowFullscreen_REAL\n#define SDL_GetWindowSurface SDL_GetWindowSurface_REAL\n#define SDL_UpdateWindowSurface SDL_UpdateWindowSurface_REAL\n#define SDL_UpdateWindowSurfaceRects SDL_UpdateWindowSurfaceRects_REAL\n#define SDL_SetWindowGrab SDL_SetWindowGrab_REAL\n#define SDL_GetWindowGrab SDL_GetWindowGrab_REAL\n#define SDL_SetWindowBrightness SDL_SetWindowBrightness_REAL\n#define SDL_GetWindowBrightness SDL_GetWindowBrightness_REAL\n#define SDL_SetWindowGammaRamp SDL_SetWindowGammaRamp_REAL\n#define SDL_GetWindowGammaRamp SDL_GetWindowGammaRamp_REAL\n#define SDL_DestroyWindow SDL_DestroyWindow_REAL\n#define SDL_IsScreenSaverEnabled SDL_IsScreenSaverEnabled_REAL\n#define SDL_EnableScreenSaver SDL_EnableScreenSaver_REAL\n#define SDL_DisableScreenSaver SDL_DisableScreenSaver_REAL\n#define SDL_GL_LoadLibrary SDL_GL_LoadLibrary_REAL\n#define SDL_GL_GetProcAddress SDL_GL_GetProcAddress_REAL\n#define SDL_GL_UnloadLibrary SDL_GL_UnloadLibrary_REAL\n#define SDL_GL_ExtensionSupported SDL_GL_ExtensionSupported_REAL\n#define SDL_GL_SetAttribute SDL_GL_SetAttribute_REAL\n#define SDL_GL_GetAttribute SDL_GL_GetAttribute_REAL\n#define SDL_GL_CreateContext SDL_GL_CreateContext_REAL\n#define SDL_GL_MakeCurrent SDL_GL_MakeCurrent_REAL\n#define SDL_GL_GetCurrentWindow SDL_GL_GetCurrentWindow_REAL\n#define SDL_GL_GetCurrentContext SDL_GL_GetCurrentContext_REAL\n#define SDL_GL_GetDrawableSize SDL_GL_GetDrawableSize_REAL\n#define SDL_GL_SetSwapInterval SDL_GL_SetSwapInterval_REAL\n#define SDL_GL_GetSwapInterval SDL_GL_GetSwapInterval_REAL\n#define SDL_GL_SwapWindow SDL_GL_SwapWindow_REAL\n#define SDL_GL_DeleteContext SDL_GL_DeleteContext_REAL\n#define SDL_vsscanf SDL_vsscanf_REAL\n#define SDL_GameControllerAddMappingsFromRW SDL_GameControllerAddMappingsFromRW_REAL\n#define SDL_GL_ResetAttributes SDL_GL_ResetAttributes_REAL\n#define SDL_HasAVX SDL_HasAVX_REAL\n#define SDL_GetDefaultAssertionHandler SDL_GetDefaultAssertionHandler_REAL\n#define SDL_GetAssertionHandler SDL_GetAssertionHandler_REAL\n#define SDL_DXGIGetOutputInfo SDL_DXGIGetOutputInfo_REAL\n#define SDL_RenderIsClipEnabled SDL_RenderIsClipEnabled_REAL\n#define SDL_WinRTRunApp SDL_WinRTRunApp_REAL\n#define SDL_WarpMouseGlobal SDL_WarpMouseGlobal_REAL\n#define SDL_WinRTGetFSPathUNICODE SDL_WinRTGetFSPathUNICODE_REAL\n#define SDL_WinRTGetFSPathUTF8 SDL_WinRTGetFSPathUTF8_REAL\n#define SDL_WinRTRunApp SDL_WinRTRunApp_REAL\n#define SDL_sqrtf SDL_sqrtf_REAL\n#define SDL_tan SDL_tan_REAL\n#define SDL_tanf SDL_tanf_REAL\n#define SDL_CaptureMouse SDL_CaptureMouse_REAL\n#define SDL_SetWindowHitTest SDL_SetWindowHitTest_REAL\n#define SDL_GetGlobalMouseState SDL_GetGlobalMouseState_REAL\n#define SDL_HasAVX2 SDL_HasAVX2_REAL\n#define SDL_QueueAudio SDL_QueueAudio_REAL\n#define SDL_GetQueuedAudioSize SDL_GetQueuedAudioSize_REAL\n#define SDL_ClearQueuedAudio SDL_ClearQueuedAudio_REAL\n#define SDL_GetGrabbedWindow SDL_GetGrabbedWindow_REAL\n#define SDL_SetWindowsMessageHook SDL_SetWindowsMessageHook_REAL\n#define SDL_JoystickCurrentPowerLevel SDL_JoystickCurrentPowerLevel_REAL\n#define SDL_GameControllerFromInstanceID SDL_GameControllerFromInstanceID_REAL\n#define SDL_JoystickFromInstanceID SDL_JoystickFromInstanceID_REAL\n#define SDL_GetDisplayUsableBounds SDL_GetDisplayUsableBounds_REAL\n#define SDL_GetWindowBordersSize SDL_GetWindowBordersSize_REAL\n#define SDL_SetWindowOpacity SDL_SetWindowOpacity_REAL\n#define SDL_GetWindowOpacity SDL_GetWindowOpacity_REAL\n#define SDL_SetWindowInputFocus SDL_SetWindowInputFocus_REAL\n#define SDL_SetWindowModalFor SDL_SetWindowModalFor_REAL\n#define SDL_RenderSetIntegerScale SDL_RenderSetIntegerScale_REAL\n#define SDL_RenderGetIntegerScale SDL_RenderGetIntegerScale_REAL\n#define SDL_DequeueAudio SDL_DequeueAudio_REAL\n#define SDL_SetWindowResizable SDL_SetWindowResizable_REAL\n#define SDL_CreateRGBSurfaceWithFormat SDL_CreateRGBSurfaceWithFormat_REAL\n#define SDL_CreateRGBSurfaceWithFormatFrom SDL_CreateRGBSurfaceWithFormatFrom_REAL\n#define SDL_GetHintBoolean SDL_GetHintBoolean_REAL\n"
  },
  {
    "path": "libs/SDL2/src/dynapi/SDL_dynapi_procs.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* vi: set ts=4 sw=4 expandtab: */\n\n/*\n   DO NOT EDIT THIS FILE BY HAND. It is autogenerated by gendynapi.pl.\n   NEVER REARRANGE THIS FILE, THE ORDER IS ABI LAW.\n   Changing this file means bumping SDL_DYNAPI_VERSION. You can safely add\n   new items to the end of the file, though.\n   Also, this file gets included multiple times, don't add #pragma once, etc.\n*/\n\n/* direct jump magic can use these, the rest needs special code. */\n#if !SDL_DYNAPI_PROC_NO_VARARGS\nSDL_DYNAPI_PROC(int,SDL_SetError,(SDL_PRINTF_FORMAT_STRING const char *a, ...),(a),return)\nSDL_DYNAPI_PROC(void,SDL_Log,(SDL_PRINTF_FORMAT_STRING const char *a, ...),(a),)\nSDL_DYNAPI_PROC(void,SDL_LogVerbose,(int a, SDL_PRINTF_FORMAT_STRING const char *b, ...),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_LogDebug,(int a, SDL_PRINTF_FORMAT_STRING const char *b, ...),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_LogInfo,(int a, SDL_PRINTF_FORMAT_STRING const char *b, ...),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_LogWarn,(int a, SDL_PRINTF_FORMAT_STRING const char *b, ...),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_LogError,(int a, SDL_PRINTF_FORMAT_STRING const char *b, ...),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_LogCritical,(int a, SDL_PRINTF_FORMAT_STRING const char *b, ...),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_LogMessage,(int a, SDL_LogPriority b, SDL_PRINTF_FORMAT_STRING const char *c, ...),(a,b,c),)\nSDL_DYNAPI_PROC(int,SDL_sscanf,(const char *a, SDL_SCANF_FORMAT_STRING const char *b, ...),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_snprintf,(SDL_OUT_Z_CAP(b) char *a, size_t b, SDL_PRINTF_FORMAT_STRING const char *c, ...),(a,b,c),return)\n#endif\n\n#ifdef SDL_CreateThread\n#undef SDL_CreateThread\n#endif\n\n#if defined(__WIN32__) && !defined(HAVE_LIBC)\nSDL_DYNAPI_PROC(SDL_Thread*,SDL_CreateThread,(SDL_ThreadFunction a, const char *b, void *c, pfnSDL_CurrentBeginThread d, pfnSDL_CurrentEndThread e),(a,b,c,d,e),return)\n#else\nSDL_DYNAPI_PROC(SDL_Thread*,SDL_CreateThread,(SDL_ThreadFunction a, const char *b, void *c),(a,b,c),return)\n#endif\n\n#ifdef HAVE_STDIO_H\nSDL_DYNAPI_PROC(SDL_RWops*,SDL_RWFromFP,(FILE *a, SDL_bool b),(a,b),return)\n#else\nSDL_DYNAPI_PROC(SDL_RWops*,SDL_RWFromFP,(void *a, SDL_bool b),(a,b),return)\n#endif\n\n/* so annoying. */\n#if defined(__thumb__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__))\nSDL_DYNAPI_PROC(void,SDL_MemoryBarrierRelease,(void),(),)\nSDL_DYNAPI_PROC(void,SDL_MemoryBarrierAcquire,(void),(),)\n#endif\n\n#ifdef __WIN32__\nSDL_DYNAPI_PROC(int,SDL_RegisterApp,(char *a, Uint32 b, void *c),(a,b,c),return)\nSDL_DYNAPI_PROC(void,SDL_UnregisterApp,(void),(),)\nSDL_DYNAPI_PROC(int,SDL_Direct3D9GetAdapterIndex,(int a),(a),return)\nSDL_DYNAPI_PROC(IDirect3DDevice9*,SDL_RenderGetD3D9Device,(SDL_Renderer *a),(a),return)\n#endif\n\n#if defined(__IPHONEOS__) && __IPHONEOS__\nSDL_DYNAPI_PROC(int,SDL_iPhoneSetAnimationCallback,(SDL_Window *a, int b, void c, void *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(void,SDL_iPhoneSetEventPump,(SDL_bool a),(a),)\n#endif\n\n#if defined(__ANDROID__) && __ANDROID__\nSDL_DYNAPI_PROC(void*,SDL_AndroidGetJNIEnv,(void),(),return)\nSDL_DYNAPI_PROC(void*,SDL_AndroidGetActivity,(void),(),return)\nSDL_DYNAPI_PROC(const char*,SDL_AndroidGetInternalStoragePath,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_AndroidGetExternalStorageState,(void),(),return)\nSDL_DYNAPI_PROC(const char*,SDL_AndroidGetExternalStoragePath,(void),(),return)\n#endif\n\nSDL_DYNAPI_PROC(int,SDL_Init,(Uint32 a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_InitSubSystem,(Uint32 a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_QuitSubSystem,(Uint32 a),(a),)\nSDL_DYNAPI_PROC(Uint32,SDL_WasInit,(Uint32 a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_Quit,(void),(),)\nSDL_DYNAPI_PROC(SDL_assert_state,SDL_ReportAssertion,(SDL_assert_data *a, const char *b, const char *c, int d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(void,SDL_SetAssertionHandler,(SDL_AssertionHandler a, void *b),(a,b),)\nSDL_DYNAPI_PROC(const SDL_assert_data*,SDL_GetAssertionReport,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_ResetAssertionReport,(void),(),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_AtomicTryLock,(SDL_SpinLock *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_AtomicLock,(SDL_SpinLock *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_AtomicUnlock,(SDL_SpinLock *a),(a),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_AtomicCAS,(SDL_atomic_t *a, int b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_AtomicSet,(SDL_atomic_t *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_AtomicGet,(SDL_atomic_t *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_AtomicAdd,(SDL_atomic_t *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_AtomicCASPtr,(void **a, void *b, void *c),(a,b,c),return)\nSDL_DYNAPI_PROC(void*,SDL_AtomicSetPtr,(void **a, void *b),(a,b),return)\nSDL_DYNAPI_PROC(void*,SDL_AtomicGetPtr,(void **a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GetNumAudioDrivers,(void),(),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetAudioDriver,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_AudioInit,(const char *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_AudioQuit,(void),(),)\nSDL_DYNAPI_PROC(const char*,SDL_GetCurrentAudioDriver,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_OpenAudio,(SDL_AudioSpec *a, SDL_AudioSpec *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetNumAudioDevices,(int a),(a),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetAudioDeviceName,(int a, int b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_AudioDeviceID,SDL_OpenAudioDevice,(const char *a, int b, const SDL_AudioSpec *c, SDL_AudioSpec *d, int e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(SDL_AudioStatus,SDL_GetAudioStatus,(void),(),return)\nSDL_DYNAPI_PROC(SDL_AudioStatus,SDL_GetAudioDeviceStatus,(SDL_AudioDeviceID a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_PauseAudio,(int a),(a),)\nSDL_DYNAPI_PROC(void,SDL_PauseAudioDevice,(SDL_AudioDeviceID a, int b),(a,b),)\nSDL_DYNAPI_PROC(SDL_AudioSpec*,SDL_LoadWAV_RW,(SDL_RWops *a, int b, SDL_AudioSpec *c, Uint8 **d, Uint32 *e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(void,SDL_FreeWAV,(Uint8 *a),(a),)\nSDL_DYNAPI_PROC(int,SDL_BuildAudioCVT,(SDL_AudioCVT *a, SDL_AudioFormat b, Uint8 c, int d, SDL_AudioFormat e, Uint8 f, int g),(a,b,c,d,e,f,g),return)\nSDL_DYNAPI_PROC(int,SDL_ConvertAudio,(SDL_AudioCVT *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_MixAudio,(Uint8 *a, const Uint8 *b, Uint32 c, int d),(a,b,c,d),)\nSDL_DYNAPI_PROC(void,SDL_MixAudioFormat,(Uint8 *a, const Uint8 *b, SDL_AudioFormat c, Uint32 d, int e),(a,b,c,d,e),)\nSDL_DYNAPI_PROC(void,SDL_LockAudio,(void),(),)\nSDL_DYNAPI_PROC(void,SDL_LockAudioDevice,(SDL_AudioDeviceID a),(a),)\nSDL_DYNAPI_PROC(void,SDL_UnlockAudio,(void),(),)\nSDL_DYNAPI_PROC(void,SDL_UnlockAudioDevice,(SDL_AudioDeviceID a),(a),)\nSDL_DYNAPI_PROC(void,SDL_CloseAudio,(void),(),)\nSDL_DYNAPI_PROC(void,SDL_CloseAudioDevice,(SDL_AudioDeviceID a),(a),)\nSDL_DYNAPI_PROC(int,SDL_SetClipboardText,(const char *a),(a),return)\nSDL_DYNAPI_PROC(char*,SDL_GetClipboardText,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasClipboardText,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_GetCPUCount,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_GetCPUCacheLineSize,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasRDTSC,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasAltiVec,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasMMX,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_Has3DNow,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasSSE,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasSSE2,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasSSE3,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasSSE41,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasSSE42,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_GetSystemRAM,(void),(),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetError,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_ClearError,(void),(),)\nSDL_DYNAPI_PROC(int,SDL_Error,(SDL_errorcode a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_PumpEvents,(void),(),)\nSDL_DYNAPI_PROC(int,SDL_PeepEvents,(SDL_Event *a, int b, SDL_eventaction c, Uint32 d, Uint32 e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasEvent,(Uint32 a),(a),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasEvents,(Uint32 a, Uint32 b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_FlushEvent,(Uint32 a),(a),)\nSDL_DYNAPI_PROC(void,SDL_FlushEvents,(Uint32 a, Uint32 b),(a,b),)\nSDL_DYNAPI_PROC(int,SDL_PollEvent,(SDL_Event *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_WaitEvent,(SDL_Event *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_WaitEventTimeout,(SDL_Event *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_PushEvent,(SDL_Event *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_SetEventFilter,(SDL_EventFilter a, void *b),(a,b),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_GetEventFilter,(SDL_EventFilter *a, void **b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_AddEventWatch,(SDL_EventFilter a, void *b),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_DelEventWatch,(SDL_EventFilter a, void *b),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_FilterEvents,(SDL_EventFilter a, void *b),(a,b),)\nSDL_DYNAPI_PROC(Uint8,SDL_EventState,(Uint32 a, int b),(a,b),return)\nSDL_DYNAPI_PROC(Uint32,SDL_RegisterEvents,(int a),(a),return)\nSDL_DYNAPI_PROC(char*,SDL_GetBasePath,(void),(),return)\nSDL_DYNAPI_PROC(char*,SDL_GetPrefPath,(const char *a, const char *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GameControllerAddMapping,(const char *a),(a),return)\nSDL_DYNAPI_PROC(char*,SDL_GameControllerMappingForGUID,(SDL_JoystickGUID a),(a),return)\nSDL_DYNAPI_PROC(char*,SDL_GameControllerMapping,(SDL_GameController *a),(a),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_IsGameController,(int a),(a),return)\nSDL_DYNAPI_PROC(const char*,SDL_GameControllerNameForIndex,(int a),(a),return)\nSDL_DYNAPI_PROC(SDL_GameController*,SDL_GameControllerOpen,(int a),(a),return)\nSDL_DYNAPI_PROC(const char*,SDL_GameControllerName,(SDL_GameController *a),(a),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_GameControllerGetAttached,(SDL_GameController *a),(a),return)\nSDL_DYNAPI_PROC(SDL_Joystick*,SDL_GameControllerGetJoystick,(SDL_GameController *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GameControllerEventState,(int a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_GameControllerUpdate,(void),(),)\nSDL_DYNAPI_PROC(SDL_GameControllerAxis,SDL_GameControllerGetAxisFromString,(const char *a),(a),return)\nSDL_DYNAPI_PROC(const char*,SDL_GameControllerGetStringForAxis,(SDL_GameControllerAxis a),(a),return)\nSDL_DYNAPI_PROC(SDL_GameControllerButtonBind,SDL_GameControllerGetBindForAxis,(SDL_GameController *a, SDL_GameControllerAxis b),(a,b),return)\nSDL_DYNAPI_PROC(Sint16,SDL_GameControllerGetAxis,(SDL_GameController *a, SDL_GameControllerAxis b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_GameControllerButton,SDL_GameControllerGetButtonFromString,(const char *a),(a),return)\nSDL_DYNAPI_PROC(const char*,SDL_GameControllerGetStringForButton,(SDL_GameControllerButton a),(a),return)\nSDL_DYNAPI_PROC(SDL_GameControllerButtonBind,SDL_GameControllerGetBindForButton,(SDL_GameController *a, SDL_GameControllerButton b),(a,b),return)\nSDL_DYNAPI_PROC(Uint8,SDL_GameControllerGetButton,(SDL_GameController *a, SDL_GameControllerButton b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_GameControllerClose,(SDL_GameController *a),(a),)\nSDL_DYNAPI_PROC(int,SDL_RecordGesture,(SDL_TouchID a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SaveAllDollarTemplates,(SDL_RWops *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SaveDollarTemplate,(SDL_GestureID a, SDL_RWops *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_LoadDollarTemplates,(SDL_TouchID a, SDL_RWops *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_NumHaptics,(void),(),return)\nSDL_DYNAPI_PROC(const char*,SDL_HapticName,(int a),(a),return)\nSDL_DYNAPI_PROC(SDL_Haptic*,SDL_HapticOpen,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticOpened,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticIndex,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_MouseIsHaptic,(void),(),return)\nSDL_DYNAPI_PROC(SDL_Haptic*,SDL_HapticOpenFromMouse,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_JoystickIsHaptic,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(SDL_Haptic*,SDL_HapticOpenFromJoystick,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_HapticClose,(SDL_Haptic *a),(a),)\nSDL_DYNAPI_PROC(int,SDL_HapticNumEffects,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticNumEffectsPlaying,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(unsigned int,SDL_HapticQuery,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticNumAxes,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticEffectSupported,(SDL_Haptic *a, SDL_HapticEffect *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_HapticNewEffect,(SDL_Haptic *a, SDL_HapticEffect *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_HapticUpdateEffect,(SDL_Haptic *a, int b, SDL_HapticEffect *c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_HapticRunEffect,(SDL_Haptic *a, int b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_HapticStopEffect,(SDL_Haptic *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_HapticDestroyEffect,(SDL_Haptic *a, int b),(a,b),)\nSDL_DYNAPI_PROC(int,SDL_HapticGetEffectStatus,(SDL_Haptic *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_HapticSetGain,(SDL_Haptic *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_HapticSetAutocenter,(SDL_Haptic *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_HapticPause,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticUnpause,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticStopAll,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticRumbleSupported,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticRumbleInit,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_HapticRumblePlay,(SDL_Haptic *a, float b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_HapticRumbleStop,(SDL_Haptic *a),(a),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_SetHintWithPriority,(const char *a, const char *b, SDL_HintPriority c),(a,b,c),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_SetHint,(const char *a, const char *b),(a,b),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetHint,(const char *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_AddHintCallback,(const char *a, SDL_HintCallback b, void *c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_DelHintCallback,(const char *a, SDL_HintCallback b, void *c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_ClearHints,(void),(),)\nSDL_DYNAPI_PROC(int,SDL_NumJoysticks,(void),(),return)\nSDL_DYNAPI_PROC(const char*,SDL_JoystickNameForIndex,(int a),(a),return)\nSDL_DYNAPI_PROC(SDL_Joystick*,SDL_JoystickOpen,(int a),(a),return)\nSDL_DYNAPI_PROC(const char*,SDL_JoystickName,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(SDL_JoystickGUID,SDL_JoystickGetDeviceGUID,(int a),(a),return)\nSDL_DYNAPI_PROC(SDL_JoystickGUID,SDL_JoystickGetGUID,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_JoystickGetGUIDString,(SDL_JoystickGUID a, char *b, int c),(a,b,c),)\nSDL_DYNAPI_PROC(SDL_JoystickGUID,SDL_JoystickGetGUIDFromString,(const char *a),(a),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_JoystickGetAttached,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(SDL_JoystickID,SDL_JoystickInstanceID,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_JoystickNumAxes,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_JoystickNumBalls,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_JoystickNumHats,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_JoystickNumButtons,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_JoystickUpdate,(void),(),)\nSDL_DYNAPI_PROC(int,SDL_JoystickEventState,(int a),(a),return)\nSDL_DYNAPI_PROC(Sint16,SDL_JoystickGetAxis,(SDL_Joystick *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(Uint8,SDL_JoystickGetHat,(SDL_Joystick *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_JoystickGetBall,(SDL_Joystick *a, int b, int *c, int *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(Uint8,SDL_JoystickGetButton,(SDL_Joystick *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_JoystickClose,(SDL_Joystick *a),(a),)\nSDL_DYNAPI_PROC(SDL_Window*,SDL_GetKeyboardFocus,(void),(),return)\nSDL_DYNAPI_PROC(const Uint8*,SDL_GetKeyboardState,(int *a),(a),return)\nSDL_DYNAPI_PROC(SDL_Keymod,SDL_GetModState,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_SetModState,(SDL_Keymod a),(a),)\nSDL_DYNAPI_PROC(SDL_Keycode,SDL_GetKeyFromScancode,(SDL_Scancode a),(a),return)\nSDL_DYNAPI_PROC(SDL_Scancode,SDL_GetScancodeFromKey,(SDL_Keycode a),(a),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetScancodeName,(SDL_Scancode a),(a),return)\nSDL_DYNAPI_PROC(SDL_Scancode,SDL_GetScancodeFromName,(const char *a),(a),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetKeyName,(SDL_Keycode a),(a),return)\nSDL_DYNAPI_PROC(SDL_Keycode,SDL_GetKeyFromName,(const char *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_StartTextInput,(void),(),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_IsTextInputActive,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_StopTextInput,(void),(),)\nSDL_DYNAPI_PROC(void,SDL_SetTextInputRect,(SDL_Rect *a),(a),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasScreenKeyboardSupport,(void),(),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_IsScreenKeyboardShown,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(void*,SDL_LoadObject,(const char *a),(a),return)\nSDL_DYNAPI_PROC(void*,SDL_LoadFunction,(void *a, const char *b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_UnloadObject,(void *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_LogSetAllPriority,(SDL_LogPriority a),(a),)\nSDL_DYNAPI_PROC(void,SDL_LogSetPriority,(int a, SDL_LogPriority b),(a,b),)\nSDL_DYNAPI_PROC(SDL_LogPriority,SDL_LogGetPriority,(int a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_LogResetPriorities,(void),(),)\nSDL_DYNAPI_PROC(void,SDL_LogMessageV,(int a, SDL_LogPriority b, const char *c, va_list d),(a,b,c,d),)\nSDL_DYNAPI_PROC(void,SDL_LogGetOutputFunction,(SDL_LogOutputFunction *a, void **b),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_LogSetOutputFunction,(SDL_LogOutputFunction a, void *b),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_SetMainReady,(void),(),)\nSDL_DYNAPI_PROC(int,SDL_ShowMessageBox,(const SDL_MessageBoxData *a, int *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_ShowSimpleMessageBox,(Uint32 a, const char *b, const char *c, SDL_Window *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(SDL_Window*,SDL_GetMouseFocus,(void),(),return)\nSDL_DYNAPI_PROC(Uint32,SDL_GetMouseState,(int *a, int *b),(a,b),return)\nSDL_DYNAPI_PROC(Uint32,SDL_GetRelativeMouseState,(int *a, int *b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_WarpMouseInWindow,(SDL_Window *a, int b, int c),(a,b,c),)\nSDL_DYNAPI_PROC(int,SDL_SetRelativeMouseMode,(SDL_bool a),(a),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_GetRelativeMouseMode,(void),(),return)\nSDL_DYNAPI_PROC(SDL_Cursor*,SDL_CreateCursor,(const Uint8 *a, const Uint8 *b, int c, int d, int e, int f),(a,b,c,d,e,f),return)\nSDL_DYNAPI_PROC(SDL_Cursor*,SDL_CreateColorCursor,(SDL_Surface *a, int b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(SDL_Cursor*,SDL_CreateSystemCursor,(SDL_SystemCursor a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_SetCursor,(SDL_Cursor *a),(a),)\nSDL_DYNAPI_PROC(SDL_Cursor*,SDL_GetCursor,(void),(),return)\nSDL_DYNAPI_PROC(SDL_Cursor*,SDL_GetDefaultCursor,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_FreeCursor,(SDL_Cursor *a),(a),)\nSDL_DYNAPI_PROC(int,SDL_ShowCursor,(int a),(a),return)\nSDL_DYNAPI_PROC(SDL_mutex*,SDL_CreateMutex,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_LockMutex,(SDL_mutex *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_TryLockMutex,(SDL_mutex *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_UnlockMutex,(SDL_mutex *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_DestroyMutex,(SDL_mutex *a),(a),)\nSDL_DYNAPI_PROC(SDL_sem*,SDL_CreateSemaphore,(Uint32 a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_DestroySemaphore,(SDL_sem *a),(a),)\nSDL_DYNAPI_PROC(int,SDL_SemWait,(SDL_sem *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SemTryWait,(SDL_sem *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SemWaitTimeout,(SDL_sem *a, Uint32 b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_SemPost,(SDL_sem *a),(a),return)\nSDL_DYNAPI_PROC(Uint32,SDL_SemValue,(SDL_sem *a),(a),return)\nSDL_DYNAPI_PROC(SDL_cond*,SDL_CreateCond,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_DestroyCond,(SDL_cond *a),(a),)\nSDL_DYNAPI_PROC(int,SDL_CondSignal,(SDL_cond *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_CondBroadcast,(SDL_cond *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_CondWait,(SDL_cond *a, SDL_mutex *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_CondWaitTimeout,(SDL_cond *a, SDL_mutex *b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetPixelFormatName,(Uint32 a),(a),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_PixelFormatEnumToMasks,(Uint32 a, int *b, Uint32 *c, Uint32 *d, Uint32 *e, Uint32 *f),(a,b,c,d,e,f),return)\nSDL_DYNAPI_PROC(Uint32,SDL_MasksToPixelFormatEnum,(int a, Uint32 b, Uint32 c, Uint32 d, Uint32 e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(SDL_PixelFormat*,SDL_AllocFormat,(Uint32 a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_FreeFormat,(SDL_PixelFormat *a),(a),)\nSDL_DYNAPI_PROC(SDL_Palette*,SDL_AllocPalette,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SetPixelFormatPalette,(SDL_PixelFormat *a, SDL_Palette *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_SetPaletteColors,(SDL_Palette *a, const SDL_Color *b, int c, int d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(void,SDL_FreePalette,(SDL_Palette *a),(a),)\nSDL_DYNAPI_PROC(Uint32,SDL_MapRGB,(const SDL_PixelFormat *a, Uint8 b, Uint8 c, Uint8 d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(Uint32,SDL_MapRGBA,(const SDL_PixelFormat *a, Uint8 b, Uint8 c, Uint8 d, Uint8 e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(void,SDL_GetRGB,(Uint32 a, const SDL_PixelFormat *b, Uint8 *c, Uint8 *d, Uint8 *e),(a,b,c,d,e),)\nSDL_DYNAPI_PROC(void,SDL_GetRGBA,(Uint32 a, const SDL_PixelFormat *b, Uint8 *c, Uint8 *d, Uint8 *e, Uint8 *f),(a,b,c,d,e,f),)\nSDL_DYNAPI_PROC(void,SDL_CalculateGammaRamp,(float a, Uint16 *b),(a,b),)\nSDL_DYNAPI_PROC(const char*,SDL_GetPlatform,(void),(),return)\nSDL_DYNAPI_PROC(SDL_PowerState,SDL_GetPowerInfo,(int *a, int *b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasIntersection,(const SDL_Rect *a, const SDL_Rect *b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_IntersectRect,(const SDL_Rect *a, const SDL_Rect *b, SDL_Rect *c),(a,b,c),return)\nSDL_DYNAPI_PROC(void,SDL_UnionRect,(const SDL_Rect *a, const SDL_Rect *b, SDL_Rect *c),(a,b,c),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_EnclosePoints,(const SDL_Point *a, int b, const SDL_Rect *c, SDL_Rect *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_IntersectRectAndLine,(const SDL_Rect *a, int *b, int *c, int *d, int *e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(int,SDL_GetNumRenderDrivers,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_GetRenderDriverInfo,(int a, SDL_RendererInfo *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_CreateWindowAndRenderer,(int a, int b, Uint32 c, SDL_Window **d, SDL_Renderer **e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(SDL_Renderer*,SDL_CreateRenderer,(SDL_Window *a, int b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(SDL_Renderer*,SDL_CreateSoftwareRenderer,(SDL_Surface *a),(a),return)\nSDL_DYNAPI_PROC(SDL_Renderer*,SDL_GetRenderer,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GetRendererInfo,(SDL_Renderer *a, SDL_RendererInfo *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetRendererOutputSize,(SDL_Renderer *a, int *b, int *c),(a,b,c),return)\nSDL_DYNAPI_PROC(SDL_Texture*,SDL_CreateTexture,(SDL_Renderer *a, Uint32 b, int c, int d, int e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(SDL_Texture*,SDL_CreateTextureFromSurface,(SDL_Renderer *a, SDL_Surface *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_QueryTexture,(SDL_Texture *a, Uint32 *b, int *c, int *d, int *e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(int,SDL_SetTextureColorMod,(SDL_Texture *a, Uint8 b, Uint8 c, Uint8 d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_GetTextureColorMod,(SDL_Texture *a, Uint8 *b, Uint8 *c, Uint8 *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_SetTextureAlphaMod,(SDL_Texture *a, Uint8 b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetTextureAlphaMod,(SDL_Texture *a, Uint8 *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_SetTextureBlendMode,(SDL_Texture *a, SDL_BlendMode b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetTextureBlendMode,(SDL_Texture *a, SDL_BlendMode *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_UpdateTexture,(SDL_Texture *a, const SDL_Rect *b, const void *c, int d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_UpdateYUVTexture,(SDL_Texture *a, const SDL_Rect *b, const Uint8 *c, int d, const Uint8 *e, int f, const Uint8 *g, int h),(a,b,c,d,e,f,g,h),return)\nSDL_DYNAPI_PROC(int,SDL_LockTexture,(SDL_Texture *a, const SDL_Rect *b, void **c, int *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(void,SDL_UnlockTexture,(SDL_Texture *a),(a),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_RenderTargetSupported,(SDL_Renderer *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SetRenderTarget,(SDL_Renderer *a, SDL_Texture *b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_Texture*,SDL_GetRenderTarget,(SDL_Renderer *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_RenderSetLogicalSize,(SDL_Renderer *a, int b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(void,SDL_RenderGetLogicalSize,(SDL_Renderer *a, int *b, int *c),(a,b,c),)\nSDL_DYNAPI_PROC(int,SDL_RenderSetViewport,(SDL_Renderer *a, const SDL_Rect *b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_RenderGetViewport,(SDL_Renderer *a, SDL_Rect *b),(a,b),)\nSDL_DYNAPI_PROC(int,SDL_RenderSetClipRect,(SDL_Renderer *a, const SDL_Rect *b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_RenderGetClipRect,(SDL_Renderer *a, SDL_Rect *b),(a,b),)\nSDL_DYNAPI_PROC(int,SDL_RenderSetScale,(SDL_Renderer *a, float b, float c),(a,b,c),return)\nSDL_DYNAPI_PROC(void,SDL_RenderGetScale,(SDL_Renderer *a, float *b, float *c),(a,b,c),)\nSDL_DYNAPI_PROC(int,SDL_SetRenderDrawColor,(SDL_Renderer *a, Uint8 b, Uint8 c, Uint8 d, Uint8 e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(int,SDL_GetRenderDrawColor,(SDL_Renderer *a, Uint8 *b, Uint8 *c, Uint8 *d, Uint8 *e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(int,SDL_SetRenderDrawBlendMode,(SDL_Renderer *a, SDL_BlendMode b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetRenderDrawBlendMode,(SDL_Renderer *a, SDL_BlendMode *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_RenderClear,(SDL_Renderer *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_RenderDrawPoint,(SDL_Renderer *a, int b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_RenderDrawPoints,(SDL_Renderer *a, const SDL_Point *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_RenderDrawLine,(SDL_Renderer *a, int b, int c, int d, int e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(int,SDL_RenderDrawLines,(SDL_Renderer *a, const SDL_Point *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_RenderDrawRect,(SDL_Renderer *a, const SDL_Rect *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_RenderDrawRects,(SDL_Renderer *a, const SDL_Rect *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_RenderFillRect,(SDL_Renderer *a, const SDL_Rect *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_RenderFillRects,(SDL_Renderer *a, const SDL_Rect *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_RenderCopy,(SDL_Renderer *a, SDL_Texture *b, const SDL_Rect *c, const SDL_Rect *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_RenderCopyEx,(SDL_Renderer *a, SDL_Texture *b, const SDL_Rect *c, const SDL_Rect *d, const double e, const SDL_Point *f, const SDL_RendererFlip g),(a,b,c,d,e,f,g),return)\nSDL_DYNAPI_PROC(int,SDL_RenderReadPixels,(SDL_Renderer *a, const SDL_Rect *b, Uint32 c, void *d, int e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(void,SDL_RenderPresent,(SDL_Renderer *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_DestroyTexture,(SDL_Texture *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_DestroyRenderer,(SDL_Renderer *a),(a),)\nSDL_DYNAPI_PROC(int,SDL_GL_BindTexture,(SDL_Texture *a, float *b, float *c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_GL_UnbindTexture,(SDL_Texture *a),(a),return)\nSDL_DYNAPI_PROC(SDL_RWops*,SDL_RWFromFile,(const char *a, const char *b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_RWops*,SDL_RWFromMem,(void *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_RWops*,SDL_RWFromConstMem,(const void *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_RWops*,SDL_AllocRW,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_FreeRW,(SDL_RWops *a),(a),)\nSDL_DYNAPI_PROC(Uint8,SDL_ReadU8,(SDL_RWops *a),(a),return)\nSDL_DYNAPI_PROC(Uint16,SDL_ReadLE16,(SDL_RWops *a),(a),return)\nSDL_DYNAPI_PROC(Uint16,SDL_ReadBE16,(SDL_RWops *a),(a),return)\nSDL_DYNAPI_PROC(Uint32,SDL_ReadLE32,(SDL_RWops *a),(a),return)\nSDL_DYNAPI_PROC(Uint32,SDL_ReadBE32,(SDL_RWops *a),(a),return)\nSDL_DYNAPI_PROC(Uint64,SDL_ReadLE64,(SDL_RWops *a),(a),return)\nSDL_DYNAPI_PROC(Uint64,SDL_ReadBE64,(SDL_RWops *a),(a),return)\nSDL_DYNAPI_PROC(size_t,SDL_WriteU8,(SDL_RWops *a, Uint8 b),(a,b),return)\nSDL_DYNAPI_PROC(size_t,SDL_WriteLE16,(SDL_RWops *a, Uint16 b),(a,b),return)\nSDL_DYNAPI_PROC(size_t,SDL_WriteBE16,(SDL_RWops *a, Uint16 b),(a,b),return)\nSDL_DYNAPI_PROC(size_t,SDL_WriteLE32,(SDL_RWops *a, Uint32 b),(a,b),return)\nSDL_DYNAPI_PROC(size_t,SDL_WriteBE32,(SDL_RWops *a, Uint32 b),(a,b),return)\nSDL_DYNAPI_PROC(size_t,SDL_WriteLE64,(SDL_RWops *a, Uint64 b),(a,b),return)\nSDL_DYNAPI_PROC(size_t,SDL_WriteBE64,(SDL_RWops *a, Uint64 b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_Window*,SDL_CreateShapedWindow,(const char *a, unsigned int b, unsigned int c, unsigned int d, unsigned int e, Uint32 f),(a,b,c,d,e,f),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_IsShapedWindow,(const SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SetWindowShape,(SDL_Window *a, SDL_Surface *b, SDL_WindowShapeMode *c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_GetShapedWindowMode,(SDL_Window *a, SDL_WindowShapeMode *b),(a,b),return)\nSDL_DYNAPI_PROC(void*,SDL_malloc,(size_t a),(a),return)\nSDL_DYNAPI_PROC(void*,SDL_calloc,(size_t a, size_t b),(a,b),return)\nSDL_DYNAPI_PROC(void*,SDL_realloc,(void *a, size_t b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_free,(void *a),(a),)\nSDL_DYNAPI_PROC(char*,SDL_getenv,(const char *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_setenv,(const char *a, const char *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(void,SDL_qsort,(void *a, size_t b, size_t c, int (*d)(const void *, const void *)),(a,b,c,d),)\nSDL_DYNAPI_PROC(int,SDL_abs,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_isdigit,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_isspace,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_toupper,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_tolower,(int a),(a),return)\nSDL_DYNAPI_PROC(void*,SDL_memset,(SDL_OUT_BYTECAP(c) void *a, int b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(void*,SDL_memcpy,(SDL_OUT_BYTECAP(c) void *a, SDL_IN_BYTECAP(c) const void *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(void*,SDL_memmove,(SDL_OUT_BYTECAP(c) void *a, SDL_IN_BYTECAP(c) const void *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_memcmp,(const void *a, const void *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(size_t,SDL_wcslen,(const wchar_t *a),(a),return)\nSDL_DYNAPI_PROC(size_t,SDL_wcslcpy,(SDL_OUT_Z_CAP(c) wchar_t *a, const wchar_t *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(size_t,SDL_wcslcat,(SDL_INOUT_Z_CAP(c) wchar_t *a, const wchar_t *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(size_t,SDL_strlen,(const char *a),(a),return)\nSDL_DYNAPI_PROC(size_t,SDL_strlcpy,(SDL_OUT_Z_CAP(c) char *a, const char *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(size_t,SDL_utf8strlcpy,(SDL_OUT_Z_CAP(c) char *a, const char *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(size_t,SDL_strlcat,(SDL_INOUT_Z_CAP(c) char *a, const char *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(char*,SDL_strdup,(const char *a),(a),return)\nSDL_DYNAPI_PROC(char*,SDL_strrev,(char *a),(a),return)\nSDL_DYNAPI_PROC(char*,SDL_strupr,(char *a),(a),return)\nSDL_DYNAPI_PROC(char*,SDL_strlwr,(char *a),(a),return)\nSDL_DYNAPI_PROC(char*,SDL_strchr,(const char *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(char*,SDL_strrchr,(const char *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(char*,SDL_strstr,(const char *a, const char *b),(a,b),return)\nSDL_DYNAPI_PROC(char*,SDL_itoa,(int a, char *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(char*,SDL_uitoa,(unsigned int a, char *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(char*,SDL_ltoa,(long a, char *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(char*,SDL_ultoa,(unsigned long a, char *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(char*,SDL_lltoa,(Sint64 a, char *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(char*,SDL_ulltoa,(Uint64 a, char *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_atoi,(const char *a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_atof,(const char *a),(a),return)\nSDL_DYNAPI_PROC(long,SDL_strtol,(const char *a, char **b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(unsigned long,SDL_strtoul,(const char *a, char **b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(Sint64,SDL_strtoll,(const char *a, char **b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(Uint64,SDL_strtoull,(const char *a, char **b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(double,SDL_strtod,(const char *a, char **b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_strcmp,(const char *a, const char *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_strncmp,(const char *a, const char *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_strcasecmp,(const char *a, const char *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_strncasecmp,(const char *a, const char *b, size_t c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_vsnprintf,(SDL_OUT_Z_CAP(b) char *a, size_t b, const char *c, va_list d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(double,SDL_acos,(double a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_asin,(double a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_atan,(double a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_atan2,(double a, double b),(a,b),return)\nSDL_DYNAPI_PROC(double,SDL_ceil,(double a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_copysign,(double a, double b),(a,b),return)\nSDL_DYNAPI_PROC(double,SDL_cos,(double a),(a),return)\nSDL_DYNAPI_PROC(float,SDL_cosf,(float a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_fabs,(double a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_floor,(double a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_log,(double a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_pow,(double a, double b),(a,b),return)\nSDL_DYNAPI_PROC(double,SDL_scalbn,(double a, int b),(a,b),return)\nSDL_DYNAPI_PROC(double,SDL_sin,(double a),(a),return)\nSDL_DYNAPI_PROC(float,SDL_sinf,(float a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_sqrt,(double a),(a),return)\nSDL_DYNAPI_PROC(SDL_iconv_t,SDL_iconv_open,(const char *a, const char *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_iconv_close,(SDL_iconv_t a),(a),return)\nSDL_DYNAPI_PROC(size_t,SDL_iconv,(SDL_iconv_t a, const char **b, size_t *c, char **d, size_t *e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(char*,SDL_iconv_string,(const char *a, const char *b, const char *c, size_t d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(SDL_Surface*,SDL_CreateRGBSurface,(Uint32 a, int b, int c, int d, Uint32 e, Uint32 f, Uint32 g, Uint32 h),(a,b,c,d,e,f,g,h),return)\nSDL_DYNAPI_PROC(SDL_Surface*,SDL_CreateRGBSurfaceFrom,(void *a, int b, int c, int d, int e, Uint32 f, Uint32 g, Uint32 h, Uint32 i),(a,b,c,d,e,f,g,h,i),return)\nSDL_DYNAPI_PROC(void,SDL_FreeSurface,(SDL_Surface *a),(a),)\nSDL_DYNAPI_PROC(int,SDL_SetSurfacePalette,(SDL_Surface *a, SDL_Palette *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_LockSurface,(SDL_Surface *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_UnlockSurface,(SDL_Surface *a),(a),)\nSDL_DYNAPI_PROC(SDL_Surface*,SDL_LoadBMP_RW,(SDL_RWops *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_SaveBMP_RW,(SDL_Surface *a, SDL_RWops *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_SetSurfaceRLE,(SDL_Surface *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_SetColorKey,(SDL_Surface *a, int b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_GetColorKey,(SDL_Surface *a, Uint32 *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_SetSurfaceColorMod,(SDL_Surface *a, Uint8 b, Uint8 c, Uint8 d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_GetSurfaceColorMod,(SDL_Surface *a, Uint8 *b, Uint8 *c, Uint8 *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_SetSurfaceAlphaMod,(SDL_Surface *a, Uint8 b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetSurfaceAlphaMod,(SDL_Surface *a, Uint8 *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_SetSurfaceBlendMode,(SDL_Surface *a, SDL_BlendMode b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetSurfaceBlendMode,(SDL_Surface *a, SDL_BlendMode *b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_SetClipRect,(SDL_Surface *a, const SDL_Rect *b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_GetClipRect,(SDL_Surface *a, SDL_Rect *b),(a,b),)\nSDL_DYNAPI_PROC(SDL_Surface*,SDL_ConvertSurface,(SDL_Surface *a, const SDL_PixelFormat *b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(SDL_Surface*,SDL_ConvertSurfaceFormat,(SDL_Surface *a, Uint32 b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_ConvertPixels,(int a, int b, Uint32 c, const void *d, int e, Uint32 f, void *g, int h),(a,b,c,d,e,f,g,h),return)\nSDL_DYNAPI_PROC(int,SDL_FillRect,(SDL_Surface *a, const SDL_Rect *b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_FillRects,(SDL_Surface *a, const SDL_Rect *b, int c, Uint32 d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_UpperBlit,(SDL_Surface *a, const SDL_Rect *b, SDL_Surface *c, SDL_Rect *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_LowerBlit,(SDL_Surface *a, SDL_Rect *b, SDL_Surface *c, SDL_Rect *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_SoftStretch,(SDL_Surface *a, const SDL_Rect *b, SDL_Surface *c, const SDL_Rect *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_UpperBlitScaled,(SDL_Surface *a, const SDL_Rect *b, SDL_Surface *c, SDL_Rect *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_LowerBlitScaled,(SDL_Surface *a, SDL_Rect *b, SDL_Surface *c, SDL_Rect *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_GetWindowWMInfo,(SDL_Window *a, SDL_SysWMinfo *b),(a,b),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetThreadName,(SDL_Thread *a),(a),return)\nSDL_DYNAPI_PROC(SDL_threadID,SDL_ThreadID,(void),(),return)\nSDL_DYNAPI_PROC(SDL_threadID,SDL_GetThreadID,(SDL_Thread *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SetThreadPriority,(SDL_ThreadPriority a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_WaitThread,(SDL_Thread *a, int *b),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_DetachThread,(SDL_Thread *a),(a),)\nSDL_DYNAPI_PROC(SDL_TLSID,SDL_TLSCreate,(void),(),return)\nSDL_DYNAPI_PROC(void*,SDL_TLSGet,(SDL_TLSID a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_TLSSet,(SDL_TLSID a, const void *b, void (*c)(void*)),(a,b,c),return)\nSDL_DYNAPI_PROC(Uint32,SDL_GetTicks,(void),(),return)\nSDL_DYNAPI_PROC(Uint64,SDL_GetPerformanceCounter,(void),(),return)\nSDL_DYNAPI_PROC(Uint64,SDL_GetPerformanceFrequency,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_Delay,(Uint32 a),(a),)\nSDL_DYNAPI_PROC(SDL_TimerID,SDL_AddTimer,(Uint32 a, SDL_TimerCallback b, void *c),(a,b,c),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_RemoveTimer,(SDL_TimerID a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GetNumTouchDevices,(void),(),return)\nSDL_DYNAPI_PROC(SDL_TouchID,SDL_GetTouchDevice,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GetNumTouchFingers,(SDL_TouchID a),(a),return)\nSDL_DYNAPI_PROC(SDL_Finger*,SDL_GetTouchFinger,(SDL_TouchID a, int b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_GetVersion,(SDL_version *a),(a),)\nSDL_DYNAPI_PROC(const char*,SDL_GetRevision,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_GetRevisionNumber,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_GetNumVideoDrivers,(void),(),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetVideoDriver,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_VideoInit,(const char *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_VideoQuit,(void),(),)\nSDL_DYNAPI_PROC(const char*,SDL_GetCurrentVideoDriver,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_GetNumVideoDisplays,(void),(),return)\nSDL_DYNAPI_PROC(const char*,SDL_GetDisplayName,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GetDisplayBounds,(int a, SDL_Rect *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetNumDisplayModes,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GetDisplayMode,(int a, int b, SDL_DisplayMode *c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_GetDesktopDisplayMode,(int a, SDL_DisplayMode *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetCurrentDisplayMode,(int a, SDL_DisplayMode *b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_DisplayMode*,SDL_GetClosestDisplayMode,(int a, const SDL_DisplayMode *b, SDL_DisplayMode *c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_GetWindowDisplayIndex,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SetWindowDisplayMode,(SDL_Window *a, const SDL_DisplayMode *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetWindowDisplayMode,(SDL_Window *a, SDL_DisplayMode *b),(a,b),return)\nSDL_DYNAPI_PROC(Uint32,SDL_GetWindowPixelFormat,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(SDL_Window*,SDL_CreateWindow,(const char *a, int b, int c, int d, int e, Uint32 f),(a,b,c,d,e,f),return)\nSDL_DYNAPI_PROC(SDL_Window*,SDL_CreateWindowFrom,(const void *a),(a),return)\nSDL_DYNAPI_PROC(Uint32,SDL_GetWindowID,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(SDL_Window*,SDL_GetWindowFromID,(Uint32 a),(a),return)\nSDL_DYNAPI_PROC(Uint32,SDL_GetWindowFlags,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_SetWindowTitle,(SDL_Window *a, const char *b),(a,b),)\nSDL_DYNAPI_PROC(const char*,SDL_GetWindowTitle,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_SetWindowIcon,(SDL_Window *a, SDL_Surface *b),(a,b),)\nSDL_DYNAPI_PROC(void*,SDL_SetWindowData,(SDL_Window *a, const char *b, void *c),(a,b,c),return)\nSDL_DYNAPI_PROC(void*,SDL_GetWindowData,(SDL_Window *a, const char *b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_SetWindowPosition,(SDL_Window *a, int b, int c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_GetWindowPosition,(SDL_Window *a, int *b, int *c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_SetWindowSize,(SDL_Window *a, int b, int c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_GetWindowSize,(SDL_Window *a, int *b, int *c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_SetWindowMinimumSize,(SDL_Window *a, int b, int c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_GetWindowMinimumSize,(SDL_Window *a, int *b, int *c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_SetWindowMaximumSize,(SDL_Window *a, int b, int c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_GetWindowMaximumSize,(SDL_Window *a, int *b, int *c),(a,b,c),)\nSDL_DYNAPI_PROC(void,SDL_SetWindowBordered,(SDL_Window *a, SDL_bool b),(a,b),)\nSDL_DYNAPI_PROC(void,SDL_ShowWindow,(SDL_Window *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_HideWindow,(SDL_Window *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_RaiseWindow,(SDL_Window *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_MaximizeWindow,(SDL_Window *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_MinimizeWindow,(SDL_Window *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_RestoreWindow,(SDL_Window *a),(a),)\nSDL_DYNAPI_PROC(int,SDL_SetWindowFullscreen,(SDL_Window *a, Uint32 b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_Surface*,SDL_GetWindowSurface,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_UpdateWindowSurface,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_UpdateWindowSurfaceRects,(SDL_Window *a, const SDL_Rect *b, int c),(a,b,c),return)\nSDL_DYNAPI_PROC(void,SDL_SetWindowGrab,(SDL_Window *a, SDL_bool b),(a,b),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_GetWindowGrab,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SetWindowBrightness,(SDL_Window *a, float b),(a,b),return)\nSDL_DYNAPI_PROC(float,SDL_GetWindowBrightness,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SetWindowGammaRamp,(SDL_Window *a, const Uint16 *b, const Uint16 *c, const Uint16 *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(int,SDL_GetWindowGammaRamp,(SDL_Window *a, Uint16 *b, Uint16 *c, Uint16 *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(void,SDL_DestroyWindow,(SDL_Window *a),(a),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_IsScreenSaverEnabled,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_EnableScreenSaver,(void),(),)\nSDL_DYNAPI_PROC(void,SDL_DisableScreenSaver,(void),(),)\nSDL_DYNAPI_PROC(int,SDL_GL_LoadLibrary,(const char *a),(a),return)\nSDL_DYNAPI_PROC(void*,SDL_GL_GetProcAddress,(const char *a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_GL_UnloadLibrary,(void),(),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_GL_ExtensionSupported,(const char *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GL_SetAttribute,(SDL_GLattr a, int b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GL_GetAttribute,(SDL_GLattr a, int *b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_GLContext,SDL_GL_CreateContext,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GL_MakeCurrent,(SDL_Window *a, SDL_GLContext b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_Window*,SDL_GL_GetCurrentWindow,(void),(),return)\nSDL_DYNAPI_PROC(SDL_GLContext,SDL_GL_GetCurrentContext,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_GL_GetDrawableSize,(SDL_Window *a, int *b, int *c),(a,b,c),)\nSDL_DYNAPI_PROC(int,SDL_GL_SetSwapInterval,(int a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GL_GetSwapInterval,(void),(),return)\nSDL_DYNAPI_PROC(void,SDL_GL_SwapWindow,(SDL_Window *a),(a),)\nSDL_DYNAPI_PROC(void,SDL_GL_DeleteContext,(SDL_GLContext a),(a),)\nSDL_DYNAPI_PROC(int,SDL_vsscanf,(const char *a, const char *b, va_list c),(a,b,c),return)\nSDL_DYNAPI_PROC(int,SDL_GameControllerAddMappingsFromRW,(SDL_RWops *a, int b),(a,b),return)\nSDL_DYNAPI_PROC(void,SDL_GL_ResetAttributes,(void),(),)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasAVX,(void),(),return)\nSDL_DYNAPI_PROC(SDL_AssertionHandler,SDL_GetDefaultAssertionHandler,(void),(),return)\nSDL_DYNAPI_PROC(SDL_AssertionHandler,SDL_GetAssertionHandler,(void **a),(a),return)\n#ifdef __WIN32__\nSDL_DYNAPI_PROC(SDL_bool,SDL_DXGIGetOutputInfo,(int a,int *b, int *c),(a,b,c),return)\n#endif\nSDL_DYNAPI_PROC(SDL_bool,SDL_RenderIsClipEnabled,(SDL_Renderer *a),(a),return)\n#ifdef __WINRT__\nSDL_DYNAPI_PROC(int,SDL_WinRTRunApp,(int a, char **b, void *c),(a,b,c),return)\nSDL_DYNAPI_PROC(const wchar_t*,SDL_WinRTGetFSPathUNICODE,(SDL_WinRT_Path a),(a),return)\nSDL_DYNAPI_PROC(const char*,SDL_WinRTGetFSPathUTF8,(SDL_WinRT_Path a),(a),return)\n#endif\nSDL_DYNAPI_PROC(int,SDL_WarpMouseGlobal,(int a, int b),(a,b),return)\nSDL_DYNAPI_PROC(float,SDL_sqrtf,(float a),(a),return)\nSDL_DYNAPI_PROC(double,SDL_tan,(double a),(a),return)\nSDL_DYNAPI_PROC(float,SDL_tanf,(float a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_CaptureMouse,(SDL_bool a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SetWindowHitTest,(SDL_Window *a, SDL_HitTest b, void *c),(a,b,c),return)\nSDL_DYNAPI_PROC(Uint32,SDL_GetGlobalMouseState,(int *a, int *b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_HasAVX2,(void),(),return)\nSDL_DYNAPI_PROC(int,SDL_QueueAudio,(SDL_AudioDeviceID a, const void *b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(Uint32,SDL_GetQueuedAudioSize,(SDL_AudioDeviceID a),(a),return)\nSDL_DYNAPI_PROC(void,SDL_ClearQueuedAudio,(SDL_AudioDeviceID a),(a),)\nSDL_DYNAPI_PROC(SDL_Window*,SDL_GetGrabbedWindow,(void),(),return)\n#ifdef __WIN32__\nSDL_DYNAPI_PROC(void,SDL_SetWindowsMessageHook,(SDL_WindowsMessageHook a, void *b),(a,b),)\n#endif\nSDL_DYNAPI_PROC(int,SDL_GetDisplayDPI,(int a, float *b, float *c, float *d),(a,b,c,d),return)\nSDL_DYNAPI_PROC(SDL_JoystickPowerLevel,SDL_JoystickCurrentPowerLevel,(SDL_Joystick *a),(a),return)\nSDL_DYNAPI_PROC(SDL_GameController*,SDL_GameControllerFromInstanceID,(SDL_JoystickID a),(a),return)\nSDL_DYNAPI_PROC(SDL_Joystick*,SDL_JoystickFromInstanceID,(SDL_JoystickID a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_GetDisplayUsableBounds,(int a, SDL_Rect *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetWindowBordersSize,(SDL_Window *a, int *b, int *c, int *d, int *e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(int,SDL_SetWindowOpacity,(SDL_Window *a, float b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_GetWindowOpacity,(SDL_Window *a, float *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_SetWindowInputFocus,(SDL_Window *a),(a),return)\nSDL_DYNAPI_PROC(int,SDL_SetWindowModalFor,(SDL_Window *a, SDL_Window *b),(a,b),return)\nSDL_DYNAPI_PROC(int,SDL_RenderSetIntegerScale,(SDL_Renderer *a, SDL_bool b),(a,b),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_RenderGetIntegerScale,(SDL_Renderer *a),(a),return)\nSDL_DYNAPI_PROC(Uint32,SDL_DequeueAudio,(SDL_AudioDeviceID a, void *b, Uint32 c),(a,b,c),return)\nSDL_DYNAPI_PROC(void,SDL_SetWindowResizable,(SDL_Window *a, SDL_bool b),(a,b),)\nSDL_DYNAPI_PROC(SDL_Surface*,SDL_CreateRGBSurfaceWithFormat,(Uint32 a, int b, int c, int d, Uint32 e),(a,b,c,d,e),return)\nSDL_DYNAPI_PROC(SDL_Surface*,SDL_CreateRGBSurfaceWithFormatFrom,(void *a, int b, int c, int d, int e, Uint32 f),(a,b,c,d,e,f),return)\nSDL_DYNAPI_PROC(SDL_bool,SDL_GetHintBoolean,(const char *a, SDL_bool b),(a,b),return)\n"
  },
  {
    "path": "libs/SDL2/src/dynapi/gendynapi.pl",
    "content": "#!/usr/bin/perl -w\n\n#  Simple DirectMedia Layer\n#  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n#\n#  This software is provided 'as-is', without any express or implied\n#  warranty.  In no event will the authors be held liable for any damages\n#  arising from the use of this software.\n#\n#  Permission is granted to anyone to use this software for any purpose,\n#  including commercial applications, and to alter it and redistribute it\n#  freely, subject to the following restrictions:\n#\n#  1. The origin of this software must not be misrepresented; you must not\n#     claim that you wrote the original software. If you use this software\n#     in a product, an acknowledgment in the product documentation would be\n#     appreciated but is not required.\n#  2. Altered source versions must be plainly marked as such, and must not be\n#     misrepresented as being the original software.\n#  3. This notice may not be removed or altered from any source distribution.\n\n# WHAT IS THIS?\n#  When you add a public API to SDL, please run this script, make sure the\n#  output looks sane (hg diff, it adds to existing files), and commit it.\n#  It keeps the dynamic API jump table operating correctly.\n\n# If you wanted this to be readable, you shouldn't have used perl.\n\nuse warnings;\nuse strict;\nuse File::Basename;\n\nchdir(dirname(__FILE__) . '/../..');\nmy $sdl_dynapi_procs_h = \"src/dynapi/SDL_dynapi_procs.h\";\nmy $sdl_dynapi_overrides_h = \"src/dynapi/SDL_dynapi_overrides.h\";\n\nmy %existing = ();\nif (-f $sdl_dynapi_procs_h) {\n    open(SDL_DYNAPI_PROCS_H, '<', $sdl_dynapi_procs_h) or die(\"Can't open $sdl_dynapi_procs_h: $!\\n\");\n    while (<SDL_DYNAPI_PROCS_H>) {\n        if (/\\ASDL_DYNAPI_PROC\\(.*?,(.*?),/) {\n            $existing{$1} = 1;\n        }\n    }\n    close(SDL_DYNAPI_PROCS_H)\n}\n\nopen(SDL_DYNAPI_PROCS_H, '>>', $sdl_dynapi_procs_h) or die(\"Can't open $sdl_dynapi_procs_h: $!\\n\");\nopen(SDL_DYNAPI_OVERRIDES_H, '>>', $sdl_dynapi_overrides_h) or die(\"Can't open $sdl_dynapi_overrides_h: $!\\n\");\n\nopendir(HEADERS, 'include') or die(\"Can't open include dir: $!\\n\");\nwhile (readdir(HEADERS)) {\n    next if not /\\.h\\Z/;\n    my $header = \"include/$_\";\n    open(HEADER, '<', $header) or die(\"Can't open $header: $!\\n\");\n    while (<HEADER>) {\n        chomp;\n        next if not /\\A\\s*extern\\s+DECLSPEC/;\n        my $decl = \"$_ \";\n        if (not $decl =~ /\\)\\s*;/) {\n            while (<HEADER>) {\n                chomp;\n                s/\\A\\s+//;\n                s/\\s+\\Z//;\n                $decl .= \"$_ \";\n                last if /\\)\\s*;/;\n            }\n        }\n\n        $decl =~ s/\\s+\\Z//;\n        #print(\"DECL: [$decl]\\n\");\n\n        if ($decl =~ /\\A\\s*extern\\s+DECLSPEC\\s+(const\\s+|)(unsigned\\s+|)(.*?)\\s*(\\*?)\\s*SDLCALL\\s+(.*?)\\s*\\((.*?)\\);/) {\n            my $rc = \"$1$2$3$4\";\n            my $fn = $5;\n\n            next if $existing{$fn};   # already slotted into the jump table.\n\n            my @params = split(',', $6);\n\n            #print(\"rc == '$rc', fn == '$fn', params == '$params'\\n\");\n\n            my $retstr = ($rc eq 'void') ? '' : 'return';\n            my $paramstr = '(';\n            my $argstr = '(';\n            my $i = 0;\n            foreach (@params) {\n                my $str = $_;\n                $str =~ s/\\A\\s+//;\n                $str =~ s/\\s+\\Z//;\n                #print(\"1PARAM: $str\\n\");\n                if ($str eq 'void') {\n                    $paramstr .= 'void';\n                } elsif ($str eq '...') {\n                    if ($i > 0) {\n                        $paramstr .= ', ';\n                    }\n                    $paramstr .= $str;\n                } elsif ($str =~ /\\A\\s*((const\\s+|)(unsigned\\s+|)([a-zA-Z0-9_]*)\\s*([\\*\\s]*))\\s*(.*?)\\Z/) {\n                    #print(\"PARSED: [$1], [$2], [$3], [$4], [$5]\\n\");\n                    my $type = $1;\n                    my $var = $6;\n                    $type =~ s/\\A\\s+//;\n                    $type =~ s/\\s+\\Z//;\n                    $var =~ s/\\A\\s+//;\n                    $var =~ s/\\s+\\Z//;\n                    $type =~ s/\\s*\\*\\Z/*/g;\n                    $type =~ s/\\s*(\\*+)\\Z/ $1/;\n                    #print(\"SPLIT: ($type, $var)\\n\");\n                    my $name = chr(ord('a') + $i);\n                    if ($i > 0) {\n                        $paramstr .= ', ';\n                        $argstr .= ',';\n                    }\n                    my $spc = ($type =~ /\\*\\Z/) ? '' : ' ';\n                    $paramstr .= \"$type$spc$name\";\n                    $argstr .= \"$name\";\n                }\n                $i++;\n            }\n\n            $paramstr = '(void' if ($i == 0);  # Just to make this consistent.\n\n            $paramstr .= ')';\n            $argstr .= ')';\n\n            print(\"NEW: $decl\\n\");\n            print SDL_DYNAPI_PROCS_H \"SDL_DYNAPI_PROC($rc,$fn,$paramstr,$argstr,$retstr)\\n\";\n            print SDL_DYNAPI_OVERRIDES_H \"#define $fn ${fn}_REAL\\n\";\n        } else {\n            print(\"Failed to parse decl [$decl]!\\n\");\n        }\n    }\n    close(HEADER);\n}\nclosedir(HEADERS);\n\nclose(SDL_DYNAPI_PROCS_H);\nclose(SDL_DYNAPI_OVERRIDES_H);\n\n# vi: set ts=4 sw=4 expandtab:\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_clipboardevents.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Clipboard event handling code for SDL */\n\n#include \"SDL_events.h\"\n#include \"SDL_events_c.h\"\n#include \"SDL_clipboardevents_c.h\"\n\n\nint\nSDL_SendClipboardUpdate(void)\n{\n    int posted;\n\n    /* Post the event, if desired */\n    posted = 0;\n    if (SDL_GetEventState(SDL_CLIPBOARDUPDATE) == SDL_ENABLE) {\n        SDL_Event event;\n        event.type = SDL_CLIPBOARDUPDATE;\n\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n    return (posted);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_clipboardevents_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_clipboardevents_c_h\n#define _SDL_clipboardevents_c_h\n\nextern int SDL_SendClipboardUpdate(void);\n\n#endif /* _SDL_clipboardevents_c_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_dropevents.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Drag and drop event handling code for SDL */\n\n#include \"SDL_events.h\"\n#include \"SDL_events_c.h\"\n#include \"SDL_dropevents_c.h\"\n\n#include \"../video/SDL_sysvideo.h\"  /* for SDL_Window internals. */\n\n\nstatic int\nSDL_SendDrop(SDL_Window *window, const SDL_EventType evtype, const char *data)\n{\n    static SDL_bool app_is_dropping = SDL_FALSE;\n    int posted = 0;\n\n    /* Post the event, if desired */\n    if (SDL_GetEventState(evtype) == SDL_ENABLE) {\n        const SDL_bool need_begin = window ? !window->is_dropping : !app_is_dropping;\n        SDL_Event event;\n\n        if (need_begin) {\n            SDL_zero(event);\n            event.type = SDL_DROPBEGIN;\n\n            if (window) {\n                event.drop.windowID = window->id;\n            }\n\n            posted = (SDL_PushEvent(&event) > 0);\n            if (!posted) {\n                return 0;\n            }\n            if (window) {\n                window->is_dropping = SDL_TRUE;\n            } else {\n                app_is_dropping = SDL_TRUE;\n            }\n        }\n\n        SDL_zero(event);\n        event.type = evtype;\n        event.drop.file = data ? SDL_strdup(data) : NULL;\n        event.drop.windowID = window ? window->id : 0;\n        posted = (SDL_PushEvent(&event) > 0);\n\n        if (posted && (evtype == SDL_DROPCOMPLETE)) {\n            if (window) {\n                window->is_dropping = SDL_FALSE;\n            } else {\n                app_is_dropping = SDL_FALSE;\n            }\n        }\n    }\n    return posted;\n}\n\nint\nSDL_SendDropFile(SDL_Window *window, const char *file)\n{\n    return SDL_SendDrop(window, SDL_DROPFILE, file);\n}\n\nint\nSDL_SendDropText(SDL_Window *window, const char *text)\n{\n    return SDL_SendDrop(window, SDL_DROPTEXT, text);\n}\n\nint\nSDL_SendDropComplete(SDL_Window *window)\n{\n    return SDL_SendDrop(window, SDL_DROPCOMPLETE, NULL);\n}\n\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_dropevents_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_dropevents_c_h\n#define _SDL_dropevents_c_h\n\nextern int SDL_SendDropFile(SDL_Window *window, const char *file);\nextern int SDL_SendDropText(SDL_Window *window, const char *text);\nextern int SDL_SendDropComplete(SDL_Window *window);\n\n#endif /* _SDL_dropevents_c_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_events.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* General event handling code for SDL */\n\n#include \"SDL.h\"\n#include \"SDL_events.h\"\n#include \"SDL_syswm.h\"\n#include \"SDL_thread.h\"\n#include \"SDL_events_c.h\"\n#include \"../timer/SDL_timer_c.h\"\n#if !SDL_JOYSTICK_DISABLED\n#include \"../joystick/SDL_joystick_c.h\"\n#endif\n#include \"../video/SDL_sysvideo.h\"\n\n/* An arbitrary limit so we don't have unbounded growth */\n#define SDL_MAX_QUEUED_EVENTS   65535\n\n/* Public data -- the event filter */\nSDL_EventFilter SDL_EventOK = NULL;\nvoid *SDL_EventOKParam;\n\ntypedef struct SDL_EventWatcher {\n    SDL_EventFilter callback;\n    void *userdata;\n    struct SDL_EventWatcher *next;\n} SDL_EventWatcher;\n\nstatic SDL_EventWatcher *SDL_event_watchers = NULL;\n\ntypedef struct {\n    Uint32 bits[8];\n} SDL_DisabledEventBlock;\n\nstatic SDL_DisabledEventBlock *SDL_disabled_events[256];\nstatic Uint32 SDL_userevents = SDL_USEREVENT;\n\n/* Private data -- event queue */\ntypedef struct _SDL_EventEntry\n{\n    SDL_Event event;\n    SDL_SysWMmsg msg;\n    struct _SDL_EventEntry *prev;\n    struct _SDL_EventEntry *next;\n} SDL_EventEntry;\n\ntypedef struct _SDL_SysWMEntry\n{\n    SDL_SysWMmsg msg;\n    struct _SDL_SysWMEntry *next;\n} SDL_SysWMEntry;\n\nstatic struct\n{\n    SDL_mutex *lock;\n    SDL_atomic_t active;\n    SDL_atomic_t count;\n    int max_events_seen;\n    SDL_EventEntry *head;\n    SDL_EventEntry *tail;\n    SDL_EventEntry *free;\n    SDL_SysWMEntry *wmmsg_used;\n    SDL_SysWMEntry *wmmsg_free;\n} SDL_EventQ = { NULL, { 1 }, { 0 }, 0, NULL, NULL, NULL, NULL, NULL };\n\n\n/* Public functions */\n\nvoid\nSDL_StopEventLoop(void)\n{\n    const char *report = SDL_GetHint(\"SDL_EVENT_QUEUE_STATISTICS\");\n    int i;\n    SDL_EventEntry *entry;\n    SDL_SysWMEntry *wmmsg;\n\n    if (SDL_EventQ.lock) {\n        SDL_LockMutex(SDL_EventQ.lock);\n    }\n\n    SDL_AtomicSet(&SDL_EventQ.active, 0);\n\n    if (report && SDL_atoi(report)) {\n        SDL_Log(\"SDL EVENT QUEUE: Maximum events in-flight: %d\\n\",\n                SDL_EventQ.max_events_seen);\n    }\n\n    /* Clean out EventQ */\n    for (entry = SDL_EventQ.head; entry; ) {\n        SDL_EventEntry *next = entry->next;\n        SDL_free(entry);\n        entry = next;\n    }\n    for (entry = SDL_EventQ.free; entry; ) {\n        SDL_EventEntry *next = entry->next;\n        SDL_free(entry);\n        entry = next;\n    }\n    for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; ) {\n        SDL_SysWMEntry *next = wmmsg->next;\n        SDL_free(wmmsg);\n        wmmsg = next;\n    }\n    for (wmmsg = SDL_EventQ.wmmsg_free; wmmsg; ) {\n        SDL_SysWMEntry *next = wmmsg->next;\n        SDL_free(wmmsg);\n        wmmsg = next;\n    }\n\n    SDL_AtomicSet(&SDL_EventQ.count, 0);\n    SDL_EventQ.max_events_seen = 0;\n    SDL_EventQ.head = NULL;\n    SDL_EventQ.tail = NULL;\n    SDL_EventQ.free = NULL;\n    SDL_EventQ.wmmsg_used = NULL;\n    SDL_EventQ.wmmsg_free = NULL;\n\n    /* Clear disabled event state */\n    for (i = 0; i < SDL_arraysize(SDL_disabled_events); ++i) {\n        SDL_free(SDL_disabled_events[i]);\n        SDL_disabled_events[i] = NULL;\n    }\n\n    while (SDL_event_watchers) {\n        SDL_EventWatcher *tmp = SDL_event_watchers;\n        SDL_event_watchers = tmp->next;\n        SDL_free(tmp);\n    }\n    SDL_EventOK = NULL;\n\n    if (SDL_EventQ.lock) {\n        SDL_UnlockMutex(SDL_EventQ.lock);\n        SDL_DestroyMutex(SDL_EventQ.lock);\n        SDL_EventQ.lock = NULL;\n    }\n}\n\n/* This function (and associated calls) may be called more than once */\nint\nSDL_StartEventLoop(void)\n{\n    /* We'll leave the event queue alone, since we might have gotten\n       some important events at launch (like SDL_DROPFILE)\n\n       FIXME: Does this introduce any other bugs with events at startup?\n     */\n\n    /* Create the lock and set ourselves active */\n#if !SDL_THREADS_DISABLED\n    if (!SDL_EventQ.lock) {\n        SDL_EventQ.lock = SDL_CreateMutex();\n    }\n    if (SDL_EventQ.lock == NULL) {\n        return -1;\n    }\n#endif /* !SDL_THREADS_DISABLED */\n\n    /* Process most event types */\n    SDL_EventState(SDL_TEXTINPUT, SDL_DISABLE);\n    SDL_EventState(SDL_TEXTEDITING, SDL_DISABLE);\n    SDL_EventState(SDL_SYSWMEVENT, SDL_DISABLE);\n\n    SDL_AtomicSet(&SDL_EventQ.active, 1);\n\n    return 0;\n}\n\n\n/* Add an event to the event queue -- called with the queue locked */\nstatic int\nSDL_AddEvent(SDL_Event * event)\n{\n    SDL_EventEntry *entry;\n    const int initial_count = SDL_AtomicGet(&SDL_EventQ.count);\n    int final_count;\n\n    if (initial_count >= SDL_MAX_QUEUED_EVENTS) {\n        SDL_SetError(\"Event queue is full (%d events)\", initial_count);\n        return 0;\n    }\n\n    if (SDL_EventQ.free == NULL) {\n        entry = (SDL_EventEntry *)SDL_malloc(sizeof(*entry));\n        if (!entry) {\n            return 0;\n        }\n    } else {\n        entry = SDL_EventQ.free;\n        SDL_EventQ.free = entry->next;\n    }\n\n    entry->event = *event;\n    if (event->type == SDL_SYSWMEVENT) {\n        entry->msg = *event->syswm.msg;\n        entry->event.syswm.msg = &entry->msg;\n    }\n\n    if (SDL_EventQ.tail) {\n        SDL_EventQ.tail->next = entry;\n        entry->prev = SDL_EventQ.tail;\n        SDL_EventQ.tail = entry;\n        entry->next = NULL;\n    } else {\n        SDL_assert(!SDL_EventQ.head);\n        SDL_EventQ.head = entry;\n        SDL_EventQ.tail = entry;\n        entry->prev = NULL;\n        entry->next = NULL;\n    }\n\n    final_count = SDL_AtomicAdd(&SDL_EventQ.count, 1) + 1;\n    if (final_count > SDL_EventQ.max_events_seen) {\n        SDL_EventQ.max_events_seen = final_count;\n    }\n\n    return 1;\n}\n\n/* Remove an event from the queue -- called with the queue locked */\nstatic void\nSDL_CutEvent(SDL_EventEntry *entry)\n{\n    if (entry->prev) {\n        entry->prev->next = entry->next;\n    }\n    if (entry->next) {\n        entry->next->prev = entry->prev;\n    }\n\n    if (entry == SDL_EventQ.head) {\n        SDL_assert(entry->prev == NULL);\n        SDL_EventQ.head = entry->next;\n    }\n    if (entry == SDL_EventQ.tail) {\n        SDL_assert(entry->next == NULL);\n        SDL_EventQ.tail = entry->prev;\n    }\n\n    entry->next = SDL_EventQ.free;\n    SDL_EventQ.free = entry;\n    SDL_assert(SDL_AtomicGet(&SDL_EventQ.count) > 0);\n    SDL_AtomicAdd(&SDL_EventQ.count, -1);\n}\n\n/* Lock the event queue, take a peep at it, and unlock it */\nint\nSDL_PeepEvents(SDL_Event * events, int numevents, SDL_eventaction action,\n               Uint32 minType, Uint32 maxType)\n{\n    int i, used;\n\n    /* Don't look after we've quit */\n    if (!SDL_AtomicGet(&SDL_EventQ.active)) {\n        /* We get a few spurious events at shutdown, so don't warn then */\n        if (action != SDL_ADDEVENT) {\n            SDL_SetError(\"The event system has been shut down\");\n        }\n        return (-1);\n    }\n    /* Lock the event queue */\n    used = 0;\n    if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {\n        if (action == SDL_ADDEVENT) {\n            for (i = 0; i < numevents; ++i) {\n                used += SDL_AddEvent(&events[i]);\n            }\n        } else {\n            SDL_EventEntry *entry, *next;\n            SDL_SysWMEntry *wmmsg, *wmmsg_next;\n            Uint32 type;\n\n            if (action == SDL_GETEVENT) {\n                /* Clean out any used wmmsg data\n                   FIXME: Do we want to retain the data for some period of time?\n                 */\n                for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; wmmsg = wmmsg_next) {\n                    wmmsg_next = wmmsg->next;\n                    wmmsg->next = SDL_EventQ.wmmsg_free;\n                    SDL_EventQ.wmmsg_free = wmmsg;\n                }\n                SDL_EventQ.wmmsg_used = NULL;\n            }\n\n            for (entry = SDL_EventQ.head; entry && (!events || used < numevents); entry = next) {\n                next = entry->next;\n                type = entry->event.type;\n                if (minType <= type && type <= maxType) {\n                    if (events) {\n                        events[used] = entry->event;\n                        if (entry->event.type == SDL_SYSWMEVENT) {\n                            /* We need to copy the wmmsg somewhere safe.\n                               For now we'll guarantee it's valid at least until\n                               the next call to SDL_PeepEvents()\n                             */\n                            if (SDL_EventQ.wmmsg_free) {\n                                wmmsg = SDL_EventQ.wmmsg_free;\n                                SDL_EventQ.wmmsg_free = wmmsg->next;\n                            } else {\n                                wmmsg = (SDL_SysWMEntry *)SDL_malloc(sizeof(*wmmsg));\n                            }\n                            wmmsg->msg = *entry->event.syswm.msg;\n                            wmmsg->next = SDL_EventQ.wmmsg_used;\n                            SDL_EventQ.wmmsg_used = wmmsg;\n                            events[used].syswm.msg = &wmmsg->msg;\n                        }\n\n                        if (action == SDL_GETEVENT) {\n                            SDL_CutEvent(entry);\n                        }\n                    }\n                    ++used;\n                }\n            }\n        }\n        if (SDL_EventQ.lock) {\n            SDL_UnlockMutex(SDL_EventQ.lock);\n        }\n    } else {\n        return SDL_SetError(\"Couldn't lock event queue\");\n    }\n    return (used);\n}\n\nSDL_bool\nSDL_HasEvent(Uint32 type)\n{\n    return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0);\n}\n\nSDL_bool\nSDL_HasEvents(Uint32 minType, Uint32 maxType)\n{\n    return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0);\n}\n\nvoid\nSDL_FlushEvent(Uint32 type)\n{\n    SDL_FlushEvents(type, type);\n}\n\nvoid\nSDL_FlushEvents(Uint32 minType, Uint32 maxType)\n{\n    /* Don't look after we've quit */\n    if (!SDL_AtomicGet(&SDL_EventQ.active)) {\n        return;\n    }\n\n    /* Make sure the events are current */\n#if 0\n    /* Actually, we can't do this since we might be flushing while processing\n       a resize event, and calling this might trigger further resize events.\n    */\n    SDL_PumpEvents();\n#endif\n\n    /* Lock the event queue */\n    if (SDL_EventQ.lock && SDL_LockMutex(SDL_EventQ.lock) == 0) {\n        SDL_EventEntry *entry, *next;\n        Uint32 type;\n        for (entry = SDL_EventQ.head; entry; entry = next) {\n            next = entry->next;\n            type = entry->event.type;\n            if (minType <= type && type <= maxType) {\n                SDL_CutEvent(entry);\n            }\n        }\n        SDL_UnlockMutex(SDL_EventQ.lock);\n    }\n}\n\n/* Run the system dependent event loops */\nvoid\nSDL_PumpEvents(void)\n{\n    SDL_VideoDevice *_this = SDL_GetVideoDevice();\n\n    /* Get events from the video subsystem */\n    if (_this) {\n        _this->PumpEvents(_this);\n    }\n#if !SDL_JOYSTICK_DISABLED\n    /* Check for joystick state change */\n    if ((!SDL_disabled_events[SDL_JOYAXISMOTION >> 8] || SDL_JoystickEventState(SDL_QUERY))) {\n        SDL_JoystickUpdate();\n    }\n#endif\n\n    SDL_SendPendingQuit();  /* in case we had a signal handler fire, etc. */\n}\n\n/* Public functions */\n\nint\nSDL_PollEvent(SDL_Event * event)\n{\n    return SDL_WaitEventTimeout(event, 0);\n}\n\nint\nSDL_WaitEvent(SDL_Event * event)\n{\n    return SDL_WaitEventTimeout(event, -1);\n}\n\nint\nSDL_WaitEventTimeout(SDL_Event * event, int timeout)\n{\n    Uint32 expiration = 0;\n\n    if (timeout > 0)\n        expiration = SDL_GetTicks() + timeout;\n\n    for (;;) {\n        SDL_PumpEvents();\n        switch (SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) {\n        case -1:\n            return 0;\n        case 0:\n            if (timeout == 0) {\n                /* Polling and no events, just return */\n                return 0;\n            }\n            if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) {\n                /* Timeout expired and no events */\n                return 0;\n            }\n            SDL_Delay(10);\n            break;\n        default:\n            /* Has events */\n            return 1;\n        }\n    }\n}\n\nint\nSDL_PushEvent(SDL_Event * event)\n{\n    SDL_EventWatcher *curr;\n\n    event->common.timestamp = SDL_GetTicks();\n\n    if (SDL_EventOK && !SDL_EventOK(SDL_EventOKParam, event)) {\n        return 0;\n    }\n\n    for (curr = SDL_event_watchers; curr; curr = curr->next) {\n        curr->callback(curr->userdata, event);\n    }\n\n    if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {\n        return -1;\n    }\n\n    SDL_GestureProcessEvent(event);\n\n    return 1;\n}\n\nvoid\nSDL_SetEventFilter(SDL_EventFilter filter, void *userdata)\n{\n    /* Set filter and discard pending events */\n    SDL_EventOK = NULL;\n    SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);\n    SDL_EventOKParam = userdata;\n    SDL_EventOK = filter;\n}\n\nSDL_bool\nSDL_GetEventFilter(SDL_EventFilter * filter, void **userdata)\n{\n    if (filter) {\n        *filter = SDL_EventOK;\n    }\n    if (userdata) {\n        *userdata = SDL_EventOKParam;\n    }\n    return SDL_EventOK ? SDL_TRUE : SDL_FALSE;\n}\n\n/* FIXME: This is not thread-safe yet */\nvoid\nSDL_AddEventWatch(SDL_EventFilter filter, void *userdata)\n{\n    SDL_EventWatcher *watcher, *tail;\n\n    watcher = (SDL_EventWatcher *)SDL_malloc(sizeof(*watcher));\n    if (!watcher) {\n        /* Uh oh... */\n        return;\n    }\n\n    /* create the watcher */\n    watcher->callback = filter;\n    watcher->userdata = userdata;\n    watcher->next = NULL;\n\n    /* add the watcher to the end of the list */\n    if (SDL_event_watchers) {\n        for (tail = SDL_event_watchers; tail->next; tail = tail->next) {\n            continue;\n        }\n        tail->next = watcher;\n    } else {\n        SDL_event_watchers = watcher;\n    }\n}\n\n/* FIXME: This is not thread-safe yet */\nvoid\nSDL_DelEventWatch(SDL_EventFilter filter, void *userdata)\n{\n    SDL_EventWatcher *prev = NULL;\n    SDL_EventWatcher *curr;\n\n    for (curr = SDL_event_watchers; curr; prev = curr, curr = curr->next) {\n        if (curr->callback == filter && curr->userdata == userdata) {\n            if (prev) {\n                prev->next = curr->next;\n            } else {\n                SDL_event_watchers = curr->next;\n            }\n            SDL_free(curr);\n            break;\n        }\n    }\n}\n\nvoid\nSDL_FilterEvents(SDL_EventFilter filter, void *userdata)\n{\n    if (SDL_EventQ.lock && SDL_LockMutex(SDL_EventQ.lock) == 0) {\n        SDL_EventEntry *entry, *next;\n        for (entry = SDL_EventQ.head; entry; entry = next) {\n            next = entry->next;\n            if (!filter(userdata, &entry->event)) {\n                SDL_CutEvent(entry);\n            }\n        }\n        SDL_UnlockMutex(SDL_EventQ.lock);\n    }\n}\n\nUint8\nSDL_EventState(Uint32 type, int state)\n{\n    Uint8 current_state;\n    Uint8 hi = ((type >> 8) & 0xff);\n    Uint8 lo = (type & 0xff);\n\n    if (SDL_disabled_events[hi] &&\n        (SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) {\n        current_state = SDL_DISABLE;\n    } else {\n        current_state = SDL_ENABLE;\n    }\n\n    if (state != current_state)\n    {\n        switch (state) {\n        case SDL_DISABLE:\n            /* Disable this event type and discard pending events */\n            if (!SDL_disabled_events[hi]) {\n                SDL_disabled_events[hi] = (SDL_DisabledEventBlock*) SDL_calloc(1, sizeof(SDL_DisabledEventBlock));\n                if (!SDL_disabled_events[hi]) {\n                    /* Out of memory, nothing we can do... */\n                    break;\n                }\n            }\n            SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31));\n            SDL_FlushEvent(type);\n            break;\n        case SDL_ENABLE:\n            SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31));\n            break;\n        default:\n            /* Querying state... */\n            break;\n        }\n    }\n\n    return current_state;\n}\n\nUint32\nSDL_RegisterEvents(int numevents)\n{\n    Uint32 event_base;\n\n    if ((numevents > 0) && (SDL_userevents+numevents <= SDL_LASTEVENT)) {\n        event_base = SDL_userevents;\n        SDL_userevents += numevents;\n    } else {\n        event_base = (Uint32)-1;\n    }\n    return event_base;\n}\n\nint\nSDL_SendAppEvent(SDL_EventType eventType)\n{\n    int posted;\n\n    posted = 0;\n    if (SDL_GetEventState(eventType) == SDL_ENABLE) {\n        SDL_Event event;\n        event.type = eventType;\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n    return (posted);\n}\n\nint\nSDL_SendSysWMEvent(SDL_SysWMmsg * message)\n{\n    int posted;\n\n    posted = 0;\n    if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) {\n        SDL_Event event;\n        SDL_memset(&event, 0, sizeof(event));\n        event.type = SDL_SYSWMEVENT;\n        event.syswm.msg = message;\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n    /* Update internal event state */\n    return (posted);\n}\n\nint\nSDL_SendKeymapChangedEvent(void)\n{\n    return SDL_SendAppEvent(SDL_KEYMAPCHANGED);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_events_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Useful functions and variables from SDL_events.c */\n#include \"SDL_events.h\"\n#include \"SDL_thread.h\"\n#include \"SDL_clipboardevents_c.h\"\n#include \"SDL_dropevents_c.h\"\n#include \"SDL_gesture_c.h\"\n#include \"SDL_keyboard_c.h\"\n#include \"SDL_mouse_c.h\"\n#include \"SDL_touch_c.h\"\n#include \"SDL_windowevents_c.h\"\n\n/* Start and stop the event processing loop */\nextern int SDL_StartEventLoop(void);\nextern void SDL_StopEventLoop(void);\nextern void SDL_QuitInterrupt(void);\n\nextern int SDL_SendAppEvent(SDL_EventType eventType);\nextern int SDL_SendSysWMEvent(SDL_SysWMmsg * message);\nextern int SDL_SendKeymapChangedEvent(void);\n\nextern int SDL_QuitInit(void);\nextern int SDL_SendQuit(void);\nextern void SDL_QuitQuit(void);\n\nextern void SDL_SendPendingQuit(void);\n\n/* The event filter function */\nextern SDL_EventFilter SDL_EventOK;\nextern void *SDL_EventOKParam;\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_gesture.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"../SDL_internal.h\"\n\n/* General gesture handling code for SDL */\n\n#include \"SDL_events.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_events_c.h\"\n#include \"SDL_gesture_c.h\"\n\n/*\n#include <stdio.h>\n*/\n\n/* TODO: Replace with malloc */\n\n#define MAXPATHSIZE 1024\n\n#define DOLLARNPOINTS 64\n#define DOLLARSIZE 256\n\n#define ENABLE_DOLLAR\n\n#define PHI 0.618033989\n\ntypedef struct {\n    float x,y;\n} SDL_FloatPoint;\n\ntypedef struct {\n    float length;\n\n    int numPoints;\n    SDL_FloatPoint p[MAXPATHSIZE];\n} SDL_DollarPath;\n\ntypedef struct {\n    SDL_FloatPoint path[DOLLARNPOINTS];\n    unsigned long hash;\n} SDL_DollarTemplate;\n\ntypedef struct {\n    SDL_TouchID id;\n    SDL_FloatPoint centroid;\n    SDL_DollarPath dollarPath;\n    Uint16 numDownFingers;\n\n    int numDollarTemplates;\n    SDL_DollarTemplate *dollarTemplate;\n\n    SDL_bool recording;\n} SDL_GestureTouch;\n\nSDL_GestureTouch *SDL_gestureTouch;\nint SDL_numGestureTouches = 0;\nSDL_bool recordAll;\n\n#if 0\nstatic void PrintPath(SDL_FloatPoint *path)\n{\n    int i;\n    printf(\"Path:\");\n    for (i=0; i<DOLLARNPOINTS; i++) {\n        printf(\" (%f,%f)\",path[i].x,path[i].y);\n    }\n    printf(\"\\n\");\n}\n#endif\n\nint SDL_RecordGesture(SDL_TouchID touchId)\n{\n    int i;\n    if (touchId < 0) recordAll = SDL_TRUE;\n    for (i = 0; i < SDL_numGestureTouches; i++) {\n        if ((touchId < 0) || (SDL_gestureTouch[i].id == touchId)) {\n            SDL_gestureTouch[i].recording = SDL_TRUE;\n            if (touchId >= 0)\n                return 1;\n        }\n    }\n    return (touchId < 0);\n}\n\nstatic unsigned long SDL_HashDollar(SDL_FloatPoint* points)\n{\n    unsigned long hash = 5381;\n    int i;\n    for (i = 0; i < DOLLARNPOINTS; i++) {\n        hash = ((hash<<5) + hash) + (unsigned long)points[i].x;\n        hash = ((hash<<5) + hash) + (unsigned long)points[i].y;\n    }\n    return hash;\n}\n\n\nstatic int SaveTemplate(SDL_DollarTemplate *templ, SDL_RWops *dst)\n{\n    if (dst == NULL) {\n        return 0;\n    }\n\n    /* No Longer storing the Hash, rehash on load */\n    /* if (SDL_RWops.write(dst, &(templ->hash), sizeof(templ->hash), 1) != 1) return 0; */\n\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n    if (SDL_RWwrite(dst, templ->path,\n                    sizeof(templ->path[0]),DOLLARNPOINTS) != DOLLARNPOINTS) {\n        return 0;\n    }\n#else\n    {\n        SDL_DollarTemplate copy = *templ;\n        SDL_FloatPoint *p = copy.path;\n        int i;\n        for (i = 0; i < DOLLARNPOINTS; i++, p++) {\n            p->x = SDL_SwapFloatLE(p->x);\n            p->y = SDL_SwapFloatLE(p->y);\n        }\n\n        if (SDL_RWwrite(dst, copy.path,\n                        sizeof(copy.path[0]),DOLLARNPOINTS) != DOLLARNPOINTS) {\n            return 0;\n        }\n    }\n#endif\n\n    return 1;\n}\n\n\nint SDL_SaveAllDollarTemplates(SDL_RWops *dst)\n{\n    int i,j,rtrn = 0;\n    for (i = 0; i < SDL_numGestureTouches; i++) {\n        SDL_GestureTouch* touch = &SDL_gestureTouch[i];\n        for (j = 0; j < touch->numDollarTemplates; j++) {\n            rtrn += SaveTemplate(&touch->dollarTemplate[j], dst);\n        }\n    }\n    return rtrn;\n}\n\nint SDL_SaveDollarTemplate(SDL_GestureID gestureId, SDL_RWops *dst)\n{\n    int i,j;\n    for (i = 0; i < SDL_numGestureTouches; i++) {\n        SDL_GestureTouch* touch = &SDL_gestureTouch[i];\n        for (j = 0; j < touch->numDollarTemplates; j++) {\n            if (touch->dollarTemplate[j].hash == gestureId) {\n                return SaveTemplate(&touch->dollarTemplate[j], dst);\n            }\n        }\n    }\n    return SDL_SetError(\"Unknown gestureId\");\n}\n\n/* path is an already sampled set of points\nReturns the index of the gesture on success, or -1 */\nstatic int SDL_AddDollarGesture_one(SDL_GestureTouch* inTouch, SDL_FloatPoint* path)\n{\n    SDL_DollarTemplate* dollarTemplate;\n    SDL_DollarTemplate *templ;\n    int index;\n\n    index = inTouch->numDollarTemplates;\n    dollarTemplate =\n        (SDL_DollarTemplate *)SDL_realloc(inTouch->dollarTemplate,\n                                          (index + 1) *\n                                          sizeof(SDL_DollarTemplate));\n    if (!dollarTemplate) {\n        return SDL_OutOfMemory();\n    }\n    inTouch->dollarTemplate = dollarTemplate;\n\n    templ = &inTouch->dollarTemplate[index];\n    SDL_memcpy(templ->path, path, DOLLARNPOINTS*sizeof(SDL_FloatPoint));\n    templ->hash = SDL_HashDollar(templ->path);\n    inTouch->numDollarTemplates++;\n\n    return index;\n}\n\nstatic int SDL_AddDollarGesture(SDL_GestureTouch* inTouch, SDL_FloatPoint* path)\n{\n    int index = -1;\n    int i = 0;\n    if (inTouch == NULL) {\n        if (SDL_numGestureTouches == 0) return SDL_SetError(\"no gesture touch devices registered\");\n        for (i = 0; i < SDL_numGestureTouches; i++) {\n            inTouch = &SDL_gestureTouch[i];\n            index = SDL_AddDollarGesture_one(inTouch, path);\n            if (index < 0)\n                return -1;\n        }\n        /* Use the index of the last one added. */\n        return index;\n    }\n    return SDL_AddDollarGesture_one(inTouch, path);\n}\n\nint SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src)\n{\n    int i,loaded = 0;\n    SDL_GestureTouch *touch = NULL;\n    if (src == NULL) return 0;\n    if (touchId >= 0) {\n        for (i = 0; i < SDL_numGestureTouches; i++) {\n            if (SDL_gestureTouch[i].id == touchId) {\n                touch = &SDL_gestureTouch[i];\n            }\n        }\n        if (touch == NULL) {\n            return SDL_SetError(\"given touch id not found\");\n        }\n    }\n\n    while (1) {\n        SDL_DollarTemplate templ;\n\n        if (SDL_RWread(src,templ.path,sizeof(templ.path[0]),DOLLARNPOINTS) < DOLLARNPOINTS) {\n            if (loaded == 0) {\n                return SDL_SetError(\"could not read any dollar gesture from rwops\");\n            }\n            break;\n        }\n\n#if SDL_BYTEORDER != SDL_LIL_ENDIAN\n        for (i = 0; i < DOLLARNPOINTS; i++) {\n            SDL_FloatPoint *p = &templ.path[i];\n            p->x = SDL_SwapFloatLE(p->x);\n            p->y = SDL_SwapFloatLE(p->y);\n        }\n#endif\n\n        if (touchId >= 0) {\n            /* printf(\"Adding loaded gesture to 1 touch\\n\"); */\n            if (SDL_AddDollarGesture(touch, templ.path) >= 0)\n                loaded++;\n        }\n        else {\n            /* printf(\"Adding to: %i touches\\n\",SDL_numGestureTouches); */\n            for (i = 0; i < SDL_numGestureTouches; i++) {\n                touch = &SDL_gestureTouch[i];\n                /* printf(\"Adding loaded gesture to + touches\\n\"); */\n                /* TODO: What if this fails? */\n                SDL_AddDollarGesture(touch,templ.path);\n            }\n            loaded++;\n        }\n    }\n\n    return loaded;\n}\n\n\nstatic float dollarDifference(SDL_FloatPoint* points,SDL_FloatPoint* templ,float ang)\n{\n    /*  SDL_FloatPoint p[DOLLARNPOINTS]; */\n    float dist = 0;\n    SDL_FloatPoint p;\n    int i;\n    for (i = 0; i < DOLLARNPOINTS; i++) {\n        p.x = (float)(points[i].x * SDL_cos(ang) - points[i].y * SDL_sin(ang));\n        p.y = (float)(points[i].x * SDL_sin(ang) + points[i].y * SDL_cos(ang));\n        dist += (float)(SDL_sqrt((p.x-templ[i].x)*(p.x-templ[i].x)+\n                                 (p.y-templ[i].y)*(p.y-templ[i].y)));\n    }\n    return dist/DOLLARNPOINTS;\n\n}\n\nstatic float bestDollarDifference(SDL_FloatPoint* points,SDL_FloatPoint* templ)\n{\n    /*------------BEGIN DOLLAR BLACKBOX------------------\n      -TRANSLATED DIRECTLY FROM PSUDEO-CODE AVAILABLE AT-\n      -\"http://depts.washington.edu/aimgroup/proj/dollar/\"\n    */\n    double ta = -M_PI/4;\n    double tb = M_PI/4;\n    double dt = M_PI/90;\n    float x1 = (float)(PHI*ta + (1-PHI)*tb);\n    float f1 = dollarDifference(points,templ,x1);\n    float x2 = (float)((1-PHI)*ta + PHI*tb);\n    float f2 = dollarDifference(points,templ,x2);\n    while (SDL_fabs(ta-tb) > dt) {\n        if (f1 < f2) {\n            tb = x2;\n            x2 = x1;\n            f2 = f1;\n            x1 = (float)(PHI*ta + (1-PHI)*tb);\n            f1 = dollarDifference(points,templ,x1);\n        }\n        else {\n            ta = x1;\n            x1 = x2;\n            f1 = f2;\n            x2 = (float)((1-PHI)*ta + PHI*tb);\n            f2 = dollarDifference(points,templ,x2);\n        }\n    }\n    /*\n      if (f1 <= f2)\n          printf(\"Min angle (x1): %f\\n\",x1);\n      else if (f1 >  f2)\n          printf(\"Min angle (x2): %f\\n\",x2);\n    */\n    return SDL_min(f1,f2);\n}\n\n/* DollarPath contains raw points, plus (possibly) the calculated length */\nstatic int dollarNormalize(const SDL_DollarPath *path,SDL_FloatPoint *points)\n{\n    int i;\n    float interval;\n    float dist;\n    int numPoints = 0;\n    SDL_FloatPoint centroid;\n    float xmin,xmax,ymin,ymax;\n    float ang;\n    float w,h;\n    float length = path->length;\n\n    /* Calculate length if it hasn't already been done */\n    if (length <= 0) {\n        for (i=1;i < path->numPoints; i++) {\n            float dx = path->p[i  ].x - path->p[i-1].x;\n            float dy = path->p[i  ].y - path->p[i-1].y;\n            length += (float)(SDL_sqrt(dx*dx+dy*dy));\n        }\n    }\n\n    /* Resample */\n    interval = length/(DOLLARNPOINTS - 1);\n    dist = interval;\n\n    centroid.x = 0;centroid.y = 0;\n\n    /* printf(\"(%f,%f)\\n\",path->p[path->numPoints-1].x,path->p[path->numPoints-1].y); */\n    for (i = 1; i < path->numPoints; i++) {\n        float d = (float)(SDL_sqrt((path->p[i-1].x-path->p[i].x)*(path->p[i-1].x-path->p[i].x)+\n                                   (path->p[i-1].y-path->p[i].y)*(path->p[i-1].y-path->p[i].y)));\n        /* printf(\"d = %f dist = %f/%f\\n\",d,dist,interval); */\n        while (dist + d > interval) {\n            points[numPoints].x = path->p[i-1].x +\n                ((interval-dist)/d)*(path->p[i].x-path->p[i-1].x);\n            points[numPoints].y = path->p[i-1].y +\n                ((interval-dist)/d)*(path->p[i].y-path->p[i-1].y);\n            centroid.x += points[numPoints].x;\n            centroid.y += points[numPoints].y;\n            numPoints++;\n\n            dist -= interval;\n        }\n        dist += d;\n    }\n    if (numPoints < DOLLARNPOINTS-1) {\n        SDL_SetError(\"ERROR: NumPoints = %i\\n\",numPoints);\n        return 0;\n    }\n    /* copy the last point */\n    points[DOLLARNPOINTS-1] = path->p[path->numPoints-1];\n    numPoints = DOLLARNPOINTS;\n\n    centroid.x /= numPoints;\n    centroid.y /= numPoints;\n\n    /* printf(\"Centroid (%f,%f)\",centroid.x,centroid.y); */\n    /* Rotate Points so point 0 is left of centroid and solve for the bounding box */\n    xmin = centroid.x;\n    xmax = centroid.x;\n    ymin = centroid.y;\n    ymax = centroid.y;\n\n    ang = (float)(SDL_atan2(centroid.y - points[0].y,\n                            centroid.x - points[0].x));\n\n    for (i = 0; i<numPoints; i++) {\n        float px = points[i].x;\n        float py = points[i].y;\n        points[i].x = (float)((px - centroid.x)*SDL_cos(ang) -\n                              (py - centroid.y)*SDL_sin(ang) + centroid.x);\n        points[i].y = (float)((px - centroid.x)*SDL_sin(ang) +\n                              (py - centroid.y)*SDL_cos(ang) + centroid.y);\n\n\n        if (points[i].x < xmin) xmin = points[i].x;\n        if (points[i].x > xmax) xmax = points[i].x;\n        if (points[i].y < ymin) ymin = points[i].y;\n        if (points[i].y > ymax) ymax = points[i].y;\n    }\n\n    /* Scale points to DOLLARSIZE, and translate to the origin */\n    w = xmax-xmin;\n    h = ymax-ymin;\n\n    for (i=0; i<numPoints; i++) {\n        points[i].x = (points[i].x - centroid.x)*DOLLARSIZE/w;\n        points[i].y = (points[i].y - centroid.y)*DOLLARSIZE/h;\n    }\n    return numPoints;\n}\n\nstatic float dollarRecognize(const SDL_DollarPath *path,int *bestTempl,SDL_GestureTouch* touch)\n{\n    SDL_FloatPoint points[DOLLARNPOINTS];\n    int i;\n    float bestDiff = 10000;\n\n    SDL_memset(points, 0, sizeof(points));\n\n    dollarNormalize(path,points);\n\n    /* PrintPath(points); */\n    *bestTempl = -1;\n    for (i = 0; i < touch->numDollarTemplates; i++) {\n        float diff = bestDollarDifference(points,touch->dollarTemplate[i].path);\n        if (diff < bestDiff) {bestDiff = diff; *bestTempl = i;}\n    }\n    return bestDiff;\n}\n\nint SDL_GestureAddTouch(SDL_TouchID touchId)\n{\n    SDL_GestureTouch *gestureTouch = (SDL_GestureTouch *)SDL_realloc(SDL_gestureTouch,\n                                                                     (SDL_numGestureTouches + 1) *\n                                                                     sizeof(SDL_GestureTouch));\n\n    if (!gestureTouch) {\n        return SDL_OutOfMemory();\n    }\n\n    SDL_gestureTouch = gestureTouch;\n\n    SDL_zero(SDL_gestureTouch[SDL_numGestureTouches]);\n    SDL_gestureTouch[SDL_numGestureTouches].id = touchId;\n    SDL_numGestureTouches++;\n    return 0;\n}\n\nstatic SDL_GestureTouch * SDL_GetGestureTouch(SDL_TouchID id)\n{\n    int i;\n    for (i = 0; i < SDL_numGestureTouches; i++) {\n        /* printf(\"%i ?= %i\\n\",SDL_gestureTouch[i].id,id); */\n        if (SDL_gestureTouch[i].id == id)\n            return &SDL_gestureTouch[i];\n    }\n    return NULL;\n}\n\nint SDL_SendGestureMulti(SDL_GestureTouch* touch,float dTheta,float dDist)\n{\n    SDL_Event event;\n    event.mgesture.type = SDL_MULTIGESTURE;\n    event.mgesture.touchId = touch->id;\n    event.mgesture.x = touch->centroid.x;\n    event.mgesture.y = touch->centroid.y;\n    event.mgesture.dTheta = dTheta;\n    event.mgesture.dDist = dDist;\n    event.mgesture.numFingers = touch->numDownFingers;\n    return SDL_PushEvent(&event) > 0;\n}\n\nstatic int SDL_SendGestureDollar(SDL_GestureTouch* touch,\n                          SDL_GestureID gestureId,float error)\n{\n    SDL_Event event;\n    event.dgesture.type = SDL_DOLLARGESTURE;\n    event.dgesture.touchId = touch->id;\n    event.dgesture.x = touch->centroid.x;\n    event.dgesture.y = touch->centroid.y;\n    event.dgesture.gestureId = gestureId;\n    event.dgesture.error = error;\n    /* A finger came up to trigger this event. */\n    event.dgesture.numFingers = touch->numDownFingers + 1;\n    return SDL_PushEvent(&event) > 0;\n}\n\n\nstatic int SDL_SendDollarRecord(SDL_GestureTouch* touch,SDL_GestureID gestureId)\n{\n    SDL_Event event;\n    event.dgesture.type = SDL_DOLLARRECORD;\n    event.dgesture.touchId = touch->id;\n    event.dgesture.gestureId = gestureId;\n    return SDL_PushEvent(&event) > 0;\n}\n\n\nvoid SDL_GestureProcessEvent(SDL_Event* event)\n{\n    float x,y;\n    int index;\n    int i;\n    float pathDx, pathDy;\n    SDL_FloatPoint lastP;\n    SDL_FloatPoint lastCentroid;\n    float lDist;\n    float Dist;\n    float dtheta;\n    float dDist;\n\n    if (event->type == SDL_FINGERMOTION ||\n        event->type == SDL_FINGERDOWN ||\n        event->type == SDL_FINGERUP) {\n        SDL_GestureTouch* inTouch = SDL_GetGestureTouch(event->tfinger.touchId);\n\n        /* Shouldn't be possible */\n        if (inTouch == NULL) return;\n\n        x = event->tfinger.x;\n        y = event->tfinger.y;\n\n        /* Finger Up */\n        if (event->type == SDL_FINGERUP) {\n            SDL_FloatPoint path[DOLLARNPOINTS];\n\n            inTouch->numDownFingers--;\n\n#ifdef ENABLE_DOLLAR\n            if (inTouch->recording) {\n                inTouch->recording = SDL_FALSE;\n                dollarNormalize(&inTouch->dollarPath,path);\n                /* PrintPath(path); */\n                if (recordAll) {\n                    index = SDL_AddDollarGesture(NULL,path);\n                    for (i = 0; i < SDL_numGestureTouches; i++)\n                        SDL_gestureTouch[i].recording = SDL_FALSE;\n                }\n                else {\n                    index = SDL_AddDollarGesture(inTouch,path);\n                }\n\n                if (index >= 0) {\n                    SDL_SendDollarRecord(inTouch,inTouch->dollarTemplate[index].hash);\n                }\n                else {\n                    SDL_SendDollarRecord(inTouch,-1);\n                }\n            }\n            else {\n                int bestTempl;\n                float error;\n                error = dollarRecognize(&inTouch->dollarPath,\n                                        &bestTempl,inTouch);\n                if (bestTempl >= 0){\n                    /* Send Event */\n                    unsigned long gestureId = inTouch->dollarTemplate[bestTempl].hash;\n                    SDL_SendGestureDollar(inTouch,gestureId,error);\n                    /* printf (\"%s\\n\",);(\"Dollar error: %f\\n\",error); */\n                }\n            }\n#endif\n            /* inTouch->gestureLast[j] = inTouch->gestureLast[inTouch->numDownFingers]; */\n            if (inTouch->numDownFingers > 0) {\n                inTouch->centroid.x = (inTouch->centroid.x*(inTouch->numDownFingers+1)-\n                                       x)/inTouch->numDownFingers;\n                inTouch->centroid.y = (inTouch->centroid.y*(inTouch->numDownFingers+1)-\n                                       y)/inTouch->numDownFingers;\n            }\n        }\n        else if (event->type == SDL_FINGERMOTION) {\n            float dx = event->tfinger.dx;\n            float dy = event->tfinger.dy;\n#ifdef ENABLE_DOLLAR\n            SDL_DollarPath* path = &inTouch->dollarPath;\n            if (path->numPoints < MAXPATHSIZE) {\n                path->p[path->numPoints].x = inTouch->centroid.x;\n                path->p[path->numPoints].y = inTouch->centroid.y;\n                pathDx =\n                    (path->p[path->numPoints].x-path->p[path->numPoints-1].x);\n                pathDy =\n                    (path->p[path->numPoints].y-path->p[path->numPoints-1].y);\n                path->length += (float)SDL_sqrt(pathDx*pathDx + pathDy*pathDy);\n                path->numPoints++;\n            }\n#endif\n            lastP.x = x - dx;\n            lastP.y = y - dy;\n            lastCentroid = inTouch->centroid;\n\n            inTouch->centroid.x += dx/inTouch->numDownFingers;\n            inTouch->centroid.y += dy/inTouch->numDownFingers;\n            /* printf(\"Centrid : (%f,%f)\\n\",inTouch->centroid.x,inTouch->centroid.y); */\n            if (inTouch->numDownFingers > 1) {\n                SDL_FloatPoint lv; /* Vector from centroid to last x,y position */\n                SDL_FloatPoint v; /* Vector from centroid to current x,y position */\n                /* lv = inTouch->gestureLast[j].cv; */\n                lv.x = lastP.x - lastCentroid.x;\n                lv.y = lastP.y - lastCentroid.y;\n                lDist = (float)SDL_sqrt(lv.x*lv.x + lv.y*lv.y);\n                /* printf(\"lDist = %f\\n\",lDist); */\n                v.x = x - inTouch->centroid.x;\n                v.y = y - inTouch->centroid.y;\n                /* inTouch->gestureLast[j].cv = v; */\n                Dist = (float)SDL_sqrt(v.x*v.x+v.y*v.y);\n                /* SDL_cos(dTheta) = (v . lv)/(|v| * |lv|) */\n\n                /* Normalize Vectors to simplify angle calculation */\n                lv.x/=lDist;\n                lv.y/=lDist;\n                v.x/=Dist;\n                v.y/=Dist;\n                dtheta = (float)SDL_atan2(lv.x*v.y - lv.y*v.x,lv.x*v.x + lv.y*v.y);\n\n                dDist = (Dist - lDist);\n                if (lDist == 0) {dDist = 0;dtheta = 0;} /* To avoid impossible values */\n\n                /* inTouch->gestureLast[j].dDist = dDist;\n                inTouch->gestureLast[j].dtheta = dtheta;\n\n                printf(\"dDist = %f, dTheta = %f\\n\",dDist,dtheta);\n                gdtheta = gdtheta*.9 + dtheta*.1;\n                gdDist  =  gdDist*.9 +  dDist*.1\n                knob.r += dDist/numDownFingers;\n                knob.ang += dtheta;\n                printf(\"thetaSum = %f, distSum = %f\\n\",gdtheta,gdDist);\n                printf(\"id: %i dTheta = %f, dDist = %f\\n\",j,dtheta,dDist); */\n                SDL_SendGestureMulti(inTouch,dtheta,dDist);\n            }\n            else {\n                /* inTouch->gestureLast[j].dDist = 0;\n                inTouch->gestureLast[j].dtheta = 0;\n                inTouch->gestureLast[j].cv.x = 0;\n                inTouch->gestureLast[j].cv.y = 0; */\n            }\n            /* inTouch->gestureLast[j].f.p.x = x;\n            inTouch->gestureLast[j].f.p.y = y;\n            break;\n            pressure? */\n        }\n        else if (event->type == SDL_FINGERDOWN) {\n\n            inTouch->numDownFingers++;\n            inTouch->centroid.x = (inTouch->centroid.x*(inTouch->numDownFingers - 1)+\n                                   x)/inTouch->numDownFingers;\n            inTouch->centroid.y = (inTouch->centroid.y*(inTouch->numDownFingers - 1)+\n                                   y)/inTouch->numDownFingers;\n            /* printf(\"Finger Down: (%f,%f). Centroid: (%f,%f\\n\",x,y,\n                 inTouch->centroid.x,inTouch->centroid.y); */\n\n#ifdef ENABLE_DOLLAR\n            inTouch->dollarPath.length = 0;\n            inTouch->dollarPath.p[0].x = x;\n            inTouch->dollarPath.p[0].y = y;\n            inTouch->dollarPath.numPoints = 1;\n#endif\n        }\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_gesture_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_gesture_c_h\n#define _SDL_gesture_c_h\n\nextern int SDL_GestureAddTouch(SDL_TouchID touchId);\n\nextern void SDL_GestureProcessEvent(SDL_Event* event);\n\nextern int SDL_RecordGesture(SDL_TouchID touchId);\n\n#endif /* _SDL_gesture_c_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_keyboard.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* General keyboard handling code for SDL */\n\n#include \"SDL_timer.h\"\n#include \"SDL_events.h\"\n#include \"SDL_events_c.h\"\n#include \"SDL_assert.h\"\n#include \"../video/SDL_sysvideo.h\"\n\n\n/* #define DEBUG_KEYBOARD */\n\n/* Global keyboard information */\n\ntypedef struct SDL_Keyboard SDL_Keyboard;\n\nstruct SDL_Keyboard\n{\n    /* Data common to all keyboards */\n    SDL_Window *focus;\n    Uint16 modstate;\n    Uint8 keystate[SDL_NUM_SCANCODES];\n    SDL_Keycode keymap[SDL_NUM_SCANCODES];\n};\n\nstatic SDL_Keyboard SDL_keyboard;\n\nstatic const SDL_Keycode SDL_default_keymap[SDL_NUM_SCANCODES] = {\n    0, 0, 0, 0,\n    'a',\n    'b',\n    'c',\n    'd',\n    'e',\n    'f',\n    'g',\n    'h',\n    'i',\n    'j',\n    'k',\n    'l',\n    'm',\n    'n',\n    'o',\n    'p',\n    'q',\n    'r',\n    's',\n    't',\n    'u',\n    'v',\n    'w',\n    'x',\n    'y',\n    'z',\n    '1',\n    '2',\n    '3',\n    '4',\n    '5',\n    '6',\n    '7',\n    '8',\n    '9',\n    '0',\n    SDLK_RETURN,\n    SDLK_ESCAPE,\n    SDLK_BACKSPACE,\n    SDLK_TAB,\n    SDLK_SPACE,\n    '-',\n    '=',\n    '[',\n    ']',\n    '\\\\',\n    '#',\n    ';',\n    '\\'',\n    '`',\n    ',',\n    '.',\n    '/',\n    SDLK_CAPSLOCK,\n    SDLK_F1,\n    SDLK_F2,\n    SDLK_F3,\n    SDLK_F4,\n    SDLK_F5,\n    SDLK_F6,\n    SDLK_F7,\n    SDLK_F8,\n    SDLK_F9,\n    SDLK_F10,\n    SDLK_F11,\n    SDLK_F12,\n    SDLK_PRINTSCREEN,\n    SDLK_SCROLLLOCK,\n    SDLK_PAUSE,\n    SDLK_INSERT,\n    SDLK_HOME,\n    SDLK_PAGEUP,\n    SDLK_DELETE,\n    SDLK_END,\n    SDLK_PAGEDOWN,\n    SDLK_RIGHT,\n    SDLK_LEFT,\n    SDLK_DOWN,\n    SDLK_UP,\n    SDLK_NUMLOCKCLEAR,\n    SDLK_KP_DIVIDE,\n    SDLK_KP_MULTIPLY,\n    SDLK_KP_MINUS,\n    SDLK_KP_PLUS,\n    SDLK_KP_ENTER,\n    SDLK_KP_1,\n    SDLK_KP_2,\n    SDLK_KP_3,\n    SDLK_KP_4,\n    SDLK_KP_5,\n    SDLK_KP_6,\n    SDLK_KP_7,\n    SDLK_KP_8,\n    SDLK_KP_9,\n    SDLK_KP_0,\n    SDLK_KP_PERIOD,\n    0,\n    SDLK_APPLICATION,\n    SDLK_POWER,\n    SDLK_KP_EQUALS,\n    SDLK_F13,\n    SDLK_F14,\n    SDLK_F15,\n    SDLK_F16,\n    SDLK_F17,\n    SDLK_F18,\n    SDLK_F19,\n    SDLK_F20,\n    SDLK_F21,\n    SDLK_F22,\n    SDLK_F23,\n    SDLK_F24,\n    SDLK_EXECUTE,\n    SDLK_HELP,\n    SDLK_MENU,\n    SDLK_SELECT,\n    SDLK_STOP,\n    SDLK_AGAIN,\n    SDLK_UNDO,\n    SDLK_CUT,\n    SDLK_COPY,\n    SDLK_PASTE,\n    SDLK_FIND,\n    SDLK_MUTE,\n    SDLK_VOLUMEUP,\n    SDLK_VOLUMEDOWN,\n    0, 0, 0,\n    SDLK_KP_COMMA,\n    SDLK_KP_EQUALSAS400,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    SDLK_ALTERASE,\n    SDLK_SYSREQ,\n    SDLK_CANCEL,\n    SDLK_CLEAR,\n    SDLK_PRIOR,\n    SDLK_RETURN2,\n    SDLK_SEPARATOR,\n    SDLK_OUT,\n    SDLK_OPER,\n    SDLK_CLEARAGAIN,\n    SDLK_CRSEL,\n    SDLK_EXSEL,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    SDLK_KP_00,\n    SDLK_KP_000,\n    SDLK_THOUSANDSSEPARATOR,\n    SDLK_DECIMALSEPARATOR,\n    SDLK_CURRENCYUNIT,\n    SDLK_CURRENCYSUBUNIT,\n    SDLK_KP_LEFTPAREN,\n    SDLK_KP_RIGHTPAREN,\n    SDLK_KP_LEFTBRACE,\n    SDLK_KP_RIGHTBRACE,\n    SDLK_KP_TAB,\n    SDLK_KP_BACKSPACE,\n    SDLK_KP_A,\n    SDLK_KP_B,\n    SDLK_KP_C,\n    SDLK_KP_D,\n    SDLK_KP_E,\n    SDLK_KP_F,\n    SDLK_KP_XOR,\n    SDLK_KP_POWER,\n    SDLK_KP_PERCENT,\n    SDLK_KP_LESS,\n    SDLK_KP_GREATER,\n    SDLK_KP_AMPERSAND,\n    SDLK_KP_DBLAMPERSAND,\n    SDLK_KP_VERTICALBAR,\n    SDLK_KP_DBLVERTICALBAR,\n    SDLK_KP_COLON,\n    SDLK_KP_HASH,\n    SDLK_KP_SPACE,\n    SDLK_KP_AT,\n    SDLK_KP_EXCLAM,\n    SDLK_KP_MEMSTORE,\n    SDLK_KP_MEMRECALL,\n    SDLK_KP_MEMCLEAR,\n    SDLK_KP_MEMADD,\n    SDLK_KP_MEMSUBTRACT,\n    SDLK_KP_MEMMULTIPLY,\n    SDLK_KP_MEMDIVIDE,\n    SDLK_KP_PLUSMINUS,\n    SDLK_KP_CLEAR,\n    SDLK_KP_CLEARENTRY,\n    SDLK_KP_BINARY,\n    SDLK_KP_OCTAL,\n    SDLK_KP_DECIMAL,\n    SDLK_KP_HEXADECIMAL,\n    0, 0,\n    SDLK_LCTRL,\n    SDLK_LSHIFT,\n    SDLK_LALT,\n    SDLK_LGUI,\n    SDLK_RCTRL,\n    SDLK_RSHIFT,\n    SDLK_RALT,\n    SDLK_RGUI,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    SDLK_MODE,\n    SDLK_AUDIONEXT,\n    SDLK_AUDIOPREV,\n    SDLK_AUDIOSTOP,\n    SDLK_AUDIOPLAY,\n    SDLK_AUDIOMUTE,\n    SDLK_MEDIASELECT,\n    SDLK_WWW,\n    SDLK_MAIL,\n    SDLK_CALCULATOR,\n    SDLK_COMPUTER,\n    SDLK_AC_SEARCH,\n    SDLK_AC_HOME,\n    SDLK_AC_BACK,\n    SDLK_AC_FORWARD,\n    SDLK_AC_STOP,\n    SDLK_AC_REFRESH,\n    SDLK_AC_BOOKMARKS,\n    SDLK_BRIGHTNESSDOWN,\n    SDLK_BRIGHTNESSUP,\n    SDLK_DISPLAYSWITCH,\n    SDLK_KBDILLUMTOGGLE,\n    SDLK_KBDILLUMDOWN,\n    SDLK_KBDILLUMUP,\n    SDLK_EJECT,\n    SDLK_SLEEP,\n};\n\nstatic const char *SDL_scancode_names[SDL_NUM_SCANCODES] = {\n    NULL, NULL, NULL, NULL,\n    \"A\",\n    \"B\",\n    \"C\",\n    \"D\",\n    \"E\",\n    \"F\",\n    \"G\",\n    \"H\",\n    \"I\",\n    \"J\",\n    \"K\",\n    \"L\",\n    \"M\",\n    \"N\",\n    \"O\",\n    \"P\",\n    \"Q\",\n    \"R\",\n    \"S\",\n    \"T\",\n    \"U\",\n    \"V\",\n    \"W\",\n    \"X\",\n    \"Y\",\n    \"Z\",\n    \"1\",\n    \"2\",\n    \"3\",\n    \"4\",\n    \"5\",\n    \"6\",\n    \"7\",\n    \"8\",\n    \"9\",\n    \"0\",\n    \"Return\",\n    \"Escape\",\n    \"Backspace\",\n    \"Tab\",\n    \"Space\",\n    \"-\",\n    \"=\",\n    \"[\",\n    \"]\",\n    \"\\\\\",\n    \"#\",\n    \";\",\n    \"'\",\n    \"`\",\n    \",\",\n    \".\",\n    \"/\",\n    \"CapsLock\",\n    \"F1\",\n    \"F2\",\n    \"F3\",\n    \"F4\",\n    \"F5\",\n    \"F6\",\n    \"F7\",\n    \"F8\",\n    \"F9\",\n    \"F10\",\n    \"F11\",\n    \"F12\",\n    \"PrintScreen\",\n    \"ScrollLock\",\n    \"Pause\",\n    \"Insert\",\n    \"Home\",\n    \"PageUp\",\n    \"Delete\",\n    \"End\",\n    \"PageDown\",\n    \"Right\",\n    \"Left\",\n    \"Down\",\n    \"Up\",\n    \"Numlock\",\n    \"Keypad /\",\n    \"Keypad *\",\n    \"Keypad -\",\n    \"Keypad +\",\n    \"Keypad Enter\",\n    \"Keypad 1\",\n    \"Keypad 2\",\n    \"Keypad 3\",\n    \"Keypad 4\",\n    \"Keypad 5\",\n    \"Keypad 6\",\n    \"Keypad 7\",\n    \"Keypad 8\",\n    \"Keypad 9\",\n    \"Keypad 0\",\n    \"Keypad .\",\n    NULL,\n    \"Application\",\n    \"Power\",\n    \"Keypad =\",\n    \"F13\",\n    \"F14\",\n    \"F15\",\n    \"F16\",\n    \"F17\",\n    \"F18\",\n    \"F19\",\n    \"F20\",\n    \"F21\",\n    \"F22\",\n    \"F23\",\n    \"F24\",\n    \"Execute\",\n    \"Help\",\n    \"Menu\",\n    \"Select\",\n    \"Stop\",\n    \"Again\",\n    \"Undo\",\n    \"Cut\",\n    \"Copy\",\n    \"Paste\",\n    \"Find\",\n    \"Mute\",\n    \"VolumeUp\",\n    \"VolumeDown\",\n    NULL, NULL, NULL,\n    \"Keypad ,\",\n    \"Keypad = (AS400)\",\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL,\n    \"AltErase\",\n    \"SysReq\",\n    \"Cancel\",\n    \"Clear\",\n    \"Prior\",\n    \"Return\",\n    \"Separator\",\n    \"Out\",\n    \"Oper\",\n    \"Clear / Again\",\n    \"CrSel\",\n    \"ExSel\",\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    \"Keypad 00\",\n    \"Keypad 000\",\n    \"ThousandsSeparator\",\n    \"DecimalSeparator\",\n    \"CurrencyUnit\",\n    \"CurrencySubUnit\",\n    \"Keypad (\",\n    \"Keypad )\",\n    \"Keypad {\",\n    \"Keypad }\",\n    \"Keypad Tab\",\n    \"Keypad Backspace\",\n    \"Keypad A\",\n    \"Keypad B\",\n    \"Keypad C\",\n    \"Keypad D\",\n    \"Keypad E\",\n    \"Keypad F\",\n    \"Keypad XOR\",\n    \"Keypad ^\",\n    \"Keypad %\",\n    \"Keypad <\",\n    \"Keypad >\",\n    \"Keypad &\",\n    \"Keypad &&\",\n    \"Keypad |\",\n    \"Keypad ||\",\n    \"Keypad :\",\n    \"Keypad #\",\n    \"Keypad Space\",\n    \"Keypad @\",\n    \"Keypad !\",\n    \"Keypad MemStore\",\n    \"Keypad MemRecall\",\n    \"Keypad MemClear\",\n    \"Keypad MemAdd\",\n    \"Keypad MemSubtract\",\n    \"Keypad MemMultiply\",\n    \"Keypad MemDivide\",\n    \"Keypad +/-\",\n    \"Keypad Clear\",\n    \"Keypad ClearEntry\",\n    \"Keypad Binary\",\n    \"Keypad Octal\",\n    \"Keypad Decimal\",\n    \"Keypad Hexadecimal\",\n    NULL, NULL,\n    \"Left Ctrl\",\n    \"Left Shift\",\n    \"Left Alt\",\n    \"Left GUI\",\n    \"Right Ctrl\",\n    \"Right Shift\",\n    \"Right Alt\",\n    \"Right GUI\",\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n    NULL,\n    \"ModeSwitch\",\n    \"AudioNext\",\n    \"AudioPrev\",\n    \"AudioStop\",\n    \"AudioPlay\",\n    \"AudioMute\",\n    \"MediaSelect\",\n    \"WWW\",\n    \"Mail\",\n    \"Calculator\",\n    \"Computer\",\n    \"AC Search\",\n    \"AC Home\",\n    \"AC Back\",\n    \"AC Forward\",\n    \"AC Stop\",\n    \"AC Refresh\",\n    \"AC Bookmarks\",\n    \"BrightnessDown\",\n    \"BrightnessUp\",\n    \"DisplaySwitch\",\n    \"KBDIllumToggle\",\n    \"KBDIllumDown\",\n    \"KBDIllumUp\",\n    \"Eject\",\n    \"Sleep\",\n};\n\n/* Taken from SDL_iconv() */\nchar *\nSDL_UCS4ToUTF8(Uint32 ch, char *dst)\n{\n    Uint8 *p = (Uint8 *) dst;\n    if (ch <= 0x7F) {\n        *p = (Uint8) ch;\n        ++dst;\n    } else if (ch <= 0x7FF) {\n        p[0] = 0xC0 | (Uint8) ((ch >> 6) & 0x1F);\n        p[1] = 0x80 | (Uint8) (ch & 0x3F);\n        dst += 2;\n    } else if (ch <= 0xFFFF) {\n        p[0] = 0xE0 | (Uint8) ((ch >> 12) & 0x0F);\n        p[1] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);\n        p[2] = 0x80 | (Uint8) (ch & 0x3F);\n        dst += 3;\n    } else if (ch <= 0x1FFFFF) {\n        p[0] = 0xF0 | (Uint8) ((ch >> 18) & 0x07);\n        p[1] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);\n        p[2] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);\n        p[3] = 0x80 | (Uint8) (ch & 0x3F);\n        dst += 4;\n    } else if (ch <= 0x3FFFFFF) {\n        p[0] = 0xF8 | (Uint8) ((ch >> 24) & 0x03);\n        p[1] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);\n        p[2] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);\n        p[3] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);\n        p[4] = 0x80 | (Uint8) (ch & 0x3F);\n        dst += 5;\n    } else {\n        p[0] = 0xFC | (Uint8) ((ch >> 30) & 0x01);\n        p[1] = 0x80 | (Uint8) ((ch >> 24) & 0x3F);\n        p[2] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);\n        p[3] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);\n        p[4] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);\n        p[5] = 0x80 | (Uint8) (ch & 0x3F);\n        dst += 6;\n    }\n    return dst;\n}\n\n/* Public functions */\nint\nSDL_KeyboardInit(void)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n\n    /* Set the default keymap */\n    SDL_memcpy(keyboard->keymap, SDL_default_keymap, sizeof(SDL_default_keymap));\n    return (0);\n}\n\nvoid\nSDL_ResetKeyboard(void)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n    SDL_Scancode scancode;\n\n#ifdef DEBUG_KEYBOARD\n    printf(\"Resetting keyboard\\n\");\n#endif\n    for (scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) {\n        if (keyboard->keystate[scancode] == SDL_PRESSED) {\n            SDL_SendKeyboardKey(SDL_RELEASED, scancode);\n        }\n    }\n}\n\nvoid\nSDL_GetDefaultKeymap(SDL_Keycode * keymap)\n{\n    SDL_memcpy(keymap, SDL_default_keymap, sizeof(SDL_default_keymap));\n}\n\nvoid\nSDL_SetKeymap(int start, SDL_Keycode * keys, int length)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n\n    if (start < 0 || start + length > SDL_NUM_SCANCODES) {\n        return;\n    }\n\n    SDL_memcpy(&keyboard->keymap[start], keys, sizeof(*keys) * length);\n}\n\nvoid\nSDL_SetScancodeName(SDL_Scancode scancode, const char *name)\n{\n    SDL_scancode_names[scancode] = name;\n}\n\nSDL_Window *\nSDL_GetKeyboardFocus(void)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n\n    return keyboard->focus;\n}\n\nvoid\nSDL_SetKeyboardFocus(SDL_Window * window)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n\n    if (keyboard->focus && !window) {\n        /* We won't get anymore keyboard messages, so reset keyboard state */\n        SDL_ResetKeyboard();\n    }\n\n    /* See if the current window has lost focus */\n    if (keyboard->focus && keyboard->focus != window) {\n\n        /* new window shouldn't think it has mouse captured. */\n        SDL_assert(!window || !(window->flags & SDL_WINDOW_MOUSE_CAPTURE));\n\n        /* old window must lose an existing mouse capture. */\n        if (keyboard->focus->flags & SDL_WINDOW_MOUSE_CAPTURE) {\n            SDL_CaptureMouse(SDL_FALSE);  /* drop the capture. */\n            SDL_assert(!(keyboard->focus->flags & SDL_WINDOW_MOUSE_CAPTURE));\n        }\n\n        SDL_SendWindowEvent(keyboard->focus, SDL_WINDOWEVENT_FOCUS_LOST,\n                            0, 0);\n\n        /* Ensures IME compositions are committed */\n        if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {\n            SDL_VideoDevice *video = SDL_GetVideoDevice();\n            if (video && video->StopTextInput) {\n                video->StopTextInput(video);\n            }\n        }\n    }\n\n    keyboard->focus = window;\n\n    if (keyboard->focus) {\n        SDL_SendWindowEvent(keyboard->focus, SDL_WINDOWEVENT_FOCUS_GAINED,\n                            0, 0);\n\n        if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {\n            SDL_VideoDevice *video = SDL_GetVideoDevice();\n            if (video && video->StartTextInput) {\n                video->StartTextInput(video);\n            }\n        }\n    }\n}\n\nint\nSDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n    int posted;\n    SDL_Keymod modifier;\n    SDL_Keycode keycode;\n    Uint16 modstate;\n    Uint32 type;\n    Uint8 repeat;\n\n    if (!scancode) {\n        return 0;\n    }\n#ifdef DEBUG_KEYBOARD\n    printf(\"The '%s' key has been %s\\n\", SDL_GetScancodeName(scancode),\n           state == SDL_PRESSED ? \"pressed\" : \"released\");\n#endif\n\n    /* Figure out what type of event this is */\n    switch (state) {\n    case SDL_PRESSED:\n        type = SDL_KEYDOWN;\n        break;\n    case SDL_RELEASED:\n        type = SDL_KEYUP;\n        break;\n    default:\n        /* Invalid state -- bail */\n        return 0;\n    }\n\n    /* Drop events that don't change state */\n    repeat = (state && keyboard->keystate[scancode]);\n    if (keyboard->keystate[scancode] == state && !repeat) {\n#if 0\n        printf(\"Keyboard event didn't change state - dropped!\\n\");\n#endif\n        return 0;\n    }\n\n    /* Update internal keyboard state */\n    keyboard->keystate[scancode] = state;\n\n    keycode = keyboard->keymap[scancode];\n\n    /* Update modifiers state if applicable */\n    switch (keycode) {\n    case SDLK_LCTRL:\n        modifier = KMOD_LCTRL;\n        break;\n    case SDLK_RCTRL:\n        modifier = KMOD_RCTRL;\n        break;\n    case SDLK_LSHIFT:\n        modifier = KMOD_LSHIFT;\n        break;\n    case SDLK_RSHIFT:\n        modifier = KMOD_RSHIFT;\n        break;\n    case SDLK_LALT:\n        modifier = KMOD_LALT;\n        break;\n    case SDLK_RALT:\n        modifier = KMOD_RALT;\n        break;\n    case SDLK_LGUI:\n        modifier = KMOD_LGUI;\n        break;\n    case SDLK_RGUI:\n        modifier = KMOD_RGUI;\n        break;\n    case SDLK_MODE:\n        modifier = KMOD_MODE;\n        break;\n    default:\n        modifier = KMOD_NONE;\n        break;\n    }\n    if (SDL_KEYDOWN == type) {\n        modstate = keyboard->modstate;\n        switch (keycode) {\n        case SDLK_NUMLOCKCLEAR:\n            keyboard->modstate ^= KMOD_NUM;\n            break;\n        case SDLK_CAPSLOCK:\n            keyboard->modstate ^= KMOD_CAPS;\n            break;\n        default:\n            keyboard->modstate |= modifier;\n            break;\n        }\n    } else {\n        keyboard->modstate &= ~modifier;\n        modstate = keyboard->modstate;\n    }\n\n    /* Post the event, if desired */\n    posted = 0;\n    if (SDL_GetEventState(type) == SDL_ENABLE) {\n        SDL_Event event;\n        event.key.type = type;\n        event.key.state = state;\n        event.key.repeat = repeat;\n        event.key.keysym.scancode = scancode;\n        event.key.keysym.sym = keycode;\n        event.key.keysym.mod = modstate;\n        event.key.windowID = keyboard->focus ? keyboard->focus->id : 0;\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n    return (posted);\n}\n\nint\nSDL_SendKeyboardText(const char *text)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n    int posted;\n\n    /* Don't post text events for unprintable characters */\n    if ((unsigned char)*text < ' ' || *text == 127) {\n        return 0;\n    }\n\n    /* Post the event, if desired */\n    posted = 0;\n    if (SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE) {\n        SDL_Event event;\n        event.text.type = SDL_TEXTINPUT;\n        event.text.windowID = keyboard->focus ? keyboard->focus->id : 0;\n        SDL_utf8strlcpy(event.text.text, text, SDL_arraysize(event.text.text));\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n    return (posted);\n}\n\nint\nSDL_SendEditingText(const char *text, int start, int length)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n    int posted;\n\n    /* Post the event, if desired */\n    posted = 0;\n    if (SDL_GetEventState(SDL_TEXTEDITING) == SDL_ENABLE) {\n        SDL_Event event;\n        event.edit.type = SDL_TEXTEDITING;\n        event.edit.windowID = keyboard->focus ? keyboard->focus->id : 0;\n        event.edit.start = start;\n        event.edit.length = length;\n        SDL_utf8strlcpy(event.edit.text, text, SDL_arraysize(event.edit.text));\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n    return (posted);\n}\n\nvoid\nSDL_KeyboardQuit(void)\n{\n}\n\nconst Uint8 *\nSDL_GetKeyboardState(int *numkeys)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n\n    if (numkeys != (int *) 0) {\n        *numkeys = SDL_NUM_SCANCODES;\n    }\n    return keyboard->keystate;\n}\n\nSDL_Keymod\nSDL_GetModState(void)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n\n    return keyboard->modstate;\n}\n\nvoid\nSDL_SetModState(SDL_Keymod modstate)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n\n    keyboard->modstate = modstate;\n}\n\n/* Note that SDL_ToggleModState() is not a public API. SDL_SetModState() is. */\nvoid\nSDL_ToggleModState(const SDL_Keymod modstate, const SDL_bool toggle)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n    if (toggle) {\n        keyboard->modstate |= modstate;\n    } else {\n        keyboard->modstate &= ~modstate;\n    }\n}\n\n\nSDL_Keycode\nSDL_GetKeyFromScancode(SDL_Scancode scancode)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n\n    if (scancode < SDL_SCANCODE_UNKNOWN || scancode >= SDL_NUM_SCANCODES) {\n          SDL_InvalidParamError(\"scancode\");\n          return 0;\n    }\n\n    return keyboard->keymap[scancode];\n}\n\nSDL_Scancode\nSDL_GetScancodeFromKey(SDL_Keycode key)\n{\n    SDL_Keyboard *keyboard = &SDL_keyboard;\n    SDL_Scancode scancode;\n\n    for (scancode = SDL_SCANCODE_UNKNOWN; scancode < SDL_NUM_SCANCODES;\n         ++scancode) {\n        if (keyboard->keymap[scancode] == key) {\n            return scancode;\n        }\n    }\n    return SDL_SCANCODE_UNKNOWN;\n}\n\nconst char *\nSDL_GetScancodeName(SDL_Scancode scancode)\n{\n    const char *name;\n    if (scancode < SDL_SCANCODE_UNKNOWN || scancode >= SDL_NUM_SCANCODES) {\n          SDL_InvalidParamError(\"scancode\");\n          return \"\";\n    }\n\n    name = SDL_scancode_names[scancode];\n    if (name)\n        return name;\n    else\n        return \"\";\n}\n\nSDL_Scancode SDL_GetScancodeFromName(const char *name)\n{\n    int i;\n\n    if (!name || !*name) {\n            SDL_InvalidParamError(\"name\");\n        return SDL_SCANCODE_UNKNOWN;\n    }\n\n    for (i = 0; i < SDL_arraysize(SDL_scancode_names); ++i) {\n        if (!SDL_scancode_names[i]) {\n            continue;\n        }\n        if (SDL_strcasecmp(name, SDL_scancode_names[i]) == 0) {\n            return (SDL_Scancode)i;\n        }\n    }\n\n    SDL_InvalidParamError(\"name\");\n    return SDL_SCANCODE_UNKNOWN;\n}\n\nconst char *\nSDL_GetKeyName(SDL_Keycode key)\n{\n    static char name[8];\n    char *end;\n\n    if (key & SDLK_SCANCODE_MASK) {\n        return\n            SDL_GetScancodeName((SDL_Scancode) (key & ~SDLK_SCANCODE_MASK));\n    }\n\n    switch (key) {\n    case SDLK_RETURN:\n        return SDL_GetScancodeName(SDL_SCANCODE_RETURN);\n    case SDLK_ESCAPE:\n        return SDL_GetScancodeName(SDL_SCANCODE_ESCAPE);\n    case SDLK_BACKSPACE:\n        return SDL_GetScancodeName(SDL_SCANCODE_BACKSPACE);\n    case SDLK_TAB:\n        return SDL_GetScancodeName(SDL_SCANCODE_TAB);\n    case SDLK_SPACE:\n        return SDL_GetScancodeName(SDL_SCANCODE_SPACE);\n    case SDLK_DELETE:\n        return SDL_GetScancodeName(SDL_SCANCODE_DELETE);\n    default:\n        /* Unaccented letter keys on latin keyboards are normally\n           labeled in upper case (and probably on others like Greek or\n           Cyrillic too, so if you happen to know for sure, please\n           adapt this). */\n        if (key >= 'a' && key <= 'z') {\n            key -= 32;\n        }\n\n        end = SDL_UCS4ToUTF8((Uint32) key, name);\n        *end = '\\0';\n        return name;\n    }\n}\n\nSDL_Keycode\nSDL_GetKeyFromName(const char *name)\n{\n    SDL_Keycode key;\n\n        /* Check input */\n        if (name == NULL) return SDLK_UNKNOWN;\n\n    /* If it's a single UTF-8 character, then that's the keycode itself */\n    key = *(const unsigned char *)name;\n    if (key >= 0xF0) {\n        if (SDL_strlen(name) == 4) {\n            int i = 0;\n            key  = (Uint16)(name[i]&0x07) << 18;\n            key |= (Uint16)(name[++i]&0x3F) << 12;\n            key |= (Uint16)(name[++i]&0x3F) << 6;\n            key |= (Uint16)(name[++i]&0x3F);\n            return key;\n        }\n        return SDLK_UNKNOWN;\n    } else if (key >= 0xE0) {\n        if (SDL_strlen(name) == 3) {\n            int i = 0;\n            key  = (Uint16)(name[i]&0x0F) << 12;\n            key |= (Uint16)(name[++i]&0x3F) << 6;\n            key |= (Uint16)(name[++i]&0x3F);\n            return key;\n        }\n        return SDLK_UNKNOWN;\n    } else if (key >= 0xC0) {\n        if (SDL_strlen(name) == 2) {\n            int i = 0;\n            key  = (Uint16)(name[i]&0x1F) << 6;\n            key |= (Uint16)(name[++i]&0x3F);\n            return key;\n        }\n        return SDLK_UNKNOWN;\n    } else {\n        if (SDL_strlen(name) == 1) {\n            if (key >= 'A' && key <= 'Z') {\n                key += 32;\n            }\n            return key;\n        }\n\n        /* Get the scancode for this name, and the associated keycode */\n        return SDL_default_keymap[SDL_GetScancodeFromName(name)];\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_keyboard_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_keyboard_c_h\n#define _SDL_keyboard_c_h\n\n#include \"SDL_keycode.h\"\n#include \"SDL_events.h\"\n\n/* Initialize the keyboard subsystem */\nextern int SDL_KeyboardInit(void);\n\n/* Clear the state of the keyboard */\nextern void SDL_ResetKeyboard(void);\n\n/* Get the default keymap */\nextern void SDL_GetDefaultKeymap(SDL_Keycode * keymap);\n\n/* Set the mapping of scancode to key codes */\nextern void SDL_SetKeymap(int start, SDL_Keycode * keys, int length);\n\n/* Set a platform-dependent key name, overriding the default platform-agnostic\n   name. Encoded as UTF-8. The string is not copied, thus the pointer given to\n   this function must stay valid forever (or at least until the call to\n   VideoQuit()). */\nextern void SDL_SetScancodeName(SDL_Scancode scancode, const char *name);\n\n/* Set the keyboard focus window */\nextern void SDL_SetKeyboardFocus(SDL_Window * window);\n\n/* Send a keyboard key event */\nextern int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode);\n\n/* Send keyboard text input */\nextern int SDL_SendKeyboardText(const char *text);\n\n/* Send editing text for selected range from start to end */\nextern int SDL_SendEditingText(const char *text, int start, int end);\n\n/* Shutdown the keyboard subsystem */\nextern void SDL_KeyboardQuit(void);\n\n/* Convert to UTF-8 */\nextern char *SDL_UCS4ToUTF8(Uint32 ch, char *dst);\n\n/* Toggle on or off pieces of the keyboard mod state. */\nextern void SDL_ToggleModState(const SDL_Keymod modstate, const SDL_bool toggle);\n\n#endif /* _SDL_keyboard_c_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_mouse.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* General mouse handling code for SDL */\n\n#include \"SDL_assert.h\"\n#include \"SDL_hints.h\"\n#include \"SDL_timer.h\"\n#include \"SDL_events.h\"\n#include \"SDL_events_c.h\"\n#include \"default_cursor.h\"\n#include \"../video/SDL_sysvideo.h\"\n\n/* #define DEBUG_MOUSE */\n\n/* The mouse state */\nstatic SDL_Mouse SDL_mouse;\nstatic Uint32 SDL_double_click_time = 500;\nstatic int SDL_double_click_radius = 1;\n\nstatic int\nSDL_PrivateSendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relative, int x, int y);\n\n/* Public functions */\nint\nSDL_MouseInit(void)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    mouse->cursor_shown = SDL_TRUE;\n\n    return (0);\n}\n\nvoid\nSDL_SetDefaultCursor(SDL_Cursor * cursor)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    mouse->def_cursor = cursor;\n    if (!mouse->cur_cursor) {\n        SDL_SetCursor(cursor);\n    }\n}\n\nSDL_Mouse *\nSDL_GetMouse(void)\n{\n    return &SDL_mouse;\n}\n\nvoid\nSDL_SetDoubleClickTime(Uint32 interval)\n{\n    SDL_double_click_time = interval;\n}\n\nSDL_Window *\nSDL_GetMouseFocus(void)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    return mouse->focus;\n}\n\nvoid\nSDL_ResetMouse(void)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    Uint8 i;\n\n#ifdef DEBUG_MOUSE\n    printf(\"Resetting mouse\\n\");\n#endif\n    for (i = 1; i <= sizeof(mouse->buttonstate)*8; ++i) {\n        if (mouse->buttonstate & SDL_BUTTON(i)) {\n            SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, i);\n        }\n    }\n    SDL_assert(mouse->buttonstate == 0);\n}\n\nvoid\nSDL_SetMouseFocus(SDL_Window * window)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    if (mouse->focus == window) {\n        return;\n    }\n\n    /* Actually, this ends up being a bad idea, because most operating\n       systems have an implicit grab when you press the mouse button down\n       so you can drag things out of the window and then get the mouse up\n       when it happens.  So, #if 0...\n    */\n#if 0\n    if (mouse->focus && !window) {\n        /* We won't get anymore mouse messages, so reset mouse state */\n        SDL_ResetMouse();\n    }\n#endif\n\n    /* See if the current window has lost focus */\n    if (mouse->focus) {\n        SDL_SendWindowEvent(mouse->focus, SDL_WINDOWEVENT_LEAVE, 0, 0);\n    }\n\n    mouse->focus = window;\n\n    if (mouse->focus) {\n        SDL_SendWindowEvent(mouse->focus, SDL_WINDOWEVENT_ENTER, 0, 0);\n    }\n\n    /* Update cursor visibility */\n    SDL_SetCursor(NULL);\n}\n\n/* Check to see if we need to synthesize focus events */\nstatic SDL_bool\nSDL_UpdateMouseFocus(SDL_Window * window, int x, int y, Uint32 buttonstate)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    SDL_bool inWindow = SDL_TRUE;\n\n    if (window && ((window->flags & SDL_WINDOW_MOUSE_CAPTURE) == 0)) {\n        int w, h;\n        SDL_GetWindowSize(window, &w, &h);\n        if (x < 0 || y < 0 || x >= w || y >= h) {\n            inWindow = SDL_FALSE;\n        }\n    }\n\n/* Linux doesn't give you mouse events outside your window unless you grab\n   the pointer.\n\n   Windows doesn't give you mouse events outside your window unless you call\n   SetCapture().\n\n   Both of these are slightly scary changes, so for now we'll punt and if the\n   mouse leaves the window you'll lose mouse focus and reset button state.\n*/\n#ifdef SUPPORT_DRAG_OUTSIDE_WINDOW\n    if (!inWindow && !buttonstate) {\n#else\n    if (!inWindow) {\n#endif\n        if (window == mouse->focus) {\n#ifdef DEBUG_MOUSE\n            printf(\"Mouse left window, synthesizing move & focus lost event\\n\");\n#endif\n            SDL_PrivateSendMouseMotion(window, mouse->mouseID, 0, x, y);\n            SDL_SetMouseFocus(NULL);\n        }\n        return SDL_FALSE;\n    }\n\n    if (window != mouse->focus) {\n#ifdef DEBUG_MOUSE\n         printf(\"Mouse entered window, synthesizing focus gain & move event\\n\");\n#endif\n         SDL_SetMouseFocus(window);\n         SDL_PrivateSendMouseMotion(window, mouse->mouseID, 0, x, y);\n    }\n    return SDL_TRUE;\n}\n\nint\nSDL_SendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relative, int x, int y)\n{\n    if (window && !relative) {\n        SDL_Mouse *mouse = SDL_GetMouse();\n        if (!SDL_UpdateMouseFocus(window, x, y, mouse->buttonstate)) {\n            return 0;\n        }\n    }\n\n    return SDL_PrivateSendMouseMotion(window, mouseID, relative, x, y);\n}\n\nstatic int\nSDL_PrivateSendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relative, int x, int y)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    int posted;\n    int xrel;\n    int yrel;\n\n    if (mouse->relative_mode_warp) {\n        int center_x = 0, center_y = 0;\n        SDL_GetWindowSize(window, &center_x, &center_y);\n        center_x /= 2;\n        center_y /= 2;\n        if (x == center_x && y == center_y) {\n            mouse->last_x = center_x;\n            mouse->last_y = center_y;\n            return 0;\n        }\n        SDL_WarpMouseInWindow(window, center_x, center_y);\n    }\n\n    if (relative) {\n        xrel = x;\n        yrel = y;\n        x = (mouse->last_x + xrel);\n        y = (mouse->last_y + yrel);\n    } else {\n        xrel = x - mouse->last_x;\n        yrel = y - mouse->last_y;\n    }\n\n    /* Drop events that don't change state */\n    if (!xrel && !yrel) {\n#ifdef DEBUG_MOUSE\n        printf(\"Mouse event didn't change state - dropped!\\n\");\n#endif\n        return 0;\n    }\n\n    /* Update internal mouse coordinates */\n    if (!mouse->relative_mode) {\n        mouse->x = x;\n        mouse->y = y;\n    } else {\n        mouse->x += xrel;\n        mouse->y += yrel;\n    }\n\n    /* make sure that the pointers find themselves inside the windows,\n       unless we have the mouse captured. */\n    if (window && ((window->flags & SDL_WINDOW_MOUSE_CAPTURE) == 0)) {\n        int x_max = 0, y_max = 0;\n\n        // !!! FIXME: shouldn't this be (window) instead of (mouse->focus)?\n        SDL_GetWindowSize(mouse->focus, &x_max, &y_max);\n        --x_max;\n        --y_max;\n\n        if (mouse->x > x_max) {\n            mouse->x = x_max;\n        }\n        if (mouse->x < 0) {\n            mouse->x = 0;\n        }\n\n        if (mouse->y > y_max) {\n            mouse->y = y_max;\n        }\n        if (mouse->y < 0) {\n            mouse->y = 0;\n        }\n    }\n\n    mouse->xdelta += xrel;\n    mouse->ydelta += yrel;\n\n    /* Move the mouse cursor, if needed */\n    if (mouse->cursor_shown && !mouse->relative_mode &&\n        mouse->MoveCursor && mouse->cur_cursor) {\n        mouse->MoveCursor(mouse->cur_cursor);\n    }\n\n    /* Post the event, if desired */\n    posted = 0;\n    if (SDL_GetEventState(SDL_MOUSEMOTION) == SDL_ENABLE) {\n        SDL_Event event;\n        event.motion.type = SDL_MOUSEMOTION;\n        event.motion.windowID = mouse->focus ? mouse->focus->id : 0;\n        event.motion.which = mouseID;\n        event.motion.state = mouse->buttonstate;\n        event.motion.x = mouse->x;\n        event.motion.y = mouse->y;\n        event.motion.xrel = xrel;\n        event.motion.yrel = yrel;\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n    if (relative) {\n        mouse->last_x = mouse->x;\n        mouse->last_y = mouse->y;\n    } else {\n        /* Use unclamped values if we're getting events outside the window */\n        mouse->last_x = x;\n        mouse->last_y = y;\n    }\n    return posted;\n}\n\nstatic SDL_MouseClickState *GetMouseClickState(SDL_Mouse *mouse, Uint8 button)\n{\n    if (button >= mouse->num_clickstates) {\n        int i, count = button + 1;\n        SDL_MouseClickState *clickstate = (SDL_MouseClickState *)SDL_realloc(mouse->clickstate, count * sizeof(*mouse->clickstate));\n        if (!clickstate) {\n            return NULL;\n        }\n        mouse->clickstate = clickstate;\n\n        for (i = mouse->num_clickstates; i < count; ++i) {\n            SDL_zero(mouse->clickstate[i]);\n        }\n        mouse->num_clickstates = count;\n    }\n    return &mouse->clickstate[button];\n}\n\nstatic int\nSDL_PrivateSendMouseButton(SDL_Window * window, SDL_MouseID mouseID, Uint8 state, Uint8 button, int clicks)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    int posted;\n    Uint32 type;\n    Uint32 buttonstate = mouse->buttonstate;\n\n    /* Figure out which event to perform */\n    switch (state) {\n    case SDL_PRESSED:\n        type = SDL_MOUSEBUTTONDOWN;\n        buttonstate |= SDL_BUTTON(button);\n        break;\n    case SDL_RELEASED:\n        type = SDL_MOUSEBUTTONUP;\n        buttonstate &= ~SDL_BUTTON(button);\n        break;\n    default:\n        /* Invalid state -- bail */\n        return 0;\n    }\n\n    /* We do this after calculating buttonstate so button presses gain focus */\n    if (window && state == SDL_PRESSED) {\n        SDL_UpdateMouseFocus(window, mouse->x, mouse->y, buttonstate);\n    }\n\n    if (buttonstate == mouse->buttonstate) {\n        /* Ignore this event, no state change */\n        return 0;\n    }\n    mouse->buttonstate = buttonstate;\n\n    if (clicks < 0) {\n        SDL_MouseClickState *clickstate = GetMouseClickState(mouse, button);\n        if (clickstate) {\n            if (state == SDL_PRESSED) {\n                Uint32 now = SDL_GetTicks();\n\n                if (SDL_TICKS_PASSED(now, clickstate->last_timestamp + SDL_double_click_time) ||\n                    SDL_abs(mouse->x - clickstate->last_x) > SDL_double_click_radius ||\n                    SDL_abs(mouse->y - clickstate->last_y) > SDL_double_click_radius) {\n                    clickstate->click_count = 0;\n                }\n                clickstate->last_timestamp = now;\n                clickstate->last_x = mouse->x;\n                clickstate->last_y = mouse->y;\n                if (clickstate->click_count < 255) {\n                    ++clickstate->click_count;\n                }\n            }\n            clicks = clickstate->click_count;\n        } else {\n            clicks = 1;\n        }\n    }\n\n    /* Post the event, if desired */\n    posted = 0;\n    if (SDL_GetEventState(type) == SDL_ENABLE) {\n        SDL_Event event;\n        event.type = type;\n        event.button.windowID = mouse->focus ? mouse->focus->id : 0;\n        event.button.which = mouseID;\n        event.button.state = state;\n        event.button.button = button;\n        event.button.clicks = (Uint8) SDL_min(clicks, 255);\n        event.button.x = mouse->x;\n        event.button.y = mouse->y;\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n\n    /* We do this after dispatching event so button releases can lose focus */\n    if (window && state == SDL_RELEASED) {\n        SDL_UpdateMouseFocus(window, mouse->x, mouse->y, buttonstate);\n    }\n    \n    return posted;\n}\n\nint\nSDL_SendMouseButtonClicks(SDL_Window * window, SDL_MouseID mouseID, Uint8 state, Uint8 button, int clicks)\n{\n    clicks = SDL_max(clicks, 0);\n    return SDL_PrivateSendMouseButton(window, mouseID, state, button, clicks);\n}\n\nint\nSDL_SendMouseButton(SDL_Window * window, SDL_MouseID mouseID, Uint8 state, Uint8 button)\n{\n    return SDL_PrivateSendMouseButton(window, mouseID, state, button, -1);\n}\n\nint\nSDL_SendMouseWheel(SDL_Window * window, SDL_MouseID mouseID, int x, int y, SDL_MouseWheelDirection direction)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    int posted;\n\n    if (window) {\n        SDL_SetMouseFocus(window);\n    }\n\n    if (!x && !y) {\n        return 0;\n    }\n\n    /* Post the event, if desired */\n    posted = 0;\n    if (SDL_GetEventState(SDL_MOUSEWHEEL) == SDL_ENABLE) {\n        SDL_Event event;\n        event.type = SDL_MOUSEWHEEL;\n        event.wheel.windowID = mouse->focus ? mouse->focus->id : 0;\n        event.wheel.which = mouseID;\n        event.wheel.x = x;\n        event.wheel.y = y;\n        event.wheel.direction = (Uint32)direction;\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n    return posted;\n}\n\nvoid\nSDL_MouseQuit(void)\n{\n    SDL_Cursor *cursor, *next;\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    if (mouse->CaptureMouse) {\n        SDL_CaptureMouse(SDL_FALSE);\n    }\n    SDL_SetRelativeMouseMode(SDL_FALSE);\n    SDL_ShowCursor(1);\n\n    cursor = mouse->cursors;\n    while (cursor) {\n        next = cursor->next;\n        SDL_FreeCursor(cursor);\n        cursor = next;\n    }\n\n    if (mouse->def_cursor && mouse->FreeCursor) {\n        mouse->FreeCursor(mouse->def_cursor);\n    }\n\n    if (mouse->clickstate) {\n        SDL_free(mouse->clickstate);\n    }\n\n    SDL_zerop(mouse);\n}\n\nUint32\nSDL_GetMouseState(int *x, int *y)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    if (x) {\n        *x = mouse->x;\n    }\n    if (y) {\n        *y = mouse->y;\n    }\n    return mouse->buttonstate;\n}\n\nUint32\nSDL_GetRelativeMouseState(int *x, int *y)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    if (x) {\n        *x = mouse->xdelta;\n    }\n    if (y) {\n        *y = mouse->ydelta;\n    }\n    mouse->xdelta = 0;\n    mouse->ydelta = 0;\n    return mouse->buttonstate;\n}\n\nUint32\nSDL_GetGlobalMouseState(int *x, int *y)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    int tmpx, tmpy;\n\n    /* make sure these are never NULL for the backend implementations... */\n    if (!x) {\n        x = &tmpx;\n    }\n    if (!y) {\n        y = &tmpy;\n    }\n\n    *x = *y = 0;\n\n    if (!mouse->GetGlobalMouseState) {\n        SDL_assert(0 && \"This should really be implemented for every target.\");\n        return 0;\n    }\n\n    return mouse->GetGlobalMouseState(x, y);\n}\n\nvoid\nSDL_WarpMouseInWindow(SDL_Window * window, int x, int y)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    if (window == NULL) {\n        window = mouse->focus;\n    }\n\n    if (window == NULL) {\n        return;\n    }\n\n    if (mouse->WarpMouse) {\n        mouse->WarpMouse(window, x, y);\n    } else {\n        SDL_SendMouseMotion(window, mouse->mouseID, 0, x, y);\n    }\n}\n\nint\nSDL_WarpMouseGlobal(int x, int y)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    if (mouse->WarpMouseGlobal) {\n        return mouse->WarpMouseGlobal(x, y);\n    }\n\n    return SDL_Unsupported();\n}\n\nstatic SDL_bool\nShouldUseRelativeModeWarp(SDL_Mouse *mouse)\n{\n    if (!mouse->SetRelativeMouseMode) {\n        return SDL_TRUE;\n    }\n\n    return SDL_GetHintBoolean(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, SDL_FALSE);\n}\n\nint\nSDL_SetRelativeMouseMode(SDL_bool enabled)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    SDL_Window *focusWindow = SDL_GetKeyboardFocus();\n\n    if (enabled == mouse->relative_mode) {\n        return 0;\n    }\n\n    if (enabled && focusWindow) {\n        /* Center it in the focused window to prevent clicks from going through\n         * to background windows.\n         */\n        SDL_SetMouseFocus(focusWindow);\n        SDL_WarpMouseInWindow(focusWindow, focusWindow->w/2, focusWindow->h/2);\n    }\n\n    /* Set the relative mode */\n    if (!enabled && mouse->relative_mode_warp) {\n        mouse->relative_mode_warp = SDL_FALSE;\n    } else if (enabled && ShouldUseRelativeModeWarp(mouse)) {\n        mouse->relative_mode_warp = SDL_TRUE;\n    } else if (mouse->SetRelativeMouseMode(enabled) < 0) {\n        if (enabled) {\n            /* Fall back to warp mode if native relative mode failed */\n            mouse->relative_mode_warp = SDL_TRUE;\n        }\n    }\n    mouse->relative_mode = enabled;\n\n    if (mouse->focus) {\n        SDL_UpdateWindowGrab(mouse->focus);\n\n        /* Put the cursor back to where the application expects it */\n        if (!enabled) {\n            SDL_WarpMouseInWindow(mouse->focus, mouse->x, mouse->y);\n        }\n    }\n\n    /* Flush pending mouse motion - ideally we would pump events, but that's not always safe */\n    SDL_FlushEvent(SDL_MOUSEMOTION);\n\n    /* Update cursor visibility */\n    SDL_SetCursor(NULL);\n\n    return 0;\n}\n\nSDL_bool\nSDL_GetRelativeMouseMode()\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    return mouse->relative_mode;\n}\n\nint\nSDL_CaptureMouse(SDL_bool enabled)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    SDL_Window *focusWindow;\n    SDL_bool isCaptured;\n\n    if (!mouse->CaptureMouse) {\n        return SDL_Unsupported();\n    }\n\n    focusWindow = SDL_GetKeyboardFocus();\n\n    isCaptured = focusWindow && (focusWindow->flags & SDL_WINDOW_MOUSE_CAPTURE);\n    if (isCaptured == enabled) {\n        return 0;  /* already done! */\n    }\n\n    if (enabled) {\n        if (!focusWindow) {\n            return SDL_SetError(\"No window has focus\");\n        } else if (mouse->CaptureMouse(focusWindow) == -1) {\n            return -1;  /* CaptureMouse() should call SetError */\n        }\n        focusWindow->flags |= SDL_WINDOW_MOUSE_CAPTURE;\n    } else {\n        if (mouse->CaptureMouse(NULL) == -1) {\n            return -1;  /* CaptureMouse() should call SetError */\n        }\n        focusWindow->flags &= ~SDL_WINDOW_MOUSE_CAPTURE;\n    }\n\n    return 0;\n}\n\nSDL_Cursor *\nSDL_CreateCursor(const Uint8 * data, const Uint8 * mask,\n                 int w, int h, int hot_x, int hot_y)\n{\n    SDL_Surface *surface;\n    SDL_Cursor *cursor;\n    int x, y;\n    Uint32 *pixel;\n    Uint8 datab = 0, maskb = 0;\n    const Uint32 black = 0xFF000000;\n    const Uint32 white = 0xFFFFFFFF;\n    const Uint32 transparent = 0x00000000;\n\n    /* Make sure the width is a multiple of 8 */\n    w = ((w + 7) & ~7);\n\n    /* Create the surface from a bitmap */\n    surface = SDL_CreateRGBSurface(0, w, h, 32,\n                                   0x00FF0000,\n                                   0x0000FF00,\n                                   0x000000FF,\n                                   0xFF000000);\n    if (!surface) {\n        return NULL;\n    }\n    for (y = 0; y < h; ++y) {\n        pixel = (Uint32 *) ((Uint8 *) surface->pixels + y * surface->pitch);\n        for (x = 0; x < w; ++x) {\n            if ((x % 8) == 0) {\n                datab = *data++;\n                maskb = *mask++;\n            }\n            if (maskb & 0x80) {\n                *pixel++ = (datab & 0x80) ? black : white;\n            } else {\n                *pixel++ = (datab & 0x80) ? black : transparent;\n            }\n            datab <<= 1;\n            maskb <<= 1;\n        }\n    }\n\n    cursor = SDL_CreateColorCursor(surface, hot_x, hot_y);\n\n    SDL_FreeSurface(surface);\n\n    return cursor;\n}\n\nSDL_Cursor *\nSDL_CreateColorCursor(SDL_Surface *surface, int hot_x, int hot_y)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    SDL_Surface *temp = NULL;\n    SDL_Cursor *cursor;\n\n    if (!surface) {\n        SDL_SetError(\"Passed NULL cursor surface\");\n        return NULL;\n    }\n\n    if (!mouse->CreateCursor) {\n        SDL_SetError(\"Cursors are not currently supported\");\n        return NULL;\n    }\n\n    /* Sanity check the hot spot */\n    if ((hot_x < 0) || (hot_y < 0) ||\n        (hot_x >= surface->w) || (hot_y >= surface->h)) {\n        SDL_SetError(\"Cursor hot spot doesn't lie within cursor\");\n        return NULL;\n    }\n\n    if (surface->format->format != SDL_PIXELFORMAT_ARGB8888) {\n        temp = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_ARGB8888, 0);\n        if (!temp) {\n            return NULL;\n        }\n        surface = temp;\n    }\n\n    cursor = mouse->CreateCursor(surface, hot_x, hot_y);\n    if (cursor) {\n        cursor->next = mouse->cursors;\n        mouse->cursors = cursor;\n    }\n\n    SDL_FreeSurface(temp);\n\n    return cursor;\n}\n\nSDL_Cursor *\nSDL_CreateSystemCursor(SDL_SystemCursor id)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    SDL_Cursor *cursor;\n\n    if (!mouse->CreateSystemCursor) {\n        SDL_SetError(\"CreateSystemCursor is not currently supported\");\n        return NULL;\n    }\n\n    cursor = mouse->CreateSystemCursor(id);\n    if (cursor) {\n        cursor->next = mouse->cursors;\n        mouse->cursors = cursor;\n    }\n\n    return cursor;\n}\n\n/* SDL_SetCursor(NULL) can be used to force the cursor redraw,\n   if this is desired for any reason.  This is used when setting\n   the video mode and when the SDL window gains the mouse focus.\n */\nvoid\nSDL_SetCursor(SDL_Cursor * cursor)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    /* Set the new cursor */\n    if (cursor) {\n        /* Make sure the cursor is still valid for this mouse */\n        if (cursor != mouse->def_cursor) {\n            SDL_Cursor *found;\n            for (found = mouse->cursors; found; found = found->next) {\n                if (found == cursor) {\n                    break;\n                }\n            }\n            if (!found) {\n                SDL_SetError(\"Cursor not associated with the current mouse\");\n                return;\n            }\n        }\n        mouse->cur_cursor = cursor;\n    } else {\n        if (mouse->focus) {\n            cursor = mouse->cur_cursor;\n        } else {\n            cursor = mouse->def_cursor;\n        }\n    }\n\n    if (cursor && mouse->cursor_shown && !mouse->relative_mode) {\n        if (mouse->ShowCursor) {\n            mouse->ShowCursor(cursor);\n        }\n    } else {\n        if (mouse->ShowCursor) {\n            mouse->ShowCursor(NULL);\n        }\n    }\n}\n\nSDL_Cursor *\nSDL_GetCursor(void)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    if (!mouse) {\n        return NULL;\n    }\n    return mouse->cur_cursor;\n}\n\nSDL_Cursor *\nSDL_GetDefaultCursor(void)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    if (!mouse) {\n        return NULL;\n    }\n    return mouse->def_cursor;\n}\n\nvoid\nSDL_FreeCursor(SDL_Cursor * cursor)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    SDL_Cursor *curr, *prev;\n\n    if (!cursor) {\n        return;\n    }\n\n    if (cursor == mouse->def_cursor) {\n        return;\n    }\n    if (cursor == mouse->cur_cursor) {\n        SDL_SetCursor(mouse->def_cursor);\n    }\n\n    for (prev = NULL, curr = mouse->cursors; curr;\n         prev = curr, curr = curr->next) {\n        if (curr == cursor) {\n            if (prev) {\n                prev->next = curr->next;\n            } else {\n                mouse->cursors = curr->next;\n            }\n\n            if (mouse->FreeCursor) {\n                mouse->FreeCursor(curr);\n            }\n            return;\n        }\n    }\n}\n\nint\nSDL_ShowCursor(int toggle)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n    SDL_bool shown;\n\n    if (!mouse) {\n        return 0;\n    }\n\n    shown = mouse->cursor_shown;\n    if (toggle >= 0) {\n        if (toggle) {\n            mouse->cursor_shown = SDL_TRUE;\n        } else {\n            mouse->cursor_shown = SDL_FALSE;\n        }\n        if (mouse->cursor_shown != shown) {\n            SDL_SetCursor(NULL);\n        }\n    }\n    return shown;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_mouse_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_mouse_c_h\n#define _SDL_mouse_c_h\n\n#include \"SDL_mouse.h\"\n\ntypedef Uint32 SDL_MouseID;\n\nstruct SDL_Cursor\n{\n    struct SDL_Cursor *next;\n    void *driverdata;\n};\n\ntypedef struct\n{\n    int last_x, last_y;\n    Uint32 last_timestamp;\n    Uint8 click_count;\n} SDL_MouseClickState;\n\ntypedef struct\n{\n    /* Create a cursor from a surface */\n    SDL_Cursor *(*CreateCursor) (SDL_Surface * surface, int hot_x, int hot_y);\n\n    /* Create a system cursor */\n    SDL_Cursor *(*CreateSystemCursor) (SDL_SystemCursor id);\n\n    /* Show the specified cursor, or hide if cursor is NULL */\n    int (*ShowCursor) (SDL_Cursor * cursor);\n\n    /* This is called when a mouse motion event occurs */\n    void (*MoveCursor) (SDL_Cursor * cursor);\n\n    /* Free a window manager cursor */\n    void (*FreeCursor) (SDL_Cursor * cursor);\n\n    /* Warp the mouse to (x,y) within a window */\n    void (*WarpMouse) (SDL_Window * window, int x, int y);\n\n    /* Warp the mouse to (x,y) in screen space */\n    int (*WarpMouseGlobal) (int x, int y);\n\n    /* Set relative mode */\n    int (*SetRelativeMouseMode) (SDL_bool enabled);\n\n    /* Set mouse capture */\n    int (*CaptureMouse) (SDL_Window * window);\n\n    /* Get absolute mouse coordinates. (x) and (y) are never NULL and set to zero before call. */\n    Uint32 (*GetGlobalMouseState) (int *x, int *y);\n\n    /* Data common to all mice */\n    SDL_MouseID mouseID;\n    SDL_Window *focus;\n    int x;\n    int y;\n    int xdelta;\n    int ydelta;\n    int last_x, last_y;         /* the last reported x and y coordinates */\n    Uint32 buttonstate;\n    SDL_bool relative_mode;\n    SDL_bool relative_mode_warp;\n\n    /* Data for double-click tracking */\n    int num_clickstates;\n    SDL_MouseClickState *clickstate;\n\n    SDL_Cursor *cursors;\n    SDL_Cursor *def_cursor;\n    SDL_Cursor *cur_cursor;\n    SDL_bool cursor_shown;\n\n    /* Driver-dependent data. */\n    void *driverdata;\n} SDL_Mouse;\n\n\n/* Initialize the mouse subsystem */\nextern int SDL_MouseInit(void);\n\n/* Get the mouse state structure */\nSDL_Mouse *SDL_GetMouse(void);\n\n/* Set the default double-click interval */\nextern void SDL_SetDoubleClickTime(Uint32 interval);\n\n/* Set the default mouse cursor */\nextern void SDL_SetDefaultCursor(SDL_Cursor * cursor);\n\n/* Set the mouse focus window */\nextern void SDL_SetMouseFocus(SDL_Window * window);\n\n/* Send a mouse motion event */\nextern int SDL_SendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relative, int x, int y);\n\n/* Send a mouse button event */\nextern int SDL_SendMouseButton(SDL_Window * window, SDL_MouseID mouseID, Uint8 state, Uint8 button);\n\n/* Send a mouse button event with a click count */\nextern int SDL_SendMouseButtonClicks(SDL_Window * window, SDL_MouseID mouseID, Uint8 state, Uint8 button, int clicks);\n\n/* Send a mouse wheel event */\nextern int SDL_SendMouseWheel(SDL_Window * window, SDL_MouseID mouseID, int x, int y, SDL_MouseWheelDirection direction);\n\n/* Shutdown the mouse subsystem */\nextern void SDL_MouseQuit(void);\n\n#endif /* _SDL_mouse_c_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_quit.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n#include \"SDL_hints.h\"\n#include \"SDL_assert.h\"\n\n/* General quit handling code for SDL */\n\n#ifdef HAVE_SIGNAL_H\n#include <signal.h>\n#endif\n\n#include \"SDL_events.h\"\n#include \"SDL_events_c.h\"\n\nstatic SDL_bool disable_signals = SDL_FALSE;\nstatic SDL_bool send_quit_pending = SDL_FALSE;\n\n#ifdef HAVE_SIGNAL_H\nstatic void\nSDL_HandleSIG(int sig)\n{\n    /* Reset the signal handler */\n    signal(sig, SDL_HandleSIG);\n\n    /* Send a quit event next time the event loop pumps. */\n    /* We can't send it in signal handler; malloc() might be interrupted! */\n    send_quit_pending = SDL_TRUE;\n}\n#endif /* HAVE_SIGNAL_H */\n\n/* Public functions */\nstatic int\nSDL_QuitInit_Internal(void)\n{\n#ifdef HAVE_SIGACTION\n    struct sigaction action;\n    sigaction(SIGINT, NULL, &action);\n#ifdef HAVE_SA_SIGACTION\n    if ( action.sa_handler == SIG_DFL && action.sa_sigaction == (void*)SIG_DFL ) {\n#else\n    if ( action.sa_handler == SIG_DFL ) {\n#endif\n        action.sa_handler = SDL_HandleSIG;\n        sigaction(SIGINT, &action, NULL);\n    }\n    sigaction(SIGTERM, NULL, &action);\n\n#ifdef HAVE_SA_SIGACTION\n    if ( action.sa_handler == SIG_DFL && action.sa_sigaction == (void*)SIG_DFL ) {\n#else\n    if ( action.sa_handler == SIG_DFL ) {\n#endif\n        action.sa_handler = SDL_HandleSIG;\n        sigaction(SIGTERM, &action, NULL);\n    }\n#elif HAVE_SIGNAL_H\n    void (*ohandler) (int);\n\n    /* Both SIGINT and SIGTERM are translated into quit interrupts */\n    ohandler = signal(SIGINT, SDL_HandleSIG);\n    if (ohandler != SIG_DFL)\n        signal(SIGINT, ohandler);\n    ohandler = signal(SIGTERM, SDL_HandleSIG);\n    if (ohandler != SIG_DFL)\n        signal(SIGTERM, ohandler);\n#endif /* HAVE_SIGNAL_H */\n\n    /* That's it! */\n    return 0;\n}\n\nint\nSDL_QuitInit(void)\n{\n    if (!SDL_GetHintBoolean(SDL_HINT_NO_SIGNAL_HANDLERS, SDL_FALSE)) {\n        return SDL_QuitInit_Internal();\n    }\n    return 0;\n}\n\nstatic void\nSDL_QuitQuit_Internal(void)\n{\n#ifdef HAVE_SIGACTION\n    struct sigaction action;\n    sigaction(SIGINT, NULL, &action);\n    if ( action.sa_handler == SDL_HandleSIG ) {\n        action.sa_handler = SIG_DFL;\n        sigaction(SIGINT, &action, NULL);\n    }\n    sigaction(SIGTERM, NULL, &action);\n    if ( action.sa_handler == SDL_HandleSIG ) {\n        action.sa_handler = SIG_DFL;\n        sigaction(SIGTERM, &action, NULL);\n    }\n#elif HAVE_SIGNAL_H\n    void (*ohandler) (int);\n\n    ohandler = signal(SIGINT, SIG_DFL);\n    if (ohandler != SDL_HandleSIG)\n        signal(SIGINT, ohandler);\n    ohandler = signal(SIGTERM, SIG_DFL);\n    if (ohandler != SDL_HandleSIG)\n        signal(SIGTERM, ohandler);\n#endif /* HAVE_SIGNAL_H */\n}\n\nvoid\nSDL_QuitQuit(void)\n{\n    if (!disable_signals) {\n        SDL_QuitQuit_Internal();\n    }\n}\n\n/* This function returns 1 if it's okay to close the application window */\nint\nSDL_SendQuit(void)\n{\n    send_quit_pending = SDL_FALSE;\n    return SDL_SendAppEvent(SDL_QUIT);\n}\n\nvoid\nSDL_SendPendingQuit(void)\n{\n    if (send_quit_pending) {\n        SDL_SendQuit();\n        SDL_assert(!send_quit_pending);\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_sysevents.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"../video/SDL_sysvideo.h\"\n\n/* Useful functions and variables from SDL_sysevents.c */\n\n#if defined(__HAIKU__)\n/* The Haiku event loops run in a separate thread */\n#define MUST_THREAD_EVENTS\n#endif\n\n#ifdef __WIN32__              /* Windows doesn't allow a separate event thread */\n#define CANT_THREAD_EVENTS\n#endif\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_touch.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* General touch handling code for SDL */\n\n#include \"SDL_assert.h\"\n#include \"SDL_events.h\"\n#include \"SDL_events_c.h\"\n\n\nstatic int SDL_num_touch = 0;\nstatic SDL_Touch **SDL_touchDevices = NULL;\n\n\n/* Public functions */\nint\nSDL_TouchInit(void)\n{\n    return (0);\n}\n\nint\nSDL_GetNumTouchDevices(void)\n{\n    return SDL_num_touch;\n}\n\nSDL_TouchID\nSDL_GetTouchDevice(int index)\n{\n    if (index < 0 || index >= SDL_num_touch) {\n        SDL_SetError(\"Unknown touch device\");\n        return 0;\n    }\n    return SDL_touchDevices[index]->id;\n}\n\nstatic int\nSDL_GetTouchIndex(SDL_TouchID id)\n{\n    int index;\n    SDL_Touch *touch;\n\n    for (index = 0; index < SDL_num_touch; ++index) {\n        touch = SDL_touchDevices[index];\n        if (touch->id == id) {\n            return index;\n        }\n    }\n    return -1;\n}\n\nSDL_Touch *\nSDL_GetTouch(SDL_TouchID id)\n{\n    int index = SDL_GetTouchIndex(id);\n    if (index < 0 || index >= SDL_num_touch) {\n        SDL_SetError(\"Unknown touch device\");\n        return NULL;\n    }\n    return SDL_touchDevices[index];\n}\n\nstatic int\nSDL_GetFingerIndex(const SDL_Touch * touch, SDL_FingerID fingerid)\n{\n    int index;\n    for (index = 0; index < touch->num_fingers; ++index) {\n        if (touch->fingers[index]->id == fingerid) {\n            return index;\n        }\n    }\n    return -1;\n}\n\nSDL_Finger *\nSDL_GetFinger(const SDL_Touch * touch, SDL_FingerID id)\n{\n    int index = SDL_GetFingerIndex(touch, id);\n    if (index < 0 || index >= touch->num_fingers) {\n        return NULL;\n    }\n    return touch->fingers[index];\n}\n\nint\nSDL_GetNumTouchFingers(SDL_TouchID touchID)\n{\n    SDL_Touch *touch = SDL_GetTouch(touchID);\n    if (touch) {\n        return touch->num_fingers;\n    }\n    return 0;\n}\n\nSDL_Finger *\nSDL_GetTouchFinger(SDL_TouchID touchID, int index)\n{\n    SDL_Touch *touch = SDL_GetTouch(touchID);\n    if (!touch) {\n        return NULL;\n    }\n    if (index < 0 || index >= touch->num_fingers) {\n        SDL_SetError(\"Unknown touch finger\");\n        return NULL;\n    }\n    return touch->fingers[index];\n}\n\nint\nSDL_AddTouch(SDL_TouchID touchID, const char *name)\n{\n    SDL_Touch **touchDevices;\n    int index;\n\n    index = SDL_GetTouchIndex(touchID);\n    if (index >= 0) {\n        return index;\n    }\n\n    /* Add the touch to the list of touch */\n    touchDevices = (SDL_Touch **) SDL_realloc(SDL_touchDevices,\n                                      (SDL_num_touch + 1) * sizeof(*touchDevices));\n    if (!touchDevices) {\n        return SDL_OutOfMemory();\n    }\n\n    SDL_touchDevices = touchDevices;\n    index = SDL_num_touch;\n\n    SDL_touchDevices[index] = (SDL_Touch *) SDL_malloc(sizeof(*SDL_touchDevices[index]));\n    if (!SDL_touchDevices[index]) {\n        return SDL_OutOfMemory();\n    }\n\n    /* Added touch to list */\n    ++SDL_num_touch;\n\n    /* we're setting the touch properties */\n    SDL_touchDevices[index]->id = touchID;\n    SDL_touchDevices[index]->num_fingers = 0;\n    SDL_touchDevices[index]->max_fingers = 0;\n    SDL_touchDevices[index]->fingers = NULL;\n\n    /* Record this touch device for gestures */\n    /* We could do this on the fly in the gesture code if we wanted */\n    SDL_GestureAddTouch(touchID);\n\n    return index;\n}\n\nstatic int\nSDL_AddFinger(SDL_Touch *touch, SDL_FingerID fingerid, float x, float y, float pressure)\n{\n    SDL_Finger *finger;\n\n    if (touch->num_fingers == touch->max_fingers) {\n        SDL_Finger **new_fingers;\n        new_fingers = (SDL_Finger **)SDL_realloc(touch->fingers, (touch->max_fingers+1)*sizeof(*touch->fingers));\n        if (!new_fingers) {\n            return SDL_OutOfMemory();\n        }\n        touch->fingers = new_fingers;\n        touch->fingers[touch->max_fingers] = (SDL_Finger *)SDL_malloc(sizeof(*finger));\n        if (!touch->fingers[touch->max_fingers]) {\n            return SDL_OutOfMemory();\n        }\n        touch->max_fingers++;\n    }\n\n    finger = touch->fingers[touch->num_fingers++];\n    finger->id = fingerid;\n    finger->x = x;\n    finger->y = y;\n    finger->pressure = pressure;\n    return 0;\n}\n\nstatic int\nSDL_DelFinger(SDL_Touch* touch, SDL_FingerID fingerid)\n{\n    SDL_Finger *temp;\n\n    int index = SDL_GetFingerIndex(touch, fingerid);\n    if (index < 0) {\n        return -1;\n    }\n\n    touch->num_fingers--;\n    temp = touch->fingers[index];\n    touch->fingers[index] = touch->fingers[touch->num_fingers];\n    touch->fingers[touch->num_fingers] = temp;\n    return 0;\n}\n\nint\nSDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid,\n              SDL_bool down, float x, float y, float pressure)\n{\n    int posted;\n    SDL_Finger *finger;\n\n    SDL_Touch* touch = SDL_GetTouch(id);\n    if (!touch) {\n        return -1;\n    }\n\n    finger = SDL_GetFinger(touch, fingerid);\n    if (down) {\n        if (finger) {\n            /* This finger is already down */\n            return 0;\n        }\n\n        if (SDL_AddFinger(touch, fingerid, x, y, pressure) < 0) {\n            return 0;\n        }\n\n        posted = 0;\n        if (SDL_GetEventState(SDL_FINGERDOWN) == SDL_ENABLE) {\n            SDL_Event event;\n            event.tfinger.type = SDL_FINGERDOWN;\n            event.tfinger.touchId = id;\n            event.tfinger.fingerId = fingerid;\n            event.tfinger.x = x;\n            event.tfinger.y = y;\n            event.tfinger.dx = 0;\n            event.tfinger.dy = 0;\n            event.tfinger.pressure = pressure;\n            posted = (SDL_PushEvent(&event) > 0);\n        }\n    } else {\n        if (!finger) {\n            /* This finger is already up */\n            return 0;\n        }\n\n        posted = 0;\n        if (SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) {\n            SDL_Event event;\n            event.tfinger.type = SDL_FINGERUP;\n            event.tfinger.touchId =  id;\n            event.tfinger.fingerId = fingerid;\n            /* I don't trust the coordinates passed on fingerUp */\n            event.tfinger.x = finger->x;\n            event.tfinger.y = finger->y;\n            event.tfinger.dx = 0;\n            event.tfinger.dy = 0;\n            event.tfinger.pressure = pressure;\n            posted = (SDL_PushEvent(&event) > 0);\n        }\n\n        SDL_DelFinger(touch, fingerid);\n    }\n    return posted;\n}\n\nint\nSDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid,\n                    float x, float y, float pressure)\n{\n    SDL_Touch *touch;\n    SDL_Finger *finger;\n    int posted;\n    float xrel, yrel, prel;\n\n    touch = SDL_GetTouch(id);\n    if (!touch) {\n        return -1;\n    }\n\n    finger = SDL_GetFinger(touch,fingerid);\n    if (!finger) {\n        return SDL_SendTouch(id, fingerid, SDL_TRUE, x, y, pressure);\n    }\n\n    xrel = x - finger->x;\n    yrel = y - finger->y;\n    prel = pressure - finger->pressure;\n\n    /* Drop events that don't change state */\n    if (!xrel && !yrel && !prel) {\n#if 0\n        printf(\"Touch event didn't change state - dropped!\\n\");\n#endif\n        return 0;\n    }\n\n    /* Update internal touch coordinates */\n    finger->x = x;\n    finger->y = y;\n    finger->pressure = pressure;\n\n    /* Post the event, if desired */\n    posted = 0;\n    if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) {\n        SDL_Event event;\n        event.tfinger.type = SDL_FINGERMOTION;\n        event.tfinger.touchId = id;\n        event.tfinger.fingerId = fingerid;\n        event.tfinger.x = x;\n        event.tfinger.y = y;\n        event.tfinger.dx = xrel;\n        event.tfinger.dy = yrel;\n        event.tfinger.pressure = pressure;\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n    return posted;\n}\n\nvoid\nSDL_DelTouch(SDL_TouchID id)\n{\n    int i;\n    int index = SDL_GetTouchIndex(id);\n    SDL_Touch *touch = SDL_GetTouch(id);\n\n    if (!touch) {\n        return;\n    }\n\n    for (i = 0; i < touch->max_fingers; ++i) {\n        SDL_free(touch->fingers[i]);\n    }\n    SDL_free(touch->fingers);\n    SDL_free(touch);\n\n    SDL_num_touch--;\n    SDL_touchDevices[index] = SDL_touchDevices[SDL_num_touch];\n}\n\nvoid\nSDL_TouchQuit(void)\n{\n    int i;\n\n    for (i = SDL_num_touch; i--; ) {\n        SDL_DelTouch(SDL_touchDevices[i]->id);\n    }\n    SDL_assert(SDL_num_touch == 0);\n\n    SDL_free(SDL_touchDevices);\n    SDL_touchDevices = NULL;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_touch_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n#include \"../../include/SDL_touch.h\"\n\n#ifndef _SDL_touch_c_h\n#define _SDL_touch_c_h\n\ntypedef struct SDL_Touch\n{\n    SDL_TouchID id;\n    int num_fingers;\n    int max_fingers;\n    SDL_Finger** fingers;\n} SDL_Touch;\n\n\n/* Initialize the touch subsystem */\nextern int SDL_TouchInit(void);\n\n/* Add a touch, returning the index of the touch, or -1 if there was an error. */\nextern int SDL_AddTouch(SDL_TouchID id, const char *name);\n\n/* Get the touch with a given id */\nextern SDL_Touch *SDL_GetTouch(SDL_TouchID id);\n\n/* Send a touch down/up event for a touch */\nextern int SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid,\n                         SDL_bool down, float x, float y, float pressure);\n\n/* Send a touch motion event for a touch */\nextern int SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid,\n                               float x, float y, float pressure);\n\n/* Remove a touch */\nextern void SDL_DelTouch(SDL_TouchID id);\n\n/* Shutdown the touch subsystem */\nextern void SDL_TouchQuit(void);\n\n#endif /* _SDL_touch_c_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_windowevents.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Window event handling code for SDL */\n\n#include \"SDL_events.h\"\n#include \"SDL_events_c.h\"\n#include \"SDL_mouse_c.h\"\n#include \"../video/SDL_sysvideo.h\"\n\n\nstatic int\nRemovePendingResizedEvents(void * userdata, SDL_Event *event)\n{\n    SDL_Event *new_event = (SDL_Event *)userdata;\n\n    if (event->type == SDL_WINDOWEVENT &&\n        event->window.event == SDL_WINDOWEVENT_RESIZED &&\n        event->window.windowID == new_event->window.windowID) {\n        /* We're about to post a new size event, drop the old one */\n        return 0;\n    }\n    return 1;\n}\n\nstatic int\nRemovePendingSizeChangedEvents(void * userdata, SDL_Event *event)\n{\n    SDL_Event *new_event = (SDL_Event *)userdata;\n\n    if (event->type == SDL_WINDOWEVENT &&\n        event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED &&\n        event->window.windowID == new_event->window.windowID) {\n        /* We're about to post a new size event, drop the old one */\n        return 0;\n    }\n    return 1;\n}\n\nstatic int\nRemovePendingMoveEvents(void * userdata, SDL_Event *event)\n{\n    SDL_Event *new_event = (SDL_Event *)userdata;\n\n    if (event->type == SDL_WINDOWEVENT &&\n        event->window.event == SDL_WINDOWEVENT_MOVED &&\n        event->window.windowID == new_event->window.windowID) {\n        /* We're about to post a new move event, drop the old one */\n        return 0;\n    }\n    return 1;\n}\n\nstatic int\nRemovePendingExposedEvents(void * userdata, SDL_Event *event)\n{\n    SDL_Event *new_event = (SDL_Event *)userdata;\n\n    if (event->type == SDL_WINDOWEVENT &&\n        event->window.event == SDL_WINDOWEVENT_EXPOSED &&\n        event->window.windowID == new_event->window.windowID) {\n        /* We're about to post a new exposed event, drop the old one */\n        return 0;\n    }\n    return 1;\n}\n\nint\nSDL_SendWindowEvent(SDL_Window * window, Uint8 windowevent, int data1,\n                    int data2)\n{\n    int posted;\n\n    if (!window) {\n        return 0;\n    }\n    switch (windowevent) {\n    case SDL_WINDOWEVENT_SHOWN:\n        if (window->flags & SDL_WINDOW_SHOWN) {\n            return 0;\n        }\n        window->flags &= ~SDL_WINDOW_HIDDEN;\n        window->flags |= SDL_WINDOW_SHOWN;\n        SDL_OnWindowShown(window);\n        break;\n    case SDL_WINDOWEVENT_HIDDEN:\n        if (!(window->flags & SDL_WINDOW_SHOWN)) {\n            return 0;\n        }\n        window->flags &= ~SDL_WINDOW_SHOWN;\n        window->flags |= SDL_WINDOW_HIDDEN;\n        SDL_OnWindowHidden(window);\n        break;\n    case SDL_WINDOWEVENT_MOVED:\n        if (SDL_WINDOWPOS_ISUNDEFINED(data1) ||\n            SDL_WINDOWPOS_ISUNDEFINED(data2)) {\n            return 0;\n        }\n        if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {\n            window->windowed.x = data1;\n            window->windowed.y = data2;\n        }\n        if (data1 == window->x && data2 == window->y) {\n            return 0;\n        }\n        window->x = data1;\n        window->y = data2;\n        break;\n    case SDL_WINDOWEVENT_RESIZED:\n        if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {\n            window->windowed.w = data1;\n            window->windowed.h = data2;\n        }\n        if (data1 == window->w && data2 == window->h) {\n            return 0;\n        }\n        window->w = data1;\n        window->h = data2;\n        SDL_OnWindowResized(window);\n        break;\n    case SDL_WINDOWEVENT_MINIMIZED:\n        if (window->flags & SDL_WINDOW_MINIMIZED) {\n            return 0;\n        }\n        window->flags &= ~SDL_WINDOW_MAXIMIZED;\n        window->flags |= SDL_WINDOW_MINIMIZED;\n        SDL_OnWindowMinimized(window);\n        break;\n    case SDL_WINDOWEVENT_MAXIMIZED:\n        if (window->flags & SDL_WINDOW_MAXIMIZED) {\n            return 0;\n        }\n        window->flags &= ~SDL_WINDOW_MINIMIZED;\n        window->flags |= SDL_WINDOW_MAXIMIZED;\n        break;\n    case SDL_WINDOWEVENT_RESTORED:\n        if (!(window->flags & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED))) {\n            return 0;\n        }\n        window->flags &= ~(SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED);\n        SDL_OnWindowRestored(window);\n        break;\n    case SDL_WINDOWEVENT_ENTER:\n        if (window->flags & SDL_WINDOW_MOUSE_FOCUS) {\n            return 0;\n        }\n        window->flags |= SDL_WINDOW_MOUSE_FOCUS;\n        SDL_OnWindowEnter(window);\n        break;\n    case SDL_WINDOWEVENT_LEAVE:\n        if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) {\n            return 0;\n        }\n        window->flags &= ~SDL_WINDOW_MOUSE_FOCUS;\n        SDL_OnWindowLeave(window);\n        break;\n    case SDL_WINDOWEVENT_FOCUS_GAINED:\n        if (window->flags & SDL_WINDOW_INPUT_FOCUS) {\n            return 0;\n        }\n        window->flags |= SDL_WINDOW_INPUT_FOCUS;\n        SDL_OnWindowFocusGained(window);\n        break;\n    case SDL_WINDOWEVENT_FOCUS_LOST:\n        if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) {\n            return 0;\n        }\n        window->flags &= ~SDL_WINDOW_INPUT_FOCUS;\n        SDL_OnWindowFocusLost(window);\n        break;\n    }\n\n    /* Post the event, if desired */\n    posted = 0;\n    if (SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE) {\n        SDL_Event event;\n        event.type = SDL_WINDOWEVENT;\n        event.window.event = windowevent;\n        event.window.data1 = data1;\n        event.window.data2 = data2;\n        event.window.windowID = window->id;\n\n        /* Fixes queue overflow with resize events that aren't processed */\n        if (windowevent == SDL_WINDOWEVENT_RESIZED) {\n            SDL_FilterEvents(RemovePendingResizedEvents, &event);\n        }\n        if (windowevent == SDL_WINDOWEVENT_SIZE_CHANGED) {\n            SDL_FilterEvents(RemovePendingSizeChangedEvents, &event);\n        }\n        if (windowevent == SDL_WINDOWEVENT_MOVED) {\n            SDL_FilterEvents(RemovePendingMoveEvents, &event);\n        }\n        if (windowevent == SDL_WINDOWEVENT_EXPOSED) {\n            SDL_FilterEvents(RemovePendingExposedEvents, &event);\n        }\n        posted = (SDL_PushEvent(&event) > 0);\n    }\n\n    if (windowevent == SDL_WINDOWEVENT_CLOSE) {\n        if ( !window->prev && !window->next ) {\n            /* This is the last window in the list so send the SDL_QUIT event */\n            SDL_SendQuit();\n        }\n    }\n\n    return (posted);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/SDL_windowevents_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_windowevents_c_h\n#define _SDL_windowevents_c_h\n\nextern int SDL_SendWindowEvent(SDL_Window * window, Uint8 windowevent,\n                               int data1, int data2);\n\n#endif /* _SDL_windowevents_c_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/blank_cursor.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * A default blank 8x8 cursor                                                */\n\n#define BLANK_CWIDTH    8\n#define BLANK_CHEIGHT   8\n#define BLANK_CHOTX 0\n#define BLANK_CHOTY 0\n\nstatic const unsigned char blank_cdata[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };\nstatic const unsigned char blank_cmask[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/default_cursor.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Default cursor - it happens to be the Mac cursor, but could be anything   */\n\n#define DEFAULT_CWIDTH  16\n#define DEFAULT_CHEIGHT 16\n#define DEFAULT_CHOTX   0\n#define DEFAULT_CHOTY   0\n\n/* Added a real MacOS cursor, at the request of Luc-Olivier de Charrire */\n#define USE_MACOS_CURSOR\n\n#ifdef USE_MACOS_CURSOR\n\nstatic const unsigned char default_cdata[] = {\n    0x00, 0x00,\n    0x40, 0x00,\n    0x60, 0x00,\n    0x70, 0x00,\n    0x78, 0x00,\n    0x7C, 0x00,\n    0x7E, 0x00,\n    0x7F, 0x00,\n    0x7F, 0x80,\n    0x7C, 0x00,\n    0x6C, 0x00,\n    0x46, 0x00,\n    0x06, 0x00,\n    0x03, 0x00,\n    0x03, 0x00,\n    0x00, 0x00\n};\n\nstatic const unsigned char default_cmask[] = {\n    0xC0, 0x00,\n    0xE0, 0x00,\n    0xF0, 0x00,\n    0xF8, 0x00,\n    0xFC, 0x00,\n    0xFE, 0x00,\n    0xFF, 0x00,\n    0xFF, 0x80,\n    0xFF, 0xC0,\n    0xFF, 0xE0,\n    0xFE, 0x00,\n    0xEF, 0x00,\n    0xCF, 0x00,\n    0x87, 0x80,\n    0x07, 0x80,\n    0x03, 0x00\n};\n\n#else\n\nstatic const unsigned char default_cdata[] = {\n    0x00, 0x00,\n    0x40, 0x00,\n    0x60, 0x00,\n    0x70, 0x00,\n    0x78, 0x00,\n    0x7C, 0x00,\n    0x7E, 0x00,\n    0x7F, 0x00,\n    0x7F, 0x80,\n    0x7C, 0x00,\n    0x6C, 0x00,\n    0x46, 0x00,\n    0x06, 0x00,\n    0x03, 0x00,\n    0x03, 0x00,\n    0x00, 0x00\n};\n\nstatic const unsigned char default_cmask[] = {\n    0x40, 0x00,\n    0xE0, 0x00,\n    0xF0, 0x00,\n    0xF8, 0x00,\n    0xFC, 0x00,\n    0xFE, 0x00,\n    0xFF, 0x00,\n    0xFF, 0x80,\n    0xFF, 0xC0,\n    0xFF, 0x80,\n    0xFE, 0x00,\n    0xEF, 0x00,\n    0x4F, 0x00,\n    0x07, 0x80,\n    0x07, 0x80,\n    0x03, 0x00\n};\n\n#endif /* USE_MACOS_CURSOR */\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/events/scancodes_darwin.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* Mac virtual key code to SDL scancode mapping table\n   Sources:\n   - Inside Macintosh: Text <http://developer.apple.com/documentation/mac/Text/Text-571.html>\n   - Apple USB keyboard driver source <http://darwinsource.opendarwin.org/10.4.6.ppc/IOHIDFamily-172.8/IOHIDFamily/Cosmo_USB2ADB.c>\n   - experimentation on various ADB and USB ISO keyboards and one ADB ANSI keyboard\n*/\n/* *INDENT-OFF* */\nstatic const SDL_Scancode darwin_scancode_table[] = {\n    /*   0 */   SDL_SCANCODE_A,\n    /*   1 */   SDL_SCANCODE_S,\n    /*   2 */   SDL_SCANCODE_D,\n    /*   3 */   SDL_SCANCODE_F,\n    /*   4 */   SDL_SCANCODE_H,\n    /*   5 */   SDL_SCANCODE_G,\n    /*   6 */   SDL_SCANCODE_Z,\n    /*   7 */   SDL_SCANCODE_X,\n    /*   8 */   SDL_SCANCODE_C,\n    /*   9 */   SDL_SCANCODE_V,\n    /*  10 */   SDL_SCANCODE_NONUSBACKSLASH, /* SDL_SCANCODE_NONUSBACKSLASH on ANSI and JIS keyboards (if this key would exist there), SDL_SCANCODE_GRAVE on ISO. (The USB keyboard driver actually translates these usage codes to different virtual key codes depending on whether the keyboard is ISO/ANSI/JIS. That's why you have to help it identify the keyboard type when you plug in a PC USB keyboard. It's a historical thing - ADB keyboards are wired this way.) */\n    /*  11 */   SDL_SCANCODE_B,\n    /*  12 */   SDL_SCANCODE_Q,\n    /*  13 */   SDL_SCANCODE_W,\n    /*  14 */   SDL_SCANCODE_E,\n    /*  15 */   SDL_SCANCODE_R,\n    /*  16 */   SDL_SCANCODE_Y,\n    /*  17 */   SDL_SCANCODE_T,\n    /*  18 */   SDL_SCANCODE_1,\n    /*  19 */   SDL_SCANCODE_2,\n    /*  20 */   SDL_SCANCODE_3,\n    /*  21 */   SDL_SCANCODE_4,\n    /*  22 */   SDL_SCANCODE_6,\n    /*  23 */   SDL_SCANCODE_5,\n    /*  24 */   SDL_SCANCODE_EQUALS,\n    /*  25 */   SDL_SCANCODE_9,\n    /*  26 */   SDL_SCANCODE_7,\n    /*  27 */   SDL_SCANCODE_MINUS,\n    /*  28 */   SDL_SCANCODE_8,\n    /*  29 */   SDL_SCANCODE_0,\n    /*  30 */   SDL_SCANCODE_RIGHTBRACKET,\n    /*  31 */   SDL_SCANCODE_O,\n    /*  32 */   SDL_SCANCODE_U,\n    /*  33 */   SDL_SCANCODE_LEFTBRACKET,\n    /*  34 */   SDL_SCANCODE_I,\n    /*  35 */   SDL_SCANCODE_P,\n    /*  36 */   SDL_SCANCODE_RETURN,\n    /*  37 */   SDL_SCANCODE_L,\n    /*  38 */   SDL_SCANCODE_J,\n    /*  39 */   SDL_SCANCODE_APOSTROPHE,\n    /*  40 */   SDL_SCANCODE_K,\n    /*  41 */   SDL_SCANCODE_SEMICOLON,\n    /*  42 */   SDL_SCANCODE_BACKSLASH,\n    /*  43 */   SDL_SCANCODE_COMMA,\n    /*  44 */   SDL_SCANCODE_SLASH,\n    /*  45 */   SDL_SCANCODE_N,\n    /*  46 */   SDL_SCANCODE_M,\n    /*  47 */   SDL_SCANCODE_PERIOD,\n    /*  48 */   SDL_SCANCODE_TAB,\n    /*  49 */   SDL_SCANCODE_SPACE,\n    /*  50 */   SDL_SCANCODE_GRAVE, /* SDL_SCANCODE_GRAVE on ANSI and JIS keyboards, SDL_SCANCODE_NONUSBACKSLASH on ISO (see comment about virtual key code 10 above) */\n    /*  51 */   SDL_SCANCODE_BACKSPACE,\n    /*  52 */   SDL_SCANCODE_KP_ENTER, /* keyboard enter on portables */\n    /*  53 */   SDL_SCANCODE_ESCAPE,\n    /*  54 */   SDL_SCANCODE_RGUI,\n    /*  55 */   SDL_SCANCODE_LGUI,\n    /*  56 */   SDL_SCANCODE_LSHIFT,\n    /*  57 */   SDL_SCANCODE_CAPSLOCK,\n    /*  58 */   SDL_SCANCODE_LALT,\n    /*  59 */   SDL_SCANCODE_LCTRL,\n    /*  60 */   SDL_SCANCODE_RSHIFT,\n    /*  61 */   SDL_SCANCODE_RALT,\n    /*  62 */   SDL_SCANCODE_RCTRL,\n    /*  63 */   SDL_SCANCODE_RGUI, /* fn on portables, acts as a hardware-level modifier already, so we don't generate events for it, also XK_Meta_R */\n    /*  64 */   SDL_SCANCODE_F17,\n    /*  65 */   SDL_SCANCODE_KP_PERIOD,\n    /*  66 */   SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */\n    /*  67 */   SDL_SCANCODE_KP_MULTIPLY,\n    /*  68 */   SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */\n    /*  69 */   SDL_SCANCODE_KP_PLUS,\n    /*  70 */   SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */\n    /*  71 */   SDL_SCANCODE_NUMLOCKCLEAR,\n    /*  72 */   SDL_SCANCODE_VOLUMEUP,\n    /*  73 */   SDL_SCANCODE_VOLUMEDOWN,\n    /*  74 */   SDL_SCANCODE_MUTE,\n    /*  75 */   SDL_SCANCODE_KP_DIVIDE,\n    /*  76 */   SDL_SCANCODE_KP_ENTER, /* keypad enter on external keyboards, fn-return on portables */\n    /*  77 */   SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */\n    /*  78 */   SDL_SCANCODE_KP_MINUS,\n    /*  79 */   SDL_SCANCODE_F18,\n    /*  80 */   SDL_SCANCODE_F19,\n    /*  81 */   SDL_SCANCODE_KP_EQUALS,\n    /*  82 */   SDL_SCANCODE_KP_0,\n    /*  83 */   SDL_SCANCODE_KP_1,\n    /*  84 */   SDL_SCANCODE_KP_2,\n    /*  85 */   SDL_SCANCODE_KP_3,\n    /*  86 */   SDL_SCANCODE_KP_4,\n    /*  87 */   SDL_SCANCODE_KP_5,\n    /*  88 */   SDL_SCANCODE_KP_6,\n    /*  89 */   SDL_SCANCODE_KP_7,\n    /*  90 */   SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */\n    /*  91 */   SDL_SCANCODE_KP_8,\n    /*  92 */   SDL_SCANCODE_KP_9,\n    /*  93 */   SDL_SCANCODE_INTERNATIONAL3, /* Cosmo_USB2ADB.c says \"Yen (JIS)\" */\n    /*  94 */   SDL_SCANCODE_INTERNATIONAL1, /* Cosmo_USB2ADB.c says \"Ro (JIS)\" */\n    /*  95 */   SDL_SCANCODE_KP_COMMA, /* Cosmo_USB2ADB.c says \", JIS only\" */\n    /*  96 */   SDL_SCANCODE_F5,\n    /*  97 */   SDL_SCANCODE_F6,\n    /*  98 */   SDL_SCANCODE_F7,\n    /*  99 */   SDL_SCANCODE_F3,\n    /* 100 */   SDL_SCANCODE_F8,\n    /* 101 */   SDL_SCANCODE_F9,\n    /* 102 */   SDL_SCANCODE_LANG2, /* Cosmo_USB2ADB.c says \"Eisu\" */\n    /* 103 */   SDL_SCANCODE_F11,\n    /* 104 */   SDL_SCANCODE_LANG1, /* Cosmo_USB2ADB.c says \"Kana\" */\n    /* 105 */   SDL_SCANCODE_PRINTSCREEN, /* On ADB keyboards, this key is labeled \"F13/print screen\". Problem: USB has different usage codes for these two functions. On Apple USB keyboards, the key is labeled \"F13\" and sends the F13 usage code (SDL_SCANCODE_F13). I decided to use SDL_SCANCODE_PRINTSCREEN here nevertheless since SDL applications are more likely to assume the presence of a print screen key than an F13 key. */\n    /* 106 */   SDL_SCANCODE_F16,\n    /* 107 */   SDL_SCANCODE_SCROLLLOCK, /* F14/scroll lock, see comment about F13/print screen above */\n    /* 108 */   SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */\n    /* 109 */   SDL_SCANCODE_F10,\n    /* 110 */   SDL_SCANCODE_APPLICATION, /* windows contextual menu key, fn-enter on portables */\n    /* 111 */   SDL_SCANCODE_F12,\n    /* 112 */   SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */\n    /* 113 */   SDL_SCANCODE_PAUSE, /* F15/pause, see comment about F13/print screen above */\n    /* 114 */   SDL_SCANCODE_INSERT, /* the key is actually labeled \"help\" on Apple keyboards, and works as such in Mac OS, but it sends the \"insert\" usage code even on Apple USB keyboards */\n    /* 115 */   SDL_SCANCODE_HOME,\n    /* 116 */   SDL_SCANCODE_PAGEUP,\n    /* 117 */   SDL_SCANCODE_DELETE,\n    /* 118 */   SDL_SCANCODE_F4,\n    /* 119 */   SDL_SCANCODE_END,\n    /* 120 */   SDL_SCANCODE_F2,\n    /* 121 */   SDL_SCANCODE_PAGEDOWN,\n    /* 122 */   SDL_SCANCODE_F1,\n    /* 123 */   SDL_SCANCODE_LEFT,\n    /* 124 */   SDL_SCANCODE_RIGHT,\n    /* 125 */   SDL_SCANCODE_DOWN,\n    /* 126 */   SDL_SCANCODE_UP,\n    /* 127 */   SDL_SCANCODE_POWER\n};\n/* *INDENT-ON* */\n"
  },
  {
    "path": "libs/SDL2/src/events/scancodes_linux.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../include/SDL_scancode.h\"\n\n/* Linux virtual key code to SDL_Keycode mapping table\n   Sources:\n   - Linux kernel source input.h\n*/\n/* *INDENT-OFF* */\nstatic SDL_Scancode const linux_scancode_table[] = {\n    /*  0 */    SDL_SCANCODE_UNKNOWN,\n    /*  1 */    SDL_SCANCODE_ESCAPE,\n    /*  2 */    SDL_SCANCODE_1,\n    /*  3 */    SDL_SCANCODE_2,\n    /*  4 */    SDL_SCANCODE_3,\n    /*  5 */    SDL_SCANCODE_4,\n    /*  6 */    SDL_SCANCODE_5,\n    /*  7 */    SDL_SCANCODE_6,\n    /*  8 */    SDL_SCANCODE_7,\n    /*  9 */    SDL_SCANCODE_8,\n    /*  10 */    SDL_SCANCODE_9,\n    /*  11 */    SDL_SCANCODE_0,\n    /*  12 */    SDL_SCANCODE_MINUS,\n    /*  13 */    SDL_SCANCODE_EQUALS,\n    /*  14 */    SDL_SCANCODE_BACKSPACE,\n    /*  15 */    SDL_SCANCODE_TAB,\n    /*  16 */    SDL_SCANCODE_Q,\n    /*  17 */    SDL_SCANCODE_W,\n    /*  18 */    SDL_SCANCODE_E,\n    /*  19 */    SDL_SCANCODE_R,\n    /*  20 */    SDL_SCANCODE_T,\n    /*  21 */    SDL_SCANCODE_Y,\n    /*  22 */    SDL_SCANCODE_U,\n    /*  23 */    SDL_SCANCODE_I,\n    /*  24 */    SDL_SCANCODE_O,\n    /*  25 */    SDL_SCANCODE_P,\n    /*  26 */    SDL_SCANCODE_LEFTBRACKET,\n    /*  27 */    SDL_SCANCODE_RIGHTBRACKET,\n    /*  28 */    SDL_SCANCODE_RETURN,\n    /*  29 */    SDL_SCANCODE_LCTRL,\n    /*  30 */    SDL_SCANCODE_A,\n    /*  31 */    SDL_SCANCODE_S,\n    /*  32 */    SDL_SCANCODE_D,\n    /*  33 */    SDL_SCANCODE_F,\n    /*  34 */    SDL_SCANCODE_G,\n    /*  35 */    SDL_SCANCODE_H,\n    /*  36 */    SDL_SCANCODE_J,\n    /*  37 */    SDL_SCANCODE_K,\n    /*  38 */    SDL_SCANCODE_L,\n    /*  39 */    SDL_SCANCODE_SEMICOLON,\n    /*  40 */    SDL_SCANCODE_APOSTROPHE,\n    /*  41 */    SDL_SCANCODE_GRAVE,\n    /*  42 */    SDL_SCANCODE_LSHIFT,\n    /*  43 */    SDL_SCANCODE_BACKSLASH,\n    /*  44 */    SDL_SCANCODE_Z,\n    /*  45 */    SDL_SCANCODE_X,\n    /*  46 */    SDL_SCANCODE_C,\n    /*  47 */    SDL_SCANCODE_V,\n    /*  48 */    SDL_SCANCODE_B,\n    /*  49 */    SDL_SCANCODE_N,\n    /*  50 */    SDL_SCANCODE_M,\n    /*  51 */    SDL_SCANCODE_COMMA,\n    /*  52 */    SDL_SCANCODE_PERIOD,\n    /*  53 */    SDL_SCANCODE_SLASH,\n    /*  54 */    SDL_SCANCODE_RSHIFT,\n    /*  55 */    SDL_SCANCODE_KP_MULTIPLY,\n    /*  56 */    SDL_SCANCODE_LALT,\n    /*  57 */    SDL_SCANCODE_SPACE,\n    /*  58 */    SDL_SCANCODE_CAPSLOCK,\n    /*  59 */    SDL_SCANCODE_F1,\n    /*  60 */    SDL_SCANCODE_F2,\n    /*  61 */    SDL_SCANCODE_F3,\n    /*  62 */    SDL_SCANCODE_F4,\n    /*  63 */    SDL_SCANCODE_F5,\n    /*  64 */    SDL_SCANCODE_F6,\n    /*  65 */    SDL_SCANCODE_F7,\n    /*  66 */    SDL_SCANCODE_F8,\n    /*  67 */    SDL_SCANCODE_F9,\n    /*  68 */    SDL_SCANCODE_F10,\n    /*  69 */    SDL_SCANCODE_NUMLOCKCLEAR,\n    /*  70 */    SDL_SCANCODE_SCROLLLOCK,\n    /*  71 */    SDL_SCANCODE_KP_7,\n    /*  72 */    SDL_SCANCODE_KP_8,\n    /*  73 */    SDL_SCANCODE_KP_9,\n    /*  74 */    SDL_SCANCODE_KP_MINUS,\n    /*  75 */    SDL_SCANCODE_KP_4,\n    /*  76 */    SDL_SCANCODE_KP_5,\n    /*  77 */    SDL_SCANCODE_KP_6,\n    /*  78 */    SDL_SCANCODE_KP_PLUS,\n    /*  79 */    SDL_SCANCODE_KP_1,\n    /*  80 */    SDL_SCANCODE_KP_2,\n    /*  81 */    SDL_SCANCODE_KP_3,\n    /*  82 */    SDL_SCANCODE_KP_0,\n    /*  83 */    SDL_SCANCODE_KP_PERIOD,\n    0,\n    /*  85 */    SDL_SCANCODE_LANG5, /* KEY_ZENKAKUHANKAKU */\n    /*  86 */    SDL_SCANCODE_NONUSBACKSLASH, /* KEY_102ND */\n    /*  87 */    SDL_SCANCODE_F11,\n    /*  88 */    SDL_SCANCODE_F12,\n    /*  89 */    SDL_SCANCODE_INTERNATIONAL1, /* KEY_RO */\n    /*  90 */    SDL_SCANCODE_LANG3, /* KEY_KATAKANA */\n    /*  91 */    SDL_SCANCODE_LANG4, /* KEY_HIRAGANA */\n    /*  92 */    SDL_SCANCODE_INTERNATIONAL4, /* KEY_HENKAN */\n    /*  93 */    SDL_SCANCODE_INTERNATIONAL2, /* KEY_KATAKANAHIRAGANA */\n    /*  94 */    SDL_SCANCODE_INTERNATIONAL5, /* KEY_MUHENKAN */\n    /*  95 */    SDL_SCANCODE_INTERNATIONAL5, /* KEY_KPJPCOMMA */\n    /*  96 */    SDL_SCANCODE_KP_ENTER,\n    /*  97 */    SDL_SCANCODE_RCTRL,\n    /*  98 */    SDL_SCANCODE_KP_DIVIDE,\n    /*  99 */    SDL_SCANCODE_SYSREQ,\n    /*  100 */    SDL_SCANCODE_RALT,\n    /*  101 */    SDL_SCANCODE_UNKNOWN, /* KEY_LINEFEED */\n    /*  102 */    SDL_SCANCODE_HOME,\n    /*  103 */    SDL_SCANCODE_UP,\n    /*  104 */    SDL_SCANCODE_PAGEUP,\n    /*  105 */    SDL_SCANCODE_LEFT,\n    /*  106 */    SDL_SCANCODE_RIGHT,\n    /*  107 */    SDL_SCANCODE_END,\n    /*  108 */    SDL_SCANCODE_DOWN,\n    /*  109 */    SDL_SCANCODE_PAGEDOWN,\n    /*  110 */    SDL_SCANCODE_INSERT,\n    /*  111 */    SDL_SCANCODE_DELETE,\n    /*  112 */    SDL_SCANCODE_UNKNOWN, /* KEY_MACRO */\n    /*  113 */    SDL_SCANCODE_MUTE,\n    /*  114 */    SDL_SCANCODE_VOLUMEDOWN,\n    /*  115 */    SDL_SCANCODE_VOLUMEUP,\n    /*  116 */    SDL_SCANCODE_POWER,\n    /*  117 */    SDL_SCANCODE_KP_EQUALS,\n    /*  118 */    SDL_SCANCODE_KP_PLUSMINUS,\n    /*  119 */    SDL_SCANCODE_PAUSE,\n    0,\n    /*  121 */    SDL_SCANCODE_KP_COMMA,\n    /*  122 */    SDL_SCANCODE_LANG1, /* KEY_HANGUEL */\n    /*  123 */    SDL_SCANCODE_LANG2, /* KEY_HANJA */\n    /*  124 */    SDL_SCANCODE_INTERNATIONAL3, /* KEY_YEN */\n    /*  125 */    SDL_SCANCODE_LGUI,\n    /*  126 */    SDL_SCANCODE_RGUI,\n    /*  127 */    SDL_SCANCODE_APPLICATION, /* KEY_COMPOSE */\n    /*  128 */    SDL_SCANCODE_STOP,\n    /*  129 */    SDL_SCANCODE_AGAIN,\n    /*  130 */    SDL_SCANCODE_UNKNOWN, /* KEY_PROPS */\n    /*  131 */    SDL_SCANCODE_UNDO,\n    /*  132 */    SDL_SCANCODE_UNKNOWN, /* KEY_FRONT */\n    /*  133 */    SDL_SCANCODE_COPY,\n    /*  134 */    SDL_SCANCODE_UNKNOWN, /* KEY_OPEN */\n    /*  135 */    SDL_SCANCODE_PASTE,\n    /*  136 */    SDL_SCANCODE_FIND,\n    /*  137 */    SDL_SCANCODE_CUT,\n    /*  138 */    SDL_SCANCODE_HELP,\n    /*  139 */    SDL_SCANCODE_MENU,\n    /*  140 */    SDL_SCANCODE_CALCULATOR,\n    /*  141 */    SDL_SCANCODE_UNKNOWN, /* KEY_SETUP */\n    /*  142 */    SDL_SCANCODE_SLEEP,\n    /*  143 */    SDL_SCANCODE_UNKNOWN, /* KEY_WAKEUP */\n    /*  144 */    SDL_SCANCODE_UNKNOWN, /* KEY_FILE */\n    /*  145 */    SDL_SCANCODE_UNKNOWN, /* KEY_SENDFILE */\n    /*  146 */    SDL_SCANCODE_UNKNOWN, /* KEY_DELETEFILE */\n    /*  147 */    SDL_SCANCODE_UNKNOWN, /* KEY_XFER */\n    /*  148 */    SDL_SCANCODE_APP1, /* KEY_PROG1 */\n    /*  149 */    SDL_SCANCODE_APP2, /* KEY_PROG2 */\n    /*  150 */    SDL_SCANCODE_WWW, /* KEY_WWW */\n    /*  151 */    SDL_SCANCODE_UNKNOWN, /* KEY_MSDOS */\n    /*  152 */    SDL_SCANCODE_UNKNOWN, /* KEY_COFFEE */\n    /*  153 */    SDL_SCANCODE_UNKNOWN, /* KEY_DIRECTION */\n    /*  154 */    SDL_SCANCODE_UNKNOWN, /* KEY_CYCLEWINDOWS */\n    /*  155 */    SDL_SCANCODE_MAIL,\n    /*  156 */    SDL_SCANCODE_AC_BOOKMARKS,\n    /*  157 */    SDL_SCANCODE_COMPUTER,\n    /*  158 */    SDL_SCANCODE_AC_BACK,\n    /*  159 */    SDL_SCANCODE_AC_FORWARD,\n    /*  160 */    SDL_SCANCODE_UNKNOWN, /* KEY_CLOSECD */\n    /*  161 */    SDL_SCANCODE_EJECT, /* KEY_EJECTCD */\n    /*  162 */    SDL_SCANCODE_UNKNOWN, /* KEY_EJECTCLOSECD */\n    /*  163 */    SDL_SCANCODE_AUDIONEXT, /* KEY_NEXTSONG */\n    /*  164 */    SDL_SCANCODE_AUDIOPLAY, /* KEY_PLAYPAUSE */\n    /*  165 */    SDL_SCANCODE_AUDIOPREV, /* KEY_PREVIOUSSONG */\n    /*  166 */    SDL_SCANCODE_AUDIOSTOP, /* KEY_STOPCD */\n    /*  167 */    SDL_SCANCODE_UNKNOWN, /* KEY_RECORD */\n    /*  168 */    SDL_SCANCODE_UNKNOWN, /* KEY_REWIND */\n    /*  169 */    SDL_SCANCODE_UNKNOWN, /* KEY_PHONE */\n    /*  170 */    SDL_SCANCODE_UNKNOWN, /* KEY_ISO */\n    /*  171 */    SDL_SCANCODE_UNKNOWN, /* KEY_CONFIG */\n    /*  172 */    SDL_SCANCODE_AC_HOME,\n    /*  173 */    SDL_SCANCODE_AC_REFRESH,\n    /*  174 */    SDL_SCANCODE_UNKNOWN, /* KEY_EXIT */\n    /*  175 */    SDL_SCANCODE_UNKNOWN, /* KEY_MOVE */\n    /*  176 */    SDL_SCANCODE_UNKNOWN, /* KEY_EDIT */\n    /*  177 */    SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLUP */\n    /*  178 */    SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLDOWN */\n    /*  179 */    SDL_SCANCODE_KP_LEFTPAREN,\n    /*  180 */    SDL_SCANCODE_KP_RIGHTPAREN,\n    /*  181 */    SDL_SCANCODE_UNKNOWN, /* KEY_NEW */\n    /*  182 */    SDL_SCANCODE_UNKNOWN, /* KEY_REDO */\n    /*  183 */    SDL_SCANCODE_F13,\n    /*  184 */    SDL_SCANCODE_F14,\n    /*  185 */    SDL_SCANCODE_F15,\n    /*  186 */    SDL_SCANCODE_F16,\n    /*  187 */    SDL_SCANCODE_F17,\n    /*  188 */    SDL_SCANCODE_F18,\n    /*  189 */    SDL_SCANCODE_F19,\n    /*  190 */    SDL_SCANCODE_F20,\n    /*  191 */    SDL_SCANCODE_F21,\n    /*  192 */    SDL_SCANCODE_F22,\n    /*  193 */    SDL_SCANCODE_F23,\n    /*  194 */    SDL_SCANCODE_F24,\n    0, 0, 0, 0, 0,\n    /*  200 */    SDL_SCANCODE_UNKNOWN, /* KEY_PLAYCD */\n    /*  201 */    SDL_SCANCODE_UNKNOWN, /* KEY_PAUSECD */\n    /*  202 */    SDL_SCANCODE_UNKNOWN, /* KEY_PROG3 */\n    /*  203 */    SDL_SCANCODE_UNKNOWN, /* KEY_PROG4 */\n    0,\n    /*  205 */    SDL_SCANCODE_UNKNOWN, /* KEY_SUSPEND */\n    /*  206 */    SDL_SCANCODE_UNKNOWN, /* KEY_CLOSE */\n    /*  207 */    SDL_SCANCODE_UNKNOWN, /* KEY_PLAY */\n    /*  208 */    SDL_SCANCODE_UNKNOWN, /* KEY_FASTFORWARD */\n    /*  209 */    SDL_SCANCODE_UNKNOWN, /* KEY_BASSBOOST */\n    /*  210 */    SDL_SCANCODE_UNKNOWN, /* KEY_PRINT */\n    /*  211 */    SDL_SCANCODE_UNKNOWN, /* KEY_HP */\n    /*  212 */    SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA */\n    /*  213 */    SDL_SCANCODE_UNKNOWN, /* KEY_SOUND */\n    /*  214 */    SDL_SCANCODE_UNKNOWN, /* KEY_QUESTION */\n    /*  215 */    SDL_SCANCODE_UNKNOWN, /* KEY_EMAIL */\n    /*  216 */    SDL_SCANCODE_UNKNOWN, /* KEY_CHAT */\n    /*  217 */    SDL_SCANCODE_AC_SEARCH,\n    /*  218 */    SDL_SCANCODE_UNKNOWN, /* KEY_CONNECT */\n    /*  219 */    SDL_SCANCODE_UNKNOWN, /* KEY_FINANCE */\n    /*  220 */    SDL_SCANCODE_UNKNOWN, /* KEY_SPORT */\n    /*  221 */    SDL_SCANCODE_UNKNOWN, /* KEY_SHOP */\n    /*  222 */    SDL_SCANCODE_ALTERASE,\n    /*  223 */    SDL_SCANCODE_CANCEL,\n    /*  224 */    SDL_SCANCODE_BRIGHTNESSDOWN,\n    /*  225 */    SDL_SCANCODE_BRIGHTNESSUP,\n    /*  226 */    SDL_SCANCODE_UNKNOWN, /* KEY_MEDIA */\n    /*  227 */    SDL_SCANCODE_DISPLAYSWITCH, /* KEY_SWITCHVIDEOMODE */\n    /*  228 */    SDL_SCANCODE_KBDILLUMTOGGLE,\n    /*  229 */    SDL_SCANCODE_KBDILLUMDOWN,\n    /*  230 */    SDL_SCANCODE_KBDILLUMUP,\n    /*  231 */    SDL_SCANCODE_UNKNOWN, /* KEY_SEND */\n    /*  232 */    SDL_SCANCODE_UNKNOWN, /* KEY_REPLY */\n    /*  233 */    SDL_SCANCODE_UNKNOWN, /* KEY_FORWARDMAIL */\n    /*  234 */    SDL_SCANCODE_UNKNOWN, /* KEY_SAVE */\n    /*  235 */    SDL_SCANCODE_UNKNOWN, /* KEY_DOCUMENTS */\n    /*  236 */    SDL_SCANCODE_UNKNOWN, /* KEY_BATTERY */\n};\n/* *INDENT-ON* */\n"
  },
  {
    "path": "libs/SDL2/src/events/scancodes_windows.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../include/SDL_scancode.h\"\n\n/* Windows scancode to SDL scancode mapping table */\n/* derived from Microsoft scan code document, http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc */\n\n/* *INDENT-OFF* */\nstatic const SDL_Scancode windows_scancode_table[] = \n{ \n\t/*\t0\t\t\t\t\t\t1\t\t\t\t\t\t\t2\t\t\t\t\t\t\t3\t\t\t\t\t\t\t4\t\t\t\t\t\t5\t\t\t\t\t\t\t6\t\t\t\t\t\t\t7 */\n\t/*\t8\t\t\t\t\t\t9\t\t\t\t\t\t\tA\t\t\t\t\t\t\tB\t\t\t\t\t\t\tC\t\t\t\t\t\tD\t\t\t\t\t\t\tE\t\t\t\t\t\t\tF */\n\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_ESCAPE,\t\tSDL_SCANCODE_1,\t\t\t\tSDL_SCANCODE_2,\t\t\t\tSDL_SCANCODE_3,\t\t\tSDL_SCANCODE_4,\t\t\t\tSDL_SCANCODE_5,\t\t\t\tSDL_SCANCODE_6,\t\t\t/* 0 */\n\tSDL_SCANCODE_7,\t\t\t\tSDL_SCANCODE_8,\t\t\t\tSDL_SCANCODE_9,\t\t\t\tSDL_SCANCODE_0,\t\t\t\tSDL_SCANCODE_MINUS,\t\tSDL_SCANCODE_EQUALS,\t\tSDL_SCANCODE_BACKSPACE,\t\tSDL_SCANCODE_TAB,\t\t/* 0 */\n\n\tSDL_SCANCODE_Q,\t\t\t\tSDL_SCANCODE_W,\t\t\t\tSDL_SCANCODE_E,\t\t\t\tSDL_SCANCODE_R,\t\t\t\tSDL_SCANCODE_T,\t\t\tSDL_SCANCODE_Y,\t\t\t\tSDL_SCANCODE_U,\t\t\t\tSDL_SCANCODE_I,\t\t\t/* 1 */\n\tSDL_SCANCODE_O,\t\t\t\tSDL_SCANCODE_P,\t\t\t\tSDL_SCANCODE_LEFTBRACKET,\tSDL_SCANCODE_RIGHTBRACKET,\tSDL_SCANCODE_RETURN,\tSDL_SCANCODE_LCTRL,\t\t\tSDL_SCANCODE_A,\t\t\t\tSDL_SCANCODE_S,\t\t\t/* 1 */\n\n\tSDL_SCANCODE_D,\t\t\t\tSDL_SCANCODE_F,\t\t\t\tSDL_SCANCODE_G,\t\t\t\tSDL_SCANCODE_H,\t\t\t\tSDL_SCANCODE_J,\t\t\tSDL_SCANCODE_K,\t\t\t\tSDL_SCANCODE_L,\t\t\t\tSDL_SCANCODE_SEMICOLON,\t/* 2 */\n\tSDL_SCANCODE_APOSTROPHE,\tSDL_SCANCODE_GRAVE,\t\t\tSDL_SCANCODE_LSHIFT,\t\tSDL_SCANCODE_BACKSLASH,\t\tSDL_SCANCODE_Z,\t\t\tSDL_SCANCODE_X,\t\t\t\tSDL_SCANCODE_C,\t\t\t\tSDL_SCANCODE_V,\t\t\t/* 2 */\n\n\tSDL_SCANCODE_B,\t\t\t\tSDL_SCANCODE_N,\t\t\t\tSDL_SCANCODE_M,\t\t\t\tSDL_SCANCODE_COMMA,\t\t\tSDL_SCANCODE_PERIOD,\tSDL_SCANCODE_SLASH,\t\t\tSDL_SCANCODE_RSHIFT,\t\tSDL_SCANCODE_PRINTSCREEN,/* 3 */\n\tSDL_SCANCODE_LALT,\t\t\tSDL_SCANCODE_SPACE,\t\t\tSDL_SCANCODE_CAPSLOCK,\t\tSDL_SCANCODE_F1,\t\t\tSDL_SCANCODE_F2,\t\tSDL_SCANCODE_F3,\t\t\tSDL_SCANCODE_F4,\t\t\tSDL_SCANCODE_F5,\t\t/* 3 */\n\n\tSDL_SCANCODE_F6,\t\t\tSDL_SCANCODE_F7,\t\t\tSDL_SCANCODE_F8,\t\t\tSDL_SCANCODE_F9,\t\t\tSDL_SCANCODE_F10,\t\tSDL_SCANCODE_NUMLOCKCLEAR,\tSDL_SCANCODE_SCROLLLOCK,\tSDL_SCANCODE_HOME,\t\t/* 4 */\n\tSDL_SCANCODE_UP,\t\t\tSDL_SCANCODE_PAGEUP,\t\tSDL_SCANCODE_KP_MINUS,\t\tSDL_SCANCODE_LEFT,\t\t\tSDL_SCANCODE_KP_5,\t\tSDL_SCANCODE_RIGHT,\t\t\tSDL_SCANCODE_KP_PLUS,\t\tSDL_SCANCODE_END,\t\t/* 4 */\n\n\tSDL_SCANCODE_DOWN,\t\t\tSDL_SCANCODE_PAGEDOWN,\t\tSDL_SCANCODE_INSERT,\t\tSDL_SCANCODE_DELETE,\t\tSDL_SCANCODE_UNKNOWN,\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_NONUSBACKSLASH,SDL_SCANCODE_F11,\t\t/* 5 */\n\tSDL_SCANCODE_F12,\t\t\tSDL_SCANCODE_PAUSE,\t\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_LGUI,\t\t\tSDL_SCANCODE_RGUI,\t\tSDL_SCANCODE_APPLICATION,\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\t/* 5 */\n\n\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_F13,\t\tSDL_SCANCODE_F14,\t\t\tSDL_SCANCODE_F15,\t\t\tSDL_SCANCODE_F16,\t\t/* 6 */\n\tSDL_SCANCODE_F17,\t\t\tSDL_SCANCODE_F18,\t\t\tSDL_SCANCODE_F19,\t\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\t/* 6 */\n\t\n\tSDL_SCANCODE_INTERNATIONAL2,\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_INTERNATIONAL1,\t\tSDL_SCANCODE_UNKNOWN,\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN,\t/* 7 */\n\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_INTERNATIONAL4,\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_INTERNATIONAL5,\t\tSDL_SCANCODE_UNKNOWN,\tSDL_SCANCODE_INTERNATIONAL3,\t\tSDL_SCANCODE_UNKNOWN,\t\tSDL_SCANCODE_UNKNOWN\t/* 7 */\n};\n/* *INDENT-ON* */\n"
  },
  {
    "path": "libs/SDL2/src/events/scancodes_xfree86.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../include/SDL_scancode.h\"\n\n/* XFree86 key code to SDL scancode mapping table\n   Sources:\n   - atKeyNames.h from XFree86 source code\n*/\n/* *INDENT-OFF* */\nstatic const SDL_Scancode xfree86_scancode_table[] = {\n    /*  0 */    SDL_SCANCODE_UNKNOWN,\n    /*  1 */    SDL_SCANCODE_ESCAPE,\n    /*  2 */    SDL_SCANCODE_1,\n    /*  3 */    SDL_SCANCODE_2,\n    /*  4 */    SDL_SCANCODE_3,\n    /*  5 */    SDL_SCANCODE_4,\n    /*  6 */    SDL_SCANCODE_5,\n    /*  7 */    SDL_SCANCODE_6,\n    /*  8 */    SDL_SCANCODE_7,\n    /*  9 */    SDL_SCANCODE_8,\n    /*  10 */   SDL_SCANCODE_9,\n    /*  11 */   SDL_SCANCODE_0,\n    /*  12 */   SDL_SCANCODE_MINUS,\n    /*  13 */   SDL_SCANCODE_EQUALS,\n    /*  14 */   SDL_SCANCODE_BACKSPACE,\n    /*  15 */   SDL_SCANCODE_TAB,\n    /*  16 */   SDL_SCANCODE_Q,\n    /*  17 */   SDL_SCANCODE_W,\n    /*  18 */   SDL_SCANCODE_E,\n    /*  19 */   SDL_SCANCODE_R,\n    /*  20 */   SDL_SCANCODE_T,\n    /*  21 */   SDL_SCANCODE_Y,\n    /*  22 */   SDL_SCANCODE_U,\n    /*  23 */   SDL_SCANCODE_I,\n    /*  24 */   SDL_SCANCODE_O,\n    /*  25 */   SDL_SCANCODE_P,\n    /*  26 */   SDL_SCANCODE_LEFTBRACKET,\n    /*  27 */   SDL_SCANCODE_RIGHTBRACKET,\n    /*  28 */   SDL_SCANCODE_RETURN,\n    /*  29 */   SDL_SCANCODE_LCTRL,\n    /*  30 */   SDL_SCANCODE_A,\n    /*  31 */   SDL_SCANCODE_S,\n    /*  32 */   SDL_SCANCODE_D,\n    /*  33 */   SDL_SCANCODE_F,\n    /*  34 */   SDL_SCANCODE_G,\n    /*  35 */   SDL_SCANCODE_H,\n    /*  36 */   SDL_SCANCODE_J,\n    /*  37 */   SDL_SCANCODE_K,\n    /*  38 */   SDL_SCANCODE_L,\n    /*  39 */   SDL_SCANCODE_SEMICOLON,\n    /*  40 */   SDL_SCANCODE_APOSTROPHE,\n    /*  41 */   SDL_SCANCODE_GRAVE,\n    /*  42 */   SDL_SCANCODE_LSHIFT,\n    /*  43 */   SDL_SCANCODE_BACKSLASH,\n    /*  44 */   SDL_SCANCODE_Z,\n    /*  45 */   SDL_SCANCODE_X,\n    /*  46 */   SDL_SCANCODE_C,\n    /*  47 */   SDL_SCANCODE_V,\n    /*  48 */   SDL_SCANCODE_B,\n    /*  49 */   SDL_SCANCODE_N,\n    /*  50 */   SDL_SCANCODE_M,\n    /*  51 */   SDL_SCANCODE_COMMA,\n    /*  52 */   SDL_SCANCODE_PERIOD,\n    /*  53 */   SDL_SCANCODE_SLASH,\n    /*  54 */   SDL_SCANCODE_RSHIFT,\n    /*  55 */   SDL_SCANCODE_KP_MULTIPLY,\n    /*  56 */   SDL_SCANCODE_LALT,\n    /*  57 */   SDL_SCANCODE_SPACE,\n    /*  58 */   SDL_SCANCODE_CAPSLOCK,\n    /*  59 */   SDL_SCANCODE_F1,\n    /*  60 */   SDL_SCANCODE_F2,\n    /*  61 */   SDL_SCANCODE_F3,\n    /*  62 */   SDL_SCANCODE_F4,\n    /*  63 */   SDL_SCANCODE_F5,\n    /*  64 */   SDL_SCANCODE_F6,\n    /*  65 */   SDL_SCANCODE_F7,\n    /*  66 */   SDL_SCANCODE_F8,\n    /*  67 */   SDL_SCANCODE_F9,\n    /*  68 */   SDL_SCANCODE_F10,\n    /*  69 */   SDL_SCANCODE_NUMLOCKCLEAR,\n    /*  70 */   SDL_SCANCODE_SCROLLLOCK,\n    /*  71 */   SDL_SCANCODE_KP_7,\n    /*  72 */   SDL_SCANCODE_KP_8,\n    /*  73 */   SDL_SCANCODE_KP_9,\n    /*  74 */   SDL_SCANCODE_KP_MINUS,\n    /*  75 */   SDL_SCANCODE_KP_4,\n    /*  76 */   SDL_SCANCODE_KP_5,\n    /*  77 */   SDL_SCANCODE_KP_6,\n    /*  78 */   SDL_SCANCODE_KP_PLUS,\n    /*  79 */   SDL_SCANCODE_KP_1,\n    /*  80 */   SDL_SCANCODE_KP_2,\n    /*  81 */   SDL_SCANCODE_KP_3,\n    /*  82 */   SDL_SCANCODE_KP_0,\n    /*  83 */   SDL_SCANCODE_KP_PERIOD,\n    /*  84 */   SDL_SCANCODE_SYSREQ,\n    /*  85 */   SDL_SCANCODE_MODE,\n    /*  86 */   SDL_SCANCODE_NONUSBACKSLASH,\n    /*  87 */   SDL_SCANCODE_F11,\n    /*  88 */   SDL_SCANCODE_F12,\n    /*  89 */   SDL_SCANCODE_HOME,\n    /*  90 */   SDL_SCANCODE_UP,\n    /*  91 */   SDL_SCANCODE_PAGEUP,\n    /*  92 */   SDL_SCANCODE_LEFT,\n    /*  93 */   SDL_SCANCODE_BRIGHTNESSDOWN, /* on PowerBook G4 / KEY_Begin */\n    /*  94 */   SDL_SCANCODE_RIGHT,\n    /*  95 */   SDL_SCANCODE_END,\n    /*  96 */   SDL_SCANCODE_DOWN,\n    /*  97 */   SDL_SCANCODE_PAGEDOWN,\n    /*  98 */   SDL_SCANCODE_INSERT,\n    /*  99 */   SDL_SCANCODE_DELETE,\n    /*  100 */  SDL_SCANCODE_KP_ENTER,\n    /*  101 */  SDL_SCANCODE_RCTRL,\n    /*  102 */  SDL_SCANCODE_PAUSE,\n    /*  103 */  SDL_SCANCODE_PRINTSCREEN,\n    /*  104 */  SDL_SCANCODE_KP_DIVIDE,\n    /*  105 */  SDL_SCANCODE_RALT,\n    /*  106 */  SDL_SCANCODE_UNKNOWN, /* BREAK */\n    /*  107 */  SDL_SCANCODE_LGUI,\n    /*  108 */  SDL_SCANCODE_RGUI,\n    /*  109 */  SDL_SCANCODE_APPLICATION,\n    /*  110 */  SDL_SCANCODE_F13,\n    /*  111 */  SDL_SCANCODE_F14,\n    /*  112 */  SDL_SCANCODE_F15,\n    /*  113 */  SDL_SCANCODE_F16,\n    /*  114 */  SDL_SCANCODE_F17,\n    /*  115 */  SDL_SCANCODE_INTERNATIONAL1, /* \\_ */\n    /*  116 */  SDL_SCANCODE_UNKNOWN, /* is translated to XK_ISO_Level3_Shift by my X server, but I have no keyboard that generates this code, so I don't know what the correct SDL_SCANCODE_* for it is */\n    /*  117 */  SDL_SCANCODE_UNKNOWN,\n    /*  118 */  SDL_SCANCODE_KP_EQUALS,\n    /*  119 */  SDL_SCANCODE_UNKNOWN,\n    /*  120 */  SDL_SCANCODE_UNKNOWN,\n    /*  121 */  SDL_SCANCODE_INTERNATIONAL4, /* Henkan_Mode */\n    /*  122 */  SDL_SCANCODE_UNKNOWN,\n    /*  123 */  SDL_SCANCODE_INTERNATIONAL5, /* Muhenkan */\n    /*  124 */  SDL_SCANCODE_UNKNOWN,\n    /*  125 */  SDL_SCANCODE_INTERNATIONAL3, /* Yen */\n    /*  126 */  SDL_SCANCODE_UNKNOWN,\n    /*  127 */  SDL_SCANCODE_UNKNOWN,\n    /*  128 */  SDL_SCANCODE_UNKNOWN,\n    /*  129 */  SDL_SCANCODE_UNKNOWN,\n    /*  130 */  SDL_SCANCODE_UNKNOWN,\n    /*  131 */  SDL_SCANCODE_UNKNOWN,\n    /*  132 */  SDL_SCANCODE_POWER,\n    /*  133 */  SDL_SCANCODE_MUTE,\n    /*  134 */  SDL_SCANCODE_VOLUMEDOWN,\n    /*  135 */  SDL_SCANCODE_VOLUMEUP,\n    /*  136 */  SDL_SCANCODE_HELP,\n    /*  137 */  SDL_SCANCODE_STOP,\n    /*  138 */  SDL_SCANCODE_AGAIN,\n    /*  139 */  SDL_SCANCODE_UNKNOWN, /* PROPS */\n    /*  140 */  SDL_SCANCODE_UNDO,\n    /*  141 */  SDL_SCANCODE_UNKNOWN, /* FRONT */\n    /*  142 */  SDL_SCANCODE_COPY,\n    /*  143 */  SDL_SCANCODE_UNKNOWN, /* OPEN */\n    /*  144 */  SDL_SCANCODE_PASTE,\n    /*  145 */  SDL_SCANCODE_FIND,\n    /*  146 */  SDL_SCANCODE_CUT,\n};\n\n/* for wireless usb keyboard (manufacturer TRUST) without numpad. */\nstatic const SDL_Scancode xfree86_scancode_table2[] = {\n    /*  0 */    SDL_SCANCODE_UNKNOWN,\n    /*  1 */    SDL_SCANCODE_ESCAPE,\n    /*  2 */    SDL_SCANCODE_1,\n    /*  3 */    SDL_SCANCODE_2,\n    /*  4 */    SDL_SCANCODE_3,\n    /*  5 */    SDL_SCANCODE_4,\n    /*  6 */    SDL_SCANCODE_5,\n    /*  7 */    SDL_SCANCODE_6,\n    /*  8 */    SDL_SCANCODE_7,\n    /*  9 */    SDL_SCANCODE_8,\n    /*  10 */   SDL_SCANCODE_9,\n    /*  11 */   SDL_SCANCODE_0,\n    /*  12 */   SDL_SCANCODE_MINUS,\n    /*  13 */   SDL_SCANCODE_EQUALS,\n    /*  14 */   SDL_SCANCODE_BACKSPACE,\n    /*  15 */   SDL_SCANCODE_TAB,\n    /*  16 */   SDL_SCANCODE_Q,\n    /*  17 */   SDL_SCANCODE_W,\n    /*  18 */   SDL_SCANCODE_E,\n    /*  19 */   SDL_SCANCODE_R,\n    /*  20 */   SDL_SCANCODE_T,\n    /*  21 */   SDL_SCANCODE_Y,\n    /*  22 */   SDL_SCANCODE_U,\n    /*  23 */   SDL_SCANCODE_I,\n    /*  24 */   SDL_SCANCODE_O,\n    /*  25 */   SDL_SCANCODE_P,\n    /*  26 */   SDL_SCANCODE_LEFTBRACKET,\n    /*  27 */   SDL_SCANCODE_RIGHTBRACKET,\n    /*  28 */   SDL_SCANCODE_RETURN,\n    /*  29 */   SDL_SCANCODE_LCTRL,\n    /*  30 */   SDL_SCANCODE_A,\n    /*  31 */   SDL_SCANCODE_S,\n    /*  32 */   SDL_SCANCODE_D,\n    /*  33 */   SDL_SCANCODE_F,\n    /*  34 */   SDL_SCANCODE_G,\n    /*  35 */   SDL_SCANCODE_H,\n    /*  36 */   SDL_SCANCODE_J,\n    /*  37 */   SDL_SCANCODE_K,\n    /*  38 */   SDL_SCANCODE_L,\n    /*  39 */   SDL_SCANCODE_SEMICOLON,\n    /*  40 */   SDL_SCANCODE_APOSTROPHE,\n    /*  41 */   SDL_SCANCODE_GRAVE,\n    /*  42 */   SDL_SCANCODE_LSHIFT,\n    /*  43 */   SDL_SCANCODE_BACKSLASH,\n    /*  44 */   SDL_SCANCODE_Z,\n    /*  45 */   SDL_SCANCODE_X,\n    /*  46 */   SDL_SCANCODE_C,\n    /*  47 */   SDL_SCANCODE_V,\n    /*  48 */   SDL_SCANCODE_B,\n    /*  49 */   SDL_SCANCODE_N,\n    /*  50 */   SDL_SCANCODE_M,\n    /*  51 */   SDL_SCANCODE_COMMA,\n    /*  52 */   SDL_SCANCODE_PERIOD,\n    /*  53 */   SDL_SCANCODE_SLASH,\n    /*  54 */   SDL_SCANCODE_RSHIFT,\n    /*  55 */   SDL_SCANCODE_KP_MULTIPLY,\n    /*  56 */   SDL_SCANCODE_LALT,\n    /*  57 */   SDL_SCANCODE_SPACE,\n    /*  58 */   SDL_SCANCODE_CAPSLOCK,\n    /*  59 */   SDL_SCANCODE_F1,\n    /*  60 */   SDL_SCANCODE_F2,\n    /*  61 */   SDL_SCANCODE_F3,\n    /*  62 */   SDL_SCANCODE_F4,\n    /*  63 */   SDL_SCANCODE_F5,\n    /*  64 */   SDL_SCANCODE_F6,\n    /*  65 */   SDL_SCANCODE_F7,\n    /*  66 */   SDL_SCANCODE_F8,\n    /*  67 */   SDL_SCANCODE_F9,\n    /*  68 */   SDL_SCANCODE_F10,\n    /*  69 */   SDL_SCANCODE_NUMLOCKCLEAR,\n    /*  70 */   SDL_SCANCODE_SCROLLLOCK,\n    /*  71 */   SDL_SCANCODE_KP_7,\n    /*  72 */   SDL_SCANCODE_KP_8,\n    /*  73 */   SDL_SCANCODE_KP_9,\n    /*  74 */   SDL_SCANCODE_KP_MINUS,\n    /*  75 */   SDL_SCANCODE_KP_4,\n    /*  76 */   SDL_SCANCODE_KP_5,\n    /*  77 */   SDL_SCANCODE_KP_6,\n    /*  78 */   SDL_SCANCODE_KP_PLUS,\n    /*  79 */   SDL_SCANCODE_KP_1,\n    /*  80 */   SDL_SCANCODE_KP_2,\n    /*  81 */   SDL_SCANCODE_KP_3,\n    /*  82 */   SDL_SCANCODE_KP_0,\n    /*  83 */   SDL_SCANCODE_KP_PERIOD,\n    /*  84 */   SDL_SCANCODE_SYSREQ,    /* ???? */\n    /*  85 */   SDL_SCANCODE_MODE,      /* ???? */\n    /*  86 */   SDL_SCANCODE_NONUSBACKSLASH,\n    /*  87 */   SDL_SCANCODE_F11,\n    /*  88 */   SDL_SCANCODE_F12,\n    /*  89 */   SDL_SCANCODE_INTERNATIONAL1, /* \\_ */\n    /*  90 */   SDL_SCANCODE_UNKNOWN,   /* Katakana */\n    /*  91 */   SDL_SCANCODE_UNKNOWN,   /* Hiragana */\n    /*  92 */   SDL_SCANCODE_INTERNATIONAL4, /* Henkan_Mode */\n    /*  93 */   SDL_SCANCODE_INTERNATIONAL2, /* Hiragana_Katakana */\n    /*  94 */   SDL_SCANCODE_INTERNATIONAL5, /* Muhenkan */\n    /*  95 */   SDL_SCANCODE_UNKNOWN,\n    /*  96 */   SDL_SCANCODE_KP_ENTER,\n    /*  97 */   SDL_SCANCODE_RCTRL,\n    /*  98 */   SDL_SCANCODE_KP_DIVIDE,\n    /*  99 */   SDL_SCANCODE_PRINTSCREEN,\n    /* 100 */   SDL_SCANCODE_RALT,      /* ISO_Level3_Shift, ALTGR, RALT */\n    /* 101 */   SDL_SCANCODE_UNKNOWN,   /* Linefeed */\n    /* 102 */   SDL_SCANCODE_HOME,\n    /* 103 */   SDL_SCANCODE_UP,\n    /* 104 */   SDL_SCANCODE_PAGEUP,\n    /* 105 */   SDL_SCANCODE_LEFT,\n    /* 106 */   SDL_SCANCODE_RIGHT,\n    /* 107 */   SDL_SCANCODE_END,\n    /* 108 */   SDL_SCANCODE_DOWN,\n    /* 109 */   SDL_SCANCODE_PAGEDOWN,\n    /* 110 */   SDL_SCANCODE_INSERT,\n    /* 111 */   SDL_SCANCODE_DELETE,\n    /* 112 */   SDL_SCANCODE_UNKNOWN,\n    /* 113 */   SDL_SCANCODE_MUTE,\n    /* 114 */   SDL_SCANCODE_VOLUMEDOWN,\n    /* 115 */   SDL_SCANCODE_VOLUMEUP,\n    /* 116 */   SDL_SCANCODE_POWER,\n    /* 117 */   SDL_SCANCODE_KP_EQUALS,\n    /* 118 */   SDL_SCANCODE_UNKNOWN,   /* plusminus */\n    /* 119 */   SDL_SCANCODE_PAUSE,\n    /* 120 */   SDL_SCANCODE_UNKNOWN,   /* XF86LaunchA */\n    /* 121 */   SDL_SCANCODE_UNKNOWN,   /* KP_Decimal */\n    /* 122 */   SDL_SCANCODE_UNKNOWN,   /* Hangul */\n    /* 123 */   SDL_SCANCODE_UNKNOWN,   /* Hangul_Hanja */\n    /* 124 */   SDL_SCANCODE_INTERNATIONAL3, /* Yen */\n    /* 125 */   SDL_SCANCODE_LGUI,\n    /* 126 */   SDL_SCANCODE_RGUI,\n    /* 127 */   SDL_SCANCODE_APPLICATION,\n    /* 128 */   SDL_SCANCODE_CANCEL,\n    /* 129 */   SDL_SCANCODE_AGAIN,\n    /* 130 */   SDL_SCANCODE_UNKNOWN,   /* SunProps */\n    /* 131 */   SDL_SCANCODE_UNDO,\n    /* 132 */   SDL_SCANCODE_UNKNOWN,   /* SunFront */\n    /* 133 */   SDL_SCANCODE_COPY,\n    /* 134 */   SDL_SCANCODE_UNKNOWN,   /* SunOpen */\n    /* 135 */   SDL_SCANCODE_PASTE,\n    /* 136 */   SDL_SCANCODE_FIND,\n    /* 137 */   SDL_SCANCODE_CUT,\n    /* 138 */   SDL_SCANCODE_HELP,\n    /* 139 */   SDL_SCANCODE_UNKNOWN,   /* XF86MenuKB */\n    /* 140 */   SDL_SCANCODE_CALCULATOR,\n    /* 141 */   SDL_SCANCODE_UNKNOWN,\n    /* 142 */   SDL_SCANCODE_SLEEP,\n    /* 143 */   SDL_SCANCODE_UNKNOWN,   /* XF86WakeUp */\n    /* 144 */   SDL_SCANCODE_UNKNOWN,   /* XF86Explorer */\n    /* 145 */   SDL_SCANCODE_UNKNOWN,   /* XF86Send */\n    /* 146 */   SDL_SCANCODE_UNKNOWN,\n    /* 147 */   SDL_SCANCODE_UNKNOWN,   /* XF86Xfer */\n    /* 148 */   SDL_SCANCODE_APP1,      /* XF86Launch1 */\n    /* 149 */   SDL_SCANCODE_APP2,      /* XF86Launch2 */\n    /* 150 */   SDL_SCANCODE_WWW,\n    /* 151 */   SDL_SCANCODE_UNKNOWN,   /* XF86DOS */\n    /* 152 */   SDL_SCANCODE_UNKNOWN,   /* XF86ScreenSaver */\n    /* 153 */   SDL_SCANCODE_UNKNOWN,\n    /* 154 */   SDL_SCANCODE_UNKNOWN,   /* XF86RotateWindows */\n    /* 155 */   SDL_SCANCODE_MAIL,\n    /* 156 */   SDL_SCANCODE_AC_BOOKMARKS,   /* XF86Favorites */\n    /* 157 */   SDL_SCANCODE_COMPUTER,\n    /* 158 */   SDL_SCANCODE_AC_BACK,\n    /* 159 */   SDL_SCANCODE_AC_FORWARD,\n    /* 160 */   SDL_SCANCODE_UNKNOWN,\n    /* 161 */   SDL_SCANCODE_EJECT,\n    /* 162 */   SDL_SCANCODE_EJECT,\n    /* 163 */   SDL_SCANCODE_AUDIONEXT,\n    /* 164 */   SDL_SCANCODE_AUDIOPLAY,\n    /* 165 */   SDL_SCANCODE_AUDIOPREV,\n    /* 166 */   SDL_SCANCODE_AUDIOSTOP,\n    /* 167 */   SDL_SCANCODE_UNKNOWN,   /* XF86AudioRecord */\n    /* 168 */   SDL_SCANCODE_UNKNOWN,   /* XF86AudioRewind */\n    /* 169 */   SDL_SCANCODE_UNKNOWN,   /* XF86Phone */\n    /* 170 */   SDL_SCANCODE_UNKNOWN,\n    /* 171 */   SDL_SCANCODE_F13,       /* XF86Tools */\n    /* 172 */   SDL_SCANCODE_AC_HOME,\n    /* 173 */   SDL_SCANCODE_AC_REFRESH,\n    /* 174 */   SDL_SCANCODE_UNKNOWN,   /* XF86Close */\n    /* 175 */   SDL_SCANCODE_UNKNOWN,\n    /* 176 */   SDL_SCANCODE_UNKNOWN,\n    /* 177 */   SDL_SCANCODE_UNKNOWN,   /* XF86ScrollUp */\n    /* 178 */   SDL_SCANCODE_UNKNOWN,   /* XF86ScrollDown */\n    /* 179 */   SDL_SCANCODE_UNKNOWN,   /* parenleft */\n    /* 180 */   SDL_SCANCODE_UNKNOWN,   /* parenright */\n    /* 181 */   SDL_SCANCODE_UNKNOWN,   /* XF86New */\n    /* 182 */   SDL_SCANCODE_AGAIN,\n    /* 183 */   SDL_SCANCODE_F13,       /* XF86Tools */\n    /* 184 */   SDL_SCANCODE_F14,       /* XF86Launch5 */\n    /* 185 */   SDL_SCANCODE_F15,       /* XF86Launch6 */\n    /* 186 */   SDL_SCANCODE_F16,       /* XF86Launch7 */\n    /* 187 */   SDL_SCANCODE_F17,       /* XF86Launch8 */\n    /* 188 */   SDL_SCANCODE_F18,       /* XF86Launch9 */\n    /* 189 */   SDL_SCANCODE_F19,       /* null keysym */\n    /* 190 */   SDL_SCANCODE_UNKNOWN,\n    /* 191 */   SDL_SCANCODE_UNKNOWN,\n    /* 192 */   SDL_SCANCODE_UNKNOWN,   /* XF86TouchpadToggle */\n    /* 193 */   SDL_SCANCODE_UNKNOWN,\n    /* 194 */   SDL_SCANCODE_UNKNOWN,\n    /* 195 */   SDL_SCANCODE_MODE,\n    /* 196 */   SDL_SCANCODE_UNKNOWN,\n    /* 197 */   SDL_SCANCODE_UNKNOWN,\n    /* 198 */   SDL_SCANCODE_UNKNOWN,\n    /* 199 */   SDL_SCANCODE_UNKNOWN,\n    /* 200 */   SDL_SCANCODE_AUDIOPLAY,\n    /* 201 */   SDL_SCANCODE_UNKNOWN,   /* XF86AudioPause */\n    /* 202 */   SDL_SCANCODE_UNKNOWN,   /* XF86Launch3 */\n    /* 203 */   SDL_SCANCODE_UNKNOWN,   /* XF86Launch4 */\n    /* 204 */   SDL_SCANCODE_UNKNOWN,   /* XF86LaunchB */\n    /* 205 */   SDL_SCANCODE_UNKNOWN,   /* XF86Suspend */\n    /* 206 */   SDL_SCANCODE_UNKNOWN,   /* XF86Close */\n    /* 207 */   SDL_SCANCODE_AUDIOPLAY,\n    /* 208 */   SDL_SCANCODE_AUDIONEXT,\n    /* 209 */   SDL_SCANCODE_UNKNOWN,\n    /* 210 */   SDL_SCANCODE_PRINTSCREEN,\n    /* 211 */   SDL_SCANCODE_UNKNOWN,\n    /* 212 */   SDL_SCANCODE_UNKNOWN,   /* XF86WebCam */\n    /* 213 */   SDL_SCANCODE_UNKNOWN,\n    /* 214 */   SDL_SCANCODE_UNKNOWN,\n    /* 215 */   SDL_SCANCODE_MAIL,\n    /* 216 */   SDL_SCANCODE_UNKNOWN,\n    /* 217 */   SDL_SCANCODE_AC_SEARCH,\n    /* 218 */   SDL_SCANCODE_UNKNOWN,\n    /* 219 */   SDL_SCANCODE_UNKNOWN,   /* XF86Finance */\n    /* 220 */   SDL_SCANCODE_UNKNOWN,\n    /* 221 */   SDL_SCANCODE_UNKNOWN,   /* XF86Shop */\n    /* 222 */   SDL_SCANCODE_UNKNOWN,\n    /* 223 */   SDL_SCANCODE_STOP,\n    /* 224 */   SDL_SCANCODE_BRIGHTNESSDOWN,\n    /* 225 */   SDL_SCANCODE_BRIGHTNESSUP,\n    /* 226 */   SDL_SCANCODE_MEDIASELECT,\n    /* 227 */   SDL_SCANCODE_DISPLAYSWITCH,\n    /* 228 */   SDL_SCANCODE_KBDILLUMTOGGLE,\n    /* 229 */   SDL_SCANCODE_KBDILLUMDOWN,\n    /* 230 */   SDL_SCANCODE_KBDILLUMUP,\n    /* 231 */   SDL_SCANCODE_UNKNOWN,   /* XF86Send */\n    /* 232 */   SDL_SCANCODE_UNKNOWN,   /* XF86Reply */\n    /* 233 */   SDL_SCANCODE_UNKNOWN,   /* XF86MailForward */\n    /* 234 */   SDL_SCANCODE_UNKNOWN,   /* XF86Save */\n    /* 235 */   SDL_SCANCODE_UNKNOWN,   /* XF86Documents */\n    /* 236 */   SDL_SCANCODE_UNKNOWN,   /* XF86Battery */\n    /* 237 */   SDL_SCANCODE_UNKNOWN,   /* XF86Bluetooth */\n    /* 238 */   SDL_SCANCODE_UNKNOWN,   /* XF86WLAN */\n};\n\n/* Xvnc / Xtightvnc scancodes from xmodmap -pk */\nstatic const SDL_Scancode xvnc_scancode_table[] = {\n    /*  0 */    SDL_SCANCODE_LCTRL,\n    /*  1 */    SDL_SCANCODE_RCTRL,\n    /*  2 */    SDL_SCANCODE_LSHIFT,\n    /*  3 */    SDL_SCANCODE_RSHIFT,\n    /*  4 */    SDL_SCANCODE_UNKNOWN, /* Meta_L */\n    /*  5 */    SDL_SCANCODE_UNKNOWN, /* Meta_R */\n    /*  6 */    SDL_SCANCODE_LALT,\n    /*  7 */    SDL_SCANCODE_RALT,\n    /*  8 */    SDL_SCANCODE_SPACE,\n    /*  9 */    SDL_SCANCODE_0,\n    /*  10 */   SDL_SCANCODE_1,\n    /*  11 */   SDL_SCANCODE_2,\n    /*  12 */   SDL_SCANCODE_3,\n    /*  13 */   SDL_SCANCODE_4,\n    /*  14 */   SDL_SCANCODE_5,\n    /*  15 */   SDL_SCANCODE_6,\n    /*  16 */   SDL_SCANCODE_7,\n    /*  17 */   SDL_SCANCODE_8,\n    /*  18 */   SDL_SCANCODE_9,\n    /*  19 */   SDL_SCANCODE_MINUS,\n    /*  20 */   SDL_SCANCODE_EQUALS,\n    /*  21 */   SDL_SCANCODE_LEFTBRACKET,\n    /*  22 */   SDL_SCANCODE_RIGHTBRACKET,\n    /*  23 */   SDL_SCANCODE_SEMICOLON,\n    /*  24 */   SDL_SCANCODE_APOSTROPHE,\n    /*  25 */   SDL_SCANCODE_GRAVE,\n    /*  26 */   SDL_SCANCODE_COMMA,\n    /*  27 */   SDL_SCANCODE_PERIOD,\n    /*  28 */   SDL_SCANCODE_SLASH,\n    /*  29 */   SDL_SCANCODE_BACKSLASH,\n    /*  30 */   SDL_SCANCODE_A,\n    /*  31 */   SDL_SCANCODE_B,\n    /*  32 */   SDL_SCANCODE_C,\n    /*  33 */   SDL_SCANCODE_D,\n    /*  34 */   SDL_SCANCODE_E,\n    /*  35 */   SDL_SCANCODE_F,\n    /*  36 */   SDL_SCANCODE_G,\n    /*  37 */   SDL_SCANCODE_H,\n    /*  38 */   SDL_SCANCODE_I,\n    /*  39 */   SDL_SCANCODE_J,\n    /*  40 */   SDL_SCANCODE_K,\n    /*  41 */   SDL_SCANCODE_L,\n    /*  42 */   SDL_SCANCODE_M,\n    /*  43 */   SDL_SCANCODE_N,\n    /*  44 */   SDL_SCANCODE_O,\n    /*  45 */   SDL_SCANCODE_P,\n    /*  46 */   SDL_SCANCODE_Q,\n    /*  47 */   SDL_SCANCODE_R,\n    /*  48 */   SDL_SCANCODE_S,\n    /*  49 */   SDL_SCANCODE_T,\n    /*  50 */   SDL_SCANCODE_U,\n    /*  51 */   SDL_SCANCODE_V,\n    /*  52 */   SDL_SCANCODE_W,\n    /*  53 */   SDL_SCANCODE_X,\n    /*  54 */   SDL_SCANCODE_Y,\n    /*  55 */   SDL_SCANCODE_Z,\n    /*  56 */   SDL_SCANCODE_BACKSPACE,\n    /*  57 */   SDL_SCANCODE_RETURN,\n    /*  58 */   SDL_SCANCODE_TAB,\n    /*  59 */   SDL_SCANCODE_ESCAPE,\n    /*  60 */   SDL_SCANCODE_DELETE,\n    /*  61 */   SDL_SCANCODE_HOME,\n    /*  62 */   SDL_SCANCODE_END,\n    /*  63 */   SDL_SCANCODE_PAGEUP,\n    /*  64 */   SDL_SCANCODE_PAGEDOWN,\n    /*  65 */   SDL_SCANCODE_UP,\n    /*  66 */   SDL_SCANCODE_DOWN,\n    /*  67 */   SDL_SCANCODE_LEFT,\n    /*  68 */   SDL_SCANCODE_RIGHT,\n    /*  69 */   SDL_SCANCODE_F1,\n    /*  70 */   SDL_SCANCODE_F2,\n    /*  71 */   SDL_SCANCODE_F3,\n    /*  72 */   SDL_SCANCODE_F4,\n    /*  73 */   SDL_SCANCODE_F5,\n    /*  74 */   SDL_SCANCODE_F6,\n    /*  75 */   SDL_SCANCODE_F7,\n    /*  76 */   SDL_SCANCODE_F8,\n    /*  77 */   SDL_SCANCODE_F9,\n    /*  78 */   SDL_SCANCODE_F10,\n    /*  79 */   SDL_SCANCODE_F11,\n    /*  80 */   SDL_SCANCODE_F12,\n};\n\n/* *INDENT-ON* */\n"
  },
  {
    "path": "libs/SDL2/src/file/SDL_rwops.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n/* Need this so Linux systems define fseek64o, ftell64o and off64_t */\n#define _LARGEFILE64_SOURCE\n#include \"../SDL_internal.h\"\n\n#if defined(__WIN32__)\n#include \"../core/windows/SDL_windows.h\"\n#endif\n\n\n/* This file provides a general interface for SDL to read and write\n   data sources.  It can easily be extended to files, memory, etc.\n*/\n\n#include \"SDL_endian.h\"\n#include \"SDL_rwops.h\"\n\n#ifdef __APPLE__\n#include \"cocoa/SDL_rwopsbundlesupport.h\"\n#endif /* __APPLE__ */\n\n#ifdef __ANDROID__\n#include \"../core/android/SDL_android.h\"\n#include \"SDL_system.h\"\n#endif\n\n#if __NACL__\n#include \"nacl_io/nacl_io.h\"\n#endif\n\n#ifdef __WIN32__\n\n/* Functions to read/write Win32 API file pointers */\n\n#ifndef INVALID_SET_FILE_POINTER\n#define INVALID_SET_FILE_POINTER 0xFFFFFFFF\n#endif\n\n#define READAHEAD_BUFFER_SIZE   1024\n\nstatic int SDLCALL\nwindows_file_open(SDL_RWops * context, const char *filename, const char *mode)\n{\n    UINT old_error_mode;\n    HANDLE h;\n    DWORD r_right, w_right;\n    DWORD must_exist, truncate;\n    int a_mode;\n\n    if (!context)\n        return -1;              /* failed (invalid call) */\n\n    context->hidden.windowsio.h = INVALID_HANDLE_VALUE;   /* mark this as unusable */\n    context->hidden.windowsio.buffer.data = NULL;\n    context->hidden.windowsio.buffer.size = 0;\n    context->hidden.windowsio.buffer.left = 0;\n\n    /* \"r\" = reading, file must exist */\n    /* \"w\" = writing, truncate existing, file may not exist */\n    /* \"r+\"= reading or writing, file must exist            */\n    /* \"a\" = writing, append file may not exist             */\n    /* \"a+\"= append + read, file may not exist              */\n    /* \"w+\" = read, write, truncate. file may not exist    */\n\n    must_exist = (SDL_strchr(mode, 'r') != NULL) ? OPEN_EXISTING : 0;\n    truncate = (SDL_strchr(mode, 'w') != NULL) ? CREATE_ALWAYS : 0;\n    r_right = (SDL_strchr(mode, '+') != NULL\n               || must_exist) ? GENERIC_READ : 0;\n    a_mode = (SDL_strchr(mode, 'a') != NULL) ? OPEN_ALWAYS : 0;\n    w_right = (a_mode || SDL_strchr(mode, '+')\n               || truncate) ? GENERIC_WRITE : 0;\n\n    if (!r_right && !w_right)   /* inconsistent mode */\n        return -1;              /* failed (invalid call) */\n\n    context->hidden.windowsio.buffer.data =\n        (char *) SDL_malloc(READAHEAD_BUFFER_SIZE);\n    if (!context->hidden.windowsio.buffer.data) {\n        return SDL_OutOfMemory();\n    }\n    /* Do not open a dialog box if failure */\n    old_error_mode =\n        SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);\n\n    {\n        LPTSTR tstr = WIN_UTF8ToString(filename);\n        h = CreateFile(tstr, (w_right | r_right),\n                       (w_right) ? 0 : FILE_SHARE_READ, NULL,\n                       (must_exist | truncate | a_mode),\n                       FILE_ATTRIBUTE_NORMAL, NULL);\n        SDL_free(tstr);\n    }\n\n    /* restore old behavior */\n    SetErrorMode(old_error_mode);\n\n    if (h == INVALID_HANDLE_VALUE) {\n        SDL_free(context->hidden.windowsio.buffer.data);\n        context->hidden.windowsio.buffer.data = NULL;\n        SDL_SetError(\"Couldn't open %s\", filename);\n        return -2;              /* failed (CreateFile) */\n    }\n    context->hidden.windowsio.h = h;\n    context->hidden.windowsio.append = a_mode ? SDL_TRUE : SDL_FALSE;\n\n    return 0;                   /* ok */\n}\n\nstatic Sint64 SDLCALL\nwindows_file_size(SDL_RWops * context)\n{\n    LARGE_INTEGER size;\n\n    if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE) {\n        return SDL_SetError(\"windows_file_size: invalid context/file not opened\");\n    }\n\n    if (!GetFileSizeEx(context->hidden.windowsio.h, &size)) {\n        return WIN_SetError(\"windows_file_size\");\n    }\n\n    return size.QuadPart;\n}\n\nstatic Sint64 SDLCALL\nwindows_file_seek(SDL_RWops * context, Sint64 offset, int whence)\n{\n    DWORD windowswhence;\n    LARGE_INTEGER windowsoffset;\n\n    if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE) {\n        return SDL_SetError(\"windows_file_seek: invalid context/file not opened\");\n    }\n\n    /* FIXME: We may be able to satisfy the seek within buffered data */\n    if (whence == RW_SEEK_CUR && context->hidden.windowsio.buffer.left) {\n        offset -= (long)context->hidden.windowsio.buffer.left;\n    }\n    context->hidden.windowsio.buffer.left = 0;\n\n    switch (whence) {\n    case RW_SEEK_SET:\n        windowswhence = FILE_BEGIN;\n        break;\n    case RW_SEEK_CUR:\n        windowswhence = FILE_CURRENT;\n        break;\n    case RW_SEEK_END:\n        windowswhence = FILE_END;\n        break;\n    default:\n        return SDL_SetError(\"windows_file_seek: Unknown value for 'whence'\");\n    }\n\n    windowsoffset.QuadPart = offset;\n    if (!SetFilePointerEx(context->hidden.windowsio.h, windowsoffset, &windowsoffset, windowswhence)) {\n        return WIN_SetError(\"windows_file_seek\");\n    }\n    return windowsoffset.QuadPart;\n}\n\nstatic size_t SDLCALL\nwindows_file_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)\n{\n    size_t total_need;\n    size_t total_read = 0;\n    size_t read_ahead;\n    DWORD byte_read;\n\n    total_need = size * maxnum;\n\n    if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE\n        || !total_need)\n        return 0;\n\n    if (context->hidden.windowsio.buffer.left > 0) {\n        void *data = (char *) context->hidden.windowsio.buffer.data +\n            context->hidden.windowsio.buffer.size -\n            context->hidden.windowsio.buffer.left;\n        read_ahead =\n            SDL_min(total_need, context->hidden.windowsio.buffer.left);\n        SDL_memcpy(ptr, data, read_ahead);\n        context->hidden.windowsio.buffer.left -= read_ahead;\n\n        if (read_ahead == total_need) {\n            return maxnum;\n        }\n        ptr = (char *) ptr + read_ahead;\n        total_need -= read_ahead;\n        total_read += read_ahead;\n    }\n\n    if (total_need < READAHEAD_BUFFER_SIZE) {\n        if (!ReadFile\n            (context->hidden.windowsio.h, context->hidden.windowsio.buffer.data,\n             READAHEAD_BUFFER_SIZE, &byte_read, NULL)) {\n            SDL_Error(SDL_EFREAD);\n            return 0;\n        }\n        read_ahead = SDL_min(total_need, (int) byte_read);\n        SDL_memcpy(ptr, context->hidden.windowsio.buffer.data, read_ahead);\n        context->hidden.windowsio.buffer.size = byte_read;\n        context->hidden.windowsio.buffer.left = byte_read - read_ahead;\n        total_read += read_ahead;\n    } else {\n        if (!ReadFile\n            (context->hidden.windowsio.h, ptr, (DWORD)total_need, &byte_read, NULL)) {\n            SDL_Error(SDL_EFREAD);\n            return 0;\n        }\n        total_read += byte_read;\n    }\n    return (total_read / size);\n}\n\nstatic size_t SDLCALL\nwindows_file_write(SDL_RWops * context, const void *ptr, size_t size,\n                 size_t num)\n{\n\n    size_t total_bytes;\n    DWORD byte_written;\n    size_t nwritten;\n\n    total_bytes = size * num;\n\n    if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE\n        || total_bytes <= 0 || !size)\n        return 0;\n\n    if (context->hidden.windowsio.buffer.left) {\n        SetFilePointer(context->hidden.windowsio.h,\n                       -(LONG)context->hidden.windowsio.buffer.left, NULL,\n                       FILE_CURRENT);\n        context->hidden.windowsio.buffer.left = 0;\n    }\n\n    /* if in append mode, we must go to the EOF before write */\n    if (context->hidden.windowsio.append) {\n        if (SetFilePointer(context->hidden.windowsio.h, 0L, NULL, FILE_END) ==\n            INVALID_SET_FILE_POINTER) {\n            SDL_Error(SDL_EFWRITE);\n            return 0;\n        }\n    }\n\n    if (!WriteFile\n        (context->hidden.windowsio.h, ptr, (DWORD)total_bytes, &byte_written, NULL)) {\n        SDL_Error(SDL_EFWRITE);\n        return 0;\n    }\n\n    nwritten = byte_written / size;\n    return nwritten;\n}\n\nstatic int SDLCALL\nwindows_file_close(SDL_RWops * context)\n{\n\n    if (context) {\n        if (context->hidden.windowsio.h != INVALID_HANDLE_VALUE) {\n            CloseHandle(context->hidden.windowsio.h);\n            context->hidden.windowsio.h = INVALID_HANDLE_VALUE;   /* to be sure */\n        }\n        SDL_free(context->hidden.windowsio.buffer.data);\n        context->hidden.windowsio.buffer.data = NULL;\n        SDL_FreeRW(context);\n    }\n    return 0;\n}\n#endif /* __WIN32__ */\n\n#ifdef HAVE_STDIO_H\n\n/* Functions to read/write stdio file pointers */\n\nstatic Sint64 SDLCALL\nstdio_size(SDL_RWops * context)\n{\n    Sint64 pos, size;\n\n    pos = SDL_RWseek(context, 0, RW_SEEK_CUR);\n    if (pos < 0) {\n        return -1;\n    }\n    size = SDL_RWseek(context, 0, RW_SEEK_END);\n\n    SDL_RWseek(context, pos, RW_SEEK_SET);\n    return size;\n}\n\nstatic Sint64 SDLCALL\nstdio_seek(SDL_RWops * context, Sint64 offset, int whence)\n{\n#ifdef HAVE_FSEEKO64\n    if (fseeko64(context->hidden.stdio.fp, (off64_t)offset, whence) == 0) {\n        return ftello64(context->hidden.stdio.fp);\n    }\n#elif defined(HAVE_FSEEKO)\n    if (fseeko(context->hidden.stdio.fp, (off_t)offset, whence) == 0) {\n        return ftello(context->hidden.stdio.fp);\n    }\n#elif defined(HAVE__FSEEKI64)\n    if (_fseeki64(context->hidden.stdio.fp, offset, whence) == 0) {\n        return _ftelli64(context->hidden.stdio.fp);\n    }\n#else\n    if (fseek(context->hidden.stdio.fp, offset, whence) == 0) {\n        return ftell(context->hidden.stdio.fp);\n    }\n#endif\n    return SDL_Error(SDL_EFSEEK);\n}\n\nstatic size_t SDLCALL\nstdio_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)\n{\n    size_t nread;\n\n    nread = fread(ptr, size, maxnum, context->hidden.stdio.fp);\n    if (nread == 0 && ferror(context->hidden.stdio.fp)) {\n        SDL_Error(SDL_EFREAD);\n    }\n    return nread;\n}\n\nstatic size_t SDLCALL\nstdio_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)\n{\n    size_t nwrote;\n\n    nwrote = fwrite(ptr, size, num, context->hidden.stdio.fp);\n    if (nwrote == 0 && ferror(context->hidden.stdio.fp)) {\n        SDL_Error(SDL_EFWRITE);\n    }\n    return nwrote;\n}\n\nstatic int SDLCALL\nstdio_close(SDL_RWops * context)\n{\n    int status = 0;\n    if (context) {\n        if (context->hidden.stdio.autoclose) {\n            /* WARNING:  Check the return value here! */\n            if (fclose(context->hidden.stdio.fp) != 0) {\n                status = SDL_Error(SDL_EFWRITE);\n            }\n        }\n        SDL_FreeRW(context);\n    }\n    return status;\n}\n#endif /* !HAVE_STDIO_H */\n\n/* Functions to read/write memory pointers */\n\nstatic Sint64 SDLCALL\nmem_size(SDL_RWops * context)\n{\n    return (Sint64)(context->hidden.mem.stop - context->hidden.mem.base);\n}\n\nstatic Sint64 SDLCALL\nmem_seek(SDL_RWops * context, Sint64 offset, int whence)\n{\n    Uint8 *newpos;\n\n    switch (whence) {\n    case RW_SEEK_SET:\n        newpos = context->hidden.mem.base + offset;\n        break;\n    case RW_SEEK_CUR:\n        newpos = context->hidden.mem.here + offset;\n        break;\n    case RW_SEEK_END:\n        newpos = context->hidden.mem.stop + offset;\n        break;\n    default:\n        return SDL_SetError(\"Unknown value for 'whence'\");\n    }\n    if (newpos < context->hidden.mem.base) {\n        newpos = context->hidden.mem.base;\n    }\n    if (newpos > context->hidden.mem.stop) {\n        newpos = context->hidden.mem.stop;\n    }\n    context->hidden.mem.here = newpos;\n    return (Sint64)(context->hidden.mem.here - context->hidden.mem.base);\n}\n\nstatic size_t SDLCALL\nmem_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)\n{\n    size_t total_bytes;\n    size_t mem_available;\n\n    total_bytes = (maxnum * size);\n    if ((maxnum <= 0) || (size <= 0)\n        || ((total_bytes / maxnum) != (size_t) size)) {\n        return 0;\n    }\n\n    mem_available = (context->hidden.mem.stop - context->hidden.mem.here);\n    if (total_bytes > mem_available) {\n        total_bytes = mem_available;\n    }\n\n    SDL_memcpy(ptr, context->hidden.mem.here, total_bytes);\n    context->hidden.mem.here += total_bytes;\n\n    return (total_bytes / size);\n}\n\nstatic size_t SDLCALL\nmem_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)\n{\n    if ((context->hidden.mem.here + (num * size)) > context->hidden.mem.stop) {\n        num = (context->hidden.mem.stop - context->hidden.mem.here) / size;\n    }\n    SDL_memcpy(context->hidden.mem.here, ptr, num * size);\n    context->hidden.mem.here += num * size;\n    return num;\n}\n\nstatic size_t SDLCALL\nmem_writeconst(SDL_RWops * context, const void *ptr, size_t size, size_t num)\n{\n    SDL_SetError(\"Can't write to read-only memory\");\n    return 0;\n}\n\nstatic int SDLCALL\nmem_close(SDL_RWops * context)\n{\n    if (context) {\n        SDL_FreeRW(context);\n    }\n    return 0;\n}\n\n\n/* Functions to create SDL_RWops structures from various data sources */\n\nSDL_RWops *\nSDL_RWFromFile(const char *file, const char *mode)\n{\n    SDL_RWops *rwops = NULL;\n    if (!file || !*file || !mode || !*mode) {\n        SDL_SetError(\"SDL_RWFromFile(): No file or no mode specified\");\n        return NULL;\n    }\n#if defined(__ANDROID__)\n#ifdef HAVE_STDIO_H\n    /* Try to open the file on the filesystem first */\n    if (*file == '/') {\n        FILE *fp = fopen(file, mode);\n        if (fp) {\n            return SDL_RWFromFP(fp, 1);\n        }\n    } else {\n        /* Try opening it from internal storage if it's a relative path */\n        char *path;\n        FILE *fp;\n\n        path = SDL_stack_alloc(char, PATH_MAX);\n        if (path) {\n            SDL_snprintf(path, PATH_MAX, \"%s/%s\",\n                         SDL_AndroidGetInternalStoragePath(), file);\n            fp = fopen(path, mode);\n            SDL_stack_free(path);\n            if (fp) {\n                return SDL_RWFromFP(fp, 1);\n            }\n        }\n    }\n#endif /* HAVE_STDIO_H */\n\n    /* Try to open the file from the asset system */\n    rwops = SDL_AllocRW();\n    if (!rwops)\n        return NULL;            /* SDL_SetError already setup by SDL_AllocRW() */\n    if (Android_JNI_FileOpen(rwops, file, mode) < 0) {\n        SDL_FreeRW(rwops);\n        return NULL;\n    }\n    rwops->size = Android_JNI_FileSize;\n    rwops->seek = Android_JNI_FileSeek;\n    rwops->read = Android_JNI_FileRead;\n    rwops->write = Android_JNI_FileWrite;\n    rwops->close = Android_JNI_FileClose;\n    rwops->type = SDL_RWOPS_JNIFILE;\n\n#elif defined(__WIN32__)\n    rwops = SDL_AllocRW();\n    if (!rwops)\n        return NULL;            /* SDL_SetError already setup by SDL_AllocRW() */\n    if (windows_file_open(rwops, file, mode) < 0) {\n        SDL_FreeRW(rwops);\n        return NULL;\n    }\n    rwops->size = windows_file_size;\n    rwops->seek = windows_file_seek;\n    rwops->read = windows_file_read;\n    rwops->write = windows_file_write;\n    rwops->close = windows_file_close;\n    rwops->type = SDL_RWOPS_WINFILE;\n\n#elif HAVE_STDIO_H\n    {\n        #ifdef __APPLE__\n        FILE *fp = SDL_OpenFPFromBundleOrFallback(file, mode);\n        #elif __WINRT__\n        FILE *fp = NULL;\n        fopen_s(&fp, file, mode);\n        #else\n        FILE *fp = fopen(file, mode);\n        #endif\n        if (fp == NULL) {\n            SDL_SetError(\"Couldn't open %s\", file);\n        } else {\n            rwops = SDL_RWFromFP(fp, 1);\n        }\n    }\n#else\n    SDL_SetError(\"SDL not compiled with stdio support\");\n#endif /* !HAVE_STDIO_H */\n\n    return rwops;\n}\n\n#ifdef HAVE_STDIO_H\nSDL_RWops *\nSDL_RWFromFP(FILE * fp, SDL_bool autoclose)\n{\n    SDL_RWops *rwops = NULL;\n\n    rwops = SDL_AllocRW();\n    if (rwops != NULL) {\n        rwops->size = stdio_size;\n        rwops->seek = stdio_seek;\n        rwops->read = stdio_read;\n        rwops->write = stdio_write;\n        rwops->close = stdio_close;\n        rwops->hidden.stdio.fp = fp;\n        rwops->hidden.stdio.autoclose = autoclose;\n        rwops->type = SDL_RWOPS_STDFILE;\n    }\n    return rwops;\n}\n#else\nSDL_RWops *\nSDL_RWFromFP(void * fp, SDL_bool autoclose)\n{\n    SDL_SetError(\"SDL not compiled with stdio support\");\n    return NULL;\n}\n#endif /* HAVE_STDIO_H */\n\nSDL_RWops *\nSDL_RWFromMem(void *mem, int size)\n{\n    SDL_RWops *rwops = NULL;\n    if (!mem) {\n      SDL_InvalidParamError(\"mem\");\n      return rwops;\n    }\n    if (!size) {\n      SDL_InvalidParamError(\"size\");\n      return rwops;\n    }\n\n    rwops = SDL_AllocRW();\n    if (rwops != NULL) {\n        rwops->size = mem_size;\n        rwops->seek = mem_seek;\n        rwops->read = mem_read;\n        rwops->write = mem_write;\n        rwops->close = mem_close;\n        rwops->hidden.mem.base = (Uint8 *) mem;\n        rwops->hidden.mem.here = rwops->hidden.mem.base;\n        rwops->hidden.mem.stop = rwops->hidden.mem.base + size;\n        rwops->type = SDL_RWOPS_MEMORY;\n    }\n    return rwops;\n}\n\nSDL_RWops *\nSDL_RWFromConstMem(const void *mem, int size)\n{\n    SDL_RWops *rwops = NULL;\n    if (!mem) {\n      SDL_InvalidParamError(\"mem\");\n      return rwops;\n    }\n    if (!size) {\n      SDL_InvalidParamError(\"size\");\n      return rwops;\n    }\n\n    rwops = SDL_AllocRW();\n    if (rwops != NULL) {\n        rwops->size = mem_size;\n        rwops->seek = mem_seek;\n        rwops->read = mem_read;\n        rwops->write = mem_writeconst;\n        rwops->close = mem_close;\n        rwops->hidden.mem.base = (Uint8 *) mem;\n        rwops->hidden.mem.here = rwops->hidden.mem.base;\n        rwops->hidden.mem.stop = rwops->hidden.mem.base + size;\n        rwops->type = SDL_RWOPS_MEMORY_RO;\n    }\n    return rwops;\n}\n\nSDL_RWops *\nSDL_AllocRW(void)\n{\n    SDL_RWops *area;\n\n    area = (SDL_RWops *) SDL_malloc(sizeof *area);\n    if (area == NULL) {\n        SDL_OutOfMemory();\n    } else {\n        area->type = SDL_RWOPS_UNKNOWN;\n    }\n    return area;\n}\n\nvoid\nSDL_FreeRW(SDL_RWops * area)\n{\n    SDL_free(area);\n}\n\n/* Functions for dynamically reading and writing endian-specific values */\n\nUint8\nSDL_ReadU8(SDL_RWops * src)\n{\n    Uint8 value = 0;\n\n    SDL_RWread(src, &value, sizeof (value), 1);\n    return value;\n}\n\nUint16\nSDL_ReadLE16(SDL_RWops * src)\n{\n    Uint16 value = 0;\n\n    SDL_RWread(src, &value, sizeof (value), 1);\n    return SDL_SwapLE16(value);\n}\n\nUint16\nSDL_ReadBE16(SDL_RWops * src)\n{\n    Uint16 value = 0;\n\n    SDL_RWread(src, &value, sizeof (value), 1);\n    return SDL_SwapBE16(value);\n}\n\nUint32\nSDL_ReadLE32(SDL_RWops * src)\n{\n    Uint32 value = 0;\n\n    SDL_RWread(src, &value, sizeof (value), 1);\n    return SDL_SwapLE32(value);\n}\n\nUint32\nSDL_ReadBE32(SDL_RWops * src)\n{\n    Uint32 value = 0;\n\n    SDL_RWread(src, &value, sizeof (value), 1);\n    return SDL_SwapBE32(value);\n}\n\nUint64\nSDL_ReadLE64(SDL_RWops * src)\n{\n    Uint64 value = 0;\n\n    SDL_RWread(src, &value, sizeof (value), 1);\n    return SDL_SwapLE64(value);\n}\n\nUint64\nSDL_ReadBE64(SDL_RWops * src)\n{\n    Uint64 value = 0;\n\n    SDL_RWread(src, &value, sizeof (value), 1);\n    return SDL_SwapBE64(value);\n}\n\nsize_t\nSDL_WriteU8(SDL_RWops * dst, Uint8 value)\n{\n    return SDL_RWwrite(dst, &value, sizeof (value), 1);\n}\n\nsize_t\nSDL_WriteLE16(SDL_RWops * dst, Uint16 value)\n{\n    const Uint16 swapped = SDL_SwapLE16(value);\n    return SDL_RWwrite(dst, &swapped, sizeof (swapped), 1);\n}\n\nsize_t\nSDL_WriteBE16(SDL_RWops * dst, Uint16 value)\n{\n    const Uint16 swapped = SDL_SwapBE16(value);\n    return SDL_RWwrite(dst, &swapped, sizeof (swapped), 1);\n}\n\nsize_t\nSDL_WriteLE32(SDL_RWops * dst, Uint32 value)\n{\n    const Uint32 swapped = SDL_SwapLE32(value);\n    return SDL_RWwrite(dst, &swapped, sizeof (swapped), 1);\n}\n\nsize_t\nSDL_WriteBE32(SDL_RWops * dst, Uint32 value)\n{\n    const Uint32 swapped = SDL_SwapBE32(value);\n    return SDL_RWwrite(dst, &swapped, sizeof (swapped), 1);\n}\n\nsize_t\nSDL_WriteLE64(SDL_RWops * dst, Uint64 value)\n{\n    const Uint64 swapped = SDL_SwapLE64(value);\n    return SDL_RWwrite(dst, &swapped, sizeof (swapped), 1);\n}\n\nsize_t\nSDL_WriteBE64(SDL_RWops * dst, Uint64 value)\n{\n    const Uint64 swapped = SDL_SwapBE64(value);\n    return SDL_RWwrite(dst, &swapped, sizeof (swapped), 1);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/filesystem/android/SDL_sysfilesystem.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifdef SDL_FILESYSTEM_ANDROID\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n/* System dependent filesystem routines                                */\n\n#include <unistd.h>\n#include <errno.h>\n\n#include \"SDL_error.h\"\n#include \"SDL_filesystem.h\"\n#include \"SDL_system.h\"\n\n\nchar *\nSDL_GetBasePath(void)\n{\n    /* The current working directory is / on Android */\n    return NULL;\n}\n\nchar *\nSDL_GetPrefPath(const char *org, const char *app)\n{\n    const char *path = SDL_AndroidGetInternalStoragePath();\n    if (path) {\n        size_t pathlen = SDL_strlen(path)+2;\n        char *fullpath = (char *)SDL_malloc(pathlen);\n        if (!fullpath) {\n            SDL_OutOfMemory();\n            return NULL;\n        }\n        SDL_snprintf(fullpath, pathlen, \"%s/\", path);\n        return fullpath;\n    }\n    return NULL;\n}\n\n#endif /* SDL_FILESYSTEM_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/haptic/SDL_haptic.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_syshaptic.h\"\n#include \"SDL_haptic_c.h\"\n#include \"../joystick/SDL_joystick_c.h\" /* For SDL_PrivateJoystickValid */\n#include \"SDL_assert.h\"\n\nSDL_Haptic *SDL_haptics = NULL;\n\n\n/*\n * Initializes the Haptic devices.\n */\nint\nSDL_HapticInit(void)\n{\n    int status;\n\n    status = SDL_SYS_HapticInit();\n    if (status >= 0) {\n        status = 0;\n    }\n\n    return status;\n}\n\n\n/*\n * Checks to see if the haptic device is valid\n */\nstatic int\nValidHaptic(SDL_Haptic * haptic)\n{\n    int valid;\n    SDL_Haptic *hapticlist;\n\n    valid = 0;\n    if (haptic != NULL) {\n        hapticlist = SDL_haptics;\n        while ( hapticlist )\n        {\n            if (hapticlist == haptic) {\n                valid = 1;\n                break;\n            }\n            hapticlist = hapticlist->next;\n        }\n    }\n\n    /* Create the error here. */\n    if (valid == 0) {\n        SDL_SetError(\"Haptic: Invalid haptic device identifier\");\n    }\n\n    return valid;\n}\n\n\n/*\n * Returns the number of available devices.\n */\nint\nSDL_NumHaptics(void)\n{\n    return SDL_SYS_NumHaptics();\n}\n\n\n/*\n * Gets the name of a Haptic device by index.\n */\nconst char *\nSDL_HapticName(int device_index)\n{\n    if ((device_index < 0) || (device_index >= SDL_NumHaptics())) {\n        SDL_SetError(\"Haptic: There are %d haptic devices available\",\n                     SDL_NumHaptics());\n        return NULL;\n    }\n    return SDL_SYS_HapticName(device_index);\n}\n\n\n/*\n * Opens a Haptic device.\n */\nSDL_Haptic *\nSDL_HapticOpen(int device_index)\n{\n    SDL_Haptic *haptic;\n    SDL_Haptic *hapticlist;\n\n    if ((device_index < 0) || (device_index >= SDL_NumHaptics())) {\n        SDL_SetError(\"Haptic: There are %d haptic devices available\",\n                     SDL_NumHaptics());\n        return NULL;\n    }\n\n    hapticlist = SDL_haptics;\n    /* If the haptic is already open, return it\n    * TODO: Should we create haptic instance IDs like the Joystick API?\n    */\n    while ( hapticlist )\n    {\n        if (device_index == hapticlist->index) {\n            haptic = hapticlist;\n            ++haptic->ref_count;\n            return haptic;\n        }\n        hapticlist = hapticlist->next;\n    }\n\n    /* Create the haptic device */\n    haptic = (SDL_Haptic *) SDL_malloc((sizeof *haptic));\n    if (haptic == NULL) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    /* Initialize the haptic device */\n    SDL_memset(haptic, 0, (sizeof *haptic));\n    haptic->rumble_id = -1;\n    haptic->index = device_index;\n    if (SDL_SYS_HapticOpen(haptic) < 0) {\n        SDL_free(haptic);\n        return NULL;\n    }\n\n    /* Add haptic to list */\n    ++haptic->ref_count;\n    /* Link the haptic in the list */\n    haptic->next = SDL_haptics;\n    SDL_haptics = haptic;\n\n    /* Disable autocenter and set gain to max. */\n    if (haptic->supported & SDL_HAPTIC_GAIN)\n        SDL_HapticSetGain(haptic, 100);\n    if (haptic->supported & SDL_HAPTIC_AUTOCENTER)\n        SDL_HapticSetAutocenter(haptic, 0);\n\n    return haptic;\n}\n\n\n/*\n * Returns 1 if the device has been opened.\n */\nint\nSDL_HapticOpened(int device_index)\n{\n    int opened;\n    SDL_Haptic *hapticlist;\n\n    /* Make sure it's valid. */\n    if ((device_index < 0) || (device_index >= SDL_NumHaptics())) {\n        SDL_SetError(\"Haptic: There are %d haptic devices available\",\n                     SDL_NumHaptics());\n        return 0;\n    }\n\n    opened = 0;\n    hapticlist = SDL_haptics;\n    /* TODO Should this use an instance ID? */\n    while ( hapticlist )\n    {\n        if (hapticlist->index == (Uint8) device_index) {\n            opened = 1;\n            break;\n        }\n        hapticlist = hapticlist->next;\n    }\n    return opened;\n}\n\n\n/*\n * Returns the index to a haptic device.\n */\nint\nSDL_HapticIndex(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    return haptic->index;\n}\n\n\n/*\n * Returns SDL_TRUE if mouse is haptic, SDL_FALSE if it isn't.\n */\nint\nSDL_MouseIsHaptic(void)\n{\n    if (SDL_SYS_HapticMouse() < 0)\n        return SDL_FALSE;\n    return SDL_TRUE;\n}\n\n\n/*\n * Returns the haptic device if mouse is haptic or NULL elsewise.\n */\nSDL_Haptic *\nSDL_HapticOpenFromMouse(void)\n{\n    int device_index;\n\n    device_index = SDL_SYS_HapticMouse();\n\n    if (device_index < 0) {\n        SDL_SetError(\"Haptic: Mouse isn't a haptic device.\");\n        return NULL;\n    }\n\n    return SDL_HapticOpen(device_index);\n}\n\n\n/*\n * Returns SDL_TRUE if joystick has haptic features.\n */\nint\nSDL_JoystickIsHaptic(SDL_Joystick * joystick)\n{\n    int ret;\n\n    /* Must be a valid joystick */\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return -1;\n    }\n\n    ret = SDL_SYS_JoystickIsHaptic(joystick);\n\n    if (ret > 0)\n        return SDL_TRUE;\n    else if (ret == 0)\n        return SDL_FALSE;\n    else\n        return -1;\n}\n\n\n/*\n * Opens a haptic device from a joystick.\n */\nSDL_Haptic *\nSDL_HapticOpenFromJoystick(SDL_Joystick * joystick)\n{\n    SDL_Haptic *haptic;\n    SDL_Haptic *hapticlist;\n\n    /* Make sure there is room. */\n    if (SDL_NumHaptics() <= 0) {\n        SDL_SetError(\"Haptic: There are %d haptic devices available\",\n                     SDL_NumHaptics());\n        return NULL;\n    }\n\n    /* Must be a valid joystick */\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        SDL_SetError(\"Haptic: Joystick isn't valid.\");\n        return NULL;\n    }\n\n    /* Joystick must be haptic */\n    if (SDL_SYS_JoystickIsHaptic(joystick) <= 0) {\n        SDL_SetError(\"Haptic: Joystick isn't a haptic device.\");\n        return NULL;\n    }\n\n    hapticlist = SDL_haptics;\n    /* Check to see if joystick's haptic is already open */\n    while ( hapticlist )\n    {\n        if (SDL_SYS_JoystickSameHaptic(hapticlist, joystick)) {\n            haptic = hapticlist;\n            ++haptic->ref_count;\n            return haptic;\n        }\n        hapticlist = hapticlist->next;\n    }\n\n    /* Create the haptic device */\n    haptic = (SDL_Haptic *) SDL_malloc((sizeof *haptic));\n    if (haptic == NULL) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    /* Initialize the haptic device */\n    SDL_memset(haptic, 0, sizeof(SDL_Haptic));\n    haptic->rumble_id = -1;\n    if (SDL_SYS_HapticOpenFromJoystick(haptic, joystick) < 0) {\n        SDL_free(haptic);\n        return NULL;\n    }\n\n    /* Add haptic to list */\n    ++haptic->ref_count;\n    /* Link the haptic in the list */\n    haptic->next = SDL_haptics;\n    SDL_haptics = haptic;\n\n    return haptic;\n}\n\n\n/*\n * Closes a SDL_Haptic device.\n */\nvoid\nSDL_HapticClose(SDL_Haptic * haptic)\n{\n    int i;\n    SDL_Haptic *hapticlist;\n    SDL_Haptic *hapticlistprev;\n\n    /* Must be valid */\n    if (!ValidHaptic(haptic)) {\n        return;\n    }\n\n    /* Check if it's still in use */\n    if (--haptic->ref_count > 0) {\n        return;\n    }\n\n    /* Close it, properly removing effects if needed */\n    for (i = 0; i < haptic->neffects; i++) {\n        if (haptic->effects[i].hweffect != NULL) {\n            SDL_HapticDestroyEffect(haptic, i);\n        }\n    }\n    SDL_SYS_HapticClose(haptic);\n\n    /* Remove from the list */\n    hapticlist = SDL_haptics;\n    hapticlistprev = NULL;\n    while ( hapticlist )\n    {\n        if (haptic == hapticlist)\n        {\n            if ( hapticlistprev )\n            {\n                /* unlink this entry */\n                hapticlistprev->next = hapticlist->next;\n            }\n            else\n            {\n                SDL_haptics = haptic->next;\n            }\n\n            break;\n        }\n        hapticlistprev = hapticlist;\n        hapticlist = hapticlist->next;\n    }\n\n    /* Free */\n    SDL_free(haptic);\n}\n\n/*\n * Cleans up after the subsystem.\n */\nvoid\nSDL_HapticQuit(void)\n{\n    SDL_SYS_HapticQuit();\n    SDL_assert(SDL_haptics == NULL);\n    SDL_haptics = NULL;\n}\n\n/*\n * Returns the number of effects a haptic device has.\n */\nint\nSDL_HapticNumEffects(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    return haptic->neffects;\n}\n\n\n/*\n * Returns the number of effects a haptic device can play.\n */\nint\nSDL_HapticNumEffectsPlaying(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    return haptic->nplaying;\n}\n\n\n/*\n * Returns supported effects by the device.\n */\nunsigned int\nSDL_HapticQuery(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return 0; /* same as if no effects were supported */\n    }\n\n    return haptic->supported;\n}\n\n\n/*\n * Returns the number of axis on the device.\n */\nint\nSDL_HapticNumAxes(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    return haptic->naxes;\n}\n\n/*\n * Checks to see if the device can support the effect.\n */\nint\nSDL_HapticEffectSupported(SDL_Haptic * haptic, SDL_HapticEffect * effect)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    if ((haptic->supported & effect->type) != 0)\n        return SDL_TRUE;\n    return SDL_FALSE;\n}\n\n/*\n * Creates a new haptic effect.\n */\nint\nSDL_HapticNewEffect(SDL_Haptic * haptic, SDL_HapticEffect * effect)\n{\n    int i;\n\n    /* Check for device validity. */\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    /* Check to see if effect is supported */\n    if (SDL_HapticEffectSupported(haptic, effect) == SDL_FALSE) {\n        return SDL_SetError(\"Haptic: Effect not supported by haptic device.\");\n    }\n\n    /* See if there's a free slot */\n    for (i = 0; i < haptic->neffects; i++) {\n        if (haptic->effects[i].hweffect == NULL) {\n\n            /* Now let the backend create the real effect */\n            if (SDL_SYS_HapticNewEffect(haptic, &haptic->effects[i], effect)\n                != 0) {\n                return -1;      /* Backend failed to create effect */\n            }\n\n            SDL_memcpy(&haptic->effects[i].effect, effect,\n                       sizeof(SDL_HapticEffect));\n            return i;\n        }\n    }\n\n    return SDL_SetError(\"Haptic: Device has no free space left.\");\n}\n\n/*\n * Checks to see if an effect is valid.\n */\nstatic int\nValidEffect(SDL_Haptic * haptic, int effect)\n{\n    if ((effect < 0) || (effect >= haptic->neffects)) {\n        SDL_SetError(\"Haptic: Invalid effect identifier.\");\n        return 0;\n    }\n    return 1;\n}\n\n/*\n * Updates an effect.\n */\nint\nSDL_HapticUpdateEffect(SDL_Haptic * haptic, int effect,\n                       SDL_HapticEffect * data)\n{\n    if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {\n        return -1;\n    }\n\n    /* Can't change type dynamically. */\n    if (data->type != haptic->effects[effect].effect.type) {\n        return SDL_SetError(\"Haptic: Updating effect type is illegal.\");\n    }\n\n    /* Updates the effect */\n    if (SDL_SYS_HapticUpdateEffect(haptic, &haptic->effects[effect], data) <\n        0) {\n        return -1;\n    }\n\n    SDL_memcpy(&haptic->effects[effect].effect, data,\n               sizeof(SDL_HapticEffect));\n    return 0;\n}\n\n\n/*\n * Runs the haptic effect on the device.\n */\nint\nSDL_HapticRunEffect(SDL_Haptic * haptic, int effect, Uint32 iterations)\n{\n    if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {\n        return -1;\n    }\n\n    /* Run the effect */\n    if (SDL_SYS_HapticRunEffect(haptic, &haptic->effects[effect], iterations)\n        < 0) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/*\n * Stops the haptic effect on the device.\n */\nint\nSDL_HapticStopEffect(SDL_Haptic * haptic, int effect)\n{\n    if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {\n        return -1;\n    }\n\n    /* Stop the effect */\n    if (SDL_SYS_HapticStopEffect(haptic, &haptic->effects[effect]) < 0) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/*\n * Gets rid of a haptic effect.\n */\nvoid\nSDL_HapticDestroyEffect(SDL_Haptic * haptic, int effect)\n{\n    if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {\n        return;\n    }\n\n    /* Not allocated */\n    if (haptic->effects[effect].hweffect == NULL) {\n        return;\n    }\n\n    SDL_SYS_HapticDestroyEffect(haptic, &haptic->effects[effect]);\n}\n\n/*\n * Gets the status of a haptic effect.\n */\nint\nSDL_HapticGetEffectStatus(SDL_Haptic * haptic, int effect)\n{\n    if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {\n        return -1;\n    }\n\n    if ((haptic->supported & SDL_HAPTIC_STATUS) == 0) {\n        return SDL_SetError(\"Haptic: Device does not support status queries.\");\n    }\n\n    return SDL_SYS_HapticGetEffectStatus(haptic, &haptic->effects[effect]);\n}\n\n/*\n * Sets the global gain of the device.\n */\nint\nSDL_HapticSetGain(SDL_Haptic * haptic, int gain)\n{\n    const char *env;\n    int real_gain, max_gain;\n\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    if ((haptic->supported & SDL_HAPTIC_GAIN) == 0) {\n        return SDL_SetError(\"Haptic: Device does not support setting gain.\");\n    }\n\n    if ((gain < 0) || (gain > 100)) {\n        return SDL_SetError(\"Haptic: Gain must be between 0 and 100.\");\n    }\n\n    /* We use the envvar to get the maximum gain. */\n    env = SDL_getenv(\"SDL_HAPTIC_GAIN_MAX\");\n    if (env != NULL) {\n        max_gain = SDL_atoi(env);\n\n        /* Check for sanity. */\n        if (max_gain < 0)\n            max_gain = 0;\n        else if (max_gain > 100)\n            max_gain = 100;\n\n        /* We'll scale it linearly with SDL_HAPTIC_GAIN_MAX */\n        real_gain = (gain * max_gain) / 100;\n    } else {\n        real_gain = gain;\n    }\n\n    if (SDL_SYS_HapticSetGain(haptic, real_gain) < 0) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/*\n * Makes the device autocenter, 0 disables.\n */\nint\nSDL_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    if ((haptic->supported & SDL_HAPTIC_AUTOCENTER) == 0) {\n        return SDL_SetError(\"Haptic: Device does not support setting autocenter.\");\n    }\n\n    if ((autocenter < 0) || (autocenter > 100)) {\n        return SDL_SetError(\"Haptic: Autocenter must be between 0 and 100.\");\n    }\n\n    if (SDL_SYS_HapticSetAutocenter(haptic, autocenter) < 0) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/*\n * Pauses the haptic device.\n */\nint\nSDL_HapticPause(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    if ((haptic->supported & SDL_HAPTIC_PAUSE) == 0) {\n        return SDL_SetError(\"Haptic: Device does not support setting pausing.\");\n    }\n\n    return SDL_SYS_HapticPause(haptic);\n}\n\n/*\n * Unpauses the haptic device.\n */\nint\nSDL_HapticUnpause(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    if ((haptic->supported & SDL_HAPTIC_PAUSE) == 0) {\n        return 0;               /* Not going to be paused, so we pretend it's unpaused. */\n    }\n\n    return SDL_SYS_HapticUnpause(haptic);\n}\n\n/*\n * Stops all the currently playing effects.\n */\nint\nSDL_HapticStopAll(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    return SDL_SYS_HapticStopAll(haptic);\n}\n\n/*\n * Checks to see if rumble is supported.\n */\nint\nSDL_HapticRumbleSupported(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    /* Most things can use SINE, but XInput only has LEFTRIGHT. */\n    return ((haptic->supported & (SDL_HAPTIC_SINE|SDL_HAPTIC_LEFTRIGHT)) != 0);\n}\n\n/*\n * Initializes the haptic device for simple rumble playback.\n */\nint\nSDL_HapticRumbleInit(SDL_Haptic * haptic)\n{\n    SDL_HapticEffect *efx = &haptic->rumble_effect;\n\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    /* Already allocated. */\n    if (haptic->rumble_id >= 0) {\n        return 0;\n    }\n\n    SDL_zerop(efx);\n    if (haptic->supported & SDL_HAPTIC_SINE) {\n        efx->type = SDL_HAPTIC_SINE;\n        efx->periodic.period = 1000;\n        efx->periodic.magnitude = 0x4000;\n        efx->periodic.length = 5000;\n        efx->periodic.attack_length = 0;\n        efx->periodic.fade_length = 0;\n    } else if (haptic->supported & SDL_HAPTIC_LEFTRIGHT) {  /* XInput? */\n        efx->type = SDL_HAPTIC_LEFTRIGHT;\n        efx->leftright.length = 5000;\n        efx->leftright.large_magnitude = 0x4000;\n        efx->leftright.small_magnitude = 0x4000;\n    } else {\n        return SDL_SetError(\"Device doesn't support rumble\");\n    }\n\n    haptic->rumble_id = SDL_HapticNewEffect(haptic, &haptic->rumble_effect);\n    if (haptic->rumble_id >= 0) {\n        return 0;\n    }\n    return -1;\n}\n\n/*\n * Runs simple rumble on a haptic device\n */\nint\nSDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length)\n{\n    SDL_HapticEffect *efx;\n    Sint16 magnitude;\n\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    if (haptic->rumble_id < 0) {\n        return SDL_SetError(\"Haptic: Rumble effect not initialized on haptic device\");\n    }\n\n    /* Clamp strength. */\n    if (strength > 1.0f) {\n        strength = 1.0f;\n    } else if (strength < 0.0f) {\n        strength = 0.0f;\n    }\n    magnitude = (Sint16)(32767.0f*strength);\n\n    efx = &haptic->rumble_effect;\n    if (efx->type == SDL_HAPTIC_SINE) {\n        efx->periodic.magnitude = magnitude;\n        efx->periodic.length = length;\n    } else if (efx->type == SDL_HAPTIC_LEFTRIGHT) {\n        efx->leftright.small_magnitude = efx->leftright.large_magnitude = magnitude;\n        efx->leftright.length = length;\n    } else {\n        SDL_assert(0 && \"This should have been caught elsewhere\");\n    }\n\n    if (SDL_HapticUpdateEffect(haptic, haptic->rumble_id, &haptic->rumble_effect) < 0) {\n        return -1;\n    }\n\n    return SDL_HapticRunEffect(haptic, haptic->rumble_id, 1);\n}\n\n/*\n * Stops the simple rumble on a haptic device.\n */\nint\nSDL_HapticRumbleStop(SDL_Haptic * haptic)\n{\n    if (!ValidHaptic(haptic)) {\n        return -1;\n    }\n\n    if (haptic->rumble_id < 0) {\n        return SDL_SetError(\"Haptic: Rumble effect not initialized on haptic device\");\n    }\n\n    return SDL_HapticStopEffect(haptic, haptic->rumble_id);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/haptic/SDL_haptic_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\nextern int SDL_HapticInit(void);\nextern void SDL_HapticQuit(void);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/haptic/SDL_syshaptic.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_syshaptic_h\n#define _SDL_syshaptic_h\n\n#include \"SDL_haptic.h\"\n\n\nstruct haptic_effect\n{\n    SDL_HapticEffect effect;    /* The current event */\n    struct haptic_hweffect *hweffect;   /* The hardware behind the event */\n};\n\n/*\n * The real SDL_Haptic struct.\n */\nstruct _SDL_Haptic\n{\n    Uint8 index;                /* Stores index it is attached to */\n\n    struct haptic_effect *effects;      /* Allocated effects */\n    int neffects;               /* Maximum amount of effects */\n    int nplaying;               /* Maximum amount of effects to play at the same time */\n    unsigned int supported;     /* Supported effects */\n    int naxes;                  /* Number of axes on the device. */\n\n    struct haptic_hwdata *hwdata;       /* Driver dependent */\n    int ref_count;              /* Count for multiple opens */\n\n    int rumble_id;              /* ID of rumble effect for simple rumble API. */\n    SDL_HapticEffect rumble_effect; /* Rumble effect. */\n    struct _SDL_Haptic *next; /* pointer to next haptic we have allocated */\n};\n\n/*\n * Scans the system for haptic devices.\n *\n * Returns number of devices on success, -1 on error.\n */\nextern int SDL_SYS_HapticInit(void);\n\n/* Function to return the number of haptic devices plugged in right now */\nextern int SDL_SYS_NumHaptics();\n\n/*\n * Gets the device dependent name of the haptic device\n */\nextern const char *SDL_SYS_HapticName(int index);\n\n/*\n * Opens the haptic device for usage.  The haptic device should have\n * the index value set previously.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticOpen(SDL_Haptic * haptic);\n\n/*\n * Returns the index of the haptic core pointer or -1 if none is found.\n */\nint SDL_SYS_HapticMouse(void);\n\n/*\n * Checks to see if the joystick has haptic capabilities.\n *\n * Returns >0 if haptic capabilities are detected, 0 if haptic\n * capabilities aren't detected and -1 on error.\n */\nextern int SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick);\n\n/*\n * Opens the haptic device for usage using the same device as\n * the joystick.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic,\n                                          SDL_Joystick * joystick);\n/*\n * Checks to see if haptic device and joystick device are the same.\n *\n * Returns 1 if they are the same, 0 if they aren't.\n */\nextern int SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic,\n                                      SDL_Joystick * joystick);\n\n/*\n * Closes a haptic device after usage.\n */\nextern void SDL_SYS_HapticClose(SDL_Haptic * haptic);\n\n/*\n * Performs a cleanup on the haptic subsystem.\n */\nextern void SDL_SYS_HapticQuit(void);\n\n/*\n * Creates a new haptic effect on the haptic device using base\n * as a template for the effect.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticNewEffect(SDL_Haptic * haptic,\n                                   struct haptic_effect *effect,\n                                   SDL_HapticEffect * base);\n\n/*\n * Updates the haptic effect on the haptic device using data\n * as a template.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,\n                                      struct haptic_effect *effect,\n                                      SDL_HapticEffect * data);\n\n/*\n * Runs the effect on the haptic device.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticRunEffect(SDL_Haptic * haptic,\n                                   struct haptic_effect *effect,\n                                   Uint32 iterations);\n\n/*\n * Stops the effect on the haptic device.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticStopEffect(SDL_Haptic * haptic,\n                                    struct haptic_effect *effect);\n\n/*\n * Cleanups up the effect on the haptic device.\n */\nextern void SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic,\n                                        struct haptic_effect *effect);\n\n/*\n * Queries the device for the status of effect.\n *\n * Returns 0 if device is stopped, >0 if device is playing and\n * -1 on error.\n */\nextern int SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,\n                                         struct haptic_effect *effect);\n\n/*\n * Sets the global gain of the haptic device.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain);\n\n/*\n * Sets the autocenter feature of the haptic device.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter);\n\n/*\n * Pauses the haptic device.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticPause(SDL_Haptic * haptic);\n\n/*\n * Unpauses the haptic device.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticUnpause(SDL_Haptic * haptic);\n\n/*\n * Stops all the currently playing haptic effects on the device.\n *\n * Returns 0 on success, -1 on error.\n */\nextern int SDL_SYS_HapticStopAll(SDL_Haptic * haptic);\n\n#endif /* _SDL_syshaptic_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/haptic/dummy/SDL_syshaptic.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if defined(SDL_HAPTIC_DUMMY) || defined(SDL_HAPTIC_DISABLED)\n\n#include \"SDL_haptic.h\"\n#include \"../SDL_syshaptic.h\"\n\n\nstatic int\nSDL_SYS_LogicError(void)\n{\n    return SDL_SetError(\"Logic error: No haptic devices available.\");\n}\n\n\nint\nSDL_SYS_HapticInit(void)\n{\n    return 0;\n}\n\nint\nSDL_SYS_NumHaptics(void)\n{\n    return 0;\n}\n\nconst char *\nSDL_SYS_HapticName(int index)\n{\n    SDL_SYS_LogicError();\n    return NULL;\n}\n\n\nint\nSDL_SYS_HapticOpen(SDL_Haptic * haptic)\n{\n    return SDL_SYS_LogicError();\n}\n\n\nint\nSDL_SYS_HapticMouse(void)\n{\n    return -1;\n}\n\n\nint\nSDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)\n{\n    return 0;\n}\n\n\nint\nSDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)\n{\n    return SDL_SYS_LogicError();\n}\n\n\nint\nSDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)\n{\n    return 0;\n}\n\n\nvoid\nSDL_SYS_HapticClose(SDL_Haptic * haptic)\n{\n    return;\n}\n\n\nvoid\nSDL_SYS_HapticQuit(void)\n{\n    return;\n}\n\n\nint\nSDL_SYS_HapticNewEffect(SDL_Haptic * haptic,\n                        struct haptic_effect *effect, SDL_HapticEffect * base)\n{\n    return SDL_SYS_LogicError();\n}\n\n\nint\nSDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,\n                           struct haptic_effect *effect,\n                           SDL_HapticEffect * data)\n{\n    return SDL_SYS_LogicError();\n}\n\n\nint\nSDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,\n                        Uint32 iterations)\n{\n    return SDL_SYS_LogicError();\n}\n\n\nint\nSDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)\n{\n    return SDL_SYS_LogicError();\n}\n\n\nvoid\nSDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)\n{\n    SDL_SYS_LogicError();\n    return;\n}\n\n\nint\nSDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,\n                              struct haptic_effect *effect)\n{\n    return SDL_SYS_LogicError();\n}\n\n\nint\nSDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)\n{\n    return SDL_SYS_LogicError();\n}\n\n\nint\nSDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)\n{\n    return SDL_SYS_LogicError();\n}\n\nint\nSDL_SYS_HapticPause(SDL_Haptic * haptic)\n{\n    return SDL_SYS_LogicError();\n}\n\nint\nSDL_SYS_HapticUnpause(SDL_Haptic * haptic)\n{\n    return SDL_SYS_LogicError();\n}\n\nint\nSDL_SYS_HapticStopAll(SDL_Haptic * haptic)\n{\n    return SDL_SYS_LogicError();\n}\n\n#endif /* SDL_HAPTIC_DUMMY || SDL_HAPTIC_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/joystick/SDL_gamecontroller.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* This is the game controller API for Simple DirectMedia Layer */\n\n#include \"SDL_events.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_sysjoystick.h\"\n#include \"SDL_hints.h\"\n#include \"SDL_gamecontrollerdb.h\"\n\n#if !SDL_EVENTS_DISABLED\n#include \"../events/SDL_events_c.h\"\n#endif\n#define ABS(_x) ((_x) < 0 ? -(_x) : (_x))\n\n#define SDL_CONTROLLER_PLATFORM_FIELD \"platform:\"\n\n/* a list of currently opened game controllers */\nstatic SDL_GameController *SDL_gamecontrollers = NULL;\n\n/* keep track of the hat and mask value that transforms this hat movement into a button/axis press */\nstruct _SDL_HatMapping\n{\n    int hat;\n    Uint8 mask;\n};\n\n/* We need 36 entries for Android (as of SDL v2.0.4) */\n#define k_nMaxReverseEntries 48\n\n/**\n * We are encoding the \"HAT\" as 0xhm. where h == hat ID and m == mask\n * MAX 4 hats supported\n */\n#define k_nMaxHatEntries 0x3f + 1\n\n/* our in memory mapping db between joystick objects and controller mappings */\nstruct _SDL_ControllerMapping\n{\n    SDL_JoystickGUID guid;\n    const char *name;\n\n    /* mapping of axis/button id to controller version */\n    int axes[SDL_CONTROLLER_AXIS_MAX];\n    int buttonasaxis[SDL_CONTROLLER_AXIS_MAX];\n\n    int buttons[SDL_CONTROLLER_BUTTON_MAX];\n    int axesasbutton[SDL_CONTROLLER_BUTTON_MAX];\n    struct _SDL_HatMapping hatasbutton[SDL_CONTROLLER_BUTTON_MAX];\n\n    /* reverse mapping, joystick indices to buttons */\n    SDL_GameControllerAxis raxes[k_nMaxReverseEntries];\n    SDL_GameControllerAxis rbuttonasaxis[k_nMaxReverseEntries];\n\n    SDL_GameControllerButton rbuttons[k_nMaxReverseEntries];\n    SDL_GameControllerButton raxesasbutton[k_nMaxReverseEntries];\n    SDL_GameControllerButton rhatasbutton[k_nMaxHatEntries];\n\n};\n\n\n/* our hard coded list of mapping support */\ntypedef struct _ControllerMapping_t\n{\n    SDL_JoystickGUID guid;\n    char *name;\n    char *mapping;\n    struct _ControllerMapping_t *next;\n} ControllerMapping_t;\n\nstatic ControllerMapping_t *s_pSupportedControllers = NULL;\nstatic ControllerMapping_t *s_pXInputMapping = NULL;\nstatic ControllerMapping_t *s_pEmscriptenMapping = NULL;\n\n/* The SDL game controller structure */\nstruct _SDL_GameController\n{\n    SDL_Joystick *joystick; /* underlying joystick device */\n    int ref_count;\n    Uint8 hatState[4]; /* the current hat state for this controller */\n    struct _SDL_ControllerMapping mapping; /* the mapping object for this controller */\n    struct _SDL_GameController *next; /* pointer to next game controller we have allocated */\n};\n\n\nint SDL_PrivateGameControllerAxis(SDL_GameController * gamecontroller, SDL_GameControllerAxis axis, Sint16 value);\nint SDL_PrivateGameControllerButton(SDL_GameController * gamecontroller, SDL_GameControllerButton button, Uint8 state);\n\n/*\n * If there is an existing add event in the queue, it needs to be modified\n * to have the right value for which, because the number of controllers in\n * the system is now one less.\n */\nstatic void UpdateEventsForDeviceRemoval()\n{\n    int i, num_events;\n    SDL_Event *events;\n\n    num_events = SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEADDED);\n    if (num_events <= 0) {\n        return;\n    }\n\n    events = SDL_stack_alloc(SDL_Event, num_events);\n    if (!events) {\n        return;\n    }\n\n    num_events = SDL_PeepEvents(events, num_events, SDL_GETEVENT, SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEADDED);\n    for (i = 0; i < num_events; ++i) {\n        --events[i].cdevice.which;\n    }\n    SDL_PeepEvents(events, num_events, SDL_ADDEVENT, 0, 0);\n\n    SDL_stack_free(events);\n}\n\n/*\n * Event filter to fire controller events from joystick ones\n */\nint SDL_GameControllerEventWatcher(void *userdata, SDL_Event * event)\n{\n    switch(event->type) {\n    case SDL_JOYAXISMOTION:\n        {\n            SDL_GameController *controllerlist;\n\n            if (event->jaxis.axis >= k_nMaxReverseEntries)\n            {\n                SDL_SetError(\"SDL_GameControllerEventWatcher: Axis index %d too large, ignoring motion\", (int)event->jaxis.axis);\n                break;\n            }\n\n            controllerlist = SDL_gamecontrollers;\n            while (controllerlist) {\n                if (controllerlist->joystick->instance_id == event->jaxis.which) {\n                    if (controllerlist->mapping.raxes[event->jaxis.axis] >= 0) /* simple axis to axis, send it through */ {\n                        SDL_GameControllerAxis axis = controllerlist->mapping.raxes[event->jaxis.axis];\n                        Sint16 value = event->jaxis.value;\n                        switch (axis) {\n                            case SDL_CONTROLLER_AXIS_TRIGGERLEFT:\n                            case SDL_CONTROLLER_AXIS_TRIGGERRIGHT:\n                                value = value / 2 + 16384;\n                                break;\n                            default:\n                                break;\n                        }\n                        SDL_PrivateGameControllerAxis(controllerlist, axis, value);\n                    } else if (controllerlist->mapping.raxesasbutton[event->jaxis.axis] >= 0) { /* simulate an axis as a button */\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.raxesasbutton[event->jaxis.axis], ABS(event->jaxis.value) > 32768/2 ? SDL_PRESSED : SDL_RELEASED);\n                    }\n                    break;\n                }\n                controllerlist = controllerlist->next;\n            }\n        }\n        break;\n    case SDL_JOYBUTTONDOWN:\n    case SDL_JOYBUTTONUP:\n        {\n            SDL_GameController *controllerlist;\n\n            if (event->jbutton.button >= k_nMaxReverseEntries)\n            {\n                SDL_SetError(\"SDL_GameControllerEventWatcher: Button index %d too large, ignoring update\", (int)event->jbutton.button);\n                break;\n            }\n\n            controllerlist = SDL_gamecontrollers;\n            while (controllerlist) {\n                if (controllerlist->joystick->instance_id == event->jbutton.which) {\n                    if (controllerlist->mapping.rbuttons[event->jbutton.button] >= 0) { /* simple button as button */\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.rbuttons[event->jbutton.button], event->jbutton.state);\n                    } else if (controllerlist->mapping.rbuttonasaxis[event->jbutton.button] >= 0) { /* an button pretending to be an axis */\n                        SDL_PrivateGameControllerAxis(controllerlist, controllerlist->mapping.rbuttonasaxis[event->jbutton.button], event->jbutton.state > 0 ? 32767 : 0);\n                    }\n                    break;\n                }\n                controllerlist = controllerlist->next;\n            }\n        }\n        break;\n    case SDL_JOYHATMOTION:\n        {\n            SDL_GameController *controllerlist;\n\n            if (event->jhat.hat >= 4) break;\n\n            controllerlist = SDL_gamecontrollers;\n            while (controllerlist) {\n                if (controllerlist->joystick->instance_id == event->jhat.which) {\n                    Uint8 bSame = controllerlist->hatState[event->jhat.hat] & event->jhat.value;\n                    /* Get list of removed bits (button release) */\n                    Uint8 bChanged = controllerlist->hatState[event->jhat.hat] ^ bSame;\n                    /* the hat idx in the high nibble */\n                    int bHighHat = event->jhat.hat << 4;\n\n                    if (bChanged & SDL_HAT_DOWN)\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.rhatasbutton[bHighHat | SDL_HAT_DOWN], SDL_RELEASED);\n                    if (bChanged & SDL_HAT_UP)\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.rhatasbutton[bHighHat | SDL_HAT_UP], SDL_RELEASED);\n                    if (bChanged & SDL_HAT_LEFT)\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.rhatasbutton[bHighHat | SDL_HAT_LEFT], SDL_RELEASED);\n                    if (bChanged & SDL_HAT_RIGHT)\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.rhatasbutton[bHighHat | SDL_HAT_RIGHT], SDL_RELEASED);\n\n                    /* Get list of added bits (button press) */\n                    bChanged = event->jhat.value ^ bSame;\n\n                    if (bChanged & SDL_HAT_DOWN)\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.rhatasbutton[bHighHat | SDL_HAT_DOWN], SDL_PRESSED);\n                    if (bChanged & SDL_HAT_UP)\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.rhatasbutton[bHighHat | SDL_HAT_UP], SDL_PRESSED);\n                    if (bChanged & SDL_HAT_LEFT)\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.rhatasbutton[bHighHat | SDL_HAT_LEFT], SDL_PRESSED);\n                    if (bChanged & SDL_HAT_RIGHT)\n                        SDL_PrivateGameControllerButton(controllerlist, controllerlist->mapping.rhatasbutton[bHighHat | SDL_HAT_RIGHT], SDL_PRESSED);\n\n                    /* update our state cache */\n                    controllerlist->hatState[event->jhat.hat] = event->jhat.value;\n\n                    break;\n                }\n                controllerlist = controllerlist->next;\n            }\n        }\n        break;\n    case SDL_JOYDEVICEADDED:\n        {\n            if (SDL_IsGameController(event->jdevice.which)) {\n                SDL_Event deviceevent;\n                deviceevent.type = SDL_CONTROLLERDEVICEADDED;\n                deviceevent.cdevice.which = event->jdevice.which;\n                SDL_PushEvent(&deviceevent);\n            }\n        }\n        break;\n    case SDL_JOYDEVICEREMOVED:\n        {\n            SDL_GameController *controllerlist = SDL_gamecontrollers;\n            while (controllerlist) {\n                if (controllerlist->joystick->instance_id == event->jdevice.which) {\n                    SDL_Event deviceevent;\n\n                    deviceevent.type = SDL_CONTROLLERDEVICEREMOVED;\n                    deviceevent.cdevice.which = event->jdevice.which;\n                    SDL_PushEvent(&deviceevent);\n\n                    UpdateEventsForDeviceRemoval();\n                    break;\n                }\n                controllerlist = controllerlist->next;\n            }\n        }\n        break;\n    default:\n        break;\n    }\n\n    return 1;\n}\n\n/*\n * Helper function to scan the mappings database for a controller with the specified GUID\n */\nControllerMapping_t *SDL_PrivateGetControllerMappingForGUID(SDL_JoystickGUID *guid)\n{\n    ControllerMapping_t *pSupportedController = s_pSupportedControllers;\n    while (pSupportedController) {\n        if (SDL_memcmp(guid, &pSupportedController->guid, sizeof(*guid)) == 0) {\n            return pSupportedController;\n        }\n        pSupportedController = pSupportedController->next;\n    }\n    return NULL;\n}\n\nstatic const char* map_StringForControllerAxis[] = {\n    \"leftx\",\n    \"lefty\",\n    \"rightx\",\n    \"righty\",\n    \"lefttrigger\",\n    \"righttrigger\",\n    NULL\n};\n\n/*\n * convert a string to its enum equivalent\n */\nSDL_GameControllerAxis SDL_GameControllerGetAxisFromString(const char *pchString)\n{\n    int entry;\n    if (!pchString || !pchString[0])\n        return SDL_CONTROLLER_AXIS_INVALID;\n\n    for (entry = 0; map_StringForControllerAxis[entry]; ++entry) {\n        if (!SDL_strcasecmp(pchString, map_StringForControllerAxis[entry]))\n            return entry;\n    }\n    return SDL_CONTROLLER_AXIS_INVALID;\n}\n\n/*\n * convert an enum to its string equivalent\n */\nconst char* SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis)\n{\n    if (axis > SDL_CONTROLLER_AXIS_INVALID && axis < SDL_CONTROLLER_AXIS_MAX) {\n        return map_StringForControllerAxis[axis];\n    }\n    return NULL;\n}\n\nstatic const char* map_StringForControllerButton[] = {\n    \"a\",\n    \"b\",\n    \"x\",\n    \"y\",\n    \"back\",\n    \"guide\",\n    \"start\",\n    \"leftstick\",\n    \"rightstick\",\n    \"leftshoulder\",\n    \"rightshoulder\",\n    \"dpup\",\n    \"dpdown\",\n    \"dpleft\",\n    \"dpright\",\n    NULL\n};\n\n/*\n * convert a string to its enum equivalent\n */\nSDL_GameControllerButton SDL_GameControllerGetButtonFromString(const char *pchString)\n{\n    int entry;\n    if (!pchString || !pchString[0])\n        return SDL_CONTROLLER_BUTTON_INVALID;\n\n    for (entry = 0; map_StringForControllerButton[entry]; ++entry) {\n        if (SDL_strcasecmp(pchString, map_StringForControllerButton[entry]) == 0)\n            return entry;\n    }\n    return SDL_CONTROLLER_BUTTON_INVALID;\n}\n\n/*\n * convert an enum to its string equivalent\n */\nconst char* SDL_GameControllerGetStringForButton(SDL_GameControllerButton axis)\n{\n    if (axis > SDL_CONTROLLER_BUTTON_INVALID && axis < SDL_CONTROLLER_BUTTON_MAX) {\n        return map_StringForControllerButton[axis];\n    }\n    return NULL;\n}\n\n/*\n * given a controller button name and a joystick name update our mapping structure with it\n */\nvoid SDL_PrivateGameControllerParseButton(const char *szGameButton, const char *szJoystickButton, struct _SDL_ControllerMapping *pMapping)\n{\n    int iSDLButton = 0;\n    SDL_GameControllerButton button;\n    SDL_GameControllerAxis axis;\n    button = SDL_GameControllerGetButtonFromString(szGameButton);\n    axis = SDL_GameControllerGetAxisFromString(szGameButton);\n    iSDLButton = SDL_atoi(&szJoystickButton[1]);\n\n    if (szJoystickButton[0] == 'a') {\n        if (iSDLButton >= k_nMaxReverseEntries) {\n            SDL_SetError(\"Axis index too large: %d\", iSDLButton);\n            return;\n        }\n        if (axis != SDL_CONTROLLER_AXIS_INVALID) {\n            pMapping->axes[ axis ] = iSDLButton;\n            pMapping->raxes[ iSDLButton ] = axis;\n        } else if (button != SDL_CONTROLLER_BUTTON_INVALID) {\n            pMapping->axesasbutton[ button ] = iSDLButton;\n            pMapping->raxesasbutton[ iSDLButton ] = button;\n        } else {\n            SDL_assert(!\"How did we get here?\");\n        }\n\n    } else if (szJoystickButton[0] == 'b') {\n        if (iSDLButton >= k_nMaxReverseEntries) {\n            SDL_SetError(\"Button index too large: %d\", iSDLButton);\n            return;\n        }\n        if (button != SDL_CONTROLLER_BUTTON_INVALID) {\n            pMapping->buttons[ button ] = iSDLButton;\n            pMapping->rbuttons[ iSDLButton ] = button;\n        } else if (axis != SDL_CONTROLLER_AXIS_INVALID) {\n            pMapping->buttonasaxis[ axis ] = iSDLButton;\n            pMapping->rbuttonasaxis[ iSDLButton ] = axis;\n        } else {\n            SDL_assert(!\"How did we get here?\");\n        }\n    } else if (szJoystickButton[0] == 'h') {\n        int hat = SDL_atoi(&szJoystickButton[1]);\n        int mask = SDL_atoi(&szJoystickButton[3]);\n        if (hat >= 4) {\n            SDL_SetError(\"Hat index too large: %d\", iSDLButton);\n        }\n\n        if (button != SDL_CONTROLLER_BUTTON_INVALID) {\n            int ridx;\n            pMapping->hatasbutton[ button ].hat = hat;\n            pMapping->hatasbutton[ button ].mask = mask;\n            ridx = (hat << 4) | mask;\n            pMapping->rhatasbutton[ ridx ] = button;\n        } else if (axis != SDL_CONTROLLER_AXIS_INVALID) {\n            SDL_assert(!\"Support hat as axis\");\n        } else {\n            SDL_assert(!\"How did we get here?\");\n        }\n    }\n}\n\n\n/*\n * given a controller mapping string update our mapping object\n */\nstatic void\nSDL_PrivateGameControllerParseControllerConfigString(struct _SDL_ControllerMapping *pMapping, const char *pchString)\n{\n    char szGameButton[20];\n    char szJoystickButton[20];\n    SDL_bool bGameButton = SDL_TRUE;\n    int i = 0;\n    const char *pchPos = pchString;\n\n    SDL_memset(szGameButton, 0x0, sizeof(szGameButton));\n    SDL_memset(szJoystickButton, 0x0, sizeof(szJoystickButton));\n\n    while (pchPos && *pchPos) {\n        if (*pchPos == ':') {\n            i = 0;\n            bGameButton = SDL_FALSE;\n        } else if (*pchPos == ' ') {\n\n        } else if (*pchPos == ',') {\n            i = 0;\n            bGameButton = SDL_TRUE;\n            SDL_PrivateGameControllerParseButton(szGameButton, szJoystickButton, pMapping);\n            SDL_memset(szGameButton, 0x0, sizeof(szGameButton));\n            SDL_memset(szJoystickButton, 0x0, sizeof(szJoystickButton));\n\n        } else if (bGameButton) {\n            if (i >= sizeof(szGameButton)) {\n                SDL_SetError(\"Button name too large: %s\", szGameButton);\n                return;\n            }\n            szGameButton[i] = *pchPos;\n            i++;\n        } else {\n            if (i >= sizeof(szJoystickButton)) {\n                SDL_SetError(\"Joystick button name too large: %s\", szJoystickButton);\n                return;\n            }\n            szJoystickButton[i] = *pchPos;\n            i++;\n        }\n        pchPos++;\n    }\n\n    SDL_PrivateGameControllerParseButton(szGameButton, szJoystickButton, pMapping);\n\n}\n\n/*\n * Make a new button mapping struct\n */\nvoid SDL_PrivateLoadButtonMapping(struct _SDL_ControllerMapping *pMapping, SDL_JoystickGUID guid, const char *pchName, const char *pchMapping)\n{\n    int j;\n\n    pMapping->guid = guid;\n    pMapping->name = pchName;\n\n    /* set all the button mappings to non defaults */\n    for (j = 0; j < SDL_CONTROLLER_AXIS_MAX; j++) {\n        pMapping->axes[j] = -1;\n        pMapping->buttonasaxis[j] = -1;\n    }\n    for (j = 0; j < SDL_CONTROLLER_BUTTON_MAX; j++) {\n        pMapping->buttons[j] = -1;\n        pMapping->axesasbutton[j] = -1;\n        pMapping->hatasbutton[j].hat = -1;\n    }\n\n    for (j = 0; j < k_nMaxReverseEntries; j++) {\n        pMapping->raxes[j] = SDL_CONTROLLER_AXIS_INVALID;\n        pMapping->rbuttonasaxis[j] = SDL_CONTROLLER_AXIS_INVALID;\n        pMapping->rbuttons[j] = SDL_CONTROLLER_BUTTON_INVALID;\n        pMapping->raxesasbutton[j] = SDL_CONTROLLER_BUTTON_INVALID;\n    }\n\n    for (j = 0; j < k_nMaxHatEntries; j++) {\n        pMapping->rhatasbutton[j] = SDL_CONTROLLER_BUTTON_INVALID;\n    }\n\n    SDL_PrivateGameControllerParseControllerConfigString(pMapping, pchMapping);\n}\n\n\n/*\n * grab the guid string from a mapping string\n */\nchar *SDL_PrivateGetControllerGUIDFromMappingString(const char *pMapping)\n{\n    const char *pFirstComma = SDL_strchr(pMapping, ',');\n    if (pFirstComma) {\n        char *pchGUID = SDL_malloc(pFirstComma - pMapping + 1);\n        if (!pchGUID) {\n            SDL_OutOfMemory();\n            return NULL;\n        }\n        SDL_memcpy(pchGUID, pMapping, pFirstComma - pMapping);\n        pchGUID[ pFirstComma - pMapping ] = 0;\n        return pchGUID;\n    }\n    return NULL;\n}\n\n\n/*\n * grab the name string from a mapping string\n */\nchar *SDL_PrivateGetControllerNameFromMappingString(const char *pMapping)\n{\n    const char *pFirstComma, *pSecondComma;\n    char *pchName;\n\n    pFirstComma = SDL_strchr(pMapping, ',');\n    if (!pFirstComma)\n        return NULL;\n\n    pSecondComma = SDL_strchr(pFirstComma + 1, ',');\n    if (!pSecondComma)\n        return NULL;\n\n    pchName = SDL_malloc(pSecondComma - pFirstComma);\n    if (!pchName) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n    SDL_memcpy(pchName, pFirstComma + 1, pSecondComma - pFirstComma);\n    pchName[ pSecondComma - pFirstComma - 1 ] = 0;\n    return pchName;\n}\n\n\n/*\n * grab the button mapping string from a mapping string\n */\nchar *SDL_PrivateGetControllerMappingFromMappingString(const char *pMapping)\n{\n    const char *pFirstComma, *pSecondComma;\n\n    pFirstComma = SDL_strchr(pMapping, ',');\n    if (!pFirstComma)\n        return NULL;\n\n    pSecondComma = SDL_strchr(pFirstComma + 1, ',');\n    if (!pSecondComma)\n        return NULL;\n\n    return SDL_strdup(pSecondComma + 1); /* mapping is everything after the 3rd comma */\n}\n\n/*\n * Helper function to refresh a mapping\n */\nvoid SDL_PrivateGameControllerRefreshMapping(ControllerMapping_t *pControllerMapping)\n{\n    SDL_GameController *gamecontrollerlist = SDL_gamecontrollers;\n    while (gamecontrollerlist) {\n        if (!SDL_memcmp(&gamecontrollerlist->mapping.guid, &pControllerMapping->guid, sizeof(pControllerMapping->guid))) {\n            SDL_Event event;\n            event.type = SDL_CONTROLLERDEVICEREMAPPED;\n            event.cdevice.which = gamecontrollerlist->joystick->instance_id;\n            SDL_PushEvent(&event);\n\n            /* Not really threadsafe.  Should this lock access within SDL_GameControllerEventWatcher? */\n            SDL_PrivateLoadButtonMapping(&gamecontrollerlist->mapping, pControllerMapping->guid, pControllerMapping->name, pControllerMapping->mapping);\n        }\n\n        gamecontrollerlist = gamecontrollerlist->next;\n    }\n}\n\n/*\n * Helper function to add a mapping for a guid\n */\nstatic ControllerMapping_t *\nSDL_PrivateAddMappingForGUID(SDL_JoystickGUID jGUID, const char *mappingString, SDL_bool *existing)\n{\n    char *pchName;\n    char *pchMapping;\n    ControllerMapping_t *pControllerMapping;\n\n    pchName = SDL_PrivateGetControllerNameFromMappingString(mappingString);\n    if (!pchName) {\n        SDL_SetError(\"Couldn't parse name from %s\", mappingString);\n        return NULL;\n    }\n\n    pchMapping = SDL_PrivateGetControllerMappingFromMappingString(mappingString);\n    if (!pchMapping) {\n        SDL_free(pchName);\n        SDL_SetError(\"Couldn't parse %s\", mappingString);\n        return NULL;\n    }\n\n    pControllerMapping = SDL_PrivateGetControllerMappingForGUID(&jGUID);\n    if (pControllerMapping) {\n        /* Update existing mapping */\n        SDL_free(pControllerMapping->name);\n        pControllerMapping->name = pchName;\n        SDL_free(pControllerMapping->mapping);\n        pControllerMapping->mapping = pchMapping;\n        /* refresh open controllers */\n        SDL_PrivateGameControllerRefreshMapping(pControllerMapping);\n        *existing = SDL_TRUE;\n    } else {\n        pControllerMapping = SDL_malloc(sizeof(*pControllerMapping));\n        if (!pControllerMapping) {\n            SDL_free(pchName);\n            SDL_free(pchMapping);\n            SDL_OutOfMemory();\n            return NULL;\n        }\n        pControllerMapping->guid = jGUID;\n        pControllerMapping->name = pchName;\n        pControllerMapping->mapping = pchMapping;\n        pControllerMapping->next = s_pSupportedControllers;\n        s_pSupportedControllers = pControllerMapping;\n        *existing = SDL_FALSE;\n    }\n    return pControllerMapping;\n}\n\n/*\n * Helper function to determine pre-calculated offset to certain joystick mappings\n */\nControllerMapping_t *SDL_PrivateGetControllerMapping(int device_index)\n{\n    SDL_JoystickGUID jGUID = SDL_JoystickGetDeviceGUID(device_index);\n    ControllerMapping_t *mapping;\n\n    mapping = SDL_PrivateGetControllerMappingForGUID(&jGUID);\n#if SDL_JOYSTICK_XINPUT\n    if (!mapping && SDL_SYS_IsXInputGamepad_DeviceIndex(device_index)) {\n        mapping = s_pXInputMapping;\n    }\n#endif\n#if defined(SDL_JOYSTICK_EMSCRIPTEN)\n    if (!mapping && s_pEmscriptenMapping) {\n        mapping = s_pEmscriptenMapping;\n    }\n#endif\n#ifdef __LINUX__\n    if (!mapping) {\n        const char *name = SDL_JoystickNameForIndex(device_index);\n        if (name) {\n            if (SDL_strstr(name, \"Xbox 360 Wireless Receiver\")) {\n                /* The Linux driver xpad.c maps the wireless dpad to buttons */\n                SDL_bool existing;\n                mapping = SDL_PrivateAddMappingForGUID(jGUID,\n\"none,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n                              &existing);\n            }\n        }\n    }\n#endif /* __LINUX__ */\n\n    if (!mapping) {\n        const char *name = SDL_JoystickNameForIndex(device_index);\n        if (name) {\n            if (SDL_strstr(name, \"Xbox\") || SDL_strstr(name, \"X-Box\")) {\n                mapping = s_pXInputMapping;\n            }\n        }\n    }\n    return mapping;\n}\n\n/*\n * Add or update an entry into the Mappings Database\n */\nint\nSDL_GameControllerAddMappingsFromRW(SDL_RWops * rw, int freerw)\n{\n    const char *platform = SDL_GetPlatform();\n    int controllers = 0;\n    char *buf, *line, *line_end, *tmp, *comma, line_platform[64];\n    size_t db_size, platform_len;\n    \n    if (rw == NULL) {\n        return SDL_SetError(\"Invalid RWops\");\n    }\n    db_size = (size_t)SDL_RWsize(rw);\n    \n    buf = (char *)SDL_malloc(db_size + 1);\n    if (buf == NULL) {\n        if (freerw) {\n            SDL_RWclose(rw);\n        }\n        return SDL_SetError(\"Could not allocate space to read DB into memory\");\n    }\n    \n    if (SDL_RWread(rw, buf, db_size, 1) != 1) {\n        if (freerw) {\n            SDL_RWclose(rw);\n        }\n        SDL_free(buf);\n        return SDL_SetError(\"Could not read DB\");\n    }\n    \n    if (freerw) {\n        SDL_RWclose(rw);\n    }\n    \n    buf[db_size] = '\\0';\n    line = buf;\n    \n    while (line < buf + db_size) {\n        line_end = SDL_strchr(line, '\\n');\n        if (line_end != NULL) {\n            *line_end = '\\0';\n        } else {\n            line_end = buf + db_size;\n        }\n        \n        /* Extract and verify the platform */\n        tmp = SDL_strstr(line, SDL_CONTROLLER_PLATFORM_FIELD);\n        if (tmp != NULL) {\n            tmp += SDL_strlen(SDL_CONTROLLER_PLATFORM_FIELD);\n            comma = SDL_strchr(tmp, ',');\n            if (comma != NULL) {\n                platform_len = comma - tmp + 1;\n                if (platform_len + 1 < SDL_arraysize(line_platform)) {\n                    SDL_strlcpy(line_platform, tmp, platform_len);\n                    if (SDL_strncasecmp(line_platform, platform, platform_len) == 0 &&\n                        SDL_GameControllerAddMapping(line) > 0) {\n                        controllers++;\n                    }\n                }\n            }\n        }\n        \n        line = line_end + 1;\n    }\n\n    SDL_free(buf);\n    return controllers;\n}\n\n/*\n * Add or update an entry into the Mappings Database\n */\nint\nSDL_GameControllerAddMapping(const char *mappingString)\n{\n    char *pchGUID;\n    SDL_JoystickGUID jGUID;\n    SDL_bool is_xinput_mapping = SDL_FALSE;\n    SDL_bool is_emscripten_mapping = SDL_FALSE;\n    SDL_bool existing = SDL_FALSE;\n    ControllerMapping_t *pControllerMapping;\n\n    if (!mappingString) {\n        return SDL_InvalidParamError(\"mappingString\");\n    }\n\n    pchGUID = SDL_PrivateGetControllerGUIDFromMappingString(mappingString);\n    if (!pchGUID) {\n        return SDL_SetError(\"Couldn't parse GUID from %s\", mappingString);\n    }\n    if (!SDL_strcasecmp(pchGUID, \"xinput\")) {\n        is_xinput_mapping = SDL_TRUE;\n    }\n    if (!SDL_strcasecmp(pchGUID, \"emscripten\")) {\n        is_emscripten_mapping = SDL_TRUE;\n    }\n    jGUID = SDL_JoystickGetGUIDFromString(pchGUID);\n    SDL_free(pchGUID);\n\n    pControllerMapping = SDL_PrivateAddMappingForGUID(jGUID, mappingString, &existing);\n    if (!pControllerMapping) {\n        return -1;\n    }\n\n    if (existing) {\n        return 0;\n    } else {\n        if (is_xinput_mapping) {\n            s_pXInputMapping = pControllerMapping;\n        }\n        if (is_emscripten_mapping) {\n            s_pEmscriptenMapping = pControllerMapping;\n        }\n        return 1;\n    }\n}\n\n/*\n * Get the mapping string for this GUID\n */\nchar *\nSDL_GameControllerMappingForGUID(SDL_JoystickGUID guid)\n{\n    char *pMappingString = NULL;\n    ControllerMapping_t *mapping = SDL_PrivateGetControllerMappingForGUID(&guid);\n    if (mapping) {\n        char pchGUID[33];\n        size_t needed;\n        SDL_JoystickGetGUIDString(guid, pchGUID, sizeof(pchGUID));\n        /* allocate enough memory for GUID + ',' + name + ',' + mapping + \\0 */\n        needed = SDL_strlen(pchGUID) + 1 + SDL_strlen(mapping->name) + 1 + SDL_strlen(mapping->mapping) + 1;\n        pMappingString = SDL_malloc(needed);\n        if (!pMappingString) {\n            SDL_OutOfMemory();\n            return NULL;\n        }\n        SDL_snprintf(pMappingString, needed, \"%s,%s,%s\", pchGUID, mapping->name, mapping->mapping);\n    }\n    return pMappingString;\n}\n\n/*\n * Get the mapping string for this device\n */\nchar *\nSDL_GameControllerMapping(SDL_GameController * gamecontroller)\n{\n    if (!gamecontroller) {\n        return NULL;\n    }\n\n    return SDL_GameControllerMappingForGUID(gamecontroller->mapping.guid);\n}\n\nstatic void\nSDL_GameControllerLoadHints()\n{\n    const char *hint = SDL_GetHint(SDL_HINT_GAMECONTROLLERCONFIG);\n    if (hint && hint[0]) {\n        size_t nchHints = SDL_strlen(hint);\n        char *pUserMappings = SDL_malloc(nchHints + 1);\n        char *pTempMappings = pUserMappings;\n        SDL_memcpy(pUserMappings, hint, nchHints);\n        pUserMappings[nchHints] = '\\0';\n        while (pUserMappings) {\n            char *pchNewLine = NULL;\n\n            pchNewLine = SDL_strchr(pUserMappings, '\\n');\n            if (pchNewLine)\n                *pchNewLine = '\\0';\n\n            SDL_GameControllerAddMapping(pUserMappings);\n\n            if (pchNewLine) {\n                pUserMappings = pchNewLine + 1;\n            } else {\n                pUserMappings = NULL;\n            }\n        }\n        SDL_free(pTempMappings);\n    }\n}\n\n/*\n * Initialize the game controller system, mostly load our DB of controller config mappings\n */\nint\nSDL_GameControllerInit(void)\n{\n    int i = 0;\n    const char *pMappingString = NULL;\n    pMappingString = s_ControllerMappings[i];\n    while (pMappingString) {\n        SDL_GameControllerAddMapping(pMappingString);\n\n        i++;\n        pMappingString = s_ControllerMappings[i];\n    }\n\n    /* load in any user supplied config */\n    SDL_GameControllerLoadHints();\n\n    /* watch for joy events and fire controller ones if needed */\n    SDL_AddEventWatch(SDL_GameControllerEventWatcher, NULL);\n\n    /* Send added events for controllers currently attached */\n    for (i = 0; i < SDL_NumJoysticks(); ++i) {\n        if (SDL_IsGameController(i)) {\n            SDL_Event deviceevent;\n            deviceevent.type = SDL_CONTROLLERDEVICEADDED;\n            deviceevent.cdevice.which = i;\n            SDL_PushEvent(&deviceevent);\n        }\n    }\n\n    return (0);\n}\n\n\n/*\n * Get the implementation dependent name of a controller\n */\nconst char *\nSDL_GameControllerNameForIndex(int device_index)\n{\n    ControllerMapping_t *pSupportedController =  SDL_PrivateGetControllerMapping(device_index);\n    if (pSupportedController) {\n        return pSupportedController->name;\n    }\n    return NULL;\n}\n\n\n/*\n * Return 1 if the joystick at this device index is a supported controller\n */\nSDL_bool\nSDL_IsGameController(int device_index)\n{\n    ControllerMapping_t *pSupportedController =  SDL_PrivateGetControllerMapping(device_index);\n    if (pSupportedController) {\n        return SDL_TRUE;\n    }\n\n    return SDL_FALSE;\n}\n\n/*\n * Open a controller for use - the index passed as an argument refers to\n * the N'th controller on the system.  This index is the value which will\n * identify this controller in future controller events.\n *\n * This function returns a controller identifier, or NULL if an error occurred.\n */\nSDL_GameController *\nSDL_GameControllerOpen(int device_index)\n{\n    SDL_GameController *gamecontroller;\n    SDL_GameController *gamecontrollerlist;\n    ControllerMapping_t *pSupportedController = NULL;\n\n    if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) {\n        SDL_SetError(\"There are %d joysticks available\", SDL_NumJoysticks());\n        return (NULL);\n    }\n\n    gamecontrollerlist = SDL_gamecontrollers;\n    /* If the controller is already open, return it */\n    while (gamecontrollerlist) {\n        if (SDL_SYS_GetInstanceIdOfDeviceIndex(device_index) == gamecontrollerlist->joystick->instance_id) {\n                gamecontroller = gamecontrollerlist;\n                ++gamecontroller->ref_count;\n                return (gamecontroller);\n        }\n        gamecontrollerlist = gamecontrollerlist->next;\n    }\n\n    /* Find a controller mapping */\n    pSupportedController =  SDL_PrivateGetControllerMapping(device_index);\n    if (!pSupportedController) {\n        SDL_SetError(\"Couldn't find mapping for device (%d)\", device_index);\n        return (NULL);\n    }\n\n    /* Create and initialize the joystick */\n    gamecontroller = (SDL_GameController *) SDL_malloc((sizeof *gamecontroller));\n    if (gamecontroller == NULL) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    SDL_memset(gamecontroller, 0, (sizeof *gamecontroller));\n    gamecontroller->joystick = SDL_JoystickOpen(device_index);\n    if (!gamecontroller->joystick) {\n        SDL_free(gamecontroller);\n        return NULL;\n    }\n\n    SDL_PrivateLoadButtonMapping(&gamecontroller->mapping, pSupportedController->guid, pSupportedController->name, pSupportedController->mapping);\n\n    /* The triggers are mapped from -32768 to 32767, where -32768 is the 'unpressed' value */\n    {\n        int leftTriggerMapping = gamecontroller->mapping.axes[SDL_CONTROLLER_AXIS_TRIGGERLEFT];\n        int rightTriggerMapping = gamecontroller->mapping.axes[SDL_CONTROLLER_AXIS_TRIGGERRIGHT];\n        if (leftTriggerMapping >= 0) {\n            gamecontroller->joystick->axes[leftTriggerMapping] =\n            gamecontroller->joystick->axes_zero[leftTriggerMapping] = (Sint16)-32768;\n        }\n        if (rightTriggerMapping >= 0) {\n            gamecontroller->joystick->axes[rightTriggerMapping] =\n            gamecontroller->joystick->axes_zero[rightTriggerMapping] = (Sint16)-32768;\n        }\n    }\n\n    /* Add joystick to list */\n    ++gamecontroller->ref_count;\n    /* Link the joystick in the list */\n    gamecontroller->next = SDL_gamecontrollers;\n    SDL_gamecontrollers = gamecontroller;\n\n    SDL_SYS_JoystickUpdate(gamecontroller->joystick);\n\n    return (gamecontroller);\n}\n\n/*\n * Manually pump for controller updates.\n */\nvoid\nSDL_GameControllerUpdate(void)\n{\n    /* Just for API completeness; the joystick API does all the work. */\n    SDL_JoystickUpdate();\n}\n\n\n/*\n * Get the current state of an axis control on a controller\n */\nSint16\nSDL_GameControllerGetAxis(SDL_GameController * gamecontroller, SDL_GameControllerAxis axis)\n{\n    if (!gamecontroller)\n        return 0;\n\n    if (gamecontroller->mapping.axes[axis] >= 0) {\n        Sint16 value = (SDL_JoystickGetAxis(gamecontroller->joystick, gamecontroller->mapping.axes[axis]));\n        switch (axis) {\n            case SDL_CONTROLLER_AXIS_TRIGGERLEFT:\n            case SDL_CONTROLLER_AXIS_TRIGGERRIGHT:\n                /* Shift it to be 0 - 32767 */\n                value = value / 2 + 16384;\n            default:\n                break;\n        }\n        return value;\n    } else if (gamecontroller->mapping.buttonasaxis[axis] >= 0) {\n        Uint8 value;\n        value = SDL_JoystickGetButton(gamecontroller->joystick, gamecontroller->mapping.buttonasaxis[axis]);\n        if (value > 0)\n            return 32767;\n        return 0;\n    }\n    return 0;\n}\n\n\n/*\n * Get the current state of a button on a controller\n */\nUint8\nSDL_GameControllerGetButton(SDL_GameController * gamecontroller, SDL_GameControllerButton button)\n{\n    if (!gamecontroller)\n        return 0;\n\n    if (gamecontroller->mapping.buttons[button] >= 0) {\n        return (SDL_JoystickGetButton(gamecontroller->joystick, gamecontroller->mapping.buttons[button]));\n    } else if (gamecontroller->mapping.axesasbutton[button] >= 0) {\n        Sint16 value;\n        value = SDL_JoystickGetAxis(gamecontroller->joystick, gamecontroller->mapping.axesasbutton[button]);\n        if (ABS(value) > 32768/2)\n            return 1;\n        return 0;\n    } else if (gamecontroller->mapping.hatasbutton[button].hat >= 0) {\n        Uint8 value;\n        value = SDL_JoystickGetHat(gamecontroller->joystick, gamecontroller->mapping.hatasbutton[button].hat);\n\n        if (value & gamecontroller->mapping.hatasbutton[button].mask)\n            return 1;\n        return 0;\n    }\n\n    return 0;\n}\n\n/*\n * Return if the joystick in question is currently attached to the system,\n *  \\return 0 if not plugged in, 1 if still present.\n */\nSDL_bool\nSDL_GameControllerGetAttached(SDL_GameController * gamecontroller)\n{\n    if (!gamecontroller)\n        return SDL_FALSE;\n\n    return SDL_JoystickGetAttached(gamecontroller->joystick);\n}\n\n\nconst char *\nSDL_GameControllerName(SDL_GameController * gamecontroller)\n{\n    if (!gamecontroller)\n        return NULL;\n\n    return (gamecontroller->mapping.name);\n}\n\n\n/*\n * Get the joystick for this controller\n */\nSDL_Joystick *SDL_GameControllerGetJoystick(SDL_GameController * gamecontroller)\n{\n    if (!gamecontroller)\n        return NULL;\n\n    return gamecontroller->joystick;\n}\n\n\n/*\n * Find the SDL_GameController that owns this instance id\n */\nSDL_GameController *\nSDL_GameControllerFromInstanceID(SDL_JoystickID joyid)\n{\n    SDL_GameController *gamecontroller = SDL_gamecontrollers;\n    while (gamecontroller) {\n        if (gamecontroller->joystick->instance_id == joyid) {\n            return gamecontroller;\n        }\n        gamecontroller = gamecontroller->next;\n    }\n\n    return NULL;\n}\n\n\n/**\n * Get the SDL joystick layer binding for this controller axis mapping\n */\nSDL_GameControllerButtonBind SDL_GameControllerGetBindForAxis(SDL_GameController * gamecontroller, SDL_GameControllerAxis axis)\n{\n    SDL_GameControllerButtonBind bind;\n    SDL_memset(&bind, 0x0, sizeof(bind));\n\n    if (!gamecontroller || axis == SDL_CONTROLLER_AXIS_INVALID)\n        return bind;\n\n    if (gamecontroller->mapping.axes[axis] >= 0) {\n        bind.bindType = SDL_CONTROLLER_BINDTYPE_AXIS;\n        bind.value.button = gamecontroller->mapping.axes[axis];\n    } else if (gamecontroller->mapping.buttonasaxis[axis] >= 0) {\n        bind.bindType = SDL_CONTROLLER_BINDTYPE_BUTTON;\n        bind.value.button = gamecontroller->mapping.buttonasaxis[axis];\n    }\n\n    return bind;\n}\n\n\n/**\n * Get the SDL joystick layer binding for this controller button mapping\n */\nSDL_GameControllerButtonBind SDL_GameControllerGetBindForButton(SDL_GameController * gamecontroller, SDL_GameControllerButton button)\n{\n    SDL_GameControllerButtonBind bind;\n    SDL_memset(&bind, 0x0, sizeof(bind));\n\n    if (!gamecontroller || button == SDL_CONTROLLER_BUTTON_INVALID)\n        return bind;\n\n    if (gamecontroller->mapping.buttons[button] >= 0) {\n        bind.bindType = SDL_CONTROLLER_BINDTYPE_BUTTON;\n        bind.value.button = gamecontroller->mapping.buttons[button];\n    } else if (gamecontroller->mapping.axesasbutton[button] >= 0) {\n        bind.bindType = SDL_CONTROLLER_BINDTYPE_AXIS;\n        bind.value.axis = gamecontroller->mapping.axesasbutton[button];\n    } else if (gamecontroller->mapping.hatasbutton[button].hat >= 0) {\n        bind.bindType = SDL_CONTROLLER_BINDTYPE_HAT;\n        bind.value.hat.hat = gamecontroller->mapping.hatasbutton[button].hat;\n        bind.value.hat.hat_mask = gamecontroller->mapping.hatasbutton[button].mask;\n    }\n\n    return bind;\n}\n\n\nvoid\nSDL_GameControllerClose(SDL_GameController * gamecontroller)\n{\n    SDL_GameController *gamecontrollerlist, *gamecontrollerlistprev;\n\n    if (!gamecontroller)\n        return;\n\n    /* First decrement ref count */\n    if (--gamecontroller->ref_count > 0) {\n        return;\n    }\n\n    SDL_JoystickClose(gamecontroller->joystick);\n\n    gamecontrollerlist = SDL_gamecontrollers;\n    gamecontrollerlistprev = NULL;\n    while (gamecontrollerlist) {\n        if (gamecontroller == gamecontrollerlist) {\n            if (gamecontrollerlistprev) {\n                /* unlink this entry */\n                gamecontrollerlistprev->next = gamecontrollerlist->next;\n            } else {\n                SDL_gamecontrollers = gamecontroller->next;\n            }\n\n            break;\n        }\n        gamecontrollerlistprev = gamecontrollerlist;\n        gamecontrollerlist = gamecontrollerlist->next;\n    }\n\n    SDL_free(gamecontroller);\n}\n\n\n/*\n * Quit the controller subsystem\n */\nvoid\nSDL_GameControllerQuit(void)\n{\n    ControllerMapping_t *pControllerMap;\n    while (SDL_gamecontrollers) {\n        SDL_gamecontrollers->ref_count = 1;\n        SDL_GameControllerClose(SDL_gamecontrollers);\n    }\n\n    while (s_pSupportedControllers) {\n        pControllerMap = s_pSupportedControllers;\n        s_pSupportedControllers = s_pSupportedControllers->next;\n        SDL_free(pControllerMap->name);\n        SDL_free(pControllerMap->mapping);\n        SDL_free(pControllerMap);\n    }\n\n    SDL_DelEventWatch(SDL_GameControllerEventWatcher, NULL);\n\n}\n\n/*\n * Event filter to transform joystick events into appropriate game controller ones\n */\nint\nSDL_PrivateGameControllerAxis(SDL_GameController * gamecontroller, SDL_GameControllerAxis axis, Sint16 value)\n{\n    int posted;\n\n    /* translate the event, if desired */\n    posted = 0;\n#if !SDL_EVENTS_DISABLED\n    if (SDL_GetEventState(SDL_CONTROLLERAXISMOTION) == SDL_ENABLE) {\n        SDL_Event event;\n        event.type = SDL_CONTROLLERAXISMOTION;\n        event.caxis.which = gamecontroller->joystick->instance_id;\n        event.caxis.axis = axis;\n        event.caxis.value = value;\n        posted = SDL_PushEvent(&event) == 1;\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n    return (posted);\n}\n\n\n/*\n * Event filter to transform joystick events into appropriate game controller ones\n */\nint\nSDL_PrivateGameControllerButton(SDL_GameController * gamecontroller, SDL_GameControllerButton button, Uint8 state)\n{\n    int posted;\n#if !SDL_EVENTS_DISABLED\n    SDL_Event event;\n\n    if (button == SDL_CONTROLLER_BUTTON_INVALID)\n        return (0);\n\n    switch (state) {\n    case SDL_PRESSED:\n        event.type = SDL_CONTROLLERBUTTONDOWN;\n        break;\n    case SDL_RELEASED:\n        event.type = SDL_CONTROLLERBUTTONUP;\n        break;\n    default:\n        /* Invalid state -- bail */\n        return (0);\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n\n    /* translate the event, if desired */\n    posted = 0;\n#if !SDL_EVENTS_DISABLED\n    if (SDL_GetEventState(event.type) == SDL_ENABLE) {\n        event.cbutton.which = gamecontroller->joystick->instance_id;\n        event.cbutton.button = button;\n        event.cbutton.state = state;\n        posted = SDL_PushEvent(&event) == 1;\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n    return (posted);\n}\n\n/*\n * Turn off controller events\n */\nint\nSDL_GameControllerEventState(int state)\n{\n#if SDL_EVENTS_DISABLED\n    return SDL_IGNORE;\n#else\n    const Uint32 event_list[] = {\n        SDL_CONTROLLERAXISMOTION, SDL_CONTROLLERBUTTONDOWN, SDL_CONTROLLERBUTTONUP,\n        SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEREMOVED, SDL_CONTROLLERDEVICEREMAPPED,\n    };\n    unsigned int i;\n\n    switch (state) {\n    case SDL_QUERY:\n        state = SDL_IGNORE;\n        for (i = 0; i < SDL_arraysize(event_list); ++i) {\n            state = SDL_EventState(event_list[i], SDL_QUERY);\n            if (state == SDL_ENABLE) {\n                break;\n            }\n        }\n        break;\n    default:\n        for (i = 0; i < SDL_arraysize(event_list); ++i) {\n            SDL_EventState(event_list[i], state);\n        }\n        break;\n    }\n    return (state);\n#endif /* SDL_EVENTS_DISABLED */\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/joystick/SDL_gamecontrollerdb.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n\n/* Default mappings we support\n\n   The easiest way to generate a new mapping is to start Steam in Big Picture\n   mode, configure your joystick and then look in config/config.vdf in your\n   Steam installation directory for the \"SDL_GamepadBind\" entry.\n   \n   Alternatively, you can use the app located in test/controllermap\n */\nstatic const char *s_ControllerMappings [] =\n{\n#if SDL_JOYSTICK_XINPUT\n    \"xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n#endif\n#if SDL_JOYSTICK_DINPUT\n    \"10280900000000000000504944564944,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,\",\n    \"341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n    \"e8206058000000000000504944564944,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,\",\n    \"ffff0000000000000000504944564944,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,\",\n    \"6d0416c2000000000000504944564944,Generic DirectInput Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n\t\"6d0418c2000000000000504944564944,Logitech F510 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n\t\"6d0419c2000000000000504944564944,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\", /* Guide button doesn't seem to be sent in DInput mode. */\n    \"4d6963726f736f66742050432d6a6f79,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a5,righty:a4,x:b1,y:b2,\",\n    \"88880803000000000000504944564944,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,\",\n    \"4c056802000000000000504944564944,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,\",\n    \"25090500000000000000504944564944,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,\",\n    \"4c05c405000000000000504944564944,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,\",\n#endif\n#if defined(__MACOSX__)\n    \"10280000000000000900000000000000,8Bitdo SFC30 GamePad Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,\",\n    \"830500000000000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n    \"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,\",\n    \"6d0400000000000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\", /* Guide button doesn't seem to be sent in DInput mode. */\n    \"6d0400000000000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n    \"6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,\",\n    \"6d0400000000000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\", /* This includes F710 in DInput mode and the \"Logitech Cordless RumblePad 2\", at the very least. */\n    \"4c050000000000006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,\",\n    \"4c05000000000000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,\",\n    \"351200000000000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,\",\n    \"11010000000000002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,\",\n    \"11010000000000001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,\",\n    \"5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,\",\n#endif\n#if defined(__LINUX__)\n    \"05000000102800000900000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,\",\n    \"03000000100000008200000011010000,Akishop Customs PS360+ v1.66,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,\",\n    \"03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,\",\n    \"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,\",\n    \"030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n    \"03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,\",\n    \"030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n    \"030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n    \"030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n    \"030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\", /* Guide button doesn't seem to be sent in DInput mode. */\n    \"030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n    \"030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n    \"03000000380700008433000011010000,Mad Catz FightStick TE S+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n    \"03000000380700008483000011010000,Mad Catz FightStick TE S+ PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,\",\n    \"03000000380700003847000090040000,Mad Catz Wired Xbox 360 Controller (SFIV),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,\",\n    \"03000000380700008034000011010000,Mad Catz fightstick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n    \"03000000380700008084000011010000,Mad Catz fightstick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,\",\n    \"03000000380700001888000010010000,MadCatz PC USB Wired Stick 8818,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n    \"03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,\",\n    \"050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,\",\n    \"050000003620000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,\",\n    \"030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,\",\n    \"03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,\",\n    \"030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,\",\n    \"050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,\",\n    \"030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,\",\n    \"050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,\",\n    \"03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n    \"03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,\",\n    \"050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,\",\n    \"03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n    \"03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n    \"xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n    \"050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n    \"030000005e040000d102000001010000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,\",\n#endif\n#if defined(__ANDROID__)\n    \"4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,\",\n#endif\n#if defined(SDL_JOYSTICK_MFI)\n    \"4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,\",\n    \"4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,\",\n#endif\n#if defined(SDL_JOYSTICK_EMSCRIPTEN)\n    \"emscripten,Standard Gamepad,a:b0,b:b1,back:b8,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b16,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,\",\n#endif\n    NULL\n};\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/joystick/SDL_joystick.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* This is the joystick API for Simple DirectMedia Layer */\n\n#include \"SDL.h\"\n#include \"SDL_events.h\"\n#include \"SDL_sysjoystick.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_hints.h\"\n\n#if !SDL_EVENTS_DISABLED\n#include \"../events/SDL_events_c.h\"\n#endif\n\nstatic SDL_bool SDL_joystick_allows_background_events = SDL_FALSE;\nstatic SDL_Joystick *SDL_joysticks = NULL;\nstatic SDL_Joystick *SDL_updating_joystick = NULL;\n\nstatic void\nSDL_JoystickAllowBackgroundEventsChanged(void *userdata, const char *name, const char *oldValue, const char *hint)\n{\n    if (hint && *hint == '1') {\n        SDL_joystick_allows_background_events = SDL_TRUE;\n    } else {\n        SDL_joystick_allows_background_events = SDL_FALSE;\n    }\n}\n\nint\nSDL_JoystickInit(void)\n{\n    int status;\n\n    /* See if we should allow joystick events while in the background */\n    SDL_AddHintCallback(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,\n                        SDL_JoystickAllowBackgroundEventsChanged, NULL);\n\n#if !SDL_EVENTS_DISABLED\n    if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0) {\n        return -1;\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n\n    status = SDL_SYS_JoystickInit();\n    if (status >= 0) {\n        status = 0;\n    }\n    return (status);\n}\n\n/*\n * Count the number of joysticks attached to the system\n */\nint\nSDL_NumJoysticks(void)\n{\n    return SDL_SYS_NumJoysticks();\n}\n\n/*\n * Get the implementation dependent name of a joystick\n */\nconst char *\nSDL_JoystickNameForIndex(int device_index)\n{\n    if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) {\n        SDL_SetError(\"There are %d joysticks available\", SDL_NumJoysticks());\n        return (NULL);\n    }\n    return (SDL_SYS_JoystickNameForDeviceIndex(device_index));\n}\n\n/*\n * Open a joystick for use - the index passed as an argument refers to\n * the N'th joystick on the system.  This index is the value which will\n * identify this joystick in future joystick events.\n *\n * This function returns a joystick identifier, or NULL if an error occurred.\n */\nSDL_Joystick *\nSDL_JoystickOpen(int device_index)\n{\n    SDL_Joystick *joystick;\n    SDL_Joystick *joysticklist;\n    const char *joystickname = NULL;\n\n    if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) {\n        SDL_SetError(\"There are %d joysticks available\", SDL_NumJoysticks());\n        return (NULL);\n    }\n\n    joysticklist = SDL_joysticks;\n    /* If the joystick is already open, return it\n    * it is important that we have a single joystick * for each instance id\n    */\n    while (joysticklist) {\n        if (SDL_SYS_GetInstanceIdOfDeviceIndex(device_index) == joysticklist->instance_id) {\n                joystick = joysticklist;\n                ++joystick->ref_count;\n                return (joystick);\n        }\n        joysticklist = joysticklist->next;\n    }\n\n    /* Create and initialize the joystick */\n    joystick = (SDL_Joystick *) SDL_malloc((sizeof *joystick));\n    if (joystick == NULL) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    SDL_memset(joystick, 0, (sizeof *joystick));\n    if (SDL_SYS_JoystickOpen(joystick, device_index) < 0) {\n        SDL_free(joystick);\n        return NULL;\n    }\n\n    joystickname = SDL_SYS_JoystickNameForDeviceIndex(device_index);\n    if (joystickname)\n        joystick->name = SDL_strdup(joystickname);\n    else\n        joystick->name = NULL;\n\n    if (joystick->naxes > 0) {\n        joystick->axes = (Sint16 *) SDL_malloc(joystick->naxes * sizeof(Sint16));\n        joystick->axes_zero = (Sint16 *) SDL_malloc(joystick->naxes * sizeof(Sint16));\n    }\n    if (joystick->nhats > 0) {\n        joystick->hats = (Uint8 *) SDL_malloc\n            (joystick->nhats * sizeof(Uint8));\n    }\n    if (joystick->nballs > 0) {\n        joystick->balls = (struct balldelta *) SDL_malloc\n            (joystick->nballs * sizeof(*joystick->balls));\n    }\n    if (joystick->nbuttons > 0) {\n        joystick->buttons = (Uint8 *) SDL_malloc\n            (joystick->nbuttons * sizeof(Uint8));\n    }\n    if (((joystick->naxes > 0) && !joystick->axes)\n        || ((joystick->nhats > 0) && !joystick->hats)\n        || ((joystick->nballs > 0) && !joystick->balls)\n        || ((joystick->nbuttons > 0) && !joystick->buttons)) {\n        SDL_OutOfMemory();\n        SDL_JoystickClose(joystick);\n        return NULL;\n    }\n    if (joystick->axes) {\n        SDL_memset(joystick->axes, 0, joystick->naxes * sizeof(Sint16));\n        SDL_memset(joystick->axes_zero, 0, joystick->naxes * sizeof(Sint16));\n    }\n    if (joystick->hats) {\n        SDL_memset(joystick->hats, 0, joystick->nhats * sizeof(Uint8));\n    }\n    if (joystick->balls) {\n        SDL_memset(joystick->balls, 0,\n            joystick->nballs * sizeof(*joystick->balls));\n    }\n    if (joystick->buttons) {\n        SDL_memset(joystick->buttons, 0, joystick->nbuttons * sizeof(Uint8));\n    }\n    joystick->epowerlevel = SDL_JOYSTICK_POWER_UNKNOWN;\n\n    /* Add joystick to list */\n    ++joystick->ref_count;\n    /* Link the joystick in the list */\n    joystick->next = SDL_joysticks;\n    SDL_joysticks = joystick;\n\n    SDL_SYS_JoystickUpdate(joystick);\n\n    return (joystick);\n}\n\n\n/*\n * Checks to make sure the joystick is valid.\n */\nint\nSDL_PrivateJoystickValid(SDL_Joystick * joystick)\n{\n    int valid;\n\n    if (joystick == NULL) {\n        SDL_SetError(\"Joystick hasn't been opened yet\");\n        valid = 0;\n    } else {\n        valid = 1;\n    }\n\n    return valid;\n}\n\n/*\n * Get the number of multi-dimensional axis controls on a joystick\n */\nint\nSDL_JoystickNumAxes(SDL_Joystick * joystick)\n{\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (-1);\n    }\n    return (joystick->naxes);\n}\n\n/*\n * Get the number of hats on a joystick\n */\nint\nSDL_JoystickNumHats(SDL_Joystick * joystick)\n{\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (-1);\n    }\n    return (joystick->nhats);\n}\n\n/*\n * Get the number of trackballs on a joystick\n */\nint\nSDL_JoystickNumBalls(SDL_Joystick * joystick)\n{\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (-1);\n    }\n    return (joystick->nballs);\n}\n\n/*\n * Get the number of buttons on a joystick\n */\nint\nSDL_JoystickNumButtons(SDL_Joystick * joystick)\n{\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (-1);\n    }\n    return (joystick->nbuttons);\n}\n\n/*\n * Get the current state of an axis control on a joystick\n */\nSint16\nSDL_JoystickGetAxis(SDL_Joystick * joystick, int axis)\n{\n    Sint16 state;\n\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (0);\n    }\n    if (axis < joystick->naxes) {\n        state = joystick->axes[axis];\n    } else {\n        SDL_SetError(\"Joystick only has %d axes\", joystick->naxes);\n        state = 0;\n    }\n    return (state);\n}\n\n/*\n * Get the current state of a hat on a joystick\n */\nUint8\nSDL_JoystickGetHat(SDL_Joystick * joystick, int hat)\n{\n    Uint8 state;\n\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (0);\n    }\n    if (hat < joystick->nhats) {\n        state = joystick->hats[hat];\n    } else {\n        SDL_SetError(\"Joystick only has %d hats\", joystick->nhats);\n        state = 0;\n    }\n    return (state);\n}\n\n/*\n * Get the ball axis change since the last poll\n */\nint\nSDL_JoystickGetBall(SDL_Joystick * joystick, int ball, int *dx, int *dy)\n{\n    int retval;\n\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (-1);\n    }\n\n    retval = 0;\n    if (ball < joystick->nballs) {\n        if (dx) {\n            *dx = joystick->balls[ball].dx;\n        }\n        if (dy) {\n            *dy = joystick->balls[ball].dy;\n        }\n        joystick->balls[ball].dx = 0;\n        joystick->balls[ball].dy = 0;\n    } else {\n        return SDL_SetError(\"Joystick only has %d balls\", joystick->nballs);\n    }\n    return (retval);\n}\n\n/*\n * Get the current state of a button on a joystick\n */\nUint8\nSDL_JoystickGetButton(SDL_Joystick * joystick, int button)\n{\n    Uint8 state;\n\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (0);\n    }\n    if (button < joystick->nbuttons) {\n        state = joystick->buttons[button];\n    } else {\n        SDL_SetError(\"Joystick only has %d buttons\", joystick->nbuttons);\n        state = 0;\n    }\n    return (state);\n}\n\n/*\n * Return if the joystick in question is currently attached to the system,\n *  \\return SDL_FALSE if not plugged in, SDL_TRUE if still present.\n */\nSDL_bool\nSDL_JoystickGetAttached(SDL_Joystick * joystick)\n{\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return SDL_FALSE;\n    }\n\n    return SDL_SYS_JoystickAttached(joystick);\n}\n\n/*\n * Get the instance id for this opened joystick\n */\nSDL_JoystickID\nSDL_JoystickInstanceID(SDL_Joystick * joystick)\n{\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (-1);\n    }\n\n    return (joystick->instance_id);\n}\n\n/*\n * Find the SDL_Joystick that owns this instance id\n */\nSDL_Joystick *\nSDL_JoystickFromInstanceID(SDL_JoystickID joyid)\n{\n    SDL_Joystick *joystick = SDL_joysticks;\n    while (joystick) {\n        if (joystick->instance_id == joyid) {\n            return joystick;\n        }\n        joystick = joystick->next;\n    }\n\n    return NULL;\n}\n\n/*\n * Get the friendly name of this joystick\n */\nconst char *\nSDL_JoystickName(SDL_Joystick * joystick)\n{\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (NULL);\n    }\n\n    return (joystick->name);\n}\n\n/*\n * Close a joystick previously opened with SDL_JoystickOpen()\n */\nvoid\nSDL_JoystickClose(SDL_Joystick * joystick)\n{\n    SDL_Joystick *joysticklist;\n    SDL_Joystick *joysticklistprev;\n\n    if (!joystick) {\n        return;\n    }\n\n    /* First decrement ref count */\n    if (--joystick->ref_count > 0) {\n        return;\n    }\n\n    if (joystick == SDL_updating_joystick) {\n        return;\n    }\n\n    SDL_SYS_JoystickClose(joystick);\n    joystick->hwdata = NULL;\n\n    joysticklist = SDL_joysticks;\n    joysticklistprev = NULL;\n    while (joysticklist) {\n        if (joystick == joysticklist) {\n            if (joysticklistprev) {\n                /* unlink this entry */\n                joysticklistprev->next = joysticklist->next;\n            } else {\n                SDL_joysticks = joystick->next;\n            }\n            break;\n        }\n        joysticklistprev = joysticklist;\n        joysticklist = joysticklist->next;\n    }\n\n    SDL_free(joystick->name);\n\n    /* Free the data associated with this joystick */\n    SDL_free(joystick->axes);\n    SDL_free(joystick->hats);\n    SDL_free(joystick->balls);\n    SDL_free(joystick->buttons);\n    SDL_free(joystick);\n}\n\nvoid\nSDL_JoystickQuit(void)\n{\n    /* Make sure we're not getting called in the middle of updating joysticks */\n    SDL_assert(!SDL_updating_joystick);\n\n    /* Stop the event polling */\n    while (SDL_joysticks) {\n        SDL_joysticks->ref_count = 1;\n        SDL_JoystickClose(SDL_joysticks);\n    }\n\n    /* Quit the joystick setup */\n    SDL_SYS_JoystickQuit();\n\n#if !SDL_EVENTS_DISABLED\n    SDL_QuitSubSystem(SDL_INIT_EVENTS);\n#endif\n}\n\n\nstatic SDL_bool\nSDL_PrivateJoystickShouldIgnoreEvent()\n{\n    if (SDL_joystick_allows_background_events) {\n        return SDL_FALSE;\n    }\n\n    if (SDL_WasInit(SDL_INIT_VIDEO)) {\n        if (SDL_GetKeyboardFocus() == NULL) {\n            /* Video is initialized and we don't have focus, ignore the event. */\n            return SDL_TRUE;\n        } else {\n            return SDL_FALSE;\n        }\n    }\n\n    /* Video subsystem wasn't initialized, always allow the event */\n    return SDL_FALSE;\n}\n\n/* These are global for SDL_sysjoystick.c and SDL_events.c */\n\nvoid SDL_PrivateJoystickAdded(int device_index)\n{\n#if !SDL_EVENTS_DISABLED\n    SDL_Event event;\n\n    event.type = SDL_JOYDEVICEADDED;\n\n    if (SDL_GetEventState(event.type) == SDL_ENABLE) {\n        event.jdevice.which = device_index;\n        if ( (SDL_EventOK == NULL) ||\n             (*SDL_EventOK) (SDL_EventOKParam, &event) ) {\n            SDL_PushEvent(&event);\n        }\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n}\n\n/*\n * If there is an existing add event in the queue, it needs to be modified\n * to have the right value for which, because the number of controllers in\n * the system is now one less.\n */\nstatic void UpdateEventsForDeviceRemoval()\n{\n    int i, num_events;\n    SDL_Event *events;\n\n    num_events = SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, SDL_JOYDEVICEADDED, SDL_JOYDEVICEADDED);\n    if (num_events <= 0) {\n        return;\n    }\n\n    events = SDL_stack_alloc(SDL_Event, num_events);\n    if (!events) {\n        return;\n    }\n\n    num_events = SDL_PeepEvents(events, num_events, SDL_GETEVENT, SDL_JOYDEVICEADDED, SDL_JOYDEVICEADDED);\n    for (i = 0; i < num_events; ++i) {\n        --events[i].jdevice.which;\n    }\n    SDL_PeepEvents(events, num_events, SDL_ADDEVENT, 0, 0);\n\n    SDL_stack_free(events);\n}\n\nvoid SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance)\n{\n#if !SDL_EVENTS_DISABLED\n    SDL_Event event;\n\n    event.type = SDL_JOYDEVICEREMOVED;\n\n    if (SDL_GetEventState(event.type) == SDL_ENABLE) {\n        event.jdevice.which = device_instance;\n        if ( (SDL_EventOK == NULL) ||\n             (*SDL_EventOK) (SDL_EventOKParam, &event) ) {\n            SDL_PushEvent(&event);\n        }\n    }\n\n    UpdateEventsForDeviceRemoval();\n#endif /* !SDL_EVENTS_DISABLED */\n}\n\nint\nSDL_PrivateJoystickAxis(SDL_Joystick * joystick, Uint8 axis, Sint16 value)\n{\n    int posted;\n\n    /* Make sure we're not getting garbage or duplicate events */\n    if (axis >= joystick->naxes) {\n        return 0;\n    }\n    if (value == joystick->axes[axis]) {\n        return 0;\n    }\n\n    /* We ignore events if we don't have keyboard focus, except for centering\n     * events.\n     */\n    if (SDL_PrivateJoystickShouldIgnoreEvent()) {\n        if ((value > joystick->axes_zero[axis] && value >= joystick->axes[axis]) ||\n            (value < joystick->axes_zero[axis] && value <= joystick->axes[axis])) {\n            return 0;\n        }\n    }\n\n    /* Update internal joystick state */\n    joystick->axes[axis] = value;\n\n    /* Post the event, if desired */\n    posted = 0;\n#if !SDL_EVENTS_DISABLED\n    if (SDL_GetEventState(SDL_JOYAXISMOTION) == SDL_ENABLE) {\n        SDL_Event event;\n        event.type = SDL_JOYAXISMOTION;\n        event.jaxis.which = joystick->instance_id;\n        event.jaxis.axis = axis;\n        event.jaxis.value = value;\n        posted = SDL_PushEvent(&event) == 1;\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n    return (posted);\n}\n\nint\nSDL_PrivateJoystickHat(SDL_Joystick * joystick, Uint8 hat, Uint8 value)\n{\n    int posted;\n\n    /* Make sure we're not getting garbage or duplicate events */\n    if (hat >= joystick->nhats) {\n        return 0;\n    }\n    if (value == joystick->hats[hat]) {\n        return 0;\n    }\n\n    /* We ignore events if we don't have keyboard focus, except for centering\n     * events.\n     */\n    if (SDL_PrivateJoystickShouldIgnoreEvent()) {\n        if (value != SDL_HAT_CENTERED) {\n            return 0;\n        }\n    }\n\n    /* Update internal joystick state */\n    joystick->hats[hat] = value;\n\n    /* Post the event, if desired */\n    posted = 0;\n#if !SDL_EVENTS_DISABLED\n    if (SDL_GetEventState(SDL_JOYHATMOTION) == SDL_ENABLE) {\n        SDL_Event event;\n        event.jhat.type = SDL_JOYHATMOTION;\n        event.jhat.which = joystick->instance_id;\n        event.jhat.hat = hat;\n        event.jhat.value = value;\n        posted = SDL_PushEvent(&event) == 1;\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n    return (posted);\n}\n\nint\nSDL_PrivateJoystickBall(SDL_Joystick * joystick, Uint8 ball,\n                        Sint16 xrel, Sint16 yrel)\n{\n    int posted;\n\n    /* Make sure we're not getting garbage events */\n    if (ball >= joystick->nballs) {\n        return 0;\n    }\n\n    /* We ignore events if we don't have keyboard focus. */\n    if (SDL_PrivateJoystickShouldIgnoreEvent()) {\n        return 0;\n    }\n\n    /* Update internal mouse state */\n    joystick->balls[ball].dx += xrel;\n    joystick->balls[ball].dy += yrel;\n\n    /* Post the event, if desired */\n    posted = 0;\n#if !SDL_EVENTS_DISABLED\n    if (SDL_GetEventState(SDL_JOYBALLMOTION) == SDL_ENABLE) {\n        SDL_Event event;\n        event.jball.type = SDL_JOYBALLMOTION;\n        event.jball.which = joystick->instance_id;\n        event.jball.ball = ball;\n        event.jball.xrel = xrel;\n        event.jball.yrel = yrel;\n        posted = SDL_PushEvent(&event) == 1;\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n    return (posted);\n}\n\nint\nSDL_PrivateJoystickButton(SDL_Joystick * joystick, Uint8 button, Uint8 state)\n{\n    int posted;\n#if !SDL_EVENTS_DISABLED\n    SDL_Event event;\n\n    switch (state) {\n    case SDL_PRESSED:\n        event.type = SDL_JOYBUTTONDOWN;\n        break;\n    case SDL_RELEASED:\n        event.type = SDL_JOYBUTTONUP;\n        break;\n    default:\n        /* Invalid state -- bail */\n        return (0);\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n\n    /* Make sure we're not getting garbage or duplicate events */\n    if (button >= joystick->nbuttons) {\n        return 0;\n    }\n    if (state == joystick->buttons[button]) {\n        return 0;\n    }\n\n    /* We ignore events if we don't have keyboard focus, except for button\n     * release. */\n    if (SDL_PrivateJoystickShouldIgnoreEvent()) {\n        if (state == SDL_PRESSED) {\n            return 0;\n        }\n    }\n\n    /* Update internal joystick state */\n    joystick->buttons[button] = state;\n\n    /* Post the event, if desired */\n    posted = 0;\n#if !SDL_EVENTS_DISABLED\n    if (SDL_GetEventState(event.type) == SDL_ENABLE) {\n        event.jbutton.which = joystick->instance_id;\n        event.jbutton.button = button;\n        event.jbutton.state = state;\n        posted = SDL_PushEvent(&event) == 1;\n    }\n#endif /* !SDL_EVENTS_DISABLED */\n    return (posted);\n}\n\nvoid\nSDL_JoystickUpdate(void)\n{\n    SDL_Joystick *joystick;\n\n    joystick = SDL_joysticks;\n    while (joystick) {\n        SDL_Joystick *joysticknext;\n        /* save off the next pointer, the Update call may cause a joystick removed event\n         * and cause our joystick pointer to be freed\n         */\n        joysticknext = joystick->next;\n\n        SDL_updating_joystick = joystick;\n\n        SDL_SYS_JoystickUpdate(joystick);\n\n        if (joystick->force_recentering) {\n            int i;\n\n            /* Tell the app that everything is centered/unpressed...  */\n            for (i = 0; i < joystick->naxes; i++) {\n                SDL_PrivateJoystickAxis(joystick, i, joystick->axes_zero[i]);\n            }\n\n            for (i = 0; i < joystick->nbuttons; i++) {\n                SDL_PrivateJoystickButton(joystick, i, 0);\n            }\n\n            for (i = 0; i < joystick->nhats; i++) {\n                SDL_PrivateJoystickHat(joystick, i, SDL_HAT_CENTERED);\n            }\n\n            joystick->force_recentering = SDL_FALSE;\n        }\n\n        SDL_updating_joystick = NULL;\n\n        /* If the joystick was closed while updating, free it here */\n        if (joystick->ref_count <= 0) {\n            SDL_JoystickClose(joystick);\n        }\n\n        joystick = joysticknext;\n    }\n\n    /* this needs to happen AFTER walking the joystick list above, so that any\n       dangling hardware data from removed devices can be free'd\n     */\n    SDL_SYS_JoystickDetect();\n}\n\nint\nSDL_JoystickEventState(int state)\n{\n#if SDL_EVENTS_DISABLED\n    return SDL_DISABLE;\n#else\n    const Uint32 event_list[] = {\n        SDL_JOYAXISMOTION, SDL_JOYBALLMOTION, SDL_JOYHATMOTION,\n        SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP, SDL_JOYDEVICEADDED, SDL_JOYDEVICEREMOVED\n    };\n    unsigned int i;\n\n    switch (state) {\n    case SDL_QUERY:\n        state = SDL_DISABLE;\n        for (i = 0; i < SDL_arraysize(event_list); ++i) {\n            state = SDL_EventState(event_list[i], SDL_QUERY);\n            if (state == SDL_ENABLE) {\n                break;\n            }\n        }\n        break;\n    default:\n        for (i = 0; i < SDL_arraysize(event_list); ++i) {\n            SDL_EventState(event_list[i], state);\n        }\n        break;\n    }\n    return (state);\n#endif /* SDL_EVENTS_DISABLED */\n}\n\n/* return the guid for this index */\nSDL_JoystickGUID SDL_JoystickGetDeviceGUID(int device_index)\n{\n    if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) {\n        SDL_JoystickGUID emptyGUID;\n        SDL_SetError(\"There are %d joysticks available\", SDL_NumJoysticks());\n        SDL_zero(emptyGUID);\n        return emptyGUID;\n    }\n    return SDL_SYS_JoystickGetDeviceGUID(device_index);\n}\n\n/* return the guid for this opened device */\nSDL_JoystickGUID SDL_JoystickGetGUID(SDL_Joystick * joystick)\n{\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        SDL_JoystickGUID emptyGUID;\n        SDL_zero(emptyGUID);\n        return emptyGUID;\n    }\n    return SDL_SYS_JoystickGetGUID(joystick);\n}\n\n/* convert the guid to a printable string */\nvoid SDL_JoystickGetGUIDString(SDL_JoystickGUID guid, char *pszGUID, int cbGUID)\n{\n    static const char k_rgchHexToASCII[] = \"0123456789abcdef\";\n    int i;\n\n    if ((pszGUID == NULL) || (cbGUID <= 0)) {\n        return;\n    }\n\n    for (i = 0; i < sizeof(guid.data) && i < (cbGUID-1)/2; i++) {\n        /* each input byte writes 2 ascii chars, and might write a null byte. */\n        /* If we don't have room for next input byte, stop */\n        unsigned char c = guid.data[i];\n\n        *pszGUID++ = k_rgchHexToASCII[c >> 4];\n        *pszGUID++ = k_rgchHexToASCII[c & 0x0F];\n    }\n    *pszGUID = '\\0';\n}\n\n\n/*-----------------------------------------------------------------------------\n * Purpose: Returns the 4 bit nibble for a hex character\n * Input  : c -\n * Output : unsigned char\n *-----------------------------------------------------------------------------*/\nstatic unsigned char nibble(char c)\n{\n    if ((c >= '0') && (c <= '9')) {\n        return (unsigned char)(c - '0');\n    }\n\n    if ((c >= 'A') && (c <= 'F')) {\n        return (unsigned char)(c - 'A' + 0x0a);\n    }\n\n    if ((c >= 'a') && (c <= 'f')) {\n        return (unsigned char)(c - 'a' + 0x0a);\n    }\n\n    /* received an invalid character, and no real way to return an error */\n    /* AssertMsg1(false, \"Q_nibble invalid hex character '%c' \", c); */\n    return 0;\n}\n\n\n/* convert the string version of a joystick guid to the struct */\nSDL_JoystickGUID SDL_JoystickGetGUIDFromString(const char *pchGUID)\n{\n    SDL_JoystickGUID guid;\n    int maxoutputbytes= sizeof(guid);\n    size_t len = SDL_strlen(pchGUID);\n    Uint8 *p;\n    size_t i;\n\n    /* Make sure it's even */\n    len = (len) & ~0x1;\n\n    SDL_memset(&guid, 0x00, sizeof(guid));\n\n    p = (Uint8 *)&guid;\n    for (i = 0; (i < len) && ((p - (Uint8 *)&guid) < maxoutputbytes); i+=2, p++) {\n        *p = (nibble(pchGUID[i]) << 4) | nibble(pchGUID[i+1]);\n    }\n\n    return guid;\n}\n\n\n/* update the power level for this joystick */\nvoid SDL_PrivateJoystickBatteryLevel(SDL_Joystick * joystick, SDL_JoystickPowerLevel ePowerLevel)\n{\n    joystick->epowerlevel = ePowerLevel;\n}\n\n\n/* return its power level */\nSDL_JoystickPowerLevel SDL_JoystickCurrentPowerLevel(SDL_Joystick * joystick)\n{\n    if (!SDL_PrivateJoystickValid(joystick)) {\n        return (SDL_JOYSTICK_POWER_UNKNOWN);\n    }\n    return joystick->epowerlevel;\n}\n\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/joystick/SDL_joystick_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Useful functions and variables from SDL_joystick.c */\n#include \"SDL_joystick.h\"\n\n/* Initialization and shutdown functions */\nextern int SDL_JoystickInit(void);\nextern void SDL_JoystickQuit(void);\n\n/* Initialization and shutdown functions */\nextern int SDL_GameControllerInit(void);\nextern void SDL_GameControllerQuit(void);\n\n\n/* Internal event queueing functions */\nextern void SDL_PrivateJoystickAdded(int device_index);\nextern void SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance);\nextern int SDL_PrivateJoystickAxis(SDL_Joystick * joystick,\n                                   Uint8 axis, Sint16 value);\nextern int SDL_PrivateJoystickBall(SDL_Joystick * joystick,\n                                   Uint8 ball, Sint16 xrel, Sint16 yrel);\nextern int SDL_PrivateJoystickHat(SDL_Joystick * joystick,\n                                  Uint8 hat, Uint8 value);\nextern int SDL_PrivateJoystickButton(SDL_Joystick * joystick,\n                                     Uint8 button, Uint8 state);\nextern void SDL_PrivateJoystickBatteryLevel(SDL_Joystick * joystick,\n                                            SDL_JoystickPowerLevel ePowerLevel);\n\n/* Internal sanity checking functions */\nextern int SDL_PrivateJoystickValid(SDL_Joystick * joystick);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/joystick/SDL_sysjoystick.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_sysjoystick_h\n#define _SDL_sysjoystick_h\n\n/* This is the system specific header for the SDL joystick API */\n\n#include \"SDL_joystick.h\"\n#include \"SDL_joystick_c.h\"\n\n/* The SDL joystick structure */\nstruct _SDL_Joystick\n{\n    SDL_JoystickID instance_id; /* Device instance, monotonically increasing from 0 */\n    char *name;                 /* Joystick name - system dependent */\n\n    int naxes;                  /* Number of axis controls on the joystick */\n    Sint16 *axes;               /* Current axis states */\n    Sint16 *axes_zero;          /* Zero point on the axis (-32768 for triggers) */\n\n    int nhats;                  /* Number of hats on the joystick */\n    Uint8 *hats;                /* Current hat states */\n\n    int nballs;                 /* Number of trackballs on the joystick */\n    struct balldelta {\n        int dx;\n        int dy;\n    } *balls;                   /* Current ball motion deltas */\n\n    int nbuttons;               /* Number of buttons on the joystick */\n    Uint8 *buttons;             /* Current button states */\n\n    struct joystick_hwdata *hwdata;     /* Driver dependent information */\n\n    int ref_count;              /* Reference count for multiple opens */\n\n    SDL_bool force_recentering; /* SDL_TRUE if this device needs to have its state reset to 0 */\n    SDL_JoystickPowerLevel epowerlevel; /* power level of this joystick, SDL_JOYSTICK_POWER_UNKNOWN if not supported */\n    struct _SDL_Joystick *next; /* pointer to next joystick we have allocated */\n};\n\n/* Function to scan the system for joysticks.\n * Joystick 0 should be the system default joystick.\n * This function should return the number of available joysticks, or -1\n * on an unrecoverable fatal error.\n */\nextern int SDL_SYS_JoystickInit(void);\n\n/* Function to return the number of joystick devices plugged in right now */\nextern int SDL_SYS_NumJoysticks();\n\n/* Function to cause any queued joystick insertions to be processed */\nextern void SDL_SYS_JoystickDetect();\n\n/* Function to get the device-dependent name of a joystick */\nextern const char *SDL_SYS_JoystickNameForDeviceIndex(int device_index);\n\n/* Function to get the current instance id of the joystick located at device_index */\nextern SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index);\n\n/* Function to open a joystick for use.\n   The joystick to open is specified by the device index.\n   This should fill the nbuttons and naxes fields of the joystick structure.\n   It returns 0, or -1 if there is an error.\n */\nextern int SDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index);\n\n/* Function to query if the joystick is currently attached\n * It returns SDL_TRUE if attached, SDL_FALSE otherwise.\n */\nextern SDL_bool SDL_SYS_JoystickAttached(SDL_Joystick * joystick);\n\n/* Function to update the state of a joystick - called as a device poll.\n * This function shouldn't update the joystick structure directly,\n * but instead should call SDL_PrivateJoystick*() to deliver events\n * and update joystick device state.\n */\nextern void SDL_SYS_JoystickUpdate(SDL_Joystick * joystick);\n\n/* Function to close a joystick after use */\nextern void SDL_SYS_JoystickClose(SDL_Joystick * joystick);\n\n/* Function to perform any system-specific joystick related cleanup */\nextern void SDL_SYS_JoystickQuit(void);\n\n/* Function to return the stable GUID for a plugged in device */\nextern SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID(int device_index);\n\n/* Function to return the stable GUID for a opened joystick */\nextern SDL_JoystickGUID SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick);\n\n#if SDL_JOYSTICK_XINPUT\n/* Function returns SDL_TRUE if this device is an XInput gamepad */\nextern SDL_bool SDL_SYS_IsXInputGamepad_DeviceIndex(int device_index);\n#endif\n\n#endif /* _SDL_sysjoystick_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/joystick/android/SDL_sysjoystick.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"../../SDL_internal.h\"\n\n#ifdef SDL_JOYSTICK_ANDROID\n\n#include <stdio.h>              /* For the definition of NULL */\n#include \"SDL_error.h\"\n#include \"SDL_events.h\"\n\n#include \"SDL_joystick.h\"\n#include \"SDL_hints.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_timer.h\"\n#include \"SDL_log.h\"\n#include \"SDL_sysjoystick_c.h\"\n#include \"../SDL_joystick_c.h\"\n#include \"../../core/android/SDL_android.h\"\n\n#include \"android/keycodes.h\"\n\n/* As of platform android-14, android/keycodes.h is missing these defines */\n#ifndef AKEYCODE_BUTTON_1\n#define AKEYCODE_BUTTON_1 188\n#define AKEYCODE_BUTTON_2 189\n#define AKEYCODE_BUTTON_3 190\n#define AKEYCODE_BUTTON_4 191\n#define AKEYCODE_BUTTON_5 192\n#define AKEYCODE_BUTTON_6 193\n#define AKEYCODE_BUTTON_7 194\n#define AKEYCODE_BUTTON_8 195\n#define AKEYCODE_BUTTON_9 196\n#define AKEYCODE_BUTTON_10 197\n#define AKEYCODE_BUTTON_11 198\n#define AKEYCODE_BUTTON_12 199\n#define AKEYCODE_BUTTON_13 200\n#define AKEYCODE_BUTTON_14 201\n#define AKEYCODE_BUTTON_15 202\n#define AKEYCODE_BUTTON_16 203\n#endif\n\n#define ANDROID_ACCELEROMETER_NAME \"Android Accelerometer\"\n#define ANDROID_ACCELEROMETER_DEVICE_ID INT_MIN\n#define ANDROID_MAX_NBUTTONS 36\n\nstatic SDL_joylist_item * JoystickByDeviceId(int device_id);\n\nstatic SDL_joylist_item *SDL_joylist = NULL;\nstatic SDL_joylist_item *SDL_joylist_tail = NULL;\nstatic int numjoysticks = 0;\nstatic int instance_counter = 0;\n\n\n/* Function to convert Android keyCodes into SDL ones.\n * This code manipulation is done to get a sequential list of codes.\n * FIXME: This is only suited for the case where we use a fixed number of buttons determined by ANDROID_MAX_NBUTTONS\n */\nstatic int\nkeycode_to_SDL(int keycode)\n{\n    /* FIXME: If this function gets too unwiedly in the future, replace with a lookup table */\n    int button = 0;\n    switch(keycode) \n    {\n        /* Some gamepad buttons (API 9) */\n        case AKEYCODE_BUTTON_A:\n            button = SDL_CONTROLLER_BUTTON_A;\n            break;\n        case AKEYCODE_BUTTON_B:\n            button = SDL_CONTROLLER_BUTTON_B;\n            break;\n        case AKEYCODE_BUTTON_X:\n            button = SDL_CONTROLLER_BUTTON_X;\n            break;\n        case AKEYCODE_BUTTON_Y:\n            button = SDL_CONTROLLER_BUTTON_Y;\n            break;\n        case AKEYCODE_BUTTON_L1:\n            button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER;\n            break;\n        case AKEYCODE_BUTTON_R1:\n            button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER;\n            break;\n        case AKEYCODE_BUTTON_THUMBL:\n            button = SDL_CONTROLLER_BUTTON_LEFTSTICK;\n            break;\n        case AKEYCODE_BUTTON_THUMBR:\n            button = SDL_CONTROLLER_BUTTON_RIGHTSTICK;\n            break;\n        case AKEYCODE_BUTTON_START:\n            button = SDL_CONTROLLER_BUTTON_START;\n            break;\n        case AKEYCODE_BUTTON_SELECT:\n            button = SDL_CONTROLLER_BUTTON_BACK;\n            break;\n        case AKEYCODE_BUTTON_MODE:\n            button = SDL_CONTROLLER_BUTTON_GUIDE;\n            break;\n        case AKEYCODE_BUTTON_L2:\n            button = SDL_CONTROLLER_BUTTON_MAX; /* Not supported by GameController */\n            break;\n        case AKEYCODE_BUTTON_R2:\n            button = SDL_CONTROLLER_BUTTON_MAX+1; /* Not supported by GameController */\n            break;\n        case AKEYCODE_BUTTON_C:\n            button = SDL_CONTROLLER_BUTTON_MAX+2; /* Not supported by GameController */\n            break;\n        case AKEYCODE_BUTTON_Z:\n            button = SDL_CONTROLLER_BUTTON_MAX+3; /* Not supported by GameController */\n            break;\n                        \n        /* D-Pad key codes (API 1) */\n        case AKEYCODE_DPAD_UP:\n            button = SDL_CONTROLLER_BUTTON_DPAD_UP;\n            break;\n        case AKEYCODE_DPAD_DOWN:\n            button = SDL_CONTROLLER_BUTTON_DPAD_DOWN;\n            break;\n        case AKEYCODE_DPAD_LEFT:\n            button = SDL_CONTROLLER_BUTTON_DPAD_LEFT;\n            break;\n        case AKEYCODE_DPAD_RIGHT:\n            button = SDL_CONTROLLER_BUTTON_DPAD_RIGHT;\n            break;\n        case AKEYCODE_DPAD_CENTER:\n            button = SDL_CONTROLLER_BUTTON_MAX+4; /* Not supported by GameController */\n            break;\n\n        /* More gamepad buttons (API 12), these get mapped to 20...35*/\n        case AKEYCODE_BUTTON_1:\n        case AKEYCODE_BUTTON_2:\n        case AKEYCODE_BUTTON_3:\n        case AKEYCODE_BUTTON_4:\n        case AKEYCODE_BUTTON_5:\n        case AKEYCODE_BUTTON_6:\n        case AKEYCODE_BUTTON_7:\n        case AKEYCODE_BUTTON_8:\n        case AKEYCODE_BUTTON_9:\n        case AKEYCODE_BUTTON_10:\n        case AKEYCODE_BUTTON_11:\n        case AKEYCODE_BUTTON_12:\n        case AKEYCODE_BUTTON_13:\n        case AKEYCODE_BUTTON_14:\n        case AKEYCODE_BUTTON_15:\n        case AKEYCODE_BUTTON_16:\n            button = keycode - AKEYCODE_BUTTON_1 + SDL_CONTROLLER_BUTTON_MAX + 5;\n            break;\n            \n        default:\n            return -1;\n            break;\n    }\n    \n    /* This is here in case future generations, probably with six fingers per hand, \n     * happily add new cases up above and forget to update the max number of buttons. \n     */\n    SDL_assert(button < ANDROID_MAX_NBUTTONS);\n    return button;\n    \n}\n\nint\nAndroid_OnPadDown(int device_id, int keycode)\n{\n    SDL_joylist_item *item;\n    int button = keycode_to_SDL(keycode);\n    if (button >= 0) {\n        item = JoystickByDeviceId(device_id);\n        if (item && item->joystick) {\n            SDL_PrivateJoystickButton(item->joystick, button , SDL_PRESSED);\n        }\n        return 0;\n    }\n    \n    return -1;\n}\n\nint\nAndroid_OnPadUp(int device_id, int keycode)\n{\n    SDL_joylist_item *item;\n    int button = keycode_to_SDL(keycode);\n    if (button >= 0) {\n        item = JoystickByDeviceId(device_id);\n        if (item && item->joystick) {\n            SDL_PrivateJoystickButton(item->joystick, button, SDL_RELEASED);\n        }\n        return 0;\n    }\n    \n    return -1;\n}\n\nint\nAndroid_OnJoy(int device_id, int axis, float value)\n{\n    /* Android gives joy info normalized as [-1.0, 1.0] or [0.0, 1.0] */\n    SDL_joylist_item *item = JoystickByDeviceId(device_id);\n    if (item && item->joystick) {\n        SDL_PrivateJoystickAxis(item->joystick, axis, (Sint16) (32767.*value) );\n    }\n    \n    return 0;\n}\n\nint\nAndroid_OnHat(int device_id, int hat_id, int x, int y)\n{\n    const Uint8 position_map[3][3] = {\n        {SDL_HAT_LEFTUP, SDL_HAT_UP, SDL_HAT_RIGHTUP},\n        {SDL_HAT_LEFT, SDL_HAT_CENTERED, SDL_HAT_RIGHT},\n        {SDL_HAT_LEFTDOWN, SDL_HAT_DOWN, SDL_HAT_RIGHTDOWN}\n    };\n\n    if (x >= -1 && x <=1 && y >= -1 && y <= 1) {\n        SDL_joylist_item *item = JoystickByDeviceId(device_id);\n        if (item && item->joystick) {\n            SDL_PrivateJoystickHat(item->joystick, hat_id, position_map[y+1][x+1] );\n        }\n        return 0;\n    }\n\n    return -1;\n}\n\n\nint\nAndroid_AddJoystick(int device_id, const char *name, SDL_bool is_accelerometer, int nbuttons, int naxes, int nhats, int nballs)\n{\n    SDL_JoystickGUID guid;\n    SDL_joylist_item *item;\n    \n    if(JoystickByDeviceId(device_id) != NULL || name == NULL) {\n        return -1;\n    }\n    \n    /* the GUID is just the first 16 chars of the name for now */\n    SDL_zero( guid );\n    SDL_memcpy( &guid, name, SDL_min( sizeof(guid), SDL_strlen( name ) ) );\n\n    item = (SDL_joylist_item *) SDL_malloc(sizeof (SDL_joylist_item));\n    if (item == NULL) {\n        return -1;\n    }\n\n    SDL_zerop(item);\n    item->guid = guid;\n    item->device_id = device_id;\n    item->name = SDL_strdup(name);\n    if ( item->name == NULL ) {\n         SDL_free(item);\n         return -1;\n    }\n    \n    item->is_accelerometer = is_accelerometer;\n    if (nbuttons > -1) {\n        item->nbuttons = nbuttons;\n    }\n    else {\n        item->nbuttons = ANDROID_MAX_NBUTTONS;\n    }\n    item->naxes = naxes;\n    item->nhats = nhats;\n    item->nballs = nballs;\n    item->device_instance = instance_counter++;\n    if (SDL_joylist_tail == NULL) {\n        SDL_joylist = SDL_joylist_tail = item;\n    } else {\n        SDL_joylist_tail->next = item;\n        SDL_joylist_tail = item;\n    }\n\n    /* Need to increment the joystick count before we post the event */\n    ++numjoysticks;\n\n    SDL_PrivateJoystickAdded(numjoysticks - 1);\n\n#ifdef DEBUG_JOYSTICK\n    SDL_Log(\"Added joystick %s with device_id %d\", name, device_id);\n#endif\n\n    return numjoysticks;\n}\n\nint \nAndroid_RemoveJoystick(int device_id)\n{\n    SDL_joylist_item *item = SDL_joylist;\n    SDL_joylist_item *prev = NULL;\n    \n    /* Don't call JoystickByDeviceId here or there'll be an infinite loop! */\n    while (item != NULL) {\n        if (item->device_id == device_id) {\n            break;\n        }\n        prev = item;\n        item = item->next;\n    }\n    \n    if (item == NULL) {\n        return -1;\n    }\n\n    if (item->joystick) {\n        item->joystick->hwdata = NULL;\n    }\n        \n    if (prev != NULL) {\n        prev->next = item->next;\n    } else {\n        SDL_assert(SDL_joylist == item);\n        SDL_joylist = item->next;\n    }\n    if (item == SDL_joylist_tail) {\n        SDL_joylist_tail = prev;\n    }\n\n    /* Need to decrement the joystick count before we post the event */\n    --numjoysticks;\n\n    SDL_PrivateJoystickRemoved(item->device_instance);\n\n#ifdef DEBUG_JOYSTICK\n    SDL_Log(\"Removed joystick with device_id %d\", device_id);\n#endif\n    \n    SDL_free(item->name);\n    SDL_free(item);\n    return numjoysticks;\n}\n\n\nint\nSDL_SYS_JoystickInit(void)\n{\n    SDL_SYS_JoystickDetect();\n    \n    if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_TRUE)) {\n        /* Default behavior, accelerometer as joystick */\n        Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME, SDL_TRUE, 0, 3, 0, 0);\n    }\n   \n    return (numjoysticks);\n\n}\n\nint SDL_SYS_NumJoysticks()\n{\n    return numjoysticks;\n}\n\nvoid SDL_SYS_JoystickDetect()\n{\n    /* Support for device connect/disconnect is API >= 16 only,\n     * so we poll every three seconds\n     * Ref: http://developer.android.com/reference/android/hardware/input/InputManager.InputDeviceListener.html\n     */\n    static Uint32 timeout = 0;\n    if (SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) {\n        timeout = SDL_GetTicks() + 3000;\n        Android_JNI_PollInputDevices();\n    }\n}\n\nstatic SDL_joylist_item *\nJoystickByDevIndex(int device_index)\n{\n    SDL_joylist_item *item = SDL_joylist;\n\n    if ((device_index < 0) || (device_index >= numjoysticks)) {\n        return NULL;\n    }\n\n    while (device_index > 0) {\n        SDL_assert(item != NULL);\n        device_index--;\n        item = item->next;\n    }\n\n    return item;\n}\n\nstatic SDL_joylist_item *\nJoystickByDeviceId(int device_id)\n{\n    SDL_joylist_item *item = SDL_joylist;\n\n    while (item != NULL) {\n        if (item->device_id == device_id) {\n            return item;\n        }\n        item = item->next;\n    }\n    \n    /* Joystick not found, try adding it */\n    SDL_SYS_JoystickDetect();\n    \n    while (item != NULL) {\n        if (item->device_id == device_id) {\n            return item;\n        }\n        item = item->next;\n    }\n\n    return NULL;\n}\n\n/* Function to get the device-dependent name of a joystick */\nconst char *\nSDL_SYS_JoystickNameForDeviceIndex(int device_index)\n{\n    return JoystickByDevIndex(device_index)->name;\n}\n\n/* Function to perform the mapping from device index to the instance id for this index */\nSDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)\n{\n    return JoystickByDevIndex(device_index)->device_instance;\n}\n\n/* Function to open a joystick for use.\n   The joystick to open is specified by the device index.\n   This should fill the nbuttons and naxes fields of the joystick structure.\n   It returns 0, or -1 if there is an error.\n */\nint\nSDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index)\n{\n    SDL_joylist_item *item = JoystickByDevIndex(device_index);\n\n    if (item == NULL ) {\n        return SDL_SetError(\"No such device\");\n    }\n    \n    if (item->joystick != NULL) {\n        return SDL_SetError(\"Joystick already opened\");\n    }\n\n    joystick->instance_id = item->device_instance;\n    joystick->hwdata = (struct joystick_hwdata *) item;\n    item->joystick = joystick;\n    joystick->nhats = item->nhats;\n    joystick->nballs = item->nballs;\n    joystick->nbuttons = item->nbuttons;\n    joystick->naxes = item->naxes;\n\n    return (0);\n}\n\n/* Function to determine if this joystick is attached to the system right now */\nSDL_bool SDL_SYS_JoystickAttached(SDL_Joystick *joystick)\n{\n    return joystick->hwdata != NULL;\n}\n\nvoid\nSDL_SYS_JoystickUpdate(SDL_Joystick * joystick)\n{\n    int i;\n    Sint16 value;\n    float values[3];\n    SDL_joylist_item *item = SDL_joylist;\n\n    while (item) {\n        if (item->is_accelerometer) {\n            if (item->joystick) {\n                if (Android_JNI_GetAccelerometerValues(values)) {\n                    for ( i = 0; i < 3; i++ ) {\n                        if (values[i] > 1.0f) {\n                            values[i] = 1.0f;\n                        } else if (values[i] < -1.0f) {\n                            values[i] = -1.0f;\n                        }\n\n                        value = (Sint16)(values[i] * 32767.0f);\n                        SDL_PrivateJoystickAxis(item->joystick, i, value);\n                    }\n                }\n            }\n            break;\n        }\n        item = item->next;\n    }\n}\n\n/* Function to close a joystick after use */\nvoid\nSDL_SYS_JoystickClose(SDL_Joystick * joystick)\n{\n    SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;\n    if (item) {\n        item->joystick = NULL;\n    }\n}\n\n/* Function to perform any system-specific joystick related cleanup */\nvoid\nSDL_SYS_JoystickQuit(void)\n{\n    SDL_joylist_item *item = NULL;\n    SDL_joylist_item *next = NULL;\n\n    for (item = SDL_joylist; item; item = next) {\n        next = item->next;\n        SDL_free(item->name);\n        SDL_free(item);\n    }\n\n    SDL_joylist = SDL_joylist_tail = NULL;\n\n    numjoysticks = 0;\n    instance_counter = 0;\n}\n\nSDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID( int device_index )\n{\n    return JoystickByDevIndex(device_index)->guid;\n}\n\nSDL_JoystickGUID SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick)\n{\n    SDL_JoystickGUID guid;\n    \n    if (joystick->hwdata != NULL) {\n        return ((SDL_joylist_item*)joystick->hwdata)->guid;\n    }\n    \n    SDL_zero(guid);\n    return guid;\n}\n\n#endif /* SDL_JOYSTICK_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/joystick/android/SDL_sysjoystick_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"../../SDL_internal.h\"\n\n#ifdef SDL_JOYSTICK_ANDROID\n#include \"../SDL_sysjoystick.h\"\n\nextern int Android_OnPadDown(int device_id, int keycode);\nextern int Android_OnPadUp(int device_id, int keycode);\nextern int Android_OnJoy(int device_id, int axisnum, float value);\nextern int Android_OnHat(int device_id, int hat_id, int x, int y);\nextern int Android_AddJoystick(int device_id, const char *name, SDL_bool is_accelerometer, int nbuttons, int naxes, int nhats, int nballs);\nextern int Android_RemoveJoystick(int device_id);\n\n/* A linked list of available joysticks */\ntypedef struct SDL_joylist_item\n{\n    int device_instance;\n    int device_id; /* Android's device id */\n    char *name;   /* \"SideWinder 3D Pro\" or whatever */\n    SDL_JoystickGUID guid;\n    SDL_bool is_accelerometer;\n    SDL_Joystick *joystick;\n    int nbuttons, naxes, nhats, nballs;\n    \n    struct SDL_joylist_item *next;\n} SDL_joylist_item;\n\ntypedef SDL_joylist_item joystick_hwdata;\n\n#endif /* SDL_JOYSTICK_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/joystick/sort_controllers.py",
    "content": "#!/usr/bin/env python\n#\n# Script to sort the game controller database entries in SDL_gamecontroller.c\n\nimport re\n\n\nfilename = \"SDL_gamecontrollerdb.h\"\ninput = open(filename)\noutput = open(filename + \".new\", \"w\")\nparsing_controllers = False\ncontrollers = []\ncontroller_guids = {}\nsplit_pattern = re.compile(r'([^\"]*\")([^,]*,)([^,]*,)([^\"]*)(\".*)')\n\ndef save_controller(line):\n    global controllers\n    match = split_pattern.match(line)\n    entry = [ match.group(1), match.group(2), match.group(3) ]\n    bindings = sorted(match.group(4).split(\",\"))\n    if (bindings[0] == \"\"):\n        bindings.pop(0)\n    entry.extend(\",\".join(bindings) + \",\")\n    entry.append(match.group(5))\n    controllers.append(entry)\n\ndef write_controllers():\n    global controllers\n    global controller_guids\n    for entry in sorted(controllers, key=lambda entry: entry[2]):\n        line = \"\".join(entry) + \"\\n\"\n        if not line.endswith(\",\\n\") and not line.endswith(\"*/\\n\"):\n            print(\"Warning: '%s' is missing a comma at the end of the line\" % (line))\n        if (entry[1] in controller_guids):\n            print(\"Warning: entry '%s' is duplicate of entry '%s'\" % (entry[2], controller_guids[entry[1]][2]))\n        controller_guids[entry[1]] = entry\n\n        output.write(line)\n    controllers = []\n    controller_guids = {}\n\nfor line in input:\n    if (parsing_controllers):\n        if (line.startswith(\"{\")):\n            output.write(line)\n        elif (line.startswith(\"    NULL\")):\n            parsing_controllers = False\n            write_controllers()\n            output.write(line)\n        elif (line.startswith(\"#if\")):\n            print(\"Parsing \" + line.strip())\n            output.write(line)\n        elif (line.startswith(\"#endif\")):\n            write_controllers()\n            output.write(line)\n        else:\n            save_controller(line)\n    else:\n        if (line.startswith(\"static const char *s_ControllerMappings\")):\n            parsing_controllers = True\n\n        output.write(line)\n\noutput.close()\nprint(\"Finished writing %s.new\" % filename)\n"
  },
  {
    "path": "libs/SDL2/src/libm/e_atan2.c",
    "content": "/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n/* __ieee754_atan2(y,x)\n * Method :\n *\t1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).\n *\t2. Reduce x to positive by (if x and y are unexceptional):\n *\t\tARG (x+iy) = arctan(y/x)   \t   ... if x > 0,\n *\t\tARG (x+iy) = pi - arctan[y/(-x)]   ... if x < 0,\n *\n * Special cases:\n *\n *\tATAN2((anything), NaN ) is NaN;\n *\tATAN2(NAN , (anything) ) is NaN;\n *\tATAN2(+-0, +(anything but NaN)) is +-0  ;\n *\tATAN2(+-0, -(anything but NaN)) is +-pi ;\n *\tATAN2(+-(anything but 0 and NaN), 0) is +-pi/2;\n *\tATAN2(+-(anything but INF and NaN), +INF) is +-0 ;\n *\tATAN2(+-(anything but INF and NaN), -INF) is +-pi;\n *\tATAN2(+-INF,+INF ) is +-pi/4 ;\n *\tATAN2(+-INF,-INF ) is +-3pi/4;\n *\tATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2;\n *\n * Constants:\n * The hexadecimal values are the intended ones for the following\n * constants. The decimal values may be used, provided that the\n * compiler will convert from decimal to binary accurately enough\n * to produce the hexadecimal values shown.\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nstatic const double\ntiny  = 1.0e-300,\nzero  = 0.0,\npi_o_4  = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */\npi_o_2  = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */\npi      = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */\npi_lo   = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */\n\ndouble attribute_hidden __ieee754_atan2(double y, double x)\n{\n\tdouble z;\n\tint32_t k,m,hx,hy,ix,iy;\n\tu_int32_t lx,ly;\n\n\tEXTRACT_WORDS(hx,lx,x);\n\tix = hx&0x7fffffff;\n\tEXTRACT_WORDS(hy,ly,y);\n\tiy = hy&0x7fffffff;\n\tif(((ix|((lx|-(int32_t)lx)>>31))>0x7ff00000)||\n\t   ((iy|((ly|-(int32_t)ly)>>31))>0x7ff00000))\t/* x or y is NaN */\n\t   return x+y;\n\tif(((hx-0x3ff00000)|lx)==0) return atan(y);   /* x=1.0 */\n\tm = ((hy>>31)&1)|((hx>>30)&2);\t/* 2*sign(x)+sign(y) */\n\n    /* when y = 0 */\n\tif((iy|ly)==0) {\n\t    switch(m) {\n\t\tcase 0:\n\t\tcase 1: return y; \t/* atan(+-0,+anything)=+-0 */\n\t\tcase 2: return  pi+tiny;/* atan(+0,-anything) = pi */\n\t\tcase 3: return -pi-tiny;/* atan(-0,-anything) =-pi */\n\t    }\n\t}\n    /* when x = 0 */\n\tif((ix|lx)==0) return (hy<0)?  -pi_o_2-tiny: pi_o_2+tiny;\n\n    /* when x is INF */\n\tif(ix==0x7ff00000) {\n\t    if(iy==0x7ff00000) {\n\t\tswitch(m) {\n\t\t    case 0: return  pi_o_4+tiny;/* atan(+INF,+INF) */\n\t\t    case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */\n\t\t    case 2: return  3.0*pi_o_4+tiny;/* atan(+INF,-INF) */\n\t\t    case 3: return -3.0*pi_o_4-tiny;/* atan(-INF,-INF) */\n\t\t}\n\t    } else {\n\t\tswitch(m) {\n\t\t    case 0: return  zero  ;\t/* atan(+...,+INF) */\n\t\t    case 1: return -zero  ;\t/* atan(-...,+INF) */\n\t\t    case 2: return  pi+tiny  ;\t/* atan(+...,-INF) */\n\t\t    case 3: return -pi-tiny  ;\t/* atan(-...,-INF) */\n\t\t}\n\t    }\n\t}\n    /* when y is INF */\n\tif(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny;\n\n    /* compute y/x */\n\tk = (iy-ix)>>20;\n\tif(k > 60) z=pi_o_2+0.5*pi_lo; \t/* |y/x| >  2**60 */\n\telse if(hx<0&&k<-60) z=0.0; \t/* |y|/x < -2**60 */\n\telse z=atan(fabs(y/x));\t\t/* safe to do y/x */\n\tswitch (m) {\n\t    case 0: return       z  ;\t/* atan(+,+) */\n\t    case 1: {\n\t    \t      u_int32_t zh;\n\t\t      GET_HIGH_WORD(zh,z);\n\t\t      SET_HIGH_WORD(z,zh ^ 0x80000000);\n\t\t    }\n\t\t    return       z  ;\t/* atan(-,+) */\n\t    case 2: return  pi-(z-pi_lo);/* atan(+,-) */\n\t    default: /* case 3 */\n\t    \t    return  (z-pi_lo)-pi;/* atan(-,-) */\n\t}\n}\n"
  },
  {
    "path": "libs/SDL2/src/libm/e_log.c",
    "content": "/* @(#)e_log.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: e_log.c,v 1.8 1995/05/10 20:45:49 jtc Exp $\";\n#endif\n\n/* __ieee754_log(x)\n * Return the logrithm of x\n *\n * Method :\n *   1. Argument Reduction: find k and f such that\n *\t\t\tx = 2^k * (1+f),\n *\t   where  sqrt(2)/2 < 1+f < sqrt(2) .\n *\n *   2. Approximation of log(1+f).\n *\tLet s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)\n *\t\t = 2s + 2/3 s**3 + 2/5 s**5 + .....,\n *\t     \t = 2s + s*R\n *      We use a special Reme algorithm on [0,0.1716] to generate\n * \ta polynomial of degree 14 to approximate R The maximum error\n *\tof this polynomial approximation is bounded by 2**-58.45. In\n *\tother words,\n *\t\t        2      4      6      8      10      12      14\n *\t    R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s  +Lg6*s  +Lg7*s\n *  \t(the values of Lg1 to Lg7 are listed in the program)\n *\tand\n *\t    |      2          14          |     -58.45\n *\t    | Lg1*s +...+Lg7*s    -  R(z) | <= 2\n *\t    |                             |\n *\tNote that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.\n *\tIn order to guarantee error in log below 1ulp, we compute log\n *\tby\n *\t\tlog(1+f) = f - s*(f - R)\t(if f is not too large)\n *\t\tlog(1+f) = f - (hfsq - s*(hfsq+R)).\t(better accuracy)\n *\n *\t3. Finally,  log(x) = k*ln2 + log(1+f).\n *\t\t\t    = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))\n *\t   Here ln2 is split into two floating point number:\n *\t\t\tln2_hi + ln2_lo,\n *\t   where n*ln2_hi is always exact for |n| < 2000.\n *\n * Special cases:\n *\tlog(x) is NaN with signal if x < 0 (including -INF) ;\n *\tlog(+INF) is +INF; log(0) is -INF with signal;\n *\tlog(NaN) is that NaN with no signal.\n *\n * Accuracy:\n *\taccording to an error analysis, the error is always less than\n *\t1 ulp (unit in the last place).\n *\n * Constants:\n * The hexadecimal values are the intended ones for the following\n * constants. The decimal values may be used, provided that the\n * compiler will convert from decimal to binary accurately enough\n * to produce the hexadecimal values shown.\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\n#ifdef __STDC__\nstatic const double\n#else\nstatic double\n#endif\n  ln2_hi = 6.93147180369123816490e-01,  /* 3fe62e42 fee00000 */\n    ln2_lo = 1.90821492927058770002e-10,        /* 3dea39ef 35793c76 */\n    two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */\n    Lg1 = 6.666666666666735130e-01,     /* 3FE55555 55555593 */\n    Lg2 = 3.999999999940941908e-01,     /* 3FD99999 9997FA04 */\n    Lg3 = 2.857142874366239149e-01,     /* 3FD24924 94229359 */\n    Lg4 = 2.222219843214978396e-01,     /* 3FCC71C5 1D8E78AF */\n    Lg5 = 1.818357216161805012e-01,     /* 3FC74664 96CB03DE */\n    Lg6 = 1.531383769920937332e-01,     /* 3FC39A09 D078C69F */\n    Lg7 = 1.479819860511658591e-01;     /* 3FC2F112 DF3E5244 */\n\n#ifdef __STDC__\nstatic const double zero = 0.0;\n#else\nstatic double zero = 0.0;\n#endif\n\n#ifdef __STDC__\ndouble attribute_hidden\n__ieee754_log(double x)\n#else\ndouble attribute_hidden\n__ieee754_log(x)\n     double x;\n#endif\n{\n    double hfsq, f, s, z, R, w, t1, t2, dk;\n    int32_t k, hx, i, j;\n    u_int32_t lx;\n\n    EXTRACT_WORDS(hx, lx, x);\n\n    k = 0;\n    if (hx < 0x00100000) {      /* x < 2**-1022  */\n        if (((hx & 0x7fffffff) | lx) == 0)\n            return -two54 / zero;       /* log(+-0)=-inf */\n        if (hx < 0)\n            return (x - x) / zero;      /* log(-#) = NaN */\n        k -= 54;\n        x *= two54;             /* subnormal number, scale up x */\n        GET_HIGH_WORD(hx, x);\n    }\n    if (hx >= 0x7ff00000)\n        return x + x;\n    k += (hx >> 20) - 1023;\n    hx &= 0x000fffff;\n    i = (hx + 0x95f64) & 0x100000;\n    SET_HIGH_WORD(x, hx | (i ^ 0x3ff00000));    /* normalize x or x/2 */\n    k += (i >> 20);\n    f = x - 1.0;\n    if ((0x000fffff & (2 + hx)) < 3) {  /* |f| < 2**-20 */\n        if (f == zero) {\n            if (k == 0)\n                return zero;\n            else {\n                dk = (double) k;\n                return dk * ln2_hi + dk * ln2_lo;\n            }\n        }\n        R = f * f * (0.5 - 0.33333333333333333 * f);\n        if (k == 0)\n            return f - R;\n        else {\n            dk = (double) k;\n            return dk * ln2_hi - ((R - dk * ln2_lo) - f);\n        }\n    }\n    s = f / (2.0 + f);\n    dk = (double) k;\n    z = s * s;\n    i = hx - 0x6147a;\n    w = z * z;\n    j = 0x6b851 - hx;\n    t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n    t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n    i |= j;\n    R = t2 + t1;\n    if (i > 0) {\n        hfsq = 0.5 * f * f;\n        if (k == 0)\n            return f - (hfsq - s * (hfsq + R));\n        else\n            return dk * ln2_hi - ((hfsq - (s * (hfsq + R) + dk * ln2_lo)) -\n                                  f);\n    } else {\n        if (k == 0)\n            return f - s * (f - R);\n        else\n            return dk * ln2_hi - ((s * (f - R) - dk * ln2_lo) - f);\n    }\n}\n"
  },
  {
    "path": "libs/SDL2/src/libm/e_pow.c",
    "content": "/* @(#)e_pow.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic char rcsid[] = \"$NetBSD: e_pow.c,v 1.9 1995/05/12 04:57:32 jtc Exp $\";\n#endif\n\n/* __ieee754_pow(x,y) return x**y\n *\n *\t\t      n\n * Method:  Let x =  2   * (1+f)\n *\t1. Compute and return log2(x) in two pieces:\n *\t\tlog2(x) = w1 + w2,\n *\t   where w1 has 53-24 = 29 bit trailing zeros.\n *\t2. Perform y*log2(x) = n+y' by simulating muti-precision\n *\t   arithmetic, where |y'|<=0.5.\n *\t3. Return x**y = 2**n*exp(y'*log2)\n *\n * Special cases:\n *\t1.  (anything) ** 0  is 1\n *\t2.  (anything) ** 1  is itself\n *\t3.  (anything) ** NAN is NAN\n *\t4.  NAN ** (anything except 0) is NAN\n *\t5.  +-(|x| > 1) **  +INF is +INF\n *\t6.  +-(|x| > 1) **  -INF is +0\n *\t7.  +-(|x| < 1) **  +INF is +0\n *\t8.  +-(|x| < 1) **  -INF is +INF\n *\t9.  +-1         ** +-INF is NAN\n *\t10. +0 ** (+anything except 0, NAN)               is +0\n *\t11. -0 ** (+anything except 0, NAN, odd integer)  is +0\n *\t12. +0 ** (-anything except 0, NAN)               is +INF\n *\t13. -0 ** (-anything except 0, NAN, odd integer)  is +INF\n *\t14. -0 ** (odd integer) = -( +0 ** (odd integer) )\n *\t15. +INF ** (+anything except 0,NAN) is +INF\n *\t16. +INF ** (-anything except 0,NAN) is +0\n *\t17. -INF ** (anything)  = -0 ** (-anything)\n *\t18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)\n *\t19. (-anything except 0 and inf) ** (non-integer) is NAN\n *\n * Accuracy:\n *\tpow(x,y) returns x**y nearly rounded. In particular\n *\t\t\tpow(integer,integer)\n *\talways returns the correct integer provided it is\n *\trepresentable.\n *\n * Constants :\n * The hexadecimal values are the intended ones for the following\n * constants. The decimal values may be used, provided that the\n * compiler will convert from decimal to binary accurately enough\n * to produce the hexadecimal values shown.\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nlibm_hidden_proto(scalbn)\n    libm_hidden_proto(fabs)\n#ifdef __STDC__\n     static const double\n#else\n     static double\n#endif\n       bp[] = { 1.0, 1.5, }, dp_h[] = {\n     0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */\n\n         dp_l[] = {\n     0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */\n\n         zero = 0.0, one = 1.0, two = 2.0, two53 = 9007199254740992.0,  /* 0x43400000, 0x00000000 */\n         huge_val = 1.0e300, tiny = 1.0e-300,\n         /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */\n         L1 = 5.99999999999994648725e-01,       /* 0x3FE33333, 0x33333303 */\n         L2 = 4.28571428578550184252e-01,       /* 0x3FDB6DB6, 0xDB6FABFF */\n         L3 = 3.33333329818377432918e-01,       /* 0x3FD55555, 0x518F264D */\n         L4 = 2.72728123808534006489e-01,       /* 0x3FD17460, 0xA91D4101 */\n         L5 = 2.30660745775561754067e-01,       /* 0x3FCD864A, 0x93C9DB65 */\n         L6 = 2.06975017800338417784e-01,       /* 0x3FCA7E28, 0x4A454EEF */\n         P1 = 1.66666666666666019037e-01,       /* 0x3FC55555, 0x5555553E */\n         P2 = -2.77777777770155933842e-03,      /* 0xBF66C16C, 0x16BEBD93 */\n         P3 = 6.61375632143793436117e-05,       /* 0x3F11566A, 0xAF25DE2C */\n         P4 = -1.65339022054652515390e-06,      /* 0xBEBBBD41, 0xC5D26BF1 */\n         P5 = 4.13813679705723846039e-08,       /* 0x3E663769, 0x72BEA4D0 */\n         lg2 = 6.93147180559945286227e-01,      /* 0x3FE62E42, 0xFEFA39EF */\n         lg2_h = 6.93147182464599609375e-01,    /* 0x3FE62E43, 0x00000000 */\n         lg2_l = -1.90465429995776804525e-09,   /* 0xBE205C61, 0x0CA86C39 */\n         ovt = 8.0085662595372944372e-0017,     /* -(1024-log2(ovfl+.5ulp)) */\n         cp = 9.61796693925975554329e-01,       /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */\n         cp_h = 9.61796700954437255859e-01,     /* 0x3FEEC709, 0xE0000000 =(float)cp */\n         cp_l = -7.02846165095275826516e-09,    /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h */\n         ivln2 = 1.44269504088896338700e+00,    /* 0x3FF71547, 0x652B82FE =1/ln2 */\n         ivln2_h = 1.44269502162933349609e+00,  /* 0x3FF71547, 0x60000000 =24b 1/ln2 */\n         ivln2_l = 1.92596299112661746887e-08;  /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail */\n\n#ifdef __STDC__\n     double attribute_hidden __ieee754_pow(double x, double y)\n#else\n     double attribute_hidden __ieee754_pow(x, y)\n     double x, y;\n#endif\n     {\n         double z, ax, z_h, z_l, p_h, p_l;\n         double y1, t1, t2, r, s, t, u, v, w;\n         int32_t i, j, k, yisint, n;\n         int32_t hx, hy, ix, iy;\n         u_int32_t lx, ly;\n\n         EXTRACT_WORDS(hx, lx, x);\n         EXTRACT_WORDS(hy, ly, y);\n         ix = hx & 0x7fffffff;\n         iy = hy & 0x7fffffff;\n\n         /* y==zero: x**0 = 1 */\n         if ((iy | ly) == 0)\n             return one;\n\n         /* +-NaN return x+y */\n         if (ix > 0x7ff00000 || ((ix == 0x7ff00000) && (lx != 0)) ||\n             iy > 0x7ff00000 || ((iy == 0x7ff00000) && (ly != 0)))\n             return x + y;\n\n         /* determine if y is an odd int when x < 0\n          * yisint = 0       ... y is not an integer\n          * yisint = 1       ... y is an odd int\n          * yisint = 2       ... y is an even int\n          */\n         yisint = 0;\n         if (hx < 0) {\n             if (iy >= 0x43400000)\n                 yisint = 2;    /* even integer y */\n             else if (iy >= 0x3ff00000) {\n                 k = (iy >> 20) - 0x3ff;        /* exponent */\n                 if (k > 20) {\n                     j = ly >> (52 - k);\n                     if ((j << (52 - k)) == ly)\n                         yisint = 2 - (j & 1);\n                 } else if (ly == 0) {\n                     j = iy >> (20 - k);\n                     if ((j << (20 - k)) == iy)\n                         yisint = 2 - (j & 1);\n                 }\n             }\n         }\n\n         /* special value of y */\n         if (ly == 0) {\n             if (iy == 0x7ff00000) {    /* y is +-inf */\n                 if (((ix - 0x3ff00000) | lx) == 0)\n                     return y - y;      /* inf**+-1 is NaN */\n                 else if (ix >= 0x3ff00000)     /* (|x|>1)**+-inf = inf,0 */\n                     return (hy >= 0) ? y : zero;\n                 else           /* (|x|<1)**-,+inf = inf,0 */\n                     return (hy < 0) ? -y : zero;\n             }\n             if (iy == 0x3ff00000) {    /* y is  +-1 */\n                 if (hy < 0)\n                     return one / x;\n                 else\n                     return x;\n             }\n             if (hy == 0x40000000)\n                 return x * x;  /* y is  2 */\n             if (hy == 0x3fe00000) {    /* y is  0.5 */\n                 if (hx >= 0)   /* x >= +0 */\n                     return __ieee754_sqrt(x);\n             }\n         }\n\n         ax = fabs(x);\n         /* special value of x */\n         if (lx == 0) {\n             if (ix == 0x7ff00000 || ix == 0 || ix == 0x3ff00000) {\n                 z = ax;        /* x is +-0,+-inf,+-1 */\n                 if (hy < 0)\n                     z = one / z;       /* z = (1/|x|) */\n                 if (hx < 0) {\n                     if (((ix - 0x3ff00000) | yisint) == 0) {\n                         z = (z - z) / (z - z); /* (-1)**non-int is NaN */\n                     } else if (yisint == 1)\n                         z = -z;        /* (x<0)**odd = -(|x|**odd) */\n                 }\n                 return z;\n             }\n         }\n\n         /* (x<0)**(non-int) is NaN */\n         if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0)\n             return (x - x) / (x - x);\n\n         /* |y| is huge */\n         if (iy > 0x41e00000) { /* if |y| > 2**31 */\n             if (iy > 0x43f00000) {     /* if |y| > 2**64, must o/uflow */\n                 if (ix <= 0x3fefffff)\n                     return (hy < 0) ? huge_val * huge_val : tiny * tiny;\n                 if (ix >= 0x3ff00000)\n                     return (hy > 0) ? huge_val * huge_val : tiny * tiny;\n             }\n             /* over/underflow if x is not close to one */\n             if (ix < 0x3fefffff)\n                 return (hy < 0) ? huge_val * huge_val : tiny * tiny;\n             if (ix > 0x3ff00000)\n                 return (hy > 0) ? huge_val * huge_val : tiny * tiny;\n             /* now |1-x| is tiny <= 2**-20, suffice to compute\n                log(x) by x-x^2/2+x^3/3-x^4/4 */\n             t = x - 1;         /* t has 20 trailing zeros */\n             w = (t * t) * (0.5 - t * (0.3333333333333333333333 - t * 0.25));\n             u = ivln2_h * t;   /* ivln2_h has 21 sig. bits */\n             v = t * ivln2_l - w * ivln2;\n             t1 = u + v;\n             SET_LOW_WORD(t1, 0);\n             t2 = v - (t1 - u);\n         } else {\n             double s2, s_h, s_l, t_h, t_l;\n             n = 0;\n             /* take care subnormal number */\n             if (ix < 0x00100000) {\n                 ax *= two53;\n                 n -= 53;\n                 GET_HIGH_WORD(ix, ax);\n             }\n             n += ((ix) >> 20) - 0x3ff;\n             j = ix & 0x000fffff;\n             /* determine interval */\n             ix = j | 0x3ff00000;       /* normalize ix */\n             if (j <= 0x3988E)\n                 k = 0;         /* |x|<sqrt(3/2) */\n             else if (j < 0xBB67A)\n                 k = 1;         /* |x|<sqrt(3)   */\n             else {\n                 k = 0;\n                 n += 1;\n                 ix -= 0x00100000;\n             }\n             SET_HIGH_WORD(ax, ix);\n\n             /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */\n             u = ax - bp[k];    /* bp[0]=1.0, bp[1]=1.5 */\n             v = one / (ax + bp[k]);\n             s = u * v;\n             s_h = s;\n             SET_LOW_WORD(s_h, 0);\n             /* t_h=ax+bp[k] High */\n             t_h = zero;\n             SET_HIGH_WORD(t_h,\n                           ((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18));\n             t_l = ax - (t_h - bp[k]);\n             s_l = v * ((u - s_h * t_h) - s_h * t_l);\n             /* compute log(ax) */\n             s2 = s * s;\n             r = s2 * s2 * (L1 +\n                            s2 * (L2 +\n                                  s2 * (L3 +\n                                        s2 * (L4 + s2 * (L5 + s2 * L6)))));\n             r += s_l * (s_h + s);\n             s2 = s_h * s_h;\n             t_h = 3.0 + s2 + r;\n             SET_LOW_WORD(t_h, 0);\n             t_l = r - ((t_h - 3.0) - s2);\n             /* u+v = s*(1+...) */\n             u = s_h * t_h;\n             v = s_l * t_h + t_l * s;\n             /* 2/(3log2)*(s+...) */\n             p_h = u + v;\n             SET_LOW_WORD(p_h, 0);\n             p_l = v - (p_h - u);\n             z_h = cp_h * p_h;  /* cp_h+cp_l = 2/(3*log2) */\n             z_l = cp_l * p_h + p_l * cp + dp_l[k];\n             /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */\n             t = (double) n;\n             t1 = (((z_h + z_l) + dp_h[k]) + t);\n             SET_LOW_WORD(t1, 0);\n             t2 = z_l - (((t1 - t) - dp_h[k]) - z_h);\n         }\n\n         s = one;               /* s (sign of result -ve**odd) = -1 else = 1 */\n         if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0)\n             s = -one;          /* (-ve)**(odd int) */\n\n         /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */\n         y1 = y;\n         SET_LOW_WORD(y1, 0);\n         p_l = (y - y1) * t1 + y * t2;\n         p_h = y1 * t1;\n         z = p_l + p_h;\n         EXTRACT_WORDS(j, i, z);\n         if (j >= 0x40900000) { /* z >= 1024 */\n             if (((j - 0x40900000) | i) != 0)   /* if z > 1024 */\n                 return s * huge_val * huge_val;        /* overflow */\n             else {\n                 if (p_l + ovt > z - p_h)\n                     return s * huge_val * huge_val;    /* overflow */\n             }\n         } else if ((j & 0x7fffffff) >= 0x4090cc00) {   /* z <= -1075 */\n             if (((j - 0xc090cc00) | i) != 0)   /* z < -1075 */\n                 return s * tiny * tiny;        /* underflow */\n             else {\n                 if (p_l <= z - p_h)\n                     return s * tiny * tiny;    /* underflow */\n             }\n         }\n         /*\n          * compute 2**(p_h+p_l)\n          */\n         i = j & 0x7fffffff;\n         k = (i >> 20) - 0x3ff;\n         n = 0;\n         if (i > 0x3fe00000) {  /* if |z| > 0.5, set n = [z+0.5] */\n             n = j + (0x00100000 >> (k + 1));\n             k = ((n & 0x7fffffff) >> 20) - 0x3ff;      /* new k for n */\n             t = zero;\n             SET_HIGH_WORD(t, n & ~(0x000fffff >> k));\n             n = ((n & 0x000fffff) | 0x00100000) >> (20 - k);\n             if (j < 0)\n                 n = -n;\n             p_h -= t;\n         }\n         t = p_l + p_h;\n         SET_LOW_WORD(t, 0);\n         u = t * lg2_h;\n         v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n         z = u + v;\n         w = v - (z - u);\n         t = z * z;\n         t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n         r = (z * t1) / (t1 - two) - (w + z * w);\n         z = one - (r - z);\n         GET_HIGH_WORD(j, z);\n         j += (n << 20);\n         if ((j >> 20) <= 0)\n             z = scalbn(z, n);  /* subnormal output */\n         else\n             SET_HIGH_WORD(z, j);\n         return s * z;\n     }\n"
  },
  {
    "path": "libs/SDL2/src/libm/e_rem_pio2.c",
    "content": "/* @(#)e_rem_pio2.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: e_rem_pio2.c,v 1.8 1995/05/10 20:46:02 jtc Exp $\";\n#endif\n\n/* __ieee754_rem_pio2(x,y)\n *\n * return the remainder of x rem pi/2 in y[0]+y[1]\n * use __kernel_rem_pio2()\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nlibm_hidden_proto(fabs)\n\n/*\n * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi\n */\n#ifdef __STDC__\n     static const int32_t two_over_pi[] = {\n#else\n     static int32_t two_over_pi[] = {\n#endif\n         0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,\n         0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,\n         0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,\n         0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,\n         0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,\n         0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,\n         0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,\n         0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,\n         0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,\n         0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,\n         0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,\n     };\n\n#ifdef __STDC__\nstatic const int32_t npio2_hw[] = {\n#else\nstatic int32_t npio2_hw[] = {\n#endif\n    0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C,\n    0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C,\n    0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A,\n    0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C,\n    0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB,\n    0x404858EB, 0x404921FB,\n};\n\n/*\n * invpio2:  53 bits of 2/pi\n * pio2_1:   first  33 bit of pi/2\n * pio2_1t:  pi/2 - pio2_1\n * pio2_2:   second 33 bit of pi/2\n * pio2_2t:  pi/2 - (pio2_1+pio2_2)\n * pio2_3:   third  33 bit of pi/2\n * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)\n */\n\n#ifdef __STDC__\nstatic const double\n#else\nstatic double\n#endif\n  zero = 0.00000000000000000000e+00,    /* 0x00000000, 0x00000000 */\n    half = 5.00000000000000000000e-01,  /* 0x3FE00000, 0x00000000 */\n    two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */\n    invpio2 = 6.36619772367581382433e-01,       /* 0x3FE45F30, 0x6DC9C883 */\n    pio2_1 = 1.57079632673412561417e+00,        /* 0x3FF921FB, 0x54400000 */\n    pio2_1t = 6.07710050650619224932e-11,       /* 0x3DD0B461, 0x1A626331 */\n    pio2_2 = 6.07710050630396597660e-11,        /* 0x3DD0B461, 0x1A600000 */\n    pio2_2t = 2.02226624879595063154e-21,       /* 0x3BA3198A, 0x2E037073 */\n    pio2_3 = 2.02226624871116645580e-21,        /* 0x3BA3198A, 0x2E000000 */\n    pio2_3t = 8.47842766036889956997e-32;       /* 0x397B839A, 0x252049C1 */\n\n#ifdef __STDC__\nint32_t attribute_hidden\n__ieee754_rem_pio2(double x, double *y)\n#else\nint32_t attribute_hidden\n__ieee754_rem_pio2(x, y)\n     double x, y[];\n#endif\n{\n    double z = 0.0, w, t, r, fn;\n    double tx[3];\n    int32_t e0, i, j, nx, n, ix, hx;\n    u_int32_t low;\n\n    GET_HIGH_WORD(hx, x);       /* high word of x */\n    ix = hx & 0x7fffffff;\n    if (ix <= 0x3fe921fb) {     /* |x| ~<= pi/4 , no need for reduction */\n        y[0] = x;\n        y[1] = 0;\n        return 0;\n    }\n    if (ix < 0x4002d97c) {      /* |x| < 3pi/4, special case with n=+-1 */\n        if (hx > 0) {\n            z = x - pio2_1;\n            if (ix != 0x3ff921fb) {     /* 33+53 bit pi is good enough */\n                y[0] = z - pio2_1t;\n                y[1] = (z - y[0]) - pio2_1t;\n            } else {            /* near pi/2, use 33+33+53 bit pi */\n                z -= pio2_2;\n                y[0] = z - pio2_2t;\n                y[1] = (z - y[0]) - pio2_2t;\n            }\n            return 1;\n        } else {                /* negative x */\n            z = x + pio2_1;\n            if (ix != 0x3ff921fb) {     /* 33+53 bit pi is good enough */\n                y[0] = z + pio2_1t;\n                y[1] = (z - y[0]) + pio2_1t;\n            } else {            /* near pi/2, use 33+33+53 bit pi */\n                z += pio2_2;\n                y[0] = z + pio2_2t;\n                y[1] = (z - y[0]) + pio2_2t;\n            }\n            return -1;\n        }\n    }\n    if (ix <= 0x413921fb) {     /* |x| ~<= 2^19*(pi/2), medium size */\n        t = fabs(x);\n        n = (int32_t) (t * invpio2 + half);\n        fn = (double) n;\n        r = t - fn * pio2_1;\n        w = fn * pio2_1t;       /* 1st round good to 85 bit */\n        if (n < 32 && ix != npio2_hw[n - 1]) {\n            y[0] = r - w;       /* quick check no cancellation */\n        } else {\n            u_int32_t high;\n            j = ix >> 20;\n            y[0] = r - w;\n            GET_HIGH_WORD(high, y[0]);\n            i = j - ((high >> 20) & 0x7ff);\n            if (i > 16) {       /* 2nd iteration needed, good to 118 */\n                t = r;\n                w = fn * pio2_2;\n                r = t - w;\n                w = fn * pio2_2t - ((t - r) - w);\n                y[0] = r - w;\n                GET_HIGH_WORD(high, y[0]);\n                i = j - ((high >> 20) & 0x7ff);\n                if (i > 49) {   /* 3rd iteration need, 151 bits acc */\n                    t = r;      /* will cover all possible cases */\n                    w = fn * pio2_3;\n                    r = t - w;\n                    w = fn * pio2_3t - ((t - r) - w);\n                    y[0] = r - w;\n                }\n            }\n        }\n        y[1] = (r - y[0]) - w;\n        if (hx < 0) {\n            y[0] = -y[0];\n            y[1] = -y[1];\n            return -n;\n        } else\n            return n;\n    }\n    /*\n     * all other (large) arguments\n     */\n    if (ix >= 0x7ff00000) {     /* x is inf or NaN */\n        y[0] = y[1] = x - x;\n        return 0;\n    }\n    /* set z = scalbn(|x|,ilogb(x)-23) */\n    GET_LOW_WORD(low, x);\n    SET_LOW_WORD(z, low);\n    e0 = (ix >> 20) - 1046;     /* e0 = ilogb(z)-23; */\n    SET_HIGH_WORD(z, ix - ((int32_t) (e0 << 20)));\n    for (i = 0; i < 2; i++) {\n        tx[i] = (double) ((int32_t) (z));\n        z = (z - tx[i]) * two24;\n    }\n    tx[2] = z;\n    nx = 3;\n    while (tx[nx - 1] == zero)\n        nx--;                   /* skip zero term */\n    n = __kernel_rem_pio2(tx, y, e0, nx, 2, two_over_pi);\n    if (hx < 0) {\n        y[0] = -y[0];\n        y[1] = -y[1];\n        return -n;\n    }\n    return n;\n}\n"
  },
  {
    "path": "libs/SDL2/src/libm/e_sqrt.c",
    "content": "/* @(#)e_sqrt.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: e_sqrt.c,v 1.8 1995/05/10 20:46:17 jtc Exp $\";\n#endif\n\n/* __ieee754_sqrt(x)\n * Return correctly rounded sqrt.\n *           ------------------------------------------\n *\t     |  Use the hardware sqrt if you have one |\n *           ------------------------------------------\n * Method:\n *   Bit by bit method using integer arithmetic. (Slow, but portable)\n *   1. Normalization\n *\tScale x to y in [1,4) with even powers of 2:\n *\tfind an integer k such that  1 <= (y=x*2^(2k)) < 4, then\n *\t\tsqrt(x) = 2^k * sqrt(y)\n *   2. Bit by bit computation\n *\tLet q  = sqrt(y) truncated to i bit after binary point (q = 1),\n *\t     i\t\t\t\t\t\t\t 0\n *                                     i+1         2\n *\t    s  = 2*q , and\ty  =  2   * ( y - q  ).\t\t(1)\n *\t     i      i            i                 i\n *\n *\tTo compute q    from q , one checks whether\n *\t\t    i+1       i\n *\n *\t\t\t      -(i+1) 2\n *\t\t\t(q + 2      ) <= y.\t\t\t(2)\n *     \t\t\t  i\n *\t\t\t\t\t\t\t      -(i+1)\n *\tIf (2) is false, then q   = q ; otherwise q   = q  + 2      .\n *\t\t \t       i+1   i             i+1   i\n *\n *\tWith some algebric manipulation, it is not difficult to see\n *\tthat (2) is equivalent to\n *                             -(i+1)\n *\t\t\ts  +  2       <= y\t\t\t(3)\n *\t\t\t i                i\n *\n *\tThe advantage of (3) is that s  and y  can be computed by\n *\t\t\t\t      i      i\n *\tthe following recurrence formula:\n *\t    if (3) is false\n *\n *\t    s     =  s  ,\ty    = y   ;\t\t\t(4)\n *\t     i+1      i\t\t i+1    i\n *\n *\t    otherwise,\n *                         -i                     -(i+1)\n *\t    s\t  =  s  + 2  ,  y    = y  -  s  - 2  \t\t(5)\n *           i+1      i          i+1    i     i\n *\n *\tOne may easily use induction to prove (4) and (5).\n *\tNote. Since the left hand side of (3) contain only i+2 bits,\n *\t      it does not necessary to do a full (53-bit) comparison\n *\t      in (3).\n *   3. Final rounding\n *\tAfter generating the 53 bits result, we compute one more bit.\n *\tTogether with the remainder, we can decide whether the\n *\tresult is exact, bigger than 1/2ulp, or less than 1/2ulp\n *\t(it will never equal to 1/2ulp).\n *\tThe rounding mode can be detected by checking whether\n *\thuge + tiny is equal to huge, and whether huge - tiny is\n *\tequal to huge for some floating point number \"huge\" and \"tiny\".\n *\n * Special cases:\n *\tsqrt(+-0) = +-0 \t... exact\n *\tsqrt(inf) = inf\n *\tsqrt(-ve) = NaN\t\t... with invalid signal\n *\tsqrt(NaN) = NaN\t\t... with invalid signal for signaling NaN\n *\n * Other methods : see the appended file at the end of the program below.\n *---------------\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\n#ifdef __STDC__\nstatic const double one = 1.0, tiny = 1.0e-300;\n#else\nstatic double one = 1.0, tiny = 1.0e-300;\n#endif\n\n#ifdef __STDC__\ndouble attribute_hidden\n__ieee754_sqrt(double x)\n#else\ndouble attribute_hidden\n__ieee754_sqrt(x)\n     double x;\n#endif\n{\n    double z;\n    int32_t sign = (int) 0x80000000;\n    int32_t ix0, s0, q, m, t, i;\n    u_int32_t r, t1, s1, ix1, q1;\n\n    EXTRACT_WORDS(ix0, ix1, x);\n\n    /* take care of Inf and NaN */\n    if ((ix0 & 0x7ff00000) == 0x7ff00000) {\n        return x * x + x;       /* sqrt(NaN)=NaN, sqrt(+inf)=+inf\n                                   sqrt(-inf)=sNaN */\n    }\n    /* take care of zero */\n    if (ix0 <= 0) {\n        if (((ix0 & (~sign)) | ix1) == 0)\n            return x;           /* sqrt(+-0) = +-0 */\n        else if (ix0 < 0)\n            return (x - x) / (x - x);   /* sqrt(-ve) = sNaN */\n    }\n    /* normalize x */\n    m = (ix0 >> 20);\n    if (m == 0) {               /* subnormal x */\n        while (ix0 == 0) {\n            m -= 21;\n            ix0 |= (ix1 >> 11);\n            ix1 <<= 21;\n        }\n        for (i = 0; (ix0 & 0x00100000) == 0; i++)\n            ix0 <<= 1;\n        m -= i - 1;\n        ix0 |= (ix1 >> (32 - i));\n        ix1 <<= i;\n    }\n    m -= 1023;                  /* unbias exponent */\n    ix0 = (ix0 & 0x000fffff) | 0x00100000;\n    if (m & 1) {                /* odd m, double x to make it even */\n        ix0 += ix0 + ((ix1 & sign) >> 31);\n        ix1 += ix1;\n    }\n    m >>= 1;                    /* m = [m/2] */\n\n    /* generate sqrt(x) bit by bit */\n    ix0 += ix0 + ((ix1 & sign) >> 31);\n    ix1 += ix1;\n    q = q1 = s0 = s1 = 0;       /* [q,q1] = sqrt(x) */\n    r = 0x00200000;             /* r = moving bit from right to left */\n\n    while (r != 0) {\n        t = s0 + r;\n        if (t <= ix0) {\n            s0 = t + r;\n            ix0 -= t;\n            q += r;\n        }\n        ix0 += ix0 + ((ix1 & sign) >> 31);\n        ix1 += ix1;\n        r >>= 1;\n    }\n\n    r = sign;\n    while (r != 0) {\n        t1 = s1 + r;\n        t = s0;\n        if ((t < ix0) || ((t == ix0) && (t1 <= ix1))) {\n            s1 = t1 + r;\n            if (((t1 & sign) == sign) && (s1 & sign) == 0)\n                s0 += 1;\n            ix0 -= t;\n            if (ix1 < t1)\n                ix0 -= 1;\n            ix1 -= t1;\n            q1 += r;\n        }\n        ix0 += ix0 + ((ix1 & sign) >> 31);\n        ix1 += ix1;\n        r >>= 1;\n    }\n\n    /* use floating add to find out rounding direction */\n    if ((ix0 | ix1) != 0) {\n        z = one - tiny;         /* trigger inexact flag */\n        if (z >= one) {\n            z = one + tiny;\n            if (q1 == (u_int32_t) 0xffffffff) {\n                q1 = 0;\n                q += 1;\n            } else if (z > one) {\n                if (q1 == (u_int32_t) 0xfffffffe)\n                    q += 1;\n                q1 += 2;\n            } else\n                q1 += (q1 & 1);\n        }\n    }\n    ix0 = (q >> 1) + 0x3fe00000;\n    ix1 = q1 >> 1;\n    if ((q & 1) == 1)\n        ix1 |= sign;\n    ix0 += (m << 20);\n    INSERT_WORDS(z, ix0, ix1);\n    return z;\n}\n\n/*\nOther methods  (use floating-point arithmetic)\n-------------\n(This is a copy of a drafted paper by Prof W. Kahan\nand K.C. Ng, written in May, 1986)\n\n\tTwo algorithms are given here to implement sqrt(x)\n\t(IEEE double precision arithmetic) in software.\n\tBoth supply sqrt(x) correctly rounded. The first algorithm (in\n\tSection A) uses newton iterations and involves four divisions.\n\tThe second one uses reciproot iterations to avoid division, but\n\trequires more multiplications. Both algorithms need the ability\n\tto chop results of arithmetic operations instead of round them,\n\tand the INEXACT flag to indicate when an arithmetic operation\n\tis executed exactly with no roundoff error, all part of the\n\tstandard (IEEE 754-1985). The ability to perform shift, add,\n\tsubtract and logical AND operations upon 32-bit words is needed\n\ttoo, though not part of the standard.\n\nA.  sqrt(x) by Newton Iteration\n\n   (1)\tInitial approximation\n\n\tLet x0 and x1 be the leading and the trailing 32-bit words of\n\ta floating point number x (in IEEE double format) respectively\n\n\t    1    11\t\t     52\t\t\t\t  ...widths\n\t   ------------------------------------------------------\n\tx: |s|\t  e     |\t      f\t\t\t\t|\n\t   ------------------------------------------------------\n\t      msb    lsb  msb\t\t\t\t      lsb ...order\n\n\n\t     ------------------------  \t     ------------------------\n\tx0:  |s|   e    |    f1     |\t x1: |          f2           |\n\t     ------------------------  \t     ------------------------\n\n\tBy performing shifts and subtracts on x0 and x1 (both regarded\n\tas integers), we obtain an 8-bit approximation of sqrt(x) as\n\tfollows.\n\n\t\tk  := (x0>>1) + 0x1ff80000;\n\t\ty0 := k - T1[31&(k>>15)].\t... y ~ sqrt(x) to 8 bits\n\tHere k is a 32-bit integer and T1[] is an integer array containing\n\tcorrection terms. Now magically the floating value of y (y's\n\tleading 32-bit word is y0, the value of its trailing word is 0)\n\tapproximates sqrt(x) to almost 8-bit.\n\n\tValue of T1:\n\tstatic int T1[32]= {\n\t0,\t1024,\t3062,\t5746,\t9193,\t13348,\t18162,\t23592,\n\t29598,\t36145,\t43202,\t50740,\t58733,\t67158,\t75992,\t85215,\n\t83599,\t71378,\t60428,\t50647,\t41945,\t34246,\t27478,\t21581,\n\t16499,\t12183,\t8588,\t5674,\t3403,\t1742,\t661,\t130,};\n\n    (2)\tIterative refinement\n\n\tApply Heron's rule three times to y, we have y approximates\n\tsqrt(x) to within 1 ulp (Unit in the Last Place):\n\n\t\ty := (y+x/y)/2\t\t... almost 17 sig. bits\n\t\ty := (y+x/y)/2\t\t... almost 35 sig. bits\n\t\ty := y-(y-x/y)/2\t... within 1 ulp\n\n\n\tRemark 1.\n\t    Another way to improve y to within 1 ulp is:\n\n\t\ty := (y+x/y)\t\t... almost 17 sig. bits to 2*sqrt(x)\n\t\ty := y - 0x00100006\t... almost 18 sig. bits to sqrt(x)\n\n\t\t\t\t2\n\t\t\t    (x-y )*y\n\t\ty := y + 2* ----------\t...within 1 ulp\n\t\t\t       2\n\t\t\t     3y  + x\n\n\n\tThis formula has one division fewer than the one above; however,\n\tit requires more multiplications and additions. Also x must be\n\tscaled in advance to avoid spurious overflow in evaluating the\n\texpression 3y*y+x. Hence it is not recommended uless division\n\tis slow. If division is very slow, then one should use the\n\treciproot algorithm given in section B.\n\n    (3) Final adjustment\n\n\tBy twiddling y's last bit it is possible to force y to be\n\tcorrectly rounded according to the prevailing rounding mode\n\tas follows. Let r and i be copies of the rounding mode and\n\tinexact flag before entering the square root program. Also we\n\tuse the expression y+-ulp for the next representable floating\n\tnumbers (up and down) of y. Note that y+-ulp = either fixed\n\tpoint y+-1, or multiply y by nextafter(1,+-inf) in chopped\n\tmode.\n\n\t\tI := FALSE;\t... reset INEXACT flag I\n\t\tR := RZ;\t... set rounding mode to round-toward-zero\n\t\tz := x/y;\t... chopped quotient, possibly inexact\n\t\tIf(not I) then {\t... if the quotient is exact\n\t\t    if(z=y) {\n\t\t        I := i;\t ... restore inexact flag\n\t\t        R := r;  ... restore rounded mode\n\t\t        return sqrt(x):=y.\n\t\t    } else {\n\t\t\tz := z - ulp;\t... special rounding\n\t\t    }\n\t\t}\n\t\ti := TRUE;\t\t... sqrt(x) is inexact\n\t\tIf (r=RN) then z=z+ulp\t... rounded-to-nearest\n\t\tIf (r=RP) then {\t... round-toward-+inf\n\t\t    y = y+ulp; z=z+ulp;\n\t\t}\n\t\ty := y+z;\t\t... chopped sum\n\t\ty0:=y0-0x00100000;\t... y := y/2 is correctly rounded.\n\t        I := i;\t \t\t... restore inexact flag\n\t        R := r;  \t\t... restore rounded mode\n\t        return sqrt(x):=y.\n\n    (4)\tSpecial cases\n\n\tSquare root of +inf, +-0, or NaN is itself;\n\tSquare root of a negative number is NaN with invalid signal.\n\n\nB.  sqrt(x) by Reciproot Iteration\n\n   (1)\tInitial approximation\n\n\tLet x0 and x1 be the leading and the trailing 32-bit words of\n\ta floating point number x (in IEEE double format) respectively\n\t(see section A). By performing shifs and subtracts on x0 and y0,\n\twe obtain a 7.8-bit approximation of 1/sqrt(x) as follows.\n\n\t    k := 0x5fe80000 - (x0>>1);\n\t    y0:= k - T2[63&(k>>14)].\t... y ~ 1/sqrt(x) to 7.8 bits\n\n\tHere k is a 32-bit integer and T2[] is an integer array\n\tcontaining correction terms. Now magically the floating\n\tvalue of y (y's leading 32-bit word is y0, the value of\n\tits trailing word y1 is set to zero) approximates 1/sqrt(x)\n\tto almost 7.8-bit.\n\n\tValue of T2:\n\tstatic int T2[64]= {\n\t0x1500,\t0x2ef8,\t0x4d67,\t0x6b02,\t0x87be,\t0xa395,\t0xbe7a,\t0xd866,\n\t0xf14a,\t0x1091b,0x11fcd,0x13552,0x14999,0x15c98,0x16e34,0x17e5f,\n\t0x18d03,0x19a01,0x1a545,0x1ae8a,0x1b5c4,0x1bb01,0x1bfde,0x1c28d,\n\t0x1c2de,0x1c0db,0x1ba73,0x1b11c,0x1a4b5,0x1953d,0x18266,0x16be0,\n\t0x1683e,0x179d8,0x18a4d,0x19992,0x1a789,0x1b445,0x1bf61,0x1c989,\n\t0x1d16d,0x1d77b,0x1dddf,0x1e2ad,0x1e5bf,0x1e6e8,0x1e654,0x1e3cd,\n\t0x1df2a,0x1d635,0x1cb16,0x1be2c,0x1ae4e,0x19bde,0x1868e,0x16e2e,\n\t0x1527f,0x1334a,0x11051,0xe951,\t0xbe01,\t0x8e0d,\t0x5924,\t0x1edd,};\n\n    (2)\tIterative refinement\n\n\tApply Reciproot iteration three times to y and multiply the\n\tresult by x to get an approximation z that matches sqrt(x)\n\tto about 1 ulp. To be exact, we will have\n\t\t-1ulp < sqrt(x)-z<1.0625ulp.\n\n\t... set rounding mode to Round-to-nearest\n\t   y := y*(1.5-0.5*x*y*y)\t... almost 15 sig. bits to 1/sqrt(x)\n\t   y := y*((1.5-2^-30)+0.5*x*y*y)... about 29 sig. bits to 1/sqrt(x)\n\t... special arrangement for better accuracy\n\t   z := x*y\t\t\t... 29 bits to sqrt(x), with z*y<1\n\t   z := z + 0.5*z*(1-z*y)\t... about 1 ulp to sqrt(x)\n\n\tRemark 2. The constant 1.5-2^-30 is chosen to bias the error so that\n\t(a) the term z*y in the final iteration is always less than 1;\n\t(b) the error in the final result is biased upward so that\n\t\t-1 ulp < sqrt(x) - z < 1.0625 ulp\n\t    instead of |sqrt(x)-z|<1.03125ulp.\n\n    (3)\tFinal adjustment\n\n\tBy twiddling y's last bit it is possible to force y to be\n\tcorrectly rounded according to the prevailing rounding mode\n\tas follows. Let r and i be copies of the rounding mode and\n\tinexact flag before entering the square root program. Also we\n\tuse the expression y+-ulp for the next representable floating\n\tnumbers (up and down) of y. Note that y+-ulp = either fixed\n\tpoint y+-1, or multiply y by nextafter(1,+-inf) in chopped\n\tmode.\n\n\tR := RZ;\t\t... set rounding mode to round-toward-zero\n\tswitch(r) {\n\t    case RN:\t\t... round-to-nearest\n\t       if(x<= z*(z-ulp)...chopped) z = z - ulp; else\n\t       if(x<= z*(z+ulp)...chopped) z = z; else z = z+ulp;\n\t       break;\n\t    case RZ:case RM:\t... round-to-zero or round-to--inf\n\t       R:=RP;\t\t... reset rounding mod to round-to-+inf\n\t       if(x<z*z ... rounded up) z = z - ulp; else\n\t       if(x>=(z+ulp)*(z+ulp) ...rounded up) z = z+ulp;\n\t       break;\n\t    case RP:\t\t... round-to-+inf\n\t       if(x>(z+ulp)*(z+ulp)...chopped) z = z+2*ulp; else\n\t       if(x>z*z ...chopped) z = z+ulp;\n\t       break;\n\t}\n\n\tRemark 3. The above comparisons can be done in fixed point. For\n\texample, to compare x and w=z*z chopped, it suffices to compare\n\tx1 and w1 (the trailing parts of x and w), regarding them as\n\ttwo's complement integers.\n\n\t...Is z an exact square root?\n\tTo determine whether z is an exact square root of x, let z1 be the\n\ttrailing part of z, and also let x0 and x1 be the leading and\n\ttrailing parts of x.\n\n\tIf ((z1&0x03ffffff)!=0)\t... not exact if trailing 26 bits of z!=0\n\t    I := 1;\t\t... Raise Inexact flag: z is not exact\n\telse {\n\t    j := 1 - [(x0>>20)&1]\t... j = logb(x) mod 2\n\t    k := z1 >> 26;\t\t... get z's 25-th and 26-th\n\t\t\t\t\t    fraction bits\n\t    I := i or (k&j) or ((k&(j+j+1))!=(x1&3));\n\t}\n\tR:= r\t\t... restore rounded mode\n\treturn sqrt(x):=z.\n\n\tIf multiplication is cheaper then the foregoing red tape, the\n\tInexact flag can be evaluated by\n\n\t    I := i;\n\t    I := (z*z!=x) or I.\n\n\tNote that z*z can overwrite I; this value must be sensed if it is\n\tTrue.\n\n\tRemark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be\n\tzero.\n\n\t\t    --------------------\n\t\tz1: |        f2        |\n\t\t    --------------------\n\t\tbit 31\t\t   bit 0\n\n\tFurther more, bit 27 and 26 of z1, bit 0 and 1 of x1, and the odd\n\tor even of logb(x) have the following relations:\n\n\t-------------------------------------------------\n\tbit 27,26 of z1\t\tbit 1,0 of x1\tlogb(x)\n\t-------------------------------------------------\n\t00\t\t\t00\t\todd and even\n\t01\t\t\t01\t\teven\n\t10\t\t\t10\t\todd\n\t10\t\t\t00\t\teven\n\t11\t\t\t01\t\teven\n\t-------------------------------------------------\n\n    (4)\tSpecial cases (see (4) of Section A).\n\n */\n"
  },
  {
    "path": "libs/SDL2/src/libm/k_cos.c",
    "content": "/* @(#)k_cos.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: k_cos.c,v 1.8 1995/05/10 20:46:22 jtc Exp $\";\n#endif\n\n/*\n * __kernel_cos( x,  y )\n * kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164\n * Input x is assumed to be bounded by ~pi/4 in magnitude.\n * Input y is the tail of x.\n *\n * Algorithm\n *\t1. Since cos(-x) = cos(x), we need only to consider positive x.\n *\t2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.\n *\t3. cos(x) is approximated by a polynomial of degree 14 on\n *\t   [0,pi/4]\n *\t\t  \t                 4            14\n *\t   \tcos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x\n *\t   where the remez error is\n *\n * \t|              2     4     6     8     10    12     14 |     -58\n * \t|cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x  +C6*x  )| <= 2\n * \t|    \t\t\t\t\t               |\n *\n * \t               4     6     8     10    12     14\n *\t4. let r = C1*x +C2*x +C3*x +C4*x +C5*x  +C6*x  , then\n *\t       cos(x) = 1 - x*x/2 + r\n *\t   since cos(x+y) ~ cos(x) - sin(x)*y\n *\t\t\t  ~ cos(x) - x*y,\n *\t   a correction term is necessary in cos(x) and hence\n *\t\tcos(x+y) = 1 - (x*x/2 - (r - x*y))\n *\t   For better accuracy when x > 0.3, let qx = |x|/4 with\n *\t   the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125.\n *\t   Then\n *\t\tcos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)).\n *\t   Note that 1-qx and (x*x/2-qx) is EXACT here, and the\n *\t   magnitude of the latter is at least a quarter of x*x/2,\n *\t   thus, reducing the rounding error in the subtraction.\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\n#ifdef __STDC__\nstatic const double\n#else\nstatic double\n#endif\n  one = 1.00000000000000000000e+00,     /* 0x3FF00000, 0x00000000 */\n    C1 = 4.16666666666666019037e-02,    /* 0x3FA55555, 0x5555554C */\n    C2 = -1.38888888888741095749e-03,   /* 0xBF56C16C, 0x16C15177 */\n    C3 = 2.48015872894767294178e-05,    /* 0x3EFA01A0, 0x19CB1590 */\n    C4 = -2.75573143513906633035e-07,   /* 0xBE927E4F, 0x809C52AD */\n    C5 = 2.08757232129817482790e-09,    /* 0x3E21EE9E, 0xBDB4B1C4 */\n    C6 = -1.13596475577881948265e-11;   /* 0xBDA8FAE9, 0xBE8838D4 */\n\n#ifdef __STDC__\ndouble attribute_hidden\n__kernel_cos(double x, double y)\n#else\ndouble attribute_hidden\n__kernel_cos(x, y)\n     double x, y;\n#endif\n{\n    double a, hz, z, r, qx;\n    int32_t ix;\n    GET_HIGH_WORD(ix, x);\n    ix &= 0x7fffffff;           /* ix = |x|'s high word */\n    if (ix < 0x3e400000) {      /* if x < 2**27 */\n        if (((int) x) == 0)\n            return one;         /* generate inexact */\n    }\n    z = x * x;\n    r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * C6)))));\n    if (ix < 0x3FD33333)        /* if |x| < 0.3 */\n        return one - (0.5 * z - (z * r - x * y));\n    else {\n        if (ix > 0x3fe90000) {  /* x > 0.78125 */\n            qx = 0.28125;\n        } else {\n            INSERT_WORDS(qx, ix - 0x00200000, 0);       /* x/4 */\n        }\n        hz = 0.5 * z - qx;\n        a = one - qx;\n        return a - (hz - (z * r - x * y));\n    }\n}\n"
  },
  {
    "path": "libs/SDL2/src/libm/k_rem_pio2.c",
    "content": "/* @(#)k_rem_pio2.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: k_rem_pio2.c,v 1.7 1995/05/10 20:46:25 jtc Exp $\";\n#endif\n\n/*\n * __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)\n * double x[],y[]; int e0,nx,prec; int ipio2[];\n *\n * __kernel_rem_pio2 return the last three digits of N with\n *\t\ty = x - N*pi/2\n * so that |y| < pi/2.\n *\n * The method is to compute the integer (mod 8) and fraction parts of\n * (2/pi)*x without doing the full multiplication. In general we\n * skip the part of the product that are known to be a huge integer (\n * more accurately, = 0 mod 8 ). Thus the number of operations are\n * independent of the exponent of the input.\n *\n * (2/pi) is represented by an array of 24-bit integers in ipio2[].\n *\n * Input parameters:\n * \tx[]\tThe input value (must be positive) is broken into nx\n *\t\tpieces of 24-bit integers in double precision format.\n *\t\tx[i] will be the i-th 24 bit of x. The scaled exponent\n *\t\tof x[0] is given in input parameter e0 (i.e., x[0]*2^e0\n *\t\tmatch x's up to 24 bits.\n *\n *\t\tExample of breaking a double positive z into x[0]+x[1]+x[2]:\n *\t\t\te0 = ilogb(z)-23\n *\t\t\tz  = scalbn(z,-e0)\n *\t\tfor i = 0,1,2\n *\t\t\tx[i] = floor(z)\n *\t\t\tz    = (z-x[i])*2**24\n *\n *\n *\ty[]\touput result in an array of double precision numbers.\n *\t\tThe dimension of y[] is:\n *\t\t\t24-bit  precision\t1\n *\t\t\t53-bit  precision\t2\n *\t\t\t64-bit  precision\t2\n *\t\t\t113-bit precision\t3\n *\t\tThe actual value is the sum of them. Thus for 113-bit\n *\t\tprecison, one may have to do something like:\n *\n *\t\tlong double t,w,r_head, r_tail;\n *\t\tt = (long double)y[2] + (long double)y[1];\n *\t\tw = (long double)y[0];\n *\t\tr_head = t+w;\n *\t\tr_tail = w - (r_head - t);\n *\n *\te0\tThe exponent of x[0]\n *\n *\tnx\tdimension of x[]\n *\n *  \tprec\tan integer indicating the precision:\n *\t\t\t0\t24  bits (single)\n *\t\t\t1\t53  bits (double)\n *\t\t\t2\t64  bits (extended)\n *\t\t\t3\t113 bits (quad)\n *\n *\tipio2[]\n *\t\tinteger array, contains the (24*i)-th to (24*i+23)-th\n *\t\tbit of 2/pi after binary point. The corresponding\n *\t\tfloating value is\n *\n *\t\t\tipio2[i] * 2^(-24(i+1)).\n *\n * External function:\n *\tdouble scalbn(), floor();\n *\n *\n * Here is the description of some local variables:\n *\n * \tjk\tjk+1 is the initial number of terms of ipio2[] needed\n *\t\tin the computation. The recommended value is 2,3,4,\n *\t\t6 for single, double, extended,and quad.\n *\n * \tjz\tlocal integer variable indicating the number of\n *\t\tterms of ipio2[] used.\n *\n *\tjx\tnx - 1\n *\n *\tjv\tindex for pointing to the suitable ipio2[] for the\n *\t\tcomputation. In general, we want\n *\t\t\t( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8\n *\t\tis an integer. Thus\n *\t\t\te0-3-24*jv >= 0 or (e0-3)/24 >= jv\n *\t\tHence jv = max(0,(e0-3)/24).\n *\n *\tjp\tjp+1 is the number of terms in PIo2[] needed, jp = jk.\n *\n * \tq[]\tdouble array with integral value, representing the\n *\t\t24-bits chunk of the product of x and 2/pi.\n *\n *\tq0\tthe corresponding exponent of q[0]. Note that the\n *\t\texponent for q[i] would be q0-24*i.\n *\n *\tPIo2[]\tdouble precision array, obtained by cutting pi/2\n *\t\tinto 24 bits chunks.\n *\n *\tf[]\tipio2[] in floating point\n *\n *\tiq[]\tinteger array by breaking up q[] in 24-bits chunk.\n *\n *\tfq[]\tfinal product of x*(2/pi) in fq[0],..,fq[jk]\n *\n *\tih\tinteger. If >0 it indicates q[] is >= 0.5, hence\n *\t\tit also indicates the *sign* of the result.\n *\n */\n\n\n/*\n * Constants:\n * The hexadecimal values are the intended ones for the following\n * constants. The decimal values may be used, provided that the\n * compiler will convert from decimal to binary accurately enough\n * to produce the hexadecimal values shown.\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\n#include \"SDL_assert.h\"\n\nlibm_hidden_proto(scalbn)\n    libm_hidden_proto(floor)\n#ifdef __STDC__\n     static const int init_jk[] = { 2, 3, 4, 6 };       /* initial value for jk */\n#else\n     static int init_jk[] = { 2, 3, 4, 6 };\n#endif\n\n#ifdef __STDC__\nstatic const double PIo2[] = {\n#else\nstatic double PIo2[] = {\n#endif\n    1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */\n    7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */\n    5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */\n    3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */\n    1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */\n    1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */\n    2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */\n    2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */\n};\n\n#ifdef __STDC__\nstatic const double\n#else\nstatic double\n#endif\n  zero = 0.0, one = 1.0, two24 = 1.67772160000000000000e+07,    /* 0x41700000, 0x00000000 */\n    twon24 = 5.96046447753906250000e-08;        /* 0x3E700000, 0x00000000 */\n\n#ifdef __STDC__\nint attribute_hidden\n__kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec,\n                  const int32_t * ipio2)\n#else\nint attribute_hidden\n__kernel_rem_pio2(x, y, e0, nx, prec, ipio2)\n     double x[], y[];\n     int e0, nx, prec;\n     int32_t ipio2[];\n#endif\n{\n    int32_t jz, jx, jv, jp, jk, carry, n, iq[20], i, j, k, m, q0, ih;\n    double z, fw, f[20], fq[20], q[20];\n\n    /* initialize jk */\n    SDL_assert((prec >= 0) && (prec < SDL_arraysize(init_jk)));\n    jk = init_jk[prec];\n    SDL_assert((jk >= 2) && (jk <= 6));\n    jp = jk;\n\n    /* determine jx,jv,q0, note that 3>q0 */\n    SDL_assert(nx > 0);\n    jx = nx - 1;\n    jv = (e0 - 3) / 24;\n    if (jv < 0)\n        jv = 0;\n    q0 = e0 - 24 * (jv + 1);\n\n    /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */\n    j = jv - jx;\n    m = jx + jk;\n    for (i = 0; i <= m; i++, j++)\n        f[i] = (j < 0) ? zero : (double) ipio2[j];\n\n    /* compute q[0],q[1],...q[jk] */\n    for (i = 0; i <= jk; i++) {\n        for (j = 0, fw = 0.0; j <= jx; j++)\n            fw += x[j] * f[jx + i - j];\n        q[i] = fw;\n    }\n\n    jz = jk;\n  recompute:\n    /* distill q[] into iq[] reversingly */\n    for (i = 0, j = jz, z = q[jz]; j > 0; i++, j--) {\n        fw = (double) ((int32_t) (twon24 * z));\n        iq[i] = (int32_t) (z - two24 * fw);\n        z = q[j - 1] + fw;\n    }\n\n    /* compute n */\n    z = scalbn(z, q0);          /* actual value of z */\n    z -= 8.0 * floor(z * 0.125);        /* trim off integer >= 8 */\n    n = (int32_t) z;\n    z -= (double) n;\n    ih = 0;\n    if (q0 > 0) {               /* need iq[jz-1] to determine n */\n        i = (iq[jz - 1] >> (24 - q0));\n        n += i;\n        iq[jz - 1] -= i << (24 - q0);\n        ih = iq[jz - 1] >> (23 - q0);\n    } else if (q0 == 0)\n        ih = iq[jz - 1] >> 23;\n    else if (z >= 0.5)\n        ih = 2;\n\n    if (ih > 0) {               /* q > 0.5 */\n        n += 1;\n        carry = 0;\n        for (i = 0; i < jz; i++) {      /* compute 1-q */\n            j = iq[i];\n            if (carry == 0) {\n                if (j != 0) {\n                    carry = 1;\n                    iq[i] = 0x1000000 - j;\n                }\n            } else\n                iq[i] = 0xffffff - j;\n        }\n        if (q0 > 0) {           /* rare case: chance is 1 in 12 */\n            switch (q0) {\n            case 1:\n                iq[jz - 1] &= 0x7fffff;\n                break;\n            case 2:\n                iq[jz - 1] &= 0x3fffff;\n                break;\n            }\n        }\n        if (ih == 2) {\n            z = one - z;\n            if (carry != 0)\n                z -= scalbn(one, q0);\n        }\n    }\n\n    /* check if recomputation is needed */\n    if (z == zero) {\n        j = 0;\n        for (i = jz - 1; i >= jk; i--)\n            j |= iq[i];\n        if (j == 0) {           /* need recomputation */\n            for (k = 1; iq[jk - k] == 0; k++);  /* k = no. of terms needed */\n\n            for (i = jz + 1; i <= jz + k; i++) {        /* add q[jz+1] to q[jz+k] */\n                f[jx + i] = (double) ipio2[jv + i];\n                for (j = 0, fw = 0.0; j <= jx; j++)\n                    fw += x[j] * f[jx + i - j];\n                q[i] = fw;\n            }\n            jz += k;\n            goto recompute;\n        }\n    }\n\n    /* chop off zero terms */\n    if (z == 0.0) {\n        jz -= 1;\n        q0 -= 24;\n        while (iq[jz] == 0) {\n            jz--;\n            q0 -= 24;\n        }\n    } else {                    /* break z into 24-bit if necessary */\n        z = scalbn(z, -q0);\n        if (z >= two24) {\n            fw = (double) ((int32_t) (twon24 * z));\n            iq[jz] = (int32_t) (z - two24 * fw);\n            jz += 1;\n            q0 += 24;\n            iq[jz] = (int32_t) fw;\n        } else\n            iq[jz] = (int32_t) z;\n    }\n\n    /* convert integer \"bit\" chunk to floating-point value */\n    fw = scalbn(one, q0);\n    for (i = jz; i >= 0; i--) {\n        q[i] = fw * (double) iq[i];\n        fw *= twon24;\n    }\n\n    /* compute PIo2[0,...,jp]*q[jz,...,0] */\n    for (i = jz; i >= 0; i--) {\n        for (fw = 0.0, k = 0; k <= jp && k <= jz - i; k++)\n            fw += PIo2[k] * q[i + k];\n        fq[jz - i] = fw;\n    }\n\n    /* compress fq[] into y[] */\n    switch (prec) {\n    case 0:\n        fw = 0.0;\n        for (i = jz; i >= 0; i--)\n            fw += fq[i];\n        y[0] = (ih == 0) ? fw : -fw;\n        break;\n    case 1:\n    case 2:\n        fw = 0.0;\n        for (i = jz; i >= 0; i--)\n            fw += fq[i];\n        y[0] = (ih == 0) ? fw : -fw;\n        fw = fq[0] - fw;\n        for (i = 1; i <= jz; i++)\n            fw += fq[i];\n        y[1] = (ih == 0) ? fw : -fw;\n        break;\n    case 3:                    /* painful */\n        for (i = jz; i > 0; i--) {\n            fw = fq[i - 1] + fq[i];\n            fq[i] += fq[i - 1] - fw;\n            fq[i - 1] = fw;\n        }\n        for (i = jz; i > 1; i--) {\n            fw = fq[i - 1] + fq[i];\n            fq[i] += fq[i - 1] - fw;\n            fq[i - 1] = fw;\n        }\n        for (fw = 0.0, i = jz; i >= 2; i--)\n            fw += fq[i];\n        if (ih == 0) {\n            y[0] = fq[0];\n            y[1] = fq[1];\n            y[2] = fw;\n        } else {\n            y[0] = -fq[0];\n            y[1] = -fq[1];\n            y[2] = -fw;\n        }\n    }\n    return n & 7;\n}\n"
  },
  {
    "path": "libs/SDL2/src/libm/k_sin.c",
    "content": "/* @(#)k_sin.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: k_sin.c,v 1.8 1995/05/10 20:46:31 jtc Exp $\";\n#endif\n\n/* __kernel_sin( x, y, iy)\n * kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854\n * Input x is assumed to be bounded by ~pi/4 in magnitude.\n * Input y is the tail of x.\n * Input iy indicates whether y is 0. (if iy=0, y assume to be 0).\n *\n * Algorithm\n *\t1. Since sin(-x) = -sin(x), we need only to consider positive x.\n *\t2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.\n *\t3. sin(x) is approximated by a polynomial of degree 13 on\n *\t   [0,pi/4]\n *\t\t  \t         3            13\n *\t   \tsin(x) ~ x + S1*x + ... + S6*x\n *\t   where\n *\n * \t|sin(x)         2     4     6     8     10     12  |     -58\n * \t|----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x  +S6*x   )| <= 2\n * \t|  x \t\t\t\t\t           |\n *\n *\t4. sin(x+y) = sin(x) + sin'(x')*y\n *\t\t    ~ sin(x) + (1-x*x/2)*y\n *\t   For better accuracy, let\n *\t\t     3      2      2      2      2\n *\t\tr = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))\n *\t   then                   3    2\n *\t\tsin(x) = x + (S1*x + (x *(r-y/2)+y))\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\n#ifdef __STDC__\nstatic const double\n#else\nstatic double\n#endif\n  half = 5.00000000000000000000e-01,    /* 0x3FE00000, 0x00000000 */\n    S1 = -1.66666666666666324348e-01,   /* 0xBFC55555, 0x55555549 */\n    S2 = 8.33333333332248946124e-03,    /* 0x3F811111, 0x1110F8A6 */\n    S3 = -1.98412698298579493134e-04,   /* 0xBF2A01A0, 0x19C161D5 */\n    S4 = 2.75573137070700676789e-06,    /* 0x3EC71DE3, 0x57B1FE7D */\n    S5 = -2.50507602534068634195e-08,   /* 0xBE5AE5E6, 0x8A2B9CEB */\n    S6 = 1.58969099521155010221e-10;    /* 0x3DE5D93A, 0x5ACFD57C */\n\n#ifdef __STDC__\ndouble attribute_hidden\n__kernel_sin(double x, double y, int iy)\n#else\ndouble attribute_hidden\n__kernel_sin(x, y, iy)\n     double x, y;\n     int iy;                    /* iy=0 if y is zero */\n#endif\n{\n    double z, r, v;\n    int32_t ix;\n    GET_HIGH_WORD(ix, x);\n    ix &= 0x7fffffff;           /* high word of x */\n    if (ix < 0x3e400000) {      /* |x| < 2**-27 */\n        if ((int) x == 0)\n            return x;\n    }                           /* generate inexact */\n    z = x * x;\n    v = z * x;\n    r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6)));\n    if (iy == 0)\n        return x + v * (S1 + z * r);\n    else\n        return x - ((z * (half * y - v * r) - y) - v * S1);\n}\n"
  },
  {
    "path": "libs/SDL2/src/libm/k_tan.c",
    "content": "/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n/* __kernel_tan( x, y, k )\n * kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854\n * Input x is assumed to be bounded by ~pi/4 in magnitude.\n * Input y is the tail of x.\n * Input k indicates whether tan (if k=1) or\n * -1/tan (if k= -1) is returned.\n *\n * Algorithm\n *\t1. Since tan(-x) = -tan(x), we need only to consider positive x.\n *\t2. if x < 2^-28 (hx<0x3e300000 0), return x with inexact if x!=0.\n *\t3. tan(x) is approximated by a odd polynomial of degree 27 on\n *\t   [0,0.67434]\n *\t\t  \t         3             27\n *\t   \ttan(x) ~ x + T1*x + ... + T13*x\n *\t   where\n *\n * \t        |tan(x)         2     4            26   |     -59.2\n * \t        |----- - (1+T1*x +T2*x +.... +T13*x    )| <= 2\n * \t        |  x \t\t\t\t\t|\n *\n *\t   Note: tan(x+y) = tan(x) + tan'(x)*y\n *\t\t          ~ tan(x) + (1+x*x)*y\n *\t   Therefore, for better accuracy in computing tan(x+y), let\n *\t\t     3      2      2       2       2\n *\t\tr = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))\n *\t   then\n *\t\t \t\t    3    2\n *\t\ttan(x+y) = x + (T1*x + (x *(r+y)+y))\n *\n *      4. For x in [0.67434,pi/4],  let y = pi/4 - x, then\n *\t\ttan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))\n *\t\t       = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nstatic const double\none   =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */\npio4  =  7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */\npio4lo=  3.06161699786838301793e-17, /* 0x3C81A626, 0x33145C07 */\nT[] =  {\n  3.33333333333334091986e-01, /* 0x3FD55555, 0x55555563 */\n  1.33333333333201242699e-01, /* 0x3FC11111, 0x1110FE7A */\n  5.39682539762260521377e-02, /* 0x3FABA1BA, 0x1BB341FE */\n  2.18694882948595424599e-02, /* 0x3F9664F4, 0x8406D637 */\n  8.86323982359930005737e-03, /* 0x3F8226E3, 0xE96E8493 */\n  3.59207910759131235356e-03, /* 0x3F6D6D22, 0xC9560328 */\n  1.45620945432529025516e-03, /* 0x3F57DBC8, 0xFEE08315 */\n  5.88041240820264096874e-04, /* 0x3F4344D8, 0xF2F26501 */\n  2.46463134818469906812e-04, /* 0x3F3026F7, 0x1A8D1068 */\n  7.81794442939557092300e-05, /* 0x3F147E88, 0xA03792A6 */\n  7.14072491382608190305e-05, /* 0x3F12B80F, 0x32F0A7E9 */\n -1.85586374855275456654e-05, /* 0xBEF375CB, 0xDB605373 */\n  2.59073051863633712884e-05, /* 0x3EFB2A70, 0x74BF7AD4 */\n};\n\ndouble __kernel_tan(double x, double y, int iy)\n{\n\tdouble z,r,v,w,s;\n\tint32_t ix,hx;\n\tGET_HIGH_WORD(hx,x);\n\tix = hx&0x7fffffff;\t/* high word of |x| */\n\tif(ix<0x3e300000)\t\t\t/* x < 2**-28 */\n\t    {if((int)x==0) {\t\t\t/* generate inexact */\n\t        u_int32_t low;\n\t\tGET_LOW_WORD(low,x);\n\t\tif(((ix|low)|(iy+1))==0) return one/fabs(x);\n\t\telse return (iy==1)? x: -one/x;\n\t    }\n\t    }\n\tif(ix>=0x3FE59428) { \t\t\t/* |x|>=0.6744 */\n\t    if(hx<0) {x = -x; y = -y;}\n\t    z = pio4-x;\n\t    w = pio4lo-y;\n\t    x = z+w; y = 0.0;\n\t}\n\tz\t=  x*x;\n\tw \t=  z*z;\n    /* Break x^5*(T[1]+x^2*T[2]+...) into\n     *\t  x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +\n     *\t  x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))\n     */\n\tr = T[1]+w*(T[3]+w*(T[5]+w*(T[7]+w*(T[9]+w*T[11]))));\n\tv = z*(T[2]+w*(T[4]+w*(T[6]+w*(T[8]+w*(T[10]+w*T[12])))));\n\ts = z*x;\n\tr = y + z*(s*(r+v)+y);\n\tr += T[0]*s;\n\tw = x+r;\n\tif(ix>=0x3FE59428) {\n\t    v = (double)iy;\n\t    return (double)(1-((hx>>30)&2))*(v-2.0*(x-(w*w/(w+v)-r)));\n\t}\n\tif(iy==1) return w;\n\telse {\t\t/* if allow error up to 2 ulp,\n\t\t\t   simply return -1.0/(x+r) here */\n     /*  compute -1.0/(x+r) accurately */\n\t    double a,t;\n\t    z  = w;\n\t    SET_LOW_WORD(z,0);\n\t    v  = r-(z - x); \t/* z+v = r+x */\n\t    t = a  = -1.0/w;\t/* a = -1.0/w */\n\t    SET_LOW_WORD(t,0);\n\t    s  = 1.0+t*z;\n\t    return t+a*(s+t*v);\n\t}\n}\n"
  },
  {
    "path": "libs/SDL2/src/libm/math_libm.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Math routines from uClibc: http://www.uclibc.org */\n\ndouble SDL_uclibc_atan(double x);\ndouble SDL_uclibc_atan2(double y, double x);    \ndouble SDL_uclibc_copysign(double x, double y);       \ndouble SDL_uclibc_cos(double x);         \ndouble SDL_uclibc_fabs(double x);        \ndouble SDL_uclibc_floor(double x);\ndouble SDL_uclibc_log(double x);\ndouble SDL_uclibc_pow(double x, double y);    \ndouble SDL_uclibc_scalbn(double x, int n);\ndouble SDL_uclibc_sin(double x);\ndouble SDL_uclibc_sqrt(double x);\ndouble SDL_uclibc_tan(double x);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/libm/math_private.h",
    "content": "/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n/*\n * from: @(#)fdlibm.h 5.1 93/09/24\n * $Id: math_private.h,v 1.3 2004/02/09 07:10:38 andersen Exp $\n */\n\n#ifndef _MATH_PRIVATE_H_\n#define _MATH_PRIVATE_H_\n\n/* #include <endian.h> */\n#include \"SDL_endian.h\"\n/* #include <sys/types.h> */\n\n#define attribute_hidden\n#define libm_hidden_proto(x)\n#define libm_hidden_def(x)\n\n#ifndef __HAIKU__ /* already defined in a system header. */\ntypedef unsigned int u_int32_t;\n#endif\n\n#define atan            SDL_uclibc_atan\n#define __ieee754_atan2 SDL_uclibc_atan2\n#define copysign        SDL_uclibc_copysign\n#define cos             SDL_uclibc_cos\n#define fabs            SDL_uclibc_fabs\n#define floor           SDL_uclibc_floor\n#define __ieee754_log   SDL_uclibc_log\n#define __ieee754_pow   SDL_uclibc_pow\n#define scalbn          SDL_uclibc_scalbn\n#define sin             SDL_uclibc_sin\n#define __ieee754_sqrt  SDL_uclibc_sqrt\n#define tan             SDL_uclibc_tan\n\n/* The original fdlibm code used statements like:\n\tn0 = ((*(int*)&one)>>29)^1;\t\t* index of high word *\n\tix0 = *(n0+(int*)&x);\t\t\t* high word of x *\n\tix1 = *((1-n0)+(int*)&x);\t\t* low word of x *\n   to dig two 32 bit words out of the 64 bit IEEE floating point\n   value.  That is non-ANSI, and, moreover, the gcc instruction\n   scheduler gets it wrong.  We instead use the following macros.\n   Unlike the original code, we determine the endianness at compile\n   time, not at run time; I don't see much benefit to selecting\n   endianness at run time.  */\n\n/* A union which permits us to convert between a double and two 32 bit\n   ints.  */\n\n/*\n * Math on arm is special:\n * For FPA, float words are always big-endian.\n * For VFP, floats words follow the memory system mode.\n */\n\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n\ntypedef union\n{\n    double value;\n    struct\n    {\n        u_int32_t msw;\n        u_int32_t lsw;\n    } parts;\n} ieee_double_shape_type;\n\n#else\n\ntypedef union\n{\n    double value;\n    struct\n    {\n        u_int32_t lsw;\n        u_int32_t msw;\n    } parts;\n} ieee_double_shape_type;\n\n#endif\n\n/* Get two 32 bit ints from a double.  */\n\n#define EXTRACT_WORDS(ix0,ix1,d)\t\t\t\t\\\ndo {\t\t\t\t\t\t\t\t\\\n  ieee_double_shape_type ew_u;\t\t\t\t\t\\\n  ew_u.value = (d);\t\t\t\t\t\t\\\n  (ix0) = ew_u.parts.msw;\t\t\t\t\t\\\n  (ix1) = ew_u.parts.lsw;\t\t\t\t\t\\\n} while (0)\n\n/* Get the more significant 32 bit int from a double.  */\n\n#define GET_HIGH_WORD(i,d)\t\t\t\t\t\\\ndo {\t\t\t\t\t\t\t\t\\\n  ieee_double_shape_type gh_u;\t\t\t\t\t\\\n  gh_u.value = (d);\t\t\t\t\t\t\\\n  (i) = gh_u.parts.msw;\t\t\t\t\t\t\\\n} while (0)\n\n/* Get the less significant 32 bit int from a double.  */\n\n#define GET_LOW_WORD(i,d)\t\t\t\t\t\\\ndo {\t\t\t\t\t\t\t\t\\\n  ieee_double_shape_type gl_u;\t\t\t\t\t\\\n  gl_u.value = (d);\t\t\t\t\t\t\\\n  (i) = gl_u.parts.lsw;\t\t\t\t\t\t\\\n} while (0)\n\n/* Set a double from two 32 bit ints.  */\n\n#define INSERT_WORDS(d,ix0,ix1)\t\t\t\t\t\\\ndo {\t\t\t\t\t\t\t\t\\\n  ieee_double_shape_type iw_u;\t\t\t\t\t\\\n  iw_u.parts.msw = (ix0);\t\t\t\t\t\\\n  iw_u.parts.lsw = (ix1);\t\t\t\t\t\\\n  (d) = iw_u.value;\t\t\t\t\t\t\\\n} while (0)\n\n/* Set the more significant 32 bits of a double from an int.  */\n\n#define SET_HIGH_WORD(d,v)\t\t\t\t\t\\\ndo {\t\t\t\t\t\t\t\t\\\n  ieee_double_shape_type sh_u;\t\t\t\t\t\\\n  sh_u.value = (d);\t\t\t\t\t\t\\\n  sh_u.parts.msw = (v);\t\t\t\t\t\t\\\n  (d) = sh_u.value;\t\t\t\t\t\t\\\n} while (0)\n\n/* Set the less significant 32 bits of a double from an int.  */\n\n#define SET_LOW_WORD(d,v)\t\t\t\t\t\\\ndo {\t\t\t\t\t\t\t\t\\\n  ieee_double_shape_type sl_u;\t\t\t\t\t\\\n  sl_u.value = (d);\t\t\t\t\t\t\\\n  sl_u.parts.lsw = (v);\t\t\t\t\t\t\\\n  (d) = sl_u.value;\t\t\t\t\t\t\\\n} while (0)\n\n/* A union which permits us to convert between a float and a 32 bit\n   int.  */\n\ntypedef union\n{\n    float value;\n    u_int32_t word;\n} ieee_float_shape_type;\n\n/* Get a 32 bit int from a float.  */\n\n#define GET_FLOAT_WORD(i,d)\t\t\t\t\t\\\ndo {\t\t\t\t\t\t\t\t\\\n  ieee_float_shape_type gf_u;\t\t\t\t\t\\\n  gf_u.value = (d);\t\t\t\t\t\t\\\n  (i) = gf_u.word;\t\t\t\t\t\t\\\n} while (0)\n\n/* Set a float from a 32 bit int.  */\n\n#define SET_FLOAT_WORD(d,i)\t\t\t\t\t\\\ndo {\t\t\t\t\t\t\t\t\\\n  ieee_float_shape_type sf_u;\t\t\t\t\t\\\n  sf_u.word = (i);\t\t\t\t\t\t\\\n  (d) = sf_u.value;\t\t\t\t\t\t\\\n} while (0)\n\n/* ieee style elementary functions */\nextern double\n__ieee754_sqrt(double)\n    attribute_hidden;\n     extern double __ieee754_acos(double) attribute_hidden;\n     extern double __ieee754_acosh(double) attribute_hidden;\n     extern double __ieee754_log(double) attribute_hidden;\n     extern double __ieee754_atanh(double) attribute_hidden;\n     extern double __ieee754_asin(double) attribute_hidden;\n     extern double __ieee754_atan2(double, double) attribute_hidden;\n     extern double __ieee754_exp(double) attribute_hidden;\n     extern double __ieee754_cosh(double) attribute_hidden;\n     extern double __ieee754_fmod(double, double) attribute_hidden;\n     extern double __ieee754_pow(double, double) attribute_hidden;\n     extern double __ieee754_lgamma_r(double, int *) attribute_hidden;\n     extern double __ieee754_gamma_r(double, int *) attribute_hidden;\n     extern double __ieee754_lgamma(double) attribute_hidden;\n     extern double __ieee754_gamma(double) attribute_hidden;\n     extern double __ieee754_log10(double) attribute_hidden;\n     extern double __ieee754_sinh(double) attribute_hidden;\n     extern double __ieee754_hypot(double, double) attribute_hidden;\n     extern double __ieee754_j0(double) attribute_hidden;\n     extern double __ieee754_j1(double) attribute_hidden;\n     extern double __ieee754_y0(double) attribute_hidden;\n     extern double __ieee754_y1(double) attribute_hidden;\n     extern double __ieee754_jn(int, double) attribute_hidden;\n     extern double __ieee754_yn(int, double) attribute_hidden;\n     extern double __ieee754_remainder(double, double) attribute_hidden;\n     extern int __ieee754_rem_pio2(double, double *) attribute_hidden;\n#if defined(_SCALB_INT)\n     extern double __ieee754_scalb(double, int) attribute_hidden;\n#else\n     extern double __ieee754_scalb(double, double) attribute_hidden;\n#endif\n\n/* fdlibm kernel function */\n#ifndef _IEEE_LIBM\n     extern double __kernel_standard(double, double, int) attribute_hidden;\n#endif\n     extern double __kernel_sin(double, double, int) attribute_hidden;\n     extern double __kernel_cos(double, double) attribute_hidden;\n     extern double __kernel_tan(double, double, int) attribute_hidden;\n     extern int __kernel_rem_pio2(double *, double *, int, int, int,\n                                  const int *) attribute_hidden;\n\n#endif /* _MATH_PRIVATE_H_ */\n"
  },
  {
    "path": "libs/SDL2/src/libm/s_atan.c",
    "content": "/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n/* atan(x)\n * Method\n *   1. Reduce x to positive by atan(x) = -atan(-x).\n *   2. According to the integer k=4t+0.25 chopped, t=x, the argument\n *      is further reduced to one of the following intervals and the\n *      arctangent of t is evaluated by the corresponding formula:\n *\n *      [0,7/16]      atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)\n *      [7/16,11/16]  atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )\n *      [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )\n *      [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )\n *      [39/16,INF]   atan(x) = atan(INF) + atan( -1/t )\n *\n * Constants:\n * The hexadecimal values are the intended ones for the following\n * constants. The decimal values may be used, provided that the\n * compiler will convert from decimal to binary accurately enough\n * to produce the hexadecimal values shown.\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nstatic const double atanhi[] = {\n  4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */\n  7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */\n  9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */\n  1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */\n};\n\nstatic const double atanlo[] = {\n  2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */\n  3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */\n  1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */\n  6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */\n};\n\nstatic const double aT[] = {\n  3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */\n -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */\n  1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */\n -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */\n  9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */\n -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */\n  6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */\n -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */\n  4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */\n -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */\n  1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */\n};\n\nstatic const double\none   = 1.0,\nhuge   = 1.0e300;\n\ndouble atan(double x)\n{\n\tdouble w,s1,s2,z;\n\tint32_t ix,hx,id;\n\n\tGET_HIGH_WORD(hx,x);\n\tix = hx&0x7fffffff;\n\tif(ix>=0x44100000) {\t/* if |x| >= 2^66 */\n\t    u_int32_t low;\n\t    GET_LOW_WORD(low,x);\n\t    if(ix>0x7ff00000||\n\t\t(ix==0x7ff00000&&(low!=0)))\n\t\treturn x+x;\t\t/* NaN */\n\t    if(hx>0) return  atanhi[3]+atanlo[3];\n\t    else     return -atanhi[3]-atanlo[3];\n\t} if (ix < 0x3fdc0000) {\t/* |x| < 0.4375 */\n\t    if (ix < 0x3e200000) {\t/* |x| < 2^-29 */\n\t\tif(huge+x>one) return x;\t/* raise inexact */\n\t    }\n\t    id = -1;\n\t} else {\n\tx = fabs(x);\n\tif (ix < 0x3ff30000) {\t\t/* |x| < 1.1875 */\n\t    if (ix < 0x3fe60000) {\t/* 7/16 <=|x|<11/16 */\n\t\tid = 0; x = (2.0*x-one)/(2.0+x);\n\t    } else {\t\t\t/* 11/16<=|x|< 19/16 */\n\t\tid = 1; x  = (x-one)/(x+one);\n\t    }\n\t} else {\n\t    if (ix < 0x40038000) {\t/* |x| < 2.4375 */\n\t\tid = 2; x  = (x-1.5)/(one+1.5*x);\n\t    } else {\t\t\t/* 2.4375 <= |x| < 2^66 */\n\t\tid = 3; x  = -1.0/x;\n\t    }\n\t}}\n    /* end of argument reduction */\n\tz = x*x;\n\tw = z*z;\n    /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */\n\ts1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));\n\ts2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));\n\tif (id<0) return x - x*(s1+s2);\n\telse {\n\t    z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);\n\t    return (hx<0)? -z:z;\n\t}\n}\nlibm_hidden_def(atan)\n\n"
  },
  {
    "path": "libs/SDL2/src/libm/s_copysign.c",
    "content": "/* @(#)s_copysign.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: s_copysign.c,v 1.8 1995/05/10 20:46:57 jtc Exp $\";\n#endif\n\n/*\n * copysign(double x, double y)\n * copysign(x,y) returns a value with the magnitude of x and\n * with the sign bit of y.\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nlibm_hidden_proto(copysign)\n#ifdef __STDC__\n     double copysign(double x, double y)\n#else\n     double copysign(x, y)\n     double x, y;\n#endif\n{\n    u_int32_t hx, hy;\n    GET_HIGH_WORD(hx, x);\n    GET_HIGH_WORD(hy, y);\n    SET_HIGH_WORD(x, (hx & 0x7fffffff) | (hy & 0x80000000));\n    return x;\n}\n\nlibm_hidden_def(copysign)\n"
  },
  {
    "path": "libs/SDL2/src/libm/s_cos.c",
    "content": "/* @(#)s_cos.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: s_cos.c,v 1.7 1995/05/10 20:47:02 jtc Exp $\";\n#endif\n\n/* cos(x)\n * Return cosine function of x.\n *\n * kernel function:\n *\t__kernel_sin\t\t... sine function on [-pi/4,pi/4]\n *\t__kernel_cos\t\t... cosine function on [-pi/4,pi/4]\n *\t__ieee754_rem_pio2\t... argument reduction routine\n *\n * Method.\n *      Let S,C and T denote the sin, cos and tan respectively on\n *\t[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2\n *\tin [-pi/4 , +pi/4], and let n = k mod 4.\n *\tWe have\n *\n *          n        sin(x)      cos(x)        tan(x)\n *     ----------------------------------------------------------\n *\t    0\t       S\t   C\t\t T\n *\t    1\t       C\t  -S\t\t-1/T\n *\t    2\t      -S\t  -C\t\t T\n *\t    3\t      -C\t   S\t\t-1/T\n *     ----------------------------------------------------------\n *\n * Special cases:\n *      Let trig be any of sin, cos, or tan.\n *      trig(+-INF)  is NaN, with signals;\n *      trig(NaN)    is that NaN;\n *\n * Accuracy:\n *\tTRIG(x) returns trig(x) nearly rounded\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nlibm_hidden_proto(cos)\n#ifdef __STDC__\n     double cos(double x)\n#else\n     double cos(x)\n     double x;\n#endif\n{\n    double y[2], z = 0.0;\n    int32_t n, ix;\n\n    /* High word of x. */\n    GET_HIGH_WORD(ix, x);\n\n    /* |x| ~< pi/4 */\n    ix &= 0x7fffffff;\n    if (ix <= 0x3fe921fb)\n        return __kernel_cos(x, z);\n\n    /* cos(Inf or NaN) is NaN */\n    else if (ix >= 0x7ff00000)\n        return x - x;\n\n    /* argument reduction needed */\n    else {\n        n = __ieee754_rem_pio2(x, y);\n        switch (n & 3) {\n        case 0:\n            return __kernel_cos(y[0], y[1]);\n        case 1:\n            return -__kernel_sin(y[0], y[1], 1);\n        case 2:\n            return -__kernel_cos(y[0], y[1]);\n        default:\n            return __kernel_sin(y[0], y[1], 1);\n        }\n    }\n}\n\nlibm_hidden_def(cos)\n"
  },
  {
    "path": "libs/SDL2/src/libm/s_fabs.c",
    "content": "/* @(#)s_fabs.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: s_fabs.c,v 1.7 1995/05/10 20:47:13 jtc Exp $\";\n#endif\n\n/*\n * fabs(x) returns the absolute value of x.\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nlibm_hidden_proto(fabs)\n#ifdef __STDC__\n     double fabs(double x)\n#else\n     double fabs(x)\n     double x;\n#endif\n{\n    u_int32_t high;\n    GET_HIGH_WORD(high, x);\n    SET_HIGH_WORD(x, high & 0x7fffffff);\n    return x;\n}\n\nlibm_hidden_def(fabs)\n"
  },
  {
    "path": "libs/SDL2/src/libm/s_floor.c",
    "content": "/* @(#)s_floor.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: s_floor.c,v 1.8 1995/05/10 20:47:20 jtc Exp $\";\n#endif\n\n/*\n * floor(x)\n * Return x rounded toward -inf to integral value\n * Method:\n *\tBit twiddling.\n * Exception:\n *\tInexact flag raised if x not equal to floor(x).\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\n#ifdef __STDC__\nstatic const double huge_val = 1.0e300;\n#else\nstatic double huge_val = 1.0e300;\n#endif\n\nlibm_hidden_proto(floor)\n#ifdef __STDC__\n     double floor(double x)\n#else\n     double floor(x)\n     double x;\n#endif\n{\n    int32_t i0, i1, j0;\n    u_int32_t i, j;\n    EXTRACT_WORDS(i0, i1, x);\n    j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;\n    if (j0 < 20) {\n        if (j0 < 0) {           /* raise inexact if x != 0 */\n            if (huge_val + x > 0.0) {       /* return 0*sign(x) if |x|<1 */\n                if (i0 >= 0) {\n                    i0 = i1 = 0;\n                } else if (((i0 & 0x7fffffff) | i1) != 0) {\n                    i0 = 0xbff00000;\n                    i1 = 0;\n                }\n            }\n        } else {\n            i = (0x000fffff) >> j0;\n            if (((i0 & i) | i1) == 0)\n                return x;       /* x is integral */\n            if (huge_val + x > 0.0) {       /* raise inexact flag */\n                if (i0 < 0)\n                    i0 += (0x00100000) >> j0;\n                i0 &= (~i);\n                i1 = 0;\n            }\n        }\n    } else if (j0 > 51) {\n        if (j0 == 0x400)\n            return x + x;       /* inf or NaN */\n        else\n            return x;           /* x is integral */\n    } else {\n        i = ((u_int32_t) (0xffffffff)) >> (j0 - 20);\n        if ((i1 & i) == 0)\n            return x;           /* x is integral */\n        if (huge_val + x > 0.0) {   /* raise inexact flag */\n            if (i0 < 0) {\n                if (j0 == 20)\n                    i0 += 1;\n                else {\n                    j = i1 + (1 << (52 - j0));\n                    if (j < (u_int32_t) i1)\n                        i0 += 1;        /* got a carry */\n                    i1 = j;\n                }\n            }\n            i1 &= (~i);\n        }\n    }\n    INSERT_WORDS(x, i0, i1);\n    return x;\n}\n\nlibm_hidden_def(floor)\n"
  },
  {
    "path": "libs/SDL2/src/libm/s_scalbn.c",
    "content": "/* @(#)s_scalbn.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: s_scalbn.c,v 1.8 1995/05/10 20:48:08 jtc Exp $\";\n#endif\n\n/*\n * scalbn (double x, int n)\n * scalbn(x,n) returns x* 2**n  computed by  exponent\n * manipulation rather than by actually performing an\n * exponentiation or a multiplication.\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nlibm_hidden_proto(copysign)\n#ifdef __STDC__\n     static const double\n#else\n     static double\n#endif\n       two54 = 1.80143985094819840000e+16,      /* 0x43500000, 0x00000000 */\n         twom54 = 5.55111512312578270212e-17,   /* 0x3C900000, 0x00000000 */\n         huge_val = 1.0e+300, tiny = 1.0e-300;\n\nlibm_hidden_proto(scalbn)\n#ifdef __STDC__\n     double scalbn(double x, int n)\n#else\n     double scalbn(x, n)\n     double x;\n     int n;\n#endif\n{\n    int32_t k, hx, lx;\n    EXTRACT_WORDS(hx, lx, x);\n    k = (hx & 0x7ff00000) >> 20;        /* extract exponent */\n    if (k == 0) {               /* 0 or subnormal x */\n        if ((lx | (hx & 0x7fffffff)) == 0)\n            return x;           /* +-0 */\n        x *= two54;\n        GET_HIGH_WORD(hx, x);\n        k = ((hx & 0x7ff00000) >> 20) - 54;\n        if (n < -50000)\n            return tiny * x;    /* underflow */\n    }\n    if (k == 0x7ff)\n        return x + x;           /* NaN or Inf */\n    k = k + n;\n    if (k > 0x7fe)\n        return huge_val * copysign(huge_val, x);        /* overflow  */\n    if (k > 0) {                /* normal result */\n        SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));\n        return x;\n    }\n    if (k <= -54) {\n        if (n > 50000)          /* in case integer overflow in n+k */\n            return huge_val * copysign(huge_val, x);    /* overflow */\n        else\n            return tiny * copysign(tiny, x);    /* underflow */\n    }\n    k += 54;                    /* subnormal result */\n    SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));\n    return x * twom54;\n}\n\nlibm_hidden_def(scalbn)\n"
  },
  {
    "path": "libs/SDL2/src/libm/s_sin.c",
    "content": "/* @(#)s_sin.c 5.1 93/09/24 */\n/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n#if defined(LIBM_SCCS) && !defined(lint)\nstatic const char rcsid[] =\n    \"$NetBSD: s_sin.c,v 1.7 1995/05/10 20:48:15 jtc Exp $\";\n#endif\n\n/* sin(x)\n * Return sine function of x.\n *\n * kernel function:\n *\t__kernel_sin\t\t... sine function on [-pi/4,pi/4]\n *\t__kernel_cos\t\t... cose function on [-pi/4,pi/4]\n *\t__ieee754_rem_pio2\t... argument reduction routine\n *\n * Method.\n *      Let S,C and T denote the sin, cos and tan respectively on\n *\t[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2\n *\tin [-pi/4 , +pi/4], and let n = k mod 4.\n *\tWe have\n *\n *          n        sin(x)      cos(x)        tan(x)\n *     ----------------------------------------------------------\n *\t    0\t       S\t   C\t\t T\n *\t    1\t       C\t  -S\t\t-1/T\n *\t    2\t      -S\t  -C\t\t T\n *\t    3\t      -C\t   S\t\t-1/T\n *     ----------------------------------------------------------\n *\n * Special cases:\n *      Let trig be any of sin, cos, or tan.\n *      trig(+-INF)  is NaN, with signals;\n *      trig(NaN)    is that NaN;\n *\n * Accuracy:\n *\tTRIG(x) returns trig(x) nearly rounded\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\nlibm_hidden_proto(sin)\n#ifdef __STDC__\n     double sin(double x)\n#else\n     double sin(x)\n     double x;\n#endif\n{\n    double y[2], z = 0.0;\n    int32_t n, ix;\n\n    /* High word of x. */\n    GET_HIGH_WORD(ix, x);\n\n    /* |x| ~< pi/4 */\n    ix &= 0x7fffffff;\n    if (ix <= 0x3fe921fb)\n        return __kernel_sin(x, z, 0);\n\n    /* sin(Inf or NaN) is NaN */\n    else if (ix >= 0x7ff00000)\n        return x - x;\n\n    /* argument reduction needed */\n    else {\n        n = __ieee754_rem_pio2(x, y);\n        switch (n & 3) {\n        case 0:\n            return __kernel_sin(y[0], y[1], 1);\n        case 1:\n            return __kernel_cos(y[0], y[1]);\n        case 2:\n            return -__kernel_sin(y[0], y[1], 1);\n        default:\n            return -__kernel_cos(y[0], y[1]);\n        }\n    }\n}\n\nlibm_hidden_def(sin)\n"
  },
  {
    "path": "libs/SDL2/src/libm/s_tan.c",
    "content": "/*\n * ====================================================\n * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n *\n * Developed at SunPro, a Sun Microsystems, Inc. business.\n * Permission to use, copy, modify, and distribute this\n * software is freely granted, provided that this notice\n * is preserved.\n * ====================================================\n */\n\n/* tan(x)\n * Return tangent function of x.\n *\n * kernel function:\n *\t__kernel_tan\t\t... tangent function on [-pi/4,pi/4]\n *\t__ieee754_rem_pio2\t... argument reduction routine\n *\n * Method.\n *      Let S,C and T denote the sin, cos and tan respectively on\n *\t[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2\n *\tin [-pi/4 , +pi/4], and let n = k mod 4.\n *\tWe have\n *\n *          n        sin(x)      cos(x)        tan(x)\n *     ----------------------------------------------------------\n *\t    0\t       S\t   C\t\t T\n *\t    1\t       C\t  -S\t\t-1/T\n *\t    2\t      -S\t  -C\t\t T\n *\t    3\t      -C\t   S\t\t-1/T\n *     ----------------------------------------------------------\n *\n * Special cases:\n *      Let trig be any of sin, cos, or tan.\n *      trig(+-INF)  is NaN, with signals;\n *      trig(NaN)    is that NaN;\n *\n * Accuracy:\n *\tTRIG(x) returns trig(x) nearly rounded\n */\n\n#include \"math_libm.h\"\n#include \"math_private.h\"\n\ndouble tan(double x)\n{\n\tdouble y[2],z=0.0;\n\tint32_t n, ix;\n\n    /* High word of x. */\n\tGET_HIGH_WORD(ix,x);\n\n    /* |x| ~< pi/4 */\n\tix &= 0x7fffffff;\n\tif(ix <= 0x3fe921fb) return __kernel_tan(x,z,1);\n\n    /* tan(Inf or NaN) is NaN */\n\telse if (ix>=0x7ff00000) return x-x;\t\t/* NaN */\n\n    /* argument reduction needed */\n\telse {\n\t    n = __ieee754_rem_pio2(x,y);\n\t    return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /*   1 -- n even\n\t\t\t\t\t\t\t-1 -- n odd */\n\t}\n}\nlibm_hidden_def(tan)\n"
  },
  {
    "path": "libs/SDL2/src/loadso/dlopen/SDL_sysloadso.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifdef SDL_LOADSO_DLOPEN\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n/* System dependent library loading routines                           */\n\n#include <stdio.h>\n#include <dlfcn.h>\n\n#include \"SDL_loadso.h\"\n\n#if SDL_VIDEO_DRIVER_UIKIT\n#include \"../../video/uikit/SDL_uikitvideo.h\"\n#endif\n\nvoid *\nSDL_LoadObject(const char *sofile)\n{\n    void *handle;\n    const char *loaderror;\n\n#if SDL_VIDEO_DRIVER_UIKIT\n    if (!UIKit_IsSystemVersionAtLeast(8.0)) {\n        SDL_SetError(\"SDL_LoadObject requires iOS 8+\");\n        return NULL;\n    }\n#endif\n\n    handle = dlopen(sofile, RTLD_NOW|RTLD_LOCAL);\n    loaderror = (char *) dlerror();\n    if (handle == NULL) {\n        SDL_SetError(\"Failed loading %s: %s\", sofile, loaderror);\n    }\n    return (handle);\n}\n\nvoid *\nSDL_LoadFunction(void *handle, const char *name)\n{\n    void *symbol = dlsym(handle, name);\n    if (symbol == NULL) {\n        /* append an underscore for platforms that need that. */\n        size_t len = 1 + SDL_strlen(name) + 1;\n        char *_name = SDL_stack_alloc(char, len);\n        _name[0] = '_';\n        SDL_strlcpy(&_name[1], name, len);\n        symbol = dlsym(handle, _name);\n        SDL_stack_free(_name);\n        if (symbol == NULL) {\n            SDL_SetError(\"Failed loading %s: %s\", name,\n                         (const char *) dlerror());\n        }\n    }\n    return (symbol);\n}\n\nvoid\nSDL_UnloadObject(void *handle)\n{\n    if (handle != NULL) {\n        dlclose(handle);\n    }\n}\n\n#endif /* SDL_LOADSO_DLOPEN */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/power/SDL_power.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n#include \"SDL_power.h\"\n\n/*\n * Returns SDL_TRUE if we have a definitive answer.\n * SDL_FALSE to try next implementation.\n */\ntypedef SDL_bool\n    (*SDL_GetPowerInfo_Impl) (SDL_PowerState * state, int *seconds,\n                              int *percent);\n\nSDL_bool SDL_GetPowerInfo_Linux_sys_class_power_supply(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_Linux_proc_acpi(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_Linux_proc_apm(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_Windows(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_MacOSX(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_Haiku(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_UIKit(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_Android(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_PSP(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_WinRT(SDL_PowerState *, int *, int *);\nSDL_bool SDL_GetPowerInfo_Emscripten(SDL_PowerState *, int *, int *);\n\n#ifndef SDL_POWER_DISABLED\n#ifdef SDL_POWER_HARDWIRED\n/* This is for things that _never_ have a battery */\nstatic SDL_bool\nSDL_GetPowerInfo_Hardwired(SDL_PowerState * state, int *seconds, int *percent)\n{\n    *seconds = -1;\n    *percent = -1;\n    *state = SDL_POWERSTATE_NO_BATTERY;\n    return SDL_TRUE;\n}\n#endif\n#endif\n\n\nstatic SDL_GetPowerInfo_Impl implementations[] = {\n#ifndef SDL_POWER_DISABLED\n#ifdef SDL_POWER_LINUX          /* in order of preference. More than could work. */\n    SDL_GetPowerInfo_Linux_sys_class_power_supply,\n    SDL_GetPowerInfo_Linux_proc_acpi,\n    SDL_GetPowerInfo_Linux_proc_apm,\n#endif\n#ifdef SDL_POWER_WINDOWS        /* handles Win32, Win64, PocketPC. */\n    SDL_GetPowerInfo_Windows,\n#endif\n#ifdef SDL_POWER_UIKIT          /* handles iPhone/iPad/etc */\n    SDL_GetPowerInfo_UIKit,\n#endif\n#ifdef SDL_POWER_MACOSX         /* handles Mac OS X, Darwin. */\n    SDL_GetPowerInfo_MacOSX,\n#endif\n#ifdef SDL_POWER_HAIKU          /* with BeOS euc.jp apm driver. Does this work on Haiku? */\n    SDL_GetPowerInfo_Haiku,\n#endif\n#ifdef SDL_POWER_ANDROID        /* handles Android. */\n    SDL_GetPowerInfo_Android,\n#endif\n#ifdef SDL_POWER_PSP        /* handles PSP. */\n    SDL_GetPowerInfo_PSP,\n#endif\n#ifdef SDL_POWER_WINRT          /* handles WinRT */\n    SDL_GetPowerInfo_WinRT,\n#endif\n#ifdef SDL_POWER_EMSCRIPTEN     /* handles Emscripten */\n    SDL_GetPowerInfo_Emscripten,\n#endif\n\n#ifdef SDL_POWER_HARDWIRED\n    SDL_GetPowerInfo_Hardwired,\n#endif\n#endif\n};\n\nSDL_PowerState\nSDL_GetPowerInfo(int *seconds, int *percent)\n{\n    const int total = sizeof(implementations) / sizeof(implementations[0]);\n    int _seconds, _percent;\n    SDL_PowerState retval = SDL_POWERSTATE_UNKNOWN;\n    int i;\n\n    /* Make these never NULL for platform-specific implementations. */\n    if (seconds == NULL) {\n        seconds = &_seconds;\n    }\n\n    if (percent == NULL) {\n        percent = &_percent;\n    }\n\n    for (i = 0; i < total; i++) {\n        if (implementations[i](&retval, seconds, percent)) {\n            return retval;\n        }\n    }\n\n    /* nothing was definitive. */\n    *seconds = -1;\n    *percent = -1;\n    return SDL_POWERSTATE_UNKNOWN;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/power/android/SDL_syspower.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef SDL_POWER_DISABLED\n#if SDL_POWER_ANDROID\n\n#include \"SDL_power.h\"\n\n#include \"../../core/android/SDL_android.h\"\n\nSDL_bool\nSDL_GetPowerInfo_Android(SDL_PowerState * state, int *seconds, int *percent)\n{\n    int battery;\n    int plugged;\n    int charged;\n\n    if (Android_JNI_GetPowerInfo(&plugged, &charged, &battery, seconds, percent) != -1) {\n        if (plugged) {\n            if (charged) {\n                *state = SDL_POWERSTATE_CHARGED;\n            } else if (battery) {\n                *state = SDL_POWERSTATE_CHARGING;\n            } else {\n                *state = SDL_POWERSTATE_NO_BATTERY;\n                *seconds = -1;\n                *percent = -1;\n            }\n        } else {\n            *state = SDL_POWERSTATE_ON_BATTERY;\n        }\n    } else {\n        *state = SDL_POWERSTATE_UNKNOWN;\n        *seconds = -1;\n        *percent = -1;\n    }\n\n    return SDL_TRUE;\n}\n\n#endif /* SDL_POWER_ANDROID */\n#endif /* SDL_POWER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/SDL_d3dmath.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#if (SDL_VIDEO_RENDER_D3D || SDL_VIDEO_RENDER_D3D11) && !SDL_RENDER_DISABLED\n#include \"SDL_stdinc.h\"\n\n#include \"SDL_d3dmath.h\"\n\n/* Direct3D matrix math functions */\n\nFloat4X4 MatrixIdentity()\n{\n    Float4X4 m;\n    SDL_zero(m);\n    m._11 = 1.0f;\n    m._22 = 1.0f;\n    m._33 = 1.0f;\n    m._44 = 1.0f;\n    return m;\n}\n\nFloat4X4 MatrixMultiply(Float4X4 M1, Float4X4 M2)\n{\n    Float4X4 m;\n    m._11 = M1._11 * M2._11 + M1._12 * M2._21 + M1._13 * M2._31 + M1._14 * M2._41;\n    m._12 = M1._11 * M2._12 + M1._12 * M2._22 + M1._13 * M2._32 + M1._14 * M2._42;\n    m._13 = M1._11 * M2._13 + M1._12 * M2._23 + M1._13 * M2._33 + M1._14 * M2._43;\n    m._14 = M1._11 * M2._14 + M1._12 * M2._24 + M1._13 * M2._34 + M1._14 * M2._44;\n    m._21 = M1._21 * M2._11 + M1._22 * M2._21 + M1._23 * M2._31 + M1._24 * M2._41;\n    m._22 = M1._21 * M2._12 + M1._22 * M2._22 + M1._23 * M2._32 + M1._24 * M2._42;\n    m._23 = M1._21 * M2._13 + M1._22 * M2._23 + M1._23 * M2._33 + M1._24 * M2._43;\n    m._24 = M1._21 * M2._14 + M1._22 * M2._24 + M1._23 * M2._34 + M1._24 * M2._44;\n    m._31 = M1._31 * M2._11 + M1._32 * M2._21 + M1._33 * M2._31 + M1._34 * M2._41;\n    m._32 = M1._31 * M2._12 + M1._32 * M2._22 + M1._33 * M2._32 + M1._34 * M2._42;\n    m._33 = M1._31 * M2._13 + M1._32 * M2._23 + M1._33 * M2._33 + M1._34 * M2._43;\n    m._34 = M1._31 * M2._14 + M1._32 * M2._24 + M1._33 * M2._34 + M1._34 * M2._44;\n    m._41 = M1._41 * M2._11 + M1._42 * M2._21 + M1._43 * M2._31 + M1._44 * M2._41;\n    m._42 = M1._41 * M2._12 + M1._42 * M2._22 + M1._43 * M2._32 + M1._44 * M2._42;\n    m._43 = M1._41 * M2._13 + M1._42 * M2._23 + M1._43 * M2._33 + M1._44 * M2._43;\n    m._44 = M1._41 * M2._14 + M1._42 * M2._24 + M1._43 * M2._34 + M1._44 * M2._44;\n    return m;\n}\n\nFloat4X4 MatrixScaling(float x, float y, float z)\n{\n    Float4X4 m;\n    SDL_zero(m);\n    m._11 = x;\n    m._22 = y;\n    m._33 = z;\n    m._44 = 1.0f;\n    return m;\n}\n\nFloat4X4 MatrixTranslation(float x, float y, float z)\n{\n    Float4X4 m;\n    SDL_zero(m);\n    m._11 = 1.0f;\n    m._22 = 1.0f;\n    m._33 = 1.0f;\n    m._44 = 1.0f;\n    m._41 = x;\n    m._42 = y;\n    m._43 = z;\n    return m;\n}\n\nFloat4X4 MatrixRotationX(float r)\n{\n    float sinR = SDL_sinf(r);\n    float cosR = SDL_cosf(r);\n    Float4X4 m;\n    SDL_zero(m);\n    m._11 = 1.0f;\n    m._22 = cosR;\n    m._23 = sinR;\n    m._32 = -sinR;\n    m._33 = cosR;\n    m._44 = 1.0f;\n    return m;\n}\n\nFloat4X4 MatrixRotationY(float r)\n{\n    float sinR = SDL_sinf(r);\n    float cosR = SDL_cosf(r);\n    Float4X4 m;\n    SDL_zero(m);\n    m._11 = cosR;\n    m._13 = -sinR;\n    m._22 = 1.0f;\n    m._31 = sinR;\n    m._33 = cosR;\n    m._44 = 1.0f;\n    return m;\n}\n\nFloat4X4 MatrixRotationZ(float r)\n{\n    float sinR = SDL_sinf(r);\n    float cosR = SDL_cosf(r);\n    Float4X4 m;\n    SDL_zero(m);\n    m._11 = cosR;\n    m._12 = sinR;\n    m._21 = -sinR;\n    m._22 = cosR;\n    m._33 = 1.0f;\n    m._44 = 1.0f;\n    return m;\n\n}\n\n#endif /* (SDL_VIDEO_RENDER_D3D || SDL_VIDEO_RENDER_D3D11) && !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/SDL_d3dmath.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#if (SDL_VIDEO_RENDER_D3D || SDL_VIDEO_RENDER_D3D11) && !SDL_RENDER_DISABLED\n\n/* Direct3D matrix math functions */\n\ntypedef struct\n{\n    float x;\n    float y;\n} Float2;\n\ntypedef struct\n{\n    float x;\n    float y;\n    float z;\n} Float3;\n\ntypedef struct\n{\n    float x;\n    float y;\n    float z;\n    float w;\n} Float4;\n\ntypedef struct\n{\n    union {\n        struct {\n            float _11, _12, _13, _14;\n            float _21, _22, _23, _24;\n            float _31, _32, _33, _34;\n            float _41, _42, _43, _44;\n        };\n        float m[4][4];\n    };\n} Float4X4;\n\n\nFloat4X4 MatrixIdentity();\nFloat4X4 MatrixMultiply(Float4X4 M1, Float4X4 M2);\nFloat4X4 MatrixScaling(float x, float y, float z);\nFloat4X4 MatrixTranslation(float x, float y, float z);\nFloat4X4 MatrixRotationX(float r);\nFloat4X4 MatrixRotationY(float r);\nFloat4X4 MatrixRotationZ(float r);\n\n#endif /* (SDL_VIDEO_RENDER_D3D || SDL_VIDEO_RENDER_D3D11) && !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/SDL_render.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* The SDL 2D rendering system */\n\n#include \"SDL_assert.h\"\n#include \"SDL_hints.h\"\n#include \"SDL_log.h\"\n#include \"SDL_render.h\"\n#include \"SDL_sysrender.h\"\n#include \"software/SDL_render_sw_c.h\"\n\n\n#define SDL_WINDOWRENDERDATA    \"_SDL_WindowRenderData\"\n\n#define CHECK_RENDERER_MAGIC(renderer, retval) \\\n    if (!renderer || renderer->magic != &renderer_magic) { \\\n        SDL_SetError(\"Invalid renderer\"); \\\n        return retval; \\\n    }\n\n#define CHECK_TEXTURE_MAGIC(texture, retval) \\\n    if (!texture || texture->magic != &texture_magic) { \\\n        SDL_SetError(\"Invalid texture\"); \\\n        return retval; \\\n    }\n\n\n#if !SDL_RENDER_DISABLED\nstatic const SDL_RenderDriver *render_drivers[] = {\n#if SDL_VIDEO_RENDER_D3D\n    &D3D_RenderDriver,\n#endif\n#if SDL_VIDEO_RENDER_D3D11\n    &D3D11_RenderDriver,\n#endif\n#if SDL_VIDEO_RENDER_OGL\n    &GL_RenderDriver,\n#endif\n#if SDL_VIDEO_RENDER_OGL_ES2\n    &GLES2_RenderDriver,\n#endif\n#if SDL_VIDEO_RENDER_OGL_ES\n    &GLES_RenderDriver,\n#endif\n#if SDL_VIDEO_RENDER_DIRECTFB\n    &DirectFB_RenderDriver,\n#endif\n#if SDL_VIDEO_RENDER_PSP\n    &PSP_RenderDriver,\n#endif\n    &SW_RenderDriver\n};\n#endif /* !SDL_RENDER_DISABLED */\n\nstatic char renderer_magic;\nstatic char texture_magic;\n\nstatic int UpdateLogicalSize(SDL_Renderer *renderer);\n\nint\nSDL_GetNumRenderDrivers(void)\n{\n#if !SDL_RENDER_DISABLED\n    return SDL_arraysize(render_drivers);\n#else\n    return 0;\n#endif\n}\n\nint\nSDL_GetRenderDriverInfo(int index, SDL_RendererInfo * info)\n{\n#if !SDL_RENDER_DISABLED\n    if (index < 0 || index >= SDL_GetNumRenderDrivers()) {\n        return SDL_SetError(\"index must be in the range of 0 - %d\",\n                            SDL_GetNumRenderDrivers() - 1);\n    }\n    *info = render_drivers[index]->info;\n    return 0;\n#else\n    return SDL_SetError(\"SDL not built with rendering support\");\n#endif\n}\n\nstatic int\nSDL_RendererEventWatch(void *userdata, SDL_Event *event)\n{\n    SDL_Renderer *renderer = (SDL_Renderer *)userdata;\n\n    if (event->type == SDL_WINDOWEVENT) {\n        SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);\n        if (window == renderer->window) {\n            if (renderer->WindowEvent) {\n                renderer->WindowEvent(renderer, &event->window);\n            }\n\n            if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {\n                /* Make sure we're operating on the default render target */\n                SDL_Texture *saved_target = SDL_GetRenderTarget(renderer);\n                if (saved_target) {\n                    SDL_SetRenderTarget(renderer, NULL);\n                }\n\n                if (renderer->logical_w) {\n                    UpdateLogicalSize(renderer);\n                } else {\n                    /* Window was resized, reset viewport */\n                    int w, h;\n\n                    if (renderer->GetOutputSize) {\n                        renderer->GetOutputSize(renderer, &w, &h);\n                    } else {\n                        SDL_GetWindowSize(renderer->window, &w, &h);\n                    }\n\n                    if (renderer->target) {\n                        renderer->viewport_backup.x = 0;\n                        renderer->viewport_backup.y = 0;\n                        renderer->viewport_backup.w = w;\n                        renderer->viewport_backup.h = h;\n                    } else {\n                        renderer->viewport.x = 0;\n                        renderer->viewport.y = 0;\n                        renderer->viewport.w = w;\n                        renderer->viewport.h = h;\n                        renderer->UpdateViewport(renderer);\n                    }\n                }\n\n                if (saved_target) {\n                    SDL_SetRenderTarget(renderer, saved_target);\n                }\n            } else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) {\n                renderer->hidden = SDL_TRUE;\n            } else if (event->window.event == SDL_WINDOWEVENT_SHOWN) {\n                if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) {\n                    renderer->hidden = SDL_FALSE;\n                }\n            } else if (event->window.event == SDL_WINDOWEVENT_MINIMIZED) {\n                renderer->hidden = SDL_TRUE;\n            } else if (event->window.event == SDL_WINDOWEVENT_RESTORED || \n                       event->window.event == SDL_WINDOWEVENT_MAXIMIZED) {\n                if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) {\n                    renderer->hidden = SDL_FALSE;\n                }\n            }\n        }\n    } else if (event->type == SDL_MOUSEMOTION) {\n        SDL_Window *window = SDL_GetWindowFromID(event->motion.windowID);\n        if (renderer->logical_w && window == renderer->window) {\n            event->motion.x -= renderer->viewport.x;\n            event->motion.y -= renderer->viewport.y;\n            event->motion.x = (int)(event->motion.x / renderer->scale.x);\n            event->motion.y = (int)(event->motion.y / renderer->scale.y);\n            if (event->motion.xrel > 0) {\n                event->motion.xrel = SDL_max(1, (int)(event->motion.xrel / renderer->scale.x));\n            } else if (event->motion.xrel < 0) {\n                event->motion.xrel = SDL_min(-1, (int)(event->motion.xrel / renderer->scale.x));\n            }\n            if (event->motion.yrel > 0) {\n                event->motion.yrel = SDL_max(1, (int)(event->motion.yrel / renderer->scale.y));\n            } else if (event->motion.yrel < 0) {\n                event->motion.yrel = SDL_min(-1, (int)(event->motion.yrel / renderer->scale.y));\n            }\n        }\n    } else if (event->type == SDL_MOUSEBUTTONDOWN ||\n               event->type == SDL_MOUSEBUTTONUP) {\n        SDL_Window *window = SDL_GetWindowFromID(event->button.windowID);\n        if (renderer->logical_w && window == renderer->window) {\n            event->button.x -= renderer->viewport.x;\n            event->button.y -= renderer->viewport.y;\n            event->button.x = (int)(event->button.x / renderer->scale.x);\n            event->button.y = (int)(event->button.y / renderer->scale.y);\n        }\n    }\n    return 0;\n}\n\nint\nSDL_CreateWindowAndRenderer(int width, int height, Uint32 window_flags,\n                            SDL_Window **window, SDL_Renderer **renderer)\n{\n    *window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED,\n                                     SDL_WINDOWPOS_UNDEFINED,\n                                     width, height, window_flags);\n    if (!*window) {\n        *renderer = NULL;\n        return -1;\n    }\n\n    *renderer = SDL_CreateRenderer(*window, -1, 0);\n    if (!*renderer) {\n        return -1;\n    }\n\n    return 0;\n}\n\nSDL_Renderer *\nSDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags)\n{\n#if !SDL_RENDER_DISABLED\n    SDL_Renderer *renderer = NULL;\n    int n = SDL_GetNumRenderDrivers();\n    const char *hint;\n\n    if (!window) {\n        SDL_SetError(\"Invalid window\");\n        return NULL;\n    }\n\n    if (SDL_GetRenderer(window)) {\n        SDL_SetError(\"Renderer already associated with window\");\n        return NULL;\n    }\n\n    if (SDL_GetHint(SDL_HINT_RENDER_VSYNC)) {\n        if (SDL_GetHintBoolean(SDL_HINT_RENDER_VSYNC, SDL_TRUE)) {\n            flags |= SDL_RENDERER_PRESENTVSYNC;\n        } else {\n            flags &= ~SDL_RENDERER_PRESENTVSYNC;\n        }\n    }\n\n    if (index < 0) {\n        hint = SDL_GetHint(SDL_HINT_RENDER_DRIVER);\n        if (hint) {\n            for (index = 0; index < n; ++index) {\n                const SDL_RenderDriver *driver = render_drivers[index];\n\n                if (SDL_strcasecmp(hint, driver->info.name) == 0) {\n                    /* Create a new renderer instance */\n                    renderer = driver->CreateRenderer(window, flags);\n                    break;\n                }\n            }\n        }\n\n        if (!renderer) {\n            for (index = 0; index < n; ++index) {\n                const SDL_RenderDriver *driver = render_drivers[index];\n\n                if ((driver->info.flags & flags) == flags) {\n                    /* Create a new renderer instance */\n                    renderer = driver->CreateRenderer(window, flags);\n                    if (renderer) {\n                        /* Yay, we got one! */\n                        break;\n                    }\n                }\n            }\n        }\n        if (index == n) {\n            SDL_SetError(\"Couldn't find matching render driver\");\n            return NULL;\n        }\n    } else {\n        if (index >= SDL_GetNumRenderDrivers()) {\n            SDL_SetError(\"index must be -1 or in the range of 0 - %d\",\n                         SDL_GetNumRenderDrivers() - 1);\n            return NULL;\n        }\n        /* Create a new renderer instance */\n        renderer = render_drivers[index]->CreateRenderer(window, flags);\n    }\n\n    if (renderer) {\n        renderer->magic = &renderer_magic;\n        renderer->window = window;\n        renderer->scale.x = 1.0f;\n        renderer->scale.y = 1.0f;\n\n        if (SDL_GetWindowFlags(window) & (SDL_WINDOW_HIDDEN|SDL_WINDOW_MINIMIZED)) {\n            renderer->hidden = SDL_TRUE;\n        } else {\n            renderer->hidden = SDL_FALSE;\n        }\n\n        SDL_SetWindowData(window, SDL_WINDOWRENDERDATA, renderer);\n\n        SDL_RenderSetViewport(renderer, NULL);\n\n        SDL_AddEventWatch(SDL_RendererEventWatch, renderer);\n\n        SDL_LogInfo(SDL_LOG_CATEGORY_RENDER,\n                    \"Created renderer: %s\", renderer->info.name);\n    }\n    return renderer;\n#else\n    SDL_SetError(\"SDL not built with rendering support\");\n    return NULL;\n#endif\n}\n\nSDL_Renderer *\nSDL_CreateSoftwareRenderer(SDL_Surface * surface)\n{\n#if !SDL_RENDER_DISABLED\n    SDL_Renderer *renderer;\n\n    renderer = SW_CreateRendererForSurface(surface);\n\n    if (renderer) {\n        renderer->magic = &renderer_magic;\n        renderer->scale.x = 1.0f;\n        renderer->scale.y = 1.0f;\n\n        SDL_RenderSetViewport(renderer, NULL);\n    }\n    return renderer;\n#else\n    SDL_SetError(\"SDL not built with rendering support\");\n    return NULL;\n#endif /* !SDL_RENDER_DISABLED */\n}\n\nSDL_Renderer *\nSDL_GetRenderer(SDL_Window * window)\n{\n    return (SDL_Renderer *)SDL_GetWindowData(window, SDL_WINDOWRENDERDATA);\n}\n\nint\nSDL_GetRendererInfo(SDL_Renderer * renderer, SDL_RendererInfo * info)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    *info = renderer->info;\n    return 0;\n}\n\nint\nSDL_GetRendererOutputSize(SDL_Renderer * renderer, int *w, int *h)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    if (renderer->target) {\n        return SDL_QueryTexture(renderer->target, NULL, NULL, w, h);\n    } else if (renderer->GetOutputSize) {\n        return renderer->GetOutputSize(renderer, w, h);\n    } else if (renderer->window) {\n        SDL_GetWindowSize(renderer->window, w, h);\n        return 0;\n    } else {\n        SDL_assert(0 && \"This should never happen\");\n        return SDL_SetError(\"Renderer doesn't support querying output size\");\n    }\n}\n\nstatic SDL_bool\nIsSupportedFormat(SDL_Renderer * renderer, Uint32 format)\n{\n    Uint32 i;\n\n    for (i = 0; i < renderer->info.num_texture_formats; ++i) {\n        if (renderer->info.texture_formats[i] == format) {\n            return SDL_TRUE;\n        }\n    }\n    return SDL_FALSE;\n}\n\nstatic Uint32\nGetClosestSupportedFormat(SDL_Renderer * renderer, Uint32 format)\n{\n    Uint32 i;\n\n    if (SDL_ISPIXELFORMAT_FOURCC(format)) {\n        /* Look for an exact match */\n        for (i = 0; i < renderer->info.num_texture_formats; ++i) {\n            if (renderer->info.texture_formats[i] == format) {\n                return renderer->info.texture_formats[i];\n            }\n        }\n    } else {\n        SDL_bool hasAlpha = SDL_ISPIXELFORMAT_ALPHA(format);\n\n        /* We just want to match the first format that has the same channels */\n        for (i = 0; i < renderer->info.num_texture_formats; ++i) {\n            if (!SDL_ISPIXELFORMAT_FOURCC(renderer->info.texture_formats[i]) &&\n                SDL_ISPIXELFORMAT_ALPHA(renderer->info.texture_formats[i]) == hasAlpha) {\n                return renderer->info.texture_formats[i];\n            }\n        }\n    }\n    return renderer->info.texture_formats[0];\n}\n\nSDL_Texture *\nSDL_CreateTexture(SDL_Renderer * renderer, Uint32 format, int access, int w, int h)\n{\n    SDL_Texture *texture;\n\n    CHECK_RENDERER_MAGIC(renderer, NULL);\n\n    if (!format) {\n        format = renderer->info.texture_formats[0];\n    }\n    if (SDL_BYTESPERPIXEL(format) == 0) {\n        SDL_SetError(\"Invalid texture format\");\n        return NULL;\n    }\n    if (SDL_ISPIXELFORMAT_INDEXED(format)) {\n        SDL_SetError(\"Palettized textures are not supported\");\n        return NULL;\n    }\n    if (w <= 0 || h <= 0) {\n        SDL_SetError(\"Texture dimensions can't be 0\");\n        return NULL;\n    }\n    if ((renderer->info.max_texture_width && w > renderer->info.max_texture_width) ||\n        (renderer->info.max_texture_height && h > renderer->info.max_texture_height)) {\n        SDL_SetError(\"Texture dimensions are limited to %dx%d\", renderer->info.max_texture_width, renderer->info.max_texture_height);\n        return NULL;\n    }\n    texture = (SDL_Texture *) SDL_calloc(1, sizeof(*texture));\n    if (!texture) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n    texture->magic = &texture_magic;\n    texture->format = format;\n    texture->access = access;\n    texture->w = w;\n    texture->h = h;\n    texture->r = 255;\n    texture->g = 255;\n    texture->b = 255;\n    texture->a = 255;\n    texture->renderer = renderer;\n    texture->next = renderer->textures;\n    if (renderer->textures) {\n        renderer->textures->prev = texture;\n    }\n    renderer->textures = texture;\n\n    if (IsSupportedFormat(renderer, format)) {\n        if (renderer->CreateTexture(renderer, texture) < 0) {\n            SDL_DestroyTexture(texture);\n            return NULL;\n        }\n    } else {\n        texture->native = SDL_CreateTexture(renderer,\n                                GetClosestSupportedFormat(renderer, format),\n                                access, w, h);\n        if (!texture->native) {\n            SDL_DestroyTexture(texture);\n            return NULL;\n        }\n\n        /* Swap textures to have texture before texture->native in the list */\n        texture->native->next = texture->next;\n        if (texture->native->next) {\n            texture->native->next->prev = texture->native;\n        }\n        texture->prev = texture->native->prev;\n        if (texture->prev) {\n            texture->prev->next = texture;\n        }\n        texture->native->prev = texture;\n        texture->next = texture->native;\n        renderer->textures = texture;\n\n        if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {\n            texture->yuv = SDL_SW_CreateYUVTexture(format, w, h);\n            if (!texture->yuv) {\n                SDL_DestroyTexture(texture);\n                return NULL;\n            }\n        } else if (access == SDL_TEXTUREACCESS_STREAMING) {\n            /* The pitch is 4 byte aligned */\n            texture->pitch = (((w * SDL_BYTESPERPIXEL(format)) + 3) & ~3);\n            texture->pixels = SDL_calloc(1, texture->pitch * h);\n            if (!texture->pixels) {\n                SDL_DestroyTexture(texture);\n                return NULL;\n            }\n        }\n    }\n    return texture;\n}\n\nSDL_Texture *\nSDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface)\n{\n    const SDL_PixelFormat *fmt;\n    SDL_bool needAlpha;\n    Uint32 i;\n    Uint32 format;\n    SDL_Texture *texture;\n\n    CHECK_RENDERER_MAGIC(renderer, NULL);\n\n    if (!surface) {\n        SDL_SetError(\"SDL_CreateTextureFromSurface() passed NULL surface\");\n        return NULL;\n    }\n\n    /* See what the best texture format is */\n    fmt = surface->format;\n    if (fmt->Amask || SDL_GetColorKey(surface, NULL) == 0) {\n        needAlpha = SDL_TRUE;\n    } else {\n        needAlpha = SDL_FALSE;\n    }\n    format = renderer->info.texture_formats[0];\n    for (i = 0; i < renderer->info.num_texture_formats; ++i) {\n        if (!SDL_ISPIXELFORMAT_FOURCC(renderer->info.texture_formats[i]) &&\n            SDL_ISPIXELFORMAT_ALPHA(renderer->info.texture_formats[i]) == needAlpha) {\n            format = renderer->info.texture_formats[i];\n            break;\n        }\n    }\n\n    texture = SDL_CreateTexture(renderer, format, SDL_TEXTUREACCESS_STATIC,\n                                surface->w, surface->h);\n    if (!texture) {\n        return NULL;\n    }\n\n    if (format == surface->format->format) {\n        if (SDL_MUSTLOCK(surface)) {\n            SDL_LockSurface(surface);\n            SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);\n            SDL_UnlockSurface(surface);\n        } else {\n            SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);\n        }\n    } else {\n        SDL_PixelFormat *dst_fmt;\n        SDL_Surface *temp = NULL;\n\n        /* Set up a destination surface for the texture update */\n        dst_fmt = SDL_AllocFormat(format);\n        if (!dst_fmt) {\n           SDL_DestroyTexture(texture);\n           return NULL;\n        }\n        temp = SDL_ConvertSurface(surface, dst_fmt, 0);\n        SDL_FreeFormat(dst_fmt);\n        if (temp) {\n            SDL_UpdateTexture(texture, NULL, temp->pixels, temp->pitch);\n            SDL_FreeSurface(temp);\n        } else {\n            SDL_DestroyTexture(texture);\n            return NULL;\n        }\n    }\n\n    {\n        Uint8 r, g, b, a;\n        SDL_BlendMode blendMode;\n\n        SDL_GetSurfaceColorMod(surface, &r, &g, &b);\n        SDL_SetTextureColorMod(texture, r, g, b);\n\n        SDL_GetSurfaceAlphaMod(surface, &a);\n        SDL_SetTextureAlphaMod(texture, a);\n\n        if (SDL_GetColorKey(surface, NULL) == 0) {\n            /* We converted to a texture with alpha format */\n            SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);\n        } else {\n            SDL_GetSurfaceBlendMode(surface, &blendMode);\n            SDL_SetTextureBlendMode(texture, blendMode);\n        }\n    }\n    return texture;\n}\n\nint\nSDL_QueryTexture(SDL_Texture * texture, Uint32 * format, int *access,\n                 int *w, int *h)\n{\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    if (format) {\n        *format = texture->format;\n    }\n    if (access) {\n        *access = texture->access;\n    }\n    if (w) {\n        *w = texture->w;\n    }\n    if (h) {\n        *h = texture->h;\n    }\n    return 0;\n}\n\nint\nSDL_SetTextureColorMod(SDL_Texture * texture, Uint8 r, Uint8 g, Uint8 b)\n{\n    SDL_Renderer *renderer;\n\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    renderer = texture->renderer;\n    if (r < 255 || g < 255 || b < 255) {\n        texture->modMode |= SDL_TEXTUREMODULATE_COLOR;\n    } else {\n        texture->modMode &= ~SDL_TEXTUREMODULATE_COLOR;\n    }\n    texture->r = r;\n    texture->g = g;\n    texture->b = b;\n    if (texture->native) {\n        return SDL_SetTextureColorMod(texture->native, r, g, b);\n    } else if (renderer->SetTextureColorMod) {\n        return renderer->SetTextureColorMod(renderer, texture);\n    } else {\n        return 0;\n    }\n}\n\nint\nSDL_GetTextureColorMod(SDL_Texture * texture, Uint8 * r, Uint8 * g,\n                       Uint8 * b)\n{\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    if (r) {\n        *r = texture->r;\n    }\n    if (g) {\n        *g = texture->g;\n    }\n    if (b) {\n        *b = texture->b;\n    }\n    return 0;\n}\n\nint\nSDL_SetTextureAlphaMod(SDL_Texture * texture, Uint8 alpha)\n{\n    SDL_Renderer *renderer;\n\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    renderer = texture->renderer;\n    if (alpha < 255) {\n        texture->modMode |= SDL_TEXTUREMODULATE_ALPHA;\n    } else {\n        texture->modMode &= ~SDL_TEXTUREMODULATE_ALPHA;\n    }\n    texture->a = alpha;\n    if (texture->native) {\n        return SDL_SetTextureAlphaMod(texture->native, alpha);\n    } else if (renderer->SetTextureAlphaMod) {\n        return renderer->SetTextureAlphaMod(renderer, texture);\n    } else {\n        return 0;\n    }\n}\n\nint\nSDL_GetTextureAlphaMod(SDL_Texture * texture, Uint8 * alpha)\n{\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    if (alpha) {\n        *alpha = texture->a;\n    }\n    return 0;\n}\n\nint\nSDL_SetTextureBlendMode(SDL_Texture * texture, SDL_BlendMode blendMode)\n{\n    SDL_Renderer *renderer;\n\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    renderer = texture->renderer;\n    texture->blendMode = blendMode;\n    if (texture->native) {\n        return SDL_SetTextureBlendMode(texture->native, blendMode);\n    } else if (renderer->SetTextureBlendMode) {\n        return renderer->SetTextureBlendMode(renderer, texture);\n    } else {\n        return 0;\n    }\n}\n\nint\nSDL_GetTextureBlendMode(SDL_Texture * texture, SDL_BlendMode *blendMode)\n{\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    if (blendMode) {\n        *blendMode = texture->blendMode;\n    }\n    return 0;\n}\n\nstatic int\nSDL_UpdateTextureYUV(SDL_Texture * texture, const SDL_Rect * rect,\n                     const void *pixels, int pitch)\n{\n    SDL_Texture *native = texture->native;\n    SDL_Rect full_rect;\n\n    if (SDL_SW_UpdateYUVTexture(texture->yuv, rect, pixels, pitch) < 0) {\n        return -1;\n    }\n\n    full_rect.x = 0;\n    full_rect.y = 0;\n    full_rect.w = texture->w;\n    full_rect.h = texture->h;\n    rect = &full_rect;\n\n    if (texture->access == SDL_TEXTUREACCESS_STREAMING) {\n        /* We can lock the texture and copy to it */\n        void *native_pixels;\n        int native_pitch;\n\n        if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {\n            return -1;\n        }\n        SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,\n                            rect->w, rect->h, native_pixels, native_pitch);\n        SDL_UnlockTexture(native);\n    } else {\n        /* Use a temporary buffer for updating */\n        void *temp_pixels;\n        int temp_pitch;\n\n        temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);\n        temp_pixels = SDL_malloc(rect->h * temp_pitch);\n        if (!temp_pixels) {\n            return SDL_OutOfMemory();\n        }\n        SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,\n                            rect->w, rect->h, temp_pixels, temp_pitch);\n        SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);\n        SDL_free(temp_pixels);\n    }\n    return 0;\n}\n\nstatic int\nSDL_UpdateTextureNative(SDL_Texture * texture, const SDL_Rect * rect,\n                        const void *pixels, int pitch)\n{\n    SDL_Texture *native = texture->native;\n\n    if (texture->access == SDL_TEXTUREACCESS_STREAMING) {\n        /* We can lock the texture and copy to it */\n        void *native_pixels;\n        int native_pitch;\n\n        if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {\n            return -1;\n        }\n        SDL_ConvertPixels(rect->w, rect->h,\n                          texture->format, pixels, pitch,\n                          native->format, native_pixels, native_pitch);\n        SDL_UnlockTexture(native);\n    } else {\n        /* Use a temporary buffer for updating */\n        void *temp_pixels;\n        int temp_pitch;\n\n        temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);\n        temp_pixels = SDL_malloc(rect->h * temp_pitch);\n        if (!temp_pixels) {\n            return SDL_OutOfMemory();\n        }\n        SDL_ConvertPixels(rect->w, rect->h,\n                          texture->format, pixels, pitch,\n                          native->format, temp_pixels, temp_pitch);\n        SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);\n        SDL_free(temp_pixels);\n    }\n    return 0;\n}\n\nint\nSDL_UpdateTexture(SDL_Texture * texture, const SDL_Rect * rect,\n                  const void *pixels, int pitch)\n{\n    SDL_Renderer *renderer;\n    SDL_Rect full_rect;\n\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    if (!pixels) {\n        return SDL_InvalidParamError(\"pixels\");\n    }\n    if (!pitch) {\n        return SDL_InvalidParamError(\"pitch\");\n    }\n\n    if (!rect) {\n        full_rect.x = 0;\n        full_rect.y = 0;\n        full_rect.w = texture->w;\n        full_rect.h = texture->h;\n        rect = &full_rect;\n    }\n\n    if ((rect->w == 0) || (rect->h == 0)) {\n        return 0;  /* nothing to do. */\n    } else if (texture->yuv) {\n        return SDL_UpdateTextureYUV(texture, rect, pixels, pitch);\n    } else if (texture->native) {\n        return SDL_UpdateTextureNative(texture, rect, pixels, pitch);\n    } else {\n        renderer = texture->renderer;\n        return renderer->UpdateTexture(renderer, texture, rect, pixels, pitch);\n    }\n}\n\nstatic int\nSDL_UpdateTextureYUVPlanar(SDL_Texture * texture, const SDL_Rect * rect,\n                           const Uint8 *Yplane, int Ypitch,\n                           const Uint8 *Uplane, int Upitch,\n                           const Uint8 *Vplane, int Vpitch)\n{\n    SDL_Texture *native = texture->native;\n    SDL_Rect full_rect;\n\n    if (SDL_SW_UpdateYUVTexturePlanar(texture->yuv, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch) < 0) {\n        return -1;\n    }\n\n    full_rect.x = 0;\n    full_rect.y = 0;\n    full_rect.w = texture->w;\n    full_rect.h = texture->h;\n    rect = &full_rect;\n\n    if (texture->access == SDL_TEXTUREACCESS_STREAMING) {\n        /* We can lock the texture and copy to it */\n        void *native_pixels;\n        int native_pitch;\n\n        if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {\n            return -1;\n        }\n        SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,\n                            rect->w, rect->h, native_pixels, native_pitch);\n        SDL_UnlockTexture(native);\n    } else {\n        /* Use a temporary buffer for updating */\n        void *temp_pixels;\n        int temp_pitch;\n\n        temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);\n        temp_pixels = SDL_malloc(rect->h * temp_pitch);\n        if (!temp_pixels) {\n            return SDL_OutOfMemory();\n        }\n        SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,\n                            rect->w, rect->h, temp_pixels, temp_pitch);\n        SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);\n        SDL_free(temp_pixels);\n    }\n    return 0;\n}\n\nint SDL_UpdateYUVTexture(SDL_Texture * texture, const SDL_Rect * rect,\n                         const Uint8 *Yplane, int Ypitch,\n                         const Uint8 *Uplane, int Upitch,\n                         const Uint8 *Vplane, int Vpitch)\n{\n    SDL_Renderer *renderer;\n    SDL_Rect full_rect;\n\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    if (!Yplane) {\n        return SDL_InvalidParamError(\"Yplane\");\n    }\n    if (!Ypitch) {\n        return SDL_InvalidParamError(\"Ypitch\");\n    }\n    if (!Uplane) {\n        return SDL_InvalidParamError(\"Uplane\");\n    }\n    if (!Upitch) {\n        return SDL_InvalidParamError(\"Upitch\");\n    }\n    if (!Vplane) {\n        return SDL_InvalidParamError(\"Vplane\");\n    }\n    if (!Vpitch) {\n        return SDL_InvalidParamError(\"Vpitch\");\n    }\n\n    if (texture->format != SDL_PIXELFORMAT_YV12 &&\n        texture->format != SDL_PIXELFORMAT_IYUV) {\n        return SDL_SetError(\"Texture format must by YV12 or IYUV\");\n    }\n\n    if (!rect) {\n        full_rect.x = 0;\n        full_rect.y = 0;\n        full_rect.w = texture->w;\n        full_rect.h = texture->h;\n        rect = &full_rect;\n    }\n\n    if (texture->yuv) {\n        return SDL_UpdateTextureYUVPlanar(texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);\n    } else {\n        SDL_assert(!texture->native);\n        renderer = texture->renderer;\n        SDL_assert(renderer->UpdateTextureYUV);\n        if (renderer->UpdateTextureYUV) {\n            return renderer->UpdateTextureYUV(renderer, texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);\n        } else {\n            return SDL_Unsupported();\n        }\n    }\n}\n\nstatic int\nSDL_LockTextureYUV(SDL_Texture * texture, const SDL_Rect * rect,\n                   void **pixels, int *pitch)\n{\n    return SDL_SW_LockYUVTexture(texture->yuv, rect, pixels, pitch);\n}\n\nstatic int\nSDL_LockTextureNative(SDL_Texture * texture, const SDL_Rect * rect,\n                      void **pixels, int *pitch)\n{\n    texture->locked_rect = *rect;\n    *pixels = (void *) ((Uint8 *) texture->pixels +\n                        rect->y * texture->pitch +\n                        rect->x * SDL_BYTESPERPIXEL(texture->format));\n    *pitch = texture->pitch;\n    return 0;\n}\n\nint\nSDL_LockTexture(SDL_Texture * texture, const SDL_Rect * rect,\n                void **pixels, int *pitch)\n{\n    SDL_Renderer *renderer;\n    SDL_Rect full_rect;\n\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    if (texture->access != SDL_TEXTUREACCESS_STREAMING) {\n        return SDL_SetError(\"SDL_LockTexture(): texture must be streaming\");\n    }\n\n    if (!rect) {\n        full_rect.x = 0;\n        full_rect.y = 0;\n        full_rect.w = texture->w;\n        full_rect.h = texture->h;\n        rect = &full_rect;\n    }\n\n    if (texture->yuv) {\n        return SDL_LockTextureYUV(texture, rect, pixels, pitch);\n    } else if (texture->native) {\n        return SDL_LockTextureNative(texture, rect, pixels, pitch);\n    } else {\n        renderer = texture->renderer;\n        return renderer->LockTexture(renderer, texture, rect, pixels, pitch);\n    }\n}\n\nstatic void\nSDL_UnlockTextureYUV(SDL_Texture * texture)\n{\n    SDL_Texture *native = texture->native;\n    void *native_pixels = NULL;\n    int native_pitch = 0;\n    SDL_Rect rect;\n\n    rect.x = 0;\n    rect.y = 0;\n    rect.w = texture->w;\n    rect.h = texture->h;\n\n    if (SDL_LockTexture(native, &rect, &native_pixels, &native_pitch) < 0) {\n        return;\n    }\n    SDL_SW_CopyYUVToRGB(texture->yuv, &rect, native->format,\n                        rect.w, rect.h, native_pixels, native_pitch);\n    SDL_UnlockTexture(native);\n}\n\nstatic void\nSDL_UnlockTextureNative(SDL_Texture * texture)\n{\n    SDL_Texture *native = texture->native;\n    void *native_pixels = NULL;\n    int native_pitch = 0;\n    const SDL_Rect *rect = &texture->locked_rect;\n    const void* pixels = (void *) ((Uint8 *) texture->pixels +\n                        rect->y * texture->pitch +\n                        rect->x * SDL_BYTESPERPIXEL(texture->format));\n    int pitch = texture->pitch;\n\n    if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {\n        return;\n    }\n    SDL_ConvertPixels(rect->w, rect->h,\n                      texture->format, pixels, pitch,\n                      native->format, native_pixels, native_pitch);\n    SDL_UnlockTexture(native);\n}\n\nvoid\nSDL_UnlockTexture(SDL_Texture * texture)\n{\n    SDL_Renderer *renderer;\n\n    CHECK_TEXTURE_MAGIC(texture, );\n\n    if (texture->access != SDL_TEXTUREACCESS_STREAMING) {\n        return;\n    }\n    if (texture->yuv) {\n        SDL_UnlockTextureYUV(texture);\n    } else if (texture->native) {\n        SDL_UnlockTextureNative(texture);\n    } else {\n        renderer = texture->renderer;\n        renderer->UnlockTexture(renderer, texture);\n    }\n}\n\nSDL_bool\nSDL_RenderTargetSupported(SDL_Renderer *renderer)\n{\n    if (!renderer || !renderer->SetRenderTarget) {\n        return SDL_FALSE;\n    }\n    return (renderer->info.flags & SDL_RENDERER_TARGETTEXTURE) != 0;\n}\n\nint\nSDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)\n{\n    if (!SDL_RenderTargetSupported(renderer)) {\n        return SDL_Unsupported();\n    }\n    if (texture == renderer->target) {\n        /* Nothing to do! */\n        return 0;\n    }\n\n    /* texture == NULL is valid and means reset the target to the window */\n    if (texture) {\n        CHECK_TEXTURE_MAGIC(texture, -1);\n        if (renderer != texture->renderer) {\n            return SDL_SetError(\"Texture was not created with this renderer\");\n        }\n        if (texture->access != SDL_TEXTUREACCESS_TARGET) {\n            return SDL_SetError(\"Texture not created with SDL_TEXTUREACCESS_TARGET\");\n        }\n        if (texture->native) {\n            /* Always render to the native texture */\n            texture = texture->native;\n        }\n    }\n\n    if (texture && !renderer->target) {\n        /* Make a backup of the viewport */\n        renderer->viewport_backup = renderer->viewport;\n        renderer->clip_rect_backup = renderer->clip_rect;\n        renderer->clipping_enabled_backup = renderer->clipping_enabled;\n        renderer->scale_backup = renderer->scale;\n        renderer->logical_w_backup = renderer->logical_w;\n        renderer->logical_h_backup = renderer->logical_h;\n    }\n    renderer->target = texture;\n\n    if (renderer->SetRenderTarget(renderer, texture) < 0) {\n        return -1;\n    }\n\n    if (texture) {\n        renderer->viewport.x = 0;\n        renderer->viewport.y = 0;\n        renderer->viewport.w = texture->w;\n        renderer->viewport.h = texture->h;\n        SDL_zero(renderer->clip_rect);\n        renderer->clipping_enabled = SDL_FALSE;\n        renderer->scale.x = 1.0f;\n        renderer->scale.y = 1.0f;\n        renderer->logical_w = texture->w;\n        renderer->logical_h = texture->h;\n    } else {\n        renderer->viewport = renderer->viewport_backup;\n        renderer->clip_rect = renderer->clip_rect_backup;\n        renderer->clipping_enabled = renderer->clipping_enabled_backup;\n        renderer->scale = renderer->scale_backup;\n        renderer->logical_w = renderer->logical_w_backup;\n        renderer->logical_h = renderer->logical_h_backup;\n    }\n    if (renderer->UpdateViewport(renderer) < 0) {\n        return -1;\n    }\n    if (renderer->UpdateClipRect(renderer) < 0) {\n        return -1;\n    }\n\n    /* All set! */\n    return 0;\n}\n\nSDL_Texture *\nSDL_GetRenderTarget(SDL_Renderer *renderer)\n{\n    return renderer->target;\n}\n\nstatic int\nUpdateLogicalSize(SDL_Renderer *renderer)\n{\n    int w = 1, h = 1;\n    float want_aspect;\n    float real_aspect;\n    float scale;\n    SDL_Rect viewport;\n\n    if (!renderer->logical_w || !renderer->logical_h) {\n        return 0;\n    }\n    if (SDL_GetRendererOutputSize(renderer, &w, &h) < 0) {\n        return -1;\n    }\n\n    want_aspect = (float)renderer->logical_w / renderer->logical_h;\n    real_aspect = (float)w / h;\n\n    /* Clear the scale because we're setting viewport in output coordinates */\n    SDL_RenderSetScale(renderer, 1.0f, 1.0f);\n\n    if (renderer->integer_scale) {\n        if (want_aspect > real_aspect) {\n            scale = (float)(w / renderer->logical_w);\n        } else {\n            scale = (float)(h / renderer->logical_h);\n        }\n        viewport.w = (int)SDL_ceil(renderer->logical_w * scale);\n        viewport.x = (w - viewport.w) / 2;\n        viewport.h = (int)SDL_ceil(renderer->logical_h * scale);\n        viewport.y = (h - viewport.h) / 2;\n\n        SDL_RenderSetViewport(renderer, &viewport);\n    } else if (SDL_fabs(want_aspect-real_aspect) < 0.0001) {\n        /* The aspect ratios are the same, just scale appropriately */\n        scale = (float)w / renderer->logical_w;\n        SDL_RenderSetViewport(renderer, NULL);\n    } else if (want_aspect > real_aspect) {\n        /* We want a wider aspect ratio than is available - letterbox it */\n        scale = (float)w / renderer->logical_w;\n        viewport.x = 0;\n        viewport.w = w;\n        viewport.h = (int)SDL_ceil(renderer->logical_h * scale);\n        viewport.y = (h - viewport.h) / 2;\n        SDL_RenderSetViewport(renderer, &viewport);\n    } else {\n        /* We want a narrower aspect ratio than is available - use side-bars */\n        scale = (float)h / renderer->logical_h;\n        viewport.y = 0;\n        viewport.h = h;\n        viewport.w = (int)SDL_ceil(renderer->logical_w * scale);\n        viewport.x = (w - viewport.w) / 2;\n        SDL_RenderSetViewport(renderer, &viewport);\n    }\n\n    /* Set the new scale */\n    SDL_RenderSetScale(renderer, scale, scale);\n\n    return 0;\n}\n\nint\nSDL_RenderSetLogicalSize(SDL_Renderer * renderer, int w, int h)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    if (!w || !h) {\n        /* Clear any previous logical resolution */\n        renderer->logical_w = 0;\n        renderer->logical_h = 0;\n        SDL_RenderSetViewport(renderer, NULL);\n        SDL_RenderSetScale(renderer, 1.0f, 1.0f);\n        return 0;\n    }\n\n    renderer->logical_w = w;\n    renderer->logical_h = h;\n\n    return UpdateLogicalSize(renderer);\n}\n\nvoid\nSDL_RenderGetLogicalSize(SDL_Renderer * renderer, int *w, int *h)\n{\n    CHECK_RENDERER_MAGIC(renderer, );\n\n    if (w) {\n        *w = renderer->logical_w;\n    }\n    if (h) {\n        *h = renderer->logical_h;\n    }\n}\n\nint\nSDL_RenderSetIntegerScale(SDL_Renderer * renderer, SDL_bool enable)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    renderer->integer_scale = enable;\n\n    return UpdateLogicalSize(renderer);\n}\n\nSDL_bool\nSDLCALL SDL_RenderGetIntegerScale(SDL_Renderer * renderer)\n{\n    CHECK_RENDERER_MAGIC(renderer, SDL_FALSE);\n\n    return renderer->integer_scale;\n}\n\nint\nSDL_RenderSetViewport(SDL_Renderer * renderer, const SDL_Rect * rect)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    if (rect) {\n        renderer->viewport.x = (int)SDL_floor(rect->x * renderer->scale.x);\n        renderer->viewport.y = (int)SDL_floor(rect->y * renderer->scale.y);\n        renderer->viewport.w = (int)SDL_ceil(rect->w * renderer->scale.x);\n        renderer->viewport.h = (int)SDL_ceil(rect->h * renderer->scale.y);\n    } else {\n        renderer->viewport.x = 0;\n        renderer->viewport.y = 0;\n        if (SDL_GetRendererOutputSize(renderer, &renderer->viewport.w, &renderer->viewport.h) < 0) {\n            return -1;\n        }\n    }\n    return renderer->UpdateViewport(renderer);\n}\n\nvoid\nSDL_RenderGetViewport(SDL_Renderer * renderer, SDL_Rect * rect)\n{\n    CHECK_RENDERER_MAGIC(renderer, );\n\n    if (rect) {\n        rect->x = (int)(renderer->viewport.x / renderer->scale.x);\n        rect->y = (int)(renderer->viewport.y / renderer->scale.y);\n        rect->w = (int)(renderer->viewport.w / renderer->scale.x);\n        rect->h = (int)(renderer->viewport.h / renderer->scale.y);\n    }\n}\n\nint\nSDL_RenderSetClipRect(SDL_Renderer * renderer, const SDL_Rect * rect)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1)\n\n    if (rect) {\n        renderer->clipping_enabled = SDL_TRUE;\n        renderer->clip_rect.x = (int)SDL_floor(rect->x * renderer->scale.x);\n        renderer->clip_rect.y = (int)SDL_floor(rect->y * renderer->scale.y);\n        renderer->clip_rect.w = (int)SDL_ceil(rect->w * renderer->scale.x);\n        renderer->clip_rect.h = (int)SDL_ceil(rect->h * renderer->scale.y);\n    } else {\n        renderer->clipping_enabled = SDL_FALSE;\n        SDL_zero(renderer->clip_rect);\n    }\n    return renderer->UpdateClipRect(renderer);\n}\n\nvoid\nSDL_RenderGetClipRect(SDL_Renderer * renderer, SDL_Rect * rect)\n{\n    CHECK_RENDERER_MAGIC(renderer, )\n\n    if (rect) {\n        rect->x = (int)(renderer->clip_rect.x / renderer->scale.x);\n        rect->y = (int)(renderer->clip_rect.y / renderer->scale.y);\n        rect->w = (int)(renderer->clip_rect.w / renderer->scale.x);\n        rect->h = (int)(renderer->clip_rect.h / renderer->scale.y);\n    }\n}\n\nSDL_bool\nSDL_RenderIsClipEnabled(SDL_Renderer * renderer)\n{\n    CHECK_RENDERER_MAGIC(renderer, SDL_FALSE)\n    return renderer->clipping_enabled;\n}\n\nint\nSDL_RenderSetScale(SDL_Renderer * renderer, float scaleX, float scaleY)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    renderer->scale.x = scaleX;\n    renderer->scale.y = scaleY;\n    return 0;\n}\n\nvoid\nSDL_RenderGetScale(SDL_Renderer * renderer, float *scaleX, float *scaleY)\n{\n    CHECK_RENDERER_MAGIC(renderer, );\n\n    if (scaleX) {\n        *scaleX = renderer->scale.x;\n    }\n    if (scaleY) {\n        *scaleY = renderer->scale.y;\n    }\n}\n\nint\nSDL_SetRenderDrawColor(SDL_Renderer * renderer,\n                       Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    renderer->r = r;\n    renderer->g = g;\n    renderer->b = b;\n    renderer->a = a;\n    return 0;\n}\n\nint\nSDL_GetRenderDrawColor(SDL_Renderer * renderer,\n                       Uint8 * r, Uint8 * g, Uint8 * b, Uint8 * a)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    if (r) {\n        *r = renderer->r;\n    }\n    if (g) {\n        *g = renderer->g;\n    }\n    if (b) {\n        *b = renderer->b;\n    }\n    if (a) {\n        *a = renderer->a;\n    }\n    return 0;\n}\n\nint\nSDL_SetRenderDrawBlendMode(SDL_Renderer * renderer, SDL_BlendMode blendMode)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    renderer->blendMode = blendMode;\n    return 0;\n}\n\nint\nSDL_GetRenderDrawBlendMode(SDL_Renderer * renderer, SDL_BlendMode *blendMode)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    *blendMode = renderer->blendMode;\n    return 0;\n}\n\nint\nSDL_RenderClear(SDL_Renderer * renderer)\n{\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    /* Don't draw while we're hidden */\n    if (renderer->hidden) {\n        return 0;\n    }\n    return renderer->RenderClear(renderer);\n}\n\nint\nSDL_RenderDrawPoint(SDL_Renderer * renderer, int x, int y)\n{\n    SDL_Point point;\n\n    point.x = x;\n    point.y = y;\n    return SDL_RenderDrawPoints(renderer, &point, 1);\n}\n\nstatic int\nRenderDrawPointsWithRects(SDL_Renderer * renderer,\n                     const SDL_Point * points, int count)\n{\n    SDL_FRect *frects;\n    int i;\n    int status;\n\n    frects = SDL_stack_alloc(SDL_FRect, count);\n    if (!frects) {\n        return SDL_OutOfMemory();\n    }\n    for (i = 0; i < count; ++i) {\n        frects[i].x = points[i].x * renderer->scale.x;\n        frects[i].y = points[i].y * renderer->scale.y;\n        frects[i].w = renderer->scale.x;\n        frects[i].h = renderer->scale.y;\n    }\n\n    status = renderer->RenderFillRects(renderer, frects, count);\n\n    SDL_stack_free(frects);\n\n    return status;\n}\n\nint\nSDL_RenderDrawPoints(SDL_Renderer * renderer,\n                     const SDL_Point * points, int count)\n{\n    SDL_FPoint *fpoints;\n    int i;\n    int status;\n\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    if (!points) {\n        return SDL_SetError(\"SDL_RenderDrawPoints(): Passed NULL points\");\n    }\n    if (count < 1) {\n        return 0;\n    }\n\n    /* Don't draw while we're hidden */\n    if (renderer->hidden) {\n        return 0;\n    }\n\n    if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {\n        return RenderDrawPointsWithRects(renderer, points, count);\n    }\n\n    fpoints = SDL_stack_alloc(SDL_FPoint, count);\n    if (!fpoints) {\n        return SDL_OutOfMemory();\n    }\n    for (i = 0; i < count; ++i) {\n        fpoints[i].x = points[i].x * renderer->scale.x;\n        fpoints[i].y = points[i].y * renderer->scale.y;\n    }\n\n    status = renderer->RenderDrawPoints(renderer, fpoints, count);\n\n    SDL_stack_free(fpoints);\n\n    return status;\n}\n\nint\nSDL_RenderDrawLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)\n{\n    SDL_Point points[2];\n\n    points[0].x = x1;\n    points[0].y = y1;\n    points[1].x = x2;\n    points[1].y = y2;\n    return SDL_RenderDrawLines(renderer, points, 2);\n}\n\nstatic int\nRenderDrawLinesWithRects(SDL_Renderer * renderer,\n                     const SDL_Point * points, int count)\n{\n    SDL_FRect *frect;\n    SDL_FRect *frects;\n    SDL_FPoint fpoints[2];\n    int i, nrects;\n    int status;\n\n    frects = SDL_stack_alloc(SDL_FRect, count-1);\n    if (!frects) {\n        return SDL_OutOfMemory();\n    }\n\n    status = 0;\n    nrects = 0;\n    for (i = 0; i < count-1; ++i) {\n        if (points[i].x == points[i+1].x) {\n            int minY = SDL_min(points[i].y, points[i+1].y);\n            int maxY = SDL_max(points[i].y, points[i+1].y);\n\n            frect = &frects[nrects++];\n            frect->x = points[i].x * renderer->scale.x;\n            frect->y = minY * renderer->scale.y;\n            frect->w = renderer->scale.x;\n            frect->h = (maxY - minY + 1) * renderer->scale.y;\n        } else if (points[i].y == points[i+1].y) {\n            int minX = SDL_min(points[i].x, points[i+1].x);\n            int maxX = SDL_max(points[i].x, points[i+1].x);\n\n            frect = &frects[nrects++];\n            frect->x = minX * renderer->scale.x;\n            frect->y = points[i].y * renderer->scale.y;\n            frect->w = (maxX - minX + 1) * renderer->scale.x;\n            frect->h = renderer->scale.y;\n        } else {\n            /* FIXME: We can't use a rect for this line... */\n            fpoints[0].x = points[i].x * renderer->scale.x;\n            fpoints[0].y = points[i].y * renderer->scale.y;\n            fpoints[1].x = points[i+1].x * renderer->scale.x;\n            fpoints[1].y = points[i+1].y * renderer->scale.y;\n            status += renderer->RenderDrawLines(renderer, fpoints, 2);\n        }\n    }\n\n    status += renderer->RenderFillRects(renderer, frects, nrects);\n\n    SDL_stack_free(frects);\n\n    if (status < 0) {\n        status = -1;\n    }\n    return status;\n}\n\nint\nSDL_RenderDrawLines(SDL_Renderer * renderer,\n                    const SDL_Point * points, int count)\n{\n    SDL_FPoint *fpoints;\n    int i;\n    int status;\n\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    if (!points) {\n        return SDL_SetError(\"SDL_RenderDrawLines(): Passed NULL points\");\n    }\n    if (count < 2) {\n        return 0;\n    }\n\n    /* Don't draw while we're hidden */\n    if (renderer->hidden) {\n        return 0;\n    }\n\n    if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {\n        return RenderDrawLinesWithRects(renderer, points, count);\n    }\n\n    fpoints = SDL_stack_alloc(SDL_FPoint, count);\n    if (!fpoints) {\n        return SDL_OutOfMemory();\n    }\n    for (i = 0; i < count; ++i) {\n        fpoints[i].x = points[i].x * renderer->scale.x;\n        fpoints[i].y = points[i].y * renderer->scale.y;\n    }\n\n    status = renderer->RenderDrawLines(renderer, fpoints, count);\n\n    SDL_stack_free(fpoints);\n\n    return status;\n}\n\nint\nSDL_RenderDrawRect(SDL_Renderer * renderer, const SDL_Rect * rect)\n{\n    SDL_Rect full_rect;\n    SDL_Point points[5];\n\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    /* If 'rect' == NULL, then outline the whole surface */\n    if (!rect) {\n        SDL_RenderGetViewport(renderer, &full_rect);\n        full_rect.x = 0;\n        full_rect.y = 0;\n        rect = &full_rect;\n    }\n\n    points[0].x = rect->x;\n    points[0].y = rect->y;\n    points[1].x = rect->x+rect->w-1;\n    points[1].y = rect->y;\n    points[2].x = rect->x+rect->w-1;\n    points[2].y = rect->y+rect->h-1;\n    points[3].x = rect->x;\n    points[3].y = rect->y+rect->h-1;\n    points[4].x = rect->x;\n    points[4].y = rect->y;\n    return SDL_RenderDrawLines(renderer, points, 5);\n}\n\nint\nSDL_RenderDrawRects(SDL_Renderer * renderer,\n                    const SDL_Rect * rects, int count)\n{\n    int i;\n\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    if (!rects) {\n        return SDL_SetError(\"SDL_RenderDrawRects(): Passed NULL rects\");\n    }\n    if (count < 1) {\n        return 0;\n    }\n\n    /* Don't draw while we're hidden */\n    if (renderer->hidden) {\n        return 0;\n    }\n\n    for (i = 0; i < count; ++i) {\n        if (SDL_RenderDrawRect(renderer, &rects[i]) < 0) {\n            return -1;\n        }\n    }\n    return 0;\n}\n\nint\nSDL_RenderFillRect(SDL_Renderer * renderer, const SDL_Rect * rect)\n{\n    SDL_Rect full_rect = { 0, 0, 0, 0 };\n\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    /* If 'rect' == NULL, then outline the whole surface */\n    if (!rect) {\n        SDL_RenderGetViewport(renderer, &full_rect);\n        full_rect.x = 0;\n        full_rect.y = 0;\n        rect = &full_rect;\n    }\n    return SDL_RenderFillRects(renderer, rect, 1);\n}\n\nint\nSDL_RenderFillRects(SDL_Renderer * renderer,\n                    const SDL_Rect * rects, int count)\n{\n    SDL_FRect *frects;\n    int i;\n    int status;\n\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    if (!rects) {\n        return SDL_SetError(\"SDL_RenderFillRects(): Passed NULL rects\");\n    }\n    if (count < 1) {\n        return 0;\n    }\n\n    /* Don't draw while we're hidden */\n    if (renderer->hidden) {\n        return 0;\n    }\n\n    frects = SDL_stack_alloc(SDL_FRect, count);\n    if (!frects) {\n        return SDL_OutOfMemory();\n    }\n    for (i = 0; i < count; ++i) {\n        frects[i].x = rects[i].x * renderer->scale.x;\n        frects[i].y = rects[i].y * renderer->scale.y;\n        frects[i].w = rects[i].w * renderer->scale.x;\n        frects[i].h = rects[i].h * renderer->scale.y;\n    }\n\n    status = renderer->RenderFillRects(renderer, frects, count);\n\n    SDL_stack_free(frects);\n\n    return status;\n}\n\nint\nSDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,\n               const SDL_Rect * srcrect, const SDL_Rect * dstrect)\n{\n    SDL_Rect real_srcrect = { 0, 0, 0, 0 };\n    SDL_Rect real_dstrect = { 0, 0, 0, 0 };\n    SDL_FRect frect;\n\n    CHECK_RENDERER_MAGIC(renderer, -1);\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    if (renderer != texture->renderer) {\n        return SDL_SetError(\"Texture was not created with this renderer\");\n    }\n\n    /* Don't draw while we're hidden */\n    if (renderer->hidden) {\n        return 0;\n    }\n\n    real_srcrect.x = 0;\n    real_srcrect.y = 0;\n    real_srcrect.w = texture->w;\n    real_srcrect.h = texture->h;\n    if (srcrect) {\n        if (!SDL_IntersectRect(srcrect, &real_srcrect, &real_srcrect)) {\n            return 0;\n        }\n    }\n\n    SDL_RenderGetViewport(renderer, &real_dstrect);\n    real_dstrect.x = 0;\n    real_dstrect.y = 0;\n    if (dstrect) {\n        if (!SDL_HasIntersection(dstrect, &real_dstrect)) {\n            return 0;\n        }\n        real_dstrect = *dstrect;\n    }\n\n    if (texture->native) {\n        texture = texture->native;\n    }\n\n    frect.x = real_dstrect.x * renderer->scale.x;\n    frect.y = real_dstrect.y * renderer->scale.y;\n    frect.w = real_dstrect.w * renderer->scale.x;\n    frect.h = real_dstrect.h * renderer->scale.y;\n\n    return renderer->RenderCopy(renderer, texture, &real_srcrect, &frect);\n}\n\n\nint\nSDL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n               const SDL_Rect * srcrect, const SDL_Rect * dstrect,\n               const double angle, const SDL_Point *center, const SDL_RendererFlip flip)\n{\n    SDL_Rect real_srcrect = { 0, 0, 0, 0 };\n    SDL_Rect real_dstrect = { 0, 0, 0, 0 };\n    SDL_Point real_center;\n    SDL_FRect frect;\n    SDL_FPoint fcenter;\n\n    if (flip == SDL_FLIP_NONE && (int)(angle/360) == angle/360) { /* fast path when we don't need rotation or flipping */\n        return SDL_RenderCopy(renderer, texture, srcrect, dstrect);\n    }\n\n    CHECK_RENDERER_MAGIC(renderer, -1);\n    CHECK_TEXTURE_MAGIC(texture, -1);\n\n    if (renderer != texture->renderer) {\n        return SDL_SetError(\"Texture was not created with this renderer\");\n    }\n    if (!renderer->RenderCopyEx) {\n        return SDL_SetError(\"Renderer does not support RenderCopyEx\");\n    }\n\n    /* Don't draw while we're hidden */\n    if (renderer->hidden) {\n        return 0;\n    }\n\n    real_srcrect.x = 0;\n    real_srcrect.y = 0;\n    real_srcrect.w = texture->w;\n    real_srcrect.h = texture->h;\n    if (srcrect) {\n        if (!SDL_IntersectRect(srcrect, &real_srcrect, &real_srcrect)) {\n            return 0;\n        }\n    }\n\n    /* We don't intersect the dstrect with the viewport as RenderCopy does because of potential rotation clipping issues... TODO: should we? */\n    if (dstrect) {\n        real_dstrect = *dstrect;\n    } else {\n        SDL_RenderGetViewport(renderer, &real_dstrect);\n        real_dstrect.x = 0;\n        real_dstrect.y = 0;\n    }\n\n    if (texture->native) {\n        texture = texture->native;\n    }\n\n    if (center) {\n        real_center = *center;\n    } else {\n        real_center.x = real_dstrect.w/2;\n        real_center.y = real_dstrect.h/2;\n    }\n\n    frect.x = real_dstrect.x * renderer->scale.x;\n    frect.y = real_dstrect.y * renderer->scale.y;\n    frect.w = real_dstrect.w * renderer->scale.x;\n    frect.h = real_dstrect.h * renderer->scale.y;\n\n    fcenter.x = real_center.x * renderer->scale.x;\n    fcenter.y = real_center.y * renderer->scale.y;\n\n    return renderer->RenderCopyEx(renderer, texture, &real_srcrect, &frect, angle, &fcenter, flip);\n}\n\nint\nSDL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                     Uint32 format, void * pixels, int pitch)\n{\n    SDL_Rect real_rect;\n\n    CHECK_RENDERER_MAGIC(renderer, -1);\n\n    if (!renderer->RenderReadPixels) {\n        return SDL_Unsupported();\n    }\n\n    if (!format) {\n        format = SDL_GetWindowPixelFormat(renderer->window);\n    }\n\n    real_rect.x = renderer->viewport.x;\n    real_rect.y = renderer->viewport.y;\n    real_rect.w = renderer->viewport.w;\n    real_rect.h = renderer->viewport.h;\n    if (rect) {\n        if (!SDL_IntersectRect(rect, &real_rect, &real_rect)) {\n            return 0;\n        }\n        if (real_rect.y > rect->y) {\n            pixels = (Uint8 *)pixels + pitch * (real_rect.y - rect->y);\n        }\n        if (real_rect.x > rect->x) {\n            int bpp = SDL_BYTESPERPIXEL(format);\n            pixels = (Uint8 *)pixels + bpp * (real_rect.x - rect->x);\n        }\n    }\n\n    return renderer->RenderReadPixels(renderer, &real_rect,\n                                      format, pixels, pitch);\n}\n\nvoid\nSDL_RenderPresent(SDL_Renderer * renderer)\n{\n    CHECK_RENDERER_MAGIC(renderer, );\n\n    /* Don't draw while we're hidden */\n    if (renderer->hidden) {\n        return;\n    }\n    renderer->RenderPresent(renderer);\n}\n\nvoid\nSDL_DestroyTexture(SDL_Texture * texture)\n{\n    SDL_Renderer *renderer;\n\n    CHECK_TEXTURE_MAGIC(texture, );\n\n    renderer = texture->renderer;\n    if (texture == renderer->target) {\n        SDL_SetRenderTarget(renderer, NULL);\n    }\n\n    texture->magic = NULL;\n\n    if (texture->next) {\n        texture->next->prev = texture->prev;\n    }\n    if (texture->prev) {\n        texture->prev->next = texture->next;\n    } else {\n        renderer->textures = texture->next;\n    }\n\n    if (texture->native) {\n        SDL_DestroyTexture(texture->native);\n    }\n    if (texture->yuv) {\n        SDL_SW_DestroyYUVTexture(texture->yuv);\n    }\n    SDL_free(texture->pixels);\n\n    renderer->DestroyTexture(renderer, texture);\n    SDL_free(texture);\n}\n\nvoid\nSDL_DestroyRenderer(SDL_Renderer * renderer)\n{\n    CHECK_RENDERER_MAGIC(renderer, );\n\n    SDL_DelEventWatch(SDL_RendererEventWatch, renderer);\n\n    /* Free existing textures for this renderer */\n    while (renderer->textures) {\n        SDL_DestroyTexture(renderer->textures);\n    }\n\n    if (renderer->window) {\n        SDL_SetWindowData(renderer->window, SDL_WINDOWRENDERDATA, NULL);\n    }\n\n    /* It's no longer magical... */\n    renderer->magic = NULL;\n\n    /* Free the renderer instance */\n    renderer->DestroyRenderer(renderer);\n}\n\nint SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh)\n{\n    SDL_Renderer *renderer;\n\n    CHECK_TEXTURE_MAGIC(texture, -1);\n    renderer = texture->renderer;\n    if (texture->native) {\n        return SDL_GL_BindTexture(texture->native, texw, texh);\n    } else if (renderer && renderer->GL_BindTexture) {\n        return renderer->GL_BindTexture(renderer, texture, texw, texh);\n    } else {\n        return SDL_Unsupported();\n    }\n}\n\nint SDL_GL_UnbindTexture(SDL_Texture *texture)\n{\n    SDL_Renderer *renderer;\n\n    CHECK_TEXTURE_MAGIC(texture, -1);\n    renderer = texture->renderer;\n    if (texture->native) {\n        return SDL_GL_UnbindTexture(texture->native);\n    } else if (renderer && renderer->GL_UnbindTexture) {\n        return renderer->GL_UnbindTexture(renderer, texture);\n    }\n\n    return SDL_Unsupported();\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/SDL_sysrender.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_sysrender_h\n#define _SDL_sysrender_h\n\n#include \"SDL_render.h\"\n#include \"SDL_events.h\"\n#include \"SDL_yuv_sw_c.h\"\n\n/* The SDL 2D rendering system */\n\ntypedef struct SDL_RenderDriver SDL_RenderDriver;\n\ntypedef struct\n{\n    float x;\n    float y;\n} SDL_FPoint;\n\ntypedef struct\n{\n    float x;\n    float y;\n    float w;\n    float h;\n} SDL_FRect;\n\n/* Define the SDL texture structure */\nstruct SDL_Texture\n{\n    const void *magic;\n    Uint32 format;              /**< The pixel format of the texture */\n    int access;                 /**< SDL_TextureAccess */\n    int w;                      /**< The width of the texture */\n    int h;                      /**< The height of the texture */\n    int modMode;                /**< The texture modulation mode */\n    SDL_BlendMode blendMode;    /**< The texture blend mode */\n    Uint8 r, g, b, a;           /**< Texture modulation values */\n\n    SDL_Renderer *renderer;\n\n    /* Support for formats not supported directly by the renderer */\n    SDL_Texture *native;\n    SDL_SW_YUVTexture *yuv;\n    void *pixels;\n    int pitch;\n    SDL_Rect locked_rect;\n\n    void *driverdata;           /**< Driver specific texture representation */\n\n    SDL_Texture *prev;\n    SDL_Texture *next;\n};\n\n/* Define the SDL renderer structure */\nstruct SDL_Renderer\n{\n    const void *magic;\n\n    void (*WindowEvent) (SDL_Renderer * renderer, const SDL_WindowEvent *event);\n    int (*GetOutputSize) (SDL_Renderer * renderer, int *w, int *h);\n    int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);\n    int (*SetTextureColorMod) (SDL_Renderer * renderer,\n                               SDL_Texture * texture);\n    int (*SetTextureAlphaMod) (SDL_Renderer * renderer,\n                               SDL_Texture * texture);\n    int (*SetTextureBlendMode) (SDL_Renderer * renderer,\n                                SDL_Texture * texture);\n    int (*UpdateTexture) (SDL_Renderer * renderer, SDL_Texture * texture,\n                          const SDL_Rect * rect, const void *pixels,\n                          int pitch);\n    int (*UpdateTextureYUV) (SDL_Renderer * renderer, SDL_Texture * texture,\n                            const SDL_Rect * rect,\n                            const Uint8 *Yplane, int Ypitch,\n                            const Uint8 *Uplane, int Upitch,\n                            const Uint8 *Vplane, int Vpitch);\n    int (*LockTexture) (SDL_Renderer * renderer, SDL_Texture * texture,\n                        const SDL_Rect * rect, void **pixels, int *pitch);\n    void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture);\n    int (*SetRenderTarget) (SDL_Renderer * renderer, SDL_Texture * texture);\n    int (*UpdateViewport) (SDL_Renderer * renderer);\n    int (*UpdateClipRect) (SDL_Renderer * renderer);\n    int (*RenderClear) (SDL_Renderer * renderer);\n    int (*RenderDrawPoints) (SDL_Renderer * renderer, const SDL_FPoint * points,\n                             int count);\n    int (*RenderDrawLines) (SDL_Renderer * renderer, const SDL_FPoint * points,\n                            int count);\n    int (*RenderFillRects) (SDL_Renderer * renderer, const SDL_FRect * rects,\n                            int count);\n    int (*RenderCopy) (SDL_Renderer * renderer, SDL_Texture * texture,\n                       const SDL_Rect * srcrect, const SDL_FRect * dstrect);\n    int (*RenderCopyEx) (SDL_Renderer * renderer, SDL_Texture * texture,\n                       const SDL_Rect * srcquad, const SDL_FRect * dstrect,\n                       const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);\n    int (*RenderReadPixels) (SDL_Renderer * renderer, const SDL_Rect * rect,\n                             Uint32 format, void * pixels, int pitch);\n    void (*RenderPresent) (SDL_Renderer * renderer);\n    void (*DestroyTexture) (SDL_Renderer * renderer, SDL_Texture * texture);\n\n    void (*DestroyRenderer) (SDL_Renderer * renderer);\n\n    int (*GL_BindTexture) (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh);\n    int (*GL_UnbindTexture) (SDL_Renderer * renderer, SDL_Texture *texture);\n\n    /* The current renderer info */\n    SDL_RendererInfo info;\n\n    /* The window associated with the renderer */\n    SDL_Window *window;\n    SDL_bool hidden;\n\n    /* The logical resolution for rendering */\n    int logical_w;\n    int logical_h;\n    int logical_w_backup;\n    int logical_h_backup;\n\n    /* Whether or not to force the viewport to even integer intervals */\n    SDL_bool integer_scale;\n\n    /* The drawable area within the window */\n    SDL_Rect viewport;\n    SDL_Rect viewport_backup;\n\n    /* The clip rectangle within the window */\n    SDL_Rect clip_rect;\n    SDL_Rect clip_rect_backup;\n\n    /* Wether or not the clipping rectangle is used. */\n    SDL_bool clipping_enabled;\n    SDL_bool clipping_enabled_backup;\n\n    /* The render output coordinate scale */\n    SDL_FPoint scale;\n    SDL_FPoint scale_backup;\n\n    /* The list of textures */\n    SDL_Texture *textures;\n    SDL_Texture *target;\n\n    Uint8 r, g, b, a;                   /**< Color for drawing operations values */\n    SDL_BlendMode blendMode;            /**< The drawing blend mode */\n\n    void *driverdata;\n};\n\n/* Define the SDL render driver structure */\nstruct SDL_RenderDriver\n{\n    SDL_Renderer *(*CreateRenderer) (SDL_Window * window, Uint32 flags);\n\n    /* Info about the renderer capabilities */\n    SDL_RendererInfo info;\n};\n\n#if !SDL_RENDER_DISABLED\n\n#if SDL_VIDEO_RENDER_D3D\nextern SDL_RenderDriver D3D_RenderDriver;\n#endif\n#if SDL_VIDEO_RENDER_D3D11\nextern SDL_RenderDriver D3D11_RenderDriver;\n#endif\n#if SDL_VIDEO_RENDER_OGL\nextern SDL_RenderDriver GL_RenderDriver;\n#endif\n#if SDL_VIDEO_RENDER_OGL_ES2\nextern SDL_RenderDriver GLES2_RenderDriver;\n#endif\n#if SDL_VIDEO_RENDER_OGL_ES\nextern SDL_RenderDriver GLES_RenderDriver;\n#endif\n#if SDL_VIDEO_RENDER_DIRECTFB\nextern SDL_RenderDriver DirectFB_RenderDriver;\n#endif\n#if SDL_VIDEO_RENDER_PSP\nextern SDL_RenderDriver PSP_RenderDriver;\n#endif\nextern SDL_RenderDriver SW_RenderDriver;\n\n#endif /* !SDL_RENDER_DISABLED */\n\n#endif /* _SDL_sysrender_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/SDL_yuv_mmx.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#if (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES\n\n#include \"SDL_stdinc.h\"\n\n#include \"mmx.h\"\n\n/* *INDENT-OFF* */\n\nstatic mmx_t MMX_0080w    = { .ud = {0x00800080, 0x00800080} };\nstatic mmx_t MMX_00FFw    = { .ud = {0x00ff00ff, 0x00ff00ff} };\nstatic mmx_t MMX_FF00w    = { .ud = {0xff00ff00, 0xff00ff00} };\n\nstatic mmx_t MMX_Ycoeff   = { .uw = {0x004a, 0x004a, 0x004a, 0x004a} };\n\nstatic mmx_t MMX_UbluRGB  = { .uw = {0x0072, 0x0072, 0x0072, 0x0072} };\nstatic mmx_t MMX_VredRGB  = { .uw = {0x0059, 0x0059, 0x0059, 0x0059} };\nstatic mmx_t MMX_UgrnRGB  = { .uw = {0xffea, 0xffea, 0xffea, 0xffea} };\nstatic mmx_t MMX_VgrnRGB  = { .uw = {0xffd2, 0xffd2, 0xffd2, 0xffd2} };\n\nstatic mmx_t MMX_Ublu5x5  = { .uw = {0x0081, 0x0081, 0x0081, 0x0081} };\nstatic mmx_t MMX_Vred5x5  = { .uw = {0x0066, 0x0066, 0x0066, 0x0066} };\nstatic mmx_t MMX_Ugrn565  = { .uw = {0xffe8, 0xffe8, 0xffe8, 0xffe8} };\nstatic mmx_t MMX_Vgrn565  = { .uw = {0xffcd, 0xffcd, 0xffcd, 0xffcd} };\n\nstatic mmx_t MMX_red565   = { .uw = {0xf800, 0xf800, 0xf800, 0xf800} };\nstatic mmx_t MMX_grn565   = { .uw = {0x07e0, 0x07e0, 0x07e0, 0x07e0} };\n\n/**\n   This MMX assembler is my first assembler/MMX program ever.\n   Thus it maybe buggy.\n   Send patches to:\n   mvogt@rhrk.uni-kl.de\n\n   After it worked fine I have \"obfuscated\" the code a bit to have\n   more parallism in the MMX units. This means I moved\n   initilisation around and delayed other instruction.\n   Performance measurement did not show that this brought any advantage\n   but in theory it _should_ be faster this way.\n\n   The overall performanve gain to the C based dither was 30%-40%.\n   The MMX routine calculates 256bit=8RGB values in each cycle\n   (4 for row1 & 4 for row2)\n\n   The red/green/blue.. coefficents are taken from the mpeg_play\n   player. They look nice, but I dont know if you can have\n   better values, to avoid integer rounding errors.\n\n\n   IMPORTANT:\n   ==========\n\n   It is a requirement that the cr/cb/lum are 8 byte aligned and\n   the out are 16byte aligned or you will/may get segfaults\n\n*/\n\nvoid ColorRGBDitherYV12MMX1X( int *colortab, Uint32 *rgb_2_pix,\n                              unsigned char *lum, unsigned char *cr,\n                              unsigned char *cb, unsigned char *out,\n                              int rows, int cols, int mod )\n{\n    Uint32 *row1;\n    Uint32 *row2;\n\n    unsigned char* y = lum +cols*rows;    /* Pointer to the end */\n    int x = 0;\n    row1 = (Uint32 *)out;                 /* 32 bit target */\n    row2 = (Uint32 *)out+cols+mod;        /* start of second row */\n    mod = (mod+cols+mod)*4;               /* increment for row1 in byte */\n\n    __asm__ __volatile__ (\n        /* tap dance to workaround the inability to use %%ebx at will... */\n        /*  move one thing to the stack... */\n        \"pushl $0\\n\"  /* save a slot on the stack. */\n        \"pushl %%ebx\\n\"  /* save %%ebx. */\n        \"movl %0, %%ebx\\n\"  /* put the thing in ebx. */\n        \"movl %%ebx,4(%%esp)\\n\"  /* put the thing in the stack slot. */\n        \"popl %%ebx\\n\"  /* get back %%ebx (the PIC register). */\n\n        \".align 8\\n\"\n        \"1:\\n\"\n\n        /* create Cr (result in mm1) */\n        \"pushl %%ebx\\n\"\n        \"movl 4(%%esp),%%ebx\\n\"\n        \"movd (%%ebx),%%mm1\\n\"   /*         0  0  0  0  v3 v2 v1 v0 */\n        \"popl %%ebx\\n\"\n        \"pxor %%mm7,%%mm7\\n\"      /*         00 00 00 00 00 00 00 00 */\n        \"movd (%2), %%mm2\\n\"           /*    0  0  0  0 l3 l2 l1 l0 */\n        \"punpcklbw %%mm7,%%mm1\\n\" /*         0  v3 0  v2 00 v1 00 v0 */\n        \"punpckldq %%mm1,%%mm1\\n\" /*         00 v1 00 v0 00 v1 00 v0 */\n        \"psubw %9,%%mm1\\n\"        /* mm1-128:r1 r1 r0 r0 r1 r1 r0 r0 */\n\n        /* create Cr_g (result in mm0) */\n        \"movq %%mm1,%%mm0\\n\"           /* r1 r1 r0 r0 r1 r1 r0 r0 */\n        \"pmullw %10,%%mm0\\n\"           /* red*-46dec=0.7136*64 */\n        \"pmullw %11,%%mm1\\n\"           /* red*89dec=1.4013*64 */\n        \"psraw  $6, %%mm0\\n\"           /* red=red/64 */\n        \"psraw  $6, %%mm1\\n\"           /* red=red/64 */\n\n        /* create L1 L2 (result in mm2,mm4) */\n        /* L2=lum+cols */\n        \"movq (%2,%4),%%mm3\\n\"         /*    0  0  0  0 L3 L2 L1 L0 */\n        \"punpckldq %%mm3,%%mm2\\n\"      /*   L3 L2 L1 L0 l3 l2 l1 l0 */\n        \"movq %%mm2,%%mm4\\n\"           /*   L3 L2 L1 L0 l3 l2 l1 l0 */\n        \"pand %12,%%mm2\\n\"             /*   L3 0  L1  0 l3  0 l1  0 */\n        \"pand %13,%%mm4\\n\"             /*   0  L2  0 L0  0 l2  0 l0 */\n        \"psrlw $8,%%mm2\\n\"             /*   0  L3  0 L1  0 l3  0 l1 */\n\n        /* create R (result in mm6) */\n        \"movq %%mm2,%%mm5\\n\"           /*   0 L3  0 L1  0 l3  0 l1 */\n        \"movq %%mm4,%%mm6\\n\"           /*   0 L2  0 L0  0 l2  0 l0 */\n        \"paddsw  %%mm1, %%mm5\\n\"       /* lum1+red:x R3 x R1 x r3 x r1 */\n        \"paddsw  %%mm1, %%mm6\\n\"       /* lum1+red:x R2 x R0 x r2 x r0 */\n        \"packuswb %%mm5,%%mm5\\n\"       /*  R3 R1 r3 r1 R3 R1 r3 r1 */\n        \"packuswb %%mm6,%%mm6\\n\"       /*  R2 R0 r2 r0 R2 R0 r2 r0 */\n        \"pxor %%mm7,%%mm7\\n\"      /*         00 00 00 00 00 00 00 00 */\n        \"punpcklbw %%mm5,%%mm6\\n\"      /*  R3 R2 R1 R0 r3 r2 r1 r0 */\n\n        /* create Cb (result in mm1) */\n        \"movd (%1), %%mm1\\n\"      /*         0  0  0  0  u3 u2 u1 u0 */\n        \"punpcklbw %%mm7,%%mm1\\n\" /*         0  u3 0  u2 00 u1 00 u0 */\n        \"punpckldq %%mm1,%%mm1\\n\" /*         00 u1 00 u0 00 u1 00 u0 */\n        \"psubw %9,%%mm1\\n\"        /* mm1-128:u1 u1 u0 u0 u1 u1 u0 u0 */\n\n        /* create Cb_g (result in mm5) */\n        \"movq %%mm1,%%mm5\\n\"            /* u1 u1 u0 u0 u1 u1 u0 u0 */\n        \"pmullw %14,%%mm5\\n\"            /* blue*-109dec=1.7129*64 */\n        \"pmullw %15,%%mm1\\n\"            /* blue*114dec=1.78125*64 */\n        \"psraw  $6, %%mm5\\n\"            /* blue=red/64 */\n        \"psraw  $6, %%mm1\\n\"            /* blue=blue/64 */\n\n        /* create G (result in mm7) */\n        \"movq %%mm2,%%mm3\\n\"      /*   0  L3  0 L1  0 l3  0 l1 */\n        \"movq %%mm4,%%mm7\\n\"      /*   0  L2  0 L0  0 l2  0 l1 */\n        \"paddsw  %%mm5, %%mm3\\n\"  /* lum1+Cb_g:x G3t x G1t x g3t x g1t */\n        \"paddsw  %%mm5, %%mm7\\n\"  /* lum1+Cb_g:x G2t x G0t x g2t x g0t */\n        \"paddsw  %%mm0, %%mm3\\n\"  /* lum1+Cr_g:x G3  x G1  x g3  x g1 */\n        \"paddsw  %%mm0, %%mm7\\n\"  /* lum1+blue:x G2  x G0  x g2  x g0 */\n        \"packuswb %%mm3,%%mm3\\n\"  /* G3 G1 g3 g1 G3 G1 g3 g1 */\n        \"packuswb %%mm7,%%mm7\\n\"  /* G2 G0 g2 g0 G2 G0 g2 g0 */\n        \"punpcklbw %%mm3,%%mm7\\n\" /* G3 G2 G1 G0 g3 g2 g1 g0 */\n\n        /* create B (result in mm5) */\n        \"movq %%mm2,%%mm3\\n\"         /*   0  L3  0 L1  0 l3  0 l1 */\n        \"movq %%mm4,%%mm5\\n\"         /*   0  L2  0 L0  0 l2  0 l1 */\n        \"paddsw  %%mm1, %%mm3\\n\"     /* lum1+blue:x B3 x B1 x b3 x b1 */\n        \"paddsw  %%mm1, %%mm5\\n\"     /* lum1+blue:x B2 x B0 x b2 x b0 */\n        \"packuswb %%mm3,%%mm3\\n\"     /* B3 B1 b3 b1 B3 B1 b3 b1 */\n        \"packuswb %%mm5,%%mm5\\n\"     /* B2 B0 b2 b0 B2 B0 b2 b0 */\n        \"punpcklbw %%mm3,%%mm5\\n\"    /* B3 B2 B1 B0 b3 b2 b1 b0 */\n\n        /* fill destination row1 (needed are mm6=Rr,mm7=Gg,mm5=Bb) */\n\n        \"pxor %%mm2,%%mm2\\n\"           /*  0  0  0  0  0  0  0  0 */\n        \"pxor %%mm4,%%mm4\\n\"           /*  0  0  0  0  0  0  0  0 */\n        \"movq %%mm6,%%mm1\\n\"           /* R3 R2 R1 R0 r3 r2 r1 r0 */\n        \"movq %%mm5,%%mm3\\n\"           /* B3 B2 B1 B0 b3 b2 b1 b0 */\n\n        /* process lower lum */\n        \"punpcklbw %%mm4,%%mm1\\n\"      /*  0 r3  0 r2  0 r1  0 r0 */\n        \"punpcklbw %%mm4,%%mm3\\n\"      /*  0 b3  0 b2  0 b1  0 b0 */\n        \"movq %%mm1,%%mm2\\n\"           /*  0 r3  0 r2  0 r1  0 r0 */\n        \"movq %%mm3,%%mm0\\n\"           /*  0 b3  0 b2  0 b1  0 b0 */\n        \"punpcklwd %%mm1,%%mm3\\n\"      /*  0 r1  0 b1  0 r0  0 b0 */\n        \"punpckhwd %%mm2,%%mm0\\n\"      /*  0 r3  0 b3  0 r2  0 b2 */\n\n        \"pxor %%mm2,%%mm2\\n\"           /*  0  0  0  0  0  0  0  0 */\n        \"movq %%mm7,%%mm1\\n\"           /* G3 G2 G1 G0 g3 g2 g1 g0 */\n        \"punpcklbw %%mm1,%%mm2\\n\"      /* g3  0 g2  0 g1  0 g0  0 */\n        \"punpcklwd %%mm4,%%mm2\\n\"      /*  0  0 g1  0  0  0 g0  0 */\n        \"por %%mm3, %%mm2\\n\"          /*  0 r1 g1 b1  0 r0 g0 b0 */\n        \"movq %%mm2,(%3)\\n\"          /* wrote out ! row1 */\n\n        \"pxor %%mm2,%%mm2\\n\"           /*  0  0  0  0  0  0  0  0 */\n        \"punpcklbw %%mm1,%%mm4\\n\"      /* g3  0 g2  0 g1  0 g0  0 */\n        \"punpckhwd %%mm2,%%mm4\\n\"      /*  0  0 g3  0  0  0 g2  0 */\n        \"por %%mm0, %%mm4\\n\"          /*  0 r3 g3 b3  0 r2 g2 b2 */\n        \"movq %%mm4,8(%3)\\n\"         /* wrote out ! row1 */\n\n        /* fill destination row2 (needed are mm6=Rr,mm7=Gg,mm5=Bb) */\n        /* this can be done \"destructive\" */\n        \"pxor %%mm2,%%mm2\\n\"           /*  0  0  0  0  0  0  0  0 */\n        \"punpckhbw %%mm2,%%mm6\\n\"      /*  0 R3  0 R2  0 R1  0 R0 */\n        \"punpckhbw %%mm1,%%mm5\\n\"      /* G3 B3 G2 B2 G1 B1 G0 B0 */\n        \"movq %%mm5,%%mm1\\n\"           /* G3 B3 G2 B2 G1 B1 G0 B0 */\n        \"punpcklwd %%mm6,%%mm1\\n\"      /*  0 R1 G1 B1  0 R0 G0 B0 */\n        \"movq %%mm1,(%5)\\n\"          /* wrote out ! row2 */\n        \"punpckhwd %%mm6,%%mm5\\n\"      /*  0 R3 G3 B3  0 R2 G2 B2 */\n        \"movq %%mm5,8(%5)\\n\"         /* wrote out ! row2 */\n\n        \"addl $4,%2\\n\"            /* lum+4 */\n        \"leal 16(%3),%3\\n\"        /* row1+16 */\n        \"leal 16(%5),%5\\n\"        /* row2+16 */\n        \"addl $2,(%%esp)\\n\"        /* cr+2 */\n        \"addl $2,%1\\n\"           /* cb+2 */\n\n        \"addl $4,%6\\n\"            /* x+4 */\n        \"cmpl %4,%6\\n\"\n\n        \"jl 1b\\n\"\n        \"addl %4,%2\\n\" /* lum += cols */\n        \"addl %8,%3\\n\" /* row1+= mod */\n        \"addl %8,%5\\n\" /* row2+= mod */\n        \"movl $0,%6\\n\" /* x=0 */\n        \"cmpl %7,%2\\n\"\n        \"jl 1b\\n\"\n\n        \"addl $4,%%esp\\n\"  /* get rid of the stack slot we reserved. */\n        \"emms\\n\"  /* reset MMX registers. */\n        :\n        : \"m\" (cr), \"r\"(cb),\"r\"(lum),\n          \"r\"(row1),\"r\"(cols),\"r\"(row2),\"m\"(x),\"m\"(y),\"m\"(mod),\n          \"m\"(MMX_0080w),\"m\"(MMX_VgrnRGB),\"m\"(MMX_VredRGB),\n          \"m\"(MMX_FF00w),\"m\"(MMX_00FFw),\"m\"(MMX_UgrnRGB),\n          \"m\"(MMX_UbluRGB)\n    );\n}\n\nvoid Color565DitherYV12MMX1X( int *colortab, Uint32 *rgb_2_pix,\n                             unsigned char *lum, unsigned char *cr,\n                             unsigned char *cb, unsigned char *out,\n                             int rows, int cols, int mod )\n{\n    Uint16 *row1;\n    Uint16 *row2;\n\n    unsigned char* y = lum +cols*rows;    /* Pointer to the end */\n    int x = 0;\n    row1 = (Uint16 *)out;                 /* 16 bit target */\n    row2 = (Uint16 *)out+cols+mod;        /* start of second row  */\n    mod = (mod+cols+mod)*2;               /* increment for row1 in byte */\n\n    __asm__ __volatile__(\n        /* tap dance to workaround the inability to use %%ebx at will... */\n        /*  move one thing to the stack... */\n        \"pushl $0\\n\"  /* save a slot on the stack. */\n        \"pushl %%ebx\\n\"  /* save %%ebx. */\n        \"movl %0, %%ebx\\n\"  /* put the thing in ebx. */\n        \"movl %%ebx, 4(%%esp)\\n\"  /* put the thing in the stack slot. */\n        \"popl %%ebx\\n\"  /* get back %%ebx (the PIC register). */\n\n        \".align 8\\n\"\n        \"1:\\n\"\n\n        \"movd           (%1),                   %%mm0\\n\" /* 4 Cb         0  0  0  0 u3 u2 u1 u0 */\n        \"pxor           %%mm7,                  %%mm7\\n\"\n        \"pushl %%ebx\\n\"\n        \"movl 4(%%esp), %%ebx\\n\"\n        \"movd (%%ebx), %%mm1\\n\"   /* 4 Cr                0  0  0  0 v3 v2 v1 v0 */\n        \"popl %%ebx\\n\"\n\n        \"punpcklbw      %%mm7,                  %%mm0\\n\" /* 4 W cb   0 u3  0 u2  0 u1  0 u0 */\n        \"punpcklbw      %%mm7,                  %%mm1\\n\" /* 4 W cr   0 v3  0 v2  0 v1  0 v0 */\n        \"psubw          %9,                     %%mm0\\n\"\n        \"psubw          %9,                     %%mm1\\n\"\n        \"movq           %%mm0,                  %%mm2\\n\" /* Cb                   0 u3  0 u2  0 u1  0 u0 */\n        \"movq           %%mm1,                  %%mm3\\n\" /* Cr */\n        \"pmullw         %10,                    %%mm2\\n\" /* Cb2green 0 R3  0 R2  0 R1  0 R0 */\n        \"movq           (%2),                   %%mm6\\n\" /* L1      l7 L6 L5 L4 L3 L2 L1 L0 */\n        \"pmullw         %11,                    %%mm0\\n\" /* Cb2blue */\n        \"pand           %12,                    %%mm6\\n\" /* L1      00 L6 00 L4 00 L2 00 L0 */\n        \"pmullw         %13,                    %%mm3\\n\" /* Cr2green */\n        \"movq           (%2),                   %%mm7\\n\" /* L2 */\n        \"pmullw         %14,                    %%mm1\\n\" /* Cr2red */\n        \"psrlw          $8,                     %%mm7\\n\"        /* L2           00 L7 00 L5 00 L3 00 L1 */\n        \"pmullw         %15,                    %%mm6\\n\" /* lum1 */\n        \"paddw          %%mm3,                  %%mm2\\n\" /* Cb2green + Cr2green == green */\n        \"pmullw         %15,                    %%mm7\\n\" /* lum2 */\n\n        \"movq           %%mm6,                  %%mm4\\n\" /* lum1 */\n        \"paddw          %%mm0,                  %%mm6\\n\" /* lum1 +blue 00 B6 00 B4 00 B2 00 B0 */\n        \"movq           %%mm4,                  %%mm5\\n\" /* lum1 */\n        \"paddw          %%mm1,                  %%mm4\\n\" /* lum1 +red  00 R6 00 R4 00 R2 00 R0 */\n        \"paddw          %%mm2,                  %%mm5\\n\" /* lum1 +green 00 G6 00 G4 00 G2 00 G0 */\n        \"psraw          $6,                     %%mm4\\n\" /* R1 0 .. 64 */\n        \"movq           %%mm7,                  %%mm3\\n\" /* lum2                       00 L7 00 L5 00 L3 00 L1 */\n        \"psraw          $6,                     %%mm5\\n\" /* G1  - .. + */\n        \"paddw          %%mm0,                  %%mm7\\n\" /* Lum2 +blue 00 B7 00 B5 00 B3 00 B1 */\n        \"psraw          $6,                     %%mm6\\n\" /* B1         0 .. 64 */\n        \"packuswb       %%mm4,                  %%mm4\\n\" /* R1 R1 */\n        \"packuswb       %%mm5,                  %%mm5\\n\" /* G1 G1 */\n        \"packuswb       %%mm6,                  %%mm6\\n\" /* B1 B1 */\n        \"punpcklbw      %%mm4,                  %%mm4\\n\"\n        \"punpcklbw      %%mm5,                  %%mm5\\n\"\n\n        \"pand           %16,                    %%mm4\\n\"\n        \"psllw          $3,                     %%mm5\\n\" /* GREEN       1 */\n        \"punpcklbw      %%mm6,                  %%mm6\\n\"\n        \"pand           %17,                    %%mm5\\n\"\n        \"pand           %16,                    %%mm6\\n\"\n        \"por            %%mm5,                  %%mm4\\n\" /* */\n        \"psrlw          $11,                    %%mm6\\n\" /* BLUE        1 */\n        \"movq           %%mm3,                  %%mm5\\n\" /* lum2 */\n        \"paddw          %%mm1,                  %%mm3\\n\" /* lum2 +red      00 R7 00 R5 00 R3 00 R1 */\n        \"paddw          %%mm2,                  %%mm5\\n\" /* lum2 +green 00 G7 00 G5 00 G3 00 G1 */\n        \"psraw          $6,                     %%mm3\\n\" /* R2 */\n        \"por            %%mm6,                  %%mm4\\n\" /* MM4 */\n        \"psraw          $6,                     %%mm5\\n\" /* G2 */\n        \"movq           (%2, %4),               %%mm6\\n\" /* L3 load lum2 */\n        \"psraw          $6,                     %%mm7\\n\"\n        \"packuswb       %%mm3,                  %%mm3\\n\"\n        \"packuswb       %%mm5,                  %%mm5\\n\"\n        \"packuswb       %%mm7,                  %%mm7\\n\"\n        \"pand           %12,                    %%mm6\\n\" /* L3 */\n        \"punpcklbw      %%mm3,                  %%mm3\\n\"\n        \"punpcklbw      %%mm5,                  %%mm5\\n\"\n        \"pmullw         %15,                    %%mm6\\n\" /* lum3 */\n        \"punpcklbw      %%mm7,                  %%mm7\\n\"\n        \"psllw          $3,                     %%mm5\\n\" /* GREEN 2 */\n        \"pand           %16,                    %%mm7\\n\"\n        \"pand           %16,                    %%mm3\\n\"\n        \"psrlw          $11,                    %%mm7\\n\" /* BLUE  2 */\n        \"pand           %17,                    %%mm5\\n\"\n        \"por            %%mm7,                  %%mm3\\n\"\n        \"movq           (%2,%4),                %%mm7\\n\" /* L4 load lum2 */\n        \"por            %%mm5,                  %%mm3\\n\"\n        \"psrlw          $8,                     %%mm7\\n\" /* L4 */\n        \"movq           %%mm4,                  %%mm5\\n\"\n        \"punpcklwd      %%mm3,                  %%mm4\\n\"\n        \"pmullw         %15,                    %%mm7\\n\" /* lum4 */\n        \"punpckhwd      %%mm3,                  %%mm5\\n\"\n\n        \"movq           %%mm4,                  (%3)\\n\"  /* write row1 */\n        \"movq           %%mm5,                  8(%3)\\n\" /* write row1 */\n\n        \"movq           %%mm6,                  %%mm4\\n\" /* Lum3 */\n        \"paddw          %%mm0,                  %%mm6\\n\" /* Lum3 +blue */\n\n        \"movq           %%mm4,                  %%mm5\\n\" /* Lum3 */\n        \"paddw          %%mm1,                  %%mm4\\n\" /* Lum3 +red */\n        \"paddw          %%mm2,                  %%mm5\\n\" /* Lum3 +green */\n        \"psraw          $6,                     %%mm4\\n\"\n        \"movq           %%mm7,                  %%mm3\\n\" /* Lum4 */\n        \"psraw          $6,                     %%mm5\\n\"\n        \"paddw          %%mm0,                  %%mm7\\n\" /* Lum4 +blue */\n        \"psraw          $6,                     %%mm6\\n\" /* Lum3 +blue */\n        \"movq           %%mm3,                  %%mm0\\n\" /* Lum4 */\n        \"packuswb       %%mm4,                  %%mm4\\n\"\n        \"paddw          %%mm1,                  %%mm3\\n\" /* Lum4 +red */\n        \"packuswb       %%mm5,                  %%mm5\\n\"\n        \"paddw          %%mm2,                  %%mm0\\n\" /* Lum4 +green */\n        \"packuswb       %%mm6,                  %%mm6\\n\"\n        \"punpcklbw      %%mm4,                  %%mm4\\n\"\n        \"punpcklbw      %%mm5,                  %%mm5\\n\"\n        \"punpcklbw      %%mm6,                  %%mm6\\n\"\n        \"psllw          $3,                     %%mm5\\n\" /* GREEN 3 */\n        \"pand           %16,                    %%mm4\\n\"\n        \"psraw          $6,                     %%mm3\\n\" /* psr 6 */\n        \"psraw          $6,                     %%mm0\\n\"\n        \"pand           %16,                    %%mm6\\n\" /* BLUE */\n        \"pand           %17,                    %%mm5\\n\"\n        \"psrlw          $11,                    %%mm6\\n\" /* BLUE  3 */\n        \"por            %%mm5,                  %%mm4\\n\"\n        \"psraw          $6,                     %%mm7\\n\"\n        \"por            %%mm6,                  %%mm4\\n\"\n        \"packuswb       %%mm3,                  %%mm3\\n\"\n        \"packuswb       %%mm0,                  %%mm0\\n\"\n        \"packuswb       %%mm7,                  %%mm7\\n\"\n        \"punpcklbw      %%mm3,                  %%mm3\\n\"\n        \"punpcklbw      %%mm0,                  %%mm0\\n\"\n        \"punpcklbw      %%mm7,                  %%mm7\\n\"\n        \"pand           %16,                    %%mm3\\n\"\n        \"pand           %16,                    %%mm7\\n\" /* BLUE */\n        \"psllw          $3,                     %%mm0\\n\" /* GREEN 4 */\n        \"psrlw          $11,                    %%mm7\\n\"\n        \"pand           %17,                    %%mm0\\n\"\n        \"por            %%mm7,                  %%mm3\\n\"\n        \"por            %%mm0,                  %%mm3\\n\"\n\n        \"movq           %%mm4,                  %%mm5\\n\"\n\n        \"punpcklwd      %%mm3,                  %%mm4\\n\"\n        \"punpckhwd      %%mm3,                  %%mm5\\n\"\n\n        \"movq           %%mm4,                  (%5)\\n\"\n        \"movq           %%mm5,                  8(%5)\\n\"\n\n        \"addl           $8,                     %6\\n\"\n        \"addl           $8,                     %2\\n\"\n        \"addl           $4,                     (%%esp)\\n\"\n        \"addl           $4,                     %1\\n\"\n        \"cmpl           %4,                     %6\\n\"\n        \"leal           16(%3),                 %3\\n\"\n        \"leal           16(%5),%5\\n\" /* row2+16 */\n\n        \"jl             1b\\n\"\n        \"addl           %4,     %2\\n\" /* lum += cols */\n        \"addl           %8,     %3\\n\" /* row1+= mod */\n        \"addl           %8,     %5\\n\" /* row2+= mod */\n        \"movl           $0,     %6\\n\" /* x=0 */\n        \"cmpl           %7,     %2\\n\"\n        \"jl             1b\\n\"\n        \"addl $4, %%esp\\n\"  /* get rid of the stack slot we reserved. */\n        \"emms\\n\"\n        :\n        : \"m\" (cr), \"r\"(cb),\"r\"(lum),\n          \"r\"(row1),\"r\"(cols),\"r\"(row2),\"m\"(x),\"m\"(y),\"m\"(mod),\n          \"m\"(MMX_0080w),\"m\"(MMX_Ugrn565),\"m\"(MMX_Ublu5x5),\n          \"m\"(MMX_00FFw),\"m\"(MMX_Vgrn565),\"m\"(MMX_Vred5x5),\n          \"m\"(MMX_Ycoeff),\"m\"(MMX_red565),\"m\"(MMX_grn565)\n    );\n}\n\n/* *INDENT-ON* */\n\n#endif /* GCC3 i386 inline assembly */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/SDL_yuv_sw.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* This is the software implementation of the YUV texture support */\n\n/* This code was derived from code carrying the following copyright notices:\n\n * Copyright (c) 1995 The Regents of the University of California.\n * All rights reserved.\n *\n * Permission to use, copy, modify, and distribute this software and its\n * documentation for any purpose, without fee, and without written agreement is\n * hereby granted, provided that the above copyright notice and the following\n * two paragraphs appear in all copies of this software.\n *\n * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR\n * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT\n * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF\n * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS\n * ON AN \"AS IS\" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO\n * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\n\n * Copyright (c) 1995 Erik Corry\n * All rights reserved.\n *\n * Permission to use, copy, modify, and distribute this software and its\n * documentation for any purpose, without fee, and without written agreement is\n * hereby granted, provided that the above copyright notice and the following\n * two paragraphs appear in all copies of this software.\n *\n * IN NO EVENT SHALL ERIK CORRY BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,\n * SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF\n * THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF ERIK CORRY HAS BEEN ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ERIK CORRY SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n * PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN \"AS IS\"\n * BASIS, AND ERIK CORRY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT,\n * UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\n\n * Portions of this software Copyright (c) 1995 Brown University.\n * All rights reserved.\n *\n * Permission to use, copy, modify, and distribute this software and its\n * documentation for any purpose, without fee, and without written agreement\n * is hereby granted, provided that the above copyright notice and the\n * following two paragraphs appear in all copies of this software.\n *\n * IN NO EVENT SHALL BROWN UNIVERSITY BE LIABLE TO ANY PARTY FOR\n * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT\n * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF BROWN\n * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * BROWN UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n * PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN \"AS IS\"\n * BASIS, AND BROWN UNIVERSITY HAS NO OBLIGATION TO PROVIDE MAINTENANCE,\n * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\n */\n\n#include \"SDL_assert.h\"\n#include \"SDL_video.h\"\n#include \"SDL_cpuinfo.h\"\n#include \"SDL_yuv_sw_c.h\"\n\n\n/* The colorspace conversion functions */\n\n#if (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES\nextern void Color565DitherYV12MMX1X(int *colortab, Uint32 * rgb_2_pix,\n                                    unsigned char *lum, unsigned char *cr,\n                                    unsigned char *cb, unsigned char *out,\n                                    int rows, int cols, int mod);\nextern void ColorRGBDitherYV12MMX1X(int *colortab, Uint32 * rgb_2_pix,\n                                    unsigned char *lum, unsigned char *cr,\n                                    unsigned char *cb, unsigned char *out,\n                                    int rows, int cols, int mod);\n#endif\n\nstatic void\nColor16DitherYV12Mod1X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned short *row1;\n    unsigned short *row2;\n    unsigned char *lum2;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    row1 = (unsigned short *) out;\n    row2 = row1 + cols + mod;\n    lum2 = lum + cols;\n\n    mod += cols + mod;\n\n    y = rows / 2;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            ++cr;\n            ++cb;\n\n            L = *lum++;\n            *row1++ = (unsigned short) (rgb_2_pix[L + cr_r] |\n                                        rgb_2_pix[L + crb_g] |\n                                        rgb_2_pix[L + cb_b]);\n\n            L = *lum++;\n            *row1++ = (unsigned short) (rgb_2_pix[L + cr_r] |\n                                        rgb_2_pix[L + crb_g] |\n                                        rgb_2_pix[L + cb_b]);\n\n\n            /* Now, do second row.  */\n\n            L = *lum2++;\n            *row2++ = (unsigned short) (rgb_2_pix[L + cr_r] |\n                                        rgb_2_pix[L + crb_g] |\n                                        rgb_2_pix[L + cb_b]);\n\n            L = *lum2++;\n            *row2++ = (unsigned short) (rgb_2_pix[L + cr_r] |\n                                        rgb_2_pix[L + crb_g] |\n                                        rgb_2_pix[L + cb_b]);\n        }\n\n        /*\n         * These values are at the start of the next line, (due\n         * to the ++'s above),but they need to be at the start\n         * of the line after that.\n         */\n        lum += cols;\n        lum2 += cols;\n        row1 += mod;\n        row2 += mod;\n    }\n}\n\nstatic void\nColor24DitherYV12Mod1X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int value;\n    unsigned char *row1;\n    unsigned char *row2;\n    unsigned char *lum2;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    row1 = out;\n    row2 = row1 + cols * 3 + mod * 3;\n    lum2 = lum + cols;\n\n    mod += cols + mod;\n    mod *= 3;\n\n    y = rows / 2;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            ++cr;\n            ++cb;\n\n            L = *lum++;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            *row1++ = (value) & 0xFF;\n            *row1++ = (value >> 8) & 0xFF;\n            *row1++ = (value >> 16) & 0xFF;\n\n            L = *lum++;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            *row1++ = (value) & 0xFF;\n            *row1++ = (value >> 8) & 0xFF;\n            *row1++ = (value >> 16) & 0xFF;\n\n\n            /* Now, do second row.  */\n\n            L = *lum2++;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            *row2++ = (value) & 0xFF;\n            *row2++ = (value >> 8) & 0xFF;\n            *row2++ = (value >> 16) & 0xFF;\n\n            L = *lum2++;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            *row2++ = (value) & 0xFF;\n            *row2++ = (value >> 8) & 0xFF;\n            *row2++ = (value >> 16) & 0xFF;\n        }\n\n        /*\n         * These values are at the start of the next line, (due\n         * to the ++'s above),but they need to be at the start\n         * of the line after that.\n         */\n        lum += cols;\n        lum2 += cols;\n        row1 += mod;\n        row2 += mod;\n    }\n}\n\nstatic void\nColor32DitherYV12Mod1X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int *row1;\n    unsigned int *row2;\n    unsigned char *lum2;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    row1 = (unsigned int *) out;\n    row2 = row1 + cols + mod;\n    lum2 = lum + cols;\n\n    mod += cols + mod;\n\n    y = rows / 2;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            ++cr;\n            ++cb;\n\n            L = *lum++;\n            *row1++ = (rgb_2_pix[L + cr_r] |\n                       rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n\n            L = *lum++;\n            *row1++ = (rgb_2_pix[L + cr_r] |\n                       rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n\n\n            /* Now, do second row.  */\n\n            L = *lum2++;\n            *row2++ = (rgb_2_pix[L + cr_r] |\n                       rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n\n            L = *lum2++;\n            *row2++ = (rgb_2_pix[L + cr_r] |\n                       rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n        }\n\n        /*\n         * These values are at the start of the next line, (due\n         * to the ++'s above),but they need to be at the start\n         * of the line after that.\n         */\n        lum += cols;\n        lum2 += cols;\n        row1 += mod;\n        row2 += mod;\n    }\n}\n\n/*\n * In this function I make use of a nasty trick. The tables have the lower\n * 16 bits replicated in the upper 16. This means I can write ints and get\n * the horisontal doubling for free (almost).\n */\nstatic void\nColor16DitherYV12Mod2X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int *row1 = (unsigned int *) out;\n    const int next_row = cols + (mod / 2);\n    unsigned int *row2 = row1 + 2 * next_row;\n    unsigned char *lum2;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    lum2 = lum + cols;\n\n    mod = (next_row * 3) + (mod / 2);\n\n    y = rows / 2;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            ++cr;\n            ++cb;\n\n            L = *lum++;\n            row1[0] = row1[next_row] = (rgb_2_pix[L + cr_r] |\n                                        rgb_2_pix[L + crb_g] |\n                                        rgb_2_pix[L + cb_b]);\n            row1++;\n\n            L = *lum++;\n            row1[0] = row1[next_row] = (rgb_2_pix[L + cr_r] |\n                                        rgb_2_pix[L + crb_g] |\n                                        rgb_2_pix[L + cb_b]);\n            row1++;\n\n\n            /* Now, do second row. */\n\n            L = *lum2++;\n            row2[0] = row2[next_row] = (rgb_2_pix[L + cr_r] |\n                                        rgb_2_pix[L + crb_g] |\n                                        rgb_2_pix[L + cb_b]);\n            row2++;\n\n            L = *lum2++;\n            row2[0] = row2[next_row] = (rgb_2_pix[L + cr_r] |\n                                        rgb_2_pix[L + crb_g] |\n                                        rgb_2_pix[L + cb_b]);\n            row2++;\n        }\n\n        /*\n         * These values are at the start of the next line, (due\n         * to the ++'s above),but they need to be at the start\n         * of the line after that.\n         */\n        lum += cols;\n        lum2 += cols;\n        row1 += mod;\n        row2 += mod;\n    }\n}\n\nstatic void\nColor24DitherYV12Mod2X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int value;\n    unsigned char *row1 = out;\n    const int next_row = (cols * 2 + mod) * 3;\n    unsigned char *row2 = row1 + 2 * next_row;\n    unsigned char *lum2;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    lum2 = lum + cols;\n\n    mod = next_row * 3 + mod * 3;\n\n    y = rows / 2;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            ++cr;\n            ++cb;\n\n            L = *lum++;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row1[0 + 0] = row1[3 + 0] = row1[next_row + 0] =\n                row1[next_row + 3 + 0] = (value) & 0xFF;\n            row1[0 + 1] = row1[3 + 1] = row1[next_row + 1] =\n                row1[next_row + 3 + 1] = (value >> 8) & 0xFF;\n            row1[0 + 2] = row1[3 + 2] = row1[next_row + 2] =\n                row1[next_row + 3 + 2] = (value >> 16) & 0xFF;\n            row1 += 2 * 3;\n\n            L = *lum++;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row1[0 + 0] = row1[3 + 0] = row1[next_row + 0] =\n                row1[next_row + 3 + 0] = (value) & 0xFF;\n            row1[0 + 1] = row1[3 + 1] = row1[next_row + 1] =\n                row1[next_row + 3 + 1] = (value >> 8) & 0xFF;\n            row1[0 + 2] = row1[3 + 2] = row1[next_row + 2] =\n                row1[next_row + 3 + 2] = (value >> 16) & 0xFF;\n            row1 += 2 * 3;\n\n\n            /* Now, do second row. */\n\n            L = *lum2++;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row2[0 + 0] = row2[3 + 0] = row2[next_row + 0] =\n                row2[next_row + 3 + 0] = (value) & 0xFF;\n            row2[0 + 1] = row2[3 + 1] = row2[next_row + 1] =\n                row2[next_row + 3 + 1] = (value >> 8) & 0xFF;\n            row2[0 + 2] = row2[3 + 2] = row2[next_row + 2] =\n                row2[next_row + 3 + 2] = (value >> 16) & 0xFF;\n            row2 += 2 * 3;\n\n            L = *lum2++;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row2[0 + 0] = row2[3 + 0] = row2[next_row + 0] =\n                row2[next_row + 3 + 0] = (value) & 0xFF;\n            row2[0 + 1] = row2[3 + 1] = row2[next_row + 1] =\n                row2[next_row + 3 + 1] = (value >> 8) & 0xFF;\n            row2[0 + 2] = row2[3 + 2] = row2[next_row + 2] =\n                row2[next_row + 3 + 2] = (value >> 16) & 0xFF;\n            row2 += 2 * 3;\n        }\n\n        /*\n         * These values are at the start of the next line, (due\n         * to the ++'s above),but they need to be at the start\n         * of the line after that.\n         */\n        lum += cols;\n        lum2 += cols;\n        row1 += mod;\n        row2 += mod;\n    }\n}\n\nstatic void\nColor32DitherYV12Mod2X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int *row1 = (unsigned int *) out;\n    const int next_row = cols * 2 + mod;\n    unsigned int *row2 = row1 + 2 * next_row;\n    unsigned char *lum2;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    lum2 = lum + cols;\n\n    mod = (next_row * 3) + mod;\n\n    y = rows / 2;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            ++cr;\n            ++cb;\n\n            L = *lum++;\n            row1[0] = row1[1] = row1[next_row] = row1[next_row + 1] =\n                (rgb_2_pix[L + cr_r] |\n                 rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row1 += 2;\n\n            L = *lum++;\n            row1[0] = row1[1] = row1[next_row] = row1[next_row + 1] =\n                (rgb_2_pix[L + cr_r] |\n                 rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row1 += 2;\n\n\n            /* Now, do second row. */\n\n            L = *lum2++;\n            row2[0] = row2[1] = row2[next_row] = row2[next_row + 1] =\n                (rgb_2_pix[L + cr_r] |\n                 rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row2 += 2;\n\n            L = *lum2++;\n            row2[0] = row2[1] = row2[next_row] = row2[next_row + 1] =\n                (rgb_2_pix[L + cr_r] |\n                 rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row2 += 2;\n        }\n\n        /*\n         * These values are at the start of the next line, (due\n         * to the ++'s above),but they need to be at the start\n         * of the line after that.\n         */\n        lum += cols;\n        lum2 += cols;\n        row1 += mod;\n        row2 += mod;\n    }\n}\n\nstatic void\nColor16DitherYUY2Mod1X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned short *row;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    row = (unsigned short *) out;\n\n    y = rows;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            cr += 4;\n            cb += 4;\n\n            L = *lum;\n            lum += 2;\n            *row++ = (unsigned short) (rgb_2_pix[L + cr_r] |\n                                       rgb_2_pix[L + crb_g] |\n                                       rgb_2_pix[L + cb_b]);\n\n            L = *lum;\n            lum += 2;\n            *row++ = (unsigned short) (rgb_2_pix[L + cr_r] |\n                                       rgb_2_pix[L + crb_g] |\n                                       rgb_2_pix[L + cb_b]);\n\n        }\n\n        row += mod;\n    }\n}\n\nstatic void\nColor24DitherYUY2Mod1X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int value;\n    unsigned char *row;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    row = (unsigned char *) out;\n    mod *= 3;\n    y = rows;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            cr += 4;\n            cb += 4;\n\n            L = *lum;\n            lum += 2;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            *row++ = (value) & 0xFF;\n            *row++ = (value >> 8) & 0xFF;\n            *row++ = (value >> 16) & 0xFF;\n\n            L = *lum;\n            lum += 2;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            *row++ = (value) & 0xFF;\n            *row++ = (value >> 8) & 0xFF;\n            *row++ = (value >> 16) & 0xFF;\n\n        }\n        row += mod;\n    }\n}\n\nstatic void\nColor32DitherYUY2Mod1X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int *row;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    row = (unsigned int *) out;\n    y = rows;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            cr += 4;\n            cb += 4;\n\n            L = *lum;\n            lum += 2;\n            *row++ = (rgb_2_pix[L + cr_r] |\n                      rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n\n            L = *lum;\n            lum += 2;\n            *row++ = (rgb_2_pix[L + cr_r] |\n                      rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n\n\n        }\n        row += mod;\n    }\n}\n\n/*\n * In this function I make use of a nasty trick. The tables have the lower\n * 16 bits replicated in the upper 16. This means I can write ints and get\n * the horisontal doubling for free (almost).\n */\nstatic void\nColor16DitherYUY2Mod2X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int *row = (unsigned int *) out;\n    const int next_row = cols + (mod / 2);\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n\n    y = rows;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            cr += 4;\n            cb += 4;\n\n            L = *lum;\n            lum += 2;\n            row[0] = row[next_row] = (rgb_2_pix[L + cr_r] |\n                                      rgb_2_pix[L + crb_g] |\n                                      rgb_2_pix[L + cb_b]);\n            row++;\n\n            L = *lum;\n            lum += 2;\n            row[0] = row[next_row] = (rgb_2_pix[L + cr_r] |\n                                      rgb_2_pix[L + crb_g] |\n                                      rgb_2_pix[L + cb_b]);\n            row++;\n\n        }\n        row += next_row;\n    }\n}\n\nstatic void\nColor24DitherYUY2Mod2X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int value;\n    unsigned char *row = out;\n    const int next_row = (cols * 2 + mod) * 3;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n    y = rows;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            cr += 4;\n            cb += 4;\n\n            L = *lum;\n            lum += 2;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row[0 + 0] = row[3 + 0] = row[next_row + 0] =\n                row[next_row + 3 + 0] = (value) & 0xFF;\n            row[0 + 1] = row[3 + 1] = row[next_row + 1] =\n                row[next_row + 3 + 1] = (value >> 8) & 0xFF;\n            row[0 + 2] = row[3 + 2] = row[next_row + 2] =\n                row[next_row + 3 + 2] = (value >> 16) & 0xFF;\n            row += 2 * 3;\n\n            L = *lum;\n            lum += 2;\n            value = (rgb_2_pix[L + cr_r] |\n                     rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row[0 + 0] = row[3 + 0] = row[next_row + 0] =\n                row[next_row + 3 + 0] = (value) & 0xFF;\n            row[0 + 1] = row[3 + 1] = row[next_row + 1] =\n                row[next_row + 3 + 1] = (value >> 8) & 0xFF;\n            row[0 + 2] = row[3 + 2] = row[next_row + 2] =\n                row[next_row + 3 + 2] = (value >> 16) & 0xFF;\n            row += 2 * 3;\n\n        }\n        row += next_row;\n    }\n}\n\nstatic void\nColor32DitherYUY2Mod2X(int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod)\n{\n    unsigned int *row = (unsigned int *) out;\n    const int next_row = cols * 2 + mod;\n    int x, y;\n    int cr_r;\n    int crb_g;\n    int cb_b;\n    int cols_2 = cols / 2;\n    mod += mod;\n    y = rows;\n    while (y--) {\n        x = cols_2;\n        while (x--) {\n            register int L;\n\n            cr_r = 0 * 768 + 256 + colortab[*cr + 0 * 256];\n            crb_g = 1 * 768 + 256 + colortab[*cr + 1 * 256]\n                + colortab[*cb + 2 * 256];\n            cb_b = 2 * 768 + 256 + colortab[*cb + 3 * 256];\n            cr += 4;\n            cb += 4;\n\n            L = *lum;\n            lum += 2;\n            row[0] = row[1] = row[next_row] = row[next_row + 1] =\n                (rgb_2_pix[L + cr_r] |\n                 rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row += 2;\n\n            L = *lum;\n            lum += 2;\n            row[0] = row[1] = row[next_row] = row[next_row + 1] =\n                (rgb_2_pix[L + cr_r] |\n                 rgb_2_pix[L + crb_g] | rgb_2_pix[L + cb_b]);\n            row += 2;\n\n\n        }\n\n        row += next_row;\n    }\n}\n\n/*\n * How many 1 bits are there in the Uint32.\n * Low performance, do not call often.\n */\nstatic int\nnumber_of_bits_set(Uint32 a)\n{\n    if (!a)\n        return 0;\n    if (a & 1)\n        return 1 + number_of_bits_set(a >> 1);\n    return (number_of_bits_set(a >> 1));\n}\n\n/*\n * How many 0 bits are there at least significant end of Uint32.\n * Low performance, do not call often.\n */\nstatic int\nfree_bits_at_bottom(Uint32 a)\n{\n    /* assume char is 8 bits */\n    if (!a)\n        return sizeof(Uint32) * 8;\n    if (((Sint32) a) & 1l)\n        return 0;\n    return 1 + free_bits_at_bottom(a >> 1);\n}\n\nstatic int\nSDL_SW_SetupYUVDisplay(SDL_SW_YUVTexture * swdata, Uint32 target_format)\n{\n    Uint32 *r_2_pix_alloc;\n    Uint32 *g_2_pix_alloc;\n    Uint32 *b_2_pix_alloc;\n    int i;\n    int bpp;\n    Uint32 Rmask, Gmask, Bmask, Amask;\n\n    if (!SDL_PixelFormatEnumToMasks\n        (target_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask) || bpp < 15) {\n        return SDL_SetError(\"Unsupported YUV destination format\");\n    }\n\n    swdata->target_format = target_format;\n    r_2_pix_alloc = &swdata->rgb_2_pix[0 * 768];\n    g_2_pix_alloc = &swdata->rgb_2_pix[1 * 768];\n    b_2_pix_alloc = &swdata->rgb_2_pix[2 * 768];\n\n    /*\n     * Set up entries 0-255 in rgb-to-pixel value tables.\n     */\n    for (i = 0; i < 256; ++i) {\n        r_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(Rmask));\n        r_2_pix_alloc[i + 256] <<= free_bits_at_bottom(Rmask);\n        r_2_pix_alloc[i + 256] |= Amask;\n        g_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(Gmask));\n        g_2_pix_alloc[i + 256] <<= free_bits_at_bottom(Gmask);\n        g_2_pix_alloc[i + 256] |= Amask;\n        b_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(Bmask));\n        b_2_pix_alloc[i + 256] <<= free_bits_at_bottom(Bmask);\n        b_2_pix_alloc[i + 256] |= Amask;\n    }\n\n    /*\n     * If we have 16-bit output depth, then we double the value\n     * in the top word. This means that we can write out both\n     * pixels in the pixel doubling mode with one op. It is\n     * harmless in the normal case as storing a 32-bit value\n     * through a short pointer will lose the top bits anyway.\n     */\n    if (SDL_BYTESPERPIXEL(target_format) == 2) {\n        for (i = 0; i < 256; ++i) {\n            r_2_pix_alloc[i + 256] |= (r_2_pix_alloc[i + 256]) << 16;\n            g_2_pix_alloc[i + 256] |= (g_2_pix_alloc[i + 256]) << 16;\n            b_2_pix_alloc[i + 256] |= (b_2_pix_alloc[i + 256]) << 16;\n        }\n    }\n\n    /*\n     * Spread out the values we have to the rest of the array so that\n     * we do not need to check for overflow.\n     */\n    for (i = 0; i < 256; ++i) {\n        r_2_pix_alloc[i] = r_2_pix_alloc[256];\n        r_2_pix_alloc[i + 512] = r_2_pix_alloc[511];\n        g_2_pix_alloc[i] = g_2_pix_alloc[256];\n        g_2_pix_alloc[i + 512] = g_2_pix_alloc[511];\n        b_2_pix_alloc[i] = b_2_pix_alloc[256];\n        b_2_pix_alloc[i + 512] = b_2_pix_alloc[511];\n    }\n\n    /* You have chosen wisely... */\n    switch (swdata->format) {\n    case SDL_PIXELFORMAT_YV12:\n    case SDL_PIXELFORMAT_IYUV:\n        if (SDL_BYTESPERPIXEL(target_format) == 2) {\n#if (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES\n            /* inline assembly functions */\n            if (SDL_HasMMX() && (Rmask == 0xF800) &&\n                (Gmask == 0x07E0) && (Bmask == 0x001F)\n                && (swdata->w & 15) == 0) {\n/* printf(\"Using MMX 16-bit 565 dither\\n\"); */\n                swdata->Display1X = Color565DitherYV12MMX1X;\n            } else {\n/* printf(\"Using C 16-bit dither\\n\"); */\n                swdata->Display1X = Color16DitherYV12Mod1X;\n            }\n#else\n            swdata->Display1X = Color16DitherYV12Mod1X;\n#endif\n            swdata->Display2X = Color16DitherYV12Mod2X;\n        }\n        if (SDL_BYTESPERPIXEL(target_format) == 3) {\n            swdata->Display1X = Color24DitherYV12Mod1X;\n            swdata->Display2X = Color24DitherYV12Mod2X;\n        }\n        if (SDL_BYTESPERPIXEL(target_format) == 4) {\n#if (__GNUC__ > 2) && defined(__i386__) && __OPTIMIZE__ && SDL_ASSEMBLY_ROUTINES\n            /* inline assembly functions */\n            if (SDL_HasMMX() && (Rmask == 0x00FF0000) &&\n                (Gmask == 0x0000FF00) &&\n                (Bmask == 0x000000FF) && (swdata->w & 15) == 0) {\n/* printf(\"Using MMX 32-bit dither\\n\"); */\n                swdata->Display1X = ColorRGBDitherYV12MMX1X;\n            } else {\n/* printf(\"Using C 32-bit dither\\n\"); */\n                swdata->Display1X = Color32DitherYV12Mod1X;\n            }\n#else\n            swdata->Display1X = Color32DitherYV12Mod1X;\n#endif\n            swdata->Display2X = Color32DitherYV12Mod2X;\n        }\n        break;\n    case SDL_PIXELFORMAT_YUY2:\n    case SDL_PIXELFORMAT_UYVY:\n    case SDL_PIXELFORMAT_YVYU:\n        if (SDL_BYTESPERPIXEL(target_format) == 2) {\n            swdata->Display1X = Color16DitherYUY2Mod1X;\n            swdata->Display2X = Color16DitherYUY2Mod2X;\n        }\n        if (SDL_BYTESPERPIXEL(target_format) == 3) {\n            swdata->Display1X = Color24DitherYUY2Mod1X;\n            swdata->Display2X = Color24DitherYUY2Mod2X;\n        }\n        if (SDL_BYTESPERPIXEL(target_format) == 4) {\n            swdata->Display1X = Color32DitherYUY2Mod1X;\n            swdata->Display2X = Color32DitherYUY2Mod2X;\n        }\n        break;\n    default:\n        /* We should never get here (caught above) */\n        break;\n    }\n\n    SDL_FreeSurface(swdata->display);\n    swdata->display = NULL;\n    return 0;\n}\n\nSDL_SW_YUVTexture *\nSDL_SW_CreateYUVTexture(Uint32 format, int w, int h)\n{\n    SDL_SW_YUVTexture *swdata;\n    int *Cr_r_tab;\n    int *Cr_g_tab;\n    int *Cb_g_tab;\n    int *Cb_b_tab;\n    int i;\n    int CR, CB;\n\n    switch (format) {\n    case SDL_PIXELFORMAT_YV12:\n    case SDL_PIXELFORMAT_IYUV:\n    case SDL_PIXELFORMAT_YUY2:\n    case SDL_PIXELFORMAT_UYVY:\n    case SDL_PIXELFORMAT_YVYU:\n        break;\n    default:\n        SDL_SetError(\"Unsupported YUV format\");\n        return NULL;\n    }\n\n    swdata = (SDL_SW_YUVTexture *) SDL_calloc(1, sizeof(*swdata));\n    if (!swdata) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    swdata->format = format;\n    swdata->target_format = SDL_PIXELFORMAT_UNKNOWN;\n    swdata->w = w;\n    swdata->h = h;\n    swdata->pixels = (Uint8 *) SDL_malloc(w * h * 2);\n    swdata->colortab = (int *) SDL_malloc(4 * 256 * sizeof(int));\n    swdata->rgb_2_pix = (Uint32 *) SDL_malloc(3 * 768 * sizeof(Uint32));\n    if (!swdata->pixels || !swdata->colortab || !swdata->rgb_2_pix) {\n        SDL_SW_DestroyYUVTexture(swdata);\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    /* Generate the tables for the display surface */\n    Cr_r_tab = &swdata->colortab[0 * 256];\n    Cr_g_tab = &swdata->colortab[1 * 256];\n    Cb_g_tab = &swdata->colortab[2 * 256];\n    Cb_b_tab = &swdata->colortab[3 * 256];\n    for (i = 0; i < 256; i++) {\n        /* Gamma correction (luminescence table) and chroma correction\n           would be done here.  See the Berkeley mpeg_play sources.\n         */\n        CB = CR = (i - 128);\n        Cr_r_tab[i] = (int) ((0.419 / 0.299) * CR);\n        Cr_g_tab[i] = (int) (-(0.299 / 0.419) * CR);\n        Cb_g_tab[i] = (int) (-(0.114 / 0.331) * CB);\n        Cb_b_tab[i] = (int) ((0.587 / 0.331) * CB);\n    }\n\n    /* Find the pitch and offset values for the overlay */\n    switch (format) {\n    case SDL_PIXELFORMAT_YV12:\n    case SDL_PIXELFORMAT_IYUV:\n        swdata->pitches[0] = w;\n        swdata->pitches[1] = swdata->pitches[0] / 2;\n        swdata->pitches[2] = swdata->pitches[0] / 2;\n        swdata->planes[0] = swdata->pixels;\n        swdata->planes[1] = swdata->planes[0] + swdata->pitches[0] * h;\n        swdata->planes[2] = swdata->planes[1] + swdata->pitches[1] * h / 2;\n        break;\n    case SDL_PIXELFORMAT_YUY2:\n    case SDL_PIXELFORMAT_UYVY:\n    case SDL_PIXELFORMAT_YVYU:\n        swdata->pitches[0] = w * 2;\n        swdata->planes[0] = swdata->pixels;\n        break;\n    default:\n        SDL_assert(0 && \"We should never get here (caught above)\");\n        break;\n    }\n\n    /* We're all done.. */\n    return (swdata);\n}\n\nint\nSDL_SW_QueryYUVTexturePixels(SDL_SW_YUVTexture * swdata, void **pixels,\n                             int *pitch)\n{\n    *pixels = swdata->planes[0];\n    *pitch = swdata->pitches[0];\n    return 0;\n}\n\nint\nSDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,\n                        const void *pixels, int pitch)\n{\n    switch (swdata->format) {\n    case SDL_PIXELFORMAT_YV12:\n    case SDL_PIXELFORMAT_IYUV:\n        if (rect->x == 0 && rect->y == 0 &&\n            rect->w == swdata->w && rect->h == swdata->h) {\n                SDL_memcpy(swdata->pixels, pixels,\n                           (swdata->h * swdata->w) + (swdata->h * swdata->w) / 2);\n        } else {\n            Uint8 *src, *dst;\n            int row;\n            size_t length;\n\n            /* Copy the Y plane */\n            src = (Uint8 *) pixels;\n            dst = swdata->pixels + rect->y * swdata->w + rect->x;\n            length = rect->w;\n            for (row = 0; row < rect->h; ++row) {\n                SDL_memcpy(dst, src, length);\n                src += pitch;\n                dst += swdata->w;\n            }\n\n            /* Copy the next plane */\n            src = (Uint8 *) pixels + rect->h * pitch;\n            dst = swdata->pixels + swdata->h * swdata->w;\n            dst += rect->y/2 * swdata->w/2 + rect->x/2;\n            length = rect->w / 2;\n            for (row = 0; row < rect->h/2; ++row) {\n                SDL_memcpy(dst, src, length);\n                src += pitch/2;\n                dst += swdata->w/2;\n            }\n\n            /* Copy the next plane */\n            src = (Uint8 *) pixels + rect->h * pitch + (rect->h * pitch) / 4;\n            dst = swdata->pixels + swdata->h * swdata->w +\n                  (swdata->h * swdata->w) / 4;\n            dst += rect->y/2 * swdata->w/2 + rect->x/2;\n            length = rect->w / 2;\n            for (row = 0; row < rect->h/2; ++row) {\n                SDL_memcpy(dst, src, length);\n                src += pitch/2;\n                dst += swdata->w/2;\n            }\n        }\n        break;\n    case SDL_PIXELFORMAT_YUY2:\n    case SDL_PIXELFORMAT_UYVY:\n    case SDL_PIXELFORMAT_YVYU:\n        {\n            Uint8 *src, *dst;\n            int row;\n            size_t length;\n\n            src = (Uint8 *) pixels;\n            dst =\n                swdata->planes[0] + rect->y * swdata->pitches[0] +\n                rect->x * 2;\n            length = rect->w * 2;\n            for (row = 0; row < rect->h; ++row) {\n                SDL_memcpy(dst, src, length);\n                src += pitch;\n                dst += swdata->pitches[0];\n            }\n        }\n        break;\n    }\n    return 0;\n}\n\nint\nSDL_SW_UpdateYUVTexturePlanar(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,\n                              const Uint8 *Yplane, int Ypitch,\n                              const Uint8 *Uplane, int Upitch,\n                              const Uint8 *Vplane, int Vpitch)\n{\n    const Uint8 *src;\n    Uint8 *dst;\n    int row;\n    size_t length;\n\n    /* Copy the Y plane */\n    src = Yplane;\n    dst = swdata->pixels + rect->y * swdata->w + rect->x;\n    length = rect->w;\n    for (row = 0; row < rect->h; ++row) {\n        SDL_memcpy(dst, src, length);\n        src += Ypitch;\n        dst += swdata->w;\n    }\n\n    /* Copy the U plane */\n    src = Uplane;\n    if (swdata->format == SDL_PIXELFORMAT_IYUV) {\n        dst = swdata->pixels + swdata->h * swdata->w;\n    } else {\n        dst = swdata->pixels + swdata->h * swdata->w +\n              (swdata->h * swdata->w) / 4;\n    }\n    dst += rect->y/2 * swdata->w/2 + rect->x/2;\n    length = rect->w / 2;\n    for (row = 0; row < rect->h/2; ++row) {\n        SDL_memcpy(dst, src, length);\n        src += Upitch;\n        dst += swdata->w/2;\n    }\n\n    /* Copy the V plane */\n    src = Vplane;\n    if (swdata->format == SDL_PIXELFORMAT_YV12) {\n        dst = swdata->pixels + swdata->h * swdata->w;\n    } else {\n        dst = swdata->pixels + swdata->h * swdata->w +\n              (swdata->h * swdata->w) / 4;\n    }\n    dst += rect->y/2 * swdata->w/2 + rect->x/2;\n    length = rect->w / 2;\n    for (row = 0; row < rect->h/2; ++row) {\n        SDL_memcpy(dst, src, length);\n        src += Vpitch;\n        dst += swdata->w/2;\n    }\n    return 0;\n}\n\nint\nSDL_SW_LockYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,\n                      void **pixels, int *pitch)\n{\n    switch (swdata->format) {\n    case SDL_PIXELFORMAT_YV12:\n    case SDL_PIXELFORMAT_IYUV:\n        if (rect\n            && (rect->x != 0 || rect->y != 0 || rect->w != swdata->w\n                || rect->h != swdata->h)) {\n            return SDL_SetError\n                (\"YV12 and IYUV textures only support full surface locks\");\n        }\n        break;\n    }\n\n    if (rect) {\n        *pixels = swdata->planes[0] + rect->y * swdata->pitches[0] + rect->x * 2;\n    } else {\n        *pixels = swdata->planes[0];\n    }\n    *pitch = swdata->pitches[0];\n    return 0;\n}\n\nvoid\nSDL_SW_UnlockYUVTexture(SDL_SW_YUVTexture * swdata)\n{\n}\n\nint\nSDL_SW_CopyYUVToRGB(SDL_SW_YUVTexture * swdata, const SDL_Rect * srcrect,\n                    Uint32 target_format, int w, int h, void *pixels,\n                    int pitch)\n{\n    const int targetbpp = SDL_BYTESPERPIXEL(target_format);\n    int stretch;\n    int scale_2x;\n    Uint8 *lum, *Cr, *Cb;\n    int mod;\n\n    if (targetbpp == 0) {\n        return SDL_SetError(\"Invalid target pixel format\");\n    }\n\n    /* Make sure we're set up to display in the desired format */\n    if (target_format != swdata->target_format) {\n        if (SDL_SW_SetupYUVDisplay(swdata, target_format) < 0) {\n            return -1;\n        }\n    }\n\n    stretch = 0;\n    scale_2x = 0;\n    if (srcrect->x || srcrect->y || srcrect->w < swdata->w\n        || srcrect->h < swdata->h) {\n        /* The source rectangle has been clipped.\n           Using a scratch surface is easier than adding clipped\n           source support to all the blitters, plus that would\n           slow them down in the general unclipped case.\n         */\n        stretch = 1;\n    } else if ((srcrect->w != w) || (srcrect->h != h)) {\n        if ((w == 2 * srcrect->w) && (h == 2 * srcrect->h)) {\n            scale_2x = 1;\n        } else {\n            stretch = 1;\n        }\n    }\n    if (stretch) {\n        int bpp;\n        Uint32 Rmask, Gmask, Bmask, Amask;\n\n        if (swdata->display) {\n            swdata->display->w = w;\n            swdata->display->h = h;\n            swdata->display->pixels = pixels;\n            swdata->display->pitch = pitch;\n        } else {\n            /* This must have succeeded in SDL_SW_SetupYUVDisplay() earlier */\n            SDL_PixelFormatEnumToMasks(target_format, &bpp, &Rmask, &Gmask,\n                                       &Bmask, &Amask);\n            swdata->display =\n                SDL_CreateRGBSurfaceFrom(pixels, w, h, bpp, pitch, Rmask,\n                                         Gmask, Bmask, Amask);\n            if (!swdata->display) {\n                return (-1);\n            }\n        }\n        if (!swdata->stretch) {\n            /* This must have succeeded in SDL_SW_SetupYUVDisplay() earlier */\n            SDL_PixelFormatEnumToMasks(target_format, &bpp, &Rmask, &Gmask,\n                                       &Bmask, &Amask);\n            swdata->stretch =\n                SDL_CreateRGBSurface(0, swdata->w, swdata->h, bpp, Rmask,\n                                     Gmask, Bmask, Amask);\n            if (!swdata->stretch) {\n                return (-1);\n            }\n        }\n        pixels = swdata->stretch->pixels;\n        pitch = swdata->stretch->pitch;\n    }\n    switch (swdata->format) {\n    case SDL_PIXELFORMAT_YV12:\n        lum = swdata->planes[0];\n        Cr = swdata->planes[1];\n        Cb = swdata->planes[2];\n        break;\n    case SDL_PIXELFORMAT_IYUV:\n        lum = swdata->planes[0];\n        Cr = swdata->planes[2];\n        Cb = swdata->planes[1];\n        break;\n    case SDL_PIXELFORMAT_YUY2:\n        lum = swdata->planes[0];\n        Cr = lum + 3;\n        Cb = lum + 1;\n        break;\n    case SDL_PIXELFORMAT_UYVY:\n        lum = swdata->planes[0] + 1;\n        Cr = lum + 1;\n        Cb = lum - 1;\n        break;\n    case SDL_PIXELFORMAT_YVYU:\n        lum = swdata->planes[0];\n        Cr = lum + 1;\n        Cb = lum + 3;\n        break;\n    default:\n        return SDL_SetError(\"Unsupported YUV format in copy\");\n    }\n    mod = (pitch / targetbpp);\n\n    if (scale_2x) {\n        mod -= (swdata->w * 2);\n        swdata->Display2X(swdata->colortab, swdata->rgb_2_pix,\n                          lum, Cr, Cb, pixels, swdata->h, swdata->w, mod);\n    } else {\n        mod -= swdata->w;\n        swdata->Display1X(swdata->colortab, swdata->rgb_2_pix,\n                          lum, Cr, Cb, pixels, swdata->h, swdata->w, mod);\n    }\n    if (stretch) {\n        SDL_Rect rect = *srcrect;\n        SDL_SoftStretch(swdata->stretch, &rect, swdata->display, NULL);\n    }\n    return 0;\n}\n\nvoid\nSDL_SW_DestroyYUVTexture(SDL_SW_YUVTexture * swdata)\n{\n    if (swdata) {\n        SDL_free(swdata->pixels);\n        SDL_free(swdata->colortab);\n        SDL_free(swdata->rgb_2_pix);\n        SDL_FreeSurface(swdata->stretch);\n        SDL_FreeSurface(swdata->display);\n        SDL_free(swdata);\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/SDL_yuv_sw_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n\n/* This is the software implementation of the YUV texture support */\n\nstruct SDL_SW_YUVTexture\n{\n    Uint32 format;\n    Uint32 target_format;\n    int w, h;\n    Uint8 *pixels;\n    int *colortab;\n    Uint32 *rgb_2_pix;\n    void (*Display1X) (int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod);\n    void (*Display2X) (int *colortab, Uint32 * rgb_2_pix,\n                       unsigned char *lum, unsigned char *cr,\n                       unsigned char *cb, unsigned char *out,\n                       int rows, int cols, int mod);\n\n    /* These are just so we don't have to allocate them separately */\n    Uint16 pitches[3];\n    Uint8 *planes[3];\n\n    /* This is a temporary surface in case we have to stretch copy */\n    SDL_Surface *stretch;\n    SDL_Surface *display;\n};\n\ntypedef struct SDL_SW_YUVTexture SDL_SW_YUVTexture;\n\nSDL_SW_YUVTexture *SDL_SW_CreateYUVTexture(Uint32 format, int w, int h);\nint SDL_SW_QueryYUVTexturePixels(SDL_SW_YUVTexture * swdata, void **pixels,\n                                 int *pitch);\nint SDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,\n                            const void *pixels, int pitch);\nint SDL_SW_UpdateYUVTexturePlanar(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,\n                                  const Uint8 *Yplane, int Ypitch,\n                                  const Uint8 *Uplane, int Upitch,\n                                  const Uint8 *Vplane, int Vpitch);\nint SDL_SW_LockYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,\n                          void **pixels, int *pitch);\nvoid SDL_SW_UnlockYUVTexture(SDL_SW_YUVTexture * swdata);\nint SDL_SW_CopyYUVToRGB(SDL_SW_YUVTexture * swdata, const SDL_Rect * srcrect,\n                        Uint32 target_format, int w, int h, void *pixels,\n                        int pitch);\nvoid SDL_SW_DestroyYUVTexture(SDL_SW_YUVTexture * swdata);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/mmx.h",
    "content": "/*\tmmx.h\n\n\tMultiMedia eXtensions GCC interface library for IA32.\n\n\tTo use this library, simply include this header file\n\tand compile with GCC.  You MUST have inlining enabled\n\tin order for mmx_ok() to work; this can be done by\n\tsimply using -O on the GCC command line.\n\n\tCompiling with -DMMX_TRACE will cause detailed trace\n\toutput to be sent to stderr for each mmx operation.\n\tThis adds lots of code, and obviously slows execution to\n\ta crawl, but can be very useful for debugging.\n\n\tTHIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY\n\tEXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT\n\tLIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n\tAND FITNESS FOR ANY PARTICULAR PURPOSE.\n\n\t1997-99 by H. Dietz and R. Fisher\n\n Notes:\n\tIt appears that the latest gas has the pand problem fixed, therefore\n\t  I'll undefine BROKEN_PAND by default.\n*/\n\n#ifndef _MMX_H\n#define _MMX_H\n\n\n/*\tWarning:  at this writing, the version of GAS packaged\n\twith most Linux distributions does not handle the\n\tparallel AND operation mnemonic correctly.  If the\n\tsymbol BROKEN_PAND is defined, a slower alternative\n\tcoding will be used.  If execution of mmxtest results\n\tin an illegal instruction fault, define this symbol.\n*/\n#undef\tBROKEN_PAND\n\n\n/*\tThe type of an value that fits in an MMX register\n\t(note that long long constant values MUST be suffixed\n\t by LL and unsigned long long values by ULL, lest\n\t they be truncated by the compiler)\n*/\ntypedef union\n{\n    long long q;                /* Quadword (64-bit) value */\n    unsigned long long uq;      /* Unsigned Quadword */\n    int d[2];                   /* 2 Doubleword (32-bit) values */\n    unsigned int ud[2];         /* 2 Unsigned Doubleword */\n    short w[4];                 /* 4 Word (16-bit) values */\n    unsigned short uw[4];       /* 4 Unsigned Word */\n    char b[8];                  /* 8 Byte (8-bit) values */\n    unsigned char ub[8];        /* 8 Unsigned Byte */\n    float s[2];                 /* Single-precision (32-bit) value */\n} __attribute__ ((aligned(8))) mmx_t;   /* On an 8-byte (64-bit) boundary */\n\n\n#if 0\n/*\tFunction to test if multimedia instructions are supported...\n*/\ninline extern int\nmm_support(void)\n{\n    /* Returns 1 if MMX instructions are supported,\n       3 if Cyrix MMX and Extended MMX instructions are supported\n       5 if AMD MMX and 3DNow! instructions are supported\n       0 if hardware does not support any of these\n     */\n    register int rval = 0;\n\n    __asm__ __volatile__(\n                            /* See if CPUID instruction is supported ... */\n                            /* ... Get copies of EFLAGS into eax and ecx */\n                            \"pushf\\n\\t\"\n                            \"popl %%eax\\n\\t\" \"movl %%eax, %%ecx\\n\\t\"\n                            /* ... Toggle the ID bit in one copy and store */\n                            /*     to the EFLAGS reg */\n                            \"xorl $0x200000, %%eax\\n\\t\"\n                            \"push %%eax\\n\\t\" \"popf\\n\\t\"\n                            /* ... Get the (hopefully modified) EFLAGS */\n                            \"pushf\\n\\t\" \"popl %%eax\\n\\t\"\n                            /* ... Compare and test result */\n                            \"xorl %%eax, %%ecx\\n\\t\" \"testl $0x200000, %%ecx\\n\\t\" \"jz NotSupported1\\n\\t\" /* CPUID not supported */\n                            /* Get standard CPUID information, and\n                               go to a specific vendor section */\n                            \"movl $0, %%eax\\n\\t\" \"cpuid\\n\\t\"\n                            /* Check for Intel */\n                            \"cmpl $0x756e6547, %%ebx\\n\\t\"\n                            \"jne TryAMD\\n\\t\"\n                            \"cmpl $0x49656e69, %%edx\\n\\t\"\n                            \"jne TryAMD\\n\\t\"\n                            \"cmpl $0x6c65746e, %%ecx\\n\"\n                            \"jne TryAMD\\n\\t\" \"jmp Intel\\n\\t\"\n                            /* Check for AMD */\n                            \"\\nTryAMD:\\n\\t\"\n                            \"cmpl $0x68747541, %%ebx\\n\\t\"\n                            \"jne TryCyrix\\n\\t\"\n                            \"cmpl $0x69746e65, %%edx\\n\\t\"\n                            \"jne TryCyrix\\n\\t\"\n                            \"cmpl $0x444d4163, %%ecx\\n\"\n                            \"jne TryCyrix\\n\\t\" \"jmp AMD\\n\\t\"\n                            /* Check for Cyrix */\n                            \"\\nTryCyrix:\\n\\t\"\n                            \"cmpl $0x69727943, %%ebx\\n\\t\"\n                            \"jne NotSupported2\\n\\t\"\n                            \"cmpl $0x736e4978, %%edx\\n\\t\"\n                            \"jne NotSupported3\\n\\t\"\n                            \"cmpl $0x64616574, %%ecx\\n\\t\"\n                            \"jne NotSupported4\\n\\t\"\n                            /* Drop through to Cyrix... */\n                            /* Cyrix Section */\n                            /* See if extended CPUID level 80000001 is supported */\n                            /* The value of CPUID/80000001 for the 6x86MX is undefined\n                               according to the Cyrix CPU Detection Guide (Preliminary\n                               Rev. 1.01 table 1), so we'll check the value of eax for\n                               CPUID/0 to see if standard CPUID level 2 is supported.\n                               According to the table, the only CPU which supports level\n                               2 is also the only one which supports extended CPUID levels.\n                             */\n                            \"cmpl $0x2, %%eax\\n\\t\" \"jne MMXtest\\n\\t\"    /* Use standard CPUID instead */\n                            /* Extended CPUID supported (in theory), so get extended\n                               features */\n                            \"movl $0x80000001, %%eax\\n\\t\" \"cpuid\\n\\t\" \"testl $0x00800000, %%eax\\n\\t\"    /* Test for MMX */\n                            \"jz NotSupported5\\n\\t\"      /* MMX not supported */\n                            \"testl $0x01000000, %%eax\\n\\t\"      /* Test for Ext'd MMX */\n                            \"jnz EMMXSupported\\n\\t\" \"movl $1, %0:\\n\\n\\t\"        /* MMX Supported */\n                            \"jmp Return\\n\\n\" \"EMMXSupported:\\n\\t\" \"movl $3, %0:\\n\\n\\t\"  /* EMMX and MMX Supported */\n                            \"jmp Return\\n\\t\"\n                            /* AMD Section */\n                            \"AMD:\\n\\t\"\n                            /* See if extended CPUID is supported */\n                            \"movl $0x80000000, %%eax\\n\\t\" \"cpuid\\n\\t\" \"cmpl $0x80000000, %%eax\\n\\t\" \"jl MMXtest\\n\\t\"    /* Use standard CPUID instead */\n                            /* Extended CPUID supported, so get extended features */\n                            \"movl $0x80000001, %%eax\\n\\t\" \"cpuid\\n\\t\" \"testl $0x00800000, %%edx\\n\\t\"    /* Test for MMX */\n                            \"jz NotSupported6\\n\\t\"      /* MMX not supported */\n                            \"testl $0x80000000, %%edx\\n\\t\"      /* Test for 3DNow! */\n                            \"jnz ThreeDNowSupported\\n\\t\" \"movl $1, %0:\\n\\n\\t\"   /* MMX Supported */\n                            \"jmp Return\\n\\n\" \"ThreeDNowSupported:\\n\\t\" \"movl $5, %0:\\n\\n\\t\"     /* 3DNow! and MMX Supported */\n                            \"jmp Return\\n\\t\"\n                            /* Intel Section */\n                            \"Intel:\\n\\t\"\n                            /* Check for MMX */\n                            \"MMXtest:\\n\\t\" \"movl $1, %%eax\\n\\t\" \"cpuid\\n\\t\" \"testl $0x00800000, %%edx\\n\\t\"      /* Test for MMX */\n                            \"jz NotSupported7\\n\\t\"      /* MMX Not supported */\n                            \"movl $1, %0:\\n\\n\\t\"        /* MMX Supported */\n                            \"jmp Return\\n\\t\"\n                            /* Nothing supported */\n                            \"\\nNotSupported1:\\n\\t\" \"#movl $101, %0:\\n\\n\\t\" \"\\nNotSupported2:\\n\\t\" \"#movl $102, %0:\\n\\n\\t\" \"\\nNotSupported3:\\n\\t\" \"#movl $103, %0:\\n\\n\\t\" \"\\nNotSupported4:\\n\\t\" \"#movl $104, %0:\\n\\n\\t\" \"\\nNotSupported5:\\n\\t\" \"#movl $105, %0:\\n\\n\\t\" \"\\nNotSupported6:\\n\\t\" \"#movl $106, %0:\\n\\n\\t\" \"\\nNotSupported7:\\n\\t\" \"#movl $107, %0:\\n\\n\\t\" \"movl $0, %0:\\n\\n\\t\" \"Return:\\n\\t\":\"=a\"(rval):     /* no input */\n                            :\"eax\", \"ebx\", \"ecx\", \"edx\");\n\n    /* Return */\n    return (rval);\n}\n\n/*\tFunction to test if mmx instructions are supported...\n*/\ninline extern int\nmmx_ok(void)\n{\n    /* Returns 1 if MMX instructions are supported, 0 otherwise */\n    return (mm_support() & 0x1);\n}\n#endif\n\n/*\tHelper functions for the instruction macros that follow...\n\t(note that memory-to-register, m2r, instructions are nearly\n\t as efficient as register-to-register, r2r, instructions;\n\t however, memory-to-memory instructions are really simulated\n\t as a convenience, and are only 1/3 as efficient)\n*/\n#ifdef\tMMX_TRACE\n\n/*\tInclude the stuff for printing a trace to stderr...\n*/\n\n#define\tmmx_i2r(op, imm, reg) \\\n\t{ \\\n\t\tmmx_t mmx_trace; \\\n\t\tmmx_trace.uq = (imm); \\\n\t\tprintf(#op \"_i2r(\" #imm \"=0x%08x%08x, \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\t__asm__ __volatile__ (\"movq %%\" #reg \", %0\" \\\n\t\t\t\t      : \"=X\" (mmx_trace) \\\n\t\t\t\t      : /* nothing */ ); \\\n\t\tprintf(#reg \"=0x%08x%08x) => \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\t__asm__ __volatile__ (#op \" %0, %%\" #reg \\\n\t\t\t\t      : /* nothing */ \\\n\t\t\t\t      : \"X\" (imm)); \\\n\t\t__asm__ __volatile__ (\"movq %%\" #reg \", %0\" \\\n\t\t\t\t      : \"=X\" (mmx_trace) \\\n\t\t\t\t      : /* nothing */ ); \\\n\t\tprintf(#reg \"=0x%08x%08x\\n\", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t}\n\n#define\tmmx_m2r(op, mem, reg) \\\n\t{ \\\n\t\tmmx_t mmx_trace; \\\n\t\tmmx_trace = (mem); \\\n\t\tprintf(#op \"_m2r(\" #mem \"=0x%08x%08x, \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\t__asm__ __volatile__ (\"movq %%\" #reg \", %0\" \\\n\t\t\t\t      : \"=X\" (mmx_trace) \\\n\t\t\t\t      : /* nothing */ ); \\\n\t\tprintf(#reg \"=0x%08x%08x) => \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\t__asm__ __volatile__ (#op \" %0, %%\" #reg \\\n\t\t\t\t      : /* nothing */ \\\n\t\t\t\t      : \"X\" (mem)); \\\n\t\t__asm__ __volatile__ (\"movq %%\" #reg \", %0\" \\\n\t\t\t\t      : \"=X\" (mmx_trace) \\\n\t\t\t\t      : /* nothing */ ); \\\n\t\tprintf(#reg \"=0x%08x%08x\\n\", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t}\n\n#define\tmmx_r2m(op, reg, mem) \\\n\t{ \\\n\t\tmmx_t mmx_trace; \\\n\t\t__asm__ __volatile__ (\"movq %%\" #reg \", %0\" \\\n\t\t\t\t      : \"=X\" (mmx_trace) \\\n\t\t\t\t      : /* nothing */ ); \\\n\t\tprintf(#op \"_r2m(\" #reg \"=0x%08x%08x, \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\tmmx_trace = (mem); \\\n\t\tprintf(#mem \"=0x%08x%08x) => \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\t__asm__ __volatile__ (#op \" %%\" #reg \", %0\" \\\n\t\t\t\t      : \"=X\" (mem) \\\n\t\t\t\t      : /* nothing */ ); \\\n\t\tmmx_trace = (mem); \\\n\t\tprintf(#mem \"=0x%08x%08x\\n\", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t}\n\n#define\tmmx_r2r(op, regs, regd) \\\n\t{ \\\n\t\tmmx_t mmx_trace; \\\n\t\t__asm__ __volatile__ (\"movq %%\" #regs \", %0\" \\\n\t\t\t\t      : \"=X\" (mmx_trace) \\\n\t\t\t\t      : /* nothing */ ); \\\n\t\tprintf(#op \"_r2r(\" #regs \"=0x%08x%08x, \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\t__asm__ __volatile__ (\"movq %%\" #regd \", %0\" \\\n\t\t\t\t      : \"=X\" (mmx_trace) \\\n\t\t\t\t      : /* nothing */ ); \\\n\t\tprintf(#regd \"=0x%08x%08x) => \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\t__asm__ __volatile__ (#op \" %\" #regs \", %\" #regd); \\\n\t\t__asm__ __volatile__ (\"movq %%\" #regd \", %0\" \\\n\t\t\t\t      : \"=X\" (mmx_trace) \\\n\t\t\t\t      : /* nothing */ ); \\\n\t\tprintf(#regd \"=0x%08x%08x\\n\", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t}\n\n#define\tmmx_m2m(op, mems, memd) \\\n\t{ \\\n\t\tmmx_t mmx_trace; \\\n\t\tmmx_trace = (mems); \\\n\t\tprintf(#op \"_m2m(\" #mems \"=0x%08x%08x, \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\tmmx_trace = (memd); \\\n\t\tprintf(#memd \"=0x%08x%08x) => \", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t\t__asm__ __volatile__ (\"movq %0, %%mm0\\n\\t\" \\\n\t\t\t\t      #op \" %1, %%mm0\\n\\t\" \\\n\t\t\t\t      \"movq %%mm0, %0\" \\\n\t\t\t\t      : \"=X\" (memd) \\\n\t\t\t\t      : \"X\" (mems)); \\\n\t\tmmx_trace = (memd); \\\n\t\tprintf(#memd \"=0x%08x%08x\\n\", \\\n\t\t\tmmx_trace.d[1], mmx_trace.d[0]); \\\n\t}\n\n#else\n\n/*\tThese macros are a lot simpler without the tracing...\n*/\n\n#define\tmmx_i2r(op, imm, reg) \\\n\t__asm__ __volatile__ (#op \" %0, %%\" #reg \\\n\t\t\t      : /* nothing */ \\\n\t\t\t      : \"X\" (imm) )\n\n#define\tmmx_m2r(op, mem, reg) \\\n\t__asm__ __volatile__ (#op \" %0, %%\" #reg \\\n\t\t\t      : /* nothing */ \\\n\t\t\t      : \"m\" (mem))\n\n#define\tmmx_r2m(op, reg, mem) \\\n\t__asm__ __volatile__ (#op \" %%\" #reg \", %0\" \\\n\t\t\t      : \"=m\" (mem) \\\n\t\t\t      : /* nothing */ )\n\n#define\tmmx_r2r(op, regs, regd) \\\n\t__asm__ __volatile__ (#op \" %\" #regs \", %\" #regd)\n\n#define\tmmx_m2m(op, mems, memd) \\\n\t__asm__ __volatile__ (\"movq %0, %%mm0\\n\\t\" \\\n\t\t\t      #op \" %1, %%mm0\\n\\t\" \\\n\t\t\t      \"movq %%mm0, %0\" \\\n\t\t\t      : \"=X\" (memd) \\\n\t\t\t      : \"X\" (mems))\n\n#endif\n\n\n/*\t1x64 MOVe Quadword\n\t(this is both a load and a store...\n\t in fact, it is the only way to store)\n*/\n#define\tmovq_m2r(var, reg)\tmmx_m2r(movq, var, reg)\n#define\tmovq_r2m(reg, var)\tmmx_r2m(movq, reg, var)\n#define\tmovq_r2r(regs, regd)\tmmx_r2r(movq, regs, regd)\n#define\tmovq(vars, vard) \\\n\t__asm__ __volatile__ (\"movq %1, %%mm0\\n\\t\" \\\n\t\t\t      \"movq %%mm0, %0\" \\\n\t\t\t      : \"=X\" (vard) \\\n\t\t\t      : \"X\" (vars))\n\n\n/*\t1x32 MOVe Doubleword\n\t(like movq, this is both load and store...\n\t but is most useful for moving things between\n\t mmx registers and ordinary registers)\n*/\n#define\tmovd_m2r(var, reg)\tmmx_m2r(movd, var, reg)\n#define\tmovd_r2m(reg, var)\tmmx_r2m(movd, reg, var)\n#define\tmovd_r2r(regs, regd)\tmmx_r2r(movd, regs, regd)\n#define\tmovd(vars, vard) \\\n\t__asm__ __volatile__ (\"movd %1, %%mm0\\n\\t\" \\\n\t\t\t      \"movd %%mm0, %0\" \\\n\t\t\t      : \"=X\" (vard) \\\n\t\t\t      : \"X\" (vars))\n\n\n/*\t2x32, 4x16, and 8x8 Parallel ADDs\n*/\n#define\tpaddd_m2r(var, reg)\tmmx_m2r(paddd, var, reg)\n#define\tpaddd_r2r(regs, regd)\tmmx_r2r(paddd, regs, regd)\n#define\tpaddd(vars, vard)\tmmx_m2m(paddd, vars, vard)\n\n#define\tpaddw_m2r(var, reg)\tmmx_m2r(paddw, var, reg)\n#define\tpaddw_r2r(regs, regd)\tmmx_r2r(paddw, regs, regd)\n#define\tpaddw(vars, vard)\tmmx_m2m(paddw, vars, vard)\n\n#define\tpaddb_m2r(var, reg)\tmmx_m2r(paddb, var, reg)\n#define\tpaddb_r2r(regs, regd)\tmmx_r2r(paddb, regs, regd)\n#define\tpaddb(vars, vard)\tmmx_m2m(paddb, vars, vard)\n\n\n/*\t4x16 and 8x8 Parallel ADDs using Saturation arithmetic\n*/\n#define\tpaddsw_m2r(var, reg)\tmmx_m2r(paddsw, var, reg)\n#define\tpaddsw_r2r(regs, regd)\tmmx_r2r(paddsw, regs, regd)\n#define\tpaddsw(vars, vard)\tmmx_m2m(paddsw, vars, vard)\n\n#define\tpaddsb_m2r(var, reg)\tmmx_m2r(paddsb, var, reg)\n#define\tpaddsb_r2r(regs, regd)\tmmx_r2r(paddsb, regs, regd)\n#define\tpaddsb(vars, vard)\tmmx_m2m(paddsb, vars, vard)\n\n\n/*\t4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic\n*/\n#define\tpaddusw_m2r(var, reg)\tmmx_m2r(paddusw, var, reg)\n#define\tpaddusw_r2r(regs, regd)\tmmx_r2r(paddusw, regs, regd)\n#define\tpaddusw(vars, vard)\tmmx_m2m(paddusw, vars, vard)\n\n#define\tpaddusb_m2r(var, reg)\tmmx_m2r(paddusb, var, reg)\n#define\tpaddusb_r2r(regs, regd)\tmmx_r2r(paddusb, regs, regd)\n#define\tpaddusb(vars, vard)\tmmx_m2m(paddusb, vars, vard)\n\n\n/*\t2x32, 4x16, and 8x8 Parallel SUBs\n*/\n#define\tpsubd_m2r(var, reg)\tmmx_m2r(psubd, var, reg)\n#define\tpsubd_r2r(regs, regd)\tmmx_r2r(psubd, regs, regd)\n#define\tpsubd(vars, vard)\tmmx_m2m(psubd, vars, vard)\n\n#define\tpsubw_m2r(var, reg)\tmmx_m2r(psubw, var, reg)\n#define\tpsubw_r2r(regs, regd)\tmmx_r2r(psubw, regs, regd)\n#define\tpsubw(vars, vard)\tmmx_m2m(psubw, vars, vard)\n\n#define\tpsubb_m2r(var, reg)\tmmx_m2r(psubb, var, reg)\n#define\tpsubb_r2r(regs, regd)\tmmx_r2r(psubb, regs, regd)\n#define\tpsubb(vars, vard)\tmmx_m2m(psubb, vars, vard)\n\n\n/*\t4x16 and 8x8 Parallel SUBs using Saturation arithmetic\n*/\n#define\tpsubsw_m2r(var, reg)\tmmx_m2r(psubsw, var, reg)\n#define\tpsubsw_r2r(regs, regd)\tmmx_r2r(psubsw, regs, regd)\n#define\tpsubsw(vars, vard)\tmmx_m2m(psubsw, vars, vard)\n\n#define\tpsubsb_m2r(var, reg)\tmmx_m2r(psubsb, var, reg)\n#define\tpsubsb_r2r(regs, regd)\tmmx_r2r(psubsb, regs, regd)\n#define\tpsubsb(vars, vard)\tmmx_m2m(psubsb, vars, vard)\n\n\n/*\t4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic\n*/\n#define\tpsubusw_m2r(var, reg)\tmmx_m2r(psubusw, var, reg)\n#define\tpsubusw_r2r(regs, regd)\tmmx_r2r(psubusw, regs, regd)\n#define\tpsubusw(vars, vard)\tmmx_m2m(psubusw, vars, vard)\n\n#define\tpsubusb_m2r(var, reg)\tmmx_m2r(psubusb, var, reg)\n#define\tpsubusb_r2r(regs, regd)\tmmx_r2r(psubusb, regs, regd)\n#define\tpsubusb(vars, vard)\tmmx_m2m(psubusb, vars, vard)\n\n\n/*\t4x16 Parallel MULs giving Low 4x16 portions of results\n*/\n#define\tpmullw_m2r(var, reg)\tmmx_m2r(pmullw, var, reg)\n#define\tpmullw_r2r(regs, regd)\tmmx_r2r(pmullw, regs, regd)\n#define\tpmullw(vars, vard)\tmmx_m2m(pmullw, vars, vard)\n\n\n/*\t4x16 Parallel MULs giving High 4x16 portions of results\n*/\n#define\tpmulhw_m2r(var, reg)\tmmx_m2r(pmulhw, var, reg)\n#define\tpmulhw_r2r(regs, regd)\tmmx_r2r(pmulhw, regs, regd)\n#define\tpmulhw(vars, vard)\tmmx_m2m(pmulhw, vars, vard)\n\n\n/*\t4x16->2x32 Parallel Mul-ADD\n\t(muls like pmullw, then adds adjacent 16-bit fields\n\t in the multiply result to make the final 2x32 result)\n*/\n#define\tpmaddwd_m2r(var, reg)\tmmx_m2r(pmaddwd, var, reg)\n#define\tpmaddwd_r2r(regs, regd)\tmmx_r2r(pmaddwd, regs, regd)\n#define\tpmaddwd(vars, vard)\tmmx_m2m(pmaddwd, vars, vard)\n\n\n/*\t1x64 bitwise AND\n*/\n#ifdef\tBROKEN_PAND\n#define\tpand_m2r(var, reg) \\\n\t{ \\\n\t\tmmx_m2r(pandn, (mmx_t) -1LL, reg); \\\n\t\tmmx_m2r(pandn, var, reg); \\\n\t}\n#define\tpand_r2r(regs, regd) \\\n\t{ \\\n\t\tmmx_m2r(pandn, (mmx_t) -1LL, regd); \\\n\t\tmmx_r2r(pandn, regs, regd) \\\n\t}\n#define\tpand(vars, vard) \\\n\t{ \\\n\t\tmovq_m2r(vard, mm0); \\\n\t\tmmx_m2r(pandn, (mmx_t) -1LL, mm0); \\\n\t\tmmx_m2r(pandn, vars, mm0); \\\n\t\tmovq_r2m(mm0, vard); \\\n\t}\n#else\n#define\tpand_m2r(var, reg)\tmmx_m2r(pand, var, reg)\n#define\tpand_r2r(regs, regd)\tmmx_r2r(pand, regs, regd)\n#define\tpand(vars, vard)\tmmx_m2m(pand, vars, vard)\n#endif\n\n\n/*\t1x64 bitwise AND with Not the destination\n*/\n#define\tpandn_m2r(var, reg)\tmmx_m2r(pandn, var, reg)\n#define\tpandn_r2r(regs, regd)\tmmx_r2r(pandn, regs, regd)\n#define\tpandn(vars, vard)\tmmx_m2m(pandn, vars, vard)\n\n\n/*\t1x64 bitwise OR\n*/\n#define\tpor_m2r(var, reg)\tmmx_m2r(por, var, reg)\n#define\tpor_r2r(regs, regd)\tmmx_r2r(por, regs, regd)\n#define\tpor(vars, vard)\tmmx_m2m(por, vars, vard)\n\n\n/*\t1x64 bitwise eXclusive OR\n*/\n#define\tpxor_m2r(var, reg)\tmmx_m2r(pxor, var, reg)\n#define\tpxor_r2r(regs, regd)\tmmx_r2r(pxor, regs, regd)\n#define\tpxor(vars, vard)\tmmx_m2m(pxor, vars, vard)\n\n\n/*\t2x32, 4x16, and 8x8 Parallel CoMPare for EQuality\n\t(resulting fields are either 0 or -1)\n*/\n#define\tpcmpeqd_m2r(var, reg)\tmmx_m2r(pcmpeqd, var, reg)\n#define\tpcmpeqd_r2r(regs, regd)\tmmx_r2r(pcmpeqd, regs, regd)\n#define\tpcmpeqd(vars, vard)\tmmx_m2m(pcmpeqd, vars, vard)\n\n#define\tpcmpeqw_m2r(var, reg)\tmmx_m2r(pcmpeqw, var, reg)\n#define\tpcmpeqw_r2r(regs, regd)\tmmx_r2r(pcmpeqw, regs, regd)\n#define\tpcmpeqw(vars, vard)\tmmx_m2m(pcmpeqw, vars, vard)\n\n#define\tpcmpeqb_m2r(var, reg)\tmmx_m2r(pcmpeqb, var, reg)\n#define\tpcmpeqb_r2r(regs, regd)\tmmx_r2r(pcmpeqb, regs, regd)\n#define\tpcmpeqb(vars, vard)\tmmx_m2m(pcmpeqb, vars, vard)\n\n\n/*\t2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than\n\t(resulting fields are either 0 or -1)\n*/\n#define\tpcmpgtd_m2r(var, reg)\tmmx_m2r(pcmpgtd, var, reg)\n#define\tpcmpgtd_r2r(regs, regd)\tmmx_r2r(pcmpgtd, regs, regd)\n#define\tpcmpgtd(vars, vard)\tmmx_m2m(pcmpgtd, vars, vard)\n\n#define\tpcmpgtw_m2r(var, reg)\tmmx_m2r(pcmpgtw, var, reg)\n#define\tpcmpgtw_r2r(regs, regd)\tmmx_r2r(pcmpgtw, regs, regd)\n#define\tpcmpgtw(vars, vard)\tmmx_m2m(pcmpgtw, vars, vard)\n\n#define\tpcmpgtb_m2r(var, reg)\tmmx_m2r(pcmpgtb, var, reg)\n#define\tpcmpgtb_r2r(regs, regd)\tmmx_r2r(pcmpgtb, regs, regd)\n#define\tpcmpgtb(vars, vard)\tmmx_m2m(pcmpgtb, vars, vard)\n\n\n/*\t1x64, 2x32, and 4x16 Parallel Shift Left Logical\n*/\n#define\tpsllq_i2r(imm, reg)\tmmx_i2r(psllq, imm, reg)\n#define\tpsllq_m2r(var, reg)\tmmx_m2r(psllq, var, reg)\n#define\tpsllq_r2r(regs, regd)\tmmx_r2r(psllq, regs, regd)\n#define\tpsllq(vars, vard)\tmmx_m2m(psllq, vars, vard)\n\n#define\tpslld_i2r(imm, reg)\tmmx_i2r(pslld, imm, reg)\n#define\tpslld_m2r(var, reg)\tmmx_m2r(pslld, var, reg)\n#define\tpslld_r2r(regs, regd)\tmmx_r2r(pslld, regs, regd)\n#define\tpslld(vars, vard)\tmmx_m2m(pslld, vars, vard)\n\n#define\tpsllw_i2r(imm, reg)\tmmx_i2r(psllw, imm, reg)\n#define\tpsllw_m2r(var, reg)\tmmx_m2r(psllw, var, reg)\n#define\tpsllw_r2r(regs, regd)\tmmx_r2r(psllw, regs, regd)\n#define\tpsllw(vars, vard)\tmmx_m2m(psllw, vars, vard)\n\n\n/*\t1x64, 2x32, and 4x16 Parallel Shift Right Logical\n*/\n#define\tpsrlq_i2r(imm, reg)\tmmx_i2r(psrlq, imm, reg)\n#define\tpsrlq_m2r(var, reg)\tmmx_m2r(psrlq, var, reg)\n#define\tpsrlq_r2r(regs, regd)\tmmx_r2r(psrlq, regs, regd)\n#define\tpsrlq(vars, vard)\tmmx_m2m(psrlq, vars, vard)\n\n#define\tpsrld_i2r(imm, reg)\tmmx_i2r(psrld, imm, reg)\n#define\tpsrld_m2r(var, reg)\tmmx_m2r(psrld, var, reg)\n#define\tpsrld_r2r(regs, regd)\tmmx_r2r(psrld, regs, regd)\n#define\tpsrld(vars, vard)\tmmx_m2m(psrld, vars, vard)\n\n#define\tpsrlw_i2r(imm, reg)\tmmx_i2r(psrlw, imm, reg)\n#define\tpsrlw_m2r(var, reg)\tmmx_m2r(psrlw, var, reg)\n#define\tpsrlw_r2r(regs, regd)\tmmx_r2r(psrlw, regs, regd)\n#define\tpsrlw(vars, vard)\tmmx_m2m(psrlw, vars, vard)\n\n\n/*\t2x32 and 4x16 Parallel Shift Right Arithmetic\n*/\n#define\tpsrad_i2r(imm, reg)\tmmx_i2r(psrad, imm, reg)\n#define\tpsrad_m2r(var, reg)\tmmx_m2r(psrad, var, reg)\n#define\tpsrad_r2r(regs, regd)\tmmx_r2r(psrad, regs, regd)\n#define\tpsrad(vars, vard)\tmmx_m2m(psrad, vars, vard)\n\n#define\tpsraw_i2r(imm, reg)\tmmx_i2r(psraw, imm, reg)\n#define\tpsraw_m2r(var, reg)\tmmx_m2r(psraw, var, reg)\n#define\tpsraw_r2r(regs, regd)\tmmx_r2r(psraw, regs, regd)\n#define\tpsraw(vars, vard)\tmmx_m2m(psraw, vars, vard)\n\n\n/*\t2x32->4x16 and 4x16->8x8 PACK and Signed Saturate\n\t(packs source and dest fields into dest in that order)\n*/\n#define\tpackssdw_m2r(var, reg)\tmmx_m2r(packssdw, var, reg)\n#define\tpackssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd)\n#define\tpackssdw(vars, vard)\tmmx_m2m(packssdw, vars, vard)\n\n#define\tpacksswb_m2r(var, reg)\tmmx_m2r(packsswb, var, reg)\n#define\tpacksswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd)\n#define\tpacksswb(vars, vard)\tmmx_m2m(packsswb, vars, vard)\n\n\n/*\t4x16->8x8 PACK and Unsigned Saturate\n\t(packs source and dest fields into dest in that order)\n*/\n#define\tpackuswb_m2r(var, reg)\tmmx_m2r(packuswb, var, reg)\n#define\tpackuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd)\n#define\tpackuswb(vars, vard)\tmmx_m2m(packuswb, vars, vard)\n\n\n/*\t2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low\n\t(interleaves low half of dest with low half of source\n\t as padding in each result field)\n*/\n#define\tpunpckldq_m2r(var, reg)\tmmx_m2r(punpckldq, var, reg)\n#define\tpunpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd)\n#define\tpunpckldq(vars, vard)\tmmx_m2m(punpckldq, vars, vard)\n\n#define\tpunpcklwd_m2r(var, reg)\tmmx_m2r(punpcklwd, var, reg)\n#define\tpunpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd)\n#define\tpunpcklwd(vars, vard)\tmmx_m2m(punpcklwd, vars, vard)\n\n#define\tpunpcklbw_m2r(var, reg)\tmmx_m2r(punpcklbw, var, reg)\n#define\tpunpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd)\n#define\tpunpcklbw(vars, vard)\tmmx_m2m(punpcklbw, vars, vard)\n\n\n/*\t2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High\n\t(interleaves high half of dest with high half of source\n\t as padding in each result field)\n*/\n#define\tpunpckhdq_m2r(var, reg)\tmmx_m2r(punpckhdq, var, reg)\n#define\tpunpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd)\n#define\tpunpckhdq(vars, vard)\tmmx_m2m(punpckhdq, vars, vard)\n\n#define\tpunpckhwd_m2r(var, reg)\tmmx_m2r(punpckhwd, var, reg)\n#define\tpunpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd)\n#define\tpunpckhwd(vars, vard)\tmmx_m2m(punpckhwd, vars, vard)\n\n#define\tpunpckhbw_m2r(var, reg)\tmmx_m2r(punpckhbw, var, reg)\n#define\tpunpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd)\n#define\tpunpckhbw(vars, vard)\tmmx_m2m(punpckhbw, vars, vard)\n\n\n/*\tEmpty MMx State\n\t(used to clean-up when going from mmx to float use\n\t of the registers that are shared by both; note that\n\t there is no float-to-mmx operation needed, because\n\t only the float tag word info is corruptible)\n*/\n#ifdef\tMMX_TRACE\n\n#define\temms() \\\n\t{ \\\n\t\tprintf(\"emms()\\n\"); \\\n\t\t__asm__ __volatile__ (\"emms\"); \\\n\t}\n\n#else\n\n#define\temms()\t\t\t__asm__ __volatile__ (\"emms\")\n\n#endif\n\n#endif\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/opengl/SDL_glfuncs.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* list of OpenGL functions sorted alphabetically\n   If you need to use a GL function from the SDL video subsystem,\n   change its entry from SDL_PROC_UNUSED to SDL_PROC and rebuild.\n*/\n#define SDL_PROC_UNUSED(ret,func,params)\n\nSDL_PROC_UNUSED(void, glAccum, (GLenum, GLfloat))\nSDL_PROC_UNUSED(void, glAlphaFunc, (GLenum, GLclampf))\nSDL_PROC_UNUSED(GLboolean, glAreTexturesResident,\n                (GLsizei, const GLuint *, GLboolean *))\nSDL_PROC_UNUSED(void, glArrayElement, (GLint))\nSDL_PROC(void, glBegin, (GLenum))\nSDL_PROC(void, glBindTexture, (GLenum, GLuint))\nSDL_PROC_UNUSED(void, glBitmap,\n                (GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat,\n                 const GLubyte *))\nSDL_PROC(void, glBlendFunc, (GLenum, GLenum))\nSDL_PROC(void, glBlendFuncSeparate, (GLenum, GLenum, GLenum, GLenum))\nSDL_PROC_UNUSED(void, glCallList, (GLuint))\nSDL_PROC_UNUSED(void, glCallLists, (GLsizei, GLenum, const GLvoid *))\nSDL_PROC(void, glClear, (GLbitfield))\nSDL_PROC_UNUSED(void, glClearAccum, (GLfloat, GLfloat, GLfloat, GLfloat))\nSDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf))\nSDL_PROC_UNUSED(void, glClearDepth, (GLclampd))\nSDL_PROC_UNUSED(void, glClearIndex, (GLfloat))\nSDL_PROC_UNUSED(void, glClearStencil, (GLint))\nSDL_PROC_UNUSED(void, glClipPlane, (GLenum, const GLdouble *))\nSDL_PROC_UNUSED(void, glColor3b, (GLbyte, GLbyte, GLbyte))\nSDL_PROC_UNUSED(void, glColor3bv, (const GLbyte *))\nSDL_PROC_UNUSED(void, glColor3d, (GLdouble, GLdouble, GLdouble))\nSDL_PROC_UNUSED(void, glColor3dv, (const GLdouble *))\nSDL_PROC_UNUSED(void, glColor3f, (GLfloat, GLfloat, GLfloat))\nSDL_PROC(void, glColor3fv, (const GLfloat *))\nSDL_PROC_UNUSED(void, glColor3i, (GLint, GLint, GLint))\nSDL_PROC_UNUSED(void, glColor3iv, (const GLint *))\nSDL_PROC_UNUSED(void, glColor3s, (GLshort, GLshort, GLshort))\nSDL_PROC_UNUSED(void, glColor3sv, (const GLshort *))\nSDL_PROC_UNUSED(void, glColor3ub, (GLubyte, GLubyte, GLubyte))\nSDL_PROC_UNUSED(void, glColor3ubv, (const GLubyte *))\nSDL_PROC_UNUSED(void, glColor3ui, (GLuint, GLuint, GLuint))\nSDL_PROC_UNUSED(void, glColor3uiv, (const GLuint *))\nSDL_PROC_UNUSED(void, glColor3us, (GLushort, GLushort, GLushort))\nSDL_PROC_UNUSED(void, glColor3usv, (const GLushort *))\nSDL_PROC_UNUSED(void, glColor4b, (GLbyte, GLbyte, GLbyte, GLbyte))\nSDL_PROC_UNUSED(void, glColor4bv, (const GLbyte *))\nSDL_PROC_UNUSED(void, glColor4d, (GLdouble, GLdouble, GLdouble, GLdouble))\nSDL_PROC_UNUSED(void, glColor4dv, (const GLdouble *))\nSDL_PROC(void, glColor4f, (GLfloat, GLfloat, GLfloat, GLfloat))\nSDL_PROC_UNUSED(void, glColor4fv, (const GLfloat *))\nSDL_PROC_UNUSED(void, glColor4i, (GLint, GLint, GLint, GLint))\nSDL_PROC_UNUSED(void, glColor4iv, (const GLint *))\nSDL_PROC_UNUSED(void, glColor4s, (GLshort, GLshort, GLshort, GLshort))\nSDL_PROC_UNUSED(void, glColor4sv, (const GLshort *))\nSDL_PROC_UNUSED(void, glColor4ub,\n                (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha))\nSDL_PROC_UNUSED(void, glColor4ubv, (const GLubyte * v))\nSDL_PROC_UNUSED(void, glColor4ui,\n                (GLuint red, GLuint green, GLuint blue, GLuint alpha))\nSDL_PROC_UNUSED(void, glColor4uiv, (const GLuint * v))\nSDL_PROC_UNUSED(void, glColor4us,\n                (GLushort red, GLushort green, GLushort blue, GLushort alpha))\nSDL_PROC_UNUSED(void, glColor4usv, (const GLushort * v))\nSDL_PROC_UNUSED(void, glColorMask,\n                (GLboolean red, GLboolean green, GLboolean blue,\n                 GLboolean alpha))\nSDL_PROC_UNUSED(void, glColorMaterial, (GLenum face, GLenum mode))\nSDL_PROC_UNUSED(void, glColorPointer,\n                (GLint size, GLenum type, GLsizei stride,\n                 const GLvoid * pointer))\nSDL_PROC_UNUSED(void, glCopyPixels,\n                (GLint x, GLint y, GLsizei width, GLsizei height,\n                 GLenum type))\nSDL_PROC_UNUSED(void, glCopyTexImage1D,\n                (GLenum target, GLint level, GLenum internalFormat, GLint x,\n                 GLint y, GLsizei width, GLint border))\nSDL_PROC_UNUSED(void, glCopyTexImage2D,\n                (GLenum target, GLint level, GLenum internalFormat, GLint x,\n                 GLint y, GLsizei width, GLsizei height, GLint border))\nSDL_PROC_UNUSED(void, glCopyTexSubImage1D,\n                (GLenum target, GLint level, GLint xoffset, GLint x, GLint y,\n                 GLsizei width))\nSDL_PROC_UNUSED(void, glCopyTexSubImage2D,\n                (GLenum target, GLint level, GLint xoffset, GLint yoffset,\n                 GLint x, GLint y, GLsizei width, GLsizei height))\nSDL_PROC_UNUSED(void, glCullFace, (GLenum mode))\nSDL_PROC_UNUSED(void, glDeleteLists, (GLuint list, GLsizei range))\nSDL_PROC(void, glDeleteTextures, (GLsizei n, const GLuint * textures))\nSDL_PROC(void, glDepthFunc, (GLenum func))\nSDL_PROC_UNUSED(void, glDepthMask, (GLboolean flag))\nSDL_PROC_UNUSED(void, glDepthRange, (GLclampd zNear, GLclampd zFar))\nSDL_PROC(void, glDisable, (GLenum cap))\nSDL_PROC_UNUSED(void, glDisableClientState, (GLenum array))\nSDL_PROC_UNUSED(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count))\nSDL_PROC_UNUSED(void, glDrawBuffer, (GLenum mode))\nSDL_PROC_UNUSED(void, glDrawElements,\n                (GLenum mode, GLsizei count, GLenum type,\n                 const GLvoid * indices))\nSDL_PROC(void, glDrawPixels,\n         (GLsizei width, GLsizei height, GLenum format, GLenum type,\n          const GLvoid * pixels))\nSDL_PROC_UNUSED(void, glEdgeFlag, (GLboolean flag))\nSDL_PROC_UNUSED(void, glEdgeFlagPointer,\n                (GLsizei stride, const GLvoid * pointer))\nSDL_PROC_UNUSED(void, glEdgeFlagv, (const GLboolean * flag))\nSDL_PROC(void, glEnable, (GLenum cap))\nSDL_PROC_UNUSED(void, glEnableClientState, (GLenum array))\nSDL_PROC(void, glEnd, (void))\nSDL_PROC_UNUSED(void, glEndList, (void))\nSDL_PROC_UNUSED(void, glEvalCoord1d, (GLdouble u))\nSDL_PROC_UNUSED(void, glEvalCoord1dv, (const GLdouble * u))\nSDL_PROC_UNUSED(void, glEvalCoord1f, (GLfloat u))\nSDL_PROC_UNUSED(void, glEvalCoord1fv, (const GLfloat * u))\nSDL_PROC_UNUSED(void, glEvalCoord2d, (GLdouble u, GLdouble v))\nSDL_PROC_UNUSED(void, glEvalCoord2dv, (const GLdouble * u))\nSDL_PROC_UNUSED(void, glEvalCoord2f, (GLfloat u, GLfloat v))\nSDL_PROC_UNUSED(void, glEvalCoord2fv, (const GLfloat * u))\nSDL_PROC_UNUSED(void, glEvalMesh1, (GLenum mode, GLint i1, GLint i2))\nSDL_PROC_UNUSED(void, glEvalMesh2,\n                (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2))\nSDL_PROC_UNUSED(void, glEvalPoint1, (GLint i))\nSDL_PROC_UNUSED(void, glEvalPoint2, (GLint i, GLint j))\nSDL_PROC_UNUSED(void, glFeedbackBuffer,\n                (GLsizei size, GLenum type, GLfloat * buffer))\nSDL_PROC_UNUSED(void, glFinish, (void))\nSDL_PROC_UNUSED(void, glFlush, (void))\nSDL_PROC_UNUSED(void, glFogf, (GLenum pname, GLfloat param))\nSDL_PROC_UNUSED(void, glFogfv, (GLenum pname, const GLfloat * params))\nSDL_PROC_UNUSED(void, glFogi, (GLenum pname, GLint param))\nSDL_PROC_UNUSED(void, glFogiv, (GLenum pname, const GLint * params))\nSDL_PROC_UNUSED(void, glFrontFace, (GLenum mode))\nSDL_PROC_UNUSED(void, glFrustum,\n                (GLdouble left, GLdouble right, GLdouble bottom,\n                 GLdouble top, GLdouble zNear, GLdouble zFar))\nSDL_PROC_UNUSED(GLuint, glGenLists, (GLsizei range))\nSDL_PROC(void, glGenTextures, (GLsizei n, GLuint * textures))\nSDL_PROC_UNUSED(void, glGetBooleanv, (GLenum pname, GLboolean * params))\nSDL_PROC_UNUSED(void, glGetClipPlane, (GLenum plane, GLdouble * equation))\nSDL_PROC_UNUSED(void, glGetDoublev, (GLenum pname, GLdouble * params))\nSDL_PROC(GLenum, glGetError, (void))\nSDL_PROC_UNUSED(void, glGetFloatv, (GLenum pname, GLfloat * params))\nSDL_PROC(void, glGetIntegerv, (GLenum pname, GLint * params))\nSDL_PROC_UNUSED(void, glGetLightfv,\n                (GLenum light, GLenum pname, GLfloat * params))\nSDL_PROC_UNUSED(void, glGetLightiv,\n                (GLenum light, GLenum pname, GLint * params))\nSDL_PROC_UNUSED(void, glGetMapdv, (GLenum target, GLenum query, GLdouble * v))\nSDL_PROC_UNUSED(void, glGetMapfv, (GLenum target, GLenum query, GLfloat * v))\nSDL_PROC_UNUSED(void, glGetMapiv, (GLenum target, GLenum query, GLint * v))\nSDL_PROC_UNUSED(void, glGetMaterialfv,\n                (GLenum face, GLenum pname, GLfloat * params))\nSDL_PROC_UNUSED(void, glGetMaterialiv,\n                (GLenum face, GLenum pname, GLint * params))\nSDL_PROC_UNUSED(void, glGetPixelMapfv, (GLenum map, GLfloat * values))\nSDL_PROC_UNUSED(void, glGetPixelMapuiv, (GLenum map, GLuint * values))\nSDL_PROC_UNUSED(void, glGetPixelMapusv, (GLenum map, GLushort * values))\nSDL_PROC(void, glGetPointerv, (GLenum pname, GLvoid * *params))\nSDL_PROC_UNUSED(void, glGetPolygonStipple, (GLubyte * mask))\nSDL_PROC(const GLubyte *, glGetString, (GLenum name))\nSDL_PROC_UNUSED(void, glGetTexEnvfv,\n                (GLenum target, GLenum pname, GLfloat * params))\nSDL_PROC_UNUSED(void, glGetTexEnviv,\n                (GLenum target, GLenum pname, GLint * params))\nSDL_PROC_UNUSED(void, glGetTexGendv,\n                (GLenum coord, GLenum pname, GLdouble * params))\nSDL_PROC_UNUSED(void, glGetTexGenfv,\n                (GLenum coord, GLenum pname, GLfloat * params))\nSDL_PROC_UNUSED(void, glGetTexGeniv,\n                (GLenum coord, GLenum pname, GLint * params))\nSDL_PROC_UNUSED(void, glGetTexImage,\n                (GLenum target, GLint level, GLenum format, GLenum type,\n                 GLvoid * pixels))\nSDL_PROC_UNUSED(void, glGetTexLevelParameterfv,\n                (GLenum target, GLint level, GLenum pname, GLfloat * params))\nSDL_PROC_UNUSED(void, glGetTexLevelParameteriv,\n                (GLenum target, GLint level, GLenum pname, GLint * params))\nSDL_PROC_UNUSED(void, glGetTexParameterfv,\n                (GLenum target, GLenum pname, GLfloat * params))\nSDL_PROC_UNUSED(void, glGetTexParameteriv,\n                (GLenum target, GLenum pname, GLint * params))\nSDL_PROC_UNUSED(void, glHint, (GLenum target, GLenum mode))\nSDL_PROC_UNUSED(void, glIndexMask, (GLuint mask))\nSDL_PROC_UNUSED(void, glIndexPointer,\n                (GLenum type, GLsizei stride, const GLvoid * pointer))\nSDL_PROC_UNUSED(void, glIndexd, (GLdouble c))\nSDL_PROC_UNUSED(void, glIndexdv, (const GLdouble * c))\nSDL_PROC_UNUSED(void, glIndexf, (GLfloat c))\nSDL_PROC_UNUSED(void, glIndexfv, (const GLfloat * c))\nSDL_PROC_UNUSED(void, glIndexi, (GLint c))\nSDL_PROC_UNUSED(void, glIndexiv, (const GLint * c))\nSDL_PROC_UNUSED(void, glIndexs, (GLshort c))\nSDL_PROC_UNUSED(void, glIndexsv, (const GLshort * c))\nSDL_PROC_UNUSED(void, glIndexub, (GLubyte c))\nSDL_PROC_UNUSED(void, glIndexubv, (const GLubyte * c))\nSDL_PROC_UNUSED(void, glInitNames, (void))\nSDL_PROC_UNUSED(void, glInterleavedArrays,\n                (GLenum format, GLsizei stride, const GLvoid * pointer))\nSDL_PROC_UNUSED(GLboolean, glIsEnabled, (GLenum cap))\nSDL_PROC_UNUSED(GLboolean, glIsList, (GLuint list))\nSDL_PROC_UNUSED(GLboolean, glIsTexture, (GLuint texture))\nSDL_PROC_UNUSED(void, glLightModelf, (GLenum pname, GLfloat param))\nSDL_PROC_UNUSED(void, glLightModelfv, (GLenum pname, const GLfloat * params))\nSDL_PROC_UNUSED(void, glLightModeli, (GLenum pname, GLint param))\nSDL_PROC_UNUSED(void, glLightModeliv, (GLenum pname, const GLint * params))\nSDL_PROC_UNUSED(void, glLightf, (GLenum light, GLenum pname, GLfloat param))\nSDL_PROC_UNUSED(void, glLightfv,\n                (GLenum light, GLenum pname, const GLfloat * params))\nSDL_PROC_UNUSED(void, glLighti, (GLenum light, GLenum pname, GLint param))\nSDL_PROC_UNUSED(void, glLightiv,\n                (GLenum light, GLenum pname, const GLint * params))\nSDL_PROC_UNUSED(void, glLineStipple, (GLint factor, GLushort pattern))\nSDL_PROC(void, glLineWidth, (GLfloat width))\nSDL_PROC_UNUSED(void, glListBase, (GLuint base))\nSDL_PROC(void, glLoadIdentity, (void))\nSDL_PROC_UNUSED(void, glLoadMatrixd, (const GLdouble * m))\nSDL_PROC_UNUSED(void, glLoadMatrixf, (const GLfloat * m))\nSDL_PROC_UNUSED(void, glLoadName, (GLuint name))\nSDL_PROC_UNUSED(void, glLogicOp, (GLenum opcode))\nSDL_PROC_UNUSED(void, glMap1d,\n                (GLenum target, GLdouble u1, GLdouble u2, GLint stride,\n                 GLint order, const GLdouble * points))\nSDL_PROC_UNUSED(void, glMap1f,\n                (GLenum target, GLfloat u1, GLfloat u2, GLint stride,\n                 GLint order, const GLfloat * points))\nSDL_PROC_UNUSED(void, glMap2d,\n                (GLenum target, GLdouble u1, GLdouble u2, GLint ustride,\n                 GLint uorder, GLdouble v1, GLdouble v2, GLint vstride,\n                 GLint vorder, const GLdouble * points))\nSDL_PROC_UNUSED(void, glMap2f,\n                (GLenum target, GLfloat u1, GLfloat u2, GLint ustride,\n                 GLint uorder, GLfloat v1, GLfloat v2, GLint vstride,\n                 GLint vorder, const GLfloat * points))\nSDL_PROC_UNUSED(void, glMapGrid1d, (GLint un, GLdouble u1, GLdouble u2))\nSDL_PROC_UNUSED(void, glMapGrid1f, (GLint un, GLfloat u1, GLfloat u2))\nSDL_PROC_UNUSED(void, glMapGrid2d,\n                (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1,\n                 GLdouble v2))\nSDL_PROC_UNUSED(void, glMapGrid2f,\n                (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1,\n                 GLfloat v2))\nSDL_PROC_UNUSED(void, glMaterialf, (GLenum face, GLenum pname, GLfloat param))\nSDL_PROC_UNUSED(void, glMaterialfv,\n                (GLenum face, GLenum pname, const GLfloat * params))\nSDL_PROC_UNUSED(void, glMateriali, (GLenum face, GLenum pname, GLint param))\nSDL_PROC_UNUSED(void, glMaterialiv,\n                (GLenum face, GLenum pname, const GLint * params))\nSDL_PROC(void, glMatrixMode, (GLenum mode))\nSDL_PROC_UNUSED(void, glMultMatrixd, (const GLdouble * m))\nSDL_PROC_UNUSED(void, glMultMatrixf, (const GLfloat * m))\nSDL_PROC_UNUSED(void, glNewList, (GLuint list, GLenum mode))\nSDL_PROC_UNUSED(void, glNormal3b, (GLbyte nx, GLbyte ny, GLbyte nz))\nSDL_PROC_UNUSED(void, glNormal3bv, (const GLbyte * v))\nSDL_PROC_UNUSED(void, glNormal3d, (GLdouble nx, GLdouble ny, GLdouble nz))\nSDL_PROC_UNUSED(void, glNormal3dv, (const GLdouble * v))\nSDL_PROC_UNUSED(void, glNormal3f, (GLfloat nx, GLfloat ny, GLfloat nz))\nSDL_PROC_UNUSED(void, glNormal3fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glNormal3i, (GLint nx, GLint ny, GLint nz))\nSDL_PROC_UNUSED(void, glNormal3iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glNormal3s, (GLshort nx, GLshort ny, GLshort nz))\nSDL_PROC_UNUSED(void, glNormal3sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glNormalPointer,\n                (GLenum type, GLsizei stride, const GLvoid * pointer))\nSDL_PROC(void, glOrtho,\n         (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top,\n          GLdouble zNear, GLdouble zFar))\nSDL_PROC_UNUSED(void, glPassThrough, (GLfloat token))\nSDL_PROC_UNUSED(void, glPixelMapfv,\n                (GLenum map, GLsizei mapsize, const GLfloat * values))\nSDL_PROC_UNUSED(void, glPixelMapuiv,\n                (GLenum map, GLsizei mapsize, const GLuint * values))\nSDL_PROC_UNUSED(void, glPixelMapusv,\n                (GLenum map, GLsizei mapsize, const GLushort * values))\nSDL_PROC_UNUSED(void, glPixelStoref, (GLenum pname, GLfloat param))\nSDL_PROC(void, glPixelStorei, (GLenum pname, GLint param))\nSDL_PROC_UNUSED(void, glPixelTransferf, (GLenum pname, GLfloat param))\nSDL_PROC_UNUSED(void, glPixelTransferi, (GLenum pname, GLint param))\nSDL_PROC_UNUSED(void, glPixelZoom, (GLfloat xfactor, GLfloat yfactor))\nSDL_PROC(void, glPointSize, (GLfloat size))\nSDL_PROC_UNUSED(void, glPolygonMode, (GLenum face, GLenum mode))\nSDL_PROC_UNUSED(void, glPolygonOffset, (GLfloat factor, GLfloat units))\nSDL_PROC_UNUSED(void, glPolygonStipple, (const GLubyte * mask))\nSDL_PROC_UNUSED(void, glPopAttrib, (void))\nSDL_PROC_UNUSED(void, glPopClientAttrib, (void))\nSDL_PROC(void, glPopMatrix, (void))\nSDL_PROC_UNUSED(void, glPopName, (void))\nSDL_PROC_UNUSED(void, glPrioritizeTextures,\n                (GLsizei n, const GLuint * textures,\n                 const GLclampf * priorities))\nSDL_PROC_UNUSED(void, glPushAttrib, (GLbitfield mask))\nSDL_PROC_UNUSED(void, glPushClientAttrib, (GLbitfield mask))\nSDL_PROC(void, glPushMatrix, (void))\nSDL_PROC_UNUSED(void, glPushName, (GLuint name))\nSDL_PROC_UNUSED(void, glRasterPos2d, (GLdouble x, GLdouble y))\nSDL_PROC_UNUSED(void, glRasterPos2dv, (const GLdouble * v))\nSDL_PROC_UNUSED(void, glRasterPos2f, (GLfloat x, GLfloat y))\nSDL_PROC_UNUSED(void, glRasterPos2fv, (const GLfloat * v))\nSDL_PROC(void, glRasterPos2i, (GLint x, GLint y))\nSDL_PROC_UNUSED(void, glRasterPos2iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glRasterPos2s, (GLshort x, GLshort y))\nSDL_PROC_UNUSED(void, glRasterPos2sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glRasterPos3d, (GLdouble x, GLdouble y, GLdouble z))\nSDL_PROC_UNUSED(void, glRasterPos3dv, (const GLdouble * v))\nSDL_PROC_UNUSED(void, glRasterPos3f, (GLfloat x, GLfloat y, GLfloat z))\nSDL_PROC_UNUSED(void, glRasterPos3fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glRasterPos3i, (GLint x, GLint y, GLint z))\nSDL_PROC_UNUSED(void, glRasterPos3iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glRasterPos3s, (GLshort x, GLshort y, GLshort z))\nSDL_PROC_UNUSED(void, glRasterPos3sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glRasterPos4d,\n                (GLdouble x, GLdouble y, GLdouble z, GLdouble w))\nSDL_PROC_UNUSED(void, glRasterPos4dv, (const GLdouble * v))\nSDL_PROC_UNUSED(void, glRasterPos4f,\n                (GLfloat x, GLfloat y, GLfloat z, GLfloat w))\nSDL_PROC_UNUSED(void, glRasterPos4fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glRasterPos4i, (GLint x, GLint y, GLint z, GLint w))\nSDL_PROC_UNUSED(void, glRasterPos4iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glRasterPos4s,\n                (GLshort x, GLshort y, GLshort z, GLshort w))\nSDL_PROC_UNUSED(void, glRasterPos4sv, (const GLshort * v))\nSDL_PROC(void, glReadBuffer, (GLenum mode))\nSDL_PROC(void, glReadPixels,\n         (GLint x, GLint y, GLsizei width, GLsizei height,\n          GLenum format, GLenum type, GLvoid * pixels))\nSDL_PROC_UNUSED(void, glRectd,\n                (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2))\nSDL_PROC_UNUSED(void, glRectdv, (const GLdouble * v1, const GLdouble * v2))\nSDL_PROC(void, glRectf,\n                (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2))\nSDL_PROC_UNUSED(void, glRectfv, (const GLfloat * v1, const GLfloat * v2))\nSDL_PROC_UNUSED(void, glRecti, (GLint x1, GLint y1, GLint x2, GLint y2))\nSDL_PROC_UNUSED(void, glRectiv, (const GLint * v1, const GLint * v2))\nSDL_PROC_UNUSED(void, glRects,\n                (GLshort x1, GLshort y1, GLshort x2, GLshort y2))\nSDL_PROC_UNUSED(void, glRectsv, (const GLshort * v1, const GLshort * v2))\nSDL_PROC_UNUSED(GLint, glRenderMode, (GLenum mode))\nSDL_PROC(void, glRotated,\n                (GLdouble angle, GLdouble x, GLdouble y, GLdouble z))\nSDL_PROC(void, glRotatef,\n                (GLfloat angle, GLfloat x, GLfloat y, GLfloat z))\nSDL_PROC_UNUSED(void, glScaled, (GLdouble x, GLdouble y, GLdouble z))\nSDL_PROC_UNUSED(void, glScalef, (GLfloat x, GLfloat y, GLfloat z))\nSDL_PROC(void, glScissor, (GLint x, GLint y, GLsizei width, GLsizei height))\nSDL_PROC_UNUSED(void, glSelectBuffer, (GLsizei size, GLuint * buffer))\nSDL_PROC(void, glShadeModel, (GLenum mode))\nSDL_PROC_UNUSED(void, glStencilFunc, (GLenum func, GLint ref, GLuint mask))\nSDL_PROC_UNUSED(void, glStencilMask, (GLuint mask))\nSDL_PROC_UNUSED(void, glStencilOp, (GLenum fail, GLenum zfail, GLenum zpass))\nSDL_PROC_UNUSED(void, glTexCoord1d, (GLdouble s))\nSDL_PROC_UNUSED(void, glTexCoord1dv, (const GLdouble * v))\nSDL_PROC_UNUSED(void, glTexCoord1f, (GLfloat s))\nSDL_PROC_UNUSED(void, glTexCoord1fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glTexCoord1i, (GLint s))\nSDL_PROC_UNUSED(void, glTexCoord1iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glTexCoord1s, (GLshort s))\nSDL_PROC_UNUSED(void, glTexCoord1sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glTexCoord2d, (GLdouble s, GLdouble t))\nSDL_PROC_UNUSED(void, glTexCoord2dv, (const GLdouble * v))\nSDL_PROC(void, glTexCoord2f, (GLfloat s, GLfloat t))\nSDL_PROC_UNUSED(void, glTexCoord2fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glTexCoord2i, (GLint s, GLint t))\nSDL_PROC_UNUSED(void, glTexCoord2iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glTexCoord2s, (GLshort s, GLshort t))\nSDL_PROC_UNUSED(void, glTexCoord2sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glTexCoord3d, (GLdouble s, GLdouble t, GLdouble r))\nSDL_PROC_UNUSED(void, glTexCoord3dv, (const GLdouble * v))\nSDL_PROC_UNUSED(void, glTexCoord3f, (GLfloat s, GLfloat t, GLfloat r))\nSDL_PROC_UNUSED(void, glTexCoord3fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glTexCoord3i, (GLint s, GLint t, GLint r))\nSDL_PROC_UNUSED(void, glTexCoord3iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glTexCoord3s, (GLshort s, GLshort t, GLshort r))\nSDL_PROC_UNUSED(void, glTexCoord3sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glTexCoord4d,\n                (GLdouble s, GLdouble t, GLdouble r, GLdouble q))\nSDL_PROC_UNUSED(void, glTexCoord4dv, (const GLdouble * v))\nSDL_PROC_UNUSED(void, glTexCoord4f,\n                (GLfloat s, GLfloat t, GLfloat r, GLfloat q))\nSDL_PROC_UNUSED(void, glTexCoord4fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glTexCoord4i, (GLint s, GLint t, GLint r, GLint q))\nSDL_PROC_UNUSED(void, glTexCoord4iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glTexCoord4s,\n                (GLshort s, GLshort t, GLshort r, GLshort q))\nSDL_PROC_UNUSED(void, glTexCoord4sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glTexCoordPointer,\n                (GLint size, GLenum type, GLsizei stride,\n                 const GLvoid * pointer))\nSDL_PROC(void, glTexEnvf, (GLenum target, GLenum pname, GLfloat param))\nSDL_PROC_UNUSED(void, glTexEnvfv,\n                (GLenum target, GLenum pname, const GLfloat * params))\nSDL_PROC_UNUSED(void, glTexEnvi, (GLenum target, GLenum pname, GLint param))\nSDL_PROC_UNUSED(void, glTexEnviv,\n                (GLenum target, GLenum pname, const GLint * params))\nSDL_PROC_UNUSED(void, glTexGend, (GLenum coord, GLenum pname, GLdouble param))\nSDL_PROC_UNUSED(void, glTexGendv,\n                (GLenum coord, GLenum pname, const GLdouble * params))\nSDL_PROC_UNUSED(void, glTexGenf, (GLenum coord, GLenum pname, GLfloat param))\nSDL_PROC_UNUSED(void, glTexGenfv,\n                (GLenum coord, GLenum pname, const GLfloat * params))\nSDL_PROC_UNUSED(void, glTexGeni, (GLenum coord, GLenum pname, GLint param))\nSDL_PROC_UNUSED(void, glTexGeniv,\n                (GLenum coord, GLenum pname, const GLint * params))\nSDL_PROC_UNUSED(void, glTexImage1D,\n                (GLenum target, GLint level, GLint internalformat,\n                 GLsizei width, GLint border, GLenum format, GLenum type,\n                 const GLvoid * pixels))\nSDL_PROC(void, glTexImage2D,\n         (GLenum target, GLint level, GLint internalformat, GLsizei width,\n          GLsizei height, GLint border, GLenum format, GLenum type,\n          const GLvoid * pixels))\nSDL_PROC_UNUSED(void, glTexParameterf,\n                (GLenum target, GLenum pname, GLfloat param))\nSDL_PROC_UNUSED(void, glTexParameterfv,\n                (GLenum target, GLenum pname, const GLfloat * params))\nSDL_PROC(void, glTexParameteri, (GLenum target, GLenum pname, GLint param))\nSDL_PROC_UNUSED(void, glTexParameteriv,\n                (GLenum target, GLenum pname, const GLint * params))\nSDL_PROC_UNUSED(void, glTexSubImage1D,\n                (GLenum target, GLint level, GLint xoffset, GLsizei width,\n                 GLenum format, GLenum type, const GLvoid * pixels))\nSDL_PROC(void, glTexSubImage2D,\n         (GLenum target, GLint level, GLint xoffset, GLint yoffset,\n          GLsizei width, GLsizei height, GLenum format, GLenum type,\n          const GLvoid * pixels))\nSDL_PROC_UNUSED(void, glTranslated, (GLdouble x, GLdouble y, GLdouble z))\nSDL_PROC(void, glTranslatef, (GLfloat x, GLfloat y, GLfloat z))\nSDL_PROC_UNUSED(void, glVertex2d, (GLdouble x, GLdouble y))\nSDL_PROC_UNUSED(void, glVertex2dv, (const GLdouble * v))\nSDL_PROC(void, glVertex2f, (GLfloat x, GLfloat y))\nSDL_PROC_UNUSED(void, glVertex2fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glVertex2i, (GLint x, GLint y))\nSDL_PROC_UNUSED(void, glVertex2iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glVertex2s, (GLshort x, GLshort y))\nSDL_PROC_UNUSED(void, glVertex2sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glVertex3d, (GLdouble x, GLdouble y, GLdouble z))\nSDL_PROC_UNUSED(void, glVertex3dv, (const GLdouble * v))\nSDL_PROC_UNUSED(void, glVertex3f, (GLfloat x, GLfloat y, GLfloat z))\nSDL_PROC(void, glVertex3fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glVertex3i, (GLint x, GLint y, GLint z))\nSDL_PROC_UNUSED(void, glVertex3iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glVertex3s, (GLshort x, GLshort y, GLshort z))\nSDL_PROC_UNUSED(void, glVertex3sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glVertex4d,\n                (GLdouble x, GLdouble y, GLdouble z, GLdouble w))\nSDL_PROC_UNUSED(void, glVertex4dv, (const GLdouble * v))\nSDL_PROC_UNUSED(void, glVertex4f,\n                (GLfloat x, GLfloat y, GLfloat z, GLfloat w))\nSDL_PROC_UNUSED(void, glVertex4fv, (const GLfloat * v))\nSDL_PROC_UNUSED(void, glVertex4i, (GLint x, GLint y, GLint z, GLint w))\nSDL_PROC_UNUSED(void, glVertex4iv, (const GLint * v))\nSDL_PROC_UNUSED(void, glVertex4s,\n                (GLshort x, GLshort y, GLshort z, GLshort w))\nSDL_PROC_UNUSED(void, glVertex4sv, (const GLshort * v))\nSDL_PROC_UNUSED(void, glVertexPointer,\n                (GLint size, GLenum type, GLsizei stride,\n                 const GLvoid * pointer))\nSDL_PROC(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height))\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/opengl/SDL_render_gl.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED\n\n#include \"SDL_hints.h\"\n#include \"SDL_log.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_opengl.h\"\n#include \"../SDL_sysrender.h\"\n#include \"SDL_shaders_gl.h\"\n\n#ifdef __MACOSX__\n#include <OpenGL/OpenGL.h>\n#endif\n\n/* To prevent unnecessary window recreation, \n * these should match the defaults selected in SDL_GL_ResetAttributes \n */\n\n#define RENDERER_CONTEXT_MAJOR 2\n#define RENDERER_CONTEXT_MINOR 1\n\n/* OpenGL renderer implementation */\n\n/* Details on optimizing the texture path on Mac OS X:\n   http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html\n*/\n\n/* Used to re-create the window with OpenGL capability */\nextern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);\n\nstatic const float inv255f = 1.0f / 255.0f;\n\nstatic SDL_Renderer *GL_CreateRenderer(SDL_Window * window, Uint32 flags);\nstatic void GL_WindowEvent(SDL_Renderer * renderer,\n                           const SDL_WindowEvent *event);\nstatic int GL_GetOutputSize(SDL_Renderer * renderer, int *w, int *h);\nstatic int GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic int GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                            const SDL_Rect * rect, const void *pixels,\n                            int pitch);\nstatic int GL_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,\n                               const SDL_Rect * rect,\n                               const Uint8 *Yplane, int Ypitch,\n                               const Uint8 *Uplane, int Upitch,\n                               const Uint8 *Vplane, int Vpitch);\nstatic int GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                          const SDL_Rect * rect, void **pixels, int *pitch);\nstatic void GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic int GL_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic int GL_UpdateViewport(SDL_Renderer * renderer);\nstatic int GL_UpdateClipRect(SDL_Renderer * renderer);\nstatic int GL_RenderClear(SDL_Renderer * renderer);\nstatic int GL_RenderDrawPoints(SDL_Renderer * renderer,\n                               const SDL_FPoint * points, int count);\nstatic int GL_RenderDrawLines(SDL_Renderer * renderer,\n                              const SDL_FPoint * points, int count);\nstatic int GL_RenderFillRects(SDL_Renderer * renderer,\n                              const SDL_FRect * rects, int count);\nstatic int GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,\n                         const SDL_Rect * srcrect, const SDL_FRect * dstrect);\nstatic int GL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n                         const SDL_Rect * srcrect, const SDL_FRect * dstrect,\n                         const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);\nstatic int GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                               Uint32 pixel_format, void * pixels, int pitch);\nstatic void GL_RenderPresent(SDL_Renderer * renderer);\nstatic void GL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic void GL_DestroyRenderer(SDL_Renderer * renderer);\nstatic int GL_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh);\nstatic int GL_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture);\n\nSDL_RenderDriver GL_RenderDriver = {\n    GL_CreateRenderer,\n    {\n     \"opengl\",\n     (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),\n     1,\n     {SDL_PIXELFORMAT_ARGB8888},\n     0,\n     0}\n};\n\ntypedef struct GL_FBOList GL_FBOList;\n\nstruct GL_FBOList\n{\n    Uint32 w, h;\n    GLuint FBO;\n    GL_FBOList *next;\n};\n\ntypedef struct\n{\n    SDL_GLContext context;\n\n    SDL_bool debug_enabled;\n    SDL_bool GL_ARB_debug_output_supported;\n    int errors;\n    char **error_messages;\n    GLDEBUGPROCARB next_error_callback;\n    GLvoid *next_error_userparam;\n\n    SDL_bool GL_ARB_texture_non_power_of_two_supported;\n    SDL_bool GL_ARB_texture_rectangle_supported;\n    struct {\n        GL_Shader shader;\n        Uint32 color;\n        int blendMode;\n    } current;\n\n    SDL_bool GL_EXT_framebuffer_object_supported;\n    GL_FBOList *framebuffers;\n\n    /* OpenGL functions */\n#define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;\n#include \"SDL_glfuncs.h\"\n#undef SDL_PROC\n\n    /* Multitexture support */\n    SDL_bool GL_ARB_multitexture_supported;\n    PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;\n    GLint num_texture_units;\n\n    PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;\n    PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;\n    PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;\n    PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;\n    PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;\n\n    /* Shader support */\n    GL_ShaderContext *shaders;\n\n} GL_RenderData;\n\ntypedef struct\n{\n    GLuint texture;\n    GLenum type;\n    GLfloat texw;\n    GLfloat texh;\n    GLenum format;\n    GLenum formattype;\n    void *pixels;\n    int pitch;\n    SDL_Rect locked_rect;\n\n    /* YUV texture support */\n    SDL_bool yuv;\n    SDL_bool nv12;\n    GLuint utexture;\n    GLuint vtexture;\n\n    GL_FBOList *fbo;\n} GL_TextureData;\n\nSDL_FORCE_INLINE const char*\nGL_TranslateError (GLenum error)\n{\n#define GL_ERROR_TRANSLATE(e) case e: return #e;\n    switch (error) {\n    GL_ERROR_TRANSLATE(GL_INVALID_ENUM)\n    GL_ERROR_TRANSLATE(GL_INVALID_VALUE)\n    GL_ERROR_TRANSLATE(GL_INVALID_OPERATION)\n    GL_ERROR_TRANSLATE(GL_OUT_OF_MEMORY)\n    GL_ERROR_TRANSLATE(GL_NO_ERROR)\n    GL_ERROR_TRANSLATE(GL_STACK_OVERFLOW)\n    GL_ERROR_TRANSLATE(GL_STACK_UNDERFLOW)\n    GL_ERROR_TRANSLATE(GL_TABLE_TOO_LARGE)\n    default:\n        return \"UNKNOWN\";\n}\n#undef GL_ERROR_TRANSLATE\n}\n\nSDL_FORCE_INLINE void\nGL_ClearErrors(SDL_Renderer *renderer)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n\n    if (!data->debug_enabled)\n    {\n        return;\n    }\n    if (data->GL_ARB_debug_output_supported) {\n        if (data->errors) {\n            int i;\n            for (i = 0; i < data->errors; ++i) {\n                SDL_free(data->error_messages[i]);\n            }\n            SDL_free(data->error_messages);\n\n            data->errors = 0;\n            data->error_messages = NULL;\n        }\n    } else {\n        while (data->glGetError() != GL_NO_ERROR) {\n            continue;\n        }\n    }\n}\n\nSDL_FORCE_INLINE int\nGL_CheckAllErrors (const char *prefix, SDL_Renderer *renderer, const char *file, int line, const char *function)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    int ret = 0;\n\n    if (!data->debug_enabled)\n    {\n        return 0;\n    }\n    if (data->GL_ARB_debug_output_supported) {\n        if (data->errors) {\n            int i;\n            for (i = 0; i < data->errors; ++i) {\n                SDL_SetError(\"%s: %s (%d): %s %s\", prefix, file, line, function, data->error_messages[i]);\n                ret = -1;\n            }\n            GL_ClearErrors(renderer);\n        }\n    } else {\n        /* check gl errors (can return multiple errors) */\n        for (;;) {\n            GLenum error = data->glGetError();\n            if (error != GL_NO_ERROR) {\n                if (prefix == NULL || prefix[0] == '\\0') {\n                    prefix = \"generic\";\n                }\n                SDL_SetError(\"%s: %s (%d): %s %s (0x%X)\", prefix, file, line, function, GL_TranslateError(error), error);\n                ret = -1;\n            } else {\n                break;\n            }\n        }\n    }\n    return ret;\n}\n\n#if 0\n#define GL_CheckError(prefix, renderer)\n#elif defined(_MSC_VER)\n#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __FUNCTION__)\n#else\n#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __PRETTY_FUNCTION__)\n#endif\n\nstatic int\nGL_LoadFunctions(GL_RenderData * data)\n{\n#ifdef __SDL_NOGETPROCADDR__\n#define SDL_PROC(ret,func,params) data->func=func;\n#else\n#define SDL_PROC(ret,func,params) \\\n    do { \\\n        data->func = SDL_GL_GetProcAddress(#func); \\\n        if ( ! data->func ) { \\\n            return SDL_SetError(\"Couldn't load GL function %s: %s\\n\", #func, SDL_GetError()); \\\n        } \\\n    } while ( 0 );\n#endif /* __SDL_NOGETPROCADDR__ */\n\n#include \"SDL_glfuncs.h\"\n#undef SDL_PROC\n    return 0;\n}\n\nstatic SDL_GLContext SDL_CurrentContext = NULL;\n\nstatic int\nGL_ActivateRenderer(SDL_Renderer * renderer)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n\n    if (SDL_CurrentContext != data->context ||\n        SDL_GL_GetCurrentContext() != data->context) {\n        if (SDL_GL_MakeCurrent(renderer->window, data->context) < 0) {\n            return -1;\n        }\n        SDL_CurrentContext = data->context;\n\n        GL_UpdateViewport(renderer);\n    }\n\n    GL_ClearErrors(renderer);\n\n    return 0;\n}\n\n/* This is called if we need to invalidate all of the SDL OpenGL state */\nstatic void\nGL_ResetState(SDL_Renderer *renderer)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n\n    if (SDL_GL_GetCurrentContext() == data->context) {\n        GL_UpdateViewport(renderer);\n    } else {\n        GL_ActivateRenderer(renderer);\n    }\n\n    data->current.shader = SHADER_NONE;\n    data->current.color = 0;\n    data->current.blendMode = -1;\n\n    data->glDisable(GL_DEPTH_TEST);\n    data->glDisable(GL_CULL_FACE);\n    /* This ended up causing video discrepancies between OpenGL and Direct3D */\n    /* data->glEnable(GL_LINE_SMOOTH); */\n\n    data->glMatrixMode(GL_MODELVIEW);\n    data->glLoadIdentity();\n\n    GL_CheckError(\"\", renderer);\n}\n\nstatic void APIENTRY\nGL_HandleDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char *message, const void *userParam)\n{\n    SDL_Renderer *renderer = (SDL_Renderer *) userParam;\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n\n    if (type == GL_DEBUG_TYPE_ERROR_ARB) {\n        /* Record this error */\n        int errors = data->errors + 1;\n        char **error_messages = SDL_realloc(data->error_messages, errors * sizeof(*data->error_messages));\n        if (error_messages) {\n            data->errors = errors;\n            data->error_messages = error_messages;\n            data->error_messages[data->errors-1] = SDL_strdup(message);\n        }\n    }\n\n    /* If there's another error callback, pass it along, otherwise log it */\n    if (data->next_error_callback) {\n        data->next_error_callback(source, type, id, severity, length, message, data->next_error_userparam);\n    } else {\n        if (type == GL_DEBUG_TYPE_ERROR_ARB) {\n            SDL_LogError(SDL_LOG_CATEGORY_RENDER, \"%s\", message);\n        } else {\n            SDL_LogDebug(SDL_LOG_CATEGORY_RENDER, \"%s\", message);\n        }\n    }\n}\n\nstatic GL_FBOList *\nGL_GetFBO(GL_RenderData *data, Uint32 w, Uint32 h)\n{\n    GL_FBOList *result = data->framebuffers;\n\n    while (result && ((result->w != w) || (result->h != h))) {\n        result = result->next;\n    }\n\n    if (!result) {\n        result = SDL_malloc(sizeof(GL_FBOList));\n        if (result) {\n            result->w = w;\n            result->h = h;\n            data->glGenFramebuffersEXT(1, &result->FBO);\n            result->next = data->framebuffers;\n            data->framebuffers = result;\n        }\n    }\n    return result;\n}\n\nSDL_Renderer *\nGL_CreateRenderer(SDL_Window * window, Uint32 flags)\n{\n    SDL_Renderer *renderer;\n    GL_RenderData *data;\n    GLint value;\n    Uint32 window_flags;\n    int profile_mask = 0, major = 0, minor = 0;\n    SDL_bool changed_window = SDL_FALSE;\n\n    SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask);\n    SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major);\n    SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor);\n    \n    window_flags = SDL_GetWindowFlags(window);\n    if (!(window_flags & SDL_WINDOW_OPENGL) ||\n        profile_mask == SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) {\n\n        changed_window = SDL_TRUE;\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, RENDERER_CONTEXT_MAJOR);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, RENDERER_CONTEXT_MINOR);\n\n        if (SDL_RecreateWindow(window, window_flags | SDL_WINDOW_OPENGL) < 0) {\n            goto error;\n        }\n    }\n\n    renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));\n    if (!renderer) {\n        SDL_OutOfMemory();\n        goto error;\n    }\n\n    data = (GL_RenderData *) SDL_calloc(1, sizeof(*data));\n    if (!data) {\n        GL_DestroyRenderer(renderer);\n        SDL_OutOfMemory();\n        goto error;\n    }\n\n    renderer->WindowEvent = GL_WindowEvent;\n    renderer->GetOutputSize = GL_GetOutputSize;\n    renderer->CreateTexture = GL_CreateTexture;\n    renderer->UpdateTexture = GL_UpdateTexture;\n    renderer->UpdateTextureYUV = GL_UpdateTextureYUV;\n    renderer->LockTexture = GL_LockTexture;\n    renderer->UnlockTexture = GL_UnlockTexture;\n    renderer->SetRenderTarget = GL_SetRenderTarget;\n    renderer->UpdateViewport = GL_UpdateViewport;\n    renderer->UpdateClipRect = GL_UpdateClipRect;\n    renderer->RenderClear = GL_RenderClear;\n    renderer->RenderDrawPoints = GL_RenderDrawPoints;\n    renderer->RenderDrawLines = GL_RenderDrawLines;\n    renderer->RenderFillRects = GL_RenderFillRects;\n    renderer->RenderCopy = GL_RenderCopy;\n    renderer->RenderCopyEx = GL_RenderCopyEx;\n    renderer->RenderReadPixels = GL_RenderReadPixels;\n    renderer->RenderPresent = GL_RenderPresent;\n    renderer->DestroyTexture = GL_DestroyTexture;\n    renderer->DestroyRenderer = GL_DestroyRenderer;\n    renderer->GL_BindTexture = GL_BindTexture;\n    renderer->GL_UnbindTexture = GL_UnbindTexture;\n    renderer->info = GL_RenderDriver.info;\n    renderer->info.flags = SDL_RENDERER_ACCELERATED;\n    renderer->driverdata = data;\n    renderer->window = window;\n\n    data->context = SDL_GL_CreateContext(window);\n    if (!data->context) {\n        GL_DestroyRenderer(renderer);\n        goto error;\n    }\n    if (SDL_GL_MakeCurrent(window, data->context) < 0) {\n        GL_DestroyRenderer(renderer);\n        goto error;\n    }\n\n    if (GL_LoadFunctions(data) < 0) {\n        GL_DestroyRenderer(renderer);\n        goto error;\n    }\n\n#ifdef __MACOSX__\n    /* Enable multi-threaded rendering */\n    /* Disabled until Ryan finishes his VBO/PBO code...\n       CGLEnable(CGLGetCurrentContext(), kCGLCEMPEngine);\n     */\n#endif\n\n    if (flags & SDL_RENDERER_PRESENTVSYNC) {\n        SDL_GL_SetSwapInterval(1);\n    } else {\n        SDL_GL_SetSwapInterval(0);\n    }\n    if (SDL_GL_GetSwapInterval() > 0) {\n        renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;\n    }\n\n    /* Check for debug output support */\n    if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_FLAGS, &value) == 0 &&\n        (value & SDL_GL_CONTEXT_DEBUG_FLAG)) {\n        data->debug_enabled = SDL_TRUE;\n    }\n    if (data->debug_enabled && SDL_GL_ExtensionSupported(\"GL_ARB_debug_output\")) {\n        PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC) SDL_GL_GetProcAddress(\"glDebugMessageCallbackARB\");\n\n        data->GL_ARB_debug_output_supported = SDL_TRUE;\n        data->glGetPointerv(GL_DEBUG_CALLBACK_FUNCTION_ARB, (GLvoid **)&data->next_error_callback);\n        data->glGetPointerv(GL_DEBUG_CALLBACK_USER_PARAM_ARB, &data->next_error_userparam);\n        glDebugMessageCallbackARBFunc(GL_HandleDebugMessage, renderer);\n\n        /* Make sure our callback is called when errors actually happen */\n        data->glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);\n    }\n\n    if (SDL_GL_ExtensionSupported(\"GL_ARB_texture_non_power_of_two\")) {\n        data->GL_ARB_texture_non_power_of_two_supported = SDL_TRUE;\n    } else if (SDL_GL_ExtensionSupported(\"GL_ARB_texture_rectangle\") ||\n               SDL_GL_ExtensionSupported(\"GL_EXT_texture_rectangle\")) {\n        data->GL_ARB_texture_rectangle_supported = SDL_TRUE;\n    }\n    if (data->GL_ARB_texture_rectangle_supported) {\n        data->glGetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB, &value);\n        renderer->info.max_texture_width = value;\n        renderer->info.max_texture_height = value;\n    } else {\n        data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);\n        renderer->info.max_texture_width = value;\n        renderer->info.max_texture_height = value;\n    }\n\n    /* Check for multitexture support */\n    if (SDL_GL_ExtensionSupported(\"GL_ARB_multitexture\")) {\n        data->glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) SDL_GL_GetProcAddress(\"glActiveTextureARB\");\n        if (data->glActiveTextureARB) {\n            data->GL_ARB_multitexture_supported = SDL_TRUE;\n            data->glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &data->num_texture_units);\n        }\n    }\n\n    /* Check for shader support */\n    if (SDL_GetHintBoolean(SDL_HINT_RENDER_OPENGL_SHADERS, SDL_TRUE)) {\n        data->shaders = GL_CreateShaderContext();\n    }\n    SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, \"OpenGL shaders: %s\",\n                data->shaders ? \"ENABLED\" : \"DISABLED\");\n\n    /* We support YV12 textures using 3 textures and a shader */\n    if (data->shaders && data->num_texture_units >= 3) {\n        renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;\n        renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_IYUV;\n        renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV12;\n        renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV21;\n    }\n\n#ifdef __MACOSX__\n    renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_UYVY;\n#endif\n\n    if (SDL_GL_ExtensionSupported(\"GL_EXT_framebuffer_object\")) {\n        data->GL_EXT_framebuffer_object_supported = SDL_TRUE;\n        data->glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)\n            SDL_GL_GetProcAddress(\"glGenFramebuffersEXT\");\n        data->glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)\n            SDL_GL_GetProcAddress(\"glDeleteFramebuffersEXT\");\n        data->glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)\n            SDL_GL_GetProcAddress(\"glFramebufferTexture2DEXT\");\n        data->glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)\n            SDL_GL_GetProcAddress(\"glBindFramebufferEXT\");\n        data->glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)\n            SDL_GL_GetProcAddress(\"glCheckFramebufferStatusEXT\");\n        renderer->info.flags |= SDL_RENDERER_TARGETTEXTURE;\n    }\n    data->framebuffers = NULL;\n\n    /* Set up parameters for rendering */\n    GL_ResetState(renderer);\n\n    return renderer;\n\nerror:\n    if (changed_window) {\n        /* Uh oh, better try to put it back... */\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile_mask);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);\n        SDL_RecreateWindow(window, window_flags);\n    }\n    return NULL;\n}\n\nstatic void\nGL_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)\n{\n    if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED ||\n        event->event == SDL_WINDOWEVENT_SHOWN ||\n        event->event == SDL_WINDOWEVENT_HIDDEN) {\n        /* Rebind the context to the window area and update matrices */\n        SDL_CurrentContext = NULL;\n    }\n}\n\nstatic int\nGL_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)\n{\n    SDL_GL_GetDrawableSize(renderer->window, w, h);\n    return 0;\n}\n\nSDL_FORCE_INLINE int\npower_of_2(int input)\n{\n    int value = 1;\n\n    while (value < input) {\n        value <<= 1;\n    }\n    return value;\n}\n\nSDL_FORCE_INLINE SDL_bool\nconvert_format(GL_RenderData *renderdata, Uint32 pixel_format,\n               GLint* internalFormat, GLenum* format, GLenum* type)\n{\n    switch (pixel_format) {\n    case SDL_PIXELFORMAT_ARGB8888:\n        *internalFormat = GL_RGBA8;\n        *format = GL_BGRA;\n        *type = GL_UNSIGNED_INT_8_8_8_8_REV;\n        break;\n    case SDL_PIXELFORMAT_YV12:\n    case SDL_PIXELFORMAT_IYUV:\n    case SDL_PIXELFORMAT_NV12:\n    case SDL_PIXELFORMAT_NV21:\n        *internalFormat = GL_LUMINANCE;\n        *format = GL_LUMINANCE;\n        *type = GL_UNSIGNED_BYTE;\n        break;\n#ifdef __MACOSX__\n    case SDL_PIXELFORMAT_UYVY:\n        *internalFormat = GL_RGB8;\n        *format = GL_YCBCR_422_APPLE;\n        *type = GL_UNSIGNED_SHORT_8_8_APPLE;\n        break;\n#endif\n    default:\n        return SDL_FALSE;\n    }\n    return SDL_TRUE;\n}\n\nstatic GLenum\nGetScaleQuality(void)\n{\n    const char *hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY);\n\n    if (!hint || *hint == '0' || SDL_strcasecmp(hint, \"nearest\") == 0) {\n        return GL_NEAREST;\n    } else {\n        return GL_LINEAR;\n    }\n}\n\nstatic int\nGL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *data;\n    GLint internalFormat;\n    GLenum format, type;\n    int texture_w, texture_h;\n    GLenum scaleMode;\n\n    GL_ActivateRenderer(renderer);\n\n    if (texture->access == SDL_TEXTUREACCESS_TARGET &&\n        !renderdata->GL_EXT_framebuffer_object_supported) {\n        return SDL_SetError(\"Render targets not supported by OpenGL\");\n    }\n\n    if (!convert_format(renderdata, texture->format, &internalFormat,\n                        &format, &type)) {\n        return SDL_SetError(\"Texture format %s not supported by OpenGL\",\n                            SDL_GetPixelFormatName(texture->format));\n    }\n\n    data = (GL_TextureData *) SDL_calloc(1, sizeof(*data));\n    if (!data) {\n        return SDL_OutOfMemory();\n    }\n\n    if (texture->access == SDL_TEXTUREACCESS_STREAMING) {\n        size_t size;\n        data->pitch = texture->w * SDL_BYTESPERPIXEL(texture->format);\n        size = texture->h * data->pitch;\n        if (texture->format == SDL_PIXELFORMAT_YV12 ||\n            texture->format == SDL_PIXELFORMAT_IYUV) {\n            /* Need to add size for the U and V planes */\n            size += (2 * (texture->h * data->pitch) / 4);\n        }\n        if (texture->format == SDL_PIXELFORMAT_NV12 ||\n            texture->format == SDL_PIXELFORMAT_NV21) {\n            /* Need to add size for the U/V plane */\n            size += ((texture->h * data->pitch) / 2);\n        }\n        data->pixels = SDL_calloc(1, size);\n        if (!data->pixels) {\n            SDL_free(data);\n            return SDL_OutOfMemory();\n        }\n    }\n\n    if (texture->access == SDL_TEXTUREACCESS_TARGET) {\n        data->fbo = GL_GetFBO(renderdata, texture->w, texture->h);\n    } else {\n        data->fbo = NULL;\n    }\n\n    GL_CheckError(\"\", renderer);\n    renderdata->glGenTextures(1, &data->texture);\n    if (GL_CheckError(\"glGenTextures()\", renderer) < 0) {\n        if (data->pixels) {\n            SDL_free(data->pixels);\n        }\n        SDL_free(data);\n        return -1;\n    }\n    texture->driverdata = data;\n\n    if (renderdata->GL_ARB_texture_non_power_of_two_supported) {\n        data->type = GL_TEXTURE_2D;\n        texture_w = texture->w;\n        texture_h = texture->h;\n        data->texw = 1.0f;\n        data->texh = 1.0f;\n    } else if (renderdata->GL_ARB_texture_rectangle_supported) {\n        data->type = GL_TEXTURE_RECTANGLE_ARB;\n        texture_w = texture->w;\n        texture_h = texture->h;\n        data->texw = (GLfloat) texture_w;\n        data->texh = (GLfloat) texture_h;\n    } else {\n        data->type = GL_TEXTURE_2D;\n        texture_w = power_of_2(texture->w);\n        texture_h = power_of_2(texture->h);\n        data->texw = (GLfloat) (texture->w) / texture_w;\n        data->texh = (GLfloat) texture->h / texture_h;\n    }\n\n    data->format = format;\n    data->formattype = type;\n    scaleMode = GetScaleQuality();\n    renderdata->glEnable(data->type);\n    renderdata->glBindTexture(data->type, data->texture);\n    renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER, scaleMode);\n    renderdata->glTexParameteri(data->type, GL_TEXTURE_MAG_FILTER, scaleMode);\n    /* According to the spec, CLAMP_TO_EDGE is the default for TEXTURE_RECTANGLE\n       and setting it causes an INVALID_ENUM error in the latest NVidia drivers.\n    */\n    if (data->type != GL_TEXTURE_RECTANGLE_ARB) {\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_S,\n                                    GL_CLAMP_TO_EDGE);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,\n                                    GL_CLAMP_TO_EDGE);\n    }\n#ifdef __MACOSX__\n#ifndef GL_TEXTURE_STORAGE_HINT_APPLE\n#define GL_TEXTURE_STORAGE_HINT_APPLE       0x85BC\n#endif\n#ifndef STORAGE_CACHED_APPLE\n#define STORAGE_CACHED_APPLE                0x85BE\n#endif\n#ifndef STORAGE_SHARED_APPLE\n#define STORAGE_SHARED_APPLE                0x85BF\n#endif\n    if (texture->access == SDL_TEXTUREACCESS_STREAMING) {\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_STORAGE_HINT_APPLE,\n                                    GL_STORAGE_SHARED_APPLE);\n    } else {\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_STORAGE_HINT_APPLE,\n                                    GL_STORAGE_CACHED_APPLE);\n    }\n    if (texture->access == SDL_TEXTUREACCESS_STREAMING\n        && texture->format == SDL_PIXELFORMAT_ARGB8888\n        && (texture->w % 8) == 0) {\n        renderdata->glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);\n        renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n        renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH,\n                          (data->pitch / SDL_BYTESPERPIXEL(texture->format)));\n        renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,\n                                 texture_h, 0, format, type, data->pixels);\n        renderdata->glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE);\n    }\n    else\n#endif\n    {\n        renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,\n                                 texture_h, 0, format, type, NULL);\n    }\n    renderdata->glDisable(data->type);\n    if (GL_CheckError(\"glTexImage2D()\", renderer) < 0) {\n        return -1;\n    }\n\n    if (texture->format == SDL_PIXELFORMAT_YV12 ||\n        texture->format == SDL_PIXELFORMAT_IYUV) {\n        data->yuv = SDL_TRUE;\n\n        renderdata->glGenTextures(1, &data->utexture);\n        renderdata->glGenTextures(1, &data->vtexture);\n        renderdata->glEnable(data->type);\n\n        renderdata->glBindTexture(data->type, data->utexture);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER,\n                                    scaleMode);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_MAG_FILTER,\n                                    scaleMode);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_S,\n                                    GL_CLAMP_TO_EDGE);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,\n                                    GL_CLAMP_TO_EDGE);\n        renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,\n                                 texture_h/2, 0, format, type, NULL);\n\n        renderdata->glBindTexture(data->type, data->vtexture);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER,\n                                    scaleMode);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_MAG_FILTER,\n                                    scaleMode);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_S,\n                                    GL_CLAMP_TO_EDGE);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,\n                                    GL_CLAMP_TO_EDGE);\n        renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,\n                                 texture_h/2, 0, format, type, NULL);\n\n        renderdata->glDisable(data->type);\n    }\n\n    if (texture->format == SDL_PIXELFORMAT_NV12 ||\n        texture->format == SDL_PIXELFORMAT_NV21) {\n        data->nv12 = SDL_TRUE;\n\n        renderdata->glGenTextures(1, &data->utexture);\n        renderdata->glEnable(data->type);\n\n        renderdata->glBindTexture(data->type, data->utexture);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER,\n                                    scaleMode);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_MAG_FILTER,\n                                    scaleMode);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_S,\n                                    GL_CLAMP_TO_EDGE);\n        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,\n                                    GL_CLAMP_TO_EDGE);\n        renderdata->glTexImage2D(data->type, 0, GL_LUMINANCE_ALPHA, texture_w/2,\n                                 texture_h/2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);\n        renderdata->glDisable(data->type);\n    }\n\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                 const SDL_Rect * rect, const void *pixels, int pitch)\n{\n    GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *data = (GL_TextureData *) texture->driverdata;\n    const int texturebpp = SDL_BYTESPERPIXEL(texture->format);\n\n    SDL_assert(texturebpp != 0);  /* otherwise, division by zero later. */\n\n    GL_ActivateRenderer(renderer);\n\n    renderdata->glEnable(data->type);\n    renderdata->glBindTexture(data->type, data->texture);\n    renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n    renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / texturebpp));\n    renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w,\n                                rect->h, data->format, data->formattype,\n                                pixels);\n    if (data->yuv) {\n        renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / 2));\n\n        /* Skip to the correct offset into the next texture */\n        pixels = (const void*)((const Uint8*)pixels + rect->h * pitch);\n        if (texture->format == SDL_PIXELFORMAT_YV12) {\n            renderdata->glBindTexture(data->type, data->vtexture);\n        } else {\n            renderdata->glBindTexture(data->type, data->utexture);\n        }\n        renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,\n                                    rect->w/2, rect->h/2,\n                                    data->format, data->formattype, pixels);\n\n        /* Skip to the correct offset into the next texture */\n        pixels = (const void*)((const Uint8*)pixels + (rect->h * pitch)/4);\n        if (texture->format == SDL_PIXELFORMAT_YV12) {\n            renderdata->glBindTexture(data->type, data->utexture);\n        } else {\n            renderdata->glBindTexture(data->type, data->vtexture);\n        }\n        renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,\n                                    rect->w/2, rect->h/2,\n                                    data->format, data->formattype, pixels);\n    }\n\n    if (data->nv12) {\n        renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / 2));\n\n        /* Skip to the correct offset into the next texture */\n        pixels = (const void*)((const Uint8*)pixels + rect->h * pitch);\n        renderdata->glBindTexture(data->type, data->utexture);\n        renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,\n                                    rect->w/2, rect->h/2,\n                                    GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, pixels);\n    }\n    renderdata->glDisable(data->type);\n\n    return GL_CheckError(\"glTexSubImage2D()\", renderer);\n}\n\nstatic int\nGL_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,\n                    const SDL_Rect * rect,\n                    const Uint8 *Yplane, int Ypitch,\n                    const Uint8 *Uplane, int Upitch,\n                    const Uint8 *Vplane, int Vpitch)\n{\n    GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *data = (GL_TextureData *) texture->driverdata;\n\n    GL_ActivateRenderer(renderer);\n\n    renderdata->glEnable(data->type);\n    renderdata->glBindTexture(data->type, data->texture);\n    renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n    renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Ypitch);\n    renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w,\n                                rect->h, data->format, data->formattype,\n                                Yplane);\n\n    renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Upitch);\n    renderdata->glBindTexture(data->type, data->utexture);\n    renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,\n                                rect->w/2, rect->h/2,\n                                data->format, data->formattype, Uplane);\n\n    renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Vpitch);\n    renderdata->glBindTexture(data->type, data->vtexture);\n    renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,\n                                rect->w/2, rect->h/2,\n                                data->format, data->formattype, Vplane);\n    renderdata->glDisable(data->type);\n\n    return GL_CheckError(\"glTexSubImage2D()\", renderer);\n}\n\nstatic int\nGL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n               const SDL_Rect * rect, void **pixels, int *pitch)\n{\n    GL_TextureData *data = (GL_TextureData *) texture->driverdata;\n\n    data->locked_rect = *rect;\n    *pixels =\n        (void *) ((Uint8 *) data->pixels + rect->y * data->pitch +\n                  rect->x * SDL_BYTESPERPIXEL(texture->format));\n    *pitch = data->pitch;\n    return 0;\n}\n\nstatic void\nGL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GL_TextureData *data = (GL_TextureData *) texture->driverdata;\n    const SDL_Rect *rect;\n    void *pixels;\n\n    rect = &data->locked_rect;\n    pixels =\n        (void *) ((Uint8 *) data->pixels + rect->y * data->pitch +\n                  rect->x * SDL_BYTESPERPIXEL(texture->format));\n    GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);\n}\n\nstatic int\nGL_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *texturedata;\n    GLenum status;\n\n    GL_ActivateRenderer(renderer);\n\n    if (!data->GL_EXT_framebuffer_object_supported) {\n        return SDL_SetError(\"Render targets not supported by OpenGL\");\n    }\n\n    if (texture == NULL) {\n        data->glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);\n        return 0;\n    }\n\n    texturedata = (GL_TextureData *) texture->driverdata;\n    data->glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, texturedata->fbo->FBO);\n    /* TODO: check if texture pixel format allows this operation */\n    data->glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, texturedata->type, texturedata->texture, 0);\n    /* Check FBO status */\n    status = data->glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);\n    if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {\n        return SDL_SetError(\"glFramebufferTexture2DEXT() failed\");\n    }\n    return 0;\n}\n\nstatic int\nGL_UpdateViewport(SDL_Renderer * renderer)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n\n    if (SDL_CurrentContext != data->context) {\n        /* We'll update the viewport after we rebind the context */\n        return 0;\n    }\n\n    if (renderer->target) {\n        data->glViewport(renderer->viewport.x, renderer->viewport.y,\n                         renderer->viewport.w, renderer->viewport.h);\n    } else {\n        int w, h;\n\n        SDL_GL_GetDrawableSize(renderer->window, &w, &h);\n        data->glViewport(renderer->viewport.x, (h - renderer->viewport.y - renderer->viewport.h),\n                         renderer->viewport.w, renderer->viewport.h);\n    }\n\n    data->glMatrixMode(GL_PROJECTION);\n    data->glLoadIdentity();\n    if (renderer->viewport.w && renderer->viewport.h) {\n        if (renderer->target) {\n            data->glOrtho((GLdouble) 0,\n                          (GLdouble) renderer->viewport.w,\n                          (GLdouble) 0,\n                          (GLdouble) renderer->viewport.h,\n                           0.0, 1.0);\n        } else {\n            data->glOrtho((GLdouble) 0,\n                          (GLdouble) renderer->viewport.w,\n                          (GLdouble) renderer->viewport.h,\n                          (GLdouble) 0,\n                           0.0, 1.0);\n        }\n    }\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGL_UpdateClipRect(SDL_Renderer * renderer)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n\n    if (renderer->clipping_enabled) {\n        const SDL_Rect *rect = &renderer->clip_rect;\n        data->glEnable(GL_SCISSOR_TEST);\n        if (renderer->target) {\n            data->glScissor(renderer->viewport.x + rect->x, renderer->viewport.y + rect->y, rect->w, rect->h);\n        } else {\n            int w, h;\n\n            SDL_GL_GetDrawableSize(renderer->window, &w, &h);\n            data->glScissor(renderer->viewport.x + rect->x, h - renderer->viewport.y - rect->y - rect->h, rect->w, rect->h);\n        }\n    } else {\n        data->glDisable(GL_SCISSOR_TEST);\n    }\n    return 0;\n}\n\nstatic void\nGL_SetShader(GL_RenderData * data, GL_Shader shader)\n{\n    if (data->shaders && shader != data->current.shader) {\n        GL_SelectShader(data->shaders, shader);\n        data->current.shader = shader;\n    }\n}\n\nstatic void\nGL_SetColor(GL_RenderData * data, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);\n\n    if (color != data->current.color) {\n        data->glColor4f((GLfloat) r * inv255f,\n                        (GLfloat) g * inv255f,\n                        (GLfloat) b * inv255f,\n                        (GLfloat) a * inv255f);\n        data->current.color = color;\n    }\n}\n\nstatic void\nGL_SetBlendMode(GL_RenderData * data, int blendMode)\n{\n    if (blendMode != data->current.blendMode) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_NONE:\n            data->glDisable(GL_BLEND);\n            break;\n        case SDL_BLENDMODE_BLEND:\n            data->glEnable(GL_BLEND);\n            data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);\n            break;\n        case SDL_BLENDMODE_ADD:\n            data->glEnable(GL_BLEND);\n            data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);\n            break;\n        case SDL_BLENDMODE_MOD:\n            data->glEnable(GL_BLEND);\n            data->glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE);\n            break;\n        }\n        data->current.blendMode = blendMode;\n    }\n}\n\nstatic void\nGL_SetDrawingState(SDL_Renderer * renderer)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n\n    GL_ActivateRenderer(renderer);\n\n    GL_SetColor(data, renderer->r,\n                      renderer->g,\n                      renderer->b,\n                      renderer->a);\n\n    GL_SetBlendMode(data, renderer->blendMode);\n\n    GL_SetShader(data, SHADER_SOLID);\n}\n\nstatic int\nGL_RenderClear(SDL_Renderer * renderer)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n\n    GL_ActivateRenderer(renderer);\n\n    data->glClearColor((GLfloat) renderer->r * inv255f,\n                       (GLfloat) renderer->g * inv255f,\n                       (GLfloat) renderer->b * inv255f,\n                       (GLfloat) renderer->a * inv255f);\n\n    if (renderer->clipping_enabled) {\n        data->glDisable(GL_SCISSOR_TEST);\n    }\n\n    data->glClear(GL_COLOR_BUFFER_BIT);\n\n    if (renderer->clipping_enabled) {\n        data->glEnable(GL_SCISSOR_TEST);\n    }\n\n    return 0;\n}\n\nstatic int\nGL_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points,\n                    int count)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    int i;\n\n    GL_SetDrawingState(renderer);\n\n    data->glBegin(GL_POINTS);\n    for (i = 0; i < count; ++i) {\n        data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y);\n    }\n    data->glEnd();\n\n    return 0;\n}\n\nstatic int\nGL_RenderDrawLines(SDL_Renderer * renderer, const SDL_FPoint * points,\n                   int count)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    int i;\n\n    GL_SetDrawingState(renderer);\n\n    if (count > 2 &&\n        points[0].x == points[count-1].x && points[0].y == points[count-1].y) {\n        data->glBegin(GL_LINE_LOOP);\n        /* GL_LINE_LOOP takes care of the final segment */\n        --count;\n        for (i = 0; i < count; ++i) {\n            data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y);\n        }\n        data->glEnd();\n    } else {\n#if defined(__MACOSX__) || defined(__WIN32__)\n#else\n        int x1, y1, x2, y2;\n#endif\n\n        data->glBegin(GL_LINE_STRIP);\n        for (i = 0; i < count; ++i) {\n            data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y);\n        }\n        data->glEnd();\n\n        /* The line is half open, so we need one more point to complete it.\n         * http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node47.html\n         * If we have to, we can use vertical line and horizontal line textures\n         * for vertical and horizontal lines, and then create custom textures\n         * for diagonal lines and software render those.  It's terrible, but at\n         * least it would be pixel perfect.\n         */\n        data->glBegin(GL_POINTS);\n#if defined(__MACOSX__) || defined(__WIN32__)\n        /* Mac OS X and Windows seem to always leave the last point open */\n        data->glVertex2f(0.5f + points[count-1].x, 0.5f + points[count-1].y);\n#else\n        /* Linux seems to leave the right-most or bottom-most point open */\n        x1 = points[0].x;\n        y1 = points[0].y;\n        x2 = points[count-1].x;\n        y2 = points[count-1].y;\n\n        if (x1 > x2) {\n            data->glVertex2f(0.5f + x1, 0.5f + y1);\n        } else if (x2 > x1) {\n            data->glVertex2f(0.5f + x2, 0.5f + y2);\n        }\n        if (y1 > y2) {\n            data->glVertex2f(0.5f + x1, 0.5f + y1);\n        } else if (y2 > y1) {\n            data->glVertex2f(0.5f + x2, 0.5f + y2);\n        }\n#endif\n        data->glEnd();\n    }\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGL_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects, int count)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    int i;\n\n    GL_SetDrawingState(renderer);\n\n    for (i = 0; i < count; ++i) {\n        const SDL_FRect *rect = &rects[i];\n\n        data->glRectf(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h);\n    }\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGL_SetupCopy(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata;\n\n    data->glEnable(texturedata->type);\n    if (texturedata->yuv) {\n        data->glActiveTextureARB(GL_TEXTURE2_ARB);\n        data->glBindTexture(texturedata->type, texturedata->vtexture);\n\n        data->glActiveTextureARB(GL_TEXTURE1_ARB);\n        data->glBindTexture(texturedata->type, texturedata->utexture);\n\n        data->glActiveTextureARB(GL_TEXTURE0_ARB);\n    }\n    if (texturedata->nv12) {\n        data->glActiveTextureARB(GL_TEXTURE1_ARB);\n        data->glBindTexture(texturedata->type, texturedata->utexture);\n\n        data->glActiveTextureARB(GL_TEXTURE0_ARB);\n    }\n    data->glBindTexture(texturedata->type, texturedata->texture);\n\n    if (texture->modMode) {\n        GL_SetColor(data, texture->r, texture->g, texture->b, texture->a);\n    } else {\n        GL_SetColor(data, 255, 255, 255, 255);\n    }\n\n    GL_SetBlendMode(data, texture->blendMode);\n\n    if (texturedata->yuv) {\n        GL_SetShader(data, SHADER_YUV);\n    } else if (texturedata->nv12) {\n        if (texture->format == SDL_PIXELFORMAT_NV12) {\n            GL_SetShader(data, SHADER_NV12);\n        } else {\n            GL_SetShader(data, SHADER_NV21);\n        }\n    } else {\n        GL_SetShader(data, SHADER_RGB);\n    }\n    return 0;\n}\n\nstatic int\nGL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,\n              const SDL_Rect * srcrect, const SDL_FRect * dstrect)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata;\n    GLfloat minx, miny, maxx, maxy;\n    GLfloat minu, maxu, minv, maxv;\n\n    GL_ActivateRenderer(renderer);\n\n    if (GL_SetupCopy(renderer, texture) < 0) {\n        return -1;\n    }\n\n    minx = dstrect->x;\n    miny = dstrect->y;\n    maxx = dstrect->x + dstrect->w;\n    maxy = dstrect->y + dstrect->h;\n\n    minu = (GLfloat) srcrect->x / texture->w;\n    minu *= texturedata->texw;\n    maxu = (GLfloat) (srcrect->x + srcrect->w) / texture->w;\n    maxu *= texturedata->texw;\n    minv = (GLfloat) srcrect->y / texture->h;\n    minv *= texturedata->texh;\n    maxv = (GLfloat) (srcrect->y + srcrect->h) / texture->h;\n    maxv *= texturedata->texh;\n\n    data->glBegin(GL_TRIANGLE_STRIP);\n    data->glTexCoord2f(minu, minv);\n    data->glVertex2f(minx, miny);\n    data->glTexCoord2f(maxu, minv);\n    data->glVertex2f(maxx, miny);\n    data->glTexCoord2f(minu, maxv);\n    data->glVertex2f(minx, maxy);\n    data->glTexCoord2f(maxu, maxv);\n    data->glVertex2f(maxx, maxy);\n    data->glEnd();\n\n    data->glDisable(texturedata->type);\n\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n              const SDL_Rect * srcrect, const SDL_FRect * dstrect,\n              const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata;\n    GLfloat minx, miny, maxx, maxy;\n    GLfloat centerx, centery;\n    GLfloat minu, maxu, minv, maxv;\n\n    GL_ActivateRenderer(renderer);\n\n    if (GL_SetupCopy(renderer, texture) < 0) {\n        return -1;\n    }\n\n    centerx = center->x;\n    centery = center->y;\n\n    if (flip & SDL_FLIP_HORIZONTAL) {\n        minx =  dstrect->w - centerx;\n        maxx = -centerx;\n    }\n    else {\n        minx = -centerx;\n        maxx =  dstrect->w - centerx;\n    }\n\n    if (flip & SDL_FLIP_VERTICAL) {\n        miny =  dstrect->h - centery;\n        maxy = -centery;\n    }\n    else {\n        miny = -centery;\n        maxy =  dstrect->h - centery;\n    }\n\n    minu = (GLfloat) srcrect->x / texture->w;\n    minu *= texturedata->texw;\n    maxu = (GLfloat) (srcrect->x + srcrect->w) / texture->w;\n    maxu *= texturedata->texw;\n    minv = (GLfloat) srcrect->y / texture->h;\n    minv *= texturedata->texh;\n    maxv = (GLfloat) (srcrect->y + srcrect->h) / texture->h;\n    maxv *= texturedata->texh;\n\n    /* Translate to flip, rotate, translate to position */\n    data->glPushMatrix();\n    data->glTranslatef((GLfloat)dstrect->x + centerx, (GLfloat)dstrect->y + centery, (GLfloat)0.0);\n    data->glRotated(angle, (GLdouble)0.0, (GLdouble)0.0, (GLdouble)1.0);\n\n    data->glBegin(GL_TRIANGLE_STRIP);\n    data->glTexCoord2f(minu, minv);\n    data->glVertex2f(minx, miny);\n    data->glTexCoord2f(maxu, minv);\n    data->glVertex2f(maxx, miny);\n    data->glTexCoord2f(minu, maxv);\n    data->glVertex2f(minx, maxy);\n    data->glTexCoord2f(maxu, maxv);\n    data->glVertex2f(maxx, maxy);\n    data->glEnd();\n    data->glPopMatrix();\n\n    data->glDisable(texturedata->type);\n\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                    Uint32 pixel_format, void * pixels, int pitch)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    Uint32 temp_format = renderer->target ? renderer->target->format : SDL_PIXELFORMAT_ARGB8888;\n    void *temp_pixels;\n    int temp_pitch;\n    GLint internalFormat;\n    GLenum format, type;\n    Uint8 *src, *dst, *tmp;\n    int w, h, length, rows;\n    int status;\n\n    GL_ActivateRenderer(renderer);\n\n    temp_pitch = rect->w * SDL_BYTESPERPIXEL(temp_format);\n    temp_pixels = SDL_malloc(rect->h * temp_pitch);\n    if (!temp_pixels) {\n        return SDL_OutOfMemory();\n    }\n\n    if (!convert_format(data, temp_format, &internalFormat, &format, &type)) {\n        SDL_free(temp_pixels);\n        return SDL_SetError(\"Texture format %s not supported by OpenGL\",\n                            SDL_GetPixelFormatName(temp_format));\n    }\n\n    SDL_GetRendererOutputSize(renderer, &w, &h);\n\n    data->glPixelStorei(GL_PACK_ALIGNMENT, 1);\n    data->glPixelStorei(GL_PACK_ROW_LENGTH,\n                        (temp_pitch / SDL_BYTESPERPIXEL(temp_format)));\n\n    data->glReadPixels(rect->x, renderer->target ? rect->y : (h-rect->y)-rect->h,\n                       rect->w, rect->h, format, type, temp_pixels);\n\n    if (GL_CheckError(\"glReadPixels()\", renderer) < 0) {\n        SDL_free(temp_pixels);\n        return -1;\n    }\n\n    /* Flip the rows to be top-down if necessary */\n    if (!renderer->target) {\n        length = rect->w * SDL_BYTESPERPIXEL(temp_format);\n        src = (Uint8*)temp_pixels + (rect->h-1)*temp_pitch;\n        dst = (Uint8*)temp_pixels;\n        tmp = SDL_stack_alloc(Uint8, length);\n        rows = rect->h / 2;\n        while (rows--) {\n            SDL_memcpy(tmp, dst, length);\n            SDL_memcpy(dst, src, length);\n            SDL_memcpy(src, tmp, length);\n            dst += temp_pitch;\n            src -= temp_pitch;\n        }\n        SDL_stack_free(tmp);\n    }\n\n    status = SDL_ConvertPixels(rect->w, rect->h,\n                               temp_format, temp_pixels, temp_pitch,\n                               pixel_format, pixels, pitch);\n    SDL_free(temp_pixels);\n\n    return status;\n}\n\nstatic void\nGL_RenderPresent(SDL_Renderer * renderer)\n{\n    GL_ActivateRenderer(renderer);\n\n    SDL_GL_SwapWindow(renderer->window);\n}\n\nstatic void\nGL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *data = (GL_TextureData *) texture->driverdata;\n\n    GL_ActivateRenderer(renderer);\n\n    if (!data) {\n        return;\n    }\n    if (data->texture) {\n        renderdata->glDeleteTextures(1, &data->texture);\n    }\n    if (data->yuv) {\n        renderdata->glDeleteTextures(1, &data->utexture);\n        renderdata->glDeleteTextures(1, &data->vtexture);\n    }\n    SDL_free(data->pixels);\n    SDL_free(data);\n    texture->driverdata = NULL;\n}\n\nstatic void\nGL_DestroyRenderer(SDL_Renderer * renderer)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n\n    if (data) {\n        GL_ClearErrors(renderer);\n        if (data->GL_ARB_debug_output_supported) {\n            PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC) SDL_GL_GetProcAddress(\"glDebugMessageCallbackARB\");\n\n            /* Uh oh, we don't have a safe way of removing ourselves from the callback chain, if it changed after we set our callback. */\n            /* For now, just always replace the callback with the original one */\n            glDebugMessageCallbackARBFunc(data->next_error_callback, data->next_error_userparam);\n        }\n        if (data->shaders) {\n            GL_DestroyShaderContext(data->shaders);\n        }\n        if (data->context) {\n            while (data->framebuffers) {\n                GL_FBOList *nextnode = data->framebuffers->next;\n                /* delete the framebuffer object */\n                data->glDeleteFramebuffersEXT(1, &data->framebuffers->FBO);\n                GL_CheckError(\"\", renderer);\n                SDL_free(data->framebuffers);\n                data->framebuffers = nextnode;\n            }\n            SDL_GL_DeleteContext(data->context);\n        }\n        SDL_free(data);\n    }\n    SDL_free(renderer);\n}\n\nstatic int\nGL_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata;\n    GL_ActivateRenderer(renderer);\n\n    data->glEnable(texturedata->type);\n    if (texturedata->yuv) {\n        data->glActiveTextureARB(GL_TEXTURE2_ARB);\n        data->glBindTexture(texturedata->type, texturedata->vtexture);\n\n        data->glActiveTextureARB(GL_TEXTURE1_ARB);\n        data->glBindTexture(texturedata->type, texturedata->utexture);\n\n        data->glActiveTextureARB(GL_TEXTURE0_ARB);\n    }\n    data->glBindTexture(texturedata->type, texturedata->texture);\n\n    if(texw) *texw = (float)texturedata->texw;\n    if(texh) *texh = (float)texturedata->texh;\n\n    return 0;\n}\n\nstatic int\nGL_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture)\n{\n    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;\n    GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata;\n    GL_ActivateRenderer(renderer);\n\n    if (texturedata->yuv) {\n        data->glActiveTextureARB(GL_TEXTURE2_ARB);\n        data->glDisable(texturedata->type);\n\n        data->glActiveTextureARB(GL_TEXTURE1_ARB);\n        data->glDisable(texturedata->type);\n\n        data->glActiveTextureARB(GL_TEXTURE0_ARB);\n    }\n\n    data->glDisable(texturedata->type);\n\n    return 0;\n}\n\n#endif /* SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/opengl/SDL_shaders_gl.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_log.h\"\n#include \"SDL_opengl.h\"\n#include \"SDL_video.h\"\n#include \"SDL_shaders_gl.h\"\n\n/* OpenGL shader implementation */\n\n/* #define DEBUG_SHADERS */\n\ntypedef struct\n{\n    GLhandleARB program;\n    GLhandleARB vert_shader;\n    GLhandleARB frag_shader;\n} GL_ShaderData;\n\nstruct GL_ShaderContext\n{\n    GLenum (*glGetError)(void);\n\n    PFNGLATTACHOBJECTARBPROC glAttachObjectARB;\n    PFNGLCOMPILESHADERARBPROC glCompileShaderARB;\n    PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;\n    PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;\n    PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;\n    PFNGLGETINFOLOGARBPROC glGetInfoLogARB;\n    PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;\n    PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;\n    PFNGLLINKPROGRAMARBPROC glLinkProgramARB;\n    PFNGLSHADERSOURCEARBPROC glShaderSourceARB;\n    PFNGLUNIFORM1IARBPROC glUniform1iARB;\n    PFNGLUNIFORM1FARBPROC glUniform1fARB;\n    PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;\n\n    SDL_bool GL_ARB_texture_rectangle_supported;\n\n    GL_ShaderData shaders[NUM_SHADERS];\n};\n\n/*\n * NOTE: Always use sampler2D, etc here. We'll #define them to the\n *  texture_rectangle versions if we choose to use that extension.\n */\nstatic const char *shader_source[NUM_SHADERS][2] =\n{\n    /* SHADER_NONE */\n    { NULL, NULL },\n\n    /* SHADER_SOLID */\n    {\n        /* vertex shader */\n\"varying vec4 v_color;\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\n\"\n\"    v_color = gl_Color;\\n\"\n\"}\",\n        /* fragment shader */\n\"varying vec4 v_color;\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_FragColor = v_color;\\n\"\n\"}\"\n    },\n\n    /* SHADER_RGB */\n    {\n        /* vertex shader */\n\"varying vec4 v_color;\\n\"\n\"varying vec2 v_texCoord;\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\n\"\n\"    v_color = gl_Color;\\n\"\n\"    v_texCoord = vec2(gl_MultiTexCoord0);\\n\"\n\"}\",\n        /* fragment shader */\n\"varying vec4 v_color;\\n\"\n\"varying vec2 v_texCoord;\\n\"\n\"uniform sampler2D tex0;\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\\n\"\n\"}\"\n    },\n\n    /* SHADER_YUV */\n    {\n        /* vertex shader */\n\"varying vec4 v_color;\\n\"\n\"varying vec2 v_texCoord;\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\n\"\n\"    v_color = gl_Color;\\n\"\n\"    v_texCoord = vec2(gl_MultiTexCoord0);\\n\"\n\"}\",\n        /* fragment shader */\n\"varying vec4 v_color;\\n\"\n\"varying vec2 v_texCoord;\\n\"\n\"uniform sampler2D tex0; // Y \\n\"\n\"uniform sampler2D tex1; // U \\n\"\n\"uniform sampler2D tex2; // V \\n\"\n\"\\n\"\n\"// YUV offset \\n\"\n\"const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\\n\"\n\"\\n\"\n\"// RGB coefficients \\n\"\n\"const vec3 Rcoeff = vec3(1.164,  0.000,  1.596);\\n\"\n\"const vec3 Gcoeff = vec3(1.164, -0.391, -0.813);\\n\"\n\"const vec3 Bcoeff = vec3(1.164,  2.018,  0.000);\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    vec2 tcoord;\\n\"\n\"    vec3 yuv, rgb;\\n\"\n\"\\n\"\n\"    // Get the Y value \\n\"\n\"    tcoord = v_texCoord;\\n\"\n\"    yuv.x = texture2D(tex0, tcoord).r;\\n\"\n\"\\n\"\n\"    // Get the U and V values \\n\"\n\"    tcoord *= UVCoordScale;\\n\"\n\"    yuv.y = texture2D(tex1, tcoord).r;\\n\"\n\"    yuv.z = texture2D(tex2, tcoord).r;\\n\"\n\"\\n\"\n\"    // Do the color transform \\n\"\n\"    yuv += offset;\\n\"\n\"    rgb.r = dot(yuv, Rcoeff);\\n\"\n\"    rgb.g = dot(yuv, Gcoeff);\\n\"\n\"    rgb.b = dot(yuv, Bcoeff);\\n\"\n\"\\n\"\n\"    // That was easy. :) \\n\"\n\"    gl_FragColor = vec4(rgb, 1.0) * v_color;\\n\"\n\"}\"\n    },\n\n    /* SHADER_NV12 */\n    {\n        /* vertex shader */\n\"varying vec4 v_color;\\n\"\n\"varying vec2 v_texCoord;\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\n\"\n\"    v_color = gl_Color;\\n\"\n\"    v_texCoord = vec2(gl_MultiTexCoord0);\\n\"\n\"}\",\n        /* fragment shader */\n\"varying vec4 v_color;\\n\"\n\"varying vec2 v_texCoord;\\n\"\n\"uniform sampler2D tex0; // Y \\n\"\n\"uniform sampler2D tex1; // U/V \\n\"\n\"\\n\"\n\"// YUV offset \\n\"\n\"const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\\n\"\n\"\\n\"\n\"// RGB coefficients \\n\"\n\"const vec3 Rcoeff = vec3(1.164,  0.000,  1.596);\\n\"\n\"const vec3 Gcoeff = vec3(1.164, -0.391, -0.813);\\n\"\n\"const vec3 Bcoeff = vec3(1.164,  2.018,  0.000);\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    vec2 tcoord;\\n\"\n\"    vec3 yuv, rgb;\\n\"\n\"\\n\"\n\"    // Get the Y value \\n\"\n\"    tcoord = v_texCoord;\\n\"\n\"    yuv.x = texture2D(tex0, tcoord).r;\\n\"\n\"\\n\"\n\"    // Get the U and V values \\n\"\n\"    tcoord *= UVCoordScale;\\n\"\n\"    yuv.yz = texture2D(tex1, tcoord).ra;\\n\"\n\"\\n\"\n\"    // Do the color transform \\n\"\n\"    yuv += offset;\\n\"\n\"    rgb.r = dot(yuv, Rcoeff);\\n\"\n\"    rgb.g = dot(yuv, Gcoeff);\\n\"\n\"    rgb.b = dot(yuv, Bcoeff);\\n\"\n\"\\n\"\n\"    // That was easy. :) \\n\"\n\"    gl_FragColor = vec4(rgb, 1.0) * v_color;\\n\"\n\"}\"\n    },\n\n    /* SHADER_NV21 */\n    {\n        /* vertex shader */\n\"varying vec4 v_color;\\n\"\n\"varying vec2 v_texCoord;\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\n\"\n\"    v_color = gl_Color;\\n\"\n\"    v_texCoord = vec2(gl_MultiTexCoord0);\\n\"\n\"}\",\n        /* fragment shader */\n\"varying vec4 v_color;\\n\"\n\"varying vec2 v_texCoord;\\n\"\n\"uniform sampler2D tex0; // Y \\n\"\n\"uniform sampler2D tex1; // U/V \\n\"\n\"\\n\"\n\"// YUV offset \\n\"\n\"const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\\n\"\n\"\\n\"\n\"// RGB coefficients \\n\"\n\"const vec3 Rcoeff = vec3(1.164,  0.000,  1.596);\\n\"\n\"const vec3 Gcoeff = vec3(1.164, -0.391, -0.813);\\n\"\n\"const vec3 Bcoeff = vec3(1.164,  2.018,  0.000);\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    vec2 tcoord;\\n\"\n\"    vec3 yuv, rgb;\\n\"\n\"\\n\"\n\"    // Get the Y value \\n\"\n\"    tcoord = v_texCoord;\\n\"\n\"    yuv.x = texture2D(tex0, tcoord).r;\\n\"\n\"\\n\"\n\"    // Get the U and V values \\n\"\n\"    tcoord *= UVCoordScale;\\n\"\n\"    yuv.yz = texture2D(tex1, tcoord).ar;\\n\"\n\"\\n\"\n\"    // Do the color transform \\n\"\n\"    yuv += offset;\\n\"\n\"    rgb.r = dot(yuv, Rcoeff);\\n\"\n\"    rgb.g = dot(yuv, Gcoeff);\\n\"\n\"    rgb.b = dot(yuv, Bcoeff);\\n\"\n\"\\n\"\n\"    // That was easy. :) \\n\"\n\"    gl_FragColor = vec4(rgb, 1.0) * v_color;\\n\"\n\"}\"\n    },\n};\n\nstatic SDL_bool\nCompileShader(GL_ShaderContext *ctx, GLhandleARB shader, const char *defines, const char *source)\n{\n    GLint status;\n    const char *sources[2];\n\n    sources[0] = defines;\n    sources[1] = source;\n\n    ctx->glShaderSourceARB(shader, SDL_arraysize(sources), sources, NULL);\n    ctx->glCompileShaderARB(shader);\n    ctx->glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &status);\n    if (status == 0) {\n        GLint length;\n        char *info;\n\n        ctx->glGetObjectParameterivARB(shader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);\n        info = SDL_stack_alloc(char, length+1);\n        ctx->glGetInfoLogARB(shader, length, NULL, info);\n        SDL_LogError(SDL_LOG_CATEGORY_RENDER,\n            \"Failed to compile shader:\\n%s%s\\n%s\", defines, source, info);\n#ifdef DEBUG_SHADERS\n        fprintf(stderr,\n            \"Failed to compile shader:\\n%s%s\\n%s\", defines, source, info);\n#endif\n        SDL_stack_free(info);\n\n        return SDL_FALSE;\n    } else {\n        return SDL_TRUE;\n    }\n}\n\nstatic SDL_bool\nCompileShaderProgram(GL_ShaderContext *ctx, int index, GL_ShaderData *data)\n{\n    const int num_tmus_bound = 4;\n    const char *vert_defines = \"\";\n    const char *frag_defines = \"\";\n    int i;\n    GLint location;\n\n    if (index == SHADER_NONE) {\n        return SDL_TRUE;\n    }\n\n    ctx->glGetError();\n\n    /* Make sure we use the correct sampler type for our texture type */\n    if (ctx->GL_ARB_texture_rectangle_supported) {\n        frag_defines =\n\"#define sampler2D sampler2DRect\\n\"\n\"#define texture2D texture2DRect\\n\"\n\"#define UVCoordScale 0.5\\n\";\n    } else {\n        frag_defines = \n\"#define UVCoordScale 1.0\\n\";\n    }\n\n    /* Create one program object to rule them all */\n    data->program = ctx->glCreateProgramObjectARB();\n\n    /* Create the vertex shader */\n    data->vert_shader = ctx->glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);\n    if (!CompileShader(ctx, data->vert_shader, vert_defines, shader_source[index][0])) {\n        return SDL_FALSE;\n    }\n\n    /* Create the fragment shader */\n    data->frag_shader = ctx->glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);\n    if (!CompileShader(ctx, data->frag_shader, frag_defines, shader_source[index][1])) {\n        return SDL_FALSE;\n    }\n\n    /* ... and in the darkness bind them */\n    ctx->glAttachObjectARB(data->program, data->vert_shader);\n    ctx->glAttachObjectARB(data->program, data->frag_shader);\n    ctx->glLinkProgramARB(data->program);\n\n    /* Set up some uniform variables */\n    ctx->glUseProgramObjectARB(data->program);\n    for (i = 0; i < num_tmus_bound; ++i) {\n        char tex_name[10];\n        SDL_snprintf(tex_name, SDL_arraysize(tex_name), \"tex%d\", i);\n        location = ctx->glGetUniformLocationARB(data->program, tex_name);\n        if (location >= 0) {\n            ctx->glUniform1iARB(location, i);\n        }\n    }\n    ctx->glUseProgramObjectARB(0);\n\n    return (ctx->glGetError() == GL_NO_ERROR);\n}\n\nstatic void\nDestroyShaderProgram(GL_ShaderContext *ctx, GL_ShaderData *data)\n{\n    ctx->glDeleteObjectARB(data->vert_shader);\n    ctx->glDeleteObjectARB(data->frag_shader);\n    ctx->glDeleteObjectARB(data->program);\n}\n\nGL_ShaderContext *\nGL_CreateShaderContext()\n{\n    GL_ShaderContext *ctx;\n    SDL_bool shaders_supported;\n    int i;\n\n    ctx = (GL_ShaderContext *)SDL_calloc(1, sizeof(*ctx));\n    if (!ctx) {\n        return NULL;\n    }\n\n    if (!SDL_GL_ExtensionSupported(\"GL_ARB_texture_non_power_of_two\") &&\n        (SDL_GL_ExtensionSupported(\"GL_ARB_texture_rectangle\") ||\n         SDL_GL_ExtensionSupported(\"GL_EXT_texture_rectangle\"))) {\n        ctx->GL_ARB_texture_rectangle_supported = SDL_TRUE;\n    }\n\n    /* Check for shader support */\n    shaders_supported = SDL_FALSE;\n    if (SDL_GL_ExtensionSupported(\"GL_ARB_shader_objects\") &&\n        SDL_GL_ExtensionSupported(\"GL_ARB_shading_language_100\") &&\n        SDL_GL_ExtensionSupported(\"GL_ARB_vertex_shader\") &&\n        SDL_GL_ExtensionSupported(\"GL_ARB_fragment_shader\")) {\n        ctx->glGetError = (GLenum (*)(void)) SDL_GL_GetProcAddress(\"glGetError\");\n        ctx->glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) SDL_GL_GetProcAddress(\"glAttachObjectARB\");\n        ctx->glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) SDL_GL_GetProcAddress(\"glCompileShaderARB\");\n        ctx->glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress(\"glCreateProgramObjectARB\");\n        ctx->glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) SDL_GL_GetProcAddress(\"glCreateShaderObjectARB\");\n        ctx->glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) SDL_GL_GetProcAddress(\"glDeleteObjectARB\");\n        ctx->glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) SDL_GL_GetProcAddress(\"glGetInfoLogARB\");\n        ctx->glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) SDL_GL_GetProcAddress(\"glGetObjectParameterivARB\");\n        ctx->glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) SDL_GL_GetProcAddress(\"glGetUniformLocationARB\");\n        ctx->glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) SDL_GL_GetProcAddress(\"glLinkProgramARB\");\n        ctx->glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) SDL_GL_GetProcAddress(\"glShaderSourceARB\");\n        ctx->glUniform1iARB = (PFNGLUNIFORM1IARBPROC) SDL_GL_GetProcAddress(\"glUniform1iARB\");\n        ctx->glUniform1fARB = (PFNGLUNIFORM1FARBPROC) SDL_GL_GetProcAddress(\"glUniform1fARB\");\n        ctx->glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress(\"glUseProgramObjectARB\");\n        if (ctx->glGetError &&\n            ctx->glAttachObjectARB &&\n            ctx->glCompileShaderARB &&\n            ctx->glCreateProgramObjectARB &&\n            ctx->glCreateShaderObjectARB &&\n            ctx->glDeleteObjectARB &&\n            ctx->glGetInfoLogARB &&\n            ctx->glGetObjectParameterivARB &&\n            ctx->glGetUniformLocationARB &&\n            ctx->glLinkProgramARB &&\n            ctx->glShaderSourceARB &&\n            ctx->glUniform1iARB &&\n            ctx->glUniform1fARB &&\n            ctx->glUseProgramObjectARB) {\n            shaders_supported = SDL_TRUE;\n        }\n    }\n\n    if (!shaders_supported) {\n        SDL_free(ctx);\n        return NULL;\n    }\n\n    /* Compile all the shaders */\n    for (i = 0; i < NUM_SHADERS; ++i) {\n        if (!CompileShaderProgram(ctx, i, &ctx->shaders[i])) {\n            GL_DestroyShaderContext(ctx);\n            return NULL;\n        }\n    }\n\n    /* We're done! */\n    return ctx;\n}\n\nvoid\nGL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)\n{\n    ctx->glUseProgramObjectARB(ctx->shaders[shader].program);\n}\n\nvoid\nGL_DestroyShaderContext(GL_ShaderContext *ctx)\n{\n    int i;\n\n    for (i = 0; i < NUM_SHADERS; ++i) {\n        DestroyShaderProgram(ctx, &ctx->shaders[i]);\n    }\n    SDL_free(ctx);\n}\n\n#endif /* SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/opengl/SDL_shaders_gl.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n/* OpenGL shader implementation */\n\ntypedef enum {\n    SHADER_NONE,\n    SHADER_SOLID,\n    SHADER_RGB,\n    SHADER_YUV,\n    SHADER_NV12,\n    SHADER_NV21,\n    NUM_SHADERS\n} GL_Shader;\n\ntypedef struct GL_ShaderContext GL_ShaderContext;\n\nextern GL_ShaderContext * GL_CreateShaderContext();\nextern void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader);\nextern void GL_DestroyShaderContext(GL_ShaderContext *ctx);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/opengles/SDL_glesfuncs.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\nSDL_PROC(void, glBindTexture, (GLenum, GLuint))\nSDL_PROC(void, glBlendFunc, (GLenum, GLenum))\nSDL_PROC_OES(void, glBlendFuncSeparateOES, (GLenum, GLenum, GLenum, GLenum))\nSDL_PROC(void, glClear, (GLbitfield))\nSDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf))\nSDL_PROC(void, glColor4f, (GLfloat, GLfloat, GLfloat, GLfloat))\nSDL_PROC(void, glDeleteTextures, (GLsizei, const GLuint *))\nSDL_PROC(void, glDisable, (GLenum))\nSDL_PROC(void, glDisableClientState, (GLenum array))\nSDL_PROC(void, glDrawArrays, (GLenum, GLint, GLsizei))\nSDL_PROC_OES(void, glDrawTexfOES, (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat))\nSDL_PROC(void, glEnable, (GLenum))\nSDL_PROC(void, glEnableClientState, (GLenum))\nSDL_PROC(void, glFinish, (void))\nSDL_PROC_OES(void, glGenFramebuffersOES, (GLsizei, GLuint *))\nSDL_PROC(void, glGenTextures, (GLsizei, GLuint *))\nSDL_PROC(GLenum, glGetError, (void))\nSDL_PROC(void, glGetIntegerv, (GLenum, GLint *))\nSDL_PROC(void, glLoadIdentity, (void))\nSDL_PROC(void, glMatrixMode, (GLenum))\nSDL_PROC(void, glOrthof, (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat))\nSDL_PROC(void, glPixelStorei, (GLenum, GLint))\nSDL_PROC(void, glReadPixels, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*))\nSDL_PROC(void, glScissor, (GLint, GLint, GLsizei, GLsizei))\nSDL_PROC(void, glTexCoordPointer, (GLint, GLenum, GLsizei, const GLvoid *))\nSDL_PROC(void, glTexEnvf, (GLenum, GLenum, GLfloat))\nSDL_PROC(void, glTexImage2D, (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *))\nSDL_PROC(void, glTexParameteri, (GLenum, GLenum, GLint))\nSDL_PROC(void, glTexParameteriv, (GLenum, GLenum, const GLint *))\nSDL_PROC(void, glTexSubImage2D, (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *))\nSDL_PROC(void, glVertexPointer, (GLint, GLenum, GLsizei, const GLvoid *))\nSDL_PROC(void, glViewport, (GLint, GLint, GLsizei, GLsizei))\nSDL_PROC_OES(void, glBindFramebufferOES, (GLenum, GLuint))\nSDL_PROC_OES(void, glFramebufferTexture2DOES, (GLenum, GLenum, GLenum, GLuint, GLint))\nSDL_PROC_OES(GLenum, glCheckFramebufferStatusOES, (GLenum))\nSDL_PROC(void, glPushMatrix, (void))\nSDL_PROC(void, glTranslatef, (GLfloat, GLfloat, GLfloat))\nSDL_PROC(void, glRotatef, (GLfloat, GLfloat, GLfloat, GLfloat))\nSDL_PROC(void, glPopMatrix, (void))\nSDL_PROC_OES(void, glDeleteFramebuffersOES, (GLsizei, const GLuint*))\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/opengles/SDL_render_gles.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_RENDER_OGL_ES && !SDL_RENDER_DISABLED\n\n#include \"SDL_hints.h\"\n#include \"SDL_opengles.h\"\n#include \"../SDL_sysrender.h\"\n\n/* To prevent unnecessary window recreation, \n * these should match the defaults selected in SDL_GL_ResetAttributes \n */\n\n#define RENDERER_CONTEXT_MAJOR 1\n#define RENDERER_CONTEXT_MINOR 1\n\n#if defined(SDL_VIDEO_DRIVER_PANDORA)\n\n/* Empty function stub to get OpenGL ES 1.x support without  */\n/* OpenGL ES extension GL_OES_draw_texture supported         */\nGL_API void GL_APIENTRY\nglDrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height)\n{\n    return;\n}\n\n#endif /* SDL_VIDEO_DRIVER_PANDORA */\n\n/* OpenGL ES 1.1 renderer implementation, based on the OpenGL renderer */\n\n/* Used to re-create the window with OpenGL ES capability */\nextern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);\n\nstatic const float inv255f = 1.0f / 255.0f;\n\nstatic SDL_Renderer *GLES_CreateRenderer(SDL_Window * window, Uint32 flags);\nstatic void GLES_WindowEvent(SDL_Renderer * renderer,\n                             const SDL_WindowEvent *event);\nstatic int GLES_GetOutputSize(SDL_Renderer * renderer, int *w, int *h);\nstatic int GLES_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic int GLES_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                              const SDL_Rect * rect, const void *pixels,\n                              int pitch);\nstatic int GLES_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                            const SDL_Rect * rect, void **pixels, int *pitch);\nstatic void GLES_UnlockTexture(SDL_Renderer * renderer,\n                               SDL_Texture * texture);\nstatic int GLES_SetRenderTarget(SDL_Renderer * renderer,\n                                 SDL_Texture * texture);\nstatic int GLES_UpdateViewport(SDL_Renderer * renderer);\nstatic int GLES_UpdateClipRect(SDL_Renderer * renderer);\nstatic int GLES_RenderClear(SDL_Renderer * renderer);\nstatic int GLES_RenderDrawPoints(SDL_Renderer * renderer,\n                                 const SDL_FPoint * points, int count);\nstatic int GLES_RenderDrawLines(SDL_Renderer * renderer,\n                                const SDL_FPoint * points, int count);\nstatic int GLES_RenderFillRects(SDL_Renderer * renderer,\n                                const SDL_FRect * rects, int count);\nstatic int GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,\n                           const SDL_Rect * srcrect,\n                           const SDL_FRect * dstrect);\nstatic int GLES_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n                         const SDL_Rect * srcrect, const SDL_FRect * dstrect,\n                         const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);\nstatic int GLES_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                    Uint32 pixel_format, void * pixels, int pitch);\nstatic void GLES_RenderPresent(SDL_Renderer * renderer);\nstatic void GLES_DestroyTexture(SDL_Renderer * renderer,\n                                SDL_Texture * texture);\nstatic void GLES_DestroyRenderer(SDL_Renderer * renderer);\nstatic int GLES_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh);\nstatic int GLES_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture);\n\ntypedef struct GLES_FBOList GLES_FBOList;\n\nstruct GLES_FBOList\n{\n   Uint32 w, h;\n   GLuint FBO;\n   GLES_FBOList *next;\n};\n\n\nSDL_RenderDriver GLES_RenderDriver = {\n    GLES_CreateRenderer,\n    {\n     \"opengles\",\n     (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC),\n     1,\n     {SDL_PIXELFORMAT_ABGR8888},\n     0,\n     0}\n};\n\ntypedef struct\n{\n    SDL_GLContext context;\n    struct {\n        Uint32 color;\n        int blendMode;\n        SDL_bool tex_coords;\n    } current;\n\n#define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;\n#define SDL_PROC_OES SDL_PROC\n#include \"SDL_glesfuncs.h\"\n#undef SDL_PROC\n#undef SDL_PROC_OES\n    SDL_bool GL_OES_framebuffer_object_supported;\n    GLES_FBOList *framebuffers;\n    GLuint window_framebuffer;\n\n    SDL_bool GL_OES_blend_func_separate_supported;\n} GLES_RenderData;\n\ntypedef struct\n{\n    GLuint texture;\n    GLenum type;\n    GLfloat texw;\n    GLfloat texh;\n    GLenum format;\n    GLenum formattype;\n    void *pixels;\n    int pitch;\n    GLES_FBOList *fbo;\n} GLES_TextureData;\n\nstatic int\nGLES_SetError(const char *prefix, GLenum result)\n{\n    const char *error;\n\n    switch (result) {\n    case GL_NO_ERROR:\n        error = \"GL_NO_ERROR\";\n        break;\n    case GL_INVALID_ENUM:\n        error = \"GL_INVALID_ENUM\";\n        break;\n    case GL_INVALID_VALUE:\n        error = \"GL_INVALID_VALUE\";\n        break;\n    case GL_INVALID_OPERATION:\n        error = \"GL_INVALID_OPERATION\";\n        break;\n    case GL_STACK_OVERFLOW:\n        error = \"GL_STACK_OVERFLOW\";\n        break;\n    case GL_STACK_UNDERFLOW:\n        error = \"GL_STACK_UNDERFLOW\";\n        break;\n    case GL_OUT_OF_MEMORY:\n        error = \"GL_OUT_OF_MEMORY\";\n        break;\n    default:\n        error = \"UNKNOWN\";\n        break;\n    }\n    return SDL_SetError(\"%s: %s\", prefix, error);\n}\n\nstatic int GLES_LoadFunctions(GLES_RenderData * data)\n{\n#if SDL_VIDEO_DRIVER_UIKIT\n#define __SDL_NOGETPROCADDR__\n#elif SDL_VIDEO_DRIVER_ANDROID\n#define __SDL_NOGETPROCADDR__\n#elif SDL_VIDEO_DRIVER_PANDORA\n#define __SDL_NOGETPROCADDR__\n#endif\n\n#ifdef __SDL_NOGETPROCADDR__\n#define SDL_PROC(ret,func,params) data->func=func;\n#define SDL_PROC_OES(ret,func,params) data->func=func;\n#else\n#define SDL_PROC(ret,func,params) \\\n    do { \\\n        data->func = SDL_GL_GetProcAddress(#func); \\\n        if ( ! data->func ) { \\\n            return SDL_SetError(\"Couldn't load GLES function %s: %s\\n\", #func, SDL_GetError()); \\\n        } \\\n    } while ( 0 );\n#define SDL_PROC_OES(ret,func,params) \\\n    do { \\\n        data->func = SDL_GL_GetProcAddress(#func); \\\n    } while ( 0 );    \n#endif /* __SDL_NOGETPROCADDR__ */\n\n#include \"SDL_glesfuncs.h\"\n#undef SDL_PROC\n#undef SDL_PROC_OES\n    return 0;\n}\n\nstatic SDL_GLContext SDL_CurrentContext = NULL;\n\nGLES_FBOList *\nGLES_GetFBO(GLES_RenderData *data, Uint32 w, Uint32 h)\n{\n   GLES_FBOList *result = data->framebuffers;\n   while ((result) && ((result->w != w) || (result->h != h)) ) {\n       result = result->next;\n   }\n   if (result == NULL) {\n       result = SDL_malloc(sizeof(GLES_FBOList));\n       result->w = w;\n       result->h = h;\n       data->glGenFramebuffersOES(1, &result->FBO);\n       result->next = data->framebuffers;\n       data->framebuffers = result;\n   }\n   return result;\n}\n\n\nstatic int\nGLES_ActivateRenderer(SDL_Renderer * renderer)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n\n    if (SDL_CurrentContext != data->context) {\n        if (SDL_GL_MakeCurrent(renderer->window, data->context) < 0) {\n            return -1;\n        }\n        SDL_CurrentContext = data->context;\n\n        GLES_UpdateViewport(renderer);\n    }\n    return 0;\n}\n\n/* This is called if we need to invalidate all of the SDL OpenGL state */\nstatic void\nGLES_ResetState(SDL_Renderer *renderer)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n\n    if (SDL_CurrentContext == data->context) {\n        GLES_UpdateViewport(renderer);\n    } else {\n        GLES_ActivateRenderer(renderer);\n    }\n\n    data->current.color = 0;\n    data->current.blendMode = -1;\n    data->current.tex_coords = SDL_FALSE;\n\n    data->glDisable(GL_DEPTH_TEST);\n    data->glDisable(GL_CULL_FACE);\n\n    data->glMatrixMode(GL_MODELVIEW);\n    data->glLoadIdentity();\n\n    data->glEnableClientState(GL_VERTEX_ARRAY);\n    data->glDisableClientState(GL_TEXTURE_COORD_ARRAY);\n}\n\nSDL_Renderer *\nGLES_CreateRenderer(SDL_Window * window, Uint32 flags)\n{\n\n    SDL_Renderer *renderer;\n    GLES_RenderData *data;\n    GLint value;\n    Uint32 window_flags;\n    int profile_mask = 0, major = 0, minor = 0;\n    SDL_bool changed_window = SDL_FALSE;\n\n    SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask);\n    SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major);\n    SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor);\n\n    window_flags = SDL_GetWindowFlags(window);\n    if (!(window_flags & SDL_WINDOW_OPENGL) ||\n        profile_mask != SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) {\n\n        changed_window = SDL_TRUE;\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, RENDERER_CONTEXT_MAJOR);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, RENDERER_CONTEXT_MINOR);\n\n        if (SDL_RecreateWindow(window, window_flags | SDL_WINDOW_OPENGL) < 0) {\n            goto error;\n        }\n    }\n\n    renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));\n    if (!renderer) {\n        SDL_OutOfMemory();\n        goto error;\n    }\n\n    data = (GLES_RenderData *) SDL_calloc(1, sizeof(*data));\n    if (!data) {\n        GLES_DestroyRenderer(renderer);\n        SDL_OutOfMemory();\n        goto error;\n    }\n\n    renderer->WindowEvent = GLES_WindowEvent;\n    renderer->GetOutputSize = GLES_GetOutputSize;\n    renderer->CreateTexture = GLES_CreateTexture;\n    renderer->UpdateTexture = GLES_UpdateTexture;\n    renderer->LockTexture = GLES_LockTexture;\n    renderer->UnlockTexture = GLES_UnlockTexture;\n    renderer->SetRenderTarget = GLES_SetRenderTarget;\n    renderer->UpdateViewport = GLES_UpdateViewport;\n    renderer->UpdateClipRect = GLES_UpdateClipRect;\n    renderer->RenderClear = GLES_RenderClear;\n    renderer->RenderDrawPoints = GLES_RenderDrawPoints;\n    renderer->RenderDrawLines = GLES_RenderDrawLines;\n    renderer->RenderFillRects = GLES_RenderFillRects;\n    renderer->RenderCopy = GLES_RenderCopy;\n    renderer->RenderCopyEx = GLES_RenderCopyEx;\n    renderer->RenderReadPixels = GLES_RenderReadPixels;\n    renderer->RenderPresent = GLES_RenderPresent;\n    renderer->DestroyTexture = GLES_DestroyTexture;\n    renderer->DestroyRenderer = GLES_DestroyRenderer;\n    renderer->GL_BindTexture = GLES_BindTexture;\n    renderer->GL_UnbindTexture = GLES_UnbindTexture;\n    renderer->info = GLES_RenderDriver.info;\n    renderer->info.flags = SDL_RENDERER_ACCELERATED;\n    renderer->driverdata = data;\n    renderer->window = window;\n\n    data->context = SDL_GL_CreateContext(window);\n    if (!data->context) {\n        GLES_DestroyRenderer(renderer);\n        goto error;\n    }\n    if (SDL_GL_MakeCurrent(window, data->context) < 0) {\n        GLES_DestroyRenderer(renderer);\n        goto error;\n    }\n\n    if (GLES_LoadFunctions(data) < 0) {\n        GLES_DestroyRenderer(renderer);\n        goto error;\n    }\n\n    if (flags & SDL_RENDERER_PRESENTVSYNC) {\n        SDL_GL_SetSwapInterval(1);\n    } else {\n        SDL_GL_SetSwapInterval(0);\n    }\n    if (SDL_GL_GetSwapInterval() > 0) {\n        renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;\n    }\n\n    value = 0;\n    data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);\n    renderer->info.max_texture_width = value;\n    value = 0;\n    data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);\n    renderer->info.max_texture_height = value;\n\n    /* Android does not report GL_OES_framebuffer_object but the functionality seems to be there anyway */\n    if (SDL_GL_ExtensionSupported(\"GL_OES_framebuffer_object\") || data->glGenFramebuffersOES) {\n        data->GL_OES_framebuffer_object_supported = SDL_TRUE;\n        renderer->info.flags |= SDL_RENDERER_TARGETTEXTURE;\n\n        value = 0;\n        data->glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &value);\n        data->window_framebuffer = (GLuint)value;\n    }\n    data->framebuffers = NULL;\n\n    if (SDL_GL_ExtensionSupported(\"GL_OES_blend_func_separate\")) {\n        data->GL_OES_blend_func_separate_supported = SDL_TRUE;\n    }\n\n    /* Set up parameters for rendering */\n    GLES_ResetState(renderer);\n\n    return renderer;\n\nerror:\n    if (changed_window) {\n        /* Uh oh, better try to put it back... */\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile_mask);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);\n        SDL_RecreateWindow(window, window_flags);\n    }\n    return NULL;\n}\n\nstatic void\nGLES_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n\n    if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED ||\n        event->event == SDL_WINDOWEVENT_SHOWN ||\n        event->event == SDL_WINDOWEVENT_HIDDEN) {\n        /* Rebind the context to the window area and update matrices */\n        SDL_CurrentContext = NULL;\n    }\n\n    if (event->event == SDL_WINDOWEVENT_MINIMIZED) {\n        /* According to Apple documentation, we need to finish drawing NOW! */\n        data->glFinish();\n    }\n}\n\nstatic int\nGLES_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)\n{\n    SDL_GL_GetDrawableSize(renderer->window, w, h);\n    return 0;\n}\n\nstatic SDL_INLINE int\npower_of_2(int input)\n{\n    int value = 1;\n\n    while (value < input) {\n        value <<= 1;\n    }\n    return value;\n}\n\nstatic GLenum\nGetScaleQuality(void)\n{\n    const char *hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY);\n\n    if (!hint || *hint == '0' || SDL_strcasecmp(hint, \"nearest\") == 0) {\n        return GL_NEAREST;\n    } else {\n        return GL_LINEAR;\n    }\n}\n\nstatic int\nGLES_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GLES_RenderData *renderdata = (GLES_RenderData *) renderer->driverdata;\n    GLES_TextureData *data;\n    GLint internalFormat;\n    GLenum format, type;\n    int texture_w, texture_h;\n    GLenum scaleMode;\n    GLenum result;\n\n    GLES_ActivateRenderer(renderer);\n\n    switch (texture->format) {\n    case SDL_PIXELFORMAT_ABGR8888:\n        internalFormat = GL_RGBA;\n        format = GL_RGBA;\n        type = GL_UNSIGNED_BYTE;\n        break;\n    default:\n        return SDL_SetError(\"Texture format not supported\");\n    }\n\n    data = (GLES_TextureData *) SDL_calloc(1, sizeof(*data));\n    if (!data) {\n        return SDL_OutOfMemory();\n    }\n\n    if (texture->access == SDL_TEXTUREACCESS_STREAMING) {\n        data->pitch = texture->w * SDL_BYTESPERPIXEL(texture->format);\n        data->pixels = SDL_calloc(1, texture->h * data->pitch);\n        if (!data->pixels) {\n            SDL_free(data);\n            return SDL_OutOfMemory();\n        }\n    }\n\n    \n    if (texture->access == SDL_TEXTUREACCESS_TARGET) {\n        if (!renderdata->GL_OES_framebuffer_object_supported) {\n            SDL_free(data);\n            return SDL_SetError(\"GL_OES_framebuffer_object not supported\");\n        }\n        data->fbo = GLES_GetFBO(renderer->driverdata, texture->w, texture->h);\n    } else {\n        data->fbo = NULL;\n    }\n    \n\n    renderdata->glGetError();\n    renderdata->glEnable(GL_TEXTURE_2D);\n    renderdata->glGenTextures(1, &data->texture);\n    result = renderdata->glGetError();\n    if (result != GL_NO_ERROR) {\n        if (texture->access == SDL_TEXTUREACCESS_STREAMING) {\n            SDL_free(data->pixels);\n        }\n        SDL_free(data);\n        return GLES_SetError(\"glGenTextures()\", result);\n    }\n\n    data->type = GL_TEXTURE_2D;\n    /* no NPOV textures allowed in OpenGL ES (yet) */\n    texture_w = power_of_2(texture->w);\n    texture_h = power_of_2(texture->h);\n    data->texw = (GLfloat) texture->w / texture_w;\n    data->texh = (GLfloat) texture->h / texture_h;\n\n    data->format = format;\n    data->formattype = type;\n    scaleMode = GetScaleQuality();\n    renderdata->glBindTexture(data->type, data->texture);\n    renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER, scaleMode);\n    renderdata->glTexParameteri(data->type, GL_TEXTURE_MAG_FILTER, scaleMode);\n    renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n    renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n\n    renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,\n                             texture_h, 0, format, type, NULL);\n    renderdata->glDisable(GL_TEXTURE_2D);\n\n    result = renderdata->glGetError();\n    if (result != GL_NO_ERROR) {\n        if (texture->access == SDL_TEXTUREACCESS_STREAMING) {\n            SDL_free(data->pixels);\n        }\n        SDL_free(data);\n        return GLES_SetError(\"glTexImage2D()\", result);\n    }\n    \n    texture->driverdata = data;\n    return 0;\n}\n\nstatic int\nGLES_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                   const SDL_Rect * rect, const void *pixels, int pitch)\n{\n    GLES_RenderData *renderdata = (GLES_RenderData *) renderer->driverdata;\n    GLES_TextureData *data = (GLES_TextureData *) texture->driverdata;\n    Uint8 *blob = NULL;\n    Uint8 *src;\n    int srcPitch;\n    int y;\n\n    GLES_ActivateRenderer(renderer);\n\n    /* Bail out if we're supposed to update an empty rectangle */\n    if (rect->w <= 0 || rect->h <= 0) {\n        return 0;\n    }\n\n    /* Reformat the texture data into a tightly packed array */\n    srcPitch = rect->w * SDL_BYTESPERPIXEL(texture->format);\n    src = (Uint8 *)pixels;\n    if (pitch != srcPitch) {\n        blob = (Uint8 *)SDL_malloc(srcPitch * rect->h);\n        if (!blob) {\n            return SDL_OutOfMemory();\n        }\n        src = blob;\n        for (y = 0; y < rect->h; ++y) {\n            SDL_memcpy(src, pixels, srcPitch);\n            src += srcPitch;\n            pixels = (Uint8 *)pixels + pitch;\n        }\n        src = blob;\n    }\n\n    /* Create a texture subimage with the supplied data */\n    renderdata->glGetError();\n    renderdata->glEnable(data->type);\n    renderdata->glBindTexture(data->type, data->texture);\n    renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n    renderdata->glTexSubImage2D(data->type,\n                    0,\n                    rect->x,\n                    rect->y,\n                    rect->w,\n                    rect->h,\n                    data->format,\n                    data->formattype,\n                    src);\n    renderdata->glDisable(data->type);\n    SDL_free(blob);\n\n    if (renderdata->glGetError() != GL_NO_ERROR) {\n        return SDL_SetError(\"Failed to update texture\");\n    }\n    return 0;\n}\n\nstatic int\nGLES_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                 const SDL_Rect * rect, void **pixels, int *pitch)\n{\n    GLES_TextureData *data = (GLES_TextureData *) texture->driverdata;\n\n    *pixels =\n        (void *) ((Uint8 *) data->pixels + rect->y * data->pitch +\n                  rect->x * SDL_BYTESPERPIXEL(texture->format));\n    *pitch = data->pitch;\n    return 0;\n}\n\nstatic void\nGLES_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GLES_TextureData *data = (GLES_TextureData *) texture->driverdata;\n    SDL_Rect rect;\n\n    /* We do whole texture updates, at least for now */\n    rect.x = 0;\n    rect.y = 0;\n    rect.w = texture->w;\n    rect.h = texture->h;\n    GLES_UpdateTexture(renderer, texture, &rect, data->pixels, data->pitch);\n}\n\nstatic int\nGLES_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n    GLES_TextureData *texturedata = NULL;\n    GLenum status;\n\n    GLES_ActivateRenderer(renderer);\n\n    if (!data->GL_OES_framebuffer_object_supported) {\n        return SDL_SetError(\"Can't enable render target support in this renderer\");\n    }\n\n    if (texture == NULL) {\n        data->glBindFramebufferOES(GL_FRAMEBUFFER_OES, data->window_framebuffer);\n        return 0;\n    }\n\n    texturedata = (GLES_TextureData *) texture->driverdata;\n    data->glBindFramebufferOES(GL_FRAMEBUFFER_OES, texturedata->fbo->FBO);\n    /* TODO: check if texture pixel format allows this operation */\n    data->glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, texturedata->type, texturedata->texture, 0);\n    /* Check FBO status */\n    status = data->glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);\n    if (status != GL_FRAMEBUFFER_COMPLETE_OES) {\n        return SDL_SetError(\"glFramebufferTexture2DOES() failed\");\n    }\n    return 0;\n}\n\nstatic int\nGLES_UpdateViewport(SDL_Renderer * renderer)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n\n    if (SDL_CurrentContext != data->context) {\n        /* We'll update the viewport after we rebind the context */\n        return 0;\n    }\n\n    if (renderer->target) {\n        data->glViewport(renderer->viewport.x, renderer->viewport.y,\n                         renderer->viewport.w, renderer->viewport.h);\n    } else {\n        int w, h;\n\n        SDL_GL_GetDrawableSize(renderer->window, &w, &h);\n        data->glViewport(renderer->viewport.x, (h - renderer->viewport.y - renderer->viewport.h),\n                         renderer->viewport.w, renderer->viewport.h);\n    }\n\n    data->glMatrixMode(GL_PROJECTION);\n    data->glLoadIdentity();\n    if (renderer->viewport.w && renderer->viewport.h) {\n        if (renderer->target) {\n            data->glOrthof((GLfloat) 0,\n                           (GLfloat) renderer->viewport.w,\n                           (GLfloat) 0,\n                           (GLfloat) renderer->viewport.h,\n                           0.0, 1.0);\n        } else {\n            data->glOrthof((GLfloat) 0,\n                           (GLfloat) renderer->viewport.w,\n                           (GLfloat) renderer->viewport.h,\n                           (GLfloat) 0,\n                           0.0, 1.0);\n        }\n    }\n    return 0;\n}\n\nstatic int\nGLES_UpdateClipRect(SDL_Renderer * renderer)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n\n    if (SDL_CurrentContext != data->context) {\n        /* We'll update the clip rect after we rebind the context */\n        return 0;\n    }\n\n    if (renderer->clipping_enabled) {\n        const SDL_Rect *rect = &renderer->clip_rect;\n        data->glEnable(GL_SCISSOR_TEST);\n        if (renderer->target) {\n            data->glScissor(renderer->viewport.x + rect->x, renderer->viewport.y + rect->y, rect->w, rect->h);\n        } else {\n            int w, h;\n\n            SDL_GL_GetDrawableSize(renderer->window, &w, &h);\n            data->glScissor(renderer->viewport.x + rect->x, h - renderer->viewport.y - rect->y - rect->h, rect->w, rect->h);\n        }\n    } else {\n        data->glDisable(GL_SCISSOR_TEST);\n    }\n    return 0;\n}\n\nstatic void\nGLES_SetColor(GLES_RenderData * data, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);\n\n    if (color != data->current.color) {\n        data->glColor4f((GLfloat) r * inv255f,\n                        (GLfloat) g * inv255f,\n                        (GLfloat) b * inv255f,\n                        (GLfloat) a * inv255f);\n        data->current.color = color;\n    }\n}\n\nstatic void\nGLES_SetBlendMode(GLES_RenderData * data, int blendMode)\n{\n    if (blendMode != data->current.blendMode) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_NONE:\n            data->glDisable(GL_BLEND);\n            break;\n        case SDL_BLENDMODE_BLEND:\n            data->glEnable(GL_BLEND);\n            if (data->GL_OES_blend_func_separate_supported) {\n                data->glBlendFuncSeparateOES(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);\n            } else {\n                data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n            }\n            break;\n        case SDL_BLENDMODE_ADD:\n            data->glEnable(GL_BLEND);\n            if (data->GL_OES_blend_func_separate_supported) {\n                data->glBlendFuncSeparateOES(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);\n            } else {\n                data->glBlendFunc(GL_SRC_ALPHA, GL_ONE);\n            }\n            break;\n        case SDL_BLENDMODE_MOD:\n            data->glEnable(GL_BLEND);\n            if (data->GL_OES_blend_func_separate_supported) {\n                data->glBlendFuncSeparateOES(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE);\n            } else {\n                data->glBlendFunc(GL_ZERO, GL_SRC_COLOR);\n            }\n            break;\n        }\n        data->current.blendMode = blendMode;\n    }\n}\n\nstatic void\nGLES_SetTexCoords(GLES_RenderData * data, SDL_bool enabled)\n{\n    if (enabled != data->current.tex_coords) {\n        if (enabled) {\n            data->glEnableClientState(GL_TEXTURE_COORD_ARRAY);\n        } else {\n            data->glDisableClientState(GL_TEXTURE_COORD_ARRAY);\n        }\n        data->current.tex_coords = enabled;\n    }\n}\n\nstatic void\nGLES_SetDrawingState(SDL_Renderer * renderer)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n\n    GLES_ActivateRenderer(renderer);\n\n    GLES_SetColor(data, (GLfloat) renderer->r,\n                        (GLfloat) renderer->g,\n                        (GLfloat) renderer->b,\n                        (GLfloat) renderer->a);\n\n    GLES_SetBlendMode(data, renderer->blendMode);\n\n    GLES_SetTexCoords(data, SDL_FALSE);\n}\n\nstatic int\nGLES_RenderClear(SDL_Renderer * renderer)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n\n    GLES_ActivateRenderer(renderer);\n\n    data->glClearColor((GLfloat) renderer->r * inv255f,\n                 (GLfloat) renderer->g * inv255f,\n                 (GLfloat) renderer->b * inv255f,\n                 (GLfloat) renderer->a * inv255f);\n    \n    if (renderer->clipping_enabled) {\n        data->glDisable(GL_SCISSOR_TEST);\n    }\n\n    data->glClear(GL_COLOR_BUFFER_BIT);\n\n    if (renderer->clipping_enabled) {\n        data->glEnable(GL_SCISSOR_TEST);\n    }\n\n    return 0;\n}\n\nstatic int\nGLES_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points,\n                      int count)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n    GLfloat *vertices;\n    int idx;\n\n    GLES_SetDrawingState(renderer);\n\n    /* Emit the specified vertices as points */\n    vertices = SDL_stack_alloc(GLfloat, count * 2);\n    for (idx = 0; idx < count; ++idx) {\n        GLfloat x = points[idx].x + 0.5f;\n        GLfloat y = points[idx].y + 0.5f;\n\n        vertices[idx * 2] = x;\n        vertices[(idx * 2) + 1] = y;\n    }\n\n    data->glVertexPointer(2, GL_FLOAT, 0, vertices);\n    data->glDrawArrays(GL_POINTS, 0, count);\n    SDL_stack_free(vertices);\n    return 0;\n}\n\nstatic int\nGLES_RenderDrawLines(SDL_Renderer * renderer, const SDL_FPoint * points,\n                     int count)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n    GLfloat *vertices;\n    int idx;\n\n    GLES_SetDrawingState(renderer);\n\n    /* Emit a line strip including the specified vertices */\n    vertices = SDL_stack_alloc(GLfloat, count * 2);\n    for (idx = 0; idx < count; ++idx) {\n        GLfloat x = points[idx].x + 0.5f;\n        GLfloat y = points[idx].y + 0.5f;\n\n        vertices[idx * 2] = x;\n        vertices[(idx * 2) + 1] = y;\n    }\n\n    data->glVertexPointer(2, GL_FLOAT, 0, vertices);\n    if (count > 2 &&\n        points[0].x == points[count-1].x && points[0].y == points[count-1].y) {\n        /* GL_LINE_LOOP takes care of the final segment */\n        --count;\n        data->glDrawArrays(GL_LINE_LOOP, 0, count);\n    } else {\n        data->glDrawArrays(GL_LINE_STRIP, 0, count);\n        /* We need to close the endpoint of the line */\n        data->glDrawArrays(GL_POINTS, count-1, 1);\n    }\n    SDL_stack_free(vertices);\n\n    return 0;\n}\n\nstatic int\nGLES_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects,\n                     int count)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n    int i;\n\n    GLES_SetDrawingState(renderer);\n\n    for (i = 0; i < count; ++i) {\n        const SDL_FRect *rect = &rects[i];\n        GLfloat minx = rect->x;\n        GLfloat maxx = rect->x + rect->w;\n        GLfloat miny = rect->y;\n        GLfloat maxy = rect->y + rect->h;\n        GLfloat vertices[8];\n        vertices[0] = minx;\n        vertices[1] = miny;\n        vertices[2] = maxx;\n        vertices[3] = miny;\n        vertices[4] = minx;\n        vertices[5] = maxy;\n        vertices[6] = maxx;\n        vertices[7] = maxy;\n\n        data->glVertexPointer(2, GL_FLOAT, 0, vertices);\n        data->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n    }\n\n    return 0;\n}\n\nstatic int\nGLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,\n                const SDL_Rect * srcrect, const SDL_FRect * dstrect)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n    GLES_TextureData *texturedata = (GLES_TextureData *) texture->driverdata;\n    GLfloat minx, miny, maxx, maxy;\n    GLfloat minu, maxu, minv, maxv;\n    GLfloat vertices[8];\n    GLfloat texCoords[8];\n\n    GLES_ActivateRenderer(renderer);\n\n    data->glEnable(GL_TEXTURE_2D);\n\n    data->glBindTexture(texturedata->type, texturedata->texture);\n\n    if (texture->modMode) {\n        GLES_SetColor(data, texture->r, texture->g, texture->b, texture->a);\n    } else {\n        GLES_SetColor(data, 255, 255, 255, 255);\n    }\n\n    GLES_SetBlendMode(data, texture->blendMode);\n\n    GLES_SetTexCoords(data, SDL_TRUE);\n\n    minx = dstrect->x;\n    miny = dstrect->y;\n    maxx = dstrect->x + dstrect->w;\n    maxy = dstrect->y + dstrect->h;\n\n    minu = (GLfloat) srcrect->x / texture->w;\n    minu *= texturedata->texw;\n    maxu = (GLfloat) (srcrect->x + srcrect->w) / texture->w;\n    maxu *= texturedata->texw;\n    minv = (GLfloat) srcrect->y / texture->h;\n    minv *= texturedata->texh;\n    maxv = (GLfloat) (srcrect->y + srcrect->h) / texture->h;\n    maxv *= texturedata->texh;\n\n    vertices[0] = minx;\n    vertices[1] = miny;\n    vertices[2] = maxx;\n    vertices[3] = miny;\n    vertices[4] = minx;\n    vertices[5] = maxy;\n    vertices[6] = maxx;\n    vertices[7] = maxy;\n\n    texCoords[0] = minu;\n    texCoords[1] = minv;\n    texCoords[2] = maxu;\n    texCoords[3] = minv;\n    texCoords[4] = minu;\n    texCoords[5] = maxv;\n    texCoords[6] = maxu;\n    texCoords[7] = maxv;\n\n    data->glVertexPointer(2, GL_FLOAT, 0, vertices);\n    data->glTexCoordPointer(2, GL_FLOAT, 0, texCoords);\n    data->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n\n    data->glDisable(GL_TEXTURE_2D);\n\n    return 0;\n}\n\nstatic int\nGLES_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n                const SDL_Rect * srcrect, const SDL_FRect * dstrect,\n                const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)\n{\n\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n    GLES_TextureData *texturedata = (GLES_TextureData *) texture->driverdata;\n    GLfloat minx, miny, maxx, maxy;\n    GLfloat minu, maxu, minv, maxv;\n    GLfloat centerx, centery;\n    GLfloat vertices[8];\n    GLfloat texCoords[8];\n\n\n    GLES_ActivateRenderer(renderer);\n\n    data->glEnable(GL_TEXTURE_2D);\n\n    data->glBindTexture(texturedata->type, texturedata->texture);\n\n    if (texture->modMode) {\n        GLES_SetColor(data, texture->r, texture->g, texture->b, texture->a);\n    } else {\n        GLES_SetColor(data, 255, 255, 255, 255);\n    }\n\n    GLES_SetBlendMode(data, texture->blendMode);\n\n    GLES_SetTexCoords(data, SDL_TRUE);\n\n    centerx = center->x;\n    centery = center->y;\n\n    /* Rotate and translate */\n    data->glPushMatrix();\n    data->glTranslatef(dstrect->x + centerx, dstrect->y + centery, 0.0f);\n    data->glRotatef((GLfloat)angle, 0.0f, 0.0f, 1.0f);\n\n    if (flip & SDL_FLIP_HORIZONTAL) {\n        minx =  dstrect->w - centerx;\n        maxx = -centerx;\n    } else {\n        minx = -centerx;\n        maxx = dstrect->w - centerx;\n    }\n\n    if (flip & SDL_FLIP_VERTICAL) {\n        miny = dstrect->h - centery;\n        maxy = -centery;\n    } else {\n        miny = -centery;\n        maxy = dstrect->h - centery;\n    }\n\n    minu = (GLfloat) srcrect->x / texture->w;\n    minu *= texturedata->texw;\n    maxu = (GLfloat) (srcrect->x + srcrect->w) / texture->w;\n    maxu *= texturedata->texw;\n    minv = (GLfloat) srcrect->y / texture->h;\n    minv *= texturedata->texh;\n    maxv = (GLfloat) (srcrect->y + srcrect->h) / texture->h;\n    maxv *= texturedata->texh;\n\n    vertices[0] = minx;\n    vertices[1] = miny;\n    vertices[2] = maxx;\n    vertices[3] = miny;\n    vertices[4] = minx;\n    vertices[5] = maxy;\n    vertices[6] = maxx;\n    vertices[7] = maxy;\n\n    texCoords[0] = minu;\n    texCoords[1] = minv;\n    texCoords[2] = maxu;\n    texCoords[3] = minv;\n    texCoords[4] = minu;\n    texCoords[5] = maxv;\n    texCoords[6] = maxu;\n    texCoords[7] = maxv;\n    data->glVertexPointer(2, GL_FLOAT, 0, vertices);\n    data->glTexCoordPointer(2, GL_FLOAT, 0, texCoords);\n    data->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n    data->glPopMatrix();\n    data->glDisable(GL_TEXTURE_2D);\n\n    return 0;\n}\n\nstatic int\nGLES_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                    Uint32 pixel_format, void * pixels, int pitch)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n    Uint32 temp_format = renderer->target ? renderer->target->format : SDL_PIXELFORMAT_ABGR8888;\n    void *temp_pixels;\n    int temp_pitch;\n    Uint8 *src, *dst, *tmp;\n    int w, h, length, rows;\n    int status;\n\n    GLES_ActivateRenderer(renderer);\n\n    temp_pitch = rect->w * SDL_BYTESPERPIXEL(temp_format);\n    temp_pixels = SDL_malloc(rect->h * temp_pitch);\n    if (!temp_pixels) {\n        return SDL_OutOfMemory();\n    }\n\n    SDL_GetRendererOutputSize(renderer, &w, &h);\n\n    data->glPixelStorei(GL_PACK_ALIGNMENT, 1);\n\n    data->glReadPixels(rect->x, renderer->target ? rect->y : (h-rect->y)-rect->h,\n                       rect->w, rect->h, GL_RGBA, GL_UNSIGNED_BYTE, temp_pixels);\n\n    /* Flip the rows to be top-down if necessary */\n    if (!renderer->target) {\n        length = rect->w * SDL_BYTESPERPIXEL(temp_format);\n        src = (Uint8*)temp_pixels + (rect->h-1)*temp_pitch;\n        dst = (Uint8*)temp_pixels;\n        tmp = SDL_stack_alloc(Uint8, length);\n        rows = rect->h / 2;\n        while (rows--) {\n            SDL_memcpy(tmp, dst, length);\n            SDL_memcpy(dst, src, length);\n            SDL_memcpy(src, tmp, length);\n            dst += temp_pitch;\n            src -= temp_pitch;\n        }\n        SDL_stack_free(tmp);\n    }\n\n    status = SDL_ConvertPixels(rect->w, rect->h,\n                               temp_format, temp_pixels, temp_pitch,\n                               pixel_format, pixels, pitch);\n    SDL_free(temp_pixels);\n\n    return status;\n}\n\nstatic void\nGLES_RenderPresent(SDL_Renderer * renderer)\n{\n    GLES_ActivateRenderer(renderer);\n\n    SDL_GL_SwapWindow(renderer->window);\n}\n\nstatic void\nGLES_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GLES_RenderData *renderdata = (GLES_RenderData *) renderer->driverdata;\n\n    GLES_TextureData *data = (GLES_TextureData *) texture->driverdata;\n\n    GLES_ActivateRenderer(renderer);\n\n    if (!data) {\n        return;\n    }\n    if (data->texture) {\n        renderdata->glDeleteTextures(1, &data->texture);\n    }\n    SDL_free(data->pixels);\n    SDL_free(data);\n    texture->driverdata = NULL;\n}\n\nstatic void\nGLES_DestroyRenderer(SDL_Renderer * renderer)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n\n    if (data) {\n        if (data->context) {\n            while (data->framebuffers) {\n               GLES_FBOList *nextnode = data->framebuffers->next;\n               data->glDeleteFramebuffersOES(1, &data->framebuffers->FBO);\n               SDL_free(data->framebuffers);\n               data->framebuffers = nextnode;\n            }\n            SDL_GL_DeleteContext(data->context);\n        }\n        SDL_free(data);\n    }\n    SDL_free(renderer);\n}\n\nstatic int GLES_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n    GLES_TextureData *texturedata = (GLES_TextureData *) texture->driverdata;\n    GLES_ActivateRenderer(renderer);\n\n    data->glEnable(GL_TEXTURE_2D);\n    data->glBindTexture(texturedata->type, texturedata->texture);\n\n    if (texw) {\n        *texw = (float)texturedata->texw;\n    }\n    if (texh) {\n        *texh = (float)texturedata->texh;\n    }\n\n    return 0;\n}\n\nstatic int GLES_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture)\n{\n    GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;\n    GLES_TextureData *texturedata = (GLES_TextureData *) texture->driverdata;\n    GLES_ActivateRenderer(renderer);\n    data->glDisable(texturedata->type);\n\n    return 0;\n}\n\n#endif /* SDL_VIDEO_RENDER_OGL_ES && !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/opengles2/SDL_gles2funcs.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\nSDL_PROC(void, glActiveTexture, (GLenum))\nSDL_PROC(void, glAttachShader, (GLuint, GLuint))\nSDL_PROC(void, glBindAttribLocation, (GLuint, GLuint, const char *))\nSDL_PROC(void, glBindTexture, (GLenum, GLuint))\nSDL_PROC(void, glBlendFuncSeparate, (GLenum, GLenum, GLenum, GLenum))\nSDL_PROC(void, glClear, (GLbitfield))\nSDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf))\nSDL_PROC(void, glCompileShader, (GLuint))\nSDL_PROC(GLuint, glCreateProgram, (void))\nSDL_PROC(GLuint, glCreateShader, (GLenum))\nSDL_PROC(void, glDeleteProgram, (GLuint))\nSDL_PROC(void, glDeleteShader, (GLuint))\nSDL_PROC(void, glDeleteTextures, (GLsizei, const GLuint *))\nSDL_PROC(void, glDisable, (GLenum))\nSDL_PROC(void, glDisableVertexAttribArray, (GLuint))\nSDL_PROC(void, glDrawArrays, (GLenum, GLint, GLsizei))\nSDL_PROC(void, glEnable, (GLenum))\nSDL_PROC(void, glEnableVertexAttribArray, (GLuint))\nSDL_PROC(void, glFinish, (void))\nSDL_PROC(void, glGenFramebuffers, (GLsizei, GLuint *))\nSDL_PROC(void, glGenTextures, (GLsizei, GLuint *))\nSDL_PROC(void, glGetBooleanv, (GLenum, GLboolean *))\nSDL_PROC(const GLubyte *, glGetString, (GLenum))\nSDL_PROC(GLenum, glGetError, (void))\nSDL_PROC(void, glGetIntegerv, (GLenum, GLint *))\nSDL_PROC(void, glGetProgramiv, (GLuint, GLenum, GLint *))\nSDL_PROC(void, glGetShaderInfoLog, (GLuint, GLsizei, GLsizei *, char *))\nSDL_PROC(void, glGetShaderiv, (GLuint, GLenum, GLint *))\nSDL_PROC(GLint, glGetUniformLocation, (GLuint, const char *))\nSDL_PROC(void, glLinkProgram, (GLuint))\nSDL_PROC(void, glPixelStorei, (GLenum, GLint))\nSDL_PROC(void, glReadPixels, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*))\nSDL_PROC(void, glScissor, (GLint, GLint, GLsizei, GLsizei))\nSDL_PROC(void, glShaderBinary, (GLsizei, const GLuint *, GLenum, const void *, GLsizei))\nSDL_PROC(void, glShaderSource, (GLuint, GLsizei, const GLchar* const*, const GLint *))\nSDL_PROC(void, glTexImage2D, (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *))\nSDL_PROC(void, glTexParameteri, (GLenum, GLenum, GLint))\nSDL_PROC(void, glTexSubImage2D, (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *))\nSDL_PROC(void, glUniform1i, (GLint, GLint))\nSDL_PROC(void, glUniform4f, (GLint, GLfloat, GLfloat, GLfloat, GLfloat))\nSDL_PROC(void, glUniformMatrix4fv, (GLint, GLsizei, GLboolean, const GLfloat *))\nSDL_PROC(void, glUseProgram, (GLuint))\nSDL_PROC(void, glVertexAttribPointer, (GLuint, GLint, GLenum, GLboolean, GLsizei, const void *))\nSDL_PROC(void, glViewport, (GLint, GLint, GLsizei, GLsizei))\nSDL_PROC(void, glBindFramebuffer, (GLenum, GLuint))\nSDL_PROC(void, glFramebufferTexture2D, (GLenum, GLenum, GLenum, GLuint, GLint))\nSDL_PROC(GLenum, glCheckFramebufferStatus, (GLenum))\nSDL_PROC(void, glDeleteFramebuffers, (GLsizei, const GLuint *))\nSDL_PROC(GLint, glGetAttribLocation, (GLuint, const GLchar *))\nSDL_PROC(void, glGetProgramInfoLog, (GLuint, GLsizei, GLsizei*, GLchar*))\nSDL_PROC(void, glGenBuffers, (GLsizei, GLuint *))\nSDL_PROC(void, glBindBuffer, (GLenum, GLuint))\nSDL_PROC(void, glBufferData, (GLenum, GLsizeiptr, const GLvoid *, GLenum))\nSDL_PROC(void, glBufferSubData, (GLenum, GLintptr, GLsizeiptr, const GLvoid *))\n"
  },
  {
    "path": "libs/SDL2/src/render/opengles2/SDL_render_gles2.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_RENDER_OGL_ES2 && !SDL_RENDER_DISABLED\n\n#include \"SDL_hints.h\"\n#include \"SDL_opengles2.h\"\n#include \"../SDL_sysrender.h\"\n#include \"../../video/SDL_blit.h\"\n#include \"SDL_shaders_gles2.h\"\n\n/* !!! FIXME: Emscripten makes these into WebGL calls, and WebGL doesn't offer\n   !!! FIXME:  client-side arrays (without an Emscripten compatibility hack,\n   !!! FIXME:  at least), but the current VBO code here is dramatically\n   !!! FIXME:  slower on actual iOS devices, even though the iOS Simulator\n   !!! FIXME:  is okay. Some time after 2.0.4 ships, we should revisit this,\n   !!! FIXME:  fix the performance bottleneck, and make everything use VBOs.\n*/\n#ifdef __EMSCRIPTEN__\n#define SDL_GLES2_USE_VBOS 1\n#else\n#define SDL_GLES2_USE_VBOS 0\n#endif\n\n/* To prevent unnecessary window recreation,\n * these should match the defaults selected in SDL_GL_ResetAttributes \n */\n#define RENDERER_CONTEXT_MAJOR 2\n#define RENDERER_CONTEXT_MINOR 0\n\n/* Used to re-create the window with OpenGL ES capability */\nextern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);\n\n/*************************************************************************************************\n * Bootstrap data                                                                                *\n *************************************************************************************************/\n\nstatic SDL_Renderer *GLES2_CreateRenderer(SDL_Window *window, Uint32 flags);\n\nSDL_RenderDriver GLES2_RenderDriver = {\n    GLES2_CreateRenderer,\n    {\n        \"opengles2\",\n        (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),\n        4,\n        {\n        SDL_PIXELFORMAT_ARGB8888,\n        SDL_PIXELFORMAT_ABGR8888,\n        SDL_PIXELFORMAT_RGB888,\n        SDL_PIXELFORMAT_BGR888\n        },\n        0,\n        0\n    }\n};\n\n/*************************************************************************************************\n * Context structures                                                                            *\n *************************************************************************************************/\n\ntypedef struct GLES2_FBOList GLES2_FBOList;\n\nstruct GLES2_FBOList\n{\n   Uint32 w, h;\n   GLuint FBO;\n   GLES2_FBOList *next;\n};\n\ntypedef struct GLES2_TextureData\n{\n    GLenum texture;\n    GLenum texture_type;\n    GLenum pixel_format;\n    GLenum pixel_type;\n    void *pixel_data;\n    int pitch;\n    /* YUV texture support */\n    SDL_bool yuv;\n    SDL_bool nv12;\n    GLenum texture_v;\n    GLenum texture_u;\n    GLES2_FBOList *fbo;\n} GLES2_TextureData;\n\ntypedef struct GLES2_ShaderCacheEntry\n{\n    GLuint id;\n    GLES2_ShaderType type;\n    const GLES2_ShaderInstance *instance;\n    int references;\n    Uint8 modulation_r, modulation_g, modulation_b, modulation_a;\n    struct GLES2_ShaderCacheEntry *prev;\n    struct GLES2_ShaderCacheEntry *next;\n} GLES2_ShaderCacheEntry;\n\ntypedef struct GLES2_ShaderCache\n{\n    int count;\n    GLES2_ShaderCacheEntry *head;\n} GLES2_ShaderCache;\n\ntypedef struct GLES2_ProgramCacheEntry\n{\n    GLuint id;\n    SDL_BlendMode blend_mode;\n    GLES2_ShaderCacheEntry *vertex_shader;\n    GLES2_ShaderCacheEntry *fragment_shader;\n    GLuint uniform_locations[16];\n    Uint8 color_r, color_g, color_b, color_a;\n    Uint8 modulation_r, modulation_g, modulation_b, modulation_a;\n    GLfloat projection[4][4];\n    struct GLES2_ProgramCacheEntry *prev;\n    struct GLES2_ProgramCacheEntry *next;\n} GLES2_ProgramCacheEntry;\n\ntypedef struct GLES2_ProgramCache\n{\n    int count;\n    GLES2_ProgramCacheEntry *head;\n    GLES2_ProgramCacheEntry *tail;\n} GLES2_ProgramCache;\n\ntypedef enum\n{\n    GLES2_ATTRIBUTE_POSITION = 0,\n    GLES2_ATTRIBUTE_TEXCOORD = 1,\n    GLES2_ATTRIBUTE_ANGLE = 2,\n    GLES2_ATTRIBUTE_CENTER = 3,\n} GLES2_Attribute;\n\ntypedef enum\n{\n    GLES2_UNIFORM_PROJECTION,\n    GLES2_UNIFORM_TEXTURE,\n    GLES2_UNIFORM_MODULATION,\n    GLES2_UNIFORM_COLOR,\n    GLES2_UNIFORM_TEXTURE_U,\n    GLES2_UNIFORM_TEXTURE_V\n} GLES2_Uniform;\n\ntypedef enum\n{\n    GLES2_IMAGESOURCE_SOLID,\n    GLES2_IMAGESOURCE_TEXTURE_ABGR,\n    GLES2_IMAGESOURCE_TEXTURE_ARGB,\n    GLES2_IMAGESOURCE_TEXTURE_RGB,\n    GLES2_IMAGESOURCE_TEXTURE_BGR,\n    GLES2_IMAGESOURCE_TEXTURE_YUV,\n    GLES2_IMAGESOURCE_TEXTURE_NV12,\n    GLES2_IMAGESOURCE_TEXTURE_NV21\n} GLES2_ImageSource;\n\ntypedef struct GLES2_DriverContext\n{\n    SDL_GLContext *context;\n\n    SDL_bool debug_enabled;\n\n    struct {\n        int blendMode;\n        SDL_bool tex_coords;\n    } current;\n\n#define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;\n#include \"SDL_gles2funcs.h\"\n#undef SDL_PROC\n    GLES2_FBOList *framebuffers;\n    GLuint window_framebuffer;\n\n    int shader_format_count;\n    GLenum *shader_formats;\n    GLES2_ShaderCache shader_cache;\n    GLES2_ProgramCache program_cache;\n    GLES2_ProgramCacheEntry *current_program;\n    Uint8 clear_r, clear_g, clear_b, clear_a;\n\n#if SDL_GLES2_USE_VBOS\n    GLuint vertex_buffers[4];\n    GLsizeiptr vertex_buffer_size[4];\n#endif\n} GLES2_DriverContext;\n\n#define GLES2_MAX_CACHED_PROGRAMS 8\n\n\nSDL_FORCE_INLINE const char*\nGL_TranslateError (GLenum error)\n{\n#define GL_ERROR_TRANSLATE(e) case e: return #e;\n    switch (error) {\n    GL_ERROR_TRANSLATE(GL_INVALID_ENUM)\n    GL_ERROR_TRANSLATE(GL_INVALID_VALUE)\n    GL_ERROR_TRANSLATE(GL_INVALID_OPERATION)\n    GL_ERROR_TRANSLATE(GL_OUT_OF_MEMORY)\n    GL_ERROR_TRANSLATE(GL_NO_ERROR)\n    default:\n        return \"UNKNOWN\";\n}\n#undef GL_ERROR_TRANSLATE\n}\n\nSDL_FORCE_INLINE void\nGL_ClearErrors(SDL_Renderer *renderer)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *) renderer->driverdata;\n\n    if (!data->debug_enabled) {\n        return;\n    }\n    while (data->glGetError() != GL_NO_ERROR) {\n        continue;\n    }\n}\n\nSDL_FORCE_INLINE int\nGL_CheckAllErrors (const char *prefix, SDL_Renderer *renderer, const char *file, int line, const char *function)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *) renderer->driverdata;\n    int ret = 0;\n\n    if (!data->debug_enabled) {\n        return 0;\n    }\n    /* check gl errors (can return multiple errors) */\n    for (;;) {\n        GLenum error = data->glGetError();\n        if (error != GL_NO_ERROR) {\n            if (prefix == NULL || prefix[0] == '\\0') {\n                prefix = \"generic\";\n            }\n            SDL_SetError(\"%s: %s (%d): %s %s (0x%X)\", prefix, file, line, function, GL_TranslateError(error), error);\n            ret = -1;\n        } else {\n            break;\n        }\n    }\n    return ret;\n}\n\n#if 0\n#define GL_CheckError(prefix, renderer)\n#elif defined(_MSC_VER)\n#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __FUNCTION__)\n#else\n#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __PRETTY_FUNCTION__)\n#endif\n\n\n/*************************************************************************************************\n * Renderer state APIs                                                                           *\n *************************************************************************************************/\n\nstatic int GLES2_ActivateRenderer(SDL_Renderer *renderer);\nstatic void GLES2_WindowEvent(SDL_Renderer * renderer,\n                              const SDL_WindowEvent *event);\nstatic int GLES2_UpdateViewport(SDL_Renderer * renderer);\nstatic void GLES2_DestroyRenderer(SDL_Renderer *renderer);\nstatic int GLES2_SetOrthographicProjection(SDL_Renderer *renderer);\n\n\nstatic SDL_GLContext SDL_CurrentContext = NULL;\n\nstatic int GLES2_LoadFunctions(GLES2_DriverContext * data)\n{\n#if SDL_VIDEO_DRIVER_UIKIT\n#define __SDL_NOGETPROCADDR__\n#elif SDL_VIDEO_DRIVER_ANDROID\n#define __SDL_NOGETPROCADDR__\n#elif SDL_VIDEO_DRIVER_PANDORA\n#define __SDL_NOGETPROCADDR__\n#endif\n\n#if defined __SDL_NOGETPROCADDR__\n#define SDL_PROC(ret,func,params) data->func=func;\n#else\n#define SDL_PROC(ret,func,params) \\\n    do { \\\n        data->func = SDL_GL_GetProcAddress(#func); \\\n        if ( ! data->func ) { \\\n            return SDL_SetError(\"Couldn't load GLES2 function %s: %s\\n\", #func, SDL_GetError()); \\\n        } \\\n    } while ( 0 );\n#endif /* __SDL_NOGETPROCADDR__ */\n\n#include \"SDL_gles2funcs.h\"\n#undef SDL_PROC\n    return 0;\n}\n\nGLES2_FBOList *\nGLES2_GetFBO(GLES2_DriverContext *data, Uint32 w, Uint32 h)\n{\n   GLES2_FBOList *result = data->framebuffers;\n   while ((result) && ((result->w != w) || (result->h != h)) ) {\n       result = result->next;\n   }\n   if (result == NULL) {\n       result = SDL_malloc(sizeof(GLES2_FBOList));\n       result->w = w;\n       result->h = h;\n       data->glGenFramebuffers(1, &result->FBO);\n       result->next = data->framebuffers;\n       data->framebuffers = result;\n   }\n   return result;\n}\n\nstatic int\nGLES2_ActivateRenderer(SDL_Renderer * renderer)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n\n    if (SDL_CurrentContext != data->context) {\n        /* Null out the current program to ensure we set it again */\n        data->current_program = NULL;\n\n        if (SDL_GL_MakeCurrent(renderer->window, data->context) < 0) {\n            return -1;\n        }\n        SDL_CurrentContext = data->context;\n\n        GLES2_UpdateViewport(renderer);\n    }\n\n    GL_ClearErrors(renderer);\n\n    return 0;\n}\n\nstatic void\nGLES2_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n\n    if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED ||\n        event->event == SDL_WINDOWEVENT_SHOWN ||\n        event->event == SDL_WINDOWEVENT_HIDDEN) {\n        /* Rebind the context to the window area */\n        SDL_CurrentContext = NULL;\n    }\n\n    if (event->event == SDL_WINDOWEVENT_MINIMIZED) {\n        /* According to Apple documentation, we need to finish drawing NOW! */\n        data->glFinish();\n    }\n}\n\nstatic int\nGLES2_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)\n{\n    SDL_GL_GetDrawableSize(renderer->window, w, h);\n    return 0;\n}\n\nstatic int\nGLES2_UpdateViewport(SDL_Renderer * renderer)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n\n    if (SDL_CurrentContext != data->context) {\n        /* We'll update the viewport after we rebind the context */\n        return 0;\n    }\n\n    if (renderer->target) {\n        data->glViewport(renderer->viewport.x, renderer->viewport.y,\n                         renderer->viewport.w, renderer->viewport.h);\n    } else {\n        int w, h;\n\n        SDL_GL_GetDrawableSize(renderer->window, &w, &h);\n        data->glViewport(renderer->viewport.x, (h - renderer->viewport.y - renderer->viewport.h),\n                         renderer->viewport.w, renderer->viewport.h);\n    }\n\n    if (data->current_program) {\n        GLES2_SetOrthographicProjection(renderer);\n    }\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGLES2_UpdateClipRect(SDL_Renderer * renderer)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n\n    if (SDL_CurrentContext != data->context) {\n        /* We'll update the clip rect after we rebind the context */\n        return 0;\n    }\n\n    if (renderer->clipping_enabled) {\n        const SDL_Rect *rect = &renderer->clip_rect;\n        data->glEnable(GL_SCISSOR_TEST);\n        if (renderer->target) {\n            data->glScissor(renderer->viewport.x + rect->x, renderer->viewport.y + rect->y, rect->w, rect->h);\n        } else {\n            int w, h;\n\n            SDL_GL_GetDrawableSize(renderer->window, &w, &h);\n            data->glScissor(renderer->viewport.x + rect->x, h - renderer->viewport.y - rect->y - rect->h, rect->w, rect->h);\n        }\n    } else {\n        data->glDisable(GL_SCISSOR_TEST);\n    }\n    return 0;\n}\n\nstatic void\nGLES2_DestroyRenderer(SDL_Renderer *renderer)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n\n    /* Deallocate everything */\n    if (data) {\n        GLES2_ActivateRenderer(renderer);\n\n        {\n            GLES2_ShaderCacheEntry *entry;\n            GLES2_ShaderCacheEntry *next;\n            entry = data->shader_cache.head;\n            while (entry) {\n                data->glDeleteShader(entry->id);\n                next = entry->next;\n                SDL_free(entry);\n                entry = next;\n            }\n        }\n        {\n            GLES2_ProgramCacheEntry *entry;\n            GLES2_ProgramCacheEntry *next;\n            entry = data->program_cache.head;\n            while (entry) {\n                data->glDeleteProgram(entry->id);\n                next = entry->next;\n                SDL_free(entry);\n                entry = next;\n            }\n        }\n        if (data->context) {\n            while (data->framebuffers) {\n                GLES2_FBOList *nextnode = data->framebuffers->next;\n                data->glDeleteFramebuffers(1, &data->framebuffers->FBO);\n                GL_CheckError(\"\", renderer);\n                SDL_free(data->framebuffers);\n                data->framebuffers = nextnode;\n            }\n            SDL_GL_DeleteContext(data->context);\n        }\n        SDL_free(data->shader_formats);\n        SDL_free(data);\n    }\n    SDL_free(renderer);\n}\n\n/*************************************************************************************************\n * Texture APIs                                                                                  *\n *************************************************************************************************/\n\nstatic int GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture);\nstatic int GLES2_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect,\n                               const void *pixels, int pitch);\nstatic int GLES2_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,\n                               const SDL_Rect * rect,\n                               const Uint8 *Yplane, int Ypitch,\n                               const Uint8 *Uplane, int Upitch,\n                               const Uint8 *Vplane, int Vpitch);\nstatic int GLES2_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect,\n                             void **pixels, int *pitch);\nstatic void GLES2_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture);\nstatic int GLES2_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic void GLES2_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture);\n\nstatic GLenum\nGetScaleQuality(void)\n{\n    const char *hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY);\n\n    if (!hint || *hint == '0' || SDL_strcasecmp(hint, \"nearest\") == 0) {\n        return GL_NEAREST;\n    } else {\n        return GL_LINEAR;\n    }\n}\n\nstatic int\nGLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)\n{\n    GLES2_DriverContext *renderdata = (GLES2_DriverContext *)renderer->driverdata;\n    GLES2_TextureData *data;\n    GLenum format;\n    GLenum type;\n    GLenum scaleMode;\n\n    GLES2_ActivateRenderer(renderer);\n\n    /* Determine the corresponding GLES texture format params */\n    switch (texture->format)\n    {\n    case SDL_PIXELFORMAT_ARGB8888:\n    case SDL_PIXELFORMAT_ABGR8888:\n    case SDL_PIXELFORMAT_RGB888:\n    case SDL_PIXELFORMAT_BGR888:\n        format = GL_RGBA;\n        type = GL_UNSIGNED_BYTE;\n        break;\n    case SDL_PIXELFORMAT_IYUV:\n    case SDL_PIXELFORMAT_YV12:\n    case SDL_PIXELFORMAT_NV12:\n    case SDL_PIXELFORMAT_NV21:\n        format = GL_LUMINANCE;\n        type = GL_UNSIGNED_BYTE;\n        break;\n    default:\n        return SDL_SetError(\"Texture format not supported\");\n    }\n\n    /* Allocate a texture struct */\n    data = (GLES2_TextureData *)SDL_calloc(1, sizeof(GLES2_TextureData));\n    if (!data) {\n        return SDL_OutOfMemory();\n    }\n    data->texture = 0;\n    data->texture_type = GL_TEXTURE_2D;\n    data->pixel_format = format;\n    data->pixel_type = type;\n    data->yuv = ((texture->format == SDL_PIXELFORMAT_IYUV) || (texture->format == SDL_PIXELFORMAT_YV12));\n    data->nv12 = ((texture->format == SDL_PIXELFORMAT_NV12) || (texture->format == SDL_PIXELFORMAT_NV21));\n    data->texture_u = 0;\n    data->texture_v = 0;\n    scaleMode = GetScaleQuality();\n\n    /* Allocate a blob for image renderdata */\n    if (texture->access == SDL_TEXTUREACCESS_STREAMING) {\n        size_t size;\n        data->pitch = texture->w * SDL_BYTESPERPIXEL(texture->format);\n        size = texture->h * data->pitch;\n        if (data->yuv) {\n            /* Need to add size for the U and V planes */\n            size += (2 * (texture->h * data->pitch) / 4);\n        }\n        if (data->nv12) {\n            /* Need to add size for the U/V plane */\n            size += ((texture->h * data->pitch) / 2);\n        }\n        data->pixel_data = SDL_calloc(1, size);\n        if (!data->pixel_data) {\n            SDL_free(data);\n            return SDL_OutOfMemory();\n        }\n    }\n\n    /* Allocate the texture */\n    GL_CheckError(\"\", renderer);\n\n    if (data->yuv) {\n        renderdata->glGenTextures(1, &data->texture_v);\n        if (GL_CheckError(\"glGenTexures()\", renderer) < 0) {\n            return -1;\n        }\n        renderdata->glActiveTexture(GL_TEXTURE2);\n        renderdata->glBindTexture(data->texture_type, data->texture_v);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n        renderdata->glTexImage2D(data->texture_type, 0, format, texture->w / 2, texture->h / 2, 0, format, type, NULL);\n\n        renderdata->glGenTextures(1, &data->texture_u);\n        if (GL_CheckError(\"glGenTexures()\", renderer) < 0) {\n            return -1;\n        }\n        renderdata->glActiveTexture(GL_TEXTURE1);\n        renderdata->glBindTexture(data->texture_type, data->texture_u);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n        renderdata->glTexImage2D(data->texture_type, 0, format, texture->w / 2, texture->h / 2, 0, format, type, NULL);\n        if (GL_CheckError(\"glTexImage2D()\", renderer) < 0) {\n            return -1;\n        }\n    }\n\n    if (data->nv12) {\n        renderdata->glGenTextures(1, &data->texture_u);\n        if (GL_CheckError(\"glGenTexures()\", renderer) < 0) {\n            return -1;\n        }\n        renderdata->glActiveTexture(GL_TEXTURE1);\n        renderdata->glBindTexture(data->texture_type, data->texture_u);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n        renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n        renderdata->glTexImage2D(data->texture_type, 0, GL_LUMINANCE_ALPHA, texture->w / 2, texture->h / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);\n        if (GL_CheckError(\"glTexImage2D()\", renderer) < 0) {\n            return -1;\n        }\n    }\n\n    renderdata->glGenTextures(1, &data->texture);\n    if (GL_CheckError(\"glGenTexures()\", renderer) < 0) {\n        return -1;\n    }\n    texture->driverdata = data;\n    renderdata->glActiveTexture(GL_TEXTURE0);\n    renderdata->glBindTexture(data->texture_type, data->texture);\n    renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);\n    renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);\n    renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n    renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n    renderdata->glTexImage2D(data->texture_type, 0, format, texture->w, texture->h, 0, format, type, NULL);\n    if (GL_CheckError(\"glTexImage2D()\", renderer) < 0) {\n        return -1;\n    }\n\n    if (texture->access == SDL_TEXTUREACCESS_TARGET) {\n       data->fbo = GLES2_GetFBO(renderer->driverdata, texture->w, texture->h);\n    } else {\n       data->fbo = NULL;\n    }\n\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGLES2_TexSubImage2D(GLES2_DriverContext *data, GLenum target, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels, GLint pitch, GLint bpp)\n{\n    Uint8 *blob = NULL;\n    Uint8 *src;\n    int src_pitch;\n    int y;\n\n    /* Reformat the texture data into a tightly packed array */\n    src_pitch = width * bpp;\n    src = (Uint8 *)pixels;\n    if (pitch != src_pitch) {\n        blob = (Uint8 *)SDL_malloc(src_pitch * height);\n        if (!blob) {\n            return SDL_OutOfMemory();\n        }\n        src = blob;\n        for (y = 0; y < height; ++y)\n        {\n            SDL_memcpy(src, pixels, src_pitch);\n            src += src_pitch;\n            pixels = (Uint8 *)pixels + pitch;\n        }\n        src = blob;\n    }\n\n    data->glTexSubImage2D(target, 0, xoffset, yoffset, width, height, format, type, src);\n    if (blob) {\n        SDL_free(blob);\n    }\n    return 0;\n}\n\nstatic int\nGLES2_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect,\n                    const void *pixels, int pitch)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLES2_TextureData *tdata = (GLES2_TextureData *)texture->driverdata;\n\n    GLES2_ActivateRenderer(renderer);\n\n    /* Bail out if we're supposed to update an empty rectangle */\n    if (rect->w <= 0 || rect->h <= 0) {\n        return 0;\n    }\n\n    /* Create a texture subimage with the supplied data */\n    data->glBindTexture(tdata->texture_type, tdata->texture);\n    GLES2_TexSubImage2D(data, tdata->texture_type,\n                    rect->x,\n                    rect->y,\n                    rect->w,\n                    rect->h,\n                    tdata->pixel_format,\n                    tdata->pixel_type,\n                    pixels, pitch, SDL_BYTESPERPIXEL(texture->format));\n\n    if (tdata->yuv) {\n        /* Skip to the correct offset into the next texture */\n        pixels = (const void*)((const Uint8*)pixels + rect->h * pitch);\n        if (texture->format == SDL_PIXELFORMAT_YV12) {\n            data->glBindTexture(tdata->texture_type, tdata->texture_v);\n        } else {\n            data->glBindTexture(tdata->texture_type, tdata->texture_u);\n        }\n        GLES2_TexSubImage2D(data, tdata->texture_type,\n                rect->x / 2,\n                rect->y / 2,\n                rect->w / 2,\n                rect->h / 2,\n                tdata->pixel_format,\n                tdata->pixel_type,\n                pixels, pitch / 2, 1);\n\n        /* Skip to the correct offset into the next texture */\n        pixels = (const void*)((const Uint8*)pixels + (rect->h * pitch)/4);\n        if (texture->format == SDL_PIXELFORMAT_YV12) {\n            data->glBindTexture(tdata->texture_type, tdata->texture_u);\n        } else {\n            data->glBindTexture(tdata->texture_type, tdata->texture_v);\n        }\n        GLES2_TexSubImage2D(data, tdata->texture_type,\n                rect->x / 2,\n                rect->y / 2,\n                rect->w / 2,\n                rect->h / 2,\n                tdata->pixel_format,\n                tdata->pixel_type,\n                pixels, pitch / 2, 1);\n    }\n\n    if (tdata->nv12) {\n        /* Skip to the correct offset into the next texture */\n        pixels = (const void*)((const Uint8*)pixels + rect->h * pitch);\n        data->glBindTexture(tdata->texture_type, tdata->texture_u);\n        GLES2_TexSubImage2D(data, tdata->texture_type,\n                rect->x / 2,\n                rect->y / 2,\n                rect->w / 2,\n                rect->h / 2,\n                GL_LUMINANCE_ALPHA,\n                GL_UNSIGNED_BYTE,\n                pixels, pitch, 2);\n    }\n\n    return GL_CheckError(\"glTexSubImage2D()\", renderer);\n}\n\nstatic int\nGLES2_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,\n                    const SDL_Rect * rect,\n                    const Uint8 *Yplane, int Ypitch,\n                    const Uint8 *Uplane, int Upitch,\n                    const Uint8 *Vplane, int Vpitch)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLES2_TextureData *tdata = (GLES2_TextureData *)texture->driverdata;\n\n    GLES2_ActivateRenderer(renderer);\n\n    /* Bail out if we're supposed to update an empty rectangle */\n    if (rect->w <= 0 || rect->h <= 0) {\n        return 0;\n    }\n\n    data->glBindTexture(tdata->texture_type, tdata->texture_v);\n    GLES2_TexSubImage2D(data, tdata->texture_type,\n                    rect->x / 2,\n                    rect->y / 2,\n                    rect->w / 2,\n                    rect->h / 2,\n                    tdata->pixel_format,\n                    tdata->pixel_type,\n                    Vplane, Vpitch, 1);\n\n    data->glBindTexture(tdata->texture_type, tdata->texture_u);\n    GLES2_TexSubImage2D(data, tdata->texture_type,\n                    rect->x / 2,\n                    rect->y / 2,\n                    rect->w / 2,\n                    rect->h / 2,\n                    tdata->pixel_format,\n                    tdata->pixel_type,\n                    Uplane, Upitch, 1);\n\n    data->glBindTexture(tdata->texture_type, tdata->texture);\n    GLES2_TexSubImage2D(data, tdata->texture_type,\n                    rect->x,\n                    rect->y,\n                    rect->w,\n                    rect->h,\n                    tdata->pixel_format,\n                    tdata->pixel_type,\n                    Yplane, Ypitch, 1);\n\n    return GL_CheckError(\"glTexSubImage2D()\", renderer);\n}\n\nstatic int\nGLES2_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect,\n                  void **pixels, int *pitch)\n{\n    GLES2_TextureData *tdata = (GLES2_TextureData *)texture->driverdata;\n\n    /* Retrieve the buffer/pitch for the specified region */\n    *pixels = (Uint8 *)tdata->pixel_data +\n              (tdata->pitch * rect->y) +\n              (rect->x * SDL_BYTESPERPIXEL(texture->format));\n    *pitch = tdata->pitch;\n\n    return 0;\n}\n\nstatic void\nGLES2_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)\n{\n    GLES2_TextureData *tdata = (GLES2_TextureData *)texture->driverdata;\n    SDL_Rect rect;\n\n    /* We do whole texture updates, at least for now */\n    rect.x = 0;\n    rect.y = 0;\n    rect.w = texture->w;\n    rect.h = texture->h;\n    GLES2_UpdateTexture(renderer, texture, &rect, tdata->pixel_data, tdata->pitch);\n}\n\nstatic int\nGLES2_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *) renderer->driverdata;\n    GLES2_TextureData *texturedata = NULL;\n    GLenum status;\n\n    if (texture == NULL) {\n        data->glBindFramebuffer(GL_FRAMEBUFFER, data->window_framebuffer);\n    } else {\n        texturedata = (GLES2_TextureData *) texture->driverdata;\n        data->glBindFramebuffer(GL_FRAMEBUFFER, texturedata->fbo->FBO);\n        /* TODO: check if texture pixel format allows this operation */\n        data->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texturedata->texture_type, texturedata->texture, 0);\n        /* Check FBO status */\n        status = data->glCheckFramebufferStatus(GL_FRAMEBUFFER);\n        if (status != GL_FRAMEBUFFER_COMPLETE) {\n            return SDL_SetError(\"glFramebufferTexture2D() failed\");\n        }\n    }\n    return 0;\n}\n\nstatic void\nGLES2_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLES2_TextureData *tdata = (GLES2_TextureData *)texture->driverdata;\n\n    GLES2_ActivateRenderer(renderer);\n\n    /* Destroy the texture */\n    if (tdata) {\n        data->glDeleteTextures(1, &tdata->texture);\n        if (tdata->texture_v) {\n            data->glDeleteTextures(1, &tdata->texture_v);\n        }\n        if (tdata->texture_u) {\n            data->glDeleteTextures(1, &tdata->texture_u);\n        }\n        SDL_free(tdata->pixel_data);\n        SDL_free(tdata);\n        texture->driverdata = NULL;\n    }\n}\n\n/*************************************************************************************************\n * Shader management functions                                                                   *\n *************************************************************************************************/\n\nstatic GLES2_ShaderCacheEntry *GLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type,\n                                                 SDL_BlendMode blendMode);\nstatic void GLES2_EvictShader(SDL_Renderer *renderer, GLES2_ShaderCacheEntry *entry);\nstatic GLES2_ProgramCacheEntry *GLES2_CacheProgram(SDL_Renderer *renderer,\n                                                   GLES2_ShaderCacheEntry *vertex,\n                                                   GLES2_ShaderCacheEntry *fragment,\n                                                   SDL_BlendMode blendMode);\nstatic int GLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source,\n                               SDL_BlendMode blendMode);\n\nstatic GLES2_ProgramCacheEntry *\nGLES2_CacheProgram(SDL_Renderer *renderer, GLES2_ShaderCacheEntry *vertex,\n                   GLES2_ShaderCacheEntry *fragment, SDL_BlendMode blendMode)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLES2_ProgramCacheEntry *entry;\n    GLES2_ShaderCacheEntry *shaderEntry;\n    GLint linkSuccessful;\n\n    /* Check if we've already cached this program */\n    entry = data->program_cache.head;\n    while (entry) {\n        if (entry->vertex_shader == vertex && entry->fragment_shader == fragment) {\n            break;\n        }\n        entry = entry->next;\n    }\n    if (entry) {\n        if (data->program_cache.head != entry) {\n            if (entry->next) {\n                entry->next->prev = entry->prev;\n            }\n            if (entry->prev) {\n                entry->prev->next = entry->next;\n            }\n            entry->prev = NULL;\n            entry->next = data->program_cache.head;\n            data->program_cache.head->prev = entry;\n            data->program_cache.head = entry;\n        }\n        return entry;\n    }\n\n    /* Create a program cache entry */\n    entry = (GLES2_ProgramCacheEntry *)SDL_calloc(1, sizeof(GLES2_ProgramCacheEntry));\n    if (!entry) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n    entry->vertex_shader = vertex;\n    entry->fragment_shader = fragment;\n    entry->blend_mode = blendMode;\n\n    /* Create the program and link it */\n    entry->id = data->glCreateProgram();\n    data->glAttachShader(entry->id, vertex->id);\n    data->glAttachShader(entry->id, fragment->id);\n    data->glBindAttribLocation(entry->id, GLES2_ATTRIBUTE_POSITION, \"a_position\");\n    data->glBindAttribLocation(entry->id, GLES2_ATTRIBUTE_TEXCOORD, \"a_texCoord\");\n    data->glBindAttribLocation(entry->id, GLES2_ATTRIBUTE_ANGLE, \"a_angle\");\n    data->glBindAttribLocation(entry->id, GLES2_ATTRIBUTE_CENTER, \"a_center\");\n    data->glLinkProgram(entry->id);\n    data->glGetProgramiv(entry->id, GL_LINK_STATUS, &linkSuccessful);\n    if (!linkSuccessful) {\n        data->glDeleteProgram(entry->id);\n        SDL_free(entry);\n        SDL_SetError(\"Failed to link shader program\");\n        return NULL;\n    }\n\n    /* Predetermine locations of uniform variables */\n    entry->uniform_locations[GLES2_UNIFORM_PROJECTION] =\n        data->glGetUniformLocation(entry->id, \"u_projection\");\n    entry->uniform_locations[GLES2_UNIFORM_TEXTURE_V] =\n        data->glGetUniformLocation(entry->id, \"u_texture_v\");\n    entry->uniform_locations[GLES2_UNIFORM_TEXTURE_U] =\n        data->glGetUniformLocation(entry->id, \"u_texture_u\");\n    entry->uniform_locations[GLES2_UNIFORM_TEXTURE] =\n        data->glGetUniformLocation(entry->id, \"u_texture\");\n    entry->uniform_locations[GLES2_UNIFORM_MODULATION] =\n        data->glGetUniformLocation(entry->id, \"u_modulation\");\n    entry->uniform_locations[GLES2_UNIFORM_COLOR] =\n        data->glGetUniformLocation(entry->id, \"u_color\");\n\n    entry->modulation_r = entry->modulation_g = entry->modulation_b = entry->modulation_a = 255;\n    entry->color_r = entry->color_g = entry->color_b = entry->color_a = 255;\n\n    data->glUseProgram(entry->id);\n    data->glUniform1i(entry->uniform_locations[GLES2_UNIFORM_TEXTURE_V], 2);  /* always texture unit 2. */\n    data->glUniform1i(entry->uniform_locations[GLES2_UNIFORM_TEXTURE_U], 1);  /* always texture unit 1. */\n    data->glUniform1i(entry->uniform_locations[GLES2_UNIFORM_TEXTURE], 0);  /* always texture unit 0. */\n    data->glUniformMatrix4fv(entry->uniform_locations[GLES2_UNIFORM_PROJECTION], 1, GL_FALSE, (GLfloat *)entry->projection);\n    data->glUniform4f(entry->uniform_locations[GLES2_UNIFORM_MODULATION], 1.0f, 1.0f, 1.0f, 1.0f);\n    data->glUniform4f(entry->uniform_locations[GLES2_UNIFORM_COLOR], 1.0f, 1.0f, 1.0f, 1.0f);\n\n    /* Cache the linked program */\n    if (data->program_cache.head) {\n        entry->next = data->program_cache.head;\n        data->program_cache.head->prev = entry;\n    } else {\n        data->program_cache.tail = entry;\n    }\n    data->program_cache.head = entry;\n    ++data->program_cache.count;\n\n    /* Increment the refcount of the shaders we're using */\n    ++vertex->references;\n    ++fragment->references;\n\n    /* Evict the last entry from the cache if we exceed the limit */\n    if (data->program_cache.count > GLES2_MAX_CACHED_PROGRAMS) {\n        shaderEntry = data->program_cache.tail->vertex_shader;\n        if (--shaderEntry->references <= 0) {\n            GLES2_EvictShader(renderer, shaderEntry);\n        }\n        shaderEntry = data->program_cache.tail->fragment_shader;\n        if (--shaderEntry->references <= 0) {\n            GLES2_EvictShader(renderer, shaderEntry);\n        }\n        data->glDeleteProgram(data->program_cache.tail->id);\n        data->program_cache.tail = data->program_cache.tail->prev;\n        SDL_free(data->program_cache.tail->next);\n        data->program_cache.tail->next = NULL;\n        --data->program_cache.count;\n    }\n    return entry;\n}\n\nstatic GLES2_ShaderCacheEntry *\nGLES2_CacheShader(SDL_Renderer *renderer, GLES2_ShaderType type, SDL_BlendMode blendMode)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    const GLES2_Shader *shader;\n    const GLES2_ShaderInstance *instance = NULL;\n    GLES2_ShaderCacheEntry *entry = NULL;\n    GLint compileSuccessful = GL_FALSE;\n    int i, j;\n\n    /* Find the corresponding shader */\n    shader = GLES2_GetShader(type, blendMode);\n    if (!shader) {\n        SDL_SetError(\"No shader matching the requested characteristics was found\");\n        return NULL;\n    }\n\n    /* Find a matching shader instance that's supported on this hardware */\n    for (i = 0; i < shader->instance_count && !instance; ++i) {\n        for (j = 0; j < data->shader_format_count && !instance; ++j) {\n            if (!shader->instances[i]) {\n                continue;\n            }\n            if (shader->instances[i]->format != data->shader_formats[j]) {\n                continue;\n            }\n            instance = shader->instances[i];\n        }\n    }\n    if (!instance) {\n        SDL_SetError(\"The specified shader cannot be loaded on the current platform\");\n        return NULL;\n    }\n\n    /* Check if we've already cached this shader */\n    entry = data->shader_cache.head;\n    while (entry) {\n        if (entry->instance == instance) {\n            break;\n        }\n        entry = entry->next;\n    }\n    if (entry) {\n        return entry;\n    }\n\n    /* Create a shader cache entry */\n    entry = (GLES2_ShaderCacheEntry *)SDL_calloc(1, sizeof(GLES2_ShaderCacheEntry));\n    if (!entry) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n    entry->type = type;\n    entry->instance = instance;\n\n    /* Compile or load the selected shader instance */\n    entry->id = data->glCreateShader(instance->type);\n    if (instance->format == (GLenum)-1) {\n        data->glShaderSource(entry->id, 1, (const char **)&instance->data, NULL);\n        data->glCompileShader(entry->id);\n        data->glGetShaderiv(entry->id, GL_COMPILE_STATUS, &compileSuccessful);\n    } else {\n        data->glShaderBinary(1, &entry->id, instance->format, instance->data, instance->length);\n        compileSuccessful = GL_TRUE;\n    }\n    if (!compileSuccessful) {\n        char *info = NULL;\n        int length = 0;\n\n        data->glGetShaderiv(entry->id, GL_INFO_LOG_LENGTH, &length);\n        if (length > 0) {\n            info = SDL_stack_alloc(char, length);\n            if (info) {\n                data->glGetShaderInfoLog(entry->id, length, &length, info);\n            }\n        }\n        if (info) {\n            SDL_SetError(\"Failed to load the shader: %s\", info);\n            SDL_stack_free(info);\n        } else {\n            SDL_SetError(\"Failed to load the shader\");\n        }\n        data->glDeleteShader(entry->id);\n        SDL_free(entry);\n        return NULL;\n    }\n\n    /* Link the shader entry in at the front of the cache */\n    if (data->shader_cache.head) {\n        entry->next = data->shader_cache.head;\n        data->shader_cache.head->prev = entry;\n    }\n    data->shader_cache.head = entry;\n    ++data->shader_cache.count;\n    return entry;\n}\n\nstatic void\nGLES2_EvictShader(SDL_Renderer *renderer, GLES2_ShaderCacheEntry *entry)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n\n    /* Unlink the shader from the cache */\n    if (entry->next) {\n        entry->next->prev = entry->prev;\n    }\n    if (entry->prev) {\n        entry->prev->next = entry->next;\n    }\n    if (data->shader_cache.head == entry) {\n        data->shader_cache.head = entry->next;\n    }\n    --data->shader_cache.count;\n\n    /* Deallocate the shader */\n    data->glDeleteShader(entry->id);\n    SDL_free(entry);\n}\n\nstatic int\nGLES2_SelectProgram(SDL_Renderer *renderer, GLES2_ImageSource source, SDL_BlendMode blendMode)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLES2_ShaderCacheEntry *vertex = NULL;\n    GLES2_ShaderCacheEntry *fragment = NULL;\n    GLES2_ShaderType vtype, ftype;\n    GLES2_ProgramCacheEntry *program;\n\n    /* Select an appropriate shader pair for the specified modes */\n    vtype = GLES2_SHADER_VERTEX_DEFAULT;\n    switch (source) {\n    case GLES2_IMAGESOURCE_SOLID:\n        ftype = GLES2_SHADER_FRAGMENT_SOLID_SRC;\n        break;\n    case GLES2_IMAGESOURCE_TEXTURE_ABGR:\n        ftype = GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC;\n        break;\n    case GLES2_IMAGESOURCE_TEXTURE_ARGB:\n        ftype = GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_SRC;\n        break;\n    case GLES2_IMAGESOURCE_TEXTURE_RGB:\n        ftype = GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC;\n        break;\n    case GLES2_IMAGESOURCE_TEXTURE_BGR:\n        ftype = GLES2_SHADER_FRAGMENT_TEXTURE_BGR_SRC;\n        break;\n    case GLES2_IMAGESOURCE_TEXTURE_YUV:\n        ftype = GLES2_SHADER_FRAGMENT_TEXTURE_YUV_SRC;\n        break;\n    case GLES2_IMAGESOURCE_TEXTURE_NV12:\n        ftype = GLES2_SHADER_FRAGMENT_TEXTURE_NV12_SRC;\n        break;\n    case GLES2_IMAGESOURCE_TEXTURE_NV21:\n        ftype = GLES2_SHADER_FRAGMENT_TEXTURE_NV21_SRC;\n        break;\n    default:\n        goto fault;\n    }\n\n    /* Load the requested shaders */\n    vertex = GLES2_CacheShader(renderer, vtype, blendMode);\n    if (!vertex) {\n        goto fault;\n    }\n    fragment = GLES2_CacheShader(renderer, ftype, blendMode);\n    if (!fragment) {\n        goto fault;\n    }\n\n    /* Check if we need to change programs at all */\n    if (data->current_program &&\n        data->current_program->vertex_shader == vertex &&\n        data->current_program->fragment_shader == fragment) {\n        return 0;\n    }\n\n    /* Generate a matching program */\n    program = GLES2_CacheProgram(renderer, vertex, fragment, blendMode);\n    if (!program) {\n        goto fault;\n    }\n\n    /* Select that program in OpenGL */\n    data->glUseProgram(program->id);\n\n    /* Set the current program */\n    data->current_program = program;\n\n    /* Activate an orthographic projection */\n    if (GLES2_SetOrthographicProjection(renderer) < 0) {\n        goto fault;\n    }\n\n    /* Clean up and return */\n    return 0;\nfault:\n    if (vertex && vertex->references <= 0) {\n        GLES2_EvictShader(renderer, vertex);\n    }\n    if (fragment && fragment->references <= 0) {\n        GLES2_EvictShader(renderer, fragment);\n    }\n    data->current_program = NULL;\n    return -1;\n}\n\nstatic int\nGLES2_SetOrthographicProjection(SDL_Renderer *renderer)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLfloat projection[4][4];\n\n    if (!renderer->viewport.w || !renderer->viewport.h) {\n        return 0;\n    }\n\n    /* Prepare an orthographic projection */\n    projection[0][0] = 2.0f / renderer->viewport.w;\n    projection[0][1] = 0.0f;\n    projection[0][2] = 0.0f;\n    projection[0][3] = 0.0f;\n    projection[1][0] = 0.0f;\n    if (renderer->target) {\n        projection[1][1] = 2.0f / renderer->viewport.h;\n    } else {\n        projection[1][1] = -2.0f / renderer->viewport.h;\n    }\n    projection[1][2] = 0.0f;\n    projection[1][3] = 0.0f;\n    projection[2][0] = 0.0f;\n    projection[2][1] = 0.0f;\n    projection[2][2] = 0.0f;\n    projection[2][3] = 0.0f;\n    projection[3][0] = -1.0f;\n    if (renderer->target) {\n        projection[3][1] = -1.0f;\n    } else {\n        projection[3][1] = 1.0f;\n    }\n    projection[3][2] = 0.0f;\n    projection[3][3] = 1.0f;\n\n    /* Set the projection matrix */\n    if (SDL_memcmp(data->current_program->projection, projection, sizeof (projection)) != 0) {\n        const GLuint locProjection = data->current_program->uniform_locations[GLES2_UNIFORM_PROJECTION];\n        data->glUniformMatrix4fv(locProjection, 1, GL_FALSE, (GLfloat *)projection);\n        SDL_memcpy(data->current_program->projection, projection, sizeof (projection));\n    }\n\n    return 0;\n}\n\n/*************************************************************************************************\n * Rendering functions                                                                           *\n *************************************************************************************************/\n\nstatic const float inv255f = 1.0f / 255.0f;\n\nstatic int GLES2_RenderClear(SDL_Renderer *renderer);\nstatic int GLES2_RenderDrawPoints(SDL_Renderer *renderer, const SDL_FPoint *points, int count);\nstatic int GLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_FPoint *points, int count);\nstatic int GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count);\nstatic int GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect,\n                            const SDL_FRect *dstrect);\nstatic int GLES2_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n                         const SDL_Rect * srcrect, const SDL_FRect * dstrect,\n                         const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);\nstatic int GLES2_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                    Uint32 pixel_format, void * pixels, int pitch);\nstatic void GLES2_RenderPresent(SDL_Renderer *renderer);\n\nstatic SDL_bool\nCompareColors(Uint8 r1, Uint8 g1, Uint8 b1, Uint8 a1,\n              Uint8 r2, Uint8 g2, Uint8 b2, Uint8 a2)\n{\n    Uint32 Pixel1, Pixel2;\n    RGBA8888_FROM_RGBA(Pixel1, r1, g1, b1, a1);\n    RGBA8888_FROM_RGBA(Pixel2, r2, g2, b2, a2);\n    return (Pixel1 == Pixel2);\n}\n\nstatic int\nGLES2_RenderClear(SDL_Renderer * renderer)\n{\n    Uint8 r, g, b, a;\n\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n\n    GLES2_ActivateRenderer(renderer);\n\n    if (!CompareColors(data->clear_r, data->clear_g, data->clear_b, data->clear_a,\n                        renderer->r, renderer->g, renderer->b, renderer->a)) {\n\n       /* Select the color to clear with */\n       g = renderer->g;\n       a = renderer->a;\n   \n       if (renderer->target &&\n            (renderer->target->format == SDL_PIXELFORMAT_ARGB8888 ||\n             renderer->target->format == SDL_PIXELFORMAT_RGB888)) {\n           r = renderer->b;\n           b = renderer->r;\n        } else {\n           r = renderer->r;\n           b = renderer->b;\n        }\n\n        data->glClearColor((GLfloat) r * inv255f,\n                     (GLfloat) g * inv255f,\n                     (GLfloat) b * inv255f,\n                     (GLfloat) a * inv255f);\n        data->clear_r = renderer->r;\n        data->clear_g = renderer->g;\n        data->clear_b = renderer->b;\n        data->clear_a = renderer->a;\n    }\n\n    if (renderer->clipping_enabled) {\n        data->glDisable(GL_SCISSOR_TEST);\n    }\n\n    data->glClear(GL_COLOR_BUFFER_BIT);\n\n    if (renderer->clipping_enabled) {\n        data->glEnable(GL_SCISSOR_TEST);\n    }\n\n    return 0;\n}\n\nstatic void\nGLES2_SetBlendMode(GLES2_DriverContext *data, int blendMode)\n{\n    if (blendMode != data->current.blendMode) {\n        switch (blendMode) {\n        default:\n        case SDL_BLENDMODE_NONE:\n            data->glDisable(GL_BLEND);\n            break;\n        case SDL_BLENDMODE_BLEND:\n            data->glEnable(GL_BLEND);\n            data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);\n            break;\n        case SDL_BLENDMODE_ADD:\n            data->glEnable(GL_BLEND);\n            data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);\n            break;\n        case SDL_BLENDMODE_MOD:\n            data->glEnable(GL_BLEND);\n            data->glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE);\n            break;\n        }\n        data->current.blendMode = blendMode;\n    }\n}\n\nstatic void\nGLES2_SetTexCoords(GLES2_DriverContext * data, SDL_bool enabled)\n{\n    if (enabled != data->current.tex_coords) {\n        if (enabled) {\n            data->glEnableVertexAttribArray(GLES2_ATTRIBUTE_TEXCOORD);\n        } else {\n            data->glDisableVertexAttribArray(GLES2_ATTRIBUTE_TEXCOORD);\n        }\n        data->current.tex_coords = enabled;\n    }\n}\n\nstatic int\nGLES2_SetDrawingState(SDL_Renderer * renderer)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    const int blendMode = renderer->blendMode;\n    GLES2_ProgramCacheEntry *program;\n    Uint8 r, g, b, a;\n\n    GLES2_ActivateRenderer(renderer);\n\n    GLES2_SetBlendMode(data, blendMode);\n\n    GLES2_SetTexCoords(data, SDL_FALSE);\n\n    /* Activate an appropriate shader and set the projection matrix */\n    if (GLES2_SelectProgram(renderer, GLES2_IMAGESOURCE_SOLID, blendMode) < 0) {\n        return -1;\n    }\n\n    /* Select the color to draw with */\n    g = renderer->g;\n    a = renderer->a;\n\n    if (renderer->target &&\n         (renderer->target->format == SDL_PIXELFORMAT_ARGB8888 ||\n         renderer->target->format == SDL_PIXELFORMAT_RGB888)) {\n        r = renderer->b;\n        b = renderer->r;\n     } else {\n        r = renderer->r;\n        b = renderer->b;\n     }\n\n    program = data->current_program;\n    if (!CompareColors(program->color_r, program->color_g, program->color_b, program->color_a, r, g, b, a)) {\n        /* Select the color to draw with */\n        data->glUniform4f(program->uniform_locations[GLES2_UNIFORM_COLOR], r * inv255f, g * inv255f, b * inv255f, a * inv255f);\n        program->color_r = r;\n        program->color_g = g;\n        program->color_b = b;\n        program->color_a = a;\n    }\n\n    return 0;\n}\n\nstatic int\nGLES2_UpdateVertexBuffer(SDL_Renderer *renderer, GLES2_Attribute attr,\n                         const void *vertexData, size_t dataSizeInBytes)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n\n#if !SDL_GLES2_USE_VBOS\n    data->glVertexAttribPointer(attr, attr == GLES2_ATTRIBUTE_ANGLE ? 1 : 2, GL_FLOAT, GL_FALSE, 0, vertexData);\n#else\n    if (!data->vertex_buffers[attr]) {\n        data->glGenBuffers(1, &data->vertex_buffers[attr]);\n    }\n\n    data->glBindBuffer(GL_ARRAY_BUFFER, data->vertex_buffers[attr]);\n\n    if (data->vertex_buffer_size[attr] < dataSizeInBytes) {\n        data->glBufferData(GL_ARRAY_BUFFER, dataSizeInBytes, vertexData, GL_STREAM_DRAW);\n        data->vertex_buffer_size[attr] = dataSizeInBytes;\n    } else {\n        data->glBufferSubData(GL_ARRAY_BUFFER, 0, dataSizeInBytes, vertexData);\n    }\n\n    data->glVertexAttribPointer(attr, attr == GLES2_ATTRIBUTE_ANGLE ? 1 : 2, GL_FLOAT, GL_FALSE, 0, 0);\n#endif\n\n    return 0;\n}\n\nstatic int\nGLES2_RenderDrawPoints(SDL_Renderer *renderer, const SDL_FPoint *points, int count)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLfloat *vertices;\n    int idx;\n\n    if (GLES2_SetDrawingState(renderer) < 0) {\n        return -1;\n    }\n\n    /* Emit the specified vertices as points */\n    vertices = SDL_stack_alloc(GLfloat, count * 2);\n    for (idx = 0; idx < count; ++idx) {\n        GLfloat x = points[idx].x + 0.5f;\n        GLfloat y = points[idx].y + 0.5f;\n\n        vertices[idx * 2] = x;\n        vertices[(idx * 2) + 1] = y;\n    }\n    /*data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);*/\n    GLES2_UpdateVertexBuffer(renderer, GLES2_ATTRIBUTE_POSITION, vertices, count * 2 * sizeof(GLfloat));\n    data->glDrawArrays(GL_POINTS, 0, count);\n    SDL_stack_free(vertices);\n    return 0;\n}\n\nstatic int\nGLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_FPoint *points, int count)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLfloat *vertices;\n    int idx;\n\n    if (GLES2_SetDrawingState(renderer) < 0) {\n        return -1;\n    }\n\n    /* Emit a line strip including the specified vertices */\n    vertices = SDL_stack_alloc(GLfloat, count * 2);\n    for (idx = 0; idx < count; ++idx) {\n        GLfloat x = points[idx].x + 0.5f;\n        GLfloat y = points[idx].y + 0.5f;\n\n        vertices[idx * 2] = x;\n        vertices[(idx * 2) + 1] = y;\n    }\n    /*data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);*/\n    GLES2_UpdateVertexBuffer(renderer, GLES2_ATTRIBUTE_POSITION, vertices, count * 2 * sizeof(GLfloat));\n    data->glDrawArrays(GL_LINE_STRIP, 0, count);\n\n    /* We need to close the endpoint of the line */\n    if (count == 2 ||\n        points[0].x != points[count-1].x || points[0].y != points[count-1].y) {\n        data->glDrawArrays(GL_POINTS, count-1, 1);\n    }\n    SDL_stack_free(vertices);\n\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLfloat vertices[8];\n    int idx;\n\n    if (GLES2_SetDrawingState(renderer) < 0) {\n        return -1;\n    }\n\n    /* Emit a line loop for each rectangle */\n    for (idx = 0; idx < count; ++idx) {\n        const SDL_FRect *rect = &rects[idx];\n\n        GLfloat xMin = rect->x;\n        GLfloat xMax = (rect->x + rect->w);\n        GLfloat yMin = rect->y;\n        GLfloat yMax = (rect->y + rect->h);\n\n        vertices[0] = xMin;\n        vertices[1] = yMin;\n        vertices[2] = xMax;\n        vertices[3] = yMin;\n        vertices[4] = xMin;\n        vertices[5] = yMax;\n        vertices[6] = xMax;\n        vertices[7] = yMax;\n        /*data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);*/\n        GLES2_UpdateVertexBuffer(renderer, GLES2_ATTRIBUTE_POSITION, vertices, 8 * sizeof(GLfloat));\n        data->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n    }\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGLES2_SetupCopy(SDL_Renderer *renderer, SDL_Texture *texture)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLES2_TextureData *tdata = (GLES2_TextureData *)texture->driverdata;\n    GLES2_ImageSource sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;\n    SDL_BlendMode blendMode;\n    GLES2_ProgramCacheEntry *program;\n    Uint8 r, g, b, a;\n\n    /* Activate an appropriate shader and set the projection matrix */\n    blendMode = texture->blendMode;\n    if (renderer->target) {\n        /* Check if we need to do color mapping between the source and render target textures */\n        if (renderer->target->format != texture->format) {\n            switch (texture->format) {\n            case SDL_PIXELFORMAT_ARGB8888:\n                switch (renderer->target->format) {\n                case SDL_PIXELFORMAT_ABGR8888:\n                case SDL_PIXELFORMAT_BGR888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;\n                    break;\n                case SDL_PIXELFORMAT_RGB888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;\n                    break;\n                }\n                break;\n            case SDL_PIXELFORMAT_ABGR8888:\n                switch (renderer->target->format) {\n                case SDL_PIXELFORMAT_ARGB8888:\n                case SDL_PIXELFORMAT_RGB888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;\n                    break;\n                case SDL_PIXELFORMAT_BGR888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;\n                    break;\n                }\n                break;\n            case SDL_PIXELFORMAT_RGB888:\n                switch (renderer->target->format) {\n                case SDL_PIXELFORMAT_ABGR8888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;\n                    break;\n                case SDL_PIXELFORMAT_ARGB8888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_BGR;\n                    break;\n                case SDL_PIXELFORMAT_BGR888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;\n                    break;\n                }\n                break;\n            case SDL_PIXELFORMAT_BGR888:\n                switch (renderer->target->format) {\n                case SDL_PIXELFORMAT_ABGR8888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_BGR;\n                    break;\n                case SDL_PIXELFORMAT_ARGB8888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_RGB;\n                    break;\n                case SDL_PIXELFORMAT_RGB888:\n                    sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;\n                    break;\n                }\n                break;\n            case SDL_PIXELFORMAT_IYUV:\n            case SDL_PIXELFORMAT_YV12:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_YUV;\n                break;\n            case SDL_PIXELFORMAT_NV12:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_NV12;\n                break;\n            case SDL_PIXELFORMAT_NV21:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_NV21;\n                break;\n            default:\n                return SDL_SetError(\"Unsupported texture format\");\n            }\n        } else {\n            sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;   /* Texture formats match, use the non color mapping shader (even if the formats are not ABGR) */\n        }\n    } else {\n        switch (texture->format) {\n            case SDL_PIXELFORMAT_ARGB8888:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;\n                break;\n            case SDL_PIXELFORMAT_ABGR8888:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;\n                break;\n            case SDL_PIXELFORMAT_RGB888:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_RGB;\n                break;\n            case SDL_PIXELFORMAT_BGR888:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_BGR;\n                break;\n            case SDL_PIXELFORMAT_IYUV:\n            case SDL_PIXELFORMAT_YV12:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_YUV;\n                break;\n            case SDL_PIXELFORMAT_NV12:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_NV12;\n                break;\n            case SDL_PIXELFORMAT_NV21:\n                sourceType = GLES2_IMAGESOURCE_TEXTURE_NV21;\n                break;\n            default:\n                return SDL_SetError(\"Unsupported texture format\");\n        }\n    }\n\n    if (GLES2_SelectProgram(renderer, sourceType, blendMode) < 0) {\n        return -1;\n    }\n\n    /* Select the target texture */\n    if (tdata->yuv) {\n        data->glActiveTexture(GL_TEXTURE2);\n        data->glBindTexture(tdata->texture_type, tdata->texture_v);\n\n        data->glActiveTexture(GL_TEXTURE1);\n        data->glBindTexture(tdata->texture_type, tdata->texture_u);\n\n        data->glActiveTexture(GL_TEXTURE0);\n    }\n    if (tdata->nv12) {\n        data->glActiveTexture(GL_TEXTURE1);\n        data->glBindTexture(tdata->texture_type, tdata->texture_u);\n\n        data->glActiveTexture(GL_TEXTURE0);\n    }\n    data->glBindTexture(tdata->texture_type, tdata->texture);\n\n    /* Configure color modulation */\n    g = texture->g;\n    a = texture->a;\n\n    if (renderer->target &&\n        (renderer->target->format == SDL_PIXELFORMAT_ARGB8888 ||\n         renderer->target->format == SDL_PIXELFORMAT_RGB888)) {\n        r = texture->b;\n        b = texture->r;\n    } else {\n        r = texture->r;\n        b = texture->b;\n    }\n\n    program = data->current_program;\n\n    if (!CompareColors(program->modulation_r, program->modulation_g, program->modulation_b, program->modulation_a, r, g, b, a)) {\n        data->glUniform4f(program->uniform_locations[GLES2_UNIFORM_MODULATION], r * inv255f, g * inv255f, b * inv255f, a * inv255f);\n        program->modulation_r = r;\n        program->modulation_g = g;\n        program->modulation_b = b;\n        program->modulation_a = a;\n    }\n\n    /* Configure texture blending */\n    GLES2_SetBlendMode(data, blendMode);\n\n    GLES2_SetTexCoords(data, SDL_TRUE);\n    return 0;\n}\n\nstatic int\nGLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect,\n                 const SDL_FRect *dstrect)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLfloat vertices[8];\n    GLfloat texCoords[8];\n\n    GLES2_ActivateRenderer(renderer);\n\n    if (GLES2_SetupCopy(renderer, texture) < 0) {\n        return -1;\n    }\n\n    /* Emit the textured quad */\n    vertices[0] = dstrect->x;\n    vertices[1] = dstrect->y;\n    vertices[2] = (dstrect->x + dstrect->w);\n    vertices[3] = dstrect->y;\n    vertices[4] = dstrect->x;\n    vertices[5] = (dstrect->y + dstrect->h);\n    vertices[6] = (dstrect->x + dstrect->w);\n    vertices[7] = (dstrect->y + dstrect->h);\n    /*data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);*/\n    GLES2_UpdateVertexBuffer(renderer, GLES2_ATTRIBUTE_POSITION, vertices, 8 * sizeof(GLfloat));\n    texCoords[0] = srcrect->x / (GLfloat)texture->w;\n    texCoords[1] = srcrect->y / (GLfloat)texture->h;\n    texCoords[2] = (srcrect->x + srcrect->w) / (GLfloat)texture->w;\n    texCoords[3] = srcrect->y / (GLfloat)texture->h;\n    texCoords[4] = srcrect->x / (GLfloat)texture->w;\n    texCoords[5] = (srcrect->y + srcrect->h) / (GLfloat)texture->h;\n    texCoords[6] = (srcrect->x + srcrect->w) / (GLfloat)texture->w;\n    texCoords[7] = (srcrect->y + srcrect->h) / (GLfloat)texture->h;\n    /*data->glVertexAttribPointer(GLES2_ATTRIBUTE_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, texCoords);*/\n    GLES2_UpdateVertexBuffer(renderer, GLES2_ATTRIBUTE_TEXCOORD, texCoords, 8 * sizeof(GLfloat));\n    data->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGLES2_RenderCopyEx(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect,\n                 const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLfloat vertices[8];\n    GLfloat texCoords[8];\n    GLfloat translate[8];\n    GLfloat fAngle[4];\n    GLfloat tmp;\n\n    GLES2_ActivateRenderer(renderer);\n\n    if (GLES2_SetupCopy(renderer, texture) < 0) {\n        return -1;\n    }\n\n    data->glEnableVertexAttribArray(GLES2_ATTRIBUTE_CENTER);\n    data->glEnableVertexAttribArray(GLES2_ATTRIBUTE_ANGLE);\n    fAngle[0] = fAngle[1] = fAngle[2] = fAngle[3] = (GLfloat)(360.0f - angle);\n    /* Calculate the center of rotation */\n    translate[0] = translate[2] = translate[4] = translate[6] = (center->x + dstrect->x);\n    translate[1] = translate[3] = translate[5] = translate[7] = (center->y + dstrect->y);\n\n    /* Emit the textured quad */\n    vertices[0] = dstrect->x;\n    vertices[1] = dstrect->y;\n    vertices[2] = (dstrect->x + dstrect->w);\n    vertices[3] = dstrect->y;\n    vertices[4] = dstrect->x;\n    vertices[5] = (dstrect->y + dstrect->h);\n    vertices[6] = (dstrect->x + dstrect->w);\n    vertices[7] = (dstrect->y + dstrect->h);\n    if (flip & SDL_FLIP_HORIZONTAL) {\n        tmp = vertices[0];\n        vertices[0] = vertices[4] = vertices[2];\n        vertices[2] = vertices[6] = tmp;\n    }\n    if (flip & SDL_FLIP_VERTICAL) {\n        tmp = vertices[1];\n        vertices[1] = vertices[3] = vertices[5];\n        vertices[5] = vertices[7] = tmp;\n    }\n\n    /*data->glVertexAttribPointer(GLES2_ATTRIBUTE_ANGLE, 1, GL_FLOAT, GL_FALSE, 0, &fAngle);\n    data->glVertexAttribPointer(GLES2_ATTRIBUTE_CENTER, 2, GL_FLOAT, GL_FALSE, 0, translate);\n    data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);*/\n\n    GLES2_UpdateVertexBuffer(renderer, GLES2_ATTRIBUTE_ANGLE, fAngle, 4 * sizeof(GLfloat));\n    GLES2_UpdateVertexBuffer(renderer, GLES2_ATTRIBUTE_CENTER, translate, 8 * sizeof(GLfloat));\n    GLES2_UpdateVertexBuffer(renderer, GLES2_ATTRIBUTE_POSITION, vertices, 8 * sizeof(GLfloat));\n\n    texCoords[0] = srcrect->x / (GLfloat)texture->w;\n    texCoords[1] = srcrect->y / (GLfloat)texture->h;\n    texCoords[2] = (srcrect->x + srcrect->w) / (GLfloat)texture->w;\n    texCoords[3] = srcrect->y / (GLfloat)texture->h;\n    texCoords[4] = srcrect->x / (GLfloat)texture->w;\n    texCoords[5] = (srcrect->y + srcrect->h) / (GLfloat)texture->h;\n    texCoords[6] = (srcrect->x + srcrect->w) / (GLfloat)texture->w;\n    texCoords[7] = (srcrect->y + srcrect->h) / (GLfloat)texture->h;\n    /*data->glVertexAttribPointer(GLES2_ATTRIBUTE_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, texCoords);*/\n    GLES2_UpdateVertexBuffer(renderer, GLES2_ATTRIBUTE_TEXCOORD, texCoords, 8 * sizeof(GLfloat));\n    data->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n    data->glDisableVertexAttribArray(GLES2_ATTRIBUTE_CENTER);\n    data->glDisableVertexAttribArray(GLES2_ATTRIBUTE_ANGLE);\n\n    return GL_CheckError(\"\", renderer);\n}\n\nstatic int\nGLES2_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                    Uint32 pixel_format, void * pixels, int pitch)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    Uint32 temp_format = renderer->target ? renderer->target->format : SDL_PIXELFORMAT_ABGR8888;\n    void *temp_pixels;\n    int temp_pitch;\n    Uint8 *src, *dst, *tmp;\n    int w, h, length, rows;\n    int status;\n\n    GLES2_ActivateRenderer(renderer);\n\n    temp_pitch = rect->w * SDL_BYTESPERPIXEL(temp_format);\n    temp_pixels = SDL_malloc(rect->h * temp_pitch);\n    if (!temp_pixels) {\n        return SDL_OutOfMemory();\n    }\n\n    SDL_GetRendererOutputSize(renderer, &w, &h);\n\n    data->glReadPixels(rect->x, renderer->target ? rect->y : (h-rect->y)-rect->h,\n                       rect->w, rect->h, GL_RGBA, GL_UNSIGNED_BYTE, temp_pixels);\n    if (GL_CheckError(\"glReadPixels()\", renderer) < 0) {\n        return -1;\n    }\n\n    /* Flip the rows to be top-down if necessary */\n    if (!renderer->target) {\n        length = rect->w * SDL_BYTESPERPIXEL(temp_format);\n        src = (Uint8*)temp_pixels + (rect->h-1)*temp_pitch;\n        dst = (Uint8*)temp_pixels;\n        tmp = SDL_stack_alloc(Uint8, length);\n        rows = rect->h / 2;\n        while (rows--) {\n            SDL_memcpy(tmp, dst, length);\n            SDL_memcpy(dst, src, length);\n            SDL_memcpy(src, tmp, length);\n            dst += temp_pitch;\n            src -= temp_pitch;\n        }\n        SDL_stack_free(tmp);\n    }\n\n    status = SDL_ConvertPixels(rect->w, rect->h,\n                               temp_format, temp_pixels, temp_pitch,\n                               pixel_format, pixels, pitch);\n    SDL_free(temp_pixels);\n\n    return status;\n}\n\nstatic void\nGLES2_RenderPresent(SDL_Renderer *renderer)\n{\n    GLES2_ActivateRenderer(renderer);\n\n    /* Tell the video driver to swap buffers */\n    SDL_GL_SwapWindow(renderer->window);\n}\n\n\n/*************************************************************************************************\n * Bind/unbinding of textures\n *************************************************************************************************/\nstatic int GLES2_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh);\nstatic int GLES2_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture);\n\nstatic int GLES2_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLES2_TextureData *texturedata = (GLES2_TextureData *)texture->driverdata;\n    GLES2_ActivateRenderer(renderer);\n\n    data->glBindTexture(texturedata->texture_type, texturedata->texture);\n\n    if (texw) {\n        *texw = 1.0;\n    }\n    if (texh) {\n        *texh = 1.0;\n    }\n\n    return 0;\n}\n\nstatic int GLES2_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *)renderer->driverdata;\n    GLES2_TextureData *texturedata = (GLES2_TextureData *)texture->driverdata;\n    GLES2_ActivateRenderer(renderer);\n\n    data->glBindTexture(texturedata->texture_type, 0);\n\n    return 0;\n}\n\n\n/*************************************************************************************************\n * Renderer instantiation                                                                        *\n *************************************************************************************************/\n\n#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B\n\nstatic void\nGLES2_ResetState(SDL_Renderer *renderer)\n{\n    GLES2_DriverContext *data = (GLES2_DriverContext *) renderer->driverdata;\n\n    if (SDL_CurrentContext == data->context) {\n        GLES2_UpdateViewport(renderer);\n    } else {\n        GLES2_ActivateRenderer(renderer);\n    }\n\n    data->current.blendMode = -1;\n    data->current.tex_coords = SDL_FALSE;\n\n    data->glActiveTexture(GL_TEXTURE0);\n    data->glPixelStorei(GL_PACK_ALIGNMENT, 1);\n    data->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n\n    data->glClearColor((GLfloat) data->clear_r * inv255f,\n                        (GLfloat) data->clear_g * inv255f,\n                        (GLfloat) data->clear_b * inv255f,\n                        (GLfloat) data->clear_a * inv255f);\n\n    data->glEnableVertexAttribArray(GLES2_ATTRIBUTE_POSITION);\n    data->glDisableVertexAttribArray(GLES2_ATTRIBUTE_TEXCOORD);\n\n    GL_CheckError(\"\", renderer);\n}\n\nstatic SDL_Renderer *\nGLES2_CreateRenderer(SDL_Window *window, Uint32 flags)\n{\n    SDL_Renderer *renderer;\n    GLES2_DriverContext *data;\n    GLint nFormats;\n#ifndef ZUNE_HD\n    GLboolean hasCompiler;\n#endif\n    Uint32 window_flags;\n    GLint window_framebuffer;\n    GLint value;\n    int profile_mask = 0, major = 0, minor = 0;\n    SDL_bool changed_window = SDL_FALSE;\n\n    if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask) < 0) {\n        goto error;\n    }\n    if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major) < 0) {\n        goto error;\n    }\n    if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor) < 0) {\n        goto error;\n    }\n\n    window_flags = SDL_GetWindowFlags(window);\n    if (!(window_flags & SDL_WINDOW_OPENGL) ||\n        profile_mask != SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) {\n\n        changed_window = SDL_TRUE;\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, RENDERER_CONTEXT_MAJOR);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, RENDERER_CONTEXT_MINOR);\n\n        if (SDL_RecreateWindow(window, window_flags | SDL_WINDOW_OPENGL) < 0) {\n            goto error;\n        }\n    }\n\n    /* Create the renderer struct */\n    renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(SDL_Renderer));\n    if (!renderer) {\n        SDL_OutOfMemory();\n        goto error;\n    }\n\n    data = (GLES2_DriverContext *)SDL_calloc(1, sizeof(GLES2_DriverContext));\n    if (!data) {\n        GLES2_DestroyRenderer(renderer);\n        SDL_OutOfMemory();\n        goto error;\n    }\n    renderer->info = GLES2_RenderDriver.info;\n    renderer->info.flags = (SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);\n    renderer->driverdata = data;\n    renderer->window = window;\n\n    /* Create an OpenGL ES 2.0 context */\n    data->context = SDL_GL_CreateContext(window);\n    if (!data->context) {\n        GLES2_DestroyRenderer(renderer);\n        goto error;\n    }\n    if (SDL_GL_MakeCurrent(window, data->context) < 0) {\n        GLES2_DestroyRenderer(renderer);\n        goto error;\n    }\n\n    if (GLES2_LoadFunctions(data) < 0) {\n        GLES2_DestroyRenderer(renderer);\n        goto error;\n    }\n\n#if __WINRT__\n    /* DLudwig, 2013-11-29: ANGLE for WinRT doesn't seem to work unless VSync\n     * is turned on.  Not doing so will freeze the screen's contents to that\n     * of the first drawn frame.\n     */\n    flags |= SDL_RENDERER_PRESENTVSYNC;\n#endif\n\n    if (flags & SDL_RENDERER_PRESENTVSYNC) {\n        SDL_GL_SetSwapInterval(1);\n    } else {\n        SDL_GL_SetSwapInterval(0);\n    }\n    if (SDL_GL_GetSwapInterval() > 0) {\n        renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;\n    }\n\n    /* Check for debug output support */\n    if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_FLAGS, &value) == 0 &&\n        (value & SDL_GL_CONTEXT_DEBUG_FLAG)) {\n        data->debug_enabled = SDL_TRUE;\n    }\n\n    value = 0;\n    data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);\n    renderer->info.max_texture_width = value;\n    value = 0;\n    data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);\n    renderer->info.max_texture_height = value;\n\n    /* Determine supported shader formats */\n    /* HACK: glGetInteger is broken on the Zune HD's compositor, so we just hardcode this */\n#ifdef ZUNE_HD\n    nFormats = 1;\n#else /* !ZUNE_HD */\n    data->glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &nFormats);\n    data->glGetBooleanv(GL_SHADER_COMPILER, &hasCompiler);\n    if (hasCompiler) {\n        ++nFormats;\n    }\n#endif /* ZUNE_HD */\n    data->shader_formats = (GLenum *)SDL_calloc(nFormats, sizeof(GLenum));\n    if (!data->shader_formats) {\n        GLES2_DestroyRenderer(renderer);\n        SDL_OutOfMemory();\n        goto error;\n    }\n    data->shader_format_count = nFormats;\n#ifdef ZUNE_HD\n    data->shader_formats[0] = GL_NVIDIA_PLATFORM_BINARY_NV;\n#else /* !ZUNE_HD */\n    data->glGetIntegerv(GL_SHADER_BINARY_FORMATS, (GLint *)data->shader_formats);\n    if (hasCompiler) {\n        data->shader_formats[nFormats - 1] = (GLenum)-1;\n    }\n#endif /* ZUNE_HD */\n\n    data->framebuffers = NULL;\n    data->glGetIntegerv(GL_FRAMEBUFFER_BINDING, &window_framebuffer);\n    data->window_framebuffer = (GLuint)window_framebuffer;\n\n    /* Populate the function pointers for the module */\n    renderer->WindowEvent         = &GLES2_WindowEvent;\n    renderer->GetOutputSize       = &GLES2_GetOutputSize;\n    renderer->CreateTexture       = &GLES2_CreateTexture;\n    renderer->UpdateTexture       = &GLES2_UpdateTexture;\n    renderer->UpdateTextureYUV    = &GLES2_UpdateTextureYUV;\n    renderer->LockTexture         = &GLES2_LockTexture;\n    renderer->UnlockTexture       = &GLES2_UnlockTexture;\n    renderer->SetRenderTarget     = &GLES2_SetRenderTarget;\n    renderer->UpdateViewport      = &GLES2_UpdateViewport;\n    renderer->UpdateClipRect      = &GLES2_UpdateClipRect;\n    renderer->RenderClear         = &GLES2_RenderClear;\n    renderer->RenderDrawPoints    = &GLES2_RenderDrawPoints;\n    renderer->RenderDrawLines     = &GLES2_RenderDrawLines;\n    renderer->RenderFillRects     = &GLES2_RenderFillRects;\n    renderer->RenderCopy          = &GLES2_RenderCopy;\n    renderer->RenderCopyEx        = &GLES2_RenderCopyEx;\n    renderer->RenderReadPixels    = &GLES2_RenderReadPixels;\n    renderer->RenderPresent       = &GLES2_RenderPresent;\n    renderer->DestroyTexture      = &GLES2_DestroyTexture;\n    renderer->DestroyRenderer     = &GLES2_DestroyRenderer;\n    renderer->GL_BindTexture      = &GLES2_BindTexture;\n    renderer->GL_UnbindTexture    = &GLES2_UnbindTexture;\n\n    renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;\n    renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_IYUV;\n    renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV12;\n    renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV21;\n\n    GLES2_ResetState(renderer);\n\n    return renderer;\n\nerror:\n    if (changed_window) {\n        /* Uh oh, better try to put it back... */\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile_mask);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);\n        SDL_RecreateWindow(window, window_flags);\n    }\n    return NULL;\n}\n\n#endif /* SDL_VIDEO_RENDER_OGL_ES2 && !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/opengles2/SDL_shaders_gles2.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_RENDER_OGL_ES2 && !SDL_RENDER_DISABLED\n\n#include \"SDL_video.h\"\n#include \"SDL_opengles2.h\"\n#include \"SDL_shaders_gles2.h\"\n#include \"SDL_stdinc.h\"\n\n/*************************************************************************************************\n * Vertex/fragment shader source                                                                 *\n *************************************************************************************************/\n\nstatic const Uint8 GLES2_VertexSrc_Default_[] = \" \\\n    uniform mat4 u_projection; \\\n    attribute vec2 a_position; \\\n    attribute vec2 a_texCoord; \\\n    attribute float a_angle; \\\n    attribute vec2 a_center; \\\n    varying vec2 v_texCoord; \\\n    \\\n    void main() \\\n    { \\\n        float angle = radians(a_angle); \\\n        float c = cos(angle); \\\n        float s = sin(angle); \\\n        mat2 rotationMatrix = mat2(c, -s, s, c); \\\n        vec2 position = rotationMatrix * (a_position - a_center) + a_center; \\\n        v_texCoord = a_texCoord; \\\n        gl_Position = u_projection * vec4(position, 0.0, 1.0);\\\n        gl_PointSize = 1.0; \\\n    } \\\n\";\n\nstatic const Uint8 GLES2_FragmentSrc_SolidSrc_[] = \" \\\n    precision mediump float; \\\n    uniform vec4 u_color; \\\n    \\\n    void main() \\\n    { \\\n        gl_FragColor = u_color; \\\n    } \\\n\";\n\nstatic const Uint8 GLES2_FragmentSrc_TextureABGRSrc_[] = \" \\\n    precision mediump float; \\\n    uniform sampler2D u_texture; \\\n    uniform vec4 u_modulation; \\\n    varying vec2 v_texCoord; \\\n    \\\n    void main() \\\n    { \\\n        gl_FragColor = texture2D(u_texture, v_texCoord); \\\n        gl_FragColor *= u_modulation; \\\n    } \\\n\";\n\n/* ARGB to ABGR conversion */\nstatic const Uint8 GLES2_FragmentSrc_TextureARGBSrc_[] = \" \\\n    precision mediump float; \\\n    uniform sampler2D u_texture; \\\n    uniform vec4 u_modulation; \\\n    varying vec2 v_texCoord; \\\n    \\\n    void main() \\\n    { \\\n        vec4 abgr = texture2D(u_texture, v_texCoord); \\\n        gl_FragColor = abgr; \\\n        gl_FragColor.r = abgr.b; \\\n        gl_FragColor.b = abgr.r; \\\n        gl_FragColor *= u_modulation; \\\n    } \\\n\";\n\n/* RGB to ABGR conversion */\nstatic const Uint8 GLES2_FragmentSrc_TextureRGBSrc_[] = \" \\\n    precision mediump float; \\\n    uniform sampler2D u_texture; \\\n    uniform vec4 u_modulation; \\\n    varying vec2 v_texCoord; \\\n    \\\n    void main() \\\n    { \\\n        vec4 abgr = texture2D(u_texture, v_texCoord); \\\n        gl_FragColor = abgr; \\\n        gl_FragColor.r = abgr.b; \\\n        gl_FragColor.b = abgr.r; \\\n        gl_FragColor.a = 1.0; \\\n        gl_FragColor *= u_modulation; \\\n    } \\\n\";\n\n/* BGR to ABGR conversion */\nstatic const Uint8 GLES2_FragmentSrc_TextureBGRSrc_[] = \" \\\n    precision mediump float; \\\n    uniform sampler2D u_texture; \\\n    uniform vec4 u_modulation; \\\n    varying vec2 v_texCoord; \\\n    \\\n    void main() \\\n    { \\\n        vec4 abgr = texture2D(u_texture, v_texCoord); \\\n        gl_FragColor = abgr; \\\n        gl_FragColor.a = 1.0; \\\n        gl_FragColor *= u_modulation; \\\n    } \\\n\";\n\n/* YUV to ABGR conversion */\nstatic const Uint8 GLES2_FragmentSrc_TextureYUVSrc_[] = \" \\\n    precision mediump float; \\\n    uniform sampler2D u_texture; \\\n    uniform sampler2D u_texture_u; \\\n    uniform sampler2D u_texture_v; \\\n    uniform vec4 u_modulation; \\\n    varying vec2 v_texCoord; \\\n    \\\n    void main() \\\n    { \\\n        mediump vec3 yuv; \\\n        lowp vec3 rgb; \\\n        yuv.x = texture2D(u_texture,   v_texCoord).r; \\\n        yuv.y = texture2D(u_texture_u, v_texCoord).r - 0.5; \\\n        yuv.z = texture2D(u_texture_v, v_texCoord).r - 0.5; \\\n        rgb = mat3( 1,        1,       1, \\\n                    0,       -0.39465, 2.03211, \\\n                    1.13983, -0.58060, 0) * yuv; \\\n        gl_FragColor = vec4(rgb, 1); \\\n        gl_FragColor *= u_modulation; \\\n    } \\\n\";\n\n/* NV12 to ABGR conversion */\nstatic const Uint8 GLES2_FragmentSrc_TextureNV12Src_[] = \" \\\n    precision mediump float; \\\n    uniform sampler2D u_texture; \\\n    uniform sampler2D u_texture_u; \\\n    uniform vec4 u_modulation; \\\n    varying vec2 v_texCoord; \\\n    \\\n    void main() \\\n    { \\\n        mediump vec3 yuv; \\\n        lowp vec3 rgb; \\\n        yuv.x = texture2D(u_texture,   v_texCoord).r; \\\n        yuv.yz = texture2D(u_texture_u, v_texCoord).ra - 0.5; \\\n        rgb = mat3( 1,        1,       1, \\\n                    0,       -0.39465, 2.03211, \\\n                    1.13983, -0.58060, 0) * yuv; \\\n        gl_FragColor = vec4(rgb, 1); \\\n        gl_FragColor *= u_modulation; \\\n    } \\\n\";\n\n/* NV21 to ABGR conversion */\nstatic const Uint8 GLES2_FragmentSrc_TextureNV21Src_[] = \" \\\n    precision mediump float; \\\n    uniform sampler2D u_texture; \\\n    uniform sampler2D u_texture_u; \\\n    uniform vec4 u_modulation; \\\n    varying vec2 v_texCoord; \\\n    \\\n    void main() \\\n    { \\\n        mediump vec3 yuv; \\\n        lowp vec3 rgb; \\\n        yuv.x = texture2D(u_texture,   v_texCoord).r; \\\n        yuv.yz = texture2D(u_texture_u, v_texCoord).ar - 0.5; \\\n        rgb = mat3( 1,        1,       1, \\\n                    0,       -0.39465, 2.03211, \\\n                    1.13983, -0.58060, 0) * yuv; \\\n        gl_FragColor = vec4(rgb, 1); \\\n        gl_FragColor *= u_modulation; \\\n    } \\\n\";\n\nstatic const GLES2_ShaderInstance GLES2_VertexSrc_Default = {\n    GL_VERTEX_SHADER,\n    GLES2_SOURCE_SHADER,\n    sizeof(GLES2_VertexSrc_Default_),\n    GLES2_VertexSrc_Default_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentSrc_SolidSrc = {\n    GL_FRAGMENT_SHADER,\n    GLES2_SOURCE_SHADER,\n    sizeof(GLES2_FragmentSrc_SolidSrc_),\n    GLES2_FragmentSrc_SolidSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentSrc_TextureABGRSrc = {\n    GL_FRAGMENT_SHADER,\n    GLES2_SOURCE_SHADER,\n    sizeof(GLES2_FragmentSrc_TextureABGRSrc_),\n    GLES2_FragmentSrc_TextureABGRSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentSrc_TextureARGBSrc = {\n    GL_FRAGMENT_SHADER,\n    GLES2_SOURCE_SHADER,\n    sizeof(GLES2_FragmentSrc_TextureARGBSrc_),\n    GLES2_FragmentSrc_TextureARGBSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentSrc_TextureRGBSrc = {\n    GL_FRAGMENT_SHADER,\n    GLES2_SOURCE_SHADER,\n    sizeof(GLES2_FragmentSrc_TextureRGBSrc_),\n    GLES2_FragmentSrc_TextureRGBSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentSrc_TextureBGRSrc = {\n    GL_FRAGMENT_SHADER,\n    GLES2_SOURCE_SHADER,\n    sizeof(GLES2_FragmentSrc_TextureBGRSrc_),\n    GLES2_FragmentSrc_TextureBGRSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVSrc = {\n    GL_FRAGMENT_SHADER,\n    GLES2_SOURCE_SHADER,\n    sizeof(GLES2_FragmentSrc_TextureYUVSrc_),\n    GLES2_FragmentSrc_TextureYUVSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12Src = {\n    GL_FRAGMENT_SHADER,\n    GLES2_SOURCE_SHADER,\n    sizeof(GLES2_FragmentSrc_TextureNV12Src_),\n    GLES2_FragmentSrc_TextureNV12Src_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21Src = {\n    GL_FRAGMENT_SHADER,\n    GLES2_SOURCE_SHADER,\n    sizeof(GLES2_FragmentSrc_TextureNV21Src_),\n    GLES2_FragmentSrc_TextureNV21Src_\n};\n\n\n/*************************************************************************************************\n * Vertex/fragment shader binaries (NVIDIA Tegra 1/2)                                            *\n *************************************************************************************************/\n\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n\n#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B\n\nstatic const Uint8 GLES2_VertexTegra_Default_[] = {\n    243, 193, 1, 142, 31, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,\n    0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 85, 0, 0, 0, 2, 0, 0, 0, 24, 0, 0, 0, 3, 0, 0, 0,\n    91, 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 0, 5, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 95, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0,\n    13, 0, 0, 0, 102, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 16, 0, 0, 0, 104, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 17, 0, 0, 0, 112, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 112, 0, 0, 0, 80, 0, 0, 0, 80, 0, 0, 0, 19, 0, 0, 0, 132, 0,\n    0, 0, 104, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97,\n    95, 112, 111, 115, 105, 116, 105, 111, 110, 0, 97, 95, 116, 101, 120, 67, 111, 111, 114, 100,\n    0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 112, 114, 111, 106, 101, 99,\n    116, 105, 111, 110, 0, 0, 0, 0, 0, 0, 0, 82, 139, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 80, 139, 0,\n    0, 1, 0, 0, 0, 22, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 33, 0, 0, 0, 92, 139, 0, 0,\n    1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 240, 0, 0, 0, 0, 0, 0, 1, 0,\n    0, 0, 64, 0, 0, 0, 80, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 193, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 66, 24, 0, 6, 34, 108, 28,\n    0, 0, 42, 16, 128, 0, 195, 192, 6, 129, 252, 255, 65, 96, 108, 28, 0, 0, 0, 0, 0, 1, 195, 192,\n    6, 1, 252, 255, 33, 96, 108, 156, 31, 64, 8, 1, 64, 0, 131, 192, 6, 1, 156, 159, 65, 96, 108,\n    28, 0, 0, 85, 32, 0, 1, 195, 192, 6, 1, 252, 255, 33, 96, 108, 156, 31, 64, 0, 64, 64, 0, 131,\n    192, 134, 1, 152, 31, 65, 96, 108, 156, 31, 64, 127, 48, 0, 1, 195, 192, 6, 129, 129, 255, 33,\n    96\n};\n\nstatic const Uint8 GLES2_FragmentTegra_None_SolidSrc_[] = {\n    155, 191, 159, 1, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,\n    0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 75,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 13, 0,\n    0, 0, 82, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    22, 0, 0, 0, 84, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 4,\n    0, 0, 0, 15, 0, 0, 0, 93, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 113, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 113, 0, 0,\n    0, 108, 0, 0, 0, 108, 0, 0, 0, 20, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0,\n    0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 117, 95, 99, 111, 108, 111, 114, 0, 0, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 240, 0, 0,\n    0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0,\n    0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1,\n    0, 0, 0, 1, 0, 0, 0, 1, 0, 65, 37, 0, 0, 0, 0, 1, 0, 0, 21, 0, 0, 0, 0, 1, 0, 1, 38, 0, 0, 0,\n    0, 1, 0, 1, 39, 0, 0, 0, 0, 1, 0, 1, 40, 1, 0, 0, 0, 8, 0, 4, 40, 0, 40, 0, 0, 0, 242, 65, 63,\n    192, 200, 0, 0, 0, 242, 65, 63, 128, 168, 0, 0, 0, 242, 65, 63, 64, 72, 0, 0, 0, 242, 65, 63,\n    1, 0, 6, 40, 0, 0, 0, 0, 1, 0, 1, 41, 5, 0, 2, 0\n};\n\nstatic const Uint8 GLES2_FragmentTegra_Alpha_SolidSrc_[] = {\n    169, 153, 195, 28, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,\n    0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 75,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 13, 0,\n    0, 0, 82, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    22, 0, 0, 0, 84, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 4,\n    0, 0, 0, 15, 0, 0, 0, 93, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 113, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 113, 0, 0,\n    0, 220, 0, 0, 0, 220, 0, 0, 0, 20, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0,\n    0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 117, 95, 99, 111, 108, 111, 114, 0, 0, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 118, 118, 17, 241, 0, 0, 0, 240, 0,\n    0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0,\n    0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 21, 32, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78,\n    1, 0, 0, 0, 3, 0, 0, 0, 3, 0, 65, 37, 8, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 21, 0,\n    0, 0, 0, 3, 0, 1, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 39, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 3, 0, 1, 40, 1, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 24, 0, 4, 40, 232, 231, 15,\n    0, 0, 242, 65, 62, 194, 72, 1, 0, 0, 250, 65, 63, 194, 40, 1, 0, 0, 250, 65, 63, 192, 168, 1,\n    0, 0, 242, 1, 64, 192, 168, 1, 0, 0, 242, 1, 68, 168, 32, 0, 0, 0, 50, 64, 0, 192, 168, 15,\n    0, 0, 242, 1, 66, 168, 64, 0, 16, 0, 242, 65, 1, 232, 231, 15, 0, 0, 242, 65, 62, 168, 160,\n    0, 0, 0, 50, 64, 2, 104, 192, 0, 0, 36, 48, 66, 4, 232, 231, 15, 0, 0, 242, 65, 62, 3, 0, 6,\n    40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 2, 0\n};\n\nstatic const Uint8 GLES2_FragmentTegra_Additive_SolidSrc_[] = {\n    59, 71, 42, 17, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0, 0,\n    0, 8, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 75,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 13, 0,\n    0, 0, 82, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    22, 0, 0, 0, 84, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 4,\n    0, 0, 0, 15, 0, 0, 0, 93, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 113, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 113, 0, 0,\n    0, 108, 0, 0, 0, 108, 0, 0, 0, 20, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0,\n    0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 117, 95, 99, 111, 108, 111, 114, 0, 0, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 22, 22, 17, 241, 0, 0, 0, 240, 0,\n    0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0,\n    0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 21, 32, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78,\n    1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 65, 37, 8, 0, 129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 1, 0, 1, 38, 0,\n    0, 0, 0, 1, 0, 1, 39, 0, 0, 0, 0, 1, 0, 1, 40, 1, 0, 0, 0, 8, 0, 4, 40, 192, 200, 0, 0, 0, 26,\n    0, 70, 192, 40, 0, 0, 0, 2, 0, 64, 192, 72, 0, 0, 0, 10, 0, 66, 192, 168, 0, 0, 0, 18, 0, 68,\n    1, 0, 6, 40, 0, 0, 0, 0, 1, 0, 1, 41, 5, 0, 2, 0\n};\n\nstatic const Uint8 GLES2_FragmentTegra_Modulated_SolidSrc_[] = {\n    37, 191, 49, 17, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0, 0,\n    0, 8, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 75,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n    75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 13, 0,\n    0, 0, 82, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    22, 0, 0, 0, 84, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 4,\n    0, 0, 0, 15, 0, 0, 0, 93, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 113, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 113, 0, 0,\n    0, 108, 0, 0, 0, 108, 0, 0, 0, 20, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0,\n    0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 117, 95, 99, 111, 108, 111, 114, 0, 0, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 32, 32, 17, 241, 0, 0, 0, 240, 0,\n    0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0,\n    0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 21, 32, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78,\n    1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 65, 37, 8, 0, 129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 1, 0, 1, 38, 0,\n    0, 0, 0, 1, 0, 1, 39, 0, 0, 0, 0, 1, 0, 1, 40, 1, 0, 0, 0, 8, 0, 4, 40, 104, 192, 0, 0, 0, 242,\n    1, 70, 8, 32, 0, 0, 0, 242, 1, 64, 40, 64, 0, 0, 0, 242, 1, 66, 72, 160, 0, 0, 0, 242, 1, 68,\n    1, 0, 6, 40, 0, 0, 0, 0, 1, 0, 1, 41, 5, 0, 2, 0\n};\n\nstatic const Uint8 GLES2_FragmentTegra_None_TextureSrc_[] = {\n    220, 217, 41, 211, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,\n    0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,\n    82, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 6, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,\n    0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 87, 0, 0, 0, 2, 0, 0, 0, 56, 0, 0, 0,\n    13, 0, 0, 0, 101, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 105, 0, 0, 0, 1, 0, 0, 0, 4,\n    0, 0, 0, 22, 0, 0, 0, 106, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 114, 0, 0, 0, 1, 0,\n    0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 115, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 135, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 135,\n    0, 0, 0, 120, 0, 0, 0, 120, 0, 0, 0, 20, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,\n    0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 109, 111, 100, 117, 108,\n    97, 116, 105, 111, 110, 0, 117, 95, 116, 101, 120, 116, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0,\n    2, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 94, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0,\n    0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 1, 0, 0, 0, 241, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240,\n    0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1, 0,\n    0, 0, 1, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0,\n    0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 65, 37, 0, 0, 0, 0, 1, 0,\n    0, 21, 0, 0, 0, 0, 1, 0, 1, 38, 1, 0, 0, 0, 2, 0, 4, 38, 186, 81, 78, 16, 2, 1, 0, 0, 1, 0,\n    1, 39, 0, 4, 0, 0, 1, 0, 1, 40, 1, 0, 0, 0, 8, 0, 4, 40, 104, 192, 0, 0, 0, 242, 1, 70, 8, 32,\n    0, 0, 0, 242, 1, 64, 40, 64, 0, 0, 0, 242, 1, 66, 72, 160, 0, 0, 0, 242, 1, 68, 1, 0, 6, 40,\n    0, 0, 0, 0, 1, 0, 1, 41, 5, 0, 2, 0\n};\n\nstatic const Uint8 GLES2_FragmentTegra_Alpha_TextureSrc_[] = {\n    71, 202, 114, 229, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,\n    0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,\n    82, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 6, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,\n    0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 87, 0, 0, 0, 2, 0, 0, 0, 56, 0, 0, 0,\n    13, 0, 0, 0, 101, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 105, 0, 0, 0, 1, 0, 0, 0, 4,\n    0, 0, 0, 22, 0, 0, 0, 106, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 114, 0, 0, 0, 1, 0,\n    0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 115, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 135, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 135,\n    0, 0, 0, 176, 0, 0, 0, 176, 0, 0, 0, 20, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,\n    0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 109, 111, 100, 117, 108,\n    97, 116, 105, 111, 110, 0, 117, 95, 116, 101, 120, 116, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0,\n    2, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 94, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0,\n    0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 1, 118, 118, 17, 241, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0,\n    240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0,\n    1, 0, 0, 0, 2, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 16, 0, 0, 0, 16,\n    0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 65, 37, 0, 0, 0, 0,\n    8, 0, 129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 2, 0, 1, 38, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 38, 186,\n    81, 78, 16, 2, 1, 0, 0, 2, 0, 1, 39, 0, 4, 0, 0, 0, 0, 0, 0, 2, 0, 1, 40, 1, 0, 0, 0, 5, 0,\n    0, 0, 16, 0, 4, 40, 40, 160, 1, 0, 0, 242, 1, 66, 8, 192, 1, 0, 0, 242, 1, 64, 104, 32, 1, 0,\n    0, 242, 1, 70, 72, 64, 1, 0, 0, 242, 1, 68, 154, 192, 0, 0, 37, 34, 64, 3, 8, 32, 0, 0, 5, 58,\n    208, 4, 40, 64, 0, 0, 5, 50, 208, 4, 72, 160, 0, 0, 37, 42, 208, 4, 2, 0, 6, 40, 0, 0, 0, 0,\n    0, 0, 0, 0, 2, 0, 1, 41, 0, 0, 0, 0, 5, 0, 2, 0\n};\n\nstatic const Uint8 GLES2_FragmentTegra_Additive_TextureSrc_[] = {\n    161, 234, 193, 234, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,\n    0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,\n    82, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 6, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,\n    0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 87, 0, 0, 0, 2, 0, 0, 0, 56, 0, 0, 0,\n    13, 0, 0, 0, 101, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 105, 0, 0, 0, 1, 0, 0, 0, 4,\n    0, 0, 0, 22, 0, 0, 0, 106, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 114, 0, 0, 0, 1, 0,\n    0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 115, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 135, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 135,\n    0, 0, 0, 176, 0, 0, 0, 176, 0, 0, 0, 20, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,\n    0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 109, 111, 100, 117, 108,\n    97, 116, 105, 111, 110, 0, 117, 95, 116, 101, 120, 116, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0,\n    2, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 94, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0,\n    0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 1, 22, 22, 17, 241, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240,\n    0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0,\n    0, 0, 2, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0,\n    0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 65, 37, 0, 0, 0, 0, 8, 0,\n    129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 2, 0, 1, 38, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 38, 186, 81,\n    78, 16, 2, 1, 0, 0, 2, 0, 1, 39, 0, 4, 0, 0, 0, 0, 0, 0, 2, 0, 1, 40, 1, 0, 0, 0, 5, 0, 0, 0,\n    16, 0, 4, 40, 40, 160, 1, 0, 0, 242, 1, 66, 104, 32, 1, 0, 0, 242, 1, 70, 8, 192, 1, 0, 0, 242,\n    1, 64, 72, 64, 1, 0, 0, 242, 1, 68, 136, 192, 0, 0, 0, 26, 64, 4, 136, 32, 0, 0, 0, 2, 64, 7,\n    136, 64, 0, 0, 0, 10, 64, 6, 136, 160, 0, 0, 0, 18, 64, 5, 2, 0, 6, 40, 0, 0, 0, 0, 0, 0, 0,\n    0, 2, 0, 1, 41, 0, 0, 0, 0, 5, 0, 2, 0\n};\n\nstatic const Uint8 GLES2_FragmentTegra_Modulated_TextureSrc_[] = {\n    75, 132, 201, 227, 47, 109, 131, 38, 6, 0, 1, 0, 5, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 73, 0,\n    0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,\n    82, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 6, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,\n    0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 87, 0, 0, 0, 2, 0, 0, 0, 56, 0, 0, 0,\n    13, 0, 0, 0, 101, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, 105, 0, 0, 0, 1, 0, 0, 0, 4,\n    0, 0, 0, 22, 0, 0, 0, 106, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 23, 0, 0, 0, 114, 0, 0, 0, 1, 0,\n    0, 0, 4, 0, 0, 0, 15, 0, 0, 0, 115, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, 17, 0, 0, 0, 135, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 135,\n    0, 0, 0, 176, 0, 0, 0, 176, 0, 0, 0, 20, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,\n    0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 97, 110, 70, 73, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 118, 95, 116, 101, 120, 67, 111, 111, 114, 100, 0, 117, 95, 109, 111, 100, 117, 108,\n    97, 116, 105, 111, 110, 0, 117, 95, 116, 101, 120, 116, 117, 114, 101, 0, 0, 0, 0, 0, 0, 0,\n    2, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 82, 139, 0, 0, 1, 0, 0, 0, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 94, 139, 0, 0, 1, 0, 0, 0, 1, 0, 0,\n    0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 1, 32, 32, 17, 241, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 240,\n    0, 0, 0, 240, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0,\n    0, 0, 2, 0, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0,\n    0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 65, 82, 50, 48, 45, 66, 73, 78, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 65, 37, 0, 0, 0, 0, 8, 0,\n    129, 0, 1, 0, 0, 21, 0, 0, 0, 0, 2, 0, 1, 38, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 38, 186, 81,\n    78, 16, 2, 1, 0, 0, 2, 0, 1, 39, 0, 4, 0, 0, 0, 0, 0, 0, 2, 0, 1, 40, 1, 0, 0, 0, 5, 0, 0, 0,\n    16, 0, 4, 40, 40, 160, 1, 0, 0, 242, 1, 66, 8, 192, 1, 0, 0, 242, 1, 64, 104, 32, 1, 0, 0, 242,\n    1, 70, 72, 64, 1, 0, 0, 242, 1, 68, 104, 192, 0, 0, 0, 242, 65, 4, 232, 32, 0, 0, 0, 242, 65,\n    0, 40, 64, 0, 0, 0, 242, 65, 6, 72, 160, 0, 0, 0, 242, 65, 5, 2, 0, 6, 40, 0, 0, 0, 0, 0, 0,\n    0, 0, 2, 0, 1, 41, 0, 0, 0, 0, 5, 0, 2, 0\n};\n\nstatic const GLES2_ShaderInstance GLES2_VertexTegra_Default = {\n    GL_VERTEX_SHADER,\n    GL_NVIDIA_PLATFORM_BINARY_NV,\n    sizeof(GLES2_VertexTegra_Default_),\n    GLES2_VertexTegra_Default_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentTegra_None_SolidSrc = {\n    GL_FRAGMENT_SHADER,\n    GL_NVIDIA_PLATFORM_BINARY_NV,\n    sizeof(GLES2_FragmentTegra_None_SolidSrc_),\n    GLES2_FragmentTegra_None_SolidSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentTegra_Alpha_SolidSrc = {\n    GL_FRAGMENT_SHADER,\n    GL_NVIDIA_PLATFORM_BINARY_NV,\n    sizeof(GLES2_FragmentTegra_Alpha_SolidSrc_),\n    GLES2_FragmentTegra_Alpha_SolidSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentTegra_Additive_SolidSrc = {\n    GL_FRAGMENT_SHADER,\n    GL_NVIDIA_PLATFORM_BINARY_NV,\n    sizeof(GLES2_FragmentTegra_Additive_SolidSrc_),\n    GLES2_FragmentTegra_Additive_SolidSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentTegra_Modulated_SolidSrc = {\n    GL_FRAGMENT_SHADER,\n    GL_NVIDIA_PLATFORM_BINARY_NV,\n    sizeof(GLES2_FragmentTegra_Modulated_SolidSrc_),\n    GLES2_FragmentTegra_Modulated_SolidSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentTegra_None_TextureSrc = {\n    GL_FRAGMENT_SHADER,\n    GL_NVIDIA_PLATFORM_BINARY_NV,\n    sizeof(GLES2_FragmentTegra_None_TextureSrc_),\n    GLES2_FragmentTegra_None_TextureSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentTegra_Alpha_TextureSrc = {\n    GL_FRAGMENT_SHADER,\n    GL_NVIDIA_PLATFORM_BINARY_NV,\n    sizeof(GLES2_FragmentTegra_Alpha_TextureSrc_),\n    GLES2_FragmentTegra_Alpha_TextureSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentTegra_Additive_TextureSrc = {\n    GL_FRAGMENT_SHADER,\n    GL_NVIDIA_PLATFORM_BINARY_NV,\n    sizeof(GLES2_FragmentTegra_Additive_TextureSrc_),\n    GLES2_FragmentTegra_Additive_TextureSrc_\n};\n\nstatic const GLES2_ShaderInstance GLES2_FragmentTegra_Modulated_TextureSrc = {\n    GL_FRAGMENT_SHADER,\n    GL_NVIDIA_PLATFORM_BINARY_NV,\n    sizeof(GLES2_FragmentTegra_Modulated_TextureSrc_),\n    GLES2_FragmentTegra_Modulated_TextureSrc_\n};\n\n#endif /* GLES2_INCLUDE_NVIDIA_SHADERS */\n\n/*************************************************************************************************\n * Vertex/fragment shader definitions                                                            *\n *************************************************************************************************/\n\nstatic GLES2_Shader GLES2_VertexShader_Default = {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n    2,\n#else\n    1,\n#endif\n    {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n        &GLES2_VertexTegra_Default,\n#endif\n        &GLES2_VertexSrc_Default\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_None_SolidSrc = {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n    2,\n#else\n    1,\n#endif\n    {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n        &GLES2_FragmentTegra_None_SolidSrc,\n#endif\n        &GLES2_FragmentSrc_SolidSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Alpha_SolidSrc = {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n    2,\n#else\n    1,\n#endif\n    {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n        &GLES2_FragmentTegra_Alpha_SolidSrc,\n#endif\n        &GLES2_FragmentSrc_SolidSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Additive_SolidSrc = {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n    2,\n#else\n    1,\n#endif\n    {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n        &GLES2_FragmentTegra_Additive_SolidSrc,\n#endif\n        &GLES2_FragmentSrc_SolidSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Modulated_SolidSrc = {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n    2,\n#else\n    1,\n#endif\n    {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n        &GLES2_FragmentTegra_Modulated_SolidSrc,\n#endif\n        &GLES2_FragmentSrc_SolidSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_None_TextureABGRSrc = {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n    2,\n#else\n    1,\n#endif\n    {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n        &GLES2_FragmentTegra_None_TextureSrc,\n#endif\n        &GLES2_FragmentSrc_TextureABGRSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Alpha_TextureABGRSrc = {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n    2,\n#else\n    1,\n#endif\n    {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n        &GLES2_FragmentTegra_Alpha_TextureSrc,\n#endif\n        &GLES2_FragmentSrc_TextureABGRSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Additive_TextureABGRSrc = {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n    2,\n#else\n    1,\n#endif\n    {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n        &GLES2_FragmentTegra_Additive_TextureSrc,\n#endif\n        &GLES2_FragmentSrc_TextureABGRSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Modulated_TextureABGRSrc = {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n    2,\n#else\n    1,\n#endif\n    {\n#if GLES2_INCLUDE_NVIDIA_SHADERS\n        &GLES2_FragmentTegra_Modulated_TextureSrc,\n#endif\n        &GLES2_FragmentSrc_TextureABGRSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_None_TextureARGBSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureARGBSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Alpha_TextureARGBSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureARGBSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Additive_TextureARGBSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureARGBSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Modulated_TextureARGBSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureARGBSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_None_TextureRGBSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureRGBSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Alpha_TextureRGBSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureRGBSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Additive_TextureRGBSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureRGBSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Modulated_TextureRGBSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureRGBSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_None_TextureBGRSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureBGRSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Alpha_TextureBGRSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureBGRSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Additive_TextureBGRSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureBGRSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_Modulated_TextureBGRSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureBGRSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_TextureYUVSrc = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureYUVSrc\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_TextureNV12Src = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureNV12Src\n    }\n};\n\nstatic GLES2_Shader GLES2_FragmentShader_TextureNV21Src = {\n    1,\n    {\n        &GLES2_FragmentSrc_TextureNV21Src\n    }\n};\n\n\n/*************************************************************************************************\n * Shader selector                                                                               *\n *************************************************************************************************/\n\nconst GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type, SDL_BlendMode blendMode)\n{\n    switch (type) {\n    case GLES2_SHADER_VERTEX_DEFAULT:\n        return &GLES2_VertexShader_Default;\n    case GLES2_SHADER_FRAGMENT_SOLID_SRC:\n    switch (blendMode) {\n    case SDL_BLENDMODE_NONE:\n        return &GLES2_FragmentShader_None_SolidSrc;\n    case SDL_BLENDMODE_BLEND:\n        return &GLES2_FragmentShader_Alpha_SolidSrc;\n    case SDL_BLENDMODE_ADD:\n        return &GLES2_FragmentShader_Additive_SolidSrc;\n    case SDL_BLENDMODE_MOD:\n        return &GLES2_FragmentShader_Modulated_SolidSrc;\n    default:\n        return NULL;\n    }\n    case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC:\n        switch (blendMode) {\n        case SDL_BLENDMODE_NONE:\n            return &GLES2_FragmentShader_None_TextureABGRSrc;\n        case SDL_BLENDMODE_BLEND:\n            return &GLES2_FragmentShader_Alpha_TextureABGRSrc;\n        case SDL_BLENDMODE_ADD:\n            return &GLES2_FragmentShader_Additive_TextureABGRSrc;\n        case SDL_BLENDMODE_MOD:\n            return &GLES2_FragmentShader_Modulated_TextureABGRSrc;\n        default:\n            return NULL;\n    }\n    case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_SRC:\n        switch (blendMode) {\n        case SDL_BLENDMODE_NONE:\n            return &GLES2_FragmentShader_None_TextureARGBSrc;\n        case SDL_BLENDMODE_BLEND:\n            return &GLES2_FragmentShader_Alpha_TextureARGBSrc;\n        case SDL_BLENDMODE_ADD:\n            return &GLES2_FragmentShader_Additive_TextureARGBSrc;\n        case SDL_BLENDMODE_MOD:\n            return &GLES2_FragmentShader_Modulated_TextureARGBSrc;\n        default:\n            return NULL;\n    }\n\n    case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC:\n        switch (blendMode) {\n        case SDL_BLENDMODE_NONE:\n            return &GLES2_FragmentShader_None_TextureRGBSrc;\n        case SDL_BLENDMODE_BLEND:\n            return &GLES2_FragmentShader_Alpha_TextureRGBSrc;\n        case SDL_BLENDMODE_ADD:\n            return &GLES2_FragmentShader_Additive_TextureRGBSrc;\n        case SDL_BLENDMODE_MOD:\n            return &GLES2_FragmentShader_Modulated_TextureRGBSrc;\n        default:\n            return NULL;\n    }\n\n    case GLES2_SHADER_FRAGMENT_TEXTURE_BGR_SRC:\n        switch (blendMode) {\n        case SDL_BLENDMODE_NONE:\n            return &GLES2_FragmentShader_None_TextureBGRSrc;\n        case SDL_BLENDMODE_BLEND:\n            return &GLES2_FragmentShader_Alpha_TextureBGRSrc;\n        case SDL_BLENDMODE_ADD:\n            return &GLES2_FragmentShader_Additive_TextureBGRSrc;\n        case SDL_BLENDMODE_MOD:\n            return &GLES2_FragmentShader_Modulated_TextureBGRSrc;\n        default:\n            return NULL;\n    }\n    \n    case GLES2_SHADER_FRAGMENT_TEXTURE_YUV_SRC:\n    {\n        return &GLES2_FragmentShader_TextureYUVSrc;\n    }\n\n    case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_SRC:\n    {\n        return &GLES2_FragmentShader_TextureNV12Src;\n    }\n\n    case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_SRC:\n    {\n        return &GLES2_FragmentShader_TextureNV21Src;\n    }\n\n    default:\n        return NULL;\n    }\n}\n\n#endif /* SDL_VIDEO_RENDER_OGL_ES2 && !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/opengles2/SDL_shaders_gles2.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_RENDER_OGL_ES2\n\n#ifndef SDL_shaderdata_h_\n#define SDL_shaderdata_h_\n\ntypedef struct GLES2_ShaderInstance\n{\n    GLenum type;\n    GLenum format;\n    int length;\n    const void *data;\n} GLES2_ShaderInstance;\n\ntypedef struct GLES2_Shader\n{\n    int instance_count;\n    const GLES2_ShaderInstance *instances[4];\n} GLES2_Shader;\n\ntypedef enum\n{\n    GLES2_SHADER_VERTEX_DEFAULT,\n    GLES2_SHADER_FRAGMENT_SOLID_SRC,\n    GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC,\n    GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_SRC,\n    GLES2_SHADER_FRAGMENT_TEXTURE_BGR_SRC,\n    GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC,\n    GLES2_SHADER_FRAGMENT_TEXTURE_YUV_SRC,\n    GLES2_SHADER_FRAGMENT_TEXTURE_NV12_SRC,\n    GLES2_SHADER_FRAGMENT_TEXTURE_NV21_SRC\n} GLES2_ShaderType;\n\n#define GLES2_SOURCE_SHADER (GLenum)-1\n\nconst GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type, SDL_BlendMode blendMode);\n\n#endif /* SDL_shaderdata_h_ */\n\n#endif /* SDL_VIDEO_RENDER_OGL_ES2 */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/psp/SDL_render_psp.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_RENDER_PSP\n\n#include \"SDL_hints.h\"\n#include \"../SDL_sysrender.h\"\n\n#include <pspkernel.h>\n#include <pspdisplay.h>\n#include <pspgu.h>\n#include <pspgum.h>\n#include <stdio.h>\n#include <string.h>\n#include <math.h>\n#include <pspge.h>\n#include <stdarg.h>\n#include <stdlib.h>\n#include <vram.h>\n\n\n\n\n/* PSP renderer implementation, based on the PGE  */\n\n\nextern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);\n\n\nstatic SDL_Renderer *PSP_CreateRenderer(SDL_Window * window, Uint32 flags);\nstatic void PSP_WindowEvent(SDL_Renderer * renderer,\n                             const SDL_WindowEvent *event);\nstatic int PSP_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic int PSP_SetTextureColorMod(SDL_Renderer * renderer,\n                                   SDL_Texture * texture);\nstatic int PSP_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                              const SDL_Rect * rect, const void *pixels,\n                              int pitch);\nstatic int PSP_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                            const SDL_Rect * rect, void **pixels, int *pitch);\nstatic void PSP_UnlockTexture(SDL_Renderer * renderer,\n                               SDL_Texture * texture);\nstatic int PSP_SetRenderTarget(SDL_Renderer * renderer,\n                                 SDL_Texture * texture);\nstatic int PSP_UpdateViewport(SDL_Renderer * renderer);\nstatic int PSP_RenderClear(SDL_Renderer * renderer);\nstatic int PSP_RenderDrawPoints(SDL_Renderer * renderer,\n                                 const SDL_FPoint * points, int count);\nstatic int PSP_RenderDrawLines(SDL_Renderer * renderer,\n                                const SDL_FPoint * points, int count);\nstatic int PSP_RenderFillRects(SDL_Renderer * renderer,\n                                const SDL_FRect * rects, int count);\nstatic int PSP_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,\n                           const SDL_Rect * srcrect,\n                           const SDL_FRect * dstrect);\nstatic int PSP_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                    Uint32 pixel_format, void * pixels, int pitch);\nstatic int PSP_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n                         const SDL_Rect * srcrect, const SDL_FRect * dstrect,\n                         const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);\nstatic void PSP_RenderPresent(SDL_Renderer * renderer);\nstatic void PSP_DestroyTexture(SDL_Renderer * renderer,\n                                SDL_Texture * texture);\nstatic void PSP_DestroyRenderer(SDL_Renderer * renderer);\n\n/*\nSDL_RenderDriver PSP_RenderDriver = {\n    PSP_CreateRenderer,\n    {\n     \"PSP\",\n     (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),\n     1,\n     {SDL_PIXELFORMAT_ABGR8888},\n     0,\n     0}\n};\n*/\nSDL_RenderDriver PSP_RenderDriver = {\n    .CreateRenderer = PSP_CreateRenderer,\n    .info = {\n        .name = \"PSP\",\n        .flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE,\n        .num_texture_formats = 4,\n        .texture_formats = { [0] = SDL_PIXELFORMAT_BGR565,\n                                                 [1] = SDL_PIXELFORMAT_ABGR1555,\n                                                 [2] = SDL_PIXELFORMAT_ABGR4444,\n                                                 [3] = SDL_PIXELFORMAT_ABGR8888,\n        },\n        .max_texture_width = 512,\n        .max_texture_height = 512,\n     }\n};\n\n#define PSP_SCREEN_WIDTH    480\n#define PSP_SCREEN_HEIGHT   272\n\n#define PSP_FRAME_BUFFER_WIDTH  512\n#define PSP_FRAME_BUFFER_SIZE   (PSP_FRAME_BUFFER_WIDTH*PSP_SCREEN_HEIGHT)\n\nstatic unsigned int __attribute__((aligned(16))) DisplayList[262144];\n\n\n#define COL5650(r,g,b,a)    ((r>>3) | ((g>>2)<<5) | ((b>>3)<<11))\n#define COL5551(r,g,b,a)    ((r>>3) | ((g>>3)<<5) | ((b>>3)<<10) | (a>0?0x7000:0))\n#define COL4444(r,g,b,a)    ((r>>4) | ((g>>4)<<4) | ((b>>4)<<8) | ((a>>4)<<12))\n#define COL8888(r,g,b,a)    ((r) | ((g)<<8) | ((b)<<16) | ((a)<<24))\n\n\ntypedef struct\n{\n    void*           frontbuffer ;\n    void*           backbuffer ;\n    SDL_bool        initialized ;\n    SDL_bool        displayListAvail ;\n    unsigned int    psm ;\n    unsigned int    bpp ;\n\n    SDL_bool        vsync;\n    unsigned int    currentColor;\n    int             currentBlendMode;\n\n} PSP_RenderData;\n\n\ntypedef struct\n{\n    void                *data;                              /**< Image data. */\n    unsigned int        size;                               /**< Size of data in bytes. */\n    unsigned int        width;                              /**< Image width. */\n    unsigned int        height;                             /**< Image height. */\n    unsigned int        textureWidth;                       /**< Texture width (power of two). */\n    unsigned int        textureHeight;                      /**< Texture height (power of two). */\n    unsigned int        bits;                               /**< Image bits per pixel. */\n    unsigned int        format;                             /**< Image format - one of ::pgePixelFormat. */\n    unsigned int        pitch;\n    SDL_bool            swizzled;                           /**< Is image swizzled. */\n\n} PSP_TextureData;\n\ntypedef struct\n{\n    float   x, y, z;\n} VertV;\n\n\ntypedef struct\n{\n    float   u, v;\n    float   x, y, z;\n\n} VertTV;\n\n\n/* Return next power of 2 */\nstatic int\nTextureNextPow2(unsigned int w)\n{\n    if(w == 0)\n        return 0;\n\n    unsigned int n = 2;\n\n    while(w > n)\n        n <<= 1;\n\n    return n;\n}\n\n\nstatic int\nGetScaleQuality(void)\n{\n    const char *hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY);\n\n    if (!hint || *hint == '0' || SDL_strcasecmp(hint, \"nearest\") == 0) {\n        return GU_NEAREST; /* GU_NEAREST good for tile-map */\n    } else {\n        return GU_LINEAR; /* GU_LINEAR good for scaling */\n    }\n}\n\nstatic int\nPixelFormatToPSPFMT(Uint32 format)\n{\n    switch (format) {\n    case SDL_PIXELFORMAT_BGR565:\n        return GU_PSM_5650;\n    case SDL_PIXELFORMAT_ABGR1555:\n        return GU_PSM_5551;\n    case SDL_PIXELFORMAT_ABGR4444:\n        return GU_PSM_4444;\n    case SDL_PIXELFORMAT_ABGR8888:\n        return GU_PSM_8888;\n    default:\n        return GU_PSM_8888;\n    }\n}\n\nvoid\nStartDrawing(SDL_Renderer * renderer)\n{\n    PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;\n    if(data->displayListAvail)\n        return;\n\n    sceGuStart(GU_DIRECT, DisplayList);\n    data->displayListAvail = SDL_TRUE;\n}\n\n\nint\nTextureSwizzle(PSP_TextureData *psp_texture)\n{\n    if(psp_texture->swizzled)\n        return 1;\n\n    int bytewidth = psp_texture->textureWidth*(psp_texture->bits>>3);\n    int height = psp_texture->size / bytewidth;\n\n    int rowblocks = (bytewidth>>4);\n    int rowblocksadd = (rowblocks-1)<<7;\n    unsigned int blockaddress = 0;\n    unsigned int *src = (unsigned int*) psp_texture->data;\n\n    unsigned char *data = NULL;\n    data = malloc(psp_texture->size);\n\n    int j;\n\n    for(j = 0; j < height; j++, blockaddress += 16)\n    {\n        unsigned int *block;\n\n        block = (unsigned int*)&data[blockaddress];\n\n        int i;\n\n        for(i = 0; i < rowblocks; i++)\n        {\n            *block++ = *src++;\n            *block++ = *src++;\n            *block++ = *src++;\n            *block++ = *src++;\n            block += 28;\n        }\n\n        if((j & 0x7) == 0x7)\n            blockaddress += rowblocksadd;\n    }\n\n    free(psp_texture->data);\n    psp_texture->data = data;\n    psp_texture->swizzled = SDL_TRUE;\n\n    return 1;\n}\nint TextureUnswizzle(PSP_TextureData *psp_texture)\n{\n    if(!psp_texture->swizzled)\n        return 1;\n\n    int blockx, blocky;\n\n    int bytewidth = psp_texture->textureWidth*(psp_texture->bits>>3);\n    int height = psp_texture->size / bytewidth;\n\n    int widthblocks = bytewidth/16;\n    int heightblocks = height/8;\n\n    int dstpitch = (bytewidth - 16)/4;\n    int dstrow = bytewidth * 8;\n\n    unsigned int *src = (unsigned int*) psp_texture->data;\n\n    unsigned char *data = NULL;\n\n    data = malloc(psp_texture->size);\n\n    if(!data)\n        return 0;\n\n    sceKernelDcacheWritebackAll();\n\n    int j;\n\n    unsigned char *ydst = (unsigned char *)data;\n\n    for(blocky = 0; blocky < heightblocks; ++blocky)\n    {\n        unsigned char *xdst = ydst;\n\n        for(blockx = 0; blockx < widthblocks; ++blockx)\n        {\n            unsigned int *block;\n\n            block = (unsigned int*)xdst;\n\n            for(j = 0; j < 8; ++j)\n            {\n                *(block++) = *(src++);\n                *(block++) = *(src++);\n                *(block++) = *(src++);\n                *(block++) = *(src++);\n                block += dstpitch;\n            }\n\n            xdst += 16;\n        }\n\n        ydst += dstrow;\n    }\n\n    free(psp_texture->data);\n\n    psp_texture->data = data;\n\n    psp_texture->swizzled = SDL_FALSE;\n\n    return 1;\n}\n\nSDL_Renderer *\nPSP_CreateRenderer(SDL_Window * window, Uint32 flags)\n{\n\n    SDL_Renderer *renderer;\n    PSP_RenderData *data;\n        int pixelformat;\n    renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));\n    if (!renderer) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    data = (PSP_RenderData *) SDL_calloc(1, sizeof(*data));\n    if (!data) {\n        PSP_DestroyRenderer(renderer);\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n\n    renderer->WindowEvent = PSP_WindowEvent;\n    renderer->CreateTexture = PSP_CreateTexture;\n    renderer->SetTextureColorMod = PSP_SetTextureColorMod;\n    renderer->UpdateTexture = PSP_UpdateTexture;\n    renderer->LockTexture = PSP_LockTexture;\n    renderer->UnlockTexture = PSP_UnlockTexture;\n    renderer->SetRenderTarget = PSP_SetRenderTarget;\n    renderer->UpdateViewport = PSP_UpdateViewport;\n    renderer->RenderClear = PSP_RenderClear;\n    renderer->RenderDrawPoints = PSP_RenderDrawPoints;\n    renderer->RenderDrawLines = PSP_RenderDrawLines;\n    renderer->RenderFillRects = PSP_RenderFillRects;\n    renderer->RenderCopy = PSP_RenderCopy;\n    renderer->RenderReadPixels = PSP_RenderReadPixels;\n    renderer->RenderCopyEx = PSP_RenderCopyEx;\n    renderer->RenderPresent = PSP_RenderPresent;\n    renderer->DestroyTexture = PSP_DestroyTexture;\n    renderer->DestroyRenderer = PSP_DestroyRenderer;\n    renderer->info = PSP_RenderDriver.info;\n    renderer->info.flags = (SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);\n    renderer->driverdata = data;\n    renderer->window = window;\n\n    if (data->initialized != SDL_FALSE)\n        return 0;\n    data->initialized = SDL_TRUE;\n\n    if (flags & SDL_RENDERER_PRESENTVSYNC) {\n        data->vsync = SDL_TRUE;\n    } else {\n        data->vsync = SDL_FALSE;\n    }\n\n    pixelformat=PixelFormatToPSPFMT(SDL_GetWindowPixelFormat(window));\n    switch(pixelformat)\n    {\n        case GU_PSM_4444:\n        case GU_PSM_5650:\n        case GU_PSM_5551:\n            data->frontbuffer = (unsigned int *)(PSP_FRAME_BUFFER_SIZE<<1);\n            data->backbuffer =  (unsigned int *)(0);\n            data->bpp = 2;\n            data->psm = pixelformat;\n            break;\n        default:\n            data->frontbuffer = (unsigned int *)(PSP_FRAME_BUFFER_SIZE<<2);\n            data->backbuffer =  (unsigned int *)(0);\n            data->bpp = 4;\n            data->psm = GU_PSM_8888;\n            break;\n    }\n\n    sceGuInit();\n    /* setup GU */\n    sceGuStart(GU_DIRECT, DisplayList);\n    sceGuDrawBuffer(data->psm, data->frontbuffer, PSP_FRAME_BUFFER_WIDTH);\n    sceGuDispBuffer(PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT, data->backbuffer, PSP_FRAME_BUFFER_WIDTH);\n\n\n    sceGuOffset(2048 - (PSP_SCREEN_WIDTH>>1), 2048 - (PSP_SCREEN_HEIGHT>>1));\n    sceGuViewport(2048, 2048, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);\n\n    data->frontbuffer = vabsptr(data->frontbuffer);\n    data->backbuffer = vabsptr(data->backbuffer);\n\n    /* Scissoring */\n    sceGuScissor(0, 0, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);\n    sceGuEnable(GU_SCISSOR_TEST);\n\n    /* Backface culling */\n    sceGuFrontFace(GU_CCW);\n    sceGuEnable(GU_CULL_FACE);\n\n    /* Texturing */\n    sceGuEnable(GU_TEXTURE_2D);\n    sceGuShadeModel(GU_SMOOTH);\n    sceGuTexWrap(GU_REPEAT, GU_REPEAT);\n\n    /* Blending */\n    sceGuEnable(GU_BLEND);\n    sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0);\n\n    sceGuTexFilter(GU_LINEAR,GU_LINEAR);\n\n    sceGuFinish();\n    sceGuSync(0,0);\n    sceDisplayWaitVblankStartCB();\n    sceGuDisplay(GU_TRUE);\n\n    return renderer;\n}\n\nstatic void\nPSP_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)\n{\n\n}\n\n\nstatic int\nPSP_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n/*      PSP_RenderData *renderdata = (PSP_RenderData *) renderer->driverdata; */\n    PSP_TextureData* psp_texture = (PSP_TextureData*) SDL_calloc(1, sizeof(*psp_texture));\n\n    if(!psp_texture)\n        return -1;\n\n    psp_texture->swizzled = SDL_FALSE;\n    psp_texture->width = texture->w;\n    psp_texture->height = texture->h;\n    psp_texture->textureHeight = TextureNextPow2(texture->h);\n    psp_texture->textureWidth = TextureNextPow2(texture->w);\n    psp_texture->format = PixelFormatToPSPFMT(texture->format);\n\n    switch(psp_texture->format)\n    {\n        case GU_PSM_5650:\n        case GU_PSM_5551:\n        case GU_PSM_4444:\n            psp_texture->bits = 16;\n            break;\n\n        case GU_PSM_8888:\n            psp_texture->bits = 32;\n            break;\n\n        default:\n            return -1;\n    }\n\n    psp_texture->pitch = psp_texture->textureWidth * SDL_BYTESPERPIXEL(texture->format);\n    psp_texture->size = psp_texture->textureHeight*psp_texture->pitch;\n    psp_texture->data = SDL_calloc(1, psp_texture->size);\n\n    if(!psp_texture->data)\n    {\n        SDL_free(psp_texture);\n        return SDL_OutOfMemory();\n    }\n    texture->driverdata = psp_texture;\n\n    return 0;\n}\n\nstatic int\nPSP_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    return SDL_Unsupported();\n}\n\nvoid\nTextureActivate(SDL_Texture * texture)\n{\n    PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;\n    int scaleMode = GetScaleQuality();\n\n    /* Swizzling is useless with small textures. */\n    if (texture->w >= 16 || texture->h >= 16)\n    {\n        TextureSwizzle(psp_texture);\n    }\n\n    sceGuEnable(GU_TEXTURE_2D);\n    sceGuTexWrap(GU_REPEAT, GU_REPEAT);\n    sceGuTexMode(psp_texture->format, 0, 0, psp_texture->swizzled);\n    sceGuTexFilter(scaleMode, scaleMode); /* GU_NEAREST good for tile-map */\n                                          /* GU_LINEAR good for scaling */\n    sceGuTexImage(0, psp_texture->textureWidth, psp_texture->textureHeight, psp_texture->textureWidth, psp_texture->data);\n    sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);\n}\n\n\nstatic int\nPSP_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                   const SDL_Rect * rect, const void *pixels, int pitch)\n{\n/*  PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata; */\n    const Uint8 *src;\n    Uint8 *dst;\n    int row, length,dpitch;\n    src = pixels;\n\n    PSP_LockTexture(renderer, texture,rect,(void **)&dst, &dpitch);\n    length = rect->w * SDL_BYTESPERPIXEL(texture->format);\n    if (length == pitch && length == dpitch) {\n        SDL_memcpy(dst, src, length*rect->h);\n    } else {\n        for (row = 0; row < rect->h; ++row) {\n            SDL_memcpy(dst, src, length);\n            src += pitch;\n            dst += dpitch;\n        }\n    }\n\n    sceKernelDcacheWritebackAll();\n    return 0;\n}\n\nstatic int\nPSP_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                 const SDL_Rect * rect, void **pixels, int *pitch)\n{\n    PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;\n\n    *pixels =\n        (void *) ((Uint8 *) psp_texture->data + rect->y * psp_texture->pitch +\n                  rect->x * SDL_BYTESPERPIXEL(texture->format));\n    *pitch = psp_texture->pitch;\n    return 0;\n}\n\nstatic void\nPSP_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;\n    SDL_Rect rect;\n\n    /* We do whole texture updates, at least for now */\n    rect.x = 0;\n    rect.y = 0;\n    rect.w = texture->w;\n    rect.h = texture->h;\n    PSP_UpdateTexture(renderer, texture, &rect, psp_texture->data, psp_texture->pitch);\n}\n\nstatic int\nPSP_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n\n    return 0;\n}\n\nstatic int\nPSP_UpdateViewport(SDL_Renderer * renderer)\n{\n\n    return 0;\n}\n\n\nstatic void\nPSP_SetBlendMode(SDL_Renderer * renderer, int blendMode)\n{\n    PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;\n    if (blendMode != data-> currentBlendMode) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_NONE:\n                sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);\n                sceGuDisable(GU_BLEND);\n            break;\n        case SDL_BLENDMODE_BLEND:\n                sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);\n                sceGuEnable(GU_BLEND);\n                sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0 );\n            break;\n        case SDL_BLENDMODE_ADD:\n                sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);\n                sceGuEnable(GU_BLEND);\n                sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_FIX, 0, 0x00FFFFFF );\n            break;\n        case SDL_BLENDMODE_MOD:\n                sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);\n                sceGuEnable(GU_BLEND);\n                sceGuBlendFunc( GU_ADD, GU_FIX, GU_SRC_COLOR, 0, 0);\n            break;\n        }\n        data->currentBlendMode = blendMode;\n    }\n}\n\n\n\nstatic int\nPSP_RenderClear(SDL_Renderer * renderer)\n{\n    /* start list */\n    StartDrawing(renderer);\n    int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;\n    sceGuClearColor(color);\n    sceGuClearDepth(0);\n    sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT|GU_FAST_CLEAR_BIT);\n\n    return 0;\n}\n\nstatic int\nPSP_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points,\n                      int count)\n{\n    int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;\n    int i;\n    StartDrawing(renderer);\n    VertV* vertices = (VertV*)sceGuGetMemory(count*sizeof(VertV));\n\n    for (i = 0; i < count; ++i) {\n            vertices[i].x = points[i].x;\n            vertices[i].y = points[i].y;\n            vertices[i].z = 0.0f;\n    }\n    sceGuDisable(GU_TEXTURE_2D);\n    sceGuColor(color);\n    sceGuShadeModel(GU_FLAT);\n    sceGuDrawArray(GU_POINTS, GU_VERTEX_32BITF|GU_TRANSFORM_2D, count, 0, vertices);\n    sceGuShadeModel(GU_SMOOTH);\n    sceGuEnable(GU_TEXTURE_2D);\n\n    return 0;\n}\n\nstatic int\nPSP_RenderDrawLines(SDL_Renderer * renderer, const SDL_FPoint * points,\n                     int count)\n{\n    int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;\n    int i;\n    StartDrawing(renderer);\n    VertV* vertices = (VertV*)sceGuGetMemory(count*sizeof(VertV));\n\n    for (i = 0; i < count; ++i) {\n            vertices[i].x = points[i].x;\n            vertices[i].y = points[i].y;\n            vertices[i].z = 0.0f;\n    }\n\n    sceGuDisable(GU_TEXTURE_2D);\n    sceGuColor(color);\n    sceGuShadeModel(GU_FLAT);\n    sceGuDrawArray(GU_LINE_STRIP, GU_VERTEX_32BITF|GU_TRANSFORM_2D, count, 0, vertices);\n    sceGuShadeModel(GU_SMOOTH);\n    sceGuEnable(GU_TEXTURE_2D);\n\n    return 0;\n}\n\nstatic int\nPSP_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects,\n                     int count)\n{\n    int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;\n    int i;\n    StartDrawing(renderer);\n\n    for (i = 0; i < count; ++i) {\n        const SDL_FRect *rect = &rects[i];\n        VertV* vertices = (VertV*)sceGuGetMemory((sizeof(VertV)<<1));\n        vertices[0].x = rect->x;\n        vertices[0].y = rect->y;\n        vertices[0].z = 0.0f;\n\n        vertices[1].x = rect->x + rect->w;\n        vertices[1].y = rect->y + rect->h;\n        vertices[1].z = 0.0f;\n\n        sceGuDisable(GU_TEXTURE_2D);\n        sceGuColor(color);\n        sceGuShadeModel(GU_FLAT);\n        sceGuDrawArray(GU_SPRITES, GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);\n        sceGuShadeModel(GU_SMOOTH);\n        sceGuEnable(GU_TEXTURE_2D);\n    }\n\n    return 0;\n}\n\n\n#define PI   3.14159265358979f\n\n#define radToDeg(x) ((x)*180.f/PI)\n#define degToRad(x) ((x)*PI/180.f)\n\nfloat MathAbs(float x)\n{\n    float result;\n\n    __asm__ volatile (\n        \"mtv      %1, S000\\n\"\n        \"vabs.s   S000, S000\\n\"\n        \"mfv      %0, S000\\n\"\n    : \"=r\"(result) : \"r\"(x));\n\n    return result;\n}\n\nvoid MathSincos(float r, float *s, float *c)\n{\n    __asm__ volatile (\n        \"mtv      %2, S002\\n\"\n        \"vcst.s   S003, VFPU_2_PI\\n\"\n        \"vmul.s   S002, S002, S003\\n\"\n        \"vrot.p   C000, S002, [s, c]\\n\"\n        \"mfv      %0, S000\\n\"\n        \"mfv      %1, S001\\n\"\n    : \"=r\"(*s), \"=r\"(*c): \"r\"(r));\n}\n\nvoid Swap(float *a, float *b)\n{\n    float n=*a;\n    *a = *b;\n    *b = n;\n}\n\nstatic int\nPSP_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,\n                const SDL_Rect * srcrect, const SDL_FRect * dstrect)\n{\n    float x, y, width, height;\n    float u0, v0, u1, v1;\n    unsigned char alpha;\n\n    x = dstrect->x;\n    y = dstrect->y;\n    width = dstrect->w;\n    height = dstrect->h;\n\n    u0 = srcrect->x;\n    v0 = srcrect->y;\n    u1 = srcrect->x + srcrect->w;\n    v1 = srcrect->y + srcrect->h;\n\n    alpha = texture->a;\n\n    StartDrawing(renderer);\n    TextureActivate(texture);\n    PSP_SetBlendMode(renderer, renderer->blendMode);\n\n    if(alpha != 255)\n    {\n        sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);\n        sceGuColor(GU_RGBA(255, 255, 255, alpha));\n    }else{\n        sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);\n        sceGuColor(0xFFFFFFFF);\n    }\n\n    if((MathAbs(u1) - MathAbs(u0)) < 64.0f)\n    {\n        VertTV* vertices = (VertTV*)sceGuGetMemory((sizeof(VertTV))<<1);\n\n        vertices[0].u = u0;\n        vertices[0].v = v0;\n        vertices[0].x = x;\n        vertices[0].y = y;\n        vertices[0].z = 0;\n\n        vertices[1].u = u1;\n        vertices[1].v = v1;\n        vertices[1].x = x + width;\n        vertices[1].y = y + height;\n        vertices[1].z = 0;\n\n        sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);\n    }\n    else\n    {\n        float start, end;\n        float curU = u0;\n        float curX = x;\n        float endX = x + width;\n        float slice = 64.0f;\n        float ustep = (u1 - u0)/width * slice;\n\n        if(ustep < 0.0f)\n            ustep = -ustep;\n\n        for(start = 0, end = width; start < end; start += slice)\n        {\n            VertTV* vertices = (VertTV*)sceGuGetMemory((sizeof(VertTV))<<1);\n\n            float polyWidth = ((curX + slice) > endX) ? (endX - curX) : slice;\n            float sourceWidth = ((curU + ustep) > u1) ? (u1 - curU) : ustep;\n\n            vertices[0].u = curU;\n            vertices[0].v = v0;\n            vertices[0].x = curX;\n            vertices[0].y = y;\n            vertices[0].z = 0;\n\n            curU += sourceWidth;\n            curX += polyWidth;\n\n            vertices[1].u = curU;\n            vertices[1].v = v1;\n            vertices[1].x = curX;\n            vertices[1].y = (y + height);\n            vertices[1].z = 0;\n\n            sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);\n        }\n    }\n\n    if(alpha != 255)\n        sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);\n    return 0;\n}\n\nstatic int\nPSP_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                    Uint32 pixel_format, void * pixels, int pitch)\n\n{\n    return SDL_Unsupported();\n}\n\n\nstatic int\nPSP_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n                const SDL_Rect * srcrect, const SDL_FRect * dstrect,\n                const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)\n{\n    float x, y, width, height;\n    float u0, v0, u1, v1;\n    unsigned char alpha;\n    float centerx, centery;\n\n    x = dstrect->x;\n    y = dstrect->y;\n    width = dstrect->w;\n    height = dstrect->h;\n\n    u0 = srcrect->x;\n    v0 = srcrect->y;\n    u1 = srcrect->x + srcrect->w;\n    v1 = srcrect->y + srcrect->h;\n\n    centerx = center->x;\n    centery = center->y;\n\n    alpha = texture->a;\n\n    StartDrawing(renderer);\n    TextureActivate(texture);\n    PSP_SetBlendMode(renderer, renderer->blendMode);\n\n    if(alpha != 255)\n    {\n        sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);\n        sceGuColor(GU_RGBA(255, 255, 255, alpha));\n    }else{\n        sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);\n        sceGuColor(0xFFFFFFFF);\n    }\n\n/*      x += width * 0.5f; */\n/*      y += height * 0.5f; */\n    x += centerx;\n    y += centery;\n\n    float c, s;\n\n    MathSincos(degToRad(angle), &s, &c);\n\n/*      width *= 0.5f; */\n/*      height *= 0.5f; */\n    width  -= centerx;\n    height -= centery;\n\n\n    float cw = c*width;\n    float sw = s*width;\n    float ch = c*height;\n    float sh = s*height;\n\n    VertTV* vertices = (VertTV*)sceGuGetMemory(sizeof(VertTV)<<2);\n\n    vertices[0].u = u0;\n    vertices[0].v = v0;\n    vertices[0].x = x - cw + sh;\n    vertices[0].y = y - sw - ch;\n    vertices[0].z = 0;\n\n    vertices[1].u = u0;\n    vertices[1].v = v1;\n    vertices[1].x = x - cw - sh;\n    vertices[1].y = y - sw + ch;\n    vertices[1].z = 0;\n\n    vertices[2].u = u1;\n    vertices[2].v = v1;\n    vertices[2].x = x + cw - sh;\n    vertices[2].y = y + sw + ch;\n    vertices[2].z = 0;\n\n    vertices[3].u = u1;\n    vertices[3].v = v0;\n    vertices[3].x = x + cw + sh;\n    vertices[3].y = y + sw - ch;\n    vertices[3].z = 0;\n\n    if (flip & SDL_FLIP_HORIZONTAL) {\n                Swap(&vertices[0].v, &vertices[2].v);\n                Swap(&vertices[1].v, &vertices[3].v);\n    }\n    if (flip & SDL_FLIP_VERTICAL) {\n                Swap(&vertices[0].u, &vertices[2].u);\n                Swap(&vertices[1].u, &vertices[3].u);\n    }\n\n    sceGuDrawArray(GU_TRIANGLE_FAN, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 4, 0, vertices);\n\n    if(alpha != 255)\n        sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);\n    return 0;\n}\n\nstatic void\nPSP_RenderPresent(SDL_Renderer * renderer)\n{\n    PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;\n    if(!data->displayListAvail)\n        return;\n\n    data->displayListAvail = SDL_FALSE;\n    sceGuFinish();\n    sceGuSync(0,0);\n\n/*  if(data->vsync) */\n        sceDisplayWaitVblankStart();\n\n    data->backbuffer = data->frontbuffer;\n    data->frontbuffer = vabsptr(sceGuSwapBuffers());\n\n}\n\nstatic void\nPSP_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    PSP_RenderData *renderdata = (PSP_RenderData *) renderer->driverdata;\n    PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;\n\n    if (renderdata == 0)\n        return;\n\n    if(psp_texture == 0)\n        return;\n\n    SDL_free(psp_texture->data);\n    SDL_free(psp_texture);\n    texture->driverdata = NULL;\n}\n\nstatic void\nPSP_DestroyRenderer(SDL_Renderer * renderer)\n{\n    PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;\n    if (data) {\n        if (!data->initialized)\n            return;\n\n        StartDrawing(renderer);\n\n        sceGuTerm();\n/*      vfree(data->backbuffer); */\n/*      vfree(data->frontbuffer); */\n\n        data->initialized = SDL_FALSE;\n        data->displayListAvail = SDL_FALSE;\n        SDL_free(data);\n    }\n    SDL_free(renderer);\n}\n\n#endif /* SDL_VIDEO_RENDER_PSP */\n\n/* vi: set ts=4 sw=4 expandtab: */\n\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_blendfillrect.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if !SDL_RENDER_DISABLED\n\n#include \"SDL_draw.h\"\n#include \"SDL_blendfillrect.h\"\n\n\nstatic int\nSDL_BlendFillRect_RGB555(SDL_Surface * dst, const SDL_Rect * rect,\n                         SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    unsigned inva = 0xff - a;\n\n    switch (blendMode) {\n    case SDL_BLENDMODE_BLEND:\n        FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_RGB555);\n        break;\n    case SDL_BLENDMODE_ADD:\n        FILLRECT(Uint16, DRAW_SETPIXEL_ADD_RGB555);\n        break;\n    case SDL_BLENDMODE_MOD:\n        FILLRECT(Uint16, DRAW_SETPIXEL_MOD_RGB555);\n        break;\n    default:\n        FILLRECT(Uint16, DRAW_SETPIXEL_RGB555);\n        break;\n    }\n    return 0;\n}\n\nstatic int\nSDL_BlendFillRect_RGB565(SDL_Surface * dst, const SDL_Rect * rect,\n                         SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    unsigned inva = 0xff - a;\n\n    switch (blendMode) {\n    case SDL_BLENDMODE_BLEND:\n        FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_RGB565);\n        break;\n    case SDL_BLENDMODE_ADD:\n        FILLRECT(Uint16, DRAW_SETPIXEL_ADD_RGB565);\n        break;\n    case SDL_BLENDMODE_MOD:\n        FILLRECT(Uint16, DRAW_SETPIXEL_MOD_RGB565);\n        break;\n    default:\n        FILLRECT(Uint16, DRAW_SETPIXEL_RGB565);\n        break;\n    }\n    return 0;\n}\n\nstatic int\nSDL_BlendFillRect_RGB888(SDL_Surface * dst, const SDL_Rect * rect,\n                         SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    unsigned inva = 0xff - a;\n\n    switch (blendMode) {\n    case SDL_BLENDMODE_BLEND:\n        FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_RGB888);\n        break;\n    case SDL_BLENDMODE_ADD:\n        FILLRECT(Uint32, DRAW_SETPIXEL_ADD_RGB888);\n        break;\n    case SDL_BLENDMODE_MOD:\n        FILLRECT(Uint32, DRAW_SETPIXEL_MOD_RGB888);\n        break;\n    default:\n        FILLRECT(Uint32, DRAW_SETPIXEL_RGB888);\n        break;\n    }\n    return 0;\n}\n\nstatic int\nSDL_BlendFillRect_ARGB8888(SDL_Surface * dst, const SDL_Rect * rect,\n                           SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    unsigned inva = 0xff - a;\n\n    switch (blendMode) {\n    case SDL_BLENDMODE_BLEND:\n        FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888);\n        break;\n    case SDL_BLENDMODE_ADD:\n        FILLRECT(Uint32, DRAW_SETPIXEL_ADD_ARGB8888);\n        break;\n    case SDL_BLENDMODE_MOD:\n        FILLRECT(Uint32, DRAW_SETPIXEL_MOD_ARGB8888);\n        break;\n    default:\n        FILLRECT(Uint32, DRAW_SETPIXEL_ARGB8888);\n        break;\n    }\n    return 0;\n}\n\nstatic int\nSDL_BlendFillRect_RGB(SDL_Surface * dst, const SDL_Rect * rect,\n                      SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    SDL_PixelFormat *fmt = dst->format;\n    unsigned inva = 0xff - a;\n\n    switch (fmt->BytesPerPixel) {\n    case 2:\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_RGB);\n            break;\n        case SDL_BLENDMODE_ADD:\n            FILLRECT(Uint16, DRAW_SETPIXEL_ADD_RGB);\n            break;\n        case SDL_BLENDMODE_MOD:\n            FILLRECT(Uint16, DRAW_SETPIXEL_MOD_RGB);\n            break;\n        default:\n            FILLRECT(Uint16, DRAW_SETPIXEL_RGB);\n            break;\n        }\n        return 0;\n    case 4:\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_RGB);\n            break;\n        case SDL_BLENDMODE_ADD:\n            FILLRECT(Uint32, DRAW_SETPIXEL_ADD_RGB);\n            break;\n        case SDL_BLENDMODE_MOD:\n            FILLRECT(Uint32, DRAW_SETPIXEL_MOD_RGB);\n            break;\n        default:\n            FILLRECT(Uint32, DRAW_SETPIXEL_RGB);\n            break;\n        }\n        return 0;\n    default:\n        return SDL_Unsupported();\n    }\n}\n\nstatic int\nSDL_BlendFillRect_RGBA(SDL_Surface * dst, const SDL_Rect * rect,\n                       SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    SDL_PixelFormat *fmt = dst->format;\n    unsigned inva = 0xff - a;\n\n    switch (fmt->BytesPerPixel) {\n    case 4:\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_RGBA);\n            break;\n        case SDL_BLENDMODE_ADD:\n            FILLRECT(Uint32, DRAW_SETPIXEL_ADD_RGBA);\n            break;\n        case SDL_BLENDMODE_MOD:\n            FILLRECT(Uint32, DRAW_SETPIXEL_MOD_RGBA);\n            break;\n        default:\n            FILLRECT(Uint32, DRAW_SETPIXEL_RGBA);\n            break;\n        }\n        return 0;\n    default:\n        return SDL_Unsupported();\n    }\n}\n\nint\nSDL_BlendFillRect(SDL_Surface * dst, const SDL_Rect * rect,\n                  SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    SDL_Rect clipped;\n\n    if (!dst) {\n        return SDL_SetError(\"Passed NULL destination surface\");\n    }\n\n    /* This function doesn't work on surfaces < 8 bpp */\n    if (dst->format->BitsPerPixel < 8) {\n        return SDL_SetError(\"SDL_BlendFillRect(): Unsupported surface format\");\n    }\n\n    /* If 'rect' == NULL, then fill the whole surface */\n    if (rect) {\n        /* Perform clipping */\n        if (!SDL_IntersectRect(rect, &dst->clip_rect, &clipped)) {\n            return 0;\n        }\n        rect = &clipped;\n    } else {\n        rect = &dst->clip_rect;\n    }\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(r, a);\n        g = DRAW_MUL(g, a);\n        b = DRAW_MUL(b, a);\n    }\n\n    switch (dst->format->BitsPerPixel) {\n    case 15:\n        switch (dst->format->Rmask) {\n        case 0x7C00:\n            return SDL_BlendFillRect_RGB555(dst, rect, blendMode, r, g, b, a);\n        }\n        break;\n    case 16:\n        switch (dst->format->Rmask) {\n        case 0xF800:\n            return SDL_BlendFillRect_RGB565(dst, rect, blendMode, r, g, b, a);\n        }\n        break;\n    case 32:\n        switch (dst->format->Rmask) {\n        case 0x00FF0000:\n            if (!dst->format->Amask) {\n                return SDL_BlendFillRect_RGB888(dst, rect, blendMode, r, g, b, a);\n            } else {\n                return SDL_BlendFillRect_ARGB8888(dst, rect, blendMode, r, g, b, a);\n            }\n            break;\n        }\n        break;\n    default:\n        break;\n    }\n\n    if (!dst->format->Amask) {\n        return SDL_BlendFillRect_RGB(dst, rect, blendMode, r, g, b, a);\n    } else {\n        return SDL_BlendFillRect_RGBA(dst, rect, blendMode, r, g, b, a);\n    }\n}\n\nint\nSDL_BlendFillRects(SDL_Surface * dst, const SDL_Rect * rects, int count,\n                   SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    SDL_Rect rect;\n    int i;\n    int (*func)(SDL_Surface * dst, const SDL_Rect * rect,\n                SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) = NULL;\n    int status = 0;\n\n    if (!dst) {\n        return SDL_SetError(\"Passed NULL destination surface\");\n    }\n\n    /* This function doesn't work on surfaces < 8 bpp */\n    if (dst->format->BitsPerPixel < 8) {\n        return SDL_SetError(\"SDL_BlendFillRects(): Unsupported surface format\");\n    }\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(r, a);\n        g = DRAW_MUL(g, a);\n        b = DRAW_MUL(b, a);\n    }\n\n    /* FIXME: Does this function pointer slow things down significantly? */\n    switch (dst->format->BitsPerPixel) {\n    case 15:\n        switch (dst->format->Rmask) {\n        case 0x7C00:\n            func = SDL_BlendFillRect_RGB555;\n        }\n        break;\n    case 16:\n        switch (dst->format->Rmask) {\n        case 0xF800:\n            func = SDL_BlendFillRect_RGB565;\n        }\n        break;\n    case 32:\n        switch (dst->format->Rmask) {\n        case 0x00FF0000:\n            if (!dst->format->Amask) {\n                func = SDL_BlendFillRect_RGB888;\n            } else {\n                func = SDL_BlendFillRect_ARGB8888;\n            }\n            break;\n        }\n        break;\n    default:\n        break;\n    }\n\n    if (!func) {\n        if (!dst->format->Amask) {\n            func = SDL_BlendFillRect_RGB;\n        } else {\n            func = SDL_BlendFillRect_RGBA;\n        }\n    }\n\n    for (i = 0; i < count; ++i) {\n        /* Perform clipping */\n        if (!SDL_IntersectRect(&rects[i], &dst->clip_rect, &rect)) {\n            continue;\n        }\n        status = func(dst, &rect, blendMode, r, g, b, a);\n    }\n    return status;\n}\n\n#endif /* !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_blendfillrect.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n\nextern int SDL_BlendFillRect(SDL_Surface * dst, const SDL_Rect * rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\nextern int SDL_BlendFillRects(SDL_Surface * dst, const SDL_Rect * rects, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_blendline.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if !SDL_RENDER_DISABLED\n\n#include \"SDL_draw.h\"\n#include \"SDL_blendline.h\"\n#include \"SDL_blendpoint.h\"\n\n\nstatic void\nSDL_BlendLine_RGB2(SDL_Surface * dst, int x1, int y1, int x2, int y2,\n                   SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,\n                   SDL_bool draw_end)\n{\n    const SDL_PixelFormat *fmt = dst->format;\n    unsigned r, g, b, a, inva;\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(_r, _a);\n        g = DRAW_MUL(_g, _a);\n        b = DRAW_MUL(_b, _a);\n        a = _a;\n    } else {\n        r = _r;\n        g = _g;\n        b = _b;\n        a = _a;\n    }\n    inva = (a ^ 0xff);\n\n    if (y1 == y2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end);\n            break;\n        default:\n            HLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end);\n            break;\n        }\n    } else if (x1 == x2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end);\n            break;\n        default:\n            VLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end);\n            break;\n        }\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end);\n            break;\n        default:\n            DLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end);\n            break;\n        }\n    } else {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY2_BLEND_RGB, DRAW_SETPIXELXY2_BLEND_RGB,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY2_ADD_RGB, DRAW_SETPIXELXY2_ADD_RGB,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY2_MOD_RGB, DRAW_SETPIXELXY2_MOD_RGB,\n                   draw_end);\n            break;\n        default:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY2_RGB, DRAW_SETPIXELXY2_BLEND_RGB,\n                   draw_end);\n            break;\n        }\n    }\n}\n\nstatic void\nSDL_BlendLine_RGB555(SDL_Surface * dst, int x1, int y1, int x2, int y2,\n                     SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,\n                     SDL_bool draw_end)\n{\n    unsigned r, g, b, a, inva;\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(_r, _a);\n        g = DRAW_MUL(_g, _a);\n        b = DRAW_MUL(_b, _a);\n        a = _a;\n    } else {\n        r = _r;\n        g = _g;\n        b = _b;\n        a = _a;\n    }\n    inva = (a ^ 0xff);\n\n    if (y1 == y2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end);\n            break;\n        default:\n            HLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end);\n            break;\n        }\n    } else if (x1 == x2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end);\n            break;\n        default:\n            VLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end);\n            break;\n        }\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end);\n            break;\n        default:\n            DLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end);\n            break;\n        }\n    } else {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_BLEND_RGB555, DRAW_SETPIXELXY_BLEND_RGB555,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_ADD_RGB555, DRAW_SETPIXELXY_ADD_RGB555,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_MOD_RGB555, DRAW_SETPIXELXY_MOD_RGB555,\n                   draw_end);\n            break;\n        default:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_RGB555, DRAW_SETPIXELXY_BLEND_RGB555,\n                   draw_end);\n            break;\n        }\n    }\n}\n\nstatic void\nSDL_BlendLine_RGB565(SDL_Surface * dst, int x1, int y1, int x2, int y2,\n                     SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,\n                     SDL_bool draw_end)\n{\n    unsigned r, g, b, a, inva;\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(_r, _a);\n        g = DRAW_MUL(_g, _a);\n        b = DRAW_MUL(_b, _a);\n        a = _a;\n    } else {\n        r = _r;\n        g = _g;\n        b = _b;\n        a = _a;\n    }\n    inva = (a ^ 0xff);\n\n    if (y1 == y2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end);\n            break;\n        default:\n            HLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end);\n            break;\n        }\n    } else if (x1 == x2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end);\n            break;\n        default:\n            VLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end);\n            break;\n        }\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end);\n            break;\n        default:\n            DLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end);\n            break;\n        }\n    } else {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_BLEND_RGB565, DRAW_SETPIXELXY_BLEND_RGB565,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_ADD_RGB565, DRAW_SETPIXELXY_ADD_RGB565,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_MOD_RGB565, DRAW_SETPIXELXY_MOD_RGB565,\n                   draw_end);\n            break;\n        default:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_RGB565, DRAW_SETPIXELXY_BLEND_RGB565,\n                   draw_end);\n            break;\n        }\n    }\n}\n\nstatic void\nSDL_BlendLine_RGB4(SDL_Surface * dst, int x1, int y1, int x2, int y2,\n                   SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,\n                   SDL_bool draw_end)\n{\n    const SDL_PixelFormat *fmt = dst->format;\n    unsigned r, g, b, a, inva;\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(_r, _a);\n        g = DRAW_MUL(_g, _a);\n        b = DRAW_MUL(_b, _a);\n        a = _a;\n    } else {\n        r = _r;\n        g = _g;\n        b = _b;\n        a = _a;\n    }\n    inva = (a ^ 0xff);\n\n    if (y1 == y2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            HLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            HLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end);\n            break;\n        default:\n            HLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end);\n            break;\n        }\n    } else if (x1 == x2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            VLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            VLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end);\n            break;\n        default:\n            VLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end);\n            break;\n        }\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end);\n            break;\n        default:\n            DLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end);\n            break;\n        }\n    } else {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY4_BLEND_RGB, DRAW_SETPIXELXY4_BLEND_RGB,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY4_ADD_RGB, DRAW_SETPIXELXY4_ADD_RGB,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY4_MOD_RGB, DRAW_SETPIXELXY4_MOD_RGB,\n                   draw_end);\n            break;\n        default:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY4_RGB, DRAW_SETPIXELXY4_BLEND_RGB,\n                   draw_end);\n            break;\n        }\n    }\n}\n\nstatic void\nSDL_BlendLine_RGBA4(SDL_Surface * dst, int x1, int y1, int x2, int y2,\n                    SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,\n                    SDL_bool draw_end)\n{\n    const SDL_PixelFormat *fmt = dst->format;\n    unsigned r, g, b, a, inva;\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(_r, _a);\n        g = DRAW_MUL(_g, _a);\n        b = DRAW_MUL(_b, _a);\n        a = _a;\n    } else {\n        r = _r;\n        g = _g;\n        b = _b;\n        a = _a;\n    }\n    inva = (a ^ 0xff);\n\n    if (y1 == y2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            HLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            HLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end);\n            break;\n        default:\n            HLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end);\n            break;\n        }\n    } else if (x1 == x2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            VLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            VLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end);\n            break;\n        default:\n            VLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end);\n            break;\n        }\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end);\n            break;\n        default:\n            DLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end);\n            break;\n        }\n    } else {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY4_BLEND_RGBA, DRAW_SETPIXELXY4_BLEND_RGBA,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY4_ADD_RGBA, DRAW_SETPIXELXY4_ADD_RGBA,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY4_MOD_RGBA, DRAW_SETPIXELXY4_MOD_RGBA,\n                   draw_end);\n            break;\n        default:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY4_RGBA, DRAW_SETPIXELXY4_BLEND_RGBA,\n                   draw_end);\n            break;\n        }\n    }\n}\n\nstatic void\nSDL_BlendLine_RGB888(SDL_Surface * dst, int x1, int y1, int x2, int y2,\n                     SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,\n                     SDL_bool draw_end)\n{\n    unsigned r, g, b, a, inva;\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(_r, _a);\n        g = DRAW_MUL(_g, _a);\n        b = DRAW_MUL(_b, _a);\n        a = _a;\n    } else {\n        r = _r;\n        g = _g;\n        b = _b;\n        a = _a;\n    }\n    inva = (a ^ 0xff);\n\n    if (y1 == y2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB888, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            HLINE(Uint32, DRAW_SETPIXEL_ADD_RGB888, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            HLINE(Uint32, DRAW_SETPIXEL_MOD_RGB888, draw_end);\n            break;\n        default:\n            HLINE(Uint32, DRAW_SETPIXEL_RGB888, draw_end);\n            break;\n        }\n    } else if (x1 == x2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB888, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            VLINE(Uint32, DRAW_SETPIXEL_ADD_RGB888, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            VLINE(Uint32, DRAW_SETPIXEL_MOD_RGB888, draw_end);\n            break;\n        default:\n            VLINE(Uint32, DRAW_SETPIXEL_RGB888, draw_end);\n            break;\n        }\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB888, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DLINE(Uint32, DRAW_SETPIXEL_ADD_RGB888, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DLINE(Uint32, DRAW_SETPIXEL_MOD_RGB888, draw_end);\n            break;\n        default:\n            DLINE(Uint32, DRAW_SETPIXEL_RGB888, draw_end);\n            break;\n        }\n    } else {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_BLEND_RGB888, DRAW_SETPIXELXY_BLEND_RGB888,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_ADD_RGB888, DRAW_SETPIXELXY_ADD_RGB888,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_MOD_RGB888, DRAW_SETPIXELXY_MOD_RGB888,\n                   draw_end);\n            break;\n        default:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_RGB888, DRAW_SETPIXELXY_BLEND_RGB888,\n                   draw_end);\n            break;\n        }\n    }\n}\n\nstatic void\nSDL_BlendLine_ARGB8888(SDL_Surface * dst, int x1, int y1, int x2, int y2,\n                       SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,\n                       SDL_bool draw_end)\n{\n    unsigned r, g, b, a, inva;\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(_r, _a);\n        g = DRAW_MUL(_g, _a);\n        b = DRAW_MUL(_b, _a);\n        a = _a;\n    } else {\n        r = _r;\n        g = _g;\n        b = _b;\n        a = _a;\n    }\n    inva = (a ^ 0xff);\n\n    if (y1 == y2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            HLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            HLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            HLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end);\n            break;\n        default:\n            HLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end);\n            break;\n        }\n    } else if (x1 == x2) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            VLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            VLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            VLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end);\n            break;\n        default:\n            VLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end);\n            break;\n        }\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end);\n            break;\n        default:\n            DLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end);\n            break;\n        }\n    } else {\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_BLEND_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_ADD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_ADD_ARGB8888, DRAW_SETPIXELXY_ADD_ARGB8888,\n                   draw_end);\n            break;\n        case SDL_BLENDMODE_MOD:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_MOD_ARGB8888, DRAW_SETPIXELXY_MOD_ARGB8888,\n                   draw_end);\n            break;\n        default:\n            AALINE(x1, y1, x2, y2,\n                   DRAW_SETPIXELXY_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888,\n                   draw_end);\n            break;\n        }\n    }\n}\n\ntypedef void (*BlendLineFunc) (SDL_Surface * dst,\n                               int x1, int y1, int x2, int y2,\n                               SDL_BlendMode blendMode,\n                               Uint8 r, Uint8 g, Uint8 b, Uint8 a,\n                               SDL_bool draw_end);\n\nstatic BlendLineFunc\nSDL_CalculateBlendLineFunc(const SDL_PixelFormat * fmt)\n{\n    switch (fmt->BytesPerPixel) {\n    case 2:\n        if (fmt->Rmask == 0x7C00) {\n            return SDL_BlendLine_RGB555;\n        } else if (fmt->Rmask == 0xF800) {\n            return SDL_BlendLine_RGB565;\n        } else {\n            return SDL_BlendLine_RGB2;\n        }\n        break;\n    case 4:\n        if (fmt->Rmask == 0x00FF0000) {\n            if (fmt->Amask) {\n                return SDL_BlendLine_ARGB8888;\n            } else {\n                return SDL_BlendLine_RGB888;\n            }\n        } else {\n            if (fmt->Amask) {\n                return SDL_BlendLine_RGBA4;\n            } else {\n                return SDL_BlendLine_RGB4;\n            }\n        }\n    }\n    return NULL;\n}\n\nint\nSDL_BlendLine(SDL_Surface * dst, int x1, int y1, int x2, int y2,\n              SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    BlendLineFunc func;\n\n    if (!dst) {\n        return SDL_SetError(\"SDL_BlendLine(): Passed NULL destination surface\");\n    }\n\n    func = SDL_CalculateBlendLineFunc(dst->format);\n    if (!func) {\n        return SDL_SetError(\"SDL_BlendLine(): Unsupported surface format\");\n    }\n\n    /* Perform clipping */\n    /* FIXME: We don't actually want to clip, as it may change line slope */\n    if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {\n        return 0;\n    }\n\n    func(dst, x1, y1, x2, y2, blendMode, r, g, b, a, SDL_TRUE);\n    return 0;\n}\n\nint\nSDL_BlendLines(SDL_Surface * dst, const SDL_Point * points, int count,\n               SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    int i;\n    int x1, y1;\n    int x2, y2;\n    SDL_bool draw_end;\n    BlendLineFunc func;\n\n    if (!dst) {\n        return SDL_SetError(\"SDL_BlendLines(): Passed NULL destination surface\");\n    }\n\n    func = SDL_CalculateBlendLineFunc(dst->format);\n    if (!func) {\n        return SDL_SetError(\"SDL_BlendLines(): Unsupported surface format\");\n    }\n\n    for (i = 1; i < count; ++i) {\n        x1 = points[i-1].x;\n        y1 = points[i-1].y;\n        x2 = points[i].x;\n        y2 = points[i].y;\n\n        /* Perform clipping */\n        /* FIXME: We don't actually want to clip, as it may change line slope */\n        if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {\n            continue;\n        }\n\n        /* Draw the end if it was clipped */\n        draw_end = (x2 != points[i].x || y2 != points[i].y);\n\n        func(dst, x1, y1, x2, y2, blendMode, r, g, b, a, draw_end);\n    }\n    if (points[0].x != points[count-1].x || points[0].y != points[count-1].y) {\n        SDL_BlendPoint(dst, points[count-1].x, points[count-1].y,\n                       blendMode, r, g, b, a);\n    }\n    return 0;\n}\n\n#endif /* !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_blendline.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n\nextern int SDL_BlendLine(SDL_Surface * dst, int x1, int y1, int x2, int y2, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\nextern int SDL_BlendLines(SDL_Surface * dst, const SDL_Point * points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_blendpoint.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if !SDL_RENDER_DISABLED\n\n#include \"SDL_draw.h\"\n#include \"SDL_blendpoint.h\"\n\n\nstatic int\nSDL_BlendPoint_RGB555(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,\n                      Uint8 g, Uint8 b, Uint8 a)\n{\n    unsigned inva = 0xff - a;\n\n    switch (blendMode) {\n    case SDL_BLENDMODE_BLEND:\n        DRAW_SETPIXELXY_BLEND_RGB555(x, y);\n        break;\n    case SDL_BLENDMODE_ADD:\n        DRAW_SETPIXELXY_ADD_RGB555(x, y);\n        break;\n    case SDL_BLENDMODE_MOD:\n        DRAW_SETPIXELXY_MOD_RGB555(x, y);\n        break;\n    default:\n        DRAW_SETPIXELXY_RGB555(x, y);\n        break;\n    }\n    return 0;\n}\n\nstatic int\nSDL_BlendPoint_RGB565(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,\n                      Uint8 g, Uint8 b, Uint8 a)\n{\n    unsigned inva = 0xff - a;\n\n    switch (blendMode) {\n    case SDL_BLENDMODE_BLEND:\n        DRAW_SETPIXELXY_BLEND_RGB565(x, y);\n        break;\n    case SDL_BLENDMODE_ADD:\n        DRAW_SETPIXELXY_ADD_RGB565(x, y);\n        break;\n    case SDL_BLENDMODE_MOD:\n        DRAW_SETPIXELXY_MOD_RGB565(x, y);\n        break;\n    default:\n        DRAW_SETPIXELXY_RGB565(x, y);\n        break;\n    }\n    return 0;\n}\n\nstatic int\nSDL_BlendPoint_RGB888(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,\n                      Uint8 g, Uint8 b, Uint8 a)\n{\n    unsigned inva = 0xff - a;\n\n    switch (blendMode) {\n    case SDL_BLENDMODE_BLEND:\n        DRAW_SETPIXELXY_BLEND_RGB888(x, y);\n        break;\n    case SDL_BLENDMODE_ADD:\n        DRAW_SETPIXELXY_ADD_RGB888(x, y);\n        break;\n    case SDL_BLENDMODE_MOD:\n        DRAW_SETPIXELXY_MOD_RGB888(x, y);\n        break;\n    default:\n        DRAW_SETPIXELXY_RGB888(x, y);\n        break;\n    }\n    return 0;\n}\n\nstatic int\nSDL_BlendPoint_ARGB8888(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode,\n                        Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    unsigned inva = 0xff - a;\n\n    switch (blendMode) {\n    case SDL_BLENDMODE_BLEND:\n        DRAW_SETPIXELXY_BLEND_ARGB8888(x, y);\n        break;\n    case SDL_BLENDMODE_ADD:\n        DRAW_SETPIXELXY_ADD_ARGB8888(x, y);\n        break;\n    case SDL_BLENDMODE_MOD:\n        DRAW_SETPIXELXY_MOD_ARGB8888(x, y);\n        break;\n    default:\n        DRAW_SETPIXELXY_ARGB8888(x, y);\n        break;\n    }\n    return 0;\n}\n\nstatic int\nSDL_BlendPoint_RGB(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,\n                   Uint8 g, Uint8 b, Uint8 a)\n{\n    SDL_PixelFormat *fmt = dst->format;\n    unsigned inva = 0xff - a;\n\n    switch (fmt->BytesPerPixel) {\n    case 2:\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DRAW_SETPIXELXY2_BLEND_RGB(x, y);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DRAW_SETPIXELXY2_ADD_RGB(x, y);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DRAW_SETPIXELXY2_MOD_RGB(x, y);\n            break;\n        default:\n            DRAW_SETPIXELXY2_RGB(x, y);\n            break;\n        }\n        return 0;\n    case 4:\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DRAW_SETPIXELXY4_BLEND_RGB(x, y);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DRAW_SETPIXELXY4_ADD_RGB(x, y);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DRAW_SETPIXELXY4_MOD_RGB(x, y);\n            break;\n        default:\n            DRAW_SETPIXELXY4_RGB(x, y);\n            break;\n        }\n        return 0;\n    default:\n        return SDL_Unsupported();\n    }\n}\n\nstatic int\nSDL_BlendPoint_RGBA(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,\n                    Uint8 g, Uint8 b, Uint8 a)\n{\n    SDL_PixelFormat *fmt = dst->format;\n    unsigned inva = 0xff - a;\n\n    switch (fmt->BytesPerPixel) {\n    case 4:\n        switch (blendMode) {\n        case SDL_BLENDMODE_BLEND:\n            DRAW_SETPIXELXY4_BLEND_RGBA(x, y);\n            break;\n        case SDL_BLENDMODE_ADD:\n            DRAW_SETPIXELXY4_ADD_RGBA(x, y);\n            break;\n        case SDL_BLENDMODE_MOD:\n            DRAW_SETPIXELXY4_MOD_RGBA(x, y);\n            break;\n        default:\n            DRAW_SETPIXELXY4_RGBA(x, y);\n            break;\n        }\n        return 0;\n    default:\n        return SDL_Unsupported();\n    }\n}\n\nint\nSDL_BlendPoint(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,\n               Uint8 g, Uint8 b, Uint8 a)\n{\n    if (!dst) {\n        return SDL_SetError(\"Passed NULL destination surface\");\n    }\n\n    /* This function doesn't work on surfaces < 8 bpp */\n    if (dst->format->BitsPerPixel < 8) {\n        return SDL_SetError(\"SDL_BlendPoint(): Unsupported surface format\");\n    }\n\n    /* Perform clipping */\n    if (x < dst->clip_rect.x || y < dst->clip_rect.y ||\n        x >= (dst->clip_rect.x + dst->clip_rect.w) ||\n        y >= (dst->clip_rect.y + dst->clip_rect.h)) {\n        return 0;\n    }\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(r, a);\n        g = DRAW_MUL(g, a);\n        b = DRAW_MUL(b, a);\n    }\n\n    switch (dst->format->BitsPerPixel) {\n    case 15:\n        switch (dst->format->Rmask) {\n        case 0x7C00:\n            return SDL_BlendPoint_RGB555(dst, x, y, blendMode, r, g, b, a);\n        }\n        break;\n    case 16:\n        switch (dst->format->Rmask) {\n        case 0xF800:\n            return SDL_BlendPoint_RGB565(dst, x, y, blendMode, r, g, b, a);\n        }\n        break;\n    case 32:\n        switch (dst->format->Rmask) {\n        case 0x00FF0000:\n            if (!dst->format->Amask) {\n                return SDL_BlendPoint_RGB888(dst, x, y, blendMode, r, g, b,\n                                             a);\n            } else {\n                return SDL_BlendPoint_ARGB8888(dst, x, y, blendMode, r, g, b,\n                                               a);\n            }\n            break;\n        }\n        break;\n    default:\n        break;\n    }\n\n    if (!dst->format->Amask) {\n        return SDL_BlendPoint_RGB(dst, x, y, blendMode, r, g, b, a);\n    } else {\n        return SDL_BlendPoint_RGBA(dst, x, y, blendMode, r, g, b, a);\n    }\n}\n\nint\nSDL_BlendPoints(SDL_Surface * dst, const SDL_Point * points, int count,\n                SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    int minx, miny;\n    int maxx, maxy;\n    int i;\n    int x, y;\n    int (*func)(SDL_Surface * dst, int x, int y,\n                SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) = NULL;\n    int status = 0;\n\n    if (!dst) {\n        return SDL_SetError(\"Passed NULL destination surface\");\n    }\n\n    /* This function doesn't work on surfaces < 8 bpp */\n    if (dst->format->BitsPerPixel < 8) {\n        return SDL_SetError(\"SDL_BlendPoints(): Unsupported surface format\");\n    }\n\n    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {\n        r = DRAW_MUL(r, a);\n        g = DRAW_MUL(g, a);\n        b = DRAW_MUL(b, a);\n    }\n\n    /* FIXME: Does this function pointer slow things down significantly? */\n    switch (dst->format->BitsPerPixel) {\n    case 15:\n        switch (dst->format->Rmask) {\n        case 0x7C00:\n            func = SDL_BlendPoint_RGB555;\n            break;\n        }\n        break;\n    case 16:\n        switch (dst->format->Rmask) {\n        case 0xF800:\n            func = SDL_BlendPoint_RGB565;\n            break;\n        }\n        break;\n    case 32:\n        switch (dst->format->Rmask) {\n        case 0x00FF0000:\n            if (!dst->format->Amask) {\n                func = SDL_BlendPoint_RGB888;\n            } else {\n                func = SDL_BlendPoint_ARGB8888;\n            }\n            break;\n        }\n        break;\n    default:\n        break;\n    }\n\n    if (!func) {\n        if (!dst->format->Amask) {\n            func = SDL_BlendPoint_RGB;\n        } else {\n            func = SDL_BlendPoint_RGBA;\n        }\n    }\n\n    minx = dst->clip_rect.x;\n    maxx = dst->clip_rect.x + dst->clip_rect.w - 1;\n    miny = dst->clip_rect.y;\n    maxy = dst->clip_rect.y + dst->clip_rect.h - 1;\n\n    for (i = 0; i < count; ++i) {\n        x = points[i].x;\n        y = points[i].y;\n\n        if (x < minx || x > maxx || y < miny || y > maxy) {\n            continue;\n        }\n        status = func(dst, x, y, blendMode, r, g, b, a);\n    }\n    return status;\n}\n\n#endif /* !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_blendpoint.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n\nextern int SDL_BlendPoint(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\nextern int SDL_BlendPoints(SDL_Surface * dst, const SDL_Point * points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_draw.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#include \"../../video/SDL_blit.h\"\n\n/* This code assumes that r, g, b, a are the source color,\n * and in the blend and add case, the RGB values are premultiplied by a.\n */\n\n#define DRAW_MUL(_a, _b) (((unsigned)(_a)*(_b))/255)\n\n#define DRAW_FASTSETPIXEL(type) \\\n    *pixel = (type) color\n\n#define DRAW_FASTSETPIXEL1 DRAW_FASTSETPIXEL(Uint8)\n#define DRAW_FASTSETPIXEL2 DRAW_FASTSETPIXEL(Uint16)\n#define DRAW_FASTSETPIXEL4 DRAW_FASTSETPIXEL(Uint32)\n\n#define DRAW_FASTSETPIXELXY(x, y, type, bpp, color) \\\n    *(type *)((Uint8 *)dst->pixels + (y) * dst->pitch \\\n                                   + (x) * bpp) = (type) color\n\n#define DRAW_FASTSETPIXELXY1(x, y) DRAW_FASTSETPIXELXY(x, y, Uint8, 1, color)\n#define DRAW_FASTSETPIXELXY2(x, y) DRAW_FASTSETPIXELXY(x, y, Uint16, 2, color)\n#define DRAW_FASTSETPIXELXY4(x, y) DRAW_FASTSETPIXELXY(x, y, Uint32, 4, color)\n\n#define DRAW_SETPIXEL(setpixel) \\\ndo { \\\n    unsigned sr = r, sg = g, sb = b, sa = a; (void) sa; \\\n    setpixel; \\\n} while (0)\n\n#define DRAW_SETPIXEL_BLEND(getpixel, setpixel) \\\ndo { \\\n    unsigned sr, sg, sb, sa = 0xFF; \\\n    getpixel; \\\n    sr = DRAW_MUL(inva, sr) + r; \\\n    sg = DRAW_MUL(inva, sg) + g; \\\n    sb = DRAW_MUL(inva, sb) + b; \\\n    sa = DRAW_MUL(inva, sa) + a; \\\n    setpixel; \\\n} while (0)\n\n#define DRAW_SETPIXEL_ADD(getpixel, setpixel) \\\ndo { \\\n    unsigned sr, sg, sb, sa; (void) sa; \\\n    getpixel; \\\n    sr += r; if (sr > 0xff) sr = 0xff; \\\n    sg += g; if (sg > 0xff) sg = 0xff; \\\n    sb += b; if (sb > 0xff) sb = 0xff; \\\n    setpixel; \\\n} while (0)\n\n#define DRAW_SETPIXEL_MOD(getpixel, setpixel) \\\ndo { \\\n    unsigned sr, sg, sb, sa; (void) sa; \\\n    getpixel; \\\n    sr = DRAW_MUL(sr, r); \\\n    sg = DRAW_MUL(sg, g); \\\n    sb = DRAW_MUL(sb, b); \\\n    setpixel; \\\n} while (0)\n\n#define DRAW_SETPIXELXY(x, y, type, bpp, op) \\\ndo { \\\n    type *pixel = (type *)((Uint8 *)dst->pixels + (y) * dst->pitch \\\n                                                + (x) * bpp); \\\n    op; \\\n} while (0)\n\n/*\n * Define draw operators for RGB555\n */\n\n#define DRAW_SETPIXEL_RGB555 \\\n    DRAW_SETPIXEL(RGB555_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXEL_BLEND_RGB555 \\\n    DRAW_SETPIXEL_BLEND(RGB_FROM_RGB555(*pixel, sr, sg, sb), \\\n                        RGB555_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXEL_ADD_RGB555 \\\n    DRAW_SETPIXEL_ADD(RGB_FROM_RGB555(*pixel, sr, sg, sb), \\\n                      RGB555_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXEL_MOD_RGB555 \\\n    DRAW_SETPIXEL_MOD(RGB_FROM_RGB555(*pixel, sr, sg, sb), \\\n                      RGB555_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXELXY_RGB555(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_RGB555)\n\n#define DRAW_SETPIXELXY_BLEND_RGB555(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB555)\n\n#define DRAW_SETPIXELXY_ADD_RGB555(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB555)\n\n#define DRAW_SETPIXELXY_MOD_RGB555(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MOD_RGB555)\n\n/*\n * Define draw operators for RGB565\n */\n\n#define DRAW_SETPIXEL_RGB565 \\\n    DRAW_SETPIXEL(RGB565_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXEL_BLEND_RGB565 \\\n    DRAW_SETPIXEL_BLEND(RGB_FROM_RGB565(*pixel, sr, sg, sb), \\\n                        RGB565_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXEL_ADD_RGB565 \\\n    DRAW_SETPIXEL_ADD(RGB_FROM_RGB565(*pixel, sr, sg, sb), \\\n                      RGB565_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXEL_MOD_RGB565 \\\n    DRAW_SETPIXEL_MOD(RGB_FROM_RGB565(*pixel, sr, sg, sb), \\\n                      RGB565_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXELXY_RGB565(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_RGB565)\n\n#define DRAW_SETPIXELXY_BLEND_RGB565(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB565)\n\n#define DRAW_SETPIXELXY_ADD_RGB565(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB565)\n\n#define DRAW_SETPIXELXY_MOD_RGB565(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MOD_RGB565)\n\n/*\n * Define draw operators for RGB888\n */\n\n#define DRAW_SETPIXEL_RGB888 \\\n    DRAW_SETPIXEL(RGB888_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXEL_BLEND_RGB888 \\\n    DRAW_SETPIXEL_BLEND(RGB_FROM_RGB888(*pixel, sr, sg, sb), \\\n                        RGB888_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXEL_ADD_RGB888 \\\n    DRAW_SETPIXEL_ADD(RGB_FROM_RGB888(*pixel, sr, sg, sb), \\\n                      RGB888_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXEL_MOD_RGB888 \\\n    DRAW_SETPIXEL_MOD(RGB_FROM_RGB888(*pixel, sr, sg, sb), \\\n                      RGB888_FROM_RGB(*pixel, sr, sg, sb))\n\n#define DRAW_SETPIXELXY_RGB888(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_RGB888)\n\n#define DRAW_SETPIXELXY_BLEND_RGB888(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGB888)\n\n#define DRAW_SETPIXELXY_ADD_RGB888(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_RGB888)\n\n#define DRAW_SETPIXELXY_MOD_RGB888(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_RGB888)\n\n/*\n * Define draw operators for ARGB8888\n */\n\n#define DRAW_SETPIXEL_ARGB8888 \\\n    DRAW_SETPIXEL(ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))\n\n#define DRAW_SETPIXEL_BLEND_ARGB8888 \\\n    DRAW_SETPIXEL_BLEND(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \\\n                        ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))\n\n#define DRAW_SETPIXEL_ADD_ARGB8888 \\\n    DRAW_SETPIXEL_ADD(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \\\n                      ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))\n\n#define DRAW_SETPIXEL_MOD_ARGB8888 \\\n    DRAW_SETPIXEL_MOD(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \\\n                      ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))\n\n#define DRAW_SETPIXELXY_ARGB8888(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ARGB8888)\n\n#define DRAW_SETPIXELXY_BLEND_ARGB8888(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_ARGB8888)\n\n#define DRAW_SETPIXELXY_ADD_ARGB8888(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_ARGB8888)\n\n#define DRAW_SETPIXELXY_MOD_ARGB8888(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_ARGB8888)\n\n/*\n * Define draw operators for general RGB\n */\n\n#define DRAW_SETPIXEL_RGB \\\n    DRAW_SETPIXEL(PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))\n\n#define DRAW_SETPIXEL_BLEND_RGB \\\n    DRAW_SETPIXEL_BLEND(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \\\n                        PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))\n\n#define DRAW_SETPIXEL_ADD_RGB \\\n    DRAW_SETPIXEL_ADD(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \\\n                      PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))\n\n#define DRAW_SETPIXEL_MOD_RGB \\\n    DRAW_SETPIXEL_MOD(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \\\n                      PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))\n\n#define DRAW_SETPIXELXY2_RGB(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_RGB)\n\n#define DRAW_SETPIXELXY4_RGB(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_RGB)\n\n#define DRAW_SETPIXELXY2_BLEND_RGB(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB)\n\n#define DRAW_SETPIXELXY4_BLEND_RGB(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGB)\n\n#define DRAW_SETPIXELXY2_ADD_RGB(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB)\n\n#define DRAW_SETPIXELXY4_ADD_RGB(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_RGB)\n\n#define DRAW_SETPIXELXY2_MOD_RGB(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MOD_RGB)\n\n#define DRAW_SETPIXELXY4_MOD_RGB(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_RGB)\n\n\n/*\n * Define draw operators for general RGBA\n */\n\n#define DRAW_SETPIXEL_RGBA \\\n    DRAW_SETPIXEL(PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))\n\n#define DRAW_SETPIXEL_BLEND_RGBA \\\n    DRAW_SETPIXEL_BLEND(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \\\n                        PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))\n\n#define DRAW_SETPIXEL_ADD_RGBA \\\n    DRAW_SETPIXEL_ADD(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \\\n                      PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))\n\n#define DRAW_SETPIXEL_MOD_RGBA \\\n    DRAW_SETPIXEL_MOD(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \\\n                      PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))\n\n#define DRAW_SETPIXELXY4_RGBA(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_RGBA)\n\n#define DRAW_SETPIXELXY4_BLEND_RGBA(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGBA)\n\n#define DRAW_SETPIXELXY4_ADD_RGBA(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_RGBA)\n\n#define DRAW_SETPIXELXY4_MOD_RGBA(x, y) \\\n    DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_RGBA)\n\n/*\n * Define line drawing macro\n */\n\n#define ABS(_x) ((_x) < 0 ? -(_x) : (_x))\n\n/* Horizontal line */\n#define HLINE(type, op, draw_end) \\\n{ \\\n    int length; \\\n    int pitch = (dst->pitch / dst->format->BytesPerPixel); \\\n    type *pixel; \\\n    if (x1 <= x2) { \\\n        pixel = (type *)dst->pixels + y1 * pitch + x1; \\\n        length = draw_end ? (x2-x1+1) : (x2-x1); \\\n    } else { \\\n        pixel = (type *)dst->pixels + y1 * pitch + x2; \\\n        if (!draw_end) { \\\n            ++pixel; \\\n        } \\\n        length = draw_end ? (x1-x2+1) : (x1-x2); \\\n    } \\\n    while (length--) { \\\n        op; \\\n        ++pixel; \\\n    } \\\n}\n\n/* Vertical line */\n#define VLINE(type, op, draw_end) \\\n{ \\\n    int length; \\\n    int pitch = (dst->pitch / dst->format->BytesPerPixel); \\\n    type *pixel; \\\n    if (y1 <= y2) { \\\n        pixel = (type *)dst->pixels + y1 * pitch + x1; \\\n        length = draw_end ? (y2-y1+1) : (y2-y1); \\\n    } else { \\\n        pixel = (type *)dst->pixels + y2 * pitch + x1; \\\n        if (!draw_end) { \\\n            pixel += pitch; \\\n        } \\\n        length = draw_end ? (y1-y2+1) : (y1-y2); \\\n    } \\\n    while (length--) { \\\n        op; \\\n        pixel += pitch; \\\n    } \\\n}\n\n/* Diagonal line */\n#define DLINE(type, op, draw_end) \\\n{ \\\n    int length; \\\n    int pitch = (dst->pitch / dst->format->BytesPerPixel); \\\n    type *pixel; \\\n    if (y1 <= y2) { \\\n        pixel = (type *)dst->pixels + y1 * pitch + x1; \\\n        if (x1 <= x2) { \\\n            ++pitch; \\\n        } else { \\\n            --pitch; \\\n        } \\\n        length = (y2-y1); \\\n    } else { \\\n        pixel = (type *)dst->pixels + y2 * pitch + x2; \\\n        if (x2 <= x1) { \\\n            ++pitch; \\\n        } else { \\\n            --pitch; \\\n        } \\\n        if (!draw_end) { \\\n            pixel += pitch; \\\n        } \\\n        length = (y1-y2); \\\n    } \\\n    if (draw_end) { \\\n        ++length; \\\n    } \\\n    while (length--) { \\\n        op; \\\n        pixel += pitch; \\\n    } \\\n}\n\n/* Bresenham's line algorithm */\n#define BLINE(x1, y1, x2, y2, op, draw_end) \\\n{ \\\n    int i, deltax, deltay, numpixels; \\\n    int d, dinc1, dinc2; \\\n    int x, xinc1, xinc2; \\\n    int y, yinc1, yinc2; \\\n \\\n    deltax = ABS(x2 - x1); \\\n    deltay = ABS(y2 - y1); \\\n \\\n    if (deltax >= deltay) { \\\n        numpixels = deltax + 1; \\\n        d = (2 * deltay) - deltax; \\\n        dinc1 = deltay * 2; \\\n        dinc2 = (deltay - deltax) * 2; \\\n        xinc1 = 1; \\\n        xinc2 = 1; \\\n        yinc1 = 0; \\\n        yinc2 = 1; \\\n    } else { \\\n        numpixels = deltay + 1; \\\n        d = (2 * deltax) - deltay; \\\n        dinc1 = deltax * 2; \\\n        dinc2 = (deltax - deltay) * 2; \\\n        xinc1 = 0; \\\n        xinc2 = 1; \\\n        yinc1 = 1; \\\n        yinc2 = 1; \\\n    } \\\n \\\n    if (x1 > x2) { \\\n        xinc1 = -xinc1; \\\n        xinc2 = -xinc2; \\\n    } \\\n    if (y1 > y2) { \\\n        yinc1 = -yinc1; \\\n        yinc2 = -yinc2; \\\n    } \\\n \\\n    x = x1; \\\n    y = y1; \\\n \\\n    if (!draw_end) { \\\n        --numpixels; \\\n    } \\\n    for (i = 0; i < numpixels; ++i) { \\\n        op(x, y); \\\n        if (d < 0) { \\\n            d += dinc1; \\\n            x += xinc1; \\\n            y += yinc1; \\\n        } else { \\\n            d += dinc2; \\\n            x += xinc2; \\\n            y += yinc2; \\\n        } \\\n    } \\\n}\n\n/* Xiaolin Wu's line algorithm, based on Michael Abrash's implementation */\n#define WULINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) \\\n{ \\\n    Uint16 ErrorAdj, ErrorAcc; \\\n    Uint16 ErrorAccTemp, Weighting; \\\n    int DeltaX, DeltaY, Temp, XDir; \\\n    unsigned r, g, b, a, inva; \\\n \\\n    /* Draw the initial pixel, which is always exactly intersected by \\\n       the line and so needs no weighting */ \\\n    opaque_op(x1, y1); \\\n \\\n    /* Draw the final pixel, which is always exactly intersected by the line \\\n       and so needs no weighting */ \\\n    if (draw_end) { \\\n        opaque_op(x2, y2); \\\n    } \\\n \\\n    /* Make sure the line runs top to bottom */ \\\n    if (y1 > y2) { \\\n        Temp = y1; y1 = y2; y2 = Temp; \\\n        Temp = x1; x1 = x2; x2 = Temp; \\\n    } \\\n    DeltaY = y2 - y1; \\\n \\\n    if ((DeltaX = x2 - x1) >= 0) { \\\n        XDir = 1; \\\n    } else { \\\n        XDir = -1; \\\n        DeltaX = -DeltaX; /* make DeltaX positive */ \\\n    } \\\n \\\n    /* line is not horizontal, diagonal, or vertical */ \\\n    ErrorAcc = 0;  /* initialize the line error accumulator to 0 */ \\\n \\\n    /* Is this an X-major or Y-major line? */ \\\n    if (DeltaY > DeltaX) { \\\n        /* Y-major line; calculate 16-bit fixed-point fractional part of a \\\n          pixel that X advances each time Y advances 1 pixel, truncating the \\\n          result so that we won't overrun the endpoint along the X axis */ \\\n        ErrorAdj = ((unsigned long) DeltaX << 16) / (unsigned long) DeltaY; \\\n        /* Draw all pixels other than the first and last */ \\\n        while (--DeltaY) { \\\n            ErrorAccTemp = ErrorAcc;   /* remember currrent accumulated error */ \\\n            ErrorAcc += ErrorAdj;      /* calculate error for next pixel */ \\\n            if (ErrorAcc <= ErrorAccTemp) { \\\n                /* The error accumulator turned over, so advance the X coord */ \\\n                x1 += XDir; \\\n            } \\\n            y1++; /* Y-major, so always advance Y */ \\\n            /* The IntensityBits most significant bits of ErrorAcc give us the \\\n             intensity weighting for this pixel, and the complement of the \\\n             weighting for the paired pixel */ \\\n            Weighting = ErrorAcc >> 8; \\\n            { \\\n                a = DRAW_MUL(_a, (Weighting ^ 255)); \\\n                r = DRAW_MUL(_r, a); \\\n                g = DRAW_MUL(_g, a); \\\n                b = DRAW_MUL(_b, a); \\\n                inva = (a ^ 0xFF); \\\n                blend_op(x1, y1); \\\n            } \\\n            { \\\n                a = DRAW_MUL(_a, Weighting); \\\n                r = DRAW_MUL(_r, a); \\\n                g = DRAW_MUL(_g, a); \\\n                b = DRAW_MUL(_b, a); \\\n                inva = (a ^ 0xFF); \\\n                blend_op(x1 + XDir, y1); \\\n            } \\\n        } \\\n    } else { \\\n        /* X-major line; calculate 16-bit fixed-point fractional part of a \\\n           pixel that Y advances each time X advances 1 pixel, truncating the \\\n           result to avoid overrunning the endpoint along the X axis */ \\\n        ErrorAdj = ((unsigned long) DeltaY << 16) / (unsigned long) DeltaX; \\\n        /* Draw all pixels other than the first and last */ \\\n        while (--DeltaX) { \\\n            ErrorAccTemp = ErrorAcc;   /* remember currrent accumulated error */ \\\n            ErrorAcc += ErrorAdj;      /* calculate error for next pixel */ \\\n            if (ErrorAcc <= ErrorAccTemp) { \\\n                /* The error accumulator turned over, so advance the Y coord */ \\\n                y1++; \\\n            } \\\n            x1 += XDir; /* X-major, so always advance X */ \\\n            /* The IntensityBits most significant bits of ErrorAcc give us the \\\n              intensity weighting for this pixel, and the complement of the \\\n              weighting for the paired pixel */ \\\n            Weighting = ErrorAcc >> 8; \\\n            { \\\n                a = DRAW_MUL(_a, (Weighting ^ 255)); \\\n                r = DRAW_MUL(_r, a); \\\n                g = DRAW_MUL(_g, a); \\\n                b = DRAW_MUL(_b, a); \\\n                inva = (a ^ 0xFF); \\\n                blend_op(x1, y1); \\\n            } \\\n            { \\\n                a = DRAW_MUL(_a, Weighting); \\\n                r = DRAW_MUL(_r, a); \\\n                g = DRAW_MUL(_g, a); \\\n                b = DRAW_MUL(_b, a); \\\n                inva = (a ^ 0xFF); \\\n                blend_op(x1, y1 + 1); \\\n            } \\\n        } \\\n    } \\\n}\n\n#ifdef AA_LINES\n#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) \\\n            WULINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end)\n#else\n#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) \\\n            BLINE(x1, y1, x2, y2, opaque_op, draw_end)\n#endif\n\n/*\n * Define fill rect macro\n */\n\n#define FILLRECT(type, op) \\\ndo { \\\n    int width = rect->w; \\\n    int height = rect->h; \\\n    int pitch = (dst->pitch / dst->format->BytesPerPixel); \\\n    int skip = pitch - width; \\\n    type *pixel = (type *)dst->pixels + rect->y * pitch + rect->x; \\\n    while (height--) { \\\n        { int n = (width+3)/4; \\\n            switch (width & 3) { \\\n            case 0: do {   op; pixel++; \\\n            case 3:        op; pixel++; \\\n            case 2:        op; pixel++; \\\n            case 1:        op; pixel++; \\\n                    } while ( --n > 0 ); \\\n            } \\\n        } \\\n        pixel += skip; \\\n    } \\\n} while (0)\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_drawline.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if !SDL_RENDER_DISABLED\n\n#include \"SDL_draw.h\"\n#include \"SDL_drawline.h\"\n#include \"SDL_drawpoint.h\"\n\n\nstatic void\nSDL_DrawLine1(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color,\n              SDL_bool draw_end)\n{\n    if (y1 == y2) {\n        int length;\n        int pitch = (dst->pitch / dst->format->BytesPerPixel);\n        Uint8 *pixel;\n        if (x1 <= x2) {\n            pixel = (Uint8 *)dst->pixels + y1 * pitch + x1;\n            length = draw_end ? (x2-x1+1) : (x2-x1);\n        } else {\n            pixel = (Uint8 *)dst->pixels + y1 * pitch + x2;\n            if (!draw_end) {\n                ++pixel;\n            }\n            length = draw_end ? (x1-x2+1) : (x1-x2);\n        }\n        SDL_memset(pixel, color, length);\n    } else if (x1 == x2) {\n        VLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end);\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        DLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end);\n    } else {\n        BLINE(x1, y1, x2, y2, DRAW_FASTSETPIXELXY1, draw_end);\n    }\n}\n\nstatic void\nSDL_DrawLine2(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color,\n              SDL_bool draw_end)\n{\n    if (y1 == y2) {\n        HLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);\n    } else if (x1 == x2) {\n        VLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        DLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);\n    } else {\n        Uint8 _r, _g, _b, _a;\n        const SDL_PixelFormat * fmt = dst->format;\n        SDL_GetRGBA(color, fmt, &_r, &_g, &_b, &_a);\n        if (fmt->Rmask == 0x7C00) {\n            AALINE(x1, y1, x2, y2,\n                   DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY_BLEND_RGB555,\n                   draw_end);\n        } else if (fmt->Rmask == 0xF800) {\n            AALINE(x1, y1, x2, y2,\n                   DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY_BLEND_RGB565,\n                   draw_end);\n        } else {\n            AALINE(x1, y1, x2, y2,\n                   DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY2_BLEND_RGB,\n                   draw_end);\n        }\n    }\n}\n\nstatic void\nSDL_DrawLine4(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color,\n              SDL_bool draw_end)\n{\n    if (y1 == y2) {\n        HLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);\n    } else if (x1 == x2) {\n        VLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);\n    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {\n        DLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);\n    } else {\n        Uint8 _r, _g, _b, _a;\n        const SDL_PixelFormat * fmt = dst->format;\n        SDL_GetRGBA(color, fmt, &_r, &_g, &_b, &_a);\n        if (fmt->Rmask == 0x00FF0000) {\n            if (!fmt->Amask) {\n                AALINE(x1, y1, x2, y2,\n                       DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_RGB888,\n                       draw_end);\n            } else {\n                AALINE(x1, y1, x2, y2,\n                       DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_ARGB8888,\n                       draw_end);\n            }\n        } else {\n            AALINE(x1, y1, x2, y2,\n                   DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY4_BLEND_RGB,\n                   draw_end);\n        }\n    }\n}\n\ntypedef void (*DrawLineFunc) (SDL_Surface * dst,\n                              int x1, int y1, int x2, int y2,\n                              Uint32 color, SDL_bool draw_end);\n\nstatic DrawLineFunc\nSDL_CalculateDrawLineFunc(const SDL_PixelFormat * fmt)\n{\n    switch (fmt->BytesPerPixel) {\n    case 1:\n        if (fmt->BitsPerPixel < 8) {\n            break;\n        }\n        return SDL_DrawLine1;\n    case 2:\n        return SDL_DrawLine2;\n    case 4:\n        return SDL_DrawLine4;\n    }\n    return NULL;\n}\n\nint\nSDL_DrawLine(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color)\n{\n    DrawLineFunc func;\n\n    if (!dst) {\n        return SDL_SetError(\"SDL_DrawLine(): Passed NULL destination surface\");\n    }\n\n    func = SDL_CalculateDrawLineFunc(dst->format);\n    if (!func) {\n        return SDL_SetError(\"SDL_DrawLine(): Unsupported surface format\");\n    }\n\n    /* Perform clipping */\n    /* FIXME: We don't actually want to clip, as it may change line slope */\n    if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {\n        return 0;\n    }\n\n    func(dst, x1, y1, x2, y2, color, SDL_TRUE);\n    return 0;\n}\n\nint\nSDL_DrawLines(SDL_Surface * dst, const SDL_Point * points, int count,\n              Uint32 color)\n{\n    int i;\n    int x1, y1;\n    int x2, y2;\n    SDL_bool draw_end;\n    DrawLineFunc func;\n\n    if (!dst) {\n        return SDL_SetError(\"SDL_DrawLines(): Passed NULL destination surface\");\n    }\n\n    func = SDL_CalculateDrawLineFunc(dst->format);\n    if (!func) {\n        return SDL_SetError(\"SDL_DrawLines(): Unsupported surface format\");\n    }\n\n    for (i = 1; i < count; ++i) {\n        x1 = points[i-1].x;\n        y1 = points[i-1].y;\n        x2 = points[i].x;\n        y2 = points[i].y;\n\n        /* Perform clipping */\n        /* FIXME: We don't actually want to clip, as it may change line slope */\n        if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {\n            continue;\n        }\n\n        /* Draw the end if it was clipped */\n        draw_end = (x2 != points[i].x || y2 != points[i].y);\n\n        func(dst, x1, y1, x2, y2, color, draw_end);\n    }\n    if (points[0].x != points[count-1].x || points[0].y != points[count-1].y) {\n        SDL_DrawPoint(dst, points[count-1].x, points[count-1].y, color);\n    }\n    return 0;\n}\n\n#endif /* !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_drawline.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n\nextern int SDL_DrawLine(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color);\nextern int SDL_DrawLines(SDL_Surface * dst, const SDL_Point * points, int count, Uint32 color);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_drawpoint.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if !SDL_RENDER_DISABLED\n\n#include \"SDL_draw.h\"\n#include \"SDL_drawpoint.h\"\n\n\nint\nSDL_DrawPoint(SDL_Surface * dst, int x, int y, Uint32 color)\n{\n    if (!dst) {\n        return SDL_SetError(\"Passed NULL destination surface\");\n    }\n\n    /* This function doesn't work on surfaces < 8 bpp */\n    if (dst->format->BitsPerPixel < 8) {\n        return SDL_SetError(\"SDL_DrawPoint(): Unsupported surface format\");\n    }\n\n    /* Perform clipping */\n    if (x < dst->clip_rect.x || y < dst->clip_rect.y ||\n        x >= (dst->clip_rect.x + dst->clip_rect.w) ||\n        y >= (dst->clip_rect.y + dst->clip_rect.h)) {\n        return 0;\n    }\n\n    switch (dst->format->BytesPerPixel) {\n    case 1:\n        DRAW_FASTSETPIXELXY1(x, y);\n        break;\n    case 2:\n        DRAW_FASTSETPIXELXY2(x, y);\n        break;\n    case 3:\n        return SDL_Unsupported();\n    case 4:\n        DRAW_FASTSETPIXELXY4(x, y);\n        break;\n    }\n    return 0;\n}\n\nint\nSDL_DrawPoints(SDL_Surface * dst, const SDL_Point * points, int count,\n               Uint32 color)\n{\n    int minx, miny;\n    int maxx, maxy;\n    int i;\n    int x, y;\n\n    if (!dst) {\n        return SDL_SetError(\"Passed NULL destination surface\");\n    }\n\n    /* This function doesn't work on surfaces < 8 bpp */\n    if (dst->format->BitsPerPixel < 8) {\n        return SDL_SetError(\"SDL_DrawPoints(): Unsupported surface format\");\n    }\n\n    minx = dst->clip_rect.x;\n    maxx = dst->clip_rect.x + dst->clip_rect.w - 1;\n    miny = dst->clip_rect.y;\n    maxy = dst->clip_rect.y + dst->clip_rect.h - 1;\n\n    for (i = 0; i < count; ++i) {\n        x = points[i].x;\n        y = points[i].y;\n\n        if (x < minx || x > maxx || y < miny || y > maxy) {\n            continue;\n        }\n\n        switch (dst->format->BytesPerPixel) {\n        case 1:\n            DRAW_FASTSETPIXELXY1(x, y);\n            break;\n        case 2:\n            DRAW_FASTSETPIXELXY2(x, y);\n            break;\n        case 3:\n            return SDL_Unsupported();\n        case 4:\n            DRAW_FASTSETPIXELXY4(x, y);\n            break;\n        }\n    }\n    return 0;\n}\n\n#endif /* !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_drawpoint.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n\nextern int SDL_DrawPoint(SDL_Surface * dst, int x, int y, Uint32 color);\nextern int SDL_DrawPoints(SDL_Surface * dst, const SDL_Point * points, int count, Uint32 color);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_render_sw.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if !SDL_RENDER_DISABLED\n\n#include \"../SDL_sysrender.h\"\n#include \"SDL_render_sw_c.h\"\n#include \"SDL_hints.h\"\n\n#include \"SDL_draw.h\"\n#include \"SDL_blendfillrect.h\"\n#include \"SDL_blendline.h\"\n#include \"SDL_blendpoint.h\"\n#include \"SDL_drawline.h\"\n#include \"SDL_drawpoint.h\"\n#include \"SDL_rotate.h\"\n\n/* SDL surface based renderer implementation */\n\nstatic SDL_Renderer *SW_CreateRenderer(SDL_Window * window, Uint32 flags);\nstatic void SW_WindowEvent(SDL_Renderer * renderer,\n                           const SDL_WindowEvent *event);\nstatic int SW_GetOutputSize(SDL_Renderer * renderer, int *w, int *h);\nstatic int SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic int SW_SetTextureColorMod(SDL_Renderer * renderer,\n                                 SDL_Texture * texture);\nstatic int SW_SetTextureAlphaMod(SDL_Renderer * renderer,\n                                 SDL_Texture * texture);\nstatic int SW_SetTextureBlendMode(SDL_Renderer * renderer,\n                                  SDL_Texture * texture);\nstatic int SW_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                            const SDL_Rect * rect, const void *pixels,\n                            int pitch);\nstatic int SW_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                          const SDL_Rect * rect, void **pixels, int *pitch);\nstatic void SW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic int SW_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic int SW_UpdateViewport(SDL_Renderer * renderer);\nstatic int SW_UpdateClipRect(SDL_Renderer * renderer);\nstatic int SW_RenderClear(SDL_Renderer * renderer);\nstatic int SW_RenderDrawPoints(SDL_Renderer * renderer,\n                               const SDL_FPoint * points, int count);\nstatic int SW_RenderDrawLines(SDL_Renderer * renderer,\n                              const SDL_FPoint * points, int count);\nstatic int SW_RenderFillRects(SDL_Renderer * renderer,\n                              const SDL_FRect * rects, int count);\nstatic int SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,\n                         const SDL_Rect * srcrect, const SDL_FRect * dstrect);\nstatic int SW_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n                          const SDL_Rect * srcrect, const SDL_FRect * dstrect,\n                          const double angle, const SDL_FPoint * center, const SDL_RendererFlip flip);\nstatic int SW_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                               Uint32 format, void * pixels, int pitch);\nstatic void SW_RenderPresent(SDL_Renderer * renderer);\nstatic void SW_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture);\nstatic void SW_DestroyRenderer(SDL_Renderer * renderer);\n\n\nSDL_RenderDriver SW_RenderDriver = {\n    SW_CreateRenderer,\n    {\n     \"software\",\n     SDL_RENDERER_SOFTWARE | SDL_RENDERER_TARGETTEXTURE,\n     8,\n     {\n      SDL_PIXELFORMAT_ARGB8888,\n      SDL_PIXELFORMAT_ABGR8888,\n      SDL_PIXELFORMAT_RGBA8888,\n      SDL_PIXELFORMAT_BGRA8888,\n      SDL_PIXELFORMAT_RGB888,\n      SDL_PIXELFORMAT_BGR888,\n      SDL_PIXELFORMAT_RGB565,\n      SDL_PIXELFORMAT_RGB555\n     },\n     0,\n     0}\n};\n\ntypedef struct\n{\n    SDL_Surface *surface;\n    SDL_Surface *window;\n} SW_RenderData;\n\n\nstatic SDL_Surface *\nSW_ActivateRenderer(SDL_Renderer * renderer)\n{\n    SW_RenderData *data = (SW_RenderData *) renderer->driverdata;\n\n    if (!data->surface) {\n        data->surface = data->window;\n    }\n    if (!data->surface) {\n        SDL_Surface *surface = SDL_GetWindowSurface(renderer->window);\n        if (surface) {\n            data->surface = data->window = surface;\n\n            SW_UpdateViewport(renderer);\n            SW_UpdateClipRect(renderer);\n        }\n    }\n    return data->surface;\n}\n\nSDL_Renderer *\nSW_CreateRendererForSurface(SDL_Surface * surface)\n{\n    SDL_Renderer *renderer;\n    SW_RenderData *data;\n\n    if (!surface) {\n        SDL_SetError(\"Can't create renderer for NULL surface\");\n        return NULL;\n    }\n\n    renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));\n    if (!renderer) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    data = (SW_RenderData *) SDL_calloc(1, sizeof(*data));\n    if (!data) {\n        SW_DestroyRenderer(renderer);\n        SDL_OutOfMemory();\n        return NULL;\n    }\n    data->surface = surface;\n    data->window = surface;\n\n    renderer->WindowEvent = SW_WindowEvent;\n    renderer->GetOutputSize = SW_GetOutputSize;\n    renderer->CreateTexture = SW_CreateTexture;\n    renderer->SetTextureColorMod = SW_SetTextureColorMod;\n    renderer->SetTextureAlphaMod = SW_SetTextureAlphaMod;\n    renderer->SetTextureBlendMode = SW_SetTextureBlendMode;\n    renderer->UpdateTexture = SW_UpdateTexture;\n    renderer->LockTexture = SW_LockTexture;\n    renderer->UnlockTexture = SW_UnlockTexture;\n    renderer->SetRenderTarget = SW_SetRenderTarget;\n    renderer->UpdateViewport = SW_UpdateViewport;\n    renderer->UpdateClipRect = SW_UpdateClipRect;\n    renderer->RenderClear = SW_RenderClear;\n    renderer->RenderDrawPoints = SW_RenderDrawPoints;\n    renderer->RenderDrawLines = SW_RenderDrawLines;\n    renderer->RenderFillRects = SW_RenderFillRects;\n    renderer->RenderCopy = SW_RenderCopy;\n    renderer->RenderCopyEx = SW_RenderCopyEx;\n    renderer->RenderReadPixels = SW_RenderReadPixels;\n    renderer->RenderPresent = SW_RenderPresent;\n    renderer->DestroyTexture = SW_DestroyTexture;\n    renderer->DestroyRenderer = SW_DestroyRenderer;\n    renderer->info = SW_RenderDriver.info;\n    renderer->driverdata = data;\n\n    SW_ActivateRenderer(renderer);\n\n    return renderer;\n}\n\nSDL_Renderer *\nSW_CreateRenderer(SDL_Window * window, Uint32 flags)\n{\n    SDL_Surface *surface;\n\n    surface = SDL_GetWindowSurface(window);\n    if (!surface) {\n        return NULL;\n    }\n    return SW_CreateRendererForSurface(surface);\n}\n\nstatic void\nSW_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)\n{\n    SW_RenderData *data = (SW_RenderData *) renderer->driverdata;\n\n    if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {\n        data->surface = NULL;\n        data->window = NULL;\n    }\n}\n\nstatic int\nSW_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)\n{\n    SDL_Surface *surface = SW_ActivateRenderer(renderer);\n\n    if (surface) {\n        if (w) {\n            *w = surface->w;\n        }\n        if (h) {\n            *h = surface->h;\n        }\n        return 0;\n    } else {\n        SDL_SetError(\"Software renderer doesn't have an output surface\");\n        return -1;\n    }\n}\n\nstatic int\nSW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    int bpp;\n    Uint32 Rmask, Gmask, Bmask, Amask;\n\n    if (!SDL_PixelFormatEnumToMasks\n        (texture->format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {\n        return SDL_SetError(\"Unknown texture format\");\n    }\n\n    texture->driverdata =\n        SDL_CreateRGBSurface(0, texture->w, texture->h, bpp, Rmask, Gmask,\n                             Bmask, Amask);\n    SDL_SetSurfaceColorMod(texture->driverdata, texture->r, texture->g,\n                           texture->b);\n    SDL_SetSurfaceAlphaMod(texture->driverdata, texture->a);\n    SDL_SetSurfaceBlendMode(texture->driverdata, texture->blendMode);\n\n    if (texture->access == SDL_TEXTUREACCESS_STATIC) {\n        SDL_SetSurfaceRLE(texture->driverdata, 1);\n    }\n\n    if (!texture->driverdata) {\n        return -1;\n    }\n    return 0;\n}\n\nstatic int\nSW_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    SDL_Surface *surface = (SDL_Surface *) texture->driverdata;\n    /* If the color mod is ever enabled (non-white), permanently disable RLE (which doesn't support\n     * color mod) to avoid potentially frequent RLE encoding/decoding.\n     */\n    if ((texture->r & texture->g & texture->b) != 255) {\n        SDL_SetSurfaceRLE(surface, 0);\n    }\n    return SDL_SetSurfaceColorMod(surface, texture->r, texture->g,\n                                  texture->b);\n}\n\nstatic int\nSW_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    SDL_Surface *surface = (SDL_Surface *) texture->driverdata;\n    /* If the texture ever has multiple alpha values (surface alpha plus alpha channel), permanently\n     * disable RLE (which doesn't support this) to avoid potentially frequent RLE encoding/decoding.\n     */\n    if (texture->a != 255 && surface->format->Amask) {\n        SDL_SetSurfaceRLE(surface, 0);\n    }\n    return SDL_SetSurfaceAlphaMod(surface, texture->a);\n}\n\nstatic int\nSW_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    SDL_Surface *surface = (SDL_Surface *) texture->driverdata;\n    /* If add or mod blending are ever enabled, permanently disable RLE (which doesn't support\n     * them) to avoid potentially frequent RLE encoding/decoding.\n     */\n    if ((texture->blendMode == SDL_BLENDMODE_ADD || texture->blendMode == SDL_BLENDMODE_MOD)) {\n        SDL_SetSurfaceRLE(surface, 0);\n    }\n    return SDL_SetSurfaceBlendMode(surface, texture->blendMode);\n}\n\nstatic int\nSW_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n                 const SDL_Rect * rect, const void *pixels, int pitch)\n{\n    SDL_Surface *surface = (SDL_Surface *) texture->driverdata;\n    Uint8 *src, *dst;\n    int row;\n    size_t length;\n\n    if(SDL_MUSTLOCK(surface))\n        SDL_LockSurface(surface);\n    src = (Uint8 *) pixels;\n    dst = (Uint8 *) surface->pixels +\n                        rect->y * surface->pitch +\n                        rect->x * surface->format->BytesPerPixel;\n    length = rect->w * surface->format->BytesPerPixel;\n    for (row = 0; row < rect->h; ++row) {\n        SDL_memcpy(dst, src, length);\n        src += pitch;\n        dst += surface->pitch;\n    }\n    if(SDL_MUSTLOCK(surface))\n        SDL_UnlockSurface(surface);\n    return 0;\n}\n\nstatic int\nSW_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,\n               const SDL_Rect * rect, void **pixels, int *pitch)\n{\n    SDL_Surface *surface = (SDL_Surface *) texture->driverdata;\n\n    *pixels =\n        (void *) ((Uint8 *) surface->pixels + rect->y * surface->pitch +\n                  rect->x * surface->format->BytesPerPixel);\n    *pitch = surface->pitch;\n    return 0;\n}\n\nstatic void\nSW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n}\n\nstatic int\nSW_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    SW_RenderData *data = (SW_RenderData *) renderer->driverdata;\n\n    if (texture ) {\n        data->surface = (SDL_Surface *) texture->driverdata;\n    } else {\n        data->surface = data->window;\n    }\n    return 0;\n}\n\nstatic int\nSW_UpdateViewport(SDL_Renderer * renderer)\n{\n    SW_RenderData *data = (SW_RenderData *) renderer->driverdata;\n    SDL_Surface *surface = data->surface;\n\n    if (!surface) {\n        /* We'll update the viewport after we recreate the surface */\n        return 0;\n    }\n\n    SDL_SetClipRect(data->surface, &renderer->viewport);\n    return 0;\n}\n\nstatic int\nSW_UpdateClipRect(SDL_Renderer * renderer)\n{\n    SW_RenderData *data = (SW_RenderData *) renderer->driverdata;\n    SDL_Surface *surface = data->surface;\n    if (surface) {\n        if (renderer->clipping_enabled) {\n            SDL_SetClipRect(surface, &renderer->clip_rect);\n        } else {\n            SDL_SetClipRect(surface, NULL);\n        }\n    }\n    return 0;\n}\n\nstatic int\nSW_RenderClear(SDL_Renderer * renderer)\n{\n    SDL_Surface *surface = SW_ActivateRenderer(renderer);\n    Uint32 color;\n    SDL_Rect clip_rect;\n\n    if (!surface) {\n        return -1;\n    }\n\n    color = SDL_MapRGBA(surface->format,\n                        renderer->r, renderer->g, renderer->b, renderer->a);\n\n    /* By definition the clear ignores the clip rect */\n    clip_rect = surface->clip_rect;\n    SDL_SetClipRect(surface, NULL);\n    SDL_FillRect(surface, NULL, color);\n    SDL_SetClipRect(surface, &clip_rect);\n    return 0;\n}\n\nstatic int\nSW_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points,\n                    int count)\n{\n    SDL_Surface *surface = SW_ActivateRenderer(renderer);\n    SDL_Point *final_points;\n    int i, status;\n\n    if (!surface) {\n        return -1;\n    }\n\n    final_points = SDL_stack_alloc(SDL_Point, count);\n    if (!final_points) {\n        return SDL_OutOfMemory();\n    }\n    if (renderer->viewport.x || renderer->viewport.y) {\n        int x = renderer->viewport.x;\n        int y = renderer->viewport.y;\n\n        for (i = 0; i < count; ++i) {\n            final_points[i].x = (int)(x + points[i].x);\n            final_points[i].y = (int)(y + points[i].y);\n        }\n    } else {\n        for (i = 0; i < count; ++i) {\n            final_points[i].x = (int)points[i].x;\n            final_points[i].y = (int)points[i].y;\n        }\n    }\n\n    /* Draw the points! */\n    if (renderer->blendMode == SDL_BLENDMODE_NONE) {\n        Uint32 color = SDL_MapRGBA(surface->format,\n                                   renderer->r, renderer->g, renderer->b,\n                                   renderer->a);\n\n        status = SDL_DrawPoints(surface, final_points, count, color);\n    } else {\n        status = SDL_BlendPoints(surface, final_points, count,\n                                renderer->blendMode,\n                                renderer->r, renderer->g, renderer->b,\n                                renderer->a);\n    }\n    SDL_stack_free(final_points);\n\n    return status;\n}\n\nstatic int\nSW_RenderDrawLines(SDL_Renderer * renderer, const SDL_FPoint * points,\n                   int count)\n{\n    SDL_Surface *surface = SW_ActivateRenderer(renderer);\n    SDL_Point *final_points;\n    int i, status;\n\n    if (!surface) {\n        return -1;\n    }\n\n    final_points = SDL_stack_alloc(SDL_Point, count);\n    if (!final_points) {\n        return SDL_OutOfMemory();\n    }\n    if (renderer->viewport.x || renderer->viewport.y) {\n        int x = renderer->viewport.x;\n        int y = renderer->viewport.y;\n\n        for (i = 0; i < count; ++i) {\n            final_points[i].x = (int)(x + points[i].x);\n            final_points[i].y = (int)(y + points[i].y);\n        }\n    } else {\n        for (i = 0; i < count; ++i) {\n            final_points[i].x = (int)points[i].x;\n            final_points[i].y = (int)points[i].y;\n        }\n    }\n\n    /* Draw the lines! */\n    if (renderer->blendMode == SDL_BLENDMODE_NONE) {\n        Uint32 color = SDL_MapRGBA(surface->format,\n                                   renderer->r, renderer->g, renderer->b,\n                                   renderer->a);\n\n        status = SDL_DrawLines(surface, final_points, count, color);\n    } else {\n        status = SDL_BlendLines(surface, final_points, count,\n                                renderer->blendMode,\n                                renderer->r, renderer->g, renderer->b,\n                                renderer->a);\n    }\n    SDL_stack_free(final_points);\n\n    return status;\n}\n\nstatic int\nSW_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects, int count)\n{\n    SDL_Surface *surface = SW_ActivateRenderer(renderer);\n    SDL_Rect *final_rects;\n    int i, status;\n\n    if (!surface) {\n        return -1;\n    }\n\n    final_rects = SDL_stack_alloc(SDL_Rect, count);\n    if (!final_rects) {\n        return SDL_OutOfMemory();\n    }\n    if (renderer->viewport.x || renderer->viewport.y) {\n        int x = renderer->viewport.x;\n        int y = renderer->viewport.y;\n\n        for (i = 0; i < count; ++i) {\n            final_rects[i].x = (int)(x + rects[i].x);\n            final_rects[i].y = (int)(y + rects[i].y);\n            final_rects[i].w = SDL_max((int)rects[i].w, 1);\n            final_rects[i].h = SDL_max((int)rects[i].h, 1);\n        }\n    } else {\n        for (i = 0; i < count; ++i) {\n            final_rects[i].x = (int)rects[i].x;\n            final_rects[i].y = (int)rects[i].y;\n            final_rects[i].w = SDL_max((int)rects[i].w, 1);\n            final_rects[i].h = SDL_max((int)rects[i].h, 1);\n        }\n    }\n\n    if (renderer->blendMode == SDL_BLENDMODE_NONE) {\n        Uint32 color = SDL_MapRGBA(surface->format,\n                                   renderer->r, renderer->g, renderer->b,\n                                   renderer->a);\n        status = SDL_FillRects(surface, final_rects, count, color);\n    } else {\n        status = SDL_BlendFillRects(surface, final_rects, count,\n                                    renderer->blendMode,\n                                    renderer->r, renderer->g, renderer->b,\n                                    renderer->a);\n    }\n    SDL_stack_free(final_rects);\n\n    return status;\n}\n\nstatic int\nSW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,\n              const SDL_Rect * srcrect, const SDL_FRect * dstrect)\n{\n    SDL_Surface *surface = SW_ActivateRenderer(renderer);\n    SDL_Surface *src = (SDL_Surface *) texture->driverdata;\n    SDL_Rect final_rect;\n\n    if (!surface) {\n        return -1;\n    }\n\n    if (renderer->viewport.x || renderer->viewport.y) {\n        final_rect.x = (int)(renderer->viewport.x + dstrect->x);\n        final_rect.y = (int)(renderer->viewport.y + dstrect->y);\n    } else {\n        final_rect.x = (int)dstrect->x;\n        final_rect.y = (int)dstrect->y;\n    }\n    final_rect.w = (int)dstrect->w;\n    final_rect.h = (int)dstrect->h;\n\n    if ( srcrect->w == final_rect.w && srcrect->h == final_rect.h ) {\n        return SDL_BlitSurface(src, srcrect, surface, &final_rect);\n    } else {\n        /* If scaling is ever done, permanently disable RLE (which doesn't support scaling)\n         * to avoid potentially frequent RLE encoding/decoding.\n         */\n        SDL_SetSurfaceRLE(surface, 0);\n        return SDL_BlitScaled(src, srcrect, surface, &final_rect);\n    }\n}\n\nstatic int\nGetScaleQuality(void)\n{\n    const char *hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY);\n\n    if (!hint || *hint == '0' || SDL_strcasecmp(hint, \"nearest\") == 0) {\n        return 0;\n    } else {\n        return 1;\n    }\n}\n\nstatic int\nSW_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,\n                const SDL_Rect * srcrect, const SDL_FRect * dstrect,\n                const double angle, const SDL_FPoint * center, const SDL_RendererFlip flip)\n{\n    SDL_Surface *surface = SW_ActivateRenderer(renderer);\n    SDL_Surface *src = (SDL_Surface *) texture->driverdata;\n    SDL_Rect final_rect, tmp_rect;\n    SDL_Surface *surface_rotated, *surface_scaled;\n    int retval, dstwidth, dstheight, abscenterx, abscentery;\n    double cangle, sangle, px, py, p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y;\n\n    if (!surface) {\n        return -1;\n    }\n\n    if (renderer->viewport.x || renderer->viewport.y) {\n        final_rect.x = (int)(renderer->viewport.x + dstrect->x);\n        final_rect.y = (int)(renderer->viewport.y + dstrect->y);\n    } else {\n        final_rect.x = (int)dstrect->x;\n        final_rect.y = (int)dstrect->y;\n    }\n    final_rect.w = (int)dstrect->w;\n    final_rect.h = (int)dstrect->h;\n\n    /* SDLgfx_rotateSurface doesn't accept a source rectangle, so crop and scale if we need to */\n    tmp_rect = final_rect;\n    tmp_rect.x = 0;\n    tmp_rect.y = 0;\n    if (srcrect->w == final_rect.w && srcrect->h == final_rect.h && srcrect->x == 0 && srcrect->y == 0) {\n        surface_scaled = src; /* but if we don't need to, just use the original */\n        retval = 0;\n    } else {\n        SDL_Surface *blit_src = src;\n        Uint32 colorkey;\n        SDL_BlendMode blendMode;\n        Uint8 alphaMod, r, g, b;\n        SDL_bool cloneSource = SDL_FALSE;\n\n        surface_scaled = SDL_CreateRGBSurface(SDL_SWSURFACE, final_rect.w, final_rect.h, src->format->BitsPerPixel,\n                                              src->format->Rmask, src->format->Gmask,\n                                              src->format->Bmask, src->format->Amask );\n        if (!surface_scaled) {\n            return -1;\n        }\n\n        /* copy the color key, alpha mod, blend mode, and color mod so the scaled surface behaves like the source */\n        if (SDL_GetColorKey(src, &colorkey) == 0) {\n            SDL_SetColorKey(surface_scaled, SDL_TRUE, colorkey);\n            cloneSource = SDL_TRUE;\n        }\n        SDL_GetSurfaceAlphaMod(src, &alphaMod); /* these will be copied to surface_scaled below if necessary */\n        SDL_GetSurfaceBlendMode(src, &blendMode);\n        SDL_GetSurfaceColorMod(src, &r, &g, &b);\n\n        /* now we need to blit the src into surface_scaled. since we want to copy the colors from the source to\n         * surface_scaled rather than blend them, etc. we'll need to disable the blend mode, alpha mod, etc.\n         * but we don't want to modify src (in case it's being used on other threads), so we'll need to clone it\n         * before changing the blend options\n         */\n        cloneSource |= blendMode != SDL_BLENDMODE_NONE || (alphaMod & r & g & b) != 255;\n        if (cloneSource) {\n            blit_src = SDL_ConvertSurface(src, src->format, src->flags); /* clone src */\n            if (!blit_src) {\n                SDL_FreeSurface(surface_scaled);\n                return -1;\n            }\n            SDL_SetSurfaceAlphaMod(blit_src, 255); /* disable all blending options in blit_src */\n            SDL_SetSurfaceBlendMode(blit_src, SDL_BLENDMODE_NONE);\n            SDL_SetColorKey(blit_src, 0, 0);\n            SDL_SetSurfaceColorMod(blit_src, 255, 255, 255);\n            SDL_SetSurfaceRLE(blit_src, 0); /* don't RLE encode a surface we'll only use once */\n\n            SDL_SetSurfaceAlphaMod(surface_scaled, alphaMod); /* copy blending options to surface_scaled */\n            SDL_SetSurfaceBlendMode(surface_scaled, blendMode);\n            SDL_SetSurfaceColorMod(surface_scaled, r, g, b);\n        }\n\n        retval = SDL_BlitScaled(blit_src, srcrect, surface_scaled, &tmp_rect);\n        if (blit_src != src) {\n            SDL_FreeSurface(blit_src);\n        }\n    }\n\n    if (!retval) {\n        SDLgfx_rotozoomSurfaceSizeTrig(tmp_rect.w, tmp_rect.h, angle, &dstwidth, &dstheight, &cangle, &sangle);\n        surface_rotated = SDLgfx_rotateSurface(surface_scaled, angle, dstwidth/2, dstheight/2, GetScaleQuality(), flip & SDL_FLIP_HORIZONTAL, flip & SDL_FLIP_VERTICAL, dstwidth, dstheight, cangle, sangle);\n        if(surface_rotated) {\n            /* Find out where the new origin is by rotating the four final_rect points around the center and then taking the extremes */\n            abscenterx = final_rect.x + (int)center->x;\n            abscentery = final_rect.y + (int)center->y;\n            /* Compensate the angle inversion to match the behaviour of the other backends */\n            sangle = -sangle;\n\n            /* Top Left */\n            px = final_rect.x - abscenterx;\n            py = final_rect.y - abscentery;\n            p1x = px * cangle - py * sangle + abscenterx;\n            p1y = px * sangle + py * cangle + abscentery;\n\n            /* Top Right */\n            px = final_rect.x + final_rect.w - abscenterx;\n            py = final_rect.y - abscentery;\n            p2x = px * cangle - py * sangle + abscenterx;\n            p2y = px * sangle + py * cangle + abscentery;\n\n            /* Bottom Left */\n            px = final_rect.x - abscenterx;\n            py = final_rect.y + final_rect.h - abscentery;\n            p3x = px * cangle - py * sangle + abscenterx;\n            p3y = px * sangle + py * cangle + abscentery;\n\n            /* Bottom Right */\n            px = final_rect.x + final_rect.w - abscenterx;\n            py = final_rect.y + final_rect.h - abscentery;\n            p4x = px * cangle - py * sangle + abscenterx;\n            p4y = px * sangle + py * cangle + abscentery;\n\n            tmp_rect.x = (int)MIN(MIN(p1x, p2x), MIN(p3x, p4x));\n            tmp_rect.y = (int)MIN(MIN(p1y, p2y), MIN(p3y, p4y));\n            tmp_rect.w = dstwidth;\n            tmp_rect.h = dstheight;\n\n            retval = SDL_BlitSurface(surface_rotated, NULL, surface, &tmp_rect);\n            SDL_FreeSurface(surface_rotated);\n        }\n    }\n\n    if (surface_scaled != src) {\n        SDL_FreeSurface(surface_scaled);\n    }\n    return retval;\n}\n\nstatic int\nSW_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,\n                    Uint32 format, void * pixels, int pitch)\n{\n    SDL_Surface *surface = SW_ActivateRenderer(renderer);\n    Uint32 src_format;\n    void *src_pixels;\n    SDL_Rect final_rect;\n\n    if (!surface) {\n        return -1;\n    }\n\n    if (renderer->viewport.x || renderer->viewport.y) {\n        final_rect.x = renderer->viewport.x + rect->x;\n        final_rect.y = renderer->viewport.y + rect->y;\n        final_rect.w = rect->w;\n        final_rect.h = rect->h;\n        rect = &final_rect;\n    }\n\n    if (rect->x < 0 || rect->x+rect->w > surface->w ||\n        rect->y < 0 || rect->y+rect->h > surface->h) {\n        return SDL_SetError(\"Tried to read outside of surface bounds\");\n    }\n\n    src_format = surface->format->format;\n    src_pixels = (void*)((Uint8 *) surface->pixels +\n                    rect->y * surface->pitch +\n                    rect->x * surface->format->BytesPerPixel);\n\n    return SDL_ConvertPixels(rect->w, rect->h,\n                             src_format, src_pixels, surface->pitch,\n                             format, pixels, pitch);\n}\n\nstatic void\nSW_RenderPresent(SDL_Renderer * renderer)\n{\n    SDL_Window *window = renderer->window;\n\n    if (window) {\n        SDL_UpdateWindowSurface(window);\n    }\n}\n\nstatic void\nSW_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)\n{\n    SDL_Surface *surface = (SDL_Surface *) texture->driverdata;\n\n    SDL_FreeSurface(surface);\n}\n\nstatic void\nSW_DestroyRenderer(SDL_Renderer * renderer)\n{\n    SW_RenderData *data = (SW_RenderData *) renderer->driverdata;\n\n    SDL_free(data);\n    SDL_free(renderer);\n}\n\n#endif /* !SDL_RENDER_DISABLED */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_render_sw_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\nextern SDL_Renderer * SW_CreateRendererForSurface(SDL_Surface * surface);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_rotate.c",
    "content": "/*\n\nSDL_rotate.c: rotates 32bit or 8bit surfaces\n\nShamelessly stolen from SDL_gfx by Andreas Schiffler. Original copyright follows:\n\nCopyright (C) 2001-2011  Andreas Schiffler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n   1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n   2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n   3. This notice may not be removed or altered from any source\n   distribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n#include \"../../SDL_internal.h\"\n\n#if defined(__WIN32__)\n#include \"../../core/windows/SDL_windows.h\"\n#endif\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL.h\"\n#include \"SDL_rotate.h\"\n\n/* ---- Internally used structures */\n\n/* !\n\\brief A 32 bit RGBA pixel.\n*/\ntypedef struct tColorRGBA {\n    Uint8 r;\n    Uint8 g;\n    Uint8 b;\n    Uint8 a;\n} tColorRGBA;\n\n/* !\n\\brief A 8bit Y/palette pixel.\n*/\ntypedef struct tColorY {\n    Uint8 y;\n} tColorY;\n\n/* !\n\\brief Returns maximum of two numbers a and b.\n*/\n#define MAX(a,b)    (((a) > (b)) ? (a) : (b))\n\n/* !\n\\brief Number of guard rows added to destination surfaces.\n\nThis is a simple but effective workaround for observed issues.\nThese rows allocate extra memory and are then hidden from the surface.\nRows are added to the end of destination surfaces when they are allocated.\nThis catches any potential overflows which seem to happen with\njust the right src image dimensions and scale/rotation and can lead\nto a situation where the program can segfault.\n*/\n#define GUARD_ROWS (2)\n\n/* !\n\\brief Lower limit of absolute zoom factor or rotation degrees.\n*/\n#define VALUE_LIMIT 0.001\n\n/* !\n\\brief Returns colorkey info for a surface\n*/\nstatic Uint32\n_colorkey(SDL_Surface *src)\n{\n    Uint32 key = 0;\n    SDL_GetColorKey(src, &key);\n    return key;\n}\n\n\n/* !\n\\brief Internal target surface sizing function for rotations with trig result return.\n\n\\param width The source surface width.\n\\param height The source surface height.\n\\param angle The angle to rotate in degrees.\n\\param dstwidth The calculated width of the destination surface.\n\\param dstheight The calculated height of the destination surface.\n\\param cangle The sine of the angle\n\\param sangle The cosine of the angle\n\n*/\nvoid\nSDLgfx_rotozoomSurfaceSizeTrig(int width, int height, double angle,\n                               int *dstwidth, int *dstheight,\n                               double *cangle, double *sangle)\n{\n    /* The trig code below gets the wrong size (due to FP inaccuracy?) when angle is a multiple of 90 degrees */\n    int angle90 = (int)(angle/90);\n    if(angle90 == angle/90) { /* if the angle is a multiple of 90 degrees */\n        angle90 %= 4;\n        if(angle90 < 0) angle90 += 4; /* 0:0 deg, 1:90 deg, 2:180 deg, 3:270 deg */\n        if(angle90 & 1) {\n            *dstwidth  = height;\n            *dstheight = width;\n            *cangle = 0;\n            *sangle = angle90 == 1 ? -1 : 1; /* reversed because our rotations are clockwise */\n        } else {\n            *dstwidth  = width;\n            *dstheight = height;\n            *cangle = angle90 == 0 ? 1 : -1;\n            *sangle = 0;\n        }\n    } else {\n        double x, y, cx, cy, sx, sy;\n        double radangle;\n        int dstwidthhalf, dstheighthalf;\n        /*\n        * Determine destination width and height by rotating a centered source box\n        */\n        radangle = angle * (M_PI / -180.0); /* reverse the angle because our rotations are clockwise */\n        *sangle = SDL_sin(radangle);\n        *cangle = SDL_cos(radangle);\n        x = (double)(width / 2);\n        y = (double)(height / 2);\n        cx = *cangle * x;\n        cy = *cangle * y;\n        sx = *sangle * x;\n        sy = *sangle * y;\n        \n        dstwidthhalf = MAX((int)\n            SDL_ceil(MAX(MAX(MAX(SDL_fabs(cx + sy), SDL_fabs(cx - sy)), SDL_fabs(-cx + sy)), SDL_fabs(-cx - sy))), 1);\n        dstheighthalf = MAX((int)\n            SDL_ceil(MAX(MAX(MAX(SDL_fabs(sx + cy), SDL_fabs(sx - cy)), SDL_fabs(-sx + cy)), SDL_fabs(-sx - cy))), 1);\n        *dstwidth = 2 * dstwidthhalf;\n        *dstheight = 2 * dstheighthalf;\n    }\n}\n\n/* Computes source pointer X/Y increments for a rotation that's a multiple of 90 degrees. */\nstatic void\ncomputeSourceIncrements90(SDL_Surface * src, int bpp, int angle, int flipx, int flipy,\n                          int *sincx, int *sincy, int *signx, int *signy)\n{\n    int pitch = flipy ? -src->pitch : src->pitch;\n    if (flipx) {\n        bpp = -bpp;\n    }\n    switch (angle) { /* 0:0 deg, 1:90 deg, 2:180 deg, 3:270 deg */\n    case 0: *sincx = bpp; *sincy = pitch - src->w * *sincx; *signx = *signy = 1; break;\n    case 1: *sincx = -pitch; *sincy = bpp - *sincx * src->h; *signx = 1; *signy = -1; break;\n    case 2: *sincx = -bpp; *sincy = -src->w * *sincx - pitch; *signx = *signy = -1; break;\n    case 3: default: *sincx = pitch; *sincy = -*sincx * src->h - bpp; *signx = -1; *signy = 1; break;\n    }\n    if (flipx) {\n        *signx = -*signx;\n    }\n    if (flipy) {\n        *signy = -*signy;\n    }\n}\n\n/* Performs a relatively fast rotation/flip when the angle is a multiple of 90 degrees. */\n#define TRANSFORM_SURFACE_90(pixelType) \\\n    int dy, dincy = dst->pitch - dst->w*sizeof(pixelType), sincx, sincy, signx, signy;                      \\\n    Uint8 *sp = (Uint8*)src->pixels, *dp = (Uint8*)dst->pixels, *de;                                        \\\n                                                                                                            \\\n    computeSourceIncrements90(src, sizeof(pixelType), angle, flipx, flipy, &sincx, &sincy, &signx, &signy); \\\n    if (signx < 0) sp += (src->w-1)*sizeof(pixelType);                                                      \\\n    if (signy < 0) sp += (src->h-1)*src->pitch;                                                             \\\n                                                                                                            \\\n    for (dy = 0; dy < dst->h; sp += sincy, dp += dincy, dy++) {                                             \\\n        if (sincx == sizeof(pixelType)) { /* if advancing src and dest equally, use memcpy */               \\\n            SDL_memcpy(dp, sp, dst->w*sizeof(pixelType));                                                   \\\n            sp += dst->w*sizeof(pixelType);                                                                 \\\n            dp += dst->w*sizeof(pixelType);                                                                 \\\n        } else {                                                                                            \\\n            for (de = dp + dst->w*sizeof(pixelType); dp != de; sp += sincx, dp += sizeof(pixelType)) {      \\\n                *(pixelType*)dp = *(pixelType*)sp;                                                          \\\n            }                                                                                               \\\n        }                                                                                                   \\\n    }\n\nstatic void\ntransformSurfaceRGBA90(SDL_Surface * src, SDL_Surface * dst, int angle, int flipx, int flipy)\n{\n    TRANSFORM_SURFACE_90(tColorRGBA);\n}\n\nstatic void\ntransformSurfaceY90(SDL_Surface * src, SDL_Surface * dst, int angle, int flipx, int flipy)\n{\n    TRANSFORM_SURFACE_90(tColorY);\n}\n\n#undef TRANSFORM_SURFACE_90\n\n/* !\n\\brief Internal 32 bit rotozoomer with optional anti-aliasing.\n\nRotates and zooms 32 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control\nparameters by scanning the destination surface and applying optionally anti-aliasing\nby bilinear interpolation.\nAssumes src and dst surfaces are of 32 bit depth.\nAssumes dst surface was allocated with the correct dimensions.\n\n\\param src Source surface.\n\\param dst Destination surface.\n\\param cx Horizontal center coordinate.\n\\param cy Vertical center coordinate.\n\\param isin Integer version of sine of angle.\n\\param icos Integer version of cosine of angle.\n\\param flipx Flag indicating horizontal mirroring should be applied.\n\\param flipy Flag indicating vertical mirroring should be applied.\n\\param smooth Flag indicating anti-aliasing should be used.\n*/\nstatic void\n_transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int flipx, int flipy, int smooth)\n{\n    int x, y, t1, t2, dx, dy, xd, yd, sdx, sdy, ax, ay, ex, ey, sw, sh;\n    tColorRGBA c00, c01, c10, c11, cswap;\n    tColorRGBA *pc, *sp;\n    int gap;\n\n    /*\n    * Variable setup\n    */\n    xd = ((src->w - dst->w) << 15);\n    yd = ((src->h - dst->h) << 15);\n    ax = (cx << 16) - (icos * cx);\n    ay = (cy << 16) - (isin * cx);\n    sw = src->w - 1;\n    sh = src->h - 1;\n    pc = (tColorRGBA*) dst->pixels;\n    gap = dst->pitch - dst->w * 4;\n\n    /*\n    * Switch between interpolating and non-interpolating code\n    */\n    if (smooth) {\n        for (y = 0; y < dst->h; y++) {\n            dy = cy - y;\n            sdx = (ax + (isin * dy)) + xd;\n            sdy = (ay - (icos * dy)) + yd;\n            for (x = 0; x < dst->w; x++) {\n                dx = (sdx >> 16);\n                dy = (sdy >> 16);\n                if (flipx) dx = sw - dx;\n                if (flipy) dy = sh - dy;\n                if ((unsigned)dx < (unsigned)sw && (unsigned)dy < (unsigned)sh) {\n                    sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy) + dx;\n                    c00 = *sp;\n                    sp += 1;\n                    c01 = *sp;\n                    sp += (src->pitch/4);\n                    c11 = *sp;\n                    sp -= 1;\n                    c10 = *sp;\n                    if (flipx) {\n                        cswap = c00; c00=c01; c01=cswap;\n                        cswap = c10; c10=c11; c11=cswap;\n                    }\n                    if (flipy) {\n                        cswap = c00; c00=c10; c10=cswap;\n                        cswap = c01; c01=c11; c11=cswap;\n                    }\n                    /*\n                    * Interpolate colors\n                    */\n                    ex = (sdx & 0xffff);\n                    ey = (sdy & 0xffff);\n                    t1 = ((((c01.r - c00.r) * ex) >> 16) + c00.r) & 0xff;\n                    t2 = ((((c11.r - c10.r) * ex) >> 16) + c10.r) & 0xff;\n                    pc->r = (((t2 - t1) * ey) >> 16) + t1;\n                    t1 = ((((c01.g - c00.g) * ex) >> 16) + c00.g) & 0xff;\n                    t2 = ((((c11.g - c10.g) * ex) >> 16) + c10.g) & 0xff;\n                    pc->g = (((t2 - t1) * ey) >> 16) + t1;\n                    t1 = ((((c01.b - c00.b) * ex) >> 16) + c00.b) & 0xff;\n                    t2 = ((((c11.b - c10.b) * ex) >> 16) + c10.b) & 0xff;\n                    pc->b = (((t2 - t1) * ey) >> 16) + t1;\n                    t1 = ((((c01.a - c00.a) * ex) >> 16) + c00.a) & 0xff;\n                    t2 = ((((c11.a - c10.a) * ex) >> 16) + c10.a) & 0xff;\n                    pc->a = (((t2 - t1) * ey) >> 16) + t1;\n                }\n                sdx += icos;\n                sdy += isin;\n                pc++;\n            }\n            pc = (tColorRGBA *) ((Uint8 *) pc + gap);\n        }\n    } else {\n        for (y = 0; y < dst->h; y++) {\n            dy = cy - y;\n            sdx = (ax + (isin * dy)) + xd;\n            sdy = (ay - (icos * dy)) + yd;\n            for (x = 0; x < dst->w; x++) {\n                dx = (sdx >> 16);\n                dy = (sdy >> 16);\n                if ((unsigned)dx < (unsigned)src->w && (unsigned)dy < (unsigned)src->h) {\n                    if(flipx) dx = sw - dx;\n                    if(flipy) dy = sh - dy;\n                    *pc = *((tColorRGBA *)((Uint8 *)src->pixels + src->pitch * dy) + dx);\n                }\n                sdx += icos;\n                sdy += isin;\n                pc++;\n            }\n            pc = (tColorRGBA *) ((Uint8 *) pc + gap);\n        }\n    }\n}\n\n/* !\n\n\\brief Rotates and zooms 8 bit palette/Y 'src' surface to 'dst' surface without smoothing.\n\nRotates and zooms 8 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control\nparameters by scanning the destination surface.\nAssumes src and dst surfaces are of 8 bit depth.\nAssumes dst surface was allocated with the correct dimensions.\n\n\\param src Source surface.\n\\param dst Destination surface.\n\\param cx Horizontal center coordinate.\n\\param cy Vertical center coordinate.\n\\param isin Integer version of sine of angle.\n\\param icos Integer version of cosine of angle.\n\\param flipx Flag indicating horizontal mirroring should be applied.\n\\param flipy Flag indicating vertical mirroring should be applied.\n*/\nstatic void\ntransformSurfaceY(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int flipx, int flipy)\n{\n    int x, y, dx, dy, xd, yd, sdx, sdy, ax, ay;\n    tColorY *pc;\n    int gap;\n\n    /*\n    * Variable setup\n    */\n    xd = ((src->w - dst->w) << 15);\n    yd = ((src->h - dst->h) << 15);\n    ax = (cx << 16) - (icos * cx);\n    ay = (cy << 16) - (isin * cx);\n    pc = (tColorY*) dst->pixels;\n    gap = dst->pitch - dst->w;\n    /*\n    * Clear surface to colorkey\n    */\n    SDL_memset(pc, (int)(_colorkey(src) & 0xff), dst->pitch * dst->h);\n    /*\n    * Iterate through destination surface\n    */\n    for (y = 0; y < dst->h; y++) {\n        dy = cy - y;\n        sdx = (ax + (isin * dy)) + xd;\n        sdy = (ay - (icos * dy)) + yd;\n        for (x = 0; x < dst->w; x++) {\n            dx = (sdx >> 16);\n            dy = (sdy >> 16);\n            if ((unsigned)dx < (unsigned)src->w && (unsigned)dy < (unsigned)src->h) {\n                if (flipx) dx = (src->w-1)-dx;\n                if (flipy) dy = (src->h-1)-dy;\n                *pc = *((tColorY *)src->pixels + src->pitch * dy + dx);\n            }\n            sdx += icos;\n            sdy += isin;\n            pc++;\n        }\n        pc += gap;\n    }\n}\n\n\n/* !\n\\brief Rotates and zooms a surface with different horizontal and vertival scaling factors and optional anti-aliasing.\n\nRotates a 32bit or 8bit 'src' surface to newly created 'dst' surface.\n'angle' is the rotation in degrees, 'centerx' and 'centery' the rotation center. If 'smooth' is set\nthen the destination 32bit surface is anti-aliased. If the surface is not 8bit\nor 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.\n\n\\param src The surface to rotozoom.\n\\param angle The angle to rotate in degrees.\n\\param centerx The horizontal coordinate of the center of rotation\n\\param zoomy The vertical coordinate of the center of rotation\n\\param smooth Antialiasing flag; set to SMOOTHING_ON to enable.\n\\param flipx Set to 1 to flip the image horizontally\n\\param flipy Set to 1 to flip the image vertically\n\\param dstwidth The destination surface width\n\\param dstheight The destination surface height\n\\param cangle The angle cosine\n\\param sangle The angle sine\n\\return The new rotated surface.\n\n*/\n\nSDL_Surface *\nSDLgfx_rotateSurface(SDL_Surface * src, double angle, int centerx, int centery, int smooth, int flipx, int flipy, int dstwidth, int dstheight, double cangle, double sangle)\n{\n    SDL_Surface *rz_src;\n    SDL_Surface *rz_dst;\n    int is32bit, angle90;\n    int i;\n    Uint8 r = 0, g = 0, b = 0;\n    Uint32 colorkey = 0;\n    int colorKeyAvailable = 0;\n    double sangleinv, cangleinv;\n\n    /*\n    * Sanity check\n    */\n    if (src == NULL)\n        return (NULL);\n\n    if (src->flags & SDL_TRUE/* SDL_SRCCOLORKEY */)\n    {\n        colorkey = _colorkey(src);\n        SDL_GetRGB(colorkey, src->format, &r, &g, &b);\n        colorKeyAvailable = 1;\n    }\n    /*\n    * Determine if source surface is 32bit or 8bit\n    */\n    is32bit = (src->format->BitsPerPixel == 32);\n    if ((is32bit) || (src->format->BitsPerPixel == 8)) {\n        /*\n        * Use source surface 'as is'\n        */\n        rz_src = src;\n    } else {\n        rz_src = SDL_ConvertSurfaceFormat(src, SDL_PIXELFORMAT_ARGB32, src->flags);\n        if (rz_src == NULL) {\n            return NULL;\n        }\n        is32bit = 1;\n    }\n\n    /* Determine target size */\n    /* _rotozoomSurfaceSizeTrig(rz_src->w, rz_src->h, angle, &dstwidth, &dstheight, &cangle, &sangle); */\n\n    /*\n    * Calculate target factors from sin/cos and zoom\n    */\n    sangleinv = sangle*65536.0;\n    cangleinv = cangle*65536.0;\n\n    /*\n    * Alloc space to completely contain the rotated surface\n    */\n    if (is32bit) {\n        /*\n        * Target surface is 32bit with source RGBA/ABGR ordering\n        */\n        rz_dst =\n            SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32,\n            rz_src->format->Rmask, rz_src->format->Gmask,\n            rz_src->format->Bmask, rz_src->format->Amask);\n    } else {\n        /*\n        * Target surface is 8bit\n        */\n        rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0);\n    }\n\n    /* Check target */\n    if (rz_dst == NULL)\n        return NULL;\n\n    /* Adjust for guard rows */\n    rz_dst->h = dstheight;\n\n    if (colorKeyAvailable == 1){\n        colorkey = SDL_MapRGB(rz_dst->format, r, g, b);\n\n        SDL_FillRect(rz_dst, NULL, colorkey );\n    }\n\n    /*\n    * Lock source surface\n    */\n    if (SDL_MUSTLOCK(rz_src)) {\n        SDL_LockSurface(rz_src);\n    }\n\n    /* check if the rotation is a multiple of 90 degrees so we can take a fast path and also somewhat reduce\n     * the off-by-one problem in _transformSurfaceRGBA that expresses itself when the rotation is near\n     * multiples of 90 degrees.\n     */\n    angle90 = (int)(angle/90);\n    if (angle90 == angle/90) {\n        angle90 %= 4;\n        if (angle90 < 0) angle90 += 4; /* 0:0 deg, 1:90 deg, 2:180 deg, 3:270 deg */\n    } else {\n        angle90 = -1;\n    }\n\n    /*\n    * Check which kind of surface we have\n    */\n    if (is32bit) {\n        /*\n        * Call the 32bit transformation routine to do the rotation (using alpha)\n        */\n        if (angle90 >= 0) {\n            transformSurfaceRGBA90(rz_src, rz_dst, angle90, flipx, flipy);\n        } else {\n            _transformSurfaceRGBA(rz_src, rz_dst, centerx, centery, (int) (sangleinv), (int) (cangleinv), flipx, flipy, smooth);\n        }\n        /*\n        * Turn on source-alpha support\n        */\n        /* SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255); */\n        SDL_SetColorKey(rz_dst, /* SDL_SRCCOLORKEY */ SDL_TRUE | SDL_RLEACCEL, _colorkey(rz_src));\n    } else {\n        /*\n        * Copy palette and colorkey info\n        */\n        for (i = 0; i < rz_src->format->palette->ncolors; i++) {\n            rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i];\n        }\n        rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors;\n        /*\n        * Call the 8bit transformation routine to do the rotation\n        */\n        if(angle90 >= 0) {\n            transformSurfaceY90(rz_src, rz_dst, angle90, flipx, flipy);\n        } else {\n            transformSurfaceY(rz_src, rz_dst, centerx, centery, (int)(sangleinv), (int)(cangleinv), flipx, flipy);\n        }\n        SDL_SetColorKey(rz_dst, /* SDL_SRCCOLORKEY */ SDL_TRUE | SDL_RLEACCEL, _colorkey(rz_src));\n    }\n\n    /* copy alpha mod, color mod, and blend mode */\n    {\n      SDL_BlendMode blendMode;\n      Uint8 alphaMod, cr, cg, cb;\n      SDL_GetSurfaceAlphaMod(src, &alphaMod);\n      SDL_GetSurfaceBlendMode(src, &blendMode);\n      SDL_GetSurfaceColorMod(src, &cr, &cg, &cb);\n      SDL_SetSurfaceAlphaMod(rz_dst, alphaMod);\n      SDL_SetSurfaceBlendMode(rz_dst, blendMode);\n      SDL_SetSurfaceColorMod(rz_dst, cr, cg, cb);\n    }\n\n    /*\n    * Unlock source surface\n    */\n    if (SDL_MUSTLOCK(rz_src)) {\n        SDL_UnlockSurface(rz_src);\n    }\n\n    /*\n    * Cleanup temp surface\n    */\n    if (rz_src != src) {\n        SDL_FreeSurface(rz_src);\n    }\n\n    /*\n    * Return destination surface\n    */\n    return (rz_dst);\n}\n"
  },
  {
    "path": "libs/SDL2/src/render/software/SDL_rotate.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef MIN\n#define MIN(a,b)    (((a) < (b)) ? (a) : (b))\n#endif\n\nextern SDL_Surface *SDLgfx_rotateSurface(SDL_Surface * src, double angle, int centerx, int centery, int smooth, int flipx, int flipy, int dstwidth, int dstheight, double cangle, double sangle);\nextern void SDLgfx_rotozoomSurfaceSizeTrig(int width, int height, double angle, int *dstwidth, int *dstheight, double *cangle, double *sangle);\n\n"
  },
  {
    "path": "libs/SDL2/src/stdlib/SDL_getenv.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)\n#define SDL_DISABLE_ANALYZE_MACROS 1\n#endif\n\n#include \"../SDL_internal.h\"\n\n#if defined(__WIN32__)\n#include \"../core/windows/SDL_windows.h\"\n#endif\n\n#include \"SDL_stdinc.h\"\n\n#if defined(__WIN32__) && (!defined(HAVE_SETENV) || !defined(HAVE_GETENV))\n/* Note this isn't thread-safe! */\nstatic char *SDL_envmem = NULL; /* Ugh, memory leak */\nstatic size_t SDL_envmemlen = 0;\n#endif\n\n/* Put a variable into the environment */\n/* Note: Name may not contain a '=' character. (Reference: http://www.unix.com/man-page/Linux/3/setenv/) */\n#if defined(HAVE_SETENV)\nint\nSDL_setenv(const char *name, const char *value, int overwrite)\n{\n    /* Input validation */\n    if (!name || SDL_strlen(name) == 0 || SDL_strchr(name, '=') != NULL || !value) {\n        return (-1);\n    }\n    \n    return setenv(name, value, overwrite);\n}\n#elif defined(__WIN32__)\nint\nSDL_setenv(const char *name, const char *value, int overwrite)\n{\n    /* Input validation */\n    if (!name || SDL_strlen(name) == 0 || SDL_strchr(name, '=') != NULL || !value) {\n        return (-1);\n    }\n    \n    if (!overwrite) {\n        char ch = 0;\n        const size_t len = GetEnvironmentVariableA(name, &ch, sizeof (ch));\n        if (len > 0) {\n            return 0;  /* asked not to overwrite existing value. */\n        }\n    }\n    if (!SetEnvironmentVariableA(name, *value ? value : NULL)) {\n        return -1;\n    }\n    return 0;\n}\n/* We have a real environment table, but no real setenv? Fake it w/ putenv. */\n#elif (defined(HAVE_GETENV) && defined(HAVE_PUTENV) && !defined(HAVE_SETENV))\nint\nSDL_setenv(const char *name, const char *value, int overwrite)\n{\n    size_t len;\n    char *new_variable;\n\n    /* Input validation */\n    if (!name || SDL_strlen(name) == 0 || SDL_strchr(name, '=') != NULL || !value) {\n        return (-1);\n    }\n    \n    if (getenv(name) != NULL) {\n        if (overwrite) {\n            unsetenv(name);\n        } else {\n            return 0;  /* leave the existing one there. */\n        }\n    }\n\n    /* This leaks. Sorry. Get a better OS so we don't have to do this. */\n    len = SDL_strlen(name) + SDL_strlen(value) + 2;\n    new_variable = (char *) SDL_malloc(len);\n    if (!new_variable) {\n        return (-1);\n    }\n\n    SDL_snprintf(new_variable, len, \"%s=%s\", name, value);\n    return putenv(new_variable);\n}\n#else /* roll our own */\nstatic char **SDL_env = (char **) 0;\nint\nSDL_setenv(const char *name, const char *value, int overwrite)\n{\n    int added;\n    int len, i;\n    char **new_env;\n    char *new_variable;\n\n    /* Input validation */\n    if (!name || SDL_strlen(name) == 0 || SDL_strchr(name, '=') != NULL || !value) {\n        return (-1);\n    }\n\n    /* See if it already exists */\n    if (!overwrite && SDL_getenv(name)) {\n        return 0;\n    }\n\n    /* Allocate memory for the variable */\n    len = SDL_strlen(name) + SDL_strlen(value) + 2;\n    new_variable = (char *) SDL_malloc(len);\n    if (!new_variable) {\n        return (-1);\n    }\n\n    SDL_snprintf(new_variable, len, \"%s=%s\", name, value);\n    value = new_variable + SDL_strlen(name) + 1;\n    name = new_variable;\n\n    /* Actually put it into the environment */\n    added = 0;\n    i = 0;\n    if (SDL_env) {\n        /* Check to see if it's already there... */\n        len = (value - name);\n        for (; SDL_env[i]; ++i) {\n            if (SDL_strncmp(SDL_env[i], name, len) == 0) {\n                break;\n            }\n        }\n        /* If we found it, just replace the entry */\n        if (SDL_env[i]) {\n            SDL_free(SDL_env[i]);\n            SDL_env[i] = new_variable;\n            added = 1;\n        }\n    }\n\n    /* Didn't find it in the environment, expand and add */\n    if (!added) {\n        new_env = SDL_realloc(SDL_env, (i + 2) * sizeof(char *));\n        if (new_env) {\n            SDL_env = new_env;\n            SDL_env[i++] = new_variable;\n            SDL_env[i++] = (char *) 0;\n            added = 1;\n        } else {\n            SDL_free(new_variable);\n        }\n    }\n    return (added ? 0 : -1);\n}\n#endif\n\n/* Retrieve a variable named \"name\" from the environment */\n#if defined(HAVE_GETENV)\nchar *\nSDL_getenv(const char *name)\n{\n    /* Input validation */\n    if (!name || SDL_strlen(name)==0) {\n        return NULL;\n    }\n\n    return getenv(name);\n}\n#elif defined(__WIN32__)\nchar *\nSDL_getenv(const char *name)\n{\n    size_t bufferlen;\n\n    /* Input validation */\n    if (!name || SDL_strlen(name)==0) {\n        return NULL;\n    }\n    \n    bufferlen =\n        GetEnvironmentVariableA(name, SDL_envmem, (DWORD) SDL_envmemlen);\n    if (bufferlen == 0) {\n        return NULL;\n    }\n    if (bufferlen > SDL_envmemlen) {\n        char *newmem = (char *) SDL_realloc(SDL_envmem, bufferlen);\n        if (newmem == NULL) {\n            return NULL;\n        }\n        SDL_envmem = newmem;\n        SDL_envmemlen = bufferlen;\n        GetEnvironmentVariableA(name, SDL_envmem, (DWORD) SDL_envmemlen);\n    }\n    return SDL_envmem;\n}\n#else\nchar *\nSDL_getenv(const char *name)\n{\n    int len, i;\n    char *value;\n\n    /* Input validation */\n    if (!name || SDL_strlen(name)==0) {\n        return NULL;\n    }\n    \n    value = (char *) 0;\n    if (SDL_env) {\n        len = SDL_strlen(name);\n        for (i = 0; SDL_env[i] && !value; ++i) {\n            if ((SDL_strncmp(SDL_env[i], name, len) == 0) &&\n                (SDL_env[i][len] == '=')) {\n                value = &SDL_env[i][len + 1];\n            }\n        }\n    }\n    return value;\n}\n#endif\n\n\n#ifdef TEST_MAIN\n#include <stdio.h>\n\nint\nmain(int argc, char *argv[])\n{\n    char *value;\n\n    printf(\"Checking for non-existent variable... \");\n    fflush(stdout);\n    if (!SDL_getenv(\"EXISTS\")) {\n        printf(\"okay\\n\");\n    } else {\n        printf(\"failed\\n\");\n    }\n    printf(\"Setting FIRST=VALUE1 in the environment... \");\n    fflush(stdout);\n    if (SDL_setenv(\"FIRST\", \"VALUE1\", 0) == 0) {\n        printf(\"okay\\n\");\n    } else {\n        printf(\"failed\\n\");\n    }\n    printf(\"Getting FIRST from the environment... \");\n    fflush(stdout);\n    value = SDL_getenv(\"FIRST\");\n    if (value && (SDL_strcmp(value, \"VALUE1\") == 0)) {\n        printf(\"okay\\n\");\n    } else {\n        printf(\"failed\\n\");\n    }\n    printf(\"Setting SECOND=VALUE2 in the environment... \");\n    fflush(stdout);\n    if (SDL_setenv(\"SECOND\", \"VALUE2\", 0) == 0) {\n        printf(\"okay\\n\");\n    } else {\n        printf(\"failed\\n\");\n    }\n    printf(\"Getting SECOND from the environment... \");\n    fflush(stdout);\n    value = SDL_getenv(\"SECOND\");\n    if (value && (SDL_strcmp(value, \"VALUE2\") == 0)) {\n        printf(\"okay\\n\");\n    } else {\n        printf(\"failed\\n\");\n    }\n    printf(\"Setting FIRST=NOVALUE in the environment... \");\n    fflush(stdout);\n    if (SDL_setenv(\"FIRST\", \"NOVALUE\", 1) == 0) {\n        printf(\"okay\\n\");\n    } else {\n        printf(\"failed\\n\");\n    }\n    printf(\"Getting FIRST from the environment... \");\n    fflush(stdout);\n    value = SDL_getenv(\"FIRST\");\n    if (value && (SDL_strcmp(value, \"NOVALUE\") == 0)) {\n        printf(\"okay\\n\");\n    } else {\n        printf(\"failed\\n\");\n    }\n    printf(\"Checking for non-existent variable... \");\n    fflush(stdout);\n    if (!SDL_getenv(\"EXISTS\")) {\n        printf(\"okay\\n\");\n    } else {\n        printf(\"failed\\n\");\n    }\n    return (0);\n}\n#endif /* TEST_MAIN */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/stdlib/SDL_iconv.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)\n#define SDL_DISABLE_ANALYZE_MACROS 1\n#endif\n\n#include \"../SDL_internal.h\"\n\n/* This file contains portable iconv functions for SDL */\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_endian.h\"\n\n#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H)\n#include <iconv.h>\n\n/* Depending on which standard the iconv() was implemented with,\n   iconv() may or may not use const char ** for the inbuf param.\n   If we get this wrong, it's just a warning, so no big deal.\n*/\n#if defined(_XGP6) || defined(__APPLE__) || \\\n    (defined(__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) || \\\n    (defined(_NEWLIB_VERSION)))\n#define ICONV_INBUF_NONCONST\n#endif\n\n#include <errno.h>\n\nSDL_COMPILE_TIME_ASSERT(iconv_t, sizeof (iconv_t) <= sizeof (SDL_iconv_t));\n\nSDL_iconv_t\nSDL_iconv_open(const char *tocode, const char *fromcode)\n{\n    return (SDL_iconv_t) ((size_t) iconv_open(tocode, fromcode));\n}\n\nint\nSDL_iconv_close(SDL_iconv_t cd)\n{\n    return iconv_close((iconv_t) ((size_t) cd));\n}\n\nsize_t\nSDL_iconv(SDL_iconv_t cd,\n          const char **inbuf, size_t * inbytesleft,\n          char **outbuf, size_t * outbytesleft)\n{\n    size_t retCode;\n#ifdef ICONV_INBUF_NONCONST\n    retCode = iconv((iconv_t) ((size_t) cd), (char **) inbuf, inbytesleft, outbuf, outbytesleft);\n#else\n    retCode = iconv((iconv_t) ((size_t) cd), inbuf, inbytesleft, outbuf, outbytesleft);\n#endif\n    if (retCode == (size_t) - 1) {\n        switch (errno) {\n        case E2BIG:\n            return SDL_ICONV_E2BIG;\n        case EILSEQ:\n            return SDL_ICONV_EILSEQ;\n        case EINVAL:\n            return SDL_ICONV_EINVAL;\n        default:\n            return SDL_ICONV_ERROR;\n        }\n    }\n    return retCode;\n}\n\n#else\n\n/* Lots of useful information on Unicode at:\n\thttp://www.cl.cam.ac.uk/~mgk25/unicode.html\n*/\n\n#define UNICODE_BOM\t0xFEFF\n\n#define UNKNOWN_ASCII\t'?'\n#define UNKNOWN_UNICODE\t0xFFFD\n\nenum\n{\n    ENCODING_UNKNOWN,\n    ENCODING_ASCII,\n    ENCODING_LATIN1,\n    ENCODING_UTF8,\n    ENCODING_UTF16,             /* Needs byte order marker */\n    ENCODING_UTF16BE,\n    ENCODING_UTF16LE,\n    ENCODING_UTF32,             /* Needs byte order marker */\n    ENCODING_UTF32BE,\n    ENCODING_UTF32LE,\n    ENCODING_UCS2BE,\n    ENCODING_UCS2LE,\n    ENCODING_UCS4BE,\n    ENCODING_UCS4LE,\n};\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n#define ENCODING_UTF16NATIVE\tENCODING_UTF16BE\n#define ENCODING_UTF32NATIVE\tENCODING_UTF32BE\n#define ENCODING_UCS2NATIVE     ENCODING_UCS2BE\n#define ENCODING_UCS4NATIVE     ENCODING_UCS4BE\n#else\n#define ENCODING_UTF16NATIVE\tENCODING_UTF16LE\n#define ENCODING_UTF32NATIVE\tENCODING_UTF32LE\n#define ENCODING_UCS2NATIVE     ENCODING_UCS2LE\n#define ENCODING_UCS4NATIVE     ENCODING_UCS4LE\n#endif\n\nstruct _SDL_iconv_t\n{\n    int src_fmt;\n    int dst_fmt;\n};\n\nstatic struct\n{\n    const char *name;\n    int format;\n} encodings[] = {\n/* *INDENT-OFF* */\n    { \"ASCII\", ENCODING_ASCII },\n    { \"US-ASCII\", ENCODING_ASCII },\n    { \"8859-1\", ENCODING_LATIN1 },\n    { \"ISO-8859-1\", ENCODING_LATIN1 },\n    { \"UTF8\", ENCODING_UTF8 },\n    { \"UTF-8\", ENCODING_UTF8 },\n    { \"UTF16\", ENCODING_UTF16 },\n    { \"UTF-16\", ENCODING_UTF16 },\n    { \"UTF16BE\", ENCODING_UTF16BE },\n    { \"UTF-16BE\", ENCODING_UTF16BE },\n    { \"UTF16LE\", ENCODING_UTF16LE },\n    { \"UTF-16LE\", ENCODING_UTF16LE },\n    { \"UTF32\", ENCODING_UTF32 },\n    { \"UTF-32\", ENCODING_UTF32 },\n    { \"UTF32BE\", ENCODING_UTF32BE },\n    { \"UTF-32BE\", ENCODING_UTF32BE },\n    { \"UTF32LE\", ENCODING_UTF32LE },\n    { \"UTF-32LE\", ENCODING_UTF32LE },\n    { \"UCS2\", ENCODING_UCS2BE },\n    { \"UCS-2\", ENCODING_UCS2BE },\n    { \"UCS-2LE\", ENCODING_UCS2LE },\n    { \"UCS-2BE\", ENCODING_UCS2BE },\n    { \"UCS-2-INTERNAL\", ENCODING_UCS2NATIVE },\n    { \"UCS4\", ENCODING_UCS4BE },\n    { \"UCS-4\", ENCODING_UCS4BE },\n    { \"UCS-4LE\", ENCODING_UCS4LE },\n    { \"UCS-4BE\", ENCODING_UCS4BE },\n    { \"UCS-4-INTERNAL\", ENCODING_UCS4NATIVE },\n/* *INDENT-ON* */\n};\n\nstatic const char *\ngetlocale(char *buffer, size_t bufsize)\n{\n    const char *lang;\n    char *ptr;\n\n    lang = SDL_getenv(\"LC_ALL\");\n    if (!lang) {\n        lang = SDL_getenv(\"LC_CTYPE\");\n    }\n    if (!lang) {\n        lang = SDL_getenv(\"LC_MESSAGES\");\n    }\n    if (!lang) {\n        lang = SDL_getenv(\"LANG\");\n    }\n    if (!lang || !*lang || SDL_strcmp(lang, \"C\") == 0) {\n        lang = \"ASCII\";\n    }\n\n    /* We need to trim down strings like \"en_US.UTF-8@blah\" to \"UTF-8\" */\n    ptr = SDL_strchr(lang, '.');\n    if (ptr != NULL) {\n        lang = ptr + 1;\n    }\n\n    SDL_strlcpy(buffer, lang, bufsize);\n    ptr = SDL_strchr(buffer, '@');\n    if (ptr != NULL) {\n        *ptr = '\\0';            /* chop end of string. */\n    }\n\n    return buffer;\n}\n\nSDL_iconv_t\nSDL_iconv_open(const char *tocode, const char *fromcode)\n{\n    int src_fmt = ENCODING_UNKNOWN;\n    int dst_fmt = ENCODING_UNKNOWN;\n    int i;\n    char fromcode_buffer[64];\n    char tocode_buffer[64];\n\n    if (!fromcode || !*fromcode) {\n        fromcode = getlocale(fromcode_buffer, sizeof(fromcode_buffer));\n    }\n    if (!tocode || !*tocode) {\n        tocode = getlocale(tocode_buffer, sizeof(tocode_buffer));\n    }\n    for (i = 0; i < SDL_arraysize(encodings); ++i) {\n        if (SDL_strcasecmp(fromcode, encodings[i].name) == 0) {\n            src_fmt = encodings[i].format;\n            if (dst_fmt != ENCODING_UNKNOWN) {\n                break;\n            }\n        }\n        if (SDL_strcasecmp(tocode, encodings[i].name) == 0) {\n            dst_fmt = encodings[i].format;\n            if (src_fmt != ENCODING_UNKNOWN) {\n                break;\n            }\n        }\n    }\n    if (src_fmt != ENCODING_UNKNOWN && dst_fmt != ENCODING_UNKNOWN) {\n        SDL_iconv_t cd = (SDL_iconv_t) SDL_malloc(sizeof(*cd));\n        if (cd) {\n            cd->src_fmt = src_fmt;\n            cd->dst_fmt = dst_fmt;\n            return cd;\n        }\n    }\n    return (SDL_iconv_t) - 1;\n}\n\nsize_t\nSDL_iconv(SDL_iconv_t cd,\n          const char **inbuf, size_t * inbytesleft,\n          char **outbuf, size_t * outbytesleft)\n{\n    /* For simplicity, we'll convert everything to and from UCS-4 */\n    const char *src;\n    char *dst;\n    size_t srclen, dstlen;\n    Uint32 ch = 0;\n    size_t total;\n\n    if (!inbuf || !*inbuf) {\n        /* Reset the context */\n        return 0;\n    }\n    if (!outbuf || !*outbuf || !outbytesleft || !*outbytesleft) {\n        return SDL_ICONV_E2BIG;\n    }\n    src = *inbuf;\n    srclen = (inbytesleft ? *inbytesleft : 0);\n    dst = *outbuf;\n    dstlen = *outbytesleft;\n\n    switch (cd->src_fmt) {\n    case ENCODING_UTF16:\n        /* Scan for a byte order marker */\n        {\n            Uint8 *p = (Uint8 *) src;\n            size_t n = srclen / 2;\n            while (n) {\n                if (p[0] == 0xFF && p[1] == 0xFE) {\n                    cd->src_fmt = ENCODING_UTF16BE;\n                    break;\n                } else if (p[0] == 0xFE && p[1] == 0xFF) {\n                    cd->src_fmt = ENCODING_UTF16LE;\n                    break;\n                }\n                p += 2;\n                --n;\n            }\n            if (n == 0) {\n                /* We can't tell, default to host order */\n                cd->src_fmt = ENCODING_UTF16NATIVE;\n            }\n        }\n        break;\n    case ENCODING_UTF32:\n        /* Scan for a byte order marker */\n        {\n            Uint8 *p = (Uint8 *) src;\n            size_t n = srclen / 4;\n            while (n) {\n                if (p[0] == 0xFF && p[1] == 0xFE &&\n                    p[2] == 0x00 && p[3] == 0x00) {\n                    cd->src_fmt = ENCODING_UTF32BE;\n                    break;\n                } else if (p[0] == 0x00 && p[1] == 0x00 &&\n                           p[2] == 0xFE && p[3] == 0xFF) {\n                    cd->src_fmt = ENCODING_UTF32LE;\n                    break;\n                }\n                p += 4;\n                --n;\n            }\n            if (n == 0) {\n                /* We can't tell, default to host order */\n                cd->src_fmt = ENCODING_UTF32NATIVE;\n            }\n        }\n        break;\n    }\n\n    switch (cd->dst_fmt) {\n    case ENCODING_UTF16:\n        /* Default to host order, need to add byte order marker */\n        if (dstlen < 2) {\n            return SDL_ICONV_E2BIG;\n        }\n        *(Uint16 *) dst = UNICODE_BOM;\n        dst += 2;\n        dstlen -= 2;\n        cd->dst_fmt = ENCODING_UTF16NATIVE;\n        break;\n    case ENCODING_UTF32:\n        /* Default to host order, need to add byte order marker */\n        if (dstlen < 4) {\n            return SDL_ICONV_E2BIG;\n        }\n        *(Uint32 *) dst = UNICODE_BOM;\n        dst += 4;\n        dstlen -= 4;\n        cd->dst_fmt = ENCODING_UTF32NATIVE;\n        break;\n    }\n\n    total = 0;\n    while (srclen > 0) {\n        /* Decode a character */\n        switch (cd->src_fmt) {\n        case ENCODING_ASCII:\n            {\n                Uint8 *p = (Uint8 *) src;\n                ch = (Uint32) (p[0] & 0x7F);\n                ++src;\n                --srclen;\n            }\n            break;\n        case ENCODING_LATIN1:\n            {\n                Uint8 *p = (Uint8 *) src;\n                ch = (Uint32) p[0];\n                ++src;\n                --srclen;\n            }\n            break;\n        case ENCODING_UTF8:    /* RFC 3629 */\n            {\n                Uint8 *p = (Uint8 *) src;\n                size_t left = 0;\n                SDL_bool overlong = SDL_FALSE;\n                if (p[0] >= 0xFC) {\n                    if ((p[0] & 0xFE) != 0xFC) {\n                        /* Skip illegal sequences\n                           return SDL_ICONV_EILSEQ;\n                         */\n                        ch = UNKNOWN_UNICODE;\n                    } else {\n                        if (p[0] == 0xFC && srclen > 1 && (p[1] & 0xFC) == 0x80) {\n                            overlong = SDL_TRUE;\n                        }\n                        ch = (Uint32) (p[0] & 0x01);\n                        left = 5;\n                    }\n                } else if (p[0] >= 0xF8) {\n                    if ((p[0] & 0xFC) != 0xF8) {\n                        /* Skip illegal sequences\n                           return SDL_ICONV_EILSEQ;\n                         */\n                        ch = UNKNOWN_UNICODE;\n                    } else {\n                        if (p[0] == 0xF8 && srclen > 1 && (p[1] & 0xF8) == 0x80) {\n                            overlong = SDL_TRUE;\n                        }\n                        ch = (Uint32) (p[0] & 0x03);\n                        left = 4;\n                    }\n                } else if (p[0] >= 0xF0) {\n                    if ((p[0] & 0xF8) != 0xF0) {\n                        /* Skip illegal sequences\n                           return SDL_ICONV_EILSEQ;\n                         */\n                        ch = UNKNOWN_UNICODE;\n                    } else {\n                        if (p[0] == 0xF0 && srclen > 1 && (p[1] & 0xF0) == 0x80) {\n                            overlong = SDL_TRUE;\n                        }\n                        ch = (Uint32) (p[0] & 0x07);\n                        left = 3;\n                    }\n                } else if (p[0] >= 0xE0) {\n                    if ((p[0] & 0xF0) != 0xE0) {\n                        /* Skip illegal sequences\n                           return SDL_ICONV_EILSEQ;\n                         */\n                        ch = UNKNOWN_UNICODE;\n                    } else {\n                        if (p[0] == 0xE0 && srclen > 1 && (p[1] & 0xE0) == 0x80) {\n                            overlong = SDL_TRUE;\n                        }\n                        ch = (Uint32) (p[0] & 0x0F);\n                        left = 2;\n                    }\n                } else if (p[0] >= 0xC0) {\n                    if ((p[0] & 0xE0) != 0xC0) {\n                        /* Skip illegal sequences\n                           return SDL_ICONV_EILSEQ;\n                         */\n                        ch = UNKNOWN_UNICODE;\n                    } else {\n                        if ((p[0] & 0xDE) == 0xC0) {\n                            overlong = SDL_TRUE;\n                        }\n                        ch = (Uint32) (p[0] & 0x1F);\n                        left = 1;\n                    }\n                } else {\n                    if ((p[0] & 0x80) != 0x00) {\n                        /* Skip illegal sequences\n                           return SDL_ICONV_EILSEQ;\n                         */\n                        ch = UNKNOWN_UNICODE;\n                    } else {\n                        ch = (Uint32) p[0];\n                    }\n                }\n                ++src;\n                --srclen;\n                if (srclen < left) {\n                    return SDL_ICONV_EINVAL;\n                }\n                while (left--) {\n                    ++p;\n                    if ((p[0] & 0xC0) != 0x80) {\n                        /* Skip illegal sequences\n                           return SDL_ICONV_EILSEQ;\n                         */\n                        ch = UNKNOWN_UNICODE;\n                        break;\n                    }\n                    ch <<= 6;\n                    ch |= (p[0] & 0x3F);\n                    ++src;\n                    --srclen;\n                }\n                if (overlong) {\n                    /* Potential security risk\n                       return SDL_ICONV_EILSEQ;\n                     */\n                    ch = UNKNOWN_UNICODE;\n                }\n                if ((ch >= 0xD800 && ch <= 0xDFFF) ||\n                    (ch == 0xFFFE || ch == 0xFFFF) || ch > 0x10FFFF) {\n                    /* Skip illegal sequences\n                       return SDL_ICONV_EILSEQ;\n                     */\n                    ch = UNKNOWN_UNICODE;\n                }\n            }\n            break;\n        case ENCODING_UTF16BE: /* RFC 2781 */\n            {\n                Uint8 *p = (Uint8 *) src;\n                Uint16 W1, W2;\n                if (srclen < 2) {\n                    return SDL_ICONV_EINVAL;\n                }\n                W1 = ((Uint16) p[0] << 8) | (Uint16) p[1];\n                src += 2;\n                srclen -= 2;\n                if (W1 < 0xD800 || W1 > 0xDFFF) {\n                    ch = (Uint32) W1;\n                    break;\n                }\n                if (W1 > 0xDBFF) {\n                    /* Skip illegal sequences\n                       return SDL_ICONV_EILSEQ;\n                     */\n                    ch = UNKNOWN_UNICODE;\n                    break;\n                }\n                if (srclen < 2) {\n                    return SDL_ICONV_EINVAL;\n                }\n                p = (Uint8 *) src;\n                W2 = ((Uint16) p[0] << 8) | (Uint16) p[1];\n                src += 2;\n                srclen -= 2;\n                if (W2 < 0xDC00 || W2 > 0xDFFF) {\n                    /* Skip illegal sequences\n                       return SDL_ICONV_EILSEQ;\n                     */\n                    ch = UNKNOWN_UNICODE;\n                    break;\n                }\n                ch = (((Uint32) (W1 & 0x3FF) << 10) |\n                      (Uint32) (W2 & 0x3FF)) + 0x10000;\n            }\n            break;\n        case ENCODING_UTF16LE: /* RFC 2781 */\n            {\n                Uint8 *p = (Uint8 *) src;\n                Uint16 W1, W2;\n                if (srclen < 2) {\n                    return SDL_ICONV_EINVAL;\n                }\n                W1 = ((Uint16) p[1] << 8) | (Uint16) p[0];\n                src += 2;\n                srclen -= 2;\n                if (W1 < 0xD800 || W1 > 0xDFFF) {\n                    ch = (Uint32) W1;\n                    break;\n                }\n                if (W1 > 0xDBFF) {\n                    /* Skip illegal sequences\n                       return SDL_ICONV_EILSEQ;\n                     */\n                    ch = UNKNOWN_UNICODE;\n                    break;\n                }\n                if (srclen < 2) {\n                    return SDL_ICONV_EINVAL;\n                }\n                p = (Uint8 *) src;\n                W2 = ((Uint16) p[1] << 8) | (Uint16) p[0];\n                src += 2;\n                srclen -= 2;\n                if (W2 < 0xDC00 || W2 > 0xDFFF) {\n                    /* Skip illegal sequences\n                       return SDL_ICONV_EILSEQ;\n                     */\n                    ch = UNKNOWN_UNICODE;\n                    break;\n                }\n                ch = (((Uint32) (W1 & 0x3FF) << 10) |\n                      (Uint32) (W2 & 0x3FF)) + 0x10000;\n            }\n            break;\n        case ENCODING_UCS2LE:\n            {\n                Uint8 *p = (Uint8 *) src;\n                if (srclen < 2) {\n                    return SDL_ICONV_EINVAL;\n                }\n                ch = ((Uint32) p[1] << 8) | (Uint32) p[0];\n                src += 2;\n                srclen -= 2;\n            }\n            break;\n        case ENCODING_UCS2BE:\n            {\n                Uint8 *p = (Uint8 *) src;\n                if (srclen < 2) {\n                    return SDL_ICONV_EINVAL;\n                }\n                ch = ((Uint32) p[0] << 8) | (Uint32) p[1];\n                src += 2;\n                srclen -= 2;\n            }\n            break;\n        case ENCODING_UCS4BE:\n        case ENCODING_UTF32BE:\n            {\n                Uint8 *p = (Uint8 *) src;\n                if (srclen < 4) {\n                    return SDL_ICONV_EINVAL;\n                }\n                ch = ((Uint32) p[0] << 24) |\n                    ((Uint32) p[1] << 16) |\n                    ((Uint32) p[2] << 8) | (Uint32) p[3];\n                src += 4;\n                srclen -= 4;\n            }\n            break;\n        case ENCODING_UCS4LE:\n        case ENCODING_UTF32LE:\n            {\n                Uint8 *p = (Uint8 *) src;\n                if (srclen < 4) {\n                    return SDL_ICONV_EINVAL;\n                }\n                ch = ((Uint32) p[3] << 24) |\n                    ((Uint32) p[2] << 16) |\n                    ((Uint32) p[1] << 8) | (Uint32) p[0];\n                src += 4;\n                srclen -= 4;\n            }\n            break;\n        }\n\n        /* Encode a character */\n        switch (cd->dst_fmt) {\n        case ENCODING_ASCII:\n            {\n                Uint8 *p = (Uint8 *) dst;\n                if (dstlen < 1) {\n                    return SDL_ICONV_E2BIG;\n                }\n                if (ch > 0x7F) {\n                    *p = UNKNOWN_ASCII;\n                } else {\n                    *p = (Uint8) ch;\n                }\n                ++dst;\n                --dstlen;\n            }\n            break;\n        case ENCODING_LATIN1:\n            {\n                Uint8 *p = (Uint8 *) dst;\n                if (dstlen < 1) {\n                    return SDL_ICONV_E2BIG;\n                }\n                if (ch > 0xFF) {\n                    *p = UNKNOWN_ASCII;\n                } else {\n                    *p = (Uint8) ch;\n                }\n                ++dst;\n                --dstlen;\n            }\n            break;\n        case ENCODING_UTF8:    /* RFC 3629 */\n            {\n                Uint8 *p = (Uint8 *) dst;\n                if (ch > 0x10FFFF) {\n                    ch = UNKNOWN_UNICODE;\n                }\n                if (ch <= 0x7F) {\n                    if (dstlen < 1) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    *p = (Uint8) ch;\n                    ++dst;\n                    --dstlen;\n                } else if (ch <= 0x7FF) {\n                    if (dstlen < 2) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    p[0] = 0xC0 | (Uint8) ((ch >> 6) & 0x1F);\n                    p[1] = 0x80 | (Uint8) (ch & 0x3F);\n                    dst += 2;\n                    dstlen -= 2;\n                } else if (ch <= 0xFFFF) {\n                    if (dstlen < 3) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    p[0] = 0xE0 | (Uint8) ((ch >> 12) & 0x0F);\n                    p[1] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);\n                    p[2] = 0x80 | (Uint8) (ch & 0x3F);\n                    dst += 3;\n                    dstlen -= 3;\n                } else if (ch <= 0x1FFFFF) {\n                    if (dstlen < 4) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    p[0] = 0xF0 | (Uint8) ((ch >> 18) & 0x07);\n                    p[1] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);\n                    p[2] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);\n                    p[3] = 0x80 | (Uint8) (ch & 0x3F);\n                    dst += 4;\n                    dstlen -= 4;\n                } else if (ch <= 0x3FFFFFF) {\n                    if (dstlen < 5) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    p[0] = 0xF8 | (Uint8) ((ch >> 24) & 0x03);\n                    p[1] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);\n                    p[2] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);\n                    p[3] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);\n                    p[4] = 0x80 | (Uint8) (ch & 0x3F);\n                    dst += 5;\n                    dstlen -= 5;\n                } else {\n                    if (dstlen < 6) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    p[0] = 0xFC | (Uint8) ((ch >> 30) & 0x01);\n                    p[1] = 0x80 | (Uint8) ((ch >> 24) & 0x3F);\n                    p[2] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);\n                    p[3] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);\n                    p[4] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);\n                    p[5] = 0x80 | (Uint8) (ch & 0x3F);\n                    dst += 6;\n                    dstlen -= 6;\n                }\n            }\n            break;\n        case ENCODING_UTF16BE: /* RFC 2781 */\n            {\n                Uint8 *p = (Uint8 *) dst;\n                if (ch > 0x10FFFF) {\n                    ch = UNKNOWN_UNICODE;\n                }\n                if (ch < 0x10000) {\n                    if (dstlen < 2) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    p[0] = (Uint8) (ch >> 8);\n                    p[1] = (Uint8) ch;\n                    dst += 2;\n                    dstlen -= 2;\n                } else {\n                    Uint16 W1, W2;\n                    if (dstlen < 4) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    ch = ch - 0x10000;\n                    W1 = 0xD800 | (Uint16) ((ch >> 10) & 0x3FF);\n                    W2 = 0xDC00 | (Uint16) (ch & 0x3FF);\n                    p[0] = (Uint8) (W1 >> 8);\n                    p[1] = (Uint8) W1;\n                    p[2] = (Uint8) (W2 >> 8);\n                    p[3] = (Uint8) W2;\n                    dst += 4;\n                    dstlen -= 4;\n                }\n            }\n            break;\n        case ENCODING_UTF16LE: /* RFC 2781 */\n            {\n                Uint8 *p = (Uint8 *) dst;\n                if (ch > 0x10FFFF) {\n                    ch = UNKNOWN_UNICODE;\n                }\n                if (ch < 0x10000) {\n                    if (dstlen < 2) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    p[1] = (Uint8) (ch >> 8);\n                    p[0] = (Uint8) ch;\n                    dst += 2;\n                    dstlen -= 2;\n                } else {\n                    Uint16 W1, W2;\n                    if (dstlen < 4) {\n                        return SDL_ICONV_E2BIG;\n                    }\n                    ch = ch - 0x10000;\n                    W1 = 0xD800 | (Uint16) ((ch >> 10) & 0x3FF);\n                    W2 = 0xDC00 | (Uint16) (ch & 0x3FF);\n                    p[1] = (Uint8) (W1 >> 8);\n                    p[0] = (Uint8) W1;\n                    p[3] = (Uint8) (W2 >> 8);\n                    p[2] = (Uint8) W2;\n                    dst += 4;\n                    dstlen -= 4;\n                }\n            }\n            break;\n        case ENCODING_UCS2BE:\n            {\n                Uint8 *p = (Uint8 *) dst;\n                if (ch > 0xFFFF) {\n                    ch = UNKNOWN_UNICODE;\n                }\n                if (dstlen < 2) {\n                    return SDL_ICONV_E2BIG;\n                }\n                p[0] = (Uint8) (ch >> 8);\n                p[1] = (Uint8) ch;\n                dst += 2;\n                dstlen -= 2;\n            }\n            break;\n        case ENCODING_UCS2LE:\n            {\n                Uint8 *p = (Uint8 *) dst;\n                if (ch > 0xFFFF) {\n                    ch = UNKNOWN_UNICODE;\n                }\n                if (dstlen < 2) {\n                    return SDL_ICONV_E2BIG;\n                }\n                p[1] = (Uint8) (ch >> 8);\n                p[0] = (Uint8) ch;\n                dst += 2;\n                dstlen -= 2;\n            }\n            break;\n        case ENCODING_UTF32BE:\n            if (ch > 0x10FFFF) {\n                ch = UNKNOWN_UNICODE;\n            }\n        case ENCODING_UCS4BE:\n            if (ch > 0x7FFFFFFF) {\n                ch = UNKNOWN_UNICODE;\n            }\n            {\n                Uint8 *p = (Uint8 *) dst;\n                if (dstlen < 4) {\n                    return SDL_ICONV_E2BIG;\n                }\n                p[0] = (Uint8) (ch >> 24);\n                p[1] = (Uint8) (ch >> 16);\n                p[2] = (Uint8) (ch >> 8);\n                p[3] = (Uint8) ch;\n                dst += 4;\n                dstlen -= 4;\n            }\n            break;\n        case ENCODING_UTF32LE:\n            if (ch > 0x10FFFF) {\n                ch = UNKNOWN_UNICODE;\n            }\n        case ENCODING_UCS4LE:\n            if (ch > 0x7FFFFFFF) {\n                ch = UNKNOWN_UNICODE;\n            }\n            {\n                Uint8 *p = (Uint8 *) dst;\n                if (dstlen < 4) {\n                    return SDL_ICONV_E2BIG;\n                }\n                p[3] = (Uint8) (ch >> 24);\n                p[2] = (Uint8) (ch >> 16);\n                p[1] = (Uint8) (ch >> 8);\n                p[0] = (Uint8) ch;\n                dst += 4;\n                dstlen -= 4;\n            }\n            break;\n        }\n\n        /* Update state */\n        *inbuf = src;\n        *inbytesleft = srclen;\n        *outbuf = dst;\n        *outbytesleft = dstlen;\n        ++total;\n    }\n    return total;\n}\n\nint\nSDL_iconv_close(SDL_iconv_t cd)\n{\n    if (cd != (SDL_iconv_t)-1) {\n        SDL_free(cd);\n    }\n    return 0;\n}\n\n#endif /* !HAVE_ICONV */\n\nchar *\nSDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf,\n                 size_t inbytesleft)\n{\n    SDL_iconv_t cd;\n    char *string;\n    size_t stringsize;\n    char *outbuf;\n    size_t outbytesleft;\n    size_t retCode = 0;\n\n    cd = SDL_iconv_open(tocode, fromcode);\n    if (cd == (SDL_iconv_t) - 1) {\n        /* See if we can recover here (fixes iconv on Solaris 11) */\n        if (!tocode || !*tocode) {\n            tocode = \"UTF-8\";\n        }\n        if (!fromcode || !*fromcode) {\n            fromcode = \"UTF-8\";\n        }\n        cd = SDL_iconv_open(tocode, fromcode);\n    }\n    if (cd == (SDL_iconv_t) - 1) {\n        return NULL;\n    }\n\n    stringsize = inbytesleft > 4 ? inbytesleft : 4;\n    string = SDL_malloc(stringsize);\n    if (!string) {\n        SDL_iconv_close(cd);\n        return NULL;\n    }\n    outbuf = string;\n    outbytesleft = stringsize;\n    SDL_memset(outbuf, 0, 4);\n\n    while (inbytesleft > 0) {\n        retCode = SDL_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);\n        switch (retCode) {\n        case SDL_ICONV_E2BIG:\n            {\n                char *oldstring = string;\n                stringsize *= 2;\n                string = SDL_realloc(string, stringsize);\n                if (!string) {\n                    SDL_iconv_close(cd);\n                    return NULL;\n                }\n                outbuf = string + (outbuf - oldstring);\n                outbytesleft = stringsize - (outbuf - string);\n                SDL_memset(outbuf, 0, 4);\n            }\n            break;\n        case SDL_ICONV_EILSEQ:\n            /* Try skipping some input data - not perfect, but... */\n            ++inbuf;\n            --inbytesleft;\n            break;\n        case SDL_ICONV_EINVAL:\n        case SDL_ICONV_ERROR:\n            /* We can't continue... */\n            inbytesleft = 0;\n            break;\n        }\n    }\n    SDL_iconv_close(cd);\n\n    return string;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/stdlib/SDL_malloc.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)\n#define SDL_DISABLE_ANALYZE_MACROS 1\n#endif\n\n#include \"../SDL_internal.h\"\n\n/* This file contains portable memory management functions for SDL */\n\n#include \"SDL_stdinc.h\"\n\n#if defined(HAVE_MALLOC)\n\nvoid *SDL_malloc(size_t size)\n{\n    return malloc(size);\n}\n\nvoid *SDL_calloc(size_t nmemb, size_t size)\n{\n    return calloc(nmemb, size);\n}\n\nvoid *SDL_realloc(void *ptr, size_t size)\n{\n    return realloc(ptr, size);\n}\n\nvoid SDL_free(void *ptr)\n{\n    free(ptr);\n}\n\n#else  /* the rest of this is a LOT of tapdancing to implement malloc. :) */\n\n#define LACKS_SYS_TYPES_H\n#define LACKS_STDIO_H\n#define LACKS_STRINGS_H\n#define LACKS_STRING_H\n#define LACKS_STDLIB_H\n#define ABORT\n#define USE_LOCKS 1\n\n/*\n  This is a version (aka dlmalloc) of malloc/free/realloc written by\n  Doug Lea and released to the public domain, as explained at\n  http://creativecommons.org/licenses/publicdomain.  Send questions,\n  comments, complaints, performance data, etc to dl@cs.oswego.edu\n\n* Version 2.8.3 Thu Sep 22 11:16:15 2005  Doug Lea  (dl at gee)\n\n   Note: There may be an updated version of this malloc obtainable at\n           ftp://gee.cs.oswego.edu/pub/misc/malloc.c\n         Check before installing!\n\n* Quickstart\n\n  This library is all in one file to simplify the most common usage:\n  ftp it, compile it (-O3), and link it into another program. All of\n  the compile-time options default to reasonable values for use on\n  most platforms.  You might later want to step through various\n  compile-time and dynamic tuning options.\n\n  For convenience, an include file for code using this malloc is at:\n     ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h\n  You don't really need this .h file unless you call functions not\n  defined in your system include files.  The .h file contains only the\n  excerpts from this file needed for using this malloc on ANSI C/C++\n  systems, so long as you haven't changed compile-time options about\n  naming and tuning parameters.  If you do, then you can create your\n  own malloc.h that does include all settings by cutting at the point\n  indicated below. Note that you may already by default be using a C\n  library containing a malloc that is based on some version of this\n  malloc (for example in linux). You might still want to use the one\n  in this file to customize settings or to avoid overheads associated\n  with library versions.\n\n* Vital statistics:\n\n  Supported pointer/size_t representation:       4 or 8 bytes\n       size_t MUST be an unsigned type of the same width as\n       pointers. (If you are using an ancient system that declares\n       size_t as a signed type, or need it to be a different width\n       than pointers, you can use a previous release of this malloc\n       (e.g. 2.7.2) supporting these.)\n\n  Alignment:                                     8 bytes (default)\n       This suffices for nearly all current machines and C compilers.\n       However, you can define MALLOC_ALIGNMENT to be wider than this\n       if necessary (up to 128bytes), at the expense of using more space.\n\n  Minimum overhead per allocated chunk:   4 or  8 bytes (if 4byte sizes)\n                                          8 or 16 bytes (if 8byte sizes)\n       Each malloced chunk has a hidden word of overhead holding size\n       and status information, and additional cross-check word\n       if FOOTERS is defined.\n\n  Minimum allocated size: 4-byte ptrs:  16 bytes    (including overhead)\n                          8-byte ptrs:  32 bytes    (including overhead)\n\n       Even a request for zero bytes (i.e., malloc(0)) returns a\n       pointer to something of the minimum allocatable size.\n       The maximum overhead wastage (i.e., number of extra bytes\n       allocated than were requested in malloc) is less than or equal\n       to the minimum size, except for requests >= mmap_threshold that\n       are serviced via mmap(), where the worst case wastage is about\n       32 bytes plus the remainder from a system page (the minimal\n       mmap unit); typically 4096 or 8192 bytes.\n\n  Security: static-safe; optionally more or less\n       The \"security\" of malloc refers to the ability of malicious\n       code to accentuate the effects of errors (for example, freeing\n       space that is not currently malloc'ed or overwriting past the\n       ends of chunks) in code that calls malloc.  This malloc\n       guarantees not to modify any memory locations below the base of\n       heap, i.e., static variables, even in the presence of usage\n       errors.  The routines additionally detect most improper frees\n       and reallocs.  All this holds as long as the static bookkeeping\n       for malloc itself is not corrupted by some other means.  This\n       is only one aspect of security -- these checks do not, and\n       cannot, detect all possible programming errors.\n\n       If FOOTERS is defined nonzero, then each allocated chunk\n       carries an additional check word to verify that it was malloced\n       from its space.  These check words are the same within each\n       execution of a program using malloc, but differ across\n       executions, so externally crafted fake chunks cannot be\n       freed. This improves security by rejecting frees/reallocs that\n       could corrupt heap memory, in addition to the checks preventing\n       writes to statics that are always on.  This may further improve\n       security at the expense of time and space overhead.  (Note that\n       FOOTERS may also be worth using with MSPACES.)\n\n       By default detected errors cause the program to abort (calling\n       \"abort()\"). You can override this to instead proceed past\n       errors by defining PROCEED_ON_ERROR.  In this case, a bad free\n       has no effect, and a malloc that encounters a bad address\n       caused by user overwrites will ignore the bad address by\n       dropping pointers and indices to all known memory. This may\n       be appropriate for programs that should continue if at all\n       possible in the face of programming errors, although they may\n       run out of memory because dropped memory is never reclaimed.\n\n       If you don't like either of these options, you can define\n       CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything\n       else. And if if you are sure that your program using malloc has\n       no errors or vulnerabilities, you can define INSECURE to 1,\n       which might (or might not) provide a small performance improvement.\n\n  Thread-safety: NOT thread-safe unless USE_LOCKS defined\n       When USE_LOCKS is defined, each public call to malloc, free,\n       etc is surrounded with either a pthread mutex or a win32\n       spinlock (depending on WIN32). This is not especially fast, and\n       can be a major bottleneck.  It is designed only to provide\n       minimal protection in concurrent environments, and to provide a\n       basis for extensions.  If you are using malloc in a concurrent\n       program, consider instead using ptmalloc, which is derived from\n       a version of this malloc. (See http://www.malloc.de).\n\n  System requirements: Any combination of MORECORE and/or MMAP/MUNMAP\n       This malloc can use unix sbrk or any emulation (invoked using\n       the CALL_MORECORE macro) and/or mmap/munmap or any emulation\n       (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system\n       memory.  On most unix systems, it tends to work best if both\n       MORECORE and MMAP are enabled.  On Win32, it uses emulations\n       based on VirtualAlloc. It also uses common C library functions\n       like memset.\n\n  Compliance: I believe it is compliant with the Single Unix Specification\n       (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably\n       others as well.\n\n* Overview of algorithms\n\n  This is not the fastest, most space-conserving, most portable, or\n  most tunable malloc ever written. However it is among the fastest\n  while also being among the most space-conserving, portable and\n  tunable.  Consistent balance across these factors results in a good\n  general-purpose allocator for malloc-intensive programs.\n\n  In most ways, this malloc is a best-fit allocator. Generally, it\n  chooses the best-fitting existing chunk for a request, with ties\n  broken in approximately least-recently-used order. (This strategy\n  normally maintains low fragmentation.) However, for requests less\n  than 256bytes, it deviates from best-fit when there is not an\n  exactly fitting available chunk by preferring to use space adjacent\n  to that used for the previous small request, as well as by breaking\n  ties in approximately most-recently-used order. (These enhance\n  locality of series of small allocations.)  And for very large requests\n  (>= 256Kb by default), it relies on system memory mapping\n  facilities, if supported.  (This helps avoid carrying around and\n  possibly fragmenting memory used only for large chunks.)\n\n  All operations (except malloc_stats and mallinfo) have execution\n  times that are bounded by a constant factor of the number of bits in\n  a size_t, not counting any clearing in calloc or copying in realloc,\n  or actions surrounding MORECORE and MMAP that have times\n  proportional to the number of non-contiguous regions returned by\n  system allocation routines, which is often just 1.\n\n  The implementation is not very modular and seriously overuses\n  macros. Perhaps someday all C compilers will do as good a job\n  inlining modular code as can now be done by brute-force expansion,\n  but now, enough of them seem not to.\n\n  Some compilers issue a lot of warnings about code that is\n  dead/unreachable only on some platforms, and also about intentional\n  uses of negation on unsigned types. All known cases of each can be\n  ignored.\n\n  For a longer but out of date high-level description, see\n     http://gee.cs.oswego.edu/dl/html/malloc.html\n\n* MSPACES\n  If MSPACES is defined, then in addition to malloc, free, etc.,\n  this file also defines mspace_malloc, mspace_free, etc. These\n  are versions of malloc routines that take an \"mspace\" argument\n  obtained using create_mspace, to control all internal bookkeeping.\n  If ONLY_MSPACES is defined, only these versions are compiled.\n  So if you would like to use this allocator for only some allocations,\n  and your system malloc for others, you can compile with\n  ONLY_MSPACES and then do something like...\n    static mspace mymspace = create_mspace(0,0); // for example\n    #define mymalloc(bytes)  mspace_malloc(mymspace, bytes)\n\n  (Note: If you only need one instance of an mspace, you can instead\n  use \"USE_DL_PREFIX\" to relabel the global malloc.)\n\n  You can similarly create thread-local allocators by storing\n  mspaces as thread-locals. For example:\n    static __thread mspace tlms = 0;\n    void*  tlmalloc(size_t bytes) {\n      if (tlms == 0) tlms = create_mspace(0, 0);\n      return mspace_malloc(tlms, bytes);\n    }\n    void  tlfree(void* mem) { mspace_free(tlms, mem); }\n\n  Unless FOOTERS is defined, each mspace is completely independent.\n  You cannot allocate from one and free to another (although\n  conformance is only weakly checked, so usage errors are not always\n  caught). If FOOTERS is defined, then each chunk carries around a tag\n  indicating its originating mspace, and frees are directed to their\n  originating spaces.\n\n -------------------------  Compile-time options ---------------------------\n\nBe careful in setting #define values for numerical constants of type\nsize_t. On some systems, literal values are not automatically extended\nto size_t precision unless they are explicitly casted.\n\nWIN32                    default: defined if _WIN32 defined\n  Defining WIN32 sets up defaults for MS environment and compilers.\n  Otherwise defaults are for unix.\n\nMALLOC_ALIGNMENT         default: (size_t)8\n  Controls the minimum alignment for malloc'ed chunks.  It must be a\n  power of two and at least 8, even on machines for which smaller\n  alignments would suffice. It may be defined as larger than this\n  though. Note however that code and data structures are optimized for\n  the case of 8-byte alignment.\n\nMSPACES                  default: 0 (false)\n  If true, compile in support for independent allocation spaces.\n  This is only supported if HAVE_MMAP is true.\n\nONLY_MSPACES             default: 0 (false)\n  If true, only compile in mspace versions, not regular versions.\n\nUSE_LOCKS                default: 0 (false)\n  Causes each call to each public routine to be surrounded with\n  pthread or WIN32 mutex lock/unlock. (If set true, this can be\n  overridden on a per-mspace basis for mspace versions.)\n\nFOOTERS                  default: 0\n  If true, provide extra checking and dispatching by placing\n  information in the footers of allocated chunks. This adds\n  space and time overhead.\n\nINSECURE                 default: 0\n  If true, omit checks for usage errors and heap space overwrites.\n\nUSE_DL_PREFIX            default: NOT defined\n  Causes compiler to prefix all public routines with the string 'dl'.\n  This can be useful when you only want to use this malloc in one part\n  of a program, using your regular system malloc elsewhere.\n\nABORT                    default: defined as abort()\n  Defines how to abort on failed checks.  On most systems, a failed\n  check cannot die with an \"assert\" or even print an informative\n  message, because the underlying print routines in turn call malloc,\n  which will fail again.  Generally, the best policy is to simply call\n  abort(). It's not very useful to do more than this because many\n  errors due to overwriting will show up as address faults (null, odd\n  addresses etc) rather than malloc-triggered checks, so will also\n  abort.  Also, most compilers know that abort() does not return, so\n  can better optimize code conditionally calling it.\n\nPROCEED_ON_ERROR           default: defined as 0 (false)\n  Controls whether detected bad addresses cause them to bypassed\n  rather than aborting. If set, detected bad arguments to free and\n  realloc are ignored. And all bookkeeping information is zeroed out\n  upon a detected overwrite of freed heap space, thus losing the\n  ability to ever return it from malloc again, but enabling the\n  application to proceed. If PROCEED_ON_ERROR is defined, the\n  static variable malloc_corruption_error_count is compiled in\n  and can be examined to see if errors have occurred. This option\n  generates slower code than the default abort policy.\n\nDEBUG                    default: NOT defined\n  The DEBUG setting is mainly intended for people trying to modify\n  this code or diagnose problems when porting to new platforms.\n  However, it may also be able to better isolate user errors than just\n  using runtime checks.  The assertions in the check routines spell\n  out in more detail the assumptions and invariants underlying the\n  algorithms.  The checking is fairly extensive, and will slow down\n  execution noticeably. Calling malloc_stats or mallinfo with DEBUG\n  set will attempt to check every non-mmapped allocated and free chunk\n  in the course of computing the summaries.\n\nABORT_ON_ASSERT_FAILURE   default: defined as 1 (true)\n  Debugging assertion failures can be nearly impossible if your\n  version of the assert macro causes malloc to be called, which will\n  lead to a cascade of further failures, blowing the runtime stack.\n  ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(),\n  which will usually make debugging easier.\n\nMALLOC_FAILURE_ACTION     default: sets errno to ENOMEM, or no-op on win32\n  The action to take before \"return 0\" when malloc fails to be able to\n  return memory because there is none available.\n\nHAVE_MORECORE             default: 1 (true) unless win32 or ONLY_MSPACES\n  True if this system supports sbrk or an emulation of it.\n\nMORECORE                  default: sbrk\n  The name of the sbrk-style system routine to call to obtain more\n  memory.  See below for guidance on writing custom MORECORE\n  functions. The type of the argument to sbrk/MORECORE varies across\n  systems.  It cannot be size_t, because it supports negative\n  arguments, so it is normally the signed type of the same width as\n  size_t (sometimes declared as \"intptr_t\").  It doesn't much matter\n  though. Internally, we only call it with arguments less than half\n  the max value of a size_t, which should work across all reasonable\n  possibilities, although sometimes generating compiler warnings.  See\n  near the end of this file for guidelines for creating a custom\n  version of MORECORE.\n\nMORECORE_CONTIGUOUS       default: 1 (true)\n  If true, take advantage of fact that consecutive calls to MORECORE\n  with positive arguments always return contiguous increasing\n  addresses.  This is true of unix sbrk. It does not hurt too much to\n  set it true anyway, since malloc copes with non-contiguities.\n  Setting it false when definitely non-contiguous saves time\n  and possibly wasted space it would take to discover this though.\n\nMORECORE_CANNOT_TRIM      default: NOT defined\n  True if MORECORE cannot release space back to the system when given\n  negative arguments. This is generally necessary only if you are\n  using a hand-crafted MORECORE function that cannot handle negative\n  arguments.\n\nHAVE_MMAP                 default: 1 (true)\n  True if this system supports mmap or an emulation of it.  If so, and\n  HAVE_MORECORE is not true, MMAP is used for all system\n  allocation. If set and HAVE_MORECORE is true as well, MMAP is\n  primarily used to directly allocate very large blocks. It is also\n  used as a backup strategy in cases where MORECORE fails to provide\n  space from system. Note: A single call to MUNMAP is assumed to be\n  able to unmap memory that may have be allocated using multiple calls\n  to MMAP, so long as they are adjacent.\n\nHAVE_MREMAP               default: 1 on linux, else 0\n  If true realloc() uses mremap() to re-allocate large blocks and\n  extend or shrink allocation spaces.\n\nMMAP_CLEARS               default: 1 on unix\n  True if mmap clears memory so calloc doesn't need to. This is true\n  for standard unix mmap using /dev/zero.\n\nUSE_BUILTIN_FFS            default: 0 (i.e., not used)\n  Causes malloc to use the builtin ffs() function to compute indices.\n  Some compilers may recognize and intrinsify ffs to be faster than the\n  supplied C version. Also, the case of x86 using gcc is special-cased\n  to an asm instruction, so is already as fast as it can be, and so\n  this setting has no effect. (On most x86s, the asm version is only\n  slightly faster than the C version.)\n\nmalloc_getpagesize         default: derive from system includes, or 4096.\n  The system page size. To the extent possible, this malloc manages\n  memory from the system in page-size units.  This may be (and\n  usually is) a function rather than a constant. This is ignored\n  if WIN32, where page size is determined using getSystemInfo during\n  initialization.\n\nUSE_DEV_RANDOM             default: 0 (i.e., not used)\n  Causes malloc to use /dev/random to initialize secure magic seed for\n  stamping footers. Otherwise, the current time is used.\n\nNO_MALLINFO                default: 0\n  If defined, don't compile \"mallinfo\". This can be a simple way\n  of dealing with mismatches between system declarations and\n  those in this file.\n\nMALLINFO_FIELD_TYPE        default: size_t\n  The type of the fields in the mallinfo struct. This was originally\n  defined as \"int\" in SVID etc, but is more usefully defined as\n  size_t. The value is used only if  HAVE_USR_INCLUDE_MALLOC_H is not set\n\nREALLOC_ZERO_BYTES_FREES    default: not defined\n  This should be set if a call to realloc with zero bytes should\n  be the same as a call to free. Some people think it should. Otherwise,\n  since this malloc returns a unique pointer for malloc(0), so does\n  realloc(p, 0).\n\nLACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H\nLACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H,  LACKS_ERRNO_H\nLACKS_STDLIB_H                default: NOT defined unless on WIN32\n  Define these if your system does not have these header files.\n  You might need to manually insert some of the declarations they provide.\n\nDEFAULT_GRANULARITY        default: page size if MORECORE_CONTIGUOUS,\n                                system_info.dwAllocationGranularity in WIN32,\n                                otherwise 64K.\n      Also settable using mallopt(M_GRANULARITY, x)\n  The unit for allocating and deallocating memory from the system.  On\n  most systems with contiguous MORECORE, there is no reason to\n  make this more than a page. However, systems with MMAP tend to\n  either require or encourage larger granularities.  You can increase\n  this value to prevent system allocation functions to be called so\n  often, especially if they are slow.  The value must be at least one\n  page and must be a power of two.  Setting to 0 causes initialization\n  to either page size or win32 region size.  (Note: In previous\n  versions of malloc, the equivalent of this option was called\n  \"TOP_PAD\")\n\nDEFAULT_TRIM_THRESHOLD    default: 2MB\n      Also settable using mallopt(M_TRIM_THRESHOLD, x)\n  The maximum amount of unused top-most memory to keep before\n  releasing via malloc_trim in free().  Automatic trimming is mainly\n  useful in long-lived programs using contiguous MORECORE.  Because\n  trimming via sbrk can be slow on some systems, and can sometimes be\n  wasteful (in cases where programs immediately afterward allocate\n  more large chunks) the value should be high enough so that your\n  overall system performance would improve by releasing this much\n  memory.  As a rough guide, you might set to a value close to the\n  average size of a process (program) running on your system.\n  Releasing this much memory would allow such a process to run in\n  memory.  Generally, it is worth tuning trim thresholds when a\n  program undergoes phases where several large chunks are allocated\n  and released in ways that can reuse each other's storage, perhaps\n  mixed with phases where there are no such chunks at all. The trim\n  value must be greater than page size to have any useful effect.  To\n  disable trimming completely, you can set to MAX_SIZE_T. Note that the trick\n  some people use of mallocing a huge space and then freeing it at\n  program startup, in an attempt to reserve system memory, doesn't\n  have the intended effect under automatic trimming, since that memory\n  will immediately be returned to the system.\n\nDEFAULT_MMAP_THRESHOLD       default: 256K\n      Also settable using mallopt(M_MMAP_THRESHOLD, x)\n  The request size threshold for using MMAP to directly service a\n  request. Requests of at least this size that cannot be allocated\n  using already-existing space will be serviced via mmap.  (If enough\n  normal freed space already exists it is used instead.)  Using mmap\n  segregates relatively large chunks of memory so that they can be\n  individually obtained and released from the host system. A request\n  serviced through mmap is never reused by any other request (at least\n  not directly; the system may just so happen to remap successive\n  requests to the same locations).  Segregating space in this way has\n  the benefits that: Mmapped space can always be individually released\n  back to the system, which helps keep the system level memory demands\n  of a long-lived program low.  Also, mapped memory doesn't become\n  `locked' between other chunks, as can happen with normally allocated\n  chunks, which means that even trimming via malloc_trim would not\n  release them.  However, it has the disadvantage that the space\n  cannot be reclaimed, consolidated, and then used to service later\n  requests, as happens with normal chunks.  The advantages of mmap\n  nearly always outweigh disadvantages for \"large\" chunks, but the\n  value of \"large\" may vary across systems.  The default is an\n  empirically derived value that works well in most systems. You can\n  disable mmap by setting to MAX_SIZE_T.\n\n*/\n\n#ifndef WIN32\n#ifdef _WIN32\n#define WIN32 1\n#endif /* _WIN32 */\n#endif /* WIN32 */\n#ifdef WIN32\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#define HAVE_MMAP 1\n#define HAVE_MORECORE 0\n#define LACKS_UNISTD_H\n#define LACKS_SYS_PARAM_H\n#define LACKS_SYS_MMAN_H\n#define LACKS_STRING_H\n#define LACKS_STRINGS_H\n#define LACKS_SYS_TYPES_H\n#define LACKS_ERRNO_H\n#define LACKS_FCNTL_H\n#define MALLOC_FAILURE_ACTION\n#define MMAP_CLEARS 0           /* WINCE and some others apparently don't clear */\n#endif /* WIN32 */\n\n#if defined(DARWIN) || defined(_DARWIN)\n/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */\n#ifndef HAVE_MORECORE\n#define HAVE_MORECORE 0\n#define HAVE_MMAP 1\n#endif /* HAVE_MORECORE */\n#endif /* DARWIN */\n\n#ifndef LACKS_SYS_TYPES_H\n#include <sys/types.h>          /* For size_t */\n#endif /* LACKS_SYS_TYPES_H */\n\n/* The maximum possible size_t value has all bits set */\n#define MAX_SIZE_T           (~(size_t)0)\n\n#ifndef ONLY_MSPACES\n#define ONLY_MSPACES 0\n#endif /* ONLY_MSPACES */\n#ifndef MSPACES\n#if ONLY_MSPACES\n#define MSPACES 1\n#else /* ONLY_MSPACES */\n#define MSPACES 0\n#endif /* ONLY_MSPACES */\n#endif /* MSPACES */\n#ifndef MALLOC_ALIGNMENT\n#define MALLOC_ALIGNMENT ((size_t)8U)\n#endif /* MALLOC_ALIGNMENT */\n#ifndef FOOTERS\n#define FOOTERS 0\n#endif /* FOOTERS */\n#ifndef ABORT\n#define ABORT  abort()\n#endif /* ABORT */\n#ifndef ABORT_ON_ASSERT_FAILURE\n#define ABORT_ON_ASSERT_FAILURE 1\n#endif /* ABORT_ON_ASSERT_FAILURE */\n#ifndef PROCEED_ON_ERROR\n#define PROCEED_ON_ERROR 0\n#endif /* PROCEED_ON_ERROR */\n#ifndef USE_LOCKS\n#define USE_LOCKS 0\n#endif /* USE_LOCKS */\n#ifndef INSECURE\n#define INSECURE 0\n#endif /* INSECURE */\n#ifndef HAVE_MMAP\n#define HAVE_MMAP 1\n#endif /* HAVE_MMAP */\n#ifndef MMAP_CLEARS\n#define MMAP_CLEARS 1\n#endif /* MMAP_CLEARS */\n#ifndef HAVE_MREMAP\n#ifdef linux\n#define HAVE_MREMAP 1\n#else /* linux */\n#define HAVE_MREMAP 0\n#endif /* linux */\n#endif /* HAVE_MREMAP */\n#ifndef MALLOC_FAILURE_ACTION\n#define MALLOC_FAILURE_ACTION  errno = ENOMEM;\n#endif /* MALLOC_FAILURE_ACTION */\n#ifndef HAVE_MORECORE\n#if ONLY_MSPACES\n#define HAVE_MORECORE 0\n#else /* ONLY_MSPACES */\n#define HAVE_MORECORE 1\n#endif /* ONLY_MSPACES */\n#endif /* HAVE_MORECORE */\n#if !HAVE_MORECORE\n#define MORECORE_CONTIGUOUS 0\n#else /* !HAVE_MORECORE */\n#ifndef MORECORE\n#define MORECORE sbrk\n#endif /* MORECORE */\n#ifndef MORECORE_CONTIGUOUS\n#define MORECORE_CONTIGUOUS 1\n#endif /* MORECORE_CONTIGUOUS */\n#endif /* HAVE_MORECORE */\n#ifndef DEFAULT_GRANULARITY\n#if MORECORE_CONTIGUOUS\n#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */\n#else /* MORECORE_CONTIGUOUS */\n#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)\n#endif /* MORECORE_CONTIGUOUS */\n#endif /* DEFAULT_GRANULARITY */\n#ifndef DEFAULT_TRIM_THRESHOLD\n#ifndef MORECORE_CANNOT_TRIM\n#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)\n#else /* MORECORE_CANNOT_TRIM */\n#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T\n#endif /* MORECORE_CANNOT_TRIM */\n#endif /* DEFAULT_TRIM_THRESHOLD */\n#ifndef DEFAULT_MMAP_THRESHOLD\n#if HAVE_MMAP\n#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)\n#else /* HAVE_MMAP */\n#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T\n#endif /* HAVE_MMAP */\n#endif /* DEFAULT_MMAP_THRESHOLD */\n#ifndef USE_BUILTIN_FFS\n#define USE_BUILTIN_FFS 0\n#endif /* USE_BUILTIN_FFS */\n#ifndef USE_DEV_RANDOM\n#define USE_DEV_RANDOM 0\n#endif /* USE_DEV_RANDOM */\n#ifndef NO_MALLINFO\n#define NO_MALLINFO 0\n#endif /* NO_MALLINFO */\n#ifndef MALLINFO_FIELD_TYPE\n#define MALLINFO_FIELD_TYPE size_t\n#endif /* MALLINFO_FIELD_TYPE */\n\n#define memset  SDL_memset\n#define memcpy  SDL_memcpy\n#define malloc  SDL_malloc\n#define calloc  SDL_calloc\n#define realloc SDL_realloc\n#define free    SDL_free\n\n/*\n  mallopt tuning options.  SVID/XPG defines four standard parameter\n  numbers for mallopt, normally defined in malloc.h.  None of these\n  are used in this malloc, so setting them has no effect. But this\n  malloc does support the following options.\n*/\n\n#define M_TRIM_THRESHOLD     (-1)\n#define M_GRANULARITY        (-2)\n#define M_MMAP_THRESHOLD     (-3)\n\n/* ------------------------ Mallinfo declarations ------------------------ */\n\n#if !NO_MALLINFO\n/*\n  This version of malloc supports the standard SVID/XPG mallinfo\n  routine that returns a struct containing usage properties and\n  statistics. It should work on any system that has a\n  /usr/include/malloc.h defining struct mallinfo.  The main\n  declaration needed is the mallinfo struct that is returned (by-copy)\n  by mallinfo().  The malloinfo struct contains a bunch of fields that\n  are not even meaningful in this version of malloc.  These fields are\n  are instead filled by mallinfo() with other numbers that might be of\n  interest.\n\n  HAVE_USR_INCLUDE_MALLOC_H should be set if you have a\n  /usr/include/malloc.h file that includes a declaration of struct\n  mallinfo.  If so, it is included; else a compliant version is\n  declared below.  These must be precisely the same for mallinfo() to\n  work.  The original SVID version of this struct, defined on most\n  systems with mallinfo, declares all fields as ints. But some others\n  define as unsigned long. If your system defines the fields using a\n  type of different width than listed here, you MUST #include your\n  system version and #define HAVE_USR_INCLUDE_MALLOC_H.\n*/\n\n/* #define HAVE_USR_INCLUDE_MALLOC_H */\n\n#ifdef HAVE_USR_INCLUDE_MALLOC_H\n#include \"/usr/include/malloc.h\"\n#else /* HAVE_USR_INCLUDE_MALLOC_H */\n\nstruct mallinfo\n{\n    MALLINFO_FIELD_TYPE arena;  /* non-mmapped space allocated from system */\n    MALLINFO_FIELD_TYPE ordblks;        /* number of free chunks */\n    MALLINFO_FIELD_TYPE smblks; /* always 0 */\n    MALLINFO_FIELD_TYPE hblks;  /* always 0 */\n    MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */\n    MALLINFO_FIELD_TYPE usmblks;        /* maximum total allocated space */\n    MALLINFO_FIELD_TYPE fsmblks;        /* always 0 */\n    MALLINFO_FIELD_TYPE uordblks;       /* total allocated space */\n    MALLINFO_FIELD_TYPE fordblks;       /* total free space */\n    MALLINFO_FIELD_TYPE keepcost;       /* releasable (via malloc_trim) space */\n};\n\n#endif /* HAVE_USR_INCLUDE_MALLOC_H */\n#endif /* NO_MALLINFO */\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif                          /* __cplusplus */\n\n#if !ONLY_MSPACES\n\n/* ------------------- Declarations of public routines ------------------- */\n\n#ifndef USE_DL_PREFIX\n#define dlcalloc               calloc\n#define dlfree                 free\n#define dlmalloc               malloc\n#define dlmemalign             memalign\n#define dlrealloc              realloc\n#define dlvalloc               valloc\n#define dlpvalloc              pvalloc\n#define dlmallinfo             mallinfo\n#define dlmallopt              mallopt\n#define dlmalloc_trim          malloc_trim\n#define dlmalloc_stats         malloc_stats\n#define dlmalloc_usable_size   malloc_usable_size\n#define dlmalloc_footprint     malloc_footprint\n#define dlmalloc_max_footprint malloc_max_footprint\n#define dlindependent_calloc   independent_calloc\n#define dlindependent_comalloc independent_comalloc\n#endif                          /* USE_DL_PREFIX */\n\n\n/*\n  malloc(size_t n)\n  Returns a pointer to a newly allocated chunk of at least n bytes, or\n  null if no space is available, in which case errno is set to ENOMEM\n  on ANSI C systems.\n\n  If n is zero, malloc returns a minimum-sized chunk. (The minimum\n  size is 16 bytes on most 32bit systems, and 32 bytes on 64bit\n  systems.)  Note that size_t is an unsigned type, so calls with\n  arguments that would be negative if signed are interpreted as\n  requests for huge amounts of space, which will often fail. The\n  maximum supported value of n differs across systems, but is in all\n  cases less than the maximum representable value of a size_t.\n*/\n    void *dlmalloc(size_t);\n\n/*\n  free(void* p)\n  Releases the chunk of memory pointed to by p, that had been previously\n  allocated using malloc or a related routine such as realloc.\n  It has no effect if p is null. If p was not malloced or already\n  freed, free(p) will by default cause the current program to abort.\n*/\n    void dlfree(void *);\n\n/*\n  calloc(size_t n_elements, size_t element_size);\n  Returns a pointer to n_elements * element_size bytes, with all locations\n  set to zero.\n*/\n    void *dlcalloc(size_t, size_t);\n\n/*\n  realloc(void* p, size_t n)\n  Returns a pointer to a chunk of size n that contains the same data\n  as does chunk p up to the minimum of (n, p's size) bytes, or null\n  if no space is available.\n\n  The returned pointer may or may not be the same as p. The algorithm\n  prefers extending p in most cases when possible, otherwise it\n  employs the equivalent of a malloc-copy-free sequence.\n\n  If p is null, realloc is equivalent to malloc.\n\n  If space is not available, realloc returns null, errno is set (if on\n  ANSI) and p is NOT freed.\n\n  if n is for fewer bytes than already held by p, the newly unused\n  space is lopped off and freed if possible.  realloc with a size\n  argument of zero (re)allocates a minimum-sized chunk.\n\n  The old unix realloc convention of allowing the last-free'd chunk\n  to be used as an argument to realloc is not supported.\n*/\n\n    void *dlrealloc(void *, size_t);\n\n/*\n  memalign(size_t alignment, size_t n);\n  Returns a pointer to a newly allocated chunk of n bytes, aligned\n  in accord with the alignment argument.\n\n  The alignment argument should be a power of two. If the argument is\n  not a power of two, the nearest greater power is used.\n  8-byte alignment is guaranteed by normal malloc calls, so don't\n  bother calling memalign with an argument of 8 or less.\n\n  Overreliance on memalign is a sure way to fragment space.\n*/\n    void *dlmemalign(size_t, size_t);\n\n/*\n  valloc(size_t n);\n  Equivalent to memalign(pagesize, n), where pagesize is the page\n  size of the system. If the pagesize is unknown, 4096 is used.\n*/\n    void *dlvalloc(size_t);\n\n/*\n  mallopt(int parameter_number, int parameter_value)\n  Sets tunable parameters The format is to provide a\n  (parameter-number, parameter-value) pair.  mallopt then sets the\n  corresponding parameter to the argument value if it can (i.e., so\n  long as the value is meaningful), and returns 1 if successful else\n  0.  SVID/XPG/ANSI defines four standard param numbers for mallopt,\n  normally defined in malloc.h.  None of these are use in this malloc,\n  so setting them has no effect. But this malloc also supports other\n  options in mallopt. See below for details.  Briefly, supported\n  parameters are as follows (listed defaults are for \"typical\"\n  configurations).\n\n  Symbol            param #  default    allowed param values\n  M_TRIM_THRESHOLD     -1   2*1024*1024   any   (MAX_SIZE_T disables)\n  M_GRANULARITY        -2     page size   any power of 2 >= page size\n  M_MMAP_THRESHOLD     -3      256*1024   any   (or 0 if no MMAP support)\n*/\n    int dlmallopt(int, int);\n\n/*\n  malloc_footprint();\n  Returns the number of bytes obtained from the system.  The total\n  number of bytes allocated by malloc, realloc etc., is less than this\n  value. Unlike mallinfo, this function returns only a precomputed\n  result, so can be called frequently to monitor memory consumption.\n  Even if locks are otherwise defined, this function does not use them,\n  so results might not be up to date.\n*/\n    size_t dlmalloc_footprint(void);\n\n/*\n  malloc_max_footprint();\n  Returns the maximum number of bytes obtained from the system. This\n  value will be greater than current footprint if deallocated space\n  has been reclaimed by the system. The peak number of bytes allocated\n  by malloc, realloc etc., is less than this value. Unlike mallinfo,\n  this function returns only a precomputed result, so can be called\n  frequently to monitor memory consumption.  Even if locks are\n  otherwise defined, this function does not use them, so results might\n  not be up to date.\n*/\n    size_t dlmalloc_max_footprint(void);\n\n#if !NO_MALLINFO\n/*\n  mallinfo()\n  Returns (by copy) a struct containing various summary statistics:\n\n  arena:     current total non-mmapped bytes allocated from system\n  ordblks:   the number of free chunks\n  smblks:    always zero.\n  hblks:     current number of mmapped regions\n  hblkhd:    total bytes held in mmapped regions\n  usmblks:   the maximum total allocated space. This will be greater\n                than current total if trimming has occurred.\n  fsmblks:   always zero\n  uordblks:  current total allocated space (normal or mmapped)\n  fordblks:  total free space\n  keepcost:  the maximum number of bytes that could ideally be released\n               back to system via malloc_trim. (\"ideally\" means that\n               it ignores page restrictions etc.)\n\n  Because these fields are ints, but internal bookkeeping may\n  be kept as longs, the reported values may wrap around zero and\n  thus be inaccurate.\n*/\n    struct mallinfo dlmallinfo(void);\n#endif                          /* NO_MALLINFO */\n\n/*\n  independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);\n\n  independent_calloc is similar to calloc, but instead of returning a\n  single cleared space, it returns an array of pointers to n_elements\n  independent elements that can hold contents of size elem_size, each\n  of which starts out cleared, and can be independently freed,\n  realloc'ed etc. The elements are guaranteed to be adjacently\n  allocated (this is not guaranteed to occur with multiple callocs or\n  mallocs), which may also improve cache locality in some\n  applications.\n\n  The \"chunks\" argument is optional (i.e., may be null, which is\n  probably the most typical usage). If it is null, the returned array\n  is itself dynamically allocated and should also be freed when it is\n  no longer needed. Otherwise, the chunks array must be of at least\n  n_elements in length. It is filled in with the pointers to the\n  chunks.\n\n  In either case, independent_calloc returns this pointer array, or\n  null if the allocation failed.  If n_elements is zero and \"chunks\"\n  is null, it returns a chunk representing an array with zero elements\n  (which should be freed if not wanted).\n\n  Each element must be individually freed when it is no longer\n  needed. If you'd like to instead be able to free all at once, you\n  should instead use regular calloc and assign pointers into this\n  space to represent elements.  (In this case though, you cannot\n  independently free elements.)\n\n  independent_calloc simplifies and speeds up implementations of many\n  kinds of pools.  It may also be useful when constructing large data\n  structures that initially have a fixed number of fixed-sized nodes,\n  but the number is not known at compile time, and some of the nodes\n  may later need to be freed. For example:\n\n  struct Node { int item; struct Node* next; };\n\n  struct Node* build_list() {\n    struct Node** pool;\n    int n = read_number_of_nodes_needed();\n    if (n <= 0) return 0;\n    pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);\n    if (pool == 0) die();\n    // organize into a linked list...\n    struct Node* first = pool[0];\n    for (i = 0; i < n-1; ++i)\n      pool[i]->next = pool[i+1];\n    free(pool);     // Can now free the array (or not, if it is needed later)\n    return first;\n  }\n*/\n    void **dlindependent_calloc(size_t, size_t, void **);\n\n/*\n  independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);\n\n  independent_comalloc allocates, all at once, a set of n_elements\n  chunks with sizes indicated in the \"sizes\" array.    It returns\n  an array of pointers to these elements, each of which can be\n  independently freed, realloc'ed etc. The elements are guaranteed to\n  be adjacently allocated (this is not guaranteed to occur with\n  multiple callocs or mallocs), which may also improve cache locality\n  in some applications.\n\n  The \"chunks\" argument is optional (i.e., may be null). If it is null\n  the returned array is itself dynamically allocated and should also\n  be freed when it is no longer needed. Otherwise, the chunks array\n  must be of at least n_elements in length. It is filled in with the\n  pointers to the chunks.\n\n  In either case, independent_comalloc returns this pointer array, or\n  null if the allocation failed.  If n_elements is zero and chunks is\n  null, it returns a chunk representing an array with zero elements\n  (which should be freed if not wanted).\n\n  Each element must be individually freed when it is no longer\n  needed. If you'd like to instead be able to free all at once, you\n  should instead use a single regular malloc, and assign pointers at\n  particular offsets in the aggregate space. (In this case though, you\n  cannot independently free elements.)\n\n  independent_comallac differs from independent_calloc in that each\n  element may have a different size, and also that it does not\n  automatically clear elements.\n\n  independent_comalloc can be used to speed up allocation in cases\n  where several structs or objects must always be allocated at the\n  same time.  For example:\n\n  struct Head { ... }\n  struct Foot { ... }\n\n  void send_message(char* msg) {\n    int msglen = strlen(msg);\n    size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };\n    void* chunks[3];\n    if (independent_comalloc(3, sizes, chunks) == 0)\n      die();\n    struct Head* head = (struct Head*)(chunks[0]);\n    char*        body = (char*)(chunks[1]);\n    struct Foot* foot = (struct Foot*)(chunks[2]);\n    // ...\n  }\n\n  In general though, independent_comalloc is worth using only for\n  larger values of n_elements. For small values, you probably won't\n  detect enough difference from series of malloc calls to bother.\n\n  Overuse of independent_comalloc can increase overall memory usage,\n  since it cannot reuse existing noncontiguous small chunks that\n  might be available for some of the elements.\n*/\n    void **dlindependent_comalloc(size_t, size_t *, void **);\n\n\n/*\n  pvalloc(size_t n);\n  Equivalent to valloc(minimum-page-that-holds(n)), that is,\n  round up n to nearest pagesize.\n */\n    void *dlpvalloc(size_t);\n\n/*\n  malloc_trim(size_t pad);\n\n  If possible, gives memory back to the system (via negative arguments\n  to sbrk) if there is unused memory at the `high' end of the malloc\n  pool or in unused MMAP segments. You can call this after freeing\n  large blocks of memory to potentially reduce the system-level memory\n  requirements of a program. However, it cannot guarantee to reduce\n  memory. Under some allocation patterns, some large free blocks of\n  memory will be locked between two used chunks, so they cannot be\n  given back to the system.\n\n  The `pad' argument to malloc_trim represents the amount of free\n  trailing space to leave untrimmed. If this argument is zero, only\n  the minimum amount of memory to maintain internal data structures\n  will be left. Non-zero arguments can be supplied to maintain enough\n  trailing space to service future expected allocations without having\n  to re-obtain memory from the system.\n\n  Malloc_trim returns 1 if it actually released any memory, else 0.\n*/\n    int dlmalloc_trim(size_t);\n\n/*\n  malloc_usable_size(void* p);\n\n  Returns the number of bytes you can actually use in\n  an allocated chunk, which may be more than you requested (although\n  often not) due to alignment and minimum size constraints.\n  You can use this many bytes without worrying about\n  overwriting other allocated objects. This is not a particularly great\n  programming practice. malloc_usable_size can be more useful in\n  debugging and assertions, for example:\n\n  p = malloc(n);\n  assert(malloc_usable_size(p) >= 256);\n*/\n    size_t dlmalloc_usable_size(void *);\n\n/*\n  malloc_stats();\n  Prints on stderr the amount of space obtained from the system (both\n  via sbrk and mmap), the maximum amount (which may be more than\n  current if malloc_trim and/or munmap got called), and the current\n  number of bytes allocated via malloc (or realloc, etc) but not yet\n  freed. Note that this is the number of bytes allocated, not the\n  number requested. It will be larger than the number requested\n  because of alignment and bookkeeping overhead. Because it includes\n  alignment wastage as being in use, this figure may be greater than\n  zero even when no user-level chunks are allocated.\n\n  The reported current and maximum system memory can be inaccurate if\n  a program makes other calls to system memory allocation functions\n  (normally sbrk) outside of malloc.\n\n  malloc_stats prints only the most commonly interesting statistics.\n  More information can be obtained by calling mallinfo.\n*/\n    void dlmalloc_stats(void);\n\n#endif                          /* ONLY_MSPACES */\n\n#if MSPACES\n\n/*\n  mspace is an opaque type representing an independent\n  region of space that supports mspace_malloc, etc.\n*/\n    typedef void *mspace;\n\n/*\n  create_mspace creates and returns a new independent space with the\n  given initial capacity, or, if 0, the default granularity size.  It\n  returns null if there is no system memory available to create the\n  space.  If argument locked is non-zero, the space uses a separate\n  lock to control access. The capacity of the space will grow\n  dynamically as needed to service mspace_malloc requests.  You can\n  control the sizes of incremental increases of this space by\n  compiling with a different DEFAULT_GRANULARITY or dynamically\n  setting with mallopt(M_GRANULARITY, value).\n*/\n    mspace create_mspace(size_t capacity, int locked);\n\n/*\n  destroy_mspace destroys the given space, and attempts to return all\n  of its memory back to the system, returning the total number of\n  bytes freed. After destruction, the results of access to all memory\n  used by the space become undefined.\n*/\n    size_t destroy_mspace(mspace msp);\n\n/*\n  create_mspace_with_base uses the memory supplied as the initial base\n  of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this\n  space is used for bookkeeping, so the capacity must be at least this\n  large. (Otherwise 0 is returned.) When this initial space is\n  exhausted, additional memory will be obtained from the system.\n  Destroying this space will deallocate all additionally allocated\n  space (if possible) but not the initial base.\n*/\n    mspace create_mspace_with_base(void *base, size_t capacity, int locked);\n\n/*\n  mspace_malloc behaves as malloc, but operates within\n  the given space.\n*/\n    void *mspace_malloc(mspace msp, size_t bytes);\n\n/*\n  mspace_free behaves as free, but operates within\n  the given space.\n\n  If compiled with FOOTERS==1, mspace_free is not actually needed.\n  free may be called instead of mspace_free because freed chunks from\n  any space are handled by their originating spaces.\n*/\n    void mspace_free(mspace msp, void *mem);\n\n/*\n  mspace_realloc behaves as realloc, but operates within\n  the given space.\n\n  If compiled with FOOTERS==1, mspace_realloc is not actually\n  needed.  realloc may be called instead of mspace_realloc because\n  realloced chunks from any space are handled by their originating\n  spaces.\n*/\n    void *mspace_realloc(mspace msp, void *mem, size_t newsize);\n\n/*\n  mspace_calloc behaves as calloc, but operates within\n  the given space.\n*/\n    void *mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);\n\n/*\n  mspace_memalign behaves as memalign, but operates within\n  the given space.\n*/\n    void *mspace_memalign(mspace msp, size_t alignment, size_t bytes);\n\n/*\n  mspace_independent_calloc behaves as independent_calloc, but\n  operates within the given space.\n*/\n    void **mspace_independent_calloc(mspace msp, size_t n_elements,\n                                     size_t elem_size, void *chunks[]);\n\n/*\n  mspace_independent_comalloc behaves as independent_comalloc, but\n  operates within the given space.\n*/\n    void **mspace_independent_comalloc(mspace msp, size_t n_elements,\n                                       size_t sizes[], void *chunks[]);\n\n/*\n  mspace_footprint() returns the number of bytes obtained from the\n  system for this space.\n*/\n    size_t mspace_footprint(mspace msp);\n\n/*\n  mspace_max_footprint() returns the peak number of bytes obtained from the\n  system for this space.\n*/\n    size_t mspace_max_footprint(mspace msp);\n\n\n#if !NO_MALLINFO\n/*\n  mspace_mallinfo behaves as mallinfo, but reports properties of\n  the given space.\n*/\n    struct mallinfo mspace_mallinfo(mspace msp);\n#endif                          /* NO_MALLINFO */\n\n/*\n  mspace_malloc_stats behaves as malloc_stats, but reports\n  properties of the given space.\n*/\n    void mspace_malloc_stats(mspace msp);\n\n/*\n  mspace_trim behaves as malloc_trim, but\n  operates within the given space.\n*/\n    int mspace_trim(mspace msp, size_t pad);\n\n/*\n  An alias for mallopt.\n*/\n    int mspace_mallopt(int, int);\n\n#endif                          /* MSPACES */\n\n#ifdef __cplusplus\n};                              /* end of extern \"C\" */\n#endif /* __cplusplus */\n\n/*\n  ========================================================================\n  To make a fully customizable malloc.h header file, cut everything\n  above this line, put into file malloc.h, edit to suit, and #include it\n  on the next line, as well as in programs that use this malloc.\n  ========================================================================\n*/\n\n/* #include \"malloc.h\" */\n\n/*------------------------------ internal #includes ---------------------- */\n\n#ifdef _MSC_VER\n#pragma warning( disable : 4146 )       /* no \"unsigned\" warnings */\n#endif /* _MSC_VER */\n\n#ifndef LACKS_STDIO_H\n#include <stdio.h>              /* for printing in malloc_stats */\n#endif\n\n#ifndef LACKS_ERRNO_H\n#include <errno.h>              /* for MALLOC_FAILURE_ACTION */\n#endif /* LACKS_ERRNO_H */\n#if FOOTERS\n#include <time.h>               /* for magic initialization */\n#endif /* FOOTERS */\n#ifndef LACKS_STDLIB_H\n#include <stdlib.h>             /* for abort() */\n#endif /* LACKS_STDLIB_H */\n#ifdef DEBUG\n#if ABORT_ON_ASSERT_FAILURE\n#define assert(x) if(!(x)) ABORT\n#else /* ABORT_ON_ASSERT_FAILURE */\n#include <assert.h>\n#endif /* ABORT_ON_ASSERT_FAILURE */\n#else /* DEBUG */\n#define assert(x)\n#endif /* DEBUG */\n#ifndef LACKS_STRING_H\n#include <string.h>             /* for memset etc */\n#endif /* LACKS_STRING_H */\n#if USE_BUILTIN_FFS\n#ifndef LACKS_STRINGS_H\n#include <strings.h>            /* for ffs */\n#endif /* LACKS_STRINGS_H */\n#endif /* USE_BUILTIN_FFS */\n#if HAVE_MMAP\n#ifndef LACKS_SYS_MMAN_H\n#include <sys/mman.h>           /* for mmap */\n#endif /* LACKS_SYS_MMAN_H */\n#ifndef LACKS_FCNTL_H\n#include <fcntl.h>\n#endif /* LACKS_FCNTL_H */\n#endif /* HAVE_MMAP */\n#if HAVE_MORECORE\n#ifndef LACKS_UNISTD_H\n#include <unistd.h>             /* for sbrk */\n#else /* LACKS_UNISTD_H */\n#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)\nextern void *sbrk(ptrdiff_t);\n#endif /* FreeBSD etc */\n#endif /* LACKS_UNISTD_H */\n#endif /* HAVE_MMAP */\n\n#ifndef WIN32\n#ifndef malloc_getpagesize\n#  ifdef _SC_PAGESIZE           /* some SVR4 systems omit an underscore */\n#    ifndef _SC_PAGE_SIZE\n#      define _SC_PAGE_SIZE _SC_PAGESIZE\n#    endif\n#  endif\n#  ifdef _SC_PAGE_SIZE\n#    define malloc_getpagesize sysconf(_SC_PAGE_SIZE)\n#  else\n#    if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)\nextern size_t getpagesize();\n#      define malloc_getpagesize getpagesize()\n#    else\n#      ifdef WIN32              /* use supplied emulation of getpagesize */\n#        define malloc_getpagesize getpagesize()\n#      else\n#        ifndef LACKS_SYS_PARAM_H\n#          include <sys/param.h>\n#        endif\n#        ifdef EXEC_PAGESIZE\n#          define malloc_getpagesize EXEC_PAGESIZE\n#        else\n#          ifdef NBPG\n#            ifndef CLSIZE\n#              define malloc_getpagesize NBPG\n#            else\n#              define malloc_getpagesize (NBPG * CLSIZE)\n#            endif\n#          else\n#            ifdef NBPC\n#              define malloc_getpagesize NBPC\n#            else\n#              ifdef PAGESIZE\n#                define malloc_getpagesize PAGESIZE\n#              else /* just guess */\n#                define malloc_getpagesize ((size_t)4096U)\n#              endif\n#            endif\n#          endif\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n#endif\n\n/* ------------------- size_t and alignment properties -------------------- */\n\n/* The byte and bit size of a size_t */\n#define SIZE_T_SIZE         (sizeof(size_t))\n#define SIZE_T_BITSIZE      (sizeof(size_t) << 3)\n\n/* Some constants coerced to size_t */\n/* Annoying but necessary to avoid errors on some plaftorms */\n#define SIZE_T_ZERO         ((size_t)0)\n#define SIZE_T_ONE          ((size_t)1)\n#define SIZE_T_TWO          ((size_t)2)\n#define TWO_SIZE_T_SIZES    (SIZE_T_SIZE<<1)\n#define FOUR_SIZE_T_SIZES   (SIZE_T_SIZE<<2)\n#define SIX_SIZE_T_SIZES    (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)\n#define HALF_MAX_SIZE_T     (MAX_SIZE_T / 2U)\n\n/* The bit mask value corresponding to MALLOC_ALIGNMENT */\n#define CHUNK_ALIGN_MASK    (MALLOC_ALIGNMENT - SIZE_T_ONE)\n\n/* True if address a has acceptable alignment */\n#define is_aligned(A)       (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)\n\n/* the number of bytes to offset an address to align it */\n#define align_offset(A)\\\n ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\\\n  ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))\n\n/* -------------------------- MMAP preliminaries ------------------------- */\n\n/*\n   If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and\n   checks to fail so compiler optimizer can delete code rather than\n   using so many \"#if\"s.\n*/\n\n\n/* MORECORE and MMAP must return MFAIL on failure */\n#define MFAIL                ((void*)(MAX_SIZE_T))\n#define CMFAIL               ((char*)(MFAIL))   /* defined for convenience */\n\n#if !HAVE_MMAP\n#define IS_MMAPPED_BIT       (SIZE_T_ZERO)\n#define USE_MMAP_BIT         (SIZE_T_ZERO)\n#define CALL_MMAP(s)         MFAIL\n#define CALL_MUNMAP(a, s)    (-1)\n#define DIRECT_MMAP(s)       MFAIL\n\n#else /* HAVE_MMAP */\n#define IS_MMAPPED_BIT       (SIZE_T_ONE)\n#define USE_MMAP_BIT         (SIZE_T_ONE)\n\n#ifndef WIN32\n#define CALL_MUNMAP(a, s)    munmap((a), (s))\n#define MMAP_PROT            (PROT_READ|PROT_WRITE)\n#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)\n#define MAP_ANONYMOUS        MAP_ANON\n#endif /* MAP_ANON */\n#ifdef MAP_ANONYMOUS\n#define MMAP_FLAGS           (MAP_PRIVATE|MAP_ANONYMOUS)\n#define CALL_MMAP(s)         mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0)\n#else /* MAP_ANONYMOUS */\n/*\n   Nearly all versions of mmap support MAP_ANONYMOUS, so the following\n   is unlikely to be needed, but is supplied just in case.\n*/\n#define MMAP_FLAGS           (MAP_PRIVATE)\nstatic int dev_zero_fd = -1;    /* Cached file descriptor for /dev/zero. */\n#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \\\n           (dev_zero_fd = open(\"/dev/zero\", O_RDWR), \\\n            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \\\n            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))\n#endif /* MAP_ANONYMOUS */\n\n#define DIRECT_MMAP(s)       CALL_MMAP(s)\n#else /* WIN32 */\n\n/* Win32 MMAP via VirtualAlloc */\nstatic void *\nwin32mmap(size_t size)\n{\n    void *ptr =\n        VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);\n    return (ptr != 0) ? ptr : MFAIL;\n}\n\n/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */\nstatic void *\nwin32direct_mmap(size_t size)\n{\n    void *ptr = VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN,\n                             PAGE_READWRITE);\n    return (ptr != 0) ? ptr : MFAIL;\n}\n\n/* This function supports releasing coalesed segments */\nstatic int\nwin32munmap(void *ptr, size_t size)\n{\n    MEMORY_BASIC_INFORMATION minfo;\n    char *cptr = ptr;\n    while (size) {\n        if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)\n            return -1;\n        if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||\n            minfo.State != MEM_COMMIT || minfo.RegionSize > size)\n            return -1;\n        if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)\n            return -1;\n        cptr += minfo.RegionSize;\n        size -= minfo.RegionSize;\n    }\n    return 0;\n}\n\n#define CALL_MMAP(s)         win32mmap(s)\n#define CALL_MUNMAP(a, s)    win32munmap((a), (s))\n#define DIRECT_MMAP(s)       win32direct_mmap(s)\n#endif /* WIN32 */\n#endif /* HAVE_MMAP */\n\n#if HAVE_MMAP && HAVE_MREMAP\n#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))\n#else /* HAVE_MMAP && HAVE_MREMAP */\n#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL\n#endif /* HAVE_MMAP && HAVE_MREMAP */\n\n#if HAVE_MORECORE\n#define CALL_MORECORE(S)     MORECORE(S)\n#else /* HAVE_MORECORE */\n#define CALL_MORECORE(S)     MFAIL\n#endif /* HAVE_MORECORE */\n\n/* mstate bit set if continguous morecore disabled or failed */\n#define USE_NONCONTIGUOUS_BIT (4U)\n\n/* segment bit set in create_mspace_with_base */\n#define EXTERN_BIT            (8U)\n\n\n/* --------------------------- Lock preliminaries ------------------------ */\n\n#if USE_LOCKS\n\n/*\n  When locks are defined, there are up to two global locks:\n\n  * If HAVE_MORECORE, morecore_mutex protects sequences of calls to\n    MORECORE.  In many cases sys_alloc requires two calls, that should\n    not be interleaved with calls by other threads.  This does not\n    protect against direct calls to MORECORE by other threads not\n    using this lock, so there is still code to cope the best we can on\n    interference.\n\n  * magic_init_mutex ensures that mparams.magic and other\n    unique mparams values are initialized only once.\n*/\n\n#ifndef WIN32\n/* By default use posix locks */\n#include <pthread.h>\n#define MLOCK_T pthread_mutex_t\n#define INITIAL_LOCK(l)      pthread_mutex_init(l, NULL)\n#define ACQUIRE_LOCK(l)      pthread_mutex_lock(l)\n#define RELEASE_LOCK(l)      pthread_mutex_unlock(l)\n\n#if HAVE_MORECORE\nstatic MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER;\n#endif /* HAVE_MORECORE */\n\nstatic MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER;\n\n#else /* WIN32 */\n/*\n   Because lock-protected regions have bounded times, and there\n   are no recursive lock calls, we can use simple spinlocks.\n*/\n\n#define MLOCK_T long\nstatic int\nwin32_acquire_lock(MLOCK_T * sl)\n{\n    for (;;) {\n#ifdef InterlockedCompareExchangePointer\n        if (!InterlockedCompareExchange(sl, 1, 0))\n            return 0;\n#else /* Use older void* version */\n        if (!InterlockedCompareExchange((void **) sl, (void *) 1, (void *) 0))\n            return 0;\n#endif /* InterlockedCompareExchangePointer */\n        Sleep(0);\n    }\n}\n\nstatic void\nwin32_release_lock(MLOCK_T * sl)\n{\n    InterlockedExchange(sl, 0);\n}\n\n#define INITIAL_LOCK(l)      *(l)=0\n#define ACQUIRE_LOCK(l)      win32_acquire_lock(l)\n#define RELEASE_LOCK(l)      win32_release_lock(l)\n#if HAVE_MORECORE\nstatic MLOCK_T morecore_mutex;\n#endif /* HAVE_MORECORE */\nstatic MLOCK_T magic_init_mutex;\n#endif /* WIN32 */\n\n#define USE_LOCK_BIT               (2U)\n#else /* USE_LOCKS */\n#define USE_LOCK_BIT               (0U)\n#define INITIAL_LOCK(l)\n#endif /* USE_LOCKS */\n\n#if USE_LOCKS && HAVE_MORECORE\n#define ACQUIRE_MORECORE_LOCK()    ACQUIRE_LOCK(&morecore_mutex);\n#define RELEASE_MORECORE_LOCK()    RELEASE_LOCK(&morecore_mutex);\n#else /* USE_LOCKS && HAVE_MORECORE */\n#define ACQUIRE_MORECORE_LOCK()\n#define RELEASE_MORECORE_LOCK()\n#endif /* USE_LOCKS && HAVE_MORECORE */\n\n#if USE_LOCKS\n#define ACQUIRE_MAGIC_INIT_LOCK()  ACQUIRE_LOCK(&magic_init_mutex);\n#define RELEASE_MAGIC_INIT_LOCK()  RELEASE_LOCK(&magic_init_mutex);\n#else /* USE_LOCKS */\n#define ACQUIRE_MAGIC_INIT_LOCK()\n#define RELEASE_MAGIC_INIT_LOCK()\n#endif /* USE_LOCKS */\n\n\n/* -----------------------  Chunk representations ------------------------ */\n\n/*\n  (The following includes lightly edited explanations by Colin Plumb.)\n\n  The malloc_chunk declaration below is misleading (but accurate and\n  necessary).  It declares a \"view\" into memory allowing access to\n  necessary fields at known offsets from a given base.\n\n  Chunks of memory are maintained using a `boundary tag' method as\n  originally described by Knuth.  (See the paper by Paul Wilson\n  ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such\n  techniques.)  Sizes of free chunks are stored both in the front of\n  each chunk and at the end.  This makes consolidating fragmented\n  chunks into bigger chunks fast.  The head fields also hold bits\n  representing whether chunks are free or in use.\n\n  Here are some pictures to make it clearer.  They are \"exploded\" to\n  show that the state of a chunk can be thought of as extending from\n  the high 31 bits of the head field of its header through the\n  prev_foot and PINUSE_BIT bit of the following chunk header.\n\n  A chunk that's in use looks like:\n\n   chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n           | Size of previous chunk (if P = 1)                             |\n           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|\n         | Size of this chunk                                         1| +-+\n   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n         |                                                               |\n         +-                                                             -+\n         |                                                               |\n         +-                                                             -+\n         |                                                               :\n         +-      size - sizeof(size_t) available payload bytes          -+\n         :                                                               |\n chunk-> +-                                                             -+\n         |                                                               |\n         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1|\n       | Size of next chunk (may or may not be in use)               | +-+\n mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n    And if it's free, it looks like this:\n\n   chunk-> +-                                                             -+\n           | User payload (must be in use, or we would have merged!)       |\n           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|\n         | Size of this chunk                                         0| +-+\n   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n         | Next pointer                                                  |\n         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n         | Prev pointer                                                  |\n         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n         |                                                               :\n         +-      size - sizeof(struct chunk) unused bytes               -+\n         :                                                               |\n chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n         | Size of this chunk                                            |\n         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0|\n       | Size of next chunk (must be in use, or we would have merged)| +-+\n mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n       |                                                               :\n       +- User payload                                                -+\n       :                                                               |\n       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n                                                                     |0|\n                                                                     +-+\n  Note that since we always merge adjacent free chunks, the chunks\n  adjacent to a free chunk must be in use.\n\n  Given a pointer to a chunk (which can be derived trivially from the\n  payload pointer) we can, in O(1) time, find out whether the adjacent\n  chunks are free, and if so, unlink them from the lists that they\n  are on and merge them with the current chunk.\n\n  Chunks always begin on even word boundaries, so the mem portion\n  (which is returned to the user) is also on an even word boundary, and\n  thus at least double-word aligned.\n\n  The P (PINUSE_BIT) bit, stored in the unused low-order bit of the\n  chunk size (which is always a multiple of two words), is an in-use\n  bit for the *previous* chunk.  If that bit is *clear*, then the\n  word before the current chunk size contains the previous chunk\n  size, and can be used to find the front of the previous chunk.\n  The very first chunk allocated always has this bit set, preventing\n  access to non-existent (or non-owned) memory. If pinuse is set for\n  any given chunk, then you CANNOT determine the size of the\n  previous chunk, and might even get a memory addressing fault when\n  trying to do so.\n\n  The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of\n  the chunk size redundantly records whether the current chunk is\n  inuse. This redundancy enables usage checks within free and realloc,\n  and reduces indirection when freeing and consolidating chunks.\n\n  Each freshly allocated chunk must have both cinuse and pinuse set.\n  That is, each allocated chunk borders either a previously allocated\n  and still in-use chunk, or the base of its memory arena. This is\n  ensured by making all allocations from the the `lowest' part of any\n  found chunk.  Further, no free chunk physically borders another one,\n  so each free chunk is known to be preceded and followed by either\n  inuse chunks or the ends of memory.\n\n  Note that the `foot' of the current chunk is actually represented\n  as the prev_foot of the NEXT chunk. This makes it easier to\n  deal with alignments etc but can be very confusing when trying\n  to extend or adapt this code.\n\n  The exceptions to all this are\n\n     1. The special chunk `top' is the top-most available chunk (i.e.,\n        the one bordering the end of available memory). It is treated\n        specially.  Top is never included in any bin, is used only if\n        no other chunk is available, and is released back to the\n        system if it is very large (see M_TRIM_THRESHOLD).  In effect,\n        the top chunk is treated as larger (and thus less well\n        fitting) than any other available chunk.  The top chunk\n        doesn't update its trailing size field since there is no next\n        contiguous chunk that would have to index off it. However,\n        space is still allocated for it (TOP_FOOT_SIZE) to enable\n        separation or merging when space is extended.\n\n     3. Chunks allocated via mmap, which have the lowest-order bit\n        (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set\n        PINUSE_BIT in their head fields.  Because they are allocated\n        one-by-one, each must carry its own prev_foot field, which is\n        also used to hold the offset this chunk has within its mmapped\n        region, which is needed to preserve alignment. Each mmapped\n        chunk is trailed by the first two fields of a fake next-chunk\n        for sake of usage checks.\n\n*/\n\nstruct malloc_chunk\n{\n    size_t prev_foot;           /* Size of previous chunk (if free).  */\n    size_t head;                /* Size and inuse bits. */\n    struct malloc_chunk *fd;    /* double links -- used only if free. */\n    struct malloc_chunk *bk;\n};\n\ntypedef struct malloc_chunk mchunk;\ntypedef struct malloc_chunk *mchunkptr;\ntypedef struct malloc_chunk *sbinptr;   /* The type of bins of chunks */\ntypedef size_t bindex_t;        /* Described below */\ntypedef unsigned int binmap_t;  /* Described below */\ntypedef unsigned int flag_t;    /* The type of various bit flag sets */\n\n/* ------------------- Chunks sizes and alignments ----------------------- */\n\n#define MCHUNK_SIZE         (sizeof(mchunk))\n\n#if FOOTERS\n#define CHUNK_OVERHEAD      (TWO_SIZE_T_SIZES)\n#else /* FOOTERS */\n#define CHUNK_OVERHEAD      (SIZE_T_SIZE)\n#endif /* FOOTERS */\n\n/* MMapped chunks need a second word of overhead ... */\n#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)\n/* ... and additional padding for fake next-chunk at foot */\n#define MMAP_FOOT_PAD       (FOUR_SIZE_T_SIZES)\n\n/* The smallest size we can malloc is an aligned minimal chunk */\n#define MIN_CHUNK_SIZE\\\n  ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)\n\n/* conversion from malloc headers to user pointers, and back */\n#define chunk2mem(p)        ((void*)((char*)(p)       + TWO_SIZE_T_SIZES))\n#define mem2chunk(mem)      ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES))\n/* chunk associated with aligned address A */\n#define align_as_chunk(A)   (mchunkptr)((A) + align_offset(chunk2mem(A)))\n\n/* Bounds on request (not chunk) sizes. */\n#define MAX_REQUEST         ((-MIN_CHUNK_SIZE) << 2)\n#define MIN_REQUEST         (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)\n\n/* pad request bytes into a usable size */\n#define pad_request(req) \\\n   (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)\n\n/* pad request, checking for minimum (but not maximum) */\n#define request2size(req) \\\n  (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))\n\n\n/* ------------------ Operations on head and foot fields ----------------- */\n\n/*\n  The head field of a chunk is or'ed with PINUSE_BIT when previous\n  adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in\n  use. If the chunk was obtained with mmap, the prev_foot field has\n  IS_MMAPPED_BIT set, otherwise holding the offset of the base of the\n  mmapped region to the base of the chunk.\n*/\n\n#define PINUSE_BIT          (SIZE_T_ONE)\n#define CINUSE_BIT          (SIZE_T_TWO)\n#define INUSE_BITS          (PINUSE_BIT|CINUSE_BIT)\n\n/* Head value for fenceposts */\n#define FENCEPOST_HEAD      (INUSE_BITS|SIZE_T_SIZE)\n\n/* extraction of fields from head words */\n#define cinuse(p)           ((p)->head & CINUSE_BIT)\n#define pinuse(p)           ((p)->head & PINUSE_BIT)\n#define chunksize(p)        ((p)->head & ~(INUSE_BITS))\n\n#define clear_pinuse(p)     ((p)->head &= ~PINUSE_BIT)\n#define clear_cinuse(p)     ((p)->head &= ~CINUSE_BIT)\n\n/* Treat space at ptr +/- offset as a chunk */\n#define chunk_plus_offset(p, s)  ((mchunkptr)(((char*)(p)) + (s)))\n#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s)))\n\n/* Ptr to next or previous physical malloc_chunk. */\n#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS)))\n#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) ))\n\n/* extract next chunk's pinuse bit */\n#define next_pinuse(p)  ((next_chunk(p)->head) & PINUSE_BIT)\n\n/* Get/set size at footer */\n#define get_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot)\n#define set_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s))\n\n/* Set size, pinuse bit, and foot */\n#define set_size_and_pinuse_of_free_chunk(p, s)\\\n  ((p)->head = (s|PINUSE_BIT), set_foot(p, s))\n\n/* Set size, pinuse bit, foot, and clear next pinuse */\n#define set_free_with_pinuse(p, s, n)\\\n  (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))\n\n#define is_mmapped(p)\\\n  (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT))\n\n/* Get the internal overhead associated with chunk p */\n#define overhead_for(p)\\\n (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD)\n\n/* Return true if malloced space is not necessarily cleared */\n#if MMAP_CLEARS\n#define calloc_must_clear(p) (!is_mmapped(p))\n#else /* MMAP_CLEARS */\n#define calloc_must_clear(p) (1)\n#endif /* MMAP_CLEARS */\n\n/* ---------------------- Overlaid data structures ----------------------- */\n\n/*\n  When chunks are not in use, they are treated as nodes of either\n  lists or trees.\n\n  \"Small\"  chunks are stored in circular doubly-linked lists, and look\n  like this:\n\n    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Size of previous chunk                            |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n    `head:' |             Size of chunk, in bytes                         |P|\n      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Forward pointer to next chunk in list             |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Back pointer to previous chunk in list            |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Unused space (may be 0 bytes long)                .\n            .                                                               .\n            .                                                               |\nnextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n    `foot:' |             Size of chunk, in bytes                           |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n  Larger chunks are kept in a form of bitwise digital trees (aka\n  tries) keyed on chunksizes.  Because malloc_tree_chunks are only for\n  free chunks greater than 256 bytes, their size doesn't impose any\n  constraints on user chunk sizes.  Each node looks like:\n\n    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Size of previous chunk                            |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n    `head:' |             Size of chunk, in bytes                         |P|\n      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Forward pointer to next chunk of same size        |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Back pointer to previous chunk of same size       |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Pointer to left child (child[0])                  |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Pointer to right child (child[1])                 |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Pointer to parent                                 |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             bin index of this chunk                           |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n            |             Unused space                                      .\n            .                                                               |\nnextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n    `foot:' |             Size of chunk, in bytes                           |\n            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n  Each tree holding treenodes is a tree of unique chunk sizes.  Chunks\n  of the same size are arranged in a circularly-linked list, with only\n  the oldest chunk (the next to be used, in our FIFO ordering)\n  actually in the tree.  (Tree members are distinguished by a non-null\n  parent pointer.)  If a chunk with the same size an an existing node\n  is inserted, it is linked off the existing node using pointers that\n  work in the same way as fd/bk pointers of small chunks.\n\n  Each tree contains a power of 2 sized range of chunk sizes (the\n  smallest is 0x100 <= x < 0x180), which is is divided in half at each\n  tree level, with the chunks in the smaller half of the range (0x100\n  <= x < 0x140 for the top nose) in the left subtree and the larger\n  half (0x140 <= x < 0x180) in the right subtree.  This is, of course,\n  done by inspecting individual bits.\n\n  Using these rules, each node's left subtree contains all smaller\n  sizes than its right subtree.  However, the node at the root of each\n  subtree has no particular ordering relationship to either.  (The\n  dividing line between the subtree sizes is based on trie relation.)\n  If we remove the last chunk of a given size from the interior of the\n  tree, we need to replace it with a leaf node.  The tree ordering\n  rules permit a node to be replaced by any leaf below it.\n\n  The smallest chunk in a tree (a common operation in a best-fit\n  allocator) can be found by walking a path to the leftmost leaf in\n  the tree.  Unlike a usual binary tree, where we follow left child\n  pointers until we reach a null, here we follow the right child\n  pointer any time the left one is null, until we reach a leaf with\n  both child pointers null. The smallest chunk in the tree will be\n  somewhere along that path.\n\n  The worst case number of steps to add, find, or remove a node is\n  bounded by the number of bits differentiating chunks within\n  bins. Under current bin calculations, this ranges from 6 up to 21\n  (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case\n  is of course much better.\n*/\n\nstruct malloc_tree_chunk\n{\n    /* The first four fields must be compatible with malloc_chunk */\n    size_t prev_foot;\n    size_t head;\n    struct malloc_tree_chunk *fd;\n    struct malloc_tree_chunk *bk;\n\n    struct malloc_tree_chunk *child[2];\n    struct malloc_tree_chunk *parent;\n    bindex_t index;\n};\n\ntypedef struct malloc_tree_chunk tchunk;\ntypedef struct malloc_tree_chunk *tchunkptr;\ntypedef struct malloc_tree_chunk *tbinptr;      /* The type of bins of trees */\n\n/* A little helper macro for trees */\n#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])\n\n/* ----------------------------- Segments -------------------------------- */\n\n/*\n  Each malloc space may include non-contiguous segments, held in a\n  list headed by an embedded malloc_segment record representing the\n  top-most space. Segments also include flags holding properties of\n  the space. Large chunks that are directly allocated by mmap are not\n  included in this list. They are instead independently created and\n  destroyed without otherwise keeping track of them.\n\n  Segment management mainly comes into play for spaces allocated by\n  MMAP.  Any call to MMAP might or might not return memory that is\n  adjacent to an existing segment.  MORECORE normally contiguously\n  extends the current space, so this space is almost always adjacent,\n  which is simpler and faster to deal with. (This is why MORECORE is\n  used preferentially to MMAP when both are available -- see\n  sys_alloc.)  When allocating using MMAP, we don't use any of the\n  hinting mechanisms (inconsistently) supported in various\n  implementations of unix mmap, or distinguish reserving from\n  committing memory. Instead, we just ask for space, and exploit\n  contiguity when we get it.  It is probably possible to do\n  better than this on some systems, but no general scheme seems\n  to be significantly better.\n\n  Management entails a simpler variant of the consolidation scheme\n  used for chunks to reduce fragmentation -- new adjacent memory is\n  normally prepended or appended to an existing segment. However,\n  there are limitations compared to chunk consolidation that mostly\n  reflect the fact that segment processing is relatively infrequent\n  (occurring only when getting memory from system) and that we\n  don't expect to have huge numbers of segments:\n\n  * Segments are not indexed, so traversal requires linear scans.  (It\n    would be possible to index these, but is not worth the extra\n    overhead and complexity for most programs on most platforms.)\n  * New segments are only appended to old ones when holding top-most\n    memory; if they cannot be prepended to others, they are held in\n    different segments.\n\n  Except for the top-most segment of an mstate, each segment record\n  is kept at the tail of its segment. Segments are added by pushing\n  segment records onto the list headed by &mstate.seg for the\n  containing mstate.\n\n  Segment flags control allocation/merge/deallocation policies:\n  * If EXTERN_BIT set, then we did not allocate this segment,\n    and so should not try to deallocate or merge with others.\n    (This currently holds only for the initial segment passed\n    into create_mspace_with_base.)\n  * If IS_MMAPPED_BIT set, the segment may be merged with\n    other surrounding mmapped segments and trimmed/de-allocated\n    using munmap.\n  * If neither bit is set, then the segment was obtained using\n    MORECORE so can be merged with surrounding MORECORE'd segments\n    and deallocated/trimmed using MORECORE with negative arguments.\n*/\n\nstruct malloc_segment\n{\n    char *base;                 /* base address */\n    size_t size;                /* allocated size */\n    struct malloc_segment *next;        /* ptr to next segment */\n    flag_t sflags;              /* mmap and extern flag */\n};\n\n#define is_mmapped_segment(S)  ((S)->sflags & IS_MMAPPED_BIT)\n#define is_extern_segment(S)   ((S)->sflags & EXTERN_BIT)\n\ntypedef struct malloc_segment msegment;\ntypedef struct malloc_segment *msegmentptr;\n\n/* ---------------------------- malloc_state ----------------------------- */\n\n/*\n   A malloc_state holds all of the bookkeeping for a space.\n   The main fields are:\n\n  Top\n    The topmost chunk of the currently active segment. Its size is\n    cached in topsize.  The actual size of topmost space is\n    topsize+TOP_FOOT_SIZE, which includes space reserved for adding\n    fenceposts and segment records if necessary when getting more\n    space from the system.  The size at which to autotrim top is\n    cached from mparams in trim_check, except that it is disabled if\n    an autotrim fails.\n\n  Designated victim (dv)\n    This is the preferred chunk for servicing small requests that\n    don't have exact fits.  It is normally the chunk split off most\n    recently to service another small request.  Its size is cached in\n    dvsize. The link fields of this chunk are not maintained since it\n    is not kept in a bin.\n\n  SmallBins\n    An array of bin headers for free chunks.  These bins hold chunks\n    with sizes less than MIN_LARGE_SIZE bytes. Each bin contains\n    chunks of all the same size, spaced 8 bytes apart.  To simplify\n    use in double-linked lists, each bin header acts as a malloc_chunk\n    pointing to the real first node, if it exists (else pointing to\n    itself).  This avoids special-casing for headers.  But to avoid\n    waste, we allocate only the fd/bk pointers of bins, and then use\n    repositioning tricks to treat these as the fields of a chunk.\n\n  TreeBins\n    Treebins are pointers to the roots of trees holding a range of\n    sizes. There are 2 equally spaced treebins for each power of two\n    from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything\n    larger.\n\n  Bin maps\n    There is one bit map for small bins (\"smallmap\") and one for\n    treebins (\"treemap).  Each bin sets its bit when non-empty, and\n    clears the bit when empty.  Bit operations are then used to avoid\n    bin-by-bin searching -- nearly all \"search\" is done without ever\n    looking at bins that won't be selected.  The bit maps\n    conservatively use 32 bits per map word, even if on 64bit system.\n    For a good description of some of the bit-based techniques used\n    here, see Henry S. Warren Jr's book \"Hacker's Delight\" (and\n    supplement at http://hackersdelight.org/). Many of these are\n    intended to reduce the branchiness of paths through malloc etc, as\n    well as to reduce the number of memory locations read or written.\n\n  Segments\n    A list of segments headed by an embedded malloc_segment record\n    representing the initial space.\n\n  Address check support\n    The least_addr field is the least address ever obtained from\n    MORECORE or MMAP. Attempted frees and reallocs of any address less\n    than this are trapped (unless INSECURE is defined).\n\n  Magic tag\n    A cross-check field that should always hold same value as mparams.magic.\n\n  Flags\n    Bits recording whether to use MMAP, locks, or contiguous MORECORE\n\n  Statistics\n    Each space keeps track of current and maximum system memory\n    obtained via MORECORE or MMAP.\n\n  Locking\n    If USE_LOCKS is defined, the \"mutex\" lock is acquired and released\n    around every public call using this mspace.\n*/\n\n/* Bin types, widths and sizes */\n#define NSMALLBINS        (32U)\n#define NTREEBINS         (32U)\n#define SMALLBIN_SHIFT    (3U)\n#define SMALLBIN_WIDTH    (SIZE_T_ONE << SMALLBIN_SHIFT)\n#define TREEBIN_SHIFT     (8U)\n#define MIN_LARGE_SIZE    (SIZE_T_ONE << TREEBIN_SHIFT)\n#define MAX_SMALL_SIZE    (MIN_LARGE_SIZE - SIZE_T_ONE)\n#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)\n\nstruct malloc_state\n{\n    binmap_t smallmap;\n    binmap_t treemap;\n    size_t dvsize;\n    size_t topsize;\n    char *least_addr;\n    mchunkptr dv;\n    mchunkptr top;\n    size_t trim_check;\n    size_t magic;\n    mchunkptr smallbins[(NSMALLBINS + 1) * 2];\n    tbinptr treebins[NTREEBINS];\n    size_t footprint;\n    size_t max_footprint;\n    flag_t mflags;\n#if USE_LOCKS\n    MLOCK_T mutex;              /* locate lock among fields that rarely change */\n#endif                          /* USE_LOCKS */\n    msegment seg;\n};\n\ntypedef struct malloc_state *mstate;\n\n/* ------------- Global malloc_state and malloc_params ------------------- */\n\n/*\n  malloc_params holds global properties, including those that can be\n  dynamically set using mallopt. There is a single instance, mparams,\n  initialized in init_mparams.\n*/\n\nstruct malloc_params\n{\n    size_t magic;\n    size_t page_size;\n    size_t granularity;\n    size_t mmap_threshold;\n    size_t trim_threshold;\n    flag_t default_mflags;\n};\n\nstatic struct malloc_params mparams;\n\n/* The global malloc_state used for all non-\"mspace\" calls */\nstatic struct malloc_state _gm_;\n#define gm                 (&_gm_)\n#define is_global(M)       ((M) == &_gm_)\n#define is_initialized(M)  ((M)->top != 0)\n\n/* -------------------------- system alloc setup ------------------------- */\n\n/* Operations on mflags */\n\n#define use_lock(M)           ((M)->mflags &   USE_LOCK_BIT)\n#define enable_lock(M)        ((M)->mflags |=  USE_LOCK_BIT)\n#define disable_lock(M)       ((M)->mflags &= ~USE_LOCK_BIT)\n\n#define use_mmap(M)           ((M)->mflags &   USE_MMAP_BIT)\n#define enable_mmap(M)        ((M)->mflags |=  USE_MMAP_BIT)\n#define disable_mmap(M)       ((M)->mflags &= ~USE_MMAP_BIT)\n\n#define use_noncontiguous(M)  ((M)->mflags &   USE_NONCONTIGUOUS_BIT)\n#define disable_contiguous(M) ((M)->mflags |=  USE_NONCONTIGUOUS_BIT)\n\n#define set_lock(M,L)\\\n ((M)->mflags = (L)?\\\n  ((M)->mflags | USE_LOCK_BIT) :\\\n  ((M)->mflags & ~USE_LOCK_BIT))\n\n/* page-align a size */\n#define page_align(S)\\\n (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE))\n\n/* granularity-align a size */\n#define granularity_align(S)\\\n  (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE))\n\n#define is_page_aligned(S)\\\n   (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)\n#define is_granularity_aligned(S)\\\n   (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)\n\n/*  True if segment S holds address A */\n#define segment_holds(S, A)\\\n  ((char*)(A) >= S->base && (char*)(A) < S->base + S->size)\n\n/* Return segment holding given address */\nstatic msegmentptr\nsegment_holding(mstate m, char *addr)\n{\n    msegmentptr sp = &m->seg;\n    for (;;) {\n        if (addr >= sp->base && addr < sp->base + sp->size)\n            return sp;\n        if ((sp = sp->next) == 0)\n            return 0;\n    }\n}\n\n/* Return true if segment contains a segment link */\nstatic int\nhas_segment_link(mstate m, msegmentptr ss)\n{\n    msegmentptr sp = &m->seg;\n    for (;;) {\n        if ((char *) sp >= ss->base && (char *) sp < ss->base + ss->size)\n            return 1;\n        if ((sp = sp->next) == 0)\n            return 0;\n    }\n}\n\n#ifndef MORECORE_CANNOT_TRIM\n#define should_trim(M,s)  ((s) > (M)->trim_check)\n#else /* MORECORE_CANNOT_TRIM */\n#define should_trim(M,s)  (0)\n#endif /* MORECORE_CANNOT_TRIM */\n\n/*\n  TOP_FOOT_SIZE is padding at the end of a segment, including space\n  that may be needed to place segment records and fenceposts when new\n  noncontiguous segments are added.\n*/\n#define TOP_FOOT_SIZE\\\n  (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)\n\n\n/* -------------------------------  Hooks -------------------------------- */\n\n/*\n  PREACTION should be defined to return 0 on success, and nonzero on\n  failure. If you are not using locking, you can redefine these to do\n  anything you like.\n*/\n\n#if USE_LOCKS\n\n/* Ensure locks are initialized */\n#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams())\n\n#define PREACTION(M)  ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0)\n#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); }\n#else /* USE_LOCKS */\n\n#ifndef PREACTION\n#define PREACTION(M) (0)\n#endif /* PREACTION */\n\n#ifndef POSTACTION\n#define POSTACTION(M)\n#endif /* POSTACTION */\n\n#endif /* USE_LOCKS */\n\n/*\n  CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses.\n  USAGE_ERROR_ACTION is triggered on detected bad frees and\n  reallocs. The argument p is an address that might have triggered the\n  fault. It is ignored by the two predefined actions, but might be\n  useful in custom actions that try to help diagnose errors.\n*/\n\n#if PROCEED_ON_ERROR\n\n/* A count of the number of corruption errors causing resets */\nint malloc_corruption_error_count;\n\n/* default corruption action */\nstatic void reset_on_error(mstate m);\n\n#define CORRUPTION_ERROR_ACTION(m)  reset_on_error(m)\n#define USAGE_ERROR_ACTION(m, p)\n\n#else /* PROCEED_ON_ERROR */\n\n#ifndef CORRUPTION_ERROR_ACTION\n#define CORRUPTION_ERROR_ACTION(m) ABORT\n#endif /* CORRUPTION_ERROR_ACTION */\n\n#ifndef USAGE_ERROR_ACTION\n#define USAGE_ERROR_ACTION(m,p) ABORT\n#endif /* USAGE_ERROR_ACTION */\n\n#endif /* PROCEED_ON_ERROR */\n\n/* -------------------------- Debugging setup ---------------------------- */\n\n#if ! DEBUG\n\n#define check_free_chunk(M,P)\n#define check_inuse_chunk(M,P)\n#define check_malloced_chunk(M,P,N)\n#define check_mmapped_chunk(M,P)\n#define check_malloc_state(M)\n#define check_top_chunk(M,P)\n\n#else /* DEBUG */\n#define check_free_chunk(M,P)       do_check_free_chunk(M,P)\n#define check_inuse_chunk(M,P)      do_check_inuse_chunk(M,P)\n#define check_top_chunk(M,P)        do_check_top_chunk(M,P)\n#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N)\n#define check_mmapped_chunk(M,P)    do_check_mmapped_chunk(M,P)\n#define check_malloc_state(M)       do_check_malloc_state(M)\n\nstatic void do_check_any_chunk(mstate m, mchunkptr p);\nstatic void do_check_top_chunk(mstate m, mchunkptr p);\nstatic void do_check_mmapped_chunk(mstate m, mchunkptr p);\nstatic void do_check_inuse_chunk(mstate m, mchunkptr p);\nstatic void do_check_free_chunk(mstate m, mchunkptr p);\nstatic void do_check_malloced_chunk(mstate m, void *mem, size_t s);\nstatic void do_check_tree(mstate m, tchunkptr t);\nstatic void do_check_treebin(mstate m, bindex_t i);\nstatic void do_check_smallbin(mstate m, bindex_t i);\nstatic void do_check_malloc_state(mstate m);\nstatic int bin_find(mstate m, mchunkptr x);\nstatic size_t traverse_and_check(mstate m);\n#endif /* DEBUG */\n\n/* ---------------------------- Indexing Bins ---------------------------- */\n\n#define is_small(s)         (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)\n#define small_index(s)      ((s)  >> SMALLBIN_SHIFT)\n#define small_index2size(i) ((i)  << SMALLBIN_SHIFT)\n#define MIN_SMALL_INDEX     (small_index(MIN_CHUNK_SIZE))\n\n/* addressing by index. See above about smallbin repositioning */\n#define smallbin_at(M, i)   ((sbinptr)((char*)&((M)->smallbins[(i)<<1])))\n#define treebin_at(M,i)     (&((M)->treebins[i]))\n\n/* assign tree index for size S to variable I */\n#if defined(__GNUC__) && defined(i386)\n#define compute_tree_index(S, I)\\\n{\\\n  size_t X = S >> TREEBIN_SHIFT;\\\n  if (X == 0)\\\n    I = 0;\\\n  else if (X > 0xFFFF)\\\n    I = NTREEBINS-1;\\\n  else {\\\n    unsigned int K;\\\n    __asm__(\"bsrl %1,%0\\n\\t\" : \"=r\" (K) : \"rm\"  (X));\\\n    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\\\n  }\\\n}\n#else /* GNUC */\n#define compute_tree_index(S, I)\\\n{\\\n  size_t X = S >> TREEBIN_SHIFT;\\\n  if (X == 0)\\\n    I = 0;\\\n  else if (X > 0xFFFF)\\\n    I = NTREEBINS-1;\\\n  else {\\\n    unsigned int Y = (unsigned int)X;\\\n    unsigned int N = ((Y - 0x100) >> 16) & 8;\\\n    unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\\\n    N += K;\\\n    N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\\\n    K = 14 - N + ((Y <<= K) >> 15);\\\n    I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\\\n  }\\\n}\n#endif /* GNUC */\n\n/* Bit representing maximum resolved size in a treebin at i */\n#define bit_for_tree_index(i) \\\n   (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)\n\n/* Shift placing maximum resolved bit in a treebin at i as sign bit */\n#define leftshift_for_tree_index(i) \\\n   ((i == NTREEBINS-1)? 0 : \\\n    ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))\n\n/* The size of the smallest chunk held in bin with index i */\n#define minsize_for_tree_index(i) \\\n   ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) |  \\\n   (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))\n\n\n/* ------------------------ Operations on bin maps ----------------------- */\n\n/* bit corresponding to given index */\n#define idx2bit(i)              ((binmap_t)(1) << (i))\n\n/* Mark/Clear bits with given index */\n#define mark_smallmap(M,i)      ((M)->smallmap |=  idx2bit(i))\n#define clear_smallmap(M,i)     ((M)->smallmap &= ~idx2bit(i))\n#define smallmap_is_marked(M,i) ((M)->smallmap &   idx2bit(i))\n\n#define mark_treemap(M,i)       ((M)->treemap  |=  idx2bit(i))\n#define clear_treemap(M,i)      ((M)->treemap  &= ~idx2bit(i))\n#define treemap_is_marked(M,i)  ((M)->treemap  &   idx2bit(i))\n\n/* index corresponding to given bit */\n\n#if defined(__GNUC__) && defined(i386)\n#define compute_bit2idx(X, I)\\\n{\\\n  unsigned int J;\\\n  __asm__(\"bsfl %1,%0\\n\\t\" : \"=r\" (J) : \"rm\" (X));\\\n  I = (bindex_t)J;\\\n}\n\n#else /* GNUC */\n#if  USE_BUILTIN_FFS\n#define compute_bit2idx(X, I) I = ffs(X)-1\n\n#else /* USE_BUILTIN_FFS */\n#define compute_bit2idx(X, I)\\\n{\\\n  unsigned int Y = X - 1;\\\n  unsigned int K = Y >> (16-4) & 16;\\\n  unsigned int N = K;        Y >>= K;\\\n  N += K = Y >> (8-3) &  8;  Y >>= K;\\\n  N += K = Y >> (4-2) &  4;  Y >>= K;\\\n  N += K = Y >> (2-1) &  2;  Y >>= K;\\\n  N += K = Y >> (1-0) &  1;  Y >>= K;\\\n  I = (bindex_t)(N + Y);\\\n}\n#endif /* USE_BUILTIN_FFS */\n#endif /* GNUC */\n\n/* isolate the least set bit of a bitmap */\n#define least_bit(x)         ((x) & -(x))\n\n/* mask with all bits to left of least bit of x on */\n#define left_bits(x)         ((x<<1) | -(x<<1))\n\n/* mask with all bits to left of or equal to least bit of x on */\n#define same_or_left_bits(x) ((x) | -(x))\n\n\n/* ----------------------- Runtime Check Support ------------------------- */\n\n/*\n  For security, the main invariant is that malloc/free/etc never\n  writes to a static address other than malloc_state, unless static\n  malloc_state itself has been corrupted, which cannot occur via\n  malloc (because of these checks). In essence this means that we\n  believe all pointers, sizes, maps etc held in malloc_state, but\n  check all of those linked or offsetted from other embedded data\n  structures.  These checks are interspersed with main code in a way\n  that tends to minimize their run-time cost.\n\n  When FOOTERS is defined, in addition to range checking, we also\n  verify footer fields of inuse chunks, which can be used guarantee\n  that the mstate controlling malloc/free is intact.  This is a\n  streamlined version of the approach described by William Robertson\n  et al in \"Run-time Detection of Heap-based Overflows\" LISA'03\n  http://www.usenix.org/events/lisa03/tech/robertson.html The footer\n  of an inuse chunk holds the xor of its mstate and a random seed,\n  that is checked upon calls to free() and realloc().  This is\n  (probablistically) unguessable from outside the program, but can be\n  computed by any code successfully malloc'ing any chunk, so does not\n  itself provide protection against code that has already broken\n  security through some other means.  Unlike Robertson et al, we\n  always dynamically check addresses of all offset chunks (previous,\n  next, etc). This turns out to be cheaper than relying on hashes.\n*/\n\n#if !INSECURE\n/* Check if address a is at least as high as any from MORECORE or MMAP */\n#define ok_address(M, a) ((char*)(a) >= (M)->least_addr)\n/* Check if address of next chunk n is higher than base chunk p */\n#define ok_next(p, n)    ((char*)(p) < (char*)(n))\n/* Check if p has its cinuse bit on */\n#define ok_cinuse(p)     cinuse(p)\n/* Check if p has its pinuse bit on */\n#define ok_pinuse(p)     pinuse(p)\n\n#else /* !INSECURE */\n#define ok_address(M, a) (1)\n#define ok_next(b, n)    (1)\n#define ok_cinuse(p)     (1)\n#define ok_pinuse(p)     (1)\n#endif /* !INSECURE */\n\n#if (FOOTERS && !INSECURE)\n/* Check if (alleged) mstate m has expected magic field */\n#define ok_magic(M)      ((M)->magic == mparams.magic)\n#else /* (FOOTERS && !INSECURE) */\n#define ok_magic(M)      (1)\n#endif /* (FOOTERS && !INSECURE) */\n\n\n/* In gcc, use __builtin_expect to minimize impact of checks */\n#if !INSECURE\n#if defined(__GNUC__) && __GNUC__ >= 3\n#define RTCHECK(e)  __builtin_expect(e, 1)\n#else /* GNUC */\n#define RTCHECK(e)  (e)\n#endif /* GNUC */\n#else /* !INSECURE */\n#define RTCHECK(e)  (1)\n#endif /* !INSECURE */\n\n/* macros to set up inuse chunks with or without footers */\n\n#if !FOOTERS\n\n#define mark_inuse_foot(M,p,s)\n\n/* Set cinuse bit and pinuse bit of next chunk */\n#define set_inuse(M,p,s)\\\n  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\\\n  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)\n\n/* Set cinuse and pinuse of this chunk and pinuse of next chunk */\n#define set_inuse_and_pinuse(M,p,s)\\\n  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\\\n  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)\n\n/* Set size, cinuse and pinuse bit of this chunk */\n#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\\\n  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))\n\n#else /* FOOTERS */\n\n/* Set foot of inuse chunk to be xor of mstate and seed */\n#define mark_inuse_foot(M,p,s)\\\n  (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic))\n\n#define get_mstate_for(p)\\\n  ((mstate)(((mchunkptr)((char*)(p) +\\\n    (chunksize(p))))->prev_foot ^ mparams.magic))\n\n#define set_inuse(M,p,s)\\\n  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\\\n  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \\\n  mark_inuse_foot(M,p,s))\n\n#define set_inuse_and_pinuse(M,p,s)\\\n  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\\\n  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\\\n mark_inuse_foot(M,p,s))\n\n#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\\\n  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\\\n  mark_inuse_foot(M, p, s))\n\n#endif /* !FOOTERS */\n\n/* ---------------------------- setting mparams -------------------------- */\n\n/* Initialize mparams */\nstatic int\ninit_mparams(void)\n{\n    if (mparams.page_size == 0) {\n        size_t s;\n\n        mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD;\n        mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD;\n#if MORECORE_CONTIGUOUS\n        mparams.default_mflags = USE_LOCK_BIT | USE_MMAP_BIT;\n#else /* MORECORE_CONTIGUOUS */\n        mparams.default_mflags =\n            USE_LOCK_BIT | USE_MMAP_BIT | USE_NONCONTIGUOUS_BIT;\n#endif /* MORECORE_CONTIGUOUS */\n\n#if (FOOTERS && !INSECURE)\n        {\n#if USE_DEV_RANDOM\n            int fd;\n            unsigned char buf[sizeof(size_t)];\n            /* Try to use /dev/urandom, else fall back on using time */\n            if ((fd = open(\"/dev/urandom\", O_RDONLY)) >= 0 &&\n                read(fd, buf, sizeof(buf)) == sizeof(buf)) {\n                s = *((size_t *) buf);\n                close(fd);\n            } else\n#endif /* USE_DEV_RANDOM */\n                s = (size_t) (time(0) ^ (size_t) 0x55555555U);\n\n            s |= (size_t) 8U;   /* ensure nonzero */\n            s &= ~(size_t) 7U;  /* improve chances of fault for bad values */\n\n        }\n#else /* (FOOTERS && !INSECURE) */\n        s = (size_t) 0x58585858U;\n#endif /* (FOOTERS && !INSECURE) */\n        ACQUIRE_MAGIC_INIT_LOCK();\n        if (mparams.magic == 0) {\n            mparams.magic = s;\n            /* Set up lock for main malloc area */\n            INITIAL_LOCK(&gm->mutex);\n            gm->mflags = mparams.default_mflags;\n        }\n        RELEASE_MAGIC_INIT_LOCK();\n\n#ifndef WIN32\n        mparams.page_size = malloc_getpagesize;\n        mparams.granularity = ((DEFAULT_GRANULARITY != 0) ?\n                               DEFAULT_GRANULARITY : mparams.page_size);\n#else /* WIN32 */\n        {\n            SYSTEM_INFO system_info;\n            GetSystemInfo(&system_info);\n            mparams.page_size = system_info.dwPageSize;\n            mparams.granularity = system_info.dwAllocationGranularity;\n        }\n#endif /* WIN32 */\n\n        /* Sanity-check configuration:\n           size_t must be unsigned and as wide as pointer type.\n           ints must be at least 4 bytes.\n           alignment must be at least 8.\n           Alignment, min chunk size, and page size must all be powers of 2.\n         */\n        if ((sizeof(size_t) != sizeof(char *)) ||\n            (MAX_SIZE_T < MIN_CHUNK_SIZE) ||\n            (sizeof(int) < 4) ||\n            (MALLOC_ALIGNMENT < (size_t) 8U) ||\n            ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT - SIZE_T_ONE)) != 0) ||\n            ((MCHUNK_SIZE & (MCHUNK_SIZE - SIZE_T_ONE)) != 0) ||\n            ((mparams.granularity & (mparams.granularity - SIZE_T_ONE)) != 0)\n            || ((mparams.page_size & (mparams.page_size - SIZE_T_ONE)) != 0))\n            ABORT;\n    }\n    return 0;\n}\n\n/* support for mallopt */\nstatic int\nchange_mparam(int param_number, int value)\n{\n    size_t val = (size_t) value;\n    init_mparams();\n    switch (param_number) {\n    case M_TRIM_THRESHOLD:\n        mparams.trim_threshold = val;\n        return 1;\n    case M_GRANULARITY:\n        if (val >= mparams.page_size && ((val & (val - 1)) == 0)) {\n            mparams.granularity = val;\n            return 1;\n        } else\n            return 0;\n    case M_MMAP_THRESHOLD:\n        mparams.mmap_threshold = val;\n        return 1;\n    default:\n        return 0;\n    }\n}\n\n#if DEBUG\n/* ------------------------- Debugging Support --------------------------- */\n\n/* Check properties of any chunk, whether free, inuse, mmapped etc  */\nstatic void\ndo_check_any_chunk(mstate m, mchunkptr p)\n{\n    assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));\n    assert(ok_address(m, p));\n}\n\n/* Check properties of top chunk */\nstatic void\ndo_check_top_chunk(mstate m, mchunkptr p)\n{\n    msegmentptr sp = segment_holding(m, (char *) p);\n    size_t sz = chunksize(p);\n    assert(sp != 0);\n    assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));\n    assert(ok_address(m, p));\n    assert(sz == m->topsize);\n    assert(sz > 0);\n    assert(sz == ((sp->base + sp->size) - (char *) p) - TOP_FOOT_SIZE);\n    assert(pinuse(p));\n    assert(!next_pinuse(p));\n}\n\n/* Check properties of (inuse) mmapped chunks */\nstatic void\ndo_check_mmapped_chunk(mstate m, mchunkptr p)\n{\n    size_t sz = chunksize(p);\n    size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD);\n    assert(is_mmapped(p));\n    assert(use_mmap(m));\n    assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));\n    assert(ok_address(m, p));\n    assert(!is_small(sz));\n    assert((len & (mparams.page_size - SIZE_T_ONE)) == 0);\n    assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD);\n    assert(chunk_plus_offset(p, sz + SIZE_T_SIZE)->head == 0);\n}\n\n/* Check properties of inuse chunks */\nstatic void\ndo_check_inuse_chunk(mstate m, mchunkptr p)\n{\n    do_check_any_chunk(m, p);\n    assert(cinuse(p));\n    assert(next_pinuse(p));\n    /* If not pinuse and not mmapped, previous chunk has OK offset */\n    assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p);\n    if (is_mmapped(p))\n        do_check_mmapped_chunk(m, p);\n}\n\n/* Check properties of free chunks */\nstatic void\ndo_check_free_chunk(mstate m, mchunkptr p)\n{\n    size_t sz = p->head & ~(PINUSE_BIT | CINUSE_BIT);\n    mchunkptr next = chunk_plus_offset(p, sz);\n    do_check_any_chunk(m, p);\n    assert(!cinuse(p));\n    assert(!next_pinuse(p));\n    assert(!is_mmapped(p));\n    if (p != m->dv && p != m->top) {\n        if (sz >= MIN_CHUNK_SIZE) {\n            assert((sz & CHUNK_ALIGN_MASK) == 0);\n            assert(is_aligned(chunk2mem(p)));\n            assert(next->prev_foot == sz);\n            assert(pinuse(p));\n            assert(next == m->top || cinuse(next));\n            assert(p->fd->bk == p);\n            assert(p->bk->fd == p);\n        } else                  /* markers are always of size SIZE_T_SIZE */\n            assert(sz == SIZE_T_SIZE);\n    }\n}\n\n/* Check properties of malloced chunks at the point they are malloced */\nstatic void\ndo_check_malloced_chunk(mstate m, void *mem, size_t s)\n{\n    if (mem != 0) {\n        mchunkptr p = mem2chunk(mem);\n        size_t sz = p->head & ~(PINUSE_BIT | CINUSE_BIT);\n        do_check_inuse_chunk(m, p);\n        assert((sz & CHUNK_ALIGN_MASK) == 0);\n        assert(sz >= MIN_CHUNK_SIZE);\n        assert(sz >= s);\n        /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */\n        assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE));\n    }\n}\n\n/* Check a tree and its subtrees.  */\nstatic void\ndo_check_tree(mstate m, tchunkptr t)\n{\n    tchunkptr head = 0;\n    tchunkptr u = t;\n    bindex_t tindex = t->index;\n    size_t tsize = chunksize(t);\n    bindex_t idx;\n    compute_tree_index(tsize, idx);\n    assert(tindex == idx);\n    assert(tsize >= MIN_LARGE_SIZE);\n    assert(tsize >= minsize_for_tree_index(idx));\n    assert((idx == NTREEBINS - 1)\n           || (tsize < minsize_for_tree_index((idx + 1))));\n\n    do {                        /* traverse through chain of same-sized nodes */\n        do_check_any_chunk(m, ((mchunkptr) u));\n        assert(u->index == tindex);\n        assert(chunksize(u) == tsize);\n        assert(!cinuse(u));\n        assert(!next_pinuse(u));\n        assert(u->fd->bk == u);\n        assert(u->bk->fd == u);\n        if (u->parent == 0) {\n            assert(u->child[0] == 0);\n            assert(u->child[1] == 0);\n        } else {\n            assert(head == 0);  /* only one node on chain has parent */\n            head = u;\n            assert(u->parent != u);\n            assert(u->parent->child[0] == u ||\n                   u->parent->child[1] == u ||\n                   *((tbinptr *) (u->parent)) == u);\n            if (u->child[0] != 0) {\n                assert(u->child[0]->parent == u);\n                assert(u->child[0] != u);\n                do_check_tree(m, u->child[0]);\n            }\n            if (u->child[1] != 0) {\n                assert(u->child[1]->parent == u);\n                assert(u->child[1] != u);\n                do_check_tree(m, u->child[1]);\n            }\n            if (u->child[0] != 0 && u->child[1] != 0) {\n                assert(chunksize(u->child[0]) < chunksize(u->child[1]));\n            }\n        }\n        u = u->fd;\n    } while (u != t);\n    assert(head != 0);\n}\n\n/*  Check all the chunks in a treebin.  */\nstatic void\ndo_check_treebin(mstate m, bindex_t i)\n{\n    tbinptr *tb = treebin_at(m, i);\n    tchunkptr t = *tb;\n    int empty = (m->treemap & (1U << i)) == 0;\n    if (t == 0)\n        assert(empty);\n    if (!empty)\n        do_check_tree(m, t);\n}\n\n/*  Check all the chunks in a smallbin.  */\nstatic void\ndo_check_smallbin(mstate m, bindex_t i)\n{\n    sbinptr b = smallbin_at(m, i);\n    mchunkptr p = b->bk;\n    unsigned int empty = (m->smallmap & (1U << i)) == 0;\n    if (p == b)\n        assert(empty);\n    if (!empty) {\n        for (; p != b; p = p->bk) {\n            size_t size = chunksize(p);\n            mchunkptr q;\n            /* each chunk claims to be free */\n            do_check_free_chunk(m, p);\n            /* chunk belongs in bin */\n            assert(small_index(size) == i);\n            assert(p->bk == b || chunksize(p->bk) == chunksize(p));\n            /* chunk is followed by an inuse chunk */\n            q = next_chunk(p);\n            if (q->head != FENCEPOST_HEAD)\n                do_check_inuse_chunk(m, q);\n        }\n    }\n}\n\n/* Find x in a bin. Used in other check functions. */\nstatic int\nbin_find(mstate m, mchunkptr x)\n{\n    size_t size = chunksize(x);\n    if (is_small(size)) {\n        bindex_t sidx = small_index(size);\n        sbinptr b = smallbin_at(m, sidx);\n        if (smallmap_is_marked(m, sidx)) {\n            mchunkptr p = b;\n            do {\n                if (p == x)\n                    return 1;\n            } while ((p = p->fd) != b);\n        }\n    } else {\n        bindex_t tidx;\n        compute_tree_index(size, tidx);\n        if (treemap_is_marked(m, tidx)) {\n            tchunkptr t = *treebin_at(m, tidx);\n            size_t sizebits = size << leftshift_for_tree_index(tidx);\n            while (t != 0 && chunksize(t) != size) {\n                t = t->child[(sizebits >> (SIZE_T_BITSIZE - SIZE_T_ONE)) & 1];\n                sizebits <<= 1;\n            }\n            if (t != 0) {\n                tchunkptr u = t;\n                do {\n                    if (u == (tchunkptr) x)\n                        return 1;\n                } while ((u = u->fd) != t);\n            }\n        }\n    }\n    return 0;\n}\n\n/* Traverse each chunk and check it; return total */\nstatic size_t\ntraverse_and_check(mstate m)\n{\n    size_t sum = 0;\n    if (is_initialized(m)) {\n        msegmentptr s = &m->seg;\n        sum += m->topsize + TOP_FOOT_SIZE;\n        while (s != 0) {\n            mchunkptr q = align_as_chunk(s->base);\n            mchunkptr lastq = 0;\n            assert(pinuse(q));\n            while (segment_holds(s, q) &&\n                   q != m->top && q->head != FENCEPOST_HEAD) {\n                sum += chunksize(q);\n                if (cinuse(q)) {\n                    assert(!bin_find(m, q));\n                    do_check_inuse_chunk(m, q);\n                } else {\n                    assert(q == m->dv || bin_find(m, q));\n                    assert(lastq == 0 || cinuse(lastq));        /* Not 2 consecutive free */\n                    do_check_free_chunk(m, q);\n                }\n                lastq = q;\n                q = next_chunk(q);\n            }\n            s = s->next;\n        }\n    }\n    return sum;\n}\n\n/* Check all properties of malloc_state. */\nstatic void\ndo_check_malloc_state(mstate m)\n{\n    bindex_t i;\n    size_t total;\n    /* check bins */\n    for (i = 0; i < NSMALLBINS; ++i)\n        do_check_smallbin(m, i);\n    for (i = 0; i < NTREEBINS; ++i)\n        do_check_treebin(m, i);\n\n    if (m->dvsize != 0) {       /* check dv chunk */\n        do_check_any_chunk(m, m->dv);\n        assert(m->dvsize == chunksize(m->dv));\n        assert(m->dvsize >= MIN_CHUNK_SIZE);\n        assert(bin_find(m, m->dv) == 0);\n    }\n\n    if (m->top != 0) {          /* check top chunk */\n        do_check_top_chunk(m, m->top);\n        assert(m->topsize == chunksize(m->top));\n        assert(m->topsize > 0);\n        assert(bin_find(m, m->top) == 0);\n    }\n\n    total = traverse_and_check(m);\n    assert(total <= m->footprint);\n    assert(m->footprint <= m->max_footprint);\n}\n#endif /* DEBUG */\n\n/* ----------------------------- statistics ------------------------------ */\n\n#if !NO_MALLINFO\nstatic struct mallinfo\ninternal_mallinfo(mstate m)\n{\n    struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\n    if (!PREACTION(m)) {\n        check_malloc_state(m);\n        if (is_initialized(m)) {\n            size_t nfree = SIZE_T_ONE;  /* top always free */\n            size_t mfree = m->topsize + TOP_FOOT_SIZE;\n            size_t sum = mfree;\n            msegmentptr s = &m->seg;\n            while (s != 0) {\n                mchunkptr q = align_as_chunk(s->base);\n                while (segment_holds(s, q) &&\n                       q != m->top && q->head != FENCEPOST_HEAD) {\n                    size_t sz = chunksize(q);\n                    sum += sz;\n                    if (!cinuse(q)) {\n                        mfree += sz;\n                        ++nfree;\n                    }\n                    q = next_chunk(q);\n                }\n                s = s->next;\n            }\n\n            nm.arena = sum;\n            nm.ordblks = nfree;\n            nm.hblkhd = m->footprint - sum;\n            nm.usmblks = m->max_footprint;\n            nm.uordblks = m->footprint - mfree;\n            nm.fordblks = mfree;\n            nm.keepcost = m->topsize;\n        }\n\n        POSTACTION(m);\n    }\n    return nm;\n}\n#endif /* !NO_MALLINFO */\n\nstatic void\ninternal_malloc_stats(mstate m)\n{\n    if (!PREACTION(m)) {\n        size_t maxfp = 0;\n        size_t fp = 0;\n        size_t used = 0;\n        check_malloc_state(m);\n        if (is_initialized(m)) {\n            msegmentptr s = &m->seg;\n            maxfp = m->max_footprint;\n            fp = m->footprint;\n            used = fp - (m->topsize + TOP_FOOT_SIZE);\n\n            while (s != 0) {\n                mchunkptr q = align_as_chunk(s->base);\n                while (segment_holds(s, q) &&\n                       q != m->top && q->head != FENCEPOST_HEAD) {\n                    if (!cinuse(q))\n                        used -= chunksize(q);\n                    q = next_chunk(q);\n                }\n                s = s->next;\n            }\n        }\n#ifndef LACKS_STDIO_H\n        fprintf(stderr, \"max system bytes = %10lu\\n\",\n                (unsigned long) (maxfp));\n        fprintf(stderr, \"system bytes     = %10lu\\n\", (unsigned long) (fp));\n        fprintf(stderr, \"in use bytes     = %10lu\\n\", (unsigned long) (used));\n#endif\n\n        POSTACTION(m);\n    }\n}\n\n/* ----------------------- Operations on smallbins ----------------------- */\n\n/*\n  Various forms of linking and unlinking are defined as macros.  Even\n  the ones for trees, which are very long but have very short typical\n  paths.  This is ugly but reduces reliance on inlining support of\n  compilers.\n*/\n\n/* Link a free chunk into a smallbin  */\n#define insert_small_chunk(M, P, S) {\\\n  bindex_t I  = small_index(S);\\\n  mchunkptr B = smallbin_at(M, I);\\\n  mchunkptr F = B;\\\n  assert(S >= MIN_CHUNK_SIZE);\\\n  if (!smallmap_is_marked(M, I))\\\n    mark_smallmap(M, I);\\\n  else if (RTCHECK(ok_address(M, B->fd)))\\\n    F = B->fd;\\\n  else {\\\n    CORRUPTION_ERROR_ACTION(M);\\\n  }\\\n  B->fd = P;\\\n  F->bk = P;\\\n  P->fd = F;\\\n  P->bk = B;\\\n}\n\n/* Unlink a chunk from a smallbin  */\n#define unlink_small_chunk(M, P, S) {\\\n  mchunkptr F = P->fd;\\\n  mchunkptr B = P->bk;\\\n  bindex_t I = small_index(S);\\\n  assert(P != B);\\\n  assert(P != F);\\\n  assert(chunksize(P) == small_index2size(I));\\\n  if (F == B)\\\n    clear_smallmap(M, I);\\\n  else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\\\n                   (B == smallbin_at(M,I) || ok_address(M, B)))) {\\\n    F->bk = B;\\\n    B->fd = F;\\\n  }\\\n  else {\\\n    CORRUPTION_ERROR_ACTION(M);\\\n  }\\\n}\n\n/* Unlink the first chunk from a smallbin */\n#define unlink_first_small_chunk(M, B, P, I) {\\\n  mchunkptr F = P->fd;\\\n  assert(P != B);\\\n  assert(P != F);\\\n  assert(chunksize(P) == small_index2size(I));\\\n  if (B == F)\\\n    clear_smallmap(M, I);\\\n  else if (RTCHECK(ok_address(M, F))) {\\\n    B->fd = F;\\\n    F->bk = B;\\\n  }\\\n  else {\\\n    CORRUPTION_ERROR_ACTION(M);\\\n  }\\\n}\n\n/* Replace dv node, binning the old one */\n/* Used only when dvsize known to be small */\n#define replace_dv(M, P, S) {\\\n  size_t DVS = M->dvsize;\\\n  if (DVS != 0) {\\\n    mchunkptr DV = M->dv;\\\n    assert(is_small(DVS));\\\n    insert_small_chunk(M, DV, DVS);\\\n  }\\\n  M->dvsize = S;\\\n  M->dv = P;\\\n}\n\n/* ------------------------- Operations on trees ------------------------- */\n\n/* Insert chunk into tree */\n#define insert_large_chunk(M, X, S) {\\\n  tbinptr* H;\\\n  bindex_t I;\\\n  compute_tree_index(S, I);\\\n  H = treebin_at(M, I);\\\n  X->index = I;\\\n  X->child[0] = X->child[1] = 0;\\\n  if (!treemap_is_marked(M, I)) {\\\n    mark_treemap(M, I);\\\n    *H = X;\\\n    X->parent = (tchunkptr)H;\\\n    X->fd = X->bk = X;\\\n  }\\\n  else {\\\n    tchunkptr T = *H;\\\n    size_t K = S << leftshift_for_tree_index(I);\\\n    for (;;) {\\\n      if (chunksize(T) != S) {\\\n        tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\\\n        K <<= 1;\\\n        if (*C != 0)\\\n          T = *C;\\\n        else if (RTCHECK(ok_address(M, C))) {\\\n          *C = X;\\\n          X->parent = T;\\\n          X->fd = X->bk = X;\\\n          break;\\\n        }\\\n        else {\\\n          CORRUPTION_ERROR_ACTION(M);\\\n          break;\\\n        }\\\n      }\\\n      else {\\\n        tchunkptr F = T->fd;\\\n        if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\\\n          T->fd = F->bk = X;\\\n          X->fd = F;\\\n          X->bk = T;\\\n          X->parent = 0;\\\n          break;\\\n        }\\\n        else {\\\n          CORRUPTION_ERROR_ACTION(M);\\\n          break;\\\n        }\\\n      }\\\n    }\\\n  }\\\n}\n\n/*\n  Unlink steps:\n\n  1. If x is a chained node, unlink it from its same-sized fd/bk links\n     and choose its bk node as its replacement.\n  2. If x was the last node of its size, but not a leaf node, it must\n     be replaced with a leaf node (not merely one with an open left or\n     right), to make sure that lefts and rights of descendents\n     correspond properly to bit masks.  We use the rightmost descendent\n     of x.  We could use any other leaf, but this is easy to locate and\n     tends to counteract removal of leftmosts elsewhere, and so keeps\n     paths shorter than minimally guaranteed.  This doesn't loop much\n     because on average a node in a tree is near the bottom.\n  3. If x is the base of a chain (i.e., has parent links) relink\n     x's parent and children to x's replacement (or null if none).\n*/\n\n#define unlink_large_chunk(M, X) {\\\n  tchunkptr XP = X->parent;\\\n  tchunkptr R;\\\n  if (X->bk != X) {\\\n    tchunkptr F = X->fd;\\\n    R = X->bk;\\\n    if (RTCHECK(ok_address(M, F))) {\\\n      F->bk = R;\\\n      R->fd = F;\\\n    }\\\n    else {\\\n      CORRUPTION_ERROR_ACTION(M);\\\n    }\\\n  }\\\n  else {\\\n    tchunkptr* RP;\\\n    if (((R = *(RP = &(X->child[1]))) != 0) ||\\\n        ((R = *(RP = &(X->child[0]))) != 0)) {\\\n      tchunkptr* CP;\\\n      while ((*(CP = &(R->child[1])) != 0) ||\\\n             (*(CP = &(R->child[0])) != 0)) {\\\n        R = *(RP = CP);\\\n      }\\\n      if (RTCHECK(ok_address(M, RP)))\\\n        *RP = 0;\\\n      else {\\\n        CORRUPTION_ERROR_ACTION(M);\\\n      }\\\n    }\\\n  }\\\n  if (XP != 0) {\\\n    tbinptr* H = treebin_at(M, X->index);\\\n    if (X == *H) {\\\n      if ((*H = R) == 0) \\\n        clear_treemap(M, X->index);\\\n    }\\\n    else if (RTCHECK(ok_address(M, XP))) {\\\n      if (XP->child[0] == X) \\\n        XP->child[0] = R;\\\n      else \\\n        XP->child[1] = R;\\\n    }\\\n    else\\\n      CORRUPTION_ERROR_ACTION(M);\\\n    if (R != 0) {\\\n      if (RTCHECK(ok_address(M, R))) {\\\n        tchunkptr C0, C1;\\\n        R->parent = XP;\\\n        if ((C0 = X->child[0]) != 0) {\\\n          if (RTCHECK(ok_address(M, C0))) {\\\n            R->child[0] = C0;\\\n            C0->parent = R;\\\n          }\\\n          else\\\n            CORRUPTION_ERROR_ACTION(M);\\\n        }\\\n        if ((C1 = X->child[1]) != 0) {\\\n          if (RTCHECK(ok_address(M, C1))) {\\\n            R->child[1] = C1;\\\n            C1->parent = R;\\\n          }\\\n          else\\\n            CORRUPTION_ERROR_ACTION(M);\\\n        }\\\n      }\\\n      else\\\n        CORRUPTION_ERROR_ACTION(M);\\\n    }\\\n  }\\\n}\n\n/* Relays to large vs small bin operations */\n\n#define insert_chunk(M, P, S)\\\n  if (is_small(S)) insert_small_chunk(M, P, S)\\\n  else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }\n\n#define unlink_chunk(M, P, S)\\\n  if (is_small(S)) unlink_small_chunk(M, P, S)\\\n  else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }\n\n\n/* Relays to internal calls to malloc/free from realloc, memalign etc */\n\n#if ONLY_MSPACES\n#define internal_malloc(m, b) mspace_malloc(m, b)\n#define internal_free(m, mem) mspace_free(m,mem);\n#else /* ONLY_MSPACES */\n#if MSPACES\n#define internal_malloc(m, b)\\\n   (m == gm)? dlmalloc(b) : mspace_malloc(m, b)\n#define internal_free(m, mem)\\\n   if (m == gm) dlfree(mem); else mspace_free(m,mem);\n#else /* MSPACES */\n#define internal_malloc(m, b) dlmalloc(b)\n#define internal_free(m, mem) dlfree(mem)\n#endif /* MSPACES */\n#endif /* ONLY_MSPACES */\n\n/* -----------------------  Direct-mmapping chunks ----------------------- */\n\n/*\n  Directly mmapped chunks are set up with an offset to the start of\n  the mmapped region stored in the prev_foot field of the chunk. This\n  allows reconstruction of the required argument to MUNMAP when freed,\n  and also allows adjustment of the returned chunk to meet alignment\n  requirements (especially in memalign).  There is also enough space\n  allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain\n  the PINUSE bit so frees can be checked.\n*/\n\n/* Malloc using mmap */\nstatic void *\nmmap_alloc(mstate m, size_t nb)\n{\n    size_t mmsize =\n        granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);\n    if (mmsize > nb) {          /* Check for wrap around 0 */\n        char *mm = (char *) (DIRECT_MMAP(mmsize));\n        if (mm != CMFAIL) {\n            size_t offset = align_offset(chunk2mem(mm));\n            size_t psize = mmsize - offset - MMAP_FOOT_PAD;\n            mchunkptr p = (mchunkptr) (mm + offset);\n            p->prev_foot = offset | IS_MMAPPED_BIT;\n            (p)->head = (psize | CINUSE_BIT);\n            mark_inuse_foot(m, p, psize);\n            chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;\n            chunk_plus_offset(p, psize + SIZE_T_SIZE)->head = 0;\n\n            if (mm < m->least_addr)\n                m->least_addr = mm;\n            if ((m->footprint += mmsize) > m->max_footprint)\n                m->max_footprint = m->footprint;\n            assert(is_aligned(chunk2mem(p)));\n            check_mmapped_chunk(m, p);\n            return chunk2mem(p);\n        }\n    }\n    return 0;\n}\n\n/* Realloc using mmap */\nstatic mchunkptr\nmmap_resize(mstate m, mchunkptr oldp, size_t nb)\n{\n    size_t oldsize = chunksize(oldp);\n    if (is_small(nb))           /* Can't shrink mmap regions below small size */\n        return 0;\n    /* Keep old chunk if big enough but not too big */\n    if (oldsize >= nb + SIZE_T_SIZE &&\n        (oldsize - nb) <= (mparams.granularity << 1))\n        return oldp;\n    else {\n        size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT;\n        size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD;\n        size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES +\n                                             CHUNK_ALIGN_MASK);\n        char *cp = (char *) CALL_MREMAP((char *) oldp - offset,\n                                        oldmmsize, newmmsize, 1);\n        if (cp != CMFAIL) {\n            mchunkptr newp = (mchunkptr) (cp + offset);\n            size_t psize = newmmsize - offset - MMAP_FOOT_PAD;\n            newp->head = (psize | CINUSE_BIT);\n            mark_inuse_foot(m, newp, psize);\n            chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;\n            chunk_plus_offset(newp, psize + SIZE_T_SIZE)->head = 0;\n\n            if (cp < m->least_addr)\n                m->least_addr = cp;\n            if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint)\n                m->max_footprint = m->footprint;\n            check_mmapped_chunk(m, newp);\n            return newp;\n        }\n    }\n    return 0;\n}\n\n/* -------------------------- mspace management -------------------------- */\n\n/* Initialize top chunk and its size */\nstatic void\ninit_top(mstate m, mchunkptr p, size_t psize)\n{\n    /* Ensure alignment */\n    size_t offset = align_offset(chunk2mem(p));\n    p = (mchunkptr) ((char *) p + offset);\n    psize -= offset;\n\n    m->top = p;\n    m->topsize = psize;\n    p->head = psize | PINUSE_BIT;\n    /* set size of fake trailing chunk holding overhead space only once */\n    chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;\n    m->trim_check = mparams.trim_threshold;     /* reset on each update */\n}\n\n/* Initialize bins for a new mstate that is otherwise zeroed out */\nstatic void\ninit_bins(mstate m)\n{\n    /* Establish circular links for smallbins */\n    bindex_t i;\n    for (i = 0; i < NSMALLBINS; ++i) {\n        sbinptr bin = smallbin_at(m, i);\n        bin->fd = bin->bk = bin;\n    }\n}\n\n#if PROCEED_ON_ERROR\n\n/* default corruption action */\nstatic void\nreset_on_error(mstate m)\n{\n    int i;\n    ++malloc_corruption_error_count;\n    /* Reinitialize fields to forget about all memory */\n    m->smallbins = m->treebins = 0;\n    m->dvsize = m->topsize = 0;\n    m->seg.base = 0;\n    m->seg.size = 0;\n    m->seg.next = 0;\n    m->top = m->dv = 0;\n    for (i = 0; i < NTREEBINS; ++i)\n        *treebin_at(m, i) = 0;\n    init_bins(m);\n}\n#endif /* PROCEED_ON_ERROR */\n\n/* Allocate chunk and prepend remainder with chunk in successor base. */\nstatic void *\nprepend_alloc(mstate m, char *newbase, char *oldbase, size_t nb)\n{\n    mchunkptr p = align_as_chunk(newbase);\n    mchunkptr oldfirst = align_as_chunk(oldbase);\n    size_t psize = (char *) oldfirst - (char *) p;\n    mchunkptr q = chunk_plus_offset(p, nb);\n    size_t qsize = psize - nb;\n    set_size_and_pinuse_of_inuse_chunk(m, p, nb);\n\n    assert((char *) oldfirst > (char *) q);\n    assert(pinuse(oldfirst));\n    assert(qsize >= MIN_CHUNK_SIZE);\n\n    /* consolidate remainder with first chunk of old base */\n    if (oldfirst == m->top) {\n        size_t tsize = m->topsize += qsize;\n        m->top = q;\n        q->head = tsize | PINUSE_BIT;\n        check_top_chunk(m, q);\n    } else if (oldfirst == m->dv) {\n        size_t dsize = m->dvsize += qsize;\n        m->dv = q;\n        set_size_and_pinuse_of_free_chunk(q, dsize);\n    } else {\n        if (!cinuse(oldfirst)) {\n            size_t nsize = chunksize(oldfirst);\n            unlink_chunk(m, oldfirst, nsize);\n            oldfirst = chunk_plus_offset(oldfirst, nsize);\n            qsize += nsize;\n        }\n        set_free_with_pinuse(q, qsize, oldfirst);\n        insert_chunk(m, q, qsize);\n        check_free_chunk(m, q);\n    }\n\n    check_malloced_chunk(m, chunk2mem(p), nb);\n    return chunk2mem(p);\n}\n\n\n/* Add a segment to hold a new noncontiguous region */\nstatic void\nadd_segment(mstate m, char *tbase, size_t tsize, flag_t mmapped)\n{\n    /* Determine locations and sizes of segment, fenceposts, old top */\n    char *old_top = (char *) m->top;\n    msegmentptr oldsp = segment_holding(m, old_top);\n    char *old_end = oldsp->base + oldsp->size;\n    size_t ssize = pad_request(sizeof(struct malloc_segment));\n    char *rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);\n    size_t offset = align_offset(chunk2mem(rawsp));\n    char *asp = rawsp + offset;\n    char *csp = (asp < (old_top + MIN_CHUNK_SIZE)) ? old_top : asp;\n    mchunkptr sp = (mchunkptr) csp;\n    msegmentptr ss = (msegmentptr) (chunk2mem(sp));\n    mchunkptr tnext = chunk_plus_offset(sp, ssize);\n    mchunkptr p = tnext;\n    int nfences = 0;\n\n    /* reset top to new space */\n    init_top(m, (mchunkptr) tbase, tsize - TOP_FOOT_SIZE);\n\n    /* Set up segment record */\n    assert(is_aligned(ss));\n    set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);\n    *ss = m->seg;               /* Push current record */\n    m->seg.base = tbase;\n    m->seg.size = tsize;\n    m->seg.sflags = mmapped;\n    m->seg.next = ss;\n\n    /* Insert trailing fenceposts */\n    for (;;) {\n        mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);\n        p->head = FENCEPOST_HEAD;\n        ++nfences;\n        if ((char *) (&(nextp->head)) < old_end)\n            p = nextp;\n        else\n            break;\n    }\n    assert(nfences >= 2);\n\n    /* Insert the rest of old top into a bin as an ordinary free chunk */\n    if (csp != old_top) {\n        mchunkptr q = (mchunkptr) old_top;\n        size_t psize = csp - old_top;\n        mchunkptr tn = chunk_plus_offset(q, psize);\n        set_free_with_pinuse(q, psize, tn);\n        insert_chunk(m, q, psize);\n    }\n\n    check_top_chunk(m, m->top);\n}\n\n/* -------------------------- System allocation -------------------------- */\n\n/* Get memory from system using MORECORE or MMAP */\nstatic void *\nsys_alloc(mstate m, size_t nb)\n{\n    char *tbase = CMFAIL;\n    size_t tsize = 0;\n    flag_t mmap_flag = 0;\n\n    init_mparams();\n\n    /* Directly map large chunks */\n    if (use_mmap(m) && nb >= mparams.mmap_threshold) {\n        void *mem = mmap_alloc(m, nb);\n        if (mem != 0)\n            return mem;\n    }\n\n    /*\n       Try getting memory in any of three ways (in most-preferred to\n       least-preferred order):\n       1. A call to MORECORE that can normally contiguously extend memory.\n       (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or\n       or main space is mmapped or a previous contiguous call failed)\n       2. A call to MMAP new space (disabled if not HAVE_MMAP).\n       Note that under the default settings, if MORECORE is unable to\n       fulfill a request, and HAVE_MMAP is true, then mmap is\n       used as a noncontiguous system allocator. This is a useful backup\n       strategy for systems with holes in address spaces -- in this case\n       sbrk cannot contiguously expand the heap, but mmap may be able to\n       find space.\n       3. A call to MORECORE that cannot usually contiguously extend memory.\n       (disabled if not HAVE_MORECORE)\n     */\n\n    if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) {\n        char *br = CMFAIL;\n        msegmentptr ss =\n            (m->top == 0) ? 0 : segment_holding(m, (char *) m->top);\n        size_t asize = 0;\n        ACQUIRE_MORECORE_LOCK();\n\n        if (ss == 0) {          /* First time through or recovery */\n            char *base = (char *) CALL_MORECORE(0);\n            if (base != CMFAIL) {\n                asize =\n                    granularity_align(nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT +\n                                      SIZE_T_ONE);\n                /* Adjust to end on a page boundary */\n                if (!is_page_aligned(base))\n                    asize += (page_align((size_t) base) - (size_t) base);\n                /* Can't call MORECORE if size is negative when treated as signed */\n                if (asize < HALF_MAX_SIZE_T &&\n                    (br = (char *) (CALL_MORECORE(asize))) == base) {\n                    tbase = base;\n                    tsize = asize;\n                }\n            }\n        } else {\n            /* Subtract out existing available top space from MORECORE request. */\n            asize =\n                granularity_align(nb - m->topsize + TOP_FOOT_SIZE +\n                                  MALLOC_ALIGNMENT + SIZE_T_ONE);\n            /* Use mem here only if it did continuously extend old space */\n            if (asize < HALF_MAX_SIZE_T &&\n                (br =\n                 (char *) (CALL_MORECORE(asize))) == ss->base + ss->size) {\n                tbase = br;\n                tsize = asize;\n            }\n        }\n\n        if (tbase == CMFAIL) {  /* Cope with partial failure */\n            if (br != CMFAIL) { /* Try to use/extend the space we did get */\n                if (asize < HALF_MAX_SIZE_T &&\n                    asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) {\n                    size_t esize =\n                        granularity_align(nb + TOP_FOOT_SIZE +\n                                          MALLOC_ALIGNMENT + SIZE_T_ONE -\n                                          asize);\n                    if (esize < HALF_MAX_SIZE_T) {\n                        char *end = (char *) CALL_MORECORE(esize);\n                        if (end != CMFAIL)\n                            asize += esize;\n                        else {  /* Can't use; try to release */\n                            end = (char *) CALL_MORECORE(-asize);\n                            br = CMFAIL;\n                        }\n                    }\n                }\n            }\n            if (br != CMFAIL) { /* Use the space we did get */\n                tbase = br;\n                tsize = asize;\n            } else\n                disable_contiguous(m);  /* Don't try contiguous path in the future */\n        }\n\n        RELEASE_MORECORE_LOCK();\n    }\n\n    if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */\n        size_t req = nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT + SIZE_T_ONE;\n        size_t rsize = granularity_align(req);\n        if (rsize > nb) {       /* Fail if wraps around zero */\n            char *mp = (char *) (CALL_MMAP(rsize));\n            if (mp != CMFAIL) {\n                tbase = mp;\n                tsize = rsize;\n                mmap_flag = IS_MMAPPED_BIT;\n            }\n        }\n    }\n\n    if (HAVE_MORECORE && tbase == CMFAIL) {     /* Try noncontiguous MORECORE */\n        size_t asize =\n            granularity_align(nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT +\n                              SIZE_T_ONE);\n        if (asize < HALF_MAX_SIZE_T) {\n            char *br = CMFAIL;\n            char *end = CMFAIL;\n            ACQUIRE_MORECORE_LOCK();\n            br = (char *) (CALL_MORECORE(asize));\n            end = (char *) (CALL_MORECORE(0));\n            RELEASE_MORECORE_LOCK();\n            if (br != CMFAIL && end != CMFAIL && br < end) {\n                size_t ssize = end - br;\n                if (ssize > nb + TOP_FOOT_SIZE) {\n                    tbase = br;\n                    tsize = ssize;\n                }\n            }\n        }\n    }\n\n    if (tbase != CMFAIL) {\n\n        if ((m->footprint += tsize) > m->max_footprint)\n            m->max_footprint = m->footprint;\n\n        if (!is_initialized(m)) {       /* first-time initialization */\n            m->seg.base = m->least_addr = tbase;\n            m->seg.size = tsize;\n            m->seg.sflags = mmap_flag;\n            m->magic = mparams.magic;\n            init_bins(m);\n            if (is_global(m))\n                init_top(m, (mchunkptr) tbase, tsize - TOP_FOOT_SIZE);\n            else {\n                /* Offset top by embedded malloc_state */\n                mchunkptr mn = next_chunk(mem2chunk(m));\n                init_top(m, mn,\n                         (size_t) ((tbase + tsize) - (char *) mn) -\n                         TOP_FOOT_SIZE);\n            }\n        }\n\n        else {\n            /* Try to merge with an existing segment */\n            msegmentptr sp = &m->seg;\n            while (sp != 0 && tbase != sp->base + sp->size)\n                sp = sp->next;\n            if (sp != 0 && !is_extern_segment(sp) && (sp->sflags & IS_MMAPPED_BIT) == mmap_flag && segment_holds(sp, m->top)) { /* append */\n                sp->size += tsize;\n                init_top(m, m->top, m->topsize + tsize);\n            } else {\n                if (tbase < m->least_addr)\n                    m->least_addr = tbase;\n                sp = &m->seg;\n                while (sp != 0 && sp->base != tbase + tsize)\n                    sp = sp->next;\n                if (sp != 0 &&\n                    !is_extern_segment(sp) &&\n                    (sp->sflags & IS_MMAPPED_BIT) == mmap_flag) {\n                    char *oldbase = sp->base;\n                    sp->base = tbase;\n                    sp->size += tsize;\n                    return prepend_alloc(m, tbase, oldbase, nb);\n                } else\n                    add_segment(m, tbase, tsize, mmap_flag);\n            }\n        }\n\n        if (nb < m->topsize) {  /* Allocate from new or extended top space */\n            size_t rsize = m->topsize -= nb;\n            mchunkptr p = m->top;\n            mchunkptr r = m->top = chunk_plus_offset(p, nb);\n            r->head = rsize | PINUSE_BIT;\n            set_size_and_pinuse_of_inuse_chunk(m, p, nb);\n            check_top_chunk(m, m->top);\n            check_malloced_chunk(m, chunk2mem(p), nb);\n            return chunk2mem(p);\n        }\n    }\n\n    MALLOC_FAILURE_ACTION;\n    return 0;\n}\n\n/* -----------------------  system deallocation -------------------------- */\n\n/* Unmap and unlink any mmapped segments that don't contain used chunks */\nstatic size_t\nrelease_unused_segments(mstate m)\n{\n    size_t released = 0;\n    msegmentptr pred = &m->seg;\n    msegmentptr sp = pred->next;\n    while (sp != 0) {\n        char *base = sp->base;\n        size_t size = sp->size;\n        msegmentptr next = sp->next;\n        if (is_mmapped_segment(sp) && !is_extern_segment(sp)) {\n            mchunkptr p = align_as_chunk(base);\n            size_t psize = chunksize(p);\n            /* Can unmap if first chunk holds entire segment and not pinned */\n            if (!cinuse(p)\n                && (char *) p + psize >= base + size - TOP_FOOT_SIZE) {\n                tchunkptr tp = (tchunkptr) p;\n                assert(segment_holds(sp, (char *) sp));\n                if (p == m->dv) {\n                    m->dv = 0;\n                    m->dvsize = 0;\n                } else {\n                    unlink_large_chunk(m, tp);\n                }\n                if (CALL_MUNMAP(base, size) == 0) {\n                    released += size;\n                    m->footprint -= size;\n                    /* unlink obsoleted record */\n                    sp = pred;\n                    sp->next = next;\n                } else {        /* back out if cannot unmap */\n                    insert_large_chunk(m, tp, psize);\n                }\n            }\n        }\n        pred = sp;\n        sp = next;\n    }\n    return released;\n}\n\nstatic int\nsys_trim(mstate m, size_t pad)\n{\n    size_t released = 0;\n    if (pad < MAX_REQUEST && is_initialized(m)) {\n        pad += TOP_FOOT_SIZE;   /* ensure enough room for segment overhead */\n\n        if (m->topsize > pad) {\n            /* Shrink top space in granularity-size units, keeping at least one */\n            size_t unit = mparams.granularity;\n            size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -\n                            SIZE_T_ONE) * unit;\n            msegmentptr sp = segment_holding(m, (char *) m->top);\n\n            if (!is_extern_segment(sp)) {\n                if (is_mmapped_segment(sp)) {\n                    if (HAVE_MMAP && sp->size >= extra && !has_segment_link(m, sp)) {   /* can't shrink if pinned */\n                        size_t newsize = sp->size - extra;\n                        /* Prefer mremap, fall back to munmap */\n                        if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) !=\n                             MFAIL)\n                            || (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {\n                            released = extra;\n                        }\n                    }\n                } else if (HAVE_MORECORE) {\n                    if (extra >= HALF_MAX_SIZE_T)       /* Avoid wrapping negative */\n                        extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit;\n                    ACQUIRE_MORECORE_LOCK();\n                    {\n                        /* Make sure end of memory is where we last set it. */\n                        char *old_br = (char *) (CALL_MORECORE(0));\n                        if (old_br == sp->base + sp->size) {\n                            char *rel_br = (char *) (CALL_MORECORE(-extra));\n                            char *new_br = (char *) (CALL_MORECORE(0));\n                            if (rel_br != CMFAIL && new_br < old_br)\n                                released = old_br - new_br;\n                        }\n                    }\n                    RELEASE_MORECORE_LOCK();\n                }\n            }\n\n            if (released != 0) {\n                sp->size -= released;\n                m->footprint -= released;\n                init_top(m, m->top, m->topsize - released);\n                check_top_chunk(m, m->top);\n            }\n        }\n\n        /* Unmap any unused mmapped segments */\n        if (HAVE_MMAP)\n            released += release_unused_segments(m);\n\n        /* On failure, disable autotrim to avoid repeated failed future calls */\n        if (released == 0)\n            m->trim_check = MAX_SIZE_T;\n    }\n\n    return (released != 0) ? 1 : 0;\n}\n\n/* ---------------------------- malloc support --------------------------- */\n\n/* allocate a large request from the best fitting chunk in a treebin */\nstatic void *\ntmalloc_large(mstate m, size_t nb)\n{\n    tchunkptr v = 0;\n    size_t rsize = -nb;         /* Unsigned negation */\n    tchunkptr t;\n    bindex_t idx;\n    compute_tree_index(nb, idx);\n\n    if ((t = *treebin_at(m, idx)) != 0) {\n        /* Traverse tree for this bin looking for node with size == nb */\n        size_t sizebits = nb << leftshift_for_tree_index(idx);\n        tchunkptr rst = 0;      /* The deepest untaken right subtree */\n        for (;;) {\n            tchunkptr rt;\n            size_t trem = chunksize(t) - nb;\n            if (trem < rsize) {\n                v = t;\n                if ((rsize = trem) == 0)\n                    break;\n            }\n            rt = t->child[1];\n            t = t->child[(sizebits >> (SIZE_T_BITSIZE - SIZE_T_ONE)) & 1];\n            if (rt != 0 && rt != t)\n                rst = rt;\n            if (t == 0) {\n                t = rst;        /* set t to least subtree holding sizes > nb */\n                break;\n            }\n            sizebits <<= 1;\n        }\n    }\n\n    if (t == 0 && v == 0) {     /* set t to root of next non-empty treebin */\n        binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;\n        if (leftbits != 0) {\n            bindex_t i;\n            binmap_t leastbit = least_bit(leftbits);\n            compute_bit2idx(leastbit, i);\n            t = *treebin_at(m, i);\n        }\n    }\n\n    while (t != 0) {            /* find smallest of tree or subtree */\n        size_t trem = chunksize(t) - nb;\n        if (trem < rsize) {\n            rsize = trem;\n            v = t;\n        }\n        t = leftmost_child(t);\n    }\n\n    /*  If dv is a better fit, return 0 so malloc will use it */\n    if (v != 0 && rsize < (size_t) (m->dvsize - nb)) {\n        if (RTCHECK(ok_address(m, v))) {        /* split */\n            mchunkptr r = chunk_plus_offset(v, nb);\n            assert(chunksize(v) == rsize + nb);\n            if (RTCHECK(ok_next(v, r))) {\n                unlink_large_chunk(m, v);\n                if (rsize < MIN_CHUNK_SIZE)\n                    set_inuse_and_pinuse(m, v, (rsize + nb));\n                else {\n                    set_size_and_pinuse_of_inuse_chunk(m, v, nb);\n                    set_size_and_pinuse_of_free_chunk(r, rsize);\n                    insert_chunk(m, r, rsize);\n                }\n                return chunk2mem(v);\n            }\n        }\n        CORRUPTION_ERROR_ACTION(m);\n    }\n    return 0;\n}\n\n/* allocate a small request from the best fitting chunk in a treebin */\nstatic void *\ntmalloc_small(mstate m, size_t nb)\n{\n    tchunkptr t, v;\n    size_t rsize;\n    bindex_t i;\n    binmap_t leastbit = least_bit(m->treemap);\n    compute_bit2idx(leastbit, i);\n\n    v = t = *treebin_at(m, i);\n    rsize = chunksize(t) - nb;\n\n    while ((t = leftmost_child(t)) != 0) {\n        size_t trem = chunksize(t) - nb;\n        if (trem < rsize) {\n            rsize = trem;\n            v = t;\n        }\n    }\n\n    if (RTCHECK(ok_address(m, v))) {\n        mchunkptr r = chunk_plus_offset(v, nb);\n        assert(chunksize(v) == rsize + nb);\n        if (RTCHECK(ok_next(v, r))) {\n            unlink_large_chunk(m, v);\n            if (rsize < MIN_CHUNK_SIZE)\n                set_inuse_and_pinuse(m, v, (rsize + nb));\n            else {\n                set_size_and_pinuse_of_inuse_chunk(m, v, nb);\n                set_size_and_pinuse_of_free_chunk(r, rsize);\n                replace_dv(m, r, rsize);\n            }\n            return chunk2mem(v);\n        }\n    }\n\n    CORRUPTION_ERROR_ACTION(m);\n    return 0;\n}\n\n/* --------------------------- realloc support --------------------------- */\n\nstatic void *\ninternal_realloc(mstate m, void *oldmem, size_t bytes)\n{\n    if (bytes >= MAX_REQUEST) {\n        MALLOC_FAILURE_ACTION;\n        return 0;\n    }\n    if (!PREACTION(m)) {\n        mchunkptr oldp = mem2chunk(oldmem);\n        size_t oldsize = chunksize(oldp);\n        mchunkptr next = chunk_plus_offset(oldp, oldsize);\n        mchunkptr newp = 0;\n        void *extra = 0;\n\n        /* Try to either shrink or extend into top. Else malloc-copy-free */\n\n        if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) &&\n                    ok_next(oldp, next) && ok_pinuse(next))) {\n            size_t nb = request2size(bytes);\n            if (is_mmapped(oldp))\n                newp = mmap_resize(m, oldp, nb);\n            else if (oldsize >= nb) {   /* already big enough */\n                size_t rsize = oldsize - nb;\n                newp = oldp;\n                if (rsize >= MIN_CHUNK_SIZE) {\n                    mchunkptr remainder = chunk_plus_offset(newp, nb);\n                    set_inuse(m, newp, nb);\n                    set_inuse(m, remainder, rsize);\n                    extra = chunk2mem(remainder);\n                }\n            } else if (next == m->top && oldsize + m->topsize > nb) {\n                /* Expand into top */\n                size_t newsize = oldsize + m->topsize;\n                size_t newtopsize = newsize - nb;\n                mchunkptr newtop = chunk_plus_offset(oldp, nb);\n                set_inuse(m, oldp, nb);\n                newtop->head = newtopsize | PINUSE_BIT;\n                m->top = newtop;\n                m->topsize = newtopsize;\n                newp = oldp;\n            }\n        } else {\n            USAGE_ERROR_ACTION(m, oldmem);\n            POSTACTION(m);\n            return 0;\n        }\n\n        POSTACTION(m);\n\n        if (newp != 0) {\n            if (extra != 0) {\n                internal_free(m, extra);\n            }\n            check_inuse_chunk(m, newp);\n            return chunk2mem(newp);\n        } else {\n            void *newmem = internal_malloc(m, bytes);\n            if (newmem != 0) {\n                size_t oc = oldsize - overhead_for(oldp);\n                memcpy(newmem, oldmem, (oc < bytes) ? oc : bytes);\n                internal_free(m, oldmem);\n            }\n            return newmem;\n        }\n    }\n    return 0;\n}\n\n/* --------------------------- memalign support -------------------------- */\n\nstatic void *\ninternal_memalign(mstate m, size_t alignment, size_t bytes)\n{\n    if (alignment <= MALLOC_ALIGNMENT)  /* Can just use malloc */\n        return internal_malloc(m, bytes);\n    if (alignment < MIN_CHUNK_SIZE)     /* must be at least a minimum chunk size */\n        alignment = MIN_CHUNK_SIZE;\n    if ((alignment & (alignment - SIZE_T_ONE)) != 0) {  /* Ensure a power of 2 */\n        size_t a = MALLOC_ALIGNMENT << 1;\n        while (a < alignment)\n            a <<= 1;\n        alignment = a;\n    }\n\n    if (bytes >= MAX_REQUEST - alignment) {\n        if (m != 0) {           /* Test isn't needed but avoids compiler warning */\n            MALLOC_FAILURE_ACTION;\n        }\n    } else {\n        size_t nb = request2size(bytes);\n        size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD;\n        char *mem = (char *) internal_malloc(m, req);\n        if (mem != 0) {\n            void *leader = 0;\n            void *trailer = 0;\n            mchunkptr p = mem2chunk(mem);\n\n            if (PREACTION(m))\n                return 0;\n            if ((((size_t) (mem)) % alignment) != 0) {  /* misaligned */\n                /*\n                   Find an aligned spot inside chunk.  Since we need to give\n                   back leading space in a chunk of at least MIN_CHUNK_SIZE, if\n                   the first calculation places us at a spot with less than\n                   MIN_CHUNK_SIZE leader, we can move to the next aligned spot.\n                   We've allocated enough total room so that this is always\n                   possible.\n                 */\n                char *br = (char *) mem2chunk((size_t) (((size_t) (mem +\n                                                                   alignment -\n                                                                   SIZE_T_ONE))\n                                                        & -alignment));\n                char *pos =\n                    ((size_t) (br - (char *) (p)) >=\n                     MIN_CHUNK_SIZE) ? br : br + alignment;\n                mchunkptr newp = (mchunkptr) pos;\n                size_t leadsize = pos - (char *) (p);\n                size_t newsize = chunksize(p) - leadsize;\n\n                if (is_mmapped(p)) {    /* For mmapped chunks, just adjust offset */\n                    newp->prev_foot = p->prev_foot + leadsize;\n                    newp->head = (newsize | CINUSE_BIT);\n                } else {        /* Otherwise, give back leader, use the rest */\n                    set_inuse(m, newp, newsize);\n                    set_inuse(m, p, leadsize);\n                    leader = chunk2mem(p);\n                }\n                p = newp;\n            }\n\n            /* Give back spare room at the end */\n            if (!is_mmapped(p)) {\n                size_t size = chunksize(p);\n                if (size > nb + MIN_CHUNK_SIZE) {\n                    size_t remainder_size = size - nb;\n                    mchunkptr remainder = chunk_plus_offset(p, nb);\n                    set_inuse(m, p, nb);\n                    set_inuse(m, remainder, remainder_size);\n                    trailer = chunk2mem(remainder);\n                }\n            }\n\n            assert(chunksize(p) >= nb);\n            assert((((size_t) (chunk2mem(p))) % alignment) == 0);\n            check_inuse_chunk(m, p);\n            POSTACTION(m);\n            if (leader != 0) {\n                internal_free(m, leader);\n            }\n            if (trailer != 0) {\n                internal_free(m, trailer);\n            }\n            return chunk2mem(p);\n        }\n    }\n    return 0;\n}\n\n/* ------------------------ comalloc/coalloc support --------------------- */\n\nstatic void **\nialloc(mstate m, size_t n_elements, size_t * sizes, int opts, void *chunks[])\n{\n    /*\n       This provides common support for independent_X routines, handling\n       all of the combinations that can result.\n\n       The opts arg has:\n       bit 0 set if all elements are same size (using sizes[0])\n       bit 1 set if elements should be zeroed\n     */\n\n    size_t element_size;        /* chunksize of each element, if all same */\n    size_t contents_size;       /* total size of elements */\n    size_t array_size;          /* request size of pointer array */\n    void *mem;                  /* malloced aggregate space */\n    mchunkptr p;                /* corresponding chunk */\n    size_t remainder_size;      /* remaining bytes while splitting */\n    void **marray;              /* either \"chunks\" or malloced ptr array */\n    mchunkptr array_chunk;      /* chunk for malloced ptr array */\n    flag_t was_enabled;         /* to disable mmap */\n    size_t size;\n    size_t i;\n\n    /* compute array length, if needed */\n    if (chunks != 0) {\n        if (n_elements == 0)\n            return chunks;      /* nothing to do */\n        marray = chunks;\n        array_size = 0;\n    } else {\n        /* if empty req, must still return chunk representing empty array */\n        if (n_elements == 0)\n            return (void **) internal_malloc(m, 0);\n        marray = 0;\n        array_size = request2size(n_elements * (sizeof(void *)));\n    }\n\n    /* compute total element size */\n    if (opts & 0x1) {           /* all-same-size */\n        element_size = request2size(*sizes);\n        contents_size = n_elements * element_size;\n    } else {                    /* add up all the sizes */\n        element_size = 0;\n        contents_size = 0;\n        for (i = 0; i != n_elements; ++i)\n            contents_size += request2size(sizes[i]);\n    }\n\n    size = contents_size + array_size;\n\n    /*\n       Allocate the aggregate chunk.  First disable direct-mmapping so\n       malloc won't use it, since we would not be able to later\n       free/realloc space internal to a segregated mmap region.\n     */\n    was_enabled = use_mmap(m);\n    disable_mmap(m);\n    mem = internal_malloc(m, size - CHUNK_OVERHEAD);\n    if (was_enabled)\n        enable_mmap(m);\n    if (mem == 0)\n        return 0;\n\n    if (PREACTION(m))\n        return 0;\n    p = mem2chunk(mem);\n    remainder_size = chunksize(p);\n\n    assert(!is_mmapped(p));\n\n    if (opts & 0x2) {           /* optionally clear the elements */\n        memset((size_t *) mem, 0, remainder_size - SIZE_T_SIZE - array_size);\n    }\n\n    /* If not provided, allocate the pointer array as final part of chunk */\n    if (marray == 0) {\n        size_t array_chunk_size;\n        array_chunk = chunk_plus_offset(p, contents_size);\n        array_chunk_size = remainder_size - contents_size;\n        marray = (void **) (chunk2mem(array_chunk));\n        set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size);\n        remainder_size = contents_size;\n    }\n\n    /* split out elements */\n    for (i = 0;; ++i) {\n        marray[i] = chunk2mem(p);\n        if (i != n_elements - 1) {\n            if (element_size != 0)\n                size = element_size;\n            else\n                size = request2size(sizes[i]);\n            remainder_size -= size;\n            set_size_and_pinuse_of_inuse_chunk(m, p, size);\n            p = chunk_plus_offset(p, size);\n        } else {                /* the final element absorbs any overallocation slop */\n            set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size);\n            break;\n        }\n    }\n\n#if DEBUG\n    if (marray != chunks) {\n        /* final element must have exactly exhausted chunk */\n        if (element_size != 0) {\n            assert(remainder_size == element_size);\n        } else {\n            assert(remainder_size == request2size(sizes[i]));\n        }\n        check_inuse_chunk(m, mem2chunk(marray));\n    }\n    for (i = 0; i != n_elements; ++i)\n        check_inuse_chunk(m, mem2chunk(marray[i]));\n\n#endif /* DEBUG */\n\n    POSTACTION(m);\n    return marray;\n}\n\n\n/* -------------------------- public routines ---------------------------- */\n\n#if !ONLY_MSPACES\n\nvoid *\ndlmalloc(size_t bytes)\n{\n    /*\n       Basic algorithm:\n       If a small request (< 256 bytes minus per-chunk overhead):\n       1. If one exists, use a remainderless chunk in associated smallbin.\n       (Remainderless means that there are too few excess bytes to\n       represent as a chunk.)\n       2. If it is big enough, use the dv chunk, which is normally the\n       chunk adjacent to the one used for the most recent small request.\n       3. If one exists, split the smallest available chunk in a bin,\n       saving remainder in dv.\n       4. If it is big enough, use the top chunk.\n       5. If available, get memory from system and use it\n       Otherwise, for a large request:\n       1. Find the smallest available binned chunk that fits, and use it\n       if it is better fitting than dv chunk, splitting if necessary.\n       2. If better fitting than any binned chunk, use the dv chunk.\n       3. If it is big enough, use the top chunk.\n       4. If request size >= mmap threshold, try to directly mmap this chunk.\n       5. If available, get memory from system and use it\n\n       The ugly goto's here ensure that postaction occurs along all paths.\n     */\n\n    if (!PREACTION(gm)) {\n        void *mem;\n        size_t nb;\n        if (bytes <= MAX_SMALL_REQUEST) {\n            bindex_t idx;\n            binmap_t smallbits;\n            nb = (bytes < MIN_REQUEST) ? MIN_CHUNK_SIZE : pad_request(bytes);\n            idx = small_index(nb);\n            smallbits = gm->smallmap >> idx;\n\n            if ((smallbits & 0x3U) != 0) {      /* Remainderless fit to a smallbin. */\n                mchunkptr b, p;\n                idx += ~smallbits & 1;  /* Uses next bin if idx empty */\n                b = smallbin_at(gm, idx);\n                p = b->fd;\n                assert(chunksize(p) == small_index2size(idx));\n                unlink_first_small_chunk(gm, b, p, idx);\n                set_inuse_and_pinuse(gm, p, small_index2size(idx));\n                mem = chunk2mem(p);\n                check_malloced_chunk(gm, mem, nb);\n                goto postaction;\n            }\n\n            else if (nb > gm->dvsize) {\n                if (smallbits != 0) {   /* Use chunk in next nonempty smallbin */\n                    mchunkptr b, p, r;\n                    size_t rsize;\n                    bindex_t i;\n                    binmap_t leftbits =\n                        (smallbits << idx) & left_bits(idx2bit(idx));\n                    binmap_t leastbit = least_bit(leftbits);\n                    compute_bit2idx(leastbit, i);\n                    b = smallbin_at(gm, i);\n                    p = b->fd;\n                    assert(chunksize(p) == small_index2size(i));\n                    unlink_first_small_chunk(gm, b, p, i);\n                    rsize = small_index2size(i) - nb;\n                    /* Fit here cannot be remainderless if 4byte sizes */\n                    if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)\n                        set_inuse_and_pinuse(gm, p, small_index2size(i));\n                    else {\n                        set_size_and_pinuse_of_inuse_chunk(gm, p, nb);\n                        r = chunk_plus_offset(p, nb);\n                        set_size_and_pinuse_of_free_chunk(r, rsize);\n                        replace_dv(gm, r, rsize);\n                    }\n                    mem = chunk2mem(p);\n                    check_malloced_chunk(gm, mem, nb);\n                    goto postaction;\n                }\n\n                else if (gm->treemap != 0\n                         && (mem = tmalloc_small(gm, nb)) != 0) {\n                    check_malloced_chunk(gm, mem, nb);\n                    goto postaction;\n                }\n            }\n        } else if (bytes >= MAX_REQUEST)\n            nb = MAX_SIZE_T;    /* Too big to allocate. Force failure (in sys alloc) */\n        else {\n            nb = pad_request(bytes);\n            if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) {\n                check_malloced_chunk(gm, mem, nb);\n                goto postaction;\n            }\n        }\n\n        if (nb <= gm->dvsize) {\n            size_t rsize = gm->dvsize - nb;\n            mchunkptr p = gm->dv;\n            if (rsize >= MIN_CHUNK_SIZE) {      /* split dv */\n                mchunkptr r = gm->dv = chunk_plus_offset(p, nb);\n                gm->dvsize = rsize;\n                set_size_and_pinuse_of_free_chunk(r, rsize);\n                set_size_and_pinuse_of_inuse_chunk(gm, p, nb);\n            } else {            /* exhaust dv */\n                size_t dvs = gm->dvsize;\n                gm->dvsize = 0;\n                gm->dv = 0;\n                set_inuse_and_pinuse(gm, p, dvs);\n            }\n            mem = chunk2mem(p);\n            check_malloced_chunk(gm, mem, nb);\n            goto postaction;\n        }\n\n        else if (nb < gm->topsize) {    /* Split top */\n            size_t rsize = gm->topsize -= nb;\n            mchunkptr p = gm->top;\n            mchunkptr r = gm->top = chunk_plus_offset(p, nb);\n            r->head = rsize | PINUSE_BIT;\n            set_size_and_pinuse_of_inuse_chunk(gm, p, nb);\n            mem = chunk2mem(p);\n            check_top_chunk(gm, gm->top);\n            check_malloced_chunk(gm, mem, nb);\n            goto postaction;\n        }\n\n        mem = sys_alloc(gm, nb);\n\n      postaction:\n        POSTACTION(gm);\n        return mem;\n    }\n\n    return 0;\n}\n\nvoid\ndlfree(void *mem)\n{\n    /*\n       Consolidate freed chunks with preceeding or succeeding bordering\n       free chunks, if they exist, and then place in a bin.  Intermixed\n       with special cases for top, dv, mmapped chunks, and usage errors.\n     */\n\n    if (mem != 0) {\n        mchunkptr p = mem2chunk(mem);\n#if FOOTERS\n        mstate fm = get_mstate_for(p);\n        if (!ok_magic(fm)) {\n            USAGE_ERROR_ACTION(fm, p);\n            return;\n        }\n#else /* FOOTERS */\n#define fm gm\n#endif /* FOOTERS */\n        if (!PREACTION(fm)) {\n            check_inuse_chunk(fm, p);\n            if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {\n                size_t psize = chunksize(p);\n                mchunkptr next = chunk_plus_offset(p, psize);\n                if (!pinuse(p)) {\n                    size_t prevsize = p->prev_foot;\n                    if ((prevsize & IS_MMAPPED_BIT) != 0) {\n                        prevsize &= ~IS_MMAPPED_BIT;\n                        psize += prevsize + MMAP_FOOT_PAD;\n                        if (CALL_MUNMAP((char *) p - prevsize, psize) == 0)\n                            fm->footprint -= psize;\n                        goto postaction;\n                    } else {\n                        mchunkptr prev = chunk_minus_offset(p, prevsize);\n                        psize += prevsize;\n                        p = prev;\n                        if (RTCHECK(ok_address(fm, prev))) {    /* consolidate backward */\n                            if (p != fm->dv) {\n                                unlink_chunk(fm, p, prevsize);\n                            } else if ((next->head & INUSE_BITS) ==\n                                       INUSE_BITS) {\n                                fm->dvsize = psize;\n                                set_free_with_pinuse(p, psize, next);\n                                goto postaction;\n                            }\n                        } else\n                            goto erroraction;\n                    }\n                }\n\n                if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {\n                    if (!cinuse(next)) {        /* consolidate forward */\n                        if (next == fm->top) {\n                            size_t tsize = fm->topsize += psize;\n                            fm->top = p;\n                            p->head = tsize | PINUSE_BIT;\n                            if (p == fm->dv) {\n                                fm->dv = 0;\n                                fm->dvsize = 0;\n                            }\n                            if (should_trim(fm, tsize))\n                                sys_trim(fm, 0);\n                            goto postaction;\n                        } else if (next == fm->dv) {\n                            size_t dsize = fm->dvsize += psize;\n                            fm->dv = p;\n                            set_size_and_pinuse_of_free_chunk(p, dsize);\n                            goto postaction;\n                        } else {\n                            size_t nsize = chunksize(next);\n                            psize += nsize;\n                            unlink_chunk(fm, next, nsize);\n                            set_size_and_pinuse_of_free_chunk(p, psize);\n                            if (p == fm->dv) {\n                                fm->dvsize = psize;\n                                goto postaction;\n                            }\n                        }\n                    } else\n                        set_free_with_pinuse(p, psize, next);\n                    insert_chunk(fm, p, psize);\n                    check_free_chunk(fm, p);\n                    goto postaction;\n                }\n            }\n          erroraction:\n            USAGE_ERROR_ACTION(fm, p);\n          postaction:\n            POSTACTION(fm);\n        }\n    }\n#if !FOOTERS\n#undef fm\n#endif /* FOOTERS */\n}\n\nvoid *\ndlcalloc(size_t n_elements, size_t elem_size)\n{\n    void *mem;\n    size_t req = 0;\n    if (n_elements != 0) {\n        req = n_elements * elem_size;\n        if (((n_elements | elem_size) & ~(size_t) 0xffff) &&\n            (req / n_elements != elem_size))\n            req = MAX_SIZE_T;   /* force downstream failure on overflow */\n    }\n    mem = dlmalloc(req);\n    if (mem != 0 && calloc_must_clear(mem2chunk(mem)))\n        memset(mem, 0, req);\n    return mem;\n}\n\nvoid *\ndlrealloc(void *oldmem, size_t bytes)\n{\n    if (oldmem == 0)\n        return dlmalloc(bytes);\n#ifdef REALLOC_ZERO_BYTES_FREES\n    if (bytes == 0) {\n        dlfree(oldmem);\n        return 0;\n    }\n#endif /* REALLOC_ZERO_BYTES_FREES */\n    else {\n#if ! FOOTERS\n        mstate m = gm;\n#else /* FOOTERS */\n        mstate m = get_mstate_for(mem2chunk(oldmem));\n        if (!ok_magic(m)) {\n            USAGE_ERROR_ACTION(m, oldmem);\n            return 0;\n        }\n#endif /* FOOTERS */\n        return internal_realloc(m, oldmem, bytes);\n    }\n}\n\nvoid *\ndlmemalign(size_t alignment, size_t bytes)\n{\n    return internal_memalign(gm, alignment, bytes);\n}\n\nvoid **\ndlindependent_calloc(size_t n_elements, size_t elem_size, void *chunks[])\n{\n    size_t sz = elem_size;      /* serves as 1-element array */\n    return ialloc(gm, n_elements, &sz, 3, chunks);\n}\n\nvoid **\ndlindependent_comalloc(size_t n_elements, size_t sizes[], void *chunks[])\n{\n    return ialloc(gm, n_elements, sizes, 0, chunks);\n}\n\nvoid *\ndlvalloc(size_t bytes)\n{\n    size_t pagesz;\n    init_mparams();\n    pagesz = mparams.page_size;\n    return dlmemalign(pagesz, bytes);\n}\n\nvoid *\ndlpvalloc(size_t bytes)\n{\n    size_t pagesz;\n    init_mparams();\n    pagesz = mparams.page_size;\n    return dlmemalign(pagesz,\n                      (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE));\n}\n\nint\ndlmalloc_trim(size_t pad)\n{\n    int result = 0;\n    if (!PREACTION(gm)) {\n        result = sys_trim(gm, pad);\n        POSTACTION(gm);\n    }\n    return result;\n}\n\nsize_t\ndlmalloc_footprint(void)\n{\n    return gm->footprint;\n}\n\nsize_t\ndlmalloc_max_footprint(void)\n{\n    return gm->max_footprint;\n}\n\n#if !NO_MALLINFO\nstruct mallinfo\ndlmallinfo(void)\n{\n    return internal_mallinfo(gm);\n}\n#endif /* NO_MALLINFO */\n\nvoid\ndlmalloc_stats()\n{\n    internal_malloc_stats(gm);\n}\n\nsize_t\ndlmalloc_usable_size(void *mem)\n{\n    if (mem != 0) {\n        mchunkptr p = mem2chunk(mem);\n        if (cinuse(p))\n            return chunksize(p) - overhead_for(p);\n    }\n    return 0;\n}\n\nint\ndlmallopt(int param_number, int value)\n{\n    return change_mparam(param_number, value);\n}\n\n#endif /* !ONLY_MSPACES */\n\n/* ----------------------------- user mspaces ---------------------------- */\n\n#if MSPACES\n\nstatic mstate\ninit_user_mstate(char *tbase, size_t tsize)\n{\n    size_t msize = pad_request(sizeof(struct malloc_state));\n    mchunkptr mn;\n    mchunkptr msp = align_as_chunk(tbase);\n    mstate m = (mstate) (chunk2mem(msp));\n    memset(m, 0, msize);\n    INITIAL_LOCK(&m->mutex);\n    msp->head = (msize | PINUSE_BIT | CINUSE_BIT);\n    m->seg.base = m->least_addr = tbase;\n    m->seg.size = m->footprint = m->max_footprint = tsize;\n    m->magic = mparams.magic;\n    m->mflags = mparams.default_mflags;\n    disable_contiguous(m);\n    init_bins(m);\n    mn = next_chunk(mem2chunk(m));\n    init_top(m, mn, (size_t) ((tbase + tsize) - (char *) mn) - TOP_FOOT_SIZE);\n    check_top_chunk(m, m->top);\n    return m;\n}\n\nmspace\ncreate_mspace(size_t capacity, int locked)\n{\n    mstate m = 0;\n    size_t msize = pad_request(sizeof(struct malloc_state));\n    init_mparams();             /* Ensure pagesize etc initialized */\n\n    if (capacity < (size_t) - (msize + TOP_FOOT_SIZE + mparams.page_size)) {\n        size_t rs = ((capacity == 0) ? mparams.granularity :\n                     (capacity + TOP_FOOT_SIZE + msize));\n        size_t tsize = granularity_align(rs);\n        char *tbase = (char *) (CALL_MMAP(tsize));\n        if (tbase != CMFAIL) {\n            m = init_user_mstate(tbase, tsize);\n            m->seg.sflags = IS_MMAPPED_BIT;\n            set_lock(m, locked);\n        }\n    }\n    return (mspace) m;\n}\n\nmspace\ncreate_mspace_with_base(void *base, size_t capacity, int locked)\n{\n    mstate m = 0;\n    size_t msize = pad_request(sizeof(struct malloc_state));\n    init_mparams();             /* Ensure pagesize etc initialized */\n\n    if (capacity > msize + TOP_FOOT_SIZE &&\n        capacity < (size_t) - (msize + TOP_FOOT_SIZE + mparams.page_size)) {\n        m = init_user_mstate((char *) base, capacity);\n        m->seg.sflags = EXTERN_BIT;\n        set_lock(m, locked);\n    }\n    return (mspace) m;\n}\n\nsize_t\ndestroy_mspace(mspace msp)\n{\n    size_t freed = 0;\n    mstate ms = (mstate) msp;\n    if (ok_magic(ms)) {\n        msegmentptr sp = &ms->seg;\n        while (sp != 0) {\n            char *base = sp->base;\n            size_t size = sp->size;\n            flag_t flag = sp->sflags;\n            sp = sp->next;\n            if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) &&\n                CALL_MUNMAP(base, size) == 0)\n                freed += size;\n        }\n    } else {\n        USAGE_ERROR_ACTION(ms, ms);\n    }\n    return freed;\n}\n\n/*\n  mspace versions of routines are near-clones of the global\n  versions. This is not so nice but better than the alternatives.\n*/\n\n\nvoid *\nmspace_malloc(mspace msp, size_t bytes)\n{\n    mstate ms = (mstate) msp;\n    if (!ok_magic(ms)) {\n        USAGE_ERROR_ACTION(ms, ms);\n        return 0;\n    }\n    if (!PREACTION(ms)) {\n        void *mem;\n        size_t nb;\n        if (bytes <= MAX_SMALL_REQUEST) {\n            bindex_t idx;\n            binmap_t smallbits;\n            nb = (bytes < MIN_REQUEST) ? MIN_CHUNK_SIZE : pad_request(bytes);\n            idx = small_index(nb);\n            smallbits = ms->smallmap >> idx;\n\n            if ((smallbits & 0x3U) != 0) {      /* Remainderless fit to a smallbin. */\n                mchunkptr b, p;\n                idx += ~smallbits & 1;  /* Uses next bin if idx empty */\n                b = smallbin_at(ms, idx);\n                p = b->fd;\n                assert(chunksize(p) == small_index2size(idx));\n                unlink_first_small_chunk(ms, b, p, idx);\n                set_inuse_and_pinuse(ms, p, small_index2size(idx));\n                mem = chunk2mem(p);\n                check_malloced_chunk(ms, mem, nb);\n                goto postaction;\n            }\n\n            else if (nb > ms->dvsize) {\n                if (smallbits != 0) {   /* Use chunk in next nonempty smallbin */\n                    mchunkptr b, p, r;\n                    size_t rsize;\n                    bindex_t i;\n                    binmap_t leftbits =\n                        (smallbits << idx) & left_bits(idx2bit(idx));\n                    binmap_t leastbit = least_bit(leftbits);\n                    compute_bit2idx(leastbit, i);\n                    b = smallbin_at(ms, i);\n                    p = b->fd;\n                    assert(chunksize(p) == small_index2size(i));\n                    unlink_first_small_chunk(ms, b, p, i);\n                    rsize = small_index2size(i) - nb;\n                    /* Fit here cannot be remainderless if 4byte sizes */\n                    if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)\n                        set_inuse_and_pinuse(ms, p, small_index2size(i));\n                    else {\n                        set_size_and_pinuse_of_inuse_chunk(ms, p, nb);\n                        r = chunk_plus_offset(p, nb);\n                        set_size_and_pinuse_of_free_chunk(r, rsize);\n                        replace_dv(ms, r, rsize);\n                    }\n                    mem = chunk2mem(p);\n                    check_malloced_chunk(ms, mem, nb);\n                    goto postaction;\n                }\n\n                else if (ms->treemap != 0\n                         && (mem = tmalloc_small(ms, nb)) != 0) {\n                    check_malloced_chunk(ms, mem, nb);\n                    goto postaction;\n                }\n            }\n        } else if (bytes >= MAX_REQUEST)\n            nb = MAX_SIZE_T;    /* Too big to allocate. Force failure (in sys alloc) */\n        else {\n            nb = pad_request(bytes);\n            if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {\n                check_malloced_chunk(ms, mem, nb);\n                goto postaction;\n            }\n        }\n\n        if (nb <= ms->dvsize) {\n            size_t rsize = ms->dvsize - nb;\n            mchunkptr p = ms->dv;\n            if (rsize >= MIN_CHUNK_SIZE) {      /* split dv */\n                mchunkptr r = ms->dv = chunk_plus_offset(p, nb);\n                ms->dvsize = rsize;\n                set_size_and_pinuse_of_free_chunk(r, rsize);\n                set_size_and_pinuse_of_inuse_chunk(ms, p, nb);\n            } else {            /* exhaust dv */\n                size_t dvs = ms->dvsize;\n                ms->dvsize = 0;\n                ms->dv = 0;\n                set_inuse_and_pinuse(ms, p, dvs);\n            }\n            mem = chunk2mem(p);\n            check_malloced_chunk(ms, mem, nb);\n            goto postaction;\n        }\n\n        else if (nb < ms->topsize) {    /* Split top */\n            size_t rsize = ms->topsize -= nb;\n            mchunkptr p = ms->top;\n            mchunkptr r = ms->top = chunk_plus_offset(p, nb);\n            r->head = rsize | PINUSE_BIT;\n            set_size_and_pinuse_of_inuse_chunk(ms, p, nb);\n            mem = chunk2mem(p);\n            check_top_chunk(ms, ms->top);\n            check_malloced_chunk(ms, mem, nb);\n            goto postaction;\n        }\n\n        mem = sys_alloc(ms, nb);\n\n      postaction:\n        POSTACTION(ms);\n        return mem;\n    }\n\n    return 0;\n}\n\nvoid\nmspace_free(mspace msp, void *mem)\n{\n    if (mem != 0) {\n        mchunkptr p = mem2chunk(mem);\n#if FOOTERS\n        mstate fm = get_mstate_for(p);\n#else /* FOOTERS */\n        mstate fm = (mstate) msp;\n#endif /* FOOTERS */\n        if (!ok_magic(fm)) {\n            USAGE_ERROR_ACTION(fm, p);\n            return;\n        }\n        if (!PREACTION(fm)) {\n            check_inuse_chunk(fm, p);\n            if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {\n                size_t psize = chunksize(p);\n                mchunkptr next = chunk_plus_offset(p, psize);\n                if (!pinuse(p)) {\n                    size_t prevsize = p->prev_foot;\n                    if ((prevsize & IS_MMAPPED_BIT) != 0) {\n                        prevsize &= ~IS_MMAPPED_BIT;\n                        psize += prevsize + MMAP_FOOT_PAD;\n                        if (CALL_MUNMAP((char *) p - prevsize, psize) == 0)\n                            fm->footprint -= psize;\n                        goto postaction;\n                    } else {\n                        mchunkptr prev = chunk_minus_offset(p, prevsize);\n                        psize += prevsize;\n                        p = prev;\n                        if (RTCHECK(ok_address(fm, prev))) {    /* consolidate backward */\n                            if (p != fm->dv) {\n                                unlink_chunk(fm, p, prevsize);\n                            } else if ((next->head & INUSE_BITS) ==\n                                       INUSE_BITS) {\n                                fm->dvsize = psize;\n                                set_free_with_pinuse(p, psize, next);\n                                goto postaction;\n                            }\n                        } else\n                            goto erroraction;\n                    }\n                }\n\n                if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {\n                    if (!cinuse(next)) {        /* consolidate forward */\n                        if (next == fm->top) {\n                            size_t tsize = fm->topsize += psize;\n                            fm->top = p;\n                            p->head = tsize | PINUSE_BIT;\n                            if (p == fm->dv) {\n                                fm->dv = 0;\n                                fm->dvsize = 0;\n                            }\n                            if (should_trim(fm, tsize))\n                                sys_trim(fm, 0);\n                            goto postaction;\n                        } else if (next == fm->dv) {\n                            size_t dsize = fm->dvsize += psize;\n                            fm->dv = p;\n                            set_size_and_pinuse_of_free_chunk(p, dsize);\n                            goto postaction;\n                        } else {\n                            size_t nsize = chunksize(next);\n                            psize += nsize;\n                            unlink_chunk(fm, next, nsize);\n                            set_size_and_pinuse_of_free_chunk(p, psize);\n                            if (p == fm->dv) {\n                                fm->dvsize = psize;\n                                goto postaction;\n                            }\n                        }\n                    } else\n                        set_free_with_pinuse(p, psize, next);\n                    insert_chunk(fm, p, psize);\n                    check_free_chunk(fm, p);\n                    goto postaction;\n                }\n            }\n          erroraction:\n            USAGE_ERROR_ACTION(fm, p);\n          postaction:\n            POSTACTION(fm);\n        }\n    }\n}\n\nvoid *\nmspace_calloc(mspace msp, size_t n_elements, size_t elem_size)\n{\n    void *mem;\n    size_t req = 0;\n    mstate ms = (mstate) msp;\n    if (!ok_magic(ms)) {\n        USAGE_ERROR_ACTION(ms, ms);\n        return 0;\n    }\n    if (n_elements != 0) {\n        req = n_elements * elem_size;\n        if (((n_elements | elem_size) & ~(size_t) 0xffff) &&\n            (req / n_elements != elem_size))\n            req = MAX_SIZE_T;   /* force downstream failure on overflow */\n    }\n    mem = internal_malloc(ms, req);\n    if (mem != 0 && calloc_must_clear(mem2chunk(mem)))\n        memset(mem, 0, req);\n    return mem;\n}\n\nvoid *\nmspace_realloc(mspace msp, void *oldmem, size_t bytes)\n{\n    if (oldmem == 0)\n        return mspace_malloc(msp, bytes);\n#ifdef REALLOC_ZERO_BYTES_FREES\n    if (bytes == 0) {\n        mspace_free(msp, oldmem);\n        return 0;\n    }\n#endif /* REALLOC_ZERO_BYTES_FREES */\n    else {\n#if FOOTERS\n        mchunkptr p = mem2chunk(oldmem);\n        mstate ms = get_mstate_for(p);\n#else /* FOOTERS */\n        mstate ms = (mstate) msp;\n#endif /* FOOTERS */\n        if (!ok_magic(ms)) {\n            USAGE_ERROR_ACTION(ms, ms);\n            return 0;\n        }\n        return internal_realloc(ms, oldmem, bytes);\n    }\n}\n\nvoid *\nmspace_memalign(mspace msp, size_t alignment, size_t bytes)\n{\n    mstate ms = (mstate) msp;\n    if (!ok_magic(ms)) {\n        USAGE_ERROR_ACTION(ms, ms);\n        return 0;\n    }\n    return internal_memalign(ms, alignment, bytes);\n}\n\nvoid **\nmspace_independent_calloc(mspace msp, size_t n_elements,\n                          size_t elem_size, void *chunks[])\n{\n    size_t sz = elem_size;      /* serves as 1-element array */\n    mstate ms = (mstate) msp;\n    if (!ok_magic(ms)) {\n        USAGE_ERROR_ACTION(ms, ms);\n        return 0;\n    }\n    return ialloc(ms, n_elements, &sz, 3, chunks);\n}\n\nvoid **\nmspace_independent_comalloc(mspace msp, size_t n_elements,\n                            size_t sizes[], void *chunks[])\n{\n    mstate ms = (mstate) msp;\n    if (!ok_magic(ms)) {\n        USAGE_ERROR_ACTION(ms, ms);\n        return 0;\n    }\n    return ialloc(ms, n_elements, sizes, 0, chunks);\n}\n\nint\nmspace_trim(mspace msp, size_t pad)\n{\n    int result = 0;\n    mstate ms = (mstate) msp;\n    if (ok_magic(ms)) {\n        if (!PREACTION(ms)) {\n            result = sys_trim(ms, pad);\n            POSTACTION(ms);\n        }\n    } else {\n        USAGE_ERROR_ACTION(ms, ms);\n    }\n    return result;\n}\n\nvoid\nmspace_malloc_stats(mspace msp)\n{\n    mstate ms = (mstate) msp;\n    if (ok_magic(ms)) {\n        internal_malloc_stats(ms);\n    } else {\n        USAGE_ERROR_ACTION(ms, ms);\n    }\n}\n\nsize_t\nmspace_footprint(mspace msp)\n{\n    size_t result;\n    mstate ms = (mstate) msp;\n    if (ok_magic(ms)) {\n        result = ms->footprint;\n    }\n    USAGE_ERROR_ACTION(ms, ms);\n    return result;\n}\n\n\nsize_t\nmspace_max_footprint(mspace msp)\n{\n    size_t result;\n    mstate ms = (mstate) msp;\n    if (ok_magic(ms)) {\n        result = ms->max_footprint;\n    }\n    USAGE_ERROR_ACTION(ms, ms);\n    return result;\n}\n\n\n#if !NO_MALLINFO\nstruct mallinfo\nmspace_mallinfo(mspace msp)\n{\n    mstate ms = (mstate) msp;\n    if (!ok_magic(ms)) {\n        USAGE_ERROR_ACTION(ms, ms);\n    }\n    return internal_mallinfo(ms);\n}\n#endif /* NO_MALLINFO */\n\nint\nmspace_mallopt(int param_number, int value)\n{\n    return change_mparam(param_number, value);\n}\n\n#endif /* MSPACES */\n\n/* -------------------- Alternative MORECORE functions ------------------- */\n\n/*\n  Guidelines for creating a custom version of MORECORE:\n\n  * For best performance, MORECORE should allocate in multiples of pagesize.\n  * MORECORE may allocate more memory than requested. (Or even less,\n      but this will usually result in a malloc failure.)\n  * MORECORE must not allocate memory when given argument zero, but\n      instead return one past the end address of memory from previous\n      nonzero call.\n  * For best performance, consecutive calls to MORECORE with positive\n      arguments should return increasing addresses, indicating that\n      space has been contiguously extended.\n  * Even though consecutive calls to MORECORE need not return contiguous\n      addresses, it must be OK for malloc'ed chunks to span multiple\n      regions in those cases where they do happen to be contiguous.\n  * MORECORE need not handle negative arguments -- it may instead\n      just return MFAIL when given negative arguments.\n      Negative arguments are always multiples of pagesize. MORECORE\n      must not misinterpret negative args as large positive unsigned\n      args. You can suppress all such calls from even occurring by defining\n      MORECORE_CANNOT_TRIM,\n\n  As an example alternative MORECORE, here is a custom allocator\n  kindly contributed for pre-OSX macOS.  It uses virtually but not\n  necessarily physically contiguous non-paged memory (locked in,\n  present and won't get swapped out).  You can use it by uncommenting\n  this section, adding some #includes, and setting up the appropriate\n  defines above:\n\n      #define MORECORE osMoreCore\n\n  There is also a shutdown routine that should somehow be called for\n  cleanup upon program exit.\n\n  #define MAX_POOL_ENTRIES 100\n  #define MINIMUM_MORECORE_SIZE  (64 * 1024U)\n  static int next_os_pool;\n  void *our_os_pools[MAX_POOL_ENTRIES];\n\n  void *osMoreCore(int size)\n  {\n    void *ptr = 0;\n    static void *sbrk_top = 0;\n\n    if (size > 0)\n    {\n      if (size < MINIMUM_MORECORE_SIZE)\n         size = MINIMUM_MORECORE_SIZE;\n      if (CurrentExecutionLevel() == kTaskLevel)\n         ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);\n      if (ptr == 0)\n      {\n        return (void *) MFAIL;\n      }\n      // save ptrs so they can be freed during cleanup\n      our_os_pools[next_os_pool] = ptr;\n      next_os_pool++;\n      ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);\n      sbrk_top = (char *) ptr + size;\n      return ptr;\n    }\n    else if (size < 0)\n    {\n      // we don't currently support shrink behavior\n      return (void *) MFAIL;\n    }\n    else\n    {\n      return sbrk_top;\n    }\n  }\n\n  // cleanup any allocated memory pools\n  // called as last thing before shutting down driver\n\n  void osCleanupMem(void)\n  {\n    void **ptr;\n\n    for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)\n      if (*ptr)\n      {\n         PoolDeallocate(*ptr);\n         *ptr = 0;\n      }\n  }\n\n*/\n\n\n/* -----------------------------------------------------------------------\nHistory:\n    V2.8.3 Thu Sep 22 11:16:32 2005  Doug Lea  (dl at gee)\n      * Add max_footprint functions\n      * Ensure all appropriate literals are size_t\n      * Fix conditional compilation problem for some #define settings\n      * Avoid concatenating segments with the one provided\n        in create_mspace_with_base\n      * Rename some variables to avoid compiler shadowing warnings\n      * Use explicit lock initialization.\n      * Better handling of sbrk interference.\n      * Simplify and fix segment insertion, trimming and mspace_destroy\n      * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x\n      * Thanks especially to Dennis Flanagan for help on these.\n\n    V2.8.2 Sun Jun 12 16:01:10 2005  Doug Lea  (dl at gee)\n      * Fix memalign brace error.\n\n    V2.8.1 Wed Jun  8 16:11:46 2005  Doug Lea  (dl at gee)\n      * Fix improper #endif nesting in C++\n      * Add explicit casts needed for C++\n\n    V2.8.0 Mon May 30 14:09:02 2005  Doug Lea  (dl at gee)\n      * Use trees for large bins\n      * Support mspaces\n      * Use segments to unify sbrk-based and mmap-based system allocation,\n        removing need for emulation on most platforms without sbrk.\n      * Default safety checks\n      * Optional footer checks. Thanks to William Robertson for the idea.\n      * Internal code refactoring\n      * Incorporate suggestions and platform-specific changes.\n        Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas,\n        Aaron Bachmann,  Emery Berger, and others.\n      * Speed up non-fastbin processing enough to remove fastbins.\n      * Remove useless cfree() to avoid conflicts with other apps.\n      * Remove internal memcpy, memset. Compilers handle builtins better.\n      * Remove some options that no one ever used and rename others.\n\n    V2.7.2 Sat Aug 17 09:07:30 2002  Doug Lea  (dl at gee)\n      * Fix malloc_state bitmap array misdeclaration\n\n    V2.7.1 Thu Jul 25 10:58:03 2002  Doug Lea  (dl at gee)\n      * Allow tuning of FIRST_SORTED_BIN_SIZE\n      * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte.\n      * Better detection and support for non-contiguousness of MORECORE.\n        Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger\n      * Bypass most of malloc if no frees. Thanks To Emery Berger.\n      * Fix freeing of old top non-contiguous chunk im sysmalloc.\n      * Raised default trim and map thresholds to 256K.\n      * Fix mmap-related #defines. Thanks to Lubos Lunak.\n      * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield.\n      * Branch-free bin calculation\n      * Default trim and mmap thresholds now 256K.\n\n    V2.7.0 Sun Mar 11 14:14:06 2001  Doug Lea  (dl at gee)\n      * Introduce independent_comalloc and independent_calloc.\n        Thanks to Michael Pachos for motivation and help.\n      * Make optional .h file available\n      * Allow > 2GB requests on 32bit systems.\n      * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.\n        Thanks also to Andreas Mueller <a.mueller at paradatec.de>,\n        and Anonymous.\n      * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for\n        helping test this.)\n      * memalign: check alignment arg\n      * realloc: don't try to shift chunks backwards, since this\n        leads to  more fragmentation in some programs and doesn't\n        seem to help in any others.\n      * Collect all cases in malloc requiring system memory into sysmalloc\n      * Use mmap as backup to sbrk\n      * Place all internal state in malloc_state\n      * Introduce fastbins (although similar to 2.5.1)\n      * Many minor tunings and cosmetic improvements\n      * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK\n      * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS\n        Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.\n      * Include errno.h to support default failure action.\n\n    V2.6.6 Sun Dec  5 07:42:19 1999  Doug Lea  (dl at gee)\n      * return null for negative arguments\n      * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>\n         * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'\n          (e.g. WIN32 platforms)\n         * Cleanup header file inclusion for WIN32 platforms\n         * Cleanup code to avoid Microsoft Visual C++ compiler complaints\n         * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing\n           memory allocation routines\n         * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)\n         * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to\n           usage of 'assert' in non-WIN32 code\n         * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to\n           avoid infinite loop\n      * Always call 'fREe()' rather than 'free()'\n\n    V2.6.5 Wed Jun 17 15:57:31 1998  Doug Lea  (dl at gee)\n      * Fixed ordering problem with boundary-stamping\n\n    V2.6.3 Sun May 19 08:17:58 1996  Doug Lea  (dl at gee)\n      * Added pvalloc, as recommended by H.J. Liu\n      * Added 64bit pointer support mainly from Wolfram Gloger\n      * Added anonymously donated WIN32 sbrk emulation\n      * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen\n      * malloc_extend_top: fix mask error that caused wastage after\n        foreign sbrks\n      * Add linux mremap support code from HJ Liu\n\n    V2.6.2 Tue Dec  5 06:52:55 1995  Doug Lea  (dl at gee)\n      * Integrated most documentation with the code.\n      * Add support for mmap, with help from\n        Wolfram Gloger (Gloger@lrz.uni-muenchen.de).\n      * Use last_remainder in more cases.\n      * Pack bins using idea from  colin@nyx10.cs.du.edu\n      * Use ordered bins instead of best-fit threshhold\n      * Eliminate block-local decls to simplify tracing and debugging.\n      * Support another case of realloc via move into top\n      * Fix error occuring when initial sbrk_base not word-aligned.\n      * Rely on page size for units instead of SBRK_UNIT to\n        avoid surprises about sbrk alignment conventions.\n      * Add mallinfo, mallopt. Thanks to Raymond Nijssen\n        (raymond@es.ele.tue.nl) for the suggestion.\n      * Add `pad' argument to malloc_trim and top_pad mallopt parameter.\n      * More precautions for cases where other routines call sbrk,\n        courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).\n      * Added macros etc., allowing use in linux libc from\n        H.J. Lu (hjl@gnu.ai.mit.edu)\n      * Inverted this history list\n\n    V2.6.1 Sat Dec  2 14:10:57 1995  Doug Lea  (dl at gee)\n      * Re-tuned and fixed to behave more nicely with V2.6.0 changes.\n      * Removed all preallocation code since under current scheme\n        the work required to undo bad preallocations exceeds\n        the work saved in good cases for most test programs.\n      * No longer use return list or unconsolidated bins since\n        no scheme using them consistently outperforms those that don't\n        given above changes.\n      * Use best fit for very large chunks to prevent some worst-cases.\n      * Added some support for debugging\n\n    V2.6.0 Sat Nov  4 07:05:23 1995  Doug Lea  (dl at gee)\n      * Removed footers when chunks are in use. Thanks to\n        Paul Wilson (wilson@cs.texas.edu) for the suggestion.\n\n    V2.5.4 Wed Nov  1 07:54:51 1995  Doug Lea  (dl at gee)\n      * Added malloc_trim, with help from Wolfram Gloger\n        (wmglo@Dent.MED.Uni-Muenchen.DE).\n\n    V2.5.3 Tue Apr 26 10:16:01 1994  Doug Lea  (dl at g)\n\n    V2.5.2 Tue Apr  5 16:20:40 1994  Doug Lea  (dl at g)\n      * realloc: try to expand in both directions\n      * malloc: swap order of clean-bin strategy;\n      * realloc: only conditionally expand backwards\n      * Try not to scavenge used bins\n      * Use bin counts as a guide to preallocation\n      * Occasionally bin return list chunks in first scan\n      * Add a few optimizations from colin@nyx10.cs.du.edu\n\n    V2.5.1 Sat Aug 14 15:40:43 1993  Doug Lea  (dl at g)\n      * faster bin computation & slightly different binning\n      * merged all consolidations to one part of malloc proper\n         (eliminating old malloc_find_space & malloc_clean_bin)\n      * Scan 2 returns chunks (not just 1)\n      * Propagate failure in realloc if malloc returns 0\n      * Add stuff to allow compilation on non-ANSI compilers\n          from kpv@research.att.com\n\n    V2.5 Sat Aug  7 07:41:59 1993  Doug Lea  (dl at g.oswego.edu)\n      * removed potential for odd address access in prev_chunk\n      * removed dependency on getpagesize.h\n      * misc cosmetics and a bit more internal documentation\n      * anticosmetics: mangled names in macros to evade debugger strangeness\n      * tested on sparc, hp-700, dec-mips, rs6000\n          with gcc & native cc (hp, dec only) allowing\n          Detlefs & Zorn comparison study (in SIGPLAN Notices.)\n\n    Trial version Fri Aug 28 13:14:29 1992  Doug Lea  (dl at g.oswego.edu)\n      * Based loosely on libg++-1.2X malloc. (It retains some of the overall\n         structure of old version,  but most details differ.)\n\n*/\n\n#endif /* !HAVE_MALLOC */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/stdlib/SDL_qsort.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)\n#define SDL_DISABLE_ANALYZE_MACROS 1\n#endif\n\n#include \"../SDL_internal.h\"\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_assert.h\"\n\n#if defined(HAVE_QSORT)\nvoid\nSDL_qsort(void *base, size_t nmemb, size_t size, int (*compare) (const void *, const void *))\n{\n    qsort(base, nmemb, size, compare);\n}\n\n#else\n\n#ifdef assert\n#undef assert\n#endif\n#define assert SDL_assert\n#ifdef malloc\n#undef malloc\n#endif\n#define malloc SDL_malloc\n#ifdef free\n#undef free\n#endif\n#define free SDL_free\n#ifdef memcpy\n#undef memcpy\n#endif\n#define memcpy SDL_memcpy\n#ifdef memmove\n#undef memmove\n#endif\n#define memmove SDL_memmove\n#ifdef qsortG\n#undef qsortG\n#endif\n#define qsortG SDL_qsort\n\n/*\nThis code came from Gareth McCaughan, under the zlib license.\nSpecifically this: https://www.mccaughan.org.uk/software/qsort.c-1.14\n\nEverything below this comment until the HAVE_QSORT #endif was from Gareth\n(any minor changes will be noted inline).\n\nThank you to Gareth for relicensing this code under the zlib license for our\nbenefit!\n\n--ryan.\n*/\n\n/* This is a drop-in replacement for the C library's |qsort()| routine.\n *\n * It is intended for use where you know or suspect that your\n * platform's qsort is bad. If that isn't the case, then you\n * should probably use the qsort your system gives you in preference\n * to mine -- it will likely have been tested and tuned better.\n *\n * Features:\n *   - Median-of-three pivoting (and more)\n *   - Truncation and final polishing by a single insertion sort\n *   - Early truncation when no swaps needed in pivoting step\n *   - Explicit recursion, guaranteed not to overflow\n *   - A few little wrinkles stolen from the GNU |qsort()|.\n *     (For the avoidance of doubt, no code was stolen, only\n *     broad ideas.)\n *   - separate code for non-aligned / aligned / word-size objects\n *\n * Earlier releases of this code used an idiosyncratic licence\n * I wrote myself, because I'm an idiot. The code is now released\n * under the \"zlib/libpng licence\"; you will find the actual\n * terms in the next comment. I request (but do not require)\n * that if you make any changes beyond the name of the exported\n * routine and reasonable tweaks to the TRUNC_* and\n * PIVOT_THRESHOLD values, you modify the _ID string so as\n * to make it clear that you have changed the code.\n *\n * If you find problems with this code, or find ways of\n * making it significantly faster, please let me know!\n * My e-mail address, valid as of early 2016 and for the\n * foreseeable future, is\n *    gareth.mccaughan@pobox.com\n * Thanks!\n *\n * Gareth McCaughan\n */\n\n/* Copyright (c) 1998-2016 Gareth McCaughan\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any\n * damages arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented;\n *    you must not claim that you wrote the original software.\n *    If you use this software in a product, an acknowledgment\n *    in the product documentation would be appreciated but\n *    is not required.\n *\n * 2. Altered source versions must be plainly marked as such,\n *    and must not be misrepresented as being the original software.\n *\n * 3. This notice may not be removed or altered from any source\n *    distribution.\n */\n\n/* Revision history since release:\n *   1998-03-19 v1.12 First release I have any records of.\n *   2007-09-02 v1.13 Fix bug kindly reported by Dan Bodoh\n *                    (premature termination of recursion).\n *                    Add a few clarifying comments.\n *                    Minor improvements to debug output.\n *   2016-02-21 v1.14 Replace licence with 2-clause BSD,\n *                    and clarify a couple of things in\n *                    comments. No code changes.\n */\n\n/* BEGIN SDL CHANGE ... commented this out with an #if 0 block. --ryan. */\n#if 0\n#include <assert.h>\n#include <stdlib.h>\n#include <string.h>\n\n#define DEBUG_QSORT\n\nstatic char _ID[]=\"<qsort.c gjm 1.14 2016-02-21>\";\n#endif\n/* END SDL CHANGE ... commented this out with an #if 0 block. --ryan. */\n\n/* How many bytes are there per word? (Must be a power of 2,\n * and must in fact equal sizeof(int).)\n */\n#define WORD_BYTES sizeof(int)\n\n/* How big does our stack need to be? Answer: one entry per\n * bit in a |size_t|.\n */\n#define STACK_SIZE (8*sizeof(size_t))\n\n/* Different situations have slightly different requirements,\n * and we make life epsilon easier by using different truncation\n * points for the three different cases.\n * So far, I have tuned TRUNC_words and guessed that the same\n * value might work well for the other two cases. Of course\n * what works well on my machine might work badly on yours.\n */\n#define TRUNC_nonaligned\t12\n#define TRUNC_aligned\t\t12\n#define TRUNC_words\t\t12*WORD_BYTES\t/* nb different meaning */\n\n/* We use a simple pivoting algorithm for shortish sub-arrays\n * and a more complicated one for larger ones. The threshold\n * is PIVOT_THRESHOLD.\n */\n#define PIVOT_THRESHOLD 40\n\ntypedef struct { char * first; char * last; } stack_entry;\n#define pushLeft {stack[stacktop].first=ffirst;stack[stacktop++].last=last;}\n#define pushRight {stack[stacktop].first=first;stack[stacktop++].last=llast;}\n#define doLeft {first=ffirst;llast=last;continue;}\n#define doRight {ffirst=first;last=llast;continue;}\n#define pop {if (--stacktop<0) break;\\\n  first=ffirst=stack[stacktop].first;\\\n  last=llast=stack[stacktop].last;\\\n  continue;}\n\n/* Some comments on the implementation.\n * 1. When we finish partitioning the array into \"low\"\n *    and \"high\", we forget entirely about short subarrays,\n *    because they'll be done later by insertion sort.\n *    Doing lots of little insertion sorts might be a win\n *    on large datasets for locality-of-reference reasons,\n *    but it makes the code much nastier and increases\n *    bookkeeping overhead.\n * 2. We always save the shorter and get to work on the\n *    longer. This guarantees that every time we push\n *    an item onto the stack its size is <= 1/2 of that\n *    of its parent; so the stack can't need more than\n *    log_2(max-array-size) entries.\n * 3. We choose a pivot by looking at the first, last\n *    and middle elements. We arrange them into order\n *    because it's easy to do that in conjunction with\n *    choosing the pivot, and it makes things a little\n *    easier in the partitioning step. Anyway, the pivot\n *    is the middle of these three. It's still possible\n *    to construct datasets where the algorithm takes\n *    time of order n^2, but it simply never happens in\n *    practice.\n * 3' Newsflash: On further investigation I find that\n *    it's easy to construct datasets where median-of-3\n *    simply isn't good enough. So on large-ish subarrays\n *    we do a more sophisticated pivoting: we take three\n *    sets of 3 elements, find their medians, and then\n *    take the median of those.\n * 4. We copy the pivot element to a separate place\n *    because that way we can always do our comparisons\n *    directly against a pointer to that separate place,\n *    and don't have to wonder \"did we move the pivot\n *    element?\". This makes the inner loop better.\n * 5. It's possible to make the pivoting even more\n *    reliable by looking at more candidates when n\n *    is larger. (Taking this to its logical conclusion\n *    results in a variant of quicksort that doesn't\n *    have that n^2 worst case.) However, the overhead\n *    from the extra bookkeeping means that it's just\n *    not worth while.\n * 6. This is pretty clean and portable code. Here are\n *    all the potential portability pitfalls and problems\n *    I know of:\n *      - In one place (the insertion sort) I construct\n *        a pointer that points just past the end of the\n *        supplied array, and assume that (a) it won't\n *        compare equal to any pointer within the array,\n *        and (b) it will compare equal to a pointer\n *        obtained by stepping off the end of the array.\n *        These might fail on some segmented architectures.\n *      - I assume that there are 8 bits in a |char| when\n *        computing the size of stack needed. This would\n *        fail on machines with 9-bit or 16-bit bytes.\n *      - I assume that if |((int)base&(sizeof(int)-1))==0|\n *        and |(size&(sizeof(int)-1))==0| then it's safe to\n *        get at array elements via |int*|s, and that if\n *        actually |size==sizeof(int)| as well then it's\n *        safe to treat the elements as |int|s. This might\n *        fail on systems that convert pointers to integers\n *        in non-standard ways.\n *      - I assume that |8*sizeof(size_t)<=INT_MAX|. This\n *        would be false on a machine with 8-bit |char|s,\n *        16-bit |int|s and 4096-bit |size_t|s. :-)\n */\n\n/* The recursion logic is the same in each case.\n * We keep chopping up until we reach subarrays of size\n * strictly less than Trunc; we leave these unsorted. */\n#define Recurse(Trunc)\t\t\t\t\\\n      { size_t l=last-ffirst,r=llast-first;\t\\\n        if (l<Trunc) {\t\t\t\t\\\n          if (r>=Trunc) doRight\t\t\t\\\n          else pop\t\t\t\t\\\n        }\t\t\t\t\t\\\n        else if (l<=r) { pushLeft; doRight }\t\\\n        else if (r>=Trunc) { pushRight; doLeft }\\\n        else doLeft\t\t\t\t\\\n      }\n\n/* and so is the pivoting logic (note: last is inclusive): */\n#define Pivot(swapper,sz)\t\t\t\\\n  if (last-first>PIVOT_THRESHOLD*sz) mid=pivot_big(first,mid,last,sz,compare);\\\n  else {\t\\\n    if (compare(first,mid)<0) {\t\t\t\\\n      if (compare(mid,last)>0) {\t\t\\\n        swapper(mid,last);\t\t\t\\\n        if (compare(first,mid)>0) swapper(first,mid);\\\n      }\t\t\t\t\t\t\\\n    }\t\t\t\t\t\t\\\n    else {\t\t\t\t\t\\\n      if (compare(mid,last)>0) swapper(first,last)\\\n      else {\t\t\t\t\t\\\n        swapper(first,mid);\t\t\t\\\n        if (compare(mid,last)>0) swapper(mid,last);\\\n      }\t\t\t\t\t\t\\\n    }\t\t\t\t\t\t\\\n    first+=sz; last-=sz;\t\t\t\\\n  }\n\n#ifdef DEBUG_QSORT\n#include <stdio.h>\n#endif\n\n/* and so is the partitioning logic: */\n#define Partition(swapper,sz) {\t\t\t\\\n  do {\t\t\t\t\t\t\\\n    while (compare(first,pivot)<0) first+=sz;\t\\\n    while (compare(pivot,last)<0) last-=sz;\t\\\n    if (first<last) {\t\t\t\t\\\n      swapper(first,last);\t\t\t\\\n      first+=sz; last-=sz; }\t\t\t\\\n    else if (first==last) { first+=sz; last-=sz; break; }\\\n  } while (first<=last);\t\t\t\\\n}\n\n/* and so is the pre-insertion-sort operation of putting\n * the smallest element into place as a sentinel.\n * Doing this makes the inner loop nicer. I got this\n * idea from the GNU implementation of qsort().\n * We find the smallest element from the first |nmemb|,\n * or the first |limit|, whichever is smaller;\n * therefore we must have ensured that the globally smallest\n * element is in the first |limit|.\n */\n#define PreInsertion(swapper,limit,sz)\t\t\\\n  first=base;\t\t\t\t\t\\\n  last=first + ((nmemb>limit ? limit : nmemb)-1)*sz;\\\n  while (last!=base) {\t\t\t\t\\\n    if (compare(first,last)>0) first=last;\t\\\n    last-=sz; }\t\t\t\t\t\\\n  if (first!=base) swapper(first,(char*)base);\n\n/* and so is the insertion sort, in the first two cases: */\n#define Insertion(swapper)\t\t\t\\\n  last=((char*)base)+nmemb*size;\t\t\\\n  for (first=((char*)base)+size;first!=last;first+=size) {\t\\\n    char *test;\t\t\t\t\t\\\n    /* Find the right place for |first|.\t\\\n     * My apologies for var reuse. */\t\t\\\n    for (test=first-size;compare(test,first)>0;test-=size) ;\t\\\n    test+=size;\t\t\t\t\t\\\n    if (test!=first) {\t\t\t\t\\\n      /* Shift everything in [test,first)\t\\\n       * up by one, and place |first|\t\t\\\n       * where |test| is. */\t\t\t\\\n      memcpy(pivot,first,size);\t\t\t\\\n      memmove(test+size,test,first-test);\t\\\n      memcpy(test,pivot,size);\t\t\t\\\n    }\t\t\t\t\t\t\\\n  }\n\n#define SWAP_nonaligned(a,b) { \\\n  register char *aa=(a),*bb=(b); \\\n  register size_t sz=size; \\\n  do { register char t=*aa; *aa++=*bb; *bb++=t; } while (--sz); }\n\n#define SWAP_aligned(a,b) { \\\n  register int *aa=(int*)(a),*bb=(int*)(b); \\\n  register size_t sz=size; \\\n  do { register int t=*aa;*aa++=*bb; *bb++=t; } while (sz-=WORD_BYTES); }\n\n#define SWAP_words(a,b) { \\\n  register int t=*((int*)a); *((int*)a)=*((int*)b); *((int*)b)=t; }\n\n/* ---------------------------------------------------------------------- */\n\nstatic char * pivot_big(char *first, char *mid, char *last, size_t size,\n                        int compare(const void *, const void *)) {\n  int d=(((last-first)/size)>>3)*size;\n#ifdef DEBUG_QSORT\nfprintf(stderr, \"pivot_big: first=%p last=%p size=%lu n=%lu\\n\", first, (unsigned long)last, size, (unsigned long)((last-first+1)/size));\n#endif\n  char *m1,*m2,*m3;\n  { char *a=first, *b=first+d, *c=first+2*d;\n#ifdef DEBUG_QSORT\nfprintf(stderr,\"< %d %d %d @ %p %p %p\\n\",*(int*)a,*(int*)b,*(int*)c, a,b,c);\n#endif\n    m1 = compare(a,b)<0 ?\n           (compare(b,c)<0 ? b : (compare(a,c)<0 ? c : a))\n         : (compare(a,c)<0 ? a : (compare(b,c)<0 ? c : b));\n  }\n  { char *a=mid-d, *b=mid, *c=mid+d;\n#ifdef DEBUG_QSORT\nfprintf(stderr,\". %d %d %d @ %p %p %p\\n\",*(int*)a,*(int*)b,*(int*)c, a,b,c);\n#endif\n    m2 = compare(a,b)<0 ?\n           (compare(b,c)<0 ? b : (compare(a,c)<0 ? c : a))\n         : (compare(a,c)<0 ? a : (compare(b,c)<0 ? c : b));\n  }\n  { char *a=last-2*d, *b=last-d, *c=last;\n#ifdef DEBUG_QSORT\nfprintf(stderr,\"> %d %d %d @ %p %p %p\\n\",*(int*)a,*(int*)b,*(int*)c, a,b,c);\n#endif\n    m3 = compare(a,b)<0 ?\n           (compare(b,c)<0 ? b : (compare(a,c)<0 ? c : a))\n         : (compare(a,c)<0 ? a : (compare(b,c)<0 ? c : b));\n  }\n#ifdef DEBUG_QSORT\nfprintf(stderr,\"-> %d %d %d @ %p %p %p\\n\",*(int*)m1,*(int*)m2,*(int*)m3, m1,m2,m3);\n#endif\n  return compare(m1,m2)<0 ?\n           (compare(m2,m3)<0 ? m2 : (compare(m1,m3)<0 ? m3 : m1))\n         : (compare(m1,m3)<0 ? m1 : (compare(m2,m3)<0 ? m3 : m2));\n}\n\n/* ---------------------------------------------------------------------- */\n\nstatic void qsort_nonaligned(void *base, size_t nmemb, size_t size,\n           int (*compare)(const void *, const void *)) {\n\n  stack_entry stack[STACK_SIZE];\n  int stacktop=0;\n  char *first,*last;\n  char *pivot=malloc(size);\n  size_t trunc=TRUNC_nonaligned*size;\n  assert(pivot!=0);\n\n  first=(char*)base; last=first+(nmemb-1)*size;\n\n  if (last-first>=trunc) {\n    char *ffirst=first, *llast=last;\n    while (1) {\n      /* Select pivot */\n      { char * mid=first+size*((last-first)/size >> 1);\n        Pivot(SWAP_nonaligned,size);\n        memcpy(pivot,mid,size);\n      }\n      /* Partition. */\n      Partition(SWAP_nonaligned,size);\n      /* Prepare to recurse/iterate. */\n      Recurse(trunc)\n    }\n  }\n  PreInsertion(SWAP_nonaligned,TRUNC_nonaligned,size);\n  Insertion(SWAP_nonaligned);\n  free(pivot);\n}\n\nstatic void qsort_aligned(void *base, size_t nmemb, size_t size,\n           int (*compare)(const void *, const void *)) {\n\n  stack_entry stack[STACK_SIZE];\n  int stacktop=0;\n  char *first,*last;\n  char *pivot=malloc(size);\n  size_t trunc=TRUNC_aligned*size;\n  assert(pivot!=0);\n\n  first=(char*)base; last=first+(nmemb-1)*size;\n\n  if (last-first>=trunc) {\n    char *ffirst=first,*llast=last;\n    while (1) {\n      /* Select pivot */\n      { char * mid=first+size*((last-first)/size >> 1);\n        Pivot(SWAP_aligned,size);\n        memcpy(pivot,mid,size);\n      }\n      /* Partition. */\n      Partition(SWAP_aligned,size);\n      /* Prepare to recurse/iterate. */\n      Recurse(trunc)\n    }\n  }\n  PreInsertion(SWAP_aligned,TRUNC_aligned,size);\n  Insertion(SWAP_aligned);\n  free(pivot);\n}\n\nstatic void qsort_words(void *base, size_t nmemb,\n           int (*compare)(const void *, const void *)) {\n\n  stack_entry stack[STACK_SIZE];\n  int stacktop=0;\n  char *first,*last;\n  char *pivot=malloc(WORD_BYTES);\n  assert(pivot!=0);\n\n  first=(char*)base; last=first+(nmemb-1)*WORD_BYTES;\n\n  if (last-first>=TRUNC_words) {\n    char *ffirst=first, *llast=last;\n    while (1) {\n#ifdef DEBUG_QSORT\nfprintf(stderr,\"Doing %d:%d: \",\n        (first-(char*)base)/WORD_BYTES,\n        (last-(char*)base)/WORD_BYTES);\n#endif\n      /* Select pivot */\n      { char * mid=first+WORD_BYTES*((last-first) / (2*WORD_BYTES));\n        Pivot(SWAP_words,WORD_BYTES);\n        *(int*)pivot=*(int*)mid;\n#ifdef DEBUG_QSORT\nfprintf(stderr,\"pivot = %p = #%lu = %d\\n\", mid, (unsigned long)(((int*)mid)-((int*)base)), *(int*)mid);\n#endif\n      }\n      /* Partition. */\n      Partition(SWAP_words,WORD_BYTES);\n#ifdef DEBUG_QSORT\nfprintf(stderr, \"after partitioning first=#%lu last=#%lu\\n\", (first-(char*)base)/4lu, (last-(char*)base)/4lu);\n#endif\n      /* Prepare to recurse/iterate. */\n      Recurse(TRUNC_words)\n    }\n  }\n  PreInsertion(SWAP_words,(TRUNC_words/WORD_BYTES),WORD_BYTES);\n  /* Now do insertion sort. */\n  last=((char*)base)+nmemb*WORD_BYTES;\n  for (first=((char*)base)+WORD_BYTES;first!=last;first+=WORD_BYTES) {\n    /* Find the right place for |first|. My apologies for var reuse */\n    int *pl=(int*)(first-WORD_BYTES),*pr=(int*)first;\n    *(int*)pivot=*(int*)first;\n    for (;compare(pl,pivot)>0;pr=pl,--pl) {\n      *pr=*pl; }\n    if (pr!=(int*)first) *pr=*(int*)pivot;\n  }\n  free(pivot);\n}\n\n/* ---------------------------------------------------------------------- */\n\nextern void qsortG(void *base, size_t nmemb, size_t size,\n           int (*compare)(const void *, const void *)) {\n\n  if (nmemb<=1) return;\n  if (((int)base|size)&(WORD_BYTES-1))\n    qsort_nonaligned(base,nmemb,size,compare);\n  else if (size!=WORD_BYTES)\n    qsort_aligned(base,nmemb,size,compare);\n  else\n    qsort_words(base,nmemb,compare);\n}\n\n\n#endif /* HAVE_QSORT */\n\n/* vi: set ts=4 sw=4 expandtab: */\n\n"
  },
  {
    "path": "libs/SDL2/src/stdlib/SDL_stdlib.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)\n#define SDL_DISABLE_ANALYZE_MACROS 1\n#endif\n\n#include \"../SDL_internal.h\"\n\n/* This file contains portable stdlib functions for SDL */\n\n#include \"SDL_stdinc.h\"\n#include \"../libm/math_libm.h\"\n\n\ndouble\nSDL_atan(double x)\n{\n#if defined(HAVE_ATAN)\n    return atan(x);\n#else\n    return SDL_uclibc_atan(x);\n#endif /* HAVE_ATAN */\n}\n\ndouble\nSDL_atan2(double x, double y)\n{\n#if defined(HAVE_ATAN2)\n    return atan2(x, y);\n#else\n    return SDL_uclibc_atan2(x, y);\n#endif /* HAVE_ATAN2 */\n}\n\ndouble\nSDL_acos(double val)\n{\n#if defined(HAVE_ACOS)\n    return acos(val);\n#else\n    double result;\n    if (val == -1.0) {\n        result = M_PI;\n    } else {\n        result = SDL_atan(SDL_sqrt(1.0 - val * val) / val);\n        if (result < 0.0)\n        {\n            result += M_PI;\n        }\n    }\n    return result;\n#endif\n}\n\ndouble\nSDL_asin(double val)\n{\n#if defined(HAVE_ASIN)\n    return asin(val);\n#else\n    double result;\n    if (val == -1.0) {\n        result = -(M_PI / 2.0);\n    } else {\n        result = (M_PI / 2.0) - SDL_acos(val);\n    }\n    return result;\n#endif\n}\n\ndouble\nSDL_ceil(double x)\n{\n#if defined(HAVE_CEIL)\n    return ceil(x);\n#else\n    double integer = SDL_floor(x);\n    double fraction = x - integer;\n    if (fraction > 0.0) {\n        integer += 1.0;\n    }\n    return integer;\n#endif /* HAVE_CEIL */\n}\n\ndouble\nSDL_copysign(double x, double y)\n{\n#if defined(HAVE_COPYSIGN)\n    return copysign(x, y);\n#elif defined(HAVE__COPYSIGN)\n    return _copysign(x, y);\n#else\n    return SDL_uclibc_copysign(x, y);\n#endif /* HAVE_COPYSIGN */\n}\n\ndouble\nSDL_cos(double x)\n{\n#if defined(HAVE_COS)\n    return cos(x);\n#else\n    return SDL_uclibc_cos(x);\n#endif /* HAVE_COS */\n}\n\nfloat\nSDL_cosf(float x)\n{\n#if defined(HAVE_COSF)\n    return cosf(x);\n#else\n    return (float)SDL_cos((double)x);\n#endif\n}\n\ndouble\nSDL_fabs(double x)\n{\n#if defined(HAVE_FABS)\n    return fabs(x); \n#else\n    return SDL_uclibc_fabs(x);\n#endif /* HAVE_FABS */\n}\n\ndouble\nSDL_floor(double x)\n{\n#if defined(HAVE_FLOOR)\n    return floor(x);\n#else\n    return SDL_uclibc_floor(x);\n#endif /* HAVE_FLOOR */\n}\n\ndouble\nSDL_log(double x)\n{\n#if defined(HAVE_LOG)\n    return log(x);\n#else\n    return SDL_uclibc_log(x);\n#endif /* HAVE_LOG */\n}\n\ndouble\nSDL_pow(double x, double y)\n{\n#if defined(HAVE_POW)\n    return pow(x, y);\n#else\n    return SDL_uclibc_pow(x, y);\n#endif /* HAVE_POW */\n}\n\ndouble\nSDL_scalbn(double x, int n)\n{\n#if defined(HAVE_SCALBN)\n    return scalbn(x, n);\n#elif defined(HAVE__SCALB)\n    return _scalb(x, n);\n#else\n    return SDL_uclibc_scalbn(x, n);\n#endif /* HAVE_SCALBN */\n}\n\ndouble\nSDL_sin(double x)\n{\n#if defined(HAVE_SIN)\n    return sin(x);\n#else\n    return SDL_uclibc_sin(x);\n#endif /* HAVE_SIN */\n}\n\nfloat \nSDL_sinf(float x)\n{\n#if defined(HAVE_SINF)\n    return sinf(x);\n#else\n    return (float)SDL_sin((double)x);\n#endif /* HAVE_SINF */\n}\n\ndouble\nSDL_sqrt(double x)\n{\n#if defined(HAVE_SQRT)\n    return sqrt(x);\n#else\n    return SDL_uclibc_sqrt(x);\n#endif\n}\n\nfloat\nSDL_sqrtf(float x)\n{\n#if defined(HAVE_SQRTF)\n    return sqrtf(x);\n#else\n    return (float)SDL_sqrt((double)x);\n#endif\n}\n\ndouble\nSDL_tan(double x)\n{\n#if defined(HAVE_TAN)\n    return tan(x);\n#else\n    return SDL_uclibc_tan(x);\n#endif\n}\n\nfloat\nSDL_tanf(float x)\n{\n#if defined(HAVE_TANF)\n    return tanf(x);\n#else\n    return (float)SDL_tan((double)x);\n#endif\n}\n\nint SDL_abs(int x)\n{\n#if defined(HAVE_ABS)\n    return abs(x);\n#else\n    return ((x) < 0 ? -(x) : (x));\n#endif\n}\n\n#if defined(HAVE_CTYPE_H)\nint SDL_isdigit(int x) { return isdigit(x); }\nint SDL_isspace(int x) { return isspace(x); }\nint SDL_toupper(int x) { return toupper(x); }\nint SDL_tolower(int x) { return tolower(x); }\n#else\nint SDL_isdigit(int x) { return ((x) >= '0') && ((x) <= '9'); }\nint SDL_isspace(int x) { return ((x) == ' ') || ((x) == '\\t') || ((x) == '\\r') || ((x) == '\\n') || ((x) == '\\f') || ((x) == '\\v'); }\nint SDL_toupper(int x) { return ((x) >= 'a') && ((x) <= 'z') ? ('A'+((x)-'a')) : (x); }\nint SDL_tolower(int x) { return ((x) >= 'A') && ((x) <= 'Z') ? ('a'+((x)-'A')) : (x); }\n#endif\n\n\n#ifndef HAVE_LIBC\n/* These are some C runtime intrinsics that need to be defined */\n\n#if defined(_MSC_VER)\n\n#ifndef __FLTUSED__\n#define __FLTUSED__\n__declspec(selectany) int _fltused = 1;\n#endif\n\n/* The optimizer on Visual Studio 2005 and later generates memcpy() calls */\n#if (_MSC_VER >= 1400) && defined(_WIN64) && !defined(_DEBUG) && !(_MSC_VER >= 1900 && defined(_MT))\n#include <intrin.h>\n\n#pragma function(memcpy)\nvoid * memcpy ( void * destination, const void * source, size_t num )\n{\n    const Uint8 *src = (const Uint8 *)source;\n    Uint8 *dst = (Uint8 *)destination;\n    size_t i;\n    \n    /* All WIN64 architectures have SSE, right? */\n    if (!((uintptr_t) src & 15) && !((uintptr_t) dst & 15)) {\n        __m128 values[4];\n        for (i = num / 64; i--;) {\n            _mm_prefetch(src, _MM_HINT_NTA);\n            values[0] = *(__m128 *) (src + 0);\n            values[1] = *(__m128 *) (src + 16);\n            values[2] = *(__m128 *) (src + 32);\n            values[3] = *(__m128 *) (src + 48);\n            _mm_stream_ps((float *) (dst + 0), values[0]);\n            _mm_stream_ps((float *) (dst + 16), values[1]);\n            _mm_stream_ps((float *) (dst + 32), values[2]);\n            _mm_stream_ps((float *) (dst + 48), values[3]);\n            src += 64;\n            dst += 64;\n        }\n        num &= 63;\n    }\n\n    while (num--) {\n        *dst++ = *src++;\n    }\n    return destination;\n}\n#endif /* _MSC_VER == 1600 && defined(_WIN64) && !defined(_DEBUG) */\n\n#ifdef _M_IX86\n\n/* Float to long */\nvoid\n__declspec(naked)\n_ftol()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        push        ebp\n        mov         ebp,esp\n        sub         esp,20h\n        and         esp,0FFFFFFF0h\n        fld         st(0)\n        fst         dword ptr [esp+18h]\n        fistp       qword ptr [esp+10h]\n        fild        qword ptr [esp+10h]\n        mov         edx,dword ptr [esp+18h]\n        mov         eax,dword ptr [esp+10h]\n        test        eax,eax\n        je          integer_QnaN_or_zero\narg_is_not_integer_QnaN:\n        fsubp       st(1),st\n        test        edx,edx\n        jns         positive\n        fstp        dword ptr [esp]\n        mov         ecx,dword ptr [esp]\n        xor         ecx,80000000h\n        add         ecx,7FFFFFFFh\n        adc         eax,0\n        mov         edx,dword ptr [esp+14h]\n        adc         edx,0\n        jmp         localexit\npositive:\n        fstp        dword ptr [esp]\n        mov         ecx,dword ptr [esp]\n        add         ecx,7FFFFFFFh\n        sbb         eax,0\n        mov         edx,dword ptr [esp+14h]\n        sbb         edx,0\n        jmp         localexit\ninteger_QnaN_or_zero:\n        mov         edx,dword ptr [esp+14h]\n        test        edx,7FFFFFFFh\n        jne         arg_is_not_integer_QnaN\n        fstp        dword ptr [esp+18h]\n        fstp        dword ptr [esp+18h]\nlocalexit:\n        leave\n        ret\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n_ftol2_sse()\n{\n    _ftol();\n}\n\n/* 64-bit math operators for 32-bit systems */\nvoid\n__declspec(naked)\n_allmul()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        mov         eax, dword ptr[esp+8]\n        mov         ecx, dword ptr[esp+10h]\n        or          ecx, eax\n        mov         ecx, dword ptr[esp+0Ch]\n        jne         hard\n        mov         eax, dword ptr[esp+4]\n        mul         ecx\n        ret         10h\nhard:\n        push        ebx\n        mul         ecx\n        mov         ebx, eax\n        mov         eax, dword ptr[esp+8]\n        mul         dword ptr[esp+14h]\n        add         ebx, eax\n        mov         eax, dword ptr[esp+8]\n        mul         ecx\n        add         edx, ebx\n        pop         ebx\n        ret         10h\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n__declspec(naked)\n_alldiv()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        push        edi\n        push        esi\n        push        ebx\n        xor         edi,edi\n        mov         eax,dword ptr [esp+14h]\n        or          eax,eax\n        jge         L1\n        inc         edi\n        mov         edx,dword ptr [esp+10h]\n        neg         eax\n        neg         edx\n        sbb         eax,0\n        mov         dword ptr [esp+14h],eax\n        mov         dword ptr [esp+10h],edx\nL1:\n        mov         eax,dword ptr [esp+1Ch]\n        or          eax,eax\n        jge         L2\n        inc         edi\n        mov         edx,dword ptr [esp+18h]\n        neg         eax\n        neg         edx\n        sbb         eax,0\n        mov         dword ptr [esp+1Ch],eax\n        mov         dword ptr [esp+18h],edx\nL2:\n        or          eax,eax\n        jne         L3\n        mov         ecx,dword ptr [esp+18h]\n        mov         eax,dword ptr [esp+14h]\n        xor         edx,edx\n        div         ecx\n        mov         ebx,eax\n        mov         eax,dword ptr [esp+10h]\n        div         ecx\n        mov         edx,ebx\n        jmp         L4\nL3:\n        mov         ebx,eax\n        mov         ecx,dword ptr [esp+18h]\n        mov         edx,dword ptr [esp+14h]\n        mov         eax,dword ptr [esp+10h]\nL5:\n        shr         ebx,1\n        rcr         ecx,1\n        shr         edx,1\n        rcr         eax,1\n        or          ebx,ebx\n        jne         L5\n        div         ecx\n        mov         esi,eax\n        mul         dword ptr [esp+1Ch]\n        mov         ecx,eax\n        mov         eax,dword ptr [esp+18h]\n        mul         esi\n        add         edx,ecx\n        jb          L6\n        cmp         edx,dword ptr [esp+14h]\n        ja          L6\n        jb          L7\n        cmp         eax,dword ptr [esp+10h]\n        jbe         L7\nL6:\n        dec         esi\nL7:\n        xor         edx,edx\n        mov         eax,esi\nL4:\n        dec         edi\n        jne         L8\n        neg         edx\n        neg         eax\n        sbb         edx,0\nL8:\n        pop         ebx\n        pop         esi\n        pop         edi\n        ret         10h\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n__declspec(naked)\n_aulldiv()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        push        ebx\n        push        esi\n        mov         eax,dword ptr [esp+18h]\n        or          eax,eax\n        jne         L1\n        mov         ecx,dword ptr [esp+14h]\n        mov         eax,dword ptr [esp+10h]\n        xor         edx,edx\n        div         ecx\n        mov         ebx,eax\n        mov         eax,dword ptr [esp+0Ch]\n        div         ecx\n        mov         edx,ebx\n        jmp         L2\nL1:\n        mov         ecx,eax\n        mov         ebx,dword ptr [esp+14h]\n        mov         edx,dword ptr [esp+10h]\n        mov         eax,dword ptr [esp+0Ch]\nL3:\n        shr         ecx,1\n        rcr         ebx,1\n        shr         edx,1\n        rcr         eax,1\n        or          ecx,ecx\n        jne         L3\n        div         ebx\n        mov         esi,eax\n        mul         dword ptr [esp+18h]\n        mov         ecx,eax\n        mov         eax,dword ptr [esp+14h]\n        mul         esi\n        add         edx,ecx\n        jb          L4\n        cmp         edx,dword ptr [esp+10h]\n        ja          L4\n        jb          L5\n        cmp         eax,dword ptr [esp+0Ch]\n        jbe         L5\nL4:\n        dec         esi\nL5:\n        xor         edx,edx\n        mov         eax,esi\nL2:\n        pop         esi\n        pop         ebx\n        ret         10h\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n__declspec(naked)\n_allrem()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        push        ebx\n        push        edi\n        xor         edi,edi\n        mov         eax,dword ptr [esp+10h]\n        or          eax,eax\n        jge         L1\n        inc         edi\n        mov         edx,dword ptr [esp+0Ch]\n        neg         eax\n        neg         edx\n        sbb         eax,0\n        mov         dword ptr [esp+10h],eax\n        mov         dword ptr [esp+0Ch],edx\nL1:\n        mov         eax,dword ptr [esp+18h]\n        or          eax,eax\n        jge         L2\n        mov         edx,dword ptr [esp+14h]\n        neg         eax\n        neg         edx\n        sbb         eax,0\n        mov         dword ptr [esp+18h],eax\n        mov         dword ptr [esp+14h],edx\nL2:\n        or          eax,eax\n        jne         L3\n        mov         ecx,dword ptr [esp+14h]\n        mov         eax,dword ptr [esp+10h]\n        xor         edx,edx\n        div         ecx\n        mov         eax,dword ptr [esp+0Ch]\n        div         ecx\n        mov         eax,edx\n        xor         edx,edx\n        dec         edi\n        jns         L4\n        jmp         L8\nL3:\n        mov         ebx,eax\n        mov         ecx,dword ptr [esp+14h]\n        mov         edx,dword ptr [esp+10h]\n        mov         eax,dword ptr [esp+0Ch]\nL5:\n        shr         ebx,1\n        rcr         ecx,1\n        shr         edx,1\n        rcr         eax,1\n        or          ebx,ebx\n        jne         L5\n        div         ecx\n        mov         ecx,eax\n        mul         dword ptr [esp+18h]\n        xchg        eax,ecx\n        mul         dword ptr [esp+14h]\n        add         edx,ecx\n        jb          L6\n        cmp         edx,dword ptr [esp+10h]\n        ja          L6\n        jb          L7\n        cmp         eax,dword ptr [esp+0Ch]\n        jbe         L7\nL6:\n        sub         eax,dword ptr [esp+14h]\n        sbb         edx,dword ptr [esp+18h]\nL7:\n        sub         eax,dword ptr [esp+0Ch]\n        sbb         edx,dword ptr [esp+10h]\n        dec         edi\n        jns         L8\nL4:\n        neg         edx\n        neg         eax\n        sbb         edx,0\nL8:\n        pop         edi\n        pop         ebx\n        ret         10h\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n__declspec(naked)\n_aullrem()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        push        ebx\n        mov         eax,dword ptr [esp+14h]\n        or          eax,eax\n        jne         L1\n        mov         ecx,dword ptr [esp+10h]\n        mov         eax,dword ptr [esp+0Ch]\n        xor         edx,edx\n        div         ecx\n        mov         eax,dword ptr [esp+8]\n        div         ecx\n        mov         eax,edx\n        xor         edx,edx\n        jmp         L2\nL1:\n        mov         ecx,eax\n        mov         ebx,dword ptr [esp+10h]\n        mov         edx,dword ptr [esp+0Ch]\n        mov         eax,dword ptr [esp+8]\nL3:\n        shr         ecx,1\n        rcr         ebx,1\n        shr         edx,1\n        rcr         eax,1\n        or          ecx,ecx\n        jne         L3\n        div         ebx\n        mov         ecx,eax\n        mul         dword ptr [esp+14h]\n        xchg        eax,ecx\n        mul         dword ptr [esp+10h]\n        add         edx,ecx\n        jb          L4\n        cmp         edx,dword ptr [esp+0Ch]\n        ja          L4\n        jb          L5\n        cmp         eax,dword ptr [esp+8]\n        jbe         L5\nL4:\n        sub         eax,dword ptr [esp+10h]\n        sbb         edx,dword ptr [esp+14h]\nL5:\n        sub         eax,dword ptr [esp+8]\n        sbb         edx,dword ptr [esp+0Ch]\n        neg         edx\n        neg         eax\n        sbb         edx,0\nL2:\n        pop         ebx\n        ret         10h\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n__declspec(naked)\n_alldvrm()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        push        edi\n        push        esi\n        push        ebp\n        xor         edi,edi\n        xor         ebp,ebp\n        mov         eax,dword ptr [esp+14h]\n        or          eax,eax\n        jge         L1\n        inc         edi\n        inc         ebp\n        mov         edx,dword ptr [esp+10h]\n        neg         eax\n        neg         edx\n        sbb         eax,0\n        mov         dword ptr [esp+14h],eax\n        mov         dword ptr [esp+10h],edx\nL1:\n        mov         eax,dword ptr [esp+1Ch]\n        or          eax,eax\n        jge         L2\n        inc         edi\n        mov         edx,dword ptr [esp+18h]\n        neg         eax\n        neg         edx\n        sbb         eax,0\n        mov         dword ptr [esp+1Ch],eax\n        mov         dword ptr [esp+18h],edx\nL2:\n        or          eax,eax\n        jne         L3\n        mov         ecx,dword ptr [esp+18h]\n        mov         eax,dword ptr [esp+14h]\n        xor         edx,edx\n        div         ecx\n        mov         ebx,eax\n        mov         eax,dword ptr [esp+10h]\n        div         ecx\n        mov         esi,eax\n        mov         eax,ebx\n        mul         dword ptr [esp+18h]\n        mov         ecx,eax\n        mov         eax,esi\n        mul         dword ptr [esp+18h]\n        add         edx,ecx\n        jmp         L4\nL3:\n        mov         ebx,eax\n        mov         ecx,dword ptr [esp+18h]\n        mov         edx,dword ptr [esp+14h]\n        mov         eax,dword ptr [esp+10h]\nL5:\n        shr         ebx,1\n        rcr         ecx,1\n        shr         edx,1\n        rcr         eax,1\n        or          ebx,ebx\n        jne         L5\n        div         ecx\n        mov         esi,eax\n        mul         dword ptr [esp+1Ch]\n        mov         ecx,eax\n        mov         eax,dword ptr [esp+18h]\n        mul         esi\n        add         edx,ecx\n        jb          L6\n        cmp         edx,dword ptr [esp+14h]\n        ja          L6\n        jb          L7\n        cmp         eax,dword ptr [esp+10h]\n        jbe         L7\nL6:\n        dec         esi\n        sub         eax,dword ptr [esp+18h]\n        sbb         edx,dword ptr [esp+1Ch]\nL7:\n        xor         ebx,ebx\nL4:\n        sub         eax,dword ptr [esp+10h]\n        sbb         edx,dword ptr [esp+14h]\n        dec         ebp\n        jns         L9\n        neg         edx\n        neg         eax\n        sbb         edx,0\nL9:\n        mov         ecx,edx\n        mov         edx,ebx\n        mov         ebx,ecx\n        mov         ecx,eax\n        mov         eax,esi\n        dec         edi\n        jne         L8\n        neg         edx\n        neg         eax\n        sbb         edx,0\nL8:\n        pop         ebp\n        pop         esi\n        pop         edi\n        ret         10h\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n__declspec(naked)\n_aulldvrm()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        push        esi\n        mov         eax,dword ptr [esp+14h]\n        or          eax,eax\n        jne         L1\n        mov         ecx,dword ptr [esp+10h]\n        mov         eax,dword ptr [esp+0Ch]\n        xor         edx,edx\n        div         ecx\n        mov         ebx,eax\n        mov         eax,dword ptr [esp+8]\n        div         ecx\n        mov         esi,eax\n        mov         eax,ebx\n        mul         dword ptr [esp+10h]\n        mov         ecx,eax\n        mov         eax,esi\n        mul         dword ptr [esp+10h]\n        add         edx,ecx\n        jmp         L2\nL1:\n        mov         ecx,eax\n        mov         ebx,dword ptr [esp+10h]\n        mov         edx,dword ptr [esp+0Ch]\n        mov         eax,dword ptr [esp+8]\nL3:\n        shr         ecx,1\n        rcr         ebx,1\n        shr         edx,1\n        rcr         eax,1\n        or          ecx,ecx\n        jne         L3\n        div         ebx\n        mov         esi,eax\n        mul         dword ptr [esp+14h]\n        mov         ecx,eax\n        mov         eax,dword ptr [esp+10h]\n        mul         esi\n        add         edx,ecx\n        jb          L4\n        cmp         edx,dword ptr [esp+0Ch]\n        ja          L4\n        jb          L5\n        cmp         eax,dword ptr [esp+8]\n        jbe         L5\nL4:\n        dec         esi\n        sub         eax,dword ptr [esp+10h]\n        sbb         edx,dword ptr [esp+14h]\nL5:\n        xor         ebx,ebx\nL2:\n        sub         eax,dword ptr [esp+8]\n        sbb         edx,dword ptr [esp+0Ch]\n        neg         edx\n        neg         eax\n        sbb         edx,0\n        mov         ecx,edx\n        mov         edx,ebx\n        mov         ebx,ecx\n        mov         ecx,eax\n        mov         eax,esi\n        pop         esi\n        ret         10h\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n__declspec(naked)\n_allshl()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        cmp         cl,40h\n        jae         RETZERO\n        cmp         cl,20h\n        jae         MORE32\n        shld        edx,eax,cl\n        shl         eax,cl\n        ret\nMORE32:\n        mov         edx,eax\n        xor         eax,eax\n        and         cl,1Fh\n        shl         edx,cl\n        ret\nRETZERO:\n        xor         eax,eax\n        xor         edx,edx\n        ret\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n__declspec(naked)\n_allshr()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        cmp         cl,40h\n        jae         RETZERO\n        cmp         cl,20h\n        jae         MORE32\n        shrd        eax,edx,cl\n        sar         edx,cl\n        ret\nMORE32:\n        mov         eax,edx\n        xor         edx,edx\n        and         cl,1Fh\n        sar         eax,cl\n        ret\nRETZERO:\n        xor         eax,eax\n        xor         edx,edx\n        ret\n    }\n    /* *INDENT-ON* */\n}\n\nvoid\n__declspec(naked)\n_aullshr()\n{\n    /* *INDENT-OFF* */\n    __asm {\n        cmp         cl,40h\n        jae         RETZERO\n        cmp         cl,20h\n        jae         MORE32\n        shrd        eax,edx,cl\n        shr         edx,cl\n        ret\nMORE32:\n        mov         eax,edx\n        xor         edx,edx\n        and         cl,1Fh\n        shr         eax,cl\n        ret\nRETZERO:\n        xor         eax,eax\n        xor         edx,edx\n        ret\n    }\n    /* *INDENT-ON* */\n}\n\n#endif /* _M_IX86 */\n\n#endif /* MSC_VER */\n\n#endif /* !HAVE_LIBC */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/stdlib/SDL_string.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)\n#define SDL_DISABLE_ANALYZE_MACROS 1\n#endif\n\n#ifndef _GNU_SOURCE\n#define _GNU_SOURCE 1\n#endif\n\n#include \"../SDL_internal.h\"\n\n/* This file contains portable string manipulation functions for SDL */\n\n#include \"SDL_stdinc.h\"\n\n\n#define SDL_isupperhex(X)   (((X) >= 'A') && ((X) <= 'F'))\n#define SDL_islowerhex(X)   (((X) >= 'a') && ((X) <= 'f'))\n\n#define UTF8_IsLeadByte(c) ((c) >= 0xC0 && (c) <= 0xF4)\n#define UTF8_IsTrailingByte(c) ((c) >= 0x80 && (c) <= 0xBF)\n\nstatic int UTF8_TrailingBytes(unsigned char c)\n{\n    if (c >= 0xC0 && c <= 0xDF)\n        return 1;\n    else if (c >= 0xE0 && c <= 0xEF)\n        return 2;\n    else if (c >= 0xF0 && c <= 0xF4)\n        return 3;\n    else\n        return 0;\n}\n\n#if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOL)\nstatic size_t\nSDL_ScanLong(const char *text, int radix, long *valuep)\n{\n    const char *textstart = text;\n    long value = 0;\n    SDL_bool negative = SDL_FALSE;\n\n    if (*text == '-') {\n        negative = SDL_TRUE;\n        ++text;\n    }\n    if (radix == 16 && SDL_strncmp(text, \"0x\", 2) == 0) {\n        text += 2;\n    }\n    for (;;) {\n        int v;\n        if (SDL_isdigit((unsigned char) *text)) {\n            v = *text - '0';\n        } else if (radix == 16 && SDL_isupperhex(*text)) {\n            v = 10 + (*text - 'A');\n        } else if (radix == 16 && SDL_islowerhex(*text)) {\n            v = 10 + (*text - 'a');\n        } else {\n            break;\n        }\n        value *= radix;\n        value += v;\n        ++text;\n    }\n    if (valuep) {\n        if (negative && value) {\n            *valuep = -value;\n        } else {\n            *valuep = value;\n        }\n    }\n    return (text - textstart);\n}\n#endif\n\n#if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOUL) || !defined(HAVE_STRTOD)\nstatic size_t\nSDL_ScanUnsignedLong(const char *text, int radix, unsigned long *valuep)\n{\n    const char *textstart = text;\n    unsigned long value = 0;\n\n    if (radix == 16 && SDL_strncmp(text, \"0x\", 2) == 0) {\n        text += 2;\n    }\n    for (;;) {\n        int v;\n        if (SDL_isdigit((unsigned char) *text)) {\n            v = *text - '0';\n        } else if (radix == 16 && SDL_isupperhex(*text)) {\n            v = 10 + (*text - 'A');\n        } else if (radix == 16 && SDL_islowerhex(*text)) {\n            v = 10 + (*text - 'a');\n        } else {\n            break;\n        }\n        value *= radix;\n        value += v;\n        ++text;\n    }\n    if (valuep) {\n        *valuep = value;\n    }\n    return (text - textstart);\n}\n#endif\n\n#ifndef HAVE_VSSCANF\nstatic size_t\nSDL_ScanUintPtrT(const char *text, int radix, uintptr_t * valuep)\n{\n    const char *textstart = text;\n    uintptr_t value = 0;\n\n    if (radix == 16 && SDL_strncmp(text, \"0x\", 2) == 0) {\n        text += 2;\n    }\n    for (;;) {\n        int v;\n        if (SDL_isdigit((unsigned char) *text)) {\n            v = *text - '0';\n        } else if (radix == 16 && SDL_isupperhex(*text)) {\n            v = 10 + (*text - 'A');\n        } else if (radix == 16 && SDL_islowerhex(*text)) {\n            v = 10 + (*text - 'a');\n        } else {\n            break;\n        }\n        value *= radix;\n        value += v;\n        ++text;\n    }\n    if (valuep) {\n        *valuep = value;\n    }\n    return (text - textstart);\n}\n#endif\n\n#if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOLL)\nstatic size_t\nSDL_ScanLongLong(const char *text, int radix, Sint64 * valuep)\n{\n    const char *textstart = text;\n    Sint64 value = 0;\n    SDL_bool negative = SDL_FALSE;\n\n    if (*text == '-') {\n        negative = SDL_TRUE;\n        ++text;\n    }\n    if (radix == 16 && SDL_strncmp(text, \"0x\", 2) == 0) {\n        text += 2;\n    }\n    for (;;) {\n        int v;\n        if (SDL_isdigit((unsigned char) *text)) {\n            v = *text - '0';\n        } else if (radix == 16 && SDL_isupperhex(*text)) {\n            v = 10 + (*text - 'A');\n        } else if (radix == 16 && SDL_islowerhex(*text)) {\n            v = 10 + (*text - 'a');\n        } else {\n            break;\n        }\n        value *= radix;\n        value += v;\n        ++text;\n    }\n    if (valuep) {\n        if (negative && value) {\n            *valuep = -value;\n        } else {\n            *valuep = value;\n        }\n    }\n    return (text - textstart);\n}\n#endif\n\n#if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOULL)\nstatic size_t\nSDL_ScanUnsignedLongLong(const char *text, int radix, Uint64 * valuep)\n{\n    const char *textstart = text;\n    Uint64 value = 0;\n\n    if (radix == 16 && SDL_strncmp(text, \"0x\", 2) == 0) {\n        text += 2;\n    }\n    for (;;) {\n        int v;\n        if (SDL_isdigit((unsigned char) *text)) {\n            v = *text - '0';\n        } else if (radix == 16 && SDL_isupperhex(*text)) {\n            v = 10 + (*text - 'A');\n        } else if (radix == 16 && SDL_islowerhex(*text)) {\n            v = 10 + (*text - 'a');\n        } else {\n            break;\n        }\n        value *= radix;\n        value += v;\n        ++text;\n    }\n    if (valuep) {\n        *valuep = value;\n    }\n    return (text - textstart);\n}\n#endif\n\n#if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOD)\nstatic size_t\nSDL_ScanFloat(const char *text, double *valuep)\n{\n    const char *textstart = text;\n    unsigned long lvalue = 0;\n    double value = 0.0;\n    SDL_bool negative = SDL_FALSE;\n\n    if (*text == '-') {\n        negative = SDL_TRUE;\n        ++text;\n    }\n    text += SDL_ScanUnsignedLong(text, 10, &lvalue);\n    value += lvalue;\n    if (*text == '.') {\n        int mult = 10;\n        ++text;\n        while (SDL_isdigit((unsigned char) *text)) {\n            lvalue = *text - '0';\n            value += (double) lvalue / mult;\n            mult *= 10;\n            ++text;\n        }\n    }\n    if (valuep) {\n        if (negative && value) {\n            *valuep = -value;\n        } else {\n            *valuep = value;\n        }\n    }\n    return (text - textstart);\n}\n#endif\n\nvoid *\nSDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len)\n{\n#if defined(HAVE_MEMSET)\n    return memset(dst, c, len);\n#else\n    size_t left;\n    Uint32 *dstp4;\n    Uint8 *dstp1 = (Uint8 *) dst;\n    Uint32 value4 = (c | (c << 8) | (c << 16) | (c << 24));\n    Uint8 value1 = (Uint8) c;\n\n    /* The destination pointer needs to be aligned on a 4-byte boundary to\n     * execute a 32-bit set. Set first bytes manually if needed until it is\n     * aligned. */\n    while ((intptr_t)dstp1 & 0x3) {\n        if (len--) {\n            *dstp1++ = value1;\n        } else {\n            return dst;\n        }\n    }\n\n    dstp4 = (Uint32 *) dstp1;\n    left = (len % 4);\n    len /= 4;\n    while (len--) {\n        *dstp4++ = value4;\n    }\n\n    dstp1 = (Uint8 *) dstp4;\n    switch (left) {\n    case 3:\n        *dstp1++ = value1;\n    case 2:\n        *dstp1++ = value1;\n    case 1:\n        *dstp1++ = value1;\n    }\n\n    return dst;\n#endif /* HAVE_MEMSET */\n}\n\nvoid *\nSDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len)\n{\n#ifdef __GNUC__\n    /* Presumably this is well tuned for speed.\n       On my machine this is twice as fast as the C code below.\n     */\n    return __builtin_memcpy(dst, src, len);\n#elif defined(HAVE_MEMCPY)\n    return memcpy(dst, src, len);\n#elif defined(HAVE_BCOPY)\n    bcopy(src, dst, len);\n    return dst;\n#else\n    /* GCC 4.9.0 with -O3 will generate movaps instructions with the loop\n       using Uint32* pointers, so we need to make sure the pointers are\n       aligned before we loop using them.\n     */\n    if (((intptr_t)src & 0x3) || ((intptr_t)dst & 0x3)) {\n        /* Do an unaligned byte copy */\n        Uint8 *srcp1 = (Uint8 *)src;\n        Uint8 *dstp1 = (Uint8 *)dst;\n\n        while (len--) {\n            *dstp1++ = *srcp1++;\n        }\n    } else {\n        size_t left = (len % 4);\n        Uint32 *srcp4, *dstp4;\n        Uint8 *srcp1, *dstp1;\n\n        srcp4 = (Uint32 *) src;\n        dstp4 = (Uint32 *) dst;\n        len /= 4;\n        while (len--) {\n            *dstp4++ = *srcp4++;\n        }\n\n        srcp1 = (Uint8 *) srcp4;\n        dstp1 = (Uint8 *) dstp4;\n        switch (left) {\n        case 3:\n            *dstp1++ = *srcp1++;\n        case 2:\n            *dstp1++ = *srcp1++;\n        case 1:\n            *dstp1++ = *srcp1++;\n        }\n    }\n    return dst;\n#endif /* __GNUC__ */\n}\n\nvoid *\nSDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len)\n{\n#if defined(HAVE_MEMMOVE)\n    return memmove(dst, src, len);\n#else\n    char *srcp = (char *) src;\n    char *dstp = (char *) dst;\n\n    if (src < dst) {\n        srcp += len - 1;\n        dstp += len - 1;\n        while (len--) {\n            *dstp-- = *srcp--;\n        }\n    } else {\n        while (len--) {\n            *dstp++ = *srcp++;\n        }\n    }\n    return dst;\n#endif /* HAVE_MEMMOVE */\n}\n\nint\nSDL_memcmp(const void *s1, const void *s2, size_t len)\n{\n#if defined(HAVE_MEMCMP)\n    return memcmp(s1, s2, len);\n#else\n    char *s1p = (char *) s1;\n    char *s2p = (char *) s2;\n    while (len--) {\n        if (*s1p != *s2p) {\n            return (*s1p - *s2p);\n        }\n        ++s1p;\n        ++s2p;\n    }\n    return 0;\n#endif /* HAVE_MEMCMP */\n}\n\nsize_t\nSDL_strlen(const char *string)\n{\n#if defined(HAVE_STRLEN)\n    return strlen(string);\n#else\n    size_t len = 0;\n    while (*string++) {\n        ++len;\n    }\n    return len;\n#endif /* HAVE_STRLEN */\n}\n\nsize_t\nSDL_wcslen(const wchar_t * string)\n{\n#if defined(HAVE_WCSLEN)\n    return wcslen(string);\n#else\n    size_t len = 0;\n    while (*string++) {\n        ++len;\n    }\n    return len;\n#endif /* HAVE_WCSLEN */\n}\n\nsize_t\nSDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen)\n{\n#if defined(HAVE_WCSLCPY)\n    return wcslcpy(dst, src, maxlen);\n#else\n    size_t srclen = SDL_wcslen(src);\n    if (maxlen > 0) {\n        size_t len = SDL_min(srclen, maxlen - 1);\n        SDL_memcpy(dst, src, len * sizeof(wchar_t));\n        dst[len] = '\\0';\n    }\n    return srclen;\n#endif /* HAVE_WCSLCPY */\n}\n\nsize_t\nSDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen)\n{\n#if defined(HAVE_WCSLCAT)\n    return wcslcat(dst, src, maxlen);\n#else\n    size_t dstlen = SDL_wcslen(dst);\n    size_t srclen = SDL_wcslen(src);\n    if (dstlen < maxlen) {\n        SDL_wcslcpy(dst + dstlen, src, maxlen - dstlen);\n    }\n    return dstlen + srclen;\n#endif /* HAVE_WCSLCAT */\n}\n\nsize_t\nSDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen)\n{\n#if defined(HAVE_STRLCPY)\n    return strlcpy(dst, src, maxlen);\n#else\n    size_t srclen = SDL_strlen(src);\n    if (maxlen > 0) {\n        size_t len = SDL_min(srclen, maxlen - 1);\n        SDL_memcpy(dst, src, len);\n        dst[len] = '\\0';\n    }\n    return srclen;\n#endif /* HAVE_STRLCPY */\n}\n\nsize_t SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes)\n{\n    size_t src_bytes = SDL_strlen(src);\n    size_t bytes = SDL_min(src_bytes, dst_bytes - 1);\n    size_t i = 0;\n    char trailing_bytes = 0;\n    if (bytes)\n    {\n        unsigned char c = (unsigned char)src[bytes - 1];\n        if (UTF8_IsLeadByte(c))\n            --bytes;\n        else if (UTF8_IsTrailingByte(c))\n        {\n            for (i = bytes - 1; i != 0; --i)\n            {\n                c = (unsigned char)src[i];\n                trailing_bytes = UTF8_TrailingBytes(c);\n                if (trailing_bytes)\n                {\n                    if (bytes - i != trailing_bytes + 1)\n                        bytes = i;\n\n                    break;\n                }\n            }\n        }\n        SDL_memcpy(dst, src, bytes);\n    }\n    dst[bytes] = '\\0';\n    return bytes;\n}\n\nsize_t\nSDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen)\n{\n#if defined(HAVE_STRLCAT)\n    return strlcat(dst, src, maxlen);\n#else\n    size_t dstlen = SDL_strlen(dst);\n    size_t srclen = SDL_strlen(src);\n    if (dstlen < maxlen) {\n        SDL_strlcpy(dst + dstlen, src, maxlen - dstlen);\n    }\n    return dstlen + srclen;\n#endif /* HAVE_STRLCAT */\n}\n\nchar *\nSDL_strdup(const char *string)\n{\n#if defined(HAVE_STRDUP)\n    return strdup(string);\n#else\n    size_t len = SDL_strlen(string) + 1;\n    char *newstr = SDL_malloc(len);\n    if (newstr) {\n        SDL_strlcpy(newstr, string, len);\n    }\n    return newstr;\n#endif /* HAVE_STRDUP */\n}\n\nchar *\nSDL_strrev(char *string)\n{\n#if defined(HAVE__STRREV)\n    return _strrev(string);\n#else\n    size_t len = SDL_strlen(string);\n    char *a = &string[0];\n    char *b = &string[len - 1];\n    len /= 2;\n    while (len--) {\n        char c = *a;\n        *a++ = *b;\n        *b-- = c;\n    }\n    return string;\n#endif /* HAVE__STRREV */\n}\n\nchar *\nSDL_strupr(char *string)\n{\n#if defined(HAVE__STRUPR)\n    return _strupr(string);\n#else\n    char *bufp = string;\n    while (*bufp) {\n        *bufp = SDL_toupper((unsigned char) *bufp);\n        ++bufp;\n    }\n    return string;\n#endif /* HAVE__STRUPR */\n}\n\nchar *\nSDL_strlwr(char *string)\n{\n#if defined(HAVE__STRLWR)\n    return _strlwr(string);\n#else\n    char *bufp = string;\n    while (*bufp) {\n        *bufp = SDL_tolower((unsigned char) *bufp);\n        ++bufp;\n    }\n    return string;\n#endif /* HAVE__STRLWR */\n}\n\nchar *\nSDL_strchr(const char *string, int c)\n{\n#ifdef HAVE_STRCHR\n    return SDL_const_cast(char*,strchr(string, c));\n#elif defined(HAVE_INDEX)\n    return SDL_const_cast(char*,index(string, c));\n#else\n    while (*string) {\n        if (*string == c) {\n            return (char *) string;\n        }\n        ++string;\n    }\n    return NULL;\n#endif /* HAVE_STRCHR */\n}\n\nchar *\nSDL_strrchr(const char *string, int c)\n{\n#ifdef HAVE_STRRCHR\n    return SDL_const_cast(char*,strrchr(string, c));\n#elif defined(HAVE_RINDEX)\n    return SDL_const_cast(char*,rindex(string, c));\n#else\n    const char *bufp = string + SDL_strlen(string) - 1;\n    while (bufp >= string) {\n        if (*bufp == c) {\n            return (char *) bufp;\n        }\n        --bufp;\n    }\n    return NULL;\n#endif /* HAVE_STRRCHR */\n}\n\nchar *\nSDL_strstr(const char *haystack, const char *needle)\n{\n#if defined(HAVE_STRSTR)\n    return SDL_const_cast(char*,strstr(haystack, needle));\n#else\n    size_t length = SDL_strlen(needle);\n    while (*haystack) {\n        if (SDL_strncmp(haystack, needle, length) == 0) {\n            return (char *) haystack;\n        }\n        ++haystack;\n    }\n    return NULL;\n#endif /* HAVE_STRSTR */\n}\n\n#if !defined(HAVE__LTOA) || !defined(HAVE__I64TOA) || \\\n    !defined(HAVE__ULTOA) || !defined(HAVE__UI64TOA)\nstatic const char ntoa_table[] = {\n    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',\n    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',\n    'U', 'V', 'W', 'X', 'Y', 'Z'\n};\n#endif /* ntoa() conversion table */\n\nchar *\nSDL_itoa(int value, char *string, int radix)\n{\n#ifdef HAVE_ITOA\n    return itoa(value, string, radix);\n#else\n    return SDL_ltoa((long)value, string, radix);\n#endif /* HAVE_ITOA */\n}\n\nchar *\nSDL_uitoa(unsigned int value, char *string, int radix)\n{\n#ifdef HAVE__UITOA\n    return _uitoa(value, string, radix);\n#else\n    return SDL_ultoa((unsigned long)value, string, radix);\n#endif /* HAVE__UITOA */\n}\n\nchar *\nSDL_ltoa(long value, char *string, int radix)\n{\n#if defined(HAVE__LTOA)\n    return _ltoa(value, string, radix);\n#else\n    char *bufp = string;\n\n    if (value < 0) {\n        *bufp++ = '-';\n        SDL_ultoa(-value, bufp, radix);\n    } else {\n        SDL_ultoa(value, bufp, radix);\n    }\n\n    return string;\n#endif /* HAVE__LTOA */\n}\n\nchar *\nSDL_ultoa(unsigned long value, char *string, int radix)\n{\n#if defined(HAVE__ULTOA)\n    return _ultoa(value, string, radix);\n#else\n    char *bufp = string;\n\n    if (value) {\n        while (value > 0) {\n            *bufp++ = ntoa_table[value % radix];\n            value /= radix;\n        }\n    } else {\n        *bufp++ = '0';\n    }\n    *bufp = '\\0';\n\n    /* The numbers went into the string backwards. :) */\n    SDL_strrev(string);\n\n    return string;\n#endif /* HAVE__ULTOA */\n}\n\nchar *\nSDL_lltoa(Sint64 value, char *string, int radix)\n{\n#if defined(HAVE__I64TOA)\n    return _i64toa(value, string, radix);\n#else\n    char *bufp = string;\n\n    if (value < 0) {\n        *bufp++ = '-';\n        SDL_ulltoa(-value, bufp, radix);\n    } else {\n        SDL_ulltoa(value, bufp, radix);\n    }\n\n    return string;\n#endif /* HAVE__I64TOA */\n}\n\nchar *\nSDL_ulltoa(Uint64 value, char *string, int radix)\n{\n#if defined(HAVE__UI64TOA)\n    return _ui64toa(value, string, radix);\n#else\n    char *bufp = string;\n\n    if (value) {\n        while (value > 0) {\n            *bufp++ = ntoa_table[value % radix];\n            value /= radix;\n        }\n    } else {\n        *bufp++ = '0';\n    }\n    *bufp = '\\0';\n\n    /* The numbers went into the string backwards. :) */\n    SDL_strrev(string);\n\n    return string;\n#endif /* HAVE__UI64TOA */\n}\n\nint SDL_atoi(const char *string)\n{\n#ifdef HAVE_ATOI\n    return atoi(string);\n#else\n    return SDL_strtol(string, NULL, 0);\n#endif /* HAVE_ATOI */\n}\n\ndouble SDL_atof(const char *string)\n{\n#ifdef HAVE_ATOF\n    return (double) atof(string);\n#else\n    return SDL_strtod(string, NULL);\n#endif /* HAVE_ATOF */\n}\n\nlong\nSDL_strtol(const char *string, char **endp, int base)\n{\n#if defined(HAVE_STRTOL)\n    return strtol(string, endp, base);\n#else\n    size_t len;\n    long value;\n\n    if (!base) {\n        if ((SDL_strlen(string) > 2) && (SDL_strncmp(string, \"0x\", 2) == 0)) {\n            base = 16;\n        } else {\n            base = 10;\n        }\n    }\n\n    len = SDL_ScanLong(string, base, &value);\n    if (endp) {\n        *endp = (char *) string + len;\n    }\n    return value;\n#endif /* HAVE_STRTOL */\n}\n\nunsigned long\nSDL_strtoul(const char *string, char **endp, int base)\n{\n#if defined(HAVE_STRTOUL)\n    return strtoul(string, endp, base);\n#else\n    size_t len;\n    unsigned long value;\n\n    if (!base) {\n        if ((SDL_strlen(string) > 2) && (SDL_strncmp(string, \"0x\", 2) == 0)) {\n            base = 16;\n        } else {\n            base = 10;\n        }\n    }\n\n    len = SDL_ScanUnsignedLong(string, base, &value);\n    if (endp) {\n        *endp = (char *) string + len;\n    }\n    return value;\n#endif /* HAVE_STRTOUL */\n}\n\nSint64\nSDL_strtoll(const char *string, char **endp, int base)\n{\n#if defined(HAVE_STRTOLL)\n    return strtoll(string, endp, base);\n#else\n    size_t len;\n    Sint64 value;\n\n    if (!base) {\n        if ((SDL_strlen(string) > 2) && (SDL_strncmp(string, \"0x\", 2) == 0)) {\n            base = 16;\n        } else {\n            base = 10;\n        }\n    }\n\n    len = SDL_ScanLongLong(string, base, &value);\n    if (endp) {\n        *endp = (char *) string + len;\n    }\n    return value;\n#endif /* HAVE_STRTOLL */\n}\n\nUint64\nSDL_strtoull(const char *string, char **endp, int base)\n{\n#if defined(HAVE_STRTOULL)\n    return strtoull(string, endp, base);\n#else\n    size_t len;\n    Uint64 value;\n\n    if (!base) {\n        if ((SDL_strlen(string) > 2) && (SDL_strncmp(string, \"0x\", 2) == 0)) {\n            base = 16;\n        } else {\n            base = 10;\n        }\n    }\n\n    len = SDL_ScanUnsignedLongLong(string, base, &value);\n    if (endp) {\n        *endp = (char *) string + len;\n    }\n    return value;\n#endif /* HAVE_STRTOULL */\n}\n\ndouble\nSDL_strtod(const char *string, char **endp)\n{\n#if defined(HAVE_STRTOD)\n    return strtod(string, endp);\n#else\n    size_t len;\n    double value;\n\n    len = SDL_ScanFloat(string, &value);\n    if (endp) {\n        *endp = (char *) string + len;\n    }\n    return value;\n#endif /* HAVE_STRTOD */\n}\n\nint\nSDL_strcmp(const char *str1, const char *str2)\n{\n#if defined(HAVE_STRCMP)\n    return strcmp(str1, str2);\n#else\n    while (*str1 && *str2) {\n        if (*str1 != *str2)\n            break;\n        ++str1;\n        ++str2;\n    }\n    return (int) ((unsigned char) *str1 - (unsigned char) *str2);\n#endif /* HAVE_STRCMP */\n}\n\nint\nSDL_strncmp(const char *str1, const char *str2, size_t maxlen)\n{\n#if defined(HAVE_STRNCMP)\n    return strncmp(str1, str2, maxlen);\n#else\n    while (*str1 && *str2 && maxlen) {\n        if (*str1 != *str2)\n            break;\n        ++str1;\n        ++str2;\n        --maxlen;\n    }\n    if (!maxlen) {\n        return 0;\n    }\n    return (int) ((unsigned char) *str1 - (unsigned char) *str2);\n#endif /* HAVE_STRNCMP */\n}\n\nint\nSDL_strcasecmp(const char *str1, const char *str2)\n{\n#ifdef HAVE_STRCASECMP\n    return strcasecmp(str1, str2);\n#elif defined(HAVE__STRICMP)\n    return _stricmp(str1, str2);\n#else\n    char a = 0;\n    char b = 0;\n    while (*str1 && *str2) {\n        a = SDL_toupper((unsigned char) *str1);\n        b = SDL_toupper((unsigned char) *str2);\n        if (a != b)\n            break;\n        ++str1;\n        ++str2;\n    }\n    a = SDL_toupper(*str1);\n    b = SDL_toupper(*str2);\n    return (int) ((unsigned char) a - (unsigned char) b);\n#endif /* HAVE_STRCASECMP */\n}\n\nint\nSDL_strncasecmp(const char *str1, const char *str2, size_t maxlen)\n{\n#ifdef HAVE_STRNCASECMP\n    return strncasecmp(str1, str2, maxlen);\n#elif defined(HAVE__STRNICMP)\n    return _strnicmp(str1, str2, maxlen);\n#else\n    char a = 0;\n    char b = 0;\n    while (*str1 && *str2 && maxlen) {\n        a = SDL_tolower((unsigned char) *str1);\n        b = SDL_tolower((unsigned char) *str2);\n        if (a != b)\n            break;\n        ++str1;\n        ++str2;\n        --maxlen;\n    }\n    if (maxlen == 0) {\n        return 0;\n    } else {\n        a = SDL_tolower((unsigned char) *str1);\n        b = SDL_tolower((unsigned char) *str2);\n        return (int) ((unsigned char) a - (unsigned char) b);\n    }\n#endif /* HAVE_STRNCASECMP */\n}\n\nint\nSDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...)\n{\n    int rc;\n    va_list ap;\n    va_start(ap, fmt);\n    rc = SDL_vsscanf(text, fmt, ap);\n    va_end(ap);\n    return rc;\n}\n\n#ifdef HAVE_VSSCANF\nint\nSDL_vsscanf(const char *text, const char *fmt, va_list ap)\n{\n    return vsscanf(text, fmt, ap);\n}\n#else\nint\nSDL_vsscanf(const char *text, const char *fmt, va_list ap)\n{\n    int retval = 0;\n\n    while (*fmt) {\n        if (*fmt == ' ') {\n            while (SDL_isspace((unsigned char) *text)) {\n                ++text;\n            }\n            ++fmt;\n            continue;\n        }\n        if (*fmt == '%') {\n            SDL_bool done = SDL_FALSE;\n            long count = 0;\n            int radix = 10;\n            enum\n            {\n                DO_SHORT,\n                DO_INT,\n                DO_LONG,\n                DO_LONGLONG\n            } inttype = DO_INT;\n            SDL_bool suppress = SDL_FALSE;\n\n            ++fmt;\n            if (*fmt == '%') {\n                if (*text == '%') {\n                    ++text;\n                    ++fmt;\n                    continue;\n                }\n                break;\n            }\n            if (*fmt == '*') {\n                suppress = SDL_TRUE;\n                ++fmt;\n            }\n            fmt += SDL_ScanLong(fmt, 10, &count);\n\n            if (*fmt == 'c') {\n                if (!count) {\n                    count = 1;\n                }\n                if (suppress) {\n                    while (count--) {\n                        ++text;\n                    }\n                } else {\n                    char *valuep = va_arg(ap, char *);\n                    while (count--) {\n                        *valuep++ = *text++;\n                    }\n                    ++retval;\n                }\n                continue;\n            }\n\n            while (SDL_isspace((unsigned char) *text)) {\n                ++text;\n            }\n\n            /* FIXME: implement more of the format specifiers */\n            while (!done) {\n                switch (*fmt) {\n                case '*':\n                    suppress = SDL_TRUE;\n                    break;\n                case 'h':\n                    if (inttype > DO_SHORT) {\n                        ++inttype;\n                    }\n                    break;\n                case 'l':\n                    if (inttype < DO_LONGLONG) {\n                        ++inttype;\n                    }\n                    break;\n                case 'I':\n                    if (SDL_strncmp(fmt, \"I64\", 3) == 0) {\n                        fmt += 2;\n                        inttype = DO_LONGLONG;\n                    }\n                    break;\n                case 'i':\n                    {\n                        int index = 0;\n                        if (text[index] == '-') {\n                            ++index;\n                        }\n                        if (text[index] == '0') {\n                            if (SDL_tolower((unsigned char) text[index + 1]) == 'x') {\n                                radix = 16;\n                            } else {\n                                radix = 8;\n                            }\n                        }\n                    }\n                    /* Fall through to %d handling */\n                case 'd':\n                    if (inttype == DO_LONGLONG) {\n                        Sint64 value;\n                        text += SDL_ScanLongLong(text, radix, &value);\n                        if (!suppress) {\n                            Sint64 *valuep = va_arg(ap, Sint64 *);\n                            *valuep = value;\n                            ++retval;\n                        }\n                    } else {\n                        long value;\n                        text += SDL_ScanLong(text, radix, &value);\n                        if (!suppress) {\n                            switch (inttype) {\n                            case DO_SHORT:\n                                {\n                                    short *valuep = va_arg(ap, short *);\n                                    *valuep = (short) value;\n                                }\n                                break;\n                            case DO_INT:\n                                {\n                                    int *valuep = va_arg(ap, int *);\n                                    *valuep = (int) value;\n                                }\n                                break;\n                            case DO_LONG:\n                                {\n                                    long *valuep = va_arg(ap, long *);\n                                    *valuep = value;\n                                }\n                                break;\n                            case DO_LONGLONG:\n                                /* Handled above */\n                                break;\n                            }\n                            ++retval;\n                        }\n                    }\n                    done = SDL_TRUE;\n                    break;\n                case 'o':\n                    if (radix == 10) {\n                        radix = 8;\n                    }\n                    /* Fall through to unsigned handling */\n                case 'x':\n                case 'X':\n                    if (radix == 10) {\n                        radix = 16;\n                    }\n                    /* Fall through to unsigned handling */\n                case 'u':\n                    if (inttype == DO_LONGLONG) {\n                        Uint64 value;\n                        text += SDL_ScanUnsignedLongLong(text, radix, &value);\n                        if (!suppress) {\n                            Uint64 *valuep = va_arg(ap, Uint64 *);\n                            *valuep = value;\n                            ++retval;\n                        }\n                    } else {\n                        unsigned long value;\n                        text += SDL_ScanUnsignedLong(text, radix, &value);\n                        if (!suppress) {\n                            switch (inttype) {\n                            case DO_SHORT:\n                                {\n                                    short *valuep = va_arg(ap, short *);\n                                    *valuep = (short) value;\n                                }\n                                break;\n                            case DO_INT:\n                                {\n                                    int *valuep = va_arg(ap, int *);\n                                    *valuep = (int) value;\n                                }\n                                break;\n                            case DO_LONG:\n                                {\n                                    long *valuep = va_arg(ap, long *);\n                                    *valuep = value;\n                                }\n                                break;\n                            case DO_LONGLONG:\n                                /* Handled above */\n                                break;\n                            }\n                            ++retval;\n                        }\n                    }\n                    done = SDL_TRUE;\n                    break;\n                case 'p':\n                    {\n                        uintptr_t value;\n                        text += SDL_ScanUintPtrT(text, 16, &value);\n                        if (!suppress) {\n                            void **valuep = va_arg(ap, void **);\n                            *valuep = (void *) value;\n                            ++retval;\n                        }\n                    }\n                    done = SDL_TRUE;\n                    break;\n                case 'f':\n                    {\n                        double value;\n                        text += SDL_ScanFloat(text, &value);\n                        if (!suppress) {\n                            float *valuep = va_arg(ap, float *);\n                            *valuep = (float) value;\n                            ++retval;\n                        }\n                    }\n                    done = SDL_TRUE;\n                    break;\n                case 's':\n                    if (suppress) {\n                        while (!SDL_isspace((unsigned char) *text)) {\n                            ++text;\n                            if (count) {\n                                if (--count == 0) {\n                                    break;\n                                }\n                            }\n                        }\n                    } else {\n                        char *valuep = va_arg(ap, char *);\n                        while (!SDL_isspace((unsigned char) *text)) {\n                            *valuep++ = *text++;\n                            if (count) {\n                                if (--count == 0) {\n                                    break;\n                                }\n                            }\n                        }\n                        *valuep = '\\0';\n                        ++retval;\n                    }\n                    done = SDL_TRUE;\n                    break;\n                default:\n                    done = SDL_TRUE;\n                    break;\n                }\n                ++fmt;\n            }\n            continue;\n        }\n        if (*text == *fmt) {\n            ++text;\n            ++fmt;\n            continue;\n        }\n        /* Text didn't match format specifier */\n        break;\n    }\n\n    return retval;\n}\n#endif /* HAVE_VSSCANF */\n\nint\nSDL_snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list ap;\n    int retval;\n\n    va_start(ap, fmt);\n    retval = SDL_vsnprintf(text, maxlen, fmt, ap);\n    va_end(ap);\n\n    return retval;\n}\n\n#ifdef HAVE_VSNPRINTF\nint SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, va_list ap)\n{\n    if (!fmt) {\n        fmt = \"\";\n    }\n    return vsnprintf(text, maxlen, fmt, ap);\n}\n#else\n /* FIXME: implement more of the format specifiers */\ntypedef enum\n{\n    SDL_CASE_NOCHANGE,\n    SDL_CASE_LOWER,\n    SDL_CASE_UPPER\n} SDL_letter_case;\n\ntypedef struct\n{\n    SDL_bool left_justify;\n    SDL_bool force_sign;\n    SDL_bool force_type;\n    SDL_bool pad_zeroes;\n    SDL_letter_case force_case;\n    int width;\n    int radix;\n    int precision;\n} SDL_FormatInfo;\n\nstatic size_t\nSDL_PrintString(char *text, size_t maxlen, SDL_FormatInfo *info, const char *string)\n{\n    size_t length = 0;\n    size_t slen;\n\n    if (info && info->width && (size_t)info->width > SDL_strlen(string)) {\n        char fill = info->pad_zeroes ? '0' : ' ';\n        size_t width = info->width - SDL_strlen(string);\n        while (width-- > 0 && maxlen > 0) {\n            *text++ = fill;\n            ++length;\n            --maxlen;\n        }\n    }\n\n    slen = SDL_strlcpy(text, string, maxlen);\n    length += SDL_min(slen, maxlen);\n\n    if (info) {\n        if (info->force_case == SDL_CASE_LOWER) {\n            SDL_strlwr(text);\n        } else if (info->force_case == SDL_CASE_UPPER) {\n            SDL_strupr(text);\n        }\n    }\n    return length;\n}\n\nstatic size_t\nSDL_PrintLong(char *text, size_t maxlen, SDL_FormatInfo *info, long value)\n{\n    char num[130];\n\n    SDL_ltoa(value, num, info ? info->radix : 10);\n    return SDL_PrintString(text, maxlen, info, num);\n}\n\nstatic size_t\nSDL_PrintUnsignedLong(char *text, size_t maxlen, SDL_FormatInfo *info, unsigned long value)\n{\n    char num[130];\n\n    SDL_ultoa(value, num, info ? info->radix : 10);\n    return SDL_PrintString(text, maxlen, info, num);\n}\n\nstatic size_t\nSDL_PrintLongLong(char *text, size_t maxlen, SDL_FormatInfo *info, Sint64 value)\n{\n    char num[130];\n\n    SDL_lltoa(value, num, info ? info->radix : 10);\n    return SDL_PrintString(text, maxlen, info, num);\n}\n\nstatic size_t\nSDL_PrintUnsignedLongLong(char *text, size_t maxlen, SDL_FormatInfo *info, Uint64 value)\n{\n    char num[130];\n\n    SDL_ulltoa(value, num, info ? info->radix : 10);\n    return SDL_PrintString(text, maxlen, info, num);\n}\n\nstatic size_t\nSDL_PrintFloat(char *text, size_t maxlen, SDL_FormatInfo *info, double arg)\n{\n    int width;\n    size_t len;\n    size_t left = maxlen;\n    char *textstart = text;\n\n    if (arg) {\n        /* This isn't especially accurate, but hey, it's easy. :) */\n        unsigned long value;\n\n        if (arg < 0) {\n            if (left > 1) {\n                *text = '-';\n                --left;\n            }\n            ++text;\n            arg = -arg;\n        } else if (info->force_sign) {\n            if (left > 1) {\n                *text = '+';\n                --left;\n            }\n            ++text;\n        }\n        value = (unsigned long) arg;\n        len = SDL_PrintUnsignedLong(text, left, NULL, value);\n        if (len >= left) {\n            text += (left > 1) ? left - 1 : 0;\n            left = SDL_min(left, 1);\n        } else {\n            text += len;\n            left -= len;\n        }\n        arg -= value;\n        if (info->precision < 0) {\n            info->precision = 6;\n        }\n        if (info->force_type || info->precision > 0) {\n            int mult = 10;\n            if (left > 1) {\n                *text = '.';\n                --left;\n            }\n            ++text;\n            while (info->precision-- > 0) {\n                value = (unsigned long) (arg * mult);\n                len = SDL_PrintUnsignedLong(text, left, NULL, value);\n                if (len >= left) {\n                    text += (left > 1) ? left - 1 : 0;\n                    left = SDL_min(left, 1);\n                } else {\n                    text += len;\n                    left -= len;\n                }\n                arg -= (double) value / mult;\n                mult *= 10;\n            }\n        }\n    } else {\n        if (left > 1) {\n            *text = '0';\n            --left;\n        }\n        ++text;\n        if (info->force_type) {\n            if (left > 1) {\n                *text = '.';\n                --left;\n            }\n            ++text;\n        }\n    }\n\n    width = info->width - (int)(text - textstart);\n    if (width > 0) {\n        char fill = info->pad_zeroes ? '0' : ' ';\n        char *end = text+left-1;\n        len = (text - textstart);\n        for (len = (text - textstart); len--; ) {\n            if ((textstart+len+width) < end) {\n                *(textstart+len+width) = *(textstart+len);\n            }\n        }\n        len = (size_t)width;\n        if (len >= left) {\n            text += (left > 1) ? left - 1 : 0;\n            left = SDL_min(left, 1);\n        } else {\n            text += len;\n            left -= len;\n        }\n        while (len--) {\n            if (textstart+len < end) {\n                textstart[len] = fill;\n            }\n        }\n    }\n\n    return (text - textstart);\n}\n\nint\nSDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, va_list ap)\n{\n    size_t left = maxlen;\n    char *textstart = text;\n\n    if (!fmt) {\n        fmt = \"\";\n    }\n    while (*fmt) {\n        if (*fmt == '%') {\n            SDL_bool done = SDL_FALSE;\n            size_t len = 0;\n            SDL_bool check_flag;\n            SDL_FormatInfo info;\n            enum\n            {\n                DO_INT,\n                DO_LONG,\n                DO_LONGLONG\n            } inttype = DO_INT;\n\n            SDL_zero(info);\n            info.radix = 10;\n            info.precision = -1;\n\n            check_flag = SDL_TRUE;\n            while (check_flag) {\n                ++fmt;\n                switch (*fmt) {\n                case '-':\n                    info.left_justify = SDL_TRUE;\n                    break;\n                case '+':\n                    info.force_sign = SDL_TRUE;\n                    break;\n                case '#':\n                    info.force_type = SDL_TRUE;\n                    break;\n                case '0':\n                    info.pad_zeroes = SDL_TRUE;\n                    break;\n                default:\n                    check_flag = SDL_FALSE;\n                    break;\n                }\n            }\n\n            if (*fmt >= '0' && *fmt <= '9') {\n                info.width = SDL_strtol(fmt, (char **)&fmt, 0);\n            }\n\n            if (*fmt == '.') {\n                ++fmt;\n                if (*fmt >= '0' && *fmt <= '9') {\n                    info.precision = SDL_strtol(fmt, (char **)&fmt, 0);\n                } else {\n                    info.precision = 0;\n                }\n            }\n\n            while (!done) {\n                switch (*fmt) {\n                case '%':\n                    if (left > 1) {\n                        *text = '%';\n                    }\n                    len = 1;\n                    done = SDL_TRUE;\n                    break;\n                case 'c':\n                    /* char is promoted to int when passed through (...) */\n                    if (left > 1) {\n                        *text = (char) va_arg(ap, int);\n                    }\n                    len = 1;\n                    done = SDL_TRUE;\n                    break;\n                case 'h':\n                    /* short is promoted to int when passed through (...) */\n                    break;\n                case 'l':\n                    if (inttype < DO_LONGLONG) {\n                        ++inttype;\n                    }\n                    break;\n                case 'I':\n                    if (SDL_strncmp(fmt, \"I64\", 3) == 0) {\n                        fmt += 2;\n                        inttype = DO_LONGLONG;\n                    }\n                    break;\n                case 'i':\n                case 'd':\n                    switch (inttype) {\n                    case DO_INT:\n                        len = SDL_PrintLong(text, left, &info,\n                                            (long) va_arg(ap, int));\n                        break;\n                    case DO_LONG:\n                        len = SDL_PrintLong(text, left, &info,\n                                            va_arg(ap, long));\n                        break;\n                    case DO_LONGLONG:\n                        len = SDL_PrintLongLong(text, left, &info,\n                                                va_arg(ap, Sint64));\n                        break;\n                    }\n                    done = SDL_TRUE;\n                    break;\n                case 'p':\n                case 'x':\n                    info.force_case = SDL_CASE_LOWER;\n                    /* Fall through to 'X' handling */\n                case 'X':\n                    if (info.force_case == SDL_CASE_NOCHANGE) {\n                        info.force_case = SDL_CASE_UPPER;\n                    }\n                    if (info.radix == 10) {\n                        info.radix = 16;\n                    }\n                    if (*fmt == 'p') {\n                        inttype = DO_LONG;\n                    }\n                    /* Fall through to unsigned handling */\n                case 'o':\n                    if (info.radix == 10) {\n                        info.radix = 8;\n                    }\n                    /* Fall through to unsigned handling */\n                case 'u':\n                    info.pad_zeroes = SDL_TRUE;\n                    switch (inttype) {\n                    case DO_INT:\n                        len = SDL_PrintUnsignedLong(text, left, &info,\n                                                    (unsigned long)\n                                                    va_arg(ap, unsigned int));\n                        break;\n                    case DO_LONG:\n                        len = SDL_PrintUnsignedLong(text, left, &info,\n                                                    va_arg(ap, unsigned long));\n                        break;\n                    case DO_LONGLONG:\n                        len = SDL_PrintUnsignedLongLong(text, left, &info,\n                                                        va_arg(ap, Uint64));\n                        break;\n                    }\n                    done = SDL_TRUE;\n                    break;\n                case 'f':\n                    len = SDL_PrintFloat(text, left, &info, va_arg(ap, double));\n                    done = SDL_TRUE;\n                    break;\n                case 's':\n                    len = SDL_PrintString(text, left, &info, va_arg(ap, char *));\n                    done = SDL_TRUE;\n                    break;\n                default:\n                    done = SDL_TRUE;\n                    break;\n                }\n                ++fmt;\n            }\n            if (len >= left) {\n                text += (left > 1) ? left - 1 : 0;\n                left = SDL_min(left, 1);\n            } else {\n                text += len;\n                left -= len;\n            }\n        } else {\n            if (left > 1) {\n                *text = *fmt;\n                --left;\n            }\n            ++fmt;\n            ++text;\n        }\n    }\n    if (left > 0) {\n        *text = '\\0';\n    }\n    return (int)(text - textstart);\n}\n#endif /* HAVE_VSNPRINTF */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_assert.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n\n Used by the test framework and test cases.\n\n*/\n\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n/* Assert check message format */\n#define SDLTEST_ASSERT_CHECK_FORMAT \"Assert '%s': %s\"\n\n/* Assert summary message format */\n#define SDLTEST_ASSERT_SUMMARY_FORMAT \"Assert Summary: Total=%d Passed=%d Failed=%d\"\n\n/* ! \\brief counts the failed asserts */\nstatic Uint32 SDLTest_AssertsFailed = 0;\n\n/* ! \\brief counts the passed asserts */\nstatic Uint32 SDLTest_AssertsPassed = 0;\n\n/*\n *  Assert that logs and break execution flow on failures (i.e. for harness errors).\n */\nvoid SDLTest_Assert(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...)\n{\n    va_list list;\n    char logMessage[SDLTEST_MAX_LOGMESSAGE_LENGTH];\n\n    /* Print assert description into a buffer */\n    SDL_memset(logMessage, 0, SDLTEST_MAX_LOGMESSAGE_LENGTH);\n    va_start(list, assertDescription);\n    SDL_vsnprintf(logMessage, SDLTEST_MAX_LOGMESSAGE_LENGTH - 1, assertDescription, list);\n    va_end(list);\n\n    /* Log, then assert and break on failure */\n    SDL_assert((SDLTest_AssertCheck(assertCondition, \"%s\", logMessage)));\n}\n\n/*\n * Assert that logs but does not break execution flow on failures (i.e. for test cases).\n */\nint SDLTest_AssertCheck(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...)\n{\n    va_list list;\n    char logMessage[SDLTEST_MAX_LOGMESSAGE_LENGTH];\n\n    /* Print assert description into a buffer */\n    SDL_memset(logMessage, 0, SDLTEST_MAX_LOGMESSAGE_LENGTH);\n    va_start(list, assertDescription);\n    SDL_vsnprintf(logMessage, SDLTEST_MAX_LOGMESSAGE_LENGTH - 1, assertDescription, list);\n    va_end(list);\n\n    /* Log pass or fail message */\n    if (assertCondition == ASSERT_FAIL)\n    {\n        SDLTest_AssertsFailed++;\n        SDLTest_LogError(SDLTEST_ASSERT_CHECK_FORMAT, logMessage, \"Failed\");\n    }\n    else\n    {\n        SDLTest_AssertsPassed++;\n        SDLTest_Log(SDLTEST_ASSERT_CHECK_FORMAT, logMessage, \"Passed\");\n    }\n\n    return assertCondition;\n}\n\n/*\n * Explicitly passing Assert that logs (i.e. for test cases).\n */\nvoid SDLTest_AssertPass(SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...)\n{\n    va_list list;\n    char logMessage[SDLTEST_MAX_LOGMESSAGE_LENGTH];\n\n    /* Print assert description into a buffer */\n    SDL_memset(logMessage, 0, SDLTEST_MAX_LOGMESSAGE_LENGTH);\n    va_start(list, assertDescription);\n    SDL_vsnprintf(logMessage, SDLTEST_MAX_LOGMESSAGE_LENGTH - 1, assertDescription, list);\n    va_end(list);\n\n        /* Log pass message */\n    SDLTest_AssertsPassed++;\n    SDLTest_Log(SDLTEST_ASSERT_CHECK_FORMAT, logMessage, \"Pass\");\n}\n\n/*\n * Resets the assert summary counters to zero.\n */\nvoid SDLTest_ResetAssertSummary()\n{\n    SDLTest_AssertsPassed = 0;\n    SDLTest_AssertsFailed = 0;\n}\n\n/*\n * Logs summary of all assertions (total, pass, fail) since last reset\n * as INFO (failed==0) or ERROR (failed > 0).\n */\nvoid SDLTest_LogAssertSummary()\n{\n    Uint32 totalAsserts = SDLTest_AssertsPassed + SDLTest_AssertsFailed;\n    if (SDLTest_AssertsFailed == 0)\n    {\n        SDLTest_Log(SDLTEST_ASSERT_SUMMARY_FORMAT, totalAsserts, SDLTest_AssertsPassed, SDLTest_AssertsFailed);\n    }\n    else\n    {\n        SDLTest_LogError(SDLTEST_ASSERT_SUMMARY_FORMAT, totalAsserts, SDLTest_AssertsPassed, SDLTest_AssertsFailed);\n    }\n}\n\n/*\n * Converts the current assert state into a test result\n */\nint SDLTest_AssertSummaryToTestResult()\n{\n    if (SDLTest_AssertsFailed > 0) {\n        return TEST_RESULT_FAILED;\n    } else {\n        if (SDLTest_AssertsPassed > 0) {\n            return TEST_RESULT_PASSED;\n        } else {\n            return TEST_RESULT_NO_ASSERT;\n        }\n    }\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_common.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* Ported from original test\\common.c file. */\n\n#include \"SDL_config.h\"\n#include \"SDL_test.h\"\n\n#include <stdio.h>\n\n#define VIDEO_USAGE \\\n\"[--video driver] [--renderer driver] [--gldebug] [--info all|video|modes|render|event] [--log all|error|system|audio|video|render|input] [--display N] [--fullscreen | --fullscreen-desktop | --windows N] [--title title] [--icon icon.bmp] [--center | --position X,Y] [--geometry WxH] [--min-geometry WxH] [--max-geometry WxH] [--logical WxH] [--scale N] [--depth N] [--refresh R] [--vsync] [--noframe] [--resize] [--minimize] [--maximize] [--grab] [--allow-highdpi]\"\n\n#define AUDIO_USAGE \\\n\"[--rate N] [--format U8|S8|U16|U16LE|U16BE|S16|S16LE|S16BE] [--channels N] [--samples N]\"\n\nSDLTest_CommonState *\nSDLTest_CommonCreateState(char **argv, Uint32 flags)\n{\n    SDLTest_CommonState *state = (SDLTest_CommonState *)SDL_calloc(1, sizeof(*state));\n    if (!state) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    /* Initialize some defaults */\n    state->argv = argv;\n    state->flags = flags;\n    state->window_title = argv[0];\n    state->window_flags = 0;\n    state->window_x = SDL_WINDOWPOS_UNDEFINED;\n    state->window_y = SDL_WINDOWPOS_UNDEFINED;\n    state->window_w = DEFAULT_WINDOW_WIDTH;\n    state->window_h = DEFAULT_WINDOW_HEIGHT;\n    state->num_windows = 1;\n    state->audiospec.freq = 22050;\n    state->audiospec.format = AUDIO_S16;\n    state->audiospec.channels = 2;\n    state->audiospec.samples = 2048;\n\n    /* Set some very sane GL defaults */\n    state->gl_red_size = 3;\n    state->gl_green_size = 3;\n    state->gl_blue_size = 2;\n    state->gl_alpha_size = 0;\n    state->gl_buffer_size = 0;\n    state->gl_depth_size = 16;\n    state->gl_stencil_size = 0;\n    state->gl_double_buffer = 1;\n    state->gl_accum_red_size = 0;\n    state->gl_accum_green_size = 0;\n    state->gl_accum_blue_size = 0;\n    state->gl_accum_alpha_size = 0;\n    state->gl_stereo = 0;\n    state->gl_multisamplebuffers = 0;\n    state->gl_multisamplesamples = 0;\n    state->gl_retained_backing = 1;\n    state->gl_accelerated = -1;\n    state->gl_debug = 0;\n\n    return state;\n}\n\nint\nSDLTest_CommonArg(SDLTest_CommonState * state, int index)\n{\n    char **argv = state->argv;\n\n    if (SDL_strcasecmp(argv[index], \"--video\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->videodriver = argv[index];\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--renderer\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->renderdriver = argv[index];\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--gldebug\") == 0) {\n        state->gl_debug = 1;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--info\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        if (SDL_strcasecmp(argv[index], \"all\") == 0) {\n            state->verbose |=\n                (VERBOSE_VIDEO | VERBOSE_MODES | VERBOSE_RENDER |\n                 VERBOSE_EVENT);\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"video\") == 0) {\n            state->verbose |= VERBOSE_VIDEO;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"modes\") == 0) {\n            state->verbose |= VERBOSE_MODES;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"render\") == 0) {\n            state->verbose |= VERBOSE_RENDER;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"event\") == 0) {\n            state->verbose |= VERBOSE_EVENT;\n            return 2;\n        }\n        return -1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--log\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        if (SDL_strcasecmp(argv[index], \"all\") == 0) {\n            SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE);\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"error\") == 0) {\n            SDL_LogSetPriority(SDL_LOG_CATEGORY_ERROR, SDL_LOG_PRIORITY_VERBOSE);\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"system\") == 0) {\n            SDL_LogSetPriority(SDL_LOG_CATEGORY_SYSTEM, SDL_LOG_PRIORITY_VERBOSE);\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"audio\") == 0) {\n            SDL_LogSetPriority(SDL_LOG_CATEGORY_AUDIO, SDL_LOG_PRIORITY_VERBOSE);\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"video\") == 0) {\n            SDL_LogSetPriority(SDL_LOG_CATEGORY_VIDEO, SDL_LOG_PRIORITY_VERBOSE);\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"render\") == 0) {\n            SDL_LogSetPriority(SDL_LOG_CATEGORY_RENDER, SDL_LOG_PRIORITY_VERBOSE);\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"input\") == 0) {\n            SDL_LogSetPriority(SDL_LOG_CATEGORY_INPUT, SDL_LOG_PRIORITY_VERBOSE);\n            return 2;\n        }\n        return -1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--display\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->display = SDL_atoi(argv[index]);\n        if (SDL_WINDOWPOS_ISUNDEFINED(state->window_x)) {\n            state->window_x = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);\n            state->window_y = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);\n        }\n        if (SDL_WINDOWPOS_ISCENTERED(state->window_x)) {\n            state->window_x = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);\n            state->window_y = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);\n        }\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--fullscreen\") == 0) {\n        state->window_flags |= SDL_WINDOW_FULLSCREEN;\n        state->num_windows = 1;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--fullscreen-desktop\") == 0) {\n        state->window_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;\n        state->num_windows = 1;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--allow-highdpi\") == 0) {\n        state->window_flags |= SDL_WINDOW_ALLOW_HIGHDPI;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--windows\") == 0) {\n        ++index;\n        if (!argv[index] || !SDL_isdigit(*argv[index])) {\n            return -1;\n        }\n        if (!(state->window_flags & SDL_WINDOW_FULLSCREEN)) {\n            state->num_windows = SDL_atoi(argv[index]);\n        }\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--title\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->window_title = argv[index];\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--icon\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->window_icon = argv[index];\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--center\") == 0) {\n        state->window_x = SDL_WINDOWPOS_CENTERED;\n        state->window_y = SDL_WINDOWPOS_CENTERED;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--position\") == 0) {\n        char *x, *y;\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        x = argv[index];\n        y = argv[index];\n        while (*y && *y != ',') {\n            ++y;\n        }\n        if (!*y) {\n            return -1;\n        }\n        *y++ = '\\0';\n        state->window_x = SDL_atoi(x);\n        state->window_y = SDL_atoi(y);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--geometry\") == 0) {\n        char *w, *h;\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        w = argv[index];\n        h = argv[index];\n        while (*h && *h != 'x') {\n            ++h;\n        }\n        if (!*h) {\n            return -1;\n        }\n        *h++ = '\\0';\n        state->window_w = SDL_atoi(w);\n        state->window_h = SDL_atoi(h);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--min-geometry\") == 0) {\n        char *w, *h;\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        w = argv[index];\n        h = argv[index];\n        while (*h && *h != 'x') {\n            ++h;\n        }\n        if (!*h) {\n            return -1;\n        }\n        *h++ = '\\0';\n        state->window_minW = SDL_atoi(w);\n        state->window_minH = SDL_atoi(h);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--max-geometry\") == 0) {\n        char *w, *h;\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        w = argv[index];\n        h = argv[index];\n        while (*h && *h != 'x') {\n            ++h;\n        }\n        if (!*h) {\n            return -1;\n        }\n        *h++ = '\\0';\n        state->window_maxW = SDL_atoi(w);\n        state->window_maxH = SDL_atoi(h);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--logical\") == 0) {\n        char *w, *h;\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        w = argv[index];\n        h = argv[index];\n        while (*h && *h != 'x') {\n            ++h;\n        }\n        if (!*h) {\n            return -1;\n        }\n        *h++ = '\\0';\n        state->logical_w = SDL_atoi(w);\n        state->logical_h = SDL_atoi(h);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--scale\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->scale = (float)SDL_atof(argv[index]);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--depth\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->depth = SDL_atoi(argv[index]);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--refresh\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->refresh_rate = SDL_atoi(argv[index]);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--vsync\") == 0) {\n        state->render_flags |= SDL_RENDERER_PRESENTVSYNC;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--noframe\") == 0) {\n        state->window_flags |= SDL_WINDOW_BORDERLESS;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--resize\") == 0) {\n        state->window_flags |= SDL_WINDOW_RESIZABLE;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--minimize\") == 0) {\n        state->window_flags |= SDL_WINDOW_MINIMIZED;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--maximize\") == 0) {\n        state->window_flags |= SDL_WINDOW_MAXIMIZED;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--grab\") == 0) {\n        state->window_flags |= SDL_WINDOW_INPUT_GRABBED;\n        return 1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--rate\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->audiospec.freq = SDL_atoi(argv[index]);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--format\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        if (SDL_strcasecmp(argv[index], \"U8\") == 0) {\n            state->audiospec.format = AUDIO_U8;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"S8\") == 0) {\n            state->audiospec.format = AUDIO_S8;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"U16\") == 0) {\n            state->audiospec.format = AUDIO_U16;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"U16LE\") == 0) {\n            state->audiospec.format = AUDIO_U16LSB;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"U16BE\") == 0) {\n            state->audiospec.format = AUDIO_U16MSB;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"S16\") == 0) {\n            state->audiospec.format = AUDIO_S16;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"S16LE\") == 0) {\n            state->audiospec.format = AUDIO_S16LSB;\n            return 2;\n        }\n        if (SDL_strcasecmp(argv[index], \"S16BE\") == 0) {\n            state->audiospec.format = AUDIO_S16MSB;\n            return 2;\n        }\n        return -1;\n    }\n    if (SDL_strcasecmp(argv[index], \"--channels\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->audiospec.channels = (Uint8) SDL_atoi(argv[index]);\n        return 2;\n    }\n    if (SDL_strcasecmp(argv[index], \"--samples\") == 0) {\n        ++index;\n        if (!argv[index]) {\n            return -1;\n        }\n        state->audiospec.samples = (Uint16) SDL_atoi(argv[index]);\n        return 2;\n    }\n    if ((SDL_strcasecmp(argv[index], \"-h\") == 0)\n        || (SDL_strcasecmp(argv[index], \"--help\") == 0)) {\n        /* Print the usage message */\n        return -1;\n    }\n    if (SDL_strcmp(argv[index], \"-NSDocumentRevisionsDebugMode\") == 0) {\n    /* Debug flag sent by Xcode */\n        return 2;\n    }\n    return 0;\n}\n\nconst char *\nSDLTest_CommonUsage(SDLTest_CommonState * state)\n{\n    switch (state->flags & (SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {\n    case SDL_INIT_VIDEO:\n        return VIDEO_USAGE;\n    case SDL_INIT_AUDIO:\n        return AUDIO_USAGE;\n    case (SDL_INIT_VIDEO | SDL_INIT_AUDIO):\n        return VIDEO_USAGE \" \" AUDIO_USAGE;\n    default:\n        return \"\";\n    }\n}\n\nstatic void\nSDLTest_PrintRendererFlag(Uint32 flag)\n{\n    switch (flag) {\n    case SDL_RENDERER_PRESENTVSYNC:\n        fprintf(stderr, \"PresentVSync\");\n        break;\n    case SDL_RENDERER_ACCELERATED:\n        fprintf(stderr, \"Accelerated\");\n        break;\n    default:\n        fprintf(stderr, \"0x%8.8x\", flag);\n        break;\n    }\n}\n\nstatic void\nSDLTest_PrintPixelFormat(Uint32 format)\n{\n    switch (format) {\n    case SDL_PIXELFORMAT_UNKNOWN:\n        fprintf(stderr, \"Unknwon\");\n        break;\n    case SDL_PIXELFORMAT_INDEX1LSB:\n        fprintf(stderr, \"Index1LSB\");\n        break;\n    case SDL_PIXELFORMAT_INDEX1MSB:\n        fprintf(stderr, \"Index1MSB\");\n        break;\n    case SDL_PIXELFORMAT_INDEX4LSB:\n        fprintf(stderr, \"Index4LSB\");\n        break;\n    case SDL_PIXELFORMAT_INDEX4MSB:\n        fprintf(stderr, \"Index4MSB\");\n        break;\n    case SDL_PIXELFORMAT_INDEX8:\n        fprintf(stderr, \"Index8\");\n        break;\n    case SDL_PIXELFORMAT_RGB332:\n        fprintf(stderr, \"RGB332\");\n        break;\n    case SDL_PIXELFORMAT_RGB444:\n        fprintf(stderr, \"RGB444\");\n        break;\n    case SDL_PIXELFORMAT_RGB555:\n        fprintf(stderr, \"RGB555\");\n        break;\n    case SDL_PIXELFORMAT_BGR555:\n        fprintf(stderr, \"BGR555\");\n        break;\n    case SDL_PIXELFORMAT_ARGB4444:\n        fprintf(stderr, \"ARGB4444\");\n        break;\n    case SDL_PIXELFORMAT_ABGR4444:\n        fprintf(stderr, \"ABGR4444\");\n        break;\n    case SDL_PIXELFORMAT_ARGB1555:\n        fprintf(stderr, \"ARGB1555\");\n        break;\n    case SDL_PIXELFORMAT_ABGR1555:\n        fprintf(stderr, \"ABGR1555\");\n        break;\n    case SDL_PIXELFORMAT_RGB565:\n        fprintf(stderr, \"RGB565\");\n        break;\n    case SDL_PIXELFORMAT_BGR565:\n        fprintf(stderr, \"BGR565\");\n        break;\n    case SDL_PIXELFORMAT_RGB24:\n        fprintf(stderr, \"RGB24\");\n        break;\n    case SDL_PIXELFORMAT_BGR24:\n        fprintf(stderr, \"BGR24\");\n        break;\n    case SDL_PIXELFORMAT_RGB888:\n        fprintf(stderr, \"RGB888\");\n        break;\n    case SDL_PIXELFORMAT_BGR888:\n        fprintf(stderr, \"BGR888\");\n        break;\n    case SDL_PIXELFORMAT_ARGB8888:\n        fprintf(stderr, \"ARGB8888\");\n        break;\n    case SDL_PIXELFORMAT_RGBA8888:\n        fprintf(stderr, \"RGBA8888\");\n        break;\n    case SDL_PIXELFORMAT_ABGR8888:\n        fprintf(stderr, \"ABGR8888\");\n        break;\n    case SDL_PIXELFORMAT_BGRA8888:\n        fprintf(stderr, \"BGRA8888\");\n        break;\n    case SDL_PIXELFORMAT_ARGB2101010:\n        fprintf(stderr, \"ARGB2101010\");\n        break;\n    case SDL_PIXELFORMAT_YV12:\n        fprintf(stderr, \"YV12\");\n        break;\n    case SDL_PIXELFORMAT_IYUV:\n        fprintf(stderr, \"IYUV\");\n        break;\n    case SDL_PIXELFORMAT_YUY2:\n        fprintf(stderr, \"YUY2\");\n        break;\n    case SDL_PIXELFORMAT_UYVY:\n        fprintf(stderr, \"UYVY\");\n        break;\n    case SDL_PIXELFORMAT_YVYU:\n        fprintf(stderr, \"YVYU\");\n        break;\n    case SDL_PIXELFORMAT_NV12:\n        fprintf(stderr, \"NV12\");\n        break;\n    case SDL_PIXELFORMAT_NV21:\n        fprintf(stderr, \"NV21\");\n        break;\n    default:\n        fprintf(stderr, \"0x%8.8x\", format);\n        break;\n    }\n}\n\nstatic void\nSDLTest_PrintRenderer(SDL_RendererInfo * info)\n{\n    int i, count;\n\n    fprintf(stderr, \"  Renderer %s:\\n\", info->name);\n\n    fprintf(stderr, \"    Flags: 0x%8.8X\", info->flags);\n    fprintf(stderr, \" (\");\n    count = 0;\n    for (i = 0; i < sizeof(info->flags) * 8; ++i) {\n        Uint32 flag = (1 << i);\n        if (info->flags & flag) {\n            if (count > 0) {\n                fprintf(stderr, \" | \");\n            }\n            SDLTest_PrintRendererFlag(flag);\n            ++count;\n        }\n    }\n    fprintf(stderr, \")\\n\");\n\n    fprintf(stderr, \"    Texture formats (%d): \", info->num_texture_formats);\n    for (i = 0; i < (int) info->num_texture_formats; ++i) {\n        if (i > 0) {\n            fprintf(stderr, \", \");\n        }\n        SDLTest_PrintPixelFormat(info->texture_formats[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    if (info->max_texture_width || info->max_texture_height) {\n        fprintf(stderr, \"    Max Texture Size: %dx%d\\n\",\n                info->max_texture_width, info->max_texture_height);\n    }\n}\n\nstatic SDL_Surface *\nSDLTest_LoadIcon(const char *file)\n{\n    SDL_Surface *icon;\n\n    /* Load the icon surface */\n    icon = SDL_LoadBMP(file);\n    if (icon == NULL) {\n        fprintf(stderr, \"Couldn't load %s: %s\\n\", file, SDL_GetError());\n        return (NULL);\n    }\n\n    if (icon->format->palette) {\n        /* Set the colorkey */\n        SDL_SetColorKey(icon, 1, *((Uint8 *) icon->pixels));\n    }\n\n    return (icon);\n}\n\nSDL_bool\nSDLTest_CommonInit(SDLTest_CommonState * state)\n{\n    int i, j, m, n, w, h;\n    SDL_DisplayMode fullscreen_mode;\n\n    if (state->flags & SDL_INIT_VIDEO) {\n        if (state->verbose & VERBOSE_VIDEO) {\n            n = SDL_GetNumVideoDrivers();\n            if (n == 0) {\n                fprintf(stderr, \"No built-in video drivers\\n\");\n            } else {\n                fprintf(stderr, \"Built-in video drivers:\");\n                for (i = 0; i < n; ++i) {\n                    if (i > 0) {\n                        fprintf(stderr, \",\");\n                    }\n                    fprintf(stderr, \" %s\", SDL_GetVideoDriver(i));\n                }\n                fprintf(stderr, \"\\n\");\n            }\n        }\n        if (SDL_VideoInit(state->videodriver) < 0) {\n            fprintf(stderr, \"Couldn't initialize video driver: %s\\n\",\n                    SDL_GetError());\n            return SDL_FALSE;\n        }\n        if (state->verbose & VERBOSE_VIDEO) {\n            fprintf(stderr, \"Video driver: %s\\n\",\n                    SDL_GetCurrentVideoDriver());\n        }\n\n        /* Upload GL settings */\n        SDL_GL_SetAttribute(SDL_GL_RED_SIZE, state->gl_red_size);\n        SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, state->gl_green_size);\n        SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, state->gl_blue_size);\n        SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, state->gl_alpha_size);\n        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, state->gl_double_buffer);\n        SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, state->gl_buffer_size);\n        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, state->gl_depth_size);\n        SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, state->gl_stencil_size);\n        SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, state->gl_accum_red_size);\n        SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, state->gl_accum_green_size);\n        SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, state->gl_accum_blue_size);\n        SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, state->gl_accum_alpha_size);\n        SDL_GL_SetAttribute(SDL_GL_STEREO, state->gl_stereo);\n        SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, state->gl_multisamplebuffers);\n        SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, state->gl_multisamplesamples);\n        if (state->gl_accelerated >= 0) {\n            SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL,\n                                state->gl_accelerated);\n        }\n        SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, state->gl_retained_backing);\n        if (state->gl_major_version) {\n            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, state->gl_major_version);\n            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, state->gl_minor_version);\n        }\n        if (state->gl_debug) {\n            SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);\n        }\n        if (state->gl_profile_mask) {\n            SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, state->gl_profile_mask);\n        }\n\n        if (state->verbose & VERBOSE_MODES) {\n            SDL_Rect bounds;\n            SDL_DisplayMode mode;\n            int bpp;\n            Uint32 Rmask, Gmask, Bmask, Amask;\n#if SDL_VIDEO_DRIVER_WINDOWS\n\t\t\tint adapterIndex = 0;\n\t\t\tint outputIndex = 0;\n#endif\n            n = SDL_GetNumVideoDisplays();\n            fprintf(stderr, \"Number of displays: %d\\n\", n);\n            for (i = 0; i < n; ++i) {\n                fprintf(stderr, \"Display %d: %s\\n\", i, SDL_GetDisplayName(i));\n\n                SDL_zero(bounds);\n                SDL_GetDisplayBounds(i, &bounds);\n                fprintf(stderr, \"Bounds: %dx%d at %d,%d\\n\", bounds.w, bounds.h, bounds.x, bounds.y);\n\n                SDL_GetDesktopDisplayMode(i, &mode);\n                SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask,\n                                           &Bmask, &Amask);\n                fprintf(stderr,\n                        \"  Current mode: %dx%d@%dHz, %d bits-per-pixel (%s)\\n\",\n                        mode.w, mode.h, mode.refresh_rate, bpp,\n                        SDL_GetPixelFormatName(mode.format));\n                if (Rmask || Gmask || Bmask) {\n                    fprintf(stderr, \"      Red Mask   = 0x%.8x\\n\", Rmask);\n                    fprintf(stderr, \"      Green Mask = 0x%.8x\\n\", Gmask);\n                    fprintf(stderr, \"      Blue Mask  = 0x%.8x\\n\", Bmask);\n                    if (Amask)\n                        fprintf(stderr, \"      Alpha Mask = 0x%.8x\\n\", Amask);\n                }\n\n                /* Print available fullscreen video modes */\n                m = SDL_GetNumDisplayModes(i);\n                if (m == 0) {\n                    fprintf(stderr, \"No available fullscreen video modes\\n\");\n                } else {\n                    fprintf(stderr, \"  Fullscreen video modes:\\n\");\n                    for (j = 0; j < m; ++j) {\n                        SDL_GetDisplayMode(i, j, &mode);\n                        SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask,\n                                                   &Gmask, &Bmask, &Amask);\n                        fprintf(stderr,\n                                \"    Mode %d: %dx%d@%dHz, %d bits-per-pixel (%s)\\n\",\n                                j, mode.w, mode.h, mode.refresh_rate, bpp,\n                                SDL_GetPixelFormatName(mode.format));\n                        if (Rmask || Gmask || Bmask) {\n                            fprintf(stderr, \"        Red Mask   = 0x%.8x\\n\",\n                                    Rmask);\n                            fprintf(stderr, \"        Green Mask = 0x%.8x\\n\",\n                                    Gmask);\n                            fprintf(stderr, \"        Blue Mask  = 0x%.8x\\n\",\n                                    Bmask);\n                            if (Amask)\n                                fprintf(stderr,\n                                        \"        Alpha Mask = 0x%.8x\\n\",\n                                        Amask);\n                        }\n                    }\n                }\n\n#if SDL_VIDEO_DRIVER_WINDOWS\n\t\t\t\t/* Print the D3D9 adapter index */\n\t\t\t\tadapterIndex = SDL_Direct3D9GetAdapterIndex( i );\n\t\t\t\tfprintf( stderr, \"D3D9 Adapter Index: %d\", adapterIndex );\n\n\t\t\t\t/* Print the DXGI adapter and output indices */\n\t\t\t\tSDL_DXGIGetOutputInfo(i, &adapterIndex, &outputIndex);\n\t\t\t\tfprintf( stderr, \"DXGI Adapter Index: %d  Output Index: %d\", adapterIndex, outputIndex );\n#endif\n            }\n        }\n\n        if (state->verbose & VERBOSE_RENDER) {\n            SDL_RendererInfo info;\n\n            n = SDL_GetNumRenderDrivers();\n            if (n == 0) {\n                fprintf(stderr, \"No built-in render drivers\\n\");\n            } else {\n                fprintf(stderr, \"Built-in render drivers:\\n\");\n                for (i = 0; i < n; ++i) {\n                    SDL_GetRenderDriverInfo(i, &info);\n                    SDLTest_PrintRenderer(&info);\n                }\n            }\n        }\n\n        SDL_zero(fullscreen_mode);\n        switch (state->depth) {\n        case 8:\n            fullscreen_mode.format = SDL_PIXELFORMAT_INDEX8;\n            break;\n        case 15:\n            fullscreen_mode.format = SDL_PIXELFORMAT_RGB555;\n            break;\n        case 16:\n            fullscreen_mode.format = SDL_PIXELFORMAT_RGB565;\n            break;\n        case 24:\n            fullscreen_mode.format = SDL_PIXELFORMAT_RGB24;\n            break;\n        default:\n            fullscreen_mode.format = SDL_PIXELFORMAT_RGB888;\n            break;\n        }\n        fullscreen_mode.refresh_rate = state->refresh_rate;\n\n        state->windows =\n            (SDL_Window **) SDL_malloc(state->num_windows *\n                                        sizeof(*state->windows));\n        state->renderers =\n            (SDL_Renderer **) SDL_malloc(state->num_windows *\n                                        sizeof(*state->renderers));\n        state->targets =\n            (SDL_Texture **) SDL_malloc(state->num_windows *\n                                        sizeof(*state->targets));\n        if (!state->windows || !state->renderers) {\n            fprintf(stderr, \"Out of memory!\\n\");\n            return SDL_FALSE;\n        }\n        for (i = 0; i < state->num_windows; ++i) {\n            char title[1024];\n\n            if (state->num_windows > 1) {\n                SDL_snprintf(title, SDL_arraysize(title), \"%s %d\",\n                             state->window_title, i + 1);\n            } else {\n                SDL_strlcpy(title, state->window_title, SDL_arraysize(title));\n            }\n            state->windows[i] =\n                SDL_CreateWindow(title, state->window_x, state->window_y,\n                                 state->window_w, state->window_h,\n                                 state->window_flags);\n            if (!state->windows[i]) {\n                fprintf(stderr, \"Couldn't create window: %s\\n\",\n                        SDL_GetError());\n                return SDL_FALSE;\n            }\n            if (state->window_minW || state->window_minH) {\n                SDL_SetWindowMinimumSize(state->windows[i], state->window_minW, state->window_minH);\n            }\n            if (state->window_maxW || state->window_maxH) {\n                SDL_SetWindowMaximumSize(state->windows[i], state->window_maxW, state->window_maxH);\n            }\n            SDL_GetWindowSize(state->windows[i], &w, &h);\n            if (!(state->window_flags & SDL_WINDOW_RESIZABLE) &&\n                (w != state->window_w || h != state->window_h)) {\n                printf(\"Window requested size %dx%d, got %dx%d\\n\", state->window_w, state->window_h, w, h);\n                state->window_w = w;\n                state->window_h = h;\n            }\n            if (SDL_SetWindowDisplayMode(state->windows[i], &fullscreen_mode) < 0) {\n                fprintf(stderr, \"Can't set up fullscreen display mode: %s\\n\",\n                        SDL_GetError());\n                return SDL_FALSE;\n            }\n\n            if (state->window_icon) {\n                SDL_Surface *icon = SDLTest_LoadIcon(state->window_icon);\n                if (icon) {\n                    SDL_SetWindowIcon(state->windows[i], icon);\n                    SDL_FreeSurface(icon);\n                }\n            }\n\n            SDL_ShowWindow(state->windows[i]);\n\n            state->renderers[i] = NULL;\n            state->targets[i] = NULL;\n\n            if (!state->skip_renderer\n                && (state->renderdriver\n                    || !(state->window_flags & SDL_WINDOW_OPENGL))) {\n                m = -1;\n                if (state->renderdriver) {\n                    SDL_RendererInfo info;\n                    n = SDL_GetNumRenderDrivers();\n                    for (j = 0; j < n; ++j) {\n                        SDL_GetRenderDriverInfo(j, &info);\n                        if (SDL_strcasecmp(info.name, state->renderdriver) ==\n                            0) {\n                            m = j;\n                            break;\n                        }\n                    }\n                    if (m == -1) {\n                        fprintf(stderr,\n                                \"Couldn't find render driver named %s\",\n                                state->renderdriver);\n                        return SDL_FALSE;\n                    }\n                }\n                state->renderers[i] = SDL_CreateRenderer(state->windows[i],\n                                            m, state->render_flags);\n                if (!state->renderers[i]) {\n                    fprintf(stderr, \"Couldn't create renderer: %s\\n\",\n                            SDL_GetError());\n                    return SDL_FALSE;\n                }\n                if (state->logical_w && state->logical_h) {\n                    SDL_RenderSetLogicalSize(state->renderers[i], state->logical_w, state->logical_h);\n                } else if (state->scale) {\n                    SDL_RenderSetScale(state->renderers[i], state->scale, state->scale);\n                }\n                if (state->verbose & VERBOSE_RENDER) {\n                    SDL_RendererInfo info;\n\n                    fprintf(stderr, \"Current renderer:\\n\");\n                    SDL_GetRendererInfo(state->renderers[i], &info);\n                    SDLTest_PrintRenderer(&info);\n                }\n            }\n        }\n    }\n\n    if (state->flags & SDL_INIT_AUDIO) {\n        if (state->verbose & VERBOSE_AUDIO) {\n            n = SDL_GetNumAudioDrivers();\n            if (n == 0) {\n                fprintf(stderr, \"No built-in audio drivers\\n\");\n            } else {\n                fprintf(stderr, \"Built-in audio drivers:\");\n                for (i = 0; i < n; ++i) {\n                    if (i > 0) {\n                        fprintf(stderr, \",\");\n                    }\n                    fprintf(stderr, \" %s\", SDL_GetAudioDriver(i));\n                }\n                fprintf(stderr, \"\\n\");\n            }\n        }\n        if (SDL_AudioInit(state->audiodriver) < 0) {\n            fprintf(stderr, \"Couldn't initialize audio driver: %s\\n\",\n                    SDL_GetError());\n            return SDL_FALSE;\n        }\n        if (state->verbose & VERBOSE_VIDEO) {\n            fprintf(stderr, \"Audio driver: %s\\n\",\n                    SDL_GetCurrentAudioDriver());\n        }\n\n        if (SDL_OpenAudio(&state->audiospec, NULL) < 0) {\n            fprintf(stderr, \"Couldn't open audio: %s\\n\", SDL_GetError());\n            return SDL_FALSE;\n        }\n    }\n\n    return SDL_TRUE;\n}\n\nstatic const char *\nControllerAxisName(const SDL_GameControllerAxis axis)\n{\n    switch (axis)\n    {\n#define AXIS_CASE(ax) case SDL_CONTROLLER_AXIS_##ax: return #ax\n        AXIS_CASE(INVALID);\n        AXIS_CASE(LEFTX);\n        AXIS_CASE(LEFTY);\n        AXIS_CASE(RIGHTX);\n        AXIS_CASE(RIGHTY);\n        AXIS_CASE(TRIGGERLEFT);\n        AXIS_CASE(TRIGGERRIGHT);\n#undef AXIS_CASE\ndefault: return \"???\";\n    }\n}\n\nstatic const char *\nControllerButtonName(const SDL_GameControllerButton button)\n{\n    switch (button)\n    {\n#define BUTTON_CASE(btn) case SDL_CONTROLLER_BUTTON_##btn: return #btn\n        BUTTON_CASE(INVALID);\n        BUTTON_CASE(A);\n        BUTTON_CASE(B);\n        BUTTON_CASE(X);\n        BUTTON_CASE(Y);\n        BUTTON_CASE(BACK);\n        BUTTON_CASE(GUIDE);\n        BUTTON_CASE(START);\n        BUTTON_CASE(LEFTSTICK);\n        BUTTON_CASE(RIGHTSTICK);\n        BUTTON_CASE(LEFTSHOULDER);\n        BUTTON_CASE(RIGHTSHOULDER);\n        BUTTON_CASE(DPAD_UP);\n        BUTTON_CASE(DPAD_DOWN);\n        BUTTON_CASE(DPAD_LEFT);\n        BUTTON_CASE(DPAD_RIGHT);\n#undef BUTTON_CASE\ndefault: return \"???\";\n    }\n}\n\nstatic void\nSDLTest_PrintEvent(SDL_Event * event)\n{\n    if ((event->type == SDL_MOUSEMOTION) || (event->type == SDL_FINGERMOTION)) {\n        /* Mouse and finger motion are really spammy */\n        return;\n    }\n\n    switch (event->type) {\n    case SDL_WINDOWEVENT:\n        switch (event->window.event) {\n        case SDL_WINDOWEVENT_SHOWN:\n            SDL_Log(\"SDL EVENT: Window %d shown\", event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_HIDDEN:\n            SDL_Log(\"SDL EVENT: Window %d hidden\", event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_EXPOSED:\n            SDL_Log(\"SDL EVENT: Window %d exposed\", event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_MOVED:\n            SDL_Log(\"SDL EVENT: Window %d moved to %d,%d\",\n                    event->window.windowID, event->window.data1,\n                    event->window.data2);\n            break;\n        case SDL_WINDOWEVENT_RESIZED:\n            SDL_Log(\"SDL EVENT: Window %d resized to %dx%d\",\n                    event->window.windowID, event->window.data1,\n                    event->window.data2);\n            break;\n        case SDL_WINDOWEVENT_SIZE_CHANGED:\n            SDL_Log(\"SDL EVENT: Window %d changed size to %dx%d\",\n                    event->window.windowID, event->window.data1,\n                    event->window.data2);\n            break;\n        case SDL_WINDOWEVENT_MINIMIZED:\n            SDL_Log(\"SDL EVENT: Window %d minimized\", event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_MAXIMIZED:\n            SDL_Log(\"SDL EVENT: Window %d maximized\", event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_RESTORED:\n            SDL_Log(\"SDL EVENT: Window %d restored\", event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_ENTER:\n            SDL_Log(\"SDL EVENT: Mouse entered window %d\",\n                    event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_LEAVE:\n            SDL_Log(\"SDL EVENT: Mouse left window %d\", event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_FOCUS_GAINED:\n            SDL_Log(\"SDL EVENT: Window %d gained keyboard focus\",\n                    event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_FOCUS_LOST:\n            SDL_Log(\"SDL EVENT: Window %d lost keyboard focus\",\n                    event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_CLOSE:\n            SDL_Log(\"SDL EVENT: Window %d closed\", event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_TAKE_FOCUS:\n            SDL_Log(\"SDL EVENT: Window %d take focus\", event->window.windowID);\n            break;\n        case SDL_WINDOWEVENT_HIT_TEST:\n            SDL_Log(\"SDL EVENT: Window %d hit test\", event->window.windowID);\n            break;\n        default:\n            SDL_Log(\"SDL EVENT: Window %d got unknown event %d\",\n                    event->window.windowID, event->window.event);\n            break;\n        }\n        break;\n    case SDL_KEYDOWN:\n        SDL_Log(\"SDL EVENT: Keyboard: key pressed  in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s\",\n                event->key.windowID,\n                event->key.keysym.scancode,\n                SDL_GetScancodeName(event->key.keysym.scancode),\n                event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));\n        break;\n    case SDL_KEYUP:\n        SDL_Log(\"SDL EVENT: Keyboard: key released in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s\",\n                event->key.windowID,\n                event->key.keysym.scancode,\n                SDL_GetScancodeName(event->key.keysym.scancode),\n                event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));\n        break;\n    case SDL_TEXTINPUT:\n        SDL_Log(\"SDL EVENT: Keyboard: text input \\\"%s\\\" in window %d\",\n                event->text.text, event->text.windowID);\n        break;\n    case SDL_MOUSEMOTION:\n        SDL_Log(\"SDL EVENT: Mouse: moved to %d,%d (%d,%d) in window %d\",\n                event->motion.x, event->motion.y,\n                event->motion.xrel, event->motion.yrel,\n                event->motion.windowID);\n        break;\n    case SDL_MOUSEBUTTONDOWN:\n        SDL_Log(\"SDL EVENT: Mouse: button %d pressed at %d,%d with click count %d in window %d\",\n                event->button.button, event->button.x, event->button.y, event->button.clicks,\n                event->button.windowID);\n        break;\n    case SDL_MOUSEBUTTONUP:\n        SDL_Log(\"SDL EVENT: Mouse: button %d released at %d,%d with click count %d in window %d\",\n                event->button.button, event->button.x, event->button.y, event->button.clicks,\n                event->button.windowID);\n        break;\n    case SDL_MOUSEWHEEL:\n        SDL_Log(\"SDL EVENT: Mouse: wheel scrolled %d in x and %d in y (reversed: %d) in window %d\",\n                event->wheel.x, event->wheel.y, event->wheel.direction, event->wheel.windowID);\n        break;\n    case SDL_JOYDEVICEADDED:\n        SDL_Log(\"SDL EVENT: Joystick index %d attached\",\n            event->jdevice.which);\n        break;\n    case SDL_JOYDEVICEREMOVED:\n        SDL_Log(\"SDL EVENT: Joystick %d removed\",\n            event->jdevice.which);\n        break;\n    case SDL_JOYBALLMOTION:\n        SDL_Log(\"SDL EVENT: Joystick %d: ball %d moved by %d,%d\",\n                event->jball.which, event->jball.ball, event->jball.xrel,\n                event->jball.yrel);\n        break;\n    case SDL_JOYHATMOTION:\n        {\n            const char *position = \"UNKNOWN\";\n            switch (event->jhat.value) {\n            case SDL_HAT_CENTERED:\n                position = \"CENTER\";\n                break;\n            case SDL_HAT_UP:\n                position = \"UP\";\n                break;\n            case SDL_HAT_RIGHTUP:\n                position = \"RIGHTUP\";\n                break;\n            case SDL_HAT_RIGHT:\n                position = \"RIGHT\";\n                break;\n            case SDL_HAT_RIGHTDOWN:\n                position = \"RIGHTDOWN\";\n                break;\n            case SDL_HAT_DOWN:\n                position = \"DOWN\";\n                break;\n            case SDL_HAT_LEFTDOWN:\n                position = \"LEFTDOWN\";\n                break;\n            case SDL_HAT_LEFT:\n                position = \"LEFT\";\n                break;\n            case SDL_HAT_LEFTUP:\n                position = \"LEFTUP\";\n                break;\n            }\n            SDL_Log(\"SDL EVENT: Joystick %d: hat %d moved to %s\", event->jhat.which,\n                event->jhat.hat, position);\n        }\n        break;\n    case SDL_JOYBUTTONDOWN:\n        SDL_Log(\"SDL EVENT: Joystick %d: button %d pressed\",\n                event->jbutton.which, event->jbutton.button);\n        break;\n    case SDL_JOYBUTTONUP:\n        SDL_Log(\"SDL EVENT: Joystick %d: button %d released\",\n                event->jbutton.which, event->jbutton.button);\n        break;\n    case SDL_CONTROLLERDEVICEADDED:\n        SDL_Log(\"SDL EVENT: Controller index %d attached\",\n            event->cdevice.which);\n        break;\n    case SDL_CONTROLLERDEVICEREMOVED:\n        SDL_Log(\"SDL EVENT: Controller %d removed\",\n            event->cdevice.which);\n        break;\n    case SDL_CONTROLLERAXISMOTION:\n        SDL_Log(\"SDL EVENT: Controller %d axis %d ('%s') value: %d\",\n            event->caxis.which,\n            event->caxis.axis,\n            ControllerAxisName((SDL_GameControllerAxis)event->caxis.axis),\n            event->caxis.value);\n        break;\n    case SDL_CONTROLLERBUTTONDOWN:\n        SDL_Log(\"SDL EVENT: Controller %d button %d ('%s') down\",\n            event->cbutton.which, event->cbutton.button,\n            ControllerButtonName((SDL_GameControllerButton)event->cbutton.button));\n        break;\n    case SDL_CONTROLLERBUTTONUP:\n        SDL_Log(\"SDL EVENT: Controller %d button %d ('%s') up\",\n            event->cbutton.which, event->cbutton.button,\n            ControllerButtonName((SDL_GameControllerButton)event->cbutton.button));\n        break;\n    case SDL_CLIPBOARDUPDATE:\n        SDL_Log(\"SDL EVENT: Clipboard updated\");\n        break;\n\n    case SDL_FINGERDOWN:\n    case SDL_FINGERUP:\n        SDL_Log(\"SDL EVENT: Finger: %s touch=%ld, finger=%ld, x=%f, y=%f, dx=%f, dy=%f, pressure=%f\",\n                (event->type == SDL_FINGERDOWN) ? \"down\" : \"up\",\n                (long) event->tfinger.touchId,\n                (long) event->tfinger.fingerId,\n                event->tfinger.x, event->tfinger.y,\n                event->tfinger.dx, event->tfinger.dy, event->tfinger.pressure);\n        break;\n    case SDL_DOLLARGESTURE:\n        SDL_Log(\"SDL_EVENT: Dollar gesture detect: %\"SDL_PRIs64, (Sint64) event->dgesture.gestureId);\n        break;\n    case SDL_DOLLARRECORD:\n        SDL_Log(\"SDL_EVENT: Dollar gesture record: %\"SDL_PRIs64, (Sint64) event->dgesture.gestureId);\n        break;\n    case SDL_MULTIGESTURE:\n        SDL_Log(\"SDL_EVENT: Multi gesture fingers: %d\", event->mgesture.numFingers);\n        break;\n\n    case SDL_RENDER_DEVICE_RESET:\n        SDL_Log(\"SDL EVENT: render device reset\");\n        break;\n    case SDL_RENDER_TARGETS_RESET:\n        SDL_Log(\"SDL EVENT: render targets reset\");\n        break;\n\n    case SDL_QUIT:\n        SDL_Log(\"SDL EVENT: Quit requested\");\n        break;\n    case SDL_USEREVENT:\n        SDL_Log(\"SDL EVENT: User event %d\", event->user.code);\n        break;\n    default:\n        SDL_Log(\"Unknown event %04x\", event->type);\n        break;\n    }\n}\n\nstatic void\nSDLTest_ScreenShot(SDL_Renderer *renderer)\n{\n    SDL_Rect viewport;\n    SDL_Surface *surface;\n\n    if (!renderer) {\n        return;\n    }\n\n    SDL_RenderGetViewport(renderer, &viewport);\n    surface = SDL_CreateRGBSurface(0, viewport.w, viewport.h, 24,\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n                    0x00FF0000, 0x0000FF00, 0x000000FF,\n#else\n                    0x000000FF, 0x0000FF00, 0x00FF0000,\n#endif\n                    0x00000000);\n    if (!surface) {\n        fprintf(stderr, \"Couldn't create surface: %s\\n\", SDL_GetError());\n        return;\n    }\n\n    if (SDL_RenderReadPixels(renderer, NULL, surface->format->format,\n                             surface->pixels, surface->pitch) < 0) {\n        fprintf(stderr, \"Couldn't read screen: %s\\n\", SDL_GetError());\n        SDL_free(surface);\n        return;\n    }\n\n    if (SDL_SaveBMP(surface, \"screenshot.bmp\") < 0) {\n        fprintf(stderr, \"Couldn't save screenshot.bmp: %s\\n\", SDL_GetError());\n        SDL_free(surface);\n        return;\n    }\n}\n\nstatic void\nFullscreenTo(int index, int windowId)\n{\n    Uint32 flags;\n    struct SDL_Rect rect = { 0, 0, 0, 0 };\n    SDL_Window *window = SDL_GetWindowFromID(windowId);\n    if (!window) {\n        return;\n    }\n\n    SDL_GetDisplayBounds( index, &rect );\n\n    flags = SDL_GetWindowFlags(window);\n    if (flags & SDL_WINDOW_FULLSCREEN) {\n        SDL_SetWindowFullscreen( window, SDL_FALSE );\n        SDL_Delay( 15 );\n    }\n\n    SDL_SetWindowPosition( window, rect.x, rect.y );\n    SDL_SetWindowFullscreen( window, SDL_TRUE );\n}\n\nvoid\nSDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done)\n{\n    int i;\n    static SDL_MouseMotionEvent lastEvent;\n\n    if (state->verbose & VERBOSE_EVENT) {\n        SDLTest_PrintEvent(event);\n    }\n\n    switch (event->type) {\n    case SDL_WINDOWEVENT:\n        switch (event->window.event) {\n        case SDL_WINDOWEVENT_CLOSE:\n            {\n                SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);\n                if (window) {\n                    for (i = 0; i < state->num_windows; ++i) {\n                        if (window == state->windows[i]) {\n                            if (state->targets[i]) {\n                                SDL_DestroyTexture(state->targets[i]);\n                                state->targets[i] = NULL;\n                            }\n                            if (state->renderers[i]) {\n                                SDL_DestroyRenderer(state->renderers[i]);\n                                state->renderers[i] = NULL;\n                            }\n                            SDL_DestroyWindow(state->windows[i]);\n                            state->windows[i] = NULL;\n                            break;\n                        }\n                    }\n                }\n            }\n            break;\n        }\n        break;\n    case SDL_KEYDOWN: {\n        SDL_bool withControl = !!(event->key.keysym.mod & KMOD_CTRL);\n        SDL_bool withShift = !!(event->key.keysym.mod & KMOD_SHIFT);\n        SDL_bool withAlt = !!(event->key.keysym.mod & KMOD_ALT);\n\n        switch (event->key.keysym.sym) {\n            /* Add hotkeys here */\n        case SDLK_PRINTSCREEN: {\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    for (i = 0; i < state->num_windows; ++i) {\n                        if (window == state->windows[i]) {\n                            SDLTest_ScreenShot(state->renderers[i]);\n                        }\n                    }\n                }\n            }\n            break;\n        case SDLK_EQUALS:\n            if (withControl) {\n                /* Ctrl-+ double the size of the window */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    int w, h;\n                    SDL_GetWindowSize(window, &w, &h);\n                    SDL_SetWindowSize(window, w*2, h*2);\n                }\n            }\n            break;\n        case SDLK_MINUS:\n            if (withControl) {\n                /* Ctrl-- half the size of the window */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    int w, h;\n                    SDL_GetWindowSize(window, &w, &h);\n                    SDL_SetWindowSize(window, w/2, h/2);\n                }\n            }\n            break;\n        case SDLK_o:\n            if (withControl) {\n                /* Ctrl-O (or Ctrl-Shift-O) changes window opacity. */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    float opacity;\n                    if (SDL_GetWindowOpacity(window, &opacity) == 0) {\n                        if (withShift) {\n                            opacity += 0.20f;\n                        } else {\n                            opacity -= 0.20f;\n                        }\n                        SDL_SetWindowOpacity(window, opacity);\n                    }\n                }\n            }\n            break;\n\n        case SDLK_c:\n            if (withControl) {\n                /* Ctrl-C copy awesome text! */\n                SDL_SetClipboardText(\"SDL rocks!\\nYou know it!\");\n                printf(\"Copied text to clipboard\\n\");\n            }\n            if (withAlt) {\n                /* Alt-C toggle a render clip rectangle */\n                for (i = 0; i < state->num_windows; ++i) {\n                    int w, h;\n                    if (state->renderers[i]) {\n                        SDL_Rect clip;\n                        SDL_GetWindowSize(state->windows[i], &w, &h);\n                        SDL_RenderGetClipRect(state->renderers[i], &clip);\n                        if (SDL_RectEmpty(&clip)) {\n                            clip.x = w/4;\n                            clip.y = h/4;\n                            clip.w = w/2;\n                            clip.h = h/2;\n                            SDL_RenderSetClipRect(state->renderers[i], &clip);\n                        } else {\n                            SDL_RenderSetClipRect(state->renderers[i], NULL);\n                        }\n                    }\n                }\n            }\n            if (withShift) {\n                SDL_Window *current_win = SDL_GetKeyboardFocus();\n                if (current_win) {\n                    const SDL_bool shouldCapture = (SDL_GetWindowFlags(current_win) & SDL_WINDOW_MOUSE_CAPTURE) == 0;\n                    const int rc = SDL_CaptureMouse(shouldCapture);\n                    SDL_Log(\"%sapturing mouse %s!\\n\", shouldCapture ? \"C\" : \"Unc\", (rc == 0) ? \"succeeded\" : \"failed\");\n                }\n            }\n            break;\n        case SDLK_v:\n            if (withControl) {\n                /* Ctrl-V paste awesome text! */\n                char *text = SDL_GetClipboardText();\n                if (*text) {\n                    printf(\"Clipboard: %s\\n\", text);\n                } else {\n                    printf(\"Clipboard is empty\\n\");\n                }\n                SDL_free(text);\n            }\n            break;\n        case SDLK_g:\n            if (withControl) {\n                /* Ctrl-G toggle grab */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    SDL_SetWindowGrab(window, !SDL_GetWindowGrab(window) ? SDL_TRUE : SDL_FALSE);\n                }\n            }\n            break;\n        case SDLK_m:\n            if (withControl) {\n                /* Ctrl-M maximize */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    Uint32 flags = SDL_GetWindowFlags(window);\n                    if (flags & SDL_WINDOW_MAXIMIZED) {\n                        SDL_RestoreWindow(window);\n                    } else {\n                        SDL_MaximizeWindow(window);\n                    }\n                }\n            }\n            break;\n        case SDLK_r:\n            if (withControl) {\n                /* Ctrl-R toggle mouse relative mode */\n                SDL_SetRelativeMouseMode(!SDL_GetRelativeMouseMode() ? SDL_TRUE : SDL_FALSE);\n            }\n            break;\n        case SDLK_z:\n            if (withControl) {\n                /* Ctrl-Z minimize */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    SDL_MinimizeWindow(window);\n                }\n            }\n            break;\n        case SDLK_RETURN:\n            if (withControl) {\n                /* Ctrl-Enter toggle fullscreen */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    Uint32 flags = SDL_GetWindowFlags(window);\n                    if (flags & SDL_WINDOW_FULLSCREEN) {\n                        SDL_SetWindowFullscreen(window, SDL_FALSE);\n                    } else {\n                        SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN);\n                    }\n                }\n            } else if (withAlt) {\n                /* Alt-Enter toggle fullscreen desktop */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    Uint32 flags = SDL_GetWindowFlags(window);\n                    if (flags & SDL_WINDOW_FULLSCREEN) {\n                        SDL_SetWindowFullscreen(window, SDL_FALSE);\n                    } else {\n                        SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);\n                    }\n                }\n            } else if (withShift) {\n                /* Shift-Enter toggle fullscreen desktop / fullscreen */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    Uint32 flags = SDL_GetWindowFlags(window);\n                    if ((flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) {\n                        SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN);\n                    } else {\n                        SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);\n                    }\n                }\n            }\n\n            break;\n        case SDLK_b:\n            if (withControl) {\n                /* Ctrl-B toggle window border */\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                if (window) {\n                    const Uint32 flags = SDL_GetWindowFlags(window);\n                    const SDL_bool b = ((flags & SDL_WINDOW_BORDERLESS) != 0) ? SDL_TRUE : SDL_FALSE;\n                    SDL_SetWindowBordered(window, b);\n                }\n            }\n            break;\n        case SDLK_a:\n            if (withControl) {\n                /* Ctrl-A reports absolute mouse position. */\n                int x, y;\n                const Uint32 mask = SDL_GetGlobalMouseState(&x, &y);\n                SDL_Log(\"ABSOLUTE MOUSE: (%d, %d)%s%s%s%s%s\\n\", x, y,\n                        (mask & SDL_BUTTON_LMASK) ? \" [LBUTTON]\" : \"\",\n                        (mask & SDL_BUTTON_MMASK) ? \" [MBUTTON]\" : \"\",\n                        (mask & SDL_BUTTON_RMASK) ? \" [RBUTTON]\" : \"\",\n                        (mask & SDL_BUTTON_X1MASK) ? \" [X2BUTTON]\" : \"\",\n                        (mask & SDL_BUTTON_X2MASK) ? \" [X2BUTTON]\" : \"\");\n            }\n            break;\n        case SDLK_0:\n            if (withControl) {\n                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n                SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, \"Test Message\", \"You're awesome!\", window);\n            }\n            break;\n        case SDLK_1:\n            if (withControl) {\n                FullscreenTo(0, event->key.windowID);\n            }\n            break;\n        case SDLK_2:\n            if (withControl) {\n                FullscreenTo(1, event->key.windowID);\n            }\n            break;\n        case SDLK_ESCAPE:\n            *done = 1;\n            break;\n        case SDLK_SPACE:\n        {\n            char message[256];\n            SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);\n\n            SDL_snprintf(message, sizeof(message), \"(%i, %i), rel (%i, %i)\\n\", lastEvent.x, lastEvent.y, lastEvent.xrel, lastEvent.yrel);\n            SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, \"Last mouse position\", message, window);\n            break;\n        }\n        default:\n            break;\n        }\n        break;\n    }\n    case SDL_QUIT:\n        *done = 1;\n        break;\n    case SDL_MOUSEMOTION:\n        lastEvent = event->motion;\n        break;\n    }\n}\n\nvoid\nSDLTest_CommonQuit(SDLTest_CommonState * state)\n{\n    int i;\n\n    SDL_free(state->windows);\n    if (state->targets) {\n        for (i = 0; i < state->num_windows; ++i) {\n            if (state->targets[i]) {\n                SDL_DestroyTexture(state->targets[i]);\n            }\n        }\n        SDL_free(state->targets);\n    }\n    if (state->renderers) {\n        for (i = 0; i < state->num_windows; ++i) {\n            if (state->renderers[i]) {\n                SDL_DestroyRenderer(state->renderers[i]);\n            }\n        }\n        SDL_free(state->renderers);\n    }\n    if (state->flags & SDL_INIT_VIDEO) {\n        SDL_VideoQuit();\n    }\n    if (state->flags & SDL_INIT_AUDIO) {\n        SDL_AudioQuit();\n    }\n    SDL_free(state);\n    SDL_Quit();\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_compare.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n\n Based on automated SDL_Surface tests originally written by Edgar Simo 'bobbens'.\n\n Rewritten for test lib by Andreas Schiffler.\n\n*/\n\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n\n/* Counter for _CompareSurface calls; used for filename creation when comparisons fail */\nstatic int _CompareSurfaceCount = 0;\n\n/* Compare surfaces */\nint SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error)\n{\n   int ret;\n   int i,j;\n   int bpp, bpp_reference;\n   Uint8 *p, *p_reference;\n   int dist;\n   int sampleErrorX = 0, sampleErrorY = 0, sampleDist = 0;\n   Uint8 R, G, B, A;\n   Uint8 Rd, Gd, Bd, Ad;\n   char imageFilename[128];\n   char referenceFilename[128];\n\n   /* Validate input surfaces */\n   if (surface == NULL || referenceSurface == NULL) {\n      return -1;\n   }\n\n   /* Make sure surface size is the same. */\n   if ((surface->w != referenceSurface->w) || (surface->h != referenceSurface->h)) {\n      return -2;\n   }\n\n   /* Sanitize input value */\n   if (allowable_error<0) {\n      allowable_error = 0;\n   }\n\n   SDL_LockSurface( surface );\n   SDL_LockSurface( referenceSurface );\n\n   ret = 0;\n   bpp = surface->format->BytesPerPixel;\n   bpp_reference = referenceSurface->format->BytesPerPixel;\n   /* Compare image - should be same format. */\n   for (j=0; j<surface->h; j++) {\n      for (i=0; i<surface->w; i++) {\n         p  = (Uint8 *)surface->pixels + j * surface->pitch + i * bpp;\n         p_reference = (Uint8 *)referenceSurface->pixels + j * referenceSurface->pitch + i * bpp_reference;\n\n         SDL_GetRGBA(*(Uint32*)p, surface->format, &R, &G, &B, &A);\n         SDL_GetRGBA(*(Uint32*)p_reference, referenceSurface->format, &Rd, &Gd, &Bd, &Ad);\n\n         dist = 0;\n         dist += (R-Rd)*(R-Rd);\n         dist += (G-Gd)*(G-Gd);\n         dist += (B-Bd)*(B-Bd);\n\n         /* Allow some difference in blending accuracy */\n         if (dist > allowable_error) {\n            ret++;\n            if (ret == 1) {\n               sampleErrorX = i;\n               sampleErrorY = j;\n               sampleDist = dist;\n            }\n         }\n      }\n   }\n\n   SDL_UnlockSurface( surface );\n   SDL_UnlockSurface( referenceSurface );\n\n   /* Save test image and reference for analysis on failures */\n   _CompareSurfaceCount++;\n   if (ret != 0) {\n      SDLTest_LogError(\"Comparison of pixels with allowable error of %i failed %i times.\", allowable_error, ret);\n      SDLTest_LogError(\"First detected occurrence at position %i,%i with a squared RGB-difference of %i.\", sampleErrorX, sampleErrorY, sampleDist); \n      SDL_snprintf(imageFilename, 127, \"CompareSurfaces%04d_TestOutput.bmp\", _CompareSurfaceCount);\n      SDL_SaveBMP(surface, imageFilename);\n      SDL_snprintf(referenceFilename, 127, \"CompareSurfaces%04d_Reference.bmp\", _CompareSurfaceCount);\n      SDL_SaveBMP(referenceSurface, referenceFilename);\n      SDLTest_LogError(\"Surfaces from failed comparison saved as '%s' and '%s'\", imageFilename, referenceFilename);\n   }\n\n   return ret;\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_crc32.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n\n Used by the test execution component.\n Original source code contributed by A. Schiffler for GSOC project.\n\n*/\n\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n\nint SDLTest_Crc32Init(SDLTest_Crc32Context *crcContext)\n{\n  int i,j;\n  CrcUint32 c;\n\n  /* Sanity check context pointer */\n  if (crcContext==NULL) {\n   return -1;\n  }\n\n  /*\n   * Build auxiliary table for parallel byte-at-a-time CRC-32\n   */\n#ifdef ORIGINAL_METHOD\n  for (i = 0; i < 256; ++i) {\n    for (c = i << 24, j = 8; j > 0; --j) {\n      c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);\n    }\n    crcContext->crc32_table[i] = c;\n  }\n#else\n  for (i=0; i<256; i++) {\n   c = i;\n   for (j=8; j>0; j--) {\n    if (c & 1) {\n     c = (c >> 1) ^ CRC32_POLY;\n    } else {\n     c >>= 1;\n    }\n   }\n   crcContext->crc32_table[i] = c;\n  }\n#endif\n\n  return 0;\n}\n\n/* Complete CRC32 calculation on a memory block */\n\nint SDLTest_Crc32Calc(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32)\n{\n  if (SDLTest_Crc32CalcStart(crcContext,crc32)) {\n   return -1;\n  }\n\n  if (SDLTest_Crc32CalcBuffer(crcContext, inBuf, inLen, crc32)) {\n   return -1;\n  }\n\n  if (SDLTest_Crc32CalcEnd(crcContext, crc32)) {\n   return -1;\n  }\n\n  return 0;\n}\n\n/* Start crc calculation */\n\nint SDLTest_Crc32CalcStart(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32)\n{\n  /* Sanity check pointers */\n  if (crcContext==NULL) {\n   *crc32=0;\n   return -1;\n  }\n\n  /*\n   * Preload shift register, per CRC-32 spec\n   */\n  *crc32 = 0xffffffff;\n\n  return 0;\n}\n\n/* Finish crc calculation */\n\nint SDLTest_Crc32CalcEnd(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32)\n{\n  /* Sanity check pointers */\n  if (crcContext==NULL) {\n   *crc32=0;\n   return -1;\n  }\n\n  /*\n   * Return complement, per CRC-32 spec\n   */\n  *crc32 = (~(*crc32));\n\n  return 0;\n}\n\n/* Include memory block in crc */\n\nint SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32)\n{\n  CrcUint8    *p;\n  register CrcUint32    crc;\n\n  if (crcContext==NULL) {\n   *crc32=0;\n   return -1;\n  }\n\n  if (inBuf==NULL) {\n   return -1;\n  }\n\n  /*\n   * Calculate CRC from data\n   */\n  crc = *crc32;\n  for (p = inBuf; inLen > 0; ++p, --inLen) {\n#ifdef ORIGINAL_METHOD\n    crc = (crc << 8) ^ crcContext->crc32_table[(crc >> 24) ^ *p];\n#else\n    crc = ((crc >> 8) & 0x00FFFFFF) ^ crcContext->crc32_table[ (crc ^ *p) & 0xFF ];\n#endif\n  }\n  *crc32 = crc;\n\n  return 0;\n}\n\nint SDLTest_Crc32Done(SDLTest_Crc32Context * crcContext)\n{\n  if (crcContext==NULL) {\n     return -1;\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_font.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n/* ---- 8x8 font definition ---- */\n\n/* Originally part of SDL2_gfx */\n\n/* ZLIB (c) A. Schiffler 2012 */\n\n#define SDL_TESTFONTDATAMAX (8*256)\n\nstatic unsigned char SDLTest_FontData[SDL_TESTFONTDATAMAX] = {\n\n    /*\n    * 0 0x00 '^@'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 1 0x01 '^A'\n    */\n    0x7e,           /* 01111110 */\n    0x81,           /* 10000001 */\n    0xa5,           /* 10100101 */\n    0x81,           /* 10000001 */\n    0xbd,           /* 10111101 */\n    0x99,           /* 10011001 */\n    0x81,           /* 10000001 */\n    0x7e,           /* 01111110 */\n\n    /*\n    * 2 0x02 '^B'\n    */\n    0x7e,           /* 01111110 */\n    0xff,           /* 11111111 */\n    0xdb,           /* 11011011 */\n    0xff,           /* 11111111 */\n    0xc3,           /* 11000011 */\n    0xe7,           /* 11100111 */\n    0xff,           /* 11111111 */\n    0x7e,           /* 01111110 */\n\n    /*\n    * 3 0x03 '^C'\n    */\n    0x6c,           /* 01101100 */\n    0xfe,           /* 11111110 */\n    0xfe,           /* 11111110 */\n    0xfe,           /* 11111110 */\n    0x7c,           /* 01111100 */\n    0x38,           /* 00111000 */\n    0x10,           /* 00010000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 4 0x04 '^D'\n    */\n    0x10,           /* 00010000 */\n    0x38,           /* 00111000 */\n    0x7c,           /* 01111100 */\n    0xfe,           /* 11111110 */\n    0x7c,           /* 01111100 */\n    0x38,           /* 00111000 */\n    0x10,           /* 00010000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 5 0x05 '^E'\n    */\n    0x38,           /* 00111000 */\n    0x7c,           /* 01111100 */\n    0x38,           /* 00111000 */\n    0xfe,           /* 11111110 */\n    0xfe,           /* 11111110 */\n    0xd6,           /* 11010110 */\n    0x10,           /* 00010000 */\n    0x38,           /* 00111000 */\n\n    /*\n    * 6 0x06 '^F'\n    */\n    0x10,           /* 00010000 */\n    0x38,           /* 00111000 */\n    0x7c,           /* 01111100 */\n    0xfe,           /* 11111110 */\n    0xfe,           /* 11111110 */\n    0x7c,           /* 01111100 */\n    0x10,           /* 00010000 */\n    0x38,           /* 00111000 */\n\n    /*\n    * 7 0x07 '^G'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 8 0x08 '^H'\n    */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xe7,           /* 11100111 */\n    0xc3,           /* 11000011 */\n    0xc3,           /* 11000011 */\n    0xe7,           /* 11100111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n\n    /*\n    * 9 0x09 '^I'\n    */\n    0x00,           /* 00000000 */\n    0x3c,           /* 00111100 */\n    0x66,           /* 01100110 */\n    0x42,           /* 01000010 */\n    0x42,           /* 01000010 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 10 0x0a '^J'\n    */\n    0xff,           /* 11111111 */\n    0xc3,           /* 11000011 */\n    0x99,           /* 10011001 */\n    0xbd,           /* 10111101 */\n    0xbd,           /* 10111101 */\n    0x99,           /* 10011001 */\n    0xc3,           /* 11000011 */\n    0xff,           /* 11111111 */\n\n    /*\n    * 11 0x0b '^K'\n    */\n    0x0f,           /* 00001111 */\n    0x07,           /* 00000111 */\n    0x0f,           /* 00001111 */\n    0x7d,           /* 01111101 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x78,           /* 01111000 */\n\n    /*\n    * 12 0x0c '^L'\n    */\n    0x3c,           /* 00111100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 13 0x0d '^M'\n    */\n    0x3f,           /* 00111111 */\n    0x33,           /* 00110011 */\n    0x3f,           /* 00111111 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x70,           /* 01110000 */\n    0xf0,           /* 11110000 */\n    0xe0,           /* 11100000 */\n\n    /*\n    * 14 0x0e '^N'\n    */\n    0x7f,           /* 01111111 */\n    0x63,           /* 01100011 */\n    0x7f,           /* 01111111 */\n    0x63,           /* 01100011 */\n    0x63,           /* 01100011 */\n    0x67,           /* 01100111 */\n    0xe6,           /* 11100110 */\n    0xc0,           /* 11000000 */\n\n    /*\n    * 15 0x0f '^O'\n    */\n    0x18,           /* 00011000 */\n    0xdb,           /* 11011011 */\n    0x3c,           /* 00111100 */\n    0xe7,           /* 11100111 */\n    0xe7,           /* 11100111 */\n    0x3c,           /* 00111100 */\n    0xdb,           /* 11011011 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 16 0x10 '^P'\n    */\n    0x80,           /* 10000000 */\n    0xe0,           /* 11100000 */\n    0xf8,           /* 11111000 */\n    0xfe,           /* 11111110 */\n    0xf8,           /* 11111000 */\n    0xe0,           /* 11100000 */\n    0x80,           /* 10000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 17 0x11 '^Q'\n    */\n    0x02,           /* 00000010 */\n    0x0e,           /* 00001110 */\n    0x3e,           /* 00111110 */\n    0xfe,           /* 11111110 */\n    0x3e,           /* 00111110 */\n    0x0e,           /* 00001110 */\n    0x02,           /* 00000010 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 18 0x12 '^R'\n    */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 19 0x13 '^S'\n    */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x00,           /* 00000000 */\n    0x66,           /* 01100110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 20 0x14 '^T'\n    */\n    0x7f,           /* 01111111 */\n    0xdb,           /* 11011011 */\n    0xdb,           /* 11011011 */\n    0x7b,           /* 01111011 */\n    0x1b,           /* 00011011 */\n    0x1b,           /* 00011011 */\n    0x1b,           /* 00011011 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 21 0x15 '^U'\n    */\n    0x3e,           /* 00111110 */\n    0x61,           /* 01100001 */\n    0x3c,           /* 00111100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0x86,           /* 10000110 */\n    0x7c,           /* 01111100 */\n\n    /*\n    * 22 0x16 '^V'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x7e,           /* 01111110 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 23 0x17 '^W'\n    */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0xff,           /* 11111111 */\n\n    /*\n    * 24 0x18 '^X'\n    */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 25 0x19 '^Y'\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 26 0x1a '^Z'\n    */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0xfe,           /* 11111110 */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 27 0x1b '^['\n    */\n    0x00,           /* 00000000 */\n    0x30,           /* 00110000 */\n    0x60,           /* 01100000 */\n    0xfe,           /* 11111110 */\n    0x60,           /* 01100000 */\n    0x30,           /* 00110000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 28 0x1c '^\\'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 29 0x1d '^]'\n    */\n    0x00,           /* 00000000 */\n    0x24,           /* 00100100 */\n    0x66,           /* 01100110 */\n    0xff,           /* 11111111 */\n    0x66,           /* 01100110 */\n    0x24,           /* 00100100 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 30 0x1e '^^'\n    */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x7e,           /* 01111110 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 31 0x1f '^_'\n    */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0x7e,           /* 01111110 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 32 0x20 ' '\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 33 0x21 '!'\n    */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 34 0x22 '\"'\n    */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x24,           /* 00100100 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 35 0x23 '#'\n    */\n    0x6c,           /* 01101100 */\n    0x6c,           /* 01101100 */\n    0xfe,           /* 11111110 */\n    0x6c,           /* 01101100 */\n    0xfe,           /* 11111110 */\n    0x6c,           /* 01101100 */\n    0x6c,           /* 01101100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 36 0x24 '$'\n    */\n    0x18,           /* 00011000 */\n    0x3e,           /* 00111110 */\n    0x60,           /* 01100000 */\n    0x3c,           /* 00111100 */\n    0x06,           /* 00000110 */\n    0x7c,           /* 01111100 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 37 0x25 '%'\n    */\n    0x00,           /* 00000000 */\n    0xc6,           /* 11000110 */\n    0xcc,           /* 11001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x66,           /* 01100110 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 38 0x26 '&'\n    */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x76,           /* 01110110 */\n    0xdc,           /* 11011100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 39 0x27 '''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 40 0x28 '('\n    */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 41 0x29 ')'\n    */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 42 0x2a '*'\n    */\n    0x00,           /* 00000000 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0xff,           /* 11111111 */\n    0x3c,           /* 00111100 */\n    0x66,           /* 01100110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 43 0x2b '+'\n    */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 44 0x2c ','\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n\n    /*\n    * 45 0x2d '-'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 46 0x2e '.'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 47 0x2f '/'\n    */\n    0x06,           /* 00000110 */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x60,           /* 01100000 */\n    0xc0,           /* 11000000 */\n    0x80,           /* 10000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 48 0x30 '0'\n    */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0xd6,           /* 11010110 */\n    0xc6,           /* 11000110 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 49 0x31 '1'\n    */\n    0x18,           /* 00011000 */\n    0x38,           /* 00111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 50 0x32 '2'\n    */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0x06,           /* 00000110 */\n    0x1c,           /* 00011100 */\n    0x30,           /* 00110000 */\n    0x66,           /* 01100110 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 51 0x33 '3'\n    */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0x06,           /* 00000110 */\n    0x3c,           /* 00111100 */\n    0x06,           /* 00000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 52 0x34 '4'\n    */\n    0x1c,           /* 00011100 */\n    0x3c,           /* 00111100 */\n    0x6c,           /* 01101100 */\n    0xcc,           /* 11001100 */\n    0xfe,           /* 11111110 */\n    0x0c,           /* 00001100 */\n    0x1e,           /* 00011110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 53 0x35 '5'\n    */\n    0xfe,           /* 11111110 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0xfc,           /* 11111100 */\n    0x06,           /* 00000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 54 0x36 '6'\n    */\n    0x38,           /* 00111000 */\n    0x60,           /* 01100000 */\n    0xc0,           /* 11000000 */\n    0xfc,           /* 11111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 55 0x37 '7'\n    */\n    0xfe,           /* 11111110 */\n    0xc6,           /* 11000110 */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 56 0x38 '8'\n    */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 57 0x39 '9'\n    */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7e,           /* 01111110 */\n    0x06,           /* 00000110 */\n    0x0c,           /* 00001100 */\n    0x78,           /* 01111000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 58 0x3a ':'\n    */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 59 0x3b ';'\n    */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n\n    /*\n    * 60 0x3c '<'\n    */\n    0x06,           /* 00000110 */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x06,           /* 00000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 61 0x3d '='\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 62 0x3e '>'\n    */\n    0x60,           /* 01100000 */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x60,           /* 01100000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 63 0x3f '?'\n    */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 64 0x40 '@'\n    */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xde,           /* 11011110 */\n    0xde,           /* 11011110 */\n    0xde,           /* 11011110 */\n    0xc0,           /* 11000000 */\n    0x78,           /* 01111000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 65 0x41 'A'\n    */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 66 0x42 'B'\n    */\n    0xfc,           /* 11111100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x7c,           /* 01111100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0xfc,           /* 11111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 67 0x43 'C'\n    */\n    0x3c,           /* 00111100 */\n    0x66,           /* 01100110 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 68 0x44 'D'\n    */\n    0xf8,           /* 11111000 */\n    0x6c,           /* 01101100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x6c,           /* 01101100 */\n    0xf8,           /* 11111000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 69 0x45 'E'\n    */\n    0xfe,           /* 11111110 */\n    0x62,           /* 01100010 */\n    0x68,           /* 01101000 */\n    0x78,           /* 01111000 */\n    0x68,           /* 01101000 */\n    0x62,           /* 01100010 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 70 0x46 'F'\n    */\n    0xfe,           /* 11111110 */\n    0x62,           /* 01100010 */\n    0x68,           /* 01101000 */\n    0x78,           /* 01111000 */\n    0x68,           /* 01101000 */\n    0x60,           /* 01100000 */\n    0xf0,           /* 11110000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 71 0x47 'G'\n    */\n    0x3c,           /* 00111100 */\n    0x66,           /* 01100110 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0xce,           /* 11001110 */\n    0x66,           /* 01100110 */\n    0x3a,           /* 00111010 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 72 0x48 'H'\n    */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 73 0x49 'I'\n    */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 74 0x4a 'J'\n    */\n    0x1e,           /* 00011110 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x78,           /* 01111000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 75 0x4b 'K'\n    */\n    0xe6,           /* 11100110 */\n    0x66,           /* 01100110 */\n    0x6c,           /* 01101100 */\n    0x78,           /* 01111000 */\n    0x6c,           /* 01101100 */\n    0x66,           /* 01100110 */\n    0xe6,           /* 11100110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 76 0x4c 'L'\n    */\n    0xf0,           /* 11110000 */\n    0x60,           /* 01100000 */\n    0x60,           /* 01100000 */\n    0x60,           /* 01100000 */\n    0x62,           /* 01100010 */\n    0x66,           /* 01100110 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 77 0x4d 'M'\n    */\n    0xc6,           /* 11000110 */\n    0xee,           /* 11101110 */\n    0xfe,           /* 11111110 */\n    0xfe,           /* 11111110 */\n    0xd6,           /* 11010110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 78 0x4e 'N'\n    */\n    0xc6,           /* 11000110 */\n    0xe6,           /* 11100110 */\n    0xf6,           /* 11110110 */\n    0xde,           /* 11011110 */\n    0xce,           /* 11001110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 79 0x4f 'O'\n    */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 80 0x50 'P'\n    */\n    0xfc,           /* 11111100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x7c,           /* 01111100 */\n    0x60,           /* 01100000 */\n    0x60,           /* 01100000 */\n    0xf0,           /* 11110000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 81 0x51 'Q'\n    */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xce,           /* 11001110 */\n    0x7c,           /* 01111100 */\n    0x0e,           /* 00001110 */\n\n    /*\n    * 82 0x52 'R'\n    */\n    0xfc,           /* 11111100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x7c,           /* 01111100 */\n    0x6c,           /* 01101100 */\n    0x66,           /* 01100110 */\n    0xe6,           /* 11100110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 83 0x53 'S'\n    */\n    0x3c,           /* 00111100 */\n    0x66,           /* 01100110 */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 84 0x54 'T'\n    */\n    0x7e,           /* 01111110 */\n    0x7e,           /* 01111110 */\n    0x5a,           /* 01011010 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 85 0x55 'U'\n    */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 86 0x56 'V'\n    */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 87 0x57 'W'\n    */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xd6,           /* 11010110 */\n    0xd6,           /* 11010110 */\n    0xfe,           /* 11111110 */\n    0x6c,           /* 01101100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 88 0x58 'X'\n    */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 89 0x59 'Y'\n    */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 90 0x5a 'Z'\n    */\n    0xfe,           /* 11111110 */\n    0xc6,           /* 11000110 */\n    0x8c,           /* 10001100 */\n    0x18,           /* 00011000 */\n    0x32,           /* 00110010 */\n    0x66,           /* 01100110 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 91 0x5b '['\n    */\n    0x3c,           /* 00111100 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 92 0x5c '\\'\n    */\n    0xc0,           /* 11000000 */\n    0x60,           /* 01100000 */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x06,           /* 00000110 */\n    0x02,           /* 00000010 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 93 0x5d ']'\n    */\n    0x3c,           /* 00111100 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 94 0x5e '^'\n    */\n    0x10,           /* 00010000 */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 95 0x5f '_'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n\n    /*\n    * 96 0x60 '`'\n    */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 97 0x61 'a'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x78,           /* 01111000 */\n    0x0c,           /* 00001100 */\n    0x7c,           /* 01111100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 98 0x62 'b'\n    */\n    0xe0,           /* 11100000 */\n    0x60,           /* 01100000 */\n    0x7c,           /* 01111100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0xdc,           /* 11011100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 99 0x63 'c'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc0,           /* 11000000 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 100 0x64 'd'\n    */\n    0x1c,           /* 00011100 */\n    0x0c,           /* 00001100 */\n    0x7c,           /* 01111100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 101 0x65 'e'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc0,           /* 11000000 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 102 0x66 'f'\n    */\n    0x3c,           /* 00111100 */\n    0x66,           /* 01100110 */\n    0x60,           /* 01100000 */\n    0xf8,           /* 11111000 */\n    0x60,           /* 01100000 */\n    0x60,           /* 01100000 */\n    0xf0,           /* 11110000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 103 0x67 'g'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x76,           /* 01110110 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x7c,           /* 01111100 */\n    0x0c,           /* 00001100 */\n    0xf8,           /* 11111000 */\n\n    /*\n    * 104 0x68 'h'\n    */\n    0xe0,           /* 11100000 */\n    0x60,           /* 01100000 */\n    0x6c,           /* 01101100 */\n    0x76,           /* 01110110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0xe6,           /* 11100110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 105 0x69 'i'\n    */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x38,           /* 00111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 106 0x6a 'j'\n    */\n    0x06,           /* 00000110 */\n    0x00,           /* 00000000 */\n    0x06,           /* 00000110 */\n    0x06,           /* 00000110 */\n    0x06,           /* 00000110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n\n    /*\n    * 107 0x6b 'k'\n    */\n    0xe0,           /* 11100000 */\n    0x60,           /* 01100000 */\n    0x66,           /* 01100110 */\n    0x6c,           /* 01101100 */\n    0x78,           /* 01111000 */\n    0x6c,           /* 01101100 */\n    0xe6,           /* 11100110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 108 0x6c 'l'\n    */\n    0x38,           /* 00111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 109 0x6d 'm'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xec,           /* 11101100 */\n    0xfe,           /* 11111110 */\n    0xd6,           /* 11010110 */\n    0xd6,           /* 11010110 */\n    0xd6,           /* 11010110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 110 0x6e 'n'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xdc,           /* 11011100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 111 0x6f 'o'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 112 0x70 'p'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xdc,           /* 11011100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x7c,           /* 01111100 */\n    0x60,           /* 01100000 */\n    0xf0,           /* 11110000 */\n\n    /*\n    * 113 0x71 'q'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x76,           /* 01110110 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x7c,           /* 01111100 */\n    0x0c,           /* 00001100 */\n    0x1e,           /* 00011110 */\n\n    /*\n    * 114 0x72 'r'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xdc,           /* 11011100 */\n    0x76,           /* 01110110 */\n    0x60,           /* 01100000 */\n    0x60,           /* 01100000 */\n    0xf0,           /* 11110000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 115 0x73 's'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0xc0,           /* 11000000 */\n    0x7c,           /* 01111100 */\n    0x06,           /* 00000110 */\n    0xfc,           /* 11111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 116 0x74 't'\n    */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0xfc,           /* 11111100 */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x36,           /* 00110110 */\n    0x1c,           /* 00011100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 117 0x75 'u'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 118 0x76 'v'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 119 0x77 'w'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xc6,           /* 11000110 */\n    0xd6,           /* 11010110 */\n    0xd6,           /* 11010110 */\n    0xfe,           /* 11111110 */\n    0x6c,           /* 01101100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 120 0x78 'x'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xc6,           /* 11000110 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 121 0x79 'y'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7e,           /* 01111110 */\n    0x06,           /* 00000110 */\n    0xfc,           /* 11111100 */\n\n    /*\n    * 122 0x7a 'z'\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x4c,           /* 01001100 */\n    0x18,           /* 00011000 */\n    0x32,           /* 00110010 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 123 0x7b '{'\n    */\n    0x0e,           /* 00001110 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x70,           /* 01110000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x0e,           /* 00001110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 124 0x7c '|'\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 125 0x7d '}'\n    */\n    0x70,           /* 01110000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x0e,           /* 00001110 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x70,           /* 01110000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 126 0x7e '~'\n    */\n    0x76,           /* 01110110 */\n    0xdc,           /* 11011100 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 127 0x7f ''\n    */\n    0x00,           /* 00000000 */\n    0x10,           /* 00010000 */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 128 0x80 ''\n    */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x0c,           /* 00001100 */\n    0x78,           /* 01111000 */\n\n    /*\n    * 129 0x81 ''\n    */\n    0xcc,           /* 11001100 */\n    0x00,           /* 00000000 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 130 0x82 ''\n    */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc0,           /* 11000000 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 131 0x83 ''\n    */\n    0x7c,           /* 01111100 */\n    0x82,           /* 10000010 */\n    0x78,           /* 01111000 */\n    0x0c,           /* 00001100 */\n    0x7c,           /* 01111100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 132 0x84 ''\n    */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n    0x78,           /* 01111000 */\n    0x0c,           /* 00001100 */\n    0x7c,           /* 01111100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 133 0x85 ''\n    */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x78,           /* 01111000 */\n    0x0c,           /* 00001100 */\n    0x7c,           /* 01111100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 134 0x86 ''\n    */\n    0x30,           /* 00110000 */\n    0x30,           /* 00110000 */\n    0x78,           /* 01111000 */\n    0x0c,           /* 00001100 */\n    0x7c,           /* 01111100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 135 0x87 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0x7e,           /* 01111110 */\n    0x0c,           /* 00001100 */\n    0x38,           /* 00111000 */\n\n    /*\n    * 136 0x88 ''\n    */\n    0x7c,           /* 01111100 */\n    0x82,           /* 10000010 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc0,           /* 11000000 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 137 0x89 ''\n    */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc0,           /* 11000000 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 138 0x8a ''\n    */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc0,           /* 11000000 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 139 0x8b ''\n    */\n    0x66,           /* 01100110 */\n    0x00,           /* 00000000 */\n    0x38,           /* 00111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 140 0x8c ''\n    */\n    0x7c,           /* 01111100 */\n    0x82,           /* 10000010 */\n    0x38,           /* 00111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 141 0x8d ''\n    */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x38,           /* 00111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 142 0x8e ''\n    */\n    0xc6,           /* 11000110 */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 143 0x8f ''\n    */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 144 0x90 ''\n    */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0xfe,           /* 11111110 */\n    0xc0,           /* 11000000 */\n    0xf8,           /* 11111000 */\n    0xc0,           /* 11000000 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 145 0x91 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0xd8,           /* 11011000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 146 0x92 ''\n    */\n    0x3e,           /* 00111110 */\n    0x6c,           /* 01101100 */\n    0xcc,           /* 11001100 */\n    0xfe,           /* 11111110 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xce,           /* 11001110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 147 0x93 ''\n    */\n    0x7c,           /* 01111100 */\n    0x82,           /* 10000010 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 148 0x94 ''\n    */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 149 0x95 ''\n    */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 150 0x96 ''\n    */\n    0x78,           /* 01111000 */\n    0x84,           /* 10000100 */\n    0x00,           /* 00000000 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 151 0x97 ''\n    */\n    0x60,           /* 01100000 */\n    0x30,           /* 00110000 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 152 0x98 ''\n    */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7e,           /* 01111110 */\n    0x06,           /* 00000110 */\n    0xfc,           /* 11111100 */\n\n    /*\n    * 153 0x99 ''\n    */\n    0xc6,           /* 11000110 */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 154 0x9a ''\n    */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 155 0x9b ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 156 0x9c ''\n    */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0x64,           /* 01100100 */\n    0xf0,           /* 11110000 */\n    0x60,           /* 01100000 */\n    0x66,           /* 01100110 */\n    0xfc,           /* 11111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 157 0x9d ''\n    */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 158 0x9e ''\n    */\n    0xf8,           /* 11111000 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xfa,           /* 11111010 */\n    0xc6,           /* 11000110 */\n    0xcf,           /* 11001111 */\n    0xc6,           /* 11000110 */\n    0xc7,           /* 11000111 */\n\n    /*\n    * 159 0x9f ''\n    */\n    0x0e,           /* 00001110 */\n    0x1b,           /* 00011011 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0xd8,           /* 11011000 */\n    0x70,           /* 01110000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 160 0xa0 ''\n    */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x78,           /* 01111000 */\n    0x0c,           /* 00001100 */\n    0x7c,           /* 01111100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 161 0xa1 ''\n    */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x38,           /* 00111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 162 0xa2 ''\n    */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 163 0xa3 ''\n    */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 164 0xa4 ''\n    */\n    0x76,           /* 01110110 */\n    0xdc,           /* 11011100 */\n    0x00,           /* 00000000 */\n    0xdc,           /* 11011100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 165 0xa5 ''\n    */\n    0x76,           /* 01110110 */\n    0xdc,           /* 11011100 */\n    0x00,           /* 00000000 */\n    0xe6,           /* 11100110 */\n    0xf6,           /* 11110110 */\n    0xde,           /* 11011110 */\n    0xce,           /* 11001110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 166 0xa6 ''\n    */\n    0x3c,           /* 00111100 */\n    0x6c,           /* 01101100 */\n    0x6c,           /* 01101100 */\n    0x3e,           /* 00111110 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 167 0xa7 ''\n    */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x00,           /* 00000000 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 168 0xa8 ''\n    */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x63,           /* 01100011 */\n    0x3e,           /* 00111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 169 0xa9 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xfe,           /* 11111110 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 170 0xaa ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xfe,           /* 11111110 */\n    0x06,           /* 00000110 */\n    0x06,           /* 00000110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 171 0xab ''\n    */\n    0x63,           /* 01100011 */\n    0xe6,           /* 11100110 */\n    0x6c,           /* 01101100 */\n    0x7e,           /* 01111110 */\n    0x33,           /* 00110011 */\n    0x66,           /* 01100110 */\n    0xcc,           /* 11001100 */\n    0x0f,           /* 00001111 */\n\n    /*\n    * 172 0xac ''\n    */\n    0x63,           /* 01100011 */\n    0xe6,           /* 11100110 */\n    0x6c,           /* 01101100 */\n    0x7a,           /* 01111010 */\n    0x36,           /* 00110110 */\n    0x6a,           /* 01101010 */\n    0xdf,           /* 11011111 */\n    0x06,           /* 00000110 */\n\n    /*\n    * 173 0xad ''\n    */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 174 0xae ''\n    */\n    0x00,           /* 00000000 */\n    0x33,           /* 00110011 */\n    0x66,           /* 01100110 */\n    0xcc,           /* 11001100 */\n    0x66,           /* 01100110 */\n    0x33,           /* 00110011 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 175 0xaf ''\n    */\n    0x00,           /* 00000000 */\n    0xcc,           /* 11001100 */\n    0x66,           /* 01100110 */\n    0x33,           /* 00110011 */\n    0x66,           /* 01100110 */\n    0xcc,           /* 11001100 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 176 0xb0 ''\n    */\n    0x22,           /* 00100010 */\n    0x88,           /* 10001000 */\n    0x22,           /* 00100010 */\n    0x88,           /* 10001000 */\n    0x22,           /* 00100010 */\n    0x88,           /* 10001000 */\n    0x22,           /* 00100010 */\n    0x88,           /* 10001000 */\n\n    /*\n    * 177 0xb1 ''\n    */\n    0x55,           /* 01010101 */\n    0xaa,           /* 10101010 */\n    0x55,           /* 01010101 */\n    0xaa,           /* 10101010 */\n    0x55,           /* 01010101 */\n    0xaa,           /* 10101010 */\n    0x55,           /* 01010101 */\n    0xaa,           /* 10101010 */\n\n    /*\n    * 178 0xb2 ''\n    */\n    0x77,           /* 01110111 */\n    0xdd,           /* 11011101 */\n    0x77,           /* 01110111 */\n    0xdd,           /* 11011101 */\n    0x77,           /* 01110111 */\n    0xdd,           /* 11011101 */\n    0x77,           /* 01110111 */\n    0xdd,           /* 11011101 */\n\n    /*\n    * 179 0xb3 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 180 0xb4 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0xf8,           /* 11111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 181 0xb5 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0xf8,           /* 11111000 */\n    0x18,           /* 00011000 */\n    0xf8,           /* 11111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 182 0xb6 ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0xf6,           /* 11110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 183 0xb7 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xfe,           /* 11111110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 184 0xb8 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xf8,           /* 11111000 */\n    0x18,           /* 00011000 */\n    0xf8,           /* 11111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 185 0xb9 ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0xf6,           /* 11110110 */\n    0x06,           /* 00000110 */\n    0xf6,           /* 11110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 186 0xba ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 187 0xbb ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xfe,           /* 11111110 */\n    0x06,           /* 00000110 */\n    0xf6,           /* 11110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 188 0xbc ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0xf6,           /* 11110110 */\n    0x06,           /* 00000110 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 189 0xbd ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 190 0xbe ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0xf8,           /* 11111000 */\n    0x18,           /* 00011000 */\n    0xf8,           /* 11111000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 191 0xbf ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xf8,           /* 11111000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 192 0xc0 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x1f,           /* 00011111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 193 0xc1 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 194 0xc2 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 195 0xc3 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x1f,           /* 00011111 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 196 0xc4 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 197 0xc5 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0xff,           /* 11111111 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 198 0xc6 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x1f,           /* 00011111 */\n    0x18,           /* 00011000 */\n    0x1f,           /* 00011111 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 199 0xc7 ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x37,           /* 00110111 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 200 0xc8 ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x37,           /* 00110111 */\n    0x30,           /* 00110000 */\n    0x3f,           /* 00111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 201 0xc9 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x3f,           /* 00111111 */\n    0x30,           /* 00110000 */\n    0x37,           /* 00110111 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 202 0xca ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0xf7,           /* 11110111 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 203 0xcb ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0xf7,           /* 11110111 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 204 0xcc ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x37,           /* 00110111 */\n    0x30,           /* 00110000 */\n    0x37,           /* 00110111 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 205 0xcd ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 206 0xce ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0xf7,           /* 11110111 */\n    0x00,           /* 00000000 */\n    0xf7,           /* 11110111 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 207 0xcf ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 208 0xd0 ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 209 0xd1 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 210 0xd2 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 211 0xd3 ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x3f,           /* 00111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 212 0xd4 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x1f,           /* 00011111 */\n    0x18,           /* 00011000 */\n    0x1f,           /* 00011111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 213 0xd5 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x1f,           /* 00011111 */\n    0x18,           /* 00011000 */\n    0x1f,           /* 00011111 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 214 0xd6 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x3f,           /* 00111111 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 215 0xd7 ''\n    */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0xff,           /* 11111111 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n\n    /*\n    * 216 0xd8 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0xff,           /* 11111111 */\n    0x18,           /* 00011000 */\n    0xff,           /* 11111111 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 217 0xd9 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0xf8,           /* 11111000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 218 0xda ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x1f,           /* 00011111 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 219 0xdb ''\n    */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n\n    /*\n    * 220 0xdc ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n\n    /*\n    * 221 0xdd ''\n    */\n    0xf0,           /* 11110000 */\n    0xf0,           /* 11110000 */\n    0xf0,           /* 11110000 */\n    0xf0,           /* 11110000 */\n    0xf0,           /* 11110000 */\n    0xf0,           /* 11110000 */\n    0xf0,           /* 11110000 */\n    0xf0,           /* 11110000 */\n\n    /*\n    * 222 0xde ''\n    */\n    0x0f,           /* 00001111 */\n    0x0f,           /* 00001111 */\n    0x0f,           /* 00001111 */\n    0x0f,           /* 00001111 */\n    0x0f,           /* 00001111 */\n    0x0f,           /* 00001111 */\n    0x0f,           /* 00001111 */\n    0x0f,           /* 00001111 */\n\n    /*\n    * 223 0xdf ''\n    */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0xff,           /* 11111111 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 224 0xe0 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x76,           /* 01110110 */\n    0xdc,           /* 11011100 */\n    0xc8,           /* 11001000 */\n    0xdc,           /* 11011100 */\n    0x76,           /* 01110110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 225 0xe1 ''\n    */\n    0x78,           /* 01111000 */\n    0xcc,           /* 11001100 */\n    0xcc,           /* 11001100 */\n    0xd8,           /* 11011000 */\n    0xcc,           /* 11001100 */\n    0xc6,           /* 11000110 */\n    0xcc,           /* 11001100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 226 0xe2 ''\n    */\n    0xfe,           /* 11111110 */\n    0xc6,           /* 11000110 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0xc0,           /* 11000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 227 0xe3 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0xfe,           /* 11111110 */\n    0x6c,           /* 01101100 */\n    0x6c,           /* 01101100 */\n    0x6c,           /* 01101100 */\n    0x6c,           /* 01101100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 228 0xe4 ''\n    */\n    0xfe,           /* 11111110 */\n    0xc6,           /* 11000110 */\n    0x60,           /* 01100000 */\n    0x30,           /* 00110000 */\n    0x60,           /* 01100000 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 229 0xe5 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0xd8,           /* 11011000 */\n    0xd8,           /* 11011000 */\n    0xd8,           /* 11011000 */\n    0x70,           /* 01110000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 230 0xe6 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x7c,           /* 01111100 */\n    0xc0,           /* 11000000 */\n\n    /*\n    * 231 0xe7 ''\n    */\n    0x00,           /* 00000000 */\n    0x76,           /* 01110110 */\n    0xdc,           /* 11011100 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 232 0xe8 ''\n    */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x3c,           /* 00111100 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n\n    /*\n    * 233 0xe9 ''\n    */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0xfe,           /* 11111110 */\n    0xc6,           /* 11000110 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 234 0xea ''\n    */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x6c,           /* 01101100 */\n    0x6c,           /* 01101100 */\n    0xee,           /* 11101110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 235 0xeb ''\n    */\n    0x0e,           /* 00001110 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x3e,           /* 00111110 */\n    0x66,           /* 01100110 */\n    0x66,           /* 01100110 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 236 0xec ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0xdb,           /* 11011011 */\n    0xdb,           /* 11011011 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 237 0xed ''\n    */\n    0x06,           /* 00000110 */\n    0x0c,           /* 00001100 */\n    0x7e,           /* 01111110 */\n    0xdb,           /* 11011011 */\n    0xdb,           /* 11011011 */\n    0x7e,           /* 01111110 */\n    0x60,           /* 01100000 */\n    0xc0,           /* 11000000 */\n\n    /*\n    * 238 0xee ''\n    */\n    0x1e,           /* 00011110 */\n    0x30,           /* 00110000 */\n    0x60,           /* 01100000 */\n    0x7e,           /* 01111110 */\n    0x60,           /* 01100000 */\n    0x30,           /* 00110000 */\n    0x1e,           /* 00011110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 239 0xef ''\n    */\n    0x00,           /* 00000000 */\n    0x7c,           /* 01111100 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0xc6,           /* 11000110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 240 0xf0 ''\n    */\n    0x00,           /* 00000000 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n    0xfe,           /* 11111110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 241 0xf1 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x7e,           /* 01111110 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 242 0xf2 ''\n    */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 243 0xf3 ''\n    */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x18,           /* 00011000 */\n    0x0c,           /* 00001100 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 244 0xf4 ''\n    */\n    0x0e,           /* 00001110 */\n    0x1b,           /* 00011011 */\n    0x1b,           /* 00011011 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n\n    /*\n    * 245 0xf5 ''\n    */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0xd8,           /* 11011000 */\n    0xd8,           /* 11011000 */\n    0x70,           /* 01110000 */\n\n    /*\n    * 246 0xf6 ''\n    */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x7e,           /* 01111110 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 247 0xf7 ''\n    */\n    0x00,           /* 00000000 */\n    0x76,           /* 01110110 */\n    0xdc,           /* 11011100 */\n    0x00,           /* 00000000 */\n    0x76,           /* 01110110 */\n    0xdc,           /* 11011100 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 248 0xf8 ''\n    */\n    0x38,           /* 00111000 */\n    0x6c,           /* 01101100 */\n    0x6c,           /* 01101100 */\n    0x38,           /* 00111000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 249 0xf9 ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 250 0xfa ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x18,           /* 00011000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 251 0xfb ''\n    */\n    0x0f,           /* 00001111 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0x0c,           /* 00001100 */\n    0xec,           /* 11101100 */\n    0x6c,           /* 01101100 */\n    0x3c,           /* 00111100 */\n    0x1c,           /* 00011100 */\n\n    /*\n    * 252 0xfc ''\n    */\n    0x6c,           /* 01101100 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x36,           /* 00110110 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 253 0xfd ''\n    */\n    0x78,           /* 01111000 */\n    0x0c,           /* 00001100 */\n    0x18,           /* 00011000 */\n    0x30,           /* 00110000 */\n    0x7c,           /* 01111100 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 254 0xfe ''\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x3c,           /* 00111100 */\n    0x3c,           /* 00111100 */\n    0x3c,           /* 00111100 */\n    0x3c,           /* 00111100 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n    /*\n    * 255 0xff ' '\n    */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n    0x00,           /* 00000000 */\n\n};\n\n\n/* ---- Character */\n\n/*!\n\\brief Global cache for 8x8 pixel font textures created at runtime.\n*/\nstatic SDL_Texture *SDLTest_CharTextureCache[256];\n\nint SDLTest_DrawCharacter(SDL_Renderer *renderer, int x, int y, char c)\n{\n\tconst Uint32 charWidth = FONT_CHARACTER_SIZE;\n\tconst Uint32 charHeight = FONT_CHARACTER_SIZE;\n\tconst Uint32 charSize = FONT_CHARACTER_SIZE;\n    SDL_Rect srect;\n    SDL_Rect drect;\n    int result;\n    Uint32 ix, iy;\n    const unsigned char *charpos;\n    Uint8 *curpos;\n    Uint8 patt, mask;\n    Uint8 *linepos;\n    Uint32 pitch;\n    SDL_Surface *character;\n    Uint32 ci;\n    Uint8 r, g, b, a;\n\n    /*\n    * Setup source rectangle\n    */\n    srect.x = 0;\n    srect.y = 0;\n    srect.w = charWidth;\n    srect.h = charHeight;\n\n    /*\n    * Setup destination rectangle\n    */\n    drect.x = x;\n    drect.y = y;\n    drect.w = charWidth;\n    drect.h = charHeight;\n\n    /* Character index in cache */\n    ci = (unsigned char)c;\n\n    /*\n    * Create new charWidth x charHeight bitmap surface if not already present.\n    */\n    if (SDLTest_CharTextureCache[ci] == NULL) {\n        /*\n        * Redraw character into surface\n        */\n        character = SDL_CreateRGBSurface(SDL_SWSURFACE,\n            charWidth, charHeight, 32,\n            0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF);\n        if (character == NULL) {\n            return (-1);\n        }\n\n        charpos = SDLTest_FontData + ci * charSize;\n        linepos = (Uint8 *)character->pixels;\n        pitch = character->pitch;\n\n        /*\n        * Drawing loop\n        */\n        patt = 0;\n        for (iy = 0; iy < charWidth; iy++) {\n            mask = 0x00;\n            curpos = linepos;\n            for (ix = 0; ix < charWidth; ix++) {\n                if (!(mask >>= 1)) {\n                    patt = *charpos++;\n                    mask = 0x80;\n                }\n                if (patt & mask) {\n                    *(Uint32 *)curpos = 0xffffffff;\n                } else {\n                    *(Uint32 *)curpos = 0;\n                }\n                curpos += 4;\n            }\n            linepos += pitch;\n        }\n\n        /* Convert temp surface into texture */\n        SDLTest_CharTextureCache[ci] = SDL_CreateTextureFromSurface(renderer, character);\n        SDL_FreeSurface(character);\n\n        /*\n        * Check pointer\n        */\n        if (SDLTest_CharTextureCache[ci] == NULL) {\n            return (-1);\n        }\n    }\n\n    /*\n    * Set color\n    */\n    result = 0;\n    result |= SDL_GetRenderDrawColor(renderer, &r, &g, &b, &a);\n    result |= SDL_SetTextureColorMod(SDLTest_CharTextureCache[ci], r, g, b);\n    result |= SDL_SetTextureAlphaMod(SDLTest_CharTextureCache[ci], a);\n\n    /*\n    * Draw texture onto destination\n    */\n    result |= SDL_RenderCopy(renderer, SDLTest_CharTextureCache[ci], &srect, &drect);\n\n    return (result);\n}\n\nint SDLTest_DrawString(SDL_Renderer * renderer, int x, int y, const char *s)\n{\n\tconst Uint32 charWidth = FONT_CHARACTER_SIZE;\n    int result = 0;\n    int curx = x;\n    int cury = y;\n    const char *curchar = s;\n\n    while (*curchar && !result) {\n        result |= SDLTest_DrawCharacter(renderer, curx, cury, *curchar);\n        curx += charWidth;\n        curchar++;\n    }\n\n    return (result);\n}\n\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_fuzzer.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n\n  Data generators for fuzzing test data in a reproducible way.\n\n*/\n\n#include \"SDL_config.h\"\n\n/* Visual Studio 2008 doesn't have stdint.h */\n#if defined(_MSC_VER) && _MSC_VER <= 1500\n#define UINT8_MAX   ~(Uint8)0\n#define UINT16_MAX  ~(Uint16)0\n#define UINT32_MAX  ~(Uint32)0\n#define UINT64_MAX  ~(Uint64)0\n#else\n#define _GNU_SOURCE\n#include <stdint.h>\n#endif\n#include <stdio.h>\n#include <stdlib.h>\n#include <limits.h>\n#include <float.h>\n\n#include \"SDL_test.h\"\n\n/**\n * Counter for fuzzer invocations\n */\nstatic int fuzzerInvocationCounter = 0;\n\n/**\n * Context for shared random number generator\n */\nstatic SDLTest_RandomContext rndContext;\n\n/*\n * Note: doxygen documentation markup for functions is in the header file.\n */\n\nvoid\nSDLTest_FuzzerInit(Uint64 execKey)\n{\n    Uint32 a = (execKey >> 32) & 0x00000000FFFFFFFF;\n    Uint32 b = execKey & 0x00000000FFFFFFFF;\n    SDL_memset((void *)&rndContext, 0, sizeof(SDLTest_RandomContext));\n    SDLTest_RandomInit(&rndContext, a, b);\n    fuzzerInvocationCounter = 0;\n}\n\nint\nSDLTest_GetFuzzerInvocationCount()\n{\n    return fuzzerInvocationCounter;\n}\n\nUint8\nSDLTest_RandomUint8()\n{\n    fuzzerInvocationCounter++;\n\n    return (Uint8) SDLTest_RandomInt(&rndContext) & 0x000000FF;\n}\n\nSint8\nSDLTest_RandomSint8()\n{\n    fuzzerInvocationCounter++;\n\n    return (Sint8) SDLTest_RandomInt(&rndContext) & 0x000000FF;\n}\n\nUint16\nSDLTest_RandomUint16()\n{\n    fuzzerInvocationCounter++;\n\n    return (Uint16) SDLTest_RandomInt(&rndContext) & 0x0000FFFF;\n}\n\nSint16\nSDLTest_RandomSint16()\n{\n    fuzzerInvocationCounter++;\n\n    return (Sint16) SDLTest_RandomInt(&rndContext) & 0x0000FFFF;\n}\n\nSint32\nSDLTest_RandomSint32()\n{\n    fuzzerInvocationCounter++;\n\n    return (Sint32) SDLTest_RandomInt(&rndContext);\n}\n\nUint32\nSDLTest_RandomUint32()\n{\n    fuzzerInvocationCounter++;\n\n    return (Uint32) SDLTest_RandomInt(&rndContext);\n}\n\nUint64\nSDLTest_RandomUint64()\n{\n    Uint64 value = 0;\n    Uint32 *vp = (void *)&value;\n\n    fuzzerInvocationCounter++;\n\n    vp[0] = SDLTest_RandomSint32();\n    vp[1] = SDLTest_RandomSint32();\n\n    return value;\n}\n\nSint64\nSDLTest_RandomSint64()\n{\n    Uint64 value = 0;\n    Uint32 *vp = (void *)&value;\n\n    fuzzerInvocationCounter++;\n\n    vp[0] = SDLTest_RandomSint32();\n    vp[1] = SDLTest_RandomSint32();\n\n    return value;\n}\n\n\n\nSint32\nSDLTest_RandomIntegerInRange(Sint32 pMin, Sint32 pMax)\n{\n    Sint64 min = pMin;\n    Sint64 max = pMax;\n    Sint64 temp;\n    Sint64 number;\n\n    if(pMin > pMax) {\n        temp = min;\n        min = max;\n        max = temp;\n    } else if(pMin == pMax) {\n        return (Sint32)min;\n    }\n\n    number = SDLTest_RandomUint32();\n    /* invocation count increment in preceeding call */\n\n    return (Sint32)((number % ((max + 1) - min)) + min);\n}\n\n/* !\n * Generates a unsigned boundary value between the given boundaries.\n * Boundary values are inclusive. See the examples below.\n * If boundary2 < boundary1, the values are swapped.\n * If boundary1 == boundary2, value of boundary1 will be returned\n *\n * Generating boundary values for Uint8:\n * BoundaryValues(UINT8_MAX, 10, 20, True) -> [10,11,19,20]\n * BoundaryValues(UINT8_MAX, 10, 20, False) -> [9,21]\n * BoundaryValues(UINT8_MAX, 0, 15, True) -> [0, 1, 14, 15]\n * BoundaryValues(UINT8_MAX, 0, 15, False) -> [16]\n * BoundaryValues(UINT8_MAX, 0, 0xFF, False) -> [0], error set\n *\n * Generator works the same for other types of unsigned integers.\n *\n * \\param maxValue The biggest value that is acceptable for this data type.\n *                  For instance, for Uint8 -> 255, Uint16 -> 65536 etc.\n * \\param boundary1 defines lower boundary\n * \\param boundary2 defines upper boundary\n * \\param validDomain Generate only for valid domain (for the data type)\n *\n * \\returns Returns a random boundary value for the domain or 0 in case of error\n */\nUint64\nSDLTest_GenerateUnsignedBoundaryValues(const Uint64 maxValue, Uint64 boundary1, Uint64 boundary2, SDL_bool validDomain)\n{\n        Uint64 b1, b2;\n    Uint64 delta;\n    Uint64 tempBuf[4];\n    Uint8 index;\n\n        /* Maybe swap */\n    if (boundary1 > boundary2) {\n        b1 = boundary2;\n        b2 = boundary1;\n    } else {\n        b1 = boundary1;\n        b2 = boundary2;\n        }\n\n    index = 0;\n    if (validDomain == SDL_TRUE) {\n            if (b1 == b2) {\n                return b1;\n            }\n\n            /* Generate up to 4 values within bounds */\n            delta = b2 - b1;\n            if (delta < 4) {\n                do {\n                tempBuf[index] = b1 + index;\n                index++;\n                    } while (index < delta);\n            } else {\n          tempBuf[index] = b1;\n          index++;\n          tempBuf[index] = b1 + 1;\n          index++;\n          tempBuf[index] = b2 - 1;\n          index++;\n          tempBuf[index] = b2;\n          index++;\n            }\n        } else {\n            /* Generate up to 2 values outside of bounds */\n        if (b1 > 0) {\n            tempBuf[index] = b1 - 1;\n            index++;\n        }\n\n        if (b2 < maxValue) {\n            tempBuf[index] = b2 + 1;\n            index++;\n        }\n    }\n\n    if (index == 0) {\n        /* There are no valid boundaries */\n        SDL_Unsupported();\n        return 0;\n    }\n\n    return tempBuf[SDLTest_RandomUint8() % index];\n}\n\n\nUint8\nSDLTest_RandomUint8BoundaryValue(Uint8 boundary1, Uint8 boundary2, SDL_bool validDomain)\n{\n    /* max value for Uint8 */\n    const Uint64 maxValue = UCHAR_MAX;\n    return (Uint8)SDLTest_GenerateUnsignedBoundaryValues(maxValue,\n                (Uint64) boundary1, (Uint64) boundary2,\n                validDomain);\n}\n\nUint16\nSDLTest_RandomUint16BoundaryValue(Uint16 boundary1, Uint16 boundary2, SDL_bool validDomain)\n{\n    /* max value for Uint16 */\n    const Uint64 maxValue = USHRT_MAX;\n    return (Uint16)SDLTest_GenerateUnsignedBoundaryValues(maxValue,\n                (Uint64) boundary1, (Uint64) boundary2,\n                validDomain);\n}\n\nUint32\nSDLTest_RandomUint32BoundaryValue(Uint32 boundary1, Uint32 boundary2, SDL_bool validDomain)\n{\n    /* max value for Uint32 */\n    #if ((ULONG_MAX) == (UINT_MAX))\n      const Uint64 maxValue = ULONG_MAX;\n        #else\n      const Uint64 maxValue = UINT_MAX;\n        #endif\n    return (Uint32)SDLTest_GenerateUnsignedBoundaryValues(maxValue,\n                (Uint64) boundary1, (Uint64) boundary2,\n                validDomain);\n}\n\nUint64\nSDLTest_RandomUint64BoundaryValue(Uint64 boundary1, Uint64 boundary2, SDL_bool validDomain)\n{\n    /* max value for Uint64 */\n    const Uint64 maxValue = ULLONG_MAX;\n    return SDLTest_GenerateUnsignedBoundaryValues(maxValue,\n                (Uint64) boundary1, (Uint64) boundary2,\n                validDomain);\n}\n\n/* !\n * Generates a signed boundary value between the given boundaries.\n * Boundary values are inclusive. See the examples below.\n * If boundary2 < boundary1, the values are swapped.\n * If boundary1 == boundary2, value of boundary1 will be returned\n *\n * Generating boundary values for Sint8:\n * SignedBoundaryValues(SCHAR_MIN, SCHAR_MAX, -10, 20, True) -> [-10,-9,19,20]\n * SignedBoundaryValues(SCHAR_MIN, SCHAR_MAX, -10, 20, False) -> [-11,21]\n * SignedBoundaryValues(SCHAR_MIN, SCHAR_MAX, -30, -15, True) -> [-30, -29, -16, -15]\n * SignedBoundaryValues(SCHAR_MIN, SCHAR_MAX, -127, 15, False) -> [16]\n * SignedBoundaryValues(SCHAR_MIN, SCHAR_MAX, -127, 127, False) -> [0], error set\n *\n * Generator works the same for other types of signed integers.\n *\n * \\param minValue The smallest value that is acceptable for this data type.\n *                  For instance, for Uint8 -> -127, etc.\n * \\param maxValue The biggest value that is acceptable for this data type.\n *                  For instance, for Uint8 -> 127, etc.\n * \\param boundary1 defines lower boundary\n * \\param boundary2 defines upper boundary\n * \\param validDomain Generate only for valid domain (for the data type)\n *\n * \\returns Returns a random boundary value for the domain or 0 in case of error\n */\nSint64\nSDLTest_GenerateSignedBoundaryValues(const Sint64 minValue, const Sint64 maxValue, Sint64 boundary1, Sint64 boundary2, SDL_bool validDomain)\n{\n        Sint64 b1, b2;\n    Sint64 delta;\n    Sint64 tempBuf[4];\n    Uint8 index;\n\n        /* Maybe swap */\n    if (boundary1 > boundary2) {\n        b1 = boundary2;\n        b2 = boundary1;\n    } else {\n        b1 = boundary1;\n        b2 = boundary2;\n        }\n\n    index = 0;\n    if (validDomain == SDL_TRUE) {\n            if (b1 == b2) {\n                return b1;\n            }\n\n            /* Generate up to 4 values within bounds */\n            delta = b2 - b1;\n            if (delta < 4) {\n                do {\n                tempBuf[index] = b1 + index;\n                index++;\n                    } while (index < delta);\n            } else {\n          tempBuf[index] = b1;\n          index++;\n          tempBuf[index] = b1 + 1;\n          index++;\n          tempBuf[index] = b2 - 1;\n          index++;\n          tempBuf[index] = b2;\n          index++;\n            }\n        } else {\n            /* Generate up to 2 values outside of bounds */\n        if (b1 > minValue) {\n            tempBuf[index] = b1 - 1;\n            index++;\n        }\n\n        if (b2 < maxValue) {\n            tempBuf[index] = b2 + 1;\n            index++;\n        }\n    }\n\n    if (index == 0) {\n        /* There are no valid boundaries */\n        SDL_Unsupported();\n        return minValue;\n    }\n\n    return tempBuf[SDLTest_RandomUint8() % index];\n}\n\n\nSint8\nSDLTest_RandomSint8BoundaryValue(Sint8 boundary1, Sint8 boundary2, SDL_bool validDomain)\n{\n    /* min & max values for Sint8 */\n    const Sint64 maxValue = SCHAR_MAX;\n    const Sint64 minValue = SCHAR_MIN;\n    return (Sint8)SDLTest_GenerateSignedBoundaryValues(minValue, maxValue,\n                (Sint64) boundary1, (Sint64) boundary2,\n                validDomain);\n}\n\nSint16\nSDLTest_RandomSint16BoundaryValue(Sint16 boundary1, Sint16 boundary2, SDL_bool validDomain)\n{\n    /* min & max values for Sint16 */\n    const Sint64 maxValue = SHRT_MAX;\n    const Sint64 minValue = SHRT_MIN;\n    return (Sint16)SDLTest_GenerateSignedBoundaryValues(minValue, maxValue,\n                (Sint64) boundary1, (Sint64) boundary2,\n                validDomain);\n}\n\nSint32\nSDLTest_RandomSint32BoundaryValue(Sint32 boundary1, Sint32 boundary2, SDL_bool validDomain)\n{\n    /* min & max values for Sint32 */\n    #if ((ULONG_MAX) == (UINT_MAX))\n      const Sint64 maxValue = LONG_MAX;\n      const Sint64 minValue = LONG_MIN;\n        #else\n      const Sint64 maxValue = INT_MAX;\n      const Sint64 minValue = INT_MIN;\n        #endif\n    return (Sint32)SDLTest_GenerateSignedBoundaryValues(minValue, maxValue,\n                (Sint64) boundary1, (Sint64) boundary2,\n                validDomain);\n}\n\nSint64\nSDLTest_RandomSint64BoundaryValue(Sint64 boundary1, Sint64 boundary2, SDL_bool validDomain)\n{\n    /* min & max values for Sint64 */\n    const Sint64 maxValue = LLONG_MAX;\n    const Sint64 minValue = LLONG_MIN;\n    return SDLTest_GenerateSignedBoundaryValues(minValue, maxValue,\n                boundary1, boundary2,\n                validDomain);\n}\n\nfloat\nSDLTest_RandomUnitFloat()\n{\n    return (float) SDLTest_RandomUint32() / UINT_MAX;\n}\n\nfloat\nSDLTest_RandomFloat()\n{\n        return (float) (SDLTest_RandomUnitDouble() * (double)2.0 * (double)FLT_MAX - (double)(FLT_MAX));\n}\n\ndouble\nSDLTest_RandomUnitDouble()\n{\n    return (double) (SDLTest_RandomUint64() >> 11) * (1.0/9007199254740992.0);\n}\n\ndouble\nSDLTest_RandomDouble()\n{\n    double r = 0.0;\n    double s = 1.0;\n    do {\n      s /= UINT_MAX + 1.0;\n      r += (double)SDLTest_RandomInt(&rndContext) * s;\n    } while (s > DBL_EPSILON);\n\n    fuzzerInvocationCounter++;\n\n    return r;\n}\n\n\nchar *\nSDLTest_RandomAsciiString()\n{\n    return SDLTest_RandomAsciiStringWithMaximumLength(255);\n}\n\nchar *\nSDLTest_RandomAsciiStringWithMaximumLength(int maxLength)\n{\n    int size;\n\n    if(maxLength < 1) {\n                SDL_InvalidParamError(\"maxLength\");\n        return NULL;\n    }\n\n    size = (SDLTest_RandomUint32() % (maxLength + 1));\n\n    return SDLTest_RandomAsciiStringOfSize(size);\n}\n\nchar *\nSDLTest_RandomAsciiStringOfSize(int size)\n{\n    char *string;\n    int counter;\n\n\n    if(size < 1) {\n                SDL_InvalidParamError(\"size\");\n        return NULL;\n    }\n\n    string = (char *)SDL_malloc((size + 1) * sizeof(char));\n    if (string==NULL) {\n      return NULL;\n        }\n\n    for(counter = 0; counter < size; ++counter) {\n        string[counter] = (char)SDLTest_RandomIntegerInRange(32, 126);\n    }\n\n    string[counter] = '\\0';\n\n    fuzzerInvocationCounter++;\n\n    return string;\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_harness.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n\n/* Invalid test name/description message format */\n#define SDLTEST_INVALID_NAME_FORMAT \"(Invalid)\"\n\n/* Log summary message format */\n#define SDLTEST_LOG_SUMMARY_FORMAT \"%s Summary: Total=%d Passed=%d Failed=%d Skipped=%d\"\n\n/* Final result message format */\n#define SDLTEST_FINAL_RESULT_FORMAT \">>> %s '%s': %s\\n\"\n\n/* ! \\brief Timeout for single test case execution */\nstatic Uint32 SDLTest_TestCaseTimeout = 3600;\n\n/**\n* Generates a random run seed string for the harness. The generated seed\n* will contain alphanumeric characters (0-9A-Z).\n*\n* Note: The returned string needs to be deallocated by the caller.\n*\n* \\param length The length of the seed string to generate\n*\n* \\returns The generated seed string\n*/\nchar *\nSDLTest_GenerateRunSeed(const int length)\n{\n    char *seed = NULL;\n    SDLTest_RandomContext randomContext;\n    int counter;\n\n    /* Sanity check input */\n    if (length <= 0) {\n        SDLTest_LogError(\"The length of the harness seed must be >0.\");\n        return NULL;\n    }\n\n    /* Allocate output buffer */\n    seed = (char *)SDL_malloc((length + 1) * sizeof(char));\n    if (seed == NULL) {\n        SDLTest_LogError(\"SDL_malloc for run seed output buffer failed.\");\n        SDL_Error(SDL_ENOMEM);\n        return NULL;\n    }\n\n    /* Generate a random string of alphanumeric characters */\n    SDLTest_RandomInitTime(&randomContext);\n    for (counter = 0; counter < length; counter++) {\n        unsigned int number = SDLTest_Random(&randomContext);\n        char ch = (char) (number % (91 - 48)) + 48;\n        if (ch >= 58 && ch <= 64) {\n            ch = 65;\n        }\n        seed[counter] = ch;\n    }\n    seed[length] = '\\0';\n\n    return seed;\n}\n\n/**\n* Generates an execution key for the fuzzer.\n*\n* \\param runSeed        The run seed to use\n* \\param suiteName      The name of the test suite\n* \\param testName       The name of the test\n* \\param iteration      The iteration count\n*\n* \\returns The generated execution key to initialize the fuzzer with.\n*\n*/\nUint64\nSDLTest_GenerateExecKey(char *runSeed, char *suiteName, char *testName, int iteration)\n{\n    SDLTest_Md5Context md5Context;\n    Uint64 *keys;\n    char iterationString[16];\n    Uint32 runSeedLength;\n    Uint32 suiteNameLength;\n    Uint32 testNameLength;\n    Uint32 iterationStringLength;\n    Uint32 entireStringLength;\n    char *buffer;\n\n    if (runSeed == NULL || runSeed[0] == '\\0') {\n        SDLTest_LogError(\"Invalid runSeed string.\");\n        return -1;\n    }\n\n    if (suiteName == NULL || suiteName[0] == '\\0') {\n        SDLTest_LogError(\"Invalid suiteName string.\");\n        return -1;\n    }\n\n    if (testName == NULL || testName[0] == '\\0') {\n        SDLTest_LogError(\"Invalid testName string.\");\n        return -1;\n    }\n\n    if (iteration <= 0) {\n        SDLTest_LogError(\"Invalid iteration count.\");\n        return -1;\n    }\n\n    /* Convert iteration number into a string */\n    SDL_memset(iterationString, 0, sizeof(iterationString));\n    SDL_snprintf(iterationString, sizeof(iterationString) - 1, \"%d\", iteration);\n\n    /* Combine the parameters into single string */\n    runSeedLength = SDL_strlen(runSeed);\n    suiteNameLength = SDL_strlen(suiteName);\n    testNameLength = SDL_strlen(testName);\n    iterationStringLength = SDL_strlen(iterationString);\n    entireStringLength  = runSeedLength + suiteNameLength + testNameLength + iterationStringLength + 1;\n    buffer = (char *)SDL_malloc(entireStringLength);\n    if (buffer == NULL) {\n        SDLTest_LogError(\"Failed to allocate buffer for execKey generation.\");\n        SDL_Error(SDL_ENOMEM);\n        return 0;\n    }\n    SDL_snprintf(buffer, entireStringLength, \"%s%s%s%d\", runSeed, suiteName, testName, iteration);\n\n    /* Hash string and use half of the digest as 64bit exec key */\n    SDLTest_Md5Init(&md5Context);\n    SDLTest_Md5Update(&md5Context, (unsigned char *)buffer, entireStringLength);\n    SDLTest_Md5Final(&md5Context);\n    SDL_free(buffer);\n    keys = (Uint64 *)md5Context.digest;\n\n    return keys[0];\n}\n\n/**\n* \\brief Set timeout handler for test.\n*\n* Note: SDL_Init(SDL_INIT_TIMER) will be called if it wasn't done so before.\n*\n* \\param timeout Timeout interval in seconds.\n* \\param callback Function that will be called after timeout has elapsed.\n*\n* \\return Timer id or -1 on failure.\n*/\nSDL_TimerID\nSDLTest_SetTestTimeout(int timeout, void (*callback)())\n{\n    Uint32 timeoutInMilliseconds;\n    SDL_TimerID timerID;\n\n    if (callback == NULL) {\n        SDLTest_LogError(\"Timeout callback can't be NULL\");\n        return -1;\n    }\n\n    if (timeout < 0) {\n        SDLTest_LogError(\"Timeout value must be bigger than zero.\");\n        return -1;\n    }\n\n    /* Init SDL timer if not initialized before */\n    if (SDL_WasInit(SDL_INIT_TIMER) == 0) {\n        if (SDL_InitSubSystem(SDL_INIT_TIMER)) {\n            SDLTest_LogError(\"Failed to init timer subsystem: %s\", SDL_GetError());\n            return -1;\n        }\n    }\n\n    /* Set timer */\n    timeoutInMilliseconds = timeout * 1000;\n    timerID = SDL_AddTimer(timeoutInMilliseconds, (SDL_TimerCallback)callback, 0x0);\n    if (timerID == 0) {\n        SDLTest_LogError(\"Creation of SDL timer failed: %s\", SDL_GetError());\n        return -1;\n    }\n\n    return timerID;\n}\n\n/**\n* \\brief Timeout handler. Aborts test run and exits harness process.\n*/\nvoid\n    SDLTest_BailOut()\n{\n    SDLTest_LogError(\"TestCaseTimeout timer expired. Aborting test run.\");\n    exit(TEST_ABORTED); /* bail out from the test */\n}\n\n/**\n* \\brief Execute a test using the given execution key.\n*\n* \\param testSuite Suite containing the test case.\n* \\param testCase Case to execute.\n* \\param execKey Execution key for the fuzzer.\n* \\param forceTestRun Force test to run even if test was disabled in suite.\n*\n* \\returns Test case result.\n*/\nint\nSDLTest_RunTest(SDLTest_TestSuiteReference *testSuite, SDLTest_TestCaseReference *testCase, Uint64 execKey, SDL_bool forceTestRun)\n{\n    SDL_TimerID timer = 0;\n    int testCaseResult = 0;\n    int testResult = 0;\n    int fuzzerCount;\n\n    if (testSuite==NULL || testCase==NULL || testSuite->name==NULL || testCase->name==NULL)\n    {\n        SDLTest_LogError(\"Setup failure: testSuite or testCase references NULL\");\n        return TEST_RESULT_SETUP_FAILURE;\n    }\n\n\tif (!testCase->enabled && forceTestRun == SDL_FALSE)\n    {\n        SDLTest_Log(SDLTEST_FINAL_RESULT_FORMAT, \"Test\", testCase->name, \"Skipped (Disabled)\");\n        return TEST_RESULT_SKIPPED;\n    }\n\n    /* Initialize fuzzer */\n    SDLTest_FuzzerInit(execKey);\n\n    /* Reset assert tracker */\n    SDLTest_ResetAssertSummary();\n\n    /* Set timeout timer */\n    timer = SDLTest_SetTestTimeout(SDLTest_TestCaseTimeout, SDLTest_BailOut);\n\n    /* Maybe run suite initalizer function */\n    if (testSuite->testSetUp) {\n        testSuite->testSetUp(0x0);\n        if (SDLTest_AssertSummaryToTestResult() == TEST_RESULT_FAILED) {\n            SDLTest_LogError(SDLTEST_FINAL_RESULT_FORMAT, \"Suite Setup\", testSuite->name, \"Failed\");\n            return TEST_RESULT_SETUP_FAILURE;\n        }\n    }\n\n    /* Run test case function */\n    testCaseResult = testCase->testCase(0x0);\n\n    /* Convert test execution result into harness result */\n    if (testCaseResult == TEST_SKIPPED) {\n        /* Test was programatically skipped */\n        testResult = TEST_RESULT_SKIPPED;\n    } else if (testCaseResult == TEST_STARTED) {\n        /* Test did not return a TEST_COMPLETED value; assume it failed */\n        testResult = TEST_RESULT_FAILED;\n    } else if (testCaseResult == TEST_ABORTED) {\n        /* Test was aborted early; assume it failed */\n        testResult = TEST_RESULT_FAILED;\n    } else {\n        /* Perform failure analysis based on asserts */\n        testResult = SDLTest_AssertSummaryToTestResult();\n    }\n\n    /* Maybe run suite cleanup function (ignore failed asserts) */\n    if (testSuite->testTearDown) {\n        testSuite->testTearDown(0x0);\n    }\n\n    /* Cancel timeout timer */\n    if (timer) {\n        SDL_RemoveTimer(timer);\n    }\n\n    /* Report on asserts and fuzzer usage */\n    fuzzerCount = SDLTest_GetFuzzerInvocationCount();\n    if (fuzzerCount > 0) {\n        SDLTest_Log(\"Fuzzer invocations: %d\", fuzzerCount);\n    }\n\n    /* Final log based on test execution result */\n    if (testCaseResult == TEST_SKIPPED) {\n        /* Test was programatically skipped */\n        SDLTest_Log(SDLTEST_FINAL_RESULT_FORMAT, \"Test\", testCase->name, \"Skipped (Programmatically)\");\n    } else if (testCaseResult == TEST_STARTED) {\n        /* Test did not return a TEST_COMPLETED value; assume it failed */\n        SDLTest_LogError(SDLTEST_FINAL_RESULT_FORMAT, \"Test\", testCase->name, \"Failed (test started, but did not return TEST_COMPLETED)\");\n    } else if (testCaseResult == TEST_ABORTED) {\n        /* Test was aborted early; assume it failed */\n        SDLTest_LogError(SDLTEST_FINAL_RESULT_FORMAT, \"Test\", testCase->name, \"Failed (Aborted)\");\n    } else {\n        SDLTest_LogAssertSummary();\n    }\n\n    return testResult;\n}\n\n/* Prints summary of all suites/tests contained in the given reference */\nvoid SDLTest_LogTestSuiteSummary(SDLTest_TestSuiteReference *testSuites)\n{\n    int suiteCounter;\n    int testCounter;\n    SDLTest_TestSuiteReference *testSuite;\n    SDLTest_TestCaseReference *testCase;\n\n    /* Loop over all suites */\n    suiteCounter = 0;\n    while(&testSuites[suiteCounter]) {\n        testSuite=&testSuites[suiteCounter];\n        suiteCounter++;\n        SDLTest_Log(\"Test Suite %i - %s\\n\", suiteCounter,\n            (testSuite->name) ? testSuite->name : SDLTEST_INVALID_NAME_FORMAT);\n\n        /* Loop over all test cases */\n        testCounter = 0;\n        while(testSuite->testCases[testCounter])\n        {\n            testCase=(SDLTest_TestCaseReference *)testSuite->testCases[testCounter];\n            testCounter++;\n            SDLTest_Log(\"  Test Case %i - %s: %s\", testCounter,\n                (testCase->name) ? testCase->name : SDLTEST_INVALID_NAME_FORMAT,\n                (testCase->description) ? testCase->description : SDLTEST_INVALID_NAME_FORMAT);\n        }\n    }\n}\n\n/* Gets a timer value in seconds */\nfloat GetClock()\n{\n    float currentClock = (float)clock();\n    return currentClock / (float)CLOCKS_PER_SEC;\n}\n\n/**\n* \\brief Execute a test suite using the given run seed and execution key.\n*\n* The filter string is matched to the suite name (full comparison) to select a single suite,\n* or if no suite matches, it is matched to the test names (full comparison) to select a single test.\n*\n* \\param testSuites Suites containing the test case.\n* \\param userRunSeed Custom run seed provided by user, or NULL to autogenerate one.\n* \\param userExecKey Custom execution key provided by user, or 0 to autogenerate one.\n* \\param filter Filter specification. NULL disables. Case sensitive.\n* \\param testIterations Number of iterations to run each test case.\n*\n* \\returns Test run result; 0 when all tests passed, 1 if any tests failed.\n*/\nint SDLTest_RunSuites(SDLTest_TestSuiteReference *testSuites[], const char *userRunSeed, Uint64 userExecKey, const char *filter, int testIterations)\n{\n    int totalNumberOfTests = 0;\n    int failedNumberOfTests = 0;\n    int suiteCounter;\n    int testCounter;\n    int iterationCounter;\n    SDLTest_TestSuiteReference *testSuite;\n    SDLTest_TestCaseReference *testCase;\n    const char *runSeed = NULL;\n    char *currentSuiteName;\n    char *currentTestName;\n    Uint64 execKey;\n    float runStartSeconds;\n    float suiteStartSeconds;\n    float testStartSeconds;\n    float runEndSeconds;\n    float suiteEndSeconds;\n    float testEndSeconds;\n    float runtime;\n    int suiteFilter = 0;\n    char *suiteFilterName = NULL;\n    int testFilter = 0;\n    char *testFilterName = NULL;\n\tSDL_bool forceTestRun = SDL_FALSE;\n    int testResult = 0;\n    int runResult = 0;\n    Uint32 totalTestFailedCount = 0;\n    Uint32 totalTestPassedCount = 0;\n    Uint32 totalTestSkippedCount = 0;\n    Uint32 testFailedCount = 0;\n    Uint32 testPassedCount = 0;\n    Uint32 testSkippedCount = 0;\n    Uint32 countSum = 0;\n    SDLTest_TestCaseReference **failedTests;\n\n    /* Sanitize test iterations */\n    if (testIterations < 1) {\n        testIterations = 1;\n    }\n\n    /* Generate run see if we don't have one already */\n    if (userRunSeed == NULL || userRunSeed[0] == '\\0') {\n        runSeed = SDLTest_GenerateRunSeed(16);\n        if (runSeed == NULL) {\n            SDLTest_LogError(\"Generating a random seed failed\");\n            return 2;\n        }\n    } else {\n        runSeed = userRunSeed;\n    }\n\n\n    /* Reset per-run counters */\n    totalTestFailedCount = 0;\n    totalTestPassedCount = 0;\n    totalTestSkippedCount = 0;\n\n    /* Take time - run start */\n    runStartSeconds = GetClock();\n\n    /* Log run with fuzzer parameters */\n    SDLTest_Log(\"::::: Test Run /w seed '%s' started\\n\", runSeed);\n\n\t/* Count the total number of tests */\n    suiteCounter = 0;\n    while (testSuites[suiteCounter]) {\n        testSuite=(SDLTest_TestSuiteReference *)testSuites[suiteCounter];\n        suiteCounter++;\n        testCounter = 0;\n        while (testSuite->testCases[testCounter])\n        {\n            testCounter++;\n\t\t\ttotalNumberOfTests++;\n\t\t}\n\t}\n\n\t/* Pre-allocate an array for tracking failed tests (potentially all test cases) */\n\tfailedTests = (SDLTest_TestCaseReference **)SDL_malloc(totalNumberOfTests * sizeof(SDLTest_TestCaseReference *));\n\tif (failedTests == NULL) {\t\n\t   SDLTest_LogError(\"Unable to allocate cache for failed tests\");\n           SDL_Error(SDL_ENOMEM);\t   \n           return -1;\n\t}\n\n    /* Initialize filtering */\n    if (filter != NULL && filter[0] != '\\0') {\n        /* Loop over all suites to check if we have a filter match */\n        suiteCounter = 0;\n        while (testSuites[suiteCounter] && suiteFilter == 0) {\n            testSuite=(SDLTest_TestSuiteReference *)testSuites[suiteCounter];\n            suiteCounter++;\n            if (testSuite->name != NULL && SDL_strcmp(filter, testSuite->name) == 0) {\n                /* Matched a suite name */\n                suiteFilter = 1;\n                suiteFilterName = testSuite->name;\n                SDLTest_Log(\"Filtering: running only suite '%s'\", suiteFilterName);\n                break;\n            }\n\n            /* Within each suite, loop over all test cases to check if we have a filter match */\n            testCounter = 0;\n            while (testSuite->testCases[testCounter] && testFilter == 0)\n            {\n                testCase=(SDLTest_TestCaseReference *)testSuite->testCases[testCounter];\n                testCounter++;\n                if (testCase->name != NULL && SDL_strcmp(filter, testCase->name) == 0) {\n                    /* Matched a test name */\n                    suiteFilter = 1;\n                    suiteFilterName = testSuite->name;\n                    testFilter = 1;\n                    testFilterName = testCase->name;\n                    SDLTest_Log(\"Filtering: running only test '%s' in suite '%s'\", testFilterName, suiteFilterName);\n                    break;\n                }\n            }\n        }\n\n        if (suiteFilter == 0 && testFilter == 0) {\n            SDLTest_LogError(\"Filter '%s' did not match any test suite/case.\", filter);\n            SDLTest_Log(\"Exit code: 2\");\n            SDL_free(failedTests);\n            return 2;\n        }\n    }\n\n    /* Loop over all suites */\n    suiteCounter = 0;\n    while(testSuites[suiteCounter]) {\n        testSuite=(SDLTest_TestSuiteReference *)testSuites[suiteCounter];\n        currentSuiteName = (char *)((testSuite->name) ? testSuite->name : SDLTEST_INVALID_NAME_FORMAT);\n        suiteCounter++;\n\n        /* Filter suite if flag set and we have a name */\n        if (suiteFilter == 1 && suiteFilterName != NULL && testSuite->name != NULL &&\n            SDL_strcmp(suiteFilterName, testSuite->name) != 0) {\n                /* Skip suite */\n                SDLTest_Log(\"===== Test Suite %i: '%s' skipped\\n\",\n                    suiteCounter,\n                    currentSuiteName);\n        } else {\n\n            /* Reset per-suite counters */\n            testFailedCount = 0;\n            testPassedCount = 0;\n            testSkippedCount = 0;\n\n            /* Take time - suite start */\n            suiteStartSeconds = GetClock();\n\n            /* Log suite started */\n            SDLTest_Log(\"===== Test Suite %i: '%s' started\\n\",\n                suiteCounter,\n                currentSuiteName);\n\n            /* Loop over all test cases */\n            testCounter = 0;\n            while(testSuite->testCases[testCounter])\n            {\n                testCase=(SDLTest_TestCaseReference *)testSuite->testCases[testCounter];\n                currentTestName = (char *)((testCase->name) ? testCase->name : SDLTEST_INVALID_NAME_FORMAT);\n                testCounter++;\n\n                /* Filter tests if flag set and we have a name */\n                if (testFilter == 1 && testFilterName != NULL && testCase->name != NULL &&\n                    SDL_strcmp(testFilterName, testCase->name) != 0) {\n                        /* Skip test */\n                        SDLTest_Log(\"===== Test Case %i.%i: '%s' skipped\\n\",\n                            suiteCounter,\n                            testCounter,\n                            currentTestName);\n                } else {\n                    /* Override 'disabled' flag if we specified a test filter (i.e. force run for debugging) */\n                    if (testFilter == 1 && !testCase->enabled) {\n                        SDLTest_Log(\"Force run of disabled test since test filter was set\");\n\t\t\t\t\t\tforceTestRun = SDL_TRUE;\n                    }\n\n                    /* Take time - test start */\n                    testStartSeconds = GetClock();\n\n                    /* Log test started */\n                    SDLTest_Log(\"----- Test Case %i.%i: '%s' started\",\n                        suiteCounter,\n                        testCounter,\n                        currentTestName);\n                    if (testCase->description != NULL && testCase->description[0] != '\\0') {\n                        SDLTest_Log(\"Test Description: '%s'\",\n                            (testCase->description) ? testCase->description : SDLTEST_INVALID_NAME_FORMAT);\n                    }\n\n                    /* Loop over all iterations */\n                    iterationCounter = 0;\n                    while(iterationCounter < testIterations)\n                    {\n                        iterationCounter++;\n\n                        if (userExecKey != 0) {\n                            execKey = userExecKey;\n                        } else {\n                            execKey = SDLTest_GenerateExecKey((char *)runSeed, testSuite->name, testCase->name, iterationCounter);\n                        }\n\n                        SDLTest_Log(\"Test Iteration %i: execKey %\" SDL_PRIu64, iterationCounter, execKey);\n\t\t\t\t\t\ttestResult = SDLTest_RunTest(testSuite, testCase, execKey, forceTestRun);\n\n                        if (testResult == TEST_RESULT_PASSED) {\n                            testPassedCount++;\n                            totalTestPassedCount++;\n                        } else if (testResult == TEST_RESULT_SKIPPED) {\n                            testSkippedCount++;\n                            totalTestSkippedCount++;\n                        } else {\n                            testFailedCount++;\n                            totalTestFailedCount++;\n                        }\n                    }\n\n                    /* Take time - test end */\n                    testEndSeconds = GetClock();\n                    runtime = testEndSeconds - testStartSeconds;\n                    if (runtime < 0.0f) runtime = 0.0f;\n\n                    if (testIterations > 1) {\n                        /* Log test runtime */\n                        SDLTest_Log(\"Runtime of %i iterations: %.1f sec\", testIterations, runtime);\n                        SDLTest_Log(\"Average Test runtime: %.5f sec\", runtime / (float)testIterations);\n                    } else {\n                        /* Log test runtime */\n                        SDLTest_Log(\"Total Test runtime: %.1f sec\", runtime);\n                    }\n\n                    /* Log final test result */\n                    switch (testResult) {\n                    case TEST_RESULT_PASSED:\n                        SDLTest_Log(SDLTEST_FINAL_RESULT_FORMAT, \"Test\", currentTestName, \"Passed\");\n                        break;\n                    case TEST_RESULT_FAILED:\n                        SDLTest_LogError(SDLTEST_FINAL_RESULT_FORMAT, \"Test\", currentTestName, \"Failed\");\n                        break;\n                    case TEST_RESULT_NO_ASSERT:\n                        SDLTest_LogError(SDLTEST_FINAL_RESULT_FORMAT,\"Test\", currentTestName, \"No Asserts\");\n                        break;\n                    }\n\n                    /* Collect failed test case references for repro-step display */\n                    if (testResult == TEST_RESULT_FAILED) {\n                        failedTests[failedNumberOfTests] = testCase;\n                        failedNumberOfTests++;\n                    }\n                }\n            }\n\n            /* Take time - suite end */\n            suiteEndSeconds = GetClock();\n            runtime = suiteEndSeconds - suiteStartSeconds;\n            if (runtime < 0.0f) runtime = 0.0f;\n\n            /* Log suite runtime */\n            SDLTest_Log(\"Total Suite runtime: %.1f sec\", runtime);\n\n            /* Log summary and final Suite result */\n            countSum = testPassedCount + testFailedCount + testSkippedCount;\n            if (testFailedCount == 0)\n            {\n                SDLTest_Log(SDLTEST_LOG_SUMMARY_FORMAT, \"Suite\", countSum, testPassedCount, testFailedCount, testSkippedCount);\n                SDLTest_Log(SDLTEST_FINAL_RESULT_FORMAT, \"Suite\", currentSuiteName, \"Passed\");\n            }\n            else\n            {\n                SDLTest_LogError(SDLTEST_LOG_SUMMARY_FORMAT, \"Suite\", countSum, testPassedCount, testFailedCount, testSkippedCount);\n                SDLTest_LogError(SDLTEST_FINAL_RESULT_FORMAT, \"Suite\", currentSuiteName, \"Failed\");\n            }\n\n        }\n    }\n\n    /* Take time - run end */\n    runEndSeconds = GetClock();\n    runtime = runEndSeconds - runStartSeconds;\n    if (runtime < 0.0f) runtime = 0.0f;\n\n    /* Log total runtime */\n    SDLTest_Log(\"Total Run runtime: %.1f sec\", runtime);\n\n    /* Log summary and final run result */\n    countSum = totalTestPassedCount + totalTestFailedCount + totalTestSkippedCount;\n    if (totalTestFailedCount == 0)\n    {\n        runResult = 0;\n        SDLTest_Log(SDLTEST_LOG_SUMMARY_FORMAT, \"Run\", countSum, totalTestPassedCount, totalTestFailedCount, totalTestSkippedCount);\n        SDLTest_Log(SDLTEST_FINAL_RESULT_FORMAT, \"Run /w seed\", runSeed, \"Passed\");\n    }\n    else\n    {\n        runResult = 1;\n        SDLTest_LogError(SDLTEST_LOG_SUMMARY_FORMAT, \"Run\", countSum, totalTestPassedCount, totalTestFailedCount, totalTestSkippedCount);\n        SDLTest_LogError(SDLTEST_FINAL_RESULT_FORMAT, \"Run /w seed\", runSeed, \"Failed\");\n    }\n\n    /* Print repro steps for failed tests */\n    if (failedNumberOfTests > 0) {\n        SDLTest_Log(\"Harness input to repro failures:\");\n        for (testCounter = 0; testCounter < failedNumberOfTests; testCounter++) {\n          SDLTest_Log(\" --seed %s --filter %s\", runSeed, failedTests[testCounter]->name);\n        }\n    }\n    SDL_free(failedTests);\n\n    SDLTest_Log(\"Exit code: %d\", runResult);\n    return runResult;\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_imageBlit.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n/* GIMP RGB C-Source image dump (blit.c) */\n\nconst SDLTest_SurfaceImage_t SDLTest_imageBlit = {\n  80, 60, 3,\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\",\n};\n\n/**\n * \\brief Returns the Blit test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImageBlit()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imageBlit.pixel_data,\n        SDLTest_imageBlit.width,\n        SDLTest_imageBlit.height,\n        SDLTest_imageBlit.bytes_per_pixel * 8,\n        SDLTest_imageBlit.width * SDLTest_imageBlit.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n\nconst SDLTest_SurfaceImage_t SDLTest_imageBlitColor = {\n  80, 60, 3,\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\0\\0\\24\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0(\\0\\0(\\0\\0\\0\\0\\0\\0\\0\\0<\\0\\0<\\0\\0\\0\\0\\0\\0\\0\\0P\\0\\0P\\0\\0\\0\\0\\0\\0\\0\\0d\\0\"\n  \"\\0d\\0\\0\\0\\0\\0\\0\\0\\0x\\0\\0x\\0\\0\\0\\0\\0\\0\\0\\0\\214\\0\\0\\214\\0\\0\\0\\0\\0\\0\\0\\0\\240\"\n  \"\\0\\0\\240\\0\\0\\0\\0\\0\\0\\0\\0\\264\\0\\0\\264\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0\\0\\310\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\334\\0\\0\\334\\0\\0\\0\\0\\0\\0\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\"\n  \"\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\0\\0\\24\\0\\0\\24\\0\\0\\0\\0\\0(\\0\\0\"\n  \"(\\0\\0(\\0\\0\\0\\0\\0<\\0\\0<\\0\\0<\\0\\0\\0\\0\\0P\\0\\0P\\0\\0P\\0\\0\\0\\0\\0d\\0\\0d\\0\\0d\\0\\0\"\n  \"\\0\\0\\0x\\0\\0x\\0\\0x\\0\\0\\0\\0\\0\\214\\0\\0\\214\\0\\0\\214\\0\\0\\0\\0\\0\\240\\0\\0\\240\\0\\0\"\n  \"\\240\\0\\0\\0\\0\\0\\264\\0\\0\\264\\0\\0\\264\\0\\0\\0\\0\\0\\310\\0\\0\\310\\0\\0\\310\\0\\0\\0\\0\"\n  \"\\0\\334\\0\\0\\334\\0\\0\\334\\0\\0\\0\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\"\n  \"\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\0\\0\\24\\0\\0\\24\\0\\0\\0\"\n  \"\\0\\0(\\0\\0(\\0\\0(\\0\\0\\0\\0\\0<\\0\\0<\\0\\0<\\0\\0\\0\\0\\0P\\0\\0P\\0\\0P\\0\\0\\0\\0\\0d\\0\\0\"\n  \"d\\0\\0d\\0\\0\\0\\0\\0x\\0\\0x\\0\\0x\\0\\0\\0\\0\\0\\214\\0\\0\\214\\0\\0\\214\\0\\0\\0\\0\\0\\240\\0\"\n  \"\\0\\240\\0\\0\\240\\0\\0\\0\\0\\0\\264\\0\\0\\264\\0\\0\\264\\0\\0\\0\\0\\0\\310\\0\\0\\310\\0\\0\\310\"\n  \"\\0\\0\\0\\0\\0\\334\\0\\0\\334\\0\\0\\334\\0\\0\\0\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\"\n  \"\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\"\n  \"\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0$\\0\\0$\\0\\0\\0\\0\\0\\0\\0\\0$\\24\\0\"\n  \"$\\24\\0\\0\\0\\0\\0\\0\\0$(\\0$(\\0\\0\\0\\0\\0\\0\\0$<\\0$<\\0\\0\\0\\0\\0\\0\\0$P\\0$P\\0\\0\\0\\0\"\n  \"\\0\\0\\0$d\\0$d\\0\\0\\0\\0\\0\\0\\0$x\\0$x\\0\\0\\0\\0\\0\\0\\0$\\214\\0$\\214\\0\\0\\0\\0\\0\\0\\0\"\n  \"$\\240\\0$\\240\\0\\0\\0\\0\\0\\0\\0$\\264\\0$\\264\\0\\0\\0\\0\\0\\0\\0$\\310\\0$\\310\\0\\0\\0\\0\"\n  \"\\0\\0\\0$\\334\\0$\\334\\0\\0\\0\\0\\0\\0\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\"\n  \"\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\0\\0\\0\\360\\0\\0\\360\\0\\0\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0$\\0\\0$\\0\\0$\\0\\0\\0\\0\\0$\\24\\0$\\24\\0$\\24\\0\\0\\0\\0$(\\0$(\\0$(\\0\\0\\0\\0\"\n  \"$<\\0$<\\0$<\\0\\0\\0\\0$P\\0$P\\0$P\\0\\0\\0\\0$d\\0$d\\0$d\\0\\0\\0\\0$x\\0$x\\0$x\\0\\0\\0\\0\"\n  \"$\\214\\0$\\214\\0$\\214\\0\\0\\0\\0$\\240\\0$\\240\\0$\\240\\0\\0\\0\\0$\\264\\0$\\264\\0$\\264\"\n  \"\\0\\0\\0\\0$\\310\\0$\\310\\0$\\310\\0\\0\\0\\0$\\334\\0$\\334\\0$\\334\\0\\0\\0\\0$\\360\\0$\\360\"\n  \"\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0\"\n  \"\\0\\0\\0\\0\\360\\0\\0\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0$\\0\\0$\\0\\0$\\0\\0\\0\\0\\0$\\24\\0\"\n  \"$\\24\\0$\\24\\0\\0\\0\\0$(\\0$(\\0$(\\0\\0\\0\\0$<\\0$<\\0$<\\0\\0\\0\\0$P\\0$P\\0$P\\0\\0\\0\\0\"\n  \"$d\\0$d\\0$d\\0\\0\\0\\0$x\\0$x\\0$x\\0\\0\\0\\0$\\214\\0$\\214\\0$\\214\\0\\0\\0\\0$\\240\\0$\\240\"\n  \"\\0$\\240\\0\\0\\0\\0$\\264\\0$\\264\\0$\\264\\0\\0\\0\\0$\\310\\0$\\310\\0$\\310\\0\\0\\0\\0$\\334\"\n  \"\\0$\\334\\0$\\334\\0\\0\\0\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\"\n  \"\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\360\\0\\0\\360\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0$\\0\\0$\\0\\0$\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0$\\360\\0$\\360\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0$\\0\\0$\\0\\0$\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0H\\0\\0H\\0\\0\\0\\0\\0\\0\\0\\0H\\24\\0H\\24\\0\\0\\0\\0\\0\\0\\0H(\\0H(\\0\\0\\0\\0\\0\\0\"\n  \"\\0H<\\0H<\\0\\0\\0\\0\\0\\0\\0HP\\0HP\\0\\0\\0\\0\\0\\0\\0Hd\\0Hd\\0\\0\\0\\0\\0\\0\\0Hx\\0Hx\\0\\0\"\n  \"\\0\\0\\0\\0\\0H\\214\\0H\\214\\0\\0\\0\\0\\0\\0\\0H\\240\\0H\\240\\0\\0\\0\\0\\0\\0\\0H\\264\\0H\\264\"\n  \"\\0\\0\\0\\0\\0\\0\\0H\\310\\0H\\310\\0\\0\\0\\0\\0\\0\\0H\\334\\0H\\334\\0\\0\\0\\0\\0\\0\\0H\\360\\0\"\n  \"H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0\\0\\0\\0\\0\\0\\0$\\360\\0$\\360\"\n  \"\\0$\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0$\\0\\0$\\0\\0\\0\\0\\0H\\0\\0H\\0\\0H\\0\\0\\0\\0\\0H\\24\\0H\\24\\0H\\24\"\n  \"\\0\\0\\0\\0H(\\0H(\\0H(\\0\\0\\0\\0H<\\0H<\\0H<\\0\\0\\0\\0HP\\0HP\\0HP\\0\\0\\0\\0Hd\\0Hd\\0Hd\"\n  \"\\0\\0\\0\\0Hx\\0Hx\\0Hx\\0\\0\\0\\0H\\214\\0H\\214\\0H\\214\\0\\0\\0\\0H\\240\\0H\\240\\0H\\240\"\n  \"\\0\\0\\0\\0H\\264\\0H\\264\\0H\\264\\0\\0\\0\\0H\\310\\0H\\310\\0H\\310\\0\\0\\0\\0H\\334\\0H\\334\"\n  \"\\0H\\334\\0\\0\\0\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\"\n  \"\\360\\0H\\360\\0H\\360\\0H\\360\\0\\0\\0\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0$\\0\\0$\\0\\0\\0\\0\\0H\\0\\0\"\n  \"H\\0\\0H\\0\\0\\0\\0\\0H\\24\\0H\\24\\0H\\24\\0\\0\\0\\0H(\\0H(\\0H(\\0\\0\\0\\0H<\\0H<\\0H<\\0\\0\"\n  \"\\0\\0HP\\0HP\\0HP\\0\\0\\0\\0Hd\\0Hd\\0Hd\\0\\0\\0\\0Hx\\0Hx\\0Hx\\0\\0\\0\\0H\\214\\0H\\214\\0\"\n  \"H\\214\\0\\0\\0\\0H\\240\\0H\\240\\0H\\240\\0\\0\\0\\0H\\264\\0H\\264\\0H\\264\\0\\0\\0\\0H\\310\"\n  \"\\0H\\310\\0H\\310\\0\\0\\0\\0H\\334\\0H\\334\\0H\\334\\0\\0\\0\\0H\\360\\0H\\360\\0H\\360\\0H\\360\"\n  \"\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0\"\n  \"\\0\\0\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0$\\0\\0\\0\\0\\0H\\0\\0H\\0\\0H\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0\\0\\0\\0$\\360\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0H\\0\\0H\\0\\0H\\0\\0\\0\\0\\0\\0\\0\\0l\\0\\0l\\0\\0\\0\\0\\0\\0\\0\\0l\\24\\0l\\24\\0\\0\\0\\0\\0\\0\"\n  \"\\0l(\\0l(\\0\\0\\0\\0\\0\\0\\0l<\\0l<\\0\\0\\0\\0\\0\\0\\0lP\\0lP\\0\\0\\0\\0\\0\\0\\0ld\\0ld\\0\\0\"\n  \"\\0\\0\\0\\0\\0lx\\0lx\\0\\0\\0\\0\\0\\0\\0l\\214\\0l\\214\\0\\0\\0\\0\\0\\0\\0l\\240\\0l\\240\\0\\0\"\n  \"\\0\\0\\0\\0\\0l\\264\\0l\\264\\0\\0\\0\\0\\0\\0\\0l\\310\\0l\\310\\0\\0\\0\\0\\0\\0\\0l\\334\\0l\\334\"\n  \"\\0\\0\\0\\0\\0\\0\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0\\0\"\n  \"\\0\\0\\0\\0\\0H\\360\\0H\\360\\0H\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0H\\0\\0H\\0\\0\\0\\0\\0l\\0\\0l\\0\\0l\\0\\0\"\n  \"\\0\\0\\0l\\24\\0l\\24\\0l\\24\\0\\0\\0\\0l(\\0l(\\0l(\\0\\0\\0\\0l<\\0l<\\0l<\\0\\0\\0\\0lP\\0lP\"\n  \"\\0lP\\0\\0\\0\\0ld\\0ld\\0ld\\0\\0\\0\\0lx\\0lx\\0lx\\0\\0\\0\\0l\\214\\0l\\214\\0l\\214\\0\\0\\0\"\n  \"\\0l\\240\\0l\\240\\0l\\240\\0\\0\\0\\0l\\264\\0l\\264\\0l\\264\\0\\0\\0\\0l\\310\\0l\\310\\0l\\310\"\n  \"\\0\\0\\0\\0l\\334\\0l\\334\\0l\\334\\0\\0\\0\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\"\n  \"\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0\\0\\0\\0H\\360\\0H\\360\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0H\\0\"\n  \"\\0H\\0\\0\\0\\0\\0l\\0\\0l\\0\\0l\\0\\0\\0\\0\\0l\\24\\0l\\24\\0l\\24\\0\\0\\0\\0l(\\0l(\\0l(\\0\\0\"\n  \"\\0\\0l<\\0l<\\0l<\\0\\0\\0\\0lP\\0lP\\0lP\\0\\0\\0\\0ld\\0ld\\0ld\\0\\0\\0\\0lx\\0lx\\0lx\\0\\0\"\n  \"\\0\\0l\\214\\0l\\214\\0l\\214\\0\\0\\0\\0l\\240\\0l\\240\\0l\\240\\0\\0\\0\\0l\\264\\0l\\264\\0\"\n  \"l\\264\\0\\0\\0\\0l\\310\\0l\\310\\0l\\310\\0\\0\\0\\0l\\334\\0l\\334\\0l\\334\\0\\0\\0\\0l\\360\"\n  \"\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0l\\360\\0\"\n  \"l\\360\\0l\\360\\0l\\360\\0\\0\\0\\0H\\360\\0H\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0H\\0\\0\\0\\0\\0l\\0\\0l\\0\\0l\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0l\\360\\0l\\360\\0l\\360\\0l\\360\"\n  \"\\0\\0\\0\\0H\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0l\\0\\0l\\0\\0l\\0\\0\\0\\0\\0\\0\\0\\0\\220\\0\\0\\220\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\220\\24\\0\\220\\24\\0\\0\\0\\0\\0\\0\\0\\220(\\0\\220(\\0\\0\\0\\0\\0\\0\\0\\220<\\0\\220<\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\220P\\0\\220P\\0\\0\\0\\0\\0\\0\\0\\220d\\0\\220d\\0\\0\\0\\0\\0\\0\\0\\220x\\0\\220\"\n  \"x\\0\\0\\0\\0\\0\\0\\0\\220\\214\\0\\220\\214\\0\\0\\0\\0\\0\\0\\0\\220\\240\\0\\220\\240\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\220\\264\\0\\220\\264\\0\\0\\0\\0\\0\\0\\0\\220\\310\\0\\220\\310\\0\\0\\0\\0\\0\\0\\0\\220\"\n  \"\\334\\0\\220\\334\\0\\0\\0\\0\\0\\0\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\"\n  \"\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\0\\0\\0\\0\\0\\0l\\360\\0l\\360\\0l\\360\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0l\\0\\0l\\0\\0\\0\\0\\0\\220\\0\\0\\220\\0\\0\\220\\0\\0\\0\\0\\0\\220\\24\\0\\220\\24\\0\"\n  \"\\220\\24\\0\\0\\0\\0\\220(\\0\\220(\\0\\220(\\0\\0\\0\\0\\220<\\0\\220<\\0\\220<\\0\\0\\0\\0\\220\"\n  \"P\\0\\220P\\0\\220P\\0\\0\\0\\0\\220d\\0\\220d\\0\\220d\\0\\0\\0\\0\\220x\\0\\220x\\0\\220x\\0\\0\"\n  \"\\0\\0\\220\\214\\0\\220\\214\\0\\220\\214\\0\\0\\0\\0\\220\\240\\0\\220\\240\\0\\220\\240\\0\\0\"\n  \"\\0\\0\\220\\264\\0\\220\\264\\0\\220\\264\\0\\0\\0\\0\\220\\310\\0\\220\\310\\0\\220\\310\\0\\0\"\n  \"\\0\\0\\220\\334\\0\\220\\334\\0\\220\\334\\0\\0\\0\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\"\n  \"\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\"\n  \"\\0\\220\\360\\0\\0\\0\\0l\\360\\0l\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0l\\0\\0l\\0\\0\\0\\0\\0\\220\\0\\0\\220\\0\\0\\220\"\n  \"\\0\\0\\0\\0\\0\\220\\24\\0\\220\\24\\0\\220\\24\\0\\0\\0\\0\\220(\\0\\220(\\0\\220(\\0\\0\\0\\0\\220\"\n  \"<\\0\\220<\\0\\220<\\0\\0\\0\\0\\220P\\0\\220P\\0\\220P\\0\\0\\0\\0\\220d\\0\\220d\\0\\220d\\0\\0\"\n  \"\\0\\0\\220x\\0\\220x\\0\\220x\\0\\0\\0\\0\\220\\214\\0\\220\\214\\0\\220\\214\\0\\0\\0\\0\\220\\240\"\n  \"\\0\\220\\240\\0\\220\\240\\0\\0\\0\\0\\220\\264\\0\\220\\264\\0\\220\\264\\0\\0\\0\\0\\220\\310\"\n  \"\\0\\220\\310\\0\\220\\310\\0\\0\\0\\0\\220\\334\\0\\220\\334\\0\\220\\334\\0\\0\\0\\0\\220\\360\"\n  \"\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\"\n  \"\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\0\\0\\0l\\360\\0\"\n  \"l\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0l\\0\\0\\0\\0\\0\\220\\0\\0\\220\\0\\0\\220\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\220\\360\\0\\0\\0\\0l\\360\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\220\\0\\0\\220\\0\\0\\220\\0\\0\\0\\0\\0\\0\\0\\0\\264\\0\\0\\264\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\264\\24\\0\\264\\24\\0\\0\\0\\0\\0\\0\\0\\264(\\0\\264(\\0\\0\\0\\0\\0\\0\\0\\264<\\0\\264<\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\264P\\0\\264P\\0\\0\\0\\0\\0\\0\\0\\264d\\0\\264d\\0\\0\\0\\0\\0\\0\\0\\264x\\0\\264\"\n  \"x\\0\\0\\0\\0\\0\\0\\0\\264\\214\\0\\264\\214\\0\\0\\0\\0\\0\\0\\0\\264\\240\\0\\264\\240\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\264\\264\\0\\264\\264\\0\\0\\0\\0\\0\\0\\0\\264\\310\\0\\264\\310\\0\\0\\0\\0\\0\\0\\0\\264\"\n  \"\\334\\0\\264\\334\\0\\0\\0\\0\\0\\0\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\"\n  \"\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0\\0\\0\\0\\220\\360\\0\\220\\360\\0\\220\"\n  \"\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\220\\0\\0\\220\\0\\0\\0\\0\\0\\264\\0\\0\\264\\0\\0\\264\\0\\0\\0\\0\\0\\264\"\n  \"\\24\\0\\264\\24\\0\\264\\24\\0\\0\\0\\0\\264(\\0\\264(\\0\\264(\\0\\0\\0\\0\\264<\\0\\264<\\0\\264\"\n  \"<\\0\\0\\0\\0\\264P\\0\\264P\\0\\264P\\0\\0\\0\\0\\264d\\0\\264d\\0\\264d\\0\\0\\0\\0\\264x\\0\\264\"\n  \"x\\0\\264x\\0\\0\\0\\0\\264\\214\\0\\264\\214\\0\\264\\214\\0\\0\\0\\0\\264\\240\\0\\264\\240\\0\"\n  \"\\264\\240\\0\\0\\0\\0\\264\\264\\0\\264\\264\\0\\264\\264\\0\\0\\0\\0\\264\\310\\0\\264\\310\\0\"\n  \"\\264\\310\\0\\0\\0\\0\\264\\334\\0\\264\\334\\0\\264\\334\\0\\0\\0\\0\\264\\360\\0\\264\\360\\0\"\n  \"\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\"\n  \"\\360\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0\\220\\360\\0\\220\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\220\\0\\0\\220\\0\"\n  \"\\0\\0\\0\\0\\264\\0\\0\\264\\0\\0\\264\\0\\0\\0\\0\\0\\264\\24\\0\\264\\24\\0\\264\\24\\0\\0\\0\\0\\264\"\n  \"(\\0\\264(\\0\\264(\\0\\0\\0\\0\\264<\\0\\264<\\0\\264<\\0\\0\\0\\0\\264P\\0\\264P\\0\\264P\\0\\0\"\n  \"\\0\\0\\264d\\0\\264d\\0\\264d\\0\\0\\0\\0\\264x\\0\\264x\\0\\264x\\0\\0\\0\\0\\264\\214\\0\\264\"\n  \"\\214\\0\\264\\214\\0\\0\\0\\0\\264\\240\\0\\264\\240\\0\\264\\240\\0\\0\\0\\0\\264\\264\\0\\264\"\n  \"\\264\\0\\264\\264\\0\\0\\0\\0\\264\\310\\0\\264\\310\\0\\264\\310\\0\\0\\0\\0\\264\\334\\0\\264\"\n  \"\\334\\0\\264\\334\\0\\0\\0\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\"\n  \"\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\264\"\n  \"\\360\\0\\264\\360\\0\\0\\0\\0\\220\\360\\0\\220\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\220\\0\\0\\0\\0\\0\\264\\0\\0\\264\\0\\0\"\n  \"\\264\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\264\\360\\0\"\n  \"\\264\\360\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0\\220\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\264\\0\\0\\264\\0\\0\\264\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\330\\0\\0\\330\\0\\0\\0\\0\\0\\0\\0\\0\\330\\24\\0\\330\\24\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\330(\\0\\330(\\0\\0\\0\\0\\0\\0\\0\\330<\\0\\330<\\0\\0\\0\\0\\0\\0\\0\\330P\\0\\330P\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\330d\\0\\330d\\0\\0\\0\\0\\0\\0\\0\\330x\\0\\330x\\0\\0\\0\\0\\0\\0\\0\\330\\214\\0\\330\"\n  \"\\214\\0\\0\\0\\0\\0\\0\\0\\330\\240\\0\\330\\240\\0\\0\\0\\0\\0\\0\\0\\330\\264\\0\\330\\264\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\330\\310\\0\\330\\310\\0\\0\\0\\0\\0\\0\\0\\330\\334\\0\\330\\334\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\"\n  \"\\330\\360\\0\\0\\0\\0\\0\\0\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\264\\0\\0\"\n  \"\\264\\0\\0\\0\\0\\0\\330\\0\\0\\330\\0\\0\\330\\0\\0\\0\\0\\0\\330\\24\\0\\330\\24\\0\\330\\24\\0\\0\"\n  \"\\0\\0\\330(\\0\\330(\\0\\330(\\0\\0\\0\\0\\330<\\0\\330<\\0\\330<\\0\\0\\0\\0\\330P\\0\\330P\\0\"\n  \"\\330P\\0\\0\\0\\0\\330d\\0\\330d\\0\\330d\\0\\0\\0\\0\\330x\\0\\330x\\0\\330x\\0\\0\\0\\0\\330\\214\"\n  \"\\0\\330\\214\\0\\330\\214\\0\\0\\0\\0\\330\\240\\0\\330\\240\\0\\330\\240\\0\\0\\0\\0\\330\\264\"\n  \"\\0\\330\\264\\0\\330\\264\\0\\0\\0\\0\\330\\310\\0\\330\\310\\0\\330\\310\\0\\0\\0\\0\\330\\334\"\n  \"\\0\\330\\334\\0\\330\\334\\0\\0\\0\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\"\n  \"\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\"\n  \"\\0\\0\\0\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\264\\0\\0\\264\\0\\0\\0\\0\\0\\330\\0\\0\\330\\0\\0\"\n  \"\\330\\0\\0\\0\\0\\0\\330\\24\\0\\330\\24\\0\\330\\24\\0\\0\\0\\0\\330(\\0\\330(\\0\\330(\\0\\0\\0\"\n  \"\\0\\330<\\0\\330<\\0\\330<\\0\\0\\0\\0\\330P\\0\\330P\\0\\330P\\0\\0\\0\\0\\330d\\0\\330d\\0\\330\"\n  \"d\\0\\0\\0\\0\\330x\\0\\330x\\0\\330x\\0\\0\\0\\0\\330\\214\\0\\330\\214\\0\\330\\214\\0\\0\\0\\0\"\n  \"\\330\\240\\0\\330\\240\\0\\330\\240\\0\\0\\0\\0\\330\\264\\0\\330\\264\\0\\330\\264\\0\\0\\0\\0\"\n  \"\\330\\310\\0\\330\\310\\0\\330\\310\\0\\0\\0\\0\\330\\334\\0\\330\\334\\0\\330\\334\\0\\0\\0\\0\"\n  \"\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\"\n  \"\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\0\\0\\0\"\n  \"\\264\\360\\0\\264\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\264\\0\\0\\0\\0\\0\\330\\0\\0\\330\\0\\0\\330\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\"\n  \"\\360\\0\\0\\0\\0\\264\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\330\\0\\0\\330\\0\\0\\330\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\"\n  \"\\374\\0\\0\\0\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\0\\0\\0\\374(\\0\\374(\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\374<\\0\\374<\\0\\0\\0\\0\\0\\0\\0\\374P\\0\\374P\\0\\0\\0\\0\\0\\0\\0\\374d\\0\\374d\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\374x\\0\\374x\\0\\0\\0\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\0\\0\\0\\374\"\n  \"\\240\\0\\374\\240\\0\\0\\0\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\0\\0\\0\\374\\310\\0\\374\"\n  \"\\310\\0\\0\\0\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\330\"\n  \"\\360\\0\\330\\360\\0\\330\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\330\\0\\0\\330\\0\\0\\0\\0\\0\\374\\0\\0\\374\"\n  \"\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374(\\0\\374(\\0\"\n  \"\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374d\\0\\374d\"\n  \"\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\\214\\0\"\n  \"\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\"\n  \"\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\\334\\0\"\n  \"\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\330\\360\\0\\330\"\n  \"\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\330\\0\\0\\330\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\"\n  \"\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374(\\0\\374(\\0\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\"\n  \"\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374d\\0\\374d\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\"\n  \"\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\"\n  \"\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\"\n  \"\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\\334\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\330\\360\\0\\330\\360\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\330\"\n  \"\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\"\n  \"\\374(\\0\\374(\\0\\374(\\0\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374\"\n  \"P\\0\\0\\0\\0\\374d\\0\\374d\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\"\n  \"\\374\\214\\0\\374\\214\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\"\n  \"\\374\\264\\0\\374\\264\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\"\n  \"\\374\\334\\0\\374\\334\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\330\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\"\n  \"\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374(\\0\\374(\\0\"\n  \"\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374d\\0\\374d\"\n  \"\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\\214\\0\"\n  \"\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\"\n  \"\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\\334\\0\"\n  \"\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\374\"\n  \"\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374(\\0\\374(\\0\\0\\0\\0\\374\"\n  \"<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374d\\0\\374d\\0\\374d\\0\\0\"\n  \"\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\374\\240\"\n  \"\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\374\\310\"\n  \"\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\\334\\0\\0\\0\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\374\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374\"\n  \"(\\0\\374(\\0\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374\"\n  \"d\\0\\374d\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\"\n  \"\\214\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\"\n  \"\\264\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\"\n  \"\\334\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\374\\334\"\n  \"\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\374\\334\\0\\0\"\n  \"\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\"\n  \"\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374(\\0\\374(\\0\\0\\0\\0\\374<\\0\\374\"\n  \"<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374d\\0\\374d\\0\\374d\\0\\0\\0\\0\\374\"\n  \"x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\374\\240\\0\\374\"\n  \"\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\374\\310\\0\\374\"\n  \"\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\\334\\0\\0\\0\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\374\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374\"\n  \"(\\0\\374(\\0\\374(\\0\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\"\n  \"\\0\\0\\374d\\0\\374d\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\"\n  \"\\214\\0\\374\\214\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\"\n  \"\\264\\0\\374\\264\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\"\n  \"\\334\\0\\374\\334\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\374\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\"\n  \"\\374(\\0\\374(\\0\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\"\n  \"\\0\\374d\\0\\374d\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\"\n  \"\\0\\374\\214\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\"\n  \"\\0\\374\\264\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\"\n  \"\\0\\374\\334\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\374\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374\"\n  \"(\\0\\374(\\0\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374\"\n  \"d\\0\\374d\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\"\n  \"\\214\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\"\n  \"\\264\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\"\n  \"\\334\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\"\n  \"\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374(\\0\\374(\\0\"\n  \"\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374d\\0\\374d\"\n  \"\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\\214\\0\"\n  \"\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\"\n  \"\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\\334\\0\"\n  \"\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\374\"\n  \"\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374(\\0\\374(\\0\\0\\0\\0\\374\"\n  \"<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374d\\0\\374d\\0\\374d\\0\\0\"\n  \"\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\374\\240\"\n  \"\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\374\\310\"\n  \"\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\\334\\0\\0\\0\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\374\"\n  \"\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\374(\\0\\374(\\0\\374(\\0\\0\\0\\0\\374\"\n  \"<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\\0\\374P\\0\\0\\0\\0\\374d\\0\\374d\\0\\374d\\0\\0\"\n  \"\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\374\\240\"\n  \"\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\374\\310\"\n  \"\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\\334\\0\\374\\334\\0\\374\\334\\0\\0\\0\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\0\\0\\0\\374\\24\"\n  \"\\0\\374\\24\\0\\0\\0\\0\\0\\0\\0\\374(\\0\\374(\\0\\0\\0\\0\\0\\0\\0\\374<\\0\\374<\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\374P\\0\\374P\\0\\0\\0\\0\\0\\0\\0\\374d\\0\\374d\\0\\0\\0\\0\\0\\0\\0\\374x\\0\\374x\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\374\\264\\0\\374\\264\\0\\0\\0\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\0\\0\\0\\374\\334\"\n  \"\\0\\374\\334\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\0\\0\\0\\0\\0\\0\\374(\\0\\374(\\0\\0\\0\\0\\0\\0\\0\\374<\\0\"\n  \"\\374<\\0\\0\\0\\0\\0\\0\\0\\374P\\0\\374P\\0\\0\\0\\0\\0\\0\\0\\374d\\0\\374d\\0\\0\\0\\0\\0\\0\\0\\374\"\n  \"x\\0\\374x\\0\\0\\0\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\0\\0\\0\\374\\240\\0\\374\\240\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\374\\334\\0\\374\\334\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\0\\0\\0\\374\\24\\0\"\n  \"\\374\\24\\0\\0\\0\\0\\0\\0\\0\\374(\\0\\374(\\0\\0\\0\\0\\0\\0\\0\\374<\\0\\374<\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\374P\\0\\374P\\0\\0\\0\\0\\0\\0\\0\\374d\\0\\374d\\0\\0\\0\\0\\0\\0\\0\\374x\\0\\374x\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\0\\0\\0\\374\"\n  \"\\264\\0\\374\\264\\0\\0\\0\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\0\\0\\0\\374\\334\\0\\374\"\n  \"\\334\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\374\\24\\0\\374\\24\\0\\374\\24\\0\"\n  \"\\0\\0\\0\\374(\\0\\374(\\0\\374(\\0\\0\\0\\0\\374<\\0\\374<\\0\\374<\\0\\0\\0\\0\\374P\\0\\374P\"\n  \"\\0\\374P\\0\\0\\0\\0\\374d\\0\\374d\\0\\374d\\0\\0\\0\\0\\374x\\0\\374x\\0\\374x\\0\\0\\0\\0\\374\"\n  \"\\214\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\\374\"\n  \"\\264\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\374\"\n  \"\\334\\0\\374\\334\\0\\374\\334\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\0\\0\\374\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\374\\24\\0\\374\\24\\0\\0\\0\\0\\0\\0\\0\\374(\\0\\374(\\0\\0\\0\\0\\0\\0\\0\\374<\\0\\374<\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\374P\\0\\374P\\0\\0\\0\\0\\0\\0\\0\\374d\\0\\374d\\0\\0\\0\\0\\0\\0\\0\\374x\\0\\374\"\n  \"x\\0\\0\\0\\0\\0\\0\\0\\374\\214\\0\\374\\214\\0\\0\\0\\0\\0\\0\\0\\374\\240\\0\\374\\240\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\0\\0\\0\\374\\310\\0\\374\\310\\0\\0\\0\\0\\0\\0\\0\\374\"\n  \"\\334\\0\\374\\334\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\",\n};\n\n/**\n * \\brief Returns the BlitColor test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImageBlitColor()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imageBlitColor.pixel_data,\n        SDLTest_imageBlitColor.width,\n        SDLTest_imageBlitColor.height,\n        SDLTest_imageBlitColor.bytes_per_pixel * 8,\n        SDLTest_imageBlitColor.width * SDLTest_imageBlitColor.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n\nconst SDLTest_SurfaceImage_t SDLTest_imageBlitAlpha = {\n  80, 60, 3,\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\\24\\24\\0\\20\\20\\0\"\n  \"\\20\\20\\0\"\"88\\0\"\"88\\0**\\0**\\0ZZ\\0ZZ\\0==\\0==\\0yy\\0yy\\0II\\0II\\0\\224\\224\\0\\224\"\n  \"\\224\\0NN\\0NN\\0\\254\\254\\0\\254\\254\\0MM\\0MM\\0\\302\\302\\0\\302\\302\\0HH\\0HH\\0\\324\"\n  \"\\324\\0\\324\\324\\0>>\\0>>\\0\\343\\343\\0\\343\\343\\0\"\"00\\0\"\"00\\0\\356\\356\\0\\356\\356\"\n  \"\\0\\40\\40\\0\\40\\40\\0\\367\\367\\0\\367\\367\\0\\16\\16\\0\\16\\16\\0\\374\\374\\0\\374\\374\"\n  \"\\0\\374\\374\\0\\374\\374\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\24\\24\\0\\24\\24\\0\\24\\24\\0\\20\\20\\0\"\"88\\0\"\"88\\0\"\"88\\0**\\0ff\\0ff\\0ff\\0FF\\0\"\n  \"\\215\\215\\0\\215\\215\\0\\215\\215\\0UU\\0\\255\\255\\0\\255\\255\\0\\255\\255\\0[[\\0\\306\"\n  \"\\306\\0\\306\\306\\0\\306\\306\\0YY\\0\\331\\331\\0\\331\\331\\0\\331\\331\\0PP\\0\\350\\350\"\n  \"\\0\\350\\350\\0\\350\\350\\0DD\\0\\362\\362\\0\\362\\362\\0\\362\\362\\0\"\"44\\0\\370\\370\\0\"\n  \"\\370\\370\\0\\370\\370\\0\\\"\\\"\\0\\374\\374\\0\\374\\374\\0\\374\\374\\0\\16\\16\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\374\\374\\0\\374\\374\\0\\374\\374\\0\\374\\374\\0\"\n  \"\\360\\360\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\\24\\24\\0\\24\\24\\0\\20\\20\\0\"\"88\\0\"\n  \"\"\"88\\0\"\"88\\0**\\0ff\\0ff\\0ff\\0FF\\0\\226\\226\\0\\226\\226\\0\\215\\215\\0UU\\0\\271\\271\"\n  \"\\0\\271\\271\\0\\255\\255\\0[[\\0\\323\\323\\0\\323\\323\\0\\306\\306\\0YY\\0\\345\\345\\0\\345\"\n  \"\\345\\0\\331\\331\\0PP\\0\\360\\360\\0\\360\\360\\0\\350\\350\\0DD\\0\\370\\370\\0\\370\\370\"\n  \"\\0\\362\\362\\0\"\"44\\0\\374\\374\\0\\374\\374\\0\\370\\370\\0\\\"\\\"\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\374\\374\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\374\\374\\0\\374\\374\\0\\374\\374\\0\\374\\374\\0\\360\\360\\0\\360\\360\\0\\360\\360\"\n  \"\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\"\n  \"\\0\\24\\24\\0\\24\\24\\0\\20\\20\\0\"\"33\\0\"\"33\\0\"\"33\\0&&\\0OO\\0OO\\0OO\\0\"\"55\\0``\\0``\"\n  \"\\0``\\0::\\0``\\0``\\0``\\0\"\"22\\0WW\\0WW\\0WW\\0''\\0II\\0II\\0II\\0\\33\\33\\0\"\"99\\0\"\"9\"\n  \"9\\0\"\"99\\0\\20\\20\\0))\\0))\\0))\\0\\10\\10\\0\\33\\33\\0\\33\\33\\0\\33\\33\\0\\3\\3\\0\\17\\17\"\n  \"\\0\\17\\17\\0\\17\\17\\0\\0\\0\\0\\7\\7\\0\\7\\7\\0\\7\\7\\0\\7\\7\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\"\n  \"\\16\\16\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\\24\\24\\0\\24\\24\\0\\16\\16\"\n  \"\\0\"\"33\\0GG\\0GG\\0\"\"00\\0``\\0\\210\\210\\0\\210\\210\\0TT\\0\\204\\204\\0\\263\\263\\0\\263\"\n  \"\\263\\0ee\\0\\222\\222\\0\\315\\315\\0\\312\\312\\0gg\\0\\216\\216\\0\\331\\331\\0\\327\\327\"\n  \"\\0cc\\0\\202\\202\\0\\340\\340\\0\\337\\337\\0YY\\0qq\\0\\345\\345\\0\\344\\344\\0NN\\0^^\\0\"\n  \"\\352\\352\\0\\352\\352\\0@@\\0JJ\\0\\357\\357\\0\\357\\357\\0\"\"11\\0\"\"66\\0\\364\\364\\0\\364\"\n  \"\\364\\0\\40\\40\\0\\\"\\\"\\0\\371\\371\\0\\371\\371\\0\\16\\16\\0\\16\\16\\0\\375\\375\\0\\375\\375\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\362\\362\\0\\362\\362\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\16\"\n  \"\\16\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\"\n  \"\\24\\0\\24\\24\\0\\22\\22\\0\\24\\24\\0\"\"88\\0\"\"88\\0//\\0BB\\0pp\\0pp\\0UU\\0ss\\0\\242\\242\"\n  \"\\0\\242\\242\\0oo\\0\\230\\230\\0\\306\\306\\0\\306\\306\\0ww\\0\\265\\265\\0\\335\\335\\0\\335\"\n  \"\\335\\0ss\\0\\313\\313\\0\\353\\353\\0\\353\\353\\0ii\\0\\333\\333\\0\\364\\364\\0\\364\\364\"\n  \"\\0ZZ\\0\\351\\351\\0\\371\\371\\0\\371\\371\\0II\\0\\362\\362\\0\\374\\374\\0\\374\\374\\0\"\"6\"\n  \"6\\0\\370\\370\\0\\376\\376\\0\\376\\376\\0\\\"\\\"\\0\\374\\374\\0\\376\\376\\0\\376\\376\\0\\16\"\n  \"\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\\16\\16\\0\\360\\360\\0\\360\"\n  \"\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\\24\\24\\0\\22\\22\\0\\\"\\\"\\0\"\"88\\0\"\n  \"\"\"88\\0//\\0OO\\0pp\\0pp\\0WW\\0\\203\\203\\0\\242\\242\\0\\242\\242\\0qq\\0\\256\\256\\0\\312\"\n  \"\\312\\0\\301\\301\\0||\\0\\313\\313\\0\\342\\342\\0\\325\\325\\0yy\\0\\336\\336\\0\\360\\360\"\n  \"\\0\\342\\342\\0mm\\0\\353\\353\\0\\367\\367\\0\\354\\354\\0\\\\\\\\\\0\\363\\363\\0\\373\\373\\0\"\n  \"\\362\\362\\0JJ\\0\\371\\371\\0\\375\\375\\0\\367\\367\\0\"\"66\\0\\374\\374\\0\\376\\376\\0\\373\"\n  \"\\373\\0\\\"\\\"\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\375\\375\"\n  \"\\0\\360\\360\\0\\374\\374\\0\\360\\360\\0\\376\\376\\0\\16\\16\\0\\360\\360\\0\\360\\360\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\\22\\22\\0&&\\0\\\"\\\"\\0\"\"88\\0//\\0PP\\0HH\\0gg\\0NN\"\n  \"\\0pp\\0ee\\0}}\\0VV\\0{{\\0oo\\0\\202\\202\\0NN\\0qq\\0jj\\0vv\\0>>\\0``\\0\\\\\\\\\\0cc\\0,,\"\n  \"\\0MM\\0KK\\0OO\\0\\35\\35\\0::\\0\"\"99\\0;;\\0\\21\\21\\0**\\0))\\0**\\0\\10\\10\\0\\33\\33\\0\"\n  \"\\33\\33\\0\\33\\33\\0\\3\\3\\0\\17\\17\\0\\17\\17\\0\\17\\17\\0\\0\\0\\0\\7\\7\\0\\7\\7\\0\\7\\7\\0\\7\"\n  \"\\7\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\360\\360\\0\\360\"\n  \"\\360\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\22\\22\"\n  \"\\0&&\\0&&\\0\\\"\\\"\\0\"\"66\\0[[\\0oo\\0ee\\0``\\0\\220\\220\\0\\270\\270\\0\\250\\250\\0xx\\0\"\n  \"\\250\\250\\0\\327\\327\\0\\311\\311\\0zz\\0\\246\\246\\0\\341\\341\\0\\325\\325\\0rr\\0\\230\"\n  \"\\230\\0\\343\\343\\0\\334\\334\\0gg\\0\\205\\205\\0\\344\\344\\0\\340\\340\\0[[\\0rr\\0\\346\"\n  \"\\346\\0\\344\\344\\0NN\\0^^\\0\\352\\352\\0\\352\\352\\0AA\\0JJ\\0\\357\\357\\0\\357\\357\\0\"\n  \"\"\"11\\0\"\"66\\0\\364\\364\\0\\364\\364\\0\\40\\40\\0\\\"\\\"\\0\\371\\371\\0\\371\\371\\0\\16\\16\"\n  \"\\0\\16\\16\\0\\375\\375\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\362\\362\\0\\362\\362\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\16\\16\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\22\\22\\0&&\\0&&\\0\\37\\37\\0;;\\0``\\0``\\0HH\\0qq\\0\\237\\237\"\n  \"\\0\\237\\237\\0nn\\0\\227\\227\\0\\306\\306\\0\\306\\306\\0}}\\0\\254\\254\\0\\334\\334\\0\\334\"\n  \"\\334\\0}}\\0\\275\\275\\0\\347\\347\\0\\347\\347\\0vv\\0\\316\\316\\0\\357\\357\\0\\357\\357\"\n  \"\\0ii\\0\\334\\334\\0\\365\\365\\0\\365\\365\\0ZZ\\0\\351\\351\\0\\371\\371\\0\\371\\371\\0II\"\n  \"\\0\\362\\362\\0\\374\\374\\0\\374\\374\\0\"\"66\\0\\370\\370\\0\\376\\376\\0\\376\\376\\0\\\"\\\"\"\n  \"\\0\\374\\374\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\360\\360\\0\\360\\360\\0\\360\\360\"\n  \"\\0\\360\\360\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"&&\\0&&\\0##\\0--\\0``\\0``\\0TT\\0cc\\0\\237\\237\\0\\231\\231\\0||\\0\\223\\223\\0\\306\\306\"\n  \"\\0\\301\\301\\0\\217\\217\\0\\267\\267\\0\\336\\336\\0\\322\\322\\0\\220\\220\\0\\317\\317\\0\"\n  \"\\352\\352\\0\\334\\334\\0\\202\\202\\0\\337\\337\\0\\362\\362\\0\\345\\345\\0qq\\0\\353\\353\"\n  \"\\0\\370\\370\\0\\354\\354\\0^^\\0\\363\\363\\0\\373\\373\\0\\362\\362\\0JJ\\0\\371\\371\\0\\375\"\n  \"\\375\\0\\367\\367\\0\"\"66\\0\\374\\374\\0\\376\\376\\0\\373\\373\\0\\\"\\\"\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\375\\375\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\360\\360\\0\\376\\376\\0\"\n  \"\\360\\360\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"&&\\0##\\0\"\"77\\0--\\0``\\0PP\\0nn\\0[[\\0\\222\\222\\0kk\\0\\211\\211\\0qq\\0\\231\\231\\0\"\n  \"ff\\0\\210\\210\\0uu\\0\\217\\217\\0UU\\0vv\\0ll\\0zz\\0@@\\0aa\\0]]\\0dd\\0,,\\0MM\\0KK\\0\"\n  \"OO\\0\\35\\35\\0::\\0\"\"99\\0;;\\0\\21\\21\\0**\\0))\\0**\\0\\10\\10\\0\\33\\33\\0\\33\\33\\0\\33\"\n  \"\\33\\0\\3\\3\\0\\17\\17\\0\\17\\17\\0\\17\\17\\0\\0\\0\\0\\7\\7\\0\\7\\7\\0\\7\\7\\0\\7\\7\\0\\2\\2\\0\\2\"\n  \"\\2\\0\\2\\2\\0\\2\\2\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\360\\360\\0\\360\\360\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0##\\0\"\"77\\0\"\"77\"\n  \"\\0--\\0UU\\0zz\\0\\216\\216\\0ww\\0}}\\0\\254\\254\\0\\324\\324\\0\\264\\264\\0\\207\\207\\0\"\n  \"\\266\\266\\0\\345\\345\\0\\316\\316\\0\\177\\177\\0\\254\\254\\0\\346\\346\\0\\326\\326\\0rr\"\n  \"\\0\\231\\231\\0\\344\\344\\0\\334\\334\\0gg\\0\\206\\206\\0\\344\\344\\0\\340\\340\\0[[\\0rr\"\n  \"\\0\\346\\346\\0\\344\\344\\0NN\\0^^\\0\\352\\352\\0\\352\\352\\0AA\\0JJ\\0\\357\\357\\0\\357\"\n  \"\\357\\0\"\"11\\0\"\"66\\0\\364\\364\\0\\364\\364\\0\\40\\40\\0\\\"\\\"\\0\\371\\371\\0\\371\\371\\0\"\n  \"\\16\\16\\0\\16\\16\\0\\375\\375\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\362\\362\\0\\362\\362\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\22\\22\\0\"\"77\\0\"\"77\\0--\\0CC\\0~~\\0~~\\0\\\\\\\\\\0||\\0\"\n  \"\\274\\274\\0\\274\\274\\0||\\0\\235\\235\\0\\325\\325\\0\\325\\325\\0\\204\\204\\0\\256\\256\"\n  \"\\0\\340\\340\\0\\340\\340\\0\\177\\177\\0\\275\\275\\0\\351\\351\\0\\351\\351\\0vv\\0\\316\\316\"\n  \"\\0\\360\\360\\0\\360\\360\\0ii\\0\\334\\334\\0\\365\\365\\0\\365\\365\\0ZZ\\0\\351\\351\\0\\371\"\n  \"\\371\\0\\371\\371\\0II\\0\\362\\362\\0\\374\\374\\0\\374\\374\\0\"\"66\\0\\370\\370\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\\"\\\"\\0\\374\\374\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\360\\360\\0\"\n  \"\\360\\360\\0\\360\\360\\0\\360\\360\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0&&\\0\"\"77\\0\"\"22\\0--\\0``\\0vv\\0pp\\0gg\\0\\243\\243\\0\\255\\255\"\n  \"\\0\\225\\225\\0\\231\\231\\0\\311\\311\\0\\314\\314\\0\\235\\235\\0\\271\\271\\0\\337\\337\\0\"\n  \"\\326\\326\\0\\224\\224\\0\\320\\320\\0\\352\\352\\0\\336\\336\\0\\204\\204\\0\\337\\337\\0\\362\"\n  \"\\362\\0\\345\\345\\0qq\\0\\353\\353\\0\\370\\370\\0\\354\\354\\0^^\\0\\363\\363\\0\\373\\373\"\n  \"\\0\\362\\362\\0JJ\\0\\371\\371\\0\\375\\375\\0\\367\\367\\0\"\"66\\0\\374\\374\\0\\376\\376\\0\"\n  \"\\373\\373\\0\\\"\\\"\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\16\\16\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\"\n  \"\\375\\375\\0\\360\\360\\0\\376\\376\\0\\360\\360\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0&&\\0##\\0FF\\0\"\"99\\0``\\0PP\\0\\200\\200\\0dd\\0\\222\"\n  \"\\222\\0kk\\0\\222\\222\\0vv\\0\\231\\231\\0ff\\0\\213\\213\\0ww\\0\\217\\217\\0UU\\0xx\\0mm\"\n  \"\\0zz\\0@@\\0bb\\0]]\\0dd\\0,,\\0MM\\0KK\\0OO\\0\\35\\35\\0::\\0\"\"99\\0;;\\0\\21\\21\\0**\\0\"\n  \"))\\0**\\0\\10\\10\\0\\33\\33\\0\\33\\33\\0\\33\\33\\0\\3\\3\\0\\17\\17\\0\\17\\17\\0\\17\\17\\0\\0\"\n  \"\\0\\0\\7\\7\\0\\7\\7\\0\\7\\7\\0\\7\\7\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\16\\16\\0\\16\\16\\0\\16\\16\"\n  \"\\0\\16\\16\\0\\360\\360\\0\\360\\360\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0##\\0\"\"77\\0\"\"77\\0\"\"99\\0^^\\0zz\\0\\216\\216\\0\\201\\201\\0\\203\"\n  \"\\203\\0\\254\\254\\0\\324\\324\\0\\271\\271\\0\\211\\211\\0\\266\\266\\0\\345\\345\\0\\317\\317\"\n  \"\\0\\200\\200\\0\\254\\254\\0\\346\\346\\0\\326\\326\\0ss\\0\\231\\231\\0\\344\\344\\0\\334\\334\"\n  \"\\0gg\\0\\206\\206\\0\\344\\344\\0\\340\\340\\0[[\\0rr\\0\\346\\346\\0\\344\\344\\0NN\\0^^\\0\"\n  \"\\352\\352\\0\\352\\352\\0AA\\0JJ\\0\\357\\357\\0\\357\\357\\0\"\"11\\0\"\"66\\0\\364\\364\\0\\364\"\n  \"\\364\\0\\40\\40\\0\\\"\\\"\\0\\371\\371\\0\\371\\371\\0\\16\\16\\0\\16\\16\\0\\375\\375\\0\\375\\375\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\362\\362\\0\\362\\362\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\16\"\n  \"\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\22\\22\"\n  \"\\0\"\"77\\0\"\"77\\0--\\0MM\\0\\210\\210\\0\\210\\210\\0\\\\\\\\\\0\\202\\202\\0\\302\\302\\0\\302\"\n  \"\\302\\0||\\0\\240\\240\\0\\330\\330\\0\\330\\330\\0\\204\\204\\0\\257\\257\\0\\341\\341\\0\\341\"\n  \"\\341\\0\\177\\177\\0\\275\\275\\0\\351\\351\\0\\351\\351\\0vv\\0\\316\\316\\0\\360\\360\\0\\360\"\n  \"\\360\\0ii\\0\\334\\334\\0\\365\\365\\0\\365\\365\\0ZZ\\0\\351\\351\\0\\371\\371\\0\\371\\371\"\n  \"\\0II\\0\\362\\362\\0\\374\\374\\0\\374\\374\\0\"\"66\\0\\370\\370\\0\\376\\376\\0\\376\\376\\0\"\n  \"\\\"\\\"\\0\\374\\374\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\360\\360\\0\\360\\360\\0\"\n  \"\\360\\360\\0\\360\\360\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0&&\\0\"\"77\\0\"\"22\\0--\\0``\\0vv\\0xx\\0kk\\0\\245\\245\\0\\257\\257\\0\\235\\235\"\n  \"\\0\\234\\234\\0\\312\\312\\0\\315\\315\\0\\241\\241\\0\\272\\272\\0\\337\\337\\0\\326\\326\\0\"\n  \"\\225\\225\\0\\320\\320\\0\\352\\352\\0\\336\\336\\0\\204\\204\\0\\337\\337\\0\\362\\362\\0\\345\"\n  \"\\345\\0qq\\0\\353\\353\\0\\370\\370\\0\\354\\354\\0^^\\0\\363\\363\\0\\373\\373\\0\\362\\362\"\n  \"\\0JJ\\0\\371\\371\\0\\375\\375\\0\\367\\367\\0\"\"66\\0\\374\\374\\0\\376\\376\\0\\373\\373\\0\"\n  \"\\\"\\\"\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\"\n  \"\\360\\360\\0\\376\\376\\0\\360\\360\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0&&\\0##\\0FF\\0\"\"99\\0``\\0PP\\0\\200\\200\\0dd\\0\\222\\222\\0kk\"\n  \"\\0\\222\\222\\0vv\\0\\231\\231\\0ff\\0\\213\\213\\0ww\\0\\217\\217\\0UU\\0xx\\0mm\\0zz\\0@@\"\n  \"\\0bb\\0]]\\0dd\\0,,\\0MM\\0KK\\0OO\\0\\35\\35\\0::\\0\"\"99\\0;;\\0\\21\\21\\0**\\0))\\0**\\0\"\n  \"\\10\\10\\0\\33\\33\\0\\33\\33\\0\\33\\33\\0\\3\\3\\0\\17\\17\\0\\17\\17\\0\\17\\17\\0\\0\\0\\0\\7\\7\"\n  \"\\0\\7\\7\\0\\7\\7\\0\\7\\7\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\16\\16\"\n  \"\\0\\360\\360\\0\\360\\360\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0##\\0\"\"77\\0\"\"77\\0\"\"99\\0^^\\0zz\\0\\216\\216\\0\\201\\201\\0\\203\\203\\0\"\n  \"\\254\\254\\0\\324\\324\\0\\271\\271\\0\\211\\211\\0\\266\\266\\0\\345\\345\\0\\317\\317\\0\\200\"\n  \"\\200\\0\\254\\254\\0\\346\\346\\0\\326\\326\\0ss\\0\\231\\231\\0\\344\\344\\0\\334\\334\\0gg\"\n  \"\\0\\206\\206\\0\\344\\344\\0\\340\\340\\0[[\\0rr\\0\\346\\346\\0\\344\\344\\0NN\\0^^\\0\\352\"\n  \"\\352\\0\\352\\352\\0AA\\0JJ\\0\\357\\357\\0\\357\\357\\0\"\"11\\0\"\"66\\0\\364\\364\\0\\364\\364\"\n  \"\\0\\40\\40\\0\\\"\\\"\\0\\371\\371\\0\\371\\371\\0\\16\\16\\0\\16\\16\\0\\375\\375\\0\\375\\375\\0\"\n  \"\\376\\376\\0\\376\\376\\0\\362\\362\\0\\362\\362\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\16\\16\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\22\\22\\0\"\n  \"\"\"77\\0\"\"77\\0--\\0MM\\0\\210\\210\\0\\210\\210\\0\\\\\\\\\\0\\202\\202\\0\\302\\302\\0\\302\\302\"\n  \"\\0||\\0\\240\\240\\0\\330\\330\\0\\330\\330\\0\\204\\204\\0\\257\\257\\0\\341\\341\\0\\341\\341\"\n  \"\\0\\177\\177\\0\\275\\275\\0\\351\\351\\0\\351\\351\\0vv\\0\\316\\316\\0\\360\\360\\0\\360\\360\"\n  \"\\0ii\\0\\334\\334\\0\\365\\365\\0\\365\\365\\0ZZ\\0\\351\\351\\0\\371\\371\\0\\371\\371\\0II\"\n  \"\\0\\362\\362\\0\\374\\374\\0\\374\\374\\0\"\"66\\0\\370\\370\\0\\376\\376\\0\\376\\376\\0\\\"\\\"\"\n  \"\\0\\374\\374\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\360\\360\\0\\360\\360\\0\\360\\360\"\n  \"\\0\\360\\360\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"&&\\0\"\"77\\0\"\"22\\0--\\0``\\0vv\\0xx\\0kk\\0\\245\\245\\0\\257\\257\\0\\235\\235\\0\\234\\234\"\n  \"\\0\\312\\312\\0\\315\\315\\0\\241\\241\\0\\272\\272\\0\\337\\337\\0\\326\\326\\0\\225\\225\\0\"\n  \"\\320\\320\\0\\352\\352\\0\\336\\336\\0\\204\\204\\0\\337\\337\\0\\362\\362\\0\\345\\345\\0qq\"\n  \"\\0\\353\\353\\0\\370\\370\\0\\354\\354\\0^^\\0\\363\\363\\0\\373\\373\\0\\362\\362\\0JJ\\0\\371\"\n  \"\\371\\0\\375\\375\\0\\367\\367\\0\"\"66\\0\\374\\374\\0\\376\\376\\0\\373\\373\\0\\\"\\\"\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\375\\375\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\360\\360\\0\"\n  \"\\376\\376\\0\\360\\360\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0&&\\0##\\0FF\\0\"\"99\\0``\\0PP\\0\\200\\200\\0dd\\0\\222\\222\\0kk\\0\\222\\222\"\n  \"\\0vv\\0\\231\\231\\0ff\\0\\213\\213\\0ww\\0\\217\\217\\0UU\\0xx\\0mm\\0zz\\0@@\\0bb\\0]]\\0\"\n  \"dd\\0,,\\0MM\\0KK\\0OO\\0\\35\\35\\0::\\0\"\"99\\0;;\\0\\21\\21\\0**\\0))\\0**\\0\\10\\10\\0\\33\"\n  \"\\33\\0\\33\\33\\0\\33\\33\\0\\3\\3\\0\\17\\17\\0\\17\\17\\0\\17\\17\\0\\0\\0\\0\\7\\7\\0\\7\\7\\0\\7\\7\"\n  \"\\0\\7\\7\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\360\\360\"\n  \"\\0\\360\\360\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0##\\0\"\"77\\0\"\"77\\0\"\"99\\0^^\\0zz\\0\\216\\216\\0\\201\\201\\0\\203\\203\\0\\254\\254\\0\"\n  \"\\324\\324\\0\\271\\271\\0\\211\\211\\0\\266\\266\\0\\345\\345\\0\\317\\317\\0\\200\\200\\0\\254\"\n  \"\\254\\0\\346\\346\\0\\326\\326\\0ss\\0\\231\\231\\0\\344\\344\\0\\334\\334\\0gg\\0\\206\\206\"\n  \"\\0\\344\\344\\0\\340\\340\\0[[\\0rr\\0\\346\\346\\0\\344\\344\\0NN\\0^^\\0\\352\\352\\0\\352\"\n  \"\\352\\0AA\\0JJ\\0\\357\\357\\0\\357\\357\\0\"\"11\\0\"\"66\\0\\364\\364\\0\\364\\364\\0\\40\\40\"\n  \"\\0\\\"\\\"\\0\\371\\371\\0\\371\\371\\0\\16\\16\\0\\16\\16\\0\\375\\375\\0\\375\\375\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\362\\362\\0\\362\\362\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\16\\16\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\22\\22\\0\"\"77\\0\"\n  \"\"\"77\\0--\\0MM\\0\\210\\210\\0\\210\\210\\0\\\\\\\\\\0\\202\\202\\0\\302\\302\\0\\302\\302\\0||\"\n  \"\\0\\240\\240\\0\\330\\330\\0\\330\\330\\0\\204\\204\\0\\257\\257\\0\\341\\341\\0\\341\\341\\0\"\n  \"\\177\\177\\0\\275\\275\\0\\351\\351\\0\\351\\351\\0vv\\0\\316\\316\\0\\360\\360\\0\\360\\360\"\n  \"\\0ii\\0\\334\\334\\0\\365\\365\\0\\365\\365\\0ZZ\\0\\351\\351\\0\\371\\371\\0\\371\\371\\0II\"\n  \"\\0\\362\\362\\0\\374\\374\\0\\374\\374\\0\"\"66\\0\\370\\370\\0\\376\\376\\0\\376\\376\\0\\\"\\\"\"\n  \"\\0\\374\\374\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\360\\360\\0\\360\\360\\0\\360\\360\"\n  \"\\0\\360\\360\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"&&\\0\"\"77\\0\"\"22\\0--\\0``\\0vv\\0xx\\0kk\\0\\245\\245\\0\\257\\257\\0\\235\\235\\0\\234\\234\"\n  \"\\0\\312\\312\\0\\315\\315\\0\\241\\241\\0\\272\\272\\0\\337\\337\\0\\326\\326\\0\\225\\225\\0\"\n  \"\\320\\320\\0\\352\\352\\0\\336\\336\\0\\204\\204\\0\\337\\337\\0\\362\\362\\0\\345\\345\\0qq\"\n  \"\\0\\353\\353\\0\\370\\370\\0\\354\\354\\0^^\\0\\363\\363\\0\\373\\373\\0\\362\\362\\0JJ\\0\\371\"\n  \"\\371\\0\\375\\375\\0\\367\\367\\0\"\"66\\0\\374\\374\\0\\376\\376\\0\\373\\373\\0\\\"\\\"\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\375\\375\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\360\\360\\0\"\n  \"\\376\\376\\0\\360\\360\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0&&\\0##\\0FF\\0\"\"99\\0``\\0PP\\0\\200\\200\\0dd\\0\\222\\222\\0kk\\0\\222\\222\"\n  \"\\0vv\\0\\231\\231\\0ff\\0\\213\\213\\0ww\\0\\217\\217\\0UU\\0xx\\0mm\\0zz\\0@@\\0bb\\0]]\\0\"\n  \"dd\\0,,\\0MM\\0KK\\0OO\\0\\35\\35\\0::\\0\"\"99\\0;;\\0\\21\\21\\0**\\0))\\0**\\0\\10\\10\\0\\33\"\n  \"\\33\\0\\33\\33\\0\\33\\33\\0\\3\\3\\0\\17\\17\\0\\17\\17\\0\\17\\17\\0\\0\\0\\0\\7\\7\\0\\7\\7\\0\\7\\7\"\n  \"\\0\\7\\7\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\2\\2\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\360\\360\"\n  \"\\0\\360\\360\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0##\\0\"\"77\\0\"\"77\\0\"\"99\\0^^\\0zz\\0\\216\\216\\0\\201\\201\\0\\203\\203\\0\\254\\254\\0\"\n  \"\\324\\324\\0\\271\\271\\0\\211\\211\\0\\266\\266\\0\\345\\345\\0\\317\\317\\0\\200\\200\\0\\254\"\n  \"\\254\\0\\346\\346\\0\\326\\326\\0ss\\0\\231\\231\\0\\344\\344\\0\\334\\334\\0gg\\0\\206\\206\"\n  \"\\0\\344\\344\\0\\340\\340\\0[[\\0rr\\0\\346\\346\\0\\344\\344\\0NN\\0^^\\0\\352\\352\\0\\352\"\n  \"\\352\\0AA\\0JJ\\0\\357\\357\\0\\357\\357\\0\"\"11\\0\"\"66\\0\\364\\364\\0\\364\\364\\0\\40\\40\"\n  \"\\0\\\"\\\"\\0\\371\\371\\0\\371\\371\\0\\16\\16\\0\\16\\16\\0\\375\\375\\0\\375\\375\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\362\\362\\0\\362\\362\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\16\\16\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\22\\22\\0\"\"77\\0\"\n  \"\"\"77\\0--\\0MM\\0\\210\\210\\0\\210\\210\\0\\\\\\\\\\0\\202\\202\\0\\302\\302\\0\\302\\302\\0||\"\n  \"\\0\\240\\240\\0\\330\\330\\0\\330\\330\\0\\204\\204\\0\\257\\257\\0\\341\\341\\0\\341\\341\\0\"\n  \"\\177\\177\\0\\275\\275\\0\\351\\351\\0\\351\\351\\0vv\\0\\316\\316\\0\\360\\360\\0\\360\\360\"\n  \"\\0ii\\0\\334\\334\\0\\365\\365\\0\\365\\365\\0ZZ\\0\\351\\351\\0\\371\\371\\0\\371\\371\\0II\"\n  \"\\0\\362\\362\\0\\374\\374\\0\\374\\374\\0\"\"66\\0\\370\\370\\0\\376\\376\\0\\376\\376\\0\\\"\\\"\"\n  \"\\0\\374\\374\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\360\\360\\0\\360\\360\\0\\360\\360\"\n  \"\\0\\360\\360\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"&&\\0\"\"77\\0\"\"22\\0--\\0``\\0vv\\0xx\\0kk\\0\\245\\245\\0\\257\\257\\0\\235\\235\\0\\234\\234\"\n  \"\\0\\312\\312\\0\\315\\315\\0\\241\\241\\0\\272\\272\\0\\337\\337\\0\\326\\326\\0\\225\\225\\0\"\n  \"\\320\\320\\0\\352\\352\\0\\336\\336\\0\\204\\204\\0\\337\\337\\0\\362\\362\\0\\345\\345\\0qq\"\n  \"\\0\\353\\353\\0\\370\\370\\0\\354\\354\\0^^\\0\\363\\363\\0\\373\\373\\0\\362\\362\\0JJ\\0\\371\"\n  \"\\371\\0\\375\\375\\0\\367\\367\\0\"\"66\\0\\374\\374\\0\\376\\376\\0\\373\\373\\0\\\"\\\"\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\375\\375\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\360\\360\\0\"\n  \"\\376\\376\\0\\360\\360\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0&&\\0##\\0FF\\0\"\"99\\0``\\0PP\\0\\213\\213\\0mm\\0\\237\\237\\0uu\\0\\275\\275\"\n  \"\\0\\232\\232\\0\\306\\306\\0\\204\\204\\0\\331\\331\\0\\272\\272\\0\\336\\336\\0\\205\\205\\0\"\n  \"\\345\\345\\0\\320\\320\\0\\352\\352\\0{{\\0\\355\\355\\0\\337\\337\\0\\362\\362\\0mm\\0\\363\"\n  \"\\363\\0\\353\\353\\0\\370\\370\\0\\\\\\\\\\0\\367\\367\\0\\363\\363\\0\\373\\373\\0II\\0\\373\\373\"\n  \"\\0\\371\\371\\0\\375\\375\\0\"\"66\\0\\375\\375\\0\\374\\374\\0\\376\\376\\0\\\"\\\"\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\375\\375\\0\\376\\376\\0\\375\\375\\0\\375\\375\"\n  \"\\0\\360\\360\\0\\360\\360\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0##\\0\"\"77\\0\"\"77\\0\"\"99\\0gg\\0\\205\\205\\0\\205\\205\\0ww\\0\\224\\224\\0\"\n  \"\\310\\310\\0\\310\\310\\0\\247\\247\\0\\240\\240\\0\\354\\354\\0\\354\\354\\0\\306\\306\\0\\227\"\n  \"\\227\\0\\372\\372\\0\\372\\372\\0\\325\\325\\0\\205\\205\\0\\375\\375\\0\\375\\375\\0\\342\\342\"\n  \"\\0rr\\0\\376\\376\\0\\376\\376\\0\\354\\354\\0^^\\0\\376\\376\\0\\376\\376\\0\\363\\363\\0JJ\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\370\\370\\0\"\"66\\0\\376\\376\\0\\376\\376\\0\\374\\374\\0\\\"\\\"\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\375\\375\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\362\\362\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\"\n  \"\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\22\\22\\0\"\"77\\0\"\"77\\0\"\"11\\0>>\\0~~\\0~~\\0bb\"\n  \"\\0__\\0\\261\\261\\0\\261\\261\\0\\212\\212\\0``\\0\\277\\277\\0\\277\\277\\0\\230\\230\\0SS\"\n  \"\\0\\275\\275\\0\\275\\275\\0\\233\\233\\0@@\\0\\273\\273\\0\\273\\273\\0\\240\\240\\0//\\0\\274\"\n  \"\\274\\0\\274\\274\\0\\252\\252\\0!!\\0\\301\\301\\0\\301\\301\\0\\266\\266\\0\\25\\25\\0\\311\"\n  \"\\311\\0\\311\\311\\0\\303\\303\\0\\14\\14\\0\\324\\324\\0\\324\\324\\0\\322\\322\\0\\6\\6\\0\\342\"\n  \"\\342\\0\\342\\342\\0\\341\\341\\0\\1\\1\\0\\361\\361\\0\\361\\361\\0\\361\\361\\0\\15\\15\\0\\15\"\n  \"\\15\\0\\15\\15\\0\\15\\15\\0\\362\\362\\0\\362\\362\\0\\362\\362\\0\\360\\360\\0\\16\\16\\0\\16\"\n  \"\\16\\0\\16\\16\\0\\2\\2\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0&&\\0\"\"77\\0\"\"77\\0\\34\\34\\0SS\\0kk\\0\\206\\206\\0BB\\0\\214\\214\\0\\232\\232\"\n  \"\\0\\302\\302\\0YY\\0\\250\\250\\0\\255\\255\\0\\340\\340\\0XX\\0\\264\\264\\0\\264\\264\\0\\355\"\n  \"\\355\\0SS\\0\\265\\265\\0\\266\\266\\0\\364\\364\\0JJ\\0\\270\\270\\0\\272\\272\\0\\371\\371\"\n  \"\\0AA\\0\\277\\277\\0\\300\\300\\0\\374\\374\\0\"\"66\\0\\310\\310\\0\\311\\311\\0\\375\\375\\0\"\n  \"**\\0\\324\\324\\0\\324\\324\\0\\376\\376\\0\\34\\34\\0\\341\\341\\0\\342\\342\\0\\376\\376\\0\"\n  \"\\15\\15\\0\\361\\361\\0\\361\\361\\0\\376\\376\\0\\361\\361\\0\\15\\15\\0\\15\\15\\0\\376\\376\"\n  \"\\0\\15\\15\\0\\361\\361\\0\\361\\361\\0\\373\\373\\0\\362\\362\\0\\15\\15\\0\\16\\16\\0\\376\\376\"\n  \"\\0\\16\\16\\0\\361\\361\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0&&\\0&&\\0\"\"77\\0))\\0SS\\0SS\\0kk\\0DD\\0\\205\\205\\0}}\\0\\222\\222\\0WW\\0\\241\\241\"\n  \"\\0\\230\\230\\0\\245\\245\\0XX\\0\\261\\261\\0\\252\\252\\0\\261\\261\\0SS\\0\\264\\264\\0\\263\"\n  \"\\263\\0\\265\\265\\0JJ\\0\\270\\270\\0\\271\\271\\0\\272\\272\\0AA\\0\\276\\276\\0\\300\\300\"\n  \"\\0\\300\\300\\0\"\"66\\0\\310\\310\\0\\311\\311\\0\\311\\311\\0**\\0\\324\\324\\0\\324\\324\\0\"\n  \"\\324\\324\\0\\34\\34\\0\\341\\341\\0\\342\\342\\0\\342\\342\\0\\15\\15\\0\\361\\361\\0\\361\\361\"\n  \"\\0\\361\\361\\0\\361\\361\\0\\15\\15\\0\\15\\15\\0\\15\\15\\0\\15\\15\\0\\361\\361\\0\\361\\361\"\n  \"\\0\\361\\361\\0\\362\\362\\0\\15\\15\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\361\\361\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0&&\\0&&\\0&&\\0))\\0pp\\0cc\\0cc\"\n  \"\\0QQ\\0\\261\\261\\0\\244\\244\\0\\244\\244\\0ll\\0\\335\\335\\0\\323\\323\\0\\323\\323\\0ww\"\n  \"\\0\\364\\364\\0\\356\\356\\0\\356\\356\\0ss\\0\\370\\370\\0\\371\\371\\0\\371\\371\\0ii\\0\\372\"\n  \"\\372\\0\\375\\375\\0\\375\\375\\0YY\\0\\374\\374\\0\\376\\376\\0\\376\\376\\0HH\\0\\375\\375\"\n  \"\\0\\376\\376\\0\\376\\376\\0\"\"66\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\\"\\\"\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\361\\361\\0\\376\\376\\0\\376\\376\\0\"\n  \"\\376\\376\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0&&\\0&&\\0\\40\\40\\0QQ\\0pp\\0pp\\0KK\"\n  \"\\0\\215\\215\\0\\261\\261\\0\\261\\261\\0pp\\0\\274\\274\\0\\337\\337\\0\\337\\337\\0\\200\\200\"\n  \"\\0\\332\\332\\0\\364\\364\\0\\364\\364\\0}}\\0\\350\\350\\0\\373\\373\\0\\373\\373\\0oo\\0\\361\"\n  \"\\361\\0\\375\\375\\0\\375\\375\\0]]\\0\\367\\367\\0\\376\\376\\0\\376\\376\\0JJ\\0\\373\\373\"\n  \"\\0\\376\\376\\0\\376\\376\\0\"\"66\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\\"\\\"\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\"\n  \"\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\361\\361\\0\\376\\376\\0\\376\\376\\0\"\n  \"\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0&&\\0&&\\0\\20\\20\\0\"\"88\\0WW\\0pp\\0\"\n  \"==\\0ss\\0\\212\\212\\0\\252\\252\\0dd\\0\\250\\250\\0\\264\\264\\0\\312\\312\\0rr\\0\\313\\313\"\n  \"\\0\\315\\315\\0\\331\\331\\0rr\\0\\340\\340\\0\\331\\331\\0\\340\\340\\0hh\\0\\355\\355\\0\\341\"\n  \"\\341\\0\\345\\345\\0YY\\0\\366\\366\\0\\350\\350\\0\\352\\352\\0HH\\0\\372\\372\\0\\356\\356\"\n  \"\\0\\357\\357\\0\"\"66\\0\\375\\375\\0\\364\\364\\0\\364\\364\\0\\\"\\\"\\0\\376\\376\\0\\371\\371\"\n  \"\\0\\371\\371\\0\\16\\16\\0\\376\\376\\0\\375\\375\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\361\"\n  \"\\361\\0\\362\\362\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\16\\16\\0\\376\\376\\0\\375\\375\\0\"\n  \"\\376\\376\\0\\375\\375\\0\\374\\374\\0\\360\\360\\0\\376\\376\\0\\376\\376\\0\\360\\360\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\\24\\24\\0&&\\0\\40\\40\\0\"\"88\\0\"\"88\\0WW\\0BB\\0ff\"\n  \"\\0ZZ\\0}}\\0^^\\0\\226\\226\\0\\201\\201\\0\\241\\241\\0nn\\0\\301\\301\\0\\246\\246\\0\\277\"\n  \"\\277\\0rr\\0\\333\\333\\0\\301\\301\\0\\321\\321\\0ii\\0\\353\\353\\0\\323\\323\\0\\335\\335\"\n  \"\\0[[\\0\\365\\365\\0\\341\\341\\0\\346\\346\\0II\\0\\372\\372\\0\\353\\353\\0\\356\\356\\0\"\"6\"\n  \"6\\0\\375\\375\\0\\363\\363\\0\\364\\364\\0\\\"\\\"\\0\\376\\376\\0\\371\\371\\0\\371\\371\\0\\16\"\n  \"\\16\\0\\376\\376\\0\\375\\375\\0\\375\\375\\0\\376\\376\\0\\376\\376\\0\\361\\361\\0\\361\\361\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\16\\16\\0\\376\\376\\0\\374\\374\\0\\375\\375\\0\\374\"\n  \"\\374\\0\\374\\374\\0\\361\\361\\0\\376\\376\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\24\\24\\0\\24\\24\\0\\24\\24\\0\\40\\40\\0HH\\0\"\"88\\0\"\"88\\0BB\\0~~\\0ff\\0ff\\0\"\n  \"^^\\0\\256\\256\\0\\226\\226\\0\\226\\226\\0qq\\0\\325\\325\\0\\277\\277\\0\\277\\277\\0ss\\0\"\n  \"\\350\\350\\0\\331\\331\\0\\331\\331\\0jj\\0\\363\\363\\0\\353\\353\\0\\353\\353\\0[[\\0\\371\"\n  \"\\371\\0\\365\\365\\0\\365\\365\\0II\\0\\374\\374\\0\\372\\372\\0\\372\\372\\0\"\"66\\0\\375\\375\"\n  \"\\0\\375\\375\\0\\375\\375\\0\\\"\\\"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\"\n  \"\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\374\\374\\0\\374\\374\\0\\374\\374\\0\\376\"\n  \"\\376\\0\\361\\361\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\24\\24\\0\\24\\24\\0\\24\\24\\0\\40\\40\\0HH\\0HH\\0\"\"88\\0BB\\0~~\\0~~\\0ff\\0^^\\0\\263\"\n  \"\\263\\0\\263\\263\\0\\231\\231\\0nn\\0\\330\\330\\0\\330\\330\\0\\274\\274\\0pp\\0\\353\\353\"\n  \"\\0\\353\\353\\0\\324\\324\\0hh\\0\\365\\365\\0\\365\\365\\0\\345\\345\\0ZZ\\0\\373\\373\\0\\373\"\n  \"\\373\\0\\361\\361\\0II\\0\\375\\375\\0\\375\\375\\0\\370\\370\\0\"\"66\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\374\\374\\0\\\"\\\"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\16\\16\\0\\376\\376\\0\\376\\376\"\n  \"\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\\376\\376\\0\"\n  \"\\376\\376\\0\\374\\374\\0\\374\\374\\0\\376\\376\\0\\376\\376\\0\\361\\361\\0\\360\\360\\0\\360\"\n  \"\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\\24\\24\\0\\0\\0\"\n  \"\\0\\0\\0\\0((\\0HH\\0\\40\\40\\0\\25\\25\\0QQ\\0\\207\\207\\0KK\\0--\\0}}\\0\\262\\262\\0bb\\0\"\n  \"\"\"44\\0\\235\\235\\0\\320\\320\\0ff\\0\"\"00\\0\\257\\257\\0\\341\\341\\0cc\\0))\\0\\272\\272\"\n  \"\\0\\354\\354\\0ZZ\\0\\37\\37\\0\\303\\303\\0\\363\\363\\0OO\\0\\26\\26\\0\\314\\314\\0\\370\\370\"\n  \"\\0AA\\0\\15\\15\\0\\326\\326\\0\\373\\373\\0\"\"22\\0\\6\\6\\0\\343\\343\\0\\375\\375\\0!!\\0\\1\"\n  \"\\1\\0\\362\\362\\0\\376\\376\\0\\16\\16\\0\\16\\16\\0\\16\\16\\0\\375\\375\\0\\375\\375\\0\\375\"\n  \"\\375\\0\\376\\376\\0\\362\\362\\0\\360\\360\\0\\361\\361\\0\\376\\376\\0\\14\\14\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\"\n  \"\\0\\24\\24\\0\\0\\0\\0\\0\\0\\0((\\0((\\0\\0\\0\\0\\0\\0\\0<<\\0<<\\0\\0\\0\\0\\0\\0\\0PP\\0PP\\0\\10\"\n  \"\\10\\0\\4\\4\\0dd\\0dd\\0\\14\\14\\0\\6\\6\\0xx\\0xx\\0\\14\\14\\0\\5\\5\\0\\214\\214\\0\\214\\214\"\n  \"\\0\\13\\13\\0\\4\\4\\0\\240\\240\\0\\240\\240\\0\\10\\10\\0\\2\\2\\0\\264\\264\\0\\264\\264\\0\\5\"\n  \"\\5\\0\\1\\1\\0\\310\\310\\0\\310\\310\\0\\3\\3\\0\\0\\0\\0\\334\\334\\0\\334\\334\\0\\1\\1\\0\\0\\0\"\n  \"\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\1\\0\\1\\1\\0\\0\\0\\0\\0\\0\\0\\14\"\n  \"\\14\\0\\14\\14\\0\\0\\0\\0\\0\\0\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\\24\\24\\0\\0\\0\\0\\0\\0\\0((\\0((\\0\\0\\0\\0\\0\\0\"\n  \"\\0<<\\0<<\\0\\0\\0\\0\\0\\0\\0XX\\0XX\\0\\0\\0\\0\\0\\0\\0pp\\0pp\\0\\0\\0\\0\\0\\0\\0\\204\\204\\0\"\n  \"\\204\\204\\0\\0\\0\\0\\0\\0\\0\\227\\227\\0\\227\\227\\0\\0\\0\\0\\0\\0\\0\\250\\250\\0\\250\\250\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\271\\271\\0\\271\\271\\0\\0\\0\\0\\0\\0\\0\\313\\313\\0\\313\\313\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\335\\335\\0\\335\\335\\0\\0\\0\\0\\0\\0\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\1\"\n  \"\\1\\0\\1\\1\\0\\0\\0\\0\\0\\0\\0\\14\\14\\0\\14\\14\\0\\0\\0\\0\\0\\0\\0\\360\\360\\0\\360\\360\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\"\n  \"\\24\\24\\0\\24\\24\\0\\0\\0\\0((\\0((\\0((\\0\\0\\0\\0<<\\0HH\\0HH\\0\\10\\10\\0PP\\0dd\\0dd\\0\"\n  \"\\14\\14\\0dd\\0||\\0||\\0\\14\\14\\0xx\\0\\221\\221\\0\\221\\221\\0\\13\\13\\0\\214\\214\\0\\243\"\n  \"\\243\\0\\243\\243\\0\\10\\10\\0\\240\\240\\0\\264\\264\\0\\264\\264\\0\\5\\5\\0\\264\\264\\0\\303\"\n  \"\\303\\0\\303\\303\\0\\3\\3\\0\\310\\310\\0\\322\\322\\0\\322\\322\\0\\1\\1\\0\\334\\334\\0\\341\"\n  \"\\341\\0\\341\\341\\0\\0\\0\\0\\360\\360\\0\\361\\361\\0\\361\\361\\0\\1\\1\\0\\0\\0\\0\\14\\14\\0\"\n  \"\\14\\14\\0\\14\\14\\0\\0\\0\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\24\\24\\0\"\n  \"\\24\\24\\0\\20\\20\\0\\20\\20\\0\"\"88\\0\"\"88\\0**\\0**\\0ZZ\\0ZZ\\0==\\0==\\0yy\\0yy\\0II\\0\"\n  \"II\\0\\224\\224\\0\\224\\224\\0NN\\0NN\\0\\254\\254\\0\\254\\254\\0MM\\0MM\\0\\302\\302\\0\\302\"\n  \"\\302\\0HH\\0HH\\0\\324\\324\\0\\324\\324\\0>>\\0>>\\0\\343\\343\\0\\343\\343\\0\"\"00\\0\"\"00\"\n  \"\\0\\356\\356\\0\\356\\356\\0\\40\\40\\0\\40\\40\\0\\367\\367\\0\\367\\367\\0\\16\\16\\0\\16\\16\"\n  \"\\0\\374\\374\\0\\374\\374\\0\\374\\374\\0\\374\\374\\0\\360\\360\\0\\360\\360\\0\\360\\360\\0\"\n  \"\\360\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\",\n};\n\n/**\n * \\brief Returns the BlitAlpha test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImageBlitAlpha()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imageBlitAlpha.pixel_data,\n        SDLTest_imageBlitAlpha.width,\n        SDLTest_imageBlitAlpha.height,\n        SDLTest_imageBlitAlpha.bytes_per_pixel * 8,\n        SDLTest_imageBlitAlpha.width * SDLTest_imageBlitAlpha.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_imageBlitBlend.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n/* GIMP RGB C-Source image dump (alpha.c) */\n\nconst SDLTest_SurfaceImage_t SDLTest_imageBlitBlendAdd = {\n  80, 60, 3,\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\"\n  \"\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\"\n  \"\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\"\n  \"\\310\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0dd\"\n  \"\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0\"\n  \"\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0\"\n  \"dd\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\"\n  \"dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\310\\310\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0dd\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0dd\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\"\n  \"\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\310\\310\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\310\\310\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\310\\310\\0\\310\\310\\0dd\\0\\310\\310\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\"\n  \"dd\\0\\310\\310\\0\\310\\310\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\310\\310\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0\\310\\310\\0\\377\\377\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\310\\310\\0dd\"\n  \"\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\"\n  \"\\0\\0\\0\\0\\0\\0\\0dd\\0\\377\\377\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\310\\310\\0\\310\\310\\0\\377\\377\\0dd\\0\\0\"\n  \"\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\"\n  \"\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0\"\n  \"dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0\"\n  \"dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\"\n  \"dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\"\n  \"\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\\310\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\\0\\310\\310\\0\\310\\310\\0\\0\\0\\0\\0\\0\"\n  \"\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0\\0\\0\\0dd\\0dd\\0dd\\0\\0\\0\\0dd\\0\\310\\310\\0\\310\"\n  \"\\310\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0\\310\"\n  \"\\310\\0\\310\\310\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0\"\n  \"dd\\0dd\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0\\310\\310\"\n  \"\\0\\310\\310\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0dd\\0\"\n  \"\\0\\0\\0dd\\0dd\\0dd\\0\\0\\0\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0dd\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\"\n  \"\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\"\n  \"\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\"\n  \"\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\"\n  \"\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\\310\\0\\310\"\n  \"\\310\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\",\n};\n\n/**\n * \\brief Returns the BlitBlendAdd test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImageBlitBlendAdd()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imageBlitBlendAdd.pixel_data,\n        SDLTest_imageBlitBlendAdd.width,\n        SDLTest_imageBlitBlendAdd.height,\n        SDLTest_imageBlitBlendAdd.bytes_per_pixel * 8,\n        SDLTest_imageBlitBlendAdd.width * SDLTest_imageBlitBlendAdd.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n\nconst SDLTest_SurfaceImage_t SDLTest_imageBlitBlend = {\n  80, 60, 3,\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0<<\\0<<\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\"\n  \"\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0\"\n  \"aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\"\n  \"\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0\"\n  \"aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\"\n  \"\\240\\0\\240\\240\\0\\240\\240\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0<<\\0\\240\\240\\0\\240\\240\\0\\240\\240\"\n  \"\\0aa\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0ww\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0ww\"\n  \"\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0ww\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0ww\\0\\305\"\n  \"\\305\\0\\305\\305\\0\\305\\305\\0ww\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0ww\\0\\305\\305\"\n  \"\\0\\305\\305\\0\\305\\305\\0ww\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0ww\\0\\305\\305\\0\\305\"\n  \"\\305\\0\\305\\305\\0ww\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0ww\\0\\305\\305\\0\\305\\305\"\n  \"\\0\\305\\305\\0\\305\\305\\0\\240\\240\\0\\240\\240\\0\\240\\240\\0\\240\\240\\0dd\\0dd\\0dd\"\n  \"\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0<<\\0\\240\\240\"\n  \"\\0\\240\\240\\0\\240\\240\\0aa\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0ww\\0\\333\\333\\0\\333\"\n  \"\\333\\0\\305\\305\\0ww\\0\\333\\333\\0\\333\\333\\0\\305\\305\\0ww\\0\\333\\333\\0\\333\\333\"\n  \"\\0\\305\\305\\0ww\\0\\333\\333\\0\\333\\333\\0\\305\\305\\0ww\\0\\333\\333\\0\\333\\333\\0\\305\"\n  \"\\305\\0ww\\0\\333\\333\\0\\333\\333\\0\\305\\305\\0ww\\0\\333\\333\\0\\333\\333\\0\\305\\305\"\n  \"\\0ww\\0\\333\\333\\0\\333\\333\\0\\305\\305\\0ww\\0\\333\\333\\0\\333\\333\\0\\305\\305\\0ww\"\n  \"\\0\\333\\333\\0\\333\\333\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0\\305\\305\\0\\240\\240\\0\"\n  \"\\240\\240\\0\\240\\240\\0\\240\\240\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0dd\\0dd\\0dd\\0<<\\0aa\\0aa\\0aa\\0::\\0HH\\0HH\\0HH\\0++\\0PP\\0PP\\0PP\\0\"\"00\\0PP\"\n  \"\\0PP\\0PP\\0\"\"00\\0PP\\0PP\\0PP\\0\"\"00\\0PP\\0PP\\0PP\\0\"\"00\\0PP\\0PP\\0PP\\0\"\"00\\0PP\"\n  \"\\0PP\\0PP\\0\"\"00\\0PP\\0PP\\0PP\\0\"\"00\\0PP\\0PP\\0PP\\0\"\"00\\0PP\\0PP\\0PP\\0\"\"00\\0PP\"\n  \"\\0PP\\0PP\\0PP\\0HH\\0HH\\0HH\\0HH\\0aa\\0aa\\0aa\\0aa\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0dd\\0dd\\0dd\\0$$\\0aa\\0\\305\\305\\0\\305\\305\\0``\\0\\205\\205\\0\\351\\351\\0\"\n  \"\\351\\351\\0||\\0\\222\\222\\0\\321\\321\\0\\321\\321\\0\\177\\177\\0\\225\\225\\0\\324\\324\"\n  \"\\0\\321\\321\\0\\177\\177\\0\\225\\225\\0\\324\\324\\0\\321\\321\\0\\177\\177\\0\\225\\225\\0\"\n  \"\\324\\324\\0\\321\\321\\0\\177\\177\\0\\225\\225\\0\\324\\324\\0\\321\\321\\0\\177\\177\\0\\225\"\n  \"\\225\\0\\324\\324\\0\\321\\321\\0\\177\\177\\0\\225\\225\\0\\324\\324\\0\\321\\321\\0\\177\\177\"\n  \"\\0\\225\\225\\0\\324\\324\\0\\321\\321\\0\\177\\177\\0\\225\\225\\0\\324\\324\\0\\321\\321\\0\"\n  \"\\177\\177\\0\\225\\225\\0\\324\\324\\0\\321\\321\\0\\222\\222\\0\\222\\222\\0\\321\\321\\0\\314\"\n  \"\\314\\0\\351\\351\\0\\351\\351\\0\\254\\254\\0\\236\\236\\0\\305\\305\\0\\305\\305\\0aa\\0<<\"\n  \"\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0<<\\0dd\\0\\240\\240\\0\\240\\240\\0aa\\0\\255\\255\"\n  \"\\0\\322\\322\\0\\322\\322\\0\\177\\177\\0\\315\\315\\0\\343\\343\\0\\343\\343\\0\\211\\211\\0\"\n  \"\\313\\313\\0\\346\\346\\0\\346\\346\\0\\211\\211\\0\\313\\313\\0\\346\\346\\0\\346\\346\\0\\211\"\n  \"\\211\\0\\313\\313\\0\\346\\346\\0\\346\\346\\0\\211\\211\\0\\313\\313\\0\\346\\346\\0\\346\\346\"\n  \"\\0\\211\\211\\0\\313\\313\\0\\346\\346\\0\\346\\346\\0\\211\\211\\0\\313\\313\\0\\346\\346\\0\"\n  \"\\346\\346\\0\\211\\211\\0\\313\\313\\0\\346\\346\\0\\346\\346\\0\\211\\211\\0\\313\\313\\0\\346\"\n  \"\\346\\0\\346\\346\\0\\211\\211\\0\\313\\313\\0\\346\\346\\0\\346\\346\\0\\211\\211\\0\\320\\320\"\n  \"\\0\\327\\327\\0\\327\\327\\0\\322\\322\\0\\276\\276\\0\\322\\322\\0\\322\\322\\0\\305\\305\\0\"\n  \"yy\\0\\210\\210\\0\\210\\210\\0dd\\0<<\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0<<\\0\\210\\210\\0\\240\"\n  \"\\240\\0\\240\\240\\0aa\\0\\266\\266\\0\\322\\322\\0\\322\\322\\0\\205\\205\\0\\327\\327\\0\\343\"\n  \"\\343\\0\\343\\343\\0\\215\\215\\0\\346\\346\\0\\357\\357\\0\\331\\331\\0\\222\\222\\0\\347\\347\"\n  \"\\0\\357\\357\\0\\331\\331\\0\\222\\222\\0\\347\\347\\0\\357\\357\\0\\331\\331\\0\\222\\222\\0\"\n  \"\\347\\347\\0\\357\\357\\0\\331\\331\\0\\222\\222\\0\\347\\347\\0\\357\\357\\0\\331\\331\\0\\222\"\n  \"\\222\\0\\347\\347\\0\\357\\357\\0\\331\\331\\0\\222\\222\\0\\347\\347\\0\\357\\357\\0\\331\\331\"\n  \"\\0\\222\\222\\0\\347\\347\\0\\357\\357\\0\\331\\331\\0\\222\\222\\0\\347\\347\\0\\357\\357\\0\"\n  \"\\331\\331\\0\\222\\222\\0\\357\\357\\0\\346\\346\\0\\320\\320\\0\\351\\351\\0\\327\\327\\0\\343\"\n  \"\\343\\0\\276\\276\\0\\333\\333\\0\\322\\322\\0\\266\\266\\0yy\\0\\240\\240\\0\\210\\210\\0\\240\"\n  \"\\240\\0<<\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0<<\\0\\240\\240\\0\\210\\210\\0\\240\\240\\0aa\\0ww\\0nn\\0\\177\"\n  \"\\177\\0MM\\0SS\\0OO\\0SS\\0\"\"22\\0WW\\0TT\\0XX\\0\"\"55\\0UU\\0UU\\0XX\\0\"\"55\\0UU\\0UU\\0\"\n  \"XX\\0\"\"55\\0UU\\0UU\\0XX\\0\"\"55\\0UU\\0UU\\0XX\\0\"\"55\\0UU\\0UU\\0XX\\0\"\"55\\0UU\\0UU\\0\"\n  \"XX\\0\"\"55\\0UU\\0UU\\0XX\\0\"\"55\\0UU\\0UU\\0XX\\0\"\"55\\0UU\\0XX\\0TT\\0TT\\0LL\\0OO\\0SS\"\n  \"\\0SS\\0ss\\0\\177\\177\\0nn\\0nn\\0yy\\0\\210\\210\\0\\240\\240\\0\\240\\240\\0<<\\0dd\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0<<\"\n  \"\\0\\240\\240\\0\\240\\240\\0\\210\\210\\0HH\\0\\205\\205\\0\\351\\351\\0\\333\\333\\0pp\\0\\225\"\n  \"\\225\\0\\371\\371\\0\\363\\363\\0\\202\\202\\0\\231\\231\\0\\330\\330\\0\\325\\325\\0\\203\\203\"\n  \"\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\"\n  \"\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\"\n  \"\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\"\n  \"\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\"\n  \"\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\325\\325\\0\\231\\231\\0\\231\"\n  \"\\231\\0\\330\\330\\0\\323\\323\\0\\371\\371\\0\\371\\371\\0\\274\\274\\0\\257\\257\\0\\351\\351\"\n  \"\\0\\351\\351\\0\\205\\205\\0``\\0\\240\\240\\0\\240\\240\\0\\240\\240\\0<<\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0<<\\0\\240\\240\"\n  \"\\0\\240\\240\\0RR\\0\\207\\207\\0\\304\\304\\0\\304\\304\\0nn\\0\\275\\275\\0\\343\\343\\0\\343\"\n  \"\\343\\0\\205\\205\\0\\324\\324\\0\\352\\352\\0\\352\\352\\0\\214\\214\\0\\316\\316\\0\\352\\352\"\n  \"\\0\\352\\352\\0\\213\\213\\0\\316\\316\\0\\352\\352\\0\\352\\352\\0\\213\\213\\0\\316\\316\\0\"\n  \"\\352\\352\\0\\352\\352\\0\\213\\213\\0\\316\\316\\0\\352\\352\\0\\352\\352\\0\\213\\213\\0\\316\"\n  \"\\316\\0\\352\\352\\0\\352\\352\\0\\213\\213\\0\\316\\316\\0\\352\\352\\0\\352\\352\\0\\213\\213\"\n  \"\\0\\316\\316\\0\\352\\352\\0\\352\\352\\0\\213\\213\\0\\316\\316\\0\\352\\352\\0\\352\\352\\0\"\n  \"\\213\\213\\0\\316\\316\\0\\352\\352\\0\\352\\352\\0\\214\\214\\0\\324\\324\\0\\336\\336\\0\\336\"\n  \"\\336\\0\\331\\331\\0\\310\\310\\0\\343\\343\\0\\343\\343\\0\\325\\325\\0\\217\\217\\0\\254\\254\"\n  \"\\0\\254\\254\\0\\207\\207\\0aa\\0\\240\\240\\0\\240\\240\\0<<\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0\\240\\240\\0aa\"\n  \"\\0\\225\\225\\0\\304\\304\\0\\304\\304\\0\\205\\205\\0\\276\\276\\0\\343\\343\\0\\340\\340\\0\"\n  \"\\222\\222\\0\\333\\333\\0\\352\\352\\0\\351\\351\\0\\226\\226\\0\\347\\347\\0\\362\\362\\0\\333\"\n  \"\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\"\n  \"\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\"\n  \"\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\"\n  \"\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\"\n  \"\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\362\\362\\0\\351\\351\\0\\323\\323\\0\"\n  \"\\366\\366\\0\\336\\336\\0\\351\\351\\0\\304\\304\\0\\351\\351\\0\\343\\343\\0\\304\\304\\0\\217\"\n  \"\\217\\0\\333\\333\\0\\254\\254\\0\\266\\266\\0aa\\0\\240\\240\\0\\240\\240\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0aa\"\n  \"\\0\\305\\305\\0\\225\\225\\0\\304\\304\\0ww\\0\\205\\205\\0ss\\0\\211\\211\\0RR\\0VV\\0PP\\0\"\n  \"VV\\0\"\"33\\0XX\\0UU\\0YY\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0YY\\0UU\\0UU\\0MM\\0QQ\\0UU\\0UU\\0ww\\0\\211\\211\"\n  \"\\0ww\\0||\\0\\217\\217\\0\\254\\254\\0\\266\\266\\0\\305\\305\\0aa\\0\\240\\240\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0aa\\0\\305\"\n  \"\\305\\0\\305\\305\\0\\225\\225\\0UU\\0\\222\\222\\0\\366\\366\\0\\340\\340\\0tt\\0\\231\\231\"\n  \"\\0\\375\\375\\0\\364\\364\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\203\\203\\0\"\n  \"\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\"\n  \"\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\"\n  \"\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\"\n  \"\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\"\n  \"\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\231\\231\\0\\231\\231\"\n  \"\\0\\331\\331\\0\\324\\324\\0\\373\\373\\0\\375\\375\\0\\300\\300\\0\\263\\263\\0\\361\\361\\0\"\n  \"\\366\\366\\0\\222\\222\\0mm\\0\\266\\266\\0\\305\\305\\0\\305\\305\\0aa\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0<<\\0\\305\\305\\0\"\n  \"\\305\\305\\0``\\0\\214\\214\\0\\321\\321\\0\\321\\321\\0rr\\0\\277\\277\\0\\346\\346\\0\\346\"\n  \"\\346\\0\\206\\206\\0\\324\\324\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\316\\316\\0\\353\\353\"\n  \"\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\"\n  \"\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\"\n  \"\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\"\n  \"\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\"\n  \"\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\324\\324\\0\\337\\337\\0\\337\"\n  \"\\337\\0\\331\\331\\0\\312\\312\\0\\346\\346\\0\\346\\346\\0\\330\\330\\0\\224\\224\\0\\271\\271\"\n  \"\\0\\271\\271\\0\\217\\217\\0nn\\0\\305\\305\\0\\305\\305\\0<<\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0\\305\\305\\0ww\"\n  \"\\0\\225\\225\\0\\304\\304\\0\\314\\314\\0\\222\\222\\0\\277\\277\\0\\343\\343\\0\\342\\342\\0\"\n  \"\\226\\226\\0\\333\\333\\0\\352\\352\\0\\351\\351\\0\\227\\227\\0\\350\\350\\0\\362\\362\\0\\333\"\n  \"\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\"\n  \"\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\"\n  \"\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\"\n  \"\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\"\n  \"\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\362\\362\\0\\351\\351\\0\\323\\323\\0\"\n  \"\\370\\370\\0\\336\\336\\0\\352\\352\\0\\306\\306\\0\\354\\354\\0\\344\\344\\0\\305\\305\\0\\227\"\n  \"\\227\\0\\343\\343\\0\\254\\254\\0\\266\\266\\0ww\\0\\305\\305\\0\\240\\240\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0aa\"\n  \"\\0\\333\\333\\0\\236\\236\\0\\304\\304\\0ww\\0\\210\\210\\0tt\\0\\211\\211\\0RR\\0VV\\0PP\\0\"\n  \"VV\\0\"\"33\\0XX\\0UU\\0YY\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0YY\\0UU\\0UU\\0MM\\0QQ\\0UU\\0UU\\0ww\\0\\211\\211\"\n  \"\\0ww\\0}}\\0\\217\\217\\0\\254\\254\\0\\276\\276\\0\\333\\333\\0aa\\0\\240\\240\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0aa\\0\\305\"\n  \"\\305\\0\\305\\305\\0\\236\\236\\0XX\\0\\222\\222\\0\\366\\366\\0\\341\\341\\0tt\\0\\231\\231\"\n  \"\\0\\375\\375\\0\\364\\364\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\203\\203\\0\"\n  \"\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\"\n  \"\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\"\n  \"\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\"\n  \"\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\"\n  \"\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\231\\231\\0\\231\\231\"\n  \"\\0\\331\\331\\0\\324\\324\\0\\373\\373\\0\\375\\375\\0\\300\\300\\0\\263\\263\\0\\361\\361\\0\"\n  \"\\366\\366\\0\\222\\222\\0pp\\0\\276\\276\\0\\305\\305\\0\\305\\305\\0aa\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0<<\\0\\305\\305\\0\"\n  \"\\305\\305\\0``\\0\\217\\217\\0\\324\\324\\0\\324\\324\\0rr\\0\\300\\300\\0\\347\\347\\0\\347\"\n  \"\\347\\0\\206\\206\\0\\324\\324\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\316\\316\\0\\353\\353\"\n  \"\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\"\n  \"\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\"\n  \"\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\"\n  \"\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\"\n  \"\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\324\\324\\0\\337\\337\\0\\337\"\n  \"\\337\\0\\332\\332\\0\\312\\312\\0\\347\\347\\0\\347\\347\\0\\330\\330\\0\\224\\224\\0\\274\\274\"\n  \"\\0\\274\\274\\0\\222\\222\\0nn\\0\\305\\305\\0\\305\\305\\0<<\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0\\305\\305\\0ww\"\n  \"\\0\\225\\225\\0\\304\\304\\0\\314\\314\\0\\225\\225\\0\\300\\300\\0\\344\\344\\0\\342\\342\\0\"\n  \"\\226\\226\\0\\333\\333\\0\\352\\352\\0\\351\\351\\0\\227\\227\\0\\350\\350\\0\\362\\362\\0\\333\"\n  \"\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\"\n  \"\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\"\n  \"\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\"\n  \"\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\"\n  \"\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\362\\362\\0\\351\\351\\0\\323\\323\\0\"\n  \"\\370\\370\\0\\337\\337\\0\\352\\352\\0\\306\\306\\0\\355\\355\\0\\345\\345\\0\\306\\306\\0\\231\"\n  \"\\231\\0\\343\\343\\0\\254\\254\\0\\266\\266\\0ww\\0\\305\\305\\0\\240\\240\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0aa\"\n  \"\\0\\333\\333\\0\\236\\236\\0\\304\\304\\0ww\\0\\210\\210\\0tt\\0\\211\\211\\0RR\\0VV\\0PP\\0\"\n  \"VV\\0\"\"33\\0XX\\0UU\\0YY\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0YY\\0UU\\0UU\\0MM\\0QQ\\0UU\\0UU\\0ww\\0\\211\\211\"\n  \"\\0ww\\0}}\\0\\217\\217\\0\\254\\254\\0\\276\\276\\0\\333\\333\\0aa\\0\\240\\240\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0aa\\0\\305\"\n  \"\\305\\0\\305\\305\\0\\236\\236\\0XX\\0\\222\\222\\0\\366\\366\\0\\341\\341\\0tt\\0\\231\\231\"\n  \"\\0\\375\\375\\0\\364\\364\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\203\\203\\0\"\n  \"\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\"\n  \"\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\"\n  \"\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\"\n  \"\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\"\n  \"\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\231\\231\\0\\231\\231\"\n  \"\\0\\331\\331\\0\\324\\324\\0\\373\\373\\0\\375\\375\\0\\300\\300\\0\\263\\263\\0\\361\\361\\0\"\n  \"\\366\\366\\0\\222\\222\\0pp\\0\\276\\276\\0\\305\\305\\0\\305\\305\\0aa\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0<<\\0\\305\\305\\0\"\n  \"\\305\\305\\0``\\0\\217\\217\\0\\324\\324\\0\\324\\324\\0rr\\0\\300\\300\\0\\347\\347\\0\\347\"\n  \"\\347\\0\\206\\206\\0\\324\\324\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\316\\316\\0\\353\\353\"\n  \"\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\"\n  \"\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\"\n  \"\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\"\n  \"\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\"\n  \"\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\324\\324\\0\\337\\337\\0\\337\"\n  \"\\337\\0\\332\\332\\0\\312\\312\\0\\347\\347\\0\\347\\347\\0\\330\\330\\0\\224\\224\\0\\274\\274\"\n  \"\\0\\274\\274\\0\\222\\222\\0nn\\0\\305\\305\\0\\305\\305\\0<<\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0\\305\\305\\0ww\"\n  \"\\0\\225\\225\\0\\304\\304\\0\\314\\314\\0\\225\\225\\0\\300\\300\\0\\344\\344\\0\\342\\342\\0\"\n  \"\\226\\226\\0\\333\\333\\0\\352\\352\\0\\351\\351\\0\\227\\227\\0\\350\\350\\0\\362\\362\\0\\333\"\n  \"\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\"\n  \"\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\"\n  \"\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\"\n  \"\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\"\n  \"\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\362\\362\\0\\351\\351\\0\\323\\323\\0\"\n  \"\\370\\370\\0\\337\\337\\0\\352\\352\\0\\306\\306\\0\\355\\355\\0\\345\\345\\0\\306\\306\\0\\231\"\n  \"\\231\\0\\343\\343\\0\\254\\254\\0\\266\\266\\0ww\\0\\305\\305\\0\\240\\240\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0aa\"\n  \"\\0\\333\\333\\0\\236\\236\\0\\304\\304\\0ww\\0\\210\\210\\0tt\\0\\211\\211\\0RR\\0VV\\0PP\\0\"\n  \"VV\\0\"\"33\\0XX\\0UU\\0YY\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0YY\\0UU\\0UU\\0MM\\0QQ\\0UU\\0UU\\0ww\\0\\211\\211\"\n  \"\\0ww\\0}}\\0\\217\\217\\0\\254\\254\\0\\276\\276\\0\\333\\333\\0aa\\0\\240\\240\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0aa\\0\\305\"\n  \"\\305\\0\\305\\305\\0\\236\\236\\0XX\\0\\222\\222\\0\\366\\366\\0\\341\\341\\0tt\\0\\231\\231\"\n  \"\\0\\375\\375\\0\\364\\364\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\203\\203\\0\"\n  \"\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\"\n  \"\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\"\n  \"\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\"\n  \"\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\"\n  \"\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\231\\231\\0\\231\\231\"\n  \"\\0\\331\\331\\0\\324\\324\\0\\373\\373\\0\\375\\375\\0\\300\\300\\0\\263\\263\\0\\361\\361\\0\"\n  \"\\366\\366\\0\\222\\222\\0pp\\0\\276\\276\\0\\305\\305\\0\\305\\305\\0aa\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0<<\\0\\305\\305\\0\"\n  \"\\305\\305\\0``\\0\\217\\217\\0\\324\\324\\0\\324\\324\\0rr\\0\\300\\300\\0\\347\\347\\0\\347\"\n  \"\\347\\0\\206\\206\\0\\324\\324\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\316\\316\\0\\353\\353\"\n  \"\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\"\n  \"\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\"\n  \"\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\"\n  \"\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\"\n  \"\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\324\\324\\0\\337\\337\\0\\337\"\n  \"\\337\\0\\332\\332\\0\\312\\312\\0\\347\\347\\0\\347\\347\\0\\330\\330\\0\\224\\224\\0\\274\\274\"\n  \"\\0\\274\\274\\0\\222\\222\\0nn\\0\\305\\305\\0\\305\\305\\0<<\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0\\305\\305\\0ww\"\n  \"\\0\\225\\225\\0\\304\\304\\0\\314\\314\\0\\225\\225\\0\\300\\300\\0\\344\\344\\0\\342\\342\\0\"\n  \"\\226\\226\\0\\333\\333\\0\\352\\352\\0\\351\\351\\0\\227\\227\\0\\350\\350\\0\\362\\362\\0\\333\"\n  \"\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\"\n  \"\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\"\n  \"\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\"\n  \"\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\"\n  \"\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\362\\362\\0\\351\\351\\0\\323\\323\\0\"\n  \"\\370\\370\\0\\337\\337\\0\\352\\352\\0\\306\\306\\0\\355\\355\\0\\345\\345\\0\\306\\306\\0\\231\"\n  \"\\231\\0\\343\\343\\0\\254\\254\\0\\266\\266\\0ww\\0\\305\\305\\0\\240\\240\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0aa\"\n  \"\\0\\333\\333\\0\\236\\236\\0\\304\\304\\0ww\\0\\210\\210\\0tt\\0\\211\\211\\0RR\\0VV\\0PP\\0\"\n  \"VV\\0\"\"33\\0XX\\0UU\\0YY\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0UU\\0\"\n  \"XX\\0\"\"66\\0UU\\0UU\\0XX\\0\"\"66\\0UU\\0YY\\0UU\\0UU\\0MM\\0QQ\\0UU\\0UU\\0ww\\0\\211\\211\"\n  \"\\0ww\\0}}\\0\\217\\217\\0\\254\\254\\0\\276\\276\\0\\333\\333\\0aa\\0\\240\\240\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0aa\\0\\305\"\n  \"\\305\\0\\305\\305\\0\\236\\236\\0XX\\0\\222\\222\\0\\366\\366\\0\\341\\341\\0tt\\0\\231\\231\"\n  \"\\0\\375\\375\\0\\364\\364\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\203\\203\\0\"\n  \"\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\"\n  \"\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\"\n  \"\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\"\n  \"\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\"\n  \"\\331\\0\\324\\324\\0\\203\\203\\0\\231\\231\\0\\331\\331\\0\\326\\326\\0\\231\\231\\0\\231\\231\"\n  \"\\0\\331\\331\\0\\324\\324\\0\\373\\373\\0\\375\\375\\0\\300\\300\\0\\263\\263\\0\\361\\361\\0\"\n  \"\\366\\366\\0\\222\\222\\0pp\\0\\276\\276\\0\\305\\305\\0\\305\\305\\0aa\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0<<\\0\\305\\305\\0\"\n  \"\\305\\305\\0``\\0\\217\\217\\0\\324\\324\\0\\324\\324\\0rr\\0\\300\\300\\0\\347\\347\\0\\347\"\n  \"\\347\\0\\206\\206\\0\\324\\324\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\316\\316\\0\\353\\353\"\n  \"\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\"\n  \"\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\"\n  \"\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\"\n  \"\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\"\n  \"\\213\\213\\0\\316\\316\\0\\353\\353\\0\\353\\353\\0\\215\\215\\0\\324\\324\\0\\337\\337\\0\\337\"\n  \"\\337\\0\\332\\332\\0\\312\\312\\0\\347\\347\\0\\347\\347\\0\\330\\330\\0\\224\\224\\0\\274\\274\"\n  \"\\0\\274\\274\\0\\222\\222\\0nn\\0\\305\\305\\0\\305\\305\\0<<\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0\\305\\305\\0ww\"\n  \"\\0\\225\\225\\0\\304\\304\\0\\314\\314\\0\\225\\225\\0\\300\\300\\0\\344\\344\\0\\342\\342\\0\"\n  \"\\226\\226\\0\\333\\333\\0\\352\\352\\0\\351\\351\\0\\227\\227\\0\\350\\350\\0\\362\\362\\0\\333\"\n  \"\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\"\n  \"\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\"\n  \"\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\"\n  \"\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\"\n  \"\\0\\351\\351\\0\\361\\361\\0\\333\\333\\0\\230\\230\\0\\362\\362\\0\\351\\351\\0\\323\\323\\0\"\n  \"\\370\\370\\0\\337\\337\\0\\352\\352\\0\\306\\306\\0\\355\\355\\0\\345\\345\\0\\306\\306\\0\\231\"\n  \"\\231\\0\\343\\343\\0\\254\\254\\0\\266\\266\\0ww\\0\\305\\305\\0\\240\\240\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0aa\"\n  \"\\0\\333\\333\\0\\236\\236\\0\\304\\304\\0ww\\0\\340\\340\\0\\300\\300\\0\\343\\343\\0\\210\\210\"\n  \"\\0\\354\\354\\0\\333\\333\\0\\352\\352\\0\\215\\215\\0\\361\\361\\0\\350\\350\\0\\362\\362\\0\"\n  \"\\223\\223\\0\\351\\351\\0\\351\\351\\0\\361\\361\\0\\223\\223\\0\\351\\351\\0\\351\\351\\0\\361\"\n  \"\\361\\0\\223\\223\\0\\351\\351\\0\\351\\351\\0\\361\\361\\0\\223\\223\\0\\351\\351\\0\\351\\351\"\n  \"\\0\\361\\361\\0\\223\\223\\0\\351\\351\\0\\351\\351\\0\\361\\361\\0\\223\\223\\0\\351\\351\\0\"\n  \"\\351\\351\\0\\361\\361\\0\\223\\223\\0\\351\\351\\0\\351\\351\\0\\361\\361\\0\\223\\223\\0\\351\"\n  \"\\351\\0\\351\\351\\0\\361\\361\\0\\223\\223\\0\\351\\351\\0\\362\\362\\0\\351\\351\\0\\351\\351\"\n  \"\\0\\323\\323\\0\\336\\336\\0\\351\\351\\0\\351\\351\\0\\304\\304\\0\\343\\343\\0\\305\\305\\0\"\n  \"\\317\\317\\0\\217\\217\\0\\254\\254\\0\\276\\276\\0\\333\\333\\0aa\\0\\240\\240\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0aa\\0\\305\"\n  \"\\305\\0\\305\\305\\0\\236\\236\\0\\222\\222\\0\\361\\361\\0\\361\\361\\0\\316\\316\\0\\230\\230\"\n  \"\\0\\373\\373\\0\\373\\373\\0\\344\\344\\0\\231\\231\\0\\375\\375\\0\\375\\375\\0\\357\\357\\0\"\n  \"\\231\\231\\0\\375\\375\\0\\375\\375\\0\\347\\347\\0\\231\\231\\0\\375\\375\\0\\375\\375\\0\\347\"\n  \"\\347\\0\\231\\231\\0\\375\\375\\0\\375\\375\\0\\347\\347\\0\\231\\231\\0\\375\\375\\0\\375\\375\"\n  \"\\0\\347\\347\\0\\231\\231\\0\\375\\375\\0\\375\\375\\0\\347\\347\\0\\231\\231\\0\\375\\375\\0\"\n  \"\\375\\375\\0\\347\\347\\0\\231\\231\\0\\375\\375\\0\\375\\375\\0\\347\\347\\0\\231\\231\\0\\375\"\n  \"\\375\\0\\375\\375\\0\\347\\347\\0\\231\\231\\0\\375\\375\\0\\375\\375\\0\\360\\360\\0\\373\\373\"\n  \"\\0\\375\\375\\0\\375\\375\\0\\347\\347\\0\\367\\367\\0\\373\\373\\0\\373\\373\\0\\326\\326\\0\"\n  \"\\351\\351\\0\\361\\361\\0\\361\\361\\0\\271\\271\\0\\276\\276\\0\\305\\305\\0\\305\\305\\0aa\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0<<\\0\\305\\305\\0\\305\\305\\0\\236\\236\\0HH\\0\\271\\271\\0\\271\\271\\0\\224\\224\\0VV\"\n  \"\\0\\277\\277\\0\\277\\277\\0\\251\\251\\0DD\\0\\252\\252\\0\\252\\252\\0\\235\\235\\0FF\\0\\253\"\n  \"\\253\\0\\253\\253\\0\\224\\224\\0EE\\0\\253\\253\\0\\253\\253\\0\\224\\224\\0EE\\0\\253\\253\"\n  \"\\0\\253\\253\\0\\224\\224\\0EE\\0\\253\\253\\0\\253\\253\\0\\224\\224\\0EE\\0\\253\\253\\0\\253\"\n  \"\\253\\0\\224\\224\\0EE\\0\\253\\253\\0\\253\\253\\0\\224\\224\\0EE\\0\\253\\253\\0\\253\\253\"\n  \"\\0\\224\\224\\0EE\\0\\253\\253\\0\\253\\253\\0\\224\\224\\0EE\\0\\253\\253\\0\\253\\253\\0\\235\"\n  \"\\235\\0rr\\0uu\\0uu\\0^^\\0\\272\\272\\0\\277\\277\\0\\277\\277\\0\\230\\230\\0\\205\\205\\0\"\n  \"\\222\\222\\0\\222\\222\\0MM\\0\\266\\266\\0\\305\\305\\0\\305\\305\\0<<\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0\\305\"\n  \"\\305\\0\\305\\305\\0RR\\0\\236\\236\\0\\254\\254\\0\\361\\361\\0VV\\0\\267\\267\\0\\263\\263\"\n  \"\\0\\356\\356\\0ee\\0\\247\\247\\0\\244\\244\\0\\356\\356\\0^^\\0\\251\\251\\0\\247\\247\\0\\365\"\n  \"\\365\\0bb\\0\\242\\242\\0\\247\\247\\0\\365\\365\\0bb\\0\\242\\242\\0\\247\\247\\0\\365\\365\"\n  \"\\0bb\\0\\242\\242\\0\\247\\247\\0\\365\\365\\0bb\\0\\242\\242\\0\\247\\247\\0\\365\\365\\0bb\"\n  \"\\0\\242\\242\\0\\247\\247\\0\\365\\365\\0bb\\0\\242\\242\\0\\247\\247\\0\\365\\365\\0bb\\0\\242\"\n  \"\\242\\0\\247\\247\\0\\365\\365\\0bb\\0\\242\\242\\0\\247\\247\\0\\365\\365\\0\\252\\252\\0ee\"\n  \"\\0jj\\0\\345\\345\\0tt\\0\\246\\246\\0\\251\\251\\0\\321\\321\\0\\272\\272\\0ff\\0\\222\\222\"\n  \"\\0\\322\\322\\0ww\\0\\210\\210\\0\\305\\305\\0\\305\\305\\0\\240\\240\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0\\240\\240\"\n  \"\\0\\305\\305\\0``\\0\\236\\236\\0\\236\\236\\0\\254\\254\\0VV\\0\\264\\264\\0\\254\\254\\0\\261\"\n  \"\\261\\0dd\\0\\246\\246\\0\\240\\240\\0\\243\\243\\0^^\\0\\251\\251\\0\\246\\246\\0\\246\\246\"\n  \"\\0bb\\0\\242\\242\\0\\246\\246\\0\\246\\246\\0bb\\0\\242\\242\\0\\246\\246\\0\\246\\246\\0bb\"\n  \"\\0\\242\\242\\0\\246\\246\\0\\246\\246\\0bb\\0\\242\\242\\0\\246\\246\\0\\246\\246\\0bb\\0\\242\"\n  \"\\242\\0\\246\\246\\0\\246\\246\\0bb\\0\\242\\242\\0\\246\\246\\0\\246\\246\\0bb\\0\\242\\242\"\n  \"\\0\\246\\246\\0\\246\\246\\0bb\\0\\242\\242\\0\\246\\246\\0\\246\\246\\0\\251\\251\\0dd\\0hh\"\n  \"\\0hh\\0pp\\0\\243\\243\\0\\240\\240\\0\\236\\236\\0\\264\\264\\0cc\\0\\177\\177\\0ww\\0ww\\0\"\n  \"\\225\\225\\0\\305\\305\\0\\240\\240\\0\\240\\240\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\240\\240\\0\\240\\240\\0\\240\\240\\0``\"\n  \"\\0\\351\\351\\0\\333\\333\\0\\333\\333\\0||\\0\\366\\366\\0\\361\\361\\0\\361\\361\\0\\211\\211\"\n  \"\\0\\373\\373\\0\\371\\371\\0\\371\\371\\0\\221\\221\\0\\375\\375\\0\\374\\374\\0\\374\\374\\0\"\n  \"\\224\\224\\0\\365\\365\\0\\374\\374\\0\\374\\374\\0\\224\\224\\0\\365\\365\\0\\374\\374\\0\\374\"\n  \"\\374\\0\\224\\224\\0\\365\\365\\0\\374\\374\\0\\374\\374\\0\\224\\224\\0\\365\\365\\0\\374\\374\"\n  \"\\0\\374\\374\\0\\224\\224\\0\\365\\365\\0\\374\\374\\0\\374\\374\\0\\224\\224\\0\\365\\365\\0\"\n  \"\\374\\374\\0\\374\\374\\0\\224\\224\\0\\365\\365\\0\\374\\374\\0\\374\\374\\0\\224\\224\\0\\365\"\n  \"\\365\\0\\374\\374\\0\\374\\374\\0\\375\\375\\0\\356\\356\\0\\371\\371\\0\\371\\371\\0\\372\\372\"\n  \"\\0\\340\\340\\0\\361\\361\\0\\361\\361\\0\\364\\364\\0\\307\\307\\0\\333\\333\\0\\333\\333\\0\"\n  \"\\351\\351\\0\\225\\225\\0\\240\\240\\0\\240\\240\\0\\240\\240\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\240\\240\\0\\240\\240\"\n  \"\\0aa\\0\\304\\304\\0\\351\\351\\0\\351\\351\\0\\205\\205\\0\\340\\340\\0\\366\\366\\0\\366\\366\"\n  \"\\0\\222\\222\\0\\355\\355\\0\\373\\373\\0\\373\\373\\0\\227\\227\\0\\364\\364\\0\\375\\375\\0\"\n  \"\\375\\375\\0\\230\\230\\0\\360\\360\\0\\375\\375\\0\\375\\375\\0\\230\\230\\0\\360\\360\\0\\375\"\n  \"\\375\\0\\375\\375\\0\\230\\230\\0\\360\\360\\0\\375\\375\\0\\375\\375\\0\\230\\230\\0\\360\\360\"\n  \"\\0\\375\\375\\0\\375\\375\\0\\230\\230\\0\\360\\360\\0\\375\\375\\0\\375\\375\\0\\230\\230\\0\"\n  \"\\360\\360\\0\\375\\375\\0\\375\\375\\0\\230\\230\\0\\360\\360\\0\\375\\375\\0\\375\\375\\0\\230\"\n  \"\\230\\0\\360\\360\\0\\375\\375\\0\\375\\375\\0\\373\\373\\0\\356\\356\\0\\373\\373\\0\\373\\373\"\n  \"\\0\\367\\367\\0\\340\\340\\0\\364\\364\\0\\364\\364\\0\\354\\354\\0\\304\\304\\0\\351\\351\\0\"\n  \"\\351\\351\\0\\322\\322\\0\\210\\210\\0\\240\\240\\0\\240\\240\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0\\240\\240\\0\\240\"\n  \"\\240\\0<<\\0\\240\\240\\0\\305\\305\\0\\351\\351\\0ww\\0\\320\\320\\0\\301\\301\\0\\324\\324\"\n  \"\\0\\211\\211\\0\\345\\345\\0\\316\\316\\0\\324\\324\\0\\217\\217\\0\\356\\356\\0\\323\\323\\0\"\n  \"\\326\\326\\0\\223\\223\\0\\354\\354\\0\\323\\323\\0\\326\\326\\0\\223\\223\\0\\354\\354\\0\\323\"\n  \"\\323\\0\\326\\326\\0\\223\\223\\0\\354\\354\\0\\323\\323\\0\\326\\326\\0\\223\\223\\0\\354\\354\"\n  \"\\0\\323\\323\\0\\326\\326\\0\\223\\223\\0\\354\\354\\0\\323\\323\\0\\326\\326\\0\\223\\223\\0\"\n  \"\\354\\354\\0\\323\\323\\0\\326\\326\\0\\223\\223\\0\\354\\354\\0\\323\\323\\0\\326\\326\\0\\223\"\n  \"\\223\\0\\354\\354\\0\\323\\323\\0\\326\\326\\0\\362\\362\\0\\344\\344\\0\\261\\261\\0\\272\\272\"\n  \"\\0\\364\\364\\0\\340\\340\\0\\225\\225\\0\\205\\205\\0\\340\\340\\0\\276\\276\\0\\351\\351\\0\"\n  \"\\266\\266\\0\\240\\240\\0dd\\0\\240\\240\\0\\240\\240\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\240\\240\\0aa\\0\\240\"\n  \"\\240\\0\\240\\240\\0\\305\\305\\0ww\\0\\305\\305\\0\\240\\240\\0\\266\\266\\0\\205\\205\\0\\333\"\n  \"\\333\\0\\266\\266\\0\\304\\304\\0\\215\\215\\0\\352\\352\\0\\305\\305\\0\\314\\314\\0\\222\\222\"\n  \"\\0\\352\\352\\0\\305\\305\\0\\314\\314\\0\\222\\222\\0\\352\\352\\0\\305\\305\\0\\314\\314\\0\"\n  \"\\222\\222\\0\\352\\352\\0\\305\\305\\0\\314\\314\\0\\222\\222\\0\\352\\352\\0\\305\\305\\0\\314\"\n  \"\\314\\0\\222\\222\\0\\352\\352\\0\\305\\305\\0\\314\\314\\0\\222\\222\\0\\352\\352\\0\\305\\305\"\n  \"\\0\\314\\314\\0\\222\\222\\0\\352\\352\\0\\305\\305\\0\\314\\314\\0\\222\\222\\0\\352\\352\\0\"\n  \"\\305\\305\\0\\314\\314\\0\\361\\361\\0\\335\\335\\0\\242\\242\\0\\236\\236\\0\\333\\333\\0\\312\"\n  \"\\312\\0ii\\0aa\\0\\305\\305\\0\\255\\255\\0\\266\\266\\0\\240\\240\\0\\240\\240\\0\\210\\210\"\n  \"\\0\\240\\240\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0aa\\0\\305\\305\\0\\240\\240\\0\\240\\240\\0ww\\0\\333\"\n  \"\\333\\0\\305\\305\\0\\305\\305\\0\\205\\205\\0\\351\\351\\0\\333\\333\\0\\333\\333\\0\\217\\217\"\n  \"\\0\\363\\363\\0\\351\\351\\0\\351\\351\\0\\223\\223\\0\\357\\357\\0\\351\\351\\0\\351\\351\\0\"\n  \"\\223\\223\\0\\357\\357\\0\\351\\351\\0\\351\\351\\0\\223\\223\\0\\357\\357\\0\\351\\351\\0\\351\"\n  \"\\351\\0\\223\\223\\0\\357\\357\\0\\351\\351\\0\\351\\351\\0\\223\\223\\0\\357\\357\\0\\351\\351\"\n  \"\\0\\351\\351\\0\\223\\223\\0\\357\\357\\0\\351\\351\\0\\351\\351\\0\\223\\223\\0\\357\\357\\0\"\n  \"\\351\\351\\0\\351\\351\\0\\223\\223\\0\\357\\357\\0\\351\\351\\0\\351\\351\\0\\363\\363\\0\\345\"\n  \"\\345\\0\\333\\333\\0\\333\\333\\0\\340\\340\\0\\312\\312\\0\\305\\305\\0\\305\\305\\0\\322\\322\"\n  \"\\0\\255\\255\\0\\240\\240\\0\\240\\240\\0\\305\\305\\0\\210\\210\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\"\n  \"\\0dd\\0dd\\0aa\\0\\305\\305\\0\\305\\305\\0\\240\\240\\0ww\\0\\333\\333\\0\\333\\333\\0\\305\"\n  \"\\305\\0\\205\\205\\0\\355\\355\\0\\355\\355\\0\\336\\336\\0\\215\\215\\0\\364\\364\\0\\364\\364\"\n  \"\\0\\335\\335\\0\\215\\215\\0\\364\\364\\0\\364\\364\\0\\335\\335\\0\\215\\215\\0\\364\\364\\0\"\n  \"\\364\\364\\0\\335\\335\\0\\215\\215\\0\\364\\364\\0\\364\\364\\0\\335\\335\\0\\215\\215\\0\\364\"\n  \"\\364\\0\\364\\364\\0\\335\\335\\0\\215\\215\\0\\364\\364\\0\\364\\364\\0\\335\\335\\0\\215\\215\"\n  \"\\0\\364\\364\\0\\364\\364\\0\\335\\335\\0\\215\\215\\0\\364\\364\\0\\364\\364\\0\\335\\335\\0\"\n  \"\\215\\215\\0\\364\\364\\0\\364\\364\\0\\335\\335\\0\\351\\351\\0\\355\\355\\0\\355\\355\\0\\312\"\n  \"\\312\\0\\305\\305\\0\\322\\322\\0\\322\\322\\0\\255\\255\\0\\240\\240\\0\\305\\305\\0\\305\\305\"\n  \"\\0\\210\\210\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0\\305\\305\\0aa\"\n  \"\\0\"\"11\\0\\225\\225\\0\\351\\351\\0\\205\\205\\0HH\\0\\254\\254\\0\\333\\333\\0ww\\0BB\\0\\264\"\n  \"\\264\\0\\340\\340\\0nn\\0BB\\0\\264\\264\\0\\340\\340\\0nn\\0BB\\0\\264\\264\\0\\340\\340\\0\"\n  \"nn\\0BB\\0\\264\\264\\0\\340\\340\\0nn\\0BB\\0\\264\\264\\0\\340\\340\\0nn\\0BB\\0\\264\\264\"\n  \"\\0\\340\\340\\0nn\\0BB\\0\\264\\264\\0\\340\\340\\0nn\\0BB\\0\\264\\264\\0\\340\\340\\0nn\\0\"\n  \"BB\\0\\264\\264\\0\\340\\340\\0nn\\0nn\\0\\205\\205\\0\\314\\314\\0\\266\\266\\0\\304\\304\\0\"\n  \"\\351\\351\\0\\236\\236\\0yy\\0\\210\\210\\0\\305\\305\\0<<\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\"\n  \"\\0dd\\0dd\\0\\25\\25\\0\\14\\14\\0dd\\0dd\\0\\25\\25\\0\\14\\14\\0dd\\0dd\\0\\25\\25\\0\\14\\14\"\n  \"\\0dd\\0dd\\0\\25\\25\\0\\14\\14\\0dd\\0dd\\0\\25\\25\\0\\14\\14\\0dd\\0dd\\0\\25\\25\\0\\14\\14\"\n  \"\\0dd\\0dd\\0\\25\\25\\0\\14\\14\\0dd\\0dd\\0\\25\\25\\0\\14\\14\\0dd\\0dd\\0\\25\\25\\0\\14\\14\"\n  \"\\0dd\\0dd\\0\\25\\25\\0\\25\\25\\0\\0\\0\\0\\0\\0\\0$$\\0$$\\0\\0\\0\\0\\0\\0\\0<<\\0<<\\0\\0\\0\\0\"\n  \"\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\"\n  \"\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0yy\\0yy\\0\\0\\0\\0\\0\\0\\0yy\\0yy\\0\\0\\0\\0\\0\\0\\0\"\n  \"yy\\0yy\\0\\0\\0\\0\\0\\0\\0yy\\0yy\\0\\0\\0\\0\\0\\0\\0yy\\0yy\\0\\0\\0\\0\\0\\0\\0yy\\0yy\\0\\0\\0\"\n  \"\\0\\0\\0\\0yy\\0yy\\0\\0\\0\\0\\0\\0\\0yy\\0yy\\0\\0\\0\\0\\0\\0\\0yy\\0yy\\0\\0\\0\\0\\0\\0\\0yy\\0\"\n  \"yy\\0\\0\\0\\0\\0\\0\\0$$\\0$$\\0\\0\\0\\0\\0\\0\\0<<\\0<<\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0dd\\0dd\\0dd\\0\\0\\0\\0dd\\0dd\\0dd\\0\\0\\0\\0dd\"\n  \"\\0\\210\\210\\0\\210\\210\\0\\25\\25\\0dd\\0\\210\\210\\0\\210\\210\\0\\25\\25\\0dd\\0\\210\\210\"\n  \"\\0\\210\\210\\0\\25\\25\\0dd\\0\\210\\210\\0\\210\\210\\0\\25\\25\\0dd\\0\\210\\210\\0\\210\\210\"\n  \"\\0\\25\\25\\0dd\\0\\210\\210\\0\\210\\210\\0\\25\\25\\0dd\\0\\210\\210\\0\\210\\210\\0\\25\\25\"\n  \"\\0dd\\0\\210\\210\\0\\210\\210\\0\\25\\25\\0dd\\0\\210\\210\\0\\210\\210\\0\\25\\25\\0dd\\0\\210\"\n  \"\\210\\0\\210\\210\\0\\25\\25\\0dd\\0\\210\\210\\0\\210\\210\\0$$\\0\\0\\0\\0<<\\0<<\\0<<\\0\\0\"\n  \"\\0\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0dd\\0dd\\0<<\\0<<\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0\"\n  \"aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\"\n  \"\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\"\n  \"\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0\"\n  \"aa\\0aa\\0\\240\\240\\0\\240\\240\\0aa\\0aa\\0\\240\\240\\0\\240\\240\\0\\240\\240\\0\\240\\240\"\n  \"\\0dd\\0dd\\0dd\\0dd\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\",\n};\n\n/**\n * \\brief Returns the BlitBlend test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImageBlitBlend()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imageBlitBlend.pixel_data,\n        SDLTest_imageBlitBlend.width,\n        SDLTest_imageBlitBlend.height,\n        SDLTest_imageBlitBlend.bytes_per_pixel * 8,\n        SDLTest_imageBlitBlend.width * SDLTest_imageBlitBlend.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n\nconst SDLTest_SurfaceImage_t SDLTest_imageBlitBlendMod = {\n  80, 60, 3,\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\",\n};\n\n/**\n * \\brief Returns the BlitBlendMod test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImageBlitBlendMod()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imageBlitBlendMod.pixel_data,\n        SDLTest_imageBlitBlendMod.width,\n        SDLTest_imageBlitBlendMod.height,\n        SDLTest_imageBlitBlendMod.bytes_per_pixel * 8,\n        SDLTest_imageBlitBlendMod.width * SDLTest_imageBlitBlendMod.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n\nconst SDLTest_SurfaceImage_t SDLTest_imageBlitBlendNone = {\n  80, 60, 3,\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\"\n  \"\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\377\\0\\0\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\377\\0\\0\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\0\\0\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\"\n  \"\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\377\\377\\0\\0\\0\\0\\0\\0\\0\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\",\n};\n\n/**\n * \\brief Returns the BlitBlendNone test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImageBlitBlendNone()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imageBlitBlendNone.pixel_data,\n        SDLTest_imageBlitBlendNone.width,\n        SDLTest_imageBlitBlendNone.height,\n        SDLTest_imageBlitBlendNone.bytes_per_pixel * 8,\n        SDLTest_imageBlitBlendNone.width * SDLTest_imageBlitBlendNone.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n\nconst SDLTest_SurfaceImage_t SDLTest_imageBlitBlendAll = {\n  80, 60, 3,\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\4\\0\\0\\4\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\11\\0\\0\\11\\0\\0\\0\\0\\0\\0\\0\\0\\16\\0\\0\\16\\0\\0\\0\\0\\0\\0\\0\\0\\11\\0\\0\\11\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\14\\0\\0\\14\\0\\0\\0\\0\\0\\0\\0\\0\\17\\0\\0\\17\\0\\0\\0\\0\\0\\0\\0\\0\\21\\0\\0\\21\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0K\\0\\0K\\0\\0\\0\\0\\0\\0\\0\\0T\\0\\0T\\0\\0\\0\\0\\0\\0\\0\\0^\\0\\0^\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0g\\0\\0g\\0\\0\\0\\0\\0\\0\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\"\n  \"\\0\\0\\317\\0\\0\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\4\\0\\0\\4\\0\\0\\4\\0\\0\\0\\0\\0\\11\\0\\0\\11\\0\\0\\11\"\n  \"\\0\\0\\0\\0\\0\\16\\0\\0\\16\\0\\0\\16\\0\\0\\0\\0\\0\\22\\0\\0\\22\\0\\0\\11\\0\\0\\0\\0\\0\\14\\0\\0\\14\"\n  \"\\0\\0\\14\\0\\0\\0\\0\\0\\17\\0\\0\\17\\0\\0\\17\\0\\0\\0\\0\\0\\21\\0\\0\\21\\0\\0\\21\\0\\0\\0\\0\\0\\24\"\n  \"\\0\\0\\24\\0\\0K\\0\\0\\0\\0\\0T\\0\\0T\\0\\0T\\0\\0\\0\\0\\0^\\0\\0^\\0\\0^\\0\\0\\0\\0\\0g\\0\\0g\\0\"\n  \"\\0g\\0\\0\\0\\0\\0q\\0\\0q\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\"\n  \"\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\4\\0\\0\\4\\0\\0\\4\\0\\0\\0\\0\\0\\11\\0\\0\\11\\0\\0\\11\\0\\0\\0\\0\\0\"\n  \"\\16\\0\\0\\16\\0\\0\\16\\0\\0\\0\\0\\0\\22\\0\\0\\22\\0\\0\\22\\0\\0\\0\\0\\0\\14\\0\\0\\14\\0\\0\\14\\0\"\n  \"\\0\\0\\0\\0\\17\\0\\0\\17\\0\\0\\17\\0\\0\\0\\0\\0\\21\\0\\0\\21\\0\\0\\21\\0\\0\\0\\0\\0\\24\\0\\0\\24\"\n  \"\\0\\0\\24\\0\\0\\0\\0\\0T\\0\\0T\\0\\0T\\0\\0\\0\\0\\0^\\0\\0^\\0\\0^\\0\\0\\0\\0\\0g\\0\\0g\\0\\0g\\0\"\n  \"\\0\\0\\0\\0q\\0\\0q\\0\\0q\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\"\n  \"\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\4\\0\\0\\4\\0\\0\\4\\0\\0\\0\\0\\0\\10\\0\\0\\10\\0\\0\\10\\0\\0\\0\\0\\0\\15\"\n  \"\\0\\0\\15\\0\\0\\15\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\16\\0\\0\\16\\0\\0\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0J\\0\\0J\\0\\0J\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\317\"\n  \"\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\1\\0\\0\\1\\0\\0\\1\"\n  \"\\0\\0\\4\\0\\0\\4\\0\\0\\0\\0\\0\\0\\0\\0\\7\\0\\0\\7\\0\\0\\0\\0\\0\\0\\0\\0&\\0\\0&\\0\\0\\32\\0\\0\\32\"\n  \"\\0\\0&\\0\\0&\\0\\0&\\0\\0&\\0\\0C\\0\\0C\\0\\0\\0\\0\\0\\0\\0\\0^\\0\\0^\\0\\0\\0\\0\\0\\0\\0\\17\\251\"\n  \"\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\317\\0\\0\\317\\0\\0\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\6\\2\\0\\6\\2\\0\\0\\1\\0\\0\\0\\0\\0\\1\\0\\0\\1\\0\\0\\1\\0\\0\\1\\0\\0\\1\\0\\0\\1\\0\\0\"\n  \"\\17\\0\\0\\0\\0\\0\\4\\0\\0\\11\\0\\0\\11\\0\\0\\0\\0\\6+\\0\\6+\\0\\0&\\0\\0\\32\\0\\0&\\0\\0&\\0\\0&\"\n  \"\\0\\0&\\0\\0\"\"5\\0\\0\"\"5\\0\\2\\210\\0\\0\\0\\0\\0C\\0\\0|\\0\\0|\\0\\0\\0\\0\\17\\251\\0\\17\\251\"\n  \"\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\"\n  \"\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\317\\0\\0\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\"\n  \"\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\6\\2\\0\\6\\2\\0\\6\\2\\0\\0\\0\\0\\0\\1\\0\\0\\1\\0\\0\\1\\0\\0\\1\\0\\0\\1\\0\\0\\1\"\n  \"\\0\\0\\1\\0\\0\\0\\0\\0\\17\\0\\0\\17\\0\\0\\4\\0\\0\\0\\0\\6+\\0\\6+\\0\\6+\\0\\0\\32\\0\\0&\\0\\0&\\0\"\n  \"\\0&\\0\\0&\\0\\0\"\"5\\0\\0\"\"5\\0\\0\"\"5\\0\\0\\0\\0\\2\\210\\0\\2\\210\\0\\0C\\0\\0\\0\\0\\17\\251\\0\"\n  \"\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\\17\\251\\0\"\n  \"\\17\\251\\0\\17\\251\\0$\\360\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\317\\0\\0\\317\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"$\\360\\0$\\360\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\"\n  \"\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\14\\1\\0\\14\\1\\0\\14\\1\"\n  \"\\0\\14\\1\\0\\15\\1\\0\\15\\1\\0\\0\\0\\0\\0\\0\\0\\14\\2\\0\\14\\2\\0\\14\\2\\0\\14\\2\\0\\16\\2\\0\\16\"\n  \"\\2\\0\\0\\0\\0\\0\\0\\0\\14!\\0\\14!\\0\\14!\\0\\14!\\0\\17(\\0\\17(\\0\\0\\0\\0\\0\\0\\0\\14+\\0\\14\"\n  \"+\\0\\14+\\0\\14+\\0\\20\"\"9\\0\\20\"\"9\\0\\0\\0\\0\\0\\0\\0\\36\\215\\0\\36\\215\\0\\36\\215\\0\\36\"\n  \"\\215\\0(\\264\\0(\\264\\0\\0\\0\\0\\0\\0\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\"\n  \"\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\0\\0\\0\\0\\0\\0$\\360\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\36\\3\"\n  \"\\0\\36\\3\\0\\14\\1\\0\\14\\1\\0\\15\\1\\0\\15\\1\\0\\15\\1\\0\\0\\0\\0\\14\\2\\0\\14\\2\\0\\14\\2\\0\\14\"\n  \"\\2\\0\\16\\2\\0\\16\\2\\0\\16\\2\\0\\0\\0\\0\\14\\3\\0\\14\\3\\0\\14!\\0\\14!\\0\\17(\\0\\17(\\0\\17\"\n  \"(\\0\\0\\0\\0\\14+\\0\\14+\\0\\14+\\0\\14+\\0\\20\"\"9\\0\\20\"\"9\\0\\20\"\"9\\0\\0\\0\\0\\14\"\"7\\0\\14\"\n  \"\"\"7\\0\\36\\215\\0\\36\\215\\0(\\264\\0(\\264\\0(\\264\\0\\0\\0\\0\\36\\251\\0\\36\\251\\0\\36\\251\"\n  \"\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0H\\360\\0\"\n  \"H\\360\\0\\0\\0\\0$\\360\\0$\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\1\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\36\\3\\0\\36\\3\\0\\36\\3\\0\\14\\1\\0\\15\\1\\0\\15\\1\\0\\15\\1\"\n  \"\\0\\0\\0\\0\\14\\2\\0\\14\\2\\0\\14\\2\\0\\14\\2\\0\\16\\2\\0\\16\\2\\0\\16\\2\\0\\0\\0\\0\\14\\3\\0\\14\"\n  \"\\3\\0\\14\\3\\0\\14!\\0\\17(\\0\\17(\\0\\17(\\0\\0\\0\\0\\14+\\0\\14+\\0\\14+\\0\\14+\\0\\20\"\"9\\0\"\n  \"\\20\"\"9\\0\\20\"\"9\\0\\0\\0\\0\\14\"\"7\\0\\14\"\"7\\0\\14\"\"7\\0\\36\\215\\0(\\264\\0(\\264\\0(\\264\"\n  \"\\0\\0\\0\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0\\36\"\n  \"\\251\\0\\36\\251\\0\\36\\251\\0\\36\\251\\0H\\360\\0H\\360\\0H\\360\\0\\0\\0\\0$\\360\\0$\\360\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\13\\1\\0\\13\\1\\0\\13\\1\\0\\13\\1\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\11!\\0\"\n  \"\\11!\\0\\11!\\0\\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\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\23n\\0\\23n\\0\\23n\\0\\23n\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0H\\360\\0H\\360\\0H\\360\\0H\\360\\0\\0\\0\\0$\\360\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\1\\0\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\25\\0\\0\\25\\0\\0\\25\\0\\0\\27\\0\"\n  \"\\0\\13\\0\\0\\13\\0\\0\\1\\0\\0\\11\\0\\0\\4\\0\\0\\4\\0\\0\\0\\0\\0\\0\\0\\0\\25\\3\\0\\25\\3\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\25\\3\\0\\25\\3\\0\\25\\3\\0\\25\\3\\0\\3\\1\\0\\3\\1\\0\\2\\1\\0\\7\\5\\0\\7\\3\\0\\7\\3\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\25\"\"4\\0\\25\"\"4\\0\\0\\0\\0\\0\\0\\0\\25\"\"4\\0\\25\"\"4\\0\\25\"\"4\\0\\25\"\"4\\0\\20\"\n  \"\\35\\0\\20\\35\\0\\11\\22\\0\\23F\\0\\34\"\"6\\0\\34\"\"6\\0\\0\\0\\0\\0\\0\\0L\\317\\0L\\317\\0L\\317\"\n  \"\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0\\0\\0\\0\\0\\0\\0\"\"2\\317\\0\"\"2\\317\\0\"\"2\\317\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\25\\0\\0\\25\"\n  \"\\0\\0\\25\\0\\0\\4\\0\\0\\5\\0\\0\\2\\0\\0\\1\\0\\0\\4\\0\\0\\14\\0\\0\\14\\0\\0\\0\\0\\0\\37\\7\\0\\37\\7\"\n  \"\\0\\25\\3\\0\\0\\0\\0\\25\\3\\0\\25\\3\\0\\25\\3\\0\\25\\3\\0\\37\\6\\0\\37\\6\\0\\15\\4\\0\\11\\3\\0\\7\"\n  \"\\3\\0\\14\\10\\0\\14\\10\\0\\0\\0\\0\\25\\16\\0\\25\\16\\0\\25\"\"4\\0\\0\\0\\0\\25\"\"4\\0\\25\"\"4\\0\"\n  \"\\25\"\"4\\0\\25\"\"4\\0&Q\\0&Q\\0&Q\\0\\31\"\"5\\0\\34\"\"6\\0&j\\0&j\\0\\0\\0\\0\"\"5q\\0\"\"5q\\0L\\317\"\n  \"\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0\\0\\0\\0\"\"2\"\n  \"\\317\\0\"\"2\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\1\\1\\0\\0\\0\\0\\0\\0\\0\\25\\0\"\n  \"\\0\\25\\0\\0\\25\\0\\0\\31\\1\\0\\5\\0\\0\\5\\0\\0\\2\\0\\0\\4\\0\\0\\14\\0\\0\\14\\0\\0\\0\\0\\0\\37\\7\"\n  \"\\0\\37\\7\\0\\37\\7\\0\\0\\0\\0\\25\\3\\0\\25\\3\\0\\25\\3\\0\\25\\3\\0\\37\\6\\0\\37\\6\\0\\37\\6\\0\\11\"\n  \"\\3\\0\\16\\6\\0\\16\\6\\0\\7\\3\\0\\0\\0\\0\\25\\16\\0\\25\\16\\0\\25\\16\\0\\0\\0\\0\\25\"\"4\\0\\25\"\"4\"\n  \"\\0\\25\"\"4\\0\\25\"\"4\\0&Q\\0&Q\\0&Q\\0\\31\"\"5\\0+X\\0+X\\0\\34\"\"6\\0\\0\\0\\0\"\"5q\\0\"\"5q\\0\"\n  \"\"\"5q\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\\0L\\317\"\n  \"\\0L\\317\\0\\0\\0\\0\"\"2\\317\\0\"\"2\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\25\\0\\0\\25\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0L\\317\\0L\\317\\0L\\317\\0L\\317\"\n  \"\\0\\0\\0\\0\"\"2\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0e\\4\\0e\\4\\0\\0\\0\\0\\0\\0\\0e\\11\\0e\\11\\0\\0\\0\\0\\0\\0\\0e\\16\\0e\\16\\0\\0\\0\\0\\0\\0\"\n  \"\\0G\\11\\0G\\11\\0\\0\\0\\0\\0\\0\\0G\\14\\0G\\14\\0\\0\\0\\0\\0\\0\\0G\\17\\0G\\17\\0\\0\\0\\0\\0\\0\"\n  \"\\0G\\21\\0G\\21\\0\\0\\0\\0\\0\\0\\0GK\\0GK\\0\\0\\0\\0\\0\\0\\0GT\\0GT\\0\\0\\0\\0\\0\\0\\0G^\\0G^\"\n  \"\\0\\0\\0\\0\\0\\0\\0Gg\\0Gg\\0\\0\\0\\0\\0\\0\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\"\n  \"\\0e\\317\\0e\\317\\0\\0\\0\\0\\0\\0\\0L\\317\\0L\\317\\0L\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0e\\4\\0e\\4\\0e\\4\\0\\0\\0\\0e\\11\\0e\\11\\0e\\11\\0\\0\\0\"\n  \"\\0e\\16\\0e\\16\\0e\\16\\0\\0\\0\\0e\\22\\0e\\22\\0G\\11\\0\\0\\0\\0G\\14\\0G\\14\\0G\\14\\0\\0\\0\"\n  \"\\0G\\17\\0G\\17\\0G\\17\\0\\0\\0\\0G\\21\\0G\\21\\0G\\21\\0\\0\\0\\0G\\24\\0G\\24\\0GK\\0\\0\\0\\0\"\n  \"GT\\0GT\\0GT\\0\\0\\0\\0G^\\0G^\\0G^\\0\\0\\0\\0Gg\\0Gg\\0Gg\\0\\0\\0\\0Gq\\0Gq\\0e\\317\\0e\\317\"\n  \"\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0\\0\\0\\0L\\317\\0L\"\n  \"\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\0\\0e\\4\\0e\\4\\0e\\4\\0\\0\\0\"\n  \"\\0e\\11\\0e\\11\\0e\\11\\0\\0\\0\\0e\\16\\0e\\16\\0e\\16\\0\\0\\0\\0e\\22\\0e\\22\\0e\\22\\0\\0\\0\"\n  \"\\0G\\14\\0G\\14\\0G\\14\\0\\0\\0\\0G\\17\\0G\\17\\0G\\17\\0\\0\\0\\0G\\21\\0G\\21\\0G\\21\\0\\0\\0\"\n  \"\\0G\\24\\0G\\24\\0G\\24\\0\\0\\0\\0GT\\0GT\\0GT\\0\\0\\0\\0G^\\0G^\\0G^\\0\\0\\0\\0Gg\\0Gg\\0Gg\"\n  \"\\0\\0\\0\\0Gq\\0Gq\\0Gq\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\\0e\\317\"\n  \"\\0e\\317\\0e\\317\\0e\\317\\0\\0\\0\\0L\\317\\0L\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0e\\4\\0e\\4\\0e\\4\\0\\0\\0\\0b\\10\\0b\\10\\0b\\10\\0\\0\\0\\0b\\15\\0b\\15\\0b\\15\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0<\\16\\0<\\16\\0<\\16\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\"2J\\0\"\"2J\\0\"\"2J\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0e\\317\\0e\\317\\0e\\317\\0e\"\n  \"\\317\\0\\0\\0\\0L\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\216\\1\\0c\\0\\0c\\0\\0\\0\\0\\0\"\n  \"`\\0\\0c\\0\\0c\\0\\0\\2\\0\\0c\\1\\0i\\0\\0i\\0\\0\\0\\0\\0\\0\\0\\0e\\0\\0e\\0\\0\\0\\0\\0\\0\\0\\0{\\1\"\n  \"\\0{\\1\\0f\\0\\0f\\0\\0z\\1\\0z\\1\\0z\\1\\0z\\1\\0)\\4\\0)\\4\\0\\0\\0\\0\\0\\0\\0Q\\7\\0Q\\7\\0\\0\\0\"\n  \"\\0\\0\\0\\0{&\\0{&\\0W\\32\\0W\\32\\0z&\\0z&\\0z&\\0z&\\0IC\\0IC\\0\\0\\0\\0\\0\\0\\0X^\\0X^\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\"\n  \"\\261\\251\\0\\261\\251\\0\\0\\0\\0\\0\\0\\0e\\317\\0e\\317\\0e\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\216\\1\\0c\\0\\0`\\0\\0\\2\\0\\0c\\0\\0c\\0\\0c\\0\\0\\12\\0\\0k\\1\\0i\\0\\0\"\n  \"\\0\\0\\0\\11\\0\\0i\\0\\0i\\0\\0\\0\\0\\0\\256\\2\\0\\256\\2\\0{\\1\\0f\\0\\0z\\1\\0z\\1\\0z\\1\\0z\\1\"\n  \"\\0\\221\\1\\0\\221\\1\\0\\221\\17\\0\\0\\0\\0)\\4\\0c\\11\\0c\\11\\0\\0\\0\\0\\256+\\0\\256+\\0{&\"\n  \"\\0W\\32\\0z&\\0z&\\0z&\\0z&\\0\\2415\\0\\2415\\0\\243\\210\\0\\0\\0\\0IC\\0{|\\0{|\\0\\0\\0\\0\"\n  \"\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\"\n  \"\\251\\0\\261\\251\\0\\261\\251\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0e\\317\\0e\\317\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\216\\1\\0\\216\\1\\0`\\0\\0\\2\\0\\0c\\0\\0c\\0\\0c\\0\\0\\12\\0\\0\"\n  \"k\\1\\0k\\1\\0\\0\\0\\0\\11\\0\\0i\\0\\0i\\0\\0\\0\\0\\0\\256\\2\\0\\256\\2\\0\\256\\2\\0f\\0\\0z\\1\\0\"\n  \"z\\1\\0z\\1\\0z\\1\\0\\221\\1\\0\\221\\1\\0\\221\\1\\0\\0\\0\\0\\221\\17\\0\\221\\17\\0)\\4\\0\\0\\0\"\n  \"\\0\\256+\\0\\256+\\0\\256+\\0W\\32\\0z&\\0z&\\0z&\\0z&\\0\\2415\\0\\2415\\0\\2415\\0\\0\\0\\0\"\n  \"\\243\\210\\0\\243\\210\\0IC\\0\\0\\0\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\"\n  \"\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\261\\251\\0\\264\\360\"\n  \"\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0e\\317\\0e\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\216\\1\"\n  \"\\0\\211\\1\\0c\\0\\0\\2\\0\\0c\\0\\0c\\0\\0k\\0\\0\\12\\0\\0k\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\264\\360\\0\\264\\360\"\n  \"\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0e\\317\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\211\\1\\0\\216\\1\"\n  \"\\0c\\0\\0\\2\\0\\0c\\0\\0k\\0\\0q\\0\\0\\20\\0\\0\\0\\0\\0\\0\\0\\0\\322\\1\\0\\322\\1\\0\\322\\1\\0\\322\"\n  \"\\1\\0\\346\\1\\0\\346\\1\\0\\0\\0\\0\\0\\0\\0\\322\\2\\0\\322\\2\\0\\322\\2\\0\\322\\2\\0\\363\\2\\0\"\n  \"\\363\\2\\0\\0\\0\\0\\0\\0\\0\\322!\\0\\322!\\0\\322!\\0\\322!\\0\\371(\\0\\371(\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\322+\\0\\322+\\0\\322+\\0\\322+\\0\\3719\\0\\3719\\0\\0\\0\\0\\0\\0\\0\\325\\215\\0\\325\\215\"\n  \"\\0\\325\\215\\0\\325\\215\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\0\\0\\0\\325\\251\\0\\325\\251\"\n  \"\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\264\\360\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\211\\1\\0\\216\"\n  \"\\1\\0c\\0\\0\\2\\0\\0f\\0\\0m\\0\\0m\\0\\0\\0\\0\\0\\325\\3\\0\\325\\3\\0\\322\\1\\0\\322\\1\\0\\346\"\n  \"\\1\\0\\346\\1\\0\\346\\1\\0\\0\\0\\0\\322\\2\\0\\322\\2\\0\\322\\2\\0\\322\\2\\0\\363\\2\\0\\363\\2\"\n  \"\\0\\363\\2\\0\\0\\0\\0\\322\\3\\0\\322\\3\\0\\322!\\0\\322!\\0\\371(\\0\\371(\\0\\371(\\0\\0\\0\\0\"\n  \"\\322+\\0\\322+\\0\\322+\\0\\322+\\0\\3719\\0\\3719\\0\\3719\\0\\0\\0\\0\\3227\\0\\3227\\0\\325\"\n  \"\\215\\0\\325\\215\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\325\\251\\0\\325\\251\\0\"\n  \"\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\"\n  \"\\251\\0\\330\\360\\0\\330\\360\\0\\0\\0\\0\\264\\360\\0\\264\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\216\\1\\0\\216\\1\\0c\\0\\0\\10\\0\\0m\\0\\0m\\0\\0\\0\\0\\0\\325\\3\\0\\325\\3\\0\\325\"\n  \"\\3\\0\\322\\1\\0\\346\\1\\0\\346\\1\\0\\346\\1\\0\\0\\0\\0\\322\\2\\0\\322\\2\\0\\322\\2\\0\\322\\2\"\n  \"\\0\\363\\2\\0\\363\\2\\0\\363\\2\\0\\0\\0\\0\\322\\3\\0\\322\\3\\0\\322\\3\\0\\322!\\0\\371(\\0\\371\"\n  \"(\\0\\371(\\0\\0\\0\\0\\322+\\0\\322+\\0\\322+\\0\\322+\\0\\3719\\0\\3719\\0\\3719\\0\\0\\0\\0\\322\"\n  \"7\\0\\3227\\0\\3227\\0\\325\\215\\0\\374\\264\\0\\374\\264\\0\\374\\264\\0\\0\\0\\0\\325\\251\\0\"\n  \"\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\\251\\0\\325\"\n  \"\\251\\0\\325\\251\\0\\325\\251\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\0\\0\\0\\264\\360\\0\"\n  \"\\264\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\216\\1\\0\\216\\1\\0i\\0\\0\\10\\0\\0m\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\275\\1\\0\\275\\1\\0\\275\\1\\0\"\n  \"\\275\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\244!\\0\\244!\\0\\244!\\0\\244!\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\213n\\0\\213n\\0\\213n\\0\\213n\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\\330\"\n  \"\\360\\0\\0\\0\\0\\264\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\216\\1\\0\\224\\1\\0i\\0\\0\\10\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\325\\3\\0\\325\\3\\0\\325\\3\\0\\351\\3\\0\\365\\1\\0\\365\\1\\0\\14\\0\\0\\313\"\n  \"\\2\\0#\\2\\0#\\2\\0\\0\\0\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\0\\0\\0\\371\\37\\0\\371\\37\"\n  \"\\0\\371\\37\\0\\371\\37\\0.\\17\\0.\\17\\0#\\14\\0\\304-\\0Y!\\0Y!\\0\\0\\0\\0\\0\\0\\0\\371p\\0\"\n  \"\\371p\\0\\0\\0\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\371p\\0O>\\0O>\\0\"\"3(\\0\\247\\227\\0\\211\"\n  \"s\\0\\211s\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\330\\360\\0\\330\\360\\0\\330\\360\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\4\\0\\0\\224\\1\\0i\\0\\0\\0\\0\\0\\0\\0\\0\\325\\3\\0\\325\"\n  \"\\3\\0\\325\\3\\0\\17\\2\\0\\\"\\2\\0!\\0\\0\\35\\0\\0#\\2\\0\\342\\4\\0\\342\\4\\0\\0\\0\\0\\371\\37\\0\"\n  \"\\371\\37\\0\\371\\37\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\3775\\0\\3775\"\n  \"\\0\\374%\\0\\304\\34\\0Y!\\0\\373C\\0\\373C\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\\0\\371\"\n  \"p\\0\\371p\\0\\371p\\0\\371p\\0\\377\\256\\0\\377\\256\\0\\377\\256\\0\\247q\\0\\211s\\0\\375\"\n  \"\\342\\0\\375\\342\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\"\n  \"\\0\\0\\330\\360\\0\\330\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\12\\0\\0\\224\\1\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\325\\3\\0\\325\\3\\0\\325\\3\\0\\344\\5\\0\\\"\\2\\0\\\"\\2\\0\\200\\0\\0#\\2\\0\\342\\4\\0\"\n  \"\\342\\4\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\"\n  \"\\0\\371\\37\\0\\3775\\0\\3775\\0\\3775\\0\\304\\34\\0\\3732\\0\\3732\\0Y!\\0\\0\\0\\0\\371p\\0\"\n  \"\\371p\\0\\371p\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\371p\\0\\377\\256\\0\\377\\256\\0\\377\"\n  \"\\256\\0\\247q\\0\\375\\274\\0\\375\\274\\0\\211s\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\330\\360\\0\\330\\360\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\12\\0\\0\\0\\0\\0i\\0\\0\\0\\0\\0\\325\\3\\0\\325\\3\\0\\344\\5\\0\\344\\5\"\n  \"\\0\\\"\\2\\0\\36\\1\\0\"\"4\\2\\0#\\2\\0\\342\\4\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\0\\0\"\n  \"\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\3775\\0\\3775\\0\\3775\\0\\307)\\0\\3732\\0\"\n  \"\\3732\\0\\3732\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\371\"\n  \"p\\0\\377\\256\\0\\377\\256\\0\\377\\256\\0\\247q\\0\\375\\274\\0\\375\\274\\0\\375\\274\\0\\0\"\n  \"\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\0\\0\\0\\330\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\12\\0\\0\"\n  \"\\10\\0\\0\\0\\0\\0\\325\\3\\0\\344\\5\\0\\344\\5\\0\\344\\5\\0\\340\\4\\0\\367\\11\\0\\364\\3\\0#\\2\"\n  \"\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\371\"\n  \"\\37\\0\\3775\\0\\3775\\0\\3775\\0\\307)\\0\\376G\\0\\3732\\0\\3732\\0\\0\\0\\0\\371p\\0\\371p\"\n  \"\\0\\371p\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\371p\\0\\377\\256\\0\\377\\256\\0\\377\\256\\0\"\n  \"\\247q\\0\\375\\274\\0\\375\\274\\0\\375\\274\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\12\\0\\0\\10\\0\\0\\0\\0\\0\\0\\0\\0\\17\\2\\0\\17\"\n  \"\\2\\0\\17\\2\\0\\323\\2\\0\\352\\7\\0\\347\\2\\0\\26\\1\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0/\\26\\0/\\26\\0/\\26\\0\\0\\0\\0\"\"7\\36\\0\"\"6\\25\\0\"\n  \"\"\"6\\25\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0O>\\0O>\\0\"\n  \"O>\\0\\0\\0\\0VK\\0VK\\0VK\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5\\0\\0\\12\\0\"\n  \"\\0\\10\\0\\0\\0\\0\\0\\17\\2\\0\\17\\2\\0\\344\\5\\0\\15\\1\\0\\352\\7\\0\\352\\7\\0\\347\\2\\0\\0\\0\"\n  \"\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\362\\4\\0\\0\\0\\0/\\26\\0/\\26\\0\"\n  \"\\3775\\0$\\21\\0\"\"7\\36\\0\"\"7\\36\\0\\3672\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\370A\\0\\0\\0\\0O>\\0O>\\0\\377\\256\\0\"\"3(\\0VK\\0VK\\0\\372\\264\\0\\0\\0\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\341\\271\\0\\0\\0\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\343\\350\\0\\0\\0\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5\\0\\0\\5\\0\\0\\10\\0\\0\\0\\0\"\n  \"\\0\\17\\2\\0\\17\\2\\0\\17\\2\\0\\15\\1\\0\\352\\7\\0\\352\\7\\0\\347\\2\\0\\0\\0\\0\\371\\37\\0\\371\"\n  \"\\37\\0\\371\\37\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0/\\26\\0/\\26\\0/\\26\\0$\\21\\0\"\"7\\36\"\n  \"\\0\"\"7\\36\\0\"\"6\\25\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0O>\\0O>\\0O>\\0\"\"3(\\0VK\\0VK\\0VK\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\5\\0\\0\\5\\0\\0\\5\\0\\0\\0\\0\\0\\344\\5\\0\\344\\5\\0\\344\\5\\0\\316\\4\\0\\367\"\n  \"\\11\\0\\367\\11\\0\\364\\3\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\371\\37\\0\\371\"\n  \"\\37\\0\\371\\37\\0\\371\\37\\0\\3775\\0\\3775\\0\\3775\\0\\307)\\0\\376G\\0\\376G\\0\\3732\\0\"\n  \"\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\371p\\0\\377\\256\\0\\377\"\n  \"\\256\\0\\377\\256\\0\\247q\\0\\375\\274\\0\\375\\274\\0\\375\\274\\0\\0\\0\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5\"\n  \"\\0\\0\\5\\0\\0\\5\\0\\0\\17\\2\\0\\344\\5\\0\\344\\5\\0\\316\\4\\0\\345\\11\\0\\367\\11\\0\\364\\3\\0\"\n  \"\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\371\\37\"\n  \"\\0\\3775\\0\\3775\\0\\3775\\0\\307)\\0\\376G\\0\\376G\\0\\3732\\0\\0\\0\\0\\371p\\0\\371p\\0\\371\"\n  \"p\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\371p\\0\\377\\256\\0\\377\\256\\0\\377\\256\\0\\247q\"\n  \"\\0\\375\\274\\0\\375\\274\\0\\375\\274\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5\\0\\0\\5\\0\\0\\0\\0\\0\\17\\2\"\n  \"\\0\\344\\5\\0\\344\\5\\0\\15\\1\\0$\\6\\0$\\6\\0#\\2\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\"\n  \"\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\3775\\0/\\26\\0/\\26\\0\\307)\\0\\376\"\n  \"G\\0[/\\0Y!\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\371p\\0\"\n  \"\\377\\256\\0O>\\0O>\\0\\247q\\0\\375\\274\\0\\211s\\0\\211s\\0\\0\\0\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5\\0\\0\"\n  \"\\5\\0\\0\\17\\2\\0\\17\\2\\0\\344\\5\\0\\316\\4\\0$\\6\\0$\\6\\0#\\2\\0\\0\\0\\0\\371\\37\\0\\371\\37\"\n  \"\\0\\371\\37\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\3775\\0/\\26\\0/\\26\\0\"\n  \"\\307)\\0\\376G\\0[/\\0Y!\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\\0\\371p\\0\\371p\\0\\371\"\n  \"p\\0\\371p\\0\\377\\256\\0O>\\0O>\\0\\247q\\0\\375\\274\\0\\211s\\0\\211s\\0\\0\\0\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\5\\0\\0\\24\\2\\0\\17\\2\\0\\17\\2\\0\\316\\4\\0\\345\\11\\0$\\6\\0#\\2\\0\\0\\0\\0\\371\"\n  \"\\37\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\3775\\0\"\n  \"\\3775\\0\\3775\\0\\307)\\0\\376G\\0\\376G\\0\\3732\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\"\n  \"\\0\\371p\\0\\371p\\0\\371p\\0\\371p\\0\\377\\256\\0\\377\\256\\0\\377\\256\\0\\247q\\0\\375\\274\"\n  \"\\0\\375\\274\\0\\375\\274\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5\\0\\0\\24\\2\\0\\24\"\n  \"\\2\\0\\17\\2\\0\\316\\4\\0\\345\\11\\0\\342\\3\\0#\\2\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\"\n  \"\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\3775\\0\\3775\\0\\3775\\0\\307)\\0\"\n  \"\\376G\\0\\3732\\0\\3732\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\\0\\371p\\0\\371p\\0\\371\"\n  \"p\\0\\371p\\0\\377\\256\\0\\377\\256\\0\\377\\256\\0\\247q\\0\\375\\274\\0\\375\\274\\0\\375\\274\"\n  \"\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\17\\2\\0\\24\\2\\0\\5\\0\\0\\0\\0\\0\\27\\5\\0\\342\\3\\0\\313\"\n  \"\\1\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\371\\37\\0\\0\\0\\0\\0\\0\\0/\\26\\0\"\n  \"\\3775\\0\\371\\37\\0\\302\\30\\0\\3716\\0Y!\\0#\\14\\0\\0\\0\\0\\371p\\0\\371p\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\371p\\0\\0\\0\\0\\0\\0\\0O>\\0\\377\\256\\0\\371p\\0\\243I\\0\\371\\224\\0\\211s\\0\"\n  \"\"\"3(\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\17\\2\\0\\17\\2\\0\\0\\0\\0\\0\\0\\0\\26\\1\\0\\26\\1\\0\\0\\0\\0\\0\\0\\0\\371\"\n  \"\\37\\0\\371\\37\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0/\\26\\0/\\26\\0\\0\\0\\0\\0\\0\"\n  \"\\0\"\"6\\25\\0\"\"6\\25\\0\\0\\0\\0\\0\\0\\0\\371p\\0\\371p\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0O>\\0O>\\0\\0\\0\\0\\0\\0\\0VK\\0VK\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\"\n  \"\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\17\\2\\0\\17\\2\\0\\0\\0\\0\\0\\0\\0\\26\\1\\0\\26\\1\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0/\\26\\0/\\26\\0\\0\\0\"\n  \"\\0\\0\\0\\0\"\"6\\25\\0\"\"6\\25\\0\\0\\0\\0\\0\\0\\0\\371p\\0\\371p\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0O>\\0O>\\0\\0\\0\\0\\0\\0\\0VK\\0VK\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\17\\2\\0\\17\\2\\0\\16\\0\\0\\0\\0\\0\\26\\1\\0\\26\\1\\0\\26\"\n  \"\\1\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0/\\26\\0\"\n  \"/\\26\\0.\\17\\0\\0\\0\\0\"\"6\\25\\0\"\"6\\25\\0\"\"6\\25\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0O>\\0O>\\0O>\\0\\0\\0\\0VK\\0VK\\0VK\\0\\0\\0\\0\\374\\360\\0\"\n  \"\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\16\\0\\0\\16\\0\\0\\14\\0\\0\\14\"\n  \"\\0\\0#\\2\\0#\\2\\0\\0\\0\\0\\0\\0\\0\\371\\37\\0\\371\\37\\0\\0\\0\\0\\0\\0\\0\\371\\37\\0\\371\\37\"\n  \"\\0\\371\\37\\0\\371\\37\\0.\\17\\0.\\17\\0#\\14\\0#\\14\\0Y!\\0Y!\\0\\0\\0\\0\\0\\0\\0\\371p\\0\\371\"\n  \"p\\0\\0\\0\\0\\0\\0\\0\\371p\\0\\371p\\0\\371p\\0\\371p\\0O>\\0O>\\0\"\"3(\\0\"\"3(\\0\\211s\\0\\211\"\n  \"s\\0\\0\\0\\0\\0\\0\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\\0\\374\\360\"\n  \"\\0\\374\\360\\0\\374\\360\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\",\n};\n\n/**\n * \\brief Returns the BlitBlendAll test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImageBlitBlendAll()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imageBlitBlendAll.pixel_data,\n        SDLTest_imageBlitBlendAll.width,\n        SDLTest_imageBlitBlendAll.height,\n        SDLTest_imageBlitBlendAll.bytes_per_pixel * 8,\n        SDLTest_imageBlitBlendAll.width * SDLTest_imageBlitBlendAll.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_imageFace.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n/* GIMP RGBA C-Source image dump (face.c) */\n\nconst SDLTest_SurfaceImage_t SDLTest_imageFace = {\n  32, 32, 4,\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\0\"\n  \"\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\"\n  \"\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\"\n  \"\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\0\\0\\0\"\n  \"\\377\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\"\n  \"\\377\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\"\n  \"\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\"\n  \"\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\"\n  \"\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\"\n  \"\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\"\n  \"\\0\\0\\377\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\"\n  \"\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\"\n  \"\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\"\n  \"\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\"\n  \"\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\"\n  \"\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\"\n  \"\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\\377\\377\\0\\377\"\n  \"\\377\\377\\0\\377\\377\\377\\0\",\n};\n\n/**\n * \\brief Returns the Face test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImageFace()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imageFace.pixel_data,\n        SDLTest_imageFace.width,\n        SDLTest_imageFace.height,\n        SDLTest_imageFace.bytes_per_pixel * 8,\n        SDLTest_imageFace.width * SDLTest_imageFace.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_imagePrimitives.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n/* GIMP RGB C-Source image dump (primitives.c) */\n\nconst SDLTest_SurfaceImage_t SDLTest_imagePrimitives = {\n  80, 60, 3,\n  \"\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15\"\n  \"I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\"\n  \"\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\"\n  \"\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\\0\\15I\\310\\0\\0\"\n  \"\\0\\5ii\\0\\0\\0\\5ii\\0\\0\\0\\3\\1\\1\\0\\0\\0\\5\\2\\1\\0\\0\\0\\7\\3\\2\\0\\0\\0\\11\\4\\3\\0\\0\\0\\13\"\n  \"\\5\\3\\0\\0\\0\\15\\6\\4\\0\\0\\0\\17\\7\\5\\0\\0\\0\\21\\10\\5\\0\\0\\0\\23\\11\\6\\0\\0\\0\\25\\12\\7\"\n  \"\\0\\0\\0\\27\\13\\7\\0\\0\\0\\31\\14\\10\\0\\0\\0\\33\\15\\11\\0\\0\\0\\35\\16\\11\\0\\0\\0\\37\\17\\12\"\n  \"\\0\\0\\0!\\20\\13\\0\\0\\0#\\21\\13\\0\\0\\0%\\22\\14\\0\\0\\0'\\23\\15\\15I\\310)\\24\\15\\15I\\310\"\n  \"+\\25\\16\\15I\\310-\\26\\17\\15I\\310/\\27\\17\\15I\\3101\\30\\20\\15I\\3103\\31\\21\\15I\\310\"\n  \"5\\32\\21\\15I\\3107\\33\\22\\15I\\3109\\34\\23\\15I\\310;\\35\\23\\15I\\310=\\36\\24\\15I\\310\"\n  \"?\\37\\25\\15I\\310A\\40\\25\\15I\\310C!\\26\\15I\\310E\\\"\\27\\15I\\310G#\\27\\15I\\310I$\"\n  \"\\30\\15I\\310K%\\31\\15I\\310M&\\31\\5iiO'\\32\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\10\\4\\2\\0\\0\\0\"\n  \"\\14\\6\\4\\0\\0\\0\\20\\10\\5\\0\\0\\0\\24\\12\\6\\0\\0\\0\\30\\14\\10\\0\\0\\0\\34\\16\\11\\0\\0\\0\\40\"\n  \"\\20\\12\\0\\0\\0$\\22\\14\\0\\0\\0(\\24\\15\\0\\0\\0,\\26\\16\\0\\0\\0\"\"0\\30\\20\\0\\0\\0\"\"4\\32\"\n  \"\\21\\0\\0\\0\"\"8\\34\\22\\0\\0\\0<\\36\\24\\0\\0\\0@\\40\\25\\0\\0\\0D\\\"\\26\\0\\0\\0H$\\30\\0\\0\\0\"\n  \"L&\\31\\0\\0\\0P(\\32\\15I\\310T*\\34\\15I\\310X,\\35\\15I\\310\\\\.\\36\\15I\\310`0\\40\\15\"\n  \"I\\310d2!\\15I\\310h4\\\"\\15I\\310l6$\\15I\\310p8%\\15I\\310t:&\\15I\\310x<(\\15I\\310\"\n  \"|>)\\15I\\310\\200@*\\15I\\310\\204B,\\15I\\310\\210D-\\15I\\310\\214F.\\15I\\310\\220H\"\n  \"0\\15I\\310\\224J1\\15I\\310\\230L2\\5ii\\234N4\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\"\n  \"\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\5ii\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\"\n  \"\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\"\n  \"\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\"\n  \"\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5\"\n  \"ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\"\n  \"\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\"\n  \"\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\"\n  \"\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\"\n  \"\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\"\n  \"\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\5ii\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\"\n  \"\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\"\"77\\5\\0\\377\\0\\0\\377\\0\\0\\377\\0\"\n  \"\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\5ii\\0\\377\\0\\0\\377\\0\\0\\377\"\n  \"\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\"\n  \"\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\"\n  \"\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\377\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5\"\n  \"ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\"\n  \"\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5i\"\n  \"i\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\310\\0d\\310\\0d\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\310\\0d\\5ii\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d77\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\5ii\\310\\0d\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15\"\n  \"I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\5ii\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d7\"\n  \"7\\5\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0\"\n  \"d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\"\n  \"\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\310\\0d\\5ii\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5\"\n  \"ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\"\n  \"\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\5ii\\15I\\310\\15I\\310\\15I\\310\\0\\0\\0\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\"\n  \"\\15I\\310\\15I\\310\\0\\0\\0\\5ii\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\\15I\\310\\5ii\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\"\"77\\5\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\15I\"\n  \"\\310\\15I\\310\\15I\\310\\15I\\310\\15I\\310\\5ii\",\n};\n\n/**\n * \\brief Returns the Primitives test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImagePrimitives()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imagePrimitives.pixel_data,\n        SDLTest_imagePrimitives.width,\n        SDLTest_imagePrimitives.height,\n        SDLTest_imagePrimitives.bytes_per_pixel * 8,\n        SDLTest_imagePrimitives.width * SDLTest_imagePrimitives.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_imagePrimitivesBlend.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n/* GIMP RGB C-Source image dump (alpha.c) */\n\nconst SDLTest_SurfaceImage_t SDLTest_imagePrimitivesBlend = {\n  80, 60, 3,\n  \"\\260e\\15\\222\\356/\\37\\313\\15\\36\\330\\17K\\3745D\\3471\\0\\20\\0D\\3502D\\3502<\\321\"\n  \",\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0-\\0\\377\\377\"\n  \"\\377\\377\\377\\377\\311\\324\\311\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\0H\\0\\377\\377\\377\\377\\377\\377\\256\\307\\256\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0c\\0\\377\\377\\377\\377\\377\\377\"\n  \"\\223\\300\\223\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\0~\\0\\377\\377\\377\\377\\377\\377x\\277x\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\0\\231\\0\\377\\377\\377\\377\\377\\377]\\303]\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\\264\\0\\377\\377\\377\\377\\377\"\n  \"\\377B\\316B\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\0\"\n  \"\\317\\0\\377\\377\\377\\377\\377\\377'\\335'\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\0\\352\\0\\377\\377\\377#\\262\\6\\260d\\15\\260e\\15\\224\\357\"\n  \"/&\\262\\6\\34\\300\\5.\\314\\22\\40\\315\\12[\\3747M\\332/\\27\\331\\12\\27\\331\\12K\\374\"\n  \"5K\\3745K\\3745D\\3471D\\3471D\\3471D\\3471D\\3471D\\3502D\\3502D\\3502D\\3502D\\350\"\n  \"2D\\3502D\\3502D\\3502D\\3502D\\3502\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377,\\372\\27\\273\\3465\\327\"\n  \"Q.\\260d\\15\\213\\213\\40\\241\\3601\\200\\366*=\\265\\13?\\301\\25s\\375<Y\\316-X\\320\"\n  \"-!\\315\\13]\\3749]\\3749O\\3321O\\3321P\\3342P\\3342P\\3342\\371\\377\\364\\371\\377\\364\"\n  \"\\371\\377\\364\\371\\377\\364\\371\\377\\364\\362\\375\\360\\362\\375\\360\\362\\375\\360\"\n  \"\\362\\375\\360\\362\\375\\360D\\3471D\\3471D\\3471D\\3502D\\3502D\\3502D\\3502D\\3502\"\n  \"D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"K\\3745&\\262\\6\\213\\213\\40\\11\\2\\0\\260`\\15\\241~#m}\\11\\273\\363AQ\\247\\15S\\266\"\n  \"\\31\\212\\373@e\\302,\\4\\33\\2s\\375<\\\\\\3161M\\260*\\\\\\3202X\\320-\\366\\377\\354\\364\"\n  \"\\377\\352O\\3321\\3\"\"5\\2O\\3321O\\3321<\\261&P\\3342P\\3342S\\3655\\377\\377\\377\\377\"\n  \"\\377\\377\\14Z\\14\\377\\377\\377\\377\\377\\377\\234\\302\\231\\371\\377\\364\\362\\375\\360\"\n  \"\\367\\377\\365\\362\\375\\360\\362\\375\\360\\13t\\13\\362\\375\\360\\362\\375\\360\\177\\275\"\n  \"~\\362\\375\\360\\362\\375\\360\\370\\377\\366\\362\\375\\360\\377\\377\\377\\14\\220\\14\\377\"\n  \"\\377\\377D\\3502\\\"\\267\\33D\\3502D\\3502K\\3779D\\3502D\\3502\\3\\233\\2D\\3502D\\350\"\n  \"2\\34\\303\\26D\\3502D\\3502L\\377:D\\3502D\\3502\\3\\264\\2D\\3502D\\3502\\25\\323\\22\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\14\\341\\14\\377\\377\"\n  \"\\377\\377\\377\\377\\40\\353\\40\\377\\377\\377D\\3471\\34\\300\\5e\\247\\33\\356\\336?\\277\"\n  \"f)\\260P\\17\\260i\\16\\356\\336?\\331\\353C\\274\\363GQ\\247\\15\\243\\370Cp\\270)\\212\"\n  \"\\373@h\\3021h\\3042c\\304+\\364\\377\\336\\\\\\3161\\\\\\3161\\\\\\3202\\\\\\3202\\\\\\3202\\377\"\n  \"\\377\\377\\364\\377\\352\\364\\377\\352\\346\\371\\342\\346\\371\\342O\\3321O\\3321P\\334\"\n  \"2P\\3342P\\3342P\\3342P\\3342P\\3342\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\"\n  \"\\360\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\"\n  \"\\360\\362\\375\\360\\362\\375\\360\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502D\\3502\\40\"\n  \"\\315\\12=\\265\\13f\\230\\14\\237y\\15\\274Y\\17\\327Q.\\260X\\14\\243\\177$\\220\\214\\\"\"\n  \"\\215\\235*\\274\\363G\\177\\252+\\243\\370Cu\\2661p\\270)\\367\\377\\324h\\3021h\\3021\"\n  \"h\\3042\\364\\377\\336\\364\\377\\336\\335\\364\\323\\\\\\3161\\\\\\3161\\\\\\3202\\\\\\3202\\\\\"\n  \"\\3202\\377\\377\\377\\377\\377\\377\\364\\377\\352\\364\\377\\352\\346\\371\\342\\346\\371\"\n  \"\\342\\346\\371\\342\\346\\371\\342O\\3321P\\3342P\\3342P\\3342P\\3342P\\3342P\\3342P\\334\"\n  \"2\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\362\\375\\360\\362\\375\\360\"\n  \"\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\\360\"\n  \"\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\\360\\362\\375\\360\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\6\\0\\4[\\3747?\\301\\25N\\241\\14\\331\\353C\\243\\177$\\275Z\\21\\377\\254W\\260Q\\17\\30\"\n  \"\\26\\7\\370\\343N\\201\\210\\16|\\213-\\274\\363G\\200\\2521\\202\\263+\\243\\370Cu\\266\"\n  \"1\\12&\\4\\367\\377\\324h\\3021S\\241)h\\3042h\\3042\\377\\377\\377\\364\\377\\336\\335\\364\"\n  \"\\323\\24M\\23\\\\\\3161\\\\\\3202C\\245(\\\\\\3202\\\\\\3202\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\30l\\30\\346\\371\\342\\346\\371\\342\\207\\273\\205\\346\\371\\342\\346\\371\\342\"\n  \"\\361\\377\\355\\377\\377\\377P\\3342\\7t\\4P\\3342P\\3342/\\260\\\"P\\3342P\\3342^\\377@\"\n  \"\\377\\377\\377\\377\\377\\377\\30\\242\\30\\377\\377\\377\\377\\377\\377d\\306d\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\30\\275\\30\\377\\377\\377\"\n  \"\\377\\377\\377K\\322K\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\30\\330\\30\\362\\375\\360\\362\\375\\3601\\3431\\362\\375\\360\\362\\375\\360\\377\"\n  \"\\377\\377\\362\\375\\360D\\3502M\\332/s\\375<>\\265\\14\\177\\252+\\201\\210\\16\\245\\204\"\n  \"*\\377\\314U\\312\\\\,\\224'\\11\\260i\\17\\244\\210\\40\\232\\2211\\331\\353J\\215\\2351\\377\"\n  \"\\377\\276\\200\\2521\\200\\2542\\375\\377\\310u\\2661t\\2702t\\2702\\367\\377\\324\\325\"\n  \"\\355\\305h\\3021h\\3042h\\3042\\377\\377\\377\\377\\377\\377\\364\\377\\336\\335\\364\\323\"\n  \"\\335\\364\\323\\335\\364\\323\\\\\\3202\\\\\\3202\\\\\\3202\\\\\\3202\\\\\\3202\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\346\\371\\342\\346\\371\\342\\346\"\n  \"\\371\\342\\346\\371\\342\\346\\371\\342\\346\\371\\342\\346\\371\\342\\377\\377\\377\\377\"\n  \"\\377\\377P\\3342P\\3342P\\3342P\\3342P\\3342P\\3342P\\3342P\\3342\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\27\\331\\12Y\\316-h\\3021\\243\\370Cg\\230\\15\\230\\224\\\"\\245\"\n  \"\\204*\\377\\314U\\310J\\21\\327Q.\\260b\\21\\245\\2041\\370\\343N\\230\\2242\\331\\353J\"\n  \"\\214\\2402\\377\\377\\276\\200\\2521\\200\\2542\\375\\377\\310\\317\\344\\266u\\2661t\\270\"\n  \"2\\377\\377\\377\\367\\377\\324\\325\\355\\305h\\3021h\\3042h\\3042h\\3042\\377\\377\\377\"\n  \"\\377\\377\\377\\364\\377\\336\\335\\364\\323\\335\\364\\323\\335\\364\\323\\335\\364\\323\"\n  \"\\\\\\3202\\\\\\3202\\\\\\3202\\\\\\3202\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\346\\371\\342\\346\\371\"\n  \"\\342\\346\\371\\342\\346\\371\\342\\346\\371\\342\\346\\371\\342\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377P\\3342P\\3342P\\3342P\\3342P\\3342P\\3342P\\3342P\\334\"\n  \"2\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377K\\3745!\\315\\13d\\304,p\\270)\\177\\252+\\23\\13\\6\\232\\2211\\245\\204\"\n  \"1\\347\\270O\\377\\277Y\\324<\\22\\265V\\24\\377\\330Q\\244\\210\\40#(\\13\\230\\224\\\"\\331\"\n  \"\\353Ju\\211.\\377\\377\\276\\200\\2521\\210\\273:\\200\\2542\\375\\377\\310\\20\"\"3\\6u\\266\"\n  \"1t\\2702\\271\\307\\271\\367\\377\\324\\325\\355\\305\\341\\377\\321h\\3021h\\3042\\16L\\7\"\n  \"h\\3042\\377\\377\\377\\242\\300\\242\\377\\377\\377\\335\\364\\323\\355\\377\\343\\335\\364\"\n  \"\\323\\335\\364\\323\\14f\\7\\\\\\3202\\\\\\3202>\\250*\\\\\\3202\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377$\\231$\\377\\377\\377\\377\\377\\377s\\303s\\377\\377\\377\"\n  \"\\346\\371\\342\\376\\377\\372\\346\\371\\342\\346\\371\\342\\40\\257\\37\\346\\371\\342\\346\"\n  \"\\371\\342\\\\\\316\\\\\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377P\\3342\\13\"\n  \"\\262\\7P\\3342P\\3342*\\327%P\\3342P\\3342o\\377Q\\377\\377\\377\\377\\377\\377$\\352$\"\n  \"\\377\\377\\377\\377\\377\\377K\\3745]\\3749s\\375<\\212\\373@\\243\\370C\\274\\363G\\331\"\n  \"\\353J\\370\\343N\\377\\330Q\\377\\314U\\377\\277Y\\377\\260\\\\\\224(\\11\\260|\\36\\245\\204\"\n  \"1\\377\\377\\250\\232\\2211\\230\\224\\\"\\215\\2351\\214\\2402\\377\\377\\276\\312\\332\\250\"\n  \"\\200\\2521\\200\\2542\\377\\377\\377\\317\\344\\266u\\2661t\\2702t\\2702\\377\\377\\377\"\n  \"\\377\\377\\377\\325\\355\\305\\325\\355\\305\\325\\355\\305h\\3042h\\3042h\\3042\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\335\\364\\323\\335\\364\\323\\335\\364\"\n  \"\\323\\335\\364\\323\\335\\364\\323\\\\\\3202\\\\\\3202\\\\\\3202\\\\\\3202\\\\\\3202\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\346\\371\\342\\346\\371\\342\"\n  \"\\346\\371\\342\\346\\371\\342\\346\\371\\342\\346\\371\\342\\346\\371\\342\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377P\\3342P\\3342\"\n  \"P\\3342P\\3342\\377\\377\\377K\\3745O\\3321\\\\\\3161h\\3021t\\2702~\\254'\\214\\240%\\377\"\n  \"\\377\\262\\370\\343N\\377\\330Q\\262x1\\277l1\\312`1\\327R.\\260X\\23\\377\\330Q\\244\\210\"\n  \"2\\377\\377\\250\\230\\2242\\377\\377\\262\\215\\2351\\214\\2402\\377\\377\\377\\312\\332\"\n  \"\\250\\200\\2521\\200\\2542\\377\\377\\377\\375\\377\\310\\317\\344\\266u\\2661t\\2702t\\270\"\n  \"2\\377\\377\\377\\377\\377\\377\\325\\355\\305\\325\\355\\305\\325\\355\\305h\\3042h\\304\"\n  \"2h\\3042h\\3042\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\335\\364\\323\\335\\364\\323\\335\\364\\323\\335\\364\\323\\377\\377\\377\\\\\\3202\\\\\\320\"\n  \"2\\\\\\3202\\\\\\3202\\\\\\3202\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\346\\371\\342\\346\\371\\342\\346\\371\\342\\346\"\n  \"\\371\\342\\346\\371\\342\\346\\371\\342\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377D\\3471O\\3321\\21\\7\\11c\\304+\\367\\377\\324o\\2520\\200\\252\"\n  \"1\\214\\2402\\235\\226'\\377\\377\\250\\377\\330Q!\\20\\11\\277l1\\310d2\\266?\\33\\224(\"\n  \"\\11\\260|\\36\\257\\217;\\377\\377\\250\\232\\2211\\34$\\11\\377\\377\\262\\215\\2351q\\206\"\n  \"0\\377\\377\\377\\312\\332\\250\\217\\303@\\200\\2542\\200\\25420Z0\\317\\344\\266\\317\\344\"\n  \"\\266X\\2260t\\2702t\\2702\\377\\377\\377\\377\\377\\377\\325\\355\\305(l%\\325\\355\\305\"\n  \"\\325\\355\\305K\\2410h\\3042h\\3042\\377\\377\\377\\377\\377\\377\\377\\377\\3770\\2200\"\n  \"\\377\\377\\377\\377\\377\\377t\\274p\\335\\364\\323\\335\\364\\323\\373\\377\\361\\377\\377\"\n  \"\\377\\377\\377\\377\\21\\213\\11\\\\\\3202\\\\\\3202<\\274/\\\\\\3202\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\3770\\3060\\377\\377\\377\\377\\377\\377V\\330V\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\3770\\3410\\346\\371\\342\\346\"\n  \"\\371\\342>\\352>\\346\\371\\342\\377\\377\\377D\\3471P\\3342\\364\\377\\352s\\375<h\\302\"\n  \"1t\\2702~\\254'\\377\\377\\276\\215\\2351\\230\\2242\\244\\210\\40\\377\\377\\234\\262x1\"\n  \"\\277l1\\310W\\32\\377\\260\\\\\\327T1\\260|2\\377\\330Q\\244\\2102\\377\\377\\250\\232\\221\"\n  \"1\\230\\2242\\377\\377\\262\\215\\2351\\214\\2402\\377\\377\\377\\377\\377\\276\\312\\332\"\n  \"\\250\\200\\2542\\200\\2542\\377\\377\\377\\375\\377\\310\\317\\344\\266\\317\\344\\266t\\270\"\n  \"2t\\2702t\\2702\\377\\377\\377\\377\\377\\377\\377\\377\\377\\325\\355\\305\\325\\355\\305\"\n  \"\\325\\355\\305h\\3042h\\3042h\\3042h\\3042\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\335\\364\\323\\335\\364\\323\\335\\364\\323\"\n  \"\\335\\364\\323\\335\\364\\323\\377\\377\\377\\377\\377\\377\\\\\\3202\\\\\\3202\\\\\\3202\\\\\\320\"\n  \"2\\\\\\3202\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377D\\3471P\\3342\\364\\377\\352\\\\\\3161h\\3042\\367\"\n  \"\\377\\324u\\2661\\200\\2542\\214\\240%\\377\\377\\262\\232\\2211\\244\\2102\\377\\377\\234\"\n  \"\\262x1\\274p2\\377\\337\\207\\377\\260\\\\\\327T1\\227/\\14\\377\\377\\234\\245\\2041\\244\"\n  \"\\2102\\307\\300\\213\\230\\2242\\377\\377\\377\\377\\377\\262\\215\\2351\\214\\2402\\377\"\n  \"\\377\\377\\377\\377\\276\\312\\332\\250\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\\377\"\n  \"\\317\\344\\266\\317\\344\\266\\317\\344\\266t\\2702t\\2702\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\325\\355\\305\\325\\355\\305\\325\\355\\305\\377\\377\\377\"\n  \"h\\3042h\\3042h\\3042h\\3042\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\335\\364\\323\\335\\364\\323\\335\\364\\323\"\n  \"\\335\\364\\323\\377\\377\\377\\377\\377\\377\\377\\377\\377\\\\\\3202\\\\\\3202\\\\\\3202\\\\\\320\"\n  \"2\\\\\\3202\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377<\\0<D\\3502\\371\\377\\364N\\3221\\\\\\3202\\364\\377\"\n  \"\\336l\\3035t\\2702\\375\\377\\310\\36\\22\\13\\214\\2402\\377\\377\\262\\214\\2012\\244\\210\"\n  \"2\\377\\377\\234\\274\\177;\\274p2\\377\\337\\207/\\24\\13\\324X2\\227/\\14\\222l3\\307\\260\"\n  \"|\\244\\2102\\377\\377\\270\\232\\2211\\230\\2242<Q<\\310\\316\\231\\215\\2351o\\2065\\377\"\n  \"\\377\\377\\377\\377\\276\\341\\377\\277\\200\\2521\\200\\2542\\36H\\13\\377\\377\\377\\377\"\n  \"\\377\\377\\213\\260}\\317\\344\\266t\\2702\\221\\366Ot\\2702\\377\\377\\377<\\207<\\377\"\n  \"\\377\\377\\377\\377\\377}\\270v\\325\\355\\305\\325\\355\\305\\371\\377\\351\\377\\377\\377\"\n  \"h\\3042\\30|\\13h\\3042\\377\\377\\377|\\306|\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377<\\275<\\335\\364\\323\\335\\364\\323_\\317]\\335\\364\\323\"\n  \"\\335\\364\\323\\377\\377\\377\\377\\377\\377\\377\\377\\377\\25\\260\\13\\\\\\3202\\\\\\3202\"\n  \">\\3369\\\\\\3202\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\371\\377\"\n  \"\\364O\\3321\\\\\\3202\\364\\377\\336h\\3042\\367\\377\\324u\\2661\\200\\2542\\377\\377\\276\"\n  \"\\215\\2351\\230\\2242\\307\\300\\213\\244\\2102\\377\\377\\234\\262x1\\274p2\\377\\337\\207\"\n  \"\\312`1\\324E\\30\\327T1\\260|2\\377\\377\\234\\245\\2041\\244\\2102\\377\\377\\250\\232\"\n  \"\\2211\\230\\2242\\377\\377\\377\\310\\316\\231\\215\\2351\\214\\2402\\377\\377\\377\\377\"\n  \"\\377\\377\\312\\332\\250\\312\\332\\250\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\\377\"\n  \"\\317\\344\\266\\317\\344\\266\\317\\344\\266t\\2702t\\2702t\\2702\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\325\\355\\305\\325\\355\\305\\325\\355\"\n  \"\\305\\377\\377\\377h\\3042h\\3042h\\3042h\\3042\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\335\\364\\323\\335\\364\\323\\335\\364\\323\\335\\364\\323\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\\\\\3202\\\\\\3202\\\\\\3202\\377\\377\\377D\\3502\\371\\377\"\n  \"\\364O\\3321\\377\\377\\377\\\\\\3161h\\3042\\367\\377\\324t\\2702\\375\\377\\310\\200\\252\"\n  \"1\\377\\377\\377\\215\\2351\\230\\2242\\377\\377\\250\\244\\2102\\377\\377\\234\\262x1\\274\"\n  \"p2\\316\\214_\\310d2\\377\\310|\\327T1\\227/\\14\\377\\377\\377\\307\\260|\\244\\2102\\377\"\n  \"\\377\\377\\307\\300\\213\\230\\2242\\230\\2242\\377\\377\\377\\310\\316\\231\\214\\2402\\214\"\n  \"\\2402\\377\\377\\377\\377\\377\\377\\312\\332\\250\\312\\332\\250\\200\\2542\\200\\2542\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\317\\344\\266\\317\\344\\266\\317\\344\\266t\\270\"\n  \"2t\\2702t\\2702\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\325\\355\\305\\325\\355\\305\\325\\355\\305\\377\\377\\377\\377\\377\\377h\\3042h\\3042\"\n  \"h\\3042\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\335\\364\\323\\335\\364\"\n  \"\\323\\335\\364\\323\\335\\364\\323\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377D\\3502\\371\\377\\364R\\3344\\364\\377\\352\\\\\\3161H\\22Hh\\3021\\377\\377\\377o\\244\"\n  \"2\\200\\2542\\312\\332\\250\\226\\245<\\377\\377\\262\\230\\2242H-/\\245\\2041\\377\\377\"\n  \"\\377\\233i5\\274p2\\277l1\\331sC\\377\\310|\\324X2*\\15\\3\\260|2\\377\\377\\234\\206s\"\n  \"7\\244\\2102\\377\\377\\250\\340\\337\\244\\230\\2242\\377\\377\\377Hc2\\310\\316\\231\\214\"\n  \"\\2402n\\211:\\377\\377\\377\\377\\377\\377\\353\\377\\311\\312\\332\\250\\200\\2542$T\\16\"\n  \"\\377\\377\\377\\377\\377\\377\\236\\277\\236\\377\\377\\377\\317\\344\\266\\367\\377\\336\"\n  \"\\377\\377\\377t\\2702\\40n\\16t\\2702\\377\\377\\377\\212\\303\\212\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\325\\355\\305\\325\\355\\305<\\2477\\377\\377\\377\\377\\377\\377O\\276\"\n  \"Ah\\3042h\\3042\\237\\377i\\377\\377\\377\\377\\377\\377H\\317H\\377\\377\\377\\377\\377\"\n  \"\\377c\\335c\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\335\\364\\323>\\337\"\n  \";\\335\\364\\323\\377\\377\\377D\\3502\\362\\375\\360P\\3342\\346\\371\\342\\\\\\3202\\364\"\n  \"\\377\\336h\\3042\\367\\377\\324t\\2702\\375\\377\\310\\200\\2542\\377\\377\\276\\214\\240\"\n  \"2\\377\\377\\262\\232\\2211\\377\\377\\377\\245\\2041\\377\\377\\377\\262x1\\377\\377\\377\"\n  \"\\277l1\\310d2\\312`1\\324X2\\327T1\\260|2\\377\\377\\377\\307\\260|\\244\\2102\\377\\377\"\n  \"\\377\\307\\300\\213\\232\\2211\\230\\2242\\377\\377\\377\\377\\377\\262\\310\\316\\231\\214\"\n  \"\\2402\\214\\2402\\377\\377\\377\\377\\377\\377\\312\\332\\250\\312\\332\\250\\200\\2542\\200\"\n  \"\\2542\\200\\2542\\377\\377\\377\\377\\377\\377\\377\\377\\377\\317\\344\\266\\317\\344\\266\"\n  \"\\317\\344\\266\\377\\377\\377t\\2702t\\2702t\\2702\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\325\\355\\305\\325\\355\\305\\325\\355\\305\\325\\355\"\n  \"\\305\\377\\377\\377\\377\\377\\377h\\3042h\\3042h\\3042h\\3042\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\\360P\\3342\\346\\371\\342\\\\\\3202\\335\"\n  \"\\364\\323h\\3042\\325\\355\\305t\\2702\\317\\344\\266\\377\\377\\377\\200\\2521\\377\\377\"\n  \"\\377\\215\\2351\\377\\377\\377\\232\\2211\\377\\377\\377\\245\\2041\\377\\377\\377\\262x\"\n  \"1\\377\\377\\377\\277l1\\377\\377\\377\\312`1\\377\\310|\\327T1\\227/\\14\\377\\377\\377\"\n  \"\\307\\260|\\244\\2102\\244\\2102\\377\\377\\377\\307\\300\\213\\230\\2242\\230\\2242\\377\"\n  \"\\377\\377\\310\\316\\231\\310\\316\\231\\214\\2402\\214\\2402\\377\\377\\377\\377\\377\\377\"\n  \"\\312\\332\\250\\312\\332\\250\\377\\377\\377\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\317\\344\\266\\317\\344\\266\\377\\377\\377\\377\\377\"\n  \"\\377t\\2702t\\2702\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\325\\355\\305\\325\\355\\305\\325\\355\\305\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377h\\3042h\\3042h\\3042\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\\360\"\n  \"T\\11TO\\3321\\377\\377\\377Z\\3002\\377\\377\\377h\\3042\\377\\377\\334t\\2702\\375\\377\"\n  \"\\310*\\30\\20\\312\\332\\250\\214\\2402\\262\\260\\214\\230\\2242\\307\\300\\213\\377\\377\"\n  \"\\377\\245\\2041\\377\\377\\377:\\35\\20\\377\\377\\377\\277l1\\316\\264w\\310d2\\377\\310\"\n  \"|\\356qL\\227/\\14\\260|2TZ3\\307\\260|\\244\\2102\\274\\302\\274\\307\\300\\213\\307\\300\"\n  \"\\213\\273\\301U\\377\\377\\377\\377\\377\\377A^2\\310\\316\\231\\214\\2402o\\216B\\377\\377\"\n  \"\\377\\377\\377\\377\\366\\377\\324\\312\\332\\250\\312\\332\\250*a\\20\\200\\2542\\377\\377\"\n  \"\\377\\230\\301\\230\\377\\377\\377\\377\\377\\377\\377\\377\\353\\317\\344\\266\\317\\344\"\n  \"\\266T\\253Tt\\2702t\\2702]\\265I\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377T\\306T\\377\\377\\377\\325\\355\\305l\\324i\\325\\355\\305\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377h\\3042\\\"\\254\\20h\\3042h\\3042b\\353b\\377\\377\\377\"\n  \"\\377\\377\\377D\\3502\\362\\375\\360\\377\\377\\377O\\3321\\377\\377\\377\\\\\\3202\\364\\377\"\n  \"\\336h\\3042\\325\\355\\305t\\2702\\317\\344\\266\\377\\377\\377\\200\\2521\\377\\377\\377\"\n  \"\\214\\2402\\377\\377\\262\\230\\2242\\307\\300\\213\\244\\2102\\307\\260|\\377\\377\\377\"\n  \"\\262x1\\377\\377\\377\\274p2\\377\\337\\207\\310d2\\377\\310|\\324X2\\333bB\\260|2\\377\"\n  \"\\377\\377\\307\\260|\\244\\2102\\244\\2102\\377\\377\\377\\307\\300\\213\\232\\2211\\230\"\n  \"\\2242\\377\\377\\377\\377\\377\\377\\310\\316\\231\\310\\316\\231\\214\\2402\\214\\2402\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\312\\332\\250\\312\\332\\250\\200\\2542\\200\\254\"\n  \"2\\200\\2542\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\317\\344\\266\\317\"\n  \"\\344\\266\\317\\344\\266\\377\\377\\377t\\2702t\\2702t\\2702\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\325\\355\\305\"\n  \"\\325\\355\\305\\325\\355\\305\\325\\355\\305\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"h\\3042h\\3042\\377\\377\\377\\377\\377\\377D\\3471\\377\\377\\377P\\3342\\364\\377\\352\"\n  \"\\\\\\3202\\335\\364\\323\\377\\377\\377h\\3021\\377\\377\\377t\\2702\\375\\377\\310\\200\\254\"\n  \"2\\312\\332\\250\\377\\377\\377\\215\\2351\\377\\377\\377\\230\\2242\\377\\377\\250\\244\\210\"\n  \"2\\307\\260|\\377\\377\\377\\262x1\\377\\377\\377\\274p2\\377\\337\\207\\310d2\\323xQ\\324\"\n  \"X2\\327T1\\227/\\14\\260|2\\377\\377\\234\\307\\260|\\244\\2102\\377\\377\\377\\377\\377\"\n  \"\\377\\307\\300\\213\\230\\2242\\230\\2242\\377\\377\\377\\377\\377\\377\\310\\316\\231\\310\"\n  \"\\316\\231\\214\\2402\\214\\2402\\377\\377\\377\\377\\377\\377\\377\\377\\377\\312\\332\\250\"\n  \"\\312\\332\\250\\377\\377\\377\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\317\\344\\266\\317\\344\\266\\377\\377\\377\\377\\377\"\n  \"\\377t\\2702t\\2702t\\2702\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\325\\355\\305\\325\\355\\305\\325\"\n  \"\\355\\305\\377\\377\\377\\377\\377\\377`\\0`\\377\\377\\377D\\3471\\371\\366\\371P\\3342\"\n  \"\\346\\371\\342\\377\\377\\377\\\\\\3161\\377\\377\\377'\\24\\22\\325\\355\\305t\\2702\\276\"\n  \"\\310\\251\\377\\377\\377\\200\\2542\\377\\377\\316\\214\\2402\\310\\316\\231`6`\\230\\224\"\n  \"2\\377\\377\\250\\222u<\\307\\260|\\377\\377\\377\\315\\214L\\377\\377\\377\\274p2M,#\\310\"\n  \"d2\\312`1\\306\\304\\306\\324X2\\333bB\\325\\242W\\377\\377\\377\\307\\260|=9\\22\\244\\210\"\n  \"2\\377\\377\\377\\227\\234w\\307\\300\\213\\230\\2242\\307\\322a\\377\\377\\377\\377\\377\"\n  \"\\377Km9\\310\\316\\231\\214\\2402r\\226K\\377\\377\\377\\377\\377\\377\\377\\377\\377\\312\"\n  \"\\332\\250\\312\\332\\250`\\242`\\200\\2542\\200\\2542\\224\\306\\224\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\317\\344\\266M\\250D\\317\\344\\266\\377\\377\\377\"\n  \"\\203\\322\\203t\\2702t\\2702\\301\\377\\177\\377\\377\\377\\377\\377\\377`\\330`\\377\\377\"\n  \"\\377\\377\\377\\377r\\344r\\377\\377\\377\\377\\377\\377\\377\\377\\377\\325\\355\\305\\377\"\n  \"\\377\\377\\377\\377\\377D\\3502\\371\\377\\364P\\3342\\346\\371\\342\\377\\377\\377\\\\\\320\"\n  \"2\\364\\377\\336h\\3042\\325\\355\\305\\377\\377\\377t\\2702\\317\\344\\266\\200\\2542\\312\"\n  \"\\332\\250\\377\\377\\377\\214\\2402\\310\\316\\231\\230\\2242\\307\\300\\213\\377\\377\\377\"\n  \"\\244\\2102\\307\\260|\\377\\377\\377\\200U0\\220^\\377\\7\\4/\\227U[\\246]\\377\\255Q1\\377\"\n  \"\\242y\\10\\3/\\306M@\\6\\4/{^\\377mVvmVv\\6\\5/h\\\\\\377h\\\\\\377\\\\U\\204\\12\\12\\360\\5\"\n  \"\\5/VX\\377VX\\377\\12\\12\\360LR\\221\\12\\12\\360\\5\\6/\\214\\2402\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\312\\332\\250\\312\\332\\250\\377\\377\\377\\200\\2542\\200\\2542\\200\"\n  \"\\2542\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\317\\344\"\n  \"\\266\\317\\344\\266\\317\\344\\266\\377\\377\\377\\377\\377\\377t\\2702t\\2702\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\\360P\\3342\\346\\371\"\n  \"\\342\\377\\377\\377\\\\\\3202\\335\\364\\323\\377\\377\\377h\\3042\\367\\377\\324t\\2702\\317\"\n  \"\\344\\266\\377\\377\\377\\200\\2542\\312\\332\\250\\377\\377\\377\\214\\2402\\377\\377\\262\"\n  \"\\230\\2242\\307\\300\\213\\377\\377\\377\\244\\2102\\307\\260|{^\\377\\200U0\\220^\\377\"\n  \"\\7\\4/\\227U[\\246]\\377\\7\\3/\\377\\242y\\236\\37\"\"2\\306M0\\210%\\14T-2{^\\377mVv\\6\"\n  \"\\5/\\6\\5/h\\\\\\377\\\\U\\204\\\\U\\204\\5\\5/\\5\\5/VX\\377VX\\377LR\\221LR\\221\\377\\377\\377\"\n  \"\\214\\2402\\214\\2402\\377\\377\\377\\377\\377\\377\\377\\377\\377\\312\\332\\250\\312\\332\"\n  \"\\250\\312\\332\\250\\377\\377\\377\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\317\\344\\266\\317\\344\\266\\377\"\n  \"\\377\\377\\377\\377\\377t\\2702t\\2702t\\2702\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\365\\375\\363\\377\\377\"\n  \"\\377O\\3321l\\22l\\\\\\3202\\335\\364\\323\\357\\346\\357h\\3042\\325\\355\\305\\377\\377\"\n  \"\\377t\\2702\\317\\344\\266l-l\\200\\2521\\377\\377\\377\\204\\211=\\310\\316\\231\\377\\377\"\n  \"\\377\\262\\243L\\307\\300\\213\\377\\377\\377E&\\25mVv{^\\377ySB\\220^\\377\\7\\4/\\275\"\n  \"t\\201\\246]\\377\\7\\3/I\\37!\\277Z\\377\\10\\3/\\237YQ\\6\\4/{^\\377\\236\\213\\247mVv\\6\"\n  \"\\5/,-lh\\\\\\377\\\\U\\204dow\\5\\5/\\5\\5/\\222\\251\\377VX\\377\\310\\316\\231T{@\\377\\377\"\n  \"\\377\\214\\2402w\\240V\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\312\\332\"\n  \"\\250U\\231G\\377\\377\\377\\200\\2542q\\270\\\\\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377l\\317l\\317\\344\\266\\317\\344\\266z\\330v\\377\\377\\377\"\n  \"\\377\\377\\377\\323\\377\\221t\\2702t\\2702l\\352l\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377D\\3502\\362\\375\\360\\377\\377\\377P\\3342\\346\\371\\342\\377\\377\\377\\\\\\3202\\364\"\n  \"\\377\\336h\\3042\\325\\355\\305\\377\\377\\377t\\2702\\317\\344\\266\\377\\377\\377\\200\"\n  \"\\2542\\312\\332\\250\\377\\377\\377\\214\\2402\\310\\316\\231\\377\\377\\377\\230\\2242\\307\"\n  \"\\300\\213\\377\\377\\377\\6\\5/mVv{^\\377\\200U0\\220^\\377\\7\\4/\\227U[\\246]\\377\\7\\3\"\n  \"/\\255RN\\277Z\\377\\10\\3/\\306M@\\6\\4/{^\\377{^\\377mVv\\6\\5/\\6\\5/h\\\\\\377h\\\\\\377\"\n  \"\\\\U\\204\\12\\12\\360\\5\\5/\\12\\12\\360\\377\\377\\377\\377\\377\\377\\310\\316\\231\\310\"\n  \"\\316\\231\\377\\377\\377\\214\\2402\\214\\2402\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\312\\332\\250\\312\\332\\250\\377\\377\\377\\200\\2542\\200\\2542\\200\\254\"\n  \"2\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\317\\344\\266\\317\\344\\266\\317\\344\\266\\377\\377\\377\\377\\377\\377t\\2702t\\2702\"\n  \"\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\\360\\377\\377\\377P\\3342\\346\\371\\342\"\n  \"\\377\\377\\377\\\\\\3202\\335\\364\\323\\377\\377\\377h\\3042\\325\\355\\305\\377\\377\\377\"\n  \"t\\2702\\317\\344\\266\\377\\377\\377\\200\\2542\\312\\332\\250\\377\\377\\377\\214\\2402\"\n  \"\\310\\316\\231\\377\\377\\377\\230\\2242\\307\\300\\213h\\\\\\377\\6\\5/mVv{^\\377\\200U0\"\n  \"\\220^\\377\\7\\4/\\227U[\\246]\\377\\7\\3/\\255RN\\277Z\\377\\10\\3/\\306M@\\6\\4/\\6\\4/{\"\n  \"^\\377mVvmVv\\6\\5/\\12\\12\\360h\\\\\\377\\\\U\\204\\\\U\\204\\5\\5/\\230\\2242\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\310\\316\\231\\310\\316\\231\\377\\377\\377\\214\\2402\\214\"\n  \"\\2402\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\312\\332\\250\\312\\332\"\n  \"\\250\\377\\377\\377\\377\\377\\377\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\317\\344\\266\\317\"\n  \"\\344\\266\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502q\\10p\\377\\377\"\n  \"\\377P\\3342\\335\\350\\332\\377\\377\\377\\\\\\3202\\351\\366\\337\\377\\377\\377h\\3042d\"\n  \"!\\\\\\377\\377\\377t\\2702\\277\\302\\252\\377\\377\\377\\200\\2542\\343\\345\\301\\377\\377\"\n  \"\\377\\214\\2402^2H\\377\\377\\377\\230\\2242\\257\\235\\204h\\\\\\377\\6\\5/\\223o\\234{^\"\n  \"\\377\\6\\4/<\\36\"\"1\\377\\252\\215j)2\\211XK\\377\\250\\203\\202$2\\337~c\\377\\242y\\236\"\n  \"\\37\"\"2]#\\26\\306M@\\6\\4/ym\\274{^\\377mVvELn\\6\\5/h\\\\\\37703x\\\\U\\204\\307\\300\\213\"\n  \"\\204\\226\\\\\\230\\2242\\377\\377\\377\\377\\377\\377\\377\\377\\377\\310\\316\\231^\\212\"\n  \"H\\377\\377\\377\\214\\2402}\\256b\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\312\\332\\250_\\251O\\377\\377\\377\\377\\377\\377y\\310j\\200\\2542\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377x\\341x\\377\\377\\377\\377\\377\\377\\177\\350\"\n  \"|\\317\\344\\266\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\\360\\377\\377\\377P\\334\"\n  \"2\\346\\371\\342\\377\\377\\377\\\\\\3202\\335\\364\\323\\377\\377\\377\\377\\377\\377h\\304\"\n  \"2\\325\\355\\305\\377\\377\\377t\\2702\\317\\344\\266\\377\\377\\377\\200\\2542\\312\\332\"\n  \"\\250\\377\\377\\377\\214\\2402\\310\\316\\231\\377\\377\\377\\230\\2242\\\\U\\204h\\\\\\377\"\n  \"\\6\\5/mVv{^\\377\\6\\4/\\12\\12\\360\\201Vi\\220^\\377\\7\\4/\\227U[\\246]\\377\\7\\3/\\255\"\n  \"RN\\277Z\\377\\10\\3/\\306M@\\6\\4/\\12\\12\\360{^\\377mVvmVv\\6\\5/\\12\\12\\360h\\\\\\377\"\n  \"\\377\\377\\377\\307\\300\\213\\377\\377\\377\\230\\2242\\230\\2242\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\310\\316\\231\\310\\316\\231\\377\\377\\377\\214\\2402\\214\\2402\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\312\\332\\250\\312\\332\\250\\312\"\n  \"\\332\\250\\377\\377\\377\\200\\2542\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\350\"\n  \"2\\362\\375\\360\\377\\377\\377P\\3342\\377\\377\\377\\346\\371\\342\\377\\377\\377\\\\\\320\"\n  \"2\\335\\364\\323\\377\\377\\377h\\3042\\325\\355\\305\\377\\377\\377t\\2702\\317\\344\\266\"\n  \"\\377\\377\\377\\200\\2542\\377\\377\\377\\312\\332\\250\\377\\377\\377\\214\\2402\\310\\316\"\n  \"\\231\\377\\377\\377\\5\\5/\\\\U\\204h\\\\\\377\\6\\5/mVv{^\\377\\6\\4/\\12\\12\\360\\201Vi\\220\"\n  \"^\\377\\7\\4/\\227U[\\246]\\377\\7\\3/\\255RN\\277Z\\377\\10\\3/\\306M@\\6\\4/\\6\\4/{^\\377\"\n  \"\\12\\12\\360mVv\\6\\5/\\6\\5/\\377\\377\\377\\377\\377\\377\\307\\300\\213\\307\\300\\213\\377\"\n  \"\\377\\377\\230\\2242\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\310\\316\"\n  \"\\231\\310\\316\\231\\377\\377\\377\\214\\2402\\214\\2402\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\312\\332\\250\\312\\332\\250\\377\\377\\377\\377\"\n  \"\\377\\377\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\204\\0\\204\\377\\377\\377D\\3502\\355\\364\\353\\377\\377\\377\\377\\377\\377Y\\335;\\346\"\n  \"\\371\\342\\377\\377\\377/\\26\\31\\335\\364\\323\\377\\377\\377k\\255<\\325\\355\\305\\377\"\n  \"\\377\\377\\377\\377\\377t\\2702\\317\\344\\266\\2046\\204\\200\\2542\\312\\332\\250\\340\"\n  \"\\317\\340\\214\\2402\\310\\316\\231\\377\\377\\377VX\\377\\5\\5//\\33Dh\\\\\\377\\6\\5/tVz\"\n  \"{^\\377\\6\\4/=0\\377\\201Vi\\220^\\377\\3\\1\\30\\227U[\\246]\\377?6U\\255RN\\277Z\\377\"\n  \"\\337]s\\306M0\\306M@\\3\\2\\30{^\\377{^\\377yv}mVv\\244\\2102\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377gyG\\307\\300\\213\\230\\2242\\212\\242h\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\310\\316\\231g\\230O\\377\\377\\377\\214\\2402\\205\\274q\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377h\\270V\\312\\332\"\n  \"\\250\\377\\377\\377\\222\\344\\222\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377D\\3502\\362\\375\\360\\377\\377\\377\\377\\377\\377P\\3342\\346\"\n  \"\\371\\342\\377\\377\\377\\\\\\3202\\335\\364\\323\\377\\377\\377\\377\\377\\377h\\3042\\325\"\n  \"\\355\\305\\377\\377\\377t\\2702\\317\\344\\266\\377\\377\\377\\377\\377\\377\\200\\2542\\312\"\n  \"\\332\\250\\377\\377\\377\\214\\2402\\310\\316\\231VX\\377\\12\\12\\360\\5\\5/\\\\U\\204h\\\\\"\n  \"\\377\\6\\5/mVv{^\\377\\6\\4/\\12\\12\\360\\201Vi\\220^\\377\\7\\4/\\227U[\\246]\\377\\7\\3\"\n  \"/\\255RN\\255RN\\277Z\\377\\10\\3/\\306M@\\6\\4/\\12\\12\\360{^\\377\\12\\12\\360\\307\\260\"\n  \"|\\244\\2102\\244\\2102\\377\\377\\377\\377\\377\\377\\377\\377\\377\\307\\300\\213\\377\\377\"\n  \"\\377\\230\\2242\\230\\2242\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\310\"\n  \"\\316\\231\\377\\377\\377\\377\\377\\377\\214\\2402\\214\\2402\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\312\\332\\250\\312\\332\\250\\377\\377\\377\"\n  \"\\377\\377\\377\\200\\2542\\200\\2542\\377\\377\\377\\377\\377\\377D\\3502\\377\\377\\377\"\n  \"\\362\\375\\360\\377\\377\\377P\\3342\\346\\371\\342\\377\\377\\377\\\\\\3202\\377\\377\\377\"\n  \"\\335\\364\\323\\377\\377\\377h\\3042\\325\\355\\305\\377\\377\\377\\377\\377\\377t\\2702\"\n  \"\\317\\344\\266\\377\\377\\377\\200\\2542\\312\\332\\250\\377\\377\\377\\377\\377\\377\\214\"\n  \"\\2402LR\\221VX\\377\\5\\5/\\\\U\\204\\12\\12\\360h\\\\\\377\\6\\5/mVv{^\\377\\6\\4/\\12\\12\\360\"\n  \"\\201Vi\\220^\\377\\7\\4/\\227U[\\246]\\377\\7\\3/\\7\\3/\\255RN\\277Z\\377\\10\\3/\\306M@\"\n  \"\\6\\4/\\6\\4/{^\\377\\377\\377\\377\\307\\260|\\377\\377\\377\\244\\2102\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\307\\300\\213\\307\\300\\213\\377\\377\\377\\230\\2242\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\310\\316\\231\\310\\316\\231\\377\\377\"\n  \"\\377\\377\\377\\377\\214\\2402\\214\\2402\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\312\\332\\250\\312\\332\\250\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377D\\3502\\377\\377\\377\\362\\375\\360\\377\\377\\377-\\17\\34\\346\"\n  \"\\371\\342\\377\\377\\377\\363\\346\\363\\\\\\3202\\335\\364\\323\\377\\377\\377h\\3042\\377\"\n  \"\\377\\377x)o\\377\\377\\377t\\2702\\301\\276\\255\\377\\377\\377\\377\\377\\377\\243\\273\"\n  \"U\\312\\332\\250\\377\\377\\377O-\\34\\12\\12\\360LR\\221gU\\333\\5\\5/\\\\U\\204<)\\377h\\\\\"\n  \"\\377\\6\\5/=!B{^\\377\\6\\4/A2\\306\\201Vi\\220^\\377I9q\\227U[\\246]\\377]-\\220\\7\\3\"\n  \"/\\255RN\\245q\\304\\10\\3/\\306M0\\377\\236\\221\\6\\4/\\377\\377\\377\\220\\231\\220\\307\"\n  \"\\260|\\307\\260|\\226\\227m\\244\\2102\\377\\377\\377\\377\\377\\377\\377\\377\\377\\307\"\n  \"\\300\\213p\\207N\\230\\2242\\230\\2242\\254\\316\\254\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\310\\316\\231\\310\\316\\231\\220\\317\\220\\377\\377\\377\\214\\2402\\216\\316\"\n  \"\\200\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377r\\310^\\312\"\n  \"\\332\\250\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\\360\\377\\377\\377\"\n  \"P\\3342\\377\\377\\377\\346\\371\\342\\377\\377\\377\\\\\\3202\\335\\364\\323\\377\\377\\377\"\n  \"\\377\\377\\377h\\3042\\325\\355\\305\\377\\377\\377\\377\\377\\377t\\2702\\317\\344\\266\"\n  \"\\377\\377\\377\\200\\2542\\377\\377\\377\\312\\332\\250\\377\\377\\377\\5\\6/LR\\221\\12\\12\"\n  \"\\360VX\\377\\5\\5/\\\\U\\204h\\\\\\377\\12\\12\\360\\6\\5/mVv{^\\377\\6\\4/\\12\\12\\360\\201\"\n  \"Vi\\220^\\377\\7\\4/\\227U[\\12\\12\\360\\246]\\377\\7\\3/\\255RN\\277Z\\377\\277Z\\377\\10\"\n  \"\\3/\\306M@\\260|2\\260|2\\377\\377\\377\\377\\377\\377\\307\\260|\\377\\377\\377\\244\\210\"\n  \"2\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\307\\300\\213\\377\\377\\377\"\n  \"\\230\\2242\\230\\2242\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\310\\316\"\n  \"\\231\\310\\316\\231\\377\\377\\377\\377\\377\\377\\214\\2402\\214\\2402\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377D\\3502\\362\\375\\360\\377\\377\\377P\\3342\\377\\377\\377\\346\\371\\342\\377\"\n  \"\\377\\377\\\\\\3202\\377\\377\\377\\335\\364\\323\\377\\377\\377h\\3042\\325\\355\\305\\377\"\n  \"\\377\\377\\377\\377\\377t\\2702\\317\\344\\266\\377\\377\\377\\377\\377\\377\\200\\2542\\312\"\n  \"\\332\\250\\377\\377\\377\\12\\12\\360\\5\\6/LR\\221VX\\377\\12\\12\\360\\5\\5/\\\\U\\204h\\\\\"\n  \"\\377\\6\\5/\\12\\12\\360mVv{^\\377\\6\\4/\\12\\12\\360\\201Vi\\220^\\377\\7\\4/\\227U[\\227\"\n  \"U[\\246]\\377\\7\\3/\\255RN\\12\\12\\360\\277Z\\377\\10\\3/\\333bB\\377\\377\\377\\260|2\\377\"\n  \"\\377\\377\\377\\377\\377\\307\\260|\\307\\260|\\244\\2102\\244\\2102\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\307\\300\\213\\307\\300\\213\\377\\377\\377\\230\\2242\\230\\224\"\n  \"2\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\310\\316\\231\\310\\316\\231\"\n  \"\\377\\377\\377\\377\\377\\377\\214\\2402\\214\\2402\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377)\\10\\36\\362\\375\\360\\377\\377\\377\\370\"\n  \"\\356\\370P\\3342\\346\\371\\342\\377\\377\\377\\377\\377\\377\\\\\\3202\\207\\\"\\201\\377\\377\"\n  \"\\377\\377\\377\\377p\\250D\\325\\355\\305\\377\\377\\377\\377\\377\\377t\\2702\\317\\344\"\n  \"\\266\\234?\\234\\200\\2542\\377\\377\\377\\274\\260\\244FS\\377\\5\\6/;#\\377LR\\221VX\\377\"\n  \"\\3\\1\\34\\12\\12\\360\\\\U\\204{^\\330\\6\\5/\\12\\12\\360\\257\\203\\270{^\\377\\6\\4/\\6\\4\"\n  \"\\222\\201Vi\\220^\\377P@d\\12\\12\\360\\227U[\\370\\244\\377\\7\\3/\\255RNi./\\277Z\\377\"\n  \"\\324X2\\264\\202w\\333bB\\260|2\\377\\377\\377\\377\\377\\377\\377\\377\\377yvK\\377\\377\"\n  \"\\377\\244\\2102\\236\\247|\\377\\377\\377\\377\\377\\377\\377\\377\\377\\307\\300\\213\\307\"\n  \"\\300\\213\\234\\306\\234\\230\\2242\\377\\377\\377\\256\\330\\256\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\310\\316\\231\\310\\316\\231\\234\\341\\234\\377\\377\\377\\214\\240\"\n  \"2\\232\\343\\223\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\"\n  \"\\360\\377\\377\\377\\377\\377\\377P\\3342\\346\\371\\342\\377\\377\\377\\377\\377\\377\\\\\"\n  \"\\3202\\335\\364\\323\\377\\377\\377\\377\\377\\377h\\3042\\325\\355\\305\\377\\377\\377\\377\"\n  \"\\377\\377t\\2702\\317\\344\\266\\377\\377\\377\\377\\377\\377\\200\\2542\\312\\332\\250\\12\"\n  \"\\12\\360FS\\377\\5\\6/LR\\221\\12\\12\\360RW\\255\\3\\5\\35\\6\\11\\224ZT\\\\d[\\261\\3\\4\\35\"\n  \"\\6\\11\\224lVTw]\\264\\4\\4\\35\\6\\11\\224\\200VN\\214]\\270\\4\\3\\35\\6\\11\\224\\226UG\\242\"\n  \"\\\\\\274\\4\\3\\35\\4\\3\\35\\254R@\\377\\377\\311\\203U\\36\\203U\\36\\323a:my\\36my\\36\\377\"\n  \"\\377\\276\\377\\377\\276\\243\\255X\\243\\255X\\236\\371\\236e\\204\\36\\236\\371\\236\\374\"\n  \"\\377\\273\\236\\371\\236\\236\\371\\236\\234\\275`\\236\\371\\236^\\220\\36^\\220\\36\\236\"\n  \"\\371\\236\\352\\377\\267\\352\\377\\267\\236\\371\\236\\236\\371\\236\\310\\316\\231\\310\"\n  \"\\316\\231\\377\\377\\377\\377\\377\\377\\214\\2402\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377D\\3502\\362\\375\\360\\377\\377\\377\\377\\377\\377P\\3342\\346\\371\\342\\377\\377\"\n  \"\\377\\377\\377\\377\\\\\\3202\\377\\377\\377\\335\\364\\323\\377\\377\\377h\\3042\\377\\377\"\n  \"\\377\\325\\355\\305\\377\\377\\377t\\2702\\377\\377\\377\\317\\344\\266\\377\\377\\377\\377\"\n  \"\\377\\377\\200\\2542<L\\237FS\\377\\12\\12\\360\\5\\6/LR\\221\\6\\11\\224RW\\255\\3\\5\\35\"\n  \"ZT\\\\\\6\\11\\224d[\\261\\3\\4\\35\\6\\11\\224lVTw]\\264\\4\\4\\35\\6\\11\\224\\200VN\\214]\\270\"\n  \"\\4\\3\\35\\4\\3\\35\\226UG\\242\\\\\\274\\6\\11\\224\\4\\3\\35\\304wB\\377\\377\\311\\377\\377\"\n  \"\\311\\203U\\36\\323a:\\236\\371\\236my\\36\\236\\371\\236\\377\\377\\276\\236\\371\\236\\243\"\n  \"\\255X\\236\\371\\236e\\204\\36e\\204\\36\\374\\377\\273\\374\\377\\273\\236\\371\\236\\234\"\n  \"\\275`\\234\\275`\\236\\371\\236^\\220\\36^\\220\\36\\236\\371\\236\\352\\377\\267\\352\\377\"\n  \"\\267\\377\\377\\377\\377\\377\\377\\310\\316\\231\\310\\316\\231\\377\\377\\377\\250\\0\\250\"\n  \"\\377\\377\\377\\377\\377\\377F\\3375\\362\\375\\360\\377\\377\\377\\377\\377\\377P\\3342\"\n  \"\\377\\377\\377\\227\\32\\224\\377\\377\\377\\\\\\3202\\362\\340\\362\\335\\364\\323\\377\\377\"\n  \"\\377\\377\\377\\377h\\3042\\325\\355\\305\\2506\\250\\377\\377\\377t\\2702\\304\\272\\262\"\n  \"\\377\\377\\377\\377\\377\\377\\257\\300a\\12\\12\\360<L\\237.\\32\\250\\5\\6/\\12\\12\\360\"\n  \"jSzRW\\255\\6\\11\\224D+^ZT\\\\\\6\\11\\224A&t\\3\\4\\35lVTP9\\235w]\\264\\4\\4\\35YG\\347\"\n  \"\\200VN\\214]\\270\\3\\4a\\4\\3\\35\\226UG\\244y\\257\\6\\11\\224{a\\36\\377\\322\\246\\236\"\n  \"\\371\\236\\377\\377\\311V6\\23\\323a:\\323a:\\223\\231y\\236\\371\\236\\377\\377\\276\\377\"\n  \"\\377\\377\\243\\255X\\243\\255Xh\\270he\\204\\36\\236\\371\\236\\272\\322\\253\\374\\377\"\n  \"\\273\\236\\371\\236\\377\\377\\350\\236\\371\\236\\236\\371\\236=y\\23\\236\\371\\236\\236\"\n  \"\\371\\236\\262\\344\\262\\377\\377\\377\\377\\377\\377\\377\\377\\377\\310\\316\\231\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\\360\\377\\377\\377\\377\\377\\377\"\n  \"P\\3342\\377\\377\\377\\346\\371\\342\\377\\377\\377\\377\\377\\377\\\\\\3202\\335\\364\\323\"\n  \"\\377\\377\\377\\377\\377\\377h\\3042\\325\\355\\305\\377\\377\\377\\377\\377\\377t\\2702\"\n  \"\\377\\377\\377\\317\\344\\266\\377\\377\\377\\377\\377\\377\\5\\6/<L\\237\\12\\12\\360FS\\377\"\n  \"\\5\\6/\\6\\11\\224JQbRW\\255\\6\\11\\224\\3\\5\\35ZT\\\\d[\\261\\6\\11\\224\\3\\4\\35lVT\\6\\11\"\n  \"\\224w]\\264\\4\\4\\35\\6\\11\\224\\200VN\\214]\\270\\6\\11\\224\\4\\3\\35\\226UG\\242\\\\\\274\"\n  \"\\377\\377\\306{a\\36\\304wB\\304wB\\377\\377\\311\\203U\\36\\203U\\36\\323a:my\\36my\\36\"\n  \"\\377\\377\\276\\377\\377\\276\\236\\371\\236\\243\\255X\\236\\371\\236e\\204\\36e\\204\\36\"\n  \"\\236\\371\\236\\374\\377\\273\\236\\371\\236\\234\\275`\\234\\275`\\236\\371\\236^\\220\\36\"\n  \"^\\220\\36\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\\360\\377\\377\\377\\377\\377\\377\"\n  \"P\\3342\\377\\377\\377\\346\\371\\342\\377\\377\\377\\377\\377\\377\\\\\\3202\\335\\364\\323\"\n  \"\\377\\377\\377\\377\\377\\377h\\3042\\377\\377\\377\\325\\355\\305\\377\\377\\377\\377\\377\"\n  \"\\377t\\2702\\317\\344\\266\\377\\377\\377\\377\\377\\377\\5\\6/\\12\\12\\360<L\\237FS\\377\"\n  \"\\12\\12\\360\\3\\5\\35JQb\\6\\11\\224RW\\255\\3\\5\\35\\6\\11\\224ZT\\\\d[\\261\\6\\11\\224\\3\"\n  \"\\4\\35lVT\\6\\11\\224w]\\264\\4\\4\\35\\6\\11\\224\\200VN\\214]\\270\\6\\11\\224\\4\\3\\35\\226\"\n  \"UG\\236\\371\\236\\377\\377\\306{a\\36\\236\\371\\236\\304wB\\377\\377\\311\\236\\371\\236\"\n  \"\\203U\\36\\323a:\\236\\371\\236my\\36\\236\\371\\236\\377\\377\\276\\236\\371\\236\\243\\255\"\n  \"X\\243\\255X\\236\\371\\236e\\204\\36\\236\\371\\236\\374\\377\\273\\374\\377\\273\\236\\371\"\n  \"\\236\\234\\275`\\234\\275`\\236\\371\\236\\230\\2242\\230\\2242\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377J\\3508\\377\\377\\377\\362\"\n  \"\\375\\360\\264\\22\\264\\377\\377\\377P\\3342\\340\\340\\335\\377\\377\\377\\377\\377\\377\"\n  \"u\\325K\\377\\377\\377\\335\\364\\323\\264-\\264\\377\\377\\377h\\3042\\315\\305\\301\\377\"\n  \"\\377\\377\\377\\377\\377\\240\\307^\\377\\377\\377\\317\\344\\266\\264H\\264\\12\\12\\360\"\n  \"\\5\\6/aL\\245\\12\\12\\360FS\\377E(\\323\\3\\5\\35JQb\\4\\3hRW\\255\\3\\5\\35O2\\241ZT\\\\d\"\n  \"[\\261X>\\346\\3\\4\\35lVT\\4\\4hw]\\264\\4\\4\\35aK\\244\\200VN\\214]\\270kZ\\371\\4\\3\\35\"\n  \"\\270\\212Io\\225o\\377\\377\\306{a\\36\\253\\300\\253\\304wB\\377\\377\\311\\377\\377\\377\"\n  \"\\203U\\36\\323a:\\224D(my\\36\\236\\371\\236\\307\\316\\266\\377\\377\\276\\236\\371\\236\"\n  \"\\377\\377\\343\\236\\371\\236e\\204\\36Gk\\25\\236\\371\\236\\374\\377\\273\\260\\334\\260\"\n  \"\\236\\371\\236\\234\\275`\\377\\377\\377\\377\\377\\377\\230\\2242k\\207#\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\377\\377\\377\\362\\375\\360\\377\\377\"\n  \"\\377\\377\\377\\377P\\3342\\346\\371\\342\\377\\377\\377\\377\\377\\377\\\\\\3202\\377\\377\"\n  \"\\377\\335\\364\\323\\377\\377\\377\\377\\377\\377h\\3042\\377\\377\\377\\325\\355\\305\\377\"\n  \"\\377\\377\\377\\377\\377t\\2702\\317\\344\\266\\377\\377\\3778L\\377\\12\\12\\360\\5\\6/<\"\n  \"L\\237\\12\\12\\360BR\\252\\3\\5\\35\\6\\11\\224JQbRW\\255\\6\\11\\224\\3\\5\\35ZT\\\\\\6\\11\\224\"\n  \"d[\\261\\6\\11\\224\\3\\4\\35lVT\\6\\11\\224w]\\264\\4\\4\\35\\6\\11\\224\\200VN\\214]\\270\\6\"\n  \"\\11\\224tm\\36\\270\\212I\\270\\212I\\377\\377\\306{a\\36{a\\36\\304wB\\236\\371\\236\\377\"\n  \"\\377\\311\\203U\\36\\236\\371\\236\\323a:my\\36my\\36\\236\\371\\236\\377\\377\\276\\236\"\n  \"\\371\\236\\243\\255X\\243\\255X\\236\\371\\236e\\204\\36\\236\\371\\236\\374\\377\\273\\374\"\n  \"\\377\\273\\236\\371\\236\\307\\300\\213\\307\\300\\213\\377\\377\\377\\377\\377\\377\\230\"\n  \"\\2242\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\377\\377\\377\\362\\375\\360\\377\"\n  \"\\377\\377\\377\\377\\377P\\3342\\377\\377\\377\\346\\371\\342\\377\\377\\377\\377\\377\\377\"\n  \"\\\\\\3202\\335\\364\\323\\377\\377\\377\\377\\377\\377\\377\\377\\377h\\3042\\325\\355\\305\"\n  \"\\377\\377\\377\\377\\377\\377t\\2702\\377\\377\\377\\317\\344\\2668L\\377\\12\\12\\360\\5\"\n  \"\\6/\\12\\12\\360<L\\237BR\\252\\6\\11\\224\\3\\5\\35JQb\\6\\11\\224RW\\255\\6\\11\\224\\3\\5\"\n  \"\\35ZT\\\\\\6\\11\\224d[\\261\\3\\4\\35\\6\\11\\224lVT\\6\\11\\224w]\\264\\4\\4\\35\\6\\11\\224\"\n  \"\\200VN\\214]\\270\\236\\371\\236tm\\36\\236\\371\\236\\270\\212I\\377\\377\\306\\236\\371\"\n  \"\\236{a\\36\\304wB\\236\\371\\236\\377\\377\\311\\203U\\36\\203U\\36\\323a:\\236\\371\\236\"\n  \"my\\36\\236\\371\\236\\377\\377\\276\\377\\377\\276\\236\\371\\236\\243\\255X\\236\\371\\236\"\n  \"e\\204\\36e\\204\\36\\236\\371\\236\\374\\377\\273\\377\\377\\377\\377\\377\\377\\307\\300\"\n  \"\\213\\307\\300\\213\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\3773\\10%\\377\"\n  \"\\377\\377\\362\\375\\360\\372\\356\\372\\377\\377\\377P\\3342\\377\\377\\377\\346\\371\\342\"\n  \"\\377\\377\\377\\300$\\300\\\\\\3202\\377\\377\\377\\327\\317\\316\\377\\377\\377\\377\\377\"\n  \"\\377\\220\\317Z\\377\\377\\377\\325\\355\\305\\300?\\300\\377\\377\\377t\\2702\\312\\267\"\n  \"\\270\\12\\12\\3608L\\377F#\\377\\5\\6/<L\\237\\4\\3oBR\\252\\6\\11\\224K)[JQb\\6\\11\\224\"\n  \"\\243\\204\\376\\3\\5\\35\\6\\11\\224C&E\\6\\11\\224d[\\261_@l\\6\\11\\224lVTkP\\371w]\\264\"\n  \"\\4\\4\\35\\4\\5o\\200VN\\377\\377\\302\\262\\276\\262tm\\36\\236\\371\\236\\377\\360\\302\\377\"\n  \"\\377\\306\\236\\371\\236\\\\A\\26\\304wB\\304wB\\322\\312\\302\\236\\371\\236\\203U\\36\\377\"\n  \"\\355\\310\\323a:my\\36R]\\26\\236\\371\\236\\377\\377\\276\\270\\326\\270\\243\\255X\\236\"\n  \"\\371\\236\\377\\377\\377e\\204\\36\\236\\371\\236\\300\\341\\300\\377\\377\\377\\377\\377\"\n  \"\\377\\305\\353\\305\\307\\300\\213\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\377\"\n  \"\\377\\377\\362\\375\\360\\377\\377\\377\\377\\377\\377P\\3342\\377\\377\\377\\346\\371\\342\"\n  \"\\377\\377\\377\\377\\377\\377\\\\\\3202\\377\\377\\377\\335\\364\\323\\377\\377\\377\\377\\377\"\n  \"\\377h\\3042\\377\\377\\377\\325\\355\\305\\377\\377\\377\\377\\377\\377t\\2702\\377\\377\"\n  \"\\3770E\\254\\12\\12\\3608L\\377\\5\\6/\\12\\12\\360:Lj\\6\\11\\224BR\\252\\3\\5\\35\\6\\11\\224\"\n  \"JQb\\6\\11\\224RW\\255\\3\\5\\35\\6\\11\\224ZT\\\\\\6\\11\\224d[\\261\\3\\4\\35\\6\\11\\224lVT\"\n  \"\\6\\11\\224w]\\264\\4\\4\\35\\6\\11\\224\\255\\235Q\\377\\377\\302\\377\\377\\302tm\\36\\236\"\n  \"\\371\\236\\270\\212I\\377\\377\\306\\377\\377\\306{a\\36\\236\\371\\236\\304wB\\377\\377\"\n  \"\\311\\377\\377\\311\\203U\\36\\236\\371\\236\\323a:\\236\\371\\236my\\36\\236\\371\\236\\377\"\n  \"\\377\\276\\236\\371\\236\\243\\255X\\243\\255X\\236\\371\\236e\\204\\36\\244\\2102\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377D\\3502\\377\\377\\377\\362\\375\\360\\377\\377\\377\\377\\377\\377P\\3342\\377\\377\"\n  \"\\377\\346\\371\\342\\377\\377\\377\\377\\377\\377\\377\\377\\377\\\\\\3202\\335\\364\\323\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377h\\3042\\325\\355\\305\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377t\\2702\\317\\344\\266\\377\\377\\377\\377\\377\\377\\377\\377\\377\\200\\254\"\n  \"2\\236\\371\\236\\222\\326p\\332\\377\\264\\236\\371\\236V\\234\\36\\236\\371\\236\\226\\312\"\n  \"g\\352\\377\\267\\236\\371\\236^\\220\\36\\236\\371\\236\\234\\275`\\374\\377\\273\\236\\371\"\n  \"\\236e\\204\\36\\236\\371\\236\\243\\255X\\377\\377\\276\\236\\371\\236my\\36\\236\\371\\236\"\n  \"\\255\\235Q\\236\\371\\236\\377\\377\\302tm\\36\\236\\371\\236\\270\\212I\\236\\371\\236\\377\"\n  \"\\377\\306{a\\36\\236\\371\\236\\304wB\\236\\371\\236\\377\\377\\311\\203U\\36\\203U\\36\\323\"\n  \"a:\\236\\371\\236my\\36\\236\\371\\236\\377\\377\\276\\377\\377\\276\\236\\371\\236\\243\\255\"\n  \"X\\236\\371\\236\\377\\377\\377\\244\\2102\\377\\377\\377\\377\\377\\377\\377\\377\\377\\314\"\n  \"\\0\\314\\377\\377\\377\\377\\377\\377H\\3377\\377\\377\\377\\362\\375\\360\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377@\\27(\\346\\371\\342\\377\\377\\377\\367\\340\\367\\377\\377\"\n  \"\\377\\\\\\3202\\377\\377\\377\\335\\364\\323\\377\\377\\377\\3146\\314h\\3042\\377\\377\\377\"\n  \"\\322\\301\\306\\377\\377\\377\\377\\377\\377\\255\\314k\\377\\377\\377\\317\\344\\266\\314\"\n  \"Q\\314\\377\\377\\377\\200\\2542\\256\\300\\256\\222\\326p\\236\\371\\236\\377\\377\\377\\236\"\n  \"\\371\\236V\\234\\36xUR\\236\\371\\236\\352\\377\\267\\262\\273\\262^\\220\\36\\234\\275`\"\n  \"\\377\\377\\377\\374\\377\\273\\236\\371\\236PE\\30\\236\\371\\236\\243\\255X\\342\\300\\305\"\n  \"\\236\\371\\236my\\36\\377\\377\\377\\255\\235Q\\236\\371\\236\\314\\242\\233tm\\36\\236\\371\"\n  \"\\236\\304\\237\\240\\236\\371\\236\\377\\377\\306\\377\\340\\256{a\\36\\304wB~\\270~\\377\"\n  \"\\377\\311\\236\\371\\236\\273\\254\\244\\323a:\\323a:\\377\\377\\303my\\36\\236\\371\\236\"\n  \"\\314\\330\\230\\236\\371\\236\\243\\255X\\313\\332\\302\\377\\377\\377\\244\\2102\\377\\377\"\n  \"\\355\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\362\"\n  \"\\375\\360\\377\\377\\377\\377\\377\\377\\377\\377\\377P\\3342\\377\\377\\377\\346\\371\\342\"\n  \"\\377\\377\\377\\377\\377\\377\\\\\\3202\\377\\377\\377\\335\\364\\323\\377\\377\\377\\377\\377\"\n  \"\\377h\\3042\\377\\377\\377\\325\\355\\305\\377\\377\\377\\377\\377\\377\\377\\377\\377t\\270\"\n  \"2\\317\\344\\266\\377\\377\\377\\377\\377\\377\\377\\377\\377O\\247\\36\\236\\371\\236\\222\"\n  \"\\326p\\332\\377\\264\\236\\371\\236V\\234\\36\\236\\371\\236\\226\\312g\\236\\371\\236\\352\"\n  \"\\377\\267\\236\\371\\236^\\220\\36\\234\\275`\\236\\371\\236\\374\\377\\273\\236\\371\\236\"\n  \"e\\204\\36\\236\\371\\236\\243\\255X\\377\\377\\276\\236\\371\\236my\\36\\236\\371\\236\\255\"\n  \"\\235Q\\236\\371\\236\\377\\377\\302tm\\36\\236\\371\\236\\270\\212I\\236\\371\\236\\377\\377\"\n  \"\\306\\236\\371\\236{a\\36\\304wB\\304wB\\377\\377\\311\\236\\371\\236\\203U\\36\\236\\371\"\n  \"\\236\\323a:\\236\\371\\236my\\36\\236\\371\\236\\377\\377\\276\\377\\377\\276\\377\\377\\377\"\n  \"\\307\\260|\\377\\377\\377\\377\\377\\377\\244\\2102\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377D\\3502\\362\\375\\360\\377\\377\\377\\377\\377\\377\\377\\377\\377P\\334\"\n  \"2\\377\\377\\377\\346\\371\\342\\377\\377\\377\\377\\377\\377\\\\\\3202\\377\\377\\377\\335\"\n  \"\\364\\323\\377\\377\\377\\377\\377\\377\\377\\377\\377h\\3042\\377\\377\\377\\325\\355\\305\"\n  \"\\377\\377\\377\\377\\377\\377t\\2702\\377\\377\\377\\317\\344\\266\\377\\377\\377\\377\\377\"\n  \"\\377\\236\\371\\236O\\247\\36\\222\\326p\\236\\371\\236\\332\\377\\264\\236\\371\\236V\\234\"\n  \"\\36\\236\\371\\236\\226\\312g\\236\\371\\236\\352\\377\\267^\\220\\36\\236\\371\\236\\234\"\n  \"\\275`\\236\\371\\236\\374\\377\\273\\236\\371\\236e\\204\\36\\236\\371\\236\\243\\255X\\377\"\n  \"\\377\\276\\236\\371\\236my\\36\\236\\371\\236\\255\\235Q\\236\\371\\236\\377\\377\\302tm\"\n  \"\\36tm\\36\\270\\212I\\236\\371\\236\\377\\377\\306\\236\\371\\236{a\\36\\236\\371\\236\\304\"\n  \"wB\\377\\377\\311\\377\\377\\311\\203U\\36\\236\\371\\236\\323a:\\236\\371\\236my\\36\\236\"\n  \"\\371\\236\\236\\371\\236\\377\\377\\377\\377\\377\\377\\307\\260|\\307\\260|\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\362\\375\\360\\330\\22\"\n  \"\\330\\377\\377\\377\\377\\377\\377]\\306B\\377\\377\\377\\346\\371\\342\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377M$*\\335\\364\\323\\377\\377\\377\\366\\324\\366\\377\\377\\377h\"\n  \"\\3042\\377\\377\\377\\325\\355\\305\\377\\377\\377\\330H\\330\\377\\377\\377t\\2702\\321\"\n  \"\\264\\300\\377\\377\\377\\377\\377\\377\\352\\377\\352O\\247\\36\\236\\371\\236{S^\\236\\371\"\n  \"\\236\\332\\377\\264\\266\\274\\266V\\234\\36\\226\\312g\\377\\377\\377\\352\\377\\267\\236\"\n  \"\\371\\236OG\\31\\236\\371\\236\\234\\275`\\274\\274\\274\\374\\377\\273\\236\\371\\236\\336\"\n  \"\\325\\227\\243\\255X\\236\\371\\236\\330\\231\\240\\236\\371\\236my\\36\\302\\300\\302\\255\"\n  \"\\235Q\\236\\371\\236\\377\\377\\377\\236\\371\\236tm\\36\\233a=\\236\\371\\236\\377\\377\"\n  \"\\306\\310\\314\\310{a\\36\\236\\371\\236\\377\\377\\351\\236\\371\\236\\377\\377\\311nE\\31\"\n  \"\\203U\\36\\323a:\\326\\304\\276my\\36my\\36\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\330\\352\\330\\307\\260|\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\350\"\n  \"2\\377\\377\\377\\362\\375\\360\\377\\377\\377\\377\\377\\377P\\3342\\377\\377\\377\\346\\371\"\n  \"\\342\\377\\377\\377\\377\\377\\377\\377\\377\\377\\\\\\3202\\377\\377\\377\\335\\364\\323\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377h\\3042\\325\\355\\305\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377t\\2702\\377\\377\\377\\317\\344\\266\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\200\\2542\\377\\377\\377\\312\\332\\250\\377\\377\\377\\377\\377\\377\\214\\2402\\377\"\n  \"\\377\\377\\310\\316\\231\\377\\377\\377\\377\\377\\377\\377\\377\\377\\230\\2242\\377\\377\"\n  \"\\377\\307\\300\\213\\377\\377\\377\\377\\377\\377\\244\\2102\\377\\377\\377\\307\\260|\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\260|2\\377\\377\\377\\312\\237n\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\274p2\\316\\214_\\316\\214_\\377\\377\\377\\377\\377\\377\\310\"\n  \"d2\\377\\377\\377\\323xQ\\377\\377\\377\\377\\377\\377\\377\\377\\377\\324X2\\377\\377\\377\"\n  \"\\333bB\\377\\377\\377\\260|2\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\377\\377\\377\\362\\375\"\n  \"\\360\\377\\377\\377\\377\\377\\377P\\3342\\377\\377\\377\\346\\371\\342\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\\\\\3202\\377\\377\\377\\335\\364\\323\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377h\\3042\\377\\377\\377\\325\\355\\305\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377t\\2702\\317\\344\\266\\377\\377\\377\\377\\377\\377\\377\\377\\377\\200\\2542\\377\\377\"\n  \"\\377\\312\\332\\250\\377\\377\\377\\377\\377\\377\\377\\377\\377\\214\\2402\\377\\377\\377\"\n  \"\\310\\316\\231\\377\\377\\377\\377\\377\\377\\377\\377\\377\\230\\2242\\377\\377\\377\\307\"\n  \"\\300\\213\\377\\377\\377\\377\\377\\377\\244\\2102\\377\\377\\377\\307\\260|\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\260|2\\377\\377\\377\\312\\237n\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\274p2\\377\\377\\377\\316\\214_\\377\\377\\377\\377\\377\\377\\310d2\\310\"\n  \"d2\\323xQ\\377\\377\\377\\377\\377\\377\\377\\377\\377\\324X2\\377\\377\\377\\333bB\\377\"\n  \"\\377\\377\\260|2\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\344\\11\\344D\\3502\\377\\377\\377\\360\\354\\357\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377P\\3342\\377\\377\\377\\315#\\312\\377\\377\\377\\377\\377\\377s\\262\"\n  \"Q\\377\\377\\377\\335\\364\\323\\377\\377\\377\\377\\377\\377\\377\\377\\377\\\\0,\\377\\377\"\n  \"\\377\\325\\355\\305\\367\\313\\367\\377\\377\\377\\377\\377\\377\\274\\321z\\377\\377\\377\"\n  \"\\317\\344\\266\\344Z\\344\\377\\377\\377\\377\\377\\377\\246\\217v\\377\\377\\377\\312\\332\"\n  \"\\250\\377\\377\\377\\377\\377\\377\\377\\377\\377}I,\\377\\377\\377\\310\\316\\231\\361\\277\"\n  \"\\361\\377\\377\\377\\230\\2242\\377\\377\\377\\307\\300\\213\\377\\377\\377\\344\\220\\344\"\n  \"\\377\\377\\377\\244\\2102\\356\\301\\356\\307\\260|\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\260|2\\344\\253\\344\\312\\237n\\377\\377\\377\\353\\312\\353\\377\\377\\377\\274p\"\n  \"2\\377\\377\\377\\316\\214_\\377\\377\\377\\344\\306\\344\\377\\377\\377\\310d2\\340\\276\"\n  \"\\310\\323xQ\\377\\377\\377\\377\\377\\377\\324X2\\324X2\\303V;\\333bB\\260|2\\337\\340\"\n  \"\\325\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\377\"\n  \"\\377\\377\\362\\375\\360\\377\\377\\377\\377\\377\\377\\377\\377\\377P\\3342\\377\\377\\377\"\n  \"\\346\\371\\342\\377\\377\\377\\377\\377\\377\\377\\377\\377\\\\\\3202\\377\\377\\377\\335\\364\"\n  \"\\323\\377\\377\\377\\377\\377\\377\\377\\377\\377h\\3042\\377\\377\\377\\325\\355\\305\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377t\\2702\\317\\344\\266\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\200\\2542\\377\\377\\377\\312\\332\\250\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\214\\2402\\377\\377\\377\\310\\316\\231\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\230\\2242\\377\\377\\377\\307\\300\\213\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\244\\2102\\377\\377\\377\\307\\260|\\377\\377\\377\\377\\377\\377\\377\\377\\377\\260|2\"\n  \"\\377\\377\\377\\312\\237n\\377\\377\\377\\377\\377\\377\\377\\377\\377\\274p2\\377\\377\\377\"\n  \"\\316\\214_\\377\\377\\377\\377\\377\\377\\377\\377\\377\\310d2\\377\\377\\377\\323xQ\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\324X2\\377\\377\\377\\333bB\\377\\377\\377\\260\"\n  \"|2\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377\\377D\\3502\\377\\377\\377\\362\"\n  \"\\375\\360\\377\\377\\377\\377\\377\\377\\377\\377\\377P\\3342\\377\\377\\377\\346\\371\\342\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\377\\\\\\3202\\377\\377\\377\\335\\364\\323\\377\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377h\\3042\\377\\377\\377\\325\\355\\305\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\377\\377t\\2702\\377\\377\\377\\317\\344\\266\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\377\\200\\2542\\377\\377\\377\\312\\332\\250\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\377\\214\\2402\\377\\377\\377\\310\\316\\231\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\377\\230\\2242\\377\\377\\377\\307\\300\\213\\377\\377\\377\\377\\377\\377\\377\\377\\377\"\n  \"\\244\\2102\\377\\377\\377\\307\\260|\\377\\377\\377\\377\\377\\377\\377\\377\\377\\260|2\"\n  \"\\377\\377\\377\\312\\237n\\377\\377\\377\\377\\377\\377\\377\\377\\377\\274p2\\377\\377\\377\"\n  \"\\316\\214_\\377\\377\\377\\377\\377\\377\\377\\377\\377\\310d2\\377\\377\\377\\323xQ\\377\"\n  \"\\377\\377\\377\\377\\377\\377\\377\\377\\324X2\\377\\377\\377\\333bB\\377\\377\\377\",\n};\n\n/**\n * \\brief Returns the PrimitivesBlend test image as SDL_Surface.\n */\nSDL_Surface *SDLTest_ImagePrimitivesBlend()\n{\n   SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(\n        (void*)SDLTest_imagePrimitivesBlend.pixel_data,\n        SDLTest_imagePrimitivesBlend.width,\n        SDLTest_imagePrimitivesBlend.height,\n        SDLTest_imagePrimitivesBlend.bytes_per_pixel * 8,\n        SDLTest_imagePrimitivesBlend.width * SDLTest_imagePrimitivesBlend.bytes_per_pixel,\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n         0xff000000, /* Red bit mask. */\n         0x00ff0000, /* Green bit mask. */\n         0x0000ff00, /* Blue bit mask. */\n         0x000000ff  /* Alpha bit mask. */\n#else\n         0x000000ff, /* Red bit mask. */\n         0x0000ff00, /* Green bit mask. */\n         0x00ff0000, /* Blue bit mask. */\n         0xff000000  /* Alpha bit mask. */\n#endif\n         );\n   return surface;\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_log.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n\n Used by the test framework and test cases.\n\n*/\n\n/* quiet windows compiler warnings */\n#define _CRT_SECURE_NO_WARNINGS\n\n#include \"SDL_config.h\"\n\n#include <stdarg.h> /* va_list */\n#include <stdio.h>\n#include <string.h>\n#include <time.h>\n\n#include \"SDL.h\"\n\n#include \"SDL_test.h\"\n\n/* !\n * Converts unix timestamp to its ascii representation in localtime\n *\n * Note: Uses a static buffer internally, so the return value\n * isn't valid after the next call of this function. If you\n * want to retain the return value, make a copy of it.\n *\n * \\param timestamp A Timestamp, i.e. time(0)\n *\n * \\return Ascii representation of the timestamp in localtime in the format '08/23/01 14:55:02'\n */\nchar *SDLTest_TimestampToString(const time_t timestamp)\n{\n    time_t copy;\n    static char buffer[64];\n    struct tm *local;\n\n    SDL_memset(buffer, 0, sizeof(buffer));\n    copy = timestamp;\n    local = localtime(&copy);\n    strftime(buffer, sizeof(buffer), \"%x %X\", local);\n\n    return buffer;\n}\n\n/*\n * Prints given message with a timestamp in the TEST category and INFO priority.\n */\nvoid SDLTest_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list list;\n    char logMessage[SDLTEST_MAX_LOGMESSAGE_LENGTH];\n\n    /* Print log message into a buffer */\n    SDL_memset(logMessage, 0, SDLTEST_MAX_LOGMESSAGE_LENGTH);\n    va_start(list, fmt);\n    SDL_vsnprintf(logMessage, SDLTEST_MAX_LOGMESSAGE_LENGTH - 1, fmt, list);\n    va_end(list);\n\n    /* Log with timestamp and newline */\n    SDL_LogMessage(SDL_LOG_CATEGORY_TEST, SDL_LOG_PRIORITY_INFO, \" %s: %s\", SDLTest_TimestampToString(time(0)), logMessage);\n}\n\n/*\n * Prints given message with a timestamp in the TEST category and the ERROR priority.\n */\nvoid SDLTest_LogError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...)\n{\n    va_list list;\n    char logMessage[SDLTEST_MAX_LOGMESSAGE_LENGTH];\n\n    /* Print log message into a buffer */\n    SDL_memset(logMessage, 0, SDLTEST_MAX_LOGMESSAGE_LENGTH);\n    va_start(list, fmt);\n    SDL_vsnprintf(logMessage, SDLTEST_MAX_LOGMESSAGE_LENGTH - 1, fmt, list);\n    va_end(list);\n\n    /* Log with timestamp and newline */\n    SDL_LogMessage(SDL_LOG_CATEGORY_TEST, SDL_LOG_PRIORITY_ERROR, \"%s: %s\", SDLTest_TimestampToString(time(0)), logMessage);\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_md5.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n ***********************************************************************\n ** RSA Data Security, Inc. MD5 Message-Digest Algorithm              **\n ** Created: 2/17/90 RLR                                              **\n ** Revised: 1/91 SRD,AJ,BSK,JT Reference C ver., 7/10 constant corr. **\n ***********************************************************************\n */\n\n/*\n ***********************************************************************\n ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved.  **\n **                                                                   **\n ** License to copy and use this software is granted provided that    **\n ** it is identified as the \"RSA Data Security, Inc. MD5 Message-     **\n ** Digest Algorithm\" in all material mentioning or referencing this  **\n ** software or this function.                                        **\n **                                                                   **\n ** License is also granted to make and use derivative works          **\n ** provided that such works are identified as \"derived from the RSA  **\n ** Data Security, Inc. MD5 Message-Digest Algorithm\" in all          **\n ** material mentioning or referencing the derived work.              **\n **                                                                   **\n ** RSA Data Security, Inc. makes no representations concerning       **\n ** either the merchantability of this software or the suitability    **\n ** of this software for any particular purpose.  It is provided \"as  **\n ** is\" without express or implied warranty of any kind.              **\n **                                                                   **\n ** These notices must be retained in any copies of any part of this  **\n ** documentation and/or software.                                    **\n ***********************************************************************\n */\n\n#include \"SDL_config.h\"\n\n#include \"SDL_test.h\"\n\n/* Forward declaration of static helper function */\nstatic void SDLTest_Md5Transform(MD5UINT4 * buf, MD5UINT4 * in);\n\nstatic unsigned char MD5PADDING[64] = {\n  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n\n/* F, G, H and I are basic MD5 functions */\n#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))\n#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))\n#define H(x, y, z) ((x) ^ (y) ^ (z))\n#define I(x, y, z) ((y) ^ ((x) | (~z)))\n\n/* ROTATE_LEFT rotates x left n bits */\n#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))\n\n/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */\n\n/* Rotation is separate from addition to prevent recomputation */\n#define FF(a, b, c, d, x, s, ac) \\\n  {(a) += F ((b), (c), (d)) + (x) + (MD5UINT4)(ac); \\\n   (a) = ROTATE_LEFT ((a), (s)); \\\n   (a) += (b); \\\n  }\n#define GG(a, b, c, d, x, s, ac) \\\n  {(a) += G ((b), (c), (d)) + (x) + (MD5UINT4)(ac); \\\n   (a) = ROTATE_LEFT ((a), (s)); \\\n   (a) += (b); \\\n  }\n#define HH(a, b, c, d, x, s, ac) \\\n  {(a) += H ((b), (c), (d)) + (x) + (MD5UINT4)(ac); \\\n   (a) = ROTATE_LEFT ((a), (s)); \\\n   (a) += (b); \\\n  }\n#define II(a, b, c, d, x, s, ac) \\\n  {(a) += I ((b), (c), (d)) + (x) + (MD5UINT4)(ac); \\\n   (a) = ROTATE_LEFT ((a), (s)); \\\n   (a) += (b); \\\n  }\n\n/*\n  The routine MD5Init initializes the message-digest context\n  mdContext. All fields are set to zero.\n*/\n\nvoid SDLTest_Md5Init(SDLTest_Md5Context * mdContext)\n{\n  if (mdContext==NULL) return;\n\n  mdContext->i[0] = mdContext->i[1] = (MD5UINT4) 0;\n\n  /*\n   * Load magic initialization constants.\n   */\n  mdContext->buf[0] = (MD5UINT4) 0x67452301;\n  mdContext->buf[1] = (MD5UINT4) 0xefcdab89;\n  mdContext->buf[2] = (MD5UINT4) 0x98badcfe;\n  mdContext->buf[3] = (MD5UINT4) 0x10325476;\n}\n\n/*\n The routine MD5Update updates the message-digest context to\n account for the presence of each of the characters inBuf[0..inLen-1]\n in the message whose digest is being computed.\n*/\n\nvoid SDLTest_Md5Update(SDLTest_Md5Context * mdContext, unsigned char *inBuf,\n          unsigned int inLen)\n{\n  MD5UINT4  in[16];\n  int       mdi;\n  unsigned int i, ii;\n\n  if (mdContext == NULL) return;\n  if (inBuf == NULL || inLen < 1) return;\n\n  /*\n   * compute number of bytes mod 64\n   */\n  mdi = (int) ((mdContext->i[0] >> 3) & 0x3F);\n\n  /*\n   * update number of bits\n   */\n  if ((mdContext->i[0] + ((MD5UINT4) inLen << 3)) < mdContext->i[0])\n    mdContext->i[1]++;\n  mdContext->i[0] += ((MD5UINT4) inLen << 3);\n  mdContext->i[1] += ((MD5UINT4) inLen >> 29);\n\n  while (inLen--) {\n    /*\n     * add new character to buffer, increment mdi\n     */\n    mdContext->in[mdi++] = *inBuf++;\n\n    /*\n     * transform if necessary\n     */\n    if (mdi == 0x40) {\n      for (i = 0, ii = 0; i < 16; i++, ii += 4)\n    in[i] = (((MD5UINT4) mdContext->in[ii + 3]) << 24) |\n      (((MD5UINT4) mdContext->in[ii + 2]) << 16) |\n      (((MD5UINT4) mdContext->in[ii + 1]) << 8) |\n      ((MD5UINT4) mdContext->in[ii]);\n      SDLTest_Md5Transform(mdContext->buf, in);\n      mdi = 0;\n    }\n  }\n}\n\n/*\n The routine MD5Final terminates the message-digest computation and\n ends with the desired message digest in mdContext->digest[0...15].\n*/\n\nvoid SDLTest_Md5Final(SDLTest_Md5Context * mdContext)\n{\n  MD5UINT4  in[16];\n  int       mdi;\n  unsigned int i, ii;\n  unsigned int padLen;\n\n  if (mdContext == NULL) return;\n\n  /*\n   * save number of bits\n   */\n  in[14] = mdContext->i[0];\n  in[15] = mdContext->i[1];\n\n  /*\n   * compute number of bytes mod 64\n   */\n  mdi = (int) ((mdContext->i[0] >> 3) & 0x3F);\n\n  /*\n   * pad out to 56 mod 64\n   */\n  padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);\n  SDLTest_Md5Update(mdContext, MD5PADDING, padLen);\n\n  /*\n   * append length in bits and transform\n   */\n  for (i = 0, ii = 0; i < 14; i++, ii += 4)\n    in[i] = (((MD5UINT4) mdContext->in[ii + 3]) << 24) |\n      (((MD5UINT4) mdContext->in[ii + 2]) << 16) |\n      (((MD5UINT4) mdContext->in[ii + 1]) << 8) |\n      ((MD5UINT4) mdContext->in[ii]);\n  SDLTest_Md5Transform(mdContext->buf, in);\n\n  /*\n   * store buffer in digest\n   */\n  for (i = 0, ii = 0; i < 4; i++, ii += 4) {\n    mdContext->digest[ii] = (unsigned char) (mdContext->buf[i] & 0xFF);\n    mdContext->digest[ii + 1] =\n      (unsigned char) ((mdContext->buf[i] >> 8) & 0xFF);\n    mdContext->digest[ii + 2] =\n      (unsigned char) ((mdContext->buf[i] >> 16) & 0xFF);\n    mdContext->digest[ii + 3] =\n      (unsigned char) ((mdContext->buf[i] >> 24) & 0xFF);\n  }\n}\n\n/* Basic MD5 step. Transforms buf based on in.\n */\nstatic void SDLTest_Md5Transform(MD5UINT4 * buf, MD5UINT4 * in)\n{\n  MD5UINT4  a = buf[0], b = buf[1], c = buf[2], d = buf[3];\n\n  /*\n   * Round 1\n   */\n#define S11 7\n#define S12 12\n#define S13 17\n#define S14 22\n  FF(a, b, c, d, in[0], S11, 3614090360u);  /* 1 */\n  FF(d, a, b, c, in[1], S12, 3905402710u);  /* 2 */\n  FF(c, d, a, b, in[2], S13, 606105819u);   /* 3 */\n  FF(b, c, d, a, in[3], S14, 3250441966u);  /* 4 */\n  FF(a, b, c, d, in[4], S11, 4118548399u);  /* 5 */\n  FF(d, a, b, c, in[5], S12, 1200080426u);  /* 6 */\n  FF(c, d, a, b, in[6], S13, 2821735955u);  /* 7 */\n  FF(b, c, d, a, in[7], S14, 4249261313u);  /* 8 */\n  FF(a, b, c, d, in[8], S11, 1770035416u);  /* 9 */\n  FF(d, a, b, c, in[9], S12, 2336552879u);  /* 10 */\n  FF(c, d, a, b, in[10], S13, 4294925233u); /* 11 */\n  FF(b, c, d, a, in[11], S14, 2304563134u); /* 12 */\n  FF(a, b, c, d, in[12], S11, 1804603682u); /* 13 */\n  FF(d, a, b, c, in[13], S12, 4254626195u); /* 14 */\n  FF(c, d, a, b, in[14], S13, 2792965006u); /* 15 */\n  FF(b, c, d, a, in[15], S14, 1236535329u); /* 16 */\n\n  /*\n   * Round 2\n   */\n#define S21 5\n#define S22 9\n#define S23 14\n#define S24 20\n  GG(a, b, c, d, in[1], S21, 4129170786u);  /* 17 */\n  GG(d, a, b, c, in[6], S22, 3225465664u);  /* 18 */\n  GG(c, d, a, b, in[11], S23, 643717713u);  /* 19 */\n  GG(b, c, d, a, in[0], S24, 3921069994u);  /* 20 */\n  GG(a, b, c, d, in[5], S21, 3593408605u);  /* 21 */\n  GG(d, a, b, c, in[10], S22, 38016083u);   /* 22 */\n  GG(c, d, a, b, in[15], S23, 3634488961u); /* 23 */\n  GG(b, c, d, a, in[4], S24, 3889429448u);  /* 24 */\n  GG(a, b, c, d, in[9], S21, 568446438u);   /* 25 */\n  GG(d, a, b, c, in[14], S22, 3275163606u); /* 26 */\n  GG(c, d, a, b, in[3], S23, 4107603335u);  /* 27 */\n  GG(b, c, d, a, in[8], S24, 1163531501u);  /* 28 */\n  GG(a, b, c, d, in[13], S21, 2850285829u); /* 29 */\n  GG(d, a, b, c, in[2], S22, 4243563512u);  /* 30 */\n  GG(c, d, a, b, in[7], S23, 1735328473u);  /* 31 */\n  GG(b, c, d, a, in[12], S24, 2368359562u); /* 32 */\n\n  /*\n   * Round 3\n   */\n#define S31 4\n#define S32 11\n#define S33 16\n#define S34 23\n  HH(a, b, c, d, in[5], S31, 4294588738u);  /* 33 */\n  HH(d, a, b, c, in[8], S32, 2272392833u);  /* 34 */\n  HH(c, d, a, b, in[11], S33, 1839030562u); /* 35 */\n  HH(b, c, d, a, in[14], S34, 4259657740u); /* 36 */\n  HH(a, b, c, d, in[1], S31, 2763975236u);  /* 37 */\n  HH(d, a, b, c, in[4], S32, 1272893353u);  /* 38 */\n  HH(c, d, a, b, in[7], S33, 4139469664u);  /* 39 */\n  HH(b, c, d, a, in[10], S34, 3200236656u); /* 40 */\n  HH(a, b, c, d, in[13], S31, 681279174u);  /* 41 */\n  HH(d, a, b, c, in[0], S32, 3936430074u);  /* 42 */\n  HH(c, d, a, b, in[3], S33, 3572445317u);  /* 43 */\n  HH(b, c, d, a, in[6], S34, 76029189u);    /* 44 */\n  HH(a, b, c, d, in[9], S31, 3654602809u);  /* 45 */\n  HH(d, a, b, c, in[12], S32, 3873151461u); /* 46 */\n  HH(c, d, a, b, in[15], S33, 530742520u);  /* 47 */\n  HH(b, c, d, a, in[2], S34, 3299628645u);  /* 48 */\n\n  /*\n   * Round 4\n   */\n#define S41 6\n#define S42 10\n#define S43 15\n#define S44 21\n  II(a, b, c, d, in[0], S41, 4096336452u);  /* 49 */\n  II(d, a, b, c, in[7], S42, 1126891415u);  /* 50 */\n  II(c, d, a, b, in[14], S43, 2878612391u); /* 51 */\n  II(b, c, d, a, in[5], S44, 4237533241u);  /* 52 */\n  II(a, b, c, d, in[12], S41, 1700485571u); /* 53 */\n  II(d, a, b, c, in[3], S42, 2399980690u);  /* 54 */\n  II(c, d, a, b, in[10], S43, 4293915773u); /* 55 */\n  II(b, c, d, a, in[1], S44, 2240044497u);  /* 56 */\n  II(a, b, c, d, in[8], S41, 1873313359u);  /* 57 */\n  II(d, a, b, c, in[15], S42, 4264355552u); /* 58 */\n  II(c, d, a, b, in[6], S43, 2734768916u);  /* 59 */\n  II(b, c, d, a, in[13], S44, 1309151649u); /* 60 */\n  II(a, b, c, d, in[4], S41, 4149444226u);  /* 61 */\n  II(d, a, b, c, in[11], S42, 3174756917u); /* 62 */\n  II(c, d, a, b, in[2], S43, 718787259u);   /* 63 */\n  II(b, c, d, a, in[9], S44, 3951481745u);  /* 64 */\n\n  buf[0] += a;\n  buf[1] += b;\n  buf[2] += c;\n  buf[3] += d;\n}\n"
  },
  {
    "path": "libs/SDL2/src/test/SDL_test_random.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n\n A portable \"32-bit Multiply with carry\" random number generator.\n\n Used by the fuzzer component.\n Original source code contributed by A. Schiffler for GSOC project.\n\n*/\n\n#include \"SDL_config.h\"\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <time.h>\n\n#include \"SDL_test.h\"\n\n/* Initialize random number generator with two integer variables */\n\nvoid SDLTest_RandomInit(SDLTest_RandomContext * rndContext, unsigned int xi, unsigned int ci)\n{\n  if (rndContext==NULL) return;\n\n  /*\n   * Choose a value for 'a' from this list\n   * 1791398085 1929682203 1683268614 1965537969 1675393560\n   * 1967773755 1517746329 1447497129 1655692410 1606218150\n   * 2051013963 1075433238 1557985959 1781943330 1893513180\n   * 1631296680 2131995753 2083801278 1873196400 1554115554\n   */\n  rndContext->a = 1655692410;\n  rndContext->x = 30903;\n  rndContext->c = 0;\n  if (xi != 0) {\n      rndContext->x = xi;\n  }\n  rndContext->c = ci;\n  rndContext->ah = rndContext->a >> 16;\n  rndContext->al = rndContext->a & 65535;\n}\n\n/* Initialize random number generator from system time */\n\nvoid SDLTest_RandomInitTime(SDLTest_RandomContext * rndContext)\n{\n  int a, b;\n\n  if (rndContext==NULL) return;\n\n  srand((unsigned int)time(NULL));\n  a=rand();\n  srand(clock());\n  b=rand();\n  SDLTest_RandomInit(rndContext, a, b);\n}\n\n/* Returns random numbers */\n\nunsigned int SDLTest_Random(SDLTest_RandomContext * rndContext)\n{\n  unsigned int xh, xl;\n\n  if (rndContext==NULL) return -1;\n\n  xh = rndContext->x >> 16, xl = rndContext->x & 65535;\n  rndContext->x = rndContext->x * rndContext->a + rndContext->c;\n  rndContext->c =\n    xh * rndContext->ah + ((xh * rndContext->al) >> 16) +\n    ((xl * rndContext->ah) >> 16);\n  if (xl * rndContext->al >= (~rndContext->c + 1))\n    rndContext->c++;\n  return (rndContext->x);\n}\n"
  },
  {
    "path": "libs/SDL2/src/thread/SDL_systhread.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* These are functions that need to be implemented by a port of SDL */\n\n#ifndef _SDL_systhread_h\n#define _SDL_systhread_h\n\n#include \"SDL_thread.h\"\n#include \"SDL_thread_c.h\"\n\n/* This function creates a thread, passing args to SDL_RunThread(),\n   saves a system-dependent thread id in thread->id, and returns 0\n   on success.\n*/\n#ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD\nextern int SDL_SYS_CreateThread(SDL_Thread * thread, void *args,\n                                pfnSDL_CurrentBeginThread pfnBeginThread,\n                                pfnSDL_CurrentEndThread pfnEndThread);\n#else\nextern int SDL_SYS_CreateThread(SDL_Thread * thread, void *args);\n#endif\n\n/* This function does any necessary setup in the child thread */\nextern void SDL_SYS_SetupThread(const char *name);\n\n/* This function sets the current thread priority */\nextern int SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority);\n\n/* This function waits for the thread to finish and frees any data\n   allocated by SDL_SYS_CreateThread()\n */\nextern void SDL_SYS_WaitThread(SDL_Thread * thread);\n\n/* Mark thread as cleaned up as soon as it exits, without joining. */\nextern void SDL_SYS_DetachThread(SDL_Thread * thread);\n\n/* Get the thread local storage for this thread */\nextern SDL_TLSData *SDL_SYS_GetTLSData();\n\n/* Set the thread local storage for this thread */\nextern int SDL_SYS_SetTLSData(SDL_TLSData *data);\n\n/* This is for internal SDL use, so we don't need #ifdefs everywhere. */\nextern SDL_Thread *\nSDL_CreateThreadInternal(int (SDLCALL * fn) (void *), const char *name,\n                         const size_t stacksize, void *data);\n\n#endif /* _SDL_systhread_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/thread/SDL_thread.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* System independent thread management routines for SDL */\n\n#include \"SDL_assert.h\"\n#include \"SDL_thread.h\"\n#include \"SDL_thread_c.h\"\n#include \"SDL_systhread.h\"\n#include \"SDL_hints.h\"\n#include \"../SDL_error_c.h\"\n\n\nSDL_TLSID\nSDL_TLSCreate()\n{\n    static SDL_atomic_t SDL_tls_id;\n    return SDL_AtomicIncRef(&SDL_tls_id)+1;\n}\n\nvoid *\nSDL_TLSGet(SDL_TLSID id)\n{\n    SDL_TLSData *storage;\n\n    storage = SDL_SYS_GetTLSData();\n    if (!storage || id == 0 || id > storage->limit) {\n        return NULL;\n    }\n    return storage->array[id-1].data;\n}\n\nint\nSDL_TLSSet(SDL_TLSID id, const void *value, void (*destructor)(void *))\n{\n    SDL_TLSData *storage;\n\n    if (id == 0) {\n        return SDL_InvalidParamError(\"id\");\n    }\n\n    storage = SDL_SYS_GetTLSData();\n    if (!storage || (id > storage->limit)) {\n        unsigned int i, oldlimit, newlimit;\n\n        oldlimit = storage ? storage->limit : 0;\n        newlimit = (id + TLS_ALLOC_CHUNKSIZE);\n        storage = (SDL_TLSData *)SDL_realloc(storage, sizeof(*storage)+(newlimit-1)*sizeof(storage->array[0]));\n        if (!storage) {\n            return SDL_OutOfMemory();\n        }\n        storage->limit = newlimit;\n        for (i = oldlimit; i < newlimit; ++i) {\n            storage->array[i].data = NULL;\n            storage->array[i].destructor = NULL;\n        }\n        if (SDL_SYS_SetTLSData(storage) != 0) {\n            return -1;\n        }\n    }\n\n    storage->array[id-1].data = SDL_const_cast(void*, value);\n    storage->array[id-1].destructor = destructor;\n    return 0;\n}\n\nstatic void\nSDL_TLSCleanup()\n{\n    SDL_TLSData *storage;\n\n    storage = SDL_SYS_GetTLSData();\n    if (storage) {\n        unsigned int i;\n        for (i = 0; i < storage->limit; ++i) {\n            if (storage->array[i].destructor) {\n                storage->array[i].destructor(storage->array[i].data);\n            }\n        }\n        SDL_SYS_SetTLSData(NULL);\n        SDL_free(storage);\n    }\n}\n\n\n/* This is a generic implementation of thread-local storage which doesn't\n   require additional OS support.\n\n   It is not especially efficient and doesn't clean up thread-local storage\n   as threads exit.  If there is a real OS that doesn't support thread-local\n   storage this implementation should be improved to be production quality.\n*/\n\ntypedef struct SDL_TLSEntry {\n    SDL_threadID thread;\n    SDL_TLSData *storage;\n    struct SDL_TLSEntry *next;\n} SDL_TLSEntry;\n\nstatic SDL_mutex *SDL_generic_TLS_mutex;\nstatic SDL_TLSEntry *SDL_generic_TLS;\n\n\nSDL_TLSData *\nSDL_Generic_GetTLSData()\n{\n    SDL_threadID thread = SDL_ThreadID();\n    SDL_TLSEntry *entry;\n    SDL_TLSData *storage = NULL;\n\n#if !SDL_THREADS_DISABLED\n    if (!SDL_generic_TLS_mutex) {\n        static SDL_SpinLock tls_lock;\n        SDL_AtomicLock(&tls_lock);\n        if (!SDL_generic_TLS_mutex) {\n            SDL_mutex *mutex = SDL_CreateMutex();\n            SDL_MemoryBarrierRelease();\n            SDL_generic_TLS_mutex = mutex;\n            if (!SDL_generic_TLS_mutex) {\n                SDL_AtomicUnlock(&tls_lock);\n                return NULL;\n            }\n        }\n        SDL_AtomicUnlock(&tls_lock);\n    }\n#endif /* SDL_THREADS_DISABLED */\n\n    SDL_MemoryBarrierAcquire();\n    SDL_LockMutex(SDL_generic_TLS_mutex);\n    for (entry = SDL_generic_TLS; entry; entry = entry->next) {\n        if (entry->thread == thread) {\n            storage = entry->storage;\n            break;\n        }\n    }\n#if !SDL_THREADS_DISABLED\n    SDL_UnlockMutex(SDL_generic_TLS_mutex);\n#endif\n\n    return storage;\n}\n\nint\nSDL_Generic_SetTLSData(SDL_TLSData *storage)\n{\n    SDL_threadID thread = SDL_ThreadID();\n    SDL_TLSEntry *prev, *entry;\n\n    /* SDL_Generic_GetTLSData() is always called first, so we can assume SDL_generic_TLS_mutex */\n    SDL_LockMutex(SDL_generic_TLS_mutex);\n    prev = NULL;\n    for (entry = SDL_generic_TLS; entry; entry = entry->next) {\n        if (entry->thread == thread) {\n            if (storage) {\n                entry->storage = storage;\n            } else {\n                if (prev) {\n                    prev->next = entry->next;\n                } else {\n                    SDL_generic_TLS = entry->next;\n                }\n                SDL_free(entry);\n            }\n            break;\n        }\n        prev = entry;\n    }\n    if (!entry) {\n        entry = (SDL_TLSEntry *)SDL_malloc(sizeof(*entry));\n        if (entry) {\n            entry->thread = thread;\n            entry->storage = storage;\n            entry->next = SDL_generic_TLS;\n            SDL_generic_TLS = entry;\n        }\n    }\n    SDL_UnlockMutex(SDL_generic_TLS_mutex);\n\n    if (!entry) {\n        return SDL_OutOfMemory();\n    }\n    return 0;\n}\n\n/* Routine to get the thread-specific error variable */\nSDL_error *\nSDL_GetErrBuf(void)\n{\n    static SDL_SpinLock tls_lock;\n    static SDL_bool tls_being_created;\n    static SDL_TLSID tls_errbuf;\n    static SDL_error SDL_global_errbuf;\n    const SDL_error *ALLOCATION_IN_PROGRESS = (SDL_error *)-1;\n    SDL_error *errbuf;\n\n    /* tls_being_created is there simply to prevent recursion if SDL_TLSCreate() fails.\n       It also means it's possible for another thread to also use SDL_global_errbuf,\n       but that's very unlikely and hopefully won't cause issues.\n     */\n    if (!tls_errbuf && !tls_being_created) {\n        SDL_AtomicLock(&tls_lock);\n        if (!tls_errbuf) {\n            SDL_TLSID slot;\n            tls_being_created = SDL_TRUE;\n            slot = SDL_TLSCreate();\n            tls_being_created = SDL_FALSE;\n            SDL_MemoryBarrierRelease();\n            tls_errbuf = slot;\n        }\n        SDL_AtomicUnlock(&tls_lock);\n    }\n    if (!tls_errbuf) {\n        return &SDL_global_errbuf;\n    }\n\n    SDL_MemoryBarrierAcquire();\n    errbuf = (SDL_error *)SDL_TLSGet(tls_errbuf);\n    if (errbuf == ALLOCATION_IN_PROGRESS) {\n        return &SDL_global_errbuf;\n    }\n    if (!errbuf) {\n        /* Mark that we're in the middle of allocating our buffer */\n        SDL_TLSSet(tls_errbuf, ALLOCATION_IN_PROGRESS, NULL);\n        errbuf = (SDL_error *)SDL_malloc(sizeof(*errbuf));\n        if (!errbuf) {\n            SDL_TLSSet(tls_errbuf, NULL, NULL);\n            return &SDL_global_errbuf;\n        }\n        SDL_zerop(errbuf);\n        SDL_TLSSet(tls_errbuf, errbuf, SDL_free);\n    }\n    return errbuf;\n}\n\n\n/* Arguments and callback to setup and run the user thread function */\ntypedef struct\n{\n    int (SDLCALL * func) (void *);\n    void *data;\n    SDL_Thread *info;\n    SDL_sem *wait;\n} thread_args;\n\nvoid\nSDL_RunThread(void *data)\n{\n    thread_args *args = (thread_args *) data;\n    int (SDLCALL * userfunc) (void *) = args->func;\n    void *userdata = args->data;\n    SDL_Thread *thread = args->info;\n    int *statusloc = &thread->status;\n\n    /* Perform any system-dependent setup - this function may not fail */\n    SDL_SYS_SetupThread(thread->name);\n\n    /* Get the thread id */\n    thread->threadid = SDL_ThreadID();\n\n    /* Wake up the parent thread */\n    SDL_SemPost(args->wait);\n\n    /* Run the function */\n    *statusloc = userfunc(userdata);\n\n    /* Clean up thread-local storage */\n    SDL_TLSCleanup();\n\n    /* Mark us as ready to be joined (or detached) */\n    if (!SDL_AtomicCAS(&thread->state, SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_ZOMBIE)) {\n        /* Clean up if something already detached us. */\n        if (SDL_AtomicCAS(&thread->state, SDL_THREAD_STATE_DETACHED, SDL_THREAD_STATE_CLEANED)) {\n            if (thread->name) {\n                SDL_free(thread->name);\n            }\n            SDL_free(thread);\n        }\n    }\n}\n\n#ifdef SDL_CreateThread\n#undef SDL_CreateThread\n#endif\n#if SDL_DYNAMIC_API\n#define SDL_CreateThread SDL_CreateThread_REAL\n#endif\n\n#ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD\nstatic SDL_Thread *\nSDL_CreateThreadWithStackSize(int (SDLCALL * fn) (void *),\n                 const char *name, const size_t stacksize, void *data,\n                 pfnSDL_CurrentBeginThread pfnBeginThread,\n                 pfnSDL_CurrentEndThread pfnEndThread)\n#else\nstatic SDL_Thread *\nSDL_CreateThreadWithStackSize(int (SDLCALL * fn) (void *),\n                const char *name, const size_t stacksize, void *data)\n#endif\n{\n    SDL_Thread *thread;\n    thread_args *args;\n    int ret;\n\n    /* Allocate memory for the thread info structure */\n    thread = (SDL_Thread *) SDL_malloc(sizeof(*thread));\n    if (thread == NULL) {\n        SDL_OutOfMemory();\n        return (NULL);\n    }\n    SDL_zerop(thread);\n    thread->status = -1;\n    SDL_AtomicSet(&thread->state, SDL_THREAD_STATE_ALIVE);\n\n    /* Set up the arguments for the thread */\n    if (name != NULL) {\n        thread->name = SDL_strdup(name);\n        if (thread->name == NULL) {\n            SDL_OutOfMemory();\n            SDL_free(thread);\n            return (NULL);\n        }\n    }\n\n    /* Set up the arguments for the thread */\n    args = (thread_args *) SDL_malloc(sizeof(*args));\n    if (args == NULL) {\n        SDL_OutOfMemory();\n        if (thread->name) {\n            SDL_free(thread->name);\n        }\n        SDL_free(thread);\n        return (NULL);\n    }\n    args->func = fn;\n    args->data = data;\n    args->info = thread;\n    args->wait = SDL_CreateSemaphore(0);\n    if (args->wait == NULL) {\n        if (thread->name) {\n            SDL_free(thread->name);\n        }\n        SDL_free(thread);\n        SDL_free(args);\n        return (NULL);\n    }\n\n    thread->stacksize = stacksize;\n\n    /* Create the thread and go! */\n#ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD\n    ret = SDL_SYS_CreateThread(thread, args, pfnBeginThread, pfnEndThread);\n#else\n    ret = SDL_SYS_CreateThread(thread, args);\n#endif\n    if (ret >= 0) {\n        /* Wait for the thread function to use arguments */\n        SDL_SemWait(args->wait);\n    } else {\n        /* Oops, failed.  Gotta free everything */\n        if (thread->name) {\n            SDL_free(thread->name);\n        }\n        SDL_free(thread);\n        thread = NULL;\n    }\n    SDL_DestroySemaphore(args->wait);\n    SDL_free(args);\n\n    /* Everything is running now */\n    return (thread);\n}\n\n#ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD\nDECLSPEC SDL_Thread *SDLCALL\nSDL_CreateThread(int (SDLCALL * fn) (void *),\n                 const char *name, void *data,\n                 pfnSDL_CurrentBeginThread pfnBeginThread,\n                 pfnSDL_CurrentEndThread pfnEndThread)\n#else\nDECLSPEC SDL_Thread *SDLCALL\nSDL_CreateThread(int (SDLCALL * fn) (void *),\n                 const char *name, void *data)\n#endif\n{\n    /* !!! FIXME: in 2.1, just make stackhint part of the usual API. */\n    const char *stackhint = SDL_GetHint(SDL_HINT_THREAD_STACK_SIZE);\n    size_t stacksize = 0;\n\n    /* If the SDL_HINT_THREAD_STACK_SIZE exists, use it */\n    if (stackhint != NULL) {\n        char *endp = NULL;\n        const Sint64 hintval = SDL_strtoll(stackhint, &endp, 10);\n        if ((*stackhint != '\\0') && (*endp == '\\0')) {  /* a valid number? */\n            if (hintval > 0) {  /* reject bogus values. */\n                stacksize = (size_t) hintval;\n            }\n        }\n    }\n\n#ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD\n    return SDL_CreateThreadWithStackSize(fn, name, stacksize, data, pfnBeginThread, pfnEndThread);\n#else\n    return SDL_CreateThreadWithStackSize(fn, name, stacksize, data);\n#endif\n}\n\nSDL_Thread *\nSDL_CreateThreadInternal(int (SDLCALL * fn) (void *), const char *name,\n                         const size_t stacksize, void *data) {\n#ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD\n    return SDL_CreateThreadWithStackSize(fn, name, stacksize, data, NULL, NULL);\n#else\n    return SDL_CreateThreadWithStackSize(fn, name, stacksize, data);\n#endif\n}\n\nSDL_threadID\nSDL_GetThreadID(SDL_Thread * thread)\n{\n    SDL_threadID id;\n\n    if (thread) {\n        id = thread->threadid;\n    } else {\n        id = SDL_ThreadID();\n    }\n    return id;\n}\n\nconst char *\nSDL_GetThreadName(SDL_Thread * thread)\n{\n    if (thread) {\n        return thread->name;\n    } else {\n        return NULL;\n    }\n}\n\nint\nSDL_SetThreadPriority(SDL_ThreadPriority priority)\n{\n    return SDL_SYS_SetThreadPriority(priority);\n}\n\nvoid\nSDL_WaitThread(SDL_Thread * thread, int *status)\n{\n    if (thread) {\n        SDL_SYS_WaitThread(thread);\n        if (status) {\n            *status = thread->status;\n        }\n        if (thread->name) {\n            SDL_free(thread->name);\n        }\n        SDL_free(thread);\n    }\n}\n\nvoid\nSDL_DetachThread(SDL_Thread * thread)\n{\n    if (!thread) {\n        return;\n    }\n\n    /* Grab dibs if the state is alive+joinable. */\n    if (SDL_AtomicCAS(&thread->state, SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_DETACHED)) {\n        SDL_SYS_DetachThread(thread);\n    } else {\n        /* all other states are pretty final, see where we landed. */\n        const int thread_state = SDL_AtomicGet(&thread->state);\n        if ((thread_state == SDL_THREAD_STATE_DETACHED) || (thread_state == SDL_THREAD_STATE_CLEANED)) {\n            return;  /* already detached (you shouldn't call this twice!) */\n        } else if (thread_state == SDL_THREAD_STATE_ZOMBIE) {\n            SDL_WaitThread(thread, NULL);  /* already done, clean it up. */\n        } else {\n            SDL_assert(0 && \"Unexpected thread state\");\n        }\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/thread/SDL_thread_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_thread_c_h\n#define _SDL_thread_c_h\n\n#include \"SDL_thread.h\"\n\n/* Need the definitions of SYS_ThreadHandle */\n#if SDL_THREADS_DISABLED\n#include \"generic/SDL_systhread_c.h\"\n#elif SDL_THREAD_PTHREAD\n#include \"pthread/SDL_systhread_c.h\"\n#elif SDL_THREAD_WINDOWS\n#include \"windows/SDL_systhread_c.h\"\n#elif SDL_THREAD_PSP\n#include \"psp/SDL_systhread_c.h\"\n#elif SDL_THREAD_STDCPP\n#include \"stdcpp/SDL_systhread_c.h\"\n#else\n#error Need thread implementation for this platform\n#include \"generic/SDL_systhread_c.h\"\n#endif\n#include \"../SDL_error_c.h\"\n\ntypedef enum SDL_ThreadState\n{\n    SDL_THREAD_STATE_ALIVE,\n    SDL_THREAD_STATE_DETACHED,\n    SDL_THREAD_STATE_ZOMBIE,\n    SDL_THREAD_STATE_CLEANED,\n} SDL_ThreadState;\n\n/* This is the system-independent thread info structure */\nstruct SDL_Thread\n{\n    SDL_threadID threadid;\n    SYS_ThreadHandle handle;\n    int status;\n    SDL_atomic_t state;  /* SDL_THREAD_STATE_* */\n    SDL_error errbuf;\n    char *name;\n    size_t stacksize;  /* 0 for default, >0 for user-specified stack size. */\n    void *data;\n};\n\n/* This is the function called to run a thread */\nextern void SDL_RunThread(void *data);\n\n/* This is the system-independent thread local storage structure */\ntypedef struct {\n    unsigned int limit;\n    struct {\n        void *data;\n        void (*destructor)(void*);\n    } array[1];\n} SDL_TLSData;\n\n/* This is how many TLS entries we allocate at once */\n#define TLS_ALLOC_CHUNKSIZE 4\n\n/* Get cross-platform, slow, thread local storage for this thread.\n   This is only intended as a fallback if getting real thread-local\n   storage fails or isn't supported on this platform.\n */\nextern SDL_TLSData *SDL_Generic_GetTLSData();\n\n/* Set cross-platform, slow, thread local storage for this thread.\n   This is only intended as a fallback if getting real thread-local\n   storage fails or isn't supported on this platform.\n */\nextern int SDL_Generic_SetTLSData(SDL_TLSData *data);\n\n#endif /* _SDL_thread_c_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/thread/pthread/SDL_syscond.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#include <sys/time.h>\n#include <time.h>\n#include <unistd.h>\n#include <errno.h>\n#include <pthread.h>\n\n#include \"SDL_thread.h\"\n#include \"SDL_sysmutex_c.h\"\n\nstruct SDL_cond\n{\n    pthread_cond_t cond;\n};\n\n/* Create a condition variable */\nSDL_cond *\nSDL_CreateCond(void)\n{\n    SDL_cond *cond;\n\n    cond = (SDL_cond *) SDL_malloc(sizeof(SDL_cond));\n    if (cond) {\n        if (pthread_cond_init(&cond->cond, NULL) < 0) {\n            SDL_SetError(\"pthread_cond_init() failed\");\n            SDL_free(cond);\n            cond = NULL;\n        }\n    }\n    return (cond);\n}\n\n/* Destroy a condition variable */\nvoid\nSDL_DestroyCond(SDL_cond * cond)\n{\n    if (cond) {\n        pthread_cond_destroy(&cond->cond);\n        SDL_free(cond);\n    }\n}\n\n/* Restart one of the threads that are waiting on the condition variable */\nint\nSDL_CondSignal(SDL_cond * cond)\n{\n    int retval;\n\n    if (!cond) {\n        return SDL_SetError(\"Passed a NULL condition variable\");\n    }\n\n    retval = 0;\n    if (pthread_cond_signal(&cond->cond) != 0) {\n        return SDL_SetError(\"pthread_cond_signal() failed\");\n    }\n    return retval;\n}\n\n/* Restart all threads that are waiting on the condition variable */\nint\nSDL_CondBroadcast(SDL_cond * cond)\n{\n    int retval;\n\n    if (!cond) {\n        return SDL_SetError(\"Passed a NULL condition variable\");\n    }\n\n    retval = 0;\n    if (pthread_cond_broadcast(&cond->cond) != 0) {\n        return SDL_SetError(\"pthread_cond_broadcast() failed\");\n    }\n    return retval;\n}\n\nint\nSDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)\n{\n    int retval;\n#ifndef HAVE_CLOCK_GETTIME\n    struct timeval delta;\n#endif\n    struct timespec abstime;\n\n    if (!cond) {\n        return SDL_SetError(\"Passed a NULL condition variable\");\n    }\n\n#ifdef HAVE_CLOCK_GETTIME\n    clock_gettime(CLOCK_REALTIME, &abstime);\n\n    abstime.tv_nsec += (ms % 1000) * 1000000;\n    abstime.tv_sec += ms / 1000;\n#else\n    gettimeofday(&delta, NULL);\n\n    abstime.tv_sec = delta.tv_sec + (ms / 1000);\n    abstime.tv_nsec = (delta.tv_usec + (ms % 1000) * 1000) * 1000;\n#endif\n    if (abstime.tv_nsec > 1000000000) {\n        abstime.tv_sec += 1;\n        abstime.tv_nsec -= 1000000000;\n    }\n\n  tryagain:\n    retval = pthread_cond_timedwait(&cond->cond, &mutex->id, &abstime);\n    switch (retval) {\n    case EINTR:\n        goto tryagain;\n        break;\n    case ETIMEDOUT:\n        retval = SDL_MUTEX_TIMEDOUT;\n        break;\n    case 0:\n        break;\n    default:\n        retval = SDL_SetError(\"pthread_cond_timedwait() failed\");\n    }\n    return retval;\n}\n\n/* Wait on the condition variable, unlocking the provided mutex.\n   The mutex must be locked before entering this function!\n */\nint\nSDL_CondWait(SDL_cond * cond, SDL_mutex * mutex)\n{\n    if (!cond) {\n        return SDL_SetError(\"Passed a NULL condition variable\");\n    } else if (pthread_cond_wait(&cond->cond, &mutex->id) != 0) {\n        return SDL_SetError(\"pthread_cond_wait() failed\");\n    }\n    return 0;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/thread/pthread/SDL_sysmutex.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef _GNU_SOURCE\n#define _GNU_SOURCE\n#endif\n#include <errno.h>\n#include <pthread.h>\n\n#include \"SDL_thread.h\"\n\n#if !SDL_THREAD_PTHREAD_RECURSIVE_MUTEX && \\\n    !SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP\n#define FAKE_RECURSIVE_MUTEX 1\n#endif\n\nstruct SDL_mutex\n{\n    pthread_mutex_t id;\n#if FAKE_RECURSIVE_MUTEX\n    int recursive;\n    pthread_t owner;\n#endif\n};\n\nSDL_mutex *\nSDL_CreateMutex(void)\n{\n    SDL_mutex *mutex;\n    pthread_mutexattr_t attr;\n\n    /* Allocate the structure */\n    mutex = (SDL_mutex *) SDL_calloc(1, sizeof(*mutex));\n    if (mutex) {\n        pthread_mutexattr_init(&attr);\n#if SDL_THREAD_PTHREAD_RECURSIVE_MUTEX\n        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);\n#elif SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP\n        pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP);\n#else\n        /* No extra attributes necessary */\n#endif\n        if (pthread_mutex_init(&mutex->id, &attr) != 0) {\n            SDL_SetError(\"pthread_mutex_init() failed\");\n            SDL_free(mutex);\n            mutex = NULL;\n        }\n    } else {\n        SDL_OutOfMemory();\n    }\n    return (mutex);\n}\n\nvoid\nSDL_DestroyMutex(SDL_mutex * mutex)\n{\n    if (mutex) {\n        pthread_mutex_destroy(&mutex->id);\n        SDL_free(mutex);\n    }\n}\n\n/* Lock the mutex */\nint\nSDL_LockMutex(SDL_mutex * mutex)\n{\n#if FAKE_RECURSIVE_MUTEX\n    pthread_t this_thread;\n#endif\n\n    if (mutex == NULL) {\n        return SDL_SetError(\"Passed a NULL mutex\");\n    }\n\n#if FAKE_RECURSIVE_MUTEX\n    this_thread = pthread_self();\n    if (mutex->owner == this_thread) {\n        ++mutex->recursive;\n    } else {\n        /* The order of operations is important.\n           We set the locking thread id after we obtain the lock\n           so unlocks from other threads will fail.\n         */\n        if (pthread_mutex_lock(&mutex->id) == 0) {\n            mutex->owner = this_thread;\n            mutex->recursive = 0;\n        } else {\n            return SDL_SetError(\"pthread_mutex_lock() failed\");\n        }\n    }\n#else\n    if (pthread_mutex_lock(&mutex->id) < 0) {\n        return SDL_SetError(\"pthread_mutex_lock() failed\");\n    }\n#endif\n    return 0;\n}\n\nint\nSDL_TryLockMutex(SDL_mutex * mutex)\n{\n    int retval;\n#if FAKE_RECURSIVE_MUTEX\n    pthread_t this_thread;\n#endif\n\n    if (mutex == NULL) {\n        return SDL_SetError(\"Passed a NULL mutex\");\n    }\n\n    retval = 0;\n#if FAKE_RECURSIVE_MUTEX\n    this_thread = pthread_self();\n    if (mutex->owner == this_thread) {\n        ++mutex->recursive;\n    } else {\n        /* The order of operations is important.\n         We set the locking thread id after we obtain the lock\n         so unlocks from other threads will fail.\n         */\n        if (pthread_mutex_lock(&mutex->id) == 0) {\n            mutex->owner = this_thread;\n            mutex->recursive = 0;\n        } else if (errno == EBUSY) {\n            retval = SDL_MUTEX_TIMEDOUT;\n        } else {\n            retval = SDL_SetError(\"pthread_mutex_trylock() failed\");\n        }\n    }\n#else\n    if (pthread_mutex_trylock(&mutex->id) != 0) {\n        if (errno == EBUSY) {\n            retval = SDL_MUTEX_TIMEDOUT;\n        } else {\n            retval = SDL_SetError(\"pthread_mutex_trylock() failed\");\n        }\n    }\n#endif\n    return retval;\n}\n\nint\nSDL_UnlockMutex(SDL_mutex * mutex)\n{\n    if (mutex == NULL) {\n        return SDL_SetError(\"Passed a NULL mutex\");\n    }\n\n#if FAKE_RECURSIVE_MUTEX\n    /* We can only unlock the mutex if we own it */\n    if (pthread_self() == mutex->owner) {\n        if (mutex->recursive) {\n            --mutex->recursive;\n        } else {\n            /* The order of operations is important.\n               First reset the owner so another thread doesn't lock\n               the mutex and set the ownership before we reset it,\n               then release the lock semaphore.\n             */\n            mutex->owner = 0;\n            pthread_mutex_unlock(&mutex->id);\n        }\n    } else {\n        return SDL_SetError(\"mutex not owned by this thread\");\n    }\n\n#else\n    if (pthread_mutex_unlock(&mutex->id) < 0) {\n        return SDL_SetError(\"pthread_mutex_unlock() failed\");\n    }\n#endif /* FAKE_RECURSIVE_MUTEX */\n\n    return 0;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/thread/pthread/SDL_sysmutex_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef _SDL_mutex_c_h\n#define _SDL_mutex_c_h\n\nstruct SDL_mutex\n{\n    pthread_mutex_t id;\n};\n\n#endif /* _SDL_mutex_c_h */\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/thread/pthread/SDL_syssem.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef _GNU_SOURCE\n#define _GNU_SOURCE\n#endif\n#include <errno.h>\n#include <pthread.h>\n#include <semaphore.h>\n#include <sys/time.h>\n#include <time.h>\n\n#include \"SDL_thread.h\"\n#include \"SDL_timer.h\"\n\n/* Wrapper around POSIX 1003.1b semaphores */\n\n#if defined(__MACOSX__) || defined(__IPHONEOS__)\n/* Mac OS X doesn't support sem_getvalue() as of version 10.4 */\n#include \"../generic/SDL_syssem.c\"\n#else\n\nstruct SDL_semaphore\n{\n    sem_t sem;\n};\n\n/* Create a semaphore, initialized with value */\nSDL_sem *\nSDL_CreateSemaphore(Uint32 initial_value)\n{\n    SDL_sem *sem = (SDL_sem *) SDL_malloc(sizeof(SDL_sem));\n    if (sem) {\n        if (sem_init(&sem->sem, 0, initial_value) < 0) {\n            SDL_SetError(\"sem_init() failed\");\n            SDL_free(sem);\n            sem = NULL;\n        }\n    } else {\n        SDL_OutOfMemory();\n    }\n    return sem;\n}\n\nvoid\nSDL_DestroySemaphore(SDL_sem * sem)\n{\n    if (sem) {\n        sem_destroy(&sem->sem);\n        SDL_free(sem);\n    }\n}\n\nint\nSDL_SemTryWait(SDL_sem * sem)\n{\n    int retval;\n\n    if (!sem) {\n        return SDL_SetError(\"Passed a NULL semaphore\");\n    }\n    retval = SDL_MUTEX_TIMEDOUT;\n    if (sem_trywait(&sem->sem) == 0) {\n        retval = 0;\n    }\n    return retval;\n}\n\nint\nSDL_SemWait(SDL_sem * sem)\n{\n    int retval;\n\n    if (!sem) {\n        return SDL_SetError(\"Passed a NULL semaphore\");\n    }\n\n    retval = sem_wait(&sem->sem);\n    if (retval < 0) {\n        retval = SDL_SetError(\"sem_wait() failed\");\n    }\n    return retval;\n}\n\nint\nSDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)\n{\n    int retval;\n#ifdef HAVE_SEM_TIMEDWAIT\n#ifndef HAVE_CLOCK_GETTIME\n    struct timeval now;\n#endif\n    struct timespec ts_timeout;\n#else\n    Uint32 end;\n#endif\n\n    if (!sem) {\n        return SDL_SetError(\"Passed a NULL semaphore\");\n    }\n\n    /* Try the easy cases first */\n    if (timeout == 0) {\n        return SDL_SemTryWait(sem);\n    }\n    if (timeout == SDL_MUTEX_MAXWAIT) {\n        return SDL_SemWait(sem);\n    }\n\n#ifdef HAVE_SEM_TIMEDWAIT\n    /* Setup the timeout. sem_timedwait doesn't wait for\n    * a lapse of time, but until we reach a certain time.\n    * This time is now plus the timeout.\n    */\n#ifdef HAVE_CLOCK_GETTIME\n    clock_gettime(CLOCK_REALTIME, &ts_timeout);\n\n    /* Add our timeout to current time */\n    ts_timeout.tv_nsec += (timeout % 1000) * 1000000;\n    ts_timeout.tv_sec += timeout / 1000;\n#else\n    gettimeofday(&now, NULL);\n\n    /* Add our timeout to current time */\n    ts_timeout.tv_sec = now.tv_sec + (timeout / 1000);\n    ts_timeout.tv_nsec = (now.tv_usec + (timeout % 1000) * 1000) * 1000;\n#endif\n\n    /* Wrap the second if needed */\n    if (ts_timeout.tv_nsec > 1000000000) {\n        ts_timeout.tv_sec += 1;\n        ts_timeout.tv_nsec -= 1000000000;\n    }\n\n    /* Wait. */\n    do {\n        retval = sem_timedwait(&sem->sem, &ts_timeout);\n    } while (retval < 0 && errno == EINTR);\n\n    if (retval < 0) {\n        if (errno == ETIMEDOUT) {\n            retval = SDL_MUTEX_TIMEDOUT;\n        } else {\n            SDL_SetError(\"sem_timedwait returned an error: %s\", strerror(errno));\n        }\n    }\n#else\n    end = SDL_GetTicks() + timeout;\n    while ((retval = SDL_SemTryWait(sem)) == SDL_MUTEX_TIMEDOUT) {\n        if (SDL_TICKS_PASSED(SDL_GetTicks(), end)) {\n            break;\n        }\n        SDL_Delay(1);\n    }\n#endif /* HAVE_SEM_TIMEDWAIT */\n\n    return retval;\n}\n\nUint32\nSDL_SemValue(SDL_sem * sem)\n{\n    int ret = 0;\n    if (sem) {\n        sem_getvalue(&sem->sem, &ret);\n        if (ret < 0) {\n            ret = 0;\n        }\n    }\n    return (Uint32) ret;\n}\n\nint\nSDL_SemPost(SDL_sem * sem)\n{\n    int retval;\n\n    if (!sem) {\n        return SDL_SetError(\"Passed a NULL semaphore\");\n    }\n\n    retval = sem_post(&sem->sem);\n    if (retval < 0) {\n        SDL_SetError(\"sem_post() failed\");\n    }\n    return retval;\n}\n\n#endif /* __MACOSX__ */\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/thread/pthread/SDL_systhread.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"../../SDL_internal.h\"\n\n#include <pthread.h>\n\n#if HAVE_PTHREAD_NP_H\n#include <pthread_np.h>\n#endif\n\n#include <signal.h>\n\n#ifdef __LINUX__\n#include <sys/time.h>\n#include <sys/resource.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n#endif /* __LINUX__ */\n\n#if defined(__LINUX__) || defined(__MACOSX__) || defined(__IPHONEOS__)\n#include <dlfcn.h>\n#ifndef RTLD_DEFAULT\n#define RTLD_DEFAULT NULL\n#endif\n#endif\n\n#include \"SDL_platform.h\"\n#include \"SDL_thread.h\"\n#include \"../SDL_thread_c.h\"\n#include \"../SDL_systhread.h\"\n#ifdef __ANDROID__\n#include \"../../core/android/SDL_android.h\"\n#endif\n\n#ifdef __HAIKU__\n#include <be/kernel/OS.h>\n#endif\n\n#include \"SDL_assert.h\"\n\n#ifndef __NACL__\n/* List of signals to mask in the subthreads */\nstatic const int sig_list[] = {\n    SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGALRM, SIGTERM, SIGCHLD, SIGWINCH,\n    SIGVTALRM, SIGPROF, 0\n};\n#endif\n\nstatic void *\nRunThread(void *data)\n{\n#ifdef __ANDROID__\n    Android_JNI_SetupThread();\n#endif\n    SDL_RunThread(data);\n    return NULL;\n}\n\n#if defined(__MACOSX__) || defined(__IPHONEOS__)\nstatic SDL_bool checked_setname = SDL_FALSE;\nstatic int (*ppthread_setname_np)(const char*) = NULL;\n#elif defined(__LINUX__)\nstatic SDL_bool checked_setname = SDL_FALSE;\nstatic int (*ppthread_setname_np)(pthread_t, const char*) = NULL;\n#endif\nint\nSDL_SYS_CreateThread(SDL_Thread * thread, void *args)\n{\n    pthread_attr_t type;\n\n    /* do this here before any threads exist, so there's no race condition. */\n    #if defined(__MACOSX__) || defined(__IPHONEOS__) || defined(__LINUX__)\n    if (!checked_setname) {\n        void *fn = dlsym(RTLD_DEFAULT, \"pthread_setname_np\");\n        #if defined(__MACOSX__) || defined(__IPHONEOS__)\n        ppthread_setname_np = (int(*)(const char*)) fn;\n        #elif defined(__LINUX__)\n        ppthread_setname_np = (int(*)(pthread_t, const char*)) fn;\n        #endif\n        checked_setname = SDL_TRUE;\n    }\n    #endif\n\n    /* Set the thread attributes */\n    if (pthread_attr_init(&type) != 0) {\n        return SDL_SetError(\"Couldn't initialize pthread attributes\");\n    }\n    pthread_attr_setdetachstate(&type, PTHREAD_CREATE_JOINABLE);\n    \n    /* Set caller-requested stack size. Otherwise: use the system default. */\n    if (thread->stacksize) {\n        pthread_attr_setstacksize(&type, (size_t) thread->stacksize);\n    }\n\n    /* Create the thread and go! */\n    if (pthread_create(&thread->handle, &type, RunThread, args) != 0) {\n        return SDL_SetError(\"Not enough resources to create thread\");\n    }\n\n    return 0;\n}\n\nvoid\nSDL_SYS_SetupThread(const char *name)\n{\n#if !defined(__NACL__)\n    int i;\n    sigset_t mask;\n#endif /* !__NACL__ */\n\n    if (name != NULL) {\n        #if defined(__MACOSX__) || defined(__IPHONEOS__) || defined(__LINUX__)\n        SDL_assert(checked_setname);\n        if (ppthread_setname_np != NULL) {\n            #if defined(__MACOSX__) || defined(__IPHONEOS__)\n            ppthread_setname_np(name);\n            #elif defined(__LINUX__)\n            ppthread_setname_np(pthread_self(), name);\n            #endif\n        }\n        #elif HAVE_PTHREAD_SETNAME_NP\n            #if defined(__NETBSD__)\n            pthread_setname_np(pthread_self(), \"%s\", name);\n            #else\n            pthread_setname_np(pthread_self(), name);\n            #endif\n        #elif HAVE_PTHREAD_SET_NAME_NP\n            pthread_set_name_np(pthread_self(), name);\n        #elif defined(__HAIKU__)\n            /* The docs say the thread name can't be longer than B_OS_NAME_LENGTH. */\n            char namebuf[B_OS_NAME_LENGTH];\n            SDL_snprintf(namebuf, sizeof (namebuf), \"%s\", name);\n            namebuf[sizeof (namebuf) - 1] = '\\0';\n            rename_thread(find_thread(NULL), namebuf);\n        #endif\n    }\n\n   /* NativeClient does not yet support signals.*/\n#if !defined(__NACL__)\n    /* Mask asynchronous signals for this thread */\n    sigemptyset(&mask);\n    for (i = 0; sig_list[i]; ++i) {\n        sigaddset(&mask, sig_list[i]);\n    }\n    pthread_sigmask(SIG_BLOCK, &mask, 0);\n#endif /* !__NACL__ */\n\n\n#ifdef PTHREAD_CANCEL_ASYNCHRONOUS\n    /* Allow ourselves to be asynchronously cancelled */\n    {\n        int oldstate;\n        pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldstate);\n    }\n#endif\n}\n\nSDL_threadID\nSDL_ThreadID(void)\n{\n    return ((SDL_threadID) pthread_self());\n}\n\nint\nSDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)\n{\n#if __NACL__ \n    /* FIXME: Setting thread priority does not seem to be supported in NACL */\n    return 0;\n#elif __LINUX__\n    int value;\n\n    if (priority == SDL_THREAD_PRIORITY_LOW) {\n        value = 19;\n    } else if (priority == SDL_THREAD_PRIORITY_HIGH) {\n        value = -20;\n    } else {\n        value = 0;\n    }\n    if (setpriority(PRIO_PROCESS, syscall(SYS_gettid), value) < 0) {\n        /* Note that this fails if you're trying to set high priority\n           and you don't have root permission. BUT DON'T RUN AS ROOT!\n\n           You can grant the ability to increase thread priority by\n           running the following command on your application binary:\n               sudo setcap 'cap_sys_nice=eip' <application>\n         */\n        return SDL_SetError(\"setpriority() failed\");\n    }\n    return 0;\n#else\n    struct sched_param sched;\n    int policy;\n    pthread_t thread = pthread_self();\n\n    if (pthread_getschedparam(thread, &policy, &sched) < 0) {\n        return SDL_SetError(\"pthread_getschedparam() failed\");\n    }\n    if (priority == SDL_THREAD_PRIORITY_LOW) {\n        sched.sched_priority = sched_get_priority_min(policy);\n    } else if (priority == SDL_THREAD_PRIORITY_HIGH) {\n        sched.sched_priority = sched_get_priority_max(policy);\n    } else {\n        int min_priority = sched_get_priority_min(policy);\n        int max_priority = sched_get_priority_max(policy);\n        sched.sched_priority = (min_priority + (max_priority - min_priority) / 2);\n    }\n    if (pthread_setschedparam(thread, policy, &sched) < 0) {\n        return SDL_SetError(\"pthread_setschedparam() failed\");\n    }\n    return 0;\n#endif /* linux */\n}\n\nvoid\nSDL_SYS_WaitThread(SDL_Thread * thread)\n{\n    pthread_join(thread->handle, 0);\n}\n\nvoid\nSDL_SYS_DetachThread(SDL_Thread * thread)\n{\n    pthread_detach(thread->handle);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/thread/pthread/SDL_systhread_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#include <pthread.h>\n\ntypedef pthread_t SYS_ThreadHandle;\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/thread/pthread/SDL_systls.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n#include \"SDL_thread.h\"\n#include \"../SDL_thread_c.h\"\n\n#include <pthread.h>\n\n\n#define INVALID_PTHREAD_KEY ((pthread_key_t)-1)\n\nstatic pthread_key_t thread_local_storage = INVALID_PTHREAD_KEY;\nstatic SDL_bool generic_local_storage = SDL_FALSE;\n\nSDL_TLSData *\nSDL_SYS_GetTLSData()\n{\n    if (thread_local_storage == INVALID_PTHREAD_KEY && !generic_local_storage) {\n        static SDL_SpinLock lock;\n        SDL_AtomicLock(&lock);\n        if (thread_local_storage == INVALID_PTHREAD_KEY && !generic_local_storage) {\n            pthread_key_t storage;\n            if (pthread_key_create(&storage, NULL) == 0) {\n                SDL_MemoryBarrierRelease();\n                thread_local_storage = storage;\n            } else {\n                generic_local_storage = SDL_TRUE;\n            }\n        }\n        SDL_AtomicUnlock(&lock);\n    }\n    if (generic_local_storage) {\n        return SDL_Generic_GetTLSData();\n    }\n    SDL_MemoryBarrierAcquire();\n    return (SDL_TLSData *)pthread_getspecific(thread_local_storage);\n}\n\nint\nSDL_SYS_SetTLSData(SDL_TLSData *data)\n{\n    if (generic_local_storage) {\n        return SDL_Generic_SetTLSData(data);\n    }\n    if (pthread_setspecific(thread_local_storage, data) != 0) {\n        return SDL_SetError(\"pthread_setspecific() failed\");\n    }\n    return 0;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/timer/SDL_timer.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_timer.h\"\n#include \"SDL_timer_c.h\"\n#include \"SDL_atomic.h\"\n#include \"SDL_cpuinfo.h\"\n#include \"../thread/SDL_systhread.h\"\n\n/* #define DEBUG_TIMERS */\n\ntypedef struct _SDL_Timer\n{\n    int timerID;\n    SDL_TimerCallback callback;\n    void *param;\n    Uint32 interval;\n    Uint32 scheduled;\n    SDL_atomic_t canceled;\n    struct _SDL_Timer *next;\n} SDL_Timer;\n\ntypedef struct _SDL_TimerMap\n{\n    int timerID;\n    SDL_Timer *timer;\n    struct _SDL_TimerMap *next;\n} SDL_TimerMap;\n\n/* The timers are kept in a sorted list */\ntypedef struct {\n    /* Data used by the main thread */\n    SDL_Thread *thread;\n    SDL_atomic_t nextID;\n    SDL_TimerMap *timermap;\n    SDL_mutex *timermap_lock;\n\n    /* Padding to separate cache lines between threads */\n    char cache_pad[SDL_CACHELINE_SIZE];\n\n    /* Data used to communicate with the timer thread */\n    SDL_SpinLock lock;\n    SDL_sem *sem;\n    SDL_Timer *pending;\n    SDL_Timer *freelist;\n    SDL_atomic_t active;\n\n    /* List of timers - this is only touched by the timer thread */\n    SDL_Timer *timers;\n} SDL_TimerData;\n\nstatic SDL_TimerData SDL_timer_data;\n\n/* The idea here is that any thread might add a timer, but a single\n * thread manages the active timer queue, sorted by scheduling time.\n *\n * Timers are removed by simply setting a canceled flag\n */\n\nstatic void\nSDL_AddTimerInternal(SDL_TimerData *data, SDL_Timer *timer)\n{\n    SDL_Timer *prev, *curr;\n\n    prev = NULL;\n    for (curr = data->timers; curr; prev = curr, curr = curr->next) {\n        if ((Sint32)(timer->scheduled-curr->scheduled) < 0) {\n            break;\n        }\n    }\n\n    /* Insert the timer here! */\n    if (prev) {\n        prev->next = timer;\n    } else {\n        data->timers = timer;\n    }\n    timer->next = curr;\n}\n\nstatic int\nSDL_TimerThread(void *_data)\n{\n    SDL_TimerData *data = (SDL_TimerData *)_data;\n    SDL_Timer *pending;\n    SDL_Timer *current;\n    SDL_Timer *freelist_head = NULL;\n    SDL_Timer *freelist_tail = NULL;\n    Uint32 tick, now, interval, delay;\n\n    /* Threaded timer loop:\n     *  1. Queue timers added by other threads\n     *  2. Handle any timers that should dispatch this cycle\n     *  3. Wait until next dispatch time or new timer arrives\n     */\n    for ( ; ; ) {\n        /* Pending and freelist maintenance */\n        SDL_AtomicLock(&data->lock);\n        {\n            /* Get any timers ready to be queued */\n            pending = data->pending;\n            data->pending = NULL;\n\n            /* Make any unused timer structures available */\n            if (freelist_head) {\n                freelist_tail->next = data->freelist;\n                data->freelist = freelist_head;\n            }\n        }\n        SDL_AtomicUnlock(&data->lock);\n\n        /* Sort the pending timers into our list */\n        while (pending) {\n            current = pending;\n            pending = pending->next;\n            SDL_AddTimerInternal(data, current);\n        }\n        freelist_head = NULL;\n        freelist_tail = NULL;\n\n        /* Check to see if we're still running, after maintenance */\n        if (!SDL_AtomicGet(&data->active)) {\n            break;\n        }\n\n        /* Initial delay if there are no timers */\n        delay = SDL_MUTEX_MAXWAIT;\n\n        tick = SDL_GetTicks();\n\n        /* Process all the pending timers for this tick */\n        while (data->timers) {\n            current = data->timers;\n\n            if ((Sint32)(tick-current->scheduled) < 0) {\n                /* Scheduled for the future, wait a bit */\n                delay = (current->scheduled - tick);\n                break;\n            }\n\n            /* We're going to do something with this timer */\n            data->timers = current->next;\n\n            if (SDL_AtomicGet(&current->canceled)) {\n                interval = 0;\n            } else {\n                interval = current->callback(current->interval, current->param);\n            }\n\n            if (interval > 0) {\n                /* Reschedule this timer */\n                current->scheduled = tick + interval;\n                SDL_AddTimerInternal(data, current);\n            } else {\n                if (!freelist_head) {\n                    freelist_head = current;\n                }\n                if (freelist_tail) {\n                    freelist_tail->next = current;\n                }\n                freelist_tail = current;\n\n                SDL_AtomicSet(&current->canceled, 1);\n            }\n        }\n\n        /* Adjust the delay based on processing time */\n        now = SDL_GetTicks();\n        interval = (now - tick);\n        if (interval > delay) {\n            delay = 0;\n        } else {\n            delay -= interval;\n        }\n\n        /* Note that each time a timer is added, this will return\n           immediately, but we process the timers added all at once.\n           That's okay, it just means we run through the loop a few\n           extra times.\n         */\n        SDL_SemWaitTimeout(data->sem, delay);\n    }\n    return 0;\n}\n\nint\nSDL_TimerInit(void)\n{\n    SDL_TimerData *data = &SDL_timer_data;\n\n    if (!SDL_AtomicGet(&data->active)) {\n        const char *name = \"SDLTimer\";\n        data->timermap_lock = SDL_CreateMutex();\n        if (!data->timermap_lock) {\n            return -1;\n        }\n\n        data->sem = SDL_CreateSemaphore(0);\n        if (!data->sem) {\n            SDL_DestroyMutex(data->timermap_lock);\n            return -1;\n        }\n\n        SDL_AtomicSet(&data->active, 1);\n\n        /* Timer threads use a callback into the app, so we can't set a limited stack size here. */\n        data->thread = SDL_CreateThreadInternal(SDL_TimerThread, name, 0, data);\n        if (!data->thread) {\n            SDL_TimerQuit();\n            return -1;\n        }\n\n        SDL_AtomicSet(&data->nextID, 1);\n    }\n    return 0;\n}\n\nvoid\nSDL_TimerQuit(void)\n{\n    SDL_TimerData *data = &SDL_timer_data;\n    SDL_Timer *timer;\n    SDL_TimerMap *entry;\n\n    if (SDL_AtomicCAS(&data->active, 1, 0)) {  /* active? Move to inactive. */\n        /* Shutdown the timer thread */\n        if (data->thread) {\n            SDL_SemPost(data->sem);\n            SDL_WaitThread(data->thread, NULL);\n            data->thread = NULL;\n        }\n\n        SDL_DestroySemaphore(data->sem);\n        data->sem = NULL;\n\n        /* Clean up the timer entries */\n        while (data->timers) {\n            timer = data->timers;\n            data->timers = timer->next;\n            SDL_free(timer);\n        }\n        while (data->freelist) {\n            timer = data->freelist;\n            data->freelist = timer->next;\n            SDL_free(timer);\n        }\n        while (data->timermap) {\n            entry = data->timermap;\n            data->timermap = entry->next;\n            SDL_free(entry);\n        }\n\n        SDL_DestroyMutex(data->timermap_lock);\n        data->timermap_lock = NULL;\n    }\n}\n\nSDL_TimerID\nSDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *param)\n{\n    SDL_TimerData *data = &SDL_timer_data;\n    SDL_Timer *timer;\n    SDL_TimerMap *entry;\n\n    SDL_AtomicLock(&data->lock);\n    if (!SDL_AtomicGet(&data->active)) {\n        if (SDL_TimerInit() < 0) {\n            SDL_AtomicUnlock(&data->lock);\n            return 0;\n        }\n    }\n\n    timer = data->freelist;\n    if (timer) {\n        data->freelist = timer->next;\n    }\n    SDL_AtomicUnlock(&data->lock);\n\n    if (timer) {\n        SDL_RemoveTimer(timer->timerID);\n    } else {\n        timer = (SDL_Timer *)SDL_malloc(sizeof(*timer));\n        if (!timer) {\n            SDL_OutOfMemory();\n            return 0;\n        }\n    }\n    timer->timerID = SDL_AtomicIncRef(&data->nextID);\n    timer->callback = callback;\n    timer->param = param;\n    timer->interval = interval;\n    timer->scheduled = SDL_GetTicks() + interval;\n    SDL_AtomicSet(&timer->canceled, 0);\n\n    entry = (SDL_TimerMap *)SDL_malloc(sizeof(*entry));\n    if (!entry) {\n        SDL_free(timer);\n        SDL_OutOfMemory();\n        return 0;\n    }\n    entry->timer = timer;\n    entry->timerID = timer->timerID;\n\n    SDL_LockMutex(data->timermap_lock);\n    entry->next = data->timermap;\n    data->timermap = entry;\n    SDL_UnlockMutex(data->timermap_lock);\n\n    /* Add the timer to the pending list for the timer thread */\n    SDL_AtomicLock(&data->lock);\n    timer->next = data->pending;\n    data->pending = timer;\n    SDL_AtomicUnlock(&data->lock);\n\n    /* Wake up the timer thread if necessary */\n    SDL_SemPost(data->sem);\n\n    return entry->timerID;\n}\n\nSDL_bool\nSDL_RemoveTimer(SDL_TimerID id)\n{\n    SDL_TimerData *data = &SDL_timer_data;\n    SDL_TimerMap *prev, *entry;\n    SDL_bool canceled = SDL_FALSE;\n\n    /* Find the timer */\n    SDL_LockMutex(data->timermap_lock);\n    prev = NULL;\n    for (entry = data->timermap; entry; prev = entry, entry = entry->next) {\n        if (entry->timerID == id) {\n            if (prev) {\n                prev->next = entry->next;\n            } else {\n                data->timermap = entry->next;\n            }\n            break;\n        }\n    }\n    SDL_UnlockMutex(data->timermap_lock);\n\n    if (entry) {\n        if (!SDL_AtomicGet(&entry->timer->canceled)) {\n            SDL_AtomicSet(&entry->timer->canceled, 1);\n            canceled = SDL_TRUE;\n        }\n        SDL_free(entry);\n    }\n    return canceled;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/timer/SDL_timer_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Useful functions and variables from SDL_timer.c */\n#include \"SDL_timer.h\"\n\n#define ROUND_RESOLUTION(X) \\\n    (((X+TIMER_RESOLUTION-1)/TIMER_RESOLUTION)*TIMER_RESOLUTION)\n\nextern void SDL_TicksInit(void);\nextern void SDL_TicksQuit(void);\nextern int SDL_TimerInit(void);\nextern void SDL_TimerQuit(void);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/timer/unix/SDL_systimer.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifdef SDL_TIMER_UNIX\n\n#include <stdio.h>\n#include <sys/time.h>\n#include <unistd.h>\n#include <errno.h>\n\n#include \"SDL_timer.h\"\n#include \"SDL_assert.h\"\n\n/* The clock_gettime provides monotonous time, so we should use it if\n   it's available. The clock_gettime function is behind ifdef\n   for __USE_POSIX199309\n   Tommi Kyntola (tommi.kyntola@ray.fi) 27/09/2005\n*/\n/* Reworked monotonic clock to not assume the current system has one\n   as not all linux kernels provide a monotonic clock (yeah recent ones\n   probably do)\n   Also added OS X Monotonic clock support\n   Based on work in https://github.com/ThomasHabets/monotonic_clock\n */\n#if HAVE_NANOSLEEP || HAVE_CLOCK_GETTIME\n#include <time.h>\n#endif\n#ifdef __APPLE__\n#include <mach/mach_time.h>\n#endif\n\n/* Use CLOCK_MONOTONIC_RAW, if available, which is not subject to adjustment by NTP */\n#if HAVE_CLOCK_GETTIME\n#ifdef CLOCK_MONOTONIC_RAW\n#define SDL_MONOTONIC_CLOCK CLOCK_MONOTONIC_RAW\n#else\n#define SDL_MONOTONIC_CLOCK CLOCK_MONOTONIC\n#endif\n#endif\n\n/* The first ticks value of the application */\n#if HAVE_CLOCK_GETTIME\nstatic struct timespec start_ts;\n#elif defined(__APPLE__)\nstatic uint64_t start_mach;\nmach_timebase_info_data_t mach_base_info;\n#endif\nstatic SDL_bool has_monotonic_time = SDL_FALSE;\nstatic struct timeval start_tv;\nstatic SDL_bool ticks_started = SDL_FALSE;\n\nvoid\nSDL_TicksInit(void)\n{\n    if (ticks_started) {\n        return;\n    }\n    ticks_started = SDL_TRUE;\n\n    /* Set first ticks value */\n#if HAVE_CLOCK_GETTIME\n    if (clock_gettime(SDL_MONOTONIC_CLOCK, &start_ts) == 0) {\n        has_monotonic_time = SDL_TRUE;\n    } else\n#elif defined(__APPLE__)\n    kern_return_t ret = mach_timebase_info(&mach_base_info);\n    if (ret == 0) {\n        has_monotonic_time = SDL_TRUE;\n        start_mach = mach_absolute_time();\n    } else\n#endif\n    {\n        gettimeofday(&start_tv, NULL);\n    }\n}\n\nvoid\nSDL_TicksQuit(void)\n{\n    ticks_started = SDL_FALSE;\n}\n\nUint32\nSDL_GetTicks(void)\n{\n    Uint32 ticks;\n    if (!ticks_started) {\n        SDL_TicksInit();\n    }\n\n    if (has_monotonic_time) {\n#if HAVE_CLOCK_GETTIME\n        struct timespec now;\n        clock_gettime(SDL_MONOTONIC_CLOCK, &now);\n        ticks = (now.tv_sec - start_ts.tv_sec) * 1000 + (now.tv_nsec -\n                                                 start_ts.tv_nsec) / 1000000;\n#elif defined(__APPLE__)\n        uint64_t now = mach_absolute_time();\n        ticks = (Uint32)((((now - start_mach) * mach_base_info.numer) / mach_base_info.denom) / 1000000);\n#else\n        SDL_assert(SDL_FALSE);\n        ticks = 0;\n#endif\n    } else {\n        struct timeval now;\n\n        gettimeofday(&now, NULL);\n        ticks = (Uint32)((now.tv_sec - start_tv.tv_sec) * 1000 + (now.tv_usec - start_tv.tv_usec) / 1000);\n    }\n    return (ticks);\n}\n\nUint64\nSDL_GetPerformanceCounter(void)\n{\n    Uint64 ticks;\n    if (!ticks_started) {\n        SDL_TicksInit();\n    }\n\n    if (has_monotonic_time) {\n#if HAVE_CLOCK_GETTIME\n        struct timespec now;\n\n        clock_gettime(SDL_MONOTONIC_CLOCK, &now);\n        ticks = now.tv_sec;\n        ticks *= 1000000000;\n        ticks += now.tv_nsec;\n#elif defined(__APPLE__)\n        ticks = mach_absolute_time();\n#else\n        SDL_assert(SDL_FALSE);\n        ticks = 0;\n#endif\n    } else {\n        struct timeval now;\n\n        gettimeofday(&now, NULL);\n        ticks = now.tv_sec;\n        ticks *= 1000000;\n        ticks += now.tv_usec;\n    }\n    return (ticks);\n}\n\nUint64\nSDL_GetPerformanceFrequency(void)\n{\n    if (!ticks_started) {\n        SDL_TicksInit();\n    }\n\n    if (has_monotonic_time) {\n#if HAVE_CLOCK_GETTIME\n        return 1000000000;\n#elif defined(__APPLE__)\n        Uint64 freq = mach_base_info.denom;\n        freq *= 1000000000;\n        freq /= mach_base_info.numer;\n        return freq;\n#endif\n    } \n        \n    return 1000000;\n}\n\nvoid\nSDL_Delay(Uint32 ms)\n{\n    int was_error;\n\n#if HAVE_NANOSLEEP\n    struct timespec elapsed, tv;\n#else\n    struct timeval tv;\n    Uint32 then, now, elapsed;\n#endif\n\n    /* Set the timeout interval */\n#if HAVE_NANOSLEEP\n    elapsed.tv_sec = ms / 1000;\n    elapsed.tv_nsec = (ms % 1000) * 1000000;\n#else\n    then = SDL_GetTicks();\n#endif\n    do {\n        errno = 0;\n\n#if HAVE_NANOSLEEP\n        tv.tv_sec = elapsed.tv_sec;\n        tv.tv_nsec = elapsed.tv_nsec;\n        was_error = nanosleep(&tv, &elapsed);\n#else\n        /* Calculate the time interval left (in case of interrupt) */\n        now = SDL_GetTicks();\n        elapsed = (now - then);\n        then = now;\n        if (elapsed >= ms) {\n            break;\n        }\n        ms -= elapsed;\n        tv.tv_sec = ms / 1000;\n        tv.tv_usec = (ms % 1000) * 1000;\n\n        was_error = select(0, NULL, NULL, NULL, &tv);\n#endif /* HAVE_NANOSLEEP */\n    } while (was_error && (errno == EINTR));\n}\n\n#endif /* SDL_TIMER_UNIX */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_RLEaccel.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/*\n * RLE encoding for software colorkey and alpha-channel acceleration\n *\n * Original version by Sam Lantinga\n *\n * Mattias Engdegrd (Yorick): Rewrite. New encoding format, encoder and\n * decoder. Added per-surface alpha blitter. Added per-pixel alpha\n * format, encoder and blitter.\n *\n * Many thanks to Xark and johns for hints, benchmarks and useful comments\n * leading to this code.\n *\n * Welcome to Macro Mayhem.\n */\n\n/*\n * The encoding translates the image data to a stream of segments of the form\n *\n * <skip> <run> <data>\n *\n * where <skip> is the number of transparent pixels to skip,\n *       <run>  is the number of opaque pixels to blit,\n * and   <data> are the pixels themselves.\n *\n * This basic structure is used both for colorkeyed surfaces, used for simple\n * binary transparency and for per-surface alpha blending, and for surfaces\n * with per-pixel alpha. The details differ, however:\n *\n * Encoding of colorkeyed surfaces:\n *\n *   Encoded pixels always have the same format as the target surface.\n *   <skip> and <run> are unsigned 8 bit integers, except for 32 bit depth\n *   where they are 16 bit. This makes the pixel data aligned at all times.\n *   Segments never wrap around from one scan line to the next.\n *\n *   The end of the sequence is marked by a zero <skip>,<run> pair at the *\n *   beginning of a line.\n *\n * Encoding of surfaces with per-pixel alpha:\n *\n *   The sequence begins with a struct RLEDestFormat describing the target\n *   pixel format, to provide reliable un-encoding.\n *\n *   Each scan line is encoded twice: First all completely opaque pixels,\n *   encoded in the target format as described above, and then all\n *   partially transparent (translucent) pixels (where 1 <= alpha <= 254),\n *   in the following 32-bit format:\n *\n *   For 32-bit targets, each pixel has the target RGB format but with\n *   the alpha value occupying the highest 8 bits. The <skip> and <run>\n *   counts are 16 bit.\n *\n *   For 16-bit targets, each pixel has the target RGB format, but with\n *   the middle component (usually green) shifted 16 steps to the left,\n *   and the hole filled with the 5 most significant bits of the alpha value.\n *   i.e. if the target has the format         rrrrrggggggbbbbb,\n *   the encoded pixel will be 00000gggggg00000rrrrr0aaaaabbbbb.\n *   The <skip> and <run> counts are 8 bit for the opaque lines, 16 bit\n *   for the translucent lines. Two padding bytes may be inserted\n *   before each translucent line to keep them 32-bit aligned.\n *\n *   The end of the sequence is marked by a zero <skip>,<run> pair at the\n *   beginning of an opaque line.\n */\n\n#include \"SDL_video.h\"\n#include \"SDL_sysvideo.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_RLEaccel_c.h\"\n\n#ifndef MAX\n#define MAX(a, b) ((a) > (b) ? (a) : (b))\n#endif\n#ifndef MIN\n#define MIN(a, b) ((a) < (b) ? (a) : (b))\n#endif\n\n#define PIXEL_COPY(to, from, len, bpp)          \\\n    SDL_memcpy(to, from, (size_t)(len) * (bpp))\n\n/*\n * Various colorkey blit methods, for opaque and per-surface alpha\n */\n\n#define OPAQUE_BLIT(to, from, length, bpp, alpha)   \\\n    PIXEL_COPY(to, from, length, bpp)\n\n/*\n * For 32bpp pixels on the form 0x00rrggbb:\n * If we treat the middle component separately, we can process the two\n * remaining in parallel. This is safe to do because of the gap to the left\n * of each component, so the bits from the multiplication don't collide.\n * This can be used for any RGB permutation of course.\n */\n#define ALPHA_BLIT32_888(to, from, length, bpp, alpha)      \\\n    do {                                                    \\\n        int i;                                              \\\n        Uint32 *src = (Uint32 *)(from);                     \\\n        Uint32 *dst = (Uint32 *)(to);                       \\\n        for (i = 0; i < (int)(length); i++) {               \\\n            Uint32 s = *src++;                              \\\n            Uint32 d = *dst;                                \\\n            Uint32 s1 = s & 0xff00ff;                       \\\n            Uint32 d1 = d & 0xff00ff;                       \\\n            d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff; \\\n            s &= 0xff00;                                    \\\n            d &= 0xff00;                                    \\\n            d = (d + ((s - d) * alpha >> 8)) & 0xff00;      \\\n            *dst++ = d1 | d;                                \\\n        }                                                   \\\n    } while (0)\n\n/*\n * For 16bpp pixels we can go a step further: put the middle component\n * in the high 16 bits of a 32 bit word, and process all three RGB\n * components at the same time. Since the smallest gap is here just\n * 5 bits, we have to scale alpha down to 5 bits as well.\n */\n#define ALPHA_BLIT16_565(to, from, length, bpp, alpha)  \\\n    do {                                                \\\n        int i;                                          \\\n        Uint16 *src = (Uint16 *)(from);                 \\\n        Uint16 *dst = (Uint16 *)(to);                   \\\n        Uint32 ALPHA = alpha >> 3;                      \\\n        for(i = 0; i < (int)(length); i++) {            \\\n            Uint32 s = *src++;                          \\\n            Uint32 d = *dst;                            \\\n            s = (s | s << 16) & 0x07e0f81f;             \\\n            d = (d | d << 16) & 0x07e0f81f;             \\\n            d += (s - d) * ALPHA >> 5;                  \\\n            d &= 0x07e0f81f;                            \\\n            *dst++ = (Uint16)(d | d >> 16);             \\\n        }                                               \\\n    } while(0)\n\n#define ALPHA_BLIT16_555(to, from, length, bpp, alpha)  \\\n    do {                                                \\\n        int i;                                          \\\n        Uint16 *src = (Uint16 *)(from);                 \\\n        Uint16 *dst = (Uint16 *)(to);                   \\\n        Uint32 ALPHA = alpha >> 3;                      \\\n        for(i = 0; i < (int)(length); i++) {            \\\n            Uint32 s = *src++;                          \\\n            Uint32 d = *dst;                            \\\n            s = (s | s << 16) & 0x03e07c1f;             \\\n            d = (d | d << 16) & 0x03e07c1f;             \\\n            d += (s - d) * ALPHA >> 5;                  \\\n            d &= 0x03e07c1f;                            \\\n            *dst++ = (Uint16)(d | d >> 16);             \\\n        }                                               \\\n    } while(0)\n\n/*\n * The general slow catch-all function, for remaining depths and formats\n */\n#define ALPHA_BLIT_ANY(to, from, length, bpp, alpha)            \\\n    do {                                                        \\\n        int i;                                                  \\\n        Uint8 *src = from;                                      \\\n        Uint8 *dst = to;                                        \\\n        for (i = 0; i < (int)(length); i++) {                   \\\n            Uint32 s, d;                                        \\\n            unsigned rs, gs, bs, rd, gd, bd;                    \\\n            switch (bpp) {                                      \\\n            case 2:                                             \\\n                s = *(Uint16 *)src;                             \\\n                d = *(Uint16 *)dst;                             \\\n                break;                                          \\\n            case 3:                                             \\\n                if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {          \\\n                    s = (src[0] << 16) | (src[1] << 8) | src[2]; \\\n                    d = (dst[0] << 16) | (dst[1] << 8) | dst[2]; \\\n                } else {                                        \\\n                    s = (src[2] << 16) | (src[1] << 8) | src[0]; \\\n                    d = (dst[2] << 16) | (dst[1] << 8) | dst[0]; \\\n                }                                               \\\n                break;                                          \\\n            case 4:                                             \\\n                s = *(Uint32 *)src;                             \\\n                d = *(Uint32 *)dst;                             \\\n                break;                                          \\\n            }                                                   \\\n            RGB_FROM_PIXEL(s, fmt, rs, gs, bs);                 \\\n            RGB_FROM_PIXEL(d, fmt, rd, gd, bd);                 \\\n            rd += (rs - rd) * alpha >> 8;                       \\\n            gd += (gs - gd) * alpha >> 8;                       \\\n            bd += (bs - bd) * alpha >> 8;                       \\\n            PIXEL_FROM_RGB(d, fmt, rd, gd, bd);                 \\\n            switch (bpp) {                                      \\\n            case 2:                                             \\\n                *(Uint16 *)dst = (Uint16)d;                     \\\n                break;                                          \\\n            case 3:                                             \\\n                if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {          \\\n                    dst[0] = (Uint8)(d >> 16);                  \\\n                    dst[1] = (Uint8)(d >> 8);                   \\\n                    dst[2] = (Uint8)(d);                        \\\n                } else {                                        \\\n                    dst[0] = (Uint8)d;                          \\\n                    dst[1] = (Uint8)(d >> 8);                   \\\n                    dst[2] = (Uint8)(d >> 16);                  \\\n                }                                               \\\n                break;                                          \\\n            case 4:                                             \\\n                *(Uint32 *)dst = d;                             \\\n                break;                                          \\\n            }                                                   \\\n            src += bpp;                                         \\\n            dst += bpp;                                         \\\n        }                                                       \\\n    } while(0)\n\n/*\n * Special case: 50% alpha (alpha=128)\n * This is treated specially because it can be optimized very well, and\n * since it is good for many cases of semi-translucency.\n * The theory is to do all three components at the same time:\n * First zero the lowest bit of each component, which gives us room to\n * add them. Then shift right and add the sum of the lowest bits.\n */\n#define ALPHA_BLIT32_888_50(to, from, length, bpp, alpha)       \\\n    do {                                                        \\\n        int i;                                                  \\\n        Uint32 *src = (Uint32 *)(from);                         \\\n        Uint32 *dst = (Uint32 *)(to);                           \\\n        for(i = 0; i < (int)(length); i++) {                    \\\n            Uint32 s = *src++;                                  \\\n            Uint32 d = *dst;                                    \\\n            *dst++ = (((s & 0x00fefefe) + (d & 0x00fefefe)) >> 1) \\\n                 + (s & d & 0x00010101);                        \\\n        }                                                       \\\n    } while(0)\n\n/*\n * For 16bpp, we can actually blend two pixels in parallel, if we take\n * care to shift before we add, not after.\n */\n\n/* helper: blend a single 16 bit pixel at 50% */\n#define BLEND16_50(dst, src, mask)                              \\\n    do {                                                        \\\n        Uint32 s = *src++;                                      \\\n        Uint32 d = *dst;                                        \\\n        *dst++ = (Uint16)((((s & mask) + (d & mask)) >> 1) +    \\\n                          (s & d & (~mask & 0xffff)));          \\\n    } while(0)\n\n/* basic 16bpp blender. mask is the pixels to keep when adding. */\n#define ALPHA_BLIT16_50(to, from, length, bpp, alpha, mask)     \\\n    do {                                                        \\\n        unsigned n = (length);                                  \\\n        Uint16 *src = (Uint16 *)(from);                         \\\n        Uint16 *dst = (Uint16 *)(to);                           \\\n        if (((uintptr_t)src ^ (uintptr_t)dst) & 3) {            \\\n            /* source and destination not in phase, blit one by one */ \\\n            while (n--)                                         \\\n                BLEND16_50(dst, src, mask);                     \\\n        } else {                                                \\\n            if ((uintptr_t)src & 3) {                           \\\n                /* first odd pixel */                           \\\n                BLEND16_50(dst, src, mask);                     \\\n                n--;                                            \\\n            }                                                   \\\n            for (; n > 1; n -= 2) {                             \\\n                Uint32 s = *(Uint32 *)src;                      \\\n                Uint32 d = *(Uint32 *)dst;                      \\\n                *(Uint32 *)dst = ((s & (mask | mask << 16)) >> 1) \\\n                    + ((d & (mask | mask << 16)) >> 1)          \\\n                    + (s & d & (~(mask | mask << 16)));         \\\n                src += 2;                                       \\\n                dst += 2;                                       \\\n            }                                                   \\\n            if (n)                                              \\\n                BLEND16_50(dst, src, mask); /* last odd pixel */ \\\n        }                                                       \\\n    } while(0)\n\n#define ALPHA_BLIT16_565_50(to, from, length, bpp, alpha)       \\\n    ALPHA_BLIT16_50(to, from, length, bpp, alpha, 0xf7de)\n\n#define ALPHA_BLIT16_555_50(to, from, length, bpp, alpha)       \\\n    ALPHA_BLIT16_50(to, from, length, bpp, alpha, 0xfbde)\n\n#define CHOOSE_BLIT(blitter, alpha, fmt)                        \\\n    do {                                                        \\\n        if (alpha == 255) {                                     \\\n            switch (fmt->BytesPerPixel) {                       \\\n            case 1: blitter(1, Uint8, OPAQUE_BLIT); break;      \\\n            case 2: blitter(2, Uint8, OPAQUE_BLIT); break;      \\\n            case 3: blitter(3, Uint8, OPAQUE_BLIT); break;      \\\n            case 4: blitter(4, Uint16, OPAQUE_BLIT); break;     \\\n            }                                                   \\\n        } else {                                                \\\n            switch (fmt->BytesPerPixel) {                       \\\n            case 1:                                             \\\n                /* No 8bpp alpha blitting */                    \\\n                break;                                          \\\n                                                                \\\n            case 2:                                             \\\n                switch (fmt->Rmask | fmt->Gmask | fmt->Bmask) { \\\n                case 0xffff:                                    \\\n                    if (fmt->Gmask == 0x07e0                    \\\n                        || fmt->Rmask == 0x07e0                 \\\n                        || fmt->Bmask == 0x07e0) {              \\\n                        if (alpha == 128) {                     \\\n                            blitter(2, Uint8, ALPHA_BLIT16_565_50); \\\n                        } else {                                \\\n                            blitter(2, Uint8, ALPHA_BLIT16_565); \\\n                        }                                       \\\n                    } else                                      \\\n                        goto general16;                         \\\n                    break;                                      \\\n                                                                \\\n                case 0x7fff:                                    \\\n                    if (fmt->Gmask == 0x03e0                    \\\n                        || fmt->Rmask == 0x03e0                 \\\n                        || fmt->Bmask == 0x03e0) {              \\\n                        if (alpha == 128) {                     \\\n                            blitter(2, Uint8, ALPHA_BLIT16_555_50); \\\n                        } else {                                \\\n                            blitter(2, Uint8, ALPHA_BLIT16_555); \\\n                        }                                       \\\n                        break;                                  \\\n                    } else                                      \\\n                        goto general16;                         \\\n                    break;                                      \\\n                                                                \\\n                default:                                        \\\n    general16:                                                  \\\n                    blitter(2, Uint8, ALPHA_BLIT_ANY);          \\\n                }                                               \\\n                break;                                          \\\n                                                                \\\n            case 3:                                             \\\n                blitter(3, Uint8, ALPHA_BLIT_ANY);              \\\n                break;                                          \\\n                                                                \\\n            case 4:                                             \\\n                if ((fmt->Rmask | fmt->Gmask | fmt->Bmask) == 0x00ffffff \\\n                    && (fmt->Gmask == 0xff00 || fmt->Rmask == 0xff00 \\\n                    || fmt->Bmask == 0xff00)) {                 \\\n                    if (alpha == 128) {                         \\\n                        blitter(4, Uint16, ALPHA_BLIT32_888_50); \\\n                    } else {                                    \\\n                        blitter(4, Uint16, ALPHA_BLIT32_888);   \\\n                    }                                           \\\n                } else                                          \\\n                    blitter(4, Uint16, ALPHA_BLIT_ANY);         \\\n                break;                                          \\\n            }                                                   \\\n        }                                                       \\\n    } while(0)\n\n/*\n * Set a pixel value using the given format, except that the alpha value is\n * placed in the top byte. This is the format used for RLE with alpha.\n */\n#define RLEPIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a)                      \\\n{                                                                       \\\n    Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)|                             \\\n        ((g>>fmt->Gloss)<<fmt->Gshift)|                                 \\\n        ((b>>fmt->Bloss)<<fmt->Bshift)|                                 \\\n        (a<<24);                                                        \\\n}\n\n/*\n * This takes care of the case when the surface is clipped on the left and/or\n * right. Top clipping has already been taken care of.\n */\nstatic void\nRLEClipBlit(int w, Uint8 * srcbuf, SDL_Surface * surf_dst,\n            Uint8 * dstbuf, SDL_Rect * srcrect, unsigned alpha)\n{\n    SDL_PixelFormat *fmt = surf_dst->format;\n\n#define RLECLIPBLIT(bpp, Type, do_blit)                         \\\n    do {                                                        \\\n        int linecount = srcrect->h;                             \\\n        int ofs = 0;                                            \\\n        int left = srcrect->x;                                  \\\n        int right = left + srcrect->w;                          \\\n        dstbuf -= left * bpp;                                   \\\n        for (;;) {                                              \\\n            int run;                                            \\\n            ofs += *(Type *)srcbuf;                             \\\n            run = ((Type *)srcbuf)[1];                          \\\n            srcbuf += 2 * sizeof(Type);                         \\\n            if (run) {                                          \\\n                /* clip to left and right borders */            \\\n                if (ofs < right) {                              \\\n                    int start = 0;                              \\\n                    int len = run;                              \\\n                    int startcol;                               \\\n                    if (left - ofs > 0) {                       \\\n                        start = left - ofs;                     \\\n                        len -= start;                           \\\n                        if (len <= 0)                           \\\n                            goto nocopy ## bpp ## do_blit;      \\\n                    }                                           \\\n                    startcol = ofs + start;                     \\\n                    if (len > right - startcol)                 \\\n                        len = right - startcol;                 \\\n                    do_blit(dstbuf + startcol * bpp, srcbuf + start * bpp, \\\n                        len, bpp, alpha);                       \\\n                }                                               \\\n    nocopy ## bpp ## do_blit:                                   \\\n                srcbuf += run * bpp;                            \\\n                ofs += run;                                     \\\n            } else if (!ofs)                                    \\\n                break;                                          \\\n                                                                \\\n            if (ofs == w) {                                     \\\n                ofs = 0;                                        \\\n                dstbuf += surf_dst->pitch;                      \\\n                if (!--linecount)                               \\\n                    break;                                      \\\n            }                                                   \\\n        }                                                       \\\n    } while(0)\n\n    CHOOSE_BLIT(RLECLIPBLIT, alpha, fmt);\n\n#undef RLECLIPBLIT\n\n}\n\n\n/* blit a colorkeyed RLE surface */\nint\nSDL_RLEBlit(SDL_Surface * surf_src, SDL_Rect * srcrect,\n            SDL_Surface * surf_dst, SDL_Rect * dstrect)\n{\n    Uint8 *dstbuf;\n    Uint8 *srcbuf;\n    int x, y;\n    int w = surf_src->w;\n    unsigned alpha;\n\n    /* Lock the destination if necessary */\n    if (SDL_MUSTLOCK(surf_dst)) {\n        if (SDL_LockSurface(surf_dst) < 0) {\n            return (-1);\n        }\n    }\n\n    /* Set up the source and destination pointers */\n    x = dstrect->x;\n    y = dstrect->y;\n    dstbuf = (Uint8 *) surf_dst->pixels\n        + y * surf_dst->pitch + x * surf_src->format->BytesPerPixel;\n    srcbuf = (Uint8 *) surf_src->map->data;\n\n    {\n        /* skip lines at the top if necessary */\n        int vskip = srcrect->y;\n        int ofs = 0;\n        if (vskip) {\n\n#define RLESKIP(bpp, Type)          \\\n        for(;;) {           \\\n            int run;            \\\n            ofs += *(Type *)srcbuf; \\\n            run = ((Type *)srcbuf)[1];  \\\n            srcbuf += sizeof(Type) * 2; \\\n            if(run) {           \\\n            srcbuf += run * bpp;    \\\n            ofs += run;     \\\n            } else if(!ofs)     \\\n            goto done;      \\\n            if(ofs == w) {      \\\n            ofs = 0;        \\\n            if(!--vskip)        \\\n                break;      \\\n            }               \\\n        }\n\n            switch (surf_src->format->BytesPerPixel) {\n            case 1:\n                RLESKIP(1, Uint8);\n                break;\n            case 2:\n                RLESKIP(2, Uint8);\n                break;\n            case 3:\n                RLESKIP(3, Uint8);\n                break;\n            case 4:\n                RLESKIP(4, Uint16);\n                break;\n            }\n\n#undef RLESKIP\n\n        }\n    }\n\n    alpha = surf_src->map->info.a;\n    /* if left or right edge clipping needed, call clip blit */\n    if (srcrect->x || srcrect->w != surf_src->w) {\n        RLEClipBlit(w, srcbuf, surf_dst, dstbuf, srcrect, alpha);\n    } else {\n        SDL_PixelFormat *fmt = surf_src->format;\n\n#define RLEBLIT(bpp, Type, do_blit)                       \\\n        do {                                  \\\n        int linecount = srcrect->h;                   \\\n        int ofs = 0;                              \\\n        for(;;) {                             \\\n            unsigned run;                         \\\n            ofs += *(Type *)srcbuf;                   \\\n            run = ((Type *)srcbuf)[1];                    \\\n            srcbuf += 2 * sizeof(Type);                   \\\n            if(run) {                             \\\n            do_blit(dstbuf + ofs * bpp, srcbuf, run, bpp, alpha); \\\n            srcbuf += run * bpp;                      \\\n            ofs += run;                       \\\n            } else if(!ofs)                       \\\n            break;                            \\\n            if(ofs == w) {                        \\\n            ofs = 0;                          \\\n            dstbuf += surf_dst->pitch;                     \\\n            if(!--linecount)                      \\\n                break;                        \\\n            }                                 \\\n        }                                 \\\n        } while(0)\n\n        CHOOSE_BLIT(RLEBLIT, alpha, fmt);\n\n#undef RLEBLIT\n    }\n\n  done:\n    /* Unlock the destination if necessary */\n    if (SDL_MUSTLOCK(surf_dst)) {\n        SDL_UnlockSurface(surf_dst);\n    }\n    return (0);\n}\n\n#undef OPAQUE_BLIT\n\n/*\n * Per-pixel blitting macros for translucent pixels:\n * These use the same techniques as the per-surface blitting macros\n */\n\n/*\n * For 32bpp pixels, we have made sure the alpha is stored in the top\n * 8 bits, so proceed as usual\n */\n#define BLIT_TRANSL_888(src, dst)               \\\n    do {                            \\\n        Uint32 s = src;                     \\\n    Uint32 d = dst;                     \\\n    unsigned alpha = s >> 24;               \\\n    Uint32 s1 = s & 0xff00ff;               \\\n    Uint32 d1 = d & 0xff00ff;               \\\n    d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff;    \\\n    s &= 0xff00;                        \\\n    d &= 0xff00;                        \\\n    d = (d + ((s - d) * alpha >> 8)) & 0xff00;      \\\n    dst = d1 | d | 0xff000000;              \\\n    } while(0)\n\n/*\n * For 16bpp pixels, we have stored the 5 most significant alpha bits in\n * bits 5-10. As before, we can process all 3 RGB components at the same time.\n */\n#define BLIT_TRANSL_565(src, dst)       \\\n    do {                    \\\n    Uint32 s = src;             \\\n    Uint32 d = dst;             \\\n    unsigned alpha = (s & 0x3e0) >> 5;  \\\n    s &= 0x07e0f81f;            \\\n    d = (d | d << 16) & 0x07e0f81f;     \\\n    d += (s - d) * alpha >> 5;      \\\n    d &= 0x07e0f81f;            \\\n    dst = (Uint16)(d | d >> 16);            \\\n    } while(0)\n\n#define BLIT_TRANSL_555(src, dst)       \\\n    do {                    \\\n    Uint32 s = src;             \\\n    Uint32 d = dst;             \\\n    unsigned alpha = (s & 0x3e0) >> 5;  \\\n    s &= 0x03e07c1f;            \\\n    d = (d | d << 16) & 0x03e07c1f;     \\\n    d += (s - d) * alpha >> 5;      \\\n    d &= 0x03e07c1f;            \\\n    dst = (Uint16)(d | d >> 16);            \\\n    } while(0)\n\n/* used to save the destination format in the encoding. Designed to be\n   macro-compatible with SDL_PixelFormat but without the unneeded fields */\ntypedef struct\n{\n    Uint8 BytesPerPixel;\n    Uint8 padding[3];\n    Uint32 Rmask;\n    Uint32 Gmask;\n    Uint32 Bmask;\n    Uint32 Amask;\n    Uint8 Rloss;\n    Uint8 Gloss;\n    Uint8 Bloss;\n    Uint8 Aloss;\n    Uint8 Rshift;\n    Uint8 Gshift;\n    Uint8 Bshift;\n    Uint8 Ashift;\n} RLEDestFormat;\n\n/* blit a pixel-alpha RLE surface clipped at the right and/or left edges */\nstatic void\nRLEAlphaClipBlit(int w, Uint8 * srcbuf, SDL_Surface * surf_dst,\n                 Uint8 * dstbuf, SDL_Rect * srcrect)\n{\n    SDL_PixelFormat *df = surf_dst->format;\n    /*\n     * clipped blitter: Ptype is the destination pixel type,\n     * Ctype the translucent count type, and do_blend the macro\n     * to blend one pixel.\n     */\n#define RLEALPHACLIPBLIT(Ptype, Ctype, do_blend)              \\\n    do {                                  \\\n    int linecount = srcrect->h;                   \\\n    int left = srcrect->x;                        \\\n    int right = left + srcrect->w;                    \\\n    dstbuf -= left * sizeof(Ptype);                   \\\n    do {                                  \\\n        int ofs = 0;                          \\\n        /* blit opaque pixels on one line */              \\\n        do {                              \\\n        unsigned run;                         \\\n        ofs += ((Ctype *)srcbuf)[0];                  \\\n        run = ((Ctype *)srcbuf)[1];               \\\n        srcbuf += 2 * sizeof(Ctype);                  \\\n        if(run) {                         \\\n            /* clip to left and right borders */          \\\n            int cofs = ofs;                   \\\n            int crun = run;                   \\\n            if(left - cofs > 0) {                 \\\n            crun -= left - cofs;                  \\\n            cofs = left;                      \\\n            }                             \\\n            if(crun > right - cofs)               \\\n            crun = right - cofs;                  \\\n            if(crun > 0)                      \\\n            PIXEL_COPY(dstbuf + cofs * sizeof(Ptype),     \\\n                   srcbuf + (cofs - ofs) * sizeof(Ptype), \\\n                   (unsigned)crun, sizeof(Ptype));    \\\n            srcbuf += run * sizeof(Ptype);            \\\n            ofs += run;                       \\\n        } else if(!ofs)                       \\\n            return;                       \\\n        } while(ofs < w);                         \\\n        /* skip padding if necessary */               \\\n        if(sizeof(Ptype) == 2)                    \\\n        srcbuf += (uintptr_t)srcbuf & 2;              \\\n        /* blit translucent pixels on the same line */        \\\n        ofs = 0;                              \\\n        do {                              \\\n        unsigned run;                         \\\n        ofs += ((Uint16 *)srcbuf)[0];                 \\\n        run = ((Uint16 *)srcbuf)[1];                  \\\n        srcbuf += 4;                          \\\n        if(run) {                         \\\n            /* clip to left and right borders */          \\\n            int cofs = ofs;                   \\\n            int crun = run;                   \\\n            if(left - cofs > 0) {                 \\\n            crun -= left - cofs;                  \\\n            cofs = left;                      \\\n            }                             \\\n            if(crun > right - cofs)               \\\n            crun = right - cofs;                  \\\n            if(crun > 0) {                    \\\n            Ptype *dst = (Ptype *)dstbuf + cofs;          \\\n            Uint32 *src = (Uint32 *)srcbuf + (cofs - ofs);    \\\n            int i;                        \\\n            for(i = 0; i < crun; i++)             \\\n                do_blend(src[i], dst[i]);             \\\n            }                             \\\n            srcbuf += run * 4;                    \\\n            ofs += run;                       \\\n        }                             \\\n        } while(ofs < w);                         \\\n        dstbuf += surf_dst->pitch;                     \\\n    } while(--linecount);                         \\\n    } while(0)\n\n    switch (df->BytesPerPixel) {\n    case 2:\n        if (df->Gmask == 0x07e0 || df->Rmask == 0x07e0 || df->Bmask == 0x07e0)\n            RLEALPHACLIPBLIT(Uint16, Uint8, BLIT_TRANSL_565);\n        else\n            RLEALPHACLIPBLIT(Uint16, Uint8, BLIT_TRANSL_555);\n        break;\n    case 4:\n        RLEALPHACLIPBLIT(Uint32, Uint16, BLIT_TRANSL_888);\n        break;\n    }\n}\n\n/* blit a pixel-alpha RLE surface */\nint\nSDL_RLEAlphaBlit(SDL_Surface * surf_src, SDL_Rect * srcrect,\n                 SDL_Surface * surf_dst, SDL_Rect * dstrect)\n{\n    int x, y;\n    int w = surf_src->w;\n    Uint8 *srcbuf, *dstbuf;\n    SDL_PixelFormat *df = surf_dst->format;\n\n    /* Lock the destination if necessary */\n    if (SDL_MUSTLOCK(surf_dst)) {\n        if (SDL_LockSurface(surf_dst) < 0) {\n            return -1;\n        }\n    }\n\n    x = dstrect->x;\n    y = dstrect->y;\n    dstbuf = (Uint8 *) surf_dst->pixels + y * surf_dst->pitch + x * df->BytesPerPixel;\n    srcbuf = (Uint8 *) surf_src->map->data + sizeof(RLEDestFormat);\n\n    {\n        /* skip lines at the top if necessary */\n        int vskip = srcrect->y;\n        if (vskip) {\n            int ofs;\n            if (df->BytesPerPixel == 2) {\n                /* the 16/32 interleaved format */\n                do {\n                    /* skip opaque line */\n                    ofs = 0;\n                    do {\n                        int run;\n                        ofs += srcbuf[0];\n                        run = srcbuf[1];\n                        srcbuf += 2;\n                        if (run) {\n                            srcbuf += 2 * run;\n                            ofs += run;\n                        } else if (!ofs)\n                            goto done;\n                    } while (ofs < w);\n\n                    /* skip padding */\n                    srcbuf += (uintptr_t) srcbuf & 2;\n\n                    /* skip translucent line */\n                    ofs = 0;\n                    do {\n                        int run;\n                        ofs += ((Uint16 *) srcbuf)[0];\n                        run = ((Uint16 *) srcbuf)[1];\n                        srcbuf += 4 * (run + 1);\n                        ofs += run;\n                    } while (ofs < w);\n                } while (--vskip);\n            } else {\n                /* the 32/32 interleaved format */\n                vskip <<= 1;    /* opaque and translucent have same format */\n                do {\n                    ofs = 0;\n                    do {\n                        int run;\n                        ofs += ((Uint16 *) srcbuf)[0];\n                        run = ((Uint16 *) srcbuf)[1];\n                        srcbuf += 4;\n                        if (run) {\n                            srcbuf += 4 * run;\n                            ofs += run;\n                        } else if (!ofs)\n                            goto done;\n                    } while (ofs < w);\n                } while (--vskip);\n            }\n        }\n    }\n\n    /* if left or right edge clipping needed, call clip blit */\n    if (srcrect->x || srcrect->w != surf_src->w) {\n        RLEAlphaClipBlit(w, srcbuf, surf_dst, dstbuf, srcrect);\n    } else {\n\n        /*\n         * non-clipped blitter. Ptype is the destination pixel type,\n         * Ctype the translucent count type, and do_blend the\n         * macro to blend one pixel.\n         */\n#define RLEALPHABLIT(Ptype, Ctype, do_blend)                 \\\n    do {                                 \\\n        int linecount = srcrect->h;                  \\\n        do {                             \\\n        int ofs = 0;                         \\\n        /* blit opaque pixels on one line */             \\\n        do {                             \\\n            unsigned run;                    \\\n            ofs += ((Ctype *)srcbuf)[0];             \\\n            run = ((Ctype *)srcbuf)[1];              \\\n            srcbuf += 2 * sizeof(Ctype);             \\\n            if(run) {                        \\\n            PIXEL_COPY(dstbuf + ofs * sizeof(Ptype), srcbuf, \\\n                   run, sizeof(Ptype));          \\\n            srcbuf += run * sizeof(Ptype);           \\\n            ofs += run;                  \\\n            } else if(!ofs)                  \\\n            goto done;                   \\\n        } while(ofs < w);                    \\\n        /* skip padding if necessary */              \\\n        if(sizeof(Ptype) == 2)                   \\\n            srcbuf += (uintptr_t)srcbuf & 2;             \\\n        /* blit translucent pixels on the same line */       \\\n        ofs = 0;                         \\\n        do {                             \\\n            unsigned run;                    \\\n            ofs += ((Uint16 *)srcbuf)[0];            \\\n            run = ((Uint16 *)srcbuf)[1];             \\\n            srcbuf += 4;                     \\\n            if(run) {                        \\\n            Ptype *dst = (Ptype *)dstbuf + ofs;      \\\n            unsigned i;                  \\\n            for(i = 0; i < run; i++) {           \\\n                Uint32 src = *(Uint32 *)srcbuf;      \\\n                do_blend(src, *dst);             \\\n                srcbuf += 4;                 \\\n                dst++;                   \\\n            }                        \\\n            ofs += run;                  \\\n            }                            \\\n        } while(ofs < w);                    \\\n        dstbuf += surf_dst->pitch;                    \\\n        } while(--linecount);                    \\\n    } while(0)\n\n        switch (df->BytesPerPixel) {\n        case 2:\n            if (df->Gmask == 0x07e0 || df->Rmask == 0x07e0\n                || df->Bmask == 0x07e0)\n                RLEALPHABLIT(Uint16, Uint8, BLIT_TRANSL_565);\n            else\n                RLEALPHABLIT(Uint16, Uint8, BLIT_TRANSL_555);\n            break;\n        case 4:\n            RLEALPHABLIT(Uint32, Uint16, BLIT_TRANSL_888);\n            break;\n        }\n    }\n\n  done:\n    /* Unlock the destination if necessary */\n    if (SDL_MUSTLOCK(surf_dst)) {\n        SDL_UnlockSurface(surf_dst);\n    }\n    return 0;\n}\n\n/*\n * Auxiliary functions:\n * The encoding functions take 32bpp rgb + a, and\n * return the number of bytes copied to the destination.\n * The decoding functions copy to 32bpp rgb + a, and\n * return the number of bytes copied from the source.\n * These are only used in the encoder and un-RLE code and are therefore not\n * highly optimised.\n */\n\n/* encode 32bpp rgb + a into 16bpp rgb, losing alpha */\nstatic int\ncopy_opaque_16(void *dst, Uint32 * src, int n,\n               SDL_PixelFormat * sfmt, SDL_PixelFormat * dfmt)\n{\n    int i;\n    Uint16 *d = dst;\n    for (i = 0; i < n; i++) {\n        unsigned r, g, b;\n        RGB_FROM_PIXEL(*src, sfmt, r, g, b);\n        PIXEL_FROM_RGB(*d, dfmt, r, g, b);\n        src++;\n        d++;\n    }\n    return n * 2;\n}\n\n/* decode opaque pixels from 16bpp to 32bpp rgb + a */\nstatic int\nuncopy_opaque_16(Uint32 * dst, void *src, int n,\n                 RLEDestFormat * sfmt, SDL_PixelFormat * dfmt)\n{\n    int i;\n    Uint16 *s = src;\n    unsigned alpha = dfmt->Amask ? 255 : 0;\n    for (i = 0; i < n; i++) {\n        unsigned r, g, b;\n        RGB_FROM_PIXEL(*s, sfmt, r, g, b);\n        PIXEL_FROM_RGBA(*dst, dfmt, r, g, b, alpha);\n        s++;\n        dst++;\n    }\n    return n * 2;\n}\n\n\n\n/* encode 32bpp rgb + a into 32bpp G0RAB format for blitting into 565 */\nstatic int\ncopy_transl_565(void *dst, Uint32 * src, int n,\n                SDL_PixelFormat * sfmt, SDL_PixelFormat * dfmt)\n{\n    int i;\n    Uint32 *d = dst;\n    for (i = 0; i < n; i++) {\n        unsigned r, g, b, a;\n        Uint16 pix;\n        RGBA_FROM_8888(*src, sfmt, r, g, b, a);\n        PIXEL_FROM_RGB(pix, dfmt, r, g, b);\n        *d = ((pix & 0x7e0) << 16) | (pix & 0xf81f) | ((a << 2) & 0x7e0);\n        src++;\n        d++;\n    }\n    return n * 4;\n}\n\n/* encode 32bpp rgb + a into 32bpp G0RAB format for blitting into 555 */\nstatic int\ncopy_transl_555(void *dst, Uint32 * src, int n,\n                SDL_PixelFormat * sfmt, SDL_PixelFormat * dfmt)\n{\n    int i;\n    Uint32 *d = dst;\n    for (i = 0; i < n; i++) {\n        unsigned r, g, b, a;\n        Uint16 pix;\n        RGBA_FROM_8888(*src, sfmt, r, g, b, a);\n        PIXEL_FROM_RGB(pix, dfmt, r, g, b);\n        *d = ((pix & 0x3e0) << 16) | (pix & 0xfc1f) | ((a << 2) & 0x3e0);\n        src++;\n        d++;\n    }\n    return n * 4;\n}\n\n/* decode translucent pixels from 32bpp GORAB to 32bpp rgb + a */\nstatic int\nuncopy_transl_16(Uint32 * dst, void *src, int n,\n                 RLEDestFormat * sfmt, SDL_PixelFormat * dfmt)\n{\n    int i;\n    Uint32 *s = src;\n    for (i = 0; i < n; i++) {\n        unsigned r, g, b, a;\n        Uint32 pix = *s++;\n        a = (pix & 0x3e0) >> 2;\n        pix = (pix & ~0x3e0) | pix >> 16;\n        RGB_FROM_PIXEL(pix, sfmt, r, g, b);\n        PIXEL_FROM_RGBA(*dst, dfmt, r, g, b, a);\n        dst++;\n    }\n    return n * 4;\n}\n\n/* encode 32bpp rgba into 32bpp rgba, keeping alpha (dual purpose) */\nstatic int\ncopy_32(void *dst, Uint32 * src, int n,\n        SDL_PixelFormat * sfmt, SDL_PixelFormat * dfmt)\n{\n    int i;\n    Uint32 *d = dst;\n    for (i = 0; i < n; i++) {\n        unsigned r, g, b, a;\n        RGBA_FROM_8888(*src, sfmt, r, g, b, a);\n        RLEPIXEL_FROM_RGBA(*d, dfmt, r, g, b, a);\n        d++;\n        src++;\n    }\n    return n * 4;\n}\n\n/* decode 32bpp rgba into 32bpp rgba, keeping alpha (dual purpose) */\nstatic int\nuncopy_32(Uint32 * dst, void *src, int n,\n          RLEDestFormat * sfmt, SDL_PixelFormat * dfmt)\n{\n    int i;\n    Uint32 *s = src;\n    for (i = 0; i < n; i++) {\n        unsigned r, g, b, a;\n        Uint32 pixel = *s++;\n        RGB_FROM_PIXEL(pixel, sfmt, r, g, b);\n        a = pixel >> 24;\n        PIXEL_FROM_RGBA(*dst, dfmt, r, g, b, a);\n        dst++;\n    }\n    return n * 4;\n}\n\n#define ISOPAQUE(pixel, fmt) ((((pixel) & fmt->Amask) >> fmt->Ashift) == 255)\n\n#define ISTRANSL(pixel, fmt)    \\\n    ((unsigned)((((pixel) & fmt->Amask) >> fmt->Ashift) - 1U) < 254U)\n\n/* convert surface to be quickly alpha-blittable onto dest, if possible */\nstatic int\nRLEAlphaSurface(SDL_Surface * surface)\n{\n    SDL_Surface *dest;\n    SDL_PixelFormat *df;\n    int maxsize = 0;\n    int max_opaque_run;\n    int max_transl_run = 65535;\n    unsigned masksum;\n    Uint8 *rlebuf, *dst;\n    int (*copy_opaque) (void *, Uint32 *, int,\n                        SDL_PixelFormat *, SDL_PixelFormat *);\n    int (*copy_transl) (void *, Uint32 *, int,\n                        SDL_PixelFormat *, SDL_PixelFormat *);\n\n    dest = surface->map->dst;\n    if (!dest)\n        return -1;\n    df = dest->format;\n    if (surface->format->BitsPerPixel != 32)\n        return -1;              /* only 32bpp source supported */\n\n    /* find out whether the destination is one we support,\n       and determine the max size of the encoded result */\n    masksum = df->Rmask | df->Gmask | df->Bmask;\n    switch (df->BytesPerPixel) {\n    case 2:\n        /* 16bpp: only support 565 and 555 formats */\n        switch (masksum) {\n        case 0xffff:\n            if (df->Gmask == 0x07e0\n                || df->Rmask == 0x07e0 || df->Bmask == 0x07e0) {\n                copy_opaque = copy_opaque_16;\n                copy_transl = copy_transl_565;\n            } else\n                return -1;\n            break;\n        case 0x7fff:\n            if (df->Gmask == 0x03e0\n                || df->Rmask == 0x03e0 || df->Bmask == 0x03e0) {\n                copy_opaque = copy_opaque_16;\n                copy_transl = copy_transl_555;\n            } else\n                return -1;\n            break;\n        default:\n            return -1;\n        }\n        max_opaque_run = 255;   /* runs stored as bytes */\n\n        /* worst case is alternating opaque and translucent pixels,\n           with room for alignment padding between lines */\n        maxsize = surface->h * (2 + (4 + 2) * (surface->w + 1)) + 2;\n        break;\n    case 4:\n        if (masksum != 0x00ffffff)\n            return -1;          /* requires unused high byte */\n        copy_opaque = copy_32;\n        copy_transl = copy_32;\n        max_opaque_run = 255;   /* runs stored as short ints */\n\n        /* worst case is alternating opaque and translucent pixels */\n        maxsize = surface->h * 2 * 4 * (surface->w + 1) + 4;\n        break;\n    default:\n        return -1;              /* anything else unsupported right now */\n    }\n\n    maxsize += sizeof(RLEDestFormat);\n    rlebuf = (Uint8 *) SDL_malloc(maxsize);\n    if (!rlebuf) {\n        return SDL_OutOfMemory();\n    }\n    {\n        /* save the destination format so we can undo the encoding later */\n        RLEDestFormat *r = (RLEDestFormat *) rlebuf;\n        r->BytesPerPixel = df->BytesPerPixel;\n        r->Rmask = df->Rmask;\n        r->Gmask = df->Gmask;\n        r->Bmask = df->Bmask;\n        r->Amask = df->Amask;\n        r->Rloss = df->Rloss;\n        r->Gloss = df->Gloss;\n        r->Bloss = df->Bloss;\n        r->Aloss = df->Aloss;\n        r->Rshift = df->Rshift;\n        r->Gshift = df->Gshift;\n        r->Bshift = df->Bshift;\n        r->Ashift = df->Ashift;\n    }\n    dst = rlebuf + sizeof(RLEDestFormat);\n\n    /* Do the actual encoding */\n    {\n        int x, y;\n        int h = surface->h, w = surface->w;\n        SDL_PixelFormat *sf = surface->format;\n        Uint32 *src = (Uint32 *) surface->pixels;\n        Uint8 *lastline = dst;  /* end of last non-blank line */\n\n        /* opaque counts are 8 or 16 bits, depending on target depth */\n#define ADD_OPAQUE_COUNTS(n, m)         \\\n    if(df->BytesPerPixel == 4) {        \\\n        ((Uint16 *)dst)[0] = n;     \\\n        ((Uint16 *)dst)[1] = m;     \\\n        dst += 4;               \\\n    } else {                \\\n        dst[0] = n;             \\\n        dst[1] = m;             \\\n        dst += 2;               \\\n    }\n\n        /* translucent counts are always 16 bit */\n#define ADD_TRANSL_COUNTS(n, m)     \\\n    (((Uint16 *)dst)[0] = n, ((Uint16 *)dst)[1] = m, dst += 4)\n\n        for (y = 0; y < h; y++) {\n            int runstart, skipstart;\n            int blankline = 0;\n            /* First encode all opaque pixels of a scan line */\n            x = 0;\n            do {\n                int run, skip, len;\n                skipstart = x;\n                while (x < w && !ISOPAQUE(src[x], sf))\n                    x++;\n                runstart = x;\n                while (x < w && ISOPAQUE(src[x], sf))\n                    x++;\n                skip = runstart - skipstart;\n                if (skip == w)\n                    blankline = 1;\n                run = x - runstart;\n                while (skip > max_opaque_run) {\n                    ADD_OPAQUE_COUNTS(max_opaque_run, 0);\n                    skip -= max_opaque_run;\n                }\n                len = MIN(run, max_opaque_run);\n                ADD_OPAQUE_COUNTS(skip, len);\n                dst += copy_opaque(dst, src + runstart, len, sf, df);\n                runstart += len;\n                run -= len;\n                while (run) {\n                    len = MIN(run, max_opaque_run);\n                    ADD_OPAQUE_COUNTS(0, len);\n                    dst += copy_opaque(dst, src + runstart, len, sf, df);\n                    runstart += len;\n                    run -= len;\n                }\n            } while (x < w);\n\n            /* Make sure the next output address is 32-bit aligned */\n            dst += (uintptr_t) dst & 2;\n\n            /* Next, encode all translucent pixels of the same scan line */\n            x = 0;\n            do {\n                int run, skip, len;\n                skipstart = x;\n                while (x < w && !ISTRANSL(src[x], sf))\n                    x++;\n                runstart = x;\n                while (x < w && ISTRANSL(src[x], sf))\n                    x++;\n                skip = runstart - skipstart;\n                blankline &= (skip == w);\n                run = x - runstart;\n                while (skip > max_transl_run) {\n                    ADD_TRANSL_COUNTS(max_transl_run, 0);\n                    skip -= max_transl_run;\n                }\n                len = MIN(run, max_transl_run);\n                ADD_TRANSL_COUNTS(skip, len);\n                dst += copy_transl(dst, src + runstart, len, sf, df);\n                runstart += len;\n                run -= len;\n                while (run) {\n                    len = MIN(run, max_transl_run);\n                    ADD_TRANSL_COUNTS(0, len);\n                    dst += copy_transl(dst, src + runstart, len, sf, df);\n                    runstart += len;\n                    run -= len;\n                }\n                if (!blankline)\n                    lastline = dst;\n            } while (x < w);\n\n            src += surface->pitch >> 2;\n        }\n        dst = lastline;         /* back up past trailing blank lines */\n        ADD_OPAQUE_COUNTS(0, 0);\n    }\n\n#undef ADD_OPAQUE_COUNTS\n#undef ADD_TRANSL_COUNTS\n\n    /* Now that we have it encoded, release the original pixels */\n    if (!(surface->flags & SDL_PREALLOC)) {\n        SDL_free(surface->pixels);\n        surface->pixels = NULL;\n    }\n\n    /* realloc the buffer to release unused memory */\n    {\n        Uint8 *p = SDL_realloc(rlebuf, dst - rlebuf);\n        if (!p)\n            p = rlebuf;\n        surface->map->data = p;\n    }\n\n    return 0;\n}\n\nstatic Uint32\ngetpix_8(Uint8 * srcbuf)\n{\n    return *srcbuf;\n}\n\nstatic Uint32\ngetpix_16(Uint8 * srcbuf)\n{\n    return *(Uint16 *) srcbuf;\n}\n\nstatic Uint32\ngetpix_24(Uint8 * srcbuf)\n{\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n    return srcbuf[0] + (srcbuf[1] << 8) + (srcbuf[2] << 16);\n#else\n    return (srcbuf[0] << 16) + (srcbuf[1] << 8) + srcbuf[2];\n#endif\n}\n\nstatic Uint32\ngetpix_32(Uint8 * srcbuf)\n{\n    return *(Uint32 *) srcbuf;\n}\n\ntypedef Uint32(*getpix_func) (Uint8 *);\n\nstatic const getpix_func getpixes[4] = {\n    getpix_8, getpix_16, getpix_24, getpix_32\n};\n\nstatic int\nRLEColorkeySurface(SDL_Surface * surface)\n{\n    Uint8 *rlebuf, *dst;\n    int maxn;\n    int y;\n    Uint8 *srcbuf, *lastline;\n    int maxsize = 0;\n    int bpp = surface->format->BytesPerPixel;\n    getpix_func getpix;\n    Uint32 ckey, rgbmask;\n    int w, h;\n\n    /* calculate the worst case size for the compressed surface */\n    switch (bpp) {\n    case 1:\n        /* worst case is alternating opaque and transparent pixels,\n           starting with an opaque pixel */\n        maxsize = surface->h * 3 * (surface->w / 2 + 1) + 2;\n        break;\n    case 2:\n    case 3:\n        /* worst case is solid runs, at most 255 pixels wide */\n        maxsize = surface->h * (2 * (surface->w / 255 + 1)\n                                + surface->w * bpp) + 2;\n        break;\n    case 4:\n        /* worst case is solid runs, at most 65535 pixels wide */\n        maxsize = surface->h * (4 * (surface->w / 65535 + 1)\n                                + surface->w * 4) + 4;\n        break;\n    }\n\n    rlebuf = (Uint8 *) SDL_malloc(maxsize);\n    if (rlebuf == NULL) {\n        return SDL_OutOfMemory();\n    }\n\n    /* Set up the conversion */\n    srcbuf = (Uint8 *) surface->pixels;\n    maxn = bpp == 4 ? 65535 : 255;\n    dst = rlebuf;\n    rgbmask = ~surface->format->Amask;\n    ckey = surface->map->info.colorkey & rgbmask;\n    lastline = dst;\n    getpix = getpixes[bpp - 1];\n    w = surface->w;\n    h = surface->h;\n\n#define ADD_COUNTS(n, m)            \\\n    if(bpp == 4) {              \\\n        ((Uint16 *)dst)[0] = n;     \\\n        ((Uint16 *)dst)[1] = m;     \\\n        dst += 4;               \\\n    } else {                \\\n        dst[0] = n;             \\\n        dst[1] = m;             \\\n        dst += 2;               \\\n    }\n\n    for (y = 0; y < h; y++) {\n        int x = 0;\n        int blankline = 0;\n        do {\n            int run, skip, len;\n            int runstart;\n            int skipstart = x;\n\n            /* find run of transparent, then opaque pixels */\n            while (x < w && (getpix(srcbuf + x * bpp) & rgbmask) == ckey)\n                x++;\n            runstart = x;\n            while (x < w && (getpix(srcbuf + x * bpp) & rgbmask) != ckey)\n                x++;\n            skip = runstart - skipstart;\n            if (skip == w)\n                blankline = 1;\n            run = x - runstart;\n\n            /* encode segment */\n            while (skip > maxn) {\n                ADD_COUNTS(maxn, 0);\n                skip -= maxn;\n            }\n            len = MIN(run, maxn);\n            ADD_COUNTS(skip, len);\n            SDL_memcpy(dst, srcbuf + runstart * bpp, len * bpp);\n            dst += len * bpp;\n            run -= len;\n            runstart += len;\n            while (run) {\n                len = MIN(run, maxn);\n                ADD_COUNTS(0, len);\n                SDL_memcpy(dst, srcbuf + runstart * bpp, len * bpp);\n                dst += len * bpp;\n                runstart += len;\n                run -= len;\n            }\n            if (!blankline)\n                lastline = dst;\n        } while (x < w);\n\n        srcbuf += surface->pitch;\n    }\n    dst = lastline;             /* back up bast trailing blank lines */\n    ADD_COUNTS(0, 0);\n\n#undef ADD_COUNTS\n\n    /* Now that we have it encoded, release the original pixels */\n    if (!(surface->flags & SDL_PREALLOC)) {\n        SDL_free(surface->pixels);\n        surface->pixels = NULL;\n    }\n\n    /* realloc the buffer to release unused memory */\n    {\n        /* If realloc returns NULL, the original block is left intact */\n        Uint8 *p = SDL_realloc(rlebuf, dst - rlebuf);\n        if (!p)\n            p = rlebuf;\n        surface->map->data = p;\n    }\n\n    return (0);\n}\n\nint\nSDL_RLESurface(SDL_Surface * surface)\n{\n    int flags;\n\n    /* Clear any previous RLE conversion */\n    if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {\n        SDL_UnRLESurface(surface, 1);\n    }\n\n    /* We don't support RLE encoding of bitmaps */\n    if (surface->format->BitsPerPixel < 8) {\n        return -1;\n    }\n\n    /* Make sure the pixels are available */\n    if (!surface->pixels) {\n        return -1;\n    }\n\n    /* If we don't have colorkey or blending, nothing to do... */\n    flags = surface->map->info.flags;\n    if (!(flags & (SDL_COPY_COLORKEY | SDL_COPY_BLEND))) {\n        return -1;\n    }\n\n    /* Pass on combinations not supported */\n    if ((flags & SDL_COPY_MODULATE_COLOR) ||\n        ((flags & SDL_COPY_MODULATE_ALPHA) && surface->format->Amask) ||\n        (flags & (SDL_COPY_ADD | SDL_COPY_MOD)) ||\n        (flags & SDL_COPY_NEAREST)) {\n        return -1;\n    }\n\n    /* Encode and set up the blit */\n    if (!surface->format->Amask || !(flags & SDL_COPY_BLEND)) {\n        if (!surface->map->identity) {\n            return -1;\n        }\n        if (RLEColorkeySurface(surface) < 0) {\n            return -1;\n        }\n        surface->map->blit = SDL_RLEBlit;\n        surface->map->info.flags |= SDL_COPY_RLE_COLORKEY;\n    } else {\n        if (RLEAlphaSurface(surface) < 0) {\n            return -1;\n        }\n        surface->map->blit = SDL_RLEAlphaBlit;\n        surface->map->info.flags |= SDL_COPY_RLE_ALPHAKEY;\n    }\n\n    /* The surface is now accelerated */\n    surface->flags |= SDL_RLEACCEL;\n\n    return (0);\n}\n\n/*\n * Un-RLE a surface with pixel alpha\n * This may not give back exactly the image before RLE-encoding; all\n * completely transparent pixels will be lost, and color and alpha depth\n * may have been reduced (when encoding for 16bpp targets).\n */\nstatic SDL_bool\nUnRLEAlpha(SDL_Surface * surface)\n{\n    Uint8 *srcbuf;\n    Uint32 *dst;\n    SDL_PixelFormat *sf = surface->format;\n    RLEDestFormat *df = surface->map->data;\n    int (*uncopy_opaque) (Uint32 *, void *, int,\n                          RLEDestFormat *, SDL_PixelFormat *);\n    int (*uncopy_transl) (Uint32 *, void *, int,\n                          RLEDestFormat *, SDL_PixelFormat *);\n    int w = surface->w;\n    int bpp = df->BytesPerPixel;\n\n    if (bpp == 2) {\n        uncopy_opaque = uncopy_opaque_16;\n        uncopy_transl = uncopy_transl_16;\n    } else {\n        uncopy_opaque = uncopy_transl = uncopy_32;\n    }\n\n    surface->pixels = SDL_malloc(surface->h * surface->pitch);\n    if (!surface->pixels) {\n        return (SDL_FALSE);\n    }\n    /* fill background with transparent pixels */\n    SDL_memset(surface->pixels, 0, surface->h * surface->pitch);\n\n    dst = surface->pixels;\n    srcbuf = (Uint8 *) (df + 1);\n    for (;;) {\n        /* copy opaque pixels */\n        int ofs = 0;\n        do {\n            unsigned run;\n            if (bpp == 2) {\n                ofs += srcbuf[0];\n                run = srcbuf[1];\n                srcbuf += 2;\n            } else {\n                ofs += ((Uint16 *) srcbuf)[0];\n                run = ((Uint16 *) srcbuf)[1];\n                srcbuf += 4;\n            }\n            if (run) {\n                srcbuf += uncopy_opaque(dst + ofs, srcbuf, run, df, sf);\n                ofs += run;\n            } else if (!ofs)\n                return (SDL_TRUE);\n        } while (ofs < w);\n\n        /* skip padding if needed */\n        if (bpp == 2)\n            srcbuf += (uintptr_t) srcbuf & 2;\n\n        /* copy translucent pixels */\n        ofs = 0;\n        do {\n            unsigned run;\n            ofs += ((Uint16 *) srcbuf)[0];\n            run = ((Uint16 *) srcbuf)[1];\n            srcbuf += 4;\n            if (run) {\n                srcbuf += uncopy_transl(dst + ofs, srcbuf, run, df, sf);\n                ofs += run;\n            }\n        } while (ofs < w);\n        dst += surface->pitch >> 2;\n    }\n    /* Make the compiler happy */\n    return (SDL_TRUE);\n}\n\nvoid\nSDL_UnRLESurface(SDL_Surface * surface, int recode)\n{\n    if (surface->flags & SDL_RLEACCEL) {\n        surface->flags &= ~SDL_RLEACCEL;\n\n        if (recode && !(surface->flags & SDL_PREALLOC)) {\n            if (surface->map->info.flags & SDL_COPY_RLE_COLORKEY) {\n                SDL_Rect full;\n\n                /* re-create the original surface */\n                surface->pixels = SDL_malloc(surface->h * surface->pitch);\n                if (!surface->pixels) {\n                    /* Oh crap... */\n                    surface->flags |= SDL_RLEACCEL;\n                    return;\n                }\n\n                /* fill it with the background color */\n                SDL_FillRect(surface, NULL, surface->map->info.colorkey);\n\n                /* now render the encoded surface */\n                full.x = full.y = 0;\n                full.w = surface->w;\n                full.h = surface->h;\n                SDL_RLEBlit(surface, &full, surface, &full);\n            } else {\n                if (!UnRLEAlpha(surface)) {\n                    /* Oh crap... */\n                    surface->flags |= SDL_RLEACCEL;\n                    return;\n                }\n            }\n        }\n        surface->map->info.flags &=\n            ~(SDL_COPY_RLE_COLORKEY | SDL_COPY_RLE_ALPHAKEY);\n\n        SDL_free(surface->map->data);\n        surface->map->data = NULL;\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_RLEaccel_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Useful functions and variables from SDL_RLEaccel.c */\n\nextern int SDL_RLESurface(SDL_Surface * surface);\nextern int SDL_RLEBlit(SDL_Surface * src, SDL_Rect * srcrect,\n                       SDL_Surface * dst, SDL_Rect * dstrect);\nextern int SDL_RLEAlphaBlit(SDL_Surface * src, SDL_Rect * srcrect,\n                            SDL_Surface * dst, SDL_Rect * dstrect);\nextern void SDL_UnRLESurface(SDL_Surface * surface, int recode);\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n#include \"SDL_sysvideo.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_blit_auto.h\"\n#include \"SDL_blit_copy.h\"\n#include \"SDL_blit_slow.h\"\n#include \"SDL_RLEaccel_c.h\"\n#include \"SDL_pixels_c.h\"\n\n/* The general purpose software blit routine */\nstatic int\nSDL_SoftBlit(SDL_Surface * src, SDL_Rect * srcrect,\n             SDL_Surface * dst, SDL_Rect * dstrect)\n{\n    int okay;\n    int src_locked;\n    int dst_locked;\n\n    /* Everything is okay at the beginning...  */\n    okay = 1;\n\n    /* Lock the destination if it's in hardware */\n    dst_locked = 0;\n    if (SDL_MUSTLOCK(dst)) {\n        if (SDL_LockSurface(dst) < 0) {\n            okay = 0;\n        } else {\n            dst_locked = 1;\n        }\n    }\n    /* Lock the source if it's in hardware */\n    src_locked = 0;\n    if (SDL_MUSTLOCK(src)) {\n        if (SDL_LockSurface(src) < 0) {\n            okay = 0;\n        } else {\n            src_locked = 1;\n        }\n    }\n\n    /* Set up source and destination buffer pointers, and BLIT! */\n    if (okay && !SDL_RectEmpty(srcrect)) {\n        SDL_BlitFunc RunBlit;\n        SDL_BlitInfo *info = &src->map->info;\n\n        /* Set up the blit information */\n        info->src = (Uint8 *) src->pixels +\n            (Uint16) srcrect->y * src->pitch +\n            (Uint16) srcrect->x * info->src_fmt->BytesPerPixel;\n        info->src_w = srcrect->w;\n        info->src_h = srcrect->h;\n        info->src_pitch = src->pitch;\n        info->src_skip =\n            info->src_pitch - info->src_w * info->src_fmt->BytesPerPixel;\n        info->dst =\n            (Uint8 *) dst->pixels + (Uint16) dstrect->y * dst->pitch +\n            (Uint16) dstrect->x * info->dst_fmt->BytesPerPixel;\n        info->dst_w = dstrect->w;\n        info->dst_h = dstrect->h;\n        info->dst_pitch = dst->pitch;\n        info->dst_skip =\n            info->dst_pitch - info->dst_w * info->dst_fmt->BytesPerPixel;\n        RunBlit = (SDL_BlitFunc) src->map->data;\n\n        /* Run the actual software blit */\n        RunBlit(info);\n    }\n\n    /* We need to unlock the surfaces if they're locked */\n    if (dst_locked) {\n        SDL_UnlockSurface(dst);\n    }\n    if (src_locked) {\n        SDL_UnlockSurface(src);\n    }\n    /* Blit is done! */\n    return (okay ? 0 : -1);\n}\n\n#ifdef __MACOSX__\n#include <sys/sysctl.h>\n\nstatic SDL_bool\nSDL_UseAltivecPrefetch()\n{\n    const char key[] = \"hw.l3cachesize\";\n    u_int64_t result = 0;\n    size_t typeSize = sizeof(result);\n\n    if (sysctlbyname(key, &result, &typeSize, NULL, 0) == 0 && result > 0) {\n        return SDL_TRUE;\n    } else {\n        return SDL_FALSE;\n    }\n}\n#else\nstatic SDL_bool\nSDL_UseAltivecPrefetch()\n{\n    /* Just guess G4 */\n    return SDL_TRUE;\n}\n#endif /* __MACOSX__ */\n\nstatic SDL_BlitFunc\nSDL_ChooseBlitFunc(Uint32 src_format, Uint32 dst_format, int flags,\n                   SDL_BlitFuncEntry * entries)\n{\n    int i, flagcheck;\n    static Uint32 features = 0xffffffff;\n\n    /* Get the available CPU features */\n    if (features == 0xffffffff) {\n        const char *override = SDL_getenv(\"SDL_BLIT_CPU_FEATURES\");\n\n        features = SDL_CPU_ANY;\n\n        /* Allow an override for testing .. */\n        if (override) {\n            SDL_sscanf(override, \"%u\", &features);\n        } else {\n            if (SDL_HasMMX()) {\n                features |= SDL_CPU_MMX;\n            }\n            if (SDL_Has3DNow()) {\n                features |= SDL_CPU_3DNOW;\n            }\n            if (SDL_HasSSE()) {\n                features |= SDL_CPU_SSE;\n            }\n            if (SDL_HasSSE2()) {\n                features |= SDL_CPU_SSE2;\n            }\n            if (SDL_HasAltiVec()) {\n                if (SDL_UseAltivecPrefetch()) {\n                    features |= SDL_CPU_ALTIVEC_PREFETCH;\n                } else {\n                    features |= SDL_CPU_ALTIVEC_NOPREFETCH;\n                }\n            }\n        }\n    }\n\n    for (i = 0; entries[i].func; ++i) {\n        /* Check for matching pixel formats */\n        if (src_format != entries[i].src_format) {\n            continue;\n        }\n        if (dst_format != entries[i].dst_format) {\n            continue;\n        }\n\n        /* Check modulation flags */\n        flagcheck =\n            (flags & (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA));\n        if ((flagcheck & entries[i].flags) != flagcheck) {\n            continue;\n        }\n\n        /* Check blend flags */\n        flagcheck =\n            (flags &\n             (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD));\n        if ((flagcheck & entries[i].flags) != flagcheck) {\n            continue;\n        }\n\n        /* Check colorkey flag */\n        flagcheck = (flags & SDL_COPY_COLORKEY);\n        if ((flagcheck & entries[i].flags) != flagcheck) {\n            continue;\n        }\n\n        /* Check scaling flags */\n        flagcheck = (flags & SDL_COPY_NEAREST);\n        if ((flagcheck & entries[i].flags) != flagcheck) {\n            continue;\n        }\n\n        /* Check CPU features */\n        flagcheck = entries[i].cpu;\n        if ((flagcheck & features) != flagcheck) {\n            continue;\n        }\n\n        /* We found the best one! */\n        return entries[i].func;\n    }\n    return NULL;\n}\n\n/* Figure out which of many blit routines to set up on a surface */\nint\nSDL_CalculateBlit(SDL_Surface * surface)\n{\n    SDL_BlitFunc blit = NULL;\n    SDL_BlitMap *map = surface->map;\n    SDL_Surface *dst = map->dst;\n\n    /* Clean everything out to start */\n    if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {\n        SDL_UnRLESurface(surface, 1);\n    }\n    map->blit = SDL_SoftBlit;\n    map->info.src_fmt = surface->format;\n    map->info.src_pitch = surface->pitch;\n    map->info.dst_fmt = dst->format;\n    map->info.dst_pitch = dst->pitch;\n\n    /* See if we can do RLE acceleration */\n    if (map->info.flags & SDL_COPY_RLE_DESIRED) {\n        if (SDL_RLESurface(surface) == 0) {\n            return 0;\n        }\n    }\n\n    /* Choose a standard blit function */\n    if (map->identity && !(map->info.flags & ~SDL_COPY_RLE_DESIRED)) {\n        blit = SDL_BlitCopy;\n    } else if (surface->format->BitsPerPixel < 8 &&\n               SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {\n        blit = SDL_CalculateBlit0(surface);\n    } else if (surface->format->BytesPerPixel == 1 &&\n               SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {\n        blit = SDL_CalculateBlit1(surface);\n    } else if (map->info.flags & SDL_COPY_BLEND) {\n        blit = SDL_CalculateBlitA(surface);\n    } else {\n        blit = SDL_CalculateBlitN(surface);\n    }\n    if (blit == NULL) {\n        Uint32 src_format = surface->format->format;\n        Uint32 dst_format = dst->format->format;\n\n        blit =\n            SDL_ChooseBlitFunc(src_format, dst_format, map->info.flags,\n                               SDL_GeneratedBlitFuncTable);\n    }\n#ifndef TEST_SLOW_BLIT\n    if (blit == NULL)\n#endif\n    {\n        Uint32 src_format = surface->format->format;\n        Uint32 dst_format = dst->format->format;\n\n        if (!SDL_ISPIXELFORMAT_INDEXED(src_format) &&\n            !SDL_ISPIXELFORMAT_FOURCC(src_format) &&\n            !SDL_ISPIXELFORMAT_INDEXED(dst_format) &&\n            !SDL_ISPIXELFORMAT_FOURCC(dst_format)) {\n            blit = SDL_Blit_Slow;\n        }\n    }\n    map->data = blit;\n\n    /* Make sure we have a blit function */\n    if (blit == NULL) {\n        SDL_InvalidateMap(map);\n        return SDL_SetError(\"Blit combination not supported\");\n    }\n\n    return 0;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_blit_h\n#define _SDL_blit_h\n\n#include \"SDL_cpuinfo.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_surface.h\"\n\n/* Table to do pixel byte expansion */\nextern Uint8* SDL_expand_byte[9];\n\n/* SDL blit copy flags */\n#define SDL_COPY_MODULATE_COLOR     0x00000001\n#define SDL_COPY_MODULATE_ALPHA     0x00000002\n#define SDL_COPY_BLEND              0x00000010\n#define SDL_COPY_ADD                0x00000020\n#define SDL_COPY_MOD                0x00000040\n#define SDL_COPY_COLORKEY           0x00000100\n#define SDL_COPY_NEAREST            0x00000200\n#define SDL_COPY_RLE_DESIRED        0x00001000\n#define SDL_COPY_RLE_COLORKEY       0x00002000\n#define SDL_COPY_RLE_ALPHAKEY       0x00004000\n#define SDL_COPY_RLE_MASK           (SDL_COPY_RLE_DESIRED|SDL_COPY_RLE_COLORKEY|SDL_COPY_RLE_ALPHAKEY)\n\n/* SDL blit CPU flags */\n#define SDL_CPU_ANY                 0x00000000\n#define SDL_CPU_MMX                 0x00000001\n#define SDL_CPU_3DNOW               0x00000002\n#define SDL_CPU_SSE                 0x00000004\n#define SDL_CPU_SSE2                0x00000008\n#define SDL_CPU_ALTIVEC_PREFETCH    0x00000010\n#define SDL_CPU_ALTIVEC_NOPREFETCH  0x00000020\n\ntypedef struct\n{\n    Uint8 *src;\n    int src_w, src_h;\n    int src_pitch;\n    int src_skip;\n    Uint8 *dst;\n    int dst_w, dst_h;\n    int dst_pitch;\n    int dst_skip;\n    SDL_PixelFormat *src_fmt;\n    SDL_PixelFormat *dst_fmt;\n    Uint8 *table;\n    int flags;\n    Uint32 colorkey;\n    Uint8 r, g, b, a;\n} SDL_BlitInfo;\n\ntypedef void (SDLCALL * SDL_BlitFunc) (SDL_BlitInfo * info);\n\ntypedef struct\n{\n    Uint32 src_format;\n    Uint32 dst_format;\n    int flags;\n    int cpu;\n    SDL_BlitFunc func;\n} SDL_BlitFuncEntry;\n\n/* Blit mapping definition */\ntypedef struct SDL_BlitMap\n{\n    SDL_Surface *dst;\n    int identity;\n    SDL_blit blit;\n    void *data;\n    SDL_BlitInfo info;\n\n    /* the version count matches the destination; mismatch indicates\n       an invalid mapping */\n    Uint32 dst_palette_version;\n    Uint32 src_palette_version;\n} SDL_BlitMap;\n\n/* Functions found in SDL_blit.c */\nextern int SDL_CalculateBlit(SDL_Surface * surface);\n\n/* Functions found in SDL_blit_*.c */\nextern SDL_BlitFunc SDL_CalculateBlit0(SDL_Surface * surface);\nextern SDL_BlitFunc SDL_CalculateBlit1(SDL_Surface * surface);\nextern SDL_BlitFunc SDL_CalculateBlitN(SDL_Surface * surface);\nextern SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface * surface);\n\n/*\n * Useful macros for blitting routines\n */\n\n#if defined(__GNUC__)\n#define DECLARE_ALIGNED(t,v,a)  t __attribute__((aligned(a))) v\n#elif defined(_MSC_VER)\n#define DECLARE_ALIGNED(t,v,a)  __declspec(align(a)) t v\n#else\n#define DECLARE_ALIGNED(t,v,a)  t v\n#endif\n\n/* Load pixel of the specified format from a buffer and get its R-G-B values */\n#define RGB_FROM_PIXEL(Pixel, fmt, r, g, b)                             \\\n{                                                                       \\\n    r = SDL_expand_byte[fmt->Rloss][((Pixel&fmt->Rmask)>>fmt->Rshift)]; \\\n    g = SDL_expand_byte[fmt->Gloss][((Pixel&fmt->Gmask)>>fmt->Gshift)]; \\\n    b = SDL_expand_byte[fmt->Bloss][((Pixel&fmt->Bmask)>>fmt->Bshift)]; \\\n}\n#define RGB_FROM_RGB565(Pixel, r, g, b)                                 \\\n    {                                                                   \\\n    r = SDL_expand_byte[3][((Pixel&0xF800)>>11)];                       \\\n    g = SDL_expand_byte[2][((Pixel&0x07E0)>>5)];                        \\\n    b = SDL_expand_byte[3][(Pixel&0x001F)];                             \\\n}\n#define RGB_FROM_RGB555(Pixel, r, g, b)                                 \\\n{                                                                       \\\n    r = SDL_expand_byte[3][((Pixel&0x7C00)>>10)];                       \\\n    g = SDL_expand_byte[3][((Pixel&0x03E0)>>5)];                        \\\n    b = SDL_expand_byte[3][(Pixel&0x001F)];                             \\\n}\n#define RGB_FROM_RGB888(Pixel, r, g, b)                                 \\\n{                                                                       \\\n    r = ((Pixel&0xFF0000)>>16);                                         \\\n    g = ((Pixel&0xFF00)>>8);                                            \\\n    b = (Pixel&0xFF);                                                   \\\n}\n#define RETRIEVE_RGB_PIXEL(buf, bpp, Pixel)                             \\\ndo {                                                                    \\\n    switch (bpp) {                                                      \\\n        case 1:                                                         \\\n            Pixel = *((Uint8 *)(buf));                                  \\\n        break;                                                          \\\n                                                                        \\\n        case 2:                                                         \\\n            Pixel = *((Uint16 *)(buf));                                 \\\n        break;                                                          \\\n                                                                        \\\n        case 3: {                                                       \\\n            Uint8 *B = (Uint8 *)(buf);                                  \\\n            if (SDL_BYTEORDER == SDL_LIL_ENDIAN) {                      \\\n                Pixel = B[0] + (B[1] << 8) + (B[2] << 16);              \\\n            } else {                                                    \\\n                Pixel = (B[0] << 16) + (B[1] << 8) + B[2];              \\\n            }                                                           \\\n        }                                                               \\\n        break;                                                          \\\n                                                                        \\\n        case 4:                                                         \\\n            Pixel = *((Uint32 *)(buf));                                 \\\n        break;                                                          \\\n                                                                        \\\n        default:                                                        \\\n                Pixel = 0; /* stop gcc complaints */                    \\\n        break;                                                          \\\n    }                                                                   \\\n} while (0)\n\n#define DISEMBLE_RGB(buf, bpp, fmt, Pixel, r, g, b)                     \\\ndo {                                                                    \\\n    switch (bpp) {                                                      \\\n        case 1:                                                         \\\n            Pixel = *((Uint8 *)(buf));                                  \\\n            RGB_FROM_PIXEL(Pixel, fmt, r, g, b);                        \\\n        break;                                                          \\\n                                                                        \\\n        case 2:                                                         \\\n            Pixel = *((Uint16 *)(buf));                                 \\\n            RGB_FROM_PIXEL(Pixel, fmt, r, g, b);                        \\\n        break;                                                          \\\n                                                                        \\\n        case 3: {                                                       \\\n            Pixel = 0;                                                  \\\n            if (SDL_BYTEORDER == SDL_LIL_ENDIAN) {                      \\\n                r = *((buf)+fmt->Rshift/8);                             \\\n                g = *((buf)+fmt->Gshift/8);                             \\\n                b = *((buf)+fmt->Bshift/8);                             \\\n            } else {                                                    \\\n                r = *((buf)+2-fmt->Rshift/8);                           \\\n                g = *((buf)+2-fmt->Gshift/8);                           \\\n                b = *((buf)+2-fmt->Bshift/8);                           \\\n            }                                                           \\\n        }                                                               \\\n        break;                                                          \\\n                                                                        \\\n        case 4:                                                         \\\n            Pixel = *((Uint32 *)(buf));                                 \\\n            RGB_FROM_PIXEL(Pixel, fmt, r, g, b);                        \\\n        break;                                                          \\\n                                                                        \\\n        default:                                                        \\\n                /* stop gcc complaints */                               \\\n                Pixel = 0;                                              \\\n                r = g = b = 0;                                          \\\n        break;                                                          \\\n    }                                                                   \\\n} while (0)\n\n/* Assemble R-G-B values into a specified pixel format and store them */\n#define PIXEL_FROM_RGB(Pixel, fmt, r, g, b)                             \\\n{                                                                       \\\n    Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)|                             \\\n        ((g>>fmt->Gloss)<<fmt->Gshift)|                                 \\\n        ((b>>fmt->Bloss)<<fmt->Bshift)|                                 \\\n        fmt->Amask;                                                     \\\n}\n#define RGB565_FROM_RGB(Pixel, r, g, b)                                 \\\n{                                                                       \\\n    Pixel = ((r>>3)<<11)|((g>>2)<<5)|(b>>3);                            \\\n}\n#define RGB555_FROM_RGB(Pixel, r, g, b)                                 \\\n{                                                                       \\\n    Pixel = ((r>>3)<<10)|((g>>3)<<5)|(b>>3);                            \\\n}\n#define RGB888_FROM_RGB(Pixel, r, g, b)                                 \\\n{                                                                       \\\n    Pixel = (r<<16)|(g<<8)|b;                                           \\\n}\n#define ARGB8888_FROM_RGBA(Pixel, r, g, b, a)                           \\\n{                                                                       \\\n    Pixel = (a<<24)|(r<<16)|(g<<8)|b;                                   \\\n}\n#define RGBA8888_FROM_RGBA(Pixel, r, g, b, a)                           \\\n{                                                                       \\\n    Pixel = (r<<24)|(g<<16)|(b<<8)|a;                                   \\\n}\n#define ABGR8888_FROM_RGBA(Pixel, r, g, b, a)                           \\\n{                                                                       \\\n    Pixel = (a<<24)|(b<<16)|(g<<8)|r;                                   \\\n}\n#define BGRA8888_FROM_RGBA(Pixel, r, g, b, a)                           \\\n{                                                                       \\\n    Pixel = (b<<24)|(g<<16)|(r<<8)|a;                                   \\\n}\n#define ARGB2101010_FROM_RGBA(Pixel, r, g, b, a)                        \\\n{                                                                       \\\n    r = r ? ((r << 2) | 0x3) : 0;                                       \\\n    g = g ? ((g << 2) | 0x3) : 0;                                       \\\n    b = b ? ((b << 2) | 0x3) : 0;                                       \\\n    a = (a * 3) / 255;                                                  \\\n    Pixel = (a<<30)|(r<<20)|(g<<10)|b;                                  \\\n}\n#define ASSEMBLE_RGB(buf, bpp, fmt, r, g, b)                            \\\n{                                                                       \\\n    switch (bpp) {                                                      \\\n        case 1: {                                                       \\\n            Uint8 Pixel;                                                \\\n                                                                        \\\n            PIXEL_FROM_RGB(Pixel, fmt, r, g, b);                        \\\n            *((Uint8 *)(buf)) = Pixel;                                  \\\n        }                                                               \\\n        break;                                                          \\\n                                                                        \\\n        case 2: {                                                       \\\n            Uint16 Pixel;                                               \\\n                                                                        \\\n            PIXEL_FROM_RGB(Pixel, fmt, r, g, b);                        \\\n            *((Uint16 *)(buf)) = Pixel;                                 \\\n        }                                                               \\\n        break;                                                          \\\n                                                                        \\\n        case 3: {                                                       \\\n            if (SDL_BYTEORDER == SDL_LIL_ENDIAN) {                      \\\n                *((buf)+fmt->Rshift/8) = r;                             \\\n                *((buf)+fmt->Gshift/8) = g;                             \\\n                *((buf)+fmt->Bshift/8) = b;                             \\\n            } else {                                                    \\\n                *((buf)+2-fmt->Rshift/8) = r;                           \\\n                *((buf)+2-fmt->Gshift/8) = g;                           \\\n                *((buf)+2-fmt->Bshift/8) = b;                           \\\n            }                                                           \\\n        }                                                               \\\n        break;                                                          \\\n                                                                        \\\n        case 4: {                                                       \\\n            Uint32 Pixel;                                               \\\n                                                                        \\\n            PIXEL_FROM_RGB(Pixel, fmt, r, g, b);                        \\\n            *((Uint32 *)(buf)) = Pixel;                                 \\\n        }                                                               \\\n        break;                                                          \\\n    }                                                                   \\\n}\n\n/* FIXME: Should we rescale alpha into 0..255 here? */\n#define RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a)                         \\\n{                                                                       \\\n    r = SDL_expand_byte[fmt->Rloss][((Pixel&fmt->Rmask)>>fmt->Rshift)]; \\\n    g = SDL_expand_byte[fmt->Gloss][((Pixel&fmt->Gmask)>>fmt->Gshift)]; \\\n    b = SDL_expand_byte[fmt->Bloss][((Pixel&fmt->Bmask)>>fmt->Bshift)]; \\\n    a = SDL_expand_byte[fmt->Aloss][((Pixel&fmt->Amask)>>fmt->Ashift)]; \\\n}\n#define RGBA_FROM_8888(Pixel, fmt, r, g, b, a)                          \\\n{                                                                       \\\n    r = (Pixel&fmt->Rmask)>>fmt->Rshift;                                \\\n    g = (Pixel&fmt->Gmask)>>fmt->Gshift;                                \\\n    b = (Pixel&fmt->Bmask)>>fmt->Bshift;                                \\\n    a = (Pixel&fmt->Amask)>>fmt->Ashift;                                \\\n}\n#define RGBA_FROM_RGBA8888(Pixel, r, g, b, a)                           \\\n{                                                                       \\\n    r = (Pixel>>24);                                                    \\\n    g = ((Pixel>>16)&0xFF);                                             \\\n    b = ((Pixel>>8)&0xFF);                                              \\\n    a = (Pixel&0xFF);                                                   \\\n}\n#define RGBA_FROM_ARGB8888(Pixel, r, g, b, a)                           \\\n{                                                                       \\\n    r = ((Pixel>>16)&0xFF);                                             \\\n    g = ((Pixel>>8)&0xFF);                                              \\\n    b = (Pixel&0xFF);                                                   \\\n    a = (Pixel>>24);                                                    \\\n}\n#define RGBA_FROM_ABGR8888(Pixel, r, g, b, a)                           \\\n{                                                                       \\\n    r = (Pixel&0xFF);                                                   \\\n    g = ((Pixel>>8)&0xFF);                                              \\\n    b = ((Pixel>>16)&0xFF);                                             \\\n    a = (Pixel>>24);                                                    \\\n}\n#define RGBA_FROM_BGRA8888(Pixel, r, g, b, a)                           \\\n{                                                                       \\\n    r = ((Pixel>>8)&0xFF);                                              \\\n    g = ((Pixel>>16)&0xFF);                                             \\\n    b = (Pixel>>24);                                                    \\\n    a = (Pixel&0xFF);                                                   \\\n}\n#define RGBA_FROM_ARGB2101010(Pixel, r, g, b, a)                        \\\n{                                                                       \\\n    r = ((Pixel>>22)&0xFF);                                             \\\n    g = ((Pixel>>12)&0xFF);                                             \\\n    b = ((Pixel>>2)&0xFF);                                              \\\n    a = SDL_expand_byte[6][(Pixel>>30)];                                \\\n}\n#define DISEMBLE_RGBA(buf, bpp, fmt, Pixel, r, g, b, a)                 \\\ndo {                                                                    \\\n    switch (bpp) {                                                      \\\n        case 1:                                                         \\\n            Pixel = *((Uint8 *)(buf));                                  \\\n            RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a);                    \\\n        break;                                                          \\\n                                                                        \\\n        case 2:                                                         \\\n            Pixel = *((Uint16 *)(buf));                                 \\\n            RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a);                    \\\n        break;                                                          \\\n                                                                        \\\n        case 3: {                                                       \\\n            Pixel = 0;                                                  \\\n            if (SDL_BYTEORDER == SDL_LIL_ENDIAN) {                      \\\n                r = *((buf)+fmt->Rshift/8);                             \\\n                g = *((buf)+fmt->Gshift/8);                             \\\n                b = *((buf)+fmt->Bshift/8);                             \\\n            } else {                                                    \\\n                r = *((buf)+2-fmt->Rshift/8);                           \\\n                g = *((buf)+2-fmt->Gshift/8);                           \\\n                b = *((buf)+2-fmt->Bshift/8);                           \\\n            }                                                           \\\n            a = 0xFF;                                                   \\\n        }                                                               \\\n        break;                                                          \\\n                                                                        \\\n        case 4:                                                         \\\n            Pixel = *((Uint32 *)(buf));                                 \\\n            RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a);                    \\\n        break;                                                          \\\n                                                                        \\\n        default:                                                        \\\n            /* stop gcc complaints */                                   \\\n            Pixel = 0;                                                  \\\n            r = g = b = a = 0;                                          \\\n        break;                                                          \\\n    }                                                                   \\\n} while (0)\n\n/* FIXME: this isn't correct, especially for Alpha (maximum != 255) */\n#define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a)                         \\\n{                                                                       \\\n    Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)|                             \\\n        ((g>>fmt->Gloss)<<fmt->Gshift)|                                 \\\n        ((b>>fmt->Bloss)<<fmt->Bshift)|                                 \\\n        ((a>>fmt->Aloss)<<fmt->Ashift);                                 \\\n}\n#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a)                        \\\n{                                                                       \\\n    switch (bpp) {                                                      \\\n        case 1: {                                                       \\\n            Uint8 _pixel;                                               \\\n                                                                        \\\n            PIXEL_FROM_RGBA(_pixel, fmt, r, g, b, a);                   \\\n            *((Uint8 *)(buf)) = _pixel;                                 \\\n        }                                                               \\\n        break;                                                          \\\n                                                                        \\\n        case 2: {                                                       \\\n            Uint16 _pixel;                                              \\\n                                                                        \\\n            PIXEL_FROM_RGBA(_pixel, fmt, r, g, b, a);                   \\\n            *((Uint16 *)(buf)) = _pixel;                                \\\n        }                                                               \\\n        break;                                                          \\\n                                                                        \\\n        case 3: {                                                       \\\n            if (SDL_BYTEORDER == SDL_LIL_ENDIAN) {                      \\\n                *((buf)+fmt->Rshift/8) = r;                             \\\n                *((buf)+fmt->Gshift/8) = g;                             \\\n                *((buf)+fmt->Bshift/8) = b;                             \\\n            } else {                                                    \\\n                *((buf)+2-fmt->Rshift/8) = r;                           \\\n                *((buf)+2-fmt->Gshift/8) = g;                           \\\n                *((buf)+2-fmt->Bshift/8) = b;                           \\\n            }                                                           \\\n        }                                                               \\\n        break;                                                          \\\n                                                                        \\\n        case 4: {                                                       \\\n            Uint32 _pixel;                                              \\\n                                                                        \\\n            PIXEL_FROM_RGBA(_pixel, fmt, r, g, b, a);                   \\\n            *((Uint32 *)(buf)) = _pixel;                                \\\n        }                                                               \\\n        break;                                                          \\\n    }                                                                   \\\n}\n\n/* Blend the RGB values of two pixels with an alpha value */\n#define ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB)                      \\\ndo {                                                                    \\\n    dR = ((((unsigned)(sR-dR)*(unsigned)A)/255)+dR);                    \\\n    dG = ((((unsigned)(sG-dG)*(unsigned)A)/255)+dG);                    \\\n    dB = ((((unsigned)(sB-dB)*(unsigned)A)/255)+dB);                    \\\n} while(0)\n\n\n/* Blend the RGBA values of two pixels */\n#define ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA)                \\\ndo {                                                                    \\\n    dR = ((((unsigned)(sR-dR)*(unsigned)sA)/255)+dR);                   \\\n    dG = ((((unsigned)(sG-dG)*(unsigned)sA)/255)+dG);                   \\\n    dB = ((((unsigned)(sB-dB)*(unsigned)sA)/255)+dB);                   \\\n    dA = ((unsigned)sA+(unsigned)dA-((unsigned)sA*dA)/255);             \\\n} while(0)\n\n\n/* This is a very useful loop for optimizing blitters */\n#if defined(_MSC_VER) && (_MSC_VER == 1300)\n/* There's a bug in the Visual C++ 7 optimizer when compiling this code */\n#else\n#define USE_DUFFS_LOOP\n#endif\n#ifdef USE_DUFFS_LOOP\n\n/* 8-times unrolled loop */\n#define DUFFS_LOOP8(pixel_copy_increment, width)                        \\\n{ int n = (width+7)/8;                                                  \\\n    switch (width & 7) {                                                \\\n    case 0: do {    pixel_copy_increment;                               \\\n    case 7:     pixel_copy_increment;                                   \\\n    case 6:     pixel_copy_increment;                                   \\\n    case 5:     pixel_copy_increment;                                   \\\n    case 4:     pixel_copy_increment;                                   \\\n    case 3:     pixel_copy_increment;                                   \\\n    case 2:     pixel_copy_increment;                                   \\\n    case 1:     pixel_copy_increment;                                   \\\n        } while ( --n > 0 );                                            \\\n    }                                                                   \\\n}\n\n/* 4-times unrolled loop */\n#define DUFFS_LOOP4(pixel_copy_increment, width)                        \\\n{ int n = (width+3)/4;                                                  \\\n    switch (width & 3) {                                                \\\n    case 0: do {    pixel_copy_increment;                               \\\n    case 3:     pixel_copy_increment;                                   \\\n    case 2:     pixel_copy_increment;                                   \\\n    case 1:     pixel_copy_increment;                                   \\\n        } while (--n > 0);                                              \\\n    }                                                                   \\\n}\n\n/* Use the 8-times version of the loop by default */\n#define DUFFS_LOOP(pixel_copy_increment, width)                         \\\n    DUFFS_LOOP8(pixel_copy_increment, width)\n\n/* Special version of Duff's device for even more optimization */\n#define DUFFS_LOOP_124(pixel_copy_increment1,                           \\\n                       pixel_copy_increment2,                           \\\n                       pixel_copy_increment4, width)                    \\\n{ int n = width;                                                        \\\n    if (n & 1) {                                                        \\\n        pixel_copy_increment1; n -= 1;                                  \\\n    }                                                                   \\\n    if (n & 2) {                                                        \\\n        pixel_copy_increment2; n -= 2;                                  \\\n    }                                                                   \\\n    if (n & 4) {                                                        \\\n        pixel_copy_increment4; n -= 4;                                  \\\n    }                                                                   \\\n    if (n) {                                                            \\\n        n /= 8;                                                         \\\n        do {                                                            \\\n            pixel_copy_increment4;                                      \\\n            pixel_copy_increment4;                                      \\\n        } while (--n > 0);                                              \\\n    }                                                                   \\\n}\n\n#else\n\n/* Don't use Duff's device to unroll loops */\n#define DUFFS_LOOP(pixel_copy_increment, width)                         \\\n{ int n;                                                                \\\n    for ( n=width; n > 0; --n ) {                                       \\\n        pixel_copy_increment;                                           \\\n    }                                                                   \\\n}\n#define DUFFS_LOOP8(pixel_copy_increment, width)                        \\\n    DUFFS_LOOP(pixel_copy_increment, width)\n#define DUFFS_LOOP4(pixel_copy_increment, width)                        \\\n    DUFFS_LOOP(pixel_copy_increment, width)\n#define DUFFS_LOOP_124(pixel_copy_increment1,                           \\\n                       pixel_copy_increment2,                           \\\n                       pixel_copy_increment4, width)                    \\\n    DUFFS_LOOP(pixel_copy_increment1, width)\n\n#endif /* USE_DUFFS_LOOP */\n\n/* Prevent Visual C++ 6.0 from printing out stupid warnings */\n#if defined(_MSC_VER) && (_MSC_VER >= 600)\n#pragma warning(disable: 4550)\n#endif\n\n#endif /* _SDL_blit_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_0.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n#include \"SDL_blit.h\"\n\n/* Functions to blit from bitmaps to other surfaces */\n\nstatic void\nBlitBto1(SDL_BlitInfo * info)\n{\n    int c;\n    int width, height;\n    Uint8 *src, *map, *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = info->src;\n    srcskip = info->src_skip;\n    dst = info->dst;\n    dstskip = info->dst_skip;\n    map = info->table;\n    srcskip += width - (width + 7) / 8;\n\n    if (map) {\n        while (height--) {\n            Uint8 byte = 0, bit;\n            for (c = 0; c < width; ++c) {\n                if ((c & 7) == 0) {\n                    byte = *src++;\n                }\n                bit = (byte & 0x80) >> 7;\n                if (1) {\n                    *dst = map[bit];\n                }\n                dst++;\n                byte <<= 1;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        while (height--) {\n            Uint8 byte = 0, bit;\n            for (c = 0; c < width; ++c) {\n                if ((c & 7) == 0) {\n                    byte = *src++;\n                }\n                bit = (byte & 0x80) >> 7;\n                if (1) {\n                    *dst = bit;\n                }\n                dst++;\n                byte <<= 1;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n}\n\nstatic void\nBlitBto2(SDL_BlitInfo * info)\n{\n    int c;\n    int width, height;\n    Uint8 *src;\n    Uint16 *map, *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = info->src;\n    srcskip = info->src_skip;\n    dst = (Uint16 *) info->dst;\n    dstskip = info->dst_skip / 2;\n    map = (Uint16 *) info->table;\n    srcskip += width - (width + 7) / 8;\n\n    while (height--) {\n        Uint8 byte = 0, bit;\n        for (c = 0; c < width; ++c) {\n            if ((c & 7) == 0) {\n                byte = *src++;\n            }\n            bit = (byte & 0x80) >> 7;\n            if (1) {\n                *dst = map[bit];\n            }\n            byte <<= 1;\n            dst++;\n        }\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlitBto3(SDL_BlitInfo * info)\n{\n    int c, o;\n    int width, height;\n    Uint8 *src, *map, *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = info->src;\n    srcskip = info->src_skip;\n    dst = info->dst;\n    dstskip = info->dst_skip;\n    map = info->table;\n    srcskip += width - (width + 7) / 8;\n\n    while (height--) {\n        Uint8 byte = 0, bit;\n        for (c = 0; c < width; ++c) {\n            if ((c & 7) == 0) {\n                byte = *src++;\n            }\n            bit = (byte & 0x80) >> 7;\n            if (1) {\n                o = bit * 4;\n                dst[0] = map[o++];\n                dst[1] = map[o++];\n                dst[2] = map[o++];\n            }\n            byte <<= 1;\n            dst += 3;\n        }\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlitBto4(SDL_BlitInfo * info)\n{\n    int width, height;\n    Uint8 *src;\n    Uint32 *map, *dst;\n    int srcskip, dstskip;\n    int c;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = info->src;\n    srcskip = info->src_skip;\n    dst = (Uint32 *) info->dst;\n    dstskip = info->dst_skip / 4;\n    map = (Uint32 *) info->table;\n    srcskip += width - (width + 7) / 8;\n\n    while (height--) {\n        Uint8 byte = 0, bit;\n        for (c = 0; c < width; ++c) {\n            if ((c & 7) == 0) {\n                byte = *src++;\n            }\n            bit = (byte & 0x80) >> 7;\n            if (1) {\n                *dst = map[bit];\n            }\n            byte <<= 1;\n            dst++;\n        }\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlitBto1Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    Uint8 *dst = info->dst;\n    int srcskip = info->src_skip;\n    int dstskip = info->dst_skip;\n    Uint32 ckey = info->colorkey;\n    Uint8 *palmap = info->table;\n    int c;\n\n    /* Set up some basic variables */\n    srcskip += width - (width + 7) / 8;\n\n    if (palmap) {\n        while (height--) {\n            Uint8 byte = 0, bit;\n            for (c = 0; c < width; ++c) {\n                if ((c & 7) == 0) {\n                    byte = *src++;\n                }\n                bit = (byte & 0x80) >> 7;\n                if (bit != ckey) {\n                    *dst = palmap[bit];\n                }\n                dst++;\n                byte <<= 1;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        while (height--) {\n            Uint8 byte = 0, bit;\n            for (c = 0; c < width; ++c) {\n                if ((c & 7) == 0) {\n                    byte = *src++;\n                }\n                bit = (byte & 0x80) >> 7;\n                if (bit != ckey) {\n                    *dst = bit;\n                }\n                dst++;\n                byte <<= 1;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n}\n\nstatic void\nBlitBto2Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    Uint16 *dstp = (Uint16 *) info->dst;\n    int srcskip = info->src_skip;\n    int dstskip = info->dst_skip;\n    Uint32 ckey = info->colorkey;\n    Uint8 *palmap = info->table;\n    int c;\n\n    /* Set up some basic variables */\n    srcskip += width - (width + 7) / 8;\n    dstskip /= 2;\n\n    while (height--) {\n        Uint8 byte = 0, bit;\n        for (c = 0; c < width; ++c) {\n            if ((c & 7) == 0) {\n                byte = *src++;\n            }\n            bit = (byte & 0x80) >> 7;\n            if (bit != ckey) {\n                *dstp = ((Uint16 *) palmap)[bit];\n            }\n            byte <<= 1;\n            dstp++;\n        }\n        src += srcskip;\n        dstp += dstskip;\n    }\n}\n\nstatic void\nBlitBto3Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    Uint8 *dst = info->dst;\n    int srcskip = info->src_skip;\n    int dstskip = info->dst_skip;\n    Uint32 ckey = info->colorkey;\n    Uint8 *palmap = info->table;\n    int c;\n\n    /* Set up some basic variables */\n    srcskip += width - (width + 7) / 8;\n\n    while (height--) {\n        Uint8 byte = 0, bit;\n        for (c = 0; c < width; ++c) {\n            if ((c & 7) == 0) {\n                byte = *src++;\n            }\n            bit = (byte & 0x80) >> 7;\n            if (bit != ckey) {\n                SDL_memcpy(dst, &palmap[bit * 4], 3);\n            }\n            byte <<= 1;\n            dst += 3;\n        }\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlitBto4Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    Uint32 *dstp = (Uint32 *) info->dst;\n    int srcskip = info->src_skip;\n    int dstskip = info->dst_skip;\n    Uint32 ckey = info->colorkey;\n    Uint8 *palmap = info->table;\n    int c;\n\n    /* Set up some basic variables */\n    srcskip += width - (width + 7) / 8;\n    dstskip /= 4;\n\n    while (height--) {\n        Uint8 byte = 0, bit;\n        for (c = 0; c < width; ++c) {\n            if ((c & 7) == 0) {\n                byte = *src++;\n            }\n            bit = (byte & 0x80) >> 7;\n            if (bit != ckey) {\n                *dstp = ((Uint32 *) palmap)[bit];\n            }\n            byte <<= 1;\n            dstp++;\n        }\n        src += srcskip;\n        dstp += dstskip;\n    }\n}\n\nstatic void\nBlitBtoNAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    Uint8 *dst = info->dst;\n    int srcskip = info->src_skip;\n    int dstskip = info->dst_skip;\n    const SDL_Color *srcpal = info->src_fmt->palette->colors;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int dstbpp;\n    int c;\n    Uint32 pixel;\n    unsigned sR, sG, sB;\n    unsigned dR, dG, dB, dA;\n    const unsigned A = info->a;\n\n    /* Set up some basic variables */\n    dstbpp = dstfmt->BytesPerPixel;\n    srcskip += width - (width + 7) / 8;\n\n    while (height--) {\n        Uint8 byte = 0, bit;\n        for (c = 0; c < width; ++c) {\n            if ((c & 7) == 0) {\n                byte = *src++;\n            }\n            bit = (byte & 0x80) >> 7;\n            if (1) {\n                sR = srcpal[bit].r;\n                sG = srcpal[bit].g;\n                sB = srcpal[bit].b;\n                DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);\n                ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);\n                ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);\n            }\n            byte <<= 1;\n            dst += dstbpp;\n        }\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlitBtoNAlphaKey(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    Uint8 *dst = info->dst;\n    int srcskip = info->src_skip;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    const SDL_Color *srcpal = srcfmt->palette->colors;\n    int dstbpp;\n    int c;\n    Uint32 pixel;\n    unsigned sR, sG, sB;\n    unsigned dR, dG, dB, dA;\n    const unsigned A = info->a;\n    Uint32 ckey = info->colorkey;\n\n    /* Set up some basic variables */\n    dstbpp = dstfmt->BytesPerPixel;\n    srcskip += width - (width + 7) / 8;\n\n    while (height--) {\n        Uint8 byte = 0, bit;\n        for (c = 0; c < width; ++c) {\n            if ((c & 7) == 0) {\n                byte = *src++;\n            }\n            bit = (byte & 0x80) >> 7;\n            if (bit != ckey) {\n                sR = srcpal[bit].r;\n                sG = srcpal[bit].g;\n                sB = srcpal[bit].b;\n                DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);\n                ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);\n                ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);\n            }\n            byte <<= 1;\n            dst += dstbpp;\n        }\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic const SDL_BlitFunc bitmap_blit[] = {\n    (SDL_BlitFunc) NULL, BlitBto1, BlitBto2, BlitBto3, BlitBto4\n};\n\nstatic const SDL_BlitFunc colorkey_blit[] = {\n    (SDL_BlitFunc) NULL, BlitBto1Key, BlitBto2Key, BlitBto3Key, BlitBto4Key\n};\n\nSDL_BlitFunc\nSDL_CalculateBlit0(SDL_Surface * surface)\n{\n    int which;\n\n    if (surface->format->BitsPerPixel != 1) {\n        /* We don't support sub 8-bit packed pixel modes */\n        return (SDL_BlitFunc) NULL;\n    }\n    if (surface->map->dst->format->BitsPerPixel < 8) {\n        which = 0;\n    } else {\n        which = surface->map->dst->format->BytesPerPixel;\n    }\n    switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) {\n    case 0:\n        return bitmap_blit[which];\n\n    case SDL_COPY_COLORKEY:\n        return colorkey_blit[which];\n\n    case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:\n        return which >= 2 ? BlitBtoNAlpha : (SDL_BlitFunc) NULL;\n\n    case SDL_COPY_COLORKEY | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:\n        return which >= 2 ? BlitBtoNAlphaKey : (SDL_BlitFunc) NULL;\n    }\n    return (SDL_BlitFunc) NULL;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_1.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_sysvideo.h\"\n#include \"SDL_endian.h\"\n\n/* Functions to blit from 8-bit surfaces to other surfaces */\n\nstatic void\nBlit1to1(SDL_BlitInfo * info)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int width, height;\n    Uint8 *src, *map, *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = info->src;\n    srcskip = info->src_skip;\n    dst = info->dst;\n    dstskip = info->dst_skip;\n    map = info->table;\n\n    while (height--) {\n#ifdef USE_DUFFS_LOOP\n        /* *INDENT-OFF* */\n\t\tDUFFS_LOOP(\n\t\t\t{\n\t\t\t  *dst = map[*src];\n\t\t\t}\n\t\t\tdst++;\n\t\t\tsrc++;\n\t\t, width);\n        /* *INDENT-ON* */\n#else\n        for (c = width; c; --c) {\n            *dst = map[*src];\n            dst++;\n            src++;\n        }\n#endif\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n/* This is now endian dependent */\n#if ( SDL_BYTEORDER == SDL_LIL_ENDIAN )\n#define HI\t1\n#define LO\t0\n#else /* ( SDL_BYTEORDER == SDL_BIG_ENDIAN ) */\n#define HI\t0\n#define LO\t1\n#endif\nstatic void\nBlit1to2(SDL_BlitInfo * info)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int width, height;\n    Uint8 *src, *dst;\n    Uint16 *map;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = info->src;\n    srcskip = info->src_skip;\n    dst = info->dst;\n    dstskip = info->dst_skip;\n    map = (Uint16 *) info->table;\n\n#ifdef USE_DUFFS_LOOP\n    while (height--) {\n\t\t/* *INDENT-OFF* */\n\t\tDUFFS_LOOP(\n\t\t{\n\t\t\t*(Uint16 *)dst = map[*src++];\n\t\t\tdst += 2;\n\t\t},\n\t\twidth);\n\t\t/* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n#else\n    /* Memory align at 4-byte boundary, if necessary */\n    if ((long) dst & 0x03) {\n        /* Don't do anything if width is 0 */\n        if (width == 0) {\n            return;\n        }\n        --width;\n\n        while (height--) {\n            /* Perform copy alignment */\n            *(Uint16 *) dst = map[*src++];\n            dst += 2;\n\n            /* Copy in 4 pixel chunks */\n            for (c = width / 4; c; --c) {\n                *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);\n                src += 2;\n                dst += 4;\n                *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);\n                src += 2;\n                dst += 4;\n            }\n            /* Get any leftovers */\n            switch (width & 3) {\n            case 3:\n                *(Uint16 *) dst = map[*src++];\n                dst += 2;\n            case 2:\n                *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);\n                src += 2;\n                dst += 4;\n                break;\n            case 1:\n                *(Uint16 *) dst = map[*src++];\n                dst += 2;\n                break;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        while (height--) {\n            /* Copy in 4 pixel chunks */\n            for (c = width / 4; c; --c) {\n                *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);\n                src += 2;\n                dst += 4;\n                *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);\n                src += 2;\n                dst += 4;\n            }\n            /* Get any leftovers */\n            switch (width & 3) {\n            case 3:\n                *(Uint16 *) dst = map[*src++];\n                dst += 2;\n            case 2:\n                *(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);\n                src += 2;\n                dst += 4;\n                break;\n            case 1:\n                *(Uint16 *) dst = map[*src++];\n                dst += 2;\n                break;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n#endif /* USE_DUFFS_LOOP */\n}\n\nstatic void\nBlit1to3(SDL_BlitInfo * info)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int o;\n    int width, height;\n    Uint8 *src, *map, *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = info->src;\n    srcskip = info->src_skip;\n    dst = info->dst;\n    dstskip = info->dst_skip;\n    map = info->table;\n\n    while (height--) {\n#ifdef USE_DUFFS_LOOP\n\t\t/* *INDENT-OFF* */\n\t\tDUFFS_LOOP(\n\t\t\t{\n\t\t\t\to = *src * 4;\n\t\t\t\tdst[0] = map[o++];\n\t\t\t\tdst[1] = map[o++];\n\t\t\t\tdst[2] = map[o++];\n\t\t\t}\n\t\t\tsrc++;\n\t\t\tdst += 3;\n\t\t, width);\n\t\t/* *INDENT-ON* */\n#else\n        for (c = width; c; --c) {\n            o = *src * 4;\n            dst[0] = map[o++];\n            dst[1] = map[o++];\n            dst[2] = map[o++];\n            src++;\n            dst += 3;\n        }\n#endif /* USE_DUFFS_LOOP */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlit1to4(SDL_BlitInfo * info)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int width, height;\n    Uint8 *src;\n    Uint32 *map, *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = info->src;\n    srcskip = info->src_skip;\n    dst = (Uint32 *) info->dst;\n    dstskip = info->dst_skip / 4;\n    map = (Uint32 *) info->table;\n\n    while (height--) {\n#ifdef USE_DUFFS_LOOP\n\t\t/* *INDENT-OFF* */\n\t\tDUFFS_LOOP(\n\t\t\t*dst++ = map[*src++];\n\t\t, width);\n\t\t/* *INDENT-ON* */\n#else\n        for (c = width / 4; c; --c) {\n            *dst++ = map[*src++];\n            *dst++ = map[*src++];\n            *dst++ = map[*src++];\n            *dst++ = map[*src++];\n        }\n        switch (width & 3) {\n        case 3:\n            *dst++ = map[*src++];\n        case 2:\n            *dst++ = map[*src++];\n        case 1:\n            *dst++ = map[*src++];\n        }\n#endif /* USE_DUFFS_LOOP */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlit1to1Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    Uint8 *palmap = info->table;\n    Uint32 ckey = info->colorkey;\n\n    if (palmap) {\n        while (height--) {\n\t\t\t/* *INDENT-OFF* */\n\t\t\tDUFFS_LOOP(\n\t\t\t{\n\t\t\t\tif ( *src != ckey ) {\n\t\t\t\t  *dst = palmap[*src];\n\t\t\t\t}\n\t\t\t\tdst++;\n\t\t\t\tsrc++;\n\t\t\t},\n\t\t\twidth);\n\t\t\t/* *INDENT-ON* */\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        while (height--) {\n\t\t\t/* *INDENT-OFF* */\n\t\t\tDUFFS_LOOP(\n\t\t\t{\n\t\t\t\tif ( *src != ckey ) {\n\t\t\t\t  *dst = *src;\n\t\t\t\t}\n\t\t\t\tdst++;\n\t\t\t\tsrc++;\n\t\t\t},\n\t\t\twidth);\n\t\t\t/* *INDENT-ON* */\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n}\n\nstatic void\nBlit1to2Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint16 *dstp = (Uint16 *) info->dst;\n    int dstskip = info->dst_skip;\n    Uint16 *palmap = (Uint16 *) info->table;\n    Uint32 ckey = info->colorkey;\n\n    /* Set up some basic variables */\n    dstskip /= 2;\n\n    while (height--) {\n\t\t/* *INDENT-OFF* */\n\t\tDUFFS_LOOP(\n\t\t{\n\t\t\tif ( *src != ckey ) {\n\t\t\t\t*dstp=palmap[*src];\n\t\t\t}\n\t\t\tsrc++;\n\t\t\tdstp++;\n\t\t},\n\t\twidth);\n\t\t/* *INDENT-ON* */\n        src += srcskip;\n        dstp += dstskip;\n    }\n}\n\nstatic void\nBlit1to3Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    Uint8 *palmap = info->table;\n    Uint32 ckey = info->colorkey;\n    int o;\n\n    while (height--) {\n\t\t/* *INDENT-OFF* */\n\t\tDUFFS_LOOP(\n\t\t{\n\t\t\tif ( *src != ckey ) {\n\t\t\t\to = *src * 4;\n\t\t\t\tdst[0] = palmap[o++];\n\t\t\t\tdst[1] = palmap[o++];\n\t\t\t\tdst[2] = palmap[o++];\n\t\t\t}\n\t\t\tsrc++;\n\t\t\tdst += 3;\n\t\t},\n\t\twidth);\n\t\t/* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlit1to4Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint32 *dstp = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip;\n    Uint32 *palmap = (Uint32 *) info->table;\n    Uint32 ckey = info->colorkey;\n\n    /* Set up some basic variables */\n    dstskip /= 4;\n\n    while (height--) {\n\t\t/* *INDENT-OFF* */\n\t\tDUFFS_LOOP(\n\t\t{\n\t\t\tif ( *src != ckey ) {\n\t\t\t\t*dstp = palmap[*src];\n\t\t\t}\n\t\t\tsrc++;\n\t\t\tdstp++;\n\t\t},\n\t\twidth);\n\t\t/* *INDENT-ON* */\n        src += srcskip;\n        dstp += dstskip;\n    }\n}\n\nstatic void\nBlit1toNAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    const SDL_Color *srcpal = info->src_fmt->palette->colors;\n    int dstbpp;\n    Uint32 pixel;\n    unsigned sR, sG, sB;\n    unsigned dR, dG, dB, dA;\n    const unsigned A = info->a;\n\n    /* Set up some basic variables */\n    dstbpp = dstfmt->BytesPerPixel;\n\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP4(\n        {\n            sR = srcpal[*src].r;\n            sG = srcpal[*src].g;\n            sB = srcpal[*src].b;\n            DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);\n            ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);\n            ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);\n            src++;\n            dst += dstbpp;\n        },\n        width);\n        /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlit1toNAlphaKey(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    const SDL_Color *srcpal = info->src_fmt->palette->colors;\n    Uint32 ckey = info->colorkey;\n    int dstbpp;\n    Uint32 pixel;\n    unsigned sR, sG, sB;\n    unsigned dR, dG, dB, dA;\n    const unsigned A = info->a;\n\n    /* Set up some basic variables */\n    dstbpp = dstfmt->BytesPerPixel;\n\n    while (height--) {\n\t\t/* *INDENT-OFF* */\n\t\tDUFFS_LOOP(\n\t\t{\n\t\t\tif ( *src != ckey ) {\n\t\t\t\tsR = srcpal[*src].r;\n\t\t\t\tsG = srcpal[*src].g;\n\t\t\t\tsB = srcpal[*src].b;\n\t\t\t\tDISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);\n\t\t\t\tALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);\n\t\t\t  \tASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);\n\t\t\t}\n\t\t\tsrc++;\n\t\t\tdst += dstbpp;\n\t\t},\n\t\twidth);\n\t\t/* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic const SDL_BlitFunc one_blit[] = {\n    (SDL_BlitFunc) NULL, Blit1to1, Blit1to2, Blit1to3, Blit1to4\n};\n\nstatic const SDL_BlitFunc one_blitkey[] = {\n    (SDL_BlitFunc) NULL, Blit1to1Key, Blit1to2Key, Blit1to3Key, Blit1to4Key\n};\n\nSDL_BlitFunc\nSDL_CalculateBlit1(SDL_Surface * surface)\n{\n    int which;\n    SDL_PixelFormat *dstfmt;\n\n    dstfmt = surface->map->dst->format;\n    if (dstfmt->BitsPerPixel < 8) {\n        which = 0;\n    } else {\n        which = dstfmt->BytesPerPixel;\n    }\n    switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) {\n    case 0:\n        return one_blit[which];\n\n    case SDL_COPY_COLORKEY:\n        return one_blitkey[which];\n\n    case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:\n        /* Supporting 8bpp->8bpp alpha is doable but requires lots of\n           tables which consume space and takes time to precompute,\n           so is better left to the user */\n        return which >= 2 ? Blit1toNAlpha : (SDL_BlitFunc) NULL;\n\n    case SDL_COPY_COLORKEY | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:\n        return which >= 2 ? Blit1toNAlphaKey : (SDL_BlitFunc) NULL;\n    }\n    return (SDL_BlitFunc) NULL;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_A.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n#include \"SDL_blit.h\"\n\n/* Functions to perform alpha blended blitting */\n\n/* N->1 blending with per-surface alpha */\nstatic void\nBlitNto1SurfaceAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    Uint8 *palmap = info->table;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int srcbpp = srcfmt->BytesPerPixel;\n    Uint32 Pixel;\n    unsigned sR, sG, sB;\n    unsigned dR, dG, dB;\n    const unsigned A = info->a;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4(\n\t    {\n\t\tDISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);\n\t\tdR = dstfmt->palette->colors[*dst].r;\n\t\tdG = dstfmt->palette->colors[*dst].g;\n\t\tdB = dstfmt->palette->colors[*dst].b;\n\t\tALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB);\n\t\tdR &= 0xff;\n\t\tdG &= 0xff;\n\t\tdB &= 0xff;\n\t\t/* Pack RGB into 8bit pixel */\n\t\tif ( palmap == NULL ) {\n\t\t    *dst =((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0));\n\t\t} else {\n\t\t    *dst = palmap[((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0))];\n\t\t}\n\t\tdst++;\n\t\tsrc += srcbpp;\n\t    },\n\t    width);\n\t    /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n/* N->1 blending with pixel alpha */\nstatic void\nBlitNto1PixelAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    Uint8 *palmap = info->table;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int srcbpp = srcfmt->BytesPerPixel;\n    Uint32 Pixel;\n    unsigned sR, sG, sB, sA;\n    unsigned dR, dG, dB;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4(\n\t    {\n\t\tDISEMBLE_RGBA(src,srcbpp,srcfmt,Pixel,sR,sG,sB,sA);\n\t\tdR = dstfmt->palette->colors[*dst].r;\n\t\tdG = dstfmt->palette->colors[*dst].g;\n\t\tdB = dstfmt->palette->colors[*dst].b;\n\t\tALPHA_BLEND_RGB(sR, sG, sB, sA, dR, dG, dB);\n\t\tdR &= 0xff;\n\t\tdG &= 0xff;\n\t\tdB &= 0xff;\n\t\t/* Pack RGB into 8bit pixel */\n\t\tif ( palmap == NULL ) {\n\t\t    *dst =((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0));\n\t\t} else {\n\t\t    *dst = palmap[((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0))];\n\t\t}\n\t\tdst++;\n\t\tsrc += srcbpp;\n\t    },\n\t    width);\n\t    /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n/* colorkeyed N->1 blending with per-surface alpha */\nstatic void\nBlitNto1SurfaceAlphaKey(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    Uint8 *palmap = info->table;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int srcbpp = srcfmt->BytesPerPixel;\n    Uint32 ckey = info->colorkey;\n    Uint32 Pixel;\n    unsigned sR, sG, sB;\n    unsigned dR, dG, dB;\n    const unsigned A = info->a;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP(\n\t    {\n\t\tDISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);\n\t\tif ( Pixel != ckey ) {\n\t\t    dR = dstfmt->palette->colors[*dst].r;\n\t\t    dG = dstfmt->palette->colors[*dst].g;\n\t\t    dB = dstfmt->palette->colors[*dst].b;\n\t\t    ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB);\n\t\t    dR &= 0xff;\n\t\t    dG &= 0xff;\n\t\t    dB &= 0xff;\n\t\t    /* Pack RGB into 8bit pixel */\n\t\t    if ( palmap == NULL ) {\n                *dst =((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0));\n\t\t    } else {\n                *dst = palmap[((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0))];\n\t\t    }\n\t\t}\n\t\tdst++;\n\t\tsrc += srcbpp;\n\t    },\n\t    width);\n\t    /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n#ifdef __MMX__\n\n/* fast RGB888->(A)RGB888 blending with surface alpha=128 special case */\nstatic void\nBlitRGBtoRGBSurfaceAlpha128MMX(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint32 *srcp = (Uint32 *) info->src;\n    int srcskip = info->src_skip >> 2;\n    Uint32 *dstp = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip >> 2;\n    Uint32 dalpha = info->dst_fmt->Amask;\n\n    __m64 src1, src2, dst1, dst2, lmask, hmask, dsta;\n\n    hmask = _mm_set_pi32(0x00fefefe, 0x00fefefe);       /* alpha128 mask -> hmask */\n    lmask = _mm_set_pi32(0x00010101, 0x00010101);       /* !alpha128 mask -> lmask */\n    dsta = _mm_set_pi32(dalpha, dalpha);        /* dst alpha mask -> dsta */\n\n    while (height--) {\n        int n = width;\n        if (n & 1) {\n            Uint32 s = *srcp++;\n            Uint32 d = *dstp;\n            *dstp++ = ((((s & 0x00fefefe) + (d & 0x00fefefe)) >> 1)\n                       + (s & d & 0x00010101)) | dalpha;\n            n--;\n        }\n\n        for (n >>= 1; n > 0; --n) {\n            dst1 = *(__m64 *) dstp;     /* 2 x dst -> dst1(ARGBARGB) */\n            dst2 = dst1;        /* 2 x dst -> dst2(ARGBARGB) */\n\n            src1 = *(__m64 *) srcp;     /* 2 x src -> src1(ARGBARGB) */\n            src2 = src1;        /* 2 x src -> src2(ARGBARGB) */\n\n            dst2 = _mm_and_si64(dst2, hmask);   /* dst & mask -> dst2 */\n            src2 = _mm_and_si64(src2, hmask);   /* src & mask -> src2 */\n            src2 = _mm_add_pi32(src2, dst2);    /* dst2 + src2 -> src2 */\n            src2 = _mm_srli_pi32(src2, 1);      /* src2 >> 1 -> src2 */\n\n            dst1 = _mm_and_si64(dst1, src1);    /* src & dst -> dst1 */\n            dst1 = _mm_and_si64(dst1, lmask);   /* dst1 & !mask -> dst1 */\n            dst1 = _mm_add_pi32(dst1, src2);    /* src2 + dst1 -> dst1 */\n            dst1 = _mm_or_si64(dst1, dsta);     /* dsta(full alpha) | dst1 -> dst1 */\n\n            *(__m64 *) dstp = dst1;     /* dst1 -> 2 x dst pixels */\n            dstp += 2;\n            srcp += 2;\n        }\n\n        srcp += srcskip;\n        dstp += dstskip;\n    }\n    _mm_empty();\n}\n\n/* fast RGB888->(A)RGB888 blending with surface alpha */\nstatic void\nBlitRGBtoRGBSurfaceAlphaMMX(SDL_BlitInfo * info)\n{\n    SDL_PixelFormat *df = info->dst_fmt;\n    Uint32 chanmask;\n    unsigned alpha = info->a;\n\n    if (alpha == 128 && (df->Rmask | df->Gmask | df->Bmask) == 0x00FFFFFF) {\n        /* only call a128 version when R,G,B occupy lower bits */\n        BlitRGBtoRGBSurfaceAlpha128MMX(info);\n    } else {\n        int width = info->dst_w;\n        int height = info->dst_h;\n        Uint32 *srcp = (Uint32 *) info->src;\n        int srcskip = info->src_skip >> 2;\n        Uint32 *dstp = (Uint32 *) info->dst;\n        int dstskip = info->dst_skip >> 2;\n        Uint32 dalpha = df->Amask;\n        Uint32 amult;\n\n        __m64 src1, src2, dst1, dst2, mm_alpha, mm_zero, dsta;\n\n        mm_zero = _mm_setzero_si64();   /* 0 -> mm_zero */\n        /* form the alpha mult */\n        amult = alpha | (alpha << 8);\n        amult = amult | (amult << 16);\n        chanmask =\n            (0xff << df->Rshift) | (0xff << df->\n                                    Gshift) | (0xff << df->Bshift);\n        mm_alpha = _mm_set_pi32(0, amult & chanmask);   /* 0000AAAA -> mm_alpha, minus 1 chan */\n        mm_alpha = _mm_unpacklo_pi8(mm_alpha, mm_zero); /* 0A0A0A0A -> mm_alpha, minus 1 chan */\n        /* at this point mm_alpha can be 000A0A0A or 0A0A0A00 or another combo */\n        dsta = _mm_set_pi32(dalpha, dalpha);    /* dst alpha mask -> dsta */\n\n        while (height--) {\n            int n = width;\n            if (n & 1) {\n                /* One Pixel Blend */\n                src2 = _mm_cvtsi32_si64(*srcp); /* src(ARGB) -> src2 (0000ARGB) */\n                src2 = _mm_unpacklo_pi8(src2, mm_zero); /* 0A0R0G0B -> src2 */\n\n                dst1 = _mm_cvtsi32_si64(*dstp); /* dst(ARGB) -> dst1 (0000ARGB) */\n                dst1 = _mm_unpacklo_pi8(dst1, mm_zero); /* 0A0R0G0B -> dst1 */\n\n                src2 = _mm_sub_pi16(src2, dst1);        /* src2 - dst2 -> src2 */\n                src2 = _mm_mullo_pi16(src2, mm_alpha);  /* src2 * alpha -> src2 */\n                src2 = _mm_srli_pi16(src2, 8);  /* src2 >> 8 -> src2 */\n                dst1 = _mm_add_pi8(src2, dst1); /* src2 + dst1 -> dst1 */\n\n                dst1 = _mm_packs_pu16(dst1, mm_zero);   /* 0000ARGB -> dst1 */\n                dst1 = _mm_or_si64(dst1, dsta); /* dsta | dst1 -> dst1 */\n                *dstp = _mm_cvtsi64_si32(dst1); /* dst1 -> pixel */\n\n                ++srcp;\n                ++dstp;\n\n                n--;\n            }\n\n            for (n >>= 1; n > 0; --n) {\n                /* Two Pixels Blend */\n                src1 = *(__m64 *) srcp; /* 2 x src -> src1(ARGBARGB) */\n                src2 = src1;    /* 2 x src -> src2(ARGBARGB) */\n                src1 = _mm_unpacklo_pi8(src1, mm_zero); /* low - 0A0R0G0B -> src1 */\n                src2 = _mm_unpackhi_pi8(src2, mm_zero); /* high - 0A0R0G0B -> src2 */\n\n                dst1 = *(__m64 *) dstp; /* 2 x dst -> dst1(ARGBARGB) */\n                dst2 = dst1;    /* 2 x dst -> dst2(ARGBARGB) */\n                dst1 = _mm_unpacklo_pi8(dst1, mm_zero); /* low - 0A0R0G0B -> dst1 */\n                dst2 = _mm_unpackhi_pi8(dst2, mm_zero); /* high - 0A0R0G0B -> dst2 */\n\n                src1 = _mm_sub_pi16(src1, dst1);        /* src1 - dst1 -> src1 */\n                src1 = _mm_mullo_pi16(src1, mm_alpha);  /* src1 * alpha -> src1 */\n                src1 = _mm_srli_pi16(src1, 8);  /* src1 >> 8 -> src1 */\n                dst1 = _mm_add_pi8(src1, dst1); /* src1 + dst1(dst1) -> dst1 */\n\n                src2 = _mm_sub_pi16(src2, dst2);        /* src2 - dst2 -> src2 */\n                src2 = _mm_mullo_pi16(src2, mm_alpha);  /* src2 * alpha -> src2 */\n                src2 = _mm_srli_pi16(src2, 8);  /* src2 >> 8 -> src2 */\n                dst2 = _mm_add_pi8(src2, dst2); /* src2 + dst2(dst2) -> dst2 */\n\n                dst1 = _mm_packs_pu16(dst1, dst2);      /* 0A0R0G0B(res1), 0A0R0G0B(res2) -> dst1(ARGBARGB) */\n                dst1 = _mm_or_si64(dst1, dsta); /* dsta | dst1 -> dst1 */\n\n                *(__m64 *) dstp = dst1; /* dst1 -> 2 x pixel */\n\n                srcp += 2;\n                dstp += 2;\n            }\n            srcp += srcskip;\n            dstp += dstskip;\n        }\n        _mm_empty();\n    }\n}\n\n/* fast ARGB888->(A)RGB888 blending with pixel alpha */\nstatic void\nBlitRGBtoRGBPixelAlphaMMX(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint32 *srcp = (Uint32 *) info->src;\n    int srcskip = info->src_skip >> 2;\n    Uint32 *dstp = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip >> 2;\n    SDL_PixelFormat *sf = info->src_fmt;\n    Uint32 amask = sf->Amask;\n    Uint32 ashift = sf->Ashift;\n    Uint64 multmask, multmask2;\n\n    __m64 src1, dst1, mm_alpha, mm_zero, mm_alpha2;\n\n    mm_zero = _mm_setzero_si64();       /* 0 -> mm_zero */\n    multmask = 0x00FF;\n\tmultmask <<= (ashift * 2);\n\tmultmask2 = 0x00FF00FF00FF00FFULL;\n\n    while (height--) {\n\t\t/* *INDENT-OFF* */\n\t\tDUFFS_LOOP4({\n\t\tUint32 alpha = *srcp & amask;\n\t\tif (alpha == 0) {\n\t\t\t/* do nothing */\n\t\t} else if (alpha == amask) {\n\t\t\t*dstp = *srcp;\n\t\t} else {\n\t\t\tsrc1 = _mm_cvtsi32_si64(*srcp); /* src(ARGB) -> src1 (0000ARGB) */\n\t\t\tsrc1 = _mm_unpacklo_pi8(src1, mm_zero); /* 0A0R0G0B -> src1 */\n\n\t\t\tdst1 = _mm_cvtsi32_si64(*dstp); /* dst(ARGB) -> dst1 (0000ARGB) */\n\t\t\tdst1 = _mm_unpacklo_pi8(dst1, mm_zero); /* 0A0R0G0B -> dst1 */\n\n\t\t\tmm_alpha = _mm_cvtsi32_si64(alpha); /* alpha -> mm_alpha (0000000A) */\n\t\t\tmm_alpha = _mm_srli_si64(mm_alpha, ashift); /* mm_alpha >> ashift -> mm_alpha(0000000A) */\n\t\t\tmm_alpha = _mm_unpacklo_pi16(mm_alpha, mm_alpha); /* 00000A0A -> mm_alpha */\n\t\t\tmm_alpha2 = _mm_unpacklo_pi32(mm_alpha, mm_alpha); /* 0A0A0A0A -> mm_alpha2 */\n\t\t\tmm_alpha = _mm_or_si64(mm_alpha2, *(__m64 *) & multmask);\t/* 0F0A0A0A -> mm_alpha */\n\t\t\tmm_alpha2 = _mm_xor_si64(mm_alpha2, *(__m64 *) & multmask2);\t/* 255 - mm_alpha -> mm_alpha */\n\n\t\t\t/* blend */\t\t    \n\t\t\tsrc1 = _mm_mullo_pi16(src1, mm_alpha);\n\t\t\tsrc1 = _mm_srli_pi16(src1, 8);\n\t\t\tdst1 = _mm_mullo_pi16(dst1, mm_alpha2);\n\t\t\tdst1 = _mm_srli_pi16(dst1, 8);\n\t\t\tdst1 = _mm_add_pi16(src1, dst1);\n\t\t\tdst1 = _mm_packs_pu16(dst1, mm_zero);\n\t\t\t\n\t\t\t*dstp = _mm_cvtsi64_si32(dst1); /* dst1 -> pixel */\n\t\t}\n\t\t++srcp;\n\t\t++dstp;\n\t    }, width);\n\t\t/* *INDENT-ON* */\n        srcp += srcskip;\n        dstp += dstskip;\n    }\n    _mm_empty();\n}\n\n#endif /* __MMX__ */\n\n/* fast RGB888->(A)RGB888 blending with surface alpha=128 special case */\nstatic void\nBlitRGBtoRGBSurfaceAlpha128(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint32 *srcp = (Uint32 *) info->src;\n    int srcskip = info->src_skip >> 2;\n    Uint32 *dstp = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip >> 2;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4({\n\t\t    Uint32 s = *srcp++;\n\t\t    Uint32 d = *dstp;\n\t\t    *dstp++ = ((((s & 0x00fefefe) + (d & 0x00fefefe)) >> 1)\n\t\t\t       + (s & d & 0x00010101)) | 0xff000000;\n\t    }, width);\n\t    /* *INDENT-ON* */\n        srcp += srcskip;\n        dstp += dstskip;\n    }\n}\n\n/* fast RGB888->(A)RGB888 blending with surface alpha */\nstatic void\nBlitRGBtoRGBSurfaceAlpha(SDL_BlitInfo * info)\n{\n    unsigned alpha = info->a;\n    if (alpha == 128) {\n        BlitRGBtoRGBSurfaceAlpha128(info);\n    } else {\n        int width = info->dst_w;\n        int height = info->dst_h;\n        Uint32 *srcp = (Uint32 *) info->src;\n        int srcskip = info->src_skip >> 2;\n        Uint32 *dstp = (Uint32 *) info->dst;\n        int dstskip = info->dst_skip >> 2;\n        Uint32 s;\n        Uint32 d;\n        Uint32 s1;\n        Uint32 d1;\n\n        while (height--) {\n\t\t\t/* *INDENT-OFF* */\n\t\t\tDUFFS_LOOP4({\n\t\t\t\ts = *srcp;\n\t\t\t\td = *dstp;\n\t\t\t\ts1 = s & 0xff00ff;\n\t\t\t\td1 = d & 0xff00ff;\n\t\t\t\td1 = (d1 + ((s1 - d1) * alpha >> 8))\n\t\t\t\t     & 0xff00ff;\n\t\t\t\ts &= 0xff00;\n\t\t\t\td &= 0xff00;\n\t\t\t\td = (d + ((s - d) * alpha >> 8)) & 0xff00;\n\t\t\t\t*dstp = d1 | d | 0xff000000;\n\t\t\t\t++srcp;\n\t\t\t\t++dstp;\n\t\t\t}, width);\n\t\t\t/* *INDENT-ON* */\n            srcp += srcskip;\n            dstp += dstskip;\n        }\n    }\n}\n\n/* fast ARGB888->(A)RGB888 blending with pixel alpha */\nstatic void\nBlitRGBtoRGBPixelAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint32 *srcp = (Uint32 *) info->src;\n    int srcskip = info->src_skip >> 2;\n    Uint32 *dstp = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip >> 2;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4({\n\t\tUint32 dalpha;\n\t\tUint32 d;\n\t\tUint32 s1;\n\t\tUint32 d1;\n\t\tUint32 s = *srcp;\n\t\tUint32 alpha = s >> 24;\n\t\t/* FIXME: Here we special-case opaque alpha since the\n\t\t   compositioning used (>>8 instead of /255) doesn't handle\n\t\t   it correctly. Also special-case alpha=0 for speed?\n\t\t   Benchmark this! */\n\t\tif (alpha) {\n\t\t  if (alpha == SDL_ALPHA_OPAQUE) {\n\t\t\t  *dstp = *srcp;\n\t\t  } else {\n\t\t    /*\n\t\t     * take out the middle component (green), and process\n\t\t     * the other two in parallel. One multiply less.\n\t\t     */\n\t\t    d = *dstp;\n\t\t\tdalpha = d >> 24;\n\t\t    s1 = s & 0xff00ff;\n\t\t    d1 = d & 0xff00ff;\n\t\t    d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff;\n\t\t    s &= 0xff00;\n\t\t    d &= 0xff00;\n\t\t    d = (d + ((s - d) * alpha >> 8)) & 0xff00;\n\t\t\tdalpha = alpha + (dalpha * (alpha ^ 0xFF) >> 8);\n\t\t    *dstp = d1 | d | (dalpha << 24);\n\t\t  }\n\t\t}\n\t\t++srcp;\n\t\t++dstp;\n\t    }, width);\n\t    /* *INDENT-ON* */\n        srcp += srcskip;\n        dstp += dstskip;\n    }\n}\n\n#ifdef __3dNOW__\n/* fast (as in MMX with prefetch) ARGB888->(A)RGB888 blending with pixel alpha */\nstatic void\nBlitRGBtoRGBPixelAlphaMMX3DNOW(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint32 *srcp = (Uint32 *) info->src;\n    int srcskip = info->src_skip >> 2;\n    Uint32 *dstp = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip >> 2;\n    SDL_PixelFormat *sf = info->src_fmt;\n    Uint32 amask = sf->Amask;\n    Uint32 ashift = sf->Ashift;\n    Uint64 multmask, multmask2;\n\n    __m64 src1, dst1, mm_alpha, mm_zero, mm_alpha2;\n\n    mm_zero = _mm_setzero_si64();       /* 0 -> mm_zero */\n    multmask = 0x00FF;\n    multmask <<= (ashift * 2);\n    multmask2 = 0x00FF00FF00FF00FFULL;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4({\n\t\tUint32 alpha;\n\n\t\t_m_prefetch(srcp + 16);\n\t\t_m_prefetch(dstp + 16);\n\n\t\talpha = *srcp & amask;\n\t\tif (alpha == 0) {\n\t\t\t/* do nothing */\n\t\t} else if (alpha == amask) {\n\t\t\t*dstp = *srcp;\n\t\t} else {\n\t\t\tsrc1 = _mm_cvtsi32_si64(*srcp); /* src(ARGB) -> src1 (0000ARGB) */\n\t\t\tsrc1 = _mm_unpacklo_pi8(src1, mm_zero); /* 0A0R0G0B -> src1 */\n\n\t\t\tdst1 = _mm_cvtsi32_si64(*dstp); /* dst(ARGB) -> dst1 (0000ARGB) */\n\t\t\tdst1 = _mm_unpacklo_pi8(dst1, mm_zero); /* 0A0R0G0B -> dst1 */\n\n\t\t\tmm_alpha = _mm_cvtsi32_si64(alpha); /* alpha -> mm_alpha (0000000A) */\n\t\t\tmm_alpha = _mm_srli_si64(mm_alpha, ashift); /* mm_alpha >> ashift -> mm_alpha(0000000A) */\n\t\t\tmm_alpha = _mm_unpacklo_pi16(mm_alpha, mm_alpha); /* 00000A0A -> mm_alpha */\n\t\t\tmm_alpha2 = _mm_unpacklo_pi32(mm_alpha, mm_alpha); /* 0A0A0A0A -> mm_alpha2 */\n\t\t\tmm_alpha = _mm_or_si64(mm_alpha2, *(__m64 *) & multmask);\t/* 0F0A0A0A -> mm_alpha */\n\t\t\tmm_alpha2 = _mm_xor_si64(mm_alpha2, *(__m64 *) & multmask2);\t/* 255 - mm_alpha -> mm_alpha */\n\n\n\t\t\t/* blend */\t\t    \n\t\t\tsrc1 = _mm_mullo_pi16(src1, mm_alpha);\n\t\t\tsrc1 = _mm_srli_pi16(src1, 8);\n\t\t\tdst1 = _mm_mullo_pi16(dst1, mm_alpha2);\n\t\t\tdst1 = _mm_srli_pi16(dst1, 8);\n\t\t\tdst1 = _mm_add_pi16(src1, dst1);\n\t\t\tdst1 = _mm_packs_pu16(dst1, mm_zero);\n\t\t\t\n\t\t\t*dstp = _mm_cvtsi64_si32(dst1); /* dst1 -> pixel */\n\t\t}\n\t\t++srcp;\n\t\t++dstp;\n\t    }, width);\n\t    /* *INDENT-ON* */\n        srcp += srcskip;\n        dstp += dstskip;\n    }\n    _mm_empty();\n}\n\n#endif /* __3dNOW__ */\n\n/* 16bpp special case for per-surface alpha=50%: blend 2 pixels in parallel */\n\n/* blend a single 16 bit pixel at 50% */\n#define BLEND16_50(d, s, mask)\t\t\t\t\t\t\\\n\t((((s & mask) + (d & mask)) >> 1) + (s & d & (~mask & 0xffff)))\n\n/* blend two 16 bit pixels at 50% */\n#define BLEND2x16_50(d, s, mask)\t\t\t\t\t     \\\n\t(((s & (mask | mask << 16)) >> 1) + ((d & (mask | mask << 16)) >> 1) \\\n\t + (s & d & (~(mask | mask << 16))))\n\nstatic void\nBlit16to16SurfaceAlpha128(SDL_BlitInfo * info, Uint16 mask)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint16 *srcp = (Uint16 *) info->src;\n    int srcskip = info->src_skip >> 1;\n    Uint16 *dstp = (Uint16 *) info->dst;\n    int dstskip = info->dst_skip >> 1;\n\n    while (height--) {\n        if (((uintptr_t) srcp ^ (uintptr_t) dstp) & 2) {\n            /*\n             * Source and destination not aligned, pipeline it.\n             * This is mostly a win for big blits but no loss for\n             * small ones\n             */\n            Uint32 prev_sw;\n            int w = width;\n\n            /* handle odd destination */\n            if ((uintptr_t) dstp & 2) {\n                Uint16 d = *dstp, s = *srcp;\n                *dstp = BLEND16_50(d, s, mask);\n                dstp++;\n                srcp++;\n                w--;\n            }\n            srcp++;             /* srcp is now 32-bit aligned */\n\n            /* bootstrap pipeline with first halfword */\n            prev_sw = ((Uint32 *) srcp)[-1];\n\n            while (w > 1) {\n                Uint32 sw, dw, s;\n                sw = *(Uint32 *) srcp;\n                dw = *(Uint32 *) dstp;\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n                s = (prev_sw << 16) + (sw >> 16);\n#else\n                s = (prev_sw >> 16) + (sw << 16);\n#endif\n                prev_sw = sw;\n                *(Uint32 *) dstp = BLEND2x16_50(dw, s, mask);\n                dstp += 2;\n                srcp += 2;\n                w -= 2;\n            }\n\n            /* final pixel if any */\n            if (w) {\n                Uint16 d = *dstp, s;\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n                s = (Uint16) prev_sw;\n#else\n                s = (Uint16) (prev_sw >> 16);\n#endif\n                *dstp = BLEND16_50(d, s, mask);\n                srcp++;\n                dstp++;\n            }\n            srcp += srcskip - 1;\n            dstp += dstskip;\n        } else {\n            /* source and destination are aligned */\n            int w = width;\n\n            /* first odd pixel? */\n            if ((uintptr_t) srcp & 2) {\n                Uint16 d = *dstp, s = *srcp;\n                *dstp = BLEND16_50(d, s, mask);\n                srcp++;\n                dstp++;\n                w--;\n            }\n            /* srcp and dstp are now 32-bit aligned */\n\n            while (w > 1) {\n                Uint32 sw = *(Uint32 *) srcp;\n                Uint32 dw = *(Uint32 *) dstp;\n                *(Uint32 *) dstp = BLEND2x16_50(dw, sw, mask);\n                srcp += 2;\n                dstp += 2;\n                w -= 2;\n            }\n\n            /* last odd pixel? */\n            if (w) {\n                Uint16 d = *dstp, s = *srcp;\n                *dstp = BLEND16_50(d, s, mask);\n                srcp++;\n                dstp++;\n            }\n            srcp += srcskip;\n            dstp += dstskip;\n        }\n    }\n}\n\n#ifdef __MMX__\n\n/* fast RGB565->RGB565 blending with surface alpha */\nstatic void\nBlit565to565SurfaceAlphaMMX(SDL_BlitInfo * info)\n{\n    unsigned alpha = info->a;\n    if (alpha == 128) {\n        Blit16to16SurfaceAlpha128(info, 0xf7de);\n    } else {\n        int width = info->dst_w;\n        int height = info->dst_h;\n        Uint16 *srcp = (Uint16 *) info->src;\n        int srcskip = info->src_skip >> 1;\n        Uint16 *dstp = (Uint16 *) info->dst;\n        int dstskip = info->dst_skip >> 1;\n        Uint32 s, d;\n\n        __m64 src1, dst1, src2, dst2, gmask, bmask, mm_res, mm_alpha;\n\n        alpha &= ~(1 + 2 + 4);  /* cut alpha to get the exact same behaviour */\n        mm_alpha = _mm_set_pi32(0, alpha);      /* 0000000A -> mm_alpha */\n        alpha >>= 3;            /* downscale alpha to 5 bits */\n\n        mm_alpha = _mm_unpacklo_pi16(mm_alpha, mm_alpha);       /* 00000A0A -> mm_alpha */\n        mm_alpha = _mm_unpacklo_pi32(mm_alpha, mm_alpha);       /* 0A0A0A0A -> mm_alpha */\n        /* position alpha to allow for mullo and mulhi on diff channels\n           to reduce the number of operations */\n        mm_alpha = _mm_slli_si64(mm_alpha, 3);\n\n        /* Setup the 565 color channel masks */\n        gmask = _mm_set_pi32(0x07E007E0, 0x07E007E0);   /* MASKGREEN -> gmask */\n        bmask = _mm_set_pi32(0x001F001F, 0x001F001F);   /* MASKBLUE -> bmask */\n\n        while (height--) {\n\t\t\t/* *INDENT-OFF* */\n\t\t\tDUFFS_LOOP_124(\n\t\t\t{\n\t\t\t\ts = *srcp++;\n\t\t\t\td = *dstp;\n\t\t\t\t/*\n\t\t\t\t * shift out the middle component (green) to\n\t\t\t\t * the high 16 bits, and process all three RGB\n\t\t\t\t * components at the same time.\n\t\t\t\t */\n\t\t\t\ts = (s | s << 16) & 0x07e0f81f;\n\t\t\t\td = (d | d << 16) & 0x07e0f81f;\n\t\t\t\td += (s - d) * alpha >> 5;\n\t\t\t\td &= 0x07e0f81f;\n\t\t\t\t*dstp++ = (Uint16)(d | d >> 16);\n\t\t\t},{\n\t\t\t\ts = *srcp++;\n\t\t\t\td = *dstp;\n\t\t\t\t/*\n\t\t\t\t * shift out the middle component (green) to\n\t\t\t\t * the high 16 bits, and process all three RGB\n\t\t\t\t * components at the same time.\n\t\t\t\t */\n\t\t\t\ts = (s | s << 16) & 0x07e0f81f;\n\t\t\t\td = (d | d << 16) & 0x07e0f81f;\n\t\t\t\td += (s - d) * alpha >> 5;\n\t\t\t\td &= 0x07e0f81f;\n\t\t\t\t*dstp++ = (Uint16)(d | d >> 16);\n\t\t\t\ts = *srcp++;\n\t\t\t\td = *dstp;\n\t\t\t\t/*\n\t\t\t\t * shift out the middle component (green) to\n\t\t\t\t * the high 16 bits, and process all three RGB\n\t\t\t\t * components at the same time.\n\t\t\t\t */\n\t\t\t\ts = (s | s << 16) & 0x07e0f81f;\n\t\t\t\td = (d | d << 16) & 0x07e0f81f;\n\t\t\t\td += (s - d) * alpha >> 5;\n\t\t\t\td &= 0x07e0f81f;\n\t\t\t\t*dstp++ = (Uint16)(d | d >> 16);\n\t\t\t},{\n\t\t\t\tsrc1 = *(__m64*)srcp; /* 4 src pixels -> src1 */\n\t\t\t\tdst1 = *(__m64*)dstp; /* 4 dst pixels -> dst1 */\n\n\t\t\t\t/* red */\n\t\t\t\tsrc2 = src1;\n\t\t\t\tsrc2 = _mm_srli_pi16(src2, 11); /* src2 >> 11 -> src2 [000r 000r 000r 000r] */\n\n\t\t\t\tdst2 = dst1;\n\t\t\t\tdst2 = _mm_srli_pi16(dst2, 11); /* dst2 >> 11 -> dst2 [000r 000r 000r 000r] */\n\n\t\t\t\t/* blend */\n\t\t\t\tsrc2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */\n\t\t\t\tsrc2 = _mm_mullo_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */\n\t\t\t\tsrc2 = _mm_srli_pi16(src2, 11); /* src2 >> 11 -> src2 */\n\t\t\t\tdst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */\n\t\t\t\tdst2 = _mm_slli_pi16(dst2, 11); /* dst2 << 11 -> dst2 */\n\n\t\t\t\tmm_res = dst2; /* RED -> mm_res */\n\n\t\t\t\t/* green -- process the bits in place */\n\t\t\t\tsrc2 = src1;\n\t\t\t\tsrc2 = _mm_and_si64(src2, gmask); /* src & MASKGREEN -> src2 */\n\n\t\t\t\tdst2 = dst1;\n\t\t\t\tdst2 = _mm_and_si64(dst2, gmask); /* dst & MASKGREEN -> dst2 */\n\n\t\t\t\t/* blend */\n\t\t\t\tsrc2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */\n\t\t\t\tsrc2 = _mm_mulhi_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */\n\t\t\t\tsrc2 = _mm_slli_pi16(src2, 5); /* src2 << 5 -> src2 */\n\t\t\t\tdst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */\n\n\t\t\t\tmm_res = _mm_or_si64(mm_res, dst2); /* RED | GREEN -> mm_res */\n\n\t\t\t\t/* blue */\n\t\t\t\tsrc2 = src1;\n\t\t\t\tsrc2 = _mm_and_si64(src2, bmask); /* src & MASKBLUE -> src2[000b 000b 000b 000b] */\n\n\t\t\t\tdst2 = dst1;\n\t\t\t\tdst2 = _mm_and_si64(dst2, bmask); /* dst & MASKBLUE -> dst2[000b 000b 000b 000b] */\n\n\t\t\t\t/* blend */\n\t\t\t\tsrc2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */\n\t\t\t\tsrc2 = _mm_mullo_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */\n\t\t\t\tsrc2 = _mm_srli_pi16(src2, 11); /* src2 >> 11 -> src2 */\n\t\t\t\tdst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */\n\t\t\t\tdst2 = _mm_and_si64(dst2, bmask); /* dst2 & MASKBLUE -> dst2 */\n\n\t\t\t\tmm_res = _mm_or_si64(mm_res, dst2); /* RED | GREEN | BLUE -> mm_res */\n\n\t\t\t\t*(__m64*)dstp = mm_res; /* mm_res -> 4 dst pixels */\n\n\t\t\t\tsrcp += 4;\n\t\t\t\tdstp += 4;\n\t\t\t}, width);\n\t\t\t/* *INDENT-ON* */\n            srcp += srcskip;\n            dstp += dstskip;\n        }\n        _mm_empty();\n    }\n}\n\n/* fast RGB555->RGB555 blending with surface alpha */\nstatic void\nBlit555to555SurfaceAlphaMMX(SDL_BlitInfo * info)\n{\n    unsigned alpha = info->a;\n    if (alpha == 128) {\n        Blit16to16SurfaceAlpha128(info, 0xfbde);\n    } else {\n        int width = info->dst_w;\n        int height = info->dst_h;\n        Uint16 *srcp = (Uint16 *) info->src;\n        int srcskip = info->src_skip >> 1;\n        Uint16 *dstp = (Uint16 *) info->dst;\n        int dstskip = info->dst_skip >> 1;\n        Uint32 s, d;\n\n        __m64 src1, dst1, src2, dst2, rmask, gmask, bmask, mm_res, mm_alpha;\n\n        alpha &= ~(1 + 2 + 4);  /* cut alpha to get the exact same behaviour */\n        mm_alpha = _mm_set_pi32(0, alpha);      /* 0000000A -> mm_alpha */\n        alpha >>= 3;            /* downscale alpha to 5 bits */\n\n        mm_alpha = _mm_unpacklo_pi16(mm_alpha, mm_alpha);       /* 00000A0A -> mm_alpha */\n        mm_alpha = _mm_unpacklo_pi32(mm_alpha, mm_alpha);       /* 0A0A0A0A -> mm_alpha */\n        /* position alpha to allow for mullo and mulhi on diff channels\n           to reduce the number of operations */\n        mm_alpha = _mm_slli_si64(mm_alpha, 3);\n\n        /* Setup the 555 color channel masks */\n        rmask = _mm_set_pi32(0x7C007C00, 0x7C007C00);   /* MASKRED -> rmask */\n        gmask = _mm_set_pi32(0x03E003E0, 0x03E003E0);   /* MASKGREEN -> gmask */\n        bmask = _mm_set_pi32(0x001F001F, 0x001F001F);   /* MASKBLUE -> bmask */\n\n        while (height--) {\n\t\t\t/* *INDENT-OFF* */\n\t\t\tDUFFS_LOOP_124(\n\t\t\t{\n\t\t\t\ts = *srcp++;\n\t\t\t\td = *dstp;\n\t\t\t\t/*\n\t\t\t\t * shift out the middle component (green) to\n\t\t\t\t * the high 16 bits, and process all three RGB\n\t\t\t\t * components at the same time.\n\t\t\t\t */\n\t\t\t\ts = (s | s << 16) & 0x03e07c1f;\n\t\t\t\td = (d | d << 16) & 0x03e07c1f;\n\t\t\t\td += (s - d) * alpha >> 5;\n\t\t\t\td &= 0x03e07c1f;\n\t\t\t\t*dstp++ = (Uint16)(d | d >> 16);\n\t\t\t},{\n\t\t\t\ts = *srcp++;\n\t\t\t\td = *dstp;\n\t\t\t\t/*\n\t\t\t\t * shift out the middle component (green) to\n\t\t\t\t * the high 16 bits, and process all three RGB\n\t\t\t\t * components at the same time.\n\t\t\t\t */\n\t\t\t\ts = (s | s << 16) & 0x03e07c1f;\n\t\t\t\td = (d | d << 16) & 0x03e07c1f;\n\t\t\t\td += (s - d) * alpha >> 5;\n\t\t\t\td &= 0x03e07c1f;\n\t\t\t\t*dstp++ = (Uint16)(d | d >> 16);\n\t\t\t        s = *srcp++;\n\t\t\t\td = *dstp;\n\t\t\t\t/*\n\t\t\t\t * shift out the middle component (green) to\n\t\t\t\t * the high 16 bits, and process all three RGB\n\t\t\t\t * components at the same time.\n\t\t\t\t */\n\t\t\t\ts = (s | s << 16) & 0x03e07c1f;\n\t\t\t\td = (d | d << 16) & 0x03e07c1f;\n\t\t\t\td += (s - d) * alpha >> 5;\n\t\t\t\td &= 0x03e07c1f;\n\t\t\t\t*dstp++ = (Uint16)(d | d >> 16);\n\t\t\t},{\n\t\t\t\tsrc1 = *(__m64*)srcp; /* 4 src pixels -> src1 */\n\t\t\t\tdst1 = *(__m64*)dstp; /* 4 dst pixels -> dst1 */\n\n\t\t\t\t/* red -- process the bits in place */\n\t\t\t\tsrc2 = src1;\n\t\t\t\tsrc2 = _mm_and_si64(src2, rmask); /* src & MASKRED -> src2 */\n\n\t\t\t\tdst2 = dst1;\n\t\t\t\tdst2 = _mm_and_si64(dst2, rmask); /* dst & MASKRED -> dst2 */\n\n\t\t\t\t/* blend */\n\t\t\t\tsrc2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */\n\t\t\t\tsrc2 = _mm_mulhi_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */\n\t\t\t\tsrc2 = _mm_slli_pi16(src2, 5); /* src2 << 5 -> src2 */\n\t\t\t\tdst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */\n\t\t\t\tdst2 = _mm_and_si64(dst2, rmask); /* dst2 & MASKRED -> dst2 */\n\n\t\t\t\tmm_res = dst2; /* RED -> mm_res */\n\t\t\t\t\n\t\t\t\t/* green -- process the bits in place */\n\t\t\t\tsrc2 = src1;\n\t\t\t\tsrc2 = _mm_and_si64(src2, gmask); /* src & MASKGREEN -> src2 */\n\n\t\t\t\tdst2 = dst1;\n\t\t\t\tdst2 = _mm_and_si64(dst2, gmask); /* dst & MASKGREEN -> dst2 */\n\n\t\t\t\t/* blend */\n\t\t\t\tsrc2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */\n\t\t\t\tsrc2 = _mm_mulhi_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */\n\t\t\t\tsrc2 = _mm_slli_pi16(src2, 5); /* src2 << 5 -> src2 */\n\t\t\t\tdst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */\n\n\t\t\t\tmm_res = _mm_or_si64(mm_res, dst2); /* RED | GREEN -> mm_res */\n\n\t\t\t\t/* blue */\n\t\t\t\tsrc2 = src1; /* src -> src2 */\n\t\t\t\tsrc2 = _mm_and_si64(src2, bmask); /* src & MASKBLUE -> src2[000b 000b 000b 000b] */\n\n\t\t\t\tdst2 = dst1; /* dst -> dst2 */\n\t\t\t\tdst2 = _mm_and_si64(dst2, bmask); /* dst & MASKBLUE -> dst2[000b 000b 000b 000b] */\n\n\t\t\t\t/* blend */\n\t\t\t\tsrc2 = _mm_sub_pi16(src2, dst2);/* src - dst -> src2 */\n\t\t\t\tsrc2 = _mm_mullo_pi16(src2, mm_alpha); /* src2 * alpha -> src2 */\n\t\t\t\tsrc2 = _mm_srli_pi16(src2, 11); /* src2 >> 11 -> src2 */\n\t\t\t\tdst2 = _mm_add_pi16(src2, dst2); /* src2 + dst2 -> dst2 */\n\t\t\t\tdst2 = _mm_and_si64(dst2, bmask); /* dst2 & MASKBLUE -> dst2 */\n\n\t\t\t\tmm_res = _mm_or_si64(mm_res, dst2); /* RED | GREEN | BLUE -> mm_res */\n\n\t\t\t\t*(__m64*)dstp = mm_res; /* mm_res -> 4 dst pixels */\n\n\t\t\t\tsrcp += 4;\n\t\t\t\tdstp += 4;\n\t\t\t}, width);\n\t\t\t/* *INDENT-ON* */\n            srcp += srcskip;\n            dstp += dstskip;\n        }\n        _mm_empty();\n    }\n}\n\n#endif /* __MMX__ */\n\n/* fast RGB565->RGB565 blending with surface alpha */\nstatic void\nBlit565to565SurfaceAlpha(SDL_BlitInfo * info)\n{\n    unsigned alpha = info->a;\n    if (alpha == 128) {\n        Blit16to16SurfaceAlpha128(info, 0xf7de);\n    } else {\n        int width = info->dst_w;\n        int height = info->dst_h;\n        Uint16 *srcp = (Uint16 *) info->src;\n        int srcskip = info->src_skip >> 1;\n        Uint16 *dstp = (Uint16 *) info->dst;\n        int dstskip = info->dst_skip >> 1;\n        alpha >>= 3;            /* downscale alpha to 5 bits */\n\n        while (height--) {\n\t\t\t/* *INDENT-OFF* */\n\t\t\tDUFFS_LOOP4({\n\t\t\t\tUint32 s = *srcp++;\n\t\t\t\tUint32 d = *dstp;\n\t\t\t\t/*\n\t\t\t\t * shift out the middle component (green) to\n\t\t\t\t * the high 16 bits, and process all three RGB\n\t\t\t\t * components at the same time.\n\t\t\t\t */\n\t\t\t\ts = (s | s << 16) & 0x07e0f81f;\n\t\t\t\td = (d | d << 16) & 0x07e0f81f;\n\t\t\t\td += (s - d) * alpha >> 5;\n\t\t\t\td &= 0x07e0f81f;\n\t\t\t\t*dstp++ = (Uint16)(d | d >> 16);\n\t\t\t}, width);\n\t\t\t/* *INDENT-ON* */\n            srcp += srcskip;\n            dstp += dstskip;\n        }\n    }\n}\n\n/* fast RGB555->RGB555 blending with surface alpha */\nstatic void\nBlit555to555SurfaceAlpha(SDL_BlitInfo * info)\n{\n    unsigned alpha = info->a;   /* downscale alpha to 5 bits */\n    if (alpha == 128) {\n        Blit16to16SurfaceAlpha128(info, 0xfbde);\n    } else {\n        int width = info->dst_w;\n        int height = info->dst_h;\n        Uint16 *srcp = (Uint16 *) info->src;\n        int srcskip = info->src_skip >> 1;\n        Uint16 *dstp = (Uint16 *) info->dst;\n        int dstskip = info->dst_skip >> 1;\n        alpha >>= 3;            /* downscale alpha to 5 bits */\n\n        while (height--) {\n\t\t\t/* *INDENT-OFF* */\n\t\t\tDUFFS_LOOP4({\n\t\t\t\tUint32 s = *srcp++;\n\t\t\t\tUint32 d = *dstp;\n\t\t\t\t/*\n\t\t\t\t * shift out the middle component (green) to\n\t\t\t\t * the high 16 bits, and process all three RGB\n\t\t\t\t * components at the same time.\n\t\t\t\t */\n\t\t\t\ts = (s | s << 16) & 0x03e07c1f;\n\t\t\t\td = (d | d << 16) & 0x03e07c1f;\n\t\t\t\td += (s - d) * alpha >> 5;\n\t\t\t\td &= 0x03e07c1f;\n\t\t\t\t*dstp++ = (Uint16)(d | d >> 16);\n\t\t\t}, width);\n\t\t\t/* *INDENT-ON* */\n            srcp += srcskip;\n            dstp += dstskip;\n        }\n    }\n}\n\n/* fast ARGB8888->RGB565 blending with pixel alpha */\nstatic void\nBlitARGBto565PixelAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint32 *srcp = (Uint32 *) info->src;\n    int srcskip = info->src_skip >> 2;\n    Uint16 *dstp = (Uint16 *) info->dst;\n    int dstskip = info->dst_skip >> 1;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4({\n\t\tUint32 s = *srcp;\n\t\tunsigned alpha = s >> 27; /* downscale alpha to 5 bits */\n\t\t/* FIXME: Here we special-case opaque alpha since the\n\t\t   compositioning used (>>8 instead of /255) doesn't handle\n\t\t   it correctly. Also special-case alpha=0 for speed?\n\t\t   Benchmark this! */\n\t\tif(alpha) {   \n\t\t  if(alpha == (SDL_ALPHA_OPAQUE >> 3)) {\n\t\t    *dstp = (Uint16)((s >> 8 & 0xf800) + (s >> 5 & 0x7e0) + (s >> 3  & 0x1f));\n\t\t  } else {\n\t\t    Uint32 d = *dstp;\n\t\t    /*\n\t\t     * convert source and destination to G0RAB65565\n\t\t     * and blend all components at the same time\n\t\t     */\n\t\t    s = ((s & 0xfc00) << 11) + (s >> 8 & 0xf800)\n\t\t      + (s >> 3 & 0x1f);\n\t\t    d = (d | d << 16) & 0x07e0f81f;\n\t\t    d += (s - d) * alpha >> 5;\n\t\t    d &= 0x07e0f81f;\n\t\t    *dstp = (Uint16)(d | d >> 16);\n\t\t  }\n\t\t}\n\t\tsrcp++;\n\t\tdstp++;\n\t    }, width);\n\t    /* *INDENT-ON* */\n        srcp += srcskip;\n        dstp += dstskip;\n    }\n}\n\n/* fast ARGB8888->RGB555 blending with pixel alpha */\nstatic void\nBlitARGBto555PixelAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint32 *srcp = (Uint32 *) info->src;\n    int srcskip = info->src_skip >> 2;\n    Uint16 *dstp = (Uint16 *) info->dst;\n    int dstskip = info->dst_skip >> 1;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4({\n\t\tunsigned alpha;\n\t\tUint32 s = *srcp;\n\t\talpha = s >> 27; /* downscale alpha to 5 bits */\n\t\t/* FIXME: Here we special-case opaque alpha since the\n\t\t   compositioning used (>>8 instead of /255) doesn't handle\n\t\t   it correctly. Also special-case alpha=0 for speed?\n\t\t   Benchmark this! */\n\t\tif(alpha) {   \n\t\t  if(alpha == (SDL_ALPHA_OPAQUE >> 3)) {\n\t\t    *dstp = (Uint16)((s >> 9 & 0x7c00) + (s >> 6 & 0x3e0) + (s >> 3  & 0x1f));\n\t\t  } else {\n\t\t    Uint32 d = *dstp;\n\t\t    /*\n\t\t     * convert source and destination to G0RAB65565\n\t\t     * and blend all components at the same time\n\t\t     */\n\t\t    s = ((s & 0xf800) << 10) + (s >> 9 & 0x7c00)\n\t\t      + (s >> 3 & 0x1f);\n\t\t    d = (d | d << 16) & 0x03e07c1f;\n\t\t    d += (s - d) * alpha >> 5;\n\t\t    d &= 0x03e07c1f;\n\t\t    *dstp = (Uint16)(d | d >> 16);\n\t\t  }\n\t\t}\n\t\tsrcp++;\n\t\tdstp++;\n\t    }, width);\n\t    /* *INDENT-ON* */\n        srcp += srcskip;\n        dstp += dstskip;\n    }\n}\n\n/* General (slow) N->N blending with per-surface alpha */\nstatic void\nBlitNtoNSurfaceAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int srcbpp = srcfmt->BytesPerPixel;\n    int dstbpp = dstfmt->BytesPerPixel;\n    Uint32 Pixel;\n    unsigned sR, sG, sB;\n    unsigned dR, dG, dB, dA;\n    const unsigned sA = info->a;\n\n    if (sA) {\n        while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4(\n\t    {\n\t\tDISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);\n\t\tDISEMBLE_RGBA(dst, dstbpp, dstfmt, Pixel, dR, dG, dB, dA);\n\t\tALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA);\n\t\tASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);\n\t\tsrc += srcbpp;\n\t\tdst += dstbpp;\n\t    },\n\t    width);\n\t    /* *INDENT-ON* */\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n}\n\n/* General (slow) colorkeyed N->N blending with per-surface alpha */\nstatic void\nBlitNtoNSurfaceAlphaKey(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    Uint32 ckey = info->colorkey;\n    int srcbpp = srcfmt->BytesPerPixel;\n    int dstbpp = dstfmt->BytesPerPixel;\n    Uint32 Pixel;\n    unsigned sR, sG, sB;\n    unsigned dR, dG, dB, dA;\n    const unsigned sA = info->a;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4(\n\t    {\n\t\tRETRIEVE_RGB_PIXEL(src, srcbpp, Pixel);\n\t\tif(sA && Pixel != ckey) {\n\t\t    RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB);\n\t\t    DISEMBLE_RGBA(dst, dstbpp, dstfmt, Pixel, dR, dG, dB, dA);\n\t\t    ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA);\n\t\t    ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);\n\t\t}\n\t\tsrc += srcbpp;\n\t\tdst += dstbpp;\n\t    },\n\t    width);\n\t    /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n/* General (slow) N->N blending with pixel alpha */\nstatic void\nBlitNtoNPixelAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int srcbpp;\n    int dstbpp;\n    Uint32 Pixel;\n    unsigned sR, sG, sB, sA;\n    unsigned dR, dG, dB, dA;\n\n    /* Set up some basic variables */\n    srcbpp = srcfmt->BytesPerPixel;\n    dstbpp = dstfmt->BytesPerPixel;\n\n    while (height--) {\n\t    /* *INDENT-OFF* */\n\t    DUFFS_LOOP4(\n\t    {\n\t\tDISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA);\n\t\tif(sA) {\n\t\t    DISEMBLE_RGBA(dst, dstbpp, dstfmt, Pixel, dR, dG, dB, dA);\n\t\t    ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA);\n\t\t    ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);\n\t\t}\n\t\tsrc += srcbpp;\n\t\tdst += dstbpp;\n\t    },\n\t    width);\n\t    /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n\nSDL_BlitFunc\nSDL_CalculateBlitA(SDL_Surface * surface)\n{\n    SDL_PixelFormat *sf = surface->format;\n    SDL_PixelFormat *df = surface->map->dst->format;\n\n    switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) {\n    case SDL_COPY_BLEND:\n        /* Per-pixel alpha blits */\n        switch (df->BytesPerPixel) {\n        case 1:\n            return BlitNto1PixelAlpha;\n\n        case 2:\n                if (sf->BytesPerPixel == 4 && sf->Amask == 0xff000000\n                    && sf->Gmask == 0xff00\n                    && ((sf->Rmask == 0xff && df->Rmask == 0x1f)\n                        || (sf->Bmask == 0xff && df->Bmask == 0x1f))) {\n                if (df->Gmask == 0x7e0)\n                    return BlitARGBto565PixelAlpha;\n                else if (df->Gmask == 0x3e0)\n                    return BlitARGBto555PixelAlpha;\n            }\n            return BlitNtoNPixelAlpha;\n\n        case 4:\n            if (sf->Rmask == df->Rmask\n                && sf->Gmask == df->Gmask\n                && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) {\n#if defined(__MMX__) || defined(__3dNOW__)\n                if (sf->Rshift % 8 == 0\n                    && sf->Gshift % 8 == 0\n                    && sf->Bshift % 8 == 0\n                    && sf->Ashift % 8 == 0 && sf->Aloss == 0) {\n#ifdef __3dNOW__\n                    if (SDL_Has3DNow())\n                        return BlitRGBtoRGBPixelAlphaMMX3DNOW;\n#endif\n#ifdef __MMX__\n                    if (SDL_HasMMX())\n                        return BlitRGBtoRGBPixelAlphaMMX;\n#endif\n                }\n#endif /* __MMX__ || __3dNOW__ */\n                if (sf->Amask == 0xff000000) {\n                    return BlitRGBtoRGBPixelAlpha;\n                }\n            }\n            return BlitNtoNPixelAlpha;\n\n        case 3:\n        default:\n            return BlitNtoNPixelAlpha;\n        }\n        break;\n\n    case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:\n        if (sf->Amask == 0) {\n            /* Per-surface alpha blits */\n            switch (df->BytesPerPixel) {\n            case 1:\n                return BlitNto1SurfaceAlpha;\n\n            case 2:\n                if (surface->map->identity) {\n                    if (df->Gmask == 0x7e0) {\n#ifdef __MMX__\n                        if (SDL_HasMMX())\n                            return Blit565to565SurfaceAlphaMMX;\n                        else\n#endif\n                            return Blit565to565SurfaceAlpha;\n                    } else if (df->Gmask == 0x3e0) {\n#ifdef __MMX__\n                        if (SDL_HasMMX())\n                            return Blit555to555SurfaceAlphaMMX;\n                        else\n#endif\n                            return Blit555to555SurfaceAlpha;\n                    }\n                }\n                return BlitNtoNSurfaceAlpha;\n\n            case 4:\n                if (sf->Rmask == df->Rmask\n                    && sf->Gmask == df->Gmask\n                    && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) {\n#ifdef __MMX__\n                    if (sf->Rshift % 8 == 0\n                        && sf->Gshift % 8 == 0\n                        && sf->Bshift % 8 == 0 && SDL_HasMMX())\n                        return BlitRGBtoRGBSurfaceAlphaMMX;\n#endif\n                    if ((sf->Rmask | sf->Gmask | sf->Bmask) == 0xffffff) {\n                        return BlitRGBtoRGBSurfaceAlpha;\n                    }\n                }\n                return BlitNtoNSurfaceAlpha;\n\n            case 3:\n            default:\n                return BlitNtoNSurfaceAlpha;\n            }\n        }\n        break;\n\n    case SDL_COPY_COLORKEY | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:\n        if (sf->Amask == 0) {\n            if (df->BytesPerPixel == 1) {\n                return BlitNto1SurfaceAlphaKey;\n            } else {\n                return BlitNtoNSurfaceAlphaKey;\n            }\n        }\n        break;\n    }\n\n    return NULL;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_N.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_cpuinfo.h\"\n#include \"SDL_blit.h\"\n\n#include \"SDL_assert.h\"\n\n/* Functions to blit from N-bit surfaces to other surfaces */\n\n#if SDL_ALTIVEC_BLITTERS\n#ifdef HAVE_ALTIVEC_H\n#include <altivec.h>\n#endif\n#ifdef __MACOSX__\n#include <sys/sysctl.h>\nstatic size_t\nGetL3CacheSize(void)\n{\n    const char key[] = \"hw.l3cachesize\";\n    u_int64_t result = 0;\n    size_t typeSize = sizeof(result);\n\n\n    int err = sysctlbyname(key, &result, &typeSize, NULL, 0);\n    if (0 != err)\n        return 0;\n\n    return result;\n}\n#else\nstatic size_t\nGetL3CacheSize(void)\n{\n    /* XXX: Just guess G4 */\n    return 2097152;\n}\n#endif /* __MACOSX__ */\n\n#if (defined(__MACOSX__) && (__GNUC__ < 4))\n#define VECUINT8_LITERAL(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \\\n        (vector unsigned char) ( a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p )\n#define VECUINT16_LITERAL(a,b,c,d,e,f,g,h) \\\n        (vector unsigned short) ( a,b,c,d,e,f,g,h )\n#else\n#define VECUINT8_LITERAL(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \\\n        (vector unsigned char) { a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p }\n#define VECUINT16_LITERAL(a,b,c,d,e,f,g,h) \\\n        (vector unsigned short) { a,b,c,d,e,f,g,h }\n#endif\n\n#define UNALIGNED_PTR(x) (((size_t) x) & 0x0000000F)\n#define VSWIZZLE32(a,b,c,d) (vector unsigned char) \\\n                               ( 0x00+a, 0x00+b, 0x00+c, 0x00+d, \\\n                                 0x04+a, 0x04+b, 0x04+c, 0x04+d, \\\n                                 0x08+a, 0x08+b, 0x08+c, 0x08+d, \\\n                                 0x0C+a, 0x0C+b, 0x0C+c, 0x0C+d )\n\n#define MAKE8888(dstfmt, r, g, b, a)  \\\n    ( ((r<<dstfmt->Rshift)&dstfmt->Rmask) | \\\n      ((g<<dstfmt->Gshift)&dstfmt->Gmask) | \\\n      ((b<<dstfmt->Bshift)&dstfmt->Bmask) | \\\n      ((a<<dstfmt->Ashift)&dstfmt->Amask) )\n\n/*\n * Data Stream Touch...Altivec cache prefetching.\n *\n *  Don't use this on a G5...however, the speed boost is very significant\n *   on a G4.\n */\n#define DST_CHAN_SRC 1\n#define DST_CHAN_DEST 2\n\n/* macro to set DST control word value... */\n#define DST_CTRL(size, count, stride) \\\n    (((size) << 24) | ((count) << 16) | (stride))\n\n#define VEC_ALIGNER(src) ((UNALIGNED_PTR(src)) \\\n    ? vec_lvsl(0, src) \\\n    : vec_add(vec_lvsl(8, src), vec_splat_u8(8)))\n\n/* Calculate the permute vector used for 32->32 swizzling */\nstatic vector unsigned char\ncalc_swizzle32(const SDL_PixelFormat * srcfmt, const SDL_PixelFormat * dstfmt)\n{\n    /*\n     * We have to assume that the bits that aren't used by other\n     *  colors is alpha, and it's one complete byte, since some formats\n     *  leave alpha with a zero mask, but we should still swizzle the bits.\n     */\n    /* ARGB */\n    const static const struct SDL_PixelFormat default_pixel_format = {\n        0, NULL, 0, 0,\n        {0, 0},\n        0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000,\n        0, 0, 0, 0,\n        16, 8, 0, 24,\n        0, NULL\n    };\n    if (!srcfmt) {\n        srcfmt = &default_pixel_format;\n    }\n    if (!dstfmt) {\n        dstfmt = &default_pixel_format;\n    }\n    const vector unsigned char plus = VECUINT8_LITERAL(0x00, 0x00, 0x00, 0x00,\n                                                       0x04, 0x04, 0x04, 0x04,\n                                                       0x08, 0x08, 0x08, 0x08,\n                                                       0x0C, 0x0C, 0x0C,\n                                                       0x0C);\n    vector unsigned char vswiz;\n    vector unsigned int srcvec;\n#define RESHIFT(X) (3 - ((X) >> 3))\n    Uint32 rmask = RESHIFT(srcfmt->Rshift) << (dstfmt->Rshift);\n    Uint32 gmask = RESHIFT(srcfmt->Gshift) << (dstfmt->Gshift);\n    Uint32 bmask = RESHIFT(srcfmt->Bshift) << (dstfmt->Bshift);\n    Uint32 amask;\n    /* Use zero for alpha if either surface doesn't have alpha */\n    if (dstfmt->Amask) {\n        amask =\n            ((srcfmt->Amask) ? RESHIFT(srcfmt->\n                                       Ashift) : 0x10) << (dstfmt->Ashift);\n    } else {\n        amask =\n            0x10101010 & ((dstfmt->Rmask | dstfmt->Gmask | dstfmt->Bmask) ^\n                          0xFFFFFFFF);\n    }\n#undef RESHIFT\n    ((unsigned int *) (char *) &srcvec)[0] = (rmask | gmask | bmask | amask);\n    vswiz = vec_add(plus, (vector unsigned char) vec_splat(srcvec, 0));\n    return (vswiz);\n}\n\nstatic void Blit_RGB888_RGB565(SDL_BlitInfo * info);\nstatic void\nBlit_RGB888_RGB565Altivec(SDL_BlitInfo * info)\n{\n    int height = info->dst_h;\n    Uint8 *src = (Uint8 *) info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = (Uint8 *) info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    vector unsigned char valpha = vec_splat_u8(0);\n    vector unsigned char vpermute = calc_swizzle32(srcfmt, NULL);\n    vector unsigned char vgmerge = VECUINT8_LITERAL(0x00, 0x02, 0x00, 0x06,\n                                                    0x00, 0x0a, 0x00, 0x0e,\n                                                    0x00, 0x12, 0x00, 0x16,\n                                                    0x00, 0x1a, 0x00, 0x1e);\n    vector unsigned short v1 = vec_splat_u16(1);\n    vector unsigned short v3 = vec_splat_u16(3);\n    vector unsigned short v3f =\n        VECUINT16_LITERAL(0x003f, 0x003f, 0x003f, 0x003f,\n                          0x003f, 0x003f, 0x003f, 0x003f);\n    vector unsigned short vfc =\n        VECUINT16_LITERAL(0x00fc, 0x00fc, 0x00fc, 0x00fc,\n                          0x00fc, 0x00fc, 0x00fc, 0x00fc);\n    vector unsigned short vf800 = (vector unsigned short) vec_splat_u8(-7);\n    vf800 = vec_sl(vf800, vec_splat_u16(8));\n\n    while (height--) {\n        vector unsigned char valigner;\n        vector unsigned char voverflow;\n        vector unsigned char vsrc;\n\n        int width = info->dst_w;\n        int extrawidth;\n\n        /* do scalar until we can align... */\n#define ONE_PIXEL_BLEND(condition, widthvar) \\\n        while (condition) { \\\n            Uint32 Pixel; \\\n            unsigned sR, sG, sB, sA; \\\n            DISEMBLE_RGBA((Uint8 *)src, 4, srcfmt, Pixel, \\\n                          sR, sG, sB, sA); \\\n            *(Uint16 *)(dst) = (((sR << 8) & 0x0000F800) | \\\n                                ((sG << 3) & 0x000007E0) | \\\n                                ((sB >> 3) & 0x0000001F)); \\\n            dst += 2; \\\n            src += 4; \\\n            widthvar--; \\\n        }\n\n        ONE_PIXEL_BLEND(((UNALIGNED_PTR(dst)) && (width)), width);\n\n        /* After all that work, here's the vector part! */\n        extrawidth = (width % 8);       /* trailing unaligned stores */\n        width -= extrawidth;\n        vsrc = vec_ld(0, src);\n        valigner = VEC_ALIGNER(src);\n\n        while (width) {\n            vector unsigned short vpixel, vrpixel, vgpixel, vbpixel;\n            vector unsigned int vsrc1, vsrc2;\n            vector unsigned char vdst;\n\n            voverflow = vec_ld(15, src);\n            vsrc = vec_perm(vsrc, voverflow, valigner);\n            vsrc1 = (vector unsigned int) vec_perm(vsrc, valpha, vpermute);\n            src += 16;\n            vsrc = voverflow;\n            voverflow = vec_ld(15, src);\n            vsrc = vec_perm(vsrc, voverflow, valigner);\n            vsrc2 = (vector unsigned int) vec_perm(vsrc, valpha, vpermute);\n            /* 1555 */\n            vpixel = (vector unsigned short) vec_packpx(vsrc1, vsrc2);\n            vgpixel = (vector unsigned short) vec_perm(vsrc1, vsrc2, vgmerge);\n            vgpixel = vec_and(vgpixel, vfc);\n            vgpixel = vec_sl(vgpixel, v3);\n            vrpixel = vec_sl(vpixel, v1);\n            vrpixel = vec_and(vrpixel, vf800);\n            vbpixel = vec_and(vpixel, v3f);\n            vdst =\n                vec_or((vector unsigned char) vrpixel,\n                       (vector unsigned char) vgpixel);\n            /* 565 */\n            vdst = vec_or(vdst, (vector unsigned char) vbpixel);\n            vec_st(vdst, 0, dst);\n\n            width -= 8;\n            src += 16;\n            dst += 16;\n            vsrc = voverflow;\n        }\n\n        SDL_assert(width == 0);\n\n        /* do scalar until we can align... */\n        ONE_PIXEL_BLEND((extrawidth), extrawidth);\n#undef ONE_PIXEL_BLEND\n\n        src += srcskip;         /* move to next row, accounting for pitch. */\n        dst += dstskip;\n    }\n\n\n}\n\nstatic void\nBlit_RGB565_32Altivec(SDL_BlitInfo * info)\n{\n    int height = info->dst_h;\n    Uint8 *src = (Uint8 *) info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = (Uint8 *) info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    unsigned alpha;\n    vector unsigned char valpha;\n    vector unsigned char vpermute;\n    vector unsigned short vf800;\n    vector unsigned int v8 = vec_splat_u32(8);\n    vector unsigned int v16 = vec_add(v8, v8);\n    vector unsigned short v2 = vec_splat_u16(2);\n    vector unsigned short v3 = vec_splat_u16(3);\n    /*\n       0x10 - 0x1f is the alpha\n       0x00 - 0x0e evens are the red\n       0x01 - 0x0f odds are zero\n     */\n    vector unsigned char vredalpha1 = VECUINT8_LITERAL(0x10, 0x00, 0x01, 0x01,\n                                                       0x10, 0x02, 0x01, 0x01,\n                                                       0x10, 0x04, 0x01, 0x01,\n                                                       0x10, 0x06, 0x01,\n                                                       0x01);\n    vector unsigned char vredalpha2 =\n        (vector unsigned\n         char) (vec_add((vector unsigned int) vredalpha1, vec_sl(v8, v16))\n        );\n    /*\n       0x00 - 0x0f is ARxx ARxx ARxx ARxx\n       0x11 - 0x0f odds are blue\n     */\n    vector unsigned char vblue1 = VECUINT8_LITERAL(0x00, 0x01, 0x02, 0x11,\n                                                   0x04, 0x05, 0x06, 0x13,\n                                                   0x08, 0x09, 0x0a, 0x15,\n                                                   0x0c, 0x0d, 0x0e, 0x17);\n    vector unsigned char vblue2 =\n        (vector unsigned char) (vec_add((vector unsigned int) vblue1, v8)\n        );\n    /*\n       0x00 - 0x0f is ARxB ARxB ARxB ARxB\n       0x10 - 0x0e evens are green\n     */\n    vector unsigned char vgreen1 = VECUINT8_LITERAL(0x00, 0x01, 0x10, 0x03,\n                                                    0x04, 0x05, 0x12, 0x07,\n                                                    0x08, 0x09, 0x14, 0x0b,\n                                                    0x0c, 0x0d, 0x16, 0x0f);\n    vector unsigned char vgreen2 =\n        (vector unsigned\n         char) (vec_add((vector unsigned int) vgreen1, vec_sl(v8, v8))\n        );\n\n    SDL_assert(srcfmt->BytesPerPixel == 2);\n    SDL_assert(dstfmt->BytesPerPixel == 4);\n\n    vf800 = (vector unsigned short) vec_splat_u8(-7);\n    vf800 = vec_sl(vf800, vec_splat_u16(8));\n\n    if (dstfmt->Amask && info->a) {\n        ((unsigned char *) &valpha)[0] = alpha = info->a;\n        valpha = vec_splat(valpha, 0);\n    } else {\n        alpha = 0;\n        valpha = vec_splat_u8(0);\n    }\n\n    vpermute = calc_swizzle32(NULL, dstfmt);\n    while (height--) {\n        vector unsigned char valigner;\n        vector unsigned char voverflow;\n        vector unsigned char vsrc;\n\n        int width = info->dst_w;\n        int extrawidth;\n\n        /* do scalar until we can align... */\n#define ONE_PIXEL_BLEND(condition, widthvar) \\\n        while (condition) { \\\n            unsigned sR, sG, sB; \\\n            unsigned short Pixel = *((unsigned short *)src); \\\n            sR = (Pixel >> 8) & 0xf8; \\\n            sG = (Pixel >> 3) & 0xfc; \\\n            sB = (Pixel << 3) & 0xf8; \\\n            ASSEMBLE_RGBA(dst, 4, dstfmt, sR, sG, sB, alpha); \\\n            src += 2; \\\n            dst += 4; \\\n            widthvar--; \\\n        }\n        ONE_PIXEL_BLEND(((UNALIGNED_PTR(dst)) && (width)), width);\n\n        /* After all that work, here's the vector part! */\n        extrawidth = (width % 8);       /* trailing unaligned stores */\n        width -= extrawidth;\n        vsrc = vec_ld(0, src);\n        valigner = VEC_ALIGNER(src);\n\n        while (width) {\n            vector unsigned short vR, vG, vB;\n            vector unsigned char vdst1, vdst2;\n\n            voverflow = vec_ld(15, src);\n            vsrc = vec_perm(vsrc, voverflow, valigner);\n\n            vR = vec_and((vector unsigned short) vsrc, vf800);\n            vB = vec_sl((vector unsigned short) vsrc, v3);\n            vG = vec_sl(vB, v2);\n\n            vdst1 =\n                (vector unsigned char) vec_perm((vector unsigned char) vR,\n                                                valpha, vredalpha1);\n            vdst1 = vec_perm(vdst1, (vector unsigned char) vB, vblue1);\n            vdst1 = vec_perm(vdst1, (vector unsigned char) vG, vgreen1);\n            vdst1 = vec_perm(vdst1, valpha, vpermute);\n            vec_st(vdst1, 0, dst);\n\n            vdst2 =\n                (vector unsigned char) vec_perm((vector unsigned char) vR,\n                                                valpha, vredalpha2);\n            vdst2 = vec_perm(vdst2, (vector unsigned char) vB, vblue2);\n            vdst2 = vec_perm(vdst2, (vector unsigned char) vG, vgreen2);\n            vdst2 = vec_perm(vdst2, valpha, vpermute);\n            vec_st(vdst2, 16, dst);\n\n            width -= 8;\n            dst += 32;\n            src += 16;\n            vsrc = voverflow;\n        }\n\n        SDL_assert(width == 0);\n\n\n        /* do scalar until we can align... */\n        ONE_PIXEL_BLEND((extrawidth), extrawidth);\n#undef ONE_PIXEL_BLEND\n\n        src += srcskip;         /* move to next row, accounting for pitch. */\n        dst += dstskip;\n    }\n\n}\n\n\nstatic void\nBlit_RGB555_32Altivec(SDL_BlitInfo * info)\n{\n    int height = info->dst_h;\n    Uint8 *src = (Uint8 *) info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = (Uint8 *) info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    unsigned alpha;\n    vector unsigned char valpha;\n    vector unsigned char vpermute;\n    vector unsigned short vf800;\n    vector unsigned int v8 = vec_splat_u32(8);\n    vector unsigned int v16 = vec_add(v8, v8);\n    vector unsigned short v1 = vec_splat_u16(1);\n    vector unsigned short v3 = vec_splat_u16(3);\n    /*\n       0x10 - 0x1f is the alpha\n       0x00 - 0x0e evens are the red\n       0x01 - 0x0f odds are zero\n     */\n    vector unsigned char vredalpha1 = VECUINT8_LITERAL(0x10, 0x00, 0x01, 0x01,\n                                                       0x10, 0x02, 0x01, 0x01,\n                                                       0x10, 0x04, 0x01, 0x01,\n                                                       0x10, 0x06, 0x01,\n                                                       0x01);\n    vector unsigned char vredalpha2 =\n        (vector unsigned\n         char) (vec_add((vector unsigned int) vredalpha1, vec_sl(v8, v16))\n        );\n    /*\n       0x00 - 0x0f is ARxx ARxx ARxx ARxx\n       0x11 - 0x0f odds are blue\n     */\n    vector unsigned char vblue1 = VECUINT8_LITERAL(0x00, 0x01, 0x02, 0x11,\n                                                   0x04, 0x05, 0x06, 0x13,\n                                                   0x08, 0x09, 0x0a, 0x15,\n                                                   0x0c, 0x0d, 0x0e, 0x17);\n    vector unsigned char vblue2 =\n        (vector unsigned char) (vec_add((vector unsigned int) vblue1, v8)\n        );\n    /*\n       0x00 - 0x0f is ARxB ARxB ARxB ARxB\n       0x10 - 0x0e evens are green\n     */\n    vector unsigned char vgreen1 = VECUINT8_LITERAL(0x00, 0x01, 0x10, 0x03,\n                                                    0x04, 0x05, 0x12, 0x07,\n                                                    0x08, 0x09, 0x14, 0x0b,\n                                                    0x0c, 0x0d, 0x16, 0x0f);\n    vector unsigned char vgreen2 =\n        (vector unsigned\n         char) (vec_add((vector unsigned int) vgreen1, vec_sl(v8, v8))\n        );\n\n    SDL_assert(srcfmt->BytesPerPixel == 2);\n    SDL_assert(dstfmt->BytesPerPixel == 4);\n\n    vf800 = (vector unsigned short) vec_splat_u8(-7);\n    vf800 = vec_sl(vf800, vec_splat_u16(8));\n\n    if (dstfmt->Amask && info->a) {\n        ((unsigned char *) &valpha)[0] = alpha = info->a;\n        valpha = vec_splat(valpha, 0);\n    } else {\n        alpha = 0;\n        valpha = vec_splat_u8(0);\n    }\n\n    vpermute = calc_swizzle32(NULL, dstfmt);\n    while (height--) {\n        vector unsigned char valigner;\n        vector unsigned char voverflow;\n        vector unsigned char vsrc;\n\n        int width = info->dst_w;\n        int extrawidth;\n\n        /* do scalar until we can align... */\n#define ONE_PIXEL_BLEND(condition, widthvar) \\\n        while (condition) { \\\n            unsigned sR, sG, sB; \\\n            unsigned short Pixel = *((unsigned short *)src); \\\n            sR = (Pixel >> 7) & 0xf8; \\\n            sG = (Pixel >> 2) & 0xf8; \\\n            sB = (Pixel << 3) & 0xf8; \\\n            ASSEMBLE_RGBA(dst, 4, dstfmt, sR, sG, sB, alpha); \\\n            src += 2; \\\n            dst += 4; \\\n            widthvar--; \\\n        }\n        ONE_PIXEL_BLEND(((UNALIGNED_PTR(dst)) && (width)), width);\n\n        /* After all that work, here's the vector part! */\n        extrawidth = (width % 8);       /* trailing unaligned stores */\n        width -= extrawidth;\n        vsrc = vec_ld(0, src);\n        valigner = VEC_ALIGNER(src);\n\n        while (width) {\n            vector unsigned short vR, vG, vB;\n            vector unsigned char vdst1, vdst2;\n\n            voverflow = vec_ld(15, src);\n            vsrc = vec_perm(vsrc, voverflow, valigner);\n\n            vR = vec_and(vec_sl((vector unsigned short) vsrc, v1), vf800);\n            vB = vec_sl((vector unsigned short) vsrc, v3);\n            vG = vec_sl(vB, v3);\n\n            vdst1 =\n                (vector unsigned char) vec_perm((vector unsigned char) vR,\n                                                valpha, vredalpha1);\n            vdst1 = vec_perm(vdst1, (vector unsigned char) vB, vblue1);\n            vdst1 = vec_perm(vdst1, (vector unsigned char) vG, vgreen1);\n            vdst1 = vec_perm(vdst1, valpha, vpermute);\n            vec_st(vdst1, 0, dst);\n\n            vdst2 =\n                (vector unsigned char) vec_perm((vector unsigned char) vR,\n                                                valpha, vredalpha2);\n            vdst2 = vec_perm(vdst2, (vector unsigned char) vB, vblue2);\n            vdst2 = vec_perm(vdst2, (vector unsigned char) vG, vgreen2);\n            vdst2 = vec_perm(vdst2, valpha, vpermute);\n            vec_st(vdst2, 16, dst);\n\n            width -= 8;\n            dst += 32;\n            src += 16;\n            vsrc = voverflow;\n        }\n\n        SDL_assert(width == 0);\n\n\n        /* do scalar until we can align... */\n        ONE_PIXEL_BLEND((extrawidth), extrawidth);\n#undef ONE_PIXEL_BLEND\n\n        src += srcskip;         /* move to next row, accounting for pitch. */\n        dst += dstskip;\n    }\n\n}\n\nstatic void BlitNtoNKey(SDL_BlitInfo * info);\nstatic void BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info);\nstatic void\nBlit32to32KeyAltivec(SDL_BlitInfo * info)\n{\n    int height = info->dst_h;\n    Uint32 *srcp = (Uint32 *) info->src;\n    int srcskip = info->src_skip / 4;\n    Uint32 *dstp = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip / 4;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    int srcbpp = srcfmt->BytesPerPixel;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int dstbpp = dstfmt->BytesPerPixel;\n    int copy_alpha = (srcfmt->Amask && dstfmt->Amask);\n    unsigned alpha = dstfmt->Amask ? info->a : 0;\n    Uint32 rgbmask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask;\n    Uint32 ckey = info->colorkey;\n    vector unsigned int valpha;\n    vector unsigned char vpermute;\n    vector unsigned char vzero;\n    vector unsigned int vckey;\n    vector unsigned int vrgbmask;\n    vpermute = calc_swizzle32(srcfmt, dstfmt);\n    if (info->dst_w < 16) {\n        if (copy_alpha) {\n            BlitNtoNKeyCopyAlpha(info);\n        } else {\n            BlitNtoNKey(info);\n        }\n        return;\n    }\n    vzero = vec_splat_u8(0);\n    if (alpha) {\n        ((unsigned char *) &valpha)[0] = (unsigned char) alpha;\n        valpha =\n            (vector unsigned int) vec_splat((vector unsigned char) valpha, 0);\n    } else {\n        valpha = (vector unsigned int) vzero;\n    }\n    ckey &= rgbmask;\n    ((unsigned int *) (char *) &vckey)[0] = ckey;\n    vckey = vec_splat(vckey, 0);\n    ((unsigned int *) (char *) &vrgbmask)[0] = rgbmask;\n    vrgbmask = vec_splat(vrgbmask, 0);\n\n    while (height--) {\n#define ONE_PIXEL_BLEND(condition, widthvar) \\\n        if (copy_alpha) { \\\n            while (condition) { \\\n                Uint32 Pixel; \\\n                unsigned sR, sG, sB, sA; \\\n                DISEMBLE_RGBA((Uint8 *)srcp, srcbpp, srcfmt, Pixel, \\\n                          sR, sG, sB, sA); \\\n                if ( (Pixel & rgbmask) != ckey ) { \\\n                      ASSEMBLE_RGBA((Uint8 *)dstp, dstbpp, dstfmt, \\\n                            sR, sG, sB, sA); \\\n                } \\\n                dstp = (Uint32 *) (((Uint8 *) dstp) + dstbpp); \\\n                srcp = (Uint32 *) (((Uint8 *) srcp) + srcbpp); \\\n                widthvar--; \\\n            } \\\n        } else { \\\n            while (condition) { \\\n                Uint32 Pixel; \\\n                unsigned sR, sG, sB; \\\n                RETRIEVE_RGB_PIXEL((Uint8 *)srcp, srcbpp, Pixel); \\\n                if ( Pixel != ckey ) { \\\n                    RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB); \\\n                    ASSEMBLE_RGBA((Uint8 *)dstp, dstbpp, dstfmt, \\\n                              sR, sG, sB, alpha); \\\n                } \\\n                dstp = (Uint32 *) (((Uint8 *)dstp) + dstbpp); \\\n                srcp = (Uint32 *) (((Uint8 *)srcp) + srcbpp); \\\n                widthvar--; \\\n            } \\\n        }\n        int width = info->dst_w;\n        ONE_PIXEL_BLEND((UNALIGNED_PTR(dstp)) && (width), width);\n        SDL_assert(width > 0);\n        if (width > 0) {\n            int extrawidth = (width % 4);\n            vector unsigned char valigner = VEC_ALIGNER(srcp);\n            vector unsigned int vs = vec_ld(0, srcp);\n            width -= extrawidth;\n            SDL_assert(width >= 4);\n            while (width) {\n                vector unsigned char vsel;\n                vector unsigned int vd;\n                vector unsigned int voverflow = vec_ld(15, srcp);\n                /* load the source vec */\n                vs = vec_perm(vs, voverflow, valigner);\n                /* vsel is set for items that match the key */\n                vsel = (vector unsigned char) vec_and(vs, vrgbmask);\n                vsel = (vector unsigned char) vec_cmpeq(vs, vckey);\n                /* permute the src vec to the dest format */\n                vs = vec_perm(vs, valpha, vpermute);\n                /* load the destination vec */\n                vd = vec_ld(0, dstp);\n                /* select the source and dest into vs */\n                vd = (vector unsigned int) vec_sel((vector unsigned char) vs,\n                                                   (vector unsigned char) vd,\n                                                   vsel);\n\n                vec_st(vd, 0, dstp);\n                srcp += 4;\n                width -= 4;\n                dstp += 4;\n                vs = voverflow;\n            }\n            ONE_PIXEL_BLEND((extrawidth), extrawidth);\n#undef ONE_PIXEL_BLEND\n            srcp += srcskip;\n            dstp += dstskip;\n        }\n    }\n}\n\n/* Altivec code to swizzle one 32-bit surface to a different 32-bit format. */\n/* Use this on a G5 */\nstatic void\nConvertAltivec32to32_noprefetch(SDL_BlitInfo * info)\n{\n    int height = info->dst_h;\n    Uint32 *src = (Uint32 *) info->src;\n    int srcskip = info->src_skip / 4;\n    Uint32 *dst = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip / 4;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    vector unsigned int vzero = vec_splat_u32(0);\n    vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt);\n    if (dstfmt->Amask && !srcfmt->Amask) {\n        if (info->a) {\n            vector unsigned char valpha;\n            ((unsigned char *) &valpha)[0] = info->a;\n            vzero = (vector unsigned int) vec_splat(valpha, 0);\n        }\n    }\n\n    SDL_assert(srcfmt->BytesPerPixel == 4);\n    SDL_assert(dstfmt->BytesPerPixel == 4);\n\n    while (height--) {\n        vector unsigned char valigner;\n        vector unsigned int vbits;\n        vector unsigned int voverflow;\n        Uint32 bits;\n        Uint8 r, g, b, a;\n\n        int width = info->dst_w;\n        int extrawidth;\n\n        /* do scalar until we can align... */\n        while ((UNALIGNED_PTR(dst)) && (width)) {\n            bits = *(src++);\n            RGBA_FROM_8888(bits, srcfmt, r, g, b, a);\n            if(!srcfmt->Amask)\n              a = info->a;\n            *(dst++) = MAKE8888(dstfmt, r, g, b, a);\n            width--;\n        }\n\n        /* After all that work, here's the vector part! */\n        extrawidth = (width % 4);\n        width -= extrawidth;\n        valigner = VEC_ALIGNER(src);\n        vbits = vec_ld(0, src);\n\n        while (width) {\n            voverflow = vec_ld(15, src);\n            src += 4;\n            width -= 4;\n            vbits = vec_perm(vbits, voverflow, valigner);       /* src is ready. */\n            vbits = vec_perm(vbits, vzero, vpermute);   /* swizzle it. */\n            vec_st(vbits, 0, dst);      /* store it back out. */\n            dst += 4;\n            vbits = voverflow;\n        }\n\n        SDL_assert(width == 0);\n\n        /* cover pixels at the end of the row that didn't fit in 16 bytes. */\n        while (extrawidth) {\n            bits = *(src++);    /* max 7 pixels, don't bother with prefetch. */\n            RGBA_FROM_8888(bits, srcfmt, r, g, b, a);\n            if(!srcfmt->Amask)\n              a = info->a;\n            *(dst++) = MAKE8888(dstfmt, r, g, b, a);\n            extrawidth--;\n        }\n\n        src += srcskip;\n        dst += dstskip;\n    }\n\n}\n\n/* Altivec code to swizzle one 32-bit surface to a different 32-bit format. */\n/* Use this on a G4 */\nstatic void\nConvertAltivec32to32_prefetch(SDL_BlitInfo * info)\n{\n    const int scalar_dst_lead = sizeof(Uint32) * 4;\n    const int vector_dst_lead = sizeof(Uint32) * 16;\n\n    int height = info->dst_h;\n    Uint32 *src = (Uint32 *) info->src;\n    int srcskip = info->src_skip / 4;\n    Uint32 *dst = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip / 4;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    vector unsigned int vzero = vec_splat_u32(0);\n    vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt);\n    if (dstfmt->Amask && !srcfmt->Amask) {\n        if (info->a) {\n            vector unsigned char valpha;\n            ((unsigned char *) &valpha)[0] = info->a;\n            vzero = (vector unsigned int) vec_splat(valpha, 0);\n        }\n    }\n\n    SDL_assert(srcfmt->BytesPerPixel == 4);\n    SDL_assert(dstfmt->BytesPerPixel == 4);\n\n    while (height--) {\n        vector unsigned char valigner;\n        vector unsigned int vbits;\n        vector unsigned int voverflow;\n        Uint32 bits;\n        Uint8 r, g, b, a;\n\n        int width = info->dst_w;\n        int extrawidth;\n\n        /* do scalar until we can align... */\n        while ((UNALIGNED_PTR(dst)) && (width)) {\n            vec_dstt(src + scalar_dst_lead, DST_CTRL(2, 32, 1024),\n                     DST_CHAN_SRC);\n            vec_dstst(dst + scalar_dst_lead, DST_CTRL(2, 32, 1024),\n                      DST_CHAN_DEST);\n            bits = *(src++);\n            RGBA_FROM_8888(bits, srcfmt, r, g, b, a);\n            if(!srcfmt->Amask)\n              a = info->a;\n            *(dst++) = MAKE8888(dstfmt, r, g, b, a);\n            width--;\n        }\n\n        /* After all that work, here's the vector part! */\n        extrawidth = (width % 4);\n        width -= extrawidth;\n        valigner = VEC_ALIGNER(src);\n        vbits = vec_ld(0, src);\n\n        while (width) {\n            vec_dstt(src + vector_dst_lead, DST_CTRL(2, 32, 1024),\n                     DST_CHAN_SRC);\n            vec_dstst(dst + vector_dst_lead, DST_CTRL(2, 32, 1024),\n                      DST_CHAN_DEST);\n            voverflow = vec_ld(15, src);\n            src += 4;\n            width -= 4;\n            vbits = vec_perm(vbits, voverflow, valigner);       /* src is ready. */\n            vbits = vec_perm(vbits, vzero, vpermute);   /* swizzle it. */\n            vec_st(vbits, 0, dst);      /* store it back out. */\n            dst += 4;\n            vbits = voverflow;\n        }\n\n        SDL_assert(width == 0);\n\n        /* cover pixels at the end of the row that didn't fit in 16 bytes. */\n        while (extrawidth) {\n            bits = *(src++);    /* max 7 pixels, don't bother with prefetch. */\n            RGBA_FROM_8888(bits, srcfmt, r, g, b, a);\n            if(!srcfmt->Amask)\n              a = info->a;\n            *(dst++) = MAKE8888(dstfmt, r, g, b, a);\n            extrawidth--;\n        }\n\n        src += srcskip;\n        dst += dstskip;\n    }\n\n    vec_dss(DST_CHAN_SRC);\n    vec_dss(DST_CHAN_DEST);\n}\n\nstatic Uint32\nGetBlitFeatures(void)\n{\n    static Uint32 features = 0xffffffff;\n    if (features == 0xffffffff) {\n        /* Provide an override for testing .. */\n        char *override = SDL_getenv(\"SDL_ALTIVEC_BLIT_FEATURES\");\n        if (override) {\n            features = 0;\n            SDL_sscanf(override, \"%u\", &features);\n        } else {\n            features = (0\n                        /* Feature 1 is has-MMX */\n                        | ((SDL_HasMMX())? 1 : 0)\n                        /* Feature 2 is has-AltiVec */\n                        | ((SDL_HasAltiVec())? 2 : 0)\n                        /* Feature 4 is dont-use-prefetch */\n                        /* !!!! FIXME: Check for G5 or later, not the cache size! Always prefetch on a G4. */\n                        | ((GetL3CacheSize() == 0) ? 4 : 0)\n                );\n        }\n    }\n    return features;\n}\n\n#if __MWERKS__\n#pragma altivec_model off\n#endif\n#else\n/* Feature 1 is has-MMX */\n#define GetBlitFeatures() ((Uint32)(SDL_HasMMX() ? 1 : 0))\n#endif\n\n/* This is now endian dependent */\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n#define HI  1\n#define LO  0\n#else /* SDL_BYTEORDER == SDL_BIG_ENDIAN */\n#define HI  0\n#define LO  1\n#endif\n\n/* Special optimized blit for RGB 8-8-8 --> RGB 3-3-2 */\n#define RGB888_RGB332(dst, src) { \\\n    dst = (Uint8)((((src)&0x00E00000)>>16)| \\\n                  (((src)&0x0000E000)>>11)| \\\n                  (((src)&0x000000C0)>>6)); \\\n}\nstatic void\nBlit_RGB888_index8(SDL_BlitInfo * info)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int width, height;\n    Uint32 *src;\n    const Uint8 *map;\n    Uint8 *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = (Uint32 *) info->src;\n    srcskip = info->src_skip / 4;\n    dst = info->dst;\n    dstskip = info->dst_skip;\n    map = info->table;\n\n    if (map == NULL) {\n        while (height--) {\n#ifdef USE_DUFFS_LOOP\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n                RGB888_RGB332(*dst++, *src);\n            , width);\n            /* *INDENT-ON* */\n#else\n            for (c = width / 4; c; --c) {\n                /* Pack RGB into 8bit pixel */\n                ++src;\n                RGB888_RGB332(*dst++, *src);\n                ++src;\n                RGB888_RGB332(*dst++, *src);\n                ++src;\n                RGB888_RGB332(*dst++, *src);\n                ++src;\n            }\n            switch (width & 3) {\n            case 3:\n                RGB888_RGB332(*dst++, *src);\n                ++src;\n            case 2:\n                RGB888_RGB332(*dst++, *src);\n                ++src;\n            case 1:\n                RGB888_RGB332(*dst++, *src);\n                ++src;\n            }\n#endif /* USE_DUFFS_LOOP */\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        int Pixel;\n\n        while (height--) {\n#ifdef USE_DUFFS_LOOP\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n                RGB888_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            , width);\n            /* *INDENT-ON* */\n#else\n            for (c = width / 4; c; --c) {\n                /* Pack RGB into 8bit pixel */\n                RGB888_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n                RGB888_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n                RGB888_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n                RGB888_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            }\n            switch (width & 3) {\n            case 3:\n                RGB888_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            case 2:\n                RGB888_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            case 1:\n                RGB888_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            }\n#endif /* USE_DUFFS_LOOP */\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n}\n\n/* Special optimized blit for RGB 10-10-10 --> RGB 3-3-2 */\n#define RGB101010_RGB332(dst, src) { \\\n    dst = (Uint8)((((src)&0x38000000)>>22)| \\\n                  (((src)&0x000E0000)>>15)| \\\n                  (((src)&0x00000300)>>8)); \\\n}\nstatic void\nBlit_RGB101010_index8(SDL_BlitInfo * info)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int width, height;\n    Uint32 *src;\n    const Uint8 *map;\n    Uint8 *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = (Uint32 *) info->src;\n    srcskip = info->src_skip / 4;\n    dst = info->dst;\n    dstskip = info->dst_skip;\n    map = info->table;\n\n    if (map == NULL) {\n        while (height--) {\n#ifdef USE_DUFFS_LOOP\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n                RGB101010_RGB332(*dst++, *src);\n            , width);\n            /* *INDENT-ON* */\n#else\n            for (c = width / 4; c; --c) {\n                /* Pack RGB into 8bit pixel */\n                ++src;\n                RGB101010_RGB332(*dst++, *src);\n                ++src;\n                RGB101010_RGB332(*dst++, *src);\n                ++src;\n                RGB101010_RGB332(*dst++, *src);\n                ++src;\n            }\n            switch (width & 3) {\n            case 3:\n                RGB101010_RGB332(*dst++, *src);\n                ++src;\n            case 2:\n                RGB101010_RGB332(*dst++, *src);\n                ++src;\n            case 1:\n                RGB101010_RGB332(*dst++, *src);\n                ++src;\n            }\n#endif /* USE_DUFFS_LOOP */\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        int Pixel;\n\n        while (height--) {\n#ifdef USE_DUFFS_LOOP\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n                RGB101010_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            , width);\n            /* *INDENT-ON* */\n#else\n            for (c = width / 4; c; --c) {\n                /* Pack RGB into 8bit pixel */\n                RGB101010_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n                RGB101010_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n                RGB101010_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n                RGB101010_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            }\n            switch (width & 3) {\n            case 3:\n                RGB101010_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            case 2:\n                RGB101010_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            case 1:\n                RGB101010_RGB332(Pixel, *src);\n                *dst++ = map[Pixel];\n                ++src;\n            }\n#endif /* USE_DUFFS_LOOP */\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n}\n\n/* Special optimized blit for RGB 8-8-8 --> RGB 5-5-5 */\n#define RGB888_RGB555(dst, src) { \\\n    *(Uint16 *)(dst) = (Uint16)((((*src)&0x00F80000)>>9)| \\\n                                (((*src)&0x0000F800)>>6)| \\\n                                (((*src)&0x000000F8)>>3)); \\\n}\n#define RGB888_RGB555_TWO(dst, src) { \\\n    *(Uint32 *)(dst) = (((((src[HI])&0x00F80000)>>9)| \\\n                         (((src[HI])&0x0000F800)>>6)| \\\n                         (((src[HI])&0x000000F8)>>3))<<16)| \\\n                         (((src[LO])&0x00F80000)>>9)| \\\n                         (((src[LO])&0x0000F800)>>6)| \\\n                         (((src[LO])&0x000000F8)>>3); \\\n}\nstatic void\nBlit_RGB888_RGB555(SDL_BlitInfo * info)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int width, height;\n    Uint32 *src;\n    Uint16 *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = (Uint32 *) info->src;\n    srcskip = info->src_skip / 4;\n    dst = (Uint16 *) info->dst;\n    dstskip = info->dst_skip / 2;\n\n#ifdef USE_DUFFS_LOOP\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n            RGB888_RGB555(dst, src);\n            ++src;\n            ++dst;\n        , width);\n        /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n#else\n    /* Memory align at 4-byte boundary, if necessary */\n    if ((long) dst & 0x03) {\n        /* Don't do anything if width is 0 */\n        if (width == 0) {\n            return;\n        }\n        --width;\n\n        while (height--) {\n            /* Perform copy alignment */\n            RGB888_RGB555(dst, src);\n            ++src;\n            ++dst;\n\n            /* Copy in 4 pixel chunks */\n            for (c = width / 4; c; --c) {\n                RGB888_RGB555_TWO(dst, src);\n                src += 2;\n                dst += 2;\n                RGB888_RGB555_TWO(dst, src);\n                src += 2;\n                dst += 2;\n            }\n            /* Get any leftovers */\n            switch (width & 3) {\n            case 3:\n                RGB888_RGB555(dst, src);\n                ++src;\n                ++dst;\n            case 2:\n                RGB888_RGB555_TWO(dst, src);\n                src += 2;\n                dst += 2;\n                break;\n            case 1:\n                RGB888_RGB555(dst, src);\n                ++src;\n                ++dst;\n                break;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        while (height--) {\n            /* Copy in 4 pixel chunks */\n            for (c = width / 4; c; --c) {\n                RGB888_RGB555_TWO(dst, src);\n                src += 2;\n                dst += 2;\n                RGB888_RGB555_TWO(dst, src);\n                src += 2;\n                dst += 2;\n            }\n            /* Get any leftovers */\n            switch (width & 3) {\n            case 3:\n                RGB888_RGB555(dst, src);\n                ++src;\n                ++dst;\n            case 2:\n                RGB888_RGB555_TWO(dst, src);\n                src += 2;\n                dst += 2;\n                break;\n            case 1:\n                RGB888_RGB555(dst, src);\n                ++src;\n                ++dst;\n                break;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n#endif /* USE_DUFFS_LOOP */\n}\n\n/* Special optimized blit for RGB 8-8-8 --> RGB 5-6-5 */\n#define RGB888_RGB565(dst, src) { \\\n    *(Uint16 *)(dst) = (Uint16)((((*src)&0x00F80000)>>8)| \\\n                                (((*src)&0x0000FC00)>>5)| \\\n                                (((*src)&0x000000F8)>>3)); \\\n}\n#define RGB888_RGB565_TWO(dst, src) { \\\n    *(Uint32 *)(dst) = (((((src[HI])&0x00F80000)>>8)| \\\n                         (((src[HI])&0x0000FC00)>>5)| \\\n                         (((src[HI])&0x000000F8)>>3))<<16)| \\\n                         (((src[LO])&0x00F80000)>>8)| \\\n                         (((src[LO])&0x0000FC00)>>5)| \\\n                         (((src[LO])&0x000000F8)>>3); \\\n}\nstatic void\nBlit_RGB888_RGB565(SDL_BlitInfo * info)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int width, height;\n    Uint32 *src;\n    Uint16 *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = (Uint32 *) info->src;\n    srcskip = info->src_skip / 4;\n    dst = (Uint16 *) info->dst;\n    dstskip = info->dst_skip / 2;\n\n#ifdef USE_DUFFS_LOOP\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n            RGB888_RGB565(dst, src);\n            ++src;\n            ++dst;\n        , width);\n        /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n#else\n    /* Memory align at 4-byte boundary, if necessary */\n    if ((long) dst & 0x03) {\n        /* Don't do anything if width is 0 */\n        if (width == 0) {\n            return;\n        }\n        --width;\n\n        while (height--) {\n            /* Perform copy alignment */\n            RGB888_RGB565(dst, src);\n            ++src;\n            ++dst;\n\n            /* Copy in 4 pixel chunks */\n            for (c = width / 4; c; --c) {\n                RGB888_RGB565_TWO(dst, src);\n                src += 2;\n                dst += 2;\n                RGB888_RGB565_TWO(dst, src);\n                src += 2;\n                dst += 2;\n            }\n            /* Get any leftovers */\n            switch (width & 3) {\n            case 3:\n                RGB888_RGB565(dst, src);\n                ++src;\n                ++dst;\n            case 2:\n                RGB888_RGB565_TWO(dst, src);\n                src += 2;\n                dst += 2;\n                break;\n            case 1:\n                RGB888_RGB565(dst, src);\n                ++src;\n                ++dst;\n                break;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        while (height--) {\n            /* Copy in 4 pixel chunks */\n            for (c = width / 4; c; --c) {\n                RGB888_RGB565_TWO(dst, src);\n                src += 2;\n                dst += 2;\n                RGB888_RGB565_TWO(dst, src);\n                src += 2;\n                dst += 2;\n            }\n            /* Get any leftovers */\n            switch (width & 3) {\n            case 3:\n                RGB888_RGB565(dst, src);\n                ++src;\n                ++dst;\n            case 2:\n                RGB888_RGB565_TWO(dst, src);\n                src += 2;\n                dst += 2;\n                break;\n            case 1:\n                RGB888_RGB565(dst, src);\n                ++src;\n                ++dst;\n                break;\n            }\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n#endif /* USE_DUFFS_LOOP */\n}\n\n\n/* Special optimized blit for RGB 5-6-5 --> 32-bit RGB surfaces */\n#define RGB565_32(dst, src, map) (map[src[LO]*2] + map[src[HI]*2+1])\nstatic void\nBlit_RGB565_32(SDL_BlitInfo * info, const Uint32 * map)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int width, height;\n    Uint8 *src;\n    Uint32 *dst;\n    int srcskip, dstskip;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = (Uint8 *) info->src;\n    srcskip = info->src_skip;\n    dst = (Uint32 *) info->dst;\n    dstskip = info->dst_skip / 4;\n\n#ifdef USE_DUFFS_LOOP\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n        {\n            *dst++ = RGB565_32(dst, src, map);\n            src += 2;\n        },\n        width);\n        /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n#else\n    while (height--) {\n        /* Copy in 4 pixel chunks */\n        for (c = width / 4; c; --c) {\n            *dst++ = RGB565_32(dst, src, map);\n            src += 2;\n            *dst++ = RGB565_32(dst, src, map);\n            src += 2;\n            *dst++ = RGB565_32(dst, src, map);\n            src += 2;\n            *dst++ = RGB565_32(dst, src, map);\n            src += 2;\n        }\n        /* Get any leftovers */\n        switch (width & 3) {\n        case 3:\n            *dst++ = RGB565_32(dst, src, map);\n            src += 2;\n        case 2:\n            *dst++ = RGB565_32(dst, src, map);\n            src += 2;\n        case 1:\n            *dst++ = RGB565_32(dst, src, map);\n            src += 2;\n            break;\n        }\n        src += srcskip;\n        dst += dstskip;\n    }\n#endif /* USE_DUFFS_LOOP */\n}\n\n/* Special optimized blit for RGB 5-6-5 --> ARGB 8-8-8-8 */\nstatic const Uint32 RGB565_ARGB8888_LUT[512] = {\n    0x00000000, 0xff000000, 0x00000008, 0xff002000,\n    0x00000010, 0xff004000, 0x00000018, 0xff006100,\n    0x00000020, 0xff008100, 0x00000029, 0xff00a100,\n    0x00000031, 0xff00c200, 0x00000039, 0xff00e200,\n    0x00000041, 0xff080000, 0x0000004a, 0xff082000,\n    0x00000052, 0xff084000, 0x0000005a, 0xff086100,\n    0x00000062, 0xff088100, 0x0000006a, 0xff08a100,\n    0x00000073, 0xff08c200, 0x0000007b, 0xff08e200,\n    0x00000083, 0xff100000, 0x0000008b, 0xff102000,\n    0x00000094, 0xff104000, 0x0000009c, 0xff106100,\n    0x000000a4, 0xff108100, 0x000000ac, 0xff10a100,\n    0x000000b4, 0xff10c200, 0x000000bd, 0xff10e200,\n    0x000000c5, 0xff180000, 0x000000cd, 0xff182000,\n    0x000000d5, 0xff184000, 0x000000de, 0xff186100,\n    0x000000e6, 0xff188100, 0x000000ee, 0xff18a100,\n    0x000000f6, 0xff18c200, 0x000000ff, 0xff18e200,\n    0x00000400, 0xff200000, 0x00000408, 0xff202000,\n    0x00000410, 0xff204000, 0x00000418, 0xff206100,\n    0x00000420, 0xff208100, 0x00000429, 0xff20a100,\n    0x00000431, 0xff20c200, 0x00000439, 0xff20e200,\n    0x00000441, 0xff290000, 0x0000044a, 0xff292000,\n    0x00000452, 0xff294000, 0x0000045a, 0xff296100,\n    0x00000462, 0xff298100, 0x0000046a, 0xff29a100,\n    0x00000473, 0xff29c200, 0x0000047b, 0xff29e200,\n    0x00000483, 0xff310000, 0x0000048b, 0xff312000,\n    0x00000494, 0xff314000, 0x0000049c, 0xff316100,\n    0x000004a4, 0xff318100, 0x000004ac, 0xff31a100,\n    0x000004b4, 0xff31c200, 0x000004bd, 0xff31e200,\n    0x000004c5, 0xff390000, 0x000004cd, 0xff392000,\n    0x000004d5, 0xff394000, 0x000004de, 0xff396100,\n    0x000004e6, 0xff398100, 0x000004ee, 0xff39a100,\n    0x000004f6, 0xff39c200, 0x000004ff, 0xff39e200,\n    0x00000800, 0xff410000, 0x00000808, 0xff412000,\n    0x00000810, 0xff414000, 0x00000818, 0xff416100,\n    0x00000820, 0xff418100, 0x00000829, 0xff41a100,\n    0x00000831, 0xff41c200, 0x00000839, 0xff41e200,\n    0x00000841, 0xff4a0000, 0x0000084a, 0xff4a2000,\n    0x00000852, 0xff4a4000, 0x0000085a, 0xff4a6100,\n    0x00000862, 0xff4a8100, 0x0000086a, 0xff4aa100,\n    0x00000873, 0xff4ac200, 0x0000087b, 0xff4ae200,\n    0x00000883, 0xff520000, 0x0000088b, 0xff522000,\n    0x00000894, 0xff524000, 0x0000089c, 0xff526100,\n    0x000008a4, 0xff528100, 0x000008ac, 0xff52a100,\n    0x000008b4, 0xff52c200, 0x000008bd, 0xff52e200,\n    0x000008c5, 0xff5a0000, 0x000008cd, 0xff5a2000,\n    0x000008d5, 0xff5a4000, 0x000008de, 0xff5a6100,\n    0x000008e6, 0xff5a8100, 0x000008ee, 0xff5aa100,\n    0x000008f6, 0xff5ac200, 0x000008ff, 0xff5ae200,\n    0x00000c00, 0xff620000, 0x00000c08, 0xff622000,\n    0x00000c10, 0xff624000, 0x00000c18, 0xff626100,\n    0x00000c20, 0xff628100, 0x00000c29, 0xff62a100,\n    0x00000c31, 0xff62c200, 0x00000c39, 0xff62e200,\n    0x00000c41, 0xff6a0000, 0x00000c4a, 0xff6a2000,\n    0x00000c52, 0xff6a4000, 0x00000c5a, 0xff6a6100,\n    0x00000c62, 0xff6a8100, 0x00000c6a, 0xff6aa100,\n    0x00000c73, 0xff6ac200, 0x00000c7b, 0xff6ae200,\n    0x00000c83, 0xff730000, 0x00000c8b, 0xff732000,\n    0x00000c94, 0xff734000, 0x00000c9c, 0xff736100,\n    0x00000ca4, 0xff738100, 0x00000cac, 0xff73a100,\n    0x00000cb4, 0xff73c200, 0x00000cbd, 0xff73e200,\n    0x00000cc5, 0xff7b0000, 0x00000ccd, 0xff7b2000,\n    0x00000cd5, 0xff7b4000, 0x00000cde, 0xff7b6100,\n    0x00000ce6, 0xff7b8100, 0x00000cee, 0xff7ba100,\n    0x00000cf6, 0xff7bc200, 0x00000cff, 0xff7be200,\n    0x00001000, 0xff830000, 0x00001008, 0xff832000,\n    0x00001010, 0xff834000, 0x00001018, 0xff836100,\n    0x00001020, 0xff838100, 0x00001029, 0xff83a100,\n    0x00001031, 0xff83c200, 0x00001039, 0xff83e200,\n    0x00001041, 0xff8b0000, 0x0000104a, 0xff8b2000,\n    0x00001052, 0xff8b4000, 0x0000105a, 0xff8b6100,\n    0x00001062, 0xff8b8100, 0x0000106a, 0xff8ba100,\n    0x00001073, 0xff8bc200, 0x0000107b, 0xff8be200,\n    0x00001083, 0xff940000, 0x0000108b, 0xff942000,\n    0x00001094, 0xff944000, 0x0000109c, 0xff946100,\n    0x000010a4, 0xff948100, 0x000010ac, 0xff94a100,\n    0x000010b4, 0xff94c200, 0x000010bd, 0xff94e200,\n    0x000010c5, 0xff9c0000, 0x000010cd, 0xff9c2000,\n    0x000010d5, 0xff9c4000, 0x000010de, 0xff9c6100,\n    0x000010e6, 0xff9c8100, 0x000010ee, 0xff9ca100,\n    0x000010f6, 0xff9cc200, 0x000010ff, 0xff9ce200,\n    0x00001400, 0xffa40000, 0x00001408, 0xffa42000,\n    0x00001410, 0xffa44000, 0x00001418, 0xffa46100,\n    0x00001420, 0xffa48100, 0x00001429, 0xffa4a100,\n    0x00001431, 0xffa4c200, 0x00001439, 0xffa4e200,\n    0x00001441, 0xffac0000, 0x0000144a, 0xffac2000,\n    0x00001452, 0xffac4000, 0x0000145a, 0xffac6100,\n    0x00001462, 0xffac8100, 0x0000146a, 0xffaca100,\n    0x00001473, 0xffacc200, 0x0000147b, 0xfface200,\n    0x00001483, 0xffb40000, 0x0000148b, 0xffb42000,\n    0x00001494, 0xffb44000, 0x0000149c, 0xffb46100,\n    0x000014a4, 0xffb48100, 0x000014ac, 0xffb4a100,\n    0x000014b4, 0xffb4c200, 0x000014bd, 0xffb4e200,\n    0x000014c5, 0xffbd0000, 0x000014cd, 0xffbd2000,\n    0x000014d5, 0xffbd4000, 0x000014de, 0xffbd6100,\n    0x000014e6, 0xffbd8100, 0x000014ee, 0xffbda100,\n    0x000014f6, 0xffbdc200, 0x000014ff, 0xffbde200,\n    0x00001800, 0xffc50000, 0x00001808, 0xffc52000,\n    0x00001810, 0xffc54000, 0x00001818, 0xffc56100,\n    0x00001820, 0xffc58100, 0x00001829, 0xffc5a100,\n    0x00001831, 0xffc5c200, 0x00001839, 0xffc5e200,\n    0x00001841, 0xffcd0000, 0x0000184a, 0xffcd2000,\n    0x00001852, 0xffcd4000, 0x0000185a, 0xffcd6100,\n    0x00001862, 0xffcd8100, 0x0000186a, 0xffcda100,\n    0x00001873, 0xffcdc200, 0x0000187b, 0xffcde200,\n    0x00001883, 0xffd50000, 0x0000188b, 0xffd52000,\n    0x00001894, 0xffd54000, 0x0000189c, 0xffd56100,\n    0x000018a4, 0xffd58100, 0x000018ac, 0xffd5a100,\n    0x000018b4, 0xffd5c200, 0x000018bd, 0xffd5e200,\n    0x000018c5, 0xffde0000, 0x000018cd, 0xffde2000,\n    0x000018d5, 0xffde4000, 0x000018de, 0xffde6100,\n    0x000018e6, 0xffde8100, 0x000018ee, 0xffdea100,\n    0x000018f6, 0xffdec200, 0x000018ff, 0xffdee200,\n    0x00001c00, 0xffe60000, 0x00001c08, 0xffe62000,\n    0x00001c10, 0xffe64000, 0x00001c18, 0xffe66100,\n    0x00001c20, 0xffe68100, 0x00001c29, 0xffe6a100,\n    0x00001c31, 0xffe6c200, 0x00001c39, 0xffe6e200,\n    0x00001c41, 0xffee0000, 0x00001c4a, 0xffee2000,\n    0x00001c52, 0xffee4000, 0x00001c5a, 0xffee6100,\n    0x00001c62, 0xffee8100, 0x00001c6a, 0xffeea100,\n    0x00001c73, 0xffeec200, 0x00001c7b, 0xffeee200,\n    0x00001c83, 0xfff60000, 0x00001c8b, 0xfff62000,\n    0x00001c94, 0xfff64000, 0x00001c9c, 0xfff66100,\n    0x00001ca4, 0xfff68100, 0x00001cac, 0xfff6a100,\n    0x00001cb4, 0xfff6c200, 0x00001cbd, 0xfff6e200,\n    0x00001cc5, 0xffff0000, 0x00001ccd, 0xffff2000,\n    0x00001cd5, 0xffff4000, 0x00001cde, 0xffff6100,\n    0x00001ce6, 0xffff8100, 0x00001cee, 0xffffa100,\n    0x00001cf6, 0xffffc200, 0x00001cff, 0xffffe200\n};\n\nstatic void\nBlit_RGB565_ARGB8888(SDL_BlitInfo * info)\n{\n    Blit_RGB565_32(info, RGB565_ARGB8888_LUT);\n}\n\n/* Special optimized blit for RGB 5-6-5 --> ABGR 8-8-8-8 */\nstatic const Uint32 RGB565_ABGR8888_LUT[512] = {\n    0xff000000, 0x00000000, 0xff080000, 0x00002000,\n    0xff100000, 0x00004000, 0xff180000, 0x00006100,\n    0xff200000, 0x00008100, 0xff290000, 0x0000a100,\n    0xff310000, 0x0000c200, 0xff390000, 0x0000e200,\n    0xff410000, 0x00000008, 0xff4a0000, 0x00002008,\n    0xff520000, 0x00004008, 0xff5a0000, 0x00006108,\n    0xff620000, 0x00008108, 0xff6a0000, 0x0000a108,\n    0xff730000, 0x0000c208, 0xff7b0000, 0x0000e208,\n    0xff830000, 0x00000010, 0xff8b0000, 0x00002010,\n    0xff940000, 0x00004010, 0xff9c0000, 0x00006110,\n    0xffa40000, 0x00008110, 0xffac0000, 0x0000a110,\n    0xffb40000, 0x0000c210, 0xffbd0000, 0x0000e210,\n    0xffc50000, 0x00000018, 0xffcd0000, 0x00002018,\n    0xffd50000, 0x00004018, 0xffde0000, 0x00006118,\n    0xffe60000, 0x00008118, 0xffee0000, 0x0000a118,\n    0xfff60000, 0x0000c218, 0xffff0000, 0x0000e218,\n    0xff000400, 0x00000020, 0xff080400, 0x00002020,\n    0xff100400, 0x00004020, 0xff180400, 0x00006120,\n    0xff200400, 0x00008120, 0xff290400, 0x0000a120,\n    0xff310400, 0x0000c220, 0xff390400, 0x0000e220,\n    0xff410400, 0x00000029, 0xff4a0400, 0x00002029,\n    0xff520400, 0x00004029, 0xff5a0400, 0x00006129,\n    0xff620400, 0x00008129, 0xff6a0400, 0x0000a129,\n    0xff730400, 0x0000c229, 0xff7b0400, 0x0000e229,\n    0xff830400, 0x00000031, 0xff8b0400, 0x00002031,\n    0xff940400, 0x00004031, 0xff9c0400, 0x00006131,\n    0xffa40400, 0x00008131, 0xffac0400, 0x0000a131,\n    0xffb40400, 0x0000c231, 0xffbd0400, 0x0000e231,\n    0xffc50400, 0x00000039, 0xffcd0400, 0x00002039,\n    0xffd50400, 0x00004039, 0xffde0400, 0x00006139,\n    0xffe60400, 0x00008139, 0xffee0400, 0x0000a139,\n    0xfff60400, 0x0000c239, 0xffff0400, 0x0000e239,\n    0xff000800, 0x00000041, 0xff080800, 0x00002041,\n    0xff100800, 0x00004041, 0xff180800, 0x00006141,\n    0xff200800, 0x00008141, 0xff290800, 0x0000a141,\n    0xff310800, 0x0000c241, 0xff390800, 0x0000e241,\n    0xff410800, 0x0000004a, 0xff4a0800, 0x0000204a,\n    0xff520800, 0x0000404a, 0xff5a0800, 0x0000614a,\n    0xff620800, 0x0000814a, 0xff6a0800, 0x0000a14a,\n    0xff730800, 0x0000c24a, 0xff7b0800, 0x0000e24a,\n    0xff830800, 0x00000052, 0xff8b0800, 0x00002052,\n    0xff940800, 0x00004052, 0xff9c0800, 0x00006152,\n    0xffa40800, 0x00008152, 0xffac0800, 0x0000a152,\n    0xffb40800, 0x0000c252, 0xffbd0800, 0x0000e252,\n    0xffc50800, 0x0000005a, 0xffcd0800, 0x0000205a,\n    0xffd50800, 0x0000405a, 0xffde0800, 0x0000615a,\n    0xffe60800, 0x0000815a, 0xffee0800, 0x0000a15a,\n    0xfff60800, 0x0000c25a, 0xffff0800, 0x0000e25a,\n    0xff000c00, 0x00000062, 0xff080c00, 0x00002062,\n    0xff100c00, 0x00004062, 0xff180c00, 0x00006162,\n    0xff200c00, 0x00008162, 0xff290c00, 0x0000a162,\n    0xff310c00, 0x0000c262, 0xff390c00, 0x0000e262,\n    0xff410c00, 0x0000006a, 0xff4a0c00, 0x0000206a,\n    0xff520c00, 0x0000406a, 0xff5a0c00, 0x0000616a,\n    0xff620c00, 0x0000816a, 0xff6a0c00, 0x0000a16a,\n    0xff730c00, 0x0000c26a, 0xff7b0c00, 0x0000e26a,\n    0xff830c00, 0x00000073, 0xff8b0c00, 0x00002073,\n    0xff940c00, 0x00004073, 0xff9c0c00, 0x00006173,\n    0xffa40c00, 0x00008173, 0xffac0c00, 0x0000a173,\n    0xffb40c00, 0x0000c273, 0xffbd0c00, 0x0000e273,\n    0xffc50c00, 0x0000007b, 0xffcd0c00, 0x0000207b,\n    0xffd50c00, 0x0000407b, 0xffde0c00, 0x0000617b,\n    0xffe60c00, 0x0000817b, 0xffee0c00, 0x0000a17b,\n    0xfff60c00, 0x0000c27b, 0xffff0c00, 0x0000e27b,\n    0xff001000, 0x00000083, 0xff081000, 0x00002083,\n    0xff101000, 0x00004083, 0xff181000, 0x00006183,\n    0xff201000, 0x00008183, 0xff291000, 0x0000a183,\n    0xff311000, 0x0000c283, 0xff391000, 0x0000e283,\n    0xff411000, 0x0000008b, 0xff4a1000, 0x0000208b,\n    0xff521000, 0x0000408b, 0xff5a1000, 0x0000618b,\n    0xff621000, 0x0000818b, 0xff6a1000, 0x0000a18b,\n    0xff731000, 0x0000c28b, 0xff7b1000, 0x0000e28b,\n    0xff831000, 0x00000094, 0xff8b1000, 0x00002094,\n    0xff941000, 0x00004094, 0xff9c1000, 0x00006194,\n    0xffa41000, 0x00008194, 0xffac1000, 0x0000a194,\n    0xffb41000, 0x0000c294, 0xffbd1000, 0x0000e294,\n    0xffc51000, 0x0000009c, 0xffcd1000, 0x0000209c,\n    0xffd51000, 0x0000409c, 0xffde1000, 0x0000619c,\n    0xffe61000, 0x0000819c, 0xffee1000, 0x0000a19c,\n    0xfff61000, 0x0000c29c, 0xffff1000, 0x0000e29c,\n    0xff001400, 0x000000a4, 0xff081400, 0x000020a4,\n    0xff101400, 0x000040a4, 0xff181400, 0x000061a4,\n    0xff201400, 0x000081a4, 0xff291400, 0x0000a1a4,\n    0xff311400, 0x0000c2a4, 0xff391400, 0x0000e2a4,\n    0xff411400, 0x000000ac, 0xff4a1400, 0x000020ac,\n    0xff521400, 0x000040ac, 0xff5a1400, 0x000061ac,\n    0xff621400, 0x000081ac, 0xff6a1400, 0x0000a1ac,\n    0xff731400, 0x0000c2ac, 0xff7b1400, 0x0000e2ac,\n    0xff831400, 0x000000b4, 0xff8b1400, 0x000020b4,\n    0xff941400, 0x000040b4, 0xff9c1400, 0x000061b4,\n    0xffa41400, 0x000081b4, 0xffac1400, 0x0000a1b4,\n    0xffb41400, 0x0000c2b4, 0xffbd1400, 0x0000e2b4,\n    0xffc51400, 0x000000bd, 0xffcd1400, 0x000020bd,\n    0xffd51400, 0x000040bd, 0xffde1400, 0x000061bd,\n    0xffe61400, 0x000081bd, 0xffee1400, 0x0000a1bd,\n    0xfff61400, 0x0000c2bd, 0xffff1400, 0x0000e2bd,\n    0xff001800, 0x000000c5, 0xff081800, 0x000020c5,\n    0xff101800, 0x000040c5, 0xff181800, 0x000061c5,\n    0xff201800, 0x000081c5, 0xff291800, 0x0000a1c5,\n    0xff311800, 0x0000c2c5, 0xff391800, 0x0000e2c5,\n    0xff411800, 0x000000cd, 0xff4a1800, 0x000020cd,\n    0xff521800, 0x000040cd, 0xff5a1800, 0x000061cd,\n    0xff621800, 0x000081cd, 0xff6a1800, 0x0000a1cd,\n    0xff731800, 0x0000c2cd, 0xff7b1800, 0x0000e2cd,\n    0xff831800, 0x000000d5, 0xff8b1800, 0x000020d5,\n    0xff941800, 0x000040d5, 0xff9c1800, 0x000061d5,\n    0xffa41800, 0x000081d5, 0xffac1800, 0x0000a1d5,\n    0xffb41800, 0x0000c2d5, 0xffbd1800, 0x0000e2d5,\n    0xffc51800, 0x000000de, 0xffcd1800, 0x000020de,\n    0xffd51800, 0x000040de, 0xffde1800, 0x000061de,\n    0xffe61800, 0x000081de, 0xffee1800, 0x0000a1de,\n    0xfff61800, 0x0000c2de, 0xffff1800, 0x0000e2de,\n    0xff001c00, 0x000000e6, 0xff081c00, 0x000020e6,\n    0xff101c00, 0x000040e6, 0xff181c00, 0x000061e6,\n    0xff201c00, 0x000081e6, 0xff291c00, 0x0000a1e6,\n    0xff311c00, 0x0000c2e6, 0xff391c00, 0x0000e2e6,\n    0xff411c00, 0x000000ee, 0xff4a1c00, 0x000020ee,\n    0xff521c00, 0x000040ee, 0xff5a1c00, 0x000061ee,\n    0xff621c00, 0x000081ee, 0xff6a1c00, 0x0000a1ee,\n    0xff731c00, 0x0000c2ee, 0xff7b1c00, 0x0000e2ee,\n    0xff831c00, 0x000000f6, 0xff8b1c00, 0x000020f6,\n    0xff941c00, 0x000040f6, 0xff9c1c00, 0x000061f6,\n    0xffa41c00, 0x000081f6, 0xffac1c00, 0x0000a1f6,\n    0xffb41c00, 0x0000c2f6, 0xffbd1c00, 0x0000e2f6,\n    0xffc51c00, 0x000000ff, 0xffcd1c00, 0x000020ff,\n    0xffd51c00, 0x000040ff, 0xffde1c00, 0x000061ff,\n    0xffe61c00, 0x000081ff, 0xffee1c00, 0x0000a1ff,\n    0xfff61c00, 0x0000c2ff, 0xffff1c00, 0x0000e2ff\n};\n\nstatic void\nBlit_RGB565_ABGR8888(SDL_BlitInfo * info)\n{\n    Blit_RGB565_32(info, RGB565_ABGR8888_LUT);\n}\n\n/* Special optimized blit for RGB 5-6-5 --> RGBA 8-8-8-8 */\nstatic const Uint32 RGB565_RGBA8888_LUT[512] = {\n    0x000000ff, 0x00000000, 0x000008ff, 0x00200000,\n    0x000010ff, 0x00400000, 0x000018ff, 0x00610000,\n    0x000020ff, 0x00810000, 0x000029ff, 0x00a10000,\n    0x000031ff, 0x00c20000, 0x000039ff, 0x00e20000,\n    0x000041ff, 0x08000000, 0x00004aff, 0x08200000,\n    0x000052ff, 0x08400000, 0x00005aff, 0x08610000,\n    0x000062ff, 0x08810000, 0x00006aff, 0x08a10000,\n    0x000073ff, 0x08c20000, 0x00007bff, 0x08e20000,\n    0x000083ff, 0x10000000, 0x00008bff, 0x10200000,\n    0x000094ff, 0x10400000, 0x00009cff, 0x10610000,\n    0x0000a4ff, 0x10810000, 0x0000acff, 0x10a10000,\n    0x0000b4ff, 0x10c20000, 0x0000bdff, 0x10e20000,\n    0x0000c5ff, 0x18000000, 0x0000cdff, 0x18200000,\n    0x0000d5ff, 0x18400000, 0x0000deff, 0x18610000,\n    0x0000e6ff, 0x18810000, 0x0000eeff, 0x18a10000,\n    0x0000f6ff, 0x18c20000, 0x0000ffff, 0x18e20000,\n    0x000400ff, 0x20000000, 0x000408ff, 0x20200000,\n    0x000410ff, 0x20400000, 0x000418ff, 0x20610000,\n    0x000420ff, 0x20810000, 0x000429ff, 0x20a10000,\n    0x000431ff, 0x20c20000, 0x000439ff, 0x20e20000,\n    0x000441ff, 0x29000000, 0x00044aff, 0x29200000,\n    0x000452ff, 0x29400000, 0x00045aff, 0x29610000,\n    0x000462ff, 0x29810000, 0x00046aff, 0x29a10000,\n    0x000473ff, 0x29c20000, 0x00047bff, 0x29e20000,\n    0x000483ff, 0x31000000, 0x00048bff, 0x31200000,\n    0x000494ff, 0x31400000, 0x00049cff, 0x31610000,\n    0x0004a4ff, 0x31810000, 0x0004acff, 0x31a10000,\n    0x0004b4ff, 0x31c20000, 0x0004bdff, 0x31e20000,\n    0x0004c5ff, 0x39000000, 0x0004cdff, 0x39200000,\n    0x0004d5ff, 0x39400000, 0x0004deff, 0x39610000,\n    0x0004e6ff, 0x39810000, 0x0004eeff, 0x39a10000,\n    0x0004f6ff, 0x39c20000, 0x0004ffff, 0x39e20000,\n    0x000800ff, 0x41000000, 0x000808ff, 0x41200000,\n    0x000810ff, 0x41400000, 0x000818ff, 0x41610000,\n    0x000820ff, 0x41810000, 0x000829ff, 0x41a10000,\n    0x000831ff, 0x41c20000, 0x000839ff, 0x41e20000,\n    0x000841ff, 0x4a000000, 0x00084aff, 0x4a200000,\n    0x000852ff, 0x4a400000, 0x00085aff, 0x4a610000,\n    0x000862ff, 0x4a810000, 0x00086aff, 0x4aa10000,\n    0x000873ff, 0x4ac20000, 0x00087bff, 0x4ae20000,\n    0x000883ff, 0x52000000, 0x00088bff, 0x52200000,\n    0x000894ff, 0x52400000, 0x00089cff, 0x52610000,\n    0x0008a4ff, 0x52810000, 0x0008acff, 0x52a10000,\n    0x0008b4ff, 0x52c20000, 0x0008bdff, 0x52e20000,\n    0x0008c5ff, 0x5a000000, 0x0008cdff, 0x5a200000,\n    0x0008d5ff, 0x5a400000, 0x0008deff, 0x5a610000,\n    0x0008e6ff, 0x5a810000, 0x0008eeff, 0x5aa10000,\n    0x0008f6ff, 0x5ac20000, 0x0008ffff, 0x5ae20000,\n    0x000c00ff, 0x62000000, 0x000c08ff, 0x62200000,\n    0x000c10ff, 0x62400000, 0x000c18ff, 0x62610000,\n    0x000c20ff, 0x62810000, 0x000c29ff, 0x62a10000,\n    0x000c31ff, 0x62c20000, 0x000c39ff, 0x62e20000,\n    0x000c41ff, 0x6a000000, 0x000c4aff, 0x6a200000,\n    0x000c52ff, 0x6a400000, 0x000c5aff, 0x6a610000,\n    0x000c62ff, 0x6a810000, 0x000c6aff, 0x6aa10000,\n    0x000c73ff, 0x6ac20000, 0x000c7bff, 0x6ae20000,\n    0x000c83ff, 0x73000000, 0x000c8bff, 0x73200000,\n    0x000c94ff, 0x73400000, 0x000c9cff, 0x73610000,\n    0x000ca4ff, 0x73810000, 0x000cacff, 0x73a10000,\n    0x000cb4ff, 0x73c20000, 0x000cbdff, 0x73e20000,\n    0x000cc5ff, 0x7b000000, 0x000ccdff, 0x7b200000,\n    0x000cd5ff, 0x7b400000, 0x000cdeff, 0x7b610000,\n    0x000ce6ff, 0x7b810000, 0x000ceeff, 0x7ba10000,\n    0x000cf6ff, 0x7bc20000, 0x000cffff, 0x7be20000,\n    0x001000ff, 0x83000000, 0x001008ff, 0x83200000,\n    0x001010ff, 0x83400000, 0x001018ff, 0x83610000,\n    0x001020ff, 0x83810000, 0x001029ff, 0x83a10000,\n    0x001031ff, 0x83c20000, 0x001039ff, 0x83e20000,\n    0x001041ff, 0x8b000000, 0x00104aff, 0x8b200000,\n    0x001052ff, 0x8b400000, 0x00105aff, 0x8b610000,\n    0x001062ff, 0x8b810000, 0x00106aff, 0x8ba10000,\n    0x001073ff, 0x8bc20000, 0x00107bff, 0x8be20000,\n    0x001083ff, 0x94000000, 0x00108bff, 0x94200000,\n    0x001094ff, 0x94400000, 0x00109cff, 0x94610000,\n    0x0010a4ff, 0x94810000, 0x0010acff, 0x94a10000,\n    0x0010b4ff, 0x94c20000, 0x0010bdff, 0x94e20000,\n    0x0010c5ff, 0x9c000000, 0x0010cdff, 0x9c200000,\n    0x0010d5ff, 0x9c400000, 0x0010deff, 0x9c610000,\n    0x0010e6ff, 0x9c810000, 0x0010eeff, 0x9ca10000,\n    0x0010f6ff, 0x9cc20000, 0x0010ffff, 0x9ce20000,\n    0x001400ff, 0xa4000000, 0x001408ff, 0xa4200000,\n    0x001410ff, 0xa4400000, 0x001418ff, 0xa4610000,\n    0x001420ff, 0xa4810000, 0x001429ff, 0xa4a10000,\n    0x001431ff, 0xa4c20000, 0x001439ff, 0xa4e20000,\n    0x001441ff, 0xac000000, 0x00144aff, 0xac200000,\n    0x001452ff, 0xac400000, 0x00145aff, 0xac610000,\n    0x001462ff, 0xac810000, 0x00146aff, 0xaca10000,\n    0x001473ff, 0xacc20000, 0x00147bff, 0xace20000,\n    0x001483ff, 0xb4000000, 0x00148bff, 0xb4200000,\n    0x001494ff, 0xb4400000, 0x00149cff, 0xb4610000,\n    0x0014a4ff, 0xb4810000, 0x0014acff, 0xb4a10000,\n    0x0014b4ff, 0xb4c20000, 0x0014bdff, 0xb4e20000,\n    0x0014c5ff, 0xbd000000, 0x0014cdff, 0xbd200000,\n    0x0014d5ff, 0xbd400000, 0x0014deff, 0xbd610000,\n    0x0014e6ff, 0xbd810000, 0x0014eeff, 0xbda10000,\n    0x0014f6ff, 0xbdc20000, 0x0014ffff, 0xbde20000,\n    0x001800ff, 0xc5000000, 0x001808ff, 0xc5200000,\n    0x001810ff, 0xc5400000, 0x001818ff, 0xc5610000,\n    0x001820ff, 0xc5810000, 0x001829ff, 0xc5a10000,\n    0x001831ff, 0xc5c20000, 0x001839ff, 0xc5e20000,\n    0x001841ff, 0xcd000000, 0x00184aff, 0xcd200000,\n    0x001852ff, 0xcd400000, 0x00185aff, 0xcd610000,\n    0x001862ff, 0xcd810000, 0x00186aff, 0xcda10000,\n    0x001873ff, 0xcdc20000, 0x00187bff, 0xcde20000,\n    0x001883ff, 0xd5000000, 0x00188bff, 0xd5200000,\n    0x001894ff, 0xd5400000, 0x00189cff, 0xd5610000,\n    0x0018a4ff, 0xd5810000, 0x0018acff, 0xd5a10000,\n    0x0018b4ff, 0xd5c20000, 0x0018bdff, 0xd5e20000,\n    0x0018c5ff, 0xde000000, 0x0018cdff, 0xde200000,\n    0x0018d5ff, 0xde400000, 0x0018deff, 0xde610000,\n    0x0018e6ff, 0xde810000, 0x0018eeff, 0xdea10000,\n    0x0018f6ff, 0xdec20000, 0x0018ffff, 0xdee20000,\n    0x001c00ff, 0xe6000000, 0x001c08ff, 0xe6200000,\n    0x001c10ff, 0xe6400000, 0x001c18ff, 0xe6610000,\n    0x001c20ff, 0xe6810000, 0x001c29ff, 0xe6a10000,\n    0x001c31ff, 0xe6c20000, 0x001c39ff, 0xe6e20000,\n    0x001c41ff, 0xee000000, 0x001c4aff, 0xee200000,\n    0x001c52ff, 0xee400000, 0x001c5aff, 0xee610000,\n    0x001c62ff, 0xee810000, 0x001c6aff, 0xeea10000,\n    0x001c73ff, 0xeec20000, 0x001c7bff, 0xeee20000,\n    0x001c83ff, 0xf6000000, 0x001c8bff, 0xf6200000,\n    0x001c94ff, 0xf6400000, 0x001c9cff, 0xf6610000,\n    0x001ca4ff, 0xf6810000, 0x001cacff, 0xf6a10000,\n    0x001cb4ff, 0xf6c20000, 0x001cbdff, 0xf6e20000,\n    0x001cc5ff, 0xff000000, 0x001ccdff, 0xff200000,\n    0x001cd5ff, 0xff400000, 0x001cdeff, 0xff610000,\n    0x001ce6ff, 0xff810000, 0x001ceeff, 0xffa10000,\n    0x001cf6ff, 0xffc20000, 0x001cffff, 0xffe20000,\n};\n\nstatic void\nBlit_RGB565_RGBA8888(SDL_BlitInfo * info)\n{\n    Blit_RGB565_32(info, RGB565_RGBA8888_LUT);\n}\n\n/* Special optimized blit for RGB 5-6-5 --> BGRA 8-8-8-8 */\nstatic const Uint32 RGB565_BGRA8888_LUT[512] = {\n    0x00000000, 0x000000ff, 0x08000000, 0x002000ff,\n    0x10000000, 0x004000ff, 0x18000000, 0x006100ff,\n    0x20000000, 0x008100ff, 0x29000000, 0x00a100ff,\n    0x31000000, 0x00c200ff, 0x39000000, 0x00e200ff,\n    0x41000000, 0x000008ff, 0x4a000000, 0x002008ff,\n    0x52000000, 0x004008ff, 0x5a000000, 0x006108ff,\n    0x62000000, 0x008108ff, 0x6a000000, 0x00a108ff,\n    0x73000000, 0x00c208ff, 0x7b000000, 0x00e208ff,\n    0x83000000, 0x000010ff, 0x8b000000, 0x002010ff,\n    0x94000000, 0x004010ff, 0x9c000000, 0x006110ff,\n    0xa4000000, 0x008110ff, 0xac000000, 0x00a110ff,\n    0xb4000000, 0x00c210ff, 0xbd000000, 0x00e210ff,\n    0xc5000000, 0x000018ff, 0xcd000000, 0x002018ff,\n    0xd5000000, 0x004018ff, 0xde000000, 0x006118ff,\n    0xe6000000, 0x008118ff, 0xee000000, 0x00a118ff,\n    0xf6000000, 0x00c218ff, 0xff000000, 0x00e218ff,\n    0x00040000, 0x000020ff, 0x08040000, 0x002020ff,\n    0x10040000, 0x004020ff, 0x18040000, 0x006120ff,\n    0x20040000, 0x008120ff, 0x29040000, 0x00a120ff,\n    0x31040000, 0x00c220ff, 0x39040000, 0x00e220ff,\n    0x41040000, 0x000029ff, 0x4a040000, 0x002029ff,\n    0x52040000, 0x004029ff, 0x5a040000, 0x006129ff,\n    0x62040000, 0x008129ff, 0x6a040000, 0x00a129ff,\n    0x73040000, 0x00c229ff, 0x7b040000, 0x00e229ff,\n    0x83040000, 0x000031ff, 0x8b040000, 0x002031ff,\n    0x94040000, 0x004031ff, 0x9c040000, 0x006131ff,\n    0xa4040000, 0x008131ff, 0xac040000, 0x00a131ff,\n    0xb4040000, 0x00c231ff, 0xbd040000, 0x00e231ff,\n    0xc5040000, 0x000039ff, 0xcd040000, 0x002039ff,\n    0xd5040000, 0x004039ff, 0xde040000, 0x006139ff,\n    0xe6040000, 0x008139ff, 0xee040000, 0x00a139ff,\n    0xf6040000, 0x00c239ff, 0xff040000, 0x00e239ff,\n    0x00080000, 0x000041ff, 0x08080000, 0x002041ff,\n    0x10080000, 0x004041ff, 0x18080000, 0x006141ff,\n    0x20080000, 0x008141ff, 0x29080000, 0x00a141ff,\n    0x31080000, 0x00c241ff, 0x39080000, 0x00e241ff,\n    0x41080000, 0x00004aff, 0x4a080000, 0x00204aff,\n    0x52080000, 0x00404aff, 0x5a080000, 0x00614aff,\n    0x62080000, 0x00814aff, 0x6a080000, 0x00a14aff,\n    0x73080000, 0x00c24aff, 0x7b080000, 0x00e24aff,\n    0x83080000, 0x000052ff, 0x8b080000, 0x002052ff,\n    0x94080000, 0x004052ff, 0x9c080000, 0x006152ff,\n    0xa4080000, 0x008152ff, 0xac080000, 0x00a152ff,\n    0xb4080000, 0x00c252ff, 0xbd080000, 0x00e252ff,\n    0xc5080000, 0x00005aff, 0xcd080000, 0x00205aff,\n    0xd5080000, 0x00405aff, 0xde080000, 0x00615aff,\n    0xe6080000, 0x00815aff, 0xee080000, 0x00a15aff,\n    0xf6080000, 0x00c25aff, 0xff080000, 0x00e25aff,\n    0x000c0000, 0x000062ff, 0x080c0000, 0x002062ff,\n    0x100c0000, 0x004062ff, 0x180c0000, 0x006162ff,\n    0x200c0000, 0x008162ff, 0x290c0000, 0x00a162ff,\n    0x310c0000, 0x00c262ff, 0x390c0000, 0x00e262ff,\n    0x410c0000, 0x00006aff, 0x4a0c0000, 0x00206aff,\n    0x520c0000, 0x00406aff, 0x5a0c0000, 0x00616aff,\n    0x620c0000, 0x00816aff, 0x6a0c0000, 0x00a16aff,\n    0x730c0000, 0x00c26aff, 0x7b0c0000, 0x00e26aff,\n    0x830c0000, 0x000073ff, 0x8b0c0000, 0x002073ff,\n    0x940c0000, 0x004073ff, 0x9c0c0000, 0x006173ff,\n    0xa40c0000, 0x008173ff, 0xac0c0000, 0x00a173ff,\n    0xb40c0000, 0x00c273ff, 0xbd0c0000, 0x00e273ff,\n    0xc50c0000, 0x00007bff, 0xcd0c0000, 0x00207bff,\n    0xd50c0000, 0x00407bff, 0xde0c0000, 0x00617bff,\n    0xe60c0000, 0x00817bff, 0xee0c0000, 0x00a17bff,\n    0xf60c0000, 0x00c27bff, 0xff0c0000, 0x00e27bff,\n    0x00100000, 0x000083ff, 0x08100000, 0x002083ff,\n    0x10100000, 0x004083ff, 0x18100000, 0x006183ff,\n    0x20100000, 0x008183ff, 0x29100000, 0x00a183ff,\n    0x31100000, 0x00c283ff, 0x39100000, 0x00e283ff,\n    0x41100000, 0x00008bff, 0x4a100000, 0x00208bff,\n    0x52100000, 0x00408bff, 0x5a100000, 0x00618bff,\n    0x62100000, 0x00818bff, 0x6a100000, 0x00a18bff,\n    0x73100000, 0x00c28bff, 0x7b100000, 0x00e28bff,\n    0x83100000, 0x000094ff, 0x8b100000, 0x002094ff,\n    0x94100000, 0x004094ff, 0x9c100000, 0x006194ff,\n    0xa4100000, 0x008194ff, 0xac100000, 0x00a194ff,\n    0xb4100000, 0x00c294ff, 0xbd100000, 0x00e294ff,\n    0xc5100000, 0x00009cff, 0xcd100000, 0x00209cff,\n    0xd5100000, 0x00409cff, 0xde100000, 0x00619cff,\n    0xe6100000, 0x00819cff, 0xee100000, 0x00a19cff,\n    0xf6100000, 0x00c29cff, 0xff100000, 0x00e29cff,\n    0x00140000, 0x0000a4ff, 0x08140000, 0x0020a4ff,\n    0x10140000, 0x0040a4ff, 0x18140000, 0x0061a4ff,\n    0x20140000, 0x0081a4ff, 0x29140000, 0x00a1a4ff,\n    0x31140000, 0x00c2a4ff, 0x39140000, 0x00e2a4ff,\n    0x41140000, 0x0000acff, 0x4a140000, 0x0020acff,\n    0x52140000, 0x0040acff, 0x5a140000, 0x0061acff,\n    0x62140000, 0x0081acff, 0x6a140000, 0x00a1acff,\n    0x73140000, 0x00c2acff, 0x7b140000, 0x00e2acff,\n    0x83140000, 0x0000b4ff, 0x8b140000, 0x0020b4ff,\n    0x94140000, 0x0040b4ff, 0x9c140000, 0x0061b4ff,\n    0xa4140000, 0x0081b4ff, 0xac140000, 0x00a1b4ff,\n    0xb4140000, 0x00c2b4ff, 0xbd140000, 0x00e2b4ff,\n    0xc5140000, 0x0000bdff, 0xcd140000, 0x0020bdff,\n    0xd5140000, 0x0040bdff, 0xde140000, 0x0061bdff,\n    0xe6140000, 0x0081bdff, 0xee140000, 0x00a1bdff,\n    0xf6140000, 0x00c2bdff, 0xff140000, 0x00e2bdff,\n    0x00180000, 0x0000c5ff, 0x08180000, 0x0020c5ff,\n    0x10180000, 0x0040c5ff, 0x18180000, 0x0061c5ff,\n    0x20180000, 0x0081c5ff, 0x29180000, 0x00a1c5ff,\n    0x31180000, 0x00c2c5ff, 0x39180000, 0x00e2c5ff,\n    0x41180000, 0x0000cdff, 0x4a180000, 0x0020cdff,\n    0x52180000, 0x0040cdff, 0x5a180000, 0x0061cdff,\n    0x62180000, 0x0081cdff, 0x6a180000, 0x00a1cdff,\n    0x73180000, 0x00c2cdff, 0x7b180000, 0x00e2cdff,\n    0x83180000, 0x0000d5ff, 0x8b180000, 0x0020d5ff,\n    0x94180000, 0x0040d5ff, 0x9c180000, 0x0061d5ff,\n    0xa4180000, 0x0081d5ff, 0xac180000, 0x00a1d5ff,\n    0xb4180000, 0x00c2d5ff, 0xbd180000, 0x00e2d5ff,\n    0xc5180000, 0x0000deff, 0xcd180000, 0x0020deff,\n    0xd5180000, 0x0040deff, 0xde180000, 0x0061deff,\n    0xe6180000, 0x0081deff, 0xee180000, 0x00a1deff,\n    0xf6180000, 0x00c2deff, 0xff180000, 0x00e2deff,\n    0x001c0000, 0x0000e6ff, 0x081c0000, 0x0020e6ff,\n    0x101c0000, 0x0040e6ff, 0x181c0000, 0x0061e6ff,\n    0x201c0000, 0x0081e6ff, 0x291c0000, 0x00a1e6ff,\n    0x311c0000, 0x00c2e6ff, 0x391c0000, 0x00e2e6ff,\n    0x411c0000, 0x0000eeff, 0x4a1c0000, 0x0020eeff,\n    0x521c0000, 0x0040eeff, 0x5a1c0000, 0x0061eeff,\n    0x621c0000, 0x0081eeff, 0x6a1c0000, 0x00a1eeff,\n    0x731c0000, 0x00c2eeff, 0x7b1c0000, 0x00e2eeff,\n    0x831c0000, 0x0000f6ff, 0x8b1c0000, 0x0020f6ff,\n    0x941c0000, 0x0040f6ff, 0x9c1c0000, 0x0061f6ff,\n    0xa41c0000, 0x0081f6ff, 0xac1c0000, 0x00a1f6ff,\n    0xb41c0000, 0x00c2f6ff, 0xbd1c0000, 0x00e2f6ff,\n    0xc51c0000, 0x0000ffff, 0xcd1c0000, 0x0020ffff,\n    0xd51c0000, 0x0040ffff, 0xde1c0000, 0x0061ffff,\n    0xe61c0000, 0x0081ffff, 0xee1c0000, 0x00a1ffff,\n    0xf61c0000, 0x00c2ffff, 0xff1c0000, 0x00e2ffff\n};\n\nstatic void\nBlit_RGB565_BGRA8888(SDL_BlitInfo * info)\n{\n    Blit_RGB565_32(info, RGB565_BGRA8888_LUT);\n}\n\nstatic void\nBlitNto1(SDL_BlitInfo * info)\n{\n#ifndef USE_DUFFS_LOOP\n    int c;\n#endif\n    int width, height;\n    Uint8 *src;\n    const Uint8 *map;\n    Uint8 *dst;\n    int srcskip, dstskip;\n    int srcbpp;\n    Uint32 Pixel;\n    int sR, sG, sB;\n    SDL_PixelFormat *srcfmt;\n\n    /* Set up some basic variables */\n    width = info->dst_w;\n    height = info->dst_h;\n    src = info->src;\n    srcskip = info->src_skip;\n    dst = info->dst;\n    dstskip = info->dst_skip;\n    map = info->table;\n    srcfmt = info->src_fmt;\n    srcbpp = srcfmt->BytesPerPixel;\n\n    if (map == NULL) {\n        while (height--) {\n#ifdef USE_DUFFS_LOOP\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n                DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel,\n                                sR, sG, sB);\n                if ( 1 ) {\n                    /* Pack RGB into 8bit pixel */\n                    *dst = ((sR>>5)<<(3+2))|\n                            ((sG>>5)<<(2)) |\n                            ((sB>>6)<<(0)) ;\n                }\n                dst++;\n                src += srcbpp;\n            , width);\n            /* *INDENT-ON* */\n#else\n            for (c = width; c; --c) {\n                DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);\n                if (1) {\n                    /* Pack RGB into 8bit pixel */\n                    *dst = ((sR >> 5) << (3 + 2)) |\n                        ((sG >> 5) << (2)) | ((sB >> 6) << (0));\n                }\n                dst++;\n                src += srcbpp;\n            }\n#endif\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        while (height--) {\n#ifdef USE_DUFFS_LOOP\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n                DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel,\n                                sR, sG, sB);\n                if ( 1 ) {\n                    /* Pack RGB into 8bit pixel */\n                    *dst = map[((sR>>5)<<(3+2))|\n                           ((sG>>5)<<(2))  |\n                           ((sB>>6)<<(0))  ];\n                }\n                dst++;\n                src += srcbpp;\n            , width);\n            /* *INDENT-ON* */\n#else\n            for (c = width; c; --c) {\n                DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);\n                if (1) {\n                    /* Pack RGB into 8bit pixel */\n                    *dst = map[((sR >> 5) << (3 + 2)) |\n                               ((sG >> 5) << (2)) | ((sB >> 6) << (0))];\n                }\n                dst++;\n                src += srcbpp;\n            }\n#endif /* USE_DUFFS_LOOP */\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n}\n\n/* blits 32 bit RGB<->RGBA with both surfaces having the same R,G,B fields */\nstatic void\nBlit4to4MaskAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint32 *src = (Uint32 *) info->src;\n    int srcskip = info->src_skip;\n    Uint32 *dst = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n\n    if (dstfmt->Amask) {\n        /* RGB->RGBA, SET_ALPHA */\n        Uint32 mask = (info->a >> dstfmt->Aloss) << dstfmt->Ashift;\n\n        while (height--) {\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n            {\n                *dst = *src | mask;\n                ++dst;\n                ++src;\n            },\n            width);\n            /* *INDENT-ON* */\n            src = (Uint32 *) ((Uint8 *) src + srcskip);\n            dst = (Uint32 *) ((Uint8 *) dst + dstskip);\n        }\n    } else {\n        /* RGBA->RGB, NO_ALPHA */\n        Uint32 mask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask;\n\n        while (height--) {\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n            {\n                *dst = *src & mask;\n                ++dst;\n                ++src;\n            },\n            width);\n            /* *INDENT-ON* */\n            src = (Uint32 *) ((Uint8 *) src + srcskip);\n            dst = (Uint32 *) ((Uint8 *) dst + dstskip);\n        }\n    }\n}\n\n/* blits 32 bit RGBA<->RGBA with both surfaces having the same R,G,B,A fields */\nstatic void\nBlit4to4CopyAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint32 *src = (Uint32 *) info->src;\n    int srcskip = info->src_skip;\n    Uint32 *dst = (Uint32 *) info->dst;\n    int dstskip = info->dst_skip;\n\n    /* RGBA->RGBA, COPY_ALPHA */\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n        {\n            *dst = *src;\n            ++dst;\n            ++src;\n        },\n        width);\n        /* *INDENT-ON* */\n        src = (Uint32 *) ((Uint8 *) src + srcskip);\n        dst = (Uint32 *) ((Uint8 *) dst + dstskip);\n    }\n}\n\nstatic void\nBlitNtoN(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    int srcbpp = srcfmt->BytesPerPixel;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int dstbpp = dstfmt->BytesPerPixel;\n    unsigned alpha = dstfmt->Amask ? info->a : 0;\n\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n        {\n            Uint32 Pixel;\n            unsigned sR;\n            unsigned sG;\n            unsigned sB;\n            DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);\n            ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, alpha);\n            dst += dstbpp;\n            src += srcbpp;\n        },\n        width);\n        /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlitNtoNCopyAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    int srcbpp = srcfmt->BytesPerPixel;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int dstbpp = dstfmt->BytesPerPixel;\n    int c;\n\n    while (height--) {\n        for (c = width; c; --c) {\n            Uint32 Pixel;\n            unsigned sR, sG, sB, sA;\n            DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA);\n            ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, sA);\n            dst += dstbpp;\n            src += srcbpp;\n        }\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlitNto1Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    const Uint8 *palmap = info->table;\n    Uint32 ckey = info->colorkey;\n    Uint32 rgbmask = ~srcfmt->Amask;\n    int srcbpp;\n    Uint32 Pixel;\n    unsigned sR, sG, sB;\n\n    /* Set up some basic variables */\n    srcbpp = srcfmt->BytesPerPixel;\n    ckey &= rgbmask;\n\n    if (palmap == NULL) {\n        while (height--) {\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n            {\n                DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel,\n                                sR, sG, sB);\n                if ( (Pixel & rgbmask) != ckey ) {\n                    /* Pack RGB into 8bit pixel */\n                    *dst = (Uint8)(((sR>>5)<<(3+2))|\n                                   ((sG>>5)<<(2)) |\n                                   ((sB>>6)<<(0)));\n                }\n                dst++;\n                src += srcbpp;\n            },\n            width);\n            /* *INDENT-ON* */\n            src += srcskip;\n            dst += dstskip;\n        }\n    } else {\n        while (height--) {\n            /* *INDENT-OFF* */\n            DUFFS_LOOP(\n            {\n                DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel,\n                                sR, sG, sB);\n                if ( (Pixel & rgbmask) != ckey ) {\n                    /* Pack RGB into 8bit pixel */\n                    *dst = (Uint8)palmap[((sR>>5)<<(3+2))|\n                                         ((sG>>5)<<(2))  |\n                                         ((sB>>6)<<(0))  ];\n                }\n                dst++;\n                src += srcbpp;\n            },\n            width);\n            /* *INDENT-ON* */\n            src += srcskip;\n            dst += dstskip;\n        }\n    }\n}\n\nstatic void\nBlit2to2Key(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint16 *srcp = (Uint16 *) info->src;\n    int srcskip = info->src_skip;\n    Uint16 *dstp = (Uint16 *) info->dst;\n    int dstskip = info->dst_skip;\n    Uint32 ckey = info->colorkey;\n    Uint32 rgbmask = ~info->src_fmt->Amask;\n\n    /* Set up some basic variables */\n    srcskip /= 2;\n    dstskip /= 2;\n    ckey &= rgbmask;\n\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n        {\n            if ( (*srcp & rgbmask) != ckey ) {\n                *dstp = *srcp;\n            }\n            dstp++;\n            srcp++;\n        },\n        width);\n        /* *INDENT-ON* */\n        srcp += srcskip;\n        dstp += dstskip;\n    }\n}\n\nstatic void\nBlitNtoNKey(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    Uint32 ckey = info->colorkey;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int srcbpp = srcfmt->BytesPerPixel;\n    int dstbpp = dstfmt->BytesPerPixel;\n    unsigned alpha = dstfmt->Amask ? info->a : 0;\n    Uint32 rgbmask = ~srcfmt->Amask;\n\n    /* Set up some basic variables */\n    ckey &= rgbmask;\n\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n        {\n            Uint32 Pixel;\n            unsigned sR;\n            unsigned sG;\n            unsigned sB;\n            RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel);\n            if ( (Pixel & rgbmask) != ckey ) {\n                RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB);\n                ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, alpha);\n            }\n            dst += dstbpp;\n            src += srcbpp;\n        },\n        width);\n        /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\nstatic void\nBlitNtoNKeyCopyAlpha(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    Uint32 ckey = info->colorkey;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    Uint32 rgbmask = ~srcfmt->Amask;\n\n    Uint8 srcbpp;\n    Uint8 dstbpp;\n    Uint32 Pixel;\n    unsigned sR, sG, sB, sA;\n\n    /* Set up some basic variables */\n    srcbpp = srcfmt->BytesPerPixel;\n    dstbpp = dstfmt->BytesPerPixel;\n    ckey &= rgbmask;\n\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n        {\n            DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA);\n            if ( (Pixel & rgbmask) != ckey ) {\n                  ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, sA);\n            }\n            dst += dstbpp;\n            src += srcbpp;\n        },\n        width);\n        /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n/* Special optimized blit for ARGB 2-10-10-10 --> RGBA */\nstatic void\nBlit2101010toN(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *dstfmt = info->dst_fmt;\n    int dstbpp = dstfmt->BytesPerPixel;\n    Uint32 Pixel;\n    unsigned sR, sG, sB, sA;\n\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n        {\n            Pixel = *(Uint32 *)src;\n            RGBA_FROM_ARGB2101010(Pixel, sR, sG, sB, sA);\n            ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, sA);\n            dst += dstbpp;\n            src += 4;\n        },\n        width);\n        /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n/* Special optimized blit for RGBA --> ARGB 2-10-10-10 */\nstatic void\nBlitNto2101010(SDL_BlitInfo * info)\n{\n    int width = info->dst_w;\n    int height = info->dst_h;\n    Uint8 *src = info->src;\n    int srcskip = info->src_skip;\n    Uint8 *dst = info->dst;\n    int dstskip = info->dst_skip;\n    SDL_PixelFormat *srcfmt = info->src_fmt;\n    int srcbpp = srcfmt->BytesPerPixel;\n    Uint32 Pixel;\n    unsigned sR, sG, sB, sA;\n\n    while (height--) {\n        /* *INDENT-OFF* */\n        DUFFS_LOOP(\n        {\n            DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA);\n            ARGB2101010_FROM_RGBA(Pixel, sR, sG, sB, sA);\n            *(Uint32 *)dst = Pixel;\n            dst += 4;\n            src += srcbpp;\n        },\n        width);\n        /* *INDENT-ON* */\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n/* Normal N to N optimized blitters */\nstruct blit_table\n{\n    Uint32 srcR, srcG, srcB;\n    int dstbpp;\n    Uint32 dstR, dstG, dstB;\n    Uint32 blit_features;\n    SDL_BlitFunc blitfunc;\n    enum\n    { NO_ALPHA = 1, SET_ALPHA = 2, COPY_ALPHA = 4 } alpha;\n};\nstatic const struct blit_table normal_blit_1[] = {\n    /* Default for 8-bit RGB source, never optimized */\n    {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0}\n};\n\nstatic const struct blit_table normal_blit_2[] = {\n#if SDL_ALTIVEC_BLITTERS\n    /* has-altivec */\n    {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x00000000, 0x00000000, 0x00000000,\n     2, Blit_RGB565_32Altivec, NO_ALPHA | COPY_ALPHA | SET_ALPHA},\n    {0x00007C00, 0x000003E0, 0x0000001F, 4, 0x00000000, 0x00000000, 0x00000000,\n     2, Blit_RGB555_32Altivec, NO_ALPHA | COPY_ALPHA | SET_ALPHA},\n#endif\n    {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x00FF0000, 0x0000FF00, 0x000000FF,\n     0, Blit_RGB565_ARGB8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA},\n    {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x000000FF, 0x0000FF00, 0x00FF0000,\n     0, Blit_RGB565_ABGR8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA},\n    {0x0000F800, 0x000007E0, 0x0000001F, 4, 0xFF000000, 0x00FF0000, 0x0000FF00,\n     0, Blit_RGB565_RGBA8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA},\n    {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x0000FF00, 0x00FF0000, 0xFF000000,\n     0, Blit_RGB565_BGRA8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA},\n\n    /* Default for 16-bit RGB source, used if no other blitter matches */\n    {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0}\n};\n\nstatic const struct blit_table normal_blit_3[] = {\n    /* Default for 24-bit RGB source, never optimized */\n    {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0}\n};\n\nstatic const struct blit_table normal_blit_4[] = {\n#if SDL_ALTIVEC_BLITTERS\n    /* has-altivec | dont-use-prefetch */\n    {0x00000000, 0x00000000, 0x00000000, 4, 0x00000000, 0x00000000, 0x00000000,\n     6, ConvertAltivec32to32_noprefetch, NO_ALPHA | COPY_ALPHA | SET_ALPHA},\n    /* has-altivec */\n    {0x00000000, 0x00000000, 0x00000000, 4, 0x00000000, 0x00000000, 0x00000000,\n     2, ConvertAltivec32to32_prefetch, NO_ALPHA | COPY_ALPHA | SET_ALPHA},\n    /* has-altivec */\n    {0x00000000, 0x00000000, 0x00000000, 2, 0x0000F800, 0x000007E0, 0x0000001F,\n     2, Blit_RGB888_RGB565Altivec, NO_ALPHA},\n#endif\n    {0x00FF0000, 0x0000FF00, 0x000000FF, 2, 0x0000F800, 0x000007E0, 0x0000001F,\n     0, Blit_RGB888_RGB565, NO_ALPHA},\n    {0x00FF0000, 0x0000FF00, 0x000000FF, 2, 0x00007C00, 0x000003E0, 0x0000001F,\n     0, Blit_RGB888_RGB555, NO_ALPHA},\n    /* Default for 32-bit RGB source, used if no other blitter matches */\n    {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0}\n};\n\nstatic const struct blit_table *const normal_blit[] = {\n    normal_blit_1, normal_blit_2, normal_blit_3, normal_blit_4\n};\n\n/* Mask matches table, or table entry is zero */\n#define MASKOK(x, y) (((x) == (y)) || ((y) == 0x00000000))\n\nSDL_BlitFunc\nSDL_CalculateBlitN(SDL_Surface * surface)\n{\n    SDL_PixelFormat *srcfmt;\n    SDL_PixelFormat *dstfmt;\n    const struct blit_table *table;\n    int which;\n    SDL_BlitFunc blitfun;\n\n    /* Set up data for choosing the blit */\n    srcfmt = surface->format;\n    dstfmt = surface->map->dst->format;\n\n    /* We don't support destinations less than 8-bits */\n    if (dstfmt->BitsPerPixel < 8) {\n        return (NULL);\n    }\n\n    switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) {\n    case 0:\n        blitfun = NULL;\n        if (dstfmt->BitsPerPixel == 8) {\n            if ((srcfmt->BytesPerPixel == 4) &&\n                (srcfmt->Rmask == 0x00FF0000) &&\n                (srcfmt->Gmask == 0x0000FF00) &&\n                (srcfmt->Bmask == 0x000000FF)) {\n                blitfun = Blit_RGB888_index8;\n            } else if ((srcfmt->BytesPerPixel == 4) &&\n                (srcfmt->Rmask == 0x3FF00000) &&\n                (srcfmt->Gmask == 0x000FFC00) &&\n                (srcfmt->Bmask == 0x000003FF)) {\n                blitfun = Blit_RGB101010_index8;\n            } else {\n                blitfun = BlitNto1;\n            }\n        } else {\n            /* Now the meat, choose the blitter we want */\n            int a_need = NO_ALPHA;\n            if (dstfmt->Amask)\n                a_need = srcfmt->Amask ? COPY_ALPHA : SET_ALPHA;\n            table = normal_blit[srcfmt->BytesPerPixel - 1];\n            for (which = 0; table[which].dstbpp; ++which) {\n                if (MASKOK(srcfmt->Rmask, table[which].srcR) &&\n                    MASKOK(srcfmt->Gmask, table[which].srcG) &&\n                    MASKOK(srcfmt->Bmask, table[which].srcB) &&\n                    MASKOK(dstfmt->Rmask, table[which].dstR) &&\n                    MASKOK(dstfmt->Gmask, table[which].dstG) &&\n                    MASKOK(dstfmt->Bmask, table[which].dstB) &&\n                    dstfmt->BytesPerPixel == table[which].dstbpp &&\n                    (a_need & table[which].alpha) == a_need &&\n                    ((table[which].blit_features & GetBlitFeatures()) ==\n                     table[which].blit_features))\n                    break;\n            }\n            blitfun = table[which].blitfunc;\n\n            if (blitfun == BlitNtoN) {  /* default C fallback catch-all. Slow! */\n                if (srcfmt->format == SDL_PIXELFORMAT_ARGB2101010) {\n                    blitfun = Blit2101010toN;\n                } else if (dstfmt->format == SDL_PIXELFORMAT_ARGB2101010) {\n                    blitfun = BlitNto2101010;\n                } else if (srcfmt->BytesPerPixel == 4 &&\n                            dstfmt->BytesPerPixel == 4 &&\n                            srcfmt->Rmask == dstfmt->Rmask &&\n                            srcfmt->Gmask == dstfmt->Gmask &&\n                            srcfmt->Bmask == dstfmt->Bmask) {\n                    if (a_need == COPY_ALPHA) {\n                        if (srcfmt->Amask == dstfmt->Amask) {\n                            /* Fastpath C fallback: 32bit RGBA<->RGBA blit with matching RGBA */\n                            blitfun = Blit4to4CopyAlpha;\n                        } else {\n                            blitfun = BlitNtoNCopyAlpha;\n                        }\n                    } else {\n                        /* Fastpath C fallback: 32bit RGB<->RGBA blit with matching RGB */\n                        blitfun = Blit4to4MaskAlpha;\n                    }\n                } else if (a_need == COPY_ALPHA) {\n                    blitfun = BlitNtoNCopyAlpha;\n                }\n            }\n        }\n        return (blitfun);\n\n    case SDL_COPY_COLORKEY:\n        /* colorkey blit: Here we don't have too many options, mostly\n           because RLE is the preferred fast way to deal with this.\n           If a particular case turns out to be useful we'll add it. */\n\n        if (srcfmt->BytesPerPixel == 2 && surface->map->identity)\n            return Blit2to2Key;\n        else if (dstfmt->BytesPerPixel == 1)\n            return BlitNto1Key;\n        else {\n#if SDL_ALTIVEC_BLITTERS\n            if ((srcfmt->BytesPerPixel == 4) && (dstfmt->BytesPerPixel == 4)\n                && SDL_HasAltiVec()) {\n                return Blit32to32KeyAltivec;\n            } else\n#endif\n            if (srcfmt->Amask && dstfmt->Amask) {\n                return BlitNtoNKeyCopyAlpha;\n            } else {\n                return BlitNtoNKey;\n            }\n        }\n    }\n\n    return NULL;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_auto.c",
    "content": "/* DO NOT EDIT!  This file is generated by sdlgenblit.pl */\n/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* *INDENT-OFF* */\n\n#include \"SDL_video.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_blit_auto.h\"\n\nstatic void SDL_Blit_RGB888_RGB888_Scale(SDL_BlitInfo *info)\n{\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            *dst = *src;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_RGB888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_RGB888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_RGB888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_RGB888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_RGB888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_BGR888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_BGR888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_BGR888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_BGR888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_BGR888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_BGR888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_ARGB8888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = 0xFF;\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_ARGB8888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_ARGB8888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = 0xFF;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = 0xFF;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGB888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_RGB888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_RGB888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_RGB888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_RGB888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_RGB888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_RGB888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_BGR888_Scale(SDL_BlitInfo *info)\n{\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            *dst = *src;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_BGR888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_BGR888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_BGR888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_BGR888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_BGR888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_ARGB8888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = 0xFF;\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_ARGB8888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_ARGB8888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = 0xFF;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = 0xFF;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGR888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = 0xFF;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_RGB888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_RGB888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_RGB888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_RGB888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_RGB888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_RGB888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_BGR888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_BGR888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_BGR888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_BGR888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_BGR888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_BGR888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_ARGB8888_Scale(SDL_BlitInfo *info)\n{\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            *dst = *src;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_ARGB8888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_ARGB8888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = (Uint8)(pixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = (Uint8)(pixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_RGB888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8);\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_RGB888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_RGB888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_RGB888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_RGB888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_RGB888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_BGR888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8);\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_BGR888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_BGR888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_BGR888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_BGR888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_BGR888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_ARGB8888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); A = (Uint8)pixel;\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_ARGB8888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_ARGB8888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); A = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); A = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_RGB888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_RGB888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_RGB888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_RGB888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_RGB888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_RGB888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_BGR888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_BGR888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_BGR888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_BGR888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_BGR888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_BGR888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_ARGB8888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = (Uint8)(pixel >> 24);\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_ARGB8888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_ARGB8888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = (Uint8)(pixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = (Uint8)(pixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24);\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_RGB888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8);\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_RGB888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_RGB888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_RGB888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_RGB888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_RGB888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_BGR888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8);\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_BGR888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_BGR888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_BGR888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_BGR888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    Uint32 pixel;\n    Uint32 R, G, B;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            pixel = ((Uint32)B << 16) | ((Uint32)G << 8) | R;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_BGR888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstB << 16) | ((Uint32)dstG << 8) | dstR;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_ARGB8888_Scale(SDL_BlitInfo *info)\n{\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); A = (Uint8)pixel;\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_ARGB8888_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_ARGB8888_Modulate(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            pixel = *src;\n            B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); A = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_ARGB8888_Modulate_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 pixel;\n    Uint32 R, G, B, A;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            pixel = *src;\n            B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); A = (Uint8)pixel;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                R = (R * modulateR) / 255;\n                G = (G * modulateG) / 255;\n                B = (B * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                A = (A * modulateA) / 255;\n            }\n            pixel = ((Uint32)A << 24) | ((Uint32)R << 16) | ((Uint32)G << 8) | B;\n            *dst = pixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n\n    while (info->dst_h--) {\n        Uint32 *src = (Uint32 *)info->src;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n}\n\nstatic void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint32 *src = 0;\n        Uint32 *dst = (Uint32 *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4));\n            }\n            srcpixel = *src;\n            srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel;\n            dstpixel = *dst;\n            dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24);\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR; if (dstR > 255) dstR = 255;\n                dstG = srcG + dstG; if (dstG > 255) dstG = 255;\n                dstB = srcB + dstB; if (dstB > 255) dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            dstpixel = ((Uint32)dstA << 24) | ((Uint32)dstR << 16) | ((Uint32)dstG << 8) | dstB;\n            *dst = dstpixel;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\nSDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[] = {\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Blend },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Blend_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Modulate },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Modulate_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Modulate_Blend },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_RGB888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Blend },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Blend_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Modulate },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Modulate_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Modulate_Blend },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_BGR888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Blend },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Blend_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Modulate },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Modulate_Scale },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Modulate_Blend },\n    { SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGB888_ARGB8888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Blend },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Blend_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Modulate },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Modulate_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Modulate_Blend },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_RGB888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Blend },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Blend_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Modulate },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Modulate_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Modulate_Blend },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_BGR888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Blend },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Blend_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Modulate },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Modulate_Scale },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Modulate_Blend },\n    { SDL_PIXELFORMAT_BGR888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGR888_ARGB8888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Blend },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Blend_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Modulate },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Modulate_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Modulate_Blend },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_RGB888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Blend },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Blend_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Modulate },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Modulate_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Modulate_Blend },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_BGR888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Blend },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Blend_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Scale },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend },\n    { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Blend },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Blend_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Modulate },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Modulate_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Modulate_Blend },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_RGB888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Blend },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Blend_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Modulate },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Modulate_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Modulate_Blend },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_BGR888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Blend },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Blend_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Scale },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend },\n    { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Blend },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Blend_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Modulate },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Modulate_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Modulate_Blend },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_RGB888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Blend },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Blend_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Modulate },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Modulate_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Modulate_Blend },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_BGR888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Blend },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Blend_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Scale },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend },\n    { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Blend },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Blend_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Modulate },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Modulate_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Modulate_Blend },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_RGB888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_RGB888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Blend },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Blend_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Modulate },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Modulate_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Modulate_Blend },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_BGR888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_BGR888_Modulate_Blend_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Blend },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Blend_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Scale },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend },\n    { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale },\n    { 0, 0, 0, 0, NULL }\n};\n\n/* *INDENT-ON* */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_auto.h",
    "content": "/* DO NOT EDIT!  This file is generated by sdlgenblit.pl */\n/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* *INDENT-OFF* */\n\nextern SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[];\n\n/* *INDENT-ON* */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_copy.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_blit_copy.h\"\n\n\n#ifdef __SSE__\n/* This assumes 16-byte aligned src and dst */\nstatic SDL_INLINE void\nSDL_memcpySSE(Uint8 * dst, const Uint8 * src, int len)\n{\n    int i;\n\n    __m128 values[4];\n    for (i = len / 64; i--;) {\n        _mm_prefetch(src, _MM_HINT_NTA);\n        values[0] = *(__m128 *) (src + 0);\n        values[1] = *(__m128 *) (src + 16);\n        values[2] = *(__m128 *) (src + 32);\n        values[3] = *(__m128 *) (src + 48);\n        _mm_stream_ps((float *) (dst + 0), values[0]);\n        _mm_stream_ps((float *) (dst + 16), values[1]);\n        _mm_stream_ps((float *) (dst + 32), values[2]);\n        _mm_stream_ps((float *) (dst + 48), values[3]);\n        src += 64;\n        dst += 64;\n    }\n\n    if (len & 63)\n        SDL_memcpy(dst, src, len & 63);\n}\n#endif /* __SSE__ */\n\n#ifdef __MMX__\n#ifdef _MSC_VER\n#pragma warning(disable:4799)\n#endif\nstatic SDL_INLINE void\nSDL_memcpyMMX(Uint8 * dst, const Uint8 * src, int len)\n{\n    const int remain = (len & 63);\n    int i;\n\n    __m64* d64 = (__m64*)dst;\n    __m64* s64 = (__m64*)src;\n\n    for(i= len / 64; i--;) {\n        d64[0] = s64[0];\n        d64[1] = s64[1];\n        d64[2] = s64[2];\n        d64[3] = s64[3];\n        d64[4] = s64[4];\n        d64[5] = s64[5];\n        d64[6] = s64[6];\n        d64[7] = s64[7];\n\n        d64 += 8;\n        s64 += 8;\n    }\n\n    if (remain)\n    {\n        const int skip = len - remain;\n        SDL_memcpy(dst + skip, src + skip, remain);\n    }\n}\n#endif /* __MMX__ */\n\nvoid\nSDL_BlitCopy(SDL_BlitInfo * info)\n{\n    SDL_bool overlap;\n    Uint8 *src, *dst;\n    int w, h;\n    int srcskip, dstskip;\n\n    w = info->dst_w * info->dst_fmt->BytesPerPixel;\n    h = info->dst_h;\n    src = info->src;\n    dst = info->dst;\n    srcskip = info->src_pitch;\n    dstskip = info->dst_pitch;\n\n    /* Properly handle overlapping blits */\n    if (src < dst) {\n        overlap = (dst < (src + h*srcskip));\n    } else {\n        overlap = (src < (dst + h*dstskip));\n    }\n    if (overlap) {\n        if ( dst < src ) {\n                while ( h-- ) {\n                        SDL_memmove(dst, src, w);\n                        src += srcskip;\n                        dst += dstskip;\n                }\n        } else {\n                src += ((h-1) * srcskip);\n                dst += ((h-1) * dstskip);\n                while ( h-- ) {\n                        SDL_memmove(dst, src, w);\n                        src -= srcskip;\n                        dst -= dstskip;\n                }\n        }\n        return;\n    }\n\n#ifdef __SSE__\n    if (SDL_HasSSE() &&\n        !((uintptr_t) src & 15) && !(srcskip & 15) &&\n        !((uintptr_t) dst & 15) && !(dstskip & 15)) {\n        while (h--) {\n            SDL_memcpySSE(dst, src, w);\n            src += srcskip;\n            dst += dstskip;\n        }\n        return;\n    }\n#endif\n\n#ifdef __MMX__\n    if (SDL_HasMMX() && !(srcskip & 7) && !(dstskip & 7)) {\n        while (h--) {\n            SDL_memcpyMMX(dst, src, w);\n            src += srcskip;\n            dst += dstskip;\n        }\n        _mm_empty();\n        return;\n    }\n#endif\n\n    while (h--) {\n        SDL_memcpy(dst, src, w);\n        src += srcskip;\n        dst += dstskip;\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_copy.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\nvoid SDL_BlitCopy(SDL_BlitInfo * info);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_slow.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_blit_slow.h\"\n\n/* The ONE TRUE BLITTER\n * This puppy has to handle all the unoptimized cases - yes, it's slow.\n */\nvoid\nSDL_Blit_Slow(SDL_BlitInfo * info)\n{\n    const int flags = info->flags;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n    const Uint32 modulateA = info->a;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n    Uint32 dstR, dstG, dstB, dstA;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n    SDL_PixelFormat *src_fmt = info->src_fmt;\n    SDL_PixelFormat *dst_fmt = info->dst_fmt;\n    int srcbpp = src_fmt->BytesPerPixel;\n    int dstbpp = dst_fmt->BytesPerPixel;\n    Uint32 rgbmask = ~src_fmt->Amask;\n    Uint32 ckey = info->colorkey & rgbmask;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        Uint8 *src = 0;\n        Uint8 *dst = (Uint8 *) info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src =\n                    (info->src + (srcy * info->src_pitch) + (srcx * srcbpp));\n            }\n            if (src_fmt->Amask) {\n                DISEMBLE_RGBA(src, srcbpp, src_fmt, srcpixel, srcR, srcG,\n                              srcB, srcA);\n            } else {\n                DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG,\n                             srcB);\n                srcA = 0xFF;\n            }\n            if (flags & SDL_COPY_COLORKEY) {\n                /* srcpixel isn't set for 24 bpp */\n                if (srcbpp == 3) {\n                    srcpixel = (srcR << src_fmt->Rshift) |\n                        (srcG << src_fmt->Gshift) | (srcB << src_fmt->Bshift);\n                }\n                if ((srcpixel & rgbmask) == ckey) {\n                    posx += incx;\n                    dst += dstbpp;\n                    continue;\n                }\n            }\n            if (dst_fmt->Amask) {\n                DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,\n                              dstB, dstA);\n            } else {\n                DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,\n                             dstB);\n                dstA = 0xFF;\n            }\n\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                srcR = (srcR * modulateR) / 255;\n                srcG = (srcG * modulateG) / 255;\n                srcB = (srcB * modulateB) / 255;\n            }\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                srcA = (srcA * modulateA) / 255;\n            }\n            if (flags & (SDL_COPY_BLEND | SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (srcA < 255) {\n                    srcR = (srcR * srcA) / 255;\n                    srcG = (srcG * srcA) / 255;\n                    srcB = (srcB * srcA) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)) {\n            case 0:\n                dstR = srcR;\n                dstG = srcG;\n                dstB = srcB;\n                dstA = srcA;\n                break;\n            case SDL_COPY_BLEND:\n                dstR = srcR + ((255 - srcA) * dstR) / 255;\n                dstG = srcG + ((255 - srcA) * dstG) / 255;\n                dstB = srcB + ((255 - srcA) * dstB) / 255;\n                dstA = srcA + ((255 - srcA) * dstA) / 255;\n                break;\n            case SDL_COPY_ADD:\n                dstR = srcR + dstR;\n                if (dstR > 255)\n                    dstR = 255;\n                dstG = srcG + dstG;\n                if (dstG > 255)\n                    dstG = 255;\n                dstB = srcB + dstB;\n                if (dstB > 255)\n                    dstB = 255;\n                break;\n            case SDL_COPY_MOD:\n                dstR = (srcR * dstR) / 255;\n                dstG = (srcG * dstG) / 255;\n                dstB = (srcB * dstB) / 255;\n                break;\n            }\n            if (dst_fmt->Amask) {\n                ASSEMBLE_RGBA(dst, dstbpp, dst_fmt, dstR, dstG, dstB, dstA);\n            } else {\n                ASSEMBLE_RGB(dst, dstbpp, dst_fmt, dstR, dstG, dstB);\n            }\n            posx += incx;\n            dst += dstbpp;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_blit_slow.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\nextern void SDL_Blit_Slow(SDL_BlitInfo * info);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_bmp.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/*\n   Code to load and save surfaces in Windows BMP format.\n\n   Why support BMP format?  Well, it's a native format for Windows, and\n   most image processing programs can read and write it.  It would be nice\n   to be able to have at least one image format that we can natively load\n   and save, and since PNG is so complex that it would bloat the library,\n   BMP is a good alternative.\n\n   This code currently supports Win32 DIBs in uncompressed 8 and 24 bpp.\n*/\n\n#include \"SDL_hints.h\"\n#include \"SDL_video.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_pixels_c.h\"\n\n#define SAVE_32BIT_BMP\n\n/* Compression encodings for BMP files */\n#ifndef BI_RGB\n#define BI_RGB      0\n#define BI_RLE8     1\n#define BI_RLE4     2\n#define BI_BITFIELDS    3\n#endif\n\n/* Logical color space values for BMP files */\n#ifndef LCS_WINDOWS_COLOR_SPACE\n/* 0x57696E20 == \"Win \" */\n#define LCS_WINDOWS_COLOR_SPACE    0x57696E20\n#endif\n\nstatic void CorrectAlphaChannel(SDL_Surface *surface)\n{\n    /* Check to see if there is any alpha channel data */\n    SDL_bool hasAlpha = SDL_FALSE;\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n    int alphaChannelOffset = 0;\n#else\n    int alphaChannelOffset = 3;\n#endif\n    Uint8 *alpha = ((Uint8*)surface->pixels) + alphaChannelOffset;\n    Uint8 *end = alpha + surface->h * surface->pitch;\n\n    while (alpha < end) {\n        if (*alpha != 0) {\n            hasAlpha = SDL_TRUE;\n            break;\n        }\n        alpha += 4;\n    }\n\n    if (!hasAlpha) {\n        alpha = ((Uint8*)surface->pixels) + alphaChannelOffset;\n        while (alpha < end) {\n            *alpha = SDL_ALPHA_OPAQUE;\n            alpha += 4;\n        }\n    }\n}\n\nSDL_Surface *\nSDL_LoadBMP_RW(SDL_RWops * src, int freesrc)\n{\n    SDL_bool was_error;\n    Sint64 fp_offset = 0;\n    int bmpPitch;\n    int i, pad;\n    SDL_Surface *surface;\n    Uint32 Rmask = 0;\n    Uint32 Gmask = 0;\n    Uint32 Bmask = 0;\n    Uint32 Amask = 0;\n    SDL_Palette *palette;\n    Uint8 *bits;\n    Uint8 *top, *end;\n    SDL_bool topDown;\n    int ExpandBMP;\n    SDL_bool haveRGBMasks = SDL_FALSE;\n    SDL_bool haveAlphaMask = SDL_FALSE;\n    SDL_bool correctAlpha = SDL_FALSE;\n\n    /* The Win32 BMP file header (14 bytes) */\n    char magic[2];\n    /* Uint32 bfSize = 0; */\n    /* Uint16 bfReserved1 = 0; */\n    /* Uint16 bfReserved2 = 0; */\n    Uint32 bfOffBits = 0;\n\n    /* The Win32 BITMAPINFOHEADER struct (40 bytes) */\n    Uint32 biSize = 0;\n    Sint32 biWidth = 0;\n    Sint32 biHeight = 0;\n    /* Uint16 biPlanes = 0; */\n    Uint16 biBitCount = 0;\n    Uint32 biCompression = 0;\n    /* Uint32 biSizeImage = 0; */\n    /* Sint32 biXPelsPerMeter = 0; */\n    /* Sint32 biYPelsPerMeter = 0; */\n    Uint32 biClrUsed = 0;\n    /* Uint32 biClrImportant = 0; */\n\n    /* Make sure we are passed a valid data source */\n    surface = NULL;\n    was_error = SDL_FALSE;\n    if (src == NULL) {\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Read in the BMP file header */\n    fp_offset = SDL_RWtell(src);\n    SDL_ClearError();\n    if (SDL_RWread(src, magic, 1, 2) != 2) {\n        SDL_Error(SDL_EFREAD);\n        was_error = SDL_TRUE;\n        goto done;\n    }\n    if (SDL_strncmp(magic, \"BM\", 2) != 0) {\n        SDL_SetError(\"File is not a Windows BMP file\");\n        was_error = SDL_TRUE;\n        goto done;\n    }\n    /* bfSize = */ SDL_ReadLE32(src);\n    /* bfReserved1 = */ SDL_ReadLE16(src);\n    /* bfReserved2 = */ SDL_ReadLE16(src);\n    bfOffBits = SDL_ReadLE32(src);\n\n    /* Read the Win32 BITMAPINFOHEADER */\n    biSize = SDL_ReadLE32(src);\n    if (biSize == 12) {   /* really old BITMAPCOREHEADER */\n        biWidth = (Uint32) SDL_ReadLE16(src);\n        biHeight = (Uint32) SDL_ReadLE16(src);\n        /* biPlanes = */ SDL_ReadLE16(src);\n        biBitCount = SDL_ReadLE16(src);\n        biCompression = BI_RGB;\n    } else if (biSize >= 40) {  /* some version of BITMAPINFOHEADER */\n        Uint32 headerSize;\n        biWidth = SDL_ReadLE32(src);\n        biHeight = SDL_ReadLE32(src);\n        /* biPlanes = */ SDL_ReadLE16(src);\n        biBitCount = SDL_ReadLE16(src);\n        biCompression = SDL_ReadLE32(src);\n        /* biSizeImage = */ SDL_ReadLE32(src);\n        /* biXPelsPerMeter = */ SDL_ReadLE32(src);\n        /* biYPelsPerMeter = */ SDL_ReadLE32(src);\n        biClrUsed = SDL_ReadLE32(src);\n        /* biClrImportant = */ SDL_ReadLE32(src);\n\n        /* 64 == BITMAPCOREHEADER2, an incompatible OS/2 2.x extension. Skip this stuff for now. */\n        if (biSize == 64) {\n            /* ignore these extra fields. */\n            if (biCompression == BI_BITFIELDS) {\n                /* this value is actually huffman compression in this variant. */\n                SDL_SetError(\"Compressed BMP files not supported\");\n                was_error = SDL_TRUE;\n                goto done;\n            }\n        } else {\n            /* This is complicated. If compression is BI_BITFIELDS, then\n               we have 3 DWORDS that specify the RGB masks. This is either\n               stored here in an BITMAPV2INFOHEADER (which only differs in\n               that it adds these RGB masks) and biSize >= 52, or we've got\n               these masks stored in the exact same place, but strictly\n               speaking, this is the bmiColors field in BITMAPINFO immediately\n               following the legacy v1 info header, just past biSize. */\n            if (biCompression == BI_BITFIELDS) {\n                haveRGBMasks = SDL_TRUE;\n                Rmask = SDL_ReadLE32(src);\n                Gmask = SDL_ReadLE32(src);\n                Bmask = SDL_ReadLE32(src);\n\n                /* ...v3 adds an alpha mask. */\n                if (biSize >= 56) {  /* BITMAPV3INFOHEADER; adds alpha mask */\n                    haveAlphaMask = SDL_TRUE;\n                    Amask = SDL_ReadLE32(src);\n                }\n            } else {\n                /* the mask fields are ignored for v2+ headers if not BI_BITFIELD. */\n                if (biSize >= 52) {  /* BITMAPV2INFOHEADER; adds RGB masks */\n                    /*Rmask = */ SDL_ReadLE32(src);\n                    /*Gmask = */ SDL_ReadLE32(src);\n                    /*Bmask = */ SDL_ReadLE32(src);\n                }\n                if (biSize >= 56) {  /* BITMAPV3INFOHEADER; adds alpha mask */\n                    /*Amask = */ SDL_ReadLE32(src);\n                }\n            }\n\n            /* Insert other fields here; Wikipedia and MSDN say we're up to\n               v5 of this header, but we ignore those for now (they add gamma,\n               color spaces, etc). Ignoring the weird OS/2 2.x format, we\n               currently parse up to v3 correctly (hopefully!). */\n        }\n\n        /* skip any header bytes we didn't handle... */\n        headerSize = (Uint32) (SDL_RWtell(src) - (fp_offset + 14));\n        if (biSize > headerSize) {\n            SDL_RWseek(src, (biSize - headerSize), RW_SEEK_CUR);\n        }\n    }\n    if (biHeight < 0) {\n        topDown = SDL_TRUE;\n        biHeight = -biHeight;\n    } else {\n        topDown = SDL_FALSE;\n    }\n\n    /* Check for read error */\n    if (SDL_strcmp(SDL_GetError(), \"\") != 0) {\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Expand 1 and 4 bit bitmaps to 8 bits per pixel */\n    switch (biBitCount) {\n    case 1:\n    case 4:\n        ExpandBMP = biBitCount;\n        biBitCount = 8;\n        break;\n    default:\n        ExpandBMP = 0;\n        break;\n    }\n\n    /* We don't support any BMP compression right now */\n    switch (biCompression) {\n    case BI_RGB:\n        /* If there are no masks, use the defaults */\n        SDL_assert(!haveRGBMasks);\n        SDL_assert(!haveAlphaMask);\n        /* Default values for the BMP format */\n        switch (biBitCount) {\n        case 15:\n        case 16:\n            Rmask = 0x7C00;\n            Gmask = 0x03E0;\n            Bmask = 0x001F;\n            break;\n        case 24:\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n            Rmask = 0x000000FF;\n            Gmask = 0x0000FF00;\n            Bmask = 0x00FF0000;\n#else\n            Rmask = 0x00FF0000;\n            Gmask = 0x0000FF00;\n            Bmask = 0x000000FF;\n#endif\n            break;\n        case 32:\n            /* We don't know if this has alpha channel or not */\n            correctAlpha = SDL_TRUE;\n            Amask = 0xFF000000;\n            Rmask = 0x00FF0000;\n            Gmask = 0x0000FF00;\n            Bmask = 0x000000FF;\n            break;\n        default:\n            break;\n        }\n        break;\n\n    case BI_BITFIELDS:\n        break;  /* we handled this in the info header. */\n\n    default:\n        SDL_SetError(\"Compressed BMP files not supported\");\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Create a compatible surface, note that the colors are RGB ordered */\n    surface =\n        SDL_CreateRGBSurface(0, biWidth, biHeight, biBitCount, Rmask, Gmask,\n                             Bmask, Amask);\n    if (surface == NULL) {\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Load the palette, if any */\n    palette = (surface->format)->palette;\n    if (palette) {\n        SDL_assert(biBitCount <= 8);\n        if (biClrUsed == 0) {\n            biClrUsed = 1 << biBitCount;\n        }\n        if ((int) biClrUsed > palette->ncolors) {\n            SDL_Color *colors;\n            int ncolors = biClrUsed;\n            colors =\n                (SDL_Color *) SDL_realloc(palette->colors,\n                                          ncolors *\n                                          sizeof(*palette->colors));\n            if (!colors) {\n                SDL_OutOfMemory();\n                was_error = SDL_TRUE;\n                goto done;\n            }\n            palette->ncolors = ncolors;\n            palette->colors = colors;\n        } else if ((int) biClrUsed < palette->ncolors) {\n            palette->ncolors = biClrUsed;\n        }\n        if (biSize == 12) {\n            for (i = 0; i < (int) biClrUsed; ++i) {\n                SDL_RWread(src, &palette->colors[i].b, 1, 1);\n                SDL_RWread(src, &palette->colors[i].g, 1, 1);\n                SDL_RWread(src, &palette->colors[i].r, 1, 1);\n                palette->colors[i].a = SDL_ALPHA_OPAQUE;\n            }\n        } else {\n            for (i = 0; i < (int) biClrUsed; ++i) {\n                SDL_RWread(src, &palette->colors[i].b, 1, 1);\n                SDL_RWread(src, &palette->colors[i].g, 1, 1);\n                SDL_RWread(src, &palette->colors[i].r, 1, 1);\n                SDL_RWread(src, &palette->colors[i].a, 1, 1);\n\n                /* According to Microsoft documentation, the fourth element\n                   is reserved and must be zero, so we shouldn't treat it as\n                   alpha.\n                */\n                palette->colors[i].a = SDL_ALPHA_OPAQUE;\n            }\n        }\n    }\n\n    /* Read the surface pixels.  Note that the bmp image is upside down */\n    if (SDL_RWseek(src, fp_offset + bfOffBits, RW_SEEK_SET) < 0) {\n        SDL_Error(SDL_EFSEEK);\n        was_error = SDL_TRUE;\n        goto done;\n    }\n    top = (Uint8 *)surface->pixels;\n    end = (Uint8 *)surface->pixels+(surface->h*surface->pitch);\n    switch (ExpandBMP) {\n    case 1:\n        bmpPitch = (biWidth + 7) >> 3;\n        pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);\n        break;\n    case 4:\n        bmpPitch = (biWidth + 1) >> 1;\n        pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);\n        break;\n    default:\n        pad = ((surface->pitch % 4) ? (4 - (surface->pitch % 4)) : 0);\n        break;\n    }\n    if (topDown) {\n        bits = top;\n    } else {\n        bits = end - surface->pitch;\n    }\n    while (bits >= top && bits < end) {\n        switch (ExpandBMP) {\n        case 1:\n        case 4:{\n                Uint8 pixel = 0;\n                int shift = (8 - ExpandBMP);\n                for (i = 0; i < surface->w; ++i) {\n                    if (i % (8 / ExpandBMP) == 0) {\n                        if (!SDL_RWread(src, &pixel, 1, 1)) {\n                            SDL_SetError(\"Error reading from BMP\");\n                            was_error = SDL_TRUE;\n                            goto done;\n                        }\n                    }\n                    *(bits + i) = (pixel >> shift);\n                    pixel <<= ExpandBMP;\n                }\n            }\n            break;\n\n        default:\n            if (SDL_RWread(src, bits, 1, surface->pitch)\n                != surface->pitch) {\n                SDL_Error(SDL_EFREAD);\n                was_error = SDL_TRUE;\n                goto done;\n            }\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n            /* Byte-swap the pixels if needed. Note that the 24bpp\n               case has already been taken care of above. */\n            switch (biBitCount) {\n            case 15:\n            case 16:{\n                    Uint16 *pix = (Uint16 *) bits;\n                    for (i = 0; i < surface->w; i++)\n                        pix[i] = SDL_Swap16(pix[i]);\n                    break;\n                }\n\n            case 32:{\n                    Uint32 *pix = (Uint32 *) bits;\n                    for (i = 0; i < surface->w; i++)\n                        pix[i] = SDL_Swap32(pix[i]);\n                    break;\n                }\n            }\n#endif\n            break;\n        }\n        /* Skip padding bytes, ugh */\n        if (pad) {\n            Uint8 padbyte;\n            for (i = 0; i < pad; ++i) {\n                SDL_RWread(src, &padbyte, 1, 1);\n            }\n        }\n        if (topDown) {\n            bits += surface->pitch;\n        } else {\n            bits -= surface->pitch;\n        }\n    }\n    if (correctAlpha) {\n        CorrectAlphaChannel(surface);\n    }\n  done:\n    if (was_error) {\n        if (src) {\n            SDL_RWseek(src, fp_offset, RW_SEEK_SET);\n        }\n        SDL_FreeSurface(surface);\n        surface = NULL;\n    }\n    if (freesrc && src) {\n        SDL_RWclose(src);\n    }\n    return (surface);\n}\n\nint\nSDL_SaveBMP_RW(SDL_Surface * saveme, SDL_RWops * dst, int freedst)\n{\n    Sint64 fp_offset;\n    int i, pad;\n    SDL_Surface *surface;\n    Uint8 *bits;\n    SDL_bool save32bit = SDL_FALSE;\n    SDL_bool saveLegacyBMP = SDL_FALSE;\n\n    /* The Win32 BMP file header (14 bytes) */\n    char magic[2] = { 'B', 'M' };\n    Uint32 bfSize;\n    Uint16 bfReserved1;\n    Uint16 bfReserved2;\n    Uint32 bfOffBits;\n\n    /* The Win32 BITMAPINFOHEADER struct (40 bytes) */\n    Uint32 biSize;\n    Sint32 biWidth;\n    Sint32 biHeight;\n    Uint16 biPlanes;\n    Uint16 biBitCount;\n    Uint32 biCompression;\n    Uint32 biSizeImage;\n    Sint32 biXPelsPerMeter;\n    Sint32 biYPelsPerMeter;\n    Uint32 biClrUsed;\n    Uint32 biClrImportant;\n\n    /* The additional header members from the Win32 BITMAPV4HEADER struct (108 bytes in total) */\n    Uint32 bV4RedMask = 0;\n    Uint32 bV4GreenMask = 0;\n    Uint32 bV4BlueMask = 0;\n    Uint32 bV4AlphaMask = 0;\n    Uint32 bV4CSType = 0;\n    Sint32 bV4Endpoints[3 * 3] = {0};\n    Uint32 bV4GammaRed = 0;\n    Uint32 bV4GammaGreen = 0;\n    Uint32 bV4GammaBlue = 0;\n\n    /* Make sure we have somewhere to save */\n    surface = NULL;\n    if (dst) {\n#ifdef SAVE_32BIT_BMP\n        /* We can save alpha information in a 32-bit BMP */\n        if (saveme->format->BitsPerPixel >= 8 && (saveme->format->Amask ||\n            saveme->map->info.flags & SDL_COPY_COLORKEY)) {\n            save32bit = SDL_TRUE;\n        }\n#endif /* SAVE_32BIT_BMP */\n\n        if (saveme->format->palette && !save32bit) {\n            if (saveme->format->BitsPerPixel == 8) {\n                surface = saveme;\n            } else {\n                SDL_SetError(\"%d bpp BMP files not supported\",\n                             saveme->format->BitsPerPixel);\n            }\n        } else if ((saveme->format->BitsPerPixel == 24) && !save32bit &&\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n                   (saveme->format->Rmask == 0x00FF0000) &&\n                   (saveme->format->Gmask == 0x0000FF00) &&\n                   (saveme->format->Bmask == 0x000000FF)\n#else\n                   (saveme->format->Rmask == 0x000000FF) &&\n                   (saveme->format->Gmask == 0x0000FF00) &&\n                   (saveme->format->Bmask == 0x00FF0000)\n#endif\n            ) {\n            surface = saveme;\n        } else {\n            SDL_PixelFormat format;\n\n            /* If the surface has a colorkey or alpha channel we'll save a\n               32-bit BMP with alpha channel, otherwise save a 24-bit BMP. */\n            if (save32bit) {\n                SDL_InitFormat(&format, SDL_PIXELFORMAT_BGRA32);\n            } else {\n                SDL_InitFormat(&format, SDL_PIXELFORMAT_BGR24);\n            }\n            surface = SDL_ConvertSurface(saveme, &format, 0);\n            if (!surface) {\n                SDL_SetError(\"Couldn't convert image to %d bpp\",\n                             format.BitsPerPixel);\n            }\n        }\n    } else {\n        /* Set no error here because it may overwrite a more useful message from\n           SDL_RWFromFile() if SDL_SaveBMP_RW() is called from SDL_SaveBMP(). */\n        return -1;\n    }\n\n    if (save32bit) {\n        saveLegacyBMP = SDL_GetHintBoolean(SDL_HINT_BMP_SAVE_LEGACY_FORMAT, SDL_FALSE);\n    }\n\n    if (surface && (SDL_LockSurface(surface) == 0)) {\n        const int bw = surface->w * surface->format->BytesPerPixel;\n\n        /* Set the BMP file header values */\n        bfSize = 0;             /* We'll write this when we're done */\n        bfReserved1 = 0;\n        bfReserved2 = 0;\n        bfOffBits = 0;          /* We'll write this when we're done */\n\n        /* Write the BMP file header values */\n        fp_offset = SDL_RWtell(dst);\n        SDL_ClearError();\n        SDL_RWwrite(dst, magic, 2, 1);\n        SDL_WriteLE32(dst, bfSize);\n        SDL_WriteLE16(dst, bfReserved1);\n        SDL_WriteLE16(dst, bfReserved2);\n        SDL_WriteLE32(dst, bfOffBits);\n\n        /* Set the BMP info values */\n        biSize = 40;\n        biWidth = surface->w;\n        biHeight = surface->h;\n        biPlanes = 1;\n        biBitCount = surface->format->BitsPerPixel;\n        biCompression = BI_RGB;\n        biSizeImage = surface->h * surface->pitch;\n        biXPelsPerMeter = 0;\n        biYPelsPerMeter = 0;\n        if (surface->format->palette) {\n            biClrUsed = surface->format->palette->ncolors;\n        } else {\n            biClrUsed = 0;\n        }\n        biClrImportant = 0;\n\n        /* Set the BMP info values for the version 4 header */\n        if (save32bit && !saveLegacyBMP) {\n            biSize = 108;\n            biCompression = BI_BITFIELDS;\n            /* The BMP format is always little endian, these masks stay the same */\n            bV4RedMask   = 0x00ff0000;\n            bV4GreenMask = 0x0000ff00;\n            bV4BlueMask  = 0x000000ff;\n            bV4AlphaMask = 0xff000000;\n            bV4CSType = LCS_WINDOWS_COLOR_SPACE;\n            bV4GammaRed = 0;\n            bV4GammaGreen = 0;\n            bV4GammaBlue = 0;\n        }\n\n        /* Write the BMP info values */\n        SDL_WriteLE32(dst, biSize);\n        SDL_WriteLE32(dst, biWidth);\n        SDL_WriteLE32(dst, biHeight);\n        SDL_WriteLE16(dst, biPlanes);\n        SDL_WriteLE16(dst, biBitCount);\n        SDL_WriteLE32(dst, biCompression);\n        SDL_WriteLE32(dst, biSizeImage);\n        SDL_WriteLE32(dst, biXPelsPerMeter);\n        SDL_WriteLE32(dst, biYPelsPerMeter);\n        SDL_WriteLE32(dst, biClrUsed);\n        SDL_WriteLE32(dst, biClrImportant);\n\n        /* Write the BMP info values for the version 4 header */\n        if (save32bit && !saveLegacyBMP) {\n            SDL_WriteLE32(dst, bV4RedMask);\n            SDL_WriteLE32(dst, bV4GreenMask);\n            SDL_WriteLE32(dst, bV4BlueMask);\n            SDL_WriteLE32(dst, bV4AlphaMask);\n            SDL_WriteLE32(dst, bV4CSType);\n            for (i = 0; i < 3 * 3; i++) {\n                SDL_WriteLE32(dst, bV4Endpoints[i]);\n            }\n            SDL_WriteLE32(dst, bV4GammaRed);\n            SDL_WriteLE32(dst, bV4GammaGreen);\n            SDL_WriteLE32(dst, bV4GammaBlue);\n        }\n\n        /* Write the palette (in BGR color order) */\n        if (surface->format->palette) {\n            SDL_Color *colors;\n            int ncolors;\n\n            colors = surface->format->palette->colors;\n            ncolors = surface->format->palette->ncolors;\n            for (i = 0; i < ncolors; ++i) {\n                SDL_RWwrite(dst, &colors[i].b, 1, 1);\n                SDL_RWwrite(dst, &colors[i].g, 1, 1);\n                SDL_RWwrite(dst, &colors[i].r, 1, 1);\n                SDL_RWwrite(dst, &colors[i].a, 1, 1);\n            }\n        }\n\n        /* Write the bitmap offset */\n        bfOffBits = (Uint32)(SDL_RWtell(dst) - fp_offset);\n        if (SDL_RWseek(dst, fp_offset + 10, RW_SEEK_SET) < 0) {\n            SDL_Error(SDL_EFSEEK);\n        }\n        SDL_WriteLE32(dst, bfOffBits);\n        if (SDL_RWseek(dst, fp_offset + bfOffBits, RW_SEEK_SET) < 0) {\n            SDL_Error(SDL_EFSEEK);\n        }\n\n        /* Write the bitmap image upside down */\n        bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch);\n        pad = ((bw % 4) ? (4 - (bw % 4)) : 0);\n        while (bits > (Uint8 *) surface->pixels) {\n            bits -= surface->pitch;\n            if (SDL_RWwrite(dst, bits, 1, bw) != bw) {\n                SDL_Error(SDL_EFWRITE);\n                break;\n            }\n            if (pad) {\n                const Uint8 padbyte = 0;\n                for (i = 0; i < pad; ++i) {\n                    SDL_RWwrite(dst, &padbyte, 1, 1);\n                }\n            }\n        }\n\n        /* Write the BMP file size */\n        bfSize = (Uint32)(SDL_RWtell(dst) - fp_offset);\n        if (SDL_RWseek(dst, fp_offset + 2, RW_SEEK_SET) < 0) {\n            SDL_Error(SDL_EFSEEK);\n        }\n        SDL_WriteLE32(dst, bfSize);\n        if (SDL_RWseek(dst, fp_offset + bfSize, RW_SEEK_SET) < 0) {\n            SDL_Error(SDL_EFSEEK);\n        }\n\n        /* Close it up.. */\n        SDL_UnlockSurface(surface);\n        if (surface != saveme) {\n            SDL_FreeSurface(surface);\n        }\n    }\n\n    if (freedst && dst) {\n        SDL_RWclose(dst);\n    }\n    return ((SDL_strcmp(SDL_GetError(), \"\") == 0) ? 0 : -1);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_clipboard.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_clipboard.h\"\n#include \"SDL_sysvideo.h\"\n\n\nint\nSDL_SetClipboardText(const char *text)\n{\n    SDL_VideoDevice *_this = SDL_GetVideoDevice();\n\n    if (!_this) {\n        return SDL_SetError(\"Video subsystem must be initialized to set clipboard text\");\n    }\n\n    if (!text) {\n        text = \"\";\n    }\n    if (_this->SetClipboardText) {\n        return _this->SetClipboardText(_this, text);\n    } else {\n        SDL_free(_this->clipboard_text);\n        _this->clipboard_text = SDL_strdup(text);\n        return 0;\n    }\n}\n\nchar *\nSDL_GetClipboardText(void)\n{\n    SDL_VideoDevice *_this = SDL_GetVideoDevice();\n\n    if (!_this) {\n        SDL_SetError(\"Video subsystem must be initialized to get clipboard text\");\n        return SDL_strdup(\"\");\n    }\n\n    if (_this->GetClipboardText) {\n        return _this->GetClipboardText(_this);\n    } else {\n        const char *text = _this->clipboard_text;\n        if (!text) {\n            text = \"\";\n        }\n        return SDL_strdup(text);\n    }\n}\n\nSDL_bool\nSDL_HasClipboardText(void)\n{\n    SDL_VideoDevice *_this = SDL_GetVideoDevice();\n\n    if (!_this) {\n        SDL_SetError(\"Video subsystem must be initialized to check clipboard text\");\n        return SDL_FALSE;\n    }\n\n    if (_this->HasClipboardText) {\n        return _this->HasClipboardText(_this);\n    } else {\n        if (_this->clipboard_text && _this->clipboard_text[0] != '\\0') {\n            return SDL_TRUE;\n        } else {\n            return SDL_FALSE;\n        }\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_egl.c",
    "content": "/*\n *  Simple DirectMedia Layer\n *  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n * \n *  This software is provided 'as-is', without any express or implied\n *  warranty.  In no event will the authors be held liable for any damages\n *  arising from the use of this software.\n * \n *  Permission is granted to anyone to use this software for any purpose,\n *  including commercial applications, and to alter it and redistribute it\n *  freely, subject to the following restrictions:\n * \n *  1. The origin of this software must not be misrepresented; you must not\n *     claim that you wrote the original software. If you use this software\n *     in a product, an acknowledgment in the product documentation would be\n *     appreciated but is not required.\n *  2. Altered source versions must be plainly marked as such, and must not be\n *     misrepresented as being the original software.\n *  3. This notice may not be removed or altered from any source distribution.\n */\n#include \"../SDL_internal.h\"\n\n#if SDL_VIDEO_OPENGL_EGL\n\n#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT\n#include \"../core/windows/SDL_windows.h\"\n#endif\n\n#include \"SDL_sysvideo.h\"\n#include \"SDL_egl_c.h\"\n#include \"SDL_loadso.h\"\n#include \"SDL_hints.h\"\n\n#ifdef EGL_KHR_create_context\n/* EGL_OPENGL_ES3_BIT_KHR was added in version 13 of the extension. */\n#ifndef EGL_OPENGL_ES3_BIT_KHR\n#define EGL_OPENGL_ES3_BIT_KHR 0x00000040\n#endif\n#endif /* EGL_KHR_create_context */\n\n#if SDL_VIDEO_DRIVER_RPI\n/* Raspbian places the OpenGL ES/EGL binaries in a non standard path */\n#define DEFAULT_EGL \"/opt/vc/lib/libEGL.so\"\n#define DEFAULT_OGL_ES2 \"/opt/vc/lib/libGLESv2.so\"\n#define DEFAULT_OGL_ES_PVR \"/opt/vc/lib/libGLES_CM.so\"\n#define DEFAULT_OGL_ES \"/opt/vc/lib/libGLESv1_CM.so\"\n\n#elif SDL_VIDEO_DRIVER_ANDROID || SDL_VIDEO_DRIVER_VIVANTE\n/* Android */\n#define DEFAULT_EGL \"libEGL.so\"\n#define DEFAULT_OGL_ES2 \"libGLESv2.so\"\n#define DEFAULT_OGL_ES_PVR \"libGLES_CM.so\"\n#define DEFAULT_OGL_ES \"libGLESv1_CM.so\"\n\n#elif SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT\n/* EGL AND OpenGL ES support via ANGLE */\n#define DEFAULT_EGL \"libEGL.dll\"\n#define DEFAULT_OGL_ES2 \"libGLESv2.dll\"\n#define DEFAULT_OGL_ES_PVR \"libGLES_CM.dll\"\n#define DEFAULT_OGL_ES \"libGLESv1_CM.dll\"\n\n#else\n/* Desktop Linux */\n#define DEFAULT_OGL \"libGL.so.1\"\n#define DEFAULT_EGL \"libEGL.so.1\"\n#define DEFAULT_OGL_ES2 \"libGLESv2.so.2\"\n#define DEFAULT_OGL_ES_PVR \"libGLES_CM.so.1\"\n#define DEFAULT_OGL_ES \"libGLESv1_CM.so.1\"\n#endif /* SDL_VIDEO_DRIVER_RPI */\n\n#define LOAD_FUNC(NAME) \\\n_this->egl_data->NAME = SDL_LoadFunction(_this->egl_data->dll_handle, #NAME); \\\nif (!_this->egl_data->NAME) \\\n{ \\\n    return SDL_SetError(\"Could not retrieve EGL function \" #NAME); \\\n}\n    \n/* EGL implementation of SDL OpenGL ES support */\n#ifdef EGL_KHR_create_context        \nstatic int SDL_EGL_HasExtension(_THIS, const char *ext)\n{\n    int i;\n    int len = 0;\n    size_t ext_len;\n    const char *exts;\n    const char *ext_word;\n\n    ext_len = SDL_strlen(ext);\n    exts = _this->egl_data->eglQueryString(_this->egl_data->egl_display, EGL_EXTENSIONS);\n\n    if (exts) {\n        ext_word = exts;\n\n        for (i = 0; exts[i] != 0; i++) {\n            if (exts[i] == ' ') {\n                if (ext_len == len && !SDL_strncmp(ext_word, ext, len)) {\n                    return 1;\n                }\n\n                len = 0;\n                ext_word = &exts[i + 1];\n            } else {\n                len++;\n            }\n        }\n    }\n\n    return 0;\n}\n#endif /* EGL_KHR_create_context */\n\nvoid *\nSDL_EGL_GetProcAddress(_THIS, const char *proc)\n{\n    static char procname[1024];\n    void *retval;\n    \n    /* eglGetProcAddress is busted on Android http://code.google.com/p/android/issues/detail?id=7681 */\n#if !defined(SDL_VIDEO_DRIVER_ANDROID) && !defined(SDL_VIDEO_DRIVER_MIR) \n    if (_this->egl_data->eglGetProcAddress) {\n        retval = _this->egl_data->eglGetProcAddress(proc);\n        if (retval) {\n            return retval;\n        }\n    }\n#endif\n    \n    retval = SDL_LoadFunction(_this->egl_data->egl_dll_handle, proc);\n    if (!retval && SDL_strlen(proc) <= 1022) {\n        procname[0] = '_';\n        SDL_strlcpy(procname + 1, proc, 1022);\n        retval = SDL_LoadFunction(_this->egl_data->egl_dll_handle, procname);\n    }\n    return retval;\n}\n\nvoid\nSDL_EGL_UnloadLibrary(_THIS)\n{\n    if (_this->egl_data) {\n        if (_this->egl_data->egl_display) {\n            _this->egl_data->eglTerminate(_this->egl_data->egl_display);\n            _this->egl_data->egl_display = NULL;\n        }\n\n        if (_this->egl_data->dll_handle) {\n            SDL_UnloadObject(_this->egl_data->dll_handle);\n            _this->egl_data->dll_handle = NULL;\n        }\n        if (_this->egl_data->egl_dll_handle) {\n            SDL_UnloadObject(_this->egl_data->egl_dll_handle);\n            _this->egl_data->egl_dll_handle = NULL;\n        }\n        \n        SDL_free(_this->egl_data);\n        _this->egl_data = NULL;\n    }\n}\n\nint\nSDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_display)\n{\n    void *dll_handle = NULL, *egl_dll_handle = NULL; /* The naming is counter intuitive, but hey, I just work here -- Gabriel */\n    const char *path = NULL;\n#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT\n    const char *d3dcompiler;\n#endif\n\n    if (_this->egl_data) {\n        return SDL_SetError(\"OpenGL ES context already created\");\n    }\n\n    _this->egl_data = (struct SDL_EGL_VideoData *) SDL_calloc(1, sizeof(SDL_EGL_VideoData));\n    if (!_this->egl_data) {\n        return SDL_OutOfMemory();\n    }\n\n#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT\n    d3dcompiler = SDL_GetHint(SDL_HINT_VIDEO_WIN_D3DCOMPILER);\n    if (!d3dcompiler) {\n        if (WIN_IsWindowsVistaOrGreater()) {\n            d3dcompiler = \"d3dcompiler_46.dll\";\n        } else {\n            d3dcompiler = \"d3dcompiler_43.dll\";\n        }\n    }\n    if (SDL_strcasecmp(d3dcompiler, \"none\") != 0) {\n        SDL_LoadObject(d3dcompiler);\n    }\n#endif\n\n    /* A funny thing, loading EGL.so first does not work on the Raspberry, so we load libGL* first */\n    path = SDL_getenv(\"SDL_VIDEO_GL_DRIVER\");\n    if (path != NULL) {\n        egl_dll_handle = SDL_LoadObject(path);\n    }\n\n    if (egl_dll_handle == NULL) {\n        if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {\n            if (_this->gl_config.major_version > 1) {\n                path = DEFAULT_OGL_ES2;\n                egl_dll_handle = SDL_LoadObject(path);\n            } else {\n                path = DEFAULT_OGL_ES;\n                egl_dll_handle = SDL_LoadObject(path);\n                if (egl_dll_handle == NULL) {\n                    path = DEFAULT_OGL_ES_PVR;\n                    egl_dll_handle = SDL_LoadObject(path);\n                }\n            }\n        }\n#ifdef DEFAULT_OGL         \n        else {\n            path = DEFAULT_OGL;\n            egl_dll_handle = SDL_LoadObject(path);\n        }\n#endif        \n    }\n    _this->egl_data->egl_dll_handle = egl_dll_handle;\n\n    if (egl_dll_handle == NULL) {\n        return SDL_SetError(\"Could not initialize OpenGL / GLES library\");\n    }\n\n    /* Loading libGL* in the previous step took care of loading libEGL.so, but we future proof by double checking */\n    if (egl_path != NULL) {\n        dll_handle = SDL_LoadObject(egl_path);\n    }   \n    /* Try loading a EGL symbol, if it does not work try the default library paths */\n    if (dll_handle == NULL || SDL_LoadFunction(dll_handle, \"eglChooseConfig\") == NULL) {\n        if (dll_handle != NULL) {\n            SDL_UnloadObject(dll_handle);\n        }\n        path = SDL_getenv(\"SDL_VIDEO_EGL_DRIVER\");\n        if (path == NULL) {\n            path = DEFAULT_EGL;\n        }\n        dll_handle = SDL_LoadObject(path);\n        if (dll_handle == NULL || SDL_LoadFunction(dll_handle, \"eglChooseConfig\") == NULL) {\n            if (dll_handle != NULL) {\n                SDL_UnloadObject(dll_handle);\n            }\n            return SDL_SetError(\"Could not load EGL library\");\n        }\n        SDL_ClearError();\n    }\n\n    _this->egl_data->dll_handle = dll_handle;\n\n    /* Load new function pointers */\n    LOAD_FUNC(eglGetDisplay);\n    LOAD_FUNC(eglInitialize);\n    LOAD_FUNC(eglTerminate);\n    LOAD_FUNC(eglGetProcAddress);\n    LOAD_FUNC(eglChooseConfig);\n    LOAD_FUNC(eglGetConfigAttrib);\n    LOAD_FUNC(eglCreateContext);\n    LOAD_FUNC(eglDestroyContext);\n    LOAD_FUNC(eglCreateWindowSurface);\n    LOAD_FUNC(eglDestroySurface);\n    LOAD_FUNC(eglMakeCurrent);\n    LOAD_FUNC(eglSwapBuffers);\n    LOAD_FUNC(eglSwapInterval);\n    LOAD_FUNC(eglWaitNative);\n    LOAD_FUNC(eglWaitGL);\n    LOAD_FUNC(eglBindAPI);\n    LOAD_FUNC(eglQueryString);\n    \n#if !defined(__WINRT__)\n    _this->egl_data->egl_display = _this->egl_data->eglGetDisplay(native_display);\n    if (!_this->egl_data->egl_display) {\n        return SDL_SetError(\"Could not get EGL display\");\n    }\n    \n    if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) {\n        return SDL_SetError(\"Could not initialize EGL\");\n    }\n#endif\n\n    _this->gl_config.driver_loaded = 1;\n\n    if (path) {\n        SDL_strlcpy(_this->gl_config.driver_path, path, sizeof(_this->gl_config.driver_path) - 1);\n    } else {\n        *_this->gl_config.driver_path = '\\0';\n    }\n    \n    return 0;\n}\n\nint\nSDL_EGL_ChooseConfig(_THIS) \n{\n    /* 64 seems nice. */\n    EGLint attribs[64];\n    EGLint found_configs = 0, value;\n    /* 128 seems even nicer here */\n    EGLConfig configs[128];\n    int i, j, best_bitdiff = -1, bitdiff;\n    \n    if (!_this->egl_data) {\n        /* The EGL library wasn't loaded, SDL_GetError() should have info */\n        return -1;\n    }\n  \n    /* Get a valid EGL configuration */\n    i = 0;\n    attribs[i++] = EGL_RED_SIZE;\n    attribs[i++] = _this->gl_config.red_size;\n    attribs[i++] = EGL_GREEN_SIZE;\n    attribs[i++] = _this->gl_config.green_size;\n    attribs[i++] = EGL_BLUE_SIZE;\n    attribs[i++] = _this->gl_config.blue_size;\n    \n    if (_this->gl_config.alpha_size) {\n        attribs[i++] = EGL_ALPHA_SIZE;\n        attribs[i++] = _this->gl_config.alpha_size;\n    }\n    \n    if (_this->gl_config.buffer_size) {\n        attribs[i++] = EGL_BUFFER_SIZE;\n        attribs[i++] = _this->gl_config.buffer_size;\n    }\n    \n    attribs[i++] = EGL_DEPTH_SIZE;\n    attribs[i++] = _this->gl_config.depth_size;\n    \n    if (_this->gl_config.stencil_size) {\n        attribs[i++] = EGL_STENCIL_SIZE;\n        attribs[i++] = _this->gl_config.stencil_size;\n    }\n    \n    if (_this->gl_config.multisamplebuffers) {\n        attribs[i++] = EGL_SAMPLE_BUFFERS;\n        attribs[i++] = _this->gl_config.multisamplebuffers;\n    }\n    \n    if (_this->gl_config.multisamplesamples) {\n        attribs[i++] = EGL_SAMPLES;\n        attribs[i++] = _this->gl_config.multisamplesamples;\n    }\n\n    if (_this->gl_config.framebuffer_srgb_capable) {\n#ifdef EGL_KHR_gl_colorspace\n        if (SDL_EGL_HasExtension(_this, \"EGL_KHR_gl_colorspace\")) {\n            attribs[i++] = EGL_GL_COLORSPACE_KHR;\n            attribs[i++] = EGL_GL_COLORSPACE_SRGB_KHR;\n        } else\n#endif\n        {\n            return SDL_SetError(\"EGL implementation does not support sRGB system framebuffers\");\n        }\n    }\n\n    attribs[i++] = EGL_RENDERABLE_TYPE;\n    if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {\n#ifdef EGL_KHR_create_context\n        if (_this->gl_config.major_version >= 3 &&\n            SDL_EGL_HasExtension(_this, \"EGL_KHR_create_context\")) {\n            attribs[i++] = EGL_OPENGL_ES3_BIT_KHR;\n        } else\n#endif\n        if (_this->gl_config.major_version >= 2) {\n            attribs[i++] = EGL_OPENGL_ES2_BIT;\n        } else {\n            attribs[i++] = EGL_OPENGL_ES_BIT;\n        }\n        _this->egl_data->eglBindAPI(EGL_OPENGL_ES_API);\n    } else {\n        attribs[i++] = EGL_OPENGL_BIT;\n        _this->egl_data->eglBindAPI(EGL_OPENGL_API);\n    }\n\n    attribs[i++] = EGL_NONE;\n\n    if (_this->egl_data->eglChooseConfig(_this->egl_data->egl_display,\n        attribs,\n        configs, SDL_arraysize(configs),\n        &found_configs) == EGL_FALSE ||\n        found_configs == 0) {\n        return SDL_SetError(\"Couldn't find matching EGL config\");\n    }\n\n    /* eglChooseConfig returns a number of configurations that match or exceed the requested attribs. */\n    /* From those, we select the one that matches our requirements more closely via a makeshift algorithm */\n\n    for (i = 0; i < found_configs; i++ ) {\n        bitdiff = 0;\n        for (j = 0; j < SDL_arraysize(attribs) - 1; j += 2) {\n            if (attribs[j] == EGL_NONE) {\n               break;\n            }\n            \n            if ( attribs[j+1] != EGL_DONT_CARE && (\n                attribs[j] == EGL_RED_SIZE ||\n                attribs[j] == EGL_GREEN_SIZE ||\n                attribs[j] == EGL_BLUE_SIZE ||\n                attribs[j] == EGL_ALPHA_SIZE ||\n                attribs[j] == EGL_DEPTH_SIZE ||\n                attribs[j] == EGL_STENCIL_SIZE)) {\n                _this->egl_data->eglGetConfigAttrib(_this->egl_data->egl_display, configs[i], attribs[j], &value);\n                bitdiff += value - attribs[j + 1]; /* value is always >= attrib */\n            }\n        }\n\n        if (bitdiff < best_bitdiff || best_bitdiff == -1) {\n            _this->egl_data->egl_config = configs[i];\n            \n            best_bitdiff = bitdiff;\n        }\n\n        if (bitdiff == 0) {\n            break; /* we found an exact match! */\n        }\n    }\n    \n    return 0;\n}\n\nSDL_GLContext\nSDL_EGL_CreateContext(_THIS, EGLSurface egl_surface)\n{\n    /* max 14 values plus terminator. */\n    EGLint attribs[15];\n    int attr = 0;\n\n    EGLContext egl_context, share_context = EGL_NO_CONTEXT;\n    EGLint profile_mask = _this->gl_config.profile_mask;\n    EGLint major_version = _this->gl_config.major_version;\n    EGLint minor_version = _this->gl_config.minor_version;\n    SDL_bool profile_es = (profile_mask == SDL_GL_CONTEXT_PROFILE_ES);\n\n    if (!_this->egl_data) {\n        /* The EGL library wasn't loaded, SDL_GetError() should have info */\n        return NULL;\n    }\n\n    if (_this->gl_config.share_with_current_context) {\n        share_context = (EGLContext)SDL_GL_GetCurrentContext();\n    }\n\n    /* Set the context version and other attributes. */\n    if ((major_version < 3 || (minor_version == 0 && profile_es)) &&\n        _this->gl_config.flags == 0 &&\n        (profile_mask == 0 || profile_es)) {\n        /* Create a context without using EGL_KHR_create_context attribs.\n         * When creating a GLES context without EGL_KHR_create_context we can\n         * only specify the major version. When creating a desktop GL context\n         * we can't specify any version, so we only try in that case when the\n         * version is less than 3.0 (matches SDL's GLX/WGL behavior.)\n         */\n        if (profile_es) {\n            attribs[attr++] = EGL_CONTEXT_CLIENT_VERSION;\n            attribs[attr++] = SDL_max(major_version, 1);\n        }\n    } else {\n#ifdef EGL_KHR_create_context\n        /* The Major/minor version, context profiles, and context flags can\n         * only be specified when this extension is available.\n         */\n        if (SDL_EGL_HasExtension(_this, \"EGL_KHR_create_context\")) {\n            attribs[attr++] = EGL_CONTEXT_MAJOR_VERSION_KHR;\n            attribs[attr++] = major_version;\n            attribs[attr++] = EGL_CONTEXT_MINOR_VERSION_KHR;\n            attribs[attr++] = minor_version;\n\n            /* SDL profile bits match EGL profile bits. */\n            if (profile_mask != 0 && profile_mask != SDL_GL_CONTEXT_PROFILE_ES) {\n                attribs[attr++] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR;\n                attribs[attr++] = profile_mask;\n            }\n\n            /* SDL flags match EGL flags. */\n            if (_this->gl_config.flags != 0) {\n                attribs[attr++] = EGL_CONTEXT_FLAGS_KHR;\n                attribs[attr++] = _this->gl_config.flags;\n            }\n        } else\n#endif /* EGL_KHR_create_context */\n        {\n            SDL_SetError(\"Could not create EGL context (context attributes are not supported)\");\n            return NULL;\n        }\n    }\n\n    attribs[attr++] = EGL_NONE;\n\n    /* Bind the API */\n    if (profile_es) {\n        _this->egl_data->eglBindAPI(EGL_OPENGL_ES_API);\n    } else {\n        _this->egl_data->eglBindAPI(EGL_OPENGL_API);\n    }\n\n    egl_context = _this->egl_data->eglCreateContext(_this->egl_data->egl_display,\n                                      _this->egl_data->egl_config,\n                                      share_context, attribs);\n\n    if (egl_context == EGL_NO_CONTEXT) {\n        SDL_SetError(\"Could not create EGL context\");\n        return NULL;\n    }\n\n    _this->egl_data->egl_swapinterval = 0;\n\n    if (SDL_EGL_MakeCurrent(_this, egl_surface, egl_context) < 0) {\n        SDL_EGL_DeleteContext(_this, egl_context);\n        SDL_SetError(\"Could not make EGL context current\");\n        return NULL;\n    }\n\n    return (SDL_GLContext) egl_context;\n}\n\nint\nSDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context)\n{\n    EGLContext egl_context = (EGLContext) context;\n\n    if (!_this->egl_data) {\n        return SDL_SetError(\"OpenGL not initialized\");\n    }\n    \n    /* The android emulator crashes badly if you try to eglMakeCurrent \n     * with a valid context and invalid surface, so we have to check for both here.\n     */\n    if (!egl_context || !egl_surface) {\n         _this->egl_data->eglMakeCurrent(_this->egl_data->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);\n    } else {\n        if (!_this->egl_data->eglMakeCurrent(_this->egl_data->egl_display,\n            egl_surface, egl_surface, egl_context)) {\n            return SDL_SetError(\"Unable to make EGL context current\");\n        }\n    }\n      \n    return 0;\n}\n\nint\nSDL_EGL_SetSwapInterval(_THIS, int interval)\n{\n    EGLBoolean status;\n    \n    if (!_this->egl_data) {\n        return SDL_SetError(\"EGL not initialized\");\n    }\n    \n    status = _this->egl_data->eglSwapInterval(_this->egl_data->egl_display, interval);\n    if (status == EGL_TRUE) {\n        _this->egl_data->egl_swapinterval = interval;\n        return 0;\n    }\n    \n    return SDL_SetError(\"Unable to set the EGL swap interval\");\n}\n\nint\nSDL_EGL_GetSwapInterval(_THIS)\n{\n    if (!_this->egl_data) {\n        SDL_SetError(\"EGL not initialized\");\n        return 0;\n    }\n    \n    return _this->egl_data->egl_swapinterval;\n}\n\nvoid\nSDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface)\n{\n    _this->egl_data->eglSwapBuffers(_this->egl_data->egl_display, egl_surface);\n}\n\nvoid\nSDL_EGL_DeleteContext(_THIS, SDL_GLContext context)\n{\n    EGLContext egl_context = (EGLContext) context;\n\n    /* Clean up GLES and EGL */\n    if (!_this->egl_data) {\n        return;\n    }\n    \n    if (egl_context != NULL && egl_context != EGL_NO_CONTEXT) {\n        SDL_EGL_MakeCurrent(_this, NULL, NULL);\n        _this->egl_data->eglDestroyContext(_this->egl_data->egl_display, egl_context);\n    }\n        \n}\n\nEGLSurface *\nSDL_EGL_CreateSurface(_THIS, NativeWindowType nw) \n{\n    if (SDL_EGL_ChooseConfig(_this) != 0) {\n        return EGL_NO_SURFACE;\n    }\n    \n#if __ANDROID__\n    {\n        /* Android docs recommend doing this!\n         * Ref: http://developer.android.com/reference/android/app/NativeActivity.html \n         */\n        EGLint format;\n        _this->egl_data->eglGetConfigAttrib(_this->egl_data->egl_display,\n                                            _this->egl_data->egl_config, \n                                            EGL_NATIVE_VISUAL_ID, &format);\n\n        ANativeWindow_setBuffersGeometry(nw, 0, 0, format);\n    }\n#endif    \n    \n    return _this->egl_data->eglCreateWindowSurface(\n            _this->egl_data->egl_display,\n            _this->egl_data->egl_config,\n            nw, NULL);\n}\n\nvoid\nSDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface) \n{\n    if (!_this->egl_data) {\n        return;\n    }\n    \n    if (egl_surface != EGL_NO_SURFACE) {\n        _this->egl_data->eglDestroySurface(_this->egl_data->egl_display, egl_surface);\n    }\n}\n\n#endif /* SDL_VIDEO_OPENGL_EGL */\n\n/* vi: set ts=4 sw=4 expandtab: */\n    \n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_egl_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_egl_h\n#define _SDL_egl_h\n\n#if SDL_VIDEO_OPENGL_EGL\n\n#include \"SDL_egl.h\"\n\n#include \"SDL_sysvideo.h\"\n\ntypedef struct SDL_EGL_VideoData\n{\n    void *egl_dll_handle, *dll_handle;\n    EGLDisplay egl_display;\n    EGLConfig egl_config;\n    int egl_swapinterval;\n    \n    EGLDisplay(EGLAPIENTRY *eglGetDisplay) (NativeDisplayType display);\n    EGLBoolean(EGLAPIENTRY *eglInitialize) (EGLDisplay dpy, EGLint * major,\n                                EGLint * minor);\n    EGLBoolean(EGLAPIENTRY  *eglTerminate) (EGLDisplay dpy);\n    \n    void *(EGLAPIENTRY *eglGetProcAddress) (const char * procName);\n    \n    EGLBoolean(EGLAPIENTRY *eglChooseConfig) (EGLDisplay dpy,\n                                  const EGLint * attrib_list,\n                                  EGLConfig * configs,\n                                  EGLint config_size, EGLint * num_config);\n    \n    EGLContext(EGLAPIENTRY *eglCreateContext) (EGLDisplay dpy,\n                                   EGLConfig config,\n                                   EGLContext share_list,\n                                   const EGLint * attrib_list);\n    \n    EGLBoolean(EGLAPIENTRY *eglDestroyContext) (EGLDisplay dpy, EGLContext ctx);\n    \n    EGLSurface(EGLAPIENTRY *eglCreateWindowSurface) (EGLDisplay dpy,\n                                         EGLConfig config,\n                                         NativeWindowType window,\n                                         const EGLint * attrib_list);\n    EGLBoolean(EGLAPIENTRY *eglDestroySurface) (EGLDisplay dpy, EGLSurface surface);\n    \n    EGLBoolean(EGLAPIENTRY *eglMakeCurrent) (EGLDisplay dpy, EGLSurface draw,\n                                 EGLSurface read, EGLContext ctx);\n    \n    EGLBoolean(EGLAPIENTRY *eglSwapBuffers) (EGLDisplay dpy, EGLSurface draw);\n    \n    EGLBoolean(EGLAPIENTRY *eglSwapInterval) (EGLDisplay dpy, EGLint interval);\n    \n    const char *(EGLAPIENTRY *eglQueryString) (EGLDisplay dpy, EGLint name);\n    \n    EGLBoolean(EGLAPIENTRY  *eglGetConfigAttrib) (EGLDisplay dpy, EGLConfig config,\n                                     EGLint attribute, EGLint * value);\n    \n    EGLBoolean(EGLAPIENTRY *eglWaitNative) (EGLint  engine);\n\n    EGLBoolean(EGLAPIENTRY *eglWaitGL)(void);\n    \n    EGLBoolean(EGLAPIENTRY *eglBindAPI)(EGLenum);\n\n} SDL_EGL_VideoData;\n\n/* OpenGLES functions */\nextern int SDL_EGL_GetAttribute(_THIS, SDL_GLattr attrib, int *value);\nextern int SDL_EGL_LoadLibrary(_THIS, const char *path, NativeDisplayType native_display);\nextern void *SDL_EGL_GetProcAddress(_THIS, const char *proc);\nextern void SDL_EGL_UnloadLibrary(_THIS);\nextern int SDL_EGL_ChooseConfig(_THIS);\nextern int SDL_EGL_SetSwapInterval(_THIS, int interval);\nextern int SDL_EGL_GetSwapInterval(_THIS);\nextern void SDL_EGL_DeleteContext(_THIS, SDL_GLContext context);\nextern EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw);\nextern void SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface);\n\n/* These need to be wrapped to get the surface for the window by the platform GLES implementation */\nextern SDL_GLContext SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface);\nextern int SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context);\nextern void SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface);\n\n/* A few of useful macros */\n\n#define SDL_EGL_SwapWindow_impl(BACKEND) void \\\nBACKEND ## _GLES_SwapWindow(_THIS, SDL_Window * window) \\\n{\\\n    SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\\\n}\n\n#define SDL_EGL_MakeCurrent_impl(BACKEND) int \\\nBACKEND ## _GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) \\\n{\\\n    if (window && context) { \\\n        return SDL_EGL_MakeCurrent(_this, ((SDL_WindowData *) window->driverdata)->egl_surface, context); \\\n    }\\\n    else {\\\n        return SDL_EGL_MakeCurrent(_this, NULL, NULL);\\\n    }\\\n}\n\n#define SDL_EGL_CreateContext_impl(BACKEND) SDL_GLContext \\\nBACKEND ## _GLES_CreateContext(_THIS, SDL_Window * window) \\\n{\\\n    return SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\\\n}\n\n#endif /* SDL_VIDEO_OPENGL_EGL */\n\n#endif /* _SDL_egl_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_fillrect.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n#include \"SDL_blit.h\"\n\n\n#ifdef __SSE__\n/* *INDENT-OFF* */\n\n#ifdef _MSC_VER\n#define SSE_BEGIN \\\n    __m128 c128; \\\n    c128.m128_u32[0] = color; \\\n    c128.m128_u32[1] = color; \\\n    c128.m128_u32[2] = color; \\\n    c128.m128_u32[3] = color;\n#else\n#define SSE_BEGIN \\\n    __m128 c128; \\\n    DECLARE_ALIGNED(Uint32, cccc[4], 16); \\\n    cccc[0] = color; \\\n    cccc[1] = color; \\\n    cccc[2] = color; \\\n    cccc[3] = color; \\\n    c128 = *(__m128 *)cccc;\n#endif\n\n#define SSE_WORK \\\n    for (i = n / 64; i--;) { \\\n        _mm_stream_ps((float *)(p+0), c128); \\\n        _mm_stream_ps((float *)(p+16), c128); \\\n        _mm_stream_ps((float *)(p+32), c128); \\\n        _mm_stream_ps((float *)(p+48), c128); \\\n        p += 64; \\\n    }\n\n#define SSE_END\n\n#define DEFINE_SSE_FILLRECT(bpp, type) \\\nstatic void \\\nSDL_FillRect##bpp##SSE(Uint8 *pixels, int pitch, Uint32 color, int w, int h) \\\n{ \\\n    int i, n; \\\n    Uint8 *p = NULL; \\\n \\\n    SSE_BEGIN; \\\n \\\n    while (h--) { \\\n        n = w * bpp; \\\n        p = pixels; \\\n \\\n        if (n > 63) { \\\n            int adjust = 16 - ((uintptr_t)p & 15); \\\n            if (adjust < 16) { \\\n                n -= adjust; \\\n                adjust /= bpp; \\\n                while (adjust--) { \\\n                    *((type *)p) = (type)color; \\\n                    p += bpp; \\\n                } \\\n            } \\\n            SSE_WORK; \\\n        } \\\n        if (n & 63) { \\\n            int remainder = (n & 63); \\\n            remainder /= bpp; \\\n            while (remainder--) { \\\n                *((type *)p) = (type)color; \\\n                p += bpp; \\\n            } \\\n        } \\\n        pixels += pitch; \\\n    } \\\n \\\n    SSE_END; \\\n}\n\nstatic void\nSDL_FillRect1SSE(Uint8 *pixels, int pitch, Uint32 color, int w, int h)\n{\n    int i, n;\n\n    SSE_BEGIN;\n    while (h--) {\n        Uint8 *p = pixels;\n        n = w;\n\n        if (n > 63) {\n            int adjust = 16 - ((uintptr_t)p & 15);\n            if (adjust) {\n                n -= adjust;\n                SDL_memset(p, color, adjust);\n                p += adjust;\n            }\n            SSE_WORK;\n        }\n        if (n & 63) {\n            int remainder = (n & 63);\n            SDL_memset(p, color, remainder);\n        }\n        pixels += pitch;\n    }\n\n    SSE_END;\n}\n/* DEFINE_SSE_FILLRECT(1, Uint8) */\nDEFINE_SSE_FILLRECT(2, Uint16)\nDEFINE_SSE_FILLRECT(4, Uint32)\n\n/* *INDENT-ON* */\n#endif /* __SSE__ */\n\nstatic void\nSDL_FillRect1(Uint8 * pixels, int pitch, Uint32 color, int w, int h)\n{\n    int n;\n    Uint8 *p = NULL;\n    \n    while (h--) {\n        n = w;\n        p = pixels;\n\n        if (n > 3) {\n            switch ((uintptr_t) p & 3) {\n            case 1:\n                *p++ = (Uint8) color;\n                --n;\n            case 2:\n                *p++ = (Uint8) color;\n                --n;\n            case 3:\n                *p++ = (Uint8) color;\n                --n;\n            }\n            SDL_memset4(p, color, (n >> 2));\n        }\n        if (n & 3) {\n            p += (n & ~3);\n            switch (n & 3) {\n            case 3:\n                *p++ = (Uint8) color;\n            case 2:\n                *p++ = (Uint8) color;\n            case 1:\n                *p++ = (Uint8) color;\n            }\n        }\n        pixels += pitch;\n    }\n}\n\nstatic void\nSDL_FillRect2(Uint8 * pixels, int pitch, Uint32 color, int w, int h)\n{\n    int n;\n    Uint16 *p = NULL;\n    \n    while (h--) {\n        n = w;\n        p = (Uint16 *) pixels;\n\n        if (n > 1) {\n            if ((uintptr_t) p & 2) {\n                *p++ = (Uint16) color;\n                --n;\n            }\n            SDL_memset4(p, color, (n >> 1));\n        }\n        if (n & 1) {\n            p[n - 1] = (Uint16) color;\n        }\n        pixels += pitch;\n    }\n}\n\nstatic void\nSDL_FillRect3(Uint8 * pixels, int pitch, Uint32 color, int w, int h)\n{\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n    Uint8 b1 = (Uint8) (color & 0xFF);\n    Uint8 b2 = (Uint8) ((color >> 8) & 0xFF);\n    Uint8 b3 = (Uint8) ((color >> 16) & 0xFF);\n#elif SDL_BYTEORDER == SDL_BIG_ENDIAN\n    Uint8 b1 = (Uint8) ((color >> 16) & 0xFF);\n    Uint8 b2 = (Uint8) ((color >> 8) & 0xFF);\n    Uint8 b3 = (Uint8) (color & 0xFF);\n#endif\n    int n;\n    Uint8 *p = NULL;\n\n    while (h--) {\n        n = w;\n        p = pixels;\n\n        while (n--) {\n            *p++ = b1;\n            *p++ = b2;\n            *p++ = b3;\n        }\n        pixels += pitch;\n    }\n}\n\nstatic void\nSDL_FillRect4(Uint8 * pixels, int pitch, Uint32 color, int w, int h)\n{\n    while (h--) {\n        SDL_memset4(pixels, color, w);\n        pixels += pitch;\n    }\n}\n\n/* \n * This function performs a fast fill of the given rectangle with 'color'\n */\nint\nSDL_FillRect(SDL_Surface * dst, const SDL_Rect * rect, Uint32 color)\n{\n    SDL_Rect clipped;\n    Uint8 *pixels;\n\n    if (!dst) {\n        return SDL_SetError(\"Passed NULL destination surface\");\n    }\n\n    /* This function doesn't work on surfaces < 8 bpp */\n    if (dst->format->BitsPerPixel < 8) {\n        return SDL_SetError(\"SDL_FillRect(): Unsupported surface format\");\n    }\n\n    /* If 'rect' == NULL, then fill the whole surface */\n    if (rect) {\n        /* Perform clipping */\n        if (!SDL_IntersectRect(rect, &dst->clip_rect, &clipped)) {\n            return 0;\n        }\n        rect = &clipped;\n    } else {\n        rect = &dst->clip_rect;\n        /* Don't attempt to fill if the surface's clip_rect is empty */\n        if (SDL_RectEmpty(rect)) {\n            return 0;\n        }\n    }\n\n    /* Perform software fill */\n    if (!dst->pixels) {\n        return SDL_SetError(\"SDL_FillRect(): You must lock the surface\");\n    }\n\n    pixels = (Uint8 *) dst->pixels + rect->y * dst->pitch +\n                                     rect->x * dst->format->BytesPerPixel;\n\n    switch (dst->format->BytesPerPixel) {\n    case 1:\n        {\n            color |= (color << 8);\n            color |= (color << 16);\n#ifdef __SSE__\n            if (SDL_HasSSE()) {\n                SDL_FillRect1SSE(pixels, dst->pitch, color, rect->w, rect->h);\n                break;\n            }\n#endif\n            SDL_FillRect1(pixels, dst->pitch, color, rect->w, rect->h);\n            break;\n        }\n\n    case 2:\n        {\n            color |= (color << 16);\n#ifdef __SSE__\n            if (SDL_HasSSE()) {\n                SDL_FillRect2SSE(pixels, dst->pitch, color, rect->w, rect->h);\n                break;\n            }\n#endif\n            SDL_FillRect2(pixels, dst->pitch, color, rect->w, rect->h);\n            break;\n        }\n\n    case 3:\n        /* 24-bit RGB is a slow path, at least for now. */\n        {\n            SDL_FillRect3(pixels, dst->pitch, color, rect->w, rect->h);\n            break;\n        }\n\n    case 4:\n        {\n#ifdef __SSE__\n            if (SDL_HasSSE()) {\n                SDL_FillRect4SSE(pixels, dst->pitch, color, rect->w, rect->h);\n                break;\n            }\n#endif\n            SDL_FillRect4(pixels, dst->pitch, color, rect->w, rect->h);\n            break;\n        }\n    }\n\n    /* We're done! */\n    return 0;\n}\n\nint\nSDL_FillRects(SDL_Surface * dst, const SDL_Rect * rects, int count,\n              Uint32 color)\n{\n    int i;\n    int status = 0;\n\n    if (!rects) {\n        return SDL_SetError(\"SDL_FillRects() passed NULL rects\");\n    }\n\n    for (i = 0; i < count; ++i) {\n        status += SDL_FillRect(dst, &rects[i], color);\n    }\n    return status;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_pixels.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* General (mostly internal) pixel/color manipulation routines for SDL */\n\n#include \"SDL_endian.h\"\n#include \"SDL_video.h\"\n#include \"SDL_sysvideo.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_pixels_c.h\"\n#include \"SDL_RLEaccel_c.h\"\n\n\n/* Lookup tables to expand partial bytes to the full 0..255 range */\n\nstatic Uint8 lookup_0[] = {\n0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255\n};\n\nstatic Uint8 lookup_1[] = {\n0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 255\n};\n\nstatic Uint8 lookup_2[] = {\n0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 85, 89, 93, 97, 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 170, 174, 178, 182, 186, 190, 194, 198, 202, 206, 210, 214, 218, 222, 226, 230, 234, 238, 242, 246, 250, 255\n};\n\nstatic Uint8 lookup_3[] = {\n0, 8, 16, 24, 32, 41, 49, 57, 65, 74, 82, 90, 98, 106, 115, 123, 131, 139, 148, 156, 164, 172, 180, 189, 197, 205, 213, 222, 230, 238, 246, 255\n};\n\nstatic Uint8 lookup_4[] = {\n0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255\n};\n\nstatic Uint8 lookup_5[] = {\n0, 36, 72, 109, 145, 182, 218, 255\n};\n\nstatic Uint8 lookup_6[] = {\n0, 85, 170, 255\n};\n\nstatic Uint8 lookup_7[] = {\n0, 255\n};\n\nstatic Uint8 lookup_8[] = {\n255\n};\n\nUint8* SDL_expand_byte[9] = {\n    lookup_0,\n    lookup_1,\n    lookup_2,\n    lookup_3,\n    lookup_4,\n    lookup_5,\n    lookup_6,\n    lookup_7,\n    lookup_8\n};\n\n/* Helper functions */\n\nconst char*\nSDL_GetPixelFormatName(Uint32 format)\n{\n    switch (format) {\n#define CASE(X) case X: return #X;\n    CASE(SDL_PIXELFORMAT_INDEX1LSB)\n    CASE(SDL_PIXELFORMAT_INDEX1MSB)\n    CASE(SDL_PIXELFORMAT_INDEX4LSB)\n    CASE(SDL_PIXELFORMAT_INDEX4MSB)\n    CASE(SDL_PIXELFORMAT_INDEX8)\n    CASE(SDL_PIXELFORMAT_RGB332)\n    CASE(SDL_PIXELFORMAT_RGB444)\n    CASE(SDL_PIXELFORMAT_RGB555)\n    CASE(SDL_PIXELFORMAT_BGR555)\n    CASE(SDL_PIXELFORMAT_ARGB4444)\n    CASE(SDL_PIXELFORMAT_RGBA4444)\n    CASE(SDL_PIXELFORMAT_ABGR4444)\n    CASE(SDL_PIXELFORMAT_BGRA4444)\n    CASE(SDL_PIXELFORMAT_ARGB1555)\n    CASE(SDL_PIXELFORMAT_RGBA5551)\n    CASE(SDL_PIXELFORMAT_ABGR1555)\n    CASE(SDL_PIXELFORMAT_BGRA5551)\n    CASE(SDL_PIXELFORMAT_RGB565)\n    CASE(SDL_PIXELFORMAT_BGR565)\n    CASE(SDL_PIXELFORMAT_RGB24)\n    CASE(SDL_PIXELFORMAT_BGR24)\n    CASE(SDL_PIXELFORMAT_RGB888)\n    CASE(SDL_PIXELFORMAT_RGBX8888)\n    CASE(SDL_PIXELFORMAT_BGR888)\n    CASE(SDL_PIXELFORMAT_BGRX8888)\n    CASE(SDL_PIXELFORMAT_ARGB8888)\n    CASE(SDL_PIXELFORMAT_RGBA8888)\n    CASE(SDL_PIXELFORMAT_ABGR8888)\n    CASE(SDL_PIXELFORMAT_BGRA8888)\n    CASE(SDL_PIXELFORMAT_ARGB2101010)\n    CASE(SDL_PIXELFORMAT_YV12)\n    CASE(SDL_PIXELFORMAT_IYUV)\n    CASE(SDL_PIXELFORMAT_YUY2)\n    CASE(SDL_PIXELFORMAT_UYVY)\n    CASE(SDL_PIXELFORMAT_YVYU)\n    CASE(SDL_PIXELFORMAT_NV12)\n    CASE(SDL_PIXELFORMAT_NV21)\n#undef CASE\n    default:\n        return \"SDL_PIXELFORMAT_UNKNOWN\";\n    }\n}\n\nSDL_bool\nSDL_PixelFormatEnumToMasks(Uint32 format, int *bpp, Uint32 * Rmask,\n                           Uint32 * Gmask, Uint32 * Bmask, Uint32 * Amask)\n{\n    Uint32 masks[4];\n\n    /* This function doesn't work with FourCC pixel formats */\n    if (SDL_ISPIXELFORMAT_FOURCC(format)) {\n        SDL_SetError(\"FOURCC pixel formats are not supported\");\n        return SDL_FALSE;\n    }\n\n    /* Initialize the values here */\n    if (SDL_BYTESPERPIXEL(format) <= 2) {\n        *bpp = SDL_BITSPERPIXEL(format);\n    } else {\n        *bpp = SDL_BYTESPERPIXEL(format) * 8;\n    }\n    *Rmask = *Gmask = *Bmask = *Amask = 0;\n\n    if (format == SDL_PIXELFORMAT_RGB24) {\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n        *Rmask = 0x00FF0000;\n        *Gmask = 0x0000FF00;\n        *Bmask = 0x000000FF;\n#else\n        *Rmask = 0x000000FF;\n        *Gmask = 0x0000FF00;\n        *Bmask = 0x00FF0000;\n#endif\n        return SDL_TRUE;\n    }\n\n    if (format == SDL_PIXELFORMAT_BGR24) {\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n        *Rmask = 0x000000FF;\n        *Gmask = 0x0000FF00;\n        *Bmask = 0x00FF0000;\n#else\n        *Rmask = 0x00FF0000;\n        *Gmask = 0x0000FF00;\n        *Bmask = 0x000000FF;\n#endif\n        return SDL_TRUE;\n    }\n\n    if (SDL_PIXELTYPE(format) != SDL_PIXELTYPE_PACKED8 &&\n        SDL_PIXELTYPE(format) != SDL_PIXELTYPE_PACKED16 &&\n        SDL_PIXELTYPE(format) != SDL_PIXELTYPE_PACKED32) {\n        /* Not a format that uses masks */\n        return SDL_TRUE;\n    }\n\n    switch (SDL_PIXELLAYOUT(format)) {\n    case SDL_PACKEDLAYOUT_332:\n        masks[0] = 0x00000000;\n        masks[1] = 0x000000E0;\n        masks[2] = 0x0000001C;\n        masks[3] = 0x00000003;\n        break;\n    case SDL_PACKEDLAYOUT_4444:\n        masks[0] = 0x0000F000;\n        masks[1] = 0x00000F00;\n        masks[2] = 0x000000F0;\n        masks[3] = 0x0000000F;\n        break;\n    case SDL_PACKEDLAYOUT_1555:\n        masks[0] = 0x00008000;\n        masks[1] = 0x00007C00;\n        masks[2] = 0x000003E0;\n        masks[3] = 0x0000001F;\n        break;\n    case SDL_PACKEDLAYOUT_5551:\n        masks[0] = 0x0000F800;\n        masks[1] = 0x000007C0;\n        masks[2] = 0x0000003E;\n        masks[3] = 0x00000001;\n        break;\n    case SDL_PACKEDLAYOUT_565:\n        masks[0] = 0x00000000;\n        masks[1] = 0x0000F800;\n        masks[2] = 0x000007E0;\n        masks[3] = 0x0000001F;\n        break;\n    case SDL_PACKEDLAYOUT_8888:\n        masks[0] = 0xFF000000;\n        masks[1] = 0x00FF0000;\n        masks[2] = 0x0000FF00;\n        masks[3] = 0x000000FF;\n        break;\n    case SDL_PACKEDLAYOUT_2101010:\n        masks[0] = 0xC0000000;\n        masks[1] = 0x3FF00000;\n        masks[2] = 0x000FFC00;\n        masks[3] = 0x000003FF;\n        break;\n    case SDL_PACKEDLAYOUT_1010102:\n        masks[0] = 0xFFC00000;\n        masks[1] = 0x003FF000;\n        masks[2] = 0x00000FFC;\n        masks[3] = 0x00000003;\n        break;\n    default:\n        SDL_SetError(\"Unknown pixel format\");\n        return SDL_FALSE;\n    }\n\n    switch (SDL_PIXELORDER(format)) {\n    case SDL_PACKEDORDER_XRGB:\n        *Rmask = masks[1];\n        *Gmask = masks[2];\n        *Bmask = masks[3];\n        break;\n    case SDL_PACKEDORDER_RGBX:\n        *Rmask = masks[0];\n        *Gmask = masks[1];\n        *Bmask = masks[2];\n        break;\n    case SDL_PACKEDORDER_ARGB:\n        *Amask = masks[0];\n        *Rmask = masks[1];\n        *Gmask = masks[2];\n        *Bmask = masks[3];\n        break;\n    case SDL_PACKEDORDER_RGBA:\n        *Rmask = masks[0];\n        *Gmask = masks[1];\n        *Bmask = masks[2];\n        *Amask = masks[3];\n        break;\n    case SDL_PACKEDORDER_XBGR:\n        *Bmask = masks[1];\n        *Gmask = masks[2];\n        *Rmask = masks[3];\n        break;\n    case SDL_PACKEDORDER_BGRX:\n        *Bmask = masks[0];\n        *Gmask = masks[1];\n        *Rmask = masks[2];\n        break;\n    case SDL_PACKEDORDER_BGRA:\n        *Bmask = masks[0];\n        *Gmask = masks[1];\n        *Rmask = masks[2];\n        *Amask = masks[3];\n        break;\n    case SDL_PACKEDORDER_ABGR:\n        *Amask = masks[0];\n        *Bmask = masks[1];\n        *Gmask = masks[2];\n        *Rmask = masks[3];\n        break;\n    default:\n        SDL_SetError(\"Unknown pixel format\");\n        return SDL_FALSE;\n    }\n    return SDL_TRUE;\n}\n\nUint32\nSDL_MasksToPixelFormatEnum(int bpp, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask,\n                           Uint32 Amask)\n{\n    switch (bpp) {\n    case 1:\n        /* SDL defaults to MSB ordering */\n        return SDL_PIXELFORMAT_INDEX1MSB;\n    case 4:\n        /* SDL defaults to MSB ordering */\n        return SDL_PIXELFORMAT_INDEX4MSB;\n    case 8:\n        if (Rmask == 0) {\n            return SDL_PIXELFORMAT_INDEX8;\n        }\n        if (Rmask == 0xE0 &&\n            Gmask == 0x1C &&\n            Bmask == 0x03 &&\n            Amask == 0x00) {\n            return SDL_PIXELFORMAT_RGB332;\n        }\n        break;\n    case 12:\n        if (Rmask == 0) {\n            return SDL_PIXELFORMAT_RGB444;\n        }\n        if (Rmask == 0x0F00 &&\n            Gmask == 0x00F0 &&\n            Bmask == 0x000F &&\n            Amask == 0x0000) {\n            return SDL_PIXELFORMAT_RGB444;\n        }\n        break;\n    case 15:\n        if (Rmask == 0) {\n            return SDL_PIXELFORMAT_RGB555;\n        }\n        /* Fall through to 16-bit checks */\n    case 16:\n        if (Rmask == 0) {\n            return SDL_PIXELFORMAT_RGB565;\n        }\n        if (Rmask == 0x7C00 &&\n            Gmask == 0x03E0 &&\n            Bmask == 0x001F &&\n            Amask == 0x0000) {\n            return SDL_PIXELFORMAT_RGB555;\n        }\n        if (Rmask == 0x001F &&\n            Gmask == 0x03E0 &&\n            Bmask == 0x7C00 &&\n            Amask == 0x0000) {\n            return SDL_PIXELFORMAT_BGR555;\n        }\n        if (Rmask == 0x0F00 &&\n            Gmask == 0x00F0 &&\n            Bmask == 0x000F &&\n            Amask == 0xF000) {\n            return SDL_PIXELFORMAT_ARGB4444;\n        }\n        if (Rmask == 0xF000 &&\n            Gmask == 0x0F00 &&\n            Bmask == 0x00F0 &&\n            Amask == 0x000F) {\n            return SDL_PIXELFORMAT_RGBA4444;\n        }\n        if (Rmask == 0x000F &&\n            Gmask == 0x00F0 &&\n            Bmask == 0x0F00 &&\n            Amask == 0xF000) {\n            return SDL_PIXELFORMAT_ABGR4444;\n        }\n        if (Rmask == 0x00F0 &&\n            Gmask == 0x0F00 &&\n            Bmask == 0xF000 &&\n            Amask == 0x000F) {\n            return SDL_PIXELFORMAT_BGRA4444;\n        }\n        if (Rmask == 0x7C00 &&\n            Gmask == 0x03E0 &&\n            Bmask == 0x001F &&\n            Amask == 0x8000) {\n            return SDL_PIXELFORMAT_ARGB1555;\n        }\n        if (Rmask == 0xF800 &&\n            Gmask == 0x07C0 &&\n            Bmask == 0x003E &&\n            Amask == 0x0001) {\n            return SDL_PIXELFORMAT_RGBA5551;\n        }\n        if (Rmask == 0x001F &&\n            Gmask == 0x03E0 &&\n            Bmask == 0x7C00 &&\n            Amask == 0x8000) {\n            return SDL_PIXELFORMAT_ABGR1555;\n        }\n        if (Rmask == 0x003E &&\n            Gmask == 0x07C0 &&\n            Bmask == 0xF800 &&\n            Amask == 0x0001) {\n            return SDL_PIXELFORMAT_BGRA5551;\n        }\n        if (Rmask == 0xF800 &&\n            Gmask == 0x07E0 &&\n            Bmask == 0x001F &&\n            Amask == 0x0000) {\n            return SDL_PIXELFORMAT_RGB565;\n        }\n        if (Rmask == 0x001F &&\n            Gmask == 0x07E0 &&\n            Bmask == 0xF800 &&\n            Amask == 0x0000) {\n            return SDL_PIXELFORMAT_BGR565;\n        }\n        break;\n    case 24:\n        switch (Rmask) {\n        case 0:\n        case 0x00FF0000:\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n            return SDL_PIXELFORMAT_RGB24;\n#else\n            return SDL_PIXELFORMAT_BGR24;\n#endif\n        case 0x000000FF:\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n            return SDL_PIXELFORMAT_BGR24;\n#else\n            return SDL_PIXELFORMAT_RGB24;\n#endif\n        }\n    case 32:\n        if (Rmask == 0) {\n            return SDL_PIXELFORMAT_RGB888;\n        }\n        if (Rmask == 0x00FF0000 &&\n            Gmask == 0x0000FF00 &&\n            Bmask == 0x000000FF &&\n            Amask == 0x00000000) {\n            return SDL_PIXELFORMAT_RGB888;\n        }\n        if (Rmask == 0xFF000000 &&\n            Gmask == 0x00FF0000 &&\n            Bmask == 0x0000FF00 &&\n            Amask == 0x00000000) {\n            return SDL_PIXELFORMAT_RGBX8888;\n        }\n        if (Rmask == 0x000000FF &&\n            Gmask == 0x0000FF00 &&\n            Bmask == 0x00FF0000 &&\n            Amask == 0x00000000) {\n            return SDL_PIXELFORMAT_BGR888;\n        }\n        if (Rmask == 0x0000FF00 &&\n            Gmask == 0x00FF0000 &&\n            Bmask == 0xFF000000 &&\n            Amask == 0x00000000) {\n            return SDL_PIXELFORMAT_BGRX8888;\n        }\n        if (Rmask == 0x00FF0000 &&\n            Gmask == 0x0000FF00 &&\n            Bmask == 0x000000FF &&\n            Amask == 0xFF000000) {\n            return SDL_PIXELFORMAT_ARGB8888;\n        }\n        if (Rmask == 0xFF000000 &&\n            Gmask == 0x00FF0000 &&\n            Bmask == 0x0000FF00 &&\n            Amask == 0x000000FF) {\n            return SDL_PIXELFORMAT_RGBA8888;\n        }\n        if (Rmask == 0x000000FF &&\n            Gmask == 0x0000FF00 &&\n            Bmask == 0x00FF0000 &&\n            Amask == 0xFF000000) {\n            return SDL_PIXELFORMAT_ABGR8888;\n        }\n        if (Rmask == 0x0000FF00 &&\n            Gmask == 0x00FF0000 &&\n            Bmask == 0xFF000000 &&\n            Amask == 0x000000FF) {\n            return SDL_PIXELFORMAT_BGRA8888;\n        }\n        if (Rmask == 0x3FF00000 &&\n            Gmask == 0x000FFC00 &&\n            Bmask == 0x000003FF &&\n            Amask == 0xC0000000) {\n            return SDL_PIXELFORMAT_ARGB2101010;\n        }\n    }\n    return SDL_PIXELFORMAT_UNKNOWN;\n}\n\nstatic SDL_PixelFormat *formats;\n\nSDL_PixelFormat *\nSDL_AllocFormat(Uint32 pixel_format)\n{\n    SDL_PixelFormat *format;\n\n    /* Look it up in our list of previously allocated formats */\n    for (format = formats; format; format = format->next) {\n        if (pixel_format == format->format) {\n            ++format->refcount;\n            return format;\n        }\n    }\n\n    /* Allocate an empty pixel format structure, and initialize it */\n    format = SDL_malloc(sizeof(*format));\n    if (format == NULL) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n    if (SDL_InitFormat(format, pixel_format) < 0) {\n        SDL_free(format);\n        SDL_InvalidParamError(\"format\");\n        return NULL;\n    }\n\n    if (!SDL_ISPIXELFORMAT_INDEXED(pixel_format)) {\n        /* Cache the RGB formats */\n        format->next = formats;\n        formats = format;\n    }\n    return format;\n}\n\nint\nSDL_InitFormat(SDL_PixelFormat * format, Uint32 pixel_format)\n{\n    int bpp;\n    Uint32 Rmask, Gmask, Bmask, Amask;\n    Uint32 mask;\n\n    if (!SDL_PixelFormatEnumToMasks(pixel_format, &bpp,\n                                    &Rmask, &Gmask, &Bmask, &Amask)) {\n        return -1;\n    }\n\n    /* Set up the format */\n    SDL_zerop(format);\n    format->format = pixel_format;\n    format->BitsPerPixel = bpp;\n    format->BytesPerPixel = (bpp + 7) / 8;\n\n    format->Rmask = Rmask;\n    format->Rshift = 0;\n    format->Rloss = 8;\n    if (Rmask) {\n        for (mask = Rmask; !(mask & 0x01); mask >>= 1)\n            ++format->Rshift;\n        for (; (mask & 0x01); mask >>= 1)\n            --format->Rloss;\n    }\n\n    format->Gmask = Gmask;\n    format->Gshift = 0;\n    format->Gloss = 8;\n    if (Gmask) {\n        for (mask = Gmask; !(mask & 0x01); mask >>= 1)\n            ++format->Gshift;\n        for (; (mask & 0x01); mask >>= 1)\n            --format->Gloss;\n    }\n\n    format->Bmask = Bmask;\n    format->Bshift = 0;\n    format->Bloss = 8;\n    if (Bmask) {\n        for (mask = Bmask; !(mask & 0x01); mask >>= 1)\n            ++format->Bshift;\n        for (; (mask & 0x01); mask >>= 1)\n            --format->Bloss;\n    }\n\n    format->Amask = Amask;\n    format->Ashift = 0;\n    format->Aloss = 8;\n    if (Amask) {\n        for (mask = Amask; !(mask & 0x01); mask >>= 1)\n            ++format->Ashift;\n        for (; (mask & 0x01); mask >>= 1)\n            --format->Aloss;\n    }\n\n    format->palette = NULL;\n    format->refcount = 1;\n    format->next = NULL;\n\n    return 0;\n}\n\nvoid\nSDL_FreeFormat(SDL_PixelFormat *format)\n{\n    SDL_PixelFormat *prev;\n\n    if (!format) {\n        SDL_InvalidParamError(\"format\");\n        return;\n    }\n    if (--format->refcount > 0) {\n        return;\n    }\n\n    /* Remove this format from our list */\n    if (format == formats) {\n        formats = format->next;\n    } else if (formats) {\n        for (prev = formats; prev->next; prev = prev->next) {\n            if (prev->next == format) {\n                prev->next = format->next;\n                break;\n            }\n        }\n    }\n\n    if (format->palette) {\n        SDL_FreePalette(format->palette);\n    }\n    SDL_free(format);\n}\n\nSDL_Palette *\nSDL_AllocPalette(int ncolors)\n{\n    SDL_Palette *palette;\n\n    /* Input validation */\n    if (ncolors < 1) {\n      SDL_InvalidParamError(\"ncolors\");\n      return NULL;\n    }\n\n    palette = (SDL_Palette *) SDL_malloc(sizeof(*palette));\n    if (!palette) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n    palette->colors =\n        (SDL_Color *) SDL_malloc(ncolors * sizeof(*palette->colors));\n    if (!palette->colors) {\n        SDL_free(palette);\n        return NULL;\n    }\n    palette->ncolors = ncolors;\n    palette->version = 1;\n    palette->refcount = 1;\n\n    SDL_memset(palette->colors, 0xFF, ncolors * sizeof(*palette->colors));\n\n    return palette;\n}\n\nint\nSDL_SetPixelFormatPalette(SDL_PixelFormat * format, SDL_Palette *palette)\n{\n    if (!format) {\n        return SDL_SetError(\"SDL_SetPixelFormatPalette() passed NULL format\");\n    }\n\n    if (palette && palette->ncolors != (1 << format->BitsPerPixel)) {\n        return SDL_SetError(\"SDL_SetPixelFormatPalette() passed a palette that doesn't match the format\");\n    }\n\n    if (format->palette == palette) {\n        return 0;\n    }\n\n    if (format->palette) {\n        SDL_FreePalette(format->palette);\n    }\n\n    format->palette = palette;\n\n    if (format->palette) {\n        ++format->palette->refcount;\n    }\n\n    return 0;\n}\n\nint\nSDL_SetPaletteColors(SDL_Palette * palette, const SDL_Color * colors,\n                     int firstcolor, int ncolors)\n{\n    int status = 0;\n\n    /* Verify the parameters */\n    if (!palette) {\n        return -1;\n    }\n    if (ncolors > (palette->ncolors - firstcolor)) {\n        ncolors = (palette->ncolors - firstcolor);\n        status = -1;\n    }\n\n    if (colors != (palette->colors + firstcolor)) {\n        SDL_memcpy(palette->colors + firstcolor, colors,\n                   ncolors * sizeof(*colors));\n    }\n    ++palette->version;\n    if (!palette->version) {\n        palette->version = 1;\n    }\n\n    return status;\n}\n\nvoid\nSDL_FreePalette(SDL_Palette * palette)\n{\n    if (!palette) {\n        SDL_InvalidParamError(\"palette\");\n        return;\n    }\n    if (--palette->refcount > 0) {\n        return;\n    }\n    SDL_free(palette->colors);\n    SDL_free(palette);\n}\n\n/*\n * Calculate an 8-bit (3 red, 3 green, 2 blue) dithered palette of colors\n */\nvoid\nSDL_DitherColors(SDL_Color * colors, int bpp)\n{\n    int i;\n    if (bpp != 8)\n        return;                 /* only 8bpp supported right now */\n\n    for (i = 0; i < 256; i++) {\n        int r, g, b;\n        /* map each bit field to the full [0, 255] interval,\n           so 0 is mapped to (0, 0, 0) and 255 to (255, 255, 255) */\n        r = i & 0xe0;\n        r |= r >> 3 | r >> 6;\n        colors[i].r = r;\n        g = (i << 3) & 0xe0;\n        g |= g >> 3 | g >> 6;\n        colors[i].g = g;\n        b = i & 0x3;\n        b |= b << 2;\n        b |= b << 4;\n        colors[i].b = b;\n        colors[i].a = SDL_ALPHA_OPAQUE;\n    }\n}\n\n/*\n * Calculate the pad-aligned scanline width of a surface\n */\nint\nSDL_CalculatePitch(SDL_Surface * surface)\n{\n    int pitch;\n\n    /* Surface should be 4-byte aligned for speed */\n    pitch = surface->w * surface->format->BytesPerPixel;\n    switch (surface->format->BitsPerPixel) {\n    case 1:\n        pitch = (pitch + 7) / 8;\n        break;\n    case 4:\n        pitch = (pitch + 1) / 2;\n        break;\n    default:\n        break;\n    }\n    pitch = (pitch + 3) & ~3;   /* 4-byte aligning */\n    return (pitch);\n}\n\n/*\n * Match an RGB value to a particular palette index\n */\nUint8\nSDL_FindColor(SDL_Palette * pal, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n    /* Do colorspace distance matching */\n    unsigned int smallest;\n    unsigned int distance;\n    int rd, gd, bd, ad;\n    int i;\n    Uint8 pixel = 0;\n\n    smallest = ~0;\n    for (i = 0; i < pal->ncolors; ++i) {\n        rd = pal->colors[i].r - r;\n        gd = pal->colors[i].g - g;\n        bd = pal->colors[i].b - b;\n        ad = pal->colors[i].a - a;\n        distance = (rd * rd) + (gd * gd) + (bd * bd) + (ad * ad);\n        if (distance < smallest) {\n            pixel = i;\n            if (distance == 0) {        /* Perfect match! */\n                break;\n            }\n            smallest = distance;\n        }\n    }\n    return (pixel);\n}\n\n/* Find the opaque pixel value corresponding to an RGB triple */\nUint32\nSDL_MapRGB(const SDL_PixelFormat * format, Uint8 r, Uint8 g, Uint8 b)\n{\n    if (format->palette == NULL) {\n        return (r >> format->Rloss) << format->Rshift\n            | (g >> format->Gloss) << format->Gshift\n            | (b >> format->Bloss) << format->Bshift | format->Amask;\n    } else {\n        return SDL_FindColor(format->palette, r, g, b, SDL_ALPHA_OPAQUE);\n    }\n}\n\n/* Find the pixel value corresponding to an RGBA quadruple */\nUint32\nSDL_MapRGBA(const SDL_PixelFormat * format, Uint8 r, Uint8 g, Uint8 b,\n            Uint8 a)\n{\n    if (format->palette == NULL) {\n        return (r >> format->Rloss) << format->Rshift\n            | (g >> format->Gloss) << format->Gshift\n            | (b >> format->Bloss) << format->Bshift\n            | ((a >> format->Aloss) << format->Ashift & format->Amask);\n    } else {\n        return SDL_FindColor(format->palette, r, g, b, a);\n    }\n}\n\nvoid\nSDL_GetRGB(Uint32 pixel, const SDL_PixelFormat * format, Uint8 * r, Uint8 * g,\n           Uint8 * b)\n{\n    if (format->palette == NULL) {\n        unsigned v;\n        v = (pixel & format->Rmask) >> format->Rshift;\n        *r = SDL_expand_byte[format->Rloss][v];\n        v = (pixel & format->Gmask) >> format->Gshift;\n        *g = SDL_expand_byte[format->Gloss][v];\n        v = (pixel & format->Bmask) >> format->Bshift;\n        *b = SDL_expand_byte[format->Bloss][v];\n    } else {\n        if (pixel < (unsigned)format->palette->ncolors) {\n            *r = format->palette->colors[pixel].r;\n            *g = format->palette->colors[pixel].g;\n            *b = format->palette->colors[pixel].b;\n        } else {\n            *r = *g = *b = 0;\n        }\n    }\n}\n\nvoid\nSDL_GetRGBA(Uint32 pixel, const SDL_PixelFormat * format,\n            Uint8 * r, Uint8 * g, Uint8 * b, Uint8 * a)\n{\n    if (format->palette == NULL) {\n        unsigned v;\n        v = (pixel & format->Rmask) >> format->Rshift;\n        *r = SDL_expand_byte[format->Rloss][v];\n        v = (pixel & format->Gmask) >> format->Gshift;\n        *g = SDL_expand_byte[format->Gloss][v];\n        v = (pixel & format->Bmask) >> format->Bshift;\n        *b = SDL_expand_byte[format->Bloss][v];\n        v = (pixel & format->Amask) >> format->Ashift;\n        *a = SDL_expand_byte[format->Aloss][v];\n    } else {\n        if (pixel < (unsigned)format->palette->ncolors) {\n            *r = format->palette->colors[pixel].r;\n            *g = format->palette->colors[pixel].g;\n            *b = format->palette->colors[pixel].b;\n            *a = format->palette->colors[pixel].a;\n        } else {\n            *r = *g = *b = *a = 0;\n        }\n    }\n}\n\n/* Map from Palette to Palette */\nstatic Uint8 *\nMap1to1(SDL_Palette * src, SDL_Palette * dst, int *identical)\n{\n    Uint8 *map;\n    int i;\n\n    if (identical) {\n        if (src->ncolors <= dst->ncolors) {\n            /* If an identical palette, no need to map */\n            if (src == dst\n                ||\n                (SDL_memcmp\n                 (src->colors, dst->colors,\n                  src->ncolors * sizeof(SDL_Color)) == 0)) {\n                *identical = 1;\n                return (NULL);\n            }\n        }\n        *identical = 0;\n    }\n    map = (Uint8 *) SDL_malloc(src->ncolors);\n    if (map == NULL) {\n        SDL_OutOfMemory();\n        return (NULL);\n    }\n    for (i = 0; i < src->ncolors; ++i) {\n        map[i] = SDL_FindColor(dst,\n                               src->colors[i].r, src->colors[i].g,\n                               src->colors[i].b, src->colors[i].a);\n    }\n    return (map);\n}\n\n/* Map from Palette to BitField */\nstatic Uint8 *\nMap1toN(SDL_PixelFormat * src, Uint8 Rmod, Uint8 Gmod, Uint8 Bmod, Uint8 Amod,\n        SDL_PixelFormat * dst)\n{\n    Uint8 *map;\n    int i;\n    int bpp;\n    SDL_Palette *pal = src->palette;\n\n    bpp = ((dst->BytesPerPixel == 3) ? 4 : dst->BytesPerPixel);\n    map = (Uint8 *) SDL_malloc(pal->ncolors * bpp);\n    if (map == NULL) {\n        SDL_OutOfMemory();\n        return (NULL);\n    }\n\n    /* We memory copy to the pixel map so the endianness is preserved */\n    for (i = 0; i < pal->ncolors; ++i) {\n        Uint8 R = (Uint8) ((pal->colors[i].r * Rmod) / 255);\n        Uint8 G = (Uint8) ((pal->colors[i].g * Gmod) / 255);\n        Uint8 B = (Uint8) ((pal->colors[i].b * Bmod) / 255);\n        Uint8 A = (Uint8) ((pal->colors[i].a * Amod) / 255);\n        ASSEMBLE_RGBA(&map[i * bpp], dst->BytesPerPixel, dst, R, G, B, A);\n    }\n    return (map);\n}\n\n/* Map from BitField to Dithered-Palette to Palette */\nstatic Uint8 *\nMapNto1(SDL_PixelFormat * src, SDL_PixelFormat * dst, int *identical)\n{\n    /* Generate a 256 color dither palette */\n    SDL_Palette dithered;\n    SDL_Color colors[256];\n    SDL_Palette *pal = dst->palette;\n\n    dithered.ncolors = 256;\n    SDL_DitherColors(colors, 8);\n    dithered.colors = colors;\n    return (Map1to1(&dithered, pal, identical));\n}\n\nSDL_BlitMap *\nSDL_AllocBlitMap(void)\n{\n    SDL_BlitMap *map;\n\n    /* Allocate the empty map */\n    map = (SDL_BlitMap *) SDL_calloc(1, sizeof(*map));\n    if (map == NULL) {\n        SDL_OutOfMemory();\n        return (NULL);\n    }\n    map->info.r = 0xFF;\n    map->info.g = 0xFF;\n    map->info.b = 0xFF;\n    map->info.a = 0xFF;\n\n    /* It's ready to go */\n    return (map);\n}\n\nvoid\nSDL_InvalidateMap(SDL_BlitMap * map)\n{\n    if (!map) {\n        return;\n    }\n    if (map->dst) {\n        /* Release our reference to the surface - see the note below */\n        if (--map->dst->refcount <= 0) {\n            SDL_FreeSurface(map->dst);\n        }\n    }\n    map->dst = NULL;\n    map->src_palette_version = 0;\n    map->dst_palette_version = 0;\n    SDL_free(map->info.table);\n    map->info.table = NULL;\n}\n\nint\nSDL_MapSurface(SDL_Surface * src, SDL_Surface * dst)\n{\n    SDL_PixelFormat *srcfmt;\n    SDL_PixelFormat *dstfmt;\n    SDL_BlitMap *map;\n\n    /* Clear out any previous mapping */\n    map = src->map;\n    if ((src->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {\n        SDL_UnRLESurface(src, 1);\n    }\n    SDL_InvalidateMap(map);\n\n    /* Figure out what kind of mapping we're doing */\n    map->identity = 0;\n    srcfmt = src->format;\n    dstfmt = dst->format;\n    if (SDL_ISPIXELFORMAT_INDEXED(srcfmt->format)) {\n        if (SDL_ISPIXELFORMAT_INDEXED(dstfmt->format)) {\n            /* Palette --> Palette */\n            map->info.table =\n                Map1to1(srcfmt->palette, dstfmt->palette, &map->identity);\n            if (!map->identity) {\n                if (map->info.table == NULL) {\n                    return (-1);\n                }\n            }\n            if (srcfmt->BitsPerPixel != dstfmt->BitsPerPixel)\n                map->identity = 0;\n        } else {\n            /* Palette --> BitField */\n            map->info.table =\n                Map1toN(srcfmt, src->map->info.r, src->map->info.g,\n                        src->map->info.b, src->map->info.a, dstfmt);\n            if (map->info.table == NULL) {\n                return (-1);\n            }\n        }\n    } else {\n        if (SDL_ISPIXELFORMAT_INDEXED(dstfmt->format)) {\n            /* BitField --> Palette */\n            map->info.table = MapNto1(srcfmt, dstfmt, &map->identity);\n            if (!map->identity) {\n                if (map->info.table == NULL) {\n                    return (-1);\n                }\n            }\n            map->identity = 0;  /* Don't optimize to copy */\n        } else {\n            /* BitField --> BitField */\n            if (srcfmt == dstfmt) {\n                map->identity = 1;\n            }\n        }\n    }\n\n    map->dst = dst;\n\n    if (map->dst) {\n        /* Keep a reference to this surface so it doesn't get deleted\n           while we're still pointing at it.\n\n           A better method would be for the destination surface to keep\n           track of surfaces that are mapped to it and automatically\n           invalidate them when it is freed, but this will do for now.\n        */\n        ++map->dst->refcount;\n    }\n\n    if (dstfmt->palette) {\n        map->dst_palette_version = dstfmt->palette->version;\n    } else {\n        map->dst_palette_version = 0;\n    }\n\n    if (srcfmt->palette) {\n        map->src_palette_version = srcfmt->palette->version;\n    } else {\n        map->src_palette_version = 0;\n    }\n\n    /* Choose your blitters wisely */\n    return (SDL_CalculateBlit(src));\n}\n\nvoid\nSDL_FreeBlitMap(SDL_BlitMap * map)\n{\n    if (map) {\n        SDL_InvalidateMap(map);\n        SDL_free(map);\n    }\n}\n\nvoid\nSDL_CalculateGammaRamp(float gamma, Uint16 * ramp)\n{\n    int i;\n\n    /* Input validation */\n    if (gamma < 0.0f ) {\n      SDL_InvalidParamError(\"gamma\");\n      return;\n    }\n    if (ramp == NULL) {\n      SDL_InvalidParamError(\"ramp\");\n      return;\n    }\n\n    /* 0.0 gamma is all black */\n    if (gamma == 0.0f) {\n        SDL_memset(ramp, 0, 256 * sizeof(Uint16));\n        return;\n    } else if (gamma == 1.0f) {\n        /* 1.0 gamma is identity */\n        for (i = 0; i < 256; ++i) {\n            ramp[i] = (i << 8) | i;\n        }\n        return;\n    } else {\n        /* Calculate a real gamma ramp */\n        int value;\n        gamma = 1.0f / gamma;\n        for (i = 0; i < 256; ++i) {\n            value =\n                (int) (SDL_pow((double) i / 256.0, gamma) * 65535.0 + 0.5);\n            if (value > 65535) {\n                value = 65535;\n            }\n            ramp[i] = (Uint16) value;\n        }\n    }\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_pixels_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* Useful functions and variables from SDL_pixel.c */\n\n#include \"SDL_blit.h\"\n\n/* Pixel format functions */\nextern int SDL_InitFormat(SDL_PixelFormat * format, Uint32 pixel_format);\n\n/* Blit mapping functions */\nextern SDL_BlitMap *SDL_AllocBlitMap(void);\nextern void SDL_InvalidateMap(SDL_BlitMap * map);\nextern int SDL_MapSurface(SDL_Surface * src, SDL_Surface * dst);\nextern void SDL_FreeBlitMap(SDL_BlitMap * map);\n\n/* Miscellaneous functions */\nextern int SDL_CalculatePitch(SDL_Surface * surface);\nextern void SDL_DitherColors(SDL_Color * colors, int bpp);\nextern Uint8 SDL_FindColor(SDL_Palette * pal, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_rect.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_rect.h\"\n#include \"SDL_rect_c.h\"\n\n\nSDL_bool\nSDL_HasIntersection(const SDL_Rect * A, const SDL_Rect * B)\n{\n    int Amin, Amax, Bmin, Bmax;\n\n    if (!A) {\n        SDL_InvalidParamError(\"A\");\n        return SDL_FALSE;\n    }\n\n    if (!B) {\n        SDL_InvalidParamError(\"B\");\n        return SDL_FALSE;\n    }\n\n    /* Special cases for empty rects */\n    if (SDL_RectEmpty(A) || SDL_RectEmpty(B)) {\n        return SDL_FALSE;\n    }\n\n    /* Horizontal intersection */\n    Amin = A->x;\n    Amax = Amin + A->w;\n    Bmin = B->x;\n    Bmax = Bmin + B->w;\n    if (Bmin > Amin)\n        Amin = Bmin;\n    if (Bmax < Amax)\n        Amax = Bmax;\n    if (Amax <= Amin)\n        return SDL_FALSE;\n\n    /* Vertical intersection */\n    Amin = A->y;\n    Amax = Amin + A->h;\n    Bmin = B->y;\n    Bmax = Bmin + B->h;\n    if (Bmin > Amin)\n        Amin = Bmin;\n    if (Bmax < Amax)\n        Amax = Bmax;\n    if (Amax <= Amin)\n        return SDL_FALSE;\n\n    return SDL_TRUE;\n}\n\nSDL_bool\nSDL_IntersectRect(const SDL_Rect * A, const SDL_Rect * B, SDL_Rect * result)\n{\n    int Amin, Amax, Bmin, Bmax;\n\n    if (!A) {\n        SDL_InvalidParamError(\"A\");\n        return SDL_FALSE;\n    }\n\n    if (!B) {\n        SDL_InvalidParamError(\"B\");\n        return SDL_FALSE;\n    }\n\n    if (!result) {\n        SDL_InvalidParamError(\"result\");\n        return SDL_FALSE;\n    }\n\n    /* Special cases for empty rects */\n    if (SDL_RectEmpty(A) || SDL_RectEmpty(B)) {\n        result->w = 0;\n        result->h = 0;\n        return SDL_FALSE;\n    }\n\n    /* Horizontal intersection */\n    Amin = A->x;\n    Amax = Amin + A->w;\n    Bmin = B->x;\n    Bmax = Bmin + B->w;\n    if (Bmin > Amin)\n        Amin = Bmin;\n    result->x = Amin;\n    if (Bmax < Amax)\n        Amax = Bmax;\n    result->w = Amax - Amin;\n\n    /* Vertical intersection */\n    Amin = A->y;\n    Amax = Amin + A->h;\n    Bmin = B->y;\n    Bmax = Bmin + B->h;\n    if (Bmin > Amin)\n        Amin = Bmin;\n    result->y = Amin;\n    if (Bmax < Amax)\n        Amax = Bmax;\n    result->h = Amax - Amin;\n\n    return !SDL_RectEmpty(result);\n}\n\nvoid\nSDL_UnionRect(const SDL_Rect * A, const SDL_Rect * B, SDL_Rect * result)\n{\n    int Amin, Amax, Bmin, Bmax;\n\n    if (!A) {\n        SDL_InvalidParamError(\"A\");\n        return;\n    }\n\n    if (!B) {\n        SDL_InvalidParamError(\"B\");\n        return;\n    }\n\n    if (!result) {\n        SDL_InvalidParamError(\"result\");\n        return;\n    }\n\n    /* Special cases for empty Rects */\n    if (SDL_RectEmpty(A)) {\n      if (SDL_RectEmpty(B)) {\n       /* A and B empty */\n       return;\n      } else {\n       /* A empty, B not empty */\n       *result = *B;\n       return;\n      }\n    } else {\n      if (SDL_RectEmpty(B)) {\n       /* A not empty, B empty */\n       *result = *A;\n       return;\n      }\n    }\n\n    /* Horizontal union */\n    Amin = A->x;\n    Amax = Amin + A->w;\n    Bmin = B->x;\n    Bmax = Bmin + B->w;\n    if (Bmin < Amin)\n        Amin = Bmin;\n    result->x = Amin;\n    if (Bmax > Amax)\n        Amax = Bmax;\n    result->w = Amax - Amin;\n\n    /* Vertical union */\n    Amin = A->y;\n    Amax = Amin + A->h;\n    Bmin = B->y;\n    Bmax = Bmin + B->h;\n    if (Bmin < Amin)\n        Amin = Bmin;\n    result->y = Amin;\n    if (Bmax > Amax)\n        Amax = Bmax;\n    result->h = Amax - Amin;\n}\n\nSDL_bool\nSDL_EnclosePoints(const SDL_Point * points, int count, const SDL_Rect * clip,\n                  SDL_Rect * result)\n{\n    int minx = 0;\n    int miny = 0;\n    int maxx = 0;\n    int maxy = 0;\n    int x, y, i;\n\n    if (!points) {\n        SDL_InvalidParamError(\"points\");\n        return SDL_FALSE;\n    }\n\n    if (count < 1) {\n        SDL_InvalidParamError(\"count\");\n        return SDL_FALSE;\n    }\n\n    if (clip) {\n        SDL_bool added = SDL_FALSE;\n        const int clip_minx = clip->x;\n        const int clip_miny = clip->y;\n        const int clip_maxx = clip->x+clip->w-1;\n        const int clip_maxy = clip->y+clip->h-1;\n\n        /* Special case for empty rectangle */\n        if (SDL_RectEmpty(clip)) {\n            return SDL_FALSE;\n        }\n\n        for (i = 0; i < count; ++i) {\n            x = points[i].x;\n            y = points[i].y;\n\n            if (x < clip_minx || x > clip_maxx ||\n                y < clip_miny || y > clip_maxy) {\n                continue;\n            }\n            if (!added) {\n                /* Special case: if no result was requested, we are done */\n                if (result == NULL) {\n                    return SDL_TRUE;\n                }\n\n                /* First point added */\n                minx = maxx = x;\n                miny = maxy = y;\n                added = SDL_TRUE;\n                continue;\n            }\n            if (x < minx) {\n                minx = x;\n            } else if (x > maxx) {\n                maxx = x;\n            }\n            if (y < miny) {\n                miny = y;\n            } else if (y > maxy) {\n                maxy = y;\n            }\n        }\n        if (!added) {\n            return SDL_FALSE;\n        }\n    } else {\n        /* Special case: if no result was requested, we are done */\n        if (result == NULL) {\n            return SDL_TRUE;\n        }\n\n        /* No clipping, always add the first point */\n        minx = maxx = points[0].x;\n        miny = maxy = points[0].y;\n\n        for (i = 1; i < count; ++i) {\n            x = points[i].x;\n            y = points[i].y;\n\n            if (x < minx) {\n                minx = x;\n            } else if (x > maxx) {\n                maxx = x;\n            }\n            if (y < miny) {\n                miny = y;\n            } else if (y > maxy) {\n                maxy = y;\n            }\n        }\n    }\n\n    if (result) {\n        result->x = minx;\n        result->y = miny;\n        result->w = (maxx-minx)+1;\n        result->h = (maxy-miny)+1;\n    }\n    return SDL_TRUE;\n}\n\n/* Use the Cohen-Sutherland algorithm for line clipping */\n#define CODE_BOTTOM 1\n#define CODE_TOP    2\n#define CODE_LEFT   4\n#define CODE_RIGHT  8\n\nstatic int\nComputeOutCode(const SDL_Rect * rect, int x, int y)\n{\n    int code = 0;\n    if (y < rect->y) {\n        code |= CODE_TOP;\n    } else if (y >= rect->y + rect->h) {\n        code |= CODE_BOTTOM;\n    }\n    if (x < rect->x) {\n        code |= CODE_LEFT;\n    } else if (x >= rect->x + rect->w) {\n        code |= CODE_RIGHT;\n    }\n    return code;\n}\n\nSDL_bool\nSDL_IntersectRectAndLine(const SDL_Rect * rect, int *X1, int *Y1, int *X2,\n                         int *Y2)\n{\n    int x = 0;\n    int y = 0;\n    int x1, y1;\n    int x2, y2;\n    int rectx1;\n    int recty1;\n    int rectx2;\n    int recty2;\n    int outcode1, outcode2;\n\n    if (!rect) {\n        SDL_InvalidParamError(\"rect\");\n        return SDL_FALSE;\n    }\n\n    if (!X1) {\n        SDL_InvalidParamError(\"X1\");\n        return SDL_FALSE;\n    }\n\n    if (!Y1) {\n        SDL_InvalidParamError(\"Y1\");\n        return SDL_FALSE;\n    }\n\n    if (!X2) {\n        SDL_InvalidParamError(\"X2\");\n        return SDL_FALSE;\n    }\n\n    if (!Y2) {\n        SDL_InvalidParamError(\"Y2\");\n        return SDL_FALSE;\n    }\n\n    /* Special case for empty rect */\n    if (SDL_RectEmpty(rect)) {\n        return SDL_FALSE;\n    }\n\n    x1 = *X1;\n    y1 = *Y1;\n    x2 = *X2;\n    y2 = *Y2;\n    rectx1 = rect->x;\n    recty1 = rect->y;\n    rectx2 = rect->x + rect->w - 1;\n    recty2 = rect->y + rect->h - 1;\n\n    /* Check to see if entire line is inside rect */\n    if (x1 >= rectx1 && x1 <= rectx2 && x2 >= rectx1 && x2 <= rectx2 &&\n        y1 >= recty1 && y1 <= recty2 && y2 >= recty1 && y2 <= recty2) {\n        return SDL_TRUE;\n    }\n\n    /* Check to see if entire line is to one side of rect */\n    if ((x1 < rectx1 && x2 < rectx1) || (x1 > rectx2 && x2 > rectx2) ||\n        (y1 < recty1 && y2 < recty1) || (y1 > recty2 && y2 > recty2)) {\n        return SDL_FALSE;\n    }\n\n    if (y1 == y2) {\n        /* Horizontal line, easy to clip */\n        if (x1 < rectx1) {\n            *X1 = rectx1;\n        } else if (x1 > rectx2) {\n            *X1 = rectx2;\n        }\n        if (x2 < rectx1) {\n            *X2 = rectx1;\n        } else if (x2 > rectx2) {\n            *X2 = rectx2;\n        }\n        return SDL_TRUE;\n    }\n\n    if (x1 == x2) {\n        /* Vertical line, easy to clip */\n        if (y1 < recty1) {\n            *Y1 = recty1;\n        } else if (y1 > recty2) {\n            *Y1 = recty2;\n        }\n        if (y2 < recty1) {\n            *Y2 = recty1;\n        } else if (y2 > recty2) {\n            *Y2 = recty2;\n        }\n        return SDL_TRUE;\n    }\n\n    /* More complicated Cohen-Sutherland algorithm */\n    outcode1 = ComputeOutCode(rect, x1, y1);\n    outcode2 = ComputeOutCode(rect, x2, y2);\n    while (outcode1 || outcode2) {\n        if (outcode1 & outcode2) {\n            return SDL_FALSE;\n        }\n\n        if (outcode1) {\n            if (outcode1 & CODE_TOP) {\n                y = recty1;\n                x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1);\n            } else if (outcode1 & CODE_BOTTOM) {\n                y = recty2;\n                x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1);\n            } else if (outcode1 & CODE_LEFT) {\n                x = rectx1;\n                y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);\n            } else if (outcode1 & CODE_RIGHT) {\n                x = rectx2;\n                y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);\n            }\n            x1 = x;\n            y1 = y;\n            outcode1 = ComputeOutCode(rect, x, y);\n        } else {\n            if (outcode2 & CODE_TOP) {\n                y = recty1;\n                x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1);\n            } else if (outcode2 & CODE_BOTTOM) {\n                y = recty2;\n                x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1);\n            } else if (outcode2 & CODE_LEFT) {\n                x = rectx1;\n                y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);\n            } else if (outcode2 & CODE_RIGHT) {\n                x = rectx2;\n                y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);\n            }\n            x2 = x;\n            y2 = y;\n            outcode2 = ComputeOutCode(rect, x, y);\n        }\n    }\n    *X1 = x1;\n    *Y1 = y1;\n    *X2 = x2;\n    *Y2 = y2;\n    return SDL_TRUE;\n}\n\nSDL_bool\nSDL_GetSpanEnclosingRect(int width, int height,\n                         int numrects, const SDL_Rect * rects, SDL_Rect *span)\n{\n    int i;\n    int span_y1, span_y2;\n    int rect_y1, rect_y2;\n\n    if (width < 1) {\n        SDL_InvalidParamError(\"width\");\n        return SDL_FALSE;\n    }\n\n    if (height < 1) {\n        SDL_InvalidParamError(\"height\");\n        return SDL_FALSE;\n    }\n\n    if (!rects) {\n        SDL_InvalidParamError(\"rects\");\n        return SDL_FALSE;\n    }\n\n    if (!span) {\n        SDL_InvalidParamError(\"span\");\n        return SDL_FALSE;\n    }\n\n    if (numrects < 1) {\n        SDL_InvalidParamError(\"numrects\");\n        return SDL_FALSE;\n    }\n\n    /* Initialize to empty rect */\n    span_y1 = height;\n    span_y2 = 0;\n\n    for (i = 0; i < numrects; ++i) {\n        rect_y1 = rects[i].y;\n        rect_y2 = rect_y1 + rects[i].h;\n\n        /* Clip out of bounds rectangles, and expand span rect */\n        if (rect_y1 < 0) {\n            span_y1 = 0;\n        } else if (rect_y1 < span_y1) {\n            span_y1 = rect_y1;\n        }\n        if (rect_y2 > height) {\n            span_y2 = height;\n        } else if (rect_y2 > span_y2) {\n            span_y2 = rect_y2;\n        }\n    }\n    if (span_y2 > span_y1) {\n        span->x = 0;\n        span->y = span_y1;\n        span->w = width;\n        span->h = (span_y2 - span_y1);\n        return SDL_TRUE;\n    }\n    return SDL_FALSE;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_rect_c.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\nextern SDL_bool SDL_GetSpanEnclosingRect(int width, int height, int numrects, const SDL_Rect * rects, SDL_Rect *span);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_shape.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_video.h\"\n#include \"SDL_sysvideo.h\"\n#include \"SDL_pixels.h\"\n#include \"SDL_surface.h\"\n#include \"SDL_shape.h\"\n#include \"SDL_shape_internals.h\"\n\nSDL_Window*\nSDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags)\n{\n    SDL_Window *result = NULL;\n    result = SDL_CreateWindow(title,-1000,-1000,w,h,(flags | SDL_WINDOW_BORDERLESS) & (~SDL_WINDOW_FULLSCREEN) & (~SDL_WINDOW_RESIZABLE) /* & (~SDL_WINDOW_SHOWN) */);\n    if(result != NULL) {\n        result->shaper = SDL_GetVideoDevice()->shape_driver.CreateShaper(result);\n        if(result->shaper != NULL) {\n            result->shaper->userx = x;\n            result->shaper->usery = y;\n            result->shaper->mode.mode = ShapeModeDefault;\n            result->shaper->mode.parameters.binarizationCutoff = 1;\n            result->shaper->hasshape = SDL_FALSE;\n            return result;\n        }\n        else {\n            SDL_DestroyWindow(result);\n            return NULL;\n        }\n    }\n    else\n        return NULL;\n}\n\nSDL_bool\nSDL_IsShapedWindow(const SDL_Window *window)\n{\n    if(window == NULL)\n        return SDL_FALSE;\n    else\n        return (SDL_bool)(window->shaper != NULL);\n}\n\n/* REQUIRES that bitmap point to a w-by-h bitmap with ppb pixels-per-byte. */\nvoid\nSDL_CalculateShapeBitmap(SDL_WindowShapeMode mode,SDL_Surface *shape,Uint8* bitmap,Uint8 ppb)\n{\n    int x = 0;\n    int y = 0;\n    Uint8 r = 0,g = 0,b = 0,alpha = 0;\n    Uint8* pixel = NULL;\n    Uint32 bitmap_pixel,pixel_value = 0,mask_value = 0;\n    SDL_Color key;\n    if(SDL_MUSTLOCK(shape))\n        SDL_LockSurface(shape);\n    for(y = 0;y<shape->h;y++) {\n        for(x=0;x<shape->w;x++) {\n            alpha = 0;\n            pixel_value = 0;\n            pixel = (Uint8 *)(shape->pixels) + (y*shape->pitch) + (x*shape->format->BytesPerPixel);\n            switch(shape->format->BytesPerPixel) {\n                case(1):\n                    pixel_value = *(Uint8*)pixel;\n                    break;\n                case(2):\n                    pixel_value = *(Uint16*)pixel;\n                    break;\n                case(3):\n                    pixel_value = *(Uint32*)pixel & (~shape->format->Amask);\n                    break;\n                case(4):\n                    pixel_value = *(Uint32*)pixel;\n                    break;\n            }\n            SDL_GetRGBA(pixel_value,shape->format,&r,&g,&b,&alpha);\n            bitmap_pixel = y*shape->w + x;\n            switch(mode.mode) {\n                case(ShapeModeDefault):\n                    mask_value = (alpha >= 1 ? 1 : 0);\n                    break;\n                case(ShapeModeBinarizeAlpha):\n                    mask_value = (alpha >= mode.parameters.binarizationCutoff ? 1 : 0);\n                    break;\n                case(ShapeModeReverseBinarizeAlpha):\n                    mask_value = (alpha <= mode.parameters.binarizationCutoff ? 1 : 0);\n                    break;\n                case(ShapeModeColorKey):\n                    key = mode.parameters.colorKey;\n                    mask_value = ((key.r != r || key.g != g || key.b != b) ? 1 : 0);\n                    break;\n            }\n            bitmap[bitmap_pixel / ppb] |= mask_value << (7 - ((ppb - 1) - (bitmap_pixel % ppb)));\n        }\n    }\n    if(SDL_MUSTLOCK(shape))\n        SDL_UnlockSurface(shape);\n}\n\nstatic SDL_ShapeTree*\nRecursivelyCalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* mask,SDL_Rect dimensions) {\n    int x = 0,y = 0;\n    Uint8* pixel = NULL;\n    Uint32 pixel_value = 0;\n    Uint8 r = 0,g = 0,b = 0,a = 0;\n    SDL_bool pixel_opaque = SDL_FALSE;\n    int last_opaque = -1;\n    SDL_Color key;\n    SDL_ShapeTree* result = (SDL_ShapeTree*)SDL_malloc(sizeof(SDL_ShapeTree));\n    SDL_Rect next = {0,0,0,0};\n\n    for(y=dimensions.y;y<dimensions.y + dimensions.h;y++) {\n        for(x=dimensions.x;x<dimensions.x + dimensions.w;x++) {\n            pixel_value = 0;\n            pixel = (Uint8 *)(mask->pixels) + (y*mask->pitch) + (x*mask->format->BytesPerPixel);\n            switch(mask->format->BytesPerPixel) {\n                case(1):\n                    pixel_value = *(Uint8*)pixel;\n                    break;\n                case(2):\n                    pixel_value = *(Uint16*)pixel;\n                    break;\n                case(3):\n                    pixel_value = *(Uint32*)pixel & (~mask->format->Amask);\n                    break;\n                case(4):\n                    pixel_value = *(Uint32*)pixel;\n                    break;\n            }\n            SDL_GetRGBA(pixel_value,mask->format,&r,&g,&b,&a);\n            switch(mode.mode) {\n                case(ShapeModeDefault):\n                    pixel_opaque = (a >= 1 ? SDL_TRUE : SDL_FALSE);\n                    break;\n                case(ShapeModeBinarizeAlpha):\n                    pixel_opaque = (a >= mode.parameters.binarizationCutoff ? SDL_TRUE : SDL_FALSE);\n                    break;\n                case(ShapeModeReverseBinarizeAlpha):\n                    pixel_opaque = (a <= mode.parameters.binarizationCutoff ? SDL_TRUE : SDL_FALSE);\n                    break;\n                case(ShapeModeColorKey):\n                    key = mode.parameters.colorKey;\n                    pixel_opaque = ((key.r != r || key.g != g || key.b != b) ? SDL_TRUE : SDL_FALSE);\n                    break;\n            }\n            if(last_opaque == -1)\n                last_opaque = pixel_opaque;\n            if(last_opaque != pixel_opaque) {\n                const int halfwidth = dimensions.w / 2;\n                const int halfheight = dimensions.h / 2;\n\n                result->kind = QuadShape;\n\n                next.x = dimensions.x;\n                next.y = dimensions.y;\n                next.w = halfwidth;\n                next.h = halfheight;\n                result->data.children.upleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);\n\n                next.x = dimensions.x + halfwidth;\n                next.w = dimensions.w - halfwidth;\n                result->data.children.upright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);\n\n                next.x = dimensions.x;\n                next.w = halfwidth;\n                next.y = dimensions.y + halfheight;\n                next.h = dimensions.h - halfheight;\n                result->data.children.downleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);\n\n                next.x = dimensions.x + halfwidth;\n                next.w = dimensions.w - halfwidth;\n                result->data.children.downright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);\n\n                return result;\n            }\n        }\n    }\n\n\n    /* If we never recursed, all the pixels in this quadrant have the same \"value\". */\n    result->kind = (last_opaque == SDL_TRUE ? OpaqueShape : TransparentShape);\n    result->data.shape = dimensions;\n    return result;\n}\n\nSDL_ShapeTree*\nSDL_CalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* shape)\n{\n    SDL_Rect dimensions = {0,0,shape->w,shape->h};\n    SDL_ShapeTree* result = NULL;\n    if(SDL_MUSTLOCK(shape))\n        SDL_LockSurface(shape);\n    result = RecursivelyCalculateShapeTree(mode,shape,dimensions);\n    if(SDL_MUSTLOCK(shape))\n        SDL_UnlockSurface(shape);\n    return result;\n}\n\nvoid\nSDL_TraverseShapeTree(SDL_ShapeTree *tree,SDL_TraversalFunction function,void* closure)\n{\n    SDL_assert(tree != NULL);\n    if(tree->kind == QuadShape) {\n        SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.upleft,function,closure);\n        SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.upright,function,closure);\n        SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.downleft,function,closure);\n        SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.downright,function,closure);\n    }\n    else\n        function(tree,closure);\n}\n\nvoid\nSDL_FreeShapeTree(SDL_ShapeTree** shape_tree)\n{\n    if((*shape_tree)->kind == QuadShape) {\n        SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upleft);\n        SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upright);\n        SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downleft);\n        SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downright);\n    }\n    SDL_free(*shape_tree);\n    *shape_tree = NULL;\n}\n\nint\nSDL_SetWindowShape(SDL_Window *window,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode)\n{\n    int result;\n    if(window == NULL || !SDL_IsShapedWindow(window))\n        /* The window given was not a shapeable window. */\n        return SDL_NONSHAPEABLE_WINDOW;\n    if(shape == NULL)\n        /* Invalid shape argument. */\n        return SDL_INVALID_SHAPE_ARGUMENT;\n\n    if(shape_mode != NULL)\n        window->shaper->mode = *shape_mode;\n    result = SDL_GetVideoDevice()->shape_driver.SetWindowShape(window->shaper,shape,shape_mode);\n    window->shaper->hasshape = SDL_TRUE;\n    if(window->shaper->userx != 0 && window->shaper->usery != 0) {\n        SDL_SetWindowPosition(window,window->shaper->userx,window->shaper->usery);\n        window->shaper->userx = 0;\n        window->shaper->usery = 0;\n    }\n    return result;\n}\n\nstatic SDL_bool\nSDL_WindowHasAShape(SDL_Window *window)\n{\n    if (window == NULL || !SDL_IsShapedWindow(window))\n        return SDL_FALSE;\n    return window->shaper->hasshape;\n}\n\nint\nSDL_GetShapedWindowMode(SDL_Window *window,SDL_WindowShapeMode *shape_mode)\n{\n    if(window != NULL && SDL_IsShapedWindow(window)) {\n        if(shape_mode == NULL) {\n            if(SDL_WindowHasAShape(window))\n                /* The window given has a shape. */\n                return 0;\n            else\n                /* The window given is shapeable but lacks a shape. */\n                return SDL_WINDOW_LACKS_SHAPE;\n        }\n        else {\n            *shape_mode = window->shaper->mode;\n            return 0;\n        }\n    }\n    else\n        /* The window given is not a valid shapeable window. */\n        return SDL_NONSHAPEABLE_WINDOW;\n}\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_shape_internals.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_shape_internals_h\n#define _SDL_shape_internals_h\n\n#include \"SDL_rect.h\"\n#include \"SDL_shape.h\"\n#include \"SDL_surface.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\n/* *INDENT-OFF* */\nextern \"C\" {\n/* *INDENT-ON* */\n#endif\n\ntypedef struct {\n\tstruct SDL_ShapeTree *upleft,*upright,*downleft,*downright;\n} SDL_QuadTreeChildren;\n\ntypedef union {\n\tSDL_QuadTreeChildren children;\n\tSDL_Rect shape;\n} SDL_ShapeUnion;\n\ntypedef enum { QuadShape,TransparentShape,OpaqueShape } SDL_ShapeKind;\n\ntypedef struct {\n\tSDL_ShapeKind kind;\n\tSDL_ShapeUnion data;\n} SDL_ShapeTree;\n\t\ntypedef void(*SDL_TraversalFunction)(SDL_ShapeTree*,void*);\n\nextern void SDL_CalculateShapeBitmap(SDL_WindowShapeMode mode,SDL_Surface *shape,Uint8* bitmap,Uint8 ppb);\nextern SDL_ShapeTree* SDL_CalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* shape);\nextern void SDL_TraverseShapeTree(SDL_ShapeTree *tree,SDL_TraversalFunction function,void* closure);\nextern void SDL_FreeShapeTree(SDL_ShapeTree** shape_tree);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n/* *INDENT-OFF* */\n}\n/* *INDENT-ON* */\n#endif\n#include \"close_code.h\"\n\n#endif\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_stretch.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* This a stretch blit implementation based on ideas given to me by\n   Tomasz Cejner - thanks! :)\n\n   April 27, 2000 - Sam Lantinga\n*/\n\n#include \"SDL_video.h\"\n#include \"SDL_blit.h\"\n\n/* This isn't ready for general consumption yet - it should be folded\n   into the general blitting mechanism.\n*/\n\n#if ((defined(_MFC_VER) && defined(_M_IX86)) || \\\n     defined(__WATCOMC__) || \\\n     (defined(__GNUC__) && defined(__i386__))) && SDL_ASSEMBLY_ROUTINES\n/* There's a bug with gcc 4.4.1 and -O2 where srcp doesn't get the correct\n * value after the first scanline.  FIXME? */\n/* #define USE_ASM_STRETCH */\n#endif\n\n#ifdef USE_ASM_STRETCH\n\n#ifdef HAVE_MPROTECT\n#include <sys/types.h>\n#include <sys/mman.h>\n#endif\n#ifdef __GNUC__\n#define PAGE_ALIGNED __attribute__((__aligned__(4096)))\n#else\n#define PAGE_ALIGNED\n#endif\n\n#if defined(_M_IX86) || defined(i386)\n#define PREFIX16    0x66\n#define STORE_BYTE  0xAA\n#define STORE_WORD  0xAB\n#define LOAD_BYTE   0xAC\n#define LOAD_WORD   0xAD\n#define RETURN      0xC3\n#else\n#error Need assembly opcodes for this architecture\n#endif\n\nstatic unsigned char copy_row[4096] PAGE_ALIGNED;\n\nstatic int\ngenerate_rowbytes(int src_w, int dst_w, int bpp)\n{\n    static struct\n    {\n        int bpp;\n        int src_w;\n        int dst_w;\n        int status;\n    } last;\n\n    int i;\n    int pos, inc;\n    unsigned char *eip, *fence;\n    unsigned char load, store;\n\n    /* See if we need to regenerate the copy buffer */\n    if ((src_w == last.src_w) && (dst_w == last.dst_w) && (bpp == last.bpp)) {\n        return (last.status);\n    }\n    last.bpp = bpp;\n    last.src_w = src_w;\n    last.dst_w = dst_w;\n    last.status = -1;\n\n    switch (bpp) {\n    case 1:\n        load = LOAD_BYTE;\n        store = STORE_BYTE;\n        break;\n    case 2:\n    case 4:\n        load = LOAD_WORD;\n        store = STORE_WORD;\n        break;\n    default:\n        return SDL_SetError(\"ASM stretch of %d bytes isn't supported\\n\", bpp);\n    }\n#ifdef HAVE_MPROTECT\n    /* Make the code writeable */\n    if (mprotect(copy_row, sizeof(copy_row), PROT_READ | PROT_WRITE) < 0) {\n        return SDL_SetError(\"Couldn't make copy buffer writeable\");\n    }\n#endif\n    pos = 0x10000;\n    inc = (src_w << 16) / dst_w;\n    eip = copy_row;\n    fence = copy_row + sizeof(copy_row)-2;\n    for (i = 0; i < dst_w; ++i) {\n        while (pos >= 0x10000L) {\n            if (eip == fence) {\n                return -1;\n            }\n            if (bpp == 2) {\n                *eip++ = PREFIX16;\n            }\n            *eip++ = load;\n            pos -= 0x10000L;\n        }\n        if (eip == fence) {\n            return -1;\n        }\n        if (bpp == 2) {\n            *eip++ = PREFIX16;\n        }\n        *eip++ = store;\n        pos += inc;\n    }\n    *eip++ = RETURN;\n\n#ifdef HAVE_MPROTECT\n    /* Make the code executable but not writeable */\n    if (mprotect(copy_row, sizeof(copy_row), PROT_READ | PROT_EXEC) < 0) {\n        return SDL_SetError(\"Couldn't make copy buffer executable\");\n    }\n#endif\n    last.status = 0;\n    return (0);\n}\n\n#endif /* USE_ASM_STRETCH */\n\n#define DEFINE_COPY_ROW(name, type)         \\\nstatic void name(type *src, int src_w, type *dst, int dst_w)    \\\n{                                           \\\n    int i;                                  \\\n    int pos, inc;                           \\\n    type pixel = 0;                         \\\n                                            \\\n    pos = 0x10000;                          \\\n    inc = (src_w << 16) / dst_w;            \\\n    for ( i=dst_w; i>0; --i ) {             \\\n        while ( pos >= 0x10000L ) {         \\\n            pixel = *src++;                 \\\n            pos -= 0x10000L;                \\\n        }                                   \\\n        *dst++ = pixel;                     \\\n        pos += inc;                         \\\n    }                                       \\\n}\n/* *INDENT-OFF* */\nDEFINE_COPY_ROW(copy_row1, Uint8)\nDEFINE_COPY_ROW(copy_row2, Uint16)\nDEFINE_COPY_ROW(copy_row4, Uint32)\n/* *INDENT-ON* */\n\n/* The ASM code doesn't handle 24-bpp stretch blits */\nstatic void\ncopy_row3(Uint8 * src, int src_w, Uint8 * dst, int dst_w)\n{\n    int i;\n    int pos, inc;\n    Uint8 pixel[3] = { 0, 0, 0 };\n\n    pos = 0x10000;\n    inc = (src_w << 16) / dst_w;\n    for (i = dst_w; i > 0; --i) {\n        while (pos >= 0x10000L) {\n            pixel[0] = *src++;\n            pixel[1] = *src++;\n            pixel[2] = *src++;\n            pos -= 0x10000L;\n        }\n        *dst++ = pixel[0];\n        *dst++ = pixel[1];\n        *dst++ = pixel[2];\n        pos += inc;\n    }\n}\n\n/* Perform a stretch blit between two surfaces of the same format.\n   NOTE:  This function is not safe to call from multiple threads!\n*/\nint\nSDL_SoftStretch(SDL_Surface * src, const SDL_Rect * srcrect,\n                SDL_Surface * dst, const SDL_Rect * dstrect)\n{\n    int src_locked;\n    int dst_locked;\n    int pos, inc;\n    int dst_maxrow;\n    int src_row, dst_row;\n    Uint8 *srcp = NULL;\n    Uint8 *dstp;\n    SDL_Rect full_src;\n    SDL_Rect full_dst;\n#ifdef USE_ASM_STRETCH\n    SDL_bool use_asm = SDL_TRUE;\n#ifdef __GNUC__\n    int u1, u2;\n#endif\n#endif /* USE_ASM_STRETCH */\n    const int bpp = dst->format->BytesPerPixel;\n\n    if (src->format->format != dst->format->format) {\n        return SDL_SetError(\"Only works with same format surfaces\");\n    }\n\n    /* Verify the blit rectangles */\n    if (srcrect) {\n        if ((srcrect->x < 0) || (srcrect->y < 0) ||\n            ((srcrect->x + srcrect->w) > src->w) ||\n            ((srcrect->y + srcrect->h) > src->h)) {\n            return SDL_SetError(\"Invalid source blit rectangle\");\n        }\n    } else {\n        full_src.x = 0;\n        full_src.y = 0;\n        full_src.w = src->w;\n        full_src.h = src->h;\n        srcrect = &full_src;\n    }\n    if (dstrect) {\n        if ((dstrect->x < 0) || (dstrect->y < 0) ||\n            ((dstrect->x + dstrect->w) > dst->w) ||\n            ((dstrect->y + dstrect->h) > dst->h)) {\n            return SDL_SetError(\"Invalid destination blit rectangle\");\n        }\n    } else {\n        full_dst.x = 0;\n        full_dst.y = 0;\n        full_dst.w = dst->w;\n        full_dst.h = dst->h;\n        dstrect = &full_dst;\n    }\n\n    /* Lock the destination if it's in hardware */\n    dst_locked = 0;\n    if (SDL_MUSTLOCK(dst)) {\n        if (SDL_LockSurface(dst) < 0) {\n            return SDL_SetError(\"Unable to lock destination surface\");\n        }\n        dst_locked = 1;\n    }\n    /* Lock the source if it's in hardware */\n    src_locked = 0;\n    if (SDL_MUSTLOCK(src)) {\n        if (SDL_LockSurface(src) < 0) {\n            if (dst_locked) {\n                SDL_UnlockSurface(dst);\n            }\n            return SDL_SetError(\"Unable to lock source surface\");\n        }\n        src_locked = 1;\n    }\n\n    /* Set up the data... */\n    pos = 0x10000;\n    inc = (srcrect->h << 16) / dstrect->h;\n    src_row = srcrect->y;\n    dst_row = dstrect->y;\n\n#ifdef USE_ASM_STRETCH\n    /* Write the opcodes for this stretch */\n    if ((bpp == 3) || (generate_rowbytes(srcrect->w, dstrect->w, bpp) < 0)) {\n        use_asm = SDL_FALSE;\n    }\n#endif\n\n    /* Perform the stretch blit */\n    for (dst_maxrow = dst_row + dstrect->h; dst_row < dst_maxrow; ++dst_row) {\n        dstp = (Uint8 *) dst->pixels + (dst_row * dst->pitch)\n            + (dstrect->x * bpp);\n        while (pos >= 0x10000L) {\n            srcp = (Uint8 *) src->pixels + (src_row * src->pitch)\n                + (srcrect->x * bpp);\n            ++src_row;\n            pos -= 0x10000L;\n        }\n#ifdef USE_ASM_STRETCH\n        if (use_asm) {\n#ifdef __GNUC__\n            __asm__ __volatile__(\"call *%4\":\"=&D\"(u1), \"=&S\"(u2)\n                                 :\"0\"(dstp), \"1\"(srcp), \"r\"(copy_row)\n                                 :\"memory\");\n#elif defined(_MSC_VER) || defined(__WATCOMC__)\n            /* *INDENT-OFF* */\n            {\n                void *code = copy_row;\n                __asm {\n                    push edi\n                    push esi\n                    mov edi, dstp\n                    mov esi, srcp\n                    call dword ptr code\n                    pop esi\n                    pop edi\n                }\n            }\n            /* *INDENT-ON* */\n#else\n#error Need inline assembly for this compiler\n#endif\n        } else\n#endif\n            switch (bpp) {\n            case 1:\n                copy_row1(srcp, srcrect->w, dstp, dstrect->w);\n                break;\n            case 2:\n                copy_row2((Uint16 *) srcp, srcrect->w,\n                          (Uint16 *) dstp, dstrect->w);\n                break;\n            case 3:\n                copy_row3(srcp, srcrect->w, dstp, dstrect->w);\n                break;\n            case 4:\n                copy_row4((Uint32 *) srcp, srcrect->w,\n                          (Uint32 *) dstp, dstrect->w);\n                break;\n            }\n        pos += inc;\n    }\n\n    /* We need to unlock the surfaces if they're locked */\n    if (dst_locked) {\n        SDL_UnlockSurface(dst);\n    }\n    if (src_locked) {\n        SDL_UnlockSurface(src);\n    }\n    return (0);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_surface.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#include \"SDL_video.h\"\n#include \"SDL_sysvideo.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_RLEaccel_c.h\"\n#include \"SDL_pixels_c.h\"\n\n/* Public routines */\n\n/*\n * Create an empty RGB surface of the appropriate depth using the given\n * enum SDL_PIXELFORMAT_* format\n */\nSDL_Surface *\nSDL_CreateRGBSurfaceWithFormat(Uint32 flags, int width, int height, int depth,\n                               Uint32 format)\n{\n    SDL_Surface *surface;\n\n    /* The flags are no longer used, make the compiler happy */\n    (void)flags;\n\n    /* Allocate the surface */\n    surface = (SDL_Surface *) SDL_calloc(1, sizeof(*surface));\n    if (surface == NULL) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    surface->format = SDL_AllocFormat(format);\n    if (!surface->format) {\n        SDL_FreeSurface(surface);\n        return NULL;\n    }\n    surface->w = width;\n    surface->h = height;\n    surface->pitch = SDL_CalculatePitch(surface);\n    SDL_SetClipRect(surface, NULL);\n\n    if (SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {\n        SDL_Palette *palette =\n            SDL_AllocPalette((1 << surface->format->BitsPerPixel));\n        if (!palette) {\n            SDL_FreeSurface(surface);\n            return NULL;\n        }\n        if (palette->ncolors == 2) {\n            /* Create a black and white bitmap palette */\n            palette->colors[0].r = 0xFF;\n            palette->colors[0].g = 0xFF;\n            palette->colors[0].b = 0xFF;\n            palette->colors[1].r = 0x00;\n            palette->colors[1].g = 0x00;\n            palette->colors[1].b = 0x00;\n        }\n        SDL_SetSurfacePalette(surface, palette);\n        SDL_FreePalette(palette);\n    }\n\n    /* Get the pixels */\n    if (surface->w && surface->h) {\n        surface->pixels = SDL_malloc(surface->h * surface->pitch);\n        if (!surface->pixels) {\n            SDL_FreeSurface(surface);\n            SDL_OutOfMemory();\n            return NULL;\n        }\n        /* This is important for bitmaps */\n        SDL_memset(surface->pixels, 0, surface->h * surface->pitch);\n    }\n\n    /* Allocate an empty mapping */\n    surface->map = SDL_AllocBlitMap();\n    if (!surface->map) {\n        SDL_FreeSurface(surface);\n        return NULL;\n    }\n\n    /* By default surface with an alpha mask are set up for blending */\n    if (surface->format->Amask) {\n        SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);\n    }\n\n    /* The surface is ready to go */\n    surface->refcount = 1;\n    return surface;\n}\n\n/*\n * Create an empty RGB surface of the appropriate depth\n */\nSDL_Surface *\nSDL_CreateRGBSurface(Uint32 flags,\n                     int width, int height, int depth,\n                     Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)\n{\n    Uint32 format;\n\n    /* Get the pixel format */\n    format = SDL_MasksToPixelFormatEnum(depth, Rmask, Gmask, Bmask, Amask);\n    if (format == SDL_PIXELFORMAT_UNKNOWN) {\n        SDL_SetError(\"Unknown pixel format\");\n        return NULL;\n    }\n\n    return SDL_CreateRGBSurfaceWithFormat(flags, width, height, depth, format);\n}\n\n/*\n * Create an RGB surface from an existing memory buffer\n */\nSDL_Surface *\nSDL_CreateRGBSurfaceFrom(void *pixels,\n                         int width, int height, int depth, int pitch,\n                         Uint32 Rmask, Uint32 Gmask, Uint32 Bmask,\n                         Uint32 Amask)\n{\n    SDL_Surface *surface;\n\n    surface = SDL_CreateRGBSurface(0, 0, 0, depth, Rmask, Gmask, Bmask, Amask);\n    if (surface != NULL) {\n        surface->flags |= SDL_PREALLOC;\n        surface->pixels = pixels;\n        surface->w = width;\n        surface->h = height;\n        surface->pitch = pitch;\n        SDL_SetClipRect(surface, NULL);\n    }\n    return surface;\n}\n\n/*\n * Create an RGB surface from an existing memory buffer using the given given\n * enum SDL_PIXELFORMAT_* format\n */\nSDL_Surface *\nSDL_CreateRGBSurfaceWithFormatFrom(void *pixels,\n                         int width, int height, int depth, int pitch,\n                         Uint32 format)\n{\n    SDL_Surface *surface;\n\n    surface = SDL_CreateRGBSurfaceWithFormat(0, 0, 0, depth, format);\n    if (surface != NULL) {\n        surface->flags |= SDL_PREALLOC;\n        surface->pixels = pixels;\n        surface->w = width;\n        surface->h = height;\n        surface->pitch = pitch;\n        SDL_SetClipRect(surface, NULL);\n    }\n    return surface;\n}\n\nint\nSDL_SetSurfacePalette(SDL_Surface * surface, SDL_Palette * palette)\n{\n    if (!surface) {\n        return SDL_SetError(\"SDL_SetSurfacePalette() passed a NULL surface\");\n    }\n    if (SDL_SetPixelFormatPalette(surface->format, palette) < 0) {\n        return -1;\n    }\n    SDL_InvalidateMap(surface->map);\n\n    return 0;\n}\n\nint\nSDL_SetSurfaceRLE(SDL_Surface * surface, int flag)\n{\n    int flags;\n\n    if (!surface) {\n        return -1;\n    }\n\n    flags = surface->map->info.flags;\n    if (flag) {\n        surface->map->info.flags |= SDL_COPY_RLE_DESIRED;\n    } else {\n        surface->map->info.flags &= ~SDL_COPY_RLE_DESIRED;\n    }\n    if (surface->map->info.flags != flags) {\n        SDL_InvalidateMap(surface->map);\n    }\n    return 0;\n}\n\nint\nSDL_SetColorKey(SDL_Surface * surface, int flag, Uint32 key)\n{\n    int flags;\n\n    if (!surface) {\n        return SDL_InvalidParamError(\"surface\");\n    }\n\n    if (surface->format->palette && key >= ((Uint32) surface->format->palette->ncolors)) {\n        return SDL_InvalidParamError(\"key\");\n    }\n\n    if (flag & SDL_RLEACCEL) {\n        SDL_SetSurfaceRLE(surface, 1);\n    }\n\n    flags = surface->map->info.flags;\n    if (flag) {\n        surface->map->info.flags |= SDL_COPY_COLORKEY;\n        surface->map->info.colorkey = key;\n        if (surface->format->palette) {\n            surface->format->palette->colors[surface->map->info.colorkey].a = SDL_ALPHA_TRANSPARENT;\n            ++surface->format->palette->version;\n            if (!surface->format->palette->version) {\n                surface->format->palette->version = 1;\n            }\n        }\n    } else {\n        if (surface->format->palette) {\n            surface->format->palette->colors[surface->map->info.colorkey].a = SDL_ALPHA_OPAQUE;\n            ++surface->format->palette->version;\n            if (!surface->format->palette->version) {\n                surface->format->palette->version = 1;\n            }\n        }\n        surface->map->info.flags &= ~SDL_COPY_COLORKEY;\n    }\n    if (surface->map->info.flags != flags) {\n        SDL_InvalidateMap(surface->map);\n    }\n\n    return 0;\n}\n\nint\nSDL_GetColorKey(SDL_Surface * surface, Uint32 * key)\n{\n    if (!surface) {\n        return -1;\n    }\n\n    if (!(surface->map->info.flags & SDL_COPY_COLORKEY)) {\n        return -1;\n    }\n\n    if (key) {\n        *key = surface->map->info.colorkey;\n    }\n    return 0;\n}\n\n/* This is a fairly slow function to switch from colorkey to alpha */\nstatic void\nSDL_ConvertColorkeyToAlpha(SDL_Surface * surface)\n{\n    int x, y;\n\n    if (!surface) {\n        return;\n    }\n\n    if (!(surface->map->info.flags & SDL_COPY_COLORKEY) ||\n        !surface->format->Amask) {\n        return;\n    }\n\n    SDL_LockSurface(surface);\n\n    switch (surface->format->BytesPerPixel) {\n    case 2:\n        {\n            Uint16 *row, *spot;\n            Uint16 ckey = (Uint16) surface->map->info.colorkey;\n            Uint16 mask = (Uint16) (~surface->format->Amask);\n\n            /* Ignore alpha in colorkey comparison */\n            ckey &= mask;\n            row = (Uint16 *) surface->pixels;\n            for (y = surface->h; y--;) {\n                spot = row;\n                for (x = surface->w; x--;) {\n                    if ((*spot & mask) == ckey) {\n                        *spot &= mask;\n                    }\n                    ++spot;\n                }\n                row += surface->pitch / 2;\n            }\n        }\n        break;\n    case 3:\n        /* FIXME */\n        break;\n    case 4:\n        {\n            Uint32 *row, *spot;\n            Uint32 ckey = surface->map->info.colorkey;\n            Uint32 mask = ~surface->format->Amask;\n\n            /* Ignore alpha in colorkey comparison */\n            ckey &= mask;\n            row = (Uint32 *) surface->pixels;\n            for (y = surface->h; y--;) {\n                spot = row;\n                for (x = surface->w; x--;) {\n                    if ((*spot & mask) == ckey) {\n                        *spot &= mask;\n                    }\n                    ++spot;\n                }\n                row += surface->pitch / 4;\n            }\n        }\n        break;\n    }\n\n    SDL_UnlockSurface(surface);\n\n    SDL_SetColorKey(surface, 0, 0);\n    SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);\n}\n\nint\nSDL_SetSurfaceColorMod(SDL_Surface * surface, Uint8 r, Uint8 g, Uint8 b)\n{\n    int flags;\n\n    if (!surface) {\n        return -1;\n    }\n\n    surface->map->info.r = r;\n    surface->map->info.g = g;\n    surface->map->info.b = b;\n\n    flags = surface->map->info.flags;\n    if (r != 0xFF || g != 0xFF || b != 0xFF) {\n        surface->map->info.flags |= SDL_COPY_MODULATE_COLOR;\n    } else {\n        surface->map->info.flags &= ~SDL_COPY_MODULATE_COLOR;\n    }\n    if (surface->map->info.flags != flags) {\n        SDL_InvalidateMap(surface->map);\n    }\n    return 0;\n}\n\n\nint\nSDL_GetSurfaceColorMod(SDL_Surface * surface, Uint8 * r, Uint8 * g, Uint8 * b)\n{\n    if (!surface) {\n        return -1;\n    }\n\n    if (r) {\n        *r = surface->map->info.r;\n    }\n    if (g) {\n        *g = surface->map->info.g;\n    }\n    if (b) {\n        *b = surface->map->info.b;\n    }\n    return 0;\n}\n\nint\nSDL_SetSurfaceAlphaMod(SDL_Surface * surface, Uint8 alpha)\n{\n    int flags;\n\n    if (!surface) {\n        return -1;\n    }\n\n    surface->map->info.a = alpha;\n\n    flags = surface->map->info.flags;\n    if (alpha != 0xFF) {\n        surface->map->info.flags |= SDL_COPY_MODULATE_ALPHA;\n    } else {\n        surface->map->info.flags &= ~SDL_COPY_MODULATE_ALPHA;\n    }\n    if (surface->map->info.flags != flags) {\n        SDL_InvalidateMap(surface->map);\n    }\n    return 0;\n}\n\nint\nSDL_GetSurfaceAlphaMod(SDL_Surface * surface, Uint8 * alpha)\n{\n    if (!surface) {\n        return -1;\n    }\n\n    if (alpha) {\n        *alpha = surface->map->info.a;\n    }\n    return 0;\n}\n\nint\nSDL_SetSurfaceBlendMode(SDL_Surface * surface, SDL_BlendMode blendMode)\n{\n    int flags, status;\n\n    if (!surface) {\n        return -1;\n    }\n\n    status = 0;\n    flags = surface->map->info.flags;\n    surface->map->info.flags &=\n        ~(SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD);\n    switch (blendMode) {\n    case SDL_BLENDMODE_NONE:\n        break;\n    case SDL_BLENDMODE_BLEND:\n        surface->map->info.flags |= SDL_COPY_BLEND;\n        break;\n    case SDL_BLENDMODE_ADD:\n        surface->map->info.flags |= SDL_COPY_ADD;\n        break;\n    case SDL_BLENDMODE_MOD:\n        surface->map->info.flags |= SDL_COPY_MOD;\n        break;\n    default:\n        status = SDL_Unsupported();\n        break;\n    }\n\n    if (surface->map->info.flags != flags) {\n        SDL_InvalidateMap(surface->map);\n    }\n\n    return status;\n}\n\nint\nSDL_GetSurfaceBlendMode(SDL_Surface * surface, SDL_BlendMode *blendMode)\n{\n    if (!surface) {\n        return -1;\n    }\n\n    if (!blendMode) {\n        return 0;\n    }\n\n    switch (surface->map->\n            info.flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)) {\n    case SDL_COPY_BLEND:\n        *blendMode = SDL_BLENDMODE_BLEND;\n        break;\n    case SDL_COPY_ADD:\n        *blendMode = SDL_BLENDMODE_ADD;\n        break;\n    case SDL_COPY_MOD:\n        *blendMode = SDL_BLENDMODE_MOD;\n        break;\n    default:\n        *blendMode = SDL_BLENDMODE_NONE;\n        break;\n    }\n    return 0;\n}\n\nSDL_bool\nSDL_SetClipRect(SDL_Surface * surface, const SDL_Rect * rect)\n{\n    SDL_Rect full_rect;\n\n    /* Don't do anything if there's no surface to act on */\n    if (!surface) {\n        return SDL_FALSE;\n    }\n\n    /* Set up the full surface rectangle */\n    full_rect.x = 0;\n    full_rect.y = 0;\n    full_rect.w = surface->w;\n    full_rect.h = surface->h;\n\n    /* Set the clipping rectangle */\n    if (!rect) {\n        surface->clip_rect = full_rect;\n        return SDL_TRUE;\n    }\n    return SDL_IntersectRect(rect, &full_rect, &surface->clip_rect);\n}\n\nvoid\nSDL_GetClipRect(SDL_Surface * surface, SDL_Rect * rect)\n{\n    if (surface && rect) {\n        *rect = surface->clip_rect;\n    }\n}\n\n/*\n * Set up a blit between two surfaces -- split into three parts:\n * The upper part, SDL_UpperBlit(), performs clipping and rectangle\n * verification.  The lower part is a pointer to a low level\n * accelerated blitting function.\n *\n * These parts are separated out and each used internally by this\n * library in the optimimum places.  They are exported so that if\n * you know exactly what you are doing, you can optimize your code\n * by calling the one(s) you need.\n */\nint\nSDL_LowerBlit(SDL_Surface * src, SDL_Rect * srcrect,\n              SDL_Surface * dst, SDL_Rect * dstrect)\n{\n    /* Check to make sure the blit mapping is valid */\n    if ((src->map->dst != dst) ||\n        (dst->format->palette &&\n         src->map->dst_palette_version != dst->format->palette->version) ||\n        (src->format->palette &&\n         src->map->src_palette_version != src->format->palette->version)) {\n        if (SDL_MapSurface(src, dst) < 0) {\n            return (-1);\n        }\n        /* just here for debugging */\n/*         printf */\n/*             (\"src = 0x%08X src->flags = %08X src->map->info.flags = %08x\\ndst = 0x%08X dst->flags = %08X dst->map->info.flags = %08X\\nsrc->map->blit = 0x%08x\\n\", */\n/*              src, dst->flags, src->map->info.flags, dst, dst->flags, */\n/*              dst->map->info.flags, src->map->blit); */\n    }\n    return (src->map->blit(src, srcrect, dst, dstrect));\n}\n\n\nint\nSDL_UpperBlit(SDL_Surface * src, const SDL_Rect * srcrect,\n              SDL_Surface * dst, SDL_Rect * dstrect)\n{\n    SDL_Rect fulldst;\n    int srcx, srcy, w, h;\n\n    /* Make sure the surfaces aren't locked */\n    if (!src || !dst) {\n        return SDL_SetError(\"SDL_UpperBlit: passed a NULL surface\");\n    }\n    if (src->locked || dst->locked) {\n        return SDL_SetError(\"Surfaces must not be locked during blit\");\n    }\n\n    /* If the destination rectangle is NULL, use the entire dest surface */\n    if (dstrect == NULL) {\n        fulldst.x = fulldst.y = 0;\n        fulldst.w = dst->w;\n        fulldst.h = dst->h;\n        dstrect = &fulldst;\n    }\n\n    /* clip the source rectangle to the source surface */\n    if (srcrect) {\n        int maxw, maxh;\n\n        srcx = srcrect->x;\n        w = srcrect->w;\n        if (srcx < 0) {\n            w += srcx;\n            dstrect->x -= srcx;\n            srcx = 0;\n        }\n        maxw = src->w - srcx;\n        if (maxw < w)\n            w = maxw;\n\n        srcy = srcrect->y;\n        h = srcrect->h;\n        if (srcy < 0) {\n            h += srcy;\n            dstrect->y -= srcy;\n            srcy = 0;\n        }\n        maxh = src->h - srcy;\n        if (maxh < h)\n            h = maxh;\n\n    } else {\n        srcx = srcy = 0;\n        w = src->w;\n        h = src->h;\n    }\n\n    /* clip the destination rectangle against the clip rectangle */\n    {\n        SDL_Rect *clip = &dst->clip_rect;\n        int dx, dy;\n\n        dx = clip->x - dstrect->x;\n        if (dx > 0) {\n            w -= dx;\n            dstrect->x += dx;\n            srcx += dx;\n        }\n        dx = dstrect->x + w - clip->x - clip->w;\n        if (dx > 0)\n            w -= dx;\n\n        dy = clip->y - dstrect->y;\n        if (dy > 0) {\n            h -= dy;\n            dstrect->y += dy;\n            srcy += dy;\n        }\n        dy = dstrect->y + h - clip->y - clip->h;\n        if (dy > 0)\n            h -= dy;\n    }\n\n    /* Switch back to a fast blit if we were previously stretching */\n    if (src->map->info.flags & SDL_COPY_NEAREST) {\n        src->map->info.flags &= ~SDL_COPY_NEAREST;\n        SDL_InvalidateMap(src->map);\n    }\n\n    if (w > 0 && h > 0) {\n        SDL_Rect sr;\n        sr.x = srcx;\n        sr.y = srcy;\n        sr.w = dstrect->w = w;\n        sr.h = dstrect->h = h;\n        return SDL_LowerBlit(src, &sr, dst, dstrect);\n    }\n    dstrect->w = dstrect->h = 0;\n    return 0;\n}\n\nint\nSDL_UpperBlitScaled(SDL_Surface * src, const SDL_Rect * srcrect,\n              SDL_Surface * dst, SDL_Rect * dstrect)\n{\n    double src_x0, src_y0, src_x1, src_y1;\n    double dst_x0, dst_y0, dst_x1, dst_y1;\n    SDL_Rect final_src, final_dst;\n    double scaling_w, scaling_h;\n    int src_w, src_h;\n    int dst_w, dst_h;\n\n    /* Make sure the surfaces aren't locked */\n    if (!src || !dst) {\n        return SDL_SetError(\"SDL_UpperBlitScaled: passed a NULL surface\");\n    }\n    if (src->locked || dst->locked) {\n        return SDL_SetError(\"Surfaces must not be locked during blit\");\n    }\n\n    if (NULL == srcrect) {\n        src_w = src->w;\n        src_h = src->h;\n    } else {\n        src_w = srcrect->w;\n        src_h = srcrect->h;\n    }\n\n    if (NULL == dstrect) {\n        dst_w = dst->w;\n        dst_h = dst->h;\n    } else {\n        dst_w = dstrect->w;\n        dst_h = dstrect->h;\n    }\n\n    if (dst_w == src_w && dst_h == src_h) {\n        /* No scaling, defer to regular blit */\n        return SDL_BlitSurface(src, srcrect, dst, dstrect);\n    }\n\n    scaling_w = (double)dst_w / src_w;\n    scaling_h = (double)dst_h / src_h;\n\n    if (NULL == dstrect) {\n        dst_x0 = 0;\n        dst_y0 = 0;\n        dst_x1 = dst_w - 1;\n        dst_y1 = dst_h - 1;\n    } else {\n        dst_x0 = dstrect->x;\n        dst_y0 = dstrect->y;\n        dst_x1 = dst_x0 + dst_w - 1;\n        dst_y1 = dst_y0 + dst_h - 1;\n    }\n\n    if (NULL == srcrect) {\n        src_x0 = 0;\n        src_y0 = 0;\n        src_x1 = src_w - 1;\n        src_y1 = src_h - 1;\n    } else {\n        src_x0 = srcrect->x;\n        src_y0 = srcrect->y;\n        src_x1 = src_x0 + src_w - 1;\n        src_y1 = src_y0 + src_h - 1;\n\n        /* Clip source rectangle to the source surface */\n\n        if (src_x0 < 0) {\n            dst_x0 -= src_x0 * scaling_w;\n            src_x0 = 0;\n        }\n\n        if (src_x1 >= src->w) {\n            dst_x1 -= (src_x1 - src->w + 1) * scaling_w;\n            src_x1 = src->w - 1;\n        }\n\n        if (src_y0 < 0) {\n            dst_y0 -= src_y0 * scaling_h;\n            src_y0 = 0;\n        }\n\n        if (src_y1 >= src->h) {\n            dst_y1 -= (src_y1 - src->h + 1) * scaling_h;\n            src_y1 = src->h - 1;\n        }\n    }\n\n    /* Clip destination rectangle to the clip rectangle */\n\n    /* Translate to clip space for easier calculations */\n    dst_x0 -= dst->clip_rect.x;\n    dst_x1 -= dst->clip_rect.x;\n    dst_y0 -= dst->clip_rect.y;\n    dst_y1 -= dst->clip_rect.y;\n\n    if (dst_x0 < 0) {\n        src_x0 -= dst_x0 / scaling_w;\n        dst_x0 = 0;\n    }\n\n    if (dst_x1 >= dst->clip_rect.w) {\n        src_x1 -= (dst_x1 - dst->clip_rect.w + 1) / scaling_w;\n        dst_x1 = dst->clip_rect.w - 1;\n    }\n\n    if (dst_y0 < 0) {\n        src_y0 -= dst_y0 / scaling_h;\n        dst_y0 = 0;\n    }\n\n    if (dst_y1 >= dst->clip_rect.h) {\n        src_y1 -= (dst_y1 - dst->clip_rect.h + 1) / scaling_h;\n        dst_y1 = dst->clip_rect.h - 1;\n    }\n\n    /* Translate back to surface coordinates */\n    dst_x0 += dst->clip_rect.x;\n    dst_x1 += dst->clip_rect.x;\n    dst_y0 += dst->clip_rect.y;\n    dst_y1 += dst->clip_rect.y;\n\n    final_src.x = (int)SDL_floor(src_x0 + 0.5);\n    final_src.y = (int)SDL_floor(src_y0 + 0.5);\n    final_src.w = (int)SDL_floor(src_x1 - src_x0 + 1.5);\n    final_src.h = (int)SDL_floor(src_y1 - src_y0 + 1.5);\n\n    final_dst.x = (int)SDL_floor(dst_x0 + 0.5);\n    final_dst.y = (int)SDL_floor(dst_y0 + 0.5);\n    final_dst.w = (int)SDL_floor(dst_x1 - dst_x0 + 1.5);\n    final_dst.h = (int)SDL_floor(dst_y1 - dst_y0 + 1.5);\n\n    if (final_dst.w < 0)\n        final_dst.w = 0;\n    if (final_dst.h < 0)\n        final_dst.h = 0;\n\n    if (dstrect)\n        *dstrect = final_dst;\n\n    if (final_dst.w == 0 || final_dst.h == 0 ||\n        final_src.w <= 0 || final_src.h <= 0) {\n        /* No-op. */\n        return 0;\n    }\n\n    return SDL_LowerBlitScaled(src, &final_src, dst, &final_dst);\n}\n\n/**\n *  This is a semi-private blit function and it performs low-level surface\n *  scaled blitting only.\n */\nint\nSDL_LowerBlitScaled(SDL_Surface * src, SDL_Rect * srcrect,\n                SDL_Surface * dst, SDL_Rect * dstrect)\n{\n    static const Uint32 complex_copy_flags = (\n        SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA |\n        SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD |\n        SDL_COPY_COLORKEY\n    );\n\n    if (!(src->map->info.flags & SDL_COPY_NEAREST)) {\n        src->map->info.flags |= SDL_COPY_NEAREST;\n        SDL_InvalidateMap(src->map);\n    }\n\n    if ( !(src->map->info.flags & complex_copy_flags) &&\n         src->format->format == dst->format->format &&\n         !SDL_ISPIXELFORMAT_INDEXED(src->format->format) ) {\n        return SDL_SoftStretch( src, srcrect, dst, dstrect );\n    } else {\n        return SDL_LowerBlit( src, srcrect, dst, dstrect );\n    }\n}\n\n/*\n * Lock a surface to directly access the pixels\n */\nint\nSDL_LockSurface(SDL_Surface * surface)\n{\n    if (!surface->locked) {\n        /* Perform the lock */\n        if (surface->flags & SDL_RLEACCEL) {\n            SDL_UnRLESurface(surface, 1);\n            surface->flags |= SDL_RLEACCEL;     /* save accel'd state */\n        }\n    }\n\n    /* Increment the surface lock count, for recursive locks */\n    ++surface->locked;\n\n    /* Ready to go.. */\n    return (0);\n}\n\n/*\n * Unlock a previously locked surface\n */\nvoid\nSDL_UnlockSurface(SDL_Surface * surface)\n{\n    /* Only perform an unlock if we are locked */\n    if (!surface->locked || (--surface->locked > 0)) {\n        return;\n    }\n\n    /* Update RLE encoded surface with new data */\n    if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {\n        surface->flags &= ~SDL_RLEACCEL;        /* stop lying */\n        SDL_RLESurface(surface);\n    }\n}\n\n/*\n * Convert a surface into the specified pixel format.\n */\nSDL_Surface *\nSDL_ConvertSurface(SDL_Surface * surface, const SDL_PixelFormat * format,\n                   Uint32 flags)\n{\n    SDL_Surface *convert;\n    Uint32 copy_flags;\n    SDL_Color copy_color;\n    SDL_Rect bounds;\n\n    /* Check for empty destination palette! (results in empty image) */\n    if (format->palette != NULL) {\n        int i;\n        for (i = 0; i < format->palette->ncolors; ++i) {\n            if ((format->palette->colors[i].r != 0xFF) ||\n                (format->palette->colors[i].g != 0xFF) ||\n                (format->palette->colors[i].b != 0xFF))\n                break;\n        }\n        if (i == format->palette->ncolors) {\n            SDL_SetError(\"Empty destination palette\");\n            return (NULL);\n        }\n    }\n\n    /* Create a new surface with the desired format */\n    convert = SDL_CreateRGBSurface(flags, surface->w, surface->h,\n                                   format->BitsPerPixel, format->Rmask,\n                                   format->Gmask, format->Bmask,\n                                   format->Amask);\n    if (convert == NULL) {\n        return (NULL);\n    }\n\n    /* Copy the palette if any */\n    if (format->palette && convert->format->palette) {\n        SDL_memcpy(convert->format->palette->colors,\n                   format->palette->colors,\n                   format->palette->ncolors * sizeof(SDL_Color));\n        convert->format->palette->ncolors = format->palette->ncolors;\n    }\n\n    /* Save the original copy flags */\n    copy_flags = surface->map->info.flags;\n    copy_color.r = surface->map->info.r;\n    copy_color.g = surface->map->info.g;\n    copy_color.b = surface->map->info.b;\n    copy_color.a = surface->map->info.a;\n    surface->map->info.r = 0xFF;\n    surface->map->info.g = 0xFF;\n    surface->map->info.b = 0xFF;\n    surface->map->info.a = 0xFF;\n    surface->map->info.flags = 0;\n    SDL_InvalidateMap(surface->map);\n\n    /* Copy over the image data */\n    bounds.x = 0;\n    bounds.y = 0;\n    bounds.w = surface->w;\n    bounds.h = surface->h;\n    SDL_LowerBlit(surface, &bounds, convert, &bounds);\n\n    /* Clean up the original surface, and update converted surface */\n    convert->map->info.r = copy_color.r;\n    convert->map->info.g = copy_color.g;\n    convert->map->info.b = copy_color.b;\n    convert->map->info.a = copy_color.a;\n    convert->map->info.flags =\n        (copy_flags &\n         ~(SDL_COPY_COLORKEY | SDL_COPY_BLEND\n           | SDL_COPY_RLE_DESIRED | SDL_COPY_RLE_COLORKEY |\n           SDL_COPY_RLE_ALPHAKEY));\n    surface->map->info.r = copy_color.r;\n    surface->map->info.g = copy_color.g;\n    surface->map->info.b = copy_color.b;\n    surface->map->info.a = copy_color.a;\n    surface->map->info.flags = copy_flags;\n    SDL_InvalidateMap(surface->map);\n    if (copy_flags & SDL_COPY_COLORKEY) {\n        SDL_bool set_colorkey_by_color = SDL_FALSE;\n\n        if (surface->format->palette) {\n            if (format->palette &&\n                surface->format->palette->ncolors <= format->palette->ncolors &&\n                (SDL_memcmp(surface->format->palette->colors, format->palette->colors,\n                  surface->format->palette->ncolors * sizeof(SDL_Color)) == 0)) {\n                /* The palette is identical, just set the same colorkey */\n                SDL_SetColorKey(convert, 1, surface->map->info.colorkey);\n            } else if (format->Amask) {\n                /* The alpha was set in the destination from the palette */\n            } else {\n                set_colorkey_by_color = SDL_TRUE;\n            }\n        } else {\n            set_colorkey_by_color = SDL_TRUE;\n        }\n\n        if (set_colorkey_by_color) {\n            /* Set the colorkey by color, which needs to be unique */\n            Uint8 keyR, keyG, keyB, keyA;\n\n            SDL_GetRGBA(surface->map->info.colorkey, surface->format, &keyR,\n                        &keyG, &keyB, &keyA);\n            SDL_SetColorKey(convert, 1,\n                            SDL_MapRGBA(convert->format, keyR, keyG, keyB, keyA));\n            /* This is needed when converting for 3D texture upload */\n            SDL_ConvertColorkeyToAlpha(convert);\n        }\n    }\n    SDL_SetClipRect(convert, &surface->clip_rect);\n\n    /* Enable alpha blending by default if the new surface has an\n     * alpha channel or alpha modulation */\n    if ((surface->format->Amask && format->Amask) ||\n        (copy_flags & (SDL_COPY_COLORKEY|SDL_COPY_MODULATE_ALPHA))) {\n        SDL_SetSurfaceBlendMode(convert, SDL_BLENDMODE_BLEND);\n    }\n    if ((copy_flags & SDL_COPY_RLE_DESIRED) || (flags & SDL_RLEACCEL)) {\n        SDL_SetSurfaceRLE(convert, SDL_RLEACCEL);\n    }\n\n    /* We're ready to go! */\n    return (convert);\n}\n\nSDL_Surface *\nSDL_ConvertSurfaceFormat(SDL_Surface * surface, Uint32 pixel_format,\n                         Uint32 flags)\n{\n    SDL_PixelFormat *fmt;\n    SDL_Surface *convert = NULL;\n\n    fmt = SDL_AllocFormat(pixel_format);\n    if (fmt) {\n        convert = SDL_ConvertSurface(surface, fmt, flags);\n        SDL_FreeFormat(fmt);\n    }\n    return convert;\n}\n\n/*\n * Create a surface on the stack for quick blit operations\n */\nstatic SDL_INLINE SDL_bool\nSDL_CreateSurfaceOnStack(int width, int height, Uint32 pixel_format,\n                         void * pixels, int pitch, SDL_Surface * surface,\n                         SDL_PixelFormat * format, SDL_BlitMap * blitmap)\n{\n    if (SDL_ISPIXELFORMAT_INDEXED(pixel_format)) {\n        SDL_SetError(\"Indexed pixel formats not supported\");\n        return SDL_FALSE;\n    }\n    if (SDL_InitFormat(format, pixel_format) < 0) {\n        return SDL_FALSE;\n    }\n\n    SDL_zerop(surface);\n    surface->flags = SDL_PREALLOC;\n    surface->format = format;\n    surface->pixels = pixels;\n    surface->w = width;\n    surface->h = height;\n    surface->pitch = pitch;\n    /* We don't actually need to set up the clip rect for our purposes */\n    /* SDL_SetClipRect(surface, NULL); */\n\n    /* Allocate an empty mapping */\n    SDL_zerop(blitmap);\n    blitmap->info.r = 0xFF;\n    blitmap->info.g = 0xFF;\n    blitmap->info.b = 0xFF;\n    blitmap->info.a = 0xFF;\n    surface->map = blitmap;\n\n    /* The surface is ready to go */\n    surface->refcount = 1;\n    return SDL_TRUE;\n}\n\n/*\n * Copy a block of pixels of one format to another format\n */\nint SDL_ConvertPixels(int width, int height,\n                      Uint32 src_format, const void * src, int src_pitch,\n                      Uint32 dst_format, void * dst, int dst_pitch)\n{\n    SDL_Surface src_surface, dst_surface;\n    SDL_PixelFormat src_fmt, dst_fmt;\n    SDL_BlitMap src_blitmap, dst_blitmap;\n    SDL_Rect rect;\n    void *nonconst_src = (void *) src;\n\n    /* Check to make sure we are blitting somewhere, so we don't crash */\n    if (!dst) {\n        return SDL_InvalidParamError(\"dst\");\n    }\n    if (!dst_pitch) {\n        return SDL_InvalidParamError(\"dst_pitch\");\n    }\n\n    /* Fast path for same format copy */\n    if (src_format == dst_format) {\n        int bpp, i;\n\n        if (SDL_ISPIXELFORMAT_FOURCC(src_format)) {\n            switch (src_format) {\n            case SDL_PIXELFORMAT_YUY2:\n            case SDL_PIXELFORMAT_UYVY:\n            case SDL_PIXELFORMAT_YVYU:\n                bpp = 2;\n                break;\n            case SDL_PIXELFORMAT_YV12:\n            case SDL_PIXELFORMAT_IYUV:\n            case SDL_PIXELFORMAT_NV12:\n            case SDL_PIXELFORMAT_NV21:\n                bpp = 1;\n                break;\n            default:\n                return SDL_SetError(\"Unknown FOURCC pixel format\");\n            }\n        } else {\n            bpp = SDL_BYTESPERPIXEL(src_format);\n        }\n        width *= bpp;\n\n        for (i = height; i--;) {\n            SDL_memcpy(dst, src, width);\n            src = (Uint8*)src + src_pitch;\n            dst = (Uint8*)dst + dst_pitch;\n        }\n\n        if (src_format == SDL_PIXELFORMAT_YV12 || src_format == SDL_PIXELFORMAT_IYUV) {\n            /* U and V planes are a quarter the size of the Y plane */\n            width /= 2;\n            height /= 2;\n            src_pitch /= 2;\n            dst_pitch /= 2;\n            for (i = height * 2; i--;) {\n                SDL_memcpy(dst, src, width);\n                src = (Uint8*)src + src_pitch;\n                dst = (Uint8*)dst + dst_pitch;\n            }\n        } else if (src_format == SDL_PIXELFORMAT_NV12 || src_format == SDL_PIXELFORMAT_NV21) {\n            /* U/V plane is half the height of the Y plane */\n            height /= 2;\n            for (i = height; i--;) {\n                SDL_memcpy(dst, src, width);\n                src = (Uint8*)src + src_pitch;\n                dst = (Uint8*)dst + dst_pitch;\n            }\n        }\n        return 0;\n    }\n\n    if (!SDL_CreateSurfaceOnStack(width, height, src_format, nonconst_src,\n                                  src_pitch,\n                                  &src_surface, &src_fmt, &src_blitmap)) {\n        return -1;\n    }\n    if (!SDL_CreateSurfaceOnStack(width, height, dst_format, dst, dst_pitch,\n                                  &dst_surface, &dst_fmt, &dst_blitmap)) {\n        return -1;\n    }\n\n    /* Set up the rect and go! */\n    rect.x = 0;\n    rect.y = 0;\n    rect.w = width;\n    rect.h = height;\n    return SDL_LowerBlit(&src_surface, &rect, &dst_surface, &rect);\n}\n\n/*\n * Free a surface created by the above function.\n */\nvoid\nSDL_FreeSurface(SDL_Surface * surface)\n{\n    if (surface == NULL) {\n        return;\n    }\n    if (surface->flags & SDL_DONTFREE) {\n        return;\n    }\n    if (--surface->refcount > 0) {\n        return;\n    }\n    while (surface->locked > 0) {\n        SDL_UnlockSurface(surface);\n    }\n    if (surface->flags & SDL_RLEACCEL) {\n        SDL_UnRLESurface(surface, 0);\n    }\n    if (surface->format) {\n        SDL_SetSurfacePalette(surface, NULL);\n        SDL_FreeFormat(surface->format);\n        surface->format = NULL;\n    }\n    if (surface->map != NULL) {\n        SDL_FreeBlitMap(surface->map);\n        surface->map = NULL;\n    }\n    if (!(surface->flags & SDL_PREALLOC)) {\n        SDL_free(surface->pixels);\n    }\n    SDL_free(surface);\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_sysvideo.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n#ifndef _SDL_sysvideo_h\n#define _SDL_sysvideo_h\n\n#include \"SDL_messagebox.h\"\n#include \"SDL_shape.h\"\n#include \"SDL_thread.h\"\n\n/* The SDL video driver */\n\ntypedef struct SDL_WindowShaper SDL_WindowShaper;\ntypedef struct SDL_ShapeDriver SDL_ShapeDriver;\ntypedef struct SDL_VideoDisplay SDL_VideoDisplay;\ntypedef struct SDL_VideoDevice SDL_VideoDevice;\n\n/* Define the SDL window-shaper structure */\nstruct SDL_WindowShaper\n{\n    /* The window associated with the shaper */\n    SDL_Window *window;\n\n    /* The user's specified coordinates for the window, for once we give it a shape. */\n    Uint32 userx,usery;\n\n    /* The parameters for shape calculation. */\n    SDL_WindowShapeMode mode;\n\n    /* Has this window been assigned a shape? */\n    SDL_bool hasshape;\n\n    void *driverdata;\n};\n\n/* Define the SDL shape driver structure */\nstruct SDL_ShapeDriver\n{\n    SDL_WindowShaper *(*CreateShaper)(SDL_Window * window);\n    int (*SetWindowShape)(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);\n    int (*ResizeWindowShape)(SDL_Window *window);\n};\n\ntypedef struct SDL_WindowUserData\n{\n    char *name;\n    void *data;\n    struct SDL_WindowUserData *next;\n} SDL_WindowUserData;\n\n/* Define the SDL window structure, corresponding to toplevel windows */\nstruct SDL_Window\n{\n    const void *magic;\n    Uint32 id;\n    char *title;\n    SDL_Surface *icon;\n    int x, y;\n    int w, h;\n    int min_w, min_h;\n    int max_w, max_h;\n    Uint32 flags;\n    Uint32 last_fullscreen_flags;\n\n    /* Stored position and size for windowed mode */\n    SDL_Rect windowed;\n\n    SDL_DisplayMode fullscreen_mode;\n\n    float opacity;\n\n    float brightness;\n    Uint16 *gamma;\n    Uint16 *saved_gamma;        /* (just offset into gamma) */\n\n    SDL_Surface *surface;\n    SDL_bool surface_valid;\n\n    SDL_bool is_hiding;\n    SDL_bool is_destroying;\n    SDL_bool is_dropping;       /* drag/drop in progress, expecting SDL_SendDropComplete(). */\n\n    SDL_WindowShaper *shaper;\n\n    SDL_HitTest hit_test;\n    void *hit_test_data;\n\n    SDL_WindowUserData *data;\n\n    void *driverdata;\n\n    SDL_Window *prev;\n    SDL_Window *next;\n};\n#define FULLSCREEN_VISIBLE(W) \\\n    (((W)->flags & SDL_WINDOW_FULLSCREEN) && \\\n     ((W)->flags & SDL_WINDOW_SHOWN) && \\\n     !((W)->flags & SDL_WINDOW_MINIMIZED))\n\n/*\n * Define the SDL display structure This corresponds to physical monitors\n * attached to the system.\n */\nstruct SDL_VideoDisplay\n{\n    char *name;\n    int max_display_modes;\n    int num_display_modes;\n    SDL_DisplayMode *display_modes;\n    SDL_DisplayMode desktop_mode;\n    SDL_DisplayMode current_mode;\n\n    SDL_Window *fullscreen_window;\n\n    SDL_VideoDevice *device;\n\n    void *driverdata;\n};\n\n/* Forward declaration */\nstruct SDL_SysWMinfo;\n\n/* Define the SDL video driver structure */\n#define _THIS   SDL_VideoDevice *_this\n\nstruct SDL_VideoDevice\n{\n    /* * * */\n    /* The name of this video driver */\n    const char *name;\n\n    /* * * */\n    /* Initialization/Query functions */\n\n    /*\n     * Initialize the native video subsystem, filling in the list of\n     * displays for this driver, returning 0 or -1 if there's an error.\n     */\n    int (*VideoInit) (_THIS);\n\n    /*\n     * Reverse the effects VideoInit() -- called if VideoInit() fails or\n     * if the application is shutting down the video subsystem.\n     */\n    void (*VideoQuit) (_THIS);\n\n    /* * * */\n    /*\n     * Display functions\n     */\n\n    /*\n     * Get the bounds of a display\n     */\n    int (*GetDisplayBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);\n\n    /*\n     * Get the dots/pixels-per-inch of a display\n     */\n    int (*GetDisplayDPI) (_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi);\n\n    /*\n     * Get the usable bounds of a display (bounds minus menubar or whatever)\n     */\n    int (*GetDisplayUsableBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);\n\n    /*\n     * Get a list of the available display modes for a display.\n     */\n    void (*GetDisplayModes) (_THIS, SDL_VideoDisplay * display);\n\n    /*\n     * Setting the display mode is independent of creating windows, so\n     * when the display mode is changed, all existing windows should have\n     * their data updated accordingly, including the display surfaces\n     * associated with them.\n     */\n    int (*SetDisplayMode) (_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);\n\n    /* * * */\n    /*\n     * Window functions\n     */\n    int (*CreateWindow) (_THIS, SDL_Window * window);\n    int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data);\n    void (*SetWindowTitle) (_THIS, SDL_Window * window);\n    void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon);\n    void (*SetWindowPosition) (_THIS, SDL_Window * window);\n    void (*SetWindowSize) (_THIS, SDL_Window * window);\n    void (*SetWindowMinimumSize) (_THIS, SDL_Window * window);\n    void (*SetWindowMaximumSize) (_THIS, SDL_Window * window);\n    int (*GetWindowBordersSize) (_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right);\n    int (*SetWindowOpacity) (_THIS, SDL_Window * window, float opacity);\n    int (*SetWindowModalFor) (_THIS, SDL_Window * modal_window, SDL_Window * parent_window);\n    int (*SetWindowInputFocus) (_THIS, SDL_Window * window);\n    void (*ShowWindow) (_THIS, SDL_Window * window);\n    void (*HideWindow) (_THIS, SDL_Window * window);\n    void (*RaiseWindow) (_THIS, SDL_Window * window);\n    void (*MaximizeWindow) (_THIS, SDL_Window * window);\n    void (*MinimizeWindow) (_THIS, SDL_Window * window);\n    void (*RestoreWindow) (_THIS, SDL_Window * window);\n    void (*SetWindowBordered) (_THIS, SDL_Window * window, SDL_bool bordered);\n    void (*SetWindowResizable) (_THIS, SDL_Window * window, SDL_bool resizable);\n    void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);\n    int (*SetWindowGammaRamp) (_THIS, SDL_Window * window, const Uint16 * ramp);\n    int (*GetWindowGammaRamp) (_THIS, SDL_Window * window, Uint16 * ramp);\n    void (*SetWindowGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);\n    void (*DestroyWindow) (_THIS, SDL_Window * window);\n    int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);\n    int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);\n    void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);\n    void (*OnWindowEnter) (_THIS, SDL_Window * window);\n\n    /* * * */\n    /*\n     * Shaped-window functions\n     */\n    SDL_ShapeDriver shape_driver;\n\n    /* Get some platform dependent window information */\n    SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,\n                                struct SDL_SysWMinfo * info);\n\n    /* * * */\n    /*\n     * OpenGL support\n     */\n    int (*GL_LoadLibrary) (_THIS, const char *path);\n    void *(*GL_GetProcAddress) (_THIS, const char *proc);\n    void (*GL_UnloadLibrary) (_THIS);\n      SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window);\n    int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context);\n    void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);\n    int (*GL_SetSwapInterval) (_THIS, int interval);\n    int (*GL_GetSwapInterval) (_THIS);\n    void (*GL_SwapWindow) (_THIS, SDL_Window * window);\n    void (*GL_DeleteContext) (_THIS, SDL_GLContext context);\n\n    /* * * */\n    /*\n     * Event manager functions\n     */\n    void (*PumpEvents) (_THIS);\n\n    /* Suspend the screensaver */\n    void (*SuspendScreenSaver) (_THIS);\n\n    /* Text input */\n    void (*StartTextInput) (_THIS);\n    void (*StopTextInput) (_THIS);\n    void (*SetTextInputRect) (_THIS, SDL_Rect *rect);\n\n    /* Screen keyboard */\n    SDL_bool (*HasScreenKeyboardSupport) (_THIS);\n    void (*ShowScreenKeyboard) (_THIS, SDL_Window *window);\n    void (*HideScreenKeyboard) (_THIS, SDL_Window *window);\n    SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window);\n\n    /* Clipboard */\n    int (*SetClipboardText) (_THIS, const char *text);\n    char * (*GetClipboardText) (_THIS);\n    SDL_bool (*HasClipboardText) (_THIS);\n\n    /* MessageBox */\n    int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid);\n\n    /* Hit-testing */\n    int (*SetWindowHitTest)(SDL_Window * window, SDL_bool enabled);\n\n    /* * * */\n    /* Data common to all drivers */\n    SDL_bool suspend_screensaver;\n    int num_displays;\n    SDL_VideoDisplay *displays;\n    SDL_Window *windows;\n    SDL_Window *grabbed_window;\n    Uint8 window_magic;\n    Uint32 next_object_id;\n    char * clipboard_text;\n\n    /* * * */\n    /* Data used by the GL drivers */\n    struct\n    {\n        int red_size;\n        int green_size;\n        int blue_size;\n        int alpha_size;\n        int depth_size;\n        int buffer_size;\n        int stencil_size;\n        int double_buffer;\n        int accum_red_size;\n        int accum_green_size;\n        int accum_blue_size;\n        int accum_alpha_size;\n        int stereo;\n        int multisamplebuffers;\n        int multisamplesamples;\n        int accelerated;\n        int major_version;\n        int minor_version;\n        int flags;\n        int profile_mask;\n        int share_with_current_context;\n        int release_behavior;\n        int framebuffer_srgb_capable;\n        int retained_backing;\n        int driver_loaded;\n        char driver_path[256];\n        void *dll_handle;\n    } gl_config;\n\n    /* * * */\n    /* Cache current GL context; don't call the OS when it hasn't changed. */\n    /* We have the global pointers here so Cocoa continues to work the way\n       it always has, and the thread-local storage for the general case.\n     */\n    SDL_Window *current_glwin;\n    SDL_GLContext current_glctx;\n    SDL_TLSID current_glwin_tls;\n    SDL_TLSID current_glctx_tls;\n\n    /* * * */\n    /* Data private to this driver */\n    void *driverdata;\n    struct SDL_GLDriverData *gl_data;\n    \n#if SDL_VIDEO_OPENGL_EGL\n    struct SDL_EGL_VideoData *egl_data;\n#endif\n    \n#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2\n    struct SDL_PrivateGLESData *gles_data;\n#endif\n\n    /* * * */\n    /* The function used to dispose of this structure */\n    void (*free) (_THIS);\n};\n\ntypedef struct VideoBootStrap\n{\n    const char *name;\n    const char *desc;\n    int (*available) (void);\n    SDL_VideoDevice *(*create) (int devindex);\n} VideoBootStrap;\n\n#if SDL_VIDEO_DRIVER_COCOA\nextern VideoBootStrap COCOA_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_X11\nextern VideoBootStrap X11_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_MIR\nextern VideoBootStrap MIR_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_DIRECTFB\nextern VideoBootStrap DirectFB_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_WINDOWS\nextern VideoBootStrap WINDOWS_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_WINRT\nextern VideoBootStrap WINRT_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_HAIKU\nextern VideoBootStrap HAIKU_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_PANDORA\nextern VideoBootStrap PND_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_UIKIT\nextern VideoBootStrap UIKIT_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_ANDROID\nextern VideoBootStrap Android_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_PSP\nextern VideoBootStrap PSP_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_RPI\nextern VideoBootStrap RPI_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_DUMMY\nextern VideoBootStrap DUMMY_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_WAYLAND\nextern VideoBootStrap Wayland_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_NACL\nextern VideoBootStrap NACL_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_VIVANTE\nextern VideoBootStrap VIVANTE_bootstrap;\n#endif\n#if SDL_VIDEO_DRIVER_EMSCRIPTEN\nextern VideoBootStrap Emscripten_bootstrap;\n#endif\n\nextern SDL_VideoDevice *SDL_GetVideoDevice(void);\nextern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);\nextern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);\nextern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);\nextern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);\nextern void *SDL_GetDisplayDriverData( int displayIndex );\n\nextern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);\n\nextern void SDL_OnWindowShown(SDL_Window * window);\nextern void SDL_OnWindowHidden(SDL_Window * window);\nextern void SDL_OnWindowResized(SDL_Window * window);\nextern void SDL_OnWindowMinimized(SDL_Window * window);\nextern void SDL_OnWindowRestored(SDL_Window * window);\nextern void SDL_OnWindowEnter(SDL_Window * window);\nextern void SDL_OnWindowLeave(SDL_Window * window);\nextern void SDL_OnWindowFocusGained(SDL_Window * window);\nextern void SDL_OnWindowFocusLost(SDL_Window * window);\nextern void SDL_UpdateWindowGrab(SDL_Window * window);\nextern SDL_Window * SDL_GetFocusWindow(void);\n\nextern SDL_bool SDL_ShouldAllowTopmost(void);\n\nextern float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches);\n\n#endif /* _SDL_sysvideo_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/SDL_video.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* The high-level video driver subsystem */\n\n#include \"SDL.h\"\n#include \"SDL_video.h\"\n#include \"SDL_sysvideo.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_pixels_c.h\"\n#include \"SDL_rect_c.h\"\n#include \"../events/SDL_events_c.h\"\n#include \"../timer/SDL_timer_c.h\"\n\n#include \"SDL_syswm.h\"\n\n#if SDL_VIDEO_OPENGL\n#include \"SDL_opengl.h\"\n#endif /* SDL_VIDEO_OPENGL */\n\n#if SDL_VIDEO_OPENGL_ES\n#include \"SDL_opengles.h\"\n#endif /* SDL_VIDEO_OPENGL_ES */\n\n/* GL and GLES2 headers conflict on Linux 32 bits */\n#if SDL_VIDEO_OPENGL_ES2 && !SDL_VIDEO_OPENGL\n#include \"SDL_opengles2.h\"\n#endif /* SDL_VIDEO_OPENGL_ES2 && !SDL_VIDEO_OPENGL */\n\n#ifndef GL_CONTEXT_RELEASE_BEHAVIOR_KHR\n#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB\n#endif\n\n/* On Windows, windows.h defines CreateWindow */\n#ifdef CreateWindow\n#undef CreateWindow\n#endif\n\n#ifdef __EMSCRIPTEN__\n#include <emscripten.h>\n#endif\n\n/* Available video drivers */\nstatic VideoBootStrap *bootstrap[] = {\n#if SDL_VIDEO_DRIVER_COCOA\n    &COCOA_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_X11\n    &X11_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_MIR\n    &MIR_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_WAYLAND\n    &Wayland_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_VIVANTE\n    &VIVANTE_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_DIRECTFB\n    &DirectFB_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_WINDOWS\n    &WINDOWS_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_WINRT\n    &WINRT_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_HAIKU\n    &HAIKU_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_PANDORA\n    &PND_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_UIKIT\n    &UIKIT_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_ANDROID\n    &Android_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_PSP\n    &PSP_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_RPI\n    &RPI_bootstrap,\n#endif \n#if SDL_VIDEO_DRIVER_NACL\n    &NACL_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_EMSCRIPTEN\n    &Emscripten_bootstrap,\n#endif\n#if SDL_VIDEO_DRIVER_DUMMY\n    &DUMMY_bootstrap,\n#endif\n    NULL\n};\n\nstatic SDL_VideoDevice *_this = NULL;\n\n#define CHECK_WINDOW_MAGIC(window, retval) \\\n    if (!_this) { \\\n        SDL_UninitializedVideo(); \\\n        return retval; \\\n    } \\\n    if (!window || window->magic != &_this->window_magic) { \\\n        SDL_SetError(\"Invalid window\"); \\\n        return retval; \\\n    }\n\n#define CHECK_DISPLAY_INDEX(displayIndex, retval) \\\n    if (!_this) { \\\n        SDL_UninitializedVideo(); \\\n        return retval; \\\n    } \\\n    SDL_assert(_this->displays != NULL); \\\n    if (displayIndex < 0 || displayIndex >= _this->num_displays) { \\\n        SDL_SetError(\"displayIndex must be in the range 0 - %d\", \\\n                     _this->num_displays - 1); \\\n        return retval; \\\n    }\n\n#define FULLSCREEN_MASK (SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN)\n\n#ifdef __MACOSX__\n/* Support for Mac OS X fullscreen spaces */\nextern SDL_bool Cocoa_IsWindowInFullscreenSpace(SDL_Window * window);\nextern SDL_bool Cocoa_SetWindowFullscreenSpace(SDL_Window * window, SDL_bool state);\n#endif\n\n\n/* Support for framebuffer emulation using an accelerated renderer */\n\n#define SDL_WINDOWTEXTUREDATA   \"_SDL_WindowTextureData\"\n\ntypedef struct {\n    SDL_Renderer *renderer;\n    SDL_Texture *texture;\n    void *pixels;\n    int pitch;\n    int bytes_per_pixel;\n} SDL_WindowTextureData;\n\nstatic SDL_bool\nShouldUseTextureFramebuffer()\n{\n    const char *hint;\n\n    /* If there's no native framebuffer support then there's no option */\n    if (!_this->CreateWindowFramebuffer) {\n        return SDL_TRUE;\n    }\n\n    /* If the user has specified a software renderer we can't use a\n       texture framebuffer, or renderer creation will go recursive.\n     */\n    hint = SDL_GetHint(SDL_HINT_RENDER_DRIVER);\n    if (hint && SDL_strcasecmp(hint, \"software\") == 0) {\n        return SDL_FALSE;\n    }\n\n    /* See if the user or application wants a specific behavior */\n    hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION);\n    if (hint) {\n        if (*hint == '0' || SDL_strcasecmp(hint, \"false\") == 0) {\n            return SDL_FALSE;\n        } else {\n            return SDL_TRUE;\n        }\n    }\n\n    /* Each platform has different performance characteristics */\n#if defined(__WIN32__)\n    /* GDI BitBlt() is way faster than Direct3D dynamic textures right now.\n     */\n    return SDL_FALSE;\n\n#elif defined(__MACOSX__)\n    /* Mac OS X uses OpenGL as the native fast path */\n    return SDL_TRUE;\n\n#elif defined(__LINUX__)\n    /* Properly configured OpenGL drivers are faster than MIT-SHM */\n#if SDL_VIDEO_OPENGL\n    /* Ugh, find a way to cache this value! */\n    {\n        SDL_Window *window;\n        SDL_GLContext context;\n        SDL_bool hasAcceleratedOpenGL = SDL_FALSE;\n\n        window = SDL_CreateWindow(\"OpenGL test\", -32, -32, 32, 32, SDL_WINDOW_OPENGL|SDL_WINDOW_HIDDEN);\n        if (window) {\n            context = SDL_GL_CreateContext(window);\n            if (context) {\n                const GLubyte *(APIENTRY * glGetStringFunc) (GLenum);\n                const char *vendor = NULL;\n\n                glGetStringFunc = SDL_GL_GetProcAddress(\"glGetString\");\n                if (glGetStringFunc) {\n                    vendor = (const char *) glGetStringFunc(GL_VENDOR);\n                }\n                /* Add more vendors here at will... */\n                if (vendor &&\n                    (SDL_strstr(vendor, \"ATI Technologies\") ||\n                     SDL_strstr(vendor, \"NVIDIA\"))) {\n                    hasAcceleratedOpenGL = SDL_TRUE;\n                }\n                SDL_GL_DeleteContext(context);\n            }\n            SDL_DestroyWindow(window);\n        }\n        return hasAcceleratedOpenGL;\n    }\n#elif SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2\n    /* Let's be optimistic about this! */\n    return SDL_TRUE;\n#else\n    return SDL_FALSE;\n#endif\n\n#else\n    /* Play it safe, assume that if there is a framebuffer driver that it's\n       optimized for the current platform.\n    */\n    return SDL_FALSE;\n#endif\n}\n\nstatic int\nSDL_CreateWindowTexture(SDL_VideoDevice *unused, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch)\n{\n    SDL_WindowTextureData *data;\n\n    data = SDL_GetWindowData(window, SDL_WINDOWTEXTUREDATA);\n    if (!data) {\n        SDL_Renderer *renderer = NULL;\n        int i;\n        const char *hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION);\n\n        /* Check to see if there's a specific driver requested */\n        if (hint && *hint != '0' && *hint != '1' &&\n            SDL_strcasecmp(hint, \"true\") != 0 &&\n            SDL_strcasecmp(hint, \"false\") != 0 &&\n            SDL_strcasecmp(hint, \"software\") != 0) {\n            for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) {\n                SDL_RendererInfo info;\n                SDL_GetRenderDriverInfo(i, &info);\n                if (SDL_strcasecmp(info.name, hint) == 0) {\n                    renderer = SDL_CreateRenderer(window, i, 0);\n                    break;\n                }\n            }\n        }\n        \n        if (!renderer) {\n            for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) {\n                SDL_RendererInfo info;\n                SDL_GetRenderDriverInfo(i, &info);\n                if (SDL_strcmp(info.name, \"software\") != 0) {\n                    renderer = SDL_CreateRenderer(window, i, 0);\n                    if (renderer) {\n                        break;\n                    }\n                }\n            }\n        }\n        if (!renderer) {\n            return SDL_SetError(\"No hardware accelerated renderers available\");\n        }\n\n        /* Create the data after we successfully create the renderer (bug #1116) */\n        data = (SDL_WindowTextureData *)SDL_calloc(1, sizeof(*data));\n        if (!data) {\n            SDL_DestroyRenderer(renderer);\n            return SDL_OutOfMemory();\n        }\n        SDL_SetWindowData(window, SDL_WINDOWTEXTUREDATA, data);\n\n        data->renderer = renderer;\n    }\n\n    /* Free any old texture and pixel data */\n    if (data->texture) {\n        SDL_DestroyTexture(data->texture);\n        data->texture = NULL;\n    }\n    SDL_free(data->pixels);\n    data->pixels = NULL;\n\n    {\n        SDL_RendererInfo info;\n        Uint32 i;\n\n        if (SDL_GetRendererInfo(data->renderer, &info) < 0) {\n            return -1;\n        }\n\n        /* Find the first format without an alpha channel */\n        *format = info.texture_formats[0];\n\n        for (i = 0; i < info.num_texture_formats; ++i) {\n            if (!SDL_ISPIXELFORMAT_FOURCC(info.texture_formats[i]) &&\n                    !SDL_ISPIXELFORMAT_ALPHA(info.texture_formats[i])) {\n                *format = info.texture_formats[i];\n                break;\n            }\n        }\n    }\n\n    data->texture = SDL_CreateTexture(data->renderer, *format,\n                                      SDL_TEXTUREACCESS_STREAMING,\n                                      window->w, window->h);\n    if (!data->texture) {\n        return -1;\n    }\n\n    /* Create framebuffer data */\n    data->bytes_per_pixel = SDL_BYTESPERPIXEL(*format);\n    data->pitch = (((window->w * data->bytes_per_pixel) + 3) & ~3);\n    data->pixels = SDL_malloc(window->h * data->pitch);\n    if (!data->pixels) {\n        return SDL_OutOfMemory();\n    }\n\n    *pixels = data->pixels;\n    *pitch = data->pitch;\n\n    /* Make sure we're not double-scaling the viewport */\n    SDL_RenderSetViewport(data->renderer, NULL);\n\n    return 0;\n}\n\nstatic int\nSDL_UpdateWindowTexture(SDL_VideoDevice *unused, SDL_Window * window, const SDL_Rect * rects, int numrects)\n{\n    SDL_WindowTextureData *data;\n    SDL_Rect rect;\n    void *src;\n\n    data = SDL_GetWindowData(window, SDL_WINDOWTEXTUREDATA);\n    if (!data || !data->texture) {\n        return SDL_SetError(\"No window texture data\");\n    }\n\n    /* Update a single rect that contains subrects for best DMA performance */\n    if (SDL_GetSpanEnclosingRect(window->w, window->h, numrects, rects, &rect)) {\n        src = (void *)((Uint8 *)data->pixels +\n                        rect.y * data->pitch +\n                        rect.x * data->bytes_per_pixel);\n        if (SDL_UpdateTexture(data->texture, &rect, src, data->pitch) < 0) {\n            return -1;\n        }\n\n        if (SDL_RenderCopy(data->renderer, data->texture, NULL, NULL) < 0) {\n            return -1;\n        }\n\n        SDL_RenderPresent(data->renderer);\n    }\n    return 0;\n}\n\nstatic void\nSDL_DestroyWindowTexture(SDL_VideoDevice *unused, SDL_Window * window)\n{\n    SDL_WindowTextureData *data;\n\n    data = SDL_SetWindowData(window, SDL_WINDOWTEXTUREDATA, NULL);\n    if (!data) {\n        return;\n    }\n    if (data->texture) {\n        SDL_DestroyTexture(data->texture);\n    }\n    if (data->renderer) {\n        SDL_DestroyRenderer(data->renderer);\n    }\n    SDL_free(data->pixels);\n    SDL_free(data);\n}\n\n\nstatic int\ncmpmodes(const void *A, const void *B)\n{\n    const SDL_DisplayMode *a = (const SDL_DisplayMode *) A;\n    const SDL_DisplayMode *b = (const SDL_DisplayMode *) B;\n    if (a == b) {\n        return 0;\n    } else if (a->w != b->w) {\n        return b->w - a->w;\n    } else if (a->h != b->h) {\n        return b->h - a->h;\n    } else if (SDL_BITSPERPIXEL(a->format) != SDL_BITSPERPIXEL(b->format)) {\n        return SDL_BITSPERPIXEL(b->format) - SDL_BITSPERPIXEL(a->format);\n    } else if (SDL_PIXELLAYOUT(a->format) != SDL_PIXELLAYOUT(b->format)) {\n        return SDL_PIXELLAYOUT(b->format) - SDL_PIXELLAYOUT(a->format);\n    } else if (a->refresh_rate != b->refresh_rate) {\n        return b->refresh_rate - a->refresh_rate;\n    }\n    return 0;\n}\n\nstatic int\nSDL_UninitializedVideo()\n{\n    return SDL_SetError(\"Video subsystem has not been initialized\");\n}\n\nint\nSDL_GetNumVideoDrivers(void)\n{\n    return SDL_arraysize(bootstrap) - 1;\n}\n\nconst char *\nSDL_GetVideoDriver(int index)\n{\n    if (index >= 0 && index < SDL_GetNumVideoDrivers()) {\n        return bootstrap[index]->name;\n    }\n    return NULL;\n}\n\n/*\n * Initialize the video and event subsystems -- determine native pixel format\n */\nint\nSDL_VideoInit(const char *driver_name)\n{\n    SDL_VideoDevice *video;\n    int index;\n    int i;\n\n    /* Check to make sure we don't overwrite '_this' */\n    if (_this != NULL) {\n        SDL_VideoQuit();\n    }\n\n#if !SDL_TIMERS_DISABLED\n    SDL_TicksInit();\n#endif\n\n    /* Start the event loop */\n    if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0 ||\n        SDL_KeyboardInit() < 0 ||\n        SDL_MouseInit() < 0 ||\n        SDL_TouchInit() < 0) {\n        return -1;\n    }\n\n    /* Select the proper video driver */\n    index = 0;\n    video = NULL;\n    if (driver_name == NULL) {\n        driver_name = SDL_getenv(\"SDL_VIDEODRIVER\");\n    }\n    if (driver_name != NULL) {\n        for (i = 0; bootstrap[i]; ++i) {\n            if (SDL_strncasecmp(bootstrap[i]->name, driver_name, SDL_strlen(driver_name)) == 0) {\n                if (bootstrap[i]->available()) {\n                    video = bootstrap[i]->create(index);\n                    break;\n                }\n            }\n        }\n    } else {\n        for (i = 0; bootstrap[i]; ++i) {\n            if (bootstrap[i]->available()) {\n                video = bootstrap[i]->create(index);\n                if (video != NULL) {\n                    break;\n                }\n            }\n        }\n    }\n    if (video == NULL) {\n        if (driver_name) {\n            return SDL_SetError(\"%s not available\", driver_name);\n        }\n        return SDL_SetError(\"No available video device\");\n    }\n    _this = video;\n    _this->name = bootstrap[i]->name;\n    _this->next_object_id = 1;\n\n\n    /* Set some very sane GL defaults */\n    _this->gl_config.driver_loaded = 0;\n    _this->gl_config.dll_handle = NULL;\n    SDL_GL_ResetAttributes();\n\n    _this->current_glwin_tls = SDL_TLSCreate();\n    _this->current_glctx_tls = SDL_TLSCreate();\n\n    /* Initialize the video subsystem */\n    if (_this->VideoInit(_this) < 0) {\n        SDL_VideoQuit();\n        return -1;\n    }\n\n    /* Make sure some displays were added */\n    if (_this->num_displays == 0) {\n        SDL_VideoQuit();\n        return SDL_SetError(\"The video driver did not add any displays\");\n    }\n\n    /* Add the renderer framebuffer emulation if desired */\n    if (ShouldUseTextureFramebuffer()) {\n        _this->CreateWindowFramebuffer = SDL_CreateWindowTexture;\n        _this->UpdateWindowFramebuffer = SDL_UpdateWindowTexture;\n        _this->DestroyWindowFramebuffer = SDL_DestroyWindowTexture;\n    }\n\n    /* Disable the screen saver by default. This is a change from <= 2.0.1,\n       but most things using SDL are games or media players; you wouldn't\n       want a screensaver to trigger if you're playing exclusively with a\n       joystick, or passively watching a movie. Things that use SDL but\n       function more like a normal desktop app should explicitly reenable the\n       screensaver. */\n    if (!SDL_GetHintBoolean(SDL_HINT_VIDEO_ALLOW_SCREENSAVER, SDL_FALSE)) {\n        SDL_DisableScreenSaver();\n    }\n\n    /* If we don't use a screen keyboard, turn on text input by default,\n       otherwise programs that expect to get text events without enabling\n       UNICODE input won't get any events.\n\n       Actually, come to think of it, you needed to call SDL_EnableUNICODE(1)\n       in SDL 1.2 before you got text input events.  Hmm...\n     */\n    if (!SDL_HasScreenKeyboardSupport()) {\n        SDL_StartTextInput();\n    }\n\n    /* We're ready to go! */\n    return 0;\n}\n\nconst char *\nSDL_GetCurrentVideoDriver()\n{\n    if (!_this) {\n        SDL_UninitializedVideo();\n        return NULL;\n    }\n    return _this->name;\n}\n\nSDL_VideoDevice *\nSDL_GetVideoDevice(void)\n{\n    return _this;\n}\n\nint\nSDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode)\n{\n    SDL_VideoDisplay display;\n\n    SDL_zero(display);\n    if (desktop_mode) {\n        display.desktop_mode = *desktop_mode;\n    }\n    display.current_mode = display.desktop_mode;\n\n    return SDL_AddVideoDisplay(&display);\n}\n\nint\nSDL_AddVideoDisplay(const SDL_VideoDisplay * display)\n{\n    SDL_VideoDisplay *displays;\n    int index = -1;\n\n    displays =\n        SDL_realloc(_this->displays,\n                    (_this->num_displays + 1) * sizeof(*displays));\n    if (displays) {\n        index = _this->num_displays++;\n        displays[index] = *display;\n        displays[index].device = _this;\n        _this->displays = displays;\n\n        if (display->name) {\n            displays[index].name = SDL_strdup(display->name);\n        } else {\n            char name[32];\n\n            SDL_itoa(index, name, 10);\n            displays[index].name = SDL_strdup(name);\n        }\n    } else {\n        SDL_OutOfMemory();\n    }\n    return index;\n}\n\nint\nSDL_GetNumVideoDisplays(void)\n{\n    if (!_this) {\n        SDL_UninitializedVideo();\n        return 0;\n    }\n    return _this->num_displays;\n}\n\nstatic int\nSDL_GetIndexOfDisplay(SDL_VideoDisplay *display)\n{\n    int displayIndex;\n\n    for (displayIndex = 0; displayIndex < _this->num_displays; ++displayIndex) {\n        if (display == &_this->displays[displayIndex]) {\n            return displayIndex;\n        }\n    }\n\n    /* Couldn't find the display, just use index 0 */\n    return 0;\n}\n\nvoid *\nSDL_GetDisplayDriverData(int displayIndex)\n{\n    CHECK_DISPLAY_INDEX(displayIndex, NULL);\n\n    return _this->displays[displayIndex].driverdata;\n}\n\nconst char *\nSDL_GetDisplayName(int displayIndex)\n{\n    CHECK_DISPLAY_INDEX(displayIndex, NULL);\n\n    return _this->displays[displayIndex].name;\n}\n\nint\nSDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect)\n{\n    CHECK_DISPLAY_INDEX(displayIndex, -1);\n\n    if (rect) {\n        SDL_VideoDisplay *display = &_this->displays[displayIndex];\n\n        if (_this->GetDisplayBounds) {\n            if (_this->GetDisplayBounds(_this, display, rect) == 0) {\n                return 0;\n            }\n        }\n\n        /* Assume that the displays are left to right */\n        if (displayIndex == 0) {\n            rect->x = 0;\n            rect->y = 0;\n        } else {\n            SDL_GetDisplayBounds(displayIndex-1, rect);\n            rect->x += rect->w;\n        }\n        rect->w = display->current_mode.w;\n        rect->h = display->current_mode.h;\n    }\n    return 0;  /* !!! FIXME: should this be an error if (rect==NULL) ? */\n}\n\nint SDL_GetDisplayUsableBounds(int displayIndex, SDL_Rect * rect)\n{\n    CHECK_DISPLAY_INDEX(displayIndex, -1);\n\n    if (rect) {\n        SDL_VideoDisplay *display = &_this->displays[displayIndex];\n\n        if (_this->GetDisplayUsableBounds) {\n            if (_this->GetDisplayUsableBounds(_this, display, rect) == 0) {\n                return 0;\n            }\n        }\n\n        /* Oh well, just give the entire display bounds. */\n        return SDL_GetDisplayBounds(displayIndex, rect);\n    }\n    return 0;  /* !!! FIXME: should this be an error if (rect==NULL) ? */\n}\n\nint\nSDL_GetDisplayDPI(int displayIndex, float * ddpi, float * hdpi, float * vdpi)\n{\n\tSDL_VideoDisplay *display;\n\n    CHECK_DISPLAY_INDEX(displayIndex, -1);\n\n    display = &_this->displays[displayIndex];\n\n\tif (_this->GetDisplayDPI) {\n\t\tif (_this->GetDisplayDPI(_this, display, ddpi, hdpi, vdpi) == 0) {\n\t\t\treturn 0;\n\t\t}\n    } else {\n        return SDL_Unsupported();\n    }\n\n\treturn -1;\n}\n\nSDL_bool\nSDL_AddDisplayMode(SDL_VideoDisplay * display,  const SDL_DisplayMode * mode)\n{\n    SDL_DisplayMode *modes;\n    int i, nmodes;\n\n    /* Make sure we don't already have the mode in the list */\n    modes = display->display_modes;\n    nmodes = display->num_display_modes;\n    for (i = 0; i < nmodes; ++i) {\n        if (cmpmodes(mode, &modes[i]) == 0) {\n            return SDL_FALSE;\n        }\n    }\n\n    /* Go ahead and add the new mode */\n    if (nmodes == display->max_display_modes) {\n        modes =\n            SDL_realloc(modes,\n                        (display->max_display_modes + 32) * sizeof(*modes));\n        if (!modes) {\n            return SDL_FALSE;\n        }\n        display->display_modes = modes;\n        display->max_display_modes += 32;\n    }\n    modes[nmodes] = *mode;\n    display->num_display_modes++;\n\n    /* Re-sort video modes */\n    SDL_qsort(display->display_modes, display->num_display_modes,\n              sizeof(SDL_DisplayMode), cmpmodes);\n\n    return SDL_TRUE;\n}\n\nstatic int\nSDL_GetNumDisplayModesForDisplay(SDL_VideoDisplay * display)\n{\n    if (!display->num_display_modes && _this->GetDisplayModes) {\n        _this->GetDisplayModes(_this, display);\n        SDL_qsort(display->display_modes, display->num_display_modes,\n                  sizeof(SDL_DisplayMode), cmpmodes);\n    }\n    return display->num_display_modes;\n}\n\nint\nSDL_GetNumDisplayModes(int displayIndex)\n{\n    CHECK_DISPLAY_INDEX(displayIndex, -1);\n\n    return SDL_GetNumDisplayModesForDisplay(&_this->displays[displayIndex]);\n}\n\nint\nSDL_GetDisplayMode(int displayIndex, int index, SDL_DisplayMode * mode)\n{\n    SDL_VideoDisplay *display;\n\n    CHECK_DISPLAY_INDEX(displayIndex, -1);\n\n    display = &_this->displays[displayIndex];\n    if (index < 0 || index >= SDL_GetNumDisplayModesForDisplay(display)) {\n        return SDL_SetError(\"index must be in the range of 0 - %d\",\n                            SDL_GetNumDisplayModesForDisplay(display) - 1);\n    }\n    if (mode) {\n        *mode = display->display_modes[index];\n    }\n    return 0;\n}\n\nint\nSDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode * mode)\n{\n    SDL_VideoDisplay *display;\n\n    CHECK_DISPLAY_INDEX(displayIndex, -1);\n\n    display = &_this->displays[displayIndex];\n    if (mode) {\n        *mode = display->desktop_mode;\n    }\n    return 0;\n}\n\nint\nSDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode * mode)\n{\n    SDL_VideoDisplay *display;\n\n    CHECK_DISPLAY_INDEX(displayIndex, -1);\n\n    display = &_this->displays[displayIndex];\n    if (mode) {\n        *mode = display->current_mode;\n    }\n    return 0;\n}\n\nstatic SDL_DisplayMode *\nSDL_GetClosestDisplayModeForDisplay(SDL_VideoDisplay * display,\n                                    const SDL_DisplayMode * mode,\n                                    SDL_DisplayMode * closest)\n{\n    Uint32 target_format;\n    int target_refresh_rate;\n    int i;\n    SDL_DisplayMode *current, *match;\n\n    if (!mode || !closest) {\n        SDL_SetError(\"Missing desired mode or closest mode parameter\");\n        return NULL;\n    }\n\n    /* Default to the desktop format */\n    if (mode->format) {\n        target_format = mode->format;\n    } else {\n        target_format = display->desktop_mode.format;\n    }\n\n    /* Default to the desktop refresh rate */\n    if (mode->refresh_rate) {\n        target_refresh_rate = mode->refresh_rate;\n    } else {\n        target_refresh_rate = display->desktop_mode.refresh_rate;\n    }\n\n    match = NULL;\n    for (i = 0; i < SDL_GetNumDisplayModesForDisplay(display); ++i) {\n        current = &display->display_modes[i];\n\n        if (current->w && (current->w < mode->w)) {\n            /* Out of sorted modes large enough here */\n            break;\n        }\n        if (current->h && (current->h < mode->h)) {\n            if (current->w && (current->w == mode->w)) {\n                /* Out of sorted modes large enough here */\n                break;\n            }\n            /* Wider, but not tall enough, due to a different\n               aspect ratio. This mode must be skipped, but closer\n               modes may still follow. */\n            continue;\n        }\n        if (!match || current->w < match->w || current->h < match->h) {\n            match = current;\n            continue;\n        }\n        if (current->format != match->format) {\n            /* Sorted highest depth to lowest */\n            if (current->format == target_format ||\n                (SDL_BITSPERPIXEL(current->format) >=\n                 SDL_BITSPERPIXEL(target_format)\n                 && SDL_PIXELTYPE(current->format) ==\n                 SDL_PIXELTYPE(target_format))) {\n                match = current;\n            }\n            continue;\n        }\n        if (current->refresh_rate != match->refresh_rate) {\n            /* Sorted highest refresh to lowest */\n            if (current->refresh_rate >= target_refresh_rate) {\n                match = current;\n            }\n        }\n    }\n    if (match) {\n        if (match->format) {\n            closest->format = match->format;\n        } else {\n            closest->format = mode->format;\n        }\n        if (match->w && match->h) {\n            closest->w = match->w;\n            closest->h = match->h;\n        } else {\n            closest->w = mode->w;\n            closest->h = mode->h;\n        }\n        if (match->refresh_rate) {\n            closest->refresh_rate = match->refresh_rate;\n        } else {\n            closest->refresh_rate = mode->refresh_rate;\n        }\n        closest->driverdata = match->driverdata;\n\n        /*\n         * Pick some reasonable defaults if the app and driver don't\n         * care\n         */\n        if (!closest->format) {\n            closest->format = SDL_PIXELFORMAT_RGB888;\n        }\n        if (!closest->w) {\n            closest->w = 640;\n        }\n        if (!closest->h) {\n            closest->h = 480;\n        }\n        return closest;\n    }\n    return NULL;\n}\n\nSDL_DisplayMode *\nSDL_GetClosestDisplayMode(int displayIndex,\n                          const SDL_DisplayMode * mode,\n                          SDL_DisplayMode * closest)\n{\n    SDL_VideoDisplay *display;\n\n    CHECK_DISPLAY_INDEX(displayIndex, NULL);\n\n    display = &_this->displays[displayIndex];\n    return SDL_GetClosestDisplayModeForDisplay(display, mode, closest);\n}\n\nstatic int\nSDL_SetDisplayModeForDisplay(SDL_VideoDisplay * display, const SDL_DisplayMode * mode)\n{\n    SDL_DisplayMode display_mode;\n    SDL_DisplayMode current_mode;\n\n    if (mode) {\n        display_mode = *mode;\n\n        /* Default to the current mode */\n        if (!display_mode.format) {\n            display_mode.format = display->current_mode.format;\n        }\n        if (!display_mode.w) {\n            display_mode.w = display->current_mode.w;\n        }\n        if (!display_mode.h) {\n            display_mode.h = display->current_mode.h;\n        }\n        if (!display_mode.refresh_rate) {\n            display_mode.refresh_rate = display->current_mode.refresh_rate;\n        }\n\n        /* Get a good video mode, the closest one possible */\n        if (!SDL_GetClosestDisplayModeForDisplay(display, &display_mode, &display_mode)) {\n            return SDL_SetError(\"No video mode large enough for %dx%d\",\n                                display_mode.w, display_mode.h);\n        }\n    } else {\n        display_mode = display->desktop_mode;\n    }\n\n    /* See if there's anything left to do */\n    current_mode = display->current_mode;\n    if (SDL_memcmp(&display_mode, &current_mode, sizeof(display_mode)) == 0) {\n        return 0;\n    }\n\n    /* Actually change the display mode */\n    if (!_this->SetDisplayMode) {\n        return SDL_SetError(\"Video driver doesn't support changing display mode\");\n    }\n    if (_this->SetDisplayMode(_this, display, &display_mode) < 0) {\n        return -1;\n    }\n    display->current_mode = display_mode;\n    return 0;\n}\n\nint\nSDL_GetWindowDisplayIndex(SDL_Window * window)\n{\n    int displayIndex;\n    int i, dist;\n    int closest = -1;\n    int closest_dist = 0x7FFFFFFF;\n    SDL_Point center;\n    SDL_Point delta;\n    SDL_Rect rect;\n\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (SDL_WINDOWPOS_ISUNDEFINED(window->x) ||\n        SDL_WINDOWPOS_ISCENTERED(window->x)) {\n        displayIndex = (window->x & 0xFFFF);\n        if (displayIndex >= _this->num_displays) {\n            displayIndex = 0;\n        }\n        return displayIndex;\n    }\n    if (SDL_WINDOWPOS_ISUNDEFINED(window->y) ||\n        SDL_WINDOWPOS_ISCENTERED(window->y)) {\n        displayIndex = (window->y & 0xFFFF);\n        if (displayIndex >= _this->num_displays) {\n            displayIndex = 0;\n        }\n        return displayIndex;\n    }\n\n    /* Find the display containing the window */\n    for (i = 0; i < _this->num_displays; ++i) {\n        SDL_VideoDisplay *display = &_this->displays[i];\n\n        if (display->fullscreen_window == window) {\n            return i;\n        }\n    }\n    center.x = window->x + window->w / 2;\n    center.y = window->y + window->h / 2;\n    for (i = 0; i < _this->num_displays; ++i) {\n        SDL_GetDisplayBounds(i, &rect);\n        if (SDL_EnclosePoints(&center, 1, &rect, NULL)) {\n            return i;\n        }\n\n        delta.x = center.x - (rect.x + rect.w / 2);\n        delta.y = center.y - (rect.y + rect.h / 2);\n        dist = (delta.x*delta.x + delta.y*delta.y);\n        if (dist < closest_dist) {\n            closest = i;\n            closest_dist = dist;\n        }\n    }\n    if (closest < 0) {\n        SDL_SetError(\"Couldn't find any displays\");\n    }\n    return closest;\n}\n\nSDL_VideoDisplay *\nSDL_GetDisplayForWindow(SDL_Window *window)\n{\n    int displayIndex = SDL_GetWindowDisplayIndex(window);\n    if (displayIndex >= 0) {\n        return &_this->displays[displayIndex];\n    } else {\n        return NULL;\n    }\n}\n\nint\nSDL_SetWindowDisplayMode(SDL_Window * window, const SDL_DisplayMode * mode)\n{\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (mode) {\n        window->fullscreen_mode = *mode;\n    } else {\n        SDL_zero(window->fullscreen_mode);\n    }\n\n    if (FULLSCREEN_VISIBLE(window) && (window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP) {\n        SDL_DisplayMode fullscreen_mode;\n        if (SDL_GetWindowDisplayMode(window, &fullscreen_mode) == 0) {\n            SDL_SetDisplayModeForDisplay(SDL_GetDisplayForWindow(window), &fullscreen_mode);\n        }\n    }\n    return 0;\n}\n\nint\nSDL_GetWindowDisplayMode(SDL_Window * window, SDL_DisplayMode * mode)\n{\n    SDL_DisplayMode fullscreen_mode;\n    SDL_VideoDisplay *display;\n\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (!mode) {\n        return SDL_InvalidParamError(\"mode\");\n    }\n\n    fullscreen_mode = window->fullscreen_mode;\n    if (!fullscreen_mode.w) {\n        fullscreen_mode.w = window->windowed.w;\n    }\n    if (!fullscreen_mode.h) {\n        fullscreen_mode.h = window->windowed.h;\n    }\n\n    display = SDL_GetDisplayForWindow(window);\n\n    /* if in desktop size mode, just return the size of the desktop */\n    if ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) {\n        fullscreen_mode = display->desktop_mode;\n    } else if (!SDL_GetClosestDisplayModeForDisplay(SDL_GetDisplayForWindow(window),\n                                             &fullscreen_mode,\n                                             &fullscreen_mode)) {\n        return SDL_SetError(\"Couldn't find display mode match\");\n    }\n\n    if (mode) {\n        *mode = fullscreen_mode;\n    }\n    return 0;\n}\n\nUint32\nSDL_GetWindowPixelFormat(SDL_Window * window)\n{\n    SDL_VideoDisplay *display;\n\n    CHECK_WINDOW_MAGIC(window, SDL_PIXELFORMAT_UNKNOWN);\n\n    display = SDL_GetDisplayForWindow(window);\n    return display->current_mode.format;\n}\n\nstatic void\nSDL_RestoreMousePosition(SDL_Window *window)\n{\n    int x, y;\n\n    if (window == SDL_GetMouseFocus()) {\n        SDL_GetMouseState(&x, &y);\n        SDL_WarpMouseInWindow(window, x, y);\n    }\n}\n\n#if __WINRT__\nextern Uint32 WINRT_DetectWindowFlags(SDL_Window * window);\n#endif\n\nstatic int\nSDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool fullscreen)\n{\n    SDL_VideoDisplay *display;\n    SDL_Window *other;\n\n    CHECK_WINDOW_MAGIC(window,-1);\n\n    /* if we are in the process of hiding don't go back to fullscreen */\n    if ( window->is_hiding && fullscreen )\n        return 0;\n\n#ifdef __MACOSX__\n    /* if the window is going away and no resolution change is necessary,\n     do nothing, or else we may trigger an ugly double-transition\n     */\n    if (window->is_destroying && (window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)\n        return 0;\n    \n    /* If we're switching between a fullscreen Space and \"normal\" fullscreen, we need to get back to normal first. */\n    if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN)) {\n        if (!Cocoa_SetWindowFullscreenSpace(window, SDL_FALSE)) {\n            return -1;\n        }\n    } else if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)) {\n        display = SDL_GetDisplayForWindow(window);\n        SDL_SetDisplayModeForDisplay(display, NULL);\n        if (_this->SetWindowFullscreen) {\n            _this->SetWindowFullscreen(_this, window, display, SDL_FALSE);\n        }\n    }\n\n    if (Cocoa_SetWindowFullscreenSpace(window, fullscreen)) {\n        if (Cocoa_IsWindowInFullscreenSpace(window) != fullscreen) {\n            return -1;\n        }\n        window->last_fullscreen_flags = window->flags;\n        return 0;\n    }\n#elif __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10)\n    /* HACK: WinRT 8.x apps can't choose whether or not they are fullscreen\n       or not.  The user can choose this, via OS-provided UI, but this can't\n       be set programmatically.\n\n       Just look at what SDL's WinRT video backend code detected with regards\n       to fullscreen (being active, or not), and figure out a return/error code\n       from that.\n    */\n    if (fullscreen == !(WINRT_DetectWindowFlags(window) & FULLSCREEN_MASK)) {\n        /* Uh oh, either:\n            1. fullscreen was requested, and we're already windowed\n            2. windowed-mode was requested, and we're already fullscreen\n\n            WinRT 8.x can't resolve either programmatically, so we're\n            giving up.\n        */\n        return -1;\n    } else {\n        /* Whatever was requested, fullscreen or windowed mode, is already\n            in-place.\n        */\n        return 0;\n    }\n#endif\n\n    display = SDL_GetDisplayForWindow(window);\n\n    if (fullscreen) {\n        /* Hide any other fullscreen windows */\n        if (display->fullscreen_window &&\n            display->fullscreen_window != window) {\n            SDL_MinimizeWindow(display->fullscreen_window);\n        }\n    }\n\n    /* See if anything needs to be done now */\n    if ((display->fullscreen_window == window) == fullscreen) {\n        if ((window->last_fullscreen_flags & FULLSCREEN_MASK) == (window->flags & FULLSCREEN_MASK)) {\n            return 0;\n        }\n    }\n\n    /* See if there are any fullscreen windows */\n    for (other = _this->windows; other; other = other->next) {\n        SDL_bool setDisplayMode = SDL_FALSE;\n\n        if (other == window) {\n            setDisplayMode = fullscreen;\n        } else if (FULLSCREEN_VISIBLE(other) &&\n                   SDL_GetDisplayForWindow(other) == display) {\n            setDisplayMode = SDL_TRUE;\n        }\n\n        if (setDisplayMode) {\n            SDL_DisplayMode fullscreen_mode;\n\n            SDL_zero(fullscreen_mode);\n\n            if (SDL_GetWindowDisplayMode(other, &fullscreen_mode) == 0) {\n                SDL_bool resized = SDL_TRUE;\n\n                if (other->w == fullscreen_mode.w && other->h == fullscreen_mode.h) {\n                    resized = SDL_FALSE;\n                }\n\n                /* only do the mode change if we want exclusive fullscreen */\n                if ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP) {\n                    if (SDL_SetDisplayModeForDisplay(display, &fullscreen_mode) < 0) {\n                        return -1;\n                    }\n                } else {\n                    if (SDL_SetDisplayModeForDisplay(display, NULL) < 0) {\n                        return -1;\n                    }\n                }\n\n                if (_this->SetWindowFullscreen) {\n                    _this->SetWindowFullscreen(_this, other, display, SDL_TRUE);\n                }\n                display->fullscreen_window = other;\n\n                /* Generate a mode change event here */\n                if (resized) {\n                    SDL_SendWindowEvent(other, SDL_WINDOWEVENT_RESIZED,\n                                        fullscreen_mode.w, fullscreen_mode.h);\n                } else {\n                    SDL_OnWindowResized(other);\n                }\n\n                SDL_RestoreMousePosition(other);\n\n                window->last_fullscreen_flags = window->flags;\n                return 0;\n            }\n        }\n    }\n\n    /* Nope, restore the desktop mode */\n    SDL_SetDisplayModeForDisplay(display, NULL);\n\n    if (_this->SetWindowFullscreen) {\n        _this->SetWindowFullscreen(_this, window, display, SDL_FALSE);\n    }\n    display->fullscreen_window = NULL;\n\n    /* Generate a mode change event here */\n    SDL_OnWindowResized(window);\n\n    /* Restore the cursor position */\n    SDL_RestoreMousePosition(window);\n\n    window->last_fullscreen_flags = window->flags;\n    return 0;\n}\n\n#define CREATE_FLAGS \\\n    (SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR | SDL_WINDOW_POPUP_MENU | SDL_WINDOW_UTILITY | SDL_WINDOW_TOOLTIP)\n\nstatic void\nSDL_FinishWindowCreation(SDL_Window *window, Uint32 flags)\n{\n    if (flags & SDL_WINDOW_MAXIMIZED) {\n        SDL_MaximizeWindow(window);\n    }\n    if (flags & SDL_WINDOW_MINIMIZED) {\n        SDL_MinimizeWindow(window);\n    }\n    if (flags & SDL_WINDOW_FULLSCREEN) {\n        SDL_SetWindowFullscreen(window, flags);\n    }\n    if (flags & SDL_WINDOW_INPUT_GRABBED) {\n        SDL_SetWindowGrab(window, SDL_TRUE);\n    }\n    if (!(flags & SDL_WINDOW_HIDDEN)) {\n        SDL_ShowWindow(window);\n    }\n}\n\nSDL_Window *\nSDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)\n{\n    SDL_Window *window;\n\n    if (!_this) {\n        /* Initialize the video system if needed */\n        if (SDL_VideoInit(NULL) < 0) {\n            return NULL;\n        }\n    }\n\n    if ( (((flags & SDL_WINDOW_UTILITY) != 0) + ((flags & SDL_WINDOW_TOOLTIP) != 0) + ((flags & SDL_WINDOW_POPUP_MENU) != 0)) > 1 ) {\n        SDL_SetError(\"Conflicting window flags specified\");\n        return NULL;\n    }\n\n    /* Some platforms can't create zero-sized windows */\n    if (w < 1) {\n        w = 1;\n    }\n    if (h < 1) {\n        h = 1;\n    }\n\n    /* Some platforms blow up if the windows are too large. Raise it later? */\n    if ((w > 16384) || (h > 16384)) {\n        SDL_SetError(\"Window is too large.\");\n        return NULL;\n    }\n\n    /* Some platforms have OpenGL enabled by default */\n#if (SDL_VIDEO_OPENGL && __MACOSX__) || __IPHONEOS__ || __ANDROID__ || __NACL__\n    if (SDL_strcmp(_this->name, \"dummy\") != 0) {\n        flags |= SDL_WINDOW_OPENGL;\n    }\n#endif\n    if (flags & SDL_WINDOW_OPENGL) {\n        if (!_this->GL_CreateContext) {\n            SDL_SetError(\"No OpenGL support in video driver\");\n            return NULL;\n        }\n        if (SDL_GL_LoadLibrary(NULL) < 0) {\n            return NULL;\n        }\n    }\n\n    /* Unless the user has specified the high-DPI disabling hint, respect the\n     * SDL_WINDOW_ALLOW_HIGHDPI flag.\n     */\n    if (flags & SDL_WINDOW_ALLOW_HIGHDPI) {\n        if (SDL_GetHintBoolean(SDL_HINT_VIDEO_HIGHDPI_DISABLED, SDL_FALSE)) {\n            flags &= ~SDL_WINDOW_ALLOW_HIGHDPI;\n        }\n    }\n\n    window = (SDL_Window *)SDL_calloc(1, sizeof(*window));\n    if (!window) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n    window->magic = &_this->window_magic;\n    window->id = _this->next_object_id++;\n    window->x = x;\n    window->y = y;\n    window->w = w;\n    window->h = h;\n    if (SDL_WINDOWPOS_ISUNDEFINED(x) || SDL_WINDOWPOS_ISUNDEFINED(y) ||\n        SDL_WINDOWPOS_ISCENTERED(x) || SDL_WINDOWPOS_ISCENTERED(y)) {\n        SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);\n        int displayIndex;\n        SDL_Rect bounds;\n\n        displayIndex = SDL_GetIndexOfDisplay(display);\n        SDL_GetDisplayBounds(displayIndex, &bounds);\n        if (SDL_WINDOWPOS_ISUNDEFINED(x) || SDL_WINDOWPOS_ISCENTERED(x)) {\n            window->x = bounds.x + (bounds.w - w) / 2;\n        }\n        if (SDL_WINDOWPOS_ISUNDEFINED(y) || SDL_WINDOWPOS_ISCENTERED(y)) {\n            window->y = bounds.y + (bounds.h - h) / 2;\n        }\n    }\n    window->windowed.x = window->x;\n    window->windowed.y = window->y;\n    window->windowed.w = window->w;\n    window->windowed.h = window->h;\n\n    if (flags & SDL_WINDOW_FULLSCREEN) {\n        SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);\n        int displayIndex;\n        SDL_Rect bounds;\n\n        displayIndex = SDL_GetIndexOfDisplay(display);\n        SDL_GetDisplayBounds(displayIndex, &bounds);\n\n        window->x = bounds.x;\n        window->y = bounds.y;\n        window->w = bounds.w;\n        window->h = bounds.h;\n    }\n\n    window->flags = ((flags & CREATE_FLAGS) | SDL_WINDOW_HIDDEN);\n    window->last_fullscreen_flags = window->flags;\n    window->opacity = 1.0f;\n    window->brightness = 1.0f;\n    window->next = _this->windows;\n    window->is_destroying = SDL_FALSE;\n\n    if (_this->windows) {\n        _this->windows->prev = window;\n    }\n    _this->windows = window;\n\n    if (_this->CreateWindow && _this->CreateWindow(_this, window) < 0) {\n        SDL_DestroyWindow(window);\n        return NULL;\n    }\n\n#if __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10)\n    /* HACK: WinRT 8.x apps can't choose whether or not they are fullscreen\n       or not.  The user can choose this, via OS-provided UI, but this can't\n       be set programmatically.\n\n       Just look at what SDL's WinRT video backend code detected with regards\n       to fullscreen (being active, or not), and figure out a return/error code\n       from that.\n    */\n    flags = window->flags;\n#endif\n\n    if (title) {\n        SDL_SetWindowTitle(window, title);\n    }\n    SDL_FinishWindowCreation(window, flags);\n\n    /* If the window was created fullscreen, make sure the mode code matches */\n    SDL_UpdateFullscreenMode(window, FULLSCREEN_VISIBLE(window));\n\n    return window;\n}\n\nSDL_Window *\nSDL_CreateWindowFrom(const void *data)\n{\n    SDL_Window *window;\n\n    if (!_this) {\n        SDL_UninitializedVideo();\n        return NULL;\n    }\n    if (!_this->CreateWindowFrom) {\n        SDL_Unsupported();\n        return NULL;\n    }\n    window = (SDL_Window *)SDL_calloc(1, sizeof(*window));\n    if (!window) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n    window->magic = &_this->window_magic;\n    window->id = _this->next_object_id++;\n    window->flags = SDL_WINDOW_FOREIGN;\n    window->last_fullscreen_flags = window->flags;\n    window->is_destroying = SDL_FALSE;\n    window->opacity = 1.0f;\n    window->brightness = 1.0f;\n    window->next = _this->windows;\n    if (_this->windows) {\n        _this->windows->prev = window;\n    }\n    _this->windows = window;\n\n    if (_this->CreateWindowFrom(_this, window, data) < 0) {\n        SDL_DestroyWindow(window);\n        return NULL;\n    }\n    return window;\n}\n\nint\nSDL_RecreateWindow(SDL_Window * window, Uint32 flags)\n{\n    SDL_bool loaded_opengl = SDL_FALSE;\n\n    if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) {\n        return SDL_SetError(\"No OpenGL support in video driver\");\n    }\n\n    if (window->flags & SDL_WINDOW_FOREIGN) {\n        /* Can't destroy and re-create foreign windows, hrm */\n        flags |= SDL_WINDOW_FOREIGN;\n    } else {\n        flags &= ~SDL_WINDOW_FOREIGN;\n    }\n\n    /* Restore video mode, etc. */\n    SDL_HideWindow(window);\n\n    /* Tear down the old native window */\n    if (window->surface) {\n        window->surface->flags &= ~SDL_DONTFREE;\n        SDL_FreeSurface(window->surface);\n        window->surface = NULL;\n    }\n    if (_this->DestroyWindowFramebuffer) {\n        _this->DestroyWindowFramebuffer(_this, window);\n    }\n    if (_this->DestroyWindow && !(flags & SDL_WINDOW_FOREIGN)) {\n        _this->DestroyWindow(_this, window);\n    }\n\n    if ((window->flags & SDL_WINDOW_OPENGL) != (flags & SDL_WINDOW_OPENGL)) {\n        if (flags & SDL_WINDOW_OPENGL) {\n            if (SDL_GL_LoadLibrary(NULL) < 0) {\n                return -1;\n            }\n            loaded_opengl = SDL_TRUE;\n        } else {\n            SDL_GL_UnloadLibrary();\n        }\n    }\n\n    window->flags = ((flags & CREATE_FLAGS) | SDL_WINDOW_HIDDEN);\n    window->last_fullscreen_flags = window->flags;\n    window->is_destroying = SDL_FALSE;\n\n    if (_this->CreateWindow && !(flags & SDL_WINDOW_FOREIGN)) {\n        if (_this->CreateWindow(_this, window) < 0) {\n            if (loaded_opengl) {\n                SDL_GL_UnloadLibrary();\n                window->flags &= ~SDL_WINDOW_OPENGL;\n            }\n            return -1;\n        }\n    }\n\n    if (flags & SDL_WINDOW_FOREIGN) {\n        window->flags |= SDL_WINDOW_FOREIGN;\n    }\n\n    if (_this->SetWindowTitle && window->title) {\n        _this->SetWindowTitle(_this, window);\n    }\n\n    if (_this->SetWindowIcon && window->icon) {\n        _this->SetWindowIcon(_this, window, window->icon);\n    }\n\n    if (window->hit_test) {\n        _this->SetWindowHitTest(window, SDL_TRUE);\n    }\n\n    SDL_FinishWindowCreation(window, flags);\n\n    return 0;\n}\n\nUint32\nSDL_GetWindowID(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window, 0);\n\n    return window->id;\n}\n\nSDL_Window *\nSDL_GetWindowFromID(Uint32 id)\n{\n    SDL_Window *window;\n\n    if (!_this) {\n        return NULL;\n    }\n    for (window = _this->windows; window; window = window->next) {\n        if (window->id == id) {\n            return window;\n        }\n    }\n    return NULL;\n}\n\nUint32\nSDL_GetWindowFlags(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window, 0);\n\n    return window->flags;\n}\n\nvoid\nSDL_SetWindowTitle(SDL_Window * window, const char *title)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (title == window->title) {\n        return;\n    }\n    SDL_free(window->title);\n\n    window->title = SDL_strdup(title ? title : \"\");\n\n    if (_this->SetWindowTitle) {\n        _this->SetWindowTitle(_this, window);\n    }\n}\n\nconst char *\nSDL_GetWindowTitle(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window, \"\");\n\n    return window->title ? window->title : \"\";\n}\n\nvoid\nSDL_SetWindowIcon(SDL_Window * window, SDL_Surface * icon)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (!icon) {\n        return;\n    }\n\n    SDL_FreeSurface(window->icon);\n\n    /* Convert the icon into ARGB8888 */\n    window->icon = SDL_ConvertSurfaceFormat(icon, SDL_PIXELFORMAT_ARGB8888, 0);\n    if (!window->icon) {\n        return;\n    }\n\n    if (_this->SetWindowIcon) {\n        _this->SetWindowIcon(_this, window, window->icon);\n    }\n}\n\nvoid*\nSDL_SetWindowData(SDL_Window * window, const char *name, void *userdata)\n{\n    SDL_WindowUserData *prev, *data;\n\n    CHECK_WINDOW_MAGIC(window, NULL);\n\n    /* Input validation */\n    if (name == NULL || name[0] == '\\0') {\n      SDL_InvalidParamError(\"name\");\n      return NULL;\n    }\n\n    /* See if the named data already exists */\n    prev = NULL;\n    for (data = window->data; data; prev = data, data = data->next) {\n        if (data->name && SDL_strcmp(data->name, name) == 0) {\n            void *last_value = data->data;\n\n            if (userdata) {\n                /* Set the new value */\n                data->data = userdata;\n            } else {\n                /* Delete this value */\n                if (prev) {\n                    prev->next = data->next;\n                } else {\n                    window->data = data->next;\n                }\n                SDL_free(data->name);\n                SDL_free(data);\n            }\n            return last_value;\n        }\n    }\n\n    /* Add new data to the window */\n    if (userdata) {\n        data = (SDL_WindowUserData *)SDL_malloc(sizeof(*data));\n        data->name = SDL_strdup(name);\n        data->data = userdata;\n        data->next = window->data;\n        window->data = data;\n    }\n    return NULL;\n}\n\nvoid *\nSDL_GetWindowData(SDL_Window * window, const char *name)\n{\n    SDL_WindowUserData *data;\n\n    CHECK_WINDOW_MAGIC(window, NULL);\n\n    /* Input validation */\n    if (name == NULL || name[0] == '\\0') {\n      SDL_InvalidParamError(\"name\");\n      return NULL;\n    }\n\n    for (data = window->data; data; data = data->next) {\n        if (data->name && SDL_strcmp(data->name, name) == 0) {\n            return data->data;\n        }\n    }\n    return NULL;\n}\n\nvoid\nSDL_SetWindowPosition(SDL_Window * window, int x, int y)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (SDL_WINDOWPOS_ISCENTERED(x) || SDL_WINDOWPOS_ISCENTERED(y)) {\n        int displayIndex = (x & 0xFFFF);\n        SDL_Rect bounds;\n        if (displayIndex > _this->num_displays) {\n            displayIndex = 0;\n        }\n\n        SDL_zero(bounds);\n\n        SDL_GetDisplayBounds(displayIndex, &bounds);\n        if (SDL_WINDOWPOS_ISCENTERED(x)) {\n            x = bounds.x + (bounds.w - window->w) / 2;\n        }\n        if (SDL_WINDOWPOS_ISCENTERED(y)) {\n            y = bounds.y + (bounds.h - window->h) / 2;\n        }\n    }\n\n    if ((window->flags & SDL_WINDOW_FULLSCREEN)) {\n        if (!SDL_WINDOWPOS_ISUNDEFINED(x)) {\n            window->windowed.x = x;\n        }\n        if (!SDL_WINDOWPOS_ISUNDEFINED(y)) {\n            window->windowed.y = y;\n        }\n    } else {\n        if (!SDL_WINDOWPOS_ISUNDEFINED(x)) {\n            window->x = x;\n        }\n        if (!SDL_WINDOWPOS_ISUNDEFINED(y)) {\n            window->y = y;\n        }\n\n        if (_this->SetWindowPosition) {\n            _this->SetWindowPosition(_this, window);\n        }\n        SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MOVED, x, y);\n    }\n}\n\nvoid\nSDL_GetWindowPosition(SDL_Window * window, int *x, int *y)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    /* Fullscreen windows are always at their display's origin */\n    if (window->flags & SDL_WINDOW_FULLSCREEN) {\n        int displayIndex;\n        \n        if (x) {\n            *x = 0;\n        }\n        if (y) {\n            *y = 0;\n        }\n\n        /* Find the window's monitor and update to the\n           monitor offset. */\n        displayIndex = SDL_GetWindowDisplayIndex(window);\n        if (displayIndex >= 0) {\n            SDL_Rect bounds;\n\n            SDL_zero(bounds);\n\n            SDL_GetDisplayBounds(displayIndex, &bounds);\n            if (x) {\n                *x = bounds.x;\n            }\n            if (y) {\n                *y = bounds.y;\n            }\n        }\n    } else {\n        if (x) {\n            *x = window->x;\n        }\n        if (y) {\n            *y = window->y;\n        }\n    }\n}\n\nvoid\nSDL_SetWindowBordered(SDL_Window * window, SDL_bool bordered)\n{\n    CHECK_WINDOW_MAGIC(window,);\n    if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {\n        const int want = (bordered != SDL_FALSE);  /* normalize the flag. */\n        const int have = ((window->flags & SDL_WINDOW_BORDERLESS) == 0);\n        if ((want != have) && (_this->SetWindowBordered)) {\n            if (want) {\n                window->flags &= ~SDL_WINDOW_BORDERLESS;\n            } else {\n                window->flags |= SDL_WINDOW_BORDERLESS;\n            }\n            _this->SetWindowBordered(_this, window, (SDL_bool) want);\n        }\n    }\n}\n\nvoid\nSDL_SetWindowResizable(SDL_Window * window, SDL_bool resizable)\n{\n    CHECK_WINDOW_MAGIC(window,);\n    if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {\n        const int want = (resizable != SDL_FALSE);  /* normalize the flag. */\n        const int have = ((window->flags & SDL_WINDOW_RESIZABLE) != 0);\n        if ((want != have) && (_this->SetWindowResizable)) {\n            if (want) {\n                window->flags |= SDL_WINDOW_RESIZABLE;\n            } else {\n                window->flags &= ~SDL_WINDOW_RESIZABLE;\n            }\n            _this->SetWindowResizable(_this, window, (SDL_bool) want);\n        }\n    }\n}\n\nvoid\nSDL_SetWindowSize(SDL_Window * window, int w, int h)\n{\n    CHECK_WINDOW_MAGIC(window,);\n    if (w <= 0) {\n        SDL_InvalidParamError(\"w\");\n        return;\n    }\n    if (h <= 0) {\n        SDL_InvalidParamError(\"h\");\n        return;\n    }\n\n    /* Make sure we don't exceed any window size limits */\n    if (window->min_w && w < window->min_w)\n    {\n        w = window->min_w;\n    }\n    if (window->max_w && w > window->max_w)\n    {\n        w = window->max_w;\n    }\n    if (window->min_h && h < window->min_h)\n    {\n        h = window->min_h;\n    }\n    if (window->max_h && h > window->max_h)\n    {\n        h = window->max_h;\n    }\n\n    window->windowed.w = w;\n    window->windowed.h = h;\n\n    if (window->flags & SDL_WINDOW_FULLSCREEN) {\n        if (FULLSCREEN_VISIBLE(window) && (window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP) {\n            window->last_fullscreen_flags = 0;\n            SDL_UpdateFullscreenMode(window, SDL_TRUE);\n        }\n    } else {\n        window->w = w;\n        window->h = h;\n        if (_this->SetWindowSize) {\n            _this->SetWindowSize(_this, window);\n        }\n        if (window->w == w && window->h == h) {\n            /* We didn't get a SDL_WINDOWEVENT_RESIZED event (by design) */\n            SDL_OnWindowResized(window);\n        }\n    }\n}\n\nvoid\nSDL_GetWindowSize(SDL_Window * window, int *w, int *h)\n{\n    CHECK_WINDOW_MAGIC(window,);\n    if (w) {\n        *w = window->w;\n    }\n    if (h) {\n        *h = window->h;\n    }\n}\n\nvoid\nSDL_SetWindowMinimumSize(SDL_Window * window, int min_w, int min_h)\n{\n    CHECK_WINDOW_MAGIC(window,);\n    if (min_w <= 0) {\n        SDL_InvalidParamError(\"min_w\");\n        return;\n    }\n    if (min_h <= 0) {\n        SDL_InvalidParamError(\"min_h\");\n        return;\n    }\n\n    if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {\n        window->min_w = min_w;\n        window->min_h = min_h;\n        if (_this->SetWindowMinimumSize) {\n            _this->SetWindowMinimumSize(_this, window);\n        }\n        /* Ensure that window is not smaller than minimal size */\n        SDL_SetWindowSize(window, SDL_max(window->w, window->min_w), SDL_max(window->h, window->min_h));\n    }\n}\n\nint\nSDL_GetWindowBordersSize(SDL_Window * window, int *top, int *left, int *bottom, int *right)\n{\n    int dummy = 0;\n\n    if (!top) { top = &dummy; }\n    if (!left) { left = &dummy; }\n    if (!right) { right = &dummy; }\n    if (!bottom) { bottom = &dummy; }\n\n    /* Always initialize, so applications don't have to care */\n    *top = *left = *bottom = *right = 0;\n\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (!_this->GetWindowBordersSize) {\n        return SDL_Unsupported();\n    }\n\n    return _this->GetWindowBordersSize(_this, window, top, left, bottom, right);\n}\n\nvoid\nSDL_GetWindowMinimumSize(SDL_Window * window, int *min_w, int *min_h)\n{\n    CHECK_WINDOW_MAGIC(window,);\n    if (min_w) {\n        *min_w = window->min_w;\n    }\n    if (min_h) {\n        *min_h = window->min_h;\n    }\n}\n\nvoid\nSDL_SetWindowMaximumSize(SDL_Window * window, int max_w, int max_h)\n{\n    CHECK_WINDOW_MAGIC(window,);\n    if (max_w <= 0) {\n        SDL_InvalidParamError(\"max_w\");\n        return;\n    }\n    if (max_h <= 0) {\n        SDL_InvalidParamError(\"max_h\");\n        return;\n    }\n\n    if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {\n        window->max_w = max_w;\n        window->max_h = max_h;\n        if (_this->SetWindowMaximumSize) {\n            _this->SetWindowMaximumSize(_this, window);\n        }\n        /* Ensure that window is not larger than maximal size */\n        SDL_SetWindowSize(window, SDL_min(window->w, window->max_w), SDL_min(window->h, window->max_h));\n    }\n}\n\nvoid\nSDL_GetWindowMaximumSize(SDL_Window * window, int *max_w, int *max_h)\n{\n    CHECK_WINDOW_MAGIC(window,);\n    if (max_w) {\n        *max_w = window->max_w;\n    }\n    if (max_h) {\n        *max_h = window->max_h;\n    }\n}\n\nvoid\nSDL_ShowWindow(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (window->flags & SDL_WINDOW_SHOWN) {\n        return;\n    }\n\n    if (_this->ShowWindow) {\n        _this->ShowWindow(_this, window);\n    }\n    SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SHOWN, 0, 0);\n}\n\nvoid\nSDL_HideWindow(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (!(window->flags & SDL_WINDOW_SHOWN)) {\n        return;\n    }\n\n\twindow->is_hiding = SDL_TRUE;\n    SDL_UpdateFullscreenMode(window, SDL_FALSE);\n\n    if (_this->HideWindow) {\n        _this->HideWindow(_this, window);\n    }\n\twindow->is_hiding = SDL_FALSE;\n    SDL_SendWindowEvent(window, SDL_WINDOWEVENT_HIDDEN, 0, 0);\n}\n\nvoid\nSDL_RaiseWindow(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (!(window->flags & SDL_WINDOW_SHOWN)) {\n        return;\n    }\n    if (_this->RaiseWindow) {\n        _this->RaiseWindow(_this, window);\n    }\n}\n\nvoid\nSDL_MaximizeWindow(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (window->flags & SDL_WINDOW_MAXIMIZED) {\n        return;\n    }\n\n    /* !!! FIXME: should this check if the window is resizable? */\n\n    if (_this->MaximizeWindow) {\n        _this->MaximizeWindow(_this, window);\n    }\n}\n\nvoid\nSDL_MinimizeWindow(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (window->flags & SDL_WINDOW_MINIMIZED) {\n        return;\n    }\n\n    SDL_UpdateFullscreenMode(window, SDL_FALSE);\n\n    if (_this->MinimizeWindow) {\n        _this->MinimizeWindow(_this, window);\n    }\n}\n\nvoid\nSDL_RestoreWindow(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (!(window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) {\n        return;\n    }\n\n    if (_this->RestoreWindow) {\n        _this->RestoreWindow(_this, window);\n    }\n}\n\nint\nSDL_SetWindowFullscreen(SDL_Window * window, Uint32 flags)\n{\n    Uint32 oldflags;\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    flags &= FULLSCREEN_MASK;\n\n    if (flags == (window->flags & FULLSCREEN_MASK)) {\n        return 0;\n    }\n\n    /* clear the previous flags and OR in the new ones */\n    oldflags = window->flags & FULLSCREEN_MASK;\n    window->flags &= ~FULLSCREEN_MASK;\n    window->flags |= flags;\n\n    if (SDL_UpdateFullscreenMode(window, FULLSCREEN_VISIBLE(window)) == 0) {\n        return 0;\n    }\n    \n    window->flags &= ~FULLSCREEN_MASK;\n    window->flags |= oldflags;\n    return -1;\n}\n\nstatic SDL_Surface *\nSDL_CreateWindowFramebuffer(SDL_Window * window)\n{\n    Uint32 format;\n    void *pixels;\n    int pitch;\n    int bpp;\n    Uint32 Rmask, Gmask, Bmask, Amask;\n\n    if (!_this->CreateWindowFramebuffer || !_this->UpdateWindowFramebuffer) {\n        return NULL;\n    }\n\n    if (_this->CreateWindowFramebuffer(_this, window, &format, &pixels, &pitch) < 0) {\n        return NULL;\n    }\n\n    if (!SDL_PixelFormatEnumToMasks(format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {\n        return NULL;\n    }\n\n    return SDL_CreateRGBSurfaceFrom(pixels, window->w, window->h, bpp, pitch, Rmask, Gmask, Bmask, Amask);\n}\n\nSDL_Surface *\nSDL_GetWindowSurface(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window, NULL);\n\n    if (!window->surface_valid) {\n        if (window->surface) {\n            window->surface->flags &= ~SDL_DONTFREE;\n            SDL_FreeSurface(window->surface);\n        }\n        window->surface = SDL_CreateWindowFramebuffer(window);\n        if (window->surface) {\n            window->surface_valid = SDL_TRUE;\n            window->surface->flags |= SDL_DONTFREE;\n        }\n    }\n    return window->surface;\n}\n\nint\nSDL_UpdateWindowSurface(SDL_Window * window)\n{\n    SDL_Rect full_rect;\n\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    full_rect.x = 0;\n    full_rect.y = 0;\n    full_rect.w = window->w;\n    full_rect.h = window->h;\n    return SDL_UpdateWindowSurfaceRects(window, &full_rect, 1);\n}\n\nint\nSDL_UpdateWindowSurfaceRects(SDL_Window * window, const SDL_Rect * rects,\n                             int numrects)\n{\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (!window->surface_valid) {\n        return SDL_SetError(\"Window surface is invalid, please call SDL_GetWindowSurface() to get a new surface\");\n    }\n\n    return _this->UpdateWindowFramebuffer(_this, window, rects, numrects);\n}\n\nint\nSDL_SetWindowBrightness(SDL_Window * window, float brightness)\n{\n    Uint16 ramp[256];\n    int status;\n\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    SDL_CalculateGammaRamp(brightness, ramp);\n    status = SDL_SetWindowGammaRamp(window, ramp, ramp, ramp);\n    if (status == 0) {\n        window->brightness = brightness;\n    }\n    return status;\n}\n\nfloat\nSDL_GetWindowBrightness(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window, 1.0f);\n\n    return window->brightness;\n}\n\nint\nSDL_SetWindowOpacity(SDL_Window * window, float opacity)\n{\n    int retval;\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (!_this->SetWindowOpacity) {\n        return SDL_Unsupported();\n    }\n\n    if (opacity < 0.0f) {\n        opacity = 0.0f;\n    } else if (opacity > 1.0f) {\n        opacity = 1.0f;\n    }\n\n    retval = _this->SetWindowOpacity(_this, window, opacity);\n    if (retval == 0) {\n        window->opacity = opacity;\n    }\n\n    return retval;\n}\n\nint\nSDL_GetWindowOpacity(SDL_Window * window, float * out_opacity)\n{\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (out_opacity) {\n        *out_opacity = window->opacity;\n    }\n\n    return 0;\n}\n\nint\nSDL_SetWindowModalFor(SDL_Window * modal_window, SDL_Window * parent_window)\n{\n    CHECK_WINDOW_MAGIC(modal_window, -1);\n    CHECK_WINDOW_MAGIC(parent_window, -1);\n\n    if (!_this->SetWindowModalFor) {\n        return SDL_Unsupported();\n    }\n    \n    return _this->SetWindowModalFor(_this, modal_window, parent_window);\n}\n\nint \nSDL_SetWindowInputFocus(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (!_this->SetWindowInputFocus) {\n        return SDL_Unsupported();\n    }\n    \n    return _this->SetWindowInputFocus(_this, window);\n}\n\n\nint\nSDL_SetWindowGammaRamp(SDL_Window * window, const Uint16 * red,\n                                            const Uint16 * green,\n                                            const Uint16 * blue)\n{\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (!_this->SetWindowGammaRamp) {\n        return SDL_Unsupported();\n    }\n\n    if (!window->gamma) {\n        if (SDL_GetWindowGammaRamp(window, NULL, NULL, NULL) < 0) {\n            return -1;\n        }\n        SDL_assert(window->gamma != NULL);\n    }\n\n    if (red) {\n        SDL_memcpy(&window->gamma[0*256], red, 256*sizeof(Uint16));\n    }\n    if (green) {\n        SDL_memcpy(&window->gamma[1*256], green, 256*sizeof(Uint16));\n    }\n    if (blue) {\n        SDL_memcpy(&window->gamma[2*256], blue, 256*sizeof(Uint16));\n    }\n    if (window->flags & SDL_WINDOW_INPUT_FOCUS) {\n        return _this->SetWindowGammaRamp(_this, window, window->gamma);\n    } else {\n        return 0;\n    }\n}\n\nint\nSDL_GetWindowGammaRamp(SDL_Window * window, Uint16 * red,\n                                            Uint16 * green,\n                                            Uint16 * blue)\n{\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (!window->gamma) {\n        int i;\n\n        window->gamma = (Uint16 *)SDL_malloc(256*6*sizeof(Uint16));\n        if (!window->gamma) {\n            return SDL_OutOfMemory();\n        }\n        window->saved_gamma = window->gamma + 3*256;\n\n        if (_this->GetWindowGammaRamp) {\n            if (_this->GetWindowGammaRamp(_this, window, window->gamma) < 0) {\n                return -1;\n            }\n        } else {\n            /* Create an identity gamma ramp */\n            for (i = 0; i < 256; ++i) {\n                Uint16 value = (Uint16)((i << 8) | i);\n\n                window->gamma[0*256+i] = value;\n                window->gamma[1*256+i] = value;\n                window->gamma[2*256+i] = value;\n            }\n        }\n        SDL_memcpy(window->saved_gamma, window->gamma, 3*256*sizeof(Uint16));\n    }\n\n    if (red) {\n        SDL_memcpy(red, &window->gamma[0*256], 256*sizeof(Uint16));\n    }\n    if (green) {\n        SDL_memcpy(green, &window->gamma[1*256], 256*sizeof(Uint16));\n    }\n    if (blue) {\n        SDL_memcpy(blue, &window->gamma[2*256], 256*sizeof(Uint16));\n    }\n    return 0;\n}\n\nvoid\nSDL_UpdateWindowGrab(SDL_Window * window)\n{\n    SDL_Window *grabbed_window;\n    SDL_bool grabbed;\n    if ((SDL_GetMouse()->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) &&\n         (window->flags & SDL_WINDOW_INPUT_FOCUS)) {\n        grabbed = SDL_TRUE;\n    } else {\n        grabbed = SDL_FALSE;\n    }\n\n    grabbed_window = _this->grabbed_window;\n    if (grabbed) {\n        if (grabbed_window && (grabbed_window != window)) {\n            /* stealing a grab from another window! */\n            grabbed_window->flags &= ~SDL_WINDOW_INPUT_GRABBED;\n            if (_this->SetWindowGrab) {\n                _this->SetWindowGrab(_this, grabbed_window, SDL_FALSE);\n            }\n        }\n        _this->grabbed_window = window;\n    } else if (grabbed_window == window) {\n        _this->grabbed_window = NULL;  /* ungrabbing. */\n    }\n\n    if (_this->SetWindowGrab) {\n        _this->SetWindowGrab(_this, window, grabbed);\n    }\n}\n\nvoid\nSDL_SetWindowGrab(SDL_Window * window, SDL_bool grabbed)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (!!grabbed == !!(window->flags & SDL_WINDOW_INPUT_GRABBED)) {\n        return;\n    }\n    if (grabbed) {\n        window->flags |= SDL_WINDOW_INPUT_GRABBED;\n    } else {\n        window->flags &= ~SDL_WINDOW_INPUT_GRABBED;\n    }\n    SDL_UpdateWindowGrab(window);\n}\n\nSDL_bool\nSDL_GetWindowGrab(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window, SDL_FALSE);\n    SDL_assert(!_this->grabbed_window || ((_this->grabbed_window->flags & SDL_WINDOW_INPUT_GRABBED) != 0));\n    return window == _this->grabbed_window;\n}\n\nSDL_Window *\nSDL_GetGrabbedWindow(void)\n{\n    SDL_assert(!_this->grabbed_window || ((_this->grabbed_window->flags & SDL_WINDOW_INPUT_GRABBED) != 0));\n    return _this->grabbed_window;\n}\n\nvoid\nSDL_OnWindowShown(SDL_Window * window)\n{\n    SDL_OnWindowRestored(window);\n}\n\nvoid\nSDL_OnWindowHidden(SDL_Window * window)\n{\n    SDL_UpdateFullscreenMode(window, SDL_FALSE);\n}\n\nvoid\nSDL_OnWindowResized(SDL_Window * window)\n{\n    window->surface_valid = SDL_FALSE;\n    SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SIZE_CHANGED, window->w, window->h);\n}\n\nvoid\nSDL_OnWindowMinimized(SDL_Window * window)\n{\n    SDL_UpdateFullscreenMode(window, SDL_FALSE);\n}\n\nvoid\nSDL_OnWindowRestored(SDL_Window * window)\n{\n    /*\n     * FIXME: Is this fine to just remove this, or should it be preserved just\n     * for the fullscreen case? In principle it seems like just hiding/showing\n     * windows shouldn't affect the stacking order; maybe the right fix is to\n     * re-decouple OnWindowShown and OnWindowRestored.\n     */\n    /*SDL_RaiseWindow(window);*/\n\n    if (FULLSCREEN_VISIBLE(window)) {\n        SDL_UpdateFullscreenMode(window, SDL_TRUE);\n    }\n}\n\nvoid\nSDL_OnWindowEnter(SDL_Window * window)\n{\n    if (_this->OnWindowEnter) {\n        _this->OnWindowEnter(_this, window);\n    }\n}\n\nvoid\nSDL_OnWindowLeave(SDL_Window * window)\n{\n}\n\nvoid\nSDL_OnWindowFocusGained(SDL_Window * window)\n{\n    SDL_Mouse *mouse = SDL_GetMouse();\n\n    if (window->gamma && _this->SetWindowGammaRamp) {\n        _this->SetWindowGammaRamp(_this, window, window->gamma);\n    }\n\n    if (mouse && mouse->relative_mode) {\n        SDL_SetMouseFocus(window);\n        SDL_WarpMouseInWindow(window, window->w/2, window->h/2);\n    }\n\n    SDL_UpdateWindowGrab(window);\n}\n\nstatic SDL_bool\nShouldMinimizeOnFocusLoss(SDL_Window * window)\n{\n    if (!(window->flags & SDL_WINDOW_FULLSCREEN) || window->is_destroying) {\n        return SDL_FALSE;\n    }\n\n#ifdef __MACOSX__\n    if (Cocoa_IsWindowInFullscreenSpace(window)) {\n        return SDL_FALSE;\n    }\n#endif\n\n    return SDL_GetHintBoolean(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, SDL_TRUE);\n}\n\nvoid\nSDL_OnWindowFocusLost(SDL_Window * window)\n{\n    if (window->gamma && _this->SetWindowGammaRamp) {\n        _this->SetWindowGammaRamp(_this, window, window->saved_gamma);\n    }\n\n    SDL_UpdateWindowGrab(window);\n\n    if (ShouldMinimizeOnFocusLoss(window)) {\n        SDL_MinimizeWindow(window);\n    }\n}\n\n/* !!! FIXME: is this different than SDL_GetKeyboardFocus()?\n   !!! FIXME:  Also, SDL_GetKeyboardFocus() is O(1), this isn't. */\nSDL_Window *\nSDL_GetFocusWindow(void)\n{\n    SDL_Window *window;\n\n    if (!_this) {\n        return NULL;\n    }\n    for (window = _this->windows; window; window = window->next) {\n        if (window->flags & SDL_WINDOW_INPUT_FOCUS) {\n            return window;\n        }\n    }\n    return NULL;\n}\n\nvoid\nSDL_DestroyWindow(SDL_Window * window)\n{\n    SDL_VideoDisplay *display;\n\n    CHECK_WINDOW_MAGIC(window,);\n\n    window->is_destroying = SDL_TRUE;\n\n    /* Restore video mode, etc. */\n    SDL_HideWindow(window);\n\n    /* Make sure this window no longer has focus */\n    if (SDL_GetKeyboardFocus() == window) {\n        SDL_SetKeyboardFocus(NULL);\n    }\n    if (SDL_GetMouseFocus() == window) {\n        SDL_SetMouseFocus(NULL);\n    }\n\n    /* make no context current if this is the current context window. */\n    if (window->flags & SDL_WINDOW_OPENGL) {\n        if (_this->current_glwin == window) {\n            SDL_GL_MakeCurrent(window, NULL);\n        }\n    }\n\n    if (window->surface) {\n        window->surface->flags &= ~SDL_DONTFREE;\n        SDL_FreeSurface(window->surface);\n    }\n    if (_this->DestroyWindowFramebuffer) {\n        _this->DestroyWindowFramebuffer(_this, window);\n    }\n    if (_this->DestroyWindow) {\n        _this->DestroyWindow(_this, window);\n    }\n    if (window->flags & SDL_WINDOW_OPENGL) {\n        SDL_GL_UnloadLibrary();\n    }\n\n    display = SDL_GetDisplayForWindow(window);\n    if (display->fullscreen_window == window) {\n        display->fullscreen_window = NULL;\n    }\n\n    /* Now invalidate magic */\n    window->magic = NULL;\n\n    /* Free memory associated with the window */\n    SDL_free(window->title);\n    SDL_FreeSurface(window->icon);\n    SDL_free(window->gamma);\n    while (window->data) {\n        SDL_WindowUserData *data = window->data;\n\n        window->data = data->next;\n        SDL_free(data->name);\n        SDL_free(data);\n    }\n\n    /* Unlink the window from the list */\n    if (window->next) {\n        window->next->prev = window->prev;\n    }\n    if (window->prev) {\n        window->prev->next = window->next;\n    } else {\n        _this->windows = window->next;\n    }\n\n    SDL_free(window);\n}\n\nSDL_bool\nSDL_IsScreenSaverEnabled()\n{\n    if (!_this) {\n        return SDL_TRUE;\n    }\n    return _this->suspend_screensaver ? SDL_FALSE : SDL_TRUE;\n}\n\nvoid\nSDL_EnableScreenSaver()\n{\n    if (!_this) {\n        return;\n    }\n    if (!_this->suspend_screensaver) {\n        return;\n    }\n    _this->suspend_screensaver = SDL_FALSE;\n    if (_this->SuspendScreenSaver) {\n        _this->SuspendScreenSaver(_this);\n    }\n}\n\nvoid\nSDL_DisableScreenSaver()\n{\n    if (!_this) {\n        return;\n    }\n    if (_this->suspend_screensaver) {\n        return;\n    }\n    _this->suspend_screensaver = SDL_TRUE;\n    if (_this->SuspendScreenSaver) {\n        _this->SuspendScreenSaver(_this);\n    }\n}\n\nvoid\nSDL_VideoQuit(void)\n{\n    int i, j;\n\n    if (!_this) {\n        return;\n    }\n\n    /* Halt event processing before doing anything else */\n    SDL_TouchQuit();\n    SDL_MouseQuit();\n    SDL_KeyboardQuit();\n    SDL_QuitSubSystem(SDL_INIT_EVENTS);\n\n    SDL_EnableScreenSaver();\n\n    /* Clean up the system video */\n    while (_this->windows) {\n        SDL_DestroyWindow(_this->windows);\n    }\n    _this->VideoQuit(_this);\n\n    for (i = 0; i < _this->num_displays; ++i) {\n        SDL_VideoDisplay *display = &_this->displays[i];\n        for (j = display->num_display_modes; j--;) {\n            SDL_free(display->display_modes[j].driverdata);\n            display->display_modes[j].driverdata = NULL;\n        }\n        SDL_free(display->display_modes);\n        display->display_modes = NULL;\n        SDL_free(display->desktop_mode.driverdata);\n        display->desktop_mode.driverdata = NULL;\n        SDL_free(display->driverdata);\n        display->driverdata = NULL;\n    }\n    if (_this->displays) {\n        for (i = 0; i < _this->num_displays; ++i) {\n            SDL_free(_this->displays[i].name);\n        }\n        SDL_free(_this->displays);\n        _this->displays = NULL;\n        _this->num_displays = 0;\n    }\n    SDL_free(_this->clipboard_text);\n    _this->clipboard_text = NULL;\n    _this->free(_this);\n    _this = NULL;\n}\n\nint\nSDL_GL_LoadLibrary(const char *path)\n{\n    int retval;\n\n    if (!_this) {\n        return SDL_UninitializedVideo();\n    }\n    if (_this->gl_config.driver_loaded) {\n        if (path && SDL_strcmp(path, _this->gl_config.driver_path) != 0) {\n            return SDL_SetError(\"OpenGL library already loaded\");\n        }\n        retval = 0;\n    } else {\n        if (!_this->GL_LoadLibrary) {\n            return SDL_SetError(\"No dynamic GL support in video driver\");\n        }\n        retval = _this->GL_LoadLibrary(_this, path);\n    }\n    if (retval == 0) {\n        ++_this->gl_config.driver_loaded;\n    } else {\n        if (_this->GL_UnloadLibrary) {\n            _this->GL_UnloadLibrary(_this);\n        }\n    }\n    return (retval);\n}\n\nvoid *\nSDL_GL_GetProcAddress(const char *proc)\n{\n    void *func;\n\n    if (!_this) {\n        SDL_UninitializedVideo();\n        return NULL;\n    }\n    func = NULL;\n    if (_this->GL_GetProcAddress) {\n        if (_this->gl_config.driver_loaded) {\n            func = _this->GL_GetProcAddress(_this, proc);\n        } else {\n            SDL_SetError(\"No GL driver has been loaded\");\n        }\n    } else {\n        SDL_SetError(\"No dynamic GL support in video driver\");\n    }\n    return func;\n}\n\nvoid\nSDL_GL_UnloadLibrary(void)\n{\n    if (!_this) {\n        SDL_UninitializedVideo();\n        return;\n    }\n    if (_this->gl_config.driver_loaded > 0) {\n        if (--_this->gl_config.driver_loaded > 0) {\n            return;\n        }\n        if (_this->GL_UnloadLibrary) {\n            _this->GL_UnloadLibrary(_this);\n        }\n    }\n}\n\nstatic SDL_INLINE SDL_bool\nisAtLeastGL3(const char *verstr)\n{\n    return (verstr && (SDL_atoi(verstr) >= 3));\n}\n\nSDL_bool\nSDL_GL_ExtensionSupported(const char *extension)\n{\n#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2\n    const GLubyte *(APIENTRY * glGetStringFunc) (GLenum);\n    const char *extensions;\n    const char *start;\n    const char *where, *terminator;\n\n    /* Extension names should not have spaces. */\n    where = SDL_strchr(extension, ' ');\n    if (where || *extension == '\\0') {\n        return SDL_FALSE;\n    }\n    /* See if there's an environment variable override */\n    start = SDL_getenv(extension);\n    if (start && *start == '0') {\n        return SDL_FALSE;\n    }\n\n    /* Lookup the available extensions */\n\n    glGetStringFunc = SDL_GL_GetProcAddress(\"glGetString\");\n    if (!glGetStringFunc) {\n        return SDL_FALSE;\n    }\n\n    if (isAtLeastGL3((const char *) glGetStringFunc(GL_VERSION))) {\n        const GLubyte *(APIENTRY * glGetStringiFunc) (GLenum, GLuint);\n        void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params);\n        GLint num_exts = 0;\n        GLint i;\n\n        glGetStringiFunc = SDL_GL_GetProcAddress(\"glGetStringi\");\n        glGetIntegervFunc = SDL_GL_GetProcAddress(\"glGetIntegerv\");\n        if ((!glGetStringiFunc) || (!glGetIntegervFunc)) {\n            return SDL_FALSE;\n        }\n\n        #ifndef GL_NUM_EXTENSIONS\n        #define GL_NUM_EXTENSIONS 0x821D\n        #endif\n        glGetIntegervFunc(GL_NUM_EXTENSIONS, &num_exts);\n        for (i = 0; i < num_exts; i++) {\n            const char *thisext = (const char *) glGetStringiFunc(GL_EXTENSIONS, i);\n            if (SDL_strcmp(thisext, extension) == 0) {\n                return SDL_TRUE;\n            }\n        }\n\n        return SDL_FALSE;\n    }\n\n    /* Try the old way with glGetString(GL_EXTENSIONS) ... */\n\n    extensions = (const char *) glGetStringFunc(GL_EXTENSIONS);\n    if (!extensions) {\n        return SDL_FALSE;\n    }\n    /*\n     * It takes a bit of care to be fool-proof about parsing the OpenGL\n     * extensions string. Don't be fooled by sub-strings, etc.\n     */\n\n    start = extensions;\n\n    for (;;) {\n        where = SDL_strstr(start, extension);\n        if (!where)\n            break;\n\n        terminator = where + SDL_strlen(extension);\n        if (where == start || *(where - 1) == ' ')\n            if (*terminator == ' ' || *terminator == '\\0')\n                return SDL_TRUE;\n\n        start = terminator;\n    }\n    return SDL_FALSE;\n#else\n    return SDL_FALSE;\n#endif\n}\n\nvoid\nSDL_GL_ResetAttributes()\n{\n    if (!_this) {\n        return;\n    }\n\n    _this->gl_config.red_size = 3;\n    _this->gl_config.green_size = 3;\n    _this->gl_config.blue_size = 2;\n    _this->gl_config.alpha_size = 0;\n    _this->gl_config.buffer_size = 0;\n    _this->gl_config.depth_size = 16;\n    _this->gl_config.stencil_size = 0;\n    _this->gl_config.double_buffer = 1;\n    _this->gl_config.accum_red_size = 0;\n    _this->gl_config.accum_green_size = 0;\n    _this->gl_config.accum_blue_size = 0;\n    _this->gl_config.accum_alpha_size = 0;\n    _this->gl_config.stereo = 0;\n    _this->gl_config.multisamplebuffers = 0;\n    _this->gl_config.multisamplesamples = 0;\n    _this->gl_config.retained_backing = 1;\n    _this->gl_config.accelerated = -1;  /* accelerated or not, both are fine */\n    _this->gl_config.profile_mask = 0;\n#if SDL_VIDEO_OPENGL\n    _this->gl_config.major_version = 2;\n    _this->gl_config.minor_version = 1;\n#elif SDL_VIDEO_OPENGL_ES2\n    _this->gl_config.major_version = 2;\n    _this->gl_config.minor_version = 0;\n    _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;\n#elif SDL_VIDEO_OPENGL_ES\n    _this->gl_config.major_version = 1;\n    _this->gl_config.minor_version = 1;\n    _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;\n#endif\n    _this->gl_config.flags = 0;\n    _this->gl_config.framebuffer_srgb_capable = 0;\n    _this->gl_config.release_behavior = SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH;\n\n    _this->gl_config.share_with_current_context = 0;\n}\n\nint\nSDL_GL_SetAttribute(SDL_GLattr attr, int value)\n{\n#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2\n    int retval;\n\n    if (!_this) {\n        return SDL_UninitializedVideo();\n    }\n    retval = 0;\n    switch (attr) {\n    case SDL_GL_RED_SIZE:\n        _this->gl_config.red_size = value;\n        break;\n    case SDL_GL_GREEN_SIZE:\n        _this->gl_config.green_size = value;\n        break;\n    case SDL_GL_BLUE_SIZE:\n        _this->gl_config.blue_size = value;\n        break;\n    case SDL_GL_ALPHA_SIZE:\n        _this->gl_config.alpha_size = value;\n        break;\n    case SDL_GL_DOUBLEBUFFER:\n        _this->gl_config.double_buffer = value;\n        break;\n    case SDL_GL_BUFFER_SIZE:\n        _this->gl_config.buffer_size = value;\n        break;\n    case SDL_GL_DEPTH_SIZE:\n        _this->gl_config.depth_size = value;\n        break;\n    case SDL_GL_STENCIL_SIZE:\n        _this->gl_config.stencil_size = value;\n        break;\n    case SDL_GL_ACCUM_RED_SIZE:\n        _this->gl_config.accum_red_size = value;\n        break;\n    case SDL_GL_ACCUM_GREEN_SIZE:\n        _this->gl_config.accum_green_size = value;\n        break;\n    case SDL_GL_ACCUM_BLUE_SIZE:\n        _this->gl_config.accum_blue_size = value;\n        break;\n    case SDL_GL_ACCUM_ALPHA_SIZE:\n        _this->gl_config.accum_alpha_size = value;\n        break;\n    case SDL_GL_STEREO:\n        _this->gl_config.stereo = value;\n        break;\n    case SDL_GL_MULTISAMPLEBUFFERS:\n        _this->gl_config.multisamplebuffers = value;\n        break;\n    case SDL_GL_MULTISAMPLESAMPLES:\n        _this->gl_config.multisamplesamples = value;\n        break;\n    case SDL_GL_ACCELERATED_VISUAL:\n        _this->gl_config.accelerated = value;\n        break;\n    case SDL_GL_RETAINED_BACKING:\n        _this->gl_config.retained_backing = value;\n        break;\n    case SDL_GL_CONTEXT_MAJOR_VERSION:\n        _this->gl_config.major_version = value;\n        break;\n    case SDL_GL_CONTEXT_MINOR_VERSION:\n        _this->gl_config.minor_version = value;\n        break;\n    case SDL_GL_CONTEXT_EGL:\n        /* FIXME: SDL_GL_CONTEXT_EGL to be deprecated in SDL 2.1 */\n        if (value != 0) {\n            SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);\n        } else {\n            SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0);\n        };\n        break;\n    case SDL_GL_CONTEXT_FLAGS:\n        if (value & ~(SDL_GL_CONTEXT_DEBUG_FLAG |\n                      SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG |\n                      SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG |\n                      SDL_GL_CONTEXT_RESET_ISOLATION_FLAG)) {\n            retval = SDL_SetError(\"Unknown OpenGL context flag %d\", value);\n            break;\n        }\n        _this->gl_config.flags = value;\n        break;\n    case SDL_GL_CONTEXT_PROFILE_MASK:\n        if (value != 0 &&\n            value != SDL_GL_CONTEXT_PROFILE_CORE &&\n            value != SDL_GL_CONTEXT_PROFILE_COMPATIBILITY &&\n            value != SDL_GL_CONTEXT_PROFILE_ES) {\n            retval = SDL_SetError(\"Unknown OpenGL context profile %d\", value);\n            break;\n        }\n        _this->gl_config.profile_mask = value;\n        break;\n    case SDL_GL_SHARE_WITH_CURRENT_CONTEXT:\n        _this->gl_config.share_with_current_context = value;\n        break;\n    case SDL_GL_FRAMEBUFFER_SRGB_CAPABLE:\n        _this->gl_config.framebuffer_srgb_capable = value;\n        break;\n    case SDL_GL_CONTEXT_RELEASE_BEHAVIOR:\n        _this->gl_config.release_behavior = value;\n        break;\n    default:\n        retval = SDL_SetError(\"Unknown OpenGL attribute\");\n        break;\n    }\n    return retval;\n#else\n    return SDL_Unsupported();\n#endif /* SDL_VIDEO_OPENGL */\n}\n\nint\nSDL_GL_GetAttribute(SDL_GLattr attr, int *value)\n{\n#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2\n    GLenum (APIENTRY *glGetErrorFunc) (void);\n    GLenum attrib = 0;\n    GLenum error = 0;\n\n    /*\n     * Some queries in Core Profile desktop OpenGL 3+ contexts require\n     * glGetFramebufferAttachmentParameteriv instead of glGetIntegerv. Note that\n     * the enums we use for the former function don't exist in OpenGL ES 2, and\n     * the function itself doesn't exist prior to OpenGL 3 and OpenGL ES 2.\n     */\n#if SDL_VIDEO_OPENGL\n    const GLubyte *(APIENTRY *glGetStringFunc) (GLenum name);\n    void (APIENTRY *glGetFramebufferAttachmentParameterivFunc) (GLenum target, GLenum attachment, GLenum pname, GLint* params);\n    GLenum attachment = GL_BACK_LEFT;\n    GLenum attachmentattrib = 0;\n#endif\n\n    /* Clear value in any case */\n    *value = 0;\n\n    switch (attr) {\n    case SDL_GL_RED_SIZE:\n#if SDL_VIDEO_OPENGL\n        attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE;\n#endif\n        attrib = GL_RED_BITS;\n        break;\n    case SDL_GL_BLUE_SIZE:\n#if SDL_VIDEO_OPENGL\n        attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE;\n#endif\n        attrib = GL_BLUE_BITS;\n        break;\n    case SDL_GL_GREEN_SIZE:\n#if SDL_VIDEO_OPENGL\n        attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE;\n#endif\n        attrib = GL_GREEN_BITS;\n        break;\n    case SDL_GL_ALPHA_SIZE:\n#if SDL_VIDEO_OPENGL\n        attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE;\n#endif\n        attrib = GL_ALPHA_BITS;\n        break;\n    case SDL_GL_DOUBLEBUFFER:\n#if SDL_VIDEO_OPENGL\n        attrib = GL_DOUBLEBUFFER;\n        break;\n#else\n        /* OpenGL ES 1.0 and above specifications have EGL_SINGLE_BUFFER      */\n        /* parameter which switches double buffer to single buffer. OpenGL ES */\n        /* SDL driver must set proper value after initialization              */\n        *value = _this->gl_config.double_buffer;\n        return 0;\n#endif\n    case SDL_GL_DEPTH_SIZE:\n#if SDL_VIDEO_OPENGL\n        attachment = GL_DEPTH;\n        attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE;\n#endif\n        attrib = GL_DEPTH_BITS;\n        break;\n    case SDL_GL_STENCIL_SIZE:\n#if SDL_VIDEO_OPENGL\n        attachment = GL_STENCIL;\n        attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE;\n#endif\n        attrib = GL_STENCIL_BITS;\n        break;\n#if SDL_VIDEO_OPENGL\n    case SDL_GL_ACCUM_RED_SIZE:\n        attrib = GL_ACCUM_RED_BITS;\n        break;\n    case SDL_GL_ACCUM_GREEN_SIZE:\n        attrib = GL_ACCUM_GREEN_BITS;\n        break;\n    case SDL_GL_ACCUM_BLUE_SIZE:\n        attrib = GL_ACCUM_BLUE_BITS;\n        break;\n    case SDL_GL_ACCUM_ALPHA_SIZE:\n        attrib = GL_ACCUM_ALPHA_BITS;\n        break;\n    case SDL_GL_STEREO:\n        attrib = GL_STEREO;\n        break;\n#else\n    case SDL_GL_ACCUM_RED_SIZE:\n    case SDL_GL_ACCUM_GREEN_SIZE:\n    case SDL_GL_ACCUM_BLUE_SIZE:\n    case SDL_GL_ACCUM_ALPHA_SIZE:\n    case SDL_GL_STEREO:\n        /* none of these are supported in OpenGL ES */\n        *value = 0;\n        return 0;\n#endif\n    case SDL_GL_MULTISAMPLEBUFFERS:\n        attrib = GL_SAMPLE_BUFFERS;\n        break;\n    case SDL_GL_MULTISAMPLESAMPLES:\n        attrib = GL_SAMPLES;\n        break;\n    case SDL_GL_CONTEXT_RELEASE_BEHAVIOR:\n#if SDL_VIDEO_OPENGL\n        attrib = GL_CONTEXT_RELEASE_BEHAVIOR;\n#else\n        attrib = GL_CONTEXT_RELEASE_BEHAVIOR_KHR;\n#endif\n        break;\n    case SDL_GL_BUFFER_SIZE:\n        {\n            int rsize = 0, gsize = 0, bsize = 0, asize = 0;\n\n            /* There doesn't seem to be a single flag in OpenGL for this! */\n            if (SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &rsize) < 0) {\n                return -1;\n            }\n            if (SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &gsize) < 0) {\n                return -1;\n            }\n            if (SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &bsize) < 0) {\n                return -1;\n            }\n            if (SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &asize) < 0) {\n                return -1;\n            }\n\n            *value = rsize + gsize + bsize + asize;\n            return 0;\n        }\n    case SDL_GL_ACCELERATED_VISUAL:\n        {\n            /* FIXME: How do we get this information? */\n            *value = (_this->gl_config.accelerated != 0);\n            return 0;\n        }\n    case SDL_GL_RETAINED_BACKING:\n        {\n            *value = _this->gl_config.retained_backing;\n            return 0;\n        }\n    case SDL_GL_CONTEXT_MAJOR_VERSION:\n        {\n            *value = _this->gl_config.major_version;\n            return 0;\n        }\n    case SDL_GL_CONTEXT_MINOR_VERSION:\n        {\n            *value = _this->gl_config.minor_version;\n            return 0;\n        }\n    case SDL_GL_CONTEXT_EGL:\n        /* FIXME: SDL_GL_CONTEXT_EGL to be deprecated in SDL 2.1 */\n        {\n            if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {\n                *value = 1;\n            }\n            else {\n                *value = 0;\n            }\n            return 0;\n        }\n    case SDL_GL_CONTEXT_FLAGS:\n        {\n            *value = _this->gl_config.flags;\n            return 0;\n        }\n    case SDL_GL_CONTEXT_PROFILE_MASK:\n        {\n            *value = _this->gl_config.profile_mask;\n            return 0;\n        }\n    case SDL_GL_SHARE_WITH_CURRENT_CONTEXT:\n        {\n            *value = _this->gl_config.share_with_current_context;\n            return 0;\n        }\n    case SDL_GL_FRAMEBUFFER_SRGB_CAPABLE:\n        {\n            *value = _this->gl_config.framebuffer_srgb_capable;\n            return 0;\n        }\n    default:\n        return SDL_SetError(\"Unknown OpenGL attribute\");\n    }\n\n#if SDL_VIDEO_OPENGL\n    glGetStringFunc = SDL_GL_GetProcAddress(\"glGetString\");\n    if (!glGetStringFunc) {\n        return SDL_SetError(\"Failed getting OpenGL glGetString entry point\");\n    }\n\n    if (attachmentattrib && isAtLeastGL3((const char *) glGetStringFunc(GL_VERSION))) {\n        glGetFramebufferAttachmentParameterivFunc = SDL_GL_GetProcAddress(\"glGetFramebufferAttachmentParameteriv\");\n\n        if (glGetFramebufferAttachmentParameterivFunc) {\n            glGetFramebufferAttachmentParameterivFunc(GL_FRAMEBUFFER, attachment, attachmentattrib, (GLint *) value);\n        } else {\n            return SDL_SetError(\"Failed getting OpenGL glGetFramebufferAttachmentParameteriv entry point\");\n        }\n    } else\n#endif\n    {\n        void (APIENTRY *glGetIntegervFunc) (GLenum pname, GLint * params);\n        glGetIntegervFunc = SDL_GL_GetProcAddress(\"glGetIntegerv\");\n        if (glGetIntegervFunc) {\n            glGetIntegervFunc(attrib, (GLint *) value);\n        } else {\n            return SDL_SetError(\"Failed getting OpenGL glGetIntegerv entry point\");\n        }\n    }\n\n    glGetErrorFunc = SDL_GL_GetProcAddress(\"glGetError\");\n    if (!glGetErrorFunc) {\n        return SDL_SetError(\"Failed getting OpenGL glGetError entry point\");\n    }\n\n    error = glGetErrorFunc();\n    if (error != GL_NO_ERROR) {\n        if (error == GL_INVALID_ENUM) {\n            return SDL_SetError(\"OpenGL error: GL_INVALID_ENUM\");\n        } else if (error == GL_INVALID_VALUE) {\n            return SDL_SetError(\"OpenGL error: GL_INVALID_VALUE\");\n        }\n        return SDL_SetError(\"OpenGL error: %08X\", error);\n    }\n    return 0;\n#else\n    return SDL_Unsupported();\n#endif /* SDL_VIDEO_OPENGL */\n}\n\nSDL_GLContext\nSDL_GL_CreateContext(SDL_Window * window)\n{\n    SDL_GLContext ctx = NULL;\n    CHECK_WINDOW_MAGIC(window, NULL);\n\n    if (!(window->flags & SDL_WINDOW_OPENGL)) {\n        SDL_SetError(\"The specified window isn't an OpenGL window\");\n        return NULL;\n    }\n\n    ctx = _this->GL_CreateContext(_this, window);\n\n    /* Creating a context is assumed to make it current in the SDL driver. */\n    if (ctx) {\n        _this->current_glwin = window;\n        _this->current_glctx = ctx;\n        SDL_TLSSet(_this->current_glwin_tls, window, NULL);\n        SDL_TLSSet(_this->current_glctx_tls, ctx, NULL);\n    }\n    return ctx;\n}\n\nint\nSDL_GL_MakeCurrent(SDL_Window * window, SDL_GLContext ctx)\n{\n    int retval;\n\n    if (window == SDL_GL_GetCurrentWindow() &&\n        ctx == SDL_GL_GetCurrentContext()) {\n        /* We're already current. */\n        return 0;\n    }\n\n    if (!ctx) {\n        window = NULL;\n    } else {\n        CHECK_WINDOW_MAGIC(window, -1);\n\n        if (!(window->flags & SDL_WINDOW_OPENGL)) {\n            return SDL_SetError(\"The specified window isn't an OpenGL window\");\n        }\n    }\n\n    retval = _this->GL_MakeCurrent(_this, window, ctx);\n    if (retval == 0) {\n        _this->current_glwin = window;\n        _this->current_glctx = ctx;\n        SDL_TLSSet(_this->current_glwin_tls, window, NULL);\n        SDL_TLSSet(_this->current_glctx_tls, ctx, NULL);\n    }\n    return retval;\n}\n\nSDL_Window *\nSDL_GL_GetCurrentWindow(void)\n{\n    if (!_this) {\n        SDL_UninitializedVideo();\n        return NULL;\n    }\n    return (SDL_Window *)SDL_TLSGet(_this->current_glwin_tls);\n}\n\nSDL_GLContext\nSDL_GL_GetCurrentContext(void)\n{\n    if (!_this) {\n        SDL_UninitializedVideo();\n        return NULL;\n    }\n    return (SDL_GLContext)SDL_TLSGet(_this->current_glctx_tls);\n}\n\nvoid SDL_GL_GetDrawableSize(SDL_Window * window, int *w, int *h)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (_this->GL_GetDrawableSize) {\n        _this->GL_GetDrawableSize(_this, window, w, h);\n    } else {\n        SDL_GetWindowSize(window, w, h);\n    }\n}\n\nint\nSDL_GL_SetSwapInterval(int interval)\n{\n    if (!_this) {\n        return SDL_UninitializedVideo();\n    } else if (SDL_GL_GetCurrentContext() == NULL) {\n        return SDL_SetError(\"No OpenGL context has been made current\");\n    } else if (_this->GL_SetSwapInterval) {\n        return _this->GL_SetSwapInterval(_this, interval);\n    } else {\n        return SDL_SetError(\"Setting the swap interval is not supported\");\n    }\n}\n\nint\nSDL_GL_GetSwapInterval(void)\n{\n    if (!_this) {\n        return 0;\n    } else if (SDL_GL_GetCurrentContext() == NULL) {\n        return 0;\n    } else if (_this->GL_GetSwapInterval) {\n        return _this->GL_GetSwapInterval(_this);\n    } else {\n        return 0;\n    }\n}\n\nvoid\nSDL_GL_SwapWindow(SDL_Window * window)\n{\n    CHECK_WINDOW_MAGIC(window,);\n\n    if (!(window->flags & SDL_WINDOW_OPENGL)) {\n        SDL_SetError(\"The specified window isn't an OpenGL window\");\n        return;\n    }\n\n    if (SDL_GL_GetCurrentWindow() != window) {\n        SDL_SetError(\"The specified window has not been made current\");\n        return;\n    }\n\n    _this->GL_SwapWindow(_this, window);\n}\n\nvoid\nSDL_GL_DeleteContext(SDL_GLContext context)\n{\n    if (!_this || !context) {\n        return;\n    }\n\n    if (SDL_GL_GetCurrentContext() == context) {\n        SDL_GL_MakeCurrent(NULL, NULL);\n    }\n\n    _this->GL_DeleteContext(_this, context);\n}\n\n#if 0                           /* FIXME */\n/*\n * Utility function used by SDL_WM_SetIcon(); flags & 1 for color key, flags\n * & 2 for alpha channel.\n */\nstatic void\nCreateMaskFromColorKeyOrAlpha(SDL_Surface * icon, Uint8 * mask, int flags)\n{\n    int x, y;\n    Uint32 colorkey;\n#define SET_MASKBIT(icon, x, y, mask) \\\n    mask[(y*((icon->w+7)/8))+(x/8)] &= ~(0x01<<(7-(x%8)))\n\n    colorkey = icon->format->colorkey;\n    switch (icon->format->BytesPerPixel) {\n    case 1:\n        {\n            Uint8 *pixels;\n            for (y = 0; y < icon->h; ++y) {\n                pixels = (Uint8 *) icon->pixels + y * icon->pitch;\n                for (x = 0; x < icon->w; ++x) {\n                    if (*pixels++ == colorkey) {\n                        SET_MASKBIT(icon, x, y, mask);\n                    }\n                }\n            }\n        }\n        break;\n\n    case 2:\n        {\n            Uint16 *pixels;\n            for (y = 0; y < icon->h; ++y) {\n                pixels = (Uint16 *) icon->pixels + y * icon->pitch / 2;\n                for (x = 0; x < icon->w; ++x) {\n                    if ((flags & 1) && *pixels == colorkey) {\n                        SET_MASKBIT(icon, x, y, mask);\n                    } else if ((flags & 2)\n                               && (*pixels & icon->format->Amask) == 0) {\n                        SET_MASKBIT(icon, x, y, mask);\n                    }\n                    pixels++;\n                }\n            }\n        }\n        break;\n\n    case 4:\n        {\n            Uint32 *pixels;\n            for (y = 0; y < icon->h; ++y) {\n                pixels = (Uint32 *) icon->pixels + y * icon->pitch / 4;\n                for (x = 0; x < icon->w; ++x) {\n                    if ((flags & 1) && *pixels == colorkey) {\n                        SET_MASKBIT(icon, x, y, mask);\n                    } else if ((flags & 2)\n                               && (*pixels & icon->format->Amask) == 0) {\n                        SET_MASKBIT(icon, x, y, mask);\n                    }\n                    pixels++;\n                }\n            }\n        }\n        break;\n    }\n}\n\n/*\n * Sets the window manager icon for the display window.\n */\nvoid\nSDL_WM_SetIcon(SDL_Surface * icon, Uint8 * mask)\n{\n    if (icon && _this->SetIcon) {\n        /* Generate a mask if necessary, and create the icon! */\n        if (mask == NULL) {\n            int mask_len = icon->h * (icon->w + 7) / 8;\n            int flags = 0;\n            mask = (Uint8 *) SDL_malloc(mask_len);\n            if (mask == NULL) {\n                return;\n            }\n            SDL_memset(mask, ~0, mask_len);\n            if (icon->flags & SDL_SRCCOLORKEY)\n                flags |= 1;\n            if (icon->flags & SDL_SRCALPHA)\n                flags |= 2;\n            if (flags) {\n                CreateMaskFromColorKeyOrAlpha(icon, mask, flags);\n            }\n            _this->SetIcon(_this, icon, mask);\n            SDL_free(mask);\n        } else {\n            _this->SetIcon(_this, icon, mask);\n        }\n    }\n}\n#endif\n\nSDL_bool\nSDL_GetWindowWMInfo(SDL_Window * window, struct SDL_SysWMinfo *info)\n{\n    CHECK_WINDOW_MAGIC(window, SDL_FALSE);\n\n    if (!info) {\n        SDL_InvalidParamError(\"info\");\n        return SDL_FALSE;\n    }\n    info->subsystem = SDL_SYSWM_UNKNOWN;\n\n    if (!_this->GetWindowWMInfo) {\n        SDL_Unsupported();\n        return SDL_FALSE;\n    }\n    return (_this->GetWindowWMInfo(_this, window, info));\n}\n\nvoid\nSDL_StartTextInput(void)\n{\n    SDL_Window *window;\n\n    /* First, enable text events */\n    SDL_EventState(SDL_TEXTINPUT, SDL_ENABLE);\n    SDL_EventState(SDL_TEXTEDITING, SDL_ENABLE);\n\n    /* Then show the on-screen keyboard, if any */\n    window = SDL_GetFocusWindow();\n    if (window && _this && _this->ShowScreenKeyboard) {\n        _this->ShowScreenKeyboard(_this, window);\n    }\n\n    /* Finally start the text input system */\n    if (_this && _this->StartTextInput) {\n        _this->StartTextInput(_this);\n    }\n}\n\nSDL_bool\nSDL_IsTextInputActive(void)\n{\n    return (SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE);\n}\n\nvoid\nSDL_StopTextInput(void)\n{\n    SDL_Window *window;\n\n    /* Stop the text input system */\n    if (_this && _this->StopTextInput) {\n        _this->StopTextInput(_this);\n    }\n\n    /* Hide the on-screen keyboard, if any */\n    window = SDL_GetFocusWindow();\n    if (window && _this && _this->HideScreenKeyboard) {\n        _this->HideScreenKeyboard(_this, window);\n    }\n\n    /* Finally disable text events */\n    SDL_EventState(SDL_TEXTINPUT, SDL_DISABLE);\n    SDL_EventState(SDL_TEXTEDITING, SDL_DISABLE);\n}\n\nvoid\nSDL_SetTextInputRect(SDL_Rect *rect)\n{\n    if (_this && _this->SetTextInputRect) {\n        _this->SetTextInputRect(_this, rect);\n    }\n}\n\nSDL_bool\nSDL_HasScreenKeyboardSupport(void)\n{\n    if (_this && _this->HasScreenKeyboardSupport) {\n        return _this->HasScreenKeyboardSupport(_this);\n    }\n    return SDL_FALSE;\n}\n\nSDL_bool\nSDL_IsScreenKeyboardShown(SDL_Window *window)\n{\n    if (window && _this && _this->IsScreenKeyboardShown) {\n        return _this->IsScreenKeyboardShown(_this, window);\n    }\n    return SDL_FALSE;\n}\n\n#if SDL_VIDEO_DRIVER_ANDROID\n#include \"android/SDL_androidmessagebox.h\"\n#endif\n#if SDL_VIDEO_DRIVER_WINDOWS\n#include \"windows/SDL_windowsmessagebox.h\"\n#endif\n#if SDL_VIDEO_DRIVER_WINRT\n#include \"winrt/SDL_winrtmessagebox.h\"\n#endif\n#if SDL_VIDEO_DRIVER_COCOA\n#include \"cocoa/SDL_cocoamessagebox.h\"\n#endif\n#if SDL_VIDEO_DRIVER_UIKIT\n#include \"uikit/SDL_uikitmessagebox.h\"\n#endif\n#if SDL_VIDEO_DRIVER_X11\n#include \"x11/SDL_x11messagebox.h\"\n#endif\n\n// This function will be unused if none of the above video drivers are present.\nSDL_UNUSED static SDL_bool SDL_MessageboxValidForDriver(const SDL_MessageBoxData *messageboxdata, SDL_SYSWM_TYPE drivertype)\n{\n    SDL_SysWMinfo info;\n    SDL_Window *window = messageboxdata->window;\n\n    if (!window) {\n        return SDL_TRUE;\n    }\n\n    SDL_VERSION(&info.version);\n    if (!SDL_GetWindowWMInfo(window, &info)) {\n        return SDL_TRUE;\n    } else {\n        return (info.subsystem == drivertype);\n    }\n}\n\nint\nSDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)\n{\n    int dummybutton;\n    int retval = -1;\n    SDL_bool relative_mode;\n    int show_cursor_prev;\n    SDL_bool mouse_captured;\n    SDL_Window *current_window;\n\n    if (!messageboxdata) {\n        return SDL_InvalidParamError(\"messageboxdata\");\n    }\n\n    current_window = SDL_GetKeyboardFocus();\n    mouse_captured = current_window && ((SDL_GetWindowFlags(current_window) & SDL_WINDOW_MOUSE_CAPTURE) != 0);\n    relative_mode = SDL_GetRelativeMouseMode();\n    SDL_CaptureMouse(SDL_FALSE);\n    SDL_SetRelativeMouseMode(SDL_FALSE);\n    show_cursor_prev = SDL_ShowCursor(1);\n    SDL_ResetKeyboard();\n\n    if (!buttonid) {\n        buttonid = &dummybutton;\n    }\n\n    if (_this && _this->ShowMessageBox) {\n        retval = _this->ShowMessageBox(_this, messageboxdata, buttonid);\n    }\n\n    /* It's completely fine to call this function before video is initialized */\n#if SDL_VIDEO_DRIVER_ANDROID\n    if (retval == -1 &&\n        Android_ShowMessageBox(messageboxdata, buttonid) == 0) {\n        retval = 0;\n    }\n#endif\n#if SDL_VIDEO_DRIVER_WINDOWS\n    if (retval == -1 &&\n        SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_WINDOWS) &&\n        WIN_ShowMessageBox(messageboxdata, buttonid) == 0) {\n        retval = 0;\n    }\n#endif\n#if SDL_VIDEO_DRIVER_WINRT\n    if (retval == -1 &&\n        SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_WINRT) &&\n        WINRT_ShowMessageBox(messageboxdata, buttonid) == 0) {\n        retval = 0;\n    }\n#endif\n#if SDL_VIDEO_DRIVER_COCOA\n    if (retval == -1 &&\n        SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_COCOA) &&\n        Cocoa_ShowMessageBox(messageboxdata, buttonid) == 0) {\n        retval = 0;\n    }\n#endif\n#if SDL_VIDEO_DRIVER_UIKIT\n    if (retval == -1 &&\n        SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_UIKIT) &&\n        UIKit_ShowMessageBox(messageboxdata, buttonid) == 0) {\n        retval = 0;\n    }\n#endif\n#if SDL_VIDEO_DRIVER_X11\n    if (retval == -1 &&\n        SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_X11) &&\n        X11_ShowMessageBox(messageboxdata, buttonid) == 0) {\n        retval = 0;\n    }\n#endif\n    if (retval == -1) {\n        SDL_SetError(\"No message system available\");\n    }\n\n    if (current_window) {\n        SDL_RaiseWindow(current_window);\n        if (mouse_captured) {\n            SDL_CaptureMouse(SDL_TRUE);\n        }\n    }\n\n    SDL_ShowCursor(show_cursor_prev);\n    SDL_SetRelativeMouseMode(relative_mode);\n\n    return retval;\n}\n\nint\nSDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, SDL_Window *window)\n{\n#ifdef __EMSCRIPTEN__\n    /* !!! FIXME: propose a browser API for this, get this #ifdef out of here? */\n    /* Web browsers don't (currently) have an API for a custom message box\n       that can block, but for the most common case (SDL_ShowSimpleMessageBox),\n       we can use the standard Javascript alert() function. */\n    EM_ASM_({\n        alert(UTF8ToString($0) + \"\\n\\n\" + UTF8ToString($1));\n    }, title, message);\n    return 0;\n#else\n    SDL_MessageBoxData data;\n    SDL_MessageBoxButtonData button;\n\n    SDL_zero(data);\n    data.flags = flags;\n    data.title = title;\n    data.message = message;\n    data.numbuttons = 1;\n    data.buttons = &button;\n    data.window = window;\n\n    SDL_zero(button);\n    button.flags |= SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT;\n    button.flags |= SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT;\n    button.text = \"OK\";\n\n    return SDL_ShowMessageBox(&data, NULL);\n#endif\n}\n\nSDL_bool\nSDL_ShouldAllowTopmost(void)\n{\n    return SDL_GetHintBoolean(SDL_HINT_ALLOW_TOPMOST, SDL_TRUE);\n}\n\nint\nSDL_SetWindowHitTest(SDL_Window * window, SDL_HitTest callback, void *userdata)\n{\n    CHECK_WINDOW_MAGIC(window, -1);\n\n    if (!_this->SetWindowHitTest) {\n        return SDL_Unsupported();\n    } else if (_this->SetWindowHitTest(window, callback != NULL) == -1) {\n        return -1;\n    }\n\n    window->hit_test = callback;\n    window->hit_test_data = userdata;\n\n    return 0;\n}\n\nfloat SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches)\n{\n\tfloat den2 = hinches * hinches + vinches * vinches;\n\tif ( den2 <= 0.0f ) {\n\t\treturn 0.0f;\n\t}\n\t\t\n\treturn (float)(SDL_sqrt((double)hpix * (double)hpix + (double)vpix * (double)vpix) /\n\t\t\t\t   SDL_sqrt((double)den2));\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidclipboard.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\n#include \"SDL_androidvideo.h\"\n\n#include \"../../core/android/SDL_android.h\"\n\nint\nAndroid_SetClipboardText(_THIS, const char *text)\n{\n    return Android_JNI_SetClipboardText(text);\n}\n\nchar *\nAndroid_GetClipboardText(_THIS)\n{\n    return Android_JNI_GetClipboardText();\n}\n\nSDL_bool Android_HasClipboardText(_THIS)\n{\n    return Android_JNI_HasClipboardText();\n}\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidclipboard.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef _SDL_androidclipboard_h\n#define _SDL_androidclipboard_h\n\nextern int Android_SetClipboardText(_THIS, const char *text);\nextern char *Android_GetClipboardText(_THIS);\nextern SDL_bool Android_HasClipboardText(_THIS);\n\n#endif /* _SDL_androidclipboard_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidevents.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\n/* We're going to do this by default */\n#define SDL_ANDROID_BLOCK_ON_PAUSE  1\n\n#include \"SDL_androidevents.h\"\n#include \"SDL_events.h\"\n#include \"SDL_androidwindow.h\"\n\n\nvoid android_egl_context_backup();\nvoid android_egl_context_restore();\n\n#if SDL_AUDIO_DRIVER_ANDROID\nvoid ANDROIDAUDIO_ResumeDevices(void);\nvoid ANDROIDAUDIO_PauseDevices(void);\n#else\nstatic void ANDROIDAUDIO_ResumeDevices(void) {}\nstatic void ANDROIDAUDIO_PauseDevices(void) {}\n#endif\n\nvoid \nandroid_egl_context_restore() \n{\n    SDL_Event event;\n    SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata;\n    if (SDL_GL_MakeCurrent(Android_Window, (SDL_GLContext) data->egl_context) < 0) {\n        /* The context is no longer valid, create a new one */\n        data->egl_context = (EGLContext) SDL_GL_CreateContext(Android_Window);\n        SDL_GL_MakeCurrent(Android_Window, (SDL_GLContext) data->egl_context);\n        event.type = SDL_RENDER_DEVICE_RESET;\n        SDL_PushEvent(&event);\n    }\n}\n\nvoid \nandroid_egl_context_backup() \n{\n    /* Keep a copy of the EGL Context so we can try to restore it when we resume */\n    SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata;\n    data->egl_context = SDL_GL_GetCurrentContext();\n    /* We need to do this so the EGLSurface can be freed */\n    SDL_GL_MakeCurrent(Android_Window, NULL);\n}\n\nvoid\nAndroid_PumpEvents(_THIS)\n{\n    static int isPaused = 0;\n#if SDL_ANDROID_BLOCK_ON_PAUSE\n    static int isPausing = 0;\n#endif\n    /* No polling necessary */\n\n    /*\n     * Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume\n     * When the pause semaphore is signaled, if SDL_ANDROID_BLOCK_ON_PAUSE is defined the event loop will block until the resume signal is emitted.\n     */\n\n#if SDL_ANDROID_BLOCK_ON_PAUSE\n    if (isPaused && !isPausing) {\n        /* Make sure this is the last thing we do before pausing */\n        android_egl_context_backup();\n        ANDROIDAUDIO_PauseDevices();\n        if(SDL_SemWait(Android_ResumeSem) == 0) {\n#else\n    if (isPaused) {\n        if(SDL_SemTryWait(Android_ResumeSem) == 0) {\n#endif\n            isPaused = 0;\n            ANDROIDAUDIO_ResumeDevices();\n            /* Restore the GL Context from here, as this operation is thread dependent */\n            if (!SDL_HasEvent(SDL_QUIT)) {\n                android_egl_context_restore();\n            }\n        }\n    }\n    else {\n#if SDL_ANDROID_BLOCK_ON_PAUSE\n        if( isPausing || SDL_SemTryWait(Android_PauseSem) == 0 ) {\n            /* We've been signaled to pause, but before we block ourselves, \n            we need to make sure that certain key events have reached the app */\n            if (SDL_HasEvent(SDL_WINDOWEVENT) || SDL_HasEvent(SDL_APP_WILLENTERBACKGROUND) || SDL_HasEvent(SDL_APP_DIDENTERBACKGROUND) ) {\n                isPausing = 1;\n            }\n            else {\n                isPausing = 0;\n                isPaused = 1;\n            }\n        }\n#else\n        if(SDL_SemTryWait(Android_PauseSem) == 0) {\n            android_egl_context_backup();\n            ANDROIDAUDIO_PauseDevices();\n            isPaused = 1;\n        }\n#endif\n    }\n}\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidevents.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#include \"SDL_androidvideo.h\"\n\nextern void Android_PumpEvents(_THIS);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidgl.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\n/* Android SDL video driver implementation */\n\n#include \"SDL_video.h\"\n#include \"../SDL_egl_c.h\"\n#include \"SDL_androidwindow.h\"\n\n#include \"SDL_androidvideo.h\"\n#include \"../../core/android/SDL_android.h\"\n\n#include <android/log.h>\n\n#include <dlfcn.h>\n\nSDL_EGL_CreateContext_impl(Android)\nSDL_EGL_MakeCurrent_impl(Android)\n\nvoid\nAndroid_GLES_SwapWindow(_THIS, SDL_Window * window)\n{\n    /* The following two calls existed in the original Java code\n     * If you happen to have a device that's affected by their removal,\n     * please report to Bugzilla. -- Gabriel\n     */\n    \n    /*_this->egl_data->eglWaitNative(EGL_CORE_NATIVE_ENGINE);\n    _this->egl_data->eglWaitGL();*/\n    SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\n}\n\nint\nAndroid_GLES_LoadLibrary(_THIS, const char *path) {\n    return SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) 0);\n}\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidkeyboard.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\n#include <android/log.h>\n\n#include \"../../events/SDL_events_c.h\"\n\n#include \"SDL_androidkeyboard.h\"\n\n#include \"../../core/android/SDL_android.h\"\n\nvoid Android_InitKeyboard(void)\n{\n    SDL_Keycode keymap[SDL_NUM_SCANCODES];\n\n    /* Add default scancode to key mapping */\n    SDL_GetDefaultKeymap(keymap);\n    SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES);\n}\n\nstatic SDL_Scancode Android_Keycodes[] = {\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_UNKNOWN */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SOFT_LEFT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SOFT_RIGHT */\n    SDL_SCANCODE_AC_HOME, /* AKEYCODE_HOME */\n    SDL_SCANCODE_AC_BACK, /* AKEYCODE_BACK */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CALL */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ENDCALL */\n    SDL_SCANCODE_0, /* AKEYCODE_0 */\n    SDL_SCANCODE_1, /* AKEYCODE_1 */\n    SDL_SCANCODE_2, /* AKEYCODE_2 */\n    SDL_SCANCODE_3, /* AKEYCODE_3 */\n    SDL_SCANCODE_4, /* AKEYCODE_4 */\n    SDL_SCANCODE_5, /* AKEYCODE_5 */\n    SDL_SCANCODE_6, /* AKEYCODE_6 */\n    SDL_SCANCODE_7, /* AKEYCODE_7 */\n    SDL_SCANCODE_8, /* AKEYCODE_8 */\n    SDL_SCANCODE_9, /* AKEYCODE_9 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STAR */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_POUND */\n    SDL_SCANCODE_UP, /* AKEYCODE_DPAD_UP */\n    SDL_SCANCODE_DOWN, /* AKEYCODE_DPAD_DOWN */\n    SDL_SCANCODE_LEFT, /* AKEYCODE_DPAD_LEFT */\n    SDL_SCANCODE_RIGHT, /* AKEYCODE_DPAD_RIGHT */\n    SDL_SCANCODE_SELECT, /* AKEYCODE_DPAD_CENTER */\n    SDL_SCANCODE_VOLUMEUP, /* AKEYCODE_VOLUME_UP */\n    SDL_SCANCODE_VOLUMEDOWN, /* AKEYCODE_VOLUME_DOWN */\n    SDL_SCANCODE_POWER, /* AKEYCODE_POWER */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CAMERA */\n    SDL_SCANCODE_CLEAR, /* AKEYCODE_CLEAR */\n    SDL_SCANCODE_A, /* AKEYCODE_A */\n    SDL_SCANCODE_B, /* AKEYCODE_B */\n    SDL_SCANCODE_C, /* AKEYCODE_C */\n    SDL_SCANCODE_D, /* AKEYCODE_D */\n    SDL_SCANCODE_E, /* AKEYCODE_E */\n    SDL_SCANCODE_F, /* AKEYCODE_F */\n    SDL_SCANCODE_G, /* AKEYCODE_G */\n    SDL_SCANCODE_H, /* AKEYCODE_H */\n    SDL_SCANCODE_I, /* AKEYCODE_I */\n    SDL_SCANCODE_J, /* AKEYCODE_J */\n    SDL_SCANCODE_K, /* AKEYCODE_K */\n    SDL_SCANCODE_L, /* AKEYCODE_L */\n    SDL_SCANCODE_M, /* AKEYCODE_M */\n    SDL_SCANCODE_N, /* AKEYCODE_N */\n    SDL_SCANCODE_O, /* AKEYCODE_O */\n    SDL_SCANCODE_P, /* AKEYCODE_P */\n    SDL_SCANCODE_Q, /* AKEYCODE_Q */\n    SDL_SCANCODE_R, /* AKEYCODE_R */\n    SDL_SCANCODE_S, /* AKEYCODE_S */\n    SDL_SCANCODE_T, /* AKEYCODE_T */\n    SDL_SCANCODE_U, /* AKEYCODE_U */\n    SDL_SCANCODE_V, /* AKEYCODE_V */\n    SDL_SCANCODE_W, /* AKEYCODE_W */\n    SDL_SCANCODE_X, /* AKEYCODE_X */\n    SDL_SCANCODE_Y, /* AKEYCODE_Y */\n    SDL_SCANCODE_Z, /* AKEYCODE_Z */\n    SDL_SCANCODE_COMMA, /* AKEYCODE_COMMA */\n    SDL_SCANCODE_PERIOD, /* AKEYCODE_PERIOD */\n    SDL_SCANCODE_LALT, /* AKEYCODE_ALT_LEFT */\n    SDL_SCANCODE_RALT, /* AKEYCODE_ALT_RIGHT */\n    SDL_SCANCODE_LSHIFT, /* AKEYCODE_SHIFT_LEFT */\n    SDL_SCANCODE_RSHIFT, /* AKEYCODE_SHIFT_RIGHT */\n    SDL_SCANCODE_TAB, /* AKEYCODE_TAB */\n    SDL_SCANCODE_SPACE, /* AKEYCODE_SPACE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SYM */\n    SDL_SCANCODE_WWW, /* AKEYCODE_EXPLORER */\n    SDL_SCANCODE_MAIL, /* AKEYCODE_ENVELOPE */\n    SDL_SCANCODE_RETURN, /* AKEYCODE_ENTER */\n    SDL_SCANCODE_BACKSPACE, /* AKEYCODE_DEL */\n    SDL_SCANCODE_GRAVE, /* AKEYCODE_GRAVE */\n    SDL_SCANCODE_MINUS, /* AKEYCODE_MINUS */\n    SDL_SCANCODE_EQUALS, /* AKEYCODE_EQUALS */\n    SDL_SCANCODE_LEFTBRACKET, /* AKEYCODE_LEFT_BRACKET */\n    SDL_SCANCODE_RIGHTBRACKET, /* AKEYCODE_RIGHT_BRACKET */\n    SDL_SCANCODE_BACKSLASH, /* AKEYCODE_BACKSLASH */\n    SDL_SCANCODE_SEMICOLON, /* AKEYCODE_SEMICOLON */\n    SDL_SCANCODE_APOSTROPHE, /* AKEYCODE_APOSTROPHE */\n    SDL_SCANCODE_SLASH, /* AKEYCODE_SLASH */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_AT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NUM */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_HEADSETHOOK */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_FOCUS */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PLUS */\n    SDL_SCANCODE_MENU, /* AKEYCODE_MENU */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NOTIFICATION */\n    SDL_SCANCODE_AC_SEARCH, /* AKEYCODE_SEARCH */\n    SDL_SCANCODE_AUDIOPLAY, /* AKEYCODE_MEDIA_PLAY_PAUSE */\n    SDL_SCANCODE_AUDIOSTOP, /* AKEYCODE_MEDIA_STOP */\n    SDL_SCANCODE_AUDIONEXT, /* AKEYCODE_MEDIA_NEXT */\n    SDL_SCANCODE_AUDIOPREV, /* AKEYCODE_MEDIA_PREVIOUS */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_REWIND */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_FAST_FORWARD */\n    SDL_SCANCODE_MUTE, /* AKEYCODE_MUTE */\n    SDL_SCANCODE_PAGEUP, /* AKEYCODE_PAGE_UP */\n    SDL_SCANCODE_PAGEDOWN, /* AKEYCODE_PAGE_DOWN */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PICTSYMBOLS */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SWITCH_CHARSET */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_A */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_B */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_C */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_X */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_Y */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_Z */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_L1 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_R1 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_L2 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_R2 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_THUMBL */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_THUMBR */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_START */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_SELECT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_MODE */\n    SDL_SCANCODE_ESCAPE, /* AKEYCODE_ESCAPE */\n    SDL_SCANCODE_DELETE, /* AKEYCODE_FORWARD_DEL */\n    SDL_SCANCODE_LCTRL, /* AKEYCODE_CTRL_LEFT */\n    SDL_SCANCODE_RCTRL, /* AKEYCODE_CTRL_RIGHT */\n    SDL_SCANCODE_CAPSLOCK, /* AKEYCODE_CAPS_LOCK */\n    SDL_SCANCODE_SCROLLLOCK, /* AKEYCODE_SCROLL_LOCK */\n    SDL_SCANCODE_LGUI, /* AKEYCODE_META_LEFT */\n    SDL_SCANCODE_RGUI, /* AKEYCODE_META_RIGHT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_FUNCTION */\n    SDL_SCANCODE_PRINTSCREEN, /* AKEYCODE_SYSRQ */\n    SDL_SCANCODE_PAUSE, /* AKEYCODE_BREAK */\n    SDL_SCANCODE_HOME, /* AKEYCODE_MOVE_HOME */\n    SDL_SCANCODE_END, /* AKEYCODE_MOVE_END */\n    SDL_SCANCODE_INSERT, /* AKEYCODE_INSERT */\n    SDL_SCANCODE_AC_FORWARD, /* AKEYCODE_FORWARD */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_PLAY */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_PAUSE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_CLOSE */\n    SDL_SCANCODE_EJECT, /* AKEYCODE_MEDIA_EJECT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_RECORD */\n    SDL_SCANCODE_F1, /* AKEYCODE_F1 */\n    SDL_SCANCODE_F2, /* AKEYCODE_F2 */\n    SDL_SCANCODE_F3, /* AKEYCODE_F3 */\n    SDL_SCANCODE_F4, /* AKEYCODE_F4 */\n    SDL_SCANCODE_F5, /* AKEYCODE_F5 */\n    SDL_SCANCODE_F6, /* AKEYCODE_F6 */\n    SDL_SCANCODE_F7, /* AKEYCODE_F7 */\n    SDL_SCANCODE_F8, /* AKEYCODE_F8 */\n    SDL_SCANCODE_F9, /* AKEYCODE_F9 */\n    SDL_SCANCODE_F10, /* AKEYCODE_F10 */\n    SDL_SCANCODE_F11, /* AKEYCODE_F11 */\n    SDL_SCANCODE_F12, /* AKEYCODE_F12 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NUM_LOCK */\n    SDL_SCANCODE_KP_0, /* AKEYCODE_NUMPAD_0 */\n    SDL_SCANCODE_KP_1, /* AKEYCODE_NUMPAD_1 */\n    SDL_SCANCODE_KP_2, /* AKEYCODE_NUMPAD_2 */\n    SDL_SCANCODE_KP_3, /* AKEYCODE_NUMPAD_3 */\n    SDL_SCANCODE_KP_4, /* AKEYCODE_NUMPAD_4 */\n    SDL_SCANCODE_KP_5, /* AKEYCODE_NUMPAD_5 */\n    SDL_SCANCODE_KP_6, /* AKEYCODE_NUMPAD_6 */\n    SDL_SCANCODE_KP_7, /* AKEYCODE_NUMPAD_7 */\n    SDL_SCANCODE_KP_8, /* AKEYCODE_NUMPAD_8 */\n    SDL_SCANCODE_KP_9, /* AKEYCODE_NUMPAD_9 */\n    SDL_SCANCODE_KP_DIVIDE, /* AKEYCODE_NUMPAD_DIVIDE */\n    SDL_SCANCODE_KP_MULTIPLY, /* AKEYCODE_NUMPAD_MULTIPLY */\n    SDL_SCANCODE_KP_MINUS, /* AKEYCODE_NUMPAD_SUBTRACT */\n    SDL_SCANCODE_KP_PLUS, /* AKEYCODE_NUMPAD_ADD */\n    SDL_SCANCODE_KP_PERIOD, /* AKEYCODE_NUMPAD_DOT */\n    SDL_SCANCODE_KP_COMMA, /* AKEYCODE_NUMPAD_COMMA */\n    SDL_SCANCODE_KP_ENTER, /* AKEYCODE_NUMPAD_ENTER */\n    SDL_SCANCODE_KP_EQUALS, /* AKEYCODE_NUMPAD_EQUALS */\n    SDL_SCANCODE_KP_LEFTPAREN, /* AKEYCODE_NUMPAD_LEFT_PAREN */\n    SDL_SCANCODE_KP_RIGHTPAREN, /* AKEYCODE_NUMPAD_RIGHT_PAREN */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_VOLUME_MUTE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_INFO */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CHANNEL_UP */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CHANNEL_DOWN */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ZOOM_IN */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ZOOM_OUT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_WINDOW */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_GUIDE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DVR */\n    SDL_SCANCODE_AC_BOOKMARKS, /* AKEYCODE_BOOKMARK */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CAPTIONS */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SETTINGS */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_POWER */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STB_POWER */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STB_INPUT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_AVR_POWER */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_AVR_INPUT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_RED */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_GREEN */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_YELLOW */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_BLUE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_APP_SWITCH */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_1 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_2 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_3 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_4 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_5 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_6 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_7 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_8 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_9 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_10 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_11 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_12 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_13 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_14 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_15 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_16 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_LANGUAGE_SWITCH */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MANNER_MODE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_3D_MODE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CONTACTS */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CALENDAR */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MUSIC */\n    SDL_SCANCODE_CALCULATOR, /* AKEYCODE_CALCULATOR */\n    SDL_SCANCODE_LANG5, /* AKEYCODE_ZENKAKU_HANKAKU */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_EISU */\n    SDL_SCANCODE_INTERNATIONAL5, /* AKEYCODE_MUHENKAN */\n    SDL_SCANCODE_INTERNATIONAL4, /* AKEYCODE_HENKAN */\n    SDL_SCANCODE_LANG3, /* AKEYCODE_KATAKANA_HIRAGANA */\n    SDL_SCANCODE_INTERNATIONAL3, /* AKEYCODE_YEN */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_RO */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_KANA */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ASSIST */\n    SDL_SCANCODE_BRIGHTNESSDOWN, /* AKEYCODE_BRIGHTNESS_DOWN */\n    SDL_SCANCODE_BRIGHTNESSUP, /* AKEYCODE_BRIGHTNESS_UP */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_AUDIO_TRACK */\n    SDL_SCANCODE_SLEEP, /* AKEYCODE_SLEEP */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_WAKEUP */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PAIRING */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_TOP_MENU */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_11 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_12 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_LAST_CHANNEL */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_DATA_SERVICE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_VOICE_ASSIST */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_RADIO_SERVICE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_TELETEXT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_NUMBER_ENTRY */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_TERRESTRIAL_ANALOG */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_TERRESTRIAL_DIGITAL */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_SATELLITE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_SATELLITE_BS */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_SATELLITE_CS */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_SATELLITE_SERVICE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_NETWORK */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_ANTENNA_CABLE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_HDMI_1 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_HDMI_2 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_HDMI_3 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_HDMI_4 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_COMPOSITE_1 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_COMPOSITE_2 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_COMPONENT_1 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_COMPONENT_2 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT_VGA_1 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_AUDIO_DESCRIPTION */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_ZOOM_MODE */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_CONTENTS_MENU */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_MEDIA_CONTEXT_MENU */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_TIMER_PROGRAMMING */\n    SDL_SCANCODE_HELP, /* AKEYCODE_HELP */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NAVIGATE_PREVIOUS */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NAVIGATE_NEXT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NAVIGATE_IN */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NAVIGATE_OUT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STEM_PRIMARY */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STEM_1 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STEM_2 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STEM_3 */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DPAD_UP_LEFT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DPAD_DOWN_LEFT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DPAD_UP_RIGHT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DPAD_DOWN_RIGHT */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_SKIP_FORWARD */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_SKIP_BACKWARD */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_STEP_FORWARD */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_STEP_BACKWARD */\n    SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SOFT_SLEEP */\n    SDL_SCANCODE_CUT, /* AKEYCODE_CUT */\n    SDL_SCANCODE_COPY, /* AKEYCODE_COPY */\n    SDL_SCANCODE_PASTE, /* AKEYCODE_PASTE */\n};\n\nstatic SDL_Scancode\nTranslateKeycode(int keycode)\n{\n    SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN;\n\n    if (keycode < SDL_arraysize(Android_Keycodes)) {\n        scancode = Android_Keycodes[keycode];\n    }\n    if (scancode == SDL_SCANCODE_UNKNOWN) {\n        __android_log_print(ANDROID_LOG_INFO, \"SDL\", \"Unknown keycode %d\", keycode);\n    }\n    return scancode;\n}\n\nint\nAndroid_OnKeyDown(int keycode)\n{\n    return SDL_SendKeyboardKey(SDL_PRESSED, TranslateKeycode(keycode));\n}\n\nint\nAndroid_OnKeyUp(int keycode)\n{\n    return SDL_SendKeyboardKey(SDL_RELEASED, TranslateKeycode(keycode));\n}\n\nSDL_bool\nAndroid_HasScreenKeyboardSupport(_THIS)\n{\n    return SDL_TRUE;\n}\n\nSDL_bool\nAndroid_IsScreenKeyboardShown(_THIS, SDL_Window * window)\n{\n    return SDL_IsTextInputActive();\n}\n\nvoid\nAndroid_StartTextInput(_THIS)\n{\n    SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;\n    Android_JNI_ShowTextInput(&videodata->textRect);\n}\n\nvoid\nAndroid_StopTextInput(_THIS)\n{\n    Android_JNI_HideTextInput();\n}\n\nvoid\nAndroid_SetTextInputRect(_THIS, SDL_Rect *rect)\n{\n    SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;\n\n    if (!rect) {\n        SDL_InvalidParamError(\"rect\");\n        return;\n    }\n\n    videodata->textRect = *rect;\n}\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidkeyboard.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#include \"SDL_androidvideo.h\"\n\nextern void Android_InitKeyboard(void);\nextern int Android_OnKeyDown(int keycode);\nextern int Android_OnKeyUp(int keycode);\n\nextern SDL_bool Android_HasScreenKeyboardSupport(_THIS);\nextern SDL_bool Android_IsScreenKeyboardShown(_THIS, SDL_Window * window);\n\nextern void Android_StartTextInput(_THIS);\nextern void Android_StopTextInput(_THIS);\nextern void Android_SetTextInputRect(_THIS, SDL_Rect *rect);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidmessagebox.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\n#include \"SDL_messagebox.h\"\n\nint\nAndroid_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)\n{\n    int Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid);\n\n    return Android_JNI_ShowMessageBox(messageboxdata, buttonid);\n}\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidmessagebox.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\nextern int Android_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid);\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidmouse.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\n#include \"SDL_androidmouse.h\"\n\n#include \"SDL_events.h\"\n#include \"../../events/SDL_mouse_c.h\"\n\n#include \"../../core/android/SDL_android.h\"\n\n#define ACTION_DOWN 0\n#define ACTION_UP 1\n#define ACTION_MOVE 2\n#define ACTION_HOVER_MOVE 7\n#define ACTION_SCROLL 8\n#define BUTTON_PRIMARY 1\n#define BUTTON_SECONDARY 2\n#define BUTTON_TERTIARY 4\n#define BUTTON_BACK 8\n#define BUTTON_FORWARD 16\n\nstatic Uint8 SDLButton;\n\nvoid\nAndroid_InitMouse(void)\n{\n    SDLButton = 0;\n}\n\nvoid Android_OnMouse( int androidButton, int action, float x, float y) {\n    if (!Android_Window) {\n        return;\n    }\n\n    switch(action) {\n        case ACTION_DOWN:\n            // Determine which button originated the event, and store it for ACTION_UP\n            SDLButton = SDL_BUTTON_LEFT;\n            if (androidButton == BUTTON_SECONDARY) {\n                SDLButton = SDL_BUTTON_RIGHT;\n            } else if (androidButton == BUTTON_TERTIARY) {\n                SDLButton = SDL_BUTTON_MIDDLE;\n            } else if (androidButton == BUTTON_FORWARD) {\n                SDLButton = SDL_BUTTON_X1;\n            } else if (androidButton == BUTTON_BACK) {\n                SDLButton = SDL_BUTTON_X2;\n            }\n            SDL_SendMouseMotion(Android_Window, 0, 0, x, y);\n            SDL_SendMouseButton(Android_Window, 0, SDL_PRESSED, SDLButton);\n            break;\n\n        case ACTION_UP:\n            // Android won't give us the button that originated the ACTION_DOWN event, so we'll\n            // assume it's the one we stored\n            SDL_SendMouseMotion(Android_Window, 0, 0, x, y);\n            SDL_SendMouseButton(Android_Window, 0, SDL_RELEASED, SDLButton);\n            break;\n\n        case ACTION_MOVE:\n        case ACTION_HOVER_MOVE:\n            SDL_SendMouseMotion(Android_Window, 0, 0, x, y);\n            break;\n\n        case ACTION_SCROLL:\n            SDL_SendMouseWheel(Android_Window, 0, x, y, SDL_MOUSEWHEEL_NORMAL);\n            break;\n\n        default:\n            break;\n    }\n}\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidmouse.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef _SDL_androidmouse_h\n#define _SDL_androidmouse_h\n\n#include \"SDL_androidvideo.h\"\n\nextern void Android_InitMouse(void);\nextern void Android_OnMouse( int button, int action, float x, float y);\n\n#endif /* _SDL_androidmouse_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidtouch.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\n#include <android/log.h>\n\n#include \"SDL_hints.h\"\n#include \"SDL_events.h\"\n#include \"SDL_log.h\"\n#include \"SDL_androidtouch.h\"\n#include \"../../events/SDL_mouse_c.h\"\n#include \"../../events/SDL_touch_c.h\"\n#include \"../../core/android/SDL_android.h\"\n\n#define ACTION_DOWN 0\n#define ACTION_UP 1\n#define ACTION_MOVE 2\n#define ACTION_CANCEL 3\n#define ACTION_OUTSIDE 4\n#define ACTION_POINTER_DOWN 5\n#define ACTION_POINTER_UP 6\n\nstatic void Android_GetWindowCoordinates(float x, float y,\n                                         int *window_x, int *window_y)\n{\n    int window_w, window_h;\n\n    SDL_GetWindowSize(Android_Window, &window_w, &window_h);\n    *window_x = (int)(x * window_w);\n    *window_y = (int)(y * window_h);\n}\n\nstatic SDL_bool separate_mouse_and_touch = SDL_FALSE;\n\nstatic void\nSeparateEventsHintWatcher(void *userdata, const char *name,\n                          const char *oldValue, const char *newValue)\n{\n    jclass mActivityClass = Android_JNI_GetActivityClass();\n    JNIEnv *env = Android_JNI_GetEnv();\n    jfieldID fid = (*env)->GetStaticFieldID(env, mActivityClass, \"mSeparateMouseAndTouch\", \"Z\");\n\n    separate_mouse_and_touch = (newValue && (SDL_strcmp(newValue, \"1\") == 0));\n    (*env)->SetStaticBooleanField(env, mActivityClass, fid, separate_mouse_and_touch ? JNI_TRUE : JNI_FALSE);\n}\n\nvoid Android_InitTouch(void)\n{\n    int i;\n    int* ids;\n    const int number = Android_JNI_GetTouchDeviceIds(&ids);\n\n    SDL_AddHintCallback(SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH,\n                        SeparateEventsHintWatcher, NULL);\n\n    if (0 < number) {\n        for (i = 0; i < number; ++i) {\n            SDL_AddTouch((SDL_TouchID) ids[i], \"\"); /* no error handling */\n        }\n        SDL_free(ids);\n    }\n}\n\nvoid Android_QuitTouch(void)\n{\n    SDL_DelHintCallback(SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH,\n                        SeparateEventsHintWatcher, NULL);\n    separate_mouse_and_touch = SDL_FALSE;\n}\n\nvoid Android_OnTouch(int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p)\n{\n    SDL_TouchID touchDeviceId = 0;\n    SDL_FingerID fingerId = 0;\n    int window_x, window_y;\n    static SDL_FingerID pointerFingerID = 0;\n\n    if (!Android_Window) {\n        return;\n    }\n\n    touchDeviceId = (SDL_TouchID)touch_device_id_in;\n    if (SDL_AddTouch(touchDeviceId, \"\") < 0) {\n        SDL_Log(\"error: can't add touch %s, %d\", __FILE__, __LINE__);\n    }\n\n    fingerId = (SDL_FingerID)pointer_finger_id_in;\n    switch (action) {\n        case ACTION_DOWN:\n            /* Primary pointer down */\n            if (!separate_mouse_and_touch) {\n                Android_GetWindowCoordinates(x, y, &window_x, &window_y);\n                /* send moved event */\n                SDL_SendMouseMotion(Android_Window, SDL_TOUCH_MOUSEID, 0, window_x, window_y);\n                /* send mouse down event */\n                SDL_SendMouseButton(Android_Window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT);\n            }\n            pointerFingerID = fingerId;\n        case ACTION_POINTER_DOWN:\n            /* Non primary pointer down */\n            SDL_SendTouch(touchDeviceId, fingerId, SDL_TRUE, x, y, p);\n            break;\n\n        case ACTION_MOVE:\n            if (!pointerFingerID) {\n                if (!separate_mouse_and_touch) {\n                    Android_GetWindowCoordinates(x, y, &window_x, &window_y);\n                    /* send moved event */\n                    SDL_SendMouseMotion(Android_Window, SDL_TOUCH_MOUSEID, 0, window_x, window_y);\n                }\n            }\n            SDL_SendTouchMotion(touchDeviceId, fingerId, x, y, p);\n            break;\n\n        case ACTION_UP:\n            /* Primary pointer up */\n            if (!separate_mouse_and_touch) {\n                /* send mouse up */\n                SDL_SendMouseButton(Android_Window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT);\n            }\n            pointerFingerID = (SDL_FingerID) 0;\n        case ACTION_POINTER_UP:\n            /* Non primary pointer up */\n            SDL_SendTouch(touchDeviceId, fingerId, SDL_FALSE, x, y, p);\n            break;\n\n        default:\n            break;\n    }\n}\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidtouch.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#include \"SDL_androidvideo.h\"\n\nextern void Android_InitTouch(void);\nextern void Android_QuitTouch(void);\nextern void Android_OnTouch( int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p);\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidvideo.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\n/* Android SDL video driver implementation\n*/\n\n#include \"SDL_video.h\"\n#include \"SDL_mouse.h\"\n#include \"../SDL_sysvideo.h\"\n#include \"../SDL_pixels_c.h\"\n#include \"../../events/SDL_events_c.h\"\n#include \"../../events/SDL_windowevents_c.h\"\n\n#include \"SDL_androidvideo.h\"\n#include \"SDL_androidclipboard.h\"\n#include \"SDL_androidevents.h\"\n#include \"SDL_androidkeyboard.h\"\n#include \"SDL_androidmouse.h\"\n#include \"SDL_androidtouch.h\"\n#include \"SDL_androidwindow.h\"\n\n#define ANDROID_VID_DRIVER_NAME \"Android\"\n\n/* Initialization/Query functions */\nstatic int Android_VideoInit(_THIS);\nstatic void Android_VideoQuit(_THIS);\n\n#include \"../SDL_egl_c.h\"\n/* GL functions (SDL_androidgl.c) */\nextern SDL_GLContext Android_GLES_CreateContext(_THIS, SDL_Window * window);\nextern int Android_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context);\nextern void Android_GLES_SwapWindow(_THIS, SDL_Window * window);\nextern int Android_GLES_LoadLibrary(_THIS, const char *path);\n#define Android_GLES_GetProcAddress SDL_EGL_GetProcAddress\n#define Android_GLES_UnloadLibrary SDL_EGL_UnloadLibrary\n#define Android_GLES_SetSwapInterval SDL_EGL_SetSwapInterval\n#define Android_GLES_GetSwapInterval SDL_EGL_GetSwapInterval\n#define Android_GLES_DeleteContext SDL_EGL_DeleteContext\n\n/* Android driver bootstrap functions */\n\n\n/* These are filled in with real values in Android_SetScreenResolution on init (before SDL_main()) */\nint Android_ScreenWidth = 0;\nint Android_ScreenHeight = 0;\nUint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN;\nint Android_ScreenRate = 0;\n\nSDL_sem *Android_PauseSem = NULL, *Android_ResumeSem = NULL;\n\n/* Currently only one window */\nSDL_Window *Android_Window = NULL;\n\nstatic int\nAndroid_Available(void)\n{\n    return 1;\n}\n\nstatic void\nAndroid_SuspendScreenSaver(_THIS)\n{\n    Android_JNI_SuspendScreenSaver(_this->suspend_screensaver);\n}\n\nstatic void\nAndroid_DeleteDevice(SDL_VideoDevice * device)\n{\n    SDL_free(device->driverdata);\n    SDL_free(device);\n}\n\nstatic SDL_VideoDevice *\nAndroid_CreateDevice(int devindex)\n{\n    SDL_VideoDevice *device;\n    SDL_VideoData *data;\n\n    /* Initialize all variables that we clean on shutdown */\n    device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));\n    if (!device) {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    data = (SDL_VideoData*) SDL_calloc(1, sizeof(SDL_VideoData));\n    if (!data) {\n        SDL_OutOfMemory();\n        SDL_free(device);\n        return NULL;\n    }\n\n    device->driverdata = data;\n\n    /* Set the function pointers */\n    device->VideoInit = Android_VideoInit;\n    device->VideoQuit = Android_VideoQuit;\n    device->PumpEvents = Android_PumpEvents;\n\n    device->CreateWindow = Android_CreateWindow;\n    device->SetWindowTitle = Android_SetWindowTitle;\n    device->DestroyWindow = Android_DestroyWindow;\n    device->GetWindowWMInfo = Android_GetWindowWMInfo;\n\n    device->free = Android_DeleteDevice;\n\n    /* GL pointers */\n    device->GL_LoadLibrary = Android_GLES_LoadLibrary;\n    device->GL_GetProcAddress = Android_GLES_GetProcAddress;\n    device->GL_UnloadLibrary = Android_GLES_UnloadLibrary;\n    device->GL_CreateContext = Android_GLES_CreateContext;\n    device->GL_MakeCurrent = Android_GLES_MakeCurrent;\n    device->GL_SetSwapInterval = Android_GLES_SetSwapInterval;\n    device->GL_GetSwapInterval = Android_GLES_GetSwapInterval;\n    device->GL_SwapWindow = Android_GLES_SwapWindow;\n    device->GL_DeleteContext = Android_GLES_DeleteContext;\n\n    /* Screensaver */\n    device->SuspendScreenSaver = Android_SuspendScreenSaver;\n\n    /* Text input */\n    device->StartTextInput = Android_StartTextInput;\n    device->StopTextInput = Android_StopTextInput;\n    device->SetTextInputRect = Android_SetTextInputRect;\n\n    /* Screen keyboard */\n    device->HasScreenKeyboardSupport = Android_HasScreenKeyboardSupport;\n    device->IsScreenKeyboardShown = Android_IsScreenKeyboardShown;\n\n    /* Clipboard */\n    device->SetClipboardText = Android_SetClipboardText;\n    device->GetClipboardText = Android_GetClipboardText;\n    device->HasClipboardText = Android_HasClipboardText;\n\n    return device;\n}\n\nVideoBootStrap Android_bootstrap = {\n    ANDROID_VID_DRIVER_NAME, \"SDL Android video driver\",\n    Android_Available, Android_CreateDevice\n};\n\n\nint\nAndroid_VideoInit(_THIS)\n{\n    SDL_DisplayMode mode;\n\n    mode.format = Android_ScreenFormat;\n    mode.w = Android_ScreenWidth;\n    mode.h = Android_ScreenHeight;\n    mode.refresh_rate = Android_ScreenRate;\n    mode.driverdata = NULL;\n    if (SDL_AddBasicVideoDisplay(&mode) < 0) {\n        return -1;\n    }\n\n    SDL_AddDisplayMode(&_this->displays[0], &mode);\n\n    Android_InitKeyboard();\n\n    Android_InitTouch();\n\n    Android_InitMouse();\n\n    /* We're done! */\n    return 0;\n}\n\nvoid\nAndroid_VideoQuit(_THIS)\n{\n    Android_QuitTouch();\n}\n\nvoid\nAndroid_SetScreenResolution(int width, int height, Uint32 format, float rate)\n{\n    Android_ScreenWidth = width;\n    Android_ScreenHeight = height;\n    Android_ScreenFormat = format;\n    Android_ScreenRate = rate;\n\n    /*\n      Update the resolution of the desktop mode, so that the window\n      can be properly resized. The screen resolution change can for\n      example happen when the Activity enters or exists immersive mode,\n      which can happen after VideoInit().\n    */\n    SDL_VideoDevice* device = SDL_GetVideoDevice();\n    if (device && device->num_displays > 0)\n    {\n        SDL_VideoDisplay* display = &device->displays[0];\n        display->desktop_mode.format = Android_ScreenFormat;\n        display->desktop_mode.w = Android_ScreenWidth;\n        display->desktop_mode.h = Android_ScreenHeight;\n        display->desktop_mode.refresh_rate  = Android_ScreenRate;\n    }\n\n    if (Android_Window) {\n        SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, width, height);\n\n        /* Force the current mode to match the resize otherwise the SDL_WINDOWEVENT_RESTORED event\n         * will fall back to the old mode */\n        SDL_VideoDisplay *display = SDL_GetDisplayForWindow(Android_Window);\n\n        display->current_mode.format = format;\n        display->current_mode.w = width;\n        display->current_mode.h = height;\n        display->current_mode.refresh_rate = rate;\n    }\n}\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidvideo.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef _SDL_androidvideo_h\n#define _SDL_androidvideo_h\n\n#include \"SDL_mutex.h\"\n#include \"SDL_rect.h\"\n#include \"../SDL_sysvideo.h\"\n\n/* Called by the JNI layer when the screen changes size or format */\nextern void Android_SetScreenResolution(int width, int height, Uint32 format, float rate);\n\n/* Private display data */\n\ntypedef struct SDL_VideoData\n{\n    SDL_Rect        textRect;\n} SDL_VideoData;\n\nextern int Android_ScreenWidth;\nextern int Android_ScreenHeight;\nextern Uint32 Android_ScreenFormat;\nextern SDL_sem *Android_PauseSem, *Android_ResumeSem;\nextern SDL_Window *Android_Window;\n\n\n#endif /* _SDL_androidvideo_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidwindow.c",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#if SDL_VIDEO_DRIVER_ANDROID\n\n#include \"SDL_syswm.h\"\n#include \"../SDL_sysvideo.h\"\n#include \"../../events/SDL_keyboard_c.h\"\n#include \"../../events/SDL_mouse_c.h\"\n\n#include \"SDL_androidvideo.h\"\n#include \"SDL_androidwindow.h\"\n\nint\nAndroid_CreateWindow(_THIS, SDL_Window * window)\n{\n    SDL_WindowData *data;\n    \n    if (Android_Window) {\n        return SDL_SetError(\"Android only supports one window\");\n    }\n    \n    Android_PauseSem = SDL_CreateSemaphore(0);\n    Android_ResumeSem = SDL_CreateSemaphore(0);\n\n    /* Adjust the window data to match the screen */\n    window->x = 0;\n    window->y = 0;\n    window->w = Android_ScreenWidth;\n    window->h = Android_ScreenHeight;\n\n    window->flags &= ~SDL_WINDOW_RESIZABLE;     /* window is NEVER resizeable */\n    window->flags |= SDL_WINDOW_FULLSCREEN;     /* window is always fullscreen */\n    window->flags &= ~SDL_WINDOW_HIDDEN;\n    window->flags |= SDL_WINDOW_SHOWN;          /* only one window on Android */\n    window->flags |= SDL_WINDOW_INPUT_FOCUS;    /* always has input focus */\n\n    /* One window, it always has focus */\n    SDL_SetMouseFocus(window);\n    SDL_SetKeyboardFocus(window);\n    \n    data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data));\n    if (!data) {\n        return SDL_OutOfMemory();\n    }\n    \n    data->native_window = Android_JNI_GetNativeWindow();\n    \n    if (!data->native_window) {\n        SDL_free(data);\n        return SDL_SetError(\"Could not fetch native window\");\n    }\n    \n    data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->native_window);\n\n    if (data->egl_surface == EGL_NO_SURFACE) {\n        ANativeWindow_release(data->native_window);\n        SDL_free(data);\n        return SDL_SetError(\"Could not create GLES window surface\");\n    }\n\n    window->driverdata = data;\n    Android_Window = window;\n    \n    return 0;\n}\n\nvoid\nAndroid_SetWindowTitle(_THIS, SDL_Window * window)\n{\n    Android_JNI_SetActivityTitle(window->title);\n}\n\nvoid\nAndroid_DestroyWindow(_THIS, SDL_Window * window)\n{\n    SDL_WindowData *data;\n    \n    if (window == Android_Window) {\n        Android_Window = NULL;\n        if (Android_PauseSem) SDL_DestroySemaphore(Android_PauseSem);\n        if (Android_ResumeSem) SDL_DestroySemaphore(Android_ResumeSem);\n        Android_PauseSem = NULL;\n        Android_ResumeSem = NULL;\n        \n        if(window->driverdata) {\n            data = (SDL_WindowData *) window->driverdata;\n            if (data->egl_surface != EGL_NO_SURFACE) {\n                SDL_EGL_DestroySurface(_this, data->egl_surface);\n            }\n            if (data->native_window) {\n                ANativeWindow_release(data->native_window);\n            }\n            SDL_free(window->driverdata);\n            window->driverdata = NULL;\n        }\n    }\n}\n\nSDL_bool\nAndroid_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)\n{\n    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;\n\n    if (info->version.major == SDL_MAJOR_VERSION &&\n        info->version.minor == SDL_MINOR_VERSION) {\n        info->subsystem = SDL_SYSWM_ANDROID;\n        info->info.android.window = data->native_window;\n        info->info.android.surface = data->egl_surface;\n        return SDL_TRUE;\n    } else {\n        SDL_SetError(\"Application not compiled with SDL %d.%d\\n\",\n                     SDL_MAJOR_VERSION, SDL_MINOR_VERSION);\n        return SDL_FALSE;\n    }\n}\n\n#endif /* SDL_VIDEO_DRIVER_ANDROID */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/android/SDL_androidwindow.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../../SDL_internal.h\"\n\n#ifndef _SDL_androidwindow_h\n#define _SDL_androidwindow_h\n\n#include \"../../core/android/SDL_android.h\"\n#include \"../SDL_egl_c.h\"\n\nextern int Android_CreateWindow(_THIS, SDL_Window * window);\nextern void Android_SetWindowTitle(_THIS, SDL_Window * window);\nextern void Android_DestroyWindow(_THIS, SDL_Window * window);\nextern SDL_bool Android_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo * info);\n\ntypedef struct\n{\n    EGLSurface egl_surface;\n    EGLContext egl_context; /* We use this to preserve the context when losing focus */\n    ANativeWindow* native_window;\n    \n} SDL_WindowData;\n\n#endif /* _SDL_androidwindow_h */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/SDL2/src/video/sdlgenblit.pl",
    "content": "#!/usr/bin/perl -w\n#\n# A script to generate optimized C blitters for Simple DirectMedia Layer\n# http://www.libsdl.org/\n\nuse warnings;\nuse strict;\n\nmy %file;\n\n# The formats potentially supported by this script:\n# SDL_PIXELFORMAT_RGB332\n# SDL_PIXELFORMAT_RGB444\n# SDL_PIXELFORMAT_RGB555\n# SDL_PIXELFORMAT_ARGB4444\n# SDL_PIXELFORMAT_ARGB1555\n# SDL_PIXELFORMAT_RGB565\n# SDL_PIXELFORMAT_RGB24\n# SDL_PIXELFORMAT_BGR24\n# SDL_PIXELFORMAT_RGB888\n# SDL_PIXELFORMAT_BGR888\n# SDL_PIXELFORMAT_ARGB8888\n# SDL_PIXELFORMAT_RGBA8888\n# SDL_PIXELFORMAT_ABGR8888\n# SDL_PIXELFORMAT_BGRA8888\n# SDL_PIXELFORMAT_ARGB2101010\n\n# The formats we're actually creating blitters for:\nmy @src_formats = (\n    \"RGB888\",\n    \"BGR888\",\n    \"ARGB8888\",\n    \"RGBA8888\",\n    \"ABGR8888\",\n    \"BGRA8888\",\n);\nmy @dst_formats = (\n    \"RGB888\",\n    \"BGR888\",\n    \"ARGB8888\",\n);\n\nmy %format_size = (\n    \"RGB888\" => 4,\n    \"BGR888\" => 4,\n    \"ARGB8888\" => 4,\n    \"RGBA8888\" => 4,\n    \"ABGR8888\" => 4,\n    \"BGRA8888\" => 4,\n);\n\nmy %format_type = (\n    \"RGB888\" => \"Uint32\",\n    \"BGR888\" => \"Uint32\",\n    \"ARGB8888\" => \"Uint32\",\n    \"RGBA8888\" => \"Uint32\",\n    \"ABGR8888\" => \"Uint32\",\n    \"BGRA8888\" => \"Uint32\",\n);\n\nmy %get_rgba_string_ignore_alpha = (\n    \"RGB888\" => \"_R = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _B = (Uint8)_pixel;\",\n    \"BGR888\" => \"_B = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _R = (Uint8)_pixel;\",\n    \"ARGB8888\" => \"_R = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _B = (Uint8)_pixel;\",\n    \"RGBA8888\" => \"_R = (Uint8)(_pixel >> 24); _G = (Uint8)(_pixel >> 16); _B = (Uint8)(_pixel >> 8);\",\n    \"ABGR8888\" => \"_B = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _R = (Uint8)_pixel;\",\n    \"BGRA8888\" => \"_B = (Uint8)(_pixel >> 24); _G = (Uint8)(_pixel >> 16); _R = (Uint8)(_pixel >> 8);\",\n);\n\nmy %get_rgba_string = (\n    \"RGB888\" => $get_rgba_string_ignore_alpha{\"RGB888\"} . \" _A = 0xFF;\",\n    \"BGR888\" => $get_rgba_string_ignore_alpha{\"BGR888\"} . \" _A = 0xFF;\",\n    \"ARGB8888\" => $get_rgba_string_ignore_alpha{\"ARGB8888\"} . \" _A = (Uint8)(_pixel >> 24);\",\n    \"RGBA8888\" => $get_rgba_string_ignore_alpha{\"RGBA8888\"} . \" _A = (Uint8)_pixel;\",\n    \"ABGR8888\" => $get_rgba_string_ignore_alpha{\"ABGR8888\"} . \" _A = (Uint8)(_pixel >> 24);\",\n    \"BGRA8888\" => $get_rgba_string_ignore_alpha{\"BGRA8888\"} . \" _A = (Uint8)_pixel;\",\n);\n\nmy %set_rgba_string = (\n    \"RGB888\" => \"_pixel = ((Uint32)_R << 16) | ((Uint32)_G << 8) | _B;\",\n    \"BGR888\" => \"_pixel = ((Uint32)_B << 16) | ((Uint32)_G << 8) | _R;\",\n    \"ARGB8888\" => \"_pixel = ((Uint32)_A << 24) | ((Uint32)_R << 16) | ((Uint32)_G << 8) | _B;\",\n    \"RGBA8888\" => \"_pixel = ((Uint32)_R << 24) | ((Uint32)_G << 16) | ((Uint32)_B << 8) | _A;\",\n    \"ABGR8888\" => \"_pixel = ((Uint32)_A << 24) | ((Uint32)_B << 16) | ((Uint32)_G << 8) | _R;\",\n    \"BGRA8888\" => \"_pixel = ((Uint32)_B << 24) | ((Uint32)_G << 16) | ((Uint32)_R << 8) | _A;\",\n);\n\nsub open_file {\n    my $name = shift;\n    open(FILE, \">$name.new\") || die \"Cant' open $name.new: $!\";\n    print FILE <<__EOF__;\n/* DO NOT EDIT!  This file is generated by sdlgenblit.pl */\n/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2016 Sam Lantinga <slouken\\@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"../SDL_internal.h\"\n\n/* *INDENT-OFF* */\n\n__EOF__\n}\n\nsub close_file {\n    my $name = shift;\n    print FILE <<__EOF__;\n/* *INDENT-ON* */\n\n/* vi: set ts=4 sw=4 expandtab: */\n__EOF__\n    close FILE;\n    if ( ! -f $name || system(\"cmp -s $name $name.new\") != 0 ) {\n        rename(\"$name.new\", \"$name\");\n    } else {\n        unlink(\"$name.new\");\n    }\n}\n\nsub output_copydefs\n{\n    print FILE <<__EOF__;\nextern SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[];\n__EOF__\n}\n\nsub output_copyfuncname\n{\n    my $prefix = shift;\n    my $src = shift;\n    my $dst = shift;\n    my $modulate = shift;\n    my $blend = shift;\n    my $scale = shift;\n    my $args = shift;\n    my $suffix = shift;\n\n    print FILE \"$prefix SDL_Blit_${src}_${dst}\";\n    if ( $modulate ) {\n        print FILE \"_Modulate\";\n    }\n    if ( $blend ) {\n        print FILE \"_Blend\";\n    }\n    if ( $scale ) {\n        print FILE \"_Scale\";\n    }\n    if ( $args ) {\n        print FILE \"(SDL_BlitInfo *info)\";\n    }\n    print FILE \"$suffix\";\n}\n\nsub get_rgba\n{\n    my $prefix = shift;\n    my $format = shift;\n    my $ignore_alpha = shift;\n\n    my $string;\n    if ($ignore_alpha) {\n        $string = $get_rgba_string_ignore_alpha{$format};\n    } else {\n        $string = $get_rgba_string{$format};\n    }\n\n    $string =~ s/_/$prefix/g;\n    if ( $prefix ne \"\" ) {\n        print FILE <<__EOF__;\n            ${prefix}pixel = *$prefix;\n__EOF__\n    } else {\n        print FILE <<__EOF__;\n            pixel = *src;\n__EOF__\n    }\n    print FILE <<__EOF__;\n            $string\n__EOF__\n}\n\nsub set_rgba\n{\n    my $prefix = shift;\n    my $format = shift;\n    my $string = $set_rgba_string{$format};\n    $string =~ s/_/$prefix/g;\n    print FILE <<__EOF__;\n            $string\n            *dst = ${prefix}pixel;\n__EOF__\n}\n\nsub output_copycore\n{\n    my $src = shift;\n    my $dst = shift;\n    my $modulate = shift;\n    my $blend = shift;\n    my $s = \"\";\n    my $d = \"\";\n\n    # Nice and easy...\n    if ( $src eq $dst && !$modulate && !$blend ) {\n        print FILE <<__EOF__;\n            *dst = *src;\n__EOF__\n        return;\n    }\n\n    my $dst_has_alpha = ($dst =~ /A/) ? 1 : 0;\n    my $ignore_dst_alpha = !$dst_has_alpha && !$blend;\n\n    if ( $blend ) {\n        get_rgba(\"src\", $src, $ignore_dst_alpha);\n        get_rgba(\"dst\", $dst, !$dst_has_alpha);\n        $s = \"src\";\n        $d = \"dst\";\n    } else {\n        get_rgba(\"\", $src, $ignore_dst_alpha);\n    }\n\n    if ( $modulate ) {\n        print FILE <<__EOF__;\n            if (flags & SDL_COPY_MODULATE_COLOR) {\n                ${s}R = (${s}R * modulateR) / 255;\n                ${s}G = (${s}G * modulateG) / 255;\n                ${s}B = (${s}B * modulateB) / 255;\n            }\n__EOF__\n        if (not $ignore_dst_alpha) {\n            print FILE <<__EOF__;\n            if (flags & SDL_COPY_MODULATE_ALPHA) {\n                ${s}A = (${s}A * modulateA) / 255;\n            }\n__EOF__\n        }\n    }\n    if ( $blend ) {\n        print FILE <<__EOF__;\n            if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) {\n                /* This goes away if we ever use premultiplied alpha */\n                if (${s}A < 255) {\n                    ${s}R = (${s}R * ${s}A) / 255;\n                    ${s}G = (${s}G * ${s}A) / 255;\n                    ${s}B = (${s}B * ${s}A) / 255;\n                }\n            }\n            switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) {\n            case SDL_COPY_BLEND:\n                ${d}R = ${s}R + ((255 - ${s}A) * ${d}R) / 255;\n                ${d}G = ${s}G + ((255 - ${s}A) * ${d}G) / 255;\n                ${d}B = ${s}B + ((255 - ${s}A) * ${d}B) / 255;\n__EOF__\n\n        if ( $dst_has_alpha ) {\n            print FILE <<__EOF__;\n                ${d}A = ${s}A + ((255 - ${s}A) * ${d}A) / 255;\n__EOF__\n        }\n\n        print FILE <<__EOF__;\n                break;\n            case SDL_COPY_ADD:\n                ${d}R = ${s}R + ${d}R; if (${d}R > 255) ${d}R = 255;\n                ${d}G = ${s}G + ${d}G; if (${d}G > 255) ${d}G = 255;\n                ${d}B = ${s}B + ${d}B; if (${d}B > 255) ${d}B = 255;\n                break;\n            case SDL_COPY_MOD:\n                ${d}R = (${s}R * ${d}R) / 255;\n                ${d}G = (${s}G * ${d}G) / 255;\n                ${d}B = (${s}B * ${d}B) / 255;\n                break;\n            }\n__EOF__\n    }\n    if ( $blend ) {\n        set_rgba(\"dst\", $dst);\n    } else {\n        set_rgba(\"\", $dst);\n    }\n}\n\nsub output_copyfunc\n{\n    my $src = shift;\n    my $dst = shift;\n    my $modulate = shift;\n    my $blend = shift;\n    my $scale = shift;\n\n    my $dst_has_alpha = ($dst =~ /A/) ? 1 : 0;\n    my $ignore_dst_alpha = !$dst_has_alpha && !$blend;\n\n    output_copyfuncname(\"static void\", $src, $dst, $modulate, $blend, $scale, 1, \"\\n\");\n    print FILE <<__EOF__;\n{\n__EOF__\n    if ( $modulate || $blend ) {\n        print FILE <<__EOF__;\n    const int flags = info->flags;\n__EOF__\n    }\n    if ( $modulate ) {\n        print FILE <<__EOF__;\n    const Uint32 modulateR = info->r;\n    const Uint32 modulateG = info->g;\n    const Uint32 modulateB = info->b;\n__EOF__\n        if (!$ignore_dst_alpha) {\n            print FILE <<__EOF__;\n    const Uint32 modulateA = info->a;\n__EOF__\n        }\n    }\n    if ( $blend ) {\n        print FILE <<__EOF__;\n    Uint32 srcpixel;\n    Uint32 srcR, srcG, srcB, srcA;\n    Uint32 dstpixel;\n__EOF__\n        if ($dst_has_alpha) {\n            print FILE <<__EOF__;\n    Uint32 dstR, dstG, dstB, dstA;\n__EOF__\n        } else {\n            print FILE <<__EOF__;\n    Uint32 dstR, dstG, dstB;\n__EOF__\n        }\n    } elsif ( $modulate || $src ne $dst ) {\n        print FILE <<__EOF__;\n    Uint32 pixel;\n__EOF__\n        if (!$ignore_dst_alpha) {\n            print FILE <<__EOF__;\n    Uint32 R, G, B, A;\n__EOF__\n        } else {\n            print FILE <<__EOF__;\n    Uint32 R, G, B;\n__EOF__\n        }\n    }\n    if ( $scale ) {\n        print FILE <<__EOF__;\n    int srcy, srcx;\n    int posy, posx;\n    int incy, incx;\n__EOF__\n\n    print FILE <<__EOF__;\n\n    srcy = 0;\n    posy = 0;\n    incy = (info->src_h << 16) / info->dst_h;\n    incx = (info->src_w << 16) / info->dst_w;\n\n    while (info->dst_h--) {\n        $format_type{$src} *src = 0;\n        $format_type{$dst} *dst = ($format_type{$dst} *)info->dst;\n        int n = info->dst_w;\n        srcx = -1;\n        posx = 0x10000L;\n        while (posy >= 0x10000L) {\n            ++srcy;\n            posy -= 0x10000L;\n        }\n        while (n--) {\n            if (posx >= 0x10000L) {\n                while (posx >= 0x10000L) {\n                    ++srcx;\n                    posx -= 0x10000L;\n                }\n                src = ($format_type{$src} *)(info->src + (srcy * info->src_pitch) + (srcx * $format_size{$src}));\n__EOF__\n        print FILE <<__EOF__;\n            }\n__EOF__\n        output_copycore($src, $dst, $modulate, $blend);\n        print FILE <<__EOF__;\n            posx += incx;\n            ++dst;\n        }\n        posy += incy;\n        info->dst += info->dst_pitch;\n    }\n__EOF__\n    } else {\n        print FILE <<__EOF__;\n\n    while (info->dst_h--) {\n        $format_type{$src} *src = ($format_type{$src} *)info->src;\n        $format_type{$dst} *dst = ($format_type{$dst} *)info->dst;\n        int n = info->dst_w;\n        while (n--) {\n__EOF__\n        output_copycore($src, $dst, $modulate, $blend);\n        print FILE <<__EOF__;\n            ++src;\n            ++dst;\n        }\n        info->src += info->src_pitch;\n        info->dst += info->dst_pitch;\n    }\n__EOF__\n    }\n    print FILE <<__EOF__;\n}\n\n__EOF__\n}\n\nsub output_copyfunc_h\n{\n}\n\nsub output_copyinc\n{\n    print FILE <<__EOF__;\n#include \"SDL_video.h\"\n#include \"SDL_blit.h\"\n#include \"SDL_blit_auto.h\"\n\n__EOF__\n}\n\nsub output_copyfunctable\n{\n    print FILE <<__EOF__;\nSDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[] = {\n__EOF__\n    for (my $i = 0; $i <= $#src_formats; ++$i) {\n        my $src = $src_formats[$i];\n        for (my $j = 0; $j <= $#dst_formats; ++$j) {\n            my $dst = $dst_formats[$j];\n            for (my $modulate = 0; $modulate <= 1; ++$modulate) {\n                for (my $blend = 0; $blend <= 1; ++$blend) {\n                    for (my $scale = 0; $scale <= 1; ++$scale) {\n                        if ( $modulate || $blend || $scale ) {\n                            print FILE \"    { SDL_PIXELFORMAT_$src, SDL_PIXELFORMAT_$dst, \";\n                            my $flags = \"\";\n                            my $flag = \"\";\n                            if ( $modulate ) {\n                                $flag = \"SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA\";\n                                if ( $flags eq \"\" ) {\n                                    $flags = $flag;\n                                } else {\n                                    $flags = \"$flags | $flag\";\n                                }\n                            }\n                            if ( $blend ) {\n                                $flag = \"SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD\";\n                                if ( $flags eq \"\" ) {\n                                    $flags = $flag;\n                                } else {\n                                    $flags = \"$flags | $flag\";\n                                }\n                            }\n                            if ( $scale ) {\n                                $flag = \"SDL_COPY_NEAREST\";\n                                if ( $flags eq \"\" ) {\n                                    $flags = $flag;\n                                } else {\n                                    $flags = \"$flags | $flag\";\n                                }\n                            }\n                            if ( $flags eq \"\" ) {\n                                $flags = \"0\";\n                            }\n                            print FILE \"($flags), SDL_CPU_ANY,\";\n                            output_copyfuncname(\"\", $src_formats[$i], $dst_formats[$j], $modulate, $blend, $scale, 0, \" },\\n\");\n                        }\n                    }\n                }\n            }\n        }\n    }\n    print FILE <<__EOF__;\n    { 0, 0, 0, 0, NULL }\n};\n\n__EOF__\n}\n\nsub output_copyfunc_c\n{\n    my $src = shift;\n    my $dst = shift;\n\n    for (my $modulate = 0; $modulate <= 1; ++$modulate) {\n        for (my $blend = 0; $blend <= 1; ++$blend) {\n            for (my $scale = 0; $scale <= 1; ++$scale) {\n                if ( $modulate || $blend || $scale ) {\n                    output_copyfunc($src, $dst, $modulate, $blend, $scale);\n                }\n            }\n        }\n    }\n}\n\nopen_file(\"SDL_blit_auto.h\");\noutput_copydefs();\nfor (my $i = 0; $i <= $#src_formats; ++$i) {\n    for (my $j = 0; $j <= $#dst_formats; ++$j) {\n        output_copyfunc_h($src_formats[$i], $dst_formats[$j]);\n    }\n}\nprint FILE \"\\n\";\nclose_file(\"SDL_blit_auto.h\");\n\nopen_file(\"SDL_blit_auto.c\");\noutput_copyinc();\nfor (my $i = 0; $i <= $#src_formats; ++$i) {\n    for (my $j = 0; $j <= $#dst_formats; ++$j) {\n        output_copyfunc_c($src_formats[$i], $dst_formats[$j]);\n    }\n}\noutput_copyfunctable();\nclose_file(\"SDL_blit_auto.c\");\n"
  },
  {
    "path": "libs/SDL2_gfx/CMakeLists.txt",
    "content": "\ncmake_minimum_required(VERSION 3.4.1)\nproject(SDL2_gfx)\n\n\nfind_library( # Sets the name of the path variable.\n        GLESv1_CM\n\n        GLESv1_CM )\n\nfind_library(\n        GLESv2\n        GLESv2\n)\n\nfind_library(\n        android\n        android\n)\n\nfind_library(\n        z\n        z\n)\n\nfind_library(\n        log\n        log\n)\n\ninclude_directories(include)\n\nadd_definitions(-DGL_GLEXT_PROTOTYPES)\n\nadd_library( # Sets the name of the library.\n        SDL2_gfx\n\n        # Sets the library as a shared library.\n        SHARED\n\n        src/SDL2_framerate.c\n        src/SDL2_gfxPrimitives.c\n        src/SDL2_rotozoom.c\n        src/SDL2_imageFilter.c\n        )\n\n\ntarget_link_libraries(\n        SDL2_gfx\n        SDL2\n        GLESv1_CM\n        GLESv2\n        android\n        z\n        log\n)"
  },
  {
    "path": "libs/SDL2_gfx/build.gradle",
    "content": "apply plugin: 'com.android.model.native'\n\ndef lib_distribution_root = '../distribution'\nmodel {\n\n    android {\n        compileSdkVersion = gradle.sdkVersion\n        buildToolsVersion = gradle.buildToolsVersion\n\n        defaultConfig {\n            minSdkVersion.apiLevel = 13\n            targetSdkVersion.apiLevel = gradle.sdkVersion\n            versionCode = 1\n            versionName = '1.0'\n        }\n        ndk {\n            moduleName = 'SDL2_gfx'\n            ldLibs.addAll([\"GLESv1_CM\", \"EGL\", \"GLESv2\", \"log\", \"android\", \"dl\"])\n            CFlags.addAll([\"-DGL_GLEXT_PROTOTYPES\"])\n            CFlags.addAll([\"-I\" + file(\"include/\").absolutePath,\"-DGL_GLEXT_PROTOTYPES\"])\n        }\n\n        sources {\n            main {\n                jni {\n                    dependencies {\n                        project ':SDL2' linkage 'shared'\n                    }\n                    exportedHeaders {\n                        srcDir \"../SDL2/include\"\n                    }\n                    source {\n                        srcDir \"src\"\n                    }\n                }\n            }\n        }\n\n    }\n}\n\n// This is just copy out the header file and built lib into distribution\n// directory for clint application to use; it is a small overhead of this sample:\n//    both lib and app are put inside one project space [save maintenance time]\ntask(distributeLib, type : Copy) {\n    // trigger build library\n    dependsOn assemble\n    into '../distribution/SDL2_gfx/'\n    from('build/outputs/native/release/lib') {\n        into 'lib/'\n    }\n}\n"
  },
  {
    "path": "libs/SDL2_gfx/cmake_install.cmake",
    "content": "# Install script for directory: C:/is-Engine/libs/SDL2_gfx\n\n# Set the install prefix\nif(NOT DEFINED CMAKE_INSTALL_PREFIX)\n  set(CMAKE_INSTALL_PREFIX \"C:/Program Files (x86)/Project\")\nendif()\nstring(REGEX REPLACE \"/$\" \"\" CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")\n\n# Set the install configuration name.\nif(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)\n  if(BUILD_TYPE)\n    string(REGEX REPLACE \"^[^A-Za-z0-9_]+\" \"\"\n           CMAKE_INSTALL_CONFIG_NAME \"${BUILD_TYPE}\")\n  else()\n    set(CMAKE_INSTALL_CONFIG_NAME \"Release\")\n  endif()\n  message(STATUS \"Install configuration: \\\"${CMAKE_INSTALL_CONFIG_NAME}\\\"\")\nendif()\n\n# Set the component getting installed.\nif(NOT CMAKE_INSTALL_COMPONENT)\n  if(COMPONENT)\n    message(STATUS \"Install component: \\\"${COMPONENT}\\\"\")\n    set(CMAKE_INSTALL_COMPONENT \"${COMPONENT}\")\n  else()\n    set(CMAKE_INSTALL_COMPONENT)\n  endif()\nendif()\n\n# Install shared libraries without execute permission?\nif(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n  set(CMAKE_INSTALL_SO_NO_EXE \"0\")\nendif()\n\n# Is this installation the result of a crosscompile?\nif(NOT DEFINED CMAKE_CROSSCOMPILING)\n  set(CMAKE_CROSSCOMPILING \"TRUE\")\nendif()\n\n"
  },
  {
    "path": "libs/SDL2_gfx/include/SDL2_framerate.h",
    "content": "/*\n\nSDL2_framerate.h: framerate manager\n\nCopyright (C) 2012-2014  Andreas Schiffler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n\n#ifndef _SDL2_framerate_h\n#define _SDL2_framerate_h\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\t/* --- */\n\n#include \"SDL.h\"\n\n\t/* --------- Definitions */\n\n\t/*!\n\t\\brief Highest possible rate supported by framerate controller in Hz (1/s).\n\t*/\n#define FPS_UPPER_LIMIT\t\t200\n\n\t/*!\n\t\\brief Lowest possible rate supported by framerate controller in Hz (1/s).\n\t*/\n#define FPS_LOWER_LIMIT\t\t1\n\n\t/*!\n\t\\brief Default rate of framerate controller in Hz (1/s).\n\t*/\n#define FPS_DEFAULT\t\t30\n\n\t/*! \n\t\\brief Structure holding the state and timing information of the framerate controller. \n\t*/\n\ttypedef struct {\n\t\tUint32 framecount;\n\t\tfloat rateticks;\n\t\tUint32 baseticks;\n\t\tUint32 lastticks;\n\t\tUint32 rate;\n\t} FPSmanager;\n\n\t/* ---- Function Prototypes */\n\n#ifdef _MSC_VER\n#  if defined(DLL_EXPORT) && !defined(LIBSDL2_GFX_DLL_IMPORT)\n#    define SDL2_FRAMERATE_SCOPE __declspec(dllexport)\n#  else\n#    ifdef LIBSDL2_GFX_DLL_IMPORT\n#      define SDL2_FRAMERATE_SCOPE __declspec(dllimport)\n#    endif\n#  endif\n#endif\n#ifndef SDL2_FRAMERATE_SCOPE\n#  define SDL2_FRAMERATE_SCOPE extern\n#endif\n\n\t/* Functions return 0 or value for sucess and -1 for error */\n\n\tSDL2_FRAMERATE_SCOPE void SDL_initFramerate(FPSmanager * manager);\n\tSDL2_FRAMERATE_SCOPE int SDL_setFramerate(FPSmanager * manager, Uint32 rate);\n\tSDL2_FRAMERATE_SCOPE int SDL_getFramerate(FPSmanager * manager);\n\tSDL2_FRAMERATE_SCOPE int SDL_getFramecount(FPSmanager * manager);\n\tSDL2_FRAMERATE_SCOPE Uint32 SDL_framerateDelay(FPSmanager * manager);\n\n\t/* --- */\n\n\t/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n\n#endif\t\t\t\t/* _SDL2_framerate_h */\n"
  },
  {
    "path": "libs/SDL2_gfx/include/SDL2_gfxPrimitives.h",
    "content": "/* \n\nSDL2_gfxPrimitives.h: graphics primitives for SDL\n\nCopyright (C) 2012-2014  Andreas Schiffler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n\n#ifndef _SDL2_gfxPrimitives_h\n#define _SDL2_gfxPrimitives_h\n\n#include <math.h>\n#ifndef M_PI\n#define M_PI\t3.1415926535897932384626433832795\n#endif\n\n#include \"SDL.h\"\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\t/* ----- Versioning */\n\n#define SDL2_GFXPRIMITIVES_MAJOR\t1\n#define SDL2_GFXPRIMITIVES_MINOR\t0\n#define SDL2_GFXPRIMITIVES_MICRO\t4\n\n\n\t/* ---- Function Prototypes */\n\n#ifdef _MSC_VER\n#  if defined(DLL_EXPORT) && !defined(LIBSDL2_GFX_DLL_IMPORT)\n#    define SDL2_GFXPRIMITIVES_SCOPE __declspec(dllexport)\n#  else\n#    ifdef LIBSDL2_GFX_DLL_IMPORT\n#      define SDL2_GFXPRIMITIVES_SCOPE __declspec(dllimport)\n#    endif\n#  endif\n#endif\n#ifndef SDL2_GFXPRIMITIVES_SCOPE\n#  define SDL2_GFXPRIMITIVES_SCOPE extern\n#endif\n\n\t/* Note: all ___Color routines expect the color to be in format 0xRRGGBBAA */\n\n\t/* Pixel */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int pixelColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int pixelRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Horizontal line */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int hlineColor(SDL_Renderer * renderer, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int hlineRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 x2, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Vertical line */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int vlineColor(SDL_Renderer * renderer, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int vlineRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y1, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Rectangle */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int rectangleColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int rectangleRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1,\n\t\tSint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Rounded-Corner Rectangle */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int roundedRectangleColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int roundedRectangleRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1,\n\t\tSint16 x2, Sint16 y2, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Filled rectangle (Box) */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int boxColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int boxRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2,\n\t\tSint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Rounded-Corner Filled rectangle (Box) */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int roundedBoxColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int roundedBoxRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2,\n\t\tSint16 y2, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Line */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int lineColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int lineRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1,\n\t\tSint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* AA Line */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int aalineColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int aalineRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1,\n\t\tSint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Thick Line */\n\tSDL2_GFXPRIMITIVES_SCOPE int thickLineColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, \n\t\tUint8 width, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int thickLineRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, \n\t\tUint8 width, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Circle */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int circleColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int circleRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Arc */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int arcColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int arcRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, \n\t\tUint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* AA Circle */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int aacircleColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int aacircleRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y,\n\t\tSint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Filled Circle */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int filledCircleColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 r, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int filledCircleRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y,\n\t\tSint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Ellipse */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int ellipseColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int ellipseRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y,\n\t\tSint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* AA Ellipse */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int aaellipseColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int aaellipseRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y,\n\t\tSint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Filled Ellipse */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int filledEllipseColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int filledEllipseRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y,\n\t\tSint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Pie */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int pieColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad,\n\t\tSint16 start, Sint16 end, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int pieRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad,\n\t\tSint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Filled Pie */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int filledPieColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad,\n\t\tSint16 start, Sint16 end, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int filledPieRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad,\n\t\tSint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Trigon */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int trigonColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int trigonRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3,\n\t\tUint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* AA-Trigon */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int aatrigonColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int aatrigonRGBA(SDL_Renderer * renderer,  Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3,\n\t\tUint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Filled Trigon */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int filledTrigonColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int filledTrigonRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3,\n\t\tUint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Polygon */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int polygonColor(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int polygonRGBA(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy,\n\t\tint n, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* AA-Polygon */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int aapolygonColor(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int aapolygonRGBA(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy,\n\t\tint n, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Filled Polygon */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int filledPolygonColor(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int filledPolygonRGBA(SDL_Renderer * renderer, const Sint16 * vx,\n\t\tconst Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Textured Polygon */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int texturedPolygon(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, SDL_Surface * texture,int texture_dx,int texture_dy);\n\n\t/* Bezier */\n\n\tSDL2_GFXPRIMITIVES_SCOPE int bezierColor(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, int s, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int bezierRGBA(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy,\n\t\tint n, int s, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Characters/Strings */\n\n\tSDL2_GFXPRIMITIVES_SCOPE void gfxPrimitivesSetFont(const void *fontdata, Uint32 cw, Uint32 ch);\n\tSDL2_GFXPRIMITIVES_SCOPE void gfxPrimitivesSetFontRotation(Uint32 rotation);\n\tSDL2_GFXPRIMITIVES_SCOPE int characterColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, char c, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int characterRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, char c, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\tSDL2_GFXPRIMITIVES_SCOPE int stringColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, const char *s, Uint32 color);\n\tSDL2_GFXPRIMITIVES_SCOPE int stringRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, const char *s, Uint8 r, Uint8 g, Uint8 b, Uint8 a);\n\n\t/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n\n#endif\t\t\t\t/* _SDL2_gfxPrimitives_h */\n"
  },
  {
    "path": "libs/SDL2_gfx/include/SDL2_gfxPrimitives_font.h",
    "content": "/*\n\nSDL2_gfxPrimitives_font.h: 8x8 font definition\n\nCopyright (C) 2012-2014  Andreas Schiffler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n\n#define GFX_FONTDATAMAX (8*256)\n\nstatic unsigned char gfxPrimitivesFontdata[GFX_FONTDATAMAX] = {\n\n\t/*\n\t* 0 0x00 '^@' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 1 0x01 '^A' \n\t*/\n\t0x7e,\t\t\t/* 01111110 */\n\t0x81,\t\t\t/* 10000001 */\n\t0xa5,\t\t\t/* 10100101 */\n\t0x81,\t\t\t/* 10000001 */\n\t0xbd,\t\t\t/* 10111101 */\n\t0x99,\t\t\t/* 10011001 */\n\t0x81,\t\t\t/* 10000001 */\n\t0x7e,\t\t\t/* 01111110 */\n\n\t/*\n\t* 2 0x02 '^B' \n\t*/\n\t0x7e,\t\t\t/* 01111110 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xdb,\t\t\t/* 11011011 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xc3,\t\t\t/* 11000011 */\n\t0xe7,\t\t\t/* 11100111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x7e,\t\t\t/* 01111110 */\n\n\t/*\n\t* 3 0x03 '^C' \n\t*/\n\t0x6c,\t\t\t/* 01101100 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x10,\t\t\t/* 00010000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 4 0x04 '^D' \n\t*/\n\t0x10,\t\t\t/* 00010000 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x10,\t\t\t/* 00010000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 5 0x05 '^E' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0x10,\t\t\t/* 00010000 */\n\t0x38,\t\t\t/* 00111000 */\n\n\t/*\n\t* 6 0x06 '^F' \n\t*/\n\t0x10,\t\t\t/* 00010000 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x10,\t\t\t/* 00010000 */\n\t0x38,\t\t\t/* 00111000 */\n\n\t/*\n\t* 7 0x07 '^G' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 8 0x08 '^H' \n\t*/\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xe7,\t\t\t/* 11100111 */\n\t0xc3,\t\t\t/* 11000011 */\n\t0xc3,\t\t\t/* 11000011 */\n\t0xe7,\t\t\t/* 11100111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\n\t/*\n\t* 9 0x09 '^I' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x42,\t\t\t/* 01000010 */\n\t0x42,\t\t\t/* 01000010 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 10 0x0a '^J' \n\t*/\n\t0xff,\t\t\t/* 11111111 */\n\t0xc3,\t\t\t/* 11000011 */\n\t0x99,\t\t\t/* 10011001 */\n\t0xbd,\t\t\t/* 10111101 */\n\t0xbd,\t\t\t/* 10111101 */\n\t0x99,\t\t\t/* 10011001 */\n\t0xc3,\t\t\t/* 11000011 */\n\t0xff,\t\t\t/* 11111111 */\n\n\t/*\n\t* 11 0x0b '^K' \n\t*/\n\t0x0f,\t\t\t/* 00001111 */\n\t0x07,\t\t\t/* 00000111 */\n\t0x0f,\t\t\t/* 00001111 */\n\t0x7d,\t\t\t/* 01111101 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x78,\t\t\t/* 01111000 */\n\n\t/*\n\t* 12 0x0c '^L' \n\t*/\n\t0x3c,\t\t\t/* 00111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 13 0x0d '^M' \n\t*/\n\t0x3f,\t\t\t/* 00111111 */\n\t0x33,\t\t\t/* 00110011 */\n\t0x3f,\t\t\t/* 00111111 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x70,\t\t\t/* 01110000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0xe0,\t\t\t/* 11100000 */\n\n\t/*\n\t* 14 0x0e '^N' \n\t*/\n\t0x7f,\t\t\t/* 01111111 */\n\t0x63,\t\t\t/* 01100011 */\n\t0x7f,\t\t\t/* 01111111 */\n\t0x63,\t\t\t/* 01100011 */\n\t0x63,\t\t\t/* 01100011 */\n\t0x67,\t\t\t/* 01100111 */\n\t0xe6,\t\t\t/* 11100110 */\n\t0xc0,\t\t\t/* 11000000 */\n\n\t/*\n\t* 15 0x0f '^O' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0xdb,\t\t\t/* 11011011 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0xe7,\t\t\t/* 11100111 */\n\t0xe7,\t\t\t/* 11100111 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0xdb,\t\t\t/* 11011011 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 16 0x10 '^P' \n\t*/\n\t0x80,\t\t\t/* 10000000 */\n\t0xe0,\t\t\t/* 11100000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0xe0,\t\t\t/* 11100000 */\n\t0x80,\t\t\t/* 10000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 17 0x11 '^Q' \n\t*/\n\t0x02,\t\t\t/* 00000010 */\n\t0x0e,\t\t\t/* 00001110 */\n\t0x3e,\t\t\t/* 00111110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x3e,\t\t\t/* 00111110 */\n\t0x0e,\t\t\t/* 00001110 */\n\t0x02,\t\t\t/* 00000010 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 18 0x12 '^R' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 19 0x13 '^S' \n\t*/\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 20 0x14 '^T' \n\t*/\n\t0x7f,\t\t\t/* 01111111 */\n\t0xdb,\t\t\t/* 11011011 */\n\t0xdb,\t\t\t/* 11011011 */\n\t0x7b,\t\t\t/* 01111011 */\n\t0x1b,\t\t\t/* 00011011 */\n\t0x1b,\t\t\t/* 00011011 */\n\t0x1b,\t\t\t/* 00011011 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 21 0x15 '^U' \n\t*/\n\t0x3e,\t\t\t/* 00111110 */\n\t0x61,\t\t\t/* 01100001 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x86,\t\t\t/* 10000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\n\t/*\n\t* 22 0x16 '^V' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 23 0x17 '^W' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xff,\t\t\t/* 11111111 */\n\n\t/*\n\t* 24 0x18 '^X' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 25 0x19 '^Y' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 26 0x1a '^Z' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 27 0x1b '^[' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 28 0x1c '^\\' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 29 0x1d '^]' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x24,\t\t\t/* 00100100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x24,\t\t\t/* 00100100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 30 0x1e '^^' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 31 0x1f '^_' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 32 0x20 ' ' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 33 0x21 '!' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 34 0x22 '\"' \n\t*/\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x24,\t\t\t/* 00100100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 35 0x23 '#' \n\t*/\n\t0x6c,\t\t\t/* 01101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 36 0x24 '$' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x3e,\t\t\t/* 00111110 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 37 0x25 '%' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 38 0x26 '&' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x76,\t\t\t/* 01110110 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 39 0x27 ''' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 40 0x28 '(' \n\t*/\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 41 0x29 ')' \n\t*/\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 42 0x2a '*' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 43 0x2b '+' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 44 0x2c ',' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\n\t/*\n\t* 45 0x2d '-' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 46 0x2e '.' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 47 0x2f '/' \n\t*/\n\t0x06,\t\t\t/* 00000110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x80,\t\t\t/* 10000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 48 0x30 '0' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 49 0x31 '1' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 50 0x32 '2' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x1c,\t\t\t/* 00011100 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 51 0x33 '3' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x06,\t\t\t/* 00000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 52 0x34 '4' \n\t*/\n\t0x1c,\t\t\t/* 00011100 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x1e,\t\t\t/* 00011110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 53 0x35 '5' \n\t*/\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xfc,\t\t\t/* 11111100 */\n\t0x06,\t\t\t/* 00000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 54 0x36 '6' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xfc,\t\t\t/* 11111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 55 0x37 '7' \n\t*/\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 56 0x38 '8' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 57 0x39 '9' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 58 0x3a ':' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 59 0x3b ';' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\n\t/*\n\t* 60 0x3c '<' \n\t*/\n\t0x06,\t\t\t/* 00000110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 61 0x3d '=' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 62 0x3e '>' \n\t*/\n\t0x60,\t\t\t/* 01100000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 63 0x3f '?' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 64 0x40 '@' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xde,\t\t\t/* 11011110 */\n\t0xde,\t\t\t/* 11011110 */\n\t0xde,\t\t\t/* 11011110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 65 0x41 'A' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 66 0x42 'B' \n\t*/\n\t0xfc,\t\t\t/* 11111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xfc,\t\t\t/* 11111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 67 0x43 'C' \n\t*/\n\t0x3c,\t\t\t/* 00111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 68 0x44 'D' \n\t*/\n\t0xf8,\t\t\t/* 11111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 69 0x45 'E' \n\t*/\n\t0xfe,\t\t\t/* 11111110 */\n\t0x62,\t\t\t/* 01100010 */\n\t0x68,\t\t\t/* 01101000 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x68,\t\t\t/* 01101000 */\n\t0x62,\t\t\t/* 01100010 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 70 0x46 'F' \n\t*/\n\t0xfe,\t\t\t/* 11111110 */\n\t0x62,\t\t\t/* 01100010 */\n\t0x68,\t\t\t/* 01101000 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x68,\t\t\t/* 01101000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 71 0x47 'G' \n\t*/\n\t0x3c,\t\t\t/* 00111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xce,\t\t\t/* 11001110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3a,\t\t\t/* 00111010 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 72 0x48 'H' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 73 0x49 'I' \n\t*/\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 74 0x4a 'J' \n\t*/\n\t0x1e,\t\t\t/* 00011110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 75 0x4b 'K' \n\t*/\n\t0xe6,\t\t\t/* 11100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xe6,\t\t\t/* 11100110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 76 0x4c 'L' \n\t*/\n\t0xf0,\t\t\t/* 11110000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x62,\t\t\t/* 01100010 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 77 0x4d 'M' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0xee,\t\t\t/* 11101110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 78 0x4e 'N' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0xe6,\t\t\t/* 11100110 */\n\t0xf6,\t\t\t/* 11110110 */\n\t0xde,\t\t\t/* 11011110 */\n\t0xce,\t\t\t/* 11001110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 79 0x4f 'O' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 80 0x50 'P' \n\t*/\n\t0xfc,\t\t\t/* 11111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 81 0x51 'Q' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xce,\t\t\t/* 11001110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x0e,\t\t\t/* 00001110 */\n\n\t/*\n\t* 82 0x52 'R' \n\t*/\n\t0xfc,\t\t\t/* 11111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xe6,\t\t\t/* 11100110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 83 0x53 'S' \n\t*/\n\t0x3c,\t\t\t/* 00111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 84 0x54 'T' \n\t*/\n\t0x7e,\t\t\t/* 01111110 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x5a,\t\t\t/* 01011010 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 85 0x55 'U' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 86 0x56 'V' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 87 0x57 'W' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 88 0x58 'X' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 89 0x59 'Y' \n\t*/\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 90 0x5a 'Z' \n\t*/\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x8c,\t\t\t/* 10001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x32,\t\t\t/* 00110010 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 91 0x5b '[' \n\t*/\n\t0x3c,\t\t\t/* 00111100 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 92 0x5c '\\' \n\t*/\n\t0xc0,\t\t\t/* 11000000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x02,\t\t\t/* 00000010 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 93 0x5d ']' \n\t*/\n\t0x3c,\t\t\t/* 00111100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 94 0x5e '^' \n\t*/\n\t0x10,\t\t\t/* 00010000 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 95 0x5f '_' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\n\t/*\n\t* 96 0x60 '`' \n\t*/\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 97 0x61 'a' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 98 0x62 'b' \n\t*/\n\t0xe0,\t\t\t/* 11100000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 99 0x63 'c' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 100 0x64 'd' \n\t*/\n\t0x1c,\t\t\t/* 00011100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 101 0x65 'e' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 102 0x66 'f' \n\t*/\n\t0x3c,\t\t\t/* 00111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 103 0x67 'g' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x76,\t\t\t/* 01110110 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0xf8,\t\t\t/* 11111000 */\n\n\t/*\n\t* 104 0x68 'h' \n\t*/\n\t0xe0,\t\t\t/* 11100000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xe6,\t\t\t/* 11100110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 105 0x69 'i' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 106 0x6a 'j' \n\t*/\n\t0x06,\t\t\t/* 00000110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\n\t/*\n\t* 107 0x6b 'k' \n\t*/\n\t0xe0,\t\t\t/* 11100000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xe6,\t\t\t/* 11100110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 108 0x6c 'l' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 109 0x6d 'm' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xec,\t\t\t/* 11101100 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 110 0x6e 'n' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 111 0x6f 'o' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 112 0x70 'p' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xf0,\t\t\t/* 11110000 */\n\n\t/*\n\t* 113 0x71 'q' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x76,\t\t\t/* 01110110 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x1e,\t\t\t/* 00011110 */\n\n\t/*\n\t* 114 0x72 'r' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 115 0x73 's' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x06,\t\t\t/* 00000110 */\n\t0xfc,\t\t\t/* 11111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 116 0x74 't' \n\t*/\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0xfc,\t\t\t/* 11111100 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x1c,\t\t\t/* 00011100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 117 0x75 'u' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 118 0x76 'v' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 119 0x77 'w' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0xd6,\t\t\t/* 11010110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 120 0x78 'x' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 121 0x79 'y' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0xfc,\t\t\t/* 11111100 */\n\n\t/*\n\t* 122 0x7a 'z' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x4c,\t\t\t/* 01001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x32,\t\t\t/* 00110010 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 123 0x7b '{' \n\t*/\n\t0x0e,\t\t\t/* 00001110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x70,\t\t\t/* 01110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0e,\t\t\t/* 00001110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 124 0x7c '|' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 125 0x7d '}' \n\t*/\n\t0x70,\t\t\t/* 01110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0e,\t\t\t/* 00001110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x70,\t\t\t/* 01110000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 126 0x7e '~' \n\t*/\n\t0x76,\t\t\t/* 01110110 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 127 0x7f '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x10,\t\t\t/* 00010000 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 128 0x80 '' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x78,\t\t\t/* 01111000 */\n\n\t/*\n\t* 129 0x81 '' \n\t*/\n\t0xcc,\t\t\t/* 11001100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 130 0x82 '' \n\t*/\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 131 0x83 '' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0x82,\t\t\t/* 10000010 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 132 0x84 '' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 133 0x85 '' \n\t*/\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 134 0x86 '' \n\t*/\n\t0x30,\t\t\t/* 00110000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 135 0x87 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x38,\t\t\t/* 00111000 */\n\n\t/*\n\t* 136 0x88 '' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0x82,\t\t\t/* 10000010 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 137 0x89 '' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 138 0x8a '' \n\t*/\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 139 0x8b '' \n\t*/\n\t0x66,\t\t\t/* 01100110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 140 0x8c '' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0x82,\t\t\t/* 10000010 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 141 0x8d '' \n\t*/\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 142 0x8e '' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 143 0x8f '' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 144 0x90 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 145 0x91 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0xd8,\t\t\t/* 11011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 146 0x92 '' \n\t*/\n\t0x3e,\t\t\t/* 00111110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xce,\t\t\t/* 11001110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 147 0x93 '' \n\t*/\n\t0x7c,\t\t\t/* 01111100 */\n\t0x82,\t\t\t/* 10000010 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 148 0x94 '' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 149 0x95 '' \n\t*/\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 150 0x96 '' \n\t*/\n\t0x78,\t\t\t/* 01111000 */\n\t0x84,\t\t\t/* 10000100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 151 0x97 '' \n\t*/\n\t0x60,\t\t\t/* 01100000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 152 0x98 '' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0xfc,\t\t\t/* 11111100 */\n\n\t/*\n\t* 153 0x99 '' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 154 0x9a '' \n\t*/\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 155 0x9b '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 156 0x9c '' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x64,\t\t\t/* 01100100 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xfc,\t\t\t/* 11111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 157 0x9d '' \n\t*/\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 158 0x9e '' \n\t*/\n\t0xf8,\t\t\t/* 11111000 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xfa,\t\t\t/* 11111010 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xcf,\t\t\t/* 11001111 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc7,\t\t\t/* 11000111 */\n\n\t/*\n\t* 159 0x9f '' \n\t*/\n\t0x0e,\t\t\t/* 00001110 */\n\t0x1b,\t\t\t/* 00011011 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xd8,\t\t\t/* 11011000 */\n\t0x70,\t\t\t/* 01110000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 160 0xa0 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x78,\t\t\t/* 01111000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 161 0xa1 '' \n\t*/\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 162 0xa2 '' \n\t*/\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 163 0xa3 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 164 0xa4 '' \n\t*/\n\t0x76,\t\t\t/* 01110110 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 165 0xa5 '' \n\t*/\n\t0x76,\t\t\t/* 01110110 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xe6,\t\t\t/* 11100110 */\n\t0xf6,\t\t\t/* 11110110 */\n\t0xde,\t\t\t/* 11011110 */\n\t0xce,\t\t\t/* 11001110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 166 0xa6 '' \n\t*/\n\t0x3c,\t\t\t/* 00111100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x3e,\t\t\t/* 00111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 167 0xa7 '' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 168 0xa8 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x63,\t\t\t/* 01100011 */\n\t0x3e,\t\t\t/* 00111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 169 0xa9 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 170 0xaa '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 171 0xab '' \n\t*/\n\t0x63,\t\t\t/* 01100011 */\n\t0xe6,\t\t\t/* 11100110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x33,\t\t\t/* 00110011 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x0f,\t\t\t/* 00001111 */\n\n\t/*\n\t* 172 0xac '' \n\t*/\n\t0x63,\t\t\t/* 01100011 */\n\t0xe6,\t\t\t/* 11100110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x7a,\t\t\t/* 01111010 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x6a,\t\t\t/* 01101010 */\n\t0xdf,\t\t\t/* 11011111 */\n\t0x06,\t\t\t/* 00000110 */\n\n\t/*\n\t* 173 0xad '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 174 0xae '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x33,\t\t\t/* 00110011 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x33,\t\t\t/* 00110011 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 175 0xaf '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x33,\t\t\t/* 00110011 */\n\t0x66,\t\t\t/* 01100110 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 176 0xb0 '' \n\t*/\n\t0x22,\t\t\t/* 00100010 */\n\t0x88,\t\t\t/* 10001000 */\n\t0x22,\t\t\t/* 00100010 */\n\t0x88,\t\t\t/* 10001000 */\n\t0x22,\t\t\t/* 00100010 */\n\t0x88,\t\t\t/* 10001000 */\n\t0x22,\t\t\t/* 00100010 */\n\t0x88,\t\t\t/* 10001000 */\n\n\t/*\n\t* 177 0xb1 '' \n\t*/\n\t0x55,\t\t\t/* 01010101 */\n\t0xaa,\t\t\t/* 10101010 */\n\t0x55,\t\t\t/* 01010101 */\n\t0xaa,\t\t\t/* 10101010 */\n\t0x55,\t\t\t/* 01010101 */\n\t0xaa,\t\t\t/* 10101010 */\n\t0x55,\t\t\t/* 01010101 */\n\t0xaa,\t\t\t/* 10101010 */\n\n\t/*\n\t* 178 0xb2 '' \n\t*/\n\t0x77,\t\t\t/* 01110111 */\n\t0xdd,\t\t\t/* 11011101 */\n\t0x77,\t\t\t/* 01110111 */\n\t0xdd,\t\t\t/* 11011101 */\n\t0x77,\t\t\t/* 01110111 */\n\t0xdd,\t\t\t/* 11011101 */\n\t0x77,\t\t\t/* 01110111 */\n\t0xdd,\t\t\t/* 11011101 */\n\n\t/*\n\t* 179 0xb3 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 180 0xb4 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 181 0xb5 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 182 0xb6 '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0xf6,\t\t\t/* 11110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 183 0xb7 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 184 0xb8 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 185 0xb9 '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0xf6,\t\t\t/* 11110110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0xf6,\t\t\t/* 11110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 186 0xba '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 187 0xbb '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0xf6,\t\t\t/* 11110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 188 0xbc '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0xf6,\t\t\t/* 11110110 */\n\t0x06,\t\t\t/* 00000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 189 0xbd '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 190 0xbe '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 191 0xbf '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 192 0xc0 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x1f,\t\t\t/* 00011111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 193 0xc1 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 194 0xc2 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 195 0xc3 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x1f,\t\t\t/* 00011111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 196 0xc4 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 197 0xc5 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 198 0xc6 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x1f,\t\t\t/* 00011111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x1f,\t\t\t/* 00011111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 199 0xc7 '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x37,\t\t\t/* 00110111 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 200 0xc8 '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x37,\t\t\t/* 00110111 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x3f,\t\t\t/* 00111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 201 0xc9 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x3f,\t\t\t/* 00111111 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x37,\t\t\t/* 00110111 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 202 0xca '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0xf7,\t\t\t/* 11110111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 203 0xcb '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xf7,\t\t\t/* 11110111 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 204 0xcc '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x37,\t\t\t/* 00110111 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x37,\t\t\t/* 00110111 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 205 0xcd '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 206 0xce '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0xf7,\t\t\t/* 11110111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xf7,\t\t\t/* 11110111 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 207 0xcf '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 208 0xd0 '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 209 0xd1 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 210 0xd2 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 211 0xd3 '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x3f,\t\t\t/* 00111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 212 0xd4 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x1f,\t\t\t/* 00011111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x1f,\t\t\t/* 00011111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 213 0xd5 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x1f,\t\t\t/* 00011111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x1f,\t\t\t/* 00011111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 214 0xd6 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x3f,\t\t\t/* 00111111 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 215 0xd7 '' \n\t*/\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\n\t/*\n\t* 216 0xd8 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 217 0xd9 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xf8,\t\t\t/* 11111000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 218 0xda '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x1f,\t\t\t/* 00011111 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 219 0xdb '' \n\t*/\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\n\t/*\n\t* 220 0xdc '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\n\t/*\n\t* 221 0xdd '' \n\t*/\n\t0xf0,\t\t\t/* 11110000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0xf0,\t\t\t/* 11110000 */\n\t0xf0,\t\t\t/* 11110000 */\n\n\t/*\n\t* 222 0xde '' \n\t*/\n\t0x0f,\t\t\t/* 00001111 */\n\t0x0f,\t\t\t/* 00001111 */\n\t0x0f,\t\t\t/* 00001111 */\n\t0x0f,\t\t\t/* 00001111 */\n\t0x0f,\t\t\t/* 00001111 */\n\t0x0f,\t\t\t/* 00001111 */\n\t0x0f,\t\t\t/* 00001111 */\n\t0x0f,\t\t\t/* 00001111 */\n\n\t/*\n\t* 223 0xdf '' \n\t*/\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0xff,\t\t\t/* 11111111 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 224 0xe0 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x76,\t\t\t/* 01110110 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0xc8,\t\t\t/* 11001000 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x76,\t\t\t/* 01110110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 225 0xe1 '' \n\t*/\n\t0x78,\t\t\t/* 01111000 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xd8,\t\t\t/* 11011000 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xcc,\t\t\t/* 11001100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 226 0xe2 '' \n\t*/\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0xc0,\t\t\t/* 11000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 227 0xe3 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 228 0xe4 '' \n\t*/\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 229 0xe5 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0xd8,\t\t\t/* 11011000 */\n\t0xd8,\t\t\t/* 11011000 */\n\t0xd8,\t\t\t/* 11011000 */\n\t0x70,\t\t\t/* 01110000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 230 0xe6 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc0,\t\t\t/* 11000000 */\n\n\t/*\n\t* 231 0xe7 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x76,\t\t\t/* 01110110 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 232 0xe8 '' \n\t*/\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\n\t/*\n\t* 233 0xe9 '' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 234 0xea '' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0xee,\t\t\t/* 11101110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 235 0xeb '' \n\t*/\n\t0x0e,\t\t\t/* 00001110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x3e,\t\t\t/* 00111110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x66,\t\t\t/* 01100110 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 236 0xec '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0xdb,\t\t\t/* 11011011 */\n\t0xdb,\t\t\t/* 11011011 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 237 0xed '' \n\t*/\n\t0x06,\t\t\t/* 00000110 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0xdb,\t\t\t/* 11011011 */\n\t0xdb,\t\t\t/* 11011011 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x60,\t\t\t/* 01100000 */\n\t0xc0,\t\t\t/* 11000000 */\n\n\t/*\n\t* 238 0xee '' \n\t*/\n\t0x1e,\t\t\t/* 00011110 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x60,\t\t\t/* 01100000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x1e,\t\t\t/* 00011110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 239 0xef '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0xc6,\t\t\t/* 11000110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 240 0xf0 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0xfe,\t\t\t/* 11111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 241 0xf1 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 242 0xf2 '' \n\t*/\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 243 0xf3 '' \n\t*/\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 244 0xf4 '' \n\t*/\n\t0x0e,\t\t\t/* 00001110 */\n\t0x1b,\t\t\t/* 00011011 */\n\t0x1b,\t\t\t/* 00011011 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\n\t/*\n\t* 245 0xf5 '' \n\t*/\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0xd8,\t\t\t/* 11011000 */\n\t0xd8,\t\t\t/* 11011000 */\n\t0x70,\t\t\t/* 01110000 */\n\n\t/*\n\t* 246 0xf6 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x7e,\t\t\t/* 01111110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 247 0xf7 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x76,\t\t\t/* 01110110 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x76,\t\t\t/* 01110110 */\n\t0xdc,\t\t\t/* 11011100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 248 0xf8 '' \n\t*/\n\t0x38,\t\t\t/* 00111000 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x38,\t\t\t/* 00111000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 249 0xf9 '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 250 0xfa '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 251 0xfb '' \n\t*/\n\t0x0f,\t\t\t/* 00001111 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0xec,\t\t\t/* 11101100 */\n\t0x6c,\t\t\t/* 01101100 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x1c,\t\t\t/* 00011100 */\n\n\t/*\n\t* 252 0xfc '' \n\t*/\n\t0x6c,\t\t\t/* 01101100 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x36,\t\t\t/* 00110110 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 253 0xfd '' \n\t*/\n\t0x78,\t\t\t/* 01111000 */\n\t0x0c,\t\t\t/* 00001100 */\n\t0x18,\t\t\t/* 00011000 */\n\t0x30,\t\t\t/* 00110000 */\n\t0x7c,\t\t\t/* 01111100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 254 0xfe '' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x3c,\t\t\t/* 00111100 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n\t/*\n\t* 255 0xff ' ' \n\t*/\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\t0x00,\t\t\t/* 00000000 */\n\n};\n"
  },
  {
    "path": "libs/SDL2_gfx/include/SDL2_imageFilter.h",
    "content": "/*\n\nSDL2_imageFilter.h: byte-image \"filter\" routines \n\nCopyright (C) 2012-2014  Andreas Schiffler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n\n#ifndef _SDL2_imageFilter_h\n#define _SDL2_imageFilter_h\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\t/* ---- Function Prototypes */\n\n#ifdef _MSC_VER\n#  if defined(DLL_EXPORT) && !defined(LIBSDL2_GFX_DLL_IMPORT)\n#    define SDL2_IMAGEFILTER_SCOPE __declspec(dllexport)\n#  else\n#    ifdef LIBSDL2_GFX_DLL_IMPORT\n#      define SDL2_IMAGEFILTER_SCOPE __declspec(dllimport)\n#    endif\n#  endif\n#endif\n#ifndef SDL2_IMAGEFILTER_SCOPE\n#  define SDL2_IMAGEFILTER_SCOPE extern\n#endif\n\n\t/* Comments:                                                                           */\n\t/*  1.) MMX functions work best if all data blocks are aligned on a 32 bytes boundary. */\n\t/*  2.) Data that is not within an 8 byte boundary is processed using the C routine.   */\n\t/*  3.) Convolution routines do not have C routines at this time.                      */\n\n\t// Detect MMX capability in CPU\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterMMXdetect(void);\n\n\t// Force use of MMX off (or turn possible use back on)\n\tSDL2_IMAGEFILTER_SCOPE void SDL_imageFilterMMXoff(void);\n\tSDL2_IMAGEFILTER_SCOPE void SDL_imageFilterMMXon(void);\n\n\t//\n\t// All routines return:\n\t//   0   OK\n\t//  -1   Error (internal error, parameter error)\n\t//\n\n\t//  SDL_imageFilterAdd: D = saturation255(S1 + S2)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterAdd(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterMean: D = S1/2 + S2/2\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterMean(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterSub: D = saturation0(S1 - S2)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterSub(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterAbsDiff: D = | S1 - S2 |\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterAbsDiff(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterMult: D = saturation(S1 * S2)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterMult(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterMultNor: D = S1 * S2   (non-MMX)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterMultNor(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterMultDivby2: D = saturation255(S1/2 * S2)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterMultDivby2(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest,\n\t\tunsigned int length);\n\n\t//  SDL_imageFilterMultDivby4: D = saturation255(S1/2 * S2/2)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterMultDivby4(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest,\n\t\tunsigned int length);\n\n\t//  SDL_imageFilterBitAnd: D = S1 & S2\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterBitAnd(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterBitOr: D = S1 | S2\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterBitOr(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterDiv: D = S1 / S2   (non-MMX)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterDiv(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterBitNegation: D = !S\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterBitNegation(unsigned char *Src1, unsigned char *Dest, unsigned int length);\n\n\t//  SDL_imageFilterAddByte: D = saturation255(S + C)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterAddByte(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char C);\n\n\t//  SDL_imageFilterAddUint: D = saturation255(S + (uint)C)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterAddUint(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned int C);\n\n\t//  SDL_imageFilterAddByteToHalf: D = saturation255(S/2 + C)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterAddByteToHalf(unsigned char *Src1, unsigned char *Dest, unsigned int length,\n\t\tunsigned char C);\n\n\t//  SDL_imageFilterSubByte: D = saturation0(S - C)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterSubByte(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char C);\n\n\t//  SDL_imageFilterSubUint: D = saturation0(S - (uint)C)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterSubUint(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned int C);\n\n\t//  SDL_imageFilterShiftRight: D = saturation0(S >> N)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterShiftRight(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char N);\n\n\t//  SDL_imageFilterShiftRightUint: D = saturation0((uint)S >> N)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterShiftRightUint(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char N);\n\n\t//  SDL_imageFilterMultByByte: D = saturation255(S * C)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterMultByByte(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char C);\n\n\t//  SDL_imageFilterShiftRightAndMultByByte: D = saturation255((S >> N) * C)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterShiftRightAndMultByByte(unsigned char *Src1, unsigned char *Dest, unsigned int length,\n\t\tunsigned char N, unsigned char C);\n\n\t//  SDL_imageFilterShiftLeftByte: D = (S << N)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterShiftLeftByte(unsigned char *Src1, unsigned char *Dest, unsigned int length,\n\t\tunsigned char N);\n\n\t//  SDL_imageFilterShiftLeftUint: D = ((uint)S << N)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterShiftLeftUint(unsigned char *Src1, unsigned char *Dest, unsigned int length,\n\t\tunsigned char N);\n\n\t//  SDL_imageFilterShiftLeft: D = saturation255(S << N)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterShiftLeft(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char N);\n\n\t//  SDL_imageFilterBinarizeUsingThreshold: D = S >= T ? 255:0\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterBinarizeUsingThreshold(unsigned char *Src1, unsigned char *Dest, unsigned int length,\n\t\tunsigned char T);\n\n\t//  SDL_imageFilterClipToRange: D = (S >= Tmin) & (S <= Tmax) 255:0\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterClipToRange(unsigned char *Src1, unsigned char *Dest, unsigned int length,\n\t\tunsigned char Tmin, unsigned char Tmax);\n\n\t//  SDL_imageFilterNormalizeLinear: D = saturation255((Nmax - Nmin)/(Cmax - Cmin)*(S - Cmin) + Nmin)\n\tSDL2_IMAGEFILTER_SCOPE int SDL_imageFilterNormalizeLinear(unsigned char *Src, unsigned char *Dest, unsigned int length, int Cmin,\n\t\tint Cmax, int Nmin, int Nmax);\n\n\t/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n\n#endif\t\t\t\t/* _SDL_imageFilter_h */\n"
  },
  {
    "path": "libs/SDL2_gfx/include/SDL2_rotozoom.h",
    "content": "/*  \n\nSDL2_rotozoom.c: rotozoomer, zoomer and shrinker for 32bit or 8bit surfaces\n\nCopyright (C) 2012-2014  Andreas Schiffler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n\n#ifndef _SDL2_rotozoom_h\n#define _SDL2_rotozoom_h\n\n#include <math.h>\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef M_PI\n#define M_PI\t3.1415926535897932384626433832795\n#endif\n\n#include \"SDL.h\"\n\n\t/* ---- Defines */\n\n\t/*!\n\t\\brief Disable anti-aliasing (no smoothing).\n\t*/\n#define SMOOTHING_OFF\t\t0\n\n\t/*!\n\t\\brief Enable anti-aliasing (smoothing).\n\t*/\n#define SMOOTHING_ON\t\t1\n\n\t/* ---- Function Prototypes */\n\n#ifdef _MSC_VER\n#  if defined(DLL_EXPORT) && !defined(LIBSDL2_GFX_DLL_IMPORT)\n#    define SDL2_ROTOZOOM_SCOPE __declspec(dllexport)\n#  else\n#    ifdef LIBSDL2_GFX_DLL_IMPORT\n#      define SDL2_ROTOZOOM_SCOPE __declspec(dllimport)\n#    endif\n#  endif\n#endif\n#ifndef SDL2_ROTOZOOM_SCOPE\n#  define SDL2_ROTOZOOM_SCOPE extern\n#endif\n\n\t/* \n\n\tRotozoom functions\n\n\t*/\n\n\tSDL2_ROTOZOOM_SCOPE SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth);\n\n\tSDL2_ROTOZOOM_SCOPE SDL_Surface *rotozoomSurfaceXY\n\t\t(SDL_Surface * src, double angle, double zoomx, double zoomy, int smooth);\n\n\n\tSDL2_ROTOZOOM_SCOPE void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth,\n\t\tint *dstheight);\n\n\tSDL2_ROTOZOOM_SCOPE void rotozoomSurfaceSizeXY\n\t\t(int width, int height, double angle, double zoomx, double zoomy, \n\t\tint *dstwidth, int *dstheight);\n\n\t/* \n\n\tZooming functions\n\n\t*/\n\n\tSDL2_ROTOZOOM_SCOPE SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth);\n\n\tSDL2_ROTOZOOM_SCOPE void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight);\n\n\t/* \n\n\tShrinking functions\n\n\t*/     \n\n\tSDL2_ROTOZOOM_SCOPE SDL_Surface *shrinkSurface(SDL_Surface * src, int factorx, int factory);\n\n\t/* \n\n\tSpecialized rotation functions\n\n\t*/\n\n\tSDL2_ROTOZOOM_SCOPE SDL_Surface* rotateSurface90Degrees(SDL_Surface* src, int numClockwiseTurns);\n\n\t/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n\n#endif\t\t\t\t/* _SDL2_rotozoom_h */\n"
  },
  {
    "path": "libs/SDL2_gfx/src/SDL2_framerate.c",
    "content": "/*\n\nSDL2_framerate.c: framerate manager\n\nCopyright (C) 2012-2014  Andreas Schiffler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n\n#include \"SDL2_framerate.h\"\n\n/*!\n\\brief Internal wrapper to SDL_GetTicks that ensures a non-zero return value.\n\n\\return The tick count.\n*/\nUint32 _getTicks()\n{\n\tUint32 ticks = SDL_GetTicks();\n\n\t/* \n\t* Since baseticks!=0 is used to track initialization\n\t* we need to ensure that the tick count is always >0 \n\t* since SDL_GetTicks may not have incremented yet and\n\t* return 0 depending on the timing of the calls.\n\t*/\n\tif (ticks == 0) {\n\t\treturn 1;\n\t} else {\n\t\treturn ticks;\n\t}\n}\n\n/*!\n\\brief Initialize the framerate manager.\n\nInitialize the framerate manager, set default framerate of 30Hz and\nreset delay interpolation.\n\n\\param manager Pointer to the framerate manager.\n*/\nvoid SDL_initFramerate(FPSmanager * manager)\n{\n\t/*\n\t* Store some sane values \n\t*/\n\tmanager->framecount = 0;\n\tmanager->rate = FPS_DEFAULT;\n\tmanager->rateticks = (1000.0f / (float) FPS_DEFAULT);\n\tmanager->baseticks = _getTicks();\n\tmanager->lastticks = manager->baseticks;\n\n}\n\n/*!\n\\brief Set the framerate in Hz \n\nSets a new framerate for the manager and reset delay interpolation.\nRate values must be between FPS_LOWER_LIMIT and FPS_UPPER_LIMIT inclusive to be accepted.\n\n\\param manager Pointer to the framerate manager.\n\\param rate The new framerate in Hz (frames per second).\n\n\\return 0 for sucess and -1 for error.\n*/\nint SDL_setFramerate(FPSmanager * manager, Uint32 rate)\n{\n\tif ((rate >= FPS_LOWER_LIMIT) && (rate <= FPS_UPPER_LIMIT)) {\n\t\tmanager->framecount = 0;\n\t\tmanager->rate = rate;\n\t\tmanager->rateticks = (1000.0f / (float) rate);\n\t\treturn (0);\n\t} else {\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Return the current target framerate in Hz \n\nGet the currently set framerate of the manager.\n\n\\param manager Pointer to the framerate manager.\n\n\\return Current framerate in Hz or -1 for error.\n*/\nint SDL_getFramerate(FPSmanager * manager)\n{\n\tif (manager == NULL) {\n\t\treturn (-1);\n\t} else {\n\t\treturn ((int)manager->rate);\n\t}\n}\n\n/*!\n\\brief Return the current framecount.\n\nGet the current framecount from the framerate manager. \nA frame is counted each time SDL_framerateDelay is called.\n\n\\param manager Pointer to the framerate manager.\n\n\\return Current frame count or -1 for error.\n*/\nint SDL_getFramecount(FPSmanager * manager)\n{\n\tif (manager == NULL) {\n\t\treturn (-1);\n\t} else {\n\t\treturn ((int)manager->framecount);\n\t}\n}\n\n/*!\n\\brief Delay execution to maintain a constant framerate and calculate fps.\n\nGenerate a delay to accomodate currently set framerate. Call once in the\ngraphics/rendering loop. If the computer cannot keep up with the rate (i.e.\ndrawing too slow), the delay is zero and the delay interpolation is reset.\n\n\\param manager Pointer to the framerate manager.\n\n\\return The time that passed since the last call to the function in ms. May return 0.\n*/\nUint32 SDL_framerateDelay(FPSmanager * manager)\n{\n\tUint32 current_ticks;\n\tUint32 target_ticks;\n\tUint32 the_delay;\n\tUint32 time_passed = 0;\n\n\t/*\n\t* No manager, no delay\n\t*/\n\tif (manager == NULL) {\n\t\treturn 0;\n\t}\n\n\t/*\n\t* Initialize uninitialized manager \n\t*/\n\tif (manager->baseticks == 0) {\n\t\tSDL_initFramerate(manager);\n\t}\n\n\t/*\n\t* Next frame \n\t*/\n\tmanager->framecount++;\n\n\t/*\n\t* Get/calc ticks \n\t*/\n\tcurrent_ticks = _getTicks();\n\ttime_passed = current_ticks - manager->lastticks;\n\tmanager->lastticks = current_ticks;\n\ttarget_ticks = manager->baseticks + (Uint32) ((float) manager->framecount * manager->rateticks);\n\n\tif (current_ticks <= target_ticks) {\n\t\tthe_delay = target_ticks - current_ticks;\n\t\tSDL_Delay(the_delay);\n\t} else {\n\t\tmanager->framecount = 0;\n\t\tmanager->baseticks = _getTicks();\n\t}\n\n\treturn time_passed;\n}\n"
  },
  {
    "path": "libs/SDL2_gfx/src/SDL2_gfxPrimitives.c",
    "content": "/* \n\nSDL2_gfxPrimitives.c: graphics primitives for SDL2 renderers\n\nCopyright (C) 2012-2014  Andreas Schiffler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n#include <string.h>\n\n#include \"SDL2_gfxPrimitives.h\"\n#include \"SDL2_rotozoom.h\"\n#include \"SDL2_gfxPrimitives_font.h\"\n\n/* ---- Structures */\n\n/*!\n\\brief The structure passed to the internal Bresenham iterator.\n*/\ntypedef struct {\n\tSint16 x, y;\n\tint dx, dy, s1, s2, swapdir, error;\n\tUint32 count;\n} SDL2_gfxBresenhamIterator;\n\n/*!\n\\brief The structure passed to the internal Murphy iterator.\n*/\ntypedef struct {\n\tSDL_Renderer *renderer;\n\tint u, v;\t\t/* delta x , delta y */\n\tint ku, kt, kv, kd;\t/* loop constants */\n\tint oct2;\n\tint quad4;\n\tSint16 last1x, last1y, last2x, last2y, first1x, first1y, first2x, first2y, tempx, tempy;\n} SDL2_gfxMurphyIterator;\n\n/* ---- Pixel */\n\n/*!\n\\brief Draw pixel  in currently set color.\n\n\\param renderer The renderer to draw on.\n\\param x X (horizontal) coordinate of the pixel.\n\\param y Y (vertical) coordinate of the pixel.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint pixel(SDL_Renderer *renderer, Sint16 x, Sint16 y)\n{\n\treturn SDL_RenderDrawPoint(renderer, x, y);\n}\n\n/*!\n\\brief Draw pixel with blending enabled if a<255.\n\n\\param renderer The renderer to draw on.\n\\param x X (horizontal) coordinate of the pixel.\n\\param y Y (vertical) coordinate of the pixel.\n\\param color The color value of the pixel to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint pixelColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn pixelRGBA(renderer, x, y, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw pixel with blending enabled if a<255.\n\n\\param renderer The renderer to draw on.\n\\param x X (horizontal) coordinate of the pixel.\n\\param y Y (vertical) coordinate of the pixel.\n\\param r The red color value of the pixel to draw. \n\\param g The green color value of the pixel to draw.\n\\param b The blue color value of the pixel to draw.\n\\param a The alpha value of the pixel to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint pixelRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\n\tresult |= SDL_RenderDrawPoint(renderer, x, y);\n\treturn result;\n}\n\n/*!\n\\brief Draw pixel with blending enabled and using alpha weight on color.\n\n\\param renderer The renderer to draw on.\n\\param x The horizontal coordinate of the pixel.\n\\param y The vertical position of the pixel.\n\\param r The red color value of the pixel to draw. \n\\param g The green color value of the pixel to draw.\n\\param b The blue color value of the pixel to draw.\n\\param a The alpha value of the pixel to draw.\n\\param weight The weight multiplied into the alpha value of the pixel.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint pixelRGBAWeight(SDL_Renderer * renderer, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a, Uint32 weight)\n{\n\t/*\n\t* Modify Alpha by weight \n\t*/\n\tUint32 ax = a;\n\tax = ((ax * weight) >> 8);\n\tif (ax > 255) {\n\t\ta = 255;\n\t} else {\n\t\ta = (Uint8)(ax & 0x000000ff);\n\t}\n\n\treturn pixelRGBA(renderer, x, y, r, g, b, a);\n}\n\n/* ---- Hline */\n\n/*!\n\\brief Draw horizontal line in currently set color\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. left) of the line.\n\\param x2 X coordinate of the second point (i.e. right) of the line.\n\\param y Y coordinate of the points of the line.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint hline(SDL_Renderer * renderer, Sint16 x1, Sint16 x2, Sint16 y)\n{\n\treturn SDL_RenderDrawLine(renderer, x1, y, x2, y);;\n}\n\n\n/*!\n\\brief Draw horizontal line with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. left) of the line.\n\\param x2 X coordinate of the second point (i.e. right) of the line.\n\\param y Y coordinate of the points of the line.\n\\param color The color value of the line to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint hlineColor(SDL_Renderer * renderer, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn hlineRGBA(renderer, x1, x2, y, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw horizontal line with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. left) of the line.\n\\param x2 X coordinate of the second point (i.e. right) of the line.\n\\param y Y coordinate of the points of the line.\n\\param r The red value of the line to draw. \n\\param g The green value of the line to draw. \n\\param b The blue value of the line to draw. \n\\param a The alpha value of the line to draw. \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint hlineRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 x2, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\n\tresult |= SDL_RenderDrawLine(renderer, x1, y, x2, y);\n\treturn result;\n}\n\n/* ---- Vline */\n\n/*!\n\\brief Draw vertical line in currently set color\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of points of the line.\n\\param y1 Y coordinate of the first point (i.e. top) of the line.\n\\param y2 Y coordinate of the second point (i.e. bottom) of the line.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint vline(SDL_Renderer * renderer, Sint16 x, Sint16 y1, Sint16 y2)\n{\n\treturn SDL_RenderDrawLine(renderer, x, y1, x, y2);;\n}\n\n/*!\n\\brief Draw vertical line with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the points of the line.\n\\param y1 Y coordinate of the first point (i.e. top) of the line.\n\\param y2 Y coordinate of the second point (i.e. bottom) of the line.\n\\param color The color value of the line to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint vlineColor(SDL_Renderer * renderer, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn vlineRGBA(renderer, x, y1, y2, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw vertical line with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the points of the line.\n\\param y1 Y coordinate of the first point (i.e. top) of the line.\n\\param y2 Y coordinate of the second point (i.e. bottom) of the line.\n\\param r The red value of the line to draw. \n\\param g The green value of the line to draw. \n\\param b The blue value of the line to draw. \n\\param a The alpha value of the line to draw. \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint vlineRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y1, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\n\tresult |= SDL_RenderDrawLine(renderer, x, y1, x, y2);\n\treturn result;\n}\n\n/* ---- Rectangle */\n\n/*!\n\\brief Draw rectangle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. top right) of the rectangle.\n\\param y1 Y coordinate of the first point (i.e. top right) of the rectangle.\n\\param x2 X coordinate of the second point (i.e. bottom left) of the rectangle.\n\\param y2 Y coordinate of the second point (i.e. bottom left) of the rectangle.\n\\param color The color value of the rectangle to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint rectangleColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn rectangleRGBA(renderer, x1, y1, x2, y2, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw rectangle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. top right) of the rectangle.\n\\param y1 Y coordinate of the first point (i.e. top right) of the rectangle.\n\\param x2 X coordinate of the second point (i.e. bottom left) of the rectangle.\n\\param y2 Y coordinate of the second point (i.e. bottom left) of the rectangle.\n\\param r The red value of the rectangle to draw. \n\\param g The green value of the rectangle to draw. \n\\param b The blue value of the rectangle to draw. \n\\param a The alpha value of the rectangle to draw. \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint rectangleRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result;\n\tSint16 tmp;\n\tSDL_Rect rect;\n\n\t/*\n\t* Test for special cases of straight lines or single point \n\t*/\n\tif (x1 == x2) {\n\t\tif (y1 == y2) {\n\t\t\treturn (pixelRGBA(renderer, x1, y1, r, g, b, a));\n\t\t} else {\n\t\t\treturn (vlineRGBA(renderer, x1, y1, y2, r, g, b, a));\n\t\t}\n\t} else {\n\t\tif (y1 == y2) {\n\t\t\treturn (hlineRGBA(renderer, x1, x2, y1, r, g, b, a));\n\t\t}\n\t}\n\n\t/*\n\t* Swap x1, x2 if required \n\t*/\n\tif (x1 > x2) {\n\t\ttmp = x1;\n\t\tx1 = x2;\n\t\tx2 = tmp;\n\t}\n\n\t/*\n\t* Swap y1, y2 if required \n\t*/\n\tif (y1 > y2) {\n\t\ttmp = y1;\n\t\ty1 = y2;\n\t\ty2 = tmp;\n\t}\n\n\t/* \n\t* Create destination rect\n\t*/\t\n\trect.x = x1;\n\trect.y = y1;\n\trect.w = x2 - x1;\n\trect.h = y2 - y1;\n\t\n\t/*\n\t* Draw\n\t*/\n\tresult = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\t\n\tresult |= SDL_RenderDrawRect(renderer, &rect);\n\treturn result;\n}\n\n/* ---- Rounded Rectangle */\n\n/*!\n\\brief Draw rounded-corner rectangle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. top right) of the rectangle.\n\\param y1 Y coordinate of the first point (i.e. top right) of the rectangle.\n\\param x2 X coordinate of the second point (i.e. bottom left) of the rectangle.\n\\param y2 Y coordinate of the second point (i.e. bottom left) of the rectangle.\n\\param rad The radius of the corner arc.\n\\param color The color value of the rectangle to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint roundedRectangleColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn roundedRectangleRGBA(renderer, x1, y1, x2, y2, rad, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw rounded-corner rectangle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. top right) of the rectangle.\n\\param y1 Y coordinate of the first point (i.e. top right) of the rectangle.\n\\param x2 X coordinate of the second point (i.e. bottom left) of the rectangle.\n\\param y2 Y coordinate of the second point (i.e. bottom left) of the rectangle.\n\\param rad The radius of the corner arc.\n\\param r The red value of the rectangle to draw. \n\\param g The green value of the rectangle to draw. \n\\param b The blue value of the rectangle to draw. \n\\param a The alpha value of the rectangle to draw. \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint roundedRectangleRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result = 0;\n\tSint16 tmp;\n\tSint16 w, h;\n\tSint16 xx1, xx2;\n\tSint16 yy1, yy2;\n\t\n\t/*\n\t* Check renderer\n\t*/\n\tif (renderer == NULL)\n\t{\n\t\treturn -1;\n\t}\n\n\t/*\n\t* Check radius vor valid range\n\t*/\n\tif (rad < 0) {\n\t\treturn -1;\n\t}\n\n\t/*\n\t* Special case - no rounding\n\t*/\n\tif (rad <= 1) {\n\t\treturn rectangleRGBA(renderer, x1, y1, x2, y2, r, g, b, a);\n\t}\n\n\t/*\n\t* Test for special cases of straight lines or single point \n\t*/\n\tif (x1 == x2) {\n\t\tif (y1 == y2) {\n\t\t\treturn (pixelRGBA(renderer, x1, y1, r, g, b, a));\n\t\t} else {\n\t\t\treturn (vlineRGBA(renderer, x1, y1, y2, r, g, b, a));\n\t\t}\n\t} else {\n\t\tif (y1 == y2) {\n\t\t\treturn (hlineRGBA(renderer, x1, x2, y1, r, g, b, a));\n\t\t}\n\t}\n\n\t/*\n\t* Swap x1, x2 if required \n\t*/\n\tif (x1 > x2) {\n\t\ttmp = x1;\n\t\tx1 = x2;\n\t\tx2 = tmp;\n\t}\n\n\t/*\n\t* Swap y1, y2 if required \n\t*/\n\tif (y1 > y2) {\n\t\ttmp = y1;\n\t\ty1 = y2;\n\t\ty2 = tmp;\n\t}\n\n\t/*\n\t* Calculate width&height \n\t*/\n\tw = x2 - x1;\n\th = y2 - y1;\n\n\t/*\n\t* Maybe adjust radius\n\t*/\n\tif ((rad * 2) > w)  \n\t{\n\t\trad = w / 2;\n\t}\n\tif ((rad * 2) > h)\n\t{\n\t\trad = h / 2;\n\t}\n\n\t/*\n\t* Draw corners\n\t*/\n\txx1 = x1 + rad;\n\txx2 = x2 - rad;\n\tyy1 = y1 + rad;\n\tyy2 = y2 - rad;\n\tresult |= arcRGBA(renderer, xx1, yy1, rad, 180, 270, r, g, b, a);\n\tresult |= arcRGBA(renderer, xx2, yy1, rad, 270, 360, r, g, b, a);\n\tresult |= arcRGBA(renderer, xx1, yy2, rad,  90, 180, r, g, b, a);\n\tresult |= arcRGBA(renderer, xx2, yy2, rad,   0,  90, r, g, b, a);\n\n\t/*\n\t* Draw lines\n\t*/\n\tif (xx1 <= xx2) {\n\t\tresult |= hlineRGBA(renderer, xx1, xx2, y1, r, g, b, a);\n\t\tresult |= hlineRGBA(renderer, xx1, xx2, y2, r, g, b, a);\n\t}\n\tif (yy1 <= yy2) {\n\t\tresult |= vlineRGBA(renderer, x1, yy1, yy2, r, g, b, a);\n\t\tresult |= vlineRGBA(renderer, x2, yy1, yy2, r, g, b, a);\n\t}\n\n\treturn result;\n}\n\n/* ---- Rounded Box */\n\n/*!\n\\brief Draw rounded-corner box (filled rectangle) with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. top right) of the box.\n\\param y1 Y coordinate of the first point (i.e. top right) of the box.\n\\param x2 X coordinate of the second point (i.e. bottom left) of the box.\n\\param y2 Y coordinate of the second point (i.e. bottom left) of the box.\n\\param rad The radius of the corner arcs of the box.\n\\param color The color value of the box to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint roundedBoxColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn roundedBoxRGBA(renderer, x1, y1, x2, y2, rad, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw rounded-corner box (filled rectangle) with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. top right) of the box.\n\\param y1 Y coordinate of the first point (i.e. top right) of the box.\n\\param x2 X coordinate of the second point (i.e. bottom left) of the box.\n\\param y2 Y coordinate of the second point (i.e. bottom left) of the box.\n\\param rad The radius of the corner arcs of the box.\n\\param r The red value of the box to draw. \n\\param g The green value of the box to draw. \n\\param b The blue value of the box to draw. \n\\param a The alpha value of the box to draw. \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint roundedBoxRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2,\n\tSint16 y2, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result;\n\tSint16 w, h, r2, tmp;\n\tSint16 cx = 0;\n\tSint16 cy = rad;\n\tSint16 ocx = (Sint16) 0xffff;\n\tSint16 ocy = (Sint16) 0xffff;\n\tSint16 df = 1 - rad;\n\tSint16 d_e = 3;\n\tSint16 d_se = -2 * rad + 5;\n\tSint16 xpcx, xmcx, xpcy, xmcy;\n\tSint16 ypcy, ymcy, ypcx, ymcx;\n\tSint16 x, y, dx, dy;\n\n\t/* \n\t* Check destination renderer \n\t*/\n\tif (renderer == NULL)\n\t{\n\t\treturn -1;\n\t}\n\n\t/*\n\t* Check radius vor valid range\n\t*/\n\tif (rad < 0) {\n\t\treturn -1;\n\t}\n\n\t/*\n\t* Special case - no rounding\n\t*/\n\tif (rad <= 1) {\n\t\treturn boxRGBA(renderer, x1, y1, x2, y2, r, g, b, a);\n\t}\n\n\t/*\n\t* Test for special cases of straight lines or single point \n\t*/\n\tif (x1 == x2) {\n\t\tif (y1 == y2) {\n\t\t\treturn (pixelRGBA(renderer, x1, y1, r, g, b, a));\n\t\t} else {\n\t\t\treturn (vlineRGBA(renderer, x1, y1, y2, r, g, b, a));\n\t\t}\n\t} else {\n\t\tif (y1 == y2) {\n\t\t\treturn (hlineRGBA(renderer, x1, x2, y1, r, g, b, a));\n\t\t}\n\t}\n\n\t/*\n\t* Swap x1, x2 if required \n\t*/\n\tif (x1 > x2) {\n\t\ttmp = x1;\n\t\tx1 = x2;\n\t\tx2 = tmp;\n\t}\n\n\t/*\n\t* Swap y1, y2 if required \n\t*/\n\tif (y1 > y2) {\n\t\ttmp = y1;\n\t\ty1 = y2;\n\t\ty2 = tmp;\n\t}\n\n\t/*\n\t* Calculate width&height \n\t*/\n\tw = x2 - x1 + 1;\n\th = y2 - y1 + 1;\n\n\t/*\n\t* Maybe adjust radius\n\t*/\n\tr2 = rad + rad;\n\tif (r2 > w)  \n\t{\n\t\trad = w / 2;\n\t\tr2 = rad + rad;\n\t}\n\tif (r2 > h)\n\t{\n\t\trad = h / 2;\n\t}\n\n\t/* Setup filled circle drawing for corners */\n\tx = x1 + rad;\n\ty = y1 + rad;\n\tdx = x2 - x1 - rad - rad;\n\tdy = y2 - y1 - rad - rad;\n\n\t/*\n\t* Set color\n\t*/\n\tresult = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\n\n\t/*\n\t* Draw corners\n\t*/\n\tdo {\n\t\txpcx = x + cx;\n\t\txmcx = x - cx;\n\t\txpcy = x + cy;\n\t\txmcy = x - cy;\n\t\tif (ocy != cy) {\n\t\t\tif (cy > 0) {\n\t\t\t\typcy = y + cy;\n\t\t\t\tymcy = y - cy;\n\t\t\t\tresult |= hline(renderer, xmcx, xpcx + dx, ypcy + dy);\n\t\t\t\tresult |= hline(renderer, xmcx, xpcx + dx, ymcy);\n\t\t\t} else {\n\t\t\t\tresult |= hline(renderer, xmcx, xpcx + dx, y);\n\t\t\t}\n\t\t\tocy = cy;\n\t\t}\n\t\tif (ocx != cx) {\n\t\t\tif (cx != cy) {\n\t\t\t\tif (cx > 0) {\n\t\t\t\t\typcx = y + cx;\n\t\t\t\t\tymcx = y - cx;\n\t\t\t\t\tresult |= hline(renderer, xmcy, xpcy + dx, ymcx);\n\t\t\t\t\tresult |= hline(renderer, xmcy, xpcy + dx, ypcx + dy);\n\t\t\t\t} else {\n\t\t\t\t\tresult |= hline(renderer, xmcy, xpcy + dx, y);\n\t\t\t\t}\n\t\t\t}\n\t\t\tocx = cx;\n\t\t}\n\n\t\t/*\n\t\t* Update \n\t\t*/\n\t\tif (df < 0) {\n\t\t\tdf += d_e;\n\t\t\td_e += 2;\n\t\t\td_se += 2;\n\t\t} else {\n\t\t\tdf += d_se;\n\t\t\td_e += 2;\n\t\t\td_se += 4;\n\t\t\tcy--;\n\t\t}\n\t\tcx++;\n\t} while (cx <= cy);\n\n\t/* Inside */\n\tif (dx > 0 && dy > 0) {\n\t\tresult |= boxRGBA(renderer, x1, y1 + rad + 1, x2, y2 - rad, r, g, b, a);\n\t}\n\n\treturn (result);\n}\n\n/* ---- Box */\n\n/*!\n\\brief Draw box (filled rectangle) with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. top right) of the box.\n\\param y1 Y coordinate of the first point (i.e. top right) of the box.\n\\param x2 X coordinate of the second point (i.e. bottom left) of the box.\n\\param y2 Y coordinate of the second point (i.e. bottom left) of the box.\n\\param color The color value of the box to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint boxColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn boxRGBA(renderer, x1, y1, x2, y2, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw box (filled rectangle) with blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. top right) of the box.\n\\param y1 Y coordinate of the first point (i.e. top right) of the box.\n\\param x2 X coordinate of the second point (i.e. bottom left) of the box.\n\\param y2 Y coordinate of the second point (i.e. bottom left) of the box.\n\\param r The red value of the box to draw. \n\\param g The green value of the box to draw. \n\\param b The blue value of the box to draw. \n\\param a The alpha value of the box to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint boxRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result;\n\tSint16 tmp;\n\tSDL_Rect rect;\n\n\t/*\n\t* Test for special cases of straight lines or single point \n\t*/\n\tif (x1 == x2) {\n\t\tif (y1 == y2) {\n\t\t\treturn (pixelRGBA(renderer, x1, y1, r, g, b, a));\n\t\t} else {\n\t\t\treturn (vlineRGBA(renderer, x1, y1, y2, r, g, b, a));\n\t\t}\n\t} else {\n\t\tif (y1 == y2) {\n\t\t\treturn (hlineRGBA(renderer, x1, x2, y1, r, g, b, a));\n\t\t}\n\t}\n\n\t/*\n\t* Swap x1, x2 if required \n\t*/\n\tif (x1 > x2) {\n\t\ttmp = x1;\n\t\tx1 = x2;\n\t\tx2 = tmp;\n\t}\n\n\t/*\n\t* Swap y1, y2 if required \n\t*/\n\tif (y1 > y2) {\n\t\ttmp = y1;\n\t\ty1 = y2;\n\t\ty2 = tmp;\n\t}\n\n\t/* \n\t* Create destination rect\n\t*/\t\n\trect.x = x1;\n\trect.y = y1;\n\trect.w = x2 - x1 + 1;\n\trect.h = y2 - y1 + 1;\n\t\n\t/*\n\t* Draw\n\t*/\n\tresult = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\t\n\tresult |= SDL_RenderFillRect(renderer, &rect);\n\treturn result;\n}\n\n/* ----- Line */\n\n/*!\n\\brief Draw line with alpha blending using the currently set color.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the line.\n\\param y1 Y coordinate of the first point of the line.\n\\param x2 X coordinate of the second point of the line.\n\\param y2 Y coordinate of the second point of the line.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint line(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2)\n{\n\t/*\n\t* Draw\n\t*/\n\treturn SDL_RenderDrawLine(renderer, x1, y1, x2, y2);\n}\n\n/*!\n\\brief Draw line with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the line.\n\\param y1 Y coordinate of the first point of the line.\n\\param x2 X coordinate of the second point of the line.\n\\param y2 Y coordinate of the seond point of the line.\n\\param color The color value of the line to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint lineColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn lineRGBA(renderer, x1, y1, x2, y2, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw line with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the line.\n\\param y1 Y coordinate of the first point of the line.\n\\param x2 X coordinate of the second point of the line.\n\\param y2 Y coordinate of the second point of the line.\n\\param r The red value of the line to draw. \n\\param g The green value of the line to draw. \n\\param b The blue value of the line to draw. \n\\param a The alpha value of the line to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint lineRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\t/*\n\t* Draw\n\t*/\n\tint result = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\t\n\tresult |= SDL_RenderDrawLine(renderer, x1, y1, x2, y2);\n\treturn result;\n}\n\n/* ---- AA Line */\n\n#define AAlevels 256\n#define AAbits 8\n\n/*!\n\\brief Internal function to draw anti-aliased line with alpha blending and endpoint control.\n\nThis implementation of the Wu antialiasing code is based on Mike Abrash's\nDDJ article which was reprinted as Chapter 42 of his Graphics Programming\nBlack Book, but has been optimized to work with SDL and utilizes 32-bit\nfixed-point arithmetic by A. Schiffler. The endpoint control allows the\nsupression to draw the last pixel useful for rendering continous aa-lines\nwith alpha<255.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the aa-line.\n\\param y1 Y coordinate of the first point of the aa-line.\n\\param x2 X coordinate of the second point of the aa-line.\n\\param y2 Y coordinate of the second point of the aa-line.\n\\param r The red value of the aa-line to draw. \n\\param g The green value of the aa-line to draw. \n\\param b The blue value of the aa-line to draw. \n\\param a The alpha value of the aa-line to draw.\n\\param draw_endpoint Flag indicating if the endpoint should be drawn; draw if non-zero.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint _aalineRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a, int draw_endpoint)\n{\n\tSint32 xx0, yy0, xx1, yy1;\n\tint result;\n\tUint32 intshift, erracc, erradj;\n\tUint32 erracctmp, wgt, wgtcompmask;\n\tint dx, dy, tmp, xdir, y0p1, x0pxdir;\n\n\t/*\n\t* Keep on working with 32bit numbers \n\t*/\n\txx0 = x1;\n\tyy0 = y1;\n\txx1 = x2;\n\tyy1 = y2;\n\n\t/*\n\t* Reorder points to make dy positive \n\t*/\n\tif (yy0 > yy1) {\n\t\ttmp = yy0;\n\t\tyy0 = yy1;\n\t\tyy1 = tmp;\n\t\ttmp = xx0;\n\t\txx0 = xx1;\n\t\txx1 = tmp;\n\t}\n\n\t/*\n\t* Calculate distance \n\t*/\n\tdx = xx1 - xx0;\n\tdy = yy1 - yy0;\n\n\t/*\n\t* Adjust for negative dx and set xdir \n\t*/\n\tif (dx >= 0) {\n\t\txdir = 1;\n\t} else {\n\t\txdir = -1;\n\t\tdx = (-dx);\n\t}\n\t\n\t/*\n\t* Check for special cases \n\t*/\n\tif (dx == 0) {\n\t\t/*\n\t\t* Vertical line \n\t\t*/\n\t\tif (draw_endpoint)\n\t\t{\n\t\t\treturn (vlineRGBA(renderer, x1, y1, y2, r, g, b, a));\n\t\t} else {\n\t\t\tif (dy > 0) {\n\t\t\t\treturn (vlineRGBA(renderer, x1, yy0, yy0+dy, r, g, b, a));\n\t\t\t} else {\n\t\t\t\treturn (pixelRGBA(renderer, x1, y1, r, g, b, a));\n\t\t\t}\n\t\t}\n\t} else if (dy == 0) {\n\t\t/*\n\t\t* Horizontal line \n\t\t*/\n\t\tif (draw_endpoint)\n\t\t{\n\t\t\treturn (hlineRGBA(renderer, x1, x2, y1, r, g, b, a));\n\t\t} else {\n\t\t\tif (dx > 0) {\n\t\t\t\treturn (hlineRGBA(renderer, xx0, xx0+(xdir*dx), y1, r, g, b, a));\n\t\t\t} else {\n\t\t\t\treturn (pixelRGBA(renderer, x1, y1, r, g, b, a));\n\t\t\t}\n\t\t}\n\t} else if ((dx == dy) && (draw_endpoint)) {\n\t\t/*\n\t\t* Diagonal line (with endpoint)\n\t\t*/\n\t\treturn (lineRGBA(renderer, x1, y1, x2, y2,  r, g, b, a));\n\t}\n\n\n\t/*\n\t* Line is not horizontal, vertical or diagonal (with endpoint)\n\t*/\n\tresult = 0;\n\n\t/*\n\t* Zero accumulator \n\t*/\n\terracc = 0;\n\n\t/*\n\t* # of bits by which to shift erracc to get intensity level \n\t*/\n\tintshift = 32 - AAbits;\n\n\t/*\n\t* Mask used to flip all bits in an intensity weighting \n\t*/\n\twgtcompmask = AAlevels - 1;\n\n\t/*\n\t* Draw the initial pixel in the foreground color \n\t*/\n\tresult |= pixelRGBA(renderer, x1, y1, r, g, b, a);\n\n\t/*\n\t* x-major or y-major? \n\t*/\n\tif (dy > dx) {\n\n\t\t/*\n\t\t* y-major.  Calculate 16-bit fixed point fractional part of a pixel that\n\t\t* X advances every time Y advances 1 pixel, truncating the result so that\n\t\t* we won't overrun the endpoint along the X axis \n\t\t*/\n\t\t/*\n\t\t* Not-so-portable version: erradj = ((Uint64)dx << 32) / (Uint64)dy; \n\t\t*/\n\t\terradj = ((dx << 16) / dy) << 16;\n\n\t\t/*\n\t\t* draw all pixels other than the first and last \n\t\t*/\n\t\tx0pxdir = xx0 + xdir;\n\t\twhile (--dy) {\n\t\t\terracctmp = erracc;\n\t\t\terracc += erradj;\n\t\t\tif (erracc <= erracctmp) {\n\t\t\t\t/*\n\t\t\t\t* rollover in error accumulator, x coord advances \n\t\t\t\t*/\n\t\t\t\txx0 = x0pxdir;\n\t\t\t\tx0pxdir += xdir;\n\t\t\t}\n\t\t\tyy0++;\t\t/* y-major so always advance Y */\n\n\t\t\t/*\n\t\t\t* the AAbits most significant bits of erracc give us the intensity\n\t\t\t* weighting for this pixel, and the complement of the weighting for\n\t\t\t* the paired pixel. \n\t\t\t*/\n\t\t\twgt = (erracc >> intshift) & 255;\n\t\t\tresult |= pixelRGBAWeight (renderer, xx0, yy0, r, g, b, a, 255 - wgt);\n\t\t\tresult |= pixelRGBAWeight (renderer, x0pxdir, yy0, r, g, b, a, wgt);\n\t\t}\n\n\t} else {\n\n\t\t/*\n\t\t* x-major line.  Calculate 16-bit fixed-point fractional part of a pixel\n\t\t* that Y advances each time X advances 1 pixel, truncating the result so\n\t\t* that we won't overrun the endpoint along the X axis. \n\t\t*/\n\t\t/*\n\t\t* Not-so-portable version: erradj = ((Uint64)dy << 32) / (Uint64)dx; \n\t\t*/\n\t\terradj = ((dy << 16) / dx) << 16;\n\n\t\t/*\n\t\t* draw all pixels other than the first and last \n\t\t*/\n\t\ty0p1 = yy0 + 1;\n\t\twhile (--dx) {\n\n\t\t\terracctmp = erracc;\n\t\t\terracc += erradj;\n\t\t\tif (erracc <= erracctmp) {\n\t\t\t\t/*\n\t\t\t\t* Accumulator turned over, advance y \n\t\t\t\t*/\n\t\t\t\tyy0 = y0p1;\n\t\t\t\ty0p1++;\n\t\t\t}\n\t\t\txx0 += xdir;\t/* x-major so always advance X */\n\t\t\t/*\n\t\t\t* the AAbits most significant bits of erracc give us the intensity\n\t\t\t* weighting for this pixel, and the complement of the weighting for\n\t\t\t* the paired pixel. \n\t\t\t*/\n\t\t\twgt = (erracc >> intshift) & 255;\n\t\t\tresult |= pixelRGBAWeight (renderer, xx0, yy0, r, g, b, a, 255 - wgt);\n\t\t\tresult |= pixelRGBAWeight (renderer, xx0, y0p1, r, g, b, a, wgt);\n\t\t}\n\t}\n\n\t/*\n\t* Do we have to draw the endpoint \n\t*/\n\tif (draw_endpoint) {\n\t\t/*\n\t\t* Draw final pixel, always exactly intersected by the line and doesn't\n\t\t* need to be weighted. \n\t\t*/\n\t\tresult |= pixelRGBA (renderer, x2, y2, r, g, b, a);\n\t}\n\n\treturn (result);\n}\n\n/*!\n\\brief Draw anti-aliased line with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the aa-line.\n\\param y1 Y coordinate of the first point of the aa-line.\n\\param x2 X coordinate of the second point of the aa-line.\n\\param y2 Y coordinate of the second point of the aa-line.\n\\param color The color value of the aa-line to draw (0xRRGGBBAA).\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aalineColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn _aalineRGBA(renderer, x1, y1, x2, y2, c[0], c[1], c[2], c[3], 1);\n}\n\n/*!\n\\brief Draw anti-aliased line with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the aa-line.\n\\param y1 Y coordinate of the first point of the aa-line.\n\\param x2 X coordinate of the second point of the aa-line.\n\\param y2 Y coordinate of the second point of the aa-line.\n\\param r The red value of the aa-line to draw. \n\\param g The green value of the aa-line to draw. \n\\param b The blue value of the aa-line to draw. \n\\param a The alpha value of the aa-line to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aalineRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\treturn _aalineRGBA(renderer, x1, y1, x2, y2, r, g, b, a, 1);\n}\n\n/* ----- Circle */\n\n/*!\n\\brief Draw circle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the circle.\n\\param y Y coordinate of the center of the circle.\n\\param rad Radius in pixels of the circle.\n\\param color The color value of the circle to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint circleColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn ellipseRGBA(renderer, x, y, rad, rad, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw circle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the circle.\n\\param y Y coordinate of the center of the circle.\n\\param rad Radius in pixels of the circle.\n\\param r The red value of the circle to draw. \n\\param g The green value of the circle to draw. \n\\param b The blue value of the circle to draw. \n\\param a The alpha value of the circle to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint circleRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\treturn ellipseRGBA(renderer, x, y, rad, rad, r, g, b, a);\n}\n\n/* ----- Arc */\n\n/*!\n\\brief Arc with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the arc.\n\\param y Y coordinate of the center of the arc.\n\\param rad Radius in pixels of the arc.\n\\param start Starting radius in degrees of the arc. 0 degrees is down, increasing counterclockwise.\n\\param end Ending radius in degrees of the arc. 0 degrees is down, increasing counterclockwise.\n\\param color The color value of the arc to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint arcColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn arcRGBA(renderer, x, y, rad, start, end, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Arc with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the arc.\n\\param y Y coordinate of the center of the arc.\n\\param rad Radius in pixels of the arc.\n\\param start Starting radius in degrees of the arc. 0 degrees is down, increasing counterclockwise.\n\\param end Ending radius in degrees of the arc. 0 degrees is down, increasing counterclockwise.\n\\param r The red value of the arc to draw. \n\\param g The green value of the arc to draw. \n\\param b The blue value of the arc to draw. \n\\param a The alpha value of the arc to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\n/* TODO: rewrite algorithm; arc endpoints are not always drawn */\nint arcRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result;\n\tSint16 cx = 0;\n\tSint16 cy = rad;\n\tSint16 df = 1 - rad;\n\tSint16 d_e = 3;\n\tSint16 d_se = -2 * rad + 5;\n\tSint16 xpcx, xmcx, xpcy, xmcy;\n\tSint16 ypcy, ymcy, ypcx, ymcx;\n\tUint8 drawoct;\n\tint startoct, endoct, oct, stopval_start = 0, stopval_end = 0;\n\tdouble dstart, dend, temp = 0.;\n\n\t/*\n\t* Sanity check radius \n\t*/\n\tif (rad < 0) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Special case for rad=0 - draw a point \n\t*/\n\tif (rad == 0) {\n\t\treturn (pixelRGBA(renderer, x, y, r, g, b, a));\n\t}\n\n\t/*\n\t Octant labeling\n\t      \n\t  \\ 5 | 6 /\n\t   \\  |  /\n\t  4 \\ | / 7\n\t     \\|/\n\t------+------ +x\n\t     /|\\\n\t  3 / | \\ 0\n\t   /  |  \\\n\t  / 2 | 1 \\\n\t      +y\n\n\t Initially reset bitmask to 0x00000000\n\t the set whether or not to keep drawing a given octant.\n\t For example: 0x00111100 means we're drawing in octants 2-5\n\t*/\n\tdrawoct = 0; \n\n\t/*\n\t* Fixup angles\n\t*/\n\tstart %= 360;\n\tend %= 360;\n\t/* 0 <= start & end < 360; note that sometimes start > end - if so, arc goes back through 0. */\n\twhile (start < 0) start += 360;\n\twhile (end < 0) end += 360;\n\tstart %= 360;\n\tend %= 360;\n\n\t/* now, we find which octants we're drawing in. */\n\tstartoct = start / 45;\n\tendoct = end / 45;\n\toct = startoct - 1;\n\n\t/* stopval_start, stopval_end; what values of cx to stop at. */\n\tdo {\n\t\toct = (oct + 1) % 8;\n\n\t\tif (oct == startoct) {\n\t\t\t/* need to compute stopval_start for this octant.  Look at picture above if this is unclear */\n\t\t\tdstart = (double)start;\n\t\t\tswitch (oct) \n\t\t\t{\n\t\t\tcase 0:\n\t\t\tcase 3:\n\t\t\t\ttemp = sin(dstart * M_PI / 180.);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\tcase 6:\n\t\t\t\ttemp = cos(dstart * M_PI / 180.);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\tcase 5:\n\t\t\t\ttemp = -cos(dstart * M_PI / 180.);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\tcase 7:\n\t\t\t\ttemp = -sin(dstart * M_PI / 180.);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttemp *= rad;\n\t\t\tstopval_start = (int)temp;\n\n\t\t\t/* \n\t\t\tThis isn't arbitrary, but requires graph paper to explain well.\n\t\t\tThe basic idea is that we're always changing drawoct after we draw, so we\n\t\t\tstop immediately after we render the last sensible pixel at x = ((int)temp).\n\t\t\tand whether to draw in this octant initially\n\t\t\t*/\n\t\t\tif (oct % 2) drawoct |= (1 << oct);\t\t\t/* this is basically like saying drawoct[oct] = true, if drawoct were a bool array */\n\t\t\telse\t\t drawoct &= 255 - (1 << oct);\t/* this is basically like saying drawoct[oct] = false */\n\t\t}\n\t\tif (oct == endoct) {\n\t\t\t/* need to compute stopval_end for this octant */\n\t\t\tdend = (double)end;\n\t\t\tswitch (oct)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\tcase 3:\n\t\t\t\ttemp = sin(dend * M_PI / 180);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\tcase 6:\n\t\t\t\ttemp = cos(dend * M_PI / 180);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\tcase 5:\n\t\t\t\ttemp = -cos(dend * M_PI / 180);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\tcase 7:\n\t\t\t\ttemp = -sin(dend * M_PI / 180);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttemp *= rad;\n\t\t\tstopval_end = (int)temp;\n\n\t\t\t/* and whether to draw in this octant initially */\n\t\t\tif (startoct == endoct)\t{\n\t\t\t\t/* note:      we start drawing, stop, then start again in this case */\n\t\t\t\t/* otherwise: we only draw in this octant, so initialize it to false, it will get set back to true */\n\t\t\t\tif (start > end) {\n\t\t\t\t\t/* unfortunately, if we're in the same octant and need to draw over the whole circle, */\n\t\t\t\t\t/* we need to set the rest to true, because the while loop will end at the bottom. */\n\t\t\t\t\tdrawoct = 255;\n\t\t\t\t} else {\n\t\t\t\t\tdrawoct &= 255 - (1 << oct);\n\t\t\t\t}\n\t\t\t} \n\t\t\telse if (oct % 2) drawoct &= 255 - (1 << oct);\n\t\t\telse\t\t\t  drawoct |= (1 << oct);\n\t\t} else if (oct != startoct) { /* already verified that it's != endoct */\n\t\t\tdrawoct |= (1 << oct); /* draw this entire segment */\n\t\t}\n\t} while (oct != endoct);\n\n\t/* so now we have what octants to draw and when to draw them. all that's left is the actual raster code. */\n\n\t/*\n\t* Set color \n\t*/\n\tresult = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\n\n\t/*\n\t* Draw arc \n\t*/\n\tdo {\n\t\typcy = y + cy;\n\t\tymcy = y - cy;\n\t\tif (cx > 0) {\n\t\t\txpcx = x + cx;\n\t\t\txmcx = x - cx;\n\n\t\t\t/* always check if we're drawing a certain octant before adding a pixel to that octant. */\n\t\t\tif (drawoct & 4)  result |= pixel(renderer, xmcx, ypcy);\n\t\t\tif (drawoct & 2)  result |= pixel(renderer, xpcx, ypcy);\n\t\t\tif (drawoct & 32) result |= pixel(renderer, xmcx, ymcy);\n\t\t\tif (drawoct & 64) result |= pixel(renderer, xpcx, ymcy);\n\t\t} else {\n\t\t\tif (drawoct & 96) result |= pixel(renderer, x, ymcy);\n\t\t\tif (drawoct & 6)  result |= pixel(renderer, x, ypcy);\n\t\t}\n\n\t\txpcy = x + cy;\n\t\txmcy = x - cy;\n\t\tif (cx > 0 && cx != cy) {\n\t\t\typcx = y + cx;\n\t\t\tymcx = y - cx;\n\t\t\tif (drawoct & 8)   result |= pixel(renderer, xmcy, ypcx);\n\t\t\tif (drawoct & 1)   result |= pixel(renderer, xpcy, ypcx);\n\t\t\tif (drawoct & 16)  result |= pixel(renderer, xmcy, ymcx);\n\t\t\tif (drawoct & 128) result |= pixel(renderer, xpcy, ymcx);\n\t\t} else if (cx == 0) {\n\t\t\tif (drawoct & 24)  result |= pixel(renderer, xmcy, y);\n\t\t\tif (drawoct & 129) result |= pixel(renderer, xpcy, y);\n\t\t}\n\n\t\t/*\n\t\t* Update whether we're drawing an octant\n\t\t*/\n\t\tif (stopval_start == cx) {\n\t\t\t/* works like an on-off switch. */  \n\t\t\t/* This is just in case start & end are in the same octant. */\n\t\t\tif (drawoct & (1 << startoct)) drawoct &= 255 - (1 << startoct);\t\t\n\t\t\telse\t\t\t\t\t\t   drawoct |= (1 << startoct);\n\t\t}\n\t\tif (stopval_end == cx) {\n\t\t\tif (drawoct & (1 << endoct)) drawoct &= 255 - (1 << endoct);\n\t\t\telse\t\t\t\t\t\t drawoct |= (1 << endoct);\n\t\t}\n\n\t\t/*\n\t\t* Update pixels\n\t\t*/\n\t\tif (df < 0) {\n\t\t\tdf += d_e;\n\t\t\td_e += 2;\n\t\t\td_se += 2;\n\t\t} else {\n\t\t\tdf += d_se;\n\t\t\td_e += 2;\n\t\t\td_se += 4;\n\t\t\tcy--;\n\t\t}\n\t\tcx++;\n\t} while (cx <= cy);\n\n\treturn (result);\n}\n\n/* ----- AA Circle */\n\n/*!\n\\brief Draw anti-aliased circle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the aa-circle.\n\\param y Y coordinate of the center of the aa-circle.\n\\param rad Radius in pixels of the aa-circle.\n\\param color The color value of the aa-circle to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aacircleColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn aaellipseRGBA(renderer, x, y, rad, rad, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw anti-aliased circle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the aa-circle.\n\\param y Y coordinate of the center of the aa-circle.\n\\param rad Radius in pixels of the aa-circle.\n\\param r The red value of the aa-circle to draw. \n\\param g The green value of the aa-circle to draw. \n\\param b The blue value of the aa-circle to draw. \n\\param a The alpha value of the aa-circle to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aacircleRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\t/*\n\t* Draw \n\t*/\n\treturn aaellipseRGBA(renderer, x, y, rad, rad, r, g, b, a);\n}\n\n/* ----- Ellipse */\n\n/*!\n\\brief Internal function to draw pixels or lines in 4 quadrants.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the quadrant.\n\\param y Y coordinate of the center of the quadrant.\n\\param dx X offset in pixels of the corners of the quadrant.\n\\param dy Y offset in pixels of the corners of the quadrant.\n\\param f Flag indicating if the quadrant should be filled (1) or not (0).\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint _drawQuadrants(SDL_Renderer * renderer,  Sint16 x, Sint16 y, Sint16 dx, Sint16 dy, Sint32 f)\n{\n\tint result = 0;\n\tSint16 xpdx, xmdx;\n\tSint16 ypdy, ymdy;\n\n\tif (dx == 0) {\n\t\tif (dy == 0) {\n\t\t\tresult |= pixel(renderer, x, y);\n\t\t} else {\n\t\t\typdy = y + dy;\n\t\t\tymdy = y - dy;\n\t\t\tif (f) {\n\t\t\t\tresult |= vline(renderer, x, ymdy, ypdy);\n\t\t\t} else {\n\t\t\t\tresult |= pixel(renderer, x, ypdy);\n\t\t\t\tresult |= pixel(renderer, x, ymdy);\n\t\t\t}\n\t\t}\n\t} else {\t\n\t\txpdx = x + dx;\n\t\txmdx = x - dx;\n\t\typdy = y + dy;\n\t\tymdy = y - dy;\n\t\tif (f) {\n\t\t\t\tresult |= vline(renderer, xpdx, ymdy, ypdy);\n\t\t\t\tresult |= vline(renderer, xmdx, ymdy, ypdy);\n\t\t} else {\n\t\t\t\tresult |= pixel(renderer, xpdx, ypdy);\n\t\t\t\tresult |= pixel(renderer, xmdx, ypdy);\n\t\t\t\tresult |= pixel(renderer, xpdx, ymdy);\n\t\t\t\tresult |= pixel(renderer, xmdx, ymdy);\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/*!\n\\brief Internal function to draw ellipse or filled ellipse with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the ellipse.\n\\param y Y coordinate of the center of the ellipse.\n\\param rx Horizontal radius in pixels of the ellipse.\n\\param ry Vertical radius in pixels of the ellipse.\n\\param r The red value of the ellipse to draw. \n\\param g The green value of the ellipse to draw. \n\\param b The blue value of the ellipse to draw. \n\\param a The alpha value of the ellipse to draw.\n\\param f Flag indicating if the ellipse should be filled (1) or not (0).\n\n\\returns Returns 0 on success, -1 on failure.\n*/\n#define DEFAULT_ELLIPSE_OVERSCAN\t4\nint _ellipseRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a, Sint32 f)\n{\n\tint result;\n\tSint32 rxi, ryi;\n\tSint32 rx2, ry2, rx22, ry22; \n    Sint32 error;\n    Sint32 curX, curY, curXp1, curYm1;\n\tSint32 scrX, scrY, oldX, oldY;\n    Sint32 deltaX, deltaY;\n\tSint32 ellipseOverscan;\n\n\t/*\n\t* Sanity check radii \n\t*/\n\tif ((rx < 0) || (ry < 0)) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Set color\n\t*/\n\tresult = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\n\n\t/*\n\t* Special cases for rx=0 and/or ry=0: draw a hline/vline/pixel \n\t*/\n\tif (rx == 0) {\n\t\tif (ry == 0) {\n\t\t\treturn (pixel(renderer, x, y));\n\t\t} else {\n\t\t\treturn (vline(renderer, x, y - ry, y + ry));\n\t\t}\n\t} else {\n\t\tif (ry == 0) {\n\t\t\treturn (hline(renderer, x - rx, x + rx, y));\n\t\t}\n\t}\n\t\n\t/*\n \t * Adjust overscan \n\t */\n\trxi = rx;\n\tryi = ry;\n\tif (rxi >= 512 || ryi >= 512)\n\t{\n\t\tellipseOverscan = DEFAULT_ELLIPSE_OVERSCAN / 4;\n\t} \n\telse if (rxi >= 256 || ryi >= 256)\n\t{\n\t\tellipseOverscan = DEFAULT_ELLIPSE_OVERSCAN / 2;\n\t}\n\telse\n\t{\n\t\tellipseOverscan = DEFAULT_ELLIPSE_OVERSCAN / 1;\n\t}\n\n\t/*\n\t * Top/bottom center points.\n\t */\n\toldX = scrX = 0;\n\toldY = scrY = ryi;\n\tresult |= _drawQuadrants(renderer, x, y, 0, ry, f);\n\n\t/* Midpoint ellipse algorithm with overdraw */\n\trxi *= ellipseOverscan;\n\tryi *= ellipseOverscan;\n\trx2 = rxi * rxi;\n\trx22 = rx2 + rx2;\n    ry2 = ryi * ryi;\n\try22 = ry2 + ry2;\n    curX = 0;\n    curY = ryi;\n    deltaX = 0;\n    deltaY = rx22 * curY;\n \n\t/* Points in segment 1 */ \n    error = ry2 - rx2 * ryi + rx2 / 4;\n    while (deltaX <= deltaY)\n    {\n          curX++;\n          deltaX += ry22;\n \n          error +=  deltaX + ry2; \n          if (error >= 0)\n          {\n               curY--;\n               deltaY -= rx22; \n               error -= deltaY;\n          }\n\n\t\t  scrX = curX / ellipseOverscan;\n\t\t  scrY = curY / ellipseOverscan;\n\t\t  if ((scrX != oldX && scrY == oldY) || (scrX != oldX && scrY != oldY)) {\n\t\t\tresult |= _drawQuadrants(renderer, x, y, scrX, scrY, f);\n\t\t\toldX = scrX;\n\t\t\toldY = scrY;\n\t\t  }\n    }\n\n\t/* Points in segment 2 */\n\tif (curY > 0) \n\t{\n\t\tcurXp1 = curX + 1;\n\t\tcurYm1 = curY - 1;\n\t\terror = ry2 * curX * curXp1 + ((ry2 + 3) / 4) + rx2 * curYm1 * curYm1 - rx2 * ry2;\n\t\twhile (curY > 0)\n\t\t{\n\t\t\tcurY--;\n\t\t\tdeltaY -= rx22;\n\n\t\t\terror += rx2;\n\t\t\terror -= deltaY;\n \n\t\t\tif (error <= 0) \n\t\t\t{\n               curX++;\n               deltaX += ry22;\n               error += deltaX;\n\t\t\t}\n\n\t\t    scrX = curX / ellipseOverscan;\n\t\t    scrY = curY / ellipseOverscan;\n\t\t    if ((scrX != oldX && scrY == oldY) || (scrX != oldX && scrY != oldY)) {\n\t\t\t\toldY--;\n\t\t\t\tfor (;oldY >= scrY; oldY--) {\n\t\t\t\t\tresult |= _drawQuadrants(renderer, x, y, scrX, oldY, f);\n\t\t\t\t\t/* prevent overdraw */\n\t\t\t\t\tif (f) {\n\t\t\t\t\t\toldY = scrY - 1;\n\t\t\t\t\t}\n\t\t\t\t}\n  \t\t\t\toldX = scrX;\n\t\t\t\toldY = scrY;\n\t\t    }\t\t\n\t\t}\n\n\t\t/* Remaining points in vertical */\n\t\tif (!f) {\n\t\t\toldY--;\n\t\t\tfor (;oldY >= 0; oldY--) {\n\t\t\t\tresult |= _drawQuadrants(renderer, x, y, scrX, oldY, f);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn (result);\n}\n\n/*!\n\\brief Draw ellipse with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the ellipse.\n\\param y Y coordinate of the center of the ellipse.\n\\param rx Horizontal radius in pixels of the ellipse.\n\\param ry Vertical radius in pixels of the ellipse.\n\\param color The color value of the ellipse to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint ellipseColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn _ellipseRGBA(renderer, x, y, rx, ry, c[0], c[1], c[2], c[3], 0);\n}\n\n/*!\n\\brief Draw ellipse with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the ellipse.\n\\param y Y coordinate of the center of the ellipse.\n\\param rx Horizontal radius in pixels of the ellipse.\n\\param ry Vertical radius in pixels of the ellipse.\n\\param r The red value of the ellipse to draw. \n\\param g The green value of the ellipse to draw. \n\\param b The blue value of the ellipse to draw. \n\\param a The alpha value of the ellipse to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint ellipseRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\treturn _ellipseRGBA(renderer, x, y, rx, ry, r, g, b, a, 0);\n}\n\n/* ----- Filled Circle */\n\n/*!\n\\brief Draw filled circle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the filled circle.\n\\param y Y coordinate of the center of the filled circle.\n\\param rad Radius in pixels of the filled circle.\n\\param color The color value of the filled circle to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledCircleColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn filledEllipseRGBA(renderer, x, y, rad, rad, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw filled circle with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the filled circle.\n\\param y Y coordinate of the center of the filled circle.\n\\param rad Radius in pixels of the filled circle.\n\\param r The red value of the filled circle to draw. \n\\param g The green value of the filled circle to draw. \n\\param b The blue value of the filled circle to draw. \n\\param a The alpha value of the filled circle to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledCircleRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\treturn _ellipseRGBA(renderer, x, y, rad, rad, r, g ,b, a, 1);\n}\n\n\n/* ----- AA Ellipse */\n\n/* Windows targets do not have lrint, so provide a local inline version */\n#if defined(_MSC_VER)\n/* Detect 64bit and use intrinsic version */\n#ifdef _M_X64\n#include <emmintrin.h>\nstatic __inline long \n\tlrint(float f) \n{\n\treturn _mm_cvtss_si32(_mm_load_ss(&f));\n}\n#elif defined(_M_IX86)\n__inline long int\n\tlrint (double flt)\n{\t\n\tint intgr;\n\t_asm\n\t{\n\t\tfld flt\n\t\t\tfistp intgr\n\t};\n\treturn intgr;\n}\n#elif defined(_M_ARM)\n#include <armintr.h>\n#pragma warning(push)\n#pragma warning(disable: 4716)\n__declspec(naked) long int\n\tlrint (double flt)\n{\n\t__emit(0xEC410B10); // fmdrr  d0, r0, r1\n\t__emit(0xEEBD0B40); // ftosid s0, d0\n\t__emit(0xEE100A10); // fmrs   r0, s0\n\t__emit(0xE12FFF1E); // bx     lr\n}\n#pragma warning(pop)\n#else\n#error lrint needed for MSVC on non X86/AMD64/ARM targets.\n#endif\n#endif\n\n/*!\n\\brief Draw anti-aliased ellipse with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the aa-ellipse.\n\\param y Y coordinate of the center of the aa-ellipse.\n\\param rx Horizontal radius in pixels of the aa-ellipse.\n\\param ry Vertical radius in pixels of the aa-ellipse.\n\\param color The color value of the aa-ellipse to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aaellipseColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn aaellipseRGBA(renderer, x, y, rx, ry, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw anti-aliased ellipse with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the aa-ellipse.\n\\param y Y coordinate of the center of the aa-ellipse.\n\\param rx Horizontal radius in pixels of the aa-ellipse.\n\\param ry Vertical radius in pixels of the aa-ellipse.\n\\param r The red value of the aa-ellipse to draw. \n\\param g The green value of the aa-ellipse to draw. \n\\param b The blue value of the aa-ellipse to draw. \n\\param a The alpha value of the aa-ellipse to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aaellipseRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result;\n\tint i;\n\tint a2, b2, ds, dt, dxt, t, s, d;\n\tSint16 xp, yp, xs, ys, dyt, od, xx, yy, xc2, yc2;\n\tfloat cp;\n\tdouble sab;\n\tUint8 weight, iweight;\n\n\t/*\n\t* Sanity check radii \n\t*/\n\tif ((rx < 0) || (ry < 0)) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Special cases for rx=0 and/or ry=0: draw a hline/vline/pixel \n\t*/\n\tif (rx == 0) {\n\t\tif (ry == 0) {\n\t\t\treturn (pixelRGBA(renderer, x, y, r, g, b, a));\n\t\t} else {\n\t\t\treturn (vlineRGBA(renderer, x, y - ry, y + ry, r, g, b, a));\n\t\t}\n\t} else {\n\t\tif (ry == 0) {\n\t\t\treturn (hlineRGBA(renderer, x - rx, x + rx, y, r, g, b, a));\n\t\t}\n\t}\n\n\t/* Variable setup */\n\ta2 = rx * rx;\n\tb2 = ry * ry;\n\n\tds = 2 * a2;\n\tdt = 2 * b2;\n\n\txc2 = 2 * x;\n\tyc2 = 2 * y;\n\n\tsab = sqrt((double)(a2 + b2));\n\tod = (Sint16)lrint(sab*0.01) + 1; /* introduce some overdraw */\n\tdxt = (Sint16)lrint((double)a2 / sab) + od;\n\n\tt = 0;\n\ts = -2 * a2 * ry;\n\td = 0;\n\n\txp = x;\n\typ = y - ry;\n\n\t/* Draw */\n\tresult = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\n\t/* \"End points\" */\n\tresult |= pixelRGBA(renderer, xp, yp, r, g, b, a);\n\tresult |= pixelRGBA(renderer, xc2 - xp, yp, r, g, b, a);\n\tresult |= pixelRGBA(renderer, xp, yc2 - yp, r, g, b, a);\n\tresult |= pixelRGBA(renderer, xc2 - xp, yc2 - yp, r, g, b, a);\n\n\tfor (i = 1; i <= dxt; i++) {\n\t\txp--;\n\t\td += t - b2;\n\n\t\tif (d >= 0)\n\t\t\tys = yp - 1;\n\t\telse if ((d - s - a2) > 0) {\n\t\t\tif ((2 * d - s - a2) >= 0)\n\t\t\t\tys = yp + 1;\n\t\t\telse {\n\t\t\t\tys = yp;\n\t\t\t\typ++;\n\t\t\t\td -= s + a2;\n\t\t\t\ts += ds;\n\t\t\t}\n\t\t} else {\n\t\t\typ++;\n\t\t\tys = yp + 1;\n\t\t\td -= s + a2;\n\t\t\ts += ds;\n\t\t}\n\n\t\tt -= dt;\n\n\t\t/* Calculate alpha */\n\t\tif (s != 0) {\n\t\t\tcp = (float) abs(d) / (float) abs(s);\n\t\t\tif (cp > 1.0) {\n\t\t\t\tcp = 1.0;\n\t\t\t}\n\t\t} else {\n\t\t\tcp = 1.0;\n\t\t}\n\n\t\t/* Calculate weights */\n\t\tweight = (Uint8) (cp * 255);\n\t\tiweight = 255 - weight;\n\n\t\t/* Upper half */\n\t\txx = xc2 - xp;\n\t\tresult |= pixelRGBAWeight(renderer, xp, yp, r, g, b, a, iweight);\n\t\tresult |= pixelRGBAWeight(renderer, xx, yp, r, g, b, a, iweight);\n\n\t\tresult |= pixelRGBAWeight(renderer, xp, ys, r, g, b, a, weight);\n\t\tresult |= pixelRGBAWeight(renderer, xx, ys, r, g, b, a, weight);\n\n\t\t/* Lower half */\n\t\tyy = yc2 - yp;\n\t\tresult |= pixelRGBAWeight(renderer, xp, yy, r, g, b, a, iweight);\n\t\tresult |= pixelRGBAWeight(renderer, xx, yy, r, g, b, a, iweight);\n\n\t\tyy = yc2 - ys;\n\t\tresult |= pixelRGBAWeight(renderer, xp, yy, r, g, b, a, weight);\n\t\tresult |= pixelRGBAWeight(renderer, xx, yy, r, g, b, a, weight);\n\t}\n\n\t/* Replaces original approximation code dyt = abs(yp - yc); */\n\tdyt = (Sint16)lrint((double)b2 / sab ) + od;    \n\n\tfor (i = 1; i <= dyt; i++) {\n\t\typ++;\n\t\td -= s + a2;\n\n\t\tif (d <= 0)\n\t\t\txs = xp + 1;\n\t\telse if ((d + t - b2) < 0) {\n\t\t\tif ((2 * d + t - b2) <= 0)\n\t\t\t\txs = xp - 1;\n\t\t\telse {\n\t\t\t\txs = xp;\n\t\t\t\txp--;\n\t\t\t\td += t - b2;\n\t\t\t\tt -= dt;\n\t\t\t}\n\t\t} else {\n\t\t\txp--;\n\t\t\txs = xp - 1;\n\t\t\td += t - b2;\n\t\t\tt -= dt;\n\t\t}\n\n\t\ts += ds;\n\n\t\t/* Calculate alpha */\n\t\tif (t != 0) {\n\t\t\tcp = (float) abs(d) / (float) abs(t);\n\t\t\tif (cp > 1.0) {\n\t\t\t\tcp = 1.0;\n\t\t\t}\n\t\t} else {\n\t\t\tcp = 1.0;\n\t\t}\n\n\t\t/* Calculate weight */\n\t\tweight = (Uint8) (cp * 255);\n\t\tiweight = 255 - weight;\n\n\t\t/* Left half */\n\t\txx = xc2 - xp;\n\t\tyy = yc2 - yp;\n\t\tresult |= pixelRGBAWeight(renderer, xp, yp, r, g, b, a, iweight);\n\t\tresult |= pixelRGBAWeight(renderer, xx, yp, r, g, b, a, iweight);\n\n\t\tresult |= pixelRGBAWeight(renderer, xp, yy, r, g, b, a, iweight);\n\t\tresult |= pixelRGBAWeight(renderer, xx, yy, r, g, b, a, iweight);\n\n\t\t/* Right half */\n\t\txx = xc2 - xs;\n\t\tresult |= pixelRGBAWeight(renderer, xs, yp, r, g, b, a, weight);\n\t\tresult |= pixelRGBAWeight(renderer, xx, yp, r, g, b, a, weight);\n\n\t\tresult |= pixelRGBAWeight(renderer, xs, yy, r, g, b, a, weight);\n\t\tresult |= pixelRGBAWeight(renderer, xx, yy, r, g, b, a, weight);\t\t\n\t}\n\n\treturn (result);\n}\n\n/* ---- Filled Ellipse */\n\n/*!\n\\brief Draw filled ellipse with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the filled ellipse.\n\\param y Y coordinate of the center of the filled ellipse.\n\\param rx Horizontal radius in pixels of the filled ellipse.\n\\param ry Vertical radius in pixels of the filled ellipse.\n\\param color The color value of the filled ellipse to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledEllipseColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn _ellipseRGBA(renderer, x, y, rx, ry, c[0], c[1], c[2], c[3], 1);\n}\n\n/*!\n\\brief Draw filled ellipse with blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the filled ellipse.\n\\param y Y coordinate of the center of the filled ellipse.\n\\param rx Horizontal radius in pixels of the filled ellipse.\n\\param ry Vertical radius in pixels of the filled ellipse.\n\\param r The red value of the filled ellipse to draw. \n\\param g The green value of the filled ellipse to draw. \n\\param b The blue value of the filled ellipse to draw. \n\\param a The alpha value of the filled ellipse to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledEllipseRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\treturn _ellipseRGBA(renderer, x, y, rx, ry, r, g, b, a, 1);\n}\n\n/* ----- Pie */\n\n/*!\n\\brief Internal float (low-speed) pie-calc implementation by drawing polygons.\n\nNote: Determines vertex array and uses polygon or filledPolygon drawing routines to render.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the pie.\n\\param y Y coordinate of the center of the pie.\n\\param rad Radius in pixels of the pie.\n\\param start Starting radius in degrees of the pie.\n\\param end Ending radius in degrees of the pie.\n\\param r The red value of the pie to draw. \n\\param g The green value of the pie to draw. \n\\param b The blue value of the pie to draw. \n\\param a The alpha value of the pie to draw.\n\\param filled Flag indicating if the pie should be filled (=1) or not (=0).\n\n\\returns Returns 0 on success, -1 on failure.\n*/\n/* TODO: rewrite algorithm; pie is not always accurate */\nint _pieRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end,  Uint8 r, Uint8 g, Uint8 b, Uint8 a, Uint8 filled)\n{\n\tint result;\n\tdouble angle, start_angle, end_angle;\n\tdouble deltaAngle;\n\tdouble dr;\n\tint numpoints, i;\n\tSint16 *vx, *vy;\n\n\t/*\n\t* Sanity check radii \n\t*/\n\tif (rad < 0) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Fixup angles\n\t*/\n\tstart = start % 360;\n\tend = end % 360;\n\n\t/*\n\t* Special case for rad=0 - draw a point \n\t*/\n\tif (rad == 0) {\n\t\treturn (pixelRGBA(renderer, x, y, r, g, b, a));\n\t}\n\n\t/*\n\t* Variable setup \n\t*/\n\tdr = (double) rad;\n\tdeltaAngle = 3.0 / dr;\n\tstart_angle = (double) start *(2.0 * M_PI / 360.0);\n\tend_angle = (double) end *(2.0 * M_PI / 360.0);\n\tif (start > end) {\n\t\tend_angle += (2.0 * M_PI);\n\t}\n\n\t/* We will always have at least 2 points */\n\tnumpoints = 2;\n\n\t/* Count points (rather than calculating it) */\n\tangle = start_angle;\n\twhile (angle < end_angle) {\n\t\tangle += deltaAngle;\n\t\tnumpoints++;\n\t}\n\n\t/* Allocate combined vertex array */\n\tvx = vy = (Sint16 *) malloc(2 * sizeof(Uint16) * numpoints);\n\tif (vx == NULL) {\n\t\treturn (-1);\n\t}\n\n\t/* Update point to start of vy */\n\tvy += numpoints;\n\n\t/* Center */\n\tvx[0] = x;\n\tvy[0] = y;\n\n\t/* First vertex */\n\tangle = start_angle;\n\tvx[1] = x + (int) (dr * cos(angle));\n\tvy[1] = y + (int) (dr * sin(angle));\n\n\tif (numpoints<3)\n\t{\n\t\tresult = lineRGBA(renderer, vx[0], vy[0], vx[1], vy[1], r, g, b, a);\n\t}\n\telse\n\t{\n\t\t/* Calculate other vertices */\n\t\ti = 2;\n\t\tangle = start_angle;\n\t\twhile (angle < end_angle) {\n\t\t\tangle += deltaAngle;\n\t\t\tif (angle>end_angle)\n\t\t\t{\n\t\t\t\tangle = end_angle;\n\t\t\t}\n\t\t\tvx[i] = x + (int) (dr * cos(angle));\n\t\t\tvy[i] = y + (int) (dr * sin(angle));\n\t\t\ti++;\n\t\t}\n\n\t\t/* Draw */\n\t\tif (filled) {\n\t\t\tresult = filledPolygonRGBA(renderer, vx, vy, numpoints, r, g, b, a);\n\t\t} else {\n\t\t\tresult = polygonRGBA(renderer, vx, vy, numpoints, r, g, b, a);\n\t\t}\n\t}\n\n\t/* Free combined vertex array */\n\tfree(vx);\n\n\treturn (result);\n}\n\n/*!\n\\brief Draw pie (outline) with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the pie.\n\\param y Y coordinate of the center of the pie.\n\\param rad Radius in pixels of the pie.\n\\param start Starting radius in degrees of the pie.\n\\param end Ending radius in degrees of the pie.\n\\param color The color value of the pie to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint pieColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, \n\tSint16 start, Sint16 end, Uint32 color) \n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn _pieRGBA(renderer, x, y, rad, start, end, c[0], c[1], c[2], c[3], 0);\n}\n\n/*!\n\\brief Draw pie (outline) with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the pie.\n\\param y Y coordinate of the center of the pie.\n\\param rad Radius in pixels of the pie.\n\\param start Starting radius in degrees of the pie.\n\\param end Ending radius in degrees of the pie.\n\\param r The red value of the pie to draw. \n\\param g The green value of the pie to draw. \n\\param b The blue value of the pie to draw. \n\\param a The alpha value of the pie to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint pieRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad,\n\tSint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\treturn _pieRGBA(renderer, x, y, rad, start, end, r, g, b, a, 0);\n}\n\n/*!\n\\brief Draw filled pie with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the filled pie.\n\\param y Y coordinate of the center of the filled pie.\n\\param rad Radius in pixels of the filled pie.\n\\param start Starting radius in degrees of the filled pie.\n\\param end Ending radius in degrees of the filled pie.\n\\param color The color value of the filled pie to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledPieColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn _pieRGBA(renderer, x, y, rad, start, end, c[0], c[1], c[2], c[3], 1);\n}\n\n/*!\n\\brief Draw filled pie with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x X coordinate of the center of the filled pie.\n\\param y Y coordinate of the center of the filled pie.\n\\param rad Radius in pixels of the filled pie.\n\\param start Starting radius in degrees of the filled pie.\n\\param end Ending radius in degrees of the filled pie.\n\\param r The red value of the filled pie to draw. \n\\param g The green value of the filled pie to draw. \n\\param b The blue value of the filled pie to draw. \n\\param a The alpha value of the filled pie to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledPieRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad,\n\tSint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\treturn _pieRGBA(renderer, x, y, rad, start, end, r, g, b, a, 1);\n}\n\n/* ------ Trigon */\n\n/*!\n\\brief Draw trigon (triangle outline) with alpha blending.\n\nNote: Creates vertex array and uses polygon routine to render.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the trigon.\n\\param y1 Y coordinate of the first point of the trigon.\n\\param x2 X coordinate of the second point of the trigon.\n\\param y2 Y coordinate of the second point of the trigon.\n\\param x3 X coordinate of the third point of the trigon.\n\\param y3 Y coordinate of the third point of the trigon.\n\\param color The color value of the trigon to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint trigonColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color)\n{\n\tSint16 vx[3]; \n\tSint16 vy[3];\n\n\tvx[0]=x1;\n\tvx[1]=x2;\n\tvx[2]=x3;\n\tvy[0]=y1;\n\tvy[1]=y2;\n\tvy[2]=y3;\n\n\treturn(polygonColor(renderer,vx,vy,3,color));\n}\n\n/*!\n\\brief Draw trigon (triangle outline) with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the trigon.\n\\param y1 Y coordinate of the first point of the trigon.\n\\param x2 X coordinate of the second point of the trigon.\n\\param y2 Y coordinate of the second point of the trigon.\n\\param x3 X coordinate of the third point of the trigon.\n\\param y3 Y coordinate of the third point of the trigon.\n\\param r The red value of the trigon to draw. \n\\param g The green value of the trigon to draw. \n\\param b The blue value of the trigon to draw. \n\\param a The alpha value of the trigon to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint trigonRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3,\n\tUint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tSint16 vx[3]; \n\tSint16 vy[3];\n\n\tvx[0]=x1;\n\tvx[1]=x2;\n\tvx[2]=x3;\n\tvy[0]=y1;\n\tvy[1]=y2;\n\tvy[2]=y3;\n\n\treturn(polygonRGBA(renderer,vx,vy,3,r,g,b,a));\n}\t\t\t\t \n\n/* ------ AA-Trigon */\n\n/*!\n\\brief Draw anti-aliased trigon (triangle outline) with alpha blending.\n\nNote: Creates vertex array and uses aapolygon routine to render.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the aa-trigon.\n\\param y1 Y coordinate of the first point of the aa-trigon.\n\\param x2 X coordinate of the second point of the aa-trigon.\n\\param y2 Y coordinate of the second point of the aa-trigon.\n\\param x3 X coordinate of the third point of the aa-trigon.\n\\param y3 Y coordinate of the third point of the aa-trigon.\n\\param color The color value of the aa-trigon to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aatrigonColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color)\n{\n\tSint16 vx[3]; \n\tSint16 vy[3];\n\n\tvx[0]=x1;\n\tvx[1]=x2;\n\tvx[2]=x3;\n\tvy[0]=y1;\n\tvy[1]=y2;\n\tvy[2]=y3;\n\n\treturn(aapolygonColor(renderer,vx,vy,3,color));\n}\n\n/*!\n\\brief Draw anti-aliased trigon (triangle outline) with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the aa-trigon.\n\\param y1 Y coordinate of the first point of the aa-trigon.\n\\param x2 X coordinate of the second point of the aa-trigon.\n\\param y2 Y coordinate of the second point of the aa-trigon.\n\\param x3 X coordinate of the third point of the aa-trigon.\n\\param y3 Y coordinate of the third point of the aa-trigon.\n\\param r The red value of the aa-trigon to draw. \n\\param g The green value of the aa-trigon to draw. \n\\param b The blue value of the aa-trigon to draw. \n\\param a The alpha value of the aa-trigon to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aatrigonRGBA(SDL_Renderer * renderer,  Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3,\n\tUint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tSint16 vx[3]; \n\tSint16 vy[3];\n\n\tvx[0]=x1;\n\tvx[1]=x2;\n\tvx[2]=x3;\n\tvy[0]=y1;\n\tvy[1]=y2;\n\tvy[2]=y3;\n\n\treturn(aapolygonRGBA(renderer,vx,vy,3,r,g,b,a));\n}\t\t\t\t   \n\n/* ------ Filled Trigon */\n\n/*!\n\\brief Draw filled trigon (triangle) with alpha blending.\n\nNote: Creates vertex array and uses aapolygon routine to render.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the filled trigon.\n\\param y1 Y coordinate of the first point of the filled trigon.\n\\param x2 X coordinate of the second point of the filled trigon.\n\\param y2 Y coordinate of the second point of the filled trigon.\n\\param x3 X coordinate of the third point of the filled trigon.\n\\param y3 Y coordinate of the third point of the filled trigon.\n\\param color The color value of the filled trigon to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledTrigonColor(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color)\n{\n\tSint16 vx[3]; \n\tSint16 vy[3];\n\n\tvx[0]=x1;\n\tvx[1]=x2;\n\tvx[2]=x3;\n\tvy[0]=y1;\n\tvy[1]=y2;\n\tvy[2]=y3;\n\n\treturn(filledPolygonColor(renderer,vx,vy,3,color));\n}\n\n/*!\n\\brief Draw filled trigon (triangle) with alpha blending.\n\nNote: Creates vertex array and uses aapolygon routine to render.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the filled trigon.\n\\param y1 Y coordinate of the first point of the filled trigon.\n\\param x2 X coordinate of the second point of the filled trigon.\n\\param y2 Y coordinate of the second point of the filled trigon.\n\\param x3 X coordinate of the third point of the filled trigon.\n\\param y3 Y coordinate of the third point of the filled trigon.\n\\param r The red value of the filled trigon to draw. \n\\param g The green value of the filled trigon to draw. \n\\param b The blue value of the filled trigon to draw. \n\\param a The alpha value of the filled trigon to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledTrigonRGBA(SDL_Renderer * renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3,\n\tUint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tSint16 vx[3]; \n\tSint16 vy[3];\n\n\tvx[0]=x1;\n\tvx[1]=x2;\n\tvx[2]=x3;\n\tvy[0]=y1;\n\tvy[1]=y2;\n\tvy[2]=y3;\n\n\treturn(filledPolygonRGBA(renderer,vx,vy,3,r,g,b,a));\n}\n\n/* ---- Polygon */\n\n/*!\n\\brief Draw polygon with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the polygon.\n\\param vy Vertex array containing Y coordinates of the points of the polygon.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\\param color The color value of the polygon to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint polygonColor(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn polygonRGBA(renderer, vx, vy, n, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw polygon with the currently set color and blend mode.\n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the polygon.\n\\param vy Vertex array containing Y coordinates of the points of the polygon.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint polygon(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n)\n{\n\t/*\n\t* Draw \n\t*/\n\tint result = 0;\n\tint i, nn;\n\tSDL_Point* points;\n\n\t/*\n\t* Vertex array NULL check \n\t*/\n\tif (vx == NULL) {\n\t\treturn (-1);\n\t}\n\tif (vy == NULL) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Sanity check \n\t*/\n\tif (n < 3) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Create array of points\n\t*/\n\tnn = n + 1;\n\tpoints = (SDL_Point*)malloc(sizeof(SDL_Point) * nn);\n\tif (points == NULL)\n\t{\n\t\treturn -1;\n\t}\n\tfor (i=0; i<n; i++)\n\t{\n\t\tpoints[i].x = vx[i];\n\t\tpoints[i].y = vy[i];\n\t}\n\tpoints[n].x = vx[0];\n\tpoints[n].y = vy[0];\n\n\t/*\n\t* Draw \n\t*/\n\tresult |= SDL_RenderDrawLines(renderer, points, nn);\n\tfree(points);\n\n\treturn (result);\n}\n\n/*!\n\\brief Draw polygon with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the polygon.\n\\param vy Vertex array containing Y coordinates of the points of the polygon.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\\param r The red value of the polygon to draw. \n\\param g The green value of the polygon to draw. \n\\param b The blue value of the polygon to draw. \n\\param a The alpha value of the polygon to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint polygonRGBA(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\t/*\n\t* Draw \n\t*/\n\tint result;\n\tconst Sint16 *x1, *y1, *x2, *y2;\n\n\t/*\n\t* Vertex array NULL check \n\t*/\n\tif (vx == NULL) {\n\t\treturn (-1);\n\t}\n\tif (vy == NULL) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Sanity check \n\t*/\n\tif (n < 3) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Pointer setup \n\t*/\n\tx1 = x2 = vx;\n\ty1 = y2 = vy;\n\tx2++;\n\ty2++;\n\n\t/*\n\t* Set color \n\t*/\n\tresult = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\t\n\n\t/*\n\t* Draw \n\t*/\n\tresult |= polygon(renderer, vx, vy, n);\n\n\treturn (result);\n}\n\n/* ---- AA-Polygon */\n\n/*!\n\\brief Draw anti-aliased polygon with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the aa-polygon.\n\\param vy Vertex array containing Y coordinates of the points of the aa-polygon.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\\param color The color value of the aa-polygon to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aapolygonColor(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn aapolygonRGBA(renderer, vx, vy, n, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw anti-aliased polygon with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the aa-polygon.\n\\param vy Vertex array containing Y coordinates of the points of the aa-polygon.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\\param r The red value of the aa-polygon to draw. \n\\param g The green value of the aa-polygon to draw. \n\\param b The blue value of the aa-polygon to draw. \n\\param a The alpha value of the aa-polygon to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint aapolygonRGBA(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result;\n\tint i;\n\tconst Sint16 *x1, *y1, *x2, *y2;\n\n\t/*\n\t* Vertex array NULL check \n\t*/\n\tif (vx == NULL) {\n\t\treturn (-1);\n\t}\n\tif (vy == NULL) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Sanity check \n\t*/\n\tif (n < 3) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Pointer setup \n\t*/\n\tx1 = x2 = vx;\n\ty1 = y2 = vy;\n\tx2++;\n\ty2++;\n\n\t/*\n\t* Draw \n\t*/\n\tresult = 0;\n\tfor (i = 1; i < n; i++) {\n\t\tresult |= _aalineRGBA(renderer, *x1, *y1, *x2, *y2, r, g, b, a, 0);\n\t\tx1 = x2;\n\t\ty1 = y2;\n\t\tx2++;\n\t\ty2++;\n\t}\n\n\tresult |= _aalineRGBA(renderer, *x1, *y1, *vx, *vy, r, g, b, a, 0);\n\n\treturn (result);\n}\n\n/* ---- Filled Polygon */\n\n/*!\n\\brief Internal helper qsort callback functions used in filled polygon drawing.\n\n\\param a The surface to draw on.\n\\param b Vertex array containing X coordinates of the points of the polygon.\n\n\\returns Returns 0 if a==b, a negative number if a<b or a positive number if a>b.\n*/\nint _gfxPrimitivesCompareInt(const void *a, const void *b)\n{\n\treturn (*(const int *) a) - (*(const int *) b);\n}\n\n/*!\n\\brief Global vertex array to use if optional parameters are not given in filledPolygonMT calls.\n\nNote: Used for non-multithreaded (default) operation of filledPolygonMT.\n*/\nstatic int *gfxPrimitivesPolyIntsGlobal = NULL;\n\n/*!\n\\brief Flag indicating if global vertex array was already allocated.\n\nNote: Used for non-multithreaded (default) operation of filledPolygonMT.\n*/\nstatic int gfxPrimitivesPolyAllocatedGlobal = 0;\n\n/*!\n\\brief Draw filled polygon with alpha blending (multi-threaded capable).\n\nNote: The last two parameters are optional; but are required for multithreaded operation.  \n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the filled polygon.\n\\param vy Vertex array containing Y coordinates of the points of the filled polygon.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\\param r The red value of the filled polygon to draw. \n\\param g The green value of the filled polygon to draw. \n\\param b The blue value of the filled polygon to draw. \n\\param a The alpha value of the filled polygon to draw.\n\\param polyInts Preallocated, temporary vertex array used for sorting vertices. Required for multithreaded operation; set to NULL otherwise.\n\\param polyAllocated Flag indicating if temporary vertex array was allocated. Required for multithreaded operation; set to NULL otherwise.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledPolygonRGBAMT(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a, int **polyInts, int *polyAllocated)\n{\n\tint result;\n\tint i;\n\tint y, xa, xb;\n\tint miny, maxy;\n\tint x1, y1;\n\tint x2, y2;\n\tint ind1, ind2;\n\tint ints;\n\tint *gfxPrimitivesPolyInts = NULL;\n\tint *gfxPrimitivesPolyIntsNew = NULL;\n\tint gfxPrimitivesPolyAllocated = 0;\n\n\t/*\n\t* Vertex array NULL check \n\t*/\n\tif (vx == NULL) {\n\t\treturn (-1);\n\t}\n\tif (vy == NULL) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Sanity check number of edges\n\t*/\n\tif (n < 3) {\n\t\treturn -1;\n\t}\n\n\t/*\n\t* Map polygon cache  \n\t*/\n\tif ((polyInts==NULL) || (polyAllocated==NULL)) {\n\t\t/* Use global cache */\n\t\tgfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal;\n\t\tgfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal;\n\t} else {\n\t\t/* Use local cache */\n\t\tgfxPrimitivesPolyInts = *polyInts;\n\t\tgfxPrimitivesPolyAllocated = *polyAllocated;\n\t}\n\n\t/*\n\t* Allocate temp array, only grow array \n\t*/\n\tif (!gfxPrimitivesPolyAllocated) {\n\t\tgfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n);\n\t\tgfxPrimitivesPolyAllocated = n;\n\t} else {\n\t\tif (gfxPrimitivesPolyAllocated < n) {\n\t\t\tgfxPrimitivesPolyIntsNew = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n);\n\t\t\tif (!gfxPrimitivesPolyIntsNew) {\n\t\t\t\tif (!gfxPrimitivesPolyInts) {\n\t\t\t\t\tfree(gfxPrimitivesPolyInts);\n\t\t\t\t\tgfxPrimitivesPolyInts = NULL;\n\t\t\t\t}\n\t\t\t\tgfxPrimitivesPolyAllocated = 0;\n\t\t\t} else {\n\t\t\t\tgfxPrimitivesPolyInts = gfxPrimitivesPolyIntsNew;\n\t\t\t\tgfxPrimitivesPolyAllocated = n;\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t* Check temp array\n\t*/\n\tif (gfxPrimitivesPolyInts==NULL) {        \n\t\tgfxPrimitivesPolyAllocated = 0;\n\t}\n\n\t/*\n\t* Update cache variables\n\t*/\n\tif ((polyInts==NULL) || (polyAllocated==NULL)) { \n\t\tgfxPrimitivesPolyIntsGlobal =  gfxPrimitivesPolyInts;\n\t\tgfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated;\n\t} else {\n\t\t*polyInts = gfxPrimitivesPolyInts;\n\t\t*polyAllocated = gfxPrimitivesPolyAllocated;\n\t}\n\n\t/*\n\t* Check temp array again\n\t*/\n\tif (gfxPrimitivesPolyInts==NULL) {        \n\t\treturn(-1);\n\t}\n\n\t/*\n\t* Determine Y maxima \n\t*/\n\tminy = vy[0];\n\tmaxy = vy[0];\n\tfor (i = 1; (i < n); i++) {\n\t\tif (vy[i] < miny) {\n\t\t\tminy = vy[i];\n\t\t} else if (vy[i] > maxy) {\n\t\t\tmaxy = vy[i];\n\t\t}\n\t}\n\n\t/*\n\t* Draw, scanning y \n\t*/\n\tresult = 0;\n\tfor (y = miny; (y <= maxy); y++) {\n\t\tints = 0;\n\t\tfor (i = 0; (i < n); i++) {\n\t\t\tif (!i) {\n\t\t\t\tind1 = n - 1;\n\t\t\t\tind2 = 0;\n\t\t\t} else {\n\t\t\t\tind1 = i - 1;\n\t\t\t\tind2 = i;\n\t\t\t}\n\t\t\ty1 = vy[ind1];\n\t\t\ty2 = vy[ind2];\n\t\t\tif (y1 < y2) {\n\t\t\t\tx1 = vx[ind1];\n\t\t\t\tx2 = vx[ind2];\n\t\t\t} else if (y1 > y2) {\n\t\t\t\ty2 = vy[ind1];\n\t\t\t\ty1 = vy[ind2];\n\t\t\t\tx2 = vx[ind1];\n\t\t\t\tx1 = vx[ind2];\n\t\t\t} else {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) {\n\t\t\t\tgfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1);\n\t\t\t} \t    \n\t\t}\n\n\t\tqsort(gfxPrimitivesPolyInts, ints, sizeof(int), _gfxPrimitivesCompareInt);\n\n\t\t/*\n\t\t* Set color \n\t\t*/\n\t\tresult = 0;\n\t    result |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\t\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\t\n\n\t\tfor (i = 0; (i < ints); i += 2) {\n\t\t\txa = gfxPrimitivesPolyInts[i] + 1;\n\t\t\txa = (xa >> 16) + ((xa & 32768) >> 15);\n\t\t\txb = gfxPrimitivesPolyInts[i+1] - 1;\n\t\t\txb = (xb >> 16) + ((xb & 32768) >> 15);\n\t\t\tresult |= hline(renderer, xa, xb, y);\n\t\t}\n\t}\n\n\treturn (result);\n}\n\n/*!\n\\brief Draw filled polygon with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the filled polygon.\n\\param vy Vertex array containing Y coordinates of the points of the filled polygon.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\\param color The color value of the filled polygon to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledPolygonColor(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn filledPolygonRGBAMT(renderer, vx, vy, n, c[0], c[1], c[2], c[3], NULL, NULL);\n}\n\n/*!\n\\brief Draw filled polygon with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the filled polygon.\n\\param vy Vertex array containing Y coordinates of the points of the filled polygon.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\\param r The red value of the filled polygon to draw. \n\\param g The green value of the filled polygon to draw. \n\\param b The blue value of the filed polygon to draw. \n\\param a The alpha value of the filled polygon to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint filledPolygonRGBA(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\treturn filledPolygonRGBAMT(renderer, vx, vy, n, r, g, b, a, NULL, NULL);\n}\n\n/* ---- Textured Polygon */\n\n/*!\n\\brief Internal function to draw a textured horizontal line.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point (i.e. left) of the line.\n\\param x2 X coordinate of the second point (i.e. right) of the line.\n\\param y Y coordinate of the points of the line.\n\\param texture The texture to retrieve color information from.\n\\param texture_w The width of the texture.\n\\param texture_h The height of the texture.\n\\param texture_dx The X offset for the texture lookup.\n\\param texture_dy The Y offset for the textured lookup.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint _HLineTextured(SDL_Renderer *renderer, Sint16 x1, Sint16 x2, Sint16 y, SDL_Texture *texture, int texture_w, int texture_h, int texture_dx, int texture_dy)\n{\n\tSint16 w;\n\tSint16 xtmp;\n\tint result = 0;\n\tint texture_x_walker;    \n\tint texture_y_start;    \n\tSDL_Rect source_rect,dst_rect;\n\tint pixels_written,write_width;\n\n\t/*\n\t* Swap x1, x2 if required to ensure x1<=x2\n\t*/\n\tif (x1 > x2) {\n\t\txtmp = x1;\n\t\tx1 = x2;\n\t\tx2 = xtmp;\n\t}\n\n\t/*\n\t* Calculate width to draw\n\t*/\n\tw = x2 - x1 + 1;\n\n\t/*\n\t* Determine where in the texture we start drawing\n\t*/\n\ttexture_x_walker =   (x1 - texture_dx)  % texture_w;\n\tif (texture_x_walker < 0){\n\t\ttexture_x_walker = texture_w + texture_x_walker ;\n\t}\n\n\ttexture_y_start = (y + texture_dy) % texture_h;\n\tif (texture_y_start < 0){\n\t\ttexture_y_start = texture_h + texture_y_start;\n\t}\n\n\t/* setup the source rectangle; we are only drawing one horizontal line */\n\tsource_rect.y = texture_y_start;\n\tsource_rect.x = texture_x_walker;\n\tsource_rect.h = 1;\n\n\t/* we will draw to the current y */\n\tdst_rect.y = y;\n\tdst_rect.h = 1;\n\n\t/* if there are enough pixels left in the current row of the texture */\n\t/* draw it all at once */\n\tif (w <= texture_w -texture_x_walker){\n\t\tsource_rect.w = w;\n\t\tsource_rect.x = texture_x_walker;\n\t\tdst_rect.x= x1;\n\t\tdst_rect.w = source_rect.w;\n\t\tresult = (SDL_RenderCopy(renderer, texture, &source_rect, &dst_rect) == 0);\n\t} else { \n\t\t/* we need to draw multiple times */\n\t\t/* draw the first segment */\n\t\tpixels_written = texture_w  - texture_x_walker;\n\t\tsource_rect.w = pixels_written;\n\t\tsource_rect.x = texture_x_walker;\n\t\tdst_rect.x= x1;\n\t\tdst_rect.w = source_rect.w;\n\t\tresult |= (SDL_RenderCopy(renderer, texture, &source_rect, &dst_rect) == 0);\n\t\twrite_width = texture_w;\n\n\t\t/* now draw the rest */\n\t\t/* set the source x to 0 */\n\t\tsource_rect.x = 0;\n\t\twhile (pixels_written < w){\n\t\t\tif (write_width >= w - pixels_written) {\n\t\t\t\twrite_width =  w - pixels_written;\n\t\t\t}\n\t\t\tsource_rect.w = write_width;\n\t\t\tdst_rect.x = x1 + pixels_written;\n\t\t\tdst_rect.w = source_rect.w;\n\t\t\tresult |= (SDL_RenderCopy(renderer, texture, &source_rect, &dst_rect) == 0);\n\t\t\tpixels_written += write_width;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/*!\n\\brief Draws a polygon filled with the given texture (Multi-Threading Capable). \n\n\\param renderer The renderer to draw on.\n\\param vx array of x vector components\n\\param vy array of x vector components\n\\param n the amount of vectors in the vx and vy array\n\\param texture the sdl surface to use to fill the polygon\n\\param texture_dx the offset of the texture relative to the screeen. If you move the polygon 10 pixels \nto the left and want the texture to apear the same you need to increase the texture_dx value\n\\param texture_dy see texture_dx\n\\param polyInts Preallocated temp array storage for vertex sorting (used for multi-threaded operation)\n\\param polyAllocated Flag indicating oif the temp array was allocated (used for multi-threaded operation)\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint texturedPolygonMT(SDL_Renderer *renderer, const Sint16 * vx, const Sint16 * vy, int n, \n\tSDL_Surface * texture, int texture_dx, int texture_dy, int **polyInts, int *polyAllocated)\n{\n\tint result;\n\tint i;\n\tint y, xa, xb;\n\tint minx,maxx,miny, maxy;\n\tint x1, y1;\n\tint x2, y2;\n\tint ind1, ind2;\n\tint ints;\n\tint *gfxPrimitivesPolyInts = NULL;\n\tint *gfxPrimitivesPolyIntsTemp = NULL;\n\tint gfxPrimitivesPolyAllocated = 0;\n\tSDL_Texture *textureAsTexture = NULL;\n\n\t/*\n\t* Sanity check number of edges\n\t*/\n\tif (n < 3) {\n\t\treturn -1;\n\t}\n\n\t/*\n\t* Map polygon cache  \n\t*/\n\tif ((polyInts==NULL) || (polyAllocated==NULL)) {\n\t\t/* Use global cache */\n\t\tgfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal;\n\t\tgfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal;\n\t} else {\n\t\t/* Use local cache */\n\t\tgfxPrimitivesPolyInts = *polyInts;\n\t\tgfxPrimitivesPolyAllocated = *polyAllocated;\n\t}\n\n\t/*\n\t* Allocate temp array, only grow array \n\t*/\n\tif (!gfxPrimitivesPolyAllocated) {\n\t\tgfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n);\n\t\tgfxPrimitivesPolyAllocated = n;\n\t} else {\n\t\tif (gfxPrimitivesPolyAllocated < n) {\n\t\t\tgfxPrimitivesPolyIntsTemp = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n);\n\t\t\tif (gfxPrimitivesPolyIntsTemp == NULL) {\n\t\t\t\t/* Realloc failed - keeps original memory block, but fails this operation */\n\t\t\t\treturn(-1);\n\t\t\t}\n\t\t\tgfxPrimitivesPolyInts = gfxPrimitivesPolyIntsTemp;\n\t\t\tgfxPrimitivesPolyAllocated = n;\n\t\t}\n\t}\n\n\t/*\n\t* Check temp array\n\t*/\n\tif (gfxPrimitivesPolyInts==NULL) {        \n\t\tgfxPrimitivesPolyAllocated = 0;\n\t}\n\n\t/*\n\t* Update cache variables\n\t*/\n\tif ((polyInts==NULL) || (polyAllocated==NULL)) { \n\t\tgfxPrimitivesPolyIntsGlobal =  gfxPrimitivesPolyInts;\n\t\tgfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated;\n\t} else {\n\t\t*polyInts = gfxPrimitivesPolyInts;\n\t\t*polyAllocated = gfxPrimitivesPolyAllocated;\n\t}\n\n\t/*\n\t* Check temp array again\n\t*/\n\tif (gfxPrimitivesPolyInts==NULL) {        \n\t\treturn(-1);\n\t}\n\n\t/*\n\t* Determine X,Y minima,maxima \n\t*/\n\tminy = vy[0];\n\tmaxy = vy[0];\n\tminx = vx[0];\n\tmaxx = vx[0];\n\tfor (i = 1; (i < n); i++) {\n\t\tif (vy[i] < miny) {\n\t\t\tminy = vy[i];\n\t\t} else if (vy[i] > maxy) {\n\t\t\tmaxy = vy[i];\n\t\t}\n\t\tif (vx[i] < minx) {\n\t\t\tminx = vx[i];\n\t\t} else if (vx[i] > maxx) {\n\t\t\tmaxx = vx[i];\n\t\t}\n\t}\n\n    /* Create texture for drawing */\n\ttextureAsTexture = SDL_CreateTextureFromSurface(renderer, texture);\n\tif (textureAsTexture == NULL)\n\t{\n\t\treturn -1;\n\t}\n\tSDL_SetTextureBlendMode(textureAsTexture, SDL_BLENDMODE_BLEND);\n\t\n\t/*\n\t* Draw, scanning y \n\t*/\n\tresult = 0;\n\tfor (y = miny; (y <= maxy); y++) {\n\t\tints = 0;\n\t\tfor (i = 0; (i < n); i++) {\n\t\t\tif (!i) {\n\t\t\t\tind1 = n - 1;\n\t\t\t\tind2 = 0;\n\t\t\t} else {\n\t\t\t\tind1 = i - 1;\n\t\t\t\tind2 = i;\n\t\t\t}\n\t\t\ty1 = vy[ind1];\n\t\t\ty2 = vy[ind2];\n\t\t\tif (y1 < y2) {\n\t\t\t\tx1 = vx[ind1];\n\t\t\t\tx2 = vx[ind2];\n\t\t\t} else if (y1 > y2) {\n\t\t\t\ty2 = vy[ind1];\n\t\t\t\ty1 = vy[ind2];\n\t\t\t\tx2 = vx[ind1];\n\t\t\t\tx1 = vx[ind2];\n\t\t\t} else {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) {\n\t\t\t\tgfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1);\n\t\t\t} \n\t\t}\n\n\t\tqsort(gfxPrimitivesPolyInts, ints, sizeof(int), _gfxPrimitivesCompareInt);\n\n\t\tfor (i = 0; (i < ints); i += 2) {\n\t\t\txa = gfxPrimitivesPolyInts[i] + 1;\n\t\t\txa = (xa >> 16) + ((xa & 32768) >> 15);\n\t\t\txb = gfxPrimitivesPolyInts[i+1] - 1;\n\t\t\txb = (xb >> 16) + ((xb & 32768) >> 15);\n\t\t\tresult |= _HLineTextured(renderer, xa, xb, y, textureAsTexture, texture->w, texture->h, texture_dx, texture_dy);\n\t\t}\n\t}\n\n\tSDL_RenderPresent(renderer);\n\tSDL_DestroyTexture(textureAsTexture);\n\n\treturn (result);\n}\n\n/*!\n\\brief Draws a polygon filled with the given texture. \n\nThis standard version is calling multithreaded versions with NULL cache parameters.\n\n\\param renderer The renderer to draw on.\n\\param vx array of x vector components\n\\param vy array of x vector components\n\\param n the amount of vectors in the vx and vy array\n\\param texture the sdl surface to use to fill the polygon\n\\param texture_dx the offset of the texture relative to the screeen. if you move the polygon 10 pixels \nto the left and want the texture to apear the same you need to increase the texture_dx value\n\\param texture_dy see texture_dx\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint texturedPolygon(SDL_Renderer *renderer, const Sint16 * vx, const Sint16 * vy, int n, SDL_Surface *texture, int texture_dx, int texture_dy)\n{\n\t/*\n\t* Draw\n\t*/\n\treturn (texturedPolygonMT(renderer, vx, vy, n, texture, texture_dx, texture_dy, NULL, NULL));\n}\n\n/* ---- Character */\n\n/*!\n\\brief Global cache for NxM pixel font textures created at runtime.\n*/\nstatic SDL_Texture *gfxPrimitivesFont[256];\n\n/*!\n\\brief Pointer to the current font data. Default is a 8x8 pixel internal font. \n*/\nstatic const unsigned char *currentFontdata = gfxPrimitivesFontdata;\n\n/*!\n\\brief Width of the current font. Default is 8. \n*/\nstatic Uint32 charWidth = 8;\n\n/*!\n\\brief Height of the current font. Default is 8. \n*/\nstatic Uint32 charHeight = 8;\n\n/*!\n\\brief Width for rendering. Autocalculated.\n*/\nstatic Uint32 charWidthLocal = 8;\n\n/*!\n\\brief Height for rendering. Autocalculated.\n*/\nstatic Uint32 charHeightLocal = 8;\n\n/*!\n\\brief Pitch of the current font in bytes. Default is 1. \n*/\nstatic Uint32 charPitch = 1;\n\n/*!\n\\brief Characters 90deg clockwise rotations. Default is 0. Max is 3. \n*/\nstatic Uint32 charRotation = 0;\n\n/*!\n\\brief Character data size in bytes of the current font. Default is 8. \n*/\nstatic Uint32 charSize = 8;\n\n/*!\n\\brief Sets or resets the current global font data.\n\nThe font data array is organized in follows: \n[fontdata] = [character 0][character 1]...[character 255] where\n[character n] = [byte 1 row 1][byte 2 row 1]...[byte {pitch} row 1][byte 1 row 2] ...[byte {pitch} row height] where\n[byte n] = [bit 0]...[bit 7] where \n[bit n] = [0 for transparent pixel|1 for colored pixel]\n\n\\param fontdata Pointer to array of font data. Set to NULL, to reset global font to the default 8x8 font.\n\\param cw Width of character in bytes. Ignored if fontdata==NULL.\n\\param ch Height of character in bytes. Ignored if fontdata==NULL.\n*/\nvoid gfxPrimitivesSetFont(const void *fontdata, Uint32 cw, Uint32 ch)\n{\n\tint i;\n\n\tif ((fontdata) && (cw) && (ch)) {\n\t\tcurrentFontdata = (unsigned char *)fontdata;\n\t\tcharWidth = cw;\n\t\tcharHeight = ch;\n\t} else {\n\t\tcurrentFontdata = gfxPrimitivesFontdata;\n\t\tcharWidth = 8;\n\t\tcharHeight = 8;\n\t}\n\n\tcharPitch = (charWidth+7)/8;\n\tcharSize = charPitch * charHeight;\n\n\t/* Maybe flip width/height for rendering */\n\tif ((charRotation==1) || (charRotation==3))\n\t{\n\t\tcharWidthLocal = charHeight;\n\t\tcharHeightLocal = charWidth;\n\t}\n\telse\n\t{\n\t\tcharWidthLocal = charWidth;\n\t\tcharHeightLocal = charHeight;\n\t}\n\n\t/* Clear character cache */\n\tfor (i = 0; i < 256; i++) {\n\t\tif (gfxPrimitivesFont[i]) {\n\t\t\tSDL_DestroyTexture(gfxPrimitivesFont[i]);\n\t\t\tgfxPrimitivesFont[i] = NULL;\n\t\t}\n\t}\n}\n\n/*!\n\\brief Sets current global font character rotation steps. \n\nDefault is 0 (no rotation). 1 = 90deg clockwise. 2 = 180deg clockwise. 3 = 270deg clockwise.\nChanging the rotation, will reset the character cache.\n\n\\param rotation Number of 90deg clockwise steps to rotate\n*/\nvoid gfxPrimitivesSetFontRotation(Uint32 rotation)\n{\n\tint i;\n\n\trotation = rotation & 3;\n\tif (charRotation != rotation)\n\t{\n\t\t/* Store rotation */\n\t\tcharRotation = rotation;\n\n\t\t/* Maybe flip width/height for rendering */\n\t\tif ((charRotation==1) || (charRotation==3))\n\t\t{\n\t\t\tcharWidthLocal = charHeight;\n\t\t\tcharHeightLocal = charWidth;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcharWidthLocal = charWidth;\n\t\t\tcharHeightLocal = charHeight;\n\t\t}\n\n\t\t/* Clear character cache */\n\t\tfor (i = 0; i < 256; i++) {\n\t\t\tif (gfxPrimitivesFont[i]) {\n\t\t\t\tSDL_DestroyTexture(gfxPrimitivesFont[i]);\n\t\t\t\tgfxPrimitivesFont[i] = NULL;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*!\n\\brief Draw a character of the currently set font.\n\n\\param renderer The Renderer to draw on.\n\\param x X (horizontal) coordinate of the upper left corner of the character.\n\\param y Y (vertical) coordinate of the upper left corner of the character.\n\\param c The character to draw.\n\\param r The red value of the character to draw. \n\\param g The green value of the character to draw. \n\\param b The blue value of the character to draw. \n\\param a The alpha value of the character to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint characterRGBA(SDL_Renderer *renderer, Sint16 x, Sint16 y, char c, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tSDL_Rect srect;\n\tSDL_Rect drect;\n\tint result;\n\tUint32 ix, iy;\n\tconst unsigned char *charpos;\n\tUint8 *curpos;\n\tUint8 patt, mask;\n\tUint8 *linepos;\n\tUint32 pitch;\n\tSDL_Surface *character;\n\tSDL_Surface *rotatedCharacter;\n\tUint32 ci;\n\n\t/*\n\t* Setup source rectangle\n\t*/\n\tsrect.x = 0;\n\tsrect.y = 0;\n\tsrect.w = charWidthLocal;\n\tsrect.h = charHeightLocal;\n\n\t/*\n\t* Setup destination rectangle\n\t*/\n\tdrect.x = x;\n\tdrect.y = y;\n\tdrect.w = charWidthLocal;\n\tdrect.h = charHeightLocal;\n\n\t/* Character index in cache */\n\tci = (unsigned char) c;\n\n\t/*\n\t* Create new charWidth x charHeight bitmap surface if not already present.\n\t* Might get rotated later.\n\t*/\n\tif (gfxPrimitivesFont[ci] == NULL) {\n\t\t/*\n\t\t* Redraw character into surface\n\t\t*/\n\t\tcharacter =\tSDL_CreateRGBSurface(SDL_SWSURFACE,\n\t\t\tcharWidth, charHeight, 32,\n\t\t\t0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF);\n\t\tif (character == NULL) {\n\t\t\treturn (-1);\n\t\t}\n\n\t\tcharpos = currentFontdata + ci * charSize;\n\t\t\t\tlinepos = (Uint8 *)character->pixels;\n\t\tpitch = character->pitch;\n\n\t\t/*\n\t\t* Drawing loop \n\t\t*/\n\t\tpatt = 0;\n\t\tfor (iy = 0; iy < charHeight; iy++) {\n\t\t\tmask = 0x00;\n\t\t\tcurpos = linepos;\n\t\t\tfor (ix = 0; ix < charWidth; ix++) {\n\t\t\t\tif (!(mask >>= 1)) {\n\t\t\t\t\tpatt = *charpos++;\n\t\t\t\t\tmask = 0x80;\n\t\t\t\t}\n\t\t\t\tif (patt & mask) {\n\t\t\t\t\t*(Uint32 *)curpos = 0xffffffff;\n\t\t\t\t} else {\n\t\t\t\t\t*(Uint32 *)curpos = 0;\n\t\t\t\t}\n\t\t\t\tcurpos += 4;\n\t\t\t}\n\t\t\tlinepos += pitch;\n\t\t}\n\n\t\t/* Maybe rotate and replace cached image */\n\t\tif (charRotation>0)\n\t\t{\n\t\t\trotatedCharacter = rotateSurface90Degrees(character, charRotation);\n\t\t\tSDL_FreeSurface(character);\n\t\t\tcharacter = rotatedCharacter;\n\t\t}\n\n\t\t/* Convert temp surface into texture */\n\t\tgfxPrimitivesFont[ci] = SDL_CreateTextureFromSurface(renderer, character);\n\t\tSDL_FreeSurface(character);\n\n\t\t/*\n\t\t* Check pointer \n\t\t*/\n\t\tif (gfxPrimitivesFont[ci] == NULL) {\n\t\t\treturn (-1);\n\t\t}\n\t}\n\n\t/*\n\t* Set color \n\t*/\n\tresult = 0;\n\tresult |= SDL_SetTextureColorMod(gfxPrimitivesFont[ci], r, g, b);\n\tresult |= SDL_SetTextureAlphaMod(gfxPrimitivesFont[ci], a);\n\n\t/*\n\t* Draw texture onto destination \n\t*/\n\tresult |= SDL_RenderCopy(renderer, gfxPrimitivesFont[ci], &srect, &drect);\n\n\treturn (result);\n}\n\n\n/*!\n\\brief Draw a character of the currently set font.\n\n\\param renderer The renderer to draw on.\n\\param x X (horizontal) coordinate of the upper left corner of the character.\n\\param y Y (vertical) coordinate of the upper left corner of the character.\n\\param c The character to draw.\n\\param color The color value of the character to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint characterColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, char c, Uint32 color)\n{\n\tUint8 *co = (Uint8 *)&color; \n\treturn characterRGBA(renderer, x, y, c, co[0], co[1], co[2], co[3]);\n}\n\n\n/*!\n\\brief Draw a string in the currently set font.\n\nThe spacing between consequtive characters in the string is the fixed number of pixels \nof the character width of the current global font.\n\n\\param renderer The renderer to draw on.\n\\param x X (horizontal) coordinate of the upper left corner of the string.\n\\param y Y (vertical) coordinate of the upper left corner of the string.\n\\param s The string to draw.\n\\param color The color value of the string to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint stringColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, const char *s, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn stringRGBA(renderer, x, y, s, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw a string in the currently set font.\n\n\\param renderer The renderer to draw on.\n\\param x X (horizontal) coordinate of the upper left corner of the string.\n\\param y Y (vertical) coordinate of the upper left corner of the string.\n\\param s The string to draw.\n\\param r The red value of the string to draw. \n\\param g The green value of the string to draw. \n\\param b The blue value of the string to draw. \n\\param a The alpha value of the string to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint stringRGBA(SDL_Renderer * renderer, Sint16 x, Sint16 y, const char *s, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result = 0;\n\tSint16 curx = x;\n\tSint16 cury = y;\n\tconst char *curchar = s;\n\n\twhile (*curchar && !result) {\n\t\tresult |= characterRGBA(renderer, curx, cury, *curchar, r, g, b, a);\n\t\tswitch (charRotation)\n\t\t{\n\t\tcase 0:\n\t\t\tcurx += charWidthLocal;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tcurx -= charWidthLocal;\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tcury += charHeightLocal;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tcury -= charHeightLocal;\n\t\t\tbreak;\n\t\t}\n\t\tcurchar++;\n\t}\n\n\treturn (result);\n}\n\n/* ---- Bezier curve */\n\n/*!\n\\brief Internal function to calculate bezier interpolator of data array with ndata values at position 't'.\n\n\\param data Array of values.\n\\param ndata Size of array.\n\\param t Position for which to calculate interpolated value. t should be between [0, ndata].\n\n\\returns Interpolated value at position t, value[0] when t<0, value[n-1] when t>n.\n*/\ndouble _evaluateBezier (double *data, int ndata, double t) \n{\n\tdouble mu, result;\n\tint n,k,kn,nn,nkn;\n\tdouble blend,muk,munk;\n\n\t/* Sanity check bounds */\n\tif (t<0.0) {\n\t\treturn(data[0]);\n\t}\n\tif (t>=(double)ndata) {\n\t\treturn(data[ndata-1]);\n\t}\n\n\t/* Adjust t to the range 0.0 to 1.0 */ \n\tmu=t/(double)ndata;\n\n\t/* Calculate interpolate */\n\tn=ndata-1;\n\tresult=0.0;\n\tmuk = 1;\n\tmunk = pow(1-mu,(double)n);\n\tfor (k=0;k<=n;k++) {\n\t\tnn = n;\n\t\tkn = k;\n\t\tnkn = n - k;\n\t\tblend = muk * munk;\n\t\tmuk *= mu;\n\t\tmunk /= (1-mu);\n\t\twhile (nn >= 1) {\n\t\t\tblend *= nn;\n\t\t\tnn--;\n\t\t\tif (kn > 1) {\n\t\t\t\tblend /= (double)kn;\n\t\t\t\tkn--;\n\t\t\t}\n\t\t\tif (nkn > 1) {\n\t\t\t\tblend /= (double)nkn;\n\t\t\t\tnkn--;\n\t\t\t}\n\t\t}\n\t\tresult += data[k] * blend;\n\t}\n\n\treturn (result);\n}\n\n/*!\n\\brief Draw a bezier curve with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the bezier curve.\n\\param vy Vertex array containing Y coordinates of the points of the bezier curve.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\\param s Number of steps for the interpolation. Minimum number is 2.\n\\param color The color value of the bezier curve to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint bezierColor(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, int s, Uint32 color)\n{\n\tUint8 *c = (Uint8 *)&color; \n\treturn bezierRGBA(renderer, vx, vy, n, s, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw a bezier curve with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param vx Vertex array containing X coordinates of the points of the bezier curve.\n\\param vy Vertex array containing Y coordinates of the points of the bezier curve.\n\\param n Number of points in the vertex array. Minimum number is 3.\n\\param s Number of steps for the interpolation. Minimum number is 2.\n\\param r The red value of the bezier curve to draw. \n\\param g The green value of the bezier curve to draw. \n\\param b The blue value of the bezier curve to draw. \n\\param a The alpha value of the bezier curve to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint bezierRGBA(SDL_Renderer * renderer, const Sint16 * vx, const Sint16 * vy, int n, int s, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint result;\n\tint i;\n\tdouble *x, *y, t, stepsize;\n\tSint16 x1, y1, x2, y2;\n\n\t/*\n\t* Sanity check \n\t*/\n\tif (n < 3) {\n\t\treturn (-1);\n\t}\n\tif (s < 2) {\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Variable setup \n\t*/\n\tstepsize=(double)1.0/(double)s;\n\n\t/* Transfer vertices into float arrays */\n\tif ((x=(double *)malloc(sizeof(double)*(n+1)))==NULL) {\n\t\treturn(-1);\n\t}\n\tif ((y=(double *)malloc(sizeof(double)*(n+1)))==NULL) {\n\t\tfree(x);\n\t\treturn(-1);\n\t}    \n\tfor (i=0; i<n; i++) {\n\t\tx[i]=(double)vx[i];\n\t\ty[i]=(double)vy[i];\n\t}      \n\tx[n]=(double)vx[0];\n\ty[n]=(double)vy[0];\n\n\t/*\n\t* Set color \n\t*/\n\tresult = 0;\n\tresult |= SDL_SetRenderDrawBlendMode(renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);\n\tresult |= SDL_SetRenderDrawColor(renderer, r, g, b, a);\n\n\t/*\n\t* Draw \n\t*/\n\tt=0.0;\n\tx1=(Sint16)lrint(_evaluateBezier(x,n+1,t));\n\ty1=(Sint16)lrint(_evaluateBezier(y,n+1,t));\n\tfor (i = 0; i <= (n*s); i++) {\n\t\tt += stepsize;\n\t\tx2=(Sint16)_evaluateBezier(x,n,t);\n\t\ty2=(Sint16)_evaluateBezier(y,n,t);\n\t\tresult |= line(renderer, x1, y1, x2, y2);\n\t\tx1 = x2;\n\t\ty1 = y2;\n\t}\n\n\t/* Clean up temporary array */\n\tfree(x);\n\tfree(y);\n\n\treturn (result);\n}\n\n\n/*!\n\\brief Draw a thick line with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the line.\n\\param y1 Y coordinate of the first point of the line.\n\\param x2 X coordinate of the second point of the line.\n\\param y2 Y coordinate of the second point of the line.\n\\param width Width of the line in pixels. Must be >0.\n\\param color The color value of the line to draw (0xRRGGBBAA). \n\n\\returns Returns 0 on success, -1 on failure.\n*/\nint thickLineColor(SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 width, Uint32 color)\n{\t\n\tUint8 *c = (Uint8 *)&color; \n\treturn thickLineRGBA(renderer, x1, y1, x2, y2, width, c[0], c[1], c[2], c[3]);\n}\n\n/*!\n\\brief Draw a thick line with alpha blending.\n\n\\param renderer The renderer to draw on.\n\\param x1 X coordinate of the first point of the line.\n\\param y1 Y coordinate of the first point of the line.\n\\param x2 X coordinate of the second point of the line.\n\\param y2 Y coordinate of the second point of the line.\n\\param width Width of the line in pixels. Must be >0.\n\\param r The red value of the character to draw. \n\\param g The green value of the character to draw. \n\\param b The blue value of the character to draw. \n\\param a The alpha value of the character to draw.\n\n\\returns Returns 0 on success, -1 on failure.\n*/\t\nint thickLineRGBA(SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 width, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\n{\n\tint wh;\n\tdouble dx, dy, dx1, dy1, dx2, dy2;\n\tdouble l, wl2, nx, ny, ang, adj;\n\tSint16 px[4], py[4];\n\n\tif (renderer == NULL) {\n\t\treturn -1;\n\t}\n\n\tif (width < 1) {\n\t\treturn -1;\n\t}\n\n\t/* Special case: thick \"point\" */\n\tif ((x1 == x2) && (y1 == y2)) {\n\t\twh = width / 2;\n\t\treturn boxRGBA(renderer, x1 - wh, y1 - wh, x2 + width, y2 + width, r, g, b, a);\t\t\n\t}\n\n\t/* Special case: width == 1 */\n\tif (width == 1) {\n\t\treturn lineRGBA(renderer, x1, y1, x2, y2, r, g, b, a);\t\t\n\t}\n\n\t/* Calculate offsets for sides */\n\tdx = (double)(x2 - x1);\n\tdy = (double)(y2 - y1);\n\tl = SDL_sqrt(dx*dx + dy*dy);\n\tang = SDL_atan2(dx, dy);\n\tadj = 0.1 + 0.9 * SDL_fabs(SDL_cos(2.0 * ang));\n\twl2 = ((double)width - adj)/(2.0 * l);\n\tnx = dx * wl2;\n\tny = dy * wl2;\n\n\t/* Build polygon */\n\tdx1 = (double)x1;\n\tdy1 = (double)y1;\n\tdx2 = (double)x2;\n\tdy2 = (double)y2;\n\tpx[0] = (Sint16)(dx1 + ny);\n\tpx[1] = (Sint16)(dx1 - ny);\n\tpx[2] = (Sint16)(dx2 - ny);\n\tpx[3] = (Sint16)(dx2 + ny);\n\tpy[0] = (Sint16)(dy1 - nx);\n\tpy[1] = (Sint16)(dy1 + nx);\n\tpy[2] = (Sint16)(dy2 + nx);\n\tpy[3] = (Sint16)(dy2 - nx);\n\n\t/* Draw polygon */\n\treturn filledPolygonRGBA(renderer, px, py, 4, r, g, b, a);\n}\n"
  },
  {
    "path": "libs/SDL2_gfx/src/SDL2_imageFilter.c",
    "content": "/*\n\nSDL2_imageFilter.c: byte-image \"filter\" routines\n\nCopyright (C) 2012-2014  Andreas Schiffler\nCopyright (C) 2013  Sylvain Beucler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n   1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n   2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n   3. This notice may not be removed or altered from any source\n   distribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n\n/*\n\nNote: Uses inline x86 MMX or ASM optimizations if available and enabled.\n\nNote: Most of the MMX code is based on published routines \nby Vladimir Kravtchenko at vk@cs.ubc.ca - credits go to \nhim for his work.\n\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL.h\"\n\n/* Use GCC intrinsics if available: they support both i386 and x86_64,\n   provide ASM-grade performances, and lift the PUSHA/POPA issues. */\n#ifdef __GNUC__\n#  ifdef USE_MMX\n#    include <mmintrin.h>\n#  endif\n#  include <SDL_cpuinfo.h>\n#endif\n\n#include \"SDL2_imageFilter.h\"\n\n/*!\n\\brief Swaps the byte order in a 32bit integer (LSB becomes MSB, etc.). \n*/\n#define SWAP_32(x) (((x) >> 24) | (((x) & 0x00ff0000) >> 8)  | (((x) & 0x0000ff00) << 8)  | ((x) << 24))\n\n/* ------ Static variables ----- */\n\n/*! \n\\brief Static state which enables the use of the MMX routines. Enabled by default \n*/\nstatic int SDL_imageFilterUseMMX = 1;\n\n/* Detect GCC */\n#if defined(__GNUC__)\n#define GCC__\n#endif\n\n/*!\n\\brief MMX detection routine (with override flag). \n\n\\returns 1 of MMX was detected, 0 otherwise.\n*/\nint SDL_imageFilterMMXdetect(void)\n{\n\t/* Check override flag */\n\tif (SDL_imageFilterUseMMX == 0) {\n\t\treturn (0);\n\t}\n\n    return SDL_HasMMX();\n}\n\n/*!\n\\brief Disable MMX check for filter functions and and force to use non-MMX C based code.\n*/\nvoid SDL_imageFilterMMXoff()\n{\n\tSDL_imageFilterUseMMX = 0;\n}\n\n/*!\n\\brief Enable MMX check for filter functions and use MMX code if available.\n*/\nvoid SDL_imageFilterMMXon()\n{\n\tSDL_imageFilterUseMMX = 1;\n}\n\n/* ------------------------------------------------------------------------------------ */\n\n/*!\n\\brief Internal MMX Filter using Add: D = saturation255(S1 + S2) \n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterAddMMX(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov eax, Src1\t/* load Src1 address into eax */\n\t\t\tmov ebx, Src2\t/* load Src2 address into ebx */\n\t\t\tmov edi, Dest\t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength\t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3\t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16\t/* 16 byte alignment of the loop entry */\nL1010:\n\t\tmovq mm1, [eax]\t/* load 8 bytes from Src1 into mm1 */\n\t\tpaddusb mm1, [ebx]\t/* mm1=Src1+Src2 (add 8 bytes with saturation) */\n\t\tmovq [edi], mm1\t/* store result in Dest */\n\t\t\tadd eax, 8\t/* increase Src1, Src2 and Dest  */\n\t\t\tadd ebx, 8\t/* register pointers by 8 */\n\t\t\tadd edi, 8\n\t\t\tdec ecx\t/* decrease loop counter */\n\t\t\tjnz L1010\t/* check loop termination, proceed if required */\n\t\t\temms /* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mSrc2 = (__m64*)Src2;\n\t__m64 *mDest = (__m64*)Dest;\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_paddusb(*mSrc1, *mSrc2);\t/* Src1+Src2 (add 8 bytes with saturation) */\n\t\tmSrc1++;\n\t\tmSrc2++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using Add: D = saturation255(S1 + S2) \n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterAdd(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\t/* Use MMX assembly routine */\n\t\tSDL_imageFilterAddMMX(Src1, Src2, Dest, length);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcursrc2 = &Src2[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\tresult = (int) *cursrc1 + (int) *cursrc2;\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdst = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using Mean: D = S1/2 + S2/2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\\param Mask Mask array containing 8 bytes with 0x7F value.\n]\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterMeanMMX(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength,\n\t\t\t\t\t\t   unsigned char *Mask)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{ \n\t\tpusha\n\t\t\tmov edx, Mask /* load Mask address into edx */\n\t\t\tmovq mm0, [edx] /* load Mask into mm0 */\n\t\tmov eax, Src1 /* load Src1 address into eax */\n\t\t\tmov ebx, Src2 /* load Src2 address into ebx */\n\t\t\tmov edi, Dest /* load Dest address into edi */\n\t\t\tmov ecx, SrcLength /* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16\t/* 16 byte alignment of the loop entry */\nL21011:\n\t\tmovq mm1,  [eax] \t/* load 8 bytes from Src1 into mm1 */\n\t\tmovq mm2,  [ebx] \t/* load 8 bytes from Src2 into mm2 */\n\t\t/* --- Byte shift via Word shift --- */\n\t\tpsrlw mm1, 1 \t/* shift 4 WORDS of mm1 1 bit to the right */\n\t\t\tpsrlw mm2, 1 \t/* shift 4 WORDS of mm2 1 bit to the right */\n\t\t\tpand mm1, mm0   // apply Mask to 8 BYTES of mm1 */\n\t\t\t/* byte     0x0f, 0xdb, 0xc8 */\n\t\t\tpand mm2, mm0   // apply Mask to 8 BYTES of mm2 */\n\t\t\t/* byte     0x0f, 0xdb, 0xd0 */\n\t\t\tpaddusb mm1,  mm2 \t/* mm1=mm1+mm2 (add 8 bytes with saturation) */\n\t\t\tmovq [edi],  mm1 \t/* store result in Dest */\n\t\t\tadd eax,  8 \t/* increase Src1, Src2 and Dest  */\n\t\t\tadd ebx,  8 \t/* register pointers by 8 */\n\t\t\tadd edi,  8\n\t\t\tdec ecx \t/* decrease loop counter */\n\t\t\tjnz L21011\t/* check loop termination, proceed if required */\n\t\t\temms\t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mSrc2 = (__m64*)Src2;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 *mMask = (__m64*)Mask;\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm1 = *mSrc1,\n\t\t      mm2 = *mSrc2;\n\t\tmm1 = _m_psrlwi(mm1, 1);\t/* shift 4 WORDS of mm1 1 bit to the right */\n\t\tmm2 = _m_psrlwi(mm2, 1);\t/* shift 4 WORDS of mm2 1 bit to the right */\n\t\tmm1 = _m_pand(mm1, *mMask);\t/* apply Mask to 8 BYTES of mm1 */\n\t\tmm2 = _m_pand(mm2, *mMask);\t/* apply Mask to 8 BYTES of mm2 */\n\t\t*mDest = _m_paddusb(mm1, mm2);\t/* mm1+mm2 (add 8 bytes with saturation) */\n\t\tmSrc1++;\n\t\tmSrc2++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using Mean: D = S1/2 + S2/2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterMean(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tstatic unsigned char Mask[8] = { 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F };\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\t\t/* MMX routine */\n\t\tSDL_imageFilterMeanMMX(Src1, Src2, Dest, length, Mask);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcursrc2 = &Src2[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\tresult = (int) *cursrc1 / 2 + (int) *cursrc2 / 2;\n\t\t*curdst = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using Sub: D = saturation0(S1 - S2)\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterSubMMX(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov eax,  Src1 \t/* load Src1 address into eax */\n\t\t\tmov ebx,  Src2 \t/* load Src2 address into ebx */\n\t\t\tmov edi,  Dest \t/* load Dest address into edi */\n\t\t\tmov ecx,  SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16 /* 16 byte alignment of the loop entry */\nL1012:\n\t\tmovq mm1,  [eax] \t/* load 8 bytes from Src1 into mm1 */\n\t\tpsubusb mm1,  [ebx] \t/* mm1=Src1-Src2 (sub 8 bytes with saturation) */\n\t\tmovq [edi],  mm1 \t/* store result in Dest */\n\t\t\tadd eax, 8 \t/* increase Src1, Src2 and Dest  */\n\t\t\tadd ebx, 8 \t/* register pointers by 8 */\n\t\t\tadd edi, 8\n\t\t\tdec ecx\t/* decrease loop counter */\n\t\t\tjnz L1012\t/* check loop termination, proceed if required */\n\t\t\temms /* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mSrc2 = (__m64*)Src2;\n\t__m64 *mDest = (__m64*)Dest;\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_psubusb(*mSrc1, *mSrc2);\t/* Src1-Src2 (sub 8 bytes with saturation) */\n\t\tmSrc1++;\n\t\tmSrc2++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using Sub: D = saturation0(S1 - S2)\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterSub(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\t\t/* MMX routine */\n\t\tSDL_imageFilterSubMMX(Src1, Src2, Dest, length);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcursrc2 = &Src2[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\tresult = (int) *cursrc1 - (int) *cursrc2;\n\t\tif (result < 0)\n\t\t\tresult = 0;\n\t\t*curdst = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using AbsDiff: D = | S1 - S2 |\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterAbsDiffMMX(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov eax, Src1  \t/* load Src1 address into eax */\n\t\t\tmov ebx, Src2 \t/* load Src2 address into ebx */\n\t\t\tmov edi, Dest \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16\t/* 16 byte alignment of the loop entry */\nL1013:\n\t\tmovq mm1,  [eax] \t/* load 8 bytes from Src1 into mm1 */\n\t\tmovq mm2,  [ebx] \t/* load 8 bytes from Src2 into mm2 */\n\t\tpsubusb mm1,  [ebx] \t/* mm1=Src1-Src2 (sub 8 bytes with saturation) */\n\t\tpsubusb mm2,  [eax] \t/* mm2=Src2-Src1 (sub 8 bytes with saturation) */\n\t\tpor mm1,  mm2 \t/* combine both mm2 and mm1 results */\n\t\t\tmovq [edi],  mm1 \t/* store result in Dest */\n\t\t\tadd eax, 8 \t/* increase Src1, Src2 and Dest  */\n\t\t\tadd ebx, 8 \t/* register pointers by 8 */\n\t\t\tadd edi, 8\n\t\t\tdec ecx \t/* decrease loop counter */\n\t\t\tjnz L1013    \t/* check loop termination, proceed if required */\n\t\t\temms         /* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mSrc2 = (__m64*)Src2;\n\t__m64 *mDest = (__m64*)Dest;\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm1 = _m_psubusb(*mSrc2, *mSrc1);\t/* Src1-Src2 (sub 8 bytes with saturation) */\n\t\t__m64 mm2 = _m_psubusb(*mSrc1, *mSrc2);\t/* Src2-Src1 (sub 8 bytes with saturation) */\n\t\t*mDest = _m_por(mm1, mm2);\t\t/* combine both mm2 and mm1 results */\n\t\tmSrc1++;\n\t\tmSrc2++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using AbsDiff: D = | S1 - S2 |\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterAbsDiff(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\t\t/* MMX routine */\n\t\tSDL_imageFilterAbsDiffMMX(Src1, Src2, Dest, length);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcursrc2 = &Src2[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\tresult = abs((int) *cursrc1 - (int) *cursrc2);\n\t\t*curdst = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using Mult: D = saturation255(S1 * S2)\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterMultMMX(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov eax, Src1   /* load Src1 address into eax */\n\t\t\tmov ebx, Src2   /* load Src2 address into ebx */\n\t\t\tmov edi, Dest   /* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   /* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   /* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\tpxor mm0, mm0   /* zero mm0 register */\n\t\t\talign 16      \t/* 16 byte alignment of the loop entry */\nL1014:\n\t\tmovq mm1, [eax]   /* load 8 bytes from Src1 into mm1 */\n\t\tmovq mm3, [ebx]   /* load 8 bytes from Src2 into mm3 */\n\t\tmovq mm2, mm1   /* copy mm1 into mm2 */\n\t\t\tmovq mm4, mm3   /* copy mm3 into mm4  */\n\t\t\tpunpcklbw mm1, mm0   /* unpack low  bytes of Src1 into words */\n\t\t\tpunpckhbw mm2, mm0   /* unpack high bytes of Src1 into words */\n\t\t\tpunpcklbw mm3, mm0   /* unpack low  bytes of Src2 into words */\n\t\t\tpunpckhbw mm4, mm0   /* unpack high bytes of Src2 into words */\n\t\t\tpmullw mm1, mm3   /* mul low  bytes of Src1 and Src2  */\n\t\t\tpmullw mm2, mm4   /* mul high bytes of Src1 and Src2 */\n\t\t\t/* Take abs value of the results (signed words) */\n\t\t\tmovq mm5, mm1   /* copy mm1 into mm5 */\n\t\t\tmovq mm6, mm2   /* copy mm2 into mm6 */\n\t\t\tpsraw mm5, 15   /* fill mm5 words with word sign bit */\n\t\t\tpsraw mm6, 15   /* fill mm6 words with word sign bit */\n\t\t\tpxor mm1, mm5   /* take 1's compliment of only neg. words */\n\t\t\tpxor mm2, mm6   /* take 1's compliment of only neg. words */\n\t\t\tpsubsw mm1, mm5   /* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\tpsubsw mm2, mm6   /* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\tpackuswb mm1, mm2   /* pack words back into bytes with saturation */\n\t\t\tmovq [edi], mm1   /* store result in Dest */\n\t\t\tadd eax, 8   /* increase Src1, Src2 and Dest  */\n\t\t\tadd ebx, 8   /* register pointers by 8 */\n\t\t\tadd edi, 8\n\t\t\tdec ecx \t/* decrease loop counter */\n\t\t\tjnz L1014\t/* check loop termination, proceed if required */\n\t\t\temms /* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 ASM with constraints: */\n\t/* asm volatile ( */\n\t/* \t\"shr $3, %%ecx \\n\\t\"\t/\\* counter/8 (MMX loads 8 bytes at a time) *\\/ */\n\t/* \t\"pxor      %%mm0, %%mm0 \\n\\t\"\t/\\* zero mm0 register *\\/ */\n\t/* \t\".align 16       \\n\\t\"\t/\\* 16 byte alignment of the loop entry *\\/ */\n\t/* \t\"1: movq (%%eax), %%mm1 \\n\\t\"     /\\* load 8 bytes from Src1 into mm1 *\\/ */\n\t/* \t\"movq    (%%ebx), %%mm3 \\n\\t\"\t/\\* load 8 bytes from Src2 into mm3 *\\/ */\n\t/* \t\"movq      %%mm1, %%mm2 \\n\\t\"\t/\\* copy mm1 into mm2 *\\/ */\n\t/* \t\"movq      %%mm3, %%mm4 \\n\\t\"\t/\\* copy mm3 into mm4  *\\/ */\n\t/* \t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/\\* unpack low  bytes of Src1 into words *\\/ */\n\t/* \t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/\\* unpack high bytes of Src1 into words *\\/ */\n\t/* \t\"punpcklbw %%mm0, %%mm3 \\n\\t\"\t/\\* unpack low  bytes of Src2 into words *\\/ */\n\t/* \t\"punpckhbw %%mm0, %%mm4 \\n\\t\"\t/\\* unpack high bytes of Src2 into words *\\/ */\n\t/* \t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/\\* mul low  bytes of Src1 and Src2  *\\/ */\n\t/* \t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/\\* mul high bytes of Src1 and Src2 *\\/ */\n\t/* \t/\\* Take abs value of the results (signed words) *\\/ */\n\t/* \t\"movq      %%mm1, %%mm5 \\n\\t\"\t/\\* copy mm1 into mm5 *\\/ */\n\t/* \t\"movq      %%mm2, %%mm6 \\n\\t\"\t/\\* copy mm2 into mm6 *\\/ */\n\t/* \t\"psraw       $15, %%mm5 \\n\\t\"\t/\\* fill mm5 words with word sign bit *\\/ */\n\t/* \t\"psraw       $15, %%mm6 \\n\\t\"\t/\\* fill mm6 words with word sign bit *\\/ */\n\t/* \t\"pxor      %%mm5, %%mm1 \\n\\t\"\t/\\* take 1's compliment of only neg. words *\\/ */\n\t/* \t\"pxor      %%mm6, %%mm2 \\n\\t\"\t/\\* take 1's compliment of only neg. words *\\/ */\n\t/* \t\"psubsw    %%mm5, %%mm1 \\n\\t\"\t/\\* add 1 to only neg. words, W-(-1) or W-0 *\\/ */\n\t/* \t\"psubsw    %%mm6, %%mm2 \\n\\t\"\t/\\* add 1 to only neg. words, W-(-1) or W-0 *\\/ */\n\t/* \t\"packuswb  %%mm2, %%mm1 \\n\\t\"\t/\\* pack words back into bytes with saturation *\\/ */\n\t/* \t\"movq    %%mm1, (%%edi) \\n\\t\"\t/\\* store result in Dest *\\/ */\n\t/* \t\"add $8, %%eax \\n\\t\"\t/\\* increase Src1, Src2 and Dest  *\\/ */\n\t/* \t\"add $8, %%ebx \\n\\t\"\t/\\* register pointers by 8 *\\/ */\n\t/* \t\"add $8, %%edi \\n\\t\" */\n\t/* \t\"dec %%ecx     \\n\\t\"\t/\\* decrease loop counter *\\/ */\n\t/* \t\"jnz 1b        \\n\\t\"\t/\\* check loop termination, proceed if required *\\/ */\n\t/* \t\"emms          \\n\\t\"\t/\\* exit MMX state *\\/ */\n\t/* \t: \"+a\" (Src1),\t\t/\\* load Src1 address into rax, modified by the loop *\\/ */\n\t/* \t  \"+b\" (Src2),\t\t/\\* load Src2 address into rbx, modified by the loop *\\/ */\n\t/* \t  \"+c\" (SrcLength),\t/\\* load loop counter (SIZE) into rcx, modified by the loop *\\/ */\n\t/* \t  \"+D\" (Dest)\t\t/\\* load Dest address into rdi, modified by the loop *\\/ */\n\t/* \t: */\n\t/* \t: \"memory\",\t\t/\\* *Dest is modified *\\/ */\n        /*           \"mm0\",\"mm1\",\"mm2\",\"mm3\",\"mm4\",\"mm5\",\"mm6\"\t/\\* registers modified *\\/ */\n\t/* ); */\n\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mSrc2 = (__m64*)Src2;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 mm0 = _m_from_int(0); /* zero mm0 register */\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm1, mm2, mm3, mm4, mm5, mm6;\n\t\tmm1 = _m_punpcklbw(*mSrc1, mm0);\t/* unpack low  bytes of Src1 into words */\n\t\tmm2 = _m_punpckhbw(*mSrc1, mm0);\t/* unpack high bytes of Src1 into words */\n\t\tmm3 = _m_punpcklbw(*mSrc2, mm0);\t/* unpack low  bytes of Src2 into words */\n\t\tmm4 = _m_punpckhbw(*mSrc2, mm0);\t/* unpack high bytes of Src2 into words */\n\t\tmm1 = _m_pmullw(mm1, mm3);\t\t/* mul low  bytes of Src1 and Src2  */\n\t\tmm2 = _m_pmullw(mm2, mm4);\t\t/* mul high bytes of Src1 and Src2 */\n\t\tmm5 = _m_psrawi(mm1, 15);\t\t/* fill mm5 words with word sign bit */\n\t\tmm6 = _m_psrawi(mm2, 15);\t\t/* fill mm6 words with word sign bit */\n\t\tmm1 = _m_pxor(mm1, mm5);\t\t/* take 1's compliment of only neg. words */\n\t\tmm2 = _m_pxor(mm2, mm6);\t\t/* take 1's compliment of only neg. words */\n\t\tmm1 = _m_psubsw(mm1, mm5);\t\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\tmm2 = _m_psubsw(mm2, mm6);\t\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t*mDest = _m_packuswb(mm1, mm2);\t\t/* pack words back into bytes with saturation */\n\t\tmSrc1++;\n\t\tmSrc2++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using Mult: D = saturation255(S1 * S2)\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterMult(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\t\t/* MMX routine */\n\t\tSDL_imageFilterMultMMX(Src1, Src2, Dest, length);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcursrc2 = &Src2[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\n\t\t/* NOTE: this is probably wrong - dunno what the MMX code does */\n\n\t\tresult = (int) *cursrc1 * (int) *cursrc2;\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdst = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal ASM Filter using MultNor: D = S1 * S2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterMultNorASM(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov edx, Src1   /* load Src1 address into edx */\n\t\t\tmov esi, Src2   /* load Src2 address into esi */\n\t\t\tmov edi, Dest   /* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   /* load loop counter (SIZE) into ecx */\n\t\t\talign 16 \t/* 16 byte alignment of the loop entry */\nL10141:\n\t\tmov al, [edx]   /* load a byte from Src1 */\n\t\tmul [esi] \t/* mul with a byte from Src2 */\n\t\tmov [edi], al   /* move a byte result to Dest */\n\t\t\tinc edx \t/* increment Src1, Src2, Dest */\n\t\t\tinc esi \t\t/* pointer registers by one */\n\t\t\tinc edi\n\t\t\tdec ecx\t/* decrease loop counter */\n\t\t\tjnz L10141  \t/* check loop termination, proceed if required */\n\t\t\tpopa\n\t}\n#else\n\t/* Note: ~5% gain on i386, less efficient than C on x86_64 */\n\t/* Also depends on whether this function is static (?!) */\n\tasm volatile (\n\t\t\".align 16       \\n\\t\"\t/* 16 byte alignment of the loop entry */\n#  if defined(i386)\n\t\t\"1:mov  (%%edx), %%al \\n\\t\"      /* load a byte from Src1 */\n\t\t\"mulb (%%esi)       \\n\\t\"\t/* mul with a byte from Src2 */\n\t\t\"mov %%al, (%%edi)  \\n\\t\"       /* move a byte result to Dest */\n\t\t\"inc %%edx \\n\\t\"\t\t/* increment Src1, Src2, Dest */\n\t\t\"inc %%esi \\n\\t\"\t\t/* pointer registers by one */\n\t\t\"inc %%edi \\n\\t\"\n\t\t\"dec %%ecx      \\n\\t\"\t/* decrease loop counter */\n#  elif defined(__x86_64__)\n\t\t\"1:mov  (%%rdx), %%al \\n\\t\"      /* load a byte from Src1 */\n\t\t\"mulb (%%rsi)       \\n\\t\"\t/* mul with a byte from Src2 */\n\t\t\"mov %%al, (%%rdi)  \\n\\t\"       /* move a byte result to Dest */\n\t\t\"inc %%rdx \\n\\t\"\t\t/* increment Src1, Src2, Dest */\n\t\t\"inc %%rsi \\n\\t\"\t\t/* pointer registers by one */\n\t\t\"inc %%rdi \\n\\t\"\n\t\t\"dec %%rcx      \\n\\t\"\t/* decrease loop counter */\n#  endif\n\t\t\"jnz 1b         \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t: \"+d\" (Src1),\t\t/* load Src1 address into edx */\n\t\t  \"+S\" (Src2),\t\t/* load Src2 address into esi */\n\t\t  \"+c\" (SrcLength),\t/* load loop counter (SIZE) into ecx */\n\t\t  \"+D\" (Dest)\t\t/* load Dest address into edi */\n\t\t:\n\t\t: \"memory\", \"rax\"\n\t\t);\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using MultNor: D = S1 * S2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterMultNor(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif (SDL_imageFilterMMXdetect()) {\n\t\tif (length > 0) {\n\t\t\t/* ASM routine */\n\t\t\tSDL_imageFilterMultNorASM(Src1, Src2, Dest, length);\n\n\t\t\t/* Check for unaligned bytes */\n\t\t\tif ((length & 7) > 0) {\n\t\t\t\t/* Setup to process unaligned bytes */\n\t\t\t\tistart = length & 0xfffffff8;\n\t\t\t\tcursrc1 = &Src1[istart];\n\t\t\t\tcursrc2 = &Src2[istart];\n\t\t\t\tcurdst = &Dest[istart];\n\t\t\t} else {\n\t\t\t\t/* No unaligned bytes - we are done */\n\t\t\t\treturn (0);\n\t\t\t}\n\t\t} else {\n\t\t\t/* No bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\t*curdst = (int)*cursrc1 * (int)*cursrc2;  // (int) for efficiency\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using MultDivby2: D = saturation255(S1/2 * S2)\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterMultDivby2MMX(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{ \n\t\tpusha\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov ebx, Src2   \t/* load Src2 address into ebx */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx,  SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\tpxor mm0,  mm0 \t/* zero mm0 register */\n\t\t\talign 16          \t/* 16 byte alignment of the loop entry */\nL1015:\n\t\tmovq mm1,  [eax] \t/* load 8 bytes from Src1 into mm1 */\n\t\tmovq mm3,  [ebx] \t/* load 8 bytes from Src2 into mm3 */\n\t\tmovq mm2,  mm1 \t/* copy mm1 into mm2 */\n\t\t\tmovq mm4,  mm3 \t/* copy mm3 into mm4  */\n\t\t\tpunpcklbw mm1,  mm0 \t/* unpack low  bytes of Src1 into words */\n\t\t\tpunpckhbw mm2,  mm0 \t/* unpack high bytes of Src1 into words */\n\t\t\tpunpcklbw mm3,  mm0 \t/* unpack low  bytes of Src2 into words */\n\t\t\tpunpckhbw mm4,  mm0 \t/* unpack high bytes of Src2 into words */\n\t\t\tpsrlw mm1,  1 \t/* divide mm1 words by 2, Src1 low bytes */\n\t\t\tpsrlw mm2,  1 \t/* divide mm2 words by 2, Src1 high bytes */\n\t\t\tpmullw mm1,  mm3 \t/* mul low  bytes of Src1 and Src2  */\n\t\t\tpmullw mm2,  mm4 \t/* mul high bytes of Src1 and Src2 */\n\t\t\tpackuswb mm1,  mm2 \t/* pack words back into bytes with saturation */\n\t\t\tmovq [edi],  mm1 \t/* store result in Dest */\n\t\t\tadd eax,  8 \t/* increase Src1, Src2 and Dest  */\n\t\t\tadd ebx,  8 \t/* register pointers by 8 */\n\t\t\tadd edi,  8\n\t\t\tdec ecx        \t/* decrease loop counter */\n\t\t\tjnz L1015       \t/* check loop termination, proceed if required */\n\t\t\temms             \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mSrc2 = (__m64*)Src2;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 mm0 = _m_from_int(0); /* zero mm0 register */\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm1, mm2, mm3, mm4, mm5, mm6;\n\t\tmm1 = _m_punpcklbw(*mSrc1, mm0);\t/* unpack low  bytes of Src1 into words */\n\t\tmm2 = _m_punpckhbw(*mSrc1, mm0);\t/* unpack high bytes of Src1 into words */\n\t\tmm3 = _m_punpcklbw(*mSrc2, mm0);\t/* unpack low  bytes of Src2 into words */\n\t\tmm4 = _m_punpckhbw(*mSrc2, mm0);\t/* unpack high bytes of Src2 into words */\n\t\tmm1 = _m_psrlwi(mm1, 1);\t\t/* divide mm1 words by 2, Src1 low bytes */\n\t\tmm2 = _m_psrlwi(mm2, 1);\t\t/* divide mm2 words by 2, Src1 high bytes */\n\t\tmm1 = _m_pmullw(mm1, mm3);\t\t/* mul low  bytes of Src1 and Src2  */\n\t\tmm2 = _m_pmullw(mm2, mm4);\t\t/* mul high bytes of Src1 and Src2 */\n\t\t*mDest = _m_packuswb(mm1, mm2);\t\t/* pack words back into bytes with saturation */\n\t\tmSrc1++;\n\t\tmSrc2++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using MultDivby2: D = saturation255(S1/2 * S2)\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterMultDivby2(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\t\t/* MMX routine */\n\t\tSDL_imageFilterMultDivby2MMX(Src1, Src2, Dest, length);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcursrc2 = &Src2[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\tresult = ((int) *cursrc1 / 2) * (int) *cursrc2;\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdst = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using MultDivby4: D = saturation255(S1/2 * S2/2)\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterMultDivby4MMX(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov ebx, Src2   \t/* load Src2 address into ebx */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\tpxor mm0, mm0   \t/* zero mm0 register */\n\t\t\talign 16          \t/* 16 byte alignment of the loop entry */\nL1016:\n\t\tmovq mm1, [eax]   \t/* load 8 bytes from Src1 into mm1 */\n\t\tmovq mm3, [ebx]   \t/* load 8 bytes from Src2 into mm3 */\n\t\tmovq mm2, mm1   \t/* copy mm1 into mm2 */\n\t\t\tmovq mm4, mm3   \t/* copy mm3 into mm4  */\n\t\t\tpunpcklbw mm1, mm0   \t/* unpack low  bytes of Src1 into words */\n\t\t\tpunpckhbw mm2, mm0   \t/* unpack high bytes of Src1 into words */\n\t\t\tpunpcklbw mm3, mm0   \t/* unpack low  bytes of Src2 into words */\n\t\t\tpunpckhbw mm4, mm0   \t/* unpack high bytes of Src2 into words */\n\t\t\tpsrlw mm1, 1   \t/* divide mm1 words by 2, Src1 low bytes */\n\t\t\tpsrlw mm2, 1   \t/* divide mm2 words by 2, Src1 high bytes */\n\t\t\tpsrlw mm3, 1   \t/* divide mm3 words by 2, Src2 low bytes */\n\t\t\tpsrlw mm4, 1   \t/* divide mm4 words by 2, Src2 high bytes */\n\t\t\tpmullw mm1, mm3   \t/* mul low  bytes of Src1 and Src2  */\n\t\t\tpmullw mm2, mm4   \t/* mul high bytes of Src1 and Src2 */\n\t\t\tpackuswb mm1, mm2   \t/* pack words back into bytes with saturation */\n\t\t\tmovq [edi], mm1   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1, Src2 and Dest  */\n\t\t\tadd ebx, 8   \t/* register pointers by 8 */\n\t\t\tadd edi,  8\n\t\t\tdec ecx        \t/* decrease loop counter */\n\t\t\tjnz L1016       \t/* check loop termination, proceed if required */\n\t\t\temms             \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mSrc2 = (__m64*)Src2;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 mm0 = _m_from_int(0); /* zero mm0 register */\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm1, mm2, mm3, mm4, mm5, mm6;\n\t\tmm1 = _m_punpcklbw(*mSrc1, mm0);\t/* unpack low  bytes of Src1 into words */\n\t\tmm2 = _m_punpckhbw(*mSrc1, mm0);\t/* unpack high bytes of Src1 into words */\n\t\tmm3 = _m_punpcklbw(*mSrc2, mm0);\t/* unpack low  bytes of Src2 into words */\n\t\tmm4 = _m_punpckhbw(*mSrc2, mm0);\t/* unpack high bytes of Src2 into words */\n\t\tmm1 = _m_psrlwi(mm1, 1);\t\t/* divide mm1 words by 2, Src1 low bytes */\n\t\tmm2 = _m_psrlwi(mm2, 1);\t\t/* divide mm2 words by 2, Src1 high bytes */\n\t\tmm3 = _m_psrlwi(mm3, 1);\t\t/* divide mm3 words by 2, Src2 low bytes */\n\t\tmm4 = _m_psrlwi(mm4, 1);\t\t/* divide mm4 words by 2, Src2 high bytes */\n\t\tmm1 = _m_pmullw(mm1, mm3);\t\t/* mul low  bytes of Src1 and Src2  */\n\t\tmm2 = _m_pmullw(mm2, mm4);\t\t/* mul high bytes of Src1 and Src2 */\n\t\t*mDest = _m_packuswb(mm1, mm2);\t\t/* pack words back into bytes with saturation */\n\t\tmSrc1++;\n\t\tmSrc2++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using MultDivby4: D = saturation255(S1/2 * S2/2)\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterMultDivby4(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\t\t/* MMX routine */\n\t\tSDL_imageFilterMultDivby4MMX(Src1, Src2, Dest, length);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcursrc2 = &Src2[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\tresult = ((int) *cursrc1 / 2) * ((int) *cursrc2 / 2);\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdst = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using BitAnd: D = S1 & S2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterBitAndMMX(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov ebx, Src2   \t/* load Src2 address into ebx */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16          \t/* 16 byte alignment of the loop entry */\nL1017:\n\t\tmovq mm1, [eax]   \t/* load 8 bytes from Src1 into mm1 */\n\t\tpand mm1, [ebx]   \t/* mm1=Src1&Src2 */\n\t\tmovq [edi], mm1   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1, Src2 and Dest  */\n\t\t\tadd ebx, 8   \t/* register pointers by 8 */\n\t\t\tadd edi, 8\n\t\t\tdec ecx        \t/* decrease loop counter */\n\t\t\tjnz L1017       \t/* check loop termination, proceed if required */\n\t\t\temms             \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* x86_64 ASM with constraints: */\n\t/* asm volatile ( */\n\t/* \t\"shr $3, %%rcx \\n\\t\"\t/\\* counter/8 (MMX loads 8 bytes at a time) *\\/ */\n\t/* \t\".align 16       \\n\\t\"\t/\\* 16 byte alignment of the loop entry *\\/ */\n\t/* \t\"1: movq (%%rax), %%mm1 \\n\\t\"\t/\\* load 8 bytes from Src1 into mm1 *\\/ */\n\t/* \t\"pand    (%%rbx), %%mm1 \\n\\t\"\t/\\* mm1=Src1&Src2 *\\/ */\n\t/* \t\"movq    %%mm1, (%%rdi) \\n\\t\"\t/\\* store result in Dest *\\/ */\n\t/* \t\"add $8, %%rax \\n\\t\"\t/\\* increase Src1, Src2 and Dest  *\\/ */\n\t/* \t\"add $8, %%rbx \\n\\t\"\t/\\* register pointers by 8 *\\/ */\n\t/* \t\"add $8, %%rdi \\n\\t\" */\n\t/* \t\"dec %%rcx     \\n\\t\"\t/\\* decrease loop counter *\\/ */\n\t/* \t\"jnz 1b        \\n\\t\"\t/\\* check loop termination, proceed if required *\\/ */\n\t/* \t\"emms          \\n\\t\"\t/\\* exit MMX state *\\/ */\n\t/* \t: \"+a\" (Src1),\t\t/\\* load Src1 address into rax, modified by the loop *\\/ */\n\t/* \t  \"+b\" (Src2),\t\t/\\* load Src2 address into rbx, modified by the loop *\\/ */\n\t/* \t  \"+c\" (SrcLength),\t/\\* load loop counter (SIZE) into rcx, modified by the loop *\\/ */\n\t/* \t  \"+D\" (Dest)\t\t/\\* load Dest address into rdi, modified by the loop *\\/ */\n\t/* \t: */\n\t/* \t: \"memory\",\t\t/\\* *Dest is modified *\\/ */\n        /*           \"mm1\"\t\t\t/\\* register mm1 modified *\\/ */\n\t/* ); */\n\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mSrc2 = (__m64*)Src2;\n\t__m64 *mDest = (__m64*)Dest;\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_pand(*mSrc1, *mSrc2);\t/* Src1&Src2 */\n\t\tmSrc1++;\n\t\tmSrc2++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using BitAnd: D = S1 & S2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterBitAnd(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()>0) && (length>7)) {\n\t\t/*  if (length > 7) { */\n\t\t/* Call MMX routine */\n\n\t\tSDL_imageFilterBitAndMMX(Src1, Src2, Dest, length);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcursrc2 = &Src2[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\t*curdst = (*cursrc1) & (*cursrc2);\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using BitOr: D = S1 | S2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterBitOrMMX(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov ebx, Src2   \t/* load Src2 address into ebx */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16          \t/* 16 byte alignment of the loop entry */\nL91017:\n\t\tmovq mm1, [eax]   \t/* load 8 bytes from Src1 into mm1 */\n\t\tpor mm1, [ebx]   \t/* mm1=Src1|Src2 */\n\t\tmovq [edi], mm1   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1, Src2 and Dest  */\n\t\t\tadd ebx, 8   \t/* register pointers by 8 */\n\t\t\tadd edi,  8\n\t\t\tdec ecx        \t/* decrease loop counter */\n\t\t\tjnz L91017      \t/* check loop termination, proceed if required */\n\t\t\temms             \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mSrc2 = (__m64*)Src2;\n\t__m64 *mDest = (__m64*)Dest;\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_por(*mSrc1, *mSrc2);\t/* Src1|Src2 */\n\t\tmSrc1++;\n\t\tmSrc2++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using BitOr: D = S1 | S2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterBitOr(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\t/* MMX routine */\n\t\tSDL_imageFilterBitOrMMX(Src1, Src2, Dest, length);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcursrc2 = &Src2[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcursrc2 = Src2;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\t*curdst = *cursrc1 | *cursrc2;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\treturn (0);\n}\n\n/*!\n\\brief Internal ASM Filter using Div: D = S1 / S2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterDivASM(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov edx, Src1   \t/* load Src1 address into edx */\n\t\t\tmov esi, Src2   \t/* load Src2 address into esi */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\talign 16        \t/* 16 byte alignment of the loop entry */\nL10191:\n\t\tmov bl, [esi]   \t/* load a byte from Src2 */\n\t\tcmp bl, 0   \t/* check if it zero */\n\t\t\tjnz L10192\n\t\t\tmov [edi], 255   \t/* division by zero = 255 !!! */\n\t\t\tjmp  L10193\nL10192:\n\t\txor ah, ah   \t/* prepare AX, zero AH register */\n\t\t\tmov al, [edx]   \t/* load a byte from Src1 into AL */\n\t\tdiv   bl             \t/* divide AL by BL */\n\t\t\tmov [edi], al   \t/* move a byte result to Dest */\nL10193:\n\t\tinc edx    \t/* increment Src1, Src2, Dest */\n\t\t\tinc esi    \t\t/* pointer registers by one */\n\t\t\tinc edi\n\t\t\tdec ecx       \t/* decrease loop counter */\n\t\t\tjnz L10191     \t/* check loop termination, proceed if required */\n\t\t\tpopa\n\t}\n#else\n\t/* Note: ~15% gain on i386, less efficient than C on x86_64 */\n\t/* Also depends on whether the function is static (?!) */\n\t/* Also depends on whether we work on malloc() or static char[] */\n\tasm volatile (\n#  if defined(i386)\n\t\t\"pushl %%ebx \\n\\t\"\t\t/* %ebx may be the PIC register.  */\n\t\t\".align 16     \\n\\t\"\t\t/* 16 byte alignment of the loop entry */\n\t\t\"1: mov (%%esi), %%bl  \\n\\t\"\t/* load a byte from Src2 */\n\t\t\"cmp       $0, %%bl    \\n\\t\"\t/* check if it zero */\n\t\t\"jnz 2f                \\n\\t\"\n\t\t\"movb  $255, (%%edi)   \\n\\t\"\t/* division by zero = 255 !!! */\n\t\t\"jmp 3f                \\n\\t\"\n\t\t\"2: xor %%ah, %%ah     \\n\\t\"\t/* prepare AX, zero AH register */\n\t\t\"mov   (%%edx), %%al   \\n\\t\"\t/* load a byte from Src1 into AL */\n\t\t\"div   %%bl            \\n\\t\"\t/* divide AL by BL */\n\t\t\"mov   %%al, (%%edi)   \\n\\t\"\t/* move a byte result to Dest */\n\t\t\"3: inc %%edx          \\n\\t\"\t/* increment Src1, Src2, Dest */\n\t\t\"inc %%esi \\n\\t\"\t\t/* pointer registers by one */\n\t\t\"inc %%edi \\n\\t\"\n\t\t\"dec %%ecx \\n\\t\"\t\t/* decrease loop counter */\n\t\t\"jnz 1b    \\n\\t\"\t\t/* check loop termination, proceed if required */\n\t\t\"popl %%ebx \\n\\t\"\t\t/* restore %ebx */\n\t\t: \"+d\" (Src1),\t\t/* load Src1 address into edx */\n\t\t  \"+S\" (Src2),\t\t/* load Src2 address into esi */\n\t\t  \"+c\" (SrcLength),\t/* load loop counter (SIZE) into ecx */\n\t\t  \"+D\" (Dest)\t\t/* load Dest address into edi */\n\t\t:\n\t\t: \"memory\", \"rax\"\n#  elif defined(__x86_64__)\n\t\t\".align 16     \\n\\t\"\t\t/* 16 byte alignment of the loop entry */\n\t\t\"1: mov (%%rsi), %%bl  \\n\\t\"\t/* load a byte from Src2 */\n\t\t\"cmp       $0, %%bl    \\n\\t\"\t/* check if it zero */\n\t\t\"jnz 2f                \\n\\t\"\n\t\t\"movb  $255, (%%rdi)   \\n\\t\"\t/* division by zero = 255 !!! */\n\t\t\"jmp 3f                \\n\\t\"\n\t\t\"2: xor %%ah, %%ah     \\n\\t\"\t/* prepare AX, zero AH register */\n\t\t\"mov   (%%rdx), %%al   \\n\\t\"\t/* load a byte from Src1 into AL */\n\t\t\"div   %%bl            \\n\\t\"\t/* divide AL by BL */\n\t\t\"mov   %%al, (%%rdi)   \\n\\t\"\t/* move a byte result to Dest */\n\t\t\"3: inc %%rdx          \\n\\t\"\t/* increment Src1, Src2, Dest */\n\t\t\"inc %%rsi \\n\\t\"\t\t/* pointer registers by one */\n\t\t\"inc %%rdi \\n\\t\"\n\t\t\"dec %%rcx \\n\\t\"\t\t/* decrease loop counter */\n\t\t\"jnz 1b    \\n\\t\"\t\t/* check loop termination, proceed if required */\n\t\t: \"+d\" (Src1),\t\t/* load Src1 address into edx */\n\t\t  \"+S\" (Src2),\t\t/* load Src2 address into esi */\n\t\t  \"+c\" (SrcLength),\t/* load loop counter (SIZE) into ecx */\n\t\t  \"+D\" (Dest)\t\t/* load Dest address into edi */\n\t\t:\n\t\t: \"memory\", \"rax\", \"rbx\"\n#  endif\n\t\t);\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using Div: D = S1 / S2\n\n\\param Src1 Pointer to the start of the first source byte array (S1).\n\\param Src2 Pointer to the start of the second source byte array (S2).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterDiv(unsigned char *Src1, unsigned char *Src2, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *cursrc2, *curdst;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Src2 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif (SDL_imageFilterMMXdetect()) {\n\t\tif (length > 0) {\n\t\t\t/* Call ASM routine */\n\t\t\tSDL_imageFilterDivASM(Src1, Src2, Dest, length);\n\n\t\t\t/* Never unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t} else {\n\t\t\treturn (-1);\n\t\t}\n\t} \n\t\n\t/* Setup to process whole image */\n\tistart = 0;\n\tcursrc1 = Src1;\n\tcursrc2 = Src2;\n\tcurdst = Dest;\n\n\t/* C routine to process image */\n\t/* for (i = istart; i < length; i++) { */\n\t/* \tif (*cursrc2 == 0) { */\n\t/* \t\t*curdst = 255; */\n\t/* \t} else { */\n\t/* \t\tresult = (int) *cursrc1 / (int) *cursrc2; */\n\t/* \t\t*curdst = (unsigned char) result; */\n\t/* \t} */\n\t/* \t/\\* Advance pointers *\\/ */\n\t/* \tcursrc1++; */\n\t/* \tcursrc2++; */\n\t/* \tcurdst++; */\n\t/* } */\n\tfor (i = istart; i < length; i++) {\n\t\tif (*cursrc2 == 0) {\n\t\t\t*curdst = 255;\n\t\t} else {\n\t\t\t*curdst = (int)*cursrc1 / (int)*cursrc2;  // (int) for efficiency\n\t\t}\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcursrc2++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/* ------------------------------------------------------------------------------------ */\n\n/*!\n\\brief Internal MMX Filter using BitNegation: D = !S\n\n\\param Src1 Pointer to the start of the source byte array (S1).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterBitNegationMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tpcmpeqb mm1, mm1   \t/* generate all 1's in mm1 */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16          \t/* 16 byte alignment of the loop entry */\nL91117:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from Src1 into mm1 */\n\t\tpxor mm0, mm1   \t/* negate mm0 by xoring with mm1 */\n\t\t\tmovq [edi], mm0   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1, Src2 and Dest  */\n\t\t\tadd edi,  8\n\t\t\tdec ecx        \t/* decrease loop counter */\n\t\t\tjnz L91117      \t/* check loop termination, proceed if required */\n\t\t\temms             \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n        __m64 mm1;\n\tmm1 = _m_pcmpeqb(mm1, mm1);\t\t/* generate all 1's in mm1 */\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_pxor(*mSrc1, mm1);\t/* negate mm0 by xoring with mm1 */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t/* clean MMX state */\n\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using BitNegation: D = !S\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterBitNegation(unsigned char *Src1, unsigned char *Dest, unsigned int length)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *curdst;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\t\t/* MMX routine */\n\t\tSDL_imageFilterBitNegationMMX(Src1, Dest, length);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdst = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdst = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\t*curdst = ~(*cursrc1);\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdst++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using AddByte: D = saturation255(S + C) \n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param C Constant value to add (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterAddByteMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char C)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\t/* ** Duplicate C in 8 bytes of MM1 ** */\n\t\t\tmov al, C   \t/* load C into AL */\n\t\t\tmov ah, al   \t/* copy AL into AH */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm1, eax   \t/* copy EAX into MM1 */\n\t\t\tmovd mm2, eax   \t/* copy EAX into MM2 */\n\t\t\tpunpckldq mm1, mm2   \t/* fill higher bytes of MM1 with C */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL1021:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from Src1 into MM0 */\n\t\tpaddusb mm0,  mm1 \t/* MM0=SrcDest+C (add 8 bytes with saturation) */\n\t\t\tmovq [edi], mm0   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L1021    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t/* Duplicate C in 8 bytes of MM1 */\n\tint i;\n\tmemset(&i, C, 4);\n\t__m64 mm1 = _m_from_int(i);\n\t__m64 mm2 = _m_from_int(i);\n\tmm1 = _m_punpckldq(mm1, mm2);\t\t\t/* fill higher bytes of MM1 with C */\n        //__m64 mm1 = _m_from_int64(lli); // x86_64 only\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_paddusb(*mSrc1, mm1);\t/* Src1+C (add 8 bytes with saturation) */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using AddByte: D = saturation255(S + C) \n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param C Constant value to add (C).\n\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterAddByte(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char C)\n{\n\tunsigned int i, istart;\n\tint iC;\n\tunsigned char *cursrc1, *curdest;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\t/* Special case: C==0 */\n\tif (C == 0) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\t/* MMX routine */\n\t\tSDL_imageFilterAddByteMMX(Src1, Dest, length, C);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tiC = (int) C;\n\tfor (i = istart; i < length; i++) {\n\t\tresult = (int) *cursrc1 + iC;\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdest = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using AddUint: D = saturation255((S[i] + Cs[i % 4]), Cs=Swap32((uint)C)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param C Constant to add (C).\n\\param D Byteorder-swapped constant to add (Cs).\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterAddUintMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned int C, unsigned int D)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\t/* ** Duplicate (int)C in 8 bytes of MM1 ** */\n\t\t\tmov eax, C   \t/* load C into EAX */\n\t\t\tmovd mm1, eax   \t/* copy EAX into MM1 */\n\t\t\tmov eax, D   \t/* load D into EAX */\n\t\t\tmovd mm2, eax   \t/* copy EAX into MM2 */\n\t\t\tpunpckldq mm1, mm2   \t/* fill higher bytes of MM1 with C */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL11023:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from SrcDest into MM0 */\n\t\tpaddusb mm0,  mm1 \t/* MM0=SrcDest+C (add 8 bytes with saturation) */\n\t\t\tmovq [edi],  mm0 \t/* store result in SrcDest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L11023    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t/* Duplicate (int)C in 8 bytes of MM1 */\n\t__m64 mm1 = _m_from_int(C);\n\t__m64 mm2 = _m_from_int(C);\n\tmm1 = _m_punpckldq(mm1, mm2);\t\t\t/* fill higher bytes of MM1 with C */\n        //__m64 mm1 = _m_from_int64(lli); // x86_64 only\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_paddusb(*mSrc1, mm1);\t/* Src1+C (add 8 bytes with saturation) */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using AddUint: D = saturation255((S[i] + Cs[i % 4]), Cs=Swap32((uint)C)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param C Constant to add (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterAddUint(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned int C)\n{\n\tunsigned int i, j, istart, D;\n\tint iC[4];\n\tunsigned char *cursrc1;\n\tunsigned char *curdest;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\t/* Special case: C==0 */\n\tif (C == 0) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\t/* MMX routine */\n\t\tD=SWAP_32(C);\n\t\tSDL_imageFilterAddUintMMX(Src1, Dest, length, C, D);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process bytes */\n\tiC[3] = (int) ((C >> 24) & 0xff);\n\tiC[2] = (int) ((C >> 16) & 0xff);\n\tiC[1] = (int) ((C >>  8) & 0xff);\n\tiC[0] = (int) ((C >>  0) & 0xff);\n\tfor (i = istart; i < length; i += 4) {\n\t\tfor (j = 0; j < 4; j++) {\n\t\t\tif ((i+j)<length) {\n\t\t\t\tresult = (int) *cursrc1 + iC[j];\n\t\t\t\tif (result > 255) result = 255;\n\t\t\t\t*curdest = (unsigned char) result;\n\t\t\t\t/* Advance pointers */\n\t\t\t\tcursrc1++;\n\t\t\t\tcurdest++;\n\t\t\t}\n\t\t}\n\t}\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using AddByteToHalf: D = saturation255(S/2 + C)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param C Constant to add (C).\n\\param Mask Pointer to 8 mask bytes of value 0x7F.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterAddByteToHalfMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char C,\n\t\t\t\t\t\t\t\t\tunsigned char *Mask)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\t/* ** Duplicate C in 8 bytes of MM1 ** */\n\t\t\tmov al, C   \t/* load C into AL */\n\t\t\tmov ah, al   \t/* copy AL into AH */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm1, eax   \t/* copy EAX into MM1 */\n\t\t\tmovd mm2, eax   \t/* copy EAX into MM2 */\n\t\t\tpunpckldq mm1, mm2   \t/* fill higher bytes of MM1 with C */\n\t\t\tmov edx, Mask   \t/* load Mask address into edx */\n\t\t\tmovq mm0, [edx]   \t/* load Mask into mm0 */\n\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx,  SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL1022:\n\t\tmovq mm2, [eax]   \t/* load 8 bytes from Src1 into MM2 */\n\t\tpsrlw mm2, 1   \t/* shift 4 WORDS of MM2 1 bit to the right */\n\t\t\tpand mm2, mm0        // apply Mask to 8 BYTES of MM2 */\n\t\t\tpaddusb mm2,  mm1 \t/* MM2=SrcDest+C (add 8 bytes with saturation) */\n\t\t\tmovq [edi], mm2   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L1022    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 *mMask = (__m64*)Mask;\n\t/* Duplicate C in 8 bytes of MM1 */\n\tint i;\n\tmemset(&i, C, 4);\n\t__m64 mm1 = _m_from_int(i);\n\t__m64 mm2 = _m_from_int(i);\n\tmm1 = _m_punpckldq(mm1, mm2);\t\t\t/* fill higher bytes of MM1 with C */\n        //__m64 mm1 = _m_from_int64(lli); // x86_64 only\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm2 = _m_psrlwi(*mSrc1, 1);\t/* shift 4 WORDS of MM2 1 bit to the right */\n\t\tmm2 = _m_pand(mm2, *mMask);\t\t/* apply Mask to 8 BYTES of MM2 */\n\t\t\t\t\t\t\t/* byte     0x0f, 0xdb, 0xd0 */\n\t\t*mDest = _m_paddusb(mm1, mm2);\t\t/* Src1+C (add 8 bytes with saturation) */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using AddByteToHalf: D = saturation255(S/2 + C)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param C Constant to add (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterAddByteToHalf(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char C)\n{\n\tstatic unsigned char Mask[8] = { 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F };\n\tunsigned int i, istart;\n\tint iC;\n\tunsigned char *cursrc1;\n\tunsigned char *curdest;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\t/* MMX routine */\n\t\tSDL_imageFilterAddByteToHalfMMX(Src1, Dest, length, C, Mask);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tiC = (int) C;\n\tfor (i = istart; i < length; i++) {\n\t\tresult = (int) (*cursrc1 / 2) + iC;\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdest = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using SubByte: D = saturation0(S - C)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param C Constant to subtract (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterSubByteMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char C)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\t/* ** Duplicate C in 8 bytes of MM1 ** */\n\t\t\tmov al, C   \t/* load C into AL */\n\t\t\tmov ah, al   \t/* copy AL into AH */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm1, eax   \t/* copy EAX into MM1 */\n\t\t\tmovd mm2, eax   \t/* copy EAX into MM2 */\n\t\t\tpunpckldq mm1, mm2   \t/* fill higher bytes of MM1 with C */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx,  SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL1023:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from SrcDest into MM0 */\n\t\tpsubusb mm0,  mm1 \t/* MM0=SrcDest-C (sub 8 bytes with saturation) */\n\t\t\tmovq [edi], mm0   \t/* store result in SrcDest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L1023    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t/* Duplicate C in 8 bytes of MM1 */\n\tint i;\n\tmemset(&i, C, 4);\n\t__m64 mm1 = _m_from_int(i);\n\t__m64 mm2 = _m_from_int(i);\n\tmm1 = _m_punpckldq(mm1, mm2);\t\t\t/* fill higher bytes of MM1 with C */\n        //__m64 mm1 = _m_from_int64(lli); // x86_64 only\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_psubusb(*mSrc1, mm1);\t/* Src1-C (sub 8 bytes with saturation) */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using SubByte: D = saturation0(S - C)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\\param C Constant to subtract (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterSubByte(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char C)\n{\n\tunsigned int i, istart;\n\tint iC;\n\tunsigned char *cursrc1;\n\tunsigned char *curdest;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\t/* Special case: C==0 */\n\tif (C == 0) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\t/* MMX routine */\n\t\tSDL_imageFilterSubByteMMX(Src1, Dest, length, C);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tiC = (int) C;\n\tfor (i = istart; i < length; i++) {\n\t\tresult = (int) *cursrc1 - iC;\n\t\tif (result < 0)\n\t\t\tresult = 0;\n\t\t*curdest = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using SubUint: D = saturation0(S[i] - Cs[i % 4]), Cs=Swap32((uint)C)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param C Constant to subtract (C).\n\\param D Byteorder-swapped constant to subtract (Cs).\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterSubUintMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned int C, unsigned int D)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\t/* ** Duplicate (int)C in 8 bytes of MM1 ** */\n\t\t\tmov eax, C   \t/* load C into EAX */\n\t\t\tmovd mm1, eax   \t/* copy EAX into MM1 */\n\t\t\tmov eax, D   \t/* load D into EAX */\n\t\t\tmovd mm2, eax   \t/* copy EAX into MM2 */\n\t\t\tpunpckldq mm1, mm2   \t/* fill higher bytes of MM1 with C */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx,  SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL11024:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from SrcDest into MM0 */\n\t\tpsubusb mm0, mm1 \t/* MM0=SrcDest-C (sub 8 bytes with saturation) */\n\t\t\tmovq [edi], mm0   \t/* store result in SrcDest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L11024    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t/* Duplicate (int)C in 8 bytes of MM1 */\n\t__m64 mm1 = _m_from_int(C);\n\t__m64 mm2 = _m_from_int(C);\n\tmm1 = _m_punpckldq(mm1, mm2);\t\t\t/* fill higher bytes of MM1 with C */\n        //__m64 mm1 = _m_from_int64(lli); // x86_64 only\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_psubusb(*mSrc1, mm1);\t/* Src1-C (sub 8 bytes with saturation) */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using SubUint: D = saturation0(S[i] - Cs[i % 4]), Cs=Swap32((uint)C)\n\n\\param Src1 Pointer to the start of the source byte array (S1).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param C Constant to subtract (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterSubUint(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned int C)\n{\n\tunsigned int i, j, istart, D;\n\tint iC[4];\n\tunsigned char *cursrc1;\n\tunsigned char *curdest;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n    /* Special case: C==0 */\n\tif (C == 0) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\t/* MMX routine */\n\t\tD=SWAP_32(C);\n\t\tSDL_imageFilterSubUintMMX(Src1, Dest, length, C, D);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tiC[3] = (int) ((C >> 24) & 0xff);\n\tiC[2] = (int) ((C >> 16) & 0xff);\n\tiC[1] = (int) ((C >>  8) & 0xff);\n\tiC[0] = (int) ((C >>  0) & 0xff);\n\tfor (i = istart; i < length; i += 4) {\n\t\tfor (j = 0; j < 4; j++) {\n\t\t\tif ((i+j)<length) {\n\t\t\t\tresult = (int) *cursrc1 - iC[j];\n\t\t\t\tif (result < 0) result = 0;\n\t\t\t\t*curdest = (unsigned char) result;\n\t\t\t\t/* Advance pointers */\n\t\t\t\tcursrc1++;\n\t\t\t\tcurdest++;\n\t\t\t}\n\t\t}\n\t}\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using ShiftRight: D = saturation0(S >> N)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 8.\n\\param Mask Byte array containing 8 bytes with 0x7F value.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterShiftRightMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char N,\n\t\t\t\t\t\t\t\t unsigned char *Mask)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov edx, Mask   \t/* load Mask address into edx */\n\t\t\tmovq mm0, [edx]   \t/* load Mask into mm0 */\n\t\txor ecx, ecx   \t/* zero ECX */\n\t\t\tmov cl,  N \t/* load loop counter (N) into CL */\n\t\t\tmovd mm3,  ecx \t/* copy (N) into MM3  */\n\t\t\tpcmpeqb mm1, mm1   \t/* generate all 1's in mm1 */\nL10240:                  \t/* ** Prepare proper bit-Mask in MM1 ** */\n\t\tpsrlw mm1,  1 \t/* shift 4 WORDS of MM1 1 bit to the right */\n\t\t\tpand mm1, mm0   // apply Mask to 8 BYTES of MM1 */\n\t\t\t/*  byte     0x0f, 0xdb, 0xc8 */\n\t\t\tdec               cl    \t/* decrease loop counter */\n\t\t\tjnz            L10240    \t/* check loop termination, proceed if required */\n\t\t\t/* ** Shift all bytes of the image ** */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx,  SrcLength \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx,  3 \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10241:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from SrcDest into MM0 */\n\t\tpsrlw mm0, mm3   \t/* shift 4 WORDS of MM0 (N) bits to the right */\n\t\t\tpand mm0, mm1    // apply proper bit-Mask to 8 BYTES of MM0 */\n\t\t\t/* byte     0x0f, 0xdb, 0xc1 */\n\t\t\tmovq [edi], mm0   \t/* store result in SrcDest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz            L10241    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 *mMask = (__m64*)Mask;\n        __m64 mm1;\n\tint i;\n\tmm1 = _m_pcmpeqb(mm1, mm1);\t\t\t/* generate all 1's in mm1 */\n\t/* Prepare proper bit-Mask in MM1 */\n\tfor (i = 0; i < N; i++) {\n\t\tmm1 = _m_psrlwi(mm1, 1);\t\t/* shift 4 WORDS of MM1 1 bit to the right */\n\t\tmm1 = _m_pand(mm1, *mMask);\t\t/* apply Mask to 8 BYTES of MM1 */\n\t}\n        /* Shift all bytes of the image */\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm0 = _m_psrlwi(*mSrc1, N);\t/* shift 4 WORDS of MM0 (N) bits to the right */\n\t\t*mDest = _m_pand(mm0, mm1);\t\t/* apply proper bit-Mask to 8 BYTES of MM0 */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using ShiftRight: D = saturation0(S >> N)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 8.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterShiftRight(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char N)\n{\n\tstatic unsigned char Mask[8] = { 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F };\n\tunsigned int i, istart;\n\tunsigned char *cursrc1;\n\tunsigned char *curdest;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\t/* Check shift */\n\tif (N > 8) {\n\t\treturn (-1);\n\t}\n\n\t/* Special case: N==0 */\n\tif (N == 0) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\t/* MMX routine */\n\t\tSDL_imageFilterShiftRightMMX(Src1, Dest, length, N, Mask);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\t*curdest = (unsigned char) *cursrc1 >> N;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using ShiftRightUint: D = saturation0((uint)S[i] >> N)\n\n\\param Src1 Pointer to the start of the source byte array (S1).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N).\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterShiftRightUintMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char N)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL13023:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from SrcDest into MM0 */\n\t\tpsrld mm0, N\n\t\t\tmovq [edi], mm0   \t/* store result in SrcDest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L13023    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_psrldi(*mSrc1, N);\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using ShiftRightUint: D = saturation0((uint)S[i] >> N)\n\n\\param Src1 Pointer to the start of the source byte array (S1).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 32.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterShiftRightUint(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char N)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *curdest;\n\tunsigned int *icursrc1, *icurdest;\n\tunsigned int result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif (N > 32) {\n\t\treturn (-1);\n\t}\n\n\t/* Special case: N==0 */\n\tif (N == 0) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\tSDL_imageFilterShiftRightUintMMX(Src1, Dest, length, N);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\ticursrc1=(unsigned int *)cursrc1;\n\ticurdest=(unsigned int *)curdest;\n\tfor (i = istart; i < length; i += 4) {\n\t\tif ((i+4)<length) {\n\t\t\tresult = ((unsigned int)*icursrc1 >> N);\n\t\t\t*icurdest = result;\n\t\t}\n\t\t/* Advance pointers */\n\t\ticursrc1++;\n\t\ticurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using MultByByte: D = saturation255(S * C)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param C Constant to multiply with (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterMultByByteMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char C)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\t/* ** Duplicate C in 4 words of MM1 ** */\n\t\t\tmov al, C   \t/* load C into AL */\n\t\t\txor ah, ah   \t/* zero AH */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm1, eax   \t/* copy EAX into MM1 */\n\t\t\tmovd mm2, eax   \t/* copy EAX into MM2 */\n\t\t\tpunpckldq mm1, mm2   \t/* fill higher words of MM1 with C */\n\t\t\tpxor mm0, mm0   \t/* zero MM0 register */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\tcmp al, 128   \t/* if (C <= 128) execute more efficient code */\n\t\t\tjg             L10251\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10250:\n\t\tmovq mm3, [eax]   \t/* load 8 bytes from Src1 into MM3 */\n\t\tmovq mm4, mm3   \t/* copy MM3 into MM4  */\n\t\t\tpunpcklbw mm3, mm0   \t/* unpack low  bytes of SrcDest into words */\n\t\t\tpunpckhbw mm4, mm0   \t/* unpack high bytes of SrcDest into words */\n\t\t\tpmullw mm3, mm1   \t/* mul low  bytes of SrcDest and MM1 */\n\t\t\tpmullw mm4, mm1   \t/* mul high bytes of SrcDest and MM1 */\n\t\t\tpackuswb mm3, mm4   \t/* pack words back into bytes with saturation */\n\t\t\tmovq [edi], mm3   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz            L10250    \t/* check loop termination, proceed if required */\n\t\t\tjmp            L10252\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10251:\n\t\tmovq mm3, [eax]   \t/* load 8 bytes from Src1 into MM3 */\n\t\tmovq mm4, mm3   \t/* copy MM3 into MM4  */\n\t\t\tpunpcklbw mm3, mm0   \t/* unpack low  bytes of SrcDest into words */\n\t\t\tpunpckhbw mm4, mm0   \t/* unpack high bytes of SrcDest into words */\n\t\t\tpmullw mm3, mm1   \t/* mul low  bytes of SrcDest and MM1 */\n\t\t\tpmullw mm4, mm1   \t/* mul high bytes of SrcDest and MM1 */\n\t\t\t/* ** Take abs value of the results (signed words) ** */\n\t\t\tmovq mm5, mm3   \t/* copy mm3 into mm5 */\n\t\t\tmovq mm6, mm4   \t/* copy mm4 into mm6 */\n\t\t\tpsraw mm5, 15   \t/* fill mm5 words with word sign bit */\n\t\t\tpsraw mm6, 15   \t/* fill mm6 words with word sign bit */\n\t\t\tpxor mm3, mm5   \t/* take 1's compliment of only neg words */\n\t\t\tpxor mm4, mm6   \t/* take 1's compliment of only neg words */\n\t\t\tpsubsw mm3, mm5   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\tpsubsw mm4, mm6   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\tpackuswb mm3, mm4   \t/* pack words back into bytes with saturation */\n\t\t\tmovq [edi], mm3   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz            L10251    \t/* check loop termination, proceed if required */\nL10252:\n\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 mm0 = _m_from_int(0);\t\t\t\t/* zero mm0 register */\n\t/* Duplicate C in 4 words of MM1 */\n\tint i;\n\ti = C | C<<16;\n\t__m64 mm1 = _m_from_int(i);\n\t__m64 mm2 = _m_from_int(i);\n\tmm1 = _m_punpckldq(mm1, mm2);\t\t\t\t/* fill higher words of MM1 with C */\n\t// long long lli = C | C<<16 | (long long)C<<32 | (long long)C<<48;\n        //__m64 mm1 = _m_from_int64(lli); // x86_64 only\n\tif (C <= 128) {\t\t\t\t\t\t/* if (C <= 128) execute more efficient code */\n\t\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t\t__m64 mm3, mm4;\n\t\t\tmm3 = _m_punpcklbw(*mSrc1, mm0);\t/* unpack low  bytes of Src1 into words */\n\t\t\tmm4 = _m_punpckhbw(*mSrc1, mm0);\t/* unpack high bytes of Src1 into words */\n\t\t\tmm3 = _m_pmullw(mm3, mm1);\t\t/* mul low  bytes of Src1 and MM1 */\n\t\t\tmm4 = _m_pmullw(mm4, mm1);\t\t/* mul high bytes of Src1 and MM1 */\n\t\t\t*mDest = _m_packuswb(mm3, mm4);\t\t/* pack words back into bytes with saturation */\n\t\t\tmSrc1++;\n\t\t\tmDest++;\n\t\t}\n\t} else {\n\t\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t\t__m64 mm3, mm4, mm5, mm6;\n\t\t\tmm3 = _m_punpcklbw(*mSrc1, mm0);\t/* unpack low  bytes of Src1 into words */\n\t\t\tmm4 = _m_punpckhbw(*mSrc1, mm0);\t/* unpack high bytes of Src1 into words */\n\t\t\tmm3 = _m_pmullw(mm3, mm1);\t\t/* mul low  bytes of Src1 and MM1 */\n\t\t\tmm4 = _m_pmullw(mm4, mm1);\t\t/* mul high bytes of Src1 and MM1 */\n\t\t\t/* Take abs value of the results (signed words) */\n\t\t\tmm5 = _m_psrawi(mm3, 15);\t\t/* fill mm5 words with word sign bit */\n\t\t\tmm6 = _m_psrawi(mm4, 15);\t\t/* fill mm6 words with word sign bit */\n\t\t\tmm3 = _m_pxor(mm3, mm5);\t\t/* take 1's compliment of only neg. words */\n\t\t\tmm4 = _m_pxor(mm4, mm6);\t\t/* take 1's compliment of only neg. words */\n\t\t\tmm3 = _m_psubsw(mm3, mm5);\t\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\tmm4 = _m_psubsw(mm4, mm6);\t\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\t*mDest = _m_packuswb(mm3, mm4);\t\t/* pack words back into bytes with saturation */\n\t\t\tmSrc1++;\n\t\t\tmDest++;\n\t\t}\n\t}\n\t_m_empty();\t\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using MultByByte: D = saturation255(S * C)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\\param C Constant to multiply with (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterMultByByte(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char C)\n{\n\tunsigned int i, istart;\n\tint iC;\n\tunsigned char *cursrc1;\n\tunsigned char *curdest;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\t/* Special case: C==1 */\n\tif (C == 1) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\tSDL_imageFilterMultByByteMMX(Src1, Dest, length, C);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tiC = (int) C;\n\tfor (i = istart; i < length; i++) {\n\t\tresult = (int) *cursrc1 * iC;\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdest = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using ShiftRightAndMultByByteMMX: D = saturation255((S >> N) * C) \n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 8.\n\\param C Constant to multiply with (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterShiftRightAndMultByByteMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char N,\n\t\t\t\t\t\t\t\t\t\t\t  unsigned char C)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\t/* ** Duplicate C in 4 words of MM1 ** */\n\t\t\tmov al, C   \t/* load C into AL */\n\t\t\txor ah, ah   \t/* zero AH */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm1, eax   \t/* copy EAX into MM1 */\n\t\t\tmovd mm2, eax   \t/* copy EAX into MM2 */\n\t\t\tpunpckldq mm1, mm2   \t/* fill higher words of MM1 with C */\n\t\t\txor ecx, ecx   \t/* zero ECX */\n\t\t\tmov cl, N   \t/* load N into CL */\n\t\t\tmovd mm7, ecx   \t/* copy N into MM7 */\n\t\t\tpxor mm0, mm0   \t/* zero MM0 register */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL1026:\n\t\tmovq mm3, [eax]   \t/* load 8 bytes from Src1 into MM3 */\n\t\tmovq mm4, mm3   \t/* copy MM3 into MM4  */\n\t\t\tpunpcklbw mm3, mm0   \t/* unpack low  bytes of SrcDest into words */\n\t\t\tpunpckhbw mm4, mm0   \t/* unpack high bytes of SrcDest into words */\n\t\t\tpsrlw mm3, mm7   \t/* shift 4 WORDS of MM3 (N) bits to the right */\n\t\t\tpsrlw mm4, mm7   \t/* shift 4 WORDS of MM4 (N) bits to the right */\n\t\t\tpmullw mm3, mm1   \t/* mul low  bytes of SrcDest by MM1 */\n\t\t\tpmullw mm4, mm1   \t/* mul high bytes of SrcDest by MM1 */\n\t\t\tpackuswb mm3, mm4   \t/* pack words back into bytes with saturation */\n\t\t\tmovq [edi], mm3   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L1026    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 mm0 = _m_from_int(0);\t\t\t/* zero mm0 register */\n\t/* Duplicate C in 4 words of MM1 */\n\tint i;\n\ti = (C<<16)|C;\n\t__m64 mm1 = _m_from_int(i);\n\t__m64 mm2 = _m_from_int(i);\n\tmm1 = _m_punpckldq(mm1, mm2);\t\t\t/* fill higher words of MM1 with C */\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm3, mm4, mm5, mm6;\n\t\tmm3 = _m_punpcklbw(*mSrc1, mm0);\t/* unpack low  bytes of Src1 into words */\n\t\tmm4 = _m_punpckhbw(*mSrc1, mm0);\t/* unpack high bytes of Src1 into words */\n\t\tmm3 = _m_psrlwi(mm3, N);\t\t/* shift 4 WORDS of MM3 (N) bits to the right */\n\t\tmm4 = _m_psrlwi(mm4, N);\t\t/* shift 4 WORDS of MM4 (N) bits to the right */\n\t\tmm3 = _m_pmullw(mm3, mm1);\t\t/* mul low  bytes of Src1 and MM1 */\n\t\tmm4 = _m_pmullw(mm4, mm1);\t\t/* mul high bytes of Src1 and MM1 */\n\t\t*mDest = _m_packuswb(mm3, mm4);\t\t/* pack words back into bytes with saturation */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using ShiftRightAndMultByByte: D = saturation255((S >> N) * C) \n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 8.\n\\param C Constant to multiply with (C).\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterShiftRightAndMultByByte(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char N,\n\t\t\t\t\t\t\t\t\t\t   unsigned char C)\n{\n\tunsigned int i, istart;\n\tint iC;\n\tunsigned char *cursrc1;\n\tunsigned char *curdest;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\t/* Check shift */\n\tif (N > 8) {\n\t\treturn (-1);\n\t}\n\n\t/* Special case: N==0 && C==1 */\n\tif ((N == 0) && (C == 1)) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\tSDL_imageFilterShiftRightAndMultByByteMMX(Src1, Dest, length, N, C);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tiC = (int) C;\n\tfor (i = istart; i < length; i++) {\n\t\tresult = (int) (*cursrc1 >> N) * iC;\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdest = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using ShiftLeftByte: D = (S << N)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source arrays.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 8.\n\\param Mask Byte array containing 8 bytes of 0xFE value.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterShiftLeftByteMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char N,\n\t\t\t\t\t\t\t\t\tunsigned char *Mask)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov edx, Mask   \t/* load Mask address into edx */\n\t\t\tmovq mm0, [edx]   \t/* load Mask into mm0 */\n\t\txor ecx, ecx   \t/* zero ECX */\n\t\t\tmov cl, N   \t/* load loop counter (N) into CL */\n\t\t\tmovd mm3, ecx   \t/* copy (N) into MM3  */\n\t\t\tpcmpeqb mm1, mm1   \t/* generate all 1's in mm1 */\nL10270:                  \t/* ** Prepare proper bit-Mask in MM1 ** */\n\t\tpsllw mm1, 1   \t/* shift 4 WORDS of MM1 1 bit to the left */\n\t\t\tpand mm1, mm0        // apply Mask to 8 BYTES of MM1 */\n\t\t\t/*  byte     0x0f, 0xdb, 0xc8 */\n\t\t\tdec cl                  \t/* decrease loop counter */\n\t\t\tjnz            L10270    \t/* check loop termination, proceed if required */\n\t\t\t/* ** Shift all bytes of the image ** */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load SrcDest address into edi */\n\t\t\tmov ecx, SrcLength   \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10271:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from Src1 into MM0 */\n\t\tpsllw mm0, mm3   \t/* shift 4 WORDS of MM0 (N) bits to the left */\n\t\t\tpand mm0, mm1    // apply proper bit-Mask to 8 BYTES of MM0 */\n\t\t\t/* byte     0x0f, 0xdb, 0xc1 */\n\t\t\tmovq [edi], mm0   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz            L10271    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 *mMask = (__m64*)Mask;\n        __m64 mm1;\n\tint i;\n\tmm1 = _m_pcmpeqb(mm1, mm1);\t\t\t/* generate all 1's in mm1 */\n\t/* Prepare proper bit-Mask in MM1 */\n\tfor (i = 0; i < N; i++) {\n\t\tmm1 = _m_psllwi(mm1, 1);\t\t/* shift 4 WORDS of MM1 1 bit to the left */\n\t\tmm1 = _m_pand(mm1, *mMask);\t\t/* apply Mask to 8 BYTES of MM1 */\n\t}\n\t/* ** Shift all bytes of the image ** */\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm0 = _m_psllwi(*mSrc1, N);\t/* shift 4 WORDS of MM0 (N) bits to the left */\n\t\t*mDest = _m_pand(mm0, mm1);\t\t/* apply proper bit-Mask to 8 BYTES of MM0 */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using ShiftLeftByte: D = (S << N)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source arrays.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 8.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterShiftLeftByte(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char N)\n{\n\tstatic unsigned char Mask[8] = { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE };\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *curdest;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif (N > 8) {\n\t\treturn (-1);\n\t}\n\n\t/* Special case: N==0 */\n\tif (N == 0) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\tSDL_imageFilterShiftLeftByteMMX(Src1, Dest, length, N, Mask);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\tresult = ((int) *cursrc1 << N) & 0xff;\n\t\t*curdest = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using ShiftLeftUint: D = ((uint)S << N)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 32.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterShiftLeftUintMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char N)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL12023:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from SrcDest into MM0 */\n\t\tpslld mm0, N   \t/* MM0=SrcDest+C (add 8 bytes with saturation) */\n\t\t\tmovq [edi], mm0   \t/* store result in SrcDest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L12023    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\tint i;\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t*mDest = _m_pslldi(*mSrc1, N);\t/* Src1+C (add 8 bytes with saturation) */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using ShiftLeftUint: D = ((uint)S << N)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 32.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterShiftLeftUint(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char N)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *curdest;\n\tunsigned int *icursrc1, *icurdest;\n\tunsigned int result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif (N > 32) {\n\t\treturn (-1);\n\t}\n\n\t/* Special case: N==0 */\n\tif (N == 0) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\tSDL_imageFilterShiftLeftUintMMX(Src1, Dest, length, N);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\ticursrc1=(unsigned int *)cursrc1;\n\ticurdest=(unsigned int *)curdest;\n\tfor (i = istart; i < length; i += 4) {\n\t\tif ((i+4)<length) {\n\t\t\tresult = ((unsigned int)*icursrc1 << N);\n\t\t\t*icurdest = result;\n\t\t}\n\t\t/* Advance pointers */\n\t\ticursrc1++;\n\t\ticurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter ShiftLeft: D = saturation255(S << N)\n\n\\param Src1 Pointer to the start of the source byte array (S1).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 8.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterShiftLeftMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char N)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\txor eax, eax   \t/* zero EAX */\n\t\t\tmov al, N   \t/* load N into AL */\n\t\t\tmovd mm7, eax   \t/* copy N into MM7 */\n\t\t\tpxor mm0, mm0   \t/* zero MM0 register */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\tcmp al, 7   \t/* if (N <= 7) execute more efficient code */\n\t\t\tjg             L10281\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10280:\n\t\tmovq mm3, [eax]   \t/* load 8 bytes from Src1 into MM3 */\n\t\tmovq mm4, mm3   \t/* copy MM3 into MM4  */\n\t\t\tpunpcklbw mm3, mm0   \t/* unpack low  bytes of SrcDest into words */\n\t\t\tpunpckhbw mm4, mm0   \t/* unpack high bytes of SrcDest into words */\n\t\t\tpsllw mm3, mm7   \t/* shift 4 WORDS of MM3 (N) bits to the left */\n\t\t\tpsllw mm4, mm7   \t/* shift 4 WORDS of MM4 (N) bits to the left */\n\t\t\tpackuswb mm3, mm4   \t/* pack words back into bytes with saturation */\n\t\t\tmovq [edi], mm3   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz            L10280    \t/* check loop termination, proceed if required */\n\t\t\tjmp            L10282\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10281:\n\t\tmovq mm3, [eax]   \t/* load 8 bytes from Src1 into MM3 */\n\t\tmovq mm4, mm3   \t/* copy MM3 into MM4  */\n\t\t\tpunpcklbw mm3, mm0   \t/* unpack low  bytes of SrcDest into words */\n\t\t\tpunpckhbw mm4, mm0   \t/* unpack high bytes of SrcDest into words */\n\t\t\tpsllw mm3, mm7   \t/* shift 4 WORDS of MM3 (N) bits to the left */\n\t\t\tpsllw mm4, mm7   \t/* shift 4 WORDS of MM4 (N) bits to the left */\n\t\t\t/* ** Take abs value of the signed words ** */\n\t\t\tmovq mm5, mm3   \t/* copy mm3 into mm5 */\n\t\t\tmovq mm6, mm4   \t/* copy mm4 into mm6 */\n\t\t\tpsraw mm5, 15   \t/* fill mm5 words with word sign bit */\n\t\t\tpsraw mm6, 15   \t/* fill mm6 words with word sign bit */\n\t\t\tpxor mm3, mm5   \t/* take 1's compliment of only neg words */\n\t\t\tpxor mm4, mm6   \t/* take 1's compliment of only neg words */\n\t\t\tpsubsw mm3, mm5   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\tpsubsw mm4, mm6   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\tpackuswb mm3, mm4   \t/* pack words back into bytes with saturation */\n\t\t\tmovq [edi], mm3   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz            L10281    \t/* check loop termination, proceed if required */\nL10282:\n\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 mm0 = _m_from_int(0);\t\t\t\t/* zero mm0 register */\n\tint i;\n\tif (N <= 7) {\t\t\t\t\t\t/* if (N <= 7) execute more efficient code */\n\t\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t\t__m64 mm3, mm4;\n\t\t\tmm3 = _m_punpcklbw(*mSrc1, mm0);\t/* unpack low  bytes of Src1 into words */\n\t\t\tmm4 = _m_punpckhbw(*mSrc1, mm0);\t/* unpack high bytes of Src1 into words */\n\t\t\tmm3 = _m_psllwi(mm3, N);\t\t/* shift 4 WORDS of MM3 (N) bits to the left */\n\t\t\tmm4 = _m_psllwi(mm4, N);\t\t/* shift 4 WORDS of MM4 (N) bits to the left */\n\t\t\t*mDest = _m_packuswb(mm3, mm4);\t\t/* pack words back into bytes with saturation */\n\t\t\tmSrc1++;\n\t\t\tmDest++;\n\t\t}\n\t} else {\n\t\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t\t__m64 mm3, mm4, mm5, mm6;\n\t\t\tmm3 = _m_punpcklbw(*mSrc1, mm0);\t/* unpack low  bytes of Src1 into words */\n\t\t\tmm4 = _m_punpckhbw(*mSrc1, mm0);\t/* unpack high bytes of Src1 into words */\n\t\t\tmm3 = _m_psllwi(mm3, N);\t\t/* shift 4 WORDS of MM3 (N) bits to the left */\n\t\t\tmm4 = _m_psllwi(mm4, N);\t\t/* shift 4 WORDS of MM4 (N) bits to the left */\n\t\t\t/* Take abs value of the signed words */\n\t\t\tmm5 = _m_psrawi(mm3, 15);\t\t/* fill mm5 words with word sign bit */\n\t\t\tmm6 = _m_psrawi(mm4, 15);\t\t/* fill mm6 words with word sign bit */\n\t\t\tmm3 = _m_pxor(mm3, mm5);\t\t/* take 1's compliment of only neg. words */\n\t\t\tmm4 = _m_pxor(mm4, mm6);\t\t/* take 1's compliment of only neg. words */\n\t\t\tmm3 = _m_psubsw(mm3, mm5);\t\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\tmm4 = _m_psubsw(mm4, mm6);\t\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\t*mDest = _m_packuswb(mm3, mm4);\t\t/* pack words back into bytes with saturation */\n\t\t\tmSrc1++;\n\t\t\tmDest++;\n\t\t}\n\t}\n\t_m_empty();\t\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter ShiftLeft: D = saturation255(S << N)\n\n\\param Src1 Pointer to the start of the source byte array (S1).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param N Number of bit-positions to shift (N). Valid range is 0 to 8.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterShiftLeft(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char N)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1, *curdest;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif (N > 8) {\n\t\treturn (-1);\n\t}\n\n\t/* Special case: N==0 */\n\tif (N == 0) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\tSDL_imageFilterShiftLeftMMX(Src1, Dest, length, N);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\tresult = (int) *cursrc1 << N;\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdest = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief MMX BinarizeUsingThreshold: D = (S >= T) ? 255:0\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param T The threshold boundary (inclusive).\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterBinarizeUsingThresholdMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char T)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\t/* ** Duplicate T in 8 bytes of MM3 ** */\n\t\t\tpcmpeqb mm1, mm1   \t/* generate all 1's in mm1 */\n\t\t\tpcmpeqb mm2, mm2   \t/* generate all 1's in mm2 */\n\t\t\tmov al, T   \t/* load T into AL */\n\t\t\tmov ah, al   \t/* copy AL into AH */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm3, eax   \t/* copy EAX into MM3 */\n\t\t\tmovd mm4, eax   \t/* copy EAX into MM4 */\n\t\t\tpunpckldq mm3, mm4   \t/* fill higher bytes of MM3 with T */\n\t\t\tpsubusb mm2, mm3   \t/* store 0xFF - T in MM2 */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL1029:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from SrcDest into MM0 */\n\t\tpaddusb mm0, mm2   \t/* MM0=SrcDest+(0xFF-T) (add 8 bytes with saturation) */\n\t\t\tpcmpeqb mm0, mm1   \t/* binarize 255:0, comparing to 255 */\n\t\t\tmovq [edi], mm0   \t/* store result in SrcDest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L1029    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t/* Duplicate T in 8 bytes of MM3 */\n\t__m64 mm1 = _m_pcmpeqb(mm1, mm1);\t\t\t/* generate all 1's in mm1 */\n\t__m64 mm2 = _m_pcmpeqb(mm2, mm2);\t\t\t/* generate all 1's in mm1 */\n\tint i;\n\tmemset(&i, T, 4);\n\t__m64 mm3 = _m_from_int(i);\n\t__m64 mm4 = _m_from_int(i);\n\tmm3 = _m_punpckldq(mm3, mm4);\t\t\t/* fill higher bytes of MM3 with T */\n\tmm2 = _m_psubusb(mm2, mm3);\t\t\t/* store 0xFF - T in MM2 */\n        //__m64 mm3 = _m_from_int64(lli); // x86_64 only\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm0 = _m_paddusb(*mSrc1, mm2);\t/* Src1+(0xFF-T) (add 8 bytes with saturation) */\n\t\t*mDest = _m_pcmpeqb(mm0, mm1);\t\t/* binarize 255:0, comparing to 255 */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using BinarizeUsingThreshold: D = (S >= T) ? 255:0\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param T The threshold boundary (inclusive).\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterBinarizeUsingThreshold(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char T)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1;\n\tunsigned char *curdest;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\t/* Special case: T==0 */\n\tif (T == 0) {\n\t\tmemset(Dest, 255, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\tSDL_imageFilterBinarizeUsingThresholdMMX(Src1, Dest, length, T);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\t*curdest = (unsigned char)(((unsigned char)*cursrc1 >= T) ? 255 : 0);\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using ClipToRange: D = (S >= Tmin) & (S <= Tmax) S:Tmin | Tmax\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param Tmin Lower (inclusive) boundary of the clipping range.\n\\param Tmax Upper (inclusive) boundary of the clipping range.\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterClipToRangeMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, unsigned char Tmin,\n\t\t\t\t\t\t\t\t  unsigned char Tmax)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tpcmpeqb mm1, mm1   \t/* generate all 1's in mm1 */\n\t\t\t/* ** Duplicate Tmax in 8 bytes of MM3 ** */\n\t\t\tmov al, Tmax   \t/* load Tmax into AL */\n\t\t\tmov ah, al   \t/* copy AL into AH */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm3, eax   \t/* copy EAX into MM3 */\n\t\t\tmovd mm4, eax   \t/* copy EAX into MM4 */\n\t\t\tpunpckldq mm3, mm4   \t/* fill higher bytes of MM3 with Tmax */\n\t\t\tpsubusb mm1, mm3   \t/* store 0xFF - Tmax in MM1 */\n\t\t\t/* ** Duplicate Tmin in 8 bytes of MM5 ** */\n\t\t\tmov al, Tmin   \t/* load Tmin into AL */\n\t\t\tmov ah, al   \t/* copy AL into AH */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm5, eax   \t/* copy EAX into MM5 */\n\t\t\tmovd mm4, eax   \t/* copy EAX into MM4 */\n\t\t\tpunpckldq mm5, mm4   \t/* fill higher bytes of MM5 with Tmin */\n\t\t\tmovq mm7, mm5   \t/* copy MM5 into MM7 */\n\t\t\tpaddusb mm7, mm1   \t/* store 0xFF - Tmax + Tmin in MM7 */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL1030:\n\t\tmovq mm0, [eax]   \t/* load 8 bytes from Src1 into MM0 */\n\t\tpaddusb mm0, mm1   \t/* MM0=SrcDest+(0xFF-Tmax) */\n\t\t\tpsubusb mm0, mm7   \t/* MM0=MM0-(0xFF-Tmax+Tmin) */\n\t\t\tpaddusb mm0, mm5   \t/* MM0=MM0+Tmin */\n\t\t\tmovq [edi], mm0   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L1030    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 mm1 = _m_pcmpeqb(mm1, mm1);\t/* generate all 1's in mm1 */\n\tint i;\n\t/* Duplicate Tmax in 8 bytes of MM3 */\n\t__m64 mm3, mm4;\n\tmemset(&i, Tmax, 4);\n\tmm3 = _m_from_int(i);\n\tmm4 = _m_from_int(i);\n\tmm3 = _m_punpckldq(mm3, mm4);\t\t/* fill higher bytes of MM3 with Tmax */\n\tmm1 = _m_psubusb(mm1, mm3);\t\t/* store 0xFF - Tmax in MM1 */\n        //__m64 mm3 = _m_from_int64(lli); // x86_64 only\n\t/* Duplicate Tmax in 8 bytes of MM3 */\n\t__m64 mm5, mm7;\n\tmemset(&i, Tmin, 4);\n\tmm5 = _m_from_int(i);\n\tmm4 = _m_from_int(i);\n\tmm5 = _m_punpckldq(mm5, mm4);\t\t/* fill higher bytes of MM5 with Tmin */\n\tmm7 = _m_paddusb(mm5, mm1);\t/* store 0xFF - Tmax + Tmin in MM7 */\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm0;\n\t\tmm0 = _m_paddusb(*mSrc1, mm1);\t/* MM0=Src1+(0xFF-Tmax) */\n\t\tmm0 = _m_psubusb(mm0, mm7);\t/* MM0=MM0-(0xFF-Tmax+Tmin) */\n\t\t*mDest = _m_paddusb(mm0, mm5);\t/* MM0+Tmin */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using ClipToRange: D = (S >= Tmin) & (S <= Tmax) S:Tmin | Tmax\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param Tmin Lower (inclusive) boundary of the clipping range.\n\\param Tmax Upper (inclusive) boundary of the clipping range.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterClipToRange(unsigned char *Src1, unsigned char *Dest, unsigned int length, unsigned char Tmin,\n\t\t\t\t\t\t\t   unsigned char Tmax)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc1;\n\tunsigned char *curdest;\n\n\t/* Validate input parameters */\n\tif ((Src1 == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\t/* Special case: Tmin==0 && Tmax = 255 */\n\tif ((Tmin == 0) && (Tmax == 25)) {\n\t\tmemcpy(Src1, Dest, length);\n\t\treturn (0); \n\t}\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\tSDL_imageFilterClipToRangeMMX(Src1, Dest, length, Tmin, Tmax);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc1 = &Src1[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc1 = Src1;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tfor (i = istart; i < length; i++) {\n\t\tif (*cursrc1 < Tmin) {\n\t\t\t*curdest = Tmin;\n\t\t} else if (*cursrc1 > Tmax) {\n\t\t\t*curdest = Tmax;\n\t\t} else {\n\t\t\t*curdest = *cursrc1;\n\t\t}\n\t\t/* Advance pointers */\n\t\tcursrc1++;\n\t\tcurdest++;\n\t}\n\n\treturn (0);\n}\n\n/*!\n\\brief Internal MMX Filter using NormalizeLinear: D = saturation255((Nmax - Nmin)/(Cmax - Cmin)*(S - Cmin) + Nmin)\n\n\\param Src1 Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param SrcLength The number of bytes in the source array.\n\\param Cmin Normalization constant (Cmin).\n\\param Cmax Normalization constant (Cmax).\n\\param Nmin Normalization constant (Nmin).\n\\param Nmax Normalization constant (Nmax).\n\n\\return Returns 0 for success or -1 for error.\n*/\nstatic int SDL_imageFilterNormalizeLinearMMX(unsigned char *Src1, unsigned char *Dest, unsigned int SrcLength, int Cmin, int Cmax,\n\t\t\t\t\t\t\t\t\t  int Nmin, int Nmax)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\n\t\tpusha\n\t\t\tmov ax, WORD PTR Nmax   \t/* load Nmax in AX */\n\t\t\tmov bx, WORD PTR Cmax   \t/* load Cmax in BX */\n\t\t\tsub ax, WORD PTR Nmin   \t/* AX = Nmax - Nmin */\n\t\t\tsub bx, WORD PTR Cmin   \t/* BX = Cmax - Cmin */\n\t\t\tjz             L10311    \t/* check division by zero */\n\t\t\txor dx, dx   \t/* prepare for division, zero DX */\n\t\t\tdiv               bx    \t/* AX = AX/BX */\n\t\t\tjmp            L10312\nL10311:\n\t\tmov ax, 255   \t/* if div by zero, assume result max byte value */\nL10312:                  \t/* ** Duplicate AX in 4 words of MM0 ** */\n\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm0, eax   \t/* copy EAX into MM0 */\n\t\t\tmovd mm1, eax   \t/* copy EAX into MM1 */\n\t\t\tpunpckldq mm0, mm1   \t/* fill higher words of MM0 with AX */\n\t\t\t/* ** Duplicate Cmin in 4 words of MM1 ** */\n\t\t\tmov ax, WORD PTR Cmin   \t/* load Cmin into AX */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm1, eax   \t/* copy EAX into MM1 */\n\t\t\tmovd mm2, eax   \t/* copy EAX into MM2 */\n\t\t\tpunpckldq mm1, mm2   \t/* fill higher words of MM1 with Cmin */\n\t\t\t/* ** Duplicate Nmin in 4 words of MM2 ** */\n\t\t\tmov ax, WORD PTR Nmin   \t/* load Nmin into AX */\n\t\t\tmov bx, ax   \t/* copy AX into BX */\n\t\t\tshl eax, 16   \t/* shift 2 bytes of EAX left */\n\t\t\tmov ax, bx   \t/* copy BX into AX */\n\t\t\tmovd mm2, eax   \t/* copy EAX into MM2 */\n\t\t\tmovd mm3, eax   \t/* copy EAX into MM3 */\n\t\t\tpunpckldq mm2, mm3   \t/* fill higher words of MM2 with Nmin */\n\t\t\tpxor mm7, mm7   \t/* zero MM7 register */\n\t\t\tmov eax, Src1   \t/* load Src1 address into eax */\n\t\t\tmov edi, Dest   \t/* load Dest address into edi */\n\t\t\tmov ecx, SrcLength   \t/* load loop counter (SIZE) into ecx */\n\t\t\tshr ecx, 3   \t/* counter/8 (MMX loads 8 bytes at a time) */\n\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL1031:\n\t\tmovq mm3, [eax]   \t/* load 8 bytes from Src1 into MM3 */\n\t\tmovq mm4, mm3   \t/* copy MM3 into MM4  */\n\t\t\tpunpcklbw mm3, mm7   \t/* unpack low  bytes of SrcDest into words */\n\t\t\tpunpckhbw mm4, mm7   \t/* unpack high bytes of SrcDest into words */\n\t\t\tpsubusb mm3, mm1   \t/* S-Cmin, low  bytes */\n\t\t\tpsubusb mm4, mm1   \t/* S-Cmin, high bytes */\n\t\t\tpmullw mm3, mm0   \t/* MM0*(S-Cmin), low  bytes */\n\t\t\tpmullw mm4, mm0   \t/* MM0*(S-Cmin), high bytes */\n\t\t\tpaddusb mm3, mm2   \t/* MM0*(S-Cmin)+Nmin, low  bytes */\n\t\t\tpaddusb mm4, mm2   \t/* MM0*(S-Cmin)+Nmin, high bytes */\n\t\t\t/* ** Take abs value of the signed words ** */\n\t\t\tmovq mm5, mm3   \t/* copy mm3 into mm5 */\n\t\t\tmovq mm6, mm4   \t/* copy mm4 into mm6 */\n\t\t\tpsraw mm5, 15   \t/* fill mm5 words with word sign bit */\n\t\t\tpsraw mm6, 15   \t/* fill mm6 words with word sign bit */\n\t\t\tpxor mm3, mm5   \t/* take 1's compliment of only neg words */\n\t\t\tpxor mm4, mm6   \t/* take 1's compliment of only neg words */\n\t\t\tpsubsw mm3, mm5   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\tpsubsw mm4, mm6   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\tpackuswb mm3, mm4   \t/* pack words back into bytes with saturation */\n\t\t\tmovq [edi], mm3   \t/* store result in Dest */\n\t\t\tadd eax, 8   \t/* increase Src1 register pointer by 8 */\n\t\t\tadd edi, 8   \t/* increase Dest register pointer by 8 */\n\t\t\tdec              ecx    \t/* decrease loop counter */\n\t\t\tjnz             L1031    \t/* check loop termination, proceed if required */\n\t\t\temms                      \t/* exit MMX state */\n\t\t\tpopa\n\t}\n#else\n\t/* i386 and x86_64 */\n\t__m64 *mSrc1 = (__m64*)Src1;\n\t__m64 *mDest = (__m64*)Dest;\n\t__m64 mm0, mm1, mm2, mm3;\n\n\tint i;\n\t/* Duplicate (Nmax-Nmin)/(Cmax-Cmin) in 4 words of MM0 */\n\tunsigned short a = Nmax - Nmin;\n\tunsigned short b = Cmax - Cmin;\n\tif (b == 0) {\n\t    a = 255;\n\t} else {\n\t    a /= b;\n\t}\n\ti = (a<<16)|a;\n\tmm0 = _m_from_int(i);\n\tmm1 = _m_from_int(i);\n\tmm0 = _m_punpckldq(mm0, mm1);\t\t\t/* fill higher words of MM0 with AX */\n\t/* Duplicate Cmin in 4 words of MM1 */\n\ti = (Cmin<<16)|(short)Cmin;\n\tmm1 = _m_from_int(i);\n\tmm2 = _m_from_int(i);\n\tmm1 = _m_punpckldq(mm1, mm2);\t\t\t/* fill higher words of MM1 with Cmin */\n\t/* Duplicate Nmin in 4 words of MM2 */\n\ti = (Nmin<<16)|(short)Nmin;\n\tmm2 = _m_from_int(i);\n\tmm3 = _m_from_int(i);\n\tmm2 = _m_punpckldq(mm2, mm3);\t\t\t/* fill higher words of MM2 with Nmin */\n\t__m64 mm7 = _m_from_int(0);\t\t\t/* zero mm0 register */\n\tfor (i = 0; i < SrcLength/8; i++) {\n\t\t__m64 mm3, mm4, mm5, mm6;\n\t\tmm3 = _m_punpcklbw(*mSrc1, mm7);\t/* unpack low  bytes of Src1 into words */\n\t\tmm4 = _m_punpckhbw(*mSrc1, mm7);\t/* unpack high bytes of Src1 into words */\n\t\tmm3 = _m_psubusb(mm3, mm1);\t\t/* S-Cmin, low\tbytes */\n\t\tmm4 = _m_psubusb(mm4, mm1);\t\t/* S-Cmin, high bytes */\n\t\tmm3 = _m_pmullw(mm3, mm0);\t\t/* MM0*(S-Cmin), low  bytes */\n\t\tmm4 = _m_pmullw(mm4, mm0);\t\t/* MM0*(S-Cmin), high bytes */\n\t\tmm3 = _m_paddusb(mm3, mm2);\t\t/* MM0*(S-Cmin)+Nmin, low  bytes */\n\t\tmm4 = _m_paddusb(mm4, mm2);\t\t/* MM0*(S-Cmin)+Nmin, high bytes */\n\t\t/* Take abs value of the signed words */\n\t\tmm5 = _m_psrawi(mm3, 15);\t\t/* fill mm5 words with word sign bit */\n\t\tmm6 = _m_psrawi(mm4, 15);\t\t/* fill mm6 words with word sign bit */\n\t\tmm3 = _m_pxor(mm3, mm5);\t\t/* take 1's compliment of only neg. words */\n\t\tmm4 = _m_pxor(mm4, mm6);\t\t/* take 1's compliment of only neg. words */\n\t\tmm3 = _m_psubsw(mm3, mm5);\t\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\tmm4 = _m_psubsw(mm4, mm6);\t\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t*mDest = _m_packuswb(mm3, mm4);\t\t/* pack words back into bytes with saturation */\n\t\tmSrc1++;\n\t\tmDest++;\n\t}\n\t_m_empty();\t\t\t\t\t/* clean MMX state */\n#endif\n\treturn (0);\n#else\n\treturn (-1);\n#endif\n}\n\n/*!\n\\brief Filter using NormalizeLinear: D = saturation255((Nmax - Nmin)/(Cmax - Cmin)*(S - Cmin) + Nmin)\n\n\\param Src Pointer to the start of the source byte array (S).\n\\param Dest Pointer to the start of the destination byte array (D).\n\\param length The number of bytes in the source array.\n\\param Cmin Normalization constant.\n\\param Cmax Normalization constant.\n\\param Nmin Normalization constant.\n\\param Nmax Normalization constant.\n\n\\return Returns 0 for success or -1 for error.\n*/\nint SDL_imageFilterNormalizeLinear(unsigned char *Src, unsigned char *Dest, unsigned int length, int Cmin, int Cmax, int Nmin,\n\t\t\t\t\t\t\t\t   int Nmax)\n{\n\tunsigned int i, istart;\n\tunsigned char *cursrc;\n\tunsigned char *curdest;\n\tint dN, dC, factor;\n\tint result;\n\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif (length == 0)\n\t\treturn(0);\n\n\tif ((SDL_imageFilterMMXdetect()) && (length > 7)) {\n\n\t\tSDL_imageFilterNormalizeLinearMMX(Src, Dest, length, Cmin, Cmax, Nmin, Nmax);\n\n\t\t/* Check for unaligned bytes */\n\t\tif ((length & 7) > 0) {\n\t\t\t/* Setup to process unaligned bytes */\n\t\t\tistart = length & 0xfffffff8;\n\t\t\tcursrc = &Src[istart];\n\t\t\tcurdest = &Dest[istart];\n\t\t} else {\n\t\t\t/* No unaligned bytes - we are done */\n\t\t\treturn (0);\n\t\t}\n\t} else {\n\t\t/* Setup to process whole image */\n\t\tistart = 0;\n\t\tcursrc = Src;\n\t\tcurdest = Dest;\n\t}\n\n\t/* C routine to process image */\n\tdC = Cmax - Cmin;\n\tif (dC == 0)\n\t\treturn (0);\n\tdN = Nmax - Nmin;\n\tfactor = dN / dC;\n\tfor (i = istart; i < length; i++) {\n\t\tresult = factor * ((int) (*cursrc) - Cmin) + Nmin;\n\t\tif (result > 255)\n\t\t\tresult = 255;\n\t\t*curdest = (unsigned char) result;\n\t\t/* Advance pointers */\n\t\tcursrc++;\n\t\tcurdest++;\n\t}\n\n\treturn (0);\n}\n\n/* ------------------------------------------------------------------------------------ */\n\n/*!\n\\brief Filter using ConvolveKernel3x3Divide: Dij = saturation0and255( ... ) \n\n\\param Src The source 2D byte array to convolve. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >2.\n\\param columns Number of columns in source/destination array. Must be >2.\n\\param Kernel The 2D convolution kernel of size 3x3.\n\\param Divisor The divisor of the convolution sum. Must be >0.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterConvolveKernel3x3Divide(unsigned char *Src, unsigned char *Dest, int rows, int columns,\n\t\t\t\t\t\t\t\t\t\t   signed short *Kernel, unsigned char Divisor)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL) || (Kernel == NULL))\n\t\treturn(-1);\n\n\tif ((columns < 3) || (rows < 3) || (Divisor == 0))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\txor ebx, ebx   \t/* zero EBX */\n\t\t\t\tmov bl, Divisor   \t/* load Divisor into BL */\n\t\t\t\tmov edx, Kernel   \t/* load Kernel address into EDX */\n\t\t\t\tmovq mm5, [edx]   \t/* MM5 = {0,K2,K1,K0} */\n\t\t\tadd edx, 8   \t/* second row              |K0 K1 K2 0| */\n\t\t\t\tmovq mm6, [edx]   \t/* MM6 = {0,K5,K4,K3}  K = |K3 K4 K5 0| */\n\t\t\tadd edx, 8   \t/* third row               |K6 K7 K8 0| */\n\t\t\t\tmovq mm7, [edx]   \t/* MM7 = {0,K8,K7,K6} */\n\t\t\t/* ---, */\n\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\tmov esi, Src   \t/* ESI = Src row 0 address */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, eax   \t/* EDI = EDI + columns */\n\t\t\t\tinc              edi    \t/* 1 byte offset from the left edge */\n\t\t\t\tmov edx, rows   \t/* initialize ROWS counter */\n\t\t\t\tsub edx, 2   \t/* do not use first and last row */\n\t\t\t\t/* ---, */\nL10320:\n\t\t\tmov ecx, eax   \t/* initialize COLUMS counter */\n\t\t\t\tsub ecx, 2   \t/* do not use first and last column */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10322:\n\t\t\t/* ---, */\n\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the image first row */\n\t\t\tadd esi, eax   \t/* move one row below */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes of the image second row */\n\t\t\tadd esi, eax   \t/* move one row below */\n\t\t\t\tmovq mm3, [esi]   \t/* load 8 bytes of the image third row */\n\t\t\tpunpcklbw mm1, mm0   \t/* unpack first 4 bytes into words */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack first 4 bytes into words */\n\t\t\t\tpunpcklbw mm3, mm0   \t/* unpack first 4 bytes into words */\n\t\t\t\tpmullw mm1, mm5   \t/* multiply words first row  image*Kernel */\n\t\t\t\tpmullw mm2, mm6   \t/* multiply words second row image*Kernel */\n\t\t\t\tpmullw mm3, mm7   \t/* multiply words third row  image*Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the first and second rows */\n\t\t\t\tpaddsw mm1, mm3   \t/* add 4 words of the third row and result */\n\t\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tpsrlq mm1, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 2 left and 2 right result words */\n\t\t\t\tmovq mm3, mm1   \t/* copy MM1 into MM3 */\n\t\t\t\tpsrlq mm1, 16   \t/* shift 1 left word to the right */\n\t\t\t\tpaddsw mm1, mm3   \t/* add 1 left and 1 right result words */\n\t\t\t\t/* --, */\n\t\t\t\tmovd mm2, eax   \t/* save EAX in MM2 */\n\t\t\t\tmovd mm3, edx   \t/* save EDX in MM3 */\n\t\t\t\tmovd eax, mm1   \t/* copy MM1 into EAX */\n\t\t\t\tpsraw mm1, 15   \t/* spread sign bit of the result */\n\t\t\t\tmovd edx, mm1   \t/* fill EDX with a sign bit */\n\t\t\t\tidiv bx    \t/* IDIV - VERY EXPENSIVE */\n\t\t\t\tmovd mm1, eax   \t/* move result of division into MM1 */\n\t\t\t\tpackuswb mm1, mm0   \t/* pack division result with saturation */\n\t\t\t\tmovd eax, mm1   \t/* copy saturated result into EAX */\n\t\t\t\tmov [edi], al   \t/* copy a byte result into Dest */\n\t\t\t\tmovd edx, mm3   \t/* restore saved EDX */\n\t\t\t\tmovd eax, mm2   \t/* restore saved EAX */\n\t\t\t\t/* --, */\n\t\t\t\tsub esi, eax   \t/* move two rows up */\n\t\t\t\tsub esi, eax   \t/* */\n\t\t\t\tinc              esi    \t/* move Src  pointer to the next pixel */\n\t\t\t\tinc              edi    \t/* move Dest pointer to the next pixel */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10322    \t/* check loop termination, proceed if required */\n\t\t\t\tadd esi, 2   \t/* move to the next row in Src */\n\t\t\t\tadd edi, 2   \t/* move to the next row in Dest */\n\t\t\t\tdec              edx    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10320    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"xor       %%ebx, %%ebx \\n\\t\"\t/* zero EBX */\n\t\t\t\"mov           %5, %%bl \\n\\t\"\t/* load Divisor into BL */\n\t\t\t\"mov          %4, %%edx \\n\\t\"\t/* load Kernel address into EDX */\n\t\t\t\"movq    (%%edx), %%mm5 \\n\\t\"\t/* MM5 = {0,K2,K1,K0} */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* second row              |K0 K1 K2 0| */\n\t\t\t\"movq    (%%edx), %%mm6 \\n\\t\"\t/* MM6 = {0,K5,K4,K3}  K = |K3 K4 K5 0| */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* third row               |K6 K7 K8 0| */\n\t\t\t\"movq    (%%edx), %%mm7 \\n\\t\"\t/* MM7 = {0,K8,K7,K6} */\n\t\t\t/* --- */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* ESI = Src row 0 address */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* EDI = EDI + columns */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* 1 byte offset from the left edge */\n\t\t\t\"mov          %2, %%edx \\n\\t\"\t/* initialize ROWS counter */\n\t\t\t\"sub          $2, %%edx \\n\\t\"\t/* do not use first and last row */\n\t\t\t/* --- */\n\t\t\t\".L10320:               \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMS counter */\n\t\t\t\"sub          $2, %%ecx \\n\\t\"\t/* do not use first and last column */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10322:               \\n\\t\"\n\t\t\t/* --- */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the image first row */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move one row below */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes of the image second row */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move one row below */\n\t\t\t\"movq    (%%esi), %%mm3 \\n\\t\"\t/* load 8 bytes of the image third row */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first 4 bytes into words */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack first 4 bytes into words */\n\t\t\t\"punpcklbw %%mm0, %%mm3 \\n\\t\"\t/* unpack first 4 bytes into words */\n\t\t\t\"pmullw    %%mm5, %%mm1 \\n\\t\"\t/* multiply words first row  image*Kernel */\n\t\t\t\"pmullw    %%mm6, %%mm2 \\n\\t\"\t/* multiply words second row image*Kernel */\n\t\t\t\"pmullw    %%mm7, %%mm3 \\n\\t\"\t/* multiply words third row  image*Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the first and second rows */\n\t\t\t\"paddsw    %%mm3, %%mm1 \\n\\t\"\t/* add 4 words of the third row and result */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"psrlq       $32, %%mm1 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 2 left and 2 right result words */\n\t\t\t\"movq      %%mm1, %%mm3 \\n\\t\"\t/* copy MM1 into MM3 */\n\t\t\t\"psrlq       $16, %%mm1 \\n\\t\"\t/* shift 1 left word to the right */\n\t\t\t\"paddsw    %%mm3, %%mm1 \\n\\t\"\t/* add 1 left and 1 right result words */\n\t\t\t/* -- */\n\t\t\t\"movd      %%eax, %%mm2 \\n\\t\"\t/* save EAX in MM2 */\n\t\t\t\"movd      %%edx, %%mm3 \\n\\t\"\t/* save EDX in MM3 */\n\t\t\t\"movd      %%mm1, %%eax \\n\\t\"\t/* copy MM1 into EAX */\n\t\t\t\"psraw       $15, %%mm1 \\n\\t\"\t/* spread sign bit of the result */\n\t\t\t\"movd      %%mm1, %%edx \\n\\t\"\t/* fill EDX with a sign bit */\n\t\t\t\"idivw             %%bx \\n\\t\"\t/* IDIV - VERY EXPENSIVE */\n\t\t\t\"movd      %%eax, %%mm1 \\n\\t\"\t/* move result of division into MM1 */\n\t\t\t\"packuswb  %%mm0, %%mm1 \\n\\t\"\t/* pack division result with saturation */\n\t\t\t\"movd      %%mm1, %%eax \\n\\t\"\t/* copy saturated result into EAX */\n\t\t\t\"mov      %%al, (%%edi) \\n\\t\"\t/* copy a byte result into Dest */\n\t\t\t\"movd      %%mm3, %%edx \\n\\t\"\t/* restore saved EDX */\n\t\t\t\"movd      %%mm2, %%eax \\n\\t\"\t/* restore saved EAX */\n\t\t\t/* -- */\n\t\t\t\"sub       %%eax, %%esi \\n\\t\"\t/* move two rows up */\n\t\t\t\"sub       %%eax, %%esi \\n\\t\"\t/* */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move Src  pointer to the next pixel */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* move Dest pointer to the next pixel */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10322 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"add          $2, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add          $2, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"dec              %%edx \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10320 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns),\t\t/* %3 */\n\t\t\t\"m\"(Kernel),\t\t/* %4 */\n\t\t\t\"m\"(Divisor)\t\t/* %5 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Filter using ConvolveKernel5x5Divide: Dij = saturation0and255( ... ) \n\n\\param Src The source 2D byte array to convolve. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >4.\n\\param columns Number of columns in source/destination array. Must be >4.\n\\param Kernel The 2D convolution kernel of size 5x5.\n\\param Divisor The divisor of the convolution sum. Must be >0.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterConvolveKernel5x5Divide(unsigned char *Src, unsigned char *Dest, int rows, int columns,\n\t\t\t\t\t\t\t\t\t\t   signed short *Kernel, unsigned char Divisor)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL) || (Kernel == NULL))\n\t\treturn(-1);\n\n\tif ((columns < 5) || (rows < 5) || (Divisor == 0))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\txor ebx, ebx   \t/* zero EBX */\n\t\t\t\tmov bl, Divisor   \t/* load Divisor into BL */\n\t\t\t\tmovd mm5, ebx   \t/* copy Divisor into MM5 */\n\t\t\t\tmov edx, Kernel   \t/* load Kernel address into EDX */\n\t\t\t\tmov esi, Src   \t/* load Src  address to ESI */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, 2   \t/* 2 column offset from the left edge */\n\t\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\tshl eax, 1   \t/* EAX = columns * 2 */\n\t\t\t\tadd edi, eax   \t/* 2 row offset from the top edge */\n\t\t\t\tshr eax, 1   \t/* EAX = columns */\n\t\t\t\tmov ebx, rows   \t/* initialize ROWS counter */\n\t\t\t\tsub ebx, 4   \t/* do not use first 2 and last 2 rows */\n\t\t\t\t/* ---, */\nL10330:\n\t\t\tmov ecx, eax   \t/* initialize COLUMNS counter */\n\t\t\t\tsub ecx, 4   \t/* do not use first 2 and last 2 columns */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10332:\n\t\t\tpxor mm7, mm7   \t/* zero MM7 (accumulator) */\n\t\t\t\tmovd mm6, esi   \t/* save ESI in MM6 */\n\t\t\t\t/* --- 1 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 2 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 3 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 4 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 5 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* ---, */\n\t\t\t\tmovq mm3, mm7   \t/* copy MM7 into MM3 */\n\t\t\t\tpsrlq mm7, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpaddsw mm7, mm3   \t/* add 2 left and 2 right result words */\n\t\t\t\tmovq mm2, mm7   \t/* copy MM7 into MM2 */\n\t\t\t\tpsrlq mm7, 16   \t/* shift 1 left word to the right */\n\t\t\t\tpaddsw mm7, mm2   \t/* add 1 left and 1 right result words */\n\t\t\t\t/* ---, */\n\t\t\t\tmovd mm1, eax   \t/* save EDX in MM1 */\n\t\t\t\tmovd mm2, ebx   \t/* save EDX in MM2 */\n\t\t\t\tmovd mm3, edx   \t/* save EDX in MM3 */\n\t\t\t\tmovd eax, mm7   \t/* load summation result into EAX */\n\t\t\t\tpsraw mm7, 15   \t/* spread sign bit of the result */\n\t\t\t\tmovd ebx, mm5   \t/* load Divisor into EBX */\n\t\t\t\tmovd edx, mm7   \t/* fill EDX with a sign bit */\n\t\t\t\tidiv bx    \t/* IDIV - VERY EXPENSIVE */\n\t\t\t\tmovd mm7, eax   \t/* move result of division into MM7 */\n\t\t\t\tpackuswb mm7, mm0   \t/* pack division result with saturation */\n\t\t\t\tmovd eax, mm7   \t/* copy saturated result into EAX */\n\t\t\t\tmov [edi], al   \t/* copy a byte result into Dest */\n\t\t\t\tmovd edx, mm3   \t/* restore saved EDX */\n\t\t\t\tmovd ebx, mm2   \t/* restore saved EBX */\n\t\t\t\tmovd eax, mm1   \t/* restore saved EAX */\n\t\t\t\t/* --, */\n\t\t\t\tmovd esi, mm6   \t/* move Src pointer to the top pixel */\n\t\t\t\tsub edx, 72   \t/* EDX = Kernel address */\n\t\t\t\tinc              esi    \t/* move Src  pointer to the next pixel */\n\t\t\t\tinc              edi    \t/* move Dest pointer to the next pixel */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10332    \t/* check loop termination, proceed if required */\n\t\t\t\tadd esi, 4   \t/* move to the next row in Src */\n\t\t\t\tadd edi, 4   \t/* move to the next row in Dest */\n\t\t\t\tdec              ebx    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10330    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"xor       %%ebx, %%ebx \\n\\t\"\t/* zero EBX */\n\t\t\t\"mov           %5, %%bl \\n\\t\"\t/* load Divisor into BL */\n\t\t\t\"movd      %%ebx, %%mm5 \\n\\t\"\t/* copy Divisor into MM5 */\n\t\t\t\"mov          %4, %%edx \\n\\t\"\t/* load Kernel address into EDX */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* load Src  address to ESI */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add          $2, %%edi \\n\\t\"\t/* 2 column offset from the left edge */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t\"shl          $1, %%eax \\n\\t\"\t/* EAX = columns * 2 */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* 2 row offset from the top edge */\n\t\t\t\"shr          $1, %%eax \\n\\t\"\t/* EAX = columns */\n\t\t\t\"mov          %2, %%ebx \\n\\t\"\t/* initialize ROWS counter */\n\t\t\t\"sub          $4, %%ebx \\n\\t\"\t/* do not use first 2 and last 2 rows */\n\t\t\t/* --- */\n\t\t\t\".L10330:               \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMNS counter */\n\t\t\t\"sub          $4, %%ecx \\n\\t\"\t/* do not use first 2 and last 2 columns */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10332:               \\n\\t\" \"pxor      %%mm7, %%mm7 \\n\\t\"\t/* zero MM7 (accumulator) */\n\t\t\t\"movd      %%esi, %%mm6 \\n\\t\"\t/* save ESI in MM6 */\n\t\t\t/* --- 1 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 2 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 3 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 4 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 5 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- */\n\t\t\t\"movq      %%mm7, %%mm3 \\n\\t\"\t/* copy MM7 into MM3 */\n\t\t\t\"psrlq       $32, %%mm7 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"paddsw    %%mm3, %%mm7 \\n\\t\"\t/* add 2 left and 2 right result words */\n\t\t\t\"movq      %%mm7, %%mm2 \\n\\t\"\t/* copy MM7 into MM2 */\n\t\t\t\"psrlq       $16, %%mm7 \\n\\t\"\t/* shift 1 left word to the right */\n\t\t\t\"paddsw    %%mm2, %%mm7 \\n\\t\"\t/* add 1 left and 1 right result words */\n\t\t\t/* --- */\n\t\t\t\"movd      %%eax, %%mm1 \\n\\t\"\t/* save EDX in MM1 */\n\t\t\t\"movd      %%ebx, %%mm2 \\n\\t\"\t/* save EDX in MM2 */\n\t\t\t\"movd      %%edx, %%mm3 \\n\\t\"\t/* save EDX in MM3 */\n\t\t\t\"movd      %%mm7, %%eax \\n\\t\"\t/* load summation result into EAX */\n\t\t\t\"psraw       $15, %%mm7 \\n\\t\"\t/* spread sign bit of the result */\n\t\t\t\"movd      %%mm5, %%ebx \\n\\t\"\t/* load Divisor into EBX */\n\t\t\t\"movd      %%mm7, %%edx \\n\\t\"\t/* fill EDX with a sign bit */\n\t\t\t\"idivw             %%bx \\n\\t\"\t/* IDIV - VERY EXPENSIVE */\n\t\t\t\"movd      %%eax, %%mm7 \\n\\t\"\t/* move result of division into MM7 */\n\t\t\t\"packuswb  %%mm0, %%mm7 \\n\\t\"\t/* pack division result with saturation */\n\t\t\t\"movd      %%mm7, %%eax \\n\\t\"\t/* copy saturated result into EAX */\n\t\t\t\"mov      %%al, (%%edi) \\n\\t\"\t/* copy a byte result into Dest */\n\t\t\t\"movd      %%mm3, %%edx \\n\\t\"\t/* restore saved EDX */\n\t\t\t\"movd      %%mm2, %%ebx \\n\\t\"\t/* restore saved EBX */\n\t\t\t\"movd      %%mm1, %%eax \\n\\t\"\t/* restore saved EAX */\n\t\t\t/* -- */\n\t\t\t\"movd      %%mm6, %%esi \\n\\t\"\t/* move Src pointer to the top pixel */\n\t\t\t\"sub         $72, %%edx \\n\\t\"\t/* EDX = Kernel address */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move Src  pointer to the next pixel */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* move Dest pointer to the next pixel */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10332 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"add          $4, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add          $4, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"dec              %%ebx \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10330 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns),\t\t/* %3 */\n\t\t\t\"m\"(Kernel),\t\t/* %4 */\n\t\t\t\"m\"(Divisor)\t\t/* %5 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Filter using ConvolveKernel7x7Divide: Dij = saturation0and255( ... ) \n\n\\param Src The source 2D byte array to convolve. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >6.\n\\param columns Number of columns in source/destination array. Must be >6.\n\\param Kernel The 2D convolution kernel of size 7x7.\n\\param Divisor The divisor of the convolution sum. Must be >0.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterConvolveKernel7x7Divide(unsigned char *Src, unsigned char *Dest, int rows, int columns,\n\t\t\t\t\t\t\t\t\t\t   signed short *Kernel, unsigned char Divisor)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL) || (Kernel == NULL))\n\t\treturn(-1);\n\n\tif ((columns < 7) || (rows < 7) || (Divisor == 0))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\txor ebx, ebx   \t/* zero EBX */\n\t\t\t\tmov bl, Divisor   \t/* load Divisor into BL */\n\t\t\t\tmovd mm5, ebx   \t/* copy Divisor into MM5 */\n\t\t\t\tmov edx, Kernel  \t/* load Kernel address into EDX */\n\t\t\t\tmov esi, Src   \t/* load Src  address to ESI */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, 3   \t/* 3 column offset from the left edge */\n\t\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\tadd edi, eax   \t/* 3 row offset from the top edge */\n\t\t\t\tadd edi, eax\n\t\t\t\tadd edi, eax\n\t\t\t\tmov ebx, rows   \t/* initialize ROWS counter */\n\t\t\t\tsub ebx, 6   \t/* do not use first 3 and last 3 rows */\n\t\t\t\t/* ---, */\nL10340:\n\t\t\tmov ecx, eax   \t/* initialize COLUMNS counter */\n\t\t\t\tsub ecx, 6   \t/* do not use first 3 and last 3 columns */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10342:\n\t\t\tpxor mm7, mm7   \t/* zero MM7 (accumulator) */\n\t\t\t\tmovd mm6, esi   \t/* save ESI in MM6 */\n\t\t\t\t/* --- 1 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 2 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 3 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 4 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 5 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 6 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* ---, */\n\t\t\t\tmovq mm3, mm7   \t/* copy MM7 into MM3 */\n\t\t\t\tpsrlq mm7, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpaddsw mm7, mm3   \t/* add 2 left and 2 right result words */\n\t\t\t\tmovq mm2, mm7   \t/* copy MM7 into MM2 */\n\t\t\t\tpsrlq mm7, 16   \t/* shift 1 left word to the right */\n\t\t\t\tpaddsw mm7, mm2   \t/* add 1 left and 1 right result words */\n\t\t\t\t/* ---, */\n\t\t\t\tmovd mm1, eax   \t/* save EDX in MM1 */\n\t\t\t\tmovd mm2, ebx   \t/* save EDX in MM2 */\n\t\t\t\tmovd mm3, edx   \t/* save EDX in MM3 */\n\t\t\t\tmovd eax, mm7   \t/* load summation result into EAX */\n\t\t\t\tpsraw mm7, 15   \t/* spread sign bit of the result */\n\t\t\t\tmovd ebx, mm5   \t/* load Divisor into EBX */\n\t\t\t\tmovd edx, mm7   \t/* fill EDX with a sign bit */\n\t\t\t\tidiv bx    \t/* IDIV - VERY EXPENSIVE */\n\t\t\t\tmovd mm7, eax   \t/* move result of division into MM7 */\n\t\t\t\tpackuswb mm7, mm0   \t/* pack division result with saturation */\n\t\t\t\tmovd eax, mm7   \t/* copy saturated result into EAX */\n\t\t\t\tmov [edi], al   \t/* copy a byte result into Dest */\n\t\t\t\tmovd edx, mm3   \t/* restore saved EDX */\n\t\t\t\tmovd ebx, mm2   \t/* restore saved EBX */\n\t\t\t\tmovd eax, mm1   \t/* restore saved EAX */\n\t\t\t\t/* --, */\n\t\t\t\tmovd esi, mm6   \t/* move Src pointer to the top pixel */\n\t\t\t\tsub edx, 104   \t/* EDX = Kernel address */\n\t\t\t\tinc              esi    \t/* move Src  pointer to the next pixel */\n\t\t\t\tinc              edi    \t/* move Dest pointer to the next pixel */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10342    \t/* check loop termination, proceed if required */\n\t\t\t\tadd esi, 6   \t/* move to the next row in Src */\n\t\t\t\tadd edi, 6   \t/* move to the next row in Dest */\n\t\t\t\tdec              ebx    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10340    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"xor       %%ebx, %%ebx \\n\\t\"\t/* zero EBX */\n\t\t\t\"mov           %5, %%bl \\n\\t\"\t/* load Divisor into BL */\n\t\t\t\"movd      %%ebx, %%mm5 \\n\\t\"\t/* copy Divisor into MM5 */\n\t\t\t\"mov          %4, %%edx \\n\\t\"\t/* load Kernel address into EDX */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* load Src  address to ESI */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add          $3, %%edi \\n\\t\"\t/* 3 column offset from the left edge */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* 3 row offset from the top edge */\n\t\t\t\"add       %%eax, %%edi \\n\\t\" \"add       %%eax, %%edi \\n\\t\" \"mov          %2, %%ebx \\n\\t\"\t/* initialize ROWS counter */\n\t\t\t\"sub          $6, %%ebx \\n\\t\"\t/* do not use first 3 and last 3 rows */\n\t\t\t/* --- */\n\t\t\t\".L10340:               \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMNS counter */\n\t\t\t\"sub          $6, %%ecx \\n\\t\"\t/* do not use first 3 and last 3 columns */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10342:               \\n\\t\" \"pxor      %%mm7, %%mm7 \\n\\t\"\t/* zero MM7 (accumulator) */\n\t\t\t\"movd      %%esi, %%mm6 \\n\\t\"\t/* save ESI in MM6 */\n\t\t\t/* --- 1 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 2 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 3 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 4 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 5 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 6 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- */\n\t\t\t\"movq      %%mm7, %%mm3 \\n\\t\"\t/* copy MM7 into MM3 */\n\t\t\t\"psrlq       $32, %%mm7 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"paddsw    %%mm3, %%mm7 \\n\\t\"\t/* add 2 left and 2 right result words */\n\t\t\t\"movq      %%mm7, %%mm2 \\n\\t\"\t/* copy MM7 into MM2 */\n\t\t\t\"psrlq       $16, %%mm7 \\n\\t\"\t/* shift 1 left word to the right */\n\t\t\t\"paddsw    %%mm2, %%mm7 \\n\\t\"\t/* add 1 left and 1 right result words */\n\t\t\t/* --- */\n\t\t\t\"movd      %%eax, %%mm1 \\n\\t\"\t/* save EDX in MM1 */\n\t\t\t\"movd      %%ebx, %%mm2 \\n\\t\"\t/* save EDX in MM2 */\n\t\t\t\"movd      %%edx, %%mm3 \\n\\t\"\t/* save EDX in MM3 */\n\t\t\t\"movd      %%mm7, %%eax \\n\\t\"\t/* load summation result into EAX */\n\t\t\t\"psraw       $15, %%mm7 \\n\\t\"\t/* spread sign bit of the result */\n\t\t\t\"movd      %%mm5, %%ebx \\n\\t\"\t/* load Divisor into EBX */\n\t\t\t\"movd      %%mm7, %%edx \\n\\t\"\t/* fill EDX with a sign bit */\n\t\t\t\"idivw             %%bx \\n\\t\"\t/* IDIV - VERY EXPENSIVE */\n\t\t\t\"movd      %%eax, %%mm7 \\n\\t\"\t/* move result of division into MM7 */\n\t\t\t\"packuswb  %%mm0, %%mm7 \\n\\t\"\t/* pack division result with saturation */\n\t\t\t\"movd      %%mm7, %%eax \\n\\t\"\t/* copy saturated result into EAX */\n\t\t\t\"mov      %%al, (%%edi) \\n\\t\"\t/* copy a byte result into Dest */\n\t\t\t\"movd      %%mm3, %%edx \\n\\t\"\t/* restore saved EDX */\n\t\t\t\"movd      %%mm2, %%ebx \\n\\t\"\t/* restore saved EBX */\n\t\t\t\"movd      %%mm1, %%eax \\n\\t\"\t/* restore saved EAX */\n\t\t\t/* -- */\n\t\t\t\"movd      %%mm6, %%esi \\n\\t\"\t/* move Src pointer to the top pixel */\n\t\t\t\"sub        $104, %%edx \\n\\t\"\t/* EDX = Kernel address */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move Src  pointer to the next pixel */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* move Dest pointer to the next pixel */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10342 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"add          $6, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add          $6, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"dec              %%ebx \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10340 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns),\t\t/* %3 */\n\t\t\t\"m\"(Kernel),\t\t/* %4 */\n\t\t\t\"m\"(Divisor)\t\t/* %5 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Filter using ConvolveKernel9x9Divide: Dij = saturation0and255( ... ) \n\n\\param Src The source 2D byte array to convolve. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >8.\n\\param columns Number of columns in source/destination array. Must be >8.\n\\param Kernel The 2D convolution kernel of size 9x9.\n\\param Divisor The divisor of the convolution sum. Must be >0.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterConvolveKernel9x9Divide(unsigned char *Src, unsigned char *Dest, int rows, int columns,\n\t\t\t\t\t\t\t\t\t\t   signed short *Kernel, unsigned char Divisor)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL) || (Kernel == NULL))\n\t\treturn(-1);\n\n\tif ((columns < 9) || (rows < 9) || (Divisor == 0))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\txor ebx, ebx   \t/* zero EBX */\n\t\t\t\tmov bl, Divisor   \t/* load Divisor into BL */\n\t\t\t\tmovd mm5, ebx   \t/* copy Divisor into MM5 */\n\t\t\t\tmov edx, Kernel   \t/* load Kernel address into EDX */\n\t\t\t\tmov esi, Src   \t/* load Src  address to ESI */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, 4   \t/* 4 column offset from the left edge */\n\t\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\tadd edi, eax   \t/* 4 row offset from the top edge */\n\t\t\t\tadd edi, eax\n\t\t\t\tadd edi, eax\n\t\t\t\tadd edi, eax\n\t\t\t\tmov ebx, rows   \t/* initialize ROWS counter */\n\t\t\t\tsub ebx, 8   \t/* do not use first 4 and last 4 rows */\n\t\t\t\t/* ---, */\nL10350:\n\t\t\tmov ecx, eax   \t/* initialize COLUMNS counter */\n\t\t\t\tsub ecx, 8   \t/* do not use first 4 and last 4 columns */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10352:\n\t\t\tpxor mm7, mm7   \t/* zero MM7 (accumulator) */\n\t\t\t\tmovd mm6, esi   \t/* save ESI in MM6 */\n\t\t\t\t/* --- 1 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult. 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 2 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult. 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 3 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult. 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 4 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult. 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 5 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult. 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 6 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult. 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult. 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 8 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult. 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 9 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult. 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpmullw mm1, mm3   \t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* ---, */\n\t\t\t\tmovq mm3, mm7   \t/* copy MM7 into MM3 */\n\t\t\t\tpsrlq mm7, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpaddsw mm7, mm3   \t/* add 2 left and 2 right result words */\n\t\t\t\tmovq mm2, mm7   \t/* copy MM7 into MM2 */\n\t\t\t\tpsrlq mm7, 16   \t/* shift 1 left word to the right */\n\t\t\t\tpaddsw mm7, mm2   \t/* add 1 left and 1 right result words */\n\t\t\t\t/* ---, */\n\t\t\t\tmovd mm1, eax   \t/* save EDX in MM1 */\n\t\t\t\tmovd mm2, ebx   \t/* save EDX in MM2 */\n\t\t\t\tmovd mm3, edx   \t/* save EDX in MM3 */\n\t\t\t\tmovd eax, mm7   \t/* load summation result into EAX */\n\t\t\t\tpsraw mm7, 15   \t/* spread sign bit of the result */\n\t\t\t\tmovd ebx, mm5   \t/* load Divisor into EBX */\n\t\t\t\tmovd edx, mm7   \t/* fill EDX with a sign bit */\n\t\t\t\tidiv bx    \t/* IDIV - VERY EXPENSIVE */\n\t\t\t\tmovd mm7, eax   \t/* move result of division into MM7 */\n\t\t\t\tpackuswb mm7, mm0   \t/* pack division result with saturation */\n\t\t\t\tmovd eax, mm7   \t/* copy saturated result into EAX */\n\t\t\t\tmov [edi], al   \t/* copy a byte result into Dest */\n\t\t\t\tmovd edx, mm3   \t/* restore saved EDX */\n\t\t\t\tmovd ebx, mm2   \t/* restore saved EBX */\n\t\t\t\tmovd eax, mm1   \t/* restore saved EAX */\n\t\t\t\t/* --, */\n\t\t\t\tmovd esi, mm6   \t/* move Src pointer to the top pixel */\n\t\t\t\tsub edx, 208   \t/* EDX = Kernel address */\n\t\t\t\tinc              esi    \t/* move Src  pointer to the next pixel */\n\t\t\t\tinc              edi    \t/* move Dest pointer to the next pixel */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10352    \t/* check loop termination, proceed if required */\n\t\t\t\tadd esi, 8   \t/* move to the next row in Src */\n\t\t\t\tadd edi, 8   \t/* move to the next row in Dest */\n\t\t\t\tdec              ebx    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10350    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"xor       %%ebx, %%ebx \\n\\t\"\t/* zero EBX */\n\t\t\t\"mov           %5, %%bl \\n\\t\"\t/* load Divisor into BL */\n\t\t\t\"movd      %%ebx, %%mm5 \\n\\t\"\t/* copy Divisor into MM5 */\n\t\t\t\"mov          %4, %%edx \\n\\t\"\t/* load Kernel address into EDX */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* load Src  address to ESI */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add          $4, %%edi \\n\\t\"\t/* 4 column offset from the left edge */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* 4 row offset from the top edge */\n\t\t\t\"add       %%eax, %%edi \\n\\t\" \"add       %%eax, %%edi \\n\\t\" \"add       %%eax, %%edi \\n\\t\" \"mov          %2, %%ebx \\n\\t\"\t/* initialize ROWS counter */\n\t\t\t\"sub          $8, %%ebx \\n\\t\"\t/* do not use first 4 and last 4 rows */\n\t\t\t/* --- */\n\t\t\t\".L10350:               \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMNS counter */\n\t\t\t\"sub          $8, %%ecx \\n\\t\"\t/* do not use first 4 and last 4 columns */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10352:               \\n\\t\" \"pxor      %%mm7, %%mm7 \\n\\t\"\t/* zero MM7 (accumulator) */\n\t\t\t\"movd      %%esi, %%mm6 \\n\\t\"\t/* save ESI in MM6 */\n\t\t\t/* --- 1 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 2 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 3 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 4 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 5 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 6 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 8 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 9 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- */\n\t\t\t\"movq      %%mm7, %%mm3 \\n\\t\"\t/* copy MM7 into MM3 */\n\t\t\t\"psrlq       $32, %%mm7 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"paddsw    %%mm3, %%mm7 \\n\\t\"\t/* add 2 left and 2 right result words */\n\t\t\t\"movq      %%mm7, %%mm2 \\n\\t\"\t/* copy MM7 into MM2 */\n\t\t\t\"psrlq       $16, %%mm7 \\n\\t\"\t/* shift 1 left word to the right */\n\t\t\t\"paddsw    %%mm2, %%mm7 \\n\\t\"\t/* add 1 left and 1 right result words */\n\t\t\t/* --- */\n\t\t\t\"movd      %%eax, %%mm1 \\n\\t\"\t/* save EDX in MM1 */\n\t\t\t\"movd      %%ebx, %%mm2 \\n\\t\"\t/* save EDX in MM2 */\n\t\t\t\"movd      %%edx, %%mm3 \\n\\t\"\t/* save EDX in MM3 */\n\t\t\t\"movd      %%mm7, %%eax \\n\\t\"\t/* load summation result into EAX */\n\t\t\t\"psraw       $15, %%mm7 \\n\\t\"\t/* spread sign bit of the result */\n\t\t\t\"movd      %%mm5, %%ebx \\n\\t\"\t/* load Divisor into EBX */\n\t\t\t\"movd      %%mm7, %%edx \\n\\t\"\t/* fill EDX with a sign bit */\n\t\t\t\"idivw             %%bx \\n\\t\"\t/* IDIV - VERY EXPENSIVE */\n\t\t\t\"movd      %%eax, %%mm7 \\n\\t\"\t/* move result of division into MM7 */\n\t\t\t\"packuswb  %%mm0, %%mm7 \\n\\t\"\t/* pack division result with saturation */\n\t\t\t\"movd      %%mm7, %%eax \\n\\t\"\t/* copy saturated result into EAX */\n\t\t\t\"mov      %%al, (%%edi) \\n\\t\"\t/* copy a byte result into Dest */\n\t\t\t\"movd      %%mm3, %%edx \\n\\t\"\t/* restore saved EDX */\n\t\t\t\"movd      %%mm2, %%ebx \\n\\t\"\t/* restore saved EBX */\n\t\t\t\"movd      %%mm1, %%eax \\n\\t\"\t/* restore saved EAX */\n\t\t\t/* -- */\n\t\t\t\"movd      %%mm6, %%esi \\n\\t\"\t/* move Src pointer to the top pixel */\n\t\t\t\"sub        $208, %%edx \\n\\t\"\t/* EDX = Kernel address */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move Src  pointer to the next pixel */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* move Dest pointer to the next pixel */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10352 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"add          $8, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add          $8, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"dec              %%ebx \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10350 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns),\t\t/* %3 */\n\t\t\t\"m\"(Kernel),\t\t/* %4 */\n\t\t\t\"m\"(Divisor)\t\t/* %5 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Filter using ConvolveKernel3x3ShiftRight: Dij = saturation0and255( ... ) \n\n\\param Src The source 2D byte array to convolve. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >2.\n\\param columns Number of columns in source/destination array. Must be >2.\n\\param Kernel The 2D convolution kernel of size 3x3.\n\\param NRightShift The number of right bit shifts to apply to the convolution sum. Must be <7.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterConvolveKernel3x3ShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns,\n\t\t\t\t\t\t\t\t\t\t\t   signed short *Kernel, unsigned char NRightShift)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL) || (Kernel == NULL))\n\t\treturn(-1);\n\n\tif ((columns < 3) || (rows < 3) || (NRightShift > 7))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\txor ebx, ebx   \t/* zero EBX */\n\t\t\t\tmov bl, NRightShift   \t/* load NRightShift into BL */\n\t\t\t\tmovd mm4, ebx   \t/* copy NRightShift into MM4 */\n\t\t\t\tmov edx, Kernel   \t/* load Kernel address into EDX */\n\t\t\t\tmovq mm5, [edx]   \t/* MM5 = {0,K2,K1,K0} */\n\t\t\tadd edx, 8   \t/* second row              |K0 K1 K2 0| */\n\t\t\t\tmovq mm6, [edx]   \t/* MM6 = {0,K5,K4,K3}  K = |K3 K4 K5 0| */\n\t\t\tadd edx, 8   \t/* third row               |K6 K7 K8 0| */\n\t\t\t\tmovq mm7, [edx]   \t/* MM7 = {0,K8,K7,K6} */\n\t\t\t/* ---, */\n\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\tmov esi, Src   \t/* ESI = Src row 0 address */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, eax   \t/* EDI = EDI + columns */\n\t\t\t\tinc              edi    \t/* 1 byte offset from the left edge */\n\t\t\t\tmov edx, rows   \t/* initialize ROWS counter */\n\t\t\t\tsub edx, 2   \t/* do not use first and last row */\n\t\t\t\t/* ---, */\nL10360:\n\t\t\tmov ecx, eax   \t/* initialize COLUMS counter */\n\t\t\t\tsub ecx, 2   \t/* do not use first and last column */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10362:\n\t\t\t/* ---, */\n\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the image first row */\n\t\t\tadd esi, eax   \t/* move one row below */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes of the image second row */\n\t\t\tadd esi, eax   \t/* move one row below */\n\t\t\t\tmovq mm3, [esi]   \t/* load 8 bytes of the image third row */\n\t\t\tpunpcklbw mm1, mm0   \t/* unpack first 4 bytes into words */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack first 4 bytes into words */\n\t\t\t\tpunpcklbw mm3, mm0   \t/* unpack first 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm4   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm4   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm3, mm4   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm5   \t/* multiply words first row  image*Kernel */\n\t\t\t\tpmullw mm2, mm6   \t/* multiply words second row image*Kernel */\n\t\t\t\tpmullw mm3, mm7   \t/* multiply words third row  image*Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the first and second rows */\n\t\t\t\tpaddsw mm1, mm3   \t/* add 4 words of the third row and result */\n\t\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tpsrlq mm1, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 2 left and 2 right result words */\n\t\t\t\tmovq mm3, mm1   \t/* copy MM1 into MM3 */\n\t\t\t\tpsrlq mm1, 16   \t/* shift 1 left word to the right */\n\t\t\t\tpaddsw mm1, mm3   \t/* add 1 left and 1 right result words */\n\t\t\t\tpackuswb mm1, mm0   \t/* pack shift result with saturation */\n\t\t\t\tmovd ebx, mm1   \t/* copy saturated result into EBX */\n\t\t\t\tmov [edi], bl   \t/* copy a byte result into Dest */\n\t\t\t\t/* --, */\n\t\t\t\tsub esi, eax   \t/* move two rows up */\n\t\t\t\tsub esi, eax\n\t\t\t\tinc              esi    \t/* move Src  pointer to the next pixel */\n\t\t\t\tinc              edi    \t/* move Dest pointer to the next pixel */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10362    \t/* check loop termination, proceed if required */\n\t\t\t\tadd esi, 2   \t/* move to the next row in Src */\n\t\t\t\tadd edi, 2   \t/* move to the next row in Dest */\n\t\t\t\tdec              edx    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10360    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"xor       %%ebx, %%ebx \\n\\t\"\t/* zero EBX */\n\t\t\t\"mov           %5, %%bl \\n\\t\"\t/* load NRightShift into BL */\n\t\t\t\"movd      %%ebx, %%mm4 \\n\\t\"\t/* copy NRightShift into MM4 */\n\t\t\t\"mov          %4, %%edx \\n\\t\"\t/* load Kernel address into EDX */\n\t\t\t\"movq    (%%edx), %%mm5 \\n\\t\"\t/* MM5 = {0,K2,K1,K0} */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* second row              |K0 K1 K2 0| */\n\t\t\t\"movq    (%%edx), %%mm6 \\n\\t\"\t/* MM6 = {0,K5,K4,K3}  K = |K3 K4 K5 0| */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* third row               |K6 K7 K8 0| */\n\t\t\t\"movq    (%%edx), %%mm7 \\n\\t\"\t/* MM7 = {0,K8,K7,K6} */\n\t\t\t/* --- */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* ESI = Src row 0 address */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* EDI = EDI + columns */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* 1 byte offset from the left edge */\n\t\t\t\"mov          %2, %%edx \\n\\t\"\t/* initialize ROWS counter */\n\t\t\t\"sub          $2, %%edx \\n\\t\"\t/* do not use first and last row */\n\t\t\t/* --- */\n\t\t\t\".L10360:               \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMS counter */\n\t\t\t\"sub          $2, %%ecx \\n\\t\"\t/* do not use first and last column */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10362:               \\n\\t\"\n\t\t\t/* --- */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the image first row */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move one row below */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes of the image second row */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move one row below */\n\t\t\t\"movq    (%%esi), %%mm3 \\n\\t\"\t/* load 8 bytes of the image third row */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first 4 bytes into words */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack first 4 bytes into words */\n\t\t\t\"punpcklbw %%mm0, %%mm3 \\n\\t\"\t/* unpack first 4 bytes into words */\n\t\t\t\"psrlw     %%mm4, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm4, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm4, %%mm3 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm5, %%mm1 \\n\\t\"\t/* multiply words first row  image*Kernel */\n\t\t\t\"pmullw    %%mm6, %%mm2 \\n\\t\"\t/* multiply words second row image*Kernel */\n\t\t\t\"pmullw    %%mm7, %%mm3 \\n\\t\"\t/* multiply words third row  image*Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the first and second rows */\n\t\t\t\"paddsw    %%mm3, %%mm1 \\n\\t\"\t/* add 4 words of the third row and result */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"psrlq       $32, %%mm1 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 2 left and 2 right result words */\n\t\t\t\"movq      %%mm1, %%mm3 \\n\\t\"\t/* copy MM1 into MM3 */\n\t\t\t\"psrlq       $16, %%mm1 \\n\\t\"\t/* shift 1 left word to the right */\n\t\t\t\"paddsw    %%mm3, %%mm1 \\n\\t\"\t/* add 1 left and 1 right result words */\n\t\t\t\"packuswb  %%mm0, %%mm1 \\n\\t\"\t/* pack shift result with saturation */\n\t\t\t\"movd      %%mm1, %%ebx \\n\\t\"\t/* copy saturated result into EBX */\n\t\t\t\"mov      %%bl, (%%edi) \\n\\t\"\t/* copy a byte result into Dest */\n\t\t\t/* -- */\n\t\t\t\"sub       %%eax, %%esi \\n\\t\"\t/* move two rows up */\n\t\t\t\"sub       %%eax, %%esi \\n\\t\" \"inc              %%esi \\n\\t\"\t/* move Src  pointer to the next pixel */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* move Dest pointer to the next pixel */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10362 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"add          $2, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add          $2, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"dec              %%edx \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10360 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns),\t\t/* %3 */\n\t\t\t\"m\"(Kernel),\t\t/* %4 */\n\t\t\t\"m\"(NRightShift)\t/* %5 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Filter using ConvolveKernel5x5ShiftRight: Dij = saturation0and255( ... ) \n\n\\param Src The source 2D byte array to convolve. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >4.\n\\param columns Number of columns in source/destination array. Must be >4.\n\\param Kernel The 2D convolution kernel of size 5x5.\n\\param NRightShift The number of right bit shifts to apply to the convolution sum. Must be <7.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterConvolveKernel5x5ShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns,\n\t\t\t\t\t\t\t\t\t\t\t   signed short *Kernel, unsigned char NRightShift)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL) || (Kernel == NULL))\n\t\treturn(-1);\n\n\tif ((columns < 5) || (rows < 5) || (NRightShift > 7))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\txor ebx, ebx   \t/* zero EBX */\n\t\t\t\tmov bl, NRightShift   \t/* load NRightShift into BL */\n\t\t\t\tmovd mm5, ebx   \t/* copy NRightShift into MM5 */\n\t\t\t\tmov edx, Kernel   \t/* load Kernel address into EDX */\n\t\t\t\tmov esi, Src   \t/* load Src  address to ESI */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, 2   \t/* 2 column offset from the left edge */\n\t\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\tshl eax, 1   \t/* EAX = columns * 2 */\n\t\t\t\tadd edi, eax   \t/* 2 row offset from the top edge */\n\t\t\t\tshr eax, 1   \t/* EAX = columns */\n\t\t\t\tmov ebx, rows   \t/* initialize ROWS counter */\n\t\t\t\tsub ebx, 4   \t/* do not use first 2 and last 2 rows */\n\t\t\t\t/* ---, */\nL10370:\n\t\t\tmov ecx, eax   \t/* initialize COLUMNS counter */\n\t\t\t\tsub ecx, 4   \t/* do not use first 2 and last 2 columns */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10372:\n\t\t\tpxor mm7, mm7   \t/* zero MM7 (accumulator) */\n\t\t\t\tmovd mm6, esi   \t/* save ESI in MM6 */\n\t\t\t\t/* --- 1 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 2 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 3 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 4 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 5 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* ---, */\n\t\t\t\tmovq mm3, mm7   \t/* copy MM7 into MM3 */\n\t\t\t\tpsrlq mm7, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpaddsw mm7, mm3   \t/* add 2 left and 2 right result words */\n\t\t\t\tmovq mm2, mm7   \t/* copy MM7 into MM2 */\n\t\t\t\tpsrlq mm7, 16   \t/* shift 1 left word to the right */\n\t\t\t\tpaddsw mm7, mm2   \t/* add 1 left and 1 right result words */\n\t\t\t\tmovd mm1, eax   \t/* save EAX in MM1 */\n\t\t\t\tpackuswb mm7, mm0   \t/* pack division result with saturation */\n\t\t\t\tmovd eax, mm7   \t/* copy saturated result into EAX */\n\t\t\t\tmov [edi], al   \t/* copy a byte result into Dest */\n\t\t\t\tmovd eax, mm1   \t/* restore saved EAX */\n\t\t\t\t/* --, */\n\t\t\t\tmovd esi, mm6   \t/* move Src pointer to the top pixel */\n\t\t\t\tsub edx, 72   \t/* EDX = Kernel address */\n\t\t\t\tinc              esi    \t/* move Src  pointer to the next pixel */\n\t\t\t\tinc              edi    \t/* move Dest pointer to the next pixel */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10372    \t/* check loop termination, proceed if required */\n\t\t\t\tadd esi, 4   \t/* move to the next row in Src */\n\t\t\t\tadd edi, 4   \t/* move to the next row in Dest */\n\t\t\t\tdec              ebx    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10370    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"xor       %%ebx, %%ebx \\n\\t\"\t/* zero EBX */\n\t\t\t\"mov           %5, %%bl \\n\\t\"\t/* load NRightShift into BL */\n\t\t\t\"movd      %%ebx, %%mm5 \\n\\t\"\t/* copy NRightShift into MM5 */\n\t\t\t\"mov          %4, %%edx \\n\\t\"\t/* load Kernel address into EDX */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* load Src  address to ESI */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add          $2, %%edi \\n\\t\"\t/* 2 column offset from the left edge */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t\"shl          $1, %%eax \\n\\t\"\t/* EAX = columns * 2 */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* 2 row offset from the top edge */\n\t\t\t\"shr          $1, %%eax \\n\\t\"\t/* EAX = columns */\n\t\t\t\"mov          %2, %%ebx \\n\\t\"\t/* initialize ROWS counter */\n\t\t\t\"sub          $4, %%ebx \\n\\t\"\t/* do not use first 2 and last 2 rows */\n\t\t\t/* --- */\n\t\t\t\".L10370:               \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMNS counter */\n\t\t\t\"sub          $4, %%ecx \\n\\t\"\t/* do not use first 2 and last 2 columns */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10372:               \\n\\t\" \"pxor      %%mm7, %%mm7 \\n\\t\"\t/* zero MM7 (accumulator) */\n\t\t\t\"movd      %%esi, %%mm6 \\n\\t\"\t/* save ESI in MM6 */\n\t\t\t/* --- 1 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 2 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 3 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 4 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 5 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- */\n\t\t\t\"movq      %%mm7, %%mm3 \\n\\t\"\t/* copy MM7 into MM3 */\n\t\t\t\"psrlq       $32, %%mm7 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"paddsw    %%mm3, %%mm7 \\n\\t\"\t/* add 2 left and 2 right result words */\n\t\t\t\"movq      %%mm7, %%mm2 \\n\\t\"\t/* copy MM7 into MM2 */\n\t\t\t\"psrlq       $16, %%mm7 \\n\\t\"\t/* shift 1 left word to the right */\n\t\t\t\"paddsw    %%mm2, %%mm7 \\n\\t\"\t/* add 1 left and 1 right result words */\n\t\t\t\"movd      %%eax, %%mm1 \\n\\t\"\t/* save EAX in MM1 */\n\t\t\t\"packuswb  %%mm0, %%mm7 \\n\\t\"\t/* pack division result with saturation */\n\t\t\t\"movd      %%mm7, %%eax \\n\\t\"\t/* copy saturated result into EAX */\n\t\t\t\"mov      %%al, (%%edi) \\n\\t\"\t/* copy a byte result into Dest */\n\t\t\t\"movd      %%mm1, %%eax \\n\\t\"\t/* restore saved EAX */\n\t\t\t/* -- */\n\t\t\t\"movd      %%mm6, %%esi \\n\\t\"\t/* move Src pointer to the top pixel */\n\t\t\t\"sub         $72, %%edx \\n\\t\"\t/* EDX = Kernel address */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move Src  pointer to the next pixel */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* move Dest pointer to the next pixel */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10372 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"add          $4, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add          $4, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"dec              %%ebx \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10370 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns),\t\t/* %3 */\n\t\t\t\"m\"(Kernel),\t\t/* %4 */\n\t\t\t\"m\"(NRightShift)\t/* %5 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Filter using ConvolveKernel7x7ShiftRight: Dij = saturation0and255( ... ) \n\n\\param Src The source 2D byte array to convolve. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >6.\n\\param columns Number of columns in source/destination array. Must be >6.\n\\param Kernel The 2D convolution kernel of size 7x7.\n\\param NRightShift The number of right bit shifts to apply to the convolution sum. Must be <7.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterConvolveKernel7x7ShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns,\n\t\t\t\t\t\t\t\t\t\t\t   signed short *Kernel, unsigned char NRightShift)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL) || (Kernel == NULL))\n\t\treturn(-1);\n\n\tif ((columns < 7) || (rows < 7) || (NRightShift > 7))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\txor ebx, ebx   \t/* zero EBX */\n\t\t\t\tmov bl, NRightShift   \t/* load NRightShift into BL */\n\t\t\t\tmovd mm5, ebx   \t/* copy NRightShift into MM5 */\n\t\t\t\tmov edx, Kernel   \t/* load Kernel address into EDX */\n\t\t\t\tmov esi, Src   \t/* load Src  address to ESI */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, 3   \t/* 3 column offset from the left edge */\n\t\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\tadd edi, eax   \t/* 3 row offset from the top edge */\n\t\t\t\tadd edi, eax\n\t\t\t\tadd edi, eax\n\t\t\t\tmov ebx, rows   \t/* initialize ROWS counter */\n\t\t\t\tsub ebx, 6   \t/* do not use first 3 and last 3 rows */\n\t\t\t\t/* ---, */\nL10380:\n\t\t\tmov ecx, eax   \t/* initialize COLUMNS counter */\n\t\t\t\tsub ecx, 6   \t/* do not use first 3 and last 3 columns */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10382:\n\t\t\tpxor mm7, mm7   \t/* zero MM7 (accumulator) */\n\t\t\t\tmovd mm6, esi   \t/* save ESI in MM6 */\n\t\t\t\t/* --- 1 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 2 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 3 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 4 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 5 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 6 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* ---, */\n\t\t\t\tmovq mm3, mm7   \t/* copy MM7 into MM3 */\n\t\t\t\tpsrlq mm7, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpaddsw mm7, mm3   \t/* add 2 left and 2 right result words */\n\t\t\t\tmovq mm2, mm7   \t/* copy MM7 into MM2 */\n\t\t\t\tpsrlq mm7, 16   \t/* shift 1 left word to the right */\n\t\t\t\tpaddsw mm7, mm2   \t/* add 1 left and 1 right result words */\n\t\t\t\tmovd mm1, eax   \t/* save EAX in MM1 */\n\t\t\t\tpackuswb mm7, mm0   \t/* pack division result with saturation */\n\t\t\t\tmovd eax, mm7   \t/* copy saturated result into EAX */\n\t\t\t\tmov [edi], al   \t/* copy a byte result into Dest */\n\t\t\t\tmovd eax, mm1   \t/* restore saved EAX */\n\t\t\t\t/* --, */\n\t\t\t\tmovd esi, mm6   \t/* move Src pointer to the top pixel */\n\t\t\t\tsub edx, 104   \t/* EDX = Kernel address */\n\t\t\t\tinc              esi    \t/* move Src  pointer to the next pixel */\n\t\t\t\tinc              edi    \t/* move Dest pointer to the next pixel */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10382    \t/* check loop termination, proceed if required */\n\t\t\t\tadd esi, 6   \t/* move to the next row in Src */\n\t\t\t\tadd edi, 6   \t/* move to the next row in Dest */\n\t\t\t\tdec              ebx    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10380    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"xor       %%ebx, %%ebx \\n\\t\"\t/* zero EBX */\n\t\t\t\"mov           %5, %%bl \\n\\t\"\t/* load NRightShift into BL */\n\t\t\t\"movd      %%ebx, %%mm5 \\n\\t\"\t/* copy NRightShift into MM5 */\n\t\t\t\"mov          %4, %%edx \\n\\t\"\t/* load Kernel address into EDX */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* load Src  address to ESI */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add          $3, %%edi \\n\\t\"\t/* 3 column offset from the left edge */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* 3 row offset from the top edge */\n\t\t\t\"add       %%eax, %%edi \\n\\t\" \"add       %%eax, %%edi \\n\\t\" \"mov          %2, %%ebx \\n\\t\"\t/* initialize ROWS counter */\n\t\t\t\"sub          $6, %%ebx \\n\\t\"\t/* do not use first 3 and last 3 rows */\n\t\t\t/* --- */\n\t\t\t\".L10380:               \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMNS counter */\n\t\t\t\"sub          $6, %%ecx \\n\\t\"\t/* do not use first 3 and last 3 columns */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10382:               \\n\\t\" \"pxor      %%mm7, %%mm7 \\n\\t\"\t/* zero MM7 (accumulator) */\n\t\t\t\"movd      %%esi, %%mm6 \\n\\t\"\t/* save ESI in MM6 */\n\t\t\t/* --- 1 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 2 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 3 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 4 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 5 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 6 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- */\n\t\t\t\"movq      %%mm7, %%mm3 \\n\\t\"\t/* copy MM7 into MM3 */\n\t\t\t\"psrlq       $32, %%mm7 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"paddsw    %%mm3, %%mm7 \\n\\t\"\t/* add 2 left and 2 right result words */\n\t\t\t\"movq      %%mm7, %%mm2 \\n\\t\"\t/* copy MM7 into MM2 */\n\t\t\t\"psrlq       $16, %%mm7 \\n\\t\"\t/* shift 1 left word to the right */\n\t\t\t\"paddsw    %%mm2, %%mm7 \\n\\t\"\t/* add 1 left and 1 right result words */\n\t\t\t\"movd      %%eax, %%mm1 \\n\\t\"\t/* save EAX in MM1 */\n\t\t\t\"packuswb  %%mm0, %%mm7 \\n\\t\"\t/* pack division result with saturation */\n\t\t\t\"movd      %%mm7, %%eax \\n\\t\"\t/* copy saturated result into EAX */\n\t\t\t\"mov      %%al, (%%edi) \\n\\t\"\t/* copy a byte result into Dest */\n\t\t\t\"movd      %%mm1, %%eax \\n\\t\"\t/* restore saved EAX */\n\t\t\t/* -- */\n\t\t\t\"movd      %%mm6, %%esi \\n\\t\"\t/* move Src pointer to the top pixel */\n\t\t\t\"sub        $104, %%edx \\n\\t\"\t/* EDX = Kernel address */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move Src  pointer to the next pixel */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* move Dest pointer to the next pixel */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10382 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"add          $6, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add          $6, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"dec              %%ebx \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10380 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns),\t\t/* %3 */\n\t\t\t\"m\"(Kernel),\t\t/* %4 */\n\t\t\t\"m\"(NRightShift)\t/* %5 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Filter using ConvolveKernel9x9ShiftRight: Dij = saturation255( ... ) \n\n\\param Src The source 2D byte array to convolve. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >8.\n\\param columns Number of columns in source/destination array. Must be >8.\n\\param Kernel The 2D convolution kernel of size 9x9.\n\\param NRightShift The number of right bit shifts to apply to the convolution sum. Must be <7.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterConvolveKernel9x9ShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns,\n\t\t\t\t\t\t\t\t\t\t\t   signed short *Kernel, unsigned char NRightShift)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL) || (Kernel == NULL))\n\t\treturn(-1);\n\n\tif ((columns < 9) || (rows < 9) || (NRightShift > 7))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\txor ebx, ebx   \t/* zero EBX */\n\t\t\t\tmov bl, NRightShift   \t/* load NRightShift into BL */\n\t\t\t\tmovd mm5, ebx   \t/* copy NRightShift into MM5 */\n\t\t\t\tmov edx, Kernel   \t/* load Kernel address into EDX */\n\t\t\t\tmov esi, Src   \t/* load Src  address to ESI */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, 4   \t/* 4 column offset from the left edge */\n\t\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\tadd edi, eax   \t/* 4 row offset from the top edge */\n\t\t\t\tadd edi, eax\n\t\t\t\tadd edi, eax\n\t\t\t\tadd edi, eax\n\t\t\t\tmov ebx, rows   \t/* initialize ROWS counter */\n\t\t\t\tsub ebx, 8   \t/* do not use first 4 and last 4 rows */\n\t\t\t\t/* ---, */\nL10390:\n\t\t\tmov ecx, eax   \t/* initialize COLUMNS counter */\n\t\t\t\tsub ecx, 8   \t/* do not use first 4 and last 4 columns */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10392:\n\t\t\tpxor mm7, mm7   \t/* zero MM7 (accumulator) */\n\t\t\t\tmovd mm6, esi   \t/* save ESI in MM6 */\n\t\t\t\t/* --- 1 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 2 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 3 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 4 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 5 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 6 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 8 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tdec              esi\n\t\t\t\tadd esi, eax   \t/* move Src pointer 1 row below */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* --- 9 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm2, mm1   \t/* copy MM1 into MM2 */\n\t\t\t\tinc              esi    \t/* move pointer to the next 8 bytes of Src */\n\t\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tmovq mm4, [edx]   \t/* load 4 words of Kernel */\n\t\t\tadd edx, 8   \t/* move pointer to other 4 words */\n\t\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpunpckhbw mm2, mm0   \t/* unpack second 4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm2, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpmullw mm2, mm4   \t/* mult 4 high words of Src and Kernel */\n\t\t\t\tpaddsw mm1, mm2   \t/* add 4 words of the high and low bytes */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\tmovq mm1, [esi]   \t/* load 8 bytes of the Src */\n\t\t\tmovq mm3, [edx]   \t/* load 4 words of Kernel */\n\t\t\tpunpcklbw mm1, mm0   \t/* unpack first  4 bytes into words */\n\t\t\t\tpsrlw mm1, mm5   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpmullw mm1, mm3   \t/* mult 4 low  words of Src and Kernel */\n\t\t\t\tpaddsw mm7, mm1   \t/* add MM1 to accumulator MM7 */\n\t\t\t\t/* ---, */\n\t\t\t\tmovq mm3, mm7   \t/* copy MM7 into MM3 */\n\t\t\t\tpsrlq mm7, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpaddsw mm7, mm3   \t/* add 2 left and 2 right result words */\n\t\t\t\tmovq mm2, mm7   \t/* copy MM7 into MM2 */\n\t\t\t\tpsrlq mm7, 16   \t/* shift 1 left word to the right */\n\t\t\t\tpaddsw mm7, mm2   \t/* add 1 left and 1 right result words */\n\t\t\t\tmovd mm1, eax   \t/* save EAX in MM1 */\n\t\t\t\tpackuswb mm7, mm0   \t/* pack division result with saturation */\n\t\t\t\tmovd eax, mm7   \t/* copy saturated result into EAX */\n\t\t\t\tmov [edi], al   \t/* copy a byte result into Dest */\n\t\t\t\tmovd eax, mm1   \t/* restore saved EAX */\n\t\t\t\t/* --, */\n\t\t\t\tmovd esi, mm6   \t/* move Src pointer to the top pixel */\n\t\t\t\tsub edx, 208   \t/* EDX = Kernel address */\n\t\t\t\tinc              esi    \t/* move Src  pointer to the next pixel */\n\t\t\t\tinc              edi    \t/* move Dest pointer to the next pixel */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10392    \t/* check loop termination, proceed if required */\n\t\t\t\tadd esi, 8   \t/* move to the next row in Src */\n\t\t\t\tadd edi, 8   \t/* move to the next row in Dest */\n\t\t\t\tdec              ebx    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10390    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"xor       %%ebx, %%ebx \\n\\t\"\t/* zero EBX */\n\t\t\t\"mov           %5, %%bl \\n\\t\"\t/* load NRightShift into BL */\n\t\t\t\"movd      %%ebx, %%mm5 \\n\\t\"\t/* copy NRightShift into MM5 */\n\t\t\t\"mov          %4, %%edx \\n\\t\"\t/* load Kernel address into EDX */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* load Src  address to ESI */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add          $4, %%edi \\n\\t\"\t/* 4 column offset from the left edge */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* 4 row offset from the top edge */\n\t\t\t\"add       %%eax, %%edi \\n\\t\" \"add       %%eax, %%edi \\n\\t\" \"add       %%eax, %%edi \\n\\t\" \"mov          %2, %%ebx \\n\\t\"\t/* initialize ROWS counter */\n\t\t\t\"sub          $8, %%ebx \\n\\t\"\t/* do not use first 4 and last 4 rows */\n\t\t\t/* --- */\n\t\t\t\".L10390:               \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMNS counter */\n\t\t\t\"sub          $8, %%ecx \\n\\t\"\t/* do not use first 4 and last 4 columns */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10392:               \\n\\t\" \"pxor      %%mm7, %%mm7 \\n\\t\"\t/* zero MM7 (accumulator) */\n\t\t\t\"movd      %%esi, %%mm6 \\n\\t\"\t/* save ESI in MM6 */\n\t\t\t/* --- 1 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 2 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 3 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 4 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 5 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 6 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 8 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"dec              %%esi \\n\\t\" \"add       %%eax, %%esi \\n\\t\"\t/* move Src pointer 1 row below */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- 9 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq      %%mm1, %%mm2 \\n\\t\"\t/* copy MM1 into MM2 */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move pointer to the next 8 bytes of Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"movq    (%%edx), %%mm4 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"add          $8, %%edx \\n\\t\"\t/* move pointer to other 4 words */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm2 \\n\\t\"\t/* unpack second 4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm5, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"pmullw    %%mm4, %%mm2 \\n\\t\"\t/* mult. 4 high words of Src and Kernel */\n\t\t\t\"paddsw    %%mm2, %%mm1 \\n\\t\"\t/* add 4 words of the high and low bytes */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t\"movq    (%%esi), %%mm1 \\n\\t\"\t/* load 8 bytes of the Src */\n\t\t\t\"movq    (%%edx), %%mm3 \\n\\t\"\t/* load 4 words of Kernel */\n\t\t\t\"punpcklbw %%mm0, %%mm1 \\n\\t\"\t/* unpack first  4 bytes into words */\n\t\t\t\"psrlw     %%mm5, %%mm1 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"pmullw    %%mm3, %%mm1 \\n\\t\"\t/* mult. 4 low  words of Src and Kernel */\n\t\t\t\"paddsw    %%mm1, %%mm7 \\n\\t\"\t/* add MM1 to accumulator MM7 */\n\t\t\t/* --- */\n\t\t\t\"movq      %%mm7, %%mm3 \\n\\t\"\t/* copy MM7 into MM3 */\n\t\t\t\"psrlq       $32, %%mm7 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"paddsw    %%mm3, %%mm7 \\n\\t\"\t/* add 2 left and 2 right result words */\n\t\t\t\"movq      %%mm7, %%mm2 \\n\\t\"\t/* copy MM7 into MM2 */\n\t\t\t\"psrlq       $16, %%mm7 \\n\\t\"\t/* shift 1 left word to the right */\n\t\t\t\"paddsw    %%mm2, %%mm7 \\n\\t\"\t/* add 1 left and 1 right result words */\n\t\t\t\"movd      %%eax, %%mm1 \\n\\t\"\t/* save EAX in MM1 */\n\t\t\t\"packuswb  %%mm0, %%mm7 \\n\\t\"\t/* pack division result with saturation */\n\t\t\t\"movd      %%mm7, %%eax \\n\\t\"\t/* copy saturated result into EAX */\n\t\t\t\"mov      %%al, (%%edi) \\n\\t\"\t/* copy a byte result into Dest */\n\t\t\t\"movd      %%mm1, %%eax \\n\\t\"\t/* restore saved EAX */\n\t\t\t/* -- */\n\t\t\t\"movd      %%mm6, %%esi \\n\\t\"\t/* move Src pointer to the top pixel */\n\t\t\t\"sub        $208, %%edx \\n\\t\"\t/* EDX = Kernel address */\n\t\t\t\"inc              %%esi \\n\\t\"\t/* move Src  pointer to the next pixel */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* move Dest pointer to the next pixel */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10392 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"add          $8, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add          $8, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"dec              %%ebx \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10390 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns),\t\t/* %3 */\n\t\t\t\"m\"(Kernel),\t\t/* %4 */\n\t\t\t\"m\"(NRightShift)\t/* %5 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/* ------------------------------------------------------------------------------------ */\n\n/*!\n\\brief Filter using SobelX: Dij = saturation255( ... ) \n\n\\param Src The source 2D byte array to sobel-filter. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >2.\n\\param columns Number of columns in source/destination array. Must be >7.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterSobelX(unsigned char *Src, unsigned char *Dest, int rows, int columns)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\n\tif ((columns < 8) || (rows < 3))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\t/* ---, */\n\t\t\t\tmov esi, Src   \t/* ESI = Src row 0 address */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, eax   \t/* EDI = EDI + columns */\n\t\t\t\tinc              edi    \t/* 1 byte offset from the left edge */\n\t\t\t\tmov edx, rows   \t/* initialize ROWS counter */\n\t\t\t\tsub edx, 2   \t/* do not use first and last rows */\n\t\t\t\t/* ---, */\nL10400:\n\t\t\tmov ecx, eax   \t/* initialize COLUMS counter */\n\t\t\t\tshr ecx, 3   \t/* EBX/8 (MMX loads 8 bytes at a time) */\n\t\t\t\tmov ebx, esi   \t/* save ESI in EBX */\n\t\t\t\tmovd mm1, edi   \t/* save EDI in MM1 */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10402:\n\t\t\t/* ---, */\n\t\t\tmovq mm4, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm5, mm4   \t/* save MM4 in MM5 */\n\t\t\t\tadd esi, 2   \t/* move ESI pointer 2 bytes right */\n\t\t\t\tpunpcklbw mm4, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm5, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tmovq mm6, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm7, mm6   \t/* save MM6 in MM7 */\n\t\t\t\tsub esi, 2   \t/* move ESI pointer back 2 bytes left */\n\t\t\t\tpunpcklbw mm6, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm7, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tadd esi, eax   \t/* move to the next row of Src */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm3, mm2   \t/* save MM2 in MM3 */\n\t\t\t\tadd esi, 2   \t/* move ESI pointer 2 bytes right */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm3, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpaddw mm4, mm2   \t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\tpaddw mm5, mm3   \t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\tpaddw mm4, mm2   \t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\tpaddw mm5, mm3   \t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm3, mm2   \t/* save MM2 in MM3 */\n\t\t\t\tsub esi, 2   \t/* move ESI pointer back 2 bytes left */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm3, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpaddw mm6, mm2   \t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\tpaddw mm7, mm3   \t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\tpaddw mm6, mm2   \t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\tpaddw mm7, mm3   \t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\tadd esi, eax   \t/* move to the next row of Src */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm3, mm2   \t/* save MM2 in MM3 */\n\t\t\t\tadd esi, 2   \t/* move ESI pointer 2 bytes right */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm3, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpaddw mm4, mm2   \t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\tpaddw mm5, mm3   \t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm3, mm2   \t/* save MM2 in MM3 */\n\t\t\t\tsub esi, 2   \t/* move ESI pointer back 2 bytes left */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm3, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpaddw mm6, mm2   \t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\tpaddw mm7, mm3   \t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\t/* ---, */\n\t\t\t\tmovq mm2, mm4   \t/* copy MM4 into MM2 */\n\t\t\t\tpsrlq mm4, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpsubw mm4, mm2   \t/* MM4 = MM4 - MM2 */\n\t\t\t\tmovq mm3, mm6   \t/* copy MM6 into MM3 */\n\t\t\t\tpsrlq mm6, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpsubw mm6, mm3   \t/* MM6 = MM6 - MM3 */\n\t\t\t\tpunpckldq mm4, mm6   \t/* combine 2 words of MM6 and 2 words of MM4 */\n\t\t\t\tmovq mm2, mm5   \t/* copy MM6 into MM2 */\n\t\t\t\tpsrlq mm5, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpsubw mm5, mm2   \t/* MM5 = MM5 - MM2 */\n\t\t\t\tmovq mm3, mm7   \t/* copy MM7 into MM3 */\n\t\t\t\tpsrlq mm7, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpsubw mm7, mm3   \t/* MM7 = MM7 - MM3 */\n\t\t\t\tpunpckldq mm5, mm7   \t/* combine 2 words of MM7 and 2 words of MM5 */\n\t\t\t\t/* Take abs values of MM4 and MM5 */\n\t\t\t\tmovq mm6, mm4   \t/* copy MM4 into MM6 */\n\t\t\t\tmovq mm7, mm5   \t/* copy MM5 into MM7 */\n\t\t\t\tpsraw mm6, 15   \t/* fill MM6 words with word sign bit */\n\t\t\t\tpsraw mm7, 15   \t/* fill MM7 words with word sign bit */\n\t\t\t\tpxor mm4, mm6   \t/* take 1's compliment of only neg words */\n\t\t\t\tpxor mm5, mm7   \t/* take 1's compliment of only neg words */\n\t\t\t\tpsubsw mm4, mm6   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\t\tpsubsw mm5, mm7   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\t\tpackuswb mm4, mm5   \t/* combine and pack/saturate MM5 and MM4 */\n\t\t\t\tmovq [edi], mm4   \t/* store result in Dest */\n\t\t\t\t/* ---, */\n\t\t\t\tsub esi, eax   \t/* move to the current top row in Src */\n\t\t\t\tsub esi, eax\n\t\t\t\tadd esi, 8   \t/* move Src  pointer to the next 8 pixels */\n\t\t\t\tadd edi, 8   \t/* move Dest pointer to the next 8 pixels */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10402    \t/* check loop termination, proceed if required */\n\t\t\t\tmov esi, ebx   \t/* restore most left current row Src  address */\n\t\t\t\tmovd edi, mm1   \t/* restore most left current row Dest address */\n\t\t\t\tadd esi, eax   \t/* move to the next row in Src */\n\t\t\t\tadd edi, eax   \t/* move to the next row in Dest */\n\t\t\t\tdec              edx    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10400    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t/* --- */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* ESI = Src row 0 address */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* EDI = EDI + columns */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* 1 byte offset from the left edge */\n\t\t\t\"mov          %2, %%edx \\n\\t\"\t/* initialize ROWS counter */\n\t\t\t\"sub          $2, %%edx \\n\\t\"\t/* do not use first and last rows */\n\t\t\t/* --- */\n\t\t\t\".L10400:                \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMS counter */\n\t\t\t\"shr          $3, %%ecx \\n\\t\"\t/* EBX/8 (MMX loads 8 bytes at a time) */\n\t\t\t\"mov       %%esi, %%ebx \\n\\t\"\t/* save ESI in EBX */\n\t\t\t\"movd      %%edi, %%mm1 \\n\\t\"\t/* save EDI in MM1 */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10402:               \\n\\t\"\n\t\t\t/* --- */\n\t\t\t\"movq    (%%esi), %%mm4 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm4, %%mm5 \\n\\t\"\t/* save MM4 in MM5 */\n\t\t\t\"add          $2, %%esi \\n\\t\"\t/* move ESI pointer 2 bytes right */\n\t\t\t\"punpcklbw %%mm0, %%mm4 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm5 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"movq    (%%esi), %%mm6 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm6, %%mm7 \\n\\t\"\t/* save MM6 in MM7 */\n\t\t\t\"sub          $2, %%esi \\n\\t\"\t/* move ESI pointer back 2 bytes left */\n\t\t\t\"punpcklbw %%mm0, %%mm6 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm7 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move to the next row of Src */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm2, %%mm3 \\n\\t\"\t/* save MM2 in MM3 */\n\t\t\t\"add          $2, %%esi \\n\\t\"\t/* move ESI pointer 2 bytes right */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm3 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"paddw     %%mm2, %%mm4 \\n\\t\"\t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\"paddw     %%mm3, %%mm5 \\n\\t\"\t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\"paddw     %%mm2, %%mm4 \\n\\t\"\t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\"paddw     %%mm3, %%mm5 \\n\\t\"\t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm2, %%mm3 \\n\\t\"\t/* save MM2 in MM3 */\n\t\t\t\"sub          $2, %%esi \\n\\t\"\t/* move ESI pointer back 2 bytes left */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm3 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"paddw     %%mm2, %%mm6 \\n\\t\"\t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\"paddw     %%mm3, %%mm7 \\n\\t\"\t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\"paddw     %%mm2, %%mm6 \\n\\t\"\t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\"paddw     %%mm3, %%mm7 \\n\\t\"\t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move to the next row of Src */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm2, %%mm3 \\n\\t\"\t/* save MM2 in MM3 */\n\t\t\t\"add          $2, %%esi \\n\\t\"\t/* move ESI pointer 2 bytes right */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm3 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"paddw     %%mm2, %%mm4 \\n\\t\"\t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\"paddw     %%mm3, %%mm5 \\n\\t\"\t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm2, %%mm3 \\n\\t\"\t/* save MM2 in MM3 */\n\t\t\t\"sub          $2, %%esi \\n\\t\"\t/* move ESI pointer back 2 bytes left */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm3 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"paddw     %%mm2, %%mm6 \\n\\t\"\t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\"paddw     %%mm3, %%mm7 \\n\\t\"\t/* add 4 high bytes to accumolator MM7 */\n\t\t\t/* --- */\n\t\t\t\"movq      %%mm4, %%mm2 \\n\\t\"\t/* copy MM4 into MM2 */\n\t\t\t\"psrlq       $32, %%mm4 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"psubw     %%mm2, %%mm4 \\n\\t\"\t/* MM4 = MM4 - MM2 */\n\t\t\t\"movq      %%mm6, %%mm3 \\n\\t\"\t/* copy MM6 into MM3 */\n\t\t\t\"psrlq       $32, %%mm6 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"psubw     %%mm3, %%mm6 \\n\\t\"\t/* MM6 = MM6 - MM3 */\n\t\t\t\"punpckldq %%mm6, %%mm4 \\n\\t\"\t/* combine 2 words of MM6 and 2 words of MM4 */\n\t\t\t\"movq      %%mm5, %%mm2 \\n\\t\"\t/* copy MM6 into MM2 */\n\t\t\t\"psrlq       $32, %%mm5 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"psubw     %%mm2, %%mm5 \\n\\t\"\t/* MM5 = MM5 - MM2 */\n\t\t\t\"movq      %%mm7, %%mm3 \\n\\t\"\t/* copy MM7 into MM3 */\n\t\t\t\"psrlq       $32, %%mm7 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"psubw     %%mm3, %%mm7 \\n\\t\"\t/* MM7 = MM7 - MM3 */\n\t\t\t\"punpckldq %%mm7, %%mm5 \\n\\t\"\t/* combine 2 words of MM7 and 2 words of MM5 */\n\t\t\t/* Take abs values of MM4 and MM5 */\n\t\t\t\"movq      %%mm4, %%mm6 \\n\\t\"\t/* copy MM4 into MM6 */\n\t\t\t\"movq      %%mm5, %%mm7 \\n\\t\"\t/* copy MM5 into MM7 */\n\t\t\t\"psraw       $15, %%mm6 \\n\\t\"\t/* fill MM6 words with word sign bit */\n\t\t\t\"psraw       $15, %%mm7 \\n\\t\"\t/* fill MM7 words with word sign bit */\n\t\t\t\"pxor      %%mm6, %%mm4 \\n\\t\"\t/* take 1's compliment of only neg. words */\n\t\t\t\"pxor      %%mm7, %%mm5 \\n\\t\"\t/* take 1's compliment of only neg. words */\n\t\t\t\"psubsw    %%mm6, %%mm4 \\n\\t\"\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\t\"psubsw    %%mm7, %%mm5 \\n\\t\"\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\t\"packuswb  %%mm5, %%mm4 \\n\\t\"\t/* combine and pack/saturate MM5 and MM4 */\n\t\t\t\"movq    %%mm4, (%%edi) \\n\\t\"\t/* store result in Dest */\n\t\t\t/* --- */\n\t\t\t\"sub       %%eax, %%esi \\n\\t\"\t/* move to the current top row in Src */\n\t\t\t\"sub       %%eax, %%esi \\n\\t\" \"add $8,          %%esi \\n\\t\"\t/* move Src  pointer to the next 8 pixels */\n\t\t\t\"add $8,          %%edi \\n\\t\"\t/* move Dest pointer to the next 8 pixels */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10402 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"mov       %%ebx, %%esi \\n\\t\"\t/* restore most left current row Src  address */\n\t\t\t\"movd      %%mm1, %%edi \\n\\t\"\t/* restore most left current row Dest address */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"dec              %%edx \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10400 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns)\t\t/* %3 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Filter using SobelXShiftRight: Dij = saturation255( ... ) \n\n\\param Src The source 2D byte array to sobel-filter. Should be different from destination.\n\\param Dest The destination 2D byte array to store the result in. Should be different from source.\n\\param rows Number of rows in source/destination array. Must be >2.\n\\param columns Number of columns in source/destination array. Must be >8.\n\\param NRightShift The number of right bit shifts to apply to the filter sum. Must be <7.\n\nNote: Non-MMX implementation not available for this function.\n\n\\return Returns 1 if filter was applied, 0 otherwise.\n*/\nint SDL_imageFilterSobelXShiftRight(unsigned char *Src, unsigned char *Dest, int rows, int columns,\n\t\t\t\t\t\t\t\t\tunsigned char NRightShift)\n{\n\t/* Validate input parameters */\n\tif ((Src == NULL) || (Dest == NULL))\n\t\treturn(-1);\n\tif ((columns < 8) || (rows < 3) || (NRightShift > 7))\n\t\treturn (-1);\n\n\tif ((SDL_imageFilterMMXdetect())) {\n//#ifdef USE_MMX\n#if defined(USE_MMX) && defined(i386)\n#if !defined(GCC__)\n\t\t__asm\n\t\t{\n\t\t\tpusha\n\t\t\t\tpxor mm0, mm0   \t/* zero MM0 */\n\t\t\t\tmov eax, columns   \t/* load columns into EAX */\n\t\t\t\txor ebx, ebx   \t/* zero EBX */\n\t\t\t\tmov bl, NRightShift   \t/* load NRightShift into BL */\n\t\t\t\tmovd mm1, ebx   \t/* copy NRightShift into MM1 */\n\t\t\t\t/* ---, */\n\t\t\t\tmov esi, Src   \t/* ESI = Src row 0 address */\n\t\t\t\tmov edi, Dest   \t/* load Dest address to EDI */\n\t\t\t\tadd edi, eax   \t/* EDI = EDI + columns */\n\t\t\t\tinc              edi    \t/* 1 byte offset from the left edge */\n\t\t\t\t/* initialize ROWS counter */\n\t\t\t\tsub rows, 2   \t/* do not use first and last rows */\n\t\t\t\t/* ---, */\nL10410:\n\t\t\tmov ecx, eax   \t/* initialize COLUMS counter */\n\t\t\t\tshr ecx, 3   \t/* EBX/8 (MMX loads 8 bytes at a time) */\n\t\t\t\tmov ebx, esi   \t/* save ESI in EBX */\n\t\t\t\tmov edx, edi   \t/* save EDI in EDX */\n\t\t\t\talign 16                 \t/* 16 byte alignment of the loop entry */\nL10412:\n\t\t\t/* ---, */\n\t\t\tmovq mm4, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm5, mm4   \t/* save MM4 in MM5 */\n\t\t\t\tadd esi, 2   \t/* move ESI pointer 2 bytes right */\n\t\t\t\tpunpcklbw mm4, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm5, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpsrlw mm4, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm5, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tmovq mm6, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm7, mm6   \t/* save MM6 in MM7 */\n\t\t\t\tsub esi, 2   \t/* move ESI pointer back 2 bytes left */\n\t\t\t\tpunpcklbw mm6, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm7, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpsrlw mm6, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm7, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tadd esi, eax   \t/* move to the next row of Src */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm3, mm2   \t/* save MM2 in MM3 */\n\t\t\t\tadd esi, 2   \t/* move ESI pointer 2 bytes right */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm3, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpsrlw mm2, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm3, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpaddw mm4, mm2   \t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\tpaddw mm5, mm3   \t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\tpaddw mm4, mm2   \t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\tpaddw mm5, mm3   \t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm3, mm2   \t/* save MM2 in MM3 */\n\t\t\t\tsub esi, 2   \t/* move ESI pointer back 2 bytes left */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm3, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpsrlw mm2, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm3, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpaddw mm6, mm2   \t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\tpaddw mm7, mm3   \t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\tpaddw mm6, mm2   \t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\tpaddw mm7, mm3   \t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\tadd esi, eax   \t/* move to the next row of Src */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm3, mm2   \t/* save MM2 in MM3 */\n\t\t\t\tadd esi, 2   \t/* move ESI pointer 2 bytes right */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm3, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpsrlw mm2, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm3, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpaddw mm4, mm2   \t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\tpaddw mm5, mm3   \t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\tmovq mm2, [esi]   \t/* load 8 bytes from Src */\n\t\t\tmovq mm3, mm2   \t/* save MM2 in MM3 */\n\t\t\t\tsub esi, 2   \t/* move ESI pointer back 2 bytes left */\n\t\t\t\tpunpcklbw mm2, mm0   \t/* unpack 4 low  bytes into words */\n\t\t\t\tpunpckhbw mm3, mm0   \t/* unpack 4 high bytes into words */\n\t\t\t\tpsrlw mm2, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpsrlw mm3, mm1   \t/* shift right each pixel NshiftRight times */\n\t\t\t\tpaddw mm6, mm2   \t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\tpaddw mm7, mm3   \t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\t/* ---, */\n\t\t\t\tmovq mm2, mm4   \t/* copy MM4 into MM2 */\n\t\t\t\tpsrlq mm4, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpsubw mm4, mm2   \t/* MM4 = MM4 - MM2 */\n\t\t\t\tmovq mm3, mm6   \t/* copy MM6 into MM3 */\n\t\t\t\tpsrlq mm6, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpsubw mm6, mm3   \t/* MM6 = MM6 - MM3 */\n\t\t\t\tpunpckldq mm4, mm6   \t/* combine 2 words of MM6 and 2 words of MM4 */\n\t\t\t\tmovq mm2, mm5   \t/* copy MM6 into MM2 */\n\t\t\t\tpsrlq mm5, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpsubw mm5, mm2   \t/* MM5 = MM5 - MM2 */\n\t\t\t\tmovq mm3, mm7   \t/* copy MM7 into MM3 */\n\t\t\t\tpsrlq mm7, 32   \t/* shift 2 left words to the right */\n\t\t\t\tpsubw mm7, mm3   \t/* MM7 = MM7 - MM3 */\n\t\t\t\tpunpckldq mm5, mm7   \t/* combine 2 words of MM7 and 2 words of MM5 */\n\t\t\t\t/* Take abs values of MM4 and MM5 */\n\t\t\t\tmovq mm6, mm4   \t/* copy MM4 into MM6 */\n\t\t\t\tmovq mm7, mm5   \t/* copy MM5 into MM7 */\n\t\t\t\tpsraw mm6, 15   \t/* fill MM6 words with word sign bit */\n\t\t\t\tpsraw mm7, 15   \t/* fill MM7 words with word sign bit */\n\t\t\t\tpxor mm4, mm6   \t/* take 1's compliment of only neg words */\n\t\t\t\tpxor mm5, mm7   \t/* take 1's compliment of only neg words */\n\t\t\t\tpsubsw mm4, mm6   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\t\tpsubsw mm5, mm7   \t/* add 1 to only neg words, W-(-1) or W-0 */\n\t\t\t\tpackuswb mm4, mm5   \t/* combine and pack/saturate MM5 and MM4 */\n\t\t\t\tmovq [edi], mm4   \t/* store result in Dest */\n\t\t\t\t/* ---, */\n\t\t\t\tsub esi, eax   \t/* move to the current top row in Src */\n\t\t\t\tsub esi, eax\n\t\t\t\tadd esi, 8   \t/* move Src  pointer to the next 8 pixels */\n\t\t\t\tadd edi, 8   \t/* move Dest pointer to the next 8 pixels */\n\t\t\t\t/* ---, */\n\t\t\t\tdec              ecx    \t/* decrease loop counter COLUMNS */\n\t\t\t\tjnz            L10412    \t/* check loop termination, proceed if required */\n\t\t\t\tmov esi, ebx   \t/* restore most left current row Src  address */\n\t\t\t\tmov edi, edx   \t/* restore most left current row Dest address */\n\t\t\t\tadd esi, eax   \t/* move to the next row in Src */\n\t\t\t\tadd edi, eax   \t/* move to the next row in Dest */\n\t\t\t\tdec rows    \t/* decrease loop counter ROWS */\n\t\t\t\tjnz            L10410    \t/* check loop termination, proceed if required */\n\t\t\t\t/* ---, */\n\t\t\t\temms                      \t/* exit MMX state */\n\t\t\t\tpopa\n\t\t}\n#else\n\t\tasm volatile\n\t\t\t(\"pusha\t\t     \\n\\t\" \"pxor      %%mm0, %%mm0 \\n\\t\"\t/* zero MM0 */\n\t\t\t\"mov          %3, %%eax \\n\\t\"\t/* load columns into EAX */\n\t\t\t\"xor       %%ebx, %%ebx \\n\\t\"\t/* zero EBX */\n\t\t\t\"mov           %4, %%bl \\n\\t\"\t/* load NRightShift into BL */\n\t\t\t\"movd      %%ebx, %%mm1 \\n\\t\"\t/* copy NRightShift into MM1 */\n\t\t\t/* --- */\n\t\t\t\"mov          %1, %%esi \\n\\t\"\t/* ESI = Src row 0 address */\n\t\t\t\"mov          %0, %%edi \\n\\t\"\t/* load Dest address to EDI */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* EDI = EDI + columns */\n\t\t\t\"inc              %%edi \\n\\t\"\t/* 1 byte offset from the left edge */\n\t\t\t/* initialize ROWS counter */\n\t\t\t\"subl            $2, %2 \\n\\t\"\t/* do not use first and last rows */\n\t\t\t/* --- */\n\t\t\t\".L10410:                \\n\\t\" \"mov       %%eax, %%ecx \\n\\t\"\t/* initialize COLUMS counter */\n\t\t\t\"shr          $3, %%ecx \\n\\t\"\t/* EBX/8 (MMX loads 8 bytes at a time) */\n\t\t\t\"mov       %%esi, %%ebx \\n\\t\"\t/* save ESI in EBX */\n\t\t\t\"mov       %%edi, %%edx \\n\\t\"\t/* save EDI in EDX */\n\t\t\t\".align 16              \\n\\t\"\t/* 16 byte alignment of the loop entry */\n\t\t\t\".L10412:               \\n\\t\"\n\t\t\t/* --- */\n\t\t\t\"movq    (%%esi), %%mm4 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm4, %%mm5 \\n\\t\"\t/* save MM4 in MM5 */\n\t\t\t\"add          $2, %%esi \\n\\t\"\t/* move ESI pointer 2 bytes right */\n\t\t\t\"punpcklbw %%mm0, %%mm4 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm5 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"psrlw     %%mm1, %%mm4 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm1, %%mm5 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"movq    (%%esi), %%mm6 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm6, %%mm7 \\n\\t\"\t/* save MM6 in MM7 */\n\t\t\t\"sub          $2, %%esi \\n\\t\"\t/* move ESI pointer back 2 bytes left */\n\t\t\t\"punpcklbw %%mm0, %%mm6 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm7 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"psrlw     %%mm1, %%mm6 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm1, %%mm7 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move to the next row of Src */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm2, %%mm3 \\n\\t\"\t/* save MM2 in MM3 */\n\t\t\t\"add          $2, %%esi \\n\\t\"\t/* move ESI pointer 2 bytes right */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm3 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"psrlw     %%mm1, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm1, %%mm3 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"paddw     %%mm2, %%mm4 \\n\\t\"\t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\"paddw     %%mm3, %%mm5 \\n\\t\"\t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\"paddw     %%mm2, %%mm4 \\n\\t\"\t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\"paddw     %%mm3, %%mm5 \\n\\t\"\t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm2, %%mm3 \\n\\t\"\t/* save MM2 in MM3 */\n\t\t\t\"sub          $2, %%esi \\n\\t\"\t/* move ESI pointer back 2 bytes left */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm3 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"psrlw     %%mm1, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm1, %%mm3 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"paddw     %%mm2, %%mm6 \\n\\t\"\t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\"paddw     %%mm3, %%mm7 \\n\\t\"\t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\"paddw     %%mm2, %%mm6 \\n\\t\"\t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\"paddw     %%mm3, %%mm7 \\n\\t\"\t/* add 4 high bytes to accumolator MM7 */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move to the next row of Src */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm2, %%mm3 \\n\\t\"\t/* save MM2 in MM3 */\n\t\t\t\"add          $2, %%esi \\n\\t\"\t/* move ESI pointer 2 bytes right */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm3 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"psrlw     %%mm1, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm1, %%mm3 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"paddw     %%mm2, %%mm4 \\n\\t\"\t/* add 4 low  bytes to accumolator MM4 */\n\t\t\t\"paddw     %%mm3, %%mm5 \\n\\t\"\t/* add 4 high bytes to accumolator MM5 */\n\t\t\t\"movq    (%%esi), %%mm2 \\n\\t\"\t/* load 8 bytes from Src */\n\t\t\t\"movq      %%mm2, %%mm3 \\n\\t\"\t/* save MM2 in MM3 */\n\t\t\t\"sub          $2, %%esi \\n\\t\"\t/* move ESI pointer back 2 bytes left */\n\t\t\t\"punpcklbw %%mm0, %%mm2 \\n\\t\"\t/* unpack 4 low  bytes into words */\n\t\t\t\"punpckhbw %%mm0, %%mm3 \\n\\t\"\t/* unpack 4 high bytes into words */\n\t\t\t\"psrlw     %%mm1, %%mm2 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"psrlw     %%mm1, %%mm3 \\n\\t\"\t/* shift right each pixel NshiftRight times */\n\t\t\t\"paddw     %%mm2, %%mm6 \\n\\t\"\t/* add 4 low  bytes to accumolator MM6 */\n\t\t\t\"paddw     %%mm3, %%mm7 \\n\\t\"\t/* add 4 high bytes to accumolator MM7 */\n\t\t\t/* --- */\n\t\t\t\"movq      %%mm4, %%mm2 \\n\\t\"\t/* copy MM4 into MM2 */\n\t\t\t\"psrlq       $32, %%mm4 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"psubw     %%mm2, %%mm4 \\n\\t\"\t/* MM4 = MM4 - MM2 */\n\t\t\t\"movq      %%mm6, %%mm3 \\n\\t\"\t/* copy MM6 into MM3 */\n\t\t\t\"psrlq       $32, %%mm6 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"psubw     %%mm3, %%mm6 \\n\\t\"\t/* MM6 = MM6 - MM3 */\n\t\t\t\"punpckldq %%mm6, %%mm4 \\n\\t\"\t/* combine 2 words of MM6 and 2 words of MM4 */\n\t\t\t\"movq      %%mm5, %%mm2 \\n\\t\"\t/* copy MM6 into MM2 */\n\t\t\t\"psrlq       $32, %%mm5 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"psubw     %%mm2, %%mm5 \\n\\t\"\t/* MM5 = MM5 - MM2 */\n\t\t\t\"movq      %%mm7, %%mm3 \\n\\t\"\t/* copy MM7 into MM3 */\n\t\t\t\"psrlq       $32, %%mm7 \\n\\t\"\t/* shift 2 left words to the right */\n\t\t\t\"psubw     %%mm3, %%mm7 \\n\\t\"\t/* MM7 = MM7 - MM3 */\n\t\t\t\"punpckldq %%mm7, %%mm5 \\n\\t\"\t/* combine 2 words of MM7 and 2 words of MM5 */\n\t\t\t/* Take abs values of MM4 and MM5 */\n\t\t\t\"movq      %%mm4, %%mm6 \\n\\t\"\t/* copy MM4 into MM6 */\n\t\t\t\"movq      %%mm5, %%mm7 \\n\\t\"\t/* copy MM5 into MM7 */\n\t\t\t\"psraw       $15, %%mm6 \\n\\t\"\t/* fill MM6 words with word sign bit */\n\t\t\t\"psraw       $15, %%mm7 \\n\\t\"\t/* fill MM7 words with word sign bit */\n\t\t\t\"pxor      %%mm6, %%mm4 \\n\\t\"\t/* take 1's compliment of only neg. words */\n\t\t\t\"pxor      %%mm7, %%mm5 \\n\\t\"\t/* take 1's compliment of only neg. words */\n\t\t\t\"psubsw    %%mm6, %%mm4 \\n\\t\"\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\t\"psubsw    %%mm7, %%mm5 \\n\\t\"\t/* add 1 to only neg. words, W-(-1) or W-0 */\n\t\t\t\"packuswb  %%mm5, %%mm4 \\n\\t\"\t/* combine and pack/saturate MM5 and MM4 */\n\t\t\t\"movq    %%mm4, (%%edi) \\n\\t\"\t/* store result in Dest */\n\t\t\t/* --- */\n\t\t\t\"sub       %%eax, %%esi \\n\\t\"\t/* move to the current top row in Src */\n\t\t\t\"sub       %%eax, %%esi \\n\\t\" \"add $8,          %%esi \\n\\t\"\t/* move Src  pointer to the next 8 pixels */\n\t\t\t\"add $8,          %%edi \\n\\t\"\t/* move Dest pointer to the next 8 pixels */\n\t\t\t/* --- */\n\t\t\t\"dec              %%ecx \\n\\t\"\t/* decrease loop counter COLUMNS */\n\t\t\t\"jnz            .L10412 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t\"mov       %%ebx, %%esi \\n\\t\"\t/* restore most left current row Src  address */\n\t\t\t\"mov       %%edx, %%edi \\n\\t\"\t/* restore most left current row Dest address */\n\t\t\t\"add       %%eax, %%esi \\n\\t\"\t/* move to the next row in Src */\n\t\t\t\"add       %%eax, %%edi \\n\\t\"\t/* move to the next row in Dest */\n\t\t\t\"decl                %2 \\n\\t\"\t/* decrease loop counter ROWS */\n\t\t\t\"jnz            .L10410 \\n\\t\"\t/* check loop termination, proceed if required */\n\t\t\t/* --- */\n\t\t\t\"emms                   \\n\\t\"\t/* exit MMX state */\n\t\t\t\"popa                   \\n\\t\":\"=m\" (Dest)\t/* %0 */\n\t\t\t:\"m\"(Src),\t\t/* %1 */\n\t\t\t\"m\"(rows),\t\t/* %2 */\n\t\t\t\"m\"(columns),\t\t/* %3 */\n\t\t\t\"m\"(NRightShift)\t/* %4 */\n\t\t\t);\n#endif\n#endif\n\t\treturn (0);\n\t} else {\n\t\t/* No non-MMX implementation yet */\n\t\treturn (-1);\n\t}\n}\n\n/*!\n\\brief Align stack to 32 byte boundary,\n*/\nvoid SDL_imageFilterAlignStack(void)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\t\t\t\t/* --- stack alignment --- */\n\t\tmov ebx, esp   \t/* load ESP into EBX */\n\t\t\tsub ebx, 4   \t/* reserve space on stack for old value of ESP */\n\t\t\tand ebx, -32   \t/* align EBX along a 32 byte boundary */\n\t\t\tmov [ebx], esp   \t/* save old value of ESP in stack, behind the bndry */\n\t\t\tmov esp, ebx   \t/* align ESP along a 32 byte boundary */\n\t}\n#else\n\tasm volatile\n\t\t(\t\t\t\t/* --- stack alignment --- */\n\t\t\"mov       %%esp, %%ebx \\n\\t\"\t/* load ESP into EBX */\n\t\t\"sub          $4, %%ebx \\n\\t\"\t/* reserve space on stack for old value of ESP */\n\t\t\"and        $-32, %%ebx \\n\\t\"\t/* align EBX along a 32 byte boundary */\n\t\t\"mov     %%esp, (%%ebx) \\n\\t\"\t/* save old value of ESP in stack, behind the bndry */\n\t\t\"mov       %%ebx, %%esp \\n\\t\"\t/* align ESP along a 32 byte boundary */\n\t\t::);\n#endif\n#endif\n}\n\n/*!\n\\brief Restore previously aligned stack.\n*/\nvoid SDL_imageFilterRestoreStack(void)\n{\n#ifdef USE_MMX\n#if !defined(GCC__)\n\t__asm\n\t{\t\t\t\t/* --- restoring old stack --- */\n\t\tmov ebx, [esp]   \t/* load old value of ESP */\n\t\tmov esp, ebx   \t/* restore old value of ESP */\n\t}\n#else\n\tasm volatile\n\t\t(\t\t\t\t/* --- restoring old stack --- */\n\t\t\"mov     (%%esp), %%ebx \\n\\t\"\t/* load old value of ESP */\n\t\t\"mov       %%ebx, %%esp \\n\\t\"\t/* restore old value of ESP */\n\t\t::);\n#endif\n#endif\n}\n"
  },
  {
    "path": "libs/SDL2_gfx/src/SDL2_rotozoom.c",
    "content": "/*  \n\nSDL2_rotozoom.c: rotozoomer, zoomer and shrinker for 32bit or 8bit surfaces\n\nCopyright (C) 2012-2014  Andreas Schiffler\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n\nAndreas Schiffler -- aschiffler at ferzkopp dot net\n\n*/\n\n#ifdef WIN32\n#include <windows.h>\n#endif\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL2_rotozoom.h\"\n\n/* ---- Internally used structures */\n\n/*!\n\\brief A 32 bit RGBA pixel.\n*/\ntypedef struct tColorRGBA {\n\tUint8 r;\n\tUint8 g;\n\tUint8 b;\n\tUint8 a;\n} tColorRGBA;\n\n/*!\n\\brief A 8bit Y/palette pixel.\n*/\ntypedef struct tColorY {\n\tUint8 y;\n} tColorY;\n\n/*! \n\\brief Returns maximum of two numbers a and b.\n*/\n#define MAX(a,b)    (((a) > (b)) ? (a) : (b))\n\n/*! \n\\brief Number of guard rows added to destination surfaces.\n\nThis is a simple but effective workaround for observed issues.\nThese rows allocate extra memory and are then hidden from the surface.\nRows are added to the end of destination surfaces when they are allocated. \nThis catches any potential overflows which seem to happen with \njust the right src image dimensions and scale/rotation and can lead\nto a situation where the program can segfault.\n*/\n#define GUARD_ROWS (2)\n\n/*!\n\\brief Lower limit of absolute zoom factor or rotation degrees.\n*/\n#define VALUE_LIMIT\t0.001\n\n/*!\n\\brief Returns colorkey info for a surface\n*/\nUint32 _colorkey(SDL_Surface *src)\n{\n\tUint32 key = 0; \n\tSDL_GetColorKey(src, &key);\n\treturn key;\n}\n\n\n/*! \n\\brief Internal 32 bit integer-factor averaging Shrinker.\n\nShrinks 32 bit RGBA/ABGR 'src' surface to 'dst' surface.\nAverages color and alpha values values of src pixels to calculate dst pixels.\nAssumes src and dst surfaces are of 32 bit depth.\nAssumes dst surface was allocated with the correct dimensions.\n\n\\param src The surface to shrink (input).\n\\param dst The shrunken surface (output).\n\\param factorx The horizontal shrinking ratio.\n\\param factory The vertical shrinking ratio.\n\n\\return 0 for success or -1 for error.\n*/\nint _shrinkSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int factorx, int factory)\n{\n\tint x, y, dx, dy, dgap, ra, ga, ba, aa;\n\tint n_average;\n\ttColorRGBA *sp, *osp, *oosp;\n\ttColorRGBA *dp;\n\n\t/*\n\t* Averaging integer shrink\n\t*/\n\n\t/* Precalculate division factor */\n\tn_average = factorx*factory;\n\n\t/*\n\t* Scan destination\n\t*/\n\tsp = (tColorRGBA *) src->pixels;\n\t\n\tdp = (tColorRGBA *) dst->pixels;\n\tdgap = dst->pitch - dst->w * 4;\n\n\tfor (y = 0; y < dst->h; y++) {\n\n\t\tosp=sp;\n\t\tfor (x = 0; x < dst->w; x++) {\n\n\t\t\t/* Trace out source box and accumulate */\n\t\t\toosp=sp;\n\t\t\tra=ga=ba=aa=0;\n\t\t\tfor (dy=0; dy < factory; dy++) {\n\t\t\t\tfor (dx=0; dx < factorx; dx++) {\n\t\t\t\t\tra += sp->r;\n\t\t\t\t\tga += sp->g;\n\t\t\t\t\tba += sp->b;\n\t\t\t\t\taa += sp->a;\n\n\t\t\t\t\tsp++;\n\t\t\t\t} \n\t\t\t\t/* src dx loop */\n\t\t\t\tsp = (tColorRGBA *)((Uint8*)sp + (src->pitch - 4*factorx)); // next y\n\t\t\t}\n\t\t\t/* src dy loop */\n\n\t\t\t/* next box-x */\n\t\t\tsp = (tColorRGBA *)((Uint8*)oosp + 4*factorx);\n\n\t\t\t/* Store result in destination */\n\t\t\tdp->r = ra/n_average;\n\t\t\tdp->g = ga/n_average;\n\t\t\tdp->b = ba/n_average;\n\t\t\tdp->a = aa/n_average;\n\n\t\t\t/*\n\t\t\t* Advance destination pointer \n\t\t\t*/\n\t\t\tdp++;\n\t\t} \n\t\t/* dst x loop */\n\n\t\t/* next box-y */\n\t\tsp = (tColorRGBA *)((Uint8*)osp + src->pitch*factory);\n\n\t\t/*\n\t\t* Advance destination pointers \n\t\t*/\n\t\tdp = (tColorRGBA *) ((Uint8 *) dp + dgap);\n\t} \n\t/* dst y loop */\n\n\treturn (0);\n}\n\n/*! \n\\brief Internal 8 bit integer-factor averaging shrinker.\n\nShrinks 8bit Y 'src' surface to 'dst' surface.\nAverages color (brightness) values values of src pixels to calculate dst pixels.\nAssumes src and dst surfaces are of 8 bit depth.\nAssumes dst surface was allocated with the correct dimensions.\n\n\\param src The surface to shrink (input).\n\\param dst The shrunken surface (output).\n\\param factorx The horizontal shrinking ratio.\n\\param factory The vertical shrinking ratio.\n\n\\return 0 for success or -1 for error.\n*/\nint _shrinkSurfaceY(SDL_Surface * src, SDL_Surface * dst, int factorx, int factory)\n{\n\tint x, y, dx, dy, dgap, a;\n\tint n_average;\n\tUint8 *sp, *osp, *oosp;\n\tUint8 *dp;\n\n\t/*\n\t* Averaging integer shrink\n\t*/\n\n\t/* Precalculate division factor */\n\tn_average = factorx*factory;\n\n\t/*\n\t* Scan destination\n\t*/\n\tsp = (Uint8 *) src->pixels;\n\n\tdp = (Uint8 *) dst->pixels;\n\tdgap = dst->pitch - dst->w;\n\n\tfor (y = 0; y < dst->h; y++) {    \n\n\t\tosp=sp;\n\t\tfor (x = 0; x < dst->w; x++) {\n\n\t\t\t/* Trace out source box and accumulate */\n\t\t\toosp=sp;\n\t\t\ta=0;\n\t\t\tfor (dy=0; dy < factory; dy++) {\n\t\t\t\tfor (dx=0; dx < factorx; dx++) {\n\t\t\t\t\ta += (*sp);\n\t\t\t\t\t/* next x */           \n\t\t\t\t\tsp++;\n\t\t\t\t} \n\t\t\t\t/* end src dx loop */         \n\t\t\t\t/* next y */\n\t\t\t\tsp = (Uint8 *)((Uint8*)sp + (src->pitch - factorx)); \n\t\t\t} \n\t\t\t/* end src dy loop */\n\n\t\t\t/* next box-x */\n\t\t\tsp = (Uint8 *)((Uint8*)oosp + factorx);\n\n\t\t\t/* Store result in destination */\n\t\t\t*dp = a/n_average;\n\n\t\t\t/*\n\t\t\t* Advance destination pointer \n\t\t\t*/\n\t\t\tdp++;\n\t\t} \n\t\t/* end dst x loop */\n\n\t\t/* next box-y */\n\t\tsp = (Uint8 *)((Uint8*)osp + src->pitch*factory);\n\n\t\t/*\n\t\t* Advance destination pointers \n\t\t*/\n\t\tdp = (Uint8 *)((Uint8 *)dp + dgap);\n\t} \n\t/* end dst y loop */\n\n\treturn (0);\n}\n\n/*! \n\\brief Internal 32 bit Zoomer with optional anti-aliasing by bilinear interpolation.\n\nZooms 32 bit RGBA/ABGR 'src' surface to 'dst' surface.\nAssumes src and dst surfaces are of 32 bit depth.\nAssumes dst surface was allocated with the correct dimensions.\n\n\\param src The surface to zoom (input).\n\\param dst The zoomed surface (output).\n\\param flipx Flag indicating if the image should be horizontally flipped.\n\\param flipy Flag indicating if the image should be vertically flipped.\n\\param smooth Antialiasing flag; set to SMOOTHING_ON to enable.\n\n\\return 0 for success or -1 for error.\n*/\nint _zoomSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int flipx, int flipy, int smooth)\n{\n\tint x, y, sx, sy, ssx, ssy, *sax, *say, *csax, *csay, *salast, csx, csy, ex, ey, cx, cy, sstep, sstepx, sstepy;\n\ttColorRGBA *c00, *c01, *c10, *c11;\n\ttColorRGBA *sp, *csp, *dp;\n\tint spixelgap, spixelw, spixelh, dgap, t1, t2;\n\n\t/*\n\t* Allocate memory for row/column increments \n\t*/\n\tif ((sax = (int *) malloc((dst->w + 1) * sizeof(Uint32))) == NULL) {\n\t\treturn (-1);\n\t}\n\tif ((say = (int *) malloc((dst->h + 1) * sizeof(Uint32))) == NULL) {\n\t\tfree(sax);\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Precalculate row increments \n\t*/\n\tspixelw = (src->w - 1);\n\tspixelh = (src->h - 1);\n\tif (smooth) {\n\t\tsx = (int) (65536.0 * (float) spixelw / (float) (dst->w - 1));\n\t\tsy = (int) (65536.0 * (float) spixelh / (float) (dst->h - 1));\n\t} else {\n\t\tsx = (int) (65536.0 * (float) (src->w) / (float) (dst->w));\n\t\tsy = (int) (65536.0 * (float) (src->h) / (float) (dst->h));\n\t}\n\n\t/* Maximum scaled source size */\n\tssx = (src->w << 16) - 1;\n\tssy = (src->h << 16) - 1;\n\n\t/* Precalculate horizontal row increments */\n\tcsx = 0;\n\tcsax = sax;\n\tfor (x = 0; x <= dst->w; x++) {\n\t\t*csax = csx;\n\t\tcsax++;\n\t\tcsx += sx;\n\n\t\t/* Guard from overflows */\n\t\tif (csx > ssx) { \n\t\t\tcsx = ssx; \n\t\t}\n\t}\n\n\t/* Precalculate vertical row increments */\n\tcsy = 0;\n\tcsay = say;\n\tfor (y = 0; y <= dst->h; y++) {\n\t\t*csay = csy;\n\t\tcsay++;\n\t\tcsy += sy;\n\n\t\t/* Guard from overflows */\n\t\tif (csy > ssy) {\n\t\t\tcsy = ssy;\n\t\t}\n\t}\n\n\tsp = (tColorRGBA *) src->pixels;\n\tdp = (tColorRGBA *) dst->pixels;\n\tdgap = dst->pitch - dst->w * 4;\n\tspixelgap = src->pitch/4;\n\n\tif (flipx) sp += spixelw;\n\tif (flipy) sp += (spixelgap * spixelh);\n\n\t/*\n\t* Switch between interpolating and non-interpolating code \n\t*/\n\tif (smooth) {\n\n\t\t/*\n\t\t* Interpolating Zoom \n\t\t*/\n\t\tcsay = say;\n\t\tfor (y = 0; y < dst->h; y++) {\n\t\t\tcsp = sp;\n\t\t\tcsax = sax;\n\t\t\tfor (x = 0; x < dst->w; x++) {\n\t\t\t\t/*\n\t\t\t\t* Setup color source pointers \n\t\t\t\t*/\n\t\t\t\tex = (*csax & 0xffff);\n\t\t\t\tey = (*csay & 0xffff);\n\t\t\t\tcx = (*csax >> 16);\n\t\t\t\tcy = (*csay >> 16);\n\t\t\t\tsstepx = cx < spixelw;\n\t\t\t\tsstepy = cy < spixelh;\n\t\t\t\tc00 = sp;\n\t\t\t\tc01 = sp;\n\t\t\t\tc10 = sp;\n\t\t\t\tif (sstepy) {\n\t\t\t\t\tif (flipy) {\n\t\t\t\t\t\tc10 -= spixelgap;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc10 += spixelgap;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tc11 = c10;\n\t\t\t\tif (sstepx) {\n\t\t\t\t\tif (flipx) {\n\t\t\t\t\t\tc01--;\n\t\t\t\t\t\tc11--;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc01++;\n\t\t\t\t\t\tc11++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t* Draw and interpolate colors \n\t\t\t\t*/\n\t\t\t\tt1 = ((((c01->r - c00->r) * ex) >> 16) + c00->r) & 0xff;\n\t\t\t\tt2 = ((((c11->r - c10->r) * ex) >> 16) + c10->r) & 0xff;\n\t\t\t\tdp->r = (((t2 - t1) * ey) >> 16) + t1;\n\t\t\t\tt1 = ((((c01->g - c00->g) * ex) >> 16) + c00->g) & 0xff;\n\t\t\t\tt2 = ((((c11->g - c10->g) * ex) >> 16) + c10->g) & 0xff;\n\t\t\t\tdp->g = (((t2 - t1) * ey) >> 16) + t1;\n\t\t\t\tt1 = ((((c01->b - c00->b) * ex) >> 16) + c00->b) & 0xff;\n\t\t\t\tt2 = ((((c11->b - c10->b) * ex) >> 16) + c10->b) & 0xff;\n\t\t\t\tdp->b = (((t2 - t1) * ey) >> 16) + t1;\n\t\t\t\tt1 = ((((c01->a - c00->a) * ex) >> 16) + c00->a) & 0xff;\n\t\t\t\tt2 = ((((c11->a - c10->a) * ex) >> 16) + c10->a) & 0xff;\n\t\t\t\tdp->a = (((t2 - t1) * ey) >> 16) + t1;\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t* Advance source pointer x\n\t\t\t\t*/\n\t\t\t\tsalast = csax;\n\t\t\t\tcsax++;\t\t\t\t\n\t\t\t\tsstep = (*csax >> 16) - (*salast >> 16);\n\t\t\t\tif (flipx) {\n\t\t\t\t\tsp -= sstep;\n\t\t\t\t} else {\n\t\t\t\t\tsp += sstep;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t* Advance destination pointer x\n\t\t\t\t*/\n\t\t\t\tdp++;\n\t\t\t}\n\t\t\t/*\n\t\t\t* Advance source pointer y\n\t\t\t*/\n\t\t\tsalast = csay;\n\t\t\tcsay++;\n\t\t\tsstep = (*csay >> 16) - (*salast >> 16);\n\t\t\tsstep *= spixelgap;\n\t\t\tif (flipy) { \n\t\t\t\tsp = csp - sstep;\n\t\t\t} else {\n\t\t\t\tsp = csp + sstep;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t* Advance destination pointer y\n\t\t\t*/\n\t\t\tdp = (tColorRGBA *) ((Uint8 *) dp + dgap);\n\t\t}\n\t} else {\n\t\t/*\n\t\t* Non-Interpolating Zoom \n\t\t*/\t\t\n\t\tcsay = say;\n\t\tfor (y = 0; y < dst->h; y++) {\n\t\t\tcsp = sp;\n\t\t\tcsax = sax;\n\t\t\tfor (x = 0; x < dst->w; x++) {\n\t\t\t\t/*\n\t\t\t\t* Draw \n\t\t\t\t*/\n\t\t\t\t*dp = *sp;\n\n\t\t\t\t/*\n\t\t\t\t* Advance source pointer x\n\t\t\t\t*/\n\t\t\t\tsalast = csax;\n\t\t\t\tcsax++;\t\t\t\t\n\t\t\t\tsstep = (*csax >> 16) - (*salast >> 16);\n\t\t\t\tif (flipx) sstep = -sstep;\n\t\t\t\tsp += sstep;\n\n\t\t\t\t/*\n\t\t\t\t* Advance destination pointer x\n\t\t\t\t*/\n\t\t\t\tdp++;\n\t\t\t}\n\t\t\t/*\n\t\t\t* Advance source pointer y\n\t\t\t*/\n\t\t\tsalast = csay;\n\t\t\tcsay++;\n\t\t\tsstep = (*csay >> 16) - (*salast >> 16);\n\t\t\tsstep *= spixelgap;\n\t\t\tif (flipy) sstep = -sstep;\t\t\t\n\t\t\tsp = csp + sstep;\n\n\t\t\t/*\n\t\t\t* Advance destination pointer y\n\t\t\t*/\n\t\t\tdp = (tColorRGBA *) ((Uint8 *) dp + dgap);\n\t\t}\n\t}\n\n\t/*\n\t* Remove temp arrays \n\t*/\n\tfree(sax);\n\tfree(say);\n\n\treturn (0);\n}\n\n/*! \n\n\\brief Internal 8 bit Zoomer without smoothing.\n\nZooms 8bit palette/Y 'src' surface to 'dst' surface.\nAssumes src and dst surfaces are of 8 bit depth.\nAssumes dst surface was allocated with the correct dimensions.\n\n\\param src The surface to zoom (input).\n\\param dst The zoomed surface (output).\n\\param flipx Flag indicating if the image should be horizontally flipped.\n\\param flipy Flag indicating if the image should be vertically flipped.\n\n\\return 0 for success or -1 for error.\n*/\nint _zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst, int flipx, int flipy)\n{\n\tint x, y;\n\tUint32 *sax, *say, *csax, *csay;\n\tint csx, csy;\n\tUint8 *sp, *dp, *csp;\n\tint dgap;\n\n\t/*\n\t* Allocate memory for row increments \n\t*/\n\tif ((sax = (Uint32 *) malloc((dst->w + 1) * sizeof(Uint32))) == NULL) {\n\t\treturn (-1);\n\t}\n\tif ((say = (Uint32 *) malloc((dst->h + 1) * sizeof(Uint32))) == NULL) {\n\t\tfree(sax);\n\t\treturn (-1);\n\t}\n\n\t/*\n\t* Pointer setup \n\t*/\n\tsp = csp = (Uint8 *) src->pixels;\n\tdp = (Uint8 *) dst->pixels;\n\tdgap = dst->pitch - dst->w;\n\n\tif (flipx) csp += (src->w-1);\n\tif (flipy) csp  = ( (Uint8*)csp + src->pitch*(src->h-1) );\n\n\t/*\n\t* Precalculate row increments \n\t*/\n\tcsx = 0;\n\tcsax = sax;\n\tfor (x = 0; x < dst->w; x++) {\n\t\tcsx += src->w;\n\t\t*csax = 0;\n\t\twhile (csx >= dst->w) {\n\t\t\tcsx -= dst->w;\n\t\t\t(*csax)++;\n\t\t}\n\t\t(*csax) = (*csax) * (flipx ? -1 : 1);\n\t\tcsax++;\n\t}\n\tcsy = 0;\n\tcsay = say;\n\tfor (y = 0; y < dst->h; y++) {\n\t\tcsy += src->h;\n\t\t*csay = 0;\n\t\twhile (csy >= dst->h) {\n\t\t\tcsy -= dst->h;\n\t\t\t(*csay)++;\n\t\t}\n\t\t(*csay) = (*csay) * (flipy ? -1 : 1);\n\t\tcsay++;\n\t}\n\n\t/*\n\t* Draw \n\t*/\n\tcsay = say;\n\tfor (y = 0; y < dst->h; y++) {\n\t\tcsax = sax;\n\t\tsp = csp;\n\t\tfor (x = 0; x < dst->w; x++) {\n\t\t\t/*\n\t\t\t* Draw \n\t\t\t*/\n\t\t\t*dp = *sp;\n\t\t\t/*\n\t\t\t* Advance source pointers \n\t\t\t*/\n\t\t\tsp += (*csax);\n\t\t\tcsax++;\n\t\t\t/*\n\t\t\t* Advance destination pointer \n\t\t\t*/\n\t\t\tdp++;\n\t\t}\n\t\t/*\n\t\t* Advance source pointer (for row) \n\t\t*/\n\t\tcsp += ((*csay) * src->pitch);\n\t\tcsay++;\n\n\t\t/*\n\t\t* Advance destination pointers \n\t\t*/\n\t\tdp += dgap;\n\t}\n\n\t/*\n\t* Remove temp arrays \n\t*/\n\tfree(sax);\n\tfree(say);\n\n\treturn (0);\n}\n\n/*! \n\\brief Internal 32 bit rotozoomer with optional anti-aliasing.\n\nRotates and zooms 32 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control \nparameters by scanning the destination surface and applying optionally anti-aliasing\nby bilinear interpolation.\nAssumes src and dst surfaces are of 32 bit depth.\nAssumes dst surface was allocated with the correct dimensions.\n\n\\param src Source surface.\n\\param dst Destination surface.\n\\param cx Horizontal center coordinate.\n\\param cy Vertical center coordinate.\n\\param isin Integer version of sine of angle.\n\\param icos Integer version of cosine of angle.\n\\param flipx Flag indicating horizontal mirroring should be applied.\n\\param flipy Flag indicating vertical mirroring should be applied.\n\\param smooth Flag indicating anti-aliasing should be used.\n*/\nvoid _transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int flipx, int flipy, int smooth)\n{\n\tint x, y, t1, t2, dx, dy, xd, yd, sdx, sdy, ax, ay, ex, ey, sw, sh;\n\ttColorRGBA c00, c01, c10, c11, cswap;\n\ttColorRGBA *pc, *sp;\n\tint gap;\n\n\t/*\n\t* Variable setup \n\t*/\n\txd = ((src->w - dst->w) << 15);\n\tyd = ((src->h - dst->h) << 15);\n\tax = (cx << 16) - (icos * cx);\n\tay = (cy << 16) - (isin * cx);\n\tsw = src->w - 1;\n\tsh = src->h - 1;\n\tpc = (tColorRGBA*) dst->pixels;\n\tgap = dst->pitch - dst->w * 4;\n\n\t/*\n\t* Switch between interpolating and non-interpolating code \n\t*/\n\tif (smooth) {\n\t\tfor (y = 0; y < dst->h; y++) {\n\t\t\tdy = cy - y;\n\t\t\tsdx = (ax + (isin * dy)) + xd;\n\t\t\tsdy = (ay - (icos * dy)) + yd;\n\t\t\tfor (x = 0; x < dst->w; x++) {\n\t\t\t\tdx = (sdx >> 16);\n\t\t\t\tdy = (sdy >> 16);\n\t\t\t\tif (flipx) dx = sw - dx;\n\t\t\t\tif (flipy) dy = sh - dy;\n\t\t\t\tif ((dx > -1) && (dy > -1) && (dx < (src->w-1)) && (dy < (src->h-1))) {\n\t\t\t\t\tsp = (tColorRGBA *)src->pixels;;\n\t\t\t\t\tsp += ((src->pitch/4) * dy);\n\t\t\t\t\tsp += dx;\n\t\t\t\t\tc00 = *sp;\n\t\t\t\t\tsp += 1;\n\t\t\t\t\tc01 = *sp;\n\t\t\t\t\tsp += (src->pitch/4);\n\t\t\t\t\tc11 = *sp;\n\t\t\t\t\tsp -= 1;\n\t\t\t\t\tc10 = *sp;\n\t\t\t\t\tif (flipx) {\n\t\t\t\t\t\tcswap = c00; c00=c01; c01=cswap;\n\t\t\t\t\t\tcswap = c10; c10=c11; c11=cswap;\n\t\t\t\t\t}\n\t\t\t\t\tif (flipy) {\n\t\t\t\t\t\tcswap = c00; c00=c10; c10=cswap;\n\t\t\t\t\t\tcswap = c01; c01=c11; c11=cswap;\n\t\t\t\t\t}\n\t\t\t\t\t/*\n\t\t\t\t\t* Interpolate colors \n\t\t\t\t\t*/\n\t\t\t\t\tex = (sdx & 0xffff);\n\t\t\t\t\tey = (sdy & 0xffff);\n\t\t\t\t\tt1 = ((((c01.r - c00.r) * ex) >> 16) + c00.r) & 0xff;\n\t\t\t\t\tt2 = ((((c11.r - c10.r) * ex) >> 16) + c10.r) & 0xff;\n\t\t\t\t\tpc->r = (((t2 - t1) * ey) >> 16) + t1;\n\t\t\t\t\tt1 = ((((c01.g - c00.g) * ex) >> 16) + c00.g) & 0xff;\n\t\t\t\t\tt2 = ((((c11.g - c10.g) * ex) >> 16) + c10.g) & 0xff;\n\t\t\t\t\tpc->g = (((t2 - t1) * ey) >> 16) + t1;\n\t\t\t\t\tt1 = ((((c01.b - c00.b) * ex) >> 16) + c00.b) & 0xff;\n\t\t\t\t\tt2 = ((((c11.b - c10.b) * ex) >> 16) + c10.b) & 0xff;\n\t\t\t\t\tpc->b = (((t2 - t1) * ey) >> 16) + t1;\n\t\t\t\t\tt1 = ((((c01.a - c00.a) * ex) >> 16) + c00.a) & 0xff;\n\t\t\t\t\tt2 = ((((c11.a - c10.a) * ex) >> 16) + c10.a) & 0xff;\n\t\t\t\t\tpc->a = (((t2 - t1) * ey) >> 16) + t1;\n\t\t\t\t}\n\t\t\t\tsdx += icos;\n\t\t\t\tsdy += isin;\n\t\t\t\tpc++;\n\t\t\t}\n\t\t\tpc = (tColorRGBA *) ((Uint8 *) pc + gap);\n\t\t}\n\t} else {\n\t\tfor (y = 0; y < dst->h; y++) {\n\t\t\tdy = cy - y;\n\t\t\tsdx = (ax + (isin * dy)) + xd;\n\t\t\tsdy = (ay - (icos * dy)) + yd;\n\t\t\tfor (x = 0; x < dst->w; x++) {\n\t\t\t\tdx = (short) (sdx >> 16);\n\t\t\t\tdy = (short) (sdy >> 16);\n\t\t\t\tif (flipx) dx = (src->w-1)-dx;\n\t\t\t\tif (flipy) dy = (src->h-1)-dy;\n\t\t\t\tif ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) {\n\t\t\t\t\tsp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);\n\t\t\t\t\tsp += dx;\n\t\t\t\t\t*pc = *sp;\n\t\t\t\t}\n\t\t\t\tsdx += icos;\n\t\t\t\tsdy += isin;\n\t\t\t\tpc++;\n\t\t\t}\n\t\t\tpc = (tColorRGBA *) ((Uint8 *) pc + gap);\n\t\t}\n\t}\n}\n\n/*!\n\n\\brief Rotates and zooms 8 bit palette/Y 'src' surface to 'dst' surface without smoothing.\n\nRotates and zooms 8 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control \nparameters by scanning the destination surface.\nAssumes src and dst surfaces are of 8 bit depth.\nAssumes dst surface was allocated with the correct dimensions.\n\n\\param src Source surface.\n\\param dst Destination surface.\n\\param cx Horizontal center coordinate.\n\\param cy Vertical center coordinate.\n\\param isin Integer version of sine of angle.\n\\param icos Integer version of cosine of angle.\n\\param flipx Flag indicating horizontal mirroring should be applied.\n\\param flipy Flag indicating vertical mirroring should be applied.\n*/\nvoid transformSurfaceY(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int flipx, int flipy)\n{\n\tint x, y, dx, dy, xd, yd, sdx, sdy, ax, ay;\n\ttColorY *pc, *sp;\n\tint gap;\n\n\t/*\n\t* Variable setup \n\t*/\n\txd = ((src->w - dst->w) << 15);\n\tyd = ((src->h - dst->h) << 15);\n\tax = (cx << 16) - (icos * cx);\n\tay = (cy << 16) - (isin * cx);\n\tpc = (tColorY*) dst->pixels;\n\tgap = dst->pitch - dst->w;\n\t/*\n\t* Clear surface to colorkey \n\t*/ \t\n\tmemset(pc, (int)(_colorkey(src) & 0xff), dst->pitch * dst->h);\n\t/*\n\t* Iterate through destination surface \n\t*/\n\tfor (y = 0; y < dst->h; y++) {\n\t\tdy = cy - y;\n\t\tsdx = (ax + (isin * dy)) + xd;\n\t\tsdy = (ay - (icos * dy)) + yd;\n\t\tfor (x = 0; x < dst->w; x++) {\n\t\t\tdx = (short) (sdx >> 16);\n\t\t\tdy = (short) (sdy >> 16);\n\t\t\tif (flipx) dx = (src->w-1)-dx;\n\t\t\tif (flipy) dy = (src->h-1)-dy;\n\t\t\tif ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) {\n\t\t\t\tsp = (tColorY *) (src->pixels);\n\t\t\t\tsp += (src->pitch * dy + dx);\n\t\t\t\t*pc = *sp;\n\t\t\t}\n\t\t\tsdx += icos;\n\t\t\tsdy += isin;\n\t\t\tpc++;\n\t\t}\n\t\tpc += gap;\n\t}\n}\n\n/*!\n\\brief Rotates a 8/16/24/32 bit surface in increments of 90 degrees.\n\nSpecialized 90 degree rotator which rotates a 'src' surface in 90 degree \nincrements clockwise returning a new surface. Faster than rotozoomer since\nno scanning or interpolation takes place. Input surface must be 8/16/24/32 bit.\n(code contributed by J. Schiller, improved by C. Allport and A. Schiffler)\n\n\\param src Source surface to rotate.\n\\param numClockwiseTurns Number of clockwise 90 degree turns to apply to the source.\n\n\\returns The new, rotated surface; or NULL for surfaces with incorrect input format.\n*/\nSDL_Surface* rotateSurface90Degrees(SDL_Surface* src, int numClockwiseTurns) \n{\n\tint row, col, newWidth, newHeight;\n\tint bpp, bpr;\n\tSDL_Surface* dst;\n\tUint8* srcBuf;\n\tUint8* dstBuf;\n\tint normalizedClockwiseTurns;\n\n\t/* Has to be a valid surface pointer and be a Nbit surface where n is divisible by 8 */\n\tif (!src || \n\t    !src->format) {\n\t\tSDL_SetError(\"NULL source surface or source surface format\");\n\t    return NULL; \n\t}\n\n\tif ((src->format->BitsPerPixel % 8) != 0) {\n\t\tSDL_SetError(\"Invalid source surface bit depth\");\n\t    return NULL; \n\t}\n\n\t/* normalize numClockwiseTurns */\n\tnormalizedClockwiseTurns = (numClockwiseTurns % 4);\n\tif (normalizedClockwiseTurns < 0) {\n\t\tnormalizedClockwiseTurns += 4;\n\t}\n\n\t/* If turns are even, our new width/height will be the same as the source surface */\n\tif (normalizedClockwiseTurns % 2) {\n\t\tnewWidth = src->h;\n\t\tnewHeight = src->w;\n\t} else {\n\t\tnewWidth = src->w;\n\t\tnewHeight = src->h;\n\t}\n\n\tdst = SDL_CreateRGBSurface( src->flags, newWidth, newHeight, src->format->BitsPerPixel,\n\t\tsrc->format->Rmask,\n\t\tsrc->format->Gmask, \n\t\tsrc->format->Bmask, \n\t\tsrc->format->Amask);\n\tif(!dst) {\n\t\tSDL_SetError(\"Could not create destination surface\"); \n\t\treturn NULL;\n\t}\n\n\tif (SDL_MUSTLOCK(src)) {\n\t\tSDL_LockSurface(src);\n\t}\n\tif (SDL_MUSTLOCK(dst)) {\n\t\tSDL_LockSurface(dst);\n\t}\n\n\t/* Calculate byte-per-pixel */\n\tbpp = src->format->BitsPerPixel / 8;\n\n\tswitch(normalizedClockwiseTurns) {\n\tcase 0: /* Make a copy of the surface */\n\t\t{\n\t\t\t/* Unfortunately SDL_BlitSurface cannot be used to make a copy of the surface\n\t\t\tsince it does not preserve alpha. */\n\n\t\t\tif (src->pitch == dst->pitch) {\n\t\t\t\t/* If the pitch is the same for both surfaces, the memory can be copied all at once. */\n\t\t\t\tmemcpy(dst->pixels, src->pixels, (src->h * src->pitch));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* If the pitch differs, copy each row separately */\n\t\t\t\tsrcBuf = (Uint8*)(src->pixels);\n\t\t\t\tdstBuf = (Uint8*)(dst->pixels);\n\t\t\t\tbpr = src->w * bpp;\n\t\t\t\tfor (row = 0; row < src->h; row++) {\n\t\t\t\t\tmemcpy(dstBuf, srcBuf, bpr);\n\t\t\t\t\tsrcBuf += src->pitch;\n\t\t\t\t\tdstBuf += dst->pitch;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\t/* rotate clockwise */\n\tcase 1: /* rotated 90 degrees clockwise */\n\t\t{\n\t\t\tfor (row = 0; row < src->h; ++row) {\n\t\t\t\tsrcBuf = (Uint8*)(src->pixels) + (row * src->pitch);\n\t\t\t\tdstBuf = (Uint8*)(dst->pixels) + (dst->w - row - 1) * bpp;\n\t\t\t\tfor (col = 0; col < src->w; ++col) {\n\t\t\t\t\tmemcpy (dstBuf, srcBuf, bpp);\n\t\t\t\t\tsrcBuf += bpp;\n\t\t\t\t\tdstBuf += dst->pitch;\n\t\t\t\t} \n\t\t\t} \n\t\t}\n\t\tbreak;\n\n\tcase 2: /* rotated 180 degrees clockwise */\n\t\t{\n\t\t\tfor (row = 0; row < src->h; ++row) {\n\t\t\t\tsrcBuf = (Uint8*)(src->pixels) + (row * src->pitch);\n\t\t\t\tdstBuf = (Uint8*)(dst->pixels) + ((dst->h - row - 1) * dst->pitch) + (dst->w - 1) * bpp;\n\t\t\t\tfor (col = 0; col < src->w; ++col) {\n\t\t\t\t\tmemcpy (dstBuf, srcBuf, bpp);\n\t\t\t\t\tsrcBuf += bpp;\n\t\t\t\t\tdstBuf -= bpp;\n\t\t\t\t} \n\t\t\t} \n\t\t}\n\t\tbreak;\n\n\tcase 3: /* rotated 270 degrees clockwise */\n\t\t{\n\t\t\tfor (row = 0; row < src->h; ++row) {\n\t\t\t\tsrcBuf = (Uint8*)(src->pixels) + (row * src->pitch);\n\t\t\t\tdstBuf = (Uint8*)(dst->pixels) + (row * bpp) + ((dst->h - 1) * dst->pitch);\n\t\t\t\tfor (col = 0; col < src->w; ++col) {\n\t\t\t\t\tmemcpy (dstBuf, srcBuf, bpp);\n\t\t\t\t\tsrcBuf += bpp;\n\t\t\t\t\tdstBuf -= dst->pitch;\n\t\t\t\t} \n\t\t\t} \n\t\t}\n\t\tbreak;\n\t} \n\t/* end switch */\n\n\tif (SDL_MUSTLOCK(src)) {\n\t\tSDL_UnlockSurface(src);\n\t}\n\tif (SDL_MUSTLOCK(dst)) {\n\t\tSDL_UnlockSurface(dst);\n\t}\n\n\treturn dst;\n}\n\n\n/*!\n\\brief Internal target surface sizing function for rotozooms with trig result return. \n\n\\param width The source surface width.\n\\param height The source surface height.\n\\param angle The angle to rotate in degrees.\n\\param zoomx The horizontal scaling factor.\n\\param zoomy The vertical scaling factor.\n\\param dstwidth The calculated width of the destination surface.\n\\param dstheight The calculated height of the destination surface.\n\\param canglezoom The sine of the angle adjusted by the zoom factor.\n\\param sanglezoom The cosine of the angle adjusted by the zoom factor.\n\n*/\nvoid _rotozoomSurfaceSizeTrig(int width, int height, double angle, double zoomx, double zoomy, \n\tint *dstwidth, int *dstheight, \n\tdouble *canglezoom, double *sanglezoom)\n{\n\tdouble x, y, cx, cy, sx, sy;\n\tdouble radangle;\n\tint dstwidthhalf, dstheighthalf;\n\n\t/*\n\t* Determine destination width and height by rotating a centered source box \n\t*/\n\tradangle = angle * (M_PI / 180.0);\n\t*sanglezoom = sin(radangle);\n\t*canglezoom = cos(radangle);\n\t*sanglezoom *= zoomx;\n\t*canglezoom *= zoomy;\n\tx = (double)(width / 2);\n\ty = (double)(height / 2);\n\tcx = *canglezoom * x;\n\tcy = *canglezoom * y;\n\tsx = *sanglezoom * x;\n\tsy = *sanglezoom * y;\n\n\tdstwidthhalf = MAX((int)\n\t\tceil(MAX(MAX(MAX(fabs(cx + sy), fabs(cx - sy)), fabs(-cx + sy)), fabs(-cx - sy))), 1);\n\tdstheighthalf = MAX((int)\n\t\tceil(MAX(MAX(MAX(fabs(sx + cy), fabs(sx - cy)), fabs(-sx + cy)), fabs(-sx - cy))), 1);\n\t*dstwidth = 2 * dstwidthhalf;\n\t*dstheight = 2 * dstheighthalf;\n}\n\n/*! \n\\brief Returns the size of the resulting target surface for a rotozoomSurfaceXY() call. \n\n\\param width The source surface width.\n\\param height The source surface height.\n\\param angle The angle to rotate in degrees.\n\\param zoomx The horizontal scaling factor.\n\\param zoomy The vertical scaling factor.\n\\param dstwidth The calculated width of the rotozoomed destination surface.\n\\param dstheight The calculated height of the rotozoomed destination surface.\n*/\nvoid rotozoomSurfaceSizeXY(int width, int height, double angle, double zoomx, double zoomy, int *dstwidth, int *dstheight)\n{\n\tdouble dummy_sanglezoom, dummy_canglezoom;\n\n\t_rotozoomSurfaceSizeTrig(width, height, angle, zoomx, zoomy, dstwidth, dstheight, &dummy_sanglezoom, &dummy_canglezoom);\n}\n\n/*! \n\\brief Returns the size of the resulting target surface for a rotozoomSurface() call. \n\n\\param width The source surface width.\n\\param height The source surface height.\n\\param angle The angle to rotate in degrees.\n\\param zoom The scaling factor.\n\\param dstwidth The calculated width of the rotozoomed destination surface.\n\\param dstheight The calculated height of the rotozoomed destination surface.\n*/\nvoid rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight)\n{\n\tdouble dummy_sanglezoom, dummy_canglezoom;\n\n\t_rotozoomSurfaceSizeTrig(width, height, angle, zoom, zoom, dstwidth, dstheight, &dummy_sanglezoom, &dummy_canglezoom);\n}\n\n/*!\n\\brief Rotates and zooms a surface and optional anti-aliasing. \n\nRotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.\n'angle' is the rotation in degrees and 'zoom' a scaling factor. If 'smooth' is set\nthen the destination 32bit surface is anti-aliased. If the surface is not 8bit\nor 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.\n\n\\param src The surface to rotozoom.\n\\param angle The angle to rotate in degrees.\n\\param zoom The scaling factor.\n\\param smooth Antialiasing flag; set to SMOOTHING_ON to enable.\n\n\\return The new rotozoomed surface.\n*/\nSDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth)\n{\n\treturn rotozoomSurfaceXY(src, angle, zoom, zoom, smooth);\n}\n\n/*!\n\\brief Rotates and zooms a surface with different horizontal and vertival scaling factors and optional anti-aliasing. \n\nRotates and zooms a 32bit or 8bit 'src' surface to newly created 'dst' surface.\n'angle' is the rotation in degrees, 'zoomx and 'zoomy' scaling factors. If 'smooth' is set\nthen the destination 32bit surface is anti-aliased. If the surface is not 8bit\nor 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.\n\n\\param src The surface to rotozoom.\n\\param angle The angle to rotate in degrees.\n\\param zoomx The horizontal scaling factor.\n\\param zoomy The vertical scaling factor.\n\\param smooth Antialiasing flag; set to SMOOTHING_ON to enable.\n\n\\return The new rotozoomed surface.\n*/\nSDL_Surface *rotozoomSurfaceXY(SDL_Surface * src, double angle, double zoomx, double zoomy, int smooth)\n{\n\tSDL_Surface *rz_src;\n\tSDL_Surface *rz_dst;\n\tdouble zoominv;\n\tdouble sanglezoom, canglezoom, sanglezoominv, canglezoominv;\n\tint dstwidthhalf, dstwidth, dstheighthalf, dstheight;\n\tint is32bit;\n\tint i, src_converted;\n\tint flipx,flipy;\n\n\t/*\n\t* Sanity check \n\t*/\n\tif (src == NULL) {\n\t\treturn (NULL);\n\t}\n\n\t/*\n\t* Determine if source surface is 32bit or 8bit \n\t*/\n\tis32bit = (src->format->BitsPerPixel == 32);\n\tif ((is32bit) || (src->format->BitsPerPixel == 8)) {\n\t\t/*\n\t\t* Use source surface 'as is' \n\t\t*/\n\t\trz_src = src;\n\t\tsrc_converted = 0;\n\t} else {\n\t\t/*\n\t\t* New source surface is 32bit with a defined RGBA ordering \n\t\t*/\n\t\trz_src =\n\t\t\tSDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, \n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n\t\t\t0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000\n#else\n\t\t\t0xff000000,  0x00ff0000, 0x0000ff00, 0x000000ff\n#endif\n\t\t\t);\n\n\t\tSDL_BlitSurface(src, NULL, rz_src, NULL);\n\n\t\tsrc_converted = 1;\n\t\tis32bit = 1;\n\t}\n\n\t/*\n\t* Sanity check zoom factor \n\t*/\n\tflipx = (zoomx<0.0);\n\tif (flipx) zoomx=-zoomx;\n\tflipy = (zoomy<0.0);\n\tif (flipy) zoomy=-zoomy;\n\tif (zoomx < VALUE_LIMIT) zoomx = VALUE_LIMIT;\n\tif (zoomy < VALUE_LIMIT) zoomy = VALUE_LIMIT;\n\tzoominv = 65536.0 / (zoomx * zoomx);\n\n\t/*\n\t* Check if we have a rotozoom or just a zoom \n\t*/\n\tif (fabs(angle) > VALUE_LIMIT) {\n\n\t\t/*\n\t\t* Angle!=0: full rotozoom \n\t\t*/\n\t\t/*\n\t\t* ----------------------- \n\t\t*/\n\n\t\t/* Determine target size */\n\t\t_rotozoomSurfaceSizeTrig(rz_src->w, rz_src->h, angle, zoomx, zoomy, &dstwidth, &dstheight, &canglezoom, &sanglezoom);\n\n\t\t/*\n\t\t* Calculate target factors from sin/cos and zoom \n\t\t*/\n\t\tsanglezoominv = sanglezoom;\n\t\tcanglezoominv = canglezoom;\n\t\tsanglezoominv *= zoominv;\n\t\tcanglezoominv *= zoominv;\n\n\t\t/* Calculate half size */\n\t\tdstwidthhalf = dstwidth / 2;\n\t\tdstheighthalf = dstheight / 2;\n\n\t\t/*\n\t\t* Alloc space to completely contain the rotated surface \n\t\t*/\n\t\trz_dst = NULL;\n\t\tif (is32bit) {\n\t\t\t/*\n\t\t\t* Target surface is 32bit with source RGBA/ABGR ordering \n\t\t\t*/\n\t\t\trz_dst =\n\t\t\t\tSDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32,\n\t\t\t\trz_src->format->Rmask, rz_src->format->Gmask,\n\t\t\t\trz_src->format->Bmask, rz_src->format->Amask);\n\t\t} else {\n\t\t\t/*\n\t\t\t* Target surface is 8bit \n\t\t\t*/\n\t\t\trz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0);\n\t\t}\n\n\t\t/* Check target */\n\t\tif (rz_dst == NULL)\n\t\t\treturn NULL;\n\n\t\t/* Adjust for guard rows */\n\t\trz_dst->h = dstheight;\n\n\t\t/*\n\t\t* Lock source surface \n\t\t*/\n\t\tif (SDL_MUSTLOCK(rz_src)) {\n\t\t\tSDL_LockSurface(rz_src);\n\t\t}\n\n\t\t/*\n\t\t* Check which kind of surface we have \n\t\t*/\n\t\tif (is32bit) {\n\t\t\t/*\n\t\t\t* Call the 32bit transformation routine to do the rotation (using alpha) \n\t\t\t*/\n\t\t\t_transformSurfaceRGBA(rz_src, rz_dst, dstwidthhalf, dstheighthalf,\n\t\t\t\t(int) (sanglezoominv), (int) (canglezoominv), \n\t\t\t\tflipx, flipy,\n\t\t\t\tsmooth);\n\t\t} else {\n\t\t\t/*\n\t\t\t* Copy palette and colorkey info \n\t\t\t*/\n\t\t\tfor (i = 0; i < rz_src->format->palette->ncolors; i++) {\n\t\t\t\trz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i];\n\t\t\t}\n\t\t\trz_dst->format->palette->ncolors = rz_src->format->palette->ncolors;\n\t\t\t/*\n\t\t\t* Call the 8bit transformation routine to do the rotation \n\t\t\t*/\n\t\t\ttransformSurfaceY(rz_src, rz_dst, dstwidthhalf, dstheighthalf,\n\t\t\t\t(int) (sanglezoominv), (int) (canglezoominv),\n\t\t\t\tflipx, flipy);\n\t\t}\n\t\t/*\n\t\t* Unlock source surface \n\t\t*/\n\t\tif (SDL_MUSTLOCK(rz_src)) {\n\t\t\tSDL_UnlockSurface(rz_src);\n\t\t}\n\n\t} else {\n\n\t\t/*\n\t\t* Angle=0: Just a zoom \n\t\t*/\n\t\t/*\n\t\t* -------------------- \n\t\t*/\n\n\t\t/*\n\t\t* Calculate target size\n\t\t*/\n\t\tzoomSurfaceSize(rz_src->w, rz_src->h, zoomx, zoomy, &dstwidth, &dstheight);\n\n\t\t/*\n\t\t* Alloc space to completely contain the zoomed surface \n\t\t*/\n\t\trz_dst = NULL;\n\t\tif (is32bit) {\n\t\t\t/*\n\t\t\t* Target surface is 32bit with source RGBA/ABGR ordering \n\t\t\t*/\n\t\t\trz_dst =\n\t\t\t\tSDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32,\n\t\t\t\trz_src->format->Rmask, rz_src->format->Gmask,\n\t\t\t\trz_src->format->Bmask, rz_src->format->Amask);\n\t\t} else {\n\t\t\t/*\n\t\t\t* Target surface is 8bit \n\t\t\t*/\n\t\t\trz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0);\n\t\t}\n\n\t\t/* Check target */\n\t\tif (rz_dst == NULL)\n\t\t\treturn NULL;\n\n\t\t/* Adjust for guard rows */\n\t\trz_dst->h = dstheight;\n\n\t\t/*\n\t\t* Lock source surface \n\t\t*/\n\t\tif (SDL_MUSTLOCK(rz_src)) {\n\t\t\tSDL_LockSurface(rz_src);\n\t\t}\n\n\t\t/*\n\t\t* Check which kind of surface we have \n\t\t*/\n\t\tif (is32bit) {\n\t\t\t/*\n\t\t\t* Call the 32bit transformation routine to do the zooming (using alpha) \n\t\t\t*/\n\t\t\t_zoomSurfaceRGBA(rz_src, rz_dst, flipx, flipy, smooth);\n\n\t\t} else {\n\t\t\t/*\n\t\t\t* Copy palette and colorkey info \n\t\t\t*/\n\t\t\tfor (i = 0; i < rz_src->format->palette->ncolors; i++) {\n\t\t\t\trz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i];\n\t\t\t}\n\t\t\trz_dst->format->palette->ncolors = rz_src->format->palette->ncolors;\n\n\t\t\t/*\n\t\t\t* Call the 8bit transformation routine to do the zooming \n\t\t\t*/\n\t\t\t_zoomSurfaceY(rz_src, rz_dst, flipx, flipy);\n\t\t}\n\n\t\t/*\n\t\t* Unlock source surface \n\t\t*/\n\t\tif (SDL_MUSTLOCK(rz_src)) {\n\t\t\tSDL_UnlockSurface(rz_src);\n\t\t}\n\t}\n\n\t/*\n\t* Cleanup temp surface \n\t*/\n\tif (src_converted) {\n\t\tSDL_FreeSurface(rz_src);\n\t}\n\n\t/*\n\t* Return destination surface \n\t*/\n\treturn (rz_dst);\n}\n\n/*!\n\\brief Calculates the size of the target surface for a zoomSurface() call.\n\nThe minimum size of the target surface is 1. The input factors can be positive or negative.\n\n\\param width The width of the source surface to zoom.\n\\param height The height of the source surface to zoom.\n\\param zoomx The horizontal zoom factor.\n\\param zoomy The vertical zoom factor.\n\\param dstwidth Pointer to an integer to store the calculated width of the zoomed target surface.\n\\param dstheight Pointer to an integer to store the calculated height of the zoomed target surface.\n*/\nvoid zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight)\n{\n\t/*\n\t* Make zoom factors positive \n\t*/\n\tint flipx, flipy;\n\tflipx = (zoomx<0.0);\n\tif (flipx) zoomx = -zoomx;\n\tflipy = (zoomy<0.0);\n\tif (flipy) zoomy = -zoomy;\n\n\t/*\n\t* Sanity check zoom factors \n\t*/\n\tif (zoomx < VALUE_LIMIT) {\n\t\tzoomx = VALUE_LIMIT;\n\t}\n\tif (zoomy < VALUE_LIMIT) {\n\t\tzoomy = VALUE_LIMIT;\n\t}\n\n\t/*\n\t* Calculate target size \n\t*/\n\t*dstwidth = (int) floor(((double) width * zoomx) + 0.5);\n\t*dstheight = (int) floor(((double) height * zoomy) + 0.5);\n\tif (*dstwidth < 1) {\n\t\t*dstwidth = 1;\n\t}\n\tif (*dstheight < 1) {\n\t\t*dstheight = 1;\n\t}\n}\n\n/*! \n\\brief Zoom a surface by independent horizontal and vertical factors with optional smoothing.\n\nZooms a 32bit or 8bit 'src' surface to newly created 'dst' surface.\n'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is on\nthen the destination 32bit surface is anti-aliased. If the surface is not 8bit\nor 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.\nIf zoom factors are negative, the image is flipped on the axes.\n\n\\param src The surface to zoom.\n\\param zoomx The horizontal zoom factor.\n\\param zoomy The vertical zoom factor.\n\\param smooth Antialiasing flag; set to SMOOTHING_ON to enable.\n\n\\return The new, zoomed surface.\n*/\nSDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth)\n{\n\tSDL_Surface *rz_src;\n\tSDL_Surface *rz_dst;\n\tint dstwidth, dstheight;\n\tint is32bit;\n\tint i, src_converted;\n\tint flipx, flipy;\n\n\t/*\n\t* Sanity check \n\t*/\n\tif (src == NULL)\n\t\treturn (NULL);\n\n\t/*\n\t* Determine if source surface is 32bit or 8bit \n\t*/\n\tis32bit = (src->format->BitsPerPixel == 32);\n\tif ((is32bit) || (src->format->BitsPerPixel == 8)) {\n\t\t/*\n\t\t* Use source surface 'as is' \n\t\t*/\n\t\trz_src = src;\n\t\tsrc_converted = 0;\n\t} else {\n\t\t/*\n\t\t* New source surface is 32bit with a defined RGBA ordering \n\t\t*/\n\t\trz_src =\n\t\t\tSDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, \n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n\t\t\t0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000\n#else\n\t\t\t0xff000000,  0x00ff0000, 0x0000ff00, 0x000000ff\n#endif\n\t\t\t);\n\t\tif (rz_src == NULL) {\n\t\t\treturn NULL;\n\t\t}\n\t\tSDL_BlitSurface(src, NULL, rz_src, NULL);\n\t\tsrc_converted = 1;\n\t\tis32bit = 1;\n\t}\n\n\tflipx = (zoomx<0.0);\n\tif (flipx) zoomx = -zoomx;\n\tflipy = (zoomy<0.0);\n\tif (flipy) zoomy = -zoomy;\n\n\t/* Get size if target */\n\tzoomSurfaceSize(rz_src->w, rz_src->h, zoomx, zoomy, &dstwidth, &dstheight);\n\n\t/*\n\t* Alloc space to completely contain the zoomed surface \n\t*/\n\trz_dst = NULL;\n\tif (is32bit) {\n\t\t/*\n\t\t* Target surface is 32bit with source RGBA/ABGR ordering \n\t\t*/\n\t\trz_dst =\n\t\t\tSDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32,\n\t\t\trz_src->format->Rmask, rz_src->format->Gmask,\n\t\t\trz_src->format->Bmask, rz_src->format->Amask);\n\t} else {\n\t\t/*\n\t\t* Target surface is 8bit \n\t\t*/\n\t\trz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0);\n\t}\n\n\t/* Check target */\n\tif (rz_dst == NULL) {\n\t\t/*\n\t\t* Cleanup temp surface \n\t\t*/\n\t\tif (src_converted) {\n\t\t\tSDL_FreeSurface(rz_src);\n\t\t}\t\t\n\t\treturn NULL;\n\t}\n\n\t/* Adjust for guard rows */\n\trz_dst->h = dstheight;\n\n\t/*\n\t* Lock source surface \n\t*/\n\tif (SDL_MUSTLOCK(rz_src)) {\n\t\tSDL_LockSurface(rz_src);\n\t}\n\n\t/*\n\t* Check which kind of surface we have \n\t*/\n\tif (is32bit) {\n\t\t/*\n\t\t* Call the 32bit transformation routine to do the zooming (using alpha) \n\t\t*/\n\t\t_zoomSurfaceRGBA(rz_src, rz_dst, flipx, flipy, smooth);\n\t} else {\n\t\t/*\n\t\t* Copy palette and colorkey info \n\t\t*/\n\t\tfor (i = 0; i < rz_src->format->palette->ncolors; i++) {\n\t\t\trz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i];\n\t\t}\n\t\trz_dst->format->palette->ncolors = rz_src->format->palette->ncolors;\n\t\t/*\n\t\t* Call the 8bit transformation routine to do the zooming \n\t\t*/\n\t\t_zoomSurfaceY(rz_src, rz_dst, flipx, flipy);\n\t}\n\t/*\n\t* Unlock source surface \n\t*/\n\tif (SDL_MUSTLOCK(rz_src)) {\n\t\tSDL_UnlockSurface(rz_src);\n\t}\n\n\t/*\n\t* Cleanup temp surface \n\t*/\n\tif (src_converted) {\n\t\tSDL_FreeSurface(rz_src);\n\t}\n\n\t/*\n\t* Return destination surface \n\t*/\n\treturn (rz_dst);\n}\n\n/*! \n\\brief Shrink a surface by an integer ratio using averaging.\n\nShrinks a 32bit or 8bit 'src' surface to a newly created 'dst' surface.\n'factorx' and 'factory' are the shrinking ratios (i.e. 2=1/2 the size,\n3=1/3 the size, etc.) The destination surface is antialiased by averaging\nthe source box RGBA or Y information. If the surface is not 8bit\nor 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.\nThe input surface is not modified. The output surface is newly allocated.\n\n\\param src The surface to shrink.\n\\param factorx The horizontal shrinking ratio.\n\\param factory The vertical shrinking ratio.\n\n\\return The new, shrunken surface.\n*/\n/*@null@*/ \nSDL_Surface *shrinkSurface(SDL_Surface *src, int factorx, int factory)\n{\n\tint result;\n\tSDL_Surface *rz_src;\n\tSDL_Surface *rz_dst = NULL;\n\tint dstwidth, dstheight;\n\tint is32bit;\n\tint i, src_converted;\n\tint haveError = 0;\n\n\t/*\n\t* Sanity check \n\t*/\n\tif (src == NULL) {\n\t\treturn (NULL);\n\t}\n\n\t/*\n\t* Determine if source surface is 32bit or 8bit \n\t*/\n\tis32bit = (src->format->BitsPerPixel == 32);\n\tif ((is32bit) || (src->format->BitsPerPixel == 8)) {\n\t\t/*\n\t\t* Use source surface 'as is' \n\t\t*/\n\t\trz_src = src;\n\t\tsrc_converted = 0;\n\t} else {\n\t\t/*\n\t\t* New source surface is 32bit with a defined RGBA ordering \n\t\t*/\n\t\trz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, \n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n\t\t\t0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000\n#else\n\t\t\t0xff000000,  0x00ff0000, 0x0000ff00, 0x000000ff\n#endif\n\t\t\t);\n\t\tif (rz_src==NULL) {\n\t\t\thaveError = 1;\n\t\t\tgoto exitShrinkSurface;\n\t\t}\n\n\t\tSDL_BlitSurface(src, NULL, rz_src, NULL);\n\t\tsrc_converted = 1;\n\t\tis32bit = 1;\n\t}\n\n\t/*\n\t* Lock the surface \n\t*/\n\tif (SDL_MUSTLOCK(rz_src)) {\n\t\tif (SDL_LockSurface(rz_src) < 0) {\n\t\t\thaveError = 1;\n\t\t\tgoto exitShrinkSurface;\n\t\t}\n\t}\n\n\t/* Get size for target */\n\tdstwidth=rz_src->w/factorx;\n\twhile (dstwidth*factorx>rz_src->w) { dstwidth--; }\n\tdstheight=rz_src->h/factory;\n\twhile (dstheight*factory>rz_src->h) { dstheight--; }\n\n\t/*\n\t* Alloc space to completely contain the shrunken surface\n\t* (with added guard rows)\n\t*/\n\tif (is32bit==1) {\n\t\t/*\n\t\t* Target surface is 32bit with source RGBA/ABGR ordering \n\t\t*/\n\t\trz_dst =\n\t\t\tSDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32,\n\t\t\trz_src->format->Rmask, rz_src->format->Gmask,\n\t\t\trz_src->format->Bmask, rz_src->format->Amask);\n\t} else {\n\t\t/*\n\t\t* Target surface is 8bit \n\t\t*/\n\t\trz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0);\n\t}\n\n\t/* Check target */\n\tif (rz_dst == NULL) {\n\t\thaveError = 1;\n\t\tgoto exitShrinkSurface;\n\t}\n\n\t/* Adjust for guard rows */\n\trz_dst->h = dstheight;\n\n\t/*\n\t* Check which kind of surface we have \n\t*/\n\tif (is32bit==1) {\n\t\t/*\n\t\t* Call the 32bit transformation routine to do the shrinking (using alpha) \n\t\t*/\n\t\tresult = _shrinkSurfaceRGBA(rz_src, rz_dst, factorx, factory);\t\t\n\t\tif ((result!=0) || (rz_dst==NULL)) {\n\t\t\thaveError = 1;\n\t\t\tgoto exitShrinkSurface;\n\t\t}\n\t} else {\n\t\t/*\n\t\t* Copy palette and colorkey info \n\t\t*/\n\t\tfor (i = 0; i < rz_src->format->palette->ncolors; i++) {\n\t\t\trz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i];\n\t\t}\n\t\trz_dst->format->palette->ncolors = rz_src->format->palette->ncolors;\n\t\t/*\n\t\t* Call the 8bit transformation routine to do the shrinking \n\t\t*/\n\t\tresult = _shrinkSurfaceY(rz_src, rz_dst, factorx, factory);\n\t\tif (result!=0) {\n\t\t\thaveError = 1;\n\t\t\tgoto exitShrinkSurface;\n\t\t}\n\t}\n\nexitShrinkSurface:\n\tif (rz_src!=NULL) {\n\t\t/*\n\t\t* Unlock source surface \n\t\t*/\n\t\tif (SDL_MUSTLOCK(rz_src)) {\n\t\t\tSDL_UnlockSurface(rz_src);\n\t\t}\n\n\t\t/*\n\t\t* Cleanup temp surface \n\t\t*/\n\t\tif (src_converted==1) {\n\t\t\tSDL_FreeSurface(rz_src);\n\t\t}\n\t}\n\n\t/* Check error state; maybe need to cleanup destination */\n\tif (haveError==1) {\n\t\tif (rz_dst!=NULL) {\n\t\t\tSDL_FreeSurface(rz_dst);\n\t\t}\n\t\trz_dst=NULL;\n\t} \n\n\t/*\n\t* Return destination surface \n\t*/\n\treturn (rz_dst);\n}\n"
  },
  {
    "path": "libs/SDL2_image/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\nproject(SDL2_image)\n\n# Creates and names a library, sets it as either STATIC\n# or SHARED, and provides the relative paths to its source code.\n# You can define multiple libraries, and CMake builds them for you.\n# Gradle automatically packages shared libraries with your APK.\n\nfind_library( # Sets the name of the path variable.\n        GLESv1_CM\n\n        # Specifies the name of the NDK library that\n        # you want CMake to locate.\n        GLESv1_CM )\n\nfind_library(\n        GLESv2\n        GLESv2\n)\n\nfind_library(\n        android\n        android\n)\n\nfind_library(\n        log\n        log\n)\n\ninclude_directories(\n        include\n        ${CMAKE_CURRENT_SOURCE_DIR}/../SDL2_png/include\n        ${CMAKE_CURRENT_SOURCE_DIR}/../SDL2_jpeg/include\n)\n\nadd_definitions(-DGL_GLEXT_PROTOTYPES -DLOAD_XPM -DLOAD_PNG -DLOAD_JPG)\n\nadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../SDL2_png/ ${CMAKE_CURRENT_SOURCE_DIR}/../SDL2_png/)\nadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../SDL2_jpeg/ ${CMAKE_CURRENT_SOURCE_DIR}/../SDL2_jpeg/)\n\nadd_library( # Sets the name of the library.\n        SDL2_image\n\n        # Sets the library as a shared library.\n        SHARED\n\n\n\n        src/IMG.c\n        src/IMG_gif.c\n        src/IMG_png.c\n        src/IMG_bmp.c\n        src/IMG_xxx.c\n        src/IMG_pcx.c\n        src/IMG_xv.c\n        src/IMG_jpg.c\n        src/IMG_xpm.c\n        src/IMG_webp.c\n        src/IMG_tga.c\n        src/IMG_tif.c\n        src/showimage.c\n        src/IMG_xcf.c\n        src/IMG_pnm.c\n        src/IMG_lbm.c\n\n\n        )\n\n\ntarget_link_libraries(\n        SDL2_image\n        SDL2_png\n        SDL2_jpeg\n        SDL2\n        GLESv1_CM\n        GLESv2\n        android\n        log\n        )"
  },
  {
    "path": "libs/SDL2_image/build.gradle",
    "content": "apply plugin: 'com.android.model.native'\n\nmodel {\n    android {\n        compileSdkVersion = gradle.sdkVersion\n        buildToolsVersion = gradle.buildToolsVersion\n\n        defaultConfig {\n            minSdkVersion.apiLevel = gradle.minSdkVersion\n            versionCode = 1\n            versionName = '1.0'\n        }\n        ndk {\n            moduleName = 'SDL2_image'\n            ldLibs.addAll([\"GLESv1_CM\", \"EGL\", \"GLESv2\", \"log\", \"android\", \"dl\"])\n            CFlags.addAll([\"-DGL_GLEXT_PROTOTYPES\"])\n            CFlags.addAll([\"-I\" + file(\"include/\").absolutePath,\n                           \"-DGL_GLEXT_PROTOTYPES\",\n                           \"-DLOAD_JPG\",\n                           \"-DLOAD_PNG\",\n                           \"-DLOAD_XPM\"\n            ])\n        }\n\n        sources {\n            main {\n                jni {\n                    dependencies {\n                        project ':SDL2' linkage 'shared'\n                        project ':SDL2_jpeg' linkage 'shared'\n                        project ':SDL2_png' linkage 'shared'\n                    }\n                    exportedHeaders {\n                        srcDir \"../SDL2/include\"\n                        srcDir \"../SDL2_jpeg/include\"\n                        srcDir \"../SDL2_png/include\"\n                    }\n                    source {\n                        srcDir \"src\"\n\n                    }\n                }\n            }\n        }\n\n    }\n}\n\ntask distributeLib(type : Copy) {\n    dependsOn assemble\n    into gradle.libDistributionRoot +'/SDL2_image/'\n    from('build/outputs/native/release/lib') {\n        into 'lib/'\n    }\n}\n"
  },
  {
    "path": "libs/SDL2_image/cmake_install.cmake",
    "content": "# Install script for directory: C:/is-Engine/libs/SDL2_image\n\n# Set the install prefix\nif(NOT DEFINED CMAKE_INSTALL_PREFIX)\n  set(CMAKE_INSTALL_PREFIX \"C:/Program Files (x86)/Project\")\nendif()\nstring(REGEX REPLACE \"/$\" \"\" CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")\n\n# Set the install configuration name.\nif(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)\n  if(BUILD_TYPE)\n    string(REGEX REPLACE \"^[^A-Za-z0-9_]+\" \"\"\n           CMAKE_INSTALL_CONFIG_NAME \"${BUILD_TYPE}\")\n  else()\n    set(CMAKE_INSTALL_CONFIG_NAME \"Release\")\n  endif()\n  message(STATUS \"Install configuration: \\\"${CMAKE_INSTALL_CONFIG_NAME}\\\"\")\nendif()\n\n# Set the component getting installed.\nif(NOT CMAKE_INSTALL_COMPONENT)\n  if(COMPONENT)\n    message(STATUS \"Install component: \\\"${COMPONENT}\\\"\")\n    set(CMAKE_INSTALL_COMPONENT \"${COMPONENT}\")\n  else()\n    set(CMAKE_INSTALL_COMPONENT)\n  endif()\nendif()\n\n# Install shared libraries without execute permission?\nif(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n  set(CMAKE_INSTALL_SO_NO_EXE \"0\")\nendif()\n\n# Is this installation the result of a crosscompile?\nif(NOT DEFINED CMAKE_CROSSCOMPILING)\n  set(CMAKE_CROSSCOMPILING \"TRUE\")\nendif()\n\nif(NOT CMAKE_INSTALL_LOCAL_ONLY)\n  # Include the install script for each subdirectory.\n  include(\"C:/is-Engine/libs/SDL2_png/cmake_install.cmake\")\n  include(\"C:/is-Engine/libs/SDL2_jpeg/cmake_install.cmake\")\n\nendif()\n\n"
  },
  {
    "path": "libs/SDL2_image/include/SDL_image.h",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* A simple library to load images of various formats as SDL surfaces */\n\n#ifndef _SDL_IMAGE_H\n#define _SDL_IMAGE_H\n\n#include \"SDL.h\"\n#include \"SDL_version.h\"\n#include \"begin_code.h\"\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Printable format: \"%d.%d.%d\", MAJOR, MINOR, PATCHLEVEL\n*/\n#define SDL_IMAGE_MAJOR_VERSION 2\n#define SDL_IMAGE_MINOR_VERSION 0\n#define SDL_IMAGE_PATCHLEVEL    1\n\n/* This macro can be used to fill a version structure with the compile-time\n * version of the SDL_image library.\n */\n#define SDL_IMAGE_VERSION(X)                        \\\n{                                                   \\\n    (X)->major = SDL_IMAGE_MAJOR_VERSION;           \\\n    (X)->minor = SDL_IMAGE_MINOR_VERSION;           \\\n    (X)->patch = SDL_IMAGE_PATCHLEVEL;              \\\n}\n\n/* This function gets the version of the dynamically linked SDL_image library.\n   it should NOT be used to fill a version structure, instead you should\n   use the SDL_IMAGE_VERSION() macro.\n */\nextern DECLSPEC const SDL_version * SDLCALL IMG_Linked_Version(void);\n\ntypedef enum\n{\n    IMG_INIT_JPG = 0x00000001,\n    IMG_INIT_PNG = 0x00000002,\n    IMG_INIT_TIF = 0x00000004,\n    IMG_INIT_WEBP = 0x00000008\n} IMG_InitFlags;\n\n/* Loads dynamic libraries and prepares them for use.  Flags should be\n   one or more flags from IMG_InitFlags OR'd together.\n   It returns the flags successfully initialized, or 0 on failure.\n */\nextern DECLSPEC int SDLCALL IMG_Init(int flags);\n\n/* Unloads libraries loaded with IMG_Init */\nextern DECLSPEC void SDLCALL IMG_Quit(void);\n\n/* Load an image from an SDL data source.\n   The 'type' may be one of: \"BMP\", \"GIF\", \"PNG\", etc.\n\n   If the image format supports a transparent pixel, SDL will set the\n   colorkey for the surface.  You can enable RLE acceleration on the\n   surface afterwards by calling:\n    SDL_SetColorKey(image, SDL_RLEACCEL, image->format->colorkey);\n */\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, const char *type);\n/* Convenience functions */\nextern DECLSPEC SDL_Surface * SDLCALL IMG_Load(const char *file);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_Load_RW(SDL_RWops *src, int freesrc);\n\n#if SDL_VERSION_ATLEAST(2,0,0)\n/* Load an image directly into a render texture.\n */\nextern DECLSPEC SDL_Texture * SDLCALL IMG_LoadTexture(SDL_Renderer *renderer, const char *file);\nextern DECLSPEC SDL_Texture * SDLCALL IMG_LoadTexture_RW(SDL_Renderer *renderer, SDL_RWops *src, int freesrc);\nextern DECLSPEC SDL_Texture * SDLCALL IMG_LoadTextureTyped_RW(SDL_Renderer *renderer, SDL_RWops *src, int freesrc, const char *type);\n#endif /* SDL 2.0 */\n\n/* Functions to detect a file type, given a seekable source */\nextern DECLSPEC int SDLCALL IMG_isICO(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isCUR(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isBMP(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isGIF(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isJPG(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isLBM(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isPCX(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isPNG(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isPNM(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isTIF(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isXCF(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isXPM(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isXV(SDL_RWops *src);\nextern DECLSPEC int SDLCALL IMG_isWEBP(SDL_RWops *src);\n\n/* Individual loading functions */\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadICO_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadCUR_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadBMP_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadGIF_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadJPG_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadLBM_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadPCX_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNG_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNM_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadTGA_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadTIF_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadXCF_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadXPM_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadXV_RW(SDL_RWops *src);\nextern DECLSPEC SDL_Surface * SDLCALL IMG_LoadWEBP_RW(SDL_RWops *src);\n\nextern DECLSPEC SDL_Surface * SDLCALL IMG_ReadXPMFromArray(char **xpm);\n\n/* Individual saving functions */\nextern DECLSPEC int SDLCALL IMG_SavePNG(SDL_Surface *surface, const char *file);\nextern DECLSPEC int SDLCALL IMG_SavePNG_RW(SDL_Surface *surface, SDL_RWops *dst, int freedst);\n\n/* We'll use SDL for reporting errors */\n#define IMG_SetError    SDL_SetError\n#define IMG_GetError    SDL_GetError\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_IMAGE_H */\n"
  },
  {
    "path": "libs/SDL2_image/include/miniz.h",
    "content": "/* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing\n   See \"unlicense\" statement at the end of this file.\n   Rich Geldreich <richgel99@gmail.com>, last updated Oct. 13, 2013\n   Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt\n\n   Most API's defined in miniz.c are optional. For example, to disable the archive related functions just define\n   MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO (see the list below for more macros).\n\n   * Change History\n     10/13/13 v1.15 r4 - Interim bugfix release while I work on the next major release with Zip64 support (almost there!):\n       - Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug (thanks kahmyong.moon@hp.com) which could cause locate files to not find files. This bug\n        would only have occured in earlier versions if you explicitly used this flag, OR if you used mz_zip_extract_archive_file_to_heap() or mz_zip_add_mem_to_archive_file_in_place()\n        (which used this flag). If you can't switch to v1.15 but want to fix this bug, just remove the uses of this flag from both helper funcs (and of course don't use the flag).\n       - Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when pUser_read_buf is not NULL and compressed size is > uncompressed size\n       - Fixing mz_zip_reader_extract_*() funcs so they don't try to extract compressed data from directory entries, to account for weird zipfiles which contain zero-size compressed data on dir entries.\n         Hopefully this fix won't cause any issues on weird zip archives, because it assumes the low 16-bits of zip external attributes are DOS attributes (which I believe they always are in practice).\n       - Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the internal attributes, just the filename and external attributes\n       - mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed\n       - Added cmake support for Linux builds which builds all the examples, tested with clang v3.3 and gcc v4.6.\n       - Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti\n       - Merged MZ_FORCEINLINE fix from hdeanclark\n       - Fix <time.h> include before config #ifdef, thanks emil.brink\n       - Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping (super useful for OpenGL apps), and explicit control over the compression level (so you can\n        set it to 1 for real-time compression).\n       - Merged in some compiler fixes from paulharris's github repro.\n       - Retested this build under Windows (VS 2010, including static analysis), tcc  0.9.26, gcc v4.6 and clang v3.3.\n       - Added example6.c, which dumps an image of the mandelbrot set to a PNG file.\n       - Modified example2 to help test the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more.\n       - In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix possible src file fclose() leak if alignment bytes+local header file write faiiled\n       - In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader(): Was pushing the wrong central dir header offset, appears harmless in this release, but it became a problem in the zip64 branch\n     5/20/12 v1.14 - MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE, #include <time.h> (thanks fermtect).\n     5/19/12 v1.13 - From jason@cornsyrup.org and kelwert@mtu.edu - Fix mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit.\n       - Temporarily/locally slammed in \"typedef unsigned long mz_ulong\" and re-ran a randomized regression test on ~500k files.\n       - Eliminated a bunch of warnings when compiling with GCC 32-bit/64.\n       - Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze (static analysis) option and fixed all warnings (except for the silly\n        \"Use of the comma-operator in a tested expression..\" analysis warning, which I purposely use to work around a MSVC compiler warning).\n       - Created 32-bit and 64-bit Codeblocks projects/workspace. Built and tested Linux executables. The codeblocks workspace is compatible with Linux+Win32/x64.\n       - Added miniz_tester solution/project, which is a useful little app derived from LZHAM's tester app that I use as part of the regression test.\n       - Ran miniz.c and tinfl.c through another series of regression testing on ~500,000 files and archives.\n       - Modified example5.c so it purposely disables a bunch of high-level functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the MINIZ_NO_STDIO bug report.)\n       - Fix ftell() usage in examples so they exit with an error on files which are too large (a limitation of the examples, not miniz itself).\n     4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple minor level_and_flags issues in the archive API's.\n      level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce Dawson <bruced@valvesoftware.com> for the feedback/bug report.\n     5/28/11 v1.11 - Added statement from unlicense.org\n     5/27/11 v1.10 - Substantial compressor optimizations:\n      - Level 1 is now ~4x faster than before. The L1 compressor's throughput now varies between 70-110MB/sec. on a\n      - Core i7 (actual throughput varies depending on the type of data, and x64 vs. x86).\n      - Improved baseline L2-L9 compression perf. Also, greatly improved compression perf. issues on some file types.\n      - Refactored the compression code for better readability and maintainability.\n      - Added level 10 compression level (L10 has slightly better ratio than level 9, but could have a potentially large\n       drop in throughput on some files).\n     5/15/11 v1.09 - Initial stable release.\n\n   * Low-level Deflate/Inflate implementation notes:\n\n     Compression: Use the \"tdefl\" API's. The compressor supports raw, static, and dynamic blocks, lazy or\n     greedy parsing, match length filtering, RLE-only, and Huffman-only streams. It performs and compresses\n     approximately as well as zlib.\n\n     Decompression: Use the \"tinfl\" API's. The entire decompressor is implemented as a single function\n     coroutine: see tinfl_decompress(). It supports decompression into a 32KB (or larger power of 2) wrapping buffer, or into a memory\n     block large enough to hold the entire file.\n\n     The low-level tdefl/tinfl API's do not make any use of dynamic memory allocation.\n\n   * zlib-style API notes:\n\n     miniz.c implements a fairly large subset of zlib. There's enough functionality present for it to be a drop-in\n     zlib replacement in many apps:\n        The z_stream struct, optional memory allocation callbacks\n        deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound\n        inflateInit/inflateInit2/inflate/inflateEnd\n        compress, compress2, compressBound, uncompress\n        CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly routines.\n        Supports raw deflate streams or standard zlib streams with adler-32 checking.\n\n     Limitations:\n      The callback API's are not implemented yet. No support for gzip headers or zlib static dictionaries.\n      I've tried to closely emulate zlib's various flavors of stream flushing and return status codes, but\n      there are no guarantees that miniz.c pulls this off perfectly.\n\n   * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function, originally written by\n     Alex Evans. Supports 1-4 bytes/pixel images.\n\n   * ZIP archive API notes:\n\n     The ZIP archive API's where designed with simplicity and efficiency in mind, with just enough abstraction to\n     get the job done with minimal fuss. There are simple API's to retrieve file information, read files from\n     existing archives, create new archives, append new files to existing archives, or clone archive data from\n     one archive to another. It supports archives located in memory or the heap, on disk (using stdio.h),\n     or you can specify custom file read/write callbacks.\n\n     - Archive reading: Just call this function to read a single file from a disk archive:\n\n      void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name,\n        size_t *pSize, mz_uint zip_flags);\n\n     For more complex cases, use the \"mz_zip_reader\" functions. Upon opening an archive, the entire central\n     directory is located and read as-is into memory, and subsequent file access only occurs when reading individual files.\n\n     - Archives file scanning: The simple way is to use this function to scan a loaded archive for a specific file:\n\n     int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags);\n\n     The locate operation can optionally check file comments too, which (as one example) can be used to identify\n     multiple versions of the same file in an archive. This function uses a simple linear search through the central\n     directory, so it's not very fast.\n\n     Alternately, you can iterate through all the files in an archive (using mz_zip_reader_get_num_files()) and\n     retrieve detailed info on each file by calling mz_zip_reader_file_stat().\n\n     - Archive creation: Use the \"mz_zip_writer\" functions. The ZIP writer immediately writes compressed file data\n     to disk and builds an exact image of the central directory in memory. The central directory image is written\n     all at once at the end of the archive file when the archive is finalized.\n\n     The archive writer can optionally align each file's local header and file data to any power of 2 alignment,\n     which can be useful when the archive will be read from optical media. Also, the writer supports placing\n     arbitrary data blobs at the very beginning of ZIP archives. Archives written using either feature are still\n     readable by any ZIP tool.\n\n     - Archive appending: The simple way to add a single file to an archive is to call this function:\n\n      mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name,\n        const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);\n\n     The archive will be created if it doesn't already exist, otherwise it'll be appended to.\n     Note the appending is done in-place and is not an atomic operation, so if something goes wrong\n     during the operation it's possible the archive could be left without a central directory (although the local\n     file headers and file data will be fine, so the archive will be recoverable).\n\n     For more complex archive modification scenarios:\n     1. The safest way is to use a mz_zip_reader to read the existing archive, cloning only those bits you want to\n     preserve into a new archive using using the mz_zip_writer_add_from_zip_reader() function (which compiles the\n     compressed file data as-is). When you're done, delete the old archive and rename the newly written archive, and\n     you're done. This is safe but requires a bunch of temporary disk space or heap memory.\n\n     2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using mz_zip_writer_init_from_reader(),\n     append new files as needed, then finalize the archive which will write an updated central directory to the\n     original archive. (This is basically what mz_zip_add_mem_to_archive_file_in_place() does.) There's a\n     possibility that the archive's central directory could be lost with this method if anything goes wrong, though.\n\n     - ZIP archive support limitations:\n     No zip64 or spanning support. Extraction functions can only handle unencrypted, stored or deflated files.\n     Requires streams capable of seeking.\n\n   * This is a header file library, like stb_image.c. To get only a header file, either cut and paste the\n     below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then include miniz.c from it.\n\n   * Important: For best perf. be sure to customize the below macros for your target platform:\n     #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1\n     #define MINIZ_LITTLE_ENDIAN 1\n     #define MINIZ_HAS_64BIT_REGISTERS 1\n\n   * On platforms using glibc, Be sure to \"#define _LARGEFILE64_SOURCE 1\" before including miniz.c to ensure miniz\n     uses the 64-bit variants: fopen64(), stat64(), etc. Otherwise you won't be able to process large files\n     (i.e. 32-bit stat() fails for me on files > 0x7FFFFFFF bytes).\n*/\n\n#ifndef MINIZ_HEADER_INCLUDED\n#define MINIZ_HEADER_INCLUDED\n\n#include <stdlib.h>\n\n// Defines to completely disable specific portions of miniz.c:\n// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl.\n\n// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O.\n#define MINIZ_NO_STDIO\n\n// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or\n// get/set file times, and the C run-time funcs that get/set times won't be called.\n// The current downside is the times written to your archives will be from 1979.\n#define MINIZ_NO_TIME\n\n// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's.\n#define MINIZ_NO_ARCHIVE_APIS\n\n// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's.\n#define MINIZ_NO_ARCHIVE_WRITING_APIS\n\n// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's.\n#define MINIZ_NO_ZLIB_APIS\n\n// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib.\n#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES\n\n// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc.\n// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc\n// callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user\n// functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work.\n//#define MINIZ_NO_MALLOC\n#define MINIZ_SDL_MALLOC\n\n// Define MINIZ_STATIC_FUNCTIONS to make all functions static. You probably\n// want this if you're using miniz in a library\n#define MINIZ_STATIC_FUNCTIONS\n\n#if defined(__TINYC__) && (defined(__linux) || defined(__linux__))\n  // TODO: Work around \"error: include file 'sys\\utime.h' when compiling with tcc on Linux\n  #define MINIZ_NO_TIME\n#endif\n\n#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS)\n  #include <time.h>\n#endif\n\n#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__)\n// MINIZ_X86_OR_X64_CPU is only used to help set the below macros.\n#define MINIZ_X86_OR_X64_CPU 1\n#endif\n\n#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU\n// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian.\n#define MINIZ_LITTLE_ENDIAN 1\n#endif\n\n#if MINIZ_X86_OR_X64_CPU\n// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses.\n#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1\n#endif\n\n#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__)\n// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions).\n#define MINIZ_HAS_64BIT_REGISTERS 1\n#endif\n\n#ifdef MINIZ_STATIC_FUNCTIONS\n#define MINIZ_STATIC static\n#else\n#define MINIZ_STATIC\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// ------------------- zlib-style API Definitions.\n\n// For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits!\ntypedef unsigned long mz_ulong;\n\n// mz_free() internally uses the MZ_FREE() macro (which by default calls free() unless you've modified the MZ_MALLOC macro) to release a block allocated from the heap.\nMINIZ_STATIC void mz_free(void *p);\n\n#define MZ_ADLER32_INIT (1)\n// mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL.\nMINIZ_STATIC mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len);\n\n#define MZ_CRC32_INIT (0)\n// mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL.\nMINIZ_STATIC mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len);\n\n// Compression strategies.\nenum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 };\n\n// Method\n#define MZ_DEFLATED 8\n\n#ifndef MINIZ_NO_ZLIB_APIS\n\n// Heap allocation callbacks.\n// Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long.\ntypedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size);\ntypedef void (*mz_free_func)(void *opaque, void *address);\ntypedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size);\n\n#define MZ_VERSION          \"9.1.15\"\n#define MZ_VERNUM           0x91F0\n#define MZ_VER_MAJOR        9\n#define MZ_VER_MINOR        1\n#define MZ_VER_REVISION     15\n#define MZ_VER_SUBREVISION  0\n\n// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs).\nenum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 };\n\n// Return status codes. MZ_PARAM_ERROR is non-standard.\nenum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 };\n\n// Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL.\nenum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 };\n\n// Window bits\n#define MZ_DEFAULT_WINDOW_BITS 15\n\nstruct mz_internal_state;\n\n// Compression/decompression stream struct.\ntypedef struct mz_stream_s\n{\n  const unsigned char *next_in;     // pointer to next byte to read\n  unsigned int avail_in;            // number of bytes available at next_in\n  mz_ulong total_in;                // total number of bytes consumed so far\n\n  unsigned char *next_out;          // pointer to next byte to write\n  unsigned int avail_out;           // number of bytes that can be written to next_out\n  mz_ulong total_out;               // total number of bytes produced so far\n\n  char *msg;                        // error msg (unused)\n  struct mz_internal_state *state;  // internal state, allocated by zalloc/zfree\n\n  mz_alloc_func zalloc;             // optional heap allocation function (defaults to malloc)\n  mz_free_func zfree;               // optional heap free function (defaults to free)\n  void *opaque;                     // heap alloc function user pointer\n\n  int data_type;                    // data_type (unused)\n  mz_ulong adler;                   // adler32 of the source or uncompressed data\n  mz_ulong reserved;                // not used\n} mz_stream;\n\ntypedef mz_stream *mz_streamp;\n\n// Returns the version string of miniz.c.\nMINIZ_STATIC const char *mz_version(void);\n\n// mz_deflateInit() initializes a compressor with default options:\n// Parameters:\n//  pStream must point to an initialized mz_stream struct.\n//  level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION].\n//  level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio.\n//  (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.)\n// Return values:\n//  MZ_OK on success.\n//  MZ_STREAM_ERROR if the stream is bogus.\n//  MZ_PARAM_ERROR if the input parameters are bogus.\n//  MZ_MEM_ERROR on out of memory.\nMINIZ_STATIC int mz_deflateInit(mz_streamp pStream, int level);\n\n// mz_deflateInit2() is like mz_deflate(), except with more control:\n// Additional parameters:\n//   method must be MZ_DEFLATED\n//   window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer)\n//   mem_level must be between [1, 9] (it's checked but ignored by miniz.c)\nMINIZ_STATIC int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy);\n\n// Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2().\nMINIZ_STATIC int mz_deflateReset(mz_streamp pStream);\n\n// mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible.\n// Parameters:\n//   pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members.\n//   flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH.\n// Return values:\n//   MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full).\n//   MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore.\n//   MZ_STREAM_ERROR if the stream is bogus.\n//   MZ_PARAM_ERROR if one of the parameters is invalid.\n//   MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.)\nMINIZ_STATIC int mz_deflate(mz_streamp pStream, int flush);\n\n// mz_deflateEnd() deinitializes a compressor:\n// Return values:\n//  MZ_OK on success.\n//  MZ_STREAM_ERROR if the stream is bogus.\nMINIZ_STATIC int mz_deflateEnd(mz_streamp pStream);\n\n// mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH.\nMINIZ_STATIC mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len);\n\n// Single-call compression functions mz_compress() and mz_compress2():\n// Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure.\nMINIZ_STATIC int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len);\nMINIZ_STATIC int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level);\n\n// mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress().\nMINIZ_STATIC mz_ulong mz_compressBound(mz_ulong source_len);\n\n// Initializes a decompressor.\nMINIZ_STATIC int mz_inflateInit(mz_streamp pStream);\n\n// mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer:\n// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate).\nMINIZ_STATIC int mz_inflateInit2(mz_streamp pStream, int window_bits);\n\n// Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible.\n// Parameters:\n//   pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members.\n//   flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH.\n//   On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster).\n//   MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data.\n// Return values:\n//   MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full.\n//   MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified.\n//   MZ_STREAM_ERROR if the stream is bogus.\n//   MZ_DATA_ERROR if the deflate stream is invalid.\n//   MZ_PARAM_ERROR if one of the parameters is invalid.\n//   MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again\n//   with more input data, or with more room in the output buffer (except when using single call decompression, described above).\nMINIZ_STATIC int mz_inflate(mz_streamp pStream, int flush);\n\n// Deinitializes a decompressor.\nMINIZ_STATIC int mz_inflateEnd(mz_streamp pStream);\n\n// Single-call decompression.\n// Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure.\nMINIZ_STATIC int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len);\n\n// Returns a string description of the specified error code, or NULL if the error code is invalid.\nMINIZ_STATIC const char *mz_error(int err);\n\n// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports.\n// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project.\n#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES\n  typedef unsigned char Byte;\n  typedef unsigned int uInt;\n  typedef mz_ulong uLong;\n  typedef Byte Bytef;\n  typedef uInt uIntf;\n  typedef char charf;\n  typedef int intf;\n  typedef void *voidpf;\n  typedef uLong uLongf;\n  typedef void *voidp;\n  typedef void *const voidpc;\n  #define Z_NULL                0\n  #define Z_NO_FLUSH            MZ_NO_FLUSH\n  #define Z_PARTIAL_FLUSH       MZ_PARTIAL_FLUSH\n  #define Z_SYNC_FLUSH          MZ_SYNC_FLUSH\n  #define Z_FULL_FLUSH          MZ_FULL_FLUSH\n  #define Z_FINISH              MZ_FINISH\n  #define Z_BLOCK               MZ_BLOCK\n  #define Z_OK                  MZ_OK\n  #define Z_STREAM_END          MZ_STREAM_END\n  #define Z_NEED_DICT           MZ_NEED_DICT\n  #define Z_ERRNO               MZ_ERRNO\n  #define Z_STREAM_ERROR        MZ_STREAM_ERROR\n  #define Z_DATA_ERROR          MZ_DATA_ERROR\n  #define Z_MEM_ERROR           MZ_MEM_ERROR\n  #define Z_BUF_ERROR           MZ_BUF_ERROR\n  #define Z_VERSION_ERROR       MZ_VERSION_ERROR\n  #define Z_PARAM_ERROR         MZ_PARAM_ERROR\n  #define Z_NO_COMPRESSION      MZ_NO_COMPRESSION\n  #define Z_BEST_SPEED          MZ_BEST_SPEED\n  #define Z_BEST_COMPRESSION    MZ_BEST_COMPRESSION\n  #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION\n  #define Z_DEFAULT_STRATEGY    MZ_DEFAULT_STRATEGY\n  #define Z_FILTERED            MZ_FILTERED\n  #define Z_HUFFMAN_ONLY        MZ_HUFFMAN_ONLY\n  #define Z_RLE                 MZ_RLE\n  #define Z_FIXED               MZ_FIXED\n  #define Z_DEFLATED            MZ_DEFLATED\n  #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS\n  #define alloc_func            mz_alloc_func\n  #define free_func             mz_free_func\n  #define internal_state        mz_internal_state\n  #define z_stream              mz_stream\n  #define deflateInit           mz_deflateInit\n  #define deflateInit2          mz_deflateInit2\n  #define deflateReset          mz_deflateReset\n  #define deflate               mz_deflate\n  #define deflateEnd            mz_deflateEnd\n  #define deflateBound          mz_deflateBound\n  #define compress              mz_compress\n  #define compress2             mz_compress2\n  #define compressBound         mz_compressBound\n  #define inflateInit           mz_inflateInit\n  #define inflateInit2          mz_inflateInit2\n  #define inflate               mz_inflate\n  #define inflateEnd            mz_inflateEnd\n  #define uncompress            mz_uncompress\n  #define crc32                 mz_crc32\n  #define adler32               mz_adler32\n  #define MAX_WBITS             15\n  #define MAX_MEM_LEVEL         9\n  #define zError                mz_error\n  #define ZLIB_VERSION          MZ_VERSION\n  #define ZLIB_VERNUM           MZ_VERNUM\n  #define ZLIB_VER_MAJOR        MZ_VER_MAJOR\n  #define ZLIB_VER_MINOR        MZ_VER_MINOR\n  #define ZLIB_VER_REVISION     MZ_VER_REVISION\n  #define ZLIB_VER_SUBREVISION  MZ_VER_SUBREVISION\n  #define zlibVersion           mz_version\n  #define zlib_version          mz_version()\n#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES\n\n#endif // MINIZ_NO_ZLIB_APIS\n\n// ------------------- Types and macros\n\ntypedef unsigned char mz_uint8;\ntypedef signed short mz_int16;\ntypedef unsigned short mz_uint16;\ntypedef unsigned int mz_uint32;\ntypedef unsigned int mz_uint;\ntypedef long long mz_int64;\ntypedef unsigned long long mz_uint64;\ntypedef int mz_bool;\n\n#define MZ_FALSE (0)\n#define MZ_TRUE (1)\n\n// An attempt to work around MSVC's spammy \"warning C4127: conditional expression is constant\" message.\n#ifdef _MSC_VER\n   #define MZ_MACRO_END while (0, 0)\n#else\n   #define MZ_MACRO_END while (0)\n#endif\n\n// ------------------- ZIP archive reading/writing\n\n#ifndef MINIZ_NO_ARCHIVE_APIS\n\nenum\n{\n  MZ_ZIP_MAX_IO_BUF_SIZE = 64*1024,\n  MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260,\n  MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256\n};\n\ntypedef struct\n{\n  mz_uint32 m_file_index;\n  mz_uint32 m_central_dir_ofs;\n  mz_uint16 m_version_made_by;\n  mz_uint16 m_version_needed;\n  mz_uint16 m_bit_flag;\n  mz_uint16 m_method;\n#ifndef MINIZ_NO_TIME\n  time_t m_time;\n#endif\n  mz_uint32 m_crc32;\n  mz_uint64 m_comp_size;\n  mz_uint64 m_uncomp_size;\n  mz_uint16 m_internal_attr;\n  mz_uint32 m_external_attr;\n  mz_uint64 m_local_header_ofs;\n  mz_uint32 m_comment_size;\n  char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE];\n  char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE];\n} mz_zip_archive_file_stat;\n\ntypedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n);\ntypedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n);\n\nstruct mz_zip_internal_state_tag;\ntypedef struct mz_zip_internal_state_tag mz_zip_internal_state;\n\ntypedef enum\n{\n  MZ_ZIP_MODE_INVALID = 0,\n  MZ_ZIP_MODE_READING = 1,\n  MZ_ZIP_MODE_WRITING = 2,\n  MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3\n} mz_zip_mode;\n\ntypedef struct mz_zip_archive_tag\n{\n  mz_uint64 m_archive_size;\n  mz_uint64 m_central_directory_file_ofs;\n  mz_uint m_total_files;\n  mz_zip_mode m_zip_mode;\n\n  mz_uint m_file_offset_alignment;\n\n  mz_alloc_func m_pAlloc;\n  mz_free_func m_pFree;\n  mz_realloc_func m_pRealloc;\n  void *m_pAlloc_opaque;\n\n  mz_file_read_func m_pRead;\n  mz_file_write_func m_pWrite;\n  void *m_pIO_opaque;\n\n  mz_zip_internal_state *m_pState;\n\n} mz_zip_archive;\n\ntypedef enum\n{\n  MZ_ZIP_FLAG_CASE_SENSITIVE                = 0x0100,\n  MZ_ZIP_FLAG_IGNORE_PATH                   = 0x0200,\n  MZ_ZIP_FLAG_COMPRESSED_DATA               = 0x0400,\n  MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800\n} mz_zip_flags;\n\n// ZIP archive reading\n\n// Inits a ZIP archive reader.\n// These functions read and validate the archive's central directory.\nMINIZ_STATIC mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags);\nMINIZ_STATIC mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags);\n\n#ifndef MINIZ_NO_STDIO\nMINIZ_STATIC mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags);\n#endif\n\n// Returns the total number of files in the archive.\nMINIZ_STATIC mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip);\n\n// Returns detailed information about an archive file entry.\nMINIZ_STATIC mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat);\n\n// Determines if an archive file entry is a directory entry.\nMINIZ_STATIC mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index);\nMINIZ_STATIC mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index);\n\n// Retrieves the filename of an archive file entry.\n// Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function returns the number of bytes needed to fully store the filename.\nMINIZ_STATIC mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size);\n\n// Attempts to locates a file in the archive's central directory.\n// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH\n// Returns -1 if the file cannot be found.\nMINIZ_STATIC int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags);\n\n// Extracts a archive file to a memory buffer using no memory allocation.\nMINIZ_STATIC mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);\nMINIZ_STATIC mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);\n\n// Extracts a archive file to a memory buffer.\nMINIZ_STATIC mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags);\nMINIZ_STATIC mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags);\n\n// Extracts a archive file to a dynamically allocated heap buffer.\nMINIZ_STATIC void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags);\nMINIZ_STATIC void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags);\n\n// Extracts a archive file using a callback function to output the file's data.\nMINIZ_STATIC mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags);\nMINIZ_STATIC mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags);\n\n#ifndef MINIZ_NO_STDIO\n// Extracts a archive file to a disk file and sets its last accessed and modified times.\n// This function only extracts files, not archive directory records.\nMINIZ_STATIC mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags);\nMINIZ_STATIC mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags);\n#endif\n\n// Ends archive reading, freeing all allocations, and closing the input archive file if mz_zip_reader_init_file() was used.\nMINIZ_STATIC mz_bool mz_zip_reader_end(mz_zip_archive *pZip);\n\n// ZIP archive writing\n\n#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\n// Inits a ZIP archive writer.\nMINIZ_STATIC mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size);\nMINIZ_STATIC mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size);\n\n#ifndef MINIZ_NO_STDIO\nMINIZ_STATIC mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning);\n#endif\n\n// Converts a ZIP archive reader object into a writer object, to allow efficient in-place file appends to occur on an existing archive.\n// For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called.\n// For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the realloc callback (which defaults to realloc unless you've overridden it).\n// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided m_pWrite function cannot be NULL.\n// Note: In-place archive modification is not recommended unless you know what you're doing, because if execution stops or something goes wrong before\n// the archive is finalized the file's central directory will be hosed.\nMINIZ_STATIC mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename);\n\n// Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive.\n// To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer.\n// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION.\nMINIZ_STATIC mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags);\nMINIZ_STATIC mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32);\n\n#ifndef MINIZ_NO_STDIO\n// Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive.\n// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION.\nMINIZ_STATIC mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);\n#endif\n\n// Adds a file to an archive by fully cloning the data from another archive.\n// This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data, and comment fields.\nMINIZ_STATIC mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index);\n\n// Finalizes the archive by writing the central directory records followed by the end of central directory record.\n// After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end().\n// An archive must be manually finalized by calling this function for it to be valid.\nMINIZ_STATIC mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip);\nMINIZ_STATIC mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize);\n\n// Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used.\n// Note for the archive to be valid, it must have been finalized before ending.\nMINIZ_STATIC mz_bool mz_zip_writer_end(mz_zip_archive *pZip);\n\n// Misc. high-level helper functions:\n\n// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob to a ZIP archive.\n// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION.\nMINIZ_STATIC mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);\n\n// Reads a single file from an archive into a heap block.\n// Returns NULL on failure.\nMINIZ_STATIC void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags);\n\n#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\n#endif // #ifndef MINIZ_NO_ARCHIVE_APIS\n\n// ------------------- Low-level Decompression API Definitions\n\n// Decompression flags used by tinfl_decompress().\n// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream.\n// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input.\n// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB).\n// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes.\nenum\n{\n  TINFL_FLAG_PARSE_ZLIB_HEADER = 1,\n  TINFL_FLAG_HAS_MORE_INPUT = 2,\n  TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4,\n  TINFL_FLAG_COMPUTE_ADLER32 = 8\n};\n\n// High level decompression functions:\n// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc().\n// On entry:\n//  pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress.\n// On return:\n//  Function returns a pointer to the decompressed data, or NULL on failure.\n//  *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data.\n//  The caller must call mz_free() on the returned block when it's no longer needed.\nMINIZ_STATIC void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);\n\n// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory.\n// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success.\n#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1))\nMINIZ_STATIC size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);\n\n// tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer.\n// Returns 1 on success or 0 on failure.\ntypedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser);\nMINIZ_STATIC int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);\n\nstruct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor;\n\n// Max size of LZ dictionary.\n#define TINFL_LZ_DICT_SIZE 32768\n\n// Return status.\ntypedef enum\n{\n  TINFL_STATUS_BAD_PARAM = -3,\n  TINFL_STATUS_ADLER32_MISMATCH = -2,\n  TINFL_STATUS_FAILED = -1,\n  TINFL_STATUS_DONE = 0,\n  TINFL_STATUS_NEEDS_MORE_INPUT = 1,\n  TINFL_STATUS_HAS_MORE_OUTPUT = 2\n} tinfl_status;\n\n// Initializes the decompressor to its initial state.\n#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END\n#define tinfl_get_adler32(r) (r)->m_check_adler32\n\n// Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability.\n// This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output.\nMINIZ_STATIC tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags);\n\n// Internal/private bits follow.\nenum\n{\n  TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19,\n  TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS\n};\n\ntypedef struct\n{\n  mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];\n  mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];\n} tinfl_huff_table;\n\n#if MINIZ_HAS_64BIT_REGISTERS\n  #define TINFL_USE_64BIT_BITBUF 1\n#endif\n\n#if TINFL_USE_64BIT_BITBUF\n  typedef mz_uint64 tinfl_bit_buf_t;\n  #define TINFL_BITBUF_SIZE (64)\n#else\n  typedef mz_uint32 tinfl_bit_buf_t;\n  #define TINFL_BITBUF_SIZE (32)\n#endif\n\nstruct tinfl_decompressor_tag\n{\n  mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES];\n  tinfl_bit_buf_t m_bit_buf;\n  size_t m_dist_from_out_buf_start;\n  tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];\n  mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];\n};\n\n// ------------------- Low-level Compression API Definitions\n\n// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently).\n#define TDEFL_LESS_MEMORY 0\n\n// tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search):\n// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression).\nenum\n{\n  TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF\n};\n\n// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data.\n// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers).\n// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing.\n// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory).\n// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1)\n// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled.\n// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables.\n// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks.\n// The low 12 bits are reserved to control the max # of hash probes per dictionary lookup (see TDEFL_MAX_PROBES_MASK).\nenum\n{\n  TDEFL_WRITE_ZLIB_HEADER             = 0x01000,\n  TDEFL_COMPUTE_ADLER32               = 0x02000,\n  TDEFL_GREEDY_PARSING_FLAG           = 0x04000,\n  TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000,\n  TDEFL_RLE_MATCHES                   = 0x10000,\n  TDEFL_FILTER_MATCHES                = 0x20000,\n  TDEFL_FORCE_ALL_STATIC_BLOCKS       = 0x40000,\n  TDEFL_FORCE_ALL_RAW_BLOCKS          = 0x80000\n};\n\n// High level compression functions:\n// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc().\n// On entry:\n//  pSrc_buf, src_buf_len: Pointer and size of source block to compress.\n//  flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression.\n// On return:\n//  Function returns a pointer to the compressed data, or NULL on failure.\n//  *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data.\n//  The caller must free() the returned block when it's no longer needed.\nMINIZ_STATIC void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);\n\n// tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory.\n// Returns 0 on failure.\nMINIZ_STATIC size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);\n\n// Compresses an image to a compressed PNG file in memory.\n// On entry:\n//  pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. \n//  The image pitch in bytes per scanline will be w*num_chans. The leftmost pixel on the top scanline is stored first in memory.\n//  level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL\n//  If flip is true, the image will be flipped on the Y axis (useful for OpenGL apps).\n// On return:\n//  Function returns a pointer to the compressed data, or NULL on failure.\n//  *pLen_out will be set to the size of the PNG image file.\n//  The caller must mz_free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed.\nMINIZ_STATIC void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, int bpl, size_t *pLen_out, mz_uint level, mz_bool flip);\nMINIZ_STATIC void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, int bpl, size_t *pLen_out);\n\n// Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time.\ntypedef mz_bool (*tdefl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser);\n\n// tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally.\nMINIZ_STATIC mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);\n\nenum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 };\n\n// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes).\n#if TDEFL_LESS_MEMORY\nenum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS };\n#else\nenum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS };\n#endif\n\n// The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions.\ntypedef enum\n{\n  TDEFL_STATUS_BAD_PARAM = -2,\n  TDEFL_STATUS_PUT_BUF_FAILED = -1,\n  TDEFL_STATUS_OKAY = 0,\n  TDEFL_STATUS_DONE = 1,\n} tdefl_status;\n\n// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums\ntypedef enum\n{\n  TDEFL_NO_FLUSH = 0,\n  TDEFL_SYNC_FLUSH = 2,\n  TDEFL_FULL_FLUSH = 3,\n  TDEFL_FINISH = 4\n} tdefl_flush;\n\n// tdefl's compression state structure.\ntypedef struct\n{\n  tdefl_put_buf_func_ptr m_pPut_buf_func;\n  void *m_pPut_buf_user;\n  mz_uint m_flags, m_max_probes[2];\n  int m_greedy_parsing;\n  mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size;\n  mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end;\n  mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer;\n  mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish;\n  tdefl_status m_prev_return_status;\n  const void *m_pIn_buf;\n  void *m_pOut_buf;\n  size_t *m_pIn_buf_size, *m_pOut_buf_size;\n  tdefl_flush m_flush;\n  const mz_uint8 *m_pSrc;\n  size_t m_src_buf_left, m_out_buf_ofs;\n  mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1];\n  mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];\n  mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];\n  mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];\n  mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE];\n  mz_uint16 m_next[TDEFL_LZ_DICT_SIZE];\n  mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE];\n  mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE];\n} tdefl_compressor;\n\n// Initializes the compressor.\n// There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory.\n// pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression.\n// If pBut_buf_func is NULL the user should always call the tdefl_compress() API.\n// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.)\nMINIZ_STATIC tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);\n\n// Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible.\nMINIZ_STATIC tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush);\n\n// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr.\n// tdefl_compress_buffer() always consumes the entire input buffer.\nMINIZ_STATIC tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush);\n\nMINIZ_STATIC tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d);\nMINIZ_STATIC mz_uint32 tdefl_get_adler32(tdefl_compressor *d);\n\n// Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't defined, because it uses some of its macros.\n#ifndef MINIZ_NO_ZLIB_APIS\n// Create tdefl_compress() flags given zlib-style compression parameters.\n// level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files)\n// window_bits may be -15 (raw deflate) or 15 (zlib)\n// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED\nMINIZ_STATIC mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy);\n#endif // #ifndef MINIZ_NO_ZLIB_APIS\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // MINIZ_HEADER_INCLUDED\n\n// ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.)\n\n#ifndef MINIZ_HEADER_FILE_ONLY\n\ntypedef unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 : -1];\ntypedef unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 : -1];\ntypedef unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 : -1];\n\n#include <string.h>\n#include <assert.h>\n\n// Defines to remove C runtime dependency\n#define memset SDL_memset\n#define memcpy SDL_memcpy\n\n//#define MZ_ASSERT(x) assert(x)\n#define MZ_ASSERT(x) SDL_assert(x)\n\n#ifdef MINIZ_NO_MALLOC\n  #define MZ_MALLOC(x) NULL\n  #define MZ_FREE(x) (void)x, ((void)0)\n  #define MZ_REALLOC(p, x) NULL\n#elif defined(MINIZ_SDL_MALLOC)\n  #define MZ_MALLOC(x) SDL_malloc(x)\n  #define MZ_FREE(x) SDL_free(x)\n  #define MZ_REALLOC(p, x) SDL_realloc(p, x)\n#else\n  #define MZ_MALLOC(x) malloc(x)\n  #define MZ_FREE(x) free(x)\n  #define MZ_REALLOC(p, x) realloc(p, x)\n#endif\n\n#define MZ_MAX(a,b) (((a)>(b))?(a):(b))\n#define MZ_MIN(a,b) (((a)<(b))?(a):(b))\n#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n  #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))\n  #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))\n#else\n  #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))\n  #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))\n#endif\n\n#ifdef _MSC_VER\n  #define MZ_FORCEINLINE __forceinline\n#elif defined(__GNUC__)\n  #define MZ_FORCEINLINE inline __attribute__((__always_inline__))\n#else\n  #define MZ_FORCEINLINE inline\n#endif\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n// ------------------- zlib-style API's\n\nmz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len)\n{\n  mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); size_t block_len = buf_len % 5552;\n  if (!ptr) return MZ_ADLER32_INIT;\n  while (buf_len) {\n    for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {\n      s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;\n      s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;\n    }\n    for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;\n    s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;\n  }\n  return (s2 << 16) + s1;\n}\n\n// Karl Malbrain's compact CRC-32. See \"A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed\": http://www.geocities.com/malbrain/\nmz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len)\n{\n  static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,\n    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c };\n  mz_uint32 crcu32 = (mz_uint32)crc;\n  if (!ptr) return MZ_CRC32_INIT;\n  crcu32 = ~crcu32; while (buf_len--) { mz_uint8 b = *ptr++; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; }\n  return ~crcu32;\n}\n\nMINIZ_STATIC void mz_free(void *p)\n{\n  MZ_FREE(p);\n}\n\n#ifndef MINIZ_NO_ZLIB_APIS\n\nstatic void *def_alloc_func(void *opaque, size_t items, size_t size) { (void)opaque, (void)items, (void)size; return MZ_MALLOC(items * size); }\nstatic void def_free_func(void *opaque, void *address) { (void)opaque, (void)address; MZ_FREE(address); }\nstatic void *def_realloc_func(void *opaque, void *address, size_t items, size_t size) { (void)opaque, (void)address, (void)items, (void)size; return MZ_REALLOC(address, items * size); }\n\nconst char *mz_version(void)\n{\n  return MZ_VERSION;\n}\n\nint mz_deflateInit(mz_streamp pStream, int level)\n{\n  return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY);\n}\n\nint mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy)\n{\n  tdefl_compressor *pComp;\n  mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy);\n\n  if (!pStream) return MZ_STREAM_ERROR;\n  if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) return MZ_PARAM_ERROR;\n\n  pStream->data_type = 0;\n  pStream->adler = MZ_ADLER32_INIT;\n  pStream->msg = NULL;\n  pStream->reserved = 0;\n  pStream->total_in = 0;\n  pStream->total_out = 0;\n  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;\n  if (!pStream->zfree) pStream->zfree = def_free_func;\n\n  pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor));\n  if (!pComp)\n    return MZ_MEM_ERROR;\n\n  pStream->state = (struct mz_internal_state *)pComp;\n\n  if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY)\n  {\n    mz_deflateEnd(pStream);\n    return MZ_PARAM_ERROR;\n  }\n\n  return MZ_OK;\n}\n\nint mz_deflateReset(mz_streamp pStream)\n{\n  if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) return MZ_STREAM_ERROR;\n  pStream->total_in = pStream->total_out = 0;\n  tdefl_init((tdefl_compressor*)pStream->state, NULL, NULL, ((tdefl_compressor*)pStream->state)->m_flags);\n  return MZ_OK;\n}\n\nint mz_deflate(mz_streamp pStream, int flush)\n{\n  size_t in_bytes, out_bytes;\n  mz_ulong orig_total_in, orig_total_out;\n  int mz_status = MZ_OK;\n\n  if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) return MZ_STREAM_ERROR;\n  if (!pStream->avail_out) return MZ_BUF_ERROR;\n\n  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;\n\n  if (((tdefl_compressor*)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE)\n    return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR;\n\n  orig_total_in = pStream->total_in; orig_total_out = pStream->total_out;\n  for ( ; ; )\n  {\n    tdefl_status defl_status;\n    in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;\n\n    defl_status = tdefl_compress((tdefl_compressor*)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush);\n    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;\n    pStream->total_in += (mz_uint)in_bytes; pStream->adler = tdefl_get_adler32((tdefl_compressor*)pStream->state);\n\n    pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes;\n    pStream->total_out += (mz_uint)out_bytes;\n\n    if (defl_status < 0)\n    {\n      mz_status = MZ_STREAM_ERROR;\n      break;\n    }\n    else if (defl_status == TDEFL_STATUS_DONE)\n    {\n      mz_status = MZ_STREAM_END;\n      break;\n    }\n    else if (!pStream->avail_out)\n      break;\n    else if ((!pStream->avail_in) && (flush != MZ_FINISH))\n    {\n      if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out))\n        break;\n      return MZ_BUF_ERROR; // Can't make forward progress without some input.\n    }\n  }\n  return mz_status;\n}\n\nint mz_deflateEnd(mz_streamp pStream)\n{\n  if (!pStream) return MZ_STREAM_ERROR;\n  if (pStream->state)\n  {\n    pStream->zfree(pStream->opaque, pStream->state);\n    pStream->state = NULL;\n  }\n  return MZ_OK;\n}\n\nmz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len)\n{\n  (void)pStream;\n  // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.)\n  return MZ_MAX(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5);\n}\n\nint mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level)\n{\n  int status;\n  mz_stream stream;\n  memset(&stream, 0, sizeof(stream));\n\n  // In case mz_ulong is 64-bits (argh I hate longs).\n  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;\n\n  stream.next_in = pSource;\n  stream.avail_in = (mz_uint32)source_len;\n  stream.next_out = pDest;\n  stream.avail_out = (mz_uint32)*pDest_len;\n\n  status = mz_deflateInit(&stream, level);\n  if (status != MZ_OK) return status;\n\n  status = mz_deflate(&stream, MZ_FINISH);\n  if (status != MZ_STREAM_END)\n  {\n    mz_deflateEnd(&stream);\n    return (status == MZ_OK) ? MZ_BUF_ERROR : status;\n  }\n\n  *pDest_len = stream.total_out;\n  return mz_deflateEnd(&stream);\n}\n\nint mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)\n{\n  return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION);\n}\n\nmz_ulong mz_compressBound(mz_ulong source_len)\n{\n  return mz_deflateBound(NULL, source_len);\n}\n\ntypedef struct\n{\n  tinfl_decompressor m_decomp;\n  mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits;\n  mz_uint8 m_dict[TINFL_LZ_DICT_SIZE];\n  tinfl_status m_last_status;\n} inflate_state;\n\nint mz_inflateInit2(mz_streamp pStream, int window_bits)\n{\n  inflate_state *pDecomp;\n  if (!pStream) return MZ_STREAM_ERROR;\n  if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR;\n\n  pStream->data_type = 0;\n  pStream->adler = 0;\n  pStream->msg = NULL;\n  pStream->total_in = 0;\n  pStream->total_out = 0;\n  pStream->reserved = 0;\n  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;\n  if (!pStream->zfree) pStream->zfree = def_free_func;\n\n  pDecomp = (inflate_state*)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state));\n  if (!pDecomp) return MZ_MEM_ERROR;\n\n  pStream->state = (struct mz_internal_state *)pDecomp;\n\n  tinfl_init(&pDecomp->m_decomp);\n  pDecomp->m_dict_ofs = 0;\n  pDecomp->m_dict_avail = 0;\n  pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT;\n  pDecomp->m_first_call = 1;\n  pDecomp->m_has_flushed = 0;\n  pDecomp->m_window_bits = window_bits;\n\n  return MZ_OK;\n}\n\nint mz_inflateInit(mz_streamp pStream)\n{\n   return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS);\n}\n\nint mz_inflate(mz_streamp pStream, int flush)\n{\n  inflate_state* pState;\n  mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32;\n  size_t in_bytes, out_bytes, orig_avail_in;\n  tinfl_status status;\n\n  if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR;\n  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;\n  if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;\n\n  pState = (inflate_state*)pStream->state;\n  if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER;\n  orig_avail_in = pStream->avail_in;\n\n  first_call = pState->m_first_call; pState->m_first_call = 0;\n  if (pState->m_last_status < 0) return MZ_DATA_ERROR;\n\n  if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;\n  pState->m_has_flushed |= (flush == MZ_FINISH);\n\n  if ((flush == MZ_FINISH) && (first_call))\n  {\n    // MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file.\n    decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF;\n    in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;\n    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags);\n    pState->m_last_status = status;\n    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes;\n    pStream->adler = tinfl_get_adler32(&pState->m_decomp);\n    pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes;\n\n    if (status < 0)\n      return MZ_DATA_ERROR;\n    else if (status != TINFL_STATUS_DONE)\n    {\n      pState->m_last_status = TINFL_STATUS_FAILED;\n      return MZ_BUF_ERROR;\n    }\n    return MZ_STREAM_END;\n  }\n  // flush != MZ_FINISH then we must assume there's more input.\n  if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT;\n\n  if (pState->m_dict_avail)\n  {\n    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);\n    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);\n    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;\n    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);\n    return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;\n  }\n\n  for ( ; ; )\n  {\n    in_bytes = pStream->avail_in;\n    out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs;\n\n    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags);\n    pState->m_last_status = status;\n\n    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;\n    pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp);\n\n    pState->m_dict_avail = (mz_uint)out_bytes;\n\n    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);\n    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);\n    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;\n    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);\n\n    if (status < 0)\n       return MZ_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well).\n    else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in))\n      return MZ_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH.\n    else if (flush == MZ_FINISH)\n    {\n       // The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH.\n       if (status == TINFL_STATUS_DONE)\n          return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END;\n       // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong.\n       else if (!pStream->avail_out)\n          return MZ_BUF_ERROR;\n    }\n    else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail))\n      break;\n  }\n\n  return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;\n}\n\nint mz_inflateEnd(mz_streamp pStream)\n{\n  if (!pStream)\n    return MZ_STREAM_ERROR;\n  if (pStream->state)\n  {\n    pStream->zfree(pStream->opaque, pStream->state);\n    pStream->state = NULL;\n  }\n  return MZ_OK;\n}\n\nint mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)\n{\n  mz_stream stream;\n  int status;\n  memset(&stream, 0, sizeof(stream));\n\n  // In case mz_ulong is 64-bits (argh I hate longs).\n  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;\n\n  stream.next_in = pSource;\n  stream.avail_in = (mz_uint32)source_len;\n  stream.next_out = pDest;\n  stream.avail_out = (mz_uint32)*pDest_len;\n\n  status = mz_inflateInit(&stream);\n  if (status != MZ_OK)\n    return status;\n\n  status = mz_inflate(&stream, MZ_FINISH);\n  if (status != MZ_STREAM_END)\n  {\n    mz_inflateEnd(&stream);\n    return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status;\n  }\n  *pDest_len = stream.total_out;\n\n  return mz_inflateEnd(&stream);\n}\n\nconst char *mz_error(int err)\n{\n  static struct { int m_err; const char *m_pDesc; } s_error_descs[] =\n  {\n    { MZ_OK, \"\" }, { MZ_STREAM_END, \"stream end\" }, { MZ_NEED_DICT, \"need dictionary\" }, { MZ_ERRNO, \"file error\" }, { MZ_STREAM_ERROR, \"stream error\" },\n    { MZ_DATA_ERROR, \"data error\" }, { MZ_MEM_ERROR, \"out of memory\" }, { MZ_BUF_ERROR, \"buf error\" }, { MZ_VERSION_ERROR, \"version error\" }, { MZ_PARAM_ERROR, \"parameter error\" }\n  };\n  mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc;\n  return NULL;\n}\n\n#endif //MINIZ_NO_ZLIB_APIS\n\n// ------------------- Low-level Decompression (completely independent from all compression API's)\n\n#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)\n#define TINFL_MEMSET(p, c, l) memset(p, c, l)\n\n#define TINFL_CR_BEGIN switch(r->m_state) { case 0:\n#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END\n#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END\n#define TINFL_CR_FINISH }\n\n// TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never\n// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario.\n#define TINFL_GET_BYTE(state_index, c) do { \\\n  if (pIn_buf_cur >= pIn_buf_end) { \\\n    for ( ; ; ) { \\\n      if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \\\n        TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \\\n        if (pIn_buf_cur < pIn_buf_end) { \\\n          c = *pIn_buf_cur++; \\\n          break; \\\n        } \\\n      } else { \\\n        c = 0; \\\n        break; \\\n      } \\\n    } \\\n  } else c = *pIn_buf_cur++; } MZ_MACRO_END\n\n#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n))\n#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END\n#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END\n\n// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2.\n// It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a\n// Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the\n// bit buffer contains >=15 bits (deflate's max. Huffman code size).\n#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \\\n  do { \\\n    temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \\\n    if (temp >= 0) { \\\n      code_len = temp >> 9; \\\n      if ((code_len) && (num_bits >= code_len)) \\\n      break; \\\n    } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \\\n       code_len = TINFL_FAST_LOOKUP_BITS; \\\n       do { \\\n          temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \\\n       } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \\\n    } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \\\n  } while (num_bits < 15);\n\n// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read\n// beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully\n// decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32.\n// The slow path is only executed at the very end of the input buffer.\n#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \\\n  int temp; mz_uint code_len, c; \\\n  if (num_bits < 15) { \\\n    if ((pIn_buf_end - pIn_buf_cur) < 2) { \\\n       TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \\\n    } else { \\\n       bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \\\n    } \\\n  } \\\n  if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \\\n    code_len = temp >> 9, temp &= 511; \\\n  else { \\\n    code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \\\n  } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END\n\ntinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)\n{\n  static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 };\n  static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };\n  static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};\n  static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\n  static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };\n  static const int s_min_table_sizes[3] = { 257, 1, 4 };\n\n  tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf;\n  const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;\n  mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;\n  size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;\n\n  // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter).\n  if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; }\n\n  num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start;\n  TINFL_CR_BEGIN\n\n  bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1;\n  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)\n  {\n    TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1);\n    counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));\n    if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))));\n    if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }\n  }\n\n  do\n  {\n    TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1;\n    if (r->m_type == 0)\n    {\n      TINFL_SKIP_BITS(5, num_bits & 7);\n      for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); }\n      if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); }\n      while ((counter) && (num_bits))\n      {\n        TINFL_GET_BITS(51, dist, 8);\n        while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); }\n        *pOut_buf_cur++ = (mz_uint8)dist;\n        counter--;\n      }\n      while (counter)\n      {\n        size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); }\n        while (pIn_buf_cur >= pIn_buf_end)\n        {\n          if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT)\n          {\n            TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT);\n          }\n          else\n          {\n            TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED);\n          }\n        }\n        n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter);\n        TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n;\n      }\n    }\n    else if (r->m_type == 3)\n    {\n      TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);\n    }\n    else\n    {\n      if (r->m_type == 1)\n      {\n        mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i;\n        r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);\n        for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8;\n      }\n      else\n      {\n        for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], \"\\05\\05\\04\"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; }\n        MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; }\n        r->m_table_sizes[2] = 19;\n      }\n      for ( ; (int)r->m_type >= 0; r->m_type--)\n      {\n        int tree_next, tree_cur; tinfl_huff_table *pTable;\n        mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree);\n        for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++;\n        used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;\n        for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }\n        if ((65536 != total) && (used_syms > 1))\n        {\n          TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);\n        }\n        for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)\n        {\n          mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue;\n          cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);\n          if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; }\n          if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }\n          rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);\n          for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)\n          {\n            tree_cur -= ((rev_code >>= 1) & 1);\n            if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1];\n          }\n          tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;\n        }\n        if (r->m_type == 2)\n        {\n          for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); )\n          {\n            mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; }\n            if ((dist == 16) && (!counter))\n            {\n              TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);\n            }\n            num_extra = \"\\02\\03\\07\"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += \"\\03\\03\\013\"[dist - 16];\n            TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s;\n          }\n          if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter)\n          {\n            TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);\n          }\n          TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);\n        }\n      }\n      for ( ; ; )\n      {\n        mz_uint8 *pSrc;\n        for ( ; ; )\n        {\n          if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))\n          {\n            TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);\n            if (counter >= 256)\n              break;\n            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); }\n            *pOut_buf_cur++ = (mz_uint8)counter;\n          }\n          else\n          {\n            int sym2; mz_uint code_len;\n#if TINFL_USE_64BIT_BITBUF\n            if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; }\n#else\n            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }\n#endif\n            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)\n              code_len = sym2 >> 9;\n            else\n            {\n              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);\n            }\n            counter = sym2; bit_buf >>= code_len; num_bits -= code_len;\n            if (counter & 256)\n              break;\n\n#if !TINFL_USE_64BIT_BITBUF\n            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }\n#endif\n            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)\n              code_len = sym2 >> 9;\n            else\n            {\n              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);\n            }\n            bit_buf >>= code_len; num_bits -= code_len;\n\n            pOut_buf_cur[0] = (mz_uint8)counter;\n            if (sym2 & 256)\n            {\n              pOut_buf_cur++;\n              counter = sym2;\n              break;\n            }\n            pOut_buf_cur[1] = (mz_uint8)sym2;\n            pOut_buf_cur += 2;\n          }\n        }\n        if ((counter &= 511) == 256) break;\n\n        num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];\n        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }\n\n        TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);\n        num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];\n        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }\n\n        dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;\n        if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))\n        {\n          TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);\n        }\n\n        pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);\n\n        if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end)\n        {\n          while (counter--)\n          {\n            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); }\n            *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];\n          }\n          continue;\n        }\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n        else if ((counter >= 9) && (counter <= dist))\n        {\n          const mz_uint8 *pSrc_end = pSrc + (counter & ~7);\n          do\n          {\n            ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];\n            ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];\n            pOut_buf_cur += 8;\n          } while ((pSrc += 8) < pSrc_end);\n          if ((counter &= 7) < 3)\n          {\n            if (counter)\n            {\n              pOut_buf_cur[0] = pSrc[0];\n              if (counter > 1)\n                pOut_buf_cur[1] = pSrc[1];\n              pOut_buf_cur += counter;\n            }\n            continue;\n          }\n        }\n#endif\n        do\n        {\n          pOut_buf_cur[0] = pSrc[0];\n          pOut_buf_cur[1] = pSrc[1];\n          pOut_buf_cur[2] = pSrc[2];\n          pOut_buf_cur += 3; pSrc += 3;\n        } while ((int)(counter -= 3) > 2);\n        if ((int)counter > 0)\n        {\n          pOut_buf_cur[0] = pSrc[0];\n          if ((int)counter > 1)\n            pOut_buf_cur[1] = pSrc[1];\n          pOut_buf_cur += counter;\n        }\n      }\n    }\n  } while (!(r->m_final & 1));\n  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)\n  {\n    TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; }\n  }\n  TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);\n  TINFL_CR_FINISH\n\ncommon_exit:\n  r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start;\n  *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;\n  if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0))\n  {\n    const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size;\n    mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552;\n    while (buf_len)\n    {\n      for (i = 0; i + 7 < block_len; i += 8, ptr += 8)\n      {\n        s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;\n        s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;\n      }\n      for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;\n      s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;\n    }\n    r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH;\n  }\n  return status;\n}\n\n// Higher level helper functions.\nvoid *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)\n{\n  tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0;\n  *pOut_len = 0;\n  tinfl_init(&decomp);\n  for ( ; ; )\n  {\n    size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;\n    tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size,\n      (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);\n    if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT))\n    {\n      MZ_FREE(pBuf); *pOut_len = 0; return NULL;\n    }\n    src_buf_ofs += src_buf_size;\n    *pOut_len += dst_buf_size;\n    if (status == TINFL_STATUS_DONE) break;\n    new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128;\n    pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity);\n    if (!pNew_buf)\n    {\n      MZ_FREE(pBuf); *pOut_len = 0; return NULL;\n    }\n    pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity;\n  }\n  return pBuf;\n}\n\nsize_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)\n{\n  tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp);\n  status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);\n  return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len;\n}\n\nint tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)\n{\n  int result = 0;\n  tinfl_decompressor decomp;\n  mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0;\n  if (!pDict)\n    return TINFL_STATUS_FAILED;\n  tinfl_init(&decomp);\n  for ( ; ; )\n  {\n    size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs;\n    tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,\n      (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));\n    in_buf_ofs += in_buf_size;\n    if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))\n      break;\n    if (status != TINFL_STATUS_HAS_MORE_OUTPUT)\n    {\n      result = (status == TINFL_STATUS_DONE);\n      break;\n    }\n    dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1);\n  }\n  MZ_FREE(pDict);\n  *pIn_buf_size = in_buf_ofs;\n  return result;\n}\n\n// ------------------- Low-level Compression (independent from all decompression API's)\n\n// Purposely making these tables static for faster init and thread safety.\nstatic const mz_uint16 s_tdefl_len_sym[256] = {\n  257,258,259,260,261,262,263,264,265,265,266,266,267,267,268,268,269,269,269,269,270,270,270,270,271,271,271,271,272,272,272,272,\n  273,273,273,273,273,273,273,273,274,274,274,274,274,274,274,274,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,276,\n  277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,\n  279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,\n  281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,\n  282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,\n  283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,\n  284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,285 };\n\nstatic const mz_uint8 s_tdefl_len_extra[256] = {\n  0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,\n  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\n  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,\n  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0 };\n\nstatic const mz_uint8 s_tdefl_small_dist_sym[512] = {\n  0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,\n  11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,\n  13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,\n  14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,\n  14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,\n  15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,\n  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17 };\n\nstatic const mz_uint8 s_tdefl_small_dist_extra[512] = {\n  0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,\n  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7 };\n\nstatic const mz_uint8 s_tdefl_large_dist_sym[128] = {\n  0,0,18,19,20,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,\n  26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,\n  28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29 };\n\nstatic const mz_uint8 s_tdefl_large_dist_extra[128] = {\n  0,0,8,8,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,\n  12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,\n  13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 };\n\n// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values.\ntypedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq;\nstatic tdefl_sym_freq* tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq* pSyms0, tdefl_sym_freq* pSyms1)\n{\n  mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; tdefl_sym_freq* pCur_syms = pSyms0, *pNew_syms = pSyms1; MZ_CLEAR_OBJ(hist);\n  for (i = 0; i < num_syms; i++) { mz_uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; }\n  while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--;\n  for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8)\n  {\n    const mz_uint32* pHist = &hist[pass << 8];\n    mz_uint offsets[256], cur_ofs = 0;\n    for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; }\n    for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i];\n    { tdefl_sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; }\n  }\n  return pCur_syms;\n}\n\n// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996.\nstatic void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n)\n{\n  int root, leaf, next, avbl, used, dpth;\n  if (n==0) return; else if (n==1) { A[0].m_key = 1; return; }\n  A[0].m_key += A[1].m_key; root = 0; leaf = 2;\n  for (next=1; next < n-1; next++)\n  {\n    if (leaf>=n || A[root].m_key<A[leaf].m_key) { A[next].m_key = A[root].m_key; A[root++].m_key = (mz_uint16)next; } else A[next].m_key = A[leaf++].m_key;\n    if (leaf>=n || (root<next && A[root].m_key<A[leaf].m_key)) { A[next].m_key = (mz_uint16)(A[next].m_key + A[root].m_key); A[root++].m_key = (mz_uint16)next; } else A[next].m_key = (mz_uint16)(A[next].m_key + A[leaf++].m_key);\n  }\n  A[n-2].m_key = 0; for (next=n-3; next>=0; next--) A[next].m_key = A[A[next].m_key].m_key+1;\n  avbl = 1; used = dpth = 0; root = n-2; next = n-1;\n  while (avbl>0)\n  {\n    while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; }\n    while (avbl>used) { A[next--].m_key = (mz_uint16)(dpth); avbl--; }\n    avbl = 2*used; dpth++; used = 0;\n  }\n}\n\n// Limits canonical Huffman code table's max code size.\nenum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 };\nstatic void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size)\n{\n  int i; mz_uint32 total = 0; if (code_list_len <= 1) return;\n  for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i];\n  for (i = max_code_size; i > 0; i--) total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i));\n  while (total != (1UL << max_code_size))\n  {\n    pNum_codes[max_code_size]--;\n    for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; }\n    total--;\n  }\n}\n\nstatic void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table)\n{\n  int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; MZ_CLEAR_OBJ(num_codes);\n  if (static_table)\n  {\n    for (i = 0; i < table_len; i++) num_codes[d->m_huff_code_sizes[table_num][i]]++;\n  }\n  else\n  {\n    tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], *pSyms;\n    int num_used_syms = 0;\n    const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0];\n    for (i = 0; i < table_len; i++) if (pSym_count[i]) { syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; syms0[num_used_syms++].m_sym_index = (mz_uint16)i; }\n\n    pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms);\n\n    for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++;\n\n    tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit);\n\n    MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); MZ_CLEAR_OBJ(d->m_huff_codes[table_num]);\n    for (i = 1, j = num_used_syms; i <= code_size_limit; i++)\n      for (l = num_codes[i]; l > 0; l--) d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i);\n  }\n\n  next_code[1] = 0; for (j = 0, i = 2; i <= code_size_limit; i++) next_code[i] = j = ((j + num_codes[i - 1]) << 1);\n\n  for (i = 0; i < table_len; i++)\n  {\n    mz_uint rev_code = 0, code, code_size; if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue;\n    code = next_code[code_size]++; for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1);\n    d->m_huff_codes[table_num][i] = (mz_uint16)rev_code;\n  }\n}\n\n#define TDEFL_PUT_BITS(b, l) do { \\\n  mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \\\n  d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \\\n  while (d->m_bits_in >= 8) { \\\n    if (d->m_pOutput_buf < d->m_pOutput_buf_end) \\\n      *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \\\n      d->m_bit_buffer >>= 8; \\\n      d->m_bits_in -= 8; \\\n  } \\\n} MZ_MACRO_END\n\n#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \\\n  if (rle_repeat_count < 3) { \\\n    d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \\\n    while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \\\n  } else { \\\n    d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \\\n} rle_repeat_count = 0; } }\n\n#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \\\n  if (rle_z_count < 3) { \\\n    d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \\\n  } else if (rle_z_count <= 10) { \\\n    d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \\\n  } else { \\\n    d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \\\n} rle_z_count = 0; } }\n\nstatic mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };\n\nstatic void tdefl_start_dynamic_block(tdefl_compressor *d)\n{\n  int num_lit_codes, num_dist_codes, num_bit_lengths; mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index;\n  mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF;\n\n  d->m_huff_count[0][256] = 1;\n\n  tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE);\n  tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE);\n\n  for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break;\n  for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break;\n\n  memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes);\n  memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes);\n  total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0;\n\n  memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2);\n  for (i = 0; i < total_code_sizes_to_pack; i++)\n  {\n    mz_uint8 code_size = code_sizes_to_pack[i];\n    if (!code_size)\n    {\n      TDEFL_RLE_PREV_CODE_SIZE();\n      if (++rle_z_count == 138) { TDEFL_RLE_ZERO_CODE_SIZE(); }\n    }\n    else\n    {\n      TDEFL_RLE_ZERO_CODE_SIZE();\n      if (code_size != prev_code_size)\n      {\n        TDEFL_RLE_PREV_CODE_SIZE();\n        d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); packed_code_sizes[num_packed_code_sizes++] = code_size;\n      }\n      else if (++rle_repeat_count == 6)\n      {\n        TDEFL_RLE_PREV_CODE_SIZE();\n      }\n    }\n    prev_code_size = code_size;\n  }\n  if (rle_repeat_count) { TDEFL_RLE_PREV_CODE_SIZE(); } else { TDEFL_RLE_ZERO_CODE_SIZE(); }\n\n  tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE);\n\n  TDEFL_PUT_BITS(2, 2);\n\n  TDEFL_PUT_BITS(num_lit_codes - 257, 5);\n  TDEFL_PUT_BITS(num_dist_codes - 1, 5);\n\n  for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) break;\n  num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); TDEFL_PUT_BITS(num_bit_lengths - 4, 4);\n  for (i = 0; (int)i < num_bit_lengths; i++) TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3);\n\n  for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; )\n  {\n    mz_uint code = packed_code_sizes[packed_code_sizes_index++]; MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2);\n    TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]);\n    if (code >= 16) TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], \"\\02\\03\\07\"[code - 16]);\n  }\n}\n\nstatic void tdefl_start_static_block(tdefl_compressor *d)\n{\n  mz_uint i;\n  mz_uint8 *p = &d->m_huff_code_sizes[0][0];\n\n  for (i = 0; i <= 143; ++i) *p++ = 8;\n  for ( ; i <= 255; ++i) *p++ = 9;\n  for ( ; i <= 279; ++i) *p++ = 7;\n  for ( ; i <= 287; ++i) *p++ = 8;\n\n  memset(d->m_huff_code_sizes[1], 5, 32);\n\n  tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE);\n  tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE);\n\n  TDEFL_PUT_BITS(1, 2);\n}\n\nstatic const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS\nstatic mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)\n{\n  mz_uint flags;\n  mz_uint8 *pLZ_codes;\n  mz_uint8 *pOutput_buf = d->m_pOutput_buf;\n  mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf;\n  mz_uint64 bit_buffer = d->m_bit_buffer;\n  mz_uint bits_in = d->m_bits_in;\n\n#define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); }\n\n  flags = 1;\n  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1)\n  {\n    if (flags == 1)\n      flags = *pLZ_codes++ | 0x100;\n\n    if (flags & 1)\n    {\n      mz_uint s0, s1, n0, n1, sym, num_extra_bits;\n      mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3;\n\n      MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);\n\n      // This sequence coaxes MSVC into using cmov's vs. jmp's.\n      s0 = s_tdefl_small_dist_sym[match_dist & 511];\n      n0 = s_tdefl_small_dist_extra[match_dist & 511];\n      s1 = s_tdefl_large_dist_sym[match_dist >> 8];\n      n1 = s_tdefl_large_dist_extra[match_dist >> 8];\n      sym = (match_dist < 512) ? s0 : s1;\n      num_extra_bits = (match_dist < 512) ? n0 : n1;\n\n      MZ_ASSERT(d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);\n    }\n    else\n    {\n      mz_uint lit = *pLZ_codes++;\n      MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n      TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);\n\n      if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end))\n      {\n        flags >>= 1;\n        lit = *pLZ_codes++;\n        MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n        TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);\n\n        if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end))\n        {\n          flags >>= 1;\n          lit = *pLZ_codes++;\n          MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n          TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);\n        }\n      }\n    }\n\n    if (pOutput_buf >= d->m_pOutput_buf_end)\n      return MZ_FALSE;\n\n    *(mz_uint64*)pOutput_buf = bit_buffer;\n    pOutput_buf += (bits_in >> 3);\n    bit_buffer >>= (bits_in & ~7);\n    bits_in &= 7;\n  }\n\n#undef TDEFL_PUT_BITS_FAST\n\n  d->m_pOutput_buf = pOutput_buf;\n  d->m_bits_in = 0;\n  d->m_bit_buffer = 0;\n\n  while (bits_in)\n  {\n    mz_uint32 n = MZ_MIN(bits_in, 16);\n    TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n);\n    bit_buffer >>= n;\n    bits_in -= n;\n  }\n\n  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);\n\n  return (d->m_pOutput_buf < d->m_pOutput_buf_end);\n}\n#else\nstatic mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)\n{\n  mz_uint flags;\n  mz_uint8 *pLZ_codes;\n\n  flags = 1;\n  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1)\n  {\n    if (flags == 1)\n      flags = *pLZ_codes++ | 0x100;\n    if (flags & 1)\n    {\n      mz_uint sym, num_extra_bits;\n      mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3;\n\n      MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);\n\n      if (match_dist < 512)\n      {\n        sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist];\n      }\n      else\n      {\n        sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8];\n      }\n      MZ_ASSERT(d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);\n    }\n    else\n    {\n      mz_uint lit = *pLZ_codes++;\n      MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n      TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);\n    }\n  }\n\n  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);\n\n  return (d->m_pOutput_buf < d->m_pOutput_buf_end);\n}\n#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS\n\nstatic mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block)\n{\n  if (static_block)\n    tdefl_start_static_block(d);\n  else\n    tdefl_start_dynamic_block(d);\n  return tdefl_compress_lz_codes(d);\n}\n\nstatic int tdefl_flush_block(tdefl_compressor *d, int flush)\n{\n  mz_uint saved_bit_buf, saved_bits_in;\n  mz_uint8 *pSaved_output_buf;\n  mz_bool comp_block_succeeded = MZ_FALSE;\n  int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size;\n  mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf;\n\n  d->m_pOutput_buf = pOutput_buf_start;\n  d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16;\n\n  MZ_ASSERT(!d->m_output_flush_remaining);\n  d->m_output_flush_ofs = 0;\n  d->m_output_flush_remaining = 0;\n\n  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left);\n  d->m_pLZ_code_buf -= (d->m_num_flags_left == 8);\n\n  if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index))\n  {\n    TDEFL_PUT_BITS(0x78, 8); TDEFL_PUT_BITS(0x01, 8);\n  }\n\n  TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1);\n\n  pSaved_output_buf = d->m_pOutput_buf; saved_bit_buf = d->m_bit_buffer; saved_bits_in = d->m_bits_in;\n\n  if (!use_raw_block)\n    comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48));\n\n  // If the block gets expanded, forget the current contents of the output buffer and send a raw block instead.\n  if ( ((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) &&\n       ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size) )\n  {\n    mz_uint i; d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;\n    TDEFL_PUT_BITS(0, 2);\n    if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); }\n    for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF)\n    {\n      TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16);\n    }\n    for (i = 0; i < d->m_total_lz_bytes; ++i)\n    {\n      TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8);\n    }\n  }\n  // Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes.\n  else if (!comp_block_succeeded)\n  {\n    d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;\n    tdefl_compress_block(d, MZ_TRUE);\n  }\n\n  if (flush)\n  {\n    if (flush == TDEFL_FINISH)\n    {\n      if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); }\n      if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { mz_uint i, a = d->m_adler32; for (i = 0; i < 4; i++) { TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); a <<= 8; } }\n    }\n    else\n    {\n      mz_uint i, z = 0; TDEFL_PUT_BITS(0, 3); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, z ^= 0xFFFF) { TDEFL_PUT_BITS(z & 0xFFFF, 16); }\n    }\n  }\n\n  MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end);\n\n  memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);\n  memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);\n\n  d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; d->m_total_lz_bytes = 0; d->m_block_index++;\n\n  if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0)\n  {\n    if (d->m_pPut_buf_func)\n    {\n      *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;\n      if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user))\n        return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED);\n    }\n    else if (pOutput_buf_start == d->m_output_buf)\n    {\n      int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs));\n      memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy);\n      d->m_out_buf_ofs += bytes_to_copy;\n      if ((n -= bytes_to_copy) != 0)\n      {\n        d->m_output_flush_ofs = bytes_to_copy;\n        d->m_output_flush_remaining = n;\n      }\n    }\n    else\n    {\n      d->m_out_buf_ofs += n;\n    }\n  }\n\n  return d->m_output_flush_remaining;\n}\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p)\nstatic MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)\n{\n  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;\n  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];\n  const mz_uint16 *s = (const mz_uint16*)(d->m_dict + pos), *p, *q;\n  mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s);\n  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return;\n  for ( ; ; )\n  {\n    for ( ; ; )\n    {\n      if (--num_probes_left == 0) return;\n      #define TDEFL_PROBE \\\n        next_probe_pos = d->m_next[probe_pos]; \\\n        if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \\\n        probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \\\n        if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break;\n      TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE;\n    }\n    if (!dist) break; q = (const mz_uint16*)(d->m_dict + probe_pos); if (TDEFL_READ_UNALIGNED_WORD(q) != s01) continue; p = s; probe_len = 32;\n    do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&\n                   (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) );\n    if (!probe_len)\n    {\n      *pMatch_dist = dist; *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); break;\n    }\n    else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8*)p == *(const mz_uint8*)q)) > match_len)\n    {\n      *pMatch_dist = dist; if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) break;\n      c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]);\n    }\n  }\n}\n#else\nstatic MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)\n{\n  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;\n  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];\n  const mz_uint8 *s = d->m_dict + pos, *p, *q;\n  mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1];\n  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return;\n  for ( ; ; )\n  {\n    for ( ; ; )\n    {\n      if (--num_probes_left == 0) return;\n      #define TDEFL_PROBE \\\n        next_probe_pos = d->m_next[probe_pos]; \\\n        if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \\\n        probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \\\n        if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break;\n      TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE;\n    }\n    if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break;\n    if (probe_len > match_len)\n    {\n      *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return;\n      c0 = d->m_dict[pos + match_len]; c1 = d->m_dict[pos + match_len - 1];\n    }\n  }\n}\n#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\nstatic mz_bool tdefl_compress_fast(tdefl_compressor *d)\n{\n  // Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio.\n  mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left;\n  mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags;\n  mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;\n\n  while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size)))\n  {\n    const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096;\n    mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;\n    mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size);\n    d->m_src_buf_left -= num_bytes_to_process;\n    lookahead_size += num_bytes_to_process;\n\n    while (num_bytes_to_process)\n    {\n      mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process);\n      memcpy(d->m_dict + dst_pos, d->m_pSrc, n);\n      if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))\n        memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos));\n      d->m_pSrc += n;\n      dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK;\n      num_bytes_to_process -= n;\n    }\n\n    dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size);\n    if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) break;\n\n    while (lookahead_size >= 4)\n    {\n      mz_uint cur_match_dist, cur_match_len = 1;\n      mz_uint8 *pCur_dict = d->m_dict + cur_pos;\n      mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF;\n      mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK;\n      mz_uint probe_pos = d->m_hash[hash];\n      d->m_hash[hash] = (mz_uint16)lookahead_pos;\n\n      if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram))\n      {\n        const mz_uint16 *p = (const mz_uint16 *)pCur_dict;\n        const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos);\n        mz_uint32 probe_len = 32;\n        do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&\n          (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) );\n        cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q);\n        if (!probe_len)\n          cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0;\n\n        if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)))\n        {\n          cur_match_len = 1;\n          *pLZ_code_buf++ = (mz_uint8)first_trigram;\n          *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);\n          d->m_huff_count[0][(mz_uint8)first_trigram]++;\n        }\n        else\n        {\n          mz_uint32 s0, s1;\n          cur_match_len = MZ_MIN(cur_match_len, lookahead_size);\n\n          MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE));\n\n          cur_match_dist--;\n\n          pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN);\n          *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist;\n          pLZ_code_buf += 3;\n          *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80);\n\n          s0 = s_tdefl_small_dist_sym[cur_match_dist & 511];\n          s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8];\n          d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++;\n\n          d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++;\n        }\n      }\n      else\n      {\n        *pLZ_code_buf++ = (mz_uint8)first_trigram;\n        *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);\n        d->m_huff_count[0][(mz_uint8)first_trigram]++;\n      }\n\n      if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }\n\n      total_lz_bytes += cur_match_len;\n      lookahead_pos += cur_match_len;\n      dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE);\n      cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK;\n      MZ_ASSERT(lookahead_size >= cur_match_len);\n      lookahead_size -= cur_match_len;\n\n      if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8])\n      {\n        int n;\n        d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;\n        d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;\n        if ((n = tdefl_flush_block(d, 0)) != 0)\n          return (n < 0) ? MZ_FALSE : MZ_TRUE;\n        total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left;\n      }\n    }\n\n    while (lookahead_size)\n    {\n      mz_uint8 lit = d->m_dict[cur_pos];\n\n      total_lz_bytes++;\n      *pLZ_code_buf++ = lit;\n      *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);\n      if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }\n\n      d->m_huff_count[0][lit]++;\n\n      lookahead_pos++;\n      dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE);\n      cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK;\n      lookahead_size--;\n\n      if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8])\n      {\n        int n;\n        d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;\n        d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;\n        if ((n = tdefl_flush_block(d, 0)) != 0)\n          return (n < 0) ? MZ_FALSE : MZ_TRUE;\n        total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left;\n      }\n    }\n  }\n\n  d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;\n  d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;\n  return MZ_TRUE;\n}\n#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n\nstatic MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit)\n{\n  d->m_total_lz_bytes++;\n  *d->m_pLZ_code_buf++ = lit;\n  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; }\n  d->m_huff_count[0][lit]++;\n}\n\nstatic MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist)\n{\n  mz_uint32 s0, s1;\n\n  MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE));\n\n  d->m_total_lz_bytes += match_len;\n\n  d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN);\n\n  match_dist -= 1;\n  d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF);\n  d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); d->m_pLZ_code_buf += 3;\n\n  *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; }\n\n  s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127];\n  d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++;\n\n  if (match_len >= TDEFL_MIN_MATCH_LEN) d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++;\n}\n\nstatic mz_bool tdefl_compress_normal(tdefl_compressor *d)\n{\n  const mz_uint8 *pSrc = d->m_pSrc; size_t src_buf_left = d->m_src_buf_left;\n  tdefl_flush flush = d->m_flush;\n\n  while ((src_buf_left) || ((flush) && (d->m_lookahead_size)))\n  {\n    mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos;\n    // Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN.\n    if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1))\n    {\n      mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2;\n      mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK];\n      mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size);\n      const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process;\n      src_buf_left -= num_bytes_to_process;\n      d->m_lookahead_size += num_bytes_to_process;\n      while (pSrc != pSrc_end)\n      {\n        mz_uint8 c = *pSrc++; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;\n        hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);\n        d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos);\n        dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; ins_pos++;\n      }\n    }\n    else\n    {\n      while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN))\n      {\n        mz_uint8 c = *pSrc++;\n        mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;\n        src_buf_left--;\n        d->m_dict[dst_pos] = c;\n        if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))\n          d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;\n        if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN)\n        {\n          mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2;\n          mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);\n          d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos);\n        }\n      }\n    }\n    d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size);\n    if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN))\n      break;\n\n    // Simple lazy/greedy parsing state machine.\n    len_to_move = 1; cur_match_dist = 0; cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;\n    if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS))\n    {\n      if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS)))\n      {\n        mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK];\n        cur_match_len = 0; while (cur_match_len < d->m_lookahead_size) { if (d->m_dict[cur_pos + cur_match_len] != c) break; cur_match_len++; }\n        if (cur_match_len < TDEFL_MIN_MATCH_LEN) cur_match_len = 0; else cur_match_dist = 1;\n      }\n    }\n    else\n    {\n      tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len);\n    }\n    if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5)))\n    {\n      cur_match_dist = cur_match_len = 0;\n    }\n    if (d->m_saved_match_len)\n    {\n      if (cur_match_len > d->m_saved_match_len)\n      {\n        tdefl_record_literal(d, (mz_uint8)d->m_saved_lit);\n        if (cur_match_len >= 128)\n        {\n          tdefl_record_match(d, cur_match_len, cur_match_dist);\n          d->m_saved_match_len = 0; len_to_move = cur_match_len;\n        }\n        else\n        {\n          d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len;\n        }\n      }\n      else\n      {\n        tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist);\n        len_to_move = d->m_saved_match_len - 1; d->m_saved_match_len = 0;\n      }\n    }\n    else if (!cur_match_dist)\n      tdefl_record_literal(d, d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]);\n    else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128))\n    {\n      tdefl_record_match(d, cur_match_len, cur_match_dist);\n      len_to_move = cur_match_len;\n    }\n    else\n    {\n      d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len;\n    }\n    // Move the lookahead forward by len_to_move bytes.\n    d->m_lookahead_pos += len_to_move;\n    MZ_ASSERT(d->m_lookahead_size >= len_to_move);\n    d->m_lookahead_size -= len_to_move;\n    d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, TDEFL_LZ_DICT_SIZE);\n    // Check if it's time to flush the current LZ codes to the internal output buffer.\n    if ( (d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) ||\n         ( (d->m_total_lz_bytes > 31*1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) )\n    {\n      int n;\n      d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left;\n      if ((n = tdefl_flush_block(d, 0)) != 0)\n        return (n < 0) ? MZ_FALSE : MZ_TRUE;\n    }\n  }\n\n  d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left;\n  return MZ_TRUE;\n}\n\nstatic tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d)\n{\n  if (d->m_pIn_buf_size)\n  {\n    *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;\n  }\n\n  if (d->m_pOut_buf_size)\n  {\n    size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining);\n    memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n);\n    d->m_output_flush_ofs += (mz_uint)n;\n    d->m_output_flush_remaining -= (mz_uint)n;\n    d->m_out_buf_ofs += n;\n\n    *d->m_pOut_buf_size = d->m_out_buf_ofs;\n  }\n\n  return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY;\n}\n\ntdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush)\n{\n  if (!d)\n  {\n    if (pIn_buf_size) *pIn_buf_size = 0;\n    if (pOut_buf_size) *pOut_buf_size = 0;\n    return TDEFL_STATUS_BAD_PARAM;\n  }\n\n  d->m_pIn_buf = pIn_buf; d->m_pIn_buf_size = pIn_buf_size;\n  d->m_pOut_buf = pOut_buf; d->m_pOut_buf_size = pOut_buf_size;\n  d->m_pSrc = (const mz_uint8 *)(pIn_buf); d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0;\n  d->m_out_buf_ofs = 0;\n  d->m_flush = flush;\n\n  if ( ((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) ||\n        (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf) )\n  {\n    if (pIn_buf_size) *pIn_buf_size = 0;\n    if (pOut_buf_size) *pOut_buf_size = 0;\n    return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM);\n  }\n  d->m_wants_to_finish |= (flush == TDEFL_FINISH);\n\n  if ((d->m_output_flush_remaining) || (d->m_finished))\n    return (d->m_prev_return_status = tdefl_flush_output_buffer(d));\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n  if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) &&\n      ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) &&\n      ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | TDEFL_RLE_MATCHES)) == 0))\n  {\n    if (!tdefl_compress_fast(d))\n      return d->m_prev_return_status;\n  }\n  else\n#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n  {\n    if (!tdefl_compress_normal(d))\n      return d->m_prev_return_status;\n  }\n\n  if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf))\n    d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf);\n\n  if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining))\n  {\n    if (tdefl_flush_block(d, flush) < 0)\n      return d->m_prev_return_status;\n    d->m_finished = (flush == TDEFL_FINISH);\n    if (flush == TDEFL_FULL_FLUSH) { MZ_CLEAR_OBJ(d->m_hash); MZ_CLEAR_OBJ(d->m_next); d->m_dict_size = 0; }\n  }\n\n  return (d->m_prev_return_status = tdefl_flush_output_buffer(d));\n}\n\ntdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush)\n{\n  MZ_ASSERT(d->m_pPut_buf_func); return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush);\n}\n\ntdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)\n{\n  d->m_pPut_buf_func = pPut_buf_func; d->m_pPut_buf_user = pPut_buf_user;\n  d->m_flags = (mz_uint)(flags); d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0;\n  d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3;\n  if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash);\n  d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0;\n  d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0;\n  d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8;\n  d->m_pOutput_buf = d->m_output_buf; d->m_pOutput_buf_end = d->m_output_buf; d->m_prev_return_status = TDEFL_STATUS_OKAY;\n  d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; d->m_adler32 = 1;\n  d->m_pIn_buf = NULL; d->m_pOut_buf = NULL;\n  d->m_pIn_buf_size = NULL; d->m_pOut_buf_size = NULL;\n  d->m_flush = TDEFL_NO_FLUSH; d->m_pSrc = NULL; d->m_src_buf_left = 0; d->m_out_buf_ofs = 0;\n  memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);\n  memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);\n  return TDEFL_STATUS_OKAY;\n}\n\ntdefl_status tdefl_get_prev_return_status(tdefl_compressor *d)\n{\n  return d->m_prev_return_status;\n}\n\nmz_uint32 tdefl_get_adler32(tdefl_compressor *d)\n{\n  return d->m_adler32;\n}\n\nmz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)\n{\n  tdefl_compressor *pComp; mz_bool succeeded; if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE;\n  pComp = (tdefl_compressor*)MZ_MALLOC(sizeof(tdefl_compressor)); if (!pComp) return MZ_FALSE;\n  succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY);\n  succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE);\n  MZ_FREE(pComp); return succeeded;\n}\n\ntypedef struct\n{\n  size_t m_size, m_capacity;\n  mz_uint8 *m_pBuf;\n  mz_bool m_expandable;\n} tdefl_output_buffer;\n\nstatic mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser)\n{\n  tdefl_output_buffer *p = (tdefl_output_buffer *)pUser;\n  size_t new_size = p->m_size + len;\n  if (new_size > p->m_capacity)\n  {\n    size_t new_capacity = p->m_capacity; mz_uint8 *pNew_buf; if (!p->m_expandable) return MZ_FALSE;\n    do { new_capacity = MZ_MAX(128U, new_capacity << 1U); } while (new_size > new_capacity);\n    pNew_buf = (mz_uint8*)MZ_REALLOC(p->m_pBuf, new_capacity); if (!pNew_buf) return MZ_FALSE;\n    p->m_pBuf = pNew_buf; p->m_capacity = new_capacity;\n  }\n  memcpy((mz_uint8*)p->m_pBuf + p->m_size, pBuf, len); p->m_size = new_size;\n  return MZ_TRUE;\n}\n\nvoid *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)\n{\n  tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf);\n  if (!pOut_len) return MZ_FALSE; else *pOut_len = 0;\n  out_buf.m_expandable = MZ_TRUE;\n  if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return NULL;\n  *pOut_len = out_buf.m_size; return out_buf.m_pBuf;\n}\n\nsize_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)\n{\n  tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf);\n  if (!pOut_buf) return 0;\n  out_buf.m_pBuf = (mz_uint8*)pOut_buf; out_buf.m_capacity = out_buf_len;\n  if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return 0;\n  return out_buf.m_size;\n}\n\n#ifndef MINIZ_NO_ZLIB_APIS\nstatic const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32,  16, 32, 128, 256,  512, 768, 1500 };\n\n// level may actually range from [0,10] (10 is a \"hidden\" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files).\nmz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy)\n{\n  mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0);\n  if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER;\n\n  if (!level) comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS;\n  else if (strategy == MZ_FILTERED) comp_flags |= TDEFL_FILTER_MATCHES;\n  else if (strategy == MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK;\n  else if (strategy == MZ_FIXED) comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS;\n  else if (strategy == MZ_RLE) comp_flags |= TDEFL_RLE_MATCHES;\n\n  return comp_flags;\n}\n#endif //MINIZ_NO_ZLIB_APIS\n\n#ifdef _MSC_VER\n#pragma warning (push)\n#pragma warning (disable:4204) // nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal)\n#endif\n\n// Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at\n// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/.\n// This is actually a modification of Alex's original code so PNG files generated by this function pass pngcheck.\nMINIZ_STATIC void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, int bpl, size_t *pLen_out, mz_uint level, mz_bool flip)\n{\n  // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was defined.\n  static const mz_uint s_tdefl_png_num_probes[11] = { 0, 1, 6, 32,  16, 32, 128, 256,  512, 768, 1500 };\n  tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); tdefl_output_buffer out_buf; int i, y, z; mz_uint32 c; *pLen_out = 0;\n  if (!pComp) return NULL;\n  MZ_CLEAR_OBJ(out_buf); out_buf.m_expandable = MZ_TRUE; out_buf.m_capacity = 57+MZ_MAX(64, (1+bpl)*h); if (NULL == (out_buf.m_pBuf = (mz_uint8*)MZ_MALLOC(out_buf.m_capacity))) { MZ_FREE(pComp); return NULL; }\n  // write dummy header\n  for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf);\n  // compress image data\n  tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER);\n  for (y = 0; y < h; ++y) { tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); tdefl_compress_buffer(pComp, (mz_uint8*)pImage + (flip ? (h - 1 - y) : y) * bpl, bpl, TDEFL_NO_FLUSH); }\n  if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; }\n  // write real header\n  *pLen_out = out_buf.m_size-41;\n  {\n    static const mz_uint8 chans[] = {0x00, 0x00, 0x04, 0x02, 0x06};\n    mz_uint8 pnghdr[41]={0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,\n      0,0,(mz_uint8)(w>>8),(mz_uint8)w,0,0,(mz_uint8)(h>>8),(mz_uint8)h,8,chans[num_chans],0,0,0,0,0,0,0,\n      (mz_uint8)(*pLen_out>>24),(mz_uint8)(*pLen_out>>16),(mz_uint8)(*pLen_out>>8),(mz_uint8)*pLen_out,0x49,0x44,0x41,0x54};\n    c=(mz_uint32)mz_crc32(MZ_CRC32_INIT,pnghdr+12,17); for (i=0; i<4; ++i, c<<=8) ((mz_uint8*)(pnghdr+29))[i]=(mz_uint8)(c>>24);\n    memcpy(out_buf.m_pBuf, pnghdr, 41);\n  }\n  // write footer (IDAT CRC-32, followed by IEND chunk)\n  if (!tdefl_output_buffer_putter(\"\\0\\0\\0\\0\\0\\0\\0\\0\\x49\\x45\\x4e\\x44\\xae\\x42\\x60\\x82\", 16, &out_buf)) { *pLen_out = 0; MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; }\n  c = (mz_uint32)mz_crc32(MZ_CRC32_INIT,out_buf.m_pBuf+41-4, *pLen_out+4); for (i=0; i<4; ++i, c<<=8) (out_buf.m_pBuf+out_buf.m_size-16)[i] = (mz_uint8)(c >> 24);\n  // compute final size of file, grab compressed data buffer and return\n  *pLen_out += 57; MZ_FREE(pComp); return out_buf.m_pBuf;\n}\nMINIZ_STATIC void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, int bpl, size_t *pLen_out)\n{\n  // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's where #defined out)\n  return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, bpl, pLen_out, 6, MZ_FALSE);\n}\n\n#ifdef _MSC_VER\n#pragma warning (pop)\n#endif\n\n// ------------------- .ZIP archive reading\n\n#ifndef MINIZ_NO_ARCHIVE_APIS\n\n#ifdef MINIZ_NO_STDIO\n  #define MZ_FILE void *\n#else\n  #include <stdio.h>\n  #include <sys/stat.h>\n\n  #if defined(_MSC_VER) || defined(__MINGW64__)\n    static FILE *mz_fopen(const char *pFilename, const char *pMode)\n    {\n      FILE* pFile = NULL;\n      fopen_s(&pFile, pFilename, pMode);\n      return pFile;\n    }\n    static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream)\n    {\n      FILE* pFile = NULL;\n      if (freopen_s(&pFile, pPath, pMode, pStream))\n        return NULL;\n      return pFile;\n    }\n    #ifndef MINIZ_NO_TIME\n      #include <sys/utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN mz_fopen\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 _ftelli64\n    #define MZ_FSEEK64 _fseeki64\n    #define MZ_FILE_STAT_STRUCT _stat\n    #define MZ_FILE_STAT _stat\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN mz_freopen\n    #define MZ_DELETE_FILE remove\n  #elif defined(__MINGW32__)\n    #ifndef MINIZ_NO_TIME\n      #include <sys/utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN(f, m) fopen(f, m)\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 ftello64\n    #define MZ_FSEEK64 fseeko64\n    #define MZ_FILE_STAT_STRUCT _stat\n    #define MZ_FILE_STAT _stat\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN(f, m, s) freopen(f, m, s)\n    #define MZ_DELETE_FILE remove\n  #elif defined(__TINYC__)\n    #ifndef MINIZ_NO_TIME\n      #include <sys/utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN(f, m) fopen(f, m)\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 ftell\n    #define MZ_FSEEK64 fseek\n    #define MZ_FILE_STAT_STRUCT stat\n    #define MZ_FILE_STAT stat\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN(f, m, s) freopen(f, m, s)\n    #define MZ_DELETE_FILE remove\n  #elif defined(__GNUC__) && _LARGEFILE64_SOURCE\n    #ifndef MINIZ_NO_TIME\n      #include <utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN(f, m) fopen64(f, m)\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 ftello64\n    #define MZ_FSEEK64 fseeko64\n    #define MZ_FILE_STAT_STRUCT stat64\n    #define MZ_FILE_STAT stat64\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN(p, m, s) freopen64(p, m, s)\n    #define MZ_DELETE_FILE remove\n  #else\n    #ifndef MINIZ_NO_TIME\n      #include <utime.h>\n    #endif\n    #define MZ_FILE FILE\n    #define MZ_FOPEN(f, m) fopen(f, m)\n    #define MZ_FCLOSE fclose\n    #define MZ_FREAD fread\n    #define MZ_FWRITE fwrite\n    #define MZ_FTELL64 ftello\n    #define MZ_FSEEK64 fseeko\n    #define MZ_FILE_STAT_STRUCT stat\n    #define MZ_FILE_STAT stat\n    #define MZ_FFLUSH fflush\n    #define MZ_FREOPEN(f, m, s) freopen(f, m, s)\n    #define MZ_DELETE_FILE remove\n  #endif // #ifdef _MSC_VER\n#endif // #ifdef MINIZ_NO_STDIO\n\n#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c))\n\n// Various ZIP archive enums. To completely avoid cross platform compiler alignment and platform endian issues, miniz.c doesn't use structs for any of this stuff.\nenum\n{\n  // ZIP archive identifiers and record sizes\n  MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50, MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50, MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50,\n  MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22,\n  // Central directory header record offsets\n  MZ_ZIP_CDH_SIG_OFS = 0, MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6, MZ_ZIP_CDH_BIT_FLAG_OFS = 8,\n  MZ_ZIP_CDH_METHOD_OFS = 10, MZ_ZIP_CDH_FILE_TIME_OFS = 12, MZ_ZIP_CDH_FILE_DATE_OFS = 14, MZ_ZIP_CDH_CRC32_OFS = 16,\n  MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20, MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24, MZ_ZIP_CDH_FILENAME_LEN_OFS = 28, MZ_ZIP_CDH_EXTRA_LEN_OFS = 30,\n  MZ_ZIP_CDH_COMMENT_LEN_OFS = 32, MZ_ZIP_CDH_DISK_START_OFS = 34, MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36, MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38, MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42,\n  // Local directory header offsets\n  MZ_ZIP_LDH_SIG_OFS = 0, MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4, MZ_ZIP_LDH_BIT_FLAG_OFS = 6, MZ_ZIP_LDH_METHOD_OFS = 8, MZ_ZIP_LDH_FILE_TIME_OFS = 10,\n  MZ_ZIP_LDH_FILE_DATE_OFS = 12, MZ_ZIP_LDH_CRC32_OFS = 14, MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18, MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22,\n  MZ_ZIP_LDH_FILENAME_LEN_OFS = 26, MZ_ZIP_LDH_EXTRA_LEN_OFS = 28,\n  // End of central directory offsets\n  MZ_ZIP_ECDH_SIG_OFS = 0, MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4, MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6, MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8,\n  MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10, MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20,\n};\n\ntypedef struct\n{\n  void *m_p;\n  size_t m_size, m_capacity;\n  mz_uint m_element_size;\n} mz_zip_array;\n\nstruct mz_zip_internal_state_tag\n{\n  mz_zip_array m_central_dir;\n  mz_zip_array m_central_dir_offsets;\n  mz_zip_array m_sorted_central_dir_offsets;\n  MZ_FILE *m_pFile;\n  void *m_pMem;\n  size_t m_mem_size;\n  size_t m_mem_capacity;\n};\n\n#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) (array_ptr)->m_element_size = element_size\n#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[index]\n\nstatic MZ_FORCEINLINE void mz_zip_array_clear(mz_zip_archive *pZip, mz_zip_array *pArray)\n{\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p);\n  memset(pArray, 0, sizeof(mz_zip_array));\n}\n\nstatic mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip, mz_zip_array *pArray, size_t min_new_capacity, mz_uint growing)\n{\n  void *pNew_p; size_t new_capacity = min_new_capacity; MZ_ASSERT(pArray->m_element_size); if (pArray->m_capacity >= min_new_capacity) return MZ_TRUE;\n  if (growing) { new_capacity = MZ_MAX(1, pArray->m_capacity); while (new_capacity < min_new_capacity) new_capacity *= 2; }\n  if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p, pArray->m_element_size, new_capacity))) return MZ_FALSE;\n  pArray->m_p = pNew_p; pArray->m_capacity = new_capacity;\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_reserve(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_capacity, mz_uint growing)\n{\n  if (new_capacity > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing)) return MZ_FALSE; }\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_resize(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_size, mz_uint growing)\n{\n  if (new_size > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing)) return MZ_FALSE; }\n  pArray->m_size = new_size;\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip, mz_zip_array *pArray, size_t n)\n{\n  return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE);\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, mz_zip_array *pArray, const void *pElements, size_t n)\n{\n  size_t orig_size = pArray->m_size; if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) return MZ_FALSE;\n  memcpy((mz_uint8*)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size);\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_TIME\nstatic time_t mz_zip_dos_to_time_t(int dos_time, int dos_date)\n{\n  struct tm tm;\n  memset(&tm, 0, sizeof(tm)); tm.tm_isdst = -1;\n  tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; tm.tm_mon = ((dos_date >> 5) & 15) - 1; tm.tm_mday = dos_date & 31;\n  tm.tm_hour = (dos_time >> 11) & 31; tm.tm_min = (dos_time >> 5) & 63; tm.tm_sec = (dos_time << 1) & 62;\n  return mktime(&tm);\n}\n\nstatic void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date)\n{\n#ifdef _MSC_VER\n  struct tm tm_struct;\n  struct tm *tm = &tm_struct;\n  errno_t err = localtime_s(tm, &time);\n  if (err)\n  {\n    *pDOS_date = 0; *pDOS_time = 0;\n    return;\n  }\n#else\n  struct tm *tm = localtime(&time);\n#endif\n  *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1));\n  *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday);\n}\n#endif\n\n#ifndef MINIZ_NO_STDIO\nstatic mz_bool mz_zip_get_file_modified_time(const char *pFilename, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date)\n{\n#ifdef MINIZ_NO_TIME\n  (void)pFilename; *pDOS_date = *pDOS_time = 0;\n#else\n  struct MZ_FILE_STAT_STRUCT file_stat;\n  // On Linux with x86 glibc, this call will fail on large files (>= 0x80000000 bytes) unless you compiled with _LARGEFILE64_SOURCE. Argh.\n  if (MZ_FILE_STAT(pFilename, &file_stat) != 0)\n    return MZ_FALSE;\n  mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date);\n#endif // #ifdef MINIZ_NO_TIME\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_TIME\nstatic mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time, time_t modified_time)\n{\n  struct utimbuf t; t.actime = access_time; t.modtime = modified_time;\n  return !utime(pFilename, &t);\n}\n#endif // #ifndef MINIZ_NO_TIME\n#endif // #ifndef MINIZ_NO_STDIO\n\nstatic mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, mz_uint32 flags)\n{\n  (void)flags;\n  if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))\n    return MZ_FALSE;\n\n  if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func;\n  if (!pZip->m_pFree) pZip->m_pFree = def_free_func;\n  if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func;\n\n  pZip->m_zip_mode = MZ_ZIP_MODE_READING;\n  pZip->m_archive_size = 0;\n  pZip->m_central_directory_file_ofs = 0;\n  pZip->m_total_files = 0;\n\n  if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))\n    return MZ_FALSE;\n  memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32));\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, mz_uint r_index)\n{\n  const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE;\n  const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index));\n  mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS), r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  mz_uint8 l = 0, r = 0;\n  pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n  pE = pL + MZ_MIN(l_len, r_len);\n  while (pL < pE)\n  {\n    if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR)))\n      break;\n    pL++; pR++;\n  }\n  return (pL == pE) ? (l_len < r_len) : (l < r);\n}\n\n#define MZ_SWAP_UINT32(a, b) do { mz_uint32 t = a; a = b; b = t; } MZ_MACRO_END\n\n// Heap sort of lowercased filenames, used to help accelerate plain central directory searches by mz_zip_reader_locate_file(). (Could also use qsort(), but it could allocate memory.)\nstatic void mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip)\n{\n  mz_zip_internal_state *pState = pZip->m_pState;\n  const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;\n  const mz_zip_array *pCentral_dir = &pState->m_central_dir;\n  mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0);\n  const int size = pZip->m_total_files;\n  int start = (size - 2) >> 1, end;\n  while (start >= 0)\n  {\n    int child, root = start;\n    for ( ; ; )\n    {\n      if ((child = (root << 1) + 1) >= size)\n        break;\n      child += (((child + 1) < size) && (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1])));\n      if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child]))\n        break;\n      MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child;\n    }\n    start--;\n  }\n\n  end = size - 1;\n  while (end > 0)\n  {\n    int child, root = 0;\n    MZ_SWAP_UINT32(pIndices[end], pIndices[0]);\n    for ( ; ; )\n    {\n      if ((child = (root << 1) + 1) >= end)\n        break;\n      child += (((child + 1) < end) && mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1]));\n      if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child]))\n        break;\n      MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child;\n    }\n    end--;\n  }\n}\n\nstatic mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint32 flags)\n{\n  mz_uint cdir_size, num_this_disk, cdir_disk_index;\n  mz_uint64 cdir_ofs;\n  mz_int64 cur_file_ofs;\n  const mz_uint8 *p;\n  mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; mz_uint8 *pBuf = (mz_uint8 *)buf_u32;\n  mz_bool sort_central_dir = ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0);\n  // Basic sanity checks - reject files which are too small, and check the first 4 bytes of the file to make sure a local header is there.\n  if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  // Find the end of central directory record by scanning the file from the end towards the beginning.\n  cur_file_ofs = MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0);\n  for ( ; ; )\n  {\n    int i, n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs);\n    if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n)\n      return MZ_FALSE;\n    for (i = n - 4; i >= 0; --i)\n      if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG)\n        break;\n    if (i >= 0)\n    {\n      cur_file_ofs += i;\n      break;\n    }\n    if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)))\n      return MZ_FALSE;\n    cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0);\n  }\n  // Read and verify the end of central directory record.\n  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) ||\n      ((pZip->m_total_files = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) != MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS)))\n    return MZ_FALSE;\n\n  num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS);\n  cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS);\n  if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1)))\n    return MZ_FALSE;\n\n  if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n\n  cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS);\n  if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size)\n    return MZ_FALSE;\n\n  pZip->m_central_directory_file_ofs = cdir_ofs;\n\n  if (pZip->m_total_files)\n  {\n     mz_uint i, n;\n\n    // Read the entire central directory into a heap block, and allocate another heap block to hold the unsorted central dir file record offsets, and another to hold the sorted indices.\n    if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, MZ_FALSE)) ||\n        (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, pZip->m_total_files, MZ_FALSE)))\n      return MZ_FALSE;\n\n    if (sort_central_dir)\n    {\n      if (!mz_zip_array_resize(pZip, &pZip->m_pState->m_sorted_central_dir_offsets, pZip->m_total_files, MZ_FALSE))\n        return MZ_FALSE;\n    }\n\n    if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, pZip->m_pState->m_central_dir.m_p, cdir_size) != cdir_size)\n      return MZ_FALSE;\n\n    // Now create an index into the central directory file records, do some basic sanity checking on each record, and check for zip64 entries (which are not yet supported).\n    p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p;\n    for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i)\n    {\n      mz_uint total_header_size, comp_size, decomp_size, disk_index;\n      if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG))\n        return MZ_FALSE;\n      MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, i) = (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p);\n      if (sort_central_dir)\n        MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, mz_uint32, i) = i;\n      comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n      decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);\n      if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && (decomp_size != comp_size)) || (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || (comp_size == 0xFFFFFFFF))\n        return MZ_FALSE;\n      disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS);\n      if ((disk_index != num_this_disk) && (disk_index != 1))\n        return MZ_FALSE;\n      if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size)\n        return MZ_FALSE;\n      if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > n)\n        return MZ_FALSE;\n      n -= total_header_size; p += total_header_size;\n    }\n  }\n\n  if (sort_central_dir)\n    mz_zip_reader_sort_central_dir_offsets_by_filename(pZip);\n\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags)\n{\n  if ((!pZip) || (!pZip->m_pRead))\n    return MZ_FALSE;\n  if (!mz_zip_reader_init_internal(pZip, flags))\n    return MZ_FALSE;\n  pZip->m_archive_size = size;\n  if (!mz_zip_reader_read_central_dir(pZip, flags))\n  {\n    mz_zip_reader_end(pZip);\n    return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n\nstatic size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n)\n{\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  size_t s = (file_ofs >= pZip->m_archive_size) ? 0 : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n);\n  memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s);\n  return s;\n}\n\nmz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags)\n{\n  if (!mz_zip_reader_init_internal(pZip, flags))\n    return MZ_FALSE;\n  pZip->m_archive_size = size;\n  pZip->m_pRead = mz_zip_mem_read_func;\n  pZip->m_pIO_opaque = pZip;\n#ifdef __cplusplus\n  pZip->m_pState->m_pMem = const_cast<void *>(pMem);\n#else\n  pZip->m_pState->m_pMem = (void *)pMem;\n#endif\n  pZip->m_pState->m_mem_size = size;\n  if (!mz_zip_reader_read_central_dir(pZip, flags))\n  {\n    mz_zip_reader_end(pZip);\n    return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nstatic size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n)\n{\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);\n  if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))\n    return 0;\n  return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile);\n}\n\nmz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags)\n{\n  mz_uint64 file_size;\n  MZ_FILE *pFile = MZ_FOPEN(pFilename, \"rb\");\n  if (!pFile)\n    return MZ_FALSE;\n  if (MZ_FSEEK64(pFile, 0, SEEK_END))\n  {\n    MZ_FCLOSE(pFile);\n    return MZ_FALSE;\n  }\n  file_size = MZ_FTELL64(pFile);\n  if (!mz_zip_reader_init_internal(pZip, flags))\n  {\n    MZ_FCLOSE(pFile);\n    return MZ_FALSE;\n  }\n  pZip->m_pRead = mz_zip_file_read_func;\n  pZip->m_pIO_opaque = pZip;\n  pZip->m_pState->m_pFile = pFile;\n  pZip->m_archive_size = file_size;\n  if (!mz_zip_reader_read_central_dir(pZip, flags))\n  {\n    mz_zip_reader_end(pZip);\n    return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n#endif // #ifndef MINIZ_NO_STDIO\n\nmz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip)\n{\n  return pZip ? pZip->m_total_files : 0;\n}\n\nstatic MZ_FORCEINLINE const mz_uint8 *mz_zip_reader_get_cdh(mz_zip_archive *pZip, mz_uint file_index)\n{\n  if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return NULL;\n  return &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index));\n}\n\nmz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index)\n{\n  mz_uint m_bit_flag;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if (!p)\n    return MZ_FALSE;\n  m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);\n  return (m_bit_flag & 1);\n}\n\nmz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index)\n{\n  mz_uint filename_len, external_attr;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if (!p)\n    return MZ_FALSE;\n\n  // First see if the filename ends with a '/' character.\n  filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  if (filename_len)\n  {\n    if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/')\n      return MZ_TRUE;\n  }\n\n  // Bugfix: This code was also checking if the internal attribute was non-zero, which wasn't correct.\n  // Most/all zip writers (hopefully) set DOS file/directory attributes in the low 16-bits, so check for the DOS directory flag and ignore the source OS ID in the created by field.\n  // FIXME: Remove this check? Is it necessary - we already check the filename.\n  external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);\n  if ((external_attr & 0x10) != 0)\n    return MZ_TRUE;\n\n  return MZ_FALSE;\n}\n\nmz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat)\n{\n  mz_uint n;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if ((!p) || (!pStat))\n    return MZ_FALSE;\n\n  // Unpack the central directory record.\n  pStat->m_file_index = file_index;\n  pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index);\n  pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS);\n  pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS);\n  pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);\n  pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS);\n#ifndef MINIZ_NO_TIME\n  pStat->m_time = mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS));\n#endif\n  pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS);\n  pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n  pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);\n  pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS);\n  pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);\n  pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS);\n\n  // Copy as much of the filename and comment as possible.\n  n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1);\n  memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); pStat->m_filename[n] = '\\0';\n\n  n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1);\n  pStat->m_comment_size = n;\n  memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); pStat->m_comment[n] = '\\0';\n\n  return MZ_TRUE;\n}\n\nmz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size)\n{\n  mz_uint n;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if (!p) { if (filename_buf_size) pFilename[0] = '\\0'; return 0; }\n  n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  if (filename_buf_size)\n  {\n    n = MZ_MIN(n, filename_buf_size - 1);\n    memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n);\n    pFilename[n] = '\\0';\n  }\n  return n + 1;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_reader_string_equal(const char *pA, const char *pB, mz_uint len, mz_uint flags)\n{\n  mz_uint i;\n  if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE)\n    return 0 == memcmp(pA, pB, len);\n  for (i = 0; i < len; ++i)\n    if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i]))\n      return MZ_FALSE;\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE int mz_zip_reader_filename_compare(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR, mz_uint r_len)\n{\n  const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE;\n  mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  mz_uint8 l = 0, r = 0;\n  pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n  pE = pL + MZ_MIN(l_len, r_len);\n  while (pL < pE)\n  {\n    if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR)))\n      break;\n    pL++; pR++;\n  }\n  return (pL == pE) ? (int)(l_len - r_len) : (l - r);\n}\n\nstatic int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip, const char *pFilename)\n{\n  mz_zip_internal_state *pState = pZip->m_pState;\n  const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;\n  const mz_zip_array *pCentral_dir = &pState->m_central_dir;\n  mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0);\n  const int size = pZip->m_total_files;\n  const mz_uint filename_len = (mz_uint)strlen(pFilename);\n  int l = 0, h = size - 1;\n  while (l <= h)\n  {\n    int m = (l + h) >> 1, file_index = pIndices[m], comp = mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len);\n    if (!comp)\n      return file_index;\n    else if (comp < 0)\n      l = m + 1;\n    else\n      h = m - 1;\n  }\n  return -1;\n}\n\nint mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags)\n{\n  mz_uint file_index; size_t name_len, comment_len;\n  if ((!pZip) || (!pZip->m_pState) || (!pName) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return -1;\n  if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) && (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_size))\n    return mz_zip_reader_locate_file_binary_search(pZip, pName);\n  name_len = strlen(pName); if (name_len > 0xFFFF) return -1;\n  comment_len = pComment ? strlen(pComment) : 0; if (comment_len > 0xFFFF) return -1;\n  for (file_index = 0; file_index < pZip->m_total_files; file_index++)\n  {\n    const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index));\n    mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n    const char *pFilename = (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n    if (filename_len < name_len)\n      continue;\n    if (comment_len)\n    {\n      mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS), file_comment_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS);\n      const char *pFile_comment = pFilename + filename_len + file_extra_len;\n      if ((file_comment_len != comment_len) || (!mz_zip_reader_string_equal(pComment, pFile_comment, file_comment_len, flags)))\n        continue;\n    }\n    if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len))\n    {\n      int ofs = filename_len - 1;\n      do\n      {\n        if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\\\') || (pFilename[ofs] == ':'))\n          break;\n      } while (--ofs >= 0);\n      ofs++;\n      pFilename += ofs; filename_len -= ofs;\n    }\n    if ((filename_len == name_len) && (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags)))\n      return file_index;\n  }\n  return -1;\n}\n\nmz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)\n{\n  int status = TINFL_STATUS_DONE;\n  mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail;\n  mz_zip_archive_file_stat file_stat;\n  void *pRead_buf;\n  mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;\n  tinfl_decompressor inflator;\n\n  if ((buf_size) && (!pBuf))\n    return MZ_FALSE;\n\n  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))\n    return MZ_FALSE;\n\n  // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes)\n  if (!file_stat.m_comp_size)\n    return MZ_TRUE;\n\n  // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers).\n  // I'm torn how to handle this case - should it fail instead?\n  if (mz_zip_reader_is_file_a_directory(pZip, file_index))\n    return MZ_TRUE;\n\n  // Encryption and patch files are not supported.\n  if (file_stat.m_bit_flag & (1 | 32))\n    return MZ_FALSE;\n\n  // This function only supports stored and deflate.\n  if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED))\n    return MZ_FALSE;\n\n  // Ensure supplied output buffer is large enough.\n  needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size : file_stat.m_uncomp_size;\n  if (buf_size < needed_size)\n    return MZ_FALSE;\n\n  // Read and parse the local directory entry.\n  cur_file_ofs = file_stat.m_local_header_ofs;\n  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)\n    return MZ_FALSE;\n\n  cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);\n  if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)\n    return MZ_FALSE;\n\n  if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method))\n  {\n    // The file is stored or the caller has requested the compressed data.\n    if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, (size_t)needed_size) != needed_size)\n      return MZ_FALSE;\n    return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32);\n  }\n\n  // Decompress the file either directly from memory or from a file input buffer.\n  tinfl_init(&inflator);\n\n  if (pZip->m_pState->m_pMem)\n  {\n    // Read directly from the archive in memory.\n    pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;\n    read_buf_size = read_buf_avail = file_stat.m_comp_size;\n    comp_remaining = 0;\n  }\n  else if (pUser_read_buf)\n  {\n    // Use a user provided read buffer.\n    if (!user_read_buf_size)\n      return MZ_FALSE;\n    pRead_buf = (mz_uint8 *)pUser_read_buf;\n    read_buf_size = user_read_buf_size;\n    read_buf_avail = 0;\n    comp_remaining = file_stat.m_comp_size;\n  }\n  else\n  {\n    // Temporarily allocate a read buffer.\n    read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE);\n#ifdef _MSC_VER\n    if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF))\n#else\n    if (((sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF))\n#endif\n      return MZ_FALSE;\n    if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size)))\n      return MZ_FALSE;\n    read_buf_avail = 0;\n    comp_remaining = file_stat.m_comp_size;\n  }\n\n  do\n  {\n    size_t in_buf_size, out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs);\n    if ((!read_buf_avail) && (!pZip->m_pState->m_pMem))\n    {\n      read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);\n      if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)\n      {\n        status = TINFL_STATUS_FAILED;\n        break;\n      }\n      cur_file_ofs += read_buf_avail;\n      comp_remaining -= read_buf_avail;\n      read_buf_ofs = 0;\n    }\n    in_buf_size = (size_t)read_buf_avail;\n    status = tinfl_decompress(&inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF | (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0));\n    read_buf_avail -= in_buf_size;\n    read_buf_ofs += in_buf_size;\n    out_buf_ofs += out_buf_size;\n  } while (status == TINFL_STATUS_NEEDS_MORE_INPUT);\n\n  if (status == TINFL_STATUS_DONE)\n  {\n    // Make sure the entire file was decompressed, and check its CRC.\n    if ((out_buf_ofs != file_stat.m_uncomp_size) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32))\n      status = TINFL_STATUS_FAILED;\n  }\n\n  if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf))\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n\n  return status == TINFL_STATUS_DONE;\n}\n\nmz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)\n{\n  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);\n  if (file_index < 0)\n    return MZ_FALSE;\n  return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size);\n}\n\nmz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags)\n{\n  return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, NULL, 0);\n}\n\nmz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags)\n{\n  return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf, buf_size, flags, NULL, 0);\n}\n\nvoid *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags)\n{\n  mz_uint64 comp_size, uncomp_size, alloc_size;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  void *pBuf;\n\n  if (pSize)\n    *pSize = 0;\n  if (!p)\n    return NULL;\n\n  comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n  uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);\n\n  alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size;\n#ifdef _MSC_VER\n  if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))\n#else\n  if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))\n#endif\n    return NULL;\n  if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size)))\n    return NULL;\n\n  if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, flags))\n  {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n    return NULL;\n  }\n\n  if (pSize) *pSize = (size_t)alloc_size;\n  return pBuf;\n}\n\nvoid *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags)\n{\n  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);\n  if (file_index < 0)\n  {\n    if (pSize) *pSize = 0;\n    return MZ_FALSE;\n  }\n  return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags);\n}\n\nmz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags)\n{\n  int status = TINFL_STATUS_DONE; mz_uint file_crc32 = MZ_CRC32_INIT;\n  mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, out_buf_ofs = 0, cur_file_ofs;\n  mz_zip_archive_file_stat file_stat;\n  void *pRead_buf = NULL; void *pWrite_buf = NULL;\n  mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;\n\n  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))\n    return MZ_FALSE;\n\n  // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes)\n  if (!file_stat.m_comp_size)\n    return MZ_TRUE;\n\n  // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers).\n  // I'm torn how to handle this case - should it fail instead?\n  if (mz_zip_reader_is_file_a_directory(pZip, file_index))\n    return MZ_TRUE;\n\n  // Encryption and patch files are not supported.\n  if (file_stat.m_bit_flag & (1 | 32))\n    return MZ_FALSE;\n\n  // This function only supports stored and deflate.\n  if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED))\n    return MZ_FALSE;\n\n  // Read and parse the local directory entry.\n  cur_file_ofs = file_stat.m_local_header_ofs;\n  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)\n    return MZ_FALSE;\n\n  cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);\n  if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)\n    return MZ_FALSE;\n\n  // Decompress the file either directly from memory or from a file input buffer.\n  if (pZip->m_pState->m_pMem)\n  {\n    pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;\n    read_buf_size = read_buf_avail = file_stat.m_comp_size;\n    comp_remaining = 0;\n  }\n  else\n  {\n    read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE);\n    if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size)))\n      return MZ_FALSE;\n    read_buf_avail = 0;\n    comp_remaining = file_stat.m_comp_size;\n  }\n\n  if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method))\n  {\n    // The file is stored or the caller has requested the compressed data.\n    if (pZip->m_pState->m_pMem)\n    {\n#ifdef _MSC_VER\n      if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF))\n#else\n      if (((sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF))\n#endif\n        return MZ_FALSE;\n      if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)file_stat.m_comp_size) != file_stat.m_comp_size)\n        status = TINFL_STATUS_FAILED;\n      else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))\n        file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)file_stat.m_comp_size);\n      cur_file_ofs += file_stat.m_comp_size;\n      out_buf_ofs += file_stat.m_comp_size;\n      comp_remaining = 0;\n    }\n    else\n    {\n      while (comp_remaining)\n      {\n        read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);\n        if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)\n        {\n          status = TINFL_STATUS_FAILED;\n          break;\n        }\n\n        if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))\n          file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail);\n\n        if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)\n        {\n          status = TINFL_STATUS_FAILED;\n          break;\n        }\n        cur_file_ofs += read_buf_avail;\n        out_buf_ofs += read_buf_avail;\n        comp_remaining -= read_buf_avail;\n      }\n    }\n  }\n  else\n  {\n    tinfl_decompressor inflator;\n    tinfl_init(&inflator);\n\n    if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, TINFL_LZ_DICT_SIZE)))\n      status = TINFL_STATUS_FAILED;\n    else\n    {\n      do\n      {\n        mz_uint8 *pWrite_buf_cur = (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));\n        size_t in_buf_size, out_buf_size = TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));\n        if ((!read_buf_avail) && (!pZip->m_pState->m_pMem))\n        {\n          read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);\n          if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail)\n          {\n            status = TINFL_STATUS_FAILED;\n            break;\n          }\n          cur_file_ofs += read_buf_avail;\n          comp_remaining -= read_buf_avail;\n          read_buf_ofs = 0;\n        }\n\n        in_buf_size = (size_t)read_buf_avail;\n        status = tinfl_decompress(&inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size, comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0);\n        read_buf_avail -= in_buf_size;\n        read_buf_ofs += in_buf_size;\n\n        if (out_buf_size)\n        {\n          if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != out_buf_size)\n          {\n            status = TINFL_STATUS_FAILED;\n            break;\n          }\n          file_crc32 = (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size);\n          if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size)\n          {\n            status = TINFL_STATUS_FAILED;\n            break;\n          }\n        }\n      } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) || (status == TINFL_STATUS_HAS_MORE_OUTPUT));\n    }\n  }\n\n  if ((status == TINFL_STATUS_DONE) && (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)))\n  {\n    // Make sure the entire file was decompressed, and check its CRC.\n    if ((out_buf_ofs != file_stat.m_uncomp_size) || (file_crc32 != file_stat.m_crc32))\n      status = TINFL_STATUS_FAILED;\n  }\n\n  if (!pZip->m_pState->m_pMem)\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n  if (pWrite_buf)\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf);\n\n  return status == TINFL_STATUS_DONE;\n}\n\nmz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags)\n{\n  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);\n  if (file_index < 0)\n    return MZ_FALSE;\n  return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque, flags);\n}\n\n#ifndef MINIZ_NO_STDIO\nstatic size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs, const void *pBuf, size_t n)\n{\n  (void)ofs; return MZ_FWRITE(pBuf, 1, n, (MZ_FILE*)pOpaque);\n}\n\nmz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags)\n{\n  mz_bool status;\n  mz_zip_archive_file_stat file_stat;\n  MZ_FILE *pFile;\n  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat))\n    return MZ_FALSE;\n  pFile = MZ_FOPEN(pDst_filename, \"wb\");\n  if (!pFile)\n    return MZ_FALSE;\n  status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags);\n  if (MZ_FCLOSE(pFile) == EOF)\n    return MZ_FALSE;\n#ifndef MINIZ_NO_TIME\n  if (status)\n    mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time);\n#endif\n  return status;\n}\n#endif // #ifndef MINIZ_NO_STDIO\n\nmz_bool mz_zip_reader_end(mz_zip_archive *pZip)\n{\n  if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return MZ_FALSE;\n\n  if (pZip->m_pState)\n  {\n    mz_zip_internal_state *pState = pZip->m_pState; pZip->m_pState = NULL;\n    mz_zip_array_clear(pZip, &pState->m_central_dir);\n    mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);\n    mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);\n\n#ifndef MINIZ_NO_STDIO\n    if (pState->m_pFile)\n    {\n      MZ_FCLOSE(pState->m_pFile);\n      pState->m_pFile = NULL;\n    }\n#endif // #ifndef MINIZ_NO_STDIO\n\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pState);\n  }\n  pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;\n\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags)\n{\n  int file_index = mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags);\n  if (file_index < 0)\n    return MZ_FALSE;\n  return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags);\n}\n#endif\n\n// ------------------- .ZIP archive writing\n\n#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\nstatic void mz_write_le16(mz_uint8 *p, mz_uint16 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); }\nstatic void mz_write_le32(mz_uint8 *p, mz_uint32 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); p[2] = (mz_uint8)(v >> 16); p[3] = (mz_uint8)(v >> 24); }\n#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v))\n#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v))\n\nmz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size)\n{\n  if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))\n    return MZ_FALSE;\n\n  if (pZip->m_file_offset_alignment)\n  {\n    // Ensure user specified file offset alignment is a power of 2.\n    if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1))\n      return MZ_FALSE;\n  }\n\n  if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func;\n  if (!pZip->m_pFree) pZip->m_pFree = def_free_func;\n  if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func;\n\n  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;\n  pZip->m_archive_size = existing_size;\n  pZip->m_central_directory_file_ofs = 0;\n  pZip->m_total_files = 0;\n\n  if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))\n    return MZ_FALSE;\n  memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32));\n  return MZ_TRUE;\n}\n\nstatic size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n)\n{\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  mz_zip_internal_state *pState = pZip->m_pState;\n  mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size);\n#ifdef _MSC_VER\n  if ((!n) || ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))\n#else\n  if ((!n) || ((sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))\n#endif\n    return 0;\n  if (new_size > pState->m_mem_capacity)\n  {\n    void *pNew_block;\n    size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity); while (new_capacity < new_size) new_capacity *= 2;\n    if (NULL == (pNew_block = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity)))\n      return 0;\n    pState->m_pMem = pNew_block; pState->m_mem_capacity = new_capacity;\n  }\n  memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n);\n  pState->m_mem_size = (size_t)new_size;\n  return n;\n}\n\nmz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size)\n{\n  pZip->m_pWrite = mz_zip_heap_write_func;\n  pZip->m_pIO_opaque = pZip;\n  if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning))\n    return MZ_FALSE;\n  if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size, size_to_reserve_at_beginning)))\n  {\n    if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, initial_allocation_size)))\n    {\n      mz_zip_writer_end(pZip);\n      return MZ_FALSE;\n    }\n    pZip->m_pState->m_mem_capacity = initial_allocation_size;\n  }\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nstatic size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n)\n{\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);\n  if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))\n    return 0;\n  return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile);\n}\n\nmz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning)\n{\n  MZ_FILE *pFile;\n  pZip->m_pWrite = mz_zip_file_write_func;\n  pZip->m_pIO_opaque = pZip;\n  if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning))\n    return MZ_FALSE;\n  if (NULL == (pFile = MZ_FOPEN(pFilename, \"wb\")))\n  {\n    mz_zip_writer_end(pZip);\n    return MZ_FALSE;\n  }\n  pZip->m_pState->m_pFile = pFile;\n  if (size_to_reserve_at_beginning)\n  {\n    mz_uint64 cur_ofs = 0; char buf[4096]; MZ_CLEAR_OBJ(buf);\n    do\n    {\n      size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning);\n      if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n)\n      {\n        mz_zip_writer_end(pZip);\n        return MZ_FALSE;\n      }\n      cur_ofs += n; size_to_reserve_at_beginning -= n;\n    } while (size_to_reserve_at_beginning);\n  }\n  return MZ_TRUE;\n}\n#endif // #ifndef MINIZ_NO_STDIO\n\nmz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename)\n{\n  mz_zip_internal_state *pState;\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return MZ_FALSE;\n  // No sense in trying to write to an archive that's already at the support max size\n  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n\n  if (pState->m_pFile)\n  {\n#ifdef MINIZ_NO_STDIO\n    pFilename; return MZ_FALSE;\n#else\n    // Archive is being read from stdio - try to reopen as writable.\n    if (pZip->m_pIO_opaque != pZip)\n      return MZ_FALSE;\n    if (!pFilename)\n      return MZ_FALSE;\n    pZip->m_pWrite = mz_zip_file_write_func;\n    if (NULL == (pState->m_pFile = MZ_FREOPEN(pFilename, \"r+b\", pState->m_pFile)))\n    {\n      // The mz_zip_archive is now in a bogus state because pState->m_pFile is NULL, so just close it.\n      mz_zip_reader_end(pZip);\n      return MZ_FALSE;\n    }\n#endif // #ifdef MINIZ_NO_STDIO\n  }\n  else if (pState->m_pMem)\n  {\n    // Archive lives in a memory block. Assume it's from the heap that we can resize using the realloc callback.\n    if (pZip->m_pIO_opaque != pZip)\n      return MZ_FALSE;\n    pState->m_mem_capacity = pState->m_mem_size;\n    pZip->m_pWrite = mz_zip_heap_write_func;\n  }\n  // Archive is being read via a user provided read function - make sure the user has specified a write function too.\n  else if (!pZip->m_pWrite)\n    return MZ_FALSE;\n\n  // Start writing new files at the archive's current central directory location.\n  pZip->m_archive_size = pZip->m_central_directory_file_ofs;\n  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;\n  pZip->m_central_directory_file_ofs = 0;\n\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags)\n{\n  return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0);\n}\n\ntypedef struct\n{\n  mz_zip_archive *m_pZip;\n  mz_uint64 m_cur_archive_file_ofs;\n  mz_uint64 m_comp_size;\n} mz_zip_writer_add_state;\n\nstatic mz_bool mz_zip_writer_add_put_buf_callback(const void* pBuf, int len, void *pUser)\n{\n  mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser;\n  if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque, pState->m_cur_archive_file_ofs, pBuf, len) != len)\n    return MZ_FALSE;\n  pState->m_cur_archive_file_ofs += len;\n  pState->m_comp_size += len;\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_create_local_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date)\n{\n  (void)pZip;\n  memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size);\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_create_central_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes)\n{\n  (void)pZip;\n  memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs);\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_add_to_central_dir(mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size, const void *pExtra, mz_uint16 extra_size, const void *pComment, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes)\n{\n  mz_zip_internal_state *pState = pZip->m_pState;\n  mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size;\n  size_t orig_central_dir_size = pState->m_central_dir.m_size;\n  mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];\n\n  // No zip64 support yet\n  if ((local_header_ofs > 0xFFFFFFFF) || (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + comment_size) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes))\n    return MZ_FALSE;\n\n  if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename, filename_size)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra, extra_size)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment, comment_size)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &central_dir_ofs, 1)))\n  {\n    // Try to push the central directory array back into its original state.\n    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE);\n    return MZ_FALSE;\n  }\n\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name)\n{\n  // Basic ZIP archive filename validity checks: Valid filenames cannot start with a forward slash, cannot contain a drive letter, and cannot use DOS-style backward slashes.\n  if (*pArchive_name == '/')\n    return MZ_FALSE;\n  while (*pArchive_name)\n  {\n    if ((*pArchive_name == '\\\\') || (*pArchive_name == ':'))\n      return MZ_FALSE;\n    pArchive_name++;\n  }\n  return MZ_TRUE;\n}\n\nstatic mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip)\n{\n  mz_uint32 n;\n  if (!pZip->m_file_offset_alignment)\n    return 0;\n  n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1));\n  return (pZip->m_file_offset_alignment - n) & (pZip->m_file_offset_alignment - 1);\n}\n\nstatic mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, mz_uint64 cur_file_ofs, mz_uint32 n)\n{\n  char buf[4096];\n  memset(buf, 0, MZ_MIN(sizeof(buf), n));\n  while (n)\n  {\n    mz_uint32 s = MZ_MIN(sizeof(buf), n);\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s)\n      return MZ_FALSE;\n    cur_file_ofs += s; n -= s;\n  }\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32)\n{\n  mz_uint16 method = 0, dos_time = 0, dos_date = 0;\n  mz_uint level, ext_attributes = 0, num_alignment_padding_bytes;\n  mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0;\n  size_t archive_name_size;\n  mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];\n  tdefl_compressor *pComp = NULL;\n  mz_bool store_data_uncompressed;\n  mz_zip_internal_state *pState;\n\n  if ((int)level_and_flags < 0)\n    level_and_flags = MZ_DEFAULT_LEVEL;\n  level = level_and_flags & 0xF;\n  store_data_uncompressed = ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA));\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) || (!pArchive_name) || ((comment_size) && (!pComment)) || (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n\n  if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size))\n    return MZ_FALSE;\n  // No zip64 support yet\n  if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF))\n    return MZ_FALSE;\n  if (!mz_zip_writer_validate_archive_name(pArchive_name))\n    return MZ_FALSE;\n\n#ifndef MINIZ_NO_TIME\n  {\n    time_t cur_time; time(&cur_time);\n    mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date);\n  }\n#endif // #ifndef MINIZ_NO_TIME\n\n  archive_name_size = strlen(pArchive_name);\n  if (archive_name_size > 0xFFFF)\n    return MZ_FALSE;\n\n  num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);\n\n  // no zip64 support yet\n  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/'))\n  {\n    // Set DOS Subdirectory attribute bit.\n    ext_attributes |= 0x10;\n    // Subdirectories cannot contain data.\n    if ((buf_size) || (uncomp_size))\n      return MZ_FALSE;\n  }\n\n  // Try to do any allocations before writing to the archive, so if an allocation fails the file remains unmodified. (A good idea if we're doing an in-place modification.)\n  if ((!mz_zip_array_ensure_room(pZip, &pState->m_central_dir, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size)) || (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1)))\n    return MZ_FALSE;\n\n  if ((!store_data_uncompressed) && (buf_size))\n  {\n    if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor))))\n      return MZ_FALSE;\n  }\n\n  if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header)))\n  {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n    return MZ_FALSE;\n  }\n  local_dir_header_ofs += num_alignment_padding_bytes;\n  if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); }\n  cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header);\n\n  MZ_CLEAR_OBJ(local_dir_header);\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size)\n  {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n    return MZ_FALSE;\n  }\n  cur_archive_file_ofs += archive_name_size;\n\n  if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA))\n  {\n    uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8*)pBuf, buf_size);\n    uncomp_size = buf_size;\n    if (uncomp_size <= 3)\n    {\n      level = 0;\n      store_data_uncompressed = MZ_TRUE;\n    }\n  }\n\n  if (store_data_uncompressed)\n  {\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf, buf_size) != buf_size)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n      return MZ_FALSE;\n    }\n\n    cur_archive_file_ofs += buf_size;\n    comp_size = buf_size;\n\n    if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)\n      method = MZ_DEFLATED;\n  }\n  else if (buf_size)\n  {\n    mz_zip_writer_add_state state;\n\n    state.m_pZip = pZip;\n    state.m_cur_archive_file_ofs = cur_archive_file_ofs;\n    state.m_comp_size = 0;\n\n    if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) ||\n        (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) != TDEFL_STATUS_DONE))\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n      return MZ_FALSE;\n    }\n\n    comp_size = state.m_comp_size;\n    cur_archive_file_ofs = state.m_cur_archive_file_ofs;\n\n    method = MZ_DEFLATED;\n  }\n\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n  pComp = NULL;\n\n  // no zip64 support yet\n  if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date))\n    return MZ_FALSE;\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes))\n    return MZ_FALSE;\n\n  pZip->m_total_files++;\n  pZip->m_archive_size = cur_archive_file_ofs;\n\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags)\n{\n  mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes;\n  mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0;\n  mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0;\n  size_t archive_name_size;\n  mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];\n  MZ_FILE *pSrc_file = NULL;\n\n  if ((int)level_and_flags < 0)\n    level_and_flags = MZ_DEFAULT_LEVEL;\n  level = level_and_flags & 0xF;\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION))\n    return MZ_FALSE;\n  if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)\n    return MZ_FALSE;\n  if (!mz_zip_writer_validate_archive_name(pArchive_name))\n    return MZ_FALSE;\n\n  archive_name_size = strlen(pArchive_name);\n  if (archive_name_size > 0xFFFF)\n    return MZ_FALSE;\n\n  num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);\n\n  // no zip64 support yet\n  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date))\n    return MZ_FALSE;\n    \n  pSrc_file = MZ_FOPEN(pSrc_filename, \"rb\");\n  if (!pSrc_file)\n    return MZ_FALSE;\n  MZ_FSEEK64(pSrc_file, 0, SEEK_END);\n  uncomp_size = MZ_FTELL64(pSrc_file);\n  MZ_FSEEK64(pSrc_file, 0, SEEK_SET);\n\n  if (uncomp_size > 0xFFFFFFFF)\n  {\n    // No zip64 support yet\n    MZ_FCLOSE(pSrc_file);\n    return MZ_FALSE;\n  }\n  if (uncomp_size <= 3)\n    level = 0;\n\n  if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header)))\n  {\n    MZ_FCLOSE(pSrc_file);\n    return MZ_FALSE;\n  }\n  local_dir_header_ofs += num_alignment_padding_bytes;\n  if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); }\n  cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header);\n\n  MZ_CLEAR_OBJ(local_dir_header);\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size)\n  {\n    MZ_FCLOSE(pSrc_file);\n    return MZ_FALSE;\n  }\n  cur_archive_file_ofs += archive_name_size;\n\n  if (uncomp_size)\n  {\n    mz_uint64 uncomp_remaining = uncomp_size;\n    void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE);\n    if (!pRead_buf)\n    {\n      MZ_FCLOSE(pSrc_file);\n      return MZ_FALSE;\n    }\n\n    if (!level)\n    {\n      while (uncomp_remaining)\n      {\n        mz_uint n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining);\n        if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n))\n        {\n          pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n          MZ_FCLOSE(pSrc_file);\n          return MZ_FALSE;\n        }\n        uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n);\n        uncomp_remaining -= n;\n        cur_archive_file_ofs += n;\n      }\n      comp_size = uncomp_size;\n    }\n    else\n    {\n      mz_bool result = MZ_FALSE;\n      mz_zip_writer_add_state state;\n      tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor));\n      if (!pComp)\n      {\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n        MZ_FCLOSE(pSrc_file);\n        return MZ_FALSE;\n      }\n\n      state.m_pZip = pZip;\n      state.m_cur_archive_file_ofs = cur_archive_file_ofs;\n      state.m_comp_size = 0;\n\n      if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY)\n      {\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n        MZ_FCLOSE(pSrc_file);\n        return MZ_FALSE;\n      }\n\n      for ( ; ; )\n      {\n        size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, MZ_ZIP_MAX_IO_BUF_SIZE);\n        tdefl_status status;\n\n        if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size)\n          break;\n\n        uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size);\n        uncomp_remaining -= in_buf_size;\n\n        status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH);\n        if (status == TDEFL_STATUS_DONE)\n        {\n          result = MZ_TRUE;\n          break;\n        }\n        else if (status != TDEFL_STATUS_OKAY)\n          break;\n      }\n\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n\n      if (!result)\n      {\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n        MZ_FCLOSE(pSrc_file);\n        return MZ_FALSE;\n      }\n\n      comp_size = state.m_comp_size;\n      cur_archive_file_ofs = state.m_cur_archive_file_ofs;\n\n      method = MZ_DEFLATED;\n    }\n\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n  }\n\n  MZ_FCLOSE(pSrc_file); pSrc_file = NULL;\n\n  // no zip64 support yet\n  if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date))\n    return MZ_FALSE;\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes))\n    return MZ_FALSE;\n\n  pZip->m_total_files++;\n  pZip->m_archive_size = cur_archive_file_ofs;\n\n  return MZ_TRUE;\n}\n#endif // #ifndef MINIZ_NO_STDIO\n\nmz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index)\n{\n  mz_uint n, bit_flags, num_alignment_padding_bytes;\n  mz_uint64 comp_bytes_remaining, local_dir_header_ofs;\n  mz_uint64 cur_src_file_ofs, cur_dst_file_ofs;\n  mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;\n  mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];\n  size_t orig_central_dir_size;\n  mz_zip_internal_state *pState;\n  void *pBuf; const mz_uint8 *pSrc_central_header;\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))\n    return MZ_FALSE;\n  if (NULL == (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index)))\n    return MZ_FALSE;\n  pState = pZip->m_pState;\n\n  num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);\n\n  // no zip64 support yet\n  if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  cur_src_file_ofs = MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS);\n  cur_dst_file_ofs = pZip->m_archive_size;\n\n  if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)\n    return MZ_FALSE;\n  cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;\n\n  if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, num_alignment_padding_bytes))\n    return MZ_FALSE;\n  cur_dst_file_ofs += num_alignment_padding_bytes;\n  local_dir_header_ofs = cur_dst_file_ofs;\n  if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); }\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;\n\n  n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);\n  comp_bytes_remaining = n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n\n  if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)MZ_MAX(sizeof(mz_uint32) * 4, MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining)))))\n    return MZ_FALSE;\n\n  while (comp_bytes_remaining)\n  {\n    n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining);\n    if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, n) != n)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n    cur_src_file_ofs += n;\n\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n    cur_dst_file_ofs += n;\n\n    comp_bytes_remaining -= n;\n  }\n\n  bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS);\n  if (bit_flags & 8)\n  {\n    // Copy data descriptor\n    if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n\n    n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3);\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n)\n    {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n\n    cur_src_file_ofs += n;\n    cur_dst_file_ofs += n;\n  }\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n\n  // no zip64 support yet\n  if (cur_dst_file_ofs > 0xFFFFFFFF)\n    return MZ_FALSE;\n\n  orig_central_dir_size = pState->m_central_dir.m_size;\n\n  memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);\n  MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_dir_header_ofs);\n  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE))\n    return MZ_FALSE;\n\n  n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS);\n  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n))\n  {\n    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE);\n    return MZ_FALSE;\n  }\n\n  if (pState->m_central_dir.m_size > 0xFFFFFFFF)\n    return MZ_FALSE;\n  n = (mz_uint32)orig_central_dir_size;\n  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1))\n  {\n    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE);\n    return MZ_FALSE;\n  }\n\n  pZip->m_total_files++;\n  pZip->m_archive_size = cur_dst_file_ofs;\n\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip)\n{\n  mz_zip_internal_state *pState;\n  mz_uint64 central_dir_ofs, central_dir_size;\n  mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE];\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n\n  // no zip64 support yet\n  if ((pZip->m_total_files > 0xFFFF) || ((pZip->m_archive_size + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  central_dir_ofs = 0;\n  central_dir_size = 0;\n  if (pZip->m_total_files)\n  {\n    // Write central directory\n    central_dir_ofs = pZip->m_archive_size;\n    central_dir_size = pState->m_central_dir.m_size;\n    pZip->m_central_directory_file_ofs = central_dir_ofs;\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs, pState->m_central_dir.m_p, (size_t)central_dir_size) != central_dir_size)\n      return MZ_FALSE;\n    pZip->m_archive_size += central_dir_size;\n  }\n\n  // Write end of central directory record\n  MZ_CLEAR_OBJ(hdr);\n  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG);\n  MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, pZip->m_total_files);\n  MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files);\n  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size);\n  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs);\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, sizeof(hdr)) != sizeof(hdr))\n    return MZ_FALSE;\n#ifndef MINIZ_NO_STDIO\n  if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF))\n    return MZ_FALSE;\n#endif // #ifndef MINIZ_NO_STDIO\n\n  pZip->m_archive_size += sizeof(hdr);\n\n  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED;\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize)\n{\n  if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize))\n    return MZ_FALSE;\n  if (pZip->m_pWrite != mz_zip_heap_write_func)\n    return MZ_FALSE;\n  if (!mz_zip_writer_finalize_archive(pZip))\n    return MZ_FALSE;\n\n  *pBuf = pZip->m_pState->m_pMem;\n  *pSize = pZip->m_pState->m_mem_size;\n  pZip->m_pState->m_pMem = NULL;\n  pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0;\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_end(mz_zip_archive *pZip)\n{\n  mz_zip_internal_state *pState;\n  mz_bool status = MZ_TRUE;\n  if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) && (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED)))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n  pZip->m_pState = NULL;\n  mz_zip_array_clear(pZip, &pState->m_central_dir);\n  mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);\n  mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);\n\n#ifndef MINIZ_NO_STDIO\n  if (pState->m_pFile)\n  {\n    MZ_FCLOSE(pState->m_pFile);\n    pState->m_pFile = NULL;\n  }\n#endif // #ifndef MINIZ_NO_STDIO\n\n  if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem))\n  {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem);\n    pState->m_pMem = NULL;\n  }\n\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pState);\n  pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;\n  return status;\n}\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags)\n{\n  mz_bool status, created_new_archive = MZ_FALSE;\n  mz_zip_archive zip_archive;\n  struct MZ_FILE_STAT_STRUCT file_stat;\n  MZ_CLEAR_OBJ(zip_archive);\n  if ((int)level_and_flags < 0)\n     level_and_flags = MZ_DEFAULT_LEVEL;\n  if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || ((comment_size) && (!pComment)) || ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION))\n    return MZ_FALSE;\n  if (!mz_zip_writer_validate_archive_name(pArchive_name))\n    return MZ_FALSE;\n  if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0)\n  {\n    // Create a new archive.\n    if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0))\n      return MZ_FALSE;\n    created_new_archive = MZ_TRUE;\n  }\n  else\n  {\n    // Append to an existing archive.\n    if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))\n      return MZ_FALSE;\n    if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename))\n    {\n      mz_zip_reader_end(&zip_archive);\n      return MZ_FALSE;\n    }\n  }\n  status = mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, 0, 0);\n  // Always finalize, even if adding failed for some reason, so we have a valid central directory. (This may not always succeed, but we can try.)\n  if (!mz_zip_writer_finalize_archive(&zip_archive))\n    status = MZ_FALSE;\n  if (!mz_zip_writer_end(&zip_archive))\n    status = MZ_FALSE;\n  if ((!status) && (created_new_archive))\n  {\n    // It's a new archive and something went wrong, so just delete it.\n    int ignoredStatus = MZ_DELETE_FILE(pZip_filename);\n    (void)ignoredStatus;\n  }\n  return status;\n}\n\nvoid *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint flags)\n{\n  int file_index;\n  mz_zip_archive zip_archive;\n  void *p = NULL;\n\n  if (pSize)\n    *pSize = 0;\n\n  if ((!pZip_filename) || (!pArchive_name))\n    return NULL;\n\n  MZ_CLEAR_OBJ(zip_archive);\n  if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))\n    return NULL;\n\n  if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL, flags)) >= 0)\n    p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags);\n\n  mz_zip_reader_end(&zip_archive);\n  return p;\n}\n\n#endif // #ifndef MINIZ_NO_STDIO\n\n#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\n#endif // #ifndef MINIZ_NO_ARCHIVE_APIS\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // MINIZ_HEADER_FILE_ONLY\n\n/*\n  This is free and unencumbered software released into the public domain.\n\n  Anyone is free to copy, modify, publish, use, compile, sell, or\n  distribute this software, either in source code form or as a compiled\n  binary, for any purpose, commercial or non-commercial, and by any\n  means.\n\n  In jurisdictions that recognize copyright laws, the author or authors\n  of this software dedicate any and all copyright interest in the\n  software to the public domain. We make this dedication for the benefit\n  of the public at large and to the detriment of our heirs and\n  successors. We intend this dedication to be an overt act of\n  relinquishment in perpetuity of all present and future rights to this\n  software under copyright law.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n  OTHER DEALINGS IN THE SOFTWARE.\n\n  For more information, please refer to <http://unlicense.org/>\n*/\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* A simple library to load images of various formats as SDL surfaces */\n\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n#include \"SDL_image.h\"\n\n#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))\n\n/* Table of image detection and loading functions */\nstatic struct {\n    char *type;\n    int (SDLCALL *is)(SDL_RWops *src);\n    SDL_Surface *(SDLCALL *load)(SDL_RWops *src);\n} supported[] = {\n    /* keep magicless formats first */\n    { \"TGA\", NULL,      IMG_LoadTGA_RW },\n    { \"CUR\", IMG_isCUR, IMG_LoadCUR_RW },\n    { \"ICO\", IMG_isICO, IMG_LoadICO_RW },\n    { \"BMP\", IMG_isBMP, IMG_LoadBMP_RW },\n    { \"GIF\", IMG_isGIF, IMG_LoadGIF_RW },\n    { \"JPG\", IMG_isJPG, IMG_LoadJPG_RW },\n    { \"LBM\", IMG_isLBM, IMG_LoadLBM_RW },\n    { \"PCX\", IMG_isPCX, IMG_LoadPCX_RW },\n    { \"PNG\", IMG_isPNG, IMG_LoadPNG_RW },\n    { \"PNM\", IMG_isPNM, IMG_LoadPNM_RW }, /* P[BGP]M share code */\n    { \"TIF\", IMG_isTIF, IMG_LoadTIF_RW },\n    { \"XCF\", IMG_isXCF, IMG_LoadXCF_RW },\n    { \"XPM\", IMG_isXPM, IMG_LoadXPM_RW },\n    { \"XV\",  IMG_isXV,  IMG_LoadXV_RW  },\n    { \"WEBP\", IMG_isWEBP, IMG_LoadWEBP_RW },\n};\n\nconst SDL_version *IMG_Linked_Version(void)\n{\n    static SDL_version linked_version;\n    SDL_IMAGE_VERSION(&linked_version);\n    return(&linked_version);\n}\n\nextern int IMG_InitJPG();\nextern void IMG_QuitJPG();\nextern int IMG_InitPNG();\nextern void IMG_QuitPNG();\nextern int IMG_InitTIF();\nextern void IMG_QuitTIF();\n\nextern int IMG_InitWEBP();\nextern void IMG_QuitWEBP();\n\nstatic int initialized = 0;\n\nint IMG_Init(int flags)\n{\n    int result = 0;\n\n    /* Passing 0 returns the currently initialized loaders */\n    if (!flags) {\n        return initialized;\n    }\n\n    if (flags & IMG_INIT_JPG) {\n        if ((initialized & IMG_INIT_JPG) || IMG_InitJPG() == 0) {\n            result |= IMG_INIT_JPG;\n        }\n    }\n    if (flags & IMG_INIT_PNG) {\n        if ((initialized & IMG_INIT_PNG) || IMG_InitPNG() == 0) {\n            result |= IMG_INIT_PNG;\n        }\n    }\n    if (flags & IMG_INIT_TIF) {\n        if ((initialized & IMG_INIT_TIF) || IMG_InitTIF() == 0) {\n            result |= IMG_INIT_TIF;\n        }\n    }\n    if (flags & IMG_INIT_WEBP) {\n        if ((initialized & IMG_INIT_WEBP) || IMG_InitWEBP() == 0) {\n            result |= IMG_INIT_WEBP;\n        }\n    }\n    initialized |= result;\n\n    return result;\n}\n\nvoid IMG_Quit()\n{\n    if (initialized & IMG_INIT_JPG) {\n        IMG_QuitJPG();\n    }\n    if (initialized & IMG_INIT_PNG) {\n        IMG_QuitPNG();\n    }\n    if (initialized & IMG_INIT_TIF) {\n        IMG_QuitTIF();\n    }\n    if (initialized & IMG_INIT_WEBP) {\n        IMG_QuitWEBP();\n    }\n    initialized = 0;\n}\n\n#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)\n/* Load an image from a file */\nSDL_Surface *IMG_Load(const char *file)\n{\n    SDL_RWops *src = SDL_RWFromFile(file, \"rb\");\n    const char *ext = SDL_strrchr(file, '.');\n    if(ext) {\n        ext++;\n    }\n    if(!src) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    return IMG_LoadTyped_RW(src, 1, ext);\n}\n#endif\n\n/* Load an image from an SDL datasource (for compatibility) */\nSDL_Surface *IMG_Load_RW(SDL_RWops *src, int freesrc)\n{\n    return IMG_LoadTyped_RW(src, freesrc, NULL);\n}\n\n/* Portable case-insensitive string compare function */\nstatic int IMG_string_equals(const char *str1, const char *str2)\n{\n    while ( *str1 && *str2 ) {\n        if ( SDL_toupper((unsigned char)*str1) !=\n             SDL_toupper((unsigned char)*str2) )\n            break;\n        ++str1;\n        ++str2;\n    }\n    return (!*str1 && !*str2);\n}\n\n/* Load an image from an SDL datasource, optionally specifying the type */\nSDL_Surface *IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, const char *type)\n{\n    int i;\n    SDL_Surface *image;\n\n    /* Make sure there is something to do.. */\n    if ( src == NULL ) {\n        IMG_SetError(\"Passed a NULL data source\");\n        return(NULL);\n    }\n\n    /* See whether or not this data source can handle seeking */\n    if ( SDL_RWseek(src, 0, RW_SEEK_CUR) < 0 ) {\n        IMG_SetError(\"Can't seek in this data source\");\n        if(freesrc)\n            SDL_RWclose(src);\n        return(NULL);\n    }\n\n    /* Detect the type of image being loaded */\n    image = NULL;\n    for ( i=0; i < ARRAYSIZE(supported); ++i ) {\n        if(supported[i].is) {\n            if(!supported[i].is(src))\n                continue;\n        } else {\n            /* magicless format */\n            if(!type\n               || !IMG_string_equals(type, supported[i].type))\n                continue;\n        }\n#ifdef DEBUG_IMGLIB\n        fprintf(stderr, \"IMGLIB: Loading image as %s\\n\",\n            supported[i].type);\n#endif\n        image = supported[i].load(src);\n        if(freesrc)\n            SDL_RWclose(src);\n        return image;\n    }\n\n    if ( freesrc ) {\n        SDL_RWclose(src);\n    }\n    IMG_SetError(\"Unsupported image format\");\n    return NULL;\n}\n\n#if SDL_VERSION_ATLEAST(2,0,0)\nSDL_Texture *IMG_LoadTexture(SDL_Renderer *renderer, const char *file)\n{\n    SDL_Texture *texture = NULL;\n    SDL_Surface *surface = IMG_Load(file);\n    if (surface) {\n        texture = SDL_CreateTextureFromSurface(renderer, surface);\n        SDL_FreeSurface(surface);\n    }\n    return texture;\n}\n\nSDL_Texture *IMG_LoadTexture_RW(SDL_Renderer *renderer, SDL_RWops *src, int freesrc)\n{\n    SDL_Texture *texture = NULL;\n    SDL_Surface *surface = IMG_Load_RW(src, freesrc);\n    if (surface) {\n        texture = SDL_CreateTextureFromSurface(renderer, surface);\n        SDL_FreeSurface(surface);\n    }\n    return texture;\n}\n\nSDL_Texture *IMG_LoadTextureTyped_RW(SDL_Renderer *renderer, SDL_RWops *src, int freesrc, const char *type)\n{\n    SDL_Texture *texture = NULL;\n    SDL_Surface *surface = IMG_LoadTyped_RW(src, freesrc, type);\n    if (surface) {\n        texture = SDL_CreateTextureFromSurface(renderer, surface);\n        SDL_FreeSurface(surface);\n    }\n    return texture;\n}\n#endif /* SDL 2.0 */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_bmp.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if (!defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)) || !defined(BMP_USES_IMAGEIO)\n\n/* This is a BMP image file loading framework\n *\n * ICO/CUR file support is here as well since it uses similar internal\n * representation\n *\n * A good test suite of BMP images is available at:\n * http://entropymine.com/jason/bmpsuite/bmpsuite/html/bmpsuite.html\n */\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_BMP\n\n/* See if an image is contained in a data source */\nint IMG_isBMP(SDL_RWops *src)\n{\n    Sint64 start;\n    int is_BMP;\n    char magic[2];\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_BMP = 0;\n    if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {\n        if ( SDL_strncmp(magic, \"BM\", 2) == 0 ) {\n            is_BMP = 1;\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_BMP);\n}\n\nstatic int IMG_isICOCUR(SDL_RWops *src, int type)\n{\n    Sint64 start;\n    int is_ICOCUR;\n\n    /* The Win32 ICO file header (14 bytes) */\n    Uint16 bfReserved;\n    Uint16 bfType;\n    Uint16 bfCount;\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_ICOCUR = 0;\n    bfReserved = SDL_ReadLE16(src);\n    bfType = SDL_ReadLE16(src);\n    bfCount = SDL_ReadLE16(src);\n    if ((bfReserved == 0) && (bfType == type) && (bfCount != 0))\n        is_ICOCUR = 1;\n    SDL_RWseek(src, start, RW_SEEK_SET);\n\n    return (is_ICOCUR);\n}\n\nint IMG_isICO(SDL_RWops *src)\n{\n    return IMG_isICOCUR(src, 1);\n}\n\nint IMG_isCUR(SDL_RWops *src)\n{\n    return IMG_isICOCUR(src, 2);\n}\n\n#include \"SDL_error.h\"\n#include \"SDL_video.h\"\n#include \"SDL_endian.h\"\n\n/* Compression encodings for BMP files */\n#ifndef BI_RGB\n#define BI_RGB      0\n#define BI_RLE8     1\n#define BI_RLE4     2\n#define BI_BITFIELDS    3\n#endif\n\nstatic int readRlePixels(SDL_Surface * surface, SDL_RWops * src, int isRle8)\n{\n    /*\n    | Sets the surface pixels from src.  A bmp image is upside down.\n    */\n    int pitch = surface->pitch;\n    int height = surface->h;\n    Uint8 *start = (Uint8 *)surface->pixels;\n    Uint8 *end = start + (height*pitch);\n    Uint8 *bits = end-pitch, *spot;\n    int ofs = 0;\n    Uint8 ch;\n    Uint8 needsPad;\n\n#define COPY_PIXEL(x)   spot = &bits[ofs++]; if(spot >= start && spot < end) *spot = (x)\n\n    for (;;) {\n        if ( !SDL_RWread(src, &ch, 1, 1) ) return 1;\n        /*\n        | encoded mode starts with a run length, and then a byte\n        | with two colour indexes to alternate between for the run\n        */\n        if ( ch ) {\n            Uint8 pixel;\n            if ( !SDL_RWread(src, &pixel, 1, 1) ) return 1;\n            if ( isRle8 ) {                 /* 256-color bitmap, compressed */\n                do {\n                    COPY_PIXEL(pixel);\n                } while (--ch);\n            } else {                         /* 16-color bitmap, compressed */\n                Uint8 pixel0 = pixel >> 4;\n                Uint8 pixel1 = pixel & 0x0F;\n                for (;;) {\n                    COPY_PIXEL(pixel0); /* even count, high nibble */\n                    if (!--ch) break;\n                    COPY_PIXEL(pixel1); /* odd count, low nibble */\n                    if (!--ch) break;\n                }\n            }\n        } else {\n            /*\n            | A leading zero is an escape; it may signal the end of the bitmap,\n            | a cursor move, or some absolute data.\n            | zero tag may be absolute mode or an escape\n            */\n            if ( !SDL_RWread(src, &ch, 1, 1) ) return 1;\n            switch (ch) {\n            case 0:                         /* end of line */\n                ofs = 0;\n                bits -= pitch;               /* go to previous */\n                break;\n            case 1:                         /* end of bitmap */\n                return 0;                    /* success! */\n            case 2:                         /* delta */\n                if ( !SDL_RWread(src, &ch, 1, 1) ) return 1;\n                ofs += ch;\n                if ( !SDL_RWread(src, &ch, 1, 1) ) return 1;\n                bits -= (ch * pitch);\n                break;\n            default:                        /* no compression */\n                if (isRle8) {\n                    needsPad = ( ch & 1 );\n                    do {\n                        Uint8 pixel;\n                        if ( !SDL_RWread(src, &pixel, 1, 1) ) return 1;\n                        COPY_PIXEL(pixel);\n                    } while (--ch);\n                } else {\n                    needsPad = ( ((ch+1)>>1) & 1 ); /* (ch+1)>>1: bytes size */\n                    for (;;) {\n                        Uint8 pixel;\n                        if ( !SDL_RWread(src, &pixel, 1, 1) ) return 1;\n                        COPY_PIXEL(pixel >> 4);\n                        if (!--ch) break;\n                        COPY_PIXEL(pixel & 0x0F);\n                        if (!--ch) break;\n                    }\n                }\n                /* pad at even boundary */\n                if ( needsPad && !SDL_RWread(src, &ch, 1, 1) ) return 1;\n                break;\n            }\n        }\n    }\n}\n\nstatic void CorrectAlphaChannel(SDL_Surface *surface)\n{\n    /* Check to see if there is any alpha channel data */\n    SDL_bool hasAlpha = SDL_FALSE;\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n    int alphaChannelOffset = 0;\n#else\n    int alphaChannelOffset = 3;\n#endif\n    Uint8 *alpha = ((Uint8*)surface->pixels) + alphaChannelOffset;\n    Uint8 *end = alpha + surface->h * surface->pitch;\n\n    while (alpha < end) {\n        if (*alpha != 0) {\n            hasAlpha = SDL_TRUE;\n            break;\n        }\n        alpha += 4;\n    }\n\n    if (!hasAlpha) {\n        alpha = ((Uint8*)surface->pixels) + alphaChannelOffset;\n        while (alpha < end) {\n            *alpha = SDL_ALPHA_OPAQUE;\n            alpha += 4;\n        }\n    }\n}\n\nstatic SDL_Surface *LoadBMP_RW (SDL_RWops *src, int freesrc)\n{\n    SDL_bool was_error;\n    Sint64 fp_offset;\n    int bmpPitch;\n    int i, pad;\n    SDL_Surface *surface;\n    Uint32 Rmask = 0;\n    Uint32 Gmask = 0;\n    Uint32 Bmask = 0;\n    Uint32 Amask = 0;\n    SDL_Palette *palette;\n    Uint8 *bits;\n    Uint8 *top, *end;\n    SDL_bool topDown;\n    int ExpandBMP;\n    SDL_bool haveRGBMasks = SDL_FALSE;\n    SDL_bool haveAlphaMask = SDL_FALSE;\n    SDL_bool correctAlpha = SDL_FALSE;\n\n    /* The Win32 BMP file header (14 bytes) */\n    char   magic[2];\n    Uint32 bfSize;\n    Uint16 bfReserved1;\n    Uint16 bfReserved2;\n    Uint32 bfOffBits;\n\n    /* The Win32 BITMAPINFOHEADER struct (40 bytes) */\n    Uint32 biSize;\n    Sint32 biWidth;\n    Sint32 biHeight;\n    Uint16 biPlanes;\n    Uint16 biBitCount;\n    Uint32 biCompression;\n    Uint32 biSizeImage;\n    Sint32 biXPelsPerMeter;\n    Sint32 biYPelsPerMeter;\n    Uint32 biClrUsed;\n    Uint32 biClrImportant;\n\n    /* Make sure we are passed a valid data source */\n    surface = NULL;\n    was_error = SDL_FALSE;\n    if ( src == NULL ) {\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Read in the BMP file header */\n    fp_offset = SDL_RWtell(src);\n    SDL_ClearError();\n    if ( SDL_RWread(src, magic, 1, 2) != 2 ) {\n        SDL_Error(SDL_EFREAD);\n        was_error = SDL_TRUE;\n        goto done;\n    }\n    if ( SDL_strncmp(magic, \"BM\", 2) != 0 ) {\n        IMG_SetError(\"File is not a Windows BMP file\");\n        was_error = SDL_TRUE;\n        goto done;\n    }\n    bfSize      = SDL_ReadLE32(src);\n    bfReserved1 = SDL_ReadLE16(src);\n    bfReserved2 = SDL_ReadLE16(src);\n    bfOffBits   = SDL_ReadLE32(src);\n\n    /* Read the Win32 BITMAPINFOHEADER */\n    biSize      = SDL_ReadLE32(src);\n    if ( biSize == 12 ) {   /* really old BITMAPCOREHEADER */\n        biWidth     = (Uint32)SDL_ReadLE16(src);\n        biHeight    = (Uint32)SDL_ReadLE16(src);\n        biPlanes    = SDL_ReadLE16(src);\n        biBitCount  = SDL_ReadLE16(src);\n        biCompression   = BI_RGB;\n        biSizeImage = 0;\n        biXPelsPerMeter = 0;\n        biYPelsPerMeter = 0;\n        biClrUsed   = 0;\n        biClrImportant  = 0;\n    } else if (biSize >= 40) {  /* some version of BITMAPINFOHEADER */\n        Uint32 headerSize;\n        biWidth     = SDL_ReadLE32(src);\n        biHeight    = SDL_ReadLE32(src);\n        biPlanes    = SDL_ReadLE16(src);\n        biBitCount  = SDL_ReadLE16(src);\n        biCompression   = SDL_ReadLE32(src);\n        biSizeImage = SDL_ReadLE32(src);\n        biXPelsPerMeter = SDL_ReadLE32(src);\n        biYPelsPerMeter = SDL_ReadLE32(src);\n        biClrUsed   = SDL_ReadLE32(src);\n        biClrImportant  = SDL_ReadLE32(src);\n\n        /* 64 == BITMAPCOREHEADER2, an incompatible OS/2 2.x extension. Skip this stuff for now. */\n        if (biSize != 64) {\n            /* This is complicated. If compression is BI_BITFIELDS, then\n               we have 3 DWORDS that specify the RGB masks. This is either\n               stored here in an BITMAPV2INFOHEADER (which only differs in\n               that it adds these RGB masks) and biSize >= 52, or we've got\n               these masks stored in the exact same place, but strictly\n               speaking, this is the bmiColors field in BITMAPINFO immediately\n               following the legacy v1 info header, just past biSize. */\n            if (biCompression == BI_BITFIELDS) {\n                haveRGBMasks = SDL_TRUE;\n                Rmask = SDL_ReadLE32(src);\n                Gmask = SDL_ReadLE32(src);\n                Bmask = SDL_ReadLE32(src);\n\n                /* ...v3 adds an alpha mask. */\n                if (biSize >= 56) {  /* BITMAPV3INFOHEADER; adds alpha mask */\n                    haveAlphaMask = SDL_TRUE;\n                    Amask = SDL_ReadLE32(src);\n                }\n            } else {\n                /* the mask fields are ignored for v2+ headers if not BI_BITFIELD. */\n                if (biSize >= 52) {  /* BITMAPV2INFOHEADER; adds RGB masks */\n                    /*Rmask = */ SDL_ReadLE32(src);\n                    /*Gmask = */ SDL_ReadLE32(src);\n                    /*Bmask = */ SDL_ReadLE32(src);\n                }\n                if (biSize >= 56) {  /* BITMAPV3INFOHEADER; adds alpha mask */\n                    /*Amask = */ SDL_ReadLE32(src);\n                }\n            }\n\n            /* Insert other fields here; Wikipedia and MSDN say we're up to\n               v5 of this header, but we ignore those for now (they add gamma,\n               color spaces, etc). Ignoring the weird OS/2 2.x format, we\n               currently parse up to v3 correctly (hopefully!). */\n        }\n\n        /* skip any header bytes we didn't handle... */\n        headerSize = (Uint32) (SDL_RWtell(src) - (fp_offset + 14));\n        if (biSize > headerSize) {\n            SDL_RWseek(src, (biSize - headerSize), RW_SEEK_CUR);\n        }\n    }\n    if (biHeight < 0) {\n        topDown = SDL_TRUE;\n        biHeight = -biHeight;\n    } else {\n        topDown = SDL_FALSE;\n    }\n\n    /* Check for read error */\n    if (SDL_strcmp(SDL_GetError(), \"\") != 0) {\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Expand 1 and 4 bit bitmaps to 8 bits per pixel */\n    switch (biBitCount) {\n        case 1:\n        case 4:\n            ExpandBMP = biBitCount;\n            biBitCount = 8;\n            break;\n        default:\n            ExpandBMP = 0;\n            break;\n    }\n\n    /* RLE4 and RLE8 BMP compression is supported */\n    switch (biCompression) {\n        case BI_RGB:\n            /* If there are no masks, use the defaults */\n            SDL_assert(!haveRGBMasks);\n            SDL_assert(!haveAlphaMask);\n            /* Default values for the BMP format */\n            switch (biBitCount) {\n            case 15:\n            case 16:\n                Rmask = 0x7C00;\n                Gmask = 0x03E0;\n                Bmask = 0x001F;\n                break;\n            case 24:\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n                Rmask = 0x000000FF;\n                Gmask = 0x0000FF00;\n                Bmask = 0x00FF0000;\n#else\n                Rmask = 0x00FF0000;\n                Gmask = 0x0000FF00;\n                Bmask = 0x000000FF;\n#endif\n                break;\n            case 32:\n                /* We don't know if this has alpha channel or not */\n                correctAlpha = SDL_TRUE;\n                Amask = 0xFF000000;\n                Rmask = 0x00FF0000;\n                Gmask = 0x0000FF00;\n                Bmask = 0x000000FF;\n                break;\n            default:\n                break;\n            }\n            break;\n\n        case BI_BITFIELDS:\n            break;  /* we handled this in the info header. */\n\n        default:\n            break;\n    }\n\n    /* Create a compatible surface, note that the colors are RGB ordered */\n    surface = SDL_CreateRGBSurface(SDL_SWSURFACE,\n            biWidth, biHeight, biBitCount, Rmask, Gmask, Bmask, Amask);\n    if ( surface == NULL ) {\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Load the palette, if any */\n    palette = (surface->format)->palette;\n    if ( palette ) {\n        if ( SDL_RWseek(src, fp_offset+14+biSize, RW_SEEK_SET) < 0 ) {\n            SDL_Error(SDL_EFSEEK);\n            was_error = SDL_TRUE;\n            goto done;\n        }\n\n        /*\n        | guich: always use 1<<bpp b/c some bitmaps can bring wrong information\n        | for colorsUsed\n        */\n        /* if ( biClrUsed == 0 ) {  */\n        biClrUsed = 1 << biBitCount;\n        /* } */\n        if ( biSize == 12 ) {\n            for ( i = 0; i < (int)biClrUsed; ++i ) {\n                SDL_RWread(src, &palette->colors[i].b, 1, 1);\n                SDL_RWread(src, &palette->colors[i].g, 1, 1);\n                SDL_RWread(src, &palette->colors[i].r, 1, 1);\n                palette->colors[i].a = SDL_ALPHA_OPAQUE;\n            }\n        } else {\n            for ( i = 0; i < (int)biClrUsed; ++i ) {\n                SDL_RWread(src, &palette->colors[i].b, 1, 1);\n                SDL_RWread(src, &palette->colors[i].g, 1, 1);\n                SDL_RWread(src, &palette->colors[i].r, 1, 1);\n                SDL_RWread(src, &palette->colors[i].a, 1, 1);\n\n                /* According to Microsoft documentation, the fourth element\n                   is reserved and must be zero, so we shouldn't treat it as\n                   alpha.\n                */\n                palette->colors[i].a = SDL_ALPHA_OPAQUE;\n            }\n        }\n        palette->ncolors = biClrUsed;\n    }\n\n    /* Read the surface pixels.  Note that the bmp image is upside down */\n    if ( SDL_RWseek(src, fp_offset+bfOffBits, RW_SEEK_SET) < 0 ) {\n        SDL_Error(SDL_EFSEEK);\n        was_error = SDL_TRUE;\n        goto done;\n    }\n    if ((biCompression == BI_RLE4) || (biCompression == BI_RLE8)) {\n        was_error = (SDL_bool)readRlePixels(surface, src, biCompression == BI_RLE8);\n        if (was_error) IMG_SetError(\"Error reading from BMP\");\n        goto done;\n    }\n    top = (Uint8 *)surface->pixels;\n    end = (Uint8 *)surface->pixels+(surface->h*surface->pitch);\n    switch (ExpandBMP) {\n        case 1:\n            bmpPitch = (biWidth + 7) >> 3;\n            pad  = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0);\n            break;\n        case 4:\n            bmpPitch = (biWidth + 1) >> 1;\n            pad  = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0);\n            break;\n        default:\n            pad  = ((surface->pitch%4) ?\n                    (4-(surface->pitch%4)) : 0);\n            break;\n    }\n    if ( topDown ) {\n        bits = top;\n    } else {\n        bits = end - surface->pitch;\n    }\n    while ( bits >= top && bits < end ) {\n        switch (ExpandBMP) {\n            case 1:\n            case 4: {\n            Uint8 pixel = 0;\n            int   shift = (8-ExpandBMP);\n            for ( i=0; i<surface->w; ++i ) {\n                if ( i%(8/ExpandBMP) == 0 ) {\n                    if ( !SDL_RWread(src, &pixel, 1, 1) ) {\n                        IMG_SetError(\"Error reading from BMP\");\n                        was_error = SDL_TRUE;\n                        goto done;\n                    }\n                }\n                *(bits+i) = (pixel>>shift);\n                pixel <<= ExpandBMP;\n            } }\n            break;\n\n            default:\n            if ( SDL_RWread(src, bits, 1, surface->pitch) != surface->pitch ) {\n                SDL_Error(SDL_EFREAD);\n                was_error = SDL_TRUE;\n                goto done;\n            }\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n            /* Byte-swap the pixels if needed. Note that the 24bpp\n               case has already been taken care of above. */\n            switch(biBitCount) {\n                case 15:\n                case 16: {\n                    Uint16 *pix = (Uint16 *)bits;\n                    for(i = 0; i < surface->w; i++)\n                        pix[i] = SDL_Swap16(pix[i]);\n                    break;\n                }\n\n                case 32: {\n                    Uint32 *pix = (Uint32 *)bits;\n                    for(i = 0; i < surface->w; i++)\n                        pix[i] = SDL_Swap32(pix[i]);\n                    break;\n                }\n            }\n#endif\n            break;\n        }\n        /* Skip padding bytes, ugh */\n        if ( pad ) {\n            Uint8 padbyte;\n            for ( i=0; i<pad; ++i ) {\n                SDL_RWread(src, &padbyte, 1, 1);\n            }\n        }\n        if ( topDown ) {\n            bits += surface->pitch;\n        } else {\n            bits -= surface->pitch;\n        }\n    }\n    if (correctAlpha) {\n        CorrectAlphaChannel(surface);\n    }\ndone:\n    if ( was_error ) {\n        if ( src ) {\n            SDL_RWseek(src, fp_offset, RW_SEEK_SET);\n        }\n        if ( surface ) {\n            SDL_FreeSurface(surface);\n        }\n        surface = NULL;\n    }\n    if ( freesrc && src ) {\n        SDL_RWclose(src);\n    }\n    return(surface);\n}\n\nstatic Uint8\nSDL_Read8(SDL_RWops * src)\n{\n    Uint8 value;\n\n    SDL_RWread(src, &value, 1, 1);\n    return (value);\n}\n\nstatic SDL_Surface *\nLoadICOCUR_RW(SDL_RWops * src, int type, int freesrc)\n{\n    SDL_bool was_error;\n    Sint64 fp_offset;\n    int bmpPitch;\n    int i, pad;\n    SDL_Surface *surface;\n    Uint32 Rmask;\n    Uint32 Gmask;\n    Uint32 Bmask;\n    Uint8 *bits;\n    int ExpandBMP;\n    int maxCol = 0;\n    int icoOfs = 0;\n    Uint32 palette[256];\n\n    /* The Win32 ICO file header (14 bytes) */\n    Uint16 bfReserved;\n    Uint16 bfType;\n    Uint16 bfCount;\n\n    /* The Win32 BITMAPINFOHEADER struct (40 bytes) */\n    Uint32 biSize;\n    Sint32 biWidth;\n    Sint32 biHeight;\n    Uint16 biPlanes;\n    Uint16 biBitCount;\n    Uint32 biCompression;\n    Uint32 biSizeImage;\n    Sint32 biXPelsPerMeter;\n    Sint32 biYPelsPerMeter;\n    Uint32 biClrUsed;\n    Uint32 biClrImportant;\n\n    /* Make sure we are passed a valid data source */\n    surface = NULL;\n    was_error = SDL_FALSE;\n    if (src == NULL) {\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Read in the ICO file header */\n    fp_offset = SDL_RWtell(src);\n    SDL_ClearError();\n\n    bfReserved = SDL_ReadLE16(src);\n    bfType = SDL_ReadLE16(src);\n    bfCount = SDL_ReadLE16(src);\n    if ((bfReserved != 0) || (bfType != type) || (bfCount == 0)) {\n        IMG_SetError(\"File is not a Windows %s file\", type == 1 ? \"ICO\" : \"CUR\");\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Read the Win32 Icon Directory */\n    for (i = 0; i < bfCount; i++) {\n        /* Icon Directory Entries */\n        int bWidth = SDL_Read8(src);    /* Uint8, but 0 = 256 ! */\n        int bHeight = SDL_Read8(src);   /* Uint8, but 0 = 256 ! */\n        int bColorCount = SDL_Read8(src);       /* Uint8, but 0 = 256 ! */\n        Uint8 bReserved = SDL_Read8(src);\n        Uint16 wPlanes = SDL_ReadLE16(src);\n        Uint16 wBitCount = SDL_ReadLE16(src);\n        Uint32 dwBytesInRes = SDL_ReadLE32(src);\n        Uint32 dwImageOffset = SDL_ReadLE32(src);\n\n        if (!bWidth)\n            bWidth = 256;\n        if (!bHeight)\n            bHeight = 256;\n        if (!bColorCount)\n            bColorCount = 256;\n\n        //printf(\"%dx%d@%d - %08x\\n\", bWidth, bHeight, bColorCount, dwImageOffset);\n        if (bColorCount > maxCol) {\n            maxCol = bColorCount;\n            icoOfs = dwImageOffset;\n            //printf(\"marked\\n\");\n        }\n    }\n\n    /* Advance to the DIB Data */\n    if (SDL_RWseek(src, icoOfs, RW_SEEK_SET) < 0) {\n        SDL_Error(SDL_EFSEEK);\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Read the Win32 BITMAPINFOHEADER */\n    biSize = SDL_ReadLE32(src);\n    if (biSize == 40) {\n        biWidth = SDL_ReadLE32(src);\n        biHeight = SDL_ReadLE32(src);\n        biPlanes = SDL_ReadLE16(src);\n        biBitCount = SDL_ReadLE16(src);\n        biCompression = SDL_ReadLE32(src);\n        biSizeImage = SDL_ReadLE32(src);\n        biXPelsPerMeter = SDL_ReadLE32(src);\n        biYPelsPerMeter = SDL_ReadLE32(src);\n        biClrUsed = SDL_ReadLE32(src);\n        biClrImportant = SDL_ReadLE32(src);\n    } else {\n        IMG_SetError(\"Unsupported ICO bitmap format\");\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Check for read error */\n    if (SDL_strcmp(SDL_GetError(), \"\") != 0) {\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* We don't support any BMP compression right now */\n    switch (biCompression) {\n    case BI_RGB:\n        /* Default values for the BMP format */\n        switch (biBitCount) {\n        case 1:\n        case 4:\n            ExpandBMP = biBitCount;\n            biBitCount = 8;\n            break;\n        case 8:\n            ExpandBMP = 8;\n            break;\n        case 32:\n            Rmask = 0x00FF0000;\n            Gmask = 0x0000FF00;\n            Bmask = 0x000000FF;\n            ExpandBMP = 0;\n            break;\n        default:\n            IMG_SetError(\"ICO file with unsupported bit count\");\n            was_error = SDL_TRUE;\n            goto done;\n        }\n        break;\n    default:\n        IMG_SetError(\"Compressed ICO files not supported\");\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Create a RGBA surface */\n    biHeight = biHeight >> 1;\n    //printf(\"%d x %d\\n\", biWidth, biHeight);\n    surface =\n        SDL_CreateRGBSurface(0, biWidth, biHeight, 32, 0x00FF0000,\n                             0x0000FF00, 0x000000FF, 0xFF000000);\n    if (surface == NULL) {\n        was_error = SDL_TRUE;\n        goto done;\n    }\n\n    /* Load the palette, if any */\n    //printf(\"bc %d bused %d\\n\", biBitCount, biClrUsed);\n    if (biBitCount <= 8) {\n        if (biClrUsed == 0) {\n            biClrUsed = 1 << biBitCount;\n        }\n        for (i = 0; i < (int) biClrUsed; ++i) {\n            SDL_RWread(src, &palette[i], 4, 1);\n        }\n    }\n\n    /* Read the surface pixels.  Note that the bmp image is upside down */\n    bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch);\n    switch (ExpandBMP) {\n    case 1:\n        bmpPitch = (biWidth + 7) >> 3;\n        pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);\n        break;\n    case 4:\n        bmpPitch = (biWidth + 1) >> 1;\n        pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);\n        break;\n    case 8:\n        bmpPitch = biWidth;\n        pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);\n        break;\n    default:\n        bmpPitch = biWidth * 4;\n        pad = 0;\n        break;\n    }\n    while (bits > (Uint8 *) surface->pixels) {\n        bits -= surface->pitch;\n        switch (ExpandBMP) {\n        case 1:\n        case 4:\n        case 8:\n            {\n                Uint8 pixel = 0;\n                int shift = (8 - ExpandBMP);\n                for (i = 0; i < surface->w; ++i) {\n                    if (i % (8 / ExpandBMP) == 0) {\n                        if (!SDL_RWread(src, &pixel, 1, 1)) {\n                            IMG_SetError(\"Error reading from ICO\");\n                            was_error = SDL_TRUE;\n                            goto done;\n                        }\n                    }\n                    *((Uint32 *) bits + i) = (palette[pixel >> shift]);\n                    pixel <<= ExpandBMP;\n                }\n            }\n            break;\n\n        default:\n            if (SDL_RWread(src, bits, 1, surface->pitch)\n                != surface->pitch) {\n                SDL_Error(SDL_EFREAD);\n                was_error = SDL_TRUE;\n                goto done;\n            }\n            break;\n        }\n        /* Skip padding bytes, ugh */\n        if (pad) {\n            Uint8 padbyte;\n            for (i = 0; i < pad; ++i) {\n                SDL_RWread(src, &padbyte, 1, 1);\n            }\n        }\n    }\n    /* Read the mask pixels.  Note that the bmp image is upside down */\n    bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch);\n    ExpandBMP = 1;\n    bmpPitch = (biWidth + 7) >> 3;\n    pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);\n    while (bits > (Uint8 *) surface->pixels) {\n        Uint8 pixel = 0;\n        int shift = (8 - ExpandBMP);\n\n        bits -= surface->pitch;\n        for (i = 0; i < surface->w; ++i) {\n            if (i % (8 / ExpandBMP) == 0) {\n                if (!SDL_RWread(src, &pixel, 1, 1)) {\n                    IMG_SetError(\"Error reading from ICO\");\n                    was_error = SDL_TRUE;\n                    goto done;\n                }\n            }\n            *((Uint32 *) bits + i) |= ((pixel >> shift) ? 0 : 0xFF000000);\n            pixel <<= ExpandBMP;\n        }\n        /* Skip padding bytes, ugh */\n        if (pad) {\n            Uint8 padbyte;\n            for (i = 0; i < pad; ++i) {\n                SDL_RWread(src, &padbyte, 1, 1);\n            }\n        }\n    }\n  done:\n    if (was_error) {\n        if (src) {\n            SDL_RWseek(src, fp_offset, RW_SEEK_SET);\n        }\n        if (surface) {\n            SDL_FreeSurface(surface);\n        }\n        surface = NULL;\n    }\n    if (freesrc && src) {\n        SDL_RWclose(src);\n    }\n    return (surface);\n}\n\n/* Load a BMP type image from an SDL datasource */\nSDL_Surface *IMG_LoadBMP_RW(SDL_RWops *src)\n{\n    return(LoadBMP_RW(src, 0));\n}\n\n/* Load a ICO type image from an SDL datasource */\nSDL_Surface *IMG_LoadICO_RW(SDL_RWops *src)\n{\n    return(LoadICOCUR_RW(src, 1, 0));\n}\n\n/* Load a CUR type image from an SDL datasource */\nSDL_Surface *IMG_LoadCUR_RW(SDL_RWops *src)\n{\n    return(LoadICOCUR_RW(src, 2, 0));\n}\n\n#else\n\n/* See if an image is contained in a data source */\nint IMG_isBMP(SDL_RWops *src)\n{\n    return(0);\n}\n\nint IMG_isICO(SDL_RWops *src)\n{\n    return(0);\n}\n\nint IMG_isCUR(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a BMP type image from an SDL datasource */\nSDL_Surface *IMG_LoadBMP_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n/* Load a BMP type image from an SDL datasource */\nSDL_Surface *IMG_LoadCUR_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n/* Load a BMP type image from an SDL datasource */\nSDL_Surface *IMG_LoadICO_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_BMP */\n\n#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_gif.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)\n\n/* This is a GIF image file loading framework */\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_GIF\n\n/* See if an image is contained in a data source */\nint IMG_isGIF(SDL_RWops *src)\n{\n    Sint64 start;\n    int is_GIF;\n    char magic[6];\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_GIF = 0;\n    if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {\n        if ( (SDL_strncmp(magic, \"GIF\", 3) == 0) &&\n             ((SDL_memcmp(magic + 3, \"87a\", 3) == 0) ||\n              (SDL_memcmp(magic + 3, \"89a\", 3) == 0)) ) {\n            is_GIF = 1;\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_GIF);\n}\n\n/* Code from here to end of file has been adapted from XPaint:           */\n/* +-------------------------------------------------------------------+ */\n/* | Copyright 1990, 1991, 1993 David Koblas.                  | */\n/* | Copyright 1996 Torsten Martinsen.                     | */\n/* |   Permission to use, copy, modify, and distribute this software   | */\n/* |   and its documentation for any purpose and without fee is hereby | */\n/* |   granted, provided that the above copyright notice appear in all | */\n/* |   copies and that both that copyright notice and this permission  | */\n/* |   notice appear in supporting documentation.  This software is    | */\n/* |   provided \"as is\" without express or implied warranty.           | */\n/* +-------------------------------------------------------------------+ */\n\n/* Adapted for use in SDL by Sam Lantinga -- 7/20/98 */\n#define USED_BY_SDL\n\n#include <stdio.h>\n#include <string.h>\n\n#ifdef USED_BY_SDL\n/* Changes to work with SDL:\n\n   Include SDL header file\n   Use SDL_Surface rather than xpaint Image structure\n   Define SDL versions of RWSetMsg(), ImageNewCmap() and ImageSetCmap()\n*/\n#include \"SDL.h\"\n\n#define Image           SDL_Surface\n#define RWSetMsg        IMG_SetError\n#define ImageNewCmap(w, h, s)   SDL_CreateRGBSurface(SDL_SWSURFACE,w,h,8,0,0,0,0)\n#define ImageSetCmap(s, i, R, G, B) do { \\\n                s->format->palette->colors[i].r = R; \\\n                s->format->palette->colors[i].g = G; \\\n                s->format->palette->colors[i].b = B; \\\n            } while (0)\n/* * * * * */\n\n#else\n\n/* Original XPaint sources */\n\n#include \"image.h\"\n#include \"rwTable.h\"\n\n#define SDL_RWops   FILE\n#define SDL_RWclose fclose\n\n#endif /* USED_BY_SDL */\n\n\n#define MAXCOLORMAPSIZE     256\n\n#define TRUE    1\n#define FALSE   0\n\n#define CM_RED      0\n#define CM_GREEN    1\n#define CM_BLUE     2\n\n#define MAX_LWZ_BITS        12\n\n#define INTERLACE       0x40\n#define LOCALCOLORMAP   0x80\n#define BitSet(byte, bit)   (((byte) & (bit)) == (bit))\n\n#define ReadOK(file,buffer,len) SDL_RWread(file, buffer, len, 1)\n\n#define LM_to_uint(a,b)         (((b)<<8)|(a))\n\nstatic struct {\n    unsigned int Width;\n    unsigned int Height;\n    unsigned char ColorMap[3][MAXCOLORMAPSIZE];\n    unsigned int BitPixel;\n    unsigned int ColorResolution;\n    unsigned int Background;\n    unsigned int AspectRatio;\n    int GrayScale;\n} GifScreen;\n\nstatic struct {\n    int transparent;\n    int delayTime;\n    int inputFlag;\n    int disposal;\n} Gif89;\n\nstatic int ReadColorMap(SDL_RWops * src, int number,\n            unsigned char buffer[3][MAXCOLORMAPSIZE], int *flag);\nstatic int DoExtension(SDL_RWops * src, int label);\nstatic int GetDataBlock(SDL_RWops * src, unsigned char *buf);\nstatic int GetCode(SDL_RWops * src, int code_size, int flag);\nstatic int LWZReadByte(SDL_RWops * src, int flag, int input_code_size);\nstatic Image *ReadImage(SDL_RWops * src, int len, int height, int,\n            unsigned char cmap[3][MAXCOLORMAPSIZE],\n            int gray, int interlace, int ignore);\n\nImage *\nIMG_LoadGIF_RW(SDL_RWops *src)\n{\n    Sint64 start;\n    unsigned char buf[16];\n    unsigned char c;\n    unsigned char localColorMap[3][MAXCOLORMAPSIZE];\n    int grayScale;\n    int useGlobalColormap;\n    int bitPixel;\n    int imageCount = 0;\n    char version[4];\n    int imageNumber = 1;\n    Image *image = NULL;\n\n    if ( src == NULL ) {\n    return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    if (!ReadOK(src, buf, 6)) {\n    RWSetMsg(\"error reading magic number\");\n        goto done;\n    }\n    if (SDL_strncmp((char *) buf, \"GIF\", 3) != 0) {\n    RWSetMsg(\"not a GIF file\");\n        goto done;\n    }\n    SDL_memcpy(version, (char *) buf + 3, 3);\n    version[3] = '\\0';\n\n    if ((SDL_strcmp(version, \"87a\") != 0) && (SDL_strcmp(version, \"89a\") != 0)) {\n    RWSetMsg(\"bad version number, not '87a' or '89a'\");\n        goto done;\n    }\n    Gif89.transparent = -1;\n    Gif89.delayTime = -1;\n    Gif89.inputFlag = -1;\n    Gif89.disposal = 0;\n\n    if (!ReadOK(src, buf, 7)) {\n    RWSetMsg(\"failed to read screen descriptor\");\n        goto done;\n    }\n    GifScreen.Width = LM_to_uint(buf[0], buf[1]);\n    GifScreen.Height = LM_to_uint(buf[2], buf[3]);\n    GifScreen.BitPixel = 2 << (buf[4] & 0x07);\n    GifScreen.ColorResolution = (((buf[4] & 0x70) >> 3) + 1);\n    GifScreen.Background = buf[5];\n    GifScreen.AspectRatio = buf[6];\n\n    if (BitSet(buf[4], LOCALCOLORMAP)) {    /* Global Colormap */\n    if (ReadColorMap(src, GifScreen.BitPixel, GifScreen.ColorMap,\n             &GifScreen.GrayScale)) {\n        RWSetMsg(\"error reading global colormap\");\n            goto done;\n    }\n    }\n    do {\n    if (!ReadOK(src, &c, 1)) {\n        RWSetMsg(\"EOF / read error on image data\");\n            goto done;\n    }\n    if (c == ';') {     /* GIF terminator */\n        if (imageCount < imageNumber) {\n        RWSetMsg(\"only %d image%s found in file\",\n             imageCount, imageCount > 1 ? \"s\" : \"\");\n                goto done;\n        }\n    }\n    if (c == '!') {     /* Extension */\n        if (!ReadOK(src, &c, 1)) {\n        RWSetMsg(\"EOF / read error on extention function code\");\n                goto done;\n        }\n        DoExtension(src, c);\n        continue;\n    }\n    if (c != ',') {     /* Not a valid start character */\n        continue;\n    }\n    ++imageCount;\n\n    if (!ReadOK(src, buf, 9)) {\n        RWSetMsg(\"couldn't read left/top/width/height\");\n            goto done;\n    }\n    useGlobalColormap = !BitSet(buf[8], LOCALCOLORMAP);\n\n    bitPixel = 1 << ((buf[8] & 0x07) + 1);\n\n    if (!useGlobalColormap) {\n        if (ReadColorMap(src, bitPixel, localColorMap, &grayScale)) {\n        RWSetMsg(\"error reading local colormap\");\n                goto done;\n        }\n        image = ReadImage(src, LM_to_uint(buf[4], buf[5]),\n                  LM_to_uint(buf[6], buf[7]),\n                  bitPixel, localColorMap, grayScale,\n                  BitSet(buf[8], INTERLACE),\n                  imageCount != imageNumber);\n    } else {\n        image = ReadImage(src, LM_to_uint(buf[4], buf[5]),\n                  LM_to_uint(buf[6], buf[7]),\n                  GifScreen.BitPixel, GifScreen.ColorMap,\n                  GifScreen.GrayScale, BitSet(buf[8], INTERLACE),\n                  imageCount != imageNumber);\n    }\n    } while (image == NULL);\n\n#ifdef USED_BY_SDL\n    if ( Gif89.transparent >= 0 ) {\n        SDL_SetColorKey(image, SDL_TRUE, Gif89.transparent);\n    }\n#endif\n\ndone:\n    if ( image == NULL ) {\n        SDL_RWseek(src, start, RW_SEEK_SET);\n    }\n    return image;\n}\n\nstatic int\nReadColorMap(SDL_RWops *src, int number,\n             unsigned char buffer[3][MAXCOLORMAPSIZE], int *gray)\n{\n    int i;\n    unsigned char rgb[3];\n    int flag;\n\n    flag = TRUE;\n\n    for (i = 0; i < number; ++i) {\n    if (!ReadOK(src, rgb, sizeof(rgb))) {\n        RWSetMsg(\"bad colormap\");\n        return 1;\n    }\n    buffer[CM_RED][i] = rgb[0];\n    buffer[CM_GREEN][i] = rgb[1];\n    buffer[CM_BLUE][i] = rgb[2];\n    flag &= (rgb[0] == rgb[1] && rgb[1] == rgb[2]);\n    }\n\n#if 0\n    if (flag)\n    *gray = (number == 2) ? PBM_TYPE : PGM_TYPE;\n    else\n    *gray = PPM_TYPE;\n#else\n    *gray = 0;\n#endif\n\n    return FALSE;\n}\n\nstatic int\nDoExtension(SDL_RWops *src, int label)\n{\n    static unsigned char buf[256];\n    char *str;\n\n    switch (label) {\n    case 0x01:          /* Plain Text Extension */\n    str = \"Plain Text Extension\";\n    break;\n    case 0xff:          /* Application Extension */\n    str = \"Application Extension\";\n    break;\n    case 0xfe:          /* Comment Extension */\n    str = \"Comment Extension\";\n    while (GetDataBlock(src, (unsigned char *) buf) != 0)\n        ;\n    return FALSE;\n    case 0xf9:          /* Graphic Control Extension */\n    str = \"Graphic Control Extension\";\n    (void) GetDataBlock(src, (unsigned char *) buf);\n    Gif89.disposal = (buf[0] >> 2) & 0x7;\n    Gif89.inputFlag = (buf[0] >> 1) & 0x1;\n    Gif89.delayTime = LM_to_uint(buf[1], buf[2]);\n    if ((buf[0] & 0x1) != 0)\n        Gif89.transparent = buf[3];\n\n    while (GetDataBlock(src, (unsigned char *) buf) != 0)\n        ;\n    return FALSE;\n    default:\n    str = (char *)buf;\n    SDL_snprintf(str, 256, \"UNKNOWN (0x%02x)\", label);\n    break;\n    }\n\n    while (GetDataBlock(src, (unsigned char *) buf) != 0)\n    ;\n\n    return FALSE;\n}\n\nstatic int ZeroDataBlock = FALSE;\n\nstatic int\nGetDataBlock(SDL_RWops *src, unsigned char *buf)\n{\n    unsigned char count;\n\n    if (!ReadOK(src, &count, 1)) {\n    /* pm_message(\"error in getting DataBlock size\" ); */\n    return -1;\n    }\n    ZeroDataBlock = count == 0;\n\n    if ((count != 0) && (!ReadOK(src, buf, count))) {\n    /* pm_message(\"error in reading DataBlock\" ); */\n    return -1;\n    }\n    return count;\n}\n\nstatic int\nGetCode(SDL_RWops *src, int code_size, int flag)\n{\n    static unsigned char buf[280];\n    static int curbit, lastbit, done, last_byte;\n    int i, j, ret;\n    unsigned char count;\n\n    if (flag) {\n    curbit = 0;\n    lastbit = 0;\n    done = FALSE;\n    return 0;\n    }\n    if ((curbit + code_size) >= lastbit) {\n    if (done) {\n        if (curbit >= lastbit)\n        RWSetMsg(\"ran off the end of my bits\");\n        return -1;\n    }\n    buf[0] = buf[last_byte - 2];\n    buf[1] = buf[last_byte - 1];\n\n    if ((count = GetDataBlock(src, &buf[2])) == 0)\n        done = TRUE;\n\n    last_byte = 2 + count;\n    curbit = (curbit - lastbit) + 16;\n    lastbit = (2 + count) * 8;\n    }\n    ret = 0;\n    for (i = curbit, j = 0; j < code_size; ++i, ++j)\n    ret |= ((buf[i / 8] & (1 << (i % 8))) != 0) << j;\n\n    curbit += code_size;\n\n    return ret;\n}\n\nstatic int\nLWZReadByte(SDL_RWops *src, int flag, int input_code_size)\n{\n    static int fresh = FALSE;\n    int code, incode;\n    static int code_size, set_code_size;\n    static int max_code, max_code_size;\n    static int firstcode, oldcode;\n    static int clear_code, end_code;\n    static int table[2][(1 << MAX_LWZ_BITS)];\n    static int stack[(1 << (MAX_LWZ_BITS)) * 2], *sp;\n    register int i;\n\n    /* Fixed buffer overflow found by Michael Skladnikiewicz */\n    if (input_code_size > MAX_LWZ_BITS)\n        return -1;\n\n    if (flag) {\n    set_code_size = input_code_size;\n    code_size = set_code_size + 1;\n    clear_code = 1 << set_code_size;\n    end_code = clear_code + 1;\n    max_code_size = 2 * clear_code;\n    max_code = clear_code + 2;\n\n    GetCode(src, 0, TRUE);\n\n    fresh = TRUE;\n\n    for (i = 0; i < clear_code; ++i) {\n        table[0][i] = 0;\n        table[1][i] = i;\n    }\n    table[1][0] = 0;\n    for (; i < (1 << MAX_LWZ_BITS); ++i)\n        table[0][i] = 0;\n\n    sp = stack;\n\n    return 0;\n    } else if (fresh) {\n    fresh = FALSE;\n    do {\n        firstcode = oldcode = GetCode(src, code_size, FALSE);\n    } while (firstcode == clear_code);\n    return firstcode;\n    }\n    if (sp > stack)\n    return *--sp;\n\n    while ((code = GetCode(src, code_size, FALSE)) >= 0) {\n    if (code == clear_code) {\n        for (i = 0; i < clear_code; ++i) {\n        table[0][i] = 0;\n        table[1][i] = i;\n        }\n        for (; i < (1 << MAX_LWZ_BITS); ++i)\n        table[0][i] = table[1][i] = 0;\n        code_size = set_code_size + 1;\n        max_code_size = 2 * clear_code;\n        max_code = clear_code + 2;\n        sp = stack;\n        firstcode = oldcode = GetCode(src, code_size, FALSE);\n        return firstcode;\n    } else if (code == end_code) {\n        int count;\n        unsigned char buf[260];\n\n        if (ZeroDataBlock)\n        return -2;\n\n        while ((count = GetDataBlock(src, buf)) > 0)\n        ;\n\n        if (count != 0) {\n        /*\n         * pm_message(\"missing EOD in data stream (common occurence)\");\n         */\n        }\n        return -2;\n    }\n    incode = code;\n\n    if (code >= max_code) {\n        *sp++ = firstcode;\n        code = oldcode;\n    }\n    while (code >= clear_code) {\n        /* Guard against buffer overruns */\n        if (code < 0 || code >= (1 << MAX_LWZ_BITS)) {\n            RWSetMsg(\"invalid LWZ data\");\n            return -3;\n        }\n        *sp++ = table[1][code];\n        if (code == table[0][code])\n        RWSetMsg(\"circular table entry BIG ERROR\");\n        code = table[0][code];\n    }\n\n    /* Guard against buffer overruns */\n    if (code < 0 || code >= (1 << MAX_LWZ_BITS)) {\n        RWSetMsg(\"invalid LWZ data\");\n        return -4;\n    }\n    *sp++ = firstcode = table[1][code];\n\n    if ((code = max_code) < (1 << MAX_LWZ_BITS)) {\n        table[0][code] = oldcode;\n        table[1][code] = firstcode;\n        ++max_code;\n        if ((max_code >= max_code_size) &&\n        (max_code_size < (1 << MAX_LWZ_BITS))) {\n        max_code_size *= 2;\n        ++code_size;\n        }\n    }\n    oldcode = incode;\n\n    if (sp > stack)\n        return *--sp;\n    }\n    return code;\n}\n\nstatic Image *\nReadImage(SDL_RWops * src, int len, int height, int cmapSize,\n      unsigned char cmap[3][MAXCOLORMAPSIZE],\n      int gray, int interlace, int ignore)\n{\n    Image *image;\n    unsigned char c;\n    int i, v;\n    int xpos = 0, ypos = 0, pass = 0;\n\n    /*\n    **  Initialize the compression routines\n     */\n    if (!ReadOK(src, &c, 1)) {\n    RWSetMsg(\"EOF / read error on image data\");\n    return NULL;\n    }\n    if (LWZReadByte(src, TRUE, c) < 0) {\n    RWSetMsg(\"error reading image\");\n    return NULL;\n    }\n    /*\n    **  If this is an \"uninteresting picture\" ignore it.\n     */\n    if (ignore) {\n    while (LWZReadByte(src, FALSE, c) >= 0)\n        ;\n    return NULL;\n    }\n    image = ImageNewCmap(len, height, cmapSize);\n\n    for (i = 0; i < cmapSize; i++)\n    ImageSetCmap(image, i, cmap[CM_RED][i],\n             cmap[CM_GREEN][i], cmap[CM_BLUE][i]);\n\n    while ((v = LWZReadByte(src, FALSE, c)) >= 0) {\n#ifdef USED_BY_SDL\n    ((Uint8 *)image->pixels)[xpos + ypos * image->pitch] = v;\n#else\n    image->data[xpos + ypos * len] = v;\n#endif\n    ++xpos;\n    if (xpos == len) {\n        xpos = 0;\n        if (interlace) {\n        switch (pass) {\n        case 0:\n        case 1:\n            ypos += 8;\n            break;\n        case 2:\n            ypos += 4;\n            break;\n        case 3:\n            ypos += 2;\n            break;\n        }\n\n        if (ypos >= height) {\n            ++pass;\n            switch (pass) {\n            case 1:\n            ypos = 4;\n            break;\n            case 2:\n            ypos = 2;\n            break;\n            case 3:\n            ypos = 1;\n            break;\n            default:\n            goto fini;\n            }\n        }\n        } else {\n        ++ypos;\n        }\n    }\n    if (ypos >= height)\n        break;\n    }\n\n  fini:\n\n    return image;\n}\n\n#else\n\n/* See if an image is contained in a data source */\nint IMG_isGIF(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a GIF type image from an SDL datasource */\nSDL_Surface *IMG_LoadGIF_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_GIF */\n\n#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_jpg.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)\n\n/* This is a JPEG image file loading framework */\n\n#include <stdio.h>\n#include <string.h>\n#include <setjmp.h>\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_JPG\n\n#include <jpeglib.h>\n\n#ifdef JPEG_TRUE  /* MinGW version of jpeg-8.x renamed TRUE to JPEG_TRUE etc. */\n    typedef JPEG_boolean boolean;\n    #define TRUE JPEG_TRUE\n    #define FALSE JPEG_FALSE\n#endif\n\n/* Define this for fast loading and not as good image quality */\n/*#define FAST_JPEG*/\n\n/* Define this for quicker (but less perfect) JPEG identification */\n#define FAST_IS_JPEG\n\nstatic struct {\n    int loaded;\n    void *handle;\n    void (*jpeg_calc_output_dimensions) (j_decompress_ptr cinfo);\n    void (*jpeg_CreateDecompress) (j_decompress_ptr cinfo, int version, size_t structsize);\n    void (*jpeg_destroy_decompress) (j_decompress_ptr cinfo);\n    boolean (*jpeg_finish_decompress) (j_decompress_ptr cinfo);\n    int (*jpeg_read_header) (j_decompress_ptr cinfo, boolean require_image);\n    JDIMENSION (*jpeg_read_scanlines) (j_decompress_ptr cinfo, JSAMPARRAY scanlines, JDIMENSION max_lines);\n    boolean (*jpeg_resync_to_restart) (j_decompress_ptr cinfo, int desired);\n    boolean (*jpeg_start_decompress) (j_decompress_ptr cinfo);\n    struct jpeg_error_mgr * (*jpeg_std_error) (struct jpeg_error_mgr * err);\n} lib;\n\n#ifdef LOAD_JPG_DYNAMIC\nint IMG_InitJPG()\n{\n    if ( lib.loaded == 0 ) {\n        lib.handle = SDL_LoadObject(LOAD_JPG_DYNAMIC);\n        if ( lib.handle == NULL ) {\n            return -1;\n        }\n        lib.jpeg_calc_output_dimensions =\n            (void (*) (j_decompress_ptr))\n            SDL_LoadFunction(lib.handle, \"jpeg_calc_output_dimensions\");\n        if ( lib.jpeg_calc_output_dimensions == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.jpeg_CreateDecompress =\n            (void (*) (j_decompress_ptr, int, size_t))\n            SDL_LoadFunction(lib.handle, \"jpeg_CreateDecompress\");\n        if ( lib.jpeg_CreateDecompress == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.jpeg_destroy_decompress =\n            (void (*) (j_decompress_ptr))\n            SDL_LoadFunction(lib.handle, \"jpeg_destroy_decompress\");\n        if ( lib.jpeg_destroy_decompress == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.jpeg_finish_decompress =\n            (boolean (*) (j_decompress_ptr))\n            SDL_LoadFunction(lib.handle, \"jpeg_finish_decompress\");\n        if ( lib.jpeg_finish_decompress == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.jpeg_read_header =\n            (int (*) (j_decompress_ptr, boolean))\n            SDL_LoadFunction(lib.handle, \"jpeg_read_header\");\n        if ( lib.jpeg_read_header == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.jpeg_read_scanlines =\n            (JDIMENSION (*) (j_decompress_ptr, JSAMPARRAY, JDIMENSION))\n            SDL_LoadFunction(lib.handle, \"jpeg_read_scanlines\");\n        if ( lib.jpeg_read_scanlines == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.jpeg_resync_to_restart =\n            (boolean (*) (j_decompress_ptr, int))\n            SDL_LoadFunction(lib.handle, \"jpeg_resync_to_restart\");\n        if ( lib.jpeg_resync_to_restart == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.jpeg_start_decompress =\n            (boolean (*) (j_decompress_ptr))\n            SDL_LoadFunction(lib.handle, \"jpeg_start_decompress\");\n        if ( lib.jpeg_start_decompress == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.jpeg_std_error =\n            (struct jpeg_error_mgr * (*) (struct jpeg_error_mgr *))\n            SDL_LoadFunction(lib.handle, \"jpeg_std_error\");\n        if ( lib.jpeg_std_error == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n    }\n    ++lib.loaded;\n\n    return 0;\n}\nvoid IMG_QuitJPG()\n{\n    if ( lib.loaded == 0 ) {\n        return;\n    }\n    if ( lib.loaded == 1 ) {\n        SDL_UnloadObject(lib.handle);\n    }\n    --lib.loaded;\n}\n#else\nint IMG_InitJPG()\n{\n    if ( lib.loaded == 0 ) {\n        lib.jpeg_calc_output_dimensions = jpeg_calc_output_dimensions;\n        lib.jpeg_CreateDecompress = jpeg_CreateDecompress;\n        lib.jpeg_destroy_decompress = jpeg_destroy_decompress;\n        lib.jpeg_finish_decompress = jpeg_finish_decompress;\n        lib.jpeg_read_header = jpeg_read_header;\n        lib.jpeg_read_scanlines = jpeg_read_scanlines;\n        lib.jpeg_resync_to_restart = jpeg_resync_to_restart;\n        lib.jpeg_start_decompress = jpeg_start_decompress;\n        lib.jpeg_std_error = jpeg_std_error;\n    }\n    ++lib.loaded;\n\n    return 0;\n}\nvoid IMG_QuitJPG()\n{\n    if ( lib.loaded == 0 ) {\n        return;\n    }\n    if ( lib.loaded == 1 ) {\n    }\n    --lib.loaded;\n}\n#endif /* LOAD_JPG_DYNAMIC */\n\n/* See if an image is contained in a data source */\nint IMG_isJPG(SDL_RWops *src)\n{\n    Sint64 start;\n    int is_JPG;\n    int in_scan;\n    Uint8 magic[4];\n\n    /* This detection code is by Steaphan Greene <stea@cs.binghamton.edu> */\n    /* Blame me, not Sam, if this doesn't work right. */\n    /* And don't forget to report the problem to the the sdl list too! */\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_JPG = 0;\n    in_scan = 0;\n    if ( SDL_RWread(src, magic, 2, 1) ) {\n        if ( (magic[0] == 0xFF) && (magic[1] == 0xD8) ) {\n            is_JPG = 1;\n            while (is_JPG == 1) {\n                if(SDL_RWread(src, magic, 1, 2) != 2) {\n                    is_JPG = 0;\n                } else if( (magic[0] != 0xFF) && (in_scan == 0) ) {\n                    is_JPG = 0;\n                } else if( (magic[0] != 0xFF) || (magic[1] == 0xFF) ) {\n                    /* Extra padding in JPEG (legal) */\n                    /* or this is data and we are scanning */\n                    SDL_RWseek(src, -1, RW_SEEK_CUR);\n                } else if(magic[1] == 0xD9) {\n                    /* Got to end of good JPEG */\n                    break;\n                } else if( (in_scan == 1) && (magic[1] == 0x00) ) {\n                    /* This is an encoded 0xFF within the data */\n                } else if( (magic[1] >= 0xD0) && (magic[1] < 0xD9) ) {\n                    /* These have nothing else */\n                } else if(SDL_RWread(src, magic+2, 1, 2) != 2) {\n                    is_JPG = 0;\n                } else {\n                    /* Yes, it's big-endian */\n                    Sint64 innerStart;\n                    Uint32 size;\n                    Sint64 end;\n                    innerStart = SDL_RWtell(src);\n                    size = (magic[2] << 8) + magic[3];\n                    end = SDL_RWseek(src, size-2, RW_SEEK_CUR);\n                    if ( end != innerStart + size - 2 ) is_JPG = 0;\n                    if ( magic[1] == 0xDA ) {\n                        /* Now comes the actual JPEG meat */\n#ifdef  FAST_IS_JPEG\n                        /* Ok, I'm convinced.  It is a JPEG. */\n                        break;\n#else\n                        /* I'm not convinced.  Prove it! */\n                        in_scan = 1;\n#endif\n                    }\n                }\n            }\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_JPG);\n}\n\n#define INPUT_BUFFER_SIZE   4096\ntypedef struct {\n    struct jpeg_source_mgr pub;\n\n    SDL_RWops *ctx;\n    Uint8 buffer[INPUT_BUFFER_SIZE];\n} my_source_mgr;\n\n/*\n * Initialize source --- called by jpeg_read_header\n * before any data is actually read.\n */\nstatic void init_source (j_decompress_ptr cinfo)\n{\n    /* We don't actually need to do anything */\n    return;\n}\n\n/*\n * Fill the input buffer --- called whenever buffer is emptied.\n */\nstatic boolean fill_input_buffer (j_decompress_ptr cinfo)\n{\n    my_source_mgr * src = (my_source_mgr *) cinfo->src;\n    int nbytes;\n\n    nbytes = SDL_RWread(src->ctx, src->buffer, 1, INPUT_BUFFER_SIZE);\n    if (nbytes <= 0) {\n        /* Insert a fake EOI marker */\n        src->buffer[0] = (Uint8) 0xFF;\n        src->buffer[1] = (Uint8) JPEG_EOI;\n        nbytes = 2;\n    }\n    src->pub.next_input_byte = src->buffer;\n    src->pub.bytes_in_buffer = nbytes;\n\n    return TRUE;\n}\n\n\n/*\n * Skip data --- used to skip over a potentially large amount of\n * uninteresting data (such as an APPn marker).\n *\n * Writers of suspendable-input applications must note that skip_input_data\n * is not granted the right to give a suspension return.  If the skip extends\n * beyond the data currently in the buffer, the buffer can be marked empty so\n * that the next read will cause a fill_input_buffer call that can suspend.\n * Arranging for additional bytes to be discarded before reloading the input\n * buffer is the application writer's problem.\n */\nstatic void skip_input_data (j_decompress_ptr cinfo, long num_bytes)\n{\n    my_source_mgr * src = (my_source_mgr *) cinfo->src;\n\n    /* Just a dumb implementation for now.  Could use fseek() except\n     * it doesn't work on pipes.  Not clear that being smart is worth\n     * any trouble anyway --- large skips are infrequent.\n     */\n    if (num_bytes > 0) {\n        while (num_bytes > (long) src->pub.bytes_in_buffer) {\n            num_bytes -= (long) src->pub.bytes_in_buffer;\n            (void) src->pub.fill_input_buffer(cinfo);\n            /* note we assume that fill_input_buffer will never\n             * return FALSE, so suspension need not be handled.\n             */\n        }\n        src->pub.next_input_byte += (size_t) num_bytes;\n        src->pub.bytes_in_buffer -= (size_t) num_bytes;\n    }\n}\n\n/*\n * Terminate source --- called by jpeg_finish_decompress\n * after all data has been read.\n */\nstatic void term_source (j_decompress_ptr cinfo)\n{\n    /* We don't actually need to do anything */\n    return;\n}\n\n/*\n * Prepare for input from a stdio stream.\n * The caller must have already opened the stream, and is responsible\n * for closing it after finishing decompression.\n */\nstatic void jpeg_SDL_RW_src (j_decompress_ptr cinfo, SDL_RWops *ctx)\n{\n  my_source_mgr *src;\n\n  /* The source object and input buffer are made permanent so that a series\n   * of JPEG images can be read from the same file by calling jpeg_stdio_src\n   * only before the first one.  (If we discarded the buffer at the end of\n   * one image, we'd likely lose the start of the next one.)\n   * This makes it unsafe to use this manager and a different source\n   * manager serially with the same JPEG object.  Caveat programmer.\n   */\n  if (cinfo->src == NULL) { /* first time for this JPEG object? */\n    cinfo->src = (struct jpeg_source_mgr *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n                  sizeof(my_source_mgr));\n    src = (my_source_mgr *) cinfo->src;\n  }\n\n  src = (my_source_mgr *) cinfo->src;\n  src->pub.init_source = init_source;\n  src->pub.fill_input_buffer = fill_input_buffer;\n  src->pub.skip_input_data = skip_input_data;\n  src->pub.resync_to_restart = lib.jpeg_resync_to_restart; /* use default method */\n  src->pub.term_source = term_source;\n  src->ctx = ctx;\n  src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */\n  src->pub.next_input_byte = NULL; /* until buffer loaded */\n}\n\nstruct my_error_mgr {\n    struct jpeg_error_mgr errmgr;\n    jmp_buf escape;\n};\n\nstatic void my_error_exit(j_common_ptr cinfo)\n{\n    struct my_error_mgr *err = (struct my_error_mgr *)cinfo->err;\n    longjmp(err->escape, 1);\n}\n\nstatic void output_no_message(j_common_ptr cinfo)\n{\n    /* do nothing */\n}\n\n/* Load a JPEG type image from an SDL datasource */\nSDL_Surface *IMG_LoadJPG_RW(SDL_RWops *src)\n{\n    Sint64 start;\n    struct jpeg_decompress_struct cinfo;\n    JSAMPROW rowptr[1];\n    SDL_Surface *volatile surface = NULL;\n    struct my_error_mgr jerr;\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    if ( !IMG_Init(IMG_INIT_JPG) ) {\n        return NULL;\n    }\n\n    /* Create a decompression structure and load the JPEG header */\n    cinfo.err = lib.jpeg_std_error(&jerr.errmgr);\n    jerr.errmgr.error_exit = my_error_exit;\n    jerr.errmgr.output_message = output_no_message;\n    if(setjmp(jerr.escape)) {\n        /* If we get here, libjpeg found an error */\n        lib.jpeg_destroy_decompress(&cinfo);\n        if ( surface != NULL ) {\n            SDL_FreeSurface(surface);\n        }\n        SDL_RWseek(src, start, RW_SEEK_SET);\n        IMG_SetError(\"JPEG loading error\");\n        return NULL;\n    }\n\n    lib.jpeg_create_decompress(&cinfo);\n    jpeg_SDL_RW_src(&cinfo, src);\n    lib.jpeg_read_header(&cinfo, TRUE);\n\n    if(cinfo.num_components == 4) {\n        /* Set 32-bit Raw output */\n        cinfo.out_color_space = JCS_CMYK;\n        cinfo.quantize_colors = FALSE;\n        lib.jpeg_calc_output_dimensions(&cinfo);\n\n        /* Allocate an output surface to hold the image */\n        surface = SDL_CreateRGBSurface(SDL_SWSURFACE,\n                cinfo.output_width, cinfo.output_height, 32,\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n                           0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);\n#else\n                           0x0000FF00, 0x00FF0000, 0xFF000000, 0x000000FF);\n#endif\n    } else {\n        /* Set 24-bit RGB output */\n        cinfo.out_color_space = JCS_RGB;\n        cinfo.quantize_colors = FALSE;\n#ifdef FAST_JPEG\n        cinfo.scale_num   = 1;\n        cinfo.scale_denom = 1;\n        cinfo.dct_method = JDCT_FASTEST;\n        cinfo.do_fancy_upsampling = FALSE;\n#endif\n        lib.jpeg_calc_output_dimensions(&cinfo);\n\n        /* Allocate an output surface to hold the image */\n        surface = SDL_CreateRGBSurface(SDL_SWSURFACE,\n                cinfo.output_width, cinfo.output_height, 24,\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n                           0x0000FF, 0x00FF00, 0xFF0000,\n#else\n                           0xFF0000, 0x00FF00, 0x0000FF,\n#endif\n                           0);\n    }\n\n    if ( surface == NULL ) {\n        lib.jpeg_destroy_decompress(&cinfo);\n        SDL_RWseek(src, start, RW_SEEK_SET);\n        IMG_SetError(\"Out of memory\");\n        return NULL;\n    }\n\n    /* Decompress the image */\n    lib.jpeg_start_decompress(&cinfo);\n    while ( cinfo.output_scanline < cinfo.output_height ) {\n        rowptr[0] = (JSAMPROW)(Uint8 *)surface->pixels +\n                            cinfo.output_scanline * surface->pitch;\n        lib.jpeg_read_scanlines(&cinfo, rowptr, (JDIMENSION) 1);\n    }\n    lib.jpeg_finish_decompress(&cinfo);\n    lib.jpeg_destroy_decompress(&cinfo);\n\n    return(surface);\n}\n\n#else\n\nint IMG_InitJPG()\n{\n    IMG_SetError(\"JPEG images are not supported\");\n    return(-1);\n}\n\nvoid IMG_QuitJPG()\n{\n}\n\n/* See if an image is contained in a data source */\nint IMG_isJPG(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a JPEG type image from an SDL datasource */\nSDL_Surface *IMG_LoadJPG_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_JPG */\n\n#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_lbm.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* This is a ILBM image file loading framework\n   Load IFF pictures, PBM & ILBM packing methods, with or without stencil\n   Written by Daniel Morais ( Daniel AT Morais DOT com ) in September 2001.\n   24 bits ILBM files support added by Marc Le Douarain (http://www.multimania.com/mavati)\n   in December 2002.\n   EHB and HAM (specific Amiga graphic chip modes) support added by Marc Le Douarain\n   (http://www.multimania.com/mavati) in December 2003.\n   Stencil and colorkey fixes by David Raulo (david.raulo AT free DOT fr) in February 2004.\n   Buffer overflow fix in RLE decompression by David Raulo in January 2008.\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL_endian.h\"\n#include \"SDL_image.h\"\n\n#ifdef LOAD_LBM\n\n\n#define MAXCOLORS 256\n\n/* Structure for an IFF picture ( BMHD = Bitmap Header ) */\n\ntypedef struct\n{\n    Uint16 w, h;        /* width & height of the bitmap in pixels */\n    Sint16 x, y;        /* screen coordinates of the bitmap */\n    Uint8 planes;       /* number of planes of the bitmap */\n    Uint8 mask;         /* mask type ( 0 => no mask ) */\n    Uint8 tcomp;        /* compression type */\n    Uint8 pad1;         /* dummy value, for padding */\n    Uint16 tcolor;      /* transparent color */\n    Uint8 xAspect,      /* pixel aspect ratio */\n          yAspect;\n    Sint16  Lpage;      /* width of the screen in pixels */\n    Sint16  Hpage;      /* height of the screen in pixels */\n} BMHD;\n\nint IMG_isLBM( SDL_RWops *src )\n{\n    Sint64 start;\n    int   is_LBM;\n    Uint8 magic[4+4+4];\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_LBM = 0;\n    if ( SDL_RWread( src, magic, sizeof(magic), 1 ) )\n    {\n        if ( !SDL_memcmp( magic, \"FORM\", 4 ) &&\n            ( !SDL_memcmp( magic + 8, \"PBM \", 4 ) ||\n              !SDL_memcmp( magic + 8, \"ILBM\", 4 ) ) )\n        {\n            is_LBM = 1;\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return( is_LBM );\n}\n\nSDL_Surface *IMG_LoadLBM_RW( SDL_RWops *src )\n{\n    Sint64 start;\n    SDL_Surface *Image;\n    Uint8       id[4], pbm, colormap[MAXCOLORS*3], *MiniBuf, *ptr, count, color, msk;\n    Uint32      size, bytesloaded, nbcolors;\n    Uint32      i, j, bytesperline, nbplanes, stencil, plane, h;\n    Uint32      remainingbytes;\n    Uint32      width;\n    BMHD          bmhd;\n    char        *error;\n    Uint8       flagHAM,flagEHB;\n\n    Image   = NULL;\n    error   = NULL;\n    MiniBuf = NULL;\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    if ( !SDL_RWread( src, id, 4, 1 ) )\n    {\n        error=\"error reading IFF chunk\";\n        goto done;\n    }\n\n    /* Should be the size of the file minus 4+4 ( 'FORM'+size ) */\n    if ( !SDL_RWread( src, &size, 4, 1 ) )\n    {\n        error=\"error reading IFF chunk size\";\n        goto done;\n    }\n\n    /* As size is not used here, no need to swap it */\n\n    if ( SDL_memcmp( id, \"FORM\", 4 ) != 0 )\n    {\n        error=\"not a IFF file\";\n        goto done;\n    }\n\n    if ( !SDL_RWread( src, id, 4, 1 ) )\n    {\n        error=\"error reading IFF chunk\";\n        goto done;\n    }\n\n    pbm = 0;\n\n    /* File format : PBM=Packed Bitmap, ILBM=Interleaved Bitmap */\n    if ( !SDL_memcmp( id, \"PBM \", 4 ) ) pbm = 1;\n    else if ( SDL_memcmp( id, \"ILBM\", 4 ) )\n    {\n        error=\"not a IFF picture\";\n        goto done;\n    }\n\n    nbcolors = 0;\n\n    SDL_memset( &bmhd, 0, sizeof( BMHD ) );\n    flagHAM = 0;\n    flagEHB = 0;\n\n    while ( SDL_memcmp( id, \"BODY\", 4 ) != 0 )\n    {\n        if ( !SDL_RWread( src, id, 4, 1 ) )\n        {\n            error=\"error reading IFF chunk\";\n            goto done;\n        }\n\n        if ( !SDL_RWread( src, &size, 4, 1 ) )\n        {\n            error=\"error reading IFF chunk size\";\n            goto done;\n        }\n\n        bytesloaded = 0;\n\n        size = SDL_SwapBE32( size );\n\n        if ( !SDL_memcmp( id, \"BMHD\", 4 ) ) /* Bitmap header */\n        {\n            if ( !SDL_RWread( src, &bmhd, sizeof( BMHD ), 1 ) )\n            {\n                error=\"error reading BMHD chunk\";\n                goto done;\n            }\n\n            bytesloaded = sizeof( BMHD );\n\n            bmhd.w      = SDL_SwapBE16( bmhd.w );\n            bmhd.h      = SDL_SwapBE16( bmhd.h );\n            bmhd.x      = SDL_SwapBE16( bmhd.x );\n            bmhd.y      = SDL_SwapBE16( bmhd.y );\n            bmhd.tcolor = SDL_SwapBE16( bmhd.tcolor );\n            bmhd.Lpage  = SDL_SwapBE16( bmhd.Lpage );\n            bmhd.Hpage  = SDL_SwapBE16( bmhd.Hpage );\n        }\n\n        if ( !SDL_memcmp( id, \"CMAP\", 4 ) ) /* palette ( Color Map ) */\n        {\n            if ( !SDL_RWread( src, &colormap, size, 1 ) )\n            {\n                error=\"error reading CMAP chunk\";\n                goto done;\n            }\n\n            bytesloaded = size;\n            nbcolors = size / 3;\n        }\n\n        if ( !SDL_memcmp( id, \"CAMG\", 4 ) ) /* Amiga ViewMode  */\n        {\n            Uint32 viewmodes;\n            if ( !SDL_RWread( src, &viewmodes, sizeof(viewmodes), 1 ) )\n            {\n                error=\"error reading CAMG chunk\";\n                goto done;\n            }\n\n            bytesloaded = size;\n            viewmodes = SDL_SwapBE32( viewmodes );\n            if ( viewmodes & 0x0800 )\n                flagHAM = 1;\n            if ( viewmodes & 0x0080 )\n                flagEHB = 1;\n        }\n\n        if ( SDL_memcmp( id, \"BODY\", 4 ) )\n        {\n            if ( size & 1 ) ++size;     /* padding ! */\n            size -= bytesloaded;\n            /* skip the remaining bytes of this chunk */\n            if ( size ) SDL_RWseek( src, size, RW_SEEK_CUR );\n        }\n    }\n\n    /* compute some usefull values, based on the bitmap header */\n\n    width = ( bmhd.w + 15 ) & 0xFFFFFFF0;  /* Width in pixels modulo 16 */\n\n    bytesperline = ( ( bmhd.w + 15 ) / 16 ) * 2;\n\n    nbplanes = bmhd.planes;\n\n    if ( pbm )                         /* File format : 'Packed Bitmap' */\n    {\n        bytesperline *= 8;\n        nbplanes = 1;\n    }\n\n    stencil = (bmhd.mask & 1);   /* There is a mask ( 'stencil' ) */\n\n    /* Allocate memory for a temporary buffer ( used for\n           decompression/deinterleaving ) */\n\n    MiniBuf = (Uint8 *)SDL_malloc( bytesperline * (nbplanes + stencil) );\n    if ( MiniBuf == NULL )\n    {\n        error=\"no enough memory for temporary buffer\";\n        goto done;\n    }\n\n    if ( ( Image = SDL_CreateRGBSurface( SDL_SWSURFACE, width, bmhd.h, (bmhd.planes==24 || flagHAM==1)?24:8, 0, 0, 0, 0 ) ) == NULL )\n       goto done;\n\n    if ( bmhd.mask & 2 )               /* There is a transparent color */\n        SDL_SetColorKey( Image, SDL_TRUE, bmhd.tcolor );\n\n    /* Update palette informations */\n\n    /* There is no palette in 24 bits ILBM file */\n    if ( nbcolors>0 && flagHAM==0 )\n    {\n        /* FIXME: Should this include the stencil? See comment below */\n        int nbrcolorsfinal = 1 << (nbplanes + stencil);\n        ptr = &colormap[0];\n\n        for ( i=0; i<nbcolors; i++ )\n        {\n            Image->format->palette->colors[i].r = *ptr++;\n            Image->format->palette->colors[i].g = *ptr++;\n            Image->format->palette->colors[i].b = *ptr++;\n        }\n\n        /* Amiga EHB mode (Extra-Half-Bright) */\n        /* 6 bitplanes mode with a 32 colors palette */\n        /* The 32 last colors are the same but divided by 2 */\n        /* Some Amiga pictures save 64 colors with 32 last wrong colors, */\n        /* they shouldn't !, and here we overwrite these 32 bad colors. */\n        if ( (nbcolors==32 || flagEHB ) && (1<<bmhd.planes)==64 )\n        {\n            nbcolors = 64;\n            ptr = &colormap[0];\n            for ( i=32; i<64; i++ )\n            {\n                Image->format->palette->colors[i].r = (*ptr++)/2;\n                Image->format->palette->colors[i].g = (*ptr++)/2;\n                Image->format->palette->colors[i].b = (*ptr++)/2;\n            }\n        }\n\n        /* If nbcolors < 2^nbplanes, repeat the colormap */\n        /* This happens when pictures have a stencil mask */\n        if ( nbrcolorsfinal > (1<<bmhd.planes) ) {\n            nbrcolorsfinal = (1<<bmhd.planes);\n        }\n        for ( i=nbcolors; i < (Uint32)nbrcolorsfinal; i++ )\n        {\n            Image->format->palette->colors[i].r = Image->format->palette->colors[i%nbcolors].r;\n            Image->format->palette->colors[i].g = Image->format->palette->colors[i%nbcolors].g;\n            Image->format->palette->colors[i].b = Image->format->palette->colors[i%nbcolors].b;\n        }\n        if ( !pbm )\n            Image->format->palette->ncolors = nbrcolorsfinal;\n    }\n\n    /* Get the bitmap */\n\n    for ( h=0; h < bmhd.h; h++ )\n    {\n        /* uncompress the datas of each planes */\n\n        for ( plane=0; plane < (nbplanes+stencil); plane++ )\n        {\n            ptr = MiniBuf + ( plane * bytesperline );\n\n            remainingbytes = bytesperline;\n\n            if ( bmhd.tcomp == 1 )      /* Datas are compressed */\n            {\n                do\n                {\n                    if ( !SDL_RWread( src, &count, 1, 1 ) )\n                    {\n                        error=\"error reading BODY chunk\";\n                        goto done;\n                    }\n\n                    if ( count & 0x80 )\n                    {\n                        count ^= 0xFF;\n                        count += 2; /* now it */\n\n                        if ( ( count > remainingbytes ) || !SDL_RWread( src, &color, 1, 1 ) )\n                        {\n                            error=\"error reading BODY chunk\";\n                            goto done;\n                        }\n                        SDL_memset( ptr, color, count );\n                    }\n                    else\n                    {\n                        ++count;\n\n                        if ( ( count > remainingbytes ) || !SDL_RWread( src, ptr, count, 1 ) )\n                        {\n                           error=\"error reading BODY chunk\";\n                            goto done;\n                        }\n                    }\n\n                    ptr += count;\n                    remainingbytes -= count;\n\n                } while ( remainingbytes > 0 );\n            }\n            else\n            {\n                if ( !SDL_RWread( src, ptr, bytesperline, 1 ) )\n                {\n                    error=\"error reading BODY chunk\";\n                    goto done;\n                }\n            }\n        }\n\n        /* One line has been read, store it ! */\n\n        ptr = (Uint8 *)Image->pixels;\n        if ( nbplanes==24 || flagHAM==1 )\n            ptr += h * width * 3;\n        else\n            ptr += h * width;\n\n        if ( pbm )                 /* File format : 'Packed Bitmap' */\n        {\n           SDL_memcpy( ptr, MiniBuf, width );\n        }\n        else        /* We have to un-interlace the bits ! */\n        {\n            if ( nbplanes!=24 && flagHAM==0 )\n            {\n                size = ( width + 7 ) / 8;\n\n                for ( i=0; i < size; i++ )\n                {\n                    SDL_memset( ptr, 0, 8 );\n\n                    for ( plane=0; plane < (nbplanes + stencil); plane++ )\n                    {\n                        color = *( MiniBuf + i + ( plane * bytesperline ) );\n                        msk = 0x80;\n\n                        for ( j=0; j<8; j++ )\n                        {\n                            if ( ( plane + j ) <= 7 ) ptr[j] |= (Uint8)( color & msk ) >> ( 7 - plane - j );\n                            else                        ptr[j] |= (Uint8)( color & msk ) << ( plane + j - 7 );\n\n                            msk >>= 1;\n                        }\n                    }\n                    ptr += 8;\n                }\n            }\n            else\n            {\n                Uint32 finalcolor = 0;\n                size = ( width + 7 ) / 8;\n                /* 24 bitplanes ILBM : R0...R7,G0...G7,B0...B7 */\n                /* or HAM (6 bitplanes) or HAM8 (8 bitplanes) modes */\n                for ( i=0; i<width; i=i+8 )\n                {\n                    Uint8 maskBit = 0x80;\n                    for ( j=0; j<8; j++ )\n                    {\n                        Uint32 pixelcolor = 0;\n                        Uint32 maskColor = 1;\n                        Uint8 dataBody;\n                        for ( plane=0; plane < nbplanes; plane++ )\n                        {\n                            dataBody = MiniBuf[ plane*size+i/8 ];\n                            if ( dataBody&maskBit )\n                                pixelcolor = pixelcolor | maskColor;\n                            maskColor = maskColor<<1;\n                        }\n                        /* HAM : 12 bits RGB image (4 bits per color component) */\n                        /* HAM8 : 18 bits RGB image (6 bits per color component) */\n                        if ( flagHAM )\n                        {\n                            switch( pixelcolor>>(nbplanes-2) )\n                            {\n                                case 0: /* take direct color from palette */\n                                    finalcolor = colormap[ pixelcolor*3 ] + (colormap[ pixelcolor*3+1 ]<<8) + (colormap[ pixelcolor*3+2 ]<<16);\n                                    break;\n                                case 1: /* modify only blue component */\n                                    finalcolor = finalcolor&0x00FFFF;\n                                    finalcolor = finalcolor | (pixelcolor<<(16+(10-nbplanes)));\n                                    break;\n                                case 2: /* modify only red component */\n                                    finalcolor = finalcolor&0xFFFF00;\n                                    finalcolor = finalcolor | pixelcolor<<(10-nbplanes);\n                                    break;\n                                case 3: /* modify only green component */\n                                    finalcolor = finalcolor&0xFF00FF;\n                                    finalcolor = finalcolor | (pixelcolor<<(8+(10-nbplanes)));\n                                    break;\n                            }\n                        }\n                        else\n                        {\n                            finalcolor = pixelcolor;\n                        }\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n                            *ptr++ = (Uint8)(finalcolor>>16);\n                            *ptr++ = (Uint8)(finalcolor>>8);\n                            *ptr++ = (Uint8)(finalcolor);\n#else\n                            *ptr++ = (Uint8)(finalcolor);\n                            *ptr++ = (Uint8)(finalcolor>>8);\n                            *ptr++ = (Uint8)(finalcolor>>16);\n#endif\n                        maskBit = maskBit>>1;\n                    }\n                }\n            }\n        }\n    }\n\ndone:\n\n    if ( MiniBuf ) SDL_free( MiniBuf );\n\n    if ( error )\n    {\n        SDL_RWseek(src, start, RW_SEEK_SET);\n        if ( Image ) {\n            SDL_FreeSurface( Image );\n            Image = NULL;\n        }\n        IMG_SetError( \"%s\", error );\n    }\n\n    return( Image );\n}\n\n#else /* LOAD_LBM */\n\n/* See if an image is contained in a data source */\nint IMG_isLBM(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load an IFF type image from an SDL datasource */\nSDL_Surface *IMG_LoadLBM_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_LBM */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_pcx.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n * PCX file reader:\n * Supports:\n *  1..4 bits/pixel in multiplanar format (1 bit/plane/pixel)\n *  8 bits/pixel in single-planar format (8 bits/plane/pixel)\n *  24 bits/pixel in 3-plane format (8 bits/plane/pixel)\n *\n * (The <8bpp formats are expanded to 8bpp surfaces)\n *\n * Doesn't support:\n *  single-planar packed-pixel formats other than 8bpp\n *  4-plane 32bpp format with a fourth \"intensity\" plane\n */\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"SDL_endian.h\"\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_PCX\n\nstruct PCXheader {\n    Uint8 Manufacturer;\n    Uint8 Version;\n    Uint8 Encoding;\n    Uint8 BitsPerPixel;\n    Sint16 Xmin, Ymin, Xmax, Ymax;\n    Sint16 HDpi, VDpi;\n    Uint8 Colormap[48];\n    Uint8 Reserved;\n    Uint8 NPlanes;\n    Sint16 BytesPerLine;\n    Sint16 PaletteInfo;\n    Sint16 HscreenSize;\n    Sint16 VscreenSize;\n    Uint8 Filler[54];\n};\n\n/* See if an image is contained in a data source */\nint IMG_isPCX(SDL_RWops *src)\n{\n    Sint64 start;\n    int is_PCX;\n    const int ZSoft_Manufacturer = 10;\n    const int PC_Paintbrush_Version = 5;\n    const int PCX_Uncompressed_Encoding = 0;\n    const int PCX_RunLength_Encoding = 1;\n    struct PCXheader pcxh;\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_PCX = 0;\n    if ( SDL_RWread(src, &pcxh, sizeof(pcxh), 1) == 1 ) {\n        if ( (pcxh.Manufacturer == ZSoft_Manufacturer) &&\n             (pcxh.Version == PC_Paintbrush_Version) &&\n             (pcxh.Encoding == PCX_RunLength_Encoding ||\n              pcxh.Encoding == PCX_Uncompressed_Encoding) ) {\n            is_PCX = 1;\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_PCX);\n}\n\n/* Load a PCX type image from an SDL datasource */\nSDL_Surface *IMG_LoadPCX_RW(SDL_RWops *src)\n{\n    Sint64 start;\n    struct PCXheader pcxh;\n    Uint32 Rmask;\n    Uint32 Gmask;\n    Uint32 Bmask;\n    Uint32 Amask;\n    SDL_Surface *surface = NULL;\n    int width, height;\n    int y, bpl;\n    Uint8 *row, *buf = NULL;\n    char *error = NULL;\n    int bits, src_bits;\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    if ( ! SDL_RWread(src, &pcxh, sizeof(pcxh), 1) ) {\n        error = \"file truncated\";\n        goto done;\n    }\n    pcxh.Xmin = SDL_SwapLE16(pcxh.Xmin);\n    pcxh.Ymin = SDL_SwapLE16(pcxh.Ymin);\n    pcxh.Xmax = SDL_SwapLE16(pcxh.Xmax);\n    pcxh.Ymax = SDL_SwapLE16(pcxh.Ymax);\n    pcxh.BytesPerLine = SDL_SwapLE16(pcxh.BytesPerLine);\n\n    /* Create the surface of the appropriate type */\n    width = (pcxh.Xmax - pcxh.Xmin) + 1;\n    height = (pcxh.Ymax - pcxh.Ymin) + 1;\n    Rmask = Gmask = Bmask = Amask = 0;\n    src_bits = pcxh.BitsPerPixel * pcxh.NPlanes;\n    if((pcxh.BitsPerPixel == 1 && pcxh.NPlanes >= 1 && pcxh.NPlanes <= 4)\n       || (pcxh.BitsPerPixel == 8 && pcxh.NPlanes == 1)) {\n        bits = 8;\n    } else if(pcxh.BitsPerPixel == 8 && pcxh.NPlanes == 3) {\n        bits = 24;\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n            Rmask = 0x000000FF;\n            Gmask = 0x0000FF00;\n            Bmask = 0x00FF0000;\n#else\n            Rmask = 0xFF0000;\n            Gmask = 0x00FF00;\n            Bmask = 0x0000FF;\n#endif\n    } else {\n        error = \"unsupported PCX format\";\n        goto done;\n    }\n    surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height,\n                   bits, Rmask, Gmask, Bmask, Amask);\n    if ( surface == NULL )\n        goto done;\n\n    bpl = pcxh.NPlanes * pcxh.BytesPerLine;\n    if (bpl > surface->pitch) {\n        error = \"bytes per line is too large (corrupt?)\";\n    }\n    buf = (Uint8 *)SDL_malloc(bpl);\n    row = (Uint8 *)surface->pixels;\n    for ( y=0; y<surface->h; ++y ) {\n        /* decode a scan line to a temporary buffer first */\n        int i, count = 0;\n        Uint8 ch;\n        Uint8 *dst = (src_bits == 8) ? row : buf;\n        if ( pcxh.Encoding == 0 ) {\n            if(!SDL_RWread(src, dst, bpl, 1)) {\n                error = \"file truncated\";\n                goto done;\n            }\n        } else {\n            for(i = 0; i < bpl; i++) {\n                if(!count) {\n                    if(!SDL_RWread(src, &ch, 1, 1)) {\n                        error = \"file truncated\";\n                        goto done;\n                    }\n                    if( (ch & 0xc0) == 0xc0) {\n                        count = ch & 0x3f;\n                        if(!SDL_RWread(src, &ch, 1, 1)) {\n                            error = \"file truncated\";\n                            goto done;\n                        }\n                    } else\n                        count = 1;\n                }\n                dst[i] = ch;\n                count--;\n            }\n        }\n\n        if(src_bits <= 4) {\n            /* expand planes to 1 byte/pixel */\n            Uint8 *innerSrc = buf;\n            int plane;\n            for(plane = 0; plane < pcxh.NPlanes; plane++) {\n                int j, k, x = 0;\n                for(j = 0; j < pcxh.BytesPerLine; j++) {\n                    Uint8 byte = *innerSrc++;\n                    for(k = 7; k >= 0; k--) {\n                        unsigned bit = (byte >> k) & 1;\n                        /* skip padding bits */\n                        if (j * 8 + k >= width)\n                            continue;\n                        row[x++] |= bit << plane;\n                    }\n                }\n            }\n        } else if(src_bits == 24) {\n            /* de-interlace planes */\n            Uint8 *innerSrc = buf;\n            int plane;\n            for(plane = 0; plane < pcxh.NPlanes; plane++) {\n                int x;\n                dst = row + plane;\n                for(x = 0; x < width; x++) {\n                    *dst = *innerSrc++;\n                    dst += pcxh.NPlanes;\n                }\n            }\n        }\n\n        row += surface->pitch;\n    }\n\n    if(bits == 8) {\n        SDL_Color *colors = surface->format->palette->colors;\n        int nc = 1 << src_bits;\n        int i;\n\n        surface->format->palette->ncolors = nc;\n        if(src_bits == 8) {\n            Uint8 ch;\n            /* look for a 256-colour palette */\n            do {\n                if ( !SDL_RWread(src, &ch, 1, 1)) {\n                    error = \"file truncated\";\n                    goto done;\n                }\n            } while ( ch != 12 );\n\n            for(i = 0; i < 256; i++) {\n                SDL_RWread(src, &colors[i].r, 1, 1);\n                SDL_RWread(src, &colors[i].g, 1, 1);\n                SDL_RWread(src, &colors[i].b, 1, 1);\n            }\n        } else {\n            for(i = 0; i < nc; i++) {\n                colors[i].r = pcxh.Colormap[i * 3];\n                colors[i].g = pcxh.Colormap[i * 3 + 1];\n                colors[i].b = pcxh.Colormap[i * 3 + 2];\n            }\n        }\n    }\n\ndone:\n    SDL_free(buf);\n    if ( error ) {\n        SDL_RWseek(src, start, RW_SEEK_SET);\n        if ( surface ) {\n            SDL_FreeSurface(surface);\n            surface = NULL;\n        }\n        IMG_SetError(\"%s\", error);\n    }\n    return(surface);\n}\n\n#else\n\n/* See if an image is contained in a data source */\nint IMG_isPCX(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a PCX type image from an SDL datasource */\nSDL_Surface *IMG_LoadPCX_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_PCX */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_png.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* This is a PNG image file loading framework */\n\n#include \"SDL_image.h\"\n\n#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)\n\n#ifdef LOAD_PNG\n\n/*=============================================================================\n        File: SDL_png.c\n     Purpose: A PNG loader and saver for the SDL library\n    Revision:\n  Created by: Philippe Lavoie          (2 November 1998)\n              lavoie@zeus.genie.uottawa.ca\n Modified by:\n\n Copyright notice:\n          Copyright (C) 1998 Philippe Lavoie\n\n          This library is free software; you can redistribute it and/or\n          modify it under the terms of the GNU Library General Public\n          License as published by the Free Software Foundation; either\n          version 2 of the License, or (at your option) any later version.\n\n          This library is distributed in the hope that it will be useful,\n          but WITHOUT ANY WARRANTY; without even the implied warranty of\n          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n          Library General Public License for more details.\n\n          You should have received a copy of the GNU Library General Public\n          License along with this library; if not, write to the Free\n          Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n    Comments: The load and save routine are basically the ones you can find\n             in the example.c file from the libpng distribution.\n\n  Changes:\n    5/17/99 - Modified to use the new SDL data sources - Sam Lantinga\n\n=============================================================================*/\n\n#include \"SDL_endian.h\"\n\n#ifdef macintosh\n#define MACOS\n#endif\n#include <png.h>\n\n/* Check for the older version of libpng */\n#if (PNG_LIBPNG_VER_MAJOR == 1) \n#if (PNG_LIBPNG_VER_MINOR < 5)\n#define LIBPNG_VERSION_12\ntypedef png_bytep png_const_bytep;\n#endif\n#if (PNG_LIBPNG_VER_MINOR < 6)\ntypedef png_structp png_const_structrp;\ntypedef png_infop png_const_inforp;\n#endif\n#endif\n\nstatic struct {\n    int loaded;\n    void *handle;\n    png_infop (*png_create_info_struct) (png_const_structrp png_ptr);\n    png_structp (*png_create_read_struct) (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn);\n    void (*png_destroy_read_struct) (png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr);\n    png_uint_32 (*png_get_IHDR) (png_const_structrp png_ptr, png_const_inforp info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_method, int *compression_method, int *filter_method);\n    png_voidp (*png_get_io_ptr) (png_const_structrp png_ptr);\n    png_byte (*png_get_channels) (png_const_structrp png_ptr, png_const_inforp info_ptr);\n    png_uint_32 (*png_get_PLTE) (png_const_structrp png_ptr, png_infop info_ptr, png_colorp *palette, int *num_palette);\n    png_uint_32 (*png_get_tRNS) (png_const_structrp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values);\n    png_uint_32 (*png_get_valid) (png_const_structrp png_ptr, png_const_inforp info_ptr, png_uint_32 flag);\n    void (*png_read_image) (png_structp png_ptr, png_bytepp image);\n    void (*png_read_info) (png_structp png_ptr, png_infop info_ptr);\n    void (*png_read_update_info) (png_structp png_ptr, png_infop info_ptr);\n    void (*png_set_expand) (png_structp png_ptr);\n    void (*png_set_gray_to_rgb) (png_structp png_ptr);\n    void (*png_set_packing) (png_structp png_ptr);\n    void (*png_set_read_fn) (png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn);\n    void (*png_set_strip_16) (png_structp png_ptr);\n    int (*png_sig_cmp) (png_const_bytep sig, png_size_t start, png_size_t num_to_check);\n#ifndef LIBPNG_VERSION_12\n    jmp_buf* (*png_set_longjmp_fn) (png_structp, png_longjmp_ptr, size_t);\n#endif\n} lib;\n\n#ifdef LOAD_PNG_DYNAMIC\nint IMG_InitPNG()\n{\n    if ( lib.loaded == 0 ) {\n        lib.handle = SDL_LoadObject(LOAD_PNG_DYNAMIC);\n        if ( lib.handle == NULL ) {\n            return -1;\n        }\n        lib.png_create_info_struct =\n            (png_infop (*) (png_const_structrp))\n            SDL_LoadFunction(lib.handle, \"png_create_info_struct\");\n        if ( lib.png_create_info_struct == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_create_read_struct =\n            (png_structp (*) (png_const_charp, png_voidp, png_error_ptr, png_error_ptr))\n            SDL_LoadFunction(lib.handle, \"png_create_read_struct\");\n        if ( lib.png_create_read_struct == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_destroy_read_struct =\n            (void (*) (png_structpp, png_infopp, png_infopp))\n            SDL_LoadFunction(lib.handle, \"png_destroy_read_struct\");\n        if ( lib.png_destroy_read_struct == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_get_IHDR =\n            (png_uint_32 (*) (png_const_structrp, png_const_inforp, png_uint_32 *, png_uint_32 *, int *, int *, int *, int *, int *))\n            SDL_LoadFunction(lib.handle, \"png_get_IHDR\");\n        if ( lib.png_get_IHDR == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_get_channels =\n            (png_byte (*) (png_const_structrp, png_const_inforp))\n            SDL_LoadFunction(lib.handle, \"png_get_channels\");\n        if ( lib.png_get_channels == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_get_io_ptr =\n            (png_voidp (*) (png_const_structrp))\n            SDL_LoadFunction(lib.handle, \"png_get_io_ptr\");\n        if ( lib.png_get_io_ptr == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_get_PLTE =\n            (png_uint_32 (*) (png_const_structrp, png_infop, png_colorp *, int *))\n            SDL_LoadFunction(lib.handle, \"png_get_PLTE\");\n        if ( lib.png_get_PLTE == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_get_tRNS =\n            (png_uint_32 (*) (png_const_structrp, png_infop, png_bytep *, int *, png_color_16p *))\n            SDL_LoadFunction(lib.handle, \"png_get_tRNS\");\n        if ( lib.png_get_tRNS == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_get_valid =\n            (png_uint_32 (*) (png_const_structrp, png_const_inforp, png_uint_32))\n            SDL_LoadFunction(lib.handle, \"png_get_valid\");\n        if ( lib.png_get_valid == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_read_image =\n            (void (*) (png_structp, png_bytepp))\n            SDL_LoadFunction(lib.handle, \"png_read_image\");\n        if ( lib.png_read_image == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_read_info =\n            (void (*) (png_structp, png_infop))\n            SDL_LoadFunction(lib.handle, \"png_read_info\");\n        if ( lib.png_read_info == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_read_update_info =\n            (void (*) (png_structp, png_infop))\n            SDL_LoadFunction(lib.handle, \"png_read_update_info\");\n        if ( lib.png_read_update_info == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_set_expand =\n            (void (*) (png_structp))\n            SDL_LoadFunction(lib.handle, \"png_set_expand\");\n        if ( lib.png_set_expand == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_set_gray_to_rgb =\n            (void (*) (png_structp))\n            SDL_LoadFunction(lib.handle, \"png_set_gray_to_rgb\");\n        if ( lib.png_set_gray_to_rgb == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_set_packing =\n            (void (*) (png_structp))\n            SDL_LoadFunction(lib.handle, \"png_set_packing\");\n        if ( lib.png_set_packing == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_set_read_fn =\n            (void (*) (png_structp, png_voidp, png_rw_ptr))\n            SDL_LoadFunction(lib.handle, \"png_set_read_fn\");\n        if ( lib.png_set_read_fn == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_set_strip_16 =\n            (void (*) (png_structp))\n            SDL_LoadFunction(lib.handle, \"png_set_strip_16\");\n        if ( lib.png_set_strip_16 == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.png_sig_cmp =\n            (int (*) (png_const_bytep, png_size_t, png_size_t))\n            SDL_LoadFunction(lib.handle, \"png_sig_cmp\");\n        if ( lib.png_sig_cmp == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n#ifndef LIBPNG_VERSION_12\n        lib.png_set_longjmp_fn =\n            (jmp_buf * (*) (png_structp, png_longjmp_ptr, size_t))\n            SDL_LoadFunction(lib.handle, \"png_set_longjmp_fn\");\n        if ( lib.png_set_longjmp_fn == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n#endif\n    }\n    ++lib.loaded;\n\n    return 0;\n}\nvoid IMG_QuitPNG()\n{\n    if ( lib.loaded == 0 ) {\n        return;\n    }\n    if ( lib.loaded == 1 ) {\n        SDL_UnloadObject(lib.handle);\n    }\n    --lib.loaded;\n}\n#else\nint IMG_InitPNG()\n{\n    if ( lib.loaded == 0 ) {\n        lib.png_create_info_struct = png_create_info_struct;\n        lib.png_create_read_struct = png_create_read_struct;\n        lib.png_destroy_read_struct = png_destroy_read_struct;\n        lib.png_get_IHDR = png_get_IHDR;\n        lib.png_get_channels = png_get_channels;\n        lib.png_get_io_ptr = png_get_io_ptr;\n        lib.png_get_PLTE = png_get_PLTE;\n        lib.png_get_tRNS = png_get_tRNS;\n        lib.png_get_valid = png_get_valid;\n        lib.png_read_image = png_read_image;\n        lib.png_read_info = png_read_info;\n        lib.png_read_update_info = png_read_update_info;\n        lib.png_set_expand = png_set_expand;\n        lib.png_set_gray_to_rgb = png_set_gray_to_rgb;\n        lib.png_set_packing = png_set_packing;\n        lib.png_set_read_fn = png_set_read_fn;\n        lib.png_set_strip_16 = png_set_strip_16;\n        lib.png_sig_cmp = png_sig_cmp;\n#ifndef LIBPNG_VERSION_12\n        lib.png_set_longjmp_fn = png_set_longjmp_fn;\n#endif\n    }\n    ++lib.loaded;\n\n    return 0;\n}\nvoid IMG_QuitPNG()\n{\n    if ( lib.loaded == 0 ) {\n        return;\n    }\n    if ( lib.loaded == 1 ) {\n    }\n    --lib.loaded;\n}\n#endif /* LOAD_PNG_DYNAMIC */\n\n/* See if an image is contained in a data source */\nint IMG_isPNG(SDL_RWops *src)\n{\n    Sint64 start;\n    int is_PNG;\n    Uint8 magic[4];\n\n    if ( !src ) {\n        return 0;\n    }\n\n    start = SDL_RWtell(src);\n    is_PNG = 0;\n    if ( SDL_RWread(src, magic, 1, sizeof(magic)) == sizeof(magic) ) {\n        if ( magic[0] == 0x89 &&\n             magic[1] == 'P' &&\n             magic[2] == 'N' &&\n             magic[3] == 'G' ) {\n            is_PNG = 1;\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_PNG);\n}\n\n/* Load a PNG type image from an SDL datasource */\nstatic void png_read_data(png_structp ctx, png_bytep area, png_size_t size)\n{\n    SDL_RWops *src;\n\n    src = (SDL_RWops *)lib.png_get_io_ptr(ctx);\n    SDL_RWread(src, area, size, 1);\n}\nSDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src)\n{\n    Sint64 start;\n    const char *error;\n    SDL_Surface *volatile surface;\n    png_structp png_ptr;\n    png_infop info_ptr;\n    png_uint_32 width, height;\n    int bit_depth, color_type, interlace_type, num_channels;\n    Uint32 Rmask;\n    Uint32 Gmask;\n    Uint32 Bmask;\n    Uint32 Amask;\n    SDL_Palette *palette;\n    png_bytep *volatile row_pointers;\n    int row, i;\n    int ckey = -1;\n    png_color_16 *transv;\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    if ( !IMG_Init(IMG_INIT_PNG) ) {\n        return NULL;\n    }\n\n    /* Initialize the data we will clean up when we're done */\n    error = NULL;\n    png_ptr = NULL; info_ptr = NULL; row_pointers = NULL; surface = NULL;\n\n    /* Create the PNG loading context structure */\n    png_ptr = lib.png_create_read_struct(PNG_LIBPNG_VER_STRING,\n                      NULL,NULL,NULL);\n    if (png_ptr == NULL){\n        error = \"Couldn't allocate memory for PNG file or incompatible PNG dll\";\n        goto done;\n    }\n\n     /* Allocate/initialize the memory for image information.  REQUIRED. */\n    info_ptr = lib.png_create_info_struct(png_ptr);\n    if (info_ptr == NULL) {\n        error = \"Couldn't create image information for PNG file\";\n        goto done;\n    }\n\n    /* Set error handling if you are using setjmp/longjmp method (this is\n     * the normal method of doing things with libpng).  REQUIRED unless you\n     * set up your own error handlers in png_create_read_struct() earlier.\n     */\n#ifndef LIBPNG_VERSION_12\n    if ( setjmp(*lib.png_set_longjmp_fn(png_ptr, longjmp, sizeof (jmp_buf))) )\n#else\n    if ( setjmp(png_ptr->jmpbuf) )\n#endif\n    {\n        error = \"Error reading the PNG file.\";\n        goto done;\n    }\n\n    /* Set up the input control */\n    lib.png_set_read_fn(png_ptr, src, png_read_data);\n\n    /* Read PNG header info */\n    lib.png_read_info(png_ptr, info_ptr);\n    lib.png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,\n            &color_type, &interlace_type, NULL, NULL);\n\n    /* tell libpng to strip 16 bit/color files down to 8 bits/color */\n    lib.png_set_strip_16(png_ptr) ;\n\n    /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single\n     * byte into separate bytes (useful for paletted and grayscale images).\n     */\n    lib.png_set_packing(png_ptr);\n\n    /* scale greyscale values to the range 0..255 */\n    if (color_type == PNG_COLOR_TYPE_GRAY)\n        lib.png_set_expand(png_ptr);\n\n    /* For images with a single \"transparent colour\", set colour key;\n       if more than one index has transparency, or if partially transparent\n       entries exist, use full alpha channel */\n    if (lib.png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {\n        int num_trans;\n        Uint8 *trans;\n        lib.png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, &transv);\n        if (color_type == PNG_COLOR_TYPE_PALETTE) {\n            /* Check if all tRNS entries are opaque except one */\n            int j, t = -1;\n            for (j = 0; j < num_trans; j++) {\n                if (trans[j] == 0) {\n                    if (t >= 0) {\n                        break;\n                    }\n                    t = j;\n                } else if (trans[j] != 255) {\n                    break;\n                }\n            }\n            if (j == num_trans) {\n                /* exactly one transparent index */\n                ckey = t;\n            } else {\n                /* more than one transparent index, or translucency */\n                lib.png_set_expand(png_ptr);\n            }\n        } else {\n            ckey = 0; /* actual value will be set later */\n        }\n    }\n\n    if ( color_type == PNG_COLOR_TYPE_GRAY_ALPHA )\n        lib.png_set_gray_to_rgb(png_ptr);\n\n    lib.png_read_update_info(png_ptr, info_ptr);\n\n    lib.png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,\n            &color_type, &interlace_type, NULL, NULL);\n\n    /* Allocate the SDL surface to hold the image */\n    Rmask = Gmask = Bmask = Amask = 0 ;\n    num_channels = lib.png_get_channels(png_ptr, info_ptr);\n    if ( num_channels >= 3 ) {\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n        Rmask = 0x000000FF;\n        Gmask = 0x0000FF00;\n        Bmask = 0x00FF0000;\n        Amask = (num_channels == 4) ? 0xFF000000 : 0;\n#else\n        int s = (num_channels == 4) ? 0 : 8;\n        Rmask = 0xFF000000 >> s;\n        Gmask = 0x00FF0000 >> s;\n        Bmask = 0x0000FF00 >> s;\n        Amask = 0x000000FF >> s;\n#endif\n    }\n    surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height,\n            bit_depth*num_channels, Rmask,Gmask,Bmask,Amask);\n    if ( surface == NULL ) {\n        error = SDL_GetError();\n        goto done;\n    }\n\n    if (ckey != -1) {\n        if (color_type != PNG_COLOR_TYPE_PALETTE) {\n            /* FIXME: Should these be truncated or shifted down? */\n            ckey = SDL_MapRGB(surface->format,\n                         (Uint8)transv->red,\n                         (Uint8)transv->green,\n                         (Uint8)transv->blue);\n        }\n        SDL_SetColorKey(surface, SDL_TRUE, ckey);\n    }\n\n    /* Create the array of pointers to image data */\n    row_pointers = (png_bytep*) SDL_malloc(sizeof(png_bytep)*height);\n    if (!row_pointers) {\n        error = \"Out of memory\";\n        goto done;\n    }\n    for (row = 0; row < (int)height; row++) {\n        row_pointers[row] = (png_bytep)\n                (Uint8 *)surface->pixels + row*surface->pitch;\n    }\n\n    /* Read the entire image in one go */\n    lib.png_read_image(png_ptr, row_pointers);\n\n    /* and we're done!  (png_read_end() can be omitted if no processing of\n     * post-IDAT text/time/etc. is desired)\n     * In some cases it can't read PNG's created by some popular programs (ACDSEE),\n     * we do not want to process comments, so we omit png_read_end\n\n    lib.png_read_end(png_ptr, info_ptr);\n    */\n\n    /* Load the palette, if any */\n    palette = surface->format->palette;\n    if ( palette ) {\n        int png_num_palette;\n        png_colorp png_palette;\n        lib.png_get_PLTE(png_ptr, info_ptr, &png_palette, &png_num_palette);\n        if (color_type == PNG_COLOR_TYPE_GRAY) {\n            palette->ncolors = 256;\n            for (i = 0; i < 256; i++) {\n                palette->colors[i].r = i;\n                palette->colors[i].g = i;\n                palette->colors[i].b = i;\n            }\n        } else if (png_num_palette > 0 ) {\n            palette->ncolors = png_num_palette;\n            for ( i=0; i<png_num_palette; ++i ) {\n                palette->colors[i].b = png_palette[i].blue;\n                palette->colors[i].g = png_palette[i].green;\n                palette->colors[i].r = png_palette[i].red;\n            }\n        }\n    }\n\ndone:   /* Clean up and return */\n    if ( png_ptr ) {\n        lib.png_destroy_read_struct(&png_ptr,\n                                info_ptr ? &info_ptr : (png_infopp)0,\n                                (png_infopp)0);\n    }\n    if ( row_pointers ) {\n        SDL_free(row_pointers);\n    }\n    if ( error ) {\n        SDL_RWseek(src, start, RW_SEEK_SET);\n        if ( surface ) {\n            SDL_FreeSurface(surface);\n            surface = NULL;\n        }\n        IMG_SetError(\"%s\", error);\n    }\n    return(surface);\n}\n\n#else\n\nint IMG_InitPNG()\n{\n    IMG_SetError(\"PNG images are not supported\");\n    return(-1);\n}\n\nvoid IMG_QuitPNG()\n{\n}\n\n/* See if an image is contained in a data source */\nint IMG_isPNG(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a PNG type image from an SDL datasource */\nSDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_PNG */\n\n#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */\n\n/* We'll always have PNG save support */\n#define SAVE_PNG\n\n#ifdef SAVE_PNG\n\n#include \"miniz.h\"\n\nint IMG_SavePNG(SDL_Surface *surface, const char *file)\n{\n    SDL_RWops *dst = SDL_RWFromFile(file, \"wb\");\n    if (dst) {\n        return IMG_SavePNG_RW(surface, dst, 1);\n    } else {\n        return -1;\n    }\n}\n\nint IMG_SavePNG_RW(SDL_Surface *surface, SDL_RWops *dst, int freedst)\n{\n    int result = -1;\n\n    if (dst) {\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n        static const Uint32 png_format = SDL_PIXELFORMAT_ABGR8888;\n#else\n        static const Uint32 png_format = SDL_PIXELFORMAT_RGBA8888;\n#endif\n        size_t size;\n        void *png = NULL;\n\n        if (surface->format->format == png_format) {\n            png = tdefl_write_image_to_png_file_in_memory(surface->pixels, surface->w, surface->h, surface->format->BytesPerPixel, surface->pitch, &size);\n        } else {\n            SDL_Surface *cvt = SDL_ConvertSurfaceFormat(surface, png_format, 0);\n            if (cvt) {\n                png = tdefl_write_image_to_png_file_in_memory(cvt->pixels, cvt->w, cvt->h, cvt->format->BytesPerPixel, cvt->pitch, &size);\n                SDL_FreeSurface(cvt);\n            }\n        }\n        if (png) {\n            if (SDL_RWwrite(dst, png, size, 1)) {\n                result = 0;\n            }\n            SDL_free(png);\n        } else {\n            SDL_SetError(\"Failed to convert and save image\");\n        }\n        if (freedst) {\n            SDL_RWclose(dst);\n        }\n    } else {\n        SDL_SetError(\"Passed NULL dst\");\n    }\n    return result;\n}\n\n#endif /* SAVE_PNG */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_pnm.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n * PNM (portable anymap) image loader:\n *\n * Supports: PBM, PGM and PPM, ASCII and binary formats\n * (PBM and PGM are loaded as 8bpp surfaces)\n * Does not support: maximum component value > 255\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <ctype.h>\n#include <string.h>\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_PNM\n\n/* See if an image is contained in a data source */\nint IMG_isPNM(SDL_RWops *src)\n{\n    Sint64 start;\n    int is_PNM;\n    char magic[2];\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_PNM = 0;\n    if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {\n        /*\n         * PNM magic signatures:\n         * P1   PBM, ascii format\n         * P2   PGM, ascii format\n         * P3   PPM, ascii format\n         * P4   PBM, binary format\n         * P5   PGM, binary format\n         * P6   PPM, binary format\n         * P7   PAM, a general wrapper for PNM data\n         */\n        if ( magic[0] == 'P' && magic[1] >= '1' && magic[1] <= '6' ) {\n            is_PNM = 1;\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_PNM);\n}\n\n/* read a non-negative integer from the source. return -1 upon error */\nstatic int ReadNumber(SDL_RWops *src)\n{\n    int number;\n    unsigned char ch;\n\n    /* Initialize return value */\n    number = 0;\n\n    /* Skip leading whitespace */\n    do {\n        if ( ! SDL_RWread(src, &ch, 1, 1) ) {\n            return(0);\n        }\n        /* Eat comments as whitespace */\n        if ( ch == '#' ) {  /* Comment is '#' to end of line */\n            do {\n                if ( ! SDL_RWread(src, &ch, 1, 1) ) {\n                    return -1;\n                }\n            } while ( (ch != '\\r') && (ch != '\\n') );\n        }\n    } while ( SDL_isspace(ch) );\n\n    /* Add up the number */\n    do {\n        number *= 10;\n        number += ch-'0';\n\n        if ( !SDL_RWread(src, &ch, 1, 1) ) {\n            return -1;\n        }\n    } while ( SDL_isdigit(ch) );\n\n    return(number);\n}\n\nSDL_Surface *IMG_LoadPNM_RW(SDL_RWops *src)\n{\n    Sint64 start;\n    SDL_Surface *surface = NULL;\n    int width, height;\n    int maxval, y, bpl;\n    Uint8 *row;\n    Uint8 *buf = NULL;\n    char *error = NULL;\n    Uint8 magic[2];\n    int ascii;\n    enum { PBM, PGM, PPM, PAM } kind;\n\n#define ERROR(s) do { error = (s); goto done; } while(0)\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    SDL_RWread(src, magic, 2, 1);\n    kind = magic[1] - '1';\n    ascii = 1;\n    if(kind >= 3) {\n        ascii = 0;\n        kind -= 3;\n    }\n\n    width = ReadNumber(src);\n    height = ReadNumber(src);\n    if(width <= 0 || height <= 0)\n        ERROR(\"Unable to read image width and height\");\n\n    if(kind != PBM) {\n        maxval = ReadNumber(src);\n        if(maxval <= 0 || maxval > 255)\n            ERROR(\"unsupported PNM format\");\n    } else\n        maxval = 255;   /* never scale PBMs */\n\n    /* binary PNM allows just a single character of whitespace after\n       the last parameter, and we've already consumed it */\n\n    if(kind == PPM) {\n        /* 24-bit surface in R,G,B byte order */\n        surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 24,\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n                       0x000000ff, 0x0000ff00, 0x00ff0000,\n#else\n                       0x00ff0000, 0x0000ff00, 0x000000ff,\n#endif\n                       0);\n    } else {\n        /* load PBM/PGM as 8-bit indexed images */\n        surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 8,\n                       0, 0, 0, 0);\n    }\n    if ( surface == NULL )\n        ERROR(\"Out of memory\");\n    bpl = width * surface->format->BytesPerPixel;\n    if(kind == PGM) {\n        SDL_Color *c = surface->format->palette->colors;\n        int i;\n        for(i = 0; i < 256; i++)\n            c[i].r = c[i].g = c[i].b = i;\n        surface->format->palette->ncolors = 256;\n    } else if(kind == PBM) {\n        /* for some reason PBM has 1=black, 0=white */\n        SDL_Color *c = surface->format->palette->colors;\n        c[0].r = c[0].g = c[0].b = 255;\n        c[1].r = c[1].g = c[1].b = 0;\n        surface->format->palette->ncolors = 2;\n        bpl = (width + 7) >> 3;\n        buf = (Uint8 *)SDL_malloc(bpl);\n        if(buf == NULL)\n            ERROR(\"Out of memory\");\n    }\n\n    /* Read the image into the surface */\n    row = (Uint8 *)surface->pixels;\n    for(y = 0; y < height; y++) {\n        if(ascii) {\n            int i;\n            if(kind == PBM) {\n                for(i = 0; i < width; i++) {\n                    Uint8 ch;\n                    do {\n                        if(!SDL_RWread(src, &ch,\n                                   1, 1))\n                               ERROR(\"file truncated\");\n                        ch -= '0';\n                    } while(ch > 1);\n                    row[i] = ch;\n                }\n            } else {\n                for(i = 0; i < bpl; i++) {\n                    int c;\n                    c = ReadNumber(src);\n                    if(c < 0)\n                        ERROR(\"file truncated\");\n                    row[i] = c;\n                }\n            }\n        } else {\n            Uint8 *dst = (kind == PBM) ? buf : row;\n            if(!SDL_RWread(src, dst, bpl, 1))\n                ERROR(\"file truncated\");\n            if(kind == PBM) {\n                /* expand bitmap to 8bpp */\n                int i;\n                for(i = 0; i < width; i++) {\n                    int bit = 7 - (i & 7);\n                    row[i] = (buf[i >> 3] >> bit) & 1;\n                }\n            }\n        }\n        if(maxval < 255) {\n            /* scale up to full dynamic range (slow) */\n            int i;\n            for(i = 0; i < bpl; i++)\n                row[i] = row[i] * 255 / maxval;\n        }\n        row += surface->pitch;\n    }\ndone:\n    SDL_free(buf);\n    if(error) {\n        SDL_RWseek(src, start, RW_SEEK_SET);\n        if ( surface ) {\n            SDL_FreeSurface(surface);\n            surface = NULL;\n        }\n        IMG_SetError(\"%s\", error);\n    }\n    return(surface);\n}\n\n#else\n\n/* See if an image is contained in a data source */\nint IMG_isPNM(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a PNM type image from an SDL datasource */\nSDL_Surface *IMG_LoadPNM_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_PNM */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_tga.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)\n\n/* This is a Targa image file loading framework */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"SDL_endian.h\"\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_TGA\n\n/*\n * A TGA loader for the SDL library\n * Supports: Reading 8, 15, 16, 24 and 32bpp images, with alpha or colourkey,\n *           uncompressed or RLE encoded.\n *\n * 2000-06-10 Mattias Engdegrd <f91-men@nada.kth.se>: initial version\n * 2000-06-26 Mattias Engdegrd <f91-men@nada.kth.se>: read greyscale TGAs\n * 2000-08-09 Mattias Engdegrd <f91-men@nada.kth.se>: alpha inversion removed\n */\n\nstruct TGAheader {\n    Uint8 infolen;      /* length of info field */\n    Uint8 has_cmap;     /* 1 if image has colormap, 0 otherwise */\n    Uint8 type;\n\n    Uint8 cmap_start[2];    /* index of first colormap entry */\n    Uint8 cmap_len[2];      /* number of entries in colormap */\n    Uint8 cmap_bits;        /* bits per colormap entry */\n\n    Uint8 yorigin[2];       /* image origin (ignored here) */\n    Uint8 xorigin[2];\n    Uint8 width[2];     /* image size */\n    Uint8 height[2];\n    Uint8 pixel_bits;       /* bits/pixel */\n    Uint8 flags;\n};\n\nenum tga_type {\n    TGA_TYPE_INDEXED = 1,\n    TGA_TYPE_RGB = 2,\n    TGA_TYPE_BW = 3,\n    TGA_TYPE_RLE_INDEXED = 9,\n    TGA_TYPE_RLE_RGB = 10,\n    TGA_TYPE_RLE_BW = 11\n};\n\n#define TGA_INTERLEAVE_MASK 0xc0\n#define TGA_INTERLEAVE_NONE 0x00\n#define TGA_INTERLEAVE_2WAY 0x40\n#define TGA_INTERLEAVE_4WAY 0x80\n\n#define TGA_ORIGIN_MASK     0x30\n#define TGA_ORIGIN_LEFT     0x00\n#define TGA_ORIGIN_RIGHT    0x10\n#define TGA_ORIGIN_LOWER    0x00\n#define TGA_ORIGIN_UPPER    0x20\n\n/* read/write unaligned little-endian 16-bit ints */\n#define LE16(p) ((p)[0] + ((p)[1] << 8))\n#define SETLE16(p, v) ((p)[0] = (v), (p)[1] = (v) >> 8)\n\n/* Load a TGA type image from an SDL datasource */\nSDL_Surface *IMG_LoadTGA_RW(SDL_RWops *src)\n{\n    Sint64 start;\n    const char *error = NULL;\n    struct TGAheader hdr;\n    int rle = 0;\n    int alpha = 0;\n    int indexed = 0;\n    int grey = 0;\n    int ckey = -1;\n    int ncols, w, h;\n    SDL_Surface *img = NULL;\n    Uint32 rmask, gmask, bmask, amask;\n    Uint8 *dst;\n    int i;\n    int bpp;\n    int lstep;\n    Uint32 pixel;\n    int count, rep;\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    if (!SDL_RWread(src, &hdr, sizeof(hdr), 1)) {\n        error = \"Error reading TGA data\";\n        goto error;\n    }\n    ncols = LE16(hdr.cmap_len);\n    switch(hdr.type) {\n    case TGA_TYPE_RLE_INDEXED:\n        rle = 1;\n        /* fallthrough */\n    case TGA_TYPE_INDEXED:\n        if (!hdr.has_cmap || hdr.pixel_bits != 8 || ncols > 256)\n            goto unsupported;\n        indexed = 1;\n        break;\n\n    case TGA_TYPE_RLE_RGB:\n        rle = 1;\n        /* fallthrough */\n    case TGA_TYPE_RGB:\n        indexed = 0;\n        break;\n\n    case TGA_TYPE_RLE_BW:\n        rle = 1;\n        /* fallthrough */\n    case TGA_TYPE_BW:\n        if (hdr.pixel_bits != 8)\n            goto unsupported;\n        /* Treat greyscale as 8bpp indexed images */\n        indexed = grey = 1;\n        break;\n\n    default:\n        goto unsupported;\n    }\n\n    bpp = (hdr.pixel_bits + 7) >> 3;\n    rmask = gmask = bmask = amask = 0;\n    switch(hdr.pixel_bits) {\n    case 8:\n        if (!indexed) {\n                goto unsupported;\n        }\n        break;\n\n    case 15:\n    case 16:\n        /* 15 and 16bpp both seem to use 5 bits/plane. The extra alpha bit\n           is ignored for now. */\n        rmask = 0x7c00;\n        gmask = 0x03e0;\n        bmask = 0x001f;\n        break;\n\n    case 32:\n        alpha = 1;\n        /* fallthrough */\n    case 24:\n#if SDL_BYTEORDER == SDL_BIG_ENDIAN\n        {\n        int s = alpha ? 0 : 8;\n        amask = 0x000000ff >> s;\n        rmask = 0x0000ff00 >> s;\n        gmask = 0x00ff0000 >> s;\n        bmask = 0xff000000 >> s;\n        }\n#else\n        amask = alpha ? 0xff000000 : 0;\n        rmask = 0x00ff0000;\n        gmask = 0x0000ff00;\n        bmask = 0x000000ff;\n#endif\n        break;\n\n    default:\n        goto unsupported;\n    }\n\n    if ((hdr.flags & TGA_INTERLEAVE_MASK) != TGA_INTERLEAVE_NONE\n       || hdr.flags & TGA_ORIGIN_RIGHT) {\n        goto unsupported;\n    }\n\n    SDL_RWseek(src, hdr.infolen, RW_SEEK_CUR); /* skip info field */\n\n    w = LE16(hdr.width);\n    h = LE16(hdr.height);\n    img = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h,\n                   bpp * 8,\n                   rmask, gmask, bmask, amask);\n    if (img == NULL) {\n        error = \"Out of memory\";\n        goto error;\n    }\n\n    if (hdr.has_cmap) {\n        int palsiz = ncols * ((hdr.cmap_bits + 7) >> 3);\n        if (indexed && !grey) {\n            Uint8 *pal = (Uint8 *)SDL_malloc(palsiz), *p = pal;\n            SDL_Color *colors = img->format->palette->colors;\n            img->format->palette->ncolors = ncols;\n            SDL_RWread(src, pal, palsiz, 1);\n            for(i = 0; i < ncols; i++) {\n                switch(hdr.cmap_bits) {\n                case 15:\n                case 16:\n                    {\n                    Uint16 c = p[0] + (p[1] << 8);\n                    p += 2;\n                    colors[i].r = (c >> 7) & 0xf8;\n                    colors[i].g = (c >> 2) & 0xf8;\n                    colors[i].b = c << 3;\n                    }\n                    break;\n                case 24:\n                case 32:\n                    colors[i].b = *p++;\n                    colors[i].g = *p++;\n                    colors[i].r = *p++;\n                    if (hdr.cmap_bits == 32 && *p++ < 128)\n                    ckey = i;\n                    break;\n                }\n            }\n            SDL_free(pal);\n            if (ckey >= 0)\n                SDL_SetColorKey(img, SDL_TRUE, ckey);\n        } else {\n            /* skip unneeded colormap */\n            SDL_RWseek(src, palsiz, RW_SEEK_CUR);\n        }\n    }\n\n    if (grey) {\n        SDL_Color *colors = img->format->palette->colors;\n        for(i = 0; i < 256; i++)\n            colors[i].r = colors[i].g = colors[i].b = i;\n        img->format->palette->ncolors = 256;\n    }\n\n    if (hdr.flags & TGA_ORIGIN_UPPER) {\n        lstep = img->pitch;\n        dst = (Uint8 *)img->pixels;\n    } else {\n        lstep = -img->pitch;\n        dst = (Uint8 *)img->pixels + (h - 1) * img->pitch;\n    }\n\n    /* The RLE decoding code is slightly convoluted since we can't rely on\n       spans not to wrap across scan lines */\n    count = rep = 0;\n    for(i = 0; i < h; i++) {\n        if (rle) {\n            int x = 0;\n            for(;;) {\n                Uint8 c;\n\n                if (count) {\n                    int n = count;\n                    if (n > w - x)\n                        n = w - x;\n                    SDL_RWread(src, dst + x * bpp, n * bpp, 1);\n                    count -= n;\n                    x += n;\n                    if (x == w)\n                        break;\n                } else if (rep) {\n                    int n = rep;\n                    if (n > w - x)\n                        n = w - x;\n                    rep -= n;\n                    while (n--) {\n                        SDL_memcpy(dst + x * bpp, &pixel, bpp);\n                        x++;\n                    }\n                    if (x == w)\n                        break;\n                }\n\n                SDL_RWread(src, &c, 1, 1);\n                if (c & 0x80) {\n                    SDL_RWread(src, &pixel, bpp, 1);\n                    rep = (c & 0x7f) + 1;\n                } else {\n                    count = c + 1;\n                }\n            }\n        } else {\n            SDL_RWread(src, dst, w * bpp, 1);\n        }\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n        if (bpp == 2) {\n            /* swap byte order */\n            int x;\n            Uint16 *p = (Uint16 *)dst;\n            for(x = 0; x < w; x++)\n            p[x] = SDL_Swap16(p[x]);\n        }\n#endif\n        dst += lstep;\n    }\n    return img;\n\nunsupported:\n    error = \"Unsupported TGA format\";\n\nerror:\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    if ( img ) {\n        SDL_FreeSurface(img);\n    }\n    IMG_SetError(\"%s\", error);\n    return NULL;\n}\n\n#else\n\n/* dummy TGA load routine */\nSDL_Surface *IMG_LoadTGA_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_TGA */\n\n#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_tif.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)\n\n/* This is a TIFF image file loading framework */\n\n#include <stdio.h>\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_TIF\n\n#include <tiffio.h>\n\nstatic struct {\n    int loaded;\n    void *handle;\n    TIFF* (*TIFFClientOpen)(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc);\n    void (*TIFFClose)(TIFF*);\n    int (*TIFFGetField)(TIFF*, ttag_t, ...);\n    int (*TIFFReadRGBAImage)(TIFF*, uint32, uint32, uint32*, int);\n    TIFFErrorHandler (*TIFFSetErrorHandler)(TIFFErrorHandler);\n} lib;\n\n#ifdef LOAD_TIF_DYNAMIC\nint IMG_InitTIF()\n{\n    if ( lib.loaded == 0 ) {\n        lib.handle = SDL_LoadObject(LOAD_TIF_DYNAMIC);\n        if ( lib.handle == NULL ) {\n            return -1;\n        }\n        lib.TIFFClientOpen =\n            (TIFF* (*)(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc))\n            SDL_LoadFunction(lib.handle, \"TIFFClientOpen\");\n        if ( lib.TIFFClientOpen == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.TIFFClose =\n            (void (*)(TIFF*))\n            SDL_LoadFunction(lib.handle, \"TIFFClose\");\n        if ( lib.TIFFClose == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.TIFFGetField =\n            (int (*)(TIFF*, ttag_t, ...))\n            SDL_LoadFunction(lib.handle, \"TIFFGetField\");\n        if ( lib.TIFFGetField == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.TIFFReadRGBAImage =\n            (int (*)(TIFF*, uint32, uint32, uint32*, int))\n            SDL_LoadFunction(lib.handle, \"TIFFReadRGBAImage\");\n        if ( lib.TIFFReadRGBAImage == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n        lib.TIFFSetErrorHandler =\n            (TIFFErrorHandler (*)(TIFFErrorHandler))\n            SDL_LoadFunction(lib.handle, \"TIFFSetErrorHandler\");\n        if ( lib.TIFFSetErrorHandler == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n    }\n    ++lib.loaded;\n\n    return 0;\n}\nvoid IMG_QuitTIF()\n{\n    if ( lib.loaded == 0 ) {\n        return;\n    }\n    if ( lib.loaded == 1 ) {\n        SDL_UnloadObject(lib.handle);\n    }\n    --lib.loaded;\n}\n#else\nint IMG_InitTIF()\n{\n    if ( lib.loaded == 0 ) {\n        lib.TIFFClientOpen = TIFFClientOpen;\n        lib.TIFFClose = TIFFClose;\n        lib.TIFFGetField = TIFFGetField;\n        lib.TIFFReadRGBAImage = TIFFReadRGBAImage;\n        lib.TIFFSetErrorHandler = TIFFSetErrorHandler;\n    }\n    ++lib.loaded;\n\n    return 0;\n}\nvoid IMG_QuitTIF()\n{\n    if ( lib.loaded == 0 ) {\n        return;\n    }\n    if ( lib.loaded == 1 ) {\n    }\n    --lib.loaded;\n}\n#endif /* LOAD_TIF_DYNAMIC */\n\n/*\n * These are the thunking routine to use the SDL_RWops* routines from\n * libtiff's internals.\n*/\n\nstatic tsize_t tiff_read(thandle_t fd, tdata_t buf, tsize_t size)\n{\n    return SDL_RWread((SDL_RWops*)fd, buf, 1, size);\n}\n\nstatic toff_t tiff_seek(thandle_t fd, toff_t offset, int origin)\n{\n    return SDL_RWseek((SDL_RWops*)fd, offset, origin);\n}\n\nstatic tsize_t tiff_write(thandle_t fd, tdata_t buf, tsize_t size)\n{\n    return SDL_RWwrite((SDL_RWops*)fd, buf, 1, size);\n}\n\nstatic int tiff_close(thandle_t fd)\n{\n    /*\n     * We don't want libtiff closing our SDL_RWops*, but if it's not given\n         * a routine to try, and if the image isn't a TIFF, it'll segfault.\n     */\n    return 0;\n}\n\nstatic int tiff_map(thandle_t fd, tdata_t* pbase, toff_t* psize)\n{\n    return (0);\n}\n\nstatic void tiff_unmap(thandle_t fd, tdata_t base, toff_t size)\n{\n    return;\n}\n\nstatic toff_t tiff_size(thandle_t fd)\n{\n    Sint64 save_pos;\n    toff_t size;\n\n    save_pos = SDL_RWtell((SDL_RWops*)fd);\n    SDL_RWseek((SDL_RWops*)fd, 0, RW_SEEK_END);\n    size = SDL_RWtell((SDL_RWops*)fd);\n    SDL_RWseek((SDL_RWops*)fd, save_pos, RW_SEEK_SET);\n    return size;\n}\n\nint IMG_isTIF(SDL_RWops* src)\n{\n    Sint64 start;\n    int is_TIF;\n    Uint8 magic[4];\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_TIF = 0;\n    if ( SDL_RWread(src, magic, 1, sizeof(magic)) == sizeof(magic) ) {\n        if ( (magic[0] == 'I' &&\n                      magic[1] == 'I' &&\n              magic[2] == 0x2a &&\n                      magic[3] == 0x00) ||\n             (magic[0] == 'M' &&\n                      magic[1] == 'M' &&\n              magic[2] == 0x00 &&\n                      magic[3] == 0x2a) ) {\n            is_TIF = 1;\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_TIF);\n}\n\nSDL_Surface* IMG_LoadTIF_RW(SDL_RWops* src)\n{\n    Sint64 start;\n    TIFF* tiff;\n    SDL_Surface* surface = NULL;\n    Uint32 img_width, img_height;\n    Uint32 Rmask, Gmask, Bmask, Amask;\n    Uint32 x, y;\n    Uint32 half;\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    if ( !IMG_Init(IMG_INIT_TIF) ) {\n        return NULL;\n    }\n\n    /* turn off memory mapped access with the m flag */\n    tiff = lib.TIFFClientOpen(\"SDL_image\", \"rm\", (thandle_t)src,\n        tiff_read, tiff_write, tiff_seek, tiff_close, tiff_size, tiff_map, tiff_unmap);\n    if(!tiff)\n        goto error;\n\n    /* Retrieve the dimensions of the image from the TIFF tags */\n    lib.TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &img_width);\n    lib.TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &img_height);\n\n    Rmask = 0x000000FF;\n    Gmask = 0x0000FF00;\n    Bmask = 0x00FF0000;\n    Amask = 0xFF000000;\n    surface = SDL_CreateRGBSurface(SDL_SWSURFACE, img_width, img_height, 32,\n        Rmask, Gmask, Bmask, Amask);\n    if(!surface)\n        goto error;\n\n    if(!lib.TIFFReadRGBAImage(tiff, img_width, img_height, (uint32 *)surface->pixels, 0))\n        goto error;\n\n    /* libtiff loads the image upside-down, flip it back */\n    half = img_height / 2;\n    for(y = 0; y < half; y++)\n    {\n            Uint32 *top = (Uint32 *)surface->pixels + y * surface->pitch/4;\n            Uint32 *bot = (Uint32 *)surface->pixels\n                      + (img_height - y - 1) * surface->pitch/4;\n        for(x = 0; x < img_width; x++)\n        {\n                Uint32 tmp = top[x];\n            top[x] = bot[x];\n            bot[x] = tmp;\n        }\n    }\n    lib.TIFFClose(tiff);\n\n    return surface;\n\nerror:\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    if ( surface ) {\n        SDL_FreeSurface(surface);\n    }\n    return NULL;\n}\n\n#else\n\nint IMG_InitTIF()\n{\n    IMG_SetError(\"TIFF images are not supported\");\n    return(-1);\n}\n\nvoid IMG_QuitTIF()\n{\n}\n\n/* See if an image is contained in a data source */\nint IMG_isTIF(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a TIFF type image from an SDL datasource */\nSDL_Surface *IMG_LoadTIF_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_TIF */\n\n#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_webp.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* This is a WEBP image file loading framework */\n\n#include <stdlib.h>\n#include <stdio.h>\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_WEBP\n\n/*=============================================================================\n        File: SDL_webp.c\n     Purpose: A WEBP loader for the SDL library\n    Revision:\n  Created by: Michael Bonfils (Murlock) (26 November 2011)\n              murlock42@gmail.com\n\n=============================================================================*/\n\n#include \"SDL_endian.h\"\n\n#ifdef macintosh\n#define MACOS\n#endif\n#include <webp/decode.h>\n\nstatic struct {\n    int loaded;\n    void *handle;\n    VP8StatusCode (*webp_get_features_internal) (const uint8_t *data, size_t data_size, WebPBitstreamFeatures* features, int decoder_abi_version);\n    uint8_t*    (*webp_decode_rgb_into) (const uint8_t* data, size_t data_size, uint8_t* output_buffer, size_t output_buffer_size, int output_stride);\n    uint8_t*    (*webp_decode_rgba_into) (const uint8_t* data, size_t data_size, uint8_t* output_buffer, size_t output_buffer_size, int output_stride);\n} lib;\n\n#ifdef LOAD_WEBP_DYNAMIC\nint IMG_InitWEBP()\n{\n    if ( lib.loaded == 0 ) {\n        lib.handle = SDL_LoadObject(LOAD_WEBP_DYNAMIC);\n        if ( lib.handle == NULL ) {\n            return -1;\n        }\n\n        lib.webp_get_features_internal =\n            ( VP8StatusCode (*) (const uint8_t *, size_t, WebPBitstreamFeatures*, int) )\n            SDL_LoadFunction(lib.handle, \"WebPGetFeaturesInternal\" );\n        if ( lib.webp_get_features_internal == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n\n        lib.webp_decode_rgb_into =\n            ( uint8_t* (*) (const uint8_t*, size_t, uint8_t*, size_t, int ) )\n            SDL_LoadFunction(lib.handle, \"WebPDecodeRGBInto\" );\n        if ( lib.webp_decode_rgb_into == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n\n        lib.webp_decode_rgba_into =\n            ( uint8_t* (*) (const uint8_t*, size_t, uint8_t*, size_t, int ) )\n            SDL_LoadFunction(lib.handle, \"WebPDecodeRGBAInto\" );\n        if ( lib.webp_decode_rgba_into == NULL ) {\n            SDL_UnloadObject(lib.handle);\n            return -1;\n        }\n    }\n    ++lib.loaded;\n\n    return 0;\n}\nvoid IMG_QuitWEBP()\n{\n    if ( lib.loaded == 0 ) {\n        return;\n    }\n    if ( lib.loaded == 1 ) {\n        SDL_UnloadObject(lib.handle);\n    }\n    --lib.loaded;\n}\n#else\nint IMG_InitWEBP()\n{\n    if ( lib.loaded == 0 ) {\n#ifdef __MACOSX__\n        extern VP8StatusCode WebPGetFeaturesInternal(const uint8_t*, size_t, WebPBitstreamFeatures*, int) __attribute__((weak_import));\n        if ( WebPGetFeaturesInternal == NULL )\n        {\n            /* Missing weakly linked framework */\n            IMG_SetError(\"Missing webp.framework\");\n            return -1;\n        }\n#endif // __MACOSX__\n\n        lib.webp_get_features_internal = WebPGetFeaturesInternal;\n        lib.webp_decode_rgb_into = WebPDecodeRGBInto;\n        lib.webp_decode_rgba_into = WebPDecodeRGBAInto;\n    }\n    ++lib.loaded;\n\n    return 0;\n}\nvoid IMG_QuitWEBP()\n{\n    if ( lib.loaded == 0 ) {\n        return;\n    }\n    if ( lib.loaded == 1 ) {\n    }\n    --lib.loaded;\n}\n#endif /* LOAD_WEBP_DYNAMIC */\n\nstatic int webp_getinfo( SDL_RWops *src, int *datasize ) {\n    Sint64 start;\n    int is_WEBP;\n    Uint8 magic[20];\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_WEBP = 0;\n    if ( SDL_RWread(src, magic, 1, sizeof(magic)) == sizeof(magic) ) {\n        if ( magic[ 0] == 'R' &&\n                     magic[ 1] == 'I' &&\n                     magic[ 2] == 'F' &&\n                     magic[ 3] == 'F' &&\n                                         magic[ 8] == 'W' &&\n                                         magic[ 9] == 'E' &&\n                                         magic[10] == 'B' &&\n                                         magic[11] == 'P' &&\n                                         magic[12] == 'V' &&\n                                         magic[13] == 'P' &&\n                                         magic[14] == '8' &&\n#if WEBP_DECODER_ABI_VERSION < 0x0003 /* old versions don't support WEBPVP8X and WEBPVP8L */\n                                         magic[15] == ' ') {\n#else\n                                         (magic[15] == ' ' || magic[15] == 'X' || magic[15] == 'L')) {\n#endif\n            is_WEBP = 1;\n            if ( datasize ) {\n                *datasize = (int)SDL_RWseek(src, 0, SEEK_END);\n            }\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_WEBP);\n}\n\n/* See if an image is contained in a data source */\nint IMG_isWEBP(SDL_RWops *src)\n{\n    return webp_getinfo( src, NULL );\n}\n\nSDL_Surface *IMG_LoadWEBP_RW(SDL_RWops *src)\n{\n    Sint64 start;\n    const char *error = NULL;\n    SDL_Surface *volatile surface = NULL;\n    Uint32 Rmask;\n    Uint32 Gmask;\n    Uint32 Bmask;\n    Uint32 Amask;\n    WebPBitstreamFeatures features;\n    int raw_data_size;\n    uint8_t *raw_data = NULL;\n    int r;\n    uint8_t *ret;\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n\n    start = SDL_RWtell(src);\n\n    if ( !IMG_Init(IMG_INIT_WEBP) ) {\n        goto error;\n    }\n\n    raw_data_size = -1;\n    if ( !webp_getinfo( src, &raw_data_size ) ) {\n        error = \"Invalid WEBP\";\n        goto error;\n    }\n\n    // seek to start of file\n    SDL_RWseek(src, 0, RW_SEEK_SET );\n\n    raw_data = (uint8_t*) SDL_malloc( raw_data_size );\n    if ( raw_data == NULL ) {\n        error = \"Failed to allocate enought buffer for WEBP\";\n        goto error;\n    }\n\n    r = SDL_RWread(src, raw_data, 1, raw_data_size );\n    if ( r != raw_data_size ) {\n        error = \"Failed to read WEBP\";\n        goto error;\n    }\n\n#if 0\n    // extract size of picture, not interesting since we don't know about alpha channel\n    int width = -1, height = -1;\n    if ( !WebPGetInfo( raw_data, raw_data_size, &width, &height ) ) {\n        printf(\"WebPGetInfo has failed\\n\" );\n        return NULL;\n    }\n#endif\n\n    if ( lib.webp_get_features_internal( raw_data, raw_data_size, &features, WEBP_DECODER_ABI_VERSION ) != VP8_STATUS_OK ) {\n        error = \"WebPGetFeatures has failed\";\n        goto error;\n    }\n\n    /* Check if it's ok !*/\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n    Rmask = 0x000000FF;\n    Gmask = 0x0000FF00;\n    Bmask = 0x00FF0000;\n    Amask = (features.has_alpha) ? 0xFF000000 : 0;\n#else\n    {\n        int s = (features.has_alpha) ? 0 : 8;\n        Rmask = 0xFF000000 >> s;\n        Gmask = 0x00FF0000 >> s;\n        Bmask = 0x0000FF00 >> s;\n        Amask = 0x000000FF >> s;\n    }\n#endif\n\n    surface = SDL_CreateRGBSurface(SDL_SWSURFACE,\n            features.width, features.height,\n            features.has_alpha?32:24, Rmask,Gmask,Bmask,Amask);\n\n    if ( surface == NULL ) {\n        error = \"Failed to allocate SDL_Surface\";\n        goto error;\n    }\n\n    if ( features.has_alpha ) {\n        ret = lib.webp_decode_rgba_into( raw_data, raw_data_size, (uint8_t *)surface->pixels, surface->pitch * surface->h,  surface->pitch );\n    } else {\n        ret = lib.webp_decode_rgb_into( raw_data, raw_data_size, (uint8_t *)surface->pixels, surface->pitch * surface->h,  surface->pitch );\n    }\n\n    if ( !ret ) {\n        error = \"Failed to decode WEBP\";\n        goto error;\n    }\n\n    if ( raw_data ) {\n        SDL_free( raw_data );\n    }\n\n    return surface;\n\n\nerror:\n\n    if ( raw_data ) {\n        SDL_free( raw_data );\n    }\n\n    if ( surface ) {\n        SDL_FreeSurface( surface );\n    }\n\n    if ( error ) {\n        IMG_SetError( \"%s\", error );\n    }\n\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(NULL);\n}\n\n#else\n\nint IMG_InitWEBP()\n{\n    IMG_SetError(\"WEBP images are not supported\");\n    return(-1);\n}\n\nvoid IMG_QuitWEBP()\n{\n}\n\n/* See if an image is contained in a data source */\nint IMG_isWEBP(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a WEBP type image from an SDL datasource */\nSDL_Surface *IMG_LoadWEBP_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_WEBP */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_xcf.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* This is a XCF image file loading framework */\n\n#include <stdio.h>\n#include <ctype.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"SDL_endian.h\"\n#include \"SDL_image.h\"\n\n#ifdef LOAD_XCF\n\n#if DEBUG\nstatic char prop_names [][30] = {\n  \"end\",\n  \"colormap\",\n  \"active_layer\",\n  \"active_channel\",\n  \"selection\",\n  \"floating_selection\",\n  \"opacity\",\n  \"mode\",\n  \"visible\",\n  \"linked\",\n  \"preserve_transparency\",\n  \"apply_mask\",\n  \"edit_mask\",\n  \"show_mask\",\n  \"show_masked\",\n  \"offsets\",\n  \"color\",\n  \"compression\",\n  \"guides\",\n  \"resolution\",\n  \"tattoo\",\n  \"parasites\",\n  \"unit\",\n  \"paths\",\n  \"user_unit\"\n};\n#endif\n\n\ntypedef enum\n{\n  PROP_END = 0,\n  PROP_COLORMAP = 1,\n  PROP_ACTIVE_LAYER = 2,\n  PROP_ACTIVE_CHANNEL = 3,\n  PROP_SELECTION = 4,\n  PROP_FLOATING_SELECTION = 5,\n  PROP_OPACITY = 6,\n  PROP_MODE = 7,\n  PROP_VISIBLE = 8,\n  PROP_LINKED = 9,\n  PROP_PRESERVE_TRANSPARENCY = 10,\n  PROP_APPLY_MASK = 11,\n  PROP_EDIT_MASK = 12,\n  PROP_SHOW_MASK = 13,\n  PROP_SHOW_MASKED = 14,\n  PROP_OFFSETS = 15,\n  PROP_COLOR = 16,\n  PROP_COMPRESSION = 17,\n  PROP_GUIDES = 18,\n  PROP_RESOLUTION = 19,\n  PROP_TATTOO = 20,\n  PROP_PARASITES = 21,\n  PROP_UNIT = 22,\n  PROP_PATHS = 23,\n  PROP_USER_UNIT = 24\n} xcf_prop_type;\n\ntypedef enum {\n  COMPR_NONE    = 0,\n  COMPR_RLE     = 1,\n  COMPR_ZLIB    = 2,\n  COMPR_FRACTAL = 3\n} xcf_compr_type;\n\ntypedef enum {\n  IMAGE_RGB       = 0,\n  IMAGE_GREYSCALE = 1,\n  IMAGE_INDEXED   = 2\n} xcf_image_type;\n\ntypedef struct {\n  Uint32 id;\n  Uint32 length;\n  union {\n    struct {\n      Uint32 num;\n      char * cmap;\n    } colormap; // 1\n    struct {\n      Uint32 drawable_offset;\n    } floating_selection; // 5\n    Sint32 opacity;\n    Sint32 mode;\n    int    visible;\n    int    linked;\n    int    preserve_transparency;\n    int    apply_mask;\n    int    show_mask;\n    struct {\n      Sint32 x;\n      Sint32 y;\n    } offset;\n    unsigned char color [3];\n    Uint8 compression;\n    struct {\n      Sint32 x;\n      Sint32 y;\n    } resolution;\n    struct {\n      char * name;\n      Uint32 flags;\n      Uint32 size;\n      char * data;\n    } parasite;\n  } data;\n} xcf_prop;\n\ntypedef struct {\n  char   sign [14];\n  Uint32 width;\n  Uint32 height;\n  Sint32 image_type;\n  xcf_prop * properties;\n\n  Uint32 * layer_file_offsets;\n  Uint32 * channel_file_offsets;\n\n  xcf_compr_type compr;\n  Uint32         cm_num;\n  unsigned char * cm_map;\n} xcf_header;\n\ntypedef struct {\n  Uint32 width;\n  Uint32 height;\n  Sint32 layer_type;\n  char * name;\n  xcf_prop * properties;\n\n  Uint32 hierarchy_file_offset;\n  Uint32 layer_mask_offset;\n\n  Uint32 offset_x;\n  Uint32 offset_y;\n  int visible;\n} xcf_layer;\n\ntypedef struct {\n  Uint32 width;\n  Uint32 height;\n  char * name;\n  xcf_prop * properties;\n\n  Uint32 hierarchy_file_offset;\n\n  Uint32 color;\n  Uint32 opacity;\n  int selection;\n  int visible;\n} xcf_channel;\n\ntypedef struct {\n  Uint32 width;\n  Uint32 height;\n  Uint32 bpp;\n\n  Uint32 * level_file_offsets;\n} xcf_hierarchy;\n\ntypedef struct {\n  Uint32 width;\n  Uint32 height;\n\n  Uint32 * tile_file_offsets;\n} xcf_level;\n\ntypedef unsigned char * xcf_tile;\n\ntypedef unsigned char * (* load_tile_type) (SDL_RWops *, Uint32, int, int, int);\n\n\n/* See if an image is contained in a data source */\nint IMG_isXCF(SDL_RWops *src)\n{\n    Sint64 start;\n    int is_XCF;\n    char magic[14];\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_XCF = 0;\n    if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {\n        if (SDL_strncmp(magic, \"gimp xcf \", 9) == 0) {\n            is_XCF = 1;\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_XCF);\n}\n\nstatic char * read_string (SDL_RWops * src) {\n  Uint32 tmp;\n  char * data;\n\n  tmp = SDL_ReadBE32 (src);\n  if (tmp > 0) {\n    data = (char *) SDL_malloc (sizeof (char) * tmp);\n    SDL_RWread (src, data, tmp, 1);\n  }\n  else {\n    data = NULL;\n  }\n\n  return data;\n}\n\n\nstatic Uint32 Swap32 (Uint32 v) {\n  return\n    ((v & 0x000000FF) << 16)\n    |  ((v & 0x0000FF00))\n    |  ((v & 0x00FF0000) >> 16)\n    |  ((v & 0xFF000000));\n}\n\nstatic void xcf_read_property (SDL_RWops * src, xcf_prop * prop) {\n  prop->id = SDL_ReadBE32 (src);\n  prop->length = SDL_ReadBE32 (src);\n\n#if DEBUG\n  printf (\"%.8X: %s: %d\\n\", SDL_RWtell (src), prop->id < 25 ? prop_names [prop->id] : \"unknown\", prop->length);\n#endif\n\n  switch (prop->id) {\n  case PROP_COLORMAP:\n    prop->data.colormap.num = SDL_ReadBE32 (src);\n    prop->data.colormap.cmap = (char *) SDL_malloc (sizeof (char) * prop->data.colormap.num * 3);\n    SDL_RWread (src, prop->data.colormap.cmap, prop->data.colormap.num*3, 1);\n    break;\n\n  case PROP_OFFSETS:\n    prop->data.offset.x = SDL_ReadBE32 (src);\n    prop->data.offset.y = SDL_ReadBE32 (src);\n    break;\n  case PROP_OPACITY:\n    prop->data.opacity = SDL_ReadBE32 (src);\n    break;\n  case PROP_COMPRESSION:\n  case PROP_COLOR:\n    SDL_RWread (src, &prop->data, prop->length, 1);\n    break;\n  case PROP_VISIBLE:\n    prop->data.visible = SDL_ReadBE32 (src);\n    break;\n  default:\n    //    SDL_RWread (src, &prop->data, prop->length, 1);\n    SDL_RWseek (src, prop->length, RW_SEEK_CUR);\n  }\n}\n\nstatic void free_xcf_header (xcf_header * h) {\n  if (h->cm_num)\n    SDL_free (h->cm_map);\n  if (h->layer_file_offsets)\n    SDL_free (h->layer_file_offsets);\n  SDL_free (h);\n}\n\nstatic xcf_header * read_xcf_header (SDL_RWops * src) {\n  xcf_header * h;\n  xcf_prop prop;\n\n  h = (xcf_header *) SDL_malloc (sizeof (xcf_header));\n  SDL_RWread (src, h->sign, 14, 1);\n  h->width       = SDL_ReadBE32 (src);\n  h->height      = SDL_ReadBE32 (src);\n  h->image_type  = SDL_ReadBE32 (src);\n\n  h->properties = NULL;\n  h->layer_file_offsets = NULL;\n  h->compr      = COMPR_NONE;\n  h->cm_num = 0;\n  h->cm_map = NULL;\n\n  // Just read, don't save\n  do {\n    xcf_read_property (src, &prop);\n    if (prop.id == PROP_COMPRESSION)\n      h->compr = (xcf_compr_type)prop.data.compression;\n    else if (prop.id == PROP_COLORMAP) {\n      // unused var: int i;\n\n      h->cm_num = prop.data.colormap.num;\n      h->cm_map = (unsigned char *) SDL_malloc (sizeof (unsigned char) * 3 * h->cm_num);\n      SDL_memcpy (h->cm_map, prop.data.colormap.cmap, 3*sizeof (char)*h->cm_num);\n      SDL_free (prop.data.colormap.cmap);\n    }\n  } while (prop.id != PROP_END);\n\n  return h;\n}\n\nstatic void free_xcf_layer (xcf_layer * l) {\n  SDL_free (l->name);\n  SDL_free (l);\n}\n\nstatic xcf_layer * read_xcf_layer (SDL_RWops * src) {\n  xcf_layer * l;\n  xcf_prop    prop;\n\n  l = (xcf_layer *) SDL_malloc (sizeof (xcf_layer));\n  l->width  = SDL_ReadBE32 (src);\n  l->height = SDL_ReadBE32 (src);\n  l->layer_type = SDL_ReadBE32 (src);\n\n  l->name = read_string (src);\n\n  do {\n    xcf_read_property (src, &prop);\n    if (prop.id == PROP_OFFSETS) {\n      l->offset_x = prop.data.offset.x;\n      l->offset_y = prop.data.offset.y;\n    } else if (prop.id == PROP_VISIBLE) {\n      l->visible = prop.data.visible ? 1 : 0;\n    }\n  } while (prop.id != PROP_END);\n\n  l->hierarchy_file_offset = SDL_ReadBE32 (src);\n  l->layer_mask_offset     = SDL_ReadBE32 (src);\n\n  return l;\n}\n\nstatic void free_xcf_channel (xcf_channel * c) {\n  SDL_free (c->name);\n  SDL_free (c);\n}\n\nstatic xcf_channel * read_xcf_channel (SDL_RWops * src) {\n  xcf_channel * l;\n  xcf_prop    prop;\n\n  l = (xcf_channel *) SDL_malloc (sizeof (xcf_channel));\n  l->width  = SDL_ReadBE32 (src);\n  l->height = SDL_ReadBE32 (src);\n\n  l->name = read_string (src);\n\n  l->selection = 0;\n  do {\n    xcf_read_property (src, &prop);\n    switch (prop.id) {\n    case PROP_OPACITY:\n      l->opacity = prop.data.opacity << 24;\n      break;\n    case PROP_COLOR:\n      l->color = ((Uint32) prop.data.color[0] << 16)\n    | ((Uint32) prop.data.color[1] << 8)\n    | ((Uint32) prop.data.color[2]);\n      break;\n    case PROP_SELECTION:\n      l->selection = 1;\n      break;\n    case PROP_VISIBLE:\n      l->visible = prop.data.visible ? 1 : 0;\n      break;\n    default:\n        ;\n    }\n  } while (prop.id != PROP_END);\n\n  l->hierarchy_file_offset = SDL_ReadBE32 (src);\n\n  return l;\n}\n\nstatic void free_xcf_hierarchy (xcf_hierarchy * h) {\n  SDL_free (h->level_file_offsets);\n  SDL_free (h);\n}\n\nstatic xcf_hierarchy * read_xcf_hierarchy (SDL_RWops * src) {\n  xcf_hierarchy * h;\n  int i;\n\n  h = (xcf_hierarchy *) SDL_malloc (sizeof (xcf_hierarchy));\n  h->width  = SDL_ReadBE32 (src);\n  h->height = SDL_ReadBE32 (src);\n  h->bpp    = SDL_ReadBE32 (src);\n\n  h->level_file_offsets = NULL;\n  i = 0;\n  do {\n    h->level_file_offsets = (Uint32 *) SDL_realloc (h->level_file_offsets, sizeof (Uint32) * (i+1));\n    h->level_file_offsets [i] = SDL_ReadBE32 (src);\n  } while (h->level_file_offsets [i++]);\n\n  return h;\n}\n\nstatic void free_xcf_level (xcf_level * l) {\n  SDL_free (l->tile_file_offsets);\n  SDL_free (l);\n}\n\nstatic xcf_level * read_xcf_level (SDL_RWops * src) {\n  xcf_level * l;\n  int i;\n\n  l = (xcf_level *) SDL_malloc (sizeof (xcf_level));\n  l->width  = SDL_ReadBE32 (src);\n  l->height = SDL_ReadBE32 (src);\n\n  l->tile_file_offsets = NULL;\n  i = 0;\n  do {\n    l->tile_file_offsets = (Uint32 *) SDL_realloc (l->tile_file_offsets, sizeof (Uint32) * (i+1));\n    l->tile_file_offsets [i] = SDL_ReadBE32 (src);\n  } while (l->tile_file_offsets [i++]);\n\n  return l;\n}\n\nstatic void free_xcf_tile (unsigned char * t) {\n  SDL_free (t);\n}\n\nstatic unsigned char * load_xcf_tile_none (SDL_RWops * src, Uint32 len, int bpp, int x, int y) {\n  unsigned char * load;\n\n  load = (unsigned char *) SDL_malloc (len); // expect this is okay\n  SDL_RWread (src, load, len, 1);\n\n  return load;\n}\n\nstatic unsigned char * load_xcf_tile_rle (SDL_RWops * src, Uint32 len, int bpp, int x, int y) {\n  unsigned char * load, * t, * data, * d;\n  Uint32 reallen;\n  int i, size, count, j, length;\n  unsigned char val;\n\n  t = load = (unsigned char *) SDL_malloc (len);\n  reallen = SDL_RWread (src, t, 1, len);\n\n  data = (unsigned char *) SDL_malloc (x*y*bpp);\n  for (i = 0; i < bpp; i++) {\n    d    = data + i;\n    size = x*y;\n    count = 0;\n\n    while (size > 0) {\n      val = *t++;\n\n      length = val;\n      if (length >= 128) {\n    length = 255 - (length - 1);\n    if (length == 128) {\n      length = (*t << 8) + t[1];\n      t += 2;\n    }\n\n    count += length;\n    size -= length;\n\n    while (length-- > 0) {\n      *d = *t++;\n      d += bpp;\n    }\n      }\n      else {\n    length += 1;\n    if (length == 128) {\n      length = (*t << 8) + t[1];\n      t += 2;\n    }\n\n    count += length;\n    size -= length;\n\n    val = *t++;\n\n    for (j = 0; j < length; j++) {\n      *d = val;\n      d += bpp;\n    }\n      }\n    }\n  }\n\n  SDL_free (load);\n  return (data);\n}\n\nstatic Uint32 rgb2grey (Uint32 a) {\n  Uint8 l;\n  l = (Uint8)(0.2990 * ((a & 0x00FF0000) >> 16)\n    + 0.5870 * ((a & 0x0000FF00) >>  8)\n    + 0.1140 * ((a & 0x000000FF)));\n\n  return (l << 16) | (l << 8) | l;\n}\n\nstatic void create_channel_surface (SDL_Surface * surf, xcf_image_type itype, Uint32 color, Uint32 opacity) {\n  Uint32 c = 0;\n\n  switch (itype) {\n  case IMAGE_RGB:\n  case IMAGE_INDEXED:\n    c = opacity | color;\n    break;\n  case IMAGE_GREYSCALE:\n    c = opacity | rgb2grey (color);\n    break;\n  }\n  SDL_FillRect (surf, NULL, c);\n}\n\nstatic int do_layer_surface (SDL_Surface * surface, SDL_RWops * src, xcf_header * head, xcf_layer * layer, load_tile_type load_tile) {\n  xcf_hierarchy * hierarchy;\n  xcf_level     * level;\n  unsigned char * tile;\n  Uint8  * p8;\n  Uint16 * p16;\n  Uint32 * p;\n  int i, j;\n  Uint32 x, y, tx, ty, ox, oy;\n  Uint32 *row;\n\n  SDL_RWseek (src, layer->hierarchy_file_offset, RW_SEEK_SET);\n  hierarchy = read_xcf_hierarchy (src);\n\n  level = NULL;\n  for (i = 0; hierarchy->level_file_offsets [i]; i++) {\n    SDL_RWseek (src, hierarchy->level_file_offsets [i], RW_SEEK_SET);\n    level = read_xcf_level (src);\n\n    ty = tx = 0;\n    for (j = 0; level->tile_file_offsets [j]; j++) {\n      SDL_RWseek (src, level->tile_file_offsets [j], RW_SEEK_SET);\n      ox = tx+64 > level->width ? level->width % 64 : 64;\n      oy = ty+64 > level->height ? level->height % 64 : 64;\n\n      if (level->tile_file_offsets [j+1]) {\n    tile = load_tile\n      (src,\n       level->tile_file_offsets [j+1] - level->tile_file_offsets [j],\n       hierarchy->bpp,\n       ox, oy);\n      }\n      else {\n    tile = load_tile\n      (src,\n       ox*oy*6,\n       hierarchy->bpp,\n       ox, oy);\n      }\n\n      p8  = tile;\n      p16 = (Uint16 *) p8;\n      p   = (Uint32 *) p8;\n      for (y=ty; y < ty+oy; y++) {\n    row = (Uint32 *)((Uint8 *)surface->pixels + y*surface->pitch + tx*4);\n    switch (hierarchy->bpp) {\n    case 4:\n      for (x=tx; x < tx+ox; x++)\n        *row++ = Swap32 (*p++);\n      break;\n    case 3:\n      for (x=tx; x < tx+ox; x++) {\n        *row = 0xFF000000;\n        *row |= ((Uint32) *(p8++) << 16);\n        *row |= ((Uint32) *(p8++) << 8);\n        *row |= ((Uint32) *(p8++) << 0);\n        row++;\n      }\n      break;\n    case 2: // Indexed/Greyscale + Alpha\n      switch (head->image_type) {\n      case IMAGE_INDEXED:\n        for (x=tx; x < tx+ox; x++) {\n          *row =  ((Uint32) (head->cm_map [*p8*3])     << 16);\n          *row |= ((Uint32) (head->cm_map [*p8*3+1])   << 8);\n          *row |= ((Uint32) (head->cm_map [*p8++*3+2]) << 0);\n          *row |= ((Uint32) *p8++ << 24);;\n          row++;\n        }\n        break;\n      case IMAGE_GREYSCALE:\n        for (x=tx; x < tx+ox; x++) {\n          *row = ((Uint32) *p8 << 16);\n          *row |= ((Uint32) *p8 << 8);\n          *row |= ((Uint32) *p8++ << 0);\n          *row |= ((Uint32) *p8++ << 24);;\n          row++;\n        }\n        break;\n      default:\n        fprintf (stderr, \"Unknown Gimp image type (%d)\\n\", head->image_type);\n        if (hierarchy)\n        {\n          if (hierarchy->level_file_offsets)\n            SDL_free(hierarchy->level_file_offsets);\n         \n          free_xcf_hierarchy(hierarchy);\n        }\n        if (level)     \n          free_xcf_level (level);\n        return 1;\n      }\n      break;\n    case 1: // Indexed/Greyscale\n      switch (head->image_type) {\n      case IMAGE_INDEXED:\n        for (x = tx; x < tx+ox; x++) {\n          *row++ = 0xFF000000\n        | ((Uint32) (head->cm_map [*p8*3]) << 16)\n        | ((Uint32) (head->cm_map [*p8*3+1]) << 8)\n        | ((Uint32) (head->cm_map [*p8*3+2]) << 0);\n          p8++;\n        }\n        break;\n      case IMAGE_GREYSCALE:\n        for (x=tx; x < tx+ox; x++) {\n          *row++ = 0xFF000000\n        | (((Uint32) (*p8)) << 16)\n        | (((Uint32) (*p8)) << 8)\n        | (((Uint32) (*p8)) << 0);\n            ++p8;\n        }\n        break;\n      default:\n        fprintf (stderr, \"Unknown Gimp image type (%d)\\n\", head->image_type);\n        if (tile)\n          free_xcf_tile (tile);\n        if (level)\n          free_xcf_level (level);\n        if (hierarchy)\n          free_xcf_hierarchy (hierarchy);\n        return 1;\n      }\n      break;\n    }\n      }\n      tx += 64;\n      if (tx >= level->width) {\n    tx = 0;\n    ty += 64;\n      }\n      if (ty >= level->height) {\n    break;\n      }\n\n      free_xcf_tile (tile);\n    }\n    free_xcf_level (level);\n  }\n\n  free_xcf_hierarchy (hierarchy);\n\n  return 0;\n}\n\nSDL_Surface *IMG_LoadXCF_RW(SDL_RWops *src)\n{\n  Sint64 start;\n  const char *error = NULL;\n  SDL_Surface *surface, *lays;\n  xcf_header * head;\n  xcf_layer  * layer;\n  xcf_channel ** channel;\n  int chnls, i, offsets;\n  Sint64 offset, fp;\n\n  unsigned char * (* load_tile) (SDL_RWops *, Uint32, int, int, int);\n\n  if ( !src ) {\n    /* The error message has been set in SDL_RWFromFile */\n    return NULL;\n  }\n  start = SDL_RWtell(src);\n\n  /* Initialize the data we will clean up when we're done */\n  surface = NULL;\n\n  head = read_xcf_header (src);\n\n  switch (head->compr) {\n  case COMPR_NONE:\n    load_tile = load_xcf_tile_none;\n    break;\n  case COMPR_RLE:\n    load_tile = load_xcf_tile_rle;\n    break;\n  default:\n    fprintf (stderr, \"Unsupported Compression.\\n\");\n    free_xcf_header (head);\n    return NULL;\n  }\n\n  /* Create the surface of the appropriate type */\n  surface = SDL_CreateRGBSurface(SDL_SWSURFACE, head->width, head->height, 32,\n                 0x00FF0000,0x0000FF00,0x000000FF,0xFF000000);\n\n  if ( surface == NULL ) {\n    error = \"Out of memory\";\n    goto done;\n  }\n\n  offsets = 0;\n\n  while ((offset = SDL_ReadBE32 (src))) {\n    head->layer_file_offsets = (Uint32 *) SDL_realloc (head->layer_file_offsets, sizeof (Uint32) * (offsets+1));\n    head->layer_file_offsets [offsets] = (Uint32)offset;\n    offsets++;\n  }\n  fp = SDL_RWtell (src);\n\n  lays = SDL_CreateRGBSurface(SDL_SWSURFACE, head->width, head->height, 32,\n              0x00FF0000,0x0000FF00,0x000000FF,0xFF000000);\n\n  if ( lays == NULL ) {\n    error = \"Out of memory\";\n    goto done;\n  }\n\n  // Blit layers backwards, because Gimp saves them highest first\n  for (i = offsets; i > 0; i--) {\n    SDL_Rect rs, rd;\n    SDL_RWseek (src, head->layer_file_offsets [i-1], RW_SEEK_SET);\n\n    layer = read_xcf_layer (src);\n    do_layer_surface (lays, src, head, layer, load_tile);\n    rs.x = 0;\n    rs.y = 0;\n    rs.w = layer->width;\n    rs.h = layer->height;\n    rd.x = layer->offset_x;\n    rd.y = layer->offset_y;\n    rd.w = layer->width;\n    rd.h = layer->height;\n\n    if (layer->visible)\n      SDL_BlitSurface (lays, &rs, surface, &rd);\n    free_xcf_layer (layer);\n  }\n\n  SDL_FreeSurface (lays);\n\n  SDL_RWseek (src, fp, RW_SEEK_SET);\n\n  // read channels\n  channel = NULL;\n  chnls   = 0;\n  while ((offset = SDL_ReadBE32 (src))) {\n    channel = (xcf_channel **) SDL_realloc (channel, sizeof (xcf_channel *) * (chnls+1));\n    fp = SDL_RWtell (src);\n    SDL_RWseek (src, offset, RW_SEEK_SET);\n    channel [chnls++] = (read_xcf_channel (src));\n    SDL_RWseek (src, fp, RW_SEEK_SET);\n  }\n\n  if (chnls) {\n    SDL_Surface * chs;\n\n    chs = SDL_CreateRGBSurface(SDL_SWSURFACE, head->width, head->height, 32,\n               0x00FF0000,0x0000FF00,0x000000FF,0xFF000000);\n\n    if (chs == NULL) {\n      error = \"Out of memory\";\n      goto done;\n    }\n    for (i = 0; i < chnls; i++) {\n      //      printf (\"CNLBLT %i\\n\", i);\n      if (!channel [i]->selection && channel [i]->visible) {\n    create_channel_surface (chs, (xcf_image_type)head->image_type, channel [i]->color, channel [i]->opacity);\n    SDL_BlitSurface (chs, NULL, surface, NULL);\n      }\n      free_xcf_channel (channel [i]);\n    }\n\n    SDL_FreeSurface (chs);\n  }\n\ndone:\n  free_xcf_header (head);\n  if ( error ) {\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    if ( surface ) {\n      SDL_FreeSurface(surface);\n      surface = NULL;\n    }\n    IMG_SetError(\"%s\", error);\n  }\n\n  return(surface);\n}\n\n#else\n\n/* See if an image is contained in a data source */\nint IMG_isXCF(SDL_RWops *src)\n{\n  return(0);\n}\n\n/* Load a XCF type image from an SDL datasource */\nSDL_Surface *IMG_LoadXCF_RW(SDL_RWops *src)\n{\n  return(NULL);\n}\n\n#endif /* LOAD_XCF */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_xpm.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/*\n * XPM (X PixMap) image loader:\n *\n * Supports the XPMv3 format, EXCEPT:\n * - hotspot coordinates are ignored\n * - only colour ('c') colour symbols are used\n * - rgb.txt is not used (for portability), so only RGB colours\n *   are recognized (#rrggbb etc) - only a few basic colour names are\n *   handled\n *\n * The result is an 8bpp indexed surface if possible, otherwise 32bpp.\n * The colourkey is correctly set if transparency is used.\n *\n * Besides the standard API, also provides\n *\n *     SDL_Surface *IMG_ReadXPMFromArray(char **xpm)\n *\n * that reads the image data from an XPM file included in the C source.\n *\n * TODO: include rgb.txt here. The full table (from solaris 2.6) only\n * requires about 13K in binary form.\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_XPM\n\n/* See if an image is contained in a data source */\nint IMG_isXPM(SDL_RWops *src)\n{\n    Sint64 start;\n    int is_XPM;\n    char magic[9];\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_XPM = 0;\n    if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {\n        if ( SDL_memcmp(magic, \"/* XPM */\", sizeof(magic)) == 0 ) {\n            is_XPM = 1;\n        }\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_XPM);\n}\n\n/* Hash table to look up colors from pixel strings */\n#define STARTING_HASH_SIZE 256\n\nstruct hash_entry {\n    char *key;\n    Uint32 color;\n    struct hash_entry *next;\n};\n\nstruct color_hash {\n    struct hash_entry **table;\n    struct hash_entry *entries; /* array of all entries */\n    struct hash_entry *next_free;\n    int size;\n    int maxnum;\n};\n\nstatic int hash_key(const char *key, int cpp, int size)\n{\n    int hash;\n\n    hash = 0;\n    while ( cpp-- > 0 ) {\n        hash = hash * 33 + *key++;\n    }\n    return hash & (size - 1);\n}\n\nstatic struct color_hash *create_colorhash(int maxnum)\n{\n    int bytes, s;\n    struct color_hash *hash;\n\n    /* we know how many entries we need, so we can allocate\n       everything here */\n    hash = (struct color_hash *)SDL_malloc(sizeof *hash);\n    if (!hash)\n        return NULL;\n\n    /* use power-of-2 sized hash table for decoding speed */\n    for (s = STARTING_HASH_SIZE; s < maxnum; s <<= 1)\n        ;\n    hash->size = s;\n    hash->maxnum = maxnum;\n    bytes = hash->size * sizeof(struct hash_entry **);\n    hash->entries = NULL;   /* in case malloc fails */\n    hash->table = (struct hash_entry **)SDL_malloc(bytes);\n    if (!hash->table) {\n        SDL_free(hash);\n        return NULL;\n    }\n    SDL_memset(hash->table, 0, bytes);\n    hash->entries = (struct hash_entry *)SDL_malloc(maxnum * sizeof(struct hash_entry));\n    if (!hash->entries) {\n        SDL_free(hash->table);\n        SDL_free(hash);\n        return NULL;\n    }\n    hash->next_free = hash->entries;\n    return hash;\n}\n\nstatic int add_colorhash(struct color_hash *hash,\n                         char *key, int cpp, Uint32 color)\n{\n    int index = hash_key(key, cpp, hash->size);\n    struct hash_entry *e = hash->next_free++;\n    e->color = color;\n    e->key = key;\n    e->next = hash->table[index];\n    hash->table[index] = e;\n    return 1;\n}\n\n/* fast lookup that works if cpp == 1 */\n#define QUICK_COLORHASH(hash, key) ((hash)->table[*(Uint8 *)(key)]->color)\n\nstatic Uint32 get_colorhash(struct color_hash *hash, const char *key, int cpp)\n{\n    struct hash_entry *entry = hash->table[hash_key(key, cpp, hash->size)];\n    while (entry) {\n        if (SDL_memcmp(key, entry->key, cpp) == 0)\n            return entry->color;\n        entry = entry->next;\n    }\n    return 0;       /* garbage in - garbage out */\n}\n\nstatic void free_colorhash(struct color_hash *hash)\n{\n    if (hash) {\n        if (hash->table)\n            SDL_free(hash->table);\n        if (hash->entries)\n            SDL_free(hash->entries);\n        SDL_free(hash);\n    }\n}\n\n/*\n * convert colour spec to RGB (in 0xrrggbb format).\n * return 1 if successful.\n */\nstatic int color_to_rgb(char *spec, int speclen, Uint32 *rgb)\n{\n    /* poor man's rgb.txt */\n    static struct { char *name; Uint32 rgb; } known[] = {\n        { \"none\",                 0xFFFFFFFF },\n        { \"black\",                0x000000 },\n        { \"white\",                0xFFFFFF },\n        { \"red\",                  0xFF0000 },\n        { \"green\",                0x00FF00 },\n        { \"blue\",                 0x0000FF },\n/* This table increases the size of the library by 40K, so it's disabled by default */\n#ifdef EXTENDED_XPM_COLORS\n        { \"aliceblue\",            0xf0f8ff },\n        { \"antiquewhite\",         0xfaebd7 },\n        { \"antiquewhite1\",        0xffefdb },\n        { \"antiquewhite2\",        0xeedfcc },\n        { \"antiquewhite3\",        0xcdc0b0 },\n        { \"antiquewhite4\",        0x8b8378 },\n        { \"aqua\",                 0x00ffff },\n        { \"aquamarine\",           0x7fffd4 },\n        { \"aquamarine1\",          0x7fffd4 },\n        { \"aquamarine2\",          0x76eec6 },\n        { \"aquamarine3\",          0x66cdaa },\n        { \"aquamarine4\",          0x458b74 },\n        { \"azure\",                0xf0ffff },\n        { \"azure1\",               0xf0ffff },\n        { \"azure2\",               0xe0eeee },\n        { \"azure3\",               0xc1cdcd },\n        { \"azure4\",               0x838b8b },\n        { \"beige\",                0xf5f5dc },\n        { \"bisque\",               0xffe4c4 },\n        { \"bisque1\",              0xffe4c4 },\n        { \"bisque2\",              0xeed5b7 },\n        { \"bisque3\",              0xcdb79e },\n        { \"bisque4\",              0x8b7d6b },\n        { \"black\",                0x000000 },\n        { \"blanchedalmond\",       0xffebcd },\n        { \"blue\",                 0x0000ff },\n        { \"blue1\",                0x0000ff },\n        { \"blue2\",                0x0000ee },\n        { \"blue3\",                0x0000cd },\n        { \"blue4\",                0x00008B },\n        { \"blueviolet\",           0x8a2be2 },\n        { \"brown\",                0xA52A2A },\n        { \"brown1\",               0xFF4040 },\n        { \"brown2\",               0xEE3B3B },\n        { \"brown3\",               0xCD3333 },\n        { \"brown4\",               0x8B2323 },\n        { \"burlywood\",            0xDEB887 },\n        { \"burlywood1\",           0xFFD39B },\n        { \"burlywood2\",           0xEEC591 },\n        { \"burlywood3\",           0xCDAA7D },\n        { \"burlywood4\",           0x8B7355 },\n        { \"cadetblue\",            0x5F9EA0 },\n        { \"cadetblue\",            0x5f9ea0 },\n        { \"cadetblue1\",           0x98f5ff },\n        { \"cadetblue2\",           0x8ee5ee },\n        { \"cadetblue3\",           0x7ac5cd },\n        { \"cadetblue4\",           0x53868b },\n        { \"chartreuse\",           0x7FFF00 },\n        { \"chartreuse1\",          0x7FFF00 },\n        { \"chartreuse2\",          0x76EE00 },\n        { \"chartreuse3\",          0x66CD00 },\n        { \"chartreuse4\",          0x458B00 },\n        { \"chocolate\",            0xD2691E },\n        { \"chocolate1\",           0xFF7F24 },\n        { \"chocolate2\",           0xEE7621 },\n        { \"chocolate3\",           0xCD661D },\n        { \"chocolate4\",           0x8B4513 },\n        { \"coral\",                0xFF7F50 },\n        { \"coral1\",               0xFF7256 },\n        { \"coral2\",               0xEE6A50 },\n        { \"coral3\",               0xCD5B45 },\n        { \"coral4\",               0x8B3E2F },\n        { \"cornflowerblue\",       0x6495ed },\n        { \"cornsilk\",             0xFFF8DC },\n        { \"cornsilk1\",            0xFFF8DC },\n        { \"cornsilk2\",            0xEEE8CD },\n        { \"cornsilk3\",            0xCDC8B1 },\n        { \"cornsilk4\",            0x8B8878 },\n        { \"crimson\",              0xDC143C },\n        { \"cyan\",                 0x00FFFF },\n        { \"cyan1\",                0x00FFFF },\n        { \"cyan2\",                0x00EEEE },\n        { \"cyan3\",                0x00CDCD },\n        { \"cyan4\",                0x008B8B },\n        { \"darkblue\",             0x00008b },\n        { \"darkcyan\",             0x008b8b },\n        { \"darkgoldenrod\",        0xb8860b },\n        { \"darkgoldenrod1\",       0xffb90f },\n        { \"darkgoldenrod2\",       0xeead0e },\n        { \"darkgoldenrod3\",       0xcd950c },\n        { \"darkgoldenrod4\",       0x8b6508 },\n        { \"darkgray\",             0xa9a9a9 },\n        { \"darkgreen\",            0x006400 },\n        { \"darkgrey\",             0xa9a9a9 },\n        { \"darkkhaki\",            0xbdb76b },\n        { \"darkmagenta\",          0x8b008b },\n        { \"darkolivegreen\",       0x556b2f },\n        { \"darkolivegreen1\",      0xcaff70 },\n        { \"darkolivegreen2\",      0xbcee68 },\n        { \"darkolivegreen3\",      0xa2cd5a },\n        { \"darkolivegreen4\",      0x6e8b3d },\n        { \"darkorange\",           0xff8c00 },\n        { \"darkorange1\",          0xff7f00 },\n        { \"darkorange2\",          0xee7600 },\n        { \"darkorange3\",          0xcd6600 },\n        { \"darkorange4\",          0x8b4500 },\n        { \"darkorchid\",           0x9932cc },\n        { \"darkorchid1\",          0xbf3eff },\n        { \"darkorchid2\",          0xb23aee },\n        { \"darkorchid3\",          0x9a32cd },\n        { \"darkorchid4\",          0x68228b },\n        { \"darkred\",              0x8b0000 },\n        { \"darksalmon\",           0xe9967a },\n        { \"darkseagreen\",         0x8fbc8f },\n        { \"darkseagreen1\",        0xc1ffc1 },\n        { \"darkseagreen2\",        0xb4eeb4 },\n        { \"darkseagreen3\",        0x9bcd9b },\n        { \"darkseagreen4\",        0x698b69 },\n        { \"darkslateblue\",        0x483d8b },\n        { \"darkslategray\",        0x2f4f4f },\n        { \"darkslategray1\",       0x97ffff },\n        { \"darkslategray2\",       0x8deeee },\n        { \"darkslategray3\",       0x79cdcd },\n        { \"darkslategray4\",       0x528b8b },\n        { \"darkslategrey\",        0x2f4f4f },\n        { \"darkturquoise\",        0x00ced1 },\n        { \"darkviolet\",           0x9400D3 },\n        { \"darkviolet\",           0x9400d3 },\n        { \"deeppink\",             0xff1493 },\n        { \"deeppink1\",            0xff1493 },\n        { \"deeppink2\",            0xee1289 },\n        { \"deeppink3\",            0xcd1076 },\n        { \"deeppink4\",            0x8b0a50 },\n        { \"deepskyblue\",          0x00bfff },\n        { \"deepskyblue1\",         0x00bfff },\n        { \"deepskyblue2\",         0x00b2ee },\n        { \"deepskyblue3\",         0x009acd },\n        { \"deepskyblue4\",         0x00688b },\n        { \"dimgray\",              0x696969 },\n        { \"dimgrey\",              0x696969 },\n        { \"dodgerblue\",           0x1e90ff },\n        { \"dodgerblue1\",          0x1e90ff },\n        { \"dodgerblue2\",          0x1c86ee },\n        { \"dodgerblue3\",          0x1874cd },\n        { \"dodgerblue4\",          0x104e8b },\n        { \"firebrick\",            0xB22222 },\n        { \"firebrick1\",           0xFF3030 },\n        { \"firebrick2\",           0xEE2C2C },\n        { \"firebrick3\",           0xCD2626 },\n        { \"firebrick4\",           0x8B1A1A },\n        { \"floralwhite\",          0xfffaf0 },\n        { \"forestgreen\",          0x228b22 },\n        { \"fractal\",              0x808080 },\n        { \"fuchsia\",              0xFF00FF },\n        { \"gainsboro\",            0xDCDCDC },\n        { \"ghostwhite\",           0xf8f8ff },\n        { \"gold\",                 0xFFD700 },\n        { \"gold1\",                0xFFD700 },\n        { \"gold2\",                0xEEC900 },\n        { \"gold3\",                0xCDAD00 },\n        { \"gold4\",                0x8B7500 },\n        { \"goldenrod\",            0xDAA520 },\n        { \"goldenrod1\",           0xFFC125 },\n        { \"goldenrod2\",           0xEEB422 },\n        { \"goldenrod3\",           0xCD9B1D },\n        { \"goldenrod4\",           0x8B6914 },\n        { \"gray\",                 0x7E7E7E },\n        { \"gray\",                 0xBEBEBE },\n        { \"gray0\",                0x000000 },\n        { \"gray1\",                0x030303 },\n        { \"gray10\",               0x1A1A1A },\n        { \"gray100\",              0xFFFFFF },\n        { \"gray11\",               0x1C1C1C },\n        { \"gray12\",               0x1F1F1F },\n        { \"gray13\",               0x212121 },\n        { \"gray14\",               0x242424 },\n        { \"gray15\",               0x262626 },\n        { \"gray16\",               0x292929 },\n        { \"gray17\",               0x2B2B2B },\n        { \"gray18\",               0x2E2E2E },\n        { \"gray19\",               0x303030 },\n        { \"gray2\",                0x050505 },\n        { \"gray20\",               0x333333 },\n        { \"gray21\",               0x363636 },\n        { \"gray22\",               0x383838 },\n        { \"gray23\",               0x3B3B3B },\n        { \"gray24\",               0x3D3D3D },\n        { \"gray25\",               0x404040 },\n        { \"gray26\",               0x424242 },\n        { \"gray27\",               0x454545 },\n        { \"gray28\",               0x474747 },\n        { \"gray29\",               0x4A4A4A },\n        { \"gray3\",                0x080808 },\n        { \"gray30\",               0x4D4D4D },\n        { \"gray31\",               0x4F4F4F },\n        { \"gray32\",               0x525252 },\n        { \"gray33\",               0x545454 },\n        { \"gray34\",               0x575757 },\n        { \"gray35\",               0x595959 },\n        { \"gray36\",               0x5C5C5C },\n        { \"gray37\",               0x5E5E5E },\n        { \"gray38\",               0x616161 },\n        { \"gray39\",               0x636363 },\n        { \"gray4\",                0x0A0A0A },\n        { \"gray40\",               0x666666 },\n        { \"gray41\",               0x696969 },\n        { \"gray42\",               0x6B6B6B },\n        { \"gray43\",               0x6E6E6E },\n        { \"gray44\",               0x707070 },\n        { \"gray45\",               0x737373 },\n        { \"gray46\",               0x757575 },\n        { \"gray47\",               0x787878 },\n        { \"gray48\",               0x7A7A7A },\n        { \"gray49\",               0x7D7D7D },\n        { \"gray5\",                0x0D0D0D },\n        { \"gray50\",               0x7F7F7F },\n        { \"gray51\",               0x828282 },\n        { \"gray52\",               0x858585 },\n        { \"gray53\",               0x878787 },\n        { \"gray54\",               0x8A8A8A },\n        { \"gray55\",               0x8C8C8C },\n        { \"gray56\",               0x8F8F8F },\n        { \"gray57\",               0x919191 },\n        { \"gray58\",               0x949494 },\n        { \"gray59\",               0x969696 },\n        { \"gray6\",                0x0F0F0F },\n        { \"gray60\",               0x999999 },\n        { \"gray61\",               0x9C9C9C },\n        { \"gray62\",               0x9E9E9E },\n        { \"gray63\",               0xA1A1A1 },\n        { \"gray64\",               0xA3A3A3 },\n        { \"gray65\",               0xA6A6A6 },\n        { \"gray66\",               0xA8A8A8 },\n        { \"gray67\",               0xABABAB },\n        { \"gray68\",               0xADADAD },\n        { \"gray69\",               0xB0B0B0 },\n        { \"gray7\",                0x121212 },\n        { \"gray70\",               0xB3B3B3 },\n        { \"gray71\",               0xB5B5B5 },\n        { \"gray72\",               0xB8B8B8 },\n        { \"gray73\",               0xBABABA },\n        { \"gray74\",               0xBDBDBD },\n        { \"gray75\",               0xBFBFBF },\n        { \"gray76\",               0xC2C2C2 },\n        { \"gray77\",               0xC4C4C4 },\n        { \"gray78\",               0xC7C7C7 },\n        { \"gray79\",               0xC9C9C9 },\n        { \"gray8\",                0x141414 },\n        { \"gray80\",               0xCCCCCC },\n        { \"gray81\",               0xCFCFCF },\n        { \"gray82\",               0xD1D1D1 },\n        { \"gray83\",               0xD4D4D4 },\n        { \"gray84\",               0xD6D6D6 },\n        { \"gray85\",               0xD9D9D9 },\n        { \"gray86\",               0xDBDBDB },\n        { \"gray87\",               0xDEDEDE },\n        { \"gray88\",               0xE0E0E0 },\n        { \"gray89\",               0xE3E3E3 },\n        { \"gray9\",                0x171717 },\n        { \"gray90\",               0xE5E5E5 },\n        { \"gray91\",               0xE8E8E8 },\n        { \"gray92\",               0xEBEBEB },\n        { \"gray93\",               0xEDEDED },\n        { \"gray94\",               0xF0F0F0 },\n        { \"gray95\",               0xF2F2F2 },\n        { \"gray96\",               0xF5F5F5 },\n        { \"gray97\",               0xF7F7F7 },\n        { \"gray98\",               0xFAFAFA },\n        { \"gray99\",               0xFCFCFC },\n        { \"green\",                0x008000 },\n        { \"green\",                0x00FF00 },\n        { \"green1\",               0x00FF00 },\n        { \"green2\",               0x00EE00 },\n        { \"green3\",               0x00CD00 },\n        { \"green4\",               0x008B00 },\n        { \"greenyellow\",          0xadff2f },\n        { \"grey\",                 0xBEBEBE },\n        { \"grey0\",                0x000000 },\n        { \"grey1\",                0x030303 },\n        { \"grey10\",               0x1A1A1A },\n        { \"grey100\",              0xFFFFFF },\n        { \"grey11\",               0x1C1C1C },\n        { \"grey12\",               0x1F1F1F },\n        { \"grey13\",               0x212121 },\n        { \"grey14\",               0x242424 },\n        { \"grey15\",               0x262626 },\n        { \"grey16\",               0x292929 },\n        { \"grey17\",               0x2B2B2B },\n        { \"grey18\",               0x2E2E2E },\n        { \"grey19\",               0x303030 },\n        { \"grey2\",                0x050505 },\n        { \"grey20\",               0x333333 },\n        { \"grey21\",               0x363636 },\n        { \"grey22\",               0x383838 },\n        { \"grey23\",               0x3B3B3B },\n        { \"grey24\",               0x3D3D3D },\n        { \"grey25\",               0x404040 },\n        { \"grey26\",               0x424242 },\n        { \"grey27\",               0x454545 },\n        { \"grey28\",               0x474747 },\n        { \"grey29\",               0x4A4A4A },\n        { \"grey3\",                0x080808 },\n        { \"grey30\",               0x4D4D4D },\n        { \"grey31\",               0x4F4F4F },\n        { \"grey32\",               0x525252 },\n        { \"grey33\",               0x545454 },\n        { \"grey34\",               0x575757 },\n        { \"grey35\",               0x595959 },\n        { \"grey36\",               0x5C5C5C },\n        { \"grey37\",               0x5E5E5E },\n        { \"grey38\",               0x616161 },\n        { \"grey39\",               0x636363 },\n        { \"grey4\",                0x0A0A0A },\n        { \"grey40\",               0x666666 },\n        { \"grey41\",               0x696969 },\n        { \"grey42\",               0x6B6B6B },\n        { \"grey43\",               0x6E6E6E },\n        { \"grey44\",               0x707070 },\n        { \"grey45\",               0x737373 },\n        { \"grey46\",               0x757575 },\n        { \"grey47\",               0x787878 },\n        { \"grey48\",               0x7A7A7A },\n        { \"grey49\",               0x7D7D7D },\n        { \"grey5\",                0x0D0D0D },\n        { \"grey50\",               0x7F7F7F },\n        { \"grey51\",               0x828282 },\n        { \"grey52\",               0x858585 },\n        { \"grey53\",               0x878787 },\n        { \"grey54\",               0x8A8A8A },\n        { \"grey55\",               0x8C8C8C },\n        { \"grey56\",               0x8F8F8F },\n        { \"grey57\",               0x919191 },\n        { \"grey58\",               0x949494 },\n        { \"grey59\",               0x969696 },\n        { \"grey6\",                0x0F0F0F },\n        { \"grey60\",               0x999999 },\n        { \"grey61\",               0x9C9C9C },\n        { \"grey62\",               0x9E9E9E },\n        { \"grey63\",               0xA1A1A1 },\n        { \"grey64\",               0xA3A3A3 },\n        { \"grey65\",               0xA6A6A6 },\n        { \"grey66\",               0xA8A8A8 },\n        { \"grey67\",               0xABABAB },\n        { \"grey68\",               0xADADAD },\n        { \"grey69\",               0xB0B0B0 },\n        { \"grey7\",                0x121212 },\n        { \"grey70\",               0xB3B3B3 },\n        { \"grey71\",               0xB5B5B5 },\n        { \"grey72\",               0xB8B8B8 },\n        { \"grey73\",               0xBABABA },\n        { \"grey74\",               0xBDBDBD },\n        { \"grey75\",               0xBFBFBF },\n        { \"grey76\",               0xC2C2C2 },\n        { \"grey77\",               0xC4C4C4 },\n        { \"grey78\",               0xC7C7C7 },\n        { \"grey79\",               0xC9C9C9 },\n        { \"grey8\",                0x141414 },\n        { \"grey80\",               0xCCCCCC },\n        { \"grey81\",               0xCFCFCF },\n        { \"grey82\",               0xD1D1D1 },\n        { \"grey83\",               0xD4D4D4 },\n        { \"grey84\",               0xD6D6D6 },\n        { \"grey85\",               0xD9D9D9 },\n        { \"grey86\",               0xDBDBDB },\n        { \"grey87\",               0xDEDEDE },\n        { \"grey88\",               0xE0E0E0 },\n        { \"grey89\",               0xE3E3E3 },\n        { \"grey9\",                0x171717 },\n        { \"grey90\",               0xE5E5E5 },\n        { \"grey91\",               0xE8E8E8 },\n        { \"grey92\",               0xEBEBEB },\n        { \"grey93\",               0xEDEDED },\n        { \"grey94\",               0xF0F0F0 },\n        { \"grey95\",               0xF2F2F2 },\n        { \"grey96\",               0xF5F5F5 },\n        { \"grey97\",               0xF7F7F7 },\n        { \"grey98\",               0xFAFAFA },\n        { \"grey99\",               0xFCFCFC },\n        { \"honeydew\",             0xF0FFF0 },\n        { \"honeydew1\",            0xF0FFF0 },\n        { \"honeydew2\",            0xE0EEE0 },\n        { \"honeydew3\",            0xC1CDC1 },\n        { \"honeydew4\",            0x838B83 },\n        { \"hotpink\",              0xff69b4 },\n        { \"hotpink1\",             0xff6eb4 },\n        { \"hotpink2\",             0xee6aa7 },\n        { \"hotpink3\",             0xcd6090 },\n        { \"hotpink4\",             0x8b3a62 },\n        { \"indianred\",            0xcd5c5c },\n        { \"indianred1\",           0xff6a6a },\n        { \"indianred2\",           0xee6363 },\n        { \"indianred3\",           0xcd5555 },\n        { \"indianred4\",           0x8b3a3a },\n        { \"indigo\",               0x4B0082 },\n        { \"ivory\",                0xFFFFF0 },\n        { \"ivory1\",               0xFFFFF0 },\n        { \"ivory2\",               0xEEEEE0 },\n        { \"ivory3\",               0xCDCDC1 },\n        { \"ivory4\",               0x8B8B83 },\n        { \"khaki\",                0xF0E68C },\n        { \"khaki1\",               0xFFF68F },\n        { \"khaki2\",               0xEEE685 },\n        { \"khaki3\",               0xCDC673 },\n        { \"khaki4\",               0x8B864E },\n        { \"lavender\",             0xE6E6FA },\n        { \"lavenderblush\",        0xfff0f5 },\n        { \"lavenderblush1\",       0xfff0f5 },\n        { \"lavenderblush2\",       0xeee0e5 },\n        { \"lavenderblush3\",       0xcdc1c5 },\n        { \"lavenderblush4\",       0x8b8386 },\n        { \"lawngreen\",            0x7cfc00 },\n        { \"lemonchiffon\",         0xfffacd },\n        { \"lemonchiffon1\",        0xfffacd },\n        { \"lemonchiffon2\",        0xeee9bf },\n        { \"lemonchiffon3\",        0xcdc9a5 },\n        { \"lemonchiffon4\",        0x8b8970 },\n        { \"lightblue\",            0xadd8e6 },\n        { \"lightblue1\",           0xbfefff },\n        { \"lightblue2\",           0xb2dfee },\n        { \"lightblue3\",           0x9ac0cd },\n        { \"lightblue4\",           0x68838b },\n        { \"lightcoral\",           0xf08080 },\n        { \"lightcyan\",            0xe0ffff },\n        { \"lightcyan1\",           0xe0ffff },\n        { \"lightcyan2\",           0xd1eeee },\n        { \"lightcyan3\",           0xb4cdcd },\n        { \"lightcyan4\",           0x7a8b8b },\n        { \"lightgoldenrod\",       0xeedd82 },\n        { \"lightgoldenrod1\",      0xffec8b },\n        { \"lightgoldenrod2\",      0xeedc82 },\n        { \"lightgoldenrod3\",      0xcdbe70 },\n        { \"lightgoldenrod4\",      0x8b814c },\n        { \"lightgoldenrodyellow\", 0xfafad2 },\n        { \"lightgray\",            0xd3d3d3 },\n        { \"lightgreen\",           0x90ee90 },\n        { \"lightgrey\",            0xd3d3d3 },\n        { \"lightpink\",            0xffb6c1 },\n        { \"lightpink1\",           0xffaeb9 },\n        { \"lightpink2\",           0xeea2ad },\n        { \"lightpink3\",           0xcd8c95 },\n        { \"lightpink4\",           0x8b5f65 },\n        { \"lightsalmon\",          0xffa07a },\n        { \"lightsalmon1\",         0xffa07a },\n        { \"lightsalmon2\",         0xee9572 },\n        { \"lightsalmon3\",         0xcd8162 },\n        { \"lightsalmon4\",         0x8b5742 },\n        { \"lightseagreen\",        0x20b2aa },\n        { \"lightskyblue\",         0x87cefa },\n        { \"lightskyblue1\",        0xb0e2ff },\n        { \"lightskyblue2\",        0xa4d3ee },\n        { \"lightskyblue3\",        0x8db6cd },\n        { \"lightskyblue4\",        0x607b8b },\n        { \"lightslateblue\",       0x8470ff },\n        { \"lightslategray\",       0x778899 },\n        { \"lightslategrey\",       0x778899 },\n        { \"lightsteelblue\",       0xb0c4de },\n        { \"lightsteelblue1\",      0xcae1ff },\n        { \"lightsteelblue2\",      0xbcd2ee },\n        { \"lightsteelblue3\",      0xa2b5cd },\n        { \"lightsteelblue4\",      0x6e7b8b },\n        { \"lightyellow\",          0xffffe0 },\n        { \"lightyellow1\",         0xffffe0 },\n        { \"lightyellow2\",         0xeeeed1 },\n        { \"lightyellow3\",         0xcdcdb4 },\n        { \"lightyellow4\",         0x8b8b7a },\n        { \"lime\",                 0x00FF00 },\n        { \"limegreen\",            0x32cd32 },\n        { \"linen\",                0xFAF0E6 },\n        { \"magenta\",              0xFF00FF },\n        { \"magenta1\",             0xFF00FF },\n        { \"magenta2\",             0xEE00EE },\n        { \"magenta3\",             0xCD00CD },\n        { \"magenta4\",             0x8B008B },\n        { \"maroon\",               0x800000 },\n        { \"maroon\",               0xB03060 },\n        { \"maroon1\",              0xFF34B3 },\n        { \"maroon2\",              0xEE30A7 },\n        { \"maroon3\",              0xCD2990 },\n        { \"maroon4\",              0x8B1C62 },\n        { \"mediumaquamarine\",     0x66cdaa },\n        { \"mediumblue\",           0x0000cd },\n        { \"mediumforestgreen\",    0x32814b },\n        { \"mediumgoldenrod\",      0xd1c166 },\n        { \"mediumorchid\",         0xba55d3 },\n        { \"mediumorchid1\",        0xe066ff },\n        { \"mediumorchid2\",        0xd15fee },\n        { \"mediumorchid3\",        0xb452cd },\n        { \"mediumorchid4\",        0x7a378b },\n        { \"mediumpurple\",         0x9370db },\n        { \"mediumpurple1\",        0xab82ff },\n        { \"mediumpurple2\",        0x9f79ee },\n        { \"mediumpurple3\",        0x8968cd },\n        { \"mediumpurple4\",        0x5d478b },\n        { \"mediumseagreen\",       0x3cb371 },\n        { \"mediumslateblue\",      0x7b68ee },\n        { \"mediumspringgreen\",    0x00fa9a },\n        { \"mediumturquoise\",      0x48d1cc },\n        { \"mediumvioletred\",      0xc71585 },\n        { \"midnightblue\",         0x191970 },\n        { \"mintcream\",            0xf5fffa },\n        { \"mistyrose\",            0xffe4e1 },\n        { \"mistyrose1\",           0xffe4e1 },\n        { \"mistyrose2\",           0xeed5d2 },\n        { \"mistyrose3\",           0xcdb7b5 },\n        { \"mistyrose4\",           0x8b7d7b },\n        { \"moccasin\",             0xFFE4B5 },\n        { \"navajowhite\",          0xffdead },\n        { \"navajowhite1\",         0xffdead },\n        { \"navajowhite2\",         0xeecfa1 },\n        { \"navajowhite3\",         0xcdb38b },\n        { \"navajowhite4\",         0x8b795e },\n        { \"navy\",                 0x000080 },\n        { \"navyblue\",             0x000080 },\n        { \"none\",                 0x0000FF },\n        { \"oldlace\",              0xfdf5e6 },\n        { \"olive\",                0x808000 },\n        { \"olivedrab\",            0x6b8e23 },\n        { \"olivedrab1\",           0xc0ff3e },\n        { \"olivedrab2\",           0xb3ee3a },\n        { \"olivedrab3\",           0x9acd32 },\n        { \"olivedrab4\",           0x698b22 },\n        { \"opaque\",               0x000000 },\n        { \"orange\",               0xFFA500 },\n        { \"orange1\",              0xFFA500 },\n        { \"orange2\",              0xEE9A00 },\n        { \"orange3\",              0xCD8500 },\n        { \"orange4\",              0x8B5A00 },\n        { \"orangered\",            0xff4500 },\n        { \"orangered1\",           0xff4500 },\n        { \"orangered2\",           0xee4000 },\n        { \"orangered3\",           0xcd3700 },\n        { \"orangered4\",           0x8b2500 },\n        { \"orchid\",               0xDA70D6 },\n        { \"orchid1\",              0xFF83FA },\n        { \"orchid2\",              0xEE7AE9 },\n        { \"orchid3\",              0xCD69C9 },\n        { \"orchid4\",              0x8B4789 },\n        { \"palegoldenrod\",        0xeee8aa },\n        { \"palegreen\",            0x98fb98 },\n        { \"palegreen1\",           0x9aff9a },\n        { \"palegreen2\",           0x90ee90 },\n        { \"palegreen3\",           0x7ccd7c },\n        { \"palegreen4\",           0x548b54 },\n        { \"paleturquoise\",        0xafeeee },\n        { \"paleturquoise1\",       0xbbffff },\n        { \"paleturquoise2\",       0xaeeeee },\n        { \"paleturquoise3\",       0x96cdcd },\n        { \"paleturquoise4\",       0x668b8b },\n        { \"palevioletred\",        0xdb7093 },\n        { \"palevioletred1\",       0xff82ab },\n        { \"palevioletred2\",       0xee799f },\n        { \"palevioletred3\",       0xcd6889 },\n        { \"palevioletred4\",       0x8b475d },\n        { \"papayawhip\",           0xffefd5 },\n        { \"peachpuff\",            0xffdab9 },\n        { \"peachpuff1\",           0xffdab9 },\n        { \"peachpuff2\",           0xeecbad },\n        { \"peachpuff3\",           0xcdaf95 },\n        { \"peachpuff4\",           0x8b7765 },\n        { \"peru\",                 0xCD853F },\n        { \"pink\",                 0xFFC0CB },\n        { \"pink1\",                0xFFB5C5 },\n        { \"pink2\",                0xEEA9B8 },\n        { \"pink3\",                0xCD919E },\n        { \"pink4\",                0x8B636C },\n        { \"plum\",                 0xDDA0DD },\n        { \"plum1\",                0xFFBBFF },\n        { \"plum2\",                0xEEAEEE },\n        { \"plum3\",                0xCD96CD },\n        { \"plum4\",                0x8B668B },\n        { \"powderblue\",           0xb0e0e6 },\n        { \"purple\",               0x800080 },\n        { \"purple\",               0xA020F0 },\n        { \"purple1\",              0x9B30FF },\n        { \"purple2\",              0x912CEE },\n        { \"purple3\",              0x7D26CD },\n        { \"purple4\",              0x551A8B },\n        { \"red\",                  0xFF0000 },\n        { \"red1\",                 0xFF0000 },\n        { \"red2\",                 0xEE0000 },\n        { \"red3\",                 0xCD0000 },\n        { \"red4\",                 0x8B0000 },\n        { \"rosybrown\",            0xbc8f8f },\n        { \"rosybrown1\",           0xffc1c1 },\n        { \"rosybrown2\",           0xeeb4b4 },\n        { \"rosybrown3\",           0xcd9b9b },\n        { \"rosybrown4\",           0x8b6969 },\n        { \"royalblue\",            0x4169e1 },\n        { \"royalblue1\",           0x4876ff },\n        { \"royalblue2\",           0x436eee },\n        { \"royalblue3\",           0x3a5fcd },\n        { \"royalblue4\",           0x27408b },\n        { \"saddlebrown\",          0x8b4513 },\n        { \"salmon\",               0xFA8072 },\n        { \"salmon1\",              0xFF8C69 },\n        { \"salmon2\",              0xEE8262 },\n        { \"salmon3\",              0xCD7054 },\n        { \"salmon4\",              0x8B4C39 },\n        { \"sandybrown\",           0xf4a460 },\n        { \"seagreen\",             0x2e8b57 },\n        { \"seagreen1\",            0x54ff9f },\n        { \"seagreen2\",            0x4eee94 },\n        { \"seagreen3\",            0x43cd80 },\n        { \"seagreen4\",            0x2e8b57 },\n        { \"seashell\",             0xFFF5EE },\n        { \"seashell1\",            0xFFF5EE },\n        { \"seashell2\",            0xEEE5DE },\n        { \"seashell3\",            0xCDC5BF },\n        { \"seashell4\",            0x8B8682 },\n        { \"sienna\",               0xA0522D },\n        { \"sienna1\",              0xFF8247 },\n        { \"sienna2\",              0xEE7942 },\n        { \"sienna3\",              0xCD6839 },\n        { \"sienna4\",              0x8B4726 },\n        { \"silver\",               0xC0C0C0 },\n        { \"skyblue\",              0x87ceeb },\n        { \"skyblue1\",             0x87ceff },\n        { \"skyblue2\",             0x7ec0ee },\n        { \"skyblue3\",             0x6ca6cd },\n        { \"skyblue4\",             0x4a708b },\n        { \"slateblue\",            0x6a5acd },\n        { \"slateblue1\",           0x836fff },\n        { \"slateblue2\",           0x7a67ee },\n        { \"slateblue3\",           0x6959cd },\n        { \"slateblue4\",           0x473c8b },\n        { \"slategray\",            0x708090 },\n        { \"slategray1\",           0xc6e2ff },\n        { \"slategray2\",           0xb9d3ee },\n        { \"slategray3\",           0x9fb6cd },\n        { \"slategray4\",           0x6c7b8b },\n        { \"slategrey\",            0x708090 },\n        { \"snow\",                 0xFFFAFA },\n        { \"snow1\",                0xFFFAFA },\n        { \"snow2\",                0xEEE9E9 },\n        { \"snow3\",                0xCDC9C9 },\n        { \"snow4\",                0x8B8989 },\n        { \"springgreen\",          0x00ff7f },\n        { \"springgreen1\",         0x00ff7f },\n        { \"springgreen2\",         0x00ee76 },\n        { \"springgreen3\",         0x00cd66 },\n        { \"springgreen4\",         0x008b45 },\n        { \"steelblue\",            0x4682b4 },\n        { \"steelblue1\",           0x63b8ff },\n        { \"steelblue2\",           0x5cacee },\n        { \"steelblue3\",           0x4f94cd },\n        { \"steelblue4\",           0x36648b },\n        { \"tan\",                  0xD2B48C },\n        { \"tan1\",                 0xFFA54F },\n        { \"tan2\",                 0xEE9A49 },\n        { \"tan3\",                 0xCD853F },\n        { \"tan4\",                 0x8B5A2B },\n        { \"teal\",                 0x008080 },\n        { \"thistle\",              0xD8BFD8 },\n        { \"thistle1\",             0xFFE1FF },\n        { \"thistle2\",             0xEED2EE },\n        { \"thistle3\",             0xCDB5CD },\n        { \"thistle4\",             0x8B7B8B },\n        { \"tomato\",               0xFF6347 },\n        { \"tomato1\",              0xFF6347 },\n        { \"tomato2\",              0xEE5C42 },\n        { \"tomato3\",              0xCD4F39 },\n        { \"tomato4\",              0x8B3626 },\n        { \"transparent\",          0x0000FF },\n        { \"turquoise\",            0x40E0D0 },\n        { \"turquoise1\",           0x00F5FF },\n        { \"turquoise2\",           0x00E5EE },\n        { \"turquoise3\",           0x00C5CD },\n        { \"turquoise4\",           0x00868B },\n        { \"violet\",               0xEE82EE },\n        { \"violetred\",            0xd02090 },\n        { \"violetred1\",           0xff3e96 },\n        { \"violetred2\",           0xee3a8c },\n        { \"violetred3\",           0xcd3278 },\n        { \"violetred4\",           0x8b2252 },\n        { \"wheat\",                0xF5DEB3 },\n        { \"wheat1\",               0xFFE7BA },\n        { \"wheat2\",               0xEED8AE },\n        { \"wheat3\",               0xCDBA96 },\n        { \"wheat4\",               0x8B7E66 },\n        { \"white\",                0xFFFFFF },\n        { \"whitesmoke\",           0xf5f5f5 },\n        { \"yellow\",               0xFFFF00 },\n        { \"yellow1\",              0xFFFF00 },\n        { \"yellow2\",              0xEEEE00 },\n        { \"yellow3\",              0xCDCD00 },\n        { \"yellow4\",              0x8B8B00 },\n        { \"yellowgreen\",          0x9acd32 },\n#endif /* EXTENDED_XPM_COLORS */\n        {\"none\",                  0xFFFFFF}\n    };\n\n    if (spec[0] == '#') {\n        char buf[7];\n        switch(speclen) {\n        case 4:\n            buf[0] = buf[1] = spec[1];\n            buf[2] = buf[3] = spec[2];\n            buf[4] = buf[5] = spec[3];\n            break;\n        case 7:\n            SDL_memcpy(buf, spec + 1, 6);\n            break;\n        case 13:\n            buf[0] = spec[1];\n            buf[1] = spec[2];\n            buf[2] = spec[5];\n            buf[3] = spec[6];\n            buf[4] = spec[9];\n            buf[5] = spec[10];\n            break;\n        }\n        buf[6] = '\\0';\n        *rgb = SDL_strtol(buf, NULL, 16);\n        return 1;\n    } else {\n        int i;\n        for (i = 0; i < SDL_arraysize(known); i++) {\n            if (SDL_strncasecmp(known[i].name, spec, speclen) == 0) {\n                *rgb = known[i].rgb;\n                return 1;\n            }\n        }\n        return 0;\n    }\n}\n\n#ifndef MAX\n#define MAX(a, b) ((a) > (b) ? (a) : (b))\n#endif\n\nstatic char *linebuf;\nstatic int buflen;\nstatic char *error;\n\n/*\n * Read next line from the source.\n * If len > 0, it's assumed to be at least len chars (for efficiency).\n * Return NULL and set error upon EOF or parse error.\n */\nstatic char *get_next_line(char ***lines, SDL_RWops *src, int len)\n{\n    char *linebufnew;\n\n    if (lines) {\n        return *(*lines)++;\n    } else {\n        char c;\n        int n;\n        do {\n            if (SDL_RWread(src, &c, 1, 1) <= 0) {\n                error = \"Premature end of data\";\n                return NULL;\n            }\n        } while (c != '\"');\n        if (len) {\n            len += 4;   /* \"\\\",\\n\\0\" */\n            if (len > buflen){\n                buflen = len;\n                linebufnew = (char *)SDL_realloc(linebuf, buflen);\n                if (!linebufnew) {\n                    SDL_free(linebuf);\n                    error = \"Out of memory\";\n                    return NULL;\n                }\n                linebuf = linebufnew;\n            }\n            if (SDL_RWread(src, linebuf, len - 1, 1) <= 0) {\n                error = \"Premature end of data\";\n                return NULL;\n            }\n            n = len - 2;\n        } else {\n            n = 0;\n            do {\n                if (n >= buflen - 1) {\n                    if (buflen == 0)\n                        buflen = 16;\n                    buflen *= 2;\n                    linebufnew = (char *)SDL_realloc(linebuf, buflen);\n                    if (!linebufnew) {\n                        SDL_free(linebuf);\n                        error = \"Out of memory\";\n                        return NULL;\n                    }\n                    linebuf = linebufnew;\n                }\n                if (SDL_RWread(src, linebuf + n, 1, 1) <= 0) {\n                    error = \"Premature end of data\";\n                    return NULL;\n                }\n            } while (linebuf[n++] != '\"');\n            n--;\n        }\n        linebuf[n] = '\\0';\n        return linebuf;\n    }\n}\n\n#define SKIPSPACE(p)                \\\ndo {                        \\\n    while (SDL_isspace((unsigned char)*(p))) \\\n          ++(p);                \\\n} while (0)\n\n#define SKIPNONSPACE(p)                 \\\ndo {                            \\\n    while (!SDL_isspace((unsigned char)*(p)) && *p)  \\\n          ++(p);                    \\\n} while (0)\n\n/* read XPM from either array or RWops */\nstatic SDL_Surface *load_xpm(char **xpm, SDL_RWops *src)\n{\n    Sint64 start = 0;\n    SDL_Surface *image = NULL;\n    int index;\n    int x, y;\n    int w, h, ncolors, cpp;\n    int indexed;\n    Uint8 *dst;\n    struct color_hash *colors = NULL;\n    SDL_Color *im_colors = NULL;\n    char *keystrings = NULL, *nextkey;\n    char *line;\n    char ***xpmlines = NULL;\n    int pixels_len;\n\n    error = NULL;\n    linebuf = NULL;\n    buflen = 0;\n\n    if (src)\n        start = SDL_RWtell(src);\n\n    if (xpm)\n        xpmlines = &xpm;\n\n    line = get_next_line(xpmlines, src, 0);\n    if (!line)\n        goto done;\n    /*\n     * The header string of an XPMv3 image has the format\n     *\n     * <width> <height> <ncolors> <cpp> [ <hotspot_x> <hotspot_y> ]\n     *\n     * where the hotspot coords are intended for mouse cursors.\n     * Right now we don't use the hotspots but it should be handled\n     * one day.\n     */\n    if (SDL_sscanf(line, \"%d %d %d %d\", &w, &h, &ncolors, &cpp) != 4\n       || w <= 0 || h <= 0 || ncolors <= 0 || cpp <= 0) {\n        error = \"Invalid format description\";\n        goto done;\n    }\n\n    keystrings = (char *)SDL_malloc(ncolors * cpp);\n    if (!keystrings) {\n        error = \"Out of memory\";\n        goto done;\n    }\n    nextkey = keystrings;\n\n    /* Create the new surface */\n    if (ncolors <= 256) {\n        indexed = 1;\n        image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 8,\n                         0, 0, 0, 0);\n        im_colors = image->format->palette->colors;\n        image->format->palette->ncolors = ncolors;\n    } else {\n        indexed = 0;\n        image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32,\n                         0xff0000, 0x00ff00, 0x0000ff, 0);\n    }\n    if (!image) {\n        /* Hmm, some SDL error (out of memory?) */\n        goto done;\n    }\n\n    /* Read the colors */\n    colors = create_colorhash(ncolors);\n    if (!colors) {\n        error = \"Out of memory\";\n        goto done;\n    }\n    for (index = 0; index < ncolors; ++index ) {\n        char *p;\n        line = get_next_line(xpmlines, src, 0);\n        if (!line)\n            goto done;\n\n        p = line + cpp + 1;\n\n        /* parse a colour definition */\n        for (;;) {\n            char nametype;\n            char *colname;\n            Uint32 rgb, pixel;\n\n            SKIPSPACE(p);\n            if (!*p) {\n                error = \"colour parse error\";\n                goto done;\n            }\n            nametype = *p;\n            SKIPNONSPACE(p);\n            SKIPSPACE(p);\n            colname = p;\n            SKIPNONSPACE(p);\n            if (nametype == 's')\n                continue;      /* skip symbolic colour names */\n\n            if (!color_to_rgb(colname, p - colname, &rgb))\n                continue;\n\n            SDL_memcpy(nextkey, line, cpp);\n            if (indexed) {\n                SDL_Color *c = im_colors + index;\n                c->r = (Uint8)(rgb >> 16);\n                c->g = (Uint8)(rgb >> 8);\n                c->b = (Uint8)(rgb);\n                pixel = index;\n            } else\n                pixel = rgb;\n            add_colorhash(colors, nextkey, cpp, pixel);\n            nextkey += cpp;\n            if (rgb == 0xffffffff)\n                SDL_SetColorKey(image, SDL_TRUE, pixel);\n            break;\n        }\n    }\n\n    /* Read the pixels */\n    pixels_len = w * cpp;\n    dst = (Uint8 *)image->pixels;\n    for (y = 0; y < h; y++) {\n        line = get_next_line(xpmlines, src, pixels_len);\n        if (!line)\n            goto done;\n\n        if (indexed) {\n            /* optimization for some common cases */\n            if (cpp == 1)\n                for (x = 0; x < w; x++)\n                    dst[x] = (Uint8)QUICK_COLORHASH(colors,\n                                 line + x);\n            else\n                for (x = 0; x < w; x++)\n                    dst[x] = (Uint8)get_colorhash(colors,\n                                   line + x * cpp,\n                                   cpp);\n        } else {\n            for (x = 0; x < w; x++)\n                ((Uint32*)dst)[x] = get_colorhash(colors,\n                                line + x * cpp,\n                                  cpp);\n        }\n        dst += image->pitch;\n    }\n\ndone:\n    if (error) {\n        if ( src )\n            SDL_RWseek(src, start, RW_SEEK_SET);\n        if ( image ) {\n            SDL_FreeSurface(image);\n            image = NULL;\n        }\n        IMG_SetError(\"%s\", error);\n    }\n    if (keystrings)\n        SDL_free(keystrings);\n    free_colorhash(colors);\n    if (linebuf)\n        SDL_free(linebuf);\n    return(image);\n}\n\n/* Load a XPM type image from an RWops datasource */\nSDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src)\n{\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    return load_xpm(NULL, src);\n}\n\nSDL_Surface *IMG_ReadXPMFromArray(char **xpm)\n{\n    if (!xpm) {\n        IMG_SetError(\"array is NULL\");\n        return NULL;\n    }\n    return load_xpm(xpm, NULL);\n}\n\n#else  /* not LOAD_XPM */\n\n/* See if an image is contained in a data source */\nint IMG_isXPM(SDL_RWops *src)\n{\n    return(0);\n}\n\n\n/* Load a XPM type image from an SDL datasource */\nSDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\nSDL_Surface *IMG_ReadXPMFromArray(char **xpm)\n{\n    return NULL;\n}\n#endif /* not LOAD_XPM */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_xv.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* This is a XV thumbnail image file loading framework */\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_XV\n\nstatic int get_line(SDL_RWops *src, char *line, int size)\n{\n    while ( size > 0 ) {\n        if ( SDL_RWread(src, line, 1, 1) <= 0 ) {\n            return -1;\n        }\n        if ( *line == '\\r' ) {\n            continue;\n        }\n        if ( *line == '\\n' ) {\n            *line = '\\0';\n            return 0;\n        }\n        ++line;\n        --size;\n    }\n    /* Out of space for the line */\n    return -1;\n}\n\nstatic int get_header(SDL_RWops *src, int *w, int *h)\n{\n    char line[1024];\n\n    *w = 0;\n    *h = 0;\n\n    /* Check the header magic */\n    if ( (get_line(src, line, sizeof(line)) < 0) ||\n         (SDL_memcmp(line, \"P7 332\", 6) != 0) ) {\n        return -1;\n    }\n\n    /* Read the header */\n    while ( get_line(src, line, sizeof(line)) == 0 ) {\n        if ( SDL_memcmp(line, \"#BUILTIN:\", 9) == 0 ) {\n            /* Builtin image, no data */\n            break;\n        }\n        if ( SDL_memcmp(line, \"#END_OF_COMMENTS\", 16) == 0 ) {\n            if ( get_line(src, line, sizeof(line)) == 0 ) {\n                SDL_sscanf(line, \"%d %d\", w, h);\n                if ( *w >= 0 && *h >= 0 ) {\n                    return 0;\n                }\n            }\n            break;\n        }\n    }\n    /* No image data */\n    return -1;\n}\n\n/* See if an image is contained in a data source */\nint IMG_isXV(SDL_RWops *src)\n{\n    Sint64 start;\n    int is_XV;\n    int w, h;\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_XV = 0;\n    if ( get_header(src, &w, &h) == 0 ) {\n        is_XV = 1;\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_XV);\n}\n\n/* Load a XV thumbnail image from an SDL datasource */\nSDL_Surface *IMG_LoadXV_RW(SDL_RWops *src)\n{\n    Sint64 start;\n    const char *error = NULL;\n    SDL_Surface *surface = NULL;\n    int w, h;\n    Uint8 *pixels;\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    /* Read the header */\n    if ( get_header(src, &w, &h) < 0 ) {\n        error = \"Unsupported image format\";\n        goto done;\n    }\n\n    /* Create the 3-3-2 indexed palette surface */\n    surface = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 8, 0xe0, 0x1c, 0x03, 0);\n    if ( surface == NULL ) {\n        error = \"Out of memory\";\n        goto done;\n    }\n\n    /* Load the image data */\n    for ( pixels = (Uint8 *)surface->pixels; h > 0; --h ) {\n        if ( SDL_RWread(src, pixels, w, 1) <= 0 ) {\n            error = \"Couldn't read image data\";\n            goto done;\n        }\n        pixels += surface->pitch;\n    }\n\ndone:\n    if ( error ) {\n        SDL_RWseek(src, start, RW_SEEK_SET);\n        if ( surface ) {\n            SDL_FreeSurface(surface);\n            surface = NULL;\n        }\n        IMG_SetError(\"%s\", error);\n    }\n    return surface;\n}\n\n#else\n\n/* See if an image is contained in a data source */\nint IMG_isXV(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a XXX type image from an SDL datasource */\nSDL_Surface *IMG_LoadXV_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_XV */\n"
  },
  {
    "path": "libs/SDL2_image/src/IMG_xxx.c",
    "content": "/*\n  SDL_image:  An example image loading library for use with SDL\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* This is a generic \"format not supported\" image framework */\n\n#include <stdio.h>\n\n#include \"SDL_image.h\"\n\n#ifdef LOAD_XXX\n\n/* See if an image is contained in a data source */\nint IMG_isXXX(SDL_RWops *src)\n{\n    int start;\n    int is_XXX;\n\n    if ( !src )\n        return 0;\n    start = SDL_RWtell(src);\n    is_XXX = 0;\n\n    /* Detect the image here */\n\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    return(is_XXX);\n}\n\n/* Load a XXX type image from an SDL datasource */\nSDL_Surface *IMG_LoadXXX_RW(SDL_RWops *src)\n{\n    int start;\n    const char *error = NULL;\n    SDL_Surface *surface = NULL;\n\n    if ( !src ) {\n        /* The error message has been set in SDL_RWFromFile */\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    /* Load the image here */\n\n    if ( error ) {\n        SDL_RWseek(src, start, RW_SEEK_SET);\n        if ( surface ) {\n            SDL_FreeSurface(surface);\n            surface = NULL;\n        }\n        IMG_SetError(\"%s\", error);\n    }\n    return surface;\n}\n\n#else\n\n/* See if an image is contained in a data source */\nint IMG_isXXX(SDL_RWops *src)\n{\n    return(0);\n}\n\n/* Load a XXX type image from an SDL datasource */\nSDL_Surface *IMG_LoadXXX_RW(SDL_RWops *src)\n{\n    return(NULL);\n}\n\n#endif /* LOAD_XXX */\n"
  },
  {
    "path": "libs/SDL2_image/src/showimage.c",
    "content": "/*\n  showimage:  A test application for the SDL image loading library.\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"SDL.h\"\n#include \"SDL_image.h\"\n\n\n/* Draw a Gimpish background pattern to show transparency in the image */\nstatic void draw_background(SDL_Renderer *renderer, int w, int h)\n{\n    SDL_Color col[2] = {\n        { 0x66, 0x66, 0x66, 0xff },\n        { 0x99, 0x99, 0x99, 0xff },\n    };\n    int i, x, y;\n    SDL_Rect rect;\n\n    rect.w = 8;\n    rect.h = 8;\n    for (y = 0; y < h; y += rect.h) {\n        for (x = 0; x < w; x += rect.w) {\n            /* use an 8x8 checkerboard pattern */\n            i = (((x ^ y) >> 3) & 1);\n            SDL_SetRenderDrawColor(renderer, col[i].r, col[i].g, col[i].b, col[i].a);\n\n            rect.x = x;\n            rect.y = y;\n            SDL_RenderFillRect(renderer, &rect);\n        }\n    }\n}\n\nint main(int argc, char *argv[])\n{\n    SDL_Window *window;\n    SDL_Renderer *renderer;\n    SDL_Texture *texture;\n    Uint32 flags;\n    int i, w, h, done;\n    SDL_Event event;\n    const char *saveFile = NULL;\n\n    /* Check command line usage */\n    if ( ! argv[1] ) {\n        fprintf(stderr, \"Usage: %s [-fullscreen] [-save file.png] <image_file> ...\\n\", argv[0]);\n        return(1);\n    }\n\n    flags = SDL_WINDOW_HIDDEN;\n    for ( i=1; argv[i]; ++i ) {\n        if ( strcmp(argv[i], \"-fullscreen\") == 0 ) {\n            SDL_ShowCursor(0);\n            flags |= SDL_WINDOW_FULLSCREEN;\n        }\n    }\n\n    if (SDL_CreateWindowAndRenderer(0, 0, flags, &window, &renderer) < 0) {\n        fprintf(stderr, \"SDL_CreateWindowAndRenderer() failed: %s\\n\", SDL_GetError());\n        return(2);\n    }\n\n    for ( i=1; argv[i]; ++i ) {\n        if ( strcmp(argv[i], \"-fullscreen\") == 0 ) {\n            continue;\n        }\n\n        if ( strcmp(argv[i], \"-save\") == 0 && argv[i+1] ) {\n            ++i;\n            saveFile = argv[i];\n            continue;\n        }\n\n        /* Open the image file */\n        texture = IMG_LoadTexture(renderer, argv[i]);\n        if (!texture) {\n            fprintf(stderr, \"Couldn't load %s: %s\\n\", argv[i], SDL_GetError());\n            continue;\n        }\n        SDL_QueryTexture(texture, NULL, NULL, &w, &h);\n\n        /* Save the image file, if desired */\n        if ( saveFile ) {\n            SDL_Surface *surface = IMG_Load(argv[i]);\n            if (surface) {\n                if ( IMG_SavePNG(surface, saveFile) < 0 ) {\n                    fprintf(stderr, \"Couldn't save %s: %s\\n\", saveFile, SDL_GetError());\n                }\n            } else {\n                fprintf(stderr, \"Couldn't load %s: %s\\n\", argv[i], SDL_GetError());\n            }\n        }\n\n        /* Show the window */\n        SDL_SetWindowTitle(window, argv[i]);\n        SDL_SetWindowSize(window, w, h);\n        SDL_ShowWindow(window);\n\n        done = 0;\n        while ( ! done ) {\n            while ( SDL_PollEvent(&event) ) {\n                switch (event.type) {\n                    case SDL_KEYUP:\n                        switch (event.key.keysym.sym) {\n                            case SDLK_LEFT:\n                                if ( i > 1 ) {\n                                    i -= 2;\n                                    done = 1;\n                                }\n                                break;\n                            case SDLK_RIGHT:\n                                if ( argv[i+1] ) {\n                                    done = 1;\n                                }\n                                break;\n                            case SDLK_ESCAPE:\n                            case SDLK_q:\n                                argv[i+1] = NULL;\n                            /* Drop through to done */\n                            case SDLK_SPACE:\n                            case SDLK_TAB:\n                            done = 1;\n                            break;\n                            default:\n                            break;\n                        }\n                        break;\n                    case SDL_MOUSEBUTTONDOWN:\n                        done = 1;\n                        break;\n                    case SDL_QUIT:\n                        argv[i+1] = NULL;\n                        done = 1;\n                        break;\n                    default:\n                        break;\n                }\n            }\n            /* Draw a background pattern in case the image has transparency */\n            draw_background(renderer, w, h);\n\n            /* Display the image */\n            SDL_RenderCopy(renderer, texture, NULL, NULL);\n            SDL_RenderPresent(renderer);\n\n            SDL_Delay(100);\n        }\n        SDL_DestroyTexture(texture);\n    }\n\n    /* We're done! */\n    SDL_Quit();\n    return(0);\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\nproject(SDL2_jpeg)\n\n# Creates and names a library, sets it as either STATIC\n# or SHARED, and provides the relative paths to its source code.\n# You can define multiple libraries, and CMake builds them for you.\n# Gradle automatically packages shared libraries with your APK.\n\nfind_library( # Sets the name of the path variable.\n        GLESv1_CM\n\n        # Specifies the name of the NDK library that\n        # you want CMake to locate.\n        GLESv1_CM )\n\nfind_library(\n        GLESv2\n        GLESv2\n)\n\nfind_library(\n        android\n        android\n)\n\nfind_library(\n        z\n        z\n)\n\nfind_library(\n        log\n        log\n)\n\ninclude_directories(include)\n\nadd_definitions(-DGL_GLEXT_PROTOTYPES)\n\nadd_library( # Sets the name of the library.\n        SDL2_jpeg\n\n        # Sets the library as a shared library.\n        SHARED\n\n        src/rdswitch.c\n        src/jquant1.c\n        src/rdbmp.c\n        src/jcmainct.c\n        src/jcdctmgr.c\n        src/jcsample.c\n        src/wrgif.c\n        src/jdmaster.c\n        src/jdatadst.c\n        src/jaricom.c\n        src/jutils.c\n        src/rdgif.c\n        src/jdcolor.c\n        src/rdppm.c\n        src/jchuff.c\n        src/wrppm.c\n        src/jquant2.c\n        src/jcmarker.c\n        src/rdtarga.c\n        src/rdrle.c\n        src/jdtrans.c\n        src/jcmaster.c\n        src/jfdctfst.c\n        src/jdapimin.c\n        src/jccoefct.c\n        src/jidctfst.c\n        src/wrbmp.c\n        src/jddctmgr.c\n        src/jdmerge.c\n        src/jdarith.c\n        src/jidctint.c\n        src/jdatasrc.c\n        src/jcomapi.c\n        src/wrrle.c\n        src/rdcolmap.c\n        src/jmemmgr.c\n        src/jcinit.c\n        src/wrtarga.c\n        src/jidctflt.c\n        src/jmem-android.c\n        src/jdapistd.c\n        src/jerror.c\n        src/jcparam.c\n        src/jcprepct.c\n        src/jdsample.c\n        src/jdhuff.c\n        src/cdjpeg.c\n        src/jdpostct.c\n        src/jdmarker.c\n        src/jfdctint.c\n        src/jcarith.c\n        src/jdcoefct.c\n        src/jcapimin.c\n        src/transupp.c\n        src/jfdctflt.c\n        src/jccolor.c\n        src/jdmainct.c\n        src/jdinput.c\n        src/wrjpgcom.c\n        src/jctrans.c\n        src/jcapistd.c\n        )\n\n\ntarget_link_libraries(\n        SDL2_jpeg\n        SDL2\n        GLESv1_CM\n        GLESv2\n        android\n        z\n        log\n)"
  },
  {
    "path": "libs/SDL2_jpeg/build.gradle",
    "content": "apply plugin: 'com.android.model.native'\n\nmodel {\n    android {\n        compileSdkVersion = gradle.sdkVersion\n        buildToolsVersion = gradle.buildToolsVersion\n\n        defaultConfig {\n            minSdkVersion.apiLevel = gradle.minSdkVersion\n            versionCode = 1\n            versionName = '1.0'\n        }\n        ndk {\n            moduleName = 'SDL2_jpeg'\n            ldLibs.addAll([\"GLESv1_CM\", \"EGL\", \"GLESv2\", \"log\", \"android\", \"dl\", \"z\"])\n            CFlags.addAll([\n                           \"-DGL_GLEXT_PROTOTYPES\"\n            ])\n            CFlags.addAll([\"-I\" + file(\"include/\").absolutePath,\"-DGL_GLEXT_PROTOTYPES\"])\n        }\n\n        sources {\n            main {\n                jni {\n                    source {\n                        srcDir \"src\"\n                        exclude \"cjpeg.c\"\n                        exclude \"ckconfig.c\"\n                        exclude \"djpeg.c\"\n                        exclude \"example.c\"\n                        exclude \"jmemansi.c\"\n                        exclude \"jmemdos.c\"\n                        exclude \"jmemmac.c\"\n                        exclude \"jmemname.c\"\n                        exclude \"jmemnobs.c\"\n                        exclude \"jpegtran.c\"\n                        exclude \"rdjpgcom.c\"\n                    }\n                }\n            }\n        }\n\n    }\n}\n\ntask(distributeLib, type : Copy) {\n    // trigger build library\n    dependsOn assemble\n    into gradle.libDistributionRoot + '/SDL2_jpeg/'\n    from('build/outputs/native/release/lib') {\n        into 'lib/'\n    }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/cmake_install.cmake",
    "content": "# Install script for directory: C:/is-Engine/libs/SDL2_jpeg\n\n# Set the install prefix\nif(NOT DEFINED CMAKE_INSTALL_PREFIX)\n  set(CMAKE_INSTALL_PREFIX \"C:/Program Files (x86)/Project\")\nendif()\nstring(REGEX REPLACE \"/$\" \"\" CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")\n\n# Set the install configuration name.\nif(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)\n  if(BUILD_TYPE)\n    string(REGEX REPLACE \"^[^A-Za-z0-9_]+\" \"\"\n           CMAKE_INSTALL_CONFIG_NAME \"${BUILD_TYPE}\")\n  else()\n    set(CMAKE_INSTALL_CONFIG_NAME \"Release\")\n  endif()\n  message(STATUS \"Install configuration: \\\"${CMAKE_INSTALL_CONFIG_NAME}\\\"\")\nendif()\n\n# Set the component getting installed.\nif(NOT CMAKE_INSTALL_COMPONENT)\n  if(COMPONENT)\n    message(STATUS \"Install component: \\\"${COMPONENT}\\\"\")\n    set(CMAKE_INSTALL_COMPONENT \"${COMPONENT}\")\n  else()\n    set(CMAKE_INSTALL_COMPONENT)\n  endif()\nendif()\n\n# Install shared libraries without execute permission?\nif(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n  set(CMAKE_INSTALL_SO_NO_EXE \"0\")\nendif()\n\n# Is this installation the result of a crosscompile?\nif(NOT DEFINED CMAKE_CROSSCOMPILING)\n  set(CMAKE_CROSSCOMPILING \"TRUE\")\nendif()\n\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/cderror.h",
    "content": "/*\n * cderror.h\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * Modified 2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file defines the error and message codes for the cjpeg/djpeg\n * applications.  These strings are not needed as part of the JPEG library\n * proper.\n * Edit this file to add new codes, or to translate the message strings to\n * some other language.\n */\n\n/*\n * To define the enum list of message codes, include this file without\n * defining macro JMESSAGE.  To create a message string table, include it\n * again with a suitable JMESSAGE definition (see jerror.c for an example).\n */\n#ifndef JMESSAGE\n#ifndef CDERROR_H\n#define CDERROR_H\n/* First time through, define the enum list */\n#define JMAKE_ENUM_LIST\n#else\n/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */\n#define JMESSAGE(code,string)\n#endif /* CDERROR_H */\n#endif /* JMESSAGE */\n\n#ifdef JMAKE_ENUM_LIST\n\ntypedef enum {\n\n#define JMESSAGE(code,string)\tcode ,\n\n#endif /* JMAKE_ENUM_LIST */\n\nJMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */\n\n#ifdef BMP_SUPPORTED\nJMESSAGE(JERR_BMP_BADCMAP, \"Unsupported BMP colormap format\")\nJMESSAGE(JERR_BMP_BADDEPTH, \"Only 8- and 24-bit BMP files are supported\")\nJMESSAGE(JERR_BMP_BADHEADER, \"Invalid BMP file: bad header length\")\nJMESSAGE(JERR_BMP_BADPLANES, \"Invalid BMP file: biPlanes not equal to 1\")\nJMESSAGE(JERR_BMP_COLORSPACE, \"BMP output must be grayscale or RGB\")\nJMESSAGE(JERR_BMP_COMPRESSED, \"Sorry, compressed BMPs not yet supported\")\nJMESSAGE(JERR_BMP_EMPTY, \"Empty BMP image\")\nJMESSAGE(JERR_BMP_NOT, \"Not a BMP file - does not start with BM\")\nJMESSAGE(JTRC_BMP, \"%ux%u 24-bit BMP image\")\nJMESSAGE(JTRC_BMP_MAPPED, \"%ux%u 8-bit colormapped BMP image\")\nJMESSAGE(JTRC_BMP_OS2, \"%ux%u 24-bit OS2 BMP image\")\nJMESSAGE(JTRC_BMP_OS2_MAPPED, \"%ux%u 8-bit colormapped OS2 BMP image\")\n#endif /* BMP_SUPPORTED */\n\n#ifdef GIF_SUPPORTED\nJMESSAGE(JERR_GIF_BUG, \"GIF output got confused\")\nJMESSAGE(JERR_GIF_CODESIZE, \"Bogus GIF codesize %d\")\nJMESSAGE(JERR_GIF_COLORSPACE, \"GIF output must be grayscale or RGB\")\nJMESSAGE(JERR_GIF_IMAGENOTFOUND, \"Too few images in GIF file\")\nJMESSAGE(JERR_GIF_NOT, \"Not a GIF file\")\nJMESSAGE(JTRC_GIF, \"%ux%ux%d GIF image\")\nJMESSAGE(JTRC_GIF_BADVERSION,\n\t \"Warning: unexpected GIF version number '%c%c%c'\")\nJMESSAGE(JTRC_GIF_EXTENSION, \"Ignoring GIF extension block of type 0x%02x\")\nJMESSAGE(JTRC_GIF_NONSQUARE, \"Caution: nonsquare pixels in input\")\nJMESSAGE(JWRN_GIF_BADDATA, \"Corrupt data in GIF file\")\nJMESSAGE(JWRN_GIF_CHAR, \"Bogus char 0x%02x in GIF file, ignoring\")\nJMESSAGE(JWRN_GIF_ENDCODE, \"Premature end of GIF image\")\nJMESSAGE(JWRN_GIF_NOMOREDATA, \"Ran out of GIF bits\")\n#endif /* GIF_SUPPORTED */\n\n#ifdef PPM_SUPPORTED\nJMESSAGE(JERR_PPM_COLORSPACE, \"PPM output must be grayscale or RGB\")\nJMESSAGE(JERR_PPM_NONNUMERIC, \"Nonnumeric data in PPM file\")\nJMESSAGE(JERR_PPM_NOT, \"Not a PPM/PGM file\")\nJMESSAGE(JTRC_PGM, \"%ux%u PGM image\")\nJMESSAGE(JTRC_PGM_TEXT, \"%ux%u text PGM image\")\nJMESSAGE(JTRC_PPM, \"%ux%u PPM image\")\nJMESSAGE(JTRC_PPM_TEXT, \"%ux%u text PPM image\")\n#endif /* PPM_SUPPORTED */\n\n#ifdef RLE_SUPPORTED\nJMESSAGE(JERR_RLE_BADERROR, \"Bogus error code from RLE library\")\nJMESSAGE(JERR_RLE_COLORSPACE, \"RLE output must be grayscale or RGB\")\nJMESSAGE(JERR_RLE_DIMENSIONS, \"Image dimensions (%ux%u) too large for RLE\")\nJMESSAGE(JERR_RLE_EMPTY, \"Empty RLE file\")\nJMESSAGE(JERR_RLE_EOF, \"Premature EOF in RLE header\")\nJMESSAGE(JERR_RLE_MEM, \"Insufficient memory for RLE header\")\nJMESSAGE(JERR_RLE_NOT, \"Not an RLE file\")\nJMESSAGE(JERR_RLE_TOOMANYCHANNELS, \"Cannot handle %d output channels for RLE\")\nJMESSAGE(JERR_RLE_UNSUPPORTED, \"Cannot handle this RLE setup\")\nJMESSAGE(JTRC_RLE, \"%ux%u full-color RLE file\")\nJMESSAGE(JTRC_RLE_FULLMAP, \"%ux%u full-color RLE file with map of length %d\")\nJMESSAGE(JTRC_RLE_GRAY, \"%ux%u grayscale RLE file\")\nJMESSAGE(JTRC_RLE_MAPGRAY, \"%ux%u grayscale RLE file with map of length %d\")\nJMESSAGE(JTRC_RLE_MAPPED, \"%ux%u colormapped RLE file with map of length %d\")\n#endif /* RLE_SUPPORTED */\n\n#ifdef TARGA_SUPPORTED\nJMESSAGE(JERR_TGA_BADCMAP, \"Unsupported Targa colormap format\")\nJMESSAGE(JERR_TGA_BADPARMS, \"Invalid or unsupported Targa file\")\nJMESSAGE(JERR_TGA_COLORSPACE, \"Targa output must be grayscale or RGB\")\nJMESSAGE(JTRC_TGA, \"%ux%u RGB Targa image\")\nJMESSAGE(JTRC_TGA_GRAY, \"%ux%u grayscale Targa image\")\nJMESSAGE(JTRC_TGA_MAPPED, \"%ux%u colormapped Targa image\")\n#else\nJMESSAGE(JERR_TGA_NOTCOMP, \"Targa support was not compiled\")\n#endif /* TARGA_SUPPORTED */\n\nJMESSAGE(JERR_BAD_CMAP_FILE,\n\t \"Color map file is invalid or of unsupported format\")\nJMESSAGE(JERR_TOO_MANY_COLORS,\n\t \"Output file format cannot handle %d colormap entries\")\nJMESSAGE(JERR_UNGETC_FAILED, \"ungetc failed\")\n#ifdef TARGA_SUPPORTED\nJMESSAGE(JERR_UNKNOWN_FORMAT,\n\t \"Unrecognized input file format --- perhaps you need -targa\")\n#else\nJMESSAGE(JERR_UNKNOWN_FORMAT, \"Unrecognized input file format\")\n#endif\nJMESSAGE(JERR_UNSUPPORTED_FORMAT, \"Unsupported output file format\")\n\n#ifdef JMAKE_ENUM_LIST\n\n  JMSG_LASTADDONCODE\n} ADDON_MESSAGE_CODE;\n\n#undef JMAKE_ENUM_LIST\n#endif /* JMAKE_ENUM_LIST */\n\n/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */\n#undef JMESSAGE\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/cdjpeg.h",
    "content": "/*\n * cdjpeg.h\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains common declarations for the sample applications\n * cjpeg and djpeg.  It is NOT used by the core JPEG library.\n */\n\n#define JPEG_CJPEG_DJPEG\t/* define proper options in jconfig.h */\n#define JPEG_INTERNAL_OPTIONS\t/* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jerror.h\"\t\t/* get library error codes too */\n#include \"cderror.h\"\t\t/* get application-specific error codes */\n\n\n/*\n * Object interface for cjpeg's source file decoding modules\n */\n\ntypedef struct cjpeg_source_struct * cjpeg_source_ptr;\n\nstruct cjpeg_source_struct {\n  JMETHOD(void, start_input, (j_compress_ptr cinfo,\n\t\t\t      cjpeg_source_ptr sinfo));\n  JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,\n\t\t\t\t       cjpeg_source_ptr sinfo));\n  JMETHOD(void, finish_input, (j_compress_ptr cinfo,\n\t\t\t       cjpeg_source_ptr sinfo));\n\n  FILE *input_file;\n\n  JSAMPARRAY buffer;\n  JDIMENSION buffer_height;\n};\n\n\n/*\n * Object interface for djpeg's output file encoding modules\n */\n\ntypedef struct djpeg_dest_struct * djpeg_dest_ptr;\n\nstruct djpeg_dest_struct {\n  /* start_output is called after jpeg_start_decompress finishes.\n   * The color map will be ready at this time, if one is needed.\n   */\n  JMETHOD(void, start_output, (j_decompress_ptr cinfo,\n\t\t\t       djpeg_dest_ptr dinfo));\n  /* Emit the specified number of pixel rows from the buffer. */\n  JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,\n\t\t\t\t djpeg_dest_ptr dinfo,\n\t\t\t\t JDIMENSION rows_supplied));\n  /* Finish up at the end of the image. */\n  JMETHOD(void, finish_output, (j_decompress_ptr cinfo,\n\t\t\t\tdjpeg_dest_ptr dinfo));\n\n  /* Target file spec; filled in by djpeg.c after object is created. */\n  FILE * output_file;\n\n  /* Output pixel-row buffer.  Created by module init or start_output.\n   * Width is cinfo->output_width * cinfo->output_components;\n   * height is buffer_height.\n   */\n  JSAMPARRAY buffer;\n  JDIMENSION buffer_height;\n};\n\n\n/*\n * cjpeg/djpeg may need to perform extra passes to convert to or from\n * the source/destination file format.  The JPEG library does not know\n * about these passes, but we'd like them to be counted by the progress\n * monitor.  We use an expanded progress monitor object to hold the\n * additional pass count.\n */\n\nstruct cdjpeg_progress_mgr {\n  struct jpeg_progress_mgr pub;\t/* fields known to JPEG library */\n  int completed_extra_passes;\t/* extra passes completed */\n  int total_extra_passes;\t/* total extra */\n  /* last printed percentage stored here to avoid multiple printouts */\n  int percent_done;\n};\n\ntypedef struct cdjpeg_progress_mgr * cd_progress_ptr;\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jinit_read_bmp\t\tjIRdBMP\n#define jinit_write_bmp\t\tjIWrBMP\n#define jinit_read_gif\t\tjIRdGIF\n#define jinit_write_gif\t\tjIWrGIF\n#define jinit_read_ppm\t\tjIRdPPM\n#define jinit_write_ppm\t\tjIWrPPM\n#define jinit_read_rle\t\tjIRdRLE\n#define jinit_write_rle\t\tjIWrRLE\n#define jinit_read_targa\tjIRdTarga\n#define jinit_write_targa\tjIWrTarga\n#define read_quant_tables\tRdQTables\n#define read_scan_script\tRdScnScript\n#define set_quality_ratings     SetQRates\n#define set_quant_slots\t\tSetQSlots\n#define set_sample_factors\tSetSFacts\n#define read_color_map\t\tRdCMap\n#define enable_signal_catcher\tEnSigCatcher\n#define start_progress_monitor\tStProgMon\n#define end_progress_monitor\tEnProgMon\n#define read_stdin\t\tRdStdin\n#define write_stdout\t\tWrStdout\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n/* Module selection routines for I/O modules. */\n\nEXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    boolean is_os2));\nEXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo));\nEXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo));\nEXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo));\nEXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo));\nEXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo));\n\n/* cjpeg support routines (in rdswitch.c) */\n\nEXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename,\n\t\t\t\t       boolean force_baseline));\nEXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename));\nEXTERN(boolean) set_quality_ratings JPP((j_compress_ptr cinfo, char *arg,\n\t\t\t\t\t boolean force_baseline));\nEXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg));\nEXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg));\n\n/* djpeg support routines (in rdcolmap.c) */\n\nEXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FILE * infile));\n\n/* common support routines (in cdjpeg.c) */\n\nEXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo));\nEXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo,\n\t\t\t\t\t cd_progress_ptr progress));\nEXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo));\nEXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars));\nEXTERN(FILE *) read_stdin JPP((void));\nEXTERN(FILE *) write_stdout JPP((void));\n\n/* miscellaneous useful macros */\n\n#ifdef DONT_USE_B_MODE\t\t/* define mode parameters for fopen() */\n#define READ_BINARY\t\"r\"\n#define WRITE_BINARY\t\"w\"\n#else\n#ifdef VMS\t\t\t/* VMS is very nonstandard */\n#define READ_BINARY\t\"rb\", \"ctx=stm\"\n#define WRITE_BINARY\t\"wb\", \"ctx=stm\"\n#else\t\t\t\t/* standard ANSI-compliant case */\n#define READ_BINARY\t\"rb\"\n#define WRITE_BINARY\t\"wb\"\n#endif\n#endif\n\n#ifndef EXIT_FAILURE\t\t/* define exit() codes if not provided */\n#define EXIT_FAILURE  1\n#endif\n#ifndef EXIT_SUCCESS\n#ifdef VMS\n#define EXIT_SUCCESS  1\t\t/* VMS is very nonstandard */\n#else\n#define EXIT_SUCCESS  0\n#endif\n#endif\n#ifndef EXIT_WARNING\n#ifdef VMS\n#define EXIT_WARNING  1\t\t/* VMS is very nonstandard */\n#else\n#define EXIT_WARNING  2\n#endif\n#endif\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/jconfig.h",
    "content": "/* android jconfig.h */\n/*\n * jconfig.doc\n *\n * Copyright (C) 1991-1994, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file documents the configuration options that are required to\n * customize the JPEG software for a particular system.\n *\n * The actual configuration options for a particular installation are stored\n * in jconfig.h.  On many machines, jconfig.h can be generated automatically\n * or copied from one of the \"canned\" jconfig files that we supply.  But if\n * you need to generate a jconfig.h file by hand, this file tells you how.\n *\n * DO NOT EDIT THIS FILE --- IT WON'T ACCOMPLISH ANYTHING.\n * EDIT A COPY NAMED JCONFIG.H.\n */\n\n\n/*\n * These symbols indicate the properties of your machine or compiler.\n * #define the symbol if yes, #undef it if no.\n */\n\n/* Does your compiler support function prototypes?\n * (If not, you also need to use ansi2knr, see install.doc)\n */\n#define HAVE_PROTOTYPES\n\n/* Does your compiler support the declaration \"unsigned char\" ?\n * How about \"unsigned short\" ?\n */\n#define HAVE_UNSIGNED_CHAR\n#define HAVE_UNSIGNED_SHORT\n\n/* Define \"void\" as \"char\" if your compiler doesn't know about type void.\n * NOTE: be sure to define void such that \"void *\" represents the most general\n * pointer type, e.g., that returned by malloc().\n */\n/* #define void char */\n\n/* Define \"const\" as empty if your compiler doesn't know the \"const\" keyword.\n */\n/* #define const */\n\n/* Define this if an ordinary \"char\" type is unsigned.\n * If you're not sure, leaving it undefined will work at some cost in speed.\n * If you defined HAVE_UNSIGNED_CHAR then the speed difference is minimal.\n */\n#undef CHAR_IS_UNSIGNED\n\n/* Define this if your system has an ANSI-conforming <stddef.h> file.\n */\n#define HAVE_STDDEF_H\n\n/* Define this if your system has an ANSI-conforming <stdlib.h> file.\n */\n#define HAVE_STDLIB_H\n\n/* Define this if your system does not have an ANSI/SysV <string.h>,\n * but does have a BSD-style <strings.h>.\n */\n#undef NEED_BSD_STRINGS\n\n/* Define this if your system does not provide typedef size_t in any of the\n * ANSI-standard places (stddef.h, stdlib.h, or stdio.h), but places it in\n * <sys/types.h> instead.\n */\n#undef NEED_SYS_TYPES_H\n\n/* For 80x86 machines, you need to define NEED_FAR_POINTERS,\n * unless you are using a large-data memory model or 80386 flat-memory mode.\n * On less brain-damaged CPUs this symbol must not be defined.\n * (Defining this symbol causes large data structures to be referenced through\n * \"far\" pointers and to be allocated with a special version of malloc.)\n */\n#undef NEED_FAR_POINTERS\n\n/* Define this if your linker needs global names to be unique in less\n * than the first 15 characters.\n */\n#undef NEED_SHORT_EXTERNAL_NAMES\n\n/* Although a real ANSI C compiler can deal perfectly well with pointers to\n * unspecified structures (see \"incomplete types\" in the spec), a few pre-ANSI\n * and pseudo-ANSI compilers get confused.  To keep one of these bozos happy,\n * define INCOMPLETE_TYPES_BROKEN.  This is not recommended unless you\n * actually get \"missing structure definition\" warnings or errors while\n * compiling the JPEG code.\n */\n#undef INCOMPLETE_TYPES_BROKEN\n\n\n/*\n * The following options affect code selection within the JPEG library,\n * but they don't need to be visible to applications using the library.\n * To minimize application namespace pollution, the symbols won't be\n * defined unless JPEG_INTERNALS has been defined.\n */\n\n#ifdef JPEG_INTERNALS\n\n/* Define this if your compiler implements \">>\" on signed values as a logical\n * (unsigned) shift; leave it undefined if \">>\" is a signed (arithmetic) shift,\n * which is the normal and rational definition.\n */\n#undef RIGHT_SHIFT_IS_UNSIGNED\n\n\n#endif /* JPEG_INTERNALS */\n\n\n/*\n * The remaining options do not affect the JPEG library proper,\n * but only the sample applications cjpeg/djpeg (see cjpeg.c, djpeg.c).\n * Other applications can ignore these.\n */\n\n#ifdef JPEG_CJPEG_DJPEG\n\n/* These defines indicate which image (non-JPEG) file formats are allowed. */\n\n#define BMP_SUPPORTED\t\t/* BMP image file format */\n#define GIF_SUPPORTED\t\t/* GIF image file format */\n#define PPM_SUPPORTED\t\t/* PBMPLUS PPM/PGM image file format */\n#undef RLE_SUPPORTED\t\t/* Utah RLE image file format */\n#define TARGA_SUPPORTED\t\t/* Targa image file format */\n\n/* Define this if you want to name both input and output files on the command\n * line, rather than using stdout and optionally stdin.  You MUST do this if\n * your system can't cope with binary I/O to stdin/stdout.  See comments at\n * head of cjpeg.c or djpeg.c.\n */\n#undef TWO_FILE_COMMANDLINE\n\n/* Define this if your system needs explicit cleanup of temporary files.\n * This is crucial under MS-DOS, where the temporary \"files\" may be areas\n * of extended memory; on most other systems it's not as important.\n */\n#undef NEED_SIGNAL_CATCHER\n\n/* By default, we open image files with fopen(...,\"rb\") or fopen(...,\"wb\").\n * This is necessary on systems that distinguish text files from binary files,\n * and is harmless on most systems that don't.  If you have one of the rare\n * systems that complains about the \"b\" spec, define this symbol.\n */\n#undef DONT_USE_B_MODE\n\n/* Define this if you want percent-done progress reports from cjpeg/djpeg.\n */\n#undef PROGRESS_REPORT\n\n\n#endif /* JPEG_CJPEG_DJPEG */\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/jdct.h",
    "content": "/*\n * jdct.h\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This include file contains common declarations for the forward and\n * inverse DCT modules.  These declarations are private to the DCT managers\n * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms.\n * The individual DCT algorithms are kept in separate files to ease \n * machine-dependent tuning (e.g., assembly coding).\n */\n\n\n/*\n * A forward DCT routine is given a pointer to an input sample array and\n * a pointer to a work area of type DCTELEM[]; the DCT is to be performed\n * in-place in that buffer.  Type DCTELEM is int for 8-bit samples, INT32\n * for 12-bit samples.  (NOTE: Floating-point DCT implementations use an\n * array of type FAST_FLOAT, instead.)\n * The input data is to be fetched from the sample array starting at a\n * specified column.  (Any row offset needed will be applied to the array\n * pointer before it is passed to the FDCT code.)\n * Note that the number of samples fetched by the FDCT routine is\n * DCT_h_scaled_size * DCT_v_scaled_size.\n * The DCT outputs are returned scaled up by a factor of 8; they therefore\n * have a range of +-8K for 8-bit data, +-128K for 12-bit data.  This\n * convention improves accuracy in integer implementations and saves some\n * work in floating-point ones.\n * Quantization of the output coefficients is done by jcdctmgr.c.\n */\n\n#if BITS_IN_JSAMPLE == 8\ntypedef int DCTELEM;\t\t/* 16 or 32 bits is fine */\n#else\ntypedef INT32 DCTELEM;\t\t/* must have 32 bits */\n#endif\n\ntypedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data,\n\t\t\t\t\t       JSAMPARRAY sample_data,\n\t\t\t\t\t       JDIMENSION start_col));\ntypedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data,\n\t\t\t\t\t     JSAMPARRAY sample_data,\n\t\t\t\t\t     JDIMENSION start_col));\n\n\n/*\n * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer\n * to an output sample array.  The routine must dequantize the input data as\n * well as perform the IDCT; for dequantization, it uses the multiplier table\n * pointed to by compptr->dct_table.  The output data is to be placed into the\n * sample array starting at a specified column.  (Any row offset needed will\n * be applied to the array pointer before it is passed to the IDCT code.)\n * Note that the number of samples emitted by the IDCT routine is\n * DCT_h_scaled_size * DCT_v_scaled_size.\n */\n\n/* typedef inverse_DCT_method_ptr is declared in jpegint.h */\n\n/*\n * Each IDCT routine has its own ideas about the best dct_table element type.\n */\n\ntypedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */\n#if BITS_IN_JSAMPLE == 8\ntypedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */\n#define IFAST_SCALE_BITS  2\t/* fractional bits in scale factors */\n#else\ntypedef INT32 IFAST_MULT_TYPE;\t/* need 32 bits for scaled quantizers */\n#define IFAST_SCALE_BITS  13\t/* fractional bits in scale factors */\n#endif\ntypedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */\n\n\n/*\n * Each IDCT routine is responsible for range-limiting its results and\n * converting them to unsigned form (0..MAXJSAMPLE).  The raw outputs could\n * be quite far out of range if the input data is corrupt, so a bulletproof\n * range-limiting step is required.  We use a mask-and-table-lookup method\n * to do the combined operations quickly.  See the comments with\n * prepare_range_limit_table (in jdmaster.c) for more info.\n */\n\n#define IDCT_range_limit(cinfo)  ((cinfo)->sample_range_limit + CENTERJSAMPLE)\n\n#define RANGE_MASK  (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_fdct_islow\t\tjFDislow\n#define jpeg_fdct_ifast\t\tjFDifast\n#define jpeg_fdct_float\t\tjFDfloat\n#define jpeg_fdct_7x7\t\tjFD7x7\n#define jpeg_fdct_6x6\t\tjFD6x6\n#define jpeg_fdct_5x5\t\tjFD5x5\n#define jpeg_fdct_4x4\t\tjFD4x4\n#define jpeg_fdct_3x3\t\tjFD3x3\n#define jpeg_fdct_2x2\t\tjFD2x2\n#define jpeg_fdct_1x1\t\tjFD1x1\n#define jpeg_fdct_9x9\t\tjFD9x9\n#define jpeg_fdct_10x10\t\tjFD10x10\n#define jpeg_fdct_11x11\t\tjFD11x11\n#define jpeg_fdct_12x12\t\tjFD12x12\n#define jpeg_fdct_13x13\t\tjFD13x13\n#define jpeg_fdct_14x14\t\tjFD14x14\n#define jpeg_fdct_15x15\t\tjFD15x15\n#define jpeg_fdct_16x16\t\tjFD16x16\n#define jpeg_fdct_16x8\t\tjFD16x8\n#define jpeg_fdct_14x7\t\tjFD14x7\n#define jpeg_fdct_12x6\t\tjFD12x6\n#define jpeg_fdct_10x5\t\tjFD10x5\n#define jpeg_fdct_8x4\t\tjFD8x4\n#define jpeg_fdct_6x3\t\tjFD6x3\n#define jpeg_fdct_4x2\t\tjFD4x2\n#define jpeg_fdct_2x1\t\tjFD2x1\n#define jpeg_fdct_8x16\t\tjFD8x16\n#define jpeg_fdct_7x14\t\tjFD7x14\n#define jpeg_fdct_6x12\t\tjFD6x12\n#define jpeg_fdct_5x10\t\tjFD5x10\n#define jpeg_fdct_4x8\t\tjFD4x8\n#define jpeg_fdct_3x6\t\tjFD3x6\n#define jpeg_fdct_2x4\t\tjFD2x4\n#define jpeg_fdct_1x2\t\tjFD1x2\n#define jpeg_idct_islow\t\tjRDislow\n#define jpeg_idct_ifast\t\tjRDifast\n#define jpeg_idct_float\t\tjRDfloat\n#define jpeg_idct_7x7\t\tjRD7x7\n#define jpeg_idct_6x6\t\tjRD6x6\n#define jpeg_idct_5x5\t\tjRD5x5\n#define jpeg_idct_4x4\t\tjRD4x4\n#define jpeg_idct_3x3\t\tjRD3x3\n#define jpeg_idct_2x2\t\tjRD2x2\n#define jpeg_idct_1x1\t\tjRD1x1\n#define jpeg_idct_9x9\t\tjRD9x9\n#define jpeg_idct_10x10\t\tjRD10x10\n#define jpeg_idct_11x11\t\tjRD11x11\n#define jpeg_idct_12x12\t\tjRD12x12\n#define jpeg_idct_13x13\t\tjRD13x13\n#define jpeg_idct_14x14\t\tjRD14x14\n#define jpeg_idct_15x15\t\tjRD15x15\n#define jpeg_idct_16x16\t\tjRD16x16\n#define jpeg_idct_16x8\t\tjRD16x8\n#define jpeg_idct_14x7\t\tjRD14x7\n#define jpeg_idct_12x6\t\tjRD12x6\n#define jpeg_idct_10x5\t\tjRD10x5\n#define jpeg_idct_8x4\t\tjRD8x4\n#define jpeg_idct_6x3\t\tjRD6x3\n#define jpeg_idct_4x2\t\tjRD4x2\n#define jpeg_idct_2x1\t\tjRD2x1\n#define jpeg_idct_8x16\t\tjRD8x16\n#define jpeg_idct_7x14\t\tjRD7x14\n#define jpeg_idct_6x12\t\tjRD6x12\n#define jpeg_idct_5x10\t\tjRD5x10\n#define jpeg_idct_4x8\t\tjRD4x8\n#define jpeg_idct_3x6\t\tjRD3x8\n#define jpeg_idct_2x4\t\tjRD2x4\n#define jpeg_idct_1x2\t\tjRD1x2\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n/* Extern declarations for the forward and inverse DCT routines. */\n\nEXTERN(void) jpeg_fdct_islow\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_ifast\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_float\n    JPP((FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_7x7\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_6x6\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_5x5\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_4x4\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_3x3\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_2x2\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_1x1\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_9x9\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_10x10\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_11x11\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_12x12\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_13x13\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_14x14\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_15x15\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_16x16\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_16x8\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_14x7\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_12x6\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_10x5\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_8x4\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_6x3\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_4x2\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_2x1\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_8x16\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_7x14\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_6x12\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_5x10\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_4x8\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_3x6\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_2x4\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\nEXTERN(void) jpeg_fdct_1x2\n    JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col));\n\nEXTERN(void) jpeg_idct_islow\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_ifast\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_float\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_7x7\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_6x6\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_5x5\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_4x4\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_3x3\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_2x2\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_1x1\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_9x9\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_10x10\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_11x11\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_12x12\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_13x13\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_14x14\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_15x15\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_16x16\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_16x8\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_14x7\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_12x6\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_10x5\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_8x4\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_6x3\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_4x2\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_2x1\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_8x16\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_7x14\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_6x12\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_5x10\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_4x8\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_3x6\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_2x4\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\nEXTERN(void) jpeg_idct_1x2\n    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));\n\n\n/*\n * Macros for handling fixed-point arithmetic; these are used by many\n * but not all of the DCT/IDCT modules.\n *\n * All values are expected to be of type INT32.\n * Fractional constants are scaled left by CONST_BITS bits.\n * CONST_BITS is defined within each module using these macros,\n * and may differ from one module to the next.\n */\n\n#define ONE\t((INT32) 1)\n#define CONST_SCALE (ONE << CONST_BITS)\n\n/* Convert a positive real constant to an integer scaled by CONST_SCALE.\n * Caution: some C compilers fail to reduce \"FIX(constant)\" at compile time,\n * thus causing a lot of useless floating-point operations at run time.\n */\n\n#define FIX(x)\t((INT32) ((x) * CONST_SCALE + 0.5))\n\n/* Descale and correctly round an INT32 value that's scaled by N bits.\n * We assume RIGHT_SHIFT rounds towards minus infinity, so adding\n * the fudge factor is correct for either sign of X.\n */\n\n#define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)\n\n/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.\n * This macro is used only when the two inputs will actually be no more than\n * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a\n * full 32x32 multiply.  This provides a useful speedup on many machines.\n * Unfortunately there is no way to specify a 16x16->32 multiply portably\n * in C, but some C compilers will do the right thing if you provide the\n * correct combination of casts.\n */\n\n#ifdef SHORTxSHORT_32\t\t/* may work if 'int' is 32 bits */\n#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT16) (const)))\n#endif\n#ifdef SHORTxLCONST_32\t\t/* known to work with Microsoft C 6.0 */\n#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT32) (const)))\n#endif\n\n#ifndef MULTIPLY16C16\t\t/* default definition */\n#define MULTIPLY16C16(var,const)  ((var) * (const))\n#endif\n\n/* Same except both inputs are variables. */\n\n#ifdef SHORTxSHORT_32\t\t/* may work if 'int' is 32 bits */\n#define MULTIPLY16V16(var1,var2)  (((INT16) (var1)) * ((INT16) (var2)))\n#endif\n\n#ifndef MULTIPLY16V16\t\t/* default definition */\n#define MULTIPLY16V16(var1,var2)  ((var1) * (var2))\n#endif\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/jerror.h",
    "content": "/*\n * jerror.h\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * Modified 1997-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file defines the error and message codes for the JPEG library.\n * Edit this file to add new codes, or to translate the message strings to\n * some other language.\n * A set of error-reporting macros are defined too.  Some applications using\n * the JPEG library may wish to include this file to get the error codes\n * and/or the macros.\n */\n\n/*\n * To define the enum list of message codes, include this file without\n * defining macro JMESSAGE.  To create a message string table, include it\n * again with a suitable JMESSAGE definition (see jerror.c for an example).\n */\n#ifndef JMESSAGE\n#ifndef JERROR_H\n/* First time through, define the enum list */\n#define JMAKE_ENUM_LIST\n#else\n/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */\n#define JMESSAGE(code,string)\n#endif /* JERROR_H */\n#endif /* JMESSAGE */\n\n#ifdef JMAKE_ENUM_LIST\n\ntypedef enum {\n\n#define JMESSAGE(code,string)\tcode ,\n\n#endif /* JMAKE_ENUM_LIST */\n\nJMESSAGE(JMSG_NOMESSAGE, \"Bogus message code %d\") /* Must be first entry! */\n\n/* For maintenance convenience, list is alphabetical by message code name */\nJMESSAGE(JERR_BAD_ALIGN_TYPE, \"ALIGN_TYPE is wrong, please fix\")\nJMESSAGE(JERR_BAD_ALLOC_CHUNK, \"MAX_ALLOC_CHUNK is wrong, please fix\")\nJMESSAGE(JERR_BAD_BUFFER_MODE, \"Bogus buffer control mode\")\nJMESSAGE(JERR_BAD_COMPONENT_ID, \"Invalid component ID %d in SOS\")\nJMESSAGE(JERR_BAD_CROP_SPEC, \"Invalid crop request\")\nJMESSAGE(JERR_BAD_DCT_COEF, \"DCT coefficient out of range\")\nJMESSAGE(JERR_BAD_DCTSIZE, \"DCT scaled block size %dx%d not supported\")\nJMESSAGE(JERR_BAD_DROP_SAMPLING,\n\t \"Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c\")\nJMESSAGE(JERR_BAD_HUFF_TABLE, \"Bogus Huffman table definition\")\nJMESSAGE(JERR_BAD_IN_COLORSPACE, \"Bogus input colorspace\")\nJMESSAGE(JERR_BAD_J_COLORSPACE, \"Bogus JPEG colorspace\")\nJMESSAGE(JERR_BAD_LENGTH, \"Bogus marker length\")\nJMESSAGE(JERR_BAD_LIB_VERSION,\n\t \"Wrong JPEG library version: library is %d, caller expects %d\")\nJMESSAGE(JERR_BAD_MCU_SIZE, \"Sampling factors too large for interleaved scan\")\nJMESSAGE(JERR_BAD_POOL_ID, \"Invalid memory pool code %d\")\nJMESSAGE(JERR_BAD_PRECISION, \"Unsupported JPEG data precision %d\")\nJMESSAGE(JERR_BAD_PROGRESSION,\n\t \"Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d\")\nJMESSAGE(JERR_BAD_PROG_SCRIPT,\n\t \"Invalid progressive parameters at scan script entry %d\")\nJMESSAGE(JERR_BAD_SAMPLING, \"Bogus sampling factors\")\nJMESSAGE(JERR_BAD_SCAN_SCRIPT, \"Invalid scan script at entry %d\")\nJMESSAGE(JERR_BAD_STATE, \"Improper call to JPEG library in state %d\")\nJMESSAGE(JERR_BAD_STRUCT_SIZE,\n\t \"JPEG parameter struct mismatch: library thinks size is %u, caller expects %u\")\nJMESSAGE(JERR_BAD_VIRTUAL_ACCESS, \"Bogus virtual array access\")\nJMESSAGE(JERR_BUFFER_SIZE, \"Buffer passed to JPEG library is too small\")\nJMESSAGE(JERR_CANT_SUSPEND, \"Suspension not allowed here\")\nJMESSAGE(JERR_CCIR601_NOTIMPL, \"CCIR601 sampling not implemented yet\")\nJMESSAGE(JERR_COMPONENT_COUNT, \"Too many color components: %d, max %d\")\nJMESSAGE(JERR_CONVERSION_NOTIMPL, \"Unsupported color conversion request\")\nJMESSAGE(JERR_DAC_INDEX, \"Bogus DAC index %d\")\nJMESSAGE(JERR_DAC_VALUE, \"Bogus DAC value 0x%x\")\nJMESSAGE(JERR_DHT_INDEX, \"Bogus DHT index %d\")\nJMESSAGE(JERR_DQT_INDEX, \"Bogus DQT index %d\")\nJMESSAGE(JERR_EMPTY_IMAGE, \"Empty JPEG image (DNL not supported)\")\nJMESSAGE(JERR_EMS_READ, \"Read from EMS failed\")\nJMESSAGE(JERR_EMS_WRITE, \"Write to EMS failed\")\nJMESSAGE(JERR_EOI_EXPECTED, \"Didn't expect more than one scan\")\nJMESSAGE(JERR_FILE_READ, \"Input file read error\")\nJMESSAGE(JERR_FILE_WRITE, \"Output file write error --- out of disk space?\")\nJMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, \"Fractional sampling not implemented yet\")\nJMESSAGE(JERR_HUFF_CLEN_OVERFLOW, \"Huffman code size table overflow\")\nJMESSAGE(JERR_HUFF_MISSING_CODE, \"Missing Huffman code table entry\")\nJMESSAGE(JERR_IMAGE_TOO_BIG, \"Maximum supported image dimension is %u pixels\")\nJMESSAGE(JERR_INPUT_EMPTY, \"Empty input file\")\nJMESSAGE(JERR_INPUT_EOF, \"Premature end of input file\")\nJMESSAGE(JERR_MISMATCHED_QUANT_TABLE,\n\t \"Cannot transcode due to multiple use of quantization table %d\")\nJMESSAGE(JERR_MISSING_DATA, \"Scan script does not transmit all data\")\nJMESSAGE(JERR_MODE_CHANGE, \"Invalid color quantization mode change\")\nJMESSAGE(JERR_NOTIMPL, \"Not implemented yet\")\nJMESSAGE(JERR_NOT_COMPILED, \"Requested feature was omitted at compile time\")\nJMESSAGE(JERR_NO_ARITH_TABLE, \"Arithmetic table 0x%02x was not defined\")\nJMESSAGE(JERR_NO_BACKING_STORE, \"Backing store not supported\")\nJMESSAGE(JERR_NO_HUFF_TABLE, \"Huffman table 0x%02x was not defined\")\nJMESSAGE(JERR_NO_IMAGE, \"JPEG datastream contains no image\")\nJMESSAGE(JERR_NO_QUANT_TABLE, \"Quantization table 0x%02x was not defined\")\nJMESSAGE(JERR_NO_SOI, \"Not a JPEG file: starts with 0x%02x 0x%02x\")\nJMESSAGE(JERR_OUT_OF_MEMORY, \"Insufficient memory (case %d)\")\nJMESSAGE(JERR_QUANT_COMPONENTS,\n\t \"Cannot quantize more than %d color components\")\nJMESSAGE(JERR_QUANT_FEW_COLORS, \"Cannot quantize to fewer than %d colors\")\nJMESSAGE(JERR_QUANT_MANY_COLORS, \"Cannot quantize to more than %d colors\")\nJMESSAGE(JERR_SOF_BEFORE, \"Invalid JPEG file structure: %s before SOF\")\nJMESSAGE(JERR_SOF_DUPLICATE, \"Invalid JPEG file structure: two SOF markers\")\nJMESSAGE(JERR_SOF_NO_SOS, \"Invalid JPEG file structure: missing SOS marker\")\nJMESSAGE(JERR_SOF_UNSUPPORTED, \"Unsupported JPEG process: SOF type 0x%02x\")\nJMESSAGE(JERR_SOI_DUPLICATE, \"Invalid JPEG file structure: two SOI markers\")\nJMESSAGE(JERR_TFILE_CREATE, \"Failed to create temporary file %s\")\nJMESSAGE(JERR_TFILE_READ, \"Read failed on temporary file\")\nJMESSAGE(JERR_TFILE_SEEK, \"Seek failed on temporary file\")\nJMESSAGE(JERR_TFILE_WRITE,\n\t \"Write failed on temporary file --- out of disk space?\")\nJMESSAGE(JERR_TOO_LITTLE_DATA, \"Application transferred too few scanlines\")\nJMESSAGE(JERR_UNKNOWN_MARKER, \"Unsupported marker type 0x%02x\")\nJMESSAGE(JERR_VIRTUAL_BUG, \"Virtual array controller messed up\")\nJMESSAGE(JERR_WIDTH_OVERFLOW, \"Image too wide for this implementation\")\nJMESSAGE(JERR_XMS_READ, \"Read from XMS failed\")\nJMESSAGE(JERR_XMS_WRITE, \"Write to XMS failed\")\nJMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)\nJMESSAGE(JMSG_VERSION, JVERSION)\nJMESSAGE(JTRC_16BIT_TABLES,\n\t \"Caution: quantization tables are too coarse for baseline JPEG\")\nJMESSAGE(JTRC_ADOBE,\n\t \"Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d\")\nJMESSAGE(JTRC_APP0, \"Unknown APP0 marker (not JFIF), length %u\")\nJMESSAGE(JTRC_APP14, \"Unknown APP14 marker (not Adobe), length %u\")\nJMESSAGE(JTRC_DAC, \"Define Arithmetic Table 0x%02x: 0x%02x\")\nJMESSAGE(JTRC_DHT, \"Define Huffman Table 0x%02x\")\nJMESSAGE(JTRC_DQT, \"Define Quantization Table %d  precision %d\")\nJMESSAGE(JTRC_DRI, \"Define Restart Interval %u\")\nJMESSAGE(JTRC_EMS_CLOSE, \"Freed EMS handle %u\")\nJMESSAGE(JTRC_EMS_OPEN, \"Obtained EMS handle %u\")\nJMESSAGE(JTRC_EOI, \"End Of Image\")\nJMESSAGE(JTRC_HUFFBITS, \"        %3d %3d %3d %3d %3d %3d %3d %3d\")\nJMESSAGE(JTRC_JFIF, \"JFIF APP0 marker: version %d.%02d, density %dx%d  %d\")\nJMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,\n\t \"Warning: thumbnail image size does not match data length %u\")\nJMESSAGE(JTRC_JFIF_EXTENSION,\n\t \"JFIF extension marker: type 0x%02x, length %u\")\nJMESSAGE(JTRC_JFIF_THUMBNAIL, \"    with %d x %d thumbnail image\")\nJMESSAGE(JTRC_MISC_MARKER, \"Miscellaneous marker 0x%02x, length %u\")\nJMESSAGE(JTRC_PARMLESS_MARKER, \"Unexpected marker 0x%02x\")\nJMESSAGE(JTRC_QUANTVALS, \"        %4u %4u %4u %4u %4u %4u %4u %4u\")\nJMESSAGE(JTRC_QUANT_3_NCOLORS, \"Quantizing to %d = %d*%d*%d colors\")\nJMESSAGE(JTRC_QUANT_NCOLORS, \"Quantizing to %d colors\")\nJMESSAGE(JTRC_QUANT_SELECTED, \"Selected %d colors for quantization\")\nJMESSAGE(JTRC_RECOVERY_ACTION, \"At marker 0x%02x, recovery action %d\")\nJMESSAGE(JTRC_RST, \"RST%d\")\nJMESSAGE(JTRC_SMOOTH_NOTIMPL,\n\t \"Smoothing not supported with nonstandard sampling ratios\")\nJMESSAGE(JTRC_SOF, \"Start Of Frame 0x%02x: width=%u, height=%u, components=%d\")\nJMESSAGE(JTRC_SOF_COMPONENT, \"    Component %d: %dhx%dv q=%d\")\nJMESSAGE(JTRC_SOI, \"Start of Image\")\nJMESSAGE(JTRC_SOS, \"Start Of Scan: %d components\")\nJMESSAGE(JTRC_SOS_COMPONENT, \"    Component %d: dc=%d ac=%d\")\nJMESSAGE(JTRC_SOS_PARAMS, \"  Ss=%d, Se=%d, Ah=%d, Al=%d\")\nJMESSAGE(JTRC_TFILE_CLOSE, \"Closed temporary file %s\")\nJMESSAGE(JTRC_TFILE_OPEN, \"Opened temporary file %s\")\nJMESSAGE(JTRC_THUMB_JPEG,\n\t \"JFIF extension marker: JPEG-compressed thumbnail image, length %u\")\nJMESSAGE(JTRC_THUMB_PALETTE,\n\t \"JFIF extension marker: palette thumbnail image, length %u\")\nJMESSAGE(JTRC_THUMB_RGB,\n\t \"JFIF extension marker: RGB thumbnail image, length %u\")\nJMESSAGE(JTRC_UNKNOWN_IDS,\n\t \"Unrecognized component IDs %d %d %d, assuming YCbCr\")\nJMESSAGE(JTRC_XMS_CLOSE, \"Freed XMS handle %u\")\nJMESSAGE(JTRC_XMS_OPEN, \"Obtained XMS handle %u\")\nJMESSAGE(JWRN_ADOBE_XFORM, \"Unknown Adobe color transform code %d\")\nJMESSAGE(JWRN_ARITH_BAD_CODE, \"Corrupt JPEG data: bad arithmetic code\")\nJMESSAGE(JWRN_BOGUS_PROGRESSION,\n\t \"Inconsistent progression sequence for component %d coefficient %d\")\nJMESSAGE(JWRN_EXTRANEOUS_DATA,\n\t \"Corrupt JPEG data: %u extraneous bytes before marker 0x%02x\")\nJMESSAGE(JWRN_HIT_MARKER, \"Corrupt JPEG data: premature end of data segment\")\nJMESSAGE(JWRN_HUFF_BAD_CODE, \"Corrupt JPEG data: bad Huffman code\")\nJMESSAGE(JWRN_JFIF_MAJOR, \"Warning: unknown JFIF revision number %d.%02d\")\nJMESSAGE(JWRN_JPEG_EOF, \"Premature end of JPEG file\")\nJMESSAGE(JWRN_MUST_RESYNC,\n\t \"Corrupt JPEG data: found marker 0x%02x instead of RST%d\")\nJMESSAGE(JWRN_NOT_SEQUENTIAL, \"Invalid SOS parameters for sequential JPEG\")\nJMESSAGE(JWRN_TOO_MUCH_DATA, \"Application transferred too many scanlines\")\n\n#ifdef JMAKE_ENUM_LIST\n\n  JMSG_LASTMSGCODE\n} J_MESSAGE_CODE;\n\n#undef JMAKE_ENUM_LIST\n#endif /* JMAKE_ENUM_LIST */\n\n/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */\n#undef JMESSAGE\n\n\n#ifndef JERROR_H\n#define JERROR_H\n\n/* Macros to simplify using the error and trace message stuff */\n/* The first parameter is either type of cinfo pointer */\n\n/* Fatal errors (print message and exit) */\n#define ERREXIT(cinfo,code)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT1(cinfo,code,p1)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT2(cinfo,code,p1,p2)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT3(cinfo,code,p1,p2,p3)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (cinfo)->err->msg_parm.i[2] = (p3), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT4(cinfo,code,p1,p2,p3,p4)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (cinfo)->err->msg_parm.i[2] = (p3), \\\n   (cinfo)->err->msg_parm.i[3] = (p4), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (cinfo)->err->msg_parm.i[2] = (p3), \\\n   (cinfo)->err->msg_parm.i[3] = (p4), \\\n   (cinfo)->err->msg_parm.i[4] = (p5), \\\n   (cinfo)->err->msg_parm.i[5] = (p6), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n#define ERREXITS(cinfo,code,str)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \\\n   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))\n\n#define MAKESTMT(stuff)\t\tdo { stuff } while (0)\n\n/* Nonfatal errors (we can keep going, but the data is probably corrupt) */\n#define WARNMS(cinfo,code)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))\n#define WARNMS1(cinfo,code,p1)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))\n#define WARNMS2(cinfo,code,p1,p2)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))\n\n/* Informational/debugging messages */\n#define TRACEMS(cinfo,lvl,code)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n#define TRACEMS1(cinfo,lvl,code,p1)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n#define TRACEMS2(cinfo,lvl,code,p1,p2)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   (cinfo)->err->msg_parm.i[0] = (p1), \\\n   (cinfo)->err->msg_parm.i[1] = (p2), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n#define TRACEMS3(cinfo,lvl,code,p1,p2,p3)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \\\n\t   _mp[4] = (p5); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8)  \\\n  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \\\n\t   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \\\n\t   _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \\\n\t   (cinfo)->err->msg_code = (code); \\\n\t   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )\n#define TRACEMSS(cinfo,lvl,code,str)  \\\n  ((cinfo)->err->msg_code = (code), \\\n   strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \\\n   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))\n\n#endif /* JERROR_H */\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/jinclude.h",
    "content": "/*\n * jinclude.h\n *\n * Copyright (C) 1991-1994, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file exists to provide a single place to fix any problems with\n * including the wrong system include files.  (Common problems are taken\n * care of by the standard jconfig symbols, but on really weird systems\n * you may have to edit this file.)\n *\n * NOTE: this file is NOT intended to be included by applications using the\n * JPEG library.  Most applications need only include jpeglib.h.\n */\n\n\n/* Include auto-config file to find out which system include files we need. */\n\n#include \"jconfig.h\"\t\t/* auto configuration options */\n#define JCONFIG_INCLUDED\t/* so that jpeglib.h doesn't do it again */\n\n/*\n * We need the NULL macro and size_t typedef.\n * On an ANSI-conforming system it is sufficient to include <stddef.h>.\n * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to\n * pull in <sys/types.h> as well.\n * Note that the core JPEG library does not require <stdio.h>;\n * only the default error handler and data source/destination modules do.\n * But we must pull it in because of the references to FILE in jpeglib.h.\n * You can remove those references if you want to compile without <stdio.h>.\n */\n\n#ifdef HAVE_STDDEF_H\n#include <stddef.h>\n#endif\n\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n\n#ifdef NEED_SYS_TYPES_H\n#include <sys/types.h>\n#endif\n\n#include <stdio.h>\n\n/*\n * We need memory copying and zeroing functions, plus strncpy().\n * ANSI and System V implementations declare these in <string.h>.\n * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().\n * Some systems may declare memset and memcpy in <memory.h>.\n *\n * NOTE: we assume the size parameters to these functions are of type size_t.\n * Change the casts in these macros if not!\n */\n\n#ifdef NEED_BSD_STRINGS\n\n#include <strings.h>\n#define MEMZERO(target,size)\tbzero((void *)(target), (size_t)(size))\n#define MEMCOPY(dest,src,size)\tbcopy((const void *)(src), (void *)(dest), (size_t)(size))\n\n#else /* not BSD, assume ANSI/SysV string lib */\n\n#include <string.h>\n#define MEMZERO(target,size)\tmemset((void *)(target), 0, (size_t)(size))\n#define MEMCOPY(dest,src,size)\tmemcpy((void *)(dest), (const void *)(src), (size_t)(size))\n\n#endif\n\n/*\n * In ANSI C, and indeed any rational implementation, size_t is also the\n * type returned by sizeof().  However, it seems there are some irrational\n * implementations out there, in which sizeof() returns an int even though\n * size_t is defined as long or unsigned long.  To ensure consistent results\n * we always use this SIZEOF() macro in place of using sizeof() directly.\n */\n\n#define SIZEOF(object)\t((size_t) sizeof(object))\n\n/*\n * The modules that use fread() and fwrite() always invoke them through\n * these macros.  On some systems you may need to twiddle the argument casts.\n * CAUTION: argument order is different from underlying functions!\n */\n\n#define JFREAD(file,buf,sizeofbuf)  \\\n  ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))\n#define JFWRITE(file,buf,sizeofbuf)  \\\n  ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/jmemsys.h",
    "content": "/*\n * jmemsys.h\n *\n * Copyright (C) 1992-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This include file defines the interface between the system-independent\n * and system-dependent portions of the JPEG memory manager.  No other\n * modules need include it.  (The system-independent portion is jmemmgr.c;\n * there are several different versions of the system-dependent portion.)\n *\n * This file works as-is for the system-dependent memory managers supplied\n * in the IJG distribution.  You may need to modify it if you write a\n * custom memory manager.  If system-dependent changes are needed in\n * this file, the best method is to #ifdef them based on a configuration\n * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR\n * and USE_MAC_MEMMGR.\n */\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_get_small\t\tjGetSmall\n#define jpeg_free_small\t\tjFreeSmall\n#define jpeg_get_large\t\tjGetLarge\n#define jpeg_free_large\t\tjFreeLarge\n#define jpeg_mem_available\tjMemAvail\n#define jpeg_open_backing_store\tjOpenBackStore\n#define jpeg_mem_init\t\tjMemInit\n#define jpeg_mem_term\t\tjMemTerm\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/*\n * These two functions are used to allocate and release small chunks of\n * memory.  (Typically the total amount requested through jpeg_get_small is\n * no more than 20K or so; this will be requested in chunks of a few K each.)\n * Behavior should be the same as for the standard library functions malloc\n * and free; in particular, jpeg_get_small must return NULL on failure.\n * On most systems, these ARE malloc and free.  jpeg_free_small is passed the\n * size of the object being freed, just in case it's needed.\n * On an 80x86 machine using small-data memory model, these manage near heap.\n */\n\nEXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject));\nEXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object,\n\t\t\t\t  size_t sizeofobject));\n\n/*\n * These two functions are used to allocate and release large chunks of\n * memory (up to the total free space designated by jpeg_mem_available).\n * The interface is the same as above, except that on an 80x86 machine,\n * far pointers are used.  On most other machines these are identical to\n * the jpeg_get/free_small routines; but we keep them separate anyway,\n * in case a different allocation strategy is desirable for large chunks.\n */\n\nEXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo,\n\t\t\t\t       size_t sizeofobject));\nEXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object,\n\t\t\t\t  size_t sizeofobject));\n\n/*\n * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may\n * be requested in a single call to jpeg_get_large (and jpeg_get_small for that\n * matter, but that case should never come into play).  This macro is needed\n * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.\n * On those machines, we expect that jconfig.h will provide a proper value.\n * On machines with 32-bit flat address spaces, any large constant may be used.\n *\n * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type\n * size_t and will be a multiple of sizeof(align_type).\n */\n\n#ifndef MAX_ALLOC_CHUNK\t\t/* may be overridden in jconfig.h */\n#define MAX_ALLOC_CHUNK  1000000000L\n#endif\n\n/*\n * This routine computes the total space still available for allocation by\n * jpeg_get_large.  If more space than this is needed, backing store will be\n * used.  NOTE: any memory already allocated must not be counted.\n *\n * There is a minimum space requirement, corresponding to the minimum\n * feasible buffer sizes; jmemmgr.c will request that much space even if\n * jpeg_mem_available returns zero.  The maximum space needed, enough to hold\n * all working storage in memory, is also passed in case it is useful.\n * Finally, the total space already allocated is passed.  If no better\n * method is available, cinfo->mem->max_memory_to_use - already_allocated\n * is often a suitable calculation.\n *\n * It is OK for jpeg_mem_available to underestimate the space available\n * (that'll just lead to more backing-store access than is really necessary).\n * However, an overestimate will lead to failure.  Hence it's wise to subtract\n * a slop factor from the true available space.  5% should be enough.\n *\n * On machines with lots of virtual memory, any large constant may be returned.\n * Conversely, zero may be returned to always use the minimum amount of memory.\n */\n\nEXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo,\n\t\t\t\t     long min_bytes_needed,\n\t\t\t\t     long max_bytes_needed,\n\t\t\t\t     long already_allocated));\n\n\n/*\n * This structure holds whatever state is needed to access a single\n * backing-store object.  The read/write/close method pointers are called\n * by jmemmgr.c to manipulate the backing-store object; all other fields\n * are private to the system-dependent backing store routines.\n */\n\n#define TEMP_NAME_LENGTH   64\t/* max length of a temporary file's name */\n\n\n#ifdef USE_MSDOS_MEMMGR\t\t/* DOS-specific junk */\n\ntypedef unsigned short XMSH;\t/* type of extended-memory handles */\ntypedef unsigned short EMSH;\t/* type of expanded-memory handles */\n\ntypedef union {\n  short file_handle;\t\t/* DOS file handle if it's a temp file */\n  XMSH xms_handle;\t\t/* handle if it's a chunk of XMS */\n  EMSH ems_handle;\t\t/* handle if it's a chunk of EMS */\n} handle_union;\n\n#endif /* USE_MSDOS_MEMMGR */\n\n#ifdef USE_MAC_MEMMGR\t\t/* Mac-specific junk */\n#include <Files.h>\n#endif /* USE_MAC_MEMMGR */\n\n\ntypedef struct backing_store_struct * backing_store_ptr;\n\ntypedef struct backing_store_struct {\n  /* Methods for reading/writing/closing this backing-store object */\n  JMETHOD(void, read_backing_store, (j_common_ptr cinfo,\n\t\t\t\t     backing_store_ptr info,\n\t\t\t\t     void FAR * buffer_address,\n\t\t\t\t     long file_offset, long byte_count));\n  JMETHOD(void, write_backing_store, (j_common_ptr cinfo,\n\t\t\t\t      backing_store_ptr info,\n\t\t\t\t      void FAR * buffer_address,\n\t\t\t\t      long file_offset, long byte_count));\n  JMETHOD(void, close_backing_store, (j_common_ptr cinfo,\n\t\t\t\t      backing_store_ptr info));\n\n  /* Private fields for system-dependent backing-store management */\n#ifdef USE_MSDOS_MEMMGR\n  /* For the MS-DOS manager (jmemdos.c), we need: */\n  handle_union handle;\t\t/* reference to backing-store storage object */\n  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */\n#else\n#ifdef USE_MAC_MEMMGR\n  /* For the Mac manager (jmemmac.c), we need: */\n  short temp_file;\t\t/* file reference number to temp file */\n  FSSpec tempSpec;\t\t/* the FSSpec for the temp file */\n  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */\n#else\n  /* For a typical implementation with temp files, we need: */\n  FILE * temp_file;\t\t/* stdio reference to temp file */\n  char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */\n#endif\n#endif\n} backing_store_info;\n\n\n/*\n * Initial opening of a backing-store object.  This must fill in the\n * read/write/close pointers in the object.  The read/write routines\n * may take an error exit if the specified maximum file size is exceeded.\n * (If jpeg_mem_available always returns a large value, this routine can\n * just take an error exit.)\n */\n\nEXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo,\n\t\t\t\t\t  backing_store_ptr info,\n\t\t\t\t\t  long total_bytes_needed));\n\n\n/*\n * These routines take care of any system-dependent initialization and\n * cleanup required.  jpeg_mem_init will be called before anything is\n * allocated (and, therefore, nothing in cinfo is of use except the error\n * manager pointer).  It should return a suitable default value for\n * max_memory_to_use; this may subsequently be overridden by the surrounding\n * application.  (Note that max_memory_to_use is only important if\n * jpeg_mem_available chooses to consult it ... no one else will.)\n * jpeg_mem_term may assume that all requested memory has been freed and that\n * all opened backing-store objects have been closed.\n */\n\nEXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo));\nEXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo));\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/jmorecfg.h",
    "content": "/*\n * jmorecfg.h\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 1997-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains additional configuration options that customize the\n * JPEG software for special applications or support machine-dependent\n * optimizations.  Most users will not need to touch this file.\n */\n\n\n/*\n * Define BITS_IN_JSAMPLE as either\n *   8   for 8-bit sample values (the usual setting)\n *   12  for 12-bit sample values\n * Only 8 and 12 are legal data precisions for lossy JPEG according to the\n * JPEG standard, and the IJG code does not support anything else!\n * We do not support run-time selection of data precision, sorry.\n */\n\n#define BITS_IN_JSAMPLE  8\t/* use 8 or 12 */\n\n\n/*\n * Maximum number of components (color channels) allowed in JPEG image.\n * To meet the letter of the JPEG spec, set this to 255.  However, darn\n * few applications need more than 4 channels (maybe 5 for CMYK + alpha\n * mask).  We recommend 10 as a reasonable compromise; use 4 if you are\n * really short on memory.  (Each allowed component costs a hundred or so\n * bytes of storage, whether actually used in an image or not.)\n */\n\n#define MAX_COMPONENTS  10\t/* maximum number of image components */\n\n\n/*\n * Basic data types.\n * You may need to change these if you have a machine with unusual data\n * type sizes; for example, \"char\" not 8 bits, \"short\" not 16 bits,\n * or \"long\" not 32 bits.  We don't care whether \"int\" is 16 or 32 bits,\n * but it had better be at least 16.\n */\n\n/* Representation of a single sample (pixel element value).\n * We frequently allocate large arrays of these, so it's important to keep\n * them small.  But if you have memory to burn and access to char or short\n * arrays is very slow on your hardware, you might want to change these.\n */\n\n#if BITS_IN_JSAMPLE == 8\n/* JSAMPLE should be the smallest type that will hold the values 0..255.\n * You can use a signed char by having GETJSAMPLE mask it with 0xFF.\n */\n\n#ifdef HAVE_UNSIGNED_CHAR\n\ntypedef unsigned char JSAMPLE;\n#define GETJSAMPLE(value)  ((int) (value))\n\n#else /* not HAVE_UNSIGNED_CHAR */\n\ntypedef char JSAMPLE;\n#ifdef CHAR_IS_UNSIGNED\n#define GETJSAMPLE(value)  ((int) (value))\n#else\n#define GETJSAMPLE(value)  ((int) (value) & 0xFF)\n#endif /* CHAR_IS_UNSIGNED */\n\n#endif /* HAVE_UNSIGNED_CHAR */\n\n#define MAXJSAMPLE\t255\n#define CENTERJSAMPLE\t128\n\n#endif /* BITS_IN_JSAMPLE == 8 */\n\n\n#if BITS_IN_JSAMPLE == 12\n/* JSAMPLE should be the smallest type that will hold the values 0..4095.\n * On nearly all machines \"short\" will do nicely.\n */\n\ntypedef short JSAMPLE;\n#define GETJSAMPLE(value)  ((int) (value))\n\n#define MAXJSAMPLE\t4095\n#define CENTERJSAMPLE\t2048\n\n#endif /* BITS_IN_JSAMPLE == 12 */\n\n\n/* Representation of a DCT frequency coefficient.\n * This should be a signed value of at least 16 bits; \"short\" is usually OK.\n * Again, we allocate large arrays of these, but you can change to int\n * if you have memory to burn and \"short\" is really slow.\n */\n\ntypedef short JCOEF;\n\n\n/* Compressed datastreams are represented as arrays of JOCTET.\n * These must be EXACTLY 8 bits wide, at least once they are written to\n * external storage.  Note that when using the stdio data source/destination\n * managers, this is also the data type passed to fread/fwrite.\n */\n\n#ifdef HAVE_UNSIGNED_CHAR\n\ntypedef unsigned char JOCTET;\n#define GETJOCTET(value)  (value)\n\n#else /* not HAVE_UNSIGNED_CHAR */\n\ntypedef char JOCTET;\n#ifdef CHAR_IS_UNSIGNED\n#define GETJOCTET(value)  (value)\n#else\n#define GETJOCTET(value)  ((value) & 0xFF)\n#endif /* CHAR_IS_UNSIGNED */\n\n#endif /* HAVE_UNSIGNED_CHAR */\n\n\n/* These typedefs are used for various table entries and so forth.\n * They must be at least as wide as specified; but making them too big\n * won't cost a huge amount of memory, so we don't provide special\n * extraction code like we did for JSAMPLE.  (In other words, these\n * typedefs live at a different point on the speed/space tradeoff curve.)\n */\n\n/* UINT8 must hold at least the values 0..255. */\n\n#ifdef HAVE_UNSIGNED_CHAR\ntypedef unsigned char UINT8;\n#else /* not HAVE_UNSIGNED_CHAR */\n#ifdef CHAR_IS_UNSIGNED\ntypedef char UINT8;\n#else /* not CHAR_IS_UNSIGNED */\ntypedef short UINT8;\n#endif /* CHAR_IS_UNSIGNED */\n#endif /* HAVE_UNSIGNED_CHAR */\n\n/* UINT16 must hold at least the values 0..65535. */\n\n#ifdef HAVE_UNSIGNED_SHORT\ntypedef unsigned short UINT16;\n#else /* not HAVE_UNSIGNED_SHORT */\ntypedef unsigned int UINT16;\n#endif /* HAVE_UNSIGNED_SHORT */\n\n/* INT16 must hold at least the values -32768..32767. */\n\n#ifndef XMD_H\t\t\t/* X11/xmd.h correctly defines INT16 */\ntypedef short INT16;\n#endif\n\n/* INT32 must hold at least signed 32-bit values. */\n\n#ifndef XMD_H\t\t\t/* X11/xmd.h correctly defines INT32 */\n#ifndef _BASETSD_H_\t\t/* Microsoft defines it in basetsd.h */\n#ifndef _BASETSD_H\t\t/* MinGW is slightly different */\n#ifndef QGLOBAL_H\t\t/* Qt defines it in qglobal.h */\ntypedef long INT32;\n#endif\n#endif\n#endif\n#endif\n\n/* Datatype used for image dimensions.  The JPEG standard only supports\n * images up to 64K*64K due to 16-bit fields in SOF markers.  Therefore\n * \"unsigned int\" is sufficient on all machines.  However, if you need to\n * handle larger images and you don't mind deviating from the spec, you\n * can change this datatype.\n */\n\ntypedef unsigned int JDIMENSION;\n\n#define JPEG_MAX_DIMENSION  65500L  /* a tad under 64K to prevent overflows */\n\n\n/* These macros are used in all function definitions and extern declarations.\n * You could modify them if you need to change function linkage conventions;\n * in particular, you'll need to do that to make the library a Windows DLL.\n * Another application is to make all functions global for use with debuggers\n * or code profilers that require it.\n */\n\n/* a function called through method pointers: */\n#define METHODDEF(type)\t\tstatic type\n/* a function used only in its module: */\n#define LOCAL(type)\t\tstatic type\n/* a function referenced thru EXTERNs: */\n#define GLOBAL(type)\t\ttype\n/* a reference to a GLOBAL function: */\n#define EXTERN(type)\t\textern type\n\n\n/* This macro is used to declare a \"method\", that is, a function pointer.\n * We want to supply prototype parameters if the compiler can cope.\n * Note that the arglist parameter must be parenthesized!\n * Again, you can customize this if you need special linkage keywords.\n */\n\n#ifdef HAVE_PROTOTYPES\n#define JMETHOD(type,methodname,arglist)  type (*methodname) arglist\n#else\n#define JMETHOD(type,methodname,arglist)  type (*methodname) ()\n#endif\n\n\n/* The noreturn type identifier is used to declare functions\n * which cannot return.\n * Compilers can thus create more optimized code and perform\n * better checks for warnings and errors.\n * Static analyzer tools can make improved inferences about\n * execution paths and are prevented from giving false alerts.\n *\n * Unfortunately, the proposed specifications of corresponding\n * extensions in the Dec 2011 ISO C standard revision (C11),\n * GCC, MSVC, etc. are not viable.\n * Thus we introduce a user defined type to declare noreturn\n * functions at least for clarity.  A proper compiler would\n * have a suitable noreturn type to match in place of void.\n */\n\n#ifndef HAVE_NORETURN_T\ntypedef void noreturn_t;\n#endif\n\n\n/* Here is the pseudo-keyword for declaring pointers that must be \"far\"\n * on 80x86 machines.  Most of the specialized coding for 80x86 is handled\n * by just saying \"FAR *\" where such a pointer is needed.  In a few places\n * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.\n */\n\n#ifndef FAR\n#ifdef NEED_FAR_POINTERS\n#define FAR  far\n#else\n#define FAR\n#endif\n#endif\n\n\n/*\n * On a few systems, type boolean and/or its values FALSE, TRUE may appear\n * in standard header files.  Or you may have conflicts with application-\n * specific header files that you want to include together with these files.\n * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.\n */\n\n#ifdef HAVE_BOOLEAN\n#ifndef FALSE\t\t\t/* in case these macros already exist */\n#define FALSE\t0\t\t/* values of boolean */\n#endif\n#ifndef TRUE\n#define TRUE\t1\n#endif\n#else\ntypedef enum { FALSE = 0, TRUE = 1 } boolean;\n#endif\n\n\n/*\n * The remaining options affect code selection within the JPEG library,\n * but they don't need to be visible to most applications using the library.\n * To minimize application namespace pollution, the symbols won't be\n * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.\n */\n\n#ifdef JPEG_INTERNALS\n#define JPEG_INTERNAL_OPTIONS\n#endif\n\n#ifdef JPEG_INTERNAL_OPTIONS\n\n\n/*\n * These defines indicate whether to include various optional functions.\n * Undefining some of these symbols will produce a smaller but less capable\n * library.  Note that you can leave certain source files out of the\n * compilation/linking process if you've #undef'd the corresponding symbols.\n * (You may HAVE to do that if your compiler doesn't like null source files.)\n */\n\n/* Capability options common to encoder and decoder: */\n\n#define DCT_ISLOW_SUPPORTED\t/* slow but accurate integer algorithm */\n#define DCT_IFAST_SUPPORTED\t/* faster, less accurate integer method */\n#define DCT_FLOAT_SUPPORTED\t/* floating-point: accurate, fast on fast HW */\n\n/* Encoder capability options: */\n\n#define C_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */\n#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */\n#define C_PROGRESSIVE_SUPPORTED\t    /* Progressive JPEG? (Requires MULTISCAN)*/\n#define DCT_SCALING_SUPPORTED\t    /* Input rescaling via DCT? (Requires DCT_ISLOW)*/\n#define ENTROPY_OPT_SUPPORTED\t    /* Optimization of entropy coding parms? */\n/* Note: if you selected 12-bit data precision, it is dangerous to turn off\n * ENTROPY_OPT_SUPPORTED.  The standard Huffman tables are only good for 8-bit\n * precision, so jchuff.c normally uses entropy optimization to compute\n * usable tables for higher precision.  If you don't want to do optimization,\n * you'll have to supply different default Huffman tables.\n * The exact same statements apply for progressive JPEG: the default tables\n * don't work for progressive mode.  (This may get fixed, however.)\n */\n#define INPUT_SMOOTHING_SUPPORTED   /* Input image smoothing option? */\n\n/* Decoder capability options: */\n\n#define D_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */\n#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */\n#define D_PROGRESSIVE_SUPPORTED\t    /* Progressive JPEG? (Requires MULTISCAN)*/\n#define IDCT_SCALING_SUPPORTED\t    /* Output rescaling via IDCT? */\n#define SAVE_MARKERS_SUPPORTED\t    /* jpeg_save_markers() needed? */\n#define BLOCK_SMOOTHING_SUPPORTED   /* Block smoothing? (Progressive only) */\n#undef  UPSAMPLE_SCALING_SUPPORTED  /* Output rescaling at upsample stage? */\n#define UPSAMPLE_MERGING_SUPPORTED  /* Fast path for sloppy upsampling? */\n#define QUANT_1PASS_SUPPORTED\t    /* 1-pass color quantization? */\n#define QUANT_2PASS_SUPPORTED\t    /* 2-pass color quantization? */\n\n/* more capability options later, no doubt */\n\n\n/*\n * Ordering of RGB data in scanlines passed to or from the application.\n * If your application wants to deal with data in the order B,G,R, just\n * change these macros.  You can also deal with formats such as R,G,B,X\n * (one extra byte per pixel) by changing RGB_PIXELSIZE.  Note that changing\n * the offsets will also change the order in which colormap data is organized.\n * RESTRICTIONS:\n * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.\n * 2. The color quantizer modules will not behave desirably if RGB_PIXELSIZE\n *    is not 3 (they don't understand about dummy color components!).  So you\n *    can't use color quantization if you change that value.\n */\n\n#define RGB_RED\t\t0\t/* Offset of Red in an RGB scanline element */\n#define RGB_GREEN\t1\t/* Offset of Green */\n#define RGB_BLUE\t2\t/* Offset of Blue */\n#define RGB_PIXELSIZE\t3\t/* JSAMPLEs per RGB scanline element */\n\n\n/* Definitions for speed-related optimizations. */\n\n\n/* If your compiler supports inline functions, define INLINE\n * as the inline keyword; otherwise define it as empty.\n */\n\n#ifndef INLINE\n#ifdef __GNUC__\t\t\t/* for instance, GNU C knows about inline */\n#define INLINE __inline__\n#endif\n#ifndef INLINE\n#define INLINE\t\t\t/* default is to define it as empty */\n#endif\n#endif\n\n\n/* On some machines (notably 68000 series) \"int\" is 32 bits, but multiplying\n * two 16-bit shorts is faster than multiplying two ints.  Define MULTIPLIER\n * as short on such a machine.  MULTIPLIER must be at least 16 bits wide.\n */\n\n#ifndef MULTIPLIER\n#define MULTIPLIER  int\t\t/* type for fastest integer multiply */\n#endif\n\n\n/* FAST_FLOAT should be either float or double, whichever is done faster\n * by your compiler.  (Note that this type is only used in the floating point\n * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)\n * Typically, float is faster in ANSI C compilers, while double is faster in\n * pre-ANSI compilers (because they insist on converting to double anyway).\n * The code below therefore chooses float if we have ANSI-style prototypes.\n */\n\n#ifndef FAST_FLOAT\n#ifdef HAVE_PROTOTYPES\n#define FAST_FLOAT  float\n#else\n#define FAST_FLOAT  double\n#endif\n#endif\n\n#endif /* JPEG_INTERNAL_OPTIONS */\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/jpegint.h",
    "content": "/*\n * jpegint.h\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 1997-2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file provides common declarations for the various JPEG modules.\n * These declarations are considered internal to the JPEG library; most\n * applications using the library shouldn't need to include this file.\n */\n\n\n/* Declarations for both compression & decompression */\n\ntypedef enum {\t\t\t/* Operating modes for buffer controllers */\n\tJBUF_PASS_THRU,\t\t/* Plain stripwise operation */\n\t/* Remaining modes require a full-image buffer to have been created */\n\tJBUF_SAVE_SOURCE,\t/* Run source subobject only, save output */\n\tJBUF_CRANK_DEST,\t/* Run dest subobject only, using saved data */\n\tJBUF_SAVE_AND_PASS\t/* Run both subobjects, save output */\n} J_BUF_MODE;\n\n/* Values of global_state field (jdapi.c has some dependencies on ordering!) */\n#define CSTATE_START\t100\t/* after create_compress */\n#define CSTATE_SCANNING\t101\t/* start_compress done, write_scanlines OK */\n#define CSTATE_RAW_OK\t102\t/* start_compress done, write_raw_data OK */\n#define CSTATE_WRCOEFS\t103\t/* jpeg_write_coefficients done */\n#define DSTATE_START\t200\t/* after create_decompress */\n#define DSTATE_INHEADER\t201\t/* reading header markers, no SOS yet */\n#define DSTATE_READY\t202\t/* found SOS, ready for start_decompress */\n#define DSTATE_PRELOAD\t203\t/* reading multiscan file in start_decompress*/\n#define DSTATE_PRESCAN\t204\t/* performing dummy pass for 2-pass quant */\n#define DSTATE_SCANNING\t205\t/* start_decompress done, read_scanlines OK */\n#define DSTATE_RAW_OK\t206\t/* start_decompress done, read_raw_data OK */\n#define DSTATE_BUFIMAGE\t207\t/* expecting jpeg_start_output */\n#define DSTATE_BUFPOST\t208\t/* looking for SOS/EOI in jpeg_finish_output */\n#define DSTATE_RDCOEFS\t209\t/* reading file in jpeg_read_coefficients */\n#define DSTATE_STOPPING\t210\t/* looking for EOI in jpeg_finish_decompress */\n\n\n/* Declarations for compression modules */\n\n/* Master control module */\nstruct jpeg_comp_master {\n  JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));\n  JMETHOD(void, pass_startup, (j_compress_ptr cinfo));\n  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));\n\n  /* State variables made visible to other modules */\n  boolean call_pass_startup;\t/* True if pass_startup must be called */\n  boolean is_last_pass;\t\t/* True during last pass */\n};\n\n/* Main buffer control (downsampled-data buffer) */\nstruct jpeg_c_main_controller {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, process_data, (j_compress_ptr cinfo,\n\t\t\t       JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t\t       JDIMENSION in_rows_avail));\n};\n\n/* Compression preprocessing (downsampling input buffer control) */\nstruct jpeg_c_prep_controller {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,\n\t\t\t\t   JSAMPARRAY input_buf,\n\t\t\t\t   JDIMENSION *in_row_ctr,\n\t\t\t\t   JDIMENSION in_rows_avail,\n\t\t\t\t   JSAMPIMAGE output_buf,\n\t\t\t\t   JDIMENSION *out_row_group_ctr,\n\t\t\t\t   JDIMENSION out_row_groups_avail));\n};\n\n/* Coefficient buffer control */\nstruct jpeg_c_coef_controller {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,\n\t\t\t\t   JSAMPIMAGE input_buf));\n};\n\n/* Colorspace conversion */\nstruct jpeg_color_converter {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo));\n  JMETHOD(void, color_convert, (j_compress_ptr cinfo,\n\t\t\t\tJSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t\t\tJDIMENSION output_row, int num_rows));\n};\n\n/* Downsampling */\nstruct jpeg_downsampler {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo));\n  JMETHOD(void, downsample, (j_compress_ptr cinfo,\n\t\t\t     JSAMPIMAGE input_buf, JDIMENSION in_row_index,\n\t\t\t     JSAMPIMAGE output_buf,\n\t\t\t     JDIMENSION out_row_group_index));\n\n  boolean need_context_rows;\t/* TRUE if need rows above & below */\n};\n\n/* Forward DCT (also controls coefficient quantization) */\ntypedef JMETHOD(void, forward_DCT_ptr,\n\t\t(j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JSAMPARRAY sample_data, JBLOCKROW coef_blocks,\n\t\t JDIMENSION start_row, JDIMENSION start_col,\n\t\t JDIMENSION num_blocks));\n\nstruct jpeg_forward_dct {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo));\n  /* It is useful to allow each component to have a separate FDCT method. */\n  forward_DCT_ptr forward_DCT[MAX_COMPONENTS];\n};\n\n/* Entropy encoding */\nstruct jpeg_entropy_encoder {\n  JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));\n  JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));\n  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));\n};\n\n/* Marker writing */\nstruct jpeg_marker_writer {\n  JMETHOD(void, write_file_header, (j_compress_ptr cinfo));\n  JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));\n  JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));\n  JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));\n  JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));\n  /* These routines are exported to allow insertion of extra markers */\n  /* Probably only COM and APPn markers should be written this way */\n  JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,\n\t\t\t\t      unsigned int datalen));\n  JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));\n};\n\n\n/* Declarations for decompression modules */\n\n/* Master control module */\nstruct jpeg_decomp_master {\n  JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));\n\n  /* State variables made visible to other modules */\n  boolean is_dummy_pass;\t/* True during 1st pass for 2-pass quant */\n};\n\n/* Input control module */\nstruct jpeg_input_controller {\n  JMETHOD(int, consume_input, (j_decompress_ptr cinfo));\n  JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));\n  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));\n\n  /* State variables made visible to other modules */\n  boolean has_multiple_scans;\t/* True if file has multiple scans */\n  boolean eoi_reached;\t\t/* True when EOI has been consumed */\n};\n\n/* Main buffer control (downsampled-data buffer) */\nstruct jpeg_d_main_controller {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, process_data, (j_decompress_ptr cinfo,\n\t\t\t       JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t\t       JDIMENSION out_rows_avail));\n};\n\n/* Coefficient buffer control */\nstruct jpeg_d_coef_controller {\n  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));\n  JMETHOD(int, consume_data, (j_decompress_ptr cinfo));\n  JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));\n  JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,\n\t\t\t\t JSAMPIMAGE output_buf));\n  /* Pointer to array of coefficient virtual arrays, or NULL if none */\n  jvirt_barray_ptr *coef_arrays;\n};\n\n/* Decompression postprocessing (color quantization buffer control) */\nstruct jpeg_d_post_controller {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));\n  JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,\n\t\t\t\t    JSAMPIMAGE input_buf,\n\t\t\t\t    JDIMENSION *in_row_group_ctr,\n\t\t\t\t    JDIMENSION in_row_groups_avail,\n\t\t\t\t    JSAMPARRAY output_buf,\n\t\t\t\t    JDIMENSION *out_row_ctr,\n\t\t\t\t    JDIMENSION out_rows_avail));\n};\n\n/* Marker reading & parsing */\nstruct jpeg_marker_reader {\n  JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));\n  /* Read markers until SOS or EOI.\n   * Returns same codes as are defined for jpeg_consume_input:\n   * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.\n   */\n  JMETHOD(int, read_markers, (j_decompress_ptr cinfo));\n  /* Read a restart marker --- exported for use by entropy decoder only */\n  jpeg_marker_parser_method read_restart_marker;\n\n  /* State of marker reader --- nominally internal, but applications\n   * supplying COM or APPn handlers might like to know the state.\n   */\n  boolean saw_SOI;\t\t/* found SOI? */\n  boolean saw_SOF;\t\t/* found SOF? */\n  int next_restart_num;\t\t/* next restart number expected (0-7) */\n  unsigned int discarded_bytes;\t/* # of bytes skipped looking for a marker */\n};\n\n/* Entropy decoding */\nstruct jpeg_entropy_decoder {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,\n\t\t\t\tJBLOCKROW *MCU_data));\n};\n\n/* Inverse DCT (also performs dequantization) */\ntypedef JMETHOD(void, inverse_DCT_method_ptr,\n\t\t(j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col));\n\nstruct jpeg_inverse_dct {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  /* It is useful to allow each component to have a separate IDCT method. */\n  inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];\n};\n\n/* Upsampling (note that upsampler must also call color converter) */\nstruct jpeg_upsampler {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, upsample, (j_decompress_ptr cinfo,\n\t\t\t   JSAMPIMAGE input_buf,\n\t\t\t   JDIMENSION *in_row_group_ctr,\n\t\t\t   JDIMENSION in_row_groups_avail,\n\t\t\t   JSAMPARRAY output_buf,\n\t\t\t   JDIMENSION *out_row_ctr,\n\t\t\t   JDIMENSION out_rows_avail));\n\n  boolean need_context_rows;\t/* TRUE if need rows above & below */\n};\n\n/* Colorspace conversion */\nstruct jpeg_color_deconverter {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, color_convert, (j_decompress_ptr cinfo,\n\t\t\t\tJSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t\t\tJSAMPARRAY output_buf, int num_rows));\n};\n\n/* Color quantization or color precision reduction */\nstruct jpeg_color_quantizer {\n  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));\n  JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,\n\t\t\t\t JSAMPARRAY input_buf, JSAMPARRAY output_buf,\n\t\t\t\t int num_rows));\n  JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));\n  JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));\n};\n\n\n/* Miscellaneous useful macros */\n\n#undef MAX\n#define MAX(a,b)\t((a) > (b) ? (a) : (b))\n#undef MIN\n#define MIN(a,b)\t((a) < (b) ? (a) : (b))\n\n\n/* We assume that right shift corresponds to signed division by 2 with\n * rounding towards minus infinity.  This is correct for typical \"arithmetic\n * shift\" instructions that shift in copies of the sign bit.  But some\n * C compilers implement >> with an unsigned shift.  For these machines you\n * must define RIGHT_SHIFT_IS_UNSIGNED.\n * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.\n * It is only applied with constant shift counts.  SHIFT_TEMPS must be\n * included in the variables of any routine using RIGHT_SHIFT.\n */\n\n#ifdef RIGHT_SHIFT_IS_UNSIGNED\n#define SHIFT_TEMPS\tINT32 shift_temp;\n#define RIGHT_SHIFT(x,shft)  \\\n\t((shift_temp = (x)) < 0 ? \\\n\t (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \\\n\t (shift_temp >> (shft)))\n#else\n#define SHIFT_TEMPS\n#define RIGHT_SHIFT(x,shft)\t((x) >> (shft))\n#endif\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jinit_compress_master\tjICompress\n#define jinit_c_master_control\tjICMaster\n#define jinit_c_main_controller\tjICMainC\n#define jinit_c_prep_controller\tjICPrepC\n#define jinit_c_coef_controller\tjICCoefC\n#define jinit_color_converter\tjICColor\n#define jinit_downsampler\tjIDownsampler\n#define jinit_forward_dct\tjIFDCT\n#define jinit_huff_encoder\tjIHEncoder\n#define jinit_arith_encoder\tjIAEncoder\n#define jinit_marker_writer\tjIMWriter\n#define jinit_master_decompress\tjIDMaster\n#define jinit_d_main_controller\tjIDMainC\n#define jinit_d_coef_controller\tjIDCoefC\n#define jinit_d_post_controller\tjIDPostC\n#define jinit_input_controller\tjIInCtlr\n#define jinit_marker_reader\tjIMReader\n#define jinit_huff_decoder\tjIHDecoder\n#define jinit_arith_decoder\tjIADecoder\n#define jinit_inverse_dct\tjIIDCT\n#define jinit_upsampler\t\tjIUpsampler\n#define jinit_color_deconverter\tjIDColor\n#define jinit_1pass_quantizer\tjI1Quant\n#define jinit_2pass_quantizer\tjI2Quant\n#define jinit_merged_upsampler\tjIMUpsampler\n#define jinit_memory_mgr\tjIMemMgr\n#define jdiv_round_up\t\tjDivRound\n#define jround_up\t\tjRound\n#define jzero_far\t\tjZeroFar\n#define jcopy_sample_rows\tjCopySamples\n#define jcopy_block_row\t\tjCopyBlocks\n#define jpeg_zigzag_order\tjZIGTable\n#define jpeg_natural_order\tjZAGTable\n#define jpeg_natural_order7\tjZAG7Table\n#define jpeg_natural_order6\tjZAG6Table\n#define jpeg_natural_order5\tjZAG5Table\n#define jpeg_natural_order4\tjZAG4Table\n#define jpeg_natural_order3\tjZAG3Table\n#define jpeg_natural_order2\tjZAG2Table\n#define jpeg_aritab\t\tjAriTab\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays\n * and coefficient-block arrays.  This won't work on 80x86 because the arrays\n * are FAR and we're assuming a small-pointer memory model.  However, some\n * DOS compilers provide far-pointer versions of memcpy() and memset() even\n * in the small-model libraries.  These will be used if USE_FMEM is defined.\n * Otherwise, the routines in jutils.c do it the hard way.\n */\n\n#ifndef NEED_FAR_POINTERS\t/* normal case, same as regular macro */\n#define FMEMZERO(target,size)\tMEMZERO(target,size)\n#else\t\t\t\t/* 80x86 case */\n#ifdef USE_FMEM\n#define FMEMZERO(target,size)\t_fmemset((void FAR *)(target), 0, (size_t)(size))\n#else\nEXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));\n#define FMEMZERO(target,size)\tjzero_far(target, size)\n#endif\n#endif\n\n\n/* Compression module initialization routines */\nEXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,\n\t\t\t\t\t boolean transcode_only));\nEXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo));\nEXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));\n/* Decompression module initialization routines */\nEXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t  boolean need_full_buffer));\nEXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));\nEXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));\n/* Memory manager initialization */\nEXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));\n\n/* Utility routines in jutils.c */\nEXTERN(long) jdiv_round_up JPP((long a, long b));\nEXTERN(long) jround_up JPP((long a, long b));\nEXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,\n\t\t\t\t    JSAMPARRAY output_array, int dest_row,\n\t\t\t\t    int num_rows, JDIMENSION num_cols));\nEXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,\n\t\t\t\t  JDIMENSION num_blocks));\n/* Constant tables in jutils.c */\n#if 0\t\t\t\t/* This table is not actually needed in v6a */\nextern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */\n#endif\nextern const int jpeg_natural_order[]; /* zigzag coef order to natural order */\nextern const int jpeg_natural_order7[]; /* zz to natural order for 7x7 block */\nextern const int jpeg_natural_order6[]; /* zz to natural order for 6x6 block */\nextern const int jpeg_natural_order5[]; /* zz to natural order for 5x5 block */\nextern const int jpeg_natural_order4[]; /* zz to natural order for 4x4 block */\nextern const int jpeg_natural_order3[]; /* zz to natural order for 3x3 block */\nextern const int jpeg_natural_order2[]; /* zz to natural order for 2x2 block */\n\n/* Arithmetic coding probability estimation tables in jaricom.c */\nextern const INT32 jpeg_aritab[];\n\n/* Suppress undefined-structure complaints if necessary. */\n\n#ifdef INCOMPLETE_TYPES_BROKEN\n#ifndef AM_MEMORY_MANAGER\t/* only jmemmgr.c defines these */\nstruct jvirt_sarray_control { long dummy; };\nstruct jvirt_barray_control { long dummy; };\n#endif\n#endif /* INCOMPLETE_TYPES_BROKEN */\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/jpeglib.h",
    "content": "/*\n * jpeglib.h\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * Modified 2002-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file defines the application interface for the JPEG library.\n * Most applications using the library need only include this file,\n * and perhaps jerror.h if they want to know the exact error codes.\n */\n\n#ifndef JPEGLIB_H\n#define JPEGLIB_H\n\n/*\n * First we include the configuration files that record how this\n * installation of the JPEG library is set up.  jconfig.h can be\n * generated automatically for many systems.  jmorecfg.h contains\n * manual configuration options that most people need not worry about.\n */\n\n#ifndef JCONFIG_INCLUDED\t/* in case jinclude.h already did */\n#include \"jconfig.h\"\t\t/* widely used configuration options */\n#endif\n#include \"jmorecfg.h\"\t\t/* seldom changed options */\n\n\n#ifdef __cplusplus\n#ifndef DONT_USE_EXTERN_C\nextern \"C\" {\n#endif\n#endif\n\n/* Version IDs for the JPEG library.\n * Might be useful for tests like \"#if JPEG_LIB_VERSION >= 90\".\n */\n\n#define JPEG_LIB_VERSION        90\t/* Compatibility version 9.0 */\n#define JPEG_LIB_VERSION_MAJOR  9\n#define JPEG_LIB_VERSION_MINOR  0\n\n\n/* Various constants determining the sizes of things.\n * All of these are specified by the JPEG standard, so don't change them\n * if you want to be compatible.\n */\n\n#define DCTSIZE\t\t    8\t/* The basic DCT block is 8x8 coefficients */\n#define DCTSIZE2\t    64\t/* DCTSIZE squared; # of elements in a block */\n#define NUM_QUANT_TBLS      4\t/* Quantization tables are numbered 0..3 */\n#define NUM_HUFF_TBLS       4\t/* Huffman tables are numbered 0..3 */\n#define NUM_ARITH_TBLS      16\t/* Arith-coding tables are numbered 0..15 */\n#define MAX_COMPS_IN_SCAN   4\t/* JPEG limit on # of components in one scan */\n#define MAX_SAMP_FACTOR     4\t/* JPEG limit on sampling factors */\n/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;\n * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.\n * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU\n * to handle it.  We even let you do this from the jconfig.h file.  However,\n * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe\n * sometimes emits noncompliant files doesn't mean you should too.\n */\n#define C_MAX_BLOCKS_IN_MCU   10 /* compressor's limit on blocks per MCU */\n#ifndef D_MAX_BLOCKS_IN_MCU\n#define D_MAX_BLOCKS_IN_MCU   10 /* decompressor's limit on blocks per MCU */\n#endif\n\n\n/* Data structures for images (arrays of samples and of DCT coefficients).\n * On 80x86 machines, the image arrays are too big for near pointers,\n * but the pointer arrays can fit in near memory.\n */\n\ntypedef JSAMPLE FAR *JSAMPROW;\t/* ptr to one image row of pixel samples. */\ntypedef JSAMPROW *JSAMPARRAY;\t/* ptr to some rows (a 2-D sample array) */\ntypedef JSAMPARRAY *JSAMPIMAGE;\t/* a 3-D sample array: top index is color */\n\ntypedef JCOEF JBLOCK[DCTSIZE2];\t/* one block of coefficients */\ntypedef JBLOCK FAR *JBLOCKROW;\t/* pointer to one row of coefficient blocks */\ntypedef JBLOCKROW *JBLOCKARRAY;\t\t/* a 2-D array of coefficient blocks */\ntypedef JBLOCKARRAY *JBLOCKIMAGE;\t/* a 3-D array of coefficient blocks */\n\ntypedef JCOEF FAR *JCOEFPTR;\t/* useful in a couple of places */\n\n\n/* Types for JPEG compression parameters and working tables. */\n\n\n/* DCT coefficient quantization tables. */\n\ntypedef struct {\n  /* This array gives the coefficient quantizers in natural array order\n   * (not the zigzag order in which they are stored in a JPEG DQT marker).\n   * CAUTION: IJG versions prior to v6a kept this array in zigzag order.\n   */\n  UINT16 quantval[DCTSIZE2];\t/* quantization step for each coefficient */\n  /* This field is used only during compression.  It's initialized FALSE when\n   * the table is created, and set TRUE when it's been output to the file.\n   * You could suppress output of a table by setting this to TRUE.\n   * (See jpeg_suppress_tables for an example.)\n   */\n  boolean sent_table;\t\t/* TRUE when table has been output */\n} JQUANT_TBL;\n\n\n/* Huffman coding tables. */\n\ntypedef struct {\n  /* These two fields directly represent the contents of a JPEG DHT marker */\n  UINT8 bits[17];\t\t/* bits[k] = # of symbols with codes of */\n\t\t\t\t/* length k bits; bits[0] is unused */\n  UINT8 huffval[256];\t\t/* The symbols, in order of incr code length */\n  /* This field is used only during compression.  It's initialized FALSE when\n   * the table is created, and set TRUE when it's been output to the file.\n   * You could suppress output of a table by setting this to TRUE.\n   * (See jpeg_suppress_tables for an example.)\n   */\n  boolean sent_table;\t\t/* TRUE when table has been output */\n} JHUFF_TBL;\n\n\n/* Basic info about one component (color channel). */\n\ntypedef struct {\n  /* These values are fixed over the whole image. */\n  /* For compression, they must be supplied by parameter setup; */\n  /* for decompression, they are read from the SOF marker. */\n  int component_id;\t\t/* identifier for this component (0..255) */\n  int component_index;\t\t/* its index in SOF or cinfo->comp_info[] */\n  int h_samp_factor;\t\t/* horizontal sampling factor (1..4) */\n  int v_samp_factor;\t\t/* vertical sampling factor (1..4) */\n  int quant_tbl_no;\t\t/* quantization table selector (0..3) */\n  /* These values may vary between scans. */\n  /* For compression, they must be supplied by parameter setup; */\n  /* for decompression, they are read from the SOS marker. */\n  /* The decompressor output side may not use these variables. */\n  int dc_tbl_no;\t\t/* DC entropy table selector (0..3) */\n  int ac_tbl_no;\t\t/* AC entropy table selector (0..3) */\n  \n  /* Remaining fields should be treated as private by applications. */\n  \n  /* These values are computed during compression or decompression startup: */\n  /* Component's size in DCT blocks.\n   * Any dummy blocks added to complete an MCU are not counted; therefore\n   * these values do not depend on whether a scan is interleaved or not.\n   */\n  JDIMENSION width_in_blocks;\n  JDIMENSION height_in_blocks;\n  /* Size of a DCT block in samples,\n   * reflecting any scaling we choose to apply during the DCT step.\n   * Values from 1 to 16 are supported.\n   * Note that different components may receive different DCT scalings.\n   */\n  int DCT_h_scaled_size;\n  int DCT_v_scaled_size;\n  /* The downsampled dimensions are the component's actual, unpadded number\n   * of samples at the main buffer (preprocessing/compression interface);\n   * DCT scaling is included, so\n   * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE)\n   * and similarly for height.\n   */\n  JDIMENSION downsampled_width;\t /* actual width in samples */\n  JDIMENSION downsampled_height; /* actual height in samples */\n  /* This flag is used only for decompression.  In cases where some of the\n   * components will be ignored (eg grayscale output from YCbCr image),\n   * we can skip most computations for the unused components.\n   */\n  boolean component_needed;\t/* do we need the value of this component? */\n\n  /* These values are computed before starting a scan of the component. */\n  /* The decompressor output side may not use these variables. */\n  int MCU_width;\t\t/* number of blocks per MCU, horizontally */\n  int MCU_height;\t\t/* number of blocks per MCU, vertically */\n  int MCU_blocks;\t\t/* MCU_width * MCU_height */\n  int MCU_sample_width;\t/* MCU width in samples: MCU_width * DCT_h_scaled_size */\n  int last_col_width;\t\t/* # of non-dummy blocks across in last MCU */\n  int last_row_height;\t\t/* # of non-dummy blocks down in last MCU */\n\n  /* Saved quantization table for component; NULL if none yet saved.\n   * See jdinput.c comments about the need for this information.\n   * This field is currently used only for decompression.\n   */\n  JQUANT_TBL * quant_table;\n\n  /* Private per-component storage for DCT or IDCT subsystem. */\n  void * dct_table;\n} jpeg_component_info;\n\n\n/* The script for encoding a multiple-scan file is an array of these: */\n\ntypedef struct {\n  int comps_in_scan;\t\t/* number of components encoded in this scan */\n  int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */\n  int Ss, Se;\t\t\t/* progressive JPEG spectral selection parms */\n  int Ah, Al;\t\t\t/* progressive JPEG successive approx. parms */\n} jpeg_scan_info;\n\n/* The decompressor can save APPn and COM markers in a list of these: */\n\ntypedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr;\n\nstruct jpeg_marker_struct {\n  jpeg_saved_marker_ptr next;\t/* next in list, or NULL */\n  UINT8 marker;\t\t\t/* marker code: JPEG_COM, or JPEG_APP0+n */\n  unsigned int original_length;\t/* # bytes of data in the file */\n  unsigned int data_length;\t/* # bytes of data saved at data[] */\n  JOCTET FAR * data;\t\t/* the data contained in the marker */\n  /* the marker length word is not counted in data_length or original_length */\n};\n\n/* Known color spaces. */\n\ntypedef enum {\n\tJCS_UNKNOWN,\t\t/* error/unspecified */\n\tJCS_GRAYSCALE,\t\t/* monochrome */\n\tJCS_RGB,\t\t/* red/green/blue */\n\tJCS_YCbCr,\t\t/* Y/Cb/Cr (also known as YUV) */\n\tJCS_CMYK,\t\t/* C/M/Y/K */\n\tJCS_YCCK\t\t/* Y/Cb/Cr/K */\n} J_COLOR_SPACE;\n\n/* Supported color transforms. */\n\ntypedef enum {\n\tJCT_NONE           = 0,\n\tJCT_SUBTRACT_GREEN = 1\n} J_COLOR_TRANSFORM;\n\n/* DCT/IDCT algorithm options. */\n\ntypedef enum {\n\tJDCT_ISLOW,\t\t/* slow but accurate integer algorithm */\n\tJDCT_IFAST,\t\t/* faster, less accurate integer method */\n\tJDCT_FLOAT\t\t/* floating-point: accurate, fast on fast HW */\n} J_DCT_METHOD;\n\n#ifndef JDCT_DEFAULT\t\t/* may be overridden in jconfig.h */\n#define JDCT_DEFAULT  JDCT_ISLOW\n#endif\n#ifndef JDCT_FASTEST\t\t/* may be overridden in jconfig.h */\n#define JDCT_FASTEST  JDCT_IFAST\n#endif\n\n/* Dithering options for decompression. */\n\ntypedef enum {\n\tJDITHER_NONE,\t\t/* no dithering */\n\tJDITHER_ORDERED,\t/* simple ordered dither */\n\tJDITHER_FS\t\t/* Floyd-Steinberg error diffusion dither */\n} J_DITHER_MODE;\n\n\n/* Common fields between JPEG compression and decompression master structs. */\n\n#define jpeg_common_fields \\\n  struct jpeg_error_mgr * err;\t/* Error handler module */\\\n  struct jpeg_memory_mgr * mem;\t/* Memory manager module */\\\n  struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\\\n  void * client_data;\t\t/* Available for use by application */\\\n  boolean is_decompressor;\t/* So common code can tell which is which */\\\n  int global_state\t\t/* For checking call sequence validity */\n\n/* Routines that are to be used by both halves of the library are declared\n * to receive a pointer to this structure.  There are no actual instances of\n * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.\n */\nstruct jpeg_common_struct {\n  jpeg_common_fields;\t\t/* Fields common to both master struct types */\n  /* Additional fields follow in an actual jpeg_compress_struct or\n   * jpeg_decompress_struct.  All three structs must agree on these\n   * initial fields!  (This would be a lot cleaner in C++.)\n   */\n};\n\ntypedef struct jpeg_common_struct * j_common_ptr;\ntypedef struct jpeg_compress_struct * j_compress_ptr;\ntypedef struct jpeg_decompress_struct * j_decompress_ptr;\n\n\n/* Master record for a compression instance */\n\nstruct jpeg_compress_struct {\n  jpeg_common_fields;\t\t/* Fields shared with jpeg_decompress_struct */\n\n  /* Destination for compressed data */\n  struct jpeg_destination_mgr * dest;\n\n  /* Description of source image --- these fields must be filled in by\n   * outer application before starting compression.  in_color_space must\n   * be correct before you can even call jpeg_set_defaults().\n   */\n\n  JDIMENSION image_width;\t/* input image width */\n  JDIMENSION image_height;\t/* input image height */\n  int input_components;\t\t/* # of color components in input image */\n  J_COLOR_SPACE in_color_space;\t/* colorspace of input image */\n\n  double input_gamma;\t\t/* image gamma of input image */\n\n  /* Compression parameters --- these fields must be set before calling\n   * jpeg_start_compress().  We recommend calling jpeg_set_defaults() to\n   * initialize everything to reasonable defaults, then changing anything\n   * the application specifically wants to change.  That way you won't get\n   * burnt when new parameters are added.  Also note that there are several\n   * helper routines to simplify changing parameters.\n   */\n\n  unsigned int scale_num, scale_denom; /* fraction by which to scale image */\n\n  JDIMENSION jpeg_width;\t/* scaled JPEG image width */\n  JDIMENSION jpeg_height;\t/* scaled JPEG image height */\n  /* Dimensions of actual JPEG image that will be written to file,\n   * derived from input dimensions by scaling factors above.\n   * These fields are computed by jpeg_start_compress().\n   * You can also use jpeg_calc_jpeg_dimensions() to determine these values\n   * in advance of calling jpeg_start_compress().\n   */\n\n  int data_precision;\t\t/* bits of precision in image data */\n\n  int num_components;\t\t/* # of color components in JPEG image */\n  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */\n\n  jpeg_component_info * comp_info;\n  /* comp_info[i] describes component that appears i'th in SOF */\n\n  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];\n  int q_scale_factor[NUM_QUANT_TBLS];\n  /* ptrs to coefficient quantization tables, or NULL if not defined,\n   * and corresponding scale factors (percentage, initialized 100).\n   */\n\n  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  /* ptrs to Huffman coding tables, or NULL if not defined */\n\n  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */\n  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */\n  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */\n\n  int num_scans;\t\t/* # of entries in scan_info array */\n  const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */\n  /* The default value of scan_info is NULL, which causes a single-scan\n   * sequential JPEG file to be emitted.  To create a multi-scan file,\n   * set num_scans and scan_info to point to an array of scan definitions.\n   */\n\n  boolean raw_data_in;\t\t/* TRUE=caller supplies downsampled data */\n  boolean arith_code;\t\t/* TRUE=arithmetic coding, FALSE=Huffman */\n  boolean optimize_coding;\t/* TRUE=optimize entropy encoding parms */\n  boolean CCIR601_sampling;\t/* TRUE=first samples are cosited */\n  boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */\n  int smoothing_factor;\t\t/* 1..100, or 0 for no input smoothing */\n  J_DCT_METHOD dct_method;\t/* DCT algorithm selector */\n\n  /* The restart interval can be specified in absolute MCUs by setting\n   * restart_interval, or in MCU rows by setting restart_in_rows\n   * (in which case the correct restart_interval will be figured\n   * for each scan).\n   */\n  unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */\n  int restart_in_rows;\t\t/* if > 0, MCU rows per restart interval */\n\n  /* Parameters controlling emission of special markers. */\n\n  boolean write_JFIF_header;\t/* should a JFIF marker be written? */\n  UINT8 JFIF_major_version;\t/* What to write for the JFIF version number */\n  UINT8 JFIF_minor_version;\n  /* These three values are not used by the JPEG code, merely copied */\n  /* into the JFIF APP0 marker.  density_unit can be 0 for unknown, */\n  /* 1 for dots/inch, or 2 for dots/cm.  Note that the pixel aspect */\n  /* ratio is defined by X_density/Y_density even when density_unit=0. */\n  UINT8 density_unit;\t\t/* JFIF code for pixel size units */\n  UINT16 X_density;\t\t/* Horizontal pixel density */\n  UINT16 Y_density;\t\t/* Vertical pixel density */\n  boolean write_Adobe_marker;\t/* should an Adobe marker be written? */\n\n  J_COLOR_TRANSFORM color_transform;\n  /* Color transform identifier, writes LSE marker if nonzero */\n\n  /* State variable: index of next scanline to be written to\n   * jpeg_write_scanlines().  Application may use this to control its\n   * processing loop, e.g., \"while (next_scanline < image_height)\".\n   */\n\n  JDIMENSION next_scanline;\t/* 0 .. image_height-1  */\n\n  /* Remaining fields are known throughout compressor, but generally\n   * should not be touched by a surrounding application.\n   */\n\n  /*\n   * These fields are computed during compression startup\n   */\n  boolean progressive_mode;\t/* TRUE if scan script uses progressive mode */\n  int max_h_samp_factor;\t/* largest h_samp_factor */\n  int max_v_samp_factor;\t/* largest v_samp_factor */\n\n  int min_DCT_h_scaled_size;\t/* smallest DCT_h_scaled_size of any component */\n  int min_DCT_v_scaled_size;\t/* smallest DCT_v_scaled_size of any component */\n\n  JDIMENSION total_iMCU_rows;\t/* # of iMCU rows to be input to coef ctlr */\n  /* The coefficient controller receives data in units of MCU rows as defined\n   * for fully interleaved scans (whether the JPEG file is interleaved or not).\n   * There are v_samp_factor * DCTSIZE sample rows of each component in an\n   * \"iMCU\" (interleaved MCU) row.\n   */\n  \n  /*\n   * These fields are valid during any one scan.\n   * They describe the components and MCUs actually appearing in the scan.\n   */\n  int comps_in_scan;\t\t/* # of JPEG components in this scan */\n  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];\n  /* *cur_comp_info[i] describes component that appears i'th in SOS */\n  \n  JDIMENSION MCUs_per_row;\t/* # of MCUs across the image */\n  JDIMENSION MCU_rows_in_scan;\t/* # of MCU rows in the image */\n  \n  int blocks_in_MCU;\t\t/* # of DCT blocks per MCU */\n  int MCU_membership[C_MAX_BLOCKS_IN_MCU];\n  /* MCU_membership[i] is index in cur_comp_info of component owning */\n  /* i'th block in an MCU */\n\n  int Ss, Se, Ah, Al;\t\t/* progressive JPEG parameters for scan */\n\n  int block_size;\t\t/* the basic DCT block size: 1..16 */\n  const int * natural_order;\t/* natural-order position array */\n  int lim_Se;\t\t\t/* min( Se, DCTSIZE2-1 ) */\n\n  /*\n   * Links to compression subobjects (methods and private variables of modules)\n   */\n  struct jpeg_comp_master * master;\n  struct jpeg_c_main_controller * main;\n  struct jpeg_c_prep_controller * prep;\n  struct jpeg_c_coef_controller * coef;\n  struct jpeg_marker_writer * marker;\n  struct jpeg_color_converter * cconvert;\n  struct jpeg_downsampler * downsample;\n  struct jpeg_forward_dct * fdct;\n  struct jpeg_entropy_encoder * entropy;\n  jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */\n  int script_space_size;\n};\n\n\n/* Master record for a decompression instance */\n\nstruct jpeg_decompress_struct {\n  jpeg_common_fields;\t\t/* Fields shared with jpeg_compress_struct */\n\n  /* Source of compressed data */\n  struct jpeg_source_mgr * src;\n\n  /* Basic description of image --- filled in by jpeg_read_header(). */\n  /* Application may inspect these values to decide how to process image. */\n\n  JDIMENSION image_width;\t/* nominal image width (from SOF marker) */\n  JDIMENSION image_height;\t/* nominal image height */\n  int num_components;\t\t/* # of color components in JPEG image */\n  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */\n\n  /* Decompression processing parameters --- these fields must be set before\n   * calling jpeg_start_decompress().  Note that jpeg_read_header() initializes\n   * them to default values.\n   */\n\n  J_COLOR_SPACE out_color_space; /* colorspace for output */\n\n  unsigned int scale_num, scale_denom; /* fraction by which to scale image */\n\n  double output_gamma;\t\t/* image gamma wanted in output */\n\n  boolean buffered_image;\t/* TRUE=multiple output passes */\n  boolean raw_data_out;\t\t/* TRUE=downsampled data wanted */\n\n  J_DCT_METHOD dct_method;\t/* IDCT algorithm selector */\n  boolean do_fancy_upsampling;\t/* TRUE=apply fancy upsampling */\n  boolean do_block_smoothing;\t/* TRUE=apply interblock smoothing */\n\n  boolean quantize_colors;\t/* TRUE=colormapped output wanted */\n  /* the following are ignored if not quantize_colors: */\n  J_DITHER_MODE dither_mode;\t/* type of color dithering to use */\n  boolean two_pass_quantize;\t/* TRUE=use two-pass color quantization */\n  int desired_number_of_colors;\t/* max # colors to use in created colormap */\n  /* these are significant only in buffered-image mode: */\n  boolean enable_1pass_quant;\t/* enable future use of 1-pass quantizer */\n  boolean enable_external_quant;/* enable future use of external colormap */\n  boolean enable_2pass_quant;\t/* enable future use of 2-pass quantizer */\n\n  /* Description of actual output image that will be returned to application.\n   * These fields are computed by jpeg_start_decompress().\n   * You can also use jpeg_calc_output_dimensions() to determine these values\n   * in advance of calling jpeg_start_decompress().\n   */\n\n  JDIMENSION output_width;\t/* scaled image width */\n  JDIMENSION output_height;\t/* scaled image height */\n  int out_color_components;\t/* # of color components in out_color_space */\n  int output_components;\t/* # of color components returned */\n  /* output_components is 1 (a colormap index) when quantizing colors;\n   * otherwise it equals out_color_components.\n   */\n  int rec_outbuf_height;\t/* min recommended height of scanline buffer */\n  /* If the buffer passed to jpeg_read_scanlines() is less than this many rows\n   * high, space and time will be wasted due to unnecessary data copying.\n   * Usually rec_outbuf_height will be 1 or 2, at most 4.\n   */\n\n  /* When quantizing colors, the output colormap is described by these fields.\n   * The application can supply a colormap by setting colormap non-NULL before\n   * calling jpeg_start_decompress; otherwise a colormap is created during\n   * jpeg_start_decompress or jpeg_start_output.\n   * The map has out_color_components rows and actual_number_of_colors columns.\n   */\n  int actual_number_of_colors;\t/* number of entries in use */\n  JSAMPARRAY colormap;\t\t/* The color map as a 2-D pixel array */\n\n  /* State variables: these variables indicate the progress of decompression.\n   * The application may examine these but must not modify them.\n   */\n\n  /* Row index of next scanline to be read from jpeg_read_scanlines().\n   * Application may use this to control its processing loop, e.g.,\n   * \"while (output_scanline < output_height)\".\n   */\n  JDIMENSION output_scanline;\t/* 0 .. output_height-1  */\n\n  /* Current input scan number and number of iMCU rows completed in scan.\n   * These indicate the progress of the decompressor input side.\n   */\n  int input_scan_number;\t/* Number of SOS markers seen so far */\n  JDIMENSION input_iMCU_row;\t/* Number of iMCU rows completed */\n\n  /* The \"output scan number\" is the notional scan being displayed by the\n   * output side.  The decompressor will not allow output scan/row number\n   * to get ahead of input scan/row, but it can fall arbitrarily far behind.\n   */\n  int output_scan_number;\t/* Nominal scan number being displayed */\n  JDIMENSION output_iMCU_row;\t/* Number of iMCU rows read */\n\n  /* Current progression status.  coef_bits[c][i] indicates the precision\n   * with which component c's DCT coefficient i (in zigzag order) is known.\n   * It is -1 when no data has yet been received, otherwise it is the point\n   * transform (shift) value for the most recent scan of the coefficient\n   * (thus, 0 at completion of the progression).\n   * This pointer is NULL when reading a non-progressive file.\n   */\n  int (*coef_bits)[DCTSIZE2];\t/* -1 or current Al value for each coef */\n\n  /* Internal JPEG parameters --- the application usually need not look at\n   * these fields.  Note that the decompressor output side may not use\n   * any parameters that can change between scans.\n   */\n\n  /* Quantization and Huffman tables are carried forward across input\n   * datastreams when processing abbreviated JPEG datastreams.\n   */\n\n  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];\n  /* ptrs to coefficient quantization tables, or NULL if not defined */\n\n  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];\n  /* ptrs to Huffman coding tables, or NULL if not defined */\n\n  /* These parameters are never carried across datastreams, since they\n   * are given in SOF/SOS markers or defined to be reset by SOI.\n   */\n\n  int data_precision;\t\t/* bits of precision in image data */\n\n  jpeg_component_info * comp_info;\n  /* comp_info[i] describes component that appears i'th in SOF */\n\n  boolean is_baseline;\t\t/* TRUE if Baseline SOF0 encountered */\n  boolean progressive_mode;\t/* TRUE if SOFn specifies progressive mode */\n  boolean arith_code;\t\t/* TRUE=arithmetic coding, FALSE=Huffman */\n\n  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */\n  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */\n  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */\n\n  unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */\n\n  /* These fields record data obtained from optional markers recognized by\n   * the JPEG library.\n   */\n  boolean saw_JFIF_marker;\t/* TRUE iff a JFIF APP0 marker was found */\n  /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */\n  UINT8 JFIF_major_version;\t/* JFIF version number */\n  UINT8 JFIF_minor_version;\n  UINT8 density_unit;\t\t/* JFIF code for pixel size units */\n  UINT16 X_density;\t\t/* Horizontal pixel density */\n  UINT16 Y_density;\t\t/* Vertical pixel density */\n  boolean saw_Adobe_marker;\t/* TRUE iff an Adobe APP14 marker was found */\n  UINT8 Adobe_transform;\t/* Color transform code from Adobe marker */\n\n  J_COLOR_TRANSFORM color_transform;\n  /* Color transform identifier derived from LSE marker, otherwise zero */\n\n  boolean CCIR601_sampling;\t/* TRUE=first samples are cosited */\n\n  /* Aside from the specific data retained from APPn markers known to the\n   * library, the uninterpreted contents of any or all APPn and COM markers\n   * can be saved in a list for examination by the application.\n   */\n  jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */\n\n  /* Remaining fields are known throughout decompressor, but generally\n   * should not be touched by a surrounding application.\n   */\n\n  /*\n   * These fields are computed during decompression startup\n   */\n  int max_h_samp_factor;\t/* largest h_samp_factor */\n  int max_v_samp_factor;\t/* largest v_samp_factor */\n\n  int min_DCT_h_scaled_size;\t/* smallest DCT_h_scaled_size of any component */\n  int min_DCT_v_scaled_size;\t/* smallest DCT_v_scaled_size of any component */\n\n  JDIMENSION total_iMCU_rows;\t/* # of iMCU rows in image */\n  /* The coefficient controller's input and output progress is measured in\n   * units of \"iMCU\" (interleaved MCU) rows.  These are the same as MCU rows\n   * in fully interleaved JPEG scans, but are used whether the scan is\n   * interleaved or not.  We define an iMCU row as v_samp_factor DCT block\n   * rows of each component.  Therefore, the IDCT output contains\n   * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row.\n   */\n\n  JSAMPLE * sample_range_limit; /* table for fast range-limiting */\n\n  /*\n   * These fields are valid during any one scan.\n   * They describe the components and MCUs actually appearing in the scan.\n   * Note that the decompressor output side must not use these fields.\n   */\n  int comps_in_scan;\t\t/* # of JPEG components in this scan */\n  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];\n  /* *cur_comp_info[i] describes component that appears i'th in SOS */\n\n  JDIMENSION MCUs_per_row;\t/* # of MCUs across the image */\n  JDIMENSION MCU_rows_in_scan;\t/* # of MCU rows in the image */\n\n  int blocks_in_MCU;\t\t/* # of DCT blocks per MCU */\n  int MCU_membership[D_MAX_BLOCKS_IN_MCU];\n  /* MCU_membership[i] is index in cur_comp_info of component owning */\n  /* i'th block in an MCU */\n\n  int Ss, Se, Ah, Al;\t\t/* progressive JPEG parameters for scan */\n\n  /* These fields are derived from Se of first SOS marker.\n   */\n  int block_size;\t\t/* the basic DCT block size: 1..16 */\n  const int * natural_order; /* natural-order position array for entropy decode */\n  int lim_Se;\t\t\t/* min( Se, DCTSIZE2-1 ) for entropy decode */\n\n  /* This field is shared between entropy decoder and marker parser.\n   * It is either zero or the code of a JPEG marker that has been\n   * read from the data source, but has not yet been processed.\n   */\n  int unread_marker;\n\n  /*\n   * Links to decompression subobjects (methods, private variables of modules)\n   */\n  struct jpeg_decomp_master * master;\n  struct jpeg_d_main_controller * main;\n  struct jpeg_d_coef_controller * coef;\n  struct jpeg_d_post_controller * post;\n  struct jpeg_input_controller * inputctl;\n  struct jpeg_marker_reader * marker;\n  struct jpeg_entropy_decoder * entropy;\n  struct jpeg_inverse_dct * idct;\n  struct jpeg_upsampler * upsample;\n  struct jpeg_color_deconverter * cconvert;\n  struct jpeg_color_quantizer * cquantize;\n};\n\n\n/* \"Object\" declarations for JPEG modules that may be supplied or called\n * directly by the surrounding application.\n * As with all objects in the JPEG library, these structs only define the\n * publicly visible methods and state variables of a module.  Additional\n * private fields may exist after the public ones.\n */\n\n\n/* Error handler object */\n\nstruct jpeg_error_mgr {\n  /* Error exit handler: does not return to caller */\n  JMETHOD(noreturn_t, error_exit, (j_common_ptr cinfo));\n  /* Conditionally emit a trace or warning message */\n  JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));\n  /* Routine that actually outputs a trace or error message */\n  JMETHOD(void, output_message, (j_common_ptr cinfo));\n  /* Format a message string for the most recent JPEG error or message */\n  JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));\n#define JMSG_LENGTH_MAX  200\t/* recommended size of format_message buffer */\n  /* Reset error state variables at start of a new image */\n  JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));\n  \n  /* The message ID code and any parameters are saved here.\n   * A message can have one string parameter or up to 8 int parameters.\n   */\n  int msg_code;\n#define JMSG_STR_PARM_MAX  80\n  union {\n    int i[8];\n    char s[JMSG_STR_PARM_MAX];\n  } msg_parm;\n  \n  /* Standard state variables for error facility */\n  \n  int trace_level;\t\t/* max msg_level that will be displayed */\n  \n  /* For recoverable corrupt-data errors, we emit a warning message,\n   * but keep going unless emit_message chooses to abort.  emit_message\n   * should count warnings in num_warnings.  The surrounding application\n   * can check for bad data by seeing if num_warnings is nonzero at the\n   * end of processing.\n   */\n  long num_warnings;\t\t/* number of corrupt-data warnings */\n\n  /* These fields point to the table(s) of error message strings.\n   * An application can change the table pointer to switch to a different\n   * message list (typically, to change the language in which errors are\n   * reported).  Some applications may wish to add additional error codes\n   * that will be handled by the JPEG library error mechanism; the second\n   * table pointer is used for this purpose.\n   *\n   * First table includes all errors generated by JPEG library itself.\n   * Error code 0 is reserved for a \"no such error string\" message.\n   */\n  const char * const * jpeg_message_table; /* Library errors */\n  int last_jpeg_message;    /* Table contains strings 0..last_jpeg_message */\n  /* Second table can be added by application (see cjpeg/djpeg for example).\n   * It contains strings numbered first_addon_message..last_addon_message.\n   */\n  const char * const * addon_message_table; /* Non-library errors */\n  int first_addon_message;\t/* code for first string in addon table */\n  int last_addon_message;\t/* code for last string in addon table */\n};\n\n\n/* Progress monitor object */\n\nstruct jpeg_progress_mgr {\n  JMETHOD(void, progress_monitor, (j_common_ptr cinfo));\n\n  long pass_counter;\t\t/* work units completed in this pass */\n  long pass_limit;\t\t/* total number of work units in this pass */\n  int completed_passes;\t\t/* passes completed so far */\n  int total_passes;\t\t/* total number of passes expected */\n};\n\n\n/* Data destination object for compression */\n\nstruct jpeg_destination_mgr {\n  JOCTET * next_output_byte;\t/* => next byte to write in buffer */\n  size_t free_in_buffer;\t/* # of byte spaces remaining in buffer */\n\n  JMETHOD(void, init_destination, (j_compress_ptr cinfo));\n  JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));\n  JMETHOD(void, term_destination, (j_compress_ptr cinfo));\n};\n\n\n/* Data source object for decompression */\n\nstruct jpeg_source_mgr {\n  const JOCTET * next_input_byte; /* => next byte to read from buffer */\n  size_t bytes_in_buffer;\t/* # of bytes remaining in buffer */\n\n  JMETHOD(void, init_source, (j_decompress_ptr cinfo));\n  JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));\n  JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));\n  JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));\n  JMETHOD(void, term_source, (j_decompress_ptr cinfo));\n};\n\n\n/* Memory manager object.\n * Allocates \"small\" objects (a few K total), \"large\" objects (tens of K),\n * and \"really big\" objects (virtual arrays with backing store if needed).\n * The memory manager does not allow individual objects to be freed; rather,\n * each created object is assigned to a pool, and whole pools can be freed\n * at once.  This is faster and more convenient than remembering exactly what\n * to free, especially where malloc()/free() are not too speedy.\n * NB: alloc routines never return NULL.  They exit to error_exit if not\n * successful.\n */\n\n#define JPOOL_PERMANENT\t0\t/* lasts until master record is destroyed */\n#define JPOOL_IMAGE\t1\t/* lasts until done with image/datastream */\n#define JPOOL_NUMPOOLS\t2\n\ntypedef struct jvirt_sarray_control * jvirt_sarray_ptr;\ntypedef struct jvirt_barray_control * jvirt_barray_ptr;\n\n\nstruct jpeg_memory_mgr {\n  /* Method pointers */\n  JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,\n\t\t\t\tsize_t sizeofobject));\n  JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id,\n\t\t\t\t     size_t sizeofobject));\n  JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,\n\t\t\t\t     JDIMENSION samplesperrow,\n\t\t\t\t     JDIMENSION numrows));\n  JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,\n\t\t\t\t      JDIMENSION blocksperrow,\n\t\t\t\t      JDIMENSION numrows));\n  JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,\n\t\t\t\t\t\t  int pool_id,\n\t\t\t\t\t\t  boolean pre_zero,\n\t\t\t\t\t\t  JDIMENSION samplesperrow,\n\t\t\t\t\t\t  JDIMENSION numrows,\n\t\t\t\t\t\t  JDIMENSION maxaccess));\n  JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,\n\t\t\t\t\t\t  int pool_id,\n\t\t\t\t\t\t  boolean pre_zero,\n\t\t\t\t\t\t  JDIMENSION blocksperrow,\n\t\t\t\t\t\t  JDIMENSION numrows,\n\t\t\t\t\t\t  JDIMENSION maxaccess));\n  JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));\n  JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,\n\t\t\t\t\t   jvirt_sarray_ptr ptr,\n\t\t\t\t\t   JDIMENSION start_row,\n\t\t\t\t\t   JDIMENSION num_rows,\n\t\t\t\t\t   boolean writable));\n  JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,\n\t\t\t\t\t    jvirt_barray_ptr ptr,\n\t\t\t\t\t    JDIMENSION start_row,\n\t\t\t\t\t    JDIMENSION num_rows,\n\t\t\t\t\t    boolean writable));\n  JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));\n  JMETHOD(void, self_destruct, (j_common_ptr cinfo));\n\n  /* Limit on memory allocation for this JPEG object.  (Note that this is\n   * merely advisory, not a guaranteed maximum; it only affects the space\n   * used for virtual-array buffers.)  May be changed by outer application\n   * after creating the JPEG object.\n   */\n  long max_memory_to_use;\n\n  /* Maximum allocation request accepted by alloc_large. */\n  long max_alloc_chunk;\n};\n\n\n/* Routine signature for application-supplied marker processing methods.\n * Need not pass marker code since it is stored in cinfo->unread_marker.\n */\ntypedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));\n\n\n/* Declarations for routines called by application.\n * The JPP macro hides prototype parameters from compilers that can't cope.\n * Note JPP requires double parentheses.\n */\n\n#ifdef HAVE_PROTOTYPES\n#define JPP(arglist)\targlist\n#else\n#define JPP(arglist)\t()\n#endif\n\n\n/* Short forms of external names for systems with brain-damaged linkers.\n * We shorten external names to be unique in the first six letters, which\n * is good enough for all known systems.\n * (If your compiler itself needs names to be unique in less than 15 \n * characters, you are out of luck.  Get a better compiler.)\n */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_std_error\t\tjStdError\n#define jpeg_CreateCompress\tjCreaCompress\n#define jpeg_CreateDecompress\tjCreaDecompress\n#define jpeg_destroy_compress\tjDestCompress\n#define jpeg_destroy_decompress\tjDestDecompress\n#define jpeg_stdio_dest\t\tjStdDest\n#define jpeg_stdio_src\t\tjStdSrc\n#define jpeg_mem_dest\t\tjMemDest\n#define jpeg_mem_src\t\tjMemSrc\n#define jpeg_set_defaults\tjSetDefaults\n#define jpeg_set_colorspace\tjSetColorspace\n#define jpeg_default_colorspace\tjDefColorspace\n#define jpeg_set_quality\tjSetQuality\n#define jpeg_set_linear_quality\tjSetLQuality\n#define jpeg_default_qtables\tjDefQTables\n#define jpeg_add_quant_table\tjAddQuantTable\n#define jpeg_quality_scaling\tjQualityScaling\n#define jpeg_simple_progression\tjSimProgress\n#define jpeg_suppress_tables\tjSuppressTables\n#define jpeg_alloc_quant_table\tjAlcQTable\n#define jpeg_alloc_huff_table\tjAlcHTable\n#define jpeg_start_compress\tjStrtCompress\n#define jpeg_write_scanlines\tjWrtScanlines\n#define jpeg_finish_compress\tjFinCompress\n#define jpeg_calc_jpeg_dimensions\tjCjpegDimensions\n#define jpeg_write_raw_data\tjWrtRawData\n#define jpeg_write_marker\tjWrtMarker\n#define jpeg_write_m_header\tjWrtMHeader\n#define jpeg_write_m_byte\tjWrtMByte\n#define jpeg_write_tables\tjWrtTables\n#define jpeg_read_header\tjReadHeader\n#define jpeg_start_decompress\tjStrtDecompress\n#define jpeg_read_scanlines\tjReadScanlines\n#define jpeg_finish_decompress\tjFinDecompress\n#define jpeg_read_raw_data\tjReadRawData\n#define jpeg_has_multiple_scans\tjHasMultScn\n#define jpeg_start_output\tjStrtOutput\n#define jpeg_finish_output\tjFinOutput\n#define jpeg_input_complete\tjInComplete\n#define jpeg_new_colormap\tjNewCMap\n#define jpeg_consume_input\tjConsumeInput\n#define jpeg_core_output_dimensions\tjCoreDimensions\n#define jpeg_calc_output_dimensions\tjCalcDimensions\n#define jpeg_save_markers\tjSaveMarkers\n#define jpeg_set_marker_processor\tjSetMarker\n#define jpeg_read_coefficients\tjReadCoefs\n#define jpeg_write_coefficients\tjWrtCoefs\n#define jpeg_copy_critical_parameters\tjCopyCrit\n#define jpeg_abort_compress\tjAbrtCompress\n#define jpeg_abort_decompress\tjAbrtDecompress\n#define jpeg_abort\t\tjAbort\n#define jpeg_destroy\t\tjDestroy\n#define jpeg_resync_to_restart\tjResyncRestart\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/* Default error-management setup */\nEXTERN(struct jpeg_error_mgr *) jpeg_std_error\n\tJPP((struct jpeg_error_mgr * err));\n\n/* Initialization of JPEG compression objects.\n * jpeg_create_compress() and jpeg_create_decompress() are the exported\n * names that applications should call.  These expand to calls on\n * jpeg_CreateCompress and jpeg_CreateDecompress with additional information\n * passed for version mismatch checking.\n * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.\n */\n#define jpeg_create_compress(cinfo) \\\n    jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \\\n\t\t\t(size_t) sizeof(struct jpeg_compress_struct))\n#define jpeg_create_decompress(cinfo) \\\n    jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \\\n\t\t\t  (size_t) sizeof(struct jpeg_decompress_struct))\nEXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,\n\t\t\t\t      int version, size_t structsize));\nEXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,\n\t\t\t\t\tint version, size_t structsize));\n/* Destruction of JPEG compression objects */\nEXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));\n\n/* Standard data source and destination managers: stdio streams. */\n/* Caller is responsible for opening the file before and closing after. */\nEXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));\nEXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));\n\n/* Data source and destination managers: memory buffers. */\nEXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo,\n\t\t\t       unsigned char ** outbuffer,\n\t\t\t       unsigned long * outsize));\nEXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo,\n\t\t\t      unsigned char * inbuffer,\n\t\t\t      unsigned long insize));\n\n/* Default parameter setup for compression */\nEXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));\n/* Compression parameter setup aids */\nEXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,\n\t\t\t\t      J_COLOR_SPACE colorspace));\nEXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,\n\t\t\t\t   boolean force_baseline));\nEXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  int scale_factor,\n\t\t\t\t\t  boolean force_baseline));\nEXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo,\n\t\t\t\t       boolean force_baseline));\nEXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,\n\t\t\t\t       const unsigned int *basic_table,\n\t\t\t\t       int scale_factor,\n\t\t\t\t       boolean force_baseline));\nEXTERN(int) jpeg_quality_scaling JPP((int quality));\nEXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,\n\t\t\t\t       boolean suppress));\nEXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));\nEXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));\n\n/* Main entry points for compression */\nEXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,\n\t\t\t\t      boolean write_all_tables));\nEXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,\n\t\t\t\t\t     JSAMPARRAY scanlines,\n\t\t\t\t\t     JDIMENSION num_lines));\nEXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));\n\n/* Precalculate JPEG dimensions for current compression parameters. */\nEXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo));\n\n/* Replaces jpeg_write_scanlines when writing raw downsampled data. */\nEXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,\n\t\t\t\t\t    JSAMPIMAGE data,\n\t\t\t\t\t    JDIMENSION num_lines));\n\n/* Write a special marker.  See libjpeg.txt concerning safe usage. */\nEXTERN(void) jpeg_write_marker\n\tJPP((j_compress_ptr cinfo, int marker,\n\t     const JOCTET * dataptr, unsigned int datalen));\n/* Same, but piecemeal. */\nEXTERN(void) jpeg_write_m_header\n\tJPP((j_compress_ptr cinfo, int marker, unsigned int datalen));\nEXTERN(void) jpeg_write_m_byte\n\tJPP((j_compress_ptr cinfo, int val));\n\n/* Alternate compression function: just write an abbreviated table file */\nEXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));\n\n/* Decompression startup: read start of JPEG datastream to see what's there */\nEXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,\n\t\t\t\t  boolean require_image));\n/* Return value is one of: */\n#define JPEG_SUSPENDED\t\t0 /* Suspended due to lack of input data */\n#define JPEG_HEADER_OK\t\t1 /* Found valid image datastream */\n#define JPEG_HEADER_TABLES_ONLY\t2 /* Found valid table-specs-only datastream */\n/* If you pass require_image = TRUE (normal case), you need not check for\n * a TABLES_ONLY return code; an abbreviated file will cause an error exit.\n * JPEG_SUSPENDED is only possible if you use a data source module that can\n * give a suspension return (the stdio source module doesn't).\n */\n\n/* Main entry points for decompression */\nEXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));\nEXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    JSAMPARRAY scanlines,\n\t\t\t\t\t    JDIMENSION max_lines));\nEXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));\n\n/* Replaces jpeg_read_scanlines when reading raw downsampled data. */\nEXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t   JSAMPIMAGE data,\n\t\t\t\t\t   JDIMENSION max_lines));\n\n/* Additional entry points for buffered-image mode. */\nEXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));\nEXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,\n\t\t\t\t       int scan_number));\nEXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));\nEXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));\nEXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));\nEXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));\n/* Return value is one of: */\n/* #define JPEG_SUSPENDED\t0    Suspended due to lack of input data */\n#define JPEG_REACHED_SOS\t1 /* Reached start of new scan */\n#define JPEG_REACHED_EOI\t2 /* Reached end of image */\n#define JPEG_ROW_COMPLETED\t3 /* Completed one iMCU row */\n#define JPEG_SCAN_COMPLETED\t4 /* Completed last iMCU row of a scan */\n\n/* Precalculate output dimensions for current decompression parameters. */\nEXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo));\nEXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));\n\n/* Control saving of COM and APPn markers into marker_list. */\nEXTERN(void) jpeg_save_markers\n\tJPP((j_decompress_ptr cinfo, int marker_code,\n\t     unsigned int length_limit));\n\n/* Install a special processing method for COM or APPn markers. */\nEXTERN(void) jpeg_set_marker_processor\n\tJPP((j_decompress_ptr cinfo, int marker_code,\n\t     jpeg_marker_parser_method routine));\n\n/* Read or write raw DCT coefficients --- useful for lossless transcoding. */\nEXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));\nEXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,\n\t\t\t\t\t  jvirt_barray_ptr * coef_arrays));\nEXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,\n\t\t\t\t\t\tj_compress_ptr dstinfo));\n\n/* If you choose to abort compression or decompression before completing\n * jpeg_finish_(de)compress, then you need to clean up to release memory,\n * temporary files, etc.  You can just call jpeg_destroy_(de)compress\n * if you're done with the JPEG object, but if you want to clean it up and\n * reuse it, call this:\n */\nEXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));\nEXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));\n\n/* Generic versions of jpeg_abort and jpeg_destroy that work on either\n * flavor of JPEG object.  These may be more convenient in some places.\n */\nEXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));\nEXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));\n\n/* Default restart-marker-resync procedure for use by data source modules */\nEXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,\n\t\t\t\t\t    int desired));\n\n\n/* These marker codes are exported since applications and data source modules\n * are likely to want to use them.\n */\n\n#define JPEG_RST0\t0xD0\t/* RST0 marker code */\n#define JPEG_EOI\t0xD9\t/* EOI marker code */\n#define JPEG_APP0\t0xE0\t/* APP0 marker code */\n#define JPEG_COM\t0xFE\t/* COM marker code */\n\n\n/* If we have a brain-damaged compiler that emits warnings (or worse, errors)\n * for structure definitions that are never filled in, keep it quiet by\n * supplying dummy definitions for the various substructures.\n */\n\n#ifdef INCOMPLETE_TYPES_BROKEN\n#ifndef JPEG_INTERNALS\t\t/* will be defined in jpegint.h */\nstruct jvirt_sarray_control { long dummy; };\nstruct jvirt_barray_control { long dummy; };\nstruct jpeg_comp_master { long dummy; };\nstruct jpeg_c_main_controller { long dummy; };\nstruct jpeg_c_prep_controller { long dummy; };\nstruct jpeg_c_coef_controller { long dummy; };\nstruct jpeg_marker_writer { long dummy; };\nstruct jpeg_color_converter { long dummy; };\nstruct jpeg_downsampler { long dummy; };\nstruct jpeg_forward_dct { long dummy; };\nstruct jpeg_entropy_encoder { long dummy; };\nstruct jpeg_decomp_master { long dummy; };\nstruct jpeg_d_main_controller { long dummy; };\nstruct jpeg_d_coef_controller { long dummy; };\nstruct jpeg_d_post_controller { long dummy; };\nstruct jpeg_input_controller { long dummy; };\nstruct jpeg_marker_reader { long dummy; };\nstruct jpeg_entropy_decoder { long dummy; };\nstruct jpeg_inverse_dct { long dummy; };\nstruct jpeg_upsampler { long dummy; };\nstruct jpeg_color_deconverter { long dummy; };\nstruct jpeg_color_quantizer { long dummy; };\n#endif /* JPEG_INTERNALS */\n#endif /* INCOMPLETE_TYPES_BROKEN */\n\n\n/*\n * The JPEG library modules define JPEG_INTERNALS before including this file.\n * The internal structure declarations are read only when that is true.\n * Applications using the library should not include jpegint.h, but may wish\n * to include jerror.h.\n */\n\n#ifdef JPEG_INTERNALS\n#include \"jpegint.h\"\t\t/* fetch private declarations */\n#include \"jerror.h\"\t\t/* fetch error codes too */\n#endif\n\n#ifdef __cplusplus\n#ifndef DONT_USE_EXTERN_C\n}\n#endif\n#endif\n\n#endif /* JPEGLIB_H */\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/jversion.h",
    "content": "/*\n * jversion.h\n *\n * Copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains software version identification.\n */\n\n\n#define JVERSION\t\"9  13-Jan-2013\"\n\n#define JCOPYRIGHT\t\"Copyright (C) 2013, Thomas G. Lane, Guido Vollbeding\"\n"
  },
  {
    "path": "libs/SDL2_jpeg/include/transupp.h",
    "content": "/*\n * transupp.h\n *\n * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains declarations for image transformation routines and\n * other utility code used by the jpegtran sample application.  These are\n * NOT part of the core JPEG library.  But we keep these routines separate\n * from jpegtran.c to ease the task of maintaining jpegtran-like programs\n * that have other user interfaces.\n *\n * NOTE: all the routines declared here have very specific requirements\n * about when they are to be executed during the reading and writing of the\n * source and destination files.  See the comments in transupp.c, or see\n * jpegtran.c for an example of correct usage.\n */\n\n/* If you happen not to want the image transform support, disable it here */\n#ifndef TRANSFORMS_SUPPORTED\n#define TRANSFORMS_SUPPORTED 1\t\t/* 0 disables transform code */\n#endif\n\n/*\n * Although rotating and flipping data expressed as DCT coefficients is not\n * hard, there is an asymmetry in the JPEG format specification for images\n * whose dimensions aren't multiples of the iMCU size.  The right and bottom\n * image edges are padded out to the next iMCU boundary with junk data; but\n * no padding is possible at the top and left edges.  If we were to flip\n * the whole image including the pad data, then pad garbage would become\n * visible at the top and/or left, and real pixels would disappear into the\n * pad margins --- perhaps permanently, since encoders & decoders may not\n * bother to preserve DCT blocks that appear to be completely outside the\n * nominal image area.  So, we have to exclude any partial iMCUs from the\n * basic transformation.\n *\n * Transpose is the only transformation that can handle partial iMCUs at the\n * right and bottom edges completely cleanly.  flip_h can flip partial iMCUs\n * at the bottom, but leaves any partial iMCUs at the right edge untouched.\n * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched.\n * The other transforms are defined as combinations of these basic transforms\n * and process edge blocks in a way that preserves the equivalence.\n *\n * The \"trim\" option causes untransformable partial iMCUs to be dropped;\n * this is not strictly lossless, but it usually gives the best-looking\n * result for odd-size images.  Note that when this option is active,\n * the expected mathematical equivalences between the transforms may not hold.\n * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim\n * followed by -rot 180 -trim trims both edges.)\n *\n * We also offer a lossless-crop option, which discards data outside a given\n * image region but losslessly preserves what is inside.  Like the rotate and\n * flip transforms, lossless crop is restricted by the JPEG format: the upper\n * left corner of the selected region must fall on an iMCU boundary.  If this\n * does not hold for the given crop parameters, we silently move the upper left\n * corner up and/or left to make it so, simultaneously increasing the region\n * dimensions to keep the lower right crop corner unchanged.  (Thus, the\n * output image covers at least the requested region, but may cover more.)\n * The adjustment of the region dimensions may be optionally disabled.\n *\n * We also provide a lossless-resize option, which is kind of a lossless-crop\n * operation in the DCT coefficient block domain - it discards higher-order\n * coefficients and losslessly preserves lower-order coefficients of a\n * sub-block.\n *\n * Rotate/flip transform, resize, and crop can be requested together in a\n * single invocation.  The crop is applied last --- that is, the crop region\n * is specified in terms of the destination image after transform/resize.\n *\n * We also offer a \"force to grayscale\" option, which simply discards the\n * chrominance channels of a YCbCr image.  This is lossless in the sense that\n * the luminance channel is preserved exactly.  It's not the same kind of\n * thing as the rotate/flip transformations, but it's convenient to handle it\n * as part of this package, mainly because the transformation routines have to\n * be aware of the option to know how many components to work on.\n */\n\n\n/* Short forms of external names for systems with brain-damaged linkers. */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jtransform_parse_crop_spec\tjTrParCrop\n#define jtransform_request_workspace\tjTrRequest\n#define jtransform_adjust_parameters\tjTrAdjust\n#define jtransform_execute_transform\tjTrExec\n#define jtransform_perfect_transform\tjTrPerfect\n#define jcopy_markers_setup\t\tjCMrkSetup\n#define jcopy_markers_execute\t\tjCMrkExec\n#endif /* NEED_SHORT_EXTERNAL_NAMES */\n\n\n/*\n * Codes for supported types of image transformations.\n */\n\ntypedef enum {\n\tJXFORM_NONE,\t\t/* no transformation */\n\tJXFORM_FLIP_H,\t\t/* horizontal flip */\n\tJXFORM_FLIP_V,\t\t/* vertical flip */\n\tJXFORM_TRANSPOSE,\t/* transpose across UL-to-LR axis */\n\tJXFORM_TRANSVERSE,\t/* transpose across UR-to-LL axis */\n\tJXFORM_ROT_90,\t\t/* 90-degree clockwise rotation */\n\tJXFORM_ROT_180,\t\t/* 180-degree rotation */\n\tJXFORM_ROT_270\t\t/* 270-degree clockwise (or 90 ccw) */\n} JXFORM_CODE;\n\n/*\n * Codes for crop parameters, which can individually be unspecified,\n * positive or negative for xoffset or yoffset,\n * positive or forced for width or height.\n */\n\ntypedef enum {\n        JCROP_UNSET,\n        JCROP_POS,\n        JCROP_NEG,\n        JCROP_FORCE\n} JCROP_CODE;\n\n/*\n * Transform parameters struct.\n * NB: application must not change any elements of this struct after\n * calling jtransform_request_workspace.\n */\n\ntypedef struct {\n  /* Options: set by caller */\n  JXFORM_CODE transform;\t/* image transform operator */\n  boolean perfect;\t\t/* if TRUE, fail if partial MCUs are requested */\n  boolean trim;\t\t\t/* if TRUE, trim partial MCUs as needed */\n  boolean force_grayscale;\t/* if TRUE, convert color image to grayscale */\n  boolean crop;\t\t\t/* if TRUE, crop source image */\n\n  /* Crop parameters: application need not set these unless crop is TRUE.\n   * These can be filled in by jtransform_parse_crop_spec().\n   */\n  JDIMENSION crop_width;\t/* Width of selected region */\n  JCROP_CODE crop_width_set;\t/* (forced disables adjustment) */\n  JDIMENSION crop_height;\t/* Height of selected region */\n  JCROP_CODE crop_height_set;\t/* (forced disables adjustment) */\n  JDIMENSION crop_xoffset;\t/* X offset of selected region */\n  JCROP_CODE crop_xoffset_set;\t/* (negative measures from right edge) */\n  JDIMENSION crop_yoffset;\t/* Y offset of selected region */\n  JCROP_CODE crop_yoffset_set;\t/* (negative measures from bottom edge) */\n\n  /* Internal workspace: caller should not touch these */\n  int num_components;\t\t/* # of components in workspace */\n  jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */\n  JDIMENSION output_width;\t/* cropped destination dimensions */\n  JDIMENSION output_height;\n  JDIMENSION x_crop_offset;\t/* destination crop offsets measured in iMCUs */\n  JDIMENSION y_crop_offset;\n  int iMCU_sample_width;\t/* destination iMCU size */\n  int iMCU_sample_height;\n} jpeg_transform_info;\n\n\n#if TRANSFORMS_SUPPORTED\n\n/* Parse a crop specification (written in X11 geometry style) */\nEXTERN(boolean) jtransform_parse_crop_spec\n\tJPP((jpeg_transform_info *info, const char *spec));\n/* Request any required workspace */\nEXTERN(boolean) jtransform_request_workspace\n\tJPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));\n/* Adjust output image parameters */\nEXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters\n\tJPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t     jvirt_barray_ptr *src_coef_arrays,\n\t     jpeg_transform_info *info));\n/* Execute the actual transformation, if any */\nEXTERN(void) jtransform_execute_transform\n\tJPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t     jvirt_barray_ptr *src_coef_arrays,\n\t     jpeg_transform_info *info));\n/* Determine whether lossless transformation is perfectly\n * possible for a specified image and transformation.\n */\nEXTERN(boolean) jtransform_perfect_transform\n\tJPP((JDIMENSION image_width, JDIMENSION image_height,\n\t     int MCU_width, int MCU_height,\n\t     JXFORM_CODE transform));\n\n/* jtransform_execute_transform used to be called\n * jtransform_execute_transformation, but some compilers complain about\n * routine names that long.  This macro is here to avoid breaking any\n * old source code that uses the original name...\n */\n#define jtransform_execute_transformation\tjtransform_execute_transform\n\n#endif /* TRANSFORMS_SUPPORTED */\n\n\n/*\n * Support for copying optional markers from source to destination file.\n */\n\ntypedef enum {\n\tJCOPYOPT_NONE,\t\t/* copy no optional markers */\n\tJCOPYOPT_COMMENTS,\t/* copy only comment (COM) markers */\n\tJCOPYOPT_ALL\t\t/* copy all optional markers */\n} JCOPY_OPTION;\n\n#define JCOPYOPT_DEFAULT  JCOPYOPT_COMMENTS\t/* recommended default */\n\n/* Setup decompression object to save desired markers in memory */\nEXTERN(void) jcopy_markers_setup\n\tJPP((j_decompress_ptr srcinfo, JCOPY_OPTION option));\n/* Copy markers saved in the given source object to the destination object */\nEXTERN(void) jcopy_markers_execute\n\tJPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t     JCOPY_OPTION option));\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/cdjpeg.c",
    "content": "/*\n * cdjpeg.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains common support routines used by the IJG application\n * programs (cjpeg, djpeg, jpegtran).\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n#include <ctype.h>\t\t/* to declare isupper(), tolower() */\n#ifdef NEED_SIGNAL_CATCHER\n#include <signal.h>\t\t/* to declare signal() */\n#endif\n#ifdef USE_SETMODE\n#include <fcntl.h>\t\t/* to declare setmode()'s parameter macros */\n/* If you have setmode() but not <io.h>, just delete this line: */\n#include <io.h>\t\t\t/* to declare setmode() */\n#endif\n\n\n/*\n * Signal catcher to ensure that temporary files are removed before aborting.\n * NB: for Amiga Manx C this is actually a global routine named _abort();\n * we put \"#define signal_catcher _abort\" in jconfig.h.  Talk about bogus...\n */\n\n#ifdef NEED_SIGNAL_CATCHER\n\nstatic j_common_ptr sig_cinfo;\n\nvoid\t\t\t\t/* must be global for Manx C */\nsignal_catcher (int signum)\n{\n  if (sig_cinfo != NULL) {\n    if (sig_cinfo->err != NULL) /* turn off trace output */\n      sig_cinfo->err->trace_level = 0;\n    jpeg_destroy(sig_cinfo);\t/* clean up memory allocation & temp files */\n  }\n  exit(EXIT_FAILURE);\n}\n\n\nGLOBAL(void)\nenable_signal_catcher (j_common_ptr cinfo)\n{\n  sig_cinfo = cinfo;\n#ifdef SIGINT\t\t\t/* not all systems have SIGINT */\n  signal(SIGINT, signal_catcher);\n#endif\n#ifdef SIGTERM\t\t\t/* not all systems have SIGTERM */\n  signal(SIGTERM, signal_catcher);\n#endif\n}\n\n#endif\n\n\n/*\n * Optional progress monitor: display a percent-done figure on stderr.\n */\n\n#ifdef PROGRESS_REPORT\n\nMETHODDEF(void)\nprogress_monitor (j_common_ptr cinfo)\n{\n  cd_progress_ptr prog = (cd_progress_ptr) cinfo->progress;\n  int total_passes = prog->pub.total_passes + prog->total_extra_passes;\n  int percent_done = (int) (prog->pub.pass_counter*100L/prog->pub.pass_limit);\n\n  if (percent_done != prog->percent_done) {\n    prog->percent_done = percent_done;\n    if (total_passes > 1) {\n      fprintf(stderr, \"\\rPass %d/%d: %3d%% \",\n\t      prog->pub.completed_passes + prog->completed_extra_passes + 1,\n\t      total_passes, percent_done);\n    } else {\n      fprintf(stderr, \"\\r %3d%% \", percent_done);\n    }\n    fflush(stderr);\n  }\n}\n\n\nGLOBAL(void)\nstart_progress_monitor (j_common_ptr cinfo, cd_progress_ptr progress)\n{\n  /* Enable progress display, unless trace output is on */\n  if (cinfo->err->trace_level == 0) {\n    progress->pub.progress_monitor = progress_monitor;\n    progress->completed_extra_passes = 0;\n    progress->total_extra_passes = 0;\n    progress->percent_done = -1;\n    cinfo->progress = &progress->pub;\n  }\n}\n\n\nGLOBAL(void)\nend_progress_monitor (j_common_ptr cinfo)\n{\n  /* Clear away progress display */\n  if (cinfo->err->trace_level == 0) {\n    fprintf(stderr, \"\\r                \\r\");\n    fflush(stderr);\n  }\n}\n\n#endif\n\n\n/*\n * Case-insensitive matching of possibly-abbreviated keyword switches.\n * keyword is the constant keyword (must be lower case already),\n * minchars is length of minimum legal abbreviation.\n */\n\nGLOBAL(boolean)\nkeymatch (char * arg, const char * keyword, int minchars)\n{\n  register int ca, ck;\n  register int nmatched = 0;\n\n  while ((ca = *arg++) != '\\0') {\n    if ((ck = *keyword++) == '\\0')\n      return FALSE;\t\t/* arg longer than keyword, no good */\n    if (isupper(ca))\t\t/* force arg to lcase (assume ck is already) */\n      ca = tolower(ca);\n    if (ca != ck)\n      return FALSE;\t\t/* no good */\n    nmatched++;\t\t\t/* count matched characters */\n  }\n  /* reached end of argument; fail if it's too short for unique abbrev */\n  if (nmatched < minchars)\n    return FALSE;\n  return TRUE;\t\t\t/* A-OK */\n}\n\n\n/*\n * Routines to establish binary I/O mode for stdin and stdout.\n * Non-Unix systems often require some hacking to get out of text mode.\n */\n\nGLOBAL(FILE *)\nread_stdin (void)\n{\n  FILE * input_file = stdin;\n\n#ifdef USE_SETMODE\t\t/* need to hack file mode? */\n  setmode(fileno(stdin), O_BINARY);\n#endif\n#ifdef USE_FDOPEN\t\t/* need to re-open in binary mode? */\n  if ((input_file = fdopen(fileno(stdin), READ_BINARY)) == NULL) {\n    fprintf(stderr, \"Cannot reopen stdin\\n\");\n    exit(EXIT_FAILURE);\n  }\n#endif\n  return input_file;\n}\n\n\nGLOBAL(FILE *)\nwrite_stdout (void)\n{\n  FILE * output_file = stdout;\n\n#ifdef USE_SETMODE\t\t/* need to hack file mode? */\n  setmode(fileno(stdout), O_BINARY);\n#endif\n#ifdef USE_FDOPEN\t\t/* need to re-open in binary mode? */\n  if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) {\n    fprintf(stderr, \"Cannot reopen stdout\\n\");\n    exit(EXIT_FAILURE);\n  }\n#endif\n  return output_file;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/cjpeg.c",
    "content": "/*\n * cjpeg.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * Modified 2003-2013 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a command-line user interface for the JPEG compressor.\n * It should work on any system with Unix- or MS-DOS-style command lines.\n *\n * Two different command line styles are permitted, depending on the\n * compile-time switch TWO_FILE_COMMANDLINE:\n *\tcjpeg [options]  inputfile outputfile\n *\tcjpeg [options]  [inputfile]\n * In the second style, output is always to standard output, which you'd\n * normally redirect to a file or pipe to some other program.  Input is\n * either from a named file or from standard input (typically redirected).\n * The second style is convenient on Unix but is unhelpful on systems that\n * don't support pipes.  Also, you MUST use the first style if your system\n * doesn't do binary I/O to stdin/stdout.\n * To simplify script writing, the \"-outfile\" switch is provided.  The syntax\n *\tcjpeg [options]  -outfile outputfile  inputfile\n * works regardless of which command line style is used.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n#include \"jversion.h\"\t\t/* for version message */\n\n#ifdef USE_CCOMMAND\t\t/* command-line reader for Macintosh */\n#ifdef __MWERKS__\n#include <SIOUX.h>              /* Metrowerks needs this */\n#include <console.h>\t\t/* ... and this */\n#endif\n#ifdef THINK_C\n#include <console.h>\t\t/* Think declares it here */\n#endif\n#endif\n\n\n/* Create the add-on message string table. */\n\n#define JMESSAGE(code,string)\tstring ,\n\nstatic const char * const cdjpeg_message_table[] = {\n#include \"cderror.h\"\n  NULL\n};\n\n\n/*\n * This routine determines what format the input file is,\n * and selects the appropriate input-reading module.\n *\n * To determine which family of input formats the file belongs to,\n * we may look only at the first byte of the file, since C does not\n * guarantee that more than one character can be pushed back with ungetc.\n * Looking at additional bytes would require one of these approaches:\n *     1) assume we can fseek() the input file (fails for piped input);\n *     2) assume we can push back more than one character (works in\n *        some C implementations, but unportable);\n *     3) provide our own buffering (breaks input readers that want to use\n *        stdio directly, such as the RLE library);\n * or  4) don't put back the data, and modify the input_init methods to assume\n *        they start reading after the start of file (also breaks RLE library).\n * #1 is attractive for MS-DOS but is untenable on Unix.\n *\n * The most portable solution for file types that can't be identified by their\n * first byte is to make the user tell us what they are.  This is also the\n * only approach for \"raw\" file types that contain only arbitrary values.\n * We presently apply this method for Targa files.  Most of the time Targa\n * files start with 0x00, so we recognize that case.  Potentially, however,\n * a Targa file could start with any byte value (byte 0 is the length of the\n * seldom-used ID field), so we provide a switch to force Targa input mode.\n */\n\nstatic boolean is_targa;\t/* records user -targa switch */\n\n\nLOCAL(cjpeg_source_ptr)\nselect_file_type (j_compress_ptr cinfo, FILE * infile)\n{\n  int c;\n\n  if (is_targa) {\n#ifdef TARGA_SUPPORTED\n    return jinit_read_targa(cinfo);\n#else\n    ERREXIT(cinfo, JERR_TGA_NOTCOMP);\n#endif\n  }\n\n  if ((c = getc(infile)) == EOF)\n    ERREXIT(cinfo, JERR_INPUT_EMPTY);\n  if (ungetc(c, infile) == EOF)\n    ERREXIT(cinfo, JERR_UNGETC_FAILED);\n\n  switch (c) {\n#ifdef BMP_SUPPORTED\n  case 'B':\n    return jinit_read_bmp(cinfo);\n#endif\n#ifdef GIF_SUPPORTED\n  case 'G':\n    return jinit_read_gif(cinfo);\n#endif\n#ifdef PPM_SUPPORTED\n  case 'P':\n    return jinit_read_ppm(cinfo);\n#endif\n#ifdef RLE_SUPPORTED\n  case 'R':\n    return jinit_read_rle(cinfo);\n#endif\n#ifdef TARGA_SUPPORTED\n  case 0x00:\n    return jinit_read_targa(cinfo);\n#endif\n  default:\n    ERREXIT(cinfo, JERR_UNKNOWN_FORMAT);\n    break;\n  }\n\n  return NULL;\t\t\t/* suppress compiler warnings */\n}\n\n\n/*\n * Argument-parsing code.\n * The switch parser is designed to be useful with DOS-style command line\n * syntax, ie, intermixed switches and file names, where only the switches\n * to the left of a given file name affect processing of that file.\n * The main program in this file doesn't actually use this capability...\n */\n\n\nstatic const char * progname;\t/* program name for error messages */\nstatic char * outfilename;\t/* for -outfile switch */\n\n\nLOCAL(void)\nusage (void)\n/* complain about bad command line */\n{\n  fprintf(stderr, \"usage: %s [switches] \", progname);\n#ifdef TWO_FILE_COMMANDLINE\n  fprintf(stderr, \"inputfile outputfile\\n\");\n#else\n  fprintf(stderr, \"[inputfile]\\n\");\n#endif\n\n  fprintf(stderr, \"Switches (names may be abbreviated):\\n\");\n  fprintf(stderr, \"  -quality N[,...]   Compression quality (0..100; 5-95 is useful range)\\n\");\n  fprintf(stderr, \"  -grayscale     Create monochrome JPEG file\\n\");\n  fprintf(stderr, \"  -rgb           Create RGB JPEG file\\n\");\n#ifdef ENTROPY_OPT_SUPPORTED\n  fprintf(stderr, \"  -optimize      Optimize Huffman table (smaller file, but slow compression)\\n\");\n#endif\n#ifdef C_PROGRESSIVE_SUPPORTED\n  fprintf(stderr, \"  -progressive   Create progressive JPEG file\\n\");\n#endif\n#ifdef DCT_SCALING_SUPPORTED\n  fprintf(stderr, \"  -scale M/N     Scale image by fraction M/N, eg, 1/2\\n\");\n#endif\n#ifdef TARGA_SUPPORTED\n  fprintf(stderr, \"  -targa         Input file is Targa format (usually not needed)\\n\");\n#endif\n  fprintf(stderr, \"Switches for advanced users:\\n\");\n#ifdef C_ARITH_CODING_SUPPORTED\n  fprintf(stderr, \"  -arithmetic    Use arithmetic coding\\n\");\n#endif\n#ifdef DCT_SCALING_SUPPORTED\n  fprintf(stderr, \"  -block N       DCT block size (1..16; default is 8)\\n\");\n#endif\n#if JPEG_LIB_VERSION_MAJOR >= 9\n  fprintf(stderr, \"  -rgb1          Create RGB JPEG file with reversible color transform\\n\");\n#endif\n#ifdef DCT_ISLOW_SUPPORTED\n  fprintf(stderr, \"  -dct int       Use integer DCT method%s\\n\",\n\t  (JDCT_DEFAULT == JDCT_ISLOW ? \" (default)\" : \"\"));\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n  fprintf(stderr, \"  -dct fast      Use fast integer DCT (less accurate)%s\\n\",\n\t  (JDCT_DEFAULT == JDCT_IFAST ? \" (default)\" : \"\"));\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n  fprintf(stderr, \"  -dct float     Use floating-point DCT method%s\\n\",\n\t  (JDCT_DEFAULT == JDCT_FLOAT ? \" (default)\" : \"\"));\n#endif\n  fprintf(stderr, \"  -nosmooth      Don't use high-quality downsampling\\n\");\n  fprintf(stderr, \"  -restart N     Set restart interval in rows, or in blocks with B\\n\");\n#ifdef INPUT_SMOOTHING_SUPPORTED\n  fprintf(stderr, \"  -smooth N      Smooth dithered input (N=1..100 is strength)\\n\");\n#endif\n  fprintf(stderr, \"  -maxmemory N   Maximum memory to use (in kbytes)\\n\");\n  fprintf(stderr, \"  -outfile name  Specify name for output file\\n\");\n  fprintf(stderr, \"  -verbose  or  -debug   Emit debug output\\n\");\n  fprintf(stderr, \"Switches for wizards:\\n\");\n  fprintf(stderr, \"  -baseline      Force baseline quantization tables\\n\");\n  fprintf(stderr, \"  -qtables file  Use quantization tables given in file\\n\");\n  fprintf(stderr, \"  -qslots N[,...]    Set component quantization tables\\n\");\n  fprintf(stderr, \"  -sample HxV[,...]  Set component sampling factors\\n\");\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n  fprintf(stderr, \"  -scans file    Create multi-scan JPEG per script file\\n\");\n#endif\n  exit(EXIT_FAILURE);\n}\n\n\nLOCAL(int)\nparse_switches (j_compress_ptr cinfo, int argc, char **argv,\n\t\tint last_file_arg_seen, boolean for_real)\n/* Parse optional switches.\n * Returns argv[] index of first file-name argument (== argc if none).\n * Any file names with indexes <= last_file_arg_seen are ignored;\n * they have presumably been processed in a previous iteration.\n * (Pass 0 for last_file_arg_seen on the first or only iteration.)\n * for_real is FALSE on the first (dummy) pass; we may skip any expensive\n * processing.\n */\n{\n  int argn;\n  char * arg;\n  boolean force_baseline;\n  boolean simple_progressive;\n  char * qualityarg = NULL;\t/* saves -quality parm if any */\n  char * qtablefile = NULL;\t/* saves -qtables filename if any */\n  char * qslotsarg = NULL;\t/* saves -qslots parm if any */\n  char * samplearg = NULL;\t/* saves -sample parm if any */\n  char * scansarg = NULL;\t/* saves -scans parm if any */\n\n  /* Set up default JPEG parameters. */\n\n  force_baseline = FALSE;\t/* by default, allow 16-bit quantizers */\n  simple_progressive = FALSE;\n  is_targa = FALSE;\n  outfilename = NULL;\n  cinfo->err->trace_level = 0;\n\n  /* Scan command line options, adjust parameters */\n\n  for (argn = 1; argn < argc; argn++) {\n    arg = argv[argn];\n    if (*arg != '-') {\n      /* Not a switch, must be a file name argument */\n      if (argn <= last_file_arg_seen) {\n\toutfilename = NULL;\t/* -outfile applies to just one input file */\n\tcontinue;\t\t/* ignore this name if previously processed */\n      }\n      break;\t\t\t/* else done parsing switches */\n    }\n    arg++;\t\t\t/* advance past switch marker character */\n\n    if (keymatch(arg, \"arithmetic\", 1)) {\n      /* Use arithmetic coding. */\n#ifdef C_ARITH_CODING_SUPPORTED\n      cinfo->arith_code = TRUE;\n#else\n      fprintf(stderr, \"%s: sorry, arithmetic coding not supported\\n\",\n\t      progname);\n      exit(EXIT_FAILURE);\n#endif\n\n    } else if (keymatch(arg, \"baseline\", 2)) {\n      /* Force baseline-compatible output (8-bit quantizer values). */\n      force_baseline = TRUE;\n\n    } else if (keymatch(arg, \"block\", 2)) {\n      /* Set DCT block size. */\n#if defined DCT_SCALING_SUPPORTED && JPEG_LIB_VERSION_MAJOR >= 8 && \\\n      (JPEG_LIB_VERSION_MAJOR > 8 || JPEG_LIB_VERSION_MINOR >= 3)\n      int val;\n\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%d\", &val) != 1)\n\tusage();\n      if (val < 1 || val > 16)\n\tusage();\n      cinfo->block_size = val;\n#else\n      fprintf(stderr, \"%s: sorry, block size setting not supported\\n\",\n\t      progname);\n      exit(EXIT_FAILURE);\n#endif\n\n    } else if (keymatch(arg, \"dct\", 2)) {\n      /* Select DCT algorithm. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (keymatch(argv[argn], \"int\", 1)) {\n\tcinfo->dct_method = JDCT_ISLOW;\n      } else if (keymatch(argv[argn], \"fast\", 2)) {\n\tcinfo->dct_method = JDCT_IFAST;\n      } else if (keymatch(argv[argn], \"float\", 2)) {\n\tcinfo->dct_method = JDCT_FLOAT;\n      } else\n\tusage();\n\n    } else if (keymatch(arg, \"debug\", 1) || keymatch(arg, \"verbose\", 1)) {\n      /* Enable debug printouts. */\n      /* On first -d, print version identification */\n      static boolean printed_version = FALSE;\n\n      if (! printed_version) {\n\tfprintf(stderr, \"Independent JPEG Group's CJPEG, version %s\\n%s\\n\",\n\t\tJVERSION, JCOPYRIGHT);\n\tprinted_version = TRUE;\n      }\n      cinfo->err->trace_level++;\n\n    } else if (keymatch(arg, \"grayscale\", 2) || keymatch(arg, \"greyscale\",2)) {\n      /* Force a monochrome JPEG file to be generated. */\n      jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);\n\n    } else if (keymatch(arg, \"rgb\", 3) || keymatch(arg, \"rgb1\", 4)) {\n      /* Force an RGB JPEG file to be generated. */\n#if JPEG_LIB_VERSION_MAJOR >= 9\n      /* Note: Entropy table assignment in jpeg_set_colorspace depends\n       * on color_transform.\n       */\n      cinfo->color_transform = arg[3] ? JCT_SUBTRACT_GREEN : JCT_NONE;\n#endif\n      jpeg_set_colorspace(cinfo, JCS_RGB);\n\n    } else if (keymatch(arg, \"maxmemory\", 3)) {\n      /* Maximum memory in Kb (or Mb with 'm'). */\n      long lval;\n      char ch = 'x';\n\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%ld%c\", &lval, &ch) < 1)\n\tusage();\n      if (ch == 'm' || ch == 'M')\n\tlval *= 1000L;\n      cinfo->mem->max_memory_to_use = lval * 1000L;\n\n    } else if (keymatch(arg, \"nosmooth\", 3)) {\n      /* Suppress fancy downsampling. */\n      cinfo->do_fancy_downsampling = FALSE;\n\n    } else if (keymatch(arg, \"optimize\", 1) || keymatch(arg, \"optimise\", 1)) {\n      /* Enable entropy parm optimization. */\n#ifdef ENTROPY_OPT_SUPPORTED\n      cinfo->optimize_coding = TRUE;\n#else\n      fprintf(stderr, \"%s: sorry, entropy optimization was not compiled\\n\",\n\t      progname);\n      exit(EXIT_FAILURE);\n#endif\n\n    } else if (keymatch(arg, \"outfile\", 4)) {\n      /* Set output file name. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      outfilename = argv[argn];\t/* save it away for later use */\n\n    } else if (keymatch(arg, \"progressive\", 1)) {\n      /* Select simple progressive mode. */\n#ifdef C_PROGRESSIVE_SUPPORTED\n      simple_progressive = TRUE;\n      /* We must postpone execution until num_components is known. */\n#else\n      fprintf(stderr, \"%s: sorry, progressive output was not compiled\\n\",\n\t      progname);\n      exit(EXIT_FAILURE);\n#endif\n\n    } else if (keymatch(arg, \"quality\", 1)) {\n      /* Quality ratings (quantization table scaling factors). */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      qualityarg = argv[argn];\n\n    } else if (keymatch(arg, \"qslots\", 2)) {\n      /* Quantization table slot numbers. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      qslotsarg = argv[argn];\n      /* Must delay setting qslots until after we have processed any\n       * colorspace-determining switches, since jpeg_set_colorspace sets\n       * default quant table numbers.\n       */\n\n    } else if (keymatch(arg, \"qtables\", 2)) {\n      /* Quantization tables fetched from file. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      qtablefile = argv[argn];\n      /* We postpone actually reading the file in case -quality comes later. */\n\n    } else if (keymatch(arg, \"restart\", 1)) {\n      /* Restart interval in MCU rows (or in MCUs with 'b'). */\n      long lval;\n      char ch = 'x';\n\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%ld%c\", &lval, &ch) < 1)\n\tusage();\n      if (lval < 0 || lval > 65535L)\n\tusage();\n      if (ch == 'b' || ch == 'B') {\n\tcinfo->restart_interval = (unsigned int) lval;\n\tcinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */\n      } else {\n\tcinfo->restart_in_rows = (int) lval;\n\t/* restart_interval will be computed during startup */\n      }\n\n    } else if (keymatch(arg, \"sample\", 2)) {\n      /* Set sampling factors. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      samplearg = argv[argn];\n      /* Must delay setting sample factors until after we have processed any\n       * colorspace-determining switches, since jpeg_set_colorspace sets\n       * default sampling factors.\n       */\n\n    } else if (keymatch(arg, \"scale\", 4)) {\n      /* Scale the image by a fraction M/N. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%u/%u\",\n\t\t &cinfo->scale_num, &cinfo->scale_denom) != 2)\n\tusage();\n\n    } else if (keymatch(arg, \"scans\", 4)) {\n      /* Set scan script. */\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      scansarg = argv[argn];\n      /* We must postpone reading the file in case -progressive appears. */\n#else\n      fprintf(stderr, \"%s: sorry, multi-scan output was not compiled\\n\",\n\t      progname);\n      exit(EXIT_FAILURE);\n#endif\n\n    } else if (keymatch(arg, \"smooth\", 2)) {\n      /* Set input smoothing factor. */\n      int val;\n\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%d\", &val) != 1)\n\tusage();\n      if (val < 0 || val > 100)\n\tusage();\n      cinfo->smoothing_factor = val;\n\n    } else if (keymatch(arg, \"targa\", 1)) {\n      /* Input file is Targa format. */\n      is_targa = TRUE;\n\n    } else {\n      usage();\t\t\t/* bogus switch */\n    }\n  }\n\n  /* Post-switch-scanning cleanup */\n\n  if (for_real) {\n\n    /* Set quantization tables for selected quality. */\n    /* Some or all may be overridden if -qtables is present. */\n    if (qualityarg != NULL)\t/* process -quality if it was present */\n      if (! set_quality_ratings(cinfo, qualityarg, force_baseline))\n\tusage();\n\n    if (qtablefile != NULL)\t/* process -qtables if it was present */\n      if (! read_quant_tables(cinfo, qtablefile, force_baseline))\n\tusage();\n\n    if (qslotsarg != NULL)\t/* process -qslots if it was present */\n      if (! set_quant_slots(cinfo, qslotsarg))\n\tusage();\n\n    if (samplearg != NULL)\t/* process -sample if it was present */\n      if (! set_sample_factors(cinfo, samplearg))\n\tusage();\n\n#ifdef C_PROGRESSIVE_SUPPORTED\n    if (simple_progressive)\t/* process -progressive; -scans can override */\n      jpeg_simple_progression(cinfo);\n#endif\n\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n    if (scansarg != NULL)\t/* process -scans if it was present */\n      if (! read_scan_script(cinfo, scansarg))\n\tusage();\n#endif\n  }\n\n  return argn;\t\t\t/* return index of next arg (file name) */\n}\n\n\n/*\n * The main program.\n */\n\nint\nmain (int argc, char **argv)\n{\n  struct jpeg_compress_struct cinfo;\n  struct jpeg_error_mgr jerr;\n#ifdef PROGRESS_REPORT\n  struct cdjpeg_progress_mgr progress;\n#endif\n  int file_index;\n  cjpeg_source_ptr src_mgr;\n  FILE * input_file;\n  FILE * output_file;\n  JDIMENSION num_scanlines;\n\n  /* On Mac, fetch a command line. */\n#ifdef USE_CCOMMAND\n  argc = ccommand(&argv);\n#endif\n\n  progname = argv[0];\n  if (progname == NULL || progname[0] == 0)\n    progname = \"cjpeg\";\t\t/* in case C library doesn't provide it */\n\n  /* Initialize the JPEG compression object with default error handling. */\n  cinfo.err = jpeg_std_error(&jerr);\n  jpeg_create_compress(&cinfo);\n  /* Add some application-specific error messages (from cderror.h) */\n  jerr.addon_message_table = cdjpeg_message_table;\n  jerr.first_addon_message = JMSG_FIRSTADDONCODE;\n  jerr.last_addon_message = JMSG_LASTADDONCODE;\n\n  /* Now safe to enable signal catcher. */\n#ifdef NEED_SIGNAL_CATCHER\n  enable_signal_catcher((j_common_ptr) &cinfo);\n#endif\n\n  /* Initialize JPEG parameters.\n   * Much of this may be overridden later.\n   * In particular, we don't yet know the input file's color space,\n   * but we need to provide some value for jpeg_set_defaults() to work.\n   */\n\n  cinfo.in_color_space = JCS_RGB; /* arbitrary guess */\n  jpeg_set_defaults(&cinfo);\n\n  /* Scan command line to find file names.\n   * It is convenient to use just one switch-parsing routine, but the switch\n   * values read here are ignored; we will rescan the switches after opening\n   * the input file.\n   */\n\n  file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);\n\n#ifdef TWO_FILE_COMMANDLINE\n  /* Must have either -outfile switch or explicit output file name */\n  if (outfilename == NULL) {\n    if (file_index != argc-2) {\n      fprintf(stderr, \"%s: must name one input and one output file\\n\",\n\t      progname);\n      usage();\n    }\n    outfilename = argv[file_index+1];\n  } else {\n    if (file_index != argc-1) {\n      fprintf(stderr, \"%s: must name one input and one output file\\n\",\n\t      progname);\n      usage();\n    }\n  }\n#else\n  /* Unix style: expect zero or one file name */\n  if (file_index < argc-1) {\n    fprintf(stderr, \"%s: only one input file\\n\", progname);\n    usage();\n  }\n#endif /* TWO_FILE_COMMANDLINE */\n\n  /* Open the input file. */\n  if (file_index < argc) {\n    if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open %s\\n\", progname, argv[file_index]);\n      exit(EXIT_FAILURE);\n    }\n  } else {\n    /* default input file is stdin */\n    input_file = read_stdin();\n  }\n\n  /* Open the output file. */\n  if (outfilename != NULL) {\n    if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open %s\\n\", progname, outfilename);\n      exit(EXIT_FAILURE);\n    }\n  } else {\n    /* default output file is stdout */\n    output_file = write_stdout();\n  }\n\n#ifdef PROGRESS_REPORT\n  start_progress_monitor((j_common_ptr) &cinfo, &progress);\n#endif\n\n  /* Figure out the input file format, and set up to read it. */\n  src_mgr = select_file_type(&cinfo, input_file);\n  src_mgr->input_file = input_file;\n\n  /* Read the input file header to obtain file size & colorspace. */\n  (*src_mgr->start_input) (&cinfo, src_mgr);\n\n  /* Now that we know input colorspace, fix colorspace-dependent defaults */\n  jpeg_default_colorspace(&cinfo);\n\n  /* Adjust default compression parameters by re-parsing the options */\n  file_index = parse_switches(&cinfo, argc, argv, 0, TRUE);\n\n  /* Specify data destination for compression */\n  jpeg_stdio_dest(&cinfo, output_file);\n\n  /* Start compressor */\n  jpeg_start_compress(&cinfo, TRUE);\n\n  /* Process data */\n  while (cinfo.next_scanline < cinfo.image_height) {\n    num_scanlines = (*src_mgr->get_pixel_rows) (&cinfo, src_mgr);\n    (void) jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines);\n  }\n\n  /* Finish compression and release memory */\n  (*src_mgr->finish_input) (&cinfo, src_mgr);\n  jpeg_finish_compress(&cinfo);\n  jpeg_destroy_compress(&cinfo);\n\n  /* Close files, if we opened them */\n  if (input_file != stdin)\n    fclose(input_file);\n  if (output_file != stdout)\n    fclose(output_file);\n\n#ifdef PROGRESS_REPORT\n  end_progress_monitor((j_common_ptr) &cinfo);\n#endif\n\n  /* All done. */\n  exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);\n  return 0;\t\t\t/* suppress no-return-value warnings */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/ckconfig.c",
    "content": "/*\n * ckconfig.c\n *\n * Copyright (C) 1991-1994, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n */\n\n/*\n * This program is intended to help you determine how to configure the JPEG\n * software for installation on a particular system.  The idea is to try to\n * compile and execute this program.  If your compiler fails to compile the\n * program, make changes as indicated in the comments below.  Once you can\n * compile the program, run it, and it will produce a \"jconfig.h\" file for\n * your system.\n *\n * As a general rule, each time you try to compile this program,\n * pay attention only to the *first* error message you get from the compiler.\n * Many C compilers will issue lots of spurious error messages once they\n * have gotten confused.  Go to the line indicated in the first error message,\n * and read the comments preceding that line to see what to change.\n *\n * Almost all of the edits you may need to make to this program consist of\n * changing a line that reads \"#define SOME_SYMBOL\" to \"#undef SOME_SYMBOL\",\n * or vice versa.  This is called defining or undefining that symbol.\n */\n\n\n/* First we must see if your system has the include files we need.\n * We start out with the assumption that your system has all the ANSI-standard\n * include files.  If you get any error trying to include one of these files,\n * undefine the corresponding HAVE_xxx symbol.\n */\n\n#define HAVE_STDDEF_H\t\t/* replace 'define' by 'undef' if error here */\n#ifdef HAVE_STDDEF_H\t\t/* next line will be skipped if you undef... */\n#include <stddef.h>\n#endif\n\n#define HAVE_STDLIB_H\t\t/* same thing for stdlib.h */\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n\n#include <stdio.h>\t\t/* If you ain't got this, you ain't got C. */\n\n/* We have to see if your string functions are defined by\n * strings.h (old BSD convention) or string.h (everybody else).\n * We try the non-BSD convention first; define NEED_BSD_STRINGS\n * if the compiler says it can't find string.h.\n */\n\n#undef NEED_BSD_STRINGS\n\n#ifdef NEED_BSD_STRINGS\n#include <strings.h>\n#else\n#include <string.h>\n#endif\n\n/* On some systems (especially older Unix machines), type size_t is\n * defined only in the include file <sys/types.h>.  If you get a failure\n * on the size_t test below, try defining NEED_SYS_TYPES_H.\n */\n\n#undef NEED_SYS_TYPES_H\t\t/* start by assuming we don't need it */\n#ifdef NEED_SYS_TYPES_H\n#include <sys/types.h>\n#endif\n\n\n/* Usually type size_t is defined in one of the include files we've included\n * above.  If not, you'll get an error on the \"typedef size_t my_size_t;\" line.\n * In that case, first try defining NEED_SYS_TYPES_H just above.\n * If that doesn't work, you'll have to search through your system library\n * to figure out which include file defines \"size_t\".  Look for a line that\n * says \"typedef something-or-other size_t;\".  Then, change the line below\n * that says \"#include <someincludefile.h>\" to instead include the file\n * you found size_t in, and define NEED_SPECIAL_INCLUDE.  If you can't find\n * type size_t anywhere, try replacing \"#include <someincludefile.h>\" with\n * \"typedef unsigned int size_t;\".\n */\n\n#undef NEED_SPECIAL_INCLUDE\t/* assume we DON'T need it, for starters */\n\n#ifdef NEED_SPECIAL_INCLUDE\n#include <someincludefile.h>\n#endif\n\ntypedef size_t my_size_t;\t/* The payoff: do we have size_t now? */\n\n\n/* The next question is whether your compiler supports ANSI-style function\n * prototypes.  You need to know this in order to choose between using\n * makefile.ansi and using makefile.unix.\n * The #define line below is set to assume you have ANSI function prototypes.\n * If you get an error in this group of lines, undefine HAVE_PROTOTYPES.\n */\n\n#define HAVE_PROTOTYPES\n\n#ifdef HAVE_PROTOTYPES\nint testfunction (int arg1, int * arg2); /* check prototypes */\n\nstruct methods_struct {\t\t/* check method-pointer declarations */\n  int (*error_exit) (char *msgtext);\n  int (*trace_message) (char *msgtext);\n  int (*another_method) (void);\n};\n\nint testfunction (int arg1, int * arg2) /* check definitions */\n{\n  return arg2[arg1];\n}\n\nint test2function (void)\t/* check void arg list */\n{\n  return 0;\n}\n#endif\n\n\n/* Now we want to find out if your compiler knows what \"unsigned char\" means.\n * If you get an error on the \"unsigned char un_char;\" line,\n * then undefine HAVE_UNSIGNED_CHAR.\n */\n\n#define HAVE_UNSIGNED_CHAR\n\n#ifdef HAVE_UNSIGNED_CHAR\nunsigned char un_char;\n#endif\n\n\n/* Now we want to find out if your compiler knows what \"unsigned short\" means.\n * If you get an error on the \"unsigned short un_short;\" line,\n * then undefine HAVE_UNSIGNED_SHORT.\n */\n\n#define HAVE_UNSIGNED_SHORT\n\n#ifdef HAVE_UNSIGNED_SHORT\nunsigned short un_short;\n#endif\n\n\n/* Now we want to find out if your compiler understands type \"void\".\n * If you get an error anywhere in here, undefine HAVE_VOID.\n */\n\n#define HAVE_VOID\n\n#ifdef HAVE_VOID\n/* Caution: a C++ compiler will insist on complete prototypes */\ntypedef void * void_ptr;\t/* check void * */\n#ifdef HAVE_PROTOTYPES\t\t/* check ptr to function returning void */\ntypedef void (*void_func) (int a, int b);\n#else\ntypedef void (*void_func) ();\n#endif\n\n#ifdef HAVE_PROTOTYPES\t\t/* check void function result */\nvoid test3function (void_ptr arg1, void_func arg2)\n#else\nvoid test3function (arg1, arg2)\n     void_ptr arg1;\n     void_func arg2;\n#endif\n{\n  char * locptr = (char *) arg1; /* check casting to and from void * */\n  arg1 = (void *) locptr;\n  (*arg2) (1, 2);\t\t/* check call of fcn returning void */\n}\n#endif\n\n\n/* Now we want to find out if your compiler knows what \"const\" means.\n * If you get an error here, undefine HAVE_CONST.\n */\n\n#define HAVE_CONST\n\n#ifdef HAVE_CONST\nstatic const int carray[3] = {1, 2, 3};\n\n#ifdef HAVE_PROTOTYPES\nint test4function (const int arg1)\n#else\nint test4function (arg1)\n     const int arg1;\n#endif\n{\n  return carray[arg1];\n}\n#endif\n\n\n/* If you get an error or warning about this structure definition,\n * define INCOMPLETE_TYPES_BROKEN.\n */\n\n#undef INCOMPLETE_TYPES_BROKEN\n\n#ifndef INCOMPLETE_TYPES_BROKEN\ntypedef struct undefined_structure * undef_struct_ptr;\n#endif\n\n\n/* If you get an error about duplicate names,\n * define NEED_SHORT_EXTERNAL_NAMES.\n */\n\n#undef NEED_SHORT_EXTERNAL_NAMES\n\n#ifndef NEED_SHORT_EXTERNAL_NAMES\n\nint possibly_duplicate_function ()\n{\n  return 0;\n}\n\nint possibly_dupli_function ()\n{\n  return 1;\n}\n\n#endif\n\n\n\n/************************************************************************\n *  OK, that's it.  You should not have to change anything beyond this\n *  point in order to compile and execute this program.  (You might get\n *  some warnings, but you can ignore them.)\n *  When you run the program, it will make a couple more tests that it\n *  can do automatically, and then it will create jconfig.h and print out\n *  any additional suggestions it has.\n ************************************************************************\n */\n\n\n#ifdef HAVE_PROTOTYPES\nint is_char_signed (int arg)\n#else\nint is_char_signed (arg)\n     int arg;\n#endif\n{\n  if (arg == 189) {\t\t/* expected result for unsigned char */\n    return 0;\t\t\t/* type char is unsigned */\n  }\n  else if (arg != -67) {\t/* expected result for signed char */\n    printf(\"Hmm, it seems 'char' is not eight bits wide on your machine.\\n\");\n    printf(\"I fear the JPEG software will not work at all.\\n\\n\");\n  }\n  return 1;\t\t\t/* assume char is signed otherwise */\n}\n\n\n#ifdef HAVE_PROTOTYPES\nint is_shifting_signed (long arg)\n#else\nint is_shifting_signed (arg)\n     long arg;\n#endif\n/* See whether right-shift on a long is signed or not. */\n{\n  long res = arg >> 4;\n\n  if (res == -0x7F7E80CL) {\t/* expected result for signed shift */\n    return 1;\t\t\t/* right shift is signed */\n  }\n  /* see if unsigned-shift hack will fix it. */\n  /* we can't just test exact value since it depends on width of long... */\n  res |= (~0L) << (32-4);\n  if (res == -0x7F7E80CL) {\t/* expected result now? */\n    return 0;\t\t\t/* right shift is unsigned */\n  }\n  printf(\"Right shift isn't acting as I expect it to.\\n\");\n  printf(\"I fear the JPEG software will not work at all.\\n\\n\");\n  return 0;\t\t\t/* try it with unsigned anyway */\n}\n\n\n#ifdef HAVE_PROTOTYPES\nint main (int argc, char ** argv)\n#else\nint main (argc, argv)\n     int argc;\n     char ** argv;\n#endif\n{\n  char signed_char_check = (char) (-67);\n  FILE *outfile;\n\n  /* Attempt to write jconfig.h */\n  if ((outfile = fopen(\"jconfig.h\", \"w\")) == NULL) {\n    printf(\"Failed to write jconfig.h\\n\");\n    return 1;\n  }\n\n  /* Write out all the info */\n  fprintf(outfile, \"/* jconfig.h --- generated by ckconfig.c */\\n\");\n  fprintf(outfile, \"/* see jconfig.txt for explanations */\\n\\n\");\n#ifdef HAVE_PROTOTYPES\n  fprintf(outfile, \"#define HAVE_PROTOTYPES\\n\");\n#else\n  fprintf(outfile, \"#undef HAVE_PROTOTYPES\\n\");\n#endif\n#ifdef HAVE_UNSIGNED_CHAR\n  fprintf(outfile, \"#define HAVE_UNSIGNED_CHAR\\n\");\n#else\n  fprintf(outfile, \"#undef HAVE_UNSIGNED_CHAR\\n\");\n#endif\n#ifdef HAVE_UNSIGNED_SHORT\n  fprintf(outfile, \"#define HAVE_UNSIGNED_SHORT\\n\");\n#else\n  fprintf(outfile, \"#undef HAVE_UNSIGNED_SHORT\\n\");\n#endif\n#ifdef HAVE_VOID\n  fprintf(outfile, \"/* #define void char */\\n\");\n#else\n  fprintf(outfile, \"#define void char\\n\");\n#endif\n#ifdef HAVE_CONST\n  fprintf(outfile, \"/* #define const */\\n\");\n#else\n  fprintf(outfile, \"#define const\\n\");\n#endif\n  if (is_char_signed((int) signed_char_check))\n    fprintf(outfile, \"#undef CHAR_IS_UNSIGNED\\n\");\n  else\n    fprintf(outfile, \"#define CHAR_IS_UNSIGNED\\n\");\n#ifdef HAVE_STDDEF_H\n  fprintf(outfile, \"#define HAVE_STDDEF_H\\n\");\n#else\n  fprintf(outfile, \"#undef HAVE_STDDEF_H\\n\");\n#endif\n#ifdef HAVE_STDLIB_H\n  fprintf(outfile, \"#define HAVE_STDLIB_H\\n\");\n#else\n  fprintf(outfile, \"#undef HAVE_STDLIB_H\\n\");\n#endif\n#ifdef NEED_BSD_STRINGS\n  fprintf(outfile, \"#define NEED_BSD_STRINGS\\n\");\n#else\n  fprintf(outfile, \"#undef NEED_BSD_STRINGS\\n\");\n#endif\n#ifdef NEED_SYS_TYPES_H\n  fprintf(outfile, \"#define NEED_SYS_TYPES_H\\n\");\n#else\n  fprintf(outfile, \"#undef NEED_SYS_TYPES_H\\n\");\n#endif\n  fprintf(outfile, \"#undef NEED_FAR_POINTERS\\n\");\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n  fprintf(outfile, \"#define NEED_SHORT_EXTERNAL_NAMES\\n\");\n#else\n  fprintf(outfile, \"#undef NEED_SHORT_EXTERNAL_NAMES\\n\");\n#endif\n#ifdef INCOMPLETE_TYPES_BROKEN\n  fprintf(outfile, \"#define INCOMPLETE_TYPES_BROKEN\\n\");\n#else\n  fprintf(outfile, \"#undef INCOMPLETE_TYPES_BROKEN\\n\");\n#endif\n  fprintf(outfile, \"\\n#ifdef JPEG_INTERNALS\\n\\n\");\n  if (is_shifting_signed(-0x7F7E80B1L))\n    fprintf(outfile, \"#undef RIGHT_SHIFT_IS_UNSIGNED\\n\");\n  else\n    fprintf(outfile, \"#define RIGHT_SHIFT_IS_UNSIGNED\\n\");\n  fprintf(outfile, \"\\n#endif /* JPEG_INTERNALS */\\n\");\n  fprintf(outfile, \"\\n#ifdef JPEG_CJPEG_DJPEG\\n\\n\");\n  fprintf(outfile, \"#define BMP_SUPPORTED\t\t/* BMP image file format */\\n\");\n  fprintf(outfile, \"#define GIF_SUPPORTED\t\t/* GIF image file format */\\n\");\n  fprintf(outfile, \"#define PPM_SUPPORTED\t\t/* PBMPLUS PPM/PGM image file format */\\n\");\n  fprintf(outfile, \"#undef RLE_SUPPORTED\t\t/* Utah RLE image file format */\\n\");\n  fprintf(outfile, \"#define TARGA_SUPPORTED\t\t/* Targa image file format */\\n\\n\");\n  fprintf(outfile, \"#undef TWO_FILE_COMMANDLINE\t/* You may need this on non-Unix systems */\\n\");\n  fprintf(outfile, \"#undef NEED_SIGNAL_CATCHER\t/* Define this if you use jmemname.c */\\n\");\n  fprintf(outfile, \"#undef DONT_USE_B_MODE\\n\");\n  fprintf(outfile, \"/* #define PROGRESS_REPORT */\t/* optional */\\n\");\n  fprintf(outfile, \"\\n#endif /* JPEG_CJPEG_DJPEG */\\n\");\n\n  /* Close the jconfig.h file */\n  fclose(outfile);\n\n  /* User report */\n  printf(\"Configuration check for Independent JPEG Group's software done.\\n\");\n  printf(\"\\nI have written the jconfig.h file for you.\\n\\n\");\n#ifdef HAVE_PROTOTYPES\n  printf(\"You should use makefile.ansi as the starting point for your Makefile.\\n\");\n#else\n  printf(\"You should use makefile.unix as the starting point for your Makefile.\\n\");\n#endif\n\n#ifdef NEED_SPECIAL_INCLUDE\n  printf(\"\\nYou'll need to change jconfig.h to include the system include file\\n\");\n  printf(\"that you found type size_t in, or add a direct definition of type\\n\");\n  printf(\"size_t if that's what you used.  Just add it to the end.\\n\");\n#endif\n\n  return 0;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/djpeg.c",
    "content": "/*\n * djpeg.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 2009-2013 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a command-line user interface for the JPEG decompressor.\n * It should work on any system with Unix- or MS-DOS-style command lines.\n *\n * Two different command line styles are permitted, depending on the\n * compile-time switch TWO_FILE_COMMANDLINE:\n *\tdjpeg [options]  inputfile outputfile\n *\tdjpeg [options]  [inputfile]\n * In the second style, output is always to standard output, which you'd\n * normally redirect to a file or pipe to some other program.  Input is\n * either from a named file or from standard input (typically redirected).\n * The second style is convenient on Unix but is unhelpful on systems that\n * don't support pipes.  Also, you MUST use the first style if your system\n * doesn't do binary I/O to stdin/stdout.\n * To simplify script writing, the \"-outfile\" switch is provided.  The syntax\n *\tdjpeg [options]  -outfile outputfile  inputfile\n * works regardless of which command line style is used.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n#include \"jversion.h\"\t\t/* for version message */\n\n#include <ctype.h>\t\t/* to declare isprint() */\n\n#ifdef USE_CCOMMAND\t\t/* command-line reader for Macintosh */\n#ifdef __MWERKS__\n#include <SIOUX.h>              /* Metrowerks needs this */\n#include <console.h>\t\t/* ... and this */\n#endif\n#ifdef THINK_C\n#include <console.h>\t\t/* Think declares it here */\n#endif\n#endif\n\n\n/* Create the add-on message string table. */\n\n#define JMESSAGE(code,string)\tstring ,\n\nstatic const char * const cdjpeg_message_table[] = {\n#include \"cderror.h\"\n  NULL\n};\n\n\n/*\n * This list defines the known output image formats\n * (not all of which need be supported by a given version).\n * You can change the default output format by defining DEFAULT_FMT;\n * indeed, you had better do so if you undefine PPM_SUPPORTED.\n */\n\ntypedef enum {\n\tFMT_BMP,\t\t/* BMP format (Windows flavor) */\n\tFMT_GIF,\t\t/* GIF format */\n\tFMT_OS2,\t\t/* BMP format (OS/2 flavor) */\n\tFMT_PPM,\t\t/* PPM/PGM (PBMPLUS formats) */\n\tFMT_RLE,\t\t/* RLE format */\n\tFMT_TARGA,\t\t/* Targa format */\n\tFMT_TIFF\t\t/* TIFF format */\n} IMAGE_FORMATS;\n\n#ifndef DEFAULT_FMT\t\t/* so can override from CFLAGS in Makefile */\n#define DEFAULT_FMT\tFMT_PPM\n#endif\n\nstatic IMAGE_FORMATS requested_fmt;\n\n\n/*\n * Argument-parsing code.\n * The switch parser is designed to be useful with DOS-style command line\n * syntax, ie, intermixed switches and file names, where only the switches\n * to the left of a given file name affect processing of that file.\n * The main program in this file doesn't actually use this capability...\n */\n\n\nstatic const char * progname;\t/* program name for error messages */\nstatic char * outfilename;\t/* for -outfile switch */\n\n\nLOCAL(void)\nusage (void)\n/* complain about bad command line */\n{\n  fprintf(stderr, \"usage: %s [switches] \", progname);\n#ifdef TWO_FILE_COMMANDLINE\n  fprintf(stderr, \"inputfile outputfile\\n\");\n#else\n  fprintf(stderr, \"[inputfile]\\n\");\n#endif\n\n  fprintf(stderr, \"Switches (names may be abbreviated):\\n\");\n  fprintf(stderr, \"  -colors N      Reduce image to no more than N colors\\n\");\n  fprintf(stderr, \"  -fast          Fast, low-quality processing\\n\");\n  fprintf(stderr, \"  -grayscale     Force grayscale output\\n\");\n#ifdef IDCT_SCALING_SUPPORTED\n  fprintf(stderr, \"  -scale M/N     Scale output image by fraction M/N, eg, 1/8\\n\");\n#endif\n#ifdef BMP_SUPPORTED\n  fprintf(stderr, \"  -bmp           Select BMP output format (Windows style)%s\\n\",\n\t  (DEFAULT_FMT == FMT_BMP ? \" (default)\" : \"\"));\n#endif\n#ifdef GIF_SUPPORTED\n  fprintf(stderr, \"  -gif           Select GIF output format%s\\n\",\n\t  (DEFAULT_FMT == FMT_GIF ? \" (default)\" : \"\"));\n#endif\n#ifdef BMP_SUPPORTED\n  fprintf(stderr, \"  -os2           Select BMP output format (OS/2 style)%s\\n\",\n\t  (DEFAULT_FMT == FMT_OS2 ? \" (default)\" : \"\"));\n#endif\n#ifdef PPM_SUPPORTED\n  fprintf(stderr, \"  -pnm           Select PBMPLUS (PPM/PGM) output format%s\\n\",\n\t  (DEFAULT_FMT == FMT_PPM ? \" (default)\" : \"\"));\n#endif\n#ifdef RLE_SUPPORTED\n  fprintf(stderr, \"  -rle           Select Utah RLE output format%s\\n\",\n\t  (DEFAULT_FMT == FMT_RLE ? \" (default)\" : \"\"));\n#endif\n#ifdef TARGA_SUPPORTED\n  fprintf(stderr, \"  -targa         Select Targa output format%s\\n\",\n\t  (DEFAULT_FMT == FMT_TARGA ? \" (default)\" : \"\"));\n#endif\n  fprintf(stderr, \"Switches for advanced users:\\n\");\n#ifdef DCT_ISLOW_SUPPORTED\n  fprintf(stderr, \"  -dct int       Use integer DCT method%s\\n\",\n\t  (JDCT_DEFAULT == JDCT_ISLOW ? \" (default)\" : \"\"));\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n  fprintf(stderr, \"  -dct fast      Use fast integer DCT (less accurate)%s\\n\",\n\t  (JDCT_DEFAULT == JDCT_IFAST ? \" (default)\" : \"\"));\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n  fprintf(stderr, \"  -dct float     Use floating-point DCT method%s\\n\",\n\t  (JDCT_DEFAULT == JDCT_FLOAT ? \" (default)\" : \"\"));\n#endif\n  fprintf(stderr, \"  -dither fs     Use F-S dithering (default)\\n\");\n  fprintf(stderr, \"  -dither none   Don't use dithering in quantization\\n\");\n  fprintf(stderr, \"  -dither ordered  Use ordered dither (medium speed, quality)\\n\");\n#ifdef QUANT_2PASS_SUPPORTED\n  fprintf(stderr, \"  -map FILE      Map to colors used in named image file\\n\");\n#endif\n  fprintf(stderr, \"  -nosmooth      Don't use high-quality upsampling\\n\");\n#ifdef QUANT_1PASS_SUPPORTED\n  fprintf(stderr, \"  -onepass       Use 1-pass quantization (fast, low quality)\\n\");\n#endif\n  fprintf(stderr, \"  -maxmemory N   Maximum memory to use (in kbytes)\\n\");\n  fprintf(stderr, \"  -outfile name  Specify name for output file\\n\");\n  fprintf(stderr, \"  -verbose  or  -debug   Emit debug output\\n\");\n  exit(EXIT_FAILURE);\n}\n\n\nLOCAL(int)\nparse_switches (j_decompress_ptr cinfo, int argc, char **argv,\n\t\tint last_file_arg_seen, boolean for_real)\n/* Parse optional switches.\n * Returns argv[] index of first file-name argument (== argc if none).\n * Any file names with indexes <= last_file_arg_seen are ignored;\n * they have presumably been processed in a previous iteration.\n * (Pass 0 for last_file_arg_seen on the first or only iteration.)\n * for_real is FALSE on the first (dummy) pass; we may skip any expensive\n * processing.\n */\n{\n  int argn;\n  char * arg;\n\n  /* Set up default JPEG parameters. */\n  requested_fmt = DEFAULT_FMT;\t/* set default output file format */\n  outfilename = NULL;\n  cinfo->err->trace_level = 0;\n\n  /* Scan command line options, adjust parameters */\n\n  for (argn = 1; argn < argc; argn++) {\n    arg = argv[argn];\n    if (*arg != '-') {\n      /* Not a switch, must be a file name argument */\n      if (argn <= last_file_arg_seen) {\n\toutfilename = NULL;\t/* -outfile applies to just one input file */\n\tcontinue;\t\t/* ignore this name if previously processed */\n      }\n      break;\t\t\t/* else done parsing switches */\n    }\n    arg++;\t\t\t/* advance past switch marker character */\n\n    if (keymatch(arg, \"bmp\", 1)) {\n      /* BMP output format. */\n      requested_fmt = FMT_BMP;\n\n    } else if (keymatch(arg, \"colors\", 1) || keymatch(arg, \"colours\", 1) ||\n\t       keymatch(arg, \"quantize\", 1) || keymatch(arg, \"quantise\", 1)) {\n      /* Do color quantization. */\n      int val;\n\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%d\", &val) != 1)\n\tusage();\n      cinfo->desired_number_of_colors = val;\n      cinfo->quantize_colors = TRUE;\n\n    } else if (keymatch(arg, \"dct\", 2)) {\n      /* Select IDCT algorithm. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (keymatch(argv[argn], \"int\", 1)) {\n\tcinfo->dct_method = JDCT_ISLOW;\n      } else if (keymatch(argv[argn], \"fast\", 2)) {\n\tcinfo->dct_method = JDCT_IFAST;\n      } else if (keymatch(argv[argn], \"float\", 2)) {\n\tcinfo->dct_method = JDCT_FLOAT;\n      } else\n\tusage();\n\n    } else if (keymatch(arg, \"dither\", 2)) {\n      /* Select dithering algorithm. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (keymatch(argv[argn], \"fs\", 2)) {\n\tcinfo->dither_mode = JDITHER_FS;\n      } else if (keymatch(argv[argn], \"none\", 2)) {\n\tcinfo->dither_mode = JDITHER_NONE;\n      } else if (keymatch(argv[argn], \"ordered\", 2)) {\n\tcinfo->dither_mode = JDITHER_ORDERED;\n      } else\n\tusage();\n\n    } else if (keymatch(arg, \"debug\", 1) || keymatch(arg, \"verbose\", 1)) {\n      /* Enable debug printouts. */\n      /* On first -d, print version identification */\n      static boolean printed_version = FALSE;\n\n      if (! printed_version) {\n\tfprintf(stderr, \"Independent JPEG Group's DJPEG, version %s\\n%s\\n\",\n\t\tJVERSION, JCOPYRIGHT);\n\tprinted_version = TRUE;\n      }\n      cinfo->err->trace_level++;\n\n    } else if (keymatch(arg, \"fast\", 1)) {\n      /* Select recommended processing options for quick-and-dirty output. */\n      cinfo->two_pass_quantize = FALSE;\n      cinfo->dither_mode = JDITHER_ORDERED;\n      if (! cinfo->quantize_colors) /* don't override an earlier -colors */\n\tcinfo->desired_number_of_colors = 216;\n      cinfo->dct_method = JDCT_FASTEST;\n      cinfo->do_fancy_upsampling = FALSE;\n\n    } else if (keymatch(arg, \"gif\", 1)) {\n      /* GIF output format. */\n      requested_fmt = FMT_GIF;\n\n    } else if (keymatch(arg, \"grayscale\", 2) || keymatch(arg, \"greyscale\",2)) {\n      /* Force monochrome output. */\n      cinfo->out_color_space = JCS_GRAYSCALE;\n\n    } else if (keymatch(arg, \"map\", 3)) {\n      /* Quantize to a color map taken from an input file. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (for_real) {\t\t/* too expensive to do twice! */\n#ifdef QUANT_2PASS_SUPPORTED\t/* otherwise can't quantize to supplied map */\n\tFILE * mapfile;\n\n\tif ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) {\n\t  fprintf(stderr, \"%s: can't open %s\\n\", progname, argv[argn]);\n\t  exit(EXIT_FAILURE);\n\t}\n\tread_color_map(cinfo, mapfile);\n\tfclose(mapfile);\n\tcinfo->quantize_colors = TRUE;\n#else\n\tERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n      }\n\n    } else if (keymatch(arg, \"maxmemory\", 3)) {\n      /* Maximum memory in Kb (or Mb with 'm'). */\n      long lval;\n      char ch = 'x';\n\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%ld%c\", &lval, &ch) < 1)\n\tusage();\n      if (ch == 'm' || ch == 'M')\n\tlval *= 1000L;\n      cinfo->mem->max_memory_to_use = lval * 1000L;\n\n    } else if (keymatch(arg, \"nosmooth\", 3)) {\n      /* Suppress fancy upsampling. */\n      cinfo->do_fancy_upsampling = FALSE;\n\n    } else if (keymatch(arg, \"onepass\", 3)) {\n      /* Use fast one-pass quantization. */\n      cinfo->two_pass_quantize = FALSE;\n\n    } else if (keymatch(arg, \"os2\", 3)) {\n      /* BMP output format (OS/2 flavor). */\n      requested_fmt = FMT_OS2;\n\n    } else if (keymatch(arg, \"outfile\", 4)) {\n      /* Set output file name. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      outfilename = argv[argn];\t/* save it away for later use */\n\n    } else if (keymatch(arg, \"pnm\", 1) || keymatch(arg, \"ppm\", 1)) {\n      /* PPM/PGM output format. */\n      requested_fmt = FMT_PPM;\n\n    } else if (keymatch(arg, \"rle\", 1)) {\n      /* RLE output format. */\n      requested_fmt = FMT_RLE;\n\n    } else if (keymatch(arg, \"scale\", 1)) {\n      /* Scale the output image by a fraction M/N. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%u/%u\",\n\t\t &cinfo->scale_num, &cinfo->scale_denom) < 1)\n\tusage();\n\n    } else if (keymatch(arg, \"targa\", 1)) {\n      /* Targa output format. */\n      requested_fmt = FMT_TARGA;\n\n    } else {\n      usage();\t\t\t/* bogus switch */\n    }\n  }\n\n  return argn;\t\t\t/* return index of next arg (file name) */\n}\n\n\n/*\n * Marker processor for COM and interesting APPn markers.\n * This replaces the library's built-in processor, which just skips the marker.\n * We want to print out the marker as text, to the extent possible.\n * Note this code relies on a non-suspending data source.\n */\n\nLOCAL(unsigned int)\njpeg_getc (j_decompress_ptr cinfo)\n/* Read next byte */\n{\n  struct jpeg_source_mgr * datasrc = cinfo->src;\n\n  if (datasrc->bytes_in_buffer == 0) {\n    if (! (*datasrc->fill_input_buffer) (cinfo))\n      ERREXIT(cinfo, JERR_CANT_SUSPEND);\n  }\n  datasrc->bytes_in_buffer--;\n  return GETJOCTET(*datasrc->next_input_byte++);\n}\n\n\nMETHODDEF(boolean)\nprint_text_marker (j_decompress_ptr cinfo)\n{\n  boolean traceit = (cinfo->err->trace_level >= 1);\n  INT32 length;\n  unsigned int ch;\n  unsigned int lastch = 0;\n\n  length = jpeg_getc(cinfo) << 8;\n  length += jpeg_getc(cinfo);\n  length -= 2;\t\t\t/* discount the length word itself */\n\n  if (traceit) {\n    if (cinfo->unread_marker == JPEG_COM)\n      fprintf(stderr, \"Comment, length %ld:\\n\", (long) length);\n    else\t\t\t/* assume it is an APPn otherwise */\n      fprintf(stderr, \"APP%d, length %ld:\\n\",\n\t      cinfo->unread_marker - JPEG_APP0, (long) length);\n  }\n\n  while (--length >= 0) {\n    ch = jpeg_getc(cinfo);\n    if (traceit) {\n      /* Emit the character in a readable form.\n       * Nonprintables are converted to \\nnn form,\n       * while \\ is converted to \\\\.\n       * Newlines in CR, CR/LF, or LF form will be printed as one newline.\n       */\n      if (ch == '\\r') {\n\tfprintf(stderr, \"\\n\");\n      } else if (ch == '\\n') {\n\tif (lastch != '\\r')\n\t  fprintf(stderr, \"\\n\");\n      } else if (ch == '\\\\') {\n\tfprintf(stderr, \"\\\\\\\\\");\n      } else if (isprint(ch)) {\n\tputc(ch, stderr);\n      } else {\n\tfprintf(stderr, \"\\\\%03o\", ch);\n      }\n      lastch = ch;\n    }\n  }\n\n  if (traceit)\n    fprintf(stderr, \"\\n\");\n\n  return TRUE;\n}\n\n\n/*\n * The main program.\n */\n\nint\nmain (int argc, char **argv)\n{\n  struct jpeg_decompress_struct cinfo;\n  struct jpeg_error_mgr jerr;\n#ifdef PROGRESS_REPORT\n  struct cdjpeg_progress_mgr progress;\n#endif\n  int file_index;\n  djpeg_dest_ptr dest_mgr = NULL;\n  FILE * input_file;\n  FILE * output_file;\n  JDIMENSION num_scanlines;\n\n  /* On Mac, fetch a command line. */\n#ifdef USE_CCOMMAND\n  argc = ccommand(&argv);\n#endif\n\n  progname = argv[0];\n  if (progname == NULL || progname[0] == 0)\n    progname = \"djpeg\";\t\t/* in case C library doesn't provide it */\n\n  /* Initialize the JPEG decompression object with default error handling. */\n  cinfo.err = jpeg_std_error(&jerr);\n  jpeg_create_decompress(&cinfo);\n  /* Add some application-specific error messages (from cderror.h) */\n  jerr.addon_message_table = cdjpeg_message_table;\n  jerr.first_addon_message = JMSG_FIRSTADDONCODE;\n  jerr.last_addon_message = JMSG_LASTADDONCODE;\n\n  /* Insert custom marker processor for COM and APP12.\n   * APP12 is used by some digital camera makers for textual info,\n   * so we provide the ability to display it as text.\n   * If you like, additional APPn marker types can be selected for display,\n   * but don't try to override APP0 or APP14 this way (see libjpeg.doc).\n   */\n  jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker);\n  jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker);\n\n  /* Now safe to enable signal catcher. */\n#ifdef NEED_SIGNAL_CATCHER\n  enable_signal_catcher((j_common_ptr) &cinfo);\n#endif\n\n  /* Scan command line to find file names. */\n  /* It is convenient to use just one switch-parsing routine, but the switch\n   * values read here are ignored; we will rescan the switches after opening\n   * the input file.\n   * (Exception: tracing level set here controls verbosity for COM markers\n   * found during jpeg_read_header...)\n   */\n\n  file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);\n\n#ifdef TWO_FILE_COMMANDLINE\n  /* Must have either -outfile switch or explicit output file name */\n  if (outfilename == NULL) {\n    if (file_index != argc-2) {\n      fprintf(stderr, \"%s: must name one input and one output file\\n\",\n\t      progname);\n      usage();\n    }\n    outfilename = argv[file_index+1];\n  } else {\n    if (file_index != argc-1) {\n      fprintf(stderr, \"%s: must name one input and one output file\\n\",\n\t      progname);\n      usage();\n    }\n  }\n#else\n  /* Unix style: expect zero or one file name */\n  if (file_index < argc-1) {\n    fprintf(stderr, \"%s: only one input file\\n\", progname);\n    usage();\n  }\n#endif /* TWO_FILE_COMMANDLINE */\n\n  /* Open the input file. */\n  if (file_index < argc) {\n    if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open %s\\n\", progname, argv[file_index]);\n      exit(EXIT_FAILURE);\n    }\n  } else {\n    /* default input file is stdin */\n    input_file = read_stdin();\n  }\n\n  /* Open the output file. */\n  if (outfilename != NULL) {\n    if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open %s\\n\", progname, outfilename);\n      exit(EXIT_FAILURE);\n    }\n  } else {\n    /* default output file is stdout */\n    output_file = write_stdout();\n  }\n\n#ifdef PROGRESS_REPORT\n  start_progress_monitor((j_common_ptr) &cinfo, &progress);\n#endif\n\n  /* Specify data source for decompression */\n  jpeg_stdio_src(&cinfo, input_file);\n\n  /* Read file header, set default decompression parameters */\n  (void) jpeg_read_header(&cinfo, TRUE);\n\n  /* Adjust default decompression parameters by re-parsing the options */\n  file_index = parse_switches(&cinfo, argc, argv, 0, TRUE);\n\n  /* Initialize the output module now to let it override any crucial\n   * option settings (for instance, GIF wants to force color quantization).\n   */\n  switch (requested_fmt) {\n#ifdef BMP_SUPPORTED\n  case FMT_BMP:\n    dest_mgr = jinit_write_bmp(&cinfo, FALSE);\n    break;\n  case FMT_OS2:\n    dest_mgr = jinit_write_bmp(&cinfo, TRUE);\n    break;\n#endif\n#ifdef GIF_SUPPORTED\n  case FMT_GIF:\n    dest_mgr = jinit_write_gif(&cinfo);\n    break;\n#endif\n#ifdef PPM_SUPPORTED\n  case FMT_PPM:\n    dest_mgr = jinit_write_ppm(&cinfo);\n    break;\n#endif\n#ifdef RLE_SUPPORTED\n  case FMT_RLE:\n    dest_mgr = jinit_write_rle(&cinfo);\n    break;\n#endif\n#ifdef TARGA_SUPPORTED\n  case FMT_TARGA:\n    dest_mgr = jinit_write_targa(&cinfo);\n    break;\n#endif\n  default:\n    ERREXIT(&cinfo, JERR_UNSUPPORTED_FORMAT);\n    break;\n  }\n  dest_mgr->output_file = output_file;\n\n  /* Start decompressor */\n  (void) jpeg_start_decompress(&cinfo);\n\n  /* Write output file header */\n  (*dest_mgr->start_output) (&cinfo, dest_mgr);\n\n  /* Process data */\n  while (cinfo.output_scanline < cinfo.output_height) {\n    num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,\n\t\t\t\t\tdest_mgr->buffer_height);\n    (*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);\n  }\n\n#ifdef PROGRESS_REPORT\n  /* Hack: count final pass as done in case finish_output does an extra pass.\n   * The library won't have updated completed_passes.\n   */\n  progress.pub.completed_passes = progress.pub.total_passes;\n#endif\n\n  /* Finish decompression and release memory.\n   * I must do it in this order because output module has allocated memory\n   * of lifespan JPOOL_IMAGE; it needs to finish before releasing memory.\n   */\n  (*dest_mgr->finish_output) (&cinfo, dest_mgr);\n  (void) jpeg_finish_decompress(&cinfo);\n  jpeg_destroy_decompress(&cinfo);\n\n  /* Close files, if we opened them */\n  if (input_file != stdin)\n    fclose(input_file);\n  if (output_file != stdout)\n    fclose(output_file);\n\n#ifdef PROGRESS_REPORT\n  end_progress_monitor((j_common_ptr) &cinfo);\n#endif\n\n  /* All done. */\n  exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);\n  return 0;\t\t\t/* suppress no-return-value warnings */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/example.c",
    "content": "/*\n * example.c\n *\n * This file illustrates how to use the IJG code as a subroutine library\n * to read or write JPEG image files.  You should look at this code in\n * conjunction with the documentation file libjpeg.txt.\n *\n * This code will not do anything useful as-is, but it may be helpful as a\n * skeleton for constructing routines that call the JPEG library.  \n *\n * We present these routines in the same coding style used in the JPEG code\n * (ANSI function definitions, etc); but you are of course free to code your\n * routines in a different style if you prefer.\n */\n\n#include <stdio.h>\n\n/*\n * Include file for users of JPEG library.\n * You will need to have included system headers that define at least\n * the typedefs FILE and size_t before you can include jpeglib.h.\n * (stdio.h is sufficient on ANSI-conforming systems.)\n * You may also wish to include \"jerror.h\".\n */\n\n#include \"jpeglib.h\"\n\n/*\n * <setjmp.h> is used for the optional error recovery mechanism shown in\n * the second part of the example.\n */\n\n#include <setjmp.h>\n\n\n\n/******************** JPEG COMPRESSION SAMPLE INTERFACE *******************/\n\n/* This half of the example shows how to feed data into the JPEG compressor.\n * We present a minimal version that does not worry about refinements such\n * as error recovery (the JPEG code will just exit() if it gets an error).\n */\n\n\n/*\n * IMAGE DATA FORMATS:\n *\n * The standard input image format is a rectangular array of pixels, with\n * each pixel having the same number of \"component\" values (color channels).\n * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars).\n * If you are working with color data, then the color values for each pixel\n * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit\n * RGB color.\n *\n * For this example, we'll assume that this data structure matches the way\n * our application has stored the image in memory, so we can just pass a\n * pointer to our image buffer.  In particular, let's say that the image is\n * RGB color and is described by:\n */\n\nextern JSAMPLE * image_buffer;\t/* Points to large array of R,G,B-order data */\nextern int image_height;\t/* Number of rows in image */\nextern int image_width;\t\t/* Number of columns in image */\n\n\n/*\n * Sample routine for JPEG compression.  We assume that the target file name\n * and a compression quality factor are passed in.\n */\n\nGLOBAL(void)\nwrite_JPEG_file (char * filename, int quality)\n{\n  /* This struct contains the JPEG compression parameters and pointers to\n   * working space (which is allocated as needed by the JPEG library).\n   * It is possible to have several such structures, representing multiple\n   * compression/decompression processes, in existence at once.  We refer\n   * to any one struct (and its associated working data) as a \"JPEG object\".\n   */\n  struct jpeg_compress_struct cinfo;\n  /* This struct represents a JPEG error handler.  It is declared separately\n   * because applications often want to supply a specialized error handler\n   * (see the second half of this file for an example).  But here we just\n   * take the easy way out and use the standard error handler, which will\n   * print a message on stderr and call exit() if compression fails.\n   * Note that this struct must live as long as the main JPEG parameter\n   * struct, to avoid dangling-pointer problems.\n   */\n  struct jpeg_error_mgr jerr;\n  /* More stuff */\n  FILE * outfile;\t\t/* target file */\n  JSAMPROW row_pointer[1];\t/* pointer to JSAMPLE row[s] */\n  int row_stride;\t\t/* physical row width in image buffer */\n\n  /* Step 1: allocate and initialize JPEG compression object */\n\n  /* We have to set up the error handler first, in case the initialization\n   * step fails.  (Unlikely, but it could happen if you are out of memory.)\n   * This routine fills in the contents of struct jerr, and returns jerr's\n   * address which we place into the link field in cinfo.\n   */\n  cinfo.err = jpeg_std_error(&jerr);\n  /* Now we can initialize the JPEG compression object. */\n  jpeg_create_compress(&cinfo);\n\n  /* Step 2: specify data destination (eg, a file) */\n  /* Note: steps 2 and 3 can be done in either order. */\n\n  /* Here we use the library-supplied code to send compressed data to a\n   * stdio stream.  You can also write your own code to do something else.\n   * VERY IMPORTANT: use \"b\" option to fopen() if you are on a machine that\n   * requires it in order to write binary files.\n   */\n  if ((outfile = fopen(filename, \"wb\")) == NULL) {\n    fprintf(stderr, \"can't open %s\\n\", filename);\n    exit(1);\n  }\n  jpeg_stdio_dest(&cinfo, outfile);\n\n  /* Step 3: set parameters for compression */\n\n  /* First we supply a description of the input image.\n   * Four fields of the cinfo struct must be filled in:\n   */\n  cinfo.image_width = image_width; \t/* image width and height, in pixels */\n  cinfo.image_height = image_height;\n  cinfo.input_components = 3;\t\t/* # of color components per pixel */\n  cinfo.in_color_space = JCS_RGB; \t/* colorspace of input image */\n  /* Now use the library's routine to set default compression parameters.\n   * (You must set at least cinfo.in_color_space before calling this,\n   * since the defaults depend on the source color space.)\n   */\n  jpeg_set_defaults(&cinfo);\n  /* Now you can set any non-default parameters you wish to.\n   * Here we just illustrate the use of quality (quantization table) scaling:\n   */\n  jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */);\n\n  /* Step 4: Start compressor */\n\n  /* TRUE ensures that we will write a complete interchange-JPEG file.\n   * Pass TRUE unless you are very sure of what you're doing.\n   */\n  jpeg_start_compress(&cinfo, TRUE);\n\n  /* Step 5: while (scan lines remain to be written) */\n  /*           jpeg_write_scanlines(...); */\n\n  /* Here we use the library's state variable cinfo.next_scanline as the\n   * loop counter, so that we don't have to keep track ourselves.\n   * To keep things simple, we pass one scanline per call; you can pass\n   * more if you wish, though.\n   */\n  row_stride = image_width * 3;\t/* JSAMPLEs per row in image_buffer */\n\n  while (cinfo.next_scanline < cinfo.image_height) {\n    /* jpeg_write_scanlines expects an array of pointers to scanlines.\n     * Here the array is only one element long, but you could pass\n     * more than one scanline at a time if that's more convenient.\n     */\n    row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];\n    (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);\n  }\n\n  /* Step 6: Finish compression */\n\n  jpeg_finish_compress(&cinfo);\n  /* After finish_compress, we can close the output file. */\n  fclose(outfile);\n\n  /* Step 7: release JPEG compression object */\n\n  /* This is an important step since it will release a good deal of memory. */\n  jpeg_destroy_compress(&cinfo);\n\n  /* And we're done! */\n}\n\n\n/*\n * SOME FINE POINTS:\n *\n * In the above loop, we ignored the return value of jpeg_write_scanlines,\n * which is the number of scanlines actually written.  We could get away\n * with this because we were only relying on the value of cinfo.next_scanline,\n * which will be incremented correctly.  If you maintain additional loop\n * variables then you should be careful to increment them properly.\n * Actually, for output to a stdio stream you needn't worry, because\n * then jpeg_write_scanlines will write all the lines passed (or else exit\n * with a fatal error).  Partial writes can only occur if you use a data\n * destination module that can demand suspension of the compressor.\n * (If you don't know what that's for, you don't need it.)\n *\n * If the compressor requires full-image buffers (for entropy-coding\n * optimization or a multi-scan JPEG file), it will create temporary\n * files for anything that doesn't fit within the maximum-memory setting.\n * (Note that temp files are NOT needed if you use the default parameters.)\n * On some systems you may need to set up a signal handler to ensure that\n * temporary files are deleted if the program is interrupted.  See libjpeg.txt.\n *\n * Scanlines MUST be supplied in top-to-bottom order if you want your JPEG\n * files to be compatible with everyone else's.  If you cannot readily read\n * your data in that order, you'll need an intermediate array to hold the\n * image.  See rdtarga.c or rdbmp.c for examples of handling bottom-to-top\n * source data using the JPEG code's internal virtual-array mechanisms.\n */\n\n\n\n/******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/\n\n/* This half of the example shows how to read data from the JPEG decompressor.\n * It's a bit more refined than the above, in that we show:\n *   (a) how to modify the JPEG library's standard error-reporting behavior;\n *   (b) how to allocate workspace using the library's memory manager.\n *\n * Just to make this example a little different from the first one, we'll\n * assume that we do not intend to put the whole image into an in-memory\n * buffer, but to send it line-by-line someplace else.  We need a one-\n * scanline-high JSAMPLE array as a work buffer, and we will let the JPEG\n * memory manager allocate it for us.  This approach is actually quite useful\n * because we don't need to remember to deallocate the buffer separately: it\n * will go away automatically when the JPEG object is cleaned up.\n */\n\n\n/*\n * ERROR HANDLING:\n *\n * The JPEG library's standard error handler (jerror.c) is divided into\n * several \"methods\" which you can override individually.  This lets you\n * adjust the behavior without duplicating a lot of code, which you might\n * have to update with each future release.\n *\n * Our example here shows how to override the \"error_exit\" method so that\n * control is returned to the library's caller when a fatal error occurs,\n * rather than calling exit() as the standard error_exit method does.\n *\n * We use C's setjmp/longjmp facility to return control.  This means that the\n * routine which calls the JPEG library must first execute a setjmp() call to\n * establish the return point.  We want the replacement error_exit to do a\n * longjmp().  But we need to make the setjmp buffer accessible to the\n * error_exit routine.  To do this, we make a private extension of the\n * standard JPEG error handler object.  (If we were using C++, we'd say we\n * were making a subclass of the regular error handler.)\n *\n * Here's the extended error handler struct:\n */\n\nstruct my_error_mgr {\n  struct jpeg_error_mgr pub;\t/* \"public\" fields */\n\n  jmp_buf setjmp_buffer;\t/* for return to caller */\n};\n\ntypedef struct my_error_mgr * my_error_ptr;\n\n/*\n * Here's the routine that will replace the standard error_exit method:\n */\n\nMETHODDEF(void)\nmy_error_exit (j_common_ptr cinfo)\n{\n  /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */\n  my_error_ptr myerr = (my_error_ptr) cinfo->err;\n\n  /* Always display the message. */\n  /* We could postpone this until after returning, if we chose. */\n  (*cinfo->err->output_message) (cinfo);\n\n  /* Return control to the setjmp point */\n  longjmp(myerr->setjmp_buffer, 1);\n}\n\n\n/*\n * Sample routine for JPEG decompression.  We assume that the source file name\n * is passed in.  We want to return 1 on success, 0 on error.\n */\n\n\nGLOBAL(int)\nread_JPEG_file (char * filename)\n{\n  /* This struct contains the JPEG decompression parameters and pointers to\n   * working space (which is allocated as needed by the JPEG library).\n   */\n  struct jpeg_decompress_struct cinfo;\n  /* We use our private extension JPEG error handler.\n   * Note that this struct must live as long as the main JPEG parameter\n   * struct, to avoid dangling-pointer problems.\n   */\n  struct my_error_mgr jerr;\n  /* More stuff */\n  FILE * infile;\t\t/* source file */\n  JSAMPARRAY buffer;\t\t/* Output row buffer */\n  int row_stride;\t\t/* physical row width in output buffer */\n\n  /* In this example we want to open the input file before doing anything else,\n   * so that the setjmp() error recovery below can assume the file is open.\n   * VERY IMPORTANT: use \"b\" option to fopen() if you are on a machine that\n   * requires it in order to read binary files.\n   */\n\n  if ((infile = fopen(filename, \"rb\")) == NULL) {\n    fprintf(stderr, \"can't open %s\\n\", filename);\n    return 0;\n  }\n\n  /* Step 1: allocate and initialize JPEG decompression object */\n\n  /* We set up the normal JPEG error routines, then override error_exit. */\n  cinfo.err = jpeg_std_error(&jerr.pub);\n  jerr.pub.error_exit = my_error_exit;\n  /* Establish the setjmp return context for my_error_exit to use. */\n  if (setjmp(jerr.setjmp_buffer)) {\n    /* If we get here, the JPEG code has signaled an error.\n     * We need to clean up the JPEG object, close the input file, and return.\n     */\n    jpeg_destroy_decompress(&cinfo);\n    fclose(infile);\n    return 0;\n  }\n  /* Now we can initialize the JPEG decompression object. */\n  jpeg_create_decompress(&cinfo);\n\n  /* Step 2: specify data source (eg, a file) */\n\n  jpeg_stdio_src(&cinfo, infile);\n\n  /* Step 3: read file parameters with jpeg_read_header() */\n\n  (void) jpeg_read_header(&cinfo, TRUE);\n  /* We can ignore the return value from jpeg_read_header since\n   *   (a) suspension is not possible with the stdio data source, and\n   *   (b) we passed TRUE to reject a tables-only JPEG file as an error.\n   * See libjpeg.txt for more info.\n   */\n\n  /* Step 4: set parameters for decompression */\n\n  /* In this example, we don't need to change any of the defaults set by\n   * jpeg_read_header(), so we do nothing here.\n   */\n\n  /* Step 5: Start decompressor */\n\n  (void) jpeg_start_decompress(&cinfo);\n  /* We can ignore the return value since suspension is not possible\n   * with the stdio data source.\n   */\n\n  /* We may need to do some setup of our own at this point before reading\n   * the data.  After jpeg_start_decompress() we have the correct scaled\n   * output image dimensions available, as well as the output colormap\n   * if we asked for color quantization.\n   * In this example, we need to make an output work buffer of the right size.\n   */ \n  /* JSAMPLEs per row in output buffer */\n  row_stride = cinfo.output_width * cinfo.output_components;\n  /* Make a one-row-high sample array that will go away when done with image */\n  buffer = (*cinfo.mem->alloc_sarray)\n\t\t((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);\n\n  /* Step 6: while (scan lines remain to be read) */\n  /*           jpeg_read_scanlines(...); */\n\n  /* Here we use the library's state variable cinfo.output_scanline as the\n   * loop counter, so that we don't have to keep track ourselves.\n   */\n  while (cinfo.output_scanline < cinfo.output_height) {\n    /* jpeg_read_scanlines expects an array of pointers to scanlines.\n     * Here the array is only one element long, but you could ask for\n     * more than one scanline at a time if that's more convenient.\n     */\n    (void) jpeg_read_scanlines(&cinfo, buffer, 1);\n    /* Assume put_scanline_someplace wants a pointer and sample count. */\n    put_scanline_someplace(buffer[0], row_stride);\n  }\n\n  /* Step 7: Finish decompression */\n\n  (void) jpeg_finish_decompress(&cinfo);\n  /* We can ignore the return value since suspension is not possible\n   * with the stdio data source.\n   */\n\n  /* Step 8: Release JPEG decompression object */\n\n  /* This is an important step since it will release a good deal of memory. */\n  jpeg_destroy_decompress(&cinfo);\n\n  /* After finish_decompress, we can close the input file.\n   * Here we postpone it until after no more JPEG errors are possible,\n   * so as to simplify the setjmp error logic above.  (Actually, I don't\n   * think that jpeg_destroy can do an error exit, but why assume anything...)\n   */\n  fclose(infile);\n\n  /* At this point you may want to check to see whether any corrupt-data\n   * warnings occurred (test whether jerr.pub.num_warnings is nonzero).\n   */\n\n  /* And we're done! */\n  return 1;\n}\n\n\n/*\n * SOME FINE POINTS:\n *\n * In the above code, we ignored the return value of jpeg_read_scanlines,\n * which is the number of scanlines actually read.  We could get away with\n * this because we asked for only one line at a time and we weren't using\n * a suspending data source.  See libjpeg.txt for more info.\n *\n * We cheated a bit by calling alloc_sarray() after jpeg_start_decompress();\n * we should have done it beforehand to ensure that the space would be\n * counted against the JPEG max_memory setting.  In some systems the above\n * code would risk an out-of-memory error.  However, in general we don't\n * know the output image dimensions before jpeg_start_decompress(), unless we\n * call jpeg_calc_output_dimensions().  See libjpeg.txt for more about this.\n *\n * Scanlines are returned in the same order as they appear in the JPEG file,\n * which is standardly top-to-bottom.  If you must emit data bottom-to-top,\n * you can use one of the virtual arrays provided by the JPEG memory manager\n * to invert the data.  See wrbmp.c for an example.\n *\n * As with compression, some operating modes may require temporary files.\n * On some systems you may need to set up a signal handler to ensure that\n * temporary files are deleted if the program is interrupted.  See libjpeg.txt.\n */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jaricom.c",
    "content": "/*\n * jaricom.c\n *\n * Developed 1997-2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains probability estimation tables for common use in\n * arithmetic entropy encoding and decoding routines.\n *\n * This data represents Table D.3 in the JPEG spec (D.2 in the draft),\n * ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81, and Table 24\n * in the JBIG spec, ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n/* The following #define specifies the packing of the four components\n * into the compact INT32 representation.\n * Note that this formula must match the actual arithmetic encoder\n * and decoder implementation.  The implementation has to be changed\n * if this formula is changed.\n * The current organization is leaned on Markus Kuhn's JBIG\n * implementation (jbig_tab.c).\n */\n\n#define V(i,a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b)\n\nconst INT32 jpeg_aritab[113+1] = {\n/*\n * Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS\n */\n  V(   0, 0x5a1d,   1,   1, 1 ),\n  V(   1, 0x2586,  14,   2, 0 ),\n  V(   2, 0x1114,  16,   3, 0 ),\n  V(   3, 0x080b,  18,   4, 0 ),\n  V(   4, 0x03d8,  20,   5, 0 ),\n  V(   5, 0x01da,  23,   6, 0 ),\n  V(   6, 0x00e5,  25,   7, 0 ),\n  V(   7, 0x006f,  28,   8, 0 ),\n  V(   8, 0x0036,  30,   9, 0 ),\n  V(   9, 0x001a,  33,  10, 0 ),\n  V(  10, 0x000d,  35,  11, 0 ),\n  V(  11, 0x0006,   9,  12, 0 ),\n  V(  12, 0x0003,  10,  13, 0 ),\n  V(  13, 0x0001,  12,  13, 0 ),\n  V(  14, 0x5a7f,  15,  15, 1 ),\n  V(  15, 0x3f25,  36,  16, 0 ),\n  V(  16, 0x2cf2,  38,  17, 0 ),\n  V(  17, 0x207c,  39,  18, 0 ),\n  V(  18, 0x17b9,  40,  19, 0 ),\n  V(  19, 0x1182,  42,  20, 0 ),\n  V(  20, 0x0cef,  43,  21, 0 ),\n  V(  21, 0x09a1,  45,  22, 0 ),\n  V(  22, 0x072f,  46,  23, 0 ),\n  V(  23, 0x055c,  48,  24, 0 ),\n  V(  24, 0x0406,  49,  25, 0 ),\n  V(  25, 0x0303,  51,  26, 0 ),\n  V(  26, 0x0240,  52,  27, 0 ),\n  V(  27, 0x01b1,  54,  28, 0 ),\n  V(  28, 0x0144,  56,  29, 0 ),\n  V(  29, 0x00f5,  57,  30, 0 ),\n  V(  30, 0x00b7,  59,  31, 0 ),\n  V(  31, 0x008a,  60,  32, 0 ),\n  V(  32, 0x0068,  62,  33, 0 ),\n  V(  33, 0x004e,  63,  34, 0 ),\n  V(  34, 0x003b,  32,  35, 0 ),\n  V(  35, 0x002c,  33,   9, 0 ),\n  V(  36, 0x5ae1,  37,  37, 1 ),\n  V(  37, 0x484c,  64,  38, 0 ),\n  V(  38, 0x3a0d,  65,  39, 0 ),\n  V(  39, 0x2ef1,  67,  40, 0 ),\n  V(  40, 0x261f,  68,  41, 0 ),\n  V(  41, 0x1f33,  69,  42, 0 ),\n  V(  42, 0x19a8,  70,  43, 0 ),\n  V(  43, 0x1518,  72,  44, 0 ),\n  V(  44, 0x1177,  73,  45, 0 ),\n  V(  45, 0x0e74,  74,  46, 0 ),\n  V(  46, 0x0bfb,  75,  47, 0 ),\n  V(  47, 0x09f8,  77,  48, 0 ),\n  V(  48, 0x0861,  78,  49, 0 ),\n  V(  49, 0x0706,  79,  50, 0 ),\n  V(  50, 0x05cd,  48,  51, 0 ),\n  V(  51, 0x04de,  50,  52, 0 ),\n  V(  52, 0x040f,  50,  53, 0 ),\n  V(  53, 0x0363,  51,  54, 0 ),\n  V(  54, 0x02d4,  52,  55, 0 ),\n  V(  55, 0x025c,  53,  56, 0 ),\n  V(  56, 0x01f8,  54,  57, 0 ),\n  V(  57, 0x01a4,  55,  58, 0 ),\n  V(  58, 0x0160,  56,  59, 0 ),\n  V(  59, 0x0125,  57,  60, 0 ),\n  V(  60, 0x00f6,  58,  61, 0 ),\n  V(  61, 0x00cb,  59,  62, 0 ),\n  V(  62, 0x00ab,  61,  63, 0 ),\n  V(  63, 0x008f,  61,  32, 0 ),\n  V(  64, 0x5b12,  65,  65, 1 ),\n  V(  65, 0x4d04,  80,  66, 0 ),\n  V(  66, 0x412c,  81,  67, 0 ),\n  V(  67, 0x37d8,  82,  68, 0 ),\n  V(  68, 0x2fe8,  83,  69, 0 ),\n  V(  69, 0x293c,  84,  70, 0 ),\n  V(  70, 0x2379,  86,  71, 0 ),\n  V(  71, 0x1edf,  87,  72, 0 ),\n  V(  72, 0x1aa9,  87,  73, 0 ),\n  V(  73, 0x174e,  72,  74, 0 ),\n  V(  74, 0x1424,  72,  75, 0 ),\n  V(  75, 0x119c,  74,  76, 0 ),\n  V(  76, 0x0f6b,  74,  77, 0 ),\n  V(  77, 0x0d51,  75,  78, 0 ),\n  V(  78, 0x0bb6,  77,  79, 0 ),\n  V(  79, 0x0a40,  77,  48, 0 ),\n  V(  80, 0x5832,  80,  81, 1 ),\n  V(  81, 0x4d1c,  88,  82, 0 ),\n  V(  82, 0x438e,  89,  83, 0 ),\n  V(  83, 0x3bdd,  90,  84, 0 ),\n  V(  84, 0x34ee,  91,  85, 0 ),\n  V(  85, 0x2eae,  92,  86, 0 ),\n  V(  86, 0x299a,  93,  87, 0 ),\n  V(  87, 0x2516,  86,  71, 0 ),\n  V(  88, 0x5570,  88,  89, 1 ),\n  V(  89, 0x4ca9,  95,  90, 0 ),\n  V(  90, 0x44d9,  96,  91, 0 ),\n  V(  91, 0x3e22,  97,  92, 0 ),\n  V(  92, 0x3824,  99,  93, 0 ),\n  V(  93, 0x32b4,  99,  94, 0 ),\n  V(  94, 0x2e17,  93,  86, 0 ),\n  V(  95, 0x56a8,  95,  96, 1 ),\n  V(  96, 0x4f46, 101,  97, 0 ),\n  V(  97, 0x47e5, 102,  98, 0 ),\n  V(  98, 0x41cf, 103,  99, 0 ),\n  V(  99, 0x3c3d, 104, 100, 0 ),\n  V( 100, 0x375e,  99,  93, 0 ),\n  V( 101, 0x5231, 105, 102, 0 ),\n  V( 102, 0x4c0f, 106, 103, 0 ),\n  V( 103, 0x4639, 107, 104, 0 ),\n  V( 104, 0x415e, 103,  99, 0 ),\n  V( 105, 0x5627, 105, 106, 1 ),\n  V( 106, 0x50e7, 108, 107, 0 ),\n  V( 107, 0x4b85, 109, 103, 0 ),\n  V( 108, 0x5597, 110, 109, 0 ),\n  V( 109, 0x504f, 111, 107, 0 ),\n  V( 110, 0x5a10, 110, 111, 1 ),\n  V( 111, 0x5522, 112, 109, 0 ),\n  V( 112, 0x59eb, 112, 111, 1 ),\n/*\n * This last entry is used for fixed probability estimate of 0.5\n * as suggested in Section 10.3 Table 5 of ITU-T Rec. T.851.\n */\n  V( 113, 0x5a1d, 113, 113, 0 )\n};\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcapimin.c",
    "content": "/*\n * jcapimin.c\n *\n * Copyright (C) 1994-1998, Thomas G. Lane.\n * Modified 2003-2010 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface code for the compression half\n * of the JPEG library.  These are the \"minimum\" API routines that may be\n * needed in either the normal full-compression case or the transcoding-only\n * case.\n *\n * Most of the routines intended to be called directly by an application\n * are in this file or in jcapistd.c.  But also see jcparam.c for\n * parameter-setup helper routines, jcomapi.c for routines shared by\n * compression and decompression, and jctrans.c for the transcoding case.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Initialization of a JPEG compression object.\n * The error manager must already be set up (in case memory manager fails).\n */\n\nGLOBAL(void)\njpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)\n{\n  int i;\n\n  /* Guard against version mismatches between library and caller. */\n  cinfo->mem = NULL;\t\t/* so jpeg_destroy knows mem mgr not called */\n  if (version != JPEG_LIB_VERSION)\n    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);\n  if (structsize != SIZEOF(struct jpeg_compress_struct))\n    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, \n\t     (int) SIZEOF(struct jpeg_compress_struct), (int) structsize);\n\n  /* For debugging purposes, we zero the whole master structure.\n   * But the application has already set the err pointer, and may have set\n   * client_data, so we have to save and restore those fields.\n   * Note: if application hasn't set client_data, tools like Purify may\n   * complain here.\n   */\n  {\n    struct jpeg_error_mgr * err = cinfo->err;\n    void * client_data = cinfo->client_data; /* ignore Purify complaint here */\n    MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));\n    cinfo->err = err;\n    cinfo->client_data = client_data;\n  }\n  cinfo->is_decompressor = FALSE;\n\n  /* Initialize a memory manager instance for this object */\n  jinit_memory_mgr((j_common_ptr) cinfo);\n\n  /* Zero out pointers to permanent structures. */\n  cinfo->progress = NULL;\n  cinfo->dest = NULL;\n\n  cinfo->comp_info = NULL;\n\n  for (i = 0; i < NUM_QUANT_TBLS; i++) {\n    cinfo->quant_tbl_ptrs[i] = NULL;\n    cinfo->q_scale_factor[i] = 100;\n  }\n\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    cinfo->dc_huff_tbl_ptrs[i] = NULL;\n    cinfo->ac_huff_tbl_ptrs[i] = NULL;\n  }\n\n  /* Must do it here for emit_dqt in case jpeg_write_tables is used */\n  cinfo->block_size = DCTSIZE;\n  cinfo->natural_order = jpeg_natural_order;\n  cinfo->lim_Se = DCTSIZE2-1;\n\n  cinfo->script_space = NULL;\n\n  cinfo->input_gamma = 1.0;\t/* in case application forgets */\n\n  /* OK, I'm ready */\n  cinfo->global_state = CSTATE_START;\n}\n\n\n/*\n * Destruction of a JPEG compression object\n */\n\nGLOBAL(void)\njpeg_destroy_compress (j_compress_ptr cinfo)\n{\n  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */\n}\n\n\n/*\n * Abort processing of a JPEG compression operation,\n * but don't destroy the object itself.\n */\n\nGLOBAL(void)\njpeg_abort_compress (j_compress_ptr cinfo)\n{\n  jpeg_abort((j_common_ptr) cinfo); /* use common routine */\n}\n\n\n/*\n * Forcibly suppress or un-suppress all quantization and Huffman tables.\n * Marks all currently defined tables as already written (if suppress)\n * or not written (if !suppress).  This will control whether they get emitted\n * by a subsequent jpeg_start_compress call.\n *\n * This routine is exported for use by applications that want to produce\n * abbreviated JPEG datastreams.  It logically belongs in jcparam.c, but\n * since it is called by jpeg_start_compress, we put it here --- otherwise\n * jcparam.o would be linked whether the application used it or not.\n */\n\nGLOBAL(void)\njpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)\n{\n  int i;\n  JQUANT_TBL * qtbl;\n  JHUFF_TBL * htbl;\n\n  for (i = 0; i < NUM_QUANT_TBLS; i++) {\n    if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)\n      qtbl->sent_table = suppress;\n  }\n\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)\n      htbl->sent_table = suppress;\n    if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)\n      htbl->sent_table = suppress;\n  }\n}\n\n\n/*\n * Finish JPEG compression.\n *\n * If a multipass operating mode was selected, this may do a great deal of\n * work including most of the actual output.\n */\n\nGLOBAL(void)\njpeg_finish_compress (j_compress_ptr cinfo)\n{\n  JDIMENSION iMCU_row;\n\n  if (cinfo->global_state == CSTATE_SCANNING ||\n      cinfo->global_state == CSTATE_RAW_OK) {\n    /* Terminate first pass */\n    if (cinfo->next_scanline < cinfo->image_height)\n      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);\n    (*cinfo->master->finish_pass) (cinfo);\n  } else if (cinfo->global_state != CSTATE_WRCOEFS)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  /* Perform any remaining passes */\n  while (! cinfo->master->is_last_pass) {\n    (*cinfo->master->prepare_for_pass) (cinfo);\n    for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {\n      if (cinfo->progress != NULL) {\n\tcinfo->progress->pass_counter = (long) iMCU_row;\n\tcinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;\n\t(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n      }\n      /* We bypass the main controller and invoke coef controller directly;\n       * all work is being done from the coefficient buffer.\n       */\n      if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL))\n\tERREXIT(cinfo, JERR_CANT_SUSPEND);\n    }\n    (*cinfo->master->finish_pass) (cinfo);\n  }\n  /* Write EOI, do final cleanup */\n  (*cinfo->marker->write_file_trailer) (cinfo);\n  (*cinfo->dest->term_destination) (cinfo);\n  /* We can use jpeg_abort to release memory and reset global_state */\n  jpeg_abort((j_common_ptr) cinfo);\n}\n\n\n/*\n * Write a special marker.\n * This is only recommended for writing COM or APPn markers.\n * Must be called after jpeg_start_compress() and before\n * first call to jpeg_write_scanlines() or jpeg_write_raw_data().\n */\n\nGLOBAL(void)\njpeg_write_marker (j_compress_ptr cinfo, int marker,\n\t\t   const JOCTET *dataptr, unsigned int datalen)\n{\n  JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val));\n\n  if (cinfo->next_scanline != 0 ||\n      (cinfo->global_state != CSTATE_SCANNING &&\n       cinfo->global_state != CSTATE_RAW_OK &&\n       cinfo->global_state != CSTATE_WRCOEFS))\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);\n  write_marker_byte = cinfo->marker->write_marker_byte;\t/* copy for speed */\n  while (datalen--) {\n    (*write_marker_byte) (cinfo, *dataptr);\n    dataptr++;\n  }\n}\n\n/* Same, but piecemeal. */\n\nGLOBAL(void)\njpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen)\n{\n  if (cinfo->next_scanline != 0 ||\n      (cinfo->global_state != CSTATE_SCANNING &&\n       cinfo->global_state != CSTATE_RAW_OK &&\n       cinfo->global_state != CSTATE_WRCOEFS))\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);\n}\n\nGLOBAL(void)\njpeg_write_m_byte (j_compress_ptr cinfo, int val)\n{\n  (*cinfo->marker->write_marker_byte) (cinfo, val);\n}\n\n\n/*\n * Alternate compression function: just write an abbreviated table file.\n * Before calling this, all parameters and a data destination must be set up.\n *\n * To produce a pair of files containing abbreviated tables and abbreviated\n * image data, one would proceed as follows:\n *\n *\t\tinitialize JPEG object\n *\t\tset JPEG parameters\n *\t\tset destination to table file\n *\t\tjpeg_write_tables(cinfo);\n *\t\tset destination to image file\n *\t\tjpeg_start_compress(cinfo, FALSE);\n *\t\twrite data...\n *\t\tjpeg_finish_compress(cinfo);\n *\n * jpeg_write_tables has the side effect of marking all tables written\n * (same as jpeg_suppress_tables(..., TRUE)).  Thus a subsequent start_compress\n * will not re-emit the tables unless it is passed write_all_tables=TRUE.\n */\n\nGLOBAL(void)\njpeg_write_tables (j_compress_ptr cinfo)\n{\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  /* (Re)initialize error mgr and destination modules */\n  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);\n  (*cinfo->dest->init_destination) (cinfo);\n  /* Initialize the marker writer ... bit of a crock to do it here. */\n  jinit_marker_writer(cinfo);\n  /* Write them tables! */\n  (*cinfo->marker->write_tables_only) (cinfo);\n  /* And clean up. */\n  (*cinfo->dest->term_destination) (cinfo);\n  /*\n   * In library releases up through v6a, we called jpeg_abort() here to free\n   * any working memory allocated by the destination manager and marker\n   * writer.  Some applications had a problem with that: they allocated space\n   * of their own from the library memory manager, and didn't want it to go\n   * away during write_tables.  So now we do nothing.  This will cause a\n   * memory leak if an app calls write_tables repeatedly without doing a full\n   * compression cycle or otherwise resetting the JPEG object.  However, that\n   * seems less bad than unexpectedly freeing memory in the normal case.\n   * An app that prefers the old behavior can call jpeg_abort for itself after\n   * each call to jpeg_write_tables().\n   */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcapistd.c",
    "content": "/*\n * jcapistd.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface code for the compression half\n * of the JPEG library.  These are the \"standard\" API routines that are\n * used in the normal full-compression case.  They are not used by a\n * transcoding-only application.  Note that if an application links in\n * jpeg_start_compress, it will end up linking in the entire compressor.\n * We thus must separate this file from jcapimin.c to avoid linking the\n * whole compression library into a transcoder.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Compression initialization.\n * Before calling this, all parameters and a data destination must be set up.\n *\n * We require a write_all_tables parameter as a failsafe check when writing\n * multiple datastreams from the same compression object.  Since prior runs\n * will have left all the tables marked sent_table=TRUE, a subsequent run\n * would emit an abbreviated stream (no tables) by default.  This may be what\n * is wanted, but for safety's sake it should not be the default behavior:\n * programmers should have to make a deliberate choice to emit abbreviated\n * images.  Therefore the documentation and examples should encourage people\n * to pass write_all_tables=TRUE; then it will take active thought to do the\n * wrong thing.\n */\n\nGLOBAL(void)\njpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)\n{\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  if (write_all_tables)\n    jpeg_suppress_tables(cinfo, FALSE);\t/* mark all tables to be written */\n\n  /* (Re)initialize error mgr and destination modules */\n  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);\n  (*cinfo->dest->init_destination) (cinfo);\n  /* Perform master selection of active modules */\n  jinit_compress_master(cinfo);\n  /* Set up for the first pass */\n  (*cinfo->master->prepare_for_pass) (cinfo);\n  /* Ready for application to drive first pass through jpeg_write_scanlines\n   * or jpeg_write_raw_data.\n   */\n  cinfo->next_scanline = 0;\n  cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);\n}\n\n\n/*\n * Write some scanlines of data to the JPEG compressor.\n *\n * The return value will be the number of lines actually written.\n * This should be less than the supplied num_lines only in case that\n * the data destination module has requested suspension of the compressor,\n * or if more than image_height scanlines are passed in.\n *\n * Note: we warn about excess calls to jpeg_write_scanlines() since\n * this likely signals an application programmer error.  However,\n * excess scanlines passed in the last valid call are *silently* ignored,\n * so that the application need not adjust num_lines for end-of-image\n * when using a multiple-scanline buffer.\n */\n\nGLOBAL(JDIMENSION)\njpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,\n\t\t      JDIMENSION num_lines)\n{\n  JDIMENSION row_ctr, rows_left;\n\n  if (cinfo->global_state != CSTATE_SCANNING)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  if (cinfo->next_scanline >= cinfo->image_height)\n    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);\n\n  /* Call progress monitor hook if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->pass_counter = (long) cinfo->next_scanline;\n    cinfo->progress->pass_limit = (long) cinfo->image_height;\n    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n  }\n\n  /* Give master control module another chance if this is first call to\n   * jpeg_write_scanlines.  This lets output of the frame/scan headers be\n   * delayed so that application can write COM, etc, markers between\n   * jpeg_start_compress and jpeg_write_scanlines.\n   */\n  if (cinfo->master->call_pass_startup)\n    (*cinfo->master->pass_startup) (cinfo);\n\n  /* Ignore any extra scanlines at bottom of image. */\n  rows_left = cinfo->image_height - cinfo->next_scanline;\n  if (num_lines > rows_left)\n    num_lines = rows_left;\n\n  row_ctr = 0;\n  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);\n  cinfo->next_scanline += row_ctr;\n  return row_ctr;\n}\n\n\n/*\n * Alternate entry point to write raw data.\n * Processes exactly one iMCU row per call, unless suspended.\n */\n\nGLOBAL(JDIMENSION)\njpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,\n\t\t     JDIMENSION num_lines)\n{\n  JDIMENSION lines_per_iMCU_row;\n\n  if (cinfo->global_state != CSTATE_RAW_OK)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  if (cinfo->next_scanline >= cinfo->image_height) {\n    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);\n    return 0;\n  }\n\n  /* Call progress monitor hook if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->pass_counter = (long) cinfo->next_scanline;\n    cinfo->progress->pass_limit = (long) cinfo->image_height;\n    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n  }\n\n  /* Give master control module another chance if this is first call to\n   * jpeg_write_raw_data.  This lets output of the frame/scan headers be\n   * delayed so that application can write COM, etc, markers between\n   * jpeg_start_compress and jpeg_write_raw_data.\n   */\n  if (cinfo->master->call_pass_startup)\n    (*cinfo->master->pass_startup) (cinfo);\n\n  /* Verify that at least one iMCU row has been passed. */\n  lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;\n  if (num_lines < lines_per_iMCU_row)\n    ERREXIT(cinfo, JERR_BUFFER_SIZE);\n\n  /* Directly compress the row. */\n  if (! (*cinfo->coef->compress_data) (cinfo, data)) {\n    /* If compressor did not consume the whole row, suspend processing. */\n    return 0;\n  }\n\n  /* OK, we processed one iMCU row. */\n  cinfo->next_scanline += lines_per_iMCU_row;\n  return lines_per_iMCU_row;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcarith.c",
    "content": "/*\n * jcarith.c\n *\n * Developed 1997-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains portable arithmetic entropy encoding routines for JPEG\n * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).\n *\n * Both sequential and progressive modes are supported in this single module.\n *\n * Suspension is not currently supported in this module.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Expanded entropy encoder object for arithmetic encoding. */\n\ntypedef struct {\n  struct jpeg_entropy_encoder pub; /* public fields */\n\n  INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */\n  INT32 a;               /* A register, normalized size of coding interval */\n  INT32 sc;        /* counter for stacked 0xFF values which might overflow */\n  INT32 zc;          /* counter for pending 0x00 output values which might *\n                          * be discarded at the end (\"Pacman\" termination) */\n  int ct;  /* bit shift counter, determines when next byte will be written */\n  int buffer;                /* buffer for most recent output byte != 0xFF */\n\n  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */\n  int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */\n\n  unsigned int restarts_to_go;\t/* MCUs left in this restart interval */\n  int next_restart_num;\t\t/* next restart number to write (0-7) */\n\n  /* Pointers to statistics areas (these workspaces have image lifespan) */\n  unsigned char * dc_stats[NUM_ARITH_TBLS];\n  unsigned char * ac_stats[NUM_ARITH_TBLS];\n\n  /* Statistics bin for coding with fixed probability 0.5 */\n  unsigned char fixed_bin[4];\n} arith_entropy_encoder;\n\ntypedef arith_entropy_encoder * arith_entropy_ptr;\n\n/* The following two definitions specify the allocation chunk size\n * for the statistics area.\n * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least\n * 49 statistics bins for DC, and 245 statistics bins for AC coding.\n *\n * We use a compact representation with 1 byte per statistics bin,\n * thus the numbers directly represent byte sizes.\n * This 1 byte per statistics bin contains the meaning of the MPS\n * (more probable symbol) in the highest bit (mask 0x80), and the\n * index into the probability estimation state machine table\n * in the lower bits (mask 0x7F).\n */\n\n#define DC_STAT_BINS 64\n#define AC_STAT_BINS 256\n\n/* NOTE: Uncomment the following #define if you want to use the\n * given formula for calculating the AC conditioning parameter Kx\n * for spectral selection progressive coding in section G.1.3.2\n * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4).\n * Although the spec and P&M authors claim that this \"has proven\n * to give good results for 8 bit precision samples\", I'm not\n * convinced yet that this is really beneficial.\n * Early tests gave only very marginal compression enhancements\n * (a few - around 5 or so - bytes even for very large files),\n * which would turn out rather negative if we'd suppress the\n * DAC (Define Arithmetic Conditioning) marker segments for\n * the default parameters in the future.\n * Note that currently the marker writing module emits 12-byte\n * DAC segments for a full-component scan in a color image.\n * This is not worth worrying about IMHO. However, since the\n * spec defines the default values to be used if the tables\n * are omitted (unlike Huffman tables, which are required\n * anyway), one might optimize this behaviour in the future,\n * and then it would be disadvantageous to use custom tables if\n * they don't provide sufficient gain to exceed the DAC size.\n *\n * On the other hand, I'd consider it as a reasonable result\n * that the conditioning has no significant influence on the\n * compression performance. This means that the basic\n * statistical model is already rather stable.\n *\n * Thus, at the moment, we use the default conditioning values\n * anyway, and do not use the custom formula.\n *\n#define CALCULATE_SPECTRAL_CONDITIONING\n */\n\n/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.\n * We assume that int right shift is unsigned if INT32 right shift is,\n * which should be safe.\n */\n\n#ifdef RIGHT_SHIFT_IS_UNSIGNED\n#define ISHIFT_TEMPS\tint ishift_temp;\n#define IRIGHT_SHIFT(x,shft)  \\\n\t((ishift_temp = (x)) < 0 ? \\\n\t (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \\\n\t (ishift_temp >> (shft)))\n#else\n#define ISHIFT_TEMPS\n#define IRIGHT_SHIFT(x,shft)\t((x) >> (shft))\n#endif\n\n\nLOCAL(void)\nemit_byte (int val, j_compress_ptr cinfo)\n/* Write next output byte; we do not support suspension in this module. */\n{\n  struct jpeg_destination_mgr * dest = cinfo->dest;\n\n  *dest->next_output_byte++ = (JOCTET) val;\n  if (--dest->free_in_buffer == 0)\n    if (! (*dest->empty_output_buffer) (cinfo))\n      ERREXIT(cinfo, JERR_CANT_SUSPEND);\n}\n\n\n/*\n * Finish up at the end of an arithmetic-compressed scan.\n */\n\nMETHODDEF(void)\nfinish_pass (j_compress_ptr cinfo)\n{\n  arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;\n  INT32 temp;\n\n  /* Section D.1.8: Termination of encoding */\n\n  /* Find the e->c in the coding interval with the largest\n   * number of trailing zero bits */\n  if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c)\n    e->c = temp + 0x8000L;\n  else\n    e->c = temp;\n  /* Send remaining bytes to output */\n  e->c <<= e->ct;\n  if (e->c & 0xF8000000L) {\n    /* One final overflow has to be handled */\n    if (e->buffer >= 0) {\n      if (e->zc)\n\tdo emit_byte(0x00, cinfo);\n\twhile (--e->zc);\n      emit_byte(e->buffer + 1, cinfo);\n      if (e->buffer + 1 == 0xFF)\n\temit_byte(0x00, cinfo);\n    }\n    e->zc += e->sc;  /* carry-over converts stacked 0xFF bytes to 0x00 */\n    e->sc = 0;\n  } else {\n    if (e->buffer == 0)\n      ++e->zc;\n    else if (e->buffer >= 0) {\n      if (e->zc)\n\tdo emit_byte(0x00, cinfo);\n\twhile (--e->zc);\n      emit_byte(e->buffer, cinfo);\n    }\n    if (e->sc) {\n      if (e->zc)\n\tdo emit_byte(0x00, cinfo);\n\twhile (--e->zc);\n      do {\n\temit_byte(0xFF, cinfo);\n\temit_byte(0x00, cinfo);\n      } while (--e->sc);\n    }\n  }\n  /* Output final bytes only if they are not 0x00 */\n  if (e->c & 0x7FFF800L) {\n    if (e->zc)  /* output final pending zero bytes */\n      do emit_byte(0x00, cinfo);\n      while (--e->zc);\n    emit_byte((e->c >> 19) & 0xFF, cinfo);\n    if (((e->c >> 19) & 0xFF) == 0xFF)\n      emit_byte(0x00, cinfo);\n    if (e->c & 0x7F800L) {\n      emit_byte((e->c >> 11) & 0xFF, cinfo);\n      if (((e->c >> 11) & 0xFF) == 0xFF)\n\temit_byte(0x00, cinfo);\n    }\n  }\n}\n\n\n/*\n * The core arithmetic encoding routine (common in JPEG and JBIG).\n * This needs to go as fast as possible.\n * Machine-dependent optimization facilities\n * are not utilized in this portable implementation.\n * However, this code should be fairly efficient and\n * may be a good base for further optimizations anyway.\n *\n * Parameter 'val' to be encoded may be 0 or 1 (binary decision).\n *\n * Note: I've added full \"Pacman\" termination support to the\n * byte output routines, which is equivalent to the optional\n * Discard_final_zeros procedure (Figure D.15) in the spec.\n * Thus, we always produce the shortest possible output\n * stream compliant to the spec (no trailing zero bytes,\n * except for FF stuffing).\n *\n * I've also introduced a new scheme for accessing\n * the probability estimation state machine table,\n * derived from Markus Kuhn's JBIG implementation.\n */\n\nLOCAL(void)\narith_encode (j_compress_ptr cinfo, unsigned char *st, int val) \n{\n  register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;\n  register unsigned char nl, nm;\n  register INT32 qe, temp;\n  register int sv;\n\n  /* Fetch values from our compact representation of Table D.3(D.2):\n   * Qe values and probability estimation state machine\n   */\n  sv = *st;\n  qe = jpeg_aritab[sv & 0x7F];\t/* => Qe_Value */\n  nl = qe & 0xFF; qe >>= 8;\t/* Next_Index_LPS + Switch_MPS */\n  nm = qe & 0xFF; qe >>= 8;\t/* Next_Index_MPS */\n\n  /* Encode & estimation procedures per sections D.1.4 & D.1.5 */\n  e->a -= qe;\n  if (val != (sv >> 7)) {\n    /* Encode the less probable symbol */\n    if (e->a >= qe) {\n      /* If the interval size (qe) for the less probable symbol (LPS)\n       * is larger than the interval size for the MPS, then exchange\n       * the two symbols for coding efficiency, otherwise code the LPS\n       * as usual: */\n      e->c += e->a;\n      e->a = qe;\n    }\n    *st = (sv & 0x80) ^ nl;\t/* Estimate_after_LPS */\n  } else {\n    /* Encode the more probable symbol */\n    if (e->a >= 0x8000L)\n      return;  /* A >= 0x8000 -> ready, no renormalization required */\n    if (e->a < qe) {\n      /* If the interval size (qe) for the less probable symbol (LPS)\n       * is larger than the interval size for the MPS, then exchange\n       * the two symbols for coding efficiency: */\n      e->c += e->a;\n      e->a = qe;\n    }\n    *st = (sv & 0x80) ^ nm;\t/* Estimate_after_MPS */\n  }\n\n  /* Renormalization & data output per section D.1.6 */\n  do {\n    e->a <<= 1;\n    e->c <<= 1;\n    if (--e->ct == 0) {\n      /* Another byte is ready for output */\n      temp = e->c >> 19;\n      if (temp > 0xFF) {\n\t/* Handle overflow over all stacked 0xFF bytes */\n\tif (e->buffer >= 0) {\n\t  if (e->zc)\n\t    do emit_byte(0x00, cinfo);\n\t    while (--e->zc);\n\t  emit_byte(e->buffer + 1, cinfo);\n\t  if (e->buffer + 1 == 0xFF)\n\t    emit_byte(0x00, cinfo);\n\t}\n\te->zc += e->sc;  /* carry-over converts stacked 0xFF bytes to 0x00 */\n\te->sc = 0;\n\t/* Note: The 3 spacer bits in the C register guarantee\n\t * that the new buffer byte can't be 0xFF here\n\t * (see page 160 in the P&M JPEG book). */\n\te->buffer = temp & 0xFF;  /* new output byte, might overflow later */\n      } else if (temp == 0xFF) {\n\t++e->sc;  /* stack 0xFF byte (which might overflow later) */\n      } else {\n\t/* Output all stacked 0xFF bytes, they will not overflow any more */\n\tif (e->buffer == 0)\n\t  ++e->zc;\n\telse if (e->buffer >= 0) {\n\t  if (e->zc)\n\t    do emit_byte(0x00, cinfo);\n\t    while (--e->zc);\n\t  emit_byte(e->buffer, cinfo);\n\t}\n\tif (e->sc) {\n\t  if (e->zc)\n\t    do emit_byte(0x00, cinfo);\n\t    while (--e->zc);\n\t  do {\n\t    emit_byte(0xFF, cinfo);\n\t    emit_byte(0x00, cinfo);\n\t  } while (--e->sc);\n\t}\n\te->buffer = temp & 0xFF;  /* new output byte (can still overflow) */\n      }\n      e->c &= 0x7FFFFL;\n      e->ct += 8;\n    }\n  } while (e->a < 0x8000L);\n}\n\n\n/*\n * Emit a restart marker & resynchronize predictions.\n */\n\nLOCAL(void)\nemit_restart (j_compress_ptr cinfo, int restart_num)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  int ci;\n  jpeg_component_info * compptr;\n\n  finish_pass(cinfo);\n\n  emit_byte(0xFF, cinfo);\n  emit_byte(JPEG_RST0 + restart_num, cinfo);\n\n  /* Re-initialize statistics areas */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    /* DC needs no table for refinement scan */\n    if (cinfo->Ss == 0 && cinfo->Ah == 0) {\n      MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);\n      /* Reset DC predictions to 0 */\n      entropy->last_dc_val[ci] = 0;\n      entropy->dc_context[ci] = 0;\n    }\n    /* AC needs no table when not present */\n    if (cinfo->Se) {\n      MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);\n    }\n  }\n\n  /* Reset arithmetic encoding variables */\n  entropy->c = 0;\n  entropy->a = 0x10000L;\n  entropy->sc = 0;\n  entropy->zc = 0;\n  entropy->ct = 11;\n  entropy->buffer = -1;  /* empty */\n}\n\n\n/*\n * MCU encoding for DC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\nencode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  JBLOCKROW block;\n  unsigned char *st;\n  int blkn, ci, tbl;\n  int v, v2, m;\n  ISHIFT_TEMPS\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      emit_restart(cinfo, entropy->next_restart_num);\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  /* Encode the MCU data blocks */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n    ci = cinfo->MCU_membership[blkn];\n    tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;\n\n    /* Compute the DC value after the required point transform by Al.\n     * This is simply an arithmetic right shift.\n     */\n    m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al);\n\n    /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */\n\n    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */\n    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];\n\n    /* Figure F.4: Encode_DC_DIFF */\n    if ((v = m - entropy->last_dc_val[ci]) == 0) {\n      arith_encode(cinfo, st, 0);\n      entropy->dc_context[ci] = 0;\t/* zero diff category */\n    } else {\n      entropy->last_dc_val[ci] = m;\n      arith_encode(cinfo, st, 1);\n      /* Figure F.6: Encoding nonzero value v */\n      /* Figure F.7: Encoding the sign of v */\n      if (v > 0) {\n\tarith_encode(cinfo, st + 1, 0);\t/* Table F.4: SS = S0 + 1 */\n\tst += 2;\t\t\t/* Table F.4: SP = S0 + 2 */\n\tentropy->dc_context[ci] = 4;\t/* small positive diff category */\n      } else {\n\tv = -v;\n\tarith_encode(cinfo, st + 1, 1);\t/* Table F.4: SS = S0 + 1 */\n\tst += 3;\t\t\t/* Table F.4: SN = S0 + 3 */\n\tentropy->dc_context[ci] = 8;\t/* small negative diff category */\n      }\n      /* Figure F.8: Encoding the magnitude category of v */\n      m = 0;\n      if (v -= 1) {\n\tarith_encode(cinfo, st, 1);\n\tm = 1;\n\tv2 = v;\n\tst = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */\n\twhile (v2 >>= 1) {\n\t  arith_encode(cinfo, st, 1);\n\t  m <<= 1;\n\t  st += 1;\n\t}\n      }\n      arith_encode(cinfo, st, 0);\n      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */\n      if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))\n\tentropy->dc_context[ci] = 0;\t/* zero diff category */\n      else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))\n\tentropy->dc_context[ci] += 8;\t/* large diff category */\n      /* Figure F.9: Encoding the magnitude bit pattern of v */\n      st += 14;\n      while (m >>= 1)\n\tarith_encode(cinfo, st, (m & v) ? 1 : 0);\n    }\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU encoding for AC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\nencode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  JBLOCKROW block;\n  unsigned char *st;\n  int tbl, k, ke;\n  int v, v2, m;\n  const int * natural_order;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      emit_restart(cinfo, entropy->next_restart_num);\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  natural_order = cinfo->natural_order;\n\n  /* Encode the MCU data block */\n  block = MCU_data[0];\n  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;\n\n  /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */\n\n  /* Establish EOB (end-of-block) index */\n  ke = cinfo->Se;\n  do {\n    /* We must apply the point transform by Al.  For AC coefficients this\n     * is an integer division with rounding towards 0.  To do this portably\n     * in C, we shift after obtaining the absolute value.\n     */\n    if ((v = (*block)[natural_order[ke]]) >= 0) {\n      if (v >>= cinfo->Al) break;\n    } else {\n      v = -v;\n      if (v >>= cinfo->Al) break;\n    }\n  } while (--ke);\n\n  /* Figure F.5: Encode_AC_Coefficients */\n  for (k = cinfo->Ss - 1; k < ke;) {\n    st = entropy->ac_stats[tbl] + 3 * k;\n    arith_encode(cinfo, st, 0);\t\t/* EOB decision */\n    for (;;) {\n      if ((v = (*block)[natural_order[++k]]) >= 0) {\n\tif (v >>= cinfo->Al) {\n\t  arith_encode(cinfo, st + 1, 1);\n\t  arith_encode(cinfo, entropy->fixed_bin, 0);\n\t  break;\n\t}\n      } else {\n\tv = -v;\n\tif (v >>= cinfo->Al) {\n\t  arith_encode(cinfo, st + 1, 1);\n\t  arith_encode(cinfo, entropy->fixed_bin, 1);\n\t  break;\n\t}\n      }\n      arith_encode(cinfo, st + 1, 0);\n      st += 3;\n    }\n    st += 2;\n    /* Figure F.8: Encoding the magnitude category of v */\n    m = 0;\n    if (v -= 1) {\n      arith_encode(cinfo, st, 1);\n      m = 1;\n      v2 = v;\n      if (v2 >>= 1) {\n\tarith_encode(cinfo, st, 1);\n\tm <<= 1;\n\tst = entropy->ac_stats[tbl] +\n\t     (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);\n\twhile (v2 >>= 1) {\n\t  arith_encode(cinfo, st, 1);\n\t  m <<= 1;\n\t  st += 1;\n\t}\n      }\n    }\n    arith_encode(cinfo, st, 0);\n    /* Figure F.9: Encoding the magnitude bit pattern of v */\n    st += 14;\n    while (m >>= 1)\n      arith_encode(cinfo, st, (m & v) ? 1 : 0);\n  }\n  /* Encode EOB decision only if k < cinfo->Se */\n  if (k < cinfo->Se) {\n    st = entropy->ac_stats[tbl] + 3 * k;\n    arith_encode(cinfo, st, 1);\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU encoding for DC successive approximation refinement scan.\n */\n\nMETHODDEF(boolean)\nencode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  unsigned char *st;\n  int Al, blkn;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      emit_restart(cinfo, entropy->next_restart_num);\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  st = entropy->fixed_bin;\t/* use fixed probability estimation */\n  Al = cinfo->Al;\n\n  /* Encode the MCU data blocks */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    /* We simply emit the Al'th bit of the DC coefficient value. */\n    arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU encoding for AC successive approximation refinement scan.\n */\n\nMETHODDEF(boolean)\nencode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  JBLOCKROW block;\n  unsigned char *st;\n  int tbl, k, ke, kex;\n  int v;\n  const int * natural_order;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      emit_restart(cinfo, entropy->next_restart_num);\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  natural_order = cinfo->natural_order;\n\n  /* Encode the MCU data block */\n  block = MCU_data[0];\n  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;\n\n  /* Section G.1.3.3: Encoding of AC coefficients */\n\n  /* Establish EOB (end-of-block) index */\n  ke = cinfo->Se;\n  do {\n    /* We must apply the point transform by Al.  For AC coefficients this\n     * is an integer division with rounding towards 0.  To do this portably\n     * in C, we shift after obtaining the absolute value.\n     */\n    if ((v = (*block)[natural_order[ke]]) >= 0) {\n      if (v >>= cinfo->Al) break;\n    } else {\n      v = -v;\n      if (v >>= cinfo->Al) break;\n    }\n  } while (--ke);\n\n  /* Establish EOBx (previous stage end-of-block) index */\n  for (kex = ke; kex > 0; kex--)\n    if ((v = (*block)[natural_order[kex]]) >= 0) {\n      if (v >>= cinfo->Ah) break;\n    } else {\n      v = -v;\n      if (v >>= cinfo->Ah) break;\n    }\n\n  /* Figure G.10: Encode_AC_Coefficients_SA */\n  for (k = cinfo->Ss - 1; k < ke;) {\n    st = entropy->ac_stats[tbl] + 3 * k;\n    if (k >= kex)\n      arith_encode(cinfo, st, 0);\t/* EOB decision */\n    for (;;) {\n      if ((v = (*block)[natural_order[++k]]) >= 0) {\n\tif (v >>= cinfo->Al) {\n\t  if (v >> 1)\t\t\t/* previously nonzero coef */\n\t    arith_encode(cinfo, st + 2, (v & 1));\n\t  else {\t\t\t/* newly nonzero coef */\n\t    arith_encode(cinfo, st + 1, 1);\n\t    arith_encode(cinfo, entropy->fixed_bin, 0);\n\t  }\n\t  break;\n\t}\n      } else {\n\tv = -v;\n\tif (v >>= cinfo->Al) {\n\t  if (v >> 1)\t\t\t/* previously nonzero coef */\n\t    arith_encode(cinfo, st + 2, (v & 1));\n\t  else {\t\t\t/* newly nonzero coef */\n\t    arith_encode(cinfo, st + 1, 1);\n\t    arith_encode(cinfo, entropy->fixed_bin, 1);\n\t  }\n\t  break;\n\t}\n      }\n      arith_encode(cinfo, st + 1, 0);\n      st += 3;\n    }\n  }\n  /* Encode EOB decision only if k < cinfo->Se */\n  if (k < cinfo->Se) {\n    st = entropy->ac_stats[tbl] + 3 * k;\n    arith_encode(cinfo, st, 1);\n  }\n\n  return TRUE;\n}\n\n\n/*\n * Encode and output one MCU's worth of arithmetic-compressed coefficients.\n */\n\nMETHODDEF(boolean)\nencode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  jpeg_component_info * compptr;\n  JBLOCKROW block;\n  unsigned char *st;\n  int blkn, ci, tbl, k, ke;\n  int v, v2, m;\n  const int * natural_order;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      emit_restart(cinfo, entropy->next_restart_num);\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  natural_order = cinfo->natural_order;\n\n  /* Encode the MCU data blocks */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n    ci = cinfo->MCU_membership[blkn];\n    compptr = cinfo->cur_comp_info[ci];\n\n    /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */\n\n    tbl = compptr->dc_tbl_no;\n\n    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */\n    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];\n\n    /* Figure F.4: Encode_DC_DIFF */\n    if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {\n      arith_encode(cinfo, st, 0);\n      entropy->dc_context[ci] = 0;\t/* zero diff category */\n    } else {\n      entropy->last_dc_val[ci] = (*block)[0];\n      arith_encode(cinfo, st, 1);\n      /* Figure F.6: Encoding nonzero value v */\n      /* Figure F.7: Encoding the sign of v */\n      if (v > 0) {\n\tarith_encode(cinfo, st + 1, 0);\t/* Table F.4: SS = S0 + 1 */\n\tst += 2;\t\t\t/* Table F.4: SP = S0 + 2 */\n\tentropy->dc_context[ci] = 4;\t/* small positive diff category */\n      } else {\n\tv = -v;\n\tarith_encode(cinfo, st + 1, 1);\t/* Table F.4: SS = S0 + 1 */\n\tst += 3;\t\t\t/* Table F.4: SN = S0 + 3 */\n\tentropy->dc_context[ci] = 8;\t/* small negative diff category */\n      }\n      /* Figure F.8: Encoding the magnitude category of v */\n      m = 0;\n      if (v -= 1) {\n\tarith_encode(cinfo, st, 1);\n\tm = 1;\n\tv2 = v;\n\tst = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */\n\twhile (v2 >>= 1) {\n\t  arith_encode(cinfo, st, 1);\n\t  m <<= 1;\n\t  st += 1;\n\t}\n      }\n      arith_encode(cinfo, st, 0);\n      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */\n      if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))\n\tentropy->dc_context[ci] = 0;\t/* zero diff category */\n      else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))\n\tentropy->dc_context[ci] += 8;\t/* large diff category */\n      /* Figure F.9: Encoding the magnitude bit pattern of v */\n      st += 14;\n      while (m >>= 1)\n\tarith_encode(cinfo, st, (m & v) ? 1 : 0);\n    }\n\n    /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */\n\n    if ((ke = cinfo->lim_Se) == 0) continue;\n    tbl = compptr->ac_tbl_no;\n\n    /* Establish EOB (end-of-block) index */\n    do {\n      if ((*block)[natural_order[ke]]) break;\n    } while (--ke);\n\n    /* Figure F.5: Encode_AC_Coefficients */\n    for (k = 0; k < ke;) {\n      st = entropy->ac_stats[tbl] + 3 * k;\n      arith_encode(cinfo, st, 0);\t/* EOB decision */\n      while ((v = (*block)[natural_order[++k]]) == 0) {\n\tarith_encode(cinfo, st + 1, 0);\n\tst += 3;\n      }\n      arith_encode(cinfo, st + 1, 1);\n      /* Figure F.6: Encoding nonzero value v */\n      /* Figure F.7: Encoding the sign of v */\n      if (v > 0) {\n\tarith_encode(cinfo, entropy->fixed_bin, 0);\n      } else {\n\tv = -v;\n\tarith_encode(cinfo, entropy->fixed_bin, 1);\n      }\n      st += 2;\n      /* Figure F.8: Encoding the magnitude category of v */\n      m = 0;\n      if (v -= 1) {\n\tarith_encode(cinfo, st, 1);\n\tm = 1;\n\tv2 = v;\n\tif (v2 >>= 1) {\n\t  arith_encode(cinfo, st, 1);\n\t  m <<= 1;\n\t  st = entropy->ac_stats[tbl] +\n\t       (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);\n\t  while (v2 >>= 1) {\n\t    arith_encode(cinfo, st, 1);\n\t    m <<= 1;\n\t    st += 1;\n\t  }\n\t}\n      }\n      arith_encode(cinfo, st, 0);\n      /* Figure F.9: Encoding the magnitude bit pattern of v */\n      st += 14;\n      while (m >>= 1)\n\tarith_encode(cinfo, st, (m & v) ? 1 : 0);\n    }\n    /* Encode EOB decision only if k < cinfo->lim_Se */\n    if (k < cinfo->lim_Se) {\n      st = entropy->ac_stats[tbl] + 3 * k;\n      arith_encode(cinfo, st, 1);\n    }\n  }\n\n  return TRUE;\n}\n\n\n/*\n * Initialize for an arithmetic-compressed scan.\n */\n\nMETHODDEF(void)\nstart_pass (j_compress_ptr cinfo, boolean gather_statistics)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  int ci, tbl;\n  jpeg_component_info * compptr;\n\n  if (gather_statistics)\n    /* Make sure to avoid that in the master control logic!\n     * We are fully adaptive here and need no extra\n     * statistics gathering pass!\n     */\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n\n  /* We assume jcmaster.c already validated the progressive scan parameters. */\n\n  /* Select execution routines */\n  if (cinfo->progressive_mode) {\n    if (cinfo->Ah == 0) {\n      if (cinfo->Ss == 0)\n\tentropy->pub.encode_mcu = encode_mcu_DC_first;\n      else\n\tentropy->pub.encode_mcu = encode_mcu_AC_first;\n    } else {\n      if (cinfo->Ss == 0)\n\tentropy->pub.encode_mcu = encode_mcu_DC_refine;\n      else\n\tentropy->pub.encode_mcu = encode_mcu_AC_refine;\n    }\n  } else\n    entropy->pub.encode_mcu = encode_mcu;\n\n  /* Allocate & initialize requested statistics areas */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    /* DC needs no table for refinement scan */\n    if (cinfo->Ss == 0 && cinfo->Ah == 0) {\n      tbl = compptr->dc_tbl_no;\n      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)\n\tERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);\n      if (entropy->dc_stats[tbl] == NULL)\n\tentropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)\n\t  ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);\n      MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);\n      /* Initialize DC predictions to 0 */\n      entropy->last_dc_val[ci] = 0;\n      entropy->dc_context[ci] = 0;\n    }\n    /* AC needs no table when not present */\n    if (cinfo->Se) {\n      tbl = compptr->ac_tbl_no;\n      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)\n\tERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);\n      if (entropy->ac_stats[tbl] == NULL)\n\tentropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)\n\t  ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);\n      MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);\n#ifdef CALCULATE_SPECTRAL_CONDITIONING\n      if (cinfo->progressive_mode)\n\t/* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */\n\tcinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4);\n#endif\n    }\n  }\n\n  /* Initialize arithmetic encoding variables */\n  entropy->c = 0;\n  entropy->a = 0x10000L;\n  entropy->sc = 0;\n  entropy->zc = 0;\n  entropy->ct = 11;\n  entropy->buffer = -1;  /* empty */\n\n  /* Initialize restart stuff */\n  entropy->restarts_to_go = cinfo->restart_interval;\n  entropy->next_restart_num = 0;\n}\n\n\n/*\n * Module initialization routine for arithmetic entropy encoding.\n */\n\nGLOBAL(void)\njinit_arith_encoder (j_compress_ptr cinfo)\n{\n  arith_entropy_ptr entropy;\n  int i;\n\n  entropy = (arith_entropy_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(arith_entropy_encoder));\n  cinfo->entropy = &entropy->pub;\n  entropy->pub.start_pass = start_pass;\n  entropy->pub.finish_pass = finish_pass;\n\n  /* Mark tables unallocated */\n  for (i = 0; i < NUM_ARITH_TBLS; i++) {\n    entropy->dc_stats[i] = NULL;\n    entropy->ac_stats[i] = NULL;\n  }\n\n  /* Initialize index for fixed probability estimation */\n  entropy->fixed_bin[0] = 113;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jccoefct.c",
    "content": "/*\n * jccoefct.c\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * Modified 2003-2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the coefficient buffer controller for compression.\n * This controller is the top level of the JPEG compressor proper.\n * The coefficient buffer lies between forward-DCT and entropy encoding steps.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* We use a full-image coefficient buffer when doing Huffman optimization,\n * and also for writing multiple-scan JPEG files.  In all cases, the DCT\n * step is run during the first pass, and subsequent passes need only read\n * the buffered coefficients.\n */\n#ifdef ENTROPY_OPT_SUPPORTED\n#define FULL_COEF_BUFFER_SUPPORTED\n#else\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n#define FULL_COEF_BUFFER_SUPPORTED\n#endif\n#endif\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_c_coef_controller pub; /* public fields */\n\n  JDIMENSION iMCU_row_num;\t/* iMCU row # within image */\n  JDIMENSION mcu_ctr;\t\t/* counts MCUs processed in current row */\n  int MCU_vert_offset;\t\t/* counts MCU rows within iMCU row */\n  int MCU_rows_per_iMCU_row;\t/* number of such rows needed */\n\n  /* For single-pass compression, it's sufficient to buffer just one MCU\n   * (although this may prove a bit slow in practice).  We allocate a\n   * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each\n   * MCU constructed and sent.  (On 80x86, the workspace is FAR even though\n   * it's not really very big; this is to keep the module interfaces unchanged\n   * when a large coefficient buffer is necessary.)\n   * In multi-pass modes, this array points to the current MCU's blocks\n   * within the virtual arrays.\n   */\n  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];\n\n  /* In multi-pass modes, we need a virtual block array for each component. */\n  jvirt_barray_ptr whole_image[MAX_COMPONENTS];\n} my_coef_controller;\n\ntypedef my_coef_controller * my_coef_ptr;\n\n\n/* Forward declarations */\nMETHODDEF(boolean) compress_data\n    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));\n#ifdef FULL_COEF_BUFFER_SUPPORTED\nMETHODDEF(boolean) compress_first_pass\n    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));\nMETHODDEF(boolean) compress_output\n    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));\n#endif\n\n\nLOCAL(void)\nstart_iMCU_row (j_compress_ptr cinfo)\n/* Reset within-iMCU-row counters for a new row */\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  /* In an interleaved scan, an MCU row is the same as an iMCU row.\n   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.\n   * But at the bottom of the image, process only what's left.\n   */\n  if (cinfo->comps_in_scan > 1) {\n    coef->MCU_rows_per_iMCU_row = 1;\n  } else {\n    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;\n    else\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;\n  }\n\n  coef->mcu_ctr = 0;\n  coef->MCU_vert_offset = 0;\n}\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  coef->iMCU_row_num = 0;\n  start_iMCU_row(cinfo);\n\n  switch (pass_mode) {\n  case JBUF_PASS_THRU:\n    if (coef->whole_image[0] != NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    coef->pub.compress_data = compress_data;\n    break;\n#ifdef FULL_COEF_BUFFER_SUPPORTED\n  case JBUF_SAVE_AND_PASS:\n    if (coef->whole_image[0] == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    coef->pub.compress_data = compress_first_pass;\n    break;\n  case JBUF_CRANK_DEST:\n    if (coef->whole_image[0] == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    coef->pub.compress_data = compress_output;\n    break;\n#endif\n  default:\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    break;\n  }\n}\n\n\n/*\n * Process some data in the single-pass case.\n * We process the equivalent of one fully interleaved MCU row (\"iMCU\" row)\n * per call, ie, v_samp_factor block rows for each component in the image.\n * Returns TRUE if the iMCU row is completed, FALSE if suspended.\n *\n * NB: input_buf contains a plane for each component in image,\n * which we index according to the component's SOF position.\n */\n\nMETHODDEF(boolean)\ncompress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  int blkn, bi, ci, yindex, yoffset, blockcnt;\n  JDIMENSION ypos, xpos;\n  jpeg_component_info *compptr;\n  forward_DCT_ptr forward_DCT;\n\n  /* Loop to write as much as one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;\n\t MCU_col_num++) {\n      /* Determine where data comes from in input_buf and do the DCT thing.\n       * Each call on forward_DCT processes a horizontal row of DCT blocks\n       * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks\n       * sequentially.  Dummy blocks at the right or bottom edge are filled in\n       * specially.  The data in them does not matter for image reconstruction,\n       * so we fill them with values that will encode to the smallest amount of\n       * data, viz: all zeroes in the AC entries, DC entries equal to previous\n       * block's DC value.  (Thanks to Thomas Kinsman for this idea.)\n       */\n      blkn = 0;\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\tforward_DCT = cinfo->fdct->forward_DCT[compptr->component_index];\n\tblockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width\n\t\t\t\t\t\t: compptr->last_col_width;\n\txpos = MCU_col_num * compptr->MCU_sample_width;\n\typos = yoffset * compptr->DCT_v_scaled_size;\n\t/* ypos == (yoffset+yindex) * DCTSIZE */\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  if (coef->iMCU_row_num < last_iMCU_row ||\n\t      yoffset+yindex < compptr->last_row_height) {\n\t    (*forward_DCT) (cinfo, compptr,\n\t\t\t    input_buf[compptr->component_index],\n\t\t\t    coef->MCU_buffer[blkn],\n\t\t\t    ypos, xpos, (JDIMENSION) blockcnt);\n\t    if (blockcnt < compptr->MCU_width) {\n\t      /* Create some dummy blocks at the right edge of the image. */\n\t      FMEMZERO((void FAR *) coef->MCU_buffer[blkn + blockcnt],\n\t\t       (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));\n\t      for (bi = blockcnt; bi < compptr->MCU_width; bi++) {\n\t\tcoef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];\n\t      }\n\t    }\n\t  } else {\n\t    /* Create a row of dummy blocks at the bottom of the image. */\n\t    FMEMZERO((void FAR *) coef->MCU_buffer[blkn],\n\t\t     compptr->MCU_width * SIZEOF(JBLOCK));\n\t    for (bi = 0; bi < compptr->MCU_width; bi++) {\n\t      coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];\n\t    }\n\t  }\n\t  blkn += compptr->MCU_width;\n\t  ypos += compptr->DCT_v_scaled_size;\n\t}\n      }\n      /* Try to write the MCU.  In event of a suspension failure, we will\n       * re-DCT the MCU on restart (a bit inefficient, could be fixed...)\n       */\n      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->mcu_ctr = MCU_col_num;\n\treturn FALSE;\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->mcu_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  coef->iMCU_row_num++;\n  start_iMCU_row(cinfo);\n  return TRUE;\n}\n\n\n#ifdef FULL_COEF_BUFFER_SUPPORTED\n\n/*\n * Process some data in the first pass of a multi-pass case.\n * We process the equivalent of one fully interleaved MCU row (\"iMCU\" row)\n * per call, ie, v_samp_factor block rows for each component in the image.\n * This amount of data is read from the source buffer, DCT'd and quantized,\n * and saved into the virtual arrays.  We also generate suitable dummy blocks\n * as needed at the right and lower edges.  (The dummy blocks are constructed\n * in the virtual arrays, which have been padded appropriately.)  This makes\n * it possible for subsequent passes not to worry about real vs. dummy blocks.\n *\n * We must also emit the data to the entropy encoder.  This is conveniently\n * done by calling compress_output() after we've loaded the current strip\n * of the virtual arrays.\n *\n * NB: input_buf contains a plane for each component in image.  All\n * components are DCT'd and loaded into the virtual arrays in this pass.\n * However, it may be that only a subset of the components are emitted to\n * the entropy encoder during this first pass; be careful about looking\n * at the scan-dependent variables (MCU dimensions, etc).\n */\n\nMETHODDEF(boolean)\ncompress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  JDIMENSION blocks_across, MCUs_across, MCUindex;\n  int bi, ci, h_samp_factor, block_row, block_rows, ndummy;\n  JCOEF lastDC;\n  jpeg_component_info *compptr;\n  JBLOCKARRAY buffer;\n  JBLOCKROW thisblockrow, lastblockrow;\n  forward_DCT_ptr forward_DCT;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Align the virtual buffer for this component. */\n    buffer = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[ci],\n       coef->iMCU_row_num * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, TRUE);\n    /* Count non-dummy DCT block rows in this iMCU row. */\n    if (coef->iMCU_row_num < last_iMCU_row)\n      block_rows = compptr->v_samp_factor;\n    else {\n      /* NB: can't use last_row_height here, since may not be set! */\n      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n      if (block_rows == 0) block_rows = compptr->v_samp_factor;\n    }\n    blocks_across = compptr->width_in_blocks;\n    h_samp_factor = compptr->h_samp_factor;\n    /* Count number of dummy blocks to be added at the right margin. */\n    ndummy = (int) (blocks_across % h_samp_factor);\n    if (ndummy > 0)\n      ndummy = h_samp_factor - ndummy;\n    forward_DCT = cinfo->fdct->forward_DCT[ci];\n    /* Perform DCT for all non-dummy blocks in this iMCU row.  Each call\n     * on forward_DCT processes a complete horizontal row of DCT blocks.\n     */\n    for (block_row = 0; block_row < block_rows; block_row++) {\n      thisblockrow = buffer[block_row];\n      (*forward_DCT) (cinfo, compptr, input_buf[ci], thisblockrow,\n\t\t      (JDIMENSION) (block_row * compptr->DCT_v_scaled_size),\n\t\t      (JDIMENSION) 0, blocks_across);\n      if (ndummy > 0) {\n\t/* Create dummy blocks at the right edge of the image. */\n\tthisblockrow += blocks_across; /* => first dummy block */\n\tFMEMZERO((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));\n\tlastDC = thisblockrow[-1][0];\n\tfor (bi = 0; bi < ndummy; bi++) {\n\t  thisblockrow[bi][0] = lastDC;\n\t}\n      }\n    }\n    /* If at end of image, create dummy block rows as needed.\n     * The tricky part here is that within each MCU, we want the DC values\n     * of the dummy blocks to match the last real block's DC value.\n     * This squeezes a few more bytes out of the resulting file...\n     */\n    if (coef->iMCU_row_num == last_iMCU_row) {\n      blocks_across += ndummy;\t/* include lower right corner */\n      MCUs_across = blocks_across / h_samp_factor;\n      for (block_row = block_rows; block_row < compptr->v_samp_factor;\n\t   block_row++) {\n\tthisblockrow = buffer[block_row];\n\tlastblockrow = buffer[block_row-1];\n\tFMEMZERO((void FAR *) thisblockrow,\n\t\t (size_t) (blocks_across * SIZEOF(JBLOCK)));\n\tfor (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {\n\t  lastDC = lastblockrow[h_samp_factor-1][0];\n\t  for (bi = 0; bi < h_samp_factor; bi++) {\n\t    thisblockrow[bi][0] = lastDC;\n\t  }\n\t  thisblockrow += h_samp_factor; /* advance to next MCU in row */\n\t  lastblockrow += h_samp_factor;\n\t}\n      }\n    }\n  }\n  /* NB: compress_output will increment iMCU_row_num if successful.\n   * A suspension return will result in redoing all the work above next time.\n   */\n\n  /* Emit data to the entropy encoder, sharing code with subsequent passes */\n  return compress_output(cinfo, input_buf);\n}\n\n\n/*\n * Process some data in subsequent passes of a multi-pass case.\n * We process the equivalent of one fully interleaved MCU row (\"iMCU\" row)\n * per call, ie, v_samp_factor block rows for each component in the scan.\n * The data is obtained from the virtual arrays and fed to the entropy coder.\n * Returns TRUE if the iMCU row is completed, FALSE if suspended.\n *\n * NB: input_buf is ignored; it is likely to be a NULL pointer.\n */\n\nMETHODDEF(boolean)\ncompress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  int blkn, ci, xindex, yindex, yoffset;\n  JDIMENSION start_col;\n  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];\n  JBLOCKROW buffer_ptr;\n  jpeg_component_info *compptr;\n\n  /* Align the virtual buffers for the components used in this scan.\n   * NB: during first pass, this is safe only because the buffers will\n   * already be aligned properly, so jmemmgr.c won't need to do any I/O.\n   */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    buffer[ci] = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],\n       coef->iMCU_row_num * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, FALSE);\n  }\n\n  /* Loop to process one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;\n\t MCU_col_num++) {\n      /* Construct list of pointers to DCT blocks belonging to this MCU */\n      blkn = 0;\t\t\t/* index of current DCT block within MCU */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\tstart_col = MCU_col_num * compptr->MCU_width;\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  buffer_ptr = buffer[ci][yindex+yoffset] + start_col;\n\t  for (xindex = 0; xindex < compptr->MCU_width; xindex++) {\n\t    coef->MCU_buffer[blkn++] = buffer_ptr++;\n\t  }\n\t}\n      }\n      /* Try to write the MCU. */\n      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->mcu_ctr = MCU_col_num;\n\treturn FALSE;\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->mcu_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  coef->iMCU_row_num++;\n  start_iMCU_row(cinfo);\n  return TRUE;\n}\n\n#endif /* FULL_COEF_BUFFER_SUPPORTED */\n\n\n/*\n * Initialize coefficient buffer controller.\n */\n\nGLOBAL(void)\njinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)\n{\n  my_coef_ptr coef;\n\n  coef = (my_coef_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_coef_controller));\n  cinfo->coef = (struct jpeg_c_coef_controller *) coef;\n  coef->pub.start_pass = start_pass_coef;\n\n  /* Create the coefficient buffer. */\n  if (need_full_buffer) {\n#ifdef FULL_COEF_BUFFER_SUPPORTED\n    /* Allocate a full-image virtual array for each component, */\n    /* padded to a multiple of samp_factor DCT blocks in each direction. */\n    int ci;\n    jpeg_component_info *compptr;\n\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n\t (JDIMENSION) jround_up((long) compptr->width_in_blocks,\n\t\t\t\t(long) compptr->h_samp_factor),\n\t (JDIMENSION) jround_up((long) compptr->height_in_blocks,\n\t\t\t\t(long) compptr->v_samp_factor),\n\t (JDIMENSION) compptr->v_samp_factor);\n    }\n#else\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n#endif\n  } else {\n    /* We only need a single-MCU buffer. */\n    JBLOCKROW buffer;\n    int i;\n\n    buffer = (JBLOCKROW)\n      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));\n    for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {\n      coef->MCU_buffer[i] = buffer + i;\n    }\n    coef->whole_image[0] = NULL; /* flag for no virtual arrays */\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jccolor.c",
    "content": "/*\n * jccolor.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * Modified 2011-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains input colorspace conversion routines.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_color_converter pub; /* public fields */\n\n  /* Private state for RGB->YCC conversion */\n  INT32 * rgb_ycc_tab;\t\t/* => table for RGB to YCbCr conversion */\n} my_color_converter;\n\ntypedef my_color_converter * my_cconvert_ptr;\n\n\n/**************** RGB -> YCbCr conversion: most common case **************/\n\n/*\n * YCbCr is defined per CCIR 601-1, except that Cb and Cr are\n * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.\n * The conversion equations to be implemented are therefore\n *\tY  =  0.29900 * R + 0.58700 * G + 0.11400 * B\n *\tCb = -0.16874 * R - 0.33126 * G + 0.50000 * B  + CENTERJSAMPLE\n *\tCr =  0.50000 * R - 0.41869 * G - 0.08131 * B  + CENTERJSAMPLE\n * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)\n * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,\n * rather than CENTERJSAMPLE, for Cb and Cr.  This gave equal positive and\n * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)\n * were not represented exactly.  Now we sacrifice exact representation of\n * maximum red and maximum blue in order to get exact grayscales.\n *\n * To avoid floating-point arithmetic, we represent the fractional constants\n * as integers scaled up by 2^16 (about 4 digits precision); we have to divide\n * the products by 2^16, with appropriate rounding, to get the correct answer.\n *\n * For even more speed, we avoid doing any multiplications in the inner loop\n * by precalculating the constants times R,G,B for all possible values.\n * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);\n * for 12-bit samples it is still acceptable.  It's not very reasonable for\n * 16-bit samples, but if you want lossless storage you shouldn't be changing\n * colorspace anyway.\n * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included\n * in the tables to save adding them separately in the inner loop.\n */\n\n#define SCALEBITS\t16\t/* speediest right-shift on some machines */\n#define CBCR_OFFSET\t((INT32) CENTERJSAMPLE << SCALEBITS)\n#define ONE_HALF\t((INT32) 1 << (SCALEBITS-1))\n#define FIX(x)\t\t((INT32) ((x) * (1L<<SCALEBITS) + 0.5))\n\n/* We allocate one big table and divide it up into eight parts, instead of\n * doing eight alloc_small requests.  This lets us use a single table base\n * address, which can be held in a register in the inner loops on many\n * machines (more than can hold all eight addresses, anyway).\n */\n\n#define R_Y_OFF\t\t0\t\t\t/* offset to R => Y section */\n#define G_Y_OFF\t\t(1*(MAXJSAMPLE+1))\t/* offset to G => Y section */\n#define B_Y_OFF\t\t(2*(MAXJSAMPLE+1))\t/* etc. */\n#define R_CB_OFF\t(3*(MAXJSAMPLE+1))\n#define G_CB_OFF\t(4*(MAXJSAMPLE+1))\n#define B_CB_OFF\t(5*(MAXJSAMPLE+1))\n#define R_CR_OFF\tB_CB_OFF\t\t/* B=>Cb, R=>Cr are the same */\n#define G_CR_OFF\t(6*(MAXJSAMPLE+1))\n#define B_CR_OFF\t(7*(MAXJSAMPLE+1))\n#define TABLE_SIZE\t(8*(MAXJSAMPLE+1))\n\n\n/*\n * Initialize for RGB->YCC colorspace conversion.\n */\n\nMETHODDEF(void)\nrgb_ycc_start (j_compress_ptr cinfo)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  INT32 * rgb_ycc_tab;\n  INT32 i;\n\n  /* Allocate and fill in the conversion tables. */\n  cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(TABLE_SIZE * SIZEOF(INT32)));\n\n  for (i = 0; i <= MAXJSAMPLE; i++) {\n    rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;\n    rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;\n    rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i     + ONE_HALF;\n    rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;\n    rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;\n    /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.\n     * This ensures that the maximum output will round to MAXJSAMPLE\n     * not MAXJSAMPLE+1, and thus that we don't have to range-limit.\n     */\n    rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;\n/*  B=>Cb and R=>Cr tables are the same\n    rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;\n*/\n    rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;\n    rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n *\n * Note that we change from the application's interleaved-pixel format\n * to our internal noninterleaved, one-plane-per-component format.\n * The input buffer is therefore three times as wide as the output buffer.\n *\n * A starting row offset is provided only for the output buffer.  The caller\n * can easily adjust the passed input_buf value to accommodate any row\n * offset required on that side.\n */\n\nMETHODDEF(void)\nrgb_ycc_convert (j_compress_ptr cinfo,\n\t\t JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t JDIMENSION output_row, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register INT32 * ctab = cconvert->rgb_ycc_tab;\n  register int r, g, b;\n  register JSAMPROW inptr;\n  register JSAMPROW outptr0, outptr1, outptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr0 = output_buf[0][output_row];\n    outptr1 = output_buf[1][output_row];\n    outptr2 = output_buf[2][output_row];\n    output_row++;\n    for (col = 0; col < num_cols; col++) {\n      r = GETJSAMPLE(inptr[RGB_RED]);\n      g = GETJSAMPLE(inptr[RGB_GREEN]);\n      b = GETJSAMPLE(inptr[RGB_BLUE]);\n      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations\n       * must be too; we do not need an explicit range-limiting operation.\n       * Hence the value being shifted is never negative, and we don't\n       * need the general RIGHT_SHIFT macro.\n       */\n      /* Y */\n      outptr0[col] = (JSAMPLE)\n\t\t((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])\n\t\t >> SCALEBITS);\n      /* Cb */\n      outptr1[col] = (JSAMPLE)\n\t\t((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])\n\t\t >> SCALEBITS);\n      /* Cr */\n      outptr2[col] = (JSAMPLE)\n\t\t((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])\n\t\t >> SCALEBITS);\n      inptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/**************** Cases other than RGB -> YCbCr **************/\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * This version handles RGB->grayscale conversion, which is the same\n * as the RGB->Y portion of RGB->YCbCr.\n * We assume rgb_ycc_start has been called (we only use the Y tables).\n */\n\nMETHODDEF(void)\nrgb_gray_convert (j_compress_ptr cinfo,\n\t\t  JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t  JDIMENSION output_row, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register INT32 * ctab = cconvert->rgb_ycc_tab;\n  register int r, g, b;\n  register JSAMPROW inptr;\n  register JSAMPROW outptr;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr = output_buf[0][output_row++];\n    for (col = 0; col < num_cols; col++) {\n      r = GETJSAMPLE(inptr[RGB_RED]);\n      g = GETJSAMPLE(inptr[RGB_GREEN]);\n      b = GETJSAMPLE(inptr[RGB_BLUE]);\n      /* Y */\n      outptr[col] = (JSAMPLE)\n\t\t((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])\n\t\t >> SCALEBITS);\n      inptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * This version handles Adobe-style CMYK->YCCK conversion,\n * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same\n * conversion as above, while passing K (black) unchanged.\n * We assume rgb_ycc_start has been called.\n */\n\nMETHODDEF(void)\ncmyk_ycck_convert (j_compress_ptr cinfo,\n\t\t   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t   JDIMENSION output_row, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register INT32 * ctab = cconvert->rgb_ycc_tab;\n  register int r, g, b;\n  register JSAMPROW inptr;\n  register JSAMPROW outptr0, outptr1, outptr2, outptr3;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr0 = output_buf[0][output_row];\n    outptr1 = output_buf[1][output_row];\n    outptr2 = output_buf[2][output_row];\n    outptr3 = output_buf[3][output_row];\n    output_row++;\n    for (col = 0; col < num_cols; col++) {\n      r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);\n      g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);\n      b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);\n      /* K passes through as-is */\n      outptr3[col] = inptr[3];\t/* don't need GETJSAMPLE here */\n      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations\n       * must be too; we do not need an explicit range-limiting operation.\n       * Hence the value being shifted is never negative, and we don't\n       * need the general RIGHT_SHIFT macro.\n       */\n      /* Y */\n      outptr0[col] = (JSAMPLE)\n\t\t((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])\n\t\t >> SCALEBITS);\n      /* Cb */\n      outptr1[col] = (JSAMPLE)\n\t\t((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])\n\t\t >> SCALEBITS);\n      /* Cr */\n      outptr2[col] = (JSAMPLE)\n\t\t((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])\n\t\t >> SCALEBITS);\n      inptr += 4;\n    }\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * [R,G,B] to [R-G,G,B-G] conversion with modulo calculation\n * (forward reversible color transform).\n */\n\nMETHODDEF(void)\nrgb_rgb1_convert (j_compress_ptr cinfo,\n\t\t  JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t  JDIMENSION output_row, int num_rows)\n{\n  register int r, g, b;\n  register JSAMPROW inptr;\n  register JSAMPROW outptr0, outptr1, outptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr0 = output_buf[0][output_row];\n    outptr1 = output_buf[1][output_row];\n    outptr2 = output_buf[2][output_row];\n    output_row++;\n    for (col = 0; col < num_cols; col++) {\n      r = GETJSAMPLE(inptr[RGB_RED]);\n      g = GETJSAMPLE(inptr[RGB_GREEN]);\n      b = GETJSAMPLE(inptr[RGB_BLUE]);\n      /* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD\n       * (modulo) operator is equivalent to the bitmask operator AND.\n       */\n      outptr0[col] = (JSAMPLE) ((r - g + CENTERJSAMPLE) & MAXJSAMPLE);\n      outptr1[col] = (JSAMPLE) g;\n      outptr2[col] = (JSAMPLE) ((b - g + CENTERJSAMPLE) & MAXJSAMPLE);\n      inptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * This version handles grayscale output with no conversion.\n * The source can be either plain grayscale or YCbCr (since Y == gray).\n */\n\nMETHODDEF(void)\ngrayscale_convert (j_compress_ptr cinfo,\n\t\t   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t\t   JDIMENSION output_row, int num_rows)\n{\n  int instride = cinfo->input_components;\n  register JSAMPROW inptr;\n  register JSAMPROW outptr;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr = output_buf[0][output_row++];\n    for (col = 0; col < num_cols; col++) {\n      outptr[col] = inptr[0];\t/* don't need GETJSAMPLE() here */\n      inptr += instride;\n    }\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * No colorspace conversion, but change from interleaved\n * to separate-planes representation.\n */\n\nMETHODDEF(void)\nrgb_convert (j_compress_ptr cinfo,\n\t     JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t     JDIMENSION output_row, int num_rows)\n{\n  register JSAMPROW inptr;\n  register JSAMPROW outptr0, outptr1, outptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    inptr = *input_buf++;\n    outptr0 = output_buf[0][output_row];\n    outptr1 = output_buf[1][output_row];\n    outptr2 = output_buf[2][output_row];\n    output_row++;\n    for (col = 0; col < num_cols; col++) {\n      /* We can dispense with GETJSAMPLE() here */\n      outptr0[col] = inptr[RGB_RED];\n      outptr1[col] = inptr[RGB_GREEN];\n      outptr2[col] = inptr[RGB_BLUE];\n      inptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/*\n * Convert some rows of samples to the JPEG colorspace.\n * This version handles multi-component colorspaces without conversion.\n * We assume input_components == num_components.\n */\n\nMETHODDEF(void)\nnull_convert (j_compress_ptr cinfo,\n\t      JSAMPARRAY input_buf, JSAMPIMAGE output_buf,\n\t      JDIMENSION output_row, int num_rows)\n{\n  int ci;\n  register int nc = cinfo->num_components;\n  register JSAMPROW inptr;\n  register JSAMPROW outptr;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->image_width;\n\n  while (--num_rows >= 0) {\n    /* It seems fastest to make a separate pass for each component. */\n    for (ci = 0; ci < nc; ci++) {\n      inptr = input_buf[0] + ci;\n      outptr = output_buf[ci][output_row];\n      for (col = 0; col < num_cols; col++) {\n\t*outptr++ = *inptr;\t/* don't need GETJSAMPLE() here */\n\tinptr += nc;\n      }\n    }\n    input_buf++;\n    output_row++;\n  }\n}\n\n\n/*\n * Empty method for start_pass.\n */\n\nMETHODDEF(void)\nnull_method (j_compress_ptr cinfo)\n{\n  /* no work needed */\n}\n\n\n/*\n * Module initialization routine for input colorspace conversion.\n */\n\nGLOBAL(void)\njinit_color_converter (j_compress_ptr cinfo)\n{\n  my_cconvert_ptr cconvert;\n\n  cconvert = (my_cconvert_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_color_converter));\n  cinfo->cconvert = &cconvert->pub;\n  /* set start_pass to null method until we find out differently */\n  cconvert->pub.start_pass = null_method;\n\n  /* Make sure input_components agrees with in_color_space */\n  switch (cinfo->in_color_space) {\n  case JCS_GRAYSCALE:\n    if (cinfo->input_components != 1)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n\n  case JCS_RGB:\n    if (cinfo->input_components != RGB_PIXELSIZE)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n\n  case JCS_YCbCr:\n    if (cinfo->input_components != 3)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n\n  case JCS_CMYK:\n  case JCS_YCCK:\n    if (cinfo->input_components != 4)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n\n  default:\t\t\t/* JCS_UNKNOWN can be anything */\n    if (cinfo->input_components < 1)\n      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n    break;\n  }\n\n  /* Support color transform only for RGB colorspace */\n  if (cinfo->color_transform && cinfo->jpeg_color_space != JCS_RGB)\n    ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n\n  /* Check num_components, set conversion method based on requested space */\n  switch (cinfo->jpeg_color_space) {\n  case JCS_GRAYSCALE:\n    if (cinfo->num_components != 1)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_GRAYSCALE ||\n\tcinfo->in_color_space == JCS_YCbCr)\n      cconvert->pub.color_convert = grayscale_convert;\n    else if (cinfo->in_color_space == JCS_RGB) {\n      cconvert->pub.start_pass = rgb_ycc_start;\n      cconvert->pub.color_convert = rgb_gray_convert;\n    } else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_RGB:\n    if (cinfo->num_components != 3)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_RGB) {\n      switch (cinfo->color_transform) {\n      case JCT_NONE:\n\tcconvert->pub.color_convert = rgb_convert;\n\tbreak;\n      case JCT_SUBTRACT_GREEN:\n\tcconvert->pub.color_convert = rgb_rgb1_convert;\n\tbreak;\n      default:\n\tERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n\tbreak;\n      }\n    } else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_YCbCr:\n    if (cinfo->num_components != 3)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_RGB) {\n      cconvert->pub.start_pass = rgb_ycc_start;\n      cconvert->pub.color_convert = rgb_ycc_convert;\n    } else if (cinfo->in_color_space == JCS_YCbCr)\n      cconvert->pub.color_convert = null_convert;\n    else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_CMYK:\n    if (cinfo->num_components != 4)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_CMYK)\n      cconvert->pub.color_convert = null_convert;\n    else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_YCCK:\n    if (cinfo->num_components != 4)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    if (cinfo->in_color_space == JCS_CMYK) {\n      cconvert->pub.start_pass = rgb_ycc_start;\n      cconvert->pub.color_convert = cmyk_ycck_convert;\n    } else if (cinfo->in_color_space == JCS_YCCK)\n      cconvert->pub.color_convert = null_convert;\n    else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  default:\t\t\t/* allow null conversion of JCS_UNKNOWN */\n    if (cinfo->jpeg_color_space != cinfo->in_color_space ||\n\tcinfo->num_components != cinfo->input_components)\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    cconvert->pub.color_convert = null_convert;\n    break;\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcdctmgr.c",
    "content": "/*\n * jcdctmgr.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the forward-DCT management logic.\n * This code selects a particular DCT implementation to be used,\n * and it performs related housekeeping chores including coefficient\n * quantization.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n\n/* Private subobject for this module */\n\ntypedef struct {\n  struct jpeg_forward_dct pub;\t/* public fields */\n\n  /* Pointer to the DCT routine actually in use */\n  forward_DCT_method_ptr do_dct[MAX_COMPONENTS];\n\n  /* The actual post-DCT divisors --- not identical to the quant table\n   * entries, because of scaling (especially for an unnormalized DCT).\n   * Each table is given in normal array order.\n   */\n  DCTELEM * divisors[NUM_QUANT_TBLS];\n\n#ifdef DCT_FLOAT_SUPPORTED\n  /* Same as above for the floating-point case. */\n  float_DCT_method_ptr do_float_dct[MAX_COMPONENTS];\n  FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];\n#endif\n} my_fdct_controller;\n\ntypedef my_fdct_controller * my_fdct_ptr;\n\n\n/* The current scaled-DCT routines require ISLOW-style divisor tables,\n * so be sure to compile that code if either ISLOW or SCALING is requested.\n */\n#ifdef DCT_ISLOW_SUPPORTED\n#define PROVIDE_ISLOW_TABLES\n#else\n#ifdef DCT_SCALING_SUPPORTED\n#define PROVIDE_ISLOW_TABLES\n#endif\n#endif\n\n\n/*\n * Perform forward DCT on one or more blocks of a component.\n *\n * The input samples are taken from the sample_data[] array starting at\n * position start_row/start_col, and moving to the right for any additional\n * blocks. The quantized coefficients are returned in coef_blocks[].\n */\n\nMETHODDEF(void)\nforward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t     JSAMPARRAY sample_data, JBLOCKROW coef_blocks,\n\t     JDIMENSION start_row, JDIMENSION start_col,\n\t     JDIMENSION num_blocks)\n/* This version is used for integer DCT implementations. */\n{\n  /* This routine is heavily used, so it's worth coding it tightly. */\n  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;\n  forward_DCT_method_ptr do_dct = fdct->do_dct[compptr->component_index];\n  DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];\n  DCTELEM workspace[DCTSIZE2];\t/* work area for FDCT subroutine */\n  JDIMENSION bi;\n\n  sample_data += start_row;\t/* fold in the vertical offset once */\n\n  for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) {\n    /* Perform the DCT */\n    (*do_dct) (workspace, sample_data, start_col);\n\n    /* Quantize/descale the coefficients, and store into coef_blocks[] */\n    { register DCTELEM temp, qval;\n      register int i;\n      register JCOEFPTR output_ptr = coef_blocks[bi];\n\n      for (i = 0; i < DCTSIZE2; i++) {\n\tqval = divisors[i];\n\ttemp = workspace[i];\n\t/* Divide the coefficient value by qval, ensuring proper rounding.\n\t * Since C does not specify the direction of rounding for negative\n\t * quotients, we have to force the dividend positive for portability.\n\t *\n\t * In most files, at least half of the output values will be zero\n\t * (at default quantization settings, more like three-quarters...)\n\t * so we should ensure that this case is fast.  On many machines,\n\t * a comparison is enough cheaper than a divide to make a special test\n\t * a win.  Since both inputs will be nonnegative, we need only test\n\t * for a < b to discover whether a/b is 0.\n\t * If your machine's division is fast enough, define FAST_DIVIDE.\n\t */\n#ifdef FAST_DIVIDE\n#define DIVIDE_BY(a,b)\ta /= b\n#else\n#define DIVIDE_BY(a,b)\tif (a >= b) a /= b; else a = 0\n#endif\n\tif (temp < 0) {\n\t  temp = -temp;\n\t  temp += qval>>1;\t/* for rounding */\n\t  DIVIDE_BY(temp, qval);\n\t  temp = -temp;\n\t} else {\n\t  temp += qval>>1;\t/* for rounding */\n\t  DIVIDE_BY(temp, qval);\n\t}\n\toutput_ptr[i] = (JCOEF) temp;\n      }\n    }\n  }\n}\n\n\n#ifdef DCT_FLOAT_SUPPORTED\n\nMETHODDEF(void)\nforward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t   JSAMPARRAY sample_data, JBLOCKROW coef_blocks,\n\t\t   JDIMENSION start_row, JDIMENSION start_col,\n\t\t   JDIMENSION num_blocks)\n/* This version is used for floating-point DCT implementations. */\n{\n  /* This routine is heavily used, so it's worth coding it tightly. */\n  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;\n  float_DCT_method_ptr do_dct = fdct->do_float_dct[compptr->component_index];\n  FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];\n  FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */\n  JDIMENSION bi;\n\n  sample_data += start_row;\t/* fold in the vertical offset once */\n\n  for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) {\n    /* Perform the DCT */\n    (*do_dct) (workspace, sample_data, start_col);\n\n    /* Quantize/descale the coefficients, and store into coef_blocks[] */\n    { register FAST_FLOAT temp;\n      register int i;\n      register JCOEFPTR output_ptr = coef_blocks[bi];\n\n      for (i = 0; i < DCTSIZE2; i++) {\n\t/* Apply the quantization and scaling factor */\n\ttemp = workspace[i] * divisors[i];\n\t/* Round to nearest integer.\n\t * Since C does not specify the direction of rounding for negative\n\t * quotients, we have to force the dividend positive for portability.\n\t * The maximum coefficient size is +-16K (for 12-bit data), so this\n\t * code should work for either 16-bit or 32-bit ints.\n\t */\n\toutput_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);\n      }\n    }\n  }\n}\n\n#endif /* DCT_FLOAT_SUPPORTED */\n\n\n/*\n * Initialize for a processing pass.\n * Verify that all referenced Q-tables are present, and set up\n * the divisor table for each one.\n * In the current implementation, DCT of all components is done during\n * the first pass, even if only some components will be output in the\n * first scan.  Hence all components should be examined here.\n */\n\nMETHODDEF(void)\nstart_pass_fdctmgr (j_compress_ptr cinfo)\n{\n  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;\n  int ci, qtblno, i;\n  jpeg_component_info *compptr;\n  int method = 0;\n  JQUANT_TBL * qtbl;\n  DCTELEM * dtbl;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Select the proper DCT routine for this component's scaling */\n    switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) {\n#ifdef DCT_SCALING_SUPPORTED\n    case ((1 << 8) + 1):\n      fdct->do_dct[ci] = jpeg_fdct_1x1;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((2 << 8) + 2):\n      fdct->do_dct[ci] = jpeg_fdct_2x2;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((3 << 8) + 3):\n      fdct->do_dct[ci] = jpeg_fdct_3x3;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((4 << 8) + 4):\n      fdct->do_dct[ci] = jpeg_fdct_4x4;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((5 << 8) + 5):\n      fdct->do_dct[ci] = jpeg_fdct_5x5;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((6 << 8) + 6):\n      fdct->do_dct[ci] = jpeg_fdct_6x6;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((7 << 8) + 7):\n      fdct->do_dct[ci] = jpeg_fdct_7x7;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((9 << 8) + 9):\n      fdct->do_dct[ci] = jpeg_fdct_9x9;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((10 << 8) + 10):\n      fdct->do_dct[ci] = jpeg_fdct_10x10;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((11 << 8) + 11):\n      fdct->do_dct[ci] = jpeg_fdct_11x11;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((12 << 8) + 12):\n      fdct->do_dct[ci] = jpeg_fdct_12x12;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((13 << 8) + 13):\n      fdct->do_dct[ci] = jpeg_fdct_13x13;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((14 << 8) + 14):\n      fdct->do_dct[ci] = jpeg_fdct_14x14;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((15 << 8) + 15):\n      fdct->do_dct[ci] = jpeg_fdct_15x15;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((16 << 8) + 16):\n      fdct->do_dct[ci] = jpeg_fdct_16x16;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((16 << 8) + 8):\n      fdct->do_dct[ci] = jpeg_fdct_16x8;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((14 << 8) + 7):\n      fdct->do_dct[ci] = jpeg_fdct_14x7;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((12 << 8) + 6):\n      fdct->do_dct[ci] = jpeg_fdct_12x6;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((10 << 8) + 5):\n      fdct->do_dct[ci] = jpeg_fdct_10x5;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((8 << 8) + 4):\n      fdct->do_dct[ci] = jpeg_fdct_8x4;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((6 << 8) + 3):\n      fdct->do_dct[ci] = jpeg_fdct_6x3;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((4 << 8) + 2):\n      fdct->do_dct[ci] = jpeg_fdct_4x2;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((2 << 8) + 1):\n      fdct->do_dct[ci] = jpeg_fdct_2x1;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((8 << 8) + 16):\n      fdct->do_dct[ci] = jpeg_fdct_8x16;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((7 << 8) + 14):\n      fdct->do_dct[ci] = jpeg_fdct_7x14;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((6 << 8) + 12):\n      fdct->do_dct[ci] = jpeg_fdct_6x12;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((5 << 8) + 10):\n      fdct->do_dct[ci] = jpeg_fdct_5x10;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((4 << 8) + 8):\n      fdct->do_dct[ci] = jpeg_fdct_4x8;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((3 << 8) + 6):\n      fdct->do_dct[ci] = jpeg_fdct_3x6;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((2 << 8) + 4):\n      fdct->do_dct[ci] = jpeg_fdct_2x4;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n    case ((1 << 8) + 2):\n      fdct->do_dct[ci] = jpeg_fdct_1x2;\n      method = JDCT_ISLOW;\t/* jfdctint uses islow-style table */\n      break;\n#endif\n    case ((DCTSIZE << 8) + DCTSIZE):\n      switch (cinfo->dct_method) {\n#ifdef DCT_ISLOW_SUPPORTED\n      case JDCT_ISLOW:\n\tfdct->do_dct[ci] = jpeg_fdct_islow;\n\tmethod = JDCT_ISLOW;\n\tbreak;\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n      case JDCT_IFAST:\n\tfdct->do_dct[ci] = jpeg_fdct_ifast;\n\tmethod = JDCT_IFAST;\n\tbreak;\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n      case JDCT_FLOAT:\n\tfdct->do_float_dct[ci] = jpeg_fdct_float;\n\tmethod = JDCT_FLOAT;\n\tbreak;\n#endif\n      default:\n\tERREXIT(cinfo, JERR_NOT_COMPILED);\n\tbreak;\n      }\n      break;\n    default:\n      ERREXIT2(cinfo, JERR_BAD_DCTSIZE,\n\t       compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size);\n      break;\n    }\n    qtblno = compptr->quant_tbl_no;\n    /* Make sure specified quantization table is present */\n    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||\n\tcinfo->quant_tbl_ptrs[qtblno] == NULL)\n      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);\n    qtbl = cinfo->quant_tbl_ptrs[qtblno];\n    /* Compute divisors for this quant table */\n    /* We may do this more than once for same table, but it's not a big deal */\n    switch (method) {\n#ifdef PROVIDE_ISLOW_TABLES\n    case JDCT_ISLOW:\n      /* For LL&M IDCT method, divisors are equal to raw quantization\n       * coefficients multiplied by 8 (to counteract scaling).\n       */\n      if (fdct->divisors[qtblno] == NULL) {\n\tfdct->divisors[qtblno] = (DCTELEM *)\n\t  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t      DCTSIZE2 * SIZEOF(DCTELEM));\n      }\n      dtbl = fdct->divisors[qtblno];\n      for (i = 0; i < DCTSIZE2; i++) {\n\tdtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;\n      }\n      fdct->pub.forward_DCT[ci] = forward_DCT;\n      break;\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n    case JDCT_IFAST:\n      {\n\t/* For AA&N IDCT method, divisors are equal to quantization\n\t * coefficients scaled by scalefactor[row]*scalefactor[col], where\n\t *   scalefactor[0] = 1\n\t *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7\n\t * We apply a further scale factor of 8.\n\t */\n#define CONST_BITS 14\n\tstatic const INT16 aanscales[DCTSIZE2] = {\n\t  /* precomputed values scaled up by 14 bits */\n\t  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,\n\t  22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,\n\t  21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,\n\t  19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,\n\t  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,\n\t  12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,\n\t   8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,\n\t   4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247\n\t};\n\tSHIFT_TEMPS\n\n\tif (fdct->divisors[qtblno] == NULL) {\n\t  fdct->divisors[qtblno] = (DCTELEM *)\n\t    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t\tDCTSIZE2 * SIZEOF(DCTELEM));\n\t}\n\tdtbl = fdct->divisors[qtblno];\n\tfor (i = 0; i < DCTSIZE2; i++) {\n\t  dtbl[i] = (DCTELEM)\n\t    DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],\n\t\t\t\t  (INT32) aanscales[i]),\n\t\t    CONST_BITS-3);\n\t}\n      }\n      fdct->pub.forward_DCT[ci] = forward_DCT;\n      break;\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n    case JDCT_FLOAT:\n      {\n\t/* For float AA&N IDCT method, divisors are equal to quantization\n\t * coefficients scaled by scalefactor[row]*scalefactor[col], where\n\t *   scalefactor[0] = 1\n\t *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7\n\t * We apply a further scale factor of 8.\n\t * What's actually stored is 1/divisor so that the inner loop can\n\t * use a multiplication rather than a division.\n\t */\n\tFAST_FLOAT * fdtbl;\n\tint row, col;\n\tstatic const double aanscalefactor[DCTSIZE] = {\n\t  1.0, 1.387039845, 1.306562965, 1.175875602,\n\t  1.0, 0.785694958, 0.541196100, 0.275899379\n\t};\n\n\tif (fdct->float_divisors[qtblno] == NULL) {\n\t  fdct->float_divisors[qtblno] = (FAST_FLOAT *)\n\t    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t\tDCTSIZE2 * SIZEOF(FAST_FLOAT));\n\t}\n\tfdtbl = fdct->float_divisors[qtblno];\n\ti = 0;\n\tfor (row = 0; row < DCTSIZE; row++) {\n\t  for (col = 0; col < DCTSIZE; col++) {\n\t    fdtbl[i] = (FAST_FLOAT)\n\t      (1.0 / (((double) qtbl->quantval[i] *\n\t\t       aanscalefactor[row] * aanscalefactor[col] * 8.0)));\n\t    i++;\n\t  }\n\t}\n      }\n      fdct->pub.forward_DCT[ci] = forward_DCT_float;\n      break;\n#endif\n    default:\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n      break;\n    }\n  }\n}\n\n\n/*\n * Initialize FDCT manager.\n */\n\nGLOBAL(void)\njinit_forward_dct (j_compress_ptr cinfo)\n{\n  my_fdct_ptr fdct;\n  int i;\n\n  fdct = (my_fdct_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_fdct_controller));\n  cinfo->fdct = (struct jpeg_forward_dct *) fdct;\n  fdct->pub.start_pass = start_pass_fdctmgr;\n\n  /* Mark divisor tables unallocated */\n  for (i = 0; i < NUM_QUANT_TBLS; i++) {\n    fdct->divisors[i] = NULL;\n#ifdef DCT_FLOAT_SUPPORTED\n    fdct->float_divisors[i] = NULL;\n#endif\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jchuff.c",
    "content": "/*\n * jchuff.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 2006-2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains Huffman entropy encoding routines.\n * Both sequential and progressive modes are supported in this single module.\n *\n * Much of the complexity here has to do with supporting output suspension.\n * If the data destination module demands suspension, we want to be able to\n * back up to the start of the current MCU.  To do this, we copy state\n * variables into local working storage, and update them back to the\n * permanent JPEG objects only upon successful completion of an MCU.\n *\n * We do not support output suspension for the progressive JPEG mode, since\n * the library currently does not allow multiple-scan files to be written\n * with output suspension.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* The legal range of a DCT coefficient is\n *  -1024 .. +1023  for 8-bit data;\n * -16384 .. +16383 for 12-bit data.\n * Hence the magnitude should always fit in 10 or 14 bits respectively.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define MAX_COEF_BITS 10\n#else\n#define MAX_COEF_BITS 14\n#endif\n\n/* Derived data constructed for each Huffman table */\n\ntypedef struct {\n  unsigned int ehufco[256];\t/* code for each symbol */\n  char ehufsi[256];\t\t/* length of code for each symbol */\n  /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */\n} c_derived_tbl;\n\n\n/* Expanded entropy encoder object for Huffman encoding.\n *\n * The savable_state subrecord contains fields that change within an MCU,\n * but must not be updated permanently until we complete the MCU.\n */\n\ntypedef struct {\n  INT32 put_buffer;\t\t/* current bit-accumulation buffer */\n  int put_bits;\t\t\t/* # of bits now in it */\n  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */\n} savable_state;\n\n/* This macro is to work around compilers with missing or broken\n * structure assignment.  You'll need to fix this code if you have\n * such a compiler and you change MAX_COMPS_IN_SCAN.\n */\n\n#ifndef NO_STRUCT_ASSIGN\n#define ASSIGN_STATE(dest,src)  ((dest) = (src))\n#else\n#if MAX_COMPS_IN_SCAN == 4\n#define ASSIGN_STATE(dest,src)  \\\n\t((dest).put_buffer = (src).put_buffer, \\\n\t (dest).put_bits = (src).put_bits, \\\n\t (dest).last_dc_val[0] = (src).last_dc_val[0], \\\n\t (dest).last_dc_val[1] = (src).last_dc_val[1], \\\n\t (dest).last_dc_val[2] = (src).last_dc_val[2], \\\n\t (dest).last_dc_val[3] = (src).last_dc_val[3])\n#endif\n#endif\n\n\ntypedef struct {\n  struct jpeg_entropy_encoder pub; /* public fields */\n\n  savable_state saved;\t\t/* Bit buffer & DC state at start of MCU */\n\n  /* These fields are NOT loaded into local working state. */\n  unsigned int restarts_to_go;\t/* MCUs left in this restart interval */\n  int next_restart_num;\t\t/* next restart number to write (0-7) */\n\n  /* Pointers to derived tables (these workspaces have image lifespan) */\n  c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];\n  c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];\n\n  /* Statistics tables for optimization */\n  long * dc_count_ptrs[NUM_HUFF_TBLS];\n  long * ac_count_ptrs[NUM_HUFF_TBLS];\n\n  /* Following fields used only in progressive mode */\n\n  /* Mode flag: TRUE for optimization, FALSE for actual data output */\n  boolean gather_statistics;\n\n  /* next_output_byte/free_in_buffer are local copies of cinfo->dest fields.\n   */\n  JOCTET * next_output_byte;\t/* => next byte to write in buffer */\n  size_t free_in_buffer;\t/* # of byte spaces remaining in buffer */\n  j_compress_ptr cinfo;\t\t/* link to cinfo (needed for dump_buffer) */\n\n  /* Coding status for AC components */\n  int ac_tbl_no;\t\t/* the table number of the single component */\n  unsigned int EOBRUN;\t\t/* run length of EOBs */\n  unsigned int BE;\t\t/* # of buffered correction bits before MCU */\n  char * bit_buffer;\t\t/* buffer for correction bits (1 per char) */\n  /* packing correction bits tightly would save some space but cost time... */\n} huff_entropy_encoder;\n\ntypedef huff_entropy_encoder * huff_entropy_ptr;\n\n/* Working state while writing an MCU (sequential mode).\n * This struct contains all the fields that are needed by subroutines.\n */\n\ntypedef struct {\n  JOCTET * next_output_byte;\t/* => next byte to write in buffer */\n  size_t free_in_buffer;\t/* # of byte spaces remaining in buffer */\n  savable_state cur;\t\t/* Current bit buffer & DC state */\n  j_compress_ptr cinfo;\t\t/* dump_buffer needs access to this */\n} working_state;\n\n/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit\n * buffer can hold.  Larger sizes may slightly improve compression, but\n * 1000 is already well into the realm of overkill.\n * The minimum safe size is 64 bits.\n */\n\n#define MAX_CORR_BITS  1000\t/* Max # of correction bits I can buffer */\n\n/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.\n * We assume that int right shift is unsigned if INT32 right shift is,\n * which should be safe.\n */\n\n#ifdef RIGHT_SHIFT_IS_UNSIGNED\n#define ISHIFT_TEMPS\tint ishift_temp;\n#define IRIGHT_SHIFT(x,shft)  \\\n\t((ishift_temp = (x)) < 0 ? \\\n\t (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \\\n\t (ishift_temp >> (shft)))\n#else\n#define ISHIFT_TEMPS\n#define IRIGHT_SHIFT(x,shft)\t((x) >> (shft))\n#endif\n\n\n/*\n * Compute the derived values for a Huffman table.\n * This routine also performs some validation checks on the table.\n */\n\nLOCAL(void)\njpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,\n\t\t\t c_derived_tbl ** pdtbl)\n{\n  JHUFF_TBL *htbl;\n  c_derived_tbl *dtbl;\n  int p, i, l, lastp, si, maxsymbol;\n  char huffsize[257];\n  unsigned int huffcode[257];\n  unsigned int code;\n\n  /* Note that huffsize[] and huffcode[] are filled in code-length order,\n   * paralleling the order of the symbols themselves in htbl->huffval[].\n   */\n\n  /* Find the input Huffman table */\n  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);\n  htbl =\n    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];\n  if (htbl == NULL)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);\n\n  /* Allocate a workspace if we haven't already done so. */\n  if (*pdtbl == NULL)\n    *pdtbl = (c_derived_tbl *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(c_derived_tbl));\n  dtbl = *pdtbl;\n  \n  /* Figure C.1: make table of Huffman code length for each symbol */\n\n  p = 0;\n  for (l = 1; l <= 16; l++) {\n    i = (int) htbl->bits[l];\n    if (i < 0 || p + i > 256)\t/* protect against table overrun */\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    while (i--)\n      huffsize[p++] = (char) l;\n  }\n  huffsize[p] = 0;\n  lastp = p;\n  \n  /* Figure C.2: generate the codes themselves */\n  /* We also validate that the counts represent a legal Huffman code tree. */\n\n  code = 0;\n  si = huffsize[0];\n  p = 0;\n  while (huffsize[p]) {\n    while (((int) huffsize[p]) == si) {\n      huffcode[p++] = code;\n      code++;\n    }\n    /* code is now 1 more than the last code used for codelength si; but\n     * it must still fit in si bits, since no code is allowed to be all ones.\n     */\n    if (((INT32) code) >= (((INT32) 1) << si))\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    code <<= 1;\n    si++;\n  }\n  \n  /* Figure C.3: generate encoding tables */\n  /* These are code and size indexed by symbol value */\n\n  /* Set all codeless symbols to have code length 0;\n   * this lets us detect duplicate VAL entries here, and later\n   * allows emit_bits to detect any attempt to emit such symbols.\n   */\n  MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));\n\n  /* This is also a convenient place to check for out-of-range\n   * and duplicated VAL entries.  We allow 0..255 for AC symbols\n   * but only 0..15 for DC.  (We could constrain them further\n   * based on data depth and mode, but this seems enough.)\n   */\n  maxsymbol = isDC ? 15 : 255;\n\n  for (p = 0; p < lastp; p++) {\n    i = htbl->huffval[p];\n    if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    dtbl->ehufco[i] = huffcode[p];\n    dtbl->ehufsi[i] = huffsize[p];\n  }\n}\n\n\n/* Outputting bytes to the file.\n * NB: these must be called only when actually outputting,\n * that is, entropy->gather_statistics == FALSE.\n */\n\n/* Emit a byte, taking 'action' if must suspend. */\n#define emit_byte_s(state,val,action)  \\\n\t{ *(state)->next_output_byte++ = (JOCTET) (val);  \\\n\t  if (--(state)->free_in_buffer == 0)  \\\n\t    if (! dump_buffer_s(state))  \\\n\t      { action; } }\n\n/* Emit a byte */\n#define emit_byte_e(entropy,val)  \\\n\t{ *(entropy)->next_output_byte++ = (JOCTET) (val);  \\\n\t  if (--(entropy)->free_in_buffer == 0)  \\\n\t    dump_buffer_e(entropy); }\n\n\nLOCAL(boolean)\ndump_buffer_s (working_state * state)\n/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */\n{\n  struct jpeg_destination_mgr * dest = state->cinfo->dest;\n\n  if (! (*dest->empty_output_buffer) (state->cinfo))\n    return FALSE;\n  /* After a successful buffer dump, must reset buffer pointers */\n  state->next_output_byte = dest->next_output_byte;\n  state->free_in_buffer = dest->free_in_buffer;\n  return TRUE;\n}\n\n\nLOCAL(void)\ndump_buffer_e (huff_entropy_ptr entropy)\n/* Empty the output buffer; we do not support suspension in this case. */\n{\n  struct jpeg_destination_mgr * dest = entropy->cinfo->dest;\n\n  if (! (*dest->empty_output_buffer) (entropy->cinfo))\n    ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);\n  /* After a successful buffer dump, must reset buffer pointers */\n  entropy->next_output_byte = dest->next_output_byte;\n  entropy->free_in_buffer = dest->free_in_buffer;\n}\n\n\n/* Outputting bits to the file */\n\n/* Only the right 24 bits of put_buffer are used; the valid bits are\n * left-justified in this part.  At most 16 bits can be passed to emit_bits\n * in one call, and we never retain more than 7 bits in put_buffer\n * between calls, so 24 bits are sufficient.\n */\n\nINLINE\nLOCAL(boolean)\nemit_bits_s (working_state * state, unsigned int code, int size)\n/* Emit some bits; return TRUE if successful, FALSE if must suspend */\n{\n  /* This routine is heavily used, so it's worth coding tightly. */\n  register INT32 put_buffer = (INT32) code;\n  register int put_bits = state->cur.put_bits;\n\n  /* if size is 0, caller used an invalid Huffman table entry */\n  if (size == 0)\n    ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);\n\n  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */\n  \n  put_bits += size;\t\t/* new number of bits in buffer */\n  \n  put_buffer <<= 24 - put_bits; /* align incoming bits */\n\n  put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */\n  \n  while (put_bits >= 8) {\n    int c = (int) ((put_buffer >> 16) & 0xFF);\n    \n    emit_byte_s(state, c, return FALSE);\n    if (c == 0xFF) {\t\t/* need to stuff a zero byte? */\n      emit_byte_s(state, 0, return FALSE);\n    }\n    put_buffer <<= 8;\n    put_bits -= 8;\n  }\n\n  state->cur.put_buffer = put_buffer; /* update state variables */\n  state->cur.put_bits = put_bits;\n\n  return TRUE;\n}\n\n\nINLINE\nLOCAL(void)\nemit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size)\n/* Emit some bits, unless we are in gather mode */\n{\n  /* This routine is heavily used, so it's worth coding tightly. */\n  register INT32 put_buffer = (INT32) code;\n  register int put_bits = entropy->saved.put_bits;\n\n  /* if size is 0, caller used an invalid Huffman table entry */\n  if (size == 0)\n    ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);\n\n  if (entropy->gather_statistics)\n    return;\t\t\t/* do nothing if we're only getting stats */\n\n  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */\n  \n  put_bits += size;\t\t/* new number of bits in buffer */\n\n  put_buffer <<= 24 - put_bits; /* align incoming bits */\n\n  /* and merge with old buffer contents */\n  put_buffer |= entropy->saved.put_buffer;\n\n  while (put_bits >= 8) {\n    int c = (int) ((put_buffer >> 16) & 0xFF);\n\n    emit_byte_e(entropy, c);\n    if (c == 0xFF) {\t\t/* need to stuff a zero byte? */\n      emit_byte_e(entropy, 0);\n    }\n    put_buffer <<= 8;\n    put_bits -= 8;\n  }\n\n  entropy->saved.put_buffer = put_buffer; /* update variables */\n  entropy->saved.put_bits = put_bits;\n}\n\n\nLOCAL(boolean)\nflush_bits_s (working_state * state)\n{\n  if (! emit_bits_s(state, 0x7F, 7)) /* fill any partial byte with ones */\n    return FALSE;\n  state->cur.put_buffer = 0;\t     /* and reset bit-buffer to empty */\n  state->cur.put_bits = 0;\n  return TRUE;\n}\n\n\nLOCAL(void)\nflush_bits_e (huff_entropy_ptr entropy)\n{\n  emit_bits_e(entropy, 0x7F, 7); /* fill any partial byte with ones */\n  entropy->saved.put_buffer = 0; /* and reset bit-buffer to empty */\n  entropy->saved.put_bits = 0;\n}\n\n\n/*\n * Emit (or just count) a Huffman symbol.\n */\n\nINLINE\nLOCAL(void)\nemit_dc_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol)\n{\n  if (entropy->gather_statistics)\n    entropy->dc_count_ptrs[tbl_no][symbol]++;\n  else {\n    c_derived_tbl * tbl = entropy->dc_derived_tbls[tbl_no];\n    emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);\n  }\n}\n\n\nINLINE\nLOCAL(void)\nemit_ac_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol)\n{\n  if (entropy->gather_statistics)\n    entropy->ac_count_ptrs[tbl_no][symbol]++;\n  else {\n    c_derived_tbl * tbl = entropy->ac_derived_tbls[tbl_no];\n    emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);\n  }\n}\n\n\n/*\n * Emit bits from a correction bit buffer.\n */\n\nLOCAL(void)\nemit_buffered_bits (huff_entropy_ptr entropy, char * bufstart,\n\t\t    unsigned int nbits)\n{\n  if (entropy->gather_statistics)\n    return;\t\t\t/* no real work */\n\n  while (nbits > 0) {\n    emit_bits_e(entropy, (unsigned int) (*bufstart), 1);\n    bufstart++;\n    nbits--;\n  }\n}\n\n\n/*\n * Emit any pending EOBRUN symbol.\n */\n\nLOCAL(void)\nemit_eobrun (huff_entropy_ptr entropy)\n{\n  register int temp, nbits;\n\n  if (entropy->EOBRUN > 0) {\t/* if there is any pending EOBRUN */\n    temp = entropy->EOBRUN;\n    nbits = 0;\n    while ((temp >>= 1))\n      nbits++;\n    /* safety check: shouldn't happen given limited correction-bit buffer */\n    if (nbits > 14)\n      ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);\n\n    emit_ac_symbol(entropy, entropy->ac_tbl_no, nbits << 4);\n    if (nbits)\n      emit_bits_e(entropy, entropy->EOBRUN, nbits);\n\n    entropy->EOBRUN = 0;\n\n    /* Emit any buffered correction bits */\n    emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);\n    entropy->BE = 0;\n  }\n}\n\n\n/*\n * Emit a restart marker & resynchronize predictions.\n */\n\nLOCAL(boolean)\nemit_restart_s (working_state * state, int restart_num)\n{\n  int ci;\n\n  if (! flush_bits_s(state))\n    return FALSE;\n\n  emit_byte_s(state, 0xFF, return FALSE);\n  emit_byte_s(state, JPEG_RST0 + restart_num, return FALSE);\n\n  /* Re-initialize DC predictions to 0 */\n  for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)\n    state->cur.last_dc_val[ci] = 0;\n\n  /* The restart counter is not updated until we successfully write the MCU. */\n\n  return TRUE;\n}\n\n\nLOCAL(void)\nemit_restart_e (huff_entropy_ptr entropy, int restart_num)\n{\n  int ci;\n\n  emit_eobrun(entropy);\n\n  if (! entropy->gather_statistics) {\n    flush_bits_e(entropy);\n    emit_byte_e(entropy, 0xFF);\n    emit_byte_e(entropy, JPEG_RST0 + restart_num);\n  }\n\n  if (entropy->cinfo->Ss == 0) {\n    /* Re-initialize DC predictions to 0 */\n    for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)\n      entropy->saved.last_dc_val[ci] = 0;\n  } else {\n    /* Re-initialize all AC-related fields to 0 */\n    entropy->EOBRUN = 0;\n    entropy->BE = 0;\n  }\n}\n\n\n/*\n * MCU encoding for DC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\nencode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  register int temp, temp2;\n  register int nbits;\n  int blkn, ci;\n  int Al = cinfo->Al;\n  JBLOCKROW block;\n  jpeg_component_info * compptr;\n  ISHIFT_TEMPS\n\n  entropy->next_output_byte = cinfo->dest->next_output_byte;\n  entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval)\n    if (entropy->restarts_to_go == 0)\n      emit_restart_e(entropy, entropy->next_restart_num);\n\n  /* Encode the MCU data blocks */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n    ci = cinfo->MCU_membership[blkn];\n    compptr = cinfo->cur_comp_info[ci];\n\n    /* Compute the DC value after the required point transform by Al.\n     * This is simply an arithmetic right shift.\n     */\n    temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);\n\n    /* DC differences are figured on the point-transformed values. */\n    temp = temp2 - entropy->saved.last_dc_val[ci];\n    entropy->saved.last_dc_val[ci] = temp2;\n\n    /* Encode the DC coefficient difference per section G.1.2.1 */\n    temp2 = temp;\n    if (temp < 0) {\n      temp = -temp;\t\t/* temp is abs value of input */\n      /* For a negative input, want temp2 = bitwise complement of abs(input) */\n      /* This code assumes we are on a two's complement machine */\n      temp2--;\n    }\n    \n    /* Find the number of bits needed for the magnitude of the coefficient */\n    nbits = 0;\n    while (temp) {\n      nbits++;\n      temp >>= 1;\n    }\n    /* Check for out-of-range coefficient values.\n     * Since we're encoding a difference, the range limit is twice as much.\n     */\n    if (nbits > MAX_COEF_BITS+1)\n      ERREXIT(cinfo, JERR_BAD_DCT_COEF);\n    \n    /* Count/emit the Huffman-coded symbol for the number of bits */\n    emit_dc_symbol(entropy, compptr->dc_tbl_no, nbits);\n    \n    /* Emit that number of bits of the value, if positive, */\n    /* or the complement of its magnitude, if negative. */\n    if (nbits)\t\t\t/* emit_bits rejects calls with size 0 */\n      emit_bits_e(entropy, (unsigned int) temp2, nbits);\n  }\n\n  cinfo->dest->next_output_byte = entropy->next_output_byte;\n  cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU encoding for AC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\nencode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  register int temp, temp2;\n  register int nbits;\n  register int r, k;\n  int Se, Al;\n  const int * natural_order;\n  JBLOCKROW block;\n\n  entropy->next_output_byte = cinfo->dest->next_output_byte;\n  entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval)\n    if (entropy->restarts_to_go == 0)\n      emit_restart_e(entropy, entropy->next_restart_num);\n\n  Se = cinfo->Se;\n  Al = cinfo->Al;\n  natural_order = cinfo->natural_order;\n\n  /* Encode the MCU data block */\n  block = MCU_data[0];\n\n  /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */\n  \n  r = 0;\t\t\t/* r = run length of zeros */\n   \n  for (k = cinfo->Ss; k <= Se; k++) {\n    if ((temp = (*block)[natural_order[k]]) == 0) {\n      r++;\n      continue;\n    }\n    /* We must apply the point transform by Al.  For AC coefficients this\n     * is an integer division with rounding towards 0.  To do this portably\n     * in C, we shift after obtaining the absolute value; so the code is\n     * interwoven with finding the abs value (temp) and output bits (temp2).\n     */\n    if (temp < 0) {\n      temp = -temp;\t\t/* temp is abs value of input */\n      temp >>= Al;\t\t/* apply the point transform */\n      /* For a negative coef, want temp2 = bitwise complement of abs(coef) */\n      temp2 = ~temp;\n    } else {\n      temp >>= Al;\t\t/* apply the point transform */\n      temp2 = temp;\n    }\n    /* Watch out for case that nonzero coef is zero after point transform */\n    if (temp == 0) {\n      r++;\n      continue;\n    }\n\n    /* Emit any pending EOBRUN */\n    if (entropy->EOBRUN > 0)\n      emit_eobrun(entropy);\n    /* if run length > 15, must emit special run-length-16 codes (0xF0) */\n    while (r > 15) {\n      emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0);\n      r -= 16;\n    }\n\n    /* Find the number of bits needed for the magnitude of the coefficient */\n    nbits = 1;\t\t\t/* there must be at least one 1 bit */\n    while ((temp >>= 1))\n      nbits++;\n    /* Check for out-of-range coefficient values */\n    if (nbits > MAX_COEF_BITS)\n      ERREXIT(cinfo, JERR_BAD_DCT_COEF);\n\n    /* Count/emit Huffman symbol for run length / number of bits */\n    emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);\n\n    /* Emit that number of bits of the value, if positive, */\n    /* or the complement of its magnitude, if negative. */\n    emit_bits_e(entropy, (unsigned int) temp2, nbits);\n\n    r = 0;\t\t\t/* reset zero run length */\n  }\n\n  if (r > 0) {\t\t\t/* If there are trailing zeroes, */\n    entropy->EOBRUN++;\t\t/* count an EOB */\n    if (entropy->EOBRUN == 0x7FFF)\n      emit_eobrun(entropy);\t/* force it out to avoid overflow */\n  }\n\n  cinfo->dest->next_output_byte = entropy->next_output_byte;\n  cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU encoding for DC successive approximation refinement scan.\n * Note: we assume such scans can be multi-component, although the spec\n * is not very clear on the point.\n */\n\nMETHODDEF(boolean)\nencode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  register int temp;\n  int blkn;\n  int Al = cinfo->Al;\n  JBLOCKROW block;\n\n  entropy->next_output_byte = cinfo->dest->next_output_byte;\n  entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval)\n    if (entropy->restarts_to_go == 0)\n      emit_restart_e(entropy, entropy->next_restart_num);\n\n  /* Encode the MCU data blocks */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n\n    /* We simply emit the Al'th bit of the DC coefficient value. */\n    temp = (*block)[0];\n    emit_bits_e(entropy, (unsigned int) (temp >> Al), 1);\n  }\n\n  cinfo->dest->next_output_byte = entropy->next_output_byte;\n  cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU encoding for AC successive approximation refinement scan.\n */\n\nMETHODDEF(boolean)\nencode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  register int temp;\n  register int r, k;\n  int EOB;\n  char *BR_buffer;\n  unsigned int BR;\n  int Se, Al;\n  const int * natural_order;\n  JBLOCKROW block;\n  int absvalues[DCTSIZE2];\n\n  entropy->next_output_byte = cinfo->dest->next_output_byte;\n  entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval)\n    if (entropy->restarts_to_go == 0)\n      emit_restart_e(entropy, entropy->next_restart_num);\n\n  Se = cinfo->Se;\n  Al = cinfo->Al;\n  natural_order = cinfo->natural_order;\n\n  /* Encode the MCU data block */\n  block = MCU_data[0];\n\n  /* It is convenient to make a pre-pass to determine the transformed\n   * coefficients' absolute values and the EOB position.\n   */\n  EOB = 0;\n  for (k = cinfo->Ss; k <= Se; k++) {\n    temp = (*block)[natural_order[k]];\n    /* We must apply the point transform by Al.  For AC coefficients this\n     * is an integer division with rounding towards 0.  To do this portably\n     * in C, we shift after obtaining the absolute value.\n     */\n    if (temp < 0)\n      temp = -temp;\t\t/* temp is abs value of input */\n    temp >>= Al;\t\t/* apply the point transform */\n    absvalues[k] = temp;\t/* save abs value for main pass */\n    if (temp == 1)\n      EOB = k;\t\t\t/* EOB = index of last newly-nonzero coef */\n  }\n\n  /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */\n  \n  r = 0;\t\t\t/* r = run length of zeros */\n  BR = 0;\t\t\t/* BR = count of buffered bits added now */\n  BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */\n\n  for (k = cinfo->Ss; k <= Se; k++) {\n    if ((temp = absvalues[k]) == 0) {\n      r++;\n      continue;\n    }\n\n    /* Emit any required ZRLs, but not if they can be folded into EOB */\n    while (r > 15 && k <= EOB) {\n      /* emit any pending EOBRUN and the BE correction bits */\n      emit_eobrun(entropy);\n      /* Emit ZRL */\n      emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0);\n      r -= 16;\n      /* Emit buffered correction bits that must be associated with ZRL */\n      emit_buffered_bits(entropy, BR_buffer, BR);\n      BR_buffer = entropy->bit_buffer; /* BE bits are gone now */\n      BR = 0;\n    }\n\n    /* If the coef was previously nonzero, it only needs a correction bit.\n     * NOTE: a straight translation of the spec's figure G.7 would suggest\n     * that we also need to test r > 15.  But if r > 15, we can only get here\n     * if k > EOB, which implies that this coefficient is not 1.\n     */\n    if (temp > 1) {\n      /* The correction bit is the next bit of the absolute value. */\n      BR_buffer[BR++] = (char) (temp & 1);\n      continue;\n    }\n\n    /* Emit any pending EOBRUN and the BE correction bits */\n    emit_eobrun(entropy);\n\n    /* Count/emit Huffman symbol for run length / number of bits */\n    emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);\n\n    /* Emit output bit for newly-nonzero coef */\n    temp = ((*block)[natural_order[k]] < 0) ? 0 : 1;\n    emit_bits_e(entropy, (unsigned int) temp, 1);\n\n    /* Emit buffered correction bits that must be associated with this code */\n    emit_buffered_bits(entropy, BR_buffer, BR);\n    BR_buffer = entropy->bit_buffer; /* BE bits are gone now */\n    BR = 0;\n    r = 0;\t\t\t/* reset zero run length */\n  }\n\n  if (r > 0 || BR > 0) {\t/* If there are trailing zeroes, */\n    entropy->EOBRUN++;\t\t/* count an EOB */\n    entropy->BE += BR;\t\t/* concat my correction bits to older ones */\n    /* We force out the EOB if we risk either:\n     * 1. overflow of the EOB counter;\n     * 2. overflow of the correction bit buffer during the next MCU.\n     */\n    if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))\n      emit_eobrun(entropy);\n  }\n\n  cinfo->dest->next_output_byte = entropy->next_output_byte;\n  cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/* Encode a single block's worth of coefficients */\n\nLOCAL(boolean)\nencode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,\n\t\t  c_derived_tbl *dctbl, c_derived_tbl *actbl)\n{\n  register int temp, temp2;\n  register int nbits;\n  register int k, r, i;\n  int Se = state->cinfo->lim_Se;\n  const int * natural_order = state->cinfo->natural_order;\n\n  /* Encode the DC coefficient difference per section F.1.2.1 */\n\n  temp = temp2 = block[0] - last_dc_val;\n\n  if (temp < 0) {\n    temp = -temp;\t\t/* temp is abs value of input */\n    /* For a negative input, want temp2 = bitwise complement of abs(input) */\n    /* This code assumes we are on a two's complement machine */\n    temp2--;\n  }\n\n  /* Find the number of bits needed for the magnitude of the coefficient */\n  nbits = 0;\n  while (temp) {\n    nbits++;\n    temp >>= 1;\n  }\n  /* Check for out-of-range coefficient values.\n   * Since we're encoding a difference, the range limit is twice as much.\n   */\n  if (nbits > MAX_COEF_BITS+1)\n    ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);\n\n  /* Emit the Huffman-coded symbol for the number of bits */\n  if (! emit_bits_s(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))\n    return FALSE;\n\n  /* Emit that number of bits of the value, if positive, */\n  /* or the complement of its magnitude, if negative. */\n  if (nbits)\t\t\t/* emit_bits rejects calls with size 0 */\n    if (! emit_bits_s(state, (unsigned int) temp2, nbits))\n      return FALSE;\n\n  /* Encode the AC coefficients per section F.1.2.2 */\n\n  r = 0;\t\t\t/* r = run length of zeros */\n\n  for (k = 1; k <= Se; k++) {\n    if ((temp = block[natural_order[k]]) == 0) {\n      r++;\n    } else {\n      /* if run length > 15, must emit special run-length-16 codes (0xF0) */\n      while (r > 15) {\n\tif (! emit_bits_s(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))\n\t  return FALSE;\n\tr -= 16;\n      }\n\n      temp2 = temp;\n      if (temp < 0) {\n\ttemp = -temp;\t\t/* temp is abs value of input */\n\t/* This code assumes we are on a two's complement machine */\n\ttemp2--;\n      }\n\n      /* Find the number of bits needed for the magnitude of the coefficient */\n      nbits = 1;\t\t/* there must be at least one 1 bit */\n      while ((temp >>= 1))\n\tnbits++;\n      /* Check for out-of-range coefficient values */\n      if (nbits > MAX_COEF_BITS)\n\tERREXIT(state->cinfo, JERR_BAD_DCT_COEF);\n\n      /* Emit Huffman symbol for run length / number of bits */\n      i = (r << 4) + nbits;\n      if (! emit_bits_s(state, actbl->ehufco[i], actbl->ehufsi[i]))\n\treturn FALSE;\n\n      /* Emit that number of bits of the value, if positive, */\n      /* or the complement of its magnitude, if negative. */\n      if (! emit_bits_s(state, (unsigned int) temp2, nbits))\n\treturn FALSE;\n\n      r = 0;\n    }\n  }\n\n  /* If the last coef(s) were zero, emit an end-of-block code */\n  if (r > 0)\n    if (! emit_bits_s(state, actbl->ehufco[0], actbl->ehufsi[0]))\n      return FALSE;\n\n  return TRUE;\n}\n\n\n/*\n * Encode and output one MCU's worth of Huffman-compressed coefficients.\n */\n\nMETHODDEF(boolean)\nencode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  working_state state;\n  int blkn, ci;\n  jpeg_component_info * compptr;\n\n  /* Load up working state */\n  state.next_output_byte = cinfo->dest->next_output_byte;\n  state.free_in_buffer = cinfo->dest->free_in_buffer;\n  ASSIGN_STATE(state.cur, entropy->saved);\n  state.cinfo = cinfo;\n\n  /* Emit restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! emit_restart_s(&state, entropy->next_restart_num))\n\treturn FALSE;\n  }\n\n  /* Encode the MCU data blocks */\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    ci = cinfo->MCU_membership[blkn];\n    compptr = cinfo->cur_comp_info[ci];\n    if (! encode_one_block(&state,\n\t\t\t   MCU_data[blkn][0], state.cur.last_dc_val[ci],\n\t\t\t   entropy->dc_derived_tbls[compptr->dc_tbl_no],\n\t\t\t   entropy->ac_derived_tbls[compptr->ac_tbl_no]))\n      return FALSE;\n    /* Update last_dc_val */\n    state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];\n  }\n\n  /* Completed MCU, so update state */\n  cinfo->dest->next_output_byte = state.next_output_byte;\n  cinfo->dest->free_in_buffer = state.free_in_buffer;\n  ASSIGN_STATE(entropy->saved, state.cur);\n\n  /* Update restart-interval state too */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      entropy->restarts_to_go = cinfo->restart_interval;\n      entropy->next_restart_num++;\n      entropy->next_restart_num &= 7;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * Finish up at the end of a Huffman-compressed scan.\n */\n\nMETHODDEF(void)\nfinish_pass_huff (j_compress_ptr cinfo)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  working_state state;\n\n  if (cinfo->progressive_mode) {\n    entropy->next_output_byte = cinfo->dest->next_output_byte;\n    entropy->free_in_buffer = cinfo->dest->free_in_buffer;\n\n    /* Flush out any buffered data */\n    emit_eobrun(entropy);\n    flush_bits_e(entropy);\n\n    cinfo->dest->next_output_byte = entropy->next_output_byte;\n    cinfo->dest->free_in_buffer = entropy->free_in_buffer;\n  } else {\n    /* Load up working state ... flush_bits needs it */\n    state.next_output_byte = cinfo->dest->next_output_byte;\n    state.free_in_buffer = cinfo->dest->free_in_buffer;\n    ASSIGN_STATE(state.cur, entropy->saved);\n    state.cinfo = cinfo;\n\n    /* Flush out the last data */\n    if (! flush_bits_s(&state))\n      ERREXIT(cinfo, JERR_CANT_SUSPEND);\n\n    /* Update state */\n    cinfo->dest->next_output_byte = state.next_output_byte;\n    cinfo->dest->free_in_buffer = state.free_in_buffer;\n    ASSIGN_STATE(entropy->saved, state.cur);\n  }\n}\n\n\n/*\n * Huffman coding optimization.\n *\n * We first scan the supplied data and count the number of uses of each symbol\n * that is to be Huffman-coded. (This process MUST agree with the code above.)\n * Then we build a Huffman coding tree for the observed counts.\n * Symbols which are not needed at all for the particular image are not\n * assigned any code, which saves space in the DHT marker as well as in\n * the compressed data.\n */\n\n\n/* Process a single block's worth of coefficients */\n\nLOCAL(void)\nhtest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,\n\t\t long dc_counts[], long ac_counts[])\n{\n  register int temp;\n  register int nbits;\n  register int k, r;\n  int Se = cinfo->lim_Se;\n  const int * natural_order = cinfo->natural_order;\n  \n  /* Encode the DC coefficient difference per section F.1.2.1 */\n  \n  temp = block[0] - last_dc_val;\n  if (temp < 0)\n    temp = -temp;\n  \n  /* Find the number of bits needed for the magnitude of the coefficient */\n  nbits = 0;\n  while (temp) {\n    nbits++;\n    temp >>= 1;\n  }\n  /* Check for out-of-range coefficient values.\n   * Since we're encoding a difference, the range limit is twice as much.\n   */\n  if (nbits > MAX_COEF_BITS+1)\n    ERREXIT(cinfo, JERR_BAD_DCT_COEF);\n\n  /* Count the Huffman symbol for the number of bits */\n  dc_counts[nbits]++;\n  \n  /* Encode the AC coefficients per section F.1.2.2 */\n  \n  r = 0;\t\t\t/* r = run length of zeros */\n  \n  for (k = 1; k <= Se; k++) {\n    if ((temp = block[natural_order[k]]) == 0) {\n      r++;\n    } else {\n      /* if run length > 15, must emit special run-length-16 codes (0xF0) */\n      while (r > 15) {\n\tac_counts[0xF0]++;\n\tr -= 16;\n      }\n      \n      /* Find the number of bits needed for the magnitude of the coefficient */\n      if (temp < 0)\n\ttemp = -temp;\n      \n      /* Find the number of bits needed for the magnitude of the coefficient */\n      nbits = 1;\t\t/* there must be at least one 1 bit */\n      while ((temp >>= 1))\n\tnbits++;\n      /* Check for out-of-range coefficient values */\n      if (nbits > MAX_COEF_BITS)\n\tERREXIT(cinfo, JERR_BAD_DCT_COEF);\n      \n      /* Count Huffman symbol for run length / number of bits */\n      ac_counts[(r << 4) + nbits]++;\n      \n      r = 0;\n    }\n  }\n\n  /* If the last coef(s) were zero, emit an end-of-block code */\n  if (r > 0)\n    ac_counts[0]++;\n}\n\n\n/*\n * Trial-encode one MCU's worth of Huffman-compressed coefficients.\n * No data is actually output, so no suspension return is possible.\n */\n\nMETHODDEF(boolean)\nencode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int blkn, ci;\n  jpeg_component_info * compptr;\n\n  /* Take care of restart intervals if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0) {\n      /* Re-initialize DC predictions to 0 */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++)\n\tentropy->saved.last_dc_val[ci] = 0;\n      /* Update restart state */\n      entropy->restarts_to_go = cinfo->restart_interval;\n    }\n    entropy->restarts_to_go--;\n  }\n\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    ci = cinfo->MCU_membership[blkn];\n    compptr = cinfo->cur_comp_info[ci];\n    htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],\n\t\t    entropy->dc_count_ptrs[compptr->dc_tbl_no],\n\t\t    entropy->ac_count_ptrs[compptr->ac_tbl_no]);\n    entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];\n  }\n\n  return TRUE;\n}\n\n\n/*\n * Generate the best Huffman code table for the given counts, fill htbl.\n *\n * The JPEG standard requires that no symbol be assigned a codeword of all\n * one bits (so that padding bits added at the end of a compressed segment\n * can't look like a valid code).  Because of the canonical ordering of\n * codewords, this just means that there must be an unused slot in the\n * longest codeword length category.  Section K.2 of the JPEG spec suggests\n * reserving such a slot by pretending that symbol 256 is a valid symbol\n * with count 1.  In theory that's not optimal; giving it count zero but\n * including it in the symbol set anyway should give a better Huffman code.\n * But the theoretically better code actually seems to come out worse in\n * practice, because it produces more all-ones bytes (which incur stuffed\n * zero bytes in the final file).  In any case the difference is tiny.\n *\n * The JPEG standard requires Huffman codes to be no more than 16 bits long.\n * If some symbols have a very small but nonzero probability, the Huffman tree\n * must be adjusted to meet the code length restriction.  We currently use\n * the adjustment method suggested in JPEG section K.2.  This method is *not*\n * optimal; it may not choose the best possible limited-length code.  But\n * typically only very-low-frequency symbols will be given less-than-optimal\n * lengths, so the code is almost optimal.  Experimental comparisons against\n * an optimal limited-length-code algorithm indicate that the difference is\n * microscopic --- usually less than a hundredth of a percent of total size.\n * So the extra complexity of an optimal algorithm doesn't seem worthwhile.\n */\n\nLOCAL(void)\njpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])\n{\n#define MAX_CLEN 32\t\t/* assumed maximum initial code length */\n  UINT8 bits[MAX_CLEN+1];\t/* bits[k] = # of symbols with code length k */\n  int codesize[257];\t\t/* codesize[k] = code length of symbol k */\n  int others[257];\t\t/* next symbol in current branch of tree */\n  int c1, c2;\n  int p, i, j;\n  long v;\n\n  /* This algorithm is explained in section K.2 of the JPEG standard */\n\n  MEMZERO(bits, SIZEOF(bits));\n  MEMZERO(codesize, SIZEOF(codesize));\n  for (i = 0; i < 257; i++)\n    others[i] = -1;\t\t/* init links to empty */\n  \n  freq[256] = 1;\t\t/* make sure 256 has a nonzero count */\n  /* Including the pseudo-symbol 256 in the Huffman procedure guarantees\n   * that no real symbol is given code-value of all ones, because 256\n   * will be placed last in the largest codeword category.\n   */\n\n  /* Huffman's basic algorithm to assign optimal code lengths to symbols */\n\n  for (;;) {\n    /* Find the smallest nonzero frequency, set c1 = its symbol */\n    /* In case of ties, take the larger symbol number */\n    c1 = -1;\n    v = 1000000000L;\n    for (i = 0; i <= 256; i++) {\n      if (freq[i] && freq[i] <= v) {\n\tv = freq[i];\n\tc1 = i;\n      }\n    }\n\n    /* Find the next smallest nonzero frequency, set c2 = its symbol */\n    /* In case of ties, take the larger symbol number */\n    c2 = -1;\n    v = 1000000000L;\n    for (i = 0; i <= 256; i++) {\n      if (freq[i] && freq[i] <= v && i != c1) {\n\tv = freq[i];\n\tc2 = i;\n      }\n    }\n\n    /* Done if we've merged everything into one frequency */\n    if (c2 < 0)\n      break;\n    \n    /* Else merge the two counts/trees */\n    freq[c1] += freq[c2];\n    freq[c2] = 0;\n\n    /* Increment the codesize of everything in c1's tree branch */\n    codesize[c1]++;\n    while (others[c1] >= 0) {\n      c1 = others[c1];\n      codesize[c1]++;\n    }\n    \n    others[c1] = c2;\t\t/* chain c2 onto c1's tree branch */\n    \n    /* Increment the codesize of everything in c2's tree branch */\n    codesize[c2]++;\n    while (others[c2] >= 0) {\n      c2 = others[c2];\n      codesize[c2]++;\n    }\n  }\n\n  /* Now count the number of symbols of each code length */\n  for (i = 0; i <= 256; i++) {\n    if (codesize[i]) {\n      /* The JPEG standard seems to think that this can't happen, */\n      /* but I'm paranoid... */\n      if (codesize[i] > MAX_CLEN)\n\tERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);\n\n      bits[codesize[i]]++;\n    }\n  }\n\n  /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure\n   * Huffman procedure assigned any such lengths, we must adjust the coding.\n   * Here is what the JPEG spec says about how this next bit works:\n   * Since symbols are paired for the longest Huffman code, the symbols are\n   * removed from this length category two at a time.  The prefix for the pair\n   * (which is one bit shorter) is allocated to one of the pair; then,\n   * skipping the BITS entry for that prefix length, a code word from the next\n   * shortest nonzero BITS entry is converted into a prefix for two code words\n   * one bit longer.\n   */\n  \n  for (i = MAX_CLEN; i > 16; i--) {\n    while (bits[i] > 0) {\n      j = i - 2;\t\t/* find length of new prefix to be used */\n      while (bits[j] == 0)\n\tj--;\n      \n      bits[i] -= 2;\t\t/* remove two symbols */\n      bits[i-1]++;\t\t/* one goes in this length */\n      bits[j+1] += 2;\t\t/* two new symbols in this length */\n      bits[j]--;\t\t/* symbol of this length is now a prefix */\n    }\n  }\n\n  /* Remove the count for the pseudo-symbol 256 from the largest codelength */\n  while (bits[i] == 0)\t\t/* find largest codelength still in use */\n    i--;\n  bits[i]--;\n  \n  /* Return final symbol counts (only for lengths 0..16) */\n  MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));\n  \n  /* Return a list of the symbols sorted by code length */\n  /* It's not real clear to me why we don't need to consider the codelength\n   * changes made above, but the JPEG spec seems to think this works.\n   */\n  p = 0;\n  for (i = 1; i <= MAX_CLEN; i++) {\n    for (j = 0; j <= 255; j++) {\n      if (codesize[j] == i) {\n\thtbl->huffval[p] = (UINT8) j;\n\tp++;\n      }\n    }\n  }\n\n  /* Set sent_table FALSE so updated table will be written to JPEG file. */\n  htbl->sent_table = FALSE;\n}\n\n\n/*\n * Finish up a statistics-gathering pass and create the new Huffman tables.\n */\n\nMETHODDEF(void)\nfinish_pass_gather (j_compress_ptr cinfo)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int ci, tbl;\n  jpeg_component_info * compptr;\n  JHUFF_TBL **htblptr;\n  boolean did_dc[NUM_HUFF_TBLS];\n  boolean did_ac[NUM_HUFF_TBLS];\n\n  /* It's important not to apply jpeg_gen_optimal_table more than once\n   * per table, because it clobbers the input frequency counts!\n   */\n  if (cinfo->progressive_mode)\n    /* Flush out buffered data (all we care about is counting the EOB symbol) */\n    emit_eobrun(entropy);\n\n  MEMZERO(did_dc, SIZEOF(did_dc));\n  MEMZERO(did_ac, SIZEOF(did_ac));\n\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    /* DC needs no table for refinement scan */\n    if (cinfo->Ss == 0 && cinfo->Ah == 0) {\n      tbl = compptr->dc_tbl_no;\n      if (! did_dc[tbl]) {\n\thtblptr = & cinfo->dc_huff_tbl_ptrs[tbl];\n\tif (*htblptr == NULL)\n\t  *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);\n\tjpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[tbl]);\n\tdid_dc[tbl] = TRUE;\n      }\n    }\n    /* AC needs no table when not present */\n    if (cinfo->Se) {\n      tbl = compptr->ac_tbl_no;\n      if (! did_ac[tbl]) {\n\thtblptr = & cinfo->ac_huff_tbl_ptrs[tbl];\n\tif (*htblptr == NULL)\n\t  *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);\n\tjpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[tbl]);\n\tdid_ac[tbl] = TRUE;\n      }\n    }\n  }\n}\n\n\n/*\n * Initialize for a Huffman-compressed scan.\n * If gather_statistics is TRUE, we do not output anything during the scan,\n * just count the Huffman symbols used and generate Huffman code tables.\n */\n\nMETHODDEF(void)\nstart_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int ci, tbl;\n  jpeg_component_info * compptr;\n\n  if (gather_statistics)\n    entropy->pub.finish_pass = finish_pass_gather;\n  else\n    entropy->pub.finish_pass = finish_pass_huff;\n\n  if (cinfo->progressive_mode) {\n    entropy->cinfo = cinfo;\n    entropy->gather_statistics = gather_statistics;\n\n    /* We assume jcmaster.c already validated the scan parameters. */\n\n    /* Select execution routine */\n    if (cinfo->Ah == 0) {\n      if (cinfo->Ss == 0)\n\tentropy->pub.encode_mcu = encode_mcu_DC_first;\n      else\n\tentropy->pub.encode_mcu = encode_mcu_AC_first;\n    } else {\n      if (cinfo->Ss == 0)\n\tentropy->pub.encode_mcu = encode_mcu_DC_refine;\n      else {\n\tentropy->pub.encode_mcu = encode_mcu_AC_refine;\n\t/* AC refinement needs a correction bit buffer */\n\tif (entropy->bit_buffer == NULL)\n\t  entropy->bit_buffer = (char *)\n\t    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t\tMAX_CORR_BITS * SIZEOF(char));\n      }\n    }\n\n    /* Initialize AC stuff */\n    entropy->ac_tbl_no = cinfo->cur_comp_info[0]->ac_tbl_no;\n    entropy->EOBRUN = 0;\n    entropy->BE = 0;\n  } else {\n    if (gather_statistics)\n      entropy->pub.encode_mcu = encode_mcu_gather;\n    else\n      entropy->pub.encode_mcu = encode_mcu_huff;\n  }\n\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    /* DC needs no table for refinement scan */\n    if (cinfo->Ss == 0 && cinfo->Ah == 0) {\n      tbl = compptr->dc_tbl_no;\n      if (gather_statistics) {\n\t/* Check for invalid table index */\n\t/* (make_c_derived_tbl does this in the other path) */\n\tif (tbl < 0 || tbl >= NUM_HUFF_TBLS)\n\t  ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);\n\t/* Allocate and zero the statistics tables */\n\t/* Note that jpeg_gen_optimal_table expects 257 entries in each table! */\n\tif (entropy->dc_count_ptrs[tbl] == NULL)\n\t  entropy->dc_count_ptrs[tbl] = (long *)\n\t    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t\t257 * SIZEOF(long));\n\tMEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long));\n      } else {\n\t/* Compute derived values for Huffman tables */\n\t/* We may do this more than once for a table, but it's not expensive */\n\tjpeg_make_c_derived_tbl(cinfo, TRUE, tbl,\n\t\t\t\t& entropy->dc_derived_tbls[tbl]);\n      }\n      /* Initialize DC predictions to 0 */\n      entropy->saved.last_dc_val[ci] = 0;\n    }\n    /* AC needs no table when not present */\n    if (cinfo->Se) {\n      tbl = compptr->ac_tbl_no;\n      if (gather_statistics) {\n\tif (tbl < 0 || tbl >= NUM_HUFF_TBLS)\n\t  ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);\n\tif (entropy->ac_count_ptrs[tbl] == NULL)\n\t  entropy->ac_count_ptrs[tbl] = (long *)\n\t    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t\t257 * SIZEOF(long));\n\tMEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long));\n      } else {\n\tjpeg_make_c_derived_tbl(cinfo, FALSE, tbl,\n\t\t\t\t& entropy->ac_derived_tbls[tbl]);\n      }\n    }\n  }\n\n  /* Initialize bit buffer to empty */\n  entropy->saved.put_buffer = 0;\n  entropy->saved.put_bits = 0;\n\n  /* Initialize restart stuff */\n  entropy->restarts_to_go = cinfo->restart_interval;\n  entropy->next_restart_num = 0;\n}\n\n\n/*\n * Module initialization routine for Huffman entropy encoding.\n */\n\nGLOBAL(void)\njinit_huff_encoder (j_compress_ptr cinfo)\n{\n  huff_entropy_ptr entropy;\n  int i;\n\n  entropy = (huff_entropy_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(huff_entropy_encoder));\n  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;\n  entropy->pub.start_pass = start_pass_huff;\n\n  /* Mark tables unallocated */\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;\n    entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;\n  }\n\n  if (cinfo->progressive_mode)\n    entropy->bit_buffer = NULL;\t/* needed only in AC refinement scan */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcinit.c",
    "content": "/*\n * jcinit.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains initialization logic for the JPEG compressor.\n * This routine is in charge of selecting the modules to be executed and\n * making an initialization call to each one.\n *\n * Logically, this code belongs in jcmaster.c.  It's split out because\n * linking this routine implies linking the entire compression library.\n * For a transcoding-only application, we want to be able to use jcmaster.c\n * without linking in the whole library.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Master selection of compression modules.\n * This is done once at the start of processing an image.  We determine\n * which modules will be used and give them appropriate initialization calls.\n */\n\nGLOBAL(void)\njinit_compress_master (j_compress_ptr cinfo)\n{\n  /* Initialize master control (includes parameter checking/processing) */\n  jinit_c_master_control(cinfo, FALSE /* full compression */);\n\n  /* Preprocessing */\n  if (! cinfo->raw_data_in) {\n    jinit_color_converter(cinfo);\n    jinit_downsampler(cinfo);\n    jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);\n  }\n  /* Forward DCT */\n  jinit_forward_dct(cinfo);\n  /* Entropy encoding: either Huffman or arithmetic coding. */\n  if (cinfo->arith_code)\n    jinit_arith_encoder(cinfo);\n  else {\n    jinit_huff_encoder(cinfo);\n  }\n\n  /* Need a full-image coefficient buffer in any multi-pass mode. */\n  jinit_c_coef_controller(cinfo,\n\t\t(boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));\n  jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);\n\n  jinit_marker_writer(cinfo);\n\n  /* We can now tell the memory manager to allocate virtual arrays. */\n  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);\n\n  /* Write the datastream header (SOI) immediately.\n   * Frame and scan headers are postponed till later.\n   * This lets application insert special markers after the SOI.\n   */\n  (*cinfo->marker->write_file_header) (cinfo);\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcmainct.c",
    "content": "/*\n * jcmainct.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * Modified 2003-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the main buffer controller for compression.\n * The main buffer lies between the pre-processor and the JPEG\n * compressor proper; it holds downsampled data in the JPEG colorspace.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Note: currently, there is no operating mode in which a full-image buffer\n * is needed at this step.  If there were, that mode could not be used with\n * \"raw data\" input, since this module is bypassed in that case.  However,\n * we've left the code here for possible use in special applications.\n */\n#undef FULL_MAIN_BUFFER_SUPPORTED\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_c_main_controller pub; /* public fields */\n\n  JDIMENSION cur_iMCU_row;\t/* number of current iMCU row */\n  JDIMENSION rowgroup_ctr;\t/* counts row groups received in iMCU row */\n  boolean suspended;\t\t/* remember if we suspended output */\n  J_BUF_MODE pass_mode;\t\t/* current operating mode */\n\n  /* If using just a strip buffer, this points to the entire set of buffers\n   * (we allocate one for each component).  In the full-image case, this\n   * points to the currently accessible strips of the virtual arrays.\n   */\n  JSAMPARRAY buffer[MAX_COMPONENTS];\n\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n  /* If using full-image storage, this array holds pointers to virtual-array\n   * control blocks for each component.  Unused if not full-image storage.\n   */\n  jvirt_sarray_ptr whole_image[MAX_COMPONENTS];\n#endif\n} my_main_controller;\n\ntypedef my_main_controller * my_main_ptr;\n\n\n/* Forward declarations */\nMETHODDEF(void) process_data_simple_main\n\tJPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,\n\t     JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\nMETHODDEF(void) process_data_buffer_main\n\tJPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,\n\t     JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));\n#endif\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n\n  /* Do nothing in raw-data mode. */\n  if (cinfo->raw_data_in)\n    return;\n\n  mainp->cur_iMCU_row = 0;\t/* initialize counters */\n  mainp->rowgroup_ctr = 0;\n  mainp->suspended = FALSE;\n  mainp->pass_mode = pass_mode;\t/* save mode for use by process_data */\n\n  switch (pass_mode) {\n  case JBUF_PASS_THRU:\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n    if (mainp->whole_image[0] != NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n#endif\n    mainp->pub.process_data = process_data_simple_main;\n    break;\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n  case JBUF_SAVE_SOURCE:\n  case JBUF_CRANK_DEST:\n  case JBUF_SAVE_AND_PASS:\n    if (mainp->whole_image[0] == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    mainp->pub.process_data = process_data_buffer_main;\n    break;\n#endif\n  default:\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    break;\n  }\n}\n\n\n/*\n * Process some data.\n * This routine handles the simple pass-through mode,\n * where we have only a strip buffer.\n */\n\nMETHODDEF(void)\nprocess_data_simple_main (j_compress_ptr cinfo,\n\t\t\t  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t\t  JDIMENSION in_rows_avail)\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n\n  while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) {\n    /* Read input data if we haven't filled the main buffer yet */\n    if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)\n      (*cinfo->prep->pre_process_data) (cinfo,\n\t\t\t\t\tinput_buf, in_row_ctr, in_rows_avail,\n\t\t\t\t\tmainp->buffer, &mainp->rowgroup_ctr,\n\t\t\t\t\t(JDIMENSION) cinfo->min_DCT_v_scaled_size);\n\n    /* If we don't have a full iMCU row buffered, return to application for\n     * more data.  Note that preprocessor will always pad to fill the iMCU row\n     * at the bottom of the image.\n     */\n    if (mainp->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size)\n      return;\n\n    /* Send the completed row to the compressor */\n    if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) {\n      /* If compressor did not consume the whole row, then we must need to\n       * suspend processing and return to the application.  In this situation\n       * we pretend we didn't yet consume the last input row; otherwise, if\n       * it happened to be the last row of the image, the application would\n       * think we were done.\n       */\n      if (! mainp->suspended) {\n\t(*in_row_ctr)--;\n\tmainp->suspended = TRUE;\n      }\n      return;\n    }\n    /* We did finish the row.  Undo our little suspension hack if a previous\n     * call suspended; then mark the main buffer empty.\n     */\n    if (mainp->suspended) {\n      (*in_row_ctr)++;\n      mainp->suspended = FALSE;\n    }\n    mainp->rowgroup_ctr = 0;\n    mainp->cur_iMCU_row++;\n  }\n}\n\n\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n\n/*\n * Process some data.\n * This routine handles all of the modes that use a full-size buffer.\n */\n\nMETHODDEF(void)\nprocess_data_buffer_main (j_compress_ptr cinfo,\n\t\t\t  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t\t  JDIMENSION in_rows_avail)\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n  int ci;\n  jpeg_component_info *compptr;\n  boolean writing = (mainp->pass_mode != JBUF_CRANK_DEST);\n\n  while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) {\n    /* Realign the virtual buffers if at the start of an iMCU row. */\n    if (mainp->rowgroup_ctr == 0) {\n      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t   ci++, compptr++) {\n\tmainp->buffer[ci] = (*cinfo->mem->access_virt_sarray)\n\t  ((j_common_ptr) cinfo, mainp->whole_image[ci], mainp->cur_iMCU_row *\n\t   ((JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size)),\n\t   (JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size),\n\t   writing);\n      }\n      /* In a read pass, pretend we just read some source data. */\n      if (! writing) {\n\t*in_row_ctr += (JDIMENSION)\n\t  (cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size);\n\tmainp->rowgroup_ctr = (JDIMENSION) cinfo->min_DCT_v_scaled_size;\n      }\n    }\n\n    /* If a write pass, read input data until the current iMCU row is full. */\n    /* Note: preprocessor will pad if necessary to fill the last iMCU row. */\n    if (writing) {\n      (*cinfo->prep->pre_process_data) (cinfo,\n\t\t\t\t\tinput_buf, in_row_ctr, in_rows_avail,\n\t\t\t\t\tmainp->buffer, &mainp->rowgroup_ctr,\n\t\t\t\t\t(JDIMENSION) cinfo->min_DCT_v_scaled_size);\n      /* Return to application if we need more data to fill the iMCU row. */\n      if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)\n\treturn;\n    }\n\n    /* Emit data, unless this is a sink-only pass. */\n    if (mainp->pass_mode != JBUF_SAVE_SOURCE) {\n      if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) {\n\t/* If compressor did not consume the whole row, then we must need to\n\t * suspend processing and return to the application.  In this situation\n\t * we pretend we didn't yet consume the last input row; otherwise, if\n\t * it happened to be the last row of the image, the application would\n\t * think we were done.\n\t */\n\tif (! mainp->suspended) {\n\t  (*in_row_ctr)--;\n\t  mainp->suspended = TRUE;\n\t}\n\treturn;\n      }\n      /* We did finish the row.  Undo our little suspension hack if a previous\n       * call suspended; then mark the main buffer empty.\n       */\n      if (mainp->suspended) {\n\t(*in_row_ctr)++;\n\tmainp->suspended = FALSE;\n      }\n    }\n\n    /* If get here, we are done with this iMCU row.  Mark buffer empty. */\n    mainp->rowgroup_ctr = 0;\n    mainp->cur_iMCU_row++;\n  }\n}\n\n#endif /* FULL_MAIN_BUFFER_SUPPORTED */\n\n\n/*\n * Initialize main buffer controller.\n */\n\nGLOBAL(void)\njinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)\n{\n  my_main_ptr mainp;\n  int ci;\n  jpeg_component_info *compptr;\n\n  mainp = (my_main_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_main_controller));\n  cinfo->main = &mainp->pub;\n  mainp->pub.start_pass = start_pass_main;\n\n  /* We don't need to create a buffer in raw-data mode. */\n  if (cinfo->raw_data_in)\n    return;\n\n  /* Create the buffer.  It holds downsampled data, so each component\n   * may be of a different size.\n   */\n  if (need_full_buffer) {\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n    /* Allocate a full-image virtual array for each component */\n    /* Note we pad the bottom to a multiple of the iMCU height */\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      mainp->whole_image[ci] = (*cinfo->mem->request_virt_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n\t compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),\n\t ((JDIMENSION) jround_up((long) compptr->height_in_blocks,\n\t\t\t\t (long) compptr->v_samp_factor)) *\n\t ((JDIMENSION) cinfo->min_DCT_v_scaled_size),\n\t (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));\n    }\n#else\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n#endif\n  } else {\n#ifdef FULL_MAIN_BUFFER_SUPPORTED\n    mainp->whole_image[0] = NULL; /* flag for no virtual arrays */\n#endif\n    /* Allocate a strip buffer for each component */\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),\n\t (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));\n    }\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcmarker.c",
    "content": "/*\n * jcmarker.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * Modified 2003-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to write JPEG datastream markers.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\ntypedef enum {\t\t\t/* JPEG marker codes */\n  M_SOF0  = 0xc0,\n  M_SOF1  = 0xc1,\n  M_SOF2  = 0xc2,\n  M_SOF3  = 0xc3,\n\n  M_SOF5  = 0xc5,\n  M_SOF6  = 0xc6,\n  M_SOF7  = 0xc7,\n\n  M_JPG   = 0xc8,\n  M_SOF9  = 0xc9,\n  M_SOF10 = 0xca,\n  M_SOF11 = 0xcb,\n\n  M_SOF13 = 0xcd,\n  M_SOF14 = 0xce,\n  M_SOF15 = 0xcf,\n\n  M_DHT   = 0xc4,\n\n  M_DAC   = 0xcc,\n\n  M_RST0  = 0xd0,\n  M_RST1  = 0xd1,\n  M_RST2  = 0xd2,\n  M_RST3  = 0xd3,\n  M_RST4  = 0xd4,\n  M_RST5  = 0xd5,\n  M_RST6  = 0xd6,\n  M_RST7  = 0xd7,\n\n  M_SOI   = 0xd8,\n  M_EOI   = 0xd9,\n  M_SOS   = 0xda,\n  M_DQT   = 0xdb,\n  M_DNL   = 0xdc,\n  M_DRI   = 0xdd,\n  M_DHP   = 0xde,\n  M_EXP   = 0xdf,\n\n  M_APP0  = 0xe0,\n  M_APP1  = 0xe1,\n  M_APP2  = 0xe2,\n  M_APP3  = 0xe3,\n  M_APP4  = 0xe4,\n  M_APP5  = 0xe5,\n  M_APP6  = 0xe6,\n  M_APP7  = 0xe7,\n  M_APP8  = 0xe8,\n  M_APP9  = 0xe9,\n  M_APP10 = 0xea,\n  M_APP11 = 0xeb,\n  M_APP12 = 0xec,\n  M_APP13 = 0xed,\n  M_APP14 = 0xee,\n  M_APP15 = 0xef,\n\n  M_JPG0  = 0xf0,\n  M_JPG8  = 0xf8,\n  M_JPG13 = 0xfd,\n  M_COM   = 0xfe,\n\n  M_TEM   = 0x01,\n\n  M_ERROR = 0x100\n} JPEG_MARKER;\n\n\n/* Private state */\n\ntypedef struct {\n  struct jpeg_marker_writer pub; /* public fields */\n\n  unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */\n} my_marker_writer;\n\ntypedef my_marker_writer * my_marker_ptr;\n\n\n/*\n * Basic output routines.\n *\n * Note that we do not support suspension while writing a marker.\n * Therefore, an application using suspension must ensure that there is\n * enough buffer space for the initial markers (typ. 600-700 bytes) before\n * calling jpeg_start_compress, and enough space to write the trailing EOI\n * (a few bytes) before calling jpeg_finish_compress.  Multipass compression\n * modes are not supported at all with suspension, so those two are the only\n * points where markers will be written.\n */\n\nLOCAL(void)\nemit_byte (j_compress_ptr cinfo, int val)\n/* Emit a byte */\n{\n  struct jpeg_destination_mgr * dest = cinfo->dest;\n\n  *(dest->next_output_byte)++ = (JOCTET) val;\n  if (--dest->free_in_buffer == 0) {\n    if (! (*dest->empty_output_buffer) (cinfo))\n      ERREXIT(cinfo, JERR_CANT_SUSPEND);\n  }\n}\n\n\nLOCAL(void)\nemit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)\n/* Emit a marker code */\n{\n  emit_byte(cinfo, 0xFF);\n  emit_byte(cinfo, (int) mark);\n}\n\n\nLOCAL(void)\nemit_2bytes (j_compress_ptr cinfo, int value)\n/* Emit a 2-byte integer; these are always MSB first in JPEG files */\n{\n  emit_byte(cinfo, (value >> 8) & 0xFF);\n  emit_byte(cinfo, value & 0xFF);\n}\n\n\n/*\n * Routines to write specific marker types.\n */\n\nLOCAL(int)\nemit_dqt (j_compress_ptr cinfo, int index)\n/* Emit a DQT marker */\n/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */\n{\n  JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];\n  int prec;\n  int i;\n\n  if (qtbl == NULL)\n    ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);\n\n  prec = 0;\n  for (i = 0; i <= cinfo->lim_Se; i++) {\n    if (qtbl->quantval[cinfo->natural_order[i]] > 255)\n      prec = 1;\n  }\n\n  if (! qtbl->sent_table) {\n    emit_marker(cinfo, M_DQT);\n\n    emit_2bytes(cinfo,\n      prec ? cinfo->lim_Se * 2 + 2 + 1 + 2 : cinfo->lim_Se + 1 + 1 + 2);\n\n    emit_byte(cinfo, index + (prec<<4));\n\n    for (i = 0; i <= cinfo->lim_Se; i++) {\n      /* The table entries must be emitted in zigzag order. */\n      unsigned int qval = qtbl->quantval[cinfo->natural_order[i]];\n      if (prec)\n\temit_byte(cinfo, (int) (qval >> 8));\n      emit_byte(cinfo, (int) (qval & 0xFF));\n    }\n\n    qtbl->sent_table = TRUE;\n  }\n\n  return prec;\n}\n\n\nLOCAL(void)\nemit_dht (j_compress_ptr cinfo, int index, boolean is_ac)\n/* Emit a DHT marker */\n{\n  JHUFF_TBL * htbl;\n  int length, i;\n  \n  if (is_ac) {\n    htbl = cinfo->ac_huff_tbl_ptrs[index];\n    index += 0x10;\t\t/* output index has AC bit set */\n  } else {\n    htbl = cinfo->dc_huff_tbl_ptrs[index];\n  }\n\n  if (htbl == NULL)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);\n  \n  if (! htbl->sent_table) {\n    emit_marker(cinfo, M_DHT);\n    \n    length = 0;\n    for (i = 1; i <= 16; i++)\n      length += htbl->bits[i];\n    \n    emit_2bytes(cinfo, length + 2 + 1 + 16);\n    emit_byte(cinfo, index);\n    \n    for (i = 1; i <= 16; i++)\n      emit_byte(cinfo, htbl->bits[i]);\n    \n    for (i = 0; i < length; i++)\n      emit_byte(cinfo, htbl->huffval[i]);\n    \n    htbl->sent_table = TRUE;\n  }\n}\n\n\nLOCAL(void)\nemit_dac (j_compress_ptr cinfo)\n/* Emit a DAC marker */\n/* Since the useful info is so small, we want to emit all the tables in */\n/* one DAC marker.  Therefore this routine does its own scan of the table. */\n{\n#ifdef C_ARITH_CODING_SUPPORTED\n  char dc_in_use[NUM_ARITH_TBLS];\n  char ac_in_use[NUM_ARITH_TBLS];\n  int length, i;\n  jpeg_component_info *compptr;\n\n  for (i = 0; i < NUM_ARITH_TBLS; i++)\n    dc_in_use[i] = ac_in_use[i] = 0;\n\n  for (i = 0; i < cinfo->comps_in_scan; i++) {\n    compptr = cinfo->cur_comp_info[i];\n    /* DC needs no table for refinement scan */\n    if (cinfo->Ss == 0 && cinfo->Ah == 0)\n      dc_in_use[compptr->dc_tbl_no] = 1;\n    /* AC needs no table when not present */\n    if (cinfo->Se)\n      ac_in_use[compptr->ac_tbl_no] = 1;\n  }\n\n  length = 0;\n  for (i = 0; i < NUM_ARITH_TBLS; i++)\n    length += dc_in_use[i] + ac_in_use[i];\n\n  if (length) {\n    emit_marker(cinfo, M_DAC);\n\n    emit_2bytes(cinfo, length*2 + 2);\n\n    for (i = 0; i < NUM_ARITH_TBLS; i++) {\n      if (dc_in_use[i]) {\n\temit_byte(cinfo, i);\n\temit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));\n      }\n      if (ac_in_use[i]) {\n\temit_byte(cinfo, i + 0x10);\n\temit_byte(cinfo, cinfo->arith_ac_K[i]);\n      }\n    }\n  }\n#endif /* C_ARITH_CODING_SUPPORTED */\n}\n\n\nLOCAL(void)\nemit_dri (j_compress_ptr cinfo)\n/* Emit a DRI marker */\n{\n  emit_marker(cinfo, M_DRI);\n  \n  emit_2bytes(cinfo, 4);\t/* fixed length */\n\n  emit_2bytes(cinfo, (int) cinfo->restart_interval);\n}\n\n\nLOCAL(void)\nemit_lse_ict (j_compress_ptr cinfo)\n/* Emit an LSE inverse color transform specification marker */\n{\n  /* Support only 1 transform */\n  if (cinfo->color_transform != JCT_SUBTRACT_GREEN ||\n      cinfo->num_components < 3)\n    ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n\n  emit_marker(cinfo, M_JPG8);\n  \n  emit_2bytes(cinfo, 24);\t/* fixed length */\n\n  emit_byte(cinfo, 0x0D);\t/* ID inverse transform specification */\n  emit_2bytes(cinfo, MAXJSAMPLE);\t/* MAXTRANS */\n  emit_byte(cinfo, 3);\t\t/* Nt=3 */\n  emit_byte(cinfo, cinfo->comp_info[1].component_id);\n  emit_byte(cinfo, cinfo->comp_info[0].component_id);\n  emit_byte(cinfo, cinfo->comp_info[2].component_id);\n  emit_byte(cinfo, 0x80);\t/* F1: CENTER1=1, NORM1=0 */\n  emit_2bytes(cinfo, 0);\t/* A(1,1)=0 */\n  emit_2bytes(cinfo, 0);\t/* A(1,2)=0 */\n  emit_byte(cinfo, 0);\t\t/* F2: CENTER2=0, NORM2=0 */\n  emit_2bytes(cinfo, 1);\t/* A(2,1)=1 */\n  emit_2bytes(cinfo, 0);\t/* A(2,2)=0 */\n  emit_byte(cinfo, 0);\t\t/* F3: CENTER3=0, NORM3=0 */\n  emit_2bytes(cinfo, 1);\t/* A(3,1)=1 */\n  emit_2bytes(cinfo, 0);\t/* A(3,2)=0 */\n}\n\n\nLOCAL(void)\nemit_sof (j_compress_ptr cinfo, JPEG_MARKER code)\n/* Emit a SOF marker */\n{\n  int ci;\n  jpeg_component_info *compptr;\n  \n  emit_marker(cinfo, code);\n  \n  emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */\n\n  /* Make sure image isn't bigger than SOF field can handle */\n  if ((long) cinfo->jpeg_height > 65535L ||\n      (long) cinfo->jpeg_width > 65535L)\n    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);\n\n  emit_byte(cinfo, cinfo->data_precision);\n  emit_2bytes(cinfo, (int) cinfo->jpeg_height);\n  emit_2bytes(cinfo, (int) cinfo->jpeg_width);\n\n  emit_byte(cinfo, cinfo->num_components);\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    emit_byte(cinfo, compptr->component_id);\n    emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);\n    emit_byte(cinfo, compptr->quant_tbl_no);\n  }\n}\n\n\nLOCAL(void)\nemit_sos (j_compress_ptr cinfo)\n/* Emit a SOS marker */\n{\n  int i, td, ta;\n  jpeg_component_info *compptr;\n  \n  emit_marker(cinfo, M_SOS);\n  \n  emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */\n  \n  emit_byte(cinfo, cinfo->comps_in_scan);\n  \n  for (i = 0; i < cinfo->comps_in_scan; i++) {\n    compptr = cinfo->cur_comp_info[i];\n    emit_byte(cinfo, compptr->component_id);\n\n    /* We emit 0 for unused field(s); this is recommended by the P&M text\n     * but does not seem to be specified in the standard.\n     */\n\n    /* DC needs no table for refinement scan */\n    td = cinfo->Ss == 0 && cinfo->Ah == 0 ? compptr->dc_tbl_no : 0;\n    /* AC needs no table when not present */\n    ta = cinfo->Se ? compptr->ac_tbl_no : 0;\n\n    emit_byte(cinfo, (td << 4) + ta);\n  }\n\n  emit_byte(cinfo, cinfo->Ss);\n  emit_byte(cinfo, cinfo->Se);\n  emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);\n}\n\n\nLOCAL(void)\nemit_pseudo_sos (j_compress_ptr cinfo)\n/* Emit a pseudo SOS marker */\n{\n  emit_marker(cinfo, M_SOS);\n  \n  emit_2bytes(cinfo, 2 + 1 + 3); /* length */\n  \n  emit_byte(cinfo, 0); /* Ns */\n\n  emit_byte(cinfo, 0); /* Ss */\n  emit_byte(cinfo, cinfo->block_size * cinfo->block_size - 1); /* Se */\n  emit_byte(cinfo, 0); /* Ah/Al */\n}\n\n\nLOCAL(void)\nemit_jfif_app0 (j_compress_ptr cinfo)\n/* Emit a JFIF-compliant APP0 marker */\n{\n  /*\n   * Length of APP0 block\t(2 bytes)\n   * Block ID\t\t\t(4 bytes - ASCII \"JFIF\")\n   * Zero byte\t\t\t(1 byte to terminate the ID string)\n   * Version Major, Minor\t(2 bytes - major first)\n   * Units\t\t\t(1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)\n   * Xdpu\t\t\t(2 bytes - dots per unit horizontal)\n   * Ydpu\t\t\t(2 bytes - dots per unit vertical)\n   * Thumbnail X size\t\t(1 byte)\n   * Thumbnail Y size\t\t(1 byte)\n   */\n  \n  emit_marker(cinfo, M_APP0);\n  \n  emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */\n\n  emit_byte(cinfo, 0x4A);\t/* Identifier: ASCII \"JFIF\" */\n  emit_byte(cinfo, 0x46);\n  emit_byte(cinfo, 0x49);\n  emit_byte(cinfo, 0x46);\n  emit_byte(cinfo, 0);\n  emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */\n  emit_byte(cinfo, cinfo->JFIF_minor_version);\n  emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */\n  emit_2bytes(cinfo, (int) cinfo->X_density);\n  emit_2bytes(cinfo, (int) cinfo->Y_density);\n  emit_byte(cinfo, 0);\t\t/* No thumbnail image */\n  emit_byte(cinfo, 0);\n}\n\n\nLOCAL(void)\nemit_adobe_app14 (j_compress_ptr cinfo)\n/* Emit an Adobe APP14 marker */\n{\n  /*\n   * Length of APP14 block\t(2 bytes)\n   * Block ID\t\t\t(5 bytes - ASCII \"Adobe\")\n   * Version Number\t\t(2 bytes - currently 100)\n   * Flags0\t\t\t(2 bytes - currently 0)\n   * Flags1\t\t\t(2 bytes - currently 0)\n   * Color transform\t\t(1 byte)\n   *\n   * Although Adobe TN 5116 mentions Version = 101, all the Adobe files\n   * now in circulation seem to use Version = 100, so that's what we write.\n   *\n   * We write the color transform byte as 1 if the JPEG color space is\n   * YCbCr, 2 if it's YCCK, 0 otherwise.  Adobe's definition has to do with\n   * whether the encoder performed a transformation, which is pretty useless.\n   */\n  \n  emit_marker(cinfo, M_APP14);\n  \n  emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */\n\n  emit_byte(cinfo, 0x41);\t/* Identifier: ASCII \"Adobe\" */\n  emit_byte(cinfo, 0x64);\n  emit_byte(cinfo, 0x6F);\n  emit_byte(cinfo, 0x62);\n  emit_byte(cinfo, 0x65);\n  emit_2bytes(cinfo, 100);\t/* Version */\n  emit_2bytes(cinfo, 0);\t/* Flags0 */\n  emit_2bytes(cinfo, 0);\t/* Flags1 */\n  switch (cinfo->jpeg_color_space) {\n  case JCS_YCbCr:\n    emit_byte(cinfo, 1);\t/* Color transform = 1 */\n    break;\n  case JCS_YCCK:\n    emit_byte(cinfo, 2);\t/* Color transform = 2 */\n    break;\n  default:\n    emit_byte(cinfo, 0);\t/* Color transform = 0 */\n    break;\n  }\n}\n\n\n/*\n * These routines allow writing an arbitrary marker with parameters.\n * The only intended use is to emit COM or APPn markers after calling\n * write_file_header and before calling write_frame_header.\n * Other uses are not guaranteed to produce desirable results.\n * Counting the parameter bytes properly is the caller's responsibility.\n */\n\nMETHODDEF(void)\nwrite_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)\n/* Emit an arbitrary marker header */\n{\n  if (datalen > (unsigned int) 65533)\t\t/* safety check */\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  emit_marker(cinfo, (JPEG_MARKER) marker);\n\n  emit_2bytes(cinfo, (int) (datalen + 2));\t/* total length */\n}\n\nMETHODDEF(void)\nwrite_marker_byte (j_compress_ptr cinfo, int val)\n/* Emit one byte of marker parameters following write_marker_header */\n{\n  emit_byte(cinfo, val);\n}\n\n\n/*\n * Write datastream header.\n * This consists of an SOI and optional APPn markers.\n * We recommend use of the JFIF marker, but not the Adobe marker,\n * when using YCbCr or grayscale data.  The JFIF marker should NOT\n * be used for any other JPEG colorspace.  The Adobe marker is helpful\n * to distinguish RGB, CMYK, and YCCK colorspaces.\n * Note that an application can write additional header markers after\n * jpeg_start_compress returns.\n */\n\nMETHODDEF(void)\nwrite_file_header (j_compress_ptr cinfo)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n\n  emit_marker(cinfo, M_SOI);\t/* first the SOI */\n\n  /* SOI is defined to reset restart interval to 0 */\n  marker->last_restart_interval = 0;\n\n  if (cinfo->write_JFIF_header)\t/* next an optional JFIF APP0 */\n    emit_jfif_app0(cinfo);\n  if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */\n    emit_adobe_app14(cinfo);\n}\n\n\n/*\n * Write frame header.\n * This consists of DQT and SOFn markers,\n * a conditional LSE marker and a conditional pseudo SOS marker.\n * Note that we do not emit the SOF until we have emitted the DQT(s).\n * This avoids compatibility problems with incorrect implementations that\n * try to error-check the quant table numbers as soon as they see the SOF.\n */\n\nMETHODDEF(void)\nwrite_frame_header (j_compress_ptr cinfo)\n{\n  int ci, prec;\n  boolean is_baseline;\n  jpeg_component_info *compptr;\n  \n  /* Emit DQT for each quantization table.\n   * Note that emit_dqt() suppresses any duplicate tables.\n   */\n  prec = 0;\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    prec += emit_dqt(cinfo, compptr->quant_tbl_no);\n  }\n  /* now prec is nonzero iff there are any 16-bit quant tables. */\n\n  /* Check for a non-baseline specification.\n   * Note we assume that Huffman table numbers won't be changed later.\n   */\n  if (cinfo->arith_code || cinfo->progressive_mode ||\n      cinfo->data_precision != 8 || cinfo->block_size != DCTSIZE) {\n    is_baseline = FALSE;\n  } else {\n    is_baseline = TRUE;\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)\n\tis_baseline = FALSE;\n    }\n    if (prec && is_baseline) {\n      is_baseline = FALSE;\n      /* If it's baseline except for quantizer size, warn the user */\n      TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);\n    }\n  }\n\n  /* Emit the proper SOF marker */\n  if (cinfo->arith_code) {\n    if (cinfo->progressive_mode)\n      emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */\n    else\n      emit_sof(cinfo, M_SOF9);  /* SOF code for sequential arithmetic */\n  } else {\n    if (cinfo->progressive_mode)\n      emit_sof(cinfo, M_SOF2);\t/* SOF code for progressive Huffman */\n    else if (is_baseline)\n      emit_sof(cinfo, M_SOF0);\t/* SOF code for baseline implementation */\n    else\n      emit_sof(cinfo, M_SOF1);\t/* SOF code for non-baseline Huffman file */\n  }\n\n  /* Check to emit LSE inverse color transform specification marker */\n  if (cinfo->color_transform)\n    emit_lse_ict(cinfo);\n\n  /* Check to emit pseudo SOS marker */\n  if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE)\n    emit_pseudo_sos(cinfo);\n}\n\n\n/*\n * Write scan header.\n * This consists of DHT or DAC markers, optional DRI, and SOS.\n * Compressed data will be written following the SOS.\n */\n\nMETHODDEF(void)\nwrite_scan_header (j_compress_ptr cinfo)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n  int i;\n  jpeg_component_info *compptr;\n\n  if (cinfo->arith_code) {\n    /* Emit arith conditioning info.  We may have some duplication\n     * if the file has multiple scans, but it's so small it's hardly\n     * worth worrying about.\n     */\n    emit_dac(cinfo);\n  } else {\n    /* Emit Huffman tables.\n     * Note that emit_dht() suppresses any duplicate tables.\n     */\n    for (i = 0; i < cinfo->comps_in_scan; i++) {\n      compptr = cinfo->cur_comp_info[i];\n      /* DC needs no table for refinement scan */\n      if (cinfo->Ss == 0 && cinfo->Ah == 0)\n\temit_dht(cinfo, compptr->dc_tbl_no, FALSE);\n      /* AC needs no table when not present */\n      if (cinfo->Se)\n\temit_dht(cinfo, compptr->ac_tbl_no, TRUE);\n    }\n  }\n\n  /* Emit DRI if required --- note that DRI value could change for each scan.\n   * We avoid wasting space with unnecessary DRIs, however.\n   */\n  if (cinfo->restart_interval != marker->last_restart_interval) {\n    emit_dri(cinfo);\n    marker->last_restart_interval = cinfo->restart_interval;\n  }\n\n  emit_sos(cinfo);\n}\n\n\n/*\n * Write datastream trailer.\n */\n\nMETHODDEF(void)\nwrite_file_trailer (j_compress_ptr cinfo)\n{\n  emit_marker(cinfo, M_EOI);\n}\n\n\n/*\n * Write an abbreviated table-specification datastream.\n * This consists of SOI, DQT and DHT tables, and EOI.\n * Any table that is defined and not marked sent_table = TRUE will be\n * emitted.  Note that all tables will be marked sent_table = TRUE at exit.\n */\n\nMETHODDEF(void)\nwrite_tables_only (j_compress_ptr cinfo)\n{\n  int i;\n\n  emit_marker(cinfo, M_SOI);\n\n  for (i = 0; i < NUM_QUANT_TBLS; i++) {\n    if (cinfo->quant_tbl_ptrs[i] != NULL)\n      (void) emit_dqt(cinfo, i);\n  }\n\n  if (! cinfo->arith_code) {\n    for (i = 0; i < NUM_HUFF_TBLS; i++) {\n      if (cinfo->dc_huff_tbl_ptrs[i] != NULL)\n\temit_dht(cinfo, i, FALSE);\n      if (cinfo->ac_huff_tbl_ptrs[i] != NULL)\n\temit_dht(cinfo, i, TRUE);\n    }\n  }\n\n  emit_marker(cinfo, M_EOI);\n}\n\n\n/*\n * Initialize the marker writer module.\n */\n\nGLOBAL(void)\njinit_marker_writer (j_compress_ptr cinfo)\n{\n  my_marker_ptr marker;\n\n  /* Create the subobject */\n  marker = (my_marker_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_marker_writer));\n  cinfo->marker = &marker->pub;\n  /* Initialize method pointers */\n  marker->pub.write_file_header = write_file_header;\n  marker->pub.write_frame_header = write_frame_header;\n  marker->pub.write_scan_header = write_scan_header;\n  marker->pub.write_file_trailer = write_file_trailer;\n  marker->pub.write_tables_only = write_tables_only;\n  marker->pub.write_marker_header = write_marker_header;\n  marker->pub.write_marker_byte = write_marker_byte;\n  /* Initialize private state */\n  marker->last_restart_interval = 0;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcmaster.c",
    "content": "/*\n * jcmaster.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 2003-2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains master control logic for the JPEG compressor.\n * These routines are concerned with parameter validation, initial setup,\n * and inter-pass control (determining the number of passes and the work \n * to be done in each pass).\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private state */\n\ntypedef enum {\n\tmain_pass,\t\t/* input data, also do first output step */\n\thuff_opt_pass,\t\t/* Huffman code optimization pass */\n\toutput_pass\t\t/* data output pass */\n} c_pass_type;\n\ntypedef struct {\n  struct jpeg_comp_master pub;\t/* public fields */\n\n  c_pass_type pass_type;\t/* the type of the current pass */\n\n  int pass_number;\t\t/* # of passes completed */\n  int total_passes;\t\t/* total # of passes needed */\n\n  int scan_number;\t\t/* current index in scan_info[] */\n} my_comp_master;\n\ntypedef my_comp_master * my_master_ptr;\n\n\n/*\n * Support routines that do various essential calculations.\n */\n\n/*\n * Compute JPEG image dimensions and related values.\n * NOTE: this is exported for possible use by application.\n * Hence it mustn't do anything that can't be done twice.\n */\n\nGLOBAL(void)\njpeg_calc_jpeg_dimensions (j_compress_ptr cinfo)\n/* Do computations that are needed before master selection phase */\n{\n#ifdef DCT_SCALING_SUPPORTED\n\n  /* Sanity check on input image dimensions to prevent overflow in\n   * following calculation.\n   * We do check jpeg_width and jpeg_height in initial_setup below,\n   * but image_width and image_height can come from arbitrary data,\n   * and we need some space for multiplication by block_size.\n   */\n  if (((long) cinfo->image_width >> 24) || ((long) cinfo->image_height >> 24))\n    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);\n\n  /* Compute actual JPEG image dimensions and DCT scaling choices. */\n  if (cinfo->scale_num >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/1 scaling */\n    cinfo->jpeg_width = cinfo->image_width * cinfo->block_size;\n    cinfo->jpeg_height = cinfo->image_height * cinfo->block_size;\n    cinfo->min_DCT_h_scaled_size = 1;\n    cinfo->min_DCT_v_scaled_size = 1;\n  } else if (cinfo->scale_num * 2 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/2 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 2L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 2L);\n    cinfo->min_DCT_h_scaled_size = 2;\n    cinfo->min_DCT_v_scaled_size = 2;\n  } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/3 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 3L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 3L);\n    cinfo->min_DCT_h_scaled_size = 3;\n    cinfo->min_DCT_v_scaled_size = 3;\n  } else if (cinfo->scale_num * 4 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/4 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 4L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 4L);\n    cinfo->min_DCT_h_scaled_size = 4;\n    cinfo->min_DCT_v_scaled_size = 4;\n  } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/5 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 5L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 5L);\n    cinfo->min_DCT_h_scaled_size = 5;\n    cinfo->min_DCT_v_scaled_size = 5;\n  } else if (cinfo->scale_num * 6 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/6 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 6L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 6L);\n    cinfo->min_DCT_h_scaled_size = 6;\n    cinfo->min_DCT_v_scaled_size = 6;\n  } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/7 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 7L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 7L);\n    cinfo->min_DCT_h_scaled_size = 7;\n    cinfo->min_DCT_v_scaled_size = 7;\n  } else if (cinfo->scale_num * 8 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/8 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 8L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 8L);\n    cinfo->min_DCT_h_scaled_size = 8;\n    cinfo->min_DCT_v_scaled_size = 8;\n  } else if (cinfo->scale_num * 9 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/9 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 9L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 9L);\n    cinfo->min_DCT_h_scaled_size = 9;\n    cinfo->min_DCT_v_scaled_size = 9;\n  } else if (cinfo->scale_num * 10 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/10 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 10L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 10L);\n    cinfo->min_DCT_h_scaled_size = 10;\n    cinfo->min_DCT_v_scaled_size = 10;\n  } else if (cinfo->scale_num * 11 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/11 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 11L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 11L);\n    cinfo->min_DCT_h_scaled_size = 11;\n    cinfo->min_DCT_v_scaled_size = 11;\n  } else if (cinfo->scale_num * 12 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/12 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 12L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 12L);\n    cinfo->min_DCT_h_scaled_size = 12;\n    cinfo->min_DCT_v_scaled_size = 12;\n  } else if (cinfo->scale_num * 13 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/13 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 13L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 13L);\n    cinfo->min_DCT_h_scaled_size = 13;\n    cinfo->min_DCT_v_scaled_size = 13;\n  } else if (cinfo->scale_num * 14 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/14 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 14L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 14L);\n    cinfo->min_DCT_h_scaled_size = 14;\n    cinfo->min_DCT_v_scaled_size = 14;\n  } else if (cinfo->scale_num * 15 >= cinfo->scale_denom * cinfo->block_size) {\n    /* Provide block_size/15 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 15L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 15L);\n    cinfo->min_DCT_h_scaled_size = 15;\n    cinfo->min_DCT_v_scaled_size = 15;\n  } else {\n    /* Provide block_size/16 scaling */\n    cinfo->jpeg_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 16L);\n    cinfo->jpeg_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 16L);\n    cinfo->min_DCT_h_scaled_size = 16;\n    cinfo->min_DCT_v_scaled_size = 16;\n  }\n\n#else /* !DCT_SCALING_SUPPORTED */\n\n  /* Hardwire it to \"no scaling\" */\n  cinfo->jpeg_width = cinfo->image_width;\n  cinfo->jpeg_height = cinfo->image_height;\n  cinfo->min_DCT_h_scaled_size = DCTSIZE;\n  cinfo->min_DCT_v_scaled_size = DCTSIZE;\n\n#endif /* DCT_SCALING_SUPPORTED */\n}\n\n\nLOCAL(void)\njpeg_calc_trans_dimensions (j_compress_ptr cinfo)\n{\n  if (cinfo->min_DCT_h_scaled_size != cinfo->min_DCT_v_scaled_size)\n    ERREXIT2(cinfo, JERR_BAD_DCTSIZE,\n\t     cinfo->min_DCT_h_scaled_size, cinfo->min_DCT_v_scaled_size);\n\n  cinfo->block_size = cinfo->min_DCT_h_scaled_size;\n}\n\n\nLOCAL(void)\ninitial_setup (j_compress_ptr cinfo, boolean transcode_only)\n/* Do computations that are needed before master selection phase */\n{\n  int ci, ssize;\n  jpeg_component_info *compptr;\n  long samplesperrow;\n  JDIMENSION jd_samplesperrow;\n\n  if (transcode_only)\n    jpeg_calc_trans_dimensions(cinfo);\n  else\n    jpeg_calc_jpeg_dimensions(cinfo);\n\n  /* Sanity check on block_size */\n  if (cinfo->block_size < 1 || cinfo->block_size > 16)\n    ERREXIT2(cinfo, JERR_BAD_DCTSIZE, cinfo->block_size, cinfo->block_size);\n\n  /* Derive natural_order from block_size */\n  switch (cinfo->block_size) {\n  case 2: cinfo->natural_order = jpeg_natural_order2; break;\n  case 3: cinfo->natural_order = jpeg_natural_order3; break;\n  case 4: cinfo->natural_order = jpeg_natural_order4; break;\n  case 5: cinfo->natural_order = jpeg_natural_order5; break;\n  case 6: cinfo->natural_order = jpeg_natural_order6; break;\n  case 7: cinfo->natural_order = jpeg_natural_order7; break;\n  default: cinfo->natural_order = jpeg_natural_order; break;\n  }\n\n  /* Derive lim_Se from block_size */\n  cinfo->lim_Se = cinfo->block_size < DCTSIZE ?\n    cinfo->block_size * cinfo->block_size - 1 : DCTSIZE2-1;\n\n  /* Sanity check on image dimensions */\n  if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 ||\n      cinfo->num_components <= 0 || cinfo->input_components <= 0)\n    ERREXIT(cinfo, JERR_EMPTY_IMAGE);\n\n  /* Make sure image isn't bigger than I can handle */\n  if ((long) cinfo->jpeg_height > (long) JPEG_MAX_DIMENSION ||\n      (long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION)\n    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);\n\n  /* Width of an input scanline must be representable as JDIMENSION. */\n  samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;\n  jd_samplesperrow = (JDIMENSION) samplesperrow;\n  if ((long) jd_samplesperrow != samplesperrow)\n    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);\n\n  /* For now, precision must match compiled-in value... */\n  if (cinfo->data_precision != BITS_IN_JSAMPLE)\n    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);\n\n  /* Check that number of components won't exceed internal array sizes */\n  if (cinfo->num_components > MAX_COMPONENTS)\n    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,\n\t     MAX_COMPONENTS);\n\n  /* Compute maximum sampling factors; check factor validity */\n  cinfo->max_h_samp_factor = 1;\n  cinfo->max_v_samp_factor = 1;\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||\n\tcompptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)\n      ERREXIT(cinfo, JERR_BAD_SAMPLING);\n    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,\n\t\t\t\t   compptr->h_samp_factor);\n    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,\n\t\t\t\t   compptr->v_samp_factor);\n  }\n\n  /* Compute dimensions of components */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Fill in the correct component_index value; don't rely on application */\n    compptr->component_index = ci;\n    /* In selecting the actual DCT scaling for each component, we try to\n     * scale down the chroma components via DCT scaling rather than downsampling.\n     * This saves time if the downsampler gets to use 1:1 scaling.\n     * Note this code adapts subsampling ratios which are powers of 2.\n     */\n    ssize = 1;\n#ifdef DCT_SCALING_SUPPORTED\n    while (cinfo->min_DCT_h_scaled_size * ssize <=\n\t   (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&\n\t   (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) {\n      ssize = ssize * 2;\n    }\n#endif\n    compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;\n    ssize = 1;\n#ifdef DCT_SCALING_SUPPORTED\n    while (cinfo->min_DCT_v_scaled_size * ssize <=\n\t   (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&\n\t   (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) {\n      ssize = ssize * 2;\n    }\n#endif\n    compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;\n\n    /* We don't support DCT ratios larger than 2. */\n    if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2)\n\tcompptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2;\n    else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2)\n\tcompptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2;\n\n    /* Size in DCT blocks */\n    compptr->width_in_blocks = (JDIMENSION)\n      jdiv_round_up((long) cinfo->jpeg_width * (long) compptr->h_samp_factor,\n\t\t    (long) (cinfo->max_h_samp_factor * cinfo->block_size));\n    compptr->height_in_blocks = (JDIMENSION)\n      jdiv_round_up((long) cinfo->jpeg_height * (long) compptr->v_samp_factor,\n\t\t    (long) (cinfo->max_v_samp_factor * cinfo->block_size));\n    /* Size in samples */\n    compptr->downsampled_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->jpeg_width *\n\t\t    (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size),\n\t\t    (long) (cinfo->max_h_samp_factor * cinfo->block_size));\n    compptr->downsampled_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->jpeg_height *\n\t\t    (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),\n\t\t    (long) (cinfo->max_v_samp_factor * cinfo->block_size));\n    /* Mark component needed (this flag isn't actually used for compression) */\n    compptr->component_needed = TRUE;\n  }\n\n  /* Compute number of fully interleaved MCU rows (number of times that\n   * main controller will call coefficient controller).\n   */\n  cinfo->total_iMCU_rows = (JDIMENSION)\n    jdiv_round_up((long) cinfo->jpeg_height,\n\t\t  (long) (cinfo->max_v_samp_factor * cinfo->block_size));\n}\n\n\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n\nLOCAL(void)\nvalidate_script (j_compress_ptr cinfo)\n/* Verify that the scan script in cinfo->scan_info[] is valid; also\n * determine whether it uses progressive JPEG, and set cinfo->progressive_mode.\n */\n{\n  const jpeg_scan_info * scanptr;\n  int scanno, ncomps, ci, coefi, thisi;\n  int Ss, Se, Ah, Al;\n  boolean component_sent[MAX_COMPONENTS];\n#ifdef C_PROGRESSIVE_SUPPORTED\n  int * last_bitpos_ptr;\n  int last_bitpos[MAX_COMPONENTS][DCTSIZE2];\n  /* -1 until that coefficient has been seen; then last Al for it */\n#endif\n\n  if (cinfo->num_scans <= 0)\n    ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0);\n\n  /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1;\n   * for progressive JPEG, no scan can have this.\n   */\n  scanptr = cinfo->scan_info;\n  if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) {\n#ifdef C_PROGRESSIVE_SUPPORTED\n    cinfo->progressive_mode = TRUE;\n    last_bitpos_ptr = & last_bitpos[0][0];\n    for (ci = 0; ci < cinfo->num_components; ci++) \n      for (coefi = 0; coefi < DCTSIZE2; coefi++)\n\t*last_bitpos_ptr++ = -1;\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n  } else {\n    cinfo->progressive_mode = FALSE;\n    for (ci = 0; ci < cinfo->num_components; ci++) \n      component_sent[ci] = FALSE;\n  }\n\n  for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) {\n    /* Validate component indexes */\n    ncomps = scanptr->comps_in_scan;\n    if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN);\n    for (ci = 0; ci < ncomps; ci++) {\n      thisi = scanptr->component_index[ci];\n      if (thisi < 0 || thisi >= cinfo->num_components)\n\tERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);\n      /* Components must appear in SOF order within each scan */\n      if (ci > 0 && thisi <= scanptr->component_index[ci-1])\n\tERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);\n    }\n    /* Validate progression parameters */\n    Ss = scanptr->Ss;\n    Se = scanptr->Se;\n    Ah = scanptr->Ah;\n    Al = scanptr->Al;\n    if (cinfo->progressive_mode) {\n#ifdef C_PROGRESSIVE_SUPPORTED\n      /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that\n       * seems wrong: the upper bound ought to depend on data precision.\n       * Perhaps they really meant 0..N+1 for N-bit precision.\n       * Here we allow 0..10 for 8-bit data; Al larger than 10 results in\n       * out-of-range reconstructed DC values during the first DC scan,\n       * which might cause problems for some decoders.\n       */\n#if BITS_IN_JSAMPLE == 8\n#define MAX_AH_AL 10\n#else\n#define MAX_AH_AL 13\n#endif\n      if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 ||\n\t  Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL)\n\tERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n      if (Ss == 0) {\n\tif (Se != 0)\t\t/* DC and AC together not OK */\n\t  ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n      } else {\n\tif (ncomps != 1)\t/* AC scans must be for only one component */\n\t  ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n      }\n      for (ci = 0; ci < ncomps; ci++) {\n\tlast_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0];\n\tif (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */\n\t  ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n\tfor (coefi = Ss; coefi <= Se; coefi++) {\n\t  if (last_bitpos_ptr[coefi] < 0) {\n\t    /* first scan of this coefficient */\n\t    if (Ah != 0)\n\t      ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n\t  } else {\n\t    /* not first scan */\n\t    if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1)\n\t      ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n\t  }\n\t  last_bitpos_ptr[coefi] = Al;\n\t}\n      }\n#endif\n    } else {\n      /* For sequential JPEG, all progression parameters must be these: */\n      if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0)\n\tERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);\n      /* Make sure components are not sent twice */\n      for (ci = 0; ci < ncomps; ci++) {\n\tthisi = scanptr->component_index[ci];\n\tif (component_sent[thisi])\n\t  ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);\n\tcomponent_sent[thisi] = TRUE;\n      }\n    }\n  }\n\n  /* Now verify that everything got sent. */\n  if (cinfo->progressive_mode) {\n#ifdef C_PROGRESSIVE_SUPPORTED\n    /* For progressive mode, we only check that at least some DC data\n     * got sent for each component; the spec does not require that all bits\n     * of all coefficients be transmitted.  Would it be wiser to enforce\n     * transmission of all coefficient bits??\n     */\n    for (ci = 0; ci < cinfo->num_components; ci++) {\n      if (last_bitpos[ci][0] < 0)\n\tERREXIT(cinfo, JERR_MISSING_DATA);\n    }\n#endif\n  } else {\n    for (ci = 0; ci < cinfo->num_components; ci++) {\n      if (! component_sent[ci])\n\tERREXIT(cinfo, JERR_MISSING_DATA);\n    }\n  }\n}\n\n\nLOCAL(void)\nreduce_script (j_compress_ptr cinfo)\n/* Adapt scan script for use with reduced block size;\n * assume that script has been validated before.\n */\n{\n  jpeg_scan_info * scanptr;\n  int idxout, idxin;\n\n  /* Circumvent const declaration for this function */\n  scanptr = (jpeg_scan_info *) cinfo->scan_info;\n  idxout = 0;\n\n  for (idxin = 0; idxin < cinfo->num_scans; idxin++) {\n    /* After skipping, idxout becomes smaller than idxin */\n    if (idxin != idxout)\n      /* Copy rest of data;\n       * note we stay in given chunk of allocated memory.\n       */\n      scanptr[idxout] = scanptr[idxin];\n    if (scanptr[idxout].Ss > cinfo->lim_Se)\n      /* Entire scan out of range - skip this entry */\n      continue;\n    if (scanptr[idxout].Se > cinfo->lim_Se)\n      /* Limit scan to end of block */\n      scanptr[idxout].Se = cinfo->lim_Se;\n    idxout++;\n  }\n\n  cinfo->num_scans = idxout;\n}\n\n#endif /* C_MULTISCAN_FILES_SUPPORTED */\n\n\nLOCAL(void)\nselect_scan_parameters (j_compress_ptr cinfo)\n/* Set up the scan parameters for the current scan */\n{\n  int ci;\n\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n  if (cinfo->scan_info != NULL) {\n    /* Prepare for current scan --- the script is already validated */\n    my_master_ptr master = (my_master_ptr) cinfo->master;\n    const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;\n\n    cinfo->comps_in_scan = scanptr->comps_in_scan;\n    for (ci = 0; ci < scanptr->comps_in_scan; ci++) {\n      cinfo->cur_comp_info[ci] =\n\t&cinfo->comp_info[scanptr->component_index[ci]];\n    }\n    if (cinfo->progressive_mode) {\n      cinfo->Ss = scanptr->Ss;\n      cinfo->Se = scanptr->Se;\n      cinfo->Ah = scanptr->Ah;\n      cinfo->Al = scanptr->Al;\n      return;\n    }\n  }\n  else\n#endif\n  {\n    /* Prepare for single sequential-JPEG scan containing all components */\n    if (cinfo->num_components > MAX_COMPS_IN_SCAN)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,\n\t       MAX_COMPS_IN_SCAN);\n    cinfo->comps_in_scan = cinfo->num_components;\n    for (ci = 0; ci < cinfo->num_components; ci++) {\n      cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];\n    }\n  }\n  cinfo->Ss = 0;\n  cinfo->Se = cinfo->block_size * cinfo->block_size - 1;\n  cinfo->Ah = 0;\n  cinfo->Al = 0;\n}\n\n\nLOCAL(void)\nper_scan_setup (j_compress_ptr cinfo)\n/* Do computations that are needed before processing a JPEG scan */\n/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */\n{\n  int ci, mcublks, tmp;\n  jpeg_component_info *compptr;\n  \n  if (cinfo->comps_in_scan == 1) {\n    \n    /* Noninterleaved (single-component) scan */\n    compptr = cinfo->cur_comp_info[0];\n    \n    /* Overall image size in MCUs */\n    cinfo->MCUs_per_row = compptr->width_in_blocks;\n    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;\n    \n    /* For noninterleaved scan, always one block per MCU */\n    compptr->MCU_width = 1;\n    compptr->MCU_height = 1;\n    compptr->MCU_blocks = 1;\n    compptr->MCU_sample_width = compptr->DCT_h_scaled_size;\n    compptr->last_col_width = 1;\n    /* For noninterleaved scans, it is convenient to define last_row_height\n     * as the number of block rows present in the last iMCU row.\n     */\n    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n    if (tmp == 0) tmp = compptr->v_samp_factor;\n    compptr->last_row_height = tmp;\n    \n    /* Prepare array describing MCU composition */\n    cinfo->blocks_in_MCU = 1;\n    cinfo->MCU_membership[0] = 0;\n    \n  } else {\n    \n    /* Interleaved (multi-component) scan */\n    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,\n\t       MAX_COMPS_IN_SCAN);\n    \n    /* Overall image size in MCUs */\n    cinfo->MCUs_per_row = (JDIMENSION)\n      jdiv_round_up((long) cinfo->jpeg_width,\n\t\t    (long) (cinfo->max_h_samp_factor * cinfo->block_size));\n    cinfo->MCU_rows_in_scan = (JDIMENSION)\n      jdiv_round_up((long) cinfo->jpeg_height,\n\t\t    (long) (cinfo->max_v_samp_factor * cinfo->block_size));\n    \n    cinfo->blocks_in_MCU = 0;\n    \n    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n      compptr = cinfo->cur_comp_info[ci];\n      /* Sampling factors give # of blocks of component in each MCU */\n      compptr->MCU_width = compptr->h_samp_factor;\n      compptr->MCU_height = compptr->v_samp_factor;\n      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;\n      compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size;\n      /* Figure number of non-dummy blocks in last MCU column & row */\n      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);\n      if (tmp == 0) tmp = compptr->MCU_width;\n      compptr->last_col_width = tmp;\n      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);\n      if (tmp == 0) tmp = compptr->MCU_height;\n      compptr->last_row_height = tmp;\n      /* Prepare array describing MCU composition */\n      mcublks = compptr->MCU_blocks;\n      if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU)\n\tERREXIT(cinfo, JERR_BAD_MCU_SIZE);\n      while (mcublks-- > 0) {\n\tcinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;\n      }\n    }\n    \n  }\n\n  /* Convert restart specified in rows to actual MCU count. */\n  /* Note that count must fit in 16 bits, so we provide limiting. */\n  if (cinfo->restart_in_rows > 0) {\n    long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row;\n    cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L);\n  }\n}\n\n\n/*\n * Per-pass setup.\n * This is called at the beginning of each pass.  We determine which modules\n * will be active during this pass and give them appropriate start_pass calls.\n * We also set is_last_pass to indicate whether any more passes will be\n * required.\n */\n\nMETHODDEF(void)\nprepare_for_pass (j_compress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  switch (master->pass_type) {\n  case main_pass:\n    /* Initial pass: will collect input data, and do either Huffman\n     * optimization or data output for the first scan.\n     */\n    select_scan_parameters(cinfo);\n    per_scan_setup(cinfo);\n    if (! cinfo->raw_data_in) {\n      (*cinfo->cconvert->start_pass) (cinfo);\n      (*cinfo->downsample->start_pass) (cinfo);\n      (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);\n    }\n    (*cinfo->fdct->start_pass) (cinfo);\n    (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding);\n    (*cinfo->coef->start_pass) (cinfo,\n\t\t\t\t(master->total_passes > 1 ?\n\t\t\t\t JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));\n    (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);\n    if (cinfo->optimize_coding) {\n      /* No immediate data output; postpone writing frame/scan headers */\n      master->pub.call_pass_startup = FALSE;\n    } else {\n      /* Will write frame/scan headers at first jpeg_write_scanlines call */\n      master->pub.call_pass_startup = TRUE;\n    }\n    break;\n#ifdef ENTROPY_OPT_SUPPORTED\n  case huff_opt_pass:\n    /* Do Huffman optimization for a scan after the first one. */\n    select_scan_parameters(cinfo);\n    per_scan_setup(cinfo);\n    if (cinfo->Ss != 0 || cinfo->Ah == 0) {\n      (*cinfo->entropy->start_pass) (cinfo, TRUE);\n      (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);\n      master->pub.call_pass_startup = FALSE;\n      break;\n    }\n    /* Special case: Huffman DC refinement scans need no Huffman table\n     * and therefore we can skip the optimization pass for them.\n     */\n    master->pass_type = output_pass;\n    master->pass_number++;\n    /*FALLTHROUGH*/\n#endif\n  case output_pass:\n    /* Do a data-output pass. */\n    /* We need not repeat per-scan setup if prior optimization pass did it. */\n    if (! cinfo->optimize_coding) {\n      select_scan_parameters(cinfo);\n      per_scan_setup(cinfo);\n    }\n    (*cinfo->entropy->start_pass) (cinfo, FALSE);\n    (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);\n    /* We emit frame/scan headers now */\n    if (master->scan_number == 0)\n      (*cinfo->marker->write_frame_header) (cinfo);\n    (*cinfo->marker->write_scan_header) (cinfo);\n    master->pub.call_pass_startup = FALSE;\n    break;\n  default:\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n  }\n\n  master->pub.is_last_pass = (master->pass_number == master->total_passes-1);\n\n  /* Set up progress monitor's pass info if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->completed_passes = master->pass_number;\n    cinfo->progress->total_passes = master->total_passes;\n  }\n}\n\n\n/*\n * Special start-of-pass hook.\n * This is called by jpeg_write_scanlines if call_pass_startup is TRUE.\n * In single-pass processing, we need this hook because we don't want to\n * write frame/scan headers during jpeg_start_compress; we want to let the\n * application write COM markers etc. between jpeg_start_compress and the\n * jpeg_write_scanlines loop.\n * In multi-pass processing, this routine is not used.\n */\n\nMETHODDEF(void)\npass_startup (j_compress_ptr cinfo)\n{\n  cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */\n\n  (*cinfo->marker->write_frame_header) (cinfo);\n  (*cinfo->marker->write_scan_header) (cinfo);\n}\n\n\n/*\n * Finish up at end of pass.\n */\n\nMETHODDEF(void)\nfinish_pass_master (j_compress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  /* The entropy coder always needs an end-of-pass call,\n   * either to analyze statistics or to flush its output buffer.\n   */\n  (*cinfo->entropy->finish_pass) (cinfo);\n\n  /* Update state for next pass */\n  switch (master->pass_type) {\n  case main_pass:\n    /* next pass is either output of scan 0 (after optimization)\n     * or output of scan 1 (if no optimization).\n     */\n    master->pass_type = output_pass;\n    if (! cinfo->optimize_coding)\n      master->scan_number++;\n    break;\n  case huff_opt_pass:\n    /* next pass is always output of current scan */\n    master->pass_type = output_pass;\n    break;\n  case output_pass:\n    /* next pass is either optimization or output of next scan */\n    if (cinfo->optimize_coding)\n      master->pass_type = huff_opt_pass;\n    master->scan_number++;\n    break;\n  }\n\n  master->pass_number++;\n}\n\n\n/*\n * Initialize master compression control.\n */\n\nGLOBAL(void)\njinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)\n{\n  my_master_ptr master;\n\n  master = (my_master_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(my_comp_master));\n  cinfo->master = (struct jpeg_comp_master *) master;\n  master->pub.prepare_for_pass = prepare_for_pass;\n  master->pub.pass_startup = pass_startup;\n  master->pub.finish_pass = finish_pass_master;\n  master->pub.is_last_pass = FALSE;\n\n  /* Validate parameters, determine derived values */\n  initial_setup(cinfo, transcode_only);\n\n  if (cinfo->scan_info != NULL) {\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n    validate_script(cinfo);\n    if (cinfo->block_size < DCTSIZE)\n      reduce_script(cinfo);\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n  } else {\n    cinfo->progressive_mode = FALSE;\n    cinfo->num_scans = 1;\n  }\n\n  if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) &&\n      !cinfo->arith_code)\t\t\t/*  TEMPORARY HACK ??? */\n    /* assume default tables no good for progressive or downscale mode */\n    cinfo->optimize_coding = TRUE;\n\n  /* Initialize my private state */\n  if (transcode_only) {\n    /* no main pass in transcoding */\n    if (cinfo->optimize_coding)\n      master->pass_type = huff_opt_pass;\n    else\n      master->pass_type = output_pass;\n  } else {\n    /* for normal compression, first pass is always this type: */\n    master->pass_type = main_pass;\n  }\n  master->scan_number = 0;\n  master->pass_number = 0;\n  if (cinfo->optimize_coding)\n    master->total_passes = cinfo->num_scans * 2;\n  else\n    master->total_passes = cinfo->num_scans;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcomapi.c",
    "content": "/*\n * jcomapi.c\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface routines that are used for both\n * compression and decompression.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Abort processing of a JPEG compression or decompression operation,\n * but don't destroy the object itself.\n *\n * For this, we merely clean up all the nonpermanent memory pools.\n * Note that temp files (virtual arrays) are not allowed to belong to\n * the permanent pool, so we will be able to close all temp files here.\n * Closing a data source or destination, if necessary, is the application's\n * responsibility.\n */\n\nGLOBAL(void)\njpeg_abort (j_common_ptr cinfo)\n{\n  int pool;\n\n  /* Do nothing if called on a not-initialized or destroyed JPEG object. */\n  if (cinfo->mem == NULL)\n    return;\n\n  /* Releasing pools in reverse order might help avoid fragmentation\n   * with some (brain-damaged) malloc libraries.\n   */\n  for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {\n    (*cinfo->mem->free_pool) (cinfo, pool);\n  }\n\n  /* Reset overall state for possible reuse of object */\n  if (cinfo->is_decompressor) {\n    cinfo->global_state = DSTATE_START;\n    /* Try to keep application from accessing now-deleted marker list.\n     * A bit kludgy to do it here, but this is the most central place.\n     */\n    ((j_decompress_ptr) cinfo)->marker_list = NULL;\n  } else {\n    cinfo->global_state = CSTATE_START;\n  }\n}\n\n\n/*\n * Destruction of a JPEG object.\n *\n * Everything gets deallocated except the master jpeg_compress_struct itself\n * and the error manager struct.  Both of these are supplied by the application\n * and must be freed, if necessary, by the application.  (Often they are on\n * the stack and so don't need to be freed anyway.)\n * Closing a data source or destination, if necessary, is the application's\n * responsibility.\n */\n\nGLOBAL(void)\njpeg_destroy (j_common_ptr cinfo)\n{\n  /* We need only tell the memory manager to release everything. */\n  /* NB: mem pointer is NULL if memory mgr failed to initialize. */\n  if (cinfo->mem != NULL)\n    (*cinfo->mem->self_destruct) (cinfo);\n  cinfo->mem = NULL;\t\t/* be safe if jpeg_destroy is called twice */\n  cinfo->global_state = 0;\t/* mark it destroyed */\n}\n\n\n/*\n * Convenience routines for allocating quantization and Huffman tables.\n * (Would jutils.c be a more reasonable place to put these?)\n */\n\nGLOBAL(JQUANT_TBL *)\njpeg_alloc_quant_table (j_common_ptr cinfo)\n{\n  JQUANT_TBL *tbl;\n\n  tbl = (JQUANT_TBL *)\n    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));\n  tbl->sent_table = FALSE;\t/* make sure this is false in any new table */\n  return tbl;\n}\n\n\nGLOBAL(JHUFF_TBL *)\njpeg_alloc_huff_table (j_common_ptr cinfo)\n{\n  JHUFF_TBL *tbl;\n\n  tbl = (JHUFF_TBL *)\n    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));\n  tbl->sent_table = FALSE;\t/* make sure this is false in any new table */\n  return tbl;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcparam.c",
    "content": "/*\n * jcparam.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * Modified 2003-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains optional default-setting code for the JPEG compressor.\n * Applications do not have to use this file, but those that don't use it\n * must know a lot more about the innards of the JPEG code.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Quantization table setup routines\n */\n\nGLOBAL(void)\njpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,\n\t\t      const unsigned int *basic_table,\n\t\t      int scale_factor, boolean force_baseline)\n/* Define a quantization table equal to the basic_table times\n * a scale factor (given as a percentage).\n * If force_baseline is TRUE, the computed quantization table entries\n * are limited to 1..255 for JPEG baseline compatibility.\n */\n{\n  JQUANT_TBL ** qtblptr;\n  int i;\n  long temp;\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)\n    ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);\n\n  qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];\n\n  if (*qtblptr == NULL)\n    *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);\n\n  for (i = 0; i < DCTSIZE2; i++) {\n    temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;\n    /* limit the values to the valid range */\n    if (temp <= 0L) temp = 1L;\n    if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */\n    if (force_baseline && temp > 255L)\n      temp = 255L;\t\t/* limit to baseline range if requested */\n    (*qtblptr)->quantval[i] = (UINT16) temp;\n  }\n\n  /* Initialize sent_table FALSE so table will be written to JPEG file. */\n  (*qtblptr)->sent_table = FALSE;\n}\n\n\n/* These are the sample quantization tables given in JPEG spec section K.1.\n * The spec says that the values given produce \"good\" quality, and\n * when divided by 2, \"very good\" quality.\n */\nstatic const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {\n  16,  11,  10,  16,  24,  40,  51,  61,\n  12,  12,  14,  19,  26,  58,  60,  55,\n  14,  13,  16,  24,  40,  57,  69,  56,\n  14,  17,  22,  29,  51,  87,  80,  62,\n  18,  22,  37,  56,  68, 109, 103,  77,\n  24,  35,  55,  64,  81, 104, 113,  92,\n  49,  64,  78,  87, 103, 121, 120, 101,\n  72,  92,  95,  98, 112, 100, 103,  99\n};\nstatic const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {\n  17,  18,  24,  47,  99,  99,  99,  99,\n  18,  21,  26,  66,  99,  99,  99,  99,\n  24,  26,  56,  99,  99,  99,  99,  99,\n  47,  66,  99,  99,  99,  99,  99,  99,\n  99,  99,  99,  99,  99,  99,  99,  99,\n  99,  99,  99,  99,  99,  99,  99,  99,\n  99,  99,  99,  99,  99,  99,  99,  99,\n  99,  99,  99,  99,  99,  99,  99,  99\n};\n\n\nGLOBAL(void)\njpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline)\n/* Set or change the 'quality' (quantization) setting, using default tables\n * and straight percentage-scaling quality scales.\n * This entry point allows different scalings for luminance and chrominance.\n */\n{\n  /* Set up two quantization tables using the specified scaling */\n  jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,\n\t\t       cinfo->q_scale_factor[0], force_baseline);\n  jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,\n\t\t       cinfo->q_scale_factor[1], force_baseline);\n}\n\n\nGLOBAL(void)\njpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,\n\t\t\t boolean force_baseline)\n/* Set or change the 'quality' (quantization) setting, using default tables\n * and a straight percentage-scaling quality scale.  In most cases it's better\n * to use jpeg_set_quality (below); this entry point is provided for\n * applications that insist on a linear percentage scaling.\n */\n{\n  /* Set up two quantization tables using the specified scaling */\n  jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,\n\t\t       scale_factor, force_baseline);\n  jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,\n\t\t       scale_factor, force_baseline);\n}\n\n\nGLOBAL(int)\njpeg_quality_scaling (int quality)\n/* Convert a user-specified quality rating to a percentage scaling factor\n * for an underlying quantization table, using our recommended scaling curve.\n * The input 'quality' factor should be 0 (terrible) to 100 (very good).\n */\n{\n  /* Safety limit on quality factor.  Convert 0 to 1 to avoid zero divide. */\n  if (quality <= 0) quality = 1;\n  if (quality > 100) quality = 100;\n\n  /* The basic table is used as-is (scaling 100) for a quality of 50.\n   * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;\n   * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table\n   * to make all the table entries 1 (hence, minimum quantization loss).\n   * Qualities 1..50 are converted to scaling percentage 5000/Q.\n   */\n  if (quality < 50)\n    quality = 5000 / quality;\n  else\n    quality = 200 - quality*2;\n\n  return quality;\n}\n\n\nGLOBAL(void)\njpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)\n/* Set or change the 'quality' (quantization) setting, using default tables.\n * This is the standard quality-adjusting entry point for typical user\n * interfaces; only those who want detailed control over quantization tables\n * would use the preceding routines directly.\n */\n{\n  /* Convert user 0-100 rating to percentage scaling */\n  quality = jpeg_quality_scaling(quality);\n\n  /* Set up standard quality tables */\n  jpeg_set_linear_quality(cinfo, quality, force_baseline);\n}\n\n\n/*\n * Huffman table setup routines\n */\n\nLOCAL(void)\nadd_huff_table (j_compress_ptr cinfo,\n\t\tJHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)\n/* Define a Huffman table */\n{\n  int nsymbols, len;\n\n  if (*htblptr == NULL)\n    *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);\n\n  /* Copy the number-of-symbols-of-each-code-length counts */\n  MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));\n\n  /* Validate the counts.  We do this here mainly so we can copy the right\n   * number of symbols from the val[] array, without risking marching off\n   * the end of memory.  jchuff.c will do a more thorough test later.\n   */\n  nsymbols = 0;\n  for (len = 1; len <= 16; len++)\n    nsymbols += bits[len];\n  if (nsymbols < 1 || nsymbols > 256)\n    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n\n  MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));\n\n  /* Initialize sent_table FALSE so table will be written to JPEG file. */\n  (*htblptr)->sent_table = FALSE;\n}\n\n\nLOCAL(void)\nstd_huff_tables (j_compress_ptr cinfo)\n/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */\n/* IMPORTANT: these are only valid for 8-bit data precision! */\n{\n  static const UINT8 bits_dc_luminance[17] =\n    { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };\n  static const UINT8 val_dc_luminance[] =\n    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };\n  \n  static const UINT8 bits_dc_chrominance[17] =\n    { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };\n  static const UINT8 val_dc_chrominance[] =\n    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };\n  \n  static const UINT8 bits_ac_luminance[17] =\n    { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };\n  static const UINT8 val_ac_luminance[] =\n    { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,\n      0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,\n      0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,\n      0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,\n      0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,\n      0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,\n      0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,\n      0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,\n      0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,\n      0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,\n      0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,\n      0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,\n      0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,\n      0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,\n      0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,\n      0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,\n      0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,\n      0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,\n      0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,\n      0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,\n      0xf9, 0xfa };\n  \n  static const UINT8 bits_ac_chrominance[17] =\n    { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };\n  static const UINT8 val_ac_chrominance[] =\n    { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,\n      0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,\n      0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,\n      0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,\n      0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,\n      0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,\n      0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,\n      0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,\n      0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,\n      0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,\n      0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,\n      0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,\n      0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,\n      0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,\n      0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,\n      0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,\n      0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,\n      0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,\n      0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,\n      0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,\n      0xf9, 0xfa };\n  \n  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],\n\t\t bits_dc_luminance, val_dc_luminance);\n  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],\n\t\t bits_ac_luminance, val_ac_luminance);\n  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],\n\t\t bits_dc_chrominance, val_dc_chrominance);\n  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],\n\t\t bits_ac_chrominance, val_ac_chrominance);\n}\n\n\n/*\n * Default parameter setup for compression.\n *\n * Applications that don't choose to use this routine must do their\n * own setup of all these parameters.  Alternately, you can call this\n * to establish defaults and then alter parameters selectively.  This\n * is the recommended approach since, if we add any new parameters,\n * your code will still work (they'll be set to reasonable defaults).\n */\n\nGLOBAL(void)\njpeg_set_defaults (j_compress_ptr cinfo)\n{\n  int i;\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  /* Allocate comp_info array large enough for maximum component count.\n   * Array is made permanent in case application wants to compress\n   * multiple images at same param settings.\n   */\n  if (cinfo->comp_info == NULL)\n    cinfo->comp_info = (jpeg_component_info *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\t  MAX_COMPONENTS * SIZEOF(jpeg_component_info));\n\n  /* Initialize everything not dependent on the color space */\n\n  cinfo->scale_num = 1;\t\t/* 1:1 scaling */\n  cinfo->scale_denom = 1;\n  cinfo->data_precision = BITS_IN_JSAMPLE;\n  /* Set up two quantization tables using default quality of 75 */\n  jpeg_set_quality(cinfo, 75, TRUE);\n  /* Set up two Huffman tables */\n  std_huff_tables(cinfo);\n\n  /* Initialize default arithmetic coding conditioning */\n  for (i = 0; i < NUM_ARITH_TBLS; i++) {\n    cinfo->arith_dc_L[i] = 0;\n    cinfo->arith_dc_U[i] = 1;\n    cinfo->arith_ac_K[i] = 5;\n  }\n\n  /* Default is no multiple-scan output */\n  cinfo->scan_info = NULL;\n  cinfo->num_scans = 0;\n\n  /* Expect normal source image, not raw downsampled data */\n  cinfo->raw_data_in = FALSE;\n\n  /* Use Huffman coding, not arithmetic coding, by default */\n  cinfo->arith_code = FALSE;\n\n  /* By default, don't do extra passes to optimize entropy coding */\n  cinfo->optimize_coding = FALSE;\n  /* The standard Huffman tables are only valid for 8-bit data precision.\n   * If the precision is higher, force optimization on so that usable\n   * tables will be computed.  This test can be removed if default tables\n   * are supplied that are valid for the desired precision.\n   */\n  if (cinfo->data_precision > 8)\n    cinfo->optimize_coding = TRUE;\n\n  /* By default, use the simpler non-cosited sampling alignment */\n  cinfo->CCIR601_sampling = FALSE;\n\n  /* By default, apply fancy downsampling */\n  cinfo->do_fancy_downsampling = TRUE;\n\n  /* No input smoothing */\n  cinfo->smoothing_factor = 0;\n\n  /* DCT algorithm preference */\n  cinfo->dct_method = JDCT_DEFAULT;\n\n  /* No restart markers */\n  cinfo->restart_interval = 0;\n  cinfo->restart_in_rows = 0;\n\n  /* Fill in default JFIF marker parameters.  Note that whether the marker\n   * will actually be written is determined by jpeg_set_colorspace.\n   *\n   * By default, the library emits JFIF version code 1.01.\n   * An application that wants to emit JFIF 1.02 extension markers should set\n   * JFIF_minor_version to 2.  We could probably get away with just defaulting\n   * to 1.02, but there may still be some decoders in use that will complain\n   * about that; saying 1.01 should minimize compatibility problems.\n   */\n  cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */\n  cinfo->JFIF_minor_version = 1;\n  cinfo->density_unit = 0;\t/* Pixel size is unknown by default */\n  cinfo->X_density = 1;\t\t/* Pixel aspect ratio is square by default */\n  cinfo->Y_density = 1;\n\n  /* No color transform */\n  cinfo->color_transform = JCT_NONE;\n\n  /* Choose JPEG colorspace based on input space, set defaults accordingly */\n\n  jpeg_default_colorspace(cinfo);\n}\n\n\n/*\n * Select an appropriate JPEG colorspace for in_color_space.\n */\n\nGLOBAL(void)\njpeg_default_colorspace (j_compress_ptr cinfo)\n{\n  switch (cinfo->in_color_space) {\n  case JCS_GRAYSCALE:\n    jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);\n    break;\n  case JCS_RGB:\n    jpeg_set_colorspace(cinfo, JCS_YCbCr);\n    break;\n  case JCS_YCbCr:\n    jpeg_set_colorspace(cinfo, JCS_YCbCr);\n    break;\n  case JCS_CMYK:\n    jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */\n    break;\n  case JCS_YCCK:\n    jpeg_set_colorspace(cinfo, JCS_YCCK);\n    break;\n  case JCS_UNKNOWN:\n    jpeg_set_colorspace(cinfo, JCS_UNKNOWN);\n    break;\n  default:\n    ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);\n  }\n}\n\n\n/*\n * Set the JPEG colorspace, and choose colorspace-dependent default values.\n */\n\nGLOBAL(void)\njpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)\n{\n  jpeg_component_info * compptr;\n  int ci;\n\n#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl)  \\\n  (compptr = &cinfo->comp_info[index], \\\n   compptr->component_id = (id), \\\n   compptr->h_samp_factor = (hsamp), \\\n   compptr->v_samp_factor = (vsamp), \\\n   compptr->quant_tbl_no = (quant), \\\n   compptr->dc_tbl_no = (dctbl), \\\n   compptr->ac_tbl_no = (actbl) )\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  /* For all colorspaces, we use Q and Huff tables 0 for luminance components,\n   * tables 1 for chrominance components.\n   */\n\n  cinfo->jpeg_color_space = colorspace;\n\n  cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */\n  cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */\n\n  switch (colorspace) {\n  case JCS_GRAYSCALE:\n    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */\n    cinfo->num_components = 1;\n    /* JFIF specifies component ID 1 */\n    SET_COMP(0, 1, 1,1, 0, 0,0);\n    break;\n  case JCS_RGB:\n    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */\n    cinfo->num_components = 3;\n    SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);\n    SET_COMP(1, 0x47 /* 'G' */, 1,1, 0,\n\t\tcinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,\n\t\tcinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);\n    SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);\n    break;\n  case JCS_YCbCr:\n    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */\n    cinfo->num_components = 3;\n    /* JFIF specifies component IDs 1,2,3 */\n    /* We default to 2x2 subsamples of chrominance */\n    SET_COMP(0, 1, 2,2, 0, 0,0);\n    SET_COMP(1, 2, 1,1, 1, 1,1);\n    SET_COMP(2, 3, 1,1, 1, 1,1);\n    break;\n  case JCS_CMYK:\n    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */\n    cinfo->num_components = 4;\n    SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0);\n    SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0);\n    SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0);\n    SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0);\n    break;\n  case JCS_YCCK:\n    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */\n    cinfo->num_components = 4;\n    SET_COMP(0, 1, 2,2, 0, 0,0);\n    SET_COMP(1, 2, 1,1, 1, 1,1);\n    SET_COMP(2, 3, 1,1, 1, 1,1);\n    SET_COMP(3, 4, 2,2, 0, 0,0);\n    break;\n  case JCS_UNKNOWN:\n    cinfo->num_components = cinfo->input_components;\n    if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,\n\t       MAX_COMPONENTS);\n    for (ci = 0; ci < cinfo->num_components; ci++) {\n      SET_COMP(ci, ci, 1,1, 0, 0,0);\n    }\n    break;\n  default:\n    ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n  }\n}\n\n\n#ifdef C_PROGRESSIVE_SUPPORTED\n\nLOCAL(jpeg_scan_info *)\nfill_a_scan (jpeg_scan_info * scanptr, int ci,\n\t     int Ss, int Se, int Ah, int Al)\n/* Support routine: generate one scan for specified component */\n{\n  scanptr->comps_in_scan = 1;\n  scanptr->component_index[0] = ci;\n  scanptr->Ss = Ss;\n  scanptr->Se = Se;\n  scanptr->Ah = Ah;\n  scanptr->Al = Al;\n  scanptr++;\n  return scanptr;\n}\n\nLOCAL(jpeg_scan_info *)\nfill_scans (jpeg_scan_info * scanptr, int ncomps,\n\t    int Ss, int Se, int Ah, int Al)\n/* Support routine: generate one scan for each component */\n{\n  int ci;\n\n  for (ci = 0; ci < ncomps; ci++) {\n    scanptr->comps_in_scan = 1;\n    scanptr->component_index[0] = ci;\n    scanptr->Ss = Ss;\n    scanptr->Se = Se;\n    scanptr->Ah = Ah;\n    scanptr->Al = Al;\n    scanptr++;\n  }\n  return scanptr;\n}\n\nLOCAL(jpeg_scan_info *)\nfill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)\n/* Support routine: generate interleaved DC scan if possible, else N scans */\n{\n  int ci;\n\n  if (ncomps <= MAX_COMPS_IN_SCAN) {\n    /* Single interleaved DC scan */\n    scanptr->comps_in_scan = ncomps;\n    for (ci = 0; ci < ncomps; ci++)\n      scanptr->component_index[ci] = ci;\n    scanptr->Ss = scanptr->Se = 0;\n    scanptr->Ah = Ah;\n    scanptr->Al = Al;\n    scanptr++;\n  } else {\n    /* Noninterleaved DC scan for each component */\n    scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);\n  }\n  return scanptr;\n}\n\n\n/*\n * Create a recommended progressive-JPEG script.\n * cinfo->num_components and cinfo->jpeg_color_space must be correct.\n */\n\nGLOBAL(void)\njpeg_simple_progression (j_compress_ptr cinfo)\n{\n  int ncomps = cinfo->num_components;\n  int nscans;\n  jpeg_scan_info * scanptr;\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  /* Figure space needed for script.  Calculation must match code below! */\n  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {\n    /* Custom script for YCbCr color images. */\n    nscans = 10;\n  } else {\n    /* All-purpose script for other color spaces. */\n    if (ncomps > MAX_COMPS_IN_SCAN)\n      nscans = 6 * ncomps;\t/* 2 DC + 4 AC scans per component */\n    else\n      nscans = 2 + 4 * ncomps;\t/* 2 DC scans; 4 AC scans per component */\n  }\n\n  /* Allocate space for script.\n   * We need to put it in the permanent pool in case the application performs\n   * multiple compressions without changing the settings.  To avoid a memory\n   * leak if jpeg_simple_progression is called repeatedly for the same JPEG\n   * object, we try to re-use previously allocated space, and we allocate\n   * enough space to handle YCbCr even if initially asked for grayscale.\n   */\n  if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {\n    cinfo->script_space_size = MAX(nscans, 10);\n    cinfo->script_space = (jpeg_scan_info *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\tcinfo->script_space_size * SIZEOF(jpeg_scan_info));\n  }\n  scanptr = cinfo->script_space;\n  cinfo->scan_info = scanptr;\n  cinfo->num_scans = nscans;\n\n  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {\n    /* Custom script for YCbCr color images. */\n    /* Initial DC scan */\n    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);\n    /* Initial AC scan: get some luma data out in a hurry */\n    scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);\n    /* Chroma data is too small to be worth expending many scans on */\n    scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);\n    scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);\n    /* Complete spectral selection for luma AC */\n    scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);\n    /* Refine next bit of luma AC */\n    scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);\n    /* Finish DC successive approximation */\n    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);\n    /* Finish AC successive approximation */\n    scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);\n    scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);\n    /* Luma bottom bit comes last since it's usually largest scan */\n    scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);\n  } else {\n    /* All-purpose script for other color spaces. */\n    /* Successive approximation first pass */\n    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);\n    scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);\n    scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);\n    /* Successive approximation second pass */\n    scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);\n    /* Successive approximation final pass */\n    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);\n    scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);\n  }\n}\n\n#endif /* C_PROGRESSIVE_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcprepct.c",
    "content": "/*\n * jcprepct.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the compression preprocessing controller.\n * This controller manages the color conversion, downsampling,\n * and edge expansion steps.\n *\n * Most of the complexity here is associated with buffering input rows\n * as required by the downsampler.  See the comments at the head of\n * jcsample.c for the downsampler's needs.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* At present, jcsample.c can request context rows only for smoothing.\n * In the future, we might also need context rows for CCIR601 sampling\n * or other more-complex downsampling procedures.  The code to support\n * context rows should be compiled only if needed.\n */\n#ifdef INPUT_SMOOTHING_SUPPORTED\n#define CONTEXT_ROWS_SUPPORTED\n#endif\n\n\n/*\n * For the simple (no-context-row) case, we just need to buffer one\n * row group's worth of pixels for the downsampling step.  At the bottom of\n * the image, we pad to a full row group by replicating the last pixel row.\n * The downsampler's last output row is then replicated if needed to pad\n * out to a full iMCU row.\n *\n * When providing context rows, we must buffer three row groups' worth of\n * pixels.  Three row groups are physically allocated, but the row pointer\n * arrays are made five row groups high, with the extra pointers above and\n * below \"wrapping around\" to point to the last and first real row groups.\n * This allows the downsampler to access the proper context rows.\n * At the top and bottom of the image, we create dummy context rows by\n * copying the first or last real pixel row.  This copying could be avoided\n * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the\n * trouble on the compression side.\n */\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_c_prep_controller pub; /* public fields */\n\n  /* Downsampling input buffer.  This buffer holds color-converted data\n   * until we have enough to do a downsample step.\n   */\n  JSAMPARRAY color_buf[MAX_COMPONENTS];\n\n  JDIMENSION rows_to_go;\t/* counts rows remaining in source image */\n  int next_buf_row;\t\t/* index of next row to store in color_buf */\n\n#ifdef CONTEXT_ROWS_SUPPORTED\t/* only needed for context case */\n  int this_row_group;\t\t/* starting row index of group to process */\n  int next_buf_stop;\t\t/* downsample when we reach this index */\n#endif\n} my_prep_controller;\n\ntypedef my_prep_controller * my_prep_ptr;\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;\n\n  if (pass_mode != JBUF_PASS_THRU)\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n\n  /* Initialize total-height counter for detecting bottom of image */\n  prep->rows_to_go = cinfo->image_height;\n  /* Mark the conversion buffer empty */\n  prep->next_buf_row = 0;\n#ifdef CONTEXT_ROWS_SUPPORTED\n  /* Preset additional state variables for context mode.\n   * These aren't used in non-context mode, so we needn't test which mode.\n   */\n  prep->this_row_group = 0;\n  /* Set next_buf_stop to stop after two row groups have been read in. */\n  prep->next_buf_stop = 2 * cinfo->max_v_samp_factor;\n#endif\n}\n\n\n/*\n * Expand an image vertically from height input_rows to height output_rows,\n * by duplicating the bottom row.\n */\n\nLOCAL(void)\nexpand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols,\n\t\t    int input_rows, int output_rows)\n{\n  register int row;\n\n  for (row = input_rows; row < output_rows; row++) {\n    jcopy_sample_rows(image_data, input_rows-1, image_data, row,\n\t\t      1, num_cols);\n  }\n}\n\n\n/*\n * Process some data in the simple no-context case.\n *\n * Preprocessor output data is counted in \"row groups\".  A row group\n * is defined to be v_samp_factor sample rows of each component.\n * Downsampling will produce this much data from each max_v_samp_factor\n * input rows.\n */\n\nMETHODDEF(void)\npre_process_data (j_compress_ptr cinfo,\n\t\t  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t  JDIMENSION in_rows_avail,\n\t\t  JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,\n\t\t  JDIMENSION out_row_groups_avail)\n{\n  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;\n  int numrows, ci;\n  JDIMENSION inrows;\n  jpeg_component_info * compptr;\n\n  while (*in_row_ctr < in_rows_avail &&\n\t *out_row_group_ctr < out_row_groups_avail) {\n    /* Do color conversion to fill the conversion buffer. */\n    inrows = in_rows_avail - *in_row_ctr;\n    numrows = cinfo->max_v_samp_factor - prep->next_buf_row;\n    numrows = (int) MIN((JDIMENSION) numrows, inrows);\n    (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,\n\t\t\t\t       prep->color_buf,\n\t\t\t\t       (JDIMENSION) prep->next_buf_row,\n\t\t\t\t       numrows);\n    *in_row_ctr += numrows;\n    prep->next_buf_row += numrows;\n    prep->rows_to_go -= numrows;\n    /* If at bottom of image, pad to fill the conversion buffer. */\n    if (prep->rows_to_go == 0 &&\n\tprep->next_buf_row < cinfo->max_v_samp_factor) {\n      for (ci = 0; ci < cinfo->num_components; ci++) {\n\texpand_bottom_edge(prep->color_buf[ci], cinfo->image_width,\n\t\t\t   prep->next_buf_row, cinfo->max_v_samp_factor);\n      }\n      prep->next_buf_row = cinfo->max_v_samp_factor;\n    }\n    /* If we've filled the conversion buffer, empty it. */\n    if (prep->next_buf_row == cinfo->max_v_samp_factor) {\n      (*cinfo->downsample->downsample) (cinfo,\n\t\t\t\t\tprep->color_buf, (JDIMENSION) 0,\n\t\t\t\t\toutput_buf, *out_row_group_ctr);\n      prep->next_buf_row = 0;\n      (*out_row_group_ctr)++;\n    }\n    /* If at bottom of image, pad the output to a full iMCU height.\n     * Note we assume the caller is providing a one-iMCU-height output buffer!\n     */\n    if (prep->rows_to_go == 0 &&\n\t*out_row_group_ctr < out_row_groups_avail) {\n      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t   ci++, compptr++) {\n\tnumrows = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /\n\t\t  cinfo->min_DCT_v_scaled_size;\n\texpand_bottom_edge(output_buf[ci],\n\t\t\t   compptr->width_in_blocks * compptr->DCT_h_scaled_size,\n\t\t\t   (int) (*out_row_group_ctr * numrows),\n\t\t\t   (int) (out_row_groups_avail * numrows));\n      }\n      *out_row_group_ctr = out_row_groups_avail;\n      break;\t\t\t/* can exit outer loop without test */\n    }\n  }\n}\n\n\n#ifdef CONTEXT_ROWS_SUPPORTED\n\n/*\n * Process some data in the context case.\n */\n\nMETHODDEF(void)\npre_process_context (j_compress_ptr cinfo,\n\t\t     JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,\n\t\t     JDIMENSION in_rows_avail,\n\t\t     JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,\n\t\t     JDIMENSION out_row_groups_avail)\n{\n  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;\n  int numrows, ci;\n  int buf_height = cinfo->max_v_samp_factor * 3;\n  JDIMENSION inrows;\n\n  while (*out_row_group_ctr < out_row_groups_avail) {\n    if (*in_row_ctr < in_rows_avail) {\n      /* Do color conversion to fill the conversion buffer. */\n      inrows = in_rows_avail - *in_row_ctr;\n      numrows = prep->next_buf_stop - prep->next_buf_row;\n      numrows = (int) MIN((JDIMENSION) numrows, inrows);\n      (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,\n\t\t\t\t\t prep->color_buf,\n\t\t\t\t\t (JDIMENSION) prep->next_buf_row,\n\t\t\t\t\t numrows);\n      /* Pad at top of image, if first time through */\n      if (prep->rows_to_go == cinfo->image_height) {\n\tfor (ci = 0; ci < cinfo->num_components; ci++) {\n\t  int row;\n\t  for (row = 1; row <= cinfo->max_v_samp_factor; row++) {\n\t    jcopy_sample_rows(prep->color_buf[ci], 0,\n\t\t\t      prep->color_buf[ci], -row,\n\t\t\t      1, cinfo->image_width);\n\t  }\n\t}\n      }\n      *in_row_ctr += numrows;\n      prep->next_buf_row += numrows;\n      prep->rows_to_go -= numrows;\n    } else {\n      /* Return for more data, unless we are at the bottom of the image. */\n      if (prep->rows_to_go != 0)\n\tbreak;\n      /* When at bottom of image, pad to fill the conversion buffer. */\n      if (prep->next_buf_row < prep->next_buf_stop) {\n\tfor (ci = 0; ci < cinfo->num_components; ci++) {\n\t  expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,\n\t\t\t     prep->next_buf_row, prep->next_buf_stop);\n\t}\n\tprep->next_buf_row = prep->next_buf_stop;\n      }\n    }\n    /* If we've gotten enough data, downsample a row group. */\n    if (prep->next_buf_row == prep->next_buf_stop) {\n      (*cinfo->downsample->downsample) (cinfo,\n\t\t\t\t\tprep->color_buf,\n\t\t\t\t\t(JDIMENSION) prep->this_row_group,\n\t\t\t\t\toutput_buf, *out_row_group_ctr);\n      (*out_row_group_ctr)++;\n      /* Advance pointers with wraparound as necessary. */\n      prep->this_row_group += cinfo->max_v_samp_factor;\n      if (prep->this_row_group >= buf_height)\n\tprep->this_row_group = 0;\n      if (prep->next_buf_row >= buf_height)\n\tprep->next_buf_row = 0;\n      prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor;\n    }\n  }\n}\n\n\n/*\n * Create the wrapped-around downsampling input buffer needed for context mode.\n */\n\nLOCAL(void)\ncreate_context_buffer (j_compress_ptr cinfo)\n{\n  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;\n  int rgroup_height = cinfo->max_v_samp_factor;\n  int ci, i;\n  jpeg_component_info * compptr;\n  JSAMPARRAY true_buffer, fake_buffer;\n\n  /* Grab enough space for fake row pointers for all the components;\n   * we need five row groups' worth of pointers for each component.\n   */\n  fake_buffer = (JSAMPARRAY)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(cinfo->num_components * 5 * rgroup_height) *\n\t\t\t\tSIZEOF(JSAMPROW));\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Allocate the actual buffer space (3 row groups) for this component.\n     * We make the buffer wide enough to allow the downsampler to edge-expand\n     * horizontally within the buffer, if it so chooses.\n     */\n    true_buffer = (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       (JDIMENSION) (((long) compptr->width_in_blocks *\n\t\t      cinfo->min_DCT_h_scaled_size *\n\t\t      cinfo->max_h_samp_factor) / compptr->h_samp_factor),\n       (JDIMENSION) (3 * rgroup_height));\n    /* Copy true buffer row pointers into the middle of the fake row array */\n    MEMCOPY(fake_buffer + rgroup_height, true_buffer,\n\t    3 * rgroup_height * SIZEOF(JSAMPROW));\n    /* Fill in the above and below wraparound pointers */\n    for (i = 0; i < rgroup_height; i++) {\n      fake_buffer[i] = true_buffer[2 * rgroup_height + i];\n      fake_buffer[4 * rgroup_height + i] = true_buffer[i];\n    }\n    prep->color_buf[ci] = fake_buffer + rgroup_height;\n    fake_buffer += 5 * rgroup_height; /* point to space for next component */\n  }\n}\n\n#endif /* CONTEXT_ROWS_SUPPORTED */\n\n\n/*\n * Initialize preprocessing controller.\n */\n\nGLOBAL(void)\njinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)\n{\n  my_prep_ptr prep;\n  int ci;\n  jpeg_component_info * compptr;\n\n  if (need_full_buffer)\t\t/* safety check */\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n\n  prep = (my_prep_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_prep_controller));\n  cinfo->prep = (struct jpeg_c_prep_controller *) prep;\n  prep->pub.start_pass = start_pass_prep;\n\n  /* Allocate the color conversion buffer.\n   * We make the buffer wide enough to allow the downsampler to edge-expand\n   * horizontally within the buffer, if it so chooses.\n   */\n  if (cinfo->downsample->need_context_rows) {\n    /* Set up to provide context rows */\n#ifdef CONTEXT_ROWS_SUPPORTED\n    prep->pub.pre_process_data = pre_process_context;\n    create_context_buffer(cinfo);\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n  } else {\n    /* No context, just make it tall enough for one row group */\n    prep->pub.pre_process_data = pre_process_data;\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      prep->color_buf[ci] = (*cinfo->mem->alloc_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t (JDIMENSION) (((long) compptr->width_in_blocks *\n\t\t\tcinfo->min_DCT_h_scaled_size *\n\t\t\tcinfo->max_h_samp_factor) / compptr->h_samp_factor),\n\t (JDIMENSION) cinfo->max_v_samp_factor);\n    }\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jcsample.c",
    "content": "/*\n * jcsample.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains downsampling routines.\n *\n * Downsampling input data is counted in \"row groups\".  A row group\n * is defined to be max_v_samp_factor pixel rows of each component,\n * from which the downsampler produces v_samp_factor sample rows.\n * A single row group is processed in each call to the downsampler module.\n *\n * The downsampler is responsible for edge-expansion of its output data\n * to fill an integral number of DCT blocks horizontally.  The source buffer\n * may be modified if it is helpful for this purpose (the source buffer is\n * allocated wide enough to correspond to the desired output width).\n * The caller (the prep controller) is responsible for vertical padding.\n *\n * The downsampler may request \"context rows\" by setting need_context_rows\n * during startup.  In this case, the input arrays will contain at least\n * one row group's worth of pixels above and below the passed-in data;\n * the caller will create dummy rows at image top and bottom by replicating\n * the first or last real pixel row.\n *\n * An excellent reference for image resampling is\n *   Digital Image Warping, George Wolberg, 1990.\n *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.\n *\n * The downsampling algorithm used here is a simple average of the source\n * pixels covered by the output pixel.  The hi-falutin sampling literature\n * refers to this as a \"box filter\".  In general the characteristics of a box\n * filter are not very good, but for the specific cases we normally use (1:1\n * and 2:1 ratios) the box is equivalent to a \"triangle filter\" which is not\n * nearly so bad.  If you intend to use other sampling ratios, you'd be well\n * advised to improve this code.\n *\n * A simple input-smoothing capability is provided.  This is mainly intended\n * for cleaning up color-dithered GIF input files (if you find it inadequate,\n * we suggest using an external filtering program such as pnmconvol).  When\n * enabled, each input pixel P is replaced by a weighted sum of itself and its\n * eight neighbors.  P's weight is 1-8*SF and each neighbor's weight is SF,\n * where SF = (smoothing_factor / 1024).\n * Currently, smoothing is only supported for 2h2v sampling factors.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Pointer to routine to downsample a single component */\ntypedef JMETHOD(void, downsample1_ptr,\n\t\t(j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JSAMPARRAY input_data, JSAMPARRAY output_data));\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_downsampler pub;\t/* public fields */\n\n  /* Downsampling method pointers, one per component */\n  downsample1_ptr methods[MAX_COMPONENTS];\n\n  /* Height of an output row group for each component. */\n  int rowgroup_height[MAX_COMPONENTS];\n\n  /* These arrays save pixel expansion factors so that int_downsample need not\n   * recompute them each time.  They are unused for other downsampling methods.\n   */\n  UINT8 h_expand[MAX_COMPONENTS];\n  UINT8 v_expand[MAX_COMPONENTS];\n} my_downsampler;\n\ntypedef my_downsampler * my_downsample_ptr;\n\n\n/*\n * Initialize for a downsampling pass.\n */\n\nMETHODDEF(void)\nstart_pass_downsample (j_compress_ptr cinfo)\n{\n  /* no work for now */\n}\n\n\n/*\n * Expand a component horizontally from width input_cols to width output_cols,\n * by duplicating the rightmost samples.\n */\n\nLOCAL(void)\nexpand_right_edge (JSAMPARRAY image_data, int num_rows,\n\t\t   JDIMENSION input_cols, JDIMENSION output_cols)\n{\n  register JSAMPROW ptr;\n  register JSAMPLE pixval;\n  register int count;\n  int row;\n  int numcols = (int) (output_cols - input_cols);\n\n  if (numcols > 0) {\n    for (row = 0; row < num_rows; row++) {\n      ptr = image_data[row] + input_cols;\n      pixval = ptr[-1];\t\t/* don't need GETJSAMPLE() here */\n      for (count = numcols; count > 0; count--)\n\t*ptr++ = pixval;\n    }\n  }\n}\n\n\n/*\n * Do downsampling for a whole row group (all components).\n *\n * In this version we simply downsample each component independently.\n */\n\nMETHODDEF(void)\nsep_downsample (j_compress_ptr cinfo,\n\t\tJSAMPIMAGE input_buf, JDIMENSION in_row_index,\n\t\tJSAMPIMAGE output_buf, JDIMENSION out_row_group_index)\n{\n  my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;\n  int ci;\n  jpeg_component_info * compptr;\n  JSAMPARRAY in_ptr, out_ptr;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    in_ptr = input_buf[ci] + in_row_index;\n    out_ptr = output_buf[ci] +\n\t      (out_row_group_index * downsample->rowgroup_height[ci]);\n    (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr);\n  }\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * One row group is processed per call.\n * This version handles arbitrary integral sampling ratios, without smoothing.\n * Note that this version is not actually used for customary sampling ratios.\n */\n\nMETHODDEF(void)\nint_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;\n  int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;\n  JDIMENSION outcol, outcol_h;\t/* outcol_h == outcol*h_expand */\n  JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size;\n  JSAMPROW inptr, outptr;\n  INT32 outvalue;\n\n  h_expand = downsample->h_expand[compptr->component_index];\n  v_expand = downsample->v_expand[compptr->component_index];\n  numpix = h_expand * v_expand;\n  numpix2 = numpix/2;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data, cinfo->max_v_samp_factor,\n\t\t    cinfo->image_width, output_cols * h_expand);\n\n  inrow = outrow = 0;\n  while (inrow < cinfo->max_v_samp_factor) {\n    outptr = output_data[outrow];\n    for (outcol = 0, outcol_h = 0; outcol < output_cols;\n\t outcol++, outcol_h += h_expand) {\n      outvalue = 0;\n      for (v = 0; v < v_expand; v++) {\n\tinptr = input_data[inrow+v] + outcol_h;\n\tfor (h = 0; h < h_expand; h++) {\n\t  outvalue += (INT32) GETJSAMPLE(*inptr++);\n\t}\n      }\n      *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix);\n    }\n    inrow += v_expand;\n    outrow++;\n  }\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the special case of a full-size component,\n * without smoothing.\n */\n\nMETHODDEF(void)\nfullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t     JSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  /* Copy the data */\n  jcopy_sample_rows(input_data, 0, output_data, 0,\n\t\t    cinfo->max_v_samp_factor, cinfo->image_width);\n  /* Edge-expand */\n  expand_right_edge(output_data, cinfo->max_v_samp_factor, cinfo->image_width,\n\t\t    compptr->width_in_blocks * compptr->DCT_h_scaled_size);\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the common case of 2:1 horizontal and 1:1 vertical,\n * without smoothing.\n *\n * A note about the \"bias\" calculations: when rounding fractional values to\n * integer, we do not want to always round 0.5 up to the next integer.\n * If we did that, we'd introduce a noticeable bias towards larger values.\n * Instead, this code is arranged so that 0.5 will be rounded up or down at\n * alternate pixel locations (a simple ordered dither pattern).\n */\n\nMETHODDEF(void)\nh2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  int inrow;\n  JDIMENSION outcol;\n  JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size;\n  register JSAMPROW inptr, outptr;\n  register int bias;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data, cinfo->max_v_samp_factor,\n\t\t    cinfo->image_width, output_cols * 2);\n\n  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {\n    outptr = output_data[inrow];\n    inptr = input_data[inrow];\n    bias = 0;\t\t\t/* bias = 0,1,0,1,... for successive samples */\n    for (outcol = 0; outcol < output_cols; outcol++) {\n      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1])\n\t\t\t      + bias) >> 1);\n      bias ^= 1;\t\t/* 0=>1, 1=>0 */\n      inptr += 2;\n    }\n  }\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the standard case of 2:1 horizontal and 2:1 vertical,\n * without smoothing.\n */\n\nMETHODDEF(void)\nh2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  int inrow, outrow;\n  JDIMENSION outcol;\n  JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size;\n  register JSAMPROW inptr0, inptr1, outptr;\n  register int bias;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data, cinfo->max_v_samp_factor,\n\t\t    cinfo->image_width, output_cols * 2);\n\n  inrow = outrow = 0;\n  while (inrow < cinfo->max_v_samp_factor) {\n    outptr = output_data[outrow];\n    inptr0 = input_data[inrow];\n    inptr1 = input_data[inrow+1];\n    bias = 1;\t\t\t/* bias = 1,2,1,2,... for successive samples */\n    for (outcol = 0; outcol < output_cols; outcol++) {\n      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +\n\t\t\t      GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1])\n\t\t\t      + bias) >> 2);\n      bias ^= 3;\t\t/* 1=>2, 2=>1 */\n      inptr0 += 2; inptr1 += 2;\n    }\n    inrow += 2;\n    outrow++;\n  }\n}\n\n\n#ifdef INPUT_SMOOTHING_SUPPORTED\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the standard case of 2:1 horizontal and 2:1 vertical,\n * with smoothing.  One row of context is required.\n */\n\nMETHODDEF(void)\nh2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,\n\t\t\tJSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  int inrow, outrow;\n  JDIMENSION colctr;\n  JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size;\n  register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;\n  INT32 membersum, neighsum, memberscale, neighscale;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,\n\t\t    cinfo->image_width, output_cols * 2);\n\n  /* We don't bother to form the individual \"smoothed\" input pixel values;\n   * we can directly compute the output which is the average of the four\n   * smoothed values.  Each of the four member pixels contributes a fraction\n   * (1-8*SF) to its own smoothed image and a fraction SF to each of the three\n   * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final\n   * output.  The four corner-adjacent neighbor pixels contribute a fraction\n   * SF to just one smoothed pixel, or SF/4 to the final output; while the\n   * eight edge-adjacent neighbors contribute SF to each of two smoothed\n   * pixels, or SF/2 overall.  In order to use integer arithmetic, these\n   * factors are scaled by 2^16 = 65536.\n   * Also recall that SF = smoothing_factor / 1024.\n   */\n\n  memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */\n  neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */\n\n  inrow = outrow = 0;\n  while (inrow < cinfo->max_v_samp_factor) {\n    outptr = output_data[outrow];\n    inptr0 = input_data[inrow];\n    inptr1 = input_data[inrow+1];\n    above_ptr = input_data[inrow-1];\n    below_ptr = input_data[inrow+2];\n\n    /* Special case for first column: pretend column -1 is same as column 0 */\n    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +\n\t\tGETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);\n    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +\n\t       GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +\n\t       GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +\n\t       GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);\n    neighsum += neighsum;\n    neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +\n\t\tGETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);\n    membersum = membersum * memberscale + neighsum * neighscale;\n    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);\n    inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;\n\n    for (colctr = output_cols - 2; colctr > 0; colctr--) {\n      /* sum of pixels directly mapped to this output element */\n      membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +\n\t\t  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);\n      /* sum of edge-neighbor pixels */\n      neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +\n\t\t GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +\n\t\t GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +\n\t\t GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);\n      /* The edge-neighbors count twice as much as corner-neighbors */\n      neighsum += neighsum;\n      /* Add in the corner-neighbors */\n      neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +\n\t\t  GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);\n      /* form final output scaled up by 2^16 */\n      membersum = membersum * memberscale + neighsum * neighscale;\n      /* round, descale and output it */\n      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);\n      inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;\n    }\n\n    /* Special case for last column */\n    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +\n\t\tGETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);\n    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +\n\t       GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +\n\t       GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +\n\t       GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);\n    neighsum += neighsum;\n    neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +\n\t\tGETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);\n    membersum = membersum * memberscale + neighsum * neighscale;\n    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);\n\n    inrow += 2;\n    outrow++;\n  }\n}\n\n\n/*\n * Downsample pixel values of a single component.\n * This version handles the special case of a full-size component,\n * with smoothing.  One row of context is required.\n */\n\nMETHODDEF(void)\nfullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,\n\t\t\t    JSAMPARRAY input_data, JSAMPARRAY output_data)\n{\n  int inrow;\n  JDIMENSION colctr;\n  JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size;\n  register JSAMPROW inptr, above_ptr, below_ptr, outptr;\n  INT32 membersum, neighsum, memberscale, neighscale;\n  int colsum, lastcolsum, nextcolsum;\n\n  /* Expand input data enough to let all the output samples be generated\n   * by the standard loop.  Special-casing padded output would be more\n   * efficient.\n   */\n  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,\n\t\t    cinfo->image_width, output_cols);\n\n  /* Each of the eight neighbor pixels contributes a fraction SF to the\n   * smoothed pixel, while the main pixel contributes (1-8*SF).  In order\n   * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.\n   * Also recall that SF = smoothing_factor / 1024.\n   */\n\n  memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */\n  neighscale = cinfo->smoothing_factor * 64; /* scaled SF */\n\n  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {\n    outptr = output_data[inrow];\n    inptr = input_data[inrow];\n    above_ptr = input_data[inrow-1];\n    below_ptr = input_data[inrow+1];\n\n    /* Special case for first column */\n    colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +\n\t     GETJSAMPLE(*inptr);\n    membersum = GETJSAMPLE(*inptr++);\n    nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +\n\t\t GETJSAMPLE(*inptr);\n    neighsum = colsum + (colsum - membersum) + nextcolsum;\n    membersum = membersum * memberscale + neighsum * neighscale;\n    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);\n    lastcolsum = colsum; colsum = nextcolsum;\n\n    for (colctr = output_cols - 2; colctr > 0; colctr--) {\n      membersum = GETJSAMPLE(*inptr++);\n      above_ptr++; below_ptr++;\n      nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +\n\t\t   GETJSAMPLE(*inptr);\n      neighsum = lastcolsum + (colsum - membersum) + nextcolsum;\n      membersum = membersum * memberscale + neighsum * neighscale;\n      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);\n      lastcolsum = colsum; colsum = nextcolsum;\n    }\n\n    /* Special case for last column */\n    membersum = GETJSAMPLE(*inptr);\n    neighsum = lastcolsum + (colsum - membersum) + colsum;\n    membersum = membersum * memberscale + neighsum * neighscale;\n    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);\n\n  }\n}\n\n#endif /* INPUT_SMOOTHING_SUPPORTED */\n\n\n/*\n * Module initialization routine for downsampling.\n * Note that we must select a routine for each component.\n */\n\nGLOBAL(void)\njinit_downsampler (j_compress_ptr cinfo)\n{\n  my_downsample_ptr downsample;\n  int ci;\n  jpeg_component_info * compptr;\n  boolean smoothok = TRUE;\n  int h_in_group, v_in_group, h_out_group, v_out_group;\n\n  downsample = (my_downsample_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_downsampler));\n  cinfo->downsample = (struct jpeg_downsampler *) downsample;\n  downsample->pub.start_pass = start_pass_downsample;\n  downsample->pub.downsample = sep_downsample;\n  downsample->pub.need_context_rows = FALSE;\n\n  if (cinfo->CCIR601_sampling)\n    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);\n\n  /* Verify we can handle the sampling factors, and set up method pointers */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Compute size of an \"output group\" for DCT scaling.  This many samples\n     * are to be converted from max_h_samp_factor * max_v_samp_factor pixels.\n     */\n    h_out_group = (compptr->h_samp_factor * compptr->DCT_h_scaled_size) /\n\t\t  cinfo->min_DCT_h_scaled_size;\n    v_out_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /\n\t\t  cinfo->min_DCT_v_scaled_size;\n    h_in_group = cinfo->max_h_samp_factor;\n    v_in_group = cinfo->max_v_samp_factor;\n    downsample->rowgroup_height[ci] = v_out_group; /* save for use later */\n    if (h_in_group == h_out_group && v_in_group == v_out_group) {\n#ifdef INPUT_SMOOTHING_SUPPORTED\n      if (cinfo->smoothing_factor) {\n\tdownsample->methods[ci] = fullsize_smooth_downsample;\n\tdownsample->pub.need_context_rows = TRUE;\n      } else\n#endif\n\tdownsample->methods[ci] = fullsize_downsample;\n    } else if (h_in_group == h_out_group * 2 &&\n\t       v_in_group == v_out_group) {\n      smoothok = FALSE;\n      downsample->methods[ci] = h2v1_downsample;\n    } else if (h_in_group == h_out_group * 2 &&\n\t       v_in_group == v_out_group * 2) {\n#ifdef INPUT_SMOOTHING_SUPPORTED\n      if (cinfo->smoothing_factor) {\n\tdownsample->methods[ci] = h2v2_smooth_downsample;\n\tdownsample->pub.need_context_rows = TRUE;\n      } else\n#endif\n\tdownsample->methods[ci] = h2v2_downsample;\n    } else if ((h_in_group % h_out_group) == 0 &&\n\t       (v_in_group % v_out_group) == 0) {\n      smoothok = FALSE;\n      downsample->methods[ci] = int_downsample;\n      downsample->h_expand[ci] = (UINT8) (h_in_group / h_out_group);\n      downsample->v_expand[ci] = (UINT8) (v_in_group / v_out_group);\n    } else\n      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);\n  }\n\n#ifdef INPUT_SMOOTHING_SUPPORTED\n  if (cinfo->smoothing_factor && !smoothok)\n    TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);\n#endif\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jctrans.c",
    "content": "/*\n * jctrans.c\n *\n * Copyright (C) 1995-1998, Thomas G. Lane.\n * Modified 2000-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains library routines for transcoding compression,\n * that is, writing raw DCT coefficient arrays to an output JPEG file.\n * The routines in jcapimin.c will also be needed by a transcoder.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Forward declarations */\nLOCAL(void) transencode_master_selection\n\tJPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));\nLOCAL(void) transencode_coef_controller\n\tJPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));\n\n\n/*\n * Compression initialization for writing raw-coefficient data.\n * Before calling this, all parameters and a data destination must be set up.\n * Call jpeg_finish_compress() to actually write the data.\n *\n * The number of passed virtual arrays must match cinfo->num_components.\n * Note that the virtual arrays need not be filled or even realized at\n * the time write_coefficients is called; indeed, if the virtual arrays\n * were requested from this compression object's memory manager, they\n * typically will be realized during this routine and filled afterwards.\n */\n\nGLOBAL(void)\njpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)\n{\n  if (cinfo->global_state != CSTATE_START)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  /* Mark all tables to be written */\n  jpeg_suppress_tables(cinfo, FALSE);\n  /* (Re)initialize error mgr and destination modules */\n  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);\n  (*cinfo->dest->init_destination) (cinfo);\n  /* Perform master selection of active modules */\n  transencode_master_selection(cinfo, coef_arrays);\n  /* Wait for jpeg_finish_compress() call */\n  cinfo->next_scanline = 0;\t/* so jpeg_write_marker works */\n  cinfo->global_state = CSTATE_WRCOEFS;\n}\n\n\n/*\n * Initialize the compression object with default parameters,\n * then copy from the source object all parameters needed for lossless\n * transcoding.  Parameters that can be varied without loss (such as\n * scan script and Huffman optimization) are left in their default states.\n */\n\nGLOBAL(void)\njpeg_copy_critical_parameters (j_decompress_ptr srcinfo,\n\t\t\t       j_compress_ptr dstinfo)\n{\n  JQUANT_TBL ** qtblptr;\n  jpeg_component_info *incomp, *outcomp;\n  JQUANT_TBL *c_quant, *slot_quant;\n  int tblno, ci, coefi;\n\n  /* Safety check to ensure start_compress not called yet. */\n  if (dstinfo->global_state != CSTATE_START)\n    ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state);\n  /* Copy fundamental image dimensions */\n  dstinfo->image_width = srcinfo->image_width;\n  dstinfo->image_height = srcinfo->image_height;\n  dstinfo->input_components = srcinfo->num_components;\n  dstinfo->in_color_space = srcinfo->jpeg_color_space;\n  dstinfo->jpeg_width = srcinfo->output_width;\n  dstinfo->jpeg_height = srcinfo->output_height;\n  dstinfo->min_DCT_h_scaled_size = srcinfo->min_DCT_h_scaled_size;\n  dstinfo->min_DCT_v_scaled_size = srcinfo->min_DCT_v_scaled_size;\n  /* Initialize all parameters to default values */\n  jpeg_set_defaults(dstinfo);\n  /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.\n   * Fix it to get the right header markers for the image colorspace.\n   * Note: Entropy table assignment in jpeg_set_colorspace depends\n   * on color_transform.\n   */\n  dstinfo->color_transform = srcinfo->color_transform;\n  jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);\n  dstinfo->data_precision = srcinfo->data_precision;\n  dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;\n  /* Copy the source's quantization tables. */\n  for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {\n    if (srcinfo->quant_tbl_ptrs[tblno] != NULL) {\n      qtblptr = & dstinfo->quant_tbl_ptrs[tblno];\n      if (*qtblptr == NULL)\n\t*qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo);\n      MEMCOPY((*qtblptr)->quantval,\n\t      srcinfo->quant_tbl_ptrs[tblno]->quantval,\n\t      SIZEOF((*qtblptr)->quantval));\n      (*qtblptr)->sent_table = FALSE;\n    }\n  }\n  /* Copy the source's per-component info.\n   * Note we assume jpeg_set_defaults has allocated the dest comp_info array.\n   */\n  dstinfo->num_components = srcinfo->num_components;\n  if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS)\n    ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components,\n\t     MAX_COMPONENTS);\n  for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info;\n       ci < dstinfo->num_components; ci++, incomp++, outcomp++) {\n    outcomp->component_id = incomp->component_id;\n    outcomp->h_samp_factor = incomp->h_samp_factor;\n    outcomp->v_samp_factor = incomp->v_samp_factor;\n    outcomp->quant_tbl_no = incomp->quant_tbl_no;\n    /* Make sure saved quantization table for component matches the qtable\n     * slot.  If not, the input file re-used this qtable slot.\n     * IJG encoder currently cannot duplicate this.\n     */\n    tblno = outcomp->quant_tbl_no;\n    if (tblno < 0 || tblno >= NUM_QUANT_TBLS ||\n\tsrcinfo->quant_tbl_ptrs[tblno] == NULL)\n      ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno);\n    slot_quant = srcinfo->quant_tbl_ptrs[tblno];\n    c_quant = incomp->quant_table;\n    if (c_quant != NULL) {\n      for (coefi = 0; coefi < DCTSIZE2; coefi++) {\n\tif (c_quant->quantval[coefi] != slot_quant->quantval[coefi])\n\t  ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);\n      }\n    }\n    /* Note: we do not copy the source's entropy table assignments;\n     * instead we rely on jpeg_set_colorspace to have made a suitable choice.\n     */\n  }\n  /* Also copy JFIF version and resolution information, if available.\n   * Strictly speaking this isn't \"critical\" info, but it's nearly\n   * always appropriate to copy it if available.  In particular,\n   * if the application chooses to copy JFIF 1.02 extension markers from\n   * the source file, we need to copy the version to make sure we don't\n   * emit a file that has 1.02 extensions but a claimed version of 1.01.\n   * We will *not*, however, copy version info from mislabeled \"2.01\" files.\n   */\n  if (srcinfo->saw_JFIF_marker) {\n    if (srcinfo->JFIF_major_version == 1) {\n      dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;\n      dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;\n    }\n    dstinfo->density_unit = srcinfo->density_unit;\n    dstinfo->X_density = srcinfo->X_density;\n    dstinfo->Y_density = srcinfo->Y_density;\n  }\n}\n\n\n/*\n * Master selection of compression modules for transcoding.\n * This substitutes for jcinit.c's initialization of the full compressor.\n */\n\nLOCAL(void)\ntransencode_master_selection (j_compress_ptr cinfo,\n\t\t\t      jvirt_barray_ptr * coef_arrays)\n{\n  /* Initialize master control (includes parameter checking/processing) */\n  jinit_c_master_control(cinfo, TRUE /* transcode only */);\n\n  /* Entropy encoding: either Huffman or arithmetic coding. */\n  if (cinfo->arith_code)\n    jinit_arith_encoder(cinfo);\n  else {\n    jinit_huff_encoder(cinfo);\n  }\n\n  /* We need a special coefficient buffer controller. */\n  transencode_coef_controller(cinfo, coef_arrays);\n\n  jinit_marker_writer(cinfo);\n\n  /* We can now tell the memory manager to allocate virtual arrays. */\n  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);\n\n  /* Write the datastream header (SOI, JFIF) immediately.\n   * Frame and scan headers are postponed till later.\n   * This lets application insert special markers after the SOI.\n   */\n  (*cinfo->marker->write_file_header) (cinfo);\n}\n\n\n/*\n * The rest of this file is a special implementation of the coefficient\n * buffer controller.  This is similar to jccoefct.c, but it handles only\n * output from presupplied virtual arrays.  Furthermore, we generate any\n * dummy padding blocks on-the-fly rather than expecting them to be present\n * in the arrays.\n */\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_c_coef_controller pub; /* public fields */\n\n  JDIMENSION iMCU_row_num;\t/* iMCU row # within image */\n  JDIMENSION mcu_ctr;\t\t/* counts MCUs processed in current row */\n  int MCU_vert_offset;\t\t/* counts MCU rows within iMCU row */\n  int MCU_rows_per_iMCU_row;\t/* number of such rows needed */\n\n  /* Virtual block array for each component. */\n  jvirt_barray_ptr * whole_image;\n\n  /* Workspace for constructing dummy blocks at right/bottom edges. */\n  JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];\n} my_coef_controller;\n\ntypedef my_coef_controller * my_coef_ptr;\n\n\nLOCAL(void)\nstart_iMCU_row (j_compress_ptr cinfo)\n/* Reset within-iMCU-row counters for a new row */\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  /* In an interleaved scan, an MCU row is the same as an iMCU row.\n   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.\n   * But at the bottom of the image, process only what's left.\n   */\n  if (cinfo->comps_in_scan > 1) {\n    coef->MCU_rows_per_iMCU_row = 1;\n  } else {\n    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;\n    else\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;\n  }\n\n  coef->mcu_ctr = 0;\n  coef->MCU_vert_offset = 0;\n}\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  if (pass_mode != JBUF_CRANK_DEST)\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n\n  coef->iMCU_row_num = 0;\n  start_iMCU_row(cinfo);\n}\n\n\n/*\n * Process some data.\n * We process the equivalent of one fully interleaved MCU row (\"iMCU\" row)\n * per call, ie, v_samp_factor block rows for each component in the scan.\n * The data is obtained from the virtual arrays and fed to the entropy coder.\n * Returns TRUE if the iMCU row is completed, FALSE if suspended.\n *\n * NB: input_buf is ignored; it is likely to be a NULL pointer.\n */\n\nMETHODDEF(boolean)\ncompress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  int blkn, ci, xindex, yindex, yoffset, blockcnt;\n  JDIMENSION start_col;\n  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];\n  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];\n  JBLOCKROW buffer_ptr;\n  jpeg_component_info *compptr;\n\n  /* Align the virtual buffers for the components used in this scan. */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    buffer[ci] = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],\n       coef->iMCU_row_num * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, FALSE);\n  }\n\n  /* Loop to process one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;\n\t MCU_col_num++) {\n      /* Construct list of pointers to DCT blocks belonging to this MCU */\n      blkn = 0;\t\t\t/* index of current DCT block within MCU */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\tstart_col = MCU_col_num * compptr->MCU_width;\n\tblockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width\n\t\t\t\t\t\t: compptr->last_col_width;\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  if (coef->iMCU_row_num < last_iMCU_row ||\n\t      yindex+yoffset < compptr->last_row_height) {\n\t    /* Fill in pointers to real blocks in this row */\n\t    buffer_ptr = buffer[ci][yindex+yoffset] + start_col;\n\t    for (xindex = 0; xindex < blockcnt; xindex++)\n\t      MCU_buffer[blkn++] = buffer_ptr++;\n\t  } else {\n\t    /* At bottom of image, need a whole row of dummy blocks */\n\t    xindex = 0;\n\t  }\n\t  /* Fill in any dummy blocks needed in this row.\n\t   * Dummy blocks are filled in the same way as in jccoefct.c:\n\t   * all zeroes in the AC entries, DC entries equal to previous\n\t   * block's DC value.  The init routine has already zeroed the\n\t   * AC entries, so we need only set the DC entries correctly.\n\t   */\n\t  for (; xindex < compptr->MCU_width; xindex++) {\n\t    MCU_buffer[blkn] = coef->dummy_buffer[blkn];\n\t    MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];\n\t    blkn++;\n\t  }\n\t}\n      }\n      /* Try to write the MCU. */\n      if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->mcu_ctr = MCU_col_num;\n\treturn FALSE;\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->mcu_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  coef->iMCU_row_num++;\n  start_iMCU_row(cinfo);\n  return TRUE;\n}\n\n\n/*\n * Initialize coefficient buffer controller.\n *\n * Each passed coefficient array must be the right size for that\n * coefficient: width_in_blocks wide and height_in_blocks high,\n * with unitheight at least v_samp_factor.\n */\n\nLOCAL(void)\ntransencode_coef_controller (j_compress_ptr cinfo,\n\t\t\t     jvirt_barray_ptr * coef_arrays)\n{\n  my_coef_ptr coef;\n  JBLOCKROW buffer;\n  int i;\n\n  coef = (my_coef_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_coef_controller));\n  cinfo->coef = &coef->pub;\n  coef->pub.start_pass = start_pass_coef;\n  coef->pub.compress_data = compress_output;\n\n  /* Save pointer to virtual arrays */\n  coef->whole_image = coef_arrays;\n\n  /* Allocate and pre-zero space for dummy DCT blocks. */\n  buffer = (JBLOCKROW)\n    (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tC_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));\n  FMEMZERO((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));\n  for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {\n    coef->dummy_buffer[i] = buffer + i;\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdapimin.c",
    "content": "/*\n * jdapimin.c\n *\n * Copyright (C) 1994-1998, Thomas G. Lane.\n * Modified 2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface code for the decompression half\n * of the JPEG library.  These are the \"minimum\" API routines that may be\n * needed in either the normal full-decompression case or the\n * transcoding-only case.\n *\n * Most of the routines intended to be called directly by an application\n * are in this file or in jdapistd.c.  But also see jcomapi.c for routines\n * shared by compression and decompression, and jdtrans.c for the transcoding\n * case.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * Initialization of a JPEG decompression object.\n * The error manager must already be set up (in case memory manager fails).\n */\n\nGLOBAL(void)\njpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)\n{\n  int i;\n\n  /* Guard against version mismatches between library and caller. */\n  cinfo->mem = NULL;\t\t/* so jpeg_destroy knows mem mgr not called */\n  if (version != JPEG_LIB_VERSION)\n    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);\n  if (structsize != SIZEOF(struct jpeg_decompress_struct))\n    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, \n\t     (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);\n\n  /* For debugging purposes, we zero the whole master structure.\n   * But the application has already set the err pointer, and may have set\n   * client_data, so we have to save and restore those fields.\n   * Note: if application hasn't set client_data, tools like Purify may\n   * complain here.\n   */\n  {\n    struct jpeg_error_mgr * err = cinfo->err;\n    void * client_data = cinfo->client_data; /* ignore Purify complaint here */\n    MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));\n    cinfo->err = err;\n    cinfo->client_data = client_data;\n  }\n  cinfo->is_decompressor = TRUE;\n\n  /* Initialize a memory manager instance for this object */\n  jinit_memory_mgr((j_common_ptr) cinfo);\n\n  /* Zero out pointers to permanent structures. */\n  cinfo->progress = NULL;\n  cinfo->src = NULL;\n\n  for (i = 0; i < NUM_QUANT_TBLS; i++)\n    cinfo->quant_tbl_ptrs[i] = NULL;\n\n  for (i = 0; i < NUM_HUFF_TBLS; i++) {\n    cinfo->dc_huff_tbl_ptrs[i] = NULL;\n    cinfo->ac_huff_tbl_ptrs[i] = NULL;\n  }\n\n  /* Initialize marker processor so application can override methods\n   * for COM, APPn markers before calling jpeg_read_header.\n   */\n  cinfo->marker_list = NULL;\n  jinit_marker_reader(cinfo);\n\n  /* And initialize the overall input controller. */\n  jinit_input_controller(cinfo);\n\n  /* OK, I'm ready */\n  cinfo->global_state = DSTATE_START;\n}\n\n\n/*\n * Destruction of a JPEG decompression object\n */\n\nGLOBAL(void)\njpeg_destroy_decompress (j_decompress_ptr cinfo)\n{\n  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */\n}\n\n\n/*\n * Abort processing of a JPEG decompression operation,\n * but don't destroy the object itself.\n */\n\nGLOBAL(void)\njpeg_abort_decompress (j_decompress_ptr cinfo)\n{\n  jpeg_abort((j_common_ptr) cinfo); /* use common routine */\n}\n\n\n/*\n * Set default decompression parameters.\n */\n\nLOCAL(void)\ndefault_decompress_parms (j_decompress_ptr cinfo)\n{\n  /* Guess the input colorspace, and set output colorspace accordingly. */\n  /* (Wish JPEG committee had provided a real way to specify this...) */\n  /* Note application may override our guesses. */\n  switch (cinfo->num_components) {\n  case 1:\n    cinfo->jpeg_color_space = JCS_GRAYSCALE;\n    cinfo->out_color_space = JCS_GRAYSCALE;\n    break;\n    \n  case 3:\n    if (cinfo->saw_JFIF_marker) {\n      cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */\n    } else if (cinfo->saw_Adobe_marker) {\n      switch (cinfo->Adobe_transform) {\n      case 0:\n\tcinfo->jpeg_color_space = JCS_RGB;\n\tbreak;\n      case 1:\n\tcinfo->jpeg_color_space = JCS_YCbCr;\n\tbreak;\n      default:\n\tWARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);\n\tcinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */\n\tbreak;\n      }\n    } else {\n      /* Saw no special markers, try to guess from the component IDs */\n      int cid0 = cinfo->comp_info[0].component_id;\n      int cid1 = cinfo->comp_info[1].component_id;\n      int cid2 = cinfo->comp_info[2].component_id;\n\n      if (cid0 == 1 && cid1 == 2 && cid2 == 3)\n\tcinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */\n      else if (cid0 == 82 && cid1 == 71 && cid2 == 66)\n\tcinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */\n      else {\n\tTRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);\n\tcinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */\n      }\n    }\n    /* Always guess RGB is proper output colorspace. */\n    cinfo->out_color_space = JCS_RGB;\n    break;\n    \n  case 4:\n    if (cinfo->saw_Adobe_marker) {\n      switch (cinfo->Adobe_transform) {\n      case 0:\n\tcinfo->jpeg_color_space = JCS_CMYK;\n\tbreak;\n      case 2:\n\tcinfo->jpeg_color_space = JCS_YCCK;\n\tbreak;\n      default:\n\tWARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);\n\tcinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */\n\tbreak;\n      }\n    } else {\n      /* No special markers, assume straight CMYK. */\n      cinfo->jpeg_color_space = JCS_CMYK;\n    }\n    cinfo->out_color_space = JCS_CMYK;\n    break;\n    \n  default:\n    cinfo->jpeg_color_space = JCS_UNKNOWN;\n    cinfo->out_color_space = JCS_UNKNOWN;\n    break;\n  }\n\n  /* Set defaults for other decompression parameters. */\n  cinfo->scale_num = cinfo->block_size;\t\t/* 1:1 scaling */\n  cinfo->scale_denom = cinfo->block_size;\n  cinfo->output_gamma = 1.0;\n  cinfo->buffered_image = FALSE;\n  cinfo->raw_data_out = FALSE;\n  cinfo->dct_method = JDCT_DEFAULT;\n  cinfo->do_fancy_upsampling = TRUE;\n  cinfo->do_block_smoothing = TRUE;\n  cinfo->quantize_colors = FALSE;\n  /* We set these in case application only sets quantize_colors. */\n  cinfo->dither_mode = JDITHER_FS;\n#ifdef QUANT_2PASS_SUPPORTED\n  cinfo->two_pass_quantize = TRUE;\n#else\n  cinfo->two_pass_quantize = FALSE;\n#endif\n  cinfo->desired_number_of_colors = 256;\n  cinfo->colormap = NULL;\n  /* Initialize for no mode change in buffered-image mode. */\n  cinfo->enable_1pass_quant = FALSE;\n  cinfo->enable_external_quant = FALSE;\n  cinfo->enable_2pass_quant = FALSE;\n}\n\n\n/*\n * Decompression startup: read start of JPEG datastream to see what's there.\n * Need only initialize JPEG object and supply a data source before calling.\n *\n * This routine will read as far as the first SOS marker (ie, actual start of\n * compressed data), and will save all tables and parameters in the JPEG\n * object.  It will also initialize the decompression parameters to default\n * values, and finally return JPEG_HEADER_OK.  On return, the application may\n * adjust the decompression parameters and then call jpeg_start_decompress.\n * (Or, if the application only wanted to determine the image parameters,\n * the data need not be decompressed.  In that case, call jpeg_abort or\n * jpeg_destroy to release any temporary space.)\n * If an abbreviated (tables only) datastream is presented, the routine will\n * return JPEG_HEADER_TABLES_ONLY upon reaching EOI.  The application may then\n * re-use the JPEG object to read the abbreviated image datastream(s).\n * It is unnecessary (but OK) to call jpeg_abort in this case.\n * The JPEG_SUSPENDED return code only occurs if the data source module\n * requests suspension of the decompressor.  In this case the application\n * should load more source data and then re-call jpeg_read_header to resume\n * processing.\n * If a non-suspending data source is used and require_image is TRUE, then the\n * return code need not be inspected since only JPEG_HEADER_OK is possible.\n *\n * This routine is now just a front end to jpeg_consume_input, with some\n * extra error checking.\n */\n\nGLOBAL(int)\njpeg_read_header (j_decompress_ptr cinfo, boolean require_image)\n{\n  int retcode;\n\n  if (cinfo->global_state != DSTATE_START &&\n      cinfo->global_state != DSTATE_INHEADER)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  retcode = jpeg_consume_input(cinfo);\n\n  switch (retcode) {\n  case JPEG_REACHED_SOS:\n    retcode = JPEG_HEADER_OK;\n    break;\n  case JPEG_REACHED_EOI:\n    if (require_image)\t\t/* Complain if application wanted an image */\n      ERREXIT(cinfo, JERR_NO_IMAGE);\n    /* Reset to start state; it would be safer to require the application to\n     * call jpeg_abort, but we can't change it now for compatibility reasons.\n     * A side effect is to free any temporary memory (there shouldn't be any).\n     */\n    jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */\n    retcode = JPEG_HEADER_TABLES_ONLY;\n    break;\n  case JPEG_SUSPENDED:\n    /* no work */\n    break;\n  }\n\n  return retcode;\n}\n\n\n/*\n * Consume data in advance of what the decompressor requires.\n * This can be called at any time once the decompressor object has\n * been created and a data source has been set up.\n *\n * This routine is essentially a state machine that handles a couple\n * of critical state-transition actions, namely initial setup and\n * transition from header scanning to ready-for-start_decompress.\n * All the actual input is done via the input controller's consume_input\n * method.\n */\n\nGLOBAL(int)\njpeg_consume_input (j_decompress_ptr cinfo)\n{\n  int retcode = JPEG_SUSPENDED;\n\n  /* NB: every possible DSTATE value should be listed in this switch */\n  switch (cinfo->global_state) {\n  case DSTATE_START:\n    /* Start-of-datastream actions: reset appropriate modules */\n    (*cinfo->inputctl->reset_input_controller) (cinfo);\n    /* Initialize application's data source module */\n    (*cinfo->src->init_source) (cinfo);\n    cinfo->global_state = DSTATE_INHEADER;\n    /*FALLTHROUGH*/\n  case DSTATE_INHEADER:\n    retcode = (*cinfo->inputctl->consume_input) (cinfo);\n    if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */\n      /* Set up default parameters based on header data */\n      default_decompress_parms(cinfo);\n      /* Set global state: ready for start_decompress */\n      cinfo->global_state = DSTATE_READY;\n    }\n    break;\n  case DSTATE_READY:\n    /* Can't advance past first SOS until start_decompress is called */\n    retcode = JPEG_REACHED_SOS;\n    break;\n  case DSTATE_PRELOAD:\n  case DSTATE_PRESCAN:\n  case DSTATE_SCANNING:\n  case DSTATE_RAW_OK:\n  case DSTATE_BUFIMAGE:\n  case DSTATE_BUFPOST:\n  case DSTATE_STOPPING:\n    retcode = (*cinfo->inputctl->consume_input) (cinfo);\n    break;\n  default:\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  }\n  return retcode;\n}\n\n\n/*\n * Have we finished reading the input file?\n */\n\nGLOBAL(boolean)\njpeg_input_complete (j_decompress_ptr cinfo)\n{\n  /* Check for valid jpeg object */\n  if (cinfo->global_state < DSTATE_START ||\n      cinfo->global_state > DSTATE_STOPPING)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  return cinfo->inputctl->eoi_reached;\n}\n\n\n/*\n * Is there more than one scan?\n */\n\nGLOBAL(boolean)\njpeg_has_multiple_scans (j_decompress_ptr cinfo)\n{\n  /* Only valid after jpeg_read_header completes */\n  if (cinfo->global_state < DSTATE_READY ||\n      cinfo->global_state > DSTATE_STOPPING)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  return cinfo->inputctl->has_multiple_scans;\n}\n\n\n/*\n * Finish JPEG decompression.\n *\n * This will normally just verify the file trailer and release temp storage.\n *\n * Returns FALSE if suspended.  The return value need be inspected only if\n * a suspending data source is used.\n */\n\nGLOBAL(boolean)\njpeg_finish_decompress (j_decompress_ptr cinfo)\n{\n  if ((cinfo->global_state == DSTATE_SCANNING ||\n       cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {\n    /* Terminate final pass of non-buffered mode */\n    if (cinfo->output_scanline < cinfo->output_height)\n      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);\n    (*cinfo->master->finish_output_pass) (cinfo);\n    cinfo->global_state = DSTATE_STOPPING;\n  } else if (cinfo->global_state == DSTATE_BUFIMAGE) {\n    /* Finishing after a buffered-image operation */\n    cinfo->global_state = DSTATE_STOPPING;\n  } else if (cinfo->global_state != DSTATE_STOPPING) {\n    /* STOPPING = repeat call after a suspension, anything else is error */\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  }\n  /* Read until EOI */\n  while (! cinfo->inputctl->eoi_reached) {\n    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)\n      return FALSE;\t\t/* Suspend, come back later */\n  }\n  /* Do final cleanup */\n  (*cinfo->src->term_source) (cinfo);\n  /* We can use jpeg_abort to release memory and reset global_state */\n  jpeg_abort((j_common_ptr) cinfo);\n  return TRUE;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdapistd.c",
    "content": "/*\n * jdapistd.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains application interface code for the decompression half\n * of the JPEG library.  These are the \"standard\" API routines that are\n * used in the normal full-decompression case.  They are not used by a\n * transcoding-only application.  Note that if an application links in\n * jpeg_start_decompress, it will end up linking in the entire decompressor.\n * We thus must separate this file from jdapimin.c to avoid linking the\n * whole decompression library into a transcoder.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Forward declarations */\nLOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));\n\n\n/*\n * Decompression initialization.\n * jpeg_read_header must be completed before calling this.\n *\n * If a multipass operating mode was selected, this will do all but the\n * last pass, and thus may take a great deal of time.\n *\n * Returns FALSE if suspended.  The return value need be inspected only if\n * a suspending data source is used.\n */\n\nGLOBAL(boolean)\njpeg_start_decompress (j_decompress_ptr cinfo)\n{\n  if (cinfo->global_state == DSTATE_READY) {\n    /* First call: initialize master control, select active modules */\n    jinit_master_decompress(cinfo);\n    if (cinfo->buffered_image) {\n      /* No more work here; expecting jpeg_start_output next */\n      cinfo->global_state = DSTATE_BUFIMAGE;\n      return TRUE;\n    }\n    cinfo->global_state = DSTATE_PRELOAD;\n  }\n  if (cinfo->global_state == DSTATE_PRELOAD) {\n    /* If file has multiple scans, absorb them all into the coef buffer */\n    if (cinfo->inputctl->has_multiple_scans) {\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n      for (;;) {\n\tint retcode;\n\t/* Call progress monitor hook if present */\n\tif (cinfo->progress != NULL)\n\t  (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n\t/* Absorb some more input */\n\tretcode = (*cinfo->inputctl->consume_input) (cinfo);\n\tif (retcode == JPEG_SUSPENDED)\n\t  return FALSE;\n\tif (retcode == JPEG_REACHED_EOI)\n\t  break;\n\t/* Advance progress counter if appropriate */\n\tif (cinfo->progress != NULL &&\n\t    (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {\n\t  if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {\n\t    /* jdmaster underestimated number of scans; ratchet up one scan */\n\t    cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;\n\t  }\n\t}\n      }\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n    }\n    cinfo->output_scan_number = cinfo->input_scan_number;\n  } else if (cinfo->global_state != DSTATE_PRESCAN)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  /* Perform any dummy output passes, and set up for the final pass */\n  return output_pass_setup(cinfo);\n}\n\n\n/*\n * Set up for an output pass, and perform any dummy pass(es) needed.\n * Common subroutine for jpeg_start_decompress and jpeg_start_output.\n * Entry: global_state = DSTATE_PRESCAN only if previously suspended.\n * Exit: If done, returns TRUE and sets global_state for proper output mode.\n *       If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.\n */\n\nLOCAL(boolean)\noutput_pass_setup (j_decompress_ptr cinfo)\n{\n  if (cinfo->global_state != DSTATE_PRESCAN) {\n    /* First call: do pass setup */\n    (*cinfo->master->prepare_for_output_pass) (cinfo);\n    cinfo->output_scanline = 0;\n    cinfo->global_state = DSTATE_PRESCAN;\n  }\n  /* Loop over any required dummy passes */\n  while (cinfo->master->is_dummy_pass) {\n#ifdef QUANT_2PASS_SUPPORTED\n    /* Crank through the dummy pass */\n    while (cinfo->output_scanline < cinfo->output_height) {\n      JDIMENSION last_scanline;\n      /* Call progress monitor hook if present */\n      if (cinfo->progress != NULL) {\n\tcinfo->progress->pass_counter = (long) cinfo->output_scanline;\n\tcinfo->progress->pass_limit = (long) cinfo->output_height;\n\t(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n      }\n      /* Process some data */\n      last_scanline = cinfo->output_scanline;\n      (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,\n\t\t\t\t    &cinfo->output_scanline, (JDIMENSION) 0);\n      if (cinfo->output_scanline == last_scanline)\n\treturn FALSE;\t\t/* No progress made, must suspend */\n    }\n    /* Finish up dummy pass, and set up for another one */\n    (*cinfo->master->finish_output_pass) (cinfo);\n    (*cinfo->master->prepare_for_output_pass) (cinfo);\n    cinfo->output_scanline = 0;\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif /* QUANT_2PASS_SUPPORTED */\n  }\n  /* Ready for application to drive output pass through\n   * jpeg_read_scanlines or jpeg_read_raw_data.\n   */\n  cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;\n  return TRUE;\n}\n\n\n/*\n * Read some scanlines of data from the JPEG decompressor.\n *\n * The return value will be the number of lines actually read.\n * This may be less than the number requested in several cases,\n * including bottom of image, data source suspension, and operating\n * modes that emit multiple scanlines at a time.\n *\n * Note: we warn about excess calls to jpeg_read_scanlines() since\n * this likely signals an application programmer error.  However,\n * an oversize buffer (max_lines > scanlines remaining) is not an error.\n */\n\nGLOBAL(JDIMENSION)\njpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,\n\t\t     JDIMENSION max_lines)\n{\n  JDIMENSION row_ctr;\n\n  if (cinfo->global_state != DSTATE_SCANNING)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  if (cinfo->output_scanline >= cinfo->output_height) {\n    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);\n    return 0;\n  }\n\n  /* Call progress monitor hook if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->pass_counter = (long) cinfo->output_scanline;\n    cinfo->progress->pass_limit = (long) cinfo->output_height;\n    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n  }\n\n  /* Process some data */\n  row_ctr = 0;\n  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);\n  cinfo->output_scanline += row_ctr;\n  return row_ctr;\n}\n\n\n/*\n * Alternate entry point to read raw data.\n * Processes exactly one iMCU row per call, unless suspended.\n */\n\nGLOBAL(JDIMENSION)\njpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,\n\t\t    JDIMENSION max_lines)\n{\n  JDIMENSION lines_per_iMCU_row;\n\n  if (cinfo->global_state != DSTATE_RAW_OK)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  if (cinfo->output_scanline >= cinfo->output_height) {\n    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);\n    return 0;\n  }\n\n  /* Call progress monitor hook if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->pass_counter = (long) cinfo->output_scanline;\n    cinfo->progress->pass_limit = (long) cinfo->output_height;\n    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n  }\n\n  /* Verify that at least one iMCU row can be returned. */\n  lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size;\n  if (max_lines < lines_per_iMCU_row)\n    ERREXIT(cinfo, JERR_BUFFER_SIZE);\n\n  /* Decompress directly into user's buffer. */\n  if (! (*cinfo->coef->decompress_data) (cinfo, data))\n    return 0;\t\t\t/* suspension forced, can do nothing more */\n\n  /* OK, we processed one iMCU row. */\n  cinfo->output_scanline += lines_per_iMCU_row;\n  return lines_per_iMCU_row;\n}\n\n\n/* Additional entry points for buffered-image mode. */\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n\n/*\n * Initialize for an output pass in buffered-image mode.\n */\n\nGLOBAL(boolean)\njpeg_start_output (j_decompress_ptr cinfo, int scan_number)\n{\n  if (cinfo->global_state != DSTATE_BUFIMAGE &&\n      cinfo->global_state != DSTATE_PRESCAN)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  /* Limit scan number to valid range */\n  if (scan_number <= 0)\n    scan_number = 1;\n  if (cinfo->inputctl->eoi_reached &&\n      scan_number > cinfo->input_scan_number)\n    scan_number = cinfo->input_scan_number;\n  cinfo->output_scan_number = scan_number;\n  /* Perform any dummy output passes, and set up for the real pass */\n  return output_pass_setup(cinfo);\n}\n\n\n/*\n * Finish up after an output pass in buffered-image mode.\n *\n * Returns FALSE if suspended.  The return value need be inspected only if\n * a suspending data source is used.\n */\n\nGLOBAL(boolean)\njpeg_finish_output (j_decompress_ptr cinfo)\n{\n  if ((cinfo->global_state == DSTATE_SCANNING ||\n       cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {\n    /* Terminate this pass. */\n    /* We do not require the whole pass to have been completed. */\n    (*cinfo->master->finish_output_pass) (cinfo);\n    cinfo->global_state = DSTATE_BUFPOST;\n  } else if (cinfo->global_state != DSTATE_BUFPOST) {\n    /* BUFPOST = repeat call after a suspension, anything else is error */\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  }\n  /* Read markers looking for SOS or EOI */\n  while (cinfo->input_scan_number <= cinfo->output_scan_number &&\n\t ! cinfo->inputctl->eoi_reached) {\n    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)\n      return FALSE;\t\t/* Suspend, come back later */\n  }\n  cinfo->global_state = DSTATE_BUFIMAGE;\n  return TRUE;\n}\n\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdarith.c",
    "content": "/*\n * jdarith.c\n *\n * Developed 1997-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains portable arithmetic entropy decoding routines for JPEG\n * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).\n *\n * Both sequential and progressive modes are supported in this single module.\n *\n * Suspension is not currently supported in this module.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Expanded entropy decoder object for arithmetic decoding. */\n\ntypedef struct {\n  struct jpeg_entropy_decoder pub; /* public fields */\n\n  INT32 c;       /* C register, base of coding interval + input bit buffer */\n  INT32 a;               /* A register, normalized size of coding interval */\n  int ct;     /* bit shift counter, # of bits left in bit buffer part of C */\n                                                         /* init: ct = -16 */\n                                                         /* run: ct = 0..7 */\n                                                         /* error: ct = -1 */\n  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */\n  int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */\n\n  unsigned int restarts_to_go;\t/* MCUs left in this restart interval */\n\n  /* Pointers to statistics areas (these workspaces have image lifespan) */\n  unsigned char * dc_stats[NUM_ARITH_TBLS];\n  unsigned char * ac_stats[NUM_ARITH_TBLS];\n\n  /* Statistics bin for coding with fixed probability 0.5 */\n  unsigned char fixed_bin[4];\n} arith_entropy_decoder;\n\ntypedef arith_entropy_decoder * arith_entropy_ptr;\n\n/* The following two definitions specify the allocation chunk size\n * for the statistics area.\n * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least\n * 49 statistics bins for DC, and 245 statistics bins for AC coding.\n *\n * We use a compact representation with 1 byte per statistics bin,\n * thus the numbers directly represent byte sizes.\n * This 1 byte per statistics bin contains the meaning of the MPS\n * (more probable symbol) in the highest bit (mask 0x80), and the\n * index into the probability estimation state machine table\n * in the lower bits (mask 0x7F).\n */\n\n#define DC_STAT_BINS 64\n#define AC_STAT_BINS 256\n\n\nLOCAL(int)\nget_byte (j_decompress_ptr cinfo)\n/* Read next input byte; we do not support suspension in this module. */\n{\n  struct jpeg_source_mgr * src = cinfo->src;\n\n  if (src->bytes_in_buffer == 0)\n    if (! (*src->fill_input_buffer) (cinfo))\n      ERREXIT(cinfo, JERR_CANT_SUSPEND);\n  src->bytes_in_buffer--;\n  return GETJOCTET(*src->next_input_byte++);\n}\n\n\n/*\n * The core arithmetic decoding routine (common in JPEG and JBIG).\n * This needs to go as fast as possible.\n * Machine-dependent optimization facilities\n * are not utilized in this portable implementation.\n * However, this code should be fairly efficient and\n * may be a good base for further optimizations anyway.\n *\n * Return value is 0 or 1 (binary decision).\n *\n * Note: I've changed the handling of the code base & bit\n * buffer register C compared to other implementations\n * based on the standards layout & procedures.\n * While it also contains both the actual base of the\n * coding interval (16 bits) and the next-bits buffer,\n * the cut-point between these two parts is floating\n * (instead of fixed) with the bit shift counter CT.\n * Thus, we also need only one (variable instead of\n * fixed size) shift for the LPS/MPS decision, and\n * we can get away with any renormalization update\n * of C (except for new data insertion, of course).\n *\n * I've also introduced a new scheme for accessing\n * the probability estimation state machine table,\n * derived from Markus Kuhn's JBIG implementation.\n */\n\nLOCAL(int)\narith_decode (j_decompress_ptr cinfo, unsigned char *st)\n{\n  register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;\n  register unsigned char nl, nm;\n  register INT32 qe, temp;\n  register int sv, data;\n\n  /* Renormalization & data input per section D.2.6 */\n  while (e->a < 0x8000L) {\n    if (--e->ct < 0) {\n      /* Need to fetch next data byte */\n      if (cinfo->unread_marker)\n\tdata = 0;\t\t/* stuff zero data */\n      else {\n\tdata = get_byte(cinfo);\t/* read next input byte */\n\tif (data == 0xFF) {\t/* zero stuff or marker code */\n\t  do data = get_byte(cinfo);\n\t  while (data == 0xFF);\t/* swallow extra 0xFF bytes */\n\t  if (data == 0)\n\t    data = 0xFF;\t/* discard stuffed zero byte */\n\t  else {\n\t    /* Note: Different from the Huffman decoder, hitting\n\t     * a marker while processing the compressed data\n\t     * segment is legal in arithmetic coding.\n\t     * The convention is to supply zero data\n\t     * then until decoding is complete.\n\t     */\n\t    cinfo->unread_marker = data;\n\t    data = 0;\n\t  }\n\t}\n      }\n      e->c = (e->c << 8) | data; /* insert data into C register */\n      if ((e->ct += 8) < 0)\t /* update bit shift counter */\n\t/* Need more initial bytes */\n\tif (++e->ct == 0)\n\t  /* Got 2 initial bytes -> re-init A and exit loop */\n\t  e->a = 0x8000L; /* => e->a = 0x10000L after loop exit */\n    }\n    e->a <<= 1;\n  }\n\n  /* Fetch values from our compact representation of Table D.3(D.2):\n   * Qe values and probability estimation state machine\n   */\n  sv = *st;\n  qe = jpeg_aritab[sv & 0x7F];\t/* => Qe_Value */\n  nl = qe & 0xFF; qe >>= 8;\t/* Next_Index_LPS + Switch_MPS */\n  nm = qe & 0xFF; qe >>= 8;\t/* Next_Index_MPS */\n\n  /* Decode & estimation procedures per sections D.2.4 & D.2.5 */\n  temp = e->a - qe;\n  e->a = temp;\n  temp <<= e->ct;\n  if (e->c >= temp) {\n    e->c -= temp;\n    /* Conditional LPS (less probable symbol) exchange */\n    if (e->a < qe) {\n      e->a = qe;\n      *st = (sv & 0x80) ^ nm;\t/* Estimate_after_MPS */\n    } else {\n      e->a = qe;\n      *st = (sv & 0x80) ^ nl;\t/* Estimate_after_LPS */\n      sv ^= 0x80;\t\t/* Exchange LPS/MPS */\n    }\n  } else if (e->a < 0x8000L) {\n    /* Conditional MPS (more probable symbol) exchange */\n    if (e->a < qe) {\n      *st = (sv & 0x80) ^ nl;\t/* Estimate_after_LPS */\n      sv ^= 0x80;\t\t/* Exchange LPS/MPS */\n    } else {\n      *st = (sv & 0x80) ^ nm;\t/* Estimate_after_MPS */\n    }\n  }\n\n  return sv >> 7;\n}\n\n\n/*\n * Check for a restart marker & resynchronize decoder.\n */\n\nLOCAL(void)\nprocess_restart (j_decompress_ptr cinfo)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  int ci;\n  jpeg_component_info * compptr;\n\n  /* Advance past the RSTn marker */\n  if (! (*cinfo->marker->read_restart_marker) (cinfo))\n    ERREXIT(cinfo, JERR_CANT_SUSPEND);\n\n  /* Re-initialize statistics areas */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {\n      MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);\n      /* Reset DC predictions to 0 */\n      entropy->last_dc_val[ci] = 0;\n      entropy->dc_context[ci] = 0;\n    }\n    if ((! cinfo->progressive_mode && cinfo->lim_Se) ||\n\t(cinfo->progressive_mode && cinfo->Ss)) {\n      MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);\n    }\n  }\n\n  /* Reset arithmetic decoding variables */\n  entropy->c = 0;\n  entropy->a = 0;\n  entropy->ct = -16;\t/* force reading 2 initial bytes to fill C */\n\n  /* Reset restart counter */\n  entropy->restarts_to_go = cinfo->restart_interval;\n}\n\n\n/*\n * Arithmetic MCU decoding.\n * Each of these routines decodes and returns one MCU's worth of\n * arithmetic-compressed coefficients.\n * The coefficients are reordered from zigzag order into natural array order,\n * but are not dequantized.\n *\n * The i'th block of the MCU is stored into the block pointed to by\n * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.\n */\n\n/*\n * MCU decoding for DC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\ndecode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  JBLOCKROW block;\n  unsigned char *st;\n  int blkn, ci, tbl, sign;\n  int v, m;\n\n  /* Process restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      process_restart(cinfo);\n    entropy->restarts_to_go--;\n  }\n\n  if (entropy->ct == -1) return TRUE;\t/* if error do nothing */\n\n  /* Outer loop handles each block in the MCU */\n\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n    ci = cinfo->MCU_membership[blkn];\n    tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;\n\n    /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */\n\n    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */\n    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];\n\n    /* Figure F.19: Decode_DC_DIFF */\n    if (arith_decode(cinfo, st) == 0)\n      entropy->dc_context[ci] = 0;\n    else {\n      /* Figure F.21: Decoding nonzero value v */\n      /* Figure F.22: Decoding the sign of v */\n      sign = arith_decode(cinfo, st + 1);\n      st += 2; st += sign;\n      /* Figure F.23: Decoding the magnitude category of v */\n      if ((m = arith_decode(cinfo, st)) != 0) {\n\tst = entropy->dc_stats[tbl] + 20;\t/* Table F.4: X1 = 20 */\n\twhile (arith_decode(cinfo, st)) {\n\t  if ((m <<= 1) == 0x8000) {\n\t    WARNMS(cinfo, JWRN_ARITH_BAD_CODE);\n\t    entropy->ct = -1;\t\t\t/* magnitude overflow */\n\t    return TRUE;\n\t  }\n\t  st += 1;\n\t}\n      }\n      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */\n      if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))\n\tentropy->dc_context[ci] = 0;\t\t   /* zero diff category */\n      else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))\n\tentropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */\n      else\n\tentropy->dc_context[ci] = 4 + (sign * 4);  /* small diff category */\n      v = m;\n      /* Figure F.24: Decoding the magnitude bit pattern of v */\n      st += 14;\n      while (m >>= 1)\n\tif (arith_decode(cinfo, st)) v |= m;\n      v += 1; if (sign) v = -v;\n      entropy->last_dc_val[ci] += v;\n    }\n\n    /* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */\n    (*block)[0] = (JCOEF) (entropy->last_dc_val[ci] << cinfo->Al);\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU decoding for AC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\ndecode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  JBLOCKROW block;\n  unsigned char *st;\n  int tbl, sign, k;\n  int v, m;\n  const int * natural_order;\n\n  /* Process restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      process_restart(cinfo);\n    entropy->restarts_to_go--;\n  }\n\n  if (entropy->ct == -1) return TRUE;\t/* if error do nothing */\n\n  natural_order = cinfo->natural_order;\n\n  /* There is always only one block per MCU */\n  block = MCU_data[0];\n  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;\n\n  /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */\n\n  /* Figure F.20: Decode_AC_coefficients */\n  k = cinfo->Ss - 1;\n  do {\n    st = entropy->ac_stats[tbl] + 3 * k;\n    if (arith_decode(cinfo, st)) break;\t\t/* EOB flag */\n    for (;;) {\n      k++;\n      if (arith_decode(cinfo, st + 1)) break;\n      st += 3;\n      if (k >= cinfo->Se) {\n\tWARNMS(cinfo, JWRN_ARITH_BAD_CODE);\n\tentropy->ct = -1;\t\t\t/* spectral overflow */\n\treturn TRUE;\n      }\n    }\n    /* Figure F.21: Decoding nonzero value v */\n    /* Figure F.22: Decoding the sign of v */\n    sign = arith_decode(cinfo, entropy->fixed_bin);\n    st += 2;\n    /* Figure F.23: Decoding the magnitude category of v */\n    if ((m = arith_decode(cinfo, st)) != 0) {\n      if (arith_decode(cinfo, st)) {\n\tm <<= 1;\n\tst = entropy->ac_stats[tbl] +\n\t     (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);\n\twhile (arith_decode(cinfo, st)) {\n\t  if ((m <<= 1) == 0x8000) {\n\t    WARNMS(cinfo, JWRN_ARITH_BAD_CODE);\n\t    entropy->ct = -1;\t\t\t/* magnitude overflow */\n\t    return TRUE;\n\t  }\n\t  st += 1;\n\t}\n      }\n    }\n    v = m;\n    /* Figure F.24: Decoding the magnitude bit pattern of v */\n    st += 14;\n    while (m >>= 1)\n      if (arith_decode(cinfo, st)) v |= m;\n    v += 1; if (sign) v = -v;\n    /* Scale and output coefficient in natural (dezigzagged) order */\n    (*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al);\n  } while (k < cinfo->Se);\n\n  return TRUE;\n}\n\n\n/*\n * MCU decoding for DC successive approximation refinement scan.\n */\n\nMETHODDEF(boolean)\ndecode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  unsigned char *st;\n  int p1, blkn;\n\n  /* Process restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      process_restart(cinfo);\n    entropy->restarts_to_go--;\n  }\n\n  st = entropy->fixed_bin;\t/* use fixed probability estimation */\n  p1 = 1 << cinfo->Al;\t\t/* 1 in the bit position being coded */\n\n  /* Outer loop handles each block in the MCU */\n\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    /* Encoded data is simply the next bit of the two's-complement DC value */\n    if (arith_decode(cinfo, st))\n      MCU_data[blkn][0][0] |= p1;\n  }\n\n  return TRUE;\n}\n\n\n/*\n * MCU decoding for AC successive approximation refinement scan.\n */\n\nMETHODDEF(boolean)\ndecode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  JBLOCKROW block;\n  JCOEFPTR thiscoef;\n  unsigned char *st;\n  int tbl, k, kex;\n  int p1, m1;\n  const int * natural_order;\n\n  /* Process restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      process_restart(cinfo);\n    entropy->restarts_to_go--;\n  }\n\n  if (entropy->ct == -1) return TRUE;\t/* if error do nothing */\n\n  natural_order = cinfo->natural_order;\n\n  /* There is always only one block per MCU */\n  block = MCU_data[0];\n  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;\n\n  p1 = 1 << cinfo->Al;\t\t/* 1 in the bit position being coded */\n  m1 = (-1) << cinfo->Al;\t/* -1 in the bit position being coded */\n\n  /* Establish EOBx (previous stage end-of-block) index */\n  kex = cinfo->Se;\n  do {\n    if ((*block)[natural_order[kex]]) break;\n  } while (--kex);\n\n  k = cinfo->Ss - 1;\n  do {\n    st = entropy->ac_stats[tbl] + 3 * k;\n    if (k >= kex)\n      if (arith_decode(cinfo, st)) break;\t/* EOB flag */\n    for (;;) {\n      thiscoef = *block + natural_order[++k];\n      if (*thiscoef) {\t\t\t\t/* previously nonzero coef */\n\tif (arith_decode(cinfo, st + 2)) {\n\t  if (*thiscoef < 0)\n\t    *thiscoef += m1;\n\t  else\n\t    *thiscoef += p1;\n\t}\n\tbreak;\n      }\n      if (arith_decode(cinfo, st + 1)) {\t/* newly nonzero coef */\n\tif (arith_decode(cinfo, entropy->fixed_bin))\n\t  *thiscoef = m1;\n\telse\n\t  *thiscoef = p1;\n\tbreak;\n      }\n      st += 3;\n      if (k >= cinfo->Se) {\n\tWARNMS(cinfo, JWRN_ARITH_BAD_CODE);\n\tentropy->ct = -1;\t\t\t/* spectral overflow */\n\treturn TRUE;\n      }\n    }\n  } while (k < cinfo->Se);\n\n  return TRUE;\n}\n\n\n/*\n * Decode one MCU's worth of arithmetic-compressed coefficients.\n */\n\nMETHODDEF(boolean)\ndecode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  jpeg_component_info * compptr;\n  JBLOCKROW block;\n  unsigned char *st;\n  int blkn, ci, tbl, sign, k;\n  int v, m;\n  const int * natural_order;\n\n  /* Process restart marker if needed */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      process_restart(cinfo);\n    entropy->restarts_to_go--;\n  }\n\n  if (entropy->ct == -1) return TRUE;\t/* if error do nothing */\n\n  natural_order = cinfo->natural_order;\n\n  /* Outer loop handles each block in the MCU */\n\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n    ci = cinfo->MCU_membership[blkn];\n    compptr = cinfo->cur_comp_info[ci];\n\n    /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */\n\n    tbl = compptr->dc_tbl_no;\n\n    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */\n    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];\n\n    /* Figure F.19: Decode_DC_DIFF */\n    if (arith_decode(cinfo, st) == 0)\n      entropy->dc_context[ci] = 0;\n    else {\n      /* Figure F.21: Decoding nonzero value v */\n      /* Figure F.22: Decoding the sign of v */\n      sign = arith_decode(cinfo, st + 1);\n      st += 2; st += sign;\n      /* Figure F.23: Decoding the magnitude category of v */\n      if ((m = arith_decode(cinfo, st)) != 0) {\n\tst = entropy->dc_stats[tbl] + 20;\t/* Table F.4: X1 = 20 */\n\twhile (arith_decode(cinfo, st)) {\n\t  if ((m <<= 1) == 0x8000) {\n\t    WARNMS(cinfo, JWRN_ARITH_BAD_CODE);\n\t    entropy->ct = -1;\t\t\t/* magnitude overflow */\n\t    return TRUE;\n\t  }\n\t  st += 1;\n\t}\n      }\n      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */\n      if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))\n\tentropy->dc_context[ci] = 0;\t\t   /* zero diff category */\n      else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))\n\tentropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */\n      else\n\tentropy->dc_context[ci] = 4 + (sign * 4);  /* small diff category */\n      v = m;\n      /* Figure F.24: Decoding the magnitude bit pattern of v */\n      st += 14;\n      while (m >>= 1)\n\tif (arith_decode(cinfo, st)) v |= m;\n      v += 1; if (sign) v = -v;\n      entropy->last_dc_val[ci] += v;\n    }\n\n    (*block)[0] = (JCOEF) entropy->last_dc_val[ci];\n\n    /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */\n\n    if (cinfo->lim_Se == 0) continue;\n    tbl = compptr->ac_tbl_no;\n    k = 0;\n\n    /* Figure F.20: Decode_AC_coefficients */\n    do {\n      st = entropy->ac_stats[tbl] + 3 * k;\n      if (arith_decode(cinfo, st)) break;\t/* EOB flag */\n      for (;;) {\n\tk++;\n\tif (arith_decode(cinfo, st + 1)) break;\n\tst += 3;\n\tif (k >= cinfo->lim_Se) {\n\t  WARNMS(cinfo, JWRN_ARITH_BAD_CODE);\n\t  entropy->ct = -1;\t\t\t/* spectral overflow */\n\t  return TRUE;\n\t}\n      }\n      /* Figure F.21: Decoding nonzero value v */\n      /* Figure F.22: Decoding the sign of v */\n      sign = arith_decode(cinfo, entropy->fixed_bin);\n      st += 2;\n      /* Figure F.23: Decoding the magnitude category of v */\n      if ((m = arith_decode(cinfo, st)) != 0) {\n\tif (arith_decode(cinfo, st)) {\n\t  m <<= 1;\n\t  st = entropy->ac_stats[tbl] +\n\t       (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);\n\t  while (arith_decode(cinfo, st)) {\n\t    if ((m <<= 1) == 0x8000) {\n\t      WARNMS(cinfo, JWRN_ARITH_BAD_CODE);\n\t      entropy->ct = -1;\t\t\t/* magnitude overflow */\n\t      return TRUE;\n\t    }\n\t    st += 1;\n\t  }\n\t}\n      }\n      v = m;\n      /* Figure F.24: Decoding the magnitude bit pattern of v */\n      st += 14;\n      while (m >>= 1)\n\tif (arith_decode(cinfo, st)) v |= m;\n      v += 1; if (sign) v = -v;\n      (*block)[natural_order[k]] = (JCOEF) v;\n    } while (k < cinfo->lim_Se);\n  }\n\n  return TRUE;\n}\n\n\n/*\n * Initialize for an arithmetic-compressed scan.\n */\n\nMETHODDEF(void)\nstart_pass (j_decompress_ptr cinfo)\n{\n  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;\n  int ci, tbl;\n  jpeg_component_info * compptr;\n\n  if (cinfo->progressive_mode) {\n    /* Validate progressive scan parameters */\n    if (cinfo->Ss == 0) {\n      if (cinfo->Se != 0)\n\tgoto bad;\n    } else {\n      /* need not check Ss/Se < 0 since they came from unsigned bytes */\n      if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se)\n\tgoto bad;\n      /* AC scans may have only one component */\n      if (cinfo->comps_in_scan != 1)\n\tgoto bad;\n    }\n    if (cinfo->Ah != 0) {\n      /* Successive approximation refinement scan: must have Al = Ah-1. */\n      if (cinfo->Ah-1 != cinfo->Al)\n\tgoto bad;\n    }\n    if (cinfo->Al > 13) {\t/* need not check for < 0 */\n      bad:\n      ERREXIT4(cinfo, JERR_BAD_PROGRESSION,\n\t       cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);\n    }\n    /* Update progression status, and verify that scan order is legal.\n     * Note that inter-scan inconsistencies are treated as warnings\n     * not fatal errors ... not clear if this is right way to behave.\n     */\n    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n      int coefi, cindex = cinfo->cur_comp_info[ci]->component_index;\n      int *coef_bit_ptr = & cinfo->coef_bits[cindex][0];\n      if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */\n\tWARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);\n      for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {\n\tint expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];\n\tif (cinfo->Ah != expected)\n\t  WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);\n\tcoef_bit_ptr[coefi] = cinfo->Al;\n      }\n    }\n    /* Select MCU decoding routine */\n    if (cinfo->Ah == 0) {\n      if (cinfo->Ss == 0)\n\tentropy->pub.decode_mcu = decode_mcu_DC_first;\n      else\n\tentropy->pub.decode_mcu = decode_mcu_AC_first;\n    } else {\n      if (cinfo->Ss == 0)\n\tentropy->pub.decode_mcu = decode_mcu_DC_refine;\n      else\n\tentropy->pub.decode_mcu = decode_mcu_AC_refine;\n    }\n  } else {\n    /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.\n     * This ought to be an error condition, but we make it a warning.\n     */\n    if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 ||\n\t(cinfo->Se < DCTSIZE2 && cinfo->Se != cinfo->lim_Se))\n      WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);\n    /* Select MCU decoding routine */\n    entropy->pub.decode_mcu = decode_mcu;\n  }\n\n  /* Allocate & initialize requested statistics areas */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {\n      tbl = compptr->dc_tbl_no;\n      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)\n\tERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);\n      if (entropy->dc_stats[tbl] == NULL)\n\tentropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)\n\t  ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);\n      MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);\n      /* Initialize DC predictions to 0 */\n      entropy->last_dc_val[ci] = 0;\n      entropy->dc_context[ci] = 0;\n    }\n    if ((! cinfo->progressive_mode && cinfo->lim_Se) ||\n\t(cinfo->progressive_mode && cinfo->Ss)) {\n      tbl = compptr->ac_tbl_no;\n      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)\n\tERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);\n      if (entropy->ac_stats[tbl] == NULL)\n\tentropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)\n\t  ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);\n      MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);\n    }\n  }\n\n  /* Initialize arithmetic decoding variables */\n  entropy->c = 0;\n  entropy->a = 0;\n  entropy->ct = -16;\t/* force reading 2 initial bytes to fill C */\n\n  /* Initialize restart counter */\n  entropy->restarts_to_go = cinfo->restart_interval;\n}\n\n\n/*\n * Module initialization routine for arithmetic entropy decoding.\n */\n\nGLOBAL(void)\njinit_arith_decoder (j_decompress_ptr cinfo)\n{\n  arith_entropy_ptr entropy;\n  int i;\n\n  entropy = (arith_entropy_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(arith_entropy_decoder));\n  cinfo->entropy = &entropy->pub;\n  entropy->pub.start_pass = start_pass;\n\n  /* Mark tables unallocated */\n  for (i = 0; i < NUM_ARITH_TBLS; i++) {\n    entropy->dc_stats[i] = NULL;\n    entropy->ac_stats[i] = NULL;\n  }\n\n  /* Initialize index for fixed probability estimation */\n  entropy->fixed_bin[0] = 113;\n\n  if (cinfo->progressive_mode) {\n    /* Create progression status table */\n    int *coef_bit_ptr, ci;\n    cinfo->coef_bits = (int (*)[DCTSIZE2])\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  cinfo->num_components*DCTSIZE2*SIZEOF(int));\n    coef_bit_ptr = & cinfo->coef_bits[0][0];\n    for (ci = 0; ci < cinfo->num_components; ci++) \n      for (i = 0; i < DCTSIZE2; i++)\n\t*coef_bit_ptr++ = -1;\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdatadst.c",
    "content": "/*\n * jdatadst.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * Modified 2009-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains compression data destination routines for the case of\n * emitting JPEG data to memory or to a file (or any stdio stream).\n * While these routines are sufficient for most applications,\n * some will want to use a different destination manager.\n * IMPORTANT: we assume that fwrite() will correctly transcribe an array of\n * JOCTETs into 8-bit-wide elements on external storage.  If char is wider\n * than 8 bits on your machine, you may need to do some tweaking.\n */\n\n/* this is not a core library module, so it doesn't define JPEG_INTERNALS */\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jerror.h\"\n\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare malloc(),free() */\nextern void * malloc JPP((size_t size));\nextern void free JPP((void *ptr));\n#endif\n\n\n/* Expanded data destination object for stdio output */\n\ntypedef struct {\n  struct jpeg_destination_mgr pub; /* public fields */\n\n  FILE * outfile;\t\t/* target stream */\n  JOCTET * buffer;\t\t/* start of buffer */\n} my_destination_mgr;\n\ntypedef my_destination_mgr * my_dest_ptr;\n\n#define OUTPUT_BUF_SIZE  4096\t/* choose an efficiently fwrite'able size */\n\n\n/* Expanded data destination object for memory output */\n\ntypedef struct {\n  struct jpeg_destination_mgr pub; /* public fields */\n\n  unsigned char ** outbuffer;\t/* target buffer */\n  unsigned long * outsize;\n  unsigned char * newbuffer;\t/* newly allocated buffer */\n  JOCTET * buffer;\t\t/* start of buffer */\n  size_t bufsize;\n} my_mem_destination_mgr;\n\ntypedef my_mem_destination_mgr * my_mem_dest_ptr;\n\n\n/*\n * Initialize destination --- called by jpeg_start_compress\n * before any data is actually written.\n */\n\nMETHODDEF(void)\ninit_destination (j_compress_ptr cinfo)\n{\n  my_dest_ptr dest = (my_dest_ptr) cinfo->dest;\n\n  /* Allocate the output buffer --- it will be released when done with image */\n  dest->buffer = (JOCTET *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  OUTPUT_BUF_SIZE * SIZEOF(JOCTET));\n\n  dest->pub.next_output_byte = dest->buffer;\n  dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;\n}\n\nMETHODDEF(void)\ninit_mem_destination (j_compress_ptr cinfo)\n{\n  /* no work necessary here */\n}\n\n\n/*\n * Empty the output buffer --- called whenever buffer fills up.\n *\n * In typical applications, this should write the entire output buffer\n * (ignoring the current state of next_output_byte & free_in_buffer),\n * reset the pointer & count to the start of the buffer, and return TRUE\n * indicating that the buffer has been dumped.\n *\n * In applications that need to be able to suspend compression due to output\n * overrun, a FALSE return indicates that the buffer cannot be emptied now.\n * In this situation, the compressor will return to its caller (possibly with\n * an indication that it has not accepted all the supplied scanlines).  The\n * application should resume compression after it has made more room in the\n * output buffer.  Note that there are substantial restrictions on the use of\n * suspension --- see the documentation.\n *\n * When suspending, the compressor will back up to a convenient restart point\n * (typically the start of the current MCU). next_output_byte & free_in_buffer\n * indicate where the restart point will be if the current call returns FALSE.\n * Data beyond this point will be regenerated after resumption, so do not\n * write it out when emptying the buffer externally.\n */\n\nMETHODDEF(boolean)\nempty_output_buffer (j_compress_ptr cinfo)\n{\n  my_dest_ptr dest = (my_dest_ptr) cinfo->dest;\n\n  if (JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE) !=\n      (size_t) OUTPUT_BUF_SIZE)\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n\n  dest->pub.next_output_byte = dest->buffer;\n  dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;\n\n  return TRUE;\n}\n\nMETHODDEF(boolean)\nempty_mem_output_buffer (j_compress_ptr cinfo)\n{\n  size_t nextsize;\n  JOCTET * nextbuffer;\n  my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest;\n\n  /* Try to allocate new buffer with double size */\n  nextsize = dest->bufsize * 2;\n  nextbuffer = (JOCTET *) malloc(nextsize);\n\n  if (nextbuffer == NULL)\n    ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);\n\n  MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);\n\n  if (dest->newbuffer != NULL)\n    free(dest->newbuffer);\n\n  dest->newbuffer = nextbuffer;\n\n  dest->pub.next_output_byte = nextbuffer + dest->bufsize;\n  dest->pub.free_in_buffer = dest->bufsize;\n\n  dest->buffer = nextbuffer;\n  dest->bufsize = nextsize;\n\n  return TRUE;\n}\n\n\n/*\n * Terminate destination --- called by jpeg_finish_compress\n * after all data has been written.  Usually needs to flush buffer.\n *\n * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding\n * application must deal with any cleanup that should happen even\n * for error exit.\n */\n\nMETHODDEF(void)\nterm_destination (j_compress_ptr cinfo)\n{\n  my_dest_ptr dest = (my_dest_ptr) cinfo->dest;\n  size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer;\n\n  /* Write any data remaining in the buffer */\n  if (datacount > 0) {\n    if (JFWRITE(dest->outfile, dest->buffer, datacount) != datacount)\n      ERREXIT(cinfo, JERR_FILE_WRITE);\n  }\n  fflush(dest->outfile);\n  /* Make sure we wrote the output file OK */\n  if (ferror(dest->outfile))\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n}\n\nMETHODDEF(void)\nterm_mem_destination (j_compress_ptr cinfo)\n{\n  my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest;\n\n  *dest->outbuffer = dest->buffer;\n  *dest->outsize = dest->bufsize - dest->pub.free_in_buffer;\n}\n\n\n/*\n * Prepare for output to a stdio stream.\n * The caller must have already opened the stream, and is responsible\n * for closing it after finishing compression.\n */\n\nGLOBAL(void)\njpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)\n{\n  my_dest_ptr dest;\n\n  /* The destination object is made permanent so that multiple JPEG images\n   * can be written to the same file without re-executing jpeg_stdio_dest.\n   * This makes it dangerous to use this manager and a different destination\n   * manager serially with the same JPEG object, because their private object\n   * sizes may be different.  Caveat programmer.\n   */\n  if (cinfo->dest == NULL) {\t/* first time for this JPEG object? */\n    cinfo->dest = (struct jpeg_destination_mgr *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\t  SIZEOF(my_destination_mgr));\n  }\n\n  dest = (my_dest_ptr) cinfo->dest;\n  dest->pub.init_destination = init_destination;\n  dest->pub.empty_output_buffer = empty_output_buffer;\n  dest->pub.term_destination = term_destination;\n  dest->outfile = outfile;\n}\n\n\n/*\n * Prepare for output to a memory buffer.\n * The caller may supply an own initial buffer with appropriate size.\n * Otherwise, or when the actual data output exceeds the given size,\n * the library adapts the buffer size as necessary.\n * The standard library functions malloc/free are used for allocating\n * larger memory, so the buffer is available to the application after\n * finishing compression, and then the application is responsible for\n * freeing the requested memory.\n * Note:  An initial buffer supplied by the caller is expected to be\n * managed by the application.  The library does not free such buffer\n * when allocating a larger buffer.\n */\n\nGLOBAL(void)\njpeg_mem_dest (j_compress_ptr cinfo,\n\t       unsigned char ** outbuffer, unsigned long * outsize)\n{\n  my_mem_dest_ptr dest;\n\n  if (outbuffer == NULL || outsize == NULL)\t/* sanity check */\n    ERREXIT(cinfo, JERR_BUFFER_SIZE);\n\n  /* The destination object is made permanent so that multiple JPEG images\n   * can be written to the same buffer without re-executing jpeg_mem_dest.\n   */\n  if (cinfo->dest == NULL) {\t/* first time for this JPEG object? */\n    cinfo->dest = (struct jpeg_destination_mgr *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\t  SIZEOF(my_mem_destination_mgr));\n  }\n\n  dest = (my_mem_dest_ptr) cinfo->dest;\n  dest->pub.init_destination = init_mem_destination;\n  dest->pub.empty_output_buffer = empty_mem_output_buffer;\n  dest->pub.term_destination = term_mem_destination;\n  dest->outbuffer = outbuffer;\n  dest->outsize = outsize;\n  dest->newbuffer = NULL;\n\n  if (*outbuffer == NULL || *outsize == 0) {\n    /* Allocate initial buffer */\n    dest->newbuffer = *outbuffer = (unsigned char *) malloc(OUTPUT_BUF_SIZE);\n    if (dest->newbuffer == NULL)\n      ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);\n    *outsize = OUTPUT_BUF_SIZE;\n  }\n\n  dest->pub.next_output_byte = dest->buffer = *outbuffer;\n  dest->pub.free_in_buffer = dest->bufsize = *outsize;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdatasrc.c",
    "content": "/*\n * jdatasrc.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * Modified 2009-2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains decompression data source routines for the case of\n * reading JPEG data from memory or from a file (or any stdio stream).\n * While these routines are sufficient for most applications,\n * some will want to use a different source manager.\n * IMPORTANT: we assume that fread() will correctly transcribe an array of\n * JOCTETs from 8-bit-wide elements on external storage.  If char is wider\n * than 8 bits on your machine, you may need to do some tweaking.\n */\n\n/* this is not a core library module, so it doesn't define JPEG_INTERNALS */\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jerror.h\"\n\n\n/* Expanded data source object for stdio input */\n\ntypedef struct {\n  struct jpeg_source_mgr pub;\t/* public fields */\n\n  FILE * infile;\t\t/* source stream */\n  JOCTET * buffer;\t\t/* start of buffer */\n  boolean start_of_file;\t/* have we gotten any data yet? */\n} my_source_mgr;\n\ntypedef my_source_mgr * my_src_ptr;\n\n#define INPUT_BUF_SIZE  4096\t/* choose an efficiently fread'able size */\n\n\n/*\n * Initialize source --- called by jpeg_read_header\n * before any data is actually read.\n */\n\nMETHODDEF(void)\ninit_source (j_decompress_ptr cinfo)\n{\n  my_src_ptr src = (my_src_ptr) cinfo->src;\n\n  /* We reset the empty-input-file flag for each image,\n   * but we don't clear the input buffer.\n   * This is correct behavior for reading a series of images from one source.\n   */\n  src->start_of_file = TRUE;\n}\n\nMETHODDEF(void)\ninit_mem_source (j_decompress_ptr cinfo)\n{\n  /* no work necessary here */\n}\n\n\n/*\n * Fill the input buffer --- called whenever buffer is emptied.\n *\n * In typical applications, this should read fresh data into the buffer\n * (ignoring the current state of next_input_byte & bytes_in_buffer),\n * reset the pointer & count to the start of the buffer, and return TRUE\n * indicating that the buffer has been reloaded.  It is not necessary to\n * fill the buffer entirely, only to obtain at least one more byte.\n *\n * There is no such thing as an EOF return.  If the end of the file has been\n * reached, the routine has a choice of ERREXIT() or inserting fake data into\n * the buffer.  In most cases, generating a warning message and inserting a\n * fake EOI marker is the best course of action --- this will allow the\n * decompressor to output however much of the image is there.  However,\n * the resulting error message is misleading if the real problem is an empty\n * input file, so we handle that case specially.\n *\n * In applications that need to be able to suspend compression due to input\n * not being available yet, a FALSE return indicates that no more data can be\n * obtained right now, but more may be forthcoming later.  In this situation,\n * the decompressor will return to its caller (with an indication of the\n * number of scanlines it has read, if any).  The application should resume\n * decompression after it has loaded more data into the input buffer.  Note\n * that there are substantial restrictions on the use of suspension --- see\n * the documentation.\n *\n * When suspending, the decompressor will back up to a convenient restart point\n * (typically the start of the current MCU). next_input_byte & bytes_in_buffer\n * indicate where the restart point will be if the current call returns FALSE.\n * Data beyond this point must be rescanned after resumption, so move it to\n * the front of the buffer rather than discarding it.\n */\n\nMETHODDEF(boolean)\nfill_input_buffer (j_decompress_ptr cinfo)\n{\n  my_src_ptr src = (my_src_ptr) cinfo->src;\n  size_t nbytes;\n\n  nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE);\n\n  if (nbytes <= 0) {\n    if (src->start_of_file)\t/* Treat empty input file as fatal error */\n      ERREXIT(cinfo, JERR_INPUT_EMPTY);\n    WARNMS(cinfo, JWRN_JPEG_EOF);\n    /* Insert a fake EOI marker */\n    src->buffer[0] = (JOCTET) 0xFF;\n    src->buffer[1] = (JOCTET) JPEG_EOI;\n    nbytes = 2;\n  }\n\n  src->pub.next_input_byte = src->buffer;\n  src->pub.bytes_in_buffer = nbytes;\n  src->start_of_file = FALSE;\n\n  return TRUE;\n}\n\nMETHODDEF(boolean)\nfill_mem_input_buffer (j_decompress_ptr cinfo)\n{\n  static const JOCTET mybuffer[4] = {\n    (JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0\n  };\n\n  /* The whole JPEG data is expected to reside in the supplied memory\n   * buffer, so any request for more data beyond the given buffer size\n   * is treated as an error.\n   */\n  WARNMS(cinfo, JWRN_JPEG_EOF);\n\n  /* Insert a fake EOI marker */\n\n  cinfo->src->next_input_byte = mybuffer;\n  cinfo->src->bytes_in_buffer = 2;\n\n  return TRUE;\n}\n\n\n/*\n * Skip data --- used to skip over a potentially large amount of\n * uninteresting data (such as an APPn marker).\n *\n * Writers of suspendable-input applications must note that skip_input_data\n * is not granted the right to give a suspension return.  If the skip extends\n * beyond the data currently in the buffer, the buffer can be marked empty so\n * that the next read will cause a fill_input_buffer call that can suspend.\n * Arranging for additional bytes to be discarded before reloading the input\n * buffer is the application writer's problem.\n */\n\nMETHODDEF(void)\nskip_input_data (j_decompress_ptr cinfo, long num_bytes)\n{\n  struct jpeg_source_mgr * src = cinfo->src;\n\n  /* Just a dumb implementation for now.  Could use fseek() except\n   * it doesn't work on pipes.  Not clear that being smart is worth\n   * any trouble anyway --- large skips are infrequent.\n   */\n  if (num_bytes > 0) {\n    while (num_bytes > (long) src->bytes_in_buffer) {\n      num_bytes -= (long) src->bytes_in_buffer;\n      (void) (*src->fill_input_buffer) (cinfo);\n      /* note we assume that fill_input_buffer will never return FALSE,\n       * so suspension need not be handled.\n       */\n    }\n    src->next_input_byte += (size_t) num_bytes;\n    src->bytes_in_buffer -= (size_t) num_bytes;\n  }\n}\n\n\n/*\n * An additional method that can be provided by data source modules is the\n * resync_to_restart method for error recovery in the presence of RST markers.\n * For the moment, this source module just uses the default resync method\n * provided by the JPEG library.  That method assumes that no backtracking\n * is possible.\n */\n\n\n/*\n * Terminate source --- called by jpeg_finish_decompress\n * after all data has been read.  Often a no-op.\n *\n * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding\n * application must deal with any cleanup that should happen even\n * for error exit.\n */\n\nMETHODDEF(void)\nterm_source (j_decompress_ptr cinfo)\n{\n  /* no work necessary here */\n}\n\n\n/*\n * Prepare for input from a stdio stream.\n * The caller must have already opened the stream, and is responsible\n * for closing it after finishing decompression.\n */\n\nGLOBAL(void)\njpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)\n{\n  my_src_ptr src;\n\n  /* The source object and input buffer are made permanent so that a series\n   * of JPEG images can be read from the same file by calling jpeg_stdio_src\n   * only before the first one.  (If we discarded the buffer at the end of\n   * one image, we'd likely lose the start of the next one.)\n   * This makes it unsafe to use this manager and a different source\n   * manager serially with the same JPEG object.  Caveat programmer.\n   */\n  if (cinfo->src == NULL) {\t/* first time for this JPEG object? */\n    cinfo->src = (struct jpeg_source_mgr *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\t  SIZEOF(my_source_mgr));\n    src = (my_src_ptr) cinfo->src;\n    src->buffer = (JOCTET *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\t  INPUT_BUF_SIZE * SIZEOF(JOCTET));\n  }\n\n  src = (my_src_ptr) cinfo->src;\n  src->pub.init_source = init_source;\n  src->pub.fill_input_buffer = fill_input_buffer;\n  src->pub.skip_input_data = skip_input_data;\n  src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */\n  src->pub.term_source = term_source;\n  src->infile = infile;\n  src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */\n  src->pub.next_input_byte = NULL; /* until buffer loaded */\n}\n\n\n/*\n * Prepare for input from a supplied memory buffer.\n * The buffer must contain the whole JPEG data.\n */\n\nGLOBAL(void)\njpeg_mem_src (j_decompress_ptr cinfo,\n\t      unsigned char * inbuffer, unsigned long insize)\n{\n  struct jpeg_source_mgr * src;\n\n  if (inbuffer == NULL || insize == 0)\t/* Treat empty input as fatal error */\n    ERREXIT(cinfo, JERR_INPUT_EMPTY);\n\n  /* The source object is made permanent so that a series of JPEG images\n   * can be read from the same buffer by calling jpeg_mem_src only before\n   * the first one.\n   */\n  if (cinfo->src == NULL) {\t/* first time for this JPEG object? */\n    cinfo->src = (struct jpeg_source_mgr *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\t  SIZEOF(struct jpeg_source_mgr));\n  }\n\n  src = cinfo->src;\n  src->init_source = init_mem_source;\n  src->fill_input_buffer = fill_mem_input_buffer;\n  src->skip_input_data = skip_input_data;\n  src->resync_to_restart = jpeg_resync_to_restart; /* use default method */\n  src->term_source = term_source;\n  src->bytes_in_buffer = (size_t) insize;\n  src->next_input_byte = (JOCTET *) inbuffer;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdcoefct.c",
    "content": "/*\n * jdcoefct.c\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * Modified 2002-2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the coefficient buffer controller for decompression.\n * This controller is the top level of the JPEG decompressor proper.\n * The coefficient buffer lies between entropy decoding and inverse-DCT steps.\n *\n * In buffered-image mode, this controller is the interface between\n * input-oriented processing and output-oriented processing.\n * Also, the input side (only) is used when reading a file for transcoding.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n/* Block smoothing is only applicable for progressive JPEG, so: */\n#ifndef D_PROGRESSIVE_SUPPORTED\n#undef BLOCK_SMOOTHING_SUPPORTED\n#endif\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_d_coef_controller pub; /* public fields */\n\n  /* These variables keep track of the current location of the input side. */\n  /* cinfo->input_iMCU_row is also used for this. */\n  JDIMENSION MCU_ctr;\t\t/* counts MCUs processed in current row */\n  int MCU_vert_offset;\t\t/* counts MCU rows within iMCU row */\n  int MCU_rows_per_iMCU_row;\t/* number of such rows needed */\n\n  /* The output side's location is represented by cinfo->output_iMCU_row. */\n\n  /* In single-pass modes, it's sufficient to buffer just one MCU.\n   * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,\n   * and let the entropy decoder write into that workspace each time.\n   * (On 80x86, the workspace is FAR even though it's not really very big;\n   * this is to keep the module interfaces unchanged when a large coefficient\n   * buffer is necessary.)\n   * In multi-pass modes, this array points to the current MCU's blocks\n   * within the virtual arrays; it is used only by the input side.\n   */\n  JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU];\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n  /* In multi-pass modes, we need a virtual block array for each component. */\n  jvirt_barray_ptr whole_image[MAX_COMPONENTS];\n#endif\n\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n  /* When doing block smoothing, we latch coefficient Al values here */\n  int * coef_bits_latch;\n#define SAVED_COEFS  6\t\t/* we save coef_bits[0..5] */\n#endif\n} my_coef_controller;\n\ntypedef my_coef_controller * my_coef_ptr;\n\n/* Forward declarations */\nMETHODDEF(int) decompress_onepass\n\tJPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));\n#ifdef D_MULTISCAN_FILES_SUPPORTED\nMETHODDEF(int) decompress_data\n\tJPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));\n#endif\n#ifdef BLOCK_SMOOTHING_SUPPORTED\nLOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo));\nMETHODDEF(int) decompress_smooth_data\n\tJPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));\n#endif\n\n\nLOCAL(void)\nstart_iMCU_row (j_decompress_ptr cinfo)\n/* Reset within-iMCU-row counters for a new row (input side) */\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  /* In an interleaved scan, an MCU row is the same as an iMCU row.\n   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.\n   * But at the bottom of the image, process only what's left.\n   */\n  if (cinfo->comps_in_scan > 1) {\n    coef->MCU_rows_per_iMCU_row = 1;\n  } else {\n    if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1))\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;\n    else\n      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;\n  }\n\n  coef->MCU_ctr = 0;\n  coef->MCU_vert_offset = 0;\n}\n\n\n/*\n * Initialize for an input processing pass.\n */\n\nMETHODDEF(void)\nstart_input_pass (j_decompress_ptr cinfo)\n{\n  cinfo->input_iMCU_row = 0;\n  start_iMCU_row(cinfo);\n}\n\n\n/*\n * Initialize for an output processing pass.\n */\n\nMETHODDEF(void)\nstart_output_pass (j_decompress_ptr cinfo)\n{\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n\n  /* If multipass, check to see whether to use block smoothing on this pass */\n  if (coef->pub.coef_arrays != NULL) {\n    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))\n      coef->pub.decompress_data = decompress_smooth_data;\n    else\n      coef->pub.decompress_data = decompress_data;\n  }\n#endif\n  cinfo->output_iMCU_row = 0;\n}\n\n\n/*\n * Decompress and return some data in the single-pass case.\n * Always attempts to emit one fully interleaved MCU row (\"iMCU\" row).\n * Input and output must run in lockstep since we have only a one-MCU buffer.\n * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.\n *\n * NB: output_buf contains a plane for each component in image,\n * which we index according to the component's SOF position.\n */\n\nMETHODDEF(int)\ndecompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  int blkn, ci, xindex, yindex, yoffset, useful_width;\n  JSAMPARRAY output_ptr;\n  JDIMENSION start_col, output_col;\n  jpeg_component_info *compptr;\n  inverse_DCT_method_ptr inverse_DCT;\n\n  /* Loop to process as much as one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;\n\t MCU_col_num++) {\n      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */\n      if (cinfo->lim_Se)\t/* can bypass in DC only case */\n\tFMEMZERO((void FAR *) coef->MCU_buffer[0],\n\t\t (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));\n      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->MCU_ctr = MCU_col_num;\n\treturn JPEG_SUSPENDED;\n      }\n      /* Determine where data should go in output_buf and do the IDCT thing.\n       * We skip dummy blocks at the right and bottom edges (but blkn gets\n       * incremented past them!).  Note the inner loop relies on having\n       * allocated the MCU_buffer[] blocks sequentially.\n       */\n      blkn = 0;\t\t\t/* index of current DCT block within MCU */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\t/* Don't bother to IDCT an uninteresting component. */\n\tif (! compptr->component_needed) {\n\t  blkn += compptr->MCU_blocks;\n\t  continue;\n\t}\n\tinverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];\n\tuseful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width\n\t\t\t\t\t\t    : compptr->last_col_width;\n\toutput_ptr = output_buf[compptr->component_index] +\n\t  yoffset * compptr->DCT_v_scaled_size;\n\tstart_col = MCU_col_num * compptr->MCU_sample_width;\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  if (cinfo->input_iMCU_row < last_iMCU_row ||\n\t      yoffset+yindex < compptr->last_row_height) {\n\t    output_col = start_col;\n\t    for (xindex = 0; xindex < useful_width; xindex++) {\n\t      (*inverse_DCT) (cinfo, compptr,\n\t\t\t      (JCOEFPTR) coef->MCU_buffer[blkn+xindex],\n\t\t\t      output_ptr, output_col);\n\t      output_col += compptr->DCT_h_scaled_size;\n\t    }\n\t  }\n\t  blkn += compptr->MCU_width;\n\t  output_ptr += compptr->DCT_v_scaled_size;\n\t}\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->MCU_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  cinfo->output_iMCU_row++;\n  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {\n    start_iMCU_row(cinfo);\n    return JPEG_ROW_COMPLETED;\n  }\n  /* Completed the scan */\n  (*cinfo->inputctl->finish_input_pass) (cinfo);\n  return JPEG_SCAN_COMPLETED;\n}\n\n\n/*\n * Dummy consume-input routine for single-pass operation.\n */\n\nMETHODDEF(int)\ndummy_consume_data (j_decompress_ptr cinfo)\n{\n  return JPEG_SUSPENDED;\t/* Always indicate nothing was done */\n}\n\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n\n/*\n * Consume input data and store it in the full-image coefficient buffer.\n * We read as much as one fully interleaved MCU row (\"iMCU\" row) per call,\n * ie, v_samp_factor block rows for each component in the scan.\n * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.\n */\n\nMETHODDEF(int)\nconsume_data (j_decompress_ptr cinfo)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION MCU_col_num;\t/* index of current MCU within row */\n  int blkn, ci, xindex, yindex, yoffset;\n  JDIMENSION start_col;\n  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];\n  JBLOCKROW buffer_ptr;\n  jpeg_component_info *compptr;\n\n  /* Align the virtual buffers for the components used in this scan. */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    buffer[ci] = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],\n       cinfo->input_iMCU_row * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, TRUE);\n    /* Note: entropy decoder expects buffer to be zeroed,\n     * but this is handled automatically by the memory manager\n     * because we requested a pre-zeroed array.\n     */\n  }\n\n  /* Loop to process one whole iMCU row */\n  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;\n       yoffset++) {\n    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;\n\t MCU_col_num++) {\n      /* Construct list of pointers to DCT blocks belonging to this MCU */\n      blkn = 0;\t\t\t/* index of current DCT block within MCU */\n      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n\tcompptr = cinfo->cur_comp_info[ci];\n\tstart_col = MCU_col_num * compptr->MCU_width;\n\tfor (yindex = 0; yindex < compptr->MCU_height; yindex++) {\n\t  buffer_ptr = buffer[ci][yindex+yoffset] + start_col;\n\t  for (xindex = 0; xindex < compptr->MCU_width; xindex++) {\n\t    coef->MCU_buffer[blkn++] = buffer_ptr++;\n\t  }\n\t}\n      }\n      /* Try to fetch the MCU. */\n      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {\n\t/* Suspension forced; update state counters and exit */\n\tcoef->MCU_vert_offset = yoffset;\n\tcoef->MCU_ctr = MCU_col_num;\n\treturn JPEG_SUSPENDED;\n      }\n    }\n    /* Completed an MCU row, but perhaps not an iMCU row */\n    coef->MCU_ctr = 0;\n  }\n  /* Completed the iMCU row, advance counters for next one */\n  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {\n    start_iMCU_row(cinfo);\n    return JPEG_ROW_COMPLETED;\n  }\n  /* Completed the scan */\n  (*cinfo->inputctl->finish_input_pass) (cinfo);\n  return JPEG_SCAN_COMPLETED;\n}\n\n\n/*\n * Decompress and return some data in the multi-pass case.\n * Always attempts to emit one fully interleaved MCU row (\"iMCU\" row).\n * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.\n *\n * NB: output_buf contains a plane for each component in image.\n */\n\nMETHODDEF(int)\ndecompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  JDIMENSION block_num;\n  int ci, block_row, block_rows;\n  JBLOCKARRAY buffer;\n  JBLOCKROW buffer_ptr;\n  JSAMPARRAY output_ptr;\n  JDIMENSION output_col;\n  jpeg_component_info *compptr;\n  inverse_DCT_method_ptr inverse_DCT;\n\n  /* Force some input to be done if we are getting ahead of the input. */\n  while (cinfo->input_scan_number < cinfo->output_scan_number ||\n\t (cinfo->input_scan_number == cinfo->output_scan_number &&\n\t  cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {\n    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)\n      return JPEG_SUSPENDED;\n  }\n\n  /* OK, output from the virtual arrays. */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Don't bother to IDCT an uninteresting component. */\n    if (! compptr->component_needed)\n      continue;\n    /* Align the virtual buffer for this component. */\n    buffer = (*cinfo->mem->access_virt_barray)\n      ((j_common_ptr) cinfo, coef->whole_image[ci],\n       cinfo->output_iMCU_row * compptr->v_samp_factor,\n       (JDIMENSION) compptr->v_samp_factor, FALSE);\n    /* Count non-dummy DCT block rows in this iMCU row. */\n    if (cinfo->output_iMCU_row < last_iMCU_row)\n      block_rows = compptr->v_samp_factor;\n    else {\n      /* NB: can't use last_row_height here; it is input-side-dependent! */\n      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n      if (block_rows == 0) block_rows = compptr->v_samp_factor;\n    }\n    inverse_DCT = cinfo->idct->inverse_DCT[ci];\n    output_ptr = output_buf[ci];\n    /* Loop over all DCT blocks to be processed. */\n    for (block_row = 0; block_row < block_rows; block_row++) {\n      buffer_ptr = buffer[block_row];\n      output_col = 0;\n      for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) {\n\t(*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr,\n\t\t\toutput_ptr, output_col);\n\tbuffer_ptr++;\n\toutput_col += compptr->DCT_h_scaled_size;\n      }\n      output_ptr += compptr->DCT_v_scaled_size;\n    }\n  }\n\n  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)\n    return JPEG_ROW_COMPLETED;\n  return JPEG_SCAN_COMPLETED;\n}\n\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n\n\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n\n/*\n * This code applies interblock smoothing as described by section K.8\n * of the JPEG standard: the first 5 AC coefficients are estimated from\n * the DC values of a DCT block and its 8 neighboring blocks.\n * We apply smoothing only for progressive JPEG decoding, and only if\n * the coefficients it can estimate are not yet known to full precision.\n */\n\n/* Natural-order array positions of the first 5 zigzag-order coefficients */\n#define Q01_POS  1\n#define Q10_POS  8\n#define Q20_POS  16\n#define Q11_POS  9\n#define Q02_POS  2\n\n/*\n * Determine whether block smoothing is applicable and safe.\n * We also latch the current states of the coef_bits[] entries for the\n * AC coefficients; otherwise, if the input side of the decompressor\n * advances into a new scan, we might think the coefficients are known\n * more accurately than they really are.\n */\n\nLOCAL(boolean)\nsmoothing_ok (j_decompress_ptr cinfo)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  boolean smoothing_useful = FALSE;\n  int ci, coefi;\n  jpeg_component_info *compptr;\n  JQUANT_TBL * qtable;\n  int * coef_bits;\n  int * coef_bits_latch;\n\n  if (! cinfo->progressive_mode || cinfo->coef_bits == NULL)\n    return FALSE;\n\n  /* Allocate latch area if not already done */\n  if (coef->coef_bits_latch == NULL)\n    coef->coef_bits_latch = (int *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  cinfo->num_components *\n\t\t\t\t  (SAVED_COEFS * SIZEOF(int)));\n  coef_bits_latch = coef->coef_bits_latch;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* All components' quantization values must already be latched. */\n    if ((qtable = compptr->quant_table) == NULL)\n      return FALSE;\n    /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */\n    if (qtable->quantval[0] == 0 ||\n\tqtable->quantval[Q01_POS] == 0 ||\n\tqtable->quantval[Q10_POS] == 0 ||\n\tqtable->quantval[Q20_POS] == 0 ||\n\tqtable->quantval[Q11_POS] == 0 ||\n\tqtable->quantval[Q02_POS] == 0)\n      return FALSE;\n    /* DC values must be at least partly known for all components. */\n    coef_bits = cinfo->coef_bits[ci];\n    if (coef_bits[0] < 0)\n      return FALSE;\n    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */\n    for (coefi = 1; coefi <= 5; coefi++) {\n      coef_bits_latch[coefi] = coef_bits[coefi];\n      if (coef_bits[coefi] != 0)\n\tsmoothing_useful = TRUE;\n    }\n    coef_bits_latch += SAVED_COEFS;\n  }\n\n  return smoothing_useful;\n}\n\n\n/*\n * Variant of decompress_data for use when doing block smoothing.\n */\n\nMETHODDEF(int)\ndecompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)\n{\n  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;\n  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;\n  JDIMENSION block_num, last_block_column;\n  int ci, block_row, block_rows, access_rows;\n  JBLOCKARRAY buffer;\n  JBLOCKROW buffer_ptr, prev_block_row, next_block_row;\n  JSAMPARRAY output_ptr;\n  JDIMENSION output_col;\n  jpeg_component_info *compptr;\n  inverse_DCT_method_ptr inverse_DCT;\n  boolean first_row, last_row;\n  JBLOCK workspace;\n  int *coef_bits;\n  JQUANT_TBL *quanttbl;\n  INT32 Q00,Q01,Q02,Q10,Q11,Q20, num;\n  int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9;\n  int Al, pred;\n\n  /* Force some input to be done if we are getting ahead of the input. */\n  while (cinfo->input_scan_number <= cinfo->output_scan_number &&\n\t ! cinfo->inputctl->eoi_reached) {\n    if (cinfo->input_scan_number == cinfo->output_scan_number) {\n      /* If input is working on current scan, we ordinarily want it to\n       * have completed the current row.  But if input scan is DC,\n       * we want it to keep one row ahead so that next block row's DC\n       * values are up to date.\n       */\n      JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;\n      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta)\n\tbreak;\n    }\n    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)\n      return JPEG_SUSPENDED;\n  }\n\n  /* OK, output from the virtual arrays. */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Don't bother to IDCT an uninteresting component. */\n    if (! compptr->component_needed)\n      continue;\n    /* Count non-dummy DCT block rows in this iMCU row. */\n    if (cinfo->output_iMCU_row < last_iMCU_row) {\n      block_rows = compptr->v_samp_factor;\n      access_rows = block_rows * 2; /* this and next iMCU row */\n      last_row = FALSE;\n    } else {\n      /* NB: can't use last_row_height here; it is input-side-dependent! */\n      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n      if (block_rows == 0) block_rows = compptr->v_samp_factor;\n      access_rows = block_rows; /* this iMCU row only */\n      last_row = TRUE;\n    }\n    /* Align the virtual buffer for this component. */\n    if (cinfo->output_iMCU_row > 0) {\n      access_rows += compptr->v_samp_factor; /* prior iMCU row too */\n      buffer = (*cinfo->mem->access_virt_barray)\n\t((j_common_ptr) cinfo, coef->whole_image[ci],\n\t (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,\n\t (JDIMENSION) access_rows, FALSE);\n      buffer += compptr->v_samp_factor;\t/* point to current iMCU row */\n      first_row = FALSE;\n    } else {\n      buffer = (*cinfo->mem->access_virt_barray)\n\t((j_common_ptr) cinfo, coef->whole_image[ci],\n\t (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE);\n      first_row = TRUE;\n    }\n    /* Fetch component-dependent info */\n    coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);\n    quanttbl = compptr->quant_table;\n    Q00 = quanttbl->quantval[0];\n    Q01 = quanttbl->quantval[Q01_POS];\n    Q10 = quanttbl->quantval[Q10_POS];\n    Q20 = quanttbl->quantval[Q20_POS];\n    Q11 = quanttbl->quantval[Q11_POS];\n    Q02 = quanttbl->quantval[Q02_POS];\n    inverse_DCT = cinfo->idct->inverse_DCT[ci];\n    output_ptr = output_buf[ci];\n    /* Loop over all DCT blocks to be processed. */\n    for (block_row = 0; block_row < block_rows; block_row++) {\n      buffer_ptr = buffer[block_row];\n      if (first_row && block_row == 0)\n\tprev_block_row = buffer_ptr;\n      else\n\tprev_block_row = buffer[block_row-1];\n      if (last_row && block_row == block_rows-1)\n\tnext_block_row = buffer_ptr;\n      else\n\tnext_block_row = buffer[block_row+1];\n      /* We fetch the surrounding DC values using a sliding-register approach.\n       * Initialize all nine here so as to do the right thing on narrow pics.\n       */\n      DC1 = DC2 = DC3 = (int) prev_block_row[0][0];\n      DC4 = DC5 = DC6 = (int) buffer_ptr[0][0];\n      DC7 = DC8 = DC9 = (int) next_block_row[0][0];\n      output_col = 0;\n      last_block_column = compptr->width_in_blocks - 1;\n      for (block_num = 0; block_num <= last_block_column; block_num++) {\n\t/* Fetch current DCT block into workspace so we can modify it. */\n\tjcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1);\n\t/* Update DC values */\n\tif (block_num < last_block_column) {\n\t  DC3 = (int) prev_block_row[1][0];\n\t  DC6 = (int) buffer_ptr[1][0];\n\t  DC9 = (int) next_block_row[1][0];\n\t}\n\t/* Compute coefficient estimates per K.8.\n\t * An estimate is applied only if coefficient is still zero,\n\t * and is not known to be fully accurate.\n\t */\n\t/* AC01 */\n\tif ((Al=coef_bits[1]) != 0 && workspace[1] == 0) {\n\t  num = 36 * Q00 * (DC4 - DC6);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q01<<7) + num) / (Q01<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q01<<7) - num) / (Q01<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[1] = (JCOEF) pred;\n\t}\n\t/* AC10 */\n\tif ((Al=coef_bits[2]) != 0 && workspace[8] == 0) {\n\t  num = 36 * Q00 * (DC2 - DC8);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q10<<7) + num) / (Q10<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q10<<7) - num) / (Q10<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[8] = (JCOEF) pred;\n\t}\n\t/* AC20 */\n\tif ((Al=coef_bits[3]) != 0 && workspace[16] == 0) {\n\t  num = 9 * Q00 * (DC2 + DC8 - 2*DC5);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q20<<7) + num) / (Q20<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q20<<7) - num) / (Q20<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[16] = (JCOEF) pred;\n\t}\n\t/* AC11 */\n\tif ((Al=coef_bits[4]) != 0 && workspace[9] == 0) {\n\t  num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q11<<7) + num) / (Q11<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q11<<7) - num) / (Q11<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[9] = (JCOEF) pred;\n\t}\n\t/* AC02 */\n\tif ((Al=coef_bits[5]) != 0 && workspace[2] == 0) {\n\t  num = 9 * Q00 * (DC4 + DC6 - 2*DC5);\n\t  if (num >= 0) {\n\t    pred = (int) (((Q02<<7) + num) / (Q02<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t  } else {\n\t    pred = (int) (((Q02<<7) - num) / (Q02<<8));\n\t    if (Al > 0 && pred >= (1<<Al))\n\t      pred = (1<<Al)-1;\n\t    pred = -pred;\n\t  }\n\t  workspace[2] = (JCOEF) pred;\n\t}\n\t/* OK, do the IDCT */\n\t(*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace,\n\t\t\toutput_ptr, output_col);\n\t/* Advance for next column */\n\tDC1 = DC2; DC2 = DC3;\n\tDC4 = DC5; DC5 = DC6;\n\tDC7 = DC8; DC8 = DC9;\n\tbuffer_ptr++, prev_block_row++, next_block_row++;\n\toutput_col += compptr->DCT_h_scaled_size;\n      }\n      output_ptr += compptr->DCT_v_scaled_size;\n    }\n  }\n\n  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)\n    return JPEG_ROW_COMPLETED;\n  return JPEG_SCAN_COMPLETED;\n}\n\n#endif /* BLOCK_SMOOTHING_SUPPORTED */\n\n\n/*\n * Initialize coefficient buffer controller.\n */\n\nGLOBAL(void)\njinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)\n{\n  my_coef_ptr coef;\n\n  coef = (my_coef_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_coef_controller));\n  cinfo->coef = (struct jpeg_d_coef_controller *) coef;\n  coef->pub.start_input_pass = start_input_pass;\n  coef->pub.start_output_pass = start_output_pass;\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n  coef->coef_bits_latch = NULL;\n#endif\n\n  /* Create the coefficient buffer. */\n  if (need_full_buffer) {\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n    /* Allocate a full-image virtual array for each component, */\n    /* padded to a multiple of samp_factor DCT blocks in each direction. */\n    /* Note we ask for a pre-zeroed array. */\n    int ci, access_rows;\n    jpeg_component_info *compptr;\n\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      access_rows = compptr->v_samp_factor;\n#ifdef BLOCK_SMOOTHING_SUPPORTED\n      /* If block smoothing could be used, need a bigger window */\n      if (cinfo->progressive_mode)\n\taccess_rows *= 3;\n#endif\n      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE,\n\t (JDIMENSION) jround_up((long) compptr->width_in_blocks,\n\t\t\t\t(long) compptr->h_samp_factor),\n\t (JDIMENSION) jround_up((long) compptr->height_in_blocks,\n\t\t\t\t(long) compptr->v_samp_factor),\n\t (JDIMENSION) access_rows);\n    }\n    coef->pub.consume_data = consume_data;\n    coef->pub.decompress_data = decompress_data;\n    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n  } else {\n    /* We only need a single-MCU buffer. */\n    JBLOCKROW buffer;\n    int i;\n\n    buffer = (JBLOCKROW)\n      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));\n    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {\n      coef->MCU_buffer[i] = buffer + i;\n    }\n    if (cinfo->lim_Se == 0)\t/* DC only case: want to bypass later */\n      FMEMZERO((void FAR *) buffer,\n\t       (size_t) (D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)));\n    coef->pub.consume_data = dummy_consume_data;\n    coef->pub.decompress_data = decompress_onepass;\n    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdcolor.c",
    "content": "/*\n * jdcolor.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 2011-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains output colorspace conversion routines.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_color_deconverter pub; /* public fields */\n\n  /* Private state for YCC->RGB conversion */\n  int * Cr_r_tab;\t\t/* => table for Cr to R conversion */\n  int * Cb_b_tab;\t\t/* => table for Cb to B conversion */\n  INT32 * Cr_g_tab;\t\t/* => table for Cr to G conversion */\n  INT32 * Cb_g_tab;\t\t/* => table for Cb to G conversion */\n\n  /* Private state for RGB->Y conversion */\n  INT32 * rgb_y_tab;\t\t/* => table for RGB to Y conversion */\n} my_color_deconverter;\n\ntypedef my_color_deconverter * my_cconvert_ptr;\n\n\n/**************** YCbCr -> RGB conversion: most common case **************/\n/****************   RGB -> Y   conversion: less common case **************/\n\n/*\n * YCbCr is defined per CCIR 601-1, except that Cb and Cr are\n * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.\n * The conversion equations to be implemented are therefore\n *\n *\tR = Y                + 1.40200 * Cr\n *\tG = Y - 0.34414 * Cb - 0.71414 * Cr\n *\tB = Y + 1.77200 * Cb\n *\n *\tY = 0.29900 * R + 0.58700 * G + 0.11400 * B\n *\n * where Cb and Cr represent the incoming values less CENTERJSAMPLE.\n * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)\n *\n * To avoid floating-point arithmetic, we represent the fractional constants\n * as integers scaled up by 2^16 (about 4 digits precision); we have to divide\n * the products by 2^16, with appropriate rounding, to get the correct answer.\n * Notice that Y, being an integral input, does not contribute any fraction\n * so it need not participate in the rounding.\n *\n * For even more speed, we avoid doing any multiplications in the inner loop\n * by precalculating the constants times Cb and Cr for all possible values.\n * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);\n * for 12-bit samples it is still acceptable.  It's not very reasonable for\n * 16-bit samples, but if you want lossless storage you shouldn't be changing\n * colorspace anyway.\n * The Cr=>R and Cb=>B values can be rounded to integers in advance; the\n * values for the G calculation are left scaled up, since we must add them\n * together before rounding.\n */\n\n#define SCALEBITS\t16\t/* speediest right-shift on some machines */\n#define ONE_HALF\t((INT32) 1 << (SCALEBITS-1))\n#define FIX(x)\t\t((INT32) ((x) * (1L<<SCALEBITS) + 0.5))\n\n/* We allocate one big table for RGB->Y conversion and divide it up into\n * three parts, instead of doing three alloc_small requests.  This lets us\n * use a single table base address, which can be held in a register in the\n * inner loops on many machines (more than can hold all three addresses,\n * anyway).\n */\n\n#define R_Y_OFF\t\t0\t\t\t/* offset to R => Y section */\n#define G_Y_OFF\t\t(1*(MAXJSAMPLE+1))\t/* offset to G => Y section */\n#define B_Y_OFF\t\t(2*(MAXJSAMPLE+1))\t/* etc. */\n#define TABLE_SIZE\t(3*(MAXJSAMPLE+1))\n\n\n/*\n * Initialize tables for YCC->RGB colorspace conversion.\n */\n\nLOCAL(void)\nbuild_ycc_rgb_table (j_decompress_ptr cinfo)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  int i;\n  INT32 x;\n  SHIFT_TEMPS\n\n  cconvert->Cr_r_tab = (int *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(int));\n  cconvert->Cb_b_tab = (int *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(int));\n  cconvert->Cr_g_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(INT32));\n  cconvert->Cb_g_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(INT32));\n\n  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {\n    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */\n    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */\n    /* Cr=>R value is nearest int to 1.40200 * x */\n    cconvert->Cr_r_tab[i] = (int)\n\t\t    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);\n    /* Cb=>B value is nearest int to 1.77200 * x */\n    cconvert->Cb_b_tab[i] = (int)\n\t\t    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);\n    /* Cr=>G value is scaled-up -0.71414 * x */\n    cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;\n    /* Cb=>G value is scaled-up -0.34414 * x */\n    /* We also add in ONE_HALF so that need not do it in inner loop */\n    cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;\n  }\n}\n\n\n/*\n * Convert some rows of samples to the output colorspace.\n *\n * Note that we change from noninterleaved, one-plane-per-component format\n * to interleaved-pixel format.  The output buffer is therefore three times\n * as wide as the input buffer.\n * A starting row offset is provided only for the input buffer.  The caller\n * can easily adjust the passed output_buf value to accommodate any row\n * offset required on that side.\n */\n\nMETHODDEF(void)\nycc_rgb_convert (j_decompress_ptr cinfo,\n\t\t JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t JSAMPARRAY output_buf, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register int y, cb, cr;\n  register JSAMPROW outptr;\n  register JSAMPROW inptr0, inptr1, inptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n  /* copy these pointers into registers if possible */\n  register JSAMPLE * range_limit = cinfo->sample_range_limit;\n  register int * Crrtab = cconvert->Cr_r_tab;\n  register int * Cbbtab = cconvert->Cb_b_tab;\n  register INT32 * Crgtab = cconvert->Cr_g_tab;\n  register INT32 * Cbgtab = cconvert->Cb_g_tab;\n  SHIFT_TEMPS\n\n  while (--num_rows >= 0) {\n    inptr0 = input_buf[0][input_row];\n    inptr1 = input_buf[1][input_row];\n    inptr2 = input_buf[2][input_row];\n    input_row++;\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      y  = GETJSAMPLE(inptr0[col]);\n      cb = GETJSAMPLE(inptr1[col]);\n      cr = GETJSAMPLE(inptr2[col]);\n      /* Range-limiting is essential due to noise introduced by DCT losses. */\n      outptr[RGB_RED] =   range_limit[y + Crrtab[cr]];\n      outptr[RGB_GREEN] = range_limit[y +\n\t\t\t      ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],\n\t\t\t\t\t\t SCALEBITS))];\n      outptr[RGB_BLUE] =  range_limit[y + Cbbtab[cb]];\n      outptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/**************** Cases other than YCbCr -> RGB **************/\n\n\n/*\n * Initialize for RGB->grayscale colorspace conversion.\n */\n\nLOCAL(void)\nbuild_rgb_y_table (j_decompress_ptr cinfo)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  INT32 * rgb_y_tab;\n  INT32 i;\n\n  /* Allocate and fill in the conversion tables. */\n  cconvert->rgb_y_tab = rgb_y_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(TABLE_SIZE * SIZEOF(INT32)));\n\n  for (i = 0; i <= MAXJSAMPLE; i++) {\n    rgb_y_tab[i+R_Y_OFF] = FIX(0.29900) * i;\n    rgb_y_tab[i+G_Y_OFF] = FIX(0.58700) * i;\n    rgb_y_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;\n  }\n}\n\n\n/*\n * Convert RGB to grayscale.\n */\n\nMETHODDEF(void)\nrgb_gray_convert (j_decompress_ptr cinfo,\n\t\t  JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t  JSAMPARRAY output_buf, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register INT32 * ctab = cconvert->rgb_y_tab;\n  register int r, g, b;\n  register JSAMPROW outptr;\n  register JSAMPROW inptr0, inptr1, inptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n\n  while (--num_rows >= 0) {\n    inptr0 = input_buf[0][input_row];\n    inptr1 = input_buf[1][input_row];\n    inptr2 = input_buf[2][input_row];\n    input_row++;\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      r = GETJSAMPLE(inptr0[col]);\n      g = GETJSAMPLE(inptr1[col]);\n      b = GETJSAMPLE(inptr2[col]);\n      /* Y */\n      outptr[col] = (JSAMPLE)\n\t\t((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])\n\t\t >> SCALEBITS);\n    }\n  }\n}\n\n\n/*\n * [R-G,G,B-G] to [R,G,B] conversion with modulo calculation\n * (inverse color transform).\n */\n\nMETHODDEF(void)\nrgb1_rgb_convert (j_decompress_ptr cinfo,\n\t\t  JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t  JSAMPARRAY output_buf, int num_rows)\n{\n  register int r, g, b;\n  register JSAMPROW outptr;\n  register JSAMPROW inptr0, inptr1, inptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n\n  while (--num_rows >= 0) {\n    inptr0 = input_buf[0][input_row];\n    inptr1 = input_buf[1][input_row];\n    inptr2 = input_buf[2][input_row];\n    input_row++;\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      r = GETJSAMPLE(inptr0[col]);\n      g = GETJSAMPLE(inptr1[col]);\n      b = GETJSAMPLE(inptr2[col]);\n      /* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD\n       * (modulo) operator is equivalent to the bitmask operator AND.\n       */\n      outptr[RGB_RED]   = (JSAMPLE) ((r + g - CENTERJSAMPLE) & MAXJSAMPLE);\n      outptr[RGB_GREEN] = (JSAMPLE) g;\n      outptr[RGB_BLUE]  = (JSAMPLE) ((b + g - CENTERJSAMPLE) & MAXJSAMPLE);\n      outptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/*\n * [R-G,G,B-G] to grayscale conversion with modulo calculation\n * (inverse color transform).\n */\n\nMETHODDEF(void)\nrgb1_gray_convert (j_decompress_ptr cinfo,\n\t\t   JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t   JSAMPARRAY output_buf, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register INT32 * ctab = cconvert->rgb_y_tab;\n  register int r, g, b;\n  register JSAMPROW outptr;\n  register JSAMPROW inptr0, inptr1, inptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n\n  while (--num_rows >= 0) {\n    inptr0 = input_buf[0][input_row];\n    inptr1 = input_buf[1][input_row];\n    inptr2 = input_buf[2][input_row];\n    input_row++;\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      r = GETJSAMPLE(inptr0[col]);\n      g = GETJSAMPLE(inptr1[col]);\n      b = GETJSAMPLE(inptr2[col]);\n      /* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD\n       * (modulo) operator is equivalent to the bitmask operator AND.\n       */\n      r = (r + g - CENTERJSAMPLE) & MAXJSAMPLE;\n      b = (b + g - CENTERJSAMPLE) & MAXJSAMPLE;\n      /* Y */\n      outptr[col] = (JSAMPLE)\n\t\t((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])\n\t\t >> SCALEBITS);\n    }\n  }\n}\n\n\n/*\n * No colorspace change, but conversion from separate-planes\n * to interleaved representation.\n */\n\nMETHODDEF(void)\nrgb_convert (j_decompress_ptr cinfo,\n\t     JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t     JSAMPARRAY output_buf, int num_rows)\n{\n  register JSAMPROW outptr;\n  register JSAMPROW inptr0, inptr1, inptr2;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n\n  while (--num_rows >= 0) {\n    inptr0 = input_buf[0][input_row];\n    inptr1 = input_buf[1][input_row];\n    inptr2 = input_buf[2][input_row];\n    input_row++;\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      /* We can dispense with GETJSAMPLE() here */\n      outptr[RGB_RED]   = inptr0[col];\n      outptr[RGB_GREEN] = inptr1[col];\n      outptr[RGB_BLUE]  = inptr2[col];\n      outptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/*\n * Color conversion for no colorspace change: just copy the data,\n * converting from separate-planes to interleaved representation.\n */\n\nMETHODDEF(void)\nnull_convert (j_decompress_ptr cinfo,\n\t      JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t      JSAMPARRAY output_buf, int num_rows)\n{\n  int ci;\n  register int nc = cinfo->num_components;\n  register JSAMPROW outptr;\n  register JSAMPROW inptr;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n\n  while (--num_rows >= 0) {\n    for (ci = 0; ci < nc; ci++) {\n      inptr = input_buf[ci][input_row];\n      outptr = output_buf[0] + ci;\n      for (col = 0; col < num_cols; col++) {\n\t*outptr = *inptr++;\t/* needn't bother with GETJSAMPLE() here */\n\toutptr += nc;\n      }\n    }\n    input_row++;\n    output_buf++;\n  }\n}\n\n\n/*\n * Color conversion for grayscale: just copy the data.\n * This also works for YCbCr -> grayscale conversion, in which\n * we just copy the Y (luminance) component and ignore chrominance.\n */\n\nMETHODDEF(void)\ngrayscale_convert (j_decompress_ptr cinfo,\n\t\t   JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t   JSAMPARRAY output_buf, int num_rows)\n{\n  jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,\n\t\t    num_rows, cinfo->output_width);\n}\n\n\n/*\n * Convert grayscale to RGB: just duplicate the graylevel three times.\n * This is provided to support applications that don't want to cope\n * with grayscale as a separate case.\n */\n\nMETHODDEF(void)\ngray_rgb_convert (j_decompress_ptr cinfo,\n\t\t  JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t  JSAMPARRAY output_buf, int num_rows)\n{\n  register JSAMPROW outptr;\n  register JSAMPROW inptr;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n\n  while (--num_rows >= 0) {\n    inptr = input_buf[0][input_row++];\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      /* We can dispense with GETJSAMPLE() here */\n      outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];\n      outptr += RGB_PIXELSIZE;\n    }\n  }\n}\n\n\n/*\n * Adobe-style YCCK->CMYK conversion.\n * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same\n * conversion as above, while passing K (black) unchanged.\n * We assume build_ycc_rgb_table has been called.\n */\n\nMETHODDEF(void)\nycck_cmyk_convert (j_decompress_ptr cinfo,\n\t\t   JSAMPIMAGE input_buf, JDIMENSION input_row,\n\t\t   JSAMPARRAY output_buf, int num_rows)\n{\n  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;\n  register int y, cb, cr;\n  register JSAMPROW outptr;\n  register JSAMPROW inptr0, inptr1, inptr2, inptr3;\n  register JDIMENSION col;\n  JDIMENSION num_cols = cinfo->output_width;\n  /* copy these pointers into registers if possible */\n  register JSAMPLE * range_limit = cinfo->sample_range_limit;\n  register int * Crrtab = cconvert->Cr_r_tab;\n  register int * Cbbtab = cconvert->Cb_b_tab;\n  register INT32 * Crgtab = cconvert->Cr_g_tab;\n  register INT32 * Cbgtab = cconvert->Cb_g_tab;\n  SHIFT_TEMPS\n\n  while (--num_rows >= 0) {\n    inptr0 = input_buf[0][input_row];\n    inptr1 = input_buf[1][input_row];\n    inptr2 = input_buf[2][input_row];\n    inptr3 = input_buf[3][input_row];\n    input_row++;\n    outptr = *output_buf++;\n    for (col = 0; col < num_cols; col++) {\n      y  = GETJSAMPLE(inptr0[col]);\n      cb = GETJSAMPLE(inptr1[col]);\n      cr = GETJSAMPLE(inptr2[col]);\n      /* Range-limiting is essential due to noise introduced by DCT losses. */\n      outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])];\t/* red */\n      outptr[1] = range_limit[MAXJSAMPLE - (y +\t\t\t/* green */\n\t\t\t      ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],\n\t\t\t\t\t\t SCALEBITS)))];\n      outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])];\t/* blue */\n      /* K passes through unchanged */\n      outptr[3] = inptr3[col];\t/* don't need GETJSAMPLE here */\n      outptr += 4;\n    }\n  }\n}\n\n\n/*\n * Empty method for start_pass.\n */\n\nMETHODDEF(void)\nstart_pass_dcolor (j_decompress_ptr cinfo)\n{\n  /* no work needed */\n}\n\n\n/*\n * Module initialization routine for output colorspace conversion.\n */\n\nGLOBAL(void)\njinit_color_deconverter (j_decompress_ptr cinfo)\n{\n  my_cconvert_ptr cconvert;\n  int ci;\n\n  cconvert = (my_cconvert_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_color_deconverter));\n  cinfo->cconvert = &cconvert->pub;\n  cconvert->pub.start_pass = start_pass_dcolor;\n\n  /* Make sure num_components agrees with jpeg_color_space */\n  switch (cinfo->jpeg_color_space) {\n  case JCS_GRAYSCALE:\n    if (cinfo->num_components != 1)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    break;\n\n  case JCS_RGB:\n  case JCS_YCbCr:\n    if (cinfo->num_components != 3)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    break;\n\n  case JCS_CMYK:\n  case JCS_YCCK:\n    if (cinfo->num_components != 4)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    break;\n\n  default:\t\t\t/* JCS_UNKNOWN can be anything */\n    if (cinfo->num_components < 1)\n      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);\n    break;\n  }\n\n  /* Support color transform only for RGB colorspace */\n  if (cinfo->color_transform && cinfo->jpeg_color_space != JCS_RGB)\n    ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n\n  /* Set out_color_components and conversion method based on requested space.\n   * Also clear the component_needed flags for any unused components,\n   * so that earlier pipeline stages can avoid useless computation.\n   */\n\n  switch (cinfo->out_color_space) {\n  case JCS_GRAYSCALE:\n    cinfo->out_color_components = 1;\n    if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||\n\tcinfo->jpeg_color_space == JCS_YCbCr) {\n      cconvert->pub.color_convert = grayscale_convert;\n      /* For color->grayscale conversion, only the Y (0) component is needed */\n      for (ci = 1; ci < cinfo->num_components; ci++)\n\tcinfo->comp_info[ci].component_needed = FALSE;\n    } else if (cinfo->jpeg_color_space == JCS_RGB) {\n      switch (cinfo->color_transform) {\n      case JCT_NONE:\n\tcconvert->pub.color_convert = rgb_gray_convert;\n\tbreak;\n      case JCT_SUBTRACT_GREEN:\n\tcconvert->pub.color_convert = rgb1_gray_convert;\n\tbreak;\n      default:\n\tERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n\tbreak;\n      }\n      build_rgb_y_table(cinfo);\n    } else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_RGB:\n    cinfo->out_color_components = RGB_PIXELSIZE;\n    if (cinfo->jpeg_color_space == JCS_YCbCr) {\n      cconvert->pub.color_convert = ycc_rgb_convert;\n      build_ycc_rgb_table(cinfo);\n    } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {\n      cconvert->pub.color_convert = gray_rgb_convert;\n    } else if (cinfo->jpeg_color_space == JCS_RGB) {\n      switch (cinfo->color_transform) {\n      case JCT_NONE:\n\tcconvert->pub.color_convert = rgb_convert;\n\tbreak;\n      case JCT_SUBTRACT_GREEN:\n\tcconvert->pub.color_convert = rgb1_rgb_convert;\n\tbreak;\n      default:\n\tERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n\tbreak;\n      }\n    } else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  case JCS_CMYK:\n    cinfo->out_color_components = 4;\n    if (cinfo->jpeg_color_space == JCS_YCCK) {\n      cconvert->pub.color_convert = ycck_cmyk_convert;\n      build_ycc_rgb_table(cinfo);\n    } else if (cinfo->jpeg_color_space == JCS_CMYK) {\n      cconvert->pub.color_convert = null_convert;\n    } else\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n\n  default:\n    /* Permit null conversion to same output space */\n    if (cinfo->out_color_space == cinfo->jpeg_color_space) {\n      cinfo->out_color_components = cinfo->num_components;\n      cconvert->pub.color_convert = null_convert;\n    } else\t\t\t/* unsupported non-null conversion */\n      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n    break;\n  }\n\n  if (cinfo->quantize_colors)\n    cinfo->output_components = 1; /* single colormapped output component */\n  else\n    cinfo->output_components = cinfo->out_color_components;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jddctmgr.c",
    "content": "/*\n * jddctmgr.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * Modified 2002-2010 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the inverse-DCT management logic.\n * This code selects a particular IDCT implementation to be used,\n * and it performs related housekeeping chores.  No code in this file\n * is executed per IDCT step, only during output pass setup.\n *\n * Note that the IDCT routines are responsible for performing coefficient\n * dequantization as well as the IDCT proper.  This module sets up the\n * dequantization multiplier table needed by the IDCT routine.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n\n/*\n * The decompressor input side (jdinput.c) saves away the appropriate\n * quantization table for each component at the start of the first scan\n * involving that component.  (This is necessary in order to correctly\n * decode files that reuse Q-table slots.)\n * When we are ready to make an output pass, the saved Q-table is converted\n * to a multiplier table that will actually be used by the IDCT routine.\n * The multiplier table contents are IDCT-method-dependent.  To support\n * application changes in IDCT method between scans, we can remake the\n * multiplier tables if necessary.\n * In buffered-image mode, the first output pass may occur before any data\n * has been seen for some components, and thus before their Q-tables have\n * been saved away.  To handle this case, multiplier tables are preset\n * to zeroes; the result of the IDCT will be a neutral gray level.\n */\n\n\n/* Private subobject for this module */\n\ntypedef struct {\n  struct jpeg_inverse_dct pub;\t/* public fields */\n\n  /* This array contains the IDCT method code that each multiplier table\n   * is currently set up for, or -1 if it's not yet set up.\n   * The actual multiplier tables are pointed to by dct_table in the\n   * per-component comp_info structures.\n   */\n  int cur_method[MAX_COMPONENTS];\n} my_idct_controller;\n\ntypedef my_idct_controller * my_idct_ptr;\n\n\n/* Allocated multiplier tables: big enough for any supported variant */\n\ntypedef union {\n  ISLOW_MULT_TYPE islow_array[DCTSIZE2];\n#ifdef DCT_IFAST_SUPPORTED\n  IFAST_MULT_TYPE ifast_array[DCTSIZE2];\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n  FLOAT_MULT_TYPE float_array[DCTSIZE2];\n#endif\n} multiplier_table;\n\n\n/* The current scaled-IDCT routines require ISLOW-style multiplier tables,\n * so be sure to compile that code if either ISLOW or SCALING is requested.\n */\n#ifdef DCT_ISLOW_SUPPORTED\n#define PROVIDE_ISLOW_TABLES\n#else\n#ifdef IDCT_SCALING_SUPPORTED\n#define PROVIDE_ISLOW_TABLES\n#endif\n#endif\n\n\n/*\n * Prepare for an output pass.\n * Here we select the proper IDCT routine for each component and build\n * a matching multiplier table.\n */\n\nMETHODDEF(void)\nstart_pass (j_decompress_ptr cinfo)\n{\n  my_idct_ptr idct = (my_idct_ptr) cinfo->idct;\n  int ci, i;\n  jpeg_component_info *compptr;\n  int method = 0;\n  inverse_DCT_method_ptr method_ptr = NULL;\n  JQUANT_TBL * qtbl;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Select the proper IDCT routine for this component's scaling */\n    switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) {\n#ifdef IDCT_SCALING_SUPPORTED\n    case ((1 << 8) + 1):\n      method_ptr = jpeg_idct_1x1;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((2 << 8) + 2):\n      method_ptr = jpeg_idct_2x2;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((3 << 8) + 3):\n      method_ptr = jpeg_idct_3x3;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((4 << 8) + 4):\n      method_ptr = jpeg_idct_4x4;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((5 << 8) + 5):\n      method_ptr = jpeg_idct_5x5;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((6 << 8) + 6):\n      method_ptr = jpeg_idct_6x6;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((7 << 8) + 7):\n      method_ptr = jpeg_idct_7x7;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((9 << 8) + 9):\n      method_ptr = jpeg_idct_9x9;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((10 << 8) + 10):\n      method_ptr = jpeg_idct_10x10;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((11 << 8) + 11):\n      method_ptr = jpeg_idct_11x11;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((12 << 8) + 12):\n      method_ptr = jpeg_idct_12x12;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((13 << 8) + 13):\n      method_ptr = jpeg_idct_13x13;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((14 << 8) + 14):\n      method_ptr = jpeg_idct_14x14;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((15 << 8) + 15):\n      method_ptr = jpeg_idct_15x15;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((16 << 8) + 16):\n      method_ptr = jpeg_idct_16x16;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((16 << 8) + 8):\n      method_ptr = jpeg_idct_16x8;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((14 << 8) + 7):\n      method_ptr = jpeg_idct_14x7;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((12 << 8) + 6):\n      method_ptr = jpeg_idct_12x6;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((10 << 8) + 5):\n      method_ptr = jpeg_idct_10x5;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((8 << 8) + 4):\n      method_ptr = jpeg_idct_8x4;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((6 << 8) + 3):\n      method_ptr = jpeg_idct_6x3;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((4 << 8) + 2):\n      method_ptr = jpeg_idct_4x2;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((2 << 8) + 1):\n      method_ptr = jpeg_idct_2x1;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((8 << 8) + 16):\n      method_ptr = jpeg_idct_8x16;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((7 << 8) + 14):\n      method_ptr = jpeg_idct_7x14;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((6 << 8) + 12):\n      method_ptr = jpeg_idct_6x12;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((5 << 8) + 10):\n      method_ptr = jpeg_idct_5x10;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((4 << 8) + 8):\n      method_ptr = jpeg_idct_4x8;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((3 << 8) + 6):\n      method_ptr = jpeg_idct_3x6;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((2 << 8) + 4):\n      method_ptr = jpeg_idct_2x4;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n    case ((1 << 8) + 2):\n      method_ptr = jpeg_idct_1x2;\n      method = JDCT_ISLOW;\t/* jidctint uses islow-style table */\n      break;\n#endif\n    case ((DCTSIZE << 8) + DCTSIZE):\n      switch (cinfo->dct_method) {\n#ifdef DCT_ISLOW_SUPPORTED\n      case JDCT_ISLOW:\n\tmethod_ptr = jpeg_idct_islow;\n\tmethod = JDCT_ISLOW;\n\tbreak;\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n      case JDCT_IFAST:\n\tmethod_ptr = jpeg_idct_ifast;\n\tmethod = JDCT_IFAST;\n\tbreak;\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n      case JDCT_FLOAT:\n\tmethod_ptr = jpeg_idct_float;\n\tmethod = JDCT_FLOAT;\n\tbreak;\n#endif\n      default:\n\tERREXIT(cinfo, JERR_NOT_COMPILED);\n\tbreak;\n      }\n      break;\n    default:\n      ERREXIT2(cinfo, JERR_BAD_DCTSIZE,\n\t       compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size);\n      break;\n    }\n    idct->pub.inverse_DCT[ci] = method_ptr;\n    /* Create multiplier table from quant table.\n     * However, we can skip this if the component is uninteresting\n     * or if we already built the table.  Also, if no quant table\n     * has yet been saved for the component, we leave the\n     * multiplier table all-zero; we'll be reading zeroes from the\n     * coefficient controller's buffer anyway.\n     */\n    if (! compptr->component_needed || idct->cur_method[ci] == method)\n      continue;\n    qtbl = compptr->quant_table;\n    if (qtbl == NULL)\t\t/* happens if no data yet for component */\n      continue;\n    idct->cur_method[ci] = method;\n    switch (method) {\n#ifdef PROVIDE_ISLOW_TABLES\n    case JDCT_ISLOW:\n      {\n\t/* For LL&M IDCT method, multipliers are equal to raw quantization\n\t * coefficients, but are stored as ints to ensure access efficiency.\n\t */\n\tISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;\n\tfor (i = 0; i < DCTSIZE2; i++) {\n\t  ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];\n\t}\n      }\n      break;\n#endif\n#ifdef DCT_IFAST_SUPPORTED\n    case JDCT_IFAST:\n      {\n\t/* For AA&N IDCT method, multipliers are equal to quantization\n\t * coefficients scaled by scalefactor[row]*scalefactor[col], where\n\t *   scalefactor[0] = 1\n\t *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7\n\t * For integer operation, the multiplier table is to be scaled by\n\t * IFAST_SCALE_BITS.\n\t */\n\tIFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;\n#define CONST_BITS 14\n\tstatic const INT16 aanscales[DCTSIZE2] = {\n\t  /* precomputed values scaled up by 14 bits */\n\t  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,\n\t  22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,\n\t  21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,\n\t  19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,\n\t  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,\n\t  12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,\n\t   8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,\n\t   4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247\n\t};\n\tSHIFT_TEMPS\n\n\tfor (i = 0; i < DCTSIZE2; i++) {\n\t  ifmtbl[i] = (IFAST_MULT_TYPE)\n\t    DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],\n\t\t\t\t  (INT32) aanscales[i]),\n\t\t    CONST_BITS-IFAST_SCALE_BITS);\n\t}\n      }\n      break;\n#endif\n#ifdef DCT_FLOAT_SUPPORTED\n    case JDCT_FLOAT:\n      {\n\t/* For float AA&N IDCT method, multipliers are equal to quantization\n\t * coefficients scaled by scalefactor[row]*scalefactor[col], where\n\t *   scalefactor[0] = 1\n\t *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7\n\t * We apply a further scale factor of 1/8.\n\t */\n\tFLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;\n\tint row, col;\n\tstatic const double aanscalefactor[DCTSIZE] = {\n\t  1.0, 1.387039845, 1.306562965, 1.175875602,\n\t  1.0, 0.785694958, 0.541196100, 0.275899379\n\t};\n\n\ti = 0;\n\tfor (row = 0; row < DCTSIZE; row++) {\n\t  for (col = 0; col < DCTSIZE; col++) {\n\t    fmtbl[i] = (FLOAT_MULT_TYPE)\n\t      ((double) qtbl->quantval[i] *\n\t       aanscalefactor[row] * aanscalefactor[col] * 0.125);\n\t    i++;\n\t  }\n\t}\n      }\n      break;\n#endif\n    default:\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n      break;\n    }\n  }\n}\n\n\n/*\n * Initialize IDCT manager.\n */\n\nGLOBAL(void)\njinit_inverse_dct (j_decompress_ptr cinfo)\n{\n  my_idct_ptr idct;\n  int ci;\n  jpeg_component_info *compptr;\n\n  idct = (my_idct_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_idct_controller));\n  cinfo->idct = (struct jpeg_inverse_dct *) idct;\n  idct->pub.start_pass = start_pass;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Allocate and pre-zero a multiplier table for each component */\n    compptr->dct_table =\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(multiplier_table));\n    MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));\n    /* Mark multiplier table not yet set up for any method */\n    idct->cur_method[ci] = -1;\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdhuff.c",
    "content": "/*\n * jdhuff.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 2006-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains Huffman entropy decoding routines.\n * Both sequential and progressive modes are supported in this single module.\n *\n * Much of the complexity here has to do with supporting input suspension.\n * If the data source module demands suspension, we want to be able to back\n * up to the start of the current MCU.  To do this, we copy state variables\n * into local working storage, and update them back to the permanent\n * storage only upon successful completion of an MCU.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Derived data constructed for each Huffman table */\n\n#define HUFF_LOOKAHEAD\t8\t/* # of bits of lookahead */\n\ntypedef struct {\n  /* Basic tables: (element [0] of each array is unused) */\n  INT32 maxcode[18];\t\t/* largest code of length k (-1 if none) */\n  /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */\n  INT32 valoffset[17];\t\t/* huffval[] offset for codes of length k */\n  /* valoffset[k] = huffval[] index of 1st symbol of code length k, less\n   * the smallest code of length k; so given a code of length k, the\n   * corresponding symbol is huffval[code + valoffset[k]]\n   */\n\n  /* Link to public Huffman table (needed only in jpeg_huff_decode) */\n  JHUFF_TBL *pub;\n\n  /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of\n   * the input data stream.  If the next Huffman code is no more\n   * than HUFF_LOOKAHEAD bits long, we can obtain its length and\n   * the corresponding symbol directly from these tables.\n   */\n  int look_nbits[1<<HUFF_LOOKAHEAD]; /* # bits, or 0 if too long */\n  UINT8 look_sym[1<<HUFF_LOOKAHEAD]; /* symbol, or unused */\n} d_derived_tbl;\n\n\n/*\n * Fetching the next N bits from the input stream is a time-critical operation\n * for the Huffman decoders.  We implement it with a combination of inline\n * macros and out-of-line subroutines.  Note that N (the number of bits\n * demanded at one time) never exceeds 15 for JPEG use.\n *\n * We read source bytes into get_buffer and dole out bits as needed.\n * If get_buffer already contains enough bits, they are fetched in-line\n * by the macros CHECK_BIT_BUFFER and GET_BITS.  When there aren't enough\n * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer\n * as full as possible (not just to the number of bits needed; this\n * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer).\n * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension.\n * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains\n * at least the requested number of bits --- dummy zeroes are inserted if\n * necessary.\n */\n\ntypedef INT32 bit_buf_type;\t/* type of bit-extraction buffer */\n#define BIT_BUF_SIZE  32\t/* size of buffer in bits */\n\n/* If long is > 32 bits on your machine, and shifting/masking longs is\n * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE\n * appropriately should be a win.  Unfortunately we can't define the size\n * with something like  #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8)\n * because not all machines measure sizeof in 8-bit bytes.\n */\n\ntypedef struct {\t\t/* Bitreading state saved across MCUs */\n  bit_buf_type get_buffer;\t/* current bit-extraction buffer */\n  int bits_left;\t\t/* # of unused bits in it */\n} bitread_perm_state;\n\ntypedef struct {\t\t/* Bitreading working state within an MCU */\n  /* Current data source location */\n  /* We need a copy, rather than munging the original, in case of suspension */\n  const JOCTET * next_input_byte; /* => next byte to read from source */\n  size_t bytes_in_buffer;\t/* # of bytes remaining in source buffer */\n  /* Bit input buffer --- note these values are kept in register variables,\n   * not in this struct, inside the inner loops.\n   */\n  bit_buf_type get_buffer;\t/* current bit-extraction buffer */\n  int bits_left;\t\t/* # of unused bits in it */\n  /* Pointer needed by jpeg_fill_bit_buffer. */\n  j_decompress_ptr cinfo;\t/* back link to decompress master record */\n} bitread_working_state;\n\n/* Macros to declare and load/save bitread local variables. */\n#define BITREAD_STATE_VARS  \\\n\tregister bit_buf_type get_buffer;  \\\n\tregister int bits_left;  \\\n\tbitread_working_state br_state\n\n#define BITREAD_LOAD_STATE(cinfop,permstate)  \\\n\tbr_state.cinfo = cinfop; \\\n\tbr_state.next_input_byte = cinfop->src->next_input_byte; \\\n\tbr_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \\\n\tget_buffer = permstate.get_buffer; \\\n\tbits_left = permstate.bits_left;\n\n#define BITREAD_SAVE_STATE(cinfop,permstate)  \\\n\tcinfop->src->next_input_byte = br_state.next_input_byte; \\\n\tcinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \\\n\tpermstate.get_buffer = get_buffer; \\\n\tpermstate.bits_left = bits_left\n\n/*\n * These macros provide the in-line portion of bit fetching.\n * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer\n * before using GET_BITS, PEEK_BITS, or DROP_BITS.\n * The variables get_buffer and bits_left are assumed to be locals,\n * but the state struct might not be (jpeg_huff_decode needs this).\n *\tCHECK_BIT_BUFFER(state,n,action);\n *\t\tEnsure there are N bits in get_buffer; if suspend, take action.\n *      val = GET_BITS(n);\n *\t\tFetch next N bits.\n *      val = PEEK_BITS(n);\n *\t\tFetch next N bits without removing them from the buffer.\n *\tDROP_BITS(n);\n *\t\tDiscard next N bits.\n * The value N should be a simple variable, not an expression, because it\n * is evaluated multiple times.\n */\n\n#define CHECK_BIT_BUFFER(state,nbits,action) \\\n\t{ if (bits_left < (nbits)) {  \\\n\t    if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits))  \\\n\t      { action; }  \\\n\t    get_buffer = (state).get_buffer; bits_left = (state).bits_left; } }\n\n#define GET_BITS(nbits) \\\n\t(((int) (get_buffer >> (bits_left -= (nbits)))) & BIT_MASK(nbits))\n\n#define PEEK_BITS(nbits) \\\n\t(((int) (get_buffer >> (bits_left -  (nbits)))) & BIT_MASK(nbits))\n\n#define DROP_BITS(nbits) \\\n\t(bits_left -= (nbits))\n\n\n/*\n * Code for extracting next Huffman-coded symbol from input bit stream.\n * Again, this is time-critical and we make the main paths be macros.\n *\n * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits\n * without looping.  Usually, more than 95% of the Huffman codes will be 8\n * or fewer bits long.  The few overlength codes are handled with a loop,\n * which need not be inline code.\n *\n * Notes about the HUFF_DECODE macro:\n * 1. Near the end of the data segment, we may fail to get enough bits\n *    for a lookahead.  In that case, we do it the hard way.\n * 2. If the lookahead table contains no entry, the next code must be\n *    more than HUFF_LOOKAHEAD bits long.\n * 3. jpeg_huff_decode returns -1 if forced to suspend.\n */\n\n#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \\\n{ register int nb, look; \\\n  if (bits_left < HUFF_LOOKAHEAD) { \\\n    if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \\\n    get_buffer = state.get_buffer; bits_left = state.bits_left; \\\n    if (bits_left < HUFF_LOOKAHEAD) { \\\n      nb = 1; goto slowlabel; \\\n    } \\\n  } \\\n  look = PEEK_BITS(HUFF_LOOKAHEAD); \\\n  if ((nb = htbl->look_nbits[look]) != 0) { \\\n    DROP_BITS(nb); \\\n    result = htbl->look_sym[look]; \\\n  } else { \\\n    nb = HUFF_LOOKAHEAD+1; \\\nslowlabel: \\\n    if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \\\n\t{ failaction; } \\\n    get_buffer = state.get_buffer; bits_left = state.bits_left; \\\n  } \\\n}\n\n\n/*\n * Expanded entropy decoder object for Huffman decoding.\n *\n * The savable_state subrecord contains fields that change within an MCU,\n * but must not be updated permanently until we complete the MCU.\n */\n\ntypedef struct {\n  unsigned int EOBRUN;\t\t\t/* remaining EOBs in EOBRUN */\n  int last_dc_val[MAX_COMPS_IN_SCAN];\t/* last DC coef for each component */\n} savable_state;\n\n/* This macro is to work around compilers with missing or broken\n * structure assignment.  You'll need to fix this code if you have\n * such a compiler and you change MAX_COMPS_IN_SCAN.\n */\n\n#ifndef NO_STRUCT_ASSIGN\n#define ASSIGN_STATE(dest,src)  ((dest) = (src))\n#else\n#if MAX_COMPS_IN_SCAN == 4\n#define ASSIGN_STATE(dest,src)  \\\n\t((dest).EOBRUN = (src).EOBRUN, \\\n\t (dest).last_dc_val[0] = (src).last_dc_val[0], \\\n\t (dest).last_dc_val[1] = (src).last_dc_val[1], \\\n\t (dest).last_dc_val[2] = (src).last_dc_val[2], \\\n\t (dest).last_dc_val[3] = (src).last_dc_val[3])\n#endif\n#endif\n\n\ntypedef struct {\n  struct jpeg_entropy_decoder pub; /* public fields */\n\n  /* These fields are loaded into local variables at start of each MCU.\n   * In case of suspension, we exit WITHOUT updating them.\n   */\n  bitread_perm_state bitstate;\t/* Bit buffer at start of MCU */\n  savable_state saved;\t\t/* Other state at start of MCU */\n\n  /* These fields are NOT loaded into local working state. */\n  boolean insufficient_data;\t/* set TRUE after emitting warning */\n  unsigned int restarts_to_go;\t/* MCUs left in this restart interval */\n\n  /* Following two fields used only in progressive mode */\n\n  /* Pointers to derived tables (these workspaces have image lifespan) */\n  d_derived_tbl * derived_tbls[NUM_HUFF_TBLS];\n\n  d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */\n\n  /* Following fields used only in sequential mode */\n\n  /* Pointers to derived tables (these workspaces have image lifespan) */\n  d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];\n  d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];\n\n  /* Precalculated info set up by start_pass for use in decode_mcu: */\n\n  /* Pointers to derived tables to be used for each block within an MCU */\n  d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];\n  d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];\n  /* Whether we care about the DC and AC coefficient values for each block */\n  int coef_limit[D_MAX_BLOCKS_IN_MCU];\n} huff_entropy_decoder;\n\ntypedef huff_entropy_decoder * huff_entropy_ptr;\n\n\nstatic const int jpeg_zigzag_order[8][8] = {\n  {  0,  1,  5,  6, 14, 15, 27, 28 },\n  {  2,  4,  7, 13, 16, 26, 29, 42 },\n  {  3,  8, 12, 17, 25, 30, 41, 43 },\n  {  9, 11, 18, 24, 31, 40, 44, 53 },\n  { 10, 19, 23, 32, 39, 45, 52, 54 },\n  { 20, 22, 33, 38, 46, 51, 55, 60 },\n  { 21, 34, 37, 47, 50, 56, 59, 61 },\n  { 35, 36, 48, 49, 57, 58, 62, 63 }\n};\n\nstatic const int jpeg_zigzag_order7[7][7] = {\n  {  0,  1,  5,  6, 14, 15, 27 },\n  {  2,  4,  7, 13, 16, 26, 28 },\n  {  3,  8, 12, 17, 25, 29, 38 },\n  {  9, 11, 18, 24, 30, 37, 39 },\n  { 10, 19, 23, 31, 36, 40, 45 },\n  { 20, 22, 32, 35, 41, 44, 46 },\n  { 21, 33, 34, 42, 43, 47, 48 }\n};\n\nstatic const int jpeg_zigzag_order6[6][6] = {\n  {  0,  1,  5,  6, 14, 15 },\n  {  2,  4,  7, 13, 16, 25 },\n  {  3,  8, 12, 17, 24, 26 },\n  {  9, 11, 18, 23, 27, 32 },\n  { 10, 19, 22, 28, 31, 33 },\n  { 20, 21, 29, 30, 34, 35 }\n};\n\nstatic const int jpeg_zigzag_order5[5][5] = {\n  {  0,  1,  5,  6, 14 },\n  {  2,  4,  7, 13, 15 },\n  {  3,  8, 12, 16, 21 },\n  {  9, 11, 17, 20, 22 },\n  { 10, 18, 19, 23, 24 }\n};\n\nstatic const int jpeg_zigzag_order4[4][4] = {\n  { 0,  1,  5,  6 },\n  { 2,  4,  7, 12 },\n  { 3,  8, 11, 13 },\n  { 9, 10, 14, 15 }\n};\n\nstatic const int jpeg_zigzag_order3[3][3] = {\n  { 0, 1, 5 },\n  { 2, 4, 6 },\n  { 3, 7, 8 }\n};\n\nstatic const int jpeg_zigzag_order2[2][2] = {\n  { 0, 1 },\n  { 2, 3 }\n};\n\n\n/*\n * Compute the derived values for a Huffman table.\n * This routine also performs some validation checks on the table.\n */\n\nLOCAL(void)\njpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,\n\t\t\t d_derived_tbl ** pdtbl)\n{\n  JHUFF_TBL *htbl;\n  d_derived_tbl *dtbl;\n  int p, i, l, si, numsymbols;\n  int lookbits, ctr;\n  char huffsize[257];\n  unsigned int huffcode[257];\n  unsigned int code;\n\n  /* Note that huffsize[] and huffcode[] are filled in code-length order,\n   * paralleling the order of the symbols themselves in htbl->huffval[].\n   */\n\n  /* Find the input Huffman table */\n  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);\n  htbl =\n    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];\n  if (htbl == NULL)\n    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);\n\n  /* Allocate a workspace if we haven't already done so. */\n  if (*pdtbl == NULL)\n    *pdtbl = (d_derived_tbl *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(d_derived_tbl));\n  dtbl = *pdtbl;\n  dtbl->pub = htbl;\t\t/* fill in back link */\n  \n  /* Figure C.1: make table of Huffman code length for each symbol */\n\n  p = 0;\n  for (l = 1; l <= 16; l++) {\n    i = (int) htbl->bits[l];\n    if (i < 0 || p + i > 256)\t/* protect against table overrun */\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    while (i--)\n      huffsize[p++] = (char) l;\n  }\n  huffsize[p] = 0;\n  numsymbols = p;\n  \n  /* Figure C.2: generate the codes themselves */\n  /* We also validate that the counts represent a legal Huffman code tree. */\n  \n  code = 0;\n  si = huffsize[0];\n  p = 0;\n  while (huffsize[p]) {\n    while (((int) huffsize[p]) == si) {\n      huffcode[p++] = code;\n      code++;\n    }\n    /* code is now 1 more than the last code used for codelength si; but\n     * it must still fit in si bits, since no code is allowed to be all ones.\n     */\n    if (((INT32) code) >= (((INT32) 1) << si))\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    code <<= 1;\n    si++;\n  }\n\n  /* Figure F.15: generate decoding tables for bit-sequential decoding */\n\n  p = 0;\n  for (l = 1; l <= 16; l++) {\n    if (htbl->bits[l]) {\n      /* valoffset[l] = huffval[] index of 1st symbol of code length l,\n       * minus the minimum code of length l\n       */\n      dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];\n      p += htbl->bits[l];\n      dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */\n    } else {\n      dtbl->maxcode[l] = -1;\t/* -1 if no codes of this length */\n    }\n  }\n  dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */\n\n  /* Compute lookahead tables to speed up decoding.\n   * First we set all the table entries to 0, indicating \"too long\";\n   * then we iterate through the Huffman codes that are short enough and\n   * fill in all the entries that correspond to bit sequences starting\n   * with that code.\n   */\n\n  MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));\n\n  p = 0;\n  for (l = 1; l <= HUFF_LOOKAHEAD; l++) {\n    for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {\n      /* l = current code's length, p = its index in huffcode[] & huffval[]. */\n      /* Generate left-justified code followed by all possible bit sequences */\n      lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);\n      for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {\n\tdtbl->look_nbits[lookbits] = l;\n\tdtbl->look_sym[lookbits] = htbl->huffval[p];\n\tlookbits++;\n      }\n    }\n  }\n\n  /* Validate symbols as being reasonable.\n   * For AC tables, we make no check, but accept all byte values 0..255.\n   * For DC tables, we require the symbols to be in range 0..15.\n   * (Tighter bounds could be applied depending on the data depth and mode,\n   * but this is sufficient to ensure safe decoding.)\n   */\n  if (isDC) {\n    for (i = 0; i < numsymbols; i++) {\n      int sym = htbl->huffval[i];\n      if (sym < 0 || sym > 15)\n\tERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n    }\n  }\n}\n\n\n/*\n * Out-of-line code for bit fetching.\n * Note: current values of get_buffer and bits_left are passed as parameters,\n * but are returned in the corresponding fields of the state struct.\n *\n * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width\n * of get_buffer to be used.  (On machines with wider words, an even larger\n * buffer could be used.)  However, on some machines 32-bit shifts are\n * quite slow and take time proportional to the number of places shifted.\n * (This is true with most PC compilers, for instance.)  In this case it may\n * be a win to set MIN_GET_BITS to the minimum value of 15.  This reduces the\n * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.\n */\n\n#ifdef SLOW_SHIFT_32\n#define MIN_GET_BITS  15\t/* minimum allowable value */\n#else\n#define MIN_GET_BITS  (BIT_BUF_SIZE-7)\n#endif\n\n\nLOCAL(boolean)\njpeg_fill_bit_buffer (bitread_working_state * state,\n\t\t      register bit_buf_type get_buffer, register int bits_left,\n\t\t      int nbits)\n/* Load up the bit buffer to a depth of at least nbits */\n{\n  /* Copy heavily used state fields into locals (hopefully registers) */\n  register const JOCTET * next_input_byte = state->next_input_byte;\n  register size_t bytes_in_buffer = state->bytes_in_buffer;\n  j_decompress_ptr cinfo = state->cinfo;\n\n  /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */\n  /* (It is assumed that no request will be for more than that many bits.) */\n  /* We fail to do so only if we hit a marker or are forced to suspend. */\n\n  if (cinfo->unread_marker == 0) {\t/* cannot advance past a marker */\n    while (bits_left < MIN_GET_BITS) {\n      register int c;\n\n      /* Attempt to read a byte */\n      if (bytes_in_buffer == 0) {\n\tif (! (*cinfo->src->fill_input_buffer) (cinfo))\n\t  return FALSE;\n\tnext_input_byte = cinfo->src->next_input_byte;\n\tbytes_in_buffer = cinfo->src->bytes_in_buffer;\n      }\n      bytes_in_buffer--;\n      c = GETJOCTET(*next_input_byte++);\n\n      /* If it's 0xFF, check and discard stuffed zero byte */\n      if (c == 0xFF) {\n\t/* Loop here to discard any padding FF's on terminating marker,\n\t * so that we can save a valid unread_marker value.  NOTE: we will\n\t * accept multiple FF's followed by a 0 as meaning a single FF data\n\t * byte.  This data pattern is not valid according to the standard.\n\t */\n\tdo {\n\t  if (bytes_in_buffer == 0) {\n\t    if (! (*cinfo->src->fill_input_buffer) (cinfo))\n\t      return FALSE;\n\t    next_input_byte = cinfo->src->next_input_byte;\n\t    bytes_in_buffer = cinfo->src->bytes_in_buffer;\n\t  }\n\t  bytes_in_buffer--;\n\t  c = GETJOCTET(*next_input_byte++);\n\t} while (c == 0xFF);\n\n\tif (c == 0) {\n\t  /* Found FF/00, which represents an FF data byte */\n\t  c = 0xFF;\n\t} else {\n\t  /* Oops, it's actually a marker indicating end of compressed data.\n\t   * Save the marker code for later use.\n\t   * Fine point: it might appear that we should save the marker into\n\t   * bitread working state, not straight into permanent state.  But\n\t   * once we have hit a marker, we cannot need to suspend within the\n\t   * current MCU, because we will read no more bytes from the data\n\t   * source.  So it is OK to update permanent state right away.\n\t   */\n\t  cinfo->unread_marker = c;\n\t  /* See if we need to insert some fake zero bits. */\n\t  goto no_more_bytes;\n\t}\n      }\n\n      /* OK, load c into get_buffer */\n      get_buffer = (get_buffer << 8) | c;\n      bits_left += 8;\n    } /* end while */\n  } else {\n  no_more_bytes:\n    /* We get here if we've read the marker that terminates the compressed\n     * data segment.  There should be enough bits in the buffer register\n     * to satisfy the request; if so, no problem.\n     */\n    if (nbits > bits_left) {\n      /* Uh-oh.  Report corrupted data to user and stuff zeroes into\n       * the data stream, so that we can produce some kind of image.\n       * We use a nonvolatile flag to ensure that only one warning message\n       * appears per data segment.\n       */\n      if (! ((huff_entropy_ptr) cinfo->entropy)->insufficient_data) {\n\tWARNMS(cinfo, JWRN_HIT_MARKER);\n\t((huff_entropy_ptr) cinfo->entropy)->insufficient_data = TRUE;\n      }\n      /* Fill the buffer with zero bits */\n      get_buffer <<= MIN_GET_BITS - bits_left;\n      bits_left = MIN_GET_BITS;\n    }\n  }\n\n  /* Unload the local registers */\n  state->next_input_byte = next_input_byte;\n  state->bytes_in_buffer = bytes_in_buffer;\n  state->get_buffer = get_buffer;\n  state->bits_left = bits_left;\n\n  return TRUE;\n}\n\n\n/*\n * Figure F.12: extend sign bit.\n * On some machines, a shift and sub will be faster than a table lookup.\n */\n\n#ifdef AVOID_TABLES\n\n#define BIT_MASK(nbits)   ((1<<(nbits))-1)\n#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) - ((1<<(s))-1) : (x))\n\n#else\n\n#define BIT_MASK(nbits)   bmask[nbits]\n#define HUFF_EXTEND(x,s)  ((x) <= bmask[(s) - 1] ? (x) - bmask[s] : (x))\n\nstatic const int bmask[16] =\t/* bmask[n] is mask for n rightmost bits */\n  { 0, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF,\n    0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF };\n\n#endif /* AVOID_TABLES */\n\n\n/*\n * Out-of-line code for Huffman code decoding.\n */\n\nLOCAL(int)\njpeg_huff_decode (bitread_working_state * state,\n\t\t  register bit_buf_type get_buffer, register int bits_left,\n\t\t  d_derived_tbl * htbl, int min_bits)\n{\n  register int l = min_bits;\n  register INT32 code;\n\n  /* HUFF_DECODE has determined that the code is at least min_bits */\n  /* bits long, so fetch that many bits in one swoop. */\n\n  CHECK_BIT_BUFFER(*state, l, return -1);\n  code = GET_BITS(l);\n\n  /* Collect the rest of the Huffman code one bit at a time. */\n  /* This is per Figure F.16 in the JPEG spec. */\n\n  while (code > htbl->maxcode[l]) {\n    code <<= 1;\n    CHECK_BIT_BUFFER(*state, 1, return -1);\n    code |= GET_BITS(1);\n    l++;\n  }\n\n  /* Unload the local registers */\n  state->get_buffer = get_buffer;\n  state->bits_left = bits_left;\n\n  /* With garbage input we may reach the sentinel value l = 17. */\n\n  if (l > 16) {\n    WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);\n    return 0;\t\t\t/* fake a zero as the safest result */\n  }\n\n  return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];\n}\n\n\n/*\n * Check for a restart marker & resynchronize decoder.\n * Returns FALSE if must suspend.\n */\n\nLOCAL(boolean)\nprocess_restart (j_decompress_ptr cinfo)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int ci;\n\n  /* Throw away any unused bits remaining in bit buffer; */\n  /* include any full bytes in next_marker's count of discarded bytes */\n  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;\n  entropy->bitstate.bits_left = 0;\n\n  /* Advance past the RSTn marker */\n  if (! (*cinfo->marker->read_restart_marker) (cinfo))\n    return FALSE;\n\n  /* Re-initialize DC predictions to 0 */\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++)\n    entropy->saved.last_dc_val[ci] = 0;\n  /* Re-init EOB run count, too */\n  entropy->saved.EOBRUN = 0;\n\n  /* Reset restart counter */\n  entropy->restarts_to_go = cinfo->restart_interval;\n\n  /* Reset out-of-data flag, unless read_restart_marker left us smack up\n   * against a marker.  In that case we will end up treating the next data\n   * segment as empty, and we can avoid producing bogus output pixels by\n   * leaving the flag set.\n   */\n  if (cinfo->unread_marker == 0)\n    entropy->insufficient_data = FALSE;\n\n  return TRUE;\n}\n\n\n/*\n * Huffman MCU decoding.\n * Each of these routines decodes and returns one MCU's worth of\n * Huffman-compressed coefficients. \n * The coefficients are reordered from zigzag order into natural array order,\n * but are not dequantized.\n *\n * The i'th block of the MCU is stored into the block pointed to by\n * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.\n * (Wholesale zeroing is usually a little faster than retail...)\n *\n * We return FALSE if data source requested suspension.  In that case no\n * changes have been made to permanent state.  (Exception: some output\n * coefficients may already have been assigned.  This is harmless for\n * spectral selection, since we'll just re-assign them on the next call.\n * Successive approximation AC refinement has to be more careful, however.)\n */\n\n/*\n * MCU decoding for DC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\ndecode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{   \n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int Al = cinfo->Al;\n  register int s, r;\n  int blkn, ci;\n  JBLOCKROW block;\n  BITREAD_STATE_VARS;\n  savable_state state;\n  d_derived_tbl * tbl;\n  jpeg_component_info * compptr;\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* If we've run out of data, just leave the MCU set to zeroes.\n   * This way, we return uniform gray for the remainder of the segment.\n   */\n  if (! entropy->insufficient_data) {\n\n    /* Load up working state */\n    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(state, entropy->saved);\n\n    /* Outer loop handles each block in the MCU */\n\n    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n      block = MCU_data[blkn];\n      ci = cinfo->MCU_membership[blkn];\n      compptr = cinfo->cur_comp_info[ci];\n      tbl = entropy->derived_tbls[compptr->dc_tbl_no];\n\n      /* Decode a single block's worth of coefficients */\n\n      /* Section F.2.2.1: decode the DC coefficient difference */\n      HUFF_DECODE(s, br_state, tbl, return FALSE, label1);\n      if (s) {\n\tCHECK_BIT_BUFFER(br_state, s, return FALSE);\n\tr = GET_BITS(s);\n\ts = HUFF_EXTEND(r, s);\n      }\n\n      /* Convert DC difference to actual value, update last_dc_val */\n      s += state.last_dc_val[ci];\n      state.last_dc_val[ci] = s;\n      /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */\n      (*block)[0] = (JCOEF) (s << Al);\n    }\n\n    /* Completed MCU, so update state */\n    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(entropy->saved, state);\n  }\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n}\n\n\n/*\n * MCU decoding for AC initial scan (either spectral selection,\n * or first pass of successive approximation).\n */\n\nMETHODDEF(boolean)\ndecode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{   \n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  register int s, k, r;\n  unsigned int EOBRUN;\n  int Se, Al;\n  const int * natural_order;\n  JBLOCKROW block;\n  BITREAD_STATE_VARS;\n  d_derived_tbl * tbl;\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* If we've run out of data, just leave the MCU set to zeroes.\n   * This way, we return uniform gray for the remainder of the segment.\n   */\n  if (! entropy->insufficient_data) {\n\n    Se = cinfo->Se;\n    Al = cinfo->Al;\n    natural_order = cinfo->natural_order;\n\n    /* Load up working state.\n     * We can avoid loading/saving bitread state if in an EOB run.\n     */\n    EOBRUN = entropy->saved.EOBRUN;\t/* only part of saved state we need */\n\n    /* There is always only one block per MCU */\n\n    if (EOBRUN)\t\t\t/* if it's a band of zeroes... */\n      EOBRUN--;\t\t\t/* ...process it now (we do nothing) */\n    else {\n      BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n      block = MCU_data[0];\n      tbl = entropy->ac_derived_tbl;\n\n      for (k = cinfo->Ss; k <= Se; k++) {\n\tHUFF_DECODE(s, br_state, tbl, return FALSE, label2);\n\tr = s >> 4;\n\ts &= 15;\n\tif (s) {\n\t  k += r;\n\t  CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t  r = GET_BITS(s);\n\t  s = HUFF_EXTEND(r, s);\n\t  /* Scale and output coefficient in natural (dezigzagged) order */\n\t  (*block)[natural_order[k]] = (JCOEF) (s << Al);\n\t} else {\n\t  if (r != 15) {\t/* EOBr, run length is 2^r + appended bits */\n\t    if (r) {\t\t/* EOBr, r > 0 */\n\t      EOBRUN = 1 << r;\n\t      CHECK_BIT_BUFFER(br_state, r, return FALSE);\n\t      r = GET_BITS(r);\n\t      EOBRUN += r;\n\t      EOBRUN--;\t\t/* this band is processed at this moment */\n\t    }\n\t    break;\t\t/* force end-of-band */\n\t  }\n\t  k += 15;\t\t/* ZRL: skip 15 zeroes in band */\n\t}\n      }\n\n      BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n    }\n\n    /* Completed MCU, so update state */\n    entropy->saved.EOBRUN = EOBRUN;\t/* only part of saved state we need */\n  }\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n}\n\n\n/*\n * MCU decoding for DC successive approximation refinement scan.\n * Note: we assume such scans can be multi-component, although the spec\n * is not very clear on the point.\n */\n\nMETHODDEF(boolean)\ndecode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{   \n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int p1 = 1 << cinfo->Al;\t/* 1 in the bit position being coded */\n  int blkn;\n  JBLOCKROW block;\n  BITREAD_STATE_VARS;\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* Not worth the cycles to check insufficient_data here,\n   * since we will not change the data anyway if we read zeroes.\n   */\n\n  /* Load up working state */\n  BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n\n  /* Outer loop handles each block in the MCU */\n\n  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n    block = MCU_data[blkn];\n\n    /* Encoded data is simply the next bit of the two's-complement DC value */\n    CHECK_BIT_BUFFER(br_state, 1, return FALSE);\n    if (GET_BITS(1))\n      (*block)[0] |= p1;\n    /* Note: since we use |=, repeating the assignment later is safe */\n  }\n\n  /* Completed MCU, so update state */\n  BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n}\n\n\n/*\n * MCU decoding for AC successive approximation refinement scan.\n */\n\nMETHODDEF(boolean)\ndecode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{   \n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  register int s, k, r;\n  unsigned int EOBRUN;\n  int Se, p1, m1;\n  const int * natural_order;\n  JBLOCKROW block;\n  JCOEFPTR thiscoef;\n  BITREAD_STATE_VARS;\n  d_derived_tbl * tbl;\n  int num_newnz;\n  int newnz_pos[DCTSIZE2];\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* If we've run out of data, don't modify the MCU.\n   */\n  if (! entropy->insufficient_data) {\n\n    Se = cinfo->Se;\n    p1 = 1 << cinfo->Al;\t/* 1 in the bit position being coded */\n    m1 = (-1) << cinfo->Al;\t/* -1 in the bit position being coded */\n    natural_order = cinfo->natural_order;\n\n    /* Load up working state */\n    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n    EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */\n\n    /* There is always only one block per MCU */\n    block = MCU_data[0];\n    tbl = entropy->ac_derived_tbl;\n\n    /* If we are forced to suspend, we must undo the assignments to any newly\n     * nonzero coefficients in the block, because otherwise we'd get confused\n     * next time about which coefficients were already nonzero.\n     * But we need not undo addition of bits to already-nonzero coefficients;\n     * instead, we can test the current bit to see if we already did it.\n     */\n    num_newnz = 0;\n\n    /* initialize coefficient loop counter to start of band */\n    k = cinfo->Ss;\n\n    if (EOBRUN == 0) {\n      do {\n\tHUFF_DECODE(s, br_state, tbl, goto undoit, label3);\n\tr = s >> 4;\n\ts &= 15;\n\tif (s) {\n\t  if (s != 1)\t\t/* size of new coef should always be 1 */\n\t    WARNMS(cinfo, JWRN_HUFF_BAD_CODE);\n\t  CHECK_BIT_BUFFER(br_state, 1, goto undoit);\n\t  if (GET_BITS(1))\n\t    s = p1;\t\t/* newly nonzero coef is positive */\n\t  else\n\t    s = m1;\t\t/* newly nonzero coef is negative */\n\t} else {\n\t  if (r != 15) {\n\t    EOBRUN = 1 << r;\t/* EOBr, run length is 2^r + appended bits */\n\t    if (r) {\n\t      CHECK_BIT_BUFFER(br_state, r, goto undoit);\n\t      r = GET_BITS(r);\n\t      EOBRUN += r;\n\t    }\n\t    break;\t\t/* rest of block is handled by EOB logic */\n\t  }\n\t  /* note s = 0 for processing ZRL */\n\t}\n\t/* Advance over already-nonzero coefs and r still-zero coefs,\n\t * appending correction bits to the nonzeroes.  A correction bit is 1\n\t * if the absolute value of the coefficient must be increased.\n\t */\n\tdo {\n\t  thiscoef = *block + natural_order[k];\n\t  if (*thiscoef) {\n\t    CHECK_BIT_BUFFER(br_state, 1, goto undoit);\n\t    if (GET_BITS(1)) {\n\t      if ((*thiscoef & p1) == 0) { /* do nothing if already set it */\n\t\tif (*thiscoef >= 0)\n\t\t  *thiscoef += p1;\n\t\telse\n\t\t  *thiscoef += m1;\n\t      }\n\t    }\n\t  } else {\n\t    if (--r < 0)\n\t      break;\t\t/* reached target zero coefficient */\n\t  }\n\t  k++;\n\t} while (k <= Se);\n\tif (s) {\n\t  int pos = natural_order[k];\n\t  /* Output newly nonzero coefficient */\n\t  (*block)[pos] = (JCOEF) s;\n\t  /* Remember its position in case we have to suspend */\n\t  newnz_pos[num_newnz++] = pos;\n\t}\n\tk++;\n      } while (k <= Se);\n    }\n\n    if (EOBRUN) {\n      /* Scan any remaining coefficient positions after the end-of-band\n       * (the last newly nonzero coefficient, if any).  Append a correction\n       * bit to each already-nonzero coefficient.  A correction bit is 1\n       * if the absolute value of the coefficient must be increased.\n       */\n      do {\n\tthiscoef = *block + natural_order[k];\n\tif (*thiscoef) {\n\t  CHECK_BIT_BUFFER(br_state, 1, goto undoit);\n\t  if (GET_BITS(1)) {\n\t    if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */\n\t      if (*thiscoef >= 0)\n\t\t*thiscoef += p1;\n\t      else\n\t\t*thiscoef += m1;\n\t    }\n\t  }\n\t}\n\tk++;\n      } while (k <= Se);\n      /* Count one block completed in EOB run */\n      EOBRUN--;\n    }\n\n    /* Completed MCU, so update state */\n    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n    entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */\n  }\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n\nundoit:\n  /* Re-zero any output coefficients that we made newly nonzero */\n  while (num_newnz)\n    (*block)[newnz_pos[--num_newnz]] = 0;\n\n  return FALSE;\n}\n\n\n/*\n * Decode one MCU's worth of Huffman-compressed coefficients,\n * partial blocks.\n */\n\nMETHODDEF(boolean)\ndecode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  const int * natural_order;\n  int Se, blkn;\n  BITREAD_STATE_VARS;\n  savable_state state;\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* If we've run out of data, just leave the MCU set to zeroes.\n   * This way, we return uniform gray for the remainder of the segment.\n   */\n  if (! entropy->insufficient_data) {\n\n    natural_order = cinfo->natural_order;\n    Se = cinfo->lim_Se;\n\n    /* Load up working state */\n    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(state, entropy->saved);\n\n    /* Outer loop handles each block in the MCU */\n\n    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n      JBLOCKROW block = MCU_data[blkn];\n      d_derived_tbl * htbl;\n      register int s, k, r;\n      int coef_limit, ci;\n\n      /* Decode a single block's worth of coefficients */\n\n      /* Section F.2.2.1: decode the DC coefficient difference */\n      htbl = entropy->dc_cur_tbls[blkn];\n      HUFF_DECODE(s, br_state, htbl, return FALSE, label1);\n\n      htbl = entropy->ac_cur_tbls[blkn];\n      k = 1;\n      coef_limit = entropy->coef_limit[blkn];\n      if (coef_limit) {\n\t/* Convert DC difference to actual value, update last_dc_val */\n\tif (s) {\n\t  CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t  r = GET_BITS(s);\n\t  s = HUFF_EXTEND(r, s);\n\t}\n\tci = cinfo->MCU_membership[blkn];\n\ts += state.last_dc_val[ci];\n\tstate.last_dc_val[ci] = s;\n\t/* Output the DC coefficient */\n\t(*block)[0] = (JCOEF) s;\n\n\t/* Section F.2.2.2: decode the AC coefficients */\n\t/* Since zeroes are skipped, output area must be cleared beforehand */\n\tfor (; k < coef_limit; k++) {\n\t  HUFF_DECODE(s, br_state, htbl, return FALSE, label2);\n\n\t  r = s >> 4;\n\t  s &= 15;\n\n\t  if (s) {\n\t    k += r;\n\t    CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t    r = GET_BITS(s);\n\t    s = HUFF_EXTEND(r, s);\n\t    /* Output coefficient in natural (dezigzagged) order.\n\t     * Note: the extra entries in natural_order[] will save us\n\t     * if k > Se, which could happen if the data is corrupted.\n\t     */\n\t    (*block)[natural_order[k]] = (JCOEF) s;\n\t  } else {\n\t    if (r != 15)\n\t      goto EndOfBlock;\n\t    k += 15;\n\t  }\n\t}\n      } else {\n\tif (s) {\n\t  CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t  DROP_BITS(s);\n\t}\n      }\n\n      /* Section F.2.2.2: decode the AC coefficients */\n      /* In this path we just discard the values */\n      for (; k <= Se; k++) {\n\tHUFF_DECODE(s, br_state, htbl, return FALSE, label3);\n\n\tr = s >> 4;\n\ts &= 15;\n\n\tif (s) {\n\t  k += r;\n\t  CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t  DROP_BITS(s);\n\t} else {\n\t  if (r != 15)\n\t    break;\n\t  k += 15;\n\t}\n      }\n\n      EndOfBlock: ;\n    }\n\n    /* Completed MCU, so update state */\n    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(entropy->saved, state);\n  }\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n}\n\n\n/*\n * Decode one MCU's worth of Huffman-compressed coefficients,\n * full-size blocks.\n */\n\nMETHODDEF(boolean)\ndecode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int blkn;\n  BITREAD_STATE_VARS;\n  savable_state state;\n\n  /* Process restart marker if needed; may have to suspend */\n  if (cinfo->restart_interval) {\n    if (entropy->restarts_to_go == 0)\n      if (! process_restart(cinfo))\n\treturn FALSE;\n  }\n\n  /* If we've run out of data, just leave the MCU set to zeroes.\n   * This way, we return uniform gray for the remainder of the segment.\n   */\n  if (! entropy->insufficient_data) {\n\n    /* Load up working state */\n    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(state, entropy->saved);\n\n    /* Outer loop handles each block in the MCU */\n\n    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n      JBLOCKROW block = MCU_data[blkn];\n      d_derived_tbl * htbl;\n      register int s, k, r;\n      int coef_limit, ci;\n\n      /* Decode a single block's worth of coefficients */\n\n      /* Section F.2.2.1: decode the DC coefficient difference */\n      htbl = entropy->dc_cur_tbls[blkn];\n      HUFF_DECODE(s, br_state, htbl, return FALSE, label1);\n\n      htbl = entropy->ac_cur_tbls[blkn];\n      k = 1;\n      coef_limit = entropy->coef_limit[blkn];\n      if (coef_limit) {\n\t/* Convert DC difference to actual value, update last_dc_val */\n\tif (s) {\n\t  CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t  r = GET_BITS(s);\n\t  s = HUFF_EXTEND(r, s);\n\t}\n\tci = cinfo->MCU_membership[blkn];\n\ts += state.last_dc_val[ci];\n\tstate.last_dc_val[ci] = s;\n\t/* Output the DC coefficient */\n\t(*block)[0] = (JCOEF) s;\n\n\t/* Section F.2.2.2: decode the AC coefficients */\n\t/* Since zeroes are skipped, output area must be cleared beforehand */\n\tfor (; k < coef_limit; k++) {\n\t  HUFF_DECODE(s, br_state, htbl, return FALSE, label2);\n\n\t  r = s >> 4;\n\t  s &= 15;\n\n\t  if (s) {\n\t    k += r;\n\t    CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t    r = GET_BITS(s);\n\t    s = HUFF_EXTEND(r, s);\n\t    /* Output coefficient in natural (dezigzagged) order.\n\t     * Note: the extra entries in jpeg_natural_order[] will save us\n\t     * if k >= DCTSIZE2, which could happen if the data is corrupted.\n\t     */\n\t    (*block)[jpeg_natural_order[k]] = (JCOEF) s;\n\t  } else {\n\t    if (r != 15)\n\t      goto EndOfBlock;\n\t    k += 15;\n\t  }\n\t}\n      } else {\n\tif (s) {\n\t  CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t  DROP_BITS(s);\n\t}\n      }\n\n      /* Section F.2.2.2: decode the AC coefficients */\n      /* In this path we just discard the values */\n      for (; k < DCTSIZE2; k++) {\n\tHUFF_DECODE(s, br_state, htbl, return FALSE, label3);\n\n\tr = s >> 4;\n\ts &= 15;\n\n\tif (s) {\n\t  k += r;\n\t  CHECK_BIT_BUFFER(br_state, s, return FALSE);\n\t  DROP_BITS(s);\n\t} else {\n\t  if (r != 15)\n\t    break;\n\t  k += 15;\n\t}\n      }\n\n      EndOfBlock: ;\n    }\n\n    /* Completed MCU, so update state */\n    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);\n    ASSIGN_STATE(entropy->saved, state);\n  }\n\n  /* Account for restart interval (no-op if not using restarts) */\n  entropy->restarts_to_go--;\n\n  return TRUE;\n}\n\n\n/*\n * Initialize for a Huffman-compressed scan.\n */\n\nMETHODDEF(void)\nstart_pass_huff_decoder (j_decompress_ptr cinfo)\n{\n  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;\n  int ci, blkn, tbl, i;\n  jpeg_component_info * compptr;\n\n  if (cinfo->progressive_mode) {\n    /* Validate progressive scan parameters */\n    if (cinfo->Ss == 0) {\n      if (cinfo->Se != 0)\n\tgoto bad;\n    } else {\n      /* need not check Ss/Se < 0 since they came from unsigned bytes */\n      if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se)\n\tgoto bad;\n      /* AC scans may have only one component */\n      if (cinfo->comps_in_scan != 1)\n\tgoto bad;\n    }\n    if (cinfo->Ah != 0) {\n      /* Successive approximation refinement scan: must have Al = Ah-1. */\n      if (cinfo->Ah-1 != cinfo->Al)\n\tgoto bad;\n    }\n    if (cinfo->Al > 13) {\t/* need not check for < 0 */\n      /* Arguably the maximum Al value should be less than 13 for 8-bit precision,\n       * but the spec doesn't say so, and we try to be liberal about what we\n       * accept.  Note: large Al values could result in out-of-range DC\n       * coefficients during early scans, leading to bizarre displays due to\n       * overflows in the IDCT math.  But we won't crash.\n       */\n      bad:\n      ERREXIT4(cinfo, JERR_BAD_PROGRESSION,\n\t       cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);\n    }\n    /* Update progression status, and verify that scan order is legal.\n     * Note that inter-scan inconsistencies are treated as warnings\n     * not fatal errors ... not clear if this is right way to behave.\n     */\n    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n      int coefi, cindex = cinfo->cur_comp_info[ci]->component_index;\n      int *coef_bit_ptr = & cinfo->coef_bits[cindex][0];\n      if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */\n\tWARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);\n      for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {\n\tint expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];\n\tif (cinfo->Ah != expected)\n\t  WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);\n\tcoef_bit_ptr[coefi] = cinfo->Al;\n      }\n    }\n\n    /* Select MCU decoding routine */\n    if (cinfo->Ah == 0) {\n      if (cinfo->Ss == 0)\n\tentropy->pub.decode_mcu = decode_mcu_DC_first;\n      else\n\tentropy->pub.decode_mcu = decode_mcu_AC_first;\n    } else {\n      if (cinfo->Ss == 0)\n\tentropy->pub.decode_mcu = decode_mcu_DC_refine;\n      else\n\tentropy->pub.decode_mcu = decode_mcu_AC_refine;\n    }\n\n    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n      compptr = cinfo->cur_comp_info[ci];\n      /* Make sure requested tables are present, and compute derived tables.\n       * We may build same derived table more than once, but it's not expensive.\n       */\n      if (cinfo->Ss == 0) {\n\tif (cinfo->Ah == 0) {\t/* DC refinement needs no table */\n\t  tbl = compptr->dc_tbl_no;\n\t  jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,\n\t\t\t\t  & entropy->derived_tbls[tbl]);\n\t}\n      } else {\n\ttbl = compptr->ac_tbl_no;\n\tjpeg_make_d_derived_tbl(cinfo, FALSE, tbl,\n\t\t\t\t& entropy->derived_tbls[tbl]);\n\t/* remember the single active table */\n\tentropy->ac_derived_tbl = entropy->derived_tbls[tbl];\n      }\n      /* Initialize DC predictions to 0 */\n      entropy->saved.last_dc_val[ci] = 0;\n    }\n\n    /* Initialize private state variables */\n    entropy->saved.EOBRUN = 0;\n  } else {\n    /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.\n     * This ought to be an error condition, but we make it a warning because\n     * there are some baseline files out there with all zeroes in these bytes.\n     */\n    if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 ||\n\t((cinfo->is_baseline || cinfo->Se < DCTSIZE2) &&\n\tcinfo->Se != cinfo->lim_Se))\n      WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);\n\n    /* Select MCU decoding routine */\n    /* We retain the hard-coded case for full-size blocks.\n     * This is not necessary, but it appears that this version is slightly\n     * more performant in the given implementation.\n     * With an improved implementation we would prefer a single optimized\n     * function.\n     */\n    if (cinfo->lim_Se != DCTSIZE2-1)\n      entropy->pub.decode_mcu = decode_mcu_sub;\n    else\n      entropy->pub.decode_mcu = decode_mcu;\n\n    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n      compptr = cinfo->cur_comp_info[ci];\n      /* Compute derived values for Huffman tables */\n      /* We may do this more than once for a table, but it's not expensive */\n      tbl = compptr->dc_tbl_no;\n      jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,\n\t\t\t      & entropy->dc_derived_tbls[tbl]);\n      if (cinfo->lim_Se) {\t/* AC needs no table when not present */\n\ttbl = compptr->ac_tbl_no;\n\tjpeg_make_d_derived_tbl(cinfo, FALSE, tbl,\n\t\t\t\t& entropy->ac_derived_tbls[tbl]);\n      }\n      /* Initialize DC predictions to 0 */\n      entropy->saved.last_dc_val[ci] = 0;\n    }\n\n    /* Precalculate decoding info for each block in an MCU of this scan */\n    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {\n      ci = cinfo->MCU_membership[blkn];\n      compptr = cinfo->cur_comp_info[ci];\n      /* Precalculate which table to use for each block */\n      entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];\n      entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];\n      /* Decide whether we really care about the coefficient values */\n      if (compptr->component_needed) {\n\tci = compptr->DCT_v_scaled_size;\n\ti = compptr->DCT_h_scaled_size;\n\tswitch (cinfo->lim_Se) {\n\tcase (1*1-1):\n\t  entropy->coef_limit[blkn] = 1;\n\t  break;\n\tcase (2*2-1):\n\t  if (ci <= 0 || ci > 2) ci = 2;\n\t  if (i <= 0 || i > 2) i = 2;\n\t  entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order2[ci - 1][i - 1];\n\t  break;\n\tcase (3*3-1):\n\t  if (ci <= 0 || ci > 3) ci = 3;\n\t  if (i <= 0 || i > 3) i = 3;\n\t  entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order3[ci - 1][i - 1];\n\t  break;\n\tcase (4*4-1):\n\t  if (ci <= 0 || ci > 4) ci = 4;\n\t  if (i <= 0 || i > 4) i = 4;\n\t  entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order4[ci - 1][i - 1];\n\t  break;\n\tcase (5*5-1):\n\t  if (ci <= 0 || ci > 5) ci = 5;\n\t  if (i <= 0 || i > 5) i = 5;\n\t  entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order5[ci - 1][i - 1];\n\t  break;\n\tcase (6*6-1):\n\t  if (ci <= 0 || ci > 6) ci = 6;\n\t  if (i <= 0 || i > 6) i = 6;\n\t  entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order6[ci - 1][i - 1];\n\t  break;\n\tcase (7*7-1):\n\t  if (ci <= 0 || ci > 7) ci = 7;\n\t  if (i <= 0 || i > 7) i = 7;\n\t  entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order7[ci - 1][i - 1];\n\t  break;\n\tdefault:\n\t  if (ci <= 0 || ci > 8) ci = 8;\n\t  if (i <= 0 || i > 8) i = 8;\n\t  entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1];\n\t  break;\n\t}\n      } else {\n\tentropy->coef_limit[blkn] = 0;\n      }\n    }\n  }\n\n  /* Initialize bitread state variables */\n  entropy->bitstate.bits_left = 0;\n  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */\n  entropy->insufficient_data = FALSE;\n\n  /* Initialize restart counter */\n  entropy->restarts_to_go = cinfo->restart_interval;\n}\n\n\n/*\n * Module initialization routine for Huffman entropy decoding.\n */\n\nGLOBAL(void)\njinit_huff_decoder (j_decompress_ptr cinfo)\n{\n  huff_entropy_ptr entropy;\n  int i;\n\n  entropy = (huff_entropy_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(huff_entropy_decoder));\n  cinfo->entropy = &entropy->pub;\n  entropy->pub.start_pass = start_pass_huff_decoder;\n\n  if (cinfo->progressive_mode) {\n    /* Create progression status table */\n    int *coef_bit_ptr, ci;\n    cinfo->coef_bits = (int (*)[DCTSIZE2])\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  cinfo->num_components*DCTSIZE2*SIZEOF(int));\n    coef_bit_ptr = & cinfo->coef_bits[0][0];\n    for (ci = 0; ci < cinfo->num_components; ci++)\n      for (i = 0; i < DCTSIZE2; i++)\n\t*coef_bit_ptr++ = -1;\n\n    /* Mark derived tables unallocated */\n    for (i = 0; i < NUM_HUFF_TBLS; i++) {\n      entropy->derived_tbls[i] = NULL;\n    }\n  } else {\n    /* Mark tables unallocated */\n    for (i = 0; i < NUM_HUFF_TBLS; i++) {\n      entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;\n    }\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdinput.c",
    "content": "/*\n * jdinput.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 2002-2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains input control logic for the JPEG decompressor.\n * These routines are concerned with controlling the decompressor's input\n * processing (marker reading and coefficient decoding).  The actual input\n * reading is done in jdmarker.c, jdhuff.c, and jdarith.c.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private state */\n\ntypedef struct {\n  struct jpeg_input_controller pub; /* public fields */\n\n  int inheaders;\t\t/* Nonzero until first SOS is reached */\n} my_input_controller;\n\ntypedef my_input_controller * my_inputctl_ptr;\n\n\n/* Forward declarations */\nMETHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));\n\n\n/*\n * Routines to calculate various quantities related to the size of the image.\n */\n\n\n/*\n * Compute output image dimensions and related values.\n * NOTE: this is exported for possible use by application.\n * Hence it mustn't do anything that can't be done twice.\n */\n\nGLOBAL(void)\njpeg_core_output_dimensions (j_decompress_ptr cinfo)\n/* Do computations that are needed before master selection phase.\n * This function is used for transcoding and full decompression.\n */\n{\n#ifdef IDCT_SCALING_SUPPORTED\n  int ci;\n  jpeg_component_info *compptr;\n\n  /* Compute actual output image dimensions and DCT scaling choices. */\n  if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom) {\n    /* Provide 1/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 1;\n    cinfo->min_DCT_v_scaled_size = 1;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 2) {\n    /* Provide 2/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 2L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 2L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 2;\n    cinfo->min_DCT_v_scaled_size = 2;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 3) {\n    /* Provide 3/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 3L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 3L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 3;\n    cinfo->min_DCT_v_scaled_size = 3;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 4) {\n    /* Provide 4/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 4L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 4L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 4;\n    cinfo->min_DCT_v_scaled_size = 4;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 5) {\n    /* Provide 5/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 5L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 5L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 5;\n    cinfo->min_DCT_v_scaled_size = 5;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 6) {\n    /* Provide 6/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 6L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 6L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 6;\n    cinfo->min_DCT_v_scaled_size = 6;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 7) {\n    /* Provide 7/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 7L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 7L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 7;\n    cinfo->min_DCT_v_scaled_size = 7;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 8) {\n    /* Provide 8/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 8L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 8L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 8;\n    cinfo->min_DCT_v_scaled_size = 8;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 9) {\n    /* Provide 9/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 9L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 9L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 9;\n    cinfo->min_DCT_v_scaled_size = 9;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 10) {\n    /* Provide 10/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 10L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 10L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 10;\n    cinfo->min_DCT_v_scaled_size = 10;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 11) {\n    /* Provide 11/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 11L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 11L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 11;\n    cinfo->min_DCT_v_scaled_size = 11;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 12) {\n    /* Provide 12/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 12L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 12L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 12;\n    cinfo->min_DCT_v_scaled_size = 12;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 13) {\n    /* Provide 13/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 13L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 13L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 13;\n    cinfo->min_DCT_v_scaled_size = 13;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 14) {\n    /* Provide 14/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 14L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 14L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 14;\n    cinfo->min_DCT_v_scaled_size = 14;\n  } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 15) {\n    /* Provide 15/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 15L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 15L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 15;\n    cinfo->min_DCT_v_scaled_size = 15;\n  } else {\n    /* Provide 16/block_size scaling */\n    cinfo->output_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * 16L, (long) cinfo->block_size);\n    cinfo->output_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * 16L, (long) cinfo->block_size);\n    cinfo->min_DCT_h_scaled_size = 16;\n    cinfo->min_DCT_v_scaled_size = 16;\n  }\n\n  /* Recompute dimensions of components */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size;\n    compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size;\n  }\n\n#else /* !IDCT_SCALING_SUPPORTED */\n\n  /* Hardwire it to \"no scaling\" */\n  cinfo->output_width = cinfo->image_width;\n  cinfo->output_height = cinfo->image_height;\n  /* jdinput.c has already initialized DCT_scaled_size,\n   * and has computed unscaled downsampled_width and downsampled_height.\n   */\n\n#endif /* IDCT_SCALING_SUPPORTED */\n}\n\n\nLOCAL(void)\ninitial_setup (j_decompress_ptr cinfo)\n/* Called once, when first SOS marker is reached */\n{\n  int ci;\n  jpeg_component_info *compptr;\n\n  /* Make sure image isn't bigger than I can handle */\n  if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||\n      (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)\n    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);\n\n  /* For now, precision must match compiled-in value... */\n  if (cinfo->data_precision != BITS_IN_JSAMPLE)\n    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);\n\n  /* Check that number of components won't exceed internal array sizes */\n  if (cinfo->num_components > MAX_COMPONENTS)\n    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,\n\t     MAX_COMPONENTS);\n\n  /* Compute maximum sampling factors; check factor validity */\n  cinfo->max_h_samp_factor = 1;\n  cinfo->max_v_samp_factor = 1;\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||\n\tcompptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)\n      ERREXIT(cinfo, JERR_BAD_SAMPLING);\n    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,\n\t\t\t\t   compptr->h_samp_factor);\n    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,\n\t\t\t\t   compptr->v_samp_factor);\n  }\n\n  /* Derive block_size, natural_order, and lim_Se */\n  if (cinfo->is_baseline || (cinfo->progressive_mode &&\n      cinfo->comps_in_scan)) { /* no pseudo SOS marker */\n    cinfo->block_size = DCTSIZE;\n    cinfo->natural_order = jpeg_natural_order;\n    cinfo->lim_Se = DCTSIZE2-1;\n  } else\n    switch (cinfo->Se) {\n    case (1*1-1):\n      cinfo->block_size = 1;\n      cinfo->natural_order = jpeg_natural_order; /* not needed */\n      cinfo->lim_Se = cinfo->Se;\n      break;\n    case (2*2-1):\n      cinfo->block_size = 2;\n      cinfo->natural_order = jpeg_natural_order2;\n      cinfo->lim_Se = cinfo->Se;\n      break;\n    case (3*3-1):\n      cinfo->block_size = 3;\n      cinfo->natural_order = jpeg_natural_order3;\n      cinfo->lim_Se = cinfo->Se;\n      break;\n    case (4*4-1):\n      cinfo->block_size = 4;\n      cinfo->natural_order = jpeg_natural_order4;\n      cinfo->lim_Se = cinfo->Se;\n      break;\n    case (5*5-1):\n      cinfo->block_size = 5;\n      cinfo->natural_order = jpeg_natural_order5;\n      cinfo->lim_Se = cinfo->Se;\n      break;\n    case (6*6-1):\n      cinfo->block_size = 6;\n      cinfo->natural_order = jpeg_natural_order6;\n      cinfo->lim_Se = cinfo->Se;\n      break;\n    case (7*7-1):\n      cinfo->block_size = 7;\n      cinfo->natural_order = jpeg_natural_order7;\n      cinfo->lim_Se = cinfo->Se;\n      break;\n    case (8*8-1):\n      cinfo->block_size = 8;\n      cinfo->natural_order = jpeg_natural_order;\n      cinfo->lim_Se = DCTSIZE2-1;\n      break;\n    case (9*9-1):\n      cinfo->block_size = 9;\n      cinfo->natural_order = jpeg_natural_order;\n      cinfo->lim_Se = DCTSIZE2-1;\n      break;\n    case (10*10-1):\n      cinfo->block_size = 10;\n      cinfo->natural_order = jpeg_natural_order;\n      cinfo->lim_Se = DCTSIZE2-1;\n      break;\n    case (11*11-1):\n      cinfo->block_size = 11;\n      cinfo->natural_order = jpeg_natural_order;\n      cinfo->lim_Se = DCTSIZE2-1;\n      break;\n    case (12*12-1):\n      cinfo->block_size = 12;\n      cinfo->natural_order = jpeg_natural_order;\n      cinfo->lim_Se = DCTSIZE2-1;\n      break;\n    case (13*13-1):\n      cinfo->block_size = 13;\n      cinfo->natural_order = jpeg_natural_order;\n      cinfo->lim_Se = DCTSIZE2-1;\n      break;\n    case (14*14-1):\n      cinfo->block_size = 14;\n      cinfo->natural_order = jpeg_natural_order;\n      cinfo->lim_Se = DCTSIZE2-1;\n      break;\n    case (15*15-1):\n      cinfo->block_size = 15;\n      cinfo->natural_order = jpeg_natural_order;\n      cinfo->lim_Se = DCTSIZE2-1;\n      break;\n    case (16*16-1):\n      cinfo->block_size = 16;\n      cinfo->natural_order = jpeg_natural_order;\n      cinfo->lim_Se = DCTSIZE2-1;\n      break;\n    default:\n      ERREXIT4(cinfo, JERR_BAD_PROGRESSION,\n\t       cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);\n      break;\n    }\n\n  /* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size.\n   * In the full decompressor,\n   * this will be overridden by jpeg_calc_output_dimensions in jdmaster.c;\n   * but in the transcoder,\n   * jpeg_calc_output_dimensions is not used, so we must do it here.\n   */\n  cinfo->min_DCT_h_scaled_size = cinfo->block_size;\n  cinfo->min_DCT_v_scaled_size = cinfo->block_size;\n\n  /* Compute dimensions of components */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    compptr->DCT_h_scaled_size = cinfo->block_size;\n    compptr->DCT_v_scaled_size = cinfo->block_size;\n    /* Size in DCT blocks */\n    compptr->width_in_blocks = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,\n\t\t    (long) (cinfo->max_h_samp_factor * cinfo->block_size));\n    compptr->height_in_blocks = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,\n\t\t    (long) (cinfo->max_v_samp_factor * cinfo->block_size));\n    /* downsampled_width and downsampled_height will also be overridden by\n     * jdmaster.c if we are doing full decompression.  The transcoder library\n     * doesn't use these values, but the calling application might.\n     */\n    /* Size in samples */\n    compptr->downsampled_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,\n\t\t    (long) cinfo->max_h_samp_factor);\n    compptr->downsampled_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,\n\t\t    (long) cinfo->max_v_samp_factor);\n    /* Mark component needed, until color conversion says otherwise */\n    compptr->component_needed = TRUE;\n    /* Mark no quantization table yet saved for component */\n    compptr->quant_table = NULL;\n  }\n\n  /* Compute number of fully interleaved MCU rows. */\n  cinfo->total_iMCU_rows = (JDIMENSION)\n    jdiv_round_up((long) cinfo->image_height,\n\t          (long) (cinfo->max_v_samp_factor * cinfo->block_size));\n\n  /* Decide whether file contains multiple scans */\n  if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)\n    cinfo->inputctl->has_multiple_scans = TRUE;\n  else\n    cinfo->inputctl->has_multiple_scans = FALSE;\n}\n\n\nLOCAL(void)\nper_scan_setup (j_decompress_ptr cinfo)\n/* Do computations that are needed before processing a JPEG scan */\n/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */\n{\n  int ci, mcublks, tmp;\n  jpeg_component_info *compptr;\n  \n  if (cinfo->comps_in_scan == 1) {\n    \n    /* Noninterleaved (single-component) scan */\n    compptr = cinfo->cur_comp_info[0];\n    \n    /* Overall image size in MCUs */\n    cinfo->MCUs_per_row = compptr->width_in_blocks;\n    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;\n    \n    /* For noninterleaved scan, always one block per MCU */\n    compptr->MCU_width = 1;\n    compptr->MCU_height = 1;\n    compptr->MCU_blocks = 1;\n    compptr->MCU_sample_width = compptr->DCT_h_scaled_size;\n    compptr->last_col_width = 1;\n    /* For noninterleaved scans, it is convenient to define last_row_height\n     * as the number of block rows present in the last iMCU row.\n     */\n    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);\n    if (tmp == 0) tmp = compptr->v_samp_factor;\n    compptr->last_row_height = tmp;\n    \n    /* Prepare array describing MCU composition */\n    cinfo->blocks_in_MCU = 1;\n    cinfo->MCU_membership[0] = 0;\n    \n  } else {\n    \n    /* Interleaved (multi-component) scan */\n    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)\n      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,\n\t       MAX_COMPS_IN_SCAN);\n    \n    /* Overall image size in MCUs */\n    cinfo->MCUs_per_row = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width,\n\t\t    (long) (cinfo->max_h_samp_factor * cinfo->block_size));\n    cinfo->MCU_rows_in_scan = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height,\n\t\t    (long) (cinfo->max_v_samp_factor * cinfo->block_size));\n    \n    cinfo->blocks_in_MCU = 0;\n    \n    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n      compptr = cinfo->cur_comp_info[ci];\n      /* Sampling factors give # of blocks of component in each MCU */\n      compptr->MCU_width = compptr->h_samp_factor;\n      compptr->MCU_height = compptr->v_samp_factor;\n      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;\n      compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size;\n      /* Figure number of non-dummy blocks in last MCU column & row */\n      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);\n      if (tmp == 0) tmp = compptr->MCU_width;\n      compptr->last_col_width = tmp;\n      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);\n      if (tmp == 0) tmp = compptr->MCU_height;\n      compptr->last_row_height = tmp;\n      /* Prepare array describing MCU composition */\n      mcublks = compptr->MCU_blocks;\n      if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU)\n\tERREXIT(cinfo, JERR_BAD_MCU_SIZE);\n      while (mcublks-- > 0) {\n\tcinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;\n      }\n    }\n    \n  }\n}\n\n\n/*\n * Save away a copy of the Q-table referenced by each component present\n * in the current scan, unless already saved during a prior scan.\n *\n * In a multiple-scan JPEG file, the encoder could assign different components\n * the same Q-table slot number, but change table definitions between scans\n * so that each component uses a different Q-table.  (The IJG encoder is not\n * currently capable of doing this, but other encoders might.)  Since we want\n * to be able to dequantize all the components at the end of the file, this\n * means that we have to save away the table actually used for each component.\n * We do this by copying the table at the start of the first scan containing\n * the component.\n * The JPEG spec prohibits the encoder from changing the contents of a Q-table\n * slot between scans of a component using that slot.  If the encoder does so\n * anyway, this decoder will simply use the Q-table values that were current\n * at the start of the first scan for the component.\n *\n * The decompressor output side looks only at the saved quant tables,\n * not at the current Q-table slots.\n */\n\nLOCAL(void)\nlatch_quant_tables (j_decompress_ptr cinfo)\n{\n  int ci, qtblno;\n  jpeg_component_info *compptr;\n  JQUANT_TBL * qtbl;\n\n  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {\n    compptr = cinfo->cur_comp_info[ci];\n    /* No work if we already saved Q-table for this component */\n    if (compptr->quant_table != NULL)\n      continue;\n    /* Make sure specified quantization table is present */\n    qtblno = compptr->quant_tbl_no;\n    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||\n\tcinfo->quant_tbl_ptrs[qtblno] == NULL)\n      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);\n    /* OK, save away the quantization table */\n    qtbl = (JQUANT_TBL *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(JQUANT_TBL));\n    MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));\n    compptr->quant_table = qtbl;\n  }\n}\n\n\n/*\n * Initialize the input modules to read a scan of compressed data.\n * The first call to this is done by jdmaster.c after initializing\n * the entire decompressor (during jpeg_start_decompress).\n * Subsequent calls come from consume_markers, below.\n */\n\nMETHODDEF(void)\nstart_input_pass (j_decompress_ptr cinfo)\n{\n  per_scan_setup(cinfo);\n  latch_quant_tables(cinfo);\n  (*cinfo->entropy->start_pass) (cinfo);\n  (*cinfo->coef->start_input_pass) (cinfo);\n  cinfo->inputctl->consume_input = cinfo->coef->consume_data;\n}\n\n\n/*\n * Finish up after inputting a compressed-data scan.\n * This is called by the coefficient controller after it's read all\n * the expected data of the scan.\n */\n\nMETHODDEF(void)\nfinish_input_pass (j_decompress_ptr cinfo)\n{\n  cinfo->inputctl->consume_input = consume_markers;\n}\n\n\n/*\n * Read JPEG markers before, between, or after compressed-data scans.\n * Change state as necessary when a new scan is reached.\n * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.\n *\n * The consume_input method pointer points either here or to the\n * coefficient controller's consume_data routine, depending on whether\n * we are reading a compressed data segment or inter-segment markers.\n *\n * Note: This function should NOT return a pseudo SOS marker (with zero\n * component number) to the caller.  A pseudo marker received by\n * read_markers is processed and then skipped for other markers.\n */\n\nMETHODDEF(int)\nconsume_markers (j_decompress_ptr cinfo)\n{\n  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;\n  int val;\n\n  if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */\n    return JPEG_REACHED_EOI;\n\n  for (;;) {\t\t\t/* Loop to pass pseudo SOS marker */\n    val = (*cinfo->marker->read_markers) (cinfo);\n\n    switch (val) {\n    case JPEG_REACHED_SOS:\t/* Found SOS */\n      if (inputctl->inheaders) { /* 1st SOS */\n\tif (inputctl->inheaders == 1)\n\t  initial_setup(cinfo);\n\tif (cinfo->comps_in_scan == 0) { /* pseudo SOS marker */\n\t  inputctl->inheaders = 2;\n\t  break;\n\t}\n\tinputctl->inheaders = 0;\n\t/* Note: start_input_pass must be called by jdmaster.c\n\t * before any more input can be consumed.  jdapimin.c is\n\t * responsible for enforcing this sequencing.\n\t */\n      } else {\t\t\t/* 2nd or later SOS marker */\n\tif (! inputctl->pub.has_multiple_scans)\n\t  ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */\n\tif (cinfo->comps_in_scan == 0) /* unexpected pseudo SOS marker */\n\t  break;\n\tstart_input_pass(cinfo);\n      }\n      return val;\n    case JPEG_REACHED_EOI:\t/* Found EOI */\n      inputctl->pub.eoi_reached = TRUE;\n      if (inputctl->inheaders) { /* Tables-only datastream, apparently */\n\tif (cinfo->marker->saw_SOF)\n\t  ERREXIT(cinfo, JERR_SOF_NO_SOS);\n      } else {\n\t/* Prevent infinite loop in coef ctlr's decompress_data routine\n\t * if user set output_scan_number larger than number of scans.\n\t */\n\tif (cinfo->output_scan_number > cinfo->input_scan_number)\n\t  cinfo->output_scan_number = cinfo->input_scan_number;\n      }\n      return val;\n    case JPEG_SUSPENDED:\n      return val;\n    default:\n      return val;\n    }\n  }\n}\n\n\n/*\n * Reset state to begin a fresh datastream.\n */\n\nMETHODDEF(void)\nreset_input_controller (j_decompress_ptr cinfo)\n{\n  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;\n\n  inputctl->pub.consume_input = consume_markers;\n  inputctl->pub.has_multiple_scans = FALSE; /* \"unknown\" would be better */\n  inputctl->pub.eoi_reached = FALSE;\n  inputctl->inheaders = 1;\n  /* Reset other modules */\n  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);\n  (*cinfo->marker->reset_marker_reader) (cinfo);\n  /* Reset progression state -- would be cleaner if entropy decoder did this */\n  cinfo->coef_bits = NULL;\n}\n\n\n/*\n * Initialize the input controller module.\n * This is called only once, when the decompression object is created.\n */\n\nGLOBAL(void)\njinit_input_controller (j_decompress_ptr cinfo)\n{\n  my_inputctl_ptr inputctl;\n\n  /* Create subobject in permanent pool */\n  inputctl = (my_inputctl_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\tSIZEOF(my_input_controller));\n  cinfo->inputctl = (struct jpeg_input_controller *) inputctl;\n  /* Initialize method pointers */\n  inputctl->pub.consume_input = consume_markers;\n  inputctl->pub.reset_input_controller = reset_input_controller;\n  inputctl->pub.start_input_pass = start_input_pass;\n  inputctl->pub.finish_input_pass = finish_input_pass;\n  /* Initialize state: can't use reset_input_controller since we don't\n   * want to try to reset other modules yet.\n   */\n  inputctl->pub.has_multiple_scans = FALSE; /* \"unknown\" would be better */\n  inputctl->pub.eoi_reached = FALSE;\n  inputctl->inheaders = 1;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdmainct.c",
    "content": "/*\n * jdmainct.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * Modified 2002-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the main buffer controller for decompression.\n * The main buffer lies between the JPEG decompressor proper and the\n * post-processor; it holds downsampled data in the JPEG colorspace.\n *\n * Note that this code is bypassed in raw-data mode, since the application\n * supplies the equivalent of the main buffer in that case.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * In the current system design, the main buffer need never be a full-image\n * buffer; any full-height buffers will be found inside the coefficient or\n * postprocessing controllers.  Nonetheless, the main controller is not\n * trivial.  Its responsibility is to provide context rows for upsampling/\n * rescaling, and doing this in an efficient fashion is a bit tricky.\n *\n * Postprocessor input data is counted in \"row groups\".  A row group\n * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)\n * sample rows of each component.  (We require DCT_scaled_size values to be\n * chosen such that these numbers are integers.  In practice DCT_scaled_size\n * values will likely be powers of two, so we actually have the stronger\n * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.)\n * Upsampling will typically produce max_v_samp_factor pixel rows from each\n * row group (times any additional scale factor that the upsampler is\n * applying).\n *\n * The coefficient controller will deliver data to us one iMCU row at a time;\n * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or\n * exactly min_DCT_scaled_size row groups.  (This amount of data corresponds\n * to one row of MCUs when the image is fully interleaved.)  Note that the\n * number of sample rows varies across components, but the number of row\n * groups does not.  Some garbage sample rows may be included in the last iMCU\n * row at the bottom of the image.\n *\n * Depending on the vertical scaling algorithm used, the upsampler may need\n * access to the sample row(s) above and below its current input row group.\n * The upsampler is required to set need_context_rows TRUE at global selection\n * time if so.  When need_context_rows is FALSE, this controller can simply\n * obtain one iMCU row at a time from the coefficient controller and dole it\n * out as row groups to the postprocessor.\n *\n * When need_context_rows is TRUE, this controller guarantees that the buffer\n * passed to postprocessing contains at least one row group's worth of samples\n * above and below the row group(s) being processed.  Note that the context\n * rows \"above\" the first passed row group appear at negative row offsets in\n * the passed buffer.  At the top and bottom of the image, the required\n * context rows are manufactured by duplicating the first or last real sample\n * row; this avoids having special cases in the upsampling inner loops.\n *\n * The amount of context is fixed at one row group just because that's a\n * convenient number for this controller to work with.  The existing\n * upsamplers really only need one sample row of context.  An upsampler\n * supporting arbitrary output rescaling might wish for more than one row\n * group of context when shrinking the image; tough, we don't handle that.\n * (This is justified by the assumption that downsizing will be handled mostly\n * by adjusting the DCT_scaled_size values, so that the actual scale factor at\n * the upsample step needn't be much less than one.)\n *\n * To provide the desired context, we have to retain the last two row groups\n * of one iMCU row while reading in the next iMCU row.  (The last row group\n * can't be processed until we have another row group for its below-context,\n * and so we have to save the next-to-last group too for its above-context.)\n * We could do this most simply by copying data around in our buffer, but\n * that'd be very slow.  We can avoid copying any data by creating a rather\n * strange pointer structure.  Here's how it works.  We allocate a workspace\n * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number\n * of row groups per iMCU row).  We create two sets of redundant pointers to\n * the workspace.  Labeling the physical row groups 0 to M+1, the synthesized\n * pointer lists look like this:\n *                   M+1                          M-1\n * master pointer --> 0         master pointer --> 0\n *                    1                            1\n *                   ...                          ...\n *                   M-3                          M-3\n *                   M-2                           M\n *                   M-1                          M+1\n *                    M                           M-2\n *                   M+1                          M-1\n *                    0                            0\n * We read alternate iMCU rows using each master pointer; thus the last two\n * row groups of the previous iMCU row remain un-overwritten in the workspace.\n * The pointer lists are set up so that the required context rows appear to\n * be adjacent to the proper places when we pass the pointer lists to the\n * upsampler.\n *\n * The above pictures describe the normal state of the pointer lists.\n * At top and bottom of the image, we diddle the pointer lists to duplicate\n * the first or last sample row as necessary (this is cheaper than copying\n * sample rows around).\n *\n * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1.  In that\n * situation each iMCU row provides only one row group so the buffering logic\n * must be different (eg, we must read two iMCU rows before we can emit the\n * first row group).  For now, we simply do not support providing context\n * rows when min_DCT_scaled_size is 1.  That combination seems unlikely to\n * be worth providing --- if someone wants a 1/8th-size preview, they probably\n * want it quick and dirty, so a context-free upsampler is sufficient.\n */\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_d_main_controller pub; /* public fields */\n\n  /* Pointer to allocated workspace (M or M+2 row groups). */\n  JSAMPARRAY buffer[MAX_COMPONENTS];\n\n  boolean buffer_full;\t\t/* Have we gotten an iMCU row from decoder? */\n  JDIMENSION rowgroup_ctr;\t/* counts row groups output to postprocessor */\n\n  /* Remaining fields are only used in the context case. */\n\n  /* These are the master pointers to the funny-order pointer lists. */\n  JSAMPIMAGE xbuffer[2];\t/* pointers to weird pointer lists */\n\n  int whichptr;\t\t\t/* indicates which pointer set is now in use */\n  int context_state;\t\t/* process_data state machine status */\n  JDIMENSION rowgroups_avail;\t/* row groups available to postprocessor */\n  JDIMENSION iMCU_row_ctr;\t/* counts iMCU rows to detect image top/bot */\n} my_main_controller;\n\ntypedef my_main_controller * my_main_ptr;\n\n/* context_state values: */\n#define CTX_PREPARE_FOR_IMCU\t0\t/* need to prepare for MCU row */\n#define CTX_PROCESS_IMCU\t1\t/* feeding iMCU to postprocessor */\n#define CTX_POSTPONED_ROW\t2\t/* feeding postponed row group */\n\n\n/* Forward declarations */\nMETHODDEF(void) process_data_simple_main\n\tJPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,\n\t     JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));\nMETHODDEF(void) process_data_context_main\n\tJPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,\n\t     JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));\n#ifdef QUANT_2PASS_SUPPORTED\nMETHODDEF(void) process_data_crank_post\n\tJPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,\n\t     JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));\n#endif\n\n\nLOCAL(void)\nalloc_funny_pointers (j_decompress_ptr cinfo)\n/* Allocate space for the funny pointer lists.\n * This is done only once, not once per pass.\n */\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n  int ci, rgroup;\n  int M = cinfo->min_DCT_v_scaled_size;\n  jpeg_component_info *compptr;\n  JSAMPARRAY xbuf;\n\n  /* Get top-level space for component array pointers.\n   * We alloc both arrays with one call to save a few cycles.\n   */\n  mainp->xbuffer[0] = (JSAMPIMAGE)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tcinfo->num_components * 2 * SIZEOF(JSAMPARRAY));\n  mainp->xbuffer[1] = mainp->xbuffer[0] + cinfo->num_components;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /\n      cinfo->min_DCT_v_scaled_size; /* height of a row group of component */\n    /* Get space for pointer lists --- M+4 row groups in each list.\n     * We alloc both pointer lists with one call to save a few cycles.\n     */\n    xbuf = (JSAMPARRAY)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));\n    xbuf += rgroup;\t\t/* want one row group at negative offsets */\n    mainp->xbuffer[0][ci] = xbuf;\n    xbuf += rgroup * (M + 4);\n    mainp->xbuffer[1][ci] = xbuf;\n  }\n}\n\n\nLOCAL(void)\nmake_funny_pointers (j_decompress_ptr cinfo)\n/* Create the funny pointer lists discussed in the comments above.\n * The actual workspace is already allocated (in main->buffer),\n * and the space for the pointer lists is allocated too.\n * This routine just fills in the curiously ordered lists.\n * This will be repeated at the beginning of each pass.\n */\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n  int ci, i, rgroup;\n  int M = cinfo->min_DCT_v_scaled_size;\n  jpeg_component_info *compptr;\n  JSAMPARRAY buf, xbuf0, xbuf1;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /\n      cinfo->min_DCT_v_scaled_size; /* height of a row group of component */\n    xbuf0 = mainp->xbuffer[0][ci];\n    xbuf1 = mainp->xbuffer[1][ci];\n    /* First copy the workspace pointers as-is */\n    buf = mainp->buffer[ci];\n    for (i = 0; i < rgroup * (M + 2); i++) {\n      xbuf0[i] = xbuf1[i] = buf[i];\n    }\n    /* In the second list, put the last four row groups in swapped order */\n    for (i = 0; i < rgroup * 2; i++) {\n      xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];\n      xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];\n    }\n    /* The wraparound pointers at top and bottom will be filled later\n     * (see set_wraparound_pointers, below).  Initially we want the \"above\"\n     * pointers to duplicate the first actual data line.  This only needs\n     * to happen in xbuffer[0].\n     */\n    for (i = 0; i < rgroup; i++) {\n      xbuf0[i - rgroup] = xbuf0[0];\n    }\n  }\n}\n\n\nLOCAL(void)\nset_wraparound_pointers (j_decompress_ptr cinfo)\n/* Set up the \"wraparound\" pointers at top and bottom of the pointer lists.\n * This changes the pointer list state from top-of-image to the normal state.\n */\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n  int ci, i, rgroup;\n  int M = cinfo->min_DCT_v_scaled_size;\n  jpeg_component_info *compptr;\n  JSAMPARRAY xbuf0, xbuf1;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /\n      cinfo->min_DCT_v_scaled_size; /* height of a row group of component */\n    xbuf0 = mainp->xbuffer[0][ci];\n    xbuf1 = mainp->xbuffer[1][ci];\n    for (i = 0; i < rgroup; i++) {\n      xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];\n      xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];\n      xbuf0[rgroup*(M+2) + i] = xbuf0[i];\n      xbuf1[rgroup*(M+2) + i] = xbuf1[i];\n    }\n  }\n}\n\n\nLOCAL(void)\nset_bottom_pointers (j_decompress_ptr cinfo)\n/* Change the pointer lists to duplicate the last sample row at the bottom\n * of the image.  whichptr indicates which xbuffer holds the final iMCU row.\n * Also sets rowgroups_avail to indicate number of nondummy row groups in row.\n */\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n  int ci, i, rgroup, iMCUheight, rows_left;\n  jpeg_component_info *compptr;\n  JSAMPARRAY xbuf;\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Count sample rows in one iMCU row and in one row group */\n    iMCUheight = compptr->v_samp_factor * compptr->DCT_v_scaled_size;\n    rgroup = iMCUheight / cinfo->min_DCT_v_scaled_size;\n    /* Count nondummy sample rows remaining for this component */\n    rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);\n    if (rows_left == 0) rows_left = iMCUheight;\n    /* Count nondummy row groups.  Should get same answer for each component,\n     * so we need only do it once.\n     */\n    if (ci == 0) {\n      mainp->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);\n    }\n    /* Duplicate the last real sample row rgroup*2 times; this pads out the\n     * last partial rowgroup and ensures at least one full rowgroup of context.\n     */\n    xbuf = mainp->xbuffer[mainp->whichptr][ci];\n    for (i = 0; i < rgroup * 2; i++) {\n      xbuf[rows_left + i] = xbuf[rows_left-1];\n    }\n  }\n}\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n\n  switch (pass_mode) {\n  case JBUF_PASS_THRU:\n    if (cinfo->upsample->need_context_rows) {\n      mainp->pub.process_data = process_data_context_main;\n      make_funny_pointers(cinfo); /* Create the xbuffer[] lists */\n      mainp->whichptr = 0;\t/* Read first iMCU row into xbuffer[0] */\n      mainp->context_state = CTX_PREPARE_FOR_IMCU;\n      mainp->iMCU_row_ctr = 0;\n    } else {\n      /* Simple case with no context needed */\n      mainp->pub.process_data = process_data_simple_main;\n    }\n    mainp->buffer_full = FALSE;\t/* Mark buffer empty */\n    mainp->rowgroup_ctr = 0;\n    break;\n#ifdef QUANT_2PASS_SUPPORTED\n  case JBUF_CRANK_DEST:\n    /* For last pass of 2-pass quantization, just crank the postprocessor */\n    mainp->pub.process_data = process_data_crank_post;\n    break;\n#endif\n  default:\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    break;\n  }\n}\n\n\n/*\n * Process some data.\n * This handles the simple case where no context is required.\n */\n\nMETHODDEF(void)\nprocess_data_simple_main (j_decompress_ptr cinfo,\n\t\t\t  JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t\t  JDIMENSION out_rows_avail)\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n  JDIMENSION rowgroups_avail;\n\n  /* Read input data if we haven't filled the main buffer yet */\n  if (! mainp->buffer_full) {\n    if (! (*cinfo->coef->decompress_data) (cinfo, mainp->buffer))\n      return;\t\t\t/* suspension forced, can do nothing more */\n    mainp->buffer_full = TRUE;\t/* OK, we have an iMCU row to work with */\n  }\n\n  /* There are always min_DCT_scaled_size row groups in an iMCU row. */\n  rowgroups_avail = (JDIMENSION) cinfo->min_DCT_v_scaled_size;\n  /* Note: at the bottom of the image, we may pass extra garbage row groups\n   * to the postprocessor.  The postprocessor has to check for bottom\n   * of image anyway (at row resolution), so no point in us doing it too.\n   */\n\n  /* Feed the postprocessor */\n  (*cinfo->post->post_process_data) (cinfo, mainp->buffer,\n\t\t\t\t     &mainp->rowgroup_ctr, rowgroups_avail,\n\t\t\t\t     output_buf, out_row_ctr, out_rows_avail);\n\n  /* Has postprocessor consumed all the data yet? If so, mark buffer empty */\n  if (mainp->rowgroup_ctr >= rowgroups_avail) {\n    mainp->buffer_full = FALSE;\n    mainp->rowgroup_ctr = 0;\n  }\n}\n\n\n/*\n * Process some data.\n * This handles the case where context rows must be provided.\n */\n\nMETHODDEF(void)\nprocess_data_context_main (j_decompress_ptr cinfo,\n\t\t\t   JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t\t   JDIMENSION out_rows_avail)\n{\n  my_main_ptr mainp = (my_main_ptr) cinfo->main;\n\n  /* Read input data if we haven't filled the main buffer yet */\n  if (! mainp->buffer_full) {\n    if (! (*cinfo->coef->decompress_data) (cinfo,\n\t\t\t\t\t   mainp->xbuffer[mainp->whichptr]))\n      return;\t\t\t/* suspension forced, can do nothing more */\n    mainp->buffer_full = TRUE;\t/* OK, we have an iMCU row to work with */\n    mainp->iMCU_row_ctr++;\t/* count rows received */\n  }\n\n  /* Postprocessor typically will not swallow all the input data it is handed\n   * in one call (due to filling the output buffer first).  Must be prepared\n   * to exit and restart.  This switch lets us keep track of how far we got.\n   * Note that each case falls through to the next on successful completion.\n   */\n  switch (mainp->context_state) {\n  case CTX_POSTPONED_ROW:\n    /* Call postprocessor using previously set pointers for postponed row */\n    (*cinfo->post->post_process_data) (cinfo, mainp->xbuffer[mainp->whichptr],\n\t\t\t&mainp->rowgroup_ctr, mainp->rowgroups_avail,\n\t\t\toutput_buf, out_row_ctr, out_rows_avail);\n    if (mainp->rowgroup_ctr < mainp->rowgroups_avail)\n      return;\t\t\t/* Need to suspend */\n    mainp->context_state = CTX_PREPARE_FOR_IMCU;\n    if (*out_row_ctr >= out_rows_avail)\n      return;\t\t\t/* Postprocessor exactly filled output buf */\n    /*FALLTHROUGH*/\n  case CTX_PREPARE_FOR_IMCU:\n    /* Prepare to process first M-1 row groups of this iMCU row */\n    mainp->rowgroup_ctr = 0;\n    mainp->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size - 1);\n    /* Check for bottom of image: if so, tweak pointers to \"duplicate\"\n     * the last sample row, and adjust rowgroups_avail to ignore padding rows.\n     */\n    if (mainp->iMCU_row_ctr == cinfo->total_iMCU_rows)\n      set_bottom_pointers(cinfo);\n    mainp->context_state = CTX_PROCESS_IMCU;\n    /*FALLTHROUGH*/\n  case CTX_PROCESS_IMCU:\n    /* Call postprocessor using previously set pointers */\n    (*cinfo->post->post_process_data) (cinfo, mainp->xbuffer[mainp->whichptr],\n\t\t\t&mainp->rowgroup_ctr, mainp->rowgroups_avail,\n\t\t\toutput_buf, out_row_ctr, out_rows_avail);\n    if (mainp->rowgroup_ctr < mainp->rowgroups_avail)\n      return;\t\t\t/* Need to suspend */\n    /* After the first iMCU, change wraparound pointers to normal state */\n    if (mainp->iMCU_row_ctr == 1)\n      set_wraparound_pointers(cinfo);\n    /* Prepare to load new iMCU row using other xbuffer list */\n    mainp->whichptr ^= 1;\t/* 0=>1 or 1=>0 */\n    mainp->buffer_full = FALSE;\n    /* Still need to process last row group of this iMCU row, */\n    /* which is saved at index M+1 of the other xbuffer */\n    mainp->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 1);\n    mainp->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 2);\n    mainp->context_state = CTX_POSTPONED_ROW;\n  }\n}\n\n\n/*\n * Process some data.\n * Final pass of two-pass quantization: just call the postprocessor.\n * Source data will be the postprocessor controller's internal buffer.\n */\n\n#ifdef QUANT_2PASS_SUPPORTED\n\nMETHODDEF(void)\nprocess_data_crank_post (j_decompress_ptr cinfo,\n\t\t\t JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t\t JDIMENSION out_rows_avail)\n{\n  (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,\n\t\t\t\t     (JDIMENSION *) NULL, (JDIMENSION) 0,\n\t\t\t\t     output_buf, out_row_ctr, out_rows_avail);\n}\n\n#endif /* QUANT_2PASS_SUPPORTED */\n\n\n/*\n * Initialize main buffer controller.\n */\n\nGLOBAL(void)\njinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)\n{\n  my_main_ptr mainp;\n  int ci, rgroup, ngroups;\n  jpeg_component_info *compptr;\n\n  mainp = (my_main_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_main_controller));\n  cinfo->main = &mainp->pub;\n  mainp->pub.start_pass = start_pass_main;\n\n  if (need_full_buffer)\t\t/* shouldn't happen */\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n\n  /* Allocate the workspace.\n   * ngroups is the number of row groups we need.\n   */\n  if (cinfo->upsample->need_context_rows) {\n    if (cinfo->min_DCT_v_scaled_size < 2) /* unsupported, see comments above */\n      ERREXIT(cinfo, JERR_NOTIMPL);\n    alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */\n    ngroups = cinfo->min_DCT_v_scaled_size + 2;\n  } else {\n    ngroups = cinfo->min_DCT_v_scaled_size;\n  }\n\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /\n      cinfo->min_DCT_v_scaled_size; /* height of a row group of component */\n    mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),\n       (JDIMENSION) (rgroup * ngroups));\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdmarker.c",
    "content": "/*\n * jdmarker.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * Modified 2009-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to decode JPEG datastream markers.\n * Most of the complexity arises from our desire to support input\n * suspension: if not all of the data for a marker is available,\n * we must exit back to the application.  On resumption, we reprocess\n * the marker.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\ntypedef enum {\t\t\t/* JPEG marker codes */\n  M_SOF0  = 0xc0,\n  M_SOF1  = 0xc1,\n  M_SOF2  = 0xc2,\n  M_SOF3  = 0xc3,\n\n  M_SOF5  = 0xc5,\n  M_SOF6  = 0xc6,\n  M_SOF7  = 0xc7,\n\n  M_JPG   = 0xc8,\n  M_SOF9  = 0xc9,\n  M_SOF10 = 0xca,\n  M_SOF11 = 0xcb,\n\n  M_SOF13 = 0xcd,\n  M_SOF14 = 0xce,\n  M_SOF15 = 0xcf,\n\n  M_DHT   = 0xc4,\n\n  M_DAC   = 0xcc,\n\n  M_RST0  = 0xd0,\n  M_RST1  = 0xd1,\n  M_RST2  = 0xd2,\n  M_RST3  = 0xd3,\n  M_RST4  = 0xd4,\n  M_RST5  = 0xd5,\n  M_RST6  = 0xd6,\n  M_RST7  = 0xd7,\n\n  M_SOI   = 0xd8,\n  M_EOI   = 0xd9,\n  M_SOS   = 0xda,\n  M_DQT   = 0xdb,\n  M_DNL   = 0xdc,\n  M_DRI   = 0xdd,\n  M_DHP   = 0xde,\n  M_EXP   = 0xdf,\n\n  M_APP0  = 0xe0,\n  M_APP1  = 0xe1,\n  M_APP2  = 0xe2,\n  M_APP3  = 0xe3,\n  M_APP4  = 0xe4,\n  M_APP5  = 0xe5,\n  M_APP6  = 0xe6,\n  M_APP7  = 0xe7,\n  M_APP8  = 0xe8,\n  M_APP9  = 0xe9,\n  M_APP10 = 0xea,\n  M_APP11 = 0xeb,\n  M_APP12 = 0xec,\n  M_APP13 = 0xed,\n  M_APP14 = 0xee,\n  M_APP15 = 0xef,\n\n  M_JPG0  = 0xf0,\n  M_JPG8  = 0xf8,\n  M_JPG13 = 0xfd,\n  M_COM   = 0xfe,\n\n  M_TEM   = 0x01,\n\n  M_ERROR = 0x100\n} JPEG_MARKER;\n\n\n/* Private state */\n\ntypedef struct {\n  struct jpeg_marker_reader pub; /* public fields */\n\n  /* Application-overridable marker processing methods */\n  jpeg_marker_parser_method process_COM;\n  jpeg_marker_parser_method process_APPn[16];\n\n  /* Limit on marker data length to save for each marker type */\n  unsigned int length_limit_COM;\n  unsigned int length_limit_APPn[16];\n\n  /* Status of COM/APPn marker saving */\n  jpeg_saved_marker_ptr cur_marker;\t/* NULL if not processing a marker */\n  unsigned int bytes_read;\t\t/* data bytes read so far in marker */\n  /* Note: cur_marker is not linked into marker_list until it's all read. */\n} my_marker_reader;\n\ntypedef my_marker_reader * my_marker_ptr;\n\n\n/*\n * Macros for fetching data from the data source module.\n *\n * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect\n * the current restart point; we update them only when we have reached a\n * suitable place to restart if a suspension occurs.\n */\n\n/* Declare and initialize local copies of input pointer/count */\n#define INPUT_VARS(cinfo)  \\\n\tstruct jpeg_source_mgr * datasrc = (cinfo)->src;  \\\n\tconst JOCTET * next_input_byte = datasrc->next_input_byte;  \\\n\tsize_t bytes_in_buffer = datasrc->bytes_in_buffer\n\n/* Unload the local copies --- do this only at a restart boundary */\n#define INPUT_SYNC(cinfo)  \\\n\t( datasrc->next_input_byte = next_input_byte,  \\\n\t  datasrc->bytes_in_buffer = bytes_in_buffer )\n\n/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */\n#define INPUT_RELOAD(cinfo)  \\\n\t( next_input_byte = datasrc->next_input_byte,  \\\n\t  bytes_in_buffer = datasrc->bytes_in_buffer )\n\n/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available.\n * Note we do *not* do INPUT_SYNC before calling fill_input_buffer,\n * but we must reload the local copies after a successful fill.\n */\n#define MAKE_BYTE_AVAIL(cinfo,action)  \\\n\tif (bytes_in_buffer == 0) {  \\\n\t  if (! (*datasrc->fill_input_buffer) (cinfo))  \\\n\t    { action; }  \\\n\t  INPUT_RELOAD(cinfo);  \\\n\t}\n\n/* Read a byte into variable V.\n * If must suspend, take the specified action (typically \"return FALSE\").\n */\n#define INPUT_BYTE(cinfo,V,action)  \\\n\tMAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \\\n\t\t  bytes_in_buffer--; \\\n\t\t  V = GETJOCTET(*next_input_byte++); )\n\n/* As above, but read two bytes interpreted as an unsigned 16-bit integer.\n * V should be declared unsigned int or perhaps INT32.\n */\n#define INPUT_2BYTES(cinfo,V,action)  \\\n\tMAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \\\n\t\t  bytes_in_buffer--; \\\n\t\t  V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \\\n\t\t  MAKE_BYTE_AVAIL(cinfo,action); \\\n\t\t  bytes_in_buffer--; \\\n\t\t  V += GETJOCTET(*next_input_byte++); )\n\n\n/*\n * Routines to process JPEG markers.\n *\n * Entry condition: JPEG marker itself has been read and its code saved\n *   in cinfo->unread_marker; input restart point is just after the marker.\n *\n * Exit: if return TRUE, have read and processed any parameters, and have\n *   updated the restart point to point after the parameters.\n *   If return FALSE, was forced to suspend before reaching end of\n *   marker parameters; restart point has not been moved.  Same routine\n *   will be called again after application supplies more input data.\n *\n * This approach to suspension assumes that all of a marker's parameters\n * can fit into a single input bufferload.  This should hold for \"normal\"\n * markers.  Some COM/APPn markers might have large parameter segments\n * that might not fit.  If we are simply dropping such a marker, we use\n * skip_input_data to get past it, and thereby put the problem on the\n * source manager's shoulders.  If we are saving the marker's contents\n * into memory, we use a slightly different convention: when forced to\n * suspend, the marker processor updates the restart point to the end of\n * what it's consumed (ie, the end of the buffer) before returning FALSE.\n * On resumption, cinfo->unread_marker still contains the marker code,\n * but the data source will point to the next chunk of marker data.\n * The marker processor must retain internal state to deal with this.\n *\n * Note that we don't bother to avoid duplicate trace messages if a\n * suspension occurs within marker parameters.  Other side effects\n * require more care.\n */\n\n\nLOCAL(boolean)\nget_soi (j_decompress_ptr cinfo)\n/* Process an SOI marker */\n{\n  int i;\n  \n  TRACEMS(cinfo, 1, JTRC_SOI);\n\n  if (cinfo->marker->saw_SOI)\n    ERREXIT(cinfo, JERR_SOI_DUPLICATE);\n\n  /* Reset all parameters that are defined to be reset by SOI */\n\n  for (i = 0; i < NUM_ARITH_TBLS; i++) {\n    cinfo->arith_dc_L[i] = 0;\n    cinfo->arith_dc_U[i] = 1;\n    cinfo->arith_ac_K[i] = 5;\n  }\n  cinfo->restart_interval = 0;\n\n  /* Set initial assumptions for colorspace etc */\n\n  cinfo->jpeg_color_space = JCS_UNKNOWN;\n  cinfo->color_transform = JCT_NONE;\n  cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */\n\n  cinfo->saw_JFIF_marker = FALSE;\n  cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */\n  cinfo->JFIF_minor_version = 1;\n  cinfo->density_unit = 0;\n  cinfo->X_density = 1;\n  cinfo->Y_density = 1;\n  cinfo->saw_Adobe_marker = FALSE;\n  cinfo->Adobe_transform = 0;\n\n  cinfo->marker->saw_SOI = TRUE;\n\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nget_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,\n\t boolean is_arith)\n/* Process a SOFn marker */\n{\n  INT32 length;\n  int c, ci, i;\n  jpeg_component_info * compptr;\n  INPUT_VARS(cinfo);\n\n  cinfo->is_baseline = is_baseline;\n  cinfo->progressive_mode = is_prog;\n  cinfo->arith_code = is_arith;\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n\n  INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);\n  INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE);\n  INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE);\n  INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);\n\n  length -= 8;\n\n  TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,\n\t   (int) cinfo->image_width, (int) cinfo->image_height,\n\t   cinfo->num_components);\n\n  if (cinfo->marker->saw_SOF)\n    ERREXIT(cinfo, JERR_SOF_DUPLICATE);\n\n  /* We don't support files in which the image height is initially specified */\n  /* as 0 and is later redefined by DNL.  As long as we have to check that,  */\n  /* might as well have a general sanity check. */\n  if (cinfo->image_height <= 0 || cinfo->image_width <= 0\n      || cinfo->num_components <= 0)\n    ERREXIT(cinfo, JERR_EMPTY_IMAGE);\n\n  if (length != (cinfo->num_components * 3))\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  if (cinfo->comp_info == NULL)\t/* do only once, even if suspend */\n    cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)\n\t\t\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t cinfo->num_components * SIZEOF(jpeg_component_info));\n\n  for (ci = 0; ci < cinfo->num_components; ci++) {\n    INPUT_BYTE(cinfo, c, return FALSE);\n    /* Check to see whether component id has already been seen   */\n    /* (in violation of the spec, but unfortunately seen in some */\n    /* files).  If so, create \"fake\" component id equal to the   */\n    /* max id seen so far + 1. */\n    for (i = 0, compptr = cinfo->comp_info; i < ci; i++, compptr++) {\n      if (c == compptr->component_id) {\n\tcompptr = cinfo->comp_info;\n\tc = compptr->component_id;\n\tcompptr++;\n\tfor (i = 1; i < ci; i++, compptr++) {\n\t  if (compptr->component_id > c) c = compptr->component_id;\n\t}\n\tc++;\n\tbreak;\n      }\n    }\n    compptr->component_id = c;\n    compptr->component_index = ci;\n    INPUT_BYTE(cinfo, c, return FALSE);\n    compptr->h_samp_factor = (c >> 4) & 15;\n    compptr->v_samp_factor = (c     ) & 15;\n    INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);\n\n    TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,\n\t     compptr->component_id, compptr->h_samp_factor,\n\t     compptr->v_samp_factor, compptr->quant_tbl_no);\n  }\n\n  cinfo->marker->saw_SOF = TRUE;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nget_sos (j_decompress_ptr cinfo)\n/* Process a SOS marker */\n{\n  INT32 length;\n  int c, ci, i, n;\n  jpeg_component_info * compptr;\n  INPUT_VARS(cinfo);\n\n  if (! cinfo->marker->saw_SOF)\n    ERREXITS(cinfo, JERR_SOF_BEFORE, \"SOS\");\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n\n  INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */\n\n  TRACEMS1(cinfo, 1, JTRC_SOS, n);\n\n  if (length != (n * 2 + 6) || n > MAX_COMPS_IN_SCAN ||\n      (n == 0 && !cinfo->progressive_mode))\n      /* pseudo SOS marker only allowed in progressive mode */\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  cinfo->comps_in_scan = n;\n\n  /* Collect the component-spec parameters */\n\n  for (i = 0; i < n; i++) {\n    INPUT_BYTE(cinfo, c, return FALSE);\n\n    /* Detect the case where component id's are not unique, and, if so, */\n    /* create a fake component id using the same logic as in get_sof.   */\n    for (ci = 0; ci < i; ci++) {\n      if (c == cinfo->cur_comp_info[ci]->component_id) {\n\tc = cinfo->cur_comp_info[0]->component_id;\n\tfor (ci = 1; ci < i; ci++) {\n\t  compptr = cinfo->cur_comp_info[ci];\n\t  if (compptr->component_id > c) c = compptr->component_id;\n\t}\n\tc++;\n\tbreak;\n      }\n    }\n\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      if (c == compptr->component_id)\n\tgoto id_found;\n    }\n\n    ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, c);\n\n  id_found:\n\n    cinfo->cur_comp_info[i] = compptr;\n    INPUT_BYTE(cinfo, c, return FALSE);\n    compptr->dc_tbl_no = (c >> 4) & 15;\n    compptr->ac_tbl_no = (c     ) & 15;\n\n    TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, compptr->component_id,\n\t     compptr->dc_tbl_no, compptr->ac_tbl_no);\n  }\n\n  /* Collect the additional scan parameters Ss, Se, Ah/Al. */\n  INPUT_BYTE(cinfo, c, return FALSE);\n  cinfo->Ss = c;\n  INPUT_BYTE(cinfo, c, return FALSE);\n  cinfo->Se = c;\n  INPUT_BYTE(cinfo, c, return FALSE);\n  cinfo->Ah = (c >> 4) & 15;\n  cinfo->Al = (c     ) & 15;\n\n  TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,\n\t   cinfo->Ah, cinfo->Al);\n\n  /* Prepare to scan data & restart markers */\n  cinfo->marker->next_restart_num = 0;\n\n  /* Count another (non-pseudo) SOS marker */\n  if (n) cinfo->input_scan_number++;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\n#ifdef D_ARITH_CODING_SUPPORTED\n\nLOCAL(boolean)\nget_dac (j_decompress_ptr cinfo)\n/* Process a DAC marker */\n{\n  INT32 length;\n  int index, val;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n  \n  while (length > 0) {\n    INPUT_BYTE(cinfo, index, return FALSE);\n    INPUT_BYTE(cinfo, val, return FALSE);\n\n    length -= 2;\n\n    TRACEMS2(cinfo, 1, JTRC_DAC, index, val);\n\n    if (index < 0 || index >= (2*NUM_ARITH_TBLS))\n      ERREXIT1(cinfo, JERR_DAC_INDEX, index);\n\n    if (index >= NUM_ARITH_TBLS) { /* define AC table */\n      cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val;\n    } else {\t\t\t/* define DC table */\n      cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F);\n      cinfo->arith_dc_U[index] = (UINT8) (val >> 4);\n      if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index])\n\tERREXIT1(cinfo, JERR_DAC_VALUE, val);\n    }\n  }\n\n  if (length != 0)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n#else /* ! D_ARITH_CODING_SUPPORTED */\n\n#define get_dac(cinfo)  skip_variable(cinfo)\n\n#endif /* D_ARITH_CODING_SUPPORTED */\n\n\nLOCAL(boolean)\nget_dht (j_decompress_ptr cinfo)\n/* Process a DHT marker */\n{\n  INT32 length;\n  UINT8 bits[17];\n  UINT8 huffval[256];\n  int i, index, count;\n  JHUFF_TBL **htblptr;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n  \n  while (length > 16) {\n    INPUT_BYTE(cinfo, index, return FALSE);\n\n    TRACEMS1(cinfo, 1, JTRC_DHT, index);\n      \n    bits[0] = 0;\n    count = 0;\n    for (i = 1; i <= 16; i++) {\n      INPUT_BYTE(cinfo, bits[i], return FALSE);\n      count += bits[i];\n    }\n\n    length -= 1 + 16;\n\n    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,\n\t     bits[1], bits[2], bits[3], bits[4],\n\t     bits[5], bits[6], bits[7], bits[8]);\n    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,\n\t     bits[9], bits[10], bits[11], bits[12],\n\t     bits[13], bits[14], bits[15], bits[16]);\n\n    /* Here we just do minimal validation of the counts to avoid walking\n     * off the end of our table space.  jdhuff.c will check more carefully.\n     */\n    if (count > 256 || ((INT32) count) > length)\n      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);\n\n    for (i = 0; i < count; i++)\n      INPUT_BYTE(cinfo, huffval[i], return FALSE);\n\n    length -= count;\n\n    if (index & 0x10) {\t\t/* AC table definition */\n      index -= 0x10;\n      htblptr = &cinfo->ac_huff_tbl_ptrs[index];\n    } else {\t\t\t/* DC table definition */\n      htblptr = &cinfo->dc_huff_tbl_ptrs[index];\n    }\n\n    if (index < 0 || index >= NUM_HUFF_TBLS)\n      ERREXIT1(cinfo, JERR_DHT_INDEX, index);\n\n    if (*htblptr == NULL)\n      *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);\n  \n    MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));\n    MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));\n  }\n\n  if (length != 0)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nget_dqt (j_decompress_ptr cinfo)\n/* Process a DQT marker */\n{\n  INT32 length, count, i;\n  int n, prec;\n  unsigned int tmp;\n  JQUANT_TBL *quant_ptr;\n  const int *natural_order;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n\n  while (length > 0) {\n    length--;\n    INPUT_BYTE(cinfo, n, return FALSE);\n    prec = n >> 4;\n    n &= 0x0F;\n\n    TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);\n\n    if (n >= NUM_QUANT_TBLS)\n      ERREXIT1(cinfo, JERR_DQT_INDEX, n);\n      \n    if (cinfo->quant_tbl_ptrs[n] == NULL)\n      cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);\n    quant_ptr = cinfo->quant_tbl_ptrs[n];\n\n    if (prec) {\n      if (length < DCTSIZE2 * 2) {\n\t/* Initialize full table for safety. */\n\tfor (i = 0; i < DCTSIZE2; i++) {\n\t  quant_ptr->quantval[i] = 1;\n\t}\n\tcount = length >> 1;\n      } else\n\tcount = DCTSIZE2;\n    } else {\n      if (length < DCTSIZE2) {\n\t/* Initialize full table for safety. */\n\tfor (i = 0; i < DCTSIZE2; i++) {\n\t  quant_ptr->quantval[i] = 1;\n\t}\n\tcount = length;\n      } else\n\tcount = DCTSIZE2;\n    }\n\n    switch (count) {\n    case (2*2): natural_order = jpeg_natural_order2; break;\n    case (3*3): natural_order = jpeg_natural_order3; break;\n    case (4*4): natural_order = jpeg_natural_order4; break;\n    case (5*5): natural_order = jpeg_natural_order5; break;\n    case (6*6): natural_order = jpeg_natural_order6; break;\n    case (7*7): natural_order = jpeg_natural_order7; break;\n    default:    natural_order = jpeg_natural_order;  break;\n    }\n\n    for (i = 0; i < count; i++) {\n      if (prec)\n\tINPUT_2BYTES(cinfo, tmp, return FALSE);\n      else\n\tINPUT_BYTE(cinfo, tmp, return FALSE);\n      /* We convert the zigzag-order table to natural array order. */\n      quant_ptr->quantval[natural_order[i]] = (UINT16) tmp;\n    }\n\n    if (cinfo->err->trace_level >= 2) {\n      for (i = 0; i < DCTSIZE2; i += 8) {\n\tTRACEMS8(cinfo, 2, JTRC_QUANTVALS,\n\t\t quant_ptr->quantval[i],   quant_ptr->quantval[i+1],\n\t\t quant_ptr->quantval[i+2], quant_ptr->quantval[i+3],\n\t\t quant_ptr->quantval[i+4], quant_ptr->quantval[i+5],\n\t\t quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]);\n      }\n    }\n\n    length -= count;\n    if (prec) length -= count;\n  }\n\n  if (length != 0)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nget_dri (j_decompress_ptr cinfo)\n/* Process a DRI marker */\n{\n  INT32 length;\n  unsigned int tmp;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  \n  if (length != 4)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  INPUT_2BYTES(cinfo, tmp, return FALSE);\n\n  TRACEMS1(cinfo, 1, JTRC_DRI, tmp);\n\n  cinfo->restart_interval = tmp;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nget_lse (j_decompress_ptr cinfo)\n/* Process an LSE marker */\n{\n  INT32 length;\n  unsigned int tmp;\n  int cid;\n  INPUT_VARS(cinfo);\n\n  if (! cinfo->marker->saw_SOF)\n    ERREXITS(cinfo, JERR_SOF_BEFORE, \"LSE\");\n\n  if (cinfo->num_components < 3) goto bad;\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n\n  if (length != 24)\n    ERREXIT(cinfo, JERR_BAD_LENGTH);\n\n  INPUT_BYTE(cinfo, tmp, return FALSE);\n  if (tmp != 0x0D)\t/* ID inverse transform specification */\n    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);\n  INPUT_2BYTES(cinfo, tmp, return FALSE);\n  if (tmp != MAXJSAMPLE) goto bad;\t\t/* MAXTRANS */\n  INPUT_BYTE(cinfo, tmp, return FALSE);\n  if (tmp != 3) goto bad;\t\t\t/* Nt=3 */\n  INPUT_BYTE(cinfo, cid, return FALSE);\n  if (cid != cinfo->comp_info[1].component_id) goto bad;\n  INPUT_BYTE(cinfo, cid, return FALSE);\n  if (cid != cinfo->comp_info[0].component_id) goto bad;\n  INPUT_BYTE(cinfo, cid, return FALSE);\n  if (cid != cinfo->comp_info[2].component_id) goto bad;\n  INPUT_BYTE(cinfo, tmp, return FALSE);\n  if (tmp != 0x80) goto bad;\t\t/* F1: CENTER1=1, NORM1=0 */\n  INPUT_2BYTES(cinfo, tmp, return FALSE);\n  if (tmp != 0) goto bad;\t\t\t/* A(1,1)=0 */\n  INPUT_2BYTES(cinfo, tmp, return FALSE);\n  if (tmp != 0) goto bad;\t\t\t/* A(1,2)=0 */\n  INPUT_BYTE(cinfo, tmp, return FALSE);\n  if (tmp != 0) goto bad;\t\t/* F2: CENTER2=0, NORM2=0 */\n  INPUT_2BYTES(cinfo, tmp, return FALSE);\n  if (tmp != 1) goto bad;\t\t\t/* A(2,1)=1 */\n  INPUT_2BYTES(cinfo, tmp, return FALSE);\n  if (tmp != 0) goto bad;\t\t\t/* A(2,2)=0 */\n  INPUT_BYTE(cinfo, tmp, return FALSE);\n  if (tmp != 0) goto bad;\t\t/* F3: CENTER3=0, NORM3=0 */\n  INPUT_2BYTES(cinfo, tmp, return FALSE);\n  if (tmp != 1) goto bad;\t\t\t/* A(3,1)=1 */\n  INPUT_2BYTES(cinfo, tmp, return FALSE);\n  if (tmp != 0) {\t\t\t\t/* A(3,2)=0 */\n    bad:\n    ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);\n  }\n\n  /* OK, valid transform that we can handle. */\n  cinfo->color_transform = JCT_SUBTRACT_GREEN;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\n/*\n * Routines for processing APPn and COM markers.\n * These are either saved in memory or discarded, per application request.\n * APP0 and APP14 are specially checked to see if they are\n * JFIF and Adobe markers, respectively.\n */\n\n#define APP0_DATA_LEN\t14\t/* Length of interesting data in APP0 */\n#define APP14_DATA_LEN\t12\t/* Length of interesting data in APP14 */\n#define APPN_DATA_LEN\t14\t/* Must be the largest of the above!! */\n\n\nLOCAL(void)\nexamine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,\n\t      unsigned int datalen, INT32 remaining)\n/* Examine first few bytes from an APP0.\n * Take appropriate action if it is a JFIF marker.\n * datalen is # of bytes at data[], remaining is length of rest of marker data.\n */\n{\n  INT32 totallen = (INT32) datalen + remaining;\n\n  if (datalen >= APP0_DATA_LEN &&\n      GETJOCTET(data[0]) == 0x4A &&\n      GETJOCTET(data[1]) == 0x46 &&\n      GETJOCTET(data[2]) == 0x49 &&\n      GETJOCTET(data[3]) == 0x46 &&\n      GETJOCTET(data[4]) == 0) {\n    /* Found JFIF APP0 marker: save info */\n    cinfo->saw_JFIF_marker = TRUE;\n    cinfo->JFIF_major_version = GETJOCTET(data[5]);\n    cinfo->JFIF_minor_version = GETJOCTET(data[6]);\n    cinfo->density_unit = GETJOCTET(data[7]);\n    cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);\n    cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);\n    /* Check version.\n     * Major version must be 1, anything else signals an incompatible change.\n     * (We used to treat this as an error, but now it's a nonfatal warning,\n     * because some bozo at Hijaak couldn't read the spec.)\n     * Minor version should be 0..2, but process anyway if newer.\n     */\n    if (cinfo->JFIF_major_version != 1)\n      WARNMS2(cinfo, JWRN_JFIF_MAJOR,\n\t      cinfo->JFIF_major_version, cinfo->JFIF_minor_version);\n    /* Generate trace messages */\n    TRACEMS5(cinfo, 1, JTRC_JFIF,\n\t     cinfo->JFIF_major_version, cinfo->JFIF_minor_version,\n\t     cinfo->X_density, cinfo->Y_density, cinfo->density_unit);\n    /* Validate thumbnail dimensions and issue appropriate messages */\n    if (GETJOCTET(data[12]) | GETJOCTET(data[13]))\n      TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,\n\t       GETJOCTET(data[12]), GETJOCTET(data[13]));\n    totallen -= APP0_DATA_LEN;\n    if (totallen !=\n\t((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3))\n      TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen);\n  } else if (datalen >= 6 &&\n      GETJOCTET(data[0]) == 0x4A &&\n      GETJOCTET(data[1]) == 0x46 &&\n      GETJOCTET(data[2]) == 0x58 &&\n      GETJOCTET(data[3]) == 0x58 &&\n      GETJOCTET(data[4]) == 0) {\n    /* Found JFIF \"JFXX\" extension APP0 marker */\n    /* The library doesn't actually do anything with these,\n     * but we try to produce a helpful trace message.\n     */\n    switch (GETJOCTET(data[5])) {\n    case 0x10:\n      TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);\n      break;\n    case 0x11:\n      TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);\n      break;\n    case 0x13:\n      TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);\n      break;\n    default:\n      TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,\n\t       GETJOCTET(data[5]), (int) totallen);\n      break;\n    }\n  } else {\n    /* Start of APP0 does not match \"JFIF\" or \"JFXX\", or too short */\n    TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);\n  }\n}\n\n\nLOCAL(void)\nexamine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data,\n\t       unsigned int datalen, INT32 remaining)\n/* Examine first few bytes from an APP14.\n * Take appropriate action if it is an Adobe marker.\n * datalen is # of bytes at data[], remaining is length of rest of marker data.\n */\n{\n  unsigned int version, flags0, flags1, transform;\n\n  if (datalen >= APP14_DATA_LEN &&\n      GETJOCTET(data[0]) == 0x41 &&\n      GETJOCTET(data[1]) == 0x64 &&\n      GETJOCTET(data[2]) == 0x6F &&\n      GETJOCTET(data[3]) == 0x62 &&\n      GETJOCTET(data[4]) == 0x65) {\n    /* Found Adobe APP14 marker */\n    version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);\n    flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);\n    flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);\n    transform = GETJOCTET(data[11]);\n    TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);\n    cinfo->saw_Adobe_marker = TRUE;\n    cinfo->Adobe_transform = (UINT8) transform;\n  } else {\n    /* Start of APP14 does not match \"Adobe\", or too short */\n    TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));\n  }\n}\n\n\nMETHODDEF(boolean)\nget_interesting_appn (j_decompress_ptr cinfo)\n/* Process an APP0 or APP14 marker without saving it */\n{\n  INT32 length;\n  JOCTET b[APPN_DATA_LEN];\n  unsigned int i, numtoread;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n\n  /* get the interesting part of the marker data */\n  if (length >= APPN_DATA_LEN)\n    numtoread = APPN_DATA_LEN;\n  else if (length > 0)\n    numtoread = (unsigned int) length;\n  else\n    numtoread = 0;\n  for (i = 0; i < numtoread; i++)\n    INPUT_BYTE(cinfo, b[i], return FALSE);\n  length -= numtoread;\n\n  /* process it */\n  switch (cinfo->unread_marker) {\n  case M_APP0:\n    examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);\n    break;\n  case M_APP14:\n    examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);\n    break;\n  default:\n    /* can't get here unless jpeg_save_markers chooses wrong processor */\n    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);\n    break;\n  }\n\n  /* skip any remaining data -- could be lots */\n  INPUT_SYNC(cinfo);\n  if (length > 0)\n    (*cinfo->src->skip_input_data) (cinfo, (long) length);\n\n  return TRUE;\n}\n\n\n#ifdef SAVE_MARKERS_SUPPORTED\n\nMETHODDEF(boolean)\nsave_marker (j_decompress_ptr cinfo)\n/* Save an APPn or COM marker into the marker list */\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n  jpeg_saved_marker_ptr cur_marker = marker->cur_marker;\n  unsigned int bytes_read, data_length;\n  JOCTET FAR * data;\n  INT32 length = 0;\n  INPUT_VARS(cinfo);\n\n  if (cur_marker == NULL) {\n    /* begin reading a marker */\n    INPUT_2BYTES(cinfo, length, return FALSE);\n    length -= 2;\n    if (length >= 0) {\t\t/* watch out for bogus length word */\n      /* figure out how much we want to save */\n      unsigned int limit;\n      if (cinfo->unread_marker == (int) M_COM)\n\tlimit = marker->length_limit_COM;\n      else\n\tlimit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0];\n      if ((unsigned int) length < limit)\n\tlimit = (unsigned int) length;\n      /* allocate and initialize the marker item */\n      cur_marker = (jpeg_saved_marker_ptr)\n\t(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t    SIZEOF(struct jpeg_marker_struct) + limit);\n      cur_marker->next = NULL;\n      cur_marker->marker = (UINT8) cinfo->unread_marker;\n      cur_marker->original_length = (unsigned int) length;\n      cur_marker->data_length = limit;\n      /* data area is just beyond the jpeg_marker_struct */\n      data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1);\n      marker->cur_marker = cur_marker;\n      marker->bytes_read = 0;\n      bytes_read = 0;\n      data_length = limit;\n    } else {\n      /* deal with bogus length word */\n      bytes_read = data_length = 0;\n      data = NULL;\n    }\n  } else {\n    /* resume reading a marker */\n    bytes_read = marker->bytes_read;\n    data_length = cur_marker->data_length;\n    data = cur_marker->data + bytes_read;\n  }\n\n  while (bytes_read < data_length) {\n    INPUT_SYNC(cinfo);\t\t/* move the restart point to here */\n    marker->bytes_read = bytes_read;\n    /* If there's not at least one byte in buffer, suspend */\n    MAKE_BYTE_AVAIL(cinfo, return FALSE);\n    /* Copy bytes with reasonable rapidity */\n    while (bytes_read < data_length && bytes_in_buffer > 0) {\n      *data++ = *next_input_byte++;\n      bytes_in_buffer--;\n      bytes_read++;\n    }\n  }\n\n  /* Done reading what we want to read */\n  if (cur_marker != NULL) {\t/* will be NULL if bogus length word */\n    /* Add new marker to end of list */\n    if (cinfo->marker_list == NULL) {\n      cinfo->marker_list = cur_marker;\n    } else {\n      jpeg_saved_marker_ptr prev = cinfo->marker_list;\n      while (prev->next != NULL)\n\tprev = prev->next;\n      prev->next = cur_marker;\n    }\n    /* Reset pointer & calc remaining data length */\n    data = cur_marker->data;\n    length = cur_marker->original_length - data_length;\n  }\n  /* Reset to initial state for next marker */\n  marker->cur_marker = NULL;\n\n  /* Process the marker if interesting; else just make a generic trace msg */\n  switch (cinfo->unread_marker) {\n  case M_APP0:\n    examine_app0(cinfo, data, data_length, length);\n    break;\n  case M_APP14:\n    examine_app14(cinfo, data, data_length, length);\n    break;\n  default:\n    TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,\n\t     (int) (data_length + length));\n    break;\n  }\n\n  /* skip any remaining data -- could be lots */\n  INPUT_SYNC(cinfo);\t\t/* do before skip_input_data */\n  if (length > 0)\n    (*cinfo->src->skip_input_data) (cinfo, (long) length);\n\n  return TRUE;\n}\n\n#endif /* SAVE_MARKERS_SUPPORTED */\n\n\nMETHODDEF(boolean)\nskip_variable (j_decompress_ptr cinfo)\n/* Skip over an unknown or uninteresting variable-length marker */\n{\n  INT32 length;\n  INPUT_VARS(cinfo);\n\n  INPUT_2BYTES(cinfo, length, return FALSE);\n  length -= 2;\n  \n  TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);\n\n  INPUT_SYNC(cinfo);\t\t/* do before skip_input_data */\n  if (length > 0)\n    (*cinfo->src->skip_input_data) (cinfo, (long) length);\n\n  return TRUE;\n}\n\n\n/*\n * Find the next JPEG marker, save it in cinfo->unread_marker.\n * Returns FALSE if had to suspend before reaching a marker;\n * in that case cinfo->unread_marker is unchanged.\n *\n * Note that the result might not be a valid marker code,\n * but it will never be 0 or FF.\n */\n\nLOCAL(boolean)\nnext_marker (j_decompress_ptr cinfo)\n{\n  int c;\n  INPUT_VARS(cinfo);\n\n  for (;;) {\n    INPUT_BYTE(cinfo, c, return FALSE);\n    /* Skip any non-FF bytes.\n     * This may look a bit inefficient, but it will not occur in a valid file.\n     * We sync after each discarded byte so that a suspending data source\n     * can discard the byte from its buffer.\n     */\n    while (c != 0xFF) {\n      cinfo->marker->discarded_bytes++;\n      INPUT_SYNC(cinfo);\n      INPUT_BYTE(cinfo, c, return FALSE);\n    }\n    /* This loop swallows any duplicate FF bytes.  Extra FFs are legal as\n     * pad bytes, so don't count them in discarded_bytes.  We assume there\n     * will not be so many consecutive FF bytes as to overflow a suspending\n     * data source's input buffer.\n     */\n    do {\n      INPUT_BYTE(cinfo, c, return FALSE);\n    } while (c == 0xFF);\n    if (c != 0)\n      break;\t\t\t/* found a valid marker, exit loop */\n    /* Reach here if we found a stuffed-zero data sequence (FF/00).\n     * Discard it and loop back to try again.\n     */\n    cinfo->marker->discarded_bytes += 2;\n    INPUT_SYNC(cinfo);\n  }\n\n  if (cinfo->marker->discarded_bytes != 0) {\n    WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);\n    cinfo->marker->discarded_bytes = 0;\n  }\n\n  cinfo->unread_marker = c;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\nLOCAL(boolean)\nfirst_marker (j_decompress_ptr cinfo)\n/* Like next_marker, but used to obtain the initial SOI marker. */\n/* For this marker, we do not allow preceding garbage or fill; otherwise,\n * we might well scan an entire input file before realizing it ain't JPEG.\n * If an application wants to process non-JFIF files, it must seek to the\n * SOI before calling the JPEG library.\n */\n{\n  int c, c2;\n  INPUT_VARS(cinfo);\n\n  INPUT_BYTE(cinfo, c, return FALSE);\n  INPUT_BYTE(cinfo, c2, return FALSE);\n  if (c != 0xFF || c2 != (int) M_SOI)\n    ERREXIT2(cinfo, JERR_NO_SOI, c, c2);\n\n  cinfo->unread_marker = c2;\n\n  INPUT_SYNC(cinfo);\n  return TRUE;\n}\n\n\n/*\n * Read markers until SOS or EOI.\n *\n * Returns same codes as are defined for jpeg_consume_input:\n * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.\n *\n * Note: This function may return a pseudo SOS marker (with zero\n * component number) for treat by input controller's consume_input.\n * consume_input itself should filter out (skip) the pseudo marker\n * after processing for the caller.\n */\n\nMETHODDEF(int)\nread_markers (j_decompress_ptr cinfo)\n{\n  /* Outer loop repeats once for each marker. */\n  for (;;) {\n    /* Collect the marker proper, unless we already did. */\n    /* NB: first_marker() enforces the requirement that SOI appear first. */\n    if (cinfo->unread_marker == 0) {\n      if (! cinfo->marker->saw_SOI) {\n\tif (! first_marker(cinfo))\n\t  return JPEG_SUSPENDED;\n      } else {\n\tif (! next_marker(cinfo))\n\t  return JPEG_SUSPENDED;\n      }\n    }\n    /* At this point cinfo->unread_marker contains the marker code and the\n     * input point is just past the marker proper, but before any parameters.\n     * A suspension will cause us to return with this state still true.\n     */\n    switch (cinfo->unread_marker) {\n    case M_SOI:\n      if (! get_soi(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_SOF0:\t\t/* Baseline */\n      if (! get_sof(cinfo, TRUE, FALSE, FALSE))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_SOF1:\t\t/* Extended sequential, Huffman */\n      if (! get_sof(cinfo, FALSE, FALSE, FALSE))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_SOF2:\t\t/* Progressive, Huffman */\n      if (! get_sof(cinfo, FALSE, TRUE, FALSE))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_SOF9:\t\t/* Extended sequential, arithmetic */\n      if (! get_sof(cinfo, FALSE, FALSE, TRUE))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_SOF10:\t\t/* Progressive, arithmetic */\n      if (! get_sof(cinfo, FALSE, TRUE, TRUE))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    /* Currently unsupported SOFn types */\n    case M_SOF3:\t\t/* Lossless, Huffman */\n    case M_SOF5:\t\t/* Differential sequential, Huffman */\n    case M_SOF6:\t\t/* Differential progressive, Huffman */\n    case M_SOF7:\t\t/* Differential lossless, Huffman */\n    case M_JPG:\t\t\t/* Reserved for JPEG extensions */\n    case M_SOF11:\t\t/* Lossless, arithmetic */\n    case M_SOF13:\t\t/* Differential sequential, arithmetic */\n    case M_SOF14:\t\t/* Differential progressive, arithmetic */\n    case M_SOF15:\t\t/* Differential lossless, arithmetic */\n      ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);\n      break;\n\n    case M_SOS:\n      if (! get_sos(cinfo))\n\treturn JPEG_SUSPENDED;\n      cinfo->unread_marker = 0;\t/* processed the marker */\n      return JPEG_REACHED_SOS;\n\n    case M_EOI:\n      TRACEMS(cinfo, 1, JTRC_EOI);\n      cinfo->unread_marker = 0;\t/* processed the marker */\n      return JPEG_REACHED_EOI;\n\n    case M_DAC:\n      if (! get_dac(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_DHT:\n      if (! get_dht(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_DQT:\n      if (! get_dqt(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_DRI:\n      if (! get_dri(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_JPG8:\n      if (! get_lse(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_APP0:\n    case M_APP1:\n    case M_APP2:\n    case M_APP3:\n    case M_APP4:\n    case M_APP5:\n    case M_APP6:\n    case M_APP7:\n    case M_APP8:\n    case M_APP9:\n    case M_APP10:\n    case M_APP11:\n    case M_APP12:\n    case M_APP13:\n    case M_APP14:\n    case M_APP15:\n      if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[\n\t\tcinfo->unread_marker - (int) M_APP0]) (cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_COM:\n      if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    case M_RST0:\t\t/* these are all parameterless */\n    case M_RST1:\n    case M_RST2:\n    case M_RST3:\n    case M_RST4:\n    case M_RST5:\n    case M_RST6:\n    case M_RST7:\n    case M_TEM:\n      TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);\n      break;\n\n    case M_DNL:\t\t\t/* Ignore DNL ... perhaps the wrong thing */\n      if (! skip_variable(cinfo))\n\treturn JPEG_SUSPENDED;\n      break;\n\n    default:\t\t\t/* must be DHP, EXP, JPGn, or RESn */\n      /* For now, we treat the reserved markers as fatal errors since they are\n       * likely to be used to signal incompatible JPEG Part 3 extensions.\n       * Once the JPEG 3 version-number marker is well defined, this code\n       * ought to change!\n       */\n      ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);\n      break;\n    }\n    /* Successfully processed marker, so reset state variable */\n    cinfo->unread_marker = 0;\n  } /* end loop */\n}\n\n\n/*\n * Read a restart marker, which is expected to appear next in the datastream;\n * if the marker is not there, take appropriate recovery action.\n * Returns FALSE if suspension is required.\n *\n * This is called by the entropy decoder after it has read an appropriate\n * number of MCUs.  cinfo->unread_marker may be nonzero if the entropy decoder\n * has already read a marker from the data source.  Under normal conditions\n * cinfo->unread_marker will be reset to 0 before returning; if not reset,\n * it holds a marker which the decoder will be unable to read past.\n */\n\nMETHODDEF(boolean)\nread_restart_marker (j_decompress_ptr cinfo)\n{\n  /* Obtain a marker unless we already did. */\n  /* Note that next_marker will complain if it skips any data. */\n  if (cinfo->unread_marker == 0) {\n    if (! next_marker(cinfo))\n      return FALSE;\n  }\n\n  if (cinfo->unread_marker ==\n      ((int) M_RST0 + cinfo->marker->next_restart_num)) {\n    /* Normal case --- swallow the marker and let entropy decoder continue */\n    TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);\n    cinfo->unread_marker = 0;\n  } else {\n    /* Uh-oh, the restart markers have been messed up. */\n    /* Let the data source manager determine how to resync. */\n    if (! (*cinfo->src->resync_to_restart) (cinfo,\n\t\t\t\t\t    cinfo->marker->next_restart_num))\n      return FALSE;\n  }\n\n  /* Update next-restart state */\n  cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;\n\n  return TRUE;\n}\n\n\n/*\n * This is the default resync_to_restart method for data source managers\n * to use if they don't have any better approach.  Some data source managers\n * may be able to back up, or may have additional knowledge about the data\n * which permits a more intelligent recovery strategy; such managers would\n * presumably supply their own resync method.\n *\n * read_restart_marker calls resync_to_restart if it finds a marker other than\n * the restart marker it was expecting.  (This code is *not* used unless\n * a nonzero restart interval has been declared.)  cinfo->unread_marker is\n * the marker code actually found (might be anything, except 0 or FF).\n * The desired restart marker number (0..7) is passed as a parameter.\n * This routine is supposed to apply whatever error recovery strategy seems\n * appropriate in order to position the input stream to the next data segment.\n * Note that cinfo->unread_marker is treated as a marker appearing before\n * the current data-source input point; usually it should be reset to zero\n * before returning.\n * Returns FALSE if suspension is required.\n *\n * This implementation is substantially constrained by wanting to treat the\n * input as a data stream; this means we can't back up.  Therefore, we have\n * only the following actions to work with:\n *   1. Simply discard the marker and let the entropy decoder resume at next\n *      byte of file.\n *   2. Read forward until we find another marker, discarding intervening\n *      data.  (In theory we could look ahead within the current bufferload,\n *      without having to discard data if we don't find the desired marker.\n *      This idea is not implemented here, in part because it makes behavior\n *      dependent on buffer size and chance buffer-boundary positions.)\n *   3. Leave the marker unread (by failing to zero cinfo->unread_marker).\n *      This will cause the entropy decoder to process an empty data segment,\n *      inserting dummy zeroes, and then we will reprocess the marker.\n *\n * #2 is appropriate if we think the desired marker lies ahead, while #3 is\n * appropriate if the found marker is a future restart marker (indicating\n * that we have missed the desired restart marker, probably because it got\n * corrupted).\n * We apply #2 or #3 if the found marker is a restart marker no more than\n * two counts behind or ahead of the expected one.  We also apply #2 if the\n * found marker is not a legal JPEG marker code (it's certainly bogus data).\n * If the found marker is a restart marker more than 2 counts away, we do #1\n * (too much risk that the marker is erroneous; with luck we will be able to\n * resync at some future point).\n * For any valid non-restart JPEG marker, we apply #3.  This keeps us from\n * overrunning the end of a scan.  An implementation limited to single-scan\n * files might find it better to apply #2 for markers other than EOI, since\n * any other marker would have to be bogus data in that case.\n */\n\nGLOBAL(boolean)\njpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)\n{\n  int marker = cinfo->unread_marker;\n  int action = 1;\n  \n  /* Always put up a warning. */\n  WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);\n  \n  /* Outer loop handles repeated decision after scanning forward. */\n  for (;;) {\n    if (marker < (int) M_SOF0)\n      action = 2;\t\t/* invalid marker */\n    else if (marker < (int) M_RST0 || marker > (int) M_RST7)\n      action = 3;\t\t/* valid non-restart marker */\n    else {\n      if (marker == ((int) M_RST0 + ((desired+1) & 7)) ||\n\t  marker == ((int) M_RST0 + ((desired+2) & 7)))\n\taction = 3;\t\t/* one of the next two expected restarts */\n      else if (marker == ((int) M_RST0 + ((desired-1) & 7)) ||\n\t       marker == ((int) M_RST0 + ((desired-2) & 7)))\n\taction = 2;\t\t/* a prior restart, so advance */\n      else\n\taction = 1;\t\t/* desired restart or too far away */\n    }\n    TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);\n    switch (action) {\n    case 1:\n      /* Discard marker and let entropy decoder resume processing. */\n      cinfo->unread_marker = 0;\n      return TRUE;\n    case 2:\n      /* Scan to the next marker, and repeat the decision loop. */\n      if (! next_marker(cinfo))\n\treturn FALSE;\n      marker = cinfo->unread_marker;\n      break;\n    case 3:\n      /* Return without advancing past this marker. */\n      /* Entropy decoder will be forced to process an empty segment. */\n      return TRUE;\n    }\n  } /* end loop */\n}\n\n\n/*\n * Reset marker processing state to begin a fresh datastream.\n */\n\nMETHODDEF(void)\nreset_marker_reader (j_decompress_ptr cinfo)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n\n  cinfo->comp_info = NULL;\t\t/* until allocated by get_sof */\n  cinfo->input_scan_number = 0;\t\t/* no SOS seen yet */\n  cinfo->unread_marker = 0;\t\t/* no pending marker */\n  marker->pub.saw_SOI = FALSE;\t\t/* set internal state too */\n  marker->pub.saw_SOF = FALSE;\n  marker->pub.discarded_bytes = 0;\n  marker->cur_marker = NULL;\n}\n\n\n/*\n * Initialize the marker reader module.\n * This is called only once, when the decompression object is created.\n */\n\nGLOBAL(void)\njinit_marker_reader (j_decompress_ptr cinfo)\n{\n  my_marker_ptr marker;\n  int i;\n\n  /* Create subobject in permanent pool */\n  marker = (my_marker_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,\n\t\t\t\tSIZEOF(my_marker_reader));\n  cinfo->marker = &marker->pub;\n  /* Initialize public method pointers */\n  marker->pub.reset_marker_reader = reset_marker_reader;\n  marker->pub.read_markers = read_markers;\n  marker->pub.read_restart_marker = read_restart_marker;\n  /* Initialize COM/APPn processing.\n   * By default, we examine and then discard APP0 and APP14,\n   * but simply discard COM and all other APPn.\n   */\n  marker->process_COM = skip_variable;\n  marker->length_limit_COM = 0;\n  for (i = 0; i < 16; i++) {\n    marker->process_APPn[i] = skip_variable;\n    marker->length_limit_APPn[i] = 0;\n  }\n  marker->process_APPn[0] = get_interesting_appn;\n  marker->process_APPn[14] = get_interesting_appn;\n  /* Reset marker processing state */\n  reset_marker_reader(cinfo);\n}\n\n\n/*\n * Control saving of COM and APPn markers into marker_list.\n */\n\n#ifdef SAVE_MARKERS_SUPPORTED\n\nGLOBAL(void)\njpeg_save_markers (j_decompress_ptr cinfo, int marker_code,\n\t\t   unsigned int length_limit)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n  long maxlength;\n  jpeg_marker_parser_method processor;\n\n  /* Length limit mustn't be larger than what we can allocate\n   * (should only be a concern in a 16-bit environment).\n   */\n  maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);\n  if (((long) length_limit) > maxlength)\n    length_limit = (unsigned int) maxlength;\n\n  /* Choose processor routine to use.\n   * APP0/APP14 have special requirements.\n   */\n  if (length_limit) {\n    processor = save_marker;\n    /* If saving APP0/APP14, save at least enough for our internal use. */\n    if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN)\n      length_limit = APP0_DATA_LEN;\n    else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN)\n      length_limit = APP14_DATA_LEN;\n  } else {\n    processor = skip_variable;\n    /* If discarding APP0/APP14, use our regular on-the-fly processor. */\n    if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14)\n      processor = get_interesting_appn;\n  }\n\n  if (marker_code == (int) M_COM) {\n    marker->process_COM = processor;\n    marker->length_limit_COM = length_limit;\n  } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) {\n    marker->process_APPn[marker_code - (int) M_APP0] = processor;\n    marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit;\n  } else\n    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);\n}\n\n#endif /* SAVE_MARKERS_SUPPORTED */\n\n\n/*\n * Install a special processing method for COM or APPn markers.\n */\n\nGLOBAL(void)\njpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,\n\t\t\t   jpeg_marker_parser_method routine)\n{\n  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;\n\n  if (marker_code == (int) M_COM)\n    marker->process_COM = routine;\n  else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)\n    marker->process_APPn[marker_code - (int) M_APP0] = routine;\n  else\n    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdmaster.c",
    "content": "/*\n * jdmaster.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 2002-2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains master control logic for the JPEG decompressor.\n * These routines are concerned with selecting the modules to be executed\n * and with determining the number of passes and the work to be done in each\n * pass.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private state */\n\ntypedef struct {\n  struct jpeg_decomp_master pub; /* public fields */\n\n  int pass_number;\t\t/* # of passes completed */\n\n  boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */\n\n  /* Saved references to initialized quantizer modules,\n   * in case we need to switch modes.\n   */\n  struct jpeg_color_quantizer * quantizer_1pass;\n  struct jpeg_color_quantizer * quantizer_2pass;\n} my_decomp_master;\n\ntypedef my_decomp_master * my_master_ptr;\n\n\n/*\n * Determine whether merged upsample/color conversion should be used.\n * CRUCIAL: this must match the actual capabilities of jdmerge.c!\n */\n\nLOCAL(boolean)\nuse_merged_upsample (j_decompress_ptr cinfo)\n{\n#ifdef UPSAMPLE_MERGING_SUPPORTED\n  /* Merging is the equivalent of plain box-filter upsampling */\n  if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)\n    return FALSE;\n  /* jdmerge.c only supports YCC=>RGB color conversion */\n  if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||\n      cinfo->out_color_space != JCS_RGB ||\n      cinfo->out_color_components != RGB_PIXELSIZE)\n    return FALSE;\n  /* and it only handles 2h1v or 2h2v sampling ratios */\n  if (cinfo->comp_info[0].h_samp_factor != 2 ||\n      cinfo->comp_info[1].h_samp_factor != 1 ||\n      cinfo->comp_info[2].h_samp_factor != 1 ||\n      cinfo->comp_info[0].v_samp_factor >  2 ||\n      cinfo->comp_info[1].v_samp_factor != 1 ||\n      cinfo->comp_info[2].v_samp_factor != 1)\n    return FALSE;\n  /* furthermore, it doesn't work if we've scaled the IDCTs differently */\n  if (cinfo->comp_info[0].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size ||\n      cinfo->comp_info[1].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size ||\n      cinfo->comp_info[2].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size ||\n      cinfo->comp_info[0].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size ||\n      cinfo->comp_info[1].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size ||\n      cinfo->comp_info[2].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size)\n    return FALSE;\n  /* ??? also need to test for upsample-time rescaling, when & if supported */\n  return TRUE;\t\t\t/* by golly, it'll work... */\n#else\n  return FALSE;\n#endif\n}\n\n\n/*\n * Compute output image dimensions and related values.\n * NOTE: this is exported for possible use by application.\n * Hence it mustn't do anything that can't be done twice.\n * Also note that it may be called before the master module is initialized!\n */\n\nGLOBAL(void)\njpeg_calc_output_dimensions (j_decompress_ptr cinfo)\n/* Do computations that are needed before master selection phase.\n * This function is used for full decompression.\n */\n{\n#ifdef IDCT_SCALING_SUPPORTED\n  int ci;\n  jpeg_component_info *compptr;\n#endif\n\n  /* Prevent application from calling me at wrong times */\n  if (cinfo->global_state != DSTATE_READY)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  /* Compute core output image dimensions and DCT scaling choices. */\n  jpeg_core_output_dimensions(cinfo);\n\n#ifdef IDCT_SCALING_SUPPORTED\n\n  /* In selecting the actual DCT scaling for each component, we try to\n   * scale up the chroma components via IDCT scaling rather than upsampling.\n   * This saves time if the upsampler gets to use 1:1 scaling.\n   * Note this code adapts subsampling ratios which are powers of 2.\n   */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    int ssize = 1;\n    while (cinfo->min_DCT_h_scaled_size * ssize <=\n\t   (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&\n\t   (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) {\n      ssize = ssize * 2;\n    }\n    compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;\n    ssize = 1;\n    while (cinfo->min_DCT_v_scaled_size * ssize <=\n\t   (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&\n\t   (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) {\n      ssize = ssize * 2;\n    }\n    compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;\n\n    /* We don't support IDCT ratios larger than 2. */\n    if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2)\n\tcompptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2;\n    else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2)\n\tcompptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2;\n  }\n\n  /* Recompute downsampled dimensions of components;\n   * application needs to know these if using raw downsampled data.\n   */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Size in samples, after IDCT scaling */\n    compptr->downsampled_width = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_width *\n\t\t    (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size),\n\t\t    (long) (cinfo->max_h_samp_factor * cinfo->block_size));\n    compptr->downsampled_height = (JDIMENSION)\n      jdiv_round_up((long) cinfo->image_height *\n\t\t    (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),\n\t\t    (long) (cinfo->max_v_samp_factor * cinfo->block_size));\n  }\n\n#endif /* IDCT_SCALING_SUPPORTED */\n\n  /* Report number of components in selected colorspace. */\n  /* Probably this should be in the color conversion module... */\n  switch (cinfo->out_color_space) {\n  case JCS_GRAYSCALE:\n    cinfo->out_color_components = 1;\n    break;\n  case JCS_RGB:\n    cinfo->out_color_components = RGB_PIXELSIZE;\n    break;\n  case JCS_YCbCr:\n    cinfo->out_color_components = 3;\n    break;\n  case JCS_CMYK:\n  case JCS_YCCK:\n    cinfo->out_color_components = 4;\n    break;\n  default:\t\t\t/* else must be same colorspace as in file */\n    cinfo->out_color_components = cinfo->num_components;\n    break;\n  }\n  cinfo->output_components = (cinfo->quantize_colors ? 1 :\n\t\t\t      cinfo->out_color_components);\n\n  /* See if upsampler will want to emit more than one row at a time */\n  if (use_merged_upsample(cinfo))\n    cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;\n  else\n    cinfo->rec_outbuf_height = 1;\n}\n\n\n/*\n * Several decompression processes need to range-limit values to the range\n * 0..MAXJSAMPLE; the input value may fall somewhat outside this range\n * due to noise introduced by quantization, roundoff error, etc.  These\n * processes are inner loops and need to be as fast as possible.  On most\n * machines, particularly CPUs with pipelines or instruction prefetch,\n * a (subscript-check-less) C table lookup\n *\t\tx = sample_range_limit[x];\n * is faster than explicit tests\n *\t\tif (x < 0)  x = 0;\n *\t\telse if (x > MAXJSAMPLE)  x = MAXJSAMPLE;\n * These processes all use a common table prepared by the routine below.\n *\n * For most steps we can mathematically guarantee that the initial value\n * of x is within MAXJSAMPLE+1 of the legal range, so a table running from\n * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial\n * limiting step (just after the IDCT), a wildly out-of-range value is \n * possible if the input data is corrupt.  To avoid any chance of indexing\n * off the end of memory and getting a bad-pointer trap, we perform the\n * post-IDCT limiting thus:\n *\t\tx = range_limit[x & MASK];\n * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit\n * samples.  Under normal circumstances this is more than enough range and\n * a correct output will be generated; with bogus input data the mask will\n * cause wraparound, and we will safely generate a bogus-but-in-range output.\n * For the post-IDCT step, we want to convert the data from signed to unsigned\n * representation by adding CENTERJSAMPLE at the same time that we limit it.\n * So the post-IDCT limiting table ends up looking like this:\n *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,\n *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),\n *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),\n *   0,1,...,CENTERJSAMPLE-1\n * Negative inputs select values from the upper half of the table after\n * masking.\n *\n * We can save some space by overlapping the start of the post-IDCT table\n * with the simpler range limiting table.  The post-IDCT table begins at\n * sample_range_limit + CENTERJSAMPLE.\n *\n * Note that the table is allocated in near data space on PCs; it's small\n * enough and used often enough to justify this.\n */\n\nLOCAL(void)\nprepare_range_limit_table (j_decompress_ptr cinfo)\n/* Allocate and fill in the sample_range_limit table */\n{\n  JSAMPLE * table;\n  int i;\n\n  table = (JSAMPLE *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t(5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));\n  table += (MAXJSAMPLE+1);\t/* allow negative subscripts of simple table */\n  cinfo->sample_range_limit = table;\n  /* First segment of \"simple\" table: limit[x] = 0 for x < 0 */\n  MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));\n  /* Main part of \"simple\" table: limit[x] = x */\n  for (i = 0; i <= MAXJSAMPLE; i++)\n    table[i] = (JSAMPLE) i;\n  table += CENTERJSAMPLE;\t/* Point to where post-IDCT table starts */\n  /* End of simple table, rest of first half of post-IDCT table */\n  for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)\n    table[i] = MAXJSAMPLE;\n  /* Second half of post-IDCT table */\n  MEMZERO(table + (2 * (MAXJSAMPLE+1)),\n\t  (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));\n  MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),\n\t  cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));\n}\n\n\n/*\n * Master selection of decompression modules.\n * This is done once at jpeg_start_decompress time.  We determine\n * which modules will be used and give them appropriate initialization calls.\n * We also initialize the decompressor input side to begin consuming data.\n *\n * Since jpeg_read_header has finished, we know what is in the SOF\n * and (first) SOS markers.  We also have all the application parameter\n * settings.\n */\n\nLOCAL(void)\nmaster_selection (j_decompress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n  boolean use_c_buffer;\n  long samplesperrow;\n  JDIMENSION jd_samplesperrow;\n\n  /* Initialize dimensions and other stuff */\n  jpeg_calc_output_dimensions(cinfo);\n  prepare_range_limit_table(cinfo);\n\n  /* Width of an output scanline must be representable as JDIMENSION. */\n  samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;\n  jd_samplesperrow = (JDIMENSION) samplesperrow;\n  if ((long) jd_samplesperrow != samplesperrow)\n    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);\n\n  /* Initialize my private state */\n  master->pass_number = 0;\n  master->using_merged_upsample = use_merged_upsample(cinfo);\n\n  /* Color quantizer selection */\n  master->quantizer_1pass = NULL;\n  master->quantizer_2pass = NULL;\n  /* No mode changes if not using buffered-image mode. */\n  if (! cinfo->quantize_colors || ! cinfo->buffered_image) {\n    cinfo->enable_1pass_quant = FALSE;\n    cinfo->enable_external_quant = FALSE;\n    cinfo->enable_2pass_quant = FALSE;\n  }\n  if (cinfo->quantize_colors) {\n    if (cinfo->raw_data_out)\n      ERREXIT(cinfo, JERR_NOTIMPL);\n    /* 2-pass quantizer only works in 3-component color space. */\n    if (cinfo->out_color_components != 3 ||\n        cinfo->out_color_space == JCS_RGB565) {\n      cinfo->enable_1pass_quant = TRUE;\n      cinfo->enable_external_quant = FALSE;\n      cinfo->enable_2pass_quant = FALSE;\n      cinfo->colormap = NULL;\n    } else if (cinfo->colormap != NULL) {\n      cinfo->enable_external_quant = TRUE;\n    } else if (cinfo->two_pass_quantize) {\n      cinfo->enable_2pass_quant = TRUE;\n    } else {\n      cinfo->enable_1pass_quant = TRUE;\n    }\n\n    if (cinfo->enable_1pass_quant) {\n#ifdef QUANT_1PASS_SUPPORTED\n      jinit_1pass_quantizer(cinfo);\n      master->quantizer_1pass = cinfo->cquantize;\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    }\n\n    /* We use the 2-pass code to map to external colormaps. */\n    if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {\n#ifdef QUANT_2PASS_SUPPORTED\n      jinit_2pass_quantizer(cinfo);\n      master->quantizer_2pass = cinfo->cquantize;\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    }\n    /* If both quantizers are initialized, the 2-pass one is left active;\n     * this is necessary for starting with quantization to an external map.\n     */\n  }\n\n  /* Post-processing: in particular, color conversion first */\n  if (! cinfo->raw_data_out) {\n    if (master->using_merged_upsample) {\n#ifdef UPSAMPLE_MERGING_SUPPORTED\n      jinit_merged_upsampler(cinfo); /* does color conversion too */\n#else\n      ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif\n    } else {\n      jinit_color_deconverter(cinfo);\n      jinit_upsampler(cinfo);\n    }\n    jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);\n  }\n  /* Inverse DCT */\n  jinit_inverse_dct(cinfo);\n  /* Entropy decoding: either Huffman or arithmetic coding. */\n  if (cinfo->arith_code)\n    jinit_arith_decoder(cinfo);\n  else {\n    jinit_huff_decoder(cinfo);\n  }\n\n  /* Initialize principal buffer controllers. */\n  use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;\n  jinit_d_coef_controller(cinfo, use_c_buffer);\n\n  if (! cinfo->raw_data_out)\n    jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);\n\n  /* We can now tell the memory manager to allocate virtual arrays. */\n  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);\n\n  /* Initialize input side of decompressor to consume first scan. */\n  (*cinfo->inputctl->start_input_pass) (cinfo);\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n  /* If jpeg_start_decompress will read the whole file, initialize\n   * progress monitoring appropriately.  The input step is counted\n   * as one pass.\n   */\n  if (cinfo->progress != NULL && ! cinfo->buffered_image &&\n      cinfo->inputctl->has_multiple_scans) {\n    int nscans;\n    /* Estimate number of scans to set pass_limit. */\n    if (cinfo->progressive_mode) {\n      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */\n      nscans = 2 + 3 * cinfo->num_components;\n    } else {\n      /* For a nonprogressive multiscan file, estimate 1 scan per component. */\n      nscans = cinfo->num_components;\n    }\n    cinfo->progress->pass_counter = 0L;\n    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;\n    cinfo->progress->completed_passes = 0;\n    cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);\n    /* Count the input pass as done */\n    master->pass_number++;\n  }\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n}\n\n\n/*\n * Per-pass setup.\n * This is called at the beginning of each output pass.  We determine which\n * modules will be active during this pass and give them appropriate\n * start_pass calls.  We also set is_dummy_pass to indicate whether this\n * is a \"real\" output pass or a dummy pass for color quantization.\n * (In the latter case, jdapistd.c will crank the pass to completion.)\n */\n\nMETHODDEF(void)\nprepare_for_output_pass (j_decompress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  if (master->pub.is_dummy_pass) {\n#ifdef QUANT_2PASS_SUPPORTED\n    /* Final pass of 2-pass quantization */\n    master->pub.is_dummy_pass = FALSE;\n    (*cinfo->cquantize->start_pass) (cinfo, FALSE);\n    (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);\n    (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);\n#else\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n#endif /* QUANT_2PASS_SUPPORTED */\n  } else {\n    if (cinfo->quantize_colors && cinfo->colormap == NULL) {\n      /* Select new quantization method */\n      if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {\n\tcinfo->cquantize = master->quantizer_2pass;\n\tmaster->pub.is_dummy_pass = TRUE;\n      } else if (cinfo->enable_1pass_quant) {\n\tcinfo->cquantize = master->quantizer_1pass;\n      } else {\n\tERREXIT(cinfo, JERR_MODE_CHANGE);\n      }\n    }\n    (*cinfo->idct->start_pass) (cinfo);\n    (*cinfo->coef->start_output_pass) (cinfo);\n    if (! cinfo->raw_data_out) {\n      if (! master->using_merged_upsample)\n\t(*cinfo->cconvert->start_pass) (cinfo);\n      (*cinfo->upsample->start_pass) (cinfo);\n      if (cinfo->quantize_colors)\n\t(*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);\n      (*cinfo->post->start_pass) (cinfo,\n\t    (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));\n      (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);\n    }\n  }\n\n  /* Set up progress monitor's pass info if present */\n  if (cinfo->progress != NULL) {\n    cinfo->progress->completed_passes = master->pass_number;\n    cinfo->progress->total_passes = master->pass_number +\n\t\t\t\t    (master->pub.is_dummy_pass ? 2 : 1);\n    /* In buffered-image mode, we assume one more output pass if EOI not\n     * yet reached, but no more passes if EOI has been reached.\n     */\n    if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {\n      cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);\n    }\n  }\n}\n\n\n/*\n * Finish up at end of an output pass.\n */\n\nMETHODDEF(void)\nfinish_output_pass (j_decompress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  if (cinfo->quantize_colors)\n    (*cinfo->cquantize->finish_pass) (cinfo);\n  master->pass_number++;\n}\n\n\n#ifdef D_MULTISCAN_FILES_SUPPORTED\n\n/*\n * Switch to a new external colormap between output passes.\n */\n\nGLOBAL(void)\njpeg_new_colormap (j_decompress_ptr cinfo)\n{\n  my_master_ptr master = (my_master_ptr) cinfo->master;\n\n  /* Prevent application from calling me at wrong times */\n  if (cinfo->global_state != DSTATE_BUFIMAGE)\n    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n\n  if (cinfo->quantize_colors && cinfo->enable_external_quant &&\n      cinfo->colormap != NULL) {\n    /* Select 2-pass quantizer for external colormap use */\n    cinfo->cquantize = master->quantizer_2pass;\n    /* Notify quantizer of colormap change */\n    (*cinfo->cquantize->new_color_map) (cinfo);\n    master->pub.is_dummy_pass = FALSE; /* just in case */\n  } else\n    ERREXIT(cinfo, JERR_MODE_CHANGE);\n}\n\n#endif /* D_MULTISCAN_FILES_SUPPORTED */\n\n\n/*\n * Initialize master decompression control and select active modules.\n * This is performed at the start of jpeg_start_decompress.\n */\n\nGLOBAL(void)\njinit_master_decompress (j_decompress_ptr cinfo)\n{\n  my_master_ptr master;\n\n  master = (my_master_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(my_decomp_master));\n  cinfo->master = (struct jpeg_decomp_master *) master;\n  master->pub.prepare_for_output_pass = prepare_for_output_pass;\n  master->pub.finish_output_pass = finish_output_pass;\n\n  master->pub.is_dummy_pass = FALSE;\n\n  master_selection(cinfo);\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdmerge.c",
    "content": "/*\n * jdmerge.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains code for merged upsampling/color conversion.\n *\n * This file combines functions from jdsample.c and jdcolor.c;\n * read those files first to understand what's going on.\n *\n * When the chroma components are to be upsampled by simple replication\n * (ie, box filtering), we can save some work in color conversion by\n * calculating all the output pixels corresponding to a pair of chroma\n * samples at one time.  In the conversion equations\n *\tR = Y           + K1 * Cr\n *\tG = Y + K2 * Cb + K3 * Cr\n *\tB = Y + K4 * Cb\n * only the Y term varies among the group of pixels corresponding to a pair\n * of chroma samples, so the rest of the terms can be calculated just once.\n * At typical sampling ratios, this eliminates half or three-quarters of the\n * multiplications needed for color conversion.\n *\n * This file currently provides implementations for the following cases:\n *\tYCbCr => RGB color conversion only.\n *\tSampling ratios of 2h1v or 2h2v.\n *\tNo scaling needed at upsample time.\n *\tCorner-aligned (non-CCIR601) sampling alignment.\n * Other special cases could be added, but in most applications these are\n * the only common cases.  (For uncommon cases we fall back on the more\n * general code in jdsample.c and jdcolor.c.)\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n#ifdef UPSAMPLE_MERGING_SUPPORTED\n\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_upsampler pub;\t/* public fields */\n\n  /* Pointer to routine to do actual upsampling/conversion of one row group */\n  JMETHOD(void, upmethod, (j_decompress_ptr cinfo,\n\t\t\t   JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,\n\t\t\t   JSAMPARRAY output_buf));\n\n  /* Private state for YCC->RGB conversion */\n  int * Cr_r_tab;\t\t/* => table for Cr to R conversion */\n  int * Cb_b_tab;\t\t/* => table for Cb to B conversion */\n  INT32 * Cr_g_tab;\t\t/* => table for Cr to G conversion */\n  INT32 * Cb_g_tab;\t\t/* => table for Cb to G conversion */\n\n  /* For 2:1 vertical sampling, we produce two output rows at a time.\n   * We need a \"spare\" row buffer to hold the second output row if the\n   * application provides just a one-row buffer; we also use the spare\n   * to discard the dummy last row if the image height is odd.\n   */\n  JSAMPROW spare_row;\n  boolean spare_full;\t\t/* T if spare buffer is occupied */\n\n  JDIMENSION out_row_width;\t/* samples per output row */\n  JDIMENSION rows_to_go;\t/* counts rows remaining in image */\n} my_upsampler;\n\ntypedef my_upsampler * my_upsample_ptr;\n\n#define SCALEBITS\t16\t/* speediest right-shift on some machines */\n#define ONE_HALF\t((INT32) 1 << (SCALEBITS-1))\n#define FIX(x)\t\t((INT32) ((x) * (1L<<SCALEBITS) + 0.5))\n\n\n/*\n * Initialize tables for YCC->RGB colorspace conversion.\n * This is taken directly from jdcolor.c; see that file for more info.\n */\n\nLOCAL(void)\nbuild_ycc_rgb_table (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  int i;\n  INT32 x;\n  SHIFT_TEMPS\n\n  upsample->Cr_r_tab = (int *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(int));\n  upsample->Cb_b_tab = (int *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(int));\n  upsample->Cr_g_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(INT32));\n  upsample->Cb_g_tab = (INT32 *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(MAXJSAMPLE+1) * SIZEOF(INT32));\n\n  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {\n    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */\n    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */\n    /* Cr=>R value is nearest int to 1.40200 * x */\n    upsample->Cr_r_tab[i] = (int)\n\t\t    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);\n    /* Cb=>B value is nearest int to 1.77200 * x */\n    upsample->Cb_b_tab[i] = (int)\n\t\t    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);\n    /* Cr=>G value is scaled-up -0.71414 * x */\n    upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;\n    /* Cb=>G value is scaled-up -0.34414 * x */\n    /* We also add in ONE_HALF so that need not do it in inner loop */\n    upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;\n  }\n}\n\n\n/*\n * Initialize for an upsampling pass.\n */\n\nMETHODDEF(void)\nstart_pass_merged_upsample (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n\n  /* Mark the spare buffer empty */\n  upsample->spare_full = FALSE;\n  /* Initialize total-height counter for detecting bottom of image */\n  upsample->rows_to_go = cinfo->output_height;\n}\n\n\n/*\n * Control routine to do upsampling (and color conversion).\n *\n * The control routine just handles the row buffering considerations.\n */\n\nMETHODDEF(void)\nmerged_2v_upsample (j_decompress_ptr cinfo,\n\t\t    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t    JDIMENSION in_row_groups_avail,\n\t\t    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t    JDIMENSION out_rows_avail)\n/* 2:1 vertical sampling case: may need a spare row. */\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  JSAMPROW work_ptrs[2];\n  JDIMENSION num_rows;\t\t/* number of rows returned to caller */\n\n  if (upsample->spare_full) {\n    /* If we have a spare row saved from a previous cycle, just return it. */\n    jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,\n\t\t      1, upsample->out_row_width);\n    num_rows = 1;\n    upsample->spare_full = FALSE;\n  } else {\n    /* Figure number of rows to return to caller. */\n    num_rows = 2;\n    /* Not more than the distance to the end of the image. */\n    if (num_rows > upsample->rows_to_go)\n      num_rows = upsample->rows_to_go;\n    /* And not more than what the client can accept: */\n    out_rows_avail -= *out_row_ctr;\n    if (num_rows > out_rows_avail)\n      num_rows = out_rows_avail;\n    /* Create output pointer array for upsampler. */\n    work_ptrs[0] = output_buf[*out_row_ctr];\n    if (num_rows > 1) {\n      work_ptrs[1] = output_buf[*out_row_ctr + 1];\n    } else {\n      work_ptrs[1] = upsample->spare_row;\n      upsample->spare_full = TRUE;\n    }\n    /* Now do the upsampling. */\n    (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);\n  }\n\n  /* Adjust counts */\n  *out_row_ctr += num_rows;\n  upsample->rows_to_go -= num_rows;\n  /* When the buffer is emptied, declare this input row group consumed */\n  if (! upsample->spare_full)\n    (*in_row_group_ctr)++;\n}\n\n\nMETHODDEF(void)\nmerged_1v_upsample (j_decompress_ptr cinfo,\n\t\t    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t    JDIMENSION in_row_groups_avail,\n\t\t    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t    JDIMENSION out_rows_avail)\n/* 1:1 vertical sampling case: much easier, never need a spare row. */\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n\n  /* Just do the upsampling. */\n  (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,\n\t\t\t output_buf + *out_row_ctr);\n  /* Adjust counts */\n  (*out_row_ctr)++;\n  (*in_row_group_ctr)++;\n}\n\n\n/*\n * These are the routines invoked by the control routines to do\n * the actual upsampling/conversion.  One row group is processed per call.\n *\n * Note: since we may be writing directly into application-supplied buffers,\n * we have to be honest about the output width; we can't assume the buffer\n * has been rounded up to an even width.\n */\n\n\n/*\n * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.\n */\n\nMETHODDEF(void)\nh2v1_merged_upsample (j_decompress_ptr cinfo,\n\t\t      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,\n\t\t      JSAMPARRAY output_buf)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  register int y, cred, cgreen, cblue;\n  int cb, cr;\n  register JSAMPROW outptr;\n  JSAMPROW inptr0, inptr1, inptr2;\n  JDIMENSION col;\n  /* copy these pointers into registers if possible */\n  register JSAMPLE * range_limit = cinfo->sample_range_limit;\n  int * Crrtab = upsample->Cr_r_tab;\n  int * Cbbtab = upsample->Cb_b_tab;\n  INT32 * Crgtab = upsample->Cr_g_tab;\n  INT32 * Cbgtab = upsample->Cb_g_tab;\n  SHIFT_TEMPS\n\n  inptr0 = input_buf[0][in_row_group_ctr];\n  inptr1 = input_buf[1][in_row_group_ctr];\n  inptr2 = input_buf[2][in_row_group_ctr];\n  outptr = output_buf[0];\n  /* Loop for each pair of output pixels */\n  for (col = cinfo->output_width >> 1; col > 0; col--) {\n    /* Do the chroma part of the calculation */\n    cb = GETJSAMPLE(*inptr1++);\n    cr = GETJSAMPLE(*inptr2++);\n    cred = Crrtab[cr];\n    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);\n    cblue = Cbbtab[cb];\n    /* Fetch 2 Y values and emit 2 pixels */\n    y  = GETJSAMPLE(*inptr0++);\n    outptr[RGB_RED] =   range_limit[y + cred];\n    outptr[RGB_GREEN] = range_limit[y + cgreen];\n    outptr[RGB_BLUE] =  range_limit[y + cblue];\n    outptr += RGB_PIXELSIZE;\n    y  = GETJSAMPLE(*inptr0++);\n    outptr[RGB_RED] =   range_limit[y + cred];\n    outptr[RGB_GREEN] = range_limit[y + cgreen];\n    outptr[RGB_BLUE] =  range_limit[y + cblue];\n    outptr += RGB_PIXELSIZE;\n  }\n  /* If image width is odd, do the last output column separately */\n  if (cinfo->output_width & 1) {\n    cb = GETJSAMPLE(*inptr1);\n    cr = GETJSAMPLE(*inptr2);\n    cred = Crrtab[cr];\n    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);\n    cblue = Cbbtab[cb];\n    y  = GETJSAMPLE(*inptr0);\n    outptr[RGB_RED] =   range_limit[y + cred];\n    outptr[RGB_GREEN] = range_limit[y + cgreen];\n    outptr[RGB_BLUE] =  range_limit[y + cblue];\n  }\n}\n\n\n/*\n * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.\n */\n\nMETHODDEF(void)\nh2v2_merged_upsample (j_decompress_ptr cinfo,\n\t\t      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,\n\t\t      JSAMPARRAY output_buf)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  register int y, cred, cgreen, cblue;\n  int cb, cr;\n  register JSAMPROW outptr0, outptr1;\n  JSAMPROW inptr00, inptr01, inptr1, inptr2;\n  JDIMENSION col;\n  /* copy these pointers into registers if possible */\n  register JSAMPLE * range_limit = cinfo->sample_range_limit;\n  int * Crrtab = upsample->Cr_r_tab;\n  int * Cbbtab = upsample->Cb_b_tab;\n  INT32 * Crgtab = upsample->Cr_g_tab;\n  INT32 * Cbgtab = upsample->Cb_g_tab;\n  SHIFT_TEMPS\n\n  inptr00 = input_buf[0][in_row_group_ctr*2];\n  inptr01 = input_buf[0][in_row_group_ctr*2 + 1];\n  inptr1 = input_buf[1][in_row_group_ctr];\n  inptr2 = input_buf[2][in_row_group_ctr];\n  outptr0 = output_buf[0];\n  outptr1 = output_buf[1];\n  /* Loop for each group of output pixels */\n  for (col = cinfo->output_width >> 1; col > 0; col--) {\n    /* Do the chroma part of the calculation */\n    cb = GETJSAMPLE(*inptr1++);\n    cr = GETJSAMPLE(*inptr2++);\n    cred = Crrtab[cr];\n    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);\n    cblue = Cbbtab[cb];\n    /* Fetch 4 Y values and emit 4 pixels */\n    y  = GETJSAMPLE(*inptr00++);\n    outptr0[RGB_RED] =   range_limit[y + cred];\n    outptr0[RGB_GREEN] = range_limit[y + cgreen];\n    outptr0[RGB_BLUE] =  range_limit[y + cblue];\n    outptr0 += RGB_PIXELSIZE;\n    y  = GETJSAMPLE(*inptr00++);\n    outptr0[RGB_RED] =   range_limit[y + cred];\n    outptr0[RGB_GREEN] = range_limit[y + cgreen];\n    outptr0[RGB_BLUE] =  range_limit[y + cblue];\n    outptr0 += RGB_PIXELSIZE;\n    y  = GETJSAMPLE(*inptr01++);\n    outptr1[RGB_RED] =   range_limit[y + cred];\n    outptr1[RGB_GREEN] = range_limit[y + cgreen];\n    outptr1[RGB_BLUE] =  range_limit[y + cblue];\n    outptr1 += RGB_PIXELSIZE;\n    y  = GETJSAMPLE(*inptr01++);\n    outptr1[RGB_RED] =   range_limit[y + cred];\n    outptr1[RGB_GREEN] = range_limit[y + cgreen];\n    outptr1[RGB_BLUE] =  range_limit[y + cblue];\n    outptr1 += RGB_PIXELSIZE;\n  }\n  /* If image width is odd, do the last output column separately */\n  if (cinfo->output_width & 1) {\n    cb = GETJSAMPLE(*inptr1);\n    cr = GETJSAMPLE(*inptr2);\n    cred = Crrtab[cr];\n    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);\n    cblue = Cbbtab[cb];\n    y  = GETJSAMPLE(*inptr00);\n    outptr0[RGB_RED] =   range_limit[y + cred];\n    outptr0[RGB_GREEN] = range_limit[y + cgreen];\n    outptr0[RGB_BLUE] =  range_limit[y + cblue];\n    y  = GETJSAMPLE(*inptr01);\n    outptr1[RGB_RED] =   range_limit[y + cred];\n    outptr1[RGB_GREEN] = range_limit[y + cgreen];\n    outptr1[RGB_BLUE] =  range_limit[y + cblue];\n  }\n}\n\n\n/*\n * Module initialization routine for merged upsampling/color conversion.\n *\n * NB: this is called under the conditions determined by use_merged_upsample()\n * in jdmaster.c.  That routine MUST correspond to the actual capabilities\n * of this module; no safety checks are made here.\n */\n\nGLOBAL(void)\njinit_merged_upsampler (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample;\n\n  upsample = (my_upsample_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_upsampler));\n  cinfo->upsample = (struct jpeg_upsampler *) upsample;\n  upsample->pub.start_pass = start_pass_merged_upsample;\n  upsample->pub.need_context_rows = FALSE;\n\n  upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;\n\n  if (cinfo->max_v_samp_factor == 2) {\n    upsample->pub.upsample = merged_2v_upsample;\n    upsample->upmethod = h2v2_merged_upsample;\n    /* Allocate a spare row buffer */\n    upsample->spare_row = (JSAMPROW)\n      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t(size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));\n  } else {\n    upsample->pub.upsample = merged_1v_upsample;\n    upsample->upmethod = h2v1_merged_upsample;\n    /* No spare row needed */\n    upsample->spare_row = NULL;\n  }\n\n  build_ycc_rgb_table(cinfo);\n}\n\n#endif /* UPSAMPLE_MERGING_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdpostct.c",
    "content": "/*\n * jdpostct.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the decompression postprocessing controller.\n * This controller manages the upsampling, color conversion, and color\n * quantization/reduction steps; specifically, it controls the buffering\n * between upsample/color conversion and color quantization/reduction.\n *\n * If no color quantization/reduction is required, then this module has no\n * work to do, and it just hands off to the upsample/color conversion code.\n * An integrated upsample/convert/quantize process would replace this module\n * entirely.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Private buffer controller object */\n\ntypedef struct {\n  struct jpeg_d_post_controller pub; /* public fields */\n\n  /* Color quantization source buffer: this holds output data from\n   * the upsample/color conversion step to be passed to the quantizer.\n   * For two-pass color quantization, we need a full-image buffer;\n   * for one-pass operation, a strip buffer is sufficient.\n   */\n  jvirt_sarray_ptr whole_image;\t/* virtual array, or NULL if one-pass */\n  JSAMPARRAY buffer;\t\t/* strip buffer, or current strip of virtual */\n  JDIMENSION strip_height;\t/* buffer size in rows */\n  /* for two-pass mode only: */\n  JDIMENSION starting_row;\t/* row # of first row in current strip */\n  JDIMENSION next_row;\t\t/* index of next row to fill/empty in strip */\n} my_post_controller;\n\ntypedef my_post_controller * my_post_ptr;\n\n\n/* Forward declarations */\nMETHODDEF(void) post_process_1pass\n\tJPP((j_decompress_ptr cinfo,\n\t     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t     JDIMENSION in_row_groups_avail,\n\t     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t     JDIMENSION out_rows_avail));\n#ifdef QUANT_2PASS_SUPPORTED\nMETHODDEF(void) post_process_prepass\n\tJPP((j_decompress_ptr cinfo,\n\t     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t     JDIMENSION in_row_groups_avail,\n\t     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t     JDIMENSION out_rows_avail));\nMETHODDEF(void) post_process_2pass\n\tJPP((j_decompress_ptr cinfo,\n\t     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t     JDIMENSION in_row_groups_avail,\n\t     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t     JDIMENSION out_rows_avail));\n#endif\n\n\n/*\n * Initialize for a processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)\n{\n  my_post_ptr post = (my_post_ptr) cinfo->post;\n\n  switch (pass_mode) {\n  case JBUF_PASS_THRU:\n    if (cinfo->quantize_colors) {\n      /* Single-pass processing with color quantization. */\n      post->pub.post_process_data = post_process_1pass;\n      /* We could be doing buffered-image output before starting a 2-pass\n       * color quantization; in that case, jinit_d_post_controller did not\n       * allocate a strip buffer.  Use the virtual-array buffer as workspace.\n       */\n      if (post->buffer == NULL) {\n\tpost->buffer = (*cinfo->mem->access_virt_sarray)\n\t  ((j_common_ptr) cinfo, post->whole_image,\n\t   (JDIMENSION) 0, post->strip_height, TRUE);\n      }\n    } else {\n      /* For single-pass processing without color quantization,\n       * I have no work to do; just call the upsampler directly.\n       */\n      post->pub.post_process_data = cinfo->upsample->upsample;\n    }\n    break;\n#ifdef QUANT_2PASS_SUPPORTED\n  case JBUF_SAVE_AND_PASS:\n    /* First pass of 2-pass quantization */\n    if (post->whole_image == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    post->pub.post_process_data = post_process_prepass;\n    break;\n  case JBUF_CRANK_DEST:\n    /* Second pass of 2-pass quantization */\n    if (post->whole_image == NULL)\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    post->pub.post_process_data = post_process_2pass;\n    break;\n#endif /* QUANT_2PASS_SUPPORTED */\n  default:\n    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n    break;\n  }\n  post->starting_row = post->next_row = 0;\n}\n\n\n/*\n * Process some data in the one-pass (strip buffer) case.\n * This is used for color precision reduction as well as one-pass quantization.\n */\n\nMETHODDEF(void)\npost_process_1pass (j_decompress_ptr cinfo,\n\t\t    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t    JDIMENSION in_row_groups_avail,\n\t\t    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t    JDIMENSION out_rows_avail)\n{\n  my_post_ptr post = (my_post_ptr) cinfo->post;\n  JDIMENSION num_rows, max_rows;\n\n  /* Fill the buffer, but not more than what we can dump out in one go. */\n  /* Note we rely on the upsampler to detect bottom of image. */\n  max_rows = out_rows_avail - *out_row_ctr;\n  if (max_rows > post->strip_height)\n    max_rows = post->strip_height;\n  num_rows = 0;\n  (*cinfo->upsample->upsample) (cinfo,\n\t\tinput_buf, in_row_group_ctr, in_row_groups_avail,\n\t\tpost->buffer, &num_rows, max_rows);\n  /* Quantize and emit data. */\n  (*cinfo->cquantize->color_quantize) (cinfo,\n\t\tpost->buffer, output_buf + *out_row_ctr, (int) num_rows);\n  *out_row_ctr += num_rows;\n}\n\n\n#ifdef QUANT_2PASS_SUPPORTED\n\n/*\n * Process some data in the first pass of 2-pass quantization.\n */\n\nMETHODDEF(void)\npost_process_prepass (j_decompress_ptr cinfo,\n\t\t      JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t      JDIMENSION in_row_groups_avail,\n\t\t      JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t      JDIMENSION out_rows_avail)\n{\n  my_post_ptr post = (my_post_ptr) cinfo->post;\n  JDIMENSION old_next_row, num_rows;\n\n  /* Reposition virtual buffer if at start of strip. */\n  if (post->next_row == 0) {\n    post->buffer = (*cinfo->mem->access_virt_sarray)\n\t((j_common_ptr) cinfo, post->whole_image,\n\t post->starting_row, post->strip_height, TRUE);\n  }\n\n  /* Upsample some data (up to a strip height's worth). */\n  old_next_row = post->next_row;\n  (*cinfo->upsample->upsample) (cinfo,\n\t\tinput_buf, in_row_group_ctr, in_row_groups_avail,\n\t\tpost->buffer, &post->next_row, post->strip_height);\n\n  /* Allow quantizer to scan new data.  No data is emitted, */\n  /* but we advance out_row_ctr so outer loop can tell when we're done. */\n  if (post->next_row > old_next_row) {\n    num_rows = post->next_row - old_next_row;\n    (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row,\n\t\t\t\t\t (JSAMPARRAY) NULL, (int) num_rows);\n    *out_row_ctr += num_rows;\n  }\n\n  /* Advance if we filled the strip. */\n  if (post->next_row >= post->strip_height) {\n    post->starting_row += post->strip_height;\n    post->next_row = 0;\n  }\n}\n\n\n/*\n * Process some data in the second pass of 2-pass quantization.\n */\n\nMETHODDEF(void)\npost_process_2pass (j_decompress_ptr cinfo,\n\t\t    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t\t    JDIMENSION in_row_groups_avail,\n\t\t    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t\t    JDIMENSION out_rows_avail)\n{\n  my_post_ptr post = (my_post_ptr) cinfo->post;\n  JDIMENSION num_rows, max_rows;\n\n  /* Reposition virtual buffer if at start of strip. */\n  if (post->next_row == 0) {\n    post->buffer = (*cinfo->mem->access_virt_sarray)\n\t((j_common_ptr) cinfo, post->whole_image,\n\t post->starting_row, post->strip_height, FALSE);\n  }\n\n  /* Determine number of rows to emit. */\n  num_rows = post->strip_height - post->next_row; /* available in strip */\n  max_rows = out_rows_avail - *out_row_ctr; /* available in output area */\n  if (num_rows > max_rows)\n    num_rows = max_rows;\n  /* We have to check bottom of image here, can't depend on upsampler. */\n  max_rows = cinfo->output_height - post->starting_row;\n  if (num_rows > max_rows)\n    num_rows = max_rows;\n\n  /* Quantize and emit data. */\n  (*cinfo->cquantize->color_quantize) (cinfo,\n\t\tpost->buffer + post->next_row, output_buf + *out_row_ctr,\n\t\t(int) num_rows);\n  *out_row_ctr += num_rows;\n\n  /* Advance if we filled the strip. */\n  post->next_row += num_rows;\n  if (post->next_row >= post->strip_height) {\n    post->starting_row += post->strip_height;\n    post->next_row = 0;\n  }\n}\n\n#endif /* QUANT_2PASS_SUPPORTED */\n\n\n/*\n * Initialize postprocessing controller.\n */\n\nGLOBAL(void)\njinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer)\n{\n  my_post_ptr post;\n\n  post = (my_post_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_post_controller));\n  cinfo->post = (struct jpeg_d_post_controller *) post;\n  post->pub.start_pass = start_pass_dpost;\n  post->whole_image = NULL;\t/* flag for no virtual arrays */\n  post->buffer = NULL;\t\t/* flag for no strip buffer */\n\n  /* Create the quantization buffer, if needed */\n  if (cinfo->quantize_colors) {\n    /* The buffer strip height is max_v_samp_factor, which is typically\n     * an efficient number of rows for upsampling to return.\n     * (In the presence of output rescaling, we might want to be smarter?)\n     */\n    post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor;\n    if (need_full_buffer) {\n      /* Two-pass color quantization: need full-image storage. */\n      /* We round up the number of rows to a multiple of the strip height. */\n#ifdef QUANT_2PASS_SUPPORTED\n      post->whole_image = (*cinfo->mem->request_virt_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n\t cinfo->output_width * cinfo->out_color_components,\n\t (JDIMENSION) jround_up((long) cinfo->output_height,\n\t\t\t\t(long) post->strip_height),\n\t post->strip_height);\n#else\n      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);\n#endif /* QUANT_2PASS_SUPPORTED */\n    } else {\n      /* One-pass color quantization: just make a strip buffer. */\n      post->buffer = (*cinfo->mem->alloc_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t cinfo->output_width * cinfo->out_color_components,\n\t post->strip_height);\n    }\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdsample.c",
    "content": "/*\n * jdsample.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * Modified 2002-2008 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains upsampling routines.\n *\n * Upsampling input data is counted in \"row groups\".  A row group\n * is defined to be (v_samp_factor * DCT_v_scaled_size / min_DCT_v_scaled_size)\n * sample rows of each component.  Upsampling will normally produce\n * max_v_samp_factor pixel rows from each row group (but this could vary\n * if the upsampler is applying a scale factor of its own).\n *\n * An excellent reference for image resampling is\n *   Digital Image Warping, George Wolberg, 1990.\n *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Pointer to routine to upsample a single component */\ntypedef JMETHOD(void, upsample1_ptr,\n\t\t(j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_upsampler pub;\t/* public fields */\n\n  /* Color conversion buffer.  When using separate upsampling and color\n   * conversion steps, this buffer holds one upsampled row group until it\n   * has been color converted and output.\n   * Note: we do not allocate any storage for component(s) which are full-size,\n   * ie do not need rescaling.  The corresponding entry of color_buf[] is\n   * simply set to point to the input data array, thereby avoiding copying.\n   */\n  JSAMPARRAY color_buf[MAX_COMPONENTS];\n\n  /* Per-component upsampling method pointers */\n  upsample1_ptr methods[MAX_COMPONENTS];\n\n  int next_row_out;\t\t/* counts rows emitted from color_buf */\n  JDIMENSION rows_to_go;\t/* counts rows remaining in image */\n\n  /* Height of an input row group for each component. */\n  int rowgroup_height[MAX_COMPONENTS];\n\n  /* These arrays save pixel expansion factors so that int_expand need not\n   * recompute them each time.  They are unused for other upsampling methods.\n   */\n  UINT8 h_expand[MAX_COMPONENTS];\n  UINT8 v_expand[MAX_COMPONENTS];\n} my_upsampler;\n\ntypedef my_upsampler * my_upsample_ptr;\n\n\n/*\n * Initialize for an upsampling pass.\n */\n\nMETHODDEF(void)\nstart_pass_upsample (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n\n  /* Mark the conversion buffer empty */\n  upsample->next_row_out = cinfo->max_v_samp_factor;\n  /* Initialize total-height counter for detecting bottom of image */\n  upsample->rows_to_go = cinfo->output_height;\n}\n\n\n/*\n * Control routine to do upsampling (and color conversion).\n *\n * In this version we upsample each component independently.\n * We upsample one row group into the conversion buffer, then apply\n * color conversion a row at a time.\n */\n\nMETHODDEF(void)\nsep_upsample (j_decompress_ptr cinfo,\n\t      JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,\n\t      JDIMENSION in_row_groups_avail,\n\t      JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,\n\t      JDIMENSION out_rows_avail)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  int ci;\n  jpeg_component_info * compptr;\n  JDIMENSION num_rows;\n\n  /* Fill the conversion buffer, if it's empty */\n  if (upsample->next_row_out >= cinfo->max_v_samp_factor) {\n    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n\t ci++, compptr++) {\n      /* Invoke per-component upsample method.  Notice we pass a POINTER\n       * to color_buf[ci], so that fullsize_upsample can change it.\n       */\n      (*upsample->methods[ci]) (cinfo, compptr,\n\tinput_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]),\n\tupsample->color_buf + ci);\n    }\n    upsample->next_row_out = 0;\n  }\n\n  /* Color-convert and emit rows */\n\n  /* How many we have in the buffer: */\n  num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out);\n  /* Not more than the distance to the end of the image.  Need this test\n   * in case the image height is not a multiple of max_v_samp_factor:\n   */\n  if (num_rows > upsample->rows_to_go) \n    num_rows = upsample->rows_to_go;\n  /* And not more than what the client can accept: */\n  out_rows_avail -= *out_row_ctr;\n  if (num_rows > out_rows_avail)\n    num_rows = out_rows_avail;\n\n  (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf,\n\t\t\t\t     (JDIMENSION) upsample->next_row_out,\n\t\t\t\t     output_buf + *out_row_ctr,\n\t\t\t\t     (int) num_rows);\n\n  /* Adjust counts */\n  *out_row_ctr += num_rows;\n  upsample->rows_to_go -= num_rows;\n  upsample->next_row_out += num_rows;\n  /* When the buffer is emptied, declare this input row group consumed */\n  if (upsample->next_row_out >= cinfo->max_v_samp_factor)\n    (*in_row_group_ctr)++;\n}\n\n\n/*\n * These are the routines invoked by sep_upsample to upsample pixel values\n * of a single component.  One row group is processed per call.\n */\n\n\n/*\n * For full-size components, we just make color_buf[ci] point at the\n * input buffer, and thus avoid copying any data.  Note that this is\n * safe only because sep_upsample doesn't declare the input row group\n * \"consumed\" until we are done color converting and emitting it.\n */\n\nMETHODDEF(void)\nfullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t   JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  *output_data_ptr = input_data;\n}\n\n\n/*\n * This is a no-op version used for \"uninteresting\" components.\n * These components will not be referenced by color conversion.\n */\n\nMETHODDEF(void)\nnoop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  *output_data_ptr = NULL;\t/* safety check */\n}\n\n\n/*\n * This version handles any integral sampling ratios.\n * This is not used for typical JPEG files, so it need not be fast.\n * Nor, for that matter, is it particularly accurate: the algorithm is\n * simple replication of the input pixel onto the corresponding output\n * pixels.  The hi-falutin sampling literature refers to this as a\n * \"box filter\".  A box filter tends to introduce visible artifacts,\n * so if you are actually going to use 3:1 or 4:1 sampling ratios\n * you would be well advised to improve this code.\n */\n\nMETHODDEF(void)\nint_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t      JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;\n  JSAMPARRAY output_data = *output_data_ptr;\n  register JSAMPROW inptr, outptr;\n  register JSAMPLE invalue;\n  register int h;\n  JSAMPROW outend;\n  int h_expand, v_expand;\n  int inrow, outrow;\n\n  h_expand = upsample->h_expand[compptr->component_index];\n  v_expand = upsample->v_expand[compptr->component_index];\n\n  inrow = outrow = 0;\n  while (outrow < cinfo->max_v_samp_factor) {\n    /* Generate one output row with proper horizontal expansion */\n    inptr = input_data[inrow];\n    outptr = output_data[outrow];\n    outend = outptr + cinfo->output_width;\n    while (outptr < outend) {\n      invalue = *inptr++;\t/* don't need GETJSAMPLE() here */\n      for (h = h_expand; h > 0; h--) {\n\t*outptr++ = invalue;\n      }\n    }\n    /* Generate any additional output rows by duplicating the first one */\n    if (v_expand > 1) {\n      jcopy_sample_rows(output_data, outrow, output_data, outrow+1,\n\t\t\tv_expand-1, cinfo->output_width);\n    }\n    inrow++;\n    outrow += v_expand;\n  }\n}\n\n\n/*\n * Fast processing for the common case of 2:1 horizontal and 1:1 vertical.\n * It's still a box filter.\n */\n\nMETHODDEF(void)\nh2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  JSAMPARRAY output_data = *output_data_ptr;\n  register JSAMPROW inptr, outptr;\n  register JSAMPLE invalue;\n  JSAMPROW outend;\n  int outrow;\n\n  for (outrow = 0; outrow < cinfo->max_v_samp_factor; outrow++) {\n    inptr = input_data[outrow];\n    outptr = output_data[outrow];\n    outend = outptr + cinfo->output_width;\n    while (outptr < outend) {\n      invalue = *inptr++;\t/* don't need GETJSAMPLE() here */\n      *outptr++ = invalue;\n      *outptr++ = invalue;\n    }\n  }\n}\n\n\n/*\n * Fast processing for the common case of 2:1 horizontal and 2:1 vertical.\n * It's still a box filter.\n */\n\nMETHODDEF(void)\nh2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)\n{\n  JSAMPARRAY output_data = *output_data_ptr;\n  register JSAMPROW inptr, outptr;\n  register JSAMPLE invalue;\n  JSAMPROW outend;\n  int inrow, outrow;\n\n  inrow = outrow = 0;\n  while (outrow < cinfo->max_v_samp_factor) {\n    inptr = input_data[inrow];\n    outptr = output_data[outrow];\n    outend = outptr + cinfo->output_width;\n    while (outptr < outend) {\n      invalue = *inptr++;\t/* don't need GETJSAMPLE() here */\n      *outptr++ = invalue;\n      *outptr++ = invalue;\n    }\n    jcopy_sample_rows(output_data, outrow, output_data, outrow+1,\n\t\t      1, cinfo->output_width);\n    inrow++;\n    outrow += 2;\n  }\n}\n\n\n/*\n * Module initialization routine for upsampling.\n */\n\nGLOBAL(void)\njinit_upsampler (j_decompress_ptr cinfo)\n{\n  my_upsample_ptr upsample;\n  int ci;\n  jpeg_component_info * compptr;\n  boolean need_buffer;\n  int h_in_group, v_in_group, h_out_group, v_out_group;\n\n  upsample = (my_upsample_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_upsampler));\n  cinfo->upsample = (struct jpeg_upsampler *) upsample;\n  upsample->pub.start_pass = start_pass_upsample;\n  upsample->pub.upsample = sep_upsample;\n  upsample->pub.need_context_rows = FALSE; /* until we find out differently */\n\n  if (cinfo->CCIR601_sampling)\t/* this isn't supported */\n    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);\n\n  /* Verify we can handle the sampling factors, select per-component methods,\n   * and create storage as needed.\n   */\n  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;\n       ci++, compptr++) {\n    /* Compute size of an \"input group\" after IDCT scaling.  This many samples\n     * are to be converted to max_h_samp_factor * max_v_samp_factor pixels.\n     */\n    h_in_group = (compptr->h_samp_factor * compptr->DCT_h_scaled_size) /\n\t\t cinfo->min_DCT_h_scaled_size;\n    v_in_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /\n\t\t cinfo->min_DCT_v_scaled_size;\n    h_out_group = cinfo->max_h_samp_factor;\n    v_out_group = cinfo->max_v_samp_factor;\n    upsample->rowgroup_height[ci] = v_in_group; /* save for use later */\n    need_buffer = TRUE;\n    if (! compptr->component_needed) {\n      /* Don't bother to upsample an uninteresting component. */\n      upsample->methods[ci] = noop_upsample;\n      need_buffer = FALSE;\n    } else if (h_in_group == h_out_group && v_in_group == v_out_group) {\n      /* Fullsize components can be processed without any work. */\n      upsample->methods[ci] = fullsize_upsample;\n      need_buffer = FALSE;\n    } else if (h_in_group * 2 == h_out_group &&\n\t       v_in_group == v_out_group) {\n      /* Special case for 2h1v upsampling */\n      upsample->methods[ci] = h2v1_upsample;\n    } else if (h_in_group * 2 == h_out_group &&\n\t       v_in_group * 2 == v_out_group) {\n      /* Special case for 2h2v upsampling */\n      upsample->methods[ci] = h2v2_upsample;\n    } else if ((h_out_group % h_in_group) == 0 &&\n\t       (v_out_group % v_in_group) == 0) {\n      /* Generic integral-factors upsampling method */\n      upsample->methods[ci] = int_upsample;\n      upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group);\n      upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group);\n    } else\n      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);\n    if (need_buffer) {\n      upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)\n\t((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t (JDIMENSION) jround_up((long) cinfo->output_width,\n\t\t\t\t(long) cinfo->max_h_samp_factor),\n\t (JDIMENSION) cinfo->max_v_samp_factor);\n    }\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jdtrans.c",
    "content": "/*\n * jdtrans.c\n *\n * Copyright (C) 1995-1997, Thomas G. Lane.\n * Modified 2000-2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains library routines for transcoding decompression,\n * that is, reading raw DCT coefficient arrays from an input JPEG file.\n * The routines in jdapimin.c will also be needed by a transcoder.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/* Forward declarations */\nLOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));\n\n\n/*\n * Read the coefficient arrays from a JPEG file.\n * jpeg_read_header must be completed before calling this.\n *\n * The entire image is read into a set of virtual coefficient-block arrays,\n * one per component.  The return value is a pointer to the array of\n * virtual-array descriptors.  These can be manipulated directly via the\n * JPEG memory manager, or handed off to jpeg_write_coefficients().\n * To release the memory occupied by the virtual arrays, call\n * jpeg_finish_decompress() when done with the data.\n *\n * An alternative usage is to simply obtain access to the coefficient arrays\n * during a buffered-image-mode decompression operation.  This is allowed\n * after any jpeg_finish_output() call.  The arrays can be accessed until\n * jpeg_finish_decompress() is called.  (Note that any call to the library\n * may reposition the arrays, so don't rely on access_virt_barray() results\n * to stay valid across library calls.)\n *\n * Returns NULL if suspended.  This case need be checked only if\n * a suspending data source is used.\n */\n\nGLOBAL(jvirt_barray_ptr *)\njpeg_read_coefficients (j_decompress_ptr cinfo)\n{\n  if (cinfo->global_state == DSTATE_READY) {\n    /* First call: initialize active modules */\n    transdecode_master_selection(cinfo);\n    cinfo->global_state = DSTATE_RDCOEFS;\n  }\n  if (cinfo->global_state == DSTATE_RDCOEFS) {\n    /* Absorb whole file into the coef buffer */\n    for (;;) {\n      int retcode;\n      /* Call progress monitor hook if present */\n      if (cinfo->progress != NULL)\n\t(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);\n      /* Absorb some more input */\n      retcode = (*cinfo->inputctl->consume_input) (cinfo);\n      if (retcode == JPEG_SUSPENDED)\n\treturn NULL;\n      if (retcode == JPEG_REACHED_EOI)\n\tbreak;\n      /* Advance progress counter if appropriate */\n      if (cinfo->progress != NULL &&\n\t  (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {\n\tif (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {\n\t  /* startup underestimated number of scans; ratchet up one scan */\n\t  cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;\n\t}\n      }\n    }\n    /* Set state so that jpeg_finish_decompress does the right thing */\n    cinfo->global_state = DSTATE_STOPPING;\n  }\n  /* At this point we should be in state DSTATE_STOPPING if being used\n   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access\n   * to the coefficients during a full buffered-image-mode decompression.\n   */\n  if ((cinfo->global_state == DSTATE_STOPPING ||\n       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {\n    return cinfo->coef->coef_arrays;\n  }\n  /* Oops, improper usage */\n  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);\n  return NULL;\t\t\t/* keep compiler happy */\n}\n\n\n/*\n * Master selection of decompression modules for transcoding.\n * This substitutes for jdmaster.c's initialization of the full decompressor.\n */\n\nLOCAL(void)\ntransdecode_master_selection (j_decompress_ptr cinfo)\n{\n  /* This is effectively a buffered-image operation. */\n  cinfo->buffered_image = TRUE;\n\n  /* Compute output image dimensions and related values. */\n  jpeg_core_output_dimensions(cinfo);\n\n  /* Entropy decoding: either Huffman or arithmetic coding. */\n  if (cinfo->arith_code)\n    jinit_arith_decoder(cinfo);\n  else {\n    jinit_huff_decoder(cinfo);\n  }\n\n  /* Always get a full-image coefficient buffer. */\n  jinit_d_coef_controller(cinfo, TRUE);\n\n  /* We can now tell the memory manager to allocate virtual arrays. */\n  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);\n\n  /* Initialize input side of decompressor to consume first scan. */\n  (*cinfo->inputctl->start_input_pass) (cinfo);\n\n  /* Initialize progress monitoring. */\n  if (cinfo->progress != NULL) {\n    int nscans;\n    /* Estimate number of scans to set pass_limit. */\n    if (cinfo->progressive_mode) {\n      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */\n      nscans = 2 + 3 * cinfo->num_components;\n    } else if (cinfo->inputctl->has_multiple_scans) {\n      /* For a nonprogressive multiscan file, estimate 1 scan per component. */\n      nscans = cinfo->num_components;\n    } else {\n      nscans = 1;\n    }\n    cinfo->progress->pass_counter = 0L;\n    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;\n    cinfo->progress->completed_passes = 0;\n    cinfo->progress->total_passes = 1;\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jerror.c",
    "content": "/*\n * jerror.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * Modified 2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains simple error-reporting and trace-message routines.\n * These are suitable for Unix-like systems and others where writing to\n * stderr is the right thing to do.  Many applications will want to replace\n * some or all of these routines.\n *\n * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,\n * you get a Windows-specific hack to display error messages in a dialog box.\n * It ain't much, but it beats dropping error messages into the bit bucket,\n * which is what happens to output to stderr under most Windows C compilers.\n *\n * These routines are used by both the compression and decompression code.\n */\n\n/* this is not a core library module, so it doesn't define JPEG_INTERNALS */\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jversion.h\"\n#include \"jerror.h\"\n\n#ifdef USE_WINDOWS_MESSAGEBOX\n#include <windows.h>\n#endif\n\n#ifndef EXIT_FAILURE\t\t/* define exit() codes if not provided */\n#define EXIT_FAILURE  1\n#endif\n\n\n/*\n * Create the message string table.\n * We do this from the master message list in jerror.h by re-reading\n * jerror.h with a suitable definition for macro JMESSAGE.\n * The message table is made an external symbol just in case any applications\n * want to refer to it directly.\n */\n\n#ifdef NEED_SHORT_EXTERNAL_NAMES\n#define jpeg_std_message_table\tjMsgTable\n#endif\n\n#define JMESSAGE(code,string)\tstring ,\n\nconst char * const jpeg_std_message_table[] = {\n#include \"jerror.h\"\n  NULL\n};\n\n\n/*\n * Error exit handler: must not return to caller.\n *\n * Applications may override this if they want to get control back after\n * an error.  Typically one would longjmp somewhere instead of exiting.\n * The setjmp buffer can be made a private field within an expanded error\n * handler object.  Note that the info needed to generate an error message\n * is stored in the error object, so you can generate the message now or\n * later, at your convenience.\n * You should make sure that the JPEG object is cleaned up (with jpeg_abort\n * or jpeg_destroy) at some point.\n */\n\nMETHODDEF(noreturn_t)\nerror_exit (j_common_ptr cinfo)\n{\n  /* Always display the message */\n  (*cinfo->err->output_message) (cinfo);\n\n  /* Let the memory manager delete any temp files before we die */\n  jpeg_destroy(cinfo);\n\n  exit(EXIT_FAILURE);\n}\n\n\n/*\n * Actual output of an error or trace message.\n * Applications may override this method to send JPEG messages somewhere\n * other than stderr.\n *\n * On Windows, printing to stderr is generally completely useless,\n * so we provide optional code to produce an error-dialog popup.\n * Most Windows applications will still prefer to override this routine,\n * but if they don't, it'll do something at least marginally useful.\n *\n * NOTE: to use the library in an environment that doesn't support the\n * C stdio library, you may have to delete the call to fprintf() entirely,\n * not just not use this routine.\n */\n\nMETHODDEF(void)\noutput_message (j_common_ptr cinfo)\n{\n  char buffer[JMSG_LENGTH_MAX];\n\n  /* Create the message */\n  (*cinfo->err->format_message) (cinfo, buffer);\n\n#ifdef USE_WINDOWS_MESSAGEBOX\n  /* Display it in a message dialog box */\n  MessageBox(GetActiveWindow(), buffer, \"JPEG Library Error\",\n\t     MB_OK | MB_ICONERROR);\n#else\n  /* Send it to stderr, adding a newline */\n  fprintf(stderr, \"%s\\n\", buffer);\n#endif\n}\n\n\n/*\n * Decide whether to emit a trace or warning message.\n * msg_level is one of:\n *   -1: recoverable corrupt-data warning, may want to abort.\n *    0: important advisory messages (always display to user).\n *    1: first level of tracing detail.\n *    2,3,...: successively more detailed tracing messages.\n * An application might override this method if it wanted to abort on warnings\n * or change the policy about which messages to display.\n */\n\nMETHODDEF(void)\nemit_message (j_common_ptr cinfo, int msg_level)\n{\n  struct jpeg_error_mgr * err = cinfo->err;\n\n  if (msg_level < 0) {\n    /* It's a warning message.  Since corrupt files may generate many warnings,\n     * the policy implemented here is to show only the first warning,\n     * unless trace_level >= 3.\n     */\n    if (err->num_warnings == 0 || err->trace_level >= 3)\n      (*err->output_message) (cinfo);\n    /* Always count warnings in num_warnings. */\n    err->num_warnings++;\n  } else {\n    /* It's a trace message.  Show it if trace_level >= msg_level. */\n    if (err->trace_level >= msg_level)\n      (*err->output_message) (cinfo);\n  }\n}\n\n\n/*\n * Format a message string for the most recent JPEG error or message.\n * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX\n * characters.  Note that no '\\n' character is added to the string.\n * Few applications should need to override this method.\n */\n\nMETHODDEF(void)\nformat_message (j_common_ptr cinfo, char * buffer)\n{\n  struct jpeg_error_mgr * err = cinfo->err;\n  int msg_code = err->msg_code;\n  const char * msgtext = NULL;\n  const char * msgptr;\n  char ch;\n  boolean isstring;\n\n  /* Look up message string in proper table */\n  if (msg_code > 0 && msg_code <= err->last_jpeg_message) {\n    msgtext = err->jpeg_message_table[msg_code];\n  } else if (err->addon_message_table != NULL &&\n\t     msg_code >= err->first_addon_message &&\n\t     msg_code <= err->last_addon_message) {\n    msgtext = err->addon_message_table[msg_code - err->first_addon_message];\n  }\n\n  /* Defend against bogus message number */\n  if (msgtext == NULL) {\n    err->msg_parm.i[0] = msg_code;\n    msgtext = err->jpeg_message_table[0];\n  }\n\n  /* Check for string parameter, as indicated by %s in the message text */\n  isstring = FALSE;\n  msgptr = msgtext;\n  while ((ch = *msgptr++) != '\\0') {\n    if (ch == '%') {\n      if (*msgptr == 's') isstring = TRUE;\n      break;\n    }\n  }\n\n  /* Format the message into the passed buffer */\n  if (isstring)\n    sprintf(buffer, msgtext, err->msg_parm.s);\n  else\n    sprintf(buffer, msgtext,\n\t    err->msg_parm.i[0], err->msg_parm.i[1],\n\t    err->msg_parm.i[2], err->msg_parm.i[3],\n\t    err->msg_parm.i[4], err->msg_parm.i[5],\n\t    err->msg_parm.i[6], err->msg_parm.i[7]);\n}\n\n\n/*\n * Reset error state variables at start of a new image.\n * This is called during compression startup to reset trace/error\n * processing to default state, without losing any application-specific\n * method pointers.  An application might possibly want to override\n * this method if it has additional error processing state.\n */\n\nMETHODDEF(void)\nreset_error_mgr (j_common_ptr cinfo)\n{\n  cinfo->err->num_warnings = 0;\n  /* trace_level is not reset since it is an application-supplied parameter */\n  cinfo->err->msg_code = 0;\t/* may be useful as a flag for \"no error\" */\n}\n\n\n/*\n * Fill in the standard error-handling methods in a jpeg_error_mgr object.\n * Typical call is:\n *\tstruct jpeg_compress_struct cinfo;\n *\tstruct jpeg_error_mgr err;\n *\n *\tcinfo.err = jpeg_std_error(&err);\n * after which the application may override some of the methods.\n */\n\nGLOBAL(struct jpeg_error_mgr *)\njpeg_std_error (struct jpeg_error_mgr * err)\n{\n  err->error_exit = error_exit;\n  err->emit_message = emit_message;\n  err->output_message = output_message;\n  err->format_message = format_message;\n  err->reset_error_mgr = reset_error_mgr;\n\n  err->trace_level = 0;\t\t/* default = no tracing */\n  err->num_warnings = 0;\t/* no warnings emitted yet */\n  err->msg_code = 0;\t\t/* may be useful as a flag for \"no error\" */\n\n  /* Initialize message table pointers */\n  err->jpeg_message_table = jpeg_std_message_table;\n  err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;\n\n  err->addon_message_table = NULL;\n  err->first_addon_message = 0;\t/* for safety */\n  err->last_addon_message = 0;\n\n  return err;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jfdctflt.c",
    "content": "/*\n * jfdctflt.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * Modified 2003-2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a floating-point implementation of the\n * forward DCT (Discrete Cosine Transform).\n *\n * This implementation should be more accurate than either of the integer\n * DCT implementations.  However, it may not give the same results on all\n * machines because of differences in roundoff behavior.  Speed will depend\n * on the hardware's floating point capacity.\n *\n * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT\n * on each column.  Direct algorithms are also available, but they are\n * much more complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on Arai, Agui, and Nakajima's algorithm for\n * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in\n * Japanese, but the algorithm is described in the Pennebaker & Mitchell\n * JPEG textbook (see REFERENCES section in file README).  The following code\n * is based directly on figure 4-8 in P&M.\n * While an 8-point DCT cannot be done in less than 11 multiplies, it is\n * possible to arrange the computation so that many of the multiplies are\n * simple scalings of the final outputs.  These multiplies can then be\n * folded into the multiplications or divisions by the JPEG quantization\n * table entries.  The AA&N method leaves only 5 multiplies and 29 adds\n * to be done in the DCT itself.\n * The primary disadvantage of this method is that with a fixed-point\n * implementation, accuracy is lost due to imprecise representation of the\n * scaled quantization values.  However, that problem does not arise if\n * we use floating point arithmetic.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_FLOAT_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\n#endif\n\n\n/*\n * Perform the forward DCT on one block of samples.\n */\n\nGLOBAL(void)\njpeg_fdct_float (FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  FAST_FLOAT tmp10, tmp11, tmp12, tmp13;\n  FAST_FLOAT z1, z2, z3, z4, z5, z11, z13;\n  FAST_FLOAT *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n\n  /* Pass 1: process rows. */\n\n  dataptr = data;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Load data into workspace */\n    tmp0 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]));\n    tmp7 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]));\n    tmp1 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]));\n    tmp6 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]));\n    tmp2 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]));\n    tmp5 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]));\n    tmp3 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]));\n    tmp4 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]));\n\n    /* Even part */\n\n    tmp10 = tmp0 + tmp3;\t/* phase 2 */\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */\n    dataptr[4] = tmp10 - tmp11;\n\n    z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */\n    dataptr[2] = tmp13 + z1;\t/* phase 5 */\n    dataptr[6] = tmp13 - z1;\n\n    /* Odd part */\n\n    tmp10 = tmp4 + tmp5;\t/* phase 2 */\n    tmp11 = tmp5 + tmp6;\n    tmp12 = tmp6 + tmp7;\n\n    /* The rotator is modified from fig 4-8 to avoid extra negations. */\n    z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */\n    z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */\n    z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */\n    z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */\n\n    z11 = tmp7 + z3;\t\t/* phase 5 */\n    z13 = tmp7 - z3;\n\n    dataptr[5] = z13 + z2;\t/* phase 6 */\n    dataptr[3] = z13 - z2;\n    dataptr[1] = z11 + z4;\n    dataptr[7] = z11 - z4;\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns. */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];\n    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];\n    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];\n    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];\n    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];\n\n    /* Even part */\n\n    tmp10 = tmp0 + tmp3;\t/* phase 2 */\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n\n    dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */\n    dataptr[DCTSIZE*4] = tmp10 - tmp11;\n\n    z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */\n    dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */\n    dataptr[DCTSIZE*6] = tmp13 - z1;\n\n    /* Odd part */\n\n    tmp10 = tmp4 + tmp5;\t/* phase 2 */\n    tmp11 = tmp5 + tmp6;\n    tmp12 = tmp6 + tmp7;\n\n    /* The rotator is modified from fig 4-8 to avoid extra negations. */\n    z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */\n    z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */\n    z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */\n    z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */\n\n    z11 = tmp7 + z3;\t\t/* phase 5 */\n    z13 = tmp7 - z3;\n\n    dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */\n    dataptr[DCTSIZE*3] = z13 - z2;\n    dataptr[DCTSIZE*1] = z11 + z4;\n    dataptr[DCTSIZE*7] = z11 - z4;\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n#endif /* DCT_FLOAT_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jfdctfst.c",
    "content": "/*\n * jfdctfst.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * Modified 2003-2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a fast, not so accurate integer implementation of the\n * forward DCT (Discrete Cosine Transform).\n *\n * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT\n * on each column.  Direct algorithms are also available, but they are\n * much more complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on Arai, Agui, and Nakajima's algorithm for\n * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in\n * Japanese, but the algorithm is described in the Pennebaker & Mitchell\n * JPEG textbook (see REFERENCES section in file README).  The following code\n * is based directly on figure 4-8 in P&M.\n * While an 8-point DCT cannot be done in less than 11 multiplies, it is\n * possible to arrange the computation so that many of the multiplies are\n * simple scalings of the final outputs.  These multiplies can then be\n * folded into the multiplications or divisions by the JPEG quantization\n * table entries.  The AA&N method leaves only 5 multiplies and 29 adds\n * to be done in the DCT itself.\n * The primary disadvantage of this method is that with fixed-point math,\n * accuracy is lost due to imprecise representation of the scaled\n * quantization values.  The smaller the quantization table entry, the less\n * precise the scaled value, so this implementation does worse with high-\n * quality-setting files than with low-quality ones.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_IFAST_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\n#endif\n\n\n/* Scaling decisions are generally the same as in the LL&M algorithm;\n * see jfdctint.c for more details.  However, we choose to descale\n * (right shift) multiplication products as soon as they are formed,\n * rather than carrying additional fractional bits into subsequent additions.\n * This compromises accuracy slightly, but it lets us save a few shifts.\n * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)\n * everywhere except in the multiplications proper; this saves a good deal\n * of work on 16-bit-int machines.\n *\n * Again to save a few shifts, the intermediate results between pass 1 and\n * pass 2 are not upscaled, but are represented only to integral precision.\n *\n * A final compromise is to represent the multiplicative constants to only\n * 8 fractional bits, rather than 13.  This saves some shifting work on some\n * machines, and may also reduce the cost of multiplication (since there\n * are fewer one-bits in the constants).\n */\n\n#define CONST_BITS  8\n\n\n/* Some C compilers fail to reduce \"FIX(constant)\" at compile time, thus\n * causing a lot of useless floating-point operations at run time.\n * To get around this we use the following pre-calculated constants.\n * If you change CONST_BITS you may want to add appropriate values.\n * (With a reasonable C compiler, you can just rely on the FIX() macro...)\n */\n\n#if CONST_BITS == 8\n#define FIX_0_382683433  ((INT32)   98)\t\t/* FIX(0.382683433) */\n#define FIX_0_541196100  ((INT32)  139)\t\t/* FIX(0.541196100) */\n#define FIX_0_707106781  ((INT32)  181)\t\t/* FIX(0.707106781) */\n#define FIX_1_306562965  ((INT32)  334)\t\t/* FIX(1.306562965) */\n#else\n#define FIX_0_382683433  FIX(0.382683433)\n#define FIX_0_541196100  FIX(0.541196100)\n#define FIX_0_707106781  FIX(0.707106781)\n#define FIX_1_306562965  FIX(1.306562965)\n#endif\n\n\n/* We can gain a little more speed, with a further compromise in accuracy,\n * by omitting the addition in a descaling shift.  This yields an incorrectly\n * rounded result half the time...\n */\n\n#ifndef USE_ACCURATE_ROUNDING\n#undef DESCALE\n#define DESCALE(x,n)  RIGHT_SHIFT(x, n)\n#endif\n\n\n/* Multiply a DCTELEM variable by an INT32 constant, and immediately\n * descale to yield a DCTELEM result.\n */\n\n#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))\n\n\n/*\n * Perform the forward DCT on one block of samples.\n */\n\nGLOBAL(void)\njpeg_fdct_ifast (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  DCTELEM tmp10, tmp11, tmp12, tmp13;\n  DCTELEM z1, z2, z3, z4, z5, z11, z13;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n\n  dataptr = data;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Load data into workspace */\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);\n    tmp7 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]);\n    tmp6 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]);\n    tmp5 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]);\n    tmp4 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);\n\n    /* Even part */\n\n    tmp10 = tmp0 + tmp3;\t/* phase 2 */\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */\n    dataptr[4] = tmp10 - tmp11;\n\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */\n    dataptr[2] = tmp13 + z1;\t/* phase 5 */\n    dataptr[6] = tmp13 - z1;\n\n    /* Odd part */\n\n    tmp10 = tmp4 + tmp5;\t/* phase 2 */\n    tmp11 = tmp5 + tmp6;\n    tmp12 = tmp6 + tmp7;\n\n    /* The rotator is modified from fig 4-8 to avoid extra negations. */\n    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */\n    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */\n    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */\n    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */\n\n    z11 = tmp7 + z3;\t\t/* phase 5 */\n    z13 = tmp7 - z3;\n\n    dataptr[5] = z13 + z2;\t/* phase 6 */\n    dataptr[3] = z13 - z2;\n    dataptr[1] = z11 + z4;\n    dataptr[7] = z11 - z4;\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns. */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];\n    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];\n    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];\n    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];\n    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];\n\n    /* Even part */\n\n    tmp10 = tmp0 + tmp3;\t/* phase 2 */\n    tmp13 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp1 - tmp2;\n\n    dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */\n    dataptr[DCTSIZE*4] = tmp10 - tmp11;\n\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */\n    dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */\n    dataptr[DCTSIZE*6] = tmp13 - z1;\n\n    /* Odd part */\n\n    tmp10 = tmp4 + tmp5;\t/* phase 2 */\n    tmp11 = tmp5 + tmp6;\n    tmp12 = tmp6 + tmp7;\n\n    /* The rotator is modified from fig 4-8 to avoid extra negations. */\n    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */\n    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */\n    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */\n    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */\n\n    z11 = tmp7 + z3;\t\t/* phase 5 */\n    z13 = tmp7 - z3;\n\n    dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */\n    dataptr[DCTSIZE*3] = z13 - z2;\n    dataptr[DCTSIZE*1] = z11 + z4;\n    dataptr[DCTSIZE*7] = z11 - z4;\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n#endif /* DCT_IFAST_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jfdctint.c",
    "content": "/*\n * jfdctint.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * Modification developed 2003-2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a slow-but-accurate integer implementation of the\n * forward DCT (Discrete Cosine Transform).\n *\n * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT\n * on each column.  Direct algorithms are also available, but they are\n * much more complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on an algorithm described in\n *   C. Loeffler, A. Ligtenberg and G. Moschytz, \"Practical Fast 1-D DCT\n *   Algorithms with 11 Multiplications\", Proc. Int'l. Conf. on Acoustics,\n *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.\n * The primary algorithm described there uses 11 multiplies and 29 adds.\n * We use their alternate method with 12 multiplies and 32 adds.\n * The advantage of this method is that no data path contains more than one\n * multiplication; this allows a very simple and accurate implementation in\n * scaled fixed-point arithmetic, with a minimal number of shifts.\n *\n * We also provide FDCT routines with various input sample block sizes for\n * direct resolution reduction or enlargement and for direct resolving the\n * common 2x1 and 1x2 subsampling cases without additional resampling: NxN\n * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 output DCT block.\n *\n * For N<8 we fill the remaining block coefficients with zero.\n * For N>8 we apply a partial N-point FDCT on the input samples, computing\n * just the lower 8 frequency coefficients and discarding the rest.\n *\n * We must scale the output coefficients of the N-point FDCT appropriately\n * to the standard 8-point FDCT level by 8/N per 1-D pass.  This scaling\n * is folded into the constant multipliers (pass 2) and/or final/initial\n * shifting.\n *\n * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases\n * since there would be too many additional constants to pre-calculate.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_ISLOW_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */\n#endif\n\n\n/*\n * The poop on this scaling stuff is as follows:\n *\n * Each 1-D DCT step produces outputs which are a factor of sqrt(N)\n * larger than the true DCT outputs.  The final outputs are therefore\n * a factor of N larger than desired; since N=8 this can be cured by\n * a simple right shift at the end of the algorithm.  The advantage of\n * this arrangement is that we save two multiplications per 1-D DCT,\n * because the y0 and y4 outputs need not be divided by sqrt(N).\n * In the IJG code, this factor of 8 is removed by the quantization step\n * (in jcdctmgr.c), NOT in this module.\n *\n * We have to do addition and subtraction of the integer inputs, which\n * is no problem, and multiplication by fractional constants, which is\n * a problem to do in integer arithmetic.  We multiply all the constants\n * by CONST_SCALE and convert them to integer constants (thus retaining\n * CONST_BITS bits of precision in the constants).  After doing a\n * multiplication we have to divide the product by CONST_SCALE, with proper\n * rounding, to produce the correct output.  This division can be done\n * cheaply as a right shift of CONST_BITS bits.  We postpone shifting\n * as long as possible so that partial sums can be added together with\n * full fractional precision.\n *\n * The outputs of the first pass are scaled up by PASS1_BITS bits so that\n * they are represented to better-than-integral precision.  These outputs\n * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word\n * with the recommended scaling.  (For 12-bit sample data, the intermediate\n * array is INT32 anyway.)\n *\n * To avoid overflow of the 32-bit intermediate results in pass 2, we must\n * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis\n * shows that the values given below are the most effective.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define CONST_BITS  13\n#define PASS1_BITS  2\n#else\n#define CONST_BITS  13\n#define PASS1_BITS  1\t\t/* lose a little precision to avoid overflow */\n#endif\n\n/* Some C compilers fail to reduce \"FIX(constant)\" at compile time, thus\n * causing a lot of useless floating-point operations at run time.\n * To get around this we use the following pre-calculated constants.\n * If you change CONST_BITS you may want to add appropriate values.\n * (With a reasonable C compiler, you can just rely on the FIX() macro...)\n */\n\n#if CONST_BITS == 13\n#define FIX_0_298631336  ((INT32)  2446)\t/* FIX(0.298631336) */\n#define FIX_0_390180644  ((INT32)  3196)\t/* FIX(0.390180644) */\n#define FIX_0_541196100  ((INT32)  4433)\t/* FIX(0.541196100) */\n#define FIX_0_765366865  ((INT32)  6270)\t/* FIX(0.765366865) */\n#define FIX_0_899976223  ((INT32)  7373)\t/* FIX(0.899976223) */\n#define FIX_1_175875602  ((INT32)  9633)\t/* FIX(1.175875602) */\n#define FIX_1_501321110  ((INT32)  12299)\t/* FIX(1.501321110) */\n#define FIX_1_847759065  ((INT32)  15137)\t/* FIX(1.847759065) */\n#define FIX_1_961570560  ((INT32)  16069)\t/* FIX(1.961570560) */\n#define FIX_2_053119869  ((INT32)  16819)\t/* FIX(2.053119869) */\n#define FIX_2_562915447  ((INT32)  20995)\t/* FIX(2.562915447) */\n#define FIX_3_072711026  ((INT32)  25172)\t/* FIX(3.072711026) */\n#else\n#define FIX_0_298631336  FIX(0.298631336)\n#define FIX_0_390180644  FIX(0.390180644)\n#define FIX_0_541196100  FIX(0.541196100)\n#define FIX_0_765366865  FIX(0.765366865)\n#define FIX_0_899976223  FIX(0.899976223)\n#define FIX_1_175875602  FIX(1.175875602)\n#define FIX_1_501321110  FIX(1.501321110)\n#define FIX_1_847759065  FIX(1.847759065)\n#define FIX_1_961570560  FIX(1.961570560)\n#define FIX_2_053119869  FIX(2.053119869)\n#define FIX_2_562915447  FIX(2.562915447)\n#define FIX_3_072711026  FIX(3.072711026)\n#endif\n\n\n/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.\n * For 8-bit samples with the recommended scaling, all the variable\n * and constant values involved are no more than 16 bits wide, so a\n * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.\n * For 12-bit samples, a full 32-bit multiplication will be needed.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)\n#else\n#define MULTIPLY(var,const)  ((var) * (const))\n#endif\n\n\n/*\n * Perform the forward DCT on one block of samples.\n */\n\nGLOBAL(void)\njpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3;\n  INT32 tmp10, tmp11, tmp12, tmp13;\n  INT32 z1;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n\n  dataptr = data;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part per LL&M figure 1 --- note that published figure is faulty;\n     * rotator \"sqrt(2)*c1\" should be \"sqrt(2)*c6\".\n     */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]);\n\n    tmp10 = tmp0 + tmp3;\n    tmp12 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp13 = tmp1 - tmp2;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS);\n    dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);\n\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-1);\n    dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865),\n\t\t\t\t       CONST_BITS-PASS1_BITS);\n    dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065),\n\t\t\t\t       CONST_BITS-PASS1_BITS);\n\n    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\n     * cK represents sqrt(2) * cos(K*pi/16).\n     * i0..i3 in the paper are tmp0..tmp3 here.\n     */\n\n    tmp10 = tmp0 + tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp1 + tmp3;\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /*  c3 */\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    tmp0  = MULTIPLY(tmp0,    FIX_1_501321110);    /*  c1+c3-c5-c7 */\n    tmp1  = MULTIPLY(tmp1,    FIX_3_072711026);    /*  c1+c3+c5-c7 */\n    tmp2  = MULTIPLY(tmp2,    FIX_2_053119869);    /*  c1+c3-c5+c7 */\n    tmp3  = MULTIPLY(tmp3,    FIX_0_298631336);    /* -c1+c3+c5-c7 */\n    tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);    /*  c7-c3 */\n    tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);    /* -c1-c3 */\n    tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);    /*  c5-c3 */\n    tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);    /* -c3-c5 */\n\n    tmp12 += z1;\n    tmp13 += z1;\n\n    dataptr[1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS);\n    dataptr[3] = (DCTELEM)\n      RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS);\n    dataptr[5] = (DCTELEM)\n      RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS);\n    dataptr[7] = (DCTELEM)\n      RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part per LL&M figure 1 --- note that published figure is faulty;\n     * rotator \"sqrt(2)*c1\" should be \"sqrt(2)*c6\".\n     */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];\n\n    /* Add fudge factor here for final descale. */\n    tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1));\n    tmp12 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp13 = tmp1 - tmp2;\n\n    tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];\n\n    dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS);\n    dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS);\n\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS+PASS1_BITS-1);\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS);\n\n    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\n     * cK represents sqrt(2) * cos(K*pi/16).\n     * i0..i3 in the paper are tmp0..tmp3 here.\n     */\n\n    tmp10 = tmp0 + tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp1 + tmp3;\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /*  c3 */\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS+PASS1_BITS-1);\n\n    tmp0  = MULTIPLY(tmp0,    FIX_1_501321110);    /*  c1+c3-c5-c7 */\n    tmp1  = MULTIPLY(tmp1,    FIX_3_072711026);    /*  c1+c3+c5-c7 */\n    tmp2  = MULTIPLY(tmp2,    FIX_2_053119869);    /*  c1+c3-c5+c7 */\n    tmp3  = MULTIPLY(tmp3,    FIX_0_298631336);    /* -c1+c3+c5-c7 */\n    tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);    /*  c7-c3 */\n    tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);    /* -c1-c3 */\n    tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);    /*  c5-c3 */\n    tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);    /* -c3-c5 */\n\n    tmp12 += z1;\n    tmp13 += z1;\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*7] = (DCTELEM)\n      RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n#ifdef DCT_SCALING_SUPPORTED\n\n\n/*\n * Perform the forward DCT on a 7x7 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_7x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3;\n  INT32 tmp10, tmp11, tmp12;\n  INT32 z1, z2, z3;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* cK represents sqrt(2) * cos(K*pi/14). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 7; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]);\n    tmp3 = GETJSAMPLE(elemptr[3]);\n\n    tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]);\n    tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]);\n    tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]);\n\n    z1 = tmp0 + tmp2;\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS);\n    tmp3 += tmp3;\n    z1 -= tmp3;\n    z1 -= tmp3;\n    z1 = MULTIPLY(z1, FIX(0.353553391));                /* (c2+c6-c4)/2 */\n    z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002));       /* (c2+c4-c6)/2 */\n    z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123));       /* c6 */\n    dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS);\n    z1 -= z2;\n    z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734));       /* c4 */\n    dataptr[4] = (DCTELEM)\n      DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347));   /* (c3+c1-c5)/2 */\n    tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339));   /* (c3+c5-c1)/2 */\n    tmp0 = tmp1 - tmp2;\n    tmp1 += tmp2;\n    tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */\n    tmp1 += tmp2;\n    tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268));   /* c5 */\n    tmp0 += tmp3;\n    tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693));   /* c3+c1-c5 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/7)**2 = 64/49, which we fold\n   * into the constant multipliers:\n   * cK now represents sqrt(2) * cos(K*pi/14) * 64/49.\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 7; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4];\n    tmp3 = dataptr[DCTSIZE*3];\n\n    tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6];\n    tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5];\n    tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4];\n\n    z1 = tmp0 + tmp2;\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp3 += tmp3;\n    z1 -= tmp3;\n    z1 -= tmp3;\n    z1 = MULTIPLY(z1, FIX(0.461784020));                /* (c2+c6-c4)/2 */\n    z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084));       /* (c2+c4-c6)/2 */\n    z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446));       /* c6 */\n    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS);\n    z1 -= z2;\n    z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509));       /* c4 */\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677));   /* (c3+c1-c5)/2 */\n    tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464));   /* (c3+c5-c1)/2 */\n    tmp0 = tmp1 - tmp2;\n    tmp1 += tmp2;\n    tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */\n    tmp1 += tmp2;\n    tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310));   /* c5 */\n    tmp0 += tmp3;\n    tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355));   /* c3+c1-c5 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 6x6 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_6x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2;\n  INT32 tmp10, tmp11, tmp12;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* cK represents sqrt(2) * cos(K*pi/12). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 6; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]);\n    tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]);\n\n    tmp10 = tmp0 + tmp2;\n    tmp12 = tmp0 - tmp2;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS);\n    dataptr[2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp12, FIX(1.224744871)),                 /* c2 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */\n\t      CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)),     /* c5 */\n\t\t    CONST_BITS-PASS1_BITS);\n\n    dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS));\n    dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS);\n    dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS));\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/6)**2 = 16/9, which we fold\n   * into the constant multipliers:\n   * cK now represents sqrt(2) * cos(K*pi/12) * 16/9.\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 6; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5];\n    tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];\n\n    tmp10 = tmp0 + tmp2;\n    tmp12 = tmp0 - tmp2;\n\n    tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5];\n    tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)),         /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp12, FIX(2.177324216)),                 /* c2 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */\n\t      CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829));             /* c5 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),   /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)),    /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)),   /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 5x5 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_5x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2;\n  INT32 tmp10, tmp11;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* We scale the results further by 2 as part of output adaption */\n  /* scaling for different DCT size. */\n  /* cK represents sqrt(2) * cos(K*pi/10). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 5; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]);\n    tmp2 = GETJSAMPLE(elemptr[2]);\n\n    tmp10 = tmp0 + tmp1;\n    tmp11 = tmp0 - tmp1;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << (PASS1_BITS+1));\n    tmp11 = MULTIPLY(tmp11, FIX(0.790569415));          /* (c2+c4)/2 */\n    tmp10 -= tmp2 << 2;\n    tmp10 = MULTIPLY(tmp10, FIX(0.353553391));          /* (c2-c4)/2 */\n    dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS-1);\n    dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS-1);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876));    /* c3 */\n\n    dataptr[1] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */\n\t      CONST_BITS-PASS1_BITS-1);\n    dataptr[3] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */\n\t      CONST_BITS-PASS1_BITS-1);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/5)**2 = 64/25, which we partially\n   * fold into the constant multipliers (other part was done in pass 1):\n   * cK now represents sqrt(2) * cos(K*pi/10) * 32/25.\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 5; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3];\n    tmp2 = dataptr[DCTSIZE*2];\n\n    tmp10 = tmp0 + tmp1;\n    tmp11 = tmp0 - tmp1;\n\n    tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4];\n    tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)),        /* 32/25 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp11 = MULTIPLY(tmp11, FIX(1.011928851));          /* (c2+c4)/2 */\n    tmp10 -= tmp2 << 2;\n    tmp10 = MULTIPLY(tmp10, FIX(0.452548340));          /* (c2-c4)/2 */\n    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961));    /* c3 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */\n\t      CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 4x4 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1;\n  INT32 tmp10, tmp11;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* We must also scale the output by (8/4)**2 = 2**2, which we add here. */\n  /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 4; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);\n\n    tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);\n    tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+2));\n    dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+2));\n\n    /* Odd part */\n\n    tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);       /* c6 */\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-PASS1_BITS-3);\n\n    dataptr[1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */\n\t\t  CONST_BITS-PASS1_BITS-2);\n    dataptr[3] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */\n\t\t  CONST_BITS-PASS1_BITS-2);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 4; ctr++) {\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1));\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2];\n\n    tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];\n    tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];\n\n    dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS);\n    dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS);\n\n    /* Odd part */\n\n    tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);       /* c6 */\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS+PASS1_BITS-1);\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */\n\t\t  CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */\n\t\t  CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 3x3 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* We scale the results further by 2**2 as part of output adaption */\n  /* scaling for different DCT size. */\n  /* cK represents sqrt(2) * cos(K*pi/6). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 3; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]);\n    tmp1 = GETJSAMPLE(elemptr[1]);\n\n    tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+2));\n    dataptr[2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */\n\t      CONST_BITS-PASS1_BITS-2);\n\n    /* Odd part */\n\n    dataptr[1] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp2, FIX(1.224744871)),               /* c1 */\n\t      CONST_BITS-PASS1_BITS-2);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/3)**2 = 64/9, which we partially\n   * fold into the constant multipliers (other part was done in pass 1):\n   * cK now represents sqrt(2) * cos(K*pi/6) * 16/9.\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 3; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2];\n    tmp1 = dataptr[DCTSIZE*1];\n\n    tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),        /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */\n\t      CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp2, FIX(2.177324216)),               /* c1 */\n\t      CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 2x2 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3;\n  JSAMPROW elemptr;\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT. */\n\n  /* Row 0 */\n  elemptr = sample_data[0] + start_col;\n\n  tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]);\n  tmp1 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]);\n\n  /* Row 1 */\n  elemptr = sample_data[1] + start_col;\n\n  tmp2 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]);\n  tmp3 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]);\n\n  /* Pass 2: process columns.\n   * We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/2)**2 = 2**4.\n   */\n\n  /* Column 0 */\n  /* Apply unsigned->signed conversion */\n  data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp2 - 4 * CENTERJSAMPLE) << 4);\n  data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp2) << 4);\n\n  /* Column 1 */\n  data[DCTSIZE*0+1] = (DCTELEM) ((tmp1 + tmp3) << 4);\n  data[DCTSIZE*1+1] = (DCTELEM) ((tmp1 - tmp3) << 4);\n}\n\n\n/*\n * Perform the forward DCT on a 1x1 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_1x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* We leave the result scaled up by an overall factor of 8. */\n  /* We must also scale the output by (8/1)**2 = 2**6. */\n  /* Apply unsigned->signed conversion */\n  data[0] = (DCTELEM)\n    ((GETJSAMPLE(sample_data[0][start_col]) - CENTERJSAMPLE) << 6);\n}\n\n\n/*\n * Perform the forward DCT on a 9x9 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_9x9 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4;\n  INT32 tmp10, tmp11, tmp12, tmp13;\n  INT32 z1, z2;\n  DCTELEM workspace[8];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* we scale the results further by 2 as part of output adaption */\n  /* scaling for different DCT size. */\n  /* cK represents sqrt(2) * cos(K*pi/18). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[8]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[7]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[6]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[5]);\n    tmp4 = GETJSAMPLE(elemptr[4]);\n\n    tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[8]);\n    tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[7]);\n    tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[6]);\n    tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[5]);\n\n    z1 = tmp0 + tmp2 + tmp3;\n    z2 = tmp1 + tmp4;\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM) ((z1 + z2 - 9 * CENTERJSAMPLE) << 1);\n    dataptr[6] = (DCTELEM)\n      DESCALE(MULTIPLY(z1 - z2 - z2, FIX(0.707106781)),  /* c6 */\n\t      CONST_BITS-1);\n    z1 = MULTIPLY(tmp0 - tmp2, FIX(1.328926049));        /* c2 */\n    z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(0.707106781)); /* c6 */\n    dataptr[2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.083350441))    /* c4 */\n\t      + z1 + z2, CONST_BITS-1);\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.245575608))    /* c8 */\n\t      + z1 - z2, CONST_BITS-1);\n\n    /* Odd part */\n\n    dataptr[3] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.224744871)), /* c3 */\n\t      CONST_BITS-1);\n\n    tmp11 = MULTIPLY(tmp11, FIX(1.224744871));        /* c3 */\n    tmp0 = MULTIPLY(tmp10 + tmp12, FIX(0.909038955)); /* c5 */\n    tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.483689525)); /* c7 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS-1);\n\n    tmp2 = MULTIPLY(tmp12 - tmp13, FIX(1.392728481)); /* c1 */\n\n    dataptr[5] = (DCTELEM) DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS-1);\n    dataptr[7] = (DCTELEM) DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS-1);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 9)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/9)**2 = 64/81, which we partially\n   * fold into the constant multipliers and final/initial shifting:\n   * cK now represents sqrt(2) * cos(K*pi/18) * 128/81.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*0];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*7];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*6];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*5];\n    tmp4 = dataptr[DCTSIZE*4];\n\n    tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*0];\n    tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*7];\n    tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*6];\n    tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*5];\n\n    z1 = tmp0 + tmp2 + tmp3;\n    z2 = tmp1 + tmp4;\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(z1 + z2, FIX(1.580246914)),       /* 128/81 */\n\t      CONST_BITS+2);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(MULTIPLY(z1 - z2 - z2, FIX(1.117403309)),  /* c6 */\n\t      CONST_BITS+2);\n    z1 = MULTIPLY(tmp0 - tmp2, FIX(2.100031287));        /* c2 */\n    z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(1.117403309)); /* c6 */\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.711961190))    /* c4 */\n\t      + z1 + z2, CONST_BITS+2);\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.388070096))    /* c8 */\n\t      + z1 - z2, CONST_BITS+2);\n\n    /* Odd part */\n\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.935399303)), /* c3 */\n\t      CONST_BITS+2);\n\n    tmp11 = MULTIPLY(tmp11, FIX(1.935399303));        /* c3 */\n    tmp0 = MULTIPLY(tmp10 + tmp12, FIX(1.436506004)); /* c5 */\n    tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.764348879)); /* c7 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS+2);\n\n    tmp2 = MULTIPLY(tmp12 - tmp13, FIX(2.200854883)); /* c1 */\n\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS+2);\n    dataptr[DCTSIZE*7] = (DCTELEM)\n      DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS+2);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 10x10 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_10x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14;\n  DCTELEM workspace[8*2];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* we scale the results further by 2 as part of output adaption */\n  /* scaling for different DCT size. */\n  /* cK represents sqrt(2) * cos(K*pi/20). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]);\n    tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]);\n\n    tmp10 = tmp0 + tmp4;\n    tmp13 = tmp0 - tmp4;\n    tmp11 = tmp1 + tmp3;\n    tmp14 = tmp1 - tmp3;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]);\n    tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << 1);\n    tmp12 += tmp12;\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */\n\t      MULTIPLY(tmp11 - tmp12, FIX(0.437016024)),  /* c8 */\n\t      CONST_BITS-1);\n    tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876));    /* c6 */\n    dataptr[2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)),  /* c2-c6 */\n\t      CONST_BITS-1);\n    dataptr[6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)),  /* c2+c6 */\n\t      CONST_BITS-1);\n\n    /* Odd part */\n\n    tmp10 = tmp0 + tmp4;\n    tmp11 = tmp1 - tmp3;\n    dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << 1);\n    tmp2 <<= CONST_BITS;\n    dataptr[1] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) +          /* c1 */\n\t      MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 +   /* c3 */\n\t      MULTIPLY(tmp3, FIX(0.642039522)) +          /* c7 */\n\t      MULTIPLY(tmp4, FIX(0.221231742)),           /* c9 */\n\t      CONST_BITS-1);\n    tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) -     /* (c3+c7)/2 */\n\t    MULTIPLY(tmp1 + tmp3, FIX(0.587785252));      /* (c1-c9)/2 */\n    tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) +   /* (c3-c7)/2 */\n\t    (tmp11 << (CONST_BITS - 1)) - tmp2;\n    dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-1);\n    dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-1);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 10)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/10)**2 = 16/25, which we partially\n   * fold into the constant multipliers and final/initial shifting:\n   * cK now represents sqrt(2) * cos(K*pi/20) * 32/25.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0];\n    tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6];\n    tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];\n\n    tmp10 = tmp0 + tmp4;\n    tmp13 = tmp0 - tmp4;\n    tmp11 = tmp1 + tmp3;\n    tmp14 = tmp1 - tmp3;\n\n    tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1];\n    tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0];\n    tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7];\n    tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6];\n    tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */\n\t      CONST_BITS+2);\n    tmp12 += tmp12;\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */\n\t      MULTIPLY(tmp11 - tmp12, FIX(0.559380511)),  /* c8 */\n\t      CONST_BITS+2);\n    tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961));    /* c6 */\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)),  /* c2-c6 */\n\t      CONST_BITS+2);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)),  /* c2+c6 */\n\t      CONST_BITS+2);\n\n    /* Odd part */\n\n    tmp10 = tmp0 + tmp4;\n    tmp11 = tmp1 - tmp3;\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)),  /* 32/25 */\n\t      CONST_BITS+2);\n    tmp2 = MULTIPLY(tmp2, FIX(1.28));                     /* 32/25 */\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) +          /* c1 */\n\t      MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 +   /* c3 */\n\t      MULTIPLY(tmp3, FIX(0.821810588)) +          /* c7 */\n\t      MULTIPLY(tmp4, FIX(0.283176630)),           /* c9 */\n\t      CONST_BITS+2);\n    tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) -     /* (c3+c7)/2 */\n\t    MULTIPLY(tmp1 + tmp3, FIX(0.752365123));      /* (c1-c9)/2 */\n    tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) +   /* (c3-c7)/2 */\n\t    MULTIPLY(tmp11, FIX(0.64)) - tmp2;            /* 16/25 */\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+2);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+2);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on an 11x11 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_11x11 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14;\n  INT32 z1, z2, z3;\n  DCTELEM workspace[8*3];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* we scale the results further by 2 as part of output adaption */\n  /* scaling for different DCT size. */\n  /* cK represents sqrt(2) * cos(K*pi/22). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[10]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[9]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[8]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[7]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[6]);\n    tmp5 = GETJSAMPLE(elemptr[5]);\n\n    tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[10]);\n    tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[9]);\n    tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[8]);\n    tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[7]);\n    tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[6]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 - 11 * CENTERJSAMPLE) << 1);\n    tmp5 += tmp5;\n    tmp0 -= tmp5;\n    tmp1 -= tmp5;\n    tmp2 -= tmp5;\n    tmp3 -= tmp5;\n    tmp4 -= tmp5;\n    z1 = MULTIPLY(tmp0 + tmp3, FIX(1.356927976)) +       /* c2 */\n\t MULTIPLY(tmp2 + tmp4, FIX(0.201263574));        /* c10 */\n    z2 = MULTIPLY(tmp1 - tmp3, FIX(0.926112931));        /* c6 */\n    z3 = MULTIPLY(tmp0 - tmp1, FIX(1.189712156));        /* c4 */\n    dataptr[2] = (DCTELEM)\n      DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.018300590)) /* c2+c8-c6 */\n\t      - MULTIPLY(tmp4, FIX(1.390975730)),        /* c4+c10 */\n\t      CONST_BITS-1);\n    dataptr[4] = (DCTELEM)\n      DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.062335650)) /* c4-c6-c10 */\n\t      - MULTIPLY(tmp2, FIX(1.356927976))         /* c2 */\n\t      + MULTIPLY(tmp4, FIX(0.587485545)),        /* c8 */\n\t      CONST_BITS-1);\n    dataptr[6] = (DCTELEM)\n      DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.620527200)) /* c2+c4-c6 */\n\t      - MULTIPLY(tmp2, FIX(0.788749120)),        /* c8+c10 */\n\t      CONST_BITS-1);\n\n    /* Odd part */\n\n    tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.286413905));    /* c3 */\n    tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.068791298));    /* c5 */\n    tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.764581576));    /* c7 */\n    tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.719967871)) /* c7+c5+c3-c1 */\n\t   + MULTIPLY(tmp14, FIX(0.398430003));          /* c9 */\n    tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.764581576));  /* -c7 */\n    tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.399818907));  /* -c1 */\n    tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.276416582)) /* c9+c7+c1-c3 */\n\t    - MULTIPLY(tmp14, FIX(1.068791298));         /* c5 */\n    tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.398430003));   /* c9 */\n    tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(1.989053629)) /* c9+c5+c3-c7 */\n\t    + MULTIPLY(tmp14, FIX(1.399818907));         /* c1 */\n    tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.305598626)) /* c1+c5-c9-c7 */\n\t    - MULTIPLY(tmp14, FIX(1.286413905));         /* c3 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-1);\n    dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-1);\n    dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-1);\n    dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS-1);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 11)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/11)**2 = 64/121, which we partially\n   * fold into the constant multipliers and final/initial shifting:\n   * cK now represents sqrt(2) * cos(K*pi/22) * 128/121.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*2];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*1];\n    tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*0];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*7];\n    tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*6];\n    tmp5 = dataptr[DCTSIZE*5];\n\n    tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*2];\n    tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*1];\n    tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*0];\n    tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*7];\n    tmp14 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*6];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5,\n\t\t       FIX(1.057851240)),                /* 128/121 */\n\t      CONST_BITS+2);\n    tmp5 += tmp5;\n    tmp0 -= tmp5;\n    tmp1 -= tmp5;\n    tmp2 -= tmp5;\n    tmp3 -= tmp5;\n    tmp4 -= tmp5;\n    z1 = MULTIPLY(tmp0 + tmp3, FIX(1.435427942)) +       /* c2 */\n\t MULTIPLY(tmp2 + tmp4, FIX(0.212906922));        /* c10 */\n    z2 = MULTIPLY(tmp1 - tmp3, FIX(0.979689713));        /* c6 */\n    z3 = MULTIPLY(tmp0 - tmp1, FIX(1.258538479));        /* c4 */\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.077210542)) /* c2+c8-c6 */\n\t      - MULTIPLY(tmp4, FIX(1.471445400)),        /* c4+c10 */\n\t      CONST_BITS+2);\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.065941844)) /* c4-c6-c10 */\n\t      - MULTIPLY(tmp2, FIX(1.435427942))         /* c2 */\n\t      + MULTIPLY(tmp4, FIX(0.621472312)),        /* c8 */\n\t      CONST_BITS+2);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.714276708)) /* c2+c4-c6 */\n\t      - MULTIPLY(tmp2, FIX(0.834379234)),        /* c8+c10 */\n\t      CONST_BITS+2);\n\n    /* Odd part */\n\n    tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.360834544));    /* c3 */\n    tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.130622199));    /* c5 */\n    tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.808813568));    /* c7 */\n    tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.819470145)) /* c7+c5+c3-c1 */\n\t   + MULTIPLY(tmp14, FIX(0.421479672));          /* c9 */\n    tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.808813568));  /* -c7 */\n    tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.480800167));  /* -c1 */\n    tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.350258864)) /* c9+c7+c1-c3 */\n\t    - MULTIPLY(tmp14, FIX(1.130622199));         /* c5 */\n    tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.421479672));   /* c9 */\n    tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(2.104122847)) /* c9+c5+c3-c7 */\n\t    + MULTIPLY(tmp14, FIX(1.480800167));         /* c1 */\n    tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.381129125)) /* c1+c5-c9-c7 */\n\t    - MULTIPLY(tmp14, FIX(1.360834544));         /* c3 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 12x12 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_12x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;\n  DCTELEM workspace[8*4];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT. */\n  /* cK represents sqrt(2) * cos(K*pi/24). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]);\n    tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]);\n\n    tmp10 = tmp0 + tmp5;\n    tmp13 = tmp0 - tmp5;\n    tmp11 = tmp1 + tmp4;\n    tmp14 = tmp1 - tmp4;\n    tmp12 = tmp2 + tmp3;\n    tmp15 = tmp2 - tmp3;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]);\n    tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]);\n    tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM) (tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE);\n    dataptr[6] = (DCTELEM) (tmp13 - tmp14 - tmp15);\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */\n\t      CONST_BITS);\n    dataptr[2] = (DCTELEM)\n      DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */\n\t      CONST_BITS);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100);    /* c9 */\n    tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865);   /* c3-c9 */\n    tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065);   /* c3+c9 */\n    tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054));   /* c5 */\n    tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669));   /* c7 */\n    tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */\n\t    + MULTIPLY(tmp5, FIX(0.184591911));        /* c11 */\n    tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */\n    tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */\n\t    + MULTIPLY(tmp5, FIX(0.860918669));        /* c7 */\n    tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */\n\t    - MULTIPLY(tmp5, FIX(1.121971054));        /* c5 */\n    tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */\n\t    - MULTIPLY(tmp2 + tmp5, FIX_0_541196100);  /* c9 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS);\n    dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 12)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/12)**2 = 4/9, which we partially\n   * fold into the constant multipliers and final shifting:\n   * cK now represents sqrt(2) * cos(K*pi/24) * 8/9.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2];\n    tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1];\n    tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0];\n    tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7];\n    tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6];\n\n    tmp10 = tmp0 + tmp5;\n    tmp13 = tmp0 - tmp5;\n    tmp11 = tmp1 + tmp4;\n    tmp14 = tmp1 - tmp4;\n    tmp12 = tmp2 + tmp3;\n    tmp15 = tmp2 - tmp3;\n\n    tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3];\n    tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2];\n    tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1];\n    tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0];\n    tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7];\n    tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */\n\t      CONST_BITS+1);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */\n\t      CONST_BITS+1);\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)),         /* c4 */\n\t      CONST_BITS+1);\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) +        /* 8/9 */\n\t      MULTIPLY(tmp13 + tmp15, FIX(1.214244803)),         /* c2 */\n\t      CONST_BITS+1);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200));   /* c9 */\n    tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102));  /* c3-c9 */\n    tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502));  /* c3+c9 */\n    tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603));   /* c5 */\n    tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039));   /* c7 */\n    tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */\n\t    + MULTIPLY(tmp5, FIX(0.164081699));        /* c11 */\n    tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */\n    tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */\n\t    + MULTIPLY(tmp5, FIX(0.765261039));        /* c7 */\n    tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */\n\t    - MULTIPLY(tmp5, FIX(0.997307603));        /* c5 */\n    tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */\n\t    - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+1);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+1);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+1);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+1);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 13x13 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_13x13 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;\n  INT32 z1, z2;\n  DCTELEM workspace[8*5];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT. */\n  /* cK represents sqrt(2) * cos(K*pi/26). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[12]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[11]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[10]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[9]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[8]);\n    tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[7]);\n    tmp6 = GETJSAMPLE(elemptr[6]);\n\n    tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[12]);\n    tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[11]);\n    tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[10]);\n    tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[9]);\n    tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[8]);\n    tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[7]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      (tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 - 13 * CENTERJSAMPLE);\n    tmp6 += tmp6;\n    tmp0 -= tmp6;\n    tmp1 -= tmp6;\n    tmp2 -= tmp6;\n    tmp3 -= tmp6;\n    tmp4 -= tmp6;\n    tmp5 -= tmp6;\n    dataptr[2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0, FIX(1.373119086)) +   /* c2 */\n\t      MULTIPLY(tmp1, FIX(1.058554052)) +   /* c6 */\n\t      MULTIPLY(tmp2, FIX(0.501487041)) -   /* c10 */\n\t      MULTIPLY(tmp3, FIX(0.170464608)) -   /* c12 */\n\t      MULTIPLY(tmp4, FIX(0.803364869)) -   /* c8 */\n\t      MULTIPLY(tmp5, FIX(1.252223920)),    /* c4 */\n\t      CONST_BITS);\n    z1 = MULTIPLY(tmp0 - tmp2, FIX(1.155388986)) - /* (c4+c6)/2 */\n\t MULTIPLY(tmp3 - tmp4, FIX(0.435816023)) - /* (c2-c10)/2 */\n\t MULTIPLY(tmp1 - tmp5, FIX(0.316450131));  /* (c8-c12)/2 */\n    z2 = MULTIPLY(tmp0 + tmp2, FIX(0.096834934)) - /* (c4-c6)/2 */\n\t MULTIPLY(tmp3 + tmp4, FIX(0.937303064)) + /* (c2+c10)/2 */\n\t MULTIPLY(tmp1 + tmp5, FIX(0.486914739));  /* (c8+c12)/2 */\n\n    dataptr[4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS);\n    dataptr[6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS);\n\n    /* Odd part */\n\n    tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.322312651));   /* c3 */\n    tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.163874945));   /* c5 */\n    tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.937797057)) +  /* c7 */\n\t   MULTIPLY(tmp14 + tmp15, FIX(0.338443458));   /* c11 */\n    tmp0 = tmp1 + tmp2 + tmp3 -\n\t   MULTIPLY(tmp10, FIX(2.020082300)) +          /* c3+c5+c7-c1 */\n\t   MULTIPLY(tmp14, FIX(0.318774355));           /* c9-c11 */\n    tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.937797057)) -  /* c7 */\n\t   MULTIPLY(tmp11 + tmp12, FIX(0.338443458));   /* c11 */\n    tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.163874945)); /* -c5 */\n    tmp1 += tmp4 + tmp5 +\n\t    MULTIPLY(tmp11, FIX(0.837223564)) -         /* c5+c9+c11-c3 */\n\t    MULTIPLY(tmp14, FIX(2.341699410));          /* c1+c7 */\n    tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.657217813)); /* -c9 */\n    tmp2 += tmp4 + tmp6 -\n\t    MULTIPLY(tmp12, FIX(1.572116027)) +         /* c1+c5-c9-c11 */\n\t    MULTIPLY(tmp15, FIX(2.260109708));          /* c3+c7 */\n    tmp3 += tmp5 + tmp6 +\n\t    MULTIPLY(tmp13, FIX(2.205608352)) -         /* c3+c5+c9-c7 */\n\t    MULTIPLY(tmp15, FIX(1.742345811));          /* c1+c11 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS);\n    dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 13)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/13)**2 = 64/169, which we partially\n   * fold into the constant multipliers and final shifting:\n   * cK now represents sqrt(2) * cos(K*pi/26) * 128/169.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*4];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*3];\n    tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*2];\n    tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*1];\n    tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*0];\n    tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*7];\n    tmp6 = dataptr[DCTSIZE*6];\n\n    tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*4];\n    tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*3];\n    tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*2];\n    tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*1];\n    tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*0];\n    tmp15 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*7];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6,\n\t\t       FIX(0.757396450)),          /* 128/169 */\n\t      CONST_BITS+1);\n    tmp6 += tmp6;\n    tmp0 -= tmp6;\n    tmp1 -= tmp6;\n    tmp2 -= tmp6;\n    tmp3 -= tmp6;\n    tmp4 -= tmp6;\n    tmp5 -= tmp6;\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0, FIX(1.039995521)) +   /* c2 */\n\t      MULTIPLY(tmp1, FIX(0.801745081)) +   /* c6 */\n\t      MULTIPLY(tmp2, FIX(0.379824504)) -   /* c10 */\n\t      MULTIPLY(tmp3, FIX(0.129109289)) -   /* c12 */\n\t      MULTIPLY(tmp4, FIX(0.608465700)) -   /* c8 */\n\t      MULTIPLY(tmp5, FIX(0.948429952)),    /* c4 */\n\t      CONST_BITS+1);\n    z1 = MULTIPLY(tmp0 - tmp2, FIX(0.875087516)) - /* (c4+c6)/2 */\n\t MULTIPLY(tmp3 - tmp4, FIX(0.330085509)) - /* (c2-c10)/2 */\n\t MULTIPLY(tmp1 - tmp5, FIX(0.239678205));  /* (c8-c12)/2 */\n    z2 = MULTIPLY(tmp0 + tmp2, FIX(0.073342435)) - /* (c4-c6)/2 */\n\t MULTIPLY(tmp3 + tmp4, FIX(0.709910013)) + /* (c2+c10)/2 */\n\t MULTIPLY(tmp1 + tmp5, FIX(0.368787494));  /* (c8+c12)/2 */\n\n    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+1);\n    dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS+1);\n\n    /* Odd part */\n\n    tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.001514908));   /* c3 */\n    tmp2 = MULTIPLY(tmp10 + tmp12, FIX(0.881514751));   /* c5 */\n    tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.710284161)) +  /* c7 */\n\t   MULTIPLY(tmp14 + tmp15, FIX(0.256335874));   /* c11 */\n    tmp0 = tmp1 + tmp2 + tmp3 -\n\t   MULTIPLY(tmp10, FIX(1.530003162)) +          /* c3+c5+c7-c1 */\n\t   MULTIPLY(tmp14, FIX(0.241438564));           /* c9-c11 */\n    tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.710284161)) -  /* c7 */\n\t   MULTIPLY(tmp11 + tmp12, FIX(0.256335874));   /* c11 */\n    tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(0.881514751)); /* -c5 */\n    tmp1 += tmp4 + tmp5 +\n\t    MULTIPLY(tmp11, FIX(0.634110155)) -         /* c5+c9+c11-c3 */\n\t    MULTIPLY(tmp14, FIX(1.773594819));          /* c1+c7 */\n    tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.497774438)); /* -c9 */\n    tmp2 += tmp4 + tmp6 -\n\t    MULTIPLY(tmp12, FIX(1.190715098)) +         /* c1+c5-c9-c11 */\n\t    MULTIPLY(tmp15, FIX(1.711799069));          /* c3+c7 */\n    tmp3 += tmp5 + tmp6 +\n\t    MULTIPLY(tmp13, FIX(1.670519935)) -         /* c3+c5+c9-c7 */\n\t    MULTIPLY(tmp15, FIX(1.319646532));          /* c1+c11 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+1);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+1);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+1);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+1);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 14x14 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_14x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;\n  DCTELEM workspace[8*6];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT. */\n  /* cK represents sqrt(2) * cos(K*pi/28). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]);\n    tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]);\n    tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]);\n    tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]);\n\n    tmp10 = tmp0 + tmp6;\n    tmp14 = tmp0 - tmp6;\n    tmp11 = tmp1 + tmp5;\n    tmp15 = tmp1 - tmp5;\n    tmp12 = tmp2 + tmp4;\n    tmp16 = tmp2 - tmp4;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]);\n    tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]);\n    tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]);\n    tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      (tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE);\n    tmp13 += tmp13;\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */\n\t      MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */\n\t      MULTIPLY(tmp12 - tmp13, FIX(0.881747734)),  /* c8 */\n\t      CONST_BITS);\n\n    tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686));    /* c6 */\n\n    dataptr[2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590))   /* c2-c6 */\n\t      + MULTIPLY(tmp16, FIX(0.613604268)),        /* c10 */\n\t      CONST_BITS);\n    dataptr[6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954))   /* c6+c10 */\n\t      - MULTIPLY(tmp16, FIX(1.378756276)),        /* c2 */\n\t      CONST_BITS);\n\n    /* Odd part */\n\n    tmp10 = tmp1 + tmp2;\n    tmp11 = tmp5 - tmp4;\n    dataptr[7] = (DCTELEM) (tmp0 - tmp10 + tmp3 - tmp11 - tmp6);\n    tmp3 <<= CONST_BITS;\n    tmp10 = MULTIPLY(tmp10, - FIX(0.158341681));          /* -c13 */\n    tmp11 = MULTIPLY(tmp11, FIX(1.405321284));            /* c1 */\n    tmp10 += tmp11 - tmp3;\n    tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) +     /* c5 */\n\t    MULTIPLY(tmp4 + tmp6, FIX(0.752406978));      /* c9 */\n    dataptr[5] = (DCTELEM)\n      DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */\n\t      + MULTIPLY(tmp4, FIX(1.119999435)),         /* c1+c11-c9 */\n\t      CONST_BITS);\n    tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) +     /* c3 */\n\t    MULTIPLY(tmp5 - tmp6, FIX(0.467085129));      /* c11 */\n    dataptr[3] = (DCTELEM)\n      DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */\n\t      - MULTIPLY(tmp5, FIX(3.069855259)),         /* c1+c5+c11 */\n\t      CONST_BITS);\n    dataptr[1] = (DCTELEM)\n      DESCALE(tmp11 + tmp12 + tmp3 + tmp6 -\n\t      MULTIPLY(tmp0 + tmp6, FIX(1.126980169)),    /* c3+c5-c1 */\n\t      CONST_BITS);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 14)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/14)**2 = 16/49, which we partially\n   * fold into the constant multipliers and final shifting:\n   * cK now represents sqrt(2) * cos(K*pi/28) * 32/49.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3];\n    tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2];\n    tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1];\n    tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0];\n    tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];\n\n    tmp10 = tmp0 + tmp6;\n    tmp14 = tmp0 - tmp6;\n    tmp11 = tmp1 + tmp5;\n    tmp15 = tmp1 - tmp5;\n    tmp12 = tmp2 + tmp4;\n    tmp16 = tmp2 - tmp4;\n\n    tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5];\n    tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3];\n    tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2];\n    tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1];\n    tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0];\n    tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13,\n\t\t       FIX(0.653061224)),                 /* 32/49 */\n\t      CONST_BITS+1);\n    tmp13 += tmp13;\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */\n\t      MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */\n\t      MULTIPLY(tmp12 - tmp13, FIX(0.575835255)),  /* c8 */\n\t      CONST_BITS+1);\n\n    tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570));    /* c6 */\n\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691))   /* c2-c6 */\n\t      + MULTIPLY(tmp16, FIX(0.400721155)),        /* c10 */\n\t      CONST_BITS+1);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725))   /* c6+c10 */\n\t      - MULTIPLY(tmp16, FIX(0.900412262)),        /* c2 */\n\t      CONST_BITS+1);\n\n    /* Odd part */\n\n    tmp10 = tmp1 + tmp2;\n    tmp11 = tmp5 - tmp4;\n    dataptr[DCTSIZE*7] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6,\n\t\t       FIX(0.653061224)),                 /* 32/49 */\n\t      CONST_BITS+1);\n    tmp3  = MULTIPLY(tmp3 , FIX(0.653061224));            /* 32/49 */\n    tmp10 = MULTIPLY(tmp10, - FIX(0.103406812));          /* -c13 */\n    tmp11 = MULTIPLY(tmp11, FIX(0.917760839));            /* c1 */\n    tmp10 += tmp11 - tmp3;\n    tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) +     /* c5 */\n\t    MULTIPLY(tmp4 + tmp6, FIX(0.491367823));      /* c9 */\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */\n\t      + MULTIPLY(tmp4, FIX(0.731428202)),         /* c1+c11-c9 */\n\t      CONST_BITS+1);\n    tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) +     /* c3 */\n\t    MULTIPLY(tmp5 - tmp6, FIX(0.305035186));      /* c11 */\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */\n\t      - MULTIPLY(tmp5, FIX(2.004803435)),         /* c1+c5+c11 */\n\t      CONST_BITS+1);\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(tmp11 + tmp12 + tmp3\n\t      - MULTIPLY(tmp0, FIX(0.735987049))          /* c3+c5-c1 */\n\t      - MULTIPLY(tmp6, FIX(0.082925825)),         /* c9-c11-c13 */\n\t      CONST_BITS+1);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 15x15 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_15x15 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;\n  INT32 z1, z2, z3;\n  DCTELEM workspace[8*7];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT. */\n  /* cK represents sqrt(2) * cos(K*pi/30). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[14]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[13]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[12]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[11]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[10]);\n    tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[9]);\n    tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[8]);\n    tmp7 = GETJSAMPLE(elemptr[7]);\n\n    tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[14]);\n    tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[13]);\n    tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[12]);\n    tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[11]);\n    tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[10]);\n    tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[9]);\n    tmp16 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[8]);\n\n    z1 = tmp0 + tmp4 + tmp5;\n    z2 = tmp1 + tmp3 + tmp6;\n    z3 = tmp2 + tmp7;\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM) (z1 + z2 + z3 - 15 * CENTERJSAMPLE);\n    z3 += z3;\n    dataptr[6] = (DCTELEM)\n      DESCALE(MULTIPLY(z1 - z3, FIX(1.144122806)) - /* c6 */\n\t      MULTIPLY(z2 - z3, FIX(0.437016024)),  /* c12 */\n\t      CONST_BITS);\n    tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7;\n    z1 = MULTIPLY(tmp3 - tmp2, FIX(1.531135173)) -  /* c2+c14 */\n         MULTIPLY(tmp6 - tmp2, FIX(2.238241955));   /* c4+c8 */\n    z2 = MULTIPLY(tmp5 - tmp2, FIX(0.798468008)) -  /* c8-c14 */\n\t MULTIPLY(tmp0 - tmp2, FIX(0.091361227));   /* c2-c4 */\n    z3 = MULTIPLY(tmp0 - tmp3, FIX(1.383309603)) +  /* c2 */\n\t MULTIPLY(tmp6 - tmp5, FIX(0.946293579)) +  /* c8 */\n\t MULTIPLY(tmp1 - tmp4, FIX(0.790569415));   /* (c6+c12)/2 */\n\n    dataptr[2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS);\n    dataptr[4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS);\n\n    /* Odd part */\n\n    tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16,\n\t\t    FIX(1.224744871));                         /* c5 */\n    tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.344997024)) + /* c3 */\n\t   MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.831253876));  /* c9 */\n    tmp12 = MULTIPLY(tmp12, FIX(1.224744871));                 /* c5 */\n    tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.406466353)) +         /* c1 */\n\t   MULTIPLY(tmp11 + tmp14, FIX(1.344997024)) +         /* c3 */\n\t   MULTIPLY(tmp13 + tmp15, FIX(0.575212477));          /* c11 */\n    tmp0 = MULTIPLY(tmp13, FIX(0.475753014)) -                 /* c7-c11 */\n\t   MULTIPLY(tmp14, FIX(0.513743148)) +                 /* c3-c9 */\n\t   MULTIPLY(tmp16, FIX(1.700497885)) + tmp4 + tmp12;   /* c1+c13 */\n    tmp3 = MULTIPLY(tmp10, - FIX(0.355500862)) -               /* -(c1-c7) */\n\t   MULTIPLY(tmp11, FIX(2.176250899)) -                 /* c3+c9 */\n\t   MULTIPLY(tmp15, FIX(0.869244010)) + tmp4 - tmp12;   /* c11+c13 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS);\n    dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 15)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/15)**2 = 64/225, which we partially\n   * fold into the constant multipliers and final shifting:\n   * cK now represents sqrt(2) * cos(K*pi/30) * 256/225.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*6];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*5];\n    tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*4];\n    tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*3];\n    tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*2];\n    tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*1];\n    tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*0];\n    tmp7 = dataptr[DCTSIZE*7];\n\n    tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*6];\n    tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*5];\n    tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*4];\n    tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*3];\n    tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*2];\n    tmp15 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*1];\n    tmp16 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*0];\n\n    z1 = tmp0 + tmp4 + tmp5;\n    z2 = tmp1 + tmp3 + tmp6;\n    z3 = tmp2 + tmp7;\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(z1 + z2 + z3, FIX(1.137777778)), /* 256/225 */\n\t      CONST_BITS+2);\n    z3 += z3;\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(MULTIPLY(z1 - z3, FIX(1.301757503)) - /* c6 */\n\t      MULTIPLY(z2 - z3, FIX(0.497227121)),  /* c12 */\n\t      CONST_BITS+2);\n    tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7;\n    z1 = MULTIPLY(tmp3 - tmp2, FIX(1.742091575)) -  /* c2+c14 */\n         MULTIPLY(tmp6 - tmp2, FIX(2.546621957));   /* c4+c8 */\n    z2 = MULTIPLY(tmp5 - tmp2, FIX(0.908479156)) -  /* c8-c14 */\n\t MULTIPLY(tmp0 - tmp2, FIX(0.103948774));   /* c2-c4 */\n    z3 = MULTIPLY(tmp0 - tmp3, FIX(1.573898926)) +  /* c2 */\n\t MULTIPLY(tmp6 - tmp5, FIX(1.076671805)) +  /* c8 */\n\t MULTIPLY(tmp1 - tmp4, FIX(0.899492312));   /* (c6+c12)/2 */\n\n    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS+2);\n    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS+2);\n\n    /* Odd part */\n\n    tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16,\n\t\t    FIX(1.393487498));                         /* c5 */\n    tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.530307725)) + /* c3 */\n\t   MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.945782187));  /* c9 */\n    tmp12 = MULTIPLY(tmp12, FIX(1.393487498));                 /* c5 */\n    tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.600246161)) +         /* c1 */\n\t   MULTIPLY(tmp11 + tmp14, FIX(1.530307725)) +         /* c3 */\n\t   MULTIPLY(tmp13 + tmp15, FIX(0.654463974));          /* c11 */\n    tmp0 = MULTIPLY(tmp13, FIX(0.541301207)) -                 /* c7-c11 */\n\t   MULTIPLY(tmp14, FIX(0.584525538)) +                 /* c3-c9 */\n\t   MULTIPLY(tmp16, FIX(1.934788705)) + tmp4 + tmp12;   /* c1+c13 */\n    tmp3 = MULTIPLY(tmp10, - FIX(0.404480980)) -               /* -(c1-c7) */\n\t   MULTIPLY(tmp11, FIX(2.476089912)) -                 /* c3+c9 */\n\t   MULTIPLY(tmp15, FIX(0.989006518)) + tmp4 - tmp12;   /* c11+c13 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 16x16 sample block.\n */\n\nGLOBAL(void)\njpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17;\n  DCTELEM workspace[DCTSIZE2];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* cK represents sqrt(2) * cos(K*pi/32). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]);\n    tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]);\n    tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]);\n    tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]);\n\n    tmp10 = tmp0 + tmp7;\n    tmp14 = tmp0 - tmp7;\n    tmp11 = tmp1 + tmp6;\n    tmp15 = tmp1 - tmp6;\n    tmp12 = tmp2 + tmp5;\n    tmp16 = tmp2 - tmp5;\n    tmp13 = tmp3 + tmp4;\n    tmp17 = tmp3 - tmp4;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]);\n    tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]);\n    tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]);\n    tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]);\n    tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS);\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */\n\t      MULTIPLY(tmp11 - tmp12, FIX_0_541196100),   /* c12[16] = c6[8] */\n\t      CONST_BITS-PASS1_BITS);\n\n    tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) +   /* c14[16] = c7[8] */\n\t    MULTIPLY(tmp14 - tmp16, FIX(1.387039845));    /* c2[16] = c1[8] */\n\n    dataptr[2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982))   /* c6+c14 */\n\t      + MULTIPLY(tmp16, FIX(2.172734804)),        /* c2+c10 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243))   /* c2-c6 */\n\t      - MULTIPLY(tmp17, FIX(1.061594338)),        /* c10+c14 */\n\t      CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) +         /* c3 */\n\t    MULTIPLY(tmp6 - tmp7, FIX(0.410524528));          /* c13 */\n    tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) +         /* c5 */\n\t    MULTIPLY(tmp5 + tmp7, FIX(0.666655658));          /* c11 */\n    tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) +         /* c7 */\n\t    MULTIPLY(tmp4 - tmp7, FIX(0.897167586));          /* c9 */\n    tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) +         /* c15 */\n\t    MULTIPLY(tmp6 - tmp5, FIX(1.407403738));          /* c1 */\n    tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) +       /* -c11 */\n\t    MULTIPLY(tmp4 + tmp6, - FIX(1.247225013));        /* -c5 */\n    tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) +       /* -c3 */\n\t    MULTIPLY(tmp5 - tmp4, FIX(0.410524528));          /* c13 */\n    tmp10 = tmp11 + tmp12 + tmp13 -\n\t    MULTIPLY(tmp0, FIX(2.286341144)) +                /* c7+c5+c3-c1 */\n\t    MULTIPLY(tmp7, FIX(0.779653625));                 /* c15+c13-c11+c9 */\n    tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */\n\t     - MULTIPLY(tmp6, FIX(1.663905119));              /* c7+c13+c1-c5 */\n    tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */\n\t     + MULTIPLY(tmp5, FIX(1.227391138));              /* c9-c11+c1-c13 */\n    tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */\n\t     + MULTIPLY(tmp4, FIX(2.167985692));              /* c1+c13+c5-c9 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS);\n    dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == DCTSIZE * 2)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/16)**2 = 1/2**2.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4];\n    tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3];\n    tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2];\n    tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1];\n    tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0];\n\n    tmp10 = tmp0 + tmp7;\n    tmp14 = tmp0 - tmp7;\n    tmp11 = tmp1 + tmp6;\n    tmp15 = tmp1 - tmp6;\n    tmp12 = tmp2 + tmp5;\n    tmp16 = tmp2 - tmp5;\n    tmp13 = tmp3 + tmp4;\n    tmp17 = tmp3 - tmp4;\n\n    tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4];\n    tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3];\n    tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2];\n    tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1];\n    tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+2);\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */\n\t      MULTIPLY(tmp11 - tmp12, FIX_0_541196100),   /* c12[16] = c6[8] */\n\t      CONST_BITS+PASS1_BITS+2);\n\n    tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) +   /* c14[16] = c7[8] */\n\t    MULTIPLY(tmp14 - tmp16, FIX(1.387039845));    /* c2[16] = c1[8] */\n\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982))   /* c6+c14 */\n\t      + MULTIPLY(tmp16, FIX(2.172734804)),        /* c2+10 */\n\t      CONST_BITS+PASS1_BITS+2);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243))   /* c2-c6 */\n\t      - MULTIPLY(tmp17, FIX(1.061594338)),        /* c10+c14 */\n\t      CONST_BITS+PASS1_BITS+2);\n\n    /* Odd part */\n\n    tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) +         /* c3 */\n\t    MULTIPLY(tmp6 - tmp7, FIX(0.410524528));          /* c13 */\n    tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) +         /* c5 */\n\t    MULTIPLY(tmp5 + tmp7, FIX(0.666655658));          /* c11 */\n    tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) +         /* c7 */\n\t    MULTIPLY(tmp4 - tmp7, FIX(0.897167586));          /* c9 */\n    tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) +         /* c15 */\n\t    MULTIPLY(tmp6 - tmp5, FIX(1.407403738));          /* c1 */\n    tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) +       /* -c11 */\n\t    MULTIPLY(tmp4 + tmp6, - FIX(1.247225013));        /* -c5 */\n    tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) +       /* -c3 */\n\t    MULTIPLY(tmp5 - tmp4, FIX(0.410524528));          /* c13 */\n    tmp10 = tmp11 + tmp12 + tmp13 -\n\t    MULTIPLY(tmp0, FIX(2.286341144)) +                /* c7+c5+c3-c1 */\n\t    MULTIPLY(tmp7, FIX(0.779653625));                 /* c15+c13-c11+c9 */\n    tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */\n\t     - MULTIPLY(tmp6, FIX(1.663905119));              /* c7+c13+c1-c5 */\n    tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */\n\t     + MULTIPLY(tmp5, FIX(1.227391138));              /* c9-c11+c1-c13 */\n    tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */\n\t     + MULTIPLY(tmp4, FIX(2.167985692));              /* c1+c13+c5-c9 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+2);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+2);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+2);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+2);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 16x8 sample block.\n *\n * 16-point FDCT in pass 1 (rows), 8-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17;\n  INT32 z1;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). */\n\n  dataptr = data;\n  ctr = 0;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]);\n    tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]);\n    tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]);\n    tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]);\n\n    tmp10 = tmp0 + tmp7;\n    tmp14 = tmp0 - tmp7;\n    tmp11 = tmp1 + tmp6;\n    tmp15 = tmp1 - tmp6;\n    tmp12 = tmp2 + tmp5;\n    tmp16 = tmp2 - tmp5;\n    tmp13 = tmp3 + tmp4;\n    tmp17 = tmp3 - tmp4;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]);\n    tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]);\n    tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]);\n    tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]);\n    tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS);\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */\n\t      MULTIPLY(tmp11 - tmp12, FIX_0_541196100),   /* c12[16] = c6[8] */\n\t      CONST_BITS-PASS1_BITS);\n\n    tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) +   /* c14[16] = c7[8] */\n\t    MULTIPLY(tmp14 - tmp16, FIX(1.387039845));    /* c2[16] = c1[8] */\n\n    dataptr[2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982))   /* c6+c14 */\n\t      + MULTIPLY(tmp16, FIX(2.172734804)),        /* c2+c10 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243))   /* c2-c6 */\n\t      - MULTIPLY(tmp17, FIX(1.061594338)),        /* c10+c14 */\n\t      CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) +         /* c3 */\n\t    MULTIPLY(tmp6 - tmp7, FIX(0.410524528));          /* c13 */\n    tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) +         /* c5 */\n\t    MULTIPLY(tmp5 + tmp7, FIX(0.666655658));          /* c11 */\n    tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) +         /* c7 */\n\t    MULTIPLY(tmp4 - tmp7, FIX(0.897167586));          /* c9 */\n    tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) +         /* c15 */\n\t    MULTIPLY(tmp6 - tmp5, FIX(1.407403738));          /* c1 */\n    tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) +       /* -c11 */\n\t    MULTIPLY(tmp4 + tmp6, - FIX(1.247225013));        /* -c5 */\n    tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) +       /* -c3 */\n\t    MULTIPLY(tmp5 - tmp4, FIX(0.410524528));          /* c13 */\n    tmp10 = tmp11 + tmp12 + tmp13 -\n\t    MULTIPLY(tmp0, FIX(2.286341144)) +                /* c7+c5+c3-c1 */\n\t    MULTIPLY(tmp7, FIX(0.779653625));                 /* c15+c13-c11+c9 */\n    tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */\n\t     - MULTIPLY(tmp6, FIX(1.663905119));              /* c7+c13+c1-c5 */\n    tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */\n\t     + MULTIPLY(tmp5, FIX(1.227391138));              /* c9-c11+c1-c13 */\n    tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */\n\t     + MULTIPLY(tmp4, FIX(2.167985692));              /* c1+c13+c5-c9 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS);\n    dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by 8/16 = 1/2.\n   */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part per LL&M figure 1 --- note that published figure is faulty;\n     * rotator \"sqrt(2)*c1\" should be \"sqrt(2)*c6\".\n     */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];\n\n    tmp10 = tmp0 + tmp3;\n    tmp12 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp13 = tmp1 - tmp2;\n\n    tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];\n\n    dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS+1);\n    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS+1);\n\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\n    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865),\n\t\t\t\t\t   CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065),\n\t\t\t\t\t   CONST_BITS+PASS1_BITS+1);\n\n    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\n     * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).\n     * i0..i3 in the paper are tmp0..tmp3 here.\n     */\n\n    tmp10 = tmp0 + tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp1 + tmp3;\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /*  c3 */\n\n    tmp0  = MULTIPLY(tmp0,    FIX_1_501321110);    /*  c1+c3-c5-c7 */\n    tmp1  = MULTIPLY(tmp1,    FIX_3_072711026);    /*  c1+c3+c5-c7 */\n    tmp2  = MULTIPLY(tmp2,    FIX_2_053119869);    /*  c1+c3-c5+c7 */\n    tmp3  = MULTIPLY(tmp3,    FIX_0_298631336);    /* -c1+c3+c5-c7 */\n    tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);    /*  c7-c3 */\n    tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);    /* -c1-c3 */\n    tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);    /*  c5-c3 */\n    tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);    /* -c3-c5 */\n\n    tmp12 += z1;\n    tmp13 += z1;\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12,\n\t\t\t\t\t   CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13,\n\t\t\t\t\t   CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12,\n\t\t\t\t\t   CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13,\n\t\t\t\t\t   CONST_BITS+PASS1_BITS+1);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 14x7 sample block.\n *\n * 14-point FDCT in pass 1 (rows), 7-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_14x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;\n  INT32 z1, z2, z3;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Zero bottom row of output coefficient block. */\n  MEMZERO(&data[DCTSIZE*7], SIZEOF(DCTELEM) * DCTSIZE);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 7; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]);\n    tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]);\n    tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]);\n    tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]);\n\n    tmp10 = tmp0 + tmp6;\n    tmp14 = tmp0 - tmp6;\n    tmp11 = tmp1 + tmp5;\n    tmp15 = tmp1 - tmp5;\n    tmp12 = tmp2 + tmp4;\n    tmp16 = tmp2 - tmp4;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]);\n    tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]);\n    tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]);\n    tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE) << PASS1_BITS);\n    tmp13 += tmp13;\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */\n\t      MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */\n\t      MULTIPLY(tmp12 - tmp13, FIX(0.881747734)),  /* c8 */\n\t      CONST_BITS-PASS1_BITS);\n\n    tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686));    /* c6 */\n\n    dataptr[2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590))   /* c2-c6 */\n\t      + MULTIPLY(tmp16, FIX(0.613604268)),        /* c10 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954))   /* c6+c10 */\n\t      - MULTIPLY(tmp16, FIX(1.378756276)),        /* c2 */\n\t      CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = tmp1 + tmp2;\n    tmp11 = tmp5 - tmp4;\n    dataptr[7] = (DCTELEM) ((tmp0 - tmp10 + tmp3 - tmp11 - tmp6) << PASS1_BITS);\n    tmp3 <<= CONST_BITS;\n    tmp10 = MULTIPLY(tmp10, - FIX(0.158341681));          /* -c13 */\n    tmp11 = MULTIPLY(tmp11, FIX(1.405321284));            /* c1 */\n    tmp10 += tmp11 - tmp3;\n    tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) +     /* c5 */\n\t    MULTIPLY(tmp4 + tmp6, FIX(0.752406978));      /* c9 */\n    dataptr[5] = (DCTELEM)\n      DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */\n\t      + MULTIPLY(tmp4, FIX(1.119999435)),         /* c1+c11-c9 */\n\t      CONST_BITS-PASS1_BITS);\n    tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) +     /* c3 */\n\t    MULTIPLY(tmp5 - tmp6, FIX(0.467085129));      /* c11 */\n    dataptr[3] = (DCTELEM)\n      DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */\n\t      - MULTIPLY(tmp5, FIX(3.069855259)),         /* c1+c5+c11 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[1] = (DCTELEM)\n      DESCALE(tmp11 + tmp12 + tmp3 + tmp6 -\n\t      MULTIPLY(tmp0 + tmp6, FIX(1.126980169)),    /* c3+c5-c1 */\n\t      CONST_BITS-PASS1_BITS);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/14)*(8/7) = 32/49, which we\n   * partially fold into the constant multipliers and final shifting:\n   * 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14) * 64/49.\n   */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4];\n    tmp3 = dataptr[DCTSIZE*3];\n\n    tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6];\n    tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5];\n    tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4];\n\n    z1 = tmp0 + tmp2;\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */\n\t      CONST_BITS+PASS1_BITS+1);\n    tmp3 += tmp3;\n    z1 -= tmp3;\n    z1 -= tmp3;\n    z1 = MULTIPLY(z1, FIX(0.461784020));                /* (c2+c6-c4)/2 */\n    z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084));       /* (c2+c4-c6)/2 */\n    z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446));       /* c6 */\n    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS+1);\n    z1 -= z2;\n    z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509));       /* c4 */\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */\n\t      CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS+1);\n\n    /* Odd part */\n\n    tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677));   /* (c3+c1-c5)/2 */\n    tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464));   /* (c3+c5-c1)/2 */\n    tmp0 = tmp1 - tmp2;\n    tmp1 += tmp2;\n    tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */\n    tmp1 += tmp2;\n    tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310));   /* c5 */\n    tmp0 += tmp3;\n    tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355));   /* c3+c1-c5 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS+1);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 12x6 sample block.\n *\n * 12-point FDCT in pass 1 (rows), 6-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_12x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Zero 2 bottom rows of output coefficient block. */\n  MEMZERO(&data[DCTSIZE*6], SIZEOF(DCTELEM) * DCTSIZE * 2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 6; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]);\n    tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]);\n\n    tmp10 = tmp0 + tmp5;\n    tmp13 = tmp0 - tmp5;\n    tmp11 = tmp1 + tmp4;\n    tmp14 = tmp1 - tmp4;\n    tmp12 = tmp2 + tmp3;\n    tmp15 = tmp2 - tmp3;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]);\n    tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]);\n    tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE) << PASS1_BITS);\n    dataptr[6] = (DCTELEM) ((tmp13 - tmp14 - tmp15) << PASS1_BITS);\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[2] = (DCTELEM)\n      DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */\n\t      CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100);    /* c9 */\n    tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865);   /* c3-c9 */\n    tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065);   /* c3+c9 */\n    tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054));   /* c5 */\n    tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669));   /* c7 */\n    tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */\n\t    + MULTIPLY(tmp5, FIX(0.184591911));        /* c11 */\n    tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */\n    tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */\n\t    + MULTIPLY(tmp5, FIX(0.860918669));        /* c7 */\n    tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */\n\t    - MULTIPLY(tmp5, FIX(1.121971054));        /* c5 */\n    tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */\n\t    - MULTIPLY(tmp2 + tmp5, FIX_0_541196100);  /* c9 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS);\n    dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/12)*(8/6) = 8/9, which we\n   * partially fold into the constant multipliers and final shifting:\n   * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9.\n   */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5];\n    tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];\n\n    tmp10 = tmp0 + tmp2;\n    tmp12 = tmp0 - tmp2;\n\n    tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5];\n    tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)),         /* 16/9 */\n\t      CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp12, FIX(2.177324216)),                 /* c2 */\n\t      CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */\n\t      CONST_BITS+PASS1_BITS+1);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829));             /* c5 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),   /* 16/9 */\n\t      CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)),    /* 16/9 */\n\t      CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)),   /* 16/9 */\n\t      CONST_BITS+PASS1_BITS+1);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 10x5 sample block.\n *\n * 10-point FDCT in pass 1 (rows), 5-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_10x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Zero 3 bottom rows of output coefficient block. */\n  MEMZERO(&data[DCTSIZE*5], SIZEOF(DCTELEM) * DCTSIZE * 3);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 5; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]);\n    tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]);\n    tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]);\n\n    tmp10 = tmp0 + tmp4;\n    tmp13 = tmp0 - tmp4;\n    tmp11 = tmp1 + tmp3;\n    tmp14 = tmp1 - tmp3;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]);\n    tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << PASS1_BITS);\n    tmp12 += tmp12;\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */\n\t      MULTIPLY(tmp11 - tmp12, FIX(0.437016024)),  /* c8 */\n\t      CONST_BITS-PASS1_BITS);\n    tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876));    /* c6 */\n    dataptr[2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)),  /* c2-c6 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)),  /* c2+c6 */\n\t      CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = tmp0 + tmp4;\n    tmp11 = tmp1 - tmp3;\n    dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << PASS1_BITS);\n    tmp2 <<= CONST_BITS;\n    dataptr[1] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) +          /* c1 */\n\t      MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 +   /* c3 */\n\t      MULTIPLY(tmp3, FIX(0.642039522)) +          /* c7 */\n\t      MULTIPLY(tmp4, FIX(0.221231742)),           /* c9 */\n\t      CONST_BITS-PASS1_BITS);\n    tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) -     /* (c3+c7)/2 */\n\t    MULTIPLY(tmp1 + tmp3, FIX(0.587785252));      /* (c1-c9)/2 */\n    tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) +   /* (c3-c7)/2 */\n\t    (tmp11 << (CONST_BITS - 1)) - tmp2;\n    dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-PASS1_BITS);\n    dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-PASS1_BITS);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/10)*(8/5) = 32/25, which we\n   * fold into the constant multipliers:\n   * 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10) * 32/25.\n   */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3];\n    tmp2 = dataptr[DCTSIZE*2];\n\n    tmp10 = tmp0 + tmp1;\n    tmp11 = tmp0 - tmp1;\n\n    tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4];\n    tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)),        /* 32/25 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp11 = MULTIPLY(tmp11, FIX(1.011928851));          /* (c2+c4)/2 */\n    tmp10 -= tmp2 << 2;\n    tmp10 = MULTIPLY(tmp10, FIX(0.452548340));          /* (c2-c4)/2 */\n    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961));    /* c3 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */\n\t      CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on an 8x4 sample block.\n *\n * 8-point FDCT in pass 1 (rows), 4-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3;\n  INT32 tmp10, tmp11, tmp12, tmp13;\n  INT32 z1;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Zero 4 bottom rows of output coefficient block. */\n  MEMZERO(&data[DCTSIZE*4], SIZEOF(DCTELEM) * DCTSIZE * 4);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* We must also scale the output by 8/4 = 2, which we add here. */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 4; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part per LL&M figure 1 --- note that published figure is faulty;\n     * rotator \"sqrt(2)*c1\" should be \"sqrt(2)*c6\".\n     */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]);\n\n    tmp10 = tmp0 + tmp3;\n    tmp12 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp13 = tmp1 - tmp2;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << (PASS1_BITS+1));\n    dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << (PASS1_BITS+1));\n\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-2);\n    dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865),\n\t\t\t\t       CONST_BITS-PASS1_BITS-1);\n    dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065),\n\t\t\t\t       CONST_BITS-PASS1_BITS-1);\n\n    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\n     * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).\n     * i0..i3 in the paper are tmp0..tmp3 here.\n     */\n\n    tmp10 = tmp0 + tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp1 + tmp3;\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /*  c3 */\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-2);\n\n    tmp0  = MULTIPLY(tmp0,    FIX_1_501321110);    /*  c1+c3-c5-c7 */\n    tmp1  = MULTIPLY(tmp1,    FIX_3_072711026);    /*  c1+c3+c5-c7 */\n    tmp2  = MULTIPLY(tmp2,    FIX_2_053119869);    /*  c1+c3-c5+c7 */\n    tmp3  = MULTIPLY(tmp3,    FIX_0_298631336);    /* -c1+c3+c5-c7 */\n    tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);    /*  c7-c3 */\n    tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);    /* -c1-c3 */\n    tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);    /*  c5-c3 */\n    tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);    /* -c3-c5 */\n\n    tmp12 += z1;\n    tmp13 += z1;\n\n    dataptr[1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS-1);\n    dataptr[3] = (DCTELEM)\n      RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS-1);\n    dataptr[5] = (DCTELEM)\n      RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS-1);\n    dataptr[7] = (DCTELEM)\n      RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS-1);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).\n   */\n\n  dataptr = data;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1));\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2];\n\n    tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];\n    tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];\n\n    dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS);\n    dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS);\n\n    /* Odd part */\n\n    tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);   /* c6 */\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS+PASS1_BITS-1);\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */\n\t\t  CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */\n\t\t  CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 6x3 sample block.\n *\n * 6-point FDCT in pass 1 (rows), 3-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2;\n  INT32 tmp10, tmp11, tmp12;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* We scale the results further by 2 as part of output adaption */\n  /* scaling for different DCT size. */\n  /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 3; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]);\n    tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]);\n\n    tmp10 = tmp0 + tmp2;\n    tmp12 = tmp0 - tmp2;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << (PASS1_BITS+1));\n    dataptr[2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp12, FIX(1.224744871)),                 /* c2 */\n\t      CONST_BITS-PASS1_BITS-1);\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */\n\t      CONST_BITS-PASS1_BITS-1);\n\n    /* Odd part */\n\n    tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)),     /* c5 */\n\t\t    CONST_BITS-PASS1_BITS-1);\n\n    dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << (PASS1_BITS+1)));\n    dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << (PASS1_BITS+1));\n    dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << (PASS1_BITS+1)));\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially\n   * fold into the constant multipliers (other part was done in pass 1):\n   * 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6) * 16/9.\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 6; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2];\n    tmp1 = dataptr[DCTSIZE*1];\n\n    tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),        /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */\n\t      CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp2, FIX(2.177324216)),               /* c1 */\n\t      CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 4x2 sample block.\n *\n * 4-point FDCT in pass 1 (rows), 2-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1;\n  INT32 tmp10, tmp11;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* We must also scale the output by (8/4)*(8/2) = 2**3, which we add here. */\n  /* 4-point FDCT kernel, */\n  /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 2; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);\n\n    tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);\n    tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+3));\n    dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+3));\n\n    /* Odd part */\n\n    tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);       /* c6 */\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-PASS1_BITS-4);\n\n    dataptr[1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */\n\t\t  CONST_BITS-PASS1_BITS-3);\n    dataptr[3] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */\n\t\t  CONST_BITS-PASS1_BITS-3);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 4; ctr++) {\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = dataptr[DCTSIZE*0] + (ONE << (PASS1_BITS-1));\n    tmp1 = dataptr[DCTSIZE*1];\n\n    dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS);\n\n    /* Odd part */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 2x1 sample block.\n *\n * 2-point FDCT in pass 1 (rows), 1-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_2x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1;\n  JSAMPROW elemptr;\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  elemptr = sample_data[0] + start_col;\n\n  tmp0 = GETJSAMPLE(elemptr[0]);\n  tmp1 = GETJSAMPLE(elemptr[1]);\n\n  /* We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/2)*(8/1) = 2**5.\n   */\n\n  /* Even part */\n  /* Apply unsigned->signed conversion */\n  data[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5);\n\n  /* Odd part */\n  data[1] = (DCTELEM) ((tmp0 - tmp1) << 5);\n}\n\n\n/*\n * Perform the forward DCT on an 8x16 sample block.\n *\n * 8-point FDCT in pass 1 (rows), 16-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17;\n  INT32 z1;\n  DCTELEM workspace[DCTSIZE2];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part per LL&M figure 1 --- note that published figure is faulty;\n     * rotator \"sqrt(2)*c1\" should be \"sqrt(2)*c6\".\n     */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]);\n    tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]);\n\n    tmp10 = tmp0 + tmp3;\n    tmp12 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp13 = tmp1 - tmp2;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);\n    tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS);\n    dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);\n\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\n    dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865),\n\t\t\t\t   CONST_BITS-PASS1_BITS);\n    dataptr[6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065),\n\t\t\t\t   CONST_BITS-PASS1_BITS);\n\n    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\n     * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).\n     * i0..i3 in the paper are tmp0..tmp3 here.\n     */\n\n    tmp10 = tmp0 + tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp1 + tmp3;\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /*  c3 */\n\n    tmp0  = MULTIPLY(tmp0,    FIX_1_501321110);    /*  c1+c3-c5-c7 */\n    tmp1  = MULTIPLY(tmp1,    FIX_3_072711026);    /*  c1+c3+c5-c7 */\n    tmp2  = MULTIPLY(tmp2,    FIX_2_053119869);    /*  c1+c3-c5+c7 */\n    tmp3  = MULTIPLY(tmp3,    FIX_0_298631336);    /* -c1+c3+c5-c7 */\n    tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);    /*  c7-c3 */\n    tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);    /* -c1-c3 */\n    tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);    /*  c5-c3 */\n    tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);    /* -c3-c5 */\n\n    tmp12 += z1;\n    tmp13 += z1;\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS);\n    dataptr[7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == DCTSIZE * 2)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by 8/16 = 1/2.\n   * 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32).\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4];\n    tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3];\n    tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2];\n    tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1];\n    tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0];\n\n    tmp10 = tmp0 + tmp7;\n    tmp14 = tmp0 - tmp7;\n    tmp11 = tmp1 + tmp6;\n    tmp15 = tmp1 - tmp6;\n    tmp12 = tmp2 + tmp5;\n    tmp16 = tmp2 - tmp5;\n    tmp13 = tmp3 + tmp4;\n    tmp17 = tmp3 - tmp4;\n\n    tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4];\n    tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3];\n    tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2];\n    tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1];\n    tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+1);\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */\n\t      MULTIPLY(tmp11 - tmp12, FIX_0_541196100),   /* c12[16] = c6[8] */\n\t      CONST_BITS+PASS1_BITS+1);\n\n    tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) +   /* c14[16] = c7[8] */\n\t    MULTIPLY(tmp14 - tmp16, FIX(1.387039845));    /* c2[16] = c1[8] */\n\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982))   /* c6+c14 */\n\t      + MULTIPLY(tmp16, FIX(2.172734804)),        /* c2+c10 */\n\t      CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243))   /* c2-c6 */\n\t      - MULTIPLY(tmp17, FIX(1.061594338)),        /* c10+c14 */\n\t      CONST_BITS+PASS1_BITS+1);\n\n    /* Odd part */\n\n    tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) +         /* c3 */\n\t    MULTIPLY(tmp6 - tmp7, FIX(0.410524528));          /* c13 */\n    tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) +         /* c5 */\n\t    MULTIPLY(tmp5 + tmp7, FIX(0.666655658));          /* c11 */\n    tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) +         /* c7 */\n\t    MULTIPLY(tmp4 - tmp7, FIX(0.897167586));          /* c9 */\n    tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) +         /* c15 */\n\t    MULTIPLY(tmp6 - tmp5, FIX(1.407403738));          /* c1 */\n    tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) +       /* -c11 */\n\t    MULTIPLY(tmp4 + tmp6, - FIX(1.247225013));        /* -c5 */\n    tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) +       /* -c3 */\n\t    MULTIPLY(tmp5 - tmp4, FIX(0.410524528));          /* c13 */\n    tmp10 = tmp11 + tmp12 + tmp13 -\n\t    MULTIPLY(tmp0, FIX(2.286341144)) +                /* c7+c5+c3-c1 */\n\t    MULTIPLY(tmp7, FIX(0.779653625));                 /* c15+c13-c11+c9 */\n    tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */\n\t     - MULTIPLY(tmp6, FIX(1.663905119));              /* c7+c13+c1-c5 */\n    tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */\n\t     + MULTIPLY(tmp5, FIX(1.227391138));              /* c9-c11+c1-c13 */\n    tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */\n\t     + MULTIPLY(tmp4, FIX(2.167985692));              /* c1+c13+c5-c9 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+1);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+1);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 7x14 sample block.\n *\n * 7-point FDCT in pass 1 (rows), 14-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_7x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;\n  INT32 z1, z2, z3;\n  DCTELEM workspace[8*6];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]);\n    tmp3 = GETJSAMPLE(elemptr[3]);\n\n    tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]);\n    tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]);\n    tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]);\n\n    z1 = tmp0 + tmp2;\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS);\n    tmp3 += tmp3;\n    z1 -= tmp3;\n    z1 -= tmp3;\n    z1 = MULTIPLY(z1, FIX(0.353553391));                /* (c2+c6-c4)/2 */\n    z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002));       /* (c2+c4-c6)/2 */\n    z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123));       /* c6 */\n    dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS);\n    z1 -= z2;\n    z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734));       /* c4 */\n    dataptr[4] = (DCTELEM)\n      DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347));   /* (c3+c1-c5)/2 */\n    tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339));   /* (c3+c5-c1)/2 */\n    tmp0 = tmp1 - tmp2;\n    tmp1 += tmp2;\n    tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */\n    tmp1 += tmp2;\n    tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268));   /* c5 */\n    tmp0 += tmp3;\n    tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693));   /* c3+c1-c5 */\n\n    dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS);\n    dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS);\n    dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 14)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/7)*(8/14) = 32/49, which we\n   * fold into the constant multipliers:\n   * 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28) * 32/49.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 7; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3];\n    tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2];\n    tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1];\n    tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0];\n    tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];\n\n    tmp10 = tmp0 + tmp6;\n    tmp14 = tmp0 - tmp6;\n    tmp11 = tmp1 + tmp5;\n    tmp15 = tmp1 - tmp5;\n    tmp12 = tmp2 + tmp4;\n    tmp16 = tmp2 - tmp4;\n\n    tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5];\n    tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3];\n    tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2];\n    tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1];\n    tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0];\n    tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13,\n\t\t       FIX(0.653061224)),                 /* 32/49 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp13 += tmp13;\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */\n\t      MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */\n\t      MULTIPLY(tmp12 - tmp13, FIX(0.575835255)),  /* c8 */\n\t      CONST_BITS+PASS1_BITS);\n\n    tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570));    /* c6 */\n\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691))   /* c2-c6 */\n\t      + MULTIPLY(tmp16, FIX(0.400721155)),        /* c10 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725))   /* c6+c10 */\n\t      - MULTIPLY(tmp16, FIX(0.900412262)),        /* c2 */\n\t      CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = tmp1 + tmp2;\n    tmp11 = tmp5 - tmp4;\n    dataptr[DCTSIZE*7] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6,\n\t\t       FIX(0.653061224)),                 /* 32/49 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp3  = MULTIPLY(tmp3 , FIX(0.653061224));            /* 32/49 */\n    tmp10 = MULTIPLY(tmp10, - FIX(0.103406812));          /* -c13 */\n    tmp11 = MULTIPLY(tmp11, FIX(0.917760839));            /* c1 */\n    tmp10 += tmp11 - tmp3;\n    tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) +     /* c5 */\n\t    MULTIPLY(tmp4 + tmp6, FIX(0.491367823));      /* c9 */\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */\n\t      + MULTIPLY(tmp4, FIX(0.731428202)),         /* c1+c11-c9 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) +     /* c3 */\n\t    MULTIPLY(tmp5 - tmp6, FIX(0.305035186));      /* c11 */\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */\n\t      - MULTIPLY(tmp5, FIX(2.004803435)),         /* c1+c5+c11 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(tmp11 + tmp12 + tmp3\n\t      - MULTIPLY(tmp0, FIX(0.735987049))          /* c3+c5-c1 */\n\t      - MULTIPLY(tmp6, FIX(0.082925825)),         /* c9-c11-c13 */\n\t      CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 6x12 sample block.\n *\n * 6-point FDCT in pass 1 (rows), 12-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_6x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;\n  DCTELEM workspace[8*4];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]);\n    tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]);\n    tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]);\n\n    tmp10 = tmp0 + tmp2;\n    tmp12 = tmp0 - tmp2;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]);\n    tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS);\n    dataptr[2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp12, FIX(1.224744871)),                 /* c2 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */\n\t      CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)),     /* c5 */\n\t\t    CONST_BITS-PASS1_BITS);\n\n    dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS));\n    dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS);\n    dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS));\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 12)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/6)*(8/12) = 8/9, which we\n   * fold into the constant multipliers:\n   * 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24) * 8/9.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 6; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2];\n    tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1];\n    tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0];\n    tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7];\n    tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6];\n\n    tmp10 = tmp0 + tmp5;\n    tmp13 = tmp0 - tmp5;\n    tmp11 = tmp1 + tmp4;\n    tmp14 = tmp1 - tmp4;\n    tmp12 = tmp2 + tmp3;\n    tmp15 = tmp2 - tmp3;\n\n    tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3];\n    tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2];\n    tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1];\n    tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0];\n    tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7];\n    tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)),         /* c4 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) +        /* 8/9 */\n\t      MULTIPLY(tmp13 + tmp15, FIX(1.214244803)),         /* c2 */\n\t      CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200));   /* c9 */\n    tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102));  /* c3-c9 */\n    tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502));  /* c3+c9 */\n    tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603));   /* c5 */\n    tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039));   /* c7 */\n    tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */\n\t    + MULTIPLY(tmp5, FIX(0.164081699));        /* c11 */\n    tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */\n    tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */\n\t    + MULTIPLY(tmp5, FIX(0.765261039));        /* c7 */\n    tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */\n\t    - MULTIPLY(tmp5, FIX(0.997307603));        /* c5 */\n    tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */\n\t    - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 5x10 sample block.\n *\n * 5-point FDCT in pass 1 (rows), 10-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_5x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4;\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14;\n  DCTELEM workspace[8*2];\n  DCTELEM *dataptr;\n  DCTELEM *wsptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10). */\n\n  dataptr = data;\n  ctr = 0;\n  for (;;) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]);\n    tmp2 = GETJSAMPLE(elemptr[2]);\n\n    tmp10 = tmp0 + tmp1;\n    tmp11 = tmp0 - tmp1;\n\n    tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]);\n    tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << PASS1_BITS);\n    tmp11 = MULTIPLY(tmp11, FIX(0.790569415));          /* (c2+c4)/2 */\n    tmp10 -= tmp2 << 2;\n    tmp10 = MULTIPLY(tmp10, FIX(0.353553391));          /* (c2-c4)/2 */\n    dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS);\n    dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876));    /* c3 */\n\n    dataptr[1] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */\n\t      CONST_BITS-PASS1_BITS);\n    dataptr[3] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */\n\t      CONST_BITS-PASS1_BITS);\n\n    ctr++;\n\n    if (ctr != DCTSIZE) {\n      if (ctr == 10)\n\tbreak;\t\t\t/* Done. */\n      dataptr += DCTSIZE;\t/* advance pointer to next row */\n    } else\n      dataptr = workspace;\t/* switch pointer to extended workspace */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/5)*(8/10) = 32/25, which we\n   * fold into the constant multipliers:\n   * 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20) * 32/25.\n   */\n\n  dataptr = data;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 5; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1];\n    tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0];\n    tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6];\n    tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];\n\n    tmp10 = tmp0 + tmp4;\n    tmp13 = tmp0 - tmp4;\n    tmp11 = tmp1 + tmp3;\n    tmp14 = tmp1 - tmp3;\n\n    tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1];\n    tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0];\n    tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7];\n    tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6];\n    tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp12 += tmp12;\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */\n\t      MULTIPLY(tmp11 - tmp12, FIX(0.559380511)),  /* c8 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961));    /* c6 */\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)),  /* c2-c6 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)),  /* c2+c6 */\n\t      CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = tmp0 + tmp4;\n    tmp11 = tmp1 - tmp3;\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)),  /* 32/25 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp2 = MULTIPLY(tmp2, FIX(1.28));                     /* 32/25 */\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) +          /* c1 */\n\t      MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 +   /* c3 */\n\t      MULTIPLY(tmp3, FIX(0.821810588)) +          /* c7 */\n\t      MULTIPLY(tmp4, FIX(0.283176630)),           /* c9 */\n\t      CONST_BITS+PASS1_BITS);\n    tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) -     /* (c3+c7)/2 */\n\t    MULTIPLY(tmp1 + tmp3, FIX(0.752365123));      /* (c1-c9)/2 */\n    tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) +   /* (c3-c7)/2 */\n\t    MULTIPLY(tmp11, FIX(0.64)) - tmp2;            /* 16/25 */\n    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n    wsptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 4x8 sample block.\n *\n * 4-point FDCT in pass 1 (rows), 8-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3;\n  INT32 tmp10, tmp11, tmp12, tmp13;\n  INT32 z1;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* We must also scale the output by 8/4 = 2, which we add here. */\n  /* 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);\n    tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);\n\n    tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);\n    tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+1));\n    dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+1));\n\n    /* Odd part */\n\n    tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);       /* c6 */\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-PASS1_BITS-2);\n\n    dataptr[1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */\n\t\t  CONST_BITS-PASS1_BITS-1);\n    dataptr[3] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */\n\t\t  CONST_BITS-PASS1_BITS-1);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 4; ctr++) {\n    /* Even part per LL&M figure 1 --- note that published figure is faulty;\n     * rotator \"sqrt(2)*c1\" should be \"sqrt(2)*c6\".\n     */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];\n\n    /* Add fudge factor here for final descale. */\n    tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1));\n    tmp12 = tmp0 - tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp13 = tmp1 - tmp2;\n\n    tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];\n    tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];\n    tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];\n    tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];\n\n    dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS);\n    dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS);\n\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS+PASS1_BITS-1);\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*6] = (DCTELEM)\n      RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS);\n\n    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).\n     * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).\n     * i0..i3 in the paper are tmp0..tmp3 here.\n     */\n\n    tmp10 = tmp0 + tmp3;\n    tmp11 = tmp1 + tmp2;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp1 + tmp3;\n    z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /*  c3 */\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS+PASS1_BITS-1);\n\n    tmp0  = MULTIPLY(tmp0,    FIX_1_501321110);    /*  c1+c3-c5-c7 */\n    tmp1  = MULTIPLY(tmp1,    FIX_3_072711026);    /*  c1+c3+c5-c7 */\n    tmp2  = MULTIPLY(tmp2,    FIX_2_053119869);    /*  c1+c3-c5+c7 */\n    tmp3  = MULTIPLY(tmp3,    FIX_0_298631336);    /* -c1+c3+c5-c7 */\n    tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);    /*  c7-c3 */\n    tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);    /* -c1-c3 */\n    tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);    /*  c5-c3 */\n    tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);    /* -c3-c5 */\n\n    tmp12 += z1;\n    tmp13 += z1;\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*7] = (DCTELEM)\n      RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 3x6 sample block.\n *\n * 3-point FDCT in pass 1 (rows), 6-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_3x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1, tmp2;\n  INT32 tmp10, tmp11, tmp12;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n  /* We scale the results further by 2 as part of output adaption */\n  /* scaling for different DCT size. */\n  /* 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6). */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 6; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]);\n    tmp1 = GETJSAMPLE(elemptr[1]);\n\n    tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM)\n      ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+1));\n    dataptr[2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */\n\t      CONST_BITS-PASS1_BITS-1);\n\n    /* Odd part */\n\n    dataptr[1] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp2, FIX(1.224744871)),               /* c1 */\n\t      CONST_BITS-PASS1_BITS-1);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We remove the PASS1_BITS scaling, but leave the results scaled up\n   * by an overall factor of 8.\n   * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially\n   * fold into the constant multipliers (other part was done in pass 1):\n   * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9.\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 3; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5];\n    tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];\n\n    tmp10 = tmp0 + tmp2;\n    tmp12 = tmp0 - tmp2;\n\n    tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5];\n    tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4];\n    tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];\n\n    dataptr[DCTSIZE*0] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)),         /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*2] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp12, FIX(2.177324216)),                 /* c2 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*4] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */\n\t      CONST_BITS+PASS1_BITS);\n\n    /* Odd part */\n\n    tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829));             /* c5 */\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),   /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)),    /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n    dataptr[DCTSIZE*5] = (DCTELEM)\n      DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)),   /* 16/9 */\n\t      CONST_BITS+PASS1_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 2x4 sample block.\n *\n * 2-point FDCT in pass 1 (rows), 4-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1;\n  INT32 tmp10, tmp11;\n  DCTELEM *dataptr;\n  JSAMPROW elemptr;\n  int ctr;\n  SHIFT_TEMPS\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  /* Pass 1: process rows. */\n  /* Note results are scaled up by sqrt(8) compared to a true DCT. */\n  /* We must also scale the output by (8/2)*(8/4) = 2**3, which we add here. */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 4; ctr++) {\n    elemptr = sample_data[ctr] + start_col;\n\n    /* Even part */\n\n    tmp0 = GETJSAMPLE(elemptr[0]);\n    tmp1 = GETJSAMPLE(elemptr[1]);\n\n    /* Apply unsigned->signed conversion */\n    dataptr[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 3);\n\n    /* Odd part */\n\n    dataptr[1] = (DCTELEM) ((tmp0 - tmp1) << 3);\n\n    dataptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n\n  /* Pass 2: process columns.\n   * We leave the results scaled up by an overall factor of 8.\n   * 4-point FDCT kernel,\n   * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].\n   */\n\n  dataptr = data;\n  for (ctr = 0; ctr < 2; ctr++) {\n    /* Even part */\n\n    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3];\n    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2];\n\n    tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];\n    tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];\n\n    dataptr[DCTSIZE*0] = (DCTELEM) (tmp0 + tmp1);\n    dataptr[DCTSIZE*2] = (DCTELEM) (tmp0 - tmp1);\n\n    /* Odd part */\n\n    tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);       /* c6 */\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-1);\n\n    dataptr[DCTSIZE*1] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */\n\t\t  CONST_BITS);\n    dataptr[DCTSIZE*3] = (DCTELEM)\n      RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */\n\t\t  CONST_BITS);\n\n    dataptr++;\t\t\t/* advance pointer to next column */\n  }\n}\n\n\n/*\n * Perform the forward DCT on a 1x2 sample block.\n *\n * 1-point FDCT in pass 1 (rows), 2-point in pass 2 (columns).\n */\n\nGLOBAL(void)\njpeg_fdct_1x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)\n{\n  INT32 tmp0, tmp1;\n\n  /* Pre-zero output coefficient block. */\n  MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);\n\n  tmp0 = GETJSAMPLE(sample_data[0][start_col]);\n  tmp1 = GETJSAMPLE(sample_data[1][start_col]);\n\n  /* We leave the results scaled up by an overall factor of 8.\n   * We must also scale the output by (8/1)*(8/2) = 2**5.\n   */\n\n  /* Even part */\n  /* Apply unsigned->signed conversion */\n  data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5);\n\n  /* Odd part */\n  data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp1) << 5);\n}\n\n#endif /* DCT_SCALING_SUPPORTED */\n#endif /* DCT_ISLOW_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jidctflt.c",
    "content": "/*\n * jidctflt.c\n *\n * Copyright (C) 1994-1998, Thomas G. Lane.\n * Modified 2010 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a floating-point implementation of the\n * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine\n * must also perform dequantization of the input coefficients.\n *\n * This implementation should be more accurate than either of the integer\n * IDCT implementations.  However, it may not give the same results on all\n * machines because of differences in roundoff behavior.  Speed will depend\n * on the hardware's floating point capacity.\n *\n * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT\n * on each row (or vice versa, but it's more convenient to emit a row at\n * a time).  Direct algorithms are also available, but they are much more\n * complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on Arai, Agui, and Nakajima's algorithm for\n * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in\n * Japanese, but the algorithm is described in the Pennebaker & Mitchell\n * JPEG textbook (see REFERENCES section in file README).  The following code\n * is based directly on figure 4-8 in P&M.\n * While an 8-point DCT cannot be done in less than 11 multiplies, it is\n * possible to arrange the computation so that many of the multiplies are\n * simple scalings of the final outputs.  These multiplies can then be\n * folded into the multiplications or divisions by the JPEG quantization\n * table entries.  The AA&N method leaves only 5 multiplies and 29 adds\n * to be done in the DCT itself.\n * The primary disadvantage of this method is that with a fixed-point\n * implementation, accuracy is lost due to imprecise representation of the\n * scaled quantization values.  However, that problem does not arise if\n * we use floating point arithmetic.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_FLOAT_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\n#endif\n\n\n/* Dequantize a coefficient by multiplying it by the multiplier-table\n * entry; produce a float result.\n */\n\n#define DEQUANTIZE(coef,quantval)  (((FAST_FLOAT) (coef)) * (quantval))\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients.\n */\n\nGLOBAL(void)\njpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  FAST_FLOAT tmp10, tmp11, tmp12, tmp13;\n  FAST_FLOAT z5, z10, z11, z12, z13;\n  JCOEFPTR inptr;\n  FLOAT_MULT_TYPE * quantptr;\n  FAST_FLOAT * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = cinfo->sample_range_limit;\n  int ctr;\n  FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (FLOAT_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = DCTSIZE; ctr > 0; ctr--) {\n    /* Due to quantization, we will usually find that many of the input\n     * coefficients are zero, especially the AC terms.  We can exploit this\n     * by short-circuiting the IDCT calculation for any column in which all\n     * the AC terms are zero.  In that case each output is equal to the\n     * DC coefficient (with scale factor as needed).\n     * With typical images and quantization tables, half or more of the\n     * column DCT calculations can be simplified this way.\n     */\n    \n    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&\n\tinptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&\n\tinptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&\n\tinptr[DCTSIZE*7] == 0) {\n      /* AC terms all zero */\n      FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n      \n      wsptr[DCTSIZE*0] = dcval;\n      wsptr[DCTSIZE*1] = dcval;\n      wsptr[DCTSIZE*2] = dcval;\n      wsptr[DCTSIZE*3] = dcval;\n      wsptr[DCTSIZE*4] = dcval;\n      wsptr[DCTSIZE*5] = dcval;\n      wsptr[DCTSIZE*6] = dcval;\n      wsptr[DCTSIZE*7] = dcval;\n      \n      inptr++;\t\t\t/* advance pointers to next column */\n      quantptr++;\n      wsptr++;\n      continue;\n    }\n    \n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp10 = tmp0 + tmp2;\t/* phase 3 */\n    tmp11 = tmp0 - tmp2;\n\n    tmp13 = tmp1 + tmp3;\t/* phases 5-3 */\n    tmp12 = (tmp1 - tmp3) * ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */\n\n    tmp0 = tmp10 + tmp13;\t/* phase 2 */\n    tmp3 = tmp10 - tmp13;\n    tmp1 = tmp11 + tmp12;\n    tmp2 = tmp11 - tmp12;\n    \n    /* Odd part */\n\n    tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    z13 = tmp6 + tmp5;\t\t/* phase 6 */\n    z10 = tmp6 - tmp5;\n    z11 = tmp4 + tmp7;\n    z12 = tmp4 - tmp7;\n\n    tmp7 = z11 + z13;\t\t/* phase 5 */\n    tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */\n\n    z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */\n    tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */\n    tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */\n\n    tmp6 = tmp12 - tmp7;\t/* phase 2 */\n    tmp5 = tmp11 - tmp6;\n    tmp4 = tmp10 - tmp5;\n\n    wsptr[DCTSIZE*0] = tmp0 + tmp7;\n    wsptr[DCTSIZE*7] = tmp0 - tmp7;\n    wsptr[DCTSIZE*1] = tmp1 + tmp6;\n    wsptr[DCTSIZE*6] = tmp1 - tmp6;\n    wsptr[DCTSIZE*2] = tmp2 + tmp5;\n    wsptr[DCTSIZE*5] = tmp2 - tmp5;\n    wsptr[DCTSIZE*3] = tmp3 + tmp4;\n    wsptr[DCTSIZE*4] = tmp3 - tmp4;\n\n    inptr++;\t\t\t/* advance pointers to next column */\n    quantptr++;\n    wsptr++;\n  }\n  \n  /* Pass 2: process rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n    /* Rows of zeroes can be exploited in the same way as we did with columns.\n     * However, the column calculation has created many nonzero AC terms, so\n     * the simplification applies less often (typically 5% to 10% of the time).\n     * And testing floats for zero is relatively expensive, so we don't bother.\n     */\n    \n    /* Even part */\n\n    /* Apply signed->unsigned and prepare float->int conversion */\n    z5 = wsptr[0] + ((FAST_FLOAT) CENTERJSAMPLE + (FAST_FLOAT) 0.5);\n    tmp10 = z5 + wsptr[4];\n    tmp11 = z5 - wsptr[4];\n\n    tmp13 = wsptr[2] + wsptr[6];\n    tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13;\n\n    tmp0 = tmp10 + tmp13;\n    tmp3 = tmp10 - tmp13;\n    tmp1 = tmp11 + tmp12;\n    tmp2 = tmp11 - tmp12;\n\n    /* Odd part */\n\n    z13 = wsptr[5] + wsptr[3];\n    z10 = wsptr[5] - wsptr[3];\n    z11 = wsptr[1] + wsptr[7];\n    z12 = wsptr[1] - wsptr[7];\n\n    tmp7 = z11 + z13;\n    tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562);\n\n    z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */\n    tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */\n    tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */\n\n    tmp6 = tmp12 - tmp7;\n    tmp5 = tmp11 - tmp6;\n    tmp4 = tmp10 - tmp5;\n\n    /* Final output stage: float->int conversion and range-limit */\n\n    outptr[0] = range_limit[((int) (tmp0 + tmp7)) & RANGE_MASK];\n    outptr[7] = range_limit[((int) (tmp0 - tmp7)) & RANGE_MASK];\n    outptr[1] = range_limit[((int) (tmp1 + tmp6)) & RANGE_MASK];\n    outptr[6] = range_limit[((int) (tmp1 - tmp6)) & RANGE_MASK];\n    outptr[2] = range_limit[((int) (tmp2 + tmp5)) & RANGE_MASK];\n    outptr[5] = range_limit[((int) (tmp2 - tmp5)) & RANGE_MASK];\n    outptr[3] = range_limit[((int) (tmp3 + tmp4)) & RANGE_MASK];\n    outptr[4] = range_limit[((int) (tmp3 - tmp4)) & RANGE_MASK];\n    \n    wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n}\n\n#endif /* DCT_FLOAT_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jidctfst.c",
    "content": "/*\n * jidctfst.c\n *\n * Copyright (C) 1994-1998, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a fast, not so accurate integer implementation of the\n * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine\n * must also perform dequantization of the input coefficients.\n *\n * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT\n * on each row (or vice versa, but it's more convenient to emit a row at\n * a time).  Direct algorithms are also available, but they are much more\n * complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on Arai, Agui, and Nakajima's algorithm for\n * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in\n * Japanese, but the algorithm is described in the Pennebaker & Mitchell\n * JPEG textbook (see REFERENCES section in file README).  The following code\n * is based directly on figure 4-8 in P&M.\n * While an 8-point DCT cannot be done in less than 11 multiplies, it is\n * possible to arrange the computation so that many of the multiplies are\n * simple scalings of the final outputs.  These multiplies can then be\n * folded into the multiplications or divisions by the JPEG quantization\n * table entries.  The AA&N method leaves only 5 multiplies and 29 adds\n * to be done in the DCT itself.\n * The primary disadvantage of this method is that with fixed-point math,\n * accuracy is lost due to imprecise representation of the scaled\n * quantization values.  The smaller the quantization table entry, the less\n * precise the scaled value, so this implementation does worse with high-\n * quality-setting files than with low-quality ones.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_IFAST_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */\n#endif\n\n\n/* Scaling decisions are generally the same as in the LL&M algorithm;\n * see jidctint.c for more details.  However, we choose to descale\n * (right shift) multiplication products as soon as they are formed,\n * rather than carrying additional fractional bits into subsequent additions.\n * This compromises accuracy slightly, but it lets us save a few shifts.\n * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)\n * everywhere except in the multiplications proper; this saves a good deal\n * of work on 16-bit-int machines.\n *\n * The dequantized coefficients are not integers because the AA&N scaling\n * factors have been incorporated.  We represent them scaled up by PASS1_BITS,\n * so that the first and second IDCT rounds have the same input scaling.\n * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to\n * avoid a descaling shift; this compromises accuracy rather drastically\n * for small quantization table entries, but it saves a lot of shifts.\n * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway,\n * so we use a much larger scaling factor to preserve accuracy.\n *\n * A final compromise is to represent the multiplicative constants to only\n * 8 fractional bits, rather than 13.  This saves some shifting work on some\n * machines, and may also reduce the cost of multiplication (since there\n * are fewer one-bits in the constants).\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define CONST_BITS  8\n#define PASS1_BITS  2\n#else\n#define CONST_BITS  8\n#define PASS1_BITS  1\t\t/* lose a little precision to avoid overflow */\n#endif\n\n/* Some C compilers fail to reduce \"FIX(constant)\" at compile time, thus\n * causing a lot of useless floating-point operations at run time.\n * To get around this we use the following pre-calculated constants.\n * If you change CONST_BITS you may want to add appropriate values.\n * (With a reasonable C compiler, you can just rely on the FIX() macro...)\n */\n\n#if CONST_BITS == 8\n#define FIX_1_082392200  ((INT32)  277)\t\t/* FIX(1.082392200) */\n#define FIX_1_414213562  ((INT32)  362)\t\t/* FIX(1.414213562) */\n#define FIX_1_847759065  ((INT32)  473)\t\t/* FIX(1.847759065) */\n#define FIX_2_613125930  ((INT32)  669)\t\t/* FIX(2.613125930) */\n#else\n#define FIX_1_082392200  FIX(1.082392200)\n#define FIX_1_414213562  FIX(1.414213562)\n#define FIX_1_847759065  FIX(1.847759065)\n#define FIX_2_613125930  FIX(2.613125930)\n#endif\n\n\n/* We can gain a little more speed, with a further compromise in accuracy,\n * by omitting the addition in a descaling shift.  This yields an incorrectly\n * rounded result half the time...\n */\n\n#ifndef USE_ACCURATE_ROUNDING\n#undef DESCALE\n#define DESCALE(x,n)  RIGHT_SHIFT(x, n)\n#endif\n\n\n/* Multiply a DCTELEM variable by an INT32 constant, and immediately\n * descale to yield a DCTELEM result.\n */\n\n#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))\n\n\n/* Dequantize a coefficient by multiplying it by the multiplier-table\n * entry; produce a DCTELEM result.  For 8-bit data a 16x16->16\n * multiplication will do.  For 12-bit data, the multiplier table is\n * declared INT32, so a 32-bit multiply will be used.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define DEQUANTIZE(coef,quantval)  (((IFAST_MULT_TYPE) (coef)) * (quantval))\n#else\n#define DEQUANTIZE(coef,quantval)  \\\n\tDESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS)\n#endif\n\n\n/* Like DESCALE, but applies to a DCTELEM and produces an int.\n * We assume that int right shift is unsigned if INT32 right shift is.\n */\n\n#ifdef RIGHT_SHIFT_IS_UNSIGNED\n#define ISHIFT_TEMPS\tDCTELEM ishift_temp;\n#if BITS_IN_JSAMPLE == 8\n#define DCTELEMBITS  16\t\t/* DCTELEM may be 16 or 32 bits */\n#else\n#define DCTELEMBITS  32\t\t/* DCTELEM must be 32 bits */\n#endif\n#define IRIGHT_SHIFT(x,shft)  \\\n    ((ishift_temp = (x)) < 0 ? \\\n     (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \\\n     (ishift_temp >> (shft)))\n#else\n#define ISHIFT_TEMPS\n#define IRIGHT_SHIFT(x,shft)\t((x) >> (shft))\n#endif\n\n#ifdef USE_ACCURATE_ROUNDING\n#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n))\n#else\n#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT(x, n))\n#endif\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients.\n */\n\nGLOBAL(void)\njpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;\n  DCTELEM tmp10, tmp11, tmp12, tmp13;\n  DCTELEM z5, z10, z11, z12, z13;\n  JCOEFPTR inptr;\n  IFAST_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[DCTSIZE2];\t/* buffers data between passes */\n  SHIFT_TEMPS\t\t\t/* for DESCALE */\n  ISHIFT_TEMPS\t\t\t/* for IDESCALE */\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (IFAST_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = DCTSIZE; ctr > 0; ctr--) {\n    /* Due to quantization, we will usually find that many of the input\n     * coefficients are zero, especially the AC terms.  We can exploit this\n     * by short-circuiting the IDCT calculation for any column in which all\n     * the AC terms are zero.  In that case each output is equal to the\n     * DC coefficient (with scale factor as needed).\n     * With typical images and quantization tables, half or more of the\n     * column DCT calculations can be simplified this way.\n     */\n    \n    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&\n\tinptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&\n\tinptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&\n\tinptr[DCTSIZE*7] == 0) {\n      /* AC terms all zero */\n      int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n\n      wsptr[DCTSIZE*0] = dcval;\n      wsptr[DCTSIZE*1] = dcval;\n      wsptr[DCTSIZE*2] = dcval;\n      wsptr[DCTSIZE*3] = dcval;\n      wsptr[DCTSIZE*4] = dcval;\n      wsptr[DCTSIZE*5] = dcval;\n      wsptr[DCTSIZE*6] = dcval;\n      wsptr[DCTSIZE*7] = dcval;\n      \n      inptr++;\t\t\t/* advance pointers to next column */\n      quantptr++;\n      wsptr++;\n      continue;\n    }\n    \n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp10 = tmp0 + tmp2;\t/* phase 3 */\n    tmp11 = tmp0 - tmp2;\n\n    tmp13 = tmp1 + tmp3;\t/* phases 5-3 */\n    tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */\n\n    tmp0 = tmp10 + tmp13;\t/* phase 2 */\n    tmp3 = tmp10 - tmp13;\n    tmp1 = tmp11 + tmp12;\n    tmp2 = tmp11 - tmp12;\n    \n    /* Odd part */\n\n    tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    z13 = tmp6 + tmp5;\t\t/* phase 6 */\n    z10 = tmp6 - tmp5;\n    z11 = tmp4 + tmp7;\n    z12 = tmp4 - tmp7;\n\n    tmp7 = z11 + z13;\t\t/* phase 5 */\n    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */\n\n    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */\n    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */\n    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */\n\n    tmp6 = tmp12 - tmp7;\t/* phase 2 */\n    tmp5 = tmp11 - tmp6;\n    tmp4 = tmp10 + tmp5;\n\n    wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);\n    wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);\n    wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);\n    wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);\n    wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5);\n    wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);\n    wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);\n    wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);\n\n    inptr++;\t\t\t/* advance pointers to next column */\n    quantptr++;\n    wsptr++;\n  }\n  \n  /* Pass 2: process rows from work array, store into output array. */\n  /* Note that we must descale the results by a factor of 8 == 2**3, */\n  /* and also undo the PASS1_BITS scaling. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n    /* Rows of zeroes can be exploited in the same way as we did with columns.\n     * However, the column calculation has created many nonzero AC terms, so\n     * the simplification applies less often (typically 5% to 10% of the time).\n     * On machines with very fast multiplication, it's possible that the\n     * test takes more time than it's worth.  In that case this section\n     * may be commented out.\n     */\n    \n#ifndef NO_ZERO_ROW_TEST\n    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&\n\twsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {\n      /* AC terms all zero */\n      JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)\n\t\t\t\t  & RANGE_MASK];\n      \n      outptr[0] = dcval;\n      outptr[1] = dcval;\n      outptr[2] = dcval;\n      outptr[3] = dcval;\n      outptr[4] = dcval;\n      outptr[5] = dcval;\n      outptr[6] = dcval;\n      outptr[7] = dcval;\n\n      wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n      continue;\n    }\n#endif\n    \n    /* Even part */\n\n    tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);\n    tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);\n\n    tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);\n    tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)\n\t    - tmp13;\n\n    tmp0 = tmp10 + tmp13;\n    tmp3 = tmp10 - tmp13;\n    tmp1 = tmp11 + tmp12;\n    tmp2 = tmp11 - tmp12;\n\n    /* Odd part */\n\n    z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];\n    z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];\n    z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];\n    z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];\n\n    tmp7 = z11 + z13;\t\t/* phase 5 */\n    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */\n\n    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */\n    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */\n    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */\n\n    tmp6 = tmp12 - tmp7;\t/* phase 2 */\n    tmp5 = tmp11 - tmp6;\n    tmp4 = tmp10 + tmp5;\n\n    /* Final output stage: scale down by a factor of 8 and range-limit */\n\n    outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n}\n\n#endif /* DCT_IFAST_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jidctint.c",
    "content": "/*\n * jidctint.c\n *\n * Copyright (C) 1991-1998, Thomas G. Lane.\n * Modification developed 2002-2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a slow-but-accurate integer implementation of the\n * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine\n * must also perform dequantization of the input coefficients.\n *\n * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT\n * on each row (or vice versa, but it's more convenient to emit a row at\n * a time).  Direct algorithms are also available, but they are much more\n * complex and seem not to be any faster when reduced to code.\n *\n * This implementation is based on an algorithm described in\n *   C. Loeffler, A. Ligtenberg and G. Moschytz, \"Practical Fast 1-D DCT\n *   Algorithms with 11 Multiplications\", Proc. Int'l. Conf. on Acoustics,\n *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.\n * The primary algorithm described there uses 11 multiplies and 29 adds.\n * We use their alternate method with 12 multiplies and 32 adds.\n * The advantage of this method is that no data path contains more than one\n * multiplication; this allows a very simple and accurate implementation in\n * scaled fixed-point arithmetic, with a minimal number of shifts.\n *\n * We also provide IDCT routines with various output sample block sizes for\n * direct resolution reduction or enlargement and for direct resolving the\n * common 2x1 and 1x2 subsampling cases without additional resampling: NxN\n * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 input DCT block.\n *\n * For N<8 we simply take the corresponding low-frequency coefficients of\n * the 8x8 input DCT block and apply an NxN point IDCT on the sub-block\n * to yield the downscaled outputs.\n * This can be seen as direct low-pass downsampling from the DCT domain\n * point of view rather than the usual spatial domain point of view,\n * yielding significant computational savings and results at least\n * as good as common bilinear (averaging) spatial downsampling.\n *\n * For N>8 we apply a partial NxN IDCT on the 8 input coefficients as\n * lower frequencies and higher frequencies assumed to be zero.\n * It turns out that the computational effort is similar to the 8x8 IDCT\n * regarding the output size.\n * Furthermore, the scaling and descaling is the same for all IDCT sizes.\n *\n * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases\n * since there would be too many additional constants to pre-calculate.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jdct.h\"\t\t/* Private declarations for DCT subsystem */\n\n#ifdef DCT_ISLOW_SUPPORTED\n\n\n/*\n * This module is specialized to the case DCTSIZE = 8.\n */\n\n#if DCTSIZE != 8\n  Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */\n#endif\n\n\n/*\n * The poop on this scaling stuff is as follows:\n *\n * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)\n * larger than the true IDCT outputs.  The final outputs are therefore\n * a factor of N larger than desired; since N=8 this can be cured by\n * a simple right shift at the end of the algorithm.  The advantage of\n * this arrangement is that we save two multiplications per 1-D IDCT,\n * because the y0 and y4 inputs need not be divided by sqrt(N).\n *\n * We have to do addition and subtraction of the integer inputs, which\n * is no problem, and multiplication by fractional constants, which is\n * a problem to do in integer arithmetic.  We multiply all the constants\n * by CONST_SCALE and convert them to integer constants (thus retaining\n * CONST_BITS bits of precision in the constants).  After doing a\n * multiplication we have to divide the product by CONST_SCALE, with proper\n * rounding, to produce the correct output.  This division can be done\n * cheaply as a right shift of CONST_BITS bits.  We postpone shifting\n * as long as possible so that partial sums can be added together with\n * full fractional precision.\n *\n * The outputs of the first pass are scaled up by PASS1_BITS bits so that\n * they are represented to better-than-integral precision.  These outputs\n * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word\n * with the recommended scaling.  (To scale up 12-bit sample data further, an\n * intermediate INT32 array would be needed.)\n *\n * To avoid overflow of the 32-bit intermediate results in pass 2, we must\n * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis\n * shows that the values given below are the most effective.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define CONST_BITS  13\n#define PASS1_BITS  2\n#else\n#define CONST_BITS  13\n#define PASS1_BITS  1\t\t/* lose a little precision to avoid overflow */\n#endif\n\n/* Some C compilers fail to reduce \"FIX(constant)\" at compile time, thus\n * causing a lot of useless floating-point operations at run time.\n * To get around this we use the following pre-calculated constants.\n * If you change CONST_BITS you may want to add appropriate values.\n * (With a reasonable C compiler, you can just rely on the FIX() macro...)\n */\n\n#if CONST_BITS == 13\n#define FIX_0_298631336  ((INT32)  2446)\t/* FIX(0.298631336) */\n#define FIX_0_390180644  ((INT32)  3196)\t/* FIX(0.390180644) */\n#define FIX_0_541196100  ((INT32)  4433)\t/* FIX(0.541196100) */\n#define FIX_0_765366865  ((INT32)  6270)\t/* FIX(0.765366865) */\n#define FIX_0_899976223  ((INT32)  7373)\t/* FIX(0.899976223) */\n#define FIX_1_175875602  ((INT32)  9633)\t/* FIX(1.175875602) */\n#define FIX_1_501321110  ((INT32)  12299)\t/* FIX(1.501321110) */\n#define FIX_1_847759065  ((INT32)  15137)\t/* FIX(1.847759065) */\n#define FIX_1_961570560  ((INT32)  16069)\t/* FIX(1.961570560) */\n#define FIX_2_053119869  ((INT32)  16819)\t/* FIX(2.053119869) */\n#define FIX_2_562915447  ((INT32)  20995)\t/* FIX(2.562915447) */\n#define FIX_3_072711026  ((INT32)  25172)\t/* FIX(3.072711026) */\n#else\n#define FIX_0_298631336  FIX(0.298631336)\n#define FIX_0_390180644  FIX(0.390180644)\n#define FIX_0_541196100  FIX(0.541196100)\n#define FIX_0_765366865  FIX(0.765366865)\n#define FIX_0_899976223  FIX(0.899976223)\n#define FIX_1_175875602  FIX(1.175875602)\n#define FIX_1_501321110  FIX(1.501321110)\n#define FIX_1_847759065  FIX(1.847759065)\n#define FIX_1_961570560  FIX(1.961570560)\n#define FIX_2_053119869  FIX(2.053119869)\n#define FIX_2_562915447  FIX(2.562915447)\n#define FIX_3_072711026  FIX(3.072711026)\n#endif\n\n\n/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.\n * For 8-bit samples with the recommended scaling, all the variable\n * and constant values involved are no more than 16 bits wide, so a\n * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.\n * For 12-bit samples, a full 32-bit multiplication will be needed.\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)\n#else\n#define MULTIPLY(var,const)  ((var) * (const))\n#endif\n\n\n/* Dequantize a coefficient by multiplying it by the multiplier-table\n * entry; produce an int result.  In this module, both inputs and result\n * are 16 bits or less, so either int or short multiply will work.\n */\n\n#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients.\n */\n\nGLOBAL(void)\njpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3;\n  INT32 tmp10, tmp11, tmp12, tmp13;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[DCTSIZE2];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n  /* Note results are scaled up by sqrt(8) compared to a true IDCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = DCTSIZE; ctr > 0; ctr--) {\n    /* Due to quantization, we will usually find that many of the input\n     * coefficients are zero, especially the AC terms.  We can exploit this\n     * by short-circuiting the IDCT calculation for any column in which all\n     * the AC terms are zero.  In that case each output is equal to the\n     * DC coefficient (with scale factor as needed).\n     * With typical images and quantization tables, half or more of the\n     * column DCT calculations can be simplified this way.\n     */\n\n    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&\n\tinptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&\n\tinptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&\n\tinptr[DCTSIZE*7] == 0) {\n      /* AC terms all zero */\n      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;\n\n      wsptr[DCTSIZE*0] = dcval;\n      wsptr[DCTSIZE*1] = dcval;\n      wsptr[DCTSIZE*2] = dcval;\n      wsptr[DCTSIZE*3] = dcval;\n      wsptr[DCTSIZE*4] = dcval;\n      wsptr[DCTSIZE*5] = dcval;\n      wsptr[DCTSIZE*6] = dcval;\n      wsptr[DCTSIZE*7] = dcval;\n\n      inptr++;\t\t\t/* advance pointers to next column */\n      quantptr++;\n      wsptr++;\n      continue;\n    }\n\n    /* Even part: reverse the even part of the forward DCT. */\n    /* The rotator is sqrt(2)*c(-6). */\n    \n    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);\n    tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);\n    tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z2 <<= CONST_BITS;\n    z3 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z2 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    tmp0 = z2 + z3;\n    tmp1 = z2 - z3;\n\n    tmp10 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n    tmp11 = tmp1 + tmp3;\n    tmp12 = tmp1 - tmp3;\n\n    /* Odd part per figure 8; the matrix is unitary and hence its\n     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.\n     */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n    tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    \n    z2 = tmp0 + tmp2;\n    z3 = tmp1 + tmp3;\n\n    z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */\n    z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    z2 += z1;\n    z3 += z1;\n\n    z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    tmp0 += z1 + z2;\n    tmp3 += z1 + z3;\n\n    z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp1 += z1 + z3;\n    tmp2 += z1 + z2;\n\n    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */\n\n    wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);\n    \n    inptr++;\t\t\t/* advance pointers to next column */\n    quantptr++;\n    wsptr++;\n  }\n\n  /* Pass 2: process rows from work array, store into output array. */\n  /* Note that we must descale the results by a factor of 8 == 2**3, */\n  /* and also undo the PASS1_BITS scaling. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < DCTSIZE; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n    /* Rows of zeroes can be exploited in the same way as we did with columns.\n     * However, the column calculation has created many nonzero AC terms, so\n     * the simplification applies less often (typically 5% to 10% of the time).\n     * On machines with very fast multiplication, it's possible that the\n     * test takes more time than it's worth.  In that case this section\n     * may be commented out.\n     */\n\n#ifndef NO_ZERO_ROW_TEST\n    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&\n\twsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {\n      /* AC terms all zero */\n      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)\n\t\t\t\t  & RANGE_MASK];\n\n      outptr[0] = dcval;\n      outptr[1] = dcval;\n      outptr[2] = dcval;\n      outptr[3] = dcval;\n      outptr[4] = dcval;\n      outptr[5] = dcval;\n      outptr[6] = dcval;\n      outptr[7] = dcval;\n\n      wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n      continue;\n    }\n#endif\n\n    /* Even part: reverse the even part of the forward DCT. */\n    /* The rotator is sqrt(2)*c(-6). */\n    \n    z2 = (INT32) wsptr[2];\n    z3 = (INT32) wsptr[6];\n\n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);\n    tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);\n    tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);\n\n    /* Add fudge factor here for final descale. */\n    z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z3 = (INT32) wsptr[4];\n\n    tmp0 = (z2 + z3) << CONST_BITS;\n    tmp1 = (z2 - z3) << CONST_BITS;\n    \n    tmp10 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n    tmp11 = tmp1 + tmp3;\n    tmp12 = tmp1 - tmp3;\n\n    /* Odd part per figure 8; the matrix is unitary and hence its\n     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.\n     */\n\n    tmp0 = (INT32) wsptr[7];\n    tmp1 = (INT32) wsptr[5];\n    tmp2 = (INT32) wsptr[3];\n    tmp3 = (INT32) wsptr[1];\n\n    z2 = tmp0 + tmp2;\n    z3 = tmp1 + tmp3;\n\n    z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */\n    z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    z2 += z1;\n    z3 += z1;\n\n    z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    tmp0 += z1 + z2;\n    tmp3 += z1 + z3;\n\n    z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp1 += z1 + z3;\n    tmp2 += z1 + z2;\n\n    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n}\n\n#ifdef IDCT_SCALING_SUPPORTED\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 7x7 output block.\n *\n * Optimized algorithm with 12 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/14).\n */\n\nGLOBAL(void)\njpeg_idct_7x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12, tmp13;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[7*7];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp13 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp13 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp13 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734));     /* c4 */\n    tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123));     /* c6 */\n    tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */\n    tmp0 = z1 + z3;\n    z2 -= tmp0;\n    tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */\n    tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536));  /* c2-c4-c6 */\n    tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249));  /* c2+c4+c6 */\n    tmp13 += MULTIPLY(z2, FIX(1.414213562));         /* c0 */\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n\n    tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347));      /* (c3+c1-c5)/2 */\n    tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339));      /* (c3+c5-c1)/2 */\n    tmp0 = tmp1 - tmp2;\n    tmp1 += tmp2;\n    tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276));    /* -c1 */\n    tmp1 += tmp2;\n    z2 = MULTIPLY(z1 + z3, FIX(0.613604268));        /* c5 */\n    tmp0 += z2;\n    tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693));     /* c3+c1-c5 */\n\n    /* Final output stage */\n\n    wsptr[7*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[7*6] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[7*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[7*5] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[7*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[7*4] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[7*3] = (int) RIGHT_SHIFT(tmp13, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 7 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 7; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp13 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp13 <<= CONST_BITS;\n\n    z1 = (INT32) wsptr[2];\n    z2 = (INT32) wsptr[4];\n    z3 = (INT32) wsptr[6];\n\n    tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734));     /* c4 */\n    tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123));     /* c6 */\n    tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */\n    tmp0 = z1 + z3;\n    z2 -= tmp0;\n    tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */\n    tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536));  /* c2-c4-c6 */\n    tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249));  /* c2+c4+c6 */\n    tmp13 += MULTIPLY(z2, FIX(1.414213562));         /* c0 */\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n\n    tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347));      /* (c3+c1-c5)/2 */\n    tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339));      /* (c3+c5-c1)/2 */\n    tmp0 = tmp1 - tmp2;\n    tmp1 += tmp2;\n    tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276));    /* -c1 */\n    tmp1 += tmp2;\n    z2 = MULTIPLY(z1 + z3, FIX(0.613604268));        /* c5 */\n    tmp0 += z2;\n    tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693));     /* c3+c1-c5 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 7;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 6x6 output block.\n *\n * Optimized algorithm with 3 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/12).\n */\n\nGLOBAL(void)\njpeg_idct_6x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[6*6];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp0 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    tmp10 = MULTIPLY(tmp2, FIX(0.707106781));   /* c4 */\n    tmp1 = tmp0 + tmp10;\n    tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS);\n    tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp0 = MULTIPLY(tmp10, FIX(1.224744871));   /* c2 */\n    tmp10 = tmp1 + tmp0;\n    tmp12 = tmp1 - tmp0;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */\n    tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);\n    tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);\n    tmp1 = (z1 - z2 - z3) << PASS1_BITS;\n\n    /* Final output stage */\n\n    wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[6*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[6*1] = (int) (tmp11 + tmp1);\n    wsptr[6*4] = (int) (tmp11 - tmp1);\n    wsptr[6*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[6*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 6 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 6; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp0 <<= CONST_BITS;\n    tmp2 = (INT32) wsptr[4];\n    tmp10 = MULTIPLY(tmp2, FIX(0.707106781));   /* c4 */\n    tmp1 = tmp0 + tmp10;\n    tmp11 = tmp0 - tmp10 - tmp10;\n    tmp10 = (INT32) wsptr[2];\n    tmp0 = MULTIPLY(tmp10, FIX(1.224744871));   /* c2 */\n    tmp10 = tmp1 + tmp0;\n    tmp12 = tmp1 - tmp0;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */\n    tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);\n    tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);\n    tmp1 = (z1 - z2 - z3) << CONST_BITS;\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 6;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 5x5 output block.\n *\n * Optimized algorithm with 5 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/10).\n */\n\nGLOBAL(void)\njpeg_idct_5x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp10, tmp11, tmp12;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[5*5];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp12 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp12 += ONE << (CONST_BITS-PASS1_BITS-1);\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */\n    z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */\n    z3 = tmp12 + z2;\n    tmp10 = z3 + z1;\n    tmp11 = z3 - z1;\n    tmp12 -= z2 << 2;\n\n    /* Odd part */\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n\n    z1 = MULTIPLY(z2 + z3, FIX(0.831253876));     /* c3 */\n    tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148));   /* c1-c3 */\n    tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899));   /* c1+c3 */\n\n    /* Final output stage */\n\n    wsptr[5*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[5*4] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[5*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[5*3] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[5*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 5 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 5; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp12 <<= CONST_BITS;\n    tmp0 = (INT32) wsptr[2];\n    tmp1 = (INT32) wsptr[4];\n    z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */\n    z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */\n    z3 = tmp12 + z2;\n    tmp10 = z3 + z1;\n    tmp11 = z3 - z1;\n    tmp12 -= z2 << 2;\n\n    /* Odd part */\n\n    z2 = (INT32) wsptr[1];\n    z3 = (INT32) wsptr[3];\n\n    z1 = MULTIPLY(z2 + z3, FIX(0.831253876));     /* c3 */\n    tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148));   /* c1-c3 */\n    tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899));   /* c1+c3 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 5;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 4x4 output block.\n *\n * Optimized algorithm with 3 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].\n */\n\nGLOBAL(void)\njpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp2, tmp10, tmp12;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[4*4];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    \n    tmp10 = (tmp0 + tmp2) << PASS1_BITS;\n    tmp12 = (tmp0 - tmp2) << PASS1_BITS;\n\n    /* Odd part */\n    /* Same rotation as in the even part of the 8x8 LL&M IDCT */\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n\n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);               /* c6 */\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-1);\n    tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */\n\t\t       CONST_BITS-PASS1_BITS);\n    tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */\n\t\t       CONST_BITS-PASS1_BITS);\n\n    /* Final output stage */\n\n    wsptr[4*0] = (int) (tmp10 + tmp0);\n    wsptr[4*3] = (int) (tmp10 - tmp0);\n    wsptr[4*1] = (int) (tmp12 + tmp2);\n    wsptr[4*2] = (int) (tmp12 - tmp2);\n  }\n\n  /* Pass 2: process 4 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 4; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp2 = (INT32) wsptr[2];\n\n    tmp10 = (tmp0 + tmp2) << CONST_BITS;\n    tmp12 = (tmp0 - tmp2) << CONST_BITS;\n\n    /* Odd part */\n    /* Same rotation as in the even part of the 8x8 LL&M IDCT */\n\n    z2 = (INT32) wsptr[1];\n    z3 = (INT32) wsptr[3];\n\n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);   /* c6 */\n    tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */\n    tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 4;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 3x3 output block.\n *\n * Optimized algorithm with 2 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/6).\n */\n\nGLOBAL(void)\njpeg_idct_3x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp2, tmp10, tmp12;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[3*3];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp0 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */\n    tmp10 = tmp0 + tmp12;\n    tmp2 = tmp0 - tmp12 - tmp12;\n\n    /* Odd part */\n\n    tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */\n\n    /* Final output stage */\n\n    wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[3*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[3*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 3 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 3; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp0 <<= CONST_BITS;\n    tmp2 = (INT32) wsptr[2];\n    tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */\n    tmp10 = tmp0 + tmp12;\n    tmp2 = tmp0 - tmp12 - tmp12;\n\n    /* Odd part */\n\n    tmp12 = (INT32) wsptr[1];\n    tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 3;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 2x2 output block.\n *\n * Multiplication-less algorithm.\n */\n\nGLOBAL(void)\njpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;\n  ISLOW_MULT_TYPE * quantptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input. */\n\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n\n  /* Column 0 */\n  tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);\n  tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);\n  /* Add fudge factor here for final descale. */\n  tmp4 += ONE << 2;\n\n  tmp0 = tmp4 + tmp5;\n  tmp2 = tmp4 - tmp5;\n\n  /* Column 1 */\n  tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0+1], quantptr[DCTSIZE*0+1]);\n  tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1+1], quantptr[DCTSIZE*1+1]);\n\n  tmp1 = tmp4 + tmp5;\n  tmp3 = tmp4 - tmp5;\n\n  /* Pass 2: process 2 rows, store into output array. */\n\n  /* Row 0 */\n  outptr = output_buf[0] + output_col;\n\n  outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];\n  outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];\n\n  /* Row 1 */\n  outptr = output_buf[1] + output_col;\n\n  outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp2 + tmp3, 3) & RANGE_MASK];\n  outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2 - tmp3, 3) & RANGE_MASK];\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 1x1 output block.\n *\n * We hardly need an inverse DCT routine for this: just take the\n * average pixel value, which is one-eighth of the DC coefficient.\n */\n\nGLOBAL(void)\njpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  int dcval;\n  ISLOW_MULT_TYPE * quantptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  SHIFT_TEMPS\n\n  /* 1x1 is trivial: just take the DC coefficient divided by 8. */\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  dcval = DEQUANTIZE(coef_block[0], quantptr[0]);\n  dcval = (int) DESCALE((INT32) dcval, 3);\n\n  output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 9x9 output block.\n *\n * Optimized algorithm with 10 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/18).\n */\n\nGLOBAL(void)\njpeg_idct_9x9 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13, tmp14;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*9];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp0 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp3 = MULTIPLY(z3, FIX(0.707106781));      /* c6 */\n    tmp1 = tmp0 + tmp3;\n    tmp2 = tmp0 - tmp3 - tmp3;\n\n    tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */\n    tmp11 = tmp2 + tmp0;\n    tmp14 = tmp2 - tmp0 - tmp0;\n\n    tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */\n    tmp2 = MULTIPLY(z1, FIX(1.083350441));      /* c4 */\n    tmp3 = MULTIPLY(z2, FIX(0.245575608));      /* c8 */\n\n    tmp10 = tmp1 + tmp0 - tmp3;\n    tmp12 = tmp1 - tmp0 + tmp2;\n    tmp13 = tmp1 - tmp2 + tmp3;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    z2 = MULTIPLY(z2, - FIX(1.224744871));           /* -c3 */\n\n    tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955));      /* c5 */\n    tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525));      /* c7 */\n    tmp0 = tmp2 + tmp3 - z2;\n    tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481));      /* c1 */\n    tmp2 += z2 - tmp1;\n    tmp3 += z2 + tmp1;\n    tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */\n\n    /* Final output stage */\n\n    wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[8*8] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[8*7] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[8*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[8*6] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[8*3] = (int) RIGHT_SHIFT(tmp13 + tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[8*5] = (int) RIGHT_SHIFT(tmp13 - tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[8*4] = (int) RIGHT_SHIFT(tmp14, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 9 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 9; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp0 <<= CONST_BITS;\n\n    z1 = (INT32) wsptr[2];\n    z2 = (INT32) wsptr[4];\n    z3 = (INT32) wsptr[6];\n\n    tmp3 = MULTIPLY(z3, FIX(0.707106781));      /* c6 */\n    tmp1 = tmp0 + tmp3;\n    tmp2 = tmp0 - tmp3 - tmp3;\n\n    tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */\n    tmp11 = tmp2 + tmp0;\n    tmp14 = tmp2 - tmp0 - tmp0;\n\n    tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */\n    tmp2 = MULTIPLY(z1, FIX(1.083350441));      /* c4 */\n    tmp3 = MULTIPLY(z2, FIX(0.245575608));      /* c8 */\n\n    tmp10 = tmp1 + tmp0 - tmp3;\n    tmp12 = tmp1 - tmp0 + tmp2;\n    tmp13 = tmp1 - tmp2 + tmp3;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z4 = (INT32) wsptr[7];\n\n    z2 = MULTIPLY(z2, - FIX(1.224744871));           /* -c3 */\n\n    tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955));      /* c5 */\n    tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525));      /* c7 */\n    tmp0 = tmp2 + tmp3 - z2;\n    tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481));      /* c1 */\n    tmp2 += z2 - tmp1;\n    tmp3 += z2 + tmp1;\n    tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp3,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp3,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp14,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 10x10 output block.\n *\n * Optimized algorithm with 12 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/20).\n */\n\nGLOBAL(void)\njpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24;\n  INT32 z1, z2, z3, z4, z5;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*10];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z3 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z3 += ONE << (CONST_BITS-PASS1_BITS-1);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z1 = MULTIPLY(z4, FIX(1.144122806));         /* c4 */\n    z2 = MULTIPLY(z4, FIX(0.437016024));         /* c8 */\n    tmp10 = z3 + z1;\n    tmp11 = z3 - z2;\n\n    tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1),   /* c0 = (c4-c8)*2 */\n\t\t\tCONST_BITS-PASS1_BITS);\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    z1 = MULTIPLY(z2 + z3, FIX(0.831253876));    /* c6 */\n    tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */\n    tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */\n\n    tmp20 = tmp10 + tmp12;\n    tmp24 = tmp10 - tmp12;\n    tmp21 = tmp11 + tmp13;\n    tmp23 = tmp11 - tmp13;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    tmp11 = z2 + z4;\n    tmp13 = z2 - z4;\n\n    tmp12 = MULTIPLY(tmp13, FIX(0.309016994));        /* (c3-c7)/2 */\n    z5 = z3 << CONST_BITS;\n\n    z2 = MULTIPLY(tmp11, FIX(0.951056516));           /* (c3+c7)/2 */\n    z4 = z5 + tmp12;\n\n    tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */\n    tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */\n\n    z2 = MULTIPLY(tmp11, FIX(0.587785252));           /* (c1-c9)/2 */\n    z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1));\n\n    tmp12 = (z1 - tmp13 - z3) << PASS1_BITS;\n\n    tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */\n    tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */\n\n    /* Final output stage */\n\n    wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*2] = (int) (tmp22 + tmp12);\n    wsptr[8*7] = (int) (tmp22 - tmp12);\n    wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 10 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 10; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z3 <<= CONST_BITS;\n    z4 = (INT32) wsptr[4];\n    z1 = MULTIPLY(z4, FIX(1.144122806));         /* c4 */\n    z2 = MULTIPLY(z4, FIX(0.437016024));         /* c8 */\n    tmp10 = z3 + z1;\n    tmp11 = z3 - z2;\n\n    tmp22 = z3 - ((z1 - z2) << 1);               /* c0 = (c4-c8)*2 */\n\n    z2 = (INT32) wsptr[2];\n    z3 = (INT32) wsptr[6];\n\n    z1 = MULTIPLY(z2 + z3, FIX(0.831253876));    /* c6 */\n    tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */\n    tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */\n\n    tmp20 = tmp10 + tmp12;\n    tmp24 = tmp10 - tmp12;\n    tmp21 = tmp11 + tmp13;\n    tmp23 = tmp11 - tmp13;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z3 <<= CONST_BITS;\n    z4 = (INT32) wsptr[7];\n\n    tmp11 = z2 + z4;\n    tmp13 = z2 - z4;\n\n    tmp12 = MULTIPLY(tmp13, FIX(0.309016994));        /* (c3-c7)/2 */\n\n    z2 = MULTIPLY(tmp11, FIX(0.951056516));           /* (c3+c7)/2 */\n    z4 = z3 + tmp12;\n\n    tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */\n    tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */\n\n    z2 = MULTIPLY(tmp11, FIX(0.587785252));           /* (c1-c9)/2 */\n    z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1));\n\n    tmp12 = ((z1 - tmp13) << CONST_BITS) - z3;\n\n    tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */\n    tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 11x11 output block.\n *\n * Optimized algorithm with 24 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/22).\n */\n\nGLOBAL(void)\njpeg_idct_11x11 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*11];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp10 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp10 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132));     /* c2+c4 */\n    tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045));     /* c2-c6 */\n    z4 = z1 + z3;\n    tmp24 = MULTIPLY(z4, - FIX(1.155664402));        /* -(c2-c10) */\n    z4 -= z2;\n    tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976));  /* c2 */\n    tmp21 = tmp20 + tmp23 + tmp25 -\n\t    MULTIPLY(z2, FIX(1.821790775));          /* c2+c4+c10-c6 */\n    tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */\n    tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */\n    tmp24 += tmp25;\n    tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120));  /* c8+c10 */\n    tmp24 += MULTIPLY(z2, FIX(1.944413522)) -        /* c2+c8 */\n\t     MULTIPLY(z1, FIX(1.390975730));         /* c4+c10 */\n    tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562));  /* c0 */\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    tmp11 = z1 + z2;\n    tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */\n    tmp11 = MULTIPLY(tmp11, FIX(0.887983902));           /* c3-c9 */\n    tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295));         /* c5-c9 */\n    tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */\n    tmp10 = tmp11 + tmp12 + tmp13 -\n\t    MULTIPLY(z1, FIX(0.923107866));              /* c7+c5+c3-c1-2*c9 */\n    z1    = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */\n    tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588));        /* c1+c7+3*c9-c3 */\n    tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623));        /* c3+c5-c7-c9 */\n    z1    = MULTIPLY(z2 + z4, - FIX(1.798248910));       /* -(c1+c9) */\n    tmp11 += z1;\n    tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632));        /* c1+c5+c9-c7 */\n    tmp14 += MULTIPLY(z2, - FIX(1.467221301)) +          /* -(c5+c9) */\n\t     MULTIPLY(z3, FIX(1.001388905)) -            /* c1-c9 */\n\t     MULTIPLY(z4, FIX(1.684843907));             /* c3+c9 */\n\n    /* Final output stage */\n\n    wsptr[8*0]  = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*10] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*1]  = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*9]  = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*2]  = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*8]  = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*3]  = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*7]  = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*4]  = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*6]  = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*5]  = (int) RIGHT_SHIFT(tmp25, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 11 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 11; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp10 <<= CONST_BITS;\n\n    z1 = (INT32) wsptr[2];\n    z2 = (INT32) wsptr[4];\n    z3 = (INT32) wsptr[6];\n\n    tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132));     /* c2+c4 */\n    tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045));     /* c2-c6 */\n    z4 = z1 + z3;\n    tmp24 = MULTIPLY(z4, - FIX(1.155664402));        /* -(c2-c10) */\n    z4 -= z2;\n    tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976));  /* c2 */\n    tmp21 = tmp20 + tmp23 + tmp25 -\n\t    MULTIPLY(z2, FIX(1.821790775));          /* c2+c4+c10-c6 */\n    tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */\n    tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */\n    tmp24 += tmp25;\n    tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120));  /* c8+c10 */\n    tmp24 += MULTIPLY(z2, FIX(1.944413522)) -        /* c2+c8 */\n\t     MULTIPLY(z1, FIX(1.390975730));         /* c4+c10 */\n    tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562));  /* c0 */\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z4 = (INT32) wsptr[7];\n\n    tmp11 = z1 + z2;\n    tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */\n    tmp11 = MULTIPLY(tmp11, FIX(0.887983902));           /* c3-c9 */\n    tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295));         /* c5-c9 */\n    tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */\n    tmp10 = tmp11 + tmp12 + tmp13 -\n\t    MULTIPLY(z1, FIX(0.923107866));              /* c7+c5+c3-c1-2*c9 */\n    z1    = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */\n    tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588));        /* c1+c7+3*c9-c3 */\n    tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623));        /* c3+c5-c7-c9 */\n    z1    = MULTIPLY(z2 + z4, - FIX(1.798248910));       /* -(c1+c9) */\n    tmp11 += z1;\n    tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632));        /* c1+c5+c9-c7 */\n    tmp14 += MULTIPLY(z2, - FIX(1.467221301)) +          /* -(c5+c9) */\n\t     MULTIPLY(z3, FIX(1.001388905)) -            /* c1-c9 */\n\t     MULTIPLY(z4, FIX(1.684843907));             /* c3+c9 */\n\n    /* Final output stage */\n\n    outptr[0]  = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[1]  = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[9]  = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[2]  = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[8]  = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[3]  = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[7]  = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[4]  = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[6]  = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[5]  = range_limit[(int) RIGHT_SHIFT(tmp25,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 12x12 output block.\n *\n * Optimized algorithm with 15 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/24).\n */\n\nGLOBAL(void)\njpeg_idct_12x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*12];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z3 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z3 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */\n\n    tmp10 = z3 + z4;\n    tmp11 = z3 - z4;\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */\n    z1 <<= CONST_BITS;\n    z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n    z2 <<= CONST_BITS;\n\n    tmp12 = z1 - z2;\n\n    tmp21 = z3 + tmp12;\n    tmp24 = z3 - tmp12;\n\n    tmp12 = z4 + z2;\n\n    tmp20 = tmp10 + tmp12;\n    tmp25 = tmp10 - tmp12;\n\n    tmp12 = z4 - z1 - z2;\n\n    tmp22 = tmp11 + tmp12;\n    tmp23 = tmp11 - tmp12;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    tmp11 = MULTIPLY(z2, FIX(1.306562965));                  /* c3 */\n    tmp14 = MULTIPLY(z2, - FIX_0_541196100);                 /* -c9 */\n\n    tmp10 = z1 + z3;\n    tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669));          /* c7 */\n    tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384));       /* c5-c7 */\n    tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716));  /* c1-c5 */\n    tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580));           /* -(c7+c11) */\n    tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */\n    tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */\n    tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) -        /* c7-c11 */\n\t     MULTIPLY(z4, FIX(1.982889723));                 /* c5+c7 */\n\n    z1 -= z4;\n    z2 -= z3;\n    z3 = MULTIPLY(z1 + z2, FIX_0_541196100);                 /* c9 */\n    tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865);              /* c3-c9 */\n    tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065);              /* c3+c9 */\n\n    /* Final output stage */\n\n    wsptr[8*0]  = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*1]  = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*2]  = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*9]  = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*3]  = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*8]  = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*4]  = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*7]  = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*5]  = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[8*6]  = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 12 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 12; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z3 <<= CONST_BITS;\n\n    z4 = (INT32) wsptr[4];\n    z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */\n\n    tmp10 = z3 + z4;\n    tmp11 = z3 - z4;\n\n    z1 = (INT32) wsptr[2];\n    z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */\n    z1 <<= CONST_BITS;\n    z2 = (INT32) wsptr[6];\n    z2 <<= CONST_BITS;\n\n    tmp12 = z1 - z2;\n\n    tmp21 = z3 + tmp12;\n    tmp24 = z3 - tmp12;\n\n    tmp12 = z4 + z2;\n\n    tmp20 = tmp10 + tmp12;\n    tmp25 = tmp10 - tmp12;\n\n    tmp12 = z4 - z1 - z2;\n\n    tmp22 = tmp11 + tmp12;\n    tmp23 = tmp11 - tmp12;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z4 = (INT32) wsptr[7];\n\n    tmp11 = MULTIPLY(z2, FIX(1.306562965));                  /* c3 */\n    tmp14 = MULTIPLY(z2, - FIX_0_541196100);                 /* -c9 */\n\n    tmp10 = z1 + z3;\n    tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669));          /* c7 */\n    tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384));       /* c5-c7 */\n    tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716));  /* c1-c5 */\n    tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580));           /* -(c7+c11) */\n    tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */\n    tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */\n    tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) -        /* c7-c11 */\n\t     MULTIPLY(z4, FIX(1.982889723));                 /* c5+c7 */\n\n    z1 -= z4;\n    z2 -= z3;\n    z3 = MULTIPLY(z1 + z2, FIX_0_541196100);                 /* c9 */\n    tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865);              /* c3-c9 */\n    tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065);              /* c3+c9 */\n\n    /* Final output stage */\n\n    outptr[0]  = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[1]  = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[2]  = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[9]  = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[3]  = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[8]  = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[4]  = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[7]  = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[5]  = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[6]  = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 13x13 output block.\n *\n * Optimized algorithm with 29 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/26).\n */\n\nGLOBAL(void)\njpeg_idct_13x13 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*13];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z1 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp10 = z3 + z4;\n    tmp11 = z3 - z4;\n\n    tmp12 = MULTIPLY(tmp10, FIX(1.155388986));                /* (c4+c6)/2 */\n    tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1;           /* (c4-c6)/2 */\n\n    tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13;   /* c2 */\n    tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13;   /* c10 */\n\n    tmp12 = MULTIPLY(tmp10, FIX(0.316450131));                /* (c8-c12)/2 */\n    tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1;           /* (c8+c12)/2 */\n\n    tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13;   /* c6 */\n    tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */\n\n    tmp12 = MULTIPLY(tmp10, FIX(0.435816023));                /* (c2-c10)/2 */\n    tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1;           /* (c2+c10)/2 */\n\n    tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */\n    tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */\n\n    tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1;      /* c0 */\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651));     /* c3 */\n    tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945));     /* c5 */\n    tmp15 = z1 + z4;\n    tmp13 = MULTIPLY(tmp15, FIX(0.937797057));       /* c7 */\n    tmp10 = tmp11 + tmp12 + tmp13 -\n\t    MULTIPLY(z1, FIX(2.020082300));          /* c7+c5+c3-c1 */\n    tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458));   /* -c11 */\n    tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */\n    tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */\n    tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945));   /* -c5 */\n    tmp11 += tmp14;\n    tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */\n    tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813));   /* -c9 */\n    tmp12 += tmp14;\n    tmp13 += tmp14;\n    tmp15 = MULTIPLY(tmp15, FIX(0.338443458));       /* c11 */\n    tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */\n\t    MULTIPLY(z2, FIX(0.466105296));          /* c1-c7 */\n    z1    = MULTIPLY(z3 - z2, FIX(0.937797057));     /* c7 */\n    tmp14 += z1;\n    tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) -   /* c3-c7 */\n\t     MULTIPLY(z4, FIX(1.742345811));         /* c1+c11 */\n\n    /* Final output stage */\n\n    wsptr[8*0]  = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*12] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*1]  = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*11] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*2]  = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*10] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*3]  = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*9]  = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*4]  = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*8]  = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*5]  = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[8*7]  = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[8*6]  = (int) RIGHT_SHIFT(tmp26, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 13 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 13; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z1 <<= CONST_BITS;\n\n    z2 = (INT32) wsptr[2];\n    z3 = (INT32) wsptr[4];\n    z4 = (INT32) wsptr[6];\n\n    tmp10 = z3 + z4;\n    tmp11 = z3 - z4;\n\n    tmp12 = MULTIPLY(tmp10, FIX(1.155388986));                /* (c4+c6)/2 */\n    tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1;           /* (c4-c6)/2 */\n\n    tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13;   /* c2 */\n    tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13;   /* c10 */\n\n    tmp12 = MULTIPLY(tmp10, FIX(0.316450131));                /* (c8-c12)/2 */\n    tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1;           /* (c8+c12)/2 */\n\n    tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13;   /* c6 */\n    tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */\n\n    tmp12 = MULTIPLY(tmp10, FIX(0.435816023));                /* (c2-c10)/2 */\n    tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1;           /* (c2+c10)/2 */\n\n    tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */\n    tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */\n\n    tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1;      /* c0 */\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z4 = (INT32) wsptr[7];\n\n    tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651));     /* c3 */\n    tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945));     /* c5 */\n    tmp15 = z1 + z4;\n    tmp13 = MULTIPLY(tmp15, FIX(0.937797057));       /* c7 */\n    tmp10 = tmp11 + tmp12 + tmp13 -\n\t    MULTIPLY(z1, FIX(2.020082300));          /* c7+c5+c3-c1 */\n    tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458));   /* -c11 */\n    tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */\n    tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */\n    tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945));   /* -c5 */\n    tmp11 += tmp14;\n    tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */\n    tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813));   /* -c9 */\n    tmp12 += tmp14;\n    tmp13 += tmp14;\n    tmp15 = MULTIPLY(tmp15, FIX(0.338443458));       /* c11 */\n    tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */\n\t    MULTIPLY(z2, FIX(0.466105296));          /* c1-c7 */\n    z1    = MULTIPLY(z3 - z2, FIX(0.937797057));     /* c7 */\n    tmp14 += z1;\n    tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) -   /* c3-c7 */\n\t     MULTIPLY(z4, FIX(1.742345811));         /* c1+c11 */\n\n    /* Final output stage */\n\n    outptr[0]  = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[1]  = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[2]  = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[3]  = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[9]  = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[4]  = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[8]  = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[5]  = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[7]  = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[6]  = range_limit[(int) RIGHT_SHIFT(tmp26,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 14x14 output block.\n *\n * Optimized algorithm with 20 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/28).\n */\n\nGLOBAL(void)\njpeg_idct_14x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*14];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z1 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-1);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z2 = MULTIPLY(z4, FIX(1.274162392));         /* c4 */\n    z3 = MULTIPLY(z4, FIX(0.314692123));         /* c12 */\n    z4 = MULTIPLY(z4, FIX(0.881747734));         /* c8 */\n\n    tmp10 = z1 + z2;\n    tmp11 = z1 + z3;\n    tmp12 = z1 - z4;\n\n    tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */\n\t\t\tCONST_BITS-PASS1_BITS);\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    z3 = MULTIPLY(z1 + z2, FIX(1.105676686));    /* c6 */\n\n    tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */\n    tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */\n    tmp15 = MULTIPLY(z1, FIX(0.613604268)) -     /* c10 */\n\t    MULTIPLY(z2, FIX(1.378756276));      /* c2 */\n\n    tmp20 = tmp10 + tmp13;\n    tmp26 = tmp10 - tmp13;\n    tmp21 = tmp11 + tmp14;\n    tmp25 = tmp11 - tmp14;\n    tmp22 = tmp12 + tmp15;\n    tmp24 = tmp12 - tmp15;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n    tmp13 = z4 << CONST_BITS;\n\n    tmp14 = z1 + z3;\n    tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607));           /* c3 */\n    tmp12 = MULTIPLY(tmp14, FIX(1.197448846));             /* c5 */\n    tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */\n    tmp14 = MULTIPLY(tmp14, FIX(0.752406978));             /* c9 */\n    tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426));        /* c9+c11-c13 */\n    z1    -= z2;\n    tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13;        /* c11 */\n    tmp16 += tmp15;\n    z1    += z4;\n    z4    = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */\n    tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948));          /* c3-c9-c13 */\n    tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773));          /* c3+c5-c13 */\n    z4    = MULTIPLY(z3 - z2, FIX(1.405321284));           /* c1 */\n    tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */\n    tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567));          /* c1+c11-c5 */\n\n    tmp13 = (z1 - z3) << PASS1_BITS;\n\n    /* Final output stage */\n\n    wsptr[8*0]  = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*1]  = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*2]  = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*3]  = (int) (tmp23 + tmp13);\n    wsptr[8*10] = (int) (tmp23 - tmp13);\n    wsptr[8*4]  = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*9]  = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*5]  = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[8*8]  = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[8*6]  = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS);\n    wsptr[8*7]  = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 14 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 14; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z1 <<= CONST_BITS;\n    z4 = (INT32) wsptr[4];\n    z2 = MULTIPLY(z4, FIX(1.274162392));         /* c4 */\n    z3 = MULTIPLY(z4, FIX(0.314692123));         /* c12 */\n    z4 = MULTIPLY(z4, FIX(0.881747734));         /* c8 */\n\n    tmp10 = z1 + z2;\n    tmp11 = z1 + z3;\n    tmp12 = z1 - z4;\n\n    tmp23 = z1 - ((z2 + z3 - z4) << 1);          /* c0 = (c4+c12-c8)*2 */\n\n    z1 = (INT32) wsptr[2];\n    z2 = (INT32) wsptr[6];\n\n    z3 = MULTIPLY(z1 + z2, FIX(1.105676686));    /* c6 */\n\n    tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */\n    tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */\n    tmp15 = MULTIPLY(z1, FIX(0.613604268)) -     /* c10 */\n\t    MULTIPLY(z2, FIX(1.378756276));      /* c2 */\n\n    tmp20 = tmp10 + tmp13;\n    tmp26 = tmp10 - tmp13;\n    tmp21 = tmp11 + tmp14;\n    tmp25 = tmp11 - tmp14;\n    tmp22 = tmp12 + tmp15;\n    tmp24 = tmp12 - tmp15;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z4 = (INT32) wsptr[7];\n    z4 <<= CONST_BITS;\n\n    tmp14 = z1 + z3;\n    tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607));           /* c3 */\n    tmp12 = MULTIPLY(tmp14, FIX(1.197448846));             /* c5 */\n    tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */\n    tmp14 = MULTIPLY(tmp14, FIX(0.752406978));             /* c9 */\n    tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426));        /* c9+c11-c13 */\n    z1    -= z2;\n    tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4;           /* c11 */\n    tmp16 += tmp15;\n    tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4;    /* -c13 */\n    tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948));       /* c3-c9-c13 */\n    tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773));       /* c3+c5-c13 */\n    tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284));           /* c1 */\n    tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */\n    tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567));       /* c1+c11-c5 */\n\n    tmp13 = ((z1 - z3) << CONST_BITS) + z4;\n\n    /* Final output stage */\n\n    outptr[0]  = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[1]  = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[2]  = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[3]  = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[4]  = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[9]  = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[5]  = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[8]  = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[6]  = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[7]  = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 15x15 output block.\n *\n * Optimized algorithm with 22 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/30).\n */\n\nGLOBAL(void)\njpeg_idct_15x15 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*15];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z1 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */\n    tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */\n\n    tmp12 = z1 - tmp10;\n    tmp13 = z1 + tmp11;\n    z1 -= (tmp11 - tmp10) << 1;             /* c0 = (c6-c12)*2 */\n\n    z4 = z2 - z3;\n    z3 += z2;\n    tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */\n    tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */\n    z2 = MULTIPLY(z2, FIX(1.439773946));    /* c4+c14 */\n\n    tmp20 = tmp13 + tmp10 + tmp11;\n    tmp23 = tmp12 - tmp10 + tmp11 + z2;\n\n    tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */\n    tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */\n\n    tmp25 = tmp13 - tmp10 - tmp11;\n    tmp26 = tmp12 + tmp10 - tmp11 - z2;\n\n    tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */\n    tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */\n\n    tmp21 = tmp12 + tmp10 + tmp11;\n    tmp24 = tmp13 - tmp10 + tmp11;\n    tmp11 += tmp11;\n    tmp22 = z1 + tmp11;                     /* c10 = c6-c12 */\n    tmp27 = z1 - tmp11 - tmp11;             /* c0 = (c6-c12)*2 */\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z3 = MULTIPLY(z4, FIX(1.224744871));                    /* c5 */\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    tmp13 = z2 - z4;\n    tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876));         /* c9 */\n    tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148));         /* c3-c9 */\n    tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899));      /* c3+c9 */\n\n    tmp13 = MULTIPLY(z2, - FIX(0.831253876));               /* -c9 */\n    tmp15 = MULTIPLY(z2, - FIX(1.344997024));               /* -c3 */\n    z2 = z1 - z4;\n    tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353));            /* c1 */\n\n    tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */\n    tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */\n    tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3;            /* c5 */\n    z2 = MULTIPLY(z1 + z4, FIX(0.575212477));               /* c11 */\n    tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3;      /* c7-c11 */\n    tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3;      /* c11+c13 */\n\n    /* Final output stage */\n\n    wsptr[8*0]  = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*14] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*1]  = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*13] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*2]  = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*12] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*3]  = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*11] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*4]  = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*10] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*5]  = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[8*9]  = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[8*6]  = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS);\n    wsptr[8*8]  = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS);\n    wsptr[8*7]  = (int) RIGHT_SHIFT(tmp27, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 15 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 15; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z1 <<= CONST_BITS;\n\n    z2 = (INT32) wsptr[2];\n    z3 = (INT32) wsptr[4];\n    z4 = (INT32) wsptr[6];\n\n    tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */\n    tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */\n\n    tmp12 = z1 - tmp10;\n    tmp13 = z1 + tmp11;\n    z1 -= (tmp11 - tmp10) << 1;             /* c0 = (c6-c12)*2 */\n\n    z4 = z2 - z3;\n    z3 += z2;\n    tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */\n    tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */\n    z2 = MULTIPLY(z2, FIX(1.439773946));    /* c4+c14 */\n\n    tmp20 = tmp13 + tmp10 + tmp11;\n    tmp23 = tmp12 - tmp10 + tmp11 + z2;\n\n    tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */\n    tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */\n\n    tmp25 = tmp13 - tmp10 - tmp11;\n    tmp26 = tmp12 + tmp10 - tmp11 - z2;\n\n    tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */\n    tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */\n\n    tmp21 = tmp12 + tmp10 + tmp11;\n    tmp24 = tmp13 - tmp10 + tmp11;\n    tmp11 += tmp11;\n    tmp22 = z1 + tmp11;                     /* c10 = c6-c12 */\n    tmp27 = z1 - tmp11 - tmp11;             /* c0 = (c6-c12)*2 */\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z4 = (INT32) wsptr[5];\n    z3 = MULTIPLY(z4, FIX(1.224744871));                    /* c5 */\n    z4 = (INT32) wsptr[7];\n\n    tmp13 = z2 - z4;\n    tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876));         /* c9 */\n    tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148));         /* c3-c9 */\n    tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899));      /* c3+c9 */\n\n    tmp13 = MULTIPLY(z2, - FIX(0.831253876));               /* -c9 */\n    tmp15 = MULTIPLY(z2, - FIX(1.344997024));               /* -c3 */\n    z2 = z1 - z4;\n    tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353));            /* c1 */\n\n    tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */\n    tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */\n    tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3;            /* c5 */\n    z2 = MULTIPLY(z1 + z4, FIX(0.575212477));               /* c11 */\n    tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3;      /* c7-c11 */\n    tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3;      /* c11+c13 */\n\n    /* Final output stage */\n\n    outptr[0]  = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[1]  = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[2]  = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[3]  = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[4]  = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[5]  = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[9]  = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[6]  = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[8]  = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[7]  = range_limit[(int) RIGHT_SHIFT(tmp27,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 16x16 output block.\n *\n * Optimized algorithm with 28 multiplications in the 1-D kernel.\n * cK represents sqrt(2) * cos(K*pi/32).\n */\n\nGLOBAL(void)\njpeg_idct_16x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\t JCOEFPTR coef_block,\n\t\t JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*16];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp0 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp0 += 1 << (CONST_BITS-PASS1_BITS-1);\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    tmp1 = MULTIPLY(z1, FIX(1.306562965));      /* c4[16] = c2[8] */\n    tmp2 = MULTIPLY(z1, FIX_0_541196100);       /* c12[16] = c6[8] */\n\n    tmp10 = tmp0 + tmp1;\n    tmp11 = tmp0 - tmp1;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n    z3 = z1 - z2;\n    z4 = MULTIPLY(z3, FIX(0.275899379));        /* c14[16] = c7[8] */\n    z3 = MULTIPLY(z3, FIX(1.387039845));        /* c2[16] = c1[8] */\n\n    tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447);  /* (c6+c2)[16] = (c3+c1)[8] */\n    tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223);  /* (c6-c14)[16] = (c3-c7)[8] */\n    tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */\n    tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */\n\n    tmp20 = tmp10 + tmp0;\n    tmp27 = tmp10 - tmp0;\n    tmp21 = tmp12 + tmp1;\n    tmp26 = tmp12 - tmp1;\n    tmp22 = tmp13 + tmp2;\n    tmp25 = tmp13 - tmp2;\n    tmp23 = tmp11 + tmp3;\n    tmp24 = tmp11 - tmp3;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    tmp11 = z1 + z3;\n\n    tmp1  = MULTIPLY(z1 + z2, FIX(1.353318001));   /* c3 */\n    tmp2  = MULTIPLY(tmp11,   FIX(1.247225013));   /* c5 */\n    tmp3  = MULTIPLY(z1 + z4, FIX(1.093201867));   /* c7 */\n    tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586));   /* c9 */\n    tmp11 = MULTIPLY(tmp11,   FIX(0.666655658));   /* c11 */\n    tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528));   /* c13 */\n    tmp0  = tmp1 + tmp2 + tmp3 -\n\t    MULTIPLY(z1, FIX(2.286341144));        /* c7+c5+c3-c1 */\n    tmp13 = tmp10 + tmp11 + tmp12 -\n\t    MULTIPLY(z1, FIX(1.835730603));        /* c9+c11+c13-c15 */\n    z1    = MULTIPLY(z2 + z3, FIX(0.138617169));   /* c15 */\n    tmp1  += z1 + MULTIPLY(z2, FIX(0.071888074));  /* c9+c11-c3-c15 */\n    tmp2  += z1 - MULTIPLY(z3, FIX(1.125726048));  /* c5+c7+c15-c3 */\n    z1    = MULTIPLY(z3 - z2, FIX(1.407403738));   /* c1 */\n    tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282));  /* c1+c11-c9-c13 */\n    tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411));  /* c1+c5+c13-c7 */\n    z2    += z4;\n    z1    = MULTIPLY(z2, - FIX(0.666655658));      /* -c11 */\n    tmp1  += z1;\n    tmp3  += z1 + MULTIPLY(z4, FIX(1.065388962));  /* c3+c11+c15-c7 */\n    z2    = MULTIPLY(z2, - FIX(1.247225013));      /* -c5 */\n    tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809));  /* c1+c5+c9-c13 */\n    tmp12 += z2;\n    z2    = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */\n    tmp2  += z2;\n    tmp3  += z2;\n    z2    = MULTIPLY(z4 - z3, FIX(0.410524528));   /* c13 */\n    tmp10 += z2;\n    tmp11 += z2;\n\n    /* Final output stage */\n\n    wsptr[8*0]  = (int) RIGHT_SHIFT(tmp20 + tmp0,  CONST_BITS-PASS1_BITS);\n    wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0,  CONST_BITS-PASS1_BITS);\n    wsptr[8*1]  = (int) RIGHT_SHIFT(tmp21 + tmp1,  CONST_BITS-PASS1_BITS);\n    wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1,  CONST_BITS-PASS1_BITS);\n    wsptr[8*2]  = (int) RIGHT_SHIFT(tmp22 + tmp2,  CONST_BITS-PASS1_BITS);\n    wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2,  CONST_BITS-PASS1_BITS);\n    wsptr[8*3]  = (int) RIGHT_SHIFT(tmp23 + tmp3,  CONST_BITS-PASS1_BITS);\n    wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3,  CONST_BITS-PASS1_BITS);\n    wsptr[8*4]  = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*5]  = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*6]  = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*9]  = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*7]  = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*8]  = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 16 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 16; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp0 <<= CONST_BITS;\n\n    z1 = (INT32) wsptr[4];\n    tmp1 = MULTIPLY(z1, FIX(1.306562965));      /* c4[16] = c2[8] */\n    tmp2 = MULTIPLY(z1, FIX_0_541196100);       /* c12[16] = c6[8] */\n\n    tmp10 = tmp0 + tmp1;\n    tmp11 = tmp0 - tmp1;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n\n    z1 = (INT32) wsptr[2];\n    z2 = (INT32) wsptr[6];\n    z3 = z1 - z2;\n    z4 = MULTIPLY(z3, FIX(0.275899379));        /* c14[16] = c7[8] */\n    z3 = MULTIPLY(z3, FIX(1.387039845));        /* c2[16] = c1[8] */\n\n    tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447);  /* (c6+c2)[16] = (c3+c1)[8] */\n    tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223);  /* (c6-c14)[16] = (c3-c7)[8] */\n    tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */\n    tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */\n\n    tmp20 = tmp10 + tmp0;\n    tmp27 = tmp10 - tmp0;\n    tmp21 = tmp12 + tmp1;\n    tmp26 = tmp12 - tmp1;\n    tmp22 = tmp13 + tmp2;\n    tmp25 = tmp13 - tmp2;\n    tmp23 = tmp11 + tmp3;\n    tmp24 = tmp11 - tmp3;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z4 = (INT32) wsptr[7];\n\n    tmp11 = z1 + z3;\n\n    tmp1  = MULTIPLY(z1 + z2, FIX(1.353318001));   /* c3 */\n    tmp2  = MULTIPLY(tmp11,   FIX(1.247225013));   /* c5 */\n    tmp3  = MULTIPLY(z1 + z4, FIX(1.093201867));   /* c7 */\n    tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586));   /* c9 */\n    tmp11 = MULTIPLY(tmp11,   FIX(0.666655658));   /* c11 */\n    tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528));   /* c13 */\n    tmp0  = tmp1 + tmp2 + tmp3 -\n\t    MULTIPLY(z1, FIX(2.286341144));        /* c7+c5+c3-c1 */\n    tmp13 = tmp10 + tmp11 + tmp12 -\n\t    MULTIPLY(z1, FIX(1.835730603));        /* c9+c11+c13-c15 */\n    z1    = MULTIPLY(z2 + z3, FIX(0.138617169));   /* c15 */\n    tmp1  += z1 + MULTIPLY(z2, FIX(0.071888074));  /* c9+c11-c3-c15 */\n    tmp2  += z1 - MULTIPLY(z3, FIX(1.125726048));  /* c5+c7+c15-c3 */\n    z1    = MULTIPLY(z3 - z2, FIX(1.407403738));   /* c1 */\n    tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282));  /* c1+c11-c9-c13 */\n    tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411));  /* c1+c5+c13-c7 */\n    z2    += z4;\n    z1    = MULTIPLY(z2, - FIX(0.666655658));      /* -c11 */\n    tmp1  += z1;\n    tmp3  += z1 + MULTIPLY(z4, FIX(1.065388962));  /* c3+c11+c15-c7 */\n    z2    = MULTIPLY(z2, - FIX(1.247225013));      /* -c5 */\n    tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809));  /* c1+c5+c9-c13 */\n    tmp12 += z2;\n    z2    = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */\n    tmp2  += z2;\n    tmp3  += z2;\n    z2    = MULTIPLY(z4 - z3, FIX(0.410524528));   /* c13 */\n    tmp10 += z2;\n    tmp11 += z2;\n\n    /* Final output stage */\n\n    outptr[0]  = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[1]  = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[2]  = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[3]  = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[4]  = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[5]  = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[6]  = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[9]  = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[7]  = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[8]  = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 16x8 output block.\n *\n * 8-point IDCT in pass 1 (columns), 16-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJCOEFPTR coef_block,\n\t\tJSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*8];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n  /* Note results are scaled up by sqrt(8) compared to a true IDCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = DCTSIZE; ctr > 0; ctr--) {\n    /* Due to quantization, we will usually find that many of the input\n     * coefficients are zero, especially the AC terms.  We can exploit this\n     * by short-circuiting the IDCT calculation for any column in which all\n     * the AC terms are zero.  In that case each output is equal to the\n     * DC coefficient (with scale factor as needed).\n     * With typical images and quantization tables, half or more of the\n     * column DCT calculations can be simplified this way.\n     */\n    \n    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&\n\tinptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&\n\tinptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&\n\tinptr[DCTSIZE*7] == 0) {\n      /* AC terms all zero */\n      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;\n      \n      wsptr[DCTSIZE*0] = dcval;\n      wsptr[DCTSIZE*1] = dcval;\n      wsptr[DCTSIZE*2] = dcval;\n      wsptr[DCTSIZE*3] = dcval;\n      wsptr[DCTSIZE*4] = dcval;\n      wsptr[DCTSIZE*5] = dcval;\n      wsptr[DCTSIZE*6] = dcval;\n      wsptr[DCTSIZE*7] = dcval;\n      \n      inptr++;\t\t\t/* advance pointers to next column */\n      quantptr++;\n      wsptr++;\n      continue;\n    }\n    \n    /* Even part: reverse the even part of the forward DCT. */\n    /* The rotator is sqrt(2)*c(-6). */\n    \n    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n    \n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);\n    tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);\n    tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);\n    \n    z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z2 <<= CONST_BITS;\n    z3 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z2 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    tmp0 = z2 + z3;\n    tmp1 = z2 - z3;\n    \n    tmp10 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n    tmp11 = tmp1 + tmp3;\n    tmp12 = tmp1 - tmp3;\n    \n    /* Odd part per figure 8; the matrix is unitary and hence its\n     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.\n     */\n    \n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n    tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    \n    z2 = tmp0 + tmp2;\n    z3 = tmp1 + tmp3;\n\n    z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */\n    z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    z2 += z1;\n    z3 += z1;\n\n    z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    tmp0 += z1 + z2;\n    tmp3 += z1 + z3;\n\n    z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp1 += z1 + z3;\n    tmp2 += z1 + z2;\n    \n    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */\n    \n    wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);\n    \n    inptr++;\t\t\t/* advance pointers to next column */\n    quantptr++;\n    wsptr++;\n  }\n\n  /* Pass 2: process 8 rows from work array, store into output array.\n   * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp0 <<= CONST_BITS;\n\n    z1 = (INT32) wsptr[4];\n    tmp1 = MULTIPLY(z1, FIX(1.306562965));      /* c4[16] = c2[8] */\n    tmp2 = MULTIPLY(z1, FIX_0_541196100);       /* c12[16] = c6[8] */\n\n    tmp10 = tmp0 + tmp1;\n    tmp11 = tmp0 - tmp1;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n\n    z1 = (INT32) wsptr[2];\n    z2 = (INT32) wsptr[6];\n    z3 = z1 - z2;\n    z4 = MULTIPLY(z3, FIX(0.275899379));        /* c14[16] = c7[8] */\n    z3 = MULTIPLY(z3, FIX(1.387039845));        /* c2[16] = c1[8] */\n\n    tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447);  /* (c6+c2)[16] = (c3+c1)[8] */\n    tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223);  /* (c6-c14)[16] = (c3-c7)[8] */\n    tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */\n    tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */\n\n    tmp20 = tmp10 + tmp0;\n    tmp27 = tmp10 - tmp0;\n    tmp21 = tmp12 + tmp1;\n    tmp26 = tmp12 - tmp1;\n    tmp22 = tmp13 + tmp2;\n    tmp25 = tmp13 - tmp2;\n    tmp23 = tmp11 + tmp3;\n    tmp24 = tmp11 - tmp3;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z4 = (INT32) wsptr[7];\n\n    tmp11 = z1 + z3;\n\n    tmp1  = MULTIPLY(z1 + z2, FIX(1.353318001));   /* c3 */\n    tmp2  = MULTIPLY(tmp11,   FIX(1.247225013));   /* c5 */\n    tmp3  = MULTIPLY(z1 + z4, FIX(1.093201867));   /* c7 */\n    tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586));   /* c9 */\n    tmp11 = MULTIPLY(tmp11,   FIX(0.666655658));   /* c11 */\n    tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528));   /* c13 */\n    tmp0  = tmp1 + tmp2 + tmp3 -\n\t    MULTIPLY(z1, FIX(2.286341144));        /* c7+c5+c3-c1 */\n    tmp13 = tmp10 + tmp11 + tmp12 -\n\t    MULTIPLY(z1, FIX(1.835730603));        /* c9+c11+c13-c15 */\n    z1    = MULTIPLY(z2 + z3, FIX(0.138617169));   /* c15 */\n    tmp1  += z1 + MULTIPLY(z2, FIX(0.071888074));  /* c9+c11-c3-c15 */\n    tmp2  += z1 - MULTIPLY(z3, FIX(1.125726048));  /* c5+c7+c15-c3 */\n    z1    = MULTIPLY(z3 - z2, FIX(1.407403738));   /* c1 */\n    tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282));  /* c1+c11-c9-c13 */\n    tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411));  /* c1+c5+c13-c7 */\n    z2    += z4;\n    z1    = MULTIPLY(z2, - FIX(0.666655658));      /* -c11 */\n    tmp1  += z1;\n    tmp3  += z1 + MULTIPLY(z4, FIX(1.065388962));  /* c3+c11+c15-c7 */\n    z2    = MULTIPLY(z2, - FIX(1.247225013));      /* -c5 */\n    tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809));  /* c1+c5+c9-c13 */\n    tmp12 += z2;\n    z2    = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */\n    tmp2  += z2;\n    tmp3  += z2;\n    z2    = MULTIPLY(z4 - z3, FIX(0.410524528));   /* c13 */\n    tmp10 += z2;\n    tmp11 += z2;\n\n    /* Final output stage */\n\n    outptr[0]  = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[1]  = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[2]  = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[3]  = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[4]  = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[5]  = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[6]  = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[9]  = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[7]  = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[8]  = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 14x7 output block.\n *\n * 7-point IDCT in pass 1 (columns), 14-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJCOEFPTR coef_block,\n\t\tJSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*7];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp23 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp23 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp23 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734));       /* c4 */\n    tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123));       /* c6 */\n    tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */\n    tmp10 = z1 + z3;\n    z2 -= tmp10;\n    tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */\n    tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536));   /* c2-c4-c6 */\n    tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249));   /* c2+c4+c6 */\n    tmp23 += MULTIPLY(z2, FIX(1.414213562));           /* c0 */\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n\n    tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347));       /* (c3+c1-c5)/2 */\n    tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339));       /* (c3+c5-c1)/2 */\n    tmp10 = tmp11 - tmp12;\n    tmp11 += tmp12;\n    tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276));     /* -c1 */\n    tmp11 += tmp12;\n    z2 = MULTIPLY(z1 + z3, FIX(0.613604268));          /* c5 */\n    tmp10 += z2;\n    tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693));      /* c3+c1-c5 */\n\n    /* Final output stage */\n\n    wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*6] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*5] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*4] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*3] = (int) RIGHT_SHIFT(tmp23, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 7 rows from work array, store into output array.\n   * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 7; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z1 <<= CONST_BITS;\n    z4 = (INT32) wsptr[4];\n    z2 = MULTIPLY(z4, FIX(1.274162392));         /* c4 */\n    z3 = MULTIPLY(z4, FIX(0.314692123));         /* c12 */\n    z4 = MULTIPLY(z4, FIX(0.881747734));         /* c8 */\n\n    tmp10 = z1 + z2;\n    tmp11 = z1 + z3;\n    tmp12 = z1 - z4;\n\n    tmp23 = z1 - ((z2 + z3 - z4) << 1);          /* c0 = (c4+c12-c8)*2 */\n\n    z1 = (INT32) wsptr[2];\n    z2 = (INT32) wsptr[6];\n\n    z3 = MULTIPLY(z1 + z2, FIX(1.105676686));    /* c6 */\n\n    tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */\n    tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */\n    tmp15 = MULTIPLY(z1, FIX(0.613604268)) -     /* c10 */\n\t    MULTIPLY(z2, FIX(1.378756276));      /* c2 */\n\n    tmp20 = tmp10 + tmp13;\n    tmp26 = tmp10 - tmp13;\n    tmp21 = tmp11 + tmp14;\n    tmp25 = tmp11 - tmp14;\n    tmp22 = tmp12 + tmp15;\n    tmp24 = tmp12 - tmp15;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z4 = (INT32) wsptr[7];\n    z4 <<= CONST_BITS;\n\n    tmp14 = z1 + z3;\n    tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607));           /* c3 */\n    tmp12 = MULTIPLY(tmp14, FIX(1.197448846));             /* c5 */\n    tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */\n    tmp14 = MULTIPLY(tmp14, FIX(0.752406978));             /* c9 */\n    tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426));        /* c9+c11-c13 */\n    z1    -= z2;\n    tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4;           /* c11 */\n    tmp16 += tmp15;\n    tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4;    /* -c13 */\n    tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948));       /* c3-c9-c13 */\n    tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773));       /* c3+c5-c13 */\n    tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284));           /* c1 */\n    tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */\n    tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567));       /* c1+c11-c5 */\n\n    tmp13 = ((z1 - z3) << CONST_BITS) + z4;\n\n    /* Final output stage */\n\n    outptr[0]  = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[1]  = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[2]  = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[3]  = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[4]  = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[9]  = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[5]  = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[8]  = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[6]  = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[7]  = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 12x6 output block.\n *\n * 6-point IDCT in pass 1 (columns), 12-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJCOEFPTR coef_block,\n\t\tJSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*6];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp10 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp10 += ONE << (CONST_BITS-PASS1_BITS-1);\n    tmp12 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    tmp20 = MULTIPLY(tmp12, FIX(0.707106781));   /* c4 */\n    tmp11 = tmp10 + tmp20;\n    tmp21 = RIGHT_SHIFT(tmp10 - tmp20 - tmp20, CONST_BITS-PASS1_BITS);\n    tmp20 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp10 = MULTIPLY(tmp20, FIX(1.224744871));   /* c2 */\n    tmp20 = tmp11 + tmp10;\n    tmp22 = tmp11 - tmp10;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */\n    tmp10 = tmp11 + ((z1 + z2) << CONST_BITS);\n    tmp12 = tmp11 + ((z3 - z2) << CONST_BITS);\n    tmp11 = (z1 - z2 - z3) << PASS1_BITS;\n\n    /* Final output stage */\n\n    wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*5] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*1] = (int) (tmp21 + tmp11);\n    wsptr[8*4] = (int) (tmp21 - tmp11);\n    wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*3] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 6 rows from work array, store into output array.\n   * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 6; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z3 <<= CONST_BITS;\n\n    z4 = (INT32) wsptr[4];\n    z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */\n\n    tmp10 = z3 + z4;\n    tmp11 = z3 - z4;\n\n    z1 = (INT32) wsptr[2];\n    z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */\n    z1 <<= CONST_BITS;\n    z2 = (INT32) wsptr[6];\n    z2 <<= CONST_BITS;\n\n    tmp12 = z1 - z2;\n\n    tmp21 = z3 + tmp12;\n    tmp24 = z3 - tmp12;\n\n    tmp12 = z4 + z2;\n\n    tmp20 = tmp10 + tmp12;\n    tmp25 = tmp10 - tmp12;\n\n    tmp12 = z4 - z1 - z2;\n\n    tmp22 = tmp11 + tmp12;\n    tmp23 = tmp11 - tmp12;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z4 = (INT32) wsptr[7];\n\n    tmp11 = MULTIPLY(z2, FIX(1.306562965));                  /* c3 */\n    tmp14 = MULTIPLY(z2, - FIX_0_541196100);                 /* -c9 */\n\n    tmp10 = z1 + z3;\n    tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669));          /* c7 */\n    tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384));       /* c5-c7 */\n    tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716));  /* c1-c5 */\n    tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580));           /* -(c7+c11) */\n    tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */\n    tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */\n    tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) -        /* c7-c11 */\n\t     MULTIPLY(z4, FIX(1.982889723));                 /* c5+c7 */\n\n    z1 -= z4;\n    z2 -= z3;\n    z3 = MULTIPLY(z1 + z2, FIX_0_541196100);                 /* c9 */\n    tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865);              /* c3-c9 */\n    tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065);              /* c3+c9 */\n\n    /* Final output stage */\n\n    outptr[0]  = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[1]  = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[2]  = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[9]  = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[3]  = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[8]  = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[4]  = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[7]  = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[5]  = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n    outptr[6]  = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,\n\t\t\t\t\t       CONST_BITS+PASS1_BITS+3)\n\t\t\t     & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 10x5 output block.\n *\n * 5-point IDCT in pass 1 (columns), 10-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJCOEFPTR coef_block,\n\t\tJSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*5];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp12 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp12 += ONE << (CONST_BITS-PASS1_BITS-1);\n    tmp13 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp14 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */\n    z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */\n    z3 = tmp12 + z2;\n    tmp10 = z3 + z1;\n    tmp11 = z3 - z1;\n    tmp12 -= z2 << 2;\n\n    /* Odd part */\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n\n    z1 = MULTIPLY(z2 + z3, FIX(0.831253876));       /* c3 */\n    tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148));    /* c1-c3 */\n    tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899));    /* c1+c3 */\n\n    /* Final output stage */\n\n    wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*4] = (int) RIGHT_SHIFT(tmp10 - tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*3] = (int) RIGHT_SHIFT(tmp11 - tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[8*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 5 rows from work array, store into output array.\n   * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 5; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z3 <<= CONST_BITS;\n    z4 = (INT32) wsptr[4];\n    z1 = MULTIPLY(z4, FIX(1.144122806));         /* c4 */\n    z2 = MULTIPLY(z4, FIX(0.437016024));         /* c8 */\n    tmp10 = z3 + z1;\n    tmp11 = z3 - z2;\n\n    tmp22 = z3 - ((z1 - z2) << 1);               /* c0 = (c4-c8)*2 */\n\n    z2 = (INT32) wsptr[2];\n    z3 = (INT32) wsptr[6];\n\n    z1 = MULTIPLY(z2 + z3, FIX(0.831253876));    /* c6 */\n    tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */\n    tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */\n\n    tmp20 = tmp10 + tmp12;\n    tmp24 = tmp10 - tmp12;\n    tmp21 = tmp11 + tmp13;\n    tmp23 = tmp11 - tmp13;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    z3 <<= CONST_BITS;\n    z4 = (INT32) wsptr[7];\n\n    tmp11 = z2 + z4;\n    tmp13 = z2 - z4;\n\n    tmp12 = MULTIPLY(tmp13, FIX(0.309016994));        /* (c3-c7)/2 */\n\n    z2 = MULTIPLY(tmp11, FIX(0.951056516));           /* (c3+c7)/2 */\n    z4 = z3 + tmp12;\n\n    tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */\n    tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */\n\n    z2 = MULTIPLY(tmp11, FIX(0.587785252));           /* (c1-c9)/2 */\n    z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1));\n\n    tmp12 = ((z1 - tmp13) << CONST_BITS) - z3;\n\n    tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */\n    tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 8;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 8x4 output block.\n *\n * 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3;\n  INT32 tmp10, tmp11, tmp12, tmp13;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*4];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n\n    tmp10 = (tmp0 + tmp2) << PASS1_BITS;\n    tmp12 = (tmp0 - tmp2) << PASS1_BITS;\n\n    /* Odd part */\n    /* Same rotation as in the even part of the 8x8 LL&M IDCT */\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n\n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);               /* c6 */\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-1);\n    tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */\n\t\t       CONST_BITS-PASS1_BITS);\n    tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */\n\t\t       CONST_BITS-PASS1_BITS);\n\n    /* Final output stage */\n\n    wsptr[8*0] = (int) (tmp10 + tmp0);\n    wsptr[8*3] = (int) (tmp10 - tmp0);\n    wsptr[8*1] = (int) (tmp12 + tmp2);\n    wsptr[8*2] = (int) (tmp12 - tmp2);\n  }\n\n  /* Pass 2: process rows from work array, store into output array. */\n  /* Note that we must descale the results by a factor of 8 == 2**3, */\n  /* and also undo the PASS1_BITS scaling. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 4; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part: reverse the even part of the forward DCT. */\n    /* The rotator is sqrt(2)*c(-6). */\n\n    z2 = (INT32) wsptr[2];\n    z3 = (INT32) wsptr[6];\n    \n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);\n    tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);\n    tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);\n    \n    /* Add fudge factor here for final descale. */\n    z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z3 = (INT32) wsptr[4];\n    \n    tmp0 = (z2 + z3) << CONST_BITS;\n    tmp1 = (z2 - z3) << CONST_BITS;\n    \n    tmp10 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n    tmp11 = tmp1 + tmp3;\n    tmp12 = tmp1 - tmp3;\n\n    /* Odd part per figure 8; the matrix is unitary and hence its\n     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.\n     */\n\n    tmp0 = (INT32) wsptr[7];\n    tmp1 = (INT32) wsptr[5];\n    tmp2 = (INT32) wsptr[3];\n    tmp3 = (INT32) wsptr[1];\n\n    z2 = tmp0 + tmp2;\n    z3 = tmp1 + tmp3;\n\n    z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */\n    z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    z2 += z1;\n    z3 += z1;\n\n    z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    tmp0 += z1 + z2;\n    tmp3 += z1 + z3;\n\n    z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp1 += z1 + z3;\n    tmp2 += z1 + z2;\n\n    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 6x3 output block.\n *\n * 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[6*3];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp0 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */\n    tmp10 = tmp0 + tmp12;\n    tmp2 = tmp0 - tmp12 - tmp12;\n\n    /* Odd part */\n\n    tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */\n\n    /* Final output stage */\n\n    wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[6*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[6*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS);\n  }\n  \n  /* Pass 2: process 3 rows from work array, store into output array.\n   * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 3; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp0 <<= CONST_BITS;\n    tmp2 = (INT32) wsptr[4];\n    tmp10 = MULTIPLY(tmp2, FIX(0.707106781));   /* c4 */\n    tmp1 = tmp0 + tmp10;\n    tmp11 = tmp0 - tmp10 - tmp10;\n    tmp10 = (INT32) wsptr[2];\n    tmp0 = MULTIPLY(tmp10, FIX(1.224744871));   /* c2 */\n    tmp10 = tmp1 + tmp0;\n    tmp12 = tmp1 - tmp0;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */\n    tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);\n    tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);\n    tmp1 = (z1 - z2 - z3) << CONST_BITS;\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 6;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 4x2 output block.\n *\n * 2-point IDCT in pass 1 (columns), 4-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_4x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp2, tmp10, tmp12;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  INT32 * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  INT32 workspace[4*2];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n\n    /* Odd part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n\n    /* Final output stage */\n\n    wsptr[4*0] = tmp10 + tmp0;\n    wsptr[4*1] = tmp10 - tmp0;\n  }\n\n  /* Pass 2: process 2 rows from work array, store into output array.\n   * 4-point IDCT kernel,\n   * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 2; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = wsptr[0] + (ONE << 2);\n    tmp2 = wsptr[2];\n\n    tmp10 = (tmp0 + tmp2) << CONST_BITS;\n    tmp12 = (tmp0 - tmp2) << CONST_BITS;\n\n    /* Odd part */\n    /* Same rotation as in the even part of the 8x8 LL&M IDCT */\n\n    z2 = wsptr[1];\n    z3 = wsptr[3];\n\n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);   /* c6 */\n    tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */\n    tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,\n\t\t\t\t\t      CONST_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,\n\t\t\t\t\t      CONST_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 4;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 2x1 output block.\n *\n * 1-point IDCT in pass 1 (columns), 2-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp10;\n  ISLOW_MULT_TYPE * quantptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  SHIFT_TEMPS\n\n  /* Pass 1: empty. */\n\n  /* Pass 2: process 1 row from input, store into output array. */\n\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  outptr = output_buf[0] + output_col;\n\n  /* Even part */\n\n  tmp10 = DEQUANTIZE(coef_block[0], quantptr[0]);\n  /* Add fudge factor here for final descale. */\n  tmp10 += ONE << 2;\n\n  /* Odd part */\n\n  tmp0 = DEQUANTIZE(coef_block[1], quantptr[1]);\n\n  /* Final output stage */\n\n  outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) & RANGE_MASK];\n  outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) & RANGE_MASK];\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 8x16 output block.\n *\n * 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJCOEFPTR coef_block,\n\t\tJSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[8*16];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp0 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    tmp1 = MULTIPLY(z1, FIX(1.306562965));      /* c4[16] = c2[8] */\n    tmp2 = MULTIPLY(z1, FIX_0_541196100);       /* c12[16] = c6[8] */\n\n    tmp10 = tmp0 + tmp1;\n    tmp11 = tmp0 - tmp1;\n    tmp12 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n    z3 = z1 - z2;\n    z4 = MULTIPLY(z3, FIX(0.275899379));        /* c14[16] = c7[8] */\n    z3 = MULTIPLY(z3, FIX(1.387039845));        /* c2[16] = c1[8] */\n\n    tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447);  /* (c6+c2)[16] = (c3+c1)[8] */\n    tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223);  /* (c6-c14)[16] = (c3-c7)[8] */\n    tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */\n    tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */\n\n    tmp20 = tmp10 + tmp0;\n    tmp27 = tmp10 - tmp0;\n    tmp21 = tmp12 + tmp1;\n    tmp26 = tmp12 - tmp1;\n    tmp22 = tmp13 + tmp2;\n    tmp25 = tmp13 - tmp2;\n    tmp23 = tmp11 + tmp3;\n    tmp24 = tmp11 - tmp3;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    tmp11 = z1 + z3;\n\n    tmp1  = MULTIPLY(z1 + z2, FIX(1.353318001));   /* c3 */\n    tmp2  = MULTIPLY(tmp11,   FIX(1.247225013));   /* c5 */\n    tmp3  = MULTIPLY(z1 + z4, FIX(1.093201867));   /* c7 */\n    tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586));   /* c9 */\n    tmp11 = MULTIPLY(tmp11,   FIX(0.666655658));   /* c11 */\n    tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528));   /* c13 */\n    tmp0  = tmp1 + tmp2 + tmp3 -\n\t    MULTIPLY(z1, FIX(2.286341144));        /* c7+c5+c3-c1 */\n    tmp13 = tmp10 + tmp11 + tmp12 -\n\t    MULTIPLY(z1, FIX(1.835730603));        /* c9+c11+c13-c15 */\n    z1    = MULTIPLY(z2 + z3, FIX(0.138617169));   /* c15 */\n    tmp1  += z1 + MULTIPLY(z2, FIX(0.071888074));  /* c9+c11-c3-c15 */\n    tmp2  += z1 - MULTIPLY(z3, FIX(1.125726048));  /* c5+c7+c15-c3 */\n    z1    = MULTIPLY(z3 - z2, FIX(1.407403738));   /* c1 */\n    tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282));  /* c1+c11-c9-c13 */\n    tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411));  /* c1+c5+c13-c7 */\n    z2    += z4;\n    z1    = MULTIPLY(z2, - FIX(0.666655658));      /* -c11 */\n    tmp1  += z1;\n    tmp3  += z1 + MULTIPLY(z4, FIX(1.065388962));  /* c3+c11+c15-c7 */\n    z2    = MULTIPLY(z2, - FIX(1.247225013));      /* -c5 */\n    tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809));  /* c1+c5+c9-c13 */\n    tmp12 += z2;\n    z2    = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */\n    tmp2  += z2;\n    tmp3  += z2;\n    z2    = MULTIPLY(z4 - z3, FIX(0.410524528));   /* c13 */\n    tmp10 += z2;\n    tmp11 += z2;\n\n    /* Final output stage */\n\n    wsptr[8*0]  = (int) RIGHT_SHIFT(tmp20 + tmp0,  CONST_BITS-PASS1_BITS);\n    wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0,  CONST_BITS-PASS1_BITS);\n    wsptr[8*1]  = (int) RIGHT_SHIFT(tmp21 + tmp1,  CONST_BITS-PASS1_BITS);\n    wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1,  CONST_BITS-PASS1_BITS);\n    wsptr[8*2]  = (int) RIGHT_SHIFT(tmp22 + tmp2,  CONST_BITS-PASS1_BITS);\n    wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2,  CONST_BITS-PASS1_BITS);\n    wsptr[8*3]  = (int) RIGHT_SHIFT(tmp23 + tmp3,  CONST_BITS-PASS1_BITS);\n    wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3,  CONST_BITS-PASS1_BITS);\n    wsptr[8*4]  = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[8*5]  = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[8*6]  = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*9]  = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[8*7]  = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[8*8]  = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);\n  }\n  \n  /* Pass 2: process rows from work array, store into output array. */\n  /* Note that we must descale the results by a factor of 8 == 2**3, */\n  /* and also undo the PASS1_BITS scaling. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 16; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n    \n    /* Even part: reverse the even part of the forward DCT. */\n    /* The rotator is sqrt(2)*c(-6). */\n    \n    z2 = (INT32) wsptr[2];\n    z3 = (INT32) wsptr[6];\n    \n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);\n    tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);\n    tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);\n    \n    /* Add fudge factor here for final descale. */\n    z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    z3 = (INT32) wsptr[4];\n    \n    tmp0 = (z2 + z3) << CONST_BITS;\n    tmp1 = (z2 - z3) << CONST_BITS;\n    \n    tmp10 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n    tmp11 = tmp1 + tmp3;\n    tmp12 = tmp1 - tmp3;\n    \n    /* Odd part per figure 8; the matrix is unitary and hence its\n     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.\n     */\n    \n    tmp0 = (INT32) wsptr[7];\n    tmp1 = (INT32) wsptr[5];\n    tmp2 = (INT32) wsptr[3];\n    tmp3 = (INT32) wsptr[1];\n    \n    z2 = tmp0 + tmp2;\n    z3 = tmp1 + tmp3;\n\n    z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */\n    z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    z2 += z1;\n    z3 += z1;\n\n    z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    tmp0 += z1 + z2;\n    tmp3 += z1 + z3;\n\n    z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp1 += z1 + z3;\n    tmp2 += z1 + z2;\n    \n    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */\n    \n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    \n    wsptr += DCTSIZE;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 7x14 output block.\n *\n * 14-point IDCT in pass 1 (columns), 7-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJCOEFPTR coef_block,\n\t\tJSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[7*14];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z1 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z1 += ONE << (CONST_BITS-PASS1_BITS-1);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z2 = MULTIPLY(z4, FIX(1.274162392));         /* c4 */\n    z3 = MULTIPLY(z4, FIX(0.314692123));         /* c12 */\n    z4 = MULTIPLY(z4, FIX(0.881747734));         /* c8 */\n\n    tmp10 = z1 + z2;\n    tmp11 = z1 + z3;\n    tmp12 = z1 - z4;\n\n    tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */\n\t\t\tCONST_BITS-PASS1_BITS);\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    z3 = MULTIPLY(z1 + z2, FIX(1.105676686));    /* c6 */\n\n    tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */\n    tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */\n    tmp15 = MULTIPLY(z1, FIX(0.613604268)) -     /* c10 */\n\t    MULTIPLY(z2, FIX(1.378756276));      /* c2 */\n\n    tmp20 = tmp10 + tmp13;\n    tmp26 = tmp10 - tmp13;\n    tmp21 = tmp11 + tmp14;\n    tmp25 = tmp11 - tmp14;\n    tmp22 = tmp12 + tmp15;\n    tmp24 = tmp12 - tmp15;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n    tmp13 = z4 << CONST_BITS;\n\n    tmp14 = z1 + z3;\n    tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607));           /* c3 */\n    tmp12 = MULTIPLY(tmp14, FIX(1.197448846));             /* c5 */\n    tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */\n    tmp14 = MULTIPLY(tmp14, FIX(0.752406978));             /* c9 */\n    tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426));        /* c9+c11-c13 */\n    z1    -= z2;\n    tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13;        /* c11 */\n    tmp16 += tmp15;\n    z1    += z4;\n    z4    = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */\n    tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948));          /* c3-c9-c13 */\n    tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773));          /* c3+c5-c13 */\n    z4    = MULTIPLY(z3 - z2, FIX(1.405321284));           /* c1 */\n    tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */\n    tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567));          /* c1+c11-c5 */\n\n    tmp13 = (z1 - z3) << PASS1_BITS;\n\n    /* Final output stage */\n\n    wsptr[7*0]  = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[7*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[7*1]  = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[7*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[7*2]  = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[7*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[7*3]  = (int) (tmp23 + tmp13);\n    wsptr[7*10] = (int) (tmp23 - tmp13);\n    wsptr[7*4]  = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[7*9]  = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[7*5]  = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[7*8]  = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[7*6]  = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS);\n    wsptr[7*7]  = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 14 rows from work array, store into output array.\n   * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 14; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp23 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp23 <<= CONST_BITS;\n\n    z1 = (INT32) wsptr[2];\n    z2 = (INT32) wsptr[4];\n    z3 = (INT32) wsptr[6];\n\n    tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734));       /* c4 */\n    tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123));       /* c6 */\n    tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */\n    tmp10 = z1 + z3;\n    z2 -= tmp10;\n    tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */\n    tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536));   /* c2-c4-c6 */\n    tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249));   /* c2+c4+c6 */\n    tmp23 += MULTIPLY(z2, FIX(1.414213562));           /* c0 */\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n\n    tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347));       /* (c3+c1-c5)/2 */\n    tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339));       /* (c3+c5-c1)/2 */\n    tmp10 = tmp11 - tmp12;\n    tmp11 += tmp12;\n    tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276));     /* -c1 */\n    tmp11 += tmp12;\n    z2 = MULTIPLY(z1 + z3, FIX(0.613604268));          /* c5 */\n    tmp10 += z2;\n    tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693));      /* c3+c1-c5 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 7;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 6x12 output block.\n *\n * 12-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJCOEFPTR coef_block,\n\t\tJSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;\n  INT32 z1, z2, z3, z4;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[6*12];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z3 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z3 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */\n\n    tmp10 = z3 + z4;\n    tmp11 = z3 - z4;\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */\n    z1 <<= CONST_BITS;\n    z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n    z2 <<= CONST_BITS;\n\n    tmp12 = z1 - z2;\n\n    tmp21 = z3 + tmp12;\n    tmp24 = z3 - tmp12;\n\n    tmp12 = z4 + z2;\n\n    tmp20 = tmp10 + tmp12;\n    tmp25 = tmp10 - tmp12;\n\n    tmp12 = z4 - z1 - z2;\n\n    tmp22 = tmp11 + tmp12;\n    tmp23 = tmp11 - tmp12;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    tmp11 = MULTIPLY(z2, FIX(1.306562965));                  /* c3 */\n    tmp14 = MULTIPLY(z2, - FIX_0_541196100);                 /* -c9 */\n\n    tmp10 = z1 + z3;\n    tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669));          /* c7 */\n    tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384));       /* c5-c7 */\n    tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716));  /* c1-c5 */\n    tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580));           /* -(c7+c11) */\n    tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */\n    tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */\n    tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) -        /* c7-c11 */\n\t     MULTIPLY(z4, FIX(1.982889723));                 /* c5+c7 */\n\n    z1 -= z4;\n    z2 -= z3;\n    z3 = MULTIPLY(z1 + z2, FIX_0_541196100);                 /* c9 */\n    tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865);              /* c3-c9 */\n    tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065);              /* c3+c9 */\n\n    /* Final output stage */\n\n    wsptr[6*0]  = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[6*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[6*1]  = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[6*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[6*2]  = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[6*9]  = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);\n    wsptr[6*3]  = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[6*8]  = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[6*4]  = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[6*7]  = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[6*5]  = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);\n    wsptr[6*6]  = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 12 rows from work array, store into output array.\n   * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 12; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp10 <<= CONST_BITS;\n    tmp12 = (INT32) wsptr[4];\n    tmp20 = MULTIPLY(tmp12, FIX(0.707106781));   /* c4 */\n    tmp11 = tmp10 + tmp20;\n    tmp21 = tmp10 - tmp20 - tmp20;\n    tmp20 = (INT32) wsptr[2];\n    tmp10 = MULTIPLY(tmp20, FIX(1.224744871));   /* c2 */\n    tmp20 = tmp11 + tmp10;\n    tmp22 = tmp11 - tmp10;\n\n    /* Odd part */\n\n    z1 = (INT32) wsptr[1];\n    z2 = (INT32) wsptr[3];\n    z3 = (INT32) wsptr[5];\n    tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */\n    tmp10 = tmp11 + ((z1 + z2) << CONST_BITS);\n    tmp12 = tmp11 + ((z3 - z2) << CONST_BITS);\n    tmp11 = (z1 - z2 - z3) << CONST_BITS;\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 6;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 5x10 output block.\n *\n * 10-point IDCT in pass 1 (columns), 5-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t\tJCOEFPTR coef_block,\n\t\tJSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp10, tmp11, tmp12, tmp13, tmp14;\n  INT32 tmp20, tmp21, tmp22, tmp23, tmp24;\n  INT32 z1, z2, z3, z4, z5;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[5*10];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z3 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z3 += ONE << (CONST_BITS-PASS1_BITS-1);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z1 = MULTIPLY(z4, FIX(1.144122806));         /* c4 */\n    z2 = MULTIPLY(z4, FIX(0.437016024));         /* c8 */\n    tmp10 = z3 + z1;\n    tmp11 = z3 - z2;\n\n    tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1),   /* c0 = (c4-c8)*2 */\n\t\t\tCONST_BITS-PASS1_BITS);\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n\n    z1 = MULTIPLY(z2 + z3, FIX(0.831253876));    /* c6 */\n    tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */\n    tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */\n\n    tmp20 = tmp10 + tmp12;\n    tmp24 = tmp10 - tmp12;\n    tmp21 = tmp11 + tmp13;\n    tmp23 = tmp11 - tmp13;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n\n    tmp11 = z2 + z4;\n    tmp13 = z2 - z4;\n\n    tmp12 = MULTIPLY(tmp13, FIX(0.309016994));        /* (c3-c7)/2 */\n    z5 = z3 << CONST_BITS;\n\n    z2 = MULTIPLY(tmp11, FIX(0.951056516));           /* (c3+c7)/2 */\n    z4 = z5 + tmp12;\n\n    tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */\n    tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */\n\n    z2 = MULTIPLY(tmp11, FIX(0.587785252));           /* (c1-c9)/2 */\n    z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1));\n\n    tmp12 = (z1 - tmp13 - z3) << PASS1_BITS;\n\n    tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */\n    tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */\n\n    /* Final output stage */\n\n    wsptr[5*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[5*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);\n    wsptr[5*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[5*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);\n    wsptr[5*2] = (int) (tmp22 + tmp12);\n    wsptr[5*7] = (int) (tmp22 - tmp12);\n    wsptr[5*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[5*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);\n    wsptr[5*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);\n    wsptr[5*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 10 rows from work array, store into output array.\n   * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 10; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp12 <<= CONST_BITS;\n    tmp13 = (INT32) wsptr[2];\n    tmp14 = (INT32) wsptr[4];\n    z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */\n    z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */\n    z3 = tmp12 + z2;\n    tmp10 = z3 + z1;\n    tmp11 = z3 - z1;\n    tmp12 -= z2 << 2;\n\n    /* Odd part */\n\n    z2 = (INT32) wsptr[1];\n    z3 = (INT32) wsptr[3];\n\n    z1 = MULTIPLY(z2 + z3, FIX(0.831253876));       /* c3 */\n    tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148));    /* c1-c3 */\n    tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899));    /* c1+c3 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp13,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp13,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp14,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp14,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 5;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 4x8 output block.\n *\n * 8-point IDCT in pass 1 (columns), 4-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp3;\n  INT32 tmp10, tmp11, tmp12, tmp13;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[4*8];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array. */\n  /* Note results are scaled up by sqrt(8) compared to a true IDCT; */\n  /* furthermore, we scale the results by 2**PASS1_BITS. */\n\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 4; ctr > 0; ctr--) {\n    /* Due to quantization, we will usually find that many of the input\n     * coefficients are zero, especially the AC terms.  We can exploit this\n     * by short-circuiting the IDCT calculation for any column in which all\n     * the AC terms are zero.  In that case each output is equal to the\n     * DC coefficient (with scale factor as needed).\n     * With typical images and quantization tables, half or more of the\n     * column DCT calculations can be simplified this way.\n     */\n\n    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&\n\tinptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&\n\tinptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&\n\tinptr[DCTSIZE*7] == 0) {\n      /* AC terms all zero */\n      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;\n\n      wsptr[4*0] = dcval;\n      wsptr[4*1] = dcval;\n      wsptr[4*2] = dcval;\n      wsptr[4*3] = dcval;\n      wsptr[4*4] = dcval;\n      wsptr[4*5] = dcval;\n      wsptr[4*6] = dcval;\n      wsptr[4*7] = dcval;\n\n      inptr++;\t\t\t/* advance pointers to next column */\n      quantptr++;\n      wsptr++;\n      continue;\n    }\n\n    /* Even part: reverse the even part of the forward DCT. */\n    /* The rotator is sqrt(2)*c(-6). */\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);\n    \n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);\n    tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);\n    tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);\n    \n    z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    z2 <<= CONST_BITS;\n    z3 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    z2 += ONE << (CONST_BITS-PASS1_BITS-1);\n\n    tmp0 = z2 + z3;\n    tmp1 = z2 - z3;\n    \n    tmp10 = tmp0 + tmp2;\n    tmp13 = tmp0 - tmp2;\n    tmp11 = tmp1 + tmp3;\n    tmp12 = tmp1 - tmp3;\n\n    /* Odd part per figure 8; the matrix is unitary and hence its\n     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.\n     */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);\n    tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n\n    z2 = tmp0 + tmp2;\n    z3 = tmp1 + tmp3;\n\n    z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */\n    z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */\n    z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */\n    z2 += z1;\n    z3 += z1;\n\n    z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */\n    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */\n    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */\n    tmp0 += z1 + z2;\n    tmp3 += z1 + z3;\n\n    z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */\n    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */\n    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */\n    tmp1 += z1 + z3;\n    tmp2 += z1 + z2;\n\n    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */\n\n    wsptr[4*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[4*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);\n    wsptr[4*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[4*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[4*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[4*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);\n    wsptr[4*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[4*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);\n\n    inptr++;\t\t\t/* advance pointers to next column */\n    quantptr++;\n    wsptr++;\n  }\n\n  /* Pass 2: process 8 rows from work array, store into output array.\n   * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 8; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp2 = (INT32) wsptr[2];\n\n    tmp10 = (tmp0 + tmp2) << CONST_BITS;\n    tmp12 = (tmp0 - tmp2) << CONST_BITS;\n\n    /* Odd part */\n    /* Same rotation as in the even part of the 8x8 LL&M IDCT */\n\n    z2 = (INT32) wsptr[1];\n    z3 = (INT32) wsptr[3];\n\n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);   /* c6 */\n    tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */\n    tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    \n    wsptr += 4;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a reduced-size 3x6 output block.\n *\n * 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  int * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  int workspace[3*6];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp0 <<= CONST_BITS;\n    /* Add fudge factor here for final descale. */\n    tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);\n    tmp10 = MULTIPLY(tmp2, FIX(0.707106781));   /* c4 */\n    tmp1 = tmp0 + tmp10;\n    tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS);\n    tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n    tmp0 = MULTIPLY(tmp10, FIX(1.224744871));   /* c2 */\n    tmp10 = tmp1 + tmp0;\n    tmp12 = tmp1 - tmp0;\n\n    /* Odd part */\n\n    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);\n    tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */\n    tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);\n    tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);\n    tmp1 = (z1 - z2 - z3) << PASS1_BITS;\n\n    /* Final output stage */\n\n    wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[3*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);\n    wsptr[3*1] = (int) (tmp11 + tmp1);\n    wsptr[3*4] = (int) (tmp11 - tmp1);\n    wsptr[3*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);\n    wsptr[3*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);\n  }\n\n  /* Pass 2: process 6 rows from work array, store into output array.\n   * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).\n   */\n  wsptr = workspace;\n  for (ctr = 0; ctr < 6; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));\n    tmp0 <<= CONST_BITS;\n    tmp2 = (INT32) wsptr[2];\n    tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */\n    tmp10 = tmp0 + tmp12;\n    tmp2 = tmp0 - tmp12 - tmp12;\n\n    /* Odd part */\n\n    tmp12 = (INT32) wsptr[1];\n    tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2,\n\t\t\t\t\t      CONST_BITS+PASS1_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 3;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 2x4 output block.\n *\n * 4-point IDCT in pass 1 (columns), 2-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp2, tmp10, tmp12;\n  INT32 z1, z2, z3;\n  JCOEFPTR inptr;\n  ISLOW_MULT_TYPE * quantptr;\n  INT32 * wsptr;\n  JSAMPROW outptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  int ctr;\n  INT32 workspace[2*4];\t/* buffers data between passes */\n  SHIFT_TEMPS\n\n  /* Pass 1: process columns from input, store into work array.\n   * 4-point IDCT kernel,\n   * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].\n   */\n  inptr = coef_block;\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n  wsptr = workspace;\n  for (ctr = 0; ctr < 2; ctr++, inptr++, quantptr++, wsptr++) {\n    /* Even part */\n\n    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);\n    tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);\n\n    tmp10 = (tmp0 + tmp2) << CONST_BITS;\n    tmp12 = (tmp0 - tmp2) << CONST_BITS;\n\n    /* Odd part */\n    /* Same rotation as in the even part of the 8x8 LL&M IDCT */\n\n    z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);\n    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);\n\n    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);   /* c6 */\n    tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */\n    tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */\n\n    /* Final output stage */\n\n    wsptr[2*0] = tmp10 + tmp0;\n    wsptr[2*3] = tmp10 - tmp0;\n    wsptr[2*1] = tmp12 + tmp2;\n    wsptr[2*2] = tmp12 - tmp2;\n  }\n\n  /* Pass 2: process 4 rows from work array, store into output array. */\n\n  wsptr = workspace;\n  for (ctr = 0; ctr < 4; ctr++) {\n    outptr = output_buf[ctr] + output_col;\n\n    /* Even part */\n\n    /* Add fudge factor here for final descale. */\n    tmp10 = wsptr[0] + (ONE << (CONST_BITS+2));\n\n    /* Odd part */\n\n    tmp0 = wsptr[1];\n\n    /* Final output stage */\n\n    outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS+3)\n\t\t\t    & RANGE_MASK];\n    outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS+3)\n\t\t\t    & RANGE_MASK];\n\n    wsptr += 2;\t\t/* advance pointer to next row */\n  }\n}\n\n\n/*\n * Perform dequantization and inverse DCT on one block of coefficients,\n * producing a 1x2 output block.\n *\n * 2-point IDCT in pass 1 (columns), 1-point in pass 2 (rows).\n */\n\nGLOBAL(void)\njpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,\n\t       JCOEFPTR coef_block,\n\t       JSAMPARRAY output_buf, JDIMENSION output_col)\n{\n  INT32 tmp0, tmp10;\n  ISLOW_MULT_TYPE * quantptr;\n  JSAMPLE *range_limit = IDCT_range_limit(cinfo);\n  SHIFT_TEMPS\n\n  /* Process 1 column from input, store into output array. */\n\n  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;\n\n  /* Even part */\n    \n  tmp10 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);\n  /* Add fudge factor here for final descale. */\n  tmp10 += ONE << 2;\n\n  /* Odd part */\n\n  tmp0 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);\n\n  /* Final output stage */\n\n  output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3)\n\t\t\t\t\t  & RANGE_MASK];\n  output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3)\n\t\t\t\t\t  & RANGE_MASK];\n}\n\n#endif /* IDCT_SCALING_SUPPORTED */\n#endif /* DCT_ISLOW_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jmem-android.c",
    "content": "/*\n * Copyright (C) 2007-2008 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jmemsys.h\"\t\t/* import the system-dependent declarations */\n\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare malloc(),free() */\nextern void * malloc JPP((size_t size));\nextern void free JPP((void *ptr));\n#endif\n\n#ifndef SEEK_SET\t\t/* pre-ANSI systems may not define this; */\n#define SEEK_SET  0\t\t/* if not, assume 0 is correct */\n#endif\n\n\n/*\n * Memory allocation and freeing are controlled by the regular library\n * routines malloc() and free().\n */\n\nGLOBAL(void *)\njpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void *) malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)\n{\n  free(object);\n}\n\n\n/*\n * \"Large\" objects are treated the same as \"small\" ones.\n * NB: although we include FAR keywords in the routine declarations,\n * this file won't actually work in 80x86 small/medium model; at least,\n * you probably won't be able to process useful-size images in only 64KB.\n */\n\nGLOBAL(void FAR *)\njpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void FAR *) malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)\n{\n  free(object);\n}\n\n\n/*\n * This routine computes the total memory space available for allocation.\n * It's impossible to do this in a portable way; our current solution is\n * to make the user tell us (with a default value set at compile time).\n * If you can actually get the available space, it's a good idea to subtract\n * a slop factor of 5% or so.\n */\n\n#ifndef DEFAULT_MAX_MEM\t\t/* so can override from makefile */\n#define DEFAULT_MAX_MEM\t\t10000000L /* default: ten megabyte */\n#endif\n\nGLOBAL(long)\njpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,\n\t\t    long max_bytes_needed, long already_allocated)\n{\n  return cinfo->mem->max_memory_to_use - already_allocated;\n}\n\n\n/*\n * Backing store (temporary file) management.\n * Backing store objects are only used when the value returned by\n * jpeg_mem_available is less than the total space needed.  You can dispense\n * with these routines if you have plenty of virtual memory; see jmemnobs.c.\n */\n\n\nMETHODDEF(void)\nread_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t    void FAR * buffer_address,\n\t\t    long file_offset, long byte_count)\n{\n  if (fseek(info->temp_file, file_offset, SEEK_SET))\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n  if (JFREAD(info->temp_file, buffer_address, byte_count)\n      != (size_t) byte_count)\n    ERREXIT(cinfo, JERR_TFILE_READ);\n}\n\n\nMETHODDEF(void)\nwrite_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t     void FAR * buffer_address,\n\t\t     long file_offset, long byte_count)\n{\n  if (fseek(info->temp_file, file_offset, SEEK_SET))\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n  if (JFWRITE(info->temp_file, buffer_address, byte_count)\n      != (size_t) byte_count)\n    ERREXIT(cinfo, JERR_TFILE_WRITE);\n}\n\n\nMETHODDEF(void)\nclose_backing_store (j_common_ptr cinfo, backing_store_ptr info)\n{\n  fclose(info->temp_file);\n  /* Since this implementation uses tmpfile() to create the file,\n   * no explicit file deletion is needed.\n   */\n}\n\nstatic FILE* getTempFileFromPath(const char * path) {\n    FILE * fd = fopen(path, \"w+\");\n    unlink(path);\n    return fd;\n}\n\nstatic FILE* getTempFile() {\n    char path[1024];\n    snprintf(path, 1023, \"/sdcard/.%d.tmp\", getpid());\n    FILE * fd = getTempFileFromPath(path);\n    if (fd == NULL) {\n        // anywhere else we can create a temp file?\n\t\t//\t    snprintf(path, 1023, \"/data/data/.%d.tmp\", getpid());\n\t\t//      fd = getTempFileFromPath(path);\n    }\n    return fd;\n}\n\n/*\n * Initial opening of a backing-store object.\n *\n * This version uses tmpfile(), which constructs a suitable file name\n * behind the scenes.  We don't have to use info->temp_name[] at all;\n * indeed, we can't even find out the actual name of the temp file.\n */\n\nGLOBAL(void)\njpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t\t long total_bytes_needed)\n{\n  if ((info->temp_file = getTempFile()) == NULL)\n    ERREXITS(cinfo, JERR_TFILE_CREATE, \"\");\n  info->read_backing_store = read_backing_store;\n  info->write_backing_store = write_backing_store;\n  info->close_backing_store = close_backing_store;\n}\n\n\n/*\n * These routines take care of any system-dependent initialization and\n * cleanup required.\n */\n\nGLOBAL(long)\njpeg_mem_init (j_common_ptr cinfo)\n{\n  return DEFAULT_MAX_MEM;\t/* default for max_memory_to_use */\n}\n\nGLOBAL(void)\njpeg_mem_term (j_common_ptr cinfo)\n{\n  /* no work */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jmemansi.c",
    "content": "/*\n * jmemansi.c\n *\n * Copyright (C) 1992-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file provides a simple generic implementation of the system-\n * dependent portion of the JPEG memory manager.  This implementation\n * assumes that you have the ANSI-standard library routine tmpfile().\n * Also, the problem of determining the amount of memory available\n * is shoved onto the user.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jmemsys.h\"\t\t/* import the system-dependent declarations */\n\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare malloc(),free() */\nextern void * malloc JPP((size_t size));\nextern void free JPP((void *ptr));\n#endif\n\n#ifndef SEEK_SET\t\t/* pre-ANSI systems may not define this; */\n#define SEEK_SET  0\t\t/* if not, assume 0 is correct */\n#endif\n\n\n/*\n * Memory allocation and freeing are controlled by the regular library\n * routines malloc() and free().\n */\n\nGLOBAL(void *)\njpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void *) malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)\n{\n  free(object);\n}\n\n\n/*\n * \"Large\" objects are treated the same as \"small\" ones.\n * NB: although we include FAR keywords in the routine declarations,\n * this file won't actually work in 80x86 small/medium model; at least,\n * you probably won't be able to process useful-size images in only 64KB.\n */\n\nGLOBAL(void FAR *)\njpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void FAR *) malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)\n{\n  free(object);\n}\n\n\n/*\n * This routine computes the total memory space available for allocation.\n * It's impossible to do this in a portable way; our current solution is\n * to make the user tell us (with a default value set at compile time).\n * If you can actually get the available space, it's a good idea to subtract\n * a slop factor of 5% or so.\n */\n\n#ifndef DEFAULT_MAX_MEM\t\t/* so can override from makefile */\n#define DEFAULT_MAX_MEM\t\t1000000L /* default: one megabyte */\n#endif\n\nGLOBAL(long)\njpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,\n\t\t    long max_bytes_needed, long already_allocated)\n{\n  return cinfo->mem->max_memory_to_use - already_allocated;\n}\n\n\n/*\n * Backing store (temporary file) management.\n * Backing store objects are only used when the value returned by\n * jpeg_mem_available is less than the total space needed.  You can dispense\n * with these routines if you have plenty of virtual memory; see jmemnobs.c.\n */\n\n\nMETHODDEF(void)\nread_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t    void FAR * buffer_address,\n\t\t    long file_offset, long byte_count)\n{\n  if (fseek(info->temp_file, file_offset, SEEK_SET))\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n  if (JFREAD(info->temp_file, buffer_address, byte_count)\n      != (size_t) byte_count)\n    ERREXIT(cinfo, JERR_TFILE_READ);\n}\n\n\nMETHODDEF(void)\nwrite_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t     void FAR * buffer_address,\n\t\t     long file_offset, long byte_count)\n{\n  if (fseek(info->temp_file, file_offset, SEEK_SET))\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n  if (JFWRITE(info->temp_file, buffer_address, byte_count)\n      != (size_t) byte_count)\n    ERREXIT(cinfo, JERR_TFILE_WRITE);\n}\n\n\nMETHODDEF(void)\nclose_backing_store (j_common_ptr cinfo, backing_store_ptr info)\n{\n  fclose(info->temp_file);\n  /* Since this implementation uses tmpfile() to create the file,\n   * no explicit file deletion is needed.\n   */\n}\n\n\n/*\n * Initial opening of a backing-store object.\n *\n * This version uses tmpfile(), which constructs a suitable file name\n * behind the scenes.  We don't have to use info->temp_name[] at all;\n * indeed, we can't even find out the actual name of the temp file.\n */\n\nGLOBAL(void)\njpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t\t long total_bytes_needed)\n{\n  if ((info->temp_file = tmpfile()) == NULL)\n    ERREXITS(cinfo, JERR_TFILE_CREATE, \"\");\n  info->read_backing_store = read_backing_store;\n  info->write_backing_store = write_backing_store;\n  info->close_backing_store = close_backing_store;\n}\n\n\n/*\n * These routines take care of any system-dependent initialization and\n * cleanup required.\n */\n\nGLOBAL(long)\njpeg_mem_init (j_common_ptr cinfo)\n{\n  return DEFAULT_MAX_MEM;\t/* default for max_memory_to_use */\n}\n\nGLOBAL(void)\njpeg_mem_term (j_common_ptr cinfo)\n{\n  /* no work */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jmemdos.c",
    "content": "/*\n * jmemdos.c\n *\n * Copyright (C) 1992-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file provides an MS-DOS-compatible implementation of the system-\n * dependent portion of the JPEG memory manager.  Temporary data can be\n * stored in extended or expanded memory as well as in regular DOS files.\n *\n * If you use this file, you must be sure that NEED_FAR_POINTERS is defined\n * if you compile in a small-data memory model; it should NOT be defined if\n * you use a large-data memory model.  This file is not recommended if you\n * are using a flat-memory-space 386 environment such as DJGCC or Watcom C.\n * Also, this code will NOT work if struct fields are aligned on greater than\n * 2-byte boundaries.\n *\n * Based on code contributed by Ge' Weijers.\n */\n\n/*\n * If you have both extended and expanded memory, you may want to change the\n * order in which they are tried in jopen_backing_store.  On a 286 machine\n * expanded memory is usually faster, since extended memory access involves\n * an expensive protected-mode-and-back switch.  On 386 and better, extended\n * memory is usually faster.  As distributed, the code tries extended memory\n * first (what? not everyone has a 386? :-).\n *\n * You can disable use of extended/expanded memory entirely by altering these\n * definitions or overriding them from the Makefile (eg, -DEMS_SUPPORTED=0).\n */\n\n#ifndef XMS_SUPPORTED\n#define XMS_SUPPORTED  1\n#endif\n#ifndef EMS_SUPPORTED\n#define EMS_SUPPORTED  1\n#endif\n\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jmemsys.h\"\t\t/* import the system-dependent declarations */\n\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare these */\nextern void * malloc JPP((size_t size));\nextern void free JPP((void *ptr));\nextern char * getenv JPP((const char * name));\n#endif\n\n#ifdef NEED_FAR_POINTERS\n\n#ifdef __TURBOC__\n/* These definitions work for Borland C (Turbo C) */\n#include <alloc.h>\t\t/* need farmalloc(), farfree() */\n#define far_malloc(x)\tfarmalloc(x)\n#define far_free(x)\tfarfree(x)\n#else\n/* These definitions work for Microsoft C and compatible compilers */\n#include <malloc.h>\t\t/* need _fmalloc(), _ffree() */\n#define far_malloc(x)\t_fmalloc(x)\n#define far_free(x)\t_ffree(x)\n#endif\n\n#else /* not NEED_FAR_POINTERS */\n\n#define far_malloc(x)\tmalloc(x)\n#define far_free(x)\tfree(x)\n\n#endif /* NEED_FAR_POINTERS */\n\n#ifdef DONT_USE_B_MODE\t\t/* define mode parameters for fopen() */\n#define READ_BINARY\t\"r\"\n#else\n#define READ_BINARY\t\"rb\"\n#endif\n\n#ifndef USE_MSDOS_MEMMGR\t/* make sure user got configuration right */\n  You forgot to define USE_MSDOS_MEMMGR in jconfig.h. /* deliberate syntax error */\n#endif\n\n#if MAX_ALLOC_CHUNK >= 65535L\t/* make sure jconfig.h got this right */\n  MAX_ALLOC_CHUNK should be less than 64K. /* deliberate syntax error */\n#endif\n\n\n/*\n * Declarations for assembly-language support routines (see jmemdosa.asm).\n *\n * The functions are declared \"far\" as are all their pointer arguments;\n * this ensures the assembly source code will work regardless of the\n * compiler memory model.  We assume \"short\" is 16 bits, \"long\" is 32.\n */\n\ntypedef void far * XMSDRIVER;\t/* actually a pointer to code */\ntypedef struct {\t\t/* registers for calling XMS driver */\n\tunsigned short ax, dx, bx;\n\tvoid far * ds_si;\n      } XMScontext;\ntypedef struct {\t\t/* registers for calling EMS driver */\n\tunsigned short ax, dx, bx;\n\tvoid far * ds_si;\n      } EMScontext;\n\nextern short far jdos_open JPP((short far * handle, char far * filename));\nextern short far jdos_close JPP((short handle));\nextern short far jdos_seek JPP((short handle, long offset));\nextern short far jdos_read JPP((short handle, void far * buffer,\n\t\t\t\tunsigned short count));\nextern short far jdos_write JPP((short handle, void far * buffer,\n\t\t\t\t unsigned short count));\nextern void far jxms_getdriver JPP((XMSDRIVER far *));\nextern void far jxms_calldriver JPP((XMSDRIVER, XMScontext far *));\nextern short far jems_available JPP((void));\nextern void far jems_calldriver JPP((EMScontext far *));\n\n\n/*\n * Selection of a file name for a temporary file.\n * This is highly system-dependent, and you may want to customize it.\n */\n\nstatic int next_file_num;\t/* to distinguish among several temp files */\n\nLOCAL(void)\nselect_file_name (char * fname)\n{\n  const char * env;\n  char * ptr;\n  FILE * tfile;\n\n  /* Keep generating file names till we find one that's not in use */\n  for (;;) {\n    /* Get temp directory name from environment TMP or TEMP variable;\n     * if none, use \".\"\n     */\n    if ((env = (const char *) getenv(\"TMP\")) == NULL)\n      if ((env = (const char *) getenv(\"TEMP\")) == NULL)\n\tenv = \".\";\n    if (*env == '\\0')\t\t/* null string means \".\" */\n      env = \".\";\n    ptr = fname;\t\t/* copy name to fname */\n    while (*env != '\\0')\n      *ptr++ = *env++;\n    if (ptr[-1] != '\\\\' && ptr[-1] != '/')\n      *ptr++ = '\\\\';\t\t/* append backslash if not in env variable */\n    /* Append a suitable file name */\n    next_file_num++;\t\t/* advance counter */\n    sprintf(ptr, \"JPG%03d.TMP\", next_file_num);\n    /* Probe to see if file name is already in use */\n    if ((tfile = fopen(fname, READ_BINARY)) == NULL)\n      break;\n    fclose(tfile);\t\t/* oops, it's there; close tfile & try again */\n  }\n}\n\n\n/*\n * Near-memory allocation and freeing are controlled by the regular library\n * routines malloc() and free().\n */\n\nGLOBAL(void *)\njpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void *) malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)\n{\n  free(object);\n}\n\n\n/*\n * \"Large\" objects are allocated in far memory, if possible\n */\n\nGLOBAL(void FAR *)\njpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void FAR *) far_malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)\n{\n  far_free(object);\n}\n\n\n/*\n * This routine computes the total memory space available for allocation.\n * It's impossible to do this in a portable way; our current solution is\n * to make the user tell us (with a default value set at compile time).\n * If you can actually get the available space, it's a good idea to subtract\n * a slop factor of 5% or so.\n */\n\n#ifndef DEFAULT_MAX_MEM\t\t/* so can override from makefile */\n#define DEFAULT_MAX_MEM\t\t300000L /* for total usage about 450K */\n#endif\n\nGLOBAL(long)\njpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,\n\t\t    long max_bytes_needed, long already_allocated)\n{\n  return cinfo->mem->max_memory_to_use - already_allocated;\n}\n\n\n/*\n * Backing store (temporary file) management.\n * Backing store objects are only used when the value returned by\n * jpeg_mem_available is less than the total space needed.  You can dispense\n * with these routines if you have plenty of virtual memory; see jmemnobs.c.\n */\n\n/*\n * For MS-DOS we support three types of backing storage:\n *   1. Conventional DOS files.  We access these by direct DOS calls rather\n *      than via the stdio package.  This provides a bit better performance,\n *      but the real reason is that the buffers to be read or written are FAR.\n *      The stdio library for small-data memory models can't cope with that.\n *   2. Extended memory, accessed per the XMS V2.0 specification.\n *   3. Expanded memory, accessed per the LIM/EMS 4.0 specification.\n * You'll need copies of those specs to make sense of the related code.\n * The specs are available by Internet FTP from the SIMTEL archives \n * (oak.oakland.edu and its various mirror sites).  See files\n * pub/msdos/microsoft/xms20.arc and pub/msdos/info/limems41.zip.\n */\n\n\n/*\n * Access methods for a DOS file.\n */\n\n\nMETHODDEF(void)\nread_file_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t void FAR * buffer_address,\n\t\t long file_offset, long byte_count)\n{\n  if (jdos_seek(info->handle.file_handle, file_offset))\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n  /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */\n  if (byte_count > 65535L)\t/* safety check */\n    ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);\n  if (jdos_read(info->handle.file_handle, buffer_address,\n\t\t(unsigned short) byte_count))\n    ERREXIT(cinfo, JERR_TFILE_READ);\n}\n\n\nMETHODDEF(void)\nwrite_file_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t  void FAR * buffer_address,\n\t\t  long file_offset, long byte_count)\n{\n  if (jdos_seek(info->handle.file_handle, file_offset))\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n  /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */\n  if (byte_count > 65535L)\t/* safety check */\n    ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);\n  if (jdos_write(info->handle.file_handle, buffer_address,\n\t\t (unsigned short) byte_count))\n    ERREXIT(cinfo, JERR_TFILE_WRITE);\n}\n\n\nMETHODDEF(void)\nclose_file_store (j_common_ptr cinfo, backing_store_ptr info)\n{\n  jdos_close(info->handle.file_handle);\t/* close the file */\n  remove(info->temp_name);\t/* delete the file */\n/* If your system doesn't have remove(), try unlink() instead.\n * remove() is the ANSI-standard name for this function, but\n * unlink() was more common in pre-ANSI systems.\n */\n  TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name);\n}\n\n\nLOCAL(boolean)\nopen_file_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t long total_bytes_needed)\n{\n  short handle;\n\n  select_file_name(info->temp_name);\n  if (jdos_open((short far *) & handle, (char far *) info->temp_name)) {\n    /* might as well exit since jpeg_open_backing_store will fail anyway */\n    ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name);\n    return FALSE;\n  }\n  info->handle.file_handle = handle;\n  info->read_backing_store = read_file_store;\n  info->write_backing_store = write_file_store;\n  info->close_backing_store = close_file_store;\n  TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name);\n  return TRUE;\t\t\t/* succeeded */\n}\n\n\n/*\n * Access methods for extended memory.\n */\n\n#if XMS_SUPPORTED\n\nstatic XMSDRIVER xms_driver;\t/* saved address of XMS driver */\n\ntypedef union {\t\t\t/* either long offset or real-mode pointer */\n\tlong offset;\n\tvoid far * ptr;\n      } XMSPTR;\n\ntypedef struct {\t\t/* XMS move specification structure */\n\tlong length;\n\tXMSH src_handle;\n\tXMSPTR src;\n\tXMSH dst_handle;\n\tXMSPTR dst;\n      } XMSspec;\n\n#define ODD(X)\t(((X) & 1L) != 0)\n\n\nMETHODDEF(void)\nread_xms_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\tvoid FAR * buffer_address,\n\t\tlong file_offset, long byte_count)\n{\n  XMScontext ctx;\n  XMSspec spec;\n  char endbuffer[2];\n\n  /* The XMS driver can't cope with an odd length, so handle the last byte\n   * specially if byte_count is odd.  We don't expect this to be common.\n   */\n\n  spec.length = byte_count & (~ 1L);\n  spec.src_handle = info->handle.xms_handle;\n  spec.src.offset = file_offset;\n  spec.dst_handle = 0;\n  spec.dst.ptr = buffer_address;\n  \n  ctx.ds_si = (void far *) & spec;\n  ctx.ax = 0x0b00;\t\t/* EMB move */\n  jxms_calldriver(xms_driver, (XMScontext far *) & ctx);\n  if (ctx.ax != 1)\n    ERREXIT(cinfo, JERR_XMS_READ);\n\n  if (ODD(byte_count)) {\n    read_xms_store(cinfo, info, (void FAR *) endbuffer,\n\t\t   file_offset + byte_count - 1L, 2L);\n    ((char FAR *) buffer_address)[byte_count - 1L] = endbuffer[0];\n  }\n}\n\n\nMETHODDEF(void)\nwrite_xms_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t void FAR * buffer_address,\n\t\t long file_offset, long byte_count)\n{\n  XMScontext ctx;\n  XMSspec spec;\n  char endbuffer[2];\n\n  /* The XMS driver can't cope with an odd length, so handle the last byte\n   * specially if byte_count is odd.  We don't expect this to be common.\n   */\n\n  spec.length = byte_count & (~ 1L);\n  spec.src_handle = 0;\n  spec.src.ptr = buffer_address;\n  spec.dst_handle = info->handle.xms_handle;\n  spec.dst.offset = file_offset;\n\n  ctx.ds_si = (void far *) & spec;\n  ctx.ax = 0x0b00;\t\t/* EMB move */\n  jxms_calldriver(xms_driver, (XMScontext far *) & ctx);\n  if (ctx.ax != 1)\n    ERREXIT(cinfo, JERR_XMS_WRITE);\n\n  if (ODD(byte_count)) {\n    read_xms_store(cinfo, info, (void FAR *) endbuffer,\n\t\t   file_offset + byte_count - 1L, 2L);\n    endbuffer[0] = ((char FAR *) buffer_address)[byte_count - 1L];\n    write_xms_store(cinfo, info, (void FAR *) endbuffer,\n\t\t    file_offset + byte_count - 1L, 2L);\n  }\n}\n\n\nMETHODDEF(void)\nclose_xms_store (j_common_ptr cinfo, backing_store_ptr info)\n{\n  XMScontext ctx;\n\n  ctx.dx = info->handle.xms_handle;\n  ctx.ax = 0x0a00;\n  jxms_calldriver(xms_driver, (XMScontext far *) & ctx);\n  TRACEMS1(cinfo, 1, JTRC_XMS_CLOSE, info->handle.xms_handle);\n  /* we ignore any error return from the driver */\n}\n\n\nLOCAL(boolean)\nopen_xms_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\tlong total_bytes_needed)\n{\n  XMScontext ctx;\n\n  /* Get address of XMS driver */\n  jxms_getdriver((XMSDRIVER far *) & xms_driver);\n  if (xms_driver == NULL)\n    return FALSE;\t\t/* no driver to be had */\n\n  /* Get version number, must be >= 2.00 */\n  ctx.ax = 0x0000;\n  jxms_calldriver(xms_driver, (XMScontext far *) & ctx);\n  if (ctx.ax < (unsigned short) 0x0200)\n    return FALSE;\n\n  /* Try to get space (expressed in kilobytes) */\n  ctx.dx = (unsigned short) ((total_bytes_needed + 1023L) >> 10);\n  ctx.ax = 0x0900;\n  jxms_calldriver(xms_driver, (XMScontext far *) & ctx);\n  if (ctx.ax != 1)\n    return FALSE;\n\n  /* Succeeded, save the handle and away we go */\n  info->handle.xms_handle = ctx.dx;\n  info->read_backing_store = read_xms_store;\n  info->write_backing_store = write_xms_store;\n  info->close_backing_store = close_xms_store;\n  TRACEMS1(cinfo, 1, JTRC_XMS_OPEN, ctx.dx);\n  return TRUE;\t\t\t/* succeeded */\n}\n\n#endif /* XMS_SUPPORTED */\n\n\n/*\n * Access methods for expanded memory.\n */\n\n#if EMS_SUPPORTED\n\n/* The EMS move specification structure requires word and long fields aligned\n * at odd byte boundaries.  Some compilers will align struct fields at even\n * byte boundaries.  While it's usually possible to force byte alignment,\n * that causes an overall performance penalty and may pose problems in merging\n * JPEG into a larger application.  Instead we accept some rather dirty code\n * here.  Note this code would fail if the hardware did not allow odd-byte\n * word & long accesses, but all 80x86 CPUs do.\n */\n\ntypedef void far * EMSPTR;\n\ntypedef union {\t\t\t/* EMS move specification structure */\n\tlong length;\t\t/* It's easy to access first 4 bytes */\n\tchar bytes[18];\t\t/* Misaligned fields in here! */\n      } EMSspec;\n\n/* Macros for accessing misaligned fields */\n#define FIELD_AT(spec,offset,type)  (*((type *) &(spec.bytes[offset])))\n#define SRC_TYPE(spec)\t\tFIELD_AT(spec,4,char)\n#define SRC_HANDLE(spec)\tFIELD_AT(spec,5,EMSH)\n#define SRC_OFFSET(spec)\tFIELD_AT(spec,7,unsigned short)\n#define SRC_PAGE(spec)\t\tFIELD_AT(spec,9,unsigned short)\n#define SRC_PTR(spec)\t\tFIELD_AT(spec,7,EMSPTR)\n#define DST_TYPE(spec)\t\tFIELD_AT(spec,11,char)\n#define DST_HANDLE(spec)\tFIELD_AT(spec,12,EMSH)\n#define DST_OFFSET(spec)\tFIELD_AT(spec,14,unsigned short)\n#define DST_PAGE(spec)\t\tFIELD_AT(spec,16,unsigned short)\n#define DST_PTR(spec)\t\tFIELD_AT(spec,14,EMSPTR)\n\n#define EMSPAGESIZE\t16384L\t/* gospel, see the EMS specs */\n\n#define HIBYTE(W)  (((W) >> 8) & 0xFF)\n#define LOBYTE(W)  ((W) & 0xFF)\n\n\nMETHODDEF(void)\nread_ems_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\tvoid FAR * buffer_address,\n\t\tlong file_offset, long byte_count)\n{\n  EMScontext ctx;\n  EMSspec spec;\n\n  spec.length = byte_count;\n  SRC_TYPE(spec) = 1;\n  SRC_HANDLE(spec) = info->handle.ems_handle;\n  SRC_PAGE(spec)   = (unsigned short) (file_offset / EMSPAGESIZE);\n  SRC_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE);\n  DST_TYPE(spec) = 0;\n  DST_HANDLE(spec) = 0;\n  DST_PTR(spec)    = buffer_address;\n  \n  ctx.ds_si = (void far *) & spec;\n  ctx.ax = 0x5700;\t\t/* move memory region */\n  jems_calldriver((EMScontext far *) & ctx);\n  if (HIBYTE(ctx.ax) != 0)\n    ERREXIT(cinfo, JERR_EMS_READ);\n}\n\n\nMETHODDEF(void)\nwrite_ems_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t void FAR * buffer_address,\n\t\t long file_offset, long byte_count)\n{\n  EMScontext ctx;\n  EMSspec spec;\n\n  spec.length = byte_count;\n  SRC_TYPE(spec) = 0;\n  SRC_HANDLE(spec) = 0;\n  SRC_PTR(spec)    = buffer_address;\n  DST_TYPE(spec) = 1;\n  DST_HANDLE(spec) = info->handle.ems_handle;\n  DST_PAGE(spec)   = (unsigned short) (file_offset / EMSPAGESIZE);\n  DST_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE);\n  \n  ctx.ds_si = (void far *) & spec;\n  ctx.ax = 0x5700;\t\t/* move memory region */\n  jems_calldriver((EMScontext far *) & ctx);\n  if (HIBYTE(ctx.ax) != 0)\n    ERREXIT(cinfo, JERR_EMS_WRITE);\n}\n\n\nMETHODDEF(void)\nclose_ems_store (j_common_ptr cinfo, backing_store_ptr info)\n{\n  EMScontext ctx;\n\n  ctx.ax = 0x4500;\n  ctx.dx = info->handle.ems_handle;\n  jems_calldriver((EMScontext far *) & ctx);\n  TRACEMS1(cinfo, 1, JTRC_EMS_CLOSE, info->handle.ems_handle);\n  /* we ignore any error return from the driver */\n}\n\n\nLOCAL(boolean)\nopen_ems_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\tlong total_bytes_needed)\n{\n  EMScontext ctx;\n\n  /* Is EMS driver there? */\n  if (! jems_available())\n    return FALSE;\n\n  /* Get status, make sure EMS is OK */\n  ctx.ax = 0x4000;\n  jems_calldriver((EMScontext far *) & ctx);\n  if (HIBYTE(ctx.ax) != 0)\n    return FALSE;\n\n  /* Get version, must be >= 4.0 */\n  ctx.ax = 0x4600;\n  jems_calldriver((EMScontext far *) & ctx);\n  if (HIBYTE(ctx.ax) != 0 || LOBYTE(ctx.ax) < 0x40)\n    return FALSE;\n\n  /* Try to allocate requested space */\n  ctx.ax = 0x4300;\n  ctx.bx = (unsigned short) ((total_bytes_needed + EMSPAGESIZE-1L) / EMSPAGESIZE);\n  jems_calldriver((EMScontext far *) & ctx);\n  if (HIBYTE(ctx.ax) != 0)\n    return FALSE;\n\n  /* Succeeded, save the handle and away we go */\n  info->handle.ems_handle = ctx.dx;\n  info->read_backing_store = read_ems_store;\n  info->write_backing_store = write_ems_store;\n  info->close_backing_store = close_ems_store;\n  TRACEMS1(cinfo, 1, JTRC_EMS_OPEN, ctx.dx);\n  return TRUE;\t\t\t/* succeeded */\n}\n\n#endif /* EMS_SUPPORTED */\n\n\n/*\n * Initial opening of a backing-store object.\n */\n\nGLOBAL(void)\njpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t\t long total_bytes_needed)\n{\n  /* Try extended memory, then expanded memory, then regular file. */\n#if XMS_SUPPORTED\n  if (open_xms_store(cinfo, info, total_bytes_needed))\n    return;\n#endif\n#if EMS_SUPPORTED\n  if (open_ems_store(cinfo, info, total_bytes_needed))\n    return;\n#endif\n  if (open_file_store(cinfo, info, total_bytes_needed))\n    return;\n  ERREXITS(cinfo, JERR_TFILE_CREATE, \"\");\n}\n\n\n/*\n * These routines take care of any system-dependent initialization and\n * cleanup required.\n */\n\nGLOBAL(long)\njpeg_mem_init (j_common_ptr cinfo)\n{\n  next_file_num = 0;\t\t/* initialize temp file name generator */\n  return DEFAULT_MAX_MEM;\t/* default for max_memory_to_use */\n}\n\nGLOBAL(void)\njpeg_mem_term (j_common_ptr cinfo)\n{\n  /* Microsoft C, at least in v6.00A, will not successfully reclaim freed\n   * blocks of size > 32Kbytes unless we give it a kick in the rear, like so:\n   */\n#ifdef NEED_FHEAPMIN\n  _fheapmin();\n#endif\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jmemmac.c",
    "content": "/*\n * jmemmac.c\n *\n * Copyright (C) 1992-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * jmemmac.c provides an Apple Macintosh implementation of the system-\n * dependent portion of the JPEG memory manager.\n *\n * If you use jmemmac.c, then you must define USE_MAC_MEMMGR in the\n * JPEG_INTERNALS part of jconfig.h.\n *\n * jmemmac.c uses the Macintosh toolbox routines NewPtr and DisposePtr\n * instead of malloc and free.  It accurately determines the amount of\n * memory available by using CompactMem.  Notice that if left to its\n * own devices, this code can chew up all available space in the\n * application's zone, with the exception of the rather small \"slop\"\n * factor computed in jpeg_mem_available().  The application can ensure\n * that more space is left over by reducing max_memory_to_use.\n *\n * Large images are swapped to disk using temporary files and System 7.0+'s\n * temporary folder functionality.\n *\n * Note that jmemmac.c depends on two features of MacOS that were first\n * introduced in System 7: FindFolder and the FSSpec-based calls.\n * If your application uses jmemmac.c and is run under System 6 or earlier,\n * and the jpeg library decides it needs a temporary file, it will abort,\n * printing error messages about requiring System 7.  (If no temporary files\n * are created, it will run fine.)\n *\n * If you want to use jmemmac.c in an application that might be used with\n * System 6 or earlier, then you should remove dependencies on FindFolder\n * and the FSSpec calls.  You will need to replace FindFolder with some\n * other mechanism for finding a place to put temporary files, and you\n * should replace the FSSpec calls with their HFS equivalents:\n *\n *     FSpDelete     ->  HDelete\n *     FSpGetFInfo   ->  HGetFInfo\n *     FSpCreate     ->  HCreate\n *     FSpOpenDF     ->  HOpen      *** Note: not HOpenDF ***\n *     FSMakeFSSpec  ->  (fill in spec by hand.)\n *\n * (Use HOpen instead of HOpenDF.  HOpen is just a glue-interface to PBHOpen,\n * which is on all HFS macs.  HOpenDF is a System 7 addition which avoids the\n * ages-old problem of names starting with a period.)\n *\n * Contributed by Sam Bushell (jsam@iagu.on.net) and\n * Dan Gildor (gyld@in-touch.com).\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jmemsys.h\"    /* import the system-dependent declarations */\n\n#ifndef USE_MAC_MEMMGR\t/* make sure user got configuration right */\n  You forgot to define USE_MAC_MEMMGR in jconfig.h. /* deliberate syntax error */\n#endif\n\n#include <Memory.h>     /* we use the MacOS memory manager */\n#include <Files.h>      /* we use the MacOS File stuff */\n#include <Folders.h>    /* we use the MacOS HFS stuff */\n#include <Script.h>     /* for smSystemScript */\n#include <Gestalt.h>    /* we use Gestalt to test for specific functionality */\n\n#ifndef TEMP_FILE_NAME\t\t/* can override from jconfig.h or Makefile */\n#define TEMP_FILE_NAME  \"JPG%03d.TMP\"\n#endif\n\nstatic int next_file_num;\t/* to distinguish among several temp files */\n\n\n/*\n * Memory allocation and freeing are controlled by the MacOS library\n * routines NewPtr() and DisposePtr(), which allocate fixed-address\n * storage.  Unfortunately, the IJG library isn't smart enough to cope\n * with relocatable storage.\n */\n\nGLOBAL(void *)\njpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void *) NewPtr(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)\n{\n  DisposePtr((Ptr) object);\n}\n\n\n/*\n * \"Large\" objects are treated the same as \"small\" ones.\n * NB: we include FAR keywords in the routine declarations simply for\n * consistency with the rest of the IJG code; FAR should expand to empty\n * on rational architectures like the Mac.\n */\n\nGLOBAL(void FAR *)\njpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void FAR *) NewPtr(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)\n{\n  DisposePtr((Ptr) object);\n}\n\n\n/*\n * This routine computes the total memory space available for allocation.\n */\n\nGLOBAL(long)\njpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,\n\t\t    long max_bytes_needed, long already_allocated)\n{\n  long limit = cinfo->mem->max_memory_to_use - already_allocated;\n  long slop, mem;\n\n  /* Don't ask for more than what application has told us we may use */\n  if (max_bytes_needed > limit && limit > 0)\n    max_bytes_needed = limit;\n  /* Find whether there's a big enough free block in the heap.\n   * CompactMem tries to create a contiguous block of the requested size,\n   * and then returns the size of the largest free block (which could be\n   * much more or much less than we asked for).\n   * We add some slop to ensure we don't use up all available memory.\n   */\n  slop = max_bytes_needed / 16 + 32768L;\n  mem = CompactMem(max_bytes_needed + slop) - slop;\n  if (mem < 0)\n    mem = 0;\t\t\t/* sigh, couldn't even get the slop */\n  /* Don't take more than the application says we can have */\n  if (mem > limit && limit > 0)\n    mem = limit;\n  return mem;\n}\n\n\n/*\n * Backing store (temporary file) management.\n * Backing store objects are only used when the value returned by\n * jpeg_mem_available is less than the total space needed.  You can dispense\n * with these routines if you have plenty of virtual memory; see jmemnobs.c.\n */\n\n\nMETHODDEF(void)\nread_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t    void FAR * buffer_address,\n\t\t    long file_offset, long byte_count)\n{\n  long bytes = byte_count;\n  long retVal;\n\n  if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr )\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n\n  retVal = FSRead ( info->temp_file, &bytes,\n\t\t    (unsigned char *) buffer_address );\n  if ( retVal != noErr || bytes != byte_count )\n    ERREXIT(cinfo, JERR_TFILE_READ);\n}\n\n\nMETHODDEF(void)\nwrite_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t     void FAR * buffer_address,\n\t\t     long file_offset, long byte_count)\n{\n  long bytes = byte_count;\n  long retVal;\n\n  if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr )\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n\n  retVal = FSWrite ( info->temp_file, &bytes,\n\t\t     (unsigned char *) buffer_address );\n  if ( retVal != noErr || bytes != byte_count )\n    ERREXIT(cinfo, JERR_TFILE_WRITE);\n}\n\n\nMETHODDEF(void)\nclose_backing_store (j_common_ptr cinfo, backing_store_ptr info)\n{\n  FSClose ( info->temp_file );\n  FSpDelete ( &(info->tempSpec) );\n}\n\n\n/*\n * Initial opening of a backing-store object.\n *\n * This version uses FindFolder to find the Temporary Items folder,\n * and puts the temporary file in there.\n */\n\nGLOBAL(void)\njpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t\t long total_bytes_needed)\n{\n  short         tmpRef, vRefNum;\n  long          dirID;\n  FInfo         finderInfo;\n  FSSpec        theSpec;\n  Str255        fName;\n  OSErr         osErr;\n  long          gestaltResponse = 0;\n\n  /* Check that FSSpec calls are available. */\n  osErr = Gestalt( gestaltFSAttr, &gestaltResponse );\n  if ( ( osErr != noErr )\n       || !( gestaltResponse & (1<<gestaltHasFSSpecCalls) ) )\n    ERREXITS(cinfo, JERR_TFILE_CREATE, \"- System 7.0 or later required\");\n  /* TO DO: add a proper error message to jerror.h. */\n\n  /* Check that FindFolder is available. */\n  osErr = Gestalt( gestaltFindFolderAttr, &gestaltResponse );\n  if ( ( osErr != noErr )\n       || !( gestaltResponse & (1<<gestaltFindFolderPresent) ) )\n    ERREXITS(cinfo, JERR_TFILE_CREATE, \"- System 7.0 or later required.\");\n  /* TO DO: add a proper error message to jerror.h. */\n\n  osErr = FindFolder ( kOnSystemDisk, kTemporaryFolderType, kCreateFolder,\n                       &vRefNum, &dirID );\n  if ( osErr != noErr )\n    ERREXITS(cinfo, JERR_TFILE_CREATE, \"- temporary items folder unavailable\");\n  /* TO DO: Try putting the temp files somewhere else. */\n\n  /* Keep generating file names till we find one that's not in use */\n  for (;;) {\n    next_file_num++;\t\t/* advance counter */\n\n    sprintf(info->temp_name, TEMP_FILE_NAME, next_file_num);\n    strcpy ( (Ptr)fName+1, info->temp_name );\n    *fName = strlen (info->temp_name);\n    osErr = FSMakeFSSpec ( vRefNum, dirID, fName, &theSpec );\n\n    if ( (osErr = FSpGetFInfo ( &theSpec, &finderInfo ) ) != noErr )\n      break;\n  }\n\n  osErr = FSpCreate ( &theSpec, '????', '????', smSystemScript );\n  if ( osErr != noErr )\n    ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name);\n\n  osErr = FSpOpenDF ( &theSpec, fsRdWrPerm, &(info->temp_file) );\n  if ( osErr != noErr )\n    ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name);\n\n  info->tempSpec = theSpec;\n\n  info->read_backing_store = read_backing_store;\n  info->write_backing_store = write_backing_store;\n  info->close_backing_store = close_backing_store;\n  TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name);\n}\n\n\n/*\n * These routines take care of any system-dependent initialization and\n * cleanup required.\n */\n\nGLOBAL(long)\njpeg_mem_init (j_common_ptr cinfo)\n{\n  next_file_num = 0;\n\n  /* max_memory_to_use will be initialized to FreeMem()'s result;\n   * the calling application might later reduce it, for example\n   * to leave room to invoke multiple JPEG objects.\n   * Note that FreeMem returns the total number of free bytes;\n   * it may not be possible to allocate a single block of this size.\n   */\n  return FreeMem();\n}\n\nGLOBAL(void)\njpeg_mem_term (j_common_ptr cinfo)\n{\n  /* no work */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jmemmgr.c",
    "content": "/*\n * jmemmgr.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 2011-2012 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains the JPEG system-independent memory management\n * routines.  This code is usable across a wide variety of machines; most\n * of the system dependencies have been isolated in a separate file.\n * The major functions provided here are:\n *   * pool-based allocation and freeing of memory;\n *   * policy decisions about how to divide available memory among the\n *     virtual arrays;\n *   * control logic for swapping virtual arrays between main memory and\n *     backing storage.\n * The separate system-dependent file provides the actual backing-storage\n * access code, and it contains the policy decision about how much total\n * main memory to use.\n * This file is system-dependent in the sense that some of its functions\n * are unnecessary in some systems.  For example, if there is enough virtual\n * memory so that backing storage will never be used, much of the virtual\n * array control logic could be removed.  (Of course, if you have that much\n * memory then you shouldn't care about a little bit of unused code...)\n */\n\n#define JPEG_INTERNALS\n#define AM_MEMORY_MANAGER\t/* we define jvirt_Xarray_control structs */\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jmemsys.h\"\t\t/* import the system-dependent declarations */\n\n#ifndef NO_GETENV\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare getenv() */\nextern char * getenv JPP((const char * name));\n#endif\n#endif\n\n\n/*\n * Some important notes:\n *   The allocation routines provided here must never return NULL.\n *   They should exit to error_exit if unsuccessful.\n *\n *   It's not a good idea to try to merge the sarray and barray routines,\n *   even though they are textually almost the same, because samples are\n *   usually stored as bytes while coefficients are shorts or ints.  Thus,\n *   in machines where byte pointers have a different representation from\n *   word pointers, the resulting machine code could not be the same.\n */\n\n\n/*\n * Many machines require storage alignment: longs must start on 4-byte\n * boundaries, doubles on 8-byte boundaries, etc.  On such machines, malloc()\n * always returns pointers that are multiples of the worst-case alignment\n * requirement, and we had better do so too.\n * There isn't any really portable way to determine the worst-case alignment\n * requirement.  This module assumes that the alignment requirement is\n * multiples of sizeof(ALIGN_TYPE).\n * By default, we define ALIGN_TYPE as double.  This is necessary on some\n * workstations (where doubles really do need 8-byte alignment) and will work\n * fine on nearly everything.  If your machine has lesser alignment needs,\n * you can save a few bytes by making ALIGN_TYPE smaller.\n * The only place I know of where this will NOT work is certain Macintosh\n * 680x0 compilers that define double as a 10-byte IEEE extended float.\n * Doing 10-byte alignment is counterproductive because longwords won't be\n * aligned well.  Put \"#define ALIGN_TYPE long\" in jconfig.h if you have\n * such a compiler.\n */\n\n#ifndef ALIGN_TYPE\t\t/* so can override from jconfig.h */\n#define ALIGN_TYPE  double\n#endif\n\n\n/*\n * We allocate objects from \"pools\", where each pool is gotten with a single\n * request to jpeg_get_small() or jpeg_get_large().  There is no per-object\n * overhead within a pool, except for alignment padding.  Each pool has a\n * header with a link to the next pool of the same class.\n * Small and large pool headers are identical except that the latter's\n * link pointer must be FAR on 80x86 machines.\n * Notice that the \"real\" header fields are union'ed with a dummy ALIGN_TYPE\n * field.  This forces the compiler to make SIZEOF(small_pool_hdr) a multiple\n * of the alignment requirement of ALIGN_TYPE.\n */\n\ntypedef union small_pool_struct * small_pool_ptr;\n\ntypedef union small_pool_struct {\n  struct {\n    small_pool_ptr next;\t/* next in list of pools */\n    size_t bytes_used;\t\t/* how many bytes already used within pool */\n    size_t bytes_left;\t\t/* bytes still available in this pool */\n  } hdr;\n  ALIGN_TYPE dummy;\t\t/* included in union to ensure alignment */\n} small_pool_hdr;\n\ntypedef union large_pool_struct FAR * large_pool_ptr;\n\ntypedef union large_pool_struct {\n  struct {\n    large_pool_ptr next;\t/* next in list of pools */\n    size_t bytes_used;\t\t/* how many bytes already used within pool */\n    size_t bytes_left;\t\t/* bytes still available in this pool */\n  } hdr;\n  ALIGN_TYPE dummy;\t\t/* included in union to ensure alignment */\n} large_pool_hdr;\n\n\n/*\n * Here is the full definition of a memory manager object.\n */\n\ntypedef struct {\n  struct jpeg_memory_mgr pub;\t/* public fields */\n\n  /* Each pool identifier (lifetime class) names a linked list of pools. */\n  small_pool_ptr small_list[JPOOL_NUMPOOLS];\n  large_pool_ptr large_list[JPOOL_NUMPOOLS];\n\n  /* Since we only have one lifetime class of virtual arrays, only one\n   * linked list is necessary (for each datatype).  Note that the virtual\n   * array control blocks being linked together are actually stored somewhere\n   * in the small-pool list.\n   */\n  jvirt_sarray_ptr virt_sarray_list;\n  jvirt_barray_ptr virt_barray_list;\n\n  /* This counts total space obtained from jpeg_get_small/large */\n  long total_space_allocated;\n\n  /* alloc_sarray and alloc_barray set this value for use by virtual\n   * array routines.\n   */\n  JDIMENSION last_rowsperchunk;\t/* from most recent alloc_sarray/barray */\n} my_memory_mgr;\n\ntypedef my_memory_mgr * my_mem_ptr;\n\n\n/*\n * The control blocks for virtual arrays.\n * Note that these blocks are allocated in the \"small\" pool area.\n * System-dependent info for the associated backing store (if any) is hidden\n * inside the backing_store_info struct.\n */\n\nstruct jvirt_sarray_control {\n  JSAMPARRAY mem_buffer;\t/* => the in-memory buffer */\n  JDIMENSION rows_in_array;\t/* total virtual array height */\n  JDIMENSION samplesperrow;\t/* width of array (and of memory buffer) */\n  JDIMENSION maxaccess;\t\t/* max rows accessed by access_virt_sarray */\n  JDIMENSION rows_in_mem;\t/* height of memory buffer */\n  JDIMENSION rowsperchunk;\t/* allocation chunk size in mem_buffer */\n  JDIMENSION cur_start_row;\t/* first logical row # in the buffer */\n  JDIMENSION first_undef_row;\t/* row # of first uninitialized row */\n  boolean pre_zero;\t\t/* pre-zero mode requested? */\n  boolean dirty;\t\t/* do current buffer contents need written? */\n  boolean b_s_open;\t\t/* is backing-store data valid? */\n  jvirt_sarray_ptr next;\t/* link to next virtual sarray control block */\n  backing_store_info b_s_info;\t/* System-dependent control info */\n};\n\nstruct jvirt_barray_control {\n  JBLOCKARRAY mem_buffer;\t/* => the in-memory buffer */\n  JDIMENSION rows_in_array;\t/* total virtual array height */\n  JDIMENSION blocksperrow;\t/* width of array (and of memory buffer) */\n  JDIMENSION maxaccess;\t\t/* max rows accessed by access_virt_barray */\n  JDIMENSION rows_in_mem;\t/* height of memory buffer */\n  JDIMENSION rowsperchunk;\t/* allocation chunk size in mem_buffer */\n  JDIMENSION cur_start_row;\t/* first logical row # in the buffer */\n  JDIMENSION first_undef_row;\t/* row # of first uninitialized row */\n  boolean pre_zero;\t\t/* pre-zero mode requested? */\n  boolean dirty;\t\t/* do current buffer contents need written? */\n  boolean b_s_open;\t\t/* is backing-store data valid? */\n  jvirt_barray_ptr next;\t/* link to next virtual barray control block */\n  backing_store_info b_s_info;\t/* System-dependent control info */\n};\n\n\n#ifdef MEM_STATS\t\t/* optional extra stuff for statistics */\n\nLOCAL(void)\nprint_mem_stats (j_common_ptr cinfo, int pool_id)\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  small_pool_ptr shdr_ptr;\n  large_pool_ptr lhdr_ptr;\n\n  /* Since this is only a debugging stub, we can cheat a little by using\n   * fprintf directly rather than going through the trace message code.\n   * This is helpful because message parm array can't handle longs.\n   */\n  fprintf(stderr, \"Freeing pool %d, total space = %ld\\n\",\n\t  pool_id, mem->total_space_allocated);\n\n  for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;\n       lhdr_ptr = lhdr_ptr->hdr.next) {\n    fprintf(stderr, \"  Large chunk used %ld\\n\",\n\t    (long) lhdr_ptr->hdr.bytes_used);\n  }\n\n  for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL;\n       shdr_ptr = shdr_ptr->hdr.next) {\n    fprintf(stderr, \"  Small chunk used %ld free %ld\\n\",\n\t    (long) shdr_ptr->hdr.bytes_used,\n\t    (long) shdr_ptr->hdr.bytes_left);\n  }\n}\n\n#endif /* MEM_STATS */\n\n\nLOCAL(noreturn_t)\nout_of_memory (j_common_ptr cinfo, int which)\n/* Report an out-of-memory error and stop execution */\n/* If we compiled MEM_STATS support, report alloc requests before dying */\n{\n#ifdef MEM_STATS\n  cinfo->err->trace_level = 2;\t/* force self_destruct to report stats */\n#endif\n  ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which);\n}\n\n\n/*\n * Allocation of \"small\" objects.\n *\n * For these, we use pooled storage.  When a new pool must be created,\n * we try to get enough space for the current request plus a \"slop\" factor,\n * where the slop will be the amount of leftover space in the new pool.\n * The speed vs. space tradeoff is largely determined by the slop values.\n * A different slop value is provided for each pool class (lifetime),\n * and we also distinguish the first pool of a class from later ones.\n * NOTE: the values given work fairly well on both 16- and 32-bit-int\n * machines, but may be too small if longs are 64 bits or more.\n */\n\nstatic const size_t first_pool_slop[JPOOL_NUMPOOLS] = \n{\n\t1600,\t\t\t/* first PERMANENT pool */\n\t16000\t\t\t/* first IMAGE pool */\n};\n\nstatic const size_t extra_pool_slop[JPOOL_NUMPOOLS] = \n{\n\t0,\t\t\t/* additional PERMANENT pools */\n\t5000\t\t\t/* additional IMAGE pools */\n};\n\n#define MIN_SLOP  50\t\t/* greater than 0 to avoid futile looping */\n\n\nMETHODDEF(void *)\nalloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)\n/* Allocate a \"small\" object */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  small_pool_ptr hdr_ptr, prev_hdr_ptr;\n  char * data_ptr;\n  size_t odd_bytes, min_request, slop;\n\n  /* Check for unsatisfiable request (do now to ensure no overflow below) */\n  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))\n    out_of_memory(cinfo, 1);\t/* request exceeds malloc's ability */\n\n  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */\n  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);\n  if (odd_bytes > 0)\n    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;\n\n  /* See if space is available in any existing pool */\n  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n  prev_hdr_ptr = NULL;\n  hdr_ptr = mem->small_list[pool_id];\n  while (hdr_ptr != NULL) {\n    if (hdr_ptr->hdr.bytes_left >= sizeofobject)\n      break;\t\t\t/* found pool with enough space */\n    prev_hdr_ptr = hdr_ptr;\n    hdr_ptr = hdr_ptr->hdr.next;\n  }\n\n  /* Time to make a new pool? */\n  if (hdr_ptr == NULL) {\n    /* min_request is what we need now, slop is what will be leftover */\n    min_request = sizeofobject + SIZEOF(small_pool_hdr);\n    if (prev_hdr_ptr == NULL)\t/* first pool in class? */\n      slop = first_pool_slop[pool_id];\n    else\n      slop = extra_pool_slop[pool_id];\n    /* Don't ask for more than MAX_ALLOC_CHUNK */\n    if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))\n      slop = (size_t) (MAX_ALLOC_CHUNK-min_request);\n    /* Try to get space, if fail reduce slop and try again */\n    for (;;) {\n      hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);\n      if (hdr_ptr != NULL)\n\tbreak;\n      slop /= 2;\n      if (slop < MIN_SLOP)\t/* give up when it gets real small */\n\tout_of_memory(cinfo, 2); /* jpeg_get_small failed */\n    }\n    mem->total_space_allocated += min_request + slop;\n    /* Success, initialize the new pool header and add to end of list */\n    hdr_ptr->hdr.next = NULL;\n    hdr_ptr->hdr.bytes_used = 0;\n    hdr_ptr->hdr.bytes_left = sizeofobject + slop;\n    if (prev_hdr_ptr == NULL)\t/* first pool in class? */\n      mem->small_list[pool_id] = hdr_ptr;\n    else\n      prev_hdr_ptr->hdr.next = hdr_ptr;\n  }\n\n  /* OK, allocate the object from the current pool */\n  data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */\n  data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */\n  hdr_ptr->hdr.bytes_used += sizeofobject;\n  hdr_ptr->hdr.bytes_left -= sizeofobject;\n\n  return (void *) data_ptr;\n}\n\n\n/*\n * Allocation of \"large\" objects.\n *\n * The external semantics of these are the same as \"small\" objects,\n * except that FAR pointers are used on 80x86.  However the pool\n * management heuristics are quite different.  We assume that each\n * request is large enough that it may as well be passed directly to\n * jpeg_get_large; the pool management just links everything together\n * so that we can free it all on demand.\n * Note: the major use of \"large\" objects is in JSAMPARRAY and JBLOCKARRAY\n * structures.  The routines that create these structures (see below)\n * deliberately bunch rows together to ensure a large request size.\n */\n\nMETHODDEF(void FAR *)\nalloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)\n/* Allocate a \"large\" object */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  large_pool_ptr hdr_ptr;\n  size_t odd_bytes;\n\n  /* Check for unsatisfiable request (do now to ensure no overflow below) */\n  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))\n    out_of_memory(cinfo, 3);\t/* request exceeds malloc's ability */\n\n  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */\n  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);\n  if (odd_bytes > 0)\n    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;\n\n  /* Always make a new pool */\n  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n\n  hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject +\n\t\t\t\t\t    SIZEOF(large_pool_hdr));\n  if (hdr_ptr == NULL)\n    out_of_memory(cinfo, 4);\t/* jpeg_get_large failed */\n  mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);\n\n  /* Success, initialize the new pool header and add to list */\n  hdr_ptr->hdr.next = mem->large_list[pool_id];\n  /* We maintain space counts in each pool header for statistical purposes,\n   * even though they are not needed for allocation.\n   */\n  hdr_ptr->hdr.bytes_used = sizeofobject;\n  hdr_ptr->hdr.bytes_left = 0;\n  mem->large_list[pool_id] = hdr_ptr;\n\n  return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */\n}\n\n\n/*\n * Creation of 2-D sample arrays.\n * The pointers are in near heap, the samples themselves in FAR heap.\n *\n * To minimize allocation overhead and to allow I/O of large contiguous\n * blocks, we allocate the sample rows in groups of as many rows as possible\n * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request.\n * NB: the virtual array control routines, later in this file, know about\n * this chunking of rows.  The rowsperchunk value is left in the mem manager\n * object so that it can be saved away if this sarray is the workspace for\n * a virtual array.\n */\n\nMETHODDEF(JSAMPARRAY)\nalloc_sarray (j_common_ptr cinfo, int pool_id,\n\t      JDIMENSION samplesperrow, JDIMENSION numrows)\n/* Allocate a 2-D sample array */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  JSAMPARRAY result;\n  JSAMPROW workspace;\n  JDIMENSION rowsperchunk, currow, i;\n  long ltemp;\n\n  /* Calculate max # of rows allowed in one allocation chunk */\n  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /\n\t  ((long) samplesperrow * SIZEOF(JSAMPLE));\n  if (ltemp <= 0)\n    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);\n  if (ltemp < (long) numrows)\n    rowsperchunk = (JDIMENSION) ltemp;\n  else\n    rowsperchunk = numrows;\n  mem->last_rowsperchunk = rowsperchunk;\n\n  /* Get space for row pointers (small object) */\n  result = (JSAMPARRAY) alloc_small(cinfo, pool_id,\n\t\t\t\t    (size_t) (numrows * SIZEOF(JSAMPROW)));\n\n  /* Get the rows themselves (large objects) */\n  currow = 0;\n  while (currow < numrows) {\n    rowsperchunk = MIN(rowsperchunk, numrows - currow);\n    workspace = (JSAMPROW) alloc_large(cinfo, pool_id,\n\t(size_t) ((size_t) rowsperchunk * (size_t) samplesperrow\n\t\t  * SIZEOF(JSAMPLE)));\n    for (i = rowsperchunk; i > 0; i--) {\n      result[currow++] = workspace;\n      workspace += samplesperrow;\n    }\n  }\n\n  return result;\n}\n\n\n/*\n * Creation of 2-D coefficient-block arrays.\n * This is essentially the same as the code for sample arrays, above.\n */\n\nMETHODDEF(JBLOCKARRAY)\nalloc_barray (j_common_ptr cinfo, int pool_id,\n\t      JDIMENSION blocksperrow, JDIMENSION numrows)\n/* Allocate a 2-D coefficient-block array */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  JBLOCKARRAY result;\n  JBLOCKROW workspace;\n  JDIMENSION rowsperchunk, currow, i;\n  long ltemp;\n\n  /* Calculate max # of rows allowed in one allocation chunk */\n  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /\n\t  ((long) blocksperrow * SIZEOF(JBLOCK));\n  if (ltemp <= 0)\n    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);\n  if (ltemp < (long) numrows)\n    rowsperchunk = (JDIMENSION) ltemp;\n  else\n    rowsperchunk = numrows;\n  mem->last_rowsperchunk = rowsperchunk;\n\n  /* Get space for row pointers (small object) */\n  result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,\n\t\t\t\t     (size_t) (numrows * SIZEOF(JBLOCKROW)));\n\n  /* Get the rows themselves (large objects) */\n  currow = 0;\n  while (currow < numrows) {\n    rowsperchunk = MIN(rowsperchunk, numrows - currow);\n    workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,\n\t(size_t) ((size_t) rowsperchunk * (size_t) blocksperrow\n\t\t  * SIZEOF(JBLOCK)));\n    for (i = rowsperchunk; i > 0; i--) {\n      result[currow++] = workspace;\n      workspace += blocksperrow;\n    }\n  }\n\n  return result;\n}\n\n\n/*\n * About virtual array management:\n *\n * The above \"normal\" array routines are only used to allocate strip buffers\n * (as wide as the image, but just a few rows high).  Full-image-sized buffers\n * are handled as \"virtual\" arrays.  The array is still accessed a strip at a\n * time, but the memory manager must save the whole array for repeated\n * accesses.  The intended implementation is that there is a strip buffer in\n * memory (as high as is possible given the desired memory limit), plus a\n * backing file that holds the rest of the array.\n *\n * The request_virt_array routines are told the total size of the image and\n * the maximum number of rows that will be accessed at once.  The in-memory\n * buffer must be at least as large as the maxaccess value.\n *\n * The request routines create control blocks but not the in-memory buffers.\n * That is postponed until realize_virt_arrays is called.  At that time the\n * total amount of space needed is known (approximately, anyway), so free\n * memory can be divided up fairly.\n *\n * The access_virt_array routines are responsible for making a specific strip\n * area accessible (after reading or writing the backing file, if necessary).\n * Note that the access routines are told whether the caller intends to modify\n * the accessed strip; during a read-only pass this saves having to rewrite\n * data to disk.  The access routines are also responsible for pre-zeroing\n * any newly accessed rows, if pre-zeroing was requested.\n *\n * In current usage, the access requests are usually for nonoverlapping\n * strips; that is, successive access start_row numbers differ by exactly\n * num_rows = maxaccess.  This means we can get good performance with simple\n * buffer dump/reload logic, by making the in-memory buffer be a multiple\n * of the access height; then there will never be accesses across bufferload\n * boundaries.  The code will still work with overlapping access requests,\n * but it doesn't handle bufferload overlaps very efficiently.\n */\n\n\nMETHODDEF(jvirt_sarray_ptr)\nrequest_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero,\n\t\t     JDIMENSION samplesperrow, JDIMENSION numrows,\n\t\t     JDIMENSION maxaccess)\n/* Request a virtual 2-D sample array */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  jvirt_sarray_ptr result;\n\n  /* Only IMAGE-lifetime virtual arrays are currently supported */\n  if (pool_id != JPOOL_IMAGE)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n\n  /* get control block */\n  result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id,\n\t\t\t\t\t  SIZEOF(struct jvirt_sarray_control));\n\n  result->mem_buffer = NULL;\t/* marks array not yet realized */\n  result->rows_in_array = numrows;\n  result->samplesperrow = samplesperrow;\n  result->maxaccess = maxaccess;\n  result->pre_zero = pre_zero;\n  result->b_s_open = FALSE;\t/* no associated backing-store object */\n  result->next = mem->virt_sarray_list; /* add to list of virtual arrays */\n  mem->virt_sarray_list = result;\n\n  return result;\n}\n\n\nMETHODDEF(jvirt_barray_ptr)\nrequest_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero,\n\t\t     JDIMENSION blocksperrow, JDIMENSION numrows,\n\t\t     JDIMENSION maxaccess)\n/* Request a virtual 2-D coefficient-block array */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  jvirt_barray_ptr result;\n\n  /* Only IMAGE-lifetime virtual arrays are currently supported */\n  if (pool_id != JPOOL_IMAGE)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n\n  /* get control block */\n  result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id,\n\t\t\t\t\t  SIZEOF(struct jvirt_barray_control));\n\n  result->mem_buffer = NULL;\t/* marks array not yet realized */\n  result->rows_in_array = numrows;\n  result->blocksperrow = blocksperrow;\n  result->maxaccess = maxaccess;\n  result->pre_zero = pre_zero;\n  result->b_s_open = FALSE;\t/* no associated backing-store object */\n  result->next = mem->virt_barray_list; /* add to list of virtual arrays */\n  mem->virt_barray_list = result;\n\n  return result;\n}\n\n\nMETHODDEF(void)\nrealize_virt_arrays (j_common_ptr cinfo)\n/* Allocate the in-memory buffers for any unrealized virtual arrays */\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  long space_per_minheight, maximum_space, avail_mem;\n  long minheights, max_minheights;\n  jvirt_sarray_ptr sptr;\n  jvirt_barray_ptr bptr;\n\n  /* Compute the minimum space needed (maxaccess rows in each buffer)\n   * and the maximum space needed (full image height in each buffer).\n   * These may be of use to the system-dependent jpeg_mem_available routine.\n   */\n  space_per_minheight = 0;\n  maximum_space = 0;\n  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {\n    if (sptr->mem_buffer == NULL) { /* if not realized yet */\n      space_per_minheight += (long) sptr->maxaccess *\n\t\t\t     (long) sptr->samplesperrow * SIZEOF(JSAMPLE);\n      maximum_space += (long) sptr->rows_in_array *\n\t\t       (long) sptr->samplesperrow * SIZEOF(JSAMPLE);\n    }\n  }\n  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {\n    if (bptr->mem_buffer == NULL) { /* if not realized yet */\n      space_per_minheight += (long) bptr->maxaccess *\n\t\t\t     (long) bptr->blocksperrow * SIZEOF(JBLOCK);\n      maximum_space += (long) bptr->rows_in_array *\n\t\t       (long) bptr->blocksperrow * SIZEOF(JBLOCK);\n    }\n  }\n\n  if (space_per_minheight <= 0)\n    return;\t\t\t/* no unrealized arrays, no work */\n\n  /* Determine amount of memory to actually use; this is system-dependent. */\n  avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,\n\t\t\t\t mem->total_space_allocated);\n\n  /* If the maximum space needed is available, make all the buffers full\n   * height; otherwise parcel it out with the same number of minheights\n   * in each buffer.\n   */\n  if (avail_mem >= maximum_space)\n    max_minheights = 1000000000L;\n  else {\n    max_minheights = avail_mem / space_per_minheight;\n    /* If there doesn't seem to be enough space, try to get the minimum\n     * anyway.  This allows a \"stub\" implementation of jpeg_mem_available().\n     */\n    if (max_minheights <= 0)\n      max_minheights = 1;\n  }\n\n  /* Allocate the in-memory buffers and initialize backing store as needed. */\n\n  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {\n    if (sptr->mem_buffer == NULL) { /* if not realized yet */\n      minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L;\n      if (minheights <= max_minheights) {\n\t/* This buffer fits in memory */\n\tsptr->rows_in_mem = sptr->rows_in_array;\n      } else {\n\t/* It doesn't fit in memory, create backing store. */\n\tsptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess);\n\tjpeg_open_backing_store(cinfo, & sptr->b_s_info,\n\t\t\t\t(long) sptr->rows_in_array *\n\t\t\t\t(long) sptr->samplesperrow *\n\t\t\t\t(long) SIZEOF(JSAMPLE));\n\tsptr->b_s_open = TRUE;\n      }\n      sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE,\n\t\t\t\t      sptr->samplesperrow, sptr->rows_in_mem);\n      sptr->rowsperchunk = mem->last_rowsperchunk;\n      sptr->cur_start_row = 0;\n      sptr->first_undef_row = 0;\n      sptr->dirty = FALSE;\n    }\n  }\n\n  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {\n    if (bptr->mem_buffer == NULL) { /* if not realized yet */\n      minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L;\n      if (minheights <= max_minheights) {\n\t/* This buffer fits in memory */\n\tbptr->rows_in_mem = bptr->rows_in_array;\n      } else {\n\t/* It doesn't fit in memory, create backing store. */\n\tbptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess);\n\tjpeg_open_backing_store(cinfo, & bptr->b_s_info,\n\t\t\t\t(long) bptr->rows_in_array *\n\t\t\t\t(long) bptr->blocksperrow *\n\t\t\t\t(long) SIZEOF(JBLOCK));\n\tbptr->b_s_open = TRUE;\n      }\n      bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE,\n\t\t\t\t      bptr->blocksperrow, bptr->rows_in_mem);\n      bptr->rowsperchunk = mem->last_rowsperchunk;\n      bptr->cur_start_row = 0;\n      bptr->first_undef_row = 0;\n      bptr->dirty = FALSE;\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)\n/* Do backing store read or write of a virtual sample array */\n{\n  long bytesperrow, file_offset, byte_count, rows, thisrow, i;\n\n  bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);\n  file_offset = ptr->cur_start_row * bytesperrow;\n  /* Loop to read or write each allocation chunk in mem_buffer */\n  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {\n    /* One chunk, but check for short chunk at end of buffer */\n    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);\n    /* Transfer no more than is currently defined */\n    thisrow = (long) ptr->cur_start_row + i;\n    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);\n    /* Transfer no more than fits in file */\n    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);\n    if (rows <= 0)\t\t/* this chunk might be past end of file! */\n      break;\n    byte_count = rows * bytesperrow;\n    if (writing)\n      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,\n\t\t\t\t\t    (void FAR *) ptr->mem_buffer[i],\n\t\t\t\t\t    file_offset, byte_count);\n    else\n      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,\n\t\t\t\t\t   (void FAR *) ptr->mem_buffer[i],\n\t\t\t\t\t   file_offset, byte_count);\n    file_offset += byte_count;\n  }\n}\n\n\nLOCAL(void)\ndo_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)\n/* Do backing store read or write of a virtual coefficient-block array */\n{\n  long bytesperrow, file_offset, byte_count, rows, thisrow, i;\n\n  bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);\n  file_offset = ptr->cur_start_row * bytesperrow;\n  /* Loop to read or write each allocation chunk in mem_buffer */\n  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {\n    /* One chunk, but check for short chunk at end of buffer */\n    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);\n    /* Transfer no more than is currently defined */\n    thisrow = (long) ptr->cur_start_row + i;\n    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);\n    /* Transfer no more than fits in file */\n    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);\n    if (rows <= 0)\t\t/* this chunk might be past end of file! */\n      break;\n    byte_count = rows * bytesperrow;\n    if (writing)\n      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,\n\t\t\t\t\t    (void FAR *) ptr->mem_buffer[i],\n\t\t\t\t\t    file_offset, byte_count);\n    else\n      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,\n\t\t\t\t\t   (void FAR *) ptr->mem_buffer[i],\n\t\t\t\t\t   file_offset, byte_count);\n    file_offset += byte_count;\n  }\n}\n\n\nMETHODDEF(JSAMPARRAY)\naccess_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,\n\t\t    JDIMENSION start_row, JDIMENSION num_rows,\n\t\t    boolean writable)\n/* Access the part of a virtual sample array starting at start_row */\n/* and extending for num_rows rows.  writable is true if  */\n/* caller intends to modify the accessed area. */\n{\n  JDIMENSION end_row = start_row + num_rows;\n  JDIMENSION undef_row;\n\n  /* debugging check */\n  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||\n      ptr->mem_buffer == NULL)\n    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n\n  /* Make the desired part of the virtual array accessible */\n  if (start_row < ptr->cur_start_row ||\n      end_row > ptr->cur_start_row+ptr->rows_in_mem) {\n    if (! ptr->b_s_open)\n      ERREXIT(cinfo, JERR_VIRTUAL_BUG);\n    /* Flush old buffer contents if necessary */\n    if (ptr->dirty) {\n      do_sarray_io(cinfo, ptr, TRUE);\n      ptr->dirty = FALSE;\n    }\n    /* Decide what part of virtual array to access.\n     * Algorithm: if target address > current window, assume forward scan,\n     * load starting at target address.  If target address < current window,\n     * assume backward scan, load so that target area is top of window.\n     * Note that when switching from forward write to forward read, will have\n     * start_row = 0, so the limiting case applies and we load from 0 anyway.\n     */\n    if (start_row > ptr->cur_start_row) {\n      ptr->cur_start_row = start_row;\n    } else {\n      /* use long arithmetic here to avoid overflow & unsigned problems */\n      long ltemp;\n\n      ltemp = (long) end_row - (long) ptr->rows_in_mem;\n      if (ltemp < 0)\n\tltemp = 0;\t\t/* don't fall off front end of file */\n      ptr->cur_start_row = (JDIMENSION) ltemp;\n    }\n    /* Read in the selected part of the array.\n     * During the initial write pass, we will do no actual read\n     * because the selected part is all undefined.\n     */\n    do_sarray_io(cinfo, ptr, FALSE);\n  }\n  /* Ensure the accessed part of the array is defined; prezero if needed.\n   * To improve locality of access, we only prezero the part of the array\n   * that the caller is about to access, not the entire in-memory array.\n   */\n  if (ptr->first_undef_row < end_row) {\n    if (ptr->first_undef_row < start_row) {\n      if (writable)\t\t/* writer skipped over a section of array */\n\tERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n      undef_row = start_row;\t/* but reader is allowed to read ahead */\n    } else {\n      undef_row = ptr->first_undef_row;\n    }\n    if (writable)\n      ptr->first_undef_row = end_row;\n    if (ptr->pre_zero) {\n      size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE);\n      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */\n      end_row -= ptr->cur_start_row;\n      while (undef_row < end_row) {\n\tFMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);\n\tundef_row++;\n      }\n    } else {\n      if (! writable)\t\t/* reader looking at undefined data */\n\tERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n    }\n  }\n  /* Flag the buffer dirty if caller will write in it */\n  if (writable)\n    ptr->dirty = TRUE;\n  /* Return address of proper part of the buffer */\n  return ptr->mem_buffer + (start_row - ptr->cur_start_row);\n}\n\n\nMETHODDEF(JBLOCKARRAY)\naccess_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,\n\t\t    JDIMENSION start_row, JDIMENSION num_rows,\n\t\t    boolean writable)\n/* Access the part of a virtual block array starting at start_row */\n/* and extending for num_rows rows.  writable is true if  */\n/* caller intends to modify the accessed area. */\n{\n  JDIMENSION end_row = start_row + num_rows;\n  JDIMENSION undef_row;\n\n  /* debugging check */\n  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||\n      ptr->mem_buffer == NULL)\n    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n\n  /* Make the desired part of the virtual array accessible */\n  if (start_row < ptr->cur_start_row ||\n      end_row > ptr->cur_start_row+ptr->rows_in_mem) {\n    if (! ptr->b_s_open)\n      ERREXIT(cinfo, JERR_VIRTUAL_BUG);\n    /* Flush old buffer contents if necessary */\n    if (ptr->dirty) {\n      do_barray_io(cinfo, ptr, TRUE);\n      ptr->dirty = FALSE;\n    }\n    /* Decide what part of virtual array to access.\n     * Algorithm: if target address > current window, assume forward scan,\n     * load starting at target address.  If target address < current window,\n     * assume backward scan, load so that target area is top of window.\n     * Note that when switching from forward write to forward read, will have\n     * start_row = 0, so the limiting case applies and we load from 0 anyway.\n     */\n    if (start_row > ptr->cur_start_row) {\n      ptr->cur_start_row = start_row;\n    } else {\n      /* use long arithmetic here to avoid overflow & unsigned problems */\n      long ltemp;\n\n      ltemp = (long) end_row - (long) ptr->rows_in_mem;\n      if (ltemp < 0)\n\tltemp = 0;\t\t/* don't fall off front end of file */\n      ptr->cur_start_row = (JDIMENSION) ltemp;\n    }\n    /* Read in the selected part of the array.\n     * During the initial write pass, we will do no actual read\n     * because the selected part is all undefined.\n     */\n    do_barray_io(cinfo, ptr, FALSE);\n  }\n  /* Ensure the accessed part of the array is defined; prezero if needed.\n   * To improve locality of access, we only prezero the part of the array\n   * that the caller is about to access, not the entire in-memory array.\n   */\n  if (ptr->first_undef_row < end_row) {\n    if (ptr->first_undef_row < start_row) {\n      if (writable)\t\t/* writer skipped over a section of array */\n\tERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n      undef_row = start_row;\t/* but reader is allowed to read ahead */\n    } else {\n      undef_row = ptr->first_undef_row;\n    }\n    if (writable)\n      ptr->first_undef_row = end_row;\n    if (ptr->pre_zero) {\n      size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK);\n      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */\n      end_row -= ptr->cur_start_row;\n      while (undef_row < end_row) {\n\tFMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);\n\tundef_row++;\n      }\n    } else {\n      if (! writable)\t\t/* reader looking at undefined data */\n\tERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);\n    }\n  }\n  /* Flag the buffer dirty if caller will write in it */\n  if (writable)\n    ptr->dirty = TRUE;\n  /* Return address of proper part of the buffer */\n  return ptr->mem_buffer + (start_row - ptr->cur_start_row);\n}\n\n\n/*\n * Release all objects belonging to a specified pool.\n */\n\nMETHODDEF(void)\nfree_pool (j_common_ptr cinfo, int pool_id)\n{\n  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;\n  small_pool_ptr shdr_ptr;\n  large_pool_ptr lhdr_ptr;\n  size_t space_freed;\n\n  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)\n    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);\t/* safety check */\n\n#ifdef MEM_STATS\n  if (cinfo->err->trace_level > 1)\n    print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */\n#endif\n\n  /* If freeing IMAGE pool, close any virtual arrays first */\n  if (pool_id == JPOOL_IMAGE) {\n    jvirt_sarray_ptr sptr;\n    jvirt_barray_ptr bptr;\n\n    for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {\n      if (sptr->b_s_open) {\t/* there may be no backing store */\n\tsptr->b_s_open = FALSE;\t/* prevent recursive close if error */\n\t(*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info);\n      }\n    }\n    mem->virt_sarray_list = NULL;\n    for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {\n      if (bptr->b_s_open) {\t/* there may be no backing store */\n\tbptr->b_s_open = FALSE;\t/* prevent recursive close if error */\n\t(*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info);\n      }\n    }\n    mem->virt_barray_list = NULL;\n  }\n\n  /* Release large objects */\n  lhdr_ptr = mem->large_list[pool_id];\n  mem->large_list[pool_id] = NULL;\n\n  while (lhdr_ptr != NULL) {\n    large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next;\n    space_freed = lhdr_ptr->hdr.bytes_used +\n\t\t  lhdr_ptr->hdr.bytes_left +\n\t\t  SIZEOF(large_pool_hdr);\n    jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed);\n    mem->total_space_allocated -= space_freed;\n    lhdr_ptr = next_lhdr_ptr;\n  }\n\n  /* Release small objects */\n  shdr_ptr = mem->small_list[pool_id];\n  mem->small_list[pool_id] = NULL;\n\n  while (shdr_ptr != NULL) {\n    small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next;\n    space_freed = shdr_ptr->hdr.bytes_used +\n\t\t  shdr_ptr->hdr.bytes_left +\n\t\t  SIZEOF(small_pool_hdr);\n    jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed);\n    mem->total_space_allocated -= space_freed;\n    shdr_ptr = next_shdr_ptr;\n  }\n}\n\n\n/*\n * Close up shop entirely.\n * Note that this cannot be called unless cinfo->mem is non-NULL.\n */\n\nMETHODDEF(void)\nself_destruct (j_common_ptr cinfo)\n{\n  int pool;\n\n  /* Close all backing store, release all memory.\n   * Releasing pools in reverse order might help avoid fragmentation\n   * with some (brain-damaged) malloc libraries.\n   */\n  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {\n    free_pool(cinfo, pool);\n  }\n\n  /* Release the memory manager control block too. */\n  jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr));\n  cinfo->mem = NULL;\t\t/* ensures I will be called only once */\n\n  jpeg_mem_term(cinfo);\t\t/* system-dependent cleanup */\n}\n\n\n/*\n * Memory manager initialization.\n * When this is called, only the error manager pointer is valid in cinfo!\n */\n\nGLOBAL(void)\njinit_memory_mgr (j_common_ptr cinfo)\n{\n  my_mem_ptr mem;\n  long max_to_use;\n  int pool;\n  size_t test_mac;\n\n  cinfo->mem = NULL;\t\t/* for safety if init fails */\n\n  /* Check for configuration errors.\n   * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably\n   * doesn't reflect any real hardware alignment requirement.\n   * The test is a little tricky: for X>0, X and X-1 have no one-bits\n   * in common if and only if X is a power of 2, ie has only one one-bit.\n   * Some compilers may give an \"unreachable code\" warning here; ignore it.\n   */\n  if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0)\n    ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE);\n  /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be\n   * a multiple of SIZEOF(ALIGN_TYPE).\n   * Again, an \"unreachable code\" warning may be ignored here.\n   * But a \"constant too large\" warning means you need to fix MAX_ALLOC_CHUNK.\n   */\n  test_mac = (size_t) MAX_ALLOC_CHUNK;\n  if ((long) test_mac != MAX_ALLOC_CHUNK ||\n      (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0)\n    ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);\n\n  max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */\n\n  /* Attempt to allocate memory manager's control block */\n  mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr));\n\n  if (mem == NULL) {\n    jpeg_mem_term(cinfo);\t/* system-dependent cleanup */\n    ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0);\n  }\n\n  /* OK, fill in the method pointers */\n  mem->pub.alloc_small = alloc_small;\n  mem->pub.alloc_large = alloc_large;\n  mem->pub.alloc_sarray = alloc_sarray;\n  mem->pub.alloc_barray = alloc_barray;\n  mem->pub.request_virt_sarray = request_virt_sarray;\n  mem->pub.request_virt_barray = request_virt_barray;\n  mem->pub.realize_virt_arrays = realize_virt_arrays;\n  mem->pub.access_virt_sarray = access_virt_sarray;\n  mem->pub.access_virt_barray = access_virt_barray;\n  mem->pub.free_pool = free_pool;\n  mem->pub.self_destruct = self_destruct;\n\n  /* Make MAX_ALLOC_CHUNK accessible to other modules */\n  mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK;\n\n  /* Initialize working state */\n  mem->pub.max_memory_to_use = max_to_use;\n\n  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {\n    mem->small_list[pool] = NULL;\n    mem->large_list[pool] = NULL;\n  }\n  mem->virt_sarray_list = NULL;\n  mem->virt_barray_list = NULL;\n\n  mem->total_space_allocated = SIZEOF(my_memory_mgr);\n\n  /* Declare ourselves open for business */\n  cinfo->mem = & mem->pub;\n\n  /* Check for an environment variable JPEGMEM; if found, override the\n   * default max_memory setting from jpeg_mem_init.  Note that the\n   * surrounding application may again override this value.\n   * If your system doesn't support getenv(), define NO_GETENV to disable\n   * this feature.\n   */\n#ifndef NO_GETENV\n  { char * memenv;\n\n    if ((memenv = getenv(\"JPEGMEM\")) != NULL) {\n      char ch = 'x';\n\n      if (sscanf(memenv, \"%ld%c\", &max_to_use, &ch) > 0) {\n\tif (ch == 'm' || ch == 'M')\n\t  max_to_use *= 1000L;\n\tmem->pub.max_memory_to_use = max_to_use * 1000L;\n      }\n    }\n  }\n#endif\n\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jmemname.c",
    "content": "/*\n * jmemname.c\n *\n * Copyright (C) 1992-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file provides a generic implementation of the system-dependent\n * portion of the JPEG memory manager.  This implementation assumes that\n * you must explicitly construct a name for each temp file.\n * Also, the problem of determining the amount of memory available\n * is shoved onto the user.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jmemsys.h\"\t\t/* import the system-dependent declarations */\n\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare malloc(),free() */\nextern void * malloc JPP((size_t size));\nextern void free JPP((void *ptr));\n#endif\n\n#ifndef SEEK_SET\t\t/* pre-ANSI systems may not define this; */\n#define SEEK_SET  0\t\t/* if not, assume 0 is correct */\n#endif\n\n#ifdef DONT_USE_B_MODE\t\t/* define mode parameters for fopen() */\n#define READ_BINARY\t\"r\"\n#define RW_BINARY\t\"w+\"\n#else\n#ifdef VMS\t\t\t/* VMS is very nonstandard */\n#define READ_BINARY\t\"rb\", \"ctx=stm\"\n#define RW_BINARY\t\"w+b\", \"ctx=stm\"\n#else\t\t\t\t/* standard ANSI-compliant case */\n#define READ_BINARY\t\"rb\"\n#define RW_BINARY\t\"w+b\"\n#endif\n#endif\n\n\n/*\n * Selection of a file name for a temporary file.\n * This is system-dependent!\n *\n * The code as given is suitable for most Unix systems, and it is easily\n * modified for most non-Unix systems.  Some notes:\n *  1.  The temp file is created in the directory named by TEMP_DIRECTORY.\n *      The default value is /usr/tmp, which is the conventional place for\n *      creating large temp files on Unix.  On other systems you'll probably\n *      want to change the file location.  You can do this by editing the\n *      #define, or (preferred) by defining TEMP_DIRECTORY in jconfig.h.\n *\n *  2.  If you need to change the file name as well as its location,\n *      you can override the TEMP_FILE_NAME macro.  (Note that this is\n *      actually a printf format string; it must contain %s and %d.)\n *      Few people should need to do this.\n *\n *  3.  mktemp() is used to ensure that multiple processes running\n *      simultaneously won't select the same file names.  If your system\n *      doesn't have mktemp(), define NO_MKTEMP to do it the hard way.\n *      (If you don't have <errno.h>, also define NO_ERRNO_H.)\n *\n *  4.  You probably want to define NEED_SIGNAL_CATCHER so that cjpeg.c/djpeg.c\n *      will cause the temp files to be removed if you stop the program early.\n */\n\n#ifndef TEMP_DIRECTORY\t\t/* can override from jconfig.h or Makefile */\n#define TEMP_DIRECTORY  \"/usr/tmp/\" /* recommended setting for Unix */\n#endif\n\nstatic int next_file_num;\t/* to distinguish among several temp files */\n\n#ifdef NO_MKTEMP\n\n#ifndef TEMP_FILE_NAME\t\t/* can override from jconfig.h or Makefile */\n#define TEMP_FILE_NAME  \"%sJPG%03d.TMP\"\n#endif\n\n#ifndef NO_ERRNO_H\n#include <errno.h>\t\t/* to define ENOENT */\n#endif\n\n/* ANSI C specifies that errno is a macro, but on older systems it's more\n * likely to be a plain int variable.  And not all versions of errno.h\n * bother to declare it, so we have to in order to be most portable.  Thus:\n */\n#ifndef errno\nextern int errno;\n#endif\n\n\nLOCAL(void)\nselect_file_name (char * fname)\n{\n  FILE * tfile;\n\n  /* Keep generating file names till we find one that's not in use */\n  for (;;) {\n    next_file_num++;\t\t/* advance counter */\n    sprintf(fname, TEMP_FILE_NAME, TEMP_DIRECTORY, next_file_num);\n    if ((tfile = fopen(fname, READ_BINARY)) == NULL) {\n      /* fopen could have failed for a reason other than the file not\n       * being there; for example, file there but unreadable.\n       * If <errno.h> isn't available, then we cannot test the cause.\n       */\n#ifdef ENOENT\n      if (errno != ENOENT)\n\tcontinue;\n#endif\n      break;\n    }\n    fclose(tfile);\t\t/* oops, it's there; close tfile & try again */\n  }\n}\n\n#else /* ! NO_MKTEMP */\n\n/* Note that mktemp() requires the initial filename to end in six X's */\n#ifndef TEMP_FILE_NAME\t\t/* can override from jconfig.h or Makefile */\n#define TEMP_FILE_NAME  \"%sJPG%dXXXXXX\"\n#endif\n\nLOCAL(void)\nselect_file_name (char * fname)\n{\n  next_file_num++;\t\t/* advance counter */\n  sprintf(fname, TEMP_FILE_NAME, TEMP_DIRECTORY, next_file_num);\n  mktemp(fname);\t\t/* make sure file name is unique */\n  /* mktemp replaces the trailing XXXXXX with a unique string of characters */\n}\n\n#endif /* NO_MKTEMP */\n\n\n/*\n * Memory allocation and freeing are controlled by the regular library\n * routines malloc() and free().\n */\n\nGLOBAL(void *)\njpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void *) malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)\n{\n  free(object);\n}\n\n\n/*\n * \"Large\" objects are treated the same as \"small\" ones.\n * NB: although we include FAR keywords in the routine declarations,\n * this file won't actually work in 80x86 small/medium model; at least,\n * you probably won't be able to process useful-size images in only 64KB.\n */\n\nGLOBAL(void FAR *)\njpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void FAR *) malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)\n{\n  free(object);\n}\n\n\n/*\n * This routine computes the total memory space available for allocation.\n * It's impossible to do this in a portable way; our current solution is\n * to make the user tell us (with a default value set at compile time).\n * If you can actually get the available space, it's a good idea to subtract\n * a slop factor of 5% or so.\n */\n\n#ifndef DEFAULT_MAX_MEM\t\t/* so can override from makefile */\n#define DEFAULT_MAX_MEM\t\t1000000L /* default: one megabyte */\n#endif\n\nGLOBAL(long)\njpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,\n\t\t    long max_bytes_needed, long already_allocated)\n{\n  return cinfo->mem->max_memory_to_use - already_allocated;\n}\n\n\n/*\n * Backing store (temporary file) management.\n * Backing store objects are only used when the value returned by\n * jpeg_mem_available is less than the total space needed.  You can dispense\n * with these routines if you have plenty of virtual memory; see jmemnobs.c.\n */\n\n\nMETHODDEF(void)\nread_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t    void FAR * buffer_address,\n\t\t    long file_offset, long byte_count)\n{\n  if (fseek(info->temp_file, file_offset, SEEK_SET))\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n  if (JFREAD(info->temp_file, buffer_address, byte_count)\n      != (size_t) byte_count)\n    ERREXIT(cinfo, JERR_TFILE_READ);\n}\n\n\nMETHODDEF(void)\nwrite_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t     void FAR * buffer_address,\n\t\t     long file_offset, long byte_count)\n{\n  if (fseek(info->temp_file, file_offset, SEEK_SET))\n    ERREXIT(cinfo, JERR_TFILE_SEEK);\n  if (JFWRITE(info->temp_file, buffer_address, byte_count)\n      != (size_t) byte_count)\n    ERREXIT(cinfo, JERR_TFILE_WRITE);\n}\n\n\nMETHODDEF(void)\nclose_backing_store (j_common_ptr cinfo, backing_store_ptr info)\n{\n  fclose(info->temp_file);\t/* close the file */\n  unlink(info->temp_name);\t/* delete the file */\n/* If your system doesn't have unlink(), use remove() instead.\n * remove() is the ANSI-standard name for this function, but if\n * your system was ANSI you'd be using jmemansi.c, right?\n */\n  TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name);\n}\n\n\n/*\n * Initial opening of a backing-store object.\n */\n\nGLOBAL(void)\njpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t\t long total_bytes_needed)\n{\n  select_file_name(info->temp_name);\n  if ((info->temp_file = fopen(info->temp_name, RW_BINARY)) == NULL)\n    ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name);\n  info->read_backing_store = read_backing_store;\n  info->write_backing_store = write_backing_store;\n  info->close_backing_store = close_backing_store;\n  TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name);\n}\n\n\n/*\n * These routines take care of any system-dependent initialization and\n * cleanup required.\n */\n\nGLOBAL(long)\njpeg_mem_init (j_common_ptr cinfo)\n{\n  next_file_num = 0;\t\t/* initialize temp file name generator */\n  return DEFAULT_MAX_MEM;\t/* default for max_memory_to_use */\n}\n\nGLOBAL(void)\njpeg_mem_term (j_common_ptr cinfo)\n{\n  /* no work */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jmemnobs.c",
    "content": "/*\n * jmemnobs.c\n *\n * Copyright (C) 1992-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file provides a really simple implementation of the system-\n * dependent portion of the JPEG memory manager.  This implementation\n * assumes that no backing-store files are needed: all required space\n * can be obtained from malloc().\n * This is very portable in the sense that it'll compile on almost anything,\n * but you'd better have lots of main memory (or virtual memory) if you want\n * to process big images.\n * Note that the max_memory_to_use option is ignored by this implementation.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"jmemsys.h\"\t\t/* import the system-dependent declarations */\n\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare malloc(),free() */\nextern void * malloc JPP((size_t size));\nextern void free JPP((void *ptr));\n#endif\n\n\n/*\n * Memory allocation and freeing are controlled by the regular library\n * routines malloc() and free().\n */\n\nGLOBAL(void *)\njpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void *) malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)\n{\n  free(object);\n}\n\n\n/*\n * \"Large\" objects are treated the same as \"small\" ones.\n * NB: although we include FAR keywords in the routine declarations,\n * this file won't actually work in 80x86 small/medium model; at least,\n * you probably won't be able to process useful-size images in only 64KB.\n */\n\nGLOBAL(void FAR *)\njpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)\n{\n  return (void FAR *) malloc(sizeofobject);\n}\n\nGLOBAL(void)\njpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)\n{\n  free(object);\n}\n\n\n/*\n * This routine computes the total memory space available for allocation.\n * Here we always say, \"we got all you want bud!\"\n */\n\nGLOBAL(long)\njpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,\n\t\t    long max_bytes_needed, long already_allocated)\n{\n  return max_bytes_needed;\n}\n\n\n/*\n * Backing store (temporary file) management.\n * Since jpeg_mem_available always promised the moon,\n * this should never be called and we can just error out.\n */\n\nGLOBAL(void)\njpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,\n\t\t\t long total_bytes_needed)\n{\n  ERREXIT(cinfo, JERR_NO_BACKING_STORE);\n}\n\n\n/*\n * These routines take care of any system-dependent initialization and\n * cleanup required.  Here, there isn't any.\n */\n\nGLOBAL(long)\njpeg_mem_init (j_common_ptr cinfo)\n{\n  return 0;\t\t\t/* just set max_memory_to_use to 0 */\n}\n\nGLOBAL(void)\njpeg_mem_term (j_common_ptr cinfo)\n{\n  /* no work */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jpegtran.c",
    "content": "/*\n * jpegtran.c\n *\n * Copyright (C) 1995-2012, Thomas G. Lane, Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a command-line user interface for JPEG transcoding.\n * It is very similar to cjpeg.c, and partly to djpeg.c, but provides\n * lossless transcoding between different JPEG file formats.  It also\n * provides some lossless and sort-of-lossless transformations of JPEG data.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n#include \"transupp.h\"\t\t/* Support routines for jpegtran */\n#include \"jversion.h\"\t\t/* for version message */\n\n#ifdef USE_CCOMMAND\t\t/* command-line reader for Macintosh */\n#ifdef __MWERKS__\n#include <SIOUX.h>              /* Metrowerks needs this */\n#include <console.h>\t\t/* ... and this */\n#endif\n#ifdef THINK_C\n#include <console.h>\t\t/* Think declares it here */\n#endif\n#endif\n\n\n/*\n * Argument-parsing code.\n * The switch parser is designed to be useful with DOS-style command line\n * syntax, ie, intermixed switches and file names, where only the switches\n * to the left of a given file name affect processing of that file.\n * The main program in this file doesn't actually use this capability...\n */\n\n\nstatic const char * progname;\t/* program name for error messages */\nstatic char * outfilename;\t/* for -outfile switch */\nstatic char * scaleoption;\t/* -scale switch */\nstatic JCOPY_OPTION copyoption;\t/* -copy switch */\nstatic jpeg_transform_info transformoption; /* image transformation options */\n\n\nLOCAL(void)\nusage (void)\n/* complain about bad command line */\n{\n  fprintf(stderr, \"usage: %s [switches] \", progname);\n#ifdef TWO_FILE_COMMANDLINE\n  fprintf(stderr, \"inputfile outputfile\\n\");\n#else\n  fprintf(stderr, \"[inputfile]\\n\");\n#endif\n\n  fprintf(stderr, \"Switches (names may be abbreviated):\\n\");\n  fprintf(stderr, \"  -copy none     Copy no extra markers from source file\\n\");\n  fprintf(stderr, \"  -copy comments Copy only comment markers (default)\\n\");\n  fprintf(stderr, \"  -copy all      Copy all extra markers\\n\");\n#ifdef ENTROPY_OPT_SUPPORTED\n  fprintf(stderr, \"  -optimize      Optimize Huffman table (smaller file, but slow compression)\\n\");\n#endif\n#ifdef C_PROGRESSIVE_SUPPORTED\n  fprintf(stderr, \"  -progressive   Create progressive JPEG file\\n\");\n#endif\n  fprintf(stderr, \"Switches for modifying the image:\\n\");\n#if TRANSFORMS_SUPPORTED\n  fprintf(stderr, \"  -crop WxH+X+Y  Crop to a rectangular subarea\\n\");\n  fprintf(stderr, \"  -grayscale     Reduce to grayscale (omit color data)\\n\");\n  fprintf(stderr, \"  -flip [horizontal|vertical]  Mirror image (left-right or top-bottom)\\n\");\n  fprintf(stderr, \"  -perfect       Fail if there is non-transformable edge blocks\\n\");\n  fprintf(stderr, \"  -rotate [90|180|270]         Rotate image (degrees clockwise)\\n\");\n#endif\n  fprintf(stderr, \"  -scale M/N     Scale output image by fraction M/N, eg, 1/8\\n\");\n#if TRANSFORMS_SUPPORTED\n  fprintf(stderr, \"  -transpose     Transpose image\\n\");\n  fprintf(stderr, \"  -transverse    Transverse transpose image\\n\");\n  fprintf(stderr, \"  -trim          Drop non-transformable edge blocks\\n\");\n#endif\n  fprintf(stderr, \"Switches for advanced users:\\n\");\n#ifdef C_ARITH_CODING_SUPPORTED\n  fprintf(stderr, \"  -arithmetic    Use arithmetic coding\\n\");\n#endif\n  fprintf(stderr, \"  -restart N     Set restart interval in rows, or in blocks with B\\n\");\n  fprintf(stderr, \"  -maxmemory N   Maximum memory to use (in kbytes)\\n\");\n  fprintf(stderr, \"  -outfile name  Specify name for output file\\n\");\n  fprintf(stderr, \"  -verbose  or  -debug   Emit debug output\\n\");\n  fprintf(stderr, \"Switches for wizards:\\n\");\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n  fprintf(stderr, \"  -scans file    Create multi-scan JPEG per script file\\n\");\n#endif\n  exit(EXIT_FAILURE);\n}\n\n\nLOCAL(void)\nselect_transform (JXFORM_CODE transform)\n/* Silly little routine to detect multiple transform options,\n * which we can't handle.\n */\n{\n#if TRANSFORMS_SUPPORTED\n  if (transformoption.transform == JXFORM_NONE ||\n      transformoption.transform == transform) {\n    transformoption.transform = transform;\n  } else {\n    fprintf(stderr, \"%s: can only do one image transformation at a time\\n\",\n\t    progname);\n    usage();\n  }\n#else\n  fprintf(stderr, \"%s: sorry, image transformation was not compiled\\n\",\n\t  progname);\n  exit(EXIT_FAILURE);\n#endif\n}\n\n\nLOCAL(int)\nparse_switches (j_compress_ptr cinfo, int argc, char **argv,\n\t\tint last_file_arg_seen, boolean for_real)\n/* Parse optional switches.\n * Returns argv[] index of first file-name argument (== argc if none).\n * Any file names with indexes <= last_file_arg_seen are ignored;\n * they have presumably been processed in a previous iteration.\n * (Pass 0 for last_file_arg_seen on the first or only iteration.)\n * for_real is FALSE on the first (dummy) pass; we may skip any expensive\n * processing.\n */\n{\n  int argn;\n  char * arg;\n  boolean simple_progressive;\n  char * scansarg = NULL;\t/* saves -scans parm if any */\n\n  /* Set up default JPEG parameters. */\n  simple_progressive = FALSE;\n  outfilename = NULL;\n  scaleoption = NULL;\n  copyoption = JCOPYOPT_DEFAULT;\n  transformoption.transform = JXFORM_NONE;\n  transformoption.perfect = FALSE;\n  transformoption.trim = FALSE;\n  transformoption.force_grayscale = FALSE;\n  transformoption.crop = FALSE;\n  cinfo->err->trace_level = 0;\n\n  /* Scan command line options, adjust parameters */\n\n  for (argn = 1; argn < argc; argn++) {\n    arg = argv[argn];\n    if (*arg != '-') {\n      /* Not a switch, must be a file name argument */\n      if (argn <= last_file_arg_seen) {\n\toutfilename = NULL;\t/* -outfile applies to just one input file */\n\tcontinue;\t\t/* ignore this name if previously processed */\n      }\n      break;\t\t\t/* else done parsing switches */\n    }\n    arg++;\t\t\t/* advance past switch marker character */\n\n    if (keymatch(arg, \"arithmetic\", 1)) {\n      /* Use arithmetic coding. */\n#ifdef C_ARITH_CODING_SUPPORTED\n      cinfo->arith_code = TRUE;\n#else\n      fprintf(stderr, \"%s: sorry, arithmetic coding not supported\\n\",\n\t      progname);\n      exit(EXIT_FAILURE);\n#endif\n\n    } else if (keymatch(arg, \"copy\", 2)) {\n      /* Select which extra markers to copy. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (keymatch(argv[argn], \"none\", 1)) {\n\tcopyoption = JCOPYOPT_NONE;\n      } else if (keymatch(argv[argn], \"comments\", 1)) {\n\tcopyoption = JCOPYOPT_COMMENTS;\n      } else if (keymatch(argv[argn], \"all\", 1)) {\n\tcopyoption = JCOPYOPT_ALL;\n      } else\n\tusage();\n\n    } else if (keymatch(arg, \"crop\", 2)) {\n      /* Perform lossless cropping. */\n#if TRANSFORMS_SUPPORTED\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (! jtransform_parse_crop_spec(&transformoption, argv[argn])) {\n\tfprintf(stderr, \"%s: bogus -crop argument '%s'\\n\",\n\t\tprogname, argv[argn]);\n\texit(EXIT_FAILURE);\n      }\n#else\n      select_transform(JXFORM_NONE);\t/* force an error */\n#endif\n\n    } else if (keymatch(arg, \"debug\", 1) || keymatch(arg, \"verbose\", 1)) {\n      /* Enable debug printouts. */\n      /* On first -d, print version identification */\n      static boolean printed_version = FALSE;\n\n      if (! printed_version) {\n\tfprintf(stderr, \"Independent JPEG Group's JPEGTRAN, version %s\\n%s\\n\",\n\t\tJVERSION, JCOPYRIGHT);\n\tprinted_version = TRUE;\n      }\n      cinfo->err->trace_level++;\n\n    } else if (keymatch(arg, \"flip\", 1)) {\n      /* Mirror left-right or top-bottom. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (keymatch(argv[argn], \"horizontal\", 1))\n\tselect_transform(JXFORM_FLIP_H);\n      else if (keymatch(argv[argn], \"vertical\", 1))\n\tselect_transform(JXFORM_FLIP_V);\n      else\n\tusage();\n\n    } else if (keymatch(arg, \"grayscale\", 1) || keymatch(arg, \"greyscale\",1)) {\n      /* Force to grayscale. */\n#if TRANSFORMS_SUPPORTED\n      transformoption.force_grayscale = TRUE;\n#else\n      select_transform(JXFORM_NONE);\t/* force an error */\n#endif\n\n    } else if (keymatch(arg, \"maxmemory\", 3)) {\n      /* Maximum memory in Kb (or Mb with 'm'). */\n      long lval;\n      char ch = 'x';\n\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%ld%c\", &lval, &ch) < 1)\n\tusage();\n      if (ch == 'm' || ch == 'M')\n\tlval *= 1000L;\n      cinfo->mem->max_memory_to_use = lval * 1000L;\n\n    } else if (keymatch(arg, \"optimize\", 1) || keymatch(arg, \"optimise\", 1)) {\n      /* Enable entropy parm optimization. */\n#ifdef ENTROPY_OPT_SUPPORTED\n      cinfo->optimize_coding = TRUE;\n#else\n      fprintf(stderr, \"%s: sorry, entropy optimization was not compiled\\n\",\n\t      progname);\n      exit(EXIT_FAILURE);\n#endif\n\n    } else if (keymatch(arg, \"outfile\", 4)) {\n      /* Set output file name. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      outfilename = argv[argn];\t/* save it away for later use */\n\n    } else if (keymatch(arg, \"perfect\", 2)) {\n      /* Fail if there is any partial edge MCUs that the transform can't\n       * handle. */\n      transformoption.perfect = TRUE;\n\n    } else if (keymatch(arg, \"progressive\", 2)) {\n      /* Select simple progressive mode. */\n#ifdef C_PROGRESSIVE_SUPPORTED\n      simple_progressive = TRUE;\n      /* We must postpone execution until num_components is known. */\n#else\n      fprintf(stderr, \"%s: sorry, progressive output was not compiled\\n\",\n\t      progname);\n      exit(EXIT_FAILURE);\n#endif\n\n    } else if (keymatch(arg, \"restart\", 1)) {\n      /* Restart interval in MCU rows (or in MCUs with 'b'). */\n      long lval;\n      char ch = 'x';\n\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (sscanf(argv[argn], \"%ld%c\", &lval, &ch) < 1)\n\tusage();\n      if (lval < 0 || lval > 65535L)\n\tusage();\n      if (ch == 'b' || ch == 'B') {\n\tcinfo->restart_interval = (unsigned int) lval;\n\tcinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */\n      } else {\n\tcinfo->restart_in_rows = (int) lval;\n\t/* restart_interval will be computed during startup */\n      }\n\n    } else if (keymatch(arg, \"rotate\", 2)) {\n      /* Rotate 90, 180, or 270 degrees (measured clockwise). */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      if (keymatch(argv[argn], \"90\", 2))\n\tselect_transform(JXFORM_ROT_90);\n      else if (keymatch(argv[argn], \"180\", 3))\n\tselect_transform(JXFORM_ROT_180);\n      else if (keymatch(argv[argn], \"270\", 3))\n\tselect_transform(JXFORM_ROT_270);\n      else\n\tusage();\n\n    } else if (keymatch(arg, \"scale\", 4)) {\n      /* Scale the output image by a fraction M/N. */\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      scaleoption = argv[argn];\n      /* We must postpone processing until decompression startup. */\n\n    } else if (keymatch(arg, \"scans\", 1)) {\n      /* Set scan script. */\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n      if (++argn >= argc)\t/* advance to next argument */\n\tusage();\n      scansarg = argv[argn];\n      /* We must postpone reading the file in case -progressive appears. */\n#else\n      fprintf(stderr, \"%s: sorry, multi-scan output was not compiled\\n\",\n\t      progname);\n      exit(EXIT_FAILURE);\n#endif\n\n    } else if (keymatch(arg, \"transpose\", 1)) {\n      /* Transpose (across UL-to-LR axis). */\n      select_transform(JXFORM_TRANSPOSE);\n\n    } else if (keymatch(arg, \"transverse\", 6)) {\n      /* Transverse transpose (across UR-to-LL axis). */\n      select_transform(JXFORM_TRANSVERSE);\n\n    } else if (keymatch(arg, \"trim\", 3)) {\n      /* Trim off any partial edge MCUs that the transform can't handle. */\n      transformoption.trim = TRUE;\n\n    } else {\n      usage();\t\t\t/* bogus switch */\n    }\n  }\n\n  /* Post-switch-scanning cleanup */\n\n  if (for_real) {\n\n#ifdef C_PROGRESSIVE_SUPPORTED\n    if (simple_progressive)\t/* process -progressive; -scans can override */\n      jpeg_simple_progression(cinfo);\n#endif\n\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n    if (scansarg != NULL)\t/* process -scans if it was present */\n      if (! read_scan_script(cinfo, scansarg))\n\tusage();\n#endif\n  }\n\n  return argn;\t\t\t/* return index of next arg (file name) */\n}\n\n\n/*\n * The main program.\n */\n\nint\nmain (int argc, char **argv)\n{\n  struct jpeg_decompress_struct srcinfo;\n  struct jpeg_compress_struct dstinfo;\n  struct jpeg_error_mgr jsrcerr, jdsterr;\n#ifdef PROGRESS_REPORT\n  struct cdjpeg_progress_mgr progress;\n#endif\n  jvirt_barray_ptr * src_coef_arrays;\n  jvirt_barray_ptr * dst_coef_arrays;\n  int file_index;\n  /* We assume all-in-memory processing and can therefore use only a\n   * single file pointer for sequential input and output operation. \n   */\n  FILE * fp;\n\n  /* On Mac, fetch a command line. */\n#ifdef USE_CCOMMAND\n  argc = ccommand(&argv);\n#endif\n\n  progname = argv[0];\n  if (progname == NULL || progname[0] == 0)\n    progname = \"jpegtran\";\t/* in case C library doesn't provide it */\n\n  /* Initialize the JPEG decompression object with default error handling. */\n  srcinfo.err = jpeg_std_error(&jsrcerr);\n  jpeg_create_decompress(&srcinfo);\n  /* Initialize the JPEG compression object with default error handling. */\n  dstinfo.err = jpeg_std_error(&jdsterr);\n  jpeg_create_compress(&dstinfo);\n\n  /* Now safe to enable signal catcher.\n   * Note: we assume only the decompression object will have virtual arrays.\n   */\n#ifdef NEED_SIGNAL_CATCHER\n  enable_signal_catcher((j_common_ptr) &srcinfo);\n#endif\n\n  /* Scan command line to find file names.\n   * It is convenient to use just one switch-parsing routine, but the switch\n   * values read here are mostly ignored; we will rescan the switches after\n   * opening the input file.  Also note that most of the switches affect the\n   * destination JPEG object, so we parse into that and then copy over what\n   * needs to affects the source too.\n   */\n\n  file_index = parse_switches(&dstinfo, argc, argv, 0, FALSE);\n  jsrcerr.trace_level = jdsterr.trace_level;\n  srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use;\n\n#ifdef TWO_FILE_COMMANDLINE\n  /* Must have either -outfile switch or explicit output file name */\n  if (outfilename == NULL) {\n    if (file_index != argc-2) {\n      fprintf(stderr, \"%s: must name one input and one output file\\n\",\n\t      progname);\n      usage();\n    }\n    outfilename = argv[file_index+1];\n  } else {\n    if (file_index != argc-1) {\n      fprintf(stderr, \"%s: must name one input and one output file\\n\",\n\t      progname);\n      usage();\n    }\n  }\n#else\n  /* Unix style: expect zero or one file name */\n  if (file_index < argc-1) {\n    fprintf(stderr, \"%s: only one input file\\n\", progname);\n    usage();\n  }\n#endif /* TWO_FILE_COMMANDLINE */\n\n  /* Open the input file. */\n  if (file_index < argc) {\n    if ((fp = fopen(argv[file_index], READ_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open %s for reading\\n\", progname, argv[file_index]);\n      exit(EXIT_FAILURE);\n    }\n  } else {\n    /* default input file is stdin */\n    fp = read_stdin();\n  }\n\n#ifdef PROGRESS_REPORT\n  start_progress_monitor((j_common_ptr) &dstinfo, &progress);\n#endif\n\n  /* Specify data source for decompression */\n  jpeg_stdio_src(&srcinfo, fp);\n\n  /* Enable saving of extra markers that we want to copy */\n  jcopy_markers_setup(&srcinfo, copyoption);\n\n  /* Read file header */\n  (void) jpeg_read_header(&srcinfo, TRUE);\n\n  /* Adjust default decompression parameters */\n  if (scaleoption != NULL)\n    if (sscanf(scaleoption, \"%u/%u\",\n\t&srcinfo.scale_num, &srcinfo.scale_denom) < 1)\n      usage();\n\n  /* Any space needed by a transform option must be requested before\n   * jpeg_read_coefficients so that memory allocation will be done right.\n   */\n#if TRANSFORMS_SUPPORTED\n  /* Fail right away if -perfect is given and transformation is not perfect.\n   */\n  if (!jtransform_request_workspace(&srcinfo, &transformoption)) {\n    fprintf(stderr, \"%s: transformation is not perfect\\n\", progname);\n    exit(EXIT_FAILURE);\n  }\n#endif\n\n  /* Read source file as DCT coefficients */\n  src_coef_arrays = jpeg_read_coefficients(&srcinfo);\n\n  /* Initialize destination compression parameters from source values */\n  jpeg_copy_critical_parameters(&srcinfo, &dstinfo);\n\n  /* Adjust destination parameters if required by transform options;\n   * also find out which set of coefficient arrays will hold the output.\n   */\n#if TRANSFORMS_SUPPORTED\n  dst_coef_arrays = jtransform_adjust_parameters(&srcinfo, &dstinfo,\n\t\t\t\t\t\t src_coef_arrays,\n\t\t\t\t\t\t &transformoption);\n#else\n  dst_coef_arrays = src_coef_arrays;\n#endif\n\n  /* Close input file, if we opened it.\n   * Note: we assume that jpeg_read_coefficients consumed all input\n   * until JPEG_REACHED_EOI, and that jpeg_finish_decompress will\n   * only consume more while (! cinfo->inputctl->eoi_reached).\n   * We cannot call jpeg_finish_decompress here since we still need the\n   * virtual arrays allocated from the source object for processing.\n   */\n  if (fp != stdin)\n    fclose(fp);\n\n  /* Open the output file. */\n  if (outfilename != NULL) {\n    if ((fp = fopen(outfilename, WRITE_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open %s for writing\\n\", progname, outfilename);\n      exit(EXIT_FAILURE);\n    }\n  } else {\n    /* default output file is stdout */\n    fp = write_stdout();\n  }\n\n  /* Adjust default compression parameters by re-parsing the options */\n  file_index = parse_switches(&dstinfo, argc, argv, 0, TRUE);\n\n  /* Specify data destination for compression */\n  jpeg_stdio_dest(&dstinfo, fp);\n\n  /* Start compressor (note no image data is actually written here) */\n  jpeg_write_coefficients(&dstinfo, dst_coef_arrays);\n\n  /* Copy to the output file any extra markers that we want to preserve */\n  jcopy_markers_execute(&srcinfo, &dstinfo, copyoption);\n\n  /* Execute image transformation, if any */\n#if TRANSFORMS_SUPPORTED\n  jtransform_execute_transformation(&srcinfo, &dstinfo,\n\t\t\t\t    src_coef_arrays,\n\t\t\t\t    &transformoption);\n#endif\n\n  /* Finish compression and release memory */\n  jpeg_finish_compress(&dstinfo);\n  jpeg_destroy_compress(&dstinfo);\n  (void) jpeg_finish_decompress(&srcinfo);\n  jpeg_destroy_decompress(&srcinfo);\n\n  /* Close output file, if we opened it */\n  if (fp != stdout)\n    fclose(fp);\n\n#ifdef PROGRESS_REPORT\n  end_progress_monitor((j_common_ptr) &dstinfo);\n#endif\n\n  /* All done. */\n  exit(jsrcerr.num_warnings + jdsterr.num_warnings ?EXIT_WARNING:EXIT_SUCCESS);\n  return 0;\t\t\t/* suppress no-return-value warnings */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jquant1.c",
    "content": "/*\n * jquant1.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * Modified 2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains 1-pass color quantization (color mapping) routines.\n * These routines provide mapping to a fixed color map using equally spaced\n * color values.  Optional Floyd-Steinberg or ordered dithering is available.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n#ifdef QUANT_1PASS_SUPPORTED\n\n\n/*\n * The main purpose of 1-pass quantization is to provide a fast, if not very\n * high quality, colormapped output capability.  A 2-pass quantizer usually\n * gives better visual quality; however, for quantized grayscale output this\n * quantizer is perfectly adequate.  Dithering is highly recommended with this\n * quantizer, though you can turn it off if you really want to.\n *\n * In 1-pass quantization the colormap must be chosen in advance of seeing the\n * image.  We use a map consisting of all combinations of Ncolors[i] color\n * values for the i'th component.  The Ncolors[] values are chosen so that\n * their product, the total number of colors, is no more than that requested.\n * (In most cases, the product will be somewhat less.)\n *\n * Since the colormap is orthogonal, the representative value for each color\n * component can be determined without considering the other components;\n * then these indexes can be combined into a colormap index by a standard\n * N-dimensional-array-subscript calculation.  Most of the arithmetic involved\n * can be precalculated and stored in the lookup table colorindex[].\n * colorindex[i][j] maps pixel value j in component i to the nearest\n * representative value (grid plane) for that component; this index is\n * multiplied by the array stride for component i, so that the\n * index of the colormap entry closest to a given pixel value is just\n *    sum( colorindex[component-number][pixel-component-value] )\n * Aside from being fast, this scheme allows for variable spacing between\n * representative values with no additional lookup cost.\n *\n * If gamma correction has been applied in color conversion, it might be wise\n * to adjust the color grid spacing so that the representative colors are\n * equidistant in linear space.  At this writing, gamma correction is not\n * implemented by jdcolor, so nothing is done here.\n */\n\n\n/* Declarations for ordered dithering.\n *\n * We use a standard 16x16 ordered dither array.  The basic concept of ordered\n * dithering is described in many references, for instance Dale Schumacher's\n * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991).\n * In place of Schumacher's comparisons against a \"threshold\" value, we add a\n * \"dither\" value to the input pixel and then round the result to the nearest\n * output value.  The dither value is equivalent to (0.5 - threshold) times\n * the distance between output values.  For ordered dithering, we assume that\n * the output colors are equally spaced; if not, results will probably be\n * worse, since the dither may be too much or too little at a given point.\n *\n * The normal calculation would be to form pixel value + dither, range-limit\n * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual.\n * We can skip the separate range-limiting step by extending the colorindex\n * table in both directions.\n */\n\n#define ODITHER_SIZE  16\t/* dimension of dither matrix */\n/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */\n#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE)\t/* # cells in matrix */\n#define ODITHER_MASK  (ODITHER_SIZE-1) /* mask for wrapping around counters */\n\ntypedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE];\ntypedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE];\n\nstatic const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = {\n  /* Bayer's order-4 dither array.  Generated by the code given in\n   * Stephen Hawley's article \"Ordered Dithering\" in Graphics Gems I.\n   * The values in this array must range from 0 to ODITHER_CELLS-1.\n   */\n  {   0,192, 48,240, 12,204, 60,252,  3,195, 51,243, 15,207, 63,255 },\n  { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 },\n  {  32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 },\n  { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 },\n  {   8,200, 56,248,  4,196, 52,244, 11,203, 59,251,  7,199, 55,247 },\n  { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 },\n  {  40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 },\n  { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 },\n  {   2,194, 50,242, 14,206, 62,254,  1,193, 49,241, 13,205, 61,253 },\n  { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 },\n  {  34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 },\n  { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 },\n  {  10,202, 58,250,  6,198, 54,246,  9,201, 57,249,  5,197, 53,245 },\n  { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 },\n  {  42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 },\n  { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 }\n};\n\n\n/* Declarations for Floyd-Steinberg dithering.\n *\n * Errors are accumulated into the array fserrors[], at a resolution of\n * 1/16th of a pixel count.  The error at a given pixel is propagated\n * to its not-yet-processed neighbors using the standard F-S fractions,\n *\t\t...\t(here)\t7/16\n *\t\t3/16\t5/16\t1/16\n * We work left-to-right on even rows, right-to-left on odd rows.\n *\n * We can get away with a single array (holding one row's worth of errors)\n * by using it to store the current row's errors at pixel columns not yet\n * processed, but the next row's errors at columns already processed.  We\n * need only a few extra variables to hold the errors immediately around the\n * current column.  (If we are lucky, those variables are in registers, but\n * even if not, they're probably cheaper to access than array elements are.)\n *\n * The fserrors[] array is indexed [component#][position].\n * We provide (#columns + 2) entries per component; the extra entry at each\n * end saves us from special-casing the first and last pixels.\n *\n * Note: on a wide image, we might not have enough room in a PC's near data\n * segment to hold the error array; so it is allocated with alloc_large.\n */\n\n#if BITS_IN_JSAMPLE == 8\ntypedef INT16 FSERROR;\t\t/* 16 bits should be enough */\ntypedef int LOCFSERROR;\t\t/* use 'int' for calculation temps */\n#else\ntypedef INT32 FSERROR;\t\t/* may need more than 16 bits */\ntypedef INT32 LOCFSERROR;\t/* be sure calculation temps are big enough */\n#endif\n\ntypedef FSERROR FAR *FSERRPTR;\t/* pointer to error array (in FAR storage!) */\n\n\n/* Private subobject */\n\n#define MAX_Q_COMPS 4\t\t/* max components I can handle */\n\ntypedef struct {\n  struct jpeg_color_quantizer pub; /* public fields */\n\n  /* Initially allocated colormap is saved here */\n  JSAMPARRAY sv_colormap;\t/* The color map as a 2-D pixel array */\n  int sv_actual;\t\t/* number of entries in use */\n\n  JSAMPARRAY colorindex;\t/* Precomputed mapping for speed */\n  /* colorindex[i][j] = index of color closest to pixel value j in component i,\n   * premultiplied as described above.  Since colormap indexes must fit into\n   * JSAMPLEs, the entries of this array will too.\n   */\n  boolean is_padded;\t\t/* is the colorindex padded for odither? */\n\n  int Ncolors[MAX_Q_COMPS];\t/* # of values alloced to each component */\n\n  /* Variables for ordered dithering */\n  int row_index;\t\t/* cur row's vertical index in dither matrix */\n  ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */\n\n  /* Variables for Floyd-Steinberg dithering */\n  FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */\n  boolean on_odd_row;\t\t/* flag to remember which row we are on */\n} my_cquantizer;\n\ntypedef my_cquantizer * my_cquantize_ptr;\n\n\n/*\n * Policy-making subroutines for create_colormap and create_colorindex.\n * These routines determine the colormap to be used.  The rest of the module\n * only assumes that the colormap is orthogonal.\n *\n *  * select_ncolors decides how to divvy up the available colors\n *    among the components.\n *  * output_value defines the set of representative values for a component.\n *  * largest_input_value defines the mapping from input values to\n *    representative values for a component.\n * Note that the latter two routines may impose different policies for\n * different components, though this is not currently done.\n */\n\n\nLOCAL(int)\nselect_ncolors (j_decompress_ptr cinfo, int Ncolors[])\n/* Determine allocation of desired colors to components, */\n/* and fill in Ncolors[] array to indicate choice. */\n/* Return value is total number of colors (product of Ncolors[] values). */\n{\n  int nc = cinfo->out_color_components; /* number of color components */\n  int max_colors = cinfo->desired_number_of_colors;\n  int total_colors, iroot, i, j;\n  boolean changed;\n  long temp;\n  static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE };\n\n  /* We can allocate at least the nc'th root of max_colors per component. */\n  /* Compute floor(nc'th root of max_colors). */\n  iroot = 1;\n  do {\n    iroot++;\n    temp = iroot;\t\t/* set temp = iroot ** nc */\n    for (i = 1; i < nc; i++)\n      temp *= iroot;\n  } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */\n  iroot--;\t\t\t/* now iroot = floor(root) */\n\n  /* Must have at least 2 color values per component */\n  if (iroot < 2)\n    ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp);\n\n  /* Initialize to iroot color values for each component */\n  total_colors = 1;\n  for (i = 0; i < nc; i++) {\n    Ncolors[i] = iroot;\n    total_colors *= iroot;\n  }\n  /* We may be able to increment the count for one or more components without\n   * exceeding max_colors, though we know not all can be incremented.\n   * Sometimes, the first component can be incremented more than once!\n   * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.)\n   * In RGB colorspace, try to increment G first, then R, then B.\n   */\n  do {\n    changed = FALSE;\n    for (i = 0; i < nc; i++) {\n      j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i);\n      /* calculate new total_colors if Ncolors[j] is incremented */\n      temp = total_colors / Ncolors[j];\n      temp *= Ncolors[j]+1;\t/* done in long arith to avoid oflo */\n      if (temp > (long) max_colors)\n\tbreak;\t\t\t/* won't fit, done with this pass */\n      Ncolors[j]++;\t\t/* OK, apply the increment */\n      total_colors = (int) temp;\n      changed = TRUE;\n    }\n  } while (changed);\n\n  return total_colors;\n}\n\n\nLOCAL(int)\noutput_value (j_decompress_ptr cinfo, int ci, int j, int maxj)\n/* Return j'th output value, where j will range from 0 to maxj */\n/* The output values must fall in 0..MAXJSAMPLE in increasing order */\n{\n  /* We always provide values 0 and MAXJSAMPLE for each component;\n   * any additional values are equally spaced between these limits.\n   * (Forcing the upper and lower values to the limits ensures that\n   * dithering can't produce a color outside the selected gamut.)\n   */\n  return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj);\n}\n\n\nLOCAL(int)\nlargest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj)\n/* Return largest input value that should map to j'th output value */\n/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */\n{\n  /* Breakpoints are halfway between values returned by output_value */\n  return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj));\n}\n\n\n/*\n * Create the colormap.\n */\n\nLOCAL(void)\ncreate_colormap (j_decompress_ptr cinfo)\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  JSAMPARRAY colormap;\t\t/* Created colormap */\n  int total_colors;\t\t/* Number of distinct output colors */\n  int i,j,k, nci, blksize, blkdist, ptr, val;\n\n  /* Select number of colors for each component */\n  total_colors = select_ncolors(cinfo, cquantize->Ncolors);\n\n  /* Report selected color counts */\n  if (cinfo->out_color_components == 3)\n    TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS,\n\t     total_colors, cquantize->Ncolors[0],\n\t     cquantize->Ncolors[1], cquantize->Ncolors[2]);\n  else\n    TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors);\n\n  /* Allocate and fill in the colormap. */\n  /* The colors are ordered in the map in standard row-major order, */\n  /* i.e. rightmost (highest-indexed) color changes most rapidly. */\n\n  colormap = (*cinfo->mem->alloc_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE,\n     (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components);\n\n  /* blksize is number of adjacent repeated entries for a component */\n  /* blkdist is distance between groups of identical entries for a component */\n  blkdist = total_colors;\n\n  for (i = 0; i < cinfo->out_color_components; i++) {\n    /* fill in colormap entries for i'th color component */\n    nci = cquantize->Ncolors[i]; /* # of distinct values for this color */\n    blksize = blkdist / nci;\n    for (j = 0; j < nci; j++) {\n      /* Compute j'th output value (out of nci) for component */\n      val = output_value(cinfo, i, j, nci-1);\n      /* Fill in all colormap entries that have this value of this component */\n      for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) {\n\t/* fill in blksize entries beginning at ptr */\n\tfor (k = 0; k < blksize; k++)\n\t  colormap[i][ptr+k] = (JSAMPLE) val;\n      }\n    }\n    blkdist = blksize;\t\t/* blksize of this color is blkdist of next */\n  }\n\n  /* Save the colormap in private storage,\n   * where it will survive color quantization mode changes.\n   */\n  cquantize->sv_colormap = colormap;\n  cquantize->sv_actual = total_colors;\n}\n\n\n/*\n * Create the color index table.\n */\n\nLOCAL(void)\ncreate_colorindex (j_decompress_ptr cinfo)\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  JSAMPROW indexptr;\n  int i,j,k, nci, blksize, val, pad;\n\n  /* For ordered dither, we pad the color index tables by MAXJSAMPLE in\n   * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE).\n   * This is not necessary in the other dithering modes.  However, we\n   * flag whether it was done in case user changes dithering mode.\n   */\n  if (cinfo->dither_mode == JDITHER_ORDERED) {\n    pad = MAXJSAMPLE*2;\n    cquantize->is_padded = TRUE;\n  } else {\n    pad = 0;\n    cquantize->is_padded = FALSE;\n  }\n\n  cquantize->colorindex = (*cinfo->mem->alloc_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE,\n     (JDIMENSION) (MAXJSAMPLE+1 + pad),\n     (JDIMENSION) cinfo->out_color_components);\n\n  /* blksize is number of adjacent repeated entries for a component */\n  blksize = cquantize->sv_actual;\n\n  for (i = 0; i < cinfo->out_color_components; i++) {\n    /* fill in colorindex entries for i'th color component */\n    nci = cquantize->Ncolors[i]; /* # of distinct values for this color */\n    blksize = blksize / nci;\n\n    /* adjust colorindex pointers to provide padding at negative indexes. */\n    if (pad)\n      cquantize->colorindex[i] += MAXJSAMPLE;\n\n    /* in loop, val = index of current output value, */\n    /* and k = largest j that maps to current val */\n    indexptr = cquantize->colorindex[i];\n    val = 0;\n    k = largest_input_value(cinfo, i, 0, nci-1);\n    for (j = 0; j <= MAXJSAMPLE; j++) {\n      while (j > k)\t\t/* advance val if past boundary */\n\tk = largest_input_value(cinfo, i, ++val, nci-1);\n      /* premultiply so that no multiplication needed in main processing */\n      indexptr[j] = (JSAMPLE) (val * blksize);\n    }\n    /* Pad at both ends if necessary */\n    if (pad)\n      for (j = 1; j <= MAXJSAMPLE; j++) {\n\tindexptr[-j] = indexptr[0];\n\tindexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE];\n      }\n  }\n}\n\n\n/*\n * Create an ordered-dither array for a component having ncolors\n * distinct output values.\n */\n\nLOCAL(ODITHER_MATRIX_PTR)\nmake_odither_array (j_decompress_ptr cinfo, int ncolors)\n{\n  ODITHER_MATRIX_PTR odither;\n  int j,k;\n  INT32 num,den;\n\n  odither = (ODITHER_MATRIX_PTR)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(ODITHER_MATRIX));\n  /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1).\n   * Hence the dither value for the matrix cell with fill order f\n   * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1).\n   * On 16-bit-int machine, be careful to avoid overflow.\n   */\n  den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1));\n  for (j = 0; j < ODITHER_SIZE; j++) {\n    for (k = 0; k < ODITHER_SIZE; k++) {\n      num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k])))\n\t    * MAXJSAMPLE;\n      /* Ensure round towards zero despite C's lack of consistency\n       * about rounding negative values in integer division...\n       */\n      odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den);\n    }\n  }\n  return odither;\n}\n\n\n/*\n * Create the ordered-dither tables.\n * Components having the same number of representative colors may \n * share a dither table.\n */\n\nLOCAL(void)\ncreate_odither_tables (j_decompress_ptr cinfo)\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  ODITHER_MATRIX_PTR odither;\n  int i, j, nci;\n\n  for (i = 0; i < cinfo->out_color_components; i++) {\n    nci = cquantize->Ncolors[i]; /* # of distinct values for this color */\n    odither = NULL;\t\t/* search for matching prior component */\n    for (j = 0; j < i; j++) {\n      if (nci == cquantize->Ncolors[j]) {\n\todither = cquantize->odither[j];\n\tbreak;\n      }\n    }\n    if (odither == NULL)\t/* need a new table? */\n      odither = make_odither_array(cinfo, nci);\n    cquantize->odither[i] = odither;\n  }\n}\n\n\n/*\n * Map some rows of pixels to the output colormapped representation.\n */\n\nMETHODDEF(void)\ncolor_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,\n\t\tJSAMPARRAY output_buf, int num_rows)\n/* General case, no dithering */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  JSAMPARRAY colorindex = cquantize->colorindex;\n  register int pixcode, ci;\n  register JSAMPROW ptrin, ptrout;\n  int row;\n  JDIMENSION col;\n  JDIMENSION width = cinfo->output_width;\n  register int nc = cinfo->out_color_components;\n\n  for (row = 0; row < num_rows; row++) {\n    ptrin = input_buf[row];\n    ptrout = output_buf[row];\n    for (col = width; col > 0; col--) {\n      pixcode = 0;\n      for (ci = 0; ci < nc; ci++) {\n\tpixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]);\n      }\n      *ptrout++ = (JSAMPLE) pixcode;\n    }\n  }\n}\n\n\nMETHODDEF(void)\ncolor_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf,\n\t\t JSAMPARRAY output_buf, int num_rows)\n/* Fast path for out_color_components==3, no dithering */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  register int pixcode;\n  register JSAMPROW ptrin, ptrout;\n  JSAMPROW colorindex0 = cquantize->colorindex[0];\n  JSAMPROW colorindex1 = cquantize->colorindex[1];\n  JSAMPROW colorindex2 = cquantize->colorindex[2];\n  int row;\n  JDIMENSION col;\n  JDIMENSION width = cinfo->output_width;\n\n  for (row = 0; row < num_rows; row++) {\n    ptrin = input_buf[row];\n    ptrout = output_buf[row];\n    for (col = width; col > 0; col--) {\n      pixcode  = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]);\n      pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]);\n      pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]);\n      *ptrout++ = (JSAMPLE) pixcode;\n    }\n  }\n}\n\n\nMETHODDEF(void)\nquantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,\n\t\t     JSAMPARRAY output_buf, int num_rows)\n/* General case, with ordered dithering */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  register JSAMPROW input_ptr;\n  register JSAMPROW output_ptr;\n  JSAMPROW colorindex_ci;\n  int * dither;\t\t\t/* points to active row of dither matrix */\n  int row_index, col_index;\t/* current indexes into dither matrix */\n  int nc = cinfo->out_color_components;\n  int ci;\n  int row;\n  JDIMENSION col;\n  JDIMENSION width = cinfo->output_width;\n\n  for (row = 0; row < num_rows; row++) {\n    /* Initialize output values to 0 so can process components separately */\n    FMEMZERO((void FAR *) output_buf[row],\n\t     (size_t) (width * SIZEOF(JSAMPLE)));\n    row_index = cquantize->row_index;\n    for (ci = 0; ci < nc; ci++) {\n      input_ptr = input_buf[row] + ci;\n      output_ptr = output_buf[row];\n      colorindex_ci = cquantize->colorindex[ci];\n      dither = cquantize->odither[ci][row_index];\n      col_index = 0;\n\n      for (col = width; col > 0; col--) {\n\t/* Form pixel value + dither, range-limit to 0..MAXJSAMPLE,\n\t * select output value, accumulate into output code for this pixel.\n\t * Range-limiting need not be done explicitly, as we have extended\n\t * the colorindex table to produce the right answers for out-of-range\n\t * inputs.  The maximum dither is +- MAXJSAMPLE; this sets the\n\t * required amount of padding.\n\t */\n\t*output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]];\n\tinput_ptr += nc;\n\toutput_ptr++;\n\tcol_index = (col_index + 1) & ODITHER_MASK;\n      }\n    }\n    /* Advance row index for next row */\n    row_index = (row_index + 1) & ODITHER_MASK;\n    cquantize->row_index = row_index;\n  }\n}\n\n\nMETHODDEF(void)\nquantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,\n\t\t      JSAMPARRAY output_buf, int num_rows)\n/* Fast path for out_color_components==3, with ordered dithering */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  register int pixcode;\n  register JSAMPROW input_ptr;\n  register JSAMPROW output_ptr;\n  JSAMPROW colorindex0 = cquantize->colorindex[0];\n  JSAMPROW colorindex1 = cquantize->colorindex[1];\n  JSAMPROW colorindex2 = cquantize->colorindex[2];\n  int * dither0;\t\t/* points to active row of dither matrix */\n  int * dither1;\n  int * dither2;\n  int row_index, col_index;\t/* current indexes into dither matrix */\n  int row;\n  JDIMENSION col;\n  JDIMENSION width = cinfo->output_width;\n\n  for (row = 0; row < num_rows; row++) {\n    row_index = cquantize->row_index;\n    input_ptr = input_buf[row];\n    output_ptr = output_buf[row];\n    dither0 = cquantize->odither[0][row_index];\n    dither1 = cquantize->odither[1][row_index];\n    dither2 = cquantize->odither[2][row_index];\n    col_index = 0;\n\n    for (col = width; col > 0; col--) {\n      pixcode  = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) +\n\t\t\t\t\tdither0[col_index]]);\n      pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) +\n\t\t\t\t\tdither1[col_index]]);\n      pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) +\n\t\t\t\t\tdither2[col_index]]);\n      *output_ptr++ = (JSAMPLE) pixcode;\n      col_index = (col_index + 1) & ODITHER_MASK;\n    }\n    row_index = (row_index + 1) & ODITHER_MASK;\n    cquantize->row_index = row_index;\n  }\n}\n\n\nMETHODDEF(void)\nquantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,\n\t\t    JSAMPARRAY output_buf, int num_rows)\n/* General case, with Floyd-Steinberg dithering */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  register LOCFSERROR cur;\t/* current error or pixel value */\n  LOCFSERROR belowerr;\t\t/* error for pixel below cur */\n  LOCFSERROR bpreverr;\t\t/* error for below/prev col */\n  LOCFSERROR bnexterr;\t\t/* error for below/next col */\n  LOCFSERROR delta;\n  register FSERRPTR errorptr;\t/* => fserrors[] at column before current */\n  register JSAMPROW input_ptr;\n  register JSAMPROW output_ptr;\n  JSAMPROW colorindex_ci;\n  JSAMPROW colormap_ci;\n  int pixcode;\n  int nc = cinfo->out_color_components;\n  int dir;\t\t\t/* 1 for left-to-right, -1 for right-to-left */\n  int dirnc;\t\t\t/* dir * nc */\n  int ci;\n  int row;\n  JDIMENSION col;\n  JDIMENSION width = cinfo->output_width;\n  JSAMPLE *range_limit = cinfo->sample_range_limit;\n  SHIFT_TEMPS\n\n  for (row = 0; row < num_rows; row++) {\n    /* Initialize output values to 0 so can process components separately */\n    FMEMZERO((void FAR *) output_buf[row],\n\t     (size_t) (width * SIZEOF(JSAMPLE)));\n    for (ci = 0; ci < nc; ci++) {\n      input_ptr = input_buf[row] + ci;\n      output_ptr = output_buf[row];\n      if (cquantize->on_odd_row) {\n\t/* work right to left in this row */\n\tinput_ptr += (width-1) * nc; /* so point to rightmost pixel */\n\toutput_ptr += width-1;\n\tdir = -1;\n\tdirnc = -nc;\n\terrorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */\n      } else {\n\t/* work left to right in this row */\n\tdir = 1;\n\tdirnc = nc;\n\terrorptr = cquantize->fserrors[ci]; /* => entry before first column */\n      }\n      colorindex_ci = cquantize->colorindex[ci];\n      colormap_ci = cquantize->sv_colormap[ci];\n      /* Preset error values: no error propagated to first pixel from left */\n      cur = 0;\n      /* and no error propagated to row below yet */\n      belowerr = bpreverr = 0;\n\n      for (col = width; col > 0; col--) {\n\t/* cur holds the error propagated from the previous pixel on the\n\t * current line.  Add the error propagated from the previous line\n\t * to form the complete error correction term for this pixel, and\n\t * round the error term (which is expressed * 16) to an integer.\n\t * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct\n\t * for either sign of the error value.\n\t * Note: errorptr points to *previous* column's array entry.\n\t */\n\tcur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4);\n\t/* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.\n\t * The maximum error is +- MAXJSAMPLE; this sets the required size\n\t * of the range_limit array.\n\t */\n\tcur += GETJSAMPLE(*input_ptr);\n\tcur = GETJSAMPLE(range_limit[cur]);\n\t/* Select output value, accumulate into output code for this pixel */\n\tpixcode = GETJSAMPLE(colorindex_ci[cur]);\n\t*output_ptr += (JSAMPLE) pixcode;\n\t/* Compute actual representation error at this pixel */\n\t/* Note: we can do this even though we don't have the final */\n\t/* pixel code, because the colormap is orthogonal. */\n\tcur -= GETJSAMPLE(colormap_ci[pixcode]);\n\t/* Compute error fractions to be propagated to adjacent pixels.\n\t * Add these into the running sums, and simultaneously shift the\n\t * next-line error sums left by 1 column.\n\t */\n\tbnexterr = cur;\n\tdelta = cur * 2;\n\tcur += delta;\t\t/* form error * 3 */\n\terrorptr[0] = (FSERROR) (bpreverr + cur);\n\tcur += delta;\t\t/* form error * 5 */\n\tbpreverr = belowerr + cur;\n\tbelowerr = bnexterr;\n\tcur += delta;\t\t/* form error * 7 */\n\t/* At this point cur contains the 7/16 error value to be propagated\n\t * to the next pixel on the current line, and all the errors for the\n\t * next line have been shifted over. We are therefore ready to move on.\n\t */\n\tinput_ptr += dirnc;\t/* advance input ptr to next column */\n\toutput_ptr += dir;\t/* advance output ptr to next column */\n\terrorptr += dir;\t/* advance errorptr to current column */\n      }\n      /* Post-loop cleanup: we must unload the final error value into the\n       * final fserrors[] entry.  Note we need not unload belowerr because\n       * it is for the dummy column before or after the actual array.\n       */\n      errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */\n    }\n    cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE);\n  }\n}\n\n\n/*\n * Allocate workspace for Floyd-Steinberg errors.\n */\n\nLOCAL(void)\nalloc_fs_workspace (j_decompress_ptr cinfo)\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  size_t arraysize;\n  int i;\n\n  arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));\n  for (i = 0; i < cinfo->out_color_components; i++) {\n    cquantize->fserrors[i] = (FSERRPTR)\n      (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);\n  }\n}\n\n\n/*\n * Initialize for one-pass color quantization.\n */\n\nMETHODDEF(void)\nstart_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan)\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  size_t arraysize;\n  int i;\n\n  /* Install my colormap. */\n  cinfo->colormap = cquantize->sv_colormap;\n  cinfo->actual_number_of_colors = cquantize->sv_actual;\n\n  /* Initialize for desired dithering mode. */\n  switch (cinfo->dither_mode) {\n  case JDITHER_NONE:\n    if (cinfo->out_color_components == 3)\n      cquantize->pub.color_quantize = color_quantize3;\n    else\n      cquantize->pub.color_quantize = color_quantize;\n    break;\n  case JDITHER_ORDERED:\n    if (cinfo->out_color_components == 3)\n      cquantize->pub.color_quantize = quantize3_ord_dither;\n    else\n      cquantize->pub.color_quantize = quantize_ord_dither;\n    cquantize->row_index = 0;\t/* initialize state for ordered dither */\n    /* If user changed to ordered dither from another mode,\n     * we must recreate the color index table with padding.\n     * This will cost extra space, but probably isn't very likely.\n     */\n    if (! cquantize->is_padded)\n      create_colorindex(cinfo);\n    /* Create ordered-dither tables if we didn't already. */\n    if (cquantize->odither[0] == NULL)\n      create_odither_tables(cinfo);\n    break;\n  case JDITHER_FS:\n    cquantize->pub.color_quantize = quantize_fs_dither;\n    cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */\n    /* Allocate Floyd-Steinberg workspace if didn't already. */\n    if (cquantize->fserrors[0] == NULL)\n      alloc_fs_workspace(cinfo);\n    /* Initialize the propagated errors to zero. */\n    arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));\n    for (i = 0; i < cinfo->out_color_components; i++)\n      FMEMZERO((void FAR *) cquantize->fserrors[i], arraysize);\n    break;\n  default:\n    ERREXIT(cinfo, JERR_NOT_COMPILED);\n    break;\n  }\n}\n\n\n/*\n * Finish up at the end of the pass.\n */\n\nMETHODDEF(void)\nfinish_pass_1_quant (j_decompress_ptr cinfo)\n{\n  /* no work in 1-pass case */\n}\n\n\n/*\n * Switch to a new external colormap between output passes.\n * Shouldn't get to this module!\n */\n\nMETHODDEF(void)\nnew_color_map_1_quant (j_decompress_ptr cinfo)\n{\n  ERREXIT(cinfo, JERR_MODE_CHANGE);\n}\n\n\n/*\n * Module initialization routine for 1-pass color quantization.\n */\n\nGLOBAL(void)\njinit_1pass_quantizer (j_decompress_ptr cinfo)\n{\n  my_cquantize_ptr cquantize;\n\n  cquantize = (my_cquantize_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_cquantizer));\n  cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;\n  cquantize->pub.start_pass = start_pass_1_quant;\n  cquantize->pub.finish_pass = finish_pass_1_quant;\n  cquantize->pub.new_color_map = new_color_map_1_quant;\n  cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */\n  cquantize->odither[0] = NULL;\t/* Also flag odither arrays not allocated */\n\n  /* Make sure my internal arrays won't overflow */\n  if (cinfo->out_color_components > MAX_Q_COMPS)\n    ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS);\n  /* Make sure colormap indexes can be represented by JSAMPLEs */\n  if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1))\n    ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1);\n\n  /* Create the colormap and color index table. */\n  create_colormap(cinfo);\n  create_colorindex(cinfo);\n\n  /* Allocate Floyd-Steinberg workspace now if requested.\n   * We do this now since it is FAR storage and may affect the memory\n   * manager's space calculations.  If the user changes to FS dither\n   * mode in a later pass, we will allocate the space then, and will\n   * possibly overrun the max_memory_to_use setting.\n   */\n  if (cinfo->dither_mode == JDITHER_FS)\n    alloc_fs_workspace(cinfo);\n}\n\n#endif /* QUANT_1PASS_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jquant2.c",
    "content": "/*\n * jquant2.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * Modified 2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains 2-pass color quantization (color mapping) routines.\n * These routines provide selection of a custom color map for an image,\n * followed by mapping of the image to that color map, with optional\n * Floyd-Steinberg dithering.\n * It is also possible to use just the second pass to map to an arbitrary\n * externally-given color map.\n *\n * Note: ordered dithering is not supported, since there isn't any fast\n * way to compute intercolor distances; it's unclear that ordered dither's\n * fundamental assumptions even hold with an irregularly spaced color map.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n#ifdef QUANT_2PASS_SUPPORTED\n\n\n/*\n * This module implements the well-known Heckbert paradigm for color\n * quantization.  Most of the ideas used here can be traced back to\n * Heckbert's seminal paper\n *   Heckbert, Paul.  \"Color Image Quantization for Frame Buffer Display\",\n *   Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304.\n *\n * In the first pass over the image, we accumulate a histogram showing the\n * usage count of each possible color.  To keep the histogram to a reasonable\n * size, we reduce the precision of the input; typical practice is to retain\n * 5 or 6 bits per color, so that 8 or 4 different input values are counted\n * in the same histogram cell.\n *\n * Next, the color-selection step begins with a box representing the whole\n * color space, and repeatedly splits the \"largest\" remaining box until we\n * have as many boxes as desired colors.  Then the mean color in each\n * remaining box becomes one of the possible output colors.\n * \n * The second pass over the image maps each input pixel to the closest output\n * color (optionally after applying a Floyd-Steinberg dithering correction).\n * This mapping is logically trivial, but making it go fast enough requires\n * considerable care.\n *\n * Heckbert-style quantizers vary a good deal in their policies for choosing\n * the \"largest\" box and deciding where to cut it.  The particular policies\n * used here have proved out well in experimental comparisons, but better ones\n * may yet be found.\n *\n * In earlier versions of the IJG code, this module quantized in YCbCr color\n * space, processing the raw upsampled data without a color conversion step.\n * This allowed the color conversion math to be done only once per colormap\n * entry, not once per pixel.  However, that optimization precluded other\n * useful optimizations (such as merging color conversion with upsampling)\n * and it also interfered with desired capabilities such as quantizing to an\n * externally-supplied colormap.  We have therefore abandoned that approach.\n * The present code works in the post-conversion color space, typically RGB.\n *\n * To improve the visual quality of the results, we actually work in scaled\n * RGB space, giving G distances more weight than R, and R in turn more than\n * B.  To do everything in integer math, we must use integer scale factors.\n * The 2/3/1 scale factors used here correspond loosely to the relative\n * weights of the colors in the NTSC grayscale equation.\n * If you want to use this code to quantize a non-RGB color space, you'll\n * probably need to change these scale factors.\n */\n\n#define R_SCALE 2\t\t/* scale R distances by this much */\n#define G_SCALE 3\t\t/* scale G distances by this much */\n#define B_SCALE 1\t\t/* and B by this much */\n\n/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined\n * in jmorecfg.h.  As the code stands, it will do the right thing for R,G,B\n * and B,G,R orders.  If you define some other weird order in jmorecfg.h,\n * you'll get compile errors until you extend this logic.  In that case\n * you'll probably want to tweak the histogram sizes too.\n */\n\n#if RGB_RED == 0\n#define C0_SCALE R_SCALE\n#endif\n#if RGB_BLUE == 0\n#define C0_SCALE B_SCALE\n#endif\n#if RGB_GREEN == 1\n#define C1_SCALE G_SCALE\n#endif\n#if RGB_RED == 2\n#define C2_SCALE R_SCALE\n#endif\n#if RGB_BLUE == 2\n#define C2_SCALE B_SCALE\n#endif\n\n\n/*\n * First we have the histogram data structure and routines for creating it.\n *\n * The number of bits of precision can be adjusted by changing these symbols.\n * We recommend keeping 6 bits for G and 5 each for R and B.\n * If you have plenty of memory and cycles, 6 bits all around gives marginally\n * better results; if you are short of memory, 5 bits all around will save\n * some space but degrade the results.\n * To maintain a fully accurate histogram, we'd need to allocate a \"long\"\n * (preferably unsigned long) for each cell.  In practice this is overkill;\n * we can get by with 16 bits per cell.  Few of the cell counts will overflow,\n * and clamping those that do overflow to the maximum value will give close-\n * enough results.  This reduces the recommended histogram size from 256Kb\n * to 128Kb, which is a useful savings on PC-class machines.\n * (In the second pass the histogram space is re-used for pixel mapping data;\n * in that capacity, each cell must be able to store zero to the number of\n * desired colors.  16 bits/cell is plenty for that too.)\n * Since the JPEG code is intended to run in small memory model on 80x86\n * machines, we can't just allocate the histogram in one chunk.  Instead\n * of a true 3-D array, we use a row of pointers to 2-D arrays.  Each\n * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and\n * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries.  Note that\n * on 80x86 machines, the pointer row is in near memory but the actual\n * arrays are in far memory (same arrangement as we use for image arrays).\n */\n\n#define MAXNUMCOLORS  (MAXJSAMPLE+1) /* maximum size of colormap */\n\n/* These will do the right thing for either R,G,B or B,G,R color order,\n * but you may not like the results for other color orders.\n */\n#define HIST_C0_BITS  5\t\t/* bits of precision in R/B histogram */\n#define HIST_C1_BITS  6\t\t/* bits of precision in G histogram */\n#define HIST_C2_BITS  5\t\t/* bits of precision in B/R histogram */\n\n/* Number of elements along histogram axes. */\n#define HIST_C0_ELEMS  (1<<HIST_C0_BITS)\n#define HIST_C1_ELEMS  (1<<HIST_C1_BITS)\n#define HIST_C2_ELEMS  (1<<HIST_C2_BITS)\n\n/* These are the amounts to shift an input value to get a histogram index. */\n#define C0_SHIFT  (BITS_IN_JSAMPLE-HIST_C0_BITS)\n#define C1_SHIFT  (BITS_IN_JSAMPLE-HIST_C1_BITS)\n#define C2_SHIFT  (BITS_IN_JSAMPLE-HIST_C2_BITS)\n\n\ntypedef UINT16 histcell;\t/* histogram cell; prefer an unsigned type */\n\ntypedef histcell FAR * histptr;\t/* for pointers to histogram cells */\n\ntypedef histcell hist1d[HIST_C2_ELEMS]; /* typedefs for the array */\ntypedef hist1d FAR * hist2d;\t/* type for the 2nd-level pointers */\ntypedef hist2d * hist3d;\t/* type for top-level pointer */\n\n\n/* Declarations for Floyd-Steinberg dithering.\n *\n * Errors are accumulated into the array fserrors[], at a resolution of\n * 1/16th of a pixel count.  The error at a given pixel is propagated\n * to its not-yet-processed neighbors using the standard F-S fractions,\n *\t\t...\t(here)\t7/16\n *\t\t3/16\t5/16\t1/16\n * We work left-to-right on even rows, right-to-left on odd rows.\n *\n * We can get away with a single array (holding one row's worth of errors)\n * by using it to store the current row's errors at pixel columns not yet\n * processed, but the next row's errors at columns already processed.  We\n * need only a few extra variables to hold the errors immediately around the\n * current column.  (If we are lucky, those variables are in registers, but\n * even if not, they're probably cheaper to access than array elements are.)\n *\n * The fserrors[] array has (#columns + 2) entries; the extra entry at\n * each end saves us from special-casing the first and last pixels.\n * Each entry is three values long, one value for each color component.\n *\n * Note: on a wide image, we might not have enough room in a PC's near data\n * segment to hold the error array; so it is allocated with alloc_large.\n */\n\n#if BITS_IN_JSAMPLE == 8\ntypedef INT16 FSERROR;\t\t/* 16 bits should be enough */\ntypedef int LOCFSERROR;\t\t/* use 'int' for calculation temps */\n#else\ntypedef INT32 FSERROR;\t\t/* may need more than 16 bits */\ntypedef INT32 LOCFSERROR;\t/* be sure calculation temps are big enough */\n#endif\n\ntypedef FSERROR FAR *FSERRPTR;\t/* pointer to error array (in FAR storage!) */\n\n\n/* Private subobject */\n\ntypedef struct {\n  struct jpeg_color_quantizer pub; /* public fields */\n\n  /* Space for the eventually created colormap is stashed here */\n  JSAMPARRAY sv_colormap;\t/* colormap allocated at init time */\n  int desired;\t\t\t/* desired # of colors = size of colormap */\n\n  /* Variables for accumulating image statistics */\n  hist3d histogram;\t\t/* pointer to the histogram */\n\n  boolean needs_zeroed;\t\t/* TRUE if next pass must zero histogram */\n\n  /* Variables for Floyd-Steinberg dithering */\n  FSERRPTR fserrors;\t\t/* accumulated errors */\n  boolean on_odd_row;\t\t/* flag to remember which row we are on */\n  int * error_limiter;\t\t/* table for clamping the applied error */\n} my_cquantizer;\n\ntypedef my_cquantizer * my_cquantize_ptr;\n\n\n/*\n * Prescan some rows of pixels.\n * In this module the prescan simply updates the histogram, which has been\n * initialized to zeroes by start_pass.\n * An output_buf parameter is required by the method signature, but no data\n * is actually output (in fact the buffer controller is probably passing a\n * NULL pointer).\n */\n\nMETHODDEF(void)\nprescan_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,\n\t\t  JSAMPARRAY output_buf, int num_rows)\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  register JSAMPROW ptr;\n  register histptr histp;\n  register hist3d histogram = cquantize->histogram;\n  int row;\n  JDIMENSION col;\n  JDIMENSION width = cinfo->output_width;\n\n  for (row = 0; row < num_rows; row++) {\n    ptr = input_buf[row];\n    for (col = width; col > 0; col--) {\n      /* get pixel value and index into the histogram */\n      histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT]\n\t\t\t [GETJSAMPLE(ptr[1]) >> C1_SHIFT]\n\t\t\t [GETJSAMPLE(ptr[2]) >> C2_SHIFT];\n      /* increment, check for overflow and undo increment if so. */\n      if (++(*histp) <= 0)\n\t(*histp)--;\n      ptr += 3;\n    }\n  }\n}\n\n\n/*\n * Next we have the really interesting routines: selection of a colormap\n * given the completed histogram.\n * These routines work with a list of \"boxes\", each representing a rectangular\n * subset of the input color space (to histogram precision).\n */\n\ntypedef struct {\n  /* The bounds of the box (inclusive); expressed as histogram indexes */\n  int c0min, c0max;\n  int c1min, c1max;\n  int c2min, c2max;\n  /* The volume (actually 2-norm) of the box */\n  INT32 volume;\n  /* The number of nonzero histogram cells within this box */\n  long colorcount;\n} box;\n\ntypedef box * boxptr;\n\n\nLOCAL(boxptr)\nfind_biggest_color_pop (boxptr boxlist, int numboxes)\n/* Find the splittable box with the largest color population */\n/* Returns NULL if no splittable boxes remain */\n{\n  register boxptr boxp;\n  register int i;\n  register long maxc = 0;\n  boxptr which = NULL;\n  \n  for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {\n    if (boxp->colorcount > maxc && boxp->volume > 0) {\n      which = boxp;\n      maxc = boxp->colorcount;\n    }\n  }\n  return which;\n}\n\n\nLOCAL(boxptr)\nfind_biggest_volume (boxptr boxlist, int numboxes)\n/* Find the splittable box with the largest (scaled) volume */\n/* Returns NULL if no splittable boxes remain */\n{\n  register boxptr boxp;\n  register int i;\n  register INT32 maxv = 0;\n  boxptr which = NULL;\n  \n  for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {\n    if (boxp->volume > maxv) {\n      which = boxp;\n      maxv = boxp->volume;\n    }\n  }\n  return which;\n}\n\n\nLOCAL(void)\nupdate_box (j_decompress_ptr cinfo, boxptr boxp)\n/* Shrink the min/max bounds of a box to enclose only nonzero elements, */\n/* and recompute its volume and population */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  hist3d histogram = cquantize->histogram;\n  histptr histp;\n  int c0,c1,c2;\n  int c0min,c0max,c1min,c1max,c2min,c2max;\n  INT32 dist0,dist1,dist2;\n  long ccount;\n  \n  c0min = boxp->c0min;  c0max = boxp->c0max;\n  c1min = boxp->c1min;  c1max = boxp->c1max;\n  c2min = boxp->c2min;  c2max = boxp->c2max;\n  \n  if (c0max > c0min)\n    for (c0 = c0min; c0 <= c0max; c0++)\n      for (c1 = c1min; c1 <= c1max; c1++) {\n\thistp = & histogram[c0][c1][c2min];\n\tfor (c2 = c2min; c2 <= c2max; c2++)\n\t  if (*histp++ != 0) {\n\t    boxp->c0min = c0min = c0;\n\t    goto have_c0min;\n\t  }\n      }\n have_c0min:\n  if (c0max > c0min)\n    for (c0 = c0max; c0 >= c0min; c0--)\n      for (c1 = c1min; c1 <= c1max; c1++) {\n\thistp = & histogram[c0][c1][c2min];\n\tfor (c2 = c2min; c2 <= c2max; c2++)\n\t  if (*histp++ != 0) {\n\t    boxp->c0max = c0max = c0;\n\t    goto have_c0max;\n\t  }\n      }\n have_c0max:\n  if (c1max > c1min)\n    for (c1 = c1min; c1 <= c1max; c1++)\n      for (c0 = c0min; c0 <= c0max; c0++) {\n\thistp = & histogram[c0][c1][c2min];\n\tfor (c2 = c2min; c2 <= c2max; c2++)\n\t  if (*histp++ != 0) {\n\t    boxp->c1min = c1min = c1;\n\t    goto have_c1min;\n\t  }\n      }\n have_c1min:\n  if (c1max > c1min)\n    for (c1 = c1max; c1 >= c1min; c1--)\n      for (c0 = c0min; c0 <= c0max; c0++) {\n\thistp = & histogram[c0][c1][c2min];\n\tfor (c2 = c2min; c2 <= c2max; c2++)\n\t  if (*histp++ != 0) {\n\t    boxp->c1max = c1max = c1;\n\t    goto have_c1max;\n\t  }\n      }\n have_c1max:\n  if (c2max > c2min)\n    for (c2 = c2min; c2 <= c2max; c2++)\n      for (c0 = c0min; c0 <= c0max; c0++) {\n\thistp = & histogram[c0][c1min][c2];\n\tfor (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)\n\t  if (*histp != 0) {\n\t    boxp->c2min = c2min = c2;\n\t    goto have_c2min;\n\t  }\n      }\n have_c2min:\n  if (c2max > c2min)\n    for (c2 = c2max; c2 >= c2min; c2--)\n      for (c0 = c0min; c0 <= c0max; c0++) {\n\thistp = & histogram[c0][c1min][c2];\n\tfor (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)\n\t  if (*histp != 0) {\n\t    boxp->c2max = c2max = c2;\n\t    goto have_c2max;\n\t  }\n      }\n have_c2max:\n\n  /* Update box volume.\n   * We use 2-norm rather than real volume here; this biases the method\n   * against making long narrow boxes, and it has the side benefit that\n   * a box is splittable iff norm > 0.\n   * Since the differences are expressed in histogram-cell units,\n   * we have to shift back to JSAMPLE units to get consistent distances;\n   * after which, we scale according to the selected distance scale factors.\n   */\n  dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE;\n  dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE;\n  dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE;\n  boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2;\n  \n  /* Now scan remaining volume of box and compute population */\n  ccount = 0;\n  for (c0 = c0min; c0 <= c0max; c0++)\n    for (c1 = c1min; c1 <= c1max; c1++) {\n      histp = & histogram[c0][c1][c2min];\n      for (c2 = c2min; c2 <= c2max; c2++, histp++)\n\tif (*histp != 0) {\n\t  ccount++;\n\t}\n    }\n  boxp->colorcount = ccount;\n}\n\n\nLOCAL(int)\nmedian_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes,\n\t    int desired_colors)\n/* Repeatedly select and split the largest box until we have enough boxes */\n{\n  int n,lb;\n  int c0,c1,c2,cmax;\n  register boxptr b1,b2;\n\n  while (numboxes < desired_colors) {\n    /* Select box to split.\n     * Current algorithm: by population for first half, then by volume.\n     */\n    if (numboxes*2 <= desired_colors) {\n      b1 = find_biggest_color_pop(boxlist, numboxes);\n    } else {\n      b1 = find_biggest_volume(boxlist, numboxes);\n    }\n    if (b1 == NULL)\t\t/* no splittable boxes left! */\n      break;\n    b2 = &boxlist[numboxes];\t/* where new box will go */\n    /* Copy the color bounds to the new box. */\n    b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max;\n    b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min;\n    /* Choose which axis to split the box on.\n     * Current algorithm: longest scaled axis.\n     * See notes in update_box about scaling distances.\n     */\n    c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE;\n    c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE;\n    c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE;\n    /* We want to break any ties in favor of green, then red, blue last.\n     * This code does the right thing for R,G,B or B,G,R color orders only.\n     */\n#if RGB_RED == 0\n    cmax = c1; n = 1;\n    if (c0 > cmax) { cmax = c0; n = 0; }\n    if (c2 > cmax) { n = 2; }\n#else\n    cmax = c1; n = 1;\n    if (c2 > cmax) { cmax = c2; n = 2; }\n    if (c0 > cmax) { n = 0; }\n#endif\n    /* Choose split point along selected axis, and update box bounds.\n     * Current algorithm: split at halfway point.\n     * (Since the box has been shrunk to minimum volume,\n     * any split will produce two nonempty subboxes.)\n     * Note that lb value is max for lower box, so must be < old max.\n     */\n    switch (n) {\n    case 0:\n      lb = (b1->c0max + b1->c0min) / 2;\n      b1->c0max = lb;\n      b2->c0min = lb+1;\n      break;\n    case 1:\n      lb = (b1->c1max + b1->c1min) / 2;\n      b1->c1max = lb;\n      b2->c1min = lb+1;\n      break;\n    case 2:\n      lb = (b1->c2max + b1->c2min) / 2;\n      b1->c2max = lb;\n      b2->c2min = lb+1;\n      break;\n    }\n    /* Update stats for boxes */\n    update_box(cinfo, b1);\n    update_box(cinfo, b2);\n    numboxes++;\n  }\n  return numboxes;\n}\n\n\nLOCAL(void)\ncompute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor)\n/* Compute representative color for a box, put it in colormap[icolor] */\n{\n  /* Current algorithm: mean weighted by pixels (not colors) */\n  /* Note it is important to get the rounding correct! */\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  hist3d histogram = cquantize->histogram;\n  histptr histp;\n  int c0,c1,c2;\n  int c0min,c0max,c1min,c1max,c2min,c2max;\n  long count;\n  long total = 0;\n  long c0total = 0;\n  long c1total = 0;\n  long c2total = 0;\n  \n  c0min = boxp->c0min;  c0max = boxp->c0max;\n  c1min = boxp->c1min;  c1max = boxp->c1max;\n  c2min = boxp->c2min;  c2max = boxp->c2max;\n  \n  for (c0 = c0min; c0 <= c0max; c0++)\n    for (c1 = c1min; c1 <= c1max; c1++) {\n      histp = & histogram[c0][c1][c2min];\n      for (c2 = c2min; c2 <= c2max; c2++) {\n\tif ((count = *histp++) != 0) {\n\t  total += count;\n\t  c0total += ((c0 << C0_SHIFT) + ((1<<C0_SHIFT)>>1)) * count;\n\t  c1total += ((c1 << C1_SHIFT) + ((1<<C1_SHIFT)>>1)) * count;\n\t  c2total += ((c2 << C2_SHIFT) + ((1<<C2_SHIFT)>>1)) * count;\n\t}\n      }\n    }\n  \n  cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total);\n  cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total);\n  cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total);\n}\n\n\nLOCAL(void)\nselect_colors (j_decompress_ptr cinfo, int desired_colors)\n/* Master routine for color selection */\n{\n  boxptr boxlist;\n  int numboxes;\n  int i;\n\n  /* Allocate workspace for box list */\n  boxlist = (boxptr) (*cinfo->mem->alloc_small)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF(box));\n  /* Initialize one box containing whole space */\n  numboxes = 1;\n  boxlist[0].c0min = 0;\n  boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT;\n  boxlist[0].c1min = 0;\n  boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT;\n  boxlist[0].c2min = 0;\n  boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT;\n  /* Shrink it to actually-used volume and set its statistics */\n  update_box(cinfo, & boxlist[0]);\n  /* Perform median-cut to produce final box list */\n  numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors);\n  /* Compute the representative color for each box, fill colormap */\n  for (i = 0; i < numboxes; i++)\n    compute_color(cinfo, & boxlist[i], i);\n  cinfo->actual_number_of_colors = numboxes;\n  TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes);\n}\n\n\n/*\n * These routines are concerned with the time-critical task of mapping input\n * colors to the nearest color in the selected colormap.\n *\n * We re-use the histogram space as an \"inverse color map\", essentially a\n * cache for the results of nearest-color searches.  All colors within a\n * histogram cell will be mapped to the same colormap entry, namely the one\n * closest to the cell's center.  This may not be quite the closest entry to\n * the actual input color, but it's almost as good.  A zero in the cache\n * indicates we haven't found the nearest color for that cell yet; the array\n * is cleared to zeroes before starting the mapping pass.  When we find the\n * nearest color for a cell, its colormap index plus one is recorded in the\n * cache for future use.  The pass2 scanning routines call fill_inverse_cmap\n * when they need to use an unfilled entry in the cache.\n *\n * Our method of efficiently finding nearest colors is based on the \"locally\n * sorted search\" idea described by Heckbert and on the incremental distance\n * calculation described by Spencer W. Thomas in chapter III.1 of Graphics\n * Gems II (James Arvo, ed.  Academic Press, 1991).  Thomas points out that\n * the distances from a given colormap entry to each cell of the histogram can\n * be computed quickly using an incremental method: the differences between\n * distances to adjacent cells themselves differ by a constant.  This allows a\n * fairly fast implementation of the \"brute force\" approach of computing the\n * distance from every colormap entry to every histogram cell.  Unfortunately,\n * it needs a work array to hold the best-distance-so-far for each histogram\n * cell (because the inner loop has to be over cells, not colormap entries).\n * The work array elements have to be INT32s, so the work array would need\n * 256Kb at our recommended precision.  This is not feasible in DOS machines.\n *\n * To get around these problems, we apply Thomas' method to compute the\n * nearest colors for only the cells within a small subbox of the histogram.\n * The work array need be only as big as the subbox, so the memory usage\n * problem is solved.  Furthermore, we need not fill subboxes that are never\n * referenced in pass2; many images use only part of the color gamut, so a\n * fair amount of work is saved.  An additional advantage of this\n * approach is that we can apply Heckbert's locality criterion to quickly\n * eliminate colormap entries that are far away from the subbox; typically\n * three-fourths of the colormap entries are rejected by Heckbert's criterion,\n * and we need not compute their distances to individual cells in the subbox.\n * The speed of this approach is heavily influenced by the subbox size: too\n * small means too much overhead, too big loses because Heckbert's criterion\n * can't eliminate as many colormap entries.  Empirically the best subbox\n * size seems to be about 1/512th of the histogram (1/8th in each direction).\n *\n * Thomas' article also describes a refined method which is asymptotically\n * faster than the brute-force method, but it is also far more complex and\n * cannot efficiently be applied to small subboxes.  It is therefore not\n * useful for programs intended to be portable to DOS machines.  On machines\n * with plenty of memory, filling the whole histogram in one shot with Thomas'\n * refined method might be faster than the present code --- but then again,\n * it might not be any faster, and it's certainly more complicated.\n */\n\n\n/* log2(histogram cells in update box) for each axis; this can be adjusted */\n#define BOX_C0_LOG  (HIST_C0_BITS-3)\n#define BOX_C1_LOG  (HIST_C1_BITS-3)\n#define BOX_C2_LOG  (HIST_C2_BITS-3)\n\n#define BOX_C0_ELEMS  (1<<BOX_C0_LOG) /* # of hist cells in update box */\n#define BOX_C1_ELEMS  (1<<BOX_C1_LOG)\n#define BOX_C2_ELEMS  (1<<BOX_C2_LOG)\n\n#define BOX_C0_SHIFT  (C0_SHIFT + BOX_C0_LOG)\n#define BOX_C1_SHIFT  (C1_SHIFT + BOX_C1_LOG)\n#define BOX_C2_SHIFT  (C2_SHIFT + BOX_C2_LOG)\n\n\n/*\n * The next three routines implement inverse colormap filling.  They could\n * all be folded into one big routine, but splitting them up this way saves\n * some stack space (the mindist[] and bestdist[] arrays need not coexist)\n * and may allow some compilers to produce better code by registerizing more\n * inner-loop variables.\n */\n\nLOCAL(int)\nfind_nearby_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2,\n\t\t    JSAMPLE colorlist[])\n/* Locate the colormap entries close enough to an update box to be candidates\n * for the nearest entry to some cell(s) in the update box.  The update box\n * is specified by the center coordinates of its first cell.  The number of\n * candidate colormap entries is returned, and their colormap indexes are\n * placed in colorlist[].\n * This routine uses Heckbert's \"locally sorted search\" criterion to select\n * the colors that need further consideration.\n */\n{\n  int numcolors = cinfo->actual_number_of_colors;\n  int maxc0, maxc1, maxc2;\n  int centerc0, centerc1, centerc2;\n  int i, x, ncolors;\n  INT32 minmaxdist, min_dist, max_dist, tdist;\n  INT32 mindist[MAXNUMCOLORS];\t/* min distance to colormap entry i */\n\n  /* Compute true coordinates of update box's upper corner and center.\n   * Actually we compute the coordinates of the center of the upper-corner\n   * histogram cell, which are the upper bounds of the volume we care about.\n   * Note that since \">>\" rounds down, the \"center\" values may be closer to\n   * min than to max; hence comparisons to them must be \"<=\", not \"<\".\n   */\n  maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT));\n  centerc0 = (minc0 + maxc0) >> 1;\n  maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT));\n  centerc1 = (minc1 + maxc1) >> 1;\n  maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT));\n  centerc2 = (minc2 + maxc2) >> 1;\n\n  /* For each color in colormap, find:\n   *  1. its minimum squared-distance to any point in the update box\n   *     (zero if color is within update box);\n   *  2. its maximum squared-distance to any point in the update box.\n   * Both of these can be found by considering only the corners of the box.\n   * We save the minimum distance for each color in mindist[];\n   * only the smallest maximum distance is of interest.\n   */\n  minmaxdist = 0x7FFFFFFFL;\n\n  for (i = 0; i < numcolors; i++) {\n    /* We compute the squared-c0-distance term, then add in the other two. */\n    x = GETJSAMPLE(cinfo->colormap[0][i]);\n    if (x < minc0) {\n      tdist = (x - minc0) * C0_SCALE;\n      min_dist = tdist*tdist;\n      tdist = (x - maxc0) * C0_SCALE;\n      max_dist = tdist*tdist;\n    } else if (x > maxc0) {\n      tdist = (x - maxc0) * C0_SCALE;\n      min_dist = tdist*tdist;\n      tdist = (x - minc0) * C0_SCALE;\n      max_dist = tdist*tdist;\n    } else {\n      /* within cell range so no contribution to min_dist */\n      min_dist = 0;\n      if (x <= centerc0) {\n\ttdist = (x - maxc0) * C0_SCALE;\n\tmax_dist = tdist*tdist;\n      } else {\n\ttdist = (x - minc0) * C0_SCALE;\n\tmax_dist = tdist*tdist;\n      }\n    }\n\n    x = GETJSAMPLE(cinfo->colormap[1][i]);\n    if (x < minc1) {\n      tdist = (x - minc1) * C1_SCALE;\n      min_dist += tdist*tdist;\n      tdist = (x - maxc1) * C1_SCALE;\n      max_dist += tdist*tdist;\n    } else if (x > maxc1) {\n      tdist = (x - maxc1) * C1_SCALE;\n      min_dist += tdist*tdist;\n      tdist = (x - minc1) * C1_SCALE;\n      max_dist += tdist*tdist;\n    } else {\n      /* within cell range so no contribution to min_dist */\n      if (x <= centerc1) {\n\ttdist = (x - maxc1) * C1_SCALE;\n\tmax_dist += tdist*tdist;\n      } else {\n\ttdist = (x - minc1) * C1_SCALE;\n\tmax_dist += tdist*tdist;\n      }\n    }\n\n    x = GETJSAMPLE(cinfo->colormap[2][i]);\n    if (x < minc2) {\n      tdist = (x - minc2) * C2_SCALE;\n      min_dist += tdist*tdist;\n      tdist = (x - maxc2) * C2_SCALE;\n      max_dist += tdist*tdist;\n    } else if (x > maxc2) {\n      tdist = (x - maxc2) * C2_SCALE;\n      min_dist += tdist*tdist;\n      tdist = (x - minc2) * C2_SCALE;\n      max_dist += tdist*tdist;\n    } else {\n      /* within cell range so no contribution to min_dist */\n      if (x <= centerc2) {\n\ttdist = (x - maxc2) * C2_SCALE;\n\tmax_dist += tdist*tdist;\n      } else {\n\ttdist = (x - minc2) * C2_SCALE;\n\tmax_dist += tdist*tdist;\n      }\n    }\n\n    mindist[i] = min_dist;\t/* save away the results */\n    if (max_dist < minmaxdist)\n      minmaxdist = max_dist;\n  }\n\n  /* Now we know that no cell in the update box is more than minmaxdist\n   * away from some colormap entry.  Therefore, only colors that are\n   * within minmaxdist of some part of the box need be considered.\n   */\n  ncolors = 0;\n  for (i = 0; i < numcolors; i++) {\n    if (mindist[i] <= minmaxdist)\n      colorlist[ncolors++] = (JSAMPLE) i;\n  }\n  return ncolors;\n}\n\n\nLOCAL(void)\nfind_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2,\n\t\t  int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[])\n/* Find the closest colormap entry for each cell in the update box,\n * given the list of candidate colors prepared by find_nearby_colors.\n * Return the indexes of the closest entries in the bestcolor[] array.\n * This routine uses Thomas' incremental distance calculation method to\n * find the distance from a colormap entry to successive cells in the box.\n */\n{\n  int ic0, ic1, ic2;\n  int i, icolor;\n  register INT32 * bptr;\t/* pointer into bestdist[] array */\n  JSAMPLE * cptr;\t\t/* pointer into bestcolor[] array */\n  INT32 dist0, dist1;\t\t/* initial distance values */\n  register INT32 dist2;\t\t/* current distance in inner loop */\n  INT32 xx0, xx1;\t\t/* distance increments */\n  register INT32 xx2;\n  INT32 inc0, inc1, inc2;\t/* initial values for increments */\n  /* This array holds the distance to the nearest-so-far color for each cell */\n  INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];\n\n  /* Initialize best-distance for each cell of the update box */\n  bptr = bestdist;\n  for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--)\n    *bptr++ = 0x7FFFFFFFL;\n  \n  /* For each color selected by find_nearby_colors,\n   * compute its distance to the center of each cell in the box.\n   * If that's less than best-so-far, update best distance and color number.\n   */\n  \n  /* Nominal steps between cell centers (\"x\" in Thomas article) */\n#define STEP_C0  ((1 << C0_SHIFT) * C0_SCALE)\n#define STEP_C1  ((1 << C1_SHIFT) * C1_SCALE)\n#define STEP_C2  ((1 << C2_SHIFT) * C2_SCALE)\n  \n  for (i = 0; i < numcolors; i++) {\n    icolor = GETJSAMPLE(colorlist[i]);\n    /* Compute (square of) distance from minc0/c1/c2 to this color */\n    inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE;\n    dist0 = inc0*inc0;\n    inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE;\n    dist0 += inc1*inc1;\n    inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE;\n    dist0 += inc2*inc2;\n    /* Form the initial difference increments */\n    inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0;\n    inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1;\n    inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2;\n    /* Now loop over all cells in box, updating distance per Thomas method */\n    bptr = bestdist;\n    cptr = bestcolor;\n    xx0 = inc0;\n    for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) {\n      dist1 = dist0;\n      xx1 = inc1;\n      for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) {\n\tdist2 = dist1;\n\txx2 = inc2;\n\tfor (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) {\n\t  if (dist2 < *bptr) {\n\t    *bptr = dist2;\n\t    *cptr = (JSAMPLE) icolor;\n\t  }\n\t  dist2 += xx2;\n\t  xx2 += 2 * STEP_C2 * STEP_C2;\n\t  bptr++;\n\t  cptr++;\n\t}\n\tdist1 += xx1;\n\txx1 += 2 * STEP_C1 * STEP_C1;\n      }\n      dist0 += xx0;\n      xx0 += 2 * STEP_C0 * STEP_C0;\n    }\n  }\n}\n\n\nLOCAL(void)\nfill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2)\n/* Fill the inverse-colormap entries in the update box that contains */\n/* histogram cell c0/c1/c2.  (Only that one cell MUST be filled, but */\n/* we can fill as many others as we wish.) */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  hist3d histogram = cquantize->histogram;\n  int minc0, minc1, minc2;\t/* lower left corner of update box */\n  int ic0, ic1, ic2;\n  register JSAMPLE * cptr;\t/* pointer into bestcolor[] array */\n  register histptr cachep;\t/* pointer into main cache array */\n  /* This array lists the candidate colormap indexes. */\n  JSAMPLE colorlist[MAXNUMCOLORS];\n  int numcolors;\t\t/* number of candidate colors */\n  /* This array holds the actually closest colormap index for each cell. */\n  JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];\n\n  /* Convert cell coordinates to update box ID */\n  c0 >>= BOX_C0_LOG;\n  c1 >>= BOX_C1_LOG;\n  c2 >>= BOX_C2_LOG;\n\n  /* Compute true coordinates of update box's origin corner.\n   * Actually we compute the coordinates of the center of the corner\n   * histogram cell, which are the lower bounds of the volume we care about.\n   */\n  minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1);\n  minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1);\n  minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1);\n  \n  /* Determine which colormap entries are close enough to be candidates\n   * for the nearest entry to some cell in the update box.\n   */\n  numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist);\n\n  /* Determine the actually nearest colors. */\n  find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist,\n\t\t   bestcolor);\n\n  /* Save the best color numbers (plus 1) in the main cache array */\n  c0 <<= BOX_C0_LOG;\t\t/* convert ID back to base cell indexes */\n  c1 <<= BOX_C1_LOG;\n  c2 <<= BOX_C2_LOG;\n  cptr = bestcolor;\n  for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) {\n    for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) {\n      cachep = & histogram[c0+ic0][c1+ic1][c2];\n      for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) {\n\t*cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1);\n      }\n    }\n  }\n}\n\n\n/*\n * Map some rows of pixels to the output colormapped representation.\n */\n\nMETHODDEF(void)\npass2_no_dither (j_decompress_ptr cinfo,\n\t\t JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)\n/* This version performs no dithering */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  hist3d histogram = cquantize->histogram;\n  register JSAMPROW inptr, outptr;\n  register histptr cachep;\n  register int c0, c1, c2;\n  int row;\n  JDIMENSION col;\n  JDIMENSION width = cinfo->output_width;\n\n  for (row = 0; row < num_rows; row++) {\n    inptr = input_buf[row];\n    outptr = output_buf[row];\n    for (col = width; col > 0; col--) {\n      /* get pixel value and index into the cache */\n      c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT;\n      c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT;\n      c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT;\n      cachep = & histogram[c0][c1][c2];\n      /* If we have not seen this color before, find nearest colormap entry */\n      /* and update the cache */\n      if (*cachep == 0)\n\tfill_inverse_cmap(cinfo, c0,c1,c2);\n      /* Now emit the colormap index for this cell */\n      *outptr++ = (JSAMPLE) (*cachep - 1);\n    }\n  }\n}\n\n\nMETHODDEF(void)\npass2_fs_dither (j_decompress_ptr cinfo,\n\t\t JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)\n/* This version performs Floyd-Steinberg dithering */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  hist3d histogram = cquantize->histogram;\n  register LOCFSERROR cur0, cur1, cur2;\t/* current error or pixel value */\n  LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */\n  LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */\n  register FSERRPTR errorptr;\t/* => fserrors[] at column before current */\n  JSAMPROW inptr;\t\t/* => current input pixel */\n  JSAMPROW outptr;\t\t/* => current output pixel */\n  histptr cachep;\n  int dir;\t\t\t/* +1 or -1 depending on direction */\n  int dir3;\t\t\t/* 3*dir, for advancing inptr & errorptr */\n  int row;\n  JDIMENSION col;\n  JDIMENSION width = cinfo->output_width;\n  JSAMPLE *range_limit = cinfo->sample_range_limit;\n  int *error_limit = cquantize->error_limiter;\n  JSAMPROW colormap0 = cinfo->colormap[0];\n  JSAMPROW colormap1 = cinfo->colormap[1];\n  JSAMPROW colormap2 = cinfo->colormap[2];\n  SHIFT_TEMPS\n\n  for (row = 0; row < num_rows; row++) {\n    inptr = input_buf[row];\n    outptr = output_buf[row];\n    if (cquantize->on_odd_row) {\n      /* work right to left in this row */\n      inptr += (width-1) * 3;\t/* so point to rightmost pixel */\n      outptr += width-1;\n      dir = -1;\n      dir3 = -3;\n      errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */\n      cquantize->on_odd_row = FALSE; /* flip for next time */\n    } else {\n      /* work left to right in this row */\n      dir = 1;\n      dir3 = 3;\n      errorptr = cquantize->fserrors; /* => entry before first real column */\n      cquantize->on_odd_row = TRUE; /* flip for next time */\n    }\n    /* Preset error values: no error propagated to first pixel from left */\n    cur0 = cur1 = cur2 = 0;\n    /* and no error propagated to row below yet */\n    belowerr0 = belowerr1 = belowerr2 = 0;\n    bpreverr0 = bpreverr1 = bpreverr2 = 0;\n\n    for (col = width; col > 0; col--) {\n      /* curN holds the error propagated from the previous pixel on the\n       * current line.  Add the error propagated from the previous line\n       * to form the complete error correction term for this pixel, and\n       * round the error term (which is expressed * 16) to an integer.\n       * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct\n       * for either sign of the error value.\n       * Note: errorptr points to *previous* column's array entry.\n       */\n      cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4);\n      cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4);\n      cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4);\n      /* Limit the error using transfer function set by init_error_limit.\n       * See comments with init_error_limit for rationale.\n       */\n      cur0 = error_limit[cur0];\n      cur1 = error_limit[cur1];\n      cur2 = error_limit[cur2];\n      /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.\n       * The maximum error is +- MAXJSAMPLE (or less with error limiting);\n       * this sets the required size of the range_limit array.\n       */\n      cur0 += GETJSAMPLE(inptr[0]);\n      cur1 += GETJSAMPLE(inptr[1]);\n      cur2 += GETJSAMPLE(inptr[2]);\n      cur0 = GETJSAMPLE(range_limit[cur0]);\n      cur1 = GETJSAMPLE(range_limit[cur1]);\n      cur2 = GETJSAMPLE(range_limit[cur2]);\n      /* Index into the cache with adjusted pixel value */\n      cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT];\n      /* If we have not seen this color before, find nearest colormap */\n      /* entry and update the cache */\n      if (*cachep == 0)\n\tfill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT);\n      /* Now emit the colormap index for this cell */\n      { register int pixcode = *cachep - 1;\n\t*outptr = (JSAMPLE) pixcode;\n\t/* Compute representation error for this pixel */\n\tcur0 -= GETJSAMPLE(colormap0[pixcode]);\n\tcur1 -= GETJSAMPLE(colormap1[pixcode]);\n\tcur2 -= GETJSAMPLE(colormap2[pixcode]);\n      }\n      /* Compute error fractions to be propagated to adjacent pixels.\n       * Add these into the running sums, and simultaneously shift the\n       * next-line error sums left by 1 column.\n       */\n      { register LOCFSERROR bnexterr, delta;\n\n\tbnexterr = cur0;\t/* Process component 0 */\n\tdelta = cur0 * 2;\n\tcur0 += delta;\t\t/* form error * 3 */\n\terrorptr[0] = (FSERROR) (bpreverr0 + cur0);\n\tcur0 += delta;\t\t/* form error * 5 */\n\tbpreverr0 = belowerr0 + cur0;\n\tbelowerr0 = bnexterr;\n\tcur0 += delta;\t\t/* form error * 7 */\n\tbnexterr = cur1;\t/* Process component 1 */\n\tdelta = cur1 * 2;\n\tcur1 += delta;\t\t/* form error * 3 */\n\terrorptr[1] = (FSERROR) (bpreverr1 + cur1);\n\tcur1 += delta;\t\t/* form error * 5 */\n\tbpreverr1 = belowerr1 + cur1;\n\tbelowerr1 = bnexterr;\n\tcur1 += delta;\t\t/* form error * 7 */\n\tbnexterr = cur2;\t/* Process component 2 */\n\tdelta = cur2 * 2;\n\tcur2 += delta;\t\t/* form error * 3 */\n\terrorptr[2] = (FSERROR) (bpreverr2 + cur2);\n\tcur2 += delta;\t\t/* form error * 5 */\n\tbpreverr2 = belowerr2 + cur2;\n\tbelowerr2 = bnexterr;\n\tcur2 += delta;\t\t/* form error * 7 */\n      }\n      /* At this point curN contains the 7/16 error value to be propagated\n       * to the next pixel on the current line, and all the errors for the\n       * next line have been shifted over.  We are therefore ready to move on.\n       */\n      inptr += dir3;\t\t/* Advance pixel pointers to next column */\n      outptr += dir;\n      errorptr += dir3;\t\t/* advance errorptr to current column */\n    }\n    /* Post-loop cleanup: we must unload the final error values into the\n     * final fserrors[] entry.  Note we need not unload belowerrN because\n     * it is for the dummy column before or after the actual array.\n     */\n    errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */\n    errorptr[1] = (FSERROR) bpreverr1;\n    errorptr[2] = (FSERROR) bpreverr2;\n  }\n}\n\n\n/*\n * Initialize the error-limiting transfer function (lookup table).\n * The raw F-S error computation can potentially compute error values of up to\n * +- MAXJSAMPLE.  But we want the maximum correction applied to a pixel to be\n * much less, otherwise obviously wrong pixels will be created.  (Typical\n * effects include weird fringes at color-area boundaries, isolated bright\n * pixels in a dark area, etc.)  The standard advice for avoiding this problem\n * is to ensure that the \"corners\" of the color cube are allocated as output\n * colors; then repeated errors in the same direction cannot cause cascading\n * error buildup.  However, that only prevents the error from getting\n * completely out of hand; Aaron Giles reports that error limiting improves\n * the results even with corner colors allocated.\n * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty\n * well, but the smoother transfer function used below is even better.  Thanks\n * to Aaron Giles for this idea.\n */\n\nLOCAL(void)\ninit_error_limit (j_decompress_ptr cinfo)\n/* Allocate and fill in the error_limiter table */\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  int * table;\n  int in, out;\n\n  table = (int *) (*cinfo->mem->alloc_small)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * SIZEOF(int));\n  table += MAXJSAMPLE;\t\t/* so can index -MAXJSAMPLE .. +MAXJSAMPLE */\n  cquantize->error_limiter = table;\n\n#define STEPSIZE ((MAXJSAMPLE+1)/16)\n  /* Map errors 1:1 up to +- MAXJSAMPLE/16 */\n  out = 0;\n  for (in = 0; in < STEPSIZE; in++, out++) {\n    table[in] = out; table[-in] = -out;\n  }\n  /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */\n  for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) {\n    table[in] = out; table[-in] = -out;\n  }\n  /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */\n  for (; in <= MAXJSAMPLE; in++) {\n    table[in] = out; table[-in] = -out;\n  }\n#undef STEPSIZE\n}\n\n\n/*\n * Finish up at the end of each pass.\n */\n\nMETHODDEF(void)\nfinish_pass1 (j_decompress_ptr cinfo)\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n\n  /* Select the representative colors and fill in cinfo->colormap */\n  cinfo->colormap = cquantize->sv_colormap;\n  select_colors(cinfo, cquantize->desired);\n  /* Force next pass to zero the color index table */\n  cquantize->needs_zeroed = TRUE;\n}\n\n\nMETHODDEF(void)\nfinish_pass2 (j_decompress_ptr cinfo)\n{\n  /* no work */\n}\n\n\n/*\n * Initialize for each processing pass.\n */\n\nMETHODDEF(void)\nstart_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n  hist3d histogram = cquantize->histogram;\n  int i;\n\n  /* Only F-S dithering or no dithering is supported. */\n  /* If user asks for ordered dither, give him F-S. */\n  if (cinfo->dither_mode != JDITHER_NONE)\n    cinfo->dither_mode = JDITHER_FS;\n\n  if (is_pre_scan) {\n    /* Set up method pointers */\n    cquantize->pub.color_quantize = prescan_quantize;\n    cquantize->pub.finish_pass = finish_pass1;\n    cquantize->needs_zeroed = TRUE; /* Always zero histogram */\n  } else {\n    /* Set up method pointers */\n    if (cinfo->dither_mode == JDITHER_FS)\n      cquantize->pub.color_quantize = pass2_fs_dither;\n    else\n      cquantize->pub.color_quantize = pass2_no_dither;\n    cquantize->pub.finish_pass = finish_pass2;\n\n    /* Make sure color count is acceptable */\n    i = cinfo->actual_number_of_colors;\n    if (i < 1)\n      ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1);\n    if (i > MAXNUMCOLORS)\n      ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);\n\n    if (cinfo->dither_mode == JDITHER_FS) {\n      size_t arraysize = (size_t) ((cinfo->output_width + 2) *\n\t\t\t\t   (3 * SIZEOF(FSERROR)));\n      /* Allocate Floyd-Steinberg workspace if we didn't already. */\n      if (cquantize->fserrors == NULL)\n\tcquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)\n\t  ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);\n      /* Initialize the propagated errors to zero. */\n      FMEMZERO((void FAR *) cquantize->fserrors, arraysize);\n      /* Make the error-limit table if we didn't already. */\n      if (cquantize->error_limiter == NULL)\n\tinit_error_limit(cinfo);\n      cquantize->on_odd_row = FALSE;\n    }\n\n  }\n  /* Zero the histogram or inverse color map, if necessary */\n  if (cquantize->needs_zeroed) {\n    for (i = 0; i < HIST_C0_ELEMS; i++) {\n      FMEMZERO((void FAR *) histogram[i],\n\t       HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));\n    }\n    cquantize->needs_zeroed = FALSE;\n  }\n}\n\n\n/*\n * Switch to a new external colormap between output passes.\n */\n\nMETHODDEF(void)\nnew_color_map_2_quant (j_decompress_ptr cinfo)\n{\n  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;\n\n  /* Reset the inverse color map */\n  cquantize->needs_zeroed = TRUE;\n}\n\n\n/*\n * Module initialization routine for 2-pass color quantization.\n */\n\nGLOBAL(void)\njinit_2pass_quantizer (j_decompress_ptr cinfo)\n{\n  my_cquantize_ptr cquantize;\n  int i;\n\n  cquantize = (my_cquantize_ptr)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\tSIZEOF(my_cquantizer));\n  cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;\n  cquantize->pub.start_pass = start_pass_2_quant;\n  cquantize->pub.new_color_map = new_color_map_2_quant;\n  cquantize->fserrors = NULL;\t/* flag optional arrays not allocated */\n  cquantize->error_limiter = NULL;\n\n  /* Make sure jdmaster didn't give me a case I can't handle */\n  if (cinfo->out_color_components != 3 ||\n      cinfo->out_color_space == JCS_RGB565)\n    ERREXIT(cinfo, JERR_NOTIMPL);\n\n  /* Allocate the histogram/inverse colormap storage */\n  cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF(hist2d));\n  for (i = 0; i < HIST_C0_ELEMS; i++) {\n    cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));\n  }\n  cquantize->needs_zeroed = TRUE; /* histogram is garbage now */\n\n  /* Allocate storage for the completed colormap, if required.\n   * We do this now since it is FAR storage and may affect\n   * the memory manager's space calculations.\n   */\n  if (cinfo->enable_2pass_quant) {\n    /* Make sure color count is acceptable */\n    int desired = cinfo->desired_number_of_colors;\n    /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */\n    if (desired < 8)\n      ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8);\n    /* Make sure colormap indexes can be represented by JSAMPLEs */\n    if (desired > MAXNUMCOLORS)\n      ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);\n    cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3);\n    cquantize->desired = desired;\n  } else\n    cquantize->sv_colormap = NULL;\n\n  /* Only F-S dithering or no dithering is supported. */\n  /* If user asks for ordered dither, give him F-S. */\n  if (cinfo->dither_mode != JDITHER_NONE)\n    cinfo->dither_mode = JDITHER_FS;\n\n  /* Allocate Floyd-Steinberg workspace if necessary.\n   * This isn't really needed until pass 2, but again it is FAR storage.\n   * Although we will cope with a later change in dither_mode,\n   * we do not promise to honor max_memory_to_use if dither_mode changes.\n   */\n  if (cinfo->dither_mode == JDITHER_FS) {\n    cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR))));\n    /* Might as well create the error-limiting table too. */\n    init_error_limit(cinfo);\n  }\n}\n\n#endif /* QUANT_2PASS_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/jutils.c",
    "content": "/*\n * jutils.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * Modified 2009-2011 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains tables and miscellaneous utility routines needed\n * for both compression and decompression.\n * Note we prefix all global names with \"j\" to minimize conflicts with\n * a surrounding application.\n */\n\n#define JPEG_INTERNALS\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n\n\n/*\n * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element\n * of a DCT block read in natural order (left to right, top to bottom).\n */\n\n#if 0\t\t\t\t/* This table is not actually needed in v6a */\n\nconst int jpeg_zigzag_order[DCTSIZE2] = {\n   0,  1,  5,  6, 14, 15, 27, 28,\n   2,  4,  7, 13, 16, 26, 29, 42,\n   3,  8, 12, 17, 25, 30, 41, 43,\n   9, 11, 18, 24, 31, 40, 44, 53,\n  10, 19, 23, 32, 39, 45, 52, 54,\n  20, 22, 33, 38, 46, 51, 55, 60,\n  21, 34, 37, 47, 50, 56, 59, 61,\n  35, 36, 48, 49, 57, 58, 62, 63\n};\n\n#endif\n\n/*\n * jpeg_natural_order[i] is the natural-order position of the i'th element\n * of zigzag order.\n *\n * When reading corrupted data, the Huffman decoders could attempt\n * to reference an entry beyond the end of this array (if the decoded\n * zero run length reaches past the end of the block).  To prevent\n * wild stores without adding an inner-loop test, we put some extra\n * \"63\"s after the real entries.  This will cause the extra coefficient\n * to be stored in location 63 of the block, not somewhere random.\n * The worst case would be a run-length of 15, which means we need 16\n * fake entries.\n */\n\nconst int jpeg_natural_order[DCTSIZE2+16] = {\n  0,  1,  8, 16,  9,  2,  3, 10,\n 17, 24, 32, 25, 18, 11,  4,  5,\n 12, 19, 26, 33, 40, 48, 41, 34,\n 27, 20, 13,  6,  7, 14, 21, 28,\n 35, 42, 49, 56, 57, 50, 43, 36,\n 29, 22, 15, 23, 30, 37, 44, 51,\n 58, 59, 52, 45, 38, 31, 39, 46,\n 53, 60, 61, 54, 47, 55, 62, 63,\n 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */\n 63, 63, 63, 63, 63, 63, 63, 63\n};\n\nconst int jpeg_natural_order7[7*7+16] = {\n  0,  1,  8, 16,  9,  2,  3, 10,\n 17, 24, 32, 25, 18, 11,  4,  5,\n 12, 19, 26, 33, 40, 48, 41, 34,\n 27, 20, 13,  6, 14, 21, 28, 35,\n 42, 49, 50, 43, 36, 29, 22, 30,\n 37, 44, 51, 52, 45, 38, 46, 53,\n 54,\n 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */\n 63, 63, 63, 63, 63, 63, 63, 63\n};\n\nconst int jpeg_natural_order6[6*6+16] = {\n  0,  1,  8, 16,  9,  2,  3, 10,\n 17, 24, 32, 25, 18, 11,  4,  5,\n 12, 19, 26, 33, 40, 41, 34, 27,\n 20, 13, 21, 28, 35, 42, 43, 36,\n 29, 37, 44, 45,\n 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */\n 63, 63, 63, 63, 63, 63, 63, 63\n};\n\nconst int jpeg_natural_order5[5*5+16] = {\n  0,  1,  8, 16,  9,  2,  3, 10,\n 17, 24, 32, 25, 18, 11,  4, 12,\n 19, 26, 33, 34, 27, 20, 28, 35,\n 36,\n 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */\n 63, 63, 63, 63, 63, 63, 63, 63\n};\n\nconst int jpeg_natural_order4[4*4+16] = {\n  0,  1,  8, 16,  9,  2,  3, 10,\n 17, 24, 25, 18, 11, 19, 26, 27,\n 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */\n 63, 63, 63, 63, 63, 63, 63, 63\n};\n\nconst int jpeg_natural_order3[3*3+16] = {\n  0,  1,  8, 16,  9,  2, 10, 17,\n 18,\n 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */\n 63, 63, 63, 63, 63, 63, 63, 63\n};\n\nconst int jpeg_natural_order2[2*2+16] = {\n  0,  1,  8,  9,\n 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */\n 63, 63, 63, 63, 63, 63, 63, 63\n};\n\n\n/*\n * Arithmetic utilities\n */\n\nGLOBAL(long)\njdiv_round_up (long a, long b)\n/* Compute a/b rounded up to next integer, ie, ceil(a/b) */\n/* Assumes a >= 0, b > 0 */\n{\n  return (a + b - 1L) / b;\n}\n\n\nGLOBAL(long)\njround_up (long a, long b)\n/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */\n/* Assumes a >= 0, b > 0 */\n{\n  a += b - 1L;\n  return a - (a % b);\n}\n\n\n/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays\n * and coefficient-block arrays.  This won't work on 80x86 because the arrays\n * are FAR and we're assuming a small-pointer memory model.  However, some\n * DOS compilers provide far-pointer versions of memcpy() and memset() even\n * in the small-model libraries.  These will be used if USE_FMEM is defined.\n * Otherwise, the routines below do it the hard way.  (The performance cost\n * is not all that great, because these routines aren't very heavily used.)\n */\n\n#ifndef NEED_FAR_POINTERS\t/* normal case, same as regular macro */\n#define FMEMCOPY(dest,src,size)\tMEMCOPY(dest,src,size)\n#else\t\t\t\t/* 80x86 case, define if we can */\n#ifdef USE_FMEM\n#define FMEMCOPY(dest,src,size)\t_fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))\n#else\n/* This function is for use by the FMEMZERO macro defined in jpegint.h.\n * Do not call this function directly, use the FMEMZERO macro instead.\n */\nGLOBAL(void)\njzero_far (void FAR * target, size_t bytestozero)\n/* Zero out a chunk of FAR memory. */\n/* This might be sample-array data, block-array data, or alloc_large data. */\n{\n  register char FAR * ptr = (char FAR *) target;\n  register size_t count;\n\n  for (count = bytestozero; count > 0; count--) {\n    *ptr++ = 0;\n  }\n}\n#endif\n#endif\n\n\nGLOBAL(void)\njcopy_sample_rows (JSAMPARRAY input_array, int source_row,\n\t\t   JSAMPARRAY output_array, int dest_row,\n\t\t   int num_rows, JDIMENSION num_cols)\n/* Copy some rows of samples from one place to another.\n * num_rows rows are copied from input_array[source_row++]\n * to output_array[dest_row++]; these areas may overlap for duplication.\n * The source and destination arrays must be at least as wide as num_cols.\n */\n{\n  register JSAMPROW inptr, outptr;\n#ifdef FMEMCOPY\n  register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));\n#else\n  register JDIMENSION count;\n#endif\n  register int row;\n\n  input_array += source_row;\n  output_array += dest_row;\n\n  for (row = num_rows; row > 0; row--) {\n    inptr = *input_array++;\n    outptr = *output_array++;\n#ifdef FMEMCOPY\n    FMEMCOPY(outptr, inptr, count);\n#else\n    for (count = num_cols; count > 0; count--)\n      *outptr++ = *inptr++;\t/* needn't bother with GETJSAMPLE() here */\n#endif\n  }\n}\n\n\nGLOBAL(void)\njcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,\n\t\t JDIMENSION num_blocks)\n/* Copy a row of coefficient blocks from one place to another. */\n{\n#ifdef FMEMCOPY\n  FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));\n#else\n  register JCOEFPTR inptr, outptr;\n  register long count;\n\n  inptr = (JCOEFPTR) input_row;\n  outptr = (JCOEFPTR) output_row;\n  for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) {\n    *outptr++ = *inptr++;\n  }\n#endif\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/rdbmp.c",
    "content": "/*\n * rdbmp.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * Modified 2009-2010 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to read input images in Microsoft \"BMP\"\n * format (MS Windows 3.x, OS/2 1.x, and OS/2 2.x flavors).\n * Currently, only 8-bit and 24-bit images are supported, not 1-bit or\n * 4-bit (feeding such low-depth images into JPEG would be silly anyway).\n * Also, we don't support RLE-compressed files.\n *\n * These routines may need modification for non-Unix environments or\n * specialized applications.  As they stand, they assume input from\n * an ordinary stdio stream.  They further assume that reading begins\n * at the start of the file; start_input may need work if the\n * user interface has already read some data (e.g., to determine that\n * the file is indeed BMP format).\n *\n * This code contributed by James Arthur Boucher.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef BMP_SUPPORTED\n\n\n/* Macros to deal with unsigned chars as efficiently as compiler allows */\n\n#ifdef HAVE_UNSIGNED_CHAR\ntypedef unsigned char U_CHAR;\n#define UCH(x)\t((int) (x))\n#else /* !HAVE_UNSIGNED_CHAR */\n#ifdef CHAR_IS_UNSIGNED\ntypedef char U_CHAR;\n#define UCH(x)\t((int) (x))\n#else\ntypedef char U_CHAR;\n#define UCH(x)\t((int) (x) & 0xFF)\n#endif\n#endif /* HAVE_UNSIGNED_CHAR */\n\n\n#define\tReadOK(file,buffer,len)\t(JFREAD(file,buffer,len) == ((size_t) (len)))\n\n\n/* Private version of data source object */\n\ntypedef struct _bmp_source_struct * bmp_source_ptr;\n\ntypedef struct _bmp_source_struct {\n  struct cjpeg_source_struct pub; /* public fields */\n\n  j_compress_ptr cinfo;\t\t/* back link saves passing separate parm */\n\n  JSAMPARRAY colormap;\t\t/* BMP colormap (converted to my format) */\n\n  jvirt_sarray_ptr whole_image;\t/* Needed to reverse row order */\n  JDIMENSION source_row;\t/* Current source row number */\n  JDIMENSION row_width;\t\t/* Physical width of scanlines in file */\n\n  int bits_per_pixel;\t\t/* remembers 8- or 24-bit format */\n} bmp_source_struct;\n\n\nLOCAL(int)\nread_byte (bmp_source_ptr sinfo)\n/* Read next byte from BMP file */\n{\n  register FILE *infile = sinfo->pub.input_file;\n  register int c;\n\n  if ((c = getc(infile)) == EOF)\n    ERREXIT(sinfo->cinfo, JERR_INPUT_EOF);\n  return c;\n}\n\n\nLOCAL(void)\nread_colormap (bmp_source_ptr sinfo, int cmaplen, int mapentrysize)\n/* Read the colormap from a BMP file */\n{\n  int i;\n\n  switch (mapentrysize) {\n  case 3:\n    /* BGR format (occurs in OS/2 files) */\n    for (i = 0; i < cmaplen; i++) {\n      sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo);\n      sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo);\n      sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo);\n    }\n    break;\n  case 4:\n    /* BGR0 format (occurs in MS Windows files) */\n    for (i = 0; i < cmaplen; i++) {\n      sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo);\n      sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo);\n      sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo);\n      (void) read_byte(sinfo);\n    }\n    break;\n  default:\n    ERREXIT(sinfo->cinfo, JERR_BMP_BADCMAP);\n    break;\n  }\n}\n\n\n/*\n * Read one row of pixels.\n * The image has been read into the whole_image array, but is otherwise\n * unprocessed.  We must read it out in top-to-bottom row order, and if\n * it is an 8-bit image, we must expand colormapped pixels to 24bit format.\n */\n\nMETHODDEF(JDIMENSION)\nget_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading 8-bit colormap indexes */\n{\n  bmp_source_ptr source = (bmp_source_ptr) sinfo;\n  register JSAMPARRAY colormap = source->colormap;\n  JSAMPARRAY image_ptr;\n  register int t;\n  register JSAMPROW inptr, outptr;\n  register JDIMENSION col;\n\n  /* Fetch next row from virtual array */\n  source->source_row--;\n  image_ptr = (*cinfo->mem->access_virt_sarray)\n    ((j_common_ptr) cinfo, source->whole_image,\n     source->source_row, (JDIMENSION) 1, FALSE);\n\n  /* Expand the colormap indexes to real data */\n  inptr = image_ptr[0];\n  outptr = source->pub.buffer[0];\n  for (col = cinfo->image_width; col > 0; col--) {\n    t = GETJSAMPLE(*inptr++);\n    *outptr++ = colormap[0][t];\t/* can omit GETJSAMPLE() safely */\n    *outptr++ = colormap[1][t];\n    *outptr++ = colormap[2][t];\n  }\n\n  return 1;\n}\n\n\nMETHODDEF(JDIMENSION)\nget_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading 24-bit pixels */\n{\n  bmp_source_ptr source = (bmp_source_ptr) sinfo;\n  JSAMPARRAY image_ptr;\n  register JSAMPROW inptr, outptr;\n  register JDIMENSION col;\n\n  /* Fetch next row from virtual array */\n  source->source_row--;\n  image_ptr = (*cinfo->mem->access_virt_sarray)\n    ((j_common_ptr) cinfo, source->whole_image,\n     source->source_row, (JDIMENSION) 1, FALSE);\n\n  /* Transfer data.  Note source values are in BGR order\n   * (even though Microsoft's own documents say the opposite).\n   */\n  inptr = image_ptr[0];\n  outptr = source->pub.buffer[0];\n  for (col = cinfo->image_width; col > 0; col--) {\n    outptr[2] = *inptr++;\t/* can omit GETJSAMPLE() safely */\n    outptr[1] = *inptr++;\n    outptr[0] = *inptr++;\n    outptr += 3;\n  }\n\n  return 1;\n}\n\n\nMETHODDEF(JDIMENSION)\nget_32bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading 32-bit pixels */\n{\n  bmp_source_ptr source = (bmp_source_ptr) sinfo;\n  JSAMPARRAY image_ptr;\n  register JSAMPROW inptr, outptr;\n  register JDIMENSION col;\n\n  /* Fetch next row from virtual array */\n  source->source_row--;\n  image_ptr = (*cinfo->mem->access_virt_sarray)\n    ((j_common_ptr) cinfo, source->whole_image,\n     source->source_row, (JDIMENSION) 1, FALSE);\n  /* Transfer data.  Note source values are in BGR order\n   * (even though Microsoft's own documents say the opposite).\n   */\n  inptr = image_ptr[0];\n  outptr = source->pub.buffer[0];\n  for (col = cinfo->image_width; col > 0; col--) {\n    outptr[2] = *inptr++;\t/* can omit GETJSAMPLE() safely */\n    outptr[1] = *inptr++;\n    outptr[0] = *inptr++;\n    inptr++;\t\t\t/* skip the 4th byte (Alpha channel) */\n    outptr += 3;\n  }\n\n  return 1;\n}\n\n\n/*\n * This method loads the image into whole_image during the first call on\n * get_pixel_rows.  The get_pixel_rows pointer is then adjusted to call\n * get_8bit_row, get_24bit_row, or get_32bit_row on subsequent calls.\n */\n\nMETHODDEF(JDIMENSION)\npreload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  bmp_source_ptr source = (bmp_source_ptr) sinfo;\n  register FILE *infile = source->pub.input_file;\n  register int c;\n  register JSAMPROW out_ptr;\n  JSAMPARRAY image_ptr;\n  JDIMENSION row, col;\n  cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n\n  /* Read the data into a virtual array in input-file row order. */\n  for (row = 0; row < cinfo->image_height; row++) {\n    if (progress != NULL) {\n      progress->pub.pass_counter = (long) row;\n      progress->pub.pass_limit = (long) cinfo->image_height;\n      (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n    }\n    image_ptr = (*cinfo->mem->access_virt_sarray)\n      ((j_common_ptr) cinfo, source->whole_image,\n       row, (JDIMENSION) 1, TRUE);\n    out_ptr = image_ptr[0];\n    for (col = source->row_width; col > 0; col--) {\n      /* inline copy of read_byte() for speed */\n      if ((c = getc(infile)) == EOF)\n\tERREXIT(cinfo, JERR_INPUT_EOF);\n      *out_ptr++ = (JSAMPLE) c;\n    }\n  }\n  if (progress != NULL)\n    progress->completed_extra_passes++;\n\n  /* Set up to read from the virtual array in top-to-bottom order */\n  switch (source->bits_per_pixel) {\n  case 8:\n    source->pub.get_pixel_rows = get_8bit_row;\n    break;\n  case 24:\n    source->pub.get_pixel_rows = get_24bit_row;\n    break;\n  case 32:\n    source->pub.get_pixel_rows = get_32bit_row;\n    break;\n  default:\n    ERREXIT(cinfo, JERR_BMP_BADDEPTH);\n  }\n  source->source_row = cinfo->image_height;\n\n  /* And read the first row */\n  return (*source->pub.get_pixel_rows) (cinfo, sinfo);\n}\n\n\n/*\n * Read the file header; return image size and component count.\n */\n\nMETHODDEF(void)\nstart_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  bmp_source_ptr source = (bmp_source_ptr) sinfo;\n  U_CHAR bmpfileheader[14];\n  U_CHAR bmpinfoheader[64];\n#define GET_2B(array,offset)  ((unsigned int) UCH(array[offset]) + \\\n\t\t\t       (((unsigned int) UCH(array[offset+1])) << 8))\n#define GET_4B(array,offset)  ((INT32) UCH(array[offset]) + \\\n\t\t\t       (((INT32) UCH(array[offset+1])) << 8) + \\\n\t\t\t       (((INT32) UCH(array[offset+2])) << 16) + \\\n\t\t\t       (((INT32) UCH(array[offset+3])) << 24))\n  INT32 bfOffBits;\n  INT32 headerSize;\n  INT32 biWidth;\n  INT32 biHeight;\n  unsigned int biPlanes;\n  INT32 biCompression;\n  INT32 biXPelsPerMeter,biYPelsPerMeter;\n  INT32 biClrUsed = 0;\n  int mapentrysize = 0;\t\t/* 0 indicates no colormap */\n  INT32 bPad;\n  JDIMENSION row_width;\n\n  /* Read and verify the bitmap file header */\n  if (! ReadOK(source->pub.input_file, bmpfileheader, 14))\n    ERREXIT(cinfo, JERR_INPUT_EOF);\n  if (GET_2B(bmpfileheader,0) != 0x4D42) /* 'BM' */\n    ERREXIT(cinfo, JERR_BMP_NOT);\n  bfOffBits = (INT32) GET_4B(bmpfileheader,10);\n  /* We ignore the remaining fileheader fields */\n\n  /* The infoheader might be 12 bytes (OS/2 1.x), 40 bytes (Windows),\n   * or 64 bytes (OS/2 2.x).  Check the first 4 bytes to find out which.\n   */\n  if (! ReadOK(source->pub.input_file, bmpinfoheader, 4))\n    ERREXIT(cinfo, JERR_INPUT_EOF);\n  headerSize = (INT32) GET_4B(bmpinfoheader,0);\n  if (headerSize < 12 || headerSize > 64)\n    ERREXIT(cinfo, JERR_BMP_BADHEADER);\n  if (! ReadOK(source->pub.input_file, bmpinfoheader+4, headerSize-4))\n    ERREXIT(cinfo, JERR_INPUT_EOF);\n\n  switch ((int) headerSize) {\n  case 12:\n    /* Decode OS/2 1.x header (Microsoft calls this a BITMAPCOREHEADER) */\n    biWidth = (INT32) GET_2B(bmpinfoheader,4);\n    biHeight = (INT32) GET_2B(bmpinfoheader,6);\n    biPlanes = GET_2B(bmpinfoheader,8);\n    source->bits_per_pixel = (int) GET_2B(bmpinfoheader,10);\n\n    switch (source->bits_per_pixel) {\n    case 8:\t\t\t/* colormapped image */\n      mapentrysize = 3;\t\t/* OS/2 uses RGBTRIPLE colormap */\n      TRACEMS2(cinfo, 1, JTRC_BMP_OS2_MAPPED, (int) biWidth, (int) biHeight);\n      break;\n    case 24:\t\t\t/* RGB image */\n      TRACEMS2(cinfo, 1, JTRC_BMP_OS2, (int) biWidth, (int) biHeight);\n      break;\n    default:\n      ERREXIT(cinfo, JERR_BMP_BADDEPTH);\n      break;\n    }\n    break;\n  case 40:\n  case 64:\n    /* Decode Windows 3.x header (Microsoft calls this a BITMAPINFOHEADER) */\n    /* or OS/2 2.x header, which has additional fields that we ignore */\n    biWidth = GET_4B(bmpinfoheader,4);\n    biHeight = GET_4B(bmpinfoheader,8);\n    biPlanes = GET_2B(bmpinfoheader,12);\n    source->bits_per_pixel = (int) GET_2B(bmpinfoheader,14);\n    biCompression = GET_4B(bmpinfoheader,16);\n    biXPelsPerMeter = GET_4B(bmpinfoheader,24);\n    biYPelsPerMeter = GET_4B(bmpinfoheader,28);\n    biClrUsed = GET_4B(bmpinfoheader,32);\n    /* biSizeImage, biClrImportant fields are ignored */\n\n    switch (source->bits_per_pixel) {\n    case 8:\t\t\t/* colormapped image */\n      mapentrysize = 4;\t\t/* Windows uses RGBQUAD colormap */\n      TRACEMS2(cinfo, 1, JTRC_BMP_MAPPED, (int) biWidth, (int) biHeight);\n      break;\n    case 24:\t\t\t/* RGB image */\n      TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight);\n      break;\n    case 32:\t\t\t/* RGB image + Alpha channel */\n      TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight);\n      break;\n    default:\n      ERREXIT(cinfo, JERR_BMP_BADDEPTH);\n      break;\n    }\n    if (biCompression != 0)\n      ERREXIT(cinfo, JERR_BMP_COMPRESSED);\n\n    if (biXPelsPerMeter > 0 && biYPelsPerMeter > 0) {\n      /* Set JFIF density parameters from the BMP data */\n      cinfo->X_density = (UINT16) (biXPelsPerMeter/100); /* 100 cm per meter */\n      cinfo->Y_density = (UINT16) (biYPelsPerMeter/100);\n      cinfo->density_unit = 2;\t/* dots/cm */\n    }\n    break;\n  default:\n    ERREXIT(cinfo, JERR_BMP_BADHEADER);\n    return;\n  }\n\n  if (biWidth <= 0 || biHeight <= 0)\n    ERREXIT(cinfo, JERR_BMP_EMPTY);\n  if (biPlanes != 1)\n    ERREXIT(cinfo, JERR_BMP_BADPLANES);\n\n  /* Compute distance to bitmap data --- will adjust for colormap below */\n  bPad = bfOffBits - (headerSize + 14);\n\n  /* Read the colormap, if any */\n  if (mapentrysize > 0) {\n    if (biClrUsed <= 0)\n      biClrUsed = 256;\t\t/* assume it's 256 */\n    else if (biClrUsed > 256)\n      ERREXIT(cinfo, JERR_BMP_BADCMAP);\n    /* Allocate space to store the colormap */\n    source->colormap = (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       (JDIMENSION) biClrUsed, (JDIMENSION) 3);\n    /* and read it from the file */\n    read_colormap(source, (int) biClrUsed, mapentrysize);\n    /* account for size of colormap */\n    bPad -= biClrUsed * mapentrysize;\n  }\n\n  /* Skip any remaining pad bytes */\n  if (bPad < 0)\t\t\t/* incorrect bfOffBits value? */\n    ERREXIT(cinfo, JERR_BMP_BADHEADER);\n  while (--bPad >= 0) {\n    (void) read_byte(source);\n  }\n\n  /* Compute row width in file, including padding to 4-byte boundary */\n  if (source->bits_per_pixel == 24)\n    row_width = (JDIMENSION) (biWidth * 3);\n  else if (source->bits_per_pixel == 32)\n    row_width = (JDIMENSION) (biWidth * 4);\n  else\n    row_width = (JDIMENSION) biWidth;\n  while ((row_width & 3) != 0) row_width++;\n  source->row_width = row_width;\n\n  /* Allocate space for inversion array, prepare for preload pass */\n  source->whole_image = (*cinfo->mem->request_virt_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n     row_width, (JDIMENSION) biHeight, (JDIMENSION) 1);\n  source->pub.get_pixel_rows = preload_image;\n  if (cinfo->progress != NULL) {\n    cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n    progress->total_extra_passes++; /* count file input as separate pass */\n  }\n\n  /* Allocate one-row buffer for returned data */\n  source->pub.buffer = (*cinfo->mem->alloc_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE,\n     (JDIMENSION) (biWidth * 3), (JDIMENSION) 1);\n  source->pub.buffer_height = 1;\n\n  cinfo->in_color_space = JCS_RGB;\n  cinfo->input_components = 3;\n  cinfo->data_precision = 8;\n  cinfo->image_width = (JDIMENSION) biWidth;\n  cinfo->image_height = (JDIMENSION) biHeight;\n}\n\n\n/*\n * Finish up at the end of the file.\n */\n\nMETHODDEF(void)\nfinish_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  /* no work */\n}\n\n\n/*\n * The module selection routine for BMP format input.\n */\n\nGLOBAL(cjpeg_source_ptr)\njinit_read_bmp (j_compress_ptr cinfo)\n{\n  bmp_source_ptr source;\n\n  /* Create module interface object */\n  source = (bmp_source_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(bmp_source_struct));\n  source->cinfo = cinfo;\t/* make back link for subroutines */\n  /* Fill in method ptrs, except get_pixel_rows which start_input sets */\n  source->pub.start_input = start_input_bmp;\n  source->pub.finish_input = finish_input_bmp;\n\n  return (cjpeg_source_ptr) source;\n}\n\n#endif /* BMP_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/rdcolmap.c",
    "content": "/*\n * rdcolmap.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file implements djpeg's \"-map file\" switch.  It reads a source image\n * and constructs a colormap to be supplied to the JPEG decompressor.\n *\n * Currently, these file formats are supported for the map file:\n *   GIF: the contents of the GIF's global colormap are used.\n *   PPM (either text or raw flavor): the entire file is read and\n *      each unique pixel value is entered in the map.\n * Note that reading a large PPM file will be horrendously slow.\n * Typically, a PPM-format map file should contain just one pixel\n * of each desired color.  Such a file can be extracted from an\n * ordinary image PPM file with ppmtomap(1).\n *\n * Rescaling a PPM that has a maxval unequal to MAXJSAMPLE is not\n * currently implemented.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef QUANT_2PASS_SUPPORTED\t/* otherwise can't quantize to supplied map */\n\n/* Portions of this code are based on the PBMPLUS library, which is:\n**\n** Copyright (C) 1988 by Jef Poskanzer.\n**\n** Permission to use, copy, modify, and distribute this software and its\n** documentation for any purpose and without fee is hereby granted, provided\n** that the above copyright notice appear in all copies and that both that\n** copyright notice and this permission notice appear in supporting\n** documentation.  This software is provided \"as is\" without express or\n** implied warranty.\n*/\n\n\n/*\n * Add a (potentially) new color to the color map.\n */\n\nLOCAL(void)\nadd_map_entry (j_decompress_ptr cinfo, int R, int G, int B)\n{\n  JSAMPROW colormap0 = cinfo->colormap[0];\n  JSAMPROW colormap1 = cinfo->colormap[1];\n  JSAMPROW colormap2 = cinfo->colormap[2];\n  int ncolors = cinfo->actual_number_of_colors;\n  int index;\n\n  /* Check for duplicate color. */\n  for (index = 0; index < ncolors; index++) {\n    if (GETJSAMPLE(colormap0[index]) == R &&\n\tGETJSAMPLE(colormap1[index]) == G &&\n\tGETJSAMPLE(colormap2[index]) == B)\n      return;\t\t\t/* color is already in map */\n  }\n\n  /* Check for map overflow. */\n  if (ncolors >= (MAXJSAMPLE+1))\n    ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, (MAXJSAMPLE+1));\n\n  /* OK, add color to map. */\n  colormap0[ncolors] = (JSAMPLE) R;\n  colormap1[ncolors] = (JSAMPLE) G;\n  colormap2[ncolors] = (JSAMPLE) B;\n  cinfo->actual_number_of_colors++;\n}\n\n\n/*\n * Extract color map from a GIF file.\n */\n\nLOCAL(void)\nread_gif_map (j_decompress_ptr cinfo, FILE * infile)\n{\n  int header[13];\n  int i, colormaplen;\n  int R, G, B;\n\n  /* Initial 'G' has already been read by read_color_map */\n  /* Read the rest of the GIF header and logical screen descriptor */\n  for (i = 1; i < 13; i++) {\n    if ((header[i] = getc(infile)) == EOF)\n      ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n  }\n\n  /* Verify GIF Header */\n  if (header[1] != 'I' || header[2] != 'F')\n    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n\n  /* There must be a global color map. */\n  if ((header[10] & 0x80) == 0)\n    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n\n  /* OK, fetch it. */\n  colormaplen = 2 << (header[10] & 0x07);\n\n  for (i = 0; i < colormaplen; i++) {\n    R = getc(infile);\n    G = getc(infile);\n    B = getc(infile);\n    if (R == EOF || G == EOF || B == EOF)\n      ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n    add_map_entry(cinfo,\n\t\t  R << (BITS_IN_JSAMPLE-8),\n\t\t  G << (BITS_IN_JSAMPLE-8),\n\t\t  B << (BITS_IN_JSAMPLE-8));\n  }\n}\n\n\n/* Support routines for reading PPM */\n\n\nLOCAL(int)\npbm_getc (FILE * infile)\n/* Read next char, skipping over any comments */\n/* A comment/newline sequence is returned as a newline */\n{\n  register int ch;\n  \n  ch = getc(infile);\n  if (ch == '#') {\n    do {\n      ch = getc(infile);\n    } while (ch != '\\n' && ch != EOF);\n  }\n  return ch;\n}\n\n\nLOCAL(unsigned int)\nread_pbm_integer (j_decompress_ptr cinfo, FILE * infile)\n/* Read an unsigned decimal integer from the PPM file */\n/* Swallows one trailing character after the integer */\n/* Note that on a 16-bit-int machine, only values up to 64k can be read. */\n/* This should not be a problem in practice. */\n{\n  register int ch;\n  register unsigned int val;\n  \n  /* Skip any leading whitespace */\n  do {\n    ch = pbm_getc(infile);\n    if (ch == EOF)\n      ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n  } while (ch == ' ' || ch == '\\t' || ch == '\\n' || ch == '\\r');\n  \n  if (ch < '0' || ch > '9')\n    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n  \n  val = ch - '0';\n  while ((ch = pbm_getc(infile)) >= '0' && ch <= '9') {\n    val *= 10;\n    val += ch - '0';\n  }\n  return val;\n}\n\n\n/*\n * Extract color map from a PPM file.\n */\n\nLOCAL(void)\nread_ppm_map (j_decompress_ptr cinfo, FILE * infile)\n{\n  int c;\n  unsigned int w, h, maxval, row, col;\n  int R, G, B;\n\n  /* Initial 'P' has already been read by read_color_map */\n  c = getc(infile);\t\t/* save format discriminator for a sec */\n\n  /* while we fetch the remaining header info */\n  w = read_pbm_integer(cinfo, infile);\n  h = read_pbm_integer(cinfo, infile);\n  maxval = read_pbm_integer(cinfo, infile);\n\n  if (w <= 0 || h <= 0 || maxval <= 0) /* error check */\n    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n\n  /* For now, we don't support rescaling from an unusual maxval. */\n  if (maxval != (unsigned int) MAXJSAMPLE)\n    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n\n  switch (c) {\n  case '3':\t\t\t/* it's a text-format PPM file */\n    for (row = 0; row < h; row++) {\n      for (col = 0; col < w; col++) {\n\tR = read_pbm_integer(cinfo, infile);\n\tG = read_pbm_integer(cinfo, infile);\n\tB = read_pbm_integer(cinfo, infile);\n\tadd_map_entry(cinfo, R, G, B);\n      }\n    }\n    break;\n\n  case '6':\t\t\t/* it's a raw-format PPM file */\n    for (row = 0; row < h; row++) {\n      for (col = 0; col < w; col++) {\n\tR = getc(infile);\n\tG = getc(infile);\n\tB = getc(infile);\n\tif (R == EOF || G == EOF || B == EOF)\n\t  ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n\tadd_map_entry(cinfo, R, G, B);\n      }\n    }\n    break;\n\n  default:\n    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n    break;\n  }\n}\n\n\n/*\n * Main entry point from djpeg.c.\n *  Input: opened input file (from file name argument on command line).\n *  Output: colormap and actual_number_of_colors fields are set in cinfo.\n */\n\nGLOBAL(void)\nread_color_map (j_decompress_ptr cinfo, FILE * infile)\n{\n  /* Allocate space for a color map of maximum supported size. */\n  cinfo->colormap = (*cinfo->mem->alloc_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE,\n     (JDIMENSION) (MAXJSAMPLE+1), (JDIMENSION) 3);\n  cinfo->actual_number_of_colors = 0; /* initialize map to empty */\n\n  /* Read first byte to determine file format */\n  switch (getc(infile)) {\n  case 'G':\n    read_gif_map(cinfo, infile);\n    break;\n  case 'P':\n    read_ppm_map(cinfo, infile);\n    break;\n  default:\n    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);\n    break;\n  }\n}\n\n#endif /* QUANT_2PASS_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/rdgif.c",
    "content": "/*\n * rdgif.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to read input images in GIF format.\n *\n *****************************************************************************\n * NOTE: to avoid entanglements with Unisys' patent on LZW compression,      *\n * the ability to read GIF files has been removed from the IJG distribution. *\n * Sorry about that.                                                         *\n *****************************************************************************\n *\n * We are required to state that\n *    \"The Graphics Interchange Format(c) is the Copyright property of\n *    CompuServe Incorporated. GIF(sm) is a Service Mark property of\n *    CompuServe Incorporated.\"\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef GIF_SUPPORTED\n\n/*\n * The module selection routine for GIF format input.\n */\n\nGLOBAL(cjpeg_source_ptr)\njinit_read_gif (j_compress_ptr cinfo)\n{\n  fprintf(stderr, \"GIF input is unsupported for legal reasons.  Sorry.\\n\");\n  exit(EXIT_FAILURE);\n  return NULL;\t\t\t/* keep compiler happy */\n}\n\n#endif /* GIF_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/rdjpgcom.c",
    "content": "/*\n * rdjpgcom.c\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * Modified 2009 by Bill Allombert, Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a very simple stand-alone application that displays\n * the text in COM (comment) markers in a JFIF file.\n * This may be useful as an example of the minimum logic needed to parse\n * JPEG markers.\n */\n\n#define JPEG_CJPEG_DJPEG\t/* to get the command-line config symbols */\n#include \"jinclude.h\"\t\t/* get auto-config symbols, <stdio.h> */\n\n#ifdef HAVE_LOCALE_H\n#include <locale.h>\t\t/* Bill Allombert: use locale for isprint */\n#endif\n#include <ctype.h>\t\t/* to declare isupper(), tolower() */\n#ifdef USE_SETMODE\n#include <fcntl.h>\t\t/* to declare setmode()'s parameter macros */\n/* If you have setmode() but not <io.h>, just delete this line: */\n#include <io.h>\t\t\t/* to declare setmode() */\n#endif\n\n#ifdef USE_CCOMMAND\t\t/* command-line reader for Macintosh */\n#ifdef __MWERKS__\n#include <SIOUX.h>              /* Metrowerks needs this */\n#include <console.h>\t\t/* ... and this */\n#endif\n#ifdef THINK_C\n#include <console.h>\t\t/* Think declares it here */\n#endif\n#endif\n\n#ifdef DONT_USE_B_MODE\t\t/* define mode parameters for fopen() */\n#define READ_BINARY\t\"r\"\n#else\n#ifdef VMS\t\t\t/* VMS is very nonstandard */\n#define READ_BINARY\t\"rb\", \"ctx=stm\"\n#else\t\t\t\t/* standard ANSI-compliant case */\n#define READ_BINARY\t\"rb\"\n#endif\n#endif\n\n#ifndef EXIT_FAILURE\t\t/* define exit() codes if not provided */\n#define EXIT_FAILURE  1\n#endif\n#ifndef EXIT_SUCCESS\n#ifdef VMS\n#define EXIT_SUCCESS  1\t\t/* VMS is very nonstandard */\n#else\n#define EXIT_SUCCESS  0\n#endif\n#endif\n\n\n/*\n * These macros are used to read the input file.\n * To reuse this code in another application, you might need to change these.\n */\n\nstatic FILE * infile;\t\t/* input JPEG file */\n\n/* Return next input byte, or EOF if no more */\n#define NEXTBYTE()  getc(infile)\n\n\n/* Error exit handler */\n#define ERREXIT(msg)  (fprintf(stderr, \"%s\\n\", msg), exit(EXIT_FAILURE))\n\n\n/* Read one byte, testing for EOF */\nstatic int\nread_1_byte (void)\n{\n  int c;\n\n  c = NEXTBYTE();\n  if (c == EOF)\n    ERREXIT(\"Premature EOF in JPEG file\");\n  return c;\n}\n\n/* Read 2 bytes, convert to unsigned int */\n/* All 2-byte quantities in JPEG markers are MSB first */\nstatic unsigned int\nread_2_bytes (void)\n{\n  int c1, c2;\n\n  c1 = NEXTBYTE();\n  if (c1 == EOF)\n    ERREXIT(\"Premature EOF in JPEG file\");\n  c2 = NEXTBYTE();\n  if (c2 == EOF)\n    ERREXIT(\"Premature EOF in JPEG file\");\n  return (((unsigned int) c1) << 8) + ((unsigned int) c2);\n}\n\n\n/*\n * JPEG markers consist of one or more 0xFF bytes, followed by a marker\n * code byte (which is not an FF).  Here are the marker codes of interest\n * in this program.  (See jdmarker.c for a more complete list.)\n */\n\n#define M_SOF0  0xC0\t\t/* Start Of Frame N */\n#define M_SOF1  0xC1\t\t/* N indicates which compression process */\n#define M_SOF2  0xC2\t\t/* Only SOF0-SOF2 are now in common use */\n#define M_SOF3  0xC3\n#define M_SOF5  0xC5\t\t/* NB: codes C4 and CC are NOT SOF markers */\n#define M_SOF6  0xC6\n#define M_SOF7  0xC7\n#define M_SOF9  0xC9\n#define M_SOF10 0xCA\n#define M_SOF11 0xCB\n#define M_SOF13 0xCD\n#define M_SOF14 0xCE\n#define M_SOF15 0xCF\n#define M_SOI   0xD8\t\t/* Start Of Image (beginning of datastream) */\n#define M_EOI   0xD9\t\t/* End Of Image (end of datastream) */\n#define M_SOS   0xDA\t\t/* Start Of Scan (begins compressed data) */\n#define M_APP0\t0xE0\t\t/* Application-specific marker, type N */\n#define M_APP12\t0xEC\t\t/* (we don't bother to list all 16 APPn's) */\n#define M_COM   0xFE\t\t/* COMment */\n\n\n/*\n * Find the next JPEG marker and return its marker code.\n * We expect at least one FF byte, possibly more if the compressor used FFs\n * to pad the file.\n * There could also be non-FF garbage between markers.  The treatment of such\n * garbage is unspecified; we choose to skip over it but emit a warning msg.\n * NB: this routine must not be used after seeing SOS marker, since it will\n * not deal correctly with FF/00 sequences in the compressed image data...\n */\n\nstatic int\nnext_marker (void)\n{\n  int c;\n  int discarded_bytes = 0;\n\n  /* Find 0xFF byte; count and skip any non-FFs. */\n  c = read_1_byte();\n  while (c != 0xFF) {\n    discarded_bytes++;\n    c = read_1_byte();\n  }\n  /* Get marker code byte, swallowing any duplicate FF bytes.  Extra FFs\n   * are legal as pad bytes, so don't count them in discarded_bytes.\n   */\n  do {\n    c = read_1_byte();\n  } while (c == 0xFF);\n\n  if (discarded_bytes != 0) {\n    fprintf(stderr, \"Warning: garbage data found in JPEG file\\n\");\n  }\n\n  return c;\n}\n\n\n/*\n * Read the initial marker, which should be SOI.\n * For a JFIF file, the first two bytes of the file should be literally\n * 0xFF M_SOI.  To be more general, we could use next_marker, but if the\n * input file weren't actually JPEG at all, next_marker might read the whole\n * file and then return a misleading error message...\n */\n\nstatic int\nfirst_marker (void)\n{\n  int c1, c2;\n\n  c1 = NEXTBYTE();\n  c2 = NEXTBYTE();\n  if (c1 != 0xFF || c2 != M_SOI)\n    ERREXIT(\"Not a JPEG file\");\n  return c2;\n}\n\n\n/*\n * Most types of marker are followed by a variable-length parameter segment.\n * This routine skips over the parameters for any marker we don't otherwise\n * want to process.\n * Note that we MUST skip the parameter segment explicitly in order not to\n * be fooled by 0xFF bytes that might appear within the parameter segment;\n * such bytes do NOT introduce new markers.\n */\n\nstatic void\nskip_variable (void)\n/* Skip over an unknown or uninteresting variable-length marker */\n{\n  unsigned int length;\n\n  /* Get the marker parameter length count */\n  length = read_2_bytes();\n  /* Length includes itself, so must be at least 2 */\n  if (length < 2)\n    ERREXIT(\"Erroneous JPEG marker length\");\n  length -= 2;\n  /* Skip over the remaining bytes */\n  while (length > 0) {\n    (void) read_1_byte();\n    length--;\n  }\n}\n\n\n/*\n * Process a COM marker.\n * We want to print out the marker contents as legible text;\n * we must guard against non-text junk and varying newline representations.\n */\n\nstatic void\nprocess_COM (int raw)\n{\n  unsigned int length;\n  int ch;\n  int lastch = 0;\n\n  /* Bill Allombert: set locale properly for isprint */\n#ifdef HAVE_LOCALE_H\n  setlocale(LC_CTYPE, \"\");\n#endif\n\n  /* Get the marker parameter length count */\n  length = read_2_bytes();\n  /* Length includes itself, so must be at least 2 */\n  if (length < 2)\n    ERREXIT(\"Erroneous JPEG marker length\");\n  length -= 2;\n\n  while (length > 0) {\n    ch = read_1_byte();\n    if (raw) {\n      putc(ch, stdout);\n    /* Emit the character in a readable form.\n     * Nonprintables are converted to \\nnn form,\n     * while \\ is converted to \\\\.\n     * Newlines in CR, CR/LF, or LF form will be printed as one newline.\n     */\n    } else if (ch == '\\r') {\n      printf(\"\\n\");\n    } else if (ch == '\\n') {\n      if (lastch != '\\r')\n\tprintf(\"\\n\");\n    } else if (ch == '\\\\') {\n      printf(\"\\\\\\\\\");\n    } else if (isprint(ch)) {\n      putc(ch, stdout);\n    } else {\n      printf(\"\\\\%03o\", ch);\n    }\n    lastch = ch;\n    length--;\n  }\n  printf(\"\\n\");\n\n  /* Bill Allombert: revert to C locale */\n#ifdef HAVE_LOCALE_H\n  setlocale(LC_CTYPE, \"C\");\n#endif\n}\n\n\n/*\n * Process a SOFn marker.\n * This code is only needed if you want to know the image dimensions...\n */\n\nstatic void\nprocess_SOFn (int marker)\n{\n  unsigned int length;\n  unsigned int image_height, image_width;\n  int data_precision, num_components;\n  const char * process;\n  int ci;\n\n  length = read_2_bytes();\t/* usual parameter length count */\n\n  data_precision = read_1_byte();\n  image_height = read_2_bytes();\n  image_width = read_2_bytes();\n  num_components = read_1_byte();\n\n  switch (marker) {\n  case M_SOF0:\tprocess = \"Baseline\";  break;\n  case M_SOF1:\tprocess = \"Extended sequential\";  break;\n  case M_SOF2:\tprocess = \"Progressive\";  break;\n  case M_SOF3:\tprocess = \"Lossless\";  break;\n  case M_SOF5:\tprocess = \"Differential sequential\";  break;\n  case M_SOF6:\tprocess = \"Differential progressive\";  break;\n  case M_SOF7:\tprocess = \"Differential lossless\";  break;\n  case M_SOF9:\tprocess = \"Extended sequential, arithmetic coding\";  break;\n  case M_SOF10:\tprocess = \"Progressive, arithmetic coding\";  break;\n  case M_SOF11:\tprocess = \"Lossless, arithmetic coding\";  break;\n  case M_SOF13:\tprocess = \"Differential sequential, arithmetic coding\";  break;\n  case M_SOF14:\tprocess = \"Differential progressive, arithmetic coding\"; break;\n  case M_SOF15:\tprocess = \"Differential lossless, arithmetic coding\";  break;\n  default:\tprocess = \"Unknown\";  break;\n  }\n\n  printf(\"JPEG image is %uw * %uh, %d color components, %d bits per sample\\n\",\n\t image_width, image_height, num_components, data_precision);\n  printf(\"JPEG process: %s\\n\", process);\n\n  if (length != (unsigned int) (8 + num_components * 3))\n    ERREXIT(\"Bogus SOF marker length\");\n\n  for (ci = 0; ci < num_components; ci++) {\n    (void) read_1_byte();\t/* Component ID code */\n    (void) read_1_byte();\t/* H, V sampling factors */\n    (void) read_1_byte();\t/* Quantization table number */\n  }\n}\n\n\n/*\n * Parse the marker stream until SOS or EOI is seen;\n * display any COM markers.\n * While the companion program wrjpgcom will always insert COM markers before\n * SOFn, other implementations might not, so we scan to SOS before stopping.\n * If we were only interested in the image dimensions, we would stop at SOFn.\n * (Conversely, if we only cared about COM markers, there would be no need\n * for special code to handle SOFn; we could treat it like other markers.)\n */\n\nstatic int\nscan_JPEG_header (int verbose, int raw)\n{\n  int marker;\n\n  /* Expect SOI at start of file */\n  if (first_marker() != M_SOI)\n    ERREXIT(\"Expected SOI marker first\");\n\n  /* Scan miscellaneous markers until we reach SOS. */\n  for (;;) {\n    marker = next_marker();\n    switch (marker) {\n      /* Note that marker codes 0xC4, 0xC8, 0xCC are not, and must not be,\n       * treated as SOFn.  C4 in particular is actually DHT.\n       */\n    case M_SOF0:\t\t/* Baseline */\n    case M_SOF1:\t\t/* Extended sequential, Huffman */\n    case M_SOF2:\t\t/* Progressive, Huffman */\n    case M_SOF3:\t\t/* Lossless, Huffman */\n    case M_SOF5:\t\t/* Differential sequential, Huffman */\n    case M_SOF6:\t\t/* Differential progressive, Huffman */\n    case M_SOF7:\t\t/* Differential lossless, Huffman */\n    case M_SOF9:\t\t/* Extended sequential, arithmetic */\n    case M_SOF10:\t\t/* Progressive, arithmetic */\n    case M_SOF11:\t\t/* Lossless, arithmetic */\n    case M_SOF13:\t\t/* Differential sequential, arithmetic */\n    case M_SOF14:\t\t/* Differential progressive, arithmetic */\n    case M_SOF15:\t\t/* Differential lossless, arithmetic */\n      if (verbose)\n\tprocess_SOFn(marker);\n      else\n\tskip_variable();\n      break;\n\n    case M_SOS:\t\t\t/* stop before hitting compressed data */\n      return marker;\n\n    case M_EOI:\t\t\t/* in case it's a tables-only JPEG stream */\n      return marker;\n\n    case M_COM:\n      process_COM(raw);\n      break;\n\n    case M_APP12:\n      /* Some digital camera makers put useful textual information into\n       * APP12 markers, so we print those out too when in -verbose mode.\n       */\n      if (verbose) {\n\tprintf(\"APP12 contains:\\n\");\n\tprocess_COM(raw);\n      } else\n\tskip_variable();\n      break;\n\n    default:\t\t\t/* Anything else just gets skipped */\n      skip_variable();\t\t/* we assume it has a parameter count... */\n      break;\n    }\n  } /* end loop */\n}\n\n\n/* Command line parsing code */\n\nstatic const char * progname;\t/* program name for error messages */\n\n\nstatic void\nusage (void)\n/* complain about bad command line */\n{\n  fprintf(stderr, \"rdjpgcom displays any textual comments in a JPEG file.\\n\");\n\n  fprintf(stderr, \"Usage: %s [switches] [inputfile]\\n\", progname);\n\n  fprintf(stderr, \"Switches (names may be abbreviated):\\n\");\n  fprintf(stderr, \"  -raw        Display non-printable characters in comments (unsafe)\\n\");\n  fprintf(stderr, \"  -verbose    Also display dimensions of JPEG image\\n\");\n\n  exit(EXIT_FAILURE);\n}\n\n\nstatic int\nkeymatch (char * arg, const char * keyword, int minchars)\n/* Case-insensitive matching of (possibly abbreviated) keyword switches. */\n/* keyword is the constant keyword (must be lower case already), */\n/* minchars is length of minimum legal abbreviation. */\n{\n  register int ca, ck;\n  register int nmatched = 0;\n\n  while ((ca = *arg++) != '\\0') {\n    if ((ck = *keyword++) == '\\0')\n      return 0;\t\t\t/* arg longer than keyword, no good */\n    if (isupper(ca))\t\t/* force arg to lcase (assume ck is already) */\n      ca = tolower(ca);\n    if (ca != ck)\n      return 0;\t\t\t/* no good */\n    nmatched++;\t\t\t/* count matched characters */\n  }\n  /* reached end of argument; fail if it's too short for unique abbrev */\n  if (nmatched < minchars)\n    return 0;\n  return 1;\t\t\t/* A-OK */\n}\n\n\n/*\n * The main program.\n */\n\nint\nmain (int argc, char **argv)\n{\n  int argn;\n  char * arg;\n  int verbose = 0, raw = 0;\n\n  /* On Mac, fetch a command line. */\n#ifdef USE_CCOMMAND\n  argc = ccommand(&argv);\n#endif\n\n  progname = argv[0];\n  if (progname == NULL || progname[0] == 0)\n    progname = \"rdjpgcom\";\t/* in case C library doesn't provide it */\n\n  /* Parse switches, if any */\n  for (argn = 1; argn < argc; argn++) {\n    arg = argv[argn];\n    if (arg[0] != '-')\n      break;\t\t\t/* not switch, must be file name */\n    arg++;\t\t\t/* advance over '-' */\n    if (keymatch(arg, \"verbose\", 1)) {\n      verbose++;\n    } else if (keymatch(arg, \"raw\", 1)) {\n      raw = 1;\n    } else\n      usage();\n  }\n\n  /* Open the input file. */\n  /* Unix style: expect zero or one file name */\n  if (argn < argc-1) {\n    fprintf(stderr, \"%s: only one input file\\n\", progname);\n    usage();\n  }\n  if (argn < argc) {\n    if ((infile = fopen(argv[argn], READ_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open %s\\n\", progname, argv[argn]);\n      exit(EXIT_FAILURE);\n    }\n  } else {\n    /* default input file is stdin */\n#ifdef USE_SETMODE\t\t/* need to hack file mode? */\n    setmode(fileno(stdin), O_BINARY);\n#endif\n#ifdef USE_FDOPEN\t\t/* need to re-open in binary mode? */\n    if ((infile = fdopen(fileno(stdin), READ_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open stdin\\n\", progname);\n      exit(EXIT_FAILURE);\n    }\n#else\n    infile = stdin;\n#endif\n  }\n\n  /* Scan the JPEG headers. */\n  (void) scan_JPEG_header(verbose, raw);\n\n  /* All done. */\n  exit(EXIT_SUCCESS);\n  return 0;\t\t\t/* suppress no-return-value warnings */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/rdppm.c",
    "content": "/*\n * rdppm.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * Modified 2009 by Bill Allombert, Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to read input images in PPM/PGM format.\n * The extended 2-byte-per-sample raw PPM/PGM formats are supported.\n * The PBMPLUS library is NOT required to compile this software\n * (but it is highly useful as a set of PPM image manipulation programs).\n *\n * These routines may need modification for non-Unix environments or\n * specialized applications.  As they stand, they assume input from\n * an ordinary stdio stream.  They further assume that reading begins\n * at the start of the file; start_input may need work if the\n * user interface has already read some data (e.g., to determine that\n * the file is indeed PPM format).\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef PPM_SUPPORTED\n\n\n/* Portions of this code are based on the PBMPLUS library, which is:\n**\n** Copyright (C) 1988 by Jef Poskanzer.\n**\n** Permission to use, copy, modify, and distribute this software and its\n** documentation for any purpose and without fee is hereby granted, provided\n** that the above copyright notice appear in all copies and that both that\n** copyright notice and this permission notice appear in supporting\n** documentation.  This software is provided \"as is\" without express or\n** implied warranty.\n*/\n\n\n/* Macros to deal with unsigned chars as efficiently as compiler allows */\n\n#ifdef HAVE_UNSIGNED_CHAR\ntypedef unsigned char U_CHAR;\n#define UCH(x)\t((int) (x))\n#else /* !HAVE_UNSIGNED_CHAR */\n#ifdef CHAR_IS_UNSIGNED\ntypedef char U_CHAR;\n#define UCH(x)\t((int) (x))\n#else\ntypedef char U_CHAR;\n#define UCH(x)\t((int) (x) & 0xFF)\n#endif\n#endif /* HAVE_UNSIGNED_CHAR */\n\n\n#define\tReadOK(file,buffer,len)\t(JFREAD(file,buffer,len) == ((size_t) (len)))\n\n\n/*\n * On most systems, reading individual bytes with getc() is drastically less\n * efficient than buffering a row at a time with fread().  On PCs, we must\n * allocate the buffer in near data space, because we are assuming small-data\n * memory model, wherein fread() can't reach far memory.  If you need to\n * process very wide images on a PC, you might have to compile in large-memory\n * model, or else replace fread() with a getc() loop --- which will be much\n * slower.\n */\n\n\n/* Private version of data source object */\n\ntypedef struct {\n  struct cjpeg_source_struct pub; /* public fields */\n\n  U_CHAR *iobuffer;\t\t/* non-FAR pointer to I/O buffer */\n  JSAMPROW pixrow;\t\t/* FAR pointer to same */\n  size_t buffer_width;\t\t/* width of I/O buffer */\n  JSAMPLE *rescale;\t\t/* => maxval-remapping array, or NULL */\n} ppm_source_struct;\n\ntypedef ppm_source_struct * ppm_source_ptr;\n\n\nLOCAL(int)\npbm_getc (FILE * infile)\n/* Read next char, skipping over any comments */\n/* A comment/newline sequence is returned as a newline */\n{\n  register int ch;\n\n  ch = getc(infile);\n  if (ch == '#') {\n    do {\n      ch = getc(infile);\n    } while (ch != '\\n' && ch != EOF);\n  }\n  return ch;\n}\n\n\nLOCAL(unsigned int)\nread_pbm_integer (j_compress_ptr cinfo, FILE * infile)\n/* Read an unsigned decimal integer from the PPM file */\n/* Swallows one trailing character after the integer */\n/* Note that on a 16-bit-int machine, only values up to 64k can be read. */\n/* This should not be a problem in practice. */\n{\n  register int ch;\n  register unsigned int val;\n\n  /* Skip any leading whitespace */\n  do {\n    ch = pbm_getc(infile);\n    if (ch == EOF)\n      ERREXIT(cinfo, JERR_INPUT_EOF);\n  } while (ch == ' ' || ch == '\\t' || ch == '\\n' || ch == '\\r');\n\n  if (ch < '0' || ch > '9')\n    ERREXIT(cinfo, JERR_PPM_NONNUMERIC);\n\n  val = ch - '0';\n  while ((ch = pbm_getc(infile)) >= '0' && ch <= '9') {\n    val *= 10;\n    val += ch - '0';\n  }\n  return val;\n}\n\n\n/*\n * Read one row of pixels.\n *\n * We provide several different versions depending on input file format.\n * In all cases, input is scaled to the size of JSAMPLE.\n *\n * A really fast path is provided for reading byte/sample raw files with\n * maxval = MAXJSAMPLE, which is the normal case for 8-bit data.\n */\n\n\nMETHODDEF(JDIMENSION)\nget_text_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading text-format PGM files with any maxval */\n{\n  ppm_source_ptr source = (ppm_source_ptr) sinfo;\n  FILE * infile = source->pub.input_file;\n  register JSAMPROW ptr;\n  register JSAMPLE *rescale = source->rescale;\n  JDIMENSION col;\n\n  ptr = source->pub.buffer[0];\n  for (col = cinfo->image_width; col > 0; col--) {\n    *ptr++ = rescale[read_pbm_integer(cinfo, infile)];\n  }\n  return 1;\n}\n\n\nMETHODDEF(JDIMENSION)\nget_text_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading text-format PPM files with any maxval */\n{\n  ppm_source_ptr source = (ppm_source_ptr) sinfo;\n  FILE * infile = source->pub.input_file;\n  register JSAMPROW ptr;\n  register JSAMPLE *rescale = source->rescale;\n  JDIMENSION col;\n\n  ptr = source->pub.buffer[0];\n  for (col = cinfo->image_width; col > 0; col--) {\n    *ptr++ = rescale[read_pbm_integer(cinfo, infile)];\n    *ptr++ = rescale[read_pbm_integer(cinfo, infile)];\n    *ptr++ = rescale[read_pbm_integer(cinfo, infile)];\n  }\n  return 1;\n}\n\n\nMETHODDEF(JDIMENSION)\nget_scaled_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading raw-byte-format PGM files with any maxval */\n{\n  ppm_source_ptr source = (ppm_source_ptr) sinfo;\n  register JSAMPROW ptr;\n  register U_CHAR * bufferptr;\n  register JSAMPLE *rescale = source->rescale;\n  JDIMENSION col;\n\n  if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width))\n    ERREXIT(cinfo, JERR_INPUT_EOF);\n  ptr = source->pub.buffer[0];\n  bufferptr = source->iobuffer;\n  for (col = cinfo->image_width; col > 0; col--) {\n    *ptr++ = rescale[UCH(*bufferptr++)];\n  }\n  return 1;\n}\n\n\nMETHODDEF(JDIMENSION)\nget_scaled_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading raw-byte-format PPM files with any maxval */\n{\n  ppm_source_ptr source = (ppm_source_ptr) sinfo;\n  register JSAMPROW ptr;\n  register U_CHAR * bufferptr;\n  register JSAMPLE *rescale = source->rescale;\n  JDIMENSION col;\n\n  if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width))\n    ERREXIT(cinfo, JERR_INPUT_EOF);\n  ptr = source->pub.buffer[0];\n  bufferptr = source->iobuffer;\n  for (col = cinfo->image_width; col > 0; col--) {\n    *ptr++ = rescale[UCH(*bufferptr++)];\n    *ptr++ = rescale[UCH(*bufferptr++)];\n    *ptr++ = rescale[UCH(*bufferptr++)];\n  }\n  return 1;\n}\n\n\nMETHODDEF(JDIMENSION)\nget_raw_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading raw-byte-format files with maxval = MAXJSAMPLE.\n * In this case we just read right into the JSAMPLE buffer!\n * Note that same code works for PPM and PGM files.\n */\n{\n  ppm_source_ptr source = (ppm_source_ptr) sinfo;\n\n  if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width))\n    ERREXIT(cinfo, JERR_INPUT_EOF);\n  return 1;\n}\n\n\nMETHODDEF(JDIMENSION)\nget_word_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading raw-word-format PGM files with any maxval */\n{\n  ppm_source_ptr source = (ppm_source_ptr) sinfo;\n  register JSAMPROW ptr;\n  register U_CHAR * bufferptr;\n  register JSAMPLE *rescale = source->rescale;\n  JDIMENSION col;\n\n  if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width))\n    ERREXIT(cinfo, JERR_INPUT_EOF);\n  ptr = source->pub.buffer[0];\n  bufferptr = source->iobuffer;\n  for (col = cinfo->image_width; col > 0; col--) {\n    register int temp;\n    temp  = UCH(*bufferptr++) << 8;\n    temp |= UCH(*bufferptr++);\n    *ptr++ = rescale[temp];\n  }\n  return 1;\n}\n\n\nMETHODDEF(JDIMENSION)\nget_word_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading raw-word-format PPM files with any maxval */\n{\n  ppm_source_ptr source = (ppm_source_ptr) sinfo;\n  register JSAMPROW ptr;\n  register U_CHAR * bufferptr;\n  register JSAMPLE *rescale = source->rescale;\n  JDIMENSION col;\n\n  if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width))\n    ERREXIT(cinfo, JERR_INPUT_EOF);\n  ptr = source->pub.buffer[0];\n  bufferptr = source->iobuffer;\n  for (col = cinfo->image_width; col > 0; col--) {\n    register int temp;\n    temp  = UCH(*bufferptr++) << 8;\n    temp |= UCH(*bufferptr++);\n    *ptr++ = rescale[temp];\n    temp  = UCH(*bufferptr++) << 8;\n    temp |= UCH(*bufferptr++);\n    *ptr++ = rescale[temp];\n    temp  = UCH(*bufferptr++) << 8;\n    temp |= UCH(*bufferptr++);\n    *ptr++ = rescale[temp];\n  }\n  return 1;\n}\n\n\n/*\n * Read the file header; return image size and component count.\n */\n\nMETHODDEF(void)\nstart_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  ppm_source_ptr source = (ppm_source_ptr) sinfo;\n  int c;\n  unsigned int w, h, maxval;\n  boolean need_iobuffer, use_raw_buffer, need_rescale;\n\n  if (getc(source->pub.input_file) != 'P')\n    ERREXIT(cinfo, JERR_PPM_NOT);\n\n  c = getc(source->pub.input_file); /* subformat discriminator character */\n\n  /* detect unsupported variants (ie, PBM) before trying to read header */\n  switch (c) {\n  case '2':\t\t\t/* it's a text-format PGM file */\n  case '3':\t\t\t/* it's a text-format PPM file */\n  case '5':\t\t\t/* it's a raw-format PGM file */\n  case '6':\t\t\t/* it's a raw-format PPM file */\n    break;\n  default:\n    ERREXIT(cinfo, JERR_PPM_NOT);\n    break;\n  }\n\n  /* fetch the remaining header info */\n  w = read_pbm_integer(cinfo, source->pub.input_file);\n  h = read_pbm_integer(cinfo, source->pub.input_file);\n  maxval = read_pbm_integer(cinfo, source->pub.input_file);\n\n  if (w <= 0 || h <= 0 || maxval <= 0) /* error check */\n    ERREXIT(cinfo, JERR_PPM_NOT);\n\n  cinfo->data_precision = BITS_IN_JSAMPLE; /* we always rescale data to this */\n  cinfo->image_width = (JDIMENSION) w;\n  cinfo->image_height = (JDIMENSION) h;\n\n  /* initialize flags to most common settings */\n  need_iobuffer = TRUE;\t\t/* do we need an I/O buffer? */\n  use_raw_buffer = FALSE;\t/* do we map input buffer onto I/O buffer? */\n  need_rescale = TRUE;\t\t/* do we need a rescale array? */\n\n  switch (c) {\n  case '2':\t\t\t/* it's a text-format PGM file */\n    cinfo->input_components = 1;\n    cinfo->in_color_space = JCS_GRAYSCALE;\n    TRACEMS2(cinfo, 1, JTRC_PGM_TEXT, w, h);\n    source->pub.get_pixel_rows = get_text_gray_row;\n    need_iobuffer = FALSE;\n    break;\n\n  case '3':\t\t\t/* it's a text-format PPM file */\n    cinfo->input_components = 3;\n    cinfo->in_color_space = JCS_RGB;\n    TRACEMS2(cinfo, 1, JTRC_PPM_TEXT, w, h);\n    source->pub.get_pixel_rows = get_text_rgb_row;\n    need_iobuffer = FALSE;\n    break;\n\n  case '5':\t\t\t/* it's a raw-format PGM file */\n    cinfo->input_components = 1;\n    cinfo->in_color_space = JCS_GRAYSCALE;\n    TRACEMS2(cinfo, 1, JTRC_PGM, w, h);\n    if (maxval > 255) {\n      source->pub.get_pixel_rows = get_word_gray_row;\n    } else if (maxval == MAXJSAMPLE && SIZEOF(JSAMPLE) == SIZEOF(U_CHAR)) {\n      source->pub.get_pixel_rows = get_raw_row;\n      use_raw_buffer = TRUE;\n      need_rescale = FALSE;\n    } else {\n      source->pub.get_pixel_rows = get_scaled_gray_row;\n    }\n    break;\n\n  case '6':\t\t\t/* it's a raw-format PPM file */\n    cinfo->input_components = 3;\n    cinfo->in_color_space = JCS_RGB;\n    TRACEMS2(cinfo, 1, JTRC_PPM, w, h);\n    if (maxval > 255) {\n      source->pub.get_pixel_rows = get_word_rgb_row;\n    } else if (maxval == MAXJSAMPLE && SIZEOF(JSAMPLE) == SIZEOF(U_CHAR)) {\n      source->pub.get_pixel_rows = get_raw_row;\n      use_raw_buffer = TRUE;\n      need_rescale = FALSE;\n    } else {\n      source->pub.get_pixel_rows = get_scaled_rgb_row;\n    }\n    break;\n  }\n\n  /* Allocate space for I/O buffer: 1 or 3 bytes or words/pixel. */\n  if (need_iobuffer) {\n    source->buffer_width = (size_t) w * cinfo->input_components *\n      ((maxval<=255) ? SIZEOF(U_CHAR) : (2*SIZEOF(U_CHAR)));\n    source->iobuffer = (U_CHAR *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  source->buffer_width);\n  }\n\n  /* Create compressor input buffer. */\n  if (use_raw_buffer) {\n    /* For unscaled raw-input case, we can just map it onto the I/O buffer. */\n    /* Synthesize a JSAMPARRAY pointer structure */\n    /* Cast here implies near->far pointer conversion on PCs */\n    source->pixrow = (JSAMPROW) source->iobuffer;\n    source->pub.buffer = & source->pixrow;\n    source->pub.buffer_height = 1;\n  } else {\n    /* Need to translate anyway, so make a separate sample buffer. */\n    source->pub.buffer = (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       (JDIMENSION) w * cinfo->input_components, (JDIMENSION) 1);\n    source->pub.buffer_height = 1;\n  }\n\n  /* Compute the rescaling array if required. */\n  if (need_rescale) {\n    INT32 val, half_maxval;\n\n    /* On 16-bit-int machines we have to be careful of maxval = 65535 */\n    source->rescale = (JSAMPLE *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  (size_t) (((long) maxval + 1L) * SIZEOF(JSAMPLE)));\n    half_maxval = maxval / 2;\n    for (val = 0; val <= (INT32) maxval; val++) {\n      /* The multiplication here must be done in 32 bits to avoid overflow */\n      source->rescale[val] = (JSAMPLE) ((val*MAXJSAMPLE + half_maxval)/maxval);\n    }\n  }\n}\n\n\n/*\n * Finish up at the end of the file.\n */\n\nMETHODDEF(void)\nfinish_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  /* no work */\n}\n\n\n/*\n * The module selection routine for PPM format input.\n */\n\nGLOBAL(cjpeg_source_ptr)\njinit_read_ppm (j_compress_ptr cinfo)\n{\n  ppm_source_ptr source;\n\n  /* Create module interface object */\n  source = (ppm_source_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(ppm_source_struct));\n  /* Fill in method ptrs, except get_pixel_rows which start_input sets */\n  source->pub.start_input = start_input_ppm;\n  source->pub.finish_input = finish_input_ppm;\n\n  return (cjpeg_source_ptr) source;\n}\n\n#endif /* PPM_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/rdrle.c",
    "content": "/*\n * rdrle.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to read input images in Utah RLE format.\n * The Utah Raster Toolkit library is required (version 3.1 or later).\n *\n * These routines may need modification for non-Unix environments or\n * specialized applications.  As they stand, they assume input from\n * an ordinary stdio stream.  They further assume that reading begins\n * at the start of the file; start_input may need work if the\n * user interface has already read some data (e.g., to determine that\n * the file is indeed RLE format).\n *\n * Based on code contributed by Mike Lijewski,\n * with updates from Robert Hutchinson.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef RLE_SUPPORTED\n\n/* rle.h is provided by the Utah Raster Toolkit. */\n\n#include <rle.h>\n\n/*\n * We assume that JSAMPLE has the same representation as rle_pixel,\n * to wit, \"unsigned char\".  Hence we can't cope with 12- or 16-bit samples.\n */\n\n#if BITS_IN_JSAMPLE != 8\n  Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */\n#endif\n\n/*\n * We support the following types of RLE files:\n *   \n *   GRAYSCALE   - 8 bits, no colormap\n *   MAPPEDGRAY  - 8 bits, 1 channel colomap\n *   PSEUDOCOLOR - 8 bits, 3 channel colormap\n *   TRUECOLOR   - 24 bits, 3 channel colormap\n *   DIRECTCOLOR - 24 bits, no colormap\n *\n * For now, we ignore any alpha channel in the image.\n */\n\ntypedef enum\n  { GRAYSCALE, MAPPEDGRAY, PSEUDOCOLOR, TRUECOLOR, DIRECTCOLOR } rle_kind;\n\n\n/*\n * Since RLE stores scanlines bottom-to-top, we have to invert the image\n * to conform to JPEG's top-to-bottom order.  To do this, we read the\n * incoming image into a virtual array on the first get_pixel_rows call,\n * then fetch the required row from the virtual array on subsequent calls.\n */\n\ntypedef struct _rle_source_struct * rle_source_ptr;\n\ntypedef struct _rle_source_struct {\n  struct cjpeg_source_struct pub; /* public fields */\n\n  rle_kind visual;              /* actual type of input file */\n  jvirt_sarray_ptr image;       /* virtual array to hold the image */\n  JDIMENSION row;\t\t/* current row # in the virtual array */\n  rle_hdr header;               /* Input file information */\n  rle_pixel** rle_row;          /* holds a row returned by rle_getrow() */\n\n} rle_source_struct;\n\n\n/*\n * Read the file header; return image size and component count.\n */\n\nMETHODDEF(void)\nstart_input_rle (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  rle_source_ptr source = (rle_source_ptr) sinfo;\n  JDIMENSION width, height;\n#ifdef PROGRESS_REPORT\n  cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n#endif\n\n  /* Use RLE library routine to get the header info */\n  source->header = *rle_hdr_init(NULL);\n  source->header.rle_file = source->pub.input_file;\n  switch (rle_get_setup(&(source->header))) {\n  case RLE_SUCCESS:\n    /* A-OK */\n    break;\n  case RLE_NOT_RLE:\n    ERREXIT(cinfo, JERR_RLE_NOT);\n    break;\n  case RLE_NO_SPACE:\n    ERREXIT(cinfo, JERR_RLE_MEM);\n    break;\n  case RLE_EMPTY:\n    ERREXIT(cinfo, JERR_RLE_EMPTY);\n    break;\n  case RLE_EOF:\n    ERREXIT(cinfo, JERR_RLE_EOF);\n    break;\n  default:\n    ERREXIT(cinfo, JERR_RLE_BADERROR);\n    break;\n  }\n\n  /* Figure out what we have, set private vars and return values accordingly */\n  \n  width  = source->header.xmax - source->header.xmin + 1;\n  height = source->header.ymax - source->header.ymin + 1;\n  source->header.xmin = 0;\t\t/* realign horizontally */\n  source->header.xmax = width-1;\n\n  cinfo->image_width      = width;\n  cinfo->image_height     = height;\n  cinfo->data_precision   = 8;  /* we can only handle 8 bit data */\n\n  if (source->header.ncolors == 1 && source->header.ncmap == 0) {\n    source->visual     = GRAYSCALE;\n    TRACEMS2(cinfo, 1, JTRC_RLE_GRAY, width, height);\n  } else if (source->header.ncolors == 1 && source->header.ncmap == 1) {\n    source->visual     = MAPPEDGRAY;\n    TRACEMS3(cinfo, 1, JTRC_RLE_MAPGRAY, width, height,\n             1 << source->header.cmaplen);\n  } else if (source->header.ncolors == 1 && source->header.ncmap == 3) {\n    source->visual     = PSEUDOCOLOR;\n    TRACEMS3(cinfo, 1, JTRC_RLE_MAPPED, width, height,\n\t     1 << source->header.cmaplen);\n  } else if (source->header.ncolors == 3 && source->header.ncmap == 3) {\n    source->visual     = TRUECOLOR;\n    TRACEMS3(cinfo, 1, JTRC_RLE_FULLMAP, width, height,\n\t     1 << source->header.cmaplen);\n  } else if (source->header.ncolors == 3 && source->header.ncmap == 0) {\n    source->visual     = DIRECTCOLOR;\n    TRACEMS2(cinfo, 1, JTRC_RLE, width, height);\n  } else\n    ERREXIT(cinfo, JERR_RLE_UNSUPPORTED);\n  \n  if (source->visual == GRAYSCALE || source->visual == MAPPEDGRAY) {\n    cinfo->in_color_space   = JCS_GRAYSCALE;\n    cinfo->input_components = 1;\n  } else {\n    cinfo->in_color_space   = JCS_RGB;\n    cinfo->input_components = 3;\n  }\n\n  /*\n   * A place to hold each scanline while it's converted.\n   * (GRAYSCALE scanlines don't need converting)\n   */\n  if (source->visual != GRAYSCALE) {\n    source->rle_row = (rle_pixel**) (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       (JDIMENSION) width, (JDIMENSION) cinfo->input_components);\n  }\n\n  /* request a virtual array to hold the image */\n  source->image = (*cinfo->mem->request_virt_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n     (JDIMENSION) (width * source->header.ncolors),\n     (JDIMENSION) height, (JDIMENSION) 1);\n\n#ifdef PROGRESS_REPORT\n  if (progress != NULL) {\n    /* count file input as separate pass */\n    progress->total_extra_passes++;\n  }\n#endif\n\n  source->pub.buffer_height = 1;\n}\n\n\n/*\n * Read one row of pixels.\n * Called only after load_image has read the image into the virtual array.\n * Used for GRAYSCALE, MAPPEDGRAY, TRUECOLOR, and DIRECTCOLOR images.\n */\n\nMETHODDEF(JDIMENSION)\nget_rle_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  rle_source_ptr source = (rle_source_ptr) sinfo;\n\n  source->row--;\n  source->pub.buffer = (*cinfo->mem->access_virt_sarray)\n    ((j_common_ptr) cinfo, source->image, source->row, (JDIMENSION) 1, FALSE);\n\n  return 1;\n}\n\n/*\n * Read one row of pixels.\n * Called only after load_image has read the image into the virtual array.\n * Used for PSEUDOCOLOR images.\n */\n\nMETHODDEF(JDIMENSION)\nget_pseudocolor_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  rle_source_ptr source = (rle_source_ptr) sinfo;\n  JSAMPROW src_row, dest_row;\n  JDIMENSION col;\n  rle_map *colormap;\n  int val;\n\n  colormap = source->header.cmap;\n  dest_row = source->pub.buffer[0];\n  source->row--;\n  src_row = * (*cinfo->mem->access_virt_sarray)\n    ((j_common_ptr) cinfo, source->image, source->row, (JDIMENSION) 1, FALSE);\n\n  for (col = cinfo->image_width; col > 0; col--) {\n    val = GETJSAMPLE(*src_row++);\n    *dest_row++ = (JSAMPLE) (colormap[val      ] >> 8);\n    *dest_row++ = (JSAMPLE) (colormap[val + 256] >> 8);\n    *dest_row++ = (JSAMPLE) (colormap[val + 512] >> 8);\n  }\n\n  return 1;\n}\n\n\n/*\n * Load the image into a virtual array.  We have to do this because RLE\n * files start at the lower left while the JPEG standard has them starting\n * in the upper left.  This is called the first time we want to get a row\n * of input.  What we do is load the RLE data into the array and then call\n * the appropriate routine to read one row from the array.  Before returning,\n * we set source->pub.get_pixel_rows so that subsequent calls go straight to\n * the appropriate row-reading routine.\n */\n\nMETHODDEF(JDIMENSION)\nload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  rle_source_ptr source = (rle_source_ptr) sinfo;\n  JDIMENSION row, col;\n  JSAMPROW  scanline, red_ptr, green_ptr, blue_ptr;\n  rle_pixel **rle_row;\n  rle_map *colormap;\n  char channel;\n#ifdef PROGRESS_REPORT\n  cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n#endif\n\n  colormap = source->header.cmap;\n  rle_row = source->rle_row;\n\n  /* Read the RLE data into our virtual array.\n   * We assume here that (a) rle_pixel is represented the same as JSAMPLE,\n   * and (b) we are not on a machine where FAR pointers differ from regular.\n   */\n  RLE_CLR_BIT(source->header, RLE_ALPHA); /* don't read the alpha channel */\n\n#ifdef PROGRESS_REPORT\n  if (progress != NULL) {\n    progress->pub.pass_limit = cinfo->image_height;\n    progress->pub.pass_counter = 0;\n    (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n  }\n#endif\n\n  switch (source->visual) {\n\n  case GRAYSCALE:\n  case PSEUDOCOLOR:\n    for (row = 0; row < cinfo->image_height; row++) {\n      rle_row = (rle_pixel **) (*cinfo->mem->access_virt_sarray)\n         ((j_common_ptr) cinfo, source->image, row, (JDIMENSION) 1, TRUE);\n      rle_getrow(&source->header, rle_row);\n#ifdef PROGRESS_REPORT\n      if (progress != NULL) {\n        progress->pub.pass_counter++;\n        (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n      }\n#endif\n    }\n    break;\n\n  case MAPPEDGRAY:\n  case TRUECOLOR:\n    for (row = 0; row < cinfo->image_height; row++) {\n      scanline = * (*cinfo->mem->access_virt_sarray)\n        ((j_common_ptr) cinfo, source->image, row, (JDIMENSION) 1, TRUE);\n      rle_row = source->rle_row;\n      rle_getrow(&source->header, rle_row);\n\n      for (col = 0; col < cinfo->image_width; col++) {\n        for (channel = 0; channel < source->header.ncolors; channel++) {\n          *scanline++ = (JSAMPLE)\n            (colormap[GETJSAMPLE(rle_row[channel][col]) + 256 * channel] >> 8);\n        }\n      }\n\n#ifdef PROGRESS_REPORT\n      if (progress != NULL) {\n        progress->pub.pass_counter++;\n        (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n      }\n#endif\n    }\n    break;\n\n  case DIRECTCOLOR:\n    for (row = 0; row < cinfo->image_height; row++) {\n      scanline = * (*cinfo->mem->access_virt_sarray)\n        ((j_common_ptr) cinfo, source->image, row, (JDIMENSION) 1, TRUE);\n      rle_getrow(&source->header, rle_row);\n\n      red_ptr   = rle_row[0];\n      green_ptr = rle_row[1];\n      blue_ptr  = rle_row[2];\n\n      for (col = cinfo->image_width; col > 0; col--) {\n        *scanline++ = *red_ptr++;\n        *scanline++ = *green_ptr++;\n        *scanline++ = *blue_ptr++;\n      }\n\n#ifdef PROGRESS_REPORT\n      if (progress != NULL) {\n        progress->pub.pass_counter++;\n        (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n      }\n#endif\n    }\n  }\n\n#ifdef PROGRESS_REPORT\n  if (progress != NULL)\n    progress->completed_extra_passes++;\n#endif\n\n  /* Set up to call proper row-extraction routine in future */\n  if (source->visual == PSEUDOCOLOR) {\n    source->pub.buffer = source->rle_row;\n    source->pub.get_pixel_rows = get_pseudocolor_row;\n  } else {\n    source->pub.get_pixel_rows = get_rle_row;\n  }\n  source->row = cinfo->image_height;\n\n  /* And fetch the topmost (bottommost) row */\n  return (*source->pub.get_pixel_rows) (cinfo, sinfo);   \n}\n\n\n/*\n * Finish up at the end of the file.\n */\n\nMETHODDEF(void)\nfinish_input_rle (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  /* no work */\n}\n\n\n/*\n * The module selection routine for RLE format input.\n */\n\nGLOBAL(cjpeg_source_ptr)\njinit_read_rle (j_compress_ptr cinfo)\n{\n  rle_source_ptr source;\n\n  /* Create module interface object */\n  source = (rle_source_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n                                  SIZEOF(rle_source_struct));\n  /* Fill in method ptrs */\n  source->pub.start_input = start_input_rle;\n  source->pub.finish_input = finish_input_rle;\n  source->pub.get_pixel_rows = load_image;\n\n  return (cjpeg_source_ptr) source;\n}\n\n#endif /* RLE_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/rdswitch.c",
    "content": "/*\n * rdswitch.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to process some of cjpeg's more complicated\n * command-line switches.  Switches processed here are:\n *\t-qtables file\t\tRead quantization tables from text file\n *\t-scans file\t\tRead scan script from text file\n *\t-quality N[,N,...]\tSet quality ratings\n *\t-qslots N[,N,...]\tSet component quantization table selectors\n *\t-sample HxV[,HxV,...]\tSet component sampling factors\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n#include <ctype.h>\t\t/* to declare isdigit(), isspace() */\n\n\nLOCAL(int)\ntext_getc (FILE * file)\n/* Read next char, skipping over any comments (# to end of line) */\n/* A comment/newline sequence is returned as a newline */\n{\n  register int ch;\n  \n  ch = getc(file);\n  if (ch == '#') {\n    do {\n      ch = getc(file);\n    } while (ch != '\\n' && ch != EOF);\n  }\n  return ch;\n}\n\n\nLOCAL(boolean)\nread_text_integer (FILE * file, long * result, int * termchar)\n/* Read an unsigned decimal integer from a file, store it in result */\n/* Reads one trailing character after the integer; returns it in termchar */\n{\n  register int ch;\n  register long val;\n  \n  /* Skip any leading whitespace, detect EOF */\n  do {\n    ch = text_getc(file);\n    if (ch == EOF) {\n      *termchar = ch;\n      return FALSE;\n    }\n  } while (isspace(ch));\n  \n  if (! isdigit(ch)) {\n    *termchar = ch;\n    return FALSE;\n  }\n\n  val = ch - '0';\n  while ((ch = text_getc(file)) != EOF) {\n    if (! isdigit(ch))\n      break;\n    val *= 10;\n    val += ch - '0';\n  }\n  *result = val;\n  *termchar = ch;\n  return TRUE;\n}\n\n\nGLOBAL(boolean)\nread_quant_tables (j_compress_ptr cinfo, char * filename, boolean force_baseline)\n/* Read a set of quantization tables from the specified file.\n * The file is plain ASCII text: decimal numbers with whitespace between.\n * Comments preceded by '#' may be included in the file.\n * There may be one to NUM_QUANT_TBLS tables in the file, each of 64 values.\n * The tables are implicitly numbered 0,1,etc.\n * NOTE: does not affect the qslots mapping, which will default to selecting\n * table 0 for luminance (or primary) components, 1 for chrominance components.\n * You must use -qslots if you want a different component->table mapping.\n */\n{\n  FILE * fp;\n  int tblno, i, termchar;\n  long val;\n  unsigned int table[DCTSIZE2];\n\n  if ((fp = fopen(filename, \"r\")) == NULL) {\n    fprintf(stderr, \"Can't open table file %s\\n\", filename);\n    return FALSE;\n  }\n  tblno = 0;\n\n  while (read_text_integer(fp, &val, &termchar)) { /* read 1st element of table */\n    if (tblno >= NUM_QUANT_TBLS) {\n      fprintf(stderr, \"Too many tables in file %s\\n\", filename);\n      fclose(fp);\n      return FALSE;\n    }\n    table[0] = (unsigned int) val;\n    for (i = 1; i < DCTSIZE2; i++) {\n      if (! read_text_integer(fp, &val, &termchar)) {\n\tfprintf(stderr, \"Invalid table data in file %s\\n\", filename);\n\tfclose(fp);\n\treturn FALSE;\n      }\n      table[i] = (unsigned int) val;\n    }\n    jpeg_add_quant_table(cinfo, tblno, table, cinfo->q_scale_factor[tblno],\n\t\t\t force_baseline);\n    tblno++;\n  }\n\n  if (termchar != EOF) {\n    fprintf(stderr, \"Non-numeric data in file %s\\n\", filename);\n    fclose(fp);\n    return FALSE;\n  }\n\n  fclose(fp);\n  return TRUE;\n}\n\n\n#ifdef C_MULTISCAN_FILES_SUPPORTED\n\nLOCAL(boolean)\nread_scan_integer (FILE * file, long * result, int * termchar)\n/* Variant of read_text_integer that always looks for a non-space termchar;\n * this simplifies parsing of punctuation in scan scripts.\n */\n{\n  register int ch;\n\n  if (! read_text_integer(file, result, termchar))\n    return FALSE;\n  ch = *termchar;\n  while (ch != EOF && isspace(ch))\n    ch = text_getc(file);\n  if (isdigit(ch)) {\t\t/* oops, put it back */\n    if (ungetc(ch, file) == EOF)\n      return FALSE;\n    ch = ' ';\n  } else {\n    /* Any separators other than ';' and ':' are ignored;\n     * this allows user to insert commas, etc, if desired.\n     */\n    if (ch != EOF && ch != ';' && ch != ':')\n      ch = ' ';\n  }\n  *termchar = ch;\n  return TRUE;\n}\n\n\nGLOBAL(boolean)\nread_scan_script (j_compress_ptr cinfo, char * filename)\n/* Read a scan script from the specified text file.\n * Each entry in the file defines one scan to be emitted.\n * Entries are separated by semicolons ';'.\n * An entry contains one to four component indexes,\n * optionally followed by a colon ':' and four progressive-JPEG parameters.\n * The component indexes denote which component(s) are to be transmitted\n * in the current scan.  The first component has index 0.\n * Sequential JPEG is used if the progressive-JPEG parameters are omitted.\n * The file is free format text: any whitespace may appear between numbers\n * and the ':' and ';' punctuation marks.  Also, other punctuation (such\n * as commas or dashes) can be placed between numbers if desired.\n * Comments preceded by '#' may be included in the file.\n * Note: we do very little validity checking here;\n * jcmaster.c will validate the script parameters.\n */\n{\n  FILE * fp;\n  int scanno, ncomps, termchar;\n  long val;\n  jpeg_scan_info * scanptr;\n#define MAX_SCANS  100\t\t/* quite arbitrary limit */\n  jpeg_scan_info scans[MAX_SCANS];\n\n  if ((fp = fopen(filename, \"r\")) == NULL) {\n    fprintf(stderr, \"Can't open scan definition file %s\\n\", filename);\n    return FALSE;\n  }\n  scanptr = scans;\n  scanno = 0;\n\n  while (read_scan_integer(fp, &val, &termchar)) {\n    if (scanno >= MAX_SCANS) {\n      fprintf(stderr, \"Too many scans defined in file %s\\n\", filename);\n      fclose(fp);\n      return FALSE;\n    }\n    scanptr->component_index[0] = (int) val;\n    ncomps = 1;\n    while (termchar == ' ') {\n      if (ncomps >= MAX_COMPS_IN_SCAN) {\n\tfprintf(stderr, \"Too many components in one scan in file %s\\n\",\n\t\tfilename);\n\tfclose(fp);\n\treturn FALSE;\n      }\n      if (! read_scan_integer(fp, &val, &termchar))\n\tgoto bogus;\n      scanptr->component_index[ncomps] = (int) val;\n      ncomps++;\n    }\n    scanptr->comps_in_scan = ncomps;\n    if (termchar == ':') {\n      if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')\n\tgoto bogus;\n      scanptr->Ss = (int) val;\n      if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')\n\tgoto bogus;\n      scanptr->Se = (int) val;\n      if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')\n\tgoto bogus;\n      scanptr->Ah = (int) val;\n      if (! read_scan_integer(fp, &val, &termchar))\n\tgoto bogus;\n      scanptr->Al = (int) val;\n    } else {\n      /* set non-progressive parameters */\n      scanptr->Ss = 0;\n      scanptr->Se = DCTSIZE2-1;\n      scanptr->Ah = 0;\n      scanptr->Al = 0;\n    }\n    if (termchar != ';' && termchar != EOF) {\nbogus:\n      fprintf(stderr, \"Invalid scan entry format in file %s\\n\", filename);\n      fclose(fp);\n      return FALSE;\n    }\n    scanptr++, scanno++;\n  }\n\n  if (termchar != EOF) {\n    fprintf(stderr, \"Non-numeric data in file %s\\n\", filename);\n    fclose(fp);\n    return FALSE;\n  }\n\n  if (scanno > 0) {\n    /* Stash completed scan list in cinfo structure.\n     * NOTE: for cjpeg's use, JPOOL_IMAGE is the right lifetime for this data,\n     * but if you want to compress multiple images you'd want JPOOL_PERMANENT.\n     */\n    scanptr = (jpeg_scan_info *)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  scanno * SIZEOF(jpeg_scan_info));\n    MEMCOPY(scanptr, scans, scanno * SIZEOF(jpeg_scan_info));\n    cinfo->scan_info = scanptr;\n    cinfo->num_scans = scanno;\n  }\n\n  fclose(fp);\n  return TRUE;\n}\n\n#endif /* C_MULTISCAN_FILES_SUPPORTED */\n\n\nGLOBAL(boolean)\nset_quality_ratings (j_compress_ptr cinfo, char *arg, boolean force_baseline)\n/* Process a quality-ratings parameter string, of the form\n *     N[,N,...]\n * If there are more q-table slots than parameters, the last value is replicated.\n */\n{\n  int val = 75;\t\t\t/* default value */\n  int tblno;\n  char ch;\n\n  for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {\n    if (*arg) {\n      ch = ',';\t\t\t/* if not set by sscanf, will be ',' */\n      if (sscanf(arg, \"%d%c\", &val, &ch) < 1)\n\treturn FALSE;\n      if (ch != ',')\t\t/* syntax check */\n\treturn FALSE;\n      /* Convert user 0-100 rating to percentage scaling */\n      cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val);\n      while (*arg && *arg++ != ',') /* advance to next segment of arg string */\n\t;\n    } else {\n      /* reached end of parameter, set remaining factors to last value */\n      cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val);\n    }\n  }\n  jpeg_default_qtables(cinfo, force_baseline);\n  return TRUE;\n}\n\n\nGLOBAL(boolean)\nset_quant_slots (j_compress_ptr cinfo, char *arg)\n/* Process a quantization-table-selectors parameter string, of the form\n *     N[,N,...]\n * If there are more components than parameters, the last value is replicated.\n */\n{\n  int val = 0;\t\t\t/* default table # */\n  int ci;\n  char ch;\n\n  for (ci = 0; ci < MAX_COMPONENTS; ci++) {\n    if (*arg) {\n      ch = ',';\t\t\t/* if not set by sscanf, will be ',' */\n      if (sscanf(arg, \"%d%c\", &val, &ch) < 1)\n\treturn FALSE;\n      if (ch != ',')\t\t/* syntax check */\n\treturn FALSE;\n      if (val < 0 || val >= NUM_QUANT_TBLS) {\n\tfprintf(stderr, \"JPEG quantization tables are numbered 0..%d\\n\",\n\t\tNUM_QUANT_TBLS-1);\n\treturn FALSE;\n      }\n      cinfo->comp_info[ci].quant_tbl_no = val;\n      while (*arg && *arg++ != ',') /* advance to next segment of arg string */\n\t;\n    } else {\n      /* reached end of parameter, set remaining components to last table */\n      cinfo->comp_info[ci].quant_tbl_no = val;\n    }\n  }\n  return TRUE;\n}\n\n\nGLOBAL(boolean)\nset_sample_factors (j_compress_ptr cinfo, char *arg)\n/* Process a sample-factors parameter string, of the form\n *     HxV[,HxV,...]\n * If there are more components than parameters, \"1x1\" is assumed for the rest.\n */\n{\n  int ci, val1, val2;\n  char ch1, ch2;\n\n  for (ci = 0; ci < MAX_COMPONENTS; ci++) {\n    if (*arg) {\n      ch2 = ',';\t\t/* if not set by sscanf, will be ',' */\n      if (sscanf(arg, \"%d%c%d%c\", &val1, &ch1, &val2, &ch2) < 3)\n\treturn FALSE;\n      if ((ch1 != 'x' && ch1 != 'X') || ch2 != ',') /* syntax check */\n\treturn FALSE;\n      if (val1 <= 0 || val1 > 4 || val2 <= 0 || val2 > 4) {\n\tfprintf(stderr, \"JPEG sampling factors must be 1..4\\n\");\n\treturn FALSE;\n      }\n      cinfo->comp_info[ci].h_samp_factor = val1;\n      cinfo->comp_info[ci].v_samp_factor = val2;\n      while (*arg && *arg++ != ',') /* advance to next segment of arg string */\n\t;\n    } else {\n      /* reached end of parameter, set remaining components to 1x1 sampling */\n      cinfo->comp_info[ci].h_samp_factor = 1;\n      cinfo->comp_info[ci].v_samp_factor = 1;\n    }\n  }\n  return TRUE;\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/rdtarga.c",
    "content": "/*\n * rdtarga.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to read input images in Targa format.\n *\n * These routines may need modification for non-Unix environments or\n * specialized applications.  As they stand, they assume input from\n * an ordinary stdio stream.  They further assume that reading begins\n * at the start of the file; start_input may need work if the\n * user interface has already read some data (e.g., to determine that\n * the file is indeed Targa format).\n *\n * Based on code contributed by Lee Daniel Crocker.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef TARGA_SUPPORTED\n\n\n/* Macros to deal with unsigned chars as efficiently as compiler allows */\n\n#ifdef HAVE_UNSIGNED_CHAR\ntypedef unsigned char U_CHAR;\n#define UCH(x)\t((int) (x))\n#else /* !HAVE_UNSIGNED_CHAR */\n#ifdef CHAR_IS_UNSIGNED\ntypedef char U_CHAR;\n#define UCH(x)\t((int) (x))\n#else\ntypedef char U_CHAR;\n#define UCH(x)\t((int) (x) & 0xFF)\n#endif\n#endif /* HAVE_UNSIGNED_CHAR */\n\n\n#define\tReadOK(file,buffer,len)\t(JFREAD(file,buffer,len) == ((size_t) (len)))\n\n\n/* Private version of data source object */\n\ntypedef struct _tga_source_struct * tga_source_ptr;\n\ntypedef struct _tga_source_struct {\n  struct cjpeg_source_struct pub; /* public fields */\n\n  j_compress_ptr cinfo;\t\t/* back link saves passing separate parm */\n\n  JSAMPARRAY colormap;\t\t/* Targa colormap (converted to my format) */\n\n  jvirt_sarray_ptr whole_image;\t/* Needed if funny input row order */\n  JDIMENSION current_row;\t/* Current logical row number to read */\n\n  /* Pointer to routine to extract next Targa pixel from input file */\n  JMETHOD(void, read_pixel, (tga_source_ptr sinfo));\n\n  /* Result of read_pixel is delivered here: */\n  U_CHAR tga_pixel[4];\n\n  int pixel_size;\t\t/* Bytes per Targa pixel (1 to 4) */\n\n  /* State info for reading RLE-coded pixels; both counts must be init to 0 */\n  int block_count;\t\t/* # of pixels remaining in RLE block */\n  int dup_pixel_count;\t\t/* # of times to duplicate previous pixel */\n\n  /* This saves the correct pixel-row-expansion method for preload_image */\n  JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,\n\t\t\t\t       cjpeg_source_ptr sinfo));\n} tga_source_struct;\n\n\n/* For expanding 5-bit pixel values to 8-bit with best rounding */\n\nstatic const UINT8 c5to8bits[32] = {\n    0,   8,  16,  25,  33,  41,  49,  58,\n   66,  74,  82,  90,  99, 107, 115, 123,\n  132, 140, 148, 156, 165, 173, 181, 189,\n  197, 206, 214, 222, 230, 239, 247, 255\n};\n\n\n\nLOCAL(int)\nread_byte (tga_source_ptr sinfo)\n/* Read next byte from Targa file */\n{\n  register FILE *infile = sinfo->pub.input_file;\n  register int c;\n\n  if ((c = getc(infile)) == EOF)\n    ERREXIT(sinfo->cinfo, JERR_INPUT_EOF);\n  return c;\n}\n\n\nLOCAL(void)\nread_colormap (tga_source_ptr sinfo, int cmaplen, int mapentrysize)\n/* Read the colormap from a Targa file */\n{\n  int i;\n\n  /* Presently only handles 24-bit BGR format */\n  if (mapentrysize != 24)\n    ERREXIT(sinfo->cinfo, JERR_TGA_BADCMAP);\n\n  for (i = 0; i < cmaplen; i++) {\n    sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo);\n    sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo);\n    sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo);\n  }\n}\n\n\n/*\n * read_pixel methods: get a single pixel from Targa file into tga_pixel[]\n */\n\nMETHODDEF(void)\nread_non_rle_pixel (tga_source_ptr sinfo)\n/* Read one Targa pixel from the input file; no RLE expansion */\n{\n  register FILE *infile = sinfo->pub.input_file;\n  register int i;\n\n  for (i = 0; i < sinfo->pixel_size; i++) {\n    sinfo->tga_pixel[i] = (U_CHAR) getc(infile);\n  }\n}\n\n\nMETHODDEF(void)\nread_rle_pixel (tga_source_ptr sinfo)\n/* Read one Targa pixel from the input file, expanding RLE data as needed */\n{\n  register FILE *infile = sinfo->pub.input_file;\n  register int i;\n\n  /* Duplicate previously read pixel? */\n  if (sinfo->dup_pixel_count > 0) {\n    sinfo->dup_pixel_count--;\n    return;\n  }\n\n  /* Time to read RLE block header? */\n  if (--sinfo->block_count < 0) { /* decrement pixels remaining in block */\n    i = read_byte(sinfo);\n    if (i & 0x80) {\t\t/* Start of duplicate-pixel block? */\n      sinfo->dup_pixel_count = i & 0x7F; /* number of dups after this one */\n      sinfo->block_count = 0;\t/* then read new block header */\n    } else {\n      sinfo->block_count = i & 0x7F; /* number of pixels after this one */\n    }\n  }\n\n  /* Read next pixel */\n  for (i = 0; i < sinfo->pixel_size; i++) {\n    sinfo->tga_pixel[i] = (U_CHAR) getc(infile);\n  }\n}\n\n\n/*\n * Read one row of pixels.\n *\n * We provide several different versions depending on input file format.\n */\n\n\nMETHODDEF(JDIMENSION)\nget_8bit_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading 8-bit grayscale pixels */\n{\n  tga_source_ptr source = (tga_source_ptr) sinfo;\n  register JSAMPROW ptr;\n  register JDIMENSION col;\n  \n  ptr = source->pub.buffer[0];\n  for (col = cinfo->image_width; col > 0; col--) {\n    (*source->read_pixel) (source); /* Load next pixel into tga_pixel */\n    *ptr++ = (JSAMPLE) UCH(source->tga_pixel[0]);\n  }\n  return 1;\n}\n\nMETHODDEF(JDIMENSION)\nget_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading 8-bit colormap indexes */\n{\n  tga_source_ptr source = (tga_source_ptr) sinfo;\n  register int t;\n  register JSAMPROW ptr;\n  register JDIMENSION col;\n  register JSAMPARRAY colormap = source->colormap;\n\n  ptr = source->pub.buffer[0];\n  for (col = cinfo->image_width; col > 0; col--) {\n    (*source->read_pixel) (source); /* Load next pixel into tga_pixel */\n    t = UCH(source->tga_pixel[0]);\n    *ptr++ = colormap[0][t];\n    *ptr++ = colormap[1][t];\n    *ptr++ = colormap[2][t];\n  }\n  return 1;\n}\n\nMETHODDEF(JDIMENSION)\nget_16bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading 16-bit pixels */\n{\n  tga_source_ptr source = (tga_source_ptr) sinfo;\n  register int t;\n  register JSAMPROW ptr;\n  register JDIMENSION col;\n  \n  ptr = source->pub.buffer[0];\n  for (col = cinfo->image_width; col > 0; col--) {\n    (*source->read_pixel) (source); /* Load next pixel into tga_pixel */\n    t = UCH(source->tga_pixel[0]);\n    t += UCH(source->tga_pixel[1]) << 8;\n    /* We expand 5 bit data to 8 bit sample width.\n     * The format of the 16-bit (LSB first) input word is\n     *     xRRRRRGGGGGBBBBB\n     */\n    ptr[2] = (JSAMPLE) c5to8bits[t & 0x1F];\n    t >>= 5;\n    ptr[1] = (JSAMPLE) c5to8bits[t & 0x1F];\n    t >>= 5;\n    ptr[0] = (JSAMPLE) c5to8bits[t & 0x1F];\n    ptr += 3;\n  }\n  return 1;\n}\n\nMETHODDEF(JDIMENSION)\nget_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n/* This version is for reading 24-bit pixels */\n{\n  tga_source_ptr source = (tga_source_ptr) sinfo;\n  register JSAMPROW ptr;\n  register JDIMENSION col;\n  \n  ptr = source->pub.buffer[0];\n  for (col = cinfo->image_width; col > 0; col--) {\n    (*source->read_pixel) (source); /* Load next pixel into tga_pixel */\n    *ptr++ = (JSAMPLE) UCH(source->tga_pixel[2]); /* change BGR to RGB order */\n    *ptr++ = (JSAMPLE) UCH(source->tga_pixel[1]);\n    *ptr++ = (JSAMPLE) UCH(source->tga_pixel[0]);\n  }\n  return 1;\n}\n\n/*\n * Targa also defines a 32-bit pixel format with order B,G,R,A.\n * We presently ignore the attribute byte, so the code for reading\n * these pixels is identical to the 24-bit routine above.\n * This works because the actual pixel length is only known to read_pixel.\n */\n\n#define get_32bit_row  get_24bit_row\n\n\n/*\n * This method is for re-reading the input data in standard top-down\n * row order.  The entire image has already been read into whole_image\n * with proper conversion of pixel format, but it's in a funny row order.\n */\n\nMETHODDEF(JDIMENSION)\nget_memory_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  tga_source_ptr source = (tga_source_ptr) sinfo;\n  JDIMENSION source_row;\n\n  /* Compute row of source that maps to current_row of normal order */\n  /* For now, assume image is bottom-up and not interlaced. */\n  /* NEEDS WORK to support interlaced images! */\n  source_row = cinfo->image_height - source->current_row - 1;\n\n  /* Fetch that row from virtual array */\n  source->pub.buffer = (*cinfo->mem->access_virt_sarray)\n    ((j_common_ptr) cinfo, source->whole_image,\n     source_row, (JDIMENSION) 1, FALSE);\n\n  source->current_row++;\n  return 1;\n}\n\n\n/*\n * This method loads the image into whole_image during the first call on\n * get_pixel_rows.  The get_pixel_rows pointer is then adjusted to call\n * get_memory_row on subsequent calls.\n */\n\nMETHODDEF(JDIMENSION)\npreload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  tga_source_ptr source = (tga_source_ptr) sinfo;\n  JDIMENSION row;\n  cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n\n  /* Read the data into a virtual array in input-file row order. */\n  for (row = 0; row < cinfo->image_height; row++) {\n    if (progress != NULL) {\n      progress->pub.pass_counter = (long) row;\n      progress->pub.pass_limit = (long) cinfo->image_height;\n      (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n    }\n    source->pub.buffer = (*cinfo->mem->access_virt_sarray)\n      ((j_common_ptr) cinfo, source->whole_image, row, (JDIMENSION) 1, TRUE);\n    (*source->get_pixel_rows) (cinfo, sinfo);\n  }\n  if (progress != NULL)\n    progress->completed_extra_passes++;\n\n  /* Set up to read from the virtual array in unscrambled order */\n  source->pub.get_pixel_rows = get_memory_row;\n  source->current_row = 0;\n  /* And read the first row */\n  return get_memory_row(cinfo, sinfo);\n}\n\n\n/*\n * Read the file header; return image size and component count.\n */\n\nMETHODDEF(void)\nstart_input_tga (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  tga_source_ptr source = (tga_source_ptr) sinfo;\n  U_CHAR targaheader[18];\n  int idlen, cmaptype, subtype, flags, interlace_type, components;\n  unsigned int width, height, maplen;\n  boolean is_bottom_up;\n\n#define GET_2B(offset)\t((unsigned int) UCH(targaheader[offset]) + \\\n\t\t\t (((unsigned int) UCH(targaheader[offset+1])) << 8))\n\n  if (! ReadOK(source->pub.input_file, targaheader, 18))\n    ERREXIT(cinfo, JERR_INPUT_EOF);\n\n  /* Pretend \"15-bit\" pixels are 16-bit --- we ignore attribute bit anyway */\n  if (targaheader[16] == 15)\n    targaheader[16] = 16;\n\n  idlen = UCH(targaheader[0]);\n  cmaptype = UCH(targaheader[1]);\n  subtype = UCH(targaheader[2]);\n  maplen = GET_2B(5);\n  width = GET_2B(12);\n  height = GET_2B(14);\n  source->pixel_size = UCH(targaheader[16]) >> 3;\n  flags = UCH(targaheader[17]);\t/* Image Descriptor byte */\n\n  is_bottom_up = ((flags & 0x20) == 0);\t/* bit 5 set => top-down */\n  interlace_type = flags >> 6;\t/* bits 6/7 are interlace code */\n\n  if (cmaptype > 1 ||\t\t/* cmaptype must be 0 or 1 */\n      source->pixel_size < 1 || source->pixel_size > 4 ||\n      (UCH(targaheader[16]) & 7) != 0 || /* bits/pixel must be multiple of 8 */\n      interlace_type != 0 ||      /* currently don't allow interlaced image */\n      width == 0 || height == 0)  /* image width/height must be non-zero */\n    ERREXIT(cinfo, JERR_TGA_BADPARMS);\n  \n  if (subtype > 8) {\n    /* It's an RLE-coded file */\n    source->read_pixel = read_rle_pixel;\n    source->block_count = source->dup_pixel_count = 0;\n    subtype -= 8;\n  } else {\n    /* Non-RLE file */\n    source->read_pixel = read_non_rle_pixel;\n  }\n\n  /* Now should have subtype 1, 2, or 3 */\n  components = 3;\t\t/* until proven different */\n  cinfo->in_color_space = JCS_RGB;\n\n  switch (subtype) {\n  case 1:\t\t\t/* Colormapped image */\n    if (source->pixel_size == 1 && cmaptype == 1)\n      source->get_pixel_rows = get_8bit_row;\n    else\n      ERREXIT(cinfo, JERR_TGA_BADPARMS);\n    TRACEMS2(cinfo, 1, JTRC_TGA_MAPPED, width, height);\n    break;\n  case 2:\t\t\t/* RGB image */\n    switch (source->pixel_size) {\n    case 2:\n      source->get_pixel_rows = get_16bit_row;\n      break;\n    case 3:\n      source->get_pixel_rows = get_24bit_row;\n      break;\n    case 4:\n      source->get_pixel_rows = get_32bit_row;\n      break;\n    default:\n      ERREXIT(cinfo, JERR_TGA_BADPARMS);\n      break;\n    }\n    TRACEMS2(cinfo, 1, JTRC_TGA, width, height);\n    break;\n  case 3:\t\t\t/* Grayscale image */\n    components = 1;\n    cinfo->in_color_space = JCS_GRAYSCALE;\n    if (source->pixel_size == 1)\n      source->get_pixel_rows = get_8bit_gray_row;\n    else\n      ERREXIT(cinfo, JERR_TGA_BADPARMS);\n    TRACEMS2(cinfo, 1, JTRC_TGA_GRAY, width, height);\n    break;\n  default:\n    ERREXIT(cinfo, JERR_TGA_BADPARMS);\n    break;\n  }\n\n  if (is_bottom_up) {\n    /* Create a virtual array to buffer the upside-down image. */\n    source->whole_image = (*cinfo->mem->request_virt_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n       (JDIMENSION) width * components, (JDIMENSION) height, (JDIMENSION) 1);\n    if (cinfo->progress != NULL) {\n      cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n      progress->total_extra_passes++; /* count file input as separate pass */\n    }\n    /* source->pub.buffer will point to the virtual array. */\n    source->pub.buffer_height = 1; /* in case anyone looks at it */\n    source->pub.get_pixel_rows = preload_image;\n  } else {\n    /* Don't need a virtual array, but do need a one-row input buffer. */\n    source->whole_image = NULL;\n    source->pub.buffer = (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       (JDIMENSION) width * components, (JDIMENSION) 1);\n    source->pub.buffer_height = 1;\n    source->pub.get_pixel_rows = source->get_pixel_rows;\n  }\n  \n  while (idlen--)\t\t/* Throw away ID field */\n    (void) read_byte(source);\n\n  if (maplen > 0) {\n    if (maplen > 256 || GET_2B(3) != 0)\n      ERREXIT(cinfo, JERR_TGA_BADCMAP);\n    /* Allocate space to store the colormap */\n    source->colormap = (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE, (JDIMENSION) maplen, (JDIMENSION) 3);\n    /* and read it from the file */\n    read_colormap(source, (int) maplen, UCH(targaheader[7]));\n  } else {\n    if (cmaptype)\t\t/* but you promised a cmap! */\n      ERREXIT(cinfo, JERR_TGA_BADPARMS);\n    source->colormap = NULL;\n  }\n\n  cinfo->input_components = components;\n  cinfo->data_precision = 8;\n  cinfo->image_width = width;\n  cinfo->image_height = height;\n}\n\n\n/*\n * Finish up at the end of the file.\n */\n\nMETHODDEF(void)\nfinish_input_tga (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)\n{\n  /* no work */\n}\n\n\n/*\n * The module selection routine for Targa format input.\n */\n\nGLOBAL(cjpeg_source_ptr)\njinit_read_targa (j_compress_ptr cinfo)\n{\n  tga_source_ptr source;\n\n  /* Create module interface object */\n  source = (tga_source_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(tga_source_struct));\n  source->cinfo = cinfo;\t/* make back link for subroutines */\n  /* Fill in method ptrs, except get_pixel_rows which start_input sets */\n  source->pub.start_input = start_input_tga;\n  source->pub.finish_input = finish_input_tga;\n\n  return (cjpeg_source_ptr) source;\n}\n\n#endif /* TARGA_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/transupp.c",
    "content": "/*\n * transupp.c\n *\n * Copyright (C) 1997-2012, Thomas G. Lane, Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains image transformation routines and other utility code\n * used by the jpegtran sample application.  These are NOT part of the core\n * JPEG library.  But we keep these routines separate from jpegtran.c to\n * ease the task of maintaining jpegtran-like programs that have other user\n * interfaces.\n */\n\n/* Although this file really shouldn't have access to the library internals,\n * it's helpful to let it call jround_up() and jcopy_block_row().\n */\n#define JPEG_INTERNALS\n\n#include \"jinclude.h\"\n#include \"jpeglib.h\"\n#include \"transupp.h\"\t\t/* My own external interface */\n#include <ctype.h>\t\t/* to declare isdigit() */\n\n\n#if TRANSFORMS_SUPPORTED\n\n/*\n * Lossless image transformation routines.  These routines work on DCT\n * coefficient arrays and thus do not require any lossy decompression\n * or recompression of the image.\n * Thanks to Guido Vollbeding for the initial design and code of this feature,\n * and to Ben Jackson for introducing the cropping feature.\n *\n * Horizontal flipping is done in-place, using a single top-to-bottom\n * pass through the virtual source array.  It will thus be much the\n * fastest option for images larger than main memory.\n *\n * The other routines require a set of destination virtual arrays, so they\n * need twice as much memory as jpegtran normally does.  The destination\n * arrays are always written in normal scan order (top to bottom) because\n * the virtual array manager expects this.  The source arrays will be scanned\n * in the corresponding order, which means multiple passes through the source\n * arrays for most of the transforms.  That could result in much thrashing\n * if the image is larger than main memory.\n *\n * If cropping or trimming is involved, the destination arrays may be smaller\n * than the source arrays.  Note it is not possible to do horizontal flip\n * in-place when a nonzero Y crop offset is specified, since we'd have to move\n * data from one block row to another but the virtual array manager doesn't\n * guarantee we can touch more than one row at a time.  So in that case,\n * we have to use a separate destination array.\n *\n * Some notes about the operating environment of the individual transform\n * routines:\n * 1. Both the source and destination virtual arrays are allocated from the\n *    source JPEG object, and therefore should be manipulated by calling the\n *    source's memory manager.\n * 2. The destination's component count should be used.  It may be smaller\n *    than the source's when forcing to grayscale.\n * 3. Likewise the destination's sampling factors should be used.  When\n *    forcing to grayscale the destination's sampling factors will be all 1,\n *    and we may as well take that as the effective iMCU size.\n * 4. When \"trim\" is in effect, the destination's dimensions will be the\n *    trimmed values but the source's will be untrimmed.\n * 5. When \"crop\" is in effect, the destination's dimensions will be the\n *    cropped values but the source's will be uncropped.  Each transform\n *    routine is responsible for picking up source data starting at the\n *    correct X and Y offset for the crop region.  (The X and Y offsets\n *    passed to the transform routines are measured in iMCU blocks of the\n *    destination.)\n * 6. All the routines assume that the source and destination buffers are\n *    padded out to a full iMCU boundary.  This is true, although for the\n *    source buffer it is an undocumented property of jdcoefct.c.\n */\n\n\nLOCAL(void)\ndo_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,\n\t jvirt_barray_ptr *src_coef_arrays,\n\t jvirt_barray_ptr *dst_coef_arrays)\n/* Crop.  This is only used when no rotate/flip is requested with the crop. */\n{\n  JDIMENSION dst_blk_y, x_crop_blocks, y_crop_blocks;\n  int ci, offset_y;\n  JBLOCKARRAY src_buffer, dst_buffer;\n  jpeg_component_info *compptr;\n\n  /* We simply have to copy the right amount of data (the destination's\n   * image size) starting at the given X and Y offsets in the source.\n   */\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;\n    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;\n    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;\n\t dst_blk_y += compptr->v_samp_factor) {\n      dst_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,\n\t (JDIMENSION) compptr->v_samp_factor, TRUE);\n      src_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t dst_blk_y + y_crop_blocks,\n\t (JDIMENSION) compptr->v_samp_factor, FALSE);\n      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {\n\tjcopy_block_row(src_buffer[offset_y] + x_crop_blocks,\n\t\t\tdst_buffer[offset_y],\n\t\t\tcompptr->width_in_blocks);\n      }\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_flip_h_no_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t\t   JDIMENSION x_crop_offset,\n\t\t   jvirt_barray_ptr *src_coef_arrays)\n/* Horizontal flip; done in-place, so no separate dest array is required.\n * NB: this only works when y_crop_offset is zero.\n */\n{\n  JDIMENSION MCU_cols, comp_width, blk_x, blk_y, x_crop_blocks;\n  int ci, k, offset_y;\n  JBLOCKARRAY buffer;\n  JCOEFPTR ptr1, ptr2;\n  JCOEF temp1, temp2;\n  jpeg_component_info *compptr;\n\n  /* Horizontal mirroring of DCT blocks is accomplished by swapping\n   * pairs of blocks in-place.  Within a DCT block, we perform horizontal\n   * mirroring by changing the signs of odd-numbered columns.\n   * Partial iMCUs at the right edge are left untouched.\n   */\n  MCU_cols = srcinfo->output_width /\n    (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);\n\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    comp_width = MCU_cols * compptr->h_samp_factor;\n    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;\n    for (blk_y = 0; blk_y < compptr->height_in_blocks;\n\t blk_y += compptr->v_samp_factor) {\n      buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y,\n\t (JDIMENSION) compptr->v_samp_factor, TRUE);\n      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {\n\t/* Do the mirroring */\n\tfor (blk_x = 0; blk_x * 2 < comp_width; blk_x++) {\n\t  ptr1 = buffer[offset_y][blk_x];\n\t  ptr2 = buffer[offset_y][comp_width - blk_x - 1];\n\t  /* this unrolled loop doesn't need to know which row it's on... */\n\t  for (k = 0; k < DCTSIZE2; k += 2) {\n\t    temp1 = *ptr1;\t/* swap even column */\n\t    temp2 = *ptr2;\n\t    *ptr1++ = temp2;\n\t    *ptr2++ = temp1;\n\t    temp1 = *ptr1;\t/* swap odd column with sign change */\n\t    temp2 = *ptr2;\n\t    *ptr1++ = -temp2;\n\t    *ptr2++ = -temp1;\n\t  }\n\t}\n\tif (x_crop_blocks > 0) {\n\t  /* Now left-justify the portion of the data to be kept.\n\t   * We can't use a single jcopy_block_row() call because that routine\n\t   * depends on memcpy(), whose behavior is unspecified for overlapping\n\t   * source and destination areas.  Sigh.\n\t   */\n\t  for (blk_x = 0; blk_x < compptr->width_in_blocks; blk_x++) {\n\t    jcopy_block_row(buffer[offset_y] + blk_x + x_crop_blocks,\n\t\t\t    buffer[offset_y] + blk_x,\n\t\t\t    (JDIMENSION) 1);\n\t  }\n\t}\n      }\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_flip_h (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t   JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,\n\t   jvirt_barray_ptr *src_coef_arrays,\n\t   jvirt_barray_ptr *dst_coef_arrays)\n/* Horizontal flip in general cropping case */\n{\n  JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y;\n  JDIMENSION x_crop_blocks, y_crop_blocks;\n  int ci, k, offset_y;\n  JBLOCKARRAY src_buffer, dst_buffer;\n  JBLOCKROW src_row_ptr, dst_row_ptr;\n  JCOEFPTR src_ptr, dst_ptr;\n  jpeg_component_info *compptr;\n\n  /* Here we must output into a separate array because we can't touch\n   * different rows of a single virtual array simultaneously.  Otherwise,\n   * this is essentially the same as the routine above.\n   */\n  MCU_cols = srcinfo->output_width /\n    (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);\n\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    comp_width = MCU_cols * compptr->h_samp_factor;\n    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;\n    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;\n    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;\n\t dst_blk_y += compptr->v_samp_factor) {\n      dst_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,\n\t (JDIMENSION) compptr->v_samp_factor, TRUE);\n      src_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t dst_blk_y + y_crop_blocks,\n\t (JDIMENSION) compptr->v_samp_factor, FALSE);\n      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {\n\tdst_row_ptr = dst_buffer[offset_y];\n\tsrc_row_ptr = src_buffer[offset_y];\n\tfor (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {\n\t  if (x_crop_blocks + dst_blk_x < comp_width) {\n\t    /* Do the mirrorable blocks */\n\t    dst_ptr = dst_row_ptr[dst_blk_x];\n\t    src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];\n\t    /* this unrolled loop doesn't need to know which row it's on... */\n\t    for (k = 0; k < DCTSIZE2; k += 2) {\n\t      *dst_ptr++ = *src_ptr++;\t /* copy even column */\n\t      *dst_ptr++ = - *src_ptr++; /* copy odd column with sign change */\n\t    }\n\t  } else {\n\t    /* Copy last partial block(s) verbatim */\n\t    jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks,\n\t\t\t    dst_row_ptr + dst_blk_x,\n\t\t\t    (JDIMENSION) 1);\n\t  }\n\t}\n      }\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_flip_v (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t   JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,\n\t   jvirt_barray_ptr *src_coef_arrays,\n\t   jvirt_barray_ptr *dst_coef_arrays)\n/* Vertical flip */\n{\n  JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y;\n  JDIMENSION x_crop_blocks, y_crop_blocks;\n  int ci, i, j, offset_y;\n  JBLOCKARRAY src_buffer, dst_buffer;\n  JBLOCKROW src_row_ptr, dst_row_ptr;\n  JCOEFPTR src_ptr, dst_ptr;\n  jpeg_component_info *compptr;\n\n  /* We output into a separate array because we can't touch different\n   * rows of the source virtual array simultaneously.  Otherwise, this\n   * is a pretty straightforward analog of horizontal flip.\n   * Within a DCT block, vertical mirroring is done by changing the signs\n   * of odd-numbered rows.\n   * Partial iMCUs at the bottom edge are copied verbatim.\n   */\n  MCU_rows = srcinfo->output_height /\n    (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);\n\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    comp_height = MCU_rows * compptr->v_samp_factor;\n    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;\n    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;\n    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;\n\t dst_blk_y += compptr->v_samp_factor) {\n      dst_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,\n\t (JDIMENSION) compptr->v_samp_factor, TRUE);\n      if (y_crop_blocks + dst_blk_y < comp_height) {\n\t/* Row is within the mirrorable area. */\n\tsrc_buffer = (*srcinfo->mem->access_virt_barray)\n\t  ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t   comp_height - y_crop_blocks - dst_blk_y -\n\t   (JDIMENSION) compptr->v_samp_factor,\n\t   (JDIMENSION) compptr->v_samp_factor, FALSE);\n      } else {\n\t/* Bottom-edge blocks will be copied verbatim. */\n\tsrc_buffer = (*srcinfo->mem->access_virt_barray)\n\t  ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t   dst_blk_y + y_crop_blocks,\n\t   (JDIMENSION) compptr->v_samp_factor, FALSE);\n      }\n      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {\n\tif (y_crop_blocks + dst_blk_y < comp_height) {\n\t  /* Row is within the mirrorable area. */\n\t  dst_row_ptr = dst_buffer[offset_y];\n\t  src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1];\n\t  src_row_ptr += x_crop_blocks;\n\t  for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;\n\t       dst_blk_x++) {\n\t    dst_ptr = dst_row_ptr[dst_blk_x];\n\t    src_ptr = src_row_ptr[dst_blk_x];\n\t    for (i = 0; i < DCTSIZE; i += 2) {\n\t      /* copy even row */\n\t      for (j = 0; j < DCTSIZE; j++)\n\t\t*dst_ptr++ = *src_ptr++;\n\t      /* copy odd row with sign change */\n\t      for (j = 0; j < DCTSIZE; j++)\n\t\t*dst_ptr++ = - *src_ptr++;\n\t    }\n\t  }\n\t} else {\n\t  /* Just copy row verbatim. */\n\t  jcopy_block_row(src_buffer[offset_y] + x_crop_blocks,\n\t\t\t  dst_buffer[offset_y],\n\t\t\t  compptr->width_in_blocks);\n\t}\n      }\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_transpose (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t      JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,\n\t      jvirt_barray_ptr *src_coef_arrays,\n\t      jvirt_barray_ptr *dst_coef_arrays)\n/* Transpose source into destination */\n{\n  JDIMENSION dst_blk_x, dst_blk_y, x_crop_blocks, y_crop_blocks;\n  int ci, i, j, offset_x, offset_y;\n  JBLOCKARRAY src_buffer, dst_buffer;\n  JCOEFPTR src_ptr, dst_ptr;\n  jpeg_component_info *compptr;\n\n  /* Transposing pixels within a block just requires transposing the\n   * DCT coefficients.\n   * Partial iMCUs at the edges require no special treatment; we simply\n   * process all the available DCT blocks for every component.\n   */\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;\n    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;\n    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;\n\t dst_blk_y += compptr->v_samp_factor) {\n      dst_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,\n\t (JDIMENSION) compptr->v_samp_factor, TRUE);\n      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {\n\tfor (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;\n\t     dst_blk_x += compptr->h_samp_factor) {\n\t  src_buffer = (*srcinfo->mem->access_virt_barray)\n\t    ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t     dst_blk_x + x_crop_blocks,\n\t     (JDIMENSION) compptr->h_samp_factor, FALSE);\n\t  for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) {\n\t    dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];\n\t    src_ptr = src_buffer[offset_x][dst_blk_y + offset_y + y_crop_blocks];\n\t    for (i = 0; i < DCTSIZE; i++)\n\t      for (j = 0; j < DCTSIZE; j++)\n\t\tdst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t  }\n\t}\n      }\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_rot_90 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t   JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,\n\t   jvirt_barray_ptr *src_coef_arrays,\n\t   jvirt_barray_ptr *dst_coef_arrays)\n/* 90 degree rotation is equivalent to\n *   1. Transposing the image;\n *   2. Horizontal mirroring.\n * These two steps are merged into a single processing routine.\n */\n{\n  JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y;\n  JDIMENSION x_crop_blocks, y_crop_blocks;\n  int ci, i, j, offset_x, offset_y;\n  JBLOCKARRAY src_buffer, dst_buffer;\n  JCOEFPTR src_ptr, dst_ptr;\n  jpeg_component_info *compptr;\n\n  /* Because of the horizontal mirror step, we can't process partial iMCUs\n   * at the (output) right edge properly.  They just get transposed and\n   * not mirrored.\n   */\n  MCU_cols = srcinfo->output_height /\n    (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);\n\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    comp_width = MCU_cols * compptr->h_samp_factor;\n    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;\n    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;\n    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;\n\t dst_blk_y += compptr->v_samp_factor) {\n      dst_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,\n\t (JDIMENSION) compptr->v_samp_factor, TRUE);\n      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {\n\tfor (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;\n\t     dst_blk_x += compptr->h_samp_factor) {\n\t  if (x_crop_blocks + dst_blk_x < comp_width) {\n\t    /* Block is within the mirrorable area. */\n\t    src_buffer = (*srcinfo->mem->access_virt_barray)\n\t      ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t       comp_width - x_crop_blocks - dst_blk_x -\n\t       (JDIMENSION) compptr->h_samp_factor,\n\t       (JDIMENSION) compptr->h_samp_factor, FALSE);\n\t  } else {\n\t    /* Edge blocks are transposed but not mirrored. */\n\t    src_buffer = (*srcinfo->mem->access_virt_barray)\n\t      ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t       dst_blk_x + x_crop_blocks,\n\t       (JDIMENSION) compptr->h_samp_factor, FALSE);\n\t  }\n\t  for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) {\n\t    dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];\n\t    if (x_crop_blocks + dst_blk_x < comp_width) {\n\t      /* Block is within the mirrorable area. */\n\t      src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1]\n\t\t[dst_blk_y + offset_y + y_crop_blocks];\n\t      for (i = 0; i < DCTSIZE; i++) {\n\t\tfor (j = 0; j < DCTSIZE; j++)\n\t\t  dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t\ti++;\n\t\tfor (j = 0; j < DCTSIZE; j++)\n\t\t  dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j];\n\t      }\n\t    } else {\n\t      /* Edge blocks are transposed but not mirrored. */\n\t      src_ptr = src_buffer[offset_x]\n\t\t[dst_blk_y + offset_y + y_crop_blocks];\n\t      for (i = 0; i < DCTSIZE; i++)\n\t\tfor (j = 0; j < DCTSIZE; j++)\n\t\t  dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t    }\n\t  }\n\t}\n      }\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_rot_270 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t    JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,\n\t    jvirt_barray_ptr *src_coef_arrays,\n\t    jvirt_barray_ptr *dst_coef_arrays)\n/* 270 degree rotation is equivalent to\n *   1. Horizontal mirroring;\n *   2. Transposing the image.\n * These two steps are merged into a single processing routine.\n */\n{\n  JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y;\n  JDIMENSION x_crop_blocks, y_crop_blocks;\n  int ci, i, j, offset_x, offset_y;\n  JBLOCKARRAY src_buffer, dst_buffer;\n  JCOEFPTR src_ptr, dst_ptr;\n  jpeg_component_info *compptr;\n\n  /* Because of the horizontal mirror step, we can't process partial iMCUs\n   * at the (output) bottom edge properly.  They just get transposed and\n   * not mirrored.\n   */\n  MCU_rows = srcinfo->output_width /\n    (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);\n\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    comp_height = MCU_rows * compptr->v_samp_factor;\n    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;\n    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;\n    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;\n\t dst_blk_y += compptr->v_samp_factor) {\n      dst_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,\n\t (JDIMENSION) compptr->v_samp_factor, TRUE);\n      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {\n\tfor (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;\n\t     dst_blk_x += compptr->h_samp_factor) {\n\t  src_buffer = (*srcinfo->mem->access_virt_barray)\n\t    ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t     dst_blk_x + x_crop_blocks,\n\t     (JDIMENSION) compptr->h_samp_factor, FALSE);\n\t  for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) {\n\t    dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];\n\t    if (y_crop_blocks + dst_blk_y < comp_height) {\n\t      /* Block is within the mirrorable area. */\n\t      src_ptr = src_buffer[offset_x]\n\t\t[comp_height - y_crop_blocks - dst_blk_y - offset_y - 1];\n\t      for (i = 0; i < DCTSIZE; i++) {\n\t\tfor (j = 0; j < DCTSIZE; j++) {\n\t\t  dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t\t  j++;\n\t\t  dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j];\n\t\t}\n\t      }\n\t    } else {\n\t      /* Edge blocks are transposed but not mirrored. */\n\t      src_ptr = src_buffer[offset_x]\n\t\t[dst_blk_y + offset_y + y_crop_blocks];\n\t      for (i = 0; i < DCTSIZE; i++)\n\t\tfor (j = 0; j < DCTSIZE; j++)\n\t\t  dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t    }\n\t  }\n\t}\n      }\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t    JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,\n\t    jvirt_barray_ptr *src_coef_arrays,\n\t    jvirt_barray_ptr *dst_coef_arrays)\n/* 180 degree rotation is equivalent to\n *   1. Vertical mirroring;\n *   2. Horizontal mirroring.\n * These two steps are merged into a single processing routine.\n */\n{\n  JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y;\n  JDIMENSION x_crop_blocks, y_crop_blocks;\n  int ci, i, j, offset_y;\n  JBLOCKARRAY src_buffer, dst_buffer;\n  JBLOCKROW src_row_ptr, dst_row_ptr;\n  JCOEFPTR src_ptr, dst_ptr;\n  jpeg_component_info *compptr;\n\n  MCU_cols = srcinfo->output_width /\n    (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);\n  MCU_rows = srcinfo->output_height /\n    (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);\n\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    comp_width = MCU_cols * compptr->h_samp_factor;\n    comp_height = MCU_rows * compptr->v_samp_factor;\n    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;\n    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;\n    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;\n\t dst_blk_y += compptr->v_samp_factor) {\n      dst_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,\n\t (JDIMENSION) compptr->v_samp_factor, TRUE);\n      if (y_crop_blocks + dst_blk_y < comp_height) {\n\t/* Row is within the vertically mirrorable area. */\n\tsrc_buffer = (*srcinfo->mem->access_virt_barray)\n\t  ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t   comp_height - y_crop_blocks - dst_blk_y -\n\t   (JDIMENSION) compptr->v_samp_factor,\n\t   (JDIMENSION) compptr->v_samp_factor, FALSE);\n      } else {\n\t/* Bottom-edge rows are only mirrored horizontally. */\n\tsrc_buffer = (*srcinfo->mem->access_virt_barray)\n\t  ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t   dst_blk_y + y_crop_blocks,\n\t   (JDIMENSION) compptr->v_samp_factor, FALSE);\n      }\n      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {\n\tdst_row_ptr = dst_buffer[offset_y];\n\tif (y_crop_blocks + dst_blk_y < comp_height) {\n\t  /* Row is within the mirrorable area. */\n\t  src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1];\n\t  for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {\n\t    dst_ptr = dst_row_ptr[dst_blk_x];\n\t    if (x_crop_blocks + dst_blk_x < comp_width) {\n\t      /* Process the blocks that can be mirrored both ways. */\n\t      src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];\n\t      for (i = 0; i < DCTSIZE; i += 2) {\n\t\t/* For even row, negate every odd column. */\n\t\tfor (j = 0; j < DCTSIZE; j += 2) {\n\t\t  *dst_ptr++ = *src_ptr++;\n\t\t  *dst_ptr++ = - *src_ptr++;\n\t\t}\n\t\t/* For odd row, negate every even column. */\n\t\tfor (j = 0; j < DCTSIZE; j += 2) {\n\t\t  *dst_ptr++ = - *src_ptr++;\n\t\t  *dst_ptr++ = *src_ptr++;\n\t\t}\n\t      }\n\t    } else {\n\t      /* Any remaining right-edge blocks are only mirrored vertically. */\n\t      src_ptr = src_row_ptr[x_crop_blocks + dst_blk_x];\n\t      for (i = 0; i < DCTSIZE; i += 2) {\n\t\tfor (j = 0; j < DCTSIZE; j++)\n\t\t  *dst_ptr++ = *src_ptr++;\n\t\tfor (j = 0; j < DCTSIZE; j++)\n\t\t  *dst_ptr++ = - *src_ptr++;\n\t      }\n\t    }\n\t  }\n\t} else {\n\t  /* Remaining rows are just mirrored horizontally. */\n\t  src_row_ptr = src_buffer[offset_y];\n\t  for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {\n\t    if (x_crop_blocks + dst_blk_x < comp_width) {\n\t      /* Process the blocks that can be mirrored. */\n\t      dst_ptr = dst_row_ptr[dst_blk_x];\n\t      src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];\n\t      for (i = 0; i < DCTSIZE2; i += 2) {\n\t\t*dst_ptr++ = *src_ptr++;\n\t\t*dst_ptr++ = - *src_ptr++;\n\t      }\n\t    } else {\n\t      /* Any remaining right-edge blocks are only copied. */\n\t      jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks,\n\t\t\t      dst_row_ptr + dst_blk_x,\n\t\t\t      (JDIMENSION) 1);\n\t    }\n\t  }\n\t}\n      }\n    }\n  }\n}\n\n\nLOCAL(void)\ndo_transverse (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t       JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,\n\t       jvirt_barray_ptr *src_coef_arrays,\n\t       jvirt_barray_ptr *dst_coef_arrays)\n/* Transverse transpose is equivalent to\n *   1. 180 degree rotation;\n *   2. Transposition;\n * or\n *   1. Horizontal mirroring;\n *   2. Transposition;\n *   3. Horizontal mirroring.\n * These steps are merged into a single processing routine.\n */\n{\n  JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y;\n  JDIMENSION x_crop_blocks, y_crop_blocks;\n  int ci, i, j, offset_x, offset_y;\n  JBLOCKARRAY src_buffer, dst_buffer;\n  JCOEFPTR src_ptr, dst_ptr;\n  jpeg_component_info *compptr;\n\n  MCU_cols = srcinfo->output_height /\n    (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);\n  MCU_rows = srcinfo->output_width /\n    (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);\n\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    comp_width = MCU_cols * compptr->h_samp_factor;\n    comp_height = MCU_rows * compptr->v_samp_factor;\n    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;\n    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;\n    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;\n\t dst_blk_y += compptr->v_samp_factor) {\n      dst_buffer = (*srcinfo->mem->access_virt_barray)\n\t((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,\n\t (JDIMENSION) compptr->v_samp_factor, TRUE);\n      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {\n\tfor (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;\n\t     dst_blk_x += compptr->h_samp_factor) {\n\t  if (x_crop_blocks + dst_blk_x < comp_width) {\n\t    /* Block is within the mirrorable area. */\n\t    src_buffer = (*srcinfo->mem->access_virt_barray)\n\t      ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t       comp_width - x_crop_blocks - dst_blk_x -\n\t       (JDIMENSION) compptr->h_samp_factor,\n\t       (JDIMENSION) compptr->h_samp_factor, FALSE);\n\t  } else {\n\t    src_buffer = (*srcinfo->mem->access_virt_barray)\n\t      ((j_common_ptr) srcinfo, src_coef_arrays[ci],\n\t       dst_blk_x + x_crop_blocks,\n\t       (JDIMENSION) compptr->h_samp_factor, FALSE);\n\t  }\n\t  for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) {\n\t    dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];\n\t    if (y_crop_blocks + dst_blk_y < comp_height) {\n\t      if (x_crop_blocks + dst_blk_x < comp_width) {\n\t\t/* Block is within the mirrorable area. */\n\t\tsrc_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1]\n\t\t  [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1];\n\t\tfor (i = 0; i < DCTSIZE; i++) {\n\t\t  for (j = 0; j < DCTSIZE; j++) {\n\t\t    dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t\t    j++;\n\t\t    dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j];\n\t\t  }\n\t\t  i++;\n\t\t  for (j = 0; j < DCTSIZE; j++) {\n\t\t    dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j];\n\t\t    j++;\n\t\t    dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t\t  }\n\t\t}\n\t      } else {\n\t\t/* Right-edge blocks are mirrored in y only */\n\t\tsrc_ptr = src_buffer[offset_x]\n\t\t  [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1];\n\t\tfor (i = 0; i < DCTSIZE; i++) {\n\t\t  for (j = 0; j < DCTSIZE; j++) {\n\t\t    dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t\t    j++;\n\t\t    dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j];\n\t\t  }\n\t\t}\n\t      }\n\t    } else {\n\t      if (x_crop_blocks + dst_blk_x < comp_width) {\n\t\t/* Bottom-edge blocks are mirrored in x only */\n\t\tsrc_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1]\n\t\t  [dst_blk_y + offset_y + y_crop_blocks];\n\t\tfor (i = 0; i < DCTSIZE; i++) {\n\t\t  for (j = 0; j < DCTSIZE; j++)\n\t\t    dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t\t  i++;\n\t\t  for (j = 0; j < DCTSIZE; j++)\n\t\t    dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j];\n\t\t}\n\t      } else {\n\t\t/* At lower right corner, just transpose, no mirroring */\n\t\tsrc_ptr = src_buffer[offset_x]\n\t\t  [dst_blk_y + offset_y + y_crop_blocks];\n\t\tfor (i = 0; i < DCTSIZE; i++)\n\t\t  for (j = 0; j < DCTSIZE; j++)\n\t\t    dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];\n\t      }\n\t    }\n\t  }\n\t}\n      }\n    }\n  }\n}\n\n\n/* Parse an unsigned integer: subroutine for jtransform_parse_crop_spec.\n * Returns TRUE if valid integer found, FALSE if not.\n * *strptr is advanced over the digit string, and *result is set to its value.\n */\n\nLOCAL(boolean)\njt_read_integer (const char ** strptr, JDIMENSION * result)\n{\n  const char * ptr = *strptr;\n  JDIMENSION val = 0;\n\n  for (; isdigit(*ptr); ptr++) {\n    val = val * 10 + (JDIMENSION) (*ptr - '0');\n  }\n  *result = val;\n  if (ptr == *strptr)\n    return FALSE;\t\t/* oops, no digits */\n  *strptr = ptr;\n  return TRUE;\n}\n\n\n/* Parse a crop specification (written in X11 geometry style).\n * The routine returns TRUE if the spec string is valid, FALSE if not.\n *\n * The crop spec string should have the format\n *\t<width>[f]x<height>[f]{+-}<xoffset>{+-}<yoffset>\n * where width, height, xoffset, and yoffset are unsigned integers.\n * Each of the elements can be omitted to indicate a default value.\n * (A weakness of this style is that it is not possible to omit xoffset\n * while specifying yoffset, since they look alike.)\n *\n * This code is loosely based on XParseGeometry from the X11 distribution.\n */\n\nGLOBAL(boolean)\njtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec)\n{\n  info->crop = FALSE;\n  info->crop_width_set = JCROP_UNSET;\n  info->crop_height_set = JCROP_UNSET;\n  info->crop_xoffset_set = JCROP_UNSET;\n  info->crop_yoffset_set = JCROP_UNSET;\n\n  if (isdigit(*spec)) {\n    /* fetch width */\n    if (! jt_read_integer(&spec, &info->crop_width))\n      return FALSE;\n    if (*spec == 'f' || *spec == 'F') {\n      spec++;\n      info->crop_width_set = JCROP_FORCE;\n    } else\n      info->crop_width_set = JCROP_POS;\n  }\n  if (*spec == 'x' || *spec == 'X') {\n    /* fetch height */\n    spec++;\n    if (! jt_read_integer(&spec, &info->crop_height))\n      return FALSE;\n    if (*spec == 'f' || *spec == 'F') {\n      spec++;\n      info->crop_height_set = JCROP_FORCE;\n    } else\n      info->crop_height_set = JCROP_POS;\n  }\n  if (*spec == '+' || *spec == '-') {\n    /* fetch xoffset */\n    info->crop_xoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS;\n    spec++;\n    if (! jt_read_integer(&spec, &info->crop_xoffset))\n      return FALSE;\n  }\n  if (*spec == '+' || *spec == '-') {\n    /* fetch yoffset */\n    info->crop_yoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS;\n    spec++;\n    if (! jt_read_integer(&spec, &info->crop_yoffset))\n      return FALSE;\n  }\n  /* We had better have gotten to the end of the string. */\n  if (*spec != '\\0')\n    return FALSE;\n  info->crop = TRUE;\n  return TRUE;\n}\n\n\n/* Trim off any partial iMCUs on the indicated destination edge */\n\nLOCAL(void)\ntrim_right_edge (jpeg_transform_info *info, JDIMENSION full_width)\n{\n  JDIMENSION MCU_cols;\n\n  MCU_cols = info->output_width / info->iMCU_sample_width;\n  if (MCU_cols > 0 && info->x_crop_offset + MCU_cols ==\n      full_width / info->iMCU_sample_width)\n    info->output_width = MCU_cols * info->iMCU_sample_width;\n}\n\nLOCAL(void)\ntrim_bottom_edge (jpeg_transform_info *info, JDIMENSION full_height)\n{\n  JDIMENSION MCU_rows;\n\n  MCU_rows = info->output_height / info->iMCU_sample_height;\n  if (MCU_rows > 0 && info->y_crop_offset + MCU_rows ==\n      full_height / info->iMCU_sample_height)\n    info->output_height = MCU_rows * info->iMCU_sample_height;\n}\n\n\n/* Request any required workspace.\n *\n * This routine figures out the size that the output image will be\n * (which implies that all the transform parameters must be set before\n * it is called).\n *\n * We allocate the workspace virtual arrays from the source decompression\n * object, so that all the arrays (both the original data and the workspace)\n * will be taken into account while making memory management decisions.\n * Hence, this routine must be called after jpeg_read_header (which reads\n * the image dimensions) and before jpeg_read_coefficients (which realizes\n * the source's virtual arrays).\n *\n * This function returns FALSE right away if -perfect is given\n * and transformation is not perfect.  Otherwise returns TRUE.\n */\n\nGLOBAL(boolean)\njtransform_request_workspace (j_decompress_ptr srcinfo,\n\t\t\t      jpeg_transform_info *info)\n{\n  jvirt_barray_ptr *coef_arrays;\n  boolean need_workspace, transpose_it;\n  jpeg_component_info *compptr;\n  JDIMENSION xoffset, yoffset;\n  JDIMENSION width_in_iMCUs, height_in_iMCUs;\n  JDIMENSION width_in_blocks, height_in_blocks;\n  int ci, h_samp_factor, v_samp_factor;\n\n  /* Determine number of components in output image */\n  if (info->force_grayscale &&\n      srcinfo->jpeg_color_space == JCS_YCbCr &&\n      srcinfo->num_components == 3)\n    /* We'll only process the first component */\n    info->num_components = 1;\n  else\n    /* Process all the components */\n    info->num_components = srcinfo->num_components;\n\n  /* Compute output image dimensions and related values. */\n  jpeg_core_output_dimensions(srcinfo);\n\n  /* Return right away if -perfect is given and transformation is not perfect.\n   */\n  if (info->perfect) {\n    if (info->num_components == 1) {\n      if (!jtransform_perfect_transform(srcinfo->output_width,\n\t  srcinfo->output_height,\n\t  srcinfo->min_DCT_h_scaled_size,\n\t  srcinfo->min_DCT_v_scaled_size,\n\t  info->transform))\n\treturn FALSE;\n    } else {\n      if (!jtransform_perfect_transform(srcinfo->output_width,\n\t  srcinfo->output_height,\n\t  srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size,\n\t  srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size,\n\t  info->transform))\n\treturn FALSE;\n    }\n  }\n\n  /* If there is only one output component, force the iMCU size to be 1;\n   * else use the source iMCU size.  (This allows us to do the right thing\n   * when reducing color to grayscale, and also provides a handy way of\n   * cleaning up \"funny\" grayscale images whose sampling factors are not 1x1.)\n   */\n  switch (info->transform) {\n  case JXFORM_TRANSPOSE:\n  case JXFORM_TRANSVERSE:\n  case JXFORM_ROT_90:\n  case JXFORM_ROT_270:\n    info->output_width = srcinfo->output_height;\n    info->output_height = srcinfo->output_width;\n    if (info->num_components == 1) {\n      info->iMCU_sample_width = srcinfo->min_DCT_v_scaled_size;\n      info->iMCU_sample_height = srcinfo->min_DCT_h_scaled_size;\n    } else {\n      info->iMCU_sample_width =\n\tsrcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size;\n      info->iMCU_sample_height =\n\tsrcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size;\n    }\n    break;\n  default:\n    info->output_width = srcinfo->output_width;\n    info->output_height = srcinfo->output_height;\n    if (info->num_components == 1) {\n      info->iMCU_sample_width = srcinfo->min_DCT_h_scaled_size;\n      info->iMCU_sample_height = srcinfo->min_DCT_v_scaled_size;\n    } else {\n      info->iMCU_sample_width =\n\tsrcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size;\n      info->iMCU_sample_height =\n\tsrcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size;\n    }\n    break;\n  }\n\n  /* If cropping has been requested, compute the crop area's position and\n   * dimensions, ensuring that its upper left corner falls at an iMCU boundary.\n   */\n  if (info->crop) {\n    /* Insert default values for unset crop parameters */\n    if (info->crop_xoffset_set == JCROP_UNSET)\n      info->crop_xoffset = 0;\t/* default to +0 */\n    if (info->crop_yoffset_set == JCROP_UNSET)\n      info->crop_yoffset = 0;\t/* default to +0 */\n    if (info->crop_xoffset >= info->output_width ||\n\tinfo->crop_yoffset >= info->output_height)\n      ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);\n    if (info->crop_width_set == JCROP_UNSET)\n      info->crop_width = info->output_width - info->crop_xoffset;\n    if (info->crop_height_set == JCROP_UNSET)\n      info->crop_height = info->output_height - info->crop_yoffset;\n    /* Ensure parameters are valid */\n    if (info->crop_width <= 0 || info->crop_width > info->output_width ||\n\tinfo->crop_height <= 0 || info->crop_height > info->output_height ||\n\tinfo->crop_xoffset > info->output_width - info->crop_width ||\n\tinfo->crop_yoffset > info->output_height - info->crop_height)\n      ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);\n    /* Convert negative crop offsets into regular offsets */\n    if (info->crop_xoffset_set == JCROP_NEG)\n      xoffset = info->output_width - info->crop_width - info->crop_xoffset;\n    else\n      xoffset = info->crop_xoffset;\n    if (info->crop_yoffset_set == JCROP_NEG)\n      yoffset = info->output_height - info->crop_height - info->crop_yoffset;\n    else\n      yoffset = info->crop_yoffset;\n    /* Now adjust so that upper left corner falls at an iMCU boundary */\n    if (info->crop_width_set == JCROP_FORCE)\n      info->output_width = info->crop_width;\n    else\n      info->output_width =\n        info->crop_width + (xoffset % info->iMCU_sample_width);\n    if (info->crop_height_set == JCROP_FORCE)\n      info->output_height = info->crop_height;\n    else\n      info->output_height =\n        info->crop_height + (yoffset % info->iMCU_sample_height);\n    /* Save x/y offsets measured in iMCUs */\n    info->x_crop_offset = xoffset / info->iMCU_sample_width;\n    info->y_crop_offset = yoffset / info->iMCU_sample_height;\n  } else {\n    info->x_crop_offset = 0;\n    info->y_crop_offset = 0;\n  }\n\n  /* Figure out whether we need workspace arrays,\n   * and if so whether they are transposed relative to the source.\n   */\n  need_workspace = FALSE;\n  transpose_it = FALSE;\n  switch (info->transform) {\n  case JXFORM_NONE:\n    if (info->x_crop_offset != 0 || info->y_crop_offset != 0)\n      need_workspace = TRUE;\n    /* No workspace needed if neither cropping nor transforming */\n    break;\n  case JXFORM_FLIP_H:\n    if (info->trim)\n      trim_right_edge(info, srcinfo->output_width);\n    if (info->y_crop_offset != 0)\n      need_workspace = TRUE;\n    /* do_flip_h_no_crop doesn't need a workspace array */\n    break;\n  case JXFORM_FLIP_V:\n    if (info->trim)\n      trim_bottom_edge(info, srcinfo->output_height);\n    /* Need workspace arrays having same dimensions as source image. */\n    need_workspace = TRUE;\n    break;\n  case JXFORM_TRANSPOSE:\n    /* transpose does NOT have to trim anything */\n    /* Need workspace arrays having transposed dimensions. */\n    need_workspace = TRUE;\n    transpose_it = TRUE;\n    break;\n  case JXFORM_TRANSVERSE:\n    if (info->trim) {\n      trim_right_edge(info, srcinfo->output_height);\n      trim_bottom_edge(info, srcinfo->output_width);\n    }\n    /* Need workspace arrays having transposed dimensions. */\n    need_workspace = TRUE;\n    transpose_it = TRUE;\n    break;\n  case JXFORM_ROT_90:\n    if (info->trim)\n      trim_right_edge(info, srcinfo->output_height);\n    /* Need workspace arrays having transposed dimensions. */\n    need_workspace = TRUE;\n    transpose_it = TRUE;\n    break;\n  case JXFORM_ROT_180:\n    if (info->trim) {\n      trim_right_edge(info, srcinfo->output_width);\n      trim_bottom_edge(info, srcinfo->output_height);\n    }\n    /* Need workspace arrays having same dimensions as source image. */\n    need_workspace = TRUE;\n    break;\n  case JXFORM_ROT_270:\n    if (info->trim)\n      trim_bottom_edge(info, srcinfo->output_width);\n    /* Need workspace arrays having transposed dimensions. */\n    need_workspace = TRUE;\n    transpose_it = TRUE;\n    break;\n  }\n\n  /* Allocate workspace if needed.\n   * Note that we allocate arrays padded out to the next iMCU boundary,\n   * so that transform routines need not worry about missing edge blocks.\n   */\n  if (need_workspace) {\n    coef_arrays = (jvirt_barray_ptr *)\n      (*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE,\n\tSIZEOF(jvirt_barray_ptr) * info->num_components);\n    width_in_iMCUs = (JDIMENSION)\n      jdiv_round_up((long) info->output_width,\n\t\t    (long) info->iMCU_sample_width);\n    height_in_iMCUs = (JDIMENSION)\n      jdiv_round_up((long) info->output_height,\n\t\t    (long) info->iMCU_sample_height);\n    for (ci = 0; ci < info->num_components; ci++) {\n      compptr = srcinfo->comp_info + ci;\n      if (info->num_components == 1) {\n\t/* we're going to force samp factors to 1x1 in this case */\n\th_samp_factor = v_samp_factor = 1;\n      } else if (transpose_it) {\n\th_samp_factor = compptr->v_samp_factor;\n\tv_samp_factor = compptr->h_samp_factor;\n      } else {\n\th_samp_factor = compptr->h_samp_factor;\n\tv_samp_factor = compptr->v_samp_factor;\n      }\n      width_in_blocks = width_in_iMCUs * h_samp_factor;\n      height_in_blocks = height_in_iMCUs * v_samp_factor;\n      coef_arrays[ci] = (*srcinfo->mem->request_virt_barray)\n\t((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE,\n\t width_in_blocks, height_in_blocks, (JDIMENSION) v_samp_factor);\n    }\n    info->workspace_coef_arrays = coef_arrays;\n  } else\n    info->workspace_coef_arrays = NULL;\n\n  return TRUE;\n}\n\n\n/* Transpose destination image parameters */\n\nLOCAL(void)\ntranspose_critical_parameters (j_compress_ptr dstinfo)\n{\n  int tblno, i, j, ci, itemp;\n  jpeg_component_info *compptr;\n  JQUANT_TBL *qtblptr;\n  JDIMENSION jtemp;\n  UINT16 qtemp;\n\n  /* Transpose image dimensions */\n  jtemp = dstinfo->image_width;\n  dstinfo->image_width = dstinfo->image_height;\n  dstinfo->image_height = jtemp;\n  itemp = dstinfo->min_DCT_h_scaled_size;\n  dstinfo->min_DCT_h_scaled_size = dstinfo->min_DCT_v_scaled_size;\n  dstinfo->min_DCT_v_scaled_size = itemp;\n\n  /* Transpose sampling factors */\n  for (ci = 0; ci < dstinfo->num_components; ci++) {\n    compptr = dstinfo->comp_info + ci;\n    itemp = compptr->h_samp_factor;\n    compptr->h_samp_factor = compptr->v_samp_factor;\n    compptr->v_samp_factor = itemp;\n  }\n\n  /* Transpose quantization tables */\n  for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {\n    qtblptr = dstinfo->quant_tbl_ptrs[tblno];\n    if (qtblptr != NULL) {\n      for (i = 0; i < DCTSIZE; i++) {\n\tfor (j = 0; j < i; j++) {\n\t  qtemp = qtblptr->quantval[i*DCTSIZE+j];\n\t  qtblptr->quantval[i*DCTSIZE+j] = qtblptr->quantval[j*DCTSIZE+i];\n\t  qtblptr->quantval[j*DCTSIZE+i] = qtemp;\n\t}\n      }\n    }\n  }\n}\n\n\n/* Adjust Exif image parameters.\n *\n * We try to adjust the Tags ExifImageWidth and ExifImageHeight if possible.\n */\n\nLOCAL(void)\nadjust_exif_parameters (JOCTET FAR * data, unsigned int length,\n\t\t\tJDIMENSION new_width, JDIMENSION new_height)\n{\n  boolean is_motorola; /* Flag for byte order */\n  unsigned int number_of_tags, tagnum;\n  unsigned int firstoffset, offset;\n  JDIMENSION new_value;\n\n  if (length < 12) return; /* Length of an IFD entry */\n\n  /* Discover byte order */\n  if (GETJOCTET(data[0]) == 0x49 && GETJOCTET(data[1]) == 0x49)\n    is_motorola = FALSE;\n  else if (GETJOCTET(data[0]) == 0x4D && GETJOCTET(data[1]) == 0x4D)\n    is_motorola = TRUE;\n  else\n    return;\n\n  /* Check Tag Mark */\n  if (is_motorola) {\n    if (GETJOCTET(data[2]) != 0) return;\n    if (GETJOCTET(data[3]) != 0x2A) return;\n  } else {\n    if (GETJOCTET(data[3]) != 0) return;\n    if (GETJOCTET(data[2]) != 0x2A) return;\n  }\n\n  /* Get first IFD offset (offset to IFD0) */\n  if (is_motorola) {\n    if (GETJOCTET(data[4]) != 0) return;\n    if (GETJOCTET(data[5]) != 0) return;\n    firstoffset = GETJOCTET(data[6]);\n    firstoffset <<= 8;\n    firstoffset += GETJOCTET(data[7]);\n  } else {\n    if (GETJOCTET(data[7]) != 0) return;\n    if (GETJOCTET(data[6]) != 0) return;\n    firstoffset = GETJOCTET(data[5]);\n    firstoffset <<= 8;\n    firstoffset += GETJOCTET(data[4]);\n  }\n  if (firstoffset > length - 2) return; /* check end of data segment */\n\n  /* Get the number of directory entries contained in this IFD */\n  if (is_motorola) {\n    number_of_tags = GETJOCTET(data[firstoffset]);\n    number_of_tags <<= 8;\n    number_of_tags += GETJOCTET(data[firstoffset+1]);\n  } else {\n    number_of_tags = GETJOCTET(data[firstoffset+1]);\n    number_of_tags <<= 8;\n    number_of_tags += GETJOCTET(data[firstoffset]);\n  }\n  if (number_of_tags == 0) return;\n  firstoffset += 2;\n\n  /* Search for ExifSubIFD offset Tag in IFD0 */\n  for (;;) {\n    if (firstoffset > length - 12) return; /* check end of data segment */\n    /* Get Tag number */\n    if (is_motorola) {\n      tagnum = GETJOCTET(data[firstoffset]);\n      tagnum <<= 8;\n      tagnum += GETJOCTET(data[firstoffset+1]);\n    } else {\n      tagnum = GETJOCTET(data[firstoffset+1]);\n      tagnum <<= 8;\n      tagnum += GETJOCTET(data[firstoffset]);\n    }\n    if (tagnum == 0x8769) break; /* found ExifSubIFD offset Tag */\n    if (--number_of_tags == 0) return;\n    firstoffset += 12;\n  }\n\n  /* Get the ExifSubIFD offset */\n  if (is_motorola) {\n    if (GETJOCTET(data[firstoffset+8]) != 0) return;\n    if (GETJOCTET(data[firstoffset+9]) != 0) return;\n    offset = GETJOCTET(data[firstoffset+10]);\n    offset <<= 8;\n    offset += GETJOCTET(data[firstoffset+11]);\n  } else {\n    if (GETJOCTET(data[firstoffset+11]) != 0) return;\n    if (GETJOCTET(data[firstoffset+10]) != 0) return;\n    offset = GETJOCTET(data[firstoffset+9]);\n    offset <<= 8;\n    offset += GETJOCTET(data[firstoffset+8]);\n  }\n  if (offset > length - 2) return; /* check end of data segment */\n\n  /* Get the number of directory entries contained in this SubIFD */\n  if (is_motorola) {\n    number_of_tags = GETJOCTET(data[offset]);\n    number_of_tags <<= 8;\n    number_of_tags += GETJOCTET(data[offset+1]);\n  } else {\n    number_of_tags = GETJOCTET(data[offset+1]);\n    number_of_tags <<= 8;\n    number_of_tags += GETJOCTET(data[offset]);\n  }\n  if (number_of_tags < 2) return;\n  offset += 2;\n\n  /* Search for ExifImageWidth and ExifImageHeight Tags in this SubIFD */\n  do {\n    if (offset > length - 12) return; /* check end of data segment */\n    /* Get Tag number */\n    if (is_motorola) {\n      tagnum = GETJOCTET(data[offset]);\n      tagnum <<= 8;\n      tagnum += GETJOCTET(data[offset+1]);\n    } else {\n      tagnum = GETJOCTET(data[offset+1]);\n      tagnum <<= 8;\n      tagnum += GETJOCTET(data[offset]);\n    }\n    if (tagnum == 0xA002 || tagnum == 0xA003) {\n      if (tagnum == 0xA002)\n\tnew_value = new_width; /* ExifImageWidth Tag */\n      else\n\tnew_value = new_height; /* ExifImageHeight Tag */\n      if (is_motorola) {\n\tdata[offset+2] = 0; /* Format = unsigned long (4 octets) */\n\tdata[offset+3] = 4;\n\tdata[offset+4] = 0; /* Number Of Components = 1 */\n\tdata[offset+5] = 0;\n\tdata[offset+6] = 0;\n\tdata[offset+7] = 1;\n\tdata[offset+8] = 0;\n\tdata[offset+9] = 0;\n\tdata[offset+10] = (JOCTET)((new_value >> 8) & 0xFF);\n\tdata[offset+11] = (JOCTET)(new_value & 0xFF);\n      } else {\n\tdata[offset+2] = 4; /* Format = unsigned long (4 octets) */\n\tdata[offset+3] = 0;\n\tdata[offset+4] = 1; /* Number Of Components = 1 */\n\tdata[offset+5] = 0;\n\tdata[offset+6] = 0;\n\tdata[offset+7] = 0;\n\tdata[offset+8] = (JOCTET)(new_value & 0xFF);\n\tdata[offset+9] = (JOCTET)((new_value >> 8) & 0xFF);\n\tdata[offset+10] = 0;\n\tdata[offset+11] = 0;\n      }\n    }\n    offset += 12;\n  } while (--number_of_tags);\n}\n\n\n/* Adjust output image parameters as needed.\n *\n * This must be called after jpeg_copy_critical_parameters()\n * and before jpeg_write_coefficients().\n *\n * The return value is the set of virtual coefficient arrays to be written\n * (either the ones allocated by jtransform_request_workspace, or the\n * original source data arrays).  The caller will need to pass this value\n * to jpeg_write_coefficients().\n */\n\nGLOBAL(jvirt_barray_ptr *)\njtransform_adjust_parameters (j_decompress_ptr srcinfo,\n\t\t\t      j_compress_ptr dstinfo,\n\t\t\t      jvirt_barray_ptr *src_coef_arrays,\n\t\t\t      jpeg_transform_info *info)\n{\n  /* If force-to-grayscale is requested, adjust destination parameters */\n  if (info->force_grayscale) {\n    /* First, ensure we have YCbCr or grayscale data, and that the source's\n     * Y channel is full resolution.  (No reasonable person would make Y\n     * be less than full resolution, so actually coping with that case\n     * isn't worth extra code space.  But we check it to avoid crashing.)\n     */\n    if (((dstinfo->jpeg_color_space == JCS_YCbCr &&\n\t  dstinfo->num_components == 3) ||\n\t (dstinfo->jpeg_color_space == JCS_GRAYSCALE &&\n\t  dstinfo->num_components == 1)) &&\n\tsrcinfo->comp_info[0].h_samp_factor == srcinfo->max_h_samp_factor &&\n\tsrcinfo->comp_info[0].v_samp_factor == srcinfo->max_v_samp_factor) {\n      /* We use jpeg_set_colorspace to make sure subsidiary settings get fixed\n       * properly.  Among other things, it sets the target h_samp_factor &\n       * v_samp_factor to 1, which typically won't match the source.\n       * We have to preserve the source's quantization table number, however.\n       */\n      int sv_quant_tbl_no = dstinfo->comp_info[0].quant_tbl_no;\n      jpeg_set_colorspace(dstinfo, JCS_GRAYSCALE);\n      dstinfo->comp_info[0].quant_tbl_no = sv_quant_tbl_no;\n    } else {\n      /* Sorry, can't do it */\n      ERREXIT(dstinfo, JERR_CONVERSION_NOTIMPL);\n    }\n  } else if (info->num_components == 1) {\n    /* For a single-component source, we force the destination sampling factors\n     * to 1x1, with or without force_grayscale.  This is useful because some\n     * decoders choke on grayscale images with other sampling factors.\n     */\n    dstinfo->comp_info[0].h_samp_factor = 1;\n    dstinfo->comp_info[0].v_samp_factor = 1;\n  }\n\n  /* Correct the destination's image dimensions as necessary\n   * for rotate/flip, resize, and crop operations.\n   */\n  dstinfo->jpeg_width = info->output_width;\n  dstinfo->jpeg_height = info->output_height;\n\n  /* Transpose destination image parameters */\n  switch (info->transform) {\n  case JXFORM_TRANSPOSE:\n  case JXFORM_TRANSVERSE:\n  case JXFORM_ROT_90:\n  case JXFORM_ROT_270:\n    transpose_critical_parameters(dstinfo);\n    break;\n  default:\n    break;\n  }\n\n  /* Adjust Exif properties */\n  if (srcinfo->marker_list != NULL &&\n      srcinfo->marker_list->marker == JPEG_APP0+1 &&\n      srcinfo->marker_list->data_length >= 6 &&\n      GETJOCTET(srcinfo->marker_list->data[0]) == 0x45 &&\n      GETJOCTET(srcinfo->marker_list->data[1]) == 0x78 &&\n      GETJOCTET(srcinfo->marker_list->data[2]) == 0x69 &&\n      GETJOCTET(srcinfo->marker_list->data[3]) == 0x66 &&\n      GETJOCTET(srcinfo->marker_list->data[4]) == 0 &&\n      GETJOCTET(srcinfo->marker_list->data[5]) == 0) {\n    /* Suppress output of JFIF marker */\n    dstinfo->write_JFIF_header = FALSE;\n    /* Adjust Exif image parameters */\n    if (dstinfo->jpeg_width != srcinfo->image_width ||\n\tdstinfo->jpeg_height != srcinfo->image_height)\n      /* Align data segment to start of TIFF structure for parsing */\n      adjust_exif_parameters(srcinfo->marker_list->data + 6,\n\tsrcinfo->marker_list->data_length - 6,\n\tdstinfo->jpeg_width, dstinfo->jpeg_height);\n  }\n\n  /* Return the appropriate output data set */\n  if (info->workspace_coef_arrays != NULL)\n    return info->workspace_coef_arrays;\n  return src_coef_arrays;\n}\n\n\n/* Execute the actual transformation, if any.\n *\n * This must be called *after* jpeg_write_coefficients, because it depends\n * on jpeg_write_coefficients to have computed subsidiary values such as\n * the per-component width and height fields in the destination object.\n *\n * Note that some transformations will modify the source data arrays!\n */\n\nGLOBAL(void)\njtransform_execute_transform (j_decompress_ptr srcinfo,\n\t\t\t      j_compress_ptr dstinfo,\n\t\t\t      jvirt_barray_ptr *src_coef_arrays,\n\t\t\t      jpeg_transform_info *info)\n{\n  jvirt_barray_ptr *dst_coef_arrays = info->workspace_coef_arrays;\n\n  /* Note: conditions tested here should match those in switch statement\n   * in jtransform_request_workspace()\n   */\n  switch (info->transform) {\n  case JXFORM_NONE:\n    if (info->x_crop_offset != 0 || info->y_crop_offset != 0)\n      do_crop(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,\n\t      src_coef_arrays, dst_coef_arrays);\n    break;\n  case JXFORM_FLIP_H:\n    if (info->y_crop_offset != 0)\n      do_flip_h(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,\n\t\tsrc_coef_arrays, dst_coef_arrays);\n    else\n      do_flip_h_no_crop(srcinfo, dstinfo, info->x_crop_offset,\n\t\t\tsrc_coef_arrays);\n    break;\n  case JXFORM_FLIP_V:\n    do_flip_v(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,\n\t      src_coef_arrays, dst_coef_arrays);\n    break;\n  case JXFORM_TRANSPOSE:\n    do_transpose(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,\n\t\t src_coef_arrays, dst_coef_arrays);\n    break;\n  case JXFORM_TRANSVERSE:\n    do_transverse(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,\n\t\t  src_coef_arrays, dst_coef_arrays);\n    break;\n  case JXFORM_ROT_90:\n    do_rot_90(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,\n\t      src_coef_arrays, dst_coef_arrays);\n    break;\n  case JXFORM_ROT_180:\n    do_rot_180(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,\n\t       src_coef_arrays, dst_coef_arrays);\n    break;\n  case JXFORM_ROT_270:\n    do_rot_270(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,\n\t       src_coef_arrays, dst_coef_arrays);\n    break;\n  }\n}\n\n/* jtransform_perfect_transform\n *\n * Determine whether lossless transformation is perfectly\n * possible for a specified image and transformation.\n *\n * Inputs:\n *   image_width, image_height: source image dimensions.\n *   MCU_width, MCU_height: pixel dimensions of MCU.\n *   transform: transformation identifier.\n * Parameter sources from initialized jpeg_struct\n * (after reading source header):\n *   image_width = cinfo.image_width\n *   image_height = cinfo.image_height\n *   MCU_width = cinfo.max_h_samp_factor * cinfo.block_size\n *   MCU_height = cinfo.max_v_samp_factor * cinfo.block_size\n * Result:\n *   TRUE = perfect transformation possible\n *   FALSE = perfect transformation not possible\n *           (may use custom action then)\n */\n\nGLOBAL(boolean)\njtransform_perfect_transform(JDIMENSION image_width, JDIMENSION image_height,\n\t\t\t     int MCU_width, int MCU_height,\n\t\t\t     JXFORM_CODE transform)\n{\n  boolean result = TRUE; /* initialize TRUE */\n\n  switch (transform) {\n  case JXFORM_FLIP_H:\n  case JXFORM_ROT_270:\n    if (image_width % (JDIMENSION) MCU_width)\n      result = FALSE;\n    break;\n  case JXFORM_FLIP_V:\n  case JXFORM_ROT_90:\n    if (image_height % (JDIMENSION) MCU_height)\n      result = FALSE;\n    break;\n  case JXFORM_TRANSVERSE:\n  case JXFORM_ROT_180:\n    if (image_width % (JDIMENSION) MCU_width)\n      result = FALSE;\n    if (image_height % (JDIMENSION) MCU_height)\n      result = FALSE;\n    break;\n  default:\n    break;\n  }\n\n  return result;\n}\n\n#endif /* TRANSFORMS_SUPPORTED */\n\n\n/* Setup decompression object to save desired markers in memory.\n * This must be called before jpeg_read_header() to have the desired effect.\n */\n\nGLOBAL(void)\njcopy_markers_setup (j_decompress_ptr srcinfo, JCOPY_OPTION option)\n{\n#ifdef SAVE_MARKERS_SUPPORTED\n  int m;\n\n  /* Save comments except under NONE option */\n  if (option != JCOPYOPT_NONE) {\n    jpeg_save_markers(srcinfo, JPEG_COM, 0xFFFF);\n  }\n  /* Save all types of APPn markers iff ALL option */\n  if (option == JCOPYOPT_ALL) {\n    for (m = 0; m < 16; m++)\n      jpeg_save_markers(srcinfo, JPEG_APP0 + m, 0xFFFF);\n  }\n#endif /* SAVE_MARKERS_SUPPORTED */\n}\n\n/* Copy markers saved in the given source object to the destination object.\n * This should be called just after jpeg_start_compress() or\n * jpeg_write_coefficients().\n * Note that those routines will have written the SOI, and also the\n * JFIF APP0 or Adobe APP14 markers if selected.\n */\n\nGLOBAL(void)\njcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,\n\t\t       JCOPY_OPTION option)\n{\n  jpeg_saved_marker_ptr marker;\n\n  /* In the current implementation, we don't actually need to examine the\n   * option flag here; we just copy everything that got saved.\n   * But to avoid confusion, we do not output JFIF and Adobe APP14 markers\n   * if the encoder library already wrote one.\n   */\n  for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) {\n    if (dstinfo->write_JFIF_header &&\n\tmarker->marker == JPEG_APP0 &&\n\tmarker->data_length >= 5 &&\n\tGETJOCTET(marker->data[0]) == 0x4A &&\n\tGETJOCTET(marker->data[1]) == 0x46 &&\n\tGETJOCTET(marker->data[2]) == 0x49 &&\n\tGETJOCTET(marker->data[3]) == 0x46 &&\n\tGETJOCTET(marker->data[4]) == 0)\n      continue;\t\t\t/* reject duplicate JFIF */\n    if (dstinfo->write_Adobe_marker &&\n\tmarker->marker == JPEG_APP0+14 &&\n\tmarker->data_length >= 5 &&\n\tGETJOCTET(marker->data[0]) == 0x41 &&\n\tGETJOCTET(marker->data[1]) == 0x64 &&\n\tGETJOCTET(marker->data[2]) == 0x6F &&\n\tGETJOCTET(marker->data[3]) == 0x62 &&\n\tGETJOCTET(marker->data[4]) == 0x65)\n      continue;\t\t\t/* reject duplicate Adobe */\n#ifdef NEED_FAR_POINTERS\n    /* We could use jpeg_write_marker if the data weren't FAR... */\n    {\n      unsigned int i;\n      jpeg_write_m_header(dstinfo, marker->marker, marker->data_length);\n      for (i = 0; i < marker->data_length; i++)\n\tjpeg_write_m_byte(dstinfo, marker->data[i]);\n    }\n#else\n    jpeg_write_marker(dstinfo, marker->marker,\n\t\t      marker->data, marker->data_length);\n#endif\n  }\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/wrbmp.c",
    "content": "/*\n * wrbmp.c\n *\n * Copyright (C) 1994-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to write output images in Microsoft \"BMP\"\n * format (MS Windows 3.x and OS/2 1.x flavors).\n * Either 8-bit colormapped or 24-bit full-color format can be written.\n * No compression is supported.\n *\n * These routines may need modification for non-Unix environments or\n * specialized applications.  As they stand, they assume output to\n * an ordinary stdio stream.\n *\n * This code contributed by James Arthur Boucher.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef BMP_SUPPORTED\n\n\n/*\n * To support 12-bit JPEG data, we'd have to scale output down to 8 bits.\n * This is not yet implemented.\n */\n\n#if BITS_IN_JSAMPLE != 8\n  Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */\n#endif\n\n/*\n * Since BMP stores scanlines bottom-to-top, we have to invert the image\n * from JPEG's top-to-bottom order.  To do this, we save the outgoing data\n * in a virtual array during put_pixel_row calls, then actually emit the\n * BMP file during finish_output.  The virtual array contains one JSAMPLE per\n * pixel if the output is grayscale or colormapped, three if it is full color.\n */\n\n/* Private version of data destination object */\n\ntypedef struct {\n  struct djpeg_dest_struct pub;\t/* public fields */\n\n  boolean is_os2;\t\t/* saves the OS2 format request flag */\n\n  jvirt_sarray_ptr whole_image;\t/* needed to reverse row order */\n  JDIMENSION data_width;\t/* JSAMPLEs per row */\n  JDIMENSION row_width;\t\t/* physical width of one row in the BMP file */\n  int pad_bytes;\t\t/* number of padding bytes needed per row */\n  JDIMENSION cur_output_row;\t/* next row# to write to virtual array */\n} bmp_dest_struct;\n\ntypedef bmp_dest_struct * bmp_dest_ptr;\n\n\n/* Forward declarations */\nLOCAL(void) write_colormap\n\tJPP((j_decompress_ptr cinfo, bmp_dest_ptr dest,\n\t     int map_colors, int map_entry_size));\n\n\n/*\n * Write some pixel data.\n * In this module rows_supplied will always be 1.\n */\n\nMETHODDEF(void)\nput_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t\tJDIMENSION rows_supplied)\n/* This version is for writing 24-bit pixels */\n{\n  bmp_dest_ptr dest = (bmp_dest_ptr) dinfo;\n  JSAMPARRAY image_ptr;\n  register JSAMPROW inptr, outptr;\n  register JDIMENSION col;\n  int pad;\n\n  /* Access next row in virtual array */\n  image_ptr = (*cinfo->mem->access_virt_sarray)\n    ((j_common_ptr) cinfo, dest->whole_image,\n     dest->cur_output_row, (JDIMENSION) 1, TRUE);\n  dest->cur_output_row++;\n\n  /* Transfer data.  Note destination values must be in BGR order\n   * (even though Microsoft's own documents say the opposite).\n   */\n  inptr = dest->pub.buffer[0];\n  outptr = image_ptr[0];\n  for (col = cinfo->output_width; col > 0; col--) {\n    outptr[2] = *inptr++;\t/* can omit GETJSAMPLE() safely */\n    outptr[1] = *inptr++;\n    outptr[0] = *inptr++;\n    outptr += 3;\n  }\n\n  /* Zero out the pad bytes. */\n  pad = dest->pad_bytes;\n  while (--pad >= 0)\n    *outptr++ = 0;\n}\n\nMETHODDEF(void)\nput_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t       JDIMENSION rows_supplied)\n/* This version is for grayscale OR quantized color output */\n{\n  bmp_dest_ptr dest = (bmp_dest_ptr) dinfo;\n  JSAMPARRAY image_ptr;\n  register JSAMPROW inptr, outptr;\n  register JDIMENSION col;\n  int pad;\n\n  /* Access next row in virtual array */\n  image_ptr = (*cinfo->mem->access_virt_sarray)\n    ((j_common_ptr) cinfo, dest->whole_image,\n     dest->cur_output_row, (JDIMENSION) 1, TRUE);\n  dest->cur_output_row++;\n\n  /* Transfer data. */\n  inptr = dest->pub.buffer[0];\n  outptr = image_ptr[0];\n  for (col = cinfo->output_width; col > 0; col--) {\n    *outptr++ = *inptr++;\t/* can omit GETJSAMPLE() safely */\n  }\n\n  /* Zero out the pad bytes. */\n  pad = dest->pad_bytes;\n  while (--pad >= 0)\n    *outptr++ = 0;\n}\n\n\n/*\n * Startup: normally writes the file header.\n * In this module we may as well postpone everything until finish_output.\n */\n\nMETHODDEF(void)\nstart_output_bmp (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  /* no work here */\n}\n\n\n/*\n * Finish up at the end of the file.\n *\n * Here is where we really output the BMP file.\n *\n * First, routines to write the Windows and OS/2 variants of the file header.\n */\n\nLOCAL(void)\nwrite_bmp_header (j_decompress_ptr cinfo, bmp_dest_ptr dest)\n/* Write a Windows-style BMP file header, including colormap if needed */\n{\n  char bmpfileheader[14];\n  char bmpinfoheader[40];\n#define PUT_2B(array,offset,value)  \\\n\t(array[offset] = (char) ((value) & 0xFF), \\\n\t array[offset+1] = (char) (((value) >> 8) & 0xFF))\n#define PUT_4B(array,offset,value)  \\\n\t(array[offset] = (char) ((value) & 0xFF), \\\n\t array[offset+1] = (char) (((value) >> 8) & 0xFF), \\\n\t array[offset+2] = (char) (((value) >> 16) & 0xFF), \\\n\t array[offset+3] = (char) (((value) >> 24) & 0xFF))\n  INT32 headersize, bfSize;\n  int bits_per_pixel, cmap_entries;\n\n  /* Compute colormap size and total file size */\n  if (cinfo->out_color_space == JCS_RGB) {\n    if (cinfo->quantize_colors) {\n      /* Colormapped RGB */\n      bits_per_pixel = 8;\n      cmap_entries = 256;\n    } else {\n      /* Unquantized, full color RGB */\n      bits_per_pixel = 24;\n      cmap_entries = 0;\n    }\n  } else {\n    /* Grayscale output.  We need to fake a 256-entry colormap. */\n    bits_per_pixel = 8;\n    cmap_entries = 256;\n  }\n  /* File size */\n  headersize = 14 + 40 + cmap_entries * 4; /* Header and colormap */\n  bfSize = headersize + (INT32) dest->row_width * (INT32) cinfo->output_height;\n  \n  /* Set unused fields of header to 0 */\n  MEMZERO(bmpfileheader, SIZEOF(bmpfileheader));\n  MEMZERO(bmpinfoheader, SIZEOF(bmpinfoheader));\n\n  /* Fill the file header */\n  bmpfileheader[0] = 0x42;\t/* first 2 bytes are ASCII 'B', 'M' */\n  bmpfileheader[1] = 0x4D;\n  PUT_4B(bmpfileheader, 2, bfSize); /* bfSize */\n  /* we leave bfReserved1 & bfReserved2 = 0 */\n  PUT_4B(bmpfileheader, 10, headersize); /* bfOffBits */\n\n  /* Fill the info header (Microsoft calls this a BITMAPINFOHEADER) */\n  PUT_2B(bmpinfoheader, 0, 40);\t/* biSize */\n  PUT_4B(bmpinfoheader, 4, cinfo->output_width); /* biWidth */\n  PUT_4B(bmpinfoheader, 8, cinfo->output_height); /* biHeight */\n  PUT_2B(bmpinfoheader, 12, 1);\t/* biPlanes - must be 1 */\n  PUT_2B(bmpinfoheader, 14, bits_per_pixel); /* biBitCount */\n  /* we leave biCompression = 0, for none */\n  /* we leave biSizeImage = 0; this is correct for uncompressed data */\n  if (cinfo->density_unit == 2) { /* if have density in dots/cm, then */\n    PUT_4B(bmpinfoheader, 24, (INT32) (cinfo->X_density*100)); /* XPels/M */\n    PUT_4B(bmpinfoheader, 28, (INT32) (cinfo->Y_density*100)); /* XPels/M */\n  }\n  PUT_2B(bmpinfoheader, 32, cmap_entries); /* biClrUsed */\n  /* we leave biClrImportant = 0 */\n\n  if (JFWRITE(dest->pub.output_file, bmpfileheader, 14) != (size_t) 14)\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n  if (JFWRITE(dest->pub.output_file, bmpinfoheader, 40) != (size_t) 40)\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n\n  if (cmap_entries > 0)\n    write_colormap(cinfo, dest, cmap_entries, 4);\n}\n\n\nLOCAL(void)\nwrite_os2_header (j_decompress_ptr cinfo, bmp_dest_ptr dest)\n/* Write an OS2-style BMP file header, including colormap if needed */\n{\n  char bmpfileheader[14];\n  char bmpcoreheader[12];\n  INT32 headersize, bfSize;\n  int bits_per_pixel, cmap_entries;\n\n  /* Compute colormap size and total file size */\n  if (cinfo->out_color_space == JCS_RGB) {\n    if (cinfo->quantize_colors) {\n      /* Colormapped RGB */\n      bits_per_pixel = 8;\n      cmap_entries = 256;\n    } else {\n      /* Unquantized, full color RGB */\n      bits_per_pixel = 24;\n      cmap_entries = 0;\n    }\n  } else {\n    /* Grayscale output.  We need to fake a 256-entry colormap. */\n    bits_per_pixel = 8;\n    cmap_entries = 256;\n  }\n  /* File size */\n  headersize = 14 + 12 + cmap_entries * 3; /* Header and colormap */\n  bfSize = headersize + (INT32) dest->row_width * (INT32) cinfo->output_height;\n  \n  /* Set unused fields of header to 0 */\n  MEMZERO(bmpfileheader, SIZEOF(bmpfileheader));\n  MEMZERO(bmpcoreheader, SIZEOF(bmpcoreheader));\n\n  /* Fill the file header */\n  bmpfileheader[0] = 0x42;\t/* first 2 bytes are ASCII 'B', 'M' */\n  bmpfileheader[1] = 0x4D;\n  PUT_4B(bmpfileheader, 2, bfSize); /* bfSize */\n  /* we leave bfReserved1 & bfReserved2 = 0 */\n  PUT_4B(bmpfileheader, 10, headersize); /* bfOffBits */\n\n  /* Fill the info header (Microsoft calls this a BITMAPCOREHEADER) */\n  PUT_2B(bmpcoreheader, 0, 12);\t/* bcSize */\n  PUT_2B(bmpcoreheader, 4, cinfo->output_width); /* bcWidth */\n  PUT_2B(bmpcoreheader, 6, cinfo->output_height); /* bcHeight */\n  PUT_2B(bmpcoreheader, 8, 1);\t/* bcPlanes - must be 1 */\n  PUT_2B(bmpcoreheader, 10, bits_per_pixel); /* bcBitCount */\n\n  if (JFWRITE(dest->pub.output_file, bmpfileheader, 14) != (size_t) 14)\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n  if (JFWRITE(dest->pub.output_file, bmpcoreheader, 12) != (size_t) 12)\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n\n  if (cmap_entries > 0)\n    write_colormap(cinfo, dest, cmap_entries, 3);\n}\n\n\n/*\n * Write the colormap.\n * Windows uses BGR0 map entries; OS/2 uses BGR entries.\n */\n\nLOCAL(void)\nwrite_colormap (j_decompress_ptr cinfo, bmp_dest_ptr dest,\n\t\tint map_colors, int map_entry_size)\n{\n  JSAMPARRAY colormap = cinfo->colormap;\n  int num_colors = cinfo->actual_number_of_colors;\n  FILE * outfile = dest->pub.output_file;\n  int i;\n\n  if (colormap != NULL) {\n    if (cinfo->out_color_components == 3) {\n      /* Normal case with RGB colormap */\n      for (i = 0; i < num_colors; i++) {\n\tputc(GETJSAMPLE(colormap[2][i]), outfile);\n\tputc(GETJSAMPLE(colormap[1][i]), outfile);\n\tputc(GETJSAMPLE(colormap[0][i]), outfile);\n\tif (map_entry_size == 4)\n\t  putc(0, outfile);\n      }\n    } else {\n      /* Grayscale colormap (only happens with grayscale quantization) */\n      for (i = 0; i < num_colors; i++) {\n\tputc(GETJSAMPLE(colormap[0][i]), outfile);\n\tputc(GETJSAMPLE(colormap[0][i]), outfile);\n\tputc(GETJSAMPLE(colormap[0][i]), outfile);\n\tif (map_entry_size == 4)\n\t  putc(0, outfile);\n      }\n    }\n  } else {\n    /* If no colormap, must be grayscale data.  Generate a linear \"map\". */\n    for (i = 0; i < 256; i++) {\n      putc(i, outfile);\n      putc(i, outfile);\n      putc(i, outfile);\n      if (map_entry_size == 4)\n\tputc(0, outfile);\n    }\n  }\n  /* Pad colormap with zeros to ensure specified number of colormap entries */ \n  if (i > map_colors)\n    ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, i);\n  for (; i < map_colors; i++) {\n    putc(0, outfile);\n    putc(0, outfile);\n    putc(0, outfile);\n    if (map_entry_size == 4)\n      putc(0, outfile);\n  }\n}\n\n\nMETHODDEF(void)\nfinish_output_bmp (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  bmp_dest_ptr dest = (bmp_dest_ptr) dinfo;\n  register FILE * outfile = dest->pub.output_file;\n  JSAMPARRAY image_ptr;\n  register JSAMPROW data_ptr;\n  JDIMENSION row;\n  register JDIMENSION col;\n  cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n\n  /* Write the header and colormap */\n  if (dest->is_os2)\n    write_os2_header(cinfo, dest);\n  else\n    write_bmp_header(cinfo, dest);\n\n  /* Write the file body from our virtual array */\n  for (row = cinfo->output_height; row > 0; row--) {\n    if (progress != NULL) {\n      progress->pub.pass_counter = (long) (cinfo->output_height - row);\n      progress->pub.pass_limit = (long) cinfo->output_height;\n      (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n    }\n    image_ptr = (*cinfo->mem->access_virt_sarray)\n      ((j_common_ptr) cinfo, dest->whole_image, row-1, (JDIMENSION) 1, FALSE);\n    data_ptr = image_ptr[0];\n    for (col = dest->row_width; col > 0; col--) {\n      putc(GETJSAMPLE(*data_ptr), outfile);\n      data_ptr++;\n    }\n  }\n  if (progress != NULL)\n    progress->completed_extra_passes++;\n\n  /* Make sure we wrote the output file OK */\n  fflush(outfile);\n  if (ferror(outfile))\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n}\n\n\n/*\n * The module selection routine for BMP format output.\n */\n\nGLOBAL(djpeg_dest_ptr)\njinit_write_bmp (j_decompress_ptr cinfo, boolean is_os2)\n{\n  bmp_dest_ptr dest;\n  JDIMENSION row_width;\n\n  /* Create module interface object, fill in method pointers */\n  dest = (bmp_dest_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(bmp_dest_struct));\n  dest->pub.start_output = start_output_bmp;\n  dest->pub.finish_output = finish_output_bmp;\n  dest->is_os2 = is_os2;\n\n  if (cinfo->out_color_space == JCS_GRAYSCALE) {\n    dest->pub.put_pixel_rows = put_gray_rows;\n  } else if (cinfo->out_color_space == JCS_RGB) {\n    if (cinfo->quantize_colors)\n      dest->pub.put_pixel_rows = put_gray_rows;\n    else\n      dest->pub.put_pixel_rows = put_pixel_rows;\n  } else {\n    ERREXIT(cinfo, JERR_BMP_COLORSPACE);\n  }\n\n  /* Calculate output image dimensions so we can allocate space */\n  jpeg_calc_output_dimensions(cinfo);\n\n  /* Determine width of rows in the BMP file (padded to 4-byte boundary). */\n  row_width = cinfo->output_width * cinfo->output_components;\n  dest->data_width = row_width;\n  while ((row_width & 3) != 0) row_width++;\n  dest->row_width = row_width;\n  dest->pad_bytes = (int) (row_width - dest->data_width);\n\n  /* Allocate space for inversion array, prepare for write pass */\n  dest->whole_image = (*cinfo->mem->request_virt_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n     row_width, cinfo->output_height, (JDIMENSION) 1);\n  dest->cur_output_row = 0;\n  if (cinfo->progress != NULL) {\n    cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n    progress->total_extra_passes++; /* count file input as separate pass */\n  }\n\n  /* Create decompressor output buffer. */\n  dest->pub.buffer = (*cinfo->mem->alloc_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, row_width, (JDIMENSION) 1);\n  dest->pub.buffer_height = 1;\n\n  return (djpeg_dest_ptr) dest;\n}\n\n#endif /* BMP_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/wrgif.c",
    "content": "/*\n * wrgif.c\n *\n * Copyright (C) 1991-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to write output images in GIF format.\n *\n **************************************************************************\n * NOTE: to avoid entanglements with Unisys' patent on LZW compression,   *\n * this code has been modified to output \"uncompressed GIF\" files.        *\n * There is no trace of the LZW algorithm in this file.                   *\n **************************************************************************\n *\n * These routines may need modification for non-Unix environments or\n * specialized applications.  As they stand, they assume output to\n * an ordinary stdio stream.\n */\n\n/*\n * This code is loosely based on ppmtogif from the PBMPLUS distribution\n * of Feb. 1991.  That file contains the following copyright notice:\n *    Based on GIFENCODE by David Rowley <mgardi@watdscu.waterloo.edu>.\n *    Lempel-Ziv compression based on \"compress\" by Spencer W. Thomas et al.\n *    Copyright (C) 1989 by Jef Poskanzer.\n *    Permission to use, copy, modify, and distribute this software and its\n *    documentation for any purpose and without fee is hereby granted, provided\n *    that the above copyright notice appear in all copies and that both that\n *    copyright notice and this permission notice appear in supporting\n *    documentation.  This software is provided \"as is\" without express or\n *    implied warranty.\n *\n * We are also required to state that\n *    \"The Graphics Interchange Format(c) is the Copyright property of\n *    CompuServe Incorporated. GIF(sm) is a Service Mark property of\n *    CompuServe Incorporated.\"\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef GIF_SUPPORTED\n\n\n/* Private version of data destination object */\n\ntypedef struct {\n  struct djpeg_dest_struct pub;\t/* public fields */\n\n  j_decompress_ptr cinfo;\t/* back link saves passing separate parm */\n\n  /* State for packing variable-width codes into a bitstream */\n  int n_bits;\t\t\t/* current number of bits/code */\n  int maxcode;\t\t\t/* maximum code, given n_bits */\n  INT32 cur_accum;\t\t/* holds bits not yet output */\n  int cur_bits;\t\t\t/* # of bits in cur_accum */\n\n  /* State for GIF code assignment */\n  int ClearCode;\t\t/* clear code (doesn't change) */\n  int EOFCode;\t\t\t/* EOF code (ditto) */\n  int code_counter;\t\t/* counts output symbols */\n\n  /* GIF data packet construction buffer */\n  int bytesinpkt;\t\t/* # of bytes in current packet */\n  char packetbuf[256];\t\t/* workspace for accumulating packet */\n\n} gif_dest_struct;\n\ntypedef gif_dest_struct * gif_dest_ptr;\n\n/* Largest value that will fit in N bits */\n#define MAXCODE(n_bits)\t((1 << (n_bits)) - 1)\n\n\n/*\n * Routines to package finished data bytes into GIF data blocks.\n * A data block consists of a count byte (1..255) and that many data bytes.\n */\n\nLOCAL(void)\nflush_packet (gif_dest_ptr dinfo)\n/* flush any accumulated data */\n{\n  if (dinfo->bytesinpkt > 0) {\t/* never write zero-length packet */\n    dinfo->packetbuf[0] = (char) dinfo->bytesinpkt++;\n    if (JFWRITE(dinfo->pub.output_file, dinfo->packetbuf, dinfo->bytesinpkt)\n\t!= (size_t) dinfo->bytesinpkt)\n      ERREXIT(dinfo->cinfo, JERR_FILE_WRITE);\n    dinfo->bytesinpkt = 0;\n  }\n}\n\n\n/* Add a character to current packet; flush to disk if necessary */\n#define CHAR_OUT(dinfo,c)  \\\n\t{ (dinfo)->packetbuf[++(dinfo)->bytesinpkt] = (char) (c);  \\\n\t    if ((dinfo)->bytesinpkt >= 255)  \\\n\t      flush_packet(dinfo);  \\\n\t}\n\n\n/* Routine to convert variable-width codes into a byte stream */\n\nLOCAL(void)\noutput (gif_dest_ptr dinfo, int code)\n/* Emit a code of n_bits bits */\n/* Uses cur_accum and cur_bits to reblock into 8-bit bytes */\n{\n  dinfo->cur_accum |= ((INT32) code) << dinfo->cur_bits;\n  dinfo->cur_bits += dinfo->n_bits;\n\n  while (dinfo->cur_bits >= 8) {\n    CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF);\n    dinfo->cur_accum >>= 8;\n    dinfo->cur_bits -= 8;\n  }\n}\n\n\n/* The pseudo-compression algorithm.\n *\n * In this module we simply output each pixel value as a separate symbol;\n * thus, no compression occurs.  In fact, there is expansion of one bit per\n * pixel, because we use a symbol width one bit wider than the pixel width.\n *\n * GIF ordinarily uses variable-width symbols, and the decoder will expect\n * to ratchet up the symbol width after a fixed number of symbols.\n * To simplify the logic and keep the expansion penalty down, we emit a\n * GIF Clear code to reset the decoder just before the width would ratchet up.\n * Thus, all the symbols in the output file will have the same bit width.\n * Note that emitting the Clear codes at the right times is a mere matter of\n * counting output symbols and is in no way dependent on the LZW patent.\n *\n * With a small basic pixel width (low color count), Clear codes will be\n * needed very frequently, causing the file to expand even more.  So this\n * simplistic approach wouldn't work too well on bilevel images, for example.\n * But for output of JPEG conversions the pixel width will usually be 8 bits\n * (129 to 256 colors), so the overhead added by Clear symbols is only about\n * one symbol in every 256.\n */\n\nLOCAL(void)\ncompress_init (gif_dest_ptr dinfo, int i_bits)\n/* Initialize pseudo-compressor */\n{\n  /* init all the state variables */\n  dinfo->n_bits = i_bits;\n  dinfo->maxcode = MAXCODE(dinfo->n_bits);\n  dinfo->ClearCode = (1 << (i_bits - 1));\n  dinfo->EOFCode = dinfo->ClearCode + 1;\n  dinfo->code_counter = dinfo->ClearCode + 2;\n  /* init output buffering vars */\n  dinfo->bytesinpkt = 0;\n  dinfo->cur_accum = 0;\n  dinfo->cur_bits = 0;\n  /* GIF specifies an initial Clear code */\n  output(dinfo, dinfo->ClearCode);\n}\n\n\nLOCAL(void)\ncompress_pixel (gif_dest_ptr dinfo, int c)\n/* Accept and \"compress\" one pixel value.\n * The given value must be less than n_bits wide.\n */\n{\n  /* Output the given pixel value as a symbol. */\n  output(dinfo, c);\n  /* Issue Clear codes often enough to keep the reader from ratcheting up\n   * its symbol size.\n   */\n  if (dinfo->code_counter < dinfo->maxcode) {\n    dinfo->code_counter++;\n  } else {\n    output(dinfo, dinfo->ClearCode);\n    dinfo->code_counter = dinfo->ClearCode + 2;\t/* reset the counter */\n  }\n}\n\n\nLOCAL(void)\ncompress_term (gif_dest_ptr dinfo)\n/* Clean up at end */\n{\n  /* Send an EOF code */\n  output(dinfo, dinfo->EOFCode);\n  /* Flush the bit-packing buffer */\n  if (dinfo->cur_bits > 0) {\n    CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF);\n  }\n  /* Flush the packet buffer */\n  flush_packet(dinfo);\n}\n\n\n/* GIF header construction */\n\n\nLOCAL(void)\nput_word (gif_dest_ptr dinfo, unsigned int w)\n/* Emit a 16-bit word, LSB first */\n{\n  putc(w & 0xFF, dinfo->pub.output_file);\n  putc((w >> 8) & 0xFF, dinfo->pub.output_file);\n}\n\n\nLOCAL(void)\nput_3bytes (gif_dest_ptr dinfo, int val)\n/* Emit 3 copies of same byte value --- handy subr for colormap construction */\n{\n  putc(val, dinfo->pub.output_file);\n  putc(val, dinfo->pub.output_file);\n  putc(val, dinfo->pub.output_file);\n}\n\n\nLOCAL(void)\nemit_header (gif_dest_ptr dinfo, int num_colors, JSAMPARRAY colormap)\n/* Output the GIF file header, including color map */\n/* If colormap==NULL, synthesize a gray-scale colormap */\n{\n  int BitsPerPixel, ColorMapSize, InitCodeSize, FlagByte;\n  int cshift = dinfo->cinfo->data_precision - 8;\n  int i;\n\n  if (num_colors > 256)\n    ERREXIT1(dinfo->cinfo, JERR_TOO_MANY_COLORS, num_colors);\n  /* Compute bits/pixel and related values */\n  BitsPerPixel = 1;\n  while (num_colors > (1 << BitsPerPixel))\n    BitsPerPixel++;\n  ColorMapSize = 1 << BitsPerPixel;\n  if (BitsPerPixel <= 1)\n    InitCodeSize = 2;\n  else\n    InitCodeSize = BitsPerPixel;\n  /*\n   * Write the GIF header.\n   * Note that we generate a plain GIF87 header for maximum compatibility.\n   */\n  putc('G', dinfo->pub.output_file);\n  putc('I', dinfo->pub.output_file);\n  putc('F', dinfo->pub.output_file);\n  putc('8', dinfo->pub.output_file);\n  putc('7', dinfo->pub.output_file);\n  putc('a', dinfo->pub.output_file);\n  /* Write the Logical Screen Descriptor */\n  put_word(dinfo, (unsigned int) dinfo->cinfo->output_width);\n  put_word(dinfo, (unsigned int) dinfo->cinfo->output_height);\n  FlagByte = 0x80;\t\t/* Yes, there is a global color table */\n  FlagByte |= (BitsPerPixel-1) << 4; /* color resolution */\n  FlagByte |= (BitsPerPixel-1);\t/* size of global color table */\n  putc(FlagByte, dinfo->pub.output_file);\n  putc(0, dinfo->pub.output_file); /* Background color index */\n  putc(0, dinfo->pub.output_file); /* Reserved (aspect ratio in GIF89) */\n  /* Write the Global Color Map */\n  /* If the color map is more than 8 bits precision, */\n  /* we reduce it to 8 bits by shifting */\n  for (i=0; i < ColorMapSize; i++) {\n    if (i < num_colors) {\n      if (colormap != NULL) {\n\tif (dinfo->cinfo->out_color_space == JCS_RGB) {\n\t  /* Normal case: RGB color map */\n\t  putc(GETJSAMPLE(colormap[0][i]) >> cshift, dinfo->pub.output_file);\n\t  putc(GETJSAMPLE(colormap[1][i]) >> cshift, dinfo->pub.output_file);\n\t  putc(GETJSAMPLE(colormap[2][i]) >> cshift, dinfo->pub.output_file);\n\t} else {\n\t  /* Grayscale \"color map\": possible if quantizing grayscale image */\n\t  put_3bytes(dinfo, GETJSAMPLE(colormap[0][i]) >> cshift);\n\t}\n      } else {\n\t/* Create a gray-scale map of num_colors values, range 0..255 */\n\tput_3bytes(dinfo, (i * 255 + (num_colors-1)/2) / (num_colors-1));\n      }\n    } else {\n      /* fill out the map to a power of 2 */\n      put_3bytes(dinfo, 0);\n    }\n  }\n  /* Write image separator and Image Descriptor */\n  putc(',', dinfo->pub.output_file); /* separator */\n  put_word(dinfo, 0);\t\t/* left/top offset */\n  put_word(dinfo, 0);\n  put_word(dinfo, (unsigned int) dinfo->cinfo->output_width); /* image size */\n  put_word(dinfo, (unsigned int) dinfo->cinfo->output_height);\n  /* flag byte: not interlaced, no local color map */\n  putc(0x00, dinfo->pub.output_file);\n  /* Write Initial Code Size byte */\n  putc(InitCodeSize, dinfo->pub.output_file);\n\n  /* Initialize for \"compression\" of image data */\n  compress_init(dinfo, InitCodeSize+1);\n}\n\n\n/*\n * Startup: write the file header.\n */\n\nMETHODDEF(void)\nstart_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  gif_dest_ptr dest = (gif_dest_ptr) dinfo;\n\n  if (cinfo->quantize_colors)\n    emit_header(dest, cinfo->actual_number_of_colors, cinfo->colormap);\n  else\n    emit_header(dest, 256, (JSAMPARRAY) NULL);\n}\n\n\n/*\n * Write some pixel data.\n * In this module rows_supplied will always be 1.\n */\n\nMETHODDEF(void)\nput_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t\tJDIMENSION rows_supplied)\n{\n  gif_dest_ptr dest = (gif_dest_ptr) dinfo;\n  register JSAMPROW ptr;\n  register JDIMENSION col;\n\n  ptr = dest->pub.buffer[0];\n  for (col = cinfo->output_width; col > 0; col--) {\n    compress_pixel(dest, GETJSAMPLE(*ptr++));\n  }\n}\n\n\n/*\n * Finish up at the end of the file.\n */\n\nMETHODDEF(void)\nfinish_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  gif_dest_ptr dest = (gif_dest_ptr) dinfo;\n\n  /* Flush \"compression\" mechanism */\n  compress_term(dest);\n  /* Write a zero-length data block to end the series */\n  putc(0, dest->pub.output_file);\n  /* Write the GIF terminator mark */\n  putc(';', dest->pub.output_file);\n  /* Make sure we wrote the output file OK */\n  fflush(dest->pub.output_file);\n  if (ferror(dest->pub.output_file))\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n}\n\n\n/*\n * The module selection routine for GIF format output.\n */\n\nGLOBAL(djpeg_dest_ptr)\njinit_write_gif (j_decompress_ptr cinfo)\n{\n  gif_dest_ptr dest;\n\n  /* Create module interface object, fill in method pointers */\n  dest = (gif_dest_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(gif_dest_struct));\n  dest->cinfo = cinfo;\t\t/* make back link for subroutines */\n  dest->pub.start_output = start_output_gif;\n  dest->pub.put_pixel_rows = put_pixel_rows;\n  dest->pub.finish_output = finish_output_gif;\n\n  if (cinfo->out_color_space != JCS_GRAYSCALE &&\n      cinfo->out_color_space != JCS_RGB)\n    ERREXIT(cinfo, JERR_GIF_COLORSPACE);\n\n  /* Force quantization if color or if > 8 bits input */\n  if (cinfo->out_color_space != JCS_GRAYSCALE || cinfo->data_precision > 8) {\n    /* Force quantization to at most 256 colors */\n    cinfo->quantize_colors = TRUE;\n    if (cinfo->desired_number_of_colors > 256)\n      cinfo->desired_number_of_colors = 256;\n  }\n\n  /* Calculate output image dimensions so we can allocate space */\n  jpeg_calc_output_dimensions(cinfo);\n\n  if (cinfo->output_components != 1) /* safety check: just one component? */\n    ERREXIT(cinfo, JERR_GIF_BUG);\n\n  /* Create decompressor output buffer. */\n  dest->pub.buffer = (*cinfo->mem->alloc_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, cinfo->output_width, (JDIMENSION) 1);\n  dest->pub.buffer_height = 1;\n\n  return (djpeg_dest_ptr) dest;\n}\n\n#endif /* GIF_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/wrjpgcom.c",
    "content": "/*\n * wrjpgcom.c\n *\n * Copyright (C) 1994-1997, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains a very simple stand-alone application that inserts\n * user-supplied text as a COM (comment) marker in a JFIF file.\n * This may be useful as an example of the minimum logic needed to parse\n * JPEG markers.\n */\n\n#define JPEG_CJPEG_DJPEG\t/* to get the command-line config symbols */\n#include \"jinclude.h\"\t\t/* get auto-config symbols, <stdio.h> */\n\n#ifndef HAVE_STDLIB_H\t\t/* <stdlib.h> should declare malloc() */\nextern void * malloc ();\n#endif\n#include <ctype.h>\t\t/* to declare isupper(), tolower() */\n#ifdef USE_SETMODE\n#include <fcntl.h>\t\t/* to declare setmode()'s parameter macros */\n/* If you have setmode() but not <io.h>, just delete this line: */\n#include <io.h>\t\t\t/* to declare setmode() */\n#endif\n\n#ifdef USE_CCOMMAND\t\t/* command-line reader for Macintosh */\n#ifdef __MWERKS__\n#include <SIOUX.h>              /* Metrowerks needs this */\n#include <console.h>\t\t/* ... and this */\n#endif\n#ifdef THINK_C\n#include <console.h>\t\t/* Think declares it here */\n#endif\n#endif\n\n#ifdef DONT_USE_B_MODE\t\t/* define mode parameters for fopen() */\n#define READ_BINARY\t\"r\"\n#define WRITE_BINARY\t\"w\"\n#else\n#ifdef VMS\t\t\t/* VMS is very nonstandard */\n#define READ_BINARY\t\"rb\", \"ctx=stm\"\n#define WRITE_BINARY\t\"wb\", \"ctx=stm\"\n#else\t\t\t\t/* standard ANSI-compliant case */\n#define READ_BINARY\t\"rb\"\n#define WRITE_BINARY\t\"wb\"\n#endif\n#endif\n\n#ifndef EXIT_FAILURE\t\t/* define exit() codes if not provided */\n#define EXIT_FAILURE  1\n#endif\n#ifndef EXIT_SUCCESS\n#ifdef VMS\n#define EXIT_SUCCESS  1\t\t/* VMS is very nonstandard */\n#else\n#define EXIT_SUCCESS  0\n#endif\n#endif\n\n/* Reduce this value if your malloc() can't allocate blocks up to 64K.\n * On DOS, compiling in large model is usually a better solution.\n */\n\n#ifndef MAX_COM_LENGTH\n#define MAX_COM_LENGTH 65000L\t/* must be <= 65533 in any case */\n#endif\n\n\n/*\n * These macros are used to read the input file and write the output file.\n * To reuse this code in another application, you might need to change these.\n */\n\nstatic FILE * infile;\t\t/* input JPEG file */\n\n/* Return next input byte, or EOF if no more */\n#define NEXTBYTE()  getc(infile)\n\nstatic FILE * outfile;\t\t/* output JPEG file */\n\n/* Emit an output byte */\n#define PUTBYTE(x)  putc((x), outfile)\n\n\n/* Error exit handler */\n#define ERREXIT(msg)  (fprintf(stderr, \"%s\\n\", msg), exit(EXIT_FAILURE))\n\n\n/* Read one byte, testing for EOF */\nstatic int\nread_1_byte (void)\n{\n  int c;\n\n  c = NEXTBYTE();\n  if (c == EOF)\n    ERREXIT(\"Premature EOF in JPEG file\");\n  return c;\n}\n\n/* Read 2 bytes, convert to unsigned int */\n/* All 2-byte quantities in JPEG markers are MSB first */\nstatic unsigned int\nread_2_bytes (void)\n{\n  int c1, c2;\n\n  c1 = NEXTBYTE();\n  if (c1 == EOF)\n    ERREXIT(\"Premature EOF in JPEG file\");\n  c2 = NEXTBYTE();\n  if (c2 == EOF)\n    ERREXIT(\"Premature EOF in JPEG file\");\n  return (((unsigned int) c1) << 8) + ((unsigned int) c2);\n}\n\n\n/* Routines to write data to output file */\n\nstatic void\nwrite_1_byte (int c)\n{\n  PUTBYTE(c);\n}\n\nstatic void\nwrite_2_bytes (unsigned int val)\n{\n  PUTBYTE((val >> 8) & 0xFF);\n  PUTBYTE(val & 0xFF);\n}\n\nstatic void\nwrite_marker (int marker)\n{\n  PUTBYTE(0xFF);\n  PUTBYTE(marker);\n}\n\nstatic void\ncopy_rest_of_file (void)\n{\n  int c;\n\n  while ((c = NEXTBYTE()) != EOF)\n    PUTBYTE(c);\n}\n\n\n/*\n * JPEG markers consist of one or more 0xFF bytes, followed by a marker\n * code byte (which is not an FF).  Here are the marker codes of interest\n * in this program.  (See jdmarker.c for a more complete list.)\n */\n\n#define M_SOF0  0xC0\t\t/* Start Of Frame N */\n#define M_SOF1  0xC1\t\t/* N indicates which compression process */\n#define M_SOF2  0xC2\t\t/* Only SOF0-SOF2 are now in common use */\n#define M_SOF3  0xC3\n#define M_SOF5  0xC5\t\t/* NB: codes C4 and CC are NOT SOF markers */\n#define M_SOF6  0xC6\n#define M_SOF7  0xC7\n#define M_SOF9  0xC9\n#define M_SOF10 0xCA\n#define M_SOF11 0xCB\n#define M_SOF13 0xCD\n#define M_SOF14 0xCE\n#define M_SOF15 0xCF\n#define M_SOI   0xD8\t\t/* Start Of Image (beginning of datastream) */\n#define M_EOI   0xD9\t\t/* End Of Image (end of datastream) */\n#define M_SOS   0xDA\t\t/* Start Of Scan (begins compressed data) */\n#define M_COM   0xFE\t\t/* COMment */\n\n\n/*\n * Find the next JPEG marker and return its marker code.\n * We expect at least one FF byte, possibly more if the compressor used FFs\n * to pad the file.  (Padding FFs will NOT be replicated in the output file.)\n * There could also be non-FF garbage between markers.  The treatment of such\n * garbage is unspecified; we choose to skip over it but emit a warning msg.\n * NB: this routine must not be used after seeing SOS marker, since it will\n * not deal correctly with FF/00 sequences in the compressed image data...\n */\n\nstatic int\nnext_marker (void)\n{\n  int c;\n  int discarded_bytes = 0;\n\n  /* Find 0xFF byte; count and skip any non-FFs. */\n  c = read_1_byte();\n  while (c != 0xFF) {\n    discarded_bytes++;\n    c = read_1_byte();\n  }\n  /* Get marker code byte, swallowing any duplicate FF bytes.  Extra FFs\n   * are legal as pad bytes, so don't count them in discarded_bytes.\n   */\n  do {\n    c = read_1_byte();\n  } while (c == 0xFF);\n\n  if (discarded_bytes != 0) {\n    fprintf(stderr, \"Warning: garbage data found in JPEG file\\n\");\n  }\n\n  return c;\n}\n\n\n/*\n * Read the initial marker, which should be SOI.\n * For a JFIF file, the first two bytes of the file should be literally\n * 0xFF M_SOI.  To be more general, we could use next_marker, but if the\n * input file weren't actually JPEG at all, next_marker might read the whole\n * file and then return a misleading error message...\n */\n\nstatic int\nfirst_marker (void)\n{\n  int c1, c2;\n\n  c1 = NEXTBYTE();\n  c2 = NEXTBYTE();\n  if (c1 != 0xFF || c2 != M_SOI)\n    ERREXIT(\"Not a JPEG file\");\n  return c2;\n}\n\n\n/*\n * Most types of marker are followed by a variable-length parameter segment.\n * This routine skips over the parameters for any marker we don't otherwise\n * want to process.\n * Note that we MUST skip the parameter segment explicitly in order not to\n * be fooled by 0xFF bytes that might appear within the parameter segment;\n * such bytes do NOT introduce new markers.\n */\n\nstatic void\ncopy_variable (void)\n/* Copy an unknown or uninteresting variable-length marker */\n{\n  unsigned int length;\n\n  /* Get the marker parameter length count */\n  length = read_2_bytes();\n  write_2_bytes(length);\n  /* Length includes itself, so must be at least 2 */\n  if (length < 2)\n    ERREXIT(\"Erroneous JPEG marker length\");\n  length -= 2;\n  /* Skip over the remaining bytes */\n  while (length > 0) {\n    write_1_byte(read_1_byte());\n    length--;\n  }\n}\n\nstatic void\nskip_variable (void)\n/* Skip over an unknown or uninteresting variable-length marker */\n{\n  unsigned int length;\n\n  /* Get the marker parameter length count */\n  length = read_2_bytes();\n  /* Length includes itself, so must be at least 2 */\n  if (length < 2)\n    ERREXIT(\"Erroneous JPEG marker length\");\n  length -= 2;\n  /* Skip over the remaining bytes */\n  while (length > 0) {\n    (void) read_1_byte();\n    length--;\n  }\n}\n\n\n/*\n * Parse the marker stream until SOFn or EOI is seen;\n * copy data to output, but discard COM markers unless keep_COM is true.\n */\n\nstatic int\nscan_JPEG_header (int keep_COM)\n{\n  int marker;\n\n  /* Expect SOI at start of file */\n  if (first_marker() != M_SOI)\n    ERREXIT(\"Expected SOI marker first\");\n  write_marker(M_SOI);\n\n  /* Scan miscellaneous markers until we reach SOFn. */\n  for (;;) {\n    marker = next_marker();\n    switch (marker) {\n      /* Note that marker codes 0xC4, 0xC8, 0xCC are not, and must not be,\n       * treated as SOFn.  C4 in particular is actually DHT.\n       */\n    case M_SOF0:\t\t/* Baseline */\n    case M_SOF1:\t\t/* Extended sequential, Huffman */\n    case M_SOF2:\t\t/* Progressive, Huffman */\n    case M_SOF3:\t\t/* Lossless, Huffman */\n    case M_SOF5:\t\t/* Differential sequential, Huffman */\n    case M_SOF6:\t\t/* Differential progressive, Huffman */\n    case M_SOF7:\t\t/* Differential lossless, Huffman */\n    case M_SOF9:\t\t/* Extended sequential, arithmetic */\n    case M_SOF10:\t\t/* Progressive, arithmetic */\n    case M_SOF11:\t\t/* Lossless, arithmetic */\n    case M_SOF13:\t\t/* Differential sequential, arithmetic */\n    case M_SOF14:\t\t/* Differential progressive, arithmetic */\n    case M_SOF15:\t\t/* Differential lossless, arithmetic */\n      return marker;\n\n    case M_SOS:\t\t\t/* should not see compressed data before SOF */\n      ERREXIT(\"SOS without prior SOFn\");\n      break;\n\n    case M_EOI:\t\t\t/* in case it's a tables-only JPEG stream */\n      return marker;\n\n    case M_COM:\t\t\t/* Existing COM: conditionally discard */\n      if (keep_COM) {\n\twrite_marker(marker);\n\tcopy_variable();\n      } else {\n\tskip_variable();\n      }\n      break;\n\n    default:\t\t\t/* Anything else just gets copied */\n      write_marker(marker);\n      copy_variable();\t\t/* we assume it has a parameter count... */\n      break;\n    }\n  } /* end loop */\n}\n\n\n/* Command line parsing code */\n\nstatic const char * progname;\t/* program name for error messages */\n\n\nstatic void\nusage (void)\n/* complain about bad command line */\n{\n  fprintf(stderr, \"wrjpgcom inserts a textual comment in a JPEG file.\\n\");\n  fprintf(stderr, \"You can add to or replace any existing comment(s).\\n\");\n\n  fprintf(stderr, \"Usage: %s [switches] \", progname);\n#ifdef TWO_FILE_COMMANDLINE\n  fprintf(stderr, \"inputfile outputfile\\n\");\n#else\n  fprintf(stderr, \"[inputfile]\\n\");\n#endif\n\n  fprintf(stderr, \"Switches (names may be abbreviated):\\n\");\n  fprintf(stderr, \"  -replace         Delete any existing comments\\n\");\n  fprintf(stderr, \"  -comment \\\"text\\\"  Insert comment with given text\\n\");\n  fprintf(stderr, \"  -cfile name      Read comment from named file\\n\");\n  fprintf(stderr, \"Notice that you must put quotes around the comment text\\n\");\n  fprintf(stderr, \"when you use -comment.\\n\");\n  fprintf(stderr, \"If you do not give either -comment or -cfile on the command line,\\n\");\n  fprintf(stderr, \"then the comment text is read from standard input.\\n\");\n  fprintf(stderr, \"It can be multiple lines, up to %u characters total.\\n\",\n\t  (unsigned int) MAX_COM_LENGTH);\n#ifndef TWO_FILE_COMMANDLINE\n  fprintf(stderr, \"You must specify an input JPEG file name when supplying\\n\");\n  fprintf(stderr, \"comment text from standard input.\\n\");\n#endif\n\n  exit(EXIT_FAILURE);\n}\n\n\nstatic int\nkeymatch (char * arg, const char * keyword, int minchars)\n/* Case-insensitive matching of (possibly abbreviated) keyword switches. */\n/* keyword is the constant keyword (must be lower case already), */\n/* minchars is length of minimum legal abbreviation. */\n{\n  register int ca, ck;\n  register int nmatched = 0;\n\n  while ((ca = *arg++) != '\\0') {\n    if ((ck = *keyword++) == '\\0')\n      return 0;\t\t\t/* arg longer than keyword, no good */\n    if (isupper(ca))\t\t/* force arg to lcase (assume ck is already) */\n      ca = tolower(ca);\n    if (ca != ck)\n      return 0;\t\t\t/* no good */\n    nmatched++;\t\t\t/* count matched characters */\n  }\n  /* reached end of argument; fail if it's too short for unique abbrev */\n  if (nmatched < minchars)\n    return 0;\n  return 1;\t\t\t/* A-OK */\n}\n\n\n/*\n * The main program.\n */\n\nint\nmain (int argc, char **argv)\n{\n  int argn;\n  char * arg;\n  int keep_COM = 1;\n  char * comment_arg = NULL;\n  FILE * comment_file = NULL;\n  unsigned int comment_length = 0;\n  int marker;\n\n  /* On Mac, fetch a command line. */\n#ifdef USE_CCOMMAND\n  argc = ccommand(&argv);\n#endif\n\n  progname = argv[0];\n  if (progname == NULL || progname[0] == 0)\n    progname = \"wrjpgcom\";\t/* in case C library doesn't provide it */\n\n  /* Parse switches, if any */\n  for (argn = 1; argn < argc; argn++) {\n    arg = argv[argn];\n    if (arg[0] != '-')\n      break;\t\t\t/* not switch, must be file name */\n    arg++;\t\t\t/* advance over '-' */\n    if (keymatch(arg, \"replace\", 1)) {\n      keep_COM = 0;\n    } else if (keymatch(arg, \"cfile\", 2)) {\n      if (++argn >= argc) usage();\n      if ((comment_file = fopen(argv[argn], \"r\")) == NULL) {\n\tfprintf(stderr, \"%s: can't open %s\\n\", progname, argv[argn]);\n\texit(EXIT_FAILURE);\n      }\n    } else if (keymatch(arg, \"comment\", 1)) {\n      if (++argn >= argc) usage();\n      comment_arg = argv[argn];\n      /* If the comment text starts with '\"', then we are probably running\n       * under MS-DOG and must parse out the quoted string ourselves.  Sigh.\n       */\n      if (comment_arg[0] == '\"') {\n\tcomment_arg = (char *) malloc((size_t) MAX_COM_LENGTH);\n\tif (comment_arg == NULL)\n\t  ERREXIT(\"Insufficient memory\");\n\tstrcpy(comment_arg, argv[argn]+1);\n\tfor (;;) {\n\t  comment_length = (unsigned int) strlen(comment_arg);\n\t  if (comment_length > 0 && comment_arg[comment_length-1] == '\"') {\n\t    comment_arg[comment_length-1] = '\\0'; /* zap terminating quote */\n\t    break;\n\t  }\n\t  if (++argn >= argc)\n\t    ERREXIT(\"Missing ending quote mark\");\n\t  strcat(comment_arg, \" \");\n\t  strcat(comment_arg, argv[argn]);\n\t}\n      }\n      comment_length = (unsigned int) strlen(comment_arg);\n    } else\n      usage();\n  }\n\n  /* Cannot use both -comment and -cfile. */\n  if (comment_arg != NULL && comment_file != NULL)\n    usage();\n  /* If there is neither -comment nor -cfile, we will read the comment text\n   * from stdin; in this case there MUST be an input JPEG file name.\n   */\n  if (comment_arg == NULL && comment_file == NULL && argn >= argc)\n    usage();\n\n  /* Open the input file. */\n  if (argn < argc) {\n    if ((infile = fopen(argv[argn], READ_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open %s\\n\", progname, argv[argn]);\n      exit(EXIT_FAILURE);\n    }\n  } else {\n    /* default input file is stdin */\n#ifdef USE_SETMODE\t\t/* need to hack file mode? */\n    setmode(fileno(stdin), O_BINARY);\n#endif\n#ifdef USE_FDOPEN\t\t/* need to re-open in binary mode? */\n    if ((infile = fdopen(fileno(stdin), READ_BINARY)) == NULL) {\n      fprintf(stderr, \"%s: can't open stdin\\n\", progname);\n      exit(EXIT_FAILURE);\n    }\n#else\n    infile = stdin;\n#endif\n  }\n\n  /* Open the output file. */\n#ifdef TWO_FILE_COMMANDLINE\n  /* Must have explicit output file name */\n  if (argn != argc-2) {\n    fprintf(stderr, \"%s: must name one input and one output file\\n\",\n\t    progname);\n    usage();\n  }\n  if ((outfile = fopen(argv[argn+1], WRITE_BINARY)) == NULL) {\n    fprintf(stderr, \"%s: can't open %s\\n\", progname, argv[argn+1]);\n    exit(EXIT_FAILURE);\n  }\n#else\n  /* Unix style: expect zero or one file name */\n  if (argn < argc-1) {\n    fprintf(stderr, \"%s: only one input file\\n\", progname);\n    usage();\n  }\n  /* default output file is stdout */\n#ifdef USE_SETMODE\t\t/* need to hack file mode? */\n  setmode(fileno(stdout), O_BINARY);\n#endif\n#ifdef USE_FDOPEN\t\t/* need to re-open in binary mode? */\n  if ((outfile = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) {\n    fprintf(stderr, \"%s: can't open stdout\\n\", progname);\n    exit(EXIT_FAILURE);\n  }\n#else\n  outfile = stdout;\n#endif\n#endif /* TWO_FILE_COMMANDLINE */\n\n  /* Collect comment text from comment_file or stdin, if necessary */\n  if (comment_arg == NULL) {\n    FILE * src_file;\n    int c;\n\n    comment_arg = (char *) malloc((size_t) MAX_COM_LENGTH);\n    if (comment_arg == NULL)\n      ERREXIT(\"Insufficient memory\");\n    comment_length = 0;\n    src_file = (comment_file != NULL ? comment_file : stdin);\n    while ((c = getc(src_file)) != EOF) {\n      if (comment_length >= (unsigned int) MAX_COM_LENGTH) {\n\tfprintf(stderr, \"Comment text may not exceed %u bytes\\n\",\n\t\t(unsigned int) MAX_COM_LENGTH);\n\texit(EXIT_FAILURE);\n      }\n      comment_arg[comment_length++] = (char) c;\n    }\n    if (comment_file != NULL)\n      fclose(comment_file);\n  }\n\n  /* Copy JPEG headers until SOFn marker;\n   * we will insert the new comment marker just before SOFn.\n   * This (a) causes the new comment to appear after, rather than before,\n   * existing comments; and (b) ensures that comments come after any JFIF\n   * or JFXX markers, as required by the JFIF specification.\n   */\n  marker = scan_JPEG_header(keep_COM);\n  /* Insert the new COM marker, but only if nonempty text has been supplied */\n  if (comment_length > 0) {\n    write_marker(M_COM);\n    write_2_bytes(comment_length + 2);\n    while (comment_length > 0) {\n      write_1_byte(*comment_arg++);\n      comment_length--;\n    }\n  }\n  /* Duplicate the remainder of the source file.\n   * Note that any COM markers occuring after SOF will not be touched.\n   */\n  write_marker(marker);\n  copy_rest_of_file();\n\n  /* All done. */\n  exit(EXIT_SUCCESS);\n  return 0;\t\t\t/* suppress no-return-value warnings */\n}\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/wrppm.c",
    "content": "/*\n * wrppm.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * Modified 2009 by Guido Vollbeding.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to write output images in PPM/PGM format.\n * The extended 2-byte-per-sample raw PPM/PGM formats are supported.\n * The PBMPLUS library is NOT required to compile this software\n * (but it is highly useful as a set of PPM image manipulation programs).\n *\n * These routines may need modification for non-Unix environments or\n * specialized applications.  As they stand, they assume output to\n * an ordinary stdio stream.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef PPM_SUPPORTED\n\n\n/*\n * For 12-bit JPEG data, we either downscale the values to 8 bits\n * (to write standard byte-per-sample PPM/PGM files), or output\n * nonstandard word-per-sample PPM/PGM files.  Downscaling is done\n * if PPM_NORAWWORD is defined (this can be done in the Makefile\n * or in jconfig.h).\n * (When the core library supports data precision reduction, a cleaner\n * implementation will be to ask for that instead.)\n */\n\n#if BITS_IN_JSAMPLE == 8\n#define PUTPPMSAMPLE(ptr,v)  *ptr++ = (char) (v)\n#define BYTESPERSAMPLE 1\n#define PPM_MAXVAL 255\n#else\n#ifdef PPM_NORAWWORD\n#define PUTPPMSAMPLE(ptr,v)  *ptr++ = (char) ((v) >> (BITS_IN_JSAMPLE-8))\n#define BYTESPERSAMPLE 1\n#define PPM_MAXVAL 255\n#else\n/* The word-per-sample format always puts the MSB first. */\n#define PUTPPMSAMPLE(ptr,v)\t\t\t\\\n\t{ register int val_ = v;\t\t\\\n\t  *ptr++ = (char) ((val_ >> 8) & 0xFF);\t\\\n\t  *ptr++ = (char) (val_ & 0xFF);\t\\\n\t}\n#define BYTESPERSAMPLE 2\n#define PPM_MAXVAL ((1<<BITS_IN_JSAMPLE)-1)\n#endif\n#endif\n\n\n/*\n * When JSAMPLE is the same size as char, we can just fwrite() the\n * decompressed data to the PPM or PGM file.  On PCs, in order to make this\n * work the output buffer must be allocated in near data space, because we are\n * assuming small-data memory model wherein fwrite() can't reach far memory.\n * If you need to process very wide images on a PC, you might have to compile\n * in large-memory model, or else replace fwrite() with a putc() loop ---\n * which will be much slower.\n */\n\n\n/* Private version of data destination object */\n\ntypedef struct {\n  struct djpeg_dest_struct pub;\t/* public fields */\n\n  /* Usually these two pointers point to the same place: */\n  char *iobuffer;\t\t/* fwrite's I/O buffer */\n  JSAMPROW pixrow;\t\t/* decompressor output buffer */\n  size_t buffer_width;\t\t/* width of I/O buffer */\n  JDIMENSION samples_per_row;\t/* JSAMPLEs per output row */\n} ppm_dest_struct;\n\ntypedef ppm_dest_struct * ppm_dest_ptr;\n\n\n/*\n * Write some pixel data.\n * In this module rows_supplied will always be 1.\n *\n * put_pixel_rows handles the \"normal\" 8-bit case where the decompressor\n * output buffer is physically the same as the fwrite buffer.\n */\n\nMETHODDEF(void)\nput_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t\tJDIMENSION rows_supplied)\n{\n  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;\n\n  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);\n}\n\n\n/*\n * This code is used when we have to copy the data and apply a pixel\n * format translation.  Typically this only happens in 12-bit mode.\n */\n\nMETHODDEF(void)\ncopy_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t\t JDIMENSION rows_supplied)\n{\n  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;\n  register char * bufferptr;\n  register JSAMPROW ptr;\n  register JDIMENSION col;\n\n  ptr = dest->pub.buffer[0];\n  bufferptr = dest->iobuffer;\n  for (col = dest->samples_per_row; col > 0; col--) {\n    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(*ptr++));\n  }\n  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);\n}\n\n\n/*\n * Write some pixel data when color quantization is in effect.\n * We have to demap the color index values to straight data.\n */\n\nMETHODDEF(void)\nput_demapped_rgb (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t\t  JDIMENSION rows_supplied)\n{\n  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;\n  register char * bufferptr;\n  register int pixval;\n  register JSAMPROW ptr;\n  register JSAMPROW color_map0 = cinfo->colormap[0];\n  register JSAMPROW color_map1 = cinfo->colormap[1];\n  register JSAMPROW color_map2 = cinfo->colormap[2];\n  register JDIMENSION col;\n\n  ptr = dest->pub.buffer[0];\n  bufferptr = dest->iobuffer;\n  for (col = cinfo->output_width; col > 0; col--) {\n    pixval = GETJSAMPLE(*ptr++);\n    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map0[pixval]));\n    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map1[pixval]));\n    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map2[pixval]));\n  }\n  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);\n}\n\n\nMETHODDEF(void)\nput_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t\t   JDIMENSION rows_supplied)\n{\n  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;\n  register char * bufferptr;\n  register JSAMPROW ptr;\n  register JSAMPROW color_map = cinfo->colormap[0];\n  register JDIMENSION col;\n\n  ptr = dest->pub.buffer[0];\n  bufferptr = dest->iobuffer;\n  for (col = cinfo->output_width; col > 0; col--) {\n    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map[GETJSAMPLE(*ptr++)]));\n  }\n  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);\n}\n\n\n/*\n * Startup: write the file header.\n */\n\nMETHODDEF(void)\nstart_output_ppm (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;\n\n  /* Emit file header */\n  switch (cinfo->out_color_space) {\n  case JCS_GRAYSCALE:\n    /* emit header for raw PGM format */\n    fprintf(dest->pub.output_file, \"P5\\n%ld %ld\\n%d\\n\",\n\t    (long) cinfo->output_width, (long) cinfo->output_height,\n\t    PPM_MAXVAL);\n    break;\n  case JCS_RGB:\n    /* emit header for raw PPM format */\n    fprintf(dest->pub.output_file, \"P6\\n%ld %ld\\n%d\\n\",\n\t    (long) cinfo->output_width, (long) cinfo->output_height,\n\t    PPM_MAXVAL);\n    break;\n  default:\n    ERREXIT(cinfo, JERR_PPM_COLORSPACE);\n  }\n}\n\n\n/*\n * Finish up at the end of the file.\n */\n\nMETHODDEF(void)\nfinish_output_ppm (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  /* Make sure we wrote the output file OK */\n  fflush(dinfo->output_file);\n  if (ferror(dinfo->output_file))\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n}\n\n\n/*\n * The module selection routine for PPM format output.\n */\n\nGLOBAL(djpeg_dest_ptr)\njinit_write_ppm (j_decompress_ptr cinfo)\n{\n  ppm_dest_ptr dest;\n\n  /* Create module interface object, fill in method pointers */\n  dest = (ppm_dest_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(ppm_dest_struct));\n  dest->pub.start_output = start_output_ppm;\n  dest->pub.finish_output = finish_output_ppm;\n\n  /* Calculate output image dimensions so we can allocate space */\n  jpeg_calc_output_dimensions(cinfo);\n\n  /* Create physical I/O buffer.  Note we make this near on a PC. */\n  dest->samples_per_row = cinfo->output_width * cinfo->out_color_components;\n  dest->buffer_width = dest->samples_per_row * (BYTESPERSAMPLE * SIZEOF(char));\n  dest->iobuffer = (char *) (*cinfo->mem->alloc_small)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width);\n\n  if (cinfo->quantize_colors || BITS_IN_JSAMPLE != 8 ||\n      SIZEOF(JSAMPLE) != SIZEOF(char)) {\n    /* When quantizing, we need an output buffer for colormap indexes\n     * that's separate from the physical I/O buffer.  We also need a\n     * separate buffer if pixel format translation must take place.\n     */\n    dest->pub.buffer = (*cinfo->mem->alloc_sarray)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE,\n       cinfo->output_width * cinfo->output_components, (JDIMENSION) 1);\n    dest->pub.buffer_height = 1;\n    if (! cinfo->quantize_colors)\n      dest->pub.put_pixel_rows = copy_pixel_rows;\n    else if (cinfo->out_color_space == JCS_GRAYSCALE)\n      dest->pub.put_pixel_rows = put_demapped_gray;\n    else\n      dest->pub.put_pixel_rows = put_demapped_rgb;\n  } else {\n    /* We will fwrite() directly from decompressor output buffer. */\n    /* Synthesize a JSAMPARRAY pointer structure */\n    /* Cast here implies near->far pointer conversion on PCs */\n    dest->pixrow = (JSAMPROW) dest->iobuffer;\n    dest->pub.buffer = & dest->pixrow;\n    dest->pub.buffer_height = 1;\n    dest->pub.put_pixel_rows = put_pixel_rows;\n  }\n\n  return (djpeg_dest_ptr) dest;\n}\n\n#endif /* PPM_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/wrrle.c",
    "content": "/*\n * wrrle.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to write output images in RLE format.\n * The Utah Raster Toolkit library is required (version 3.1 or later).\n *\n * These routines may need modification for non-Unix environments or\n * specialized applications.  As they stand, they assume output to\n * an ordinary stdio stream.\n *\n * Based on code contributed by Mike Lijewski,\n * with updates from Robert Hutchinson.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef RLE_SUPPORTED\n\n/* rle.h is provided by the Utah Raster Toolkit. */\n\n#include <rle.h>\n\n/*\n * We assume that JSAMPLE has the same representation as rle_pixel,\n * to wit, \"unsigned char\".  Hence we can't cope with 12- or 16-bit samples.\n */\n\n#if BITS_IN_JSAMPLE != 8\n  Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */\n#endif\n\n\n/*\n * Since RLE stores scanlines bottom-to-top, we have to invert the image\n * from JPEG's top-to-bottom order.  To do this, we save the outgoing data\n * in a virtual array during put_pixel_row calls, then actually emit the\n * RLE file during finish_output.\n */\n\n\n/*\n * For now, if we emit an RLE color map then it is always 256 entries long,\n * though not all of the entries need be used.\n */\n\n#define CMAPBITS\t8\n#define CMAPLENGTH\t(1<<(CMAPBITS))\n\ntypedef struct {\n  struct djpeg_dest_struct pub; /* public fields */\n\n  jvirt_sarray_ptr image;\t/* virtual array to store the output image */\n  rle_map *colormap;\t \t/* RLE-style color map, or NULL if none */\n  rle_pixel **rle_row;\t\t/* To pass rows to rle_putrow() */\n\n} rle_dest_struct;\n\ntypedef rle_dest_struct * rle_dest_ptr;\n\n/* Forward declarations */\nMETHODDEF(void) rle_put_pixel_rows\n    JPP((j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t JDIMENSION rows_supplied));\n\n\n/*\n * Write the file header.\n *\n * In this module it's easier to wait till finish_output to write anything.\n */\n\nMETHODDEF(void)\nstart_output_rle (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  rle_dest_ptr dest = (rle_dest_ptr) dinfo;\n  size_t cmapsize;\n  int i, ci;\n#ifdef PROGRESS_REPORT\n  cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n#endif\n\n  /*\n   * Make sure the image can be stored in RLE format.\n   *\n   * - RLE stores image dimensions as *signed* 16 bit integers.  JPEG\n   *   uses unsigned, so we have to check the width.\n   *\n   * - Colorspace is expected to be grayscale or RGB.\n   *\n   * - The number of channels (components) is expected to be 1 (grayscale/\n   *   pseudocolor) or 3 (truecolor/directcolor).\n   *   (could be 2 or 4 if using an alpha channel, but we aren't)\n   */\n\n  if (cinfo->output_width > 32767 || cinfo->output_height > 32767)\n    ERREXIT2(cinfo, JERR_RLE_DIMENSIONS, cinfo->output_width, \n\t     cinfo->output_height);\n\n  if (cinfo->out_color_space != JCS_GRAYSCALE &&\n      cinfo->out_color_space != JCS_RGB)\n    ERREXIT(cinfo, JERR_RLE_COLORSPACE);\n\n  if (cinfo->output_components != 1 && cinfo->output_components != 3)\n    ERREXIT1(cinfo, JERR_RLE_TOOMANYCHANNELS, cinfo->num_components);\n\n  /* Convert colormap, if any, to RLE format. */\n\n  dest->colormap = NULL;\n\n  if (cinfo->quantize_colors) {\n    /* Allocate storage for RLE-style cmap, zero any extra entries */\n    cmapsize = cinfo->out_color_components * CMAPLENGTH * SIZEOF(rle_map);\n    dest->colormap = (rle_map *) (*cinfo->mem->alloc_small)\n      ((j_common_ptr) cinfo, JPOOL_IMAGE, cmapsize);\n    MEMZERO(dest->colormap, cmapsize);\n\n    /* Save away data in RLE format --- note 8-bit left shift! */\n    /* Shifting would need adjustment for JSAMPLEs wider than 8 bits. */\n    for (ci = 0; ci < cinfo->out_color_components; ci++) {\n      for (i = 0; i < cinfo->actual_number_of_colors; i++) {\n        dest->colormap[ci * CMAPLENGTH + i] =\n          GETJSAMPLE(cinfo->colormap[ci][i]) << 8;\n      }\n    }\n  }\n\n  /* Set the output buffer to the first row */\n  dest->pub.buffer = (*cinfo->mem->access_virt_sarray)\n    ((j_common_ptr) cinfo, dest->image, (JDIMENSION) 0, (JDIMENSION) 1, TRUE);\n  dest->pub.buffer_height = 1;\n\n  dest->pub.put_pixel_rows = rle_put_pixel_rows;\n\n#ifdef PROGRESS_REPORT\n  if (progress != NULL) {\n    progress->total_extra_passes++;  /* count file writing as separate pass */\n  }\n#endif\n}\n\n\n/*\n * Write some pixel data.\n *\n * This routine just saves the data away in a virtual array.\n */\n\nMETHODDEF(void)\nrle_put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t\t    JDIMENSION rows_supplied)\n{\n  rle_dest_ptr dest = (rle_dest_ptr) dinfo;\n\n  if (cinfo->output_scanline < cinfo->output_height) {\n    dest->pub.buffer = (*cinfo->mem->access_virt_sarray)\n      ((j_common_ptr) cinfo, dest->image,\n       cinfo->output_scanline, (JDIMENSION) 1, TRUE);\n  }\n}\n\n/*\n * Finish up at the end of the file.\n *\n * Here is where we really output the RLE file.\n */\n\nMETHODDEF(void)\nfinish_output_rle (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  rle_dest_ptr dest = (rle_dest_ptr) dinfo;\n  rle_hdr header;\t\t/* Output file information */\n  rle_pixel **rle_row, *red, *green, *blue;\n  JSAMPROW output_row;\n  char cmapcomment[80];\n  int row, col;\n  int ci;\n#ifdef PROGRESS_REPORT\n  cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;\n#endif\n\n  /* Initialize the header info */\n  header = *rle_hdr_init(NULL);\n  header.rle_file = dest->pub.output_file;\n  header.xmin     = 0;\n  header.xmax     = cinfo->output_width  - 1;\n  header.ymin     = 0;\n  header.ymax     = cinfo->output_height - 1;\n  header.alpha    = 0;\n  header.ncolors  = cinfo->output_components;\n  for (ci = 0; ci < cinfo->output_components; ci++) {\n    RLE_SET_BIT(header, ci);\n  }\n  if (cinfo->quantize_colors) {\n    header.ncmap   = cinfo->out_color_components;\n    header.cmaplen = CMAPBITS;\n    header.cmap    = dest->colormap;\n    /* Add a comment to the output image with the true colormap length. */\n    sprintf(cmapcomment, \"color_map_length=%d\", cinfo->actual_number_of_colors);\n    rle_putcom(cmapcomment, &header);\n  }\n\n  /* Emit the RLE header and color map (if any) */\n  rle_put_setup(&header);\n\n  /* Now output the RLE data from our virtual array.\n   * We assume here that (a) rle_pixel is represented the same as JSAMPLE,\n   * and (b) we are not on a machine where FAR pointers differ from regular.\n   */\n\n#ifdef PROGRESS_REPORT\n  if (progress != NULL) {\n    progress->pub.pass_limit = cinfo->output_height;\n    progress->pub.pass_counter = 0;\n    (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n  }\n#endif\n\n  if (cinfo->output_components == 1) {\n    for (row = cinfo->output_height-1; row >= 0; row--) {\n      rle_row = (rle_pixel **) (*cinfo->mem->access_virt_sarray)\n        ((j_common_ptr) cinfo, dest->image,\n\t (JDIMENSION) row, (JDIMENSION) 1, FALSE);\n      rle_putrow(rle_row, (int) cinfo->output_width, &header);\n#ifdef PROGRESS_REPORT\n      if (progress != NULL) {\n        progress->pub.pass_counter++;\n        (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n      }\n#endif\n    }\n  } else {\n    for (row = cinfo->output_height-1; row >= 0; row--) {\n      rle_row = (rle_pixel **) dest->rle_row;\n      output_row = * (*cinfo->mem->access_virt_sarray)\n        ((j_common_ptr) cinfo, dest->image,\n\t (JDIMENSION) row, (JDIMENSION) 1, FALSE);\n      red = rle_row[0];\n      green = rle_row[1];\n      blue = rle_row[2];\n      for (col = cinfo->output_width; col > 0; col--) {\n        *red++ = GETJSAMPLE(*output_row++);\n        *green++ = GETJSAMPLE(*output_row++);\n        *blue++ = GETJSAMPLE(*output_row++);\n      }\n      rle_putrow(rle_row, (int) cinfo->output_width, &header);\n#ifdef PROGRESS_REPORT\n      if (progress != NULL) {\n        progress->pub.pass_counter++;\n        (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);\n      }\n#endif\n    }\n  }\n\n#ifdef PROGRESS_REPORT\n  if (progress != NULL)\n    progress->completed_extra_passes++;\n#endif\n\n  /* Emit file trailer */\n  rle_puteof(&header);\n  fflush(dest->pub.output_file);\n  if (ferror(dest->pub.output_file))\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n}\n\n\n/*\n * The module selection routine for RLE format output.\n */\n\nGLOBAL(djpeg_dest_ptr)\njinit_write_rle (j_decompress_ptr cinfo)\n{\n  rle_dest_ptr dest;\n\n  /* Create module interface object, fill in method pointers */\n  dest = (rle_dest_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n                                  SIZEOF(rle_dest_struct));\n  dest->pub.start_output = start_output_rle;\n  dest->pub.finish_output = finish_output_rle;\n\n  /* Calculate output image dimensions so we can allocate space */\n  jpeg_calc_output_dimensions(cinfo);\n\n  /* Allocate a work array for output to the RLE library. */\n  dest->rle_row = (*cinfo->mem->alloc_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE,\n     cinfo->output_width, (JDIMENSION) cinfo->output_components);\n\n  /* Allocate a virtual array to hold the image. */\n  dest->image = (*cinfo->mem->request_virt_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,\n     (JDIMENSION) (cinfo->output_width * cinfo->output_components),\n     cinfo->output_height, (JDIMENSION) 1);\n\n  return (djpeg_dest_ptr) dest;\n}\n\n#endif /* RLE_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_jpeg/src/wrtarga.c",
    "content": "/*\n * wrtarga.c\n *\n * Copyright (C) 1991-1996, Thomas G. Lane.\n * This file is part of the Independent JPEG Group's software.\n * For conditions of distribution and use, see the accompanying README file.\n *\n * This file contains routines to write output images in Targa format.\n *\n * These routines may need modification for non-Unix environments or\n * specialized applications.  As they stand, they assume output to\n * an ordinary stdio stream.\n *\n * Based on code contributed by Lee Daniel Crocker.\n */\n\n#include \"cdjpeg.h\"\t\t/* Common decls for cjpeg/djpeg applications */\n\n#ifdef TARGA_SUPPORTED\n\n\n/*\n * To support 12-bit JPEG data, we'd have to scale output down to 8 bits.\n * This is not yet implemented.\n */\n\n#if BITS_IN_JSAMPLE != 8\n  Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */\n#endif\n\n/*\n * The output buffer needs to be writable by fwrite().  On PCs, we must\n * allocate the buffer in near data space, because we are assuming small-data\n * memory model, wherein fwrite() can't reach far memory.  If you need to\n * process very wide images on a PC, you might have to compile in large-memory\n * model, or else replace fwrite() with a putc() loop --- which will be much\n * slower.\n */\n\n\n/* Private version of data destination object */\n\ntypedef struct {\n  struct djpeg_dest_struct pub;\t/* public fields */\n\n  char *iobuffer;\t\t/* physical I/O buffer */\n  JDIMENSION buffer_width;\t/* width of one row */\n} tga_dest_struct;\n\ntypedef tga_dest_struct * tga_dest_ptr;\n\n\nLOCAL(void)\nwrite_header (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, int num_colors)\n/* Create and write a Targa header */\n{\n  char targaheader[18];\n\n  /* Set unused fields of header to 0 */\n  MEMZERO(targaheader, SIZEOF(targaheader));\n\n  if (num_colors > 0) {\n    targaheader[1] = 1;\t\t/* color map type 1 */\n    targaheader[5] = (char) (num_colors & 0xFF);\n    targaheader[6] = (char) (num_colors >> 8);\n    targaheader[7] = 24;\t/* 24 bits per cmap entry */\n  }\n\n  targaheader[12] = (char) (cinfo->output_width & 0xFF);\n  targaheader[13] = (char) (cinfo->output_width >> 8);\n  targaheader[14] = (char) (cinfo->output_height & 0xFF);\n  targaheader[15] = (char) (cinfo->output_height >> 8);\n  targaheader[17] = 0x20;\t/* Top-down, non-interlaced */\n\n  if (cinfo->out_color_space == JCS_GRAYSCALE) {\n    targaheader[2] = 3;\t\t/* image type = uncompressed gray-scale */\n    targaheader[16] = 8;\t/* bits per pixel */\n  } else {\t\t\t/* must be RGB */\n    if (num_colors > 0) {\n      targaheader[2] = 1;\t/* image type = colormapped RGB */\n      targaheader[16] = 8;\n    } else {\n      targaheader[2] = 2;\t/* image type = uncompressed RGB */\n      targaheader[16] = 24;\n    }\n  }\n\n  if (JFWRITE(dinfo->output_file, targaheader, 18) != (size_t) 18)\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n}\n\n\n/*\n * Write some pixel data.\n * In this module rows_supplied will always be 1.\n */\n\nMETHODDEF(void)\nput_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t\tJDIMENSION rows_supplied)\n/* used for unquantized full-color output */\n{\n  tga_dest_ptr dest = (tga_dest_ptr) dinfo;\n  register JSAMPROW inptr;\n  register char * outptr;\n  register JDIMENSION col;\n\n  inptr = dest->pub.buffer[0];\n  outptr = dest->iobuffer;\n  for (col = cinfo->output_width; col > 0; col--) {\n    outptr[0] = (char) GETJSAMPLE(inptr[2]); /* RGB to BGR order */\n    outptr[1] = (char) GETJSAMPLE(inptr[1]);\n    outptr[2] = (char) GETJSAMPLE(inptr[0]);\n    inptr += 3, outptr += 3;\n  }\n  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);\n}\n\nMETHODDEF(void)\nput_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t       JDIMENSION rows_supplied)\n/* used for grayscale OR quantized color output */\n{\n  tga_dest_ptr dest = (tga_dest_ptr) dinfo;\n  register JSAMPROW inptr;\n  register char * outptr;\n  register JDIMENSION col;\n\n  inptr = dest->pub.buffer[0];\n  outptr = dest->iobuffer;\n  for (col = cinfo->output_width; col > 0; col--) {\n    *outptr++ = (char) GETJSAMPLE(*inptr++);\n  }\n  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);\n}\n\n\n/*\n * Write some demapped pixel data when color quantization is in effect.\n * For Targa, this is only applied to grayscale data.\n */\n\nMETHODDEF(void)\nput_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,\n\t\t   JDIMENSION rows_supplied)\n{\n  tga_dest_ptr dest = (tga_dest_ptr) dinfo;\n  register JSAMPROW inptr;\n  register char * outptr;\n  register JSAMPROW color_map0 = cinfo->colormap[0];\n  register JDIMENSION col;\n\n  inptr = dest->pub.buffer[0];\n  outptr = dest->iobuffer;\n  for (col = cinfo->output_width; col > 0; col--) {\n    *outptr++ = (char) GETJSAMPLE(color_map0[GETJSAMPLE(*inptr++)]);\n  }\n  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);\n}\n\n\n/*\n * Startup: write the file header.\n */\n\nMETHODDEF(void)\nstart_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  tga_dest_ptr dest = (tga_dest_ptr) dinfo;\n  int num_colors, i;\n  FILE *outfile;\n\n  if (cinfo->out_color_space == JCS_GRAYSCALE) {\n    /* Targa doesn't have a mapped grayscale format, so we will */\n    /* demap quantized gray output.  Never emit a colormap. */\n    write_header(cinfo, dinfo, 0);\n    if (cinfo->quantize_colors)\n      dest->pub.put_pixel_rows = put_demapped_gray;\n    else\n      dest->pub.put_pixel_rows = put_gray_rows;\n  } else if (cinfo->out_color_space == JCS_RGB) {\n    if (cinfo->quantize_colors) {\n      /* We only support 8-bit colormap indexes, so only 256 colors */\n      num_colors = cinfo->actual_number_of_colors;\n      if (num_colors > 256)\n\tERREXIT1(cinfo, JERR_TOO_MANY_COLORS, num_colors);\n      write_header(cinfo, dinfo, num_colors);\n      /* Write the colormap.  Note Targa uses BGR byte order */\n      outfile = dest->pub.output_file;\n      for (i = 0; i < num_colors; i++) {\n\tputc(GETJSAMPLE(cinfo->colormap[2][i]), outfile);\n\tputc(GETJSAMPLE(cinfo->colormap[1][i]), outfile);\n\tputc(GETJSAMPLE(cinfo->colormap[0][i]), outfile);\n      }\n      dest->pub.put_pixel_rows = put_gray_rows;\n    } else {\n      write_header(cinfo, dinfo, 0);\n      dest->pub.put_pixel_rows = put_pixel_rows;\n    }\n  } else {\n    ERREXIT(cinfo, JERR_TGA_COLORSPACE);\n  }\n}\n\n\n/*\n * Finish up at the end of the file.\n */\n\nMETHODDEF(void)\nfinish_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)\n{\n  /* Make sure we wrote the output file OK */\n  fflush(dinfo->output_file);\n  if (ferror(dinfo->output_file))\n    ERREXIT(cinfo, JERR_FILE_WRITE);\n}\n\n\n/*\n * The module selection routine for Targa format output.\n */\n\nGLOBAL(djpeg_dest_ptr)\njinit_write_targa (j_decompress_ptr cinfo)\n{\n  tga_dest_ptr dest;\n\n  /* Create module interface object, fill in method pointers */\n  dest = (tga_dest_ptr)\n      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t  SIZEOF(tga_dest_struct));\n  dest->pub.start_output = start_output_tga;\n  dest->pub.finish_output = finish_output_tga;\n\n  /* Calculate output image dimensions so we can allocate space */\n  jpeg_calc_output_dimensions(cinfo);\n\n  /* Create I/O buffer.  Note we make this near on a PC. */\n  dest->buffer_width = cinfo->output_width * cinfo->output_components;\n  dest->iobuffer = (char *)\n    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,\n\t\t\t\t(size_t) (dest->buffer_width * SIZEOF(char)));\n\n  /* Create decompressor output buffer. */\n  dest->pub.buffer = (*cinfo->mem->alloc_sarray)\n    ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width, (JDIMENSION) 1);\n  dest->pub.buffer_height = 1;\n\n  return (djpeg_dest_ptr) dest;\n}\n\n#endif /* TARGA_SUPPORTED */\n"
  },
  {
    "path": "libs/SDL2_mixer/CMakeLists.txt",
    "content": "\ncmake_minimum_required(VERSION 3.4.1)\nproject(SDL2_mixer)\n\n\nfind_library( # Sets the name of the path variable.\n        GLESv1_CM\n\n        GLESv1_CM )\n\nfind_library(\n        GLESv2\n        GLESv2\n)\n\nfind_library(\n        android\n        android\n)\n\nfind_library(\n        z\n        z\n)\n\nfind_library(\n        log\n        log\n)\n\ninclude_directories(include)\n\nadd_definitions(-DGL_GLEXT_PROTOTYPES)\n\nadd_library( # Sets the name of the library.\n        SDL2_mixer\n\n        # Sets the library as a shared library.\n        SHARED\n\n        src/music_mad.c\n        src/dynamic_flac.c\n        src/load_aiff.c\n        src/load_voc.c\n        src/dynamic_ogg.c\n        src/load_mp3.c\n        src/mixer.c\n        src/playmus.c\n        src/music_ogg.c\n        src/music_cmd.c\n        src/music_mod.c\n        src/load_flac.c\n        src/dynamic_fluidsynth.c\n        src/fluidsynth.c\n        src/effect_stereoreverse.c\n        src/music.c\n        src/dynamic_mod.c\n        src/effects_internal.c\n        src/dynamic_modplug.c\n        src/dynamic_mp3.c\n        src/load_ogg.c\n        src/wavestream.c\n        src/effect_position.c\n        src/music_modplug.c\n        src/music_flac.c\n        )\n\n\ntarget_link_libraries(\n        SDL2_mixer\n        SDL2\n        GLESv1_CM\n        GLESv2\n        android\n        z\n        log\n)"
  },
  {
    "path": "libs/SDL2_mixer/build.gradle",
    "content": "apply plugin: 'com.android.model.native'\n\ndef lib_distribution_root = '../distribution'\nmodel {\n\n    android {\n        compileSdkVersion = gradle.sdkVersion\n        buildToolsVersion = gradle.buildToolsVersion\n\n        defaultConfig {\n            minSdkVersion.apiLevel = 13\n            targetSdkVersion.apiLevel = gradle.sdkVersion\n            versionCode = 1\n            versionName = '1.0'\n        }\n        ndk {\n            moduleName = 'SDL2_mixer'\n            ldLibs.addAll([\"GLESv1_CM\", \"EGL\", \"GLESv2\", \"log\", \"android\", \"dl\"])\n            CFlags.addAll([\"-DGL_GLEXT_PROTOTYPES\"])\n            CFlags.addAll([\"-I\" + file(\"include/\").absolutePath,\"-DGL_GLEXT_PROTOTYPES\"])\n        }\n\n        sources {\n            main {\n                jni {\n                    dependencies {\n                        project ':SDL2' linkage 'shared'\n                    }\n                    exportedHeaders {\n                        srcDir \"../SDL2/include\"\n                    }\n                    source {\n                        srcDir \"src\"\n                        exclude \"playwave.c\"\n                    }\n                }\n            }\n        }\n\n    }\n}\n\n// This is just copy out the header file and built lib into distribution\n// directory for clint application to use; it is a small overhead of this sample:\n//    both lib and app are put inside one project space [save maintenance time]\ntask(distributeLib, type : Copy) {\n    // trigger build library\n    dependsOn assemble\n    into '../distribution/SDL2_mixer/'\n    from('build/outputs/native/release/lib') {\n        into 'lib/'\n    }\n}\n"
  },
  {
    "path": "libs/SDL2_mixer/cmake_install.cmake",
    "content": "# Install script for directory: C:/is-Engine/libs/SDL2_mixer\n\n# Set the install prefix\nif(NOT DEFINED CMAKE_INSTALL_PREFIX)\n  set(CMAKE_INSTALL_PREFIX \"C:/Program Files (x86)/Project\")\nendif()\nstring(REGEX REPLACE \"/$\" \"\" CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")\n\n# Set the install configuration name.\nif(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)\n  if(BUILD_TYPE)\n    string(REGEX REPLACE \"^[^A-Za-z0-9_]+\" \"\"\n           CMAKE_INSTALL_CONFIG_NAME \"${BUILD_TYPE}\")\n  else()\n    set(CMAKE_INSTALL_CONFIG_NAME \"Release\")\n  endif()\n  message(STATUS \"Install configuration: \\\"${CMAKE_INSTALL_CONFIG_NAME}\\\"\")\nendif()\n\n# Set the component getting installed.\nif(NOT CMAKE_INSTALL_COMPONENT)\n  if(COMPONENT)\n    message(STATUS \"Install component: \\\"${COMPONENT}\\\"\")\n    set(CMAKE_INSTALL_COMPONENT \"${COMPONENT}\")\n  else()\n    set(CMAKE_INSTALL_COMPONENT)\n  endif()\nendif()\n\n# Install shared libraries without execute permission?\nif(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n  set(CMAKE_INSTALL_SO_NO_EXE \"0\")\nendif()\n\n# Is this installation the result of a crosscompile?\nif(NOT DEFINED CMAKE_CROSSCOMPILING)\n  set(CMAKE_CROSSCOMPILING \"TRUE\")\nendif()\n\n"
  },
  {
    "path": "libs/SDL2_mixer/include/SDL_mixer.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id$ */\n\n#ifndef _SDL_MIXER_H\n#define _SDL_MIXER_H\n\n#include \"SDL_stdinc.h\"\n#include \"SDL_rwops.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_version.h\"\n#include \"begin_code.h\"\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Printable format: \"%d.%d.%d\", MAJOR, MINOR, PATCHLEVEL\n*/\n#define SDL_MIXER_MAJOR_VERSION 2\n#define SDL_MIXER_MINOR_VERSION 0\n#define SDL_MIXER_PATCHLEVEL    1\n\n/* This macro can be used to fill a version structure with the compile-time\n * version of the SDL_mixer library.\n */\n#define SDL_MIXER_VERSION(X)                        \\\n{                                                   \\\n    (X)->major = SDL_MIXER_MAJOR_VERSION;           \\\n    (X)->minor = SDL_MIXER_MINOR_VERSION;           \\\n    (X)->patch = SDL_MIXER_PATCHLEVEL;              \\\n}\n\n/* Backwards compatibility */\n#define MIX_MAJOR_VERSION   SDL_MIXER_MAJOR_VERSION\n#define MIX_MINOR_VERSION   SDL_MIXER_MINOR_VERSION\n#define MIX_PATCHLEVEL      SDL_MIXER_PATCHLEVEL\n#define MIX_VERSION(X)      SDL_MIXER_VERSION(X)\n\n/* This function gets the version of the dynamically linked SDL_mixer library.\n   it should NOT be used to fill a version structure, instead you should\n   use the SDL_MIXER_VERSION() macro.\n */\nextern DECLSPEC const SDL_version * SDLCALL Mix_Linked_Version(void);\n\ntypedef enum\n{\n    MIX_INIT_FLAC        = 0x00000001,\n    MIX_INIT_MOD         = 0x00000002,\n    MIX_INIT_MODPLUG     = 0x00000004,\n    MIX_INIT_MP3         = 0x00000008,\n    MIX_INIT_OGG         = 0x00000010,\n    MIX_INIT_FLUIDSYNTH  = 0x00000020\n} MIX_InitFlags;\n\n/* Loads dynamic libraries and prepares them for use.  Flags should be\n   one or more flags from MIX_InitFlags OR'd together.\n   It returns the flags successfully initialized, or 0 on failure.\n */\nextern DECLSPEC int SDLCALL Mix_Init(int flags);\n\n/* Unloads libraries loaded with Mix_Init */\nextern DECLSPEC void SDLCALL Mix_Quit(void);\n\n\n/* The default mixer has 8 simultaneous mixing channels */\n#ifndef MIX_CHANNELS\n#define MIX_CHANNELS    8\n#endif\n\n/* Good default values for a PC soundcard */\n#define MIX_DEFAULT_FREQUENCY   22050\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n#define MIX_DEFAULT_FORMAT  AUDIO_S16LSB\n#else\n#define MIX_DEFAULT_FORMAT  AUDIO_S16MSB\n#endif\n#define MIX_DEFAULT_CHANNELS    2\n#define MIX_MAX_VOLUME          128 /* Volume of a chunk */\n\n/* The internal format for an audio chunk */\ntypedef struct Mix_Chunk {\n    int allocated;\n    Uint8 *abuf;\n    Uint32 alen;\n    Uint8 volume;       /* Per-sample volume, 0-128 */\n} Mix_Chunk;\n\n/* The different fading types supported */\ntypedef enum {\n    MIX_NO_FADING,\n    MIX_FADING_OUT,\n    MIX_FADING_IN\n} Mix_Fading;\n\ntypedef enum {\n    MUS_NONE,\n    MUS_CMD,\n    MUS_WAV,\n    MUS_MOD,\n    MUS_MID,\n    MUS_OGG,\n    MUS_MP3,\n    MUS_MP3_MAD,\n    MUS_FLAC,\n    MUS_MODPLUG\n} Mix_MusicType;\n\n/* The internal format for a music chunk interpreted via mikmod */\ntypedef struct _Mix_Music Mix_Music;\n\n/* Open the mixer with a certain audio format */\nextern DECLSPEC int SDLCALL Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize);\n\n/* Dynamically change the number of channels managed by the mixer.\n   If decreasing the number of channels, the upper channels are\n   stopped.\n   This function returns the new number of allocated channels.\n */\nextern DECLSPEC int SDLCALL Mix_AllocateChannels(int numchans);\n\n/* Find out what the actual audio device parameters are.\n   This function returns 1 if the audio has been opened, 0 otherwise.\n */\nextern DECLSPEC int SDLCALL Mix_QuerySpec(int *frequency,Uint16 *format,int *channels);\n\n/* Load a wave file or a music (.mod .s3m .it .xm) file */\nextern DECLSPEC Mix_Chunk * SDLCALL Mix_LoadWAV_RW(SDL_RWops *src, int freesrc);\n#define Mix_LoadWAV(file)   Mix_LoadWAV_RW(SDL_RWFromFile(file, \"rb\"), 1)\nextern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUS(const char *file);\n\n/* Load a music file from an SDL_RWop object (Ogg and MikMod specific currently)\n   Matt Campbell (matt@campbellhome.dhs.org) April 2000 */\nextern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUS_RW(SDL_RWops *src, int freesrc);\n\n/* Load a music file from an SDL_RWop object assuming a specific format */\nextern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUSType_RW(SDL_RWops *src, Mix_MusicType type, int freesrc);\n\n/* Load a wave file of the mixer format from a memory buffer */\nextern DECLSPEC Mix_Chunk * SDLCALL Mix_QuickLoad_WAV(Uint8 *mem);\n\n/* Load raw audio data of the mixer format from a memory buffer */\nextern DECLSPEC Mix_Chunk * SDLCALL Mix_QuickLoad_RAW(Uint8 *mem, Uint32 len);\n\n/* Free an audio chunk previously loaded */\nextern DECLSPEC void SDLCALL Mix_FreeChunk(Mix_Chunk *chunk);\nextern DECLSPEC void SDLCALL Mix_FreeMusic(Mix_Music *music);\n\n/* Get a list of chunk/music decoders that this build of SDL_mixer provides.\n   This list can change between builds AND runs of the program, if external\n   libraries that add functionality become available.\n   You must successfully call Mix_OpenAudio() before calling these functions.\n   This API is only available in SDL_mixer 1.2.9 and later.\n\n   // usage...\n   int i;\n   const int total = Mix_GetNumChunkDecoders();\n   for (i = 0; i < total; i++)\n       printf(\"Supported chunk decoder: [%s]\\n\", Mix_GetChunkDecoder(i));\n\n   Appearing in this list doesn't promise your specific audio file will\n   decode...but it's handy to know if you have, say, a functioning Timidity\n   install.\n\n   These return values are static, read-only data; do not modify or free it.\n   The pointers remain valid until you call Mix_CloseAudio().\n*/\nextern DECLSPEC int SDLCALL Mix_GetNumChunkDecoders(void);\nextern DECLSPEC const char * SDLCALL Mix_GetChunkDecoder(int index);\nextern DECLSPEC int SDLCALL Mix_GetNumMusicDecoders(void);\nextern DECLSPEC const char * SDLCALL Mix_GetMusicDecoder(int index);\n\n/* Find out the music format of a mixer music, or the currently playing\n   music, if 'music' is NULL.\n*/\nextern DECLSPEC Mix_MusicType SDLCALL Mix_GetMusicType(const Mix_Music *music);\n\n/* Set a function that is called after all mixing is performed.\n   This can be used to provide real-time visual display of the audio stream\n   or add a custom mixer filter for the stream data.\n*/\nextern DECLSPEC void SDLCALL Mix_SetPostMix(void (*mix_func)(void *udata, Uint8 *stream, int len), void *arg);\n\n/* Add your own music player or additional mixer function.\n   If 'mix_func' is NULL, the default music player is re-enabled.\n */\nextern DECLSPEC void SDLCALL Mix_HookMusic(void (*mix_func)(void *udata, Uint8 *stream, int len), void *arg);\n\n/* Add your own callback for when the music has finished playing or when it is\n * stopped from a call to Mix_HaltMusic.\n */\nextern DECLSPEC void SDLCALL Mix_HookMusicFinished(void (*music_finished)(void));\n\n/* Get a pointer to the user data for the current music hook */\nextern DECLSPEC void * SDLCALL Mix_GetMusicHookData(void);\n\n/*\n * Add your own callback when a channel has finished playing. NULL\n *  to disable callback. The callback may be called from the mixer's audio\n *  callback or it could be called as a result of Mix_HaltChannel(), etc.\n *  do not call SDL_LockAudio() from this callback; you will either be\n *  inside the audio callback, or SDL_mixer will explicitly lock the audio\n *  before calling your callback.\n */\nextern DECLSPEC void SDLCALL Mix_ChannelFinished(void (*channel_finished)(int channel));\n\n\n/* Special Effects API by ryan c. gordon. (icculus@icculus.org) */\n\n#define MIX_CHANNEL_POST  -2\n\n/* This is the format of a special effect callback:\n *\n *   myeffect(int chan, void *stream, int len, void *udata);\n *\n * (chan) is the channel number that your effect is affecting. (stream) is\n *  the buffer of data to work upon. (len) is the size of (stream), and\n *  (udata) is a user-defined bit of data, which you pass as the last arg of\n *  Mix_RegisterEffect(), and is passed back unmolested to your callback.\n *  Your effect changes the contents of (stream) based on whatever parameters\n *  are significant, or just leaves it be, if you prefer. You can do whatever\n *  you like to the buffer, though, and it will continue in its changed state\n *  down the mixing pipeline, through any other effect functions, then finally\n *  to be mixed with the rest of the channels and music for the final output\n *  stream.\n *\n * DO NOT EVER call SDL_LockAudio() from your callback function!\n */\ntypedef void (*Mix_EffectFunc_t)(int chan, void *stream, int len, void *udata);\n\n/*\n * This is a callback that signifies that a channel has finished all its\n *  loops and has completed playback. This gets called if the buffer\n *  plays out normally, or if you call Mix_HaltChannel(), implicitly stop\n *  a channel via Mix_AllocateChannels(), or unregister a callback while\n *  it's still playing.\n *\n * DO NOT EVER call SDL_LockAudio() from your callback function!\n */\ntypedef void (*Mix_EffectDone_t)(int chan, void *udata);\n\n\n/* Register a special effect function. At mixing time, the channel data is\n *  copied into a buffer and passed through each registered effect function.\n *  After it passes through all the functions, it is mixed into the final\n *  output stream. The copy to buffer is performed once, then each effect\n *  function performs on the output of the previous effect. Understand that\n *  this extra copy to a buffer is not performed if there are no effects\n *  registered for a given chunk, which saves CPU cycles, and any given\n *  effect will be extra cycles, too, so it is crucial that your code run\n *  fast. Also note that the data that your function is given is in the\n *  format of the sound device, and not the format you gave to Mix_OpenAudio(),\n *  although they may in reality be the same. This is an unfortunate but\n *  necessary speed concern. Use Mix_QuerySpec() to determine if you can\n *  handle the data before you register your effect, and take appropriate\n *  actions.\n * You may also specify a callback (Mix_EffectDone_t) that is called when\n *  the channel finishes playing. This gives you a more fine-grained control\n *  than Mix_ChannelFinished(), in case you need to free effect-specific\n *  resources, etc. If you don't need this, you can specify NULL.\n * You may set the callbacks before or after calling Mix_PlayChannel().\n * Things like Mix_SetPanning() are just internal special effect functions,\n *  so if you are using that, you've already incurred the overhead of a copy\n *  to a separate buffer, and that these effects will be in the queue with\n *  any functions you've registered. The list of registered effects for a\n *  channel is reset when a chunk finishes playing, so you need to explicitly\n *  set them with each call to Mix_PlayChannel*().\n * You may also register a special effect function that is to be run after\n *  final mixing occurs. The rules for these callbacks are identical to those\n *  in Mix_RegisterEffect, but they are run after all the channels and the\n *  music have been mixed into a single stream, whereas channel-specific\n *  effects run on a given channel before any other mixing occurs. These\n *  global effect callbacks are call \"posteffects\". Posteffects only have\n *  their Mix_EffectDone_t function called when they are unregistered (since\n *  the main output stream is never \"done\" in the same sense as a channel).\n *  You must unregister them manually when you've had enough. Your callback\n *  will be told that the channel being mixed is (MIX_CHANNEL_POST) if the\n *  processing is considered a posteffect.\n *\n * After all these effects have finished processing, the callback registered\n *  through Mix_SetPostMix() runs, and then the stream goes to the audio\n *  device.\n *\n * DO NOT EVER call SDL_LockAudio() from your callback function!\n *\n * returns zero if error (no such channel), nonzero if added.\n *  Error messages can be retrieved from Mix_GetError().\n */\nextern DECLSPEC int SDLCALL Mix_RegisterEffect(int chan, Mix_EffectFunc_t f, Mix_EffectDone_t d, void *arg);\n\n\n/* You may not need to call this explicitly, unless you need to stop an\n *  effect from processing in the middle of a chunk's playback.\n * Posteffects are never implicitly unregistered as they are for channels,\n *  but they may be explicitly unregistered through this function by\n *  specifying MIX_CHANNEL_POST for a channel.\n * returns zero if error (no such channel or effect), nonzero if removed.\n *  Error messages can be retrieved from Mix_GetError().\n */\nextern DECLSPEC int SDLCALL Mix_UnregisterEffect(int channel, Mix_EffectFunc_t f);\n\n\n/* You may not need to call this explicitly, unless you need to stop all\n *  effects from processing in the middle of a chunk's playback. Note that\n *  this will also shut off some internal effect processing, since\n *  Mix_SetPanning() and others may use this API under the hood. This is\n *  called internally when a channel completes playback.\n * Posteffects are never implicitly unregistered as they are for channels,\n *  but they may be explicitly unregistered through this function by\n *  specifying MIX_CHANNEL_POST for a channel.\n * returns zero if error (no such channel), nonzero if all effects removed.\n *  Error messages can be retrieved from Mix_GetError().\n */\nextern DECLSPEC int SDLCALL Mix_UnregisterAllEffects(int channel);\n\n\n#define MIX_EFFECTSMAXSPEED  \"MIX_EFFECTSMAXSPEED\"\n\n/*\n * These are the internally-defined mixing effects. They use the same API that\n *  effects defined in the application use, but are provided here as a\n *  convenience. Some effects can reduce their quality or use more memory in\n *  the name of speed; to enable this, make sure the environment variable\n *  MIX_EFFECTSMAXSPEED (see above) is defined before you call\n *  Mix_OpenAudio().\n */\n\n\n/* Set the panning of a channel. The left and right channels are specified\n *  as integers between 0 and 255, quietest to loudest, respectively.\n *\n * Technically, this is just individual volume control for a sample with\n *  two (stereo) channels, so it can be used for more than just panning.\n *  If you want real panning, call it like this:\n *\n *   Mix_SetPanning(channel, left, 255 - left);\n *\n * ...which isn't so hard.\n *\n * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and\n *  the panning will be done to the final mixed stream before passing it on\n *  to the audio device.\n *\n * This uses the Mix_RegisterEffect() API internally, and returns without\n *  registering the effect function if the audio device is not configured\n *  for stereo output. Setting both (left) and (right) to 255 causes this\n *  effect to be unregistered, since that is the data's normal state.\n *\n * returns zero if error (no such channel or Mix_RegisterEffect() fails),\n *  nonzero if panning effect enabled. Note that an audio device in mono\n *  mode is a no-op, but this call will return successful in that case.\n *  Error messages can be retrieved from Mix_GetError().\n */\nextern DECLSPEC int SDLCALL Mix_SetPanning(int channel, Uint8 left, Uint8 right);\n\n\n/* Set the position of a channel. (angle) is an integer from 0 to 360, that\n *  specifies the location of the sound in relation to the listener. (angle)\n *  will be reduced as neccesary (540 becomes 180 degrees, -100 becomes 260).\n *  Angle 0 is due north, and rotates clockwise as the value increases.\n *  For efficiency, the precision of this effect may be limited (angles 1\n *  through 7 might all produce the same effect, 8 through 15 are equal, etc).\n *  (distance) is an integer between 0 and 255 that specifies the space\n *  between the sound and the listener. The larger the number, the further\n *  away the sound is. Using 255 does not guarantee that the channel will be\n *  culled from the mixing process or be completely silent. For efficiency,\n *  the precision of this effect may be limited (distance 0 through 5 might\n *  all produce the same effect, 6 through 10 are equal, etc). Setting (angle)\n *  and (distance) to 0 unregisters this effect, since the data would be\n *  unchanged.\n *\n * If you need more precise positional audio, consider using OpenAL for\n *  spatialized effects instead of SDL_mixer. This is only meant to be a\n *  basic effect for simple \"3D\" games.\n *\n * If the audio device is configured for mono output, then you won't get\n *  any effectiveness from the angle; however, distance attenuation on the\n *  channel will still occur. While this effect will function with stereo\n *  voices, it makes more sense to use voices with only one channel of sound,\n *  so when they are mixed through this effect, the positioning will sound\n *  correct. You can convert them to mono through SDL before giving them to\n *  the mixer in the first place if you like.\n *\n * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and\n *  the positioning will be done to the final mixed stream before passing it\n *  on to the audio device.\n *\n * This is a convenience wrapper over Mix_SetDistance() and Mix_SetPanning().\n *\n * returns zero if error (no such channel or Mix_RegisterEffect() fails),\n *  nonzero if position effect is enabled.\n *  Error messages can be retrieved from Mix_GetError().\n */\nextern DECLSPEC int SDLCALL Mix_SetPosition(int channel, Sint16 angle, Uint8 distance);\n\n\n/* Set the \"distance\" of a channel. (distance) is an integer from 0 to 255\n *  that specifies the location of the sound in relation to the listener.\n *  Distance 0 is overlapping the listener, and 255 is as far away as possible\n *  A distance of 255 does not guarantee silence; in such a case, you might\n *  want to try changing the chunk's volume, or just cull the sample from the\n *  mixing process with Mix_HaltChannel().\n * For efficiency, the precision of this effect may be limited (distances 1\n *  through 7 might all produce the same effect, 8 through 15 are equal, etc).\n *  (distance) is an integer between 0 and 255 that specifies the space\n *  between the sound and the listener. The larger the number, the further\n *  away the sound is.\n * Setting (distance) to 0 unregisters this effect, since the data would be\n *  unchanged.\n * If you need more precise positional audio, consider using OpenAL for\n *  spatialized effects instead of SDL_mixer. This is only meant to be a\n *  basic effect for simple \"3D\" games.\n *\n * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and\n *  the distance attenuation will be done to the final mixed stream before\n *  passing it on to the audio device.\n *\n * This uses the Mix_RegisterEffect() API internally.\n *\n * returns zero if error (no such channel or Mix_RegisterEffect() fails),\n *  nonzero if position effect is enabled.\n *  Error messages can be retrieved from Mix_GetError().\n */\nextern DECLSPEC int SDLCALL Mix_SetDistance(int channel, Uint8 distance);\n\n\n/*\n * !!! FIXME : Haven't implemented, since the effect goes past the\n *              end of the sound buffer. Will have to think about this.\n *               --ryan.\n */\n#if 0\n/* Causes an echo effect to be mixed into a sound. (echo) is the amount\n *  of echo to mix. 0 is no echo, 255 is infinite (and probably not\n *  what you want).\n *\n * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and\n *  the reverbing will be done to the final mixed stream before passing it on\n *  to the audio device.\n *\n * This uses the Mix_RegisterEffect() API internally. If you specify an echo\n *  of zero, the effect is unregistered, as the data is already in that state.\n *\n * returns zero if error (no such channel or Mix_RegisterEffect() fails),\n *  nonzero if reversing effect is enabled.\n *  Error messages can be retrieved from Mix_GetError().\n */\nextern no_parse_DECLSPEC int SDLCALL Mix_SetReverb(int channel, Uint8 echo);\n#endif\n\n/* Causes a channel to reverse its stereo. This is handy if the user has his\n *  speakers hooked up backwards, or you would like to have a minor bit of\n *  psychedelia in your sound code.  :)  Calling this function with (flip)\n *  set to non-zero reverses the chunks's usual channels. If (flip) is zero,\n *  the effect is unregistered.\n *\n * This uses the Mix_RegisterEffect() API internally, and thus is probably\n *  more CPU intensive than having the user just plug in his speakers\n *  correctly. Mix_SetReverseStereo() returns without registering the effect\n *  function if the audio device is not configured for stereo output.\n *\n * If you specify MIX_CHANNEL_POST for (channel), then this the effect is used\n *  on the final mixed stream before sending it on to the audio device (a\n *  posteffect).\n *\n * returns zero if error (no such channel or Mix_RegisterEffect() fails),\n *  nonzero if reversing effect is enabled. Note that an audio device in mono\n *  mode is a no-op, but this call will return successful in that case.\n *  Error messages can be retrieved from Mix_GetError().\n */\nextern DECLSPEC int SDLCALL Mix_SetReverseStereo(int channel, int flip);\n\n/* end of effects API. --ryan. */\n\n\n/* Reserve the first channels (0 -> n-1) for the application, i.e. don't allocate\n   them dynamically to the next sample if requested with a -1 value below.\n   Returns the number of reserved channels.\n */\nextern DECLSPEC int SDLCALL Mix_ReserveChannels(int num);\n\n/* Channel grouping functions */\n\n/* Attach a tag to a channel. A tag can be assigned to several mixer\n   channels, to form groups of channels.\n   If 'tag' is -1, the tag is removed (actually -1 is the tag used to\n   represent the group of all the channels).\n   Returns true if everything was OK.\n */\nextern DECLSPEC int SDLCALL Mix_GroupChannel(int which, int tag);\n/* Assign several consecutive channels to a group */\nextern DECLSPEC int SDLCALL Mix_GroupChannels(int from, int to, int tag);\n/* Finds the first available channel in a group of channels,\n   returning -1 if none are available.\n */\nextern DECLSPEC int SDLCALL Mix_GroupAvailable(int tag);\n/* Returns the number of channels in a group. This is also a subtle\n   way to get the total number of channels when 'tag' is -1\n */\nextern DECLSPEC int SDLCALL Mix_GroupCount(int tag);\n/* Finds the \"oldest\" sample playing in a group of channels */\nextern DECLSPEC int SDLCALL Mix_GroupOldest(int tag);\n/* Finds the \"most recent\" (i.e. last) sample playing in a group of channels */\nextern DECLSPEC int SDLCALL Mix_GroupNewer(int tag);\n\n/* Play an audio chunk on a specific channel.\n   If the specified channel is -1, play on the first free channel.\n   If 'loops' is greater than zero, loop the sound that many times.\n   If 'loops' is -1, loop inifinitely (~65000 times).\n   Returns which channel was used to play the sound.\n*/\n#define Mix_PlayChannel(channel,chunk,loops) Mix_PlayChannelTimed(channel,chunk,loops,-1)\n/* The same as above, but the sound is played at most 'ticks' milliseconds */\nextern DECLSPEC int SDLCALL Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks);\nextern DECLSPEC int SDLCALL Mix_PlayMusic(Mix_Music *music, int loops);\n\n/* Fade in music or a channel over \"ms\" milliseconds, same semantics as the \"Play\" functions */\nextern DECLSPEC int SDLCALL Mix_FadeInMusic(Mix_Music *music, int loops, int ms);\nextern DECLSPEC int SDLCALL Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position);\n#define Mix_FadeInChannel(channel,chunk,loops,ms) Mix_FadeInChannelTimed(channel,chunk,loops,ms,-1)\nextern DECLSPEC int SDLCALL Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ms, int ticks);\n\n/* Set the volume in the range of 0-128 of a specific channel or chunk.\n   If the specified channel is -1, set volume for all channels.\n   Returns the original volume.\n   If the specified volume is -1, just return the current volume.\n*/\nextern DECLSPEC int SDLCALL Mix_Volume(int channel, int volume);\nextern DECLSPEC int SDLCALL Mix_VolumeChunk(Mix_Chunk *chunk, int volume);\nextern DECLSPEC int SDLCALL Mix_VolumeMusic(int volume);\n\n/* Halt playing of a particular channel */\nextern DECLSPEC int SDLCALL Mix_HaltChannel(int channel);\nextern DECLSPEC int SDLCALL Mix_HaltGroup(int tag);\nextern DECLSPEC int SDLCALL Mix_HaltMusic(void);\n\n/* Change the expiration delay for a particular channel.\n   The sample will stop playing after the 'ticks' milliseconds have elapsed,\n   or remove the expiration if 'ticks' is -1\n*/\nextern DECLSPEC int SDLCALL Mix_ExpireChannel(int channel, int ticks);\n\n/* Halt a channel, fading it out progressively till it's silent\n   The ms parameter indicates the number of milliseconds the fading\n   will take.\n */\nextern DECLSPEC int SDLCALL Mix_FadeOutChannel(int which, int ms);\nextern DECLSPEC int SDLCALL Mix_FadeOutGroup(int tag, int ms);\nextern DECLSPEC int SDLCALL Mix_FadeOutMusic(int ms);\n\n/* Query the fading status of a channel */\nextern DECLSPEC Mix_Fading SDLCALL Mix_FadingMusic(void);\nextern DECLSPEC Mix_Fading SDLCALL Mix_FadingChannel(int which);\n\n/* Pause/Resume a particular channel */\nextern DECLSPEC void SDLCALL Mix_Pause(int channel);\nextern DECLSPEC void SDLCALL Mix_Resume(int channel);\nextern DECLSPEC int SDLCALL Mix_Paused(int channel);\n\n/* Pause/Resume the music stream */\nextern DECLSPEC void SDLCALL Mix_PauseMusic(void);\nextern DECLSPEC void SDLCALL Mix_ResumeMusic(void);\nextern DECLSPEC void SDLCALL Mix_RewindMusic(void);\nextern DECLSPEC int SDLCALL Mix_PausedMusic(void);\n\n/* Set the current position in the music stream.\n   This returns 0 if successful, or -1 if it failed or isn't implemented.\n   This function is only implemented for MOD music formats (set pattern\n   order number) and for OGG, FLAC, MP3_MAD, and MODPLUG music (set\n   position in seconds), at the moment.\n*/\nextern DECLSPEC int SDLCALL Mix_SetMusicPosition(double position);\n\n/* Check the status of a specific channel.\n   If the specified channel is -1, check all channels.\n*/\nextern DECLSPEC int SDLCALL Mix_Playing(int channel);\nextern DECLSPEC int SDLCALL Mix_PlayingMusic(void);\n\n/* Stop music and set external music playback command */\nextern DECLSPEC int SDLCALL Mix_SetMusicCMD(const char *command);\n\n/* Synchro value is set by MikMod from modules while playing */\nextern DECLSPEC int SDLCALL Mix_SetSynchroValue(int value);\nextern DECLSPEC int SDLCALL Mix_GetSynchroValue(void);\n\n/* Set/Get/Iterate SoundFonts paths to use by supported MIDI backends */\nextern DECLSPEC int SDLCALL Mix_SetSoundFonts(const char *paths);\nextern DECLSPEC const char* SDLCALL Mix_GetSoundFonts(void);\nextern DECLSPEC int SDLCALL Mix_EachSoundFont(int (*function)(const char*, void*), void *data);\n\n/* Get the Mix_Chunk currently associated with a mixer channel\n    Returns NULL if it's an invalid channel, or there's no chunk associated.\n*/\nextern DECLSPEC Mix_Chunk * SDLCALL Mix_GetChunk(int channel);\n\n/* Close the mixer, halting all playing audio */\nextern DECLSPEC void SDLCALL Mix_CloseAudio(void);\n\n/* We'll use SDL for reporting errors */\n#define Mix_SetError    SDL_SetError\n#define Mix_GetError    SDL_GetError\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_MIXER_H */\n"
  },
  {
    "path": "libs/SDL2_mixer/include/dynamic_flac.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  The following file defines all of the functions/objects used to dynamically\n  link to the libFLAC library.\n    ~ Austen Dicken (admin@cvpcs.org)\n*/\n\n#ifdef FLAC_MUSIC\n\n#include <FLAC/stream_decoder.h>\n\ntypedef struct {\n    int loaded;\n    void *handle;\n    FLAC__StreamDecoder *(*FLAC__stream_decoder_new)();\n    void (*FLAC__stream_decoder_delete)(FLAC__StreamDecoder *decoder);\n    FLAC__StreamDecoderInitStatus (*FLAC__stream_decoder_init_stream)(\n                        FLAC__StreamDecoder *decoder,\n                        FLAC__StreamDecoderReadCallback read_callback,\n                        FLAC__StreamDecoderSeekCallback seek_callback,\n                        FLAC__StreamDecoderTellCallback tell_callback,\n                        FLAC__StreamDecoderLengthCallback length_callback,\n                        FLAC__StreamDecoderEofCallback eof_callback,\n                        FLAC__StreamDecoderWriteCallback write_callback,\n                        FLAC__StreamDecoderMetadataCallback metadata_callback,\n                        FLAC__StreamDecoderErrorCallback error_callback,\n                        void *client_data);\n    FLAC__bool (*FLAC__stream_decoder_finish)(FLAC__StreamDecoder *decoder);\n    FLAC__bool (*FLAC__stream_decoder_flush)(FLAC__StreamDecoder *decoder);\n    FLAC__bool (*FLAC__stream_decoder_process_single)(\n                        FLAC__StreamDecoder *decoder);\n    FLAC__bool (*FLAC__stream_decoder_process_until_end_of_metadata)(\n                        FLAC__StreamDecoder *decoder);\n    FLAC__bool (*FLAC__stream_decoder_process_until_end_of_stream)(\n                        FLAC__StreamDecoder *decoder);\n    FLAC__bool (*FLAC__stream_decoder_seek_absolute)(\n                        FLAC__StreamDecoder *decoder,\n                        FLAC__uint64 sample);\n    FLAC__StreamDecoderState (*FLAC__stream_decoder_get_state)(\n                        const FLAC__StreamDecoder *decoder);\n} flac_loader;\n\nextern flac_loader flac;\n\n#endif /* FLAC_MUSIC */\n\nextern int Mix_InitFLAC();\nextern void Mix_QuitFLAC();\n"
  },
  {
    "path": "libs/SDL2_mixer/include/dynamic_fluidsynth.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  James Le Cuirot\n  chewi@aura-online.co.uk\n*/\n\n#ifdef USE_FLUIDSYNTH_MIDI\n\n#include <fluidsynth.h>\n\ntypedef struct {\n    int loaded;\n    void *handle;\n\n    int (*delete_fluid_player)(fluid_player_t*);\n    void (*delete_fluid_settings)(fluid_settings_t*);\n    int (*delete_fluid_synth)(fluid_synth_t*);\n    int (*fluid_player_add)(fluid_player_t*, const char*);\n    int (*fluid_player_add_mem)(fluid_player_t*, const void*, size_t);\n    int (*fluid_player_get_status)(fluid_player_t*);\n    int (*fluid_player_play)(fluid_player_t*);\n    int (*fluid_player_set_loop)(fluid_player_t*, int);\n    int (*fluid_player_stop)(fluid_player_t*);\n    int (*fluid_settings_setnum)(fluid_settings_t*, const char*, double);\n    fluid_settings_t* (*fluid_synth_get_settings)(fluid_synth_t*);\n    void (*fluid_synth_set_gain)(fluid_synth_t*, float);\n    int (*fluid_synth_sfload)(fluid_synth_t*, const char*, int);\n    int (*fluid_synth_write_s16)(fluid_synth_t*, int, void*, int, int, void*, int, int);\n    fluid_player_t* (*new_fluid_player)(fluid_synth_t*);\n    fluid_settings_t* (*new_fluid_settings)(void);\n    fluid_synth_t* (*new_fluid_synth)(fluid_settings_t*);\n} fluidsynth_loader;\n\nextern fluidsynth_loader fluidsynth;\n\n#endif /* USE_FLUIDSYNTH_MIDI */\n\nextern int Mix_InitFluidSynth();\nextern void Mix_QuitFluidSynth();\n"
  },
  {
    "path": "libs/SDL2_mixer/include/dynamic_mod.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MOD_MUSIC\n\n#include \"mikmod.h\"\n\ntypedef struct {\n    int loaded;\n    void *handle;\n\n    void (*MikMod_Exit)(void);\n    CHAR* (*MikMod_InfoDriver)(void);\n    CHAR* (*MikMod_InfoLoader)(void);\n    BOOL (*MikMod_Init)(CHAR*);\n    void (*MikMod_RegisterAllLoaders)(void);\n    void (*MikMod_RegisterDriver)(struct MDRIVER*);\n    int* MikMod_errno;\n    char* (*MikMod_strerror)(int);\n    void (*MikMod_free)(void*);\n    BOOL (*Player_Active)(void);\n    void (*Player_Free)(MODULE*);\n    MODULE* (*Player_LoadGeneric)(MREADER*,int,BOOL);\n    void (*Player_SetPosition)(UWORD);\n    void (*Player_SetVolume)(SWORD);\n    void (*Player_Start)(MODULE*);\n    void (*Player_Stop)(void);\n    ULONG (*VC_WriteBytes)(SBYTE*,ULONG);\n    struct MDRIVER* drv_nos;\n    UWORD* md_device;\n    UWORD* md_mixfreq;\n    UWORD* md_mode;\n    UBYTE* md_musicvolume;\n    UBYTE* md_pansep;\n    UBYTE* md_reverb;\n    UBYTE* md_sndfxvolume;\n    UBYTE* md_volume;\n} mikmod_loader;\n\nextern mikmod_loader mikmod;\n\n#endif /* MOD_MUSIC */\n\nextern int Mix_InitMOD();\nextern void Mix_QuitMOD();\n"
  },
  {
    "path": "libs/SDL2_mixer/include/dynamic_modplug.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MODPLUG_MUSIC\n\n#ifdef MODPLUG_HEADER\n#include MODPLUG_HEADER\n#else\n#include <libmodplug/modplug.h>\n#endif\n\ntypedef struct {\n    int loaded;\n    void *handle;\n\n    ModPlugFile* (*ModPlug_Load)(const void* data, int size);\n    void (*ModPlug_Unload)(ModPlugFile* file);\n    int  (*ModPlug_Read)(ModPlugFile* file, void* buffer, int size);\n    void (*ModPlug_Seek)(ModPlugFile* file, int millisecond);\n    void (*ModPlug_GetSettings)(ModPlug_Settings* settings);\n    void (*ModPlug_SetSettings)(const ModPlug_Settings* settings);\n    void (*ModPlug_SetMasterVolume)(ModPlugFile* file,unsigned int cvol) ;\n} modplug_loader;\n\nextern modplug_loader modplug;\n\n#endif /* MODPLUG_MUSIC */\n\nextern int Mix_InitModPlug();\nextern void Mix_QuitModPlug();\n"
  },
  {
    "path": "libs/SDL2_mixer/include/dynamic_mp3.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MP3_MUSIC\n#include \"smpeg.h\"\n\ntypedef struct {\n    int loaded;\n    void *handle;\n    void (*SMPEG_actualSpec)( SMPEG *mpeg, SDL_AudioSpec *spec );\n    void (*SMPEG_delete)( SMPEG* mpeg );\n    void (*SMPEG_enableaudio)( SMPEG* mpeg, int enable );\n    void (*SMPEG_enablevideo)( SMPEG* mpeg, int enable );\n    SMPEG* (*SMPEG_new_rwops)(SDL_RWops *src, SMPEG_Info* info, int freesrc, int sdl_audio);\n    void (*SMPEG_play)( SMPEG* mpeg );\n    int (*SMPEG_playAudio)( SMPEG *mpeg, Uint8 *stream, int len );\n    void (*SMPEG_rewind)( SMPEG* mpeg );\n    void (*SMPEG_setvolume)( SMPEG* mpeg, int volume );\n    void (*SMPEG_skip)( SMPEG* mpeg, float seconds );\n    SMPEGstatus (*SMPEG_status)( SMPEG* mpeg );\n    void (*SMPEG_stop)( SMPEG* mpeg );\n} smpeg_loader;\n\nextern smpeg_loader smpeg;\n\n#endif /* MUSIC_MP3 */\n\nextern int Mix_InitMP3();\nextern void Mix_QuitMP3();\n"
  },
  {
    "path": "libs/SDL2_mixer/include/dynamic_ogg.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef OGG_MUSIC\n#if defined(OGG_HEADER)\n#include OGG_HEADER\n#elif defined(OGG_USE_TREMOR)\n#include <tremor/ivorbisfile.h>\n#else\n#include <vorbis/vorbisfile.h>\n#endif\n\ntypedef struct {\n    int loaded;\n    void *handle;\n    int (*ov_clear)(OggVorbis_File *vf);\n    vorbis_info *(*ov_info)(OggVorbis_File *vf,int link);\n    int (*ov_open_callbacks)(void *datasource, OggVorbis_File *vf, const char *initial, long ibytes, ov_callbacks callbacks);\n    ogg_int64_t (*ov_pcm_total)(OggVorbis_File *vf,int i);\n#ifdef OGG_USE_TREMOR\n    long (*ov_read)(OggVorbis_File *vf,char *buffer,int length, int *bitstream);\n#else\n    long (*ov_read)(OggVorbis_File *vf,char *buffer,int length, int bigendianp,int word,int sgned,int *bitstream);\n#endif\n#ifdef OGG_USE_TREMOR\n    int (*ov_time_seek)(OggVorbis_File *vf,ogg_int64_t pos);\n#else\n    int (*ov_time_seek)(OggVorbis_File *vf,double pos);\n#endif\n} vorbis_loader;\n\nextern vorbis_loader vorbis;\n\n#endif /* OGG_MUSIC */\n\nextern int Mix_InitOgg();\nextern void Mix_QuitOgg();\n"
  },
  {
    "path": "libs/SDL2_mixer/include/effects_internal.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id$ */\n\n#ifndef _INCLUDE_EFFECTS_INTERNAL_H_\n#define _INCLUDE_EFFECTS_INTERNAL_H_\n\n#ifndef __MIX_INTERNAL_EFFECT__\n#error You should not include this file or use these functions.\n#endif\n\n#include \"SDL_mixer.h\"\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nextern int _Mix_effects_max_speed;\nextern void *_Eff_volume_table;\nvoid *_Eff_build_volume_table_u8(void);\nvoid *_Eff_build_volume_table_s8(void);\n\nvoid _Mix_InitEffects(void);\nvoid _Mix_DeinitEffects(void);\nvoid _Eff_PositionDeinit(void);\n\nint _Mix_RegisterEffect_locked(int channel, Mix_EffectFunc_t f,\n                               Mix_EffectDone_t d, void *arg);\nint _Mix_UnregisterEffect_locked(int channel, Mix_EffectFunc_t f);\nint _Mix_UnregisterAllEffects_locked(int channel);\n\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\n}\n#endif\n\n\n#endif\n\n"
  },
  {
    "path": "libs/SDL2_mixer/include/fluidsynth.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  James Le Cuirot\n  chewi@aura-online.co.uk\n*/\n\n#ifndef _FLUIDSYNTH_H_\n#define _FLUIDSYNTH_H_\n\n#ifdef USE_FLUIDSYNTH_MIDI\n\n#include \"dynamic_fluidsynth.h\"\n#include <SDL_rwops.h>\n#include <SDL_audio.h>\n\ntypedef struct {\n    SDL_AudioCVT convert;\n    fluid_synth_t *synth;\n    fluid_player_t* player;\n} FluidSynthMidiSong;\n\nint fluidsynth_init(SDL_AudioSpec *mixer);\nFluidSynthMidiSong *fluidsynth_loadsong_RW(SDL_RWops *rw, int freerw);\nvoid fluidsynth_freesong(FluidSynthMidiSong *song);\nvoid fluidsynth_start(FluidSynthMidiSong *song);\nvoid fluidsynth_stop(FluidSynthMidiSong *song);\nint fluidsynth_active(FluidSynthMidiSong *song);\nvoid fluidsynth_setvolume(FluidSynthMidiSong *song, int volume);\nint fluidsynth_playsome(FluidSynthMidiSong *song, void *stream, int len);\n\n#endif /* USE_FLUIDSYNTH_MIDI */\n\n#endif /* _FLUIDSYNTH_H_ */\n"
  },
  {
    "path": "libs/SDL2_mixer/include/load_aiff.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n    This is the source needed to decode an AIFF file into a waveform.\n    It's pretty straightforward once you get going. The only\n    externally-callable function is Mix_LoadAIFF_RW(), which is meant to\n    act as identically to SDL_LoadWAV_RW() as possible.\n\n    This file by Torbjrn Andersson (torbjorn.andersson@eurotime.se)\n*/\n\n/* $Id$ */\n\n/* Don't call this directly; use Mix_LoadWAV_RW() for now. */\nSDL_AudioSpec *Mix_LoadAIFF_RW (SDL_RWops *src, int freesrc,\n    SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len);\n"
  },
  {
    "path": "libs/SDL2_mixer/include/load_flac.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This is the source needed to decode a FLAC into a waveform.\n    ~ Austen Dicken (admin@cvpcs.org).\n*/\n\n/* $Id: $ */\n\n#ifdef FLAC_MUSIC\n/* Don't call this directly; use Mix_LoadWAV_RW() for now. */\nSDL_AudioSpec *Mix_LoadFLAC_RW (SDL_RWops *src, int freesrc,\n        SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len);\n#endif\n"
  },
  {
    "path": "libs/SDL2_mixer/include/load_mp3.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This is the source needed to decode an MP3 into a waveform.\n*/\n\n/* $Id$ */\n\n#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)\n/* Don't call this directly; use Mix_LoadWAV_RW() for now. */\nSDL_AudioSpec *Mix_LoadMP3_RW (SDL_RWops *src, int freesrc,\n        SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len);\n#endif\n"
  },
  {
    "path": "libs/SDL2_mixer/include/load_ogg.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This is the source needed to decode an Ogg Vorbis into a waveform.\n  This file by Vaclav Slavik (vaclav.slavik@matfyz.cz).\n*/\n\n/* $Id$ */\n\n#ifdef OGG_MUSIC\n/* Don't call this directly; use Mix_LoadWAV_RW() for now. */\nSDL_AudioSpec *Mix_LoadOGG_RW (SDL_RWops *src, int freesrc,\n        SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len);\n#endif\n"
  },
  {
    "path": "libs/SDL2_mixer/include/load_voc.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This is the source needed to decode a Creative Labs VOC file into a\n  waveform. It's pretty straightforward once you get going. The only\n  externally-callable function is Mix_LoadVOC_RW(), which is meant to\n  act as identically to SDL_LoadWAV_RW() as possible.\n\n  This file by Ryan C. Gordon (icculus@icculus.org).\n\n  Heavily borrowed from sox v12.17.1's voc.c.\n        (http://www.freshmeat.net/projects/sox/)\n*/\n\n/* $Id$ */\n\n/* Don't call this directly; use Mix_LoadWAV_RW() for now. */\nSDL_AudioSpec *Mix_LoadVOC_RW (SDL_RWops *src, int freesrc,\n        SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len);\n"
  },
  {
    "path": "libs/SDL2_mixer/include/music_cmd.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* This file supports an external command for playing music */\n\n#ifdef CMD_MUSIC\n\n#include <sys/types.h>\n#include <limits.h>\n#include <stdio.h>\n#if defined(__linux__) && defined(__arm__)\n# include <linux/limits.h>\n#endif\ntypedef struct {\n    char *file;\n    char *cmd;\n    pid_t pid;\n} MusicCMD;\n\n/* Unimplemented */\nextern void MusicCMD_SetVolume(int volume);\n\n/* Load a music stream from the given file */\nextern MusicCMD *MusicCMD_LoadSong(const char *cmd, const char *file);\n\n/* Start playback of a given music stream */\nextern void MusicCMD_Start(MusicCMD *music);\n\n/* Stop playback of a stream previously started with MusicCMD_Start() */\nextern void MusicCMD_Stop(MusicCMD *music);\n\n/* Pause playback of a given music stream */\nextern void MusicCMD_Pause(MusicCMD *music);\n\n/* Resume playback of a given music stream */\nextern void MusicCMD_Resume(MusicCMD *music);\n\n/* Close the given music stream */\nextern void MusicCMD_FreeSong(MusicCMD *music);\n\n/* Return non-zero if a stream is currently playing */\nextern int MusicCMD_Active(MusicCMD *music);\n\n#endif /* CMD_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/include/music_flac.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  Header to handle loading FLAC music files in SDL.\n    ~ Austen Dicken (admin@cvpcs.org)\n*/\n\n/* $Id:  $ */\n\n#ifdef FLAC_MUSIC\n\n#include <FLAC/stream_decoder.h>\n\ntypedef struct {\n    FLAC__uint64 sample_size;\n    unsigned sample_rate;\n    unsigned channels;\n    unsigned bits_per_sample;\n    FLAC__uint64 total_samples;\n\n    // the following are used to handle the callback nature of the writer\n    int max_to_read;\n    char *data;             // pointer to beginning of data array\n    int data_len;           // size of data array\n    int data_read;          // amount of data array used\n    char *overflow;         // pointer to beginning of overflow array\n    int overflow_len;       // size of overflow array\n    int overflow_read;      // amount of overflow array used\n} FLAC_Data;\n\ntypedef struct {\n    int playing;\n    int volume;\n    int section;\n    FLAC__StreamDecoder *flac_decoder;\n    FLAC_Data flac_data;\n    SDL_RWops *src;\n    int freesrc;\n    SDL_AudioCVT cvt;\n    int len_available;\n    Uint8 *snd_available;\n} FLAC_music;\n\n/* Initialize the FLAC player, with the given mixer settings\n   This function returns 0, or -1 if there was an error.\n */\nextern int FLAC_init(SDL_AudioSpec *mixer);\n\n/* Set the volume for a FLAC stream */\nextern void FLAC_setvolume(FLAC_music *music, int volume);\n\n/* Load an FLAC stream from an SDL_RWops object */\nextern FLAC_music *FLAC_new_RW(SDL_RWops *src, int freesrc);\n\n/* Start playback of a given FLAC stream */\nextern void FLAC_play(FLAC_music *music);\n\n/* Return non-zero if a stream is currently playing */\nextern int FLAC_playing(FLAC_music *music);\n\n/* Play some of a stream previously started with FLAC_play() */\nextern int FLAC_playAudio(FLAC_music *music, Uint8 *stream, int len);\n\n/* Stop playback of a stream previously started with FLAC_play() */\nextern void FLAC_stop(FLAC_music *music);\n\n/* Close the given FLAC stream */\nextern void FLAC_delete(FLAC_music *music);\n\n/* Jump (seek) to a given position (time is in seconds) */\nextern void FLAC_jump_to_time(FLAC_music *music, double time);\n\n#endif /* FLAC_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/include/music_mad.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MP3_MAD_MUSIC\n\n#include \"mad.h\"\n#include \"SDL_rwops.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_mixer.h\"\n\n#define MAD_INPUT_BUFFER_SIZE   (5*8192)\n#define MAD_OUTPUT_BUFFER_SIZE  8192\n\nenum {\n  MS_input_eof    = 0x0001,\n  MS_input_error  = 0x0001,\n  MS_decode_eof   = 0x0002,\n  MS_decode_error = 0x0004,\n  MS_error_flags  = 0x000f,\n\n  MS_playing      = 0x0100,\n  MS_cvt_decoded  = 0x0200,\n};\n\ntypedef struct {\n  SDL_RWops *src;\n  int freesrc;\n  struct mad_stream stream;\n  struct mad_frame frame;\n  struct mad_synth synth;\n  int frames_read;\n  mad_timer_t next_frame_start;\n  int volume;\n  int status;\n  int output_begin, output_end;\n  SDL_AudioSpec mixer;\n  SDL_AudioCVT cvt;\n\n  unsigned char input_buffer[MAD_INPUT_BUFFER_SIZE + MAD_BUFFER_GUARD];\n  unsigned char output_buffer[MAD_OUTPUT_BUFFER_SIZE];\n} mad_data;\n\nmad_data *mad_openFileRW(SDL_RWops *src, SDL_AudioSpec *mixer, int freesrc);\nvoid mad_closeFile(mad_data *mp3_mad);\n\nvoid mad_start(mad_data *mp3_mad);\nvoid mad_stop(mad_data *mp3_mad);\nint mad_isPlaying(mad_data *mp3_mad);\n\nint mad_getSamples(mad_data *mp3_mad, Uint8 *stream, int len);\nvoid mad_seek(mad_data *mp3_mad, double position);\nvoid mad_setVolume(mad_data *mp3_mad, int volume);\n\n#endif\n"
  },
  {
    "path": "libs/SDL2_mixer/include/music_mod.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id: music_mod.h 4211 2008-12-08 00:27:32Z slouken $ */\n\n#ifdef MOD_MUSIC\n\n/* This file supports MOD tracker music streams */\n\nstruct MODULE;\n\n/* Initialize the Ogg Vorbis player, with the given mixer settings\n   This function returns 0, or -1 if there was an error.\n */\nextern int MOD_init(SDL_AudioSpec *mixer);\n\n/* Uninitialize the music players */\nextern void MOD_exit(void);\n\n/* Set the volume for a MOD stream */\nextern void MOD_setvolume(struct MODULE *music, int volume);\n\n/* Load a MOD stream from an SDL_RWops object */\nextern struct MODULE *MOD_new_RW(SDL_RWops *rw, int freerw);\n\n/* Start playback of a given MOD stream */\nextern void MOD_play(struct MODULE *music);\n\n/* Return non-zero if a stream is currently playing */\nextern int MOD_playing(struct MODULE *music);\n\n/* Play some of a stream previously started with MOD_play() */\nextern int MOD_playAudio(struct MODULE *music, Uint8 *stream, int len);\n\n/* Stop playback of a stream previously started with MOD_play() */\nextern void MOD_stop(struct MODULE *music);\n\n/* Close the given MOD stream */\nextern void MOD_delete(struct MODULE *music);\n\n/* Jump (seek) to a given position (time is in seconds) */\nextern void MOD_jump_to_time(struct MODULE *music, double time);\n\n#endif /* MOD_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/include/music_modplug.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MODPLUG_MUSIC\n\n#ifdef MODPLUG_HEADER\n#include MODPLUG_HEADER\n#else\n#include <libmodplug/modplug.h>\n#endif\n#include \"SDL_rwops.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_mixer.h\"\n\ntypedef struct {\n    ModPlugFile *file;\n    int playing;\n} modplug_data;\n\nint modplug_init(SDL_AudioSpec *mixer);\n\n/* Uninitialize the music players */\nvoid modplug_exit(void);\n\n/* Set the volume for a modplug stream */\nvoid modplug_setvolume(modplug_data *music, int volume);\n\n/* Load a modplug stream from an SDL_RWops object */\nmodplug_data *modplug_new_RW(SDL_RWops *rw, int freerw);\n\n/* Start playback of a given modplug stream */\nvoid modplug_play(modplug_data *music);\n\n/* Return non-zero if a stream is currently playing */\nint modplug_playing(modplug_data *music);\n\n/* Play some of a stream previously started with modplug_play() */\nint modplug_playAudio(modplug_data *music, Uint8 *stream, int len);\n\n/* Stop playback of a stream previously started with modplug_play() */\nvoid modplug_stop(modplug_data *music);\n\n/* Close the given modplug stream */\nvoid modplug_delete(modplug_data *music);\n\n/* Jump (seek) to a given position (time is in seconds) */\nvoid modplug_jump_to_time(modplug_data *music, double time);\n\n#endif /* MODPLUG_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/include/music_ogg.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id$ */\n\n#ifdef OGG_MUSIC\n\n/* This file supports Ogg Vorbis music streams */\n\n#if defined(OGG_HEADER)\n#include OGG_HEADER\n#elif defined(OGG_USE_TREMOR)\n#include <tremor/ivorbisfile.h>\n#else\n#include <vorbis/vorbisfile.h>\n#endif\n\ntypedef struct {\n    SDL_RWops *src;\n    int freesrc;\n    int playing;\n    int volume;\n    OggVorbis_File vf;\n    int section;\n    SDL_AudioCVT cvt;\n    int len_available;\n    Uint8 *snd_available;\n} OGG_music;\n\n/* Initialize the Ogg Vorbis player, with the given mixer settings\n   This function returns 0, or -1 if there was an error.\n */\nextern int OGG_init(SDL_AudioSpec *mixer);\n\n/* Set the volume for an OGG stream */\nextern void OGG_setvolume(OGG_music *music, int volume);\n\n/* Load an OGG stream from an SDL_RWops object */\nextern OGG_music *OGG_new_RW(SDL_RWops *src, int freesrc);\n\n/* Start playback of a given OGG stream */\nextern void OGG_play(OGG_music *music);\n\n/* Return non-zero if a stream is currently playing */\nextern int OGG_playing(OGG_music *music);\n\n/* Play some of a stream previously started with OGG_play() */\nextern int OGG_playAudio(OGG_music *music, Uint8 *stream, int len);\n\n/* Stop playback of a stream previously started with OGG_play() */\nextern void OGG_stop(OGG_music *music);\n\n/* Close the given OGG stream */\nextern void OGG_delete(OGG_music *music);\n\n/* Jump (seek) to a given position (time is in seconds) */\nextern void OGG_jump_to_time(OGG_music *music, double time);\n\n#endif /* OGG_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/include/wavestream.h",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id$ */\n\n/* This file supports streaming WAV files */\n\ntypedef struct {\n    SDL_bool active;\n    Uint32 start;\n    Uint32 stop;\n    Uint32 initial_play_count;\n    Uint32 current_play_count;\n} WAVLoopPoint;\n\ntypedef struct {\n    SDL_RWops *src;\n    SDL_bool freesrc;\n    SDL_AudioSpec spec;\n    Sint64 start;\n    Sint64 stop;\n    SDL_AudioCVT cvt;\n    int numloops;\n    WAVLoopPoint *loops;\n} WAVStream;\n\n/* Initialize the WAVStream player, with the given mixer settings\n   This function returns 0, or -1 if there was an error.\n */\nextern int WAVStream_Init(SDL_AudioSpec *mixer);\n\n/* Unimplemented */\nextern void WAVStream_SetVolume(int volume);\n\n/* Load a WAV stream from an SDL_RWops object */\nextern WAVStream *WAVStream_LoadSong_RW(SDL_RWops *src, int freesrc);\n\n/* Start playback of a given WAV stream */\nextern void WAVStream_Start(WAVStream *wave);\n\n/* Play some of a stream previously started with WAVStream_Start() */\nextern int WAVStream_PlaySome(Uint8 *stream, int len);\n\n/* Stop playback of a stream previously started with WAVStream_Start() */\nextern void WAVStream_Stop(void);\n\n/* Close the given WAV stream */\nextern void WAVStream_FreeSong(WAVStream *wave);\n\n/* Return non-zero if a stream is currently playing */\nextern int WAVStream_Active(void);\n"
  },
  {
    "path": "libs/SDL2_mixer/src/dynamic_flac.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  Implementation of the dynamic loading functionality for libFLAC.\n    ~ Austen Dicken (admin@cvpcs.org)\n*/\n\n#ifdef FLAC_MUSIC\n\n#include \"SDL_loadso.h\"\n#include \"SDL_mixer.h\"\n#include \"dynamic_flac.h\"\n\nflac_loader flac = {\n    0, NULL\n};\n\n#ifdef FLAC_DYNAMIC\nint Mix_InitFLAC()\n{\n    if ( flac.loaded == 0 ) {\n        flac.handle = SDL_LoadObject(FLAC_DYNAMIC);\n        if ( flac.handle == NULL ) {\n            return -1;\n        }\n        flac.FLAC__stream_decoder_new =\n            (FLAC__StreamDecoder *(*)())\n            SDL_LoadFunction(flac.handle, \"FLAC__stream_decoder_new\");\n        if ( flac.FLAC__stream_decoder_new == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n        flac.FLAC__stream_decoder_delete =\n            (void (*)(FLAC__StreamDecoder *))\n            SDL_LoadFunction(flac.handle, \"FLAC__stream_decoder_delete\");\n        if ( flac.FLAC__stream_decoder_delete == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n        flac.FLAC__stream_decoder_init_stream =\n            (FLAC__StreamDecoderInitStatus (*)(\n                        FLAC__StreamDecoder *,\n                        FLAC__StreamDecoderReadCallback,\n                        FLAC__StreamDecoderSeekCallback,\n                        FLAC__StreamDecoderTellCallback,\n                        FLAC__StreamDecoderLengthCallback,\n                        FLAC__StreamDecoderEofCallback,\n                        FLAC__StreamDecoderWriteCallback,\n                        FLAC__StreamDecoderMetadataCallback,\n                        FLAC__StreamDecoderErrorCallback,\n                        void *))\n            SDL_LoadFunction(flac.handle, \"FLAC__stream_decoder_init_stream\");\n        if ( flac.FLAC__stream_decoder_init_stream == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n        flac.FLAC__stream_decoder_finish =\n            (FLAC__bool (*)(FLAC__StreamDecoder *))\n            SDL_LoadFunction(flac.handle, \"FLAC__stream_decoder_finish\");\n        if ( flac.FLAC__stream_decoder_finish == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n        flac.FLAC__stream_decoder_flush =\n            (FLAC__bool (*)(FLAC__StreamDecoder *))\n            SDL_LoadFunction(flac.handle, \"FLAC__stream_decoder_flush\");\n        if ( flac.FLAC__stream_decoder_flush == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n        flac.FLAC__stream_decoder_process_single =\n            (FLAC__bool (*)(FLAC__StreamDecoder *))\n            SDL_LoadFunction(flac.handle,\n                        \"FLAC__stream_decoder_process_single\");\n        if ( flac.FLAC__stream_decoder_process_single == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n        flac.FLAC__stream_decoder_process_until_end_of_metadata =\n            (FLAC__bool (*)(FLAC__StreamDecoder *))\n            SDL_LoadFunction(flac.handle,\n                        \"FLAC__stream_decoder_process_until_end_of_metadata\");\n        if ( flac.FLAC__stream_decoder_process_until_end_of_metadata == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n        flac.FLAC__stream_decoder_process_until_end_of_stream =\n            (FLAC__bool (*)(FLAC__StreamDecoder *))\n            SDL_LoadFunction(flac.handle,\n                        \"FLAC__stream_decoder_process_until_end_of_stream\");\n        if ( flac.FLAC__stream_decoder_process_until_end_of_stream == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n        flac.FLAC__stream_decoder_seek_absolute =\n            (FLAC__bool (*)(FLAC__StreamDecoder *, FLAC__uint64))\n            SDL_LoadFunction(flac.handle, \"FLAC__stream_decoder_seek_absolute\");\n        if ( flac.FLAC__stream_decoder_seek_absolute == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n        flac.FLAC__stream_decoder_get_state =\n            (FLAC__StreamDecoderState (*)(const FLAC__StreamDecoder *decoder))\n            SDL_LoadFunction(flac.handle, \"FLAC__stream_decoder_get_state\");\n        if ( flac.FLAC__stream_decoder_get_state == NULL ) {\n            SDL_UnloadObject(flac.handle);\n            return -1;\n        }\n    }\n    ++flac.loaded;\n\n    return 0;\n}\nvoid Mix_QuitFLAC()\n{\n    if ( flac.loaded == 0 ) {\n        return;\n    }\n    if ( flac.loaded == 1 ) {\n        SDL_UnloadObject(flac.handle);\n    }\n    --flac.loaded;\n}\n#else\nint Mix_InitFLAC()\n{\n    if ( flac.loaded == 0 ) {\n#ifdef __MACOSX__\n        extern FLAC__StreamDecoder *FLAC__stream_decoder_new(void) __attribute__((weak_import));\n        if ( FLAC__stream_decoder_new == NULL )\n        {\n            /* Missing weakly linked framework */\n            Mix_SetError(\"Missing FLAC.framework\");\n            return -1;\n        }\n#endif // __MACOSX__\n\n        flac.FLAC__stream_decoder_new = FLAC__stream_decoder_new;\n        flac.FLAC__stream_decoder_delete = FLAC__stream_decoder_delete;\n        flac.FLAC__stream_decoder_init_stream =\n                            FLAC__stream_decoder_init_stream;\n        flac.FLAC__stream_decoder_finish = FLAC__stream_decoder_finish;\n        flac.FLAC__stream_decoder_flush = FLAC__stream_decoder_flush;\n        flac.FLAC__stream_decoder_process_single =\n                            FLAC__stream_decoder_process_single;\n        flac.FLAC__stream_decoder_process_until_end_of_metadata =\n                            FLAC__stream_decoder_process_until_end_of_metadata;\n        flac.FLAC__stream_decoder_process_until_end_of_stream =\n                            FLAC__stream_decoder_process_until_end_of_stream;\n        flac.FLAC__stream_decoder_seek_absolute =\n                            FLAC__stream_decoder_seek_absolute;\n        flac.FLAC__stream_decoder_get_state =\n                            FLAC__stream_decoder_get_state;\n    }\n    ++flac.loaded;\n\n    return 0;\n}\nvoid Mix_QuitFLAC()\n{\n    if ( flac.loaded == 0 ) {\n        return;\n    }\n    if ( flac.loaded == 1 ) {\n    }\n    --flac.loaded;\n}\n#endif /* FLAC_DYNAMIC */\n\n#endif /* FLAC_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/dynamic_fluidsynth.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  James Le Cuirot\n  chewi@aura-online.co.uk\n*/\n\n#ifdef USE_FLUIDSYNTH_MIDI\n\n#include \"SDL_loadso.h\"\n#include \"dynamic_fluidsynth.h\"\n\nfluidsynth_loader fluidsynth = {\n    0, NULL\n};\n\n#ifdef FLUIDSYNTH_DYNAMIC\n#define FLUIDSYNTH_LOADER(FUNC, SIG) \\\n    fluidsynth.FUNC = (SIG) SDL_LoadFunction(fluidsynth.handle, #FUNC); \\\n    if (fluidsynth.FUNC == NULL) { SDL_UnloadObject(fluidsynth.handle); return -1; }\n#else\n#define FLUIDSYNTH_LOADER(FUNC, SIG) \\\n    fluidsynth.FUNC = FUNC;\n#endif\n\nint Mix_InitFluidSynth()\n{\n    if ( fluidsynth.loaded == 0 ) {\n#ifdef FLUIDSYNTH_DYNAMIC\n        fluidsynth.handle = SDL_LoadObject(FLUIDSYNTH_DYNAMIC);\n        if ( fluidsynth.handle == NULL ) return -1;\n#endif\n\n        FLUIDSYNTH_LOADER(delete_fluid_player, int (*)(fluid_player_t*));\n        FLUIDSYNTH_LOADER(delete_fluid_settings, void (*)(fluid_settings_t*));\n        FLUIDSYNTH_LOADER(delete_fluid_synth, int (*)(fluid_synth_t*));\n        FLUIDSYNTH_LOADER(fluid_player_add, int (*)(fluid_player_t*, const char*));\n        FLUIDSYNTH_LOADER(fluid_player_add_mem, int (*)(fluid_player_t*, const void*, size_t));\n        FLUIDSYNTH_LOADER(fluid_player_get_status, int (*)(fluid_player_t*));\n        FLUIDSYNTH_LOADER(fluid_player_play, int (*)(fluid_player_t*));\n        FLUIDSYNTH_LOADER(fluid_player_set_loop, int (*)(fluid_player_t*, int));\n        FLUIDSYNTH_LOADER(fluid_player_stop, int (*)(fluid_player_t*));\n        FLUIDSYNTH_LOADER(fluid_settings_setnum, int (*)(fluid_settings_t*, const char*, double));\n        FLUIDSYNTH_LOADER(fluid_synth_get_settings, fluid_settings_t* (*)(fluid_synth_t*));\n        FLUIDSYNTH_LOADER(fluid_synth_set_gain, void (*)(fluid_synth_t*, float));\n        FLUIDSYNTH_LOADER(fluid_synth_sfload, int(*)(fluid_synth_t*, const char*, int));\n        FLUIDSYNTH_LOADER(fluid_synth_write_s16, int(*)(fluid_synth_t*, int, void*, int, int, void*, int, int));\n        FLUIDSYNTH_LOADER(new_fluid_player, fluid_player_t* (*)(fluid_synth_t*));\n        FLUIDSYNTH_LOADER(new_fluid_settings, fluid_settings_t* (*)(void));\n        FLUIDSYNTH_LOADER(new_fluid_synth, fluid_synth_t* (*)(fluid_settings_t*));\n    }\n    ++fluidsynth.loaded;\n\n    return 0;\n}\n\nvoid Mix_QuitFluidSynth()\n{\n    if ( fluidsynth.loaded == 0 ) {\n        return;\n    }\n    if ( fluidsynth.loaded == 1 ) {\n#ifdef FLUIDSYNTH_DYNAMIC\n        SDL_UnloadObject(fluidsynth.handle);\n#endif\n    }\n    --fluidsynth.loaded;\n}\n\n#endif /* USE_FLUIDSYNTH_MIDI */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/dynamic_mod.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MOD_MUSIC\n\n#include \"SDL_loadso.h\"\n#include \"SDL_mixer.h\"\n#include \"dynamic_mod.h\"\n\nmikmod_loader mikmod = {\n    0, NULL\n};\n\n#ifdef MOD_DYNAMIC\nint Mix_InitMOD()\n{\n    if ( mikmod.loaded == 0 ) {\n        mikmod.handle = SDL_LoadObject(MOD_DYNAMIC);\n        if ( mikmod.handle == NULL ) {\n            return -1;\n        }\n        mikmod.MikMod_Exit =\n            (void (*)(void))\n            SDL_LoadFunction(mikmod.handle, \"MikMod_Exit\");\n        if ( mikmod.MikMod_Exit == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.MikMod_InfoDriver =\n            (CHAR* (*)(void))\n            SDL_LoadFunction(mikmod.handle, \"MikMod_InfoDriver\");\n        if ( mikmod.MikMod_InfoDriver == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.MikMod_InfoLoader =\n            (CHAR* (*)(void))\n            SDL_LoadFunction(mikmod.handle, \"MikMod_InfoLoader\");\n        if ( mikmod.MikMod_InfoLoader == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.MikMod_Init =\n            (BOOL (*)(CHAR*))\n            SDL_LoadFunction(mikmod.handle, \"MikMod_Init\");\n        if ( mikmod.MikMod_Init == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.MikMod_RegisterAllLoaders =\n            (void (*)(void))\n            SDL_LoadFunction(mikmod.handle, \"MikMod_RegisterAllLoaders\");\n        if ( mikmod.MikMod_RegisterAllLoaders == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.MikMod_RegisterDriver =\n            (void (*)(struct MDRIVER*))\n            SDL_LoadFunction(mikmod.handle, \"MikMod_RegisterDriver\");\n        if ( mikmod.MikMod_RegisterDriver == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.MikMod_errno =\n            (int*)\n            SDL_LoadFunction(mikmod.handle, \"MikMod_errno\");\n        if ( mikmod.MikMod_errno == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.MikMod_strerror =\n            (char* (*)(int))\n            SDL_LoadFunction(mikmod.handle, \"MikMod_strerror\");\n        if ( mikmod.MikMod_strerror == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.MikMod_free =\n            (void (*)(void*))\n            SDL_LoadFunction(mikmod.handle, \"MikMod_free\");\n        if ( mikmod.MikMod_free == NULL ) {\n            /* libmikmod 3.1 and earlier doesn't have it */\n            mikmod.MikMod_free = free;\n        }\n        mikmod.Player_Active =\n            (BOOL (*)(void))\n            SDL_LoadFunction(mikmod.handle, \"Player_Active\");\n        if ( mikmod.Player_Active == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.Player_Free =\n            (void (*)(MODULE*))\n            SDL_LoadFunction(mikmod.handle, \"Player_Free\");\n        if ( mikmod.Player_Free == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.Player_LoadGeneric =\n            (MODULE* (*)(MREADER*,int,BOOL))\n            SDL_LoadFunction(mikmod.handle, \"Player_LoadGeneric\");\n        if ( mikmod.Player_LoadGeneric == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.Player_SetPosition =\n            (void (*)(UWORD))\n            SDL_LoadFunction(mikmod.handle, \"Player_SetPosition\");\n        if ( mikmod.Player_SetPosition == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.Player_SetVolume =\n            (void (*)(SWORD))\n            SDL_LoadFunction(mikmod.handle, \"Player_SetVolume\");\n        if ( mikmod.Player_SetVolume == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.Player_Start =\n            (void (*)(MODULE*))\n            SDL_LoadFunction(mikmod.handle, \"Player_Start\");\n        if ( mikmod.Player_Start == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.Player_Stop =\n            (void (*)(void))\n            SDL_LoadFunction(mikmod.handle, \"Player_Stop\");\n        if ( mikmod.Player_Stop == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.VC_WriteBytes =\n            (ULONG (*)(SBYTE*,ULONG))\n            SDL_LoadFunction(mikmod.handle, \"VC_WriteBytes\");\n        if ( mikmod.VC_WriteBytes == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.drv_nos =\n            (MDRIVER*)\n            SDL_LoadFunction(mikmod.handle, \"drv_nos\");\n        if ( mikmod.drv_nos == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.md_device =\n            (UWORD*)\n            SDL_LoadFunction(mikmod.handle, \"md_device\");\n        if ( mikmod.md_device == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.md_mixfreq =\n            (UWORD*)\n            SDL_LoadFunction(mikmod.handle, \"md_mixfreq\");\n        if ( mikmod.md_mixfreq == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.md_mode =\n            (UWORD*)\n            SDL_LoadFunction(mikmod.handle, \"md_mode\");\n        if ( mikmod.md_mode == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.md_musicvolume =\n            (UBYTE*)\n            SDL_LoadFunction(mikmod.handle, \"md_musicvolume\");\n        if ( mikmod.md_musicvolume == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.md_pansep =\n            (UBYTE*)\n            SDL_LoadFunction(mikmod.handle, \"md_pansep\");\n        if ( mikmod.md_pansep == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.md_reverb =\n            (UBYTE*)\n            SDL_LoadFunction(mikmod.handle, \"md_reverb\");\n        if ( mikmod.md_reverb == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.md_sndfxvolume =\n            (UBYTE*)\n            SDL_LoadFunction(mikmod.handle, \"md_sndfxvolume\");\n        if ( mikmod.md_sndfxvolume == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n        mikmod.md_volume =\n            (UBYTE*)\n            SDL_LoadFunction(mikmod.handle, \"md_volume\");\n        if ( mikmod.md_volume == NULL ) {\n            SDL_UnloadObject(mikmod.handle);\n            return -1;\n        }\n    }\n    ++mikmod.loaded;\n\n    return 0;\n}\nvoid Mix_QuitMOD()\n{\n    if ( mikmod.loaded == 0 ) {\n        return;\n    }\n    if ( mikmod.loaded == 1 ) {\n        SDL_UnloadObject(mikmod.handle);\n    }\n    --mikmod.loaded;\n}\n#else\nint Mix_InitMOD()\n{\n    if ( mikmod.loaded == 0 ) {\n#ifdef __MACOSX__\n        extern void Player_Start(MODULE*) __attribute__((weak_import));\n        if ( Player_Start == NULL )\n        {\n            /* Missing weakly linked framework */\n            Mix_SetError(\"Missing mikmod.framework\");\n            return -1;\n        }\n#endif // __MACOSX__\n\n        mikmod.MikMod_Exit = MikMod_Exit;\n        mikmod.MikMod_InfoDriver = MikMod_InfoDriver;\n        mikmod.MikMod_InfoLoader = MikMod_InfoLoader;\n        mikmod.MikMod_Init = MikMod_Init;\n        mikmod.MikMod_RegisterAllLoaders = MikMod_RegisterAllLoaders;\n        mikmod.MikMod_RegisterDriver = MikMod_RegisterDriver;\n        mikmod.MikMod_errno = &MikMod_errno;\n        mikmod.MikMod_strerror = MikMod_strerror;\n#if LIBMIKMOD_VERSION < ((3<<16)|(2<<8))\n        mikmod.MikMod_free = free;\n#else\n        mikmod.MikMod_free = MikMod_free;\n#endif\n        mikmod.Player_Active = Player_Active;\n        mikmod.Player_Free = Player_Free;\n        mikmod.Player_LoadGeneric = Player_LoadGeneric;\n        mikmod.Player_SetPosition = Player_SetPosition;\n        mikmod.Player_SetVolume = Player_SetVolume;\n        mikmod.Player_Start = Player_Start;\n        mikmod.Player_Stop = Player_Stop;\n        mikmod.VC_WriteBytes = VC_WriteBytes;\n        mikmod.drv_nos = &drv_nos;\n        mikmod.md_device = &md_device;\n        mikmod.md_mixfreq = &md_mixfreq;\n        mikmod.md_mode = &md_mode;\n        mikmod.md_musicvolume = &md_musicvolume;\n        mikmod.md_pansep = &md_pansep;\n        mikmod.md_reverb = &md_reverb;\n        mikmod.md_sndfxvolume = &md_sndfxvolume;\n        mikmod.md_volume = &md_volume;\n    }\n    ++mikmod.loaded;\n\n    return 0;\n}\nvoid Mix_QuitMOD()\n{\n    if ( mikmod.loaded == 0 ) {\n        return;\n    }\n    if ( mikmod.loaded == 1 ) {\n    }\n    --mikmod.loaded;\n}\n#endif /* MOD_DYNAMIC */\n\n#endif /* MOD_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/dynamic_modplug.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MODPLUG_MUSIC\n\n#include \"SDL_loadso.h\"\n#include \"SDL_mixer.h\"\n#include \"dynamic_modplug.h\"\n\nmodplug_loader modplug = {\n    0, NULL\n};\n\n#ifdef MODPLUG_DYNAMIC\nint Mix_InitModPlug()\n{\n    if ( modplug.loaded == 0 ) {\n        modplug.handle = SDL_LoadObject(MODPLUG_DYNAMIC);\n        if ( modplug.handle == NULL ) {\n            return -1;\n        }\n\n        modplug.ModPlug_Load =\n            (ModPlugFile* (*)(const void* data, int size))\n            SDL_LoadFunction(modplug.handle, \"ModPlug_Load\");\n\n        modplug.ModPlug_Unload =\n            (void (*)(ModPlugFile* file))\n            SDL_LoadFunction(modplug.handle, \"ModPlug_Unload\");\n\n        modplug.ModPlug_Read =\n            (int  (*)(ModPlugFile* file, void* buffer, int size))\n            SDL_LoadFunction(modplug.handle, \"ModPlug_Read\");\n\n        modplug.ModPlug_Seek =\n            (void (*)(ModPlugFile* file, int millisecond))\n            SDL_LoadFunction(modplug.handle, \"ModPlug_Seek\");\n\n        modplug.ModPlug_GetSettings =\n            (void (*)(ModPlug_Settings* settings))\n            SDL_LoadFunction(modplug.handle, \"ModPlug_GetSettings\");\n\n        modplug.ModPlug_SetSettings =\n            (void (*)(const ModPlug_Settings* settings))\n            SDL_LoadFunction(modplug.handle, \"ModPlug_SetSettings\");\n\n        modplug.ModPlug_SetMasterVolume =\n            (void (*)(ModPlugFile* file,unsigned int cvol))\n            SDL_LoadFunction(modplug.handle, \"ModPlug_SetMasterVolume\");\n    }\n    ++modplug.loaded;\n\n    return 0;\n}\n\nvoid Mix_QuitModPlug()\n{\n    if ( modplug.loaded == 0 ) {\n        return;\n    }\n    if ( modplug.loaded == 1 ) {\n        SDL_UnloadObject(modplug.handle);\n    }\n    --modplug.loaded;\n}\n#else\nint Mix_InitModPlug()\n{\n    if ( modplug.loaded == 0 ) {\n#ifdef __MACOSX__\n        extern ModPlugFile* ModPlug_Load(const void* data, int size) __attribute__((weak_import));\n        if ( ModPlug_Load == NULL )\n        {\n            /* Missing weakly linked framework */\n            Mix_SetError(\"Missing modplug.framework\");\n            return -1;\n        }\n#endif // __MACOSX__\n\n        modplug.ModPlug_Load = ModPlug_Load;\n        modplug.ModPlug_Unload = ModPlug_Unload;\n        modplug.ModPlug_Read = ModPlug_Read;\n        modplug.ModPlug_Seek = ModPlug_Seek;\n        modplug.ModPlug_GetSettings = ModPlug_GetSettings;\n        modplug.ModPlug_SetSettings = ModPlug_SetSettings;\n        modplug.ModPlug_SetMasterVolume = ModPlug_SetMasterVolume;\n    }\n    ++modplug.loaded;\n\n    return 0;\n}\nvoid Mix_QuitModPlug()\n{\n    if ( modplug.loaded == 0 ) {\n        return;\n    }\n    if ( modplug.loaded == 1 ) {\n    }\n    --modplug.loaded;\n}\n#endif /* MODPLUG_DYNAMIC */\n\n#endif /* MODPLUG_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/dynamic_mp3.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MP3_MUSIC\n\n#include \"SDL_loadso.h\"\n#include \"SDL_mixer.h\"\n#include \"dynamic_mp3.h\"\n\nsmpeg_loader smpeg = {\n    0, NULL\n};\n\n#ifdef MP3_DYNAMIC\nint Mix_InitMP3()\n{\n    if ( smpeg.loaded == 0 ) {\n        smpeg.handle = SDL_LoadObject(MP3_DYNAMIC);\n        if ( smpeg.handle == NULL ) {\n            return -1;\n        }\n        smpeg.SMPEG_actualSpec =\n            (void (*)( SMPEG *, SDL_AudioSpec * ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_actualSpec\");\n        if ( smpeg.SMPEG_actualSpec == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_delete =\n            (void (*)( SMPEG* ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_delete\");\n        if ( smpeg.SMPEG_delete == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_enableaudio =\n            (void (*)( SMPEG*, int ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_enableaudio\");\n        if ( smpeg.SMPEG_enableaudio == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_enablevideo =\n            (void (*)( SMPEG*, int ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_enablevideo\");\n        if ( smpeg.SMPEG_enablevideo == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_new_rwops =\n            (SMPEG* (*)(SDL_RWops *, SMPEG_Info*, int, int))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_new_rwops\");\n        if ( smpeg.SMPEG_new_rwops == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_play =\n            (void (*)( SMPEG* ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_play\");\n        if ( smpeg.SMPEG_play == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_playAudio =\n            (int (*)( SMPEG *, Uint8 *, int ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_playAudio\");\n        if ( smpeg.SMPEG_playAudio == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_rewind =\n            (void (*)( SMPEG* ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_rewind\");\n        if ( smpeg.SMPEG_rewind == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_setvolume =\n            (void (*)( SMPEG*, int ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_setvolume\");\n        if ( smpeg.SMPEG_setvolume == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_skip =\n            (void (*)( SMPEG*, float ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_skip\");\n        if ( smpeg.SMPEG_skip == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_status =\n            (SMPEGstatus (*)( SMPEG* ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_status\");\n        if ( smpeg.SMPEG_status == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n        smpeg.SMPEG_stop =\n            (void (*)( SMPEG* ))\n            SDL_LoadFunction(smpeg.handle, \"SMPEG_stop\");\n        if ( smpeg.SMPEG_stop == NULL ) {\n            SDL_UnloadObject(smpeg.handle);\n            return -1;\n        }\n    }\n    ++smpeg.loaded;\n\n    return 0;\n}\nvoid Mix_QuitMP3()\n{\n    if ( smpeg.loaded == 0 ) {\n        return;\n    }\n    if ( smpeg.loaded == 1 ) {\n        SDL_UnloadObject(smpeg.handle);\n    }\n    --smpeg.loaded;\n}\n#else\nint Mix_InitMP3()\n{\n    if ( smpeg.loaded == 0 ) {\n#ifdef __MACOSX__\n        extern SMPEG* SMPEG_new_rwops(SDL_RWops*, SMPEG_Info*, int, int) __attribute__((weak_import));\n        if ( SMPEG_new_rwops == NULL )\n        {\n            /* Missing weakly linked framework */\n            Mix_SetError(\"Missing smpeg2.framework\");\n            return -1;\n        }\n#endif // __MACOSX__\n\n        smpeg.SMPEG_actualSpec = SMPEG_actualSpec;\n        smpeg.SMPEG_delete = SMPEG_delete;\n        smpeg.SMPEG_enableaudio = SMPEG_enableaudio;\n        smpeg.SMPEG_enablevideo = SMPEG_enablevideo;\n        smpeg.SMPEG_new_rwops = SMPEG_new_rwops;\n        smpeg.SMPEG_play = SMPEG_play;\n        smpeg.SMPEG_playAudio = SMPEG_playAudio;\n        smpeg.SMPEG_rewind = SMPEG_rewind;\n        smpeg.SMPEG_setvolume = SMPEG_setvolume;\n        smpeg.SMPEG_skip = SMPEG_skip;\n        smpeg.SMPEG_status = SMPEG_status;\n        smpeg.SMPEG_stop = SMPEG_stop;\n    }\n    ++smpeg.loaded;\n\n    return 0;\n}\nvoid Mix_QuitMP3()\n{\n    if ( smpeg.loaded == 0 ) {\n        return;\n    }\n    if ( smpeg.loaded == 1 ) {\n    }\n    --smpeg.loaded;\n}\n#endif /* MP3_DYNAMIC */\n\n#endif /* MP3_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/dynamic_ogg.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef OGG_MUSIC\n\n#include \"SDL_loadso.h\"\n#include \"SDL_mixer.h\"\n#include \"dynamic_ogg.h\"\n\nvorbis_loader vorbis = {\n    0, NULL\n};\n\n#ifdef OGG_DYNAMIC\nint Mix_InitOgg()\n{\n    if ( vorbis.loaded == 0 ) {\n        vorbis.handle = SDL_LoadObject(OGG_DYNAMIC);\n        if ( vorbis.handle == NULL ) {\n            return -1;\n        }\n        vorbis.ov_clear =\n            (int (*)(OggVorbis_File *))\n            SDL_LoadFunction(vorbis.handle, \"ov_clear\");\n        if ( vorbis.ov_clear == NULL ) {\n            SDL_UnloadObject(vorbis.handle);\n            return -1;\n        }\n        vorbis.ov_info =\n            (vorbis_info *(*)(OggVorbis_File *,int))\n            SDL_LoadFunction(vorbis.handle, \"ov_info\");\n        if ( vorbis.ov_info == NULL ) {\n            SDL_UnloadObject(vorbis.handle);\n            return -1;\n        }\n        vorbis.ov_open_callbacks =\n            (int (*)(void *, OggVorbis_File *, const char *, long, ov_callbacks))\n            SDL_LoadFunction(vorbis.handle, \"ov_open_callbacks\");\n        if ( vorbis.ov_open_callbacks == NULL ) {\n            SDL_UnloadObject(vorbis.handle);\n            return -1;\n        }\n        vorbis.ov_pcm_total =\n            (ogg_int64_t (*)(OggVorbis_File *,int))\n            SDL_LoadFunction(vorbis.handle, \"ov_pcm_total\");\n        if ( vorbis.ov_pcm_total == NULL ) {\n            SDL_UnloadObject(vorbis.handle);\n            return -1;\n        }\n        vorbis.ov_read =\n#ifdef OGG_USE_TREMOR\n            (long (*)(OggVorbis_File *,char *,int,int *))\n#else\n            (long (*)(OggVorbis_File *,char *,int,int,int,int,int *))\n#endif\n            SDL_LoadFunction(vorbis.handle, \"ov_read\");\n        if ( vorbis.ov_read == NULL ) {\n            SDL_UnloadObject(vorbis.handle);\n            return -1;\n        }\n        vorbis.ov_time_seek =\n#ifdef OGG_USE_TREMOR\n            (long (*)(OggVorbis_File *,ogg_int64_t))\n#else\n            (int (*)(OggVorbis_File *,double))\n#endif\n            SDL_LoadFunction(vorbis.handle, \"ov_time_seek\");\n        if ( vorbis.ov_time_seek == NULL ) {\n            SDL_UnloadObject(vorbis.handle);\n            return -1;\n        }\n    }\n    ++vorbis.loaded;\n\n    return 0;\n}\nvoid Mix_QuitOgg()\n{\n    if ( vorbis.loaded == 0 ) {\n        return;\n    }\n    if ( vorbis.loaded == 1 ) {\n        SDL_UnloadObject(vorbis.handle);\n    }\n    --vorbis.loaded;\n}\n#else\nint Mix_InitOgg()\n{\n    if ( vorbis.loaded == 0 ) {\n#ifdef __MACOSX__\n        extern int ov_open_callbacks(void*, OggVorbis_File*, const char*, long, ov_callbacks) __attribute__((weak_import));\n        if ( ov_open_callbacks == NULL )\n        {\n            /* Missing weakly linked framework */\n            Mix_SetError(\"Missing Vorbis.framework\");\n            return -1;\n        }\n#endif // __MACOSX__\n\n        vorbis.ov_clear = ov_clear;\n        vorbis.ov_info = ov_info;\n        vorbis.ov_open_callbacks = ov_open_callbacks;\n        vorbis.ov_pcm_total = ov_pcm_total;\n        vorbis.ov_read = ov_read;\n        vorbis.ov_time_seek = ov_time_seek;\n    }\n    ++vorbis.loaded;\n\n    return 0;\n}\nvoid Mix_QuitOgg()\n{\n    if ( vorbis.loaded == 0 ) {\n        return;\n    }\n    if ( vorbis.loaded == 1 ) {\n    }\n    --vorbis.loaded;\n}\n#endif /* OGG_DYNAMIC */\n\n#endif /* OGG_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/effect_position.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This file by Ryan C. Gordon (icculus@icculus.org)\n\n  These are some internally supported special effects that use SDL_mixer's\n  effect callback API. They are meant for speed over quality.  :)\n*/\n\n/* $Id$ */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL.h\"\n#include \"SDL_mixer.h\"\n#include \"SDL_endian.h\"\n\n#define __MIX_INTERNAL_EFFECT__\n#include \"effects_internal.h\"\n\n/* profile code:\n    #include <sys/time.h>\n    #include <unistd.h>\n    struct timeval tv1;\n    struct timeval tv2;\n\n    gettimeofday(&tv1, NULL);\n\n        ... do your thing here ...\n\n    gettimeofday(&tv2, NULL);\n    printf(\"%ld\\n\", tv2.tv_usec - tv1.tv_usec);\n*/\n\n\n/*\n * Positional effects...panning, distance attenuation, etc.\n */\n\ntypedef struct _Eff_positionargs\n{\n    volatile float left_f;\n    volatile float right_f;\n    volatile Uint8 left_u8;\n    volatile Uint8 right_u8;\n    volatile float left_rear_f;\n    volatile float right_rear_f;\n    volatile float center_f;\n    volatile float lfe_f;\n    volatile Uint8 left_rear_u8;\n    volatile Uint8 right_rear_u8;\n    volatile Uint8 center_u8;\n    volatile Uint8 lfe_u8;\n    volatile float distance_f;\n    volatile Uint8 distance_u8;\n    volatile Sint16 room_angle;\n    volatile int in_use;\n    volatile int channels;\n} position_args;\n\nstatic position_args **pos_args_array = NULL;\nstatic position_args *pos_args_global = NULL;\nstatic int position_channels = 0;\n\nvoid _Eff_PositionDeinit(void)\n{\n    int i;\n    for (i = 0; i < position_channels; i++) {\n        SDL_free(pos_args_array[i]);\n    }\n\n    position_channels = 0;\n\n    SDL_free(pos_args_global);\n    pos_args_global = NULL;\n    SDL_free(pos_args_array);\n    pos_args_array = NULL;\n}\n\n\n/* This just frees up the callback-specific data. */\nstatic void _Eff_PositionDone(int channel, void *udata)\n{\n    if (channel < 0) {\n        if (pos_args_global != NULL) {\n            SDL_free(pos_args_global);\n            pos_args_global = NULL;\n        }\n    }\n\n    else if (pos_args_array[channel] != NULL) {\n        SDL_free(pos_args_array[channel]);\n        pos_args_array[channel] = NULL;\n    }\n}\n\n\nstatic void _Eff_position_u8(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint8 *ptr = (Uint8 *) stream;\n    int i;\n\n        /*\n         * if there's only a mono channnel (the only way we wouldn't have\n         *  a len divisible by 2 here), then left_f and right_f are always\n         *  1.0, and are therefore throwaways.\n         */\n    if (len % sizeof (Uint16) != 0) {\n        *ptr = (Uint8) (((float) *ptr) * args->distance_f);\n        ptr++;\n        len--;\n    }\n\n    if (args->room_angle == 180)\n    for (i = 0; i < len; i += sizeof (Uint8) * 2) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n    }\n    else for (i = 0; i < len; i += sizeof (Uint8) * 2) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n    }\n}\nstatic void _Eff_position_u8_c4(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint8 *ptr = (Uint8 *) stream;\n    int i;\n\n        /*\n         * if there's only a mono channnel (the only way we wouldn't have\n         *  a len divisible by 2 here), then left_f and right_f are always\n         *  1.0, and are therefore throwaways.\n         */\n    if (len % sizeof (Uint16) != 0) {\n        *ptr = (Uint8) (((float) *ptr) * args->distance_f);\n        ptr++;\n        len--;\n    }\n\n    if (args->room_angle == 0)\n    for (i = 0; i < len; i += sizeof (Uint8) * 6) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f) + 128);\n        ptr++;\n    }\n    else if (args->room_angle == 90)\n    for (i = 0; i < len; i += sizeof (Uint8) * 6) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f) + 128);\n        ptr++;\n    }\n    else if (args->room_angle == 180)\n    for (i = 0; i < len; i += sizeof (Uint8) * 6) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n    }\n    else if (args->room_angle == 270)\n    for (i = 0; i < len; i += sizeof (Uint8) * 6) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n    }\n}\n\n\nstatic void _Eff_position_u8_c6(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint8 *ptr = (Uint8 *) stream;\n    int i;\n\n        /*\n         * if there's only a mono channnel (the only way we wouldn't have\n         *  a len divisible by 2 here), then left_f and right_f are always\n         *  1.0, and are therefore throwaways.\n         */\n    if (len % sizeof (Uint16) != 0) {\n        *ptr = (Uint8) (((float) *ptr) * args->distance_f);\n        ptr++;\n        len--;\n    }\n\n    if (args->room_angle == 0)\n    for (i = 0; i < len; i += sizeof (Uint8) * 6) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->center_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->lfe_f) * args->distance_f) + 128);\n        ptr++;\n    }\n    else if (args->room_angle == 90)\n    for (i = 0; i < len; i += sizeof (Uint8) * 6) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f/2) + 128)\n            + (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f/2) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->lfe_f) * args->distance_f) + 128);\n        ptr++;\n    }\n    else if (args->room_angle == 180)\n    for (i = 0; i < len; i += sizeof (Uint8) * 6) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f/2) + 128)\n            + (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f/2) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->lfe_f) * args->distance_f) + 128);\n        ptr++;\n    }\n    else if (args->room_angle == 270)\n    for (i = 0; i < len; i += sizeof (Uint8) * 6) {\n        /* must adjust the sample so that 0 is the center */\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_rear_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->right_f) * args->distance_f) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_f) * args->distance_f/2) + 128)\n            + (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->left_rear_f) * args->distance_f/2) + 128);\n        ptr++;\n        *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))\n            * args->lfe_f) * args->distance_f) + 128);\n        ptr++;\n    }\n}\n\n\n/*\n * This one runs about 10.1 times faster than the non-table version, with\n *  no loss in quality. It does, however, require 64k of memory for the\n *  lookup table. Also, this will only update position information once per\n *  call; the non-table version always checks the arguments for each sample,\n *  in case the user has called Mix_SetPanning() or whatnot again while this\n *  callback is running.\n */\nstatic void _Eff_position_table_u8(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint8 *ptr = (Uint8 *) stream;\n    Uint32 *p;\n    int i;\n    Uint8 *l = ((Uint8 *) _Eff_volume_table) + (256 * args->left_u8);\n    Uint8 *r = ((Uint8 *) _Eff_volume_table) + (256 * args->right_u8);\n    Uint8 *d = ((Uint8 *) _Eff_volume_table) + (256 * args->distance_u8);\n\n    if (args->room_angle == 180) {\n        Uint8 *temp = l;\n        l = r;\n        r = temp;\n    }\n        /*\n         * if there's only a mono channnel, then l[] and r[] are always\n         *  volume 255, and are therefore throwaways. Still, we have to\n         *  be sure not to overrun the audio buffer...\n         */\n    while (len % sizeof (Uint32) != 0) {\n        *ptr = d[l[*ptr]];\n        ptr++;\n        if (args->channels > 1) {\n            *ptr = d[r[*ptr]];\n            ptr++;\n        }\n        len -= args->channels;\n    }\n\n    p = (Uint32 *) ptr;\n\n    for (i = 0; i < len; i += sizeof (Uint32)) {\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n        *p = (d[l[(*p & 0xFF000000) >> 24]] << 24) |\n             (d[r[(*p & 0x00FF0000) >> 16]] << 16) |\n             (d[l[(*p & 0x0000FF00) >>  8]] <<  8) |\n             (d[r[(*p & 0x000000FF)      ]]      ) ;\n#else\n        *p = (d[r[(*p & 0xFF000000) >> 24]] << 24) |\n             (d[l[(*p & 0x00FF0000) >> 16]] << 16) |\n             (d[r[(*p & 0x0000FF00) >>  8]] <<  8) |\n             (d[l[(*p & 0x000000FF)      ]]      ) ;\n#endif\n        ++p;\n    }\n}\n\n\nstatic void _Eff_position_s8(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint8 *ptr = (Sint8 *) stream;\n    int i;\n\n        /*\n         * if there's only a mono channnel (the only way we wouldn't have\n         *  a len divisible by 2 here), then left_f and right_f are always\n         *  1.0, and are therefore throwaways.\n         */\n    if (len % sizeof (Sint16) != 0) {\n        *ptr = (Sint8) (((float) *ptr) * args->distance_f);\n        ptr++;\n        len--;\n    }\n\n    if (args->room_angle == 180)\n    for (i = 0; i < len; i += sizeof (Sint8) * 2) {\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f);\n        ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f);\n        ptr++;\n    }\n    else\n    for (i = 0; i < len; i += sizeof (Sint8) * 2) {\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f);\n        ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f);\n        ptr++;\n    }\n}\nstatic void _Eff_position_s8_c4(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint8 *ptr = (Sint8 *) stream;\n    int i;\n\n        /*\n         * if there's only a mono channnel (the only way we wouldn't have\n         *  a len divisible by 2 here), then left_f and right_f are always\n         *  1.0, and are therefore throwaways.\n         */\n    if (len % sizeof (Sint16) != 0) {\n        *ptr = (Sint8) (((float) *ptr) * args->distance_f);\n        ptr++;\n        len--;\n    }\n\n    for (i = 0; i < len; i += sizeof (Sint8) * 4) {\n      switch (args->room_angle) {\n       case 0:\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;\n    break;\n       case 90:\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;\n    break;\n       case 180:\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;\n    break;\n       case 270:\n        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;\n    break;\n      }\n    }\n}\nstatic void _Eff_position_s8_c6(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint8 *ptr = (Sint8 *) stream;\n    int i;\n\n        /*\n         * if there's only a mono channnel (the only way we wouldn't have\n         *  a len divisible by 2 here), then left_f and right_f are always\n         *  1.0, and are therefore throwaways.\n         */\n    if (len % sizeof (Sint16) != 0) {\n        *ptr = (Sint8) (((float) *ptr) * args->distance_f);\n        ptr++;\n        len--;\n    }\n\n    for (i = 0; i < len; i += sizeof (Sint8) * 6) {\n      switch (args->room_angle) {\n       case 0:\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->center_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;\n    break;\n       case 90:\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f / 2)\n           + (Sint8)((((float) *ptr) * args->right_f) * args->distance_f / 2); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;\n    break;\n       case 180:\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f / 2)\n           + (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f / 2); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;\n    break;\n       case 270:\n        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f / 2)\n           + (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f / 2); ptr++;\n        *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;\n    break;\n      }\n    }\n}\n\n\n/*\n * This one runs about 10.1 times faster than the non-table version, with\n *  no loss in quality. It does, however, require 64k of memory for the\n *  lookup table. Also, this will only update position information once per\n *  call; the non-table version always checks the arguments for each sample,\n *  in case the user has called Mix_SetPanning() or whatnot again while this\n *  callback is running.\n */\nstatic void _Eff_position_table_s8(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint8 *ptr = (Sint8 *) stream;\n    Uint32 *p;\n    int i;\n    Sint8 *l = ((Sint8 *) _Eff_volume_table) + (256 * args->left_u8);\n    Sint8 *r = ((Sint8 *) _Eff_volume_table) + (256 * args->right_u8);\n    Sint8 *d = ((Sint8 *) _Eff_volume_table) + (256 * args->distance_u8);\n\n    if (args->room_angle == 180) {\n        Sint8 *temp = l;\n        l = r;\n        r = temp;\n    }\n\n\n    while (len % sizeof (Uint32) != 0) {\n        *ptr = d[l[*ptr]];\n        ptr++;\n        if (args->channels > 1) {\n            *ptr = d[r[*ptr]];\n            ptr++;\n        }\n        len -= args->channels;\n    }\n\n    p = (Uint32 *) ptr;\n\n    for (i = 0; i < len; i += sizeof (Uint32)) {\n#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n        *p = (d[l[((Sint16)(Sint8)((*p & 0xFF000000) >> 24))+128]] << 24) |\n             (d[r[((Sint16)(Sint8)((*p & 0x00FF0000) >> 16))+128]] << 16) |\n             (d[l[((Sint16)(Sint8)((*p & 0x0000FF00) >>  8))+128]] <<  8) |\n             (d[r[((Sint16)(Sint8)((*p & 0x000000FF)      ))+128]]      ) ;\n#else\n        *p = (d[r[((Sint16)(Sint8)((*p & 0xFF000000) >> 24))+128]] << 24) |\n             (d[l[((Sint16)(Sint8)((*p & 0x00FF0000) >> 16))+128]] << 16) |\n             (d[r[((Sint16)(Sint8)((*p & 0x0000FF00) >>  8))+128]] <<  8) |\n             (d[l[((Sint16)(Sint8)((*p & 0x000000FF)      ))+128]]      ) ;\n#endif\n        ++p;\n    }\n\n\n}\n\n\n/* !!! FIXME : Optimize the code for 16-bit samples? */\n\nstatic void _Eff_position_u16lsb(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint16 *ptr = (Uint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Uint16) * 2) {\n        Sint16 sampl = (Sint16) (SDL_SwapLE16(*(ptr+0)) - 32768);\n        Sint16 sampr = (Sint16) (SDL_SwapLE16(*(ptr+1)) - 32768);\n\n        Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)\n                                    * args->distance_f) + 32768);\n\n    if (args->room_angle == 180) {\n            *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n            *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n    }\n    else {\n            *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n            *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n    }\n    }\n}\nstatic void _Eff_position_u16lsb_c4(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint16 *ptr = (Uint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Uint16) * 4) {\n        Sint16 sampl = (Sint16) (SDL_SwapLE16(*(ptr+0)) - 32768);\n        Sint16 sampr = (Sint16) (SDL_SwapLE16(*(ptr+1)) - 32768);\n        Sint16 samplr = (Sint16) (SDL_SwapLE16(*(ptr+2)) - 32768);\n        Sint16 samprr = (Sint16) (SDL_SwapLE16(*(ptr+3)) - 32768);\n\n        Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_rear_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_rear_f)\n                                    * args->distance_f) + 32768);\n\n    switch (args->room_angle) {\n        case 0:\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);\n            break;\n        case 90:\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);\n            break;\n        case 180:\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n            break;\n        case 270:\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n            break;\n    }\n    }\n}\nstatic void _Eff_position_u16lsb_c6(int chan, void *stream, int len, void *udata)\n{\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint16 *ptr = (Uint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Uint16) * 6) {\n        Sint16 sampl = (Sint16) (SDL_SwapLE16(*(ptr+0)) - 32768);\n        Sint16 sampr = (Sint16) (SDL_SwapLE16(*(ptr+1)) - 32768);\n        Sint16 samplr = (Sint16) (SDL_SwapLE16(*(ptr+2)) - 32768);\n        Sint16 samprr = (Sint16) (SDL_SwapLE16(*(ptr+3)) - 32768);\n        Sint16 sampce = (Sint16) (SDL_SwapLE16(*(ptr+4)) - 32768);\n        Sint16 sampwf = (Sint16) (SDL_SwapLE16(*(ptr+5)) - 32768);\n\n        Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_rear_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_rear_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapce = (Uint16) ((Sint16) (((float) sampce * args->center_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapwf = (Uint16) ((Sint16) (((float) sampwf * args->lfe_f)\n                                    * args->distance_f) + 32768);\n\n    switch (args->room_angle) {\n        case 0:\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapce);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapwf);\n            break;\n        case 90:\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapr)/2 + (Uint16) SDL_SwapLE16(swaprr)/2;\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapwf);\n            break;\n        case 180:\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaprr)/2 + (Uint16) SDL_SwapLE16(swaplr)/2;\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapwf);\n            break;\n        case 270:\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapl)/2 + (Uint16) SDL_SwapLE16(swaplr)/2;\n                *(ptr++) = (Uint16) SDL_SwapLE16(swapwf);\n            break;\n    }\n    }\n}\n\nstatic void _Eff_position_s16lsb(int chan, void *stream, int len, void *udata)\n{\n    /* 16 signed bits (lsb) * 2 channels. */\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint16 *ptr = (Sint16 *) stream;\n    int i;\n\n#if 0\n    if (len % (sizeof(Sint16) * 2)) {\n        fprintf(stderr,\"Not an even number of frames! len=%d\\n\", len);\n        return;\n    }\n#endif\n\n    for (i = 0; i < len; i += sizeof (Sint16) * 2) {\n        Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+0))) *\n                                    args->left_f) * args->distance_f);\n        Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *\n                                    args->right_f) * args->distance_f);\n    if (args->room_angle == 180) {\n            *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n            *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n    }\n    else {\n            *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n            *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n    }\n    }\n}\nstatic void _Eff_position_s16lsb_c4(int chan, void *stream, int len, void *udata)\n{\n    /* 16 signed bits (lsb) * 4 channels. */\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint16 *ptr = (Sint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Sint16) * 4) {\n        Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+0))) *\n                                    args->left_f) * args->distance_f);\n        Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *\n                                    args->right_f) * args->distance_f);\n        Sint16 swaplr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *\n                                    args->left_rear_f) * args->distance_f);\n        Sint16 swaprr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+2))) *\n                                    args->right_rear_f) * args->distance_f);\n    switch (args->room_angle) {\n        case 0:\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);\n            break;\n        case 90:\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);\n            break;\n        case 180:\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n            break;\n        case 270:\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n            break;\n    }\n    }\n}\n\nstatic void _Eff_position_s16lsb_c6(int chan, void *stream, int len, void *udata)\n{\n    /* 16 signed bits (lsb) * 6 channels. */\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint16 *ptr = (Sint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Sint16) * 6) {\n        Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+0))) *\n                                    args->left_f) * args->distance_f);\n        Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *\n                                    args->right_f) * args->distance_f);\n        Sint16 swaplr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+2))) *\n                                    args->left_rear_f) * args->distance_f);\n        Sint16 swaprr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+3))) *\n                                    args->right_rear_f) * args->distance_f);\n        Sint16 swapce = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+4))) *\n                                    args->center_f) * args->distance_f);\n        Sint16 swapwf = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+5))) *\n                                    args->lfe_f) * args->distance_f);\n    switch (args->room_angle) {\n        case 0:\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapce);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapwf);\n            break;\n        case 90:\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapr)/2 + (Sint16) SDL_SwapLE16(swaprr)/2;\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapwf);\n            break;\n        case 180:\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaprr)/2 + (Sint16) SDL_SwapLE16(swaplr)/2;\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapwf);\n            break;\n        case 270:\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapl)/2 + (Sint16) SDL_SwapLE16(swaplr)/2;\n                *(ptr++) = (Sint16) SDL_SwapLE16(swapwf);\n            break;\n    }\n    }\n}\n\nstatic void _Eff_position_u16msb(int chan, void *stream, int len, void *udata)\n{\n    /* 16 signed bits (lsb) * 2 channels. */\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint16 *ptr = (Uint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Sint16) * 2) {\n        Sint16 sampl = (Sint16) (SDL_SwapBE16(*(ptr+0)) - 32768);\n        Sint16 sampr = (Sint16) (SDL_SwapBE16(*(ptr+1)) - 32768);\n\n        Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)\n                                    * args->distance_f) + 32768);\n\n    if (args->room_angle == 180) {\n            *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n            *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n    }\n    else {\n            *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n            *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n    }\n    }\n}\nstatic void _Eff_position_u16msb_c4(int chan, void *stream, int len, void *udata)\n{\n    /* 16 signed bits (lsb) * 4 channels. */\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint16 *ptr = (Uint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Sint16) * 4) {\n        Sint16 sampl = (Sint16) (SDL_SwapBE16(*(ptr+0)) - 32768);\n        Sint16 sampr = (Sint16) (SDL_SwapBE16(*(ptr+1)) - 32768);\n        Sint16 samplr = (Sint16) (SDL_SwapBE16(*(ptr+2)) - 32768);\n        Sint16 samprr = (Sint16) (SDL_SwapBE16(*(ptr+3)) - 32768);\n\n        Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_rear_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_rear_f)\n                                    * args->distance_f) + 32768);\n\n    switch (args->room_angle) {\n        case 0:\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);\n            break;\n        case 90:\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);\n            break;\n        case 180:\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n            break;\n        case 270:\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n            break;\n    }\n    }\n}\nstatic void _Eff_position_u16msb_c6(int chan, void *stream, int len, void *udata)\n{\n    /* 16 signed bits (lsb) * 6 channels. */\n    volatile position_args *args = (volatile position_args *) udata;\n    Uint16 *ptr = (Uint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Sint16) * 6) {\n        Sint16 sampl = (Sint16) (SDL_SwapBE16(*(ptr+0)) - 32768);\n        Sint16 sampr = (Sint16) (SDL_SwapBE16(*(ptr+1)) - 32768);\n        Sint16 samplr = (Sint16) (SDL_SwapBE16(*(ptr+2)) - 32768);\n        Sint16 samprr = (Sint16) (SDL_SwapBE16(*(ptr+3)) - 32768);\n        Sint16 sampce = (Sint16) (SDL_SwapBE16(*(ptr+4)) - 32768);\n        Sint16 sampwf = (Sint16) (SDL_SwapBE16(*(ptr+5)) - 32768);\n\n        Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_rear_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_rear_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapce = (Uint16) ((Sint16) (((float) sampce * args->center_f)\n                                    * args->distance_f) + 32768);\n        Uint16 swapwf = (Uint16) ((Sint16) (((float) sampwf * args->lfe_f)\n                                    * args->distance_f) + 32768);\n\n    switch (args->room_angle) {\n        case 0:\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapce);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapwf);\n            break;\n        case 90:\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapr)/2 + (Uint16) SDL_SwapBE16(swaprr)/2;\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapwf);\n            break;\n        case 180:\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaprr)/2 + (Uint16) SDL_SwapBE16(swaplr)/2;\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapwf);\n            break;\n        case 270:\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapl)/2 + (Uint16) SDL_SwapBE16(swaplr)/2;\n                *(ptr++) = (Uint16) SDL_SwapBE16(swapwf);\n            break;\n    }\n    }\n}\n\nstatic void _Eff_position_s16msb(int chan, void *stream, int len, void *udata)\n{\n    /* 16 signed bits (lsb) * 2 channels. */\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint16 *ptr = (Sint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Sint16) * 2) {\n        Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+0))) *\n                                    args->left_f) * args->distance_f);\n        Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+1))) *\n                                    args->right_f) * args->distance_f);\n        *(ptr++) = (Sint16) SDL_SwapBE16(swapl);\n        *(ptr++) = (Sint16) SDL_SwapBE16(swapr);\n    }\n}\nstatic void _Eff_position_s16msb_c4(int chan, void *stream, int len, void *udata)\n{\n    /* 16 signed bits (lsb) * 4 channels. */\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint16 *ptr = (Sint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Sint16) * 4) {\n        Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+0))) *\n                                    args->left_f) * args->distance_f);\n        Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+1))) *\n                                    args->right_f) * args->distance_f);\n        Sint16 swaplr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+2))) *\n                                    args->left_rear_f) * args->distance_f);\n        Sint16 swaprr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+3))) *\n                                    args->right_rear_f) * args->distance_f);\n    switch (args->room_angle) {\n        case 0:\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);\n            break;\n        case 90:\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);\n            break;\n        case 180:\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapl);\n            break;\n        case 270:\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapr);\n            break;\n    }\n    }\n}\nstatic void _Eff_position_s16msb_c6(int chan, void *stream, int len, void *udata)\n{\n    /* 16 signed bits (lsb) * 6 channels. */\n    volatile position_args *args = (volatile position_args *) udata;\n    Sint16 *ptr = (Sint16 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Sint16) * 6) {\n        Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+0))) *\n                                    args->left_f) * args->distance_f);\n        Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+1))) *\n                                    args->right_f) * args->distance_f);\n        Sint16 swaplr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+2))) *\n                                    args->left_rear_f) * args->distance_f);\n        Sint16 swaprr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+3))) *\n                                    args->right_rear_f) * args->distance_f);\n        Sint16 swapce = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+4))) *\n                                    args->center_f) * args->distance_f);\n        Sint16 swapwf = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+5))) *\n                                    args->lfe_f) * args->distance_f);\n\n    switch (args->room_angle) {\n        case 0:\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapce);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapwf);\n            break;\n        case 90:\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapr)/2 + (Sint16) SDL_SwapBE16(swaprr)/2;\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapwf);\n            break;\n        case 180:\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaprr)/2 + (Sint16) SDL_SwapBE16(swaplr)/2;\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapwf);\n            break;\n        case 270:\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapl);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapr);\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapl)/2 + (Sint16) SDL_SwapBE16(swaplr)/2;\n                *(ptr++) = (Sint16) SDL_SwapBE16(swapwf);\n            break;\n    }\n    }\n}\n\nstatic void init_position_args(position_args *args)\n{\n    SDL_memset(args, '\\0', sizeof (position_args));\n    args->in_use = 0;\n    args->room_angle = 0;\n    args->left_u8 = args->right_u8 = args->distance_u8 = 255;\n    args->left_f  = args->right_f  = args->distance_f  = 1.0f;\n    args->left_rear_u8 = args->right_rear_u8 = args->center_u8 = args->lfe_u8 = 255;\n    args->left_rear_f = args->right_rear_f = args->center_f = args->lfe_f = 1.0f;\n    Mix_QuerySpec(NULL, NULL, (int *) &args->channels);\n}\n\n\nstatic position_args *get_position_arg(int channel)\n{\n    void *rc;\n    int i;\n\n    if (channel < 0) {\n        if (pos_args_global == NULL) {\n            pos_args_global = SDL_malloc(sizeof (position_args));\n            if (pos_args_global == NULL) {\n                Mix_SetError(\"Out of memory\");\n                return(NULL);\n            }\n            init_position_args(pos_args_global);\n        }\n\n        return(pos_args_global);\n    }\n\n    if (channel >= position_channels) {\n        rc = SDL_realloc(pos_args_array, (channel + 1) * sizeof (position_args *));\n        if (rc == NULL) {\n            Mix_SetError(\"Out of memory\");\n            return(NULL);\n        }\n        pos_args_array = (position_args **) rc;\n        for (i = position_channels; i <= channel; i++) {\n            pos_args_array[i] = NULL;\n        }\n        position_channels = channel + 1;\n    }\n\n    if (pos_args_array[channel] == NULL) {\n        pos_args_array[channel] = (position_args *)SDL_malloc(sizeof(position_args));\n        if (pos_args_array[channel] == NULL) {\n            Mix_SetError(\"Out of memory\");\n            return(NULL);\n        }\n        init_position_args(pos_args_array[channel]);\n    }\n\n    return(pos_args_array[channel]);\n}\n\n\nstatic Mix_EffectFunc_t get_position_effect_func(Uint16 format, int channels)\n{\n    Mix_EffectFunc_t f = NULL;\n\n    switch (format) {\n        case AUDIO_U8:\n        switch (channels) {\n            case 1:\n            case 2:\n                    f = (_Eff_build_volume_table_u8()) ? _Eff_position_table_u8 :\n                                                        _Eff_position_u8;\n                break;\n                case 4:\n                        f = _Eff_position_u8_c4;\n                break;\n                case 6:\n                        f = _Eff_position_u8_c6;\n                break;\n        }\n            break;\n\n        case AUDIO_S8:\n        switch (channels) {\n            case 1:\n            case 2:\n                    f = (_Eff_build_volume_table_s8()) ? _Eff_position_table_s8 :\n                                                        _Eff_position_s8;\n                break;\n                case 4:\n                        f = _Eff_position_s8_c4;\n                break;\n                case 6:\n                        f = _Eff_position_s8_c6;\n                break;\n        }\n            break;\n\n        case AUDIO_U16LSB:\n        switch (channels) {\n            case 1:\n            case 2:\n                    f = _Eff_position_u16lsb;\n                break;\n                case 4:\n                    f = _Eff_position_u16lsb_c4;\n                break;\n                case 6:\n                    f = _Eff_position_u16lsb_c6;\n                break;\n        }\n            break;\n\n        case AUDIO_S16LSB:\n        switch (channels) {\n            case 1:\n            case 2:\n                    f = _Eff_position_s16lsb;\n                break;\n                case 4:\n                    f = _Eff_position_s16lsb_c4;\n                break;\n                case 6:\n                    f = _Eff_position_s16lsb_c6;\n                break;\n        }\n            break;\n\n        case AUDIO_U16MSB:\n        switch (channels) {\n            case 1:\n            case 2:\n                    f = _Eff_position_u16msb;\n                break;\n                case 4:\n                    f = _Eff_position_u16msb_c4;\n                break;\n                case 6:\n                    f = _Eff_position_u16msb_c6;\n                break;\n        }\n            break;\n\n        case AUDIO_S16MSB:\n        switch (channels) {\n            case 1:\n            case 2:\n                    f = _Eff_position_s16msb;\n                break;\n                case 4:\n                    f = _Eff_position_s16msb_c4;\n                break;\n                case 6:\n                    f = _Eff_position_s16msb_c6;\n                break;\n        }\n            break;\n\n        default:\n            Mix_SetError(\"Unsupported audio format\");\n    }\n\n    return(f);\n}\n\nstatic Uint8 speaker_amplitude[6];\n\nstatic void set_amplitudes(int channels, int angle, int room_angle)\n{\n    int left = 255, right = 255;\n    int left_rear = 255, right_rear = 255, center = 255;\n\n    angle = SDL_abs(angle) % 360;  /* make angle between 0 and 359. */\n\n    if (channels == 2)\n    {\n        /*\n         * We only attenuate by position if the angle falls on the far side\n         *  of center; That is, an angle that's due north would not attenuate\n         *  either channel. Due west attenuates the right channel to 0.0, and\n         *  due east attenuates the left channel to 0.0. Slightly east of\n         *  center attenuates the left channel a little, and the right channel\n         *  not at all. I think of this as occlusion by one's own head.  :)\n         *\n         *   ...so, we split our angle circle into four quadrants...\n         */\n        if (angle < 90) {\n            left = 255 - ((int) (255.0f * (((float) angle) / 89.0f)));\n        } else if (angle < 180) {\n            left = (int) (255.0f * (((float) (angle - 90)) / 89.0f));\n        } else if (angle < 270) {\n            right = 255 - ((int) (255.0f * (((float) (angle - 180)) / 89.0f)));\n        } else {\n            right = (int) (255.0f * (((float) (angle - 270)) / 89.0f));\n        }\n    }\n\n    if (channels == 4 || channels == 6)\n    {\n        /*\n         *  An angle that's due north does not attenuate the center channel.\n         *  An angle in the first quadrant, 0-90, does not attenuate the RF.\n         *\n         *   ...so, we split our angle circle into 8 ...\n         *\n         *             CE\n         *             0\n         *     LF      |         RF\n         *             |\n         *  270<-------|----------->90\n         *             |\n         *     LR      |         RR\n         *            180\n         *\n         */\n        if (angle < 45) {\n            left = ((int) (255.0f * (((float) (180 - angle)) / 179.0f)));\n            left_rear = 255 - ((int) (255.0f * (((float) (angle + 45)) / 89.0f)));\n            right_rear = 255 - ((int) (255.0f * (((float) (90 - angle)) / 179.0f)));\n        } else if (angle < 90) {\n            center = ((int) (255.0f * (((float) (225 - angle)) / 179.0f)));\n            left = ((int) (255.0f * (((float) (180 - angle)) / 179.0f)));\n            left_rear = 255 - ((int) (255.0f * (((float) (135 - angle)) / 89.0f)));\n            right_rear = ((int) (255.0f * (((float) (90 + angle)) / 179.0f)));\n        } else if (angle < 135) {\n            center = ((int) (255.0f * (((float) (225 - angle)) / 179.0f)));\n            left = 255 - ((int) (255.0f * (((float) (angle - 45)) / 89.0f)));\n            right = ((int) (255.0f * (((float) (270 - angle)) / 179.0f)));\n            left_rear = ((int) (255.0f * (((float) (angle)) / 179.0f)));\n        } else if (angle < 180) {\n            center = 255 - ((int) (255.0f * (((float) (angle - 90)) / 89.0f)));\n            left = 255 - ((int) (255.0f * (((float) (225 - angle)) / 89.0f)));\n            right = ((int) (255.0f * (((float) (270 - angle)) / 179.0f)));\n            left_rear = ((int) (255.0f * (((float) (angle)) / 179.0f)));\n        } else if (angle < 225) {\n            center = 255 - ((int) (255.0f * (((float) (270 - angle)) / 89.0f)));\n            left = ((int) (255.0f * (((float) (angle - 90)) / 179.0f)));\n            right = 255 - ((int) (255.0f * (((float) (angle - 135)) / 89.0f)));\n            right_rear = ((int) (255.0f * (((float) (360 - angle)) / 179.0f)));\n        } else if (angle < 270) {\n            center = ((int) (255.0f * (((float) (angle - 135)) / 179.0f)));\n            left = ((int) (255.0f * (((float) (angle - 90)) / 179.0f)));\n            right = 255 - ((int) (255.0f * (((float) (315 - angle)) / 89.0f)));\n            right_rear = ((int) (255.0f * (((float) (360 - angle)) / 179.0f)));\n        } else if (angle < 315) {\n            center = ((int) (255.0f * (((float) (angle - 135)) / 179.0f)));\n            right = ((int) (255.0f * (((float) (angle - 180)) / 179.0f)));\n            left_rear = ((int) (255.0f * (((float) (450 - angle)) / 179.0f)));\n            right_rear = 255 - ((int) (255.0f * (((float) (angle - 225)) / 89.0f)));\n        } else {\n            right = ((int) (255.0f * (((float) (angle - 180)) / 179.0f)));\n            left_rear = ((int) (255.0f * (((float) (450 - angle)) / 179.0f)));\n            right_rear = 255 - ((int) (255.0f * (((float) (405 - angle)) / 89.0f)));\n        }\n    }\n\n    if (left < 0) left = 0; if (left > 255) left = 255;\n    if (right < 0) right = 0; if (right > 255) right = 255;\n    if (left_rear < 0) left_rear = 0; if (left_rear > 255) left_rear = 255;\n    if (right_rear < 0) right_rear = 0; if (right_rear > 255) right_rear = 255;\n    if (center < 0) center = 0; if (center > 255) center = 255;\n\n    if (room_angle == 90) {\n        speaker_amplitude[0] = (Uint8)left_rear;\n        speaker_amplitude[1] = (Uint8)left;\n        speaker_amplitude[2] = (Uint8)right_rear;\n        speaker_amplitude[3] = (Uint8)right;\n    }\n    else if (room_angle == 180) {\n    if (channels == 2) {\n            speaker_amplitude[0] = (Uint8)right;\n            speaker_amplitude[1] = (Uint8)left;\n    }\n    else {\n            speaker_amplitude[0] = (Uint8)right_rear;\n            speaker_amplitude[1] = (Uint8)left_rear;\n            speaker_amplitude[2] = (Uint8)right;\n            speaker_amplitude[3] = (Uint8)left;\n    }\n    }\n    else if (room_angle == 270) {\n        speaker_amplitude[0] = (Uint8)right;\n        speaker_amplitude[1] = (Uint8)right_rear;\n        speaker_amplitude[2] = (Uint8)left;\n        speaker_amplitude[3] = (Uint8)left_rear;\n    }\n    else {\n        speaker_amplitude[0] = (Uint8)left;\n        speaker_amplitude[1] = (Uint8)right;\n        speaker_amplitude[2] = (Uint8)left_rear;\n        speaker_amplitude[3] = (Uint8)right_rear;\n    }\n    speaker_amplitude[4] = (Uint8)center;\n    speaker_amplitude[5] = 255;\n}\n\nint Mix_SetPosition(int channel, Sint16 angle, Uint8 distance);\n\nint Mix_SetPanning(int channel, Uint8 left, Uint8 right)\n{\n    Mix_EffectFunc_t f = NULL;\n    int channels;\n    Uint16 format;\n    position_args *args = NULL;\n    int retval = 1;\n\n    Mix_QuerySpec(NULL, &format, &channels);\n\n    if (channels != 2 && channels != 4 && channels != 6)    /* it's a no-op; we call that successful. */\n        return(1);\n\n    if (channels > 2) {\n        /* left = right = 255 => angle = 0, to unregister effect as when channels = 2 */\n        /* left = 255 =>  angle = -90;  left = 0 => angle = +89 */\n        int angle = 0;\n        if ((left != 255) || (right != 255)) {\n        angle = (int)left;\n            angle = 127 - angle;\n        angle = -angle;\n            angle = angle * 90 / 128; /* Make it larger for more effect? */\n        }\n        return( Mix_SetPosition(channel, angle, 0) );\n    }\n\n    f = get_position_effect_func(format, channels);\n    if (f == NULL)\n        return(0);\n\n    SDL_LockAudio();\n    args = get_position_arg(channel);\n    if (!args) {\n        SDL_UnlockAudio();\n        return(0);\n    }\n\n        /* it's a no-op; unregister the effect, if it's registered. */\n    if ((args->distance_u8 == 255) && (left == 255) && (right == 255)) {\n        if (args->in_use) {\n            retval = _Mix_UnregisterEffect_locked(channel, f);\n            SDL_UnlockAudio();\n            return(retval);\n        } else {\n            SDL_UnlockAudio();\n            return(1);\n        }\n    }\n\n    args->left_u8 = left;\n    args->left_f = ((float) left) / 255.0f;\n    args->right_u8 = right;\n    args->right_f = ((float) right) / 255.0f;\n    args->room_angle = 0;\n\n    if (!args->in_use) {\n        args->in_use = 1;\n        retval=_Mix_RegisterEffect_locked(channel, f, _Eff_PositionDone, (void*)args);\n    }\n\n    SDL_UnlockAudio();\n    return(retval);\n}\n\n\nint Mix_SetDistance(int channel, Uint8 distance)\n{\n    Mix_EffectFunc_t f = NULL;\n    Uint16 format;\n    position_args *args = NULL;\n    int channels;\n    int retval = 1;\n\n    Mix_QuerySpec(NULL, &format, &channels);\n    f = get_position_effect_func(format, channels);\n    if (f == NULL)\n        return(0);\n\n    SDL_LockAudio();\n    args = get_position_arg(channel);\n    if (!args) {\n        SDL_UnlockAudio();\n        return(0);\n    }\n\n    distance = 255 - distance;  /* flip it to our scale. */\n\n        /* it's a no-op; unregister the effect, if it's registered. */\n    if ((distance == 255) && (args->left_u8 == 255) && (args->right_u8 == 255)) {\n        if (args->in_use) {\n            retval = _Mix_UnregisterEffect_locked(channel, f);\n            SDL_UnlockAudio();\n            return(retval);\n        } else {\n            SDL_UnlockAudio();\n            return(1);\n        }\n    }\n\n    args->distance_u8 = distance;\n    args->distance_f = ((float) distance) / 255.0f;\n    if (!args->in_use) {\n        args->in_use = 1;\n        retval = _Mix_RegisterEffect_locked(channel, f, _Eff_PositionDone, (void *) args);\n    }\n\n    SDL_UnlockAudio();\n    return(retval);\n}\n\n\nint Mix_SetPosition(int channel, Sint16 angle, Uint8 distance)\n{\n    Mix_EffectFunc_t f = NULL;\n    Uint16 format;\n    int channels;\n    position_args *args = NULL;\n    Sint16 room_angle = 0;\n    int retval = 1;\n\n    Mix_QuerySpec(NULL, &format, &channels);\n    f = get_position_effect_func(format, channels);\n    if (f == NULL)\n        return(0);\n\n    angle = SDL_abs(angle) % 360;  /* make angle between 0 and 359. */\n\n    SDL_LockAudio();\n    args = get_position_arg(channel);\n    if (!args) {\n        SDL_UnlockAudio();\n        return(0);\n    }\n\n        /* it's a no-op; unregister the effect, if it's registered. */\n    if ((!distance) && (!angle)) {\n        if (args->in_use) {\n            retval = _Mix_UnregisterEffect_locked(channel, f);\n            SDL_UnlockAudio();\n            return(retval);\n        } else {\n            SDL_UnlockAudio();\n            return(1);\n        }\n    }\n\n    if (channels == 2)\n    {\n    if (angle > 180)\n        room_angle = 180; /* exchange left and right channels */\n    else room_angle = 0;\n    }\n\n    if (channels == 4 || channels == 6)\n    {\n    if (angle > 315) room_angle = 0;\n    else if (angle > 225) room_angle = 270;\n    else if (angle > 135) room_angle = 180;\n    else if (angle > 45) room_angle = 90;\n    else room_angle = 0;\n    }\n\n\n    distance = 255 - distance;  /* flip it to scale Mix_SetDistance() uses. */\n\n    set_amplitudes(channels, angle, room_angle);\n\n    args->left_u8 = speaker_amplitude[0];\n    args->left_f = ((float) speaker_amplitude[0]) / 255.0f;\n    args->right_u8 = speaker_amplitude[1];\n    args->right_f = ((float) speaker_amplitude[1]) / 255.0f;\n    args->left_rear_u8 = speaker_amplitude[2];\n    args->left_rear_f = ((float) speaker_amplitude[2]) / 255.0f;\n    args->right_rear_u8 = speaker_amplitude[3];\n    args->right_rear_f = ((float) speaker_amplitude[3]) / 255.0f;\n    args->center_u8 = speaker_amplitude[4];\n    args->center_f = ((float) speaker_amplitude[4]) / 255.0f;\n    args->lfe_u8 = speaker_amplitude[5];\n    args->lfe_f = ((float) speaker_amplitude[5]) / 255.0f;\n    args->distance_u8 = distance;\n    args->distance_f = ((float) distance) / 255.0f;\n    args->room_angle = room_angle;\n    if (!args->in_use) {\n        args->in_use = 1;\n        retval = _Mix_RegisterEffect_locked(channel, f, _Eff_PositionDone, (void *) args);\n    }\n\n    SDL_UnlockAudio();\n    return(retval);\n}\n\n\n/* end of effects_position.c ... */\n\n"
  },
  {
    "path": "libs/SDL2_mixer/src/effect_stereoreverse.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This file by Ryan C. Gordon (icculus@icculus.org)\n\n  These are some internally supported special effects that use SDL_mixer's\n  effect callback API. They are meant for speed over quality.  :)\n*/\n\n/* $Id$ */\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"SDL.h\"\n#include \"SDL_mixer.h\"\n\n#define __MIX_INTERNAL_EFFECT__\n#include \"effects_internal.h\"\n\n/* profile code:\n    #include <sys/time.h>\n    #include <unistd.h>\n    struct timeval tv1;\n    struct timeval tv2;\n\n    gettimeofday(&tv1, NULL);\n\n        ... do your thing here ...\n\n    gettimeofday(&tv2, NULL);\n    printf(\"%ld\\n\", tv2.tv_usec - tv1.tv_usec);\n*/\n\n\n\n/*\n * Stereo reversal effect...this one's pretty straightforward...\n */\n\nstatic void _Eff_reversestereo16(int chan, void *stream, int len, void *udata)\n{\n    /* 16 bits * 2 channels. */\n    Uint32 *ptr = (Uint32 *) stream;\n    int i;\n\n    for (i = 0; i < len; i += sizeof (Uint32), ptr++) {\n        *ptr = (((*ptr) & 0xFFFF0000) >> 16) | (((*ptr) & 0x0000FFFF) << 16);\n    }\n}\n\n\nstatic void _Eff_reversestereo8(int chan, void *stream, int len, void *udata)\n{\n    /* 8 bits * 2 channels. */\n    Uint32 *ptr = (Uint32 *) stream;\n    int i;\n\n    /* get the last two bytes if len is not divisible by four... */\n    if (len % sizeof (Uint32) != 0) {\n        Uint16 *p = (Uint16 *) (((Uint8 *) stream) + (len - 2));\n        *p = (Uint16)((((*p) & 0xFF00) >> 8) | (((*ptr) & 0x00FF) << 8));\n        len -= 2;\n    }\n\n    for (i = 0; i < len; i += sizeof (Uint32), ptr++) {\n        *ptr = (((*ptr) & 0x0000FF00) >> 8) | (((*ptr) & 0x000000FF) << 8) |\n               (((*ptr) & 0xFF000000) >> 8) | (((*ptr) & 0x00FF0000) << 8);\n    }\n}\n\n\nint Mix_SetReverseStereo(int channel, int flip)\n{\n    Mix_EffectFunc_t f = NULL;\n    int channels;\n    Uint16 format;\n\n    Mix_QuerySpec(NULL, &format, &channels);\n\n    if (channels == 2) {\n        if ((format & 0xFF) == 16)\n            f = _Eff_reversestereo16;\n        else if ((format & 0xFF) == 8)\n            f = _Eff_reversestereo8;\n        else {\n            Mix_SetError(\"Unsupported audio format\");\n            return(0);\n        }\n\n        if (!flip) {\n            return(Mix_UnregisterEffect(channel, f));\n        } else {\n            return(Mix_RegisterEffect(channel, f, NULL, NULL));\n        }\n    }\n\n    return(1);\n}\n\n\n/* end of effect_stereoreverse.c ... */\n\n"
  },
  {
    "path": "libs/SDL2_mixer/src/effects_internal.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This file by Ryan C. Gordon (icculus@icculus.org)\n\n  These are some helper functions for the internal mixer special effects.\n*/\n\n/* $Id$ */\n\n\n     /* ------ These are used internally only. Don't touch. ------ */\n\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include \"SDL_mixer.h\"\n\n#define __MIX_INTERNAL_EFFECT__\n#include \"effects_internal.h\"\n\n/* Should we favor speed over memory usage and/or quality of output? */\nint _Mix_effects_max_speed = 0;\n\n\nvoid _Mix_InitEffects(void)\n{\n    _Mix_effects_max_speed = (SDL_getenv(MIX_EFFECTSMAXSPEED) != NULL);\n}\n\nvoid _Mix_DeinitEffects(void)\n{\n    _Eff_PositionDeinit();\n}\n\n\nvoid *_Eff_volume_table = NULL;\n\n\n/* Build the volume table for Uint8-format samples.\n *\n * Each column of the table is a possible sample, while each row of the\n *  table is a volume. Volume is a Uint8, where 0 is silence and 255 is full\n *  volume. So _Eff_volume_table[128][mysample] would be the value of\n *  mysample, at half volume.\n */\nvoid *_Eff_build_volume_table_u8(void)\n{\n    int volume;\n    int sample;\n    Uint8 *rc;\n\n    if (!_Mix_effects_max_speed) {\n        return(NULL);\n    }\n\n    if (!_Eff_volume_table) {\n        rc = SDL_malloc(256 * 256);\n        if (rc) {\n            _Eff_volume_table = (void *) rc;\n            for (volume = 0; volume < 256; volume++) {\n                for (sample = -128; sample < 128; sample ++) {\n                    *rc = (Uint8)(((float) sample) * ((float) volume / 255.0))\n                        + 128;\n                    rc++;\n                }\n            }\n        }\n    }\n\n    return(_Eff_volume_table);\n}\n\n\n/* Build the volume table for Sint8-format samples.\n *\n * Each column of the table is a possible sample, while each row of the\n *  table is a volume. Volume is a Uint8, where 0 is silence and 255 is full\n *  volume. So _Eff_volume_table[128][mysample+128] would be the value of\n *  mysample, at half volume.\n */\nvoid *_Eff_build_volume_table_s8(void)\n{\n    int volume;\n    int sample;\n    Sint8 *rc;\n\n    if (!_Eff_volume_table) {\n        rc = SDL_malloc(256 * 256);\n        if (rc) {\n            _Eff_volume_table = (void *) rc;\n            for (volume = 0; volume < 256; volume++) {\n                for (sample = -128; sample < 128; sample ++) {\n                    *rc = (Sint8)(((float) sample) * ((float) volume / 255.0));\n                    rc++;\n                }\n            }\n        }\n    }\n\n    return(_Eff_volume_table);\n}\n\n\n/* end of effects.c ... */\n\n"
  },
  {
    "path": "libs/SDL2_mixer/src/fluidsynth.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  James Le Cuirot\n  chewi@aura-online.co.uk\n*/\n\n#ifdef USE_FLUIDSYNTH_MIDI\n\n#include <stdio.h>\n#include <sys/types.h>\n\n#include \"SDL_mixer.h\"\n#include \"fluidsynth.h\"\n\nstatic Uint16 format;\nstatic Uint8 channels;\nstatic int freq;\n\nint fluidsynth_check_soundfont(const char *path, void *data)\n{\n    FILE *file = fopen(path, \"r\");\n\n    if (file) {\n        fclose(file);\n        return 1;\n    } else {\n        Mix_SetError(\"Failed to access the SoundFont %s\", path);\n        return 0;\n    }\n}\n\nint fluidsynth_load_soundfont(const char *path, void *data)\n{\n    /* If this fails, it's too late to try Timidity so pray that at least one works. */\n    fluidsynth.fluid_synth_sfload((fluid_synth_t*) data, path, 1);\n    return 1;\n}\n\nint fluidsynth_init(SDL_AudioSpec *mixer)\n{\n    if (!Mix_EachSoundFont(fluidsynth_check_soundfont, NULL))\n        return -1;\n\n    format = mixer->format;\n    channels = mixer->channels;\n    freq = mixer->freq;\n\n    return 0;\n}\n\nstatic FluidSynthMidiSong *fluidsynth_loadsong_common(int (*function)(FluidSynthMidiSong*, void*), void *data)\n{\n    FluidSynthMidiSong *song;\n    fluid_settings_t *settings = NULL;\n\n    if (!Mix_Init(MIX_INIT_FLUIDSYNTH)) {\n        return NULL;\n    }\n\n    if ((song = SDL_malloc(sizeof(FluidSynthMidiSong)))) {\n        SDL_memset(song, 0, sizeof(FluidSynthMidiSong));\n\n        if (SDL_BuildAudioCVT(&song->convert, AUDIO_S16, 2, freq, format, channels, freq) >= 0) {\n            if ((settings = fluidsynth.new_fluid_settings())) {\n                fluidsynth.fluid_settings_setnum(settings, \"synth.sample-rate\", (double) freq);\n\n                if ((song->synth = fluidsynth.new_fluid_synth(settings))) {\n                    if (Mix_EachSoundFont(fluidsynth_load_soundfont, (void*) song->synth)) {\n                        if ((song->player = fluidsynth.new_fluid_player(song->synth))) {\n                            if (function(song, data)) return song;\n                            fluidsynth.delete_fluid_player(song->player);\n                        } else {\n                            Mix_SetError(\"Failed to create FluidSynth player\");\n                        }\n                    }\n                    fluidsynth.delete_fluid_synth(song->synth);\n                } else {\n                    Mix_SetError(\"Failed to create FluidSynth synthesizer\");\n                }\n                fluidsynth.delete_fluid_settings(settings);\n            } else {\n                Mix_SetError(\"Failed to create FluidSynth settings\");\n            }\n        } else {\n            Mix_SetError(\"Failed to set up audio conversion\");\n        }\n        SDL_free(song);\n    } else {\n        Mix_SetError(\"Insufficient memory for song\");\n    }\n    return NULL;\n}\n\nstatic int fluidsynth_loadsong_RW_internal(FluidSynthMidiSong *song, void *data)\n{\n    Sint64 offset;\n    size_t size;\n    char *buffer;\n    SDL_RWops *src = (SDL_RWops*) data;\n\n    offset = SDL_RWtell(src);\n    SDL_RWseek(src, 0, RW_SEEK_END);\n    size = (size_t)(SDL_RWtell(src) - offset);\n    SDL_RWseek(src, offset, RW_SEEK_SET);\n\n    if ((buffer = (char*) SDL_malloc(size))) {\n        if(SDL_RWread(src, buffer, size, 1) == 1) {\n            if (fluidsynth.fluid_player_add_mem(song->player, buffer, size) == FLUID_OK) {\n                SDL_free(buffer);\n                return 1;\n            } else {\n                Mix_SetError(\"FluidSynth failed to load in-memory song\");\n            }\n        } else {\n            Mix_SetError(\"Failed to read in-memory song\");\n        }\n        SDL_free(buffer);\n    } else {\n        Mix_SetError(\"Insufficient memory for song\");\n    }\n    return 0;\n}\n\nFluidSynthMidiSong *fluidsynth_loadsong_RW(SDL_RWops *src, int freesrc)\n{\n    FluidSynthMidiSong *song;\n\n    song = fluidsynth_loadsong_common(fluidsynth_loadsong_RW_internal, (void*) src);\n    if (song && freesrc) {\n        SDL_RWclose(src);\n    }\n    return song;\n}\n\nvoid fluidsynth_freesong(FluidSynthMidiSong *song)\n{\n    if (!song) return;\n    fluidsynth.delete_fluid_player(song->player);\n    fluidsynth.delete_fluid_settings(fluidsynth.fluid_synth_get_settings(song->synth));\n    fluidsynth.delete_fluid_synth(song->synth);\n    SDL_free(song);\n}\n\nvoid fluidsynth_start(FluidSynthMidiSong *song)\n{\n    fluidsynth.fluid_player_set_loop(song->player, 1);\n    fluidsynth.fluid_player_play(song->player);\n}\n\nvoid fluidsynth_stop(FluidSynthMidiSong *song)\n{\n    fluidsynth.fluid_player_stop(song->player);\n}\n\nint fluidsynth_active(FluidSynthMidiSong *song)\n{\n    return fluidsynth.fluid_player_get_status(song->player) == FLUID_PLAYER_PLAYING ? 1 : 0;\n}\n\nvoid fluidsynth_setvolume(FluidSynthMidiSong *song, int volume)\n{\n    /* FluidSynth's default is 0.2. Make 1.2 the maximum. */\n    fluidsynth.fluid_synth_set_gain(song->synth, (float) (volume * 1.2 / MIX_MAX_VOLUME));\n}\n\nint fluidsynth_playsome(FluidSynthMidiSong *song, void *dest, int dest_len)\n{\n    int result = -1;\n    int frames = dest_len / channels / ((format & 0xFF) / 8);\n    int src_len = frames * 4; /* 16-bit stereo */\n    void *src = dest;\n\n    if (dest_len < src_len) {\n        if (!(src = SDL_malloc(src_len))) {\n            Mix_SetError(\"Insufficient memory for audio conversion\");\n            return result;\n        }\n    }\n\n    if (fluidsynth.fluid_synth_write_s16(song->synth, frames, src, 0, 2, src, 1, 2) != FLUID_OK) {\n        Mix_SetError(\"Error generating FluidSynth audio\");\n        goto finish;\n    }\n\n    song->convert.buf = src;\n    song->convert.len = src_len;\n\n    if (SDL_ConvertAudio(&song->convert) < 0) {\n        Mix_SetError(\"Error during audio conversion\");\n        goto finish;\n    }\n\n    if (src != dest)\n        SDL_memcpy(dest, src, dest_len);\n\n    result = 0;\n\nfinish:\n    if (src != dest)\n        SDL_free(src);\n\n    return result;\n}\n\n#endif /* USE_FLUIDSYNTH_MIDI */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/load_aiff.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This is the source needed to decode an AIFF file into a waveform.\n  It's pretty straightforward once you get going. The only\n  externally-callable function is Mix_LoadAIFF_RW(), which is meant to\n  act as identically to SDL_LoadWAV_RW() as possible.\n\n  This file by Torbjrn Andersson (torbjorn.andersson@eurotime.se)\n  8SVX file support added by Marc Le Douarain (mavati@club-internet.fr)\n  in december 2002.\n*/\n\n/* $Id$ */\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL_endian.h\"\n#include \"SDL_mixer.h\"\n#include \"load_aiff.h\"\n\n/*********************************************/\n/* Define values for AIFF (IFF audio) format */\n/*********************************************/\n#define FORM        0x4d524f46      /* \"FORM\" */\n\n#define AIFF        0x46464941      /* \"AIFF\" */\n#define SSND        0x444e5353      /* \"SSND\" */\n#define COMM        0x4d4d4f43      /* \"COMM\" */\n\n#define _8SVX       0x58565338      /* \"8SVX\" */\n#define VHDR        0x52444856      /* \"VHDR\" */\n#define BODY        0x59444F42      /* \"BODY\" */\n\n/* This function was taken from libsndfile. I don't pretend to fully\n * understand it.\n */\n\nstatic Uint32 SANE_to_Uint32 (Uint8 *sanebuf)\n{\n    /* Is the frequency outside of what we can represent with Uint32? */\n    if ( (sanebuf[0] & 0x80) || (sanebuf[0] <= 0x3F) || (sanebuf[0] > 0x40)\n        || (sanebuf[0] == 0x40 && sanebuf[1] > 0x1C) )\n        return 0;\n\n    return ((sanebuf[2] << 23) | (sanebuf[3] << 15) | (sanebuf[4] << 7)\n        | (sanebuf[5] >> 1)) >> (29 - sanebuf[1]);\n}\n\n/* This function is based on SDL_LoadWAV_RW(). */\n\nSDL_AudioSpec *Mix_LoadAIFF_RW (SDL_RWops *src, int freesrc,\n    SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)\n{\n    int was_error;\n    int found_SSND;\n    int found_COMM;\n    int found_VHDR;\n    int found_BODY;\n    Sint64 start = 0;\n\n    Uint32 chunk_type;\n    Uint32 chunk_length;\n    Sint64 next_chunk;\n\n    /* AIFF magic header */\n    Uint32 FORMchunk;\n    Uint32 AIFFmagic;\n\n    /* SSND chunk */\n    Uint32 offset;\n    Uint32 blocksize;\n\n    /* COMM format chunk */\n    Uint16 channels = 0;\n    Uint32 numsamples = 0;\n    Uint16 samplesize = 0;\n    Uint8 sane_freq[10];\n    Uint32 frequency = 0;\n\n    /* Make sure we are passed a valid data source */\n    was_error = 0;\n    if ( src == NULL ) {\n        was_error = 1;\n        goto done;\n    }\n\n    FORMchunk   = SDL_ReadLE32(src);\n    chunk_length    = SDL_ReadBE32(src);\n    if ( chunk_length == AIFF ) { /* The FORMchunk has already been read */\n        AIFFmagic    = chunk_length;\n        chunk_length = FORMchunk;\n        FORMchunk    = FORM;\n    } else {\n        AIFFmagic    = SDL_ReadLE32(src);\n    }\n    if ( (FORMchunk != FORM) || ( (AIFFmagic != AIFF) && (AIFFmagic != _8SVX) ) ) {\n        SDL_SetError(\"Unrecognized file type (not AIFF nor 8SVX)\");\n        was_error = 1;\n        goto done;\n    }\n\n    /* TODO: Better santity-checking. */\n\n    found_SSND = 0;\n    found_COMM = 0;\n    found_VHDR = 0;\n    found_BODY = 0;\n\n    do {\n        chunk_type  = SDL_ReadLE32(src);\n        chunk_length = SDL_ReadBE32(src);\n        next_chunk  = SDL_RWtell(src) + chunk_length;\n        /* Paranoia to avoid infinite loops */\n        if (chunk_length == 0)\n            break;\n\n        switch (chunk_type) {\n            case SSND:\n                found_SSND  = 1;\n                offset      = SDL_ReadBE32(src);\n                blocksize   = SDL_ReadBE32(src);\n                start       = SDL_RWtell(src) + offset;\n                break;\n\n            case COMM:\n                found_COMM  = 1;\n                channels    = SDL_ReadBE16(src);\n                numsamples  = SDL_ReadBE32(src);\n                samplesize  = SDL_ReadBE16(src);\n                SDL_RWread(src, sane_freq, sizeof(sane_freq), 1);\n                frequency   = SANE_to_Uint32(sane_freq);\n                if (frequency == 0) {\n                    SDL_SetError(\"Bad AIFF sample frequency\");\n                    was_error = 1;\n                    goto done;\n                }\n                break;\n\n            case VHDR:\n                found_VHDR  = 1;\n                SDL_ReadBE32(src);\n                SDL_ReadBE32(src);\n                SDL_ReadBE32(src);\n                frequency = SDL_ReadBE16(src);\n                channels = 1;\n                samplesize = 8;\n                break;\n\n            case BODY:\n                found_BODY  = 1;\n                numsamples  = chunk_length;\n                start       = SDL_RWtell(src);\n                break;\n\n            default:\n                break;\n        }\n        /* a 0 pad byte can be stored for any odd-length chunk */\n        if (chunk_length&1)\n            next_chunk++;\n    } while ( ( ( (AIFFmagic == AIFF) && ( !found_SSND || !found_COMM ) )\n          || ( (AIFFmagic == _8SVX ) && ( !found_VHDR || !found_BODY ) ) )\n          && SDL_RWseek(src, next_chunk, RW_SEEK_SET) != 1 );\n\n    if ( (AIFFmagic == AIFF) && !found_SSND ) {\n        SDL_SetError(\"Bad AIFF (no SSND chunk)\");\n        was_error = 1;\n        goto done;\n    }\n\n    if ( (AIFFmagic == AIFF) && !found_COMM ) {\n        SDL_SetError(\"Bad AIFF (no COMM chunk)\");\n        was_error = 1;\n        goto done;\n    }\n\n    if ( (AIFFmagic == _8SVX) && !found_VHDR ) {\n        SDL_SetError(\"Bad 8SVX (no VHDR chunk)\");\n        was_error = 1;\n        goto done;\n    }\n\n    if ( (AIFFmagic == _8SVX) && !found_BODY ) {\n        SDL_SetError(\"Bad 8SVX (no BODY chunk)\");\n        was_error = 1;\n        goto done;\n    }\n\n    /* Decode the audio data format */\n    SDL_memset(spec, 0, sizeof(*spec));\n    spec->freq = frequency;\n    switch (samplesize) {\n        case 8:\n            spec->format = AUDIO_S8;\n            break;\n        case 16:\n            spec->format = AUDIO_S16MSB;\n            break;\n        default:\n            SDL_SetError(\"Unsupported AIFF samplesize\");\n            was_error = 1;\n            goto done;\n    }\n    spec->channels = (Uint8) channels;\n    spec->samples = 4096;       /* Good default buffer size */\n\n    *audio_len = channels * numsamples * (samplesize / 8);\n    *audio_buf = (Uint8 *)SDL_malloc(*audio_len);\n    if ( *audio_buf == NULL ) {\n        SDL_SetError(\"Out of memory\");\n        return(NULL);\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    if ( SDL_RWread(src, *audio_buf, *audio_len, 1) != 1 ) {\n        SDL_SetError(\"Unable to read audio data\");\n        return(NULL);\n    }\n\n    /* Don't return a buffer that isn't a multiple of samplesize */\n    *audio_len &= ~((samplesize / 8) - 1);\n\ndone:\n    if (freesrc && src) {\n        SDL_RWclose(src);\n    }\n    if (was_error) {\n        spec = NULL;\n    }\n    return(spec);\n}\n\n"
  },
  {
    "path": "libs/SDL2_mixer/src/load_flac.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This is the source needed to decode a FLAC into a waveform.\n    ~ Austen Dicken (admin@cvpcs.org).\n*/\n\n#ifdef FLAC_MUSIC\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL_mutex.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_timer.h\"\n\n#include \"SDL_mixer.h\"\n#include \"dynamic_flac.h\"\n#include \"load_flac.h\"\n\n#include <FLAC/stream_decoder.h>\n\ntypedef struct {\n    SDL_RWops* sdl_src;\n    SDL_AudioSpec* sdl_spec;\n    Uint8** sdl_audio_buf;\n    Uint32* sdl_audio_len;\n    int sdl_audio_read;\n    FLAC__uint64 flac_total_samples;\n    unsigned flac_bps;\n} FLAC_SDL_Data;\n\nstatic FLAC__StreamDecoderReadStatus flac_read_load_cb(\n                                    const FLAC__StreamDecoder *decoder,\n                                    FLAC__byte buffer[],\n                                    size_t *bytes,\n                                    void *client_data)\n{\n    // make sure there is something to be reading\n    if (*bytes > 0) {\n        FLAC_SDL_Data *data = (FLAC_SDL_Data *)client_data;\n\n        *bytes = SDL_RWread (data->sdl_src, buffer, sizeof (FLAC__byte),\n                                *bytes);\n\n        if (*bytes == 0) { // error or no data was read (EOF)\n            return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;\n        } else { // data was read, continue\n            return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;\n        }\n    } else {\n        return FLAC__STREAM_DECODER_READ_STATUS_ABORT;\n    }\n}\n\nstatic FLAC__StreamDecoderSeekStatus flac_seek_load_cb(\n                                    const FLAC__StreamDecoder *decoder,\n                                    FLAC__uint64 absolute_byte_offset,\n                                    void *client_data)\n{\n    FLAC_SDL_Data *data = (FLAC_SDL_Data *)client_data;\n\n    if (SDL_RWseek (data->sdl_src, absolute_byte_offset, RW_SEEK_SET) < 0) {\n        return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;\n    } else {\n        return FLAC__STREAM_DECODER_SEEK_STATUS_OK;\n    }\n}\n\nstatic FLAC__StreamDecoderTellStatus flac_tell_load_cb(\n                                    const FLAC__StreamDecoder *decoder,\n                                    FLAC__uint64 *absolute_byte_offset,\n                                    void *client_data)\n{\n    FLAC_SDL_Data *data = (FLAC_SDL_Data *)client_data;\n\n    Sint64 pos = SDL_RWtell (data->sdl_src);\n\n    if (pos < 0) {\n        return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;\n    } else {\n        *absolute_byte_offset = (FLAC__uint64)pos;\n        return FLAC__STREAM_DECODER_TELL_STATUS_OK;\n    }\n}\n\nstatic FLAC__StreamDecoderLengthStatus flac_length_load_cb(\n                                    const FLAC__StreamDecoder *decoder,\n                                    FLAC__uint64 *stream_length,\n                                    void *client_data)\n{\n    FLAC_SDL_Data *data = (FLAC_SDL_Data *)client_data;\n\n    Sint64 pos = SDL_RWtell (data->sdl_src);\n    Sint64 length = SDL_RWseek (data->sdl_src, 0, RW_SEEK_END);\n\n    if (SDL_RWseek (data->sdl_src, pos, RW_SEEK_SET) != pos || length < 0) {\n        /* there was an error attempting to return the stream to the original\n         * position, or the length was invalid. */\n        return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;\n    } else {\n        *stream_length = (FLAC__uint64)length;\n        return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;\n    }\n}\n\nstatic FLAC__bool flac_eof_load_cb(const FLAC__StreamDecoder *decoder,\n                                    void *client_data)\n{\n    FLAC_SDL_Data *data = (FLAC_SDL_Data *)client_data;\n\n    Sint64 pos = SDL_RWtell (data->sdl_src);\n    Sint64 end = SDL_RWseek (data->sdl_src, 0, RW_SEEK_END);\n\n    // was the original position equal to the end (a.k.a. the seek didn't move)?\n    if (pos == end) {\n        // must be EOF\n        return true;\n    } else {\n        // not EOF, return to the original position\n        SDL_RWseek (data->sdl_src, pos, RW_SEEK_SET);\n        return false;\n    }\n}\n\nstatic FLAC__StreamDecoderWriteStatus flac_write_load_cb(\n                                    const FLAC__StreamDecoder *decoder,\n                                    const FLAC__Frame *frame,\n                                    const FLAC__int32 *const buffer[],\n                                    void *client_data)\n{\n    FLAC_SDL_Data *data = (FLAC_SDL_Data *)client_data;\n    size_t i;\n    Uint8 *buf;\n\n    if (data->flac_total_samples == 0) {\n        SDL_SetError (\"Given FLAC file does not specify its sample count.\");\n        return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;\n    }\n\n    if (data->sdl_spec->channels != 2 || data->flac_bps != 16) {\n        SDL_SetError (\"Current FLAC support is only for 16 bit Stereo files.\");\n        return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;\n    }\n\n    // check if it is the first audio frame so we can initialize the output\n    // buffer\n    if (frame->header.number.sample_number == 0) {\n        *(data->sdl_audio_len) = data->sdl_spec->size;\n        data->sdl_audio_read = 0;\n        *(data->sdl_audio_buf) = SDL_malloc (*(data->sdl_audio_len));\n\n        if (*(data->sdl_audio_buf) == NULL) {\n            SDL_SetError\n                    (\"Unable to allocate memory to store the FLAC stream.\");\n            return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;\n        }\n    }\n\n    buf = *(data->sdl_audio_buf);\n\n    for (i = 0; i < frame->header.blocksize; i++) {\n        FLAC__int16 i16;\n        FLAC__uint16 ui16;\n\n        i16 = (FLAC__int16)buffer[0][i];\n        ui16 = (FLAC__uint16)i16;\n\n        *(buf + (data->sdl_audio_read++)) = (char)(ui16);\n        *(buf + (data->sdl_audio_read++)) = (char)(ui16 >> 8);\n\n        i16 = (FLAC__int16)buffer[1][i];\n        ui16 = (FLAC__uint16)i16;\n\n        *(buf + (data->sdl_audio_read++)) = (char)(ui16);\n        *(buf + (data->sdl_audio_read++)) = (char)(ui16 >> 8);\n    }\n\n    return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;\n}\n\nstatic void flac_metadata_load_cb(\n                    const FLAC__StreamDecoder *decoder,\n                    const FLAC__StreamMetadata *metadata,\n                    void *client_data)\n{\n    FLAC_SDL_Data *data = (FLAC_SDL_Data *)client_data;\n    FLAC__uint64 total_samples;\n    unsigned bps;\n\n    if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {\n        // save the metadata right now for use later on\n        *(data->sdl_audio_buf) = NULL;\n        *(data->sdl_audio_len) = 0;\n        memset (data->sdl_spec, '\\0', sizeof (SDL_AudioSpec));\n\n        data->sdl_spec->format = AUDIO_S16;\n        data->sdl_spec->freq = (int)(metadata->data.stream_info.sample_rate);\n        data->sdl_spec->channels = (Uint8)(metadata->data.stream_info.channels);\n        data->sdl_spec->samples = 8192; /* buffer size */\n\n        total_samples = metadata->data.stream_info.total_samples;\n        bps = metadata->data.stream_info.bits_per_sample;\n\n        data->sdl_spec->size = (Uint32)(total_samples * data->sdl_spec->channels * (bps / 8));\n        data->flac_total_samples = total_samples;\n        data->flac_bps = bps;\n    }\n}\n\nstatic void flac_error_load_cb(\n                const FLAC__StreamDecoder *decoder,\n                FLAC__StreamDecoderErrorStatus status,\n                void *client_data)\n{\n    // print an SDL error based on the error status\n    switch (status) {\n        case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:\n            SDL_SetError (\"Error processing the FLAC file [LOST_SYNC].\");\n        break;\n        case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:\n            SDL_SetError (\"Error processing the FLAC file [BAD_HEADER].\");\n        break;\n        case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:\n            SDL_SetError (\"Error processing the FLAC file [CRC_MISMATCH].\");\n        break;\n        case FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM:\n            SDL_SetError (\"Error processing the FLAC file [UNPARSEABLE].\");\n        break;\n        default:\n            SDL_SetError (\"Error processing the FLAC file [UNKNOWN].\");\n        break;\n    }\n}\n\n/* don't call this directly; use Mix_LoadWAV_RW() for now. */\nSDL_AudioSpec *Mix_LoadFLAC_RW (SDL_RWops *src, int freesrc,\n        SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)\n{\n    FLAC__StreamDecoder *decoder = 0;\n    FLAC__StreamDecoderInitStatus init_status;\n    int was_error = 1;\n    int was_init = 0;\n    Uint32 samplesize;\n\n    // create the client data passing information\n    FLAC_SDL_Data* client_data;\n    client_data = (FLAC_SDL_Data *)SDL_malloc (sizeof (FLAC_SDL_Data));\n\n    if ((!src) || (!audio_buf) || (!audio_len))   /* sanity checks. */\n        goto done;\n\n    if (!Mix_Init(MIX_INIT_FLAC))\n        goto done;\n\n    if ((decoder = flac.FLAC__stream_decoder_new ()) == NULL) {\n        SDL_SetError (\"Unable to allocate FLAC decoder.\");\n        goto done;\n    }\n\n    init_status = flac.FLAC__stream_decoder_init_stream (decoder,\n                                flac_read_load_cb, flac_seek_load_cb,\n                                flac_tell_load_cb, flac_length_load_cb,\n                                flac_eof_load_cb, flac_write_load_cb,\n                                flac_metadata_load_cb, flac_error_load_cb,\n                                client_data);\n\n    if (init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK) {\n        SDL_SetError (\"Unable to initialize FLAC stream decoder.\");\n        goto done;\n    }\n\n    was_init = 1;\n\n    client_data->sdl_src = src;\n    client_data->sdl_spec = spec;\n    client_data->sdl_audio_buf = audio_buf;\n    client_data->sdl_audio_len = audio_len;\n\n    if (!flac.FLAC__stream_decoder_process_until_end_of_stream (decoder)) {\n        SDL_SetError (\"Unable to process FLAC file.\");\n        goto done;\n    }\n\n    was_error = 0;\n\n    /* Don't return a buffer that isn't a multiple of samplesize */\n    samplesize = ((spec->format & 0xFF) / 8) * spec->channels;\n    *audio_len &= ~(samplesize - 1);\n\ndone:\n    if (was_init && decoder) {\n        flac.FLAC__stream_decoder_finish (decoder);\n    }\n\n    if (decoder) {\n        flac.FLAC__stream_decoder_delete (decoder);\n    }\n\n    if (freesrc && src) {\n        SDL_RWclose (src);\n    }\n\n    if (was_error) {\n        spec = NULL;\n    }\n\n    return spec;\n}\n\n#endif // FLAC_MUSIC\n"
  },
  {
    "path": "libs/SDL2_mixer/src/load_mp3.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n\t claim that you wrote the original software. If you use this software\n\t in a product, an acknowledgment in the product documentation would be\n\t appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n\t misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This is the source needed to decode an MP3 into a waveform.\n*/\n\n/* $Id$ */\n\n#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)\n\n#include \"SDL_mixer.h\"\n\n#include \"load_mp3.h\"\n\n#if defined(MP3_MUSIC)\n#include \"dynamic_mp3.h\"\n#elif defined(MP3_MAD_MUSIC)\n#include \"music_mad.h\"\n#endif\n\nSDL_AudioSpec *Mix_LoadMP3_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)\n{\n\t/* note: spec is initialized to mixer spec */\n\n#if defined(MP3_MUSIC)\n\tSMPEG* mp3;\n\tSMPEG_Info info;\n#elif defined(MP3_MAD_MUSIC)\n\tmad_data *mp3_mad;\n#endif\n\tlong samplesize;\n\tint read_len;\n\tconst Uint32 chunk_len = 4096;\n\tint err = 0;\n\n\tif ((!src) || (!spec) || (!audio_buf) || (!audio_len))\n\t{\n\t\treturn NULL;\n\t}\n\n\tif (!err)\n\t{\n\t\t*audio_len = 0;\n\t\t*audio_buf = (Uint8*) SDL_malloc(chunk_len);\n\t\terr = (*audio_buf == NULL);\n\t}\n\n\tif (!err)\n\t{\n\t\terr = ((Mix_Init(MIX_INIT_MP3) & MIX_INIT_MP3) == 0);\n\t}\n\n\tif (!err)\n\t{\n#if defined(MP3_MUSIC)\n\t\tmp3 = smpeg.SMPEG_new_rwops(src, &info, freesrc, 0);\n\t\terr = (mp3 == NULL);\n#elif defined(MP3_MAD_MUSIC)\n        mp3_mad = mad_openFileRW(src, spec, freesrc);\n\t\terr = (mp3_mad == NULL);\n#endif\n\t}\n\n#if defined(MP3_MUSIC)\n\tif (!err)\n\t{\n\t\terr = !info.has_audio;\n\t}\n#endif\n\n\tif (!err)\n\t{\n#if defined(MP3_MUSIC)\n\n\t\tsmpeg.SMPEG_actualSpec(mp3, spec);\n\n\t\tsmpeg.SMPEG_enableaudio(mp3, 1);\n\t\tsmpeg.SMPEG_enablevideo(mp3, 0);\n\n\t\tsmpeg.SMPEG_play(mp3);\n\n\t\t/* read once for audio length */\n\t\twhile ((read_len = smpeg.SMPEG_playAudio(mp3, *audio_buf, chunk_len)) > 0)\n\t\t{\n\t\t\t*audio_len += read_len;\n\t\t}\n\n\t\tsmpeg.SMPEG_stop(mp3);\n\n#elif defined(MP3_MAD_MUSIC)\n\n        mad_start(mp3_mad);\n\n\t\t/* read once for audio length */\n\t\twhile ((read_len = mad_getSamples(mp3_mad, *audio_buf, chunk_len)) > 0)\n\t\t{\n\t\t\t*audio_len += read_len;\n\t\t}\n\n\t\tmad_stop(mp3_mad);\n\n#endif\n\n\t\terr = (read_len < 0);\n\t}\n\n\tif (!err)\n\t{\n\t\t/* reallocate, if needed */\n\t\tif ((*audio_len > 0) && (*audio_len != chunk_len))\n\t\t{\n\t\t\t*audio_buf = (Uint8*) SDL_realloc(*audio_buf, *audio_len);\n\t\t\terr = (*audio_buf == NULL);\n\t\t}\n\t}\n\n\tif (!err)\n\t{\n\t\t/* read again for audio buffer, if needed */\n\t\tif (*audio_len > chunk_len)\n\t\t{\n#if defined(MP3_MUSIC)\n\t\t\tsmpeg.SMPEG_rewind(mp3);\n\t\t\tsmpeg.SMPEG_play(mp3);\n\t\t\terr = (*audio_len != smpeg.SMPEG_playAudio(mp3, *audio_buf, *audio_len));\n\t\t\tsmpeg.SMPEG_stop(mp3);\n#elif defined(MP3_MAD_MUSIC)\n\t\t\tmad_seek(mp3_mad, 0);\n\t\t\tmad_start(mp3_mad);\n\t\t\terr = (*audio_len != mad_getSamples(mp3_mad, *audio_buf, *audio_len));\n\t\t\tmad_stop(mp3_mad);\n#endif\n\t\t}\n\t}\n\n\tif (!err)\n\t{\n\t\t/* Don't return a buffer that isn't a multiple of samplesize */\n\t\tsamplesize = ((spec->format & 0xFF)/8)*spec->channels;\n\t\t*audio_len &= ~(samplesize-1);\n\t}\n\n#if defined(MP3_MUSIC)\n\tif (mp3)\n\t{\n\t\tsmpeg.SMPEG_delete(mp3); mp3 = NULL;\n\t\t/* Deleting the MP3 closed the source if desired */\n\t\tfreesrc = SDL_FALSE;\n\t}\n#elif defined(MP3_MAD_MUSIC)\n\tif (mp3_mad)\n\t{\n\t\tmad_closeFile(mp3_mad); mp3_mad = NULL;\n\t\t/* Deleting the MP3 closed the source if desired */\n\t\tfreesrc = SDL_FALSE;\n\t}\n#endif\n\n\tif (freesrc)\n\t{\n\t\tSDL_RWclose(src); src = NULL;\n\t}\n\n\t/* handle error */\n\tif (err)\n\t{\n\t\tif (*audio_buf != NULL)\n\t\t{\n\t\t\tSDL_free(*audio_buf); *audio_buf = NULL;\n\t\t}\n\t\t*audio_len = 0;\n\t\tspec = NULL;\n\t}\n\n\treturn spec;\n}\n\n#endif\n"
  },
  {
    "path": "libs/SDL2_mixer/src/load_ogg.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This is the source needed to decode an Ogg Vorbis into a waveform.\n  This file by Vaclav Slavik (vaclav.slavik@matfyz.cz).\n*/\n\n/* $Id$ */\n\n#ifdef OGG_MUSIC\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL_mutex.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_timer.h\"\n\n#include \"SDL_mixer.h\"\n#include \"dynamic_ogg.h\"\n#include \"load_ogg.h\"\n\nstatic size_t sdl_read_func(void *ptr, size_t size, size_t nmemb, void *datasource)\n{\n    return SDL_RWread((SDL_RWops*)datasource, ptr, size, nmemb);\n}\n\nstatic int sdl_seek_func(void *datasource, ogg_int64_t offset, int whence)\n{\n    return (int)SDL_RWseek((SDL_RWops*)datasource, offset, whence);\n}\n\nstatic int sdl_close_func_freesrc(void *datasource)\n{\n    return SDL_RWclose((SDL_RWops*)datasource);\n}\n\nstatic int sdl_close_func_nofreesrc(void *datasource)\n{\n    SDL_RWseek((SDL_RWops*)datasource, 0, RW_SEEK_SET);\n    return 0;\n}\n\nstatic long sdl_tell_func(void *datasource)\n{\n    return (long)SDL_RWtell((SDL_RWops*)datasource);\n}\n\n\n/* don't call this directly; use Mix_LoadWAV_RW() for now. */\nSDL_AudioSpec *Mix_LoadOGG_RW (SDL_RWops *src, int freesrc,\n        SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)\n{\n    OggVorbis_File vf;\n    ov_callbacks callbacks;\n    vorbis_info *info;\n    Uint8 *buf;\n    int bitstream = -1;\n    long samplesize;\n    long samples;\n    int read, to_read;\n    int must_close = 1;\n    int was_error = 1;\n\n    if ( (!src) || (!audio_buf) || (!audio_len) )   /* sanity checks. */\n        goto done;\n\n    if ( !Mix_Init(MIX_INIT_OGG) )\n        goto done;\n\n    callbacks.read_func = sdl_read_func;\n    callbacks.seek_func = sdl_seek_func;\n    callbacks.tell_func = sdl_tell_func;\n    callbacks.close_func = freesrc ?\n                           sdl_close_func_freesrc : sdl_close_func_nofreesrc;\n\n    if (vorbis.ov_open_callbacks(src, &vf, NULL, 0, callbacks) != 0)\n    {\n        SDL_SetError(\"OGG bitstream is not valid Vorbis stream!\");\n        goto done;\n    }\n\n    must_close = 0;\n\n    info = vorbis.ov_info(&vf, -1);\n\n    *audio_buf = NULL;\n    *audio_len = 0;\n    memset(spec, '\\0', sizeof (SDL_AudioSpec));\n\n    spec->format = AUDIO_S16;\n    spec->channels = info->channels;\n    spec->freq = info->rate;\n    spec->samples = 4096; /* buffer size */\n\n    samples = (long)vorbis.ov_pcm_total(&vf, -1);\n\n    *audio_len = spec->size = samples * spec->channels * 2;\n    *audio_buf = (Uint8 *)SDL_malloc(*audio_len);\n    if (*audio_buf == NULL)\n        goto done;\n\n    buf = *audio_buf;\n    to_read = *audio_len;\n#ifdef OGG_USE_TREMOR\n    for (read = vorbis.ov_read(&vf, (char *)buf, to_read, &bitstream);\n     read > 0;\n     read = vorbis.ov_read(&vf, (char *)buf, to_read, &bitstream))\n#else\n    for (read = vorbis.ov_read(&vf, (char *)buf, to_read, 0/*LE*/, 2/*16bit*/, 1/*signed*/, &bitstream);\n         read > 0;\n         read = vorbis.ov_read(&vf, (char *)buf, to_read, 0, 2, 1, &bitstream))\n#endif\n    {\n        if (read == OV_HOLE || read == OV_EBADLINK)\n            break; /* error */\n\n        to_read -= read;\n        buf += read;\n    }\n\n    vorbis.ov_clear(&vf);\n    was_error = 0;\n\n    /* Don't return a buffer that isn't a multiple of samplesize */\n    samplesize = ((spec->format & 0xFF)/8)*spec->channels;\n    *audio_len &= ~(samplesize-1);\n\ndone:\n    if (freesrc && src && must_close) {\n        SDL_RWclose(src);\n    }\n\n    if (was_error) {\n        spec = NULL;\n    }\n\n    return(spec);\n} /* Mix_LoadOGG_RW */\n\n/* end of load_ogg.c ... */\n\n#endif\n"
  },
  {
    "path": "libs/SDL2_mixer/src/load_voc.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This is the source needed to decode a Creative Labs VOC file into a\n  waveform. It's pretty straightforward once you get going. The only\n  externally-callable function is Mix_LoadVOC_RW(), which is meant to\n  act as identically to SDL_LoadWAV_RW() as possible.\n\n  This file by Ryan C. Gordon (icculus@icculus.org).\n\n  Heavily borrowed from sox v12.17.1's voc.c.\n        (http://www.freshmeat.net/projects/sox/)\n*/\n\n/* $Id$ */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL_mutex.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_timer.h\"\n\n#include \"SDL_mixer.h\"\n#include \"load_voc.h\"\n\n/* Private data for VOC file */\ntypedef struct vocstuff {\n    Uint32  rest;           /* bytes remaining in current block */\n    Uint32  rate;           /* rate code (byte) of this chunk */\n    int     silent;         /* sound or silence? */\n    Uint32  srate;          /* rate code (byte) of silence */\n    Uint32  blockseek;      /* start of current output block */\n    Uint32  samples;        /* number of samples output */\n    Uint32  size;           /* word length of data */\n    Uint8   channels;       /* number of sound channels */\n    int     has_extended;   /* Has an extended block been read? */\n} vs_t;\n\n/* Size field */\n/* SJB: note that the 1st 3 are sometimes used as sizeof(type) */\n#define ST_SIZE_BYTE    1\n#define ST_SIZE_8BIT    1\n#define ST_SIZE_WORD    2\n#define ST_SIZE_16BIT   2\n#define ST_SIZE_DWORD   4\n#define ST_SIZE_32BIT   4\n#define ST_SIZE_FLOAT   5\n#define ST_SIZE_DOUBLE  6\n#define ST_SIZE_IEEE    7   /* IEEE 80-bit floats. */\n\n/* Style field */\n#define ST_ENCODING_UNSIGNED    1 /* unsigned linear: Sound Blaster */\n#define ST_ENCODING_SIGN2       2 /* signed linear 2's comp: Mac */\n#define ST_ENCODING_ULAW        3 /* U-law signed logs: US telephony, SPARC */\n#define ST_ENCODING_ALAW        4 /* A-law signed logs: non-US telephony */\n#define ST_ENCODING_ADPCM       5 /* Compressed PCM */\n#define ST_ENCODING_IMA_ADPCM   6 /* Compressed PCM */\n#define ST_ENCODING_GSM         7 /* GSM 6.10 33-byte frame lossy compression */\n\n#define VOC_TERM        0\n#define VOC_DATA        1\n#define VOC_CONT        2\n#define VOC_SILENCE     3\n#define VOC_MARKER      4\n#define VOC_TEXT        5\n#define VOC_LOOP        6\n#define VOC_LOOPEND     7\n#define VOC_EXTENDED    8\n#define VOC_DATA_16     9\n\n\nstatic int voc_check_header(SDL_RWops *src)\n{\n    /* VOC magic header */\n    Uint8  signature[20];  /* \"Creative Voice File\\032\" */\n    Uint16 datablockofs;\n\n    SDL_RWseek(src, 0, RW_SEEK_SET);\n\n    if (SDL_RWread(src, signature, sizeof (signature), 1) != 1)\n        return(0);\n\n    if (memcmp(signature, \"Creative Voice File\\032\", sizeof (signature)) != 0) {\n        SDL_SetError(\"Unrecognized file type (not VOC)\");\n        return(0);\n    }\n\n        /* get the offset where the first datablock is located */\n    if (SDL_RWread(src, &datablockofs, sizeof (Uint16), 1) != 1)\n        return(0);\n\n    datablockofs = SDL_SwapLE16(datablockofs);\n\n    if (SDL_RWseek(src, datablockofs, RW_SEEK_SET) != datablockofs)\n        return(0);\n\n    return(1);  /* success! */\n} /* voc_check_header */\n\n\n/* Read next block header, save info, leave position at start of data */\nstatic int voc_get_block(SDL_RWops *src, vs_t *v, SDL_AudioSpec *spec)\n{\n    Uint8 bits24[3];\n    Uint8 uc, block;\n    Uint32 sblen;\n    Uint16 new_rate_short;\n    Uint32 new_rate_long;\n    Uint8 trash[6];\n    Uint16 period;\n    unsigned int i;\n\n    v->silent = 0;\n    while (v->rest == 0)\n    {\n        if (SDL_RWread(src, &block, sizeof (block), 1) != 1)\n            return 1;  /* assume that's the end of the file. */\n\n        if (block == VOC_TERM)\n            return 1;\n\n        if (SDL_RWread(src, bits24, sizeof (bits24), 1) != 1)\n            return 1;  /* assume that's the end of the file. */\n\n        /* Size is an 24-bit value. Ugh. */\n        sblen = ( (bits24[0]) | (bits24[1] << 8) | (bits24[2] << 16) );\n\n        switch(block)\n        {\n            case VOC_DATA:\n                if (SDL_RWread(src, &uc, sizeof (uc), 1) != 1)\n                    return 0;\n\n                /* When DATA block preceeded by an EXTENDED     */\n                /* block, the DATA blocks rate value is invalid */\n                if (!v->has_extended)\n                {\n                    if (uc == 0)\n                    {\n                        SDL_SetError(\"VOC Sample rate is zero?\");\n                        return 0;\n                    }\n\n                    if ((v->rate != -1) && (uc != v->rate))\n                    {\n                        SDL_SetError(\"VOC sample rate codes differ\");\n                        return 0;\n                    }\n\n                    v->rate = uc;\n                    spec->freq = (Uint16)(1000000.0/(256 - v->rate));\n                    v->channels = 1;\n                }\n\n                if (SDL_RWread(src, &uc, sizeof (uc), 1) != 1)\n                    return 0;\n\n                if (uc != 0)\n                {\n                    SDL_SetError(\"VOC decoder only interprets 8-bit data\");\n                    return 0;\n                }\n\n                v->has_extended = 0;\n                v->rest = sblen - 2;\n                v->size = ST_SIZE_BYTE;\n                return 1;\n\n            case VOC_DATA_16:\n                if (SDL_RWread(src, &new_rate_long, sizeof (new_rate_long), 1) != 1)\n                    return 0;\n                new_rate_long = SDL_SwapLE32(new_rate_long);\n                if (new_rate_long == 0)\n                {\n                    SDL_SetError(\"VOC Sample rate is zero?\");\n                    return 0;\n                }\n                if ((v->rate != -1) && (new_rate_long != v->rate))\n                {\n                    SDL_SetError(\"VOC sample rate codes differ\");\n                    return 0;\n                }\n                v->rate = new_rate_long;\n                spec->freq = new_rate_long;\n\n                if (SDL_RWread(src, &uc, sizeof (uc), 1) != 1)\n                    return 0;\n\n                switch (uc)\n                {\n                    case 8:  v->size = ST_SIZE_BYTE; break;\n                    case 16: v->size = ST_SIZE_WORD; break;\n                    default:\n                        SDL_SetError(\"VOC with unknown data size\");\n                        return 0;\n                }\n\n                if (SDL_RWread(src, &v->channels, sizeof (Uint8), 1) != 1)\n                    return 0;\n\n                if (SDL_RWread(src, trash, sizeof (Uint8), 6) != 6)\n                    return 0;\n\n                v->rest = sblen - 12;\n                return 1;\n\n            case VOC_CONT:\n                v->rest = sblen;\n                return 1;\n\n            case VOC_SILENCE:\n                if (SDL_RWread(src, &period, sizeof (period), 1) != 1)\n                    return 0;\n                period = SDL_SwapLE16(period);\n\n                if (SDL_RWread(src, &uc, sizeof (uc), 1) != 1)\n                    return 0;\n                if (uc == 0)\n                {\n                    SDL_SetError(\"VOC silence sample rate is zero\");\n                    return 0;\n                }\n\n                /*\n                 * Some silence-packed files have gratuitously\n                 * different sample rate codes in silence.\n                 * Adjust period.\n                 */\n                if ((v->rate != -1) && (uc != v->rate))\n                    period = (Uint16)((period * (256 - uc))/(256 - v->rate));\n                else\n                    v->rate = uc;\n                v->rest = period;\n                v->silent = 1;\n                return 1;\n\n            case VOC_LOOP:\n            case VOC_LOOPEND:\n                for(i = 0; i < sblen; i++)   /* skip repeat loops. */\n                {\n                    if (SDL_RWread(src, trash, sizeof (Uint8), 1) != 1)\n                        return 0;\n                }\n                break;\n\n            case VOC_EXTENDED:\n                /* An Extended block is followed by a data block */\n                /* Set this byte so we know to use the rate      */\n                /* value from the extended block and not the     */\n                /* data block.                     */\n                v->has_extended = 1;\n                if (SDL_RWread(src, &new_rate_short, sizeof (new_rate_short), 1) != 1)\n                    return 0;\n                new_rate_short = SDL_SwapLE16(new_rate_short);\n                if (new_rate_short == 0)\n                {\n                   SDL_SetError(\"VOC sample rate is zero\");\n                   return 0;\n                }\n                if ((v->rate != -1) && (new_rate_short != v->rate))\n                {\n                   SDL_SetError(\"VOC sample rate codes differ\");\n                   return 0;\n                }\n                v->rate = new_rate_short;\n\n                if (SDL_RWread(src, &uc, sizeof (uc), 1) != 1)\n                    return 0;\n\n                if (uc != 0)\n                {\n                    SDL_SetError(\"VOC decoder only interprets 8-bit data\");\n                    return 0;\n                }\n\n                if (SDL_RWread(src, &uc, sizeof (uc), 1) != 1)\n                    return 0;\n\n                if (uc)\n                    spec->channels = 2;  /* Stereo */\n                /* Needed number of channels before finishing\n                   compute for rate */\n                spec->freq = (256000000L/(65536L - v->rate))/spec->channels;\n                /* An extended block must be followed by a data */\n                /* block to be valid so loop back to top so it  */\n                /* can be grabed.                */\n                continue;\n\n            case VOC_MARKER:\n                if (SDL_RWread(src, trash, sizeof (Uint8), 2) != 2)\n                    return 0;\n\n                /* Falling! Falling! */\n\n            default:  /* text block or other krapola. */\n                for(i = 0; i < sblen; i++)\n                {\n                    if (SDL_RWread(src, &trash, sizeof (Uint8), 1) != 1)\n                        return 0;\n                }\n\n                if (block == VOC_TEXT)\n                    continue;    /* get next block */\n        }\n    }\n\n    return 1;\n}\n\n\nstatic int voc_read(SDL_RWops *src, vs_t *v, Uint8 *buf, SDL_AudioSpec *spec)\n{\n    int done = 0;\n    Uint8 silence = 0x80;\n\n    if (v->rest == 0)\n    {\n        if (!voc_get_block(src, v, spec))\n            return 0;\n    }\n\n    if (v->rest == 0)\n        return 0;\n\n    if (v->silent)\n    {\n        if (v->size == ST_SIZE_WORD)\n            silence = 0x00;\n\n        /* Fill in silence */\n        SDL_memset(buf, silence, v->rest);\n        done = v->rest;\n        v->rest = 0;\n    }\n\n    else\n    {\n        done = SDL_RWread(src, buf, 1, v->rest);\n        v->rest -= done;\n        if (v->size == ST_SIZE_WORD)\n        {\n            #if (SDL_BYTEORDER == SDL_BIG_ENDIAN)\n                Uint16 *samples = (Uint16 *)buf;\n                for (; v->rest > 0; v->rest -= 2)\n                {\n                    *samples = SDL_SwapLE16(*samples);\n                    samples++;\n                }\n            #endif\n            done >>= 1;\n        }\n    }\n\n    return done;\n} /* voc_read */\n\n\n/* don't call this directly; use Mix_LoadWAV_RW() for now. */\nSDL_AudioSpec *Mix_LoadVOC_RW (SDL_RWops *src, int freesrc,\n        SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)\n{\n    vs_t v;\n    int was_error = 1;\n    int samplesize;\n    Uint8 *fillptr;\n    void *ptr;\n\n    if ( (!src) || (!audio_buf) || (!audio_len) )   /* sanity checks. */\n        goto done;\n\n    if ( !voc_check_header(src) )\n        goto done;\n\n    v.rate = -1;\n    v.rest = 0;\n    v.has_extended = 0;\n    *audio_buf = NULL;\n    *audio_len = 0;\n    SDL_memset(spec, '\\0', sizeof (SDL_AudioSpec));\n\n    if (!voc_get_block(src, &v, spec))\n        goto done;\n\n    if (v.rate == -1)\n    {\n        SDL_SetError(\"VOC data had no sound!\");\n        goto done;\n    }\n\n    spec->format = ((v.size == ST_SIZE_WORD) ? AUDIO_S16 : AUDIO_U8);\n    if (spec->channels == 0)\n        spec->channels = v.channels;\n\n    *audio_len = v.rest;\n    *audio_buf = SDL_malloc(v.rest);\n    if (*audio_buf == NULL)\n        goto done;\n\n    fillptr = *audio_buf;\n\n    while (voc_read(src, &v, fillptr, spec) > 0)\n    {\n        if (!voc_get_block(src, &v, spec))\n            goto done;\n\n        *audio_len += v.rest;\n        ptr = SDL_realloc(*audio_buf, *audio_len);\n        if (ptr == NULL)\n        {\n            SDL_free(*audio_buf);\n            *audio_buf = NULL;\n            *audio_len = 0;\n            goto done;\n        }\n\n        *audio_buf = ptr;\n        fillptr = ((Uint8 *) ptr) + (*audio_len - v.rest);\n    }\n\n    spec->samples = (Uint16)(*audio_len / v.size);\n\n    was_error = 0;  /* success, baby! */\n\n    /* Don't return a buffer that isn't a multiple of samplesize */\n    samplesize = ((spec->format & 0xFF)/8)*spec->channels;\n    *audio_len &= ~(samplesize-1);\n\ndone:\n    if (freesrc && src) {\n        SDL_RWclose(src);\n    }\n\n    if (was_error) {\n        spec = NULL;\n    }\n\n    return(spec);\n} /* Mix_LoadVOC_RW */\n\n/* end of load_voc.c ... */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/mixer.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id$ */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL_mutex.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_timer.h\"\n\n#include \"SDL_mixer.h\"\n#include \"load_aiff.h\"\n#include \"load_voc.h\"\n#include \"load_mp3.h\"\n#include \"load_ogg.h\"\n#include \"load_flac.h\"\n#include \"dynamic_flac.h\"\n#include \"dynamic_fluidsynth.h\"\n#include \"dynamic_modplug.h\"\n#include \"dynamic_mod.h\"\n#include \"dynamic_mp3.h\"\n#include \"dynamic_ogg.h\"\n\n#define __MIX_INTERNAL_EFFECT__\n#include \"effects_internal.h\"\n\n/* Magic numbers for various audio file formats */\n#define RIFF        0x46464952      /* \"RIFF\" */\n#define WAVE        0x45564157      /* \"WAVE\" */\n#define FORM        0x4d524f46      /* \"FORM\" */\n#define OGGS        0x5367674f      /* \"OggS\" */\n#define CREA        0x61657243      /* \"Crea\" */\n#define FLAC        0x43614C66      /* \"fLaC\" */\n\nstatic int audio_opened = 0;\nstatic SDL_AudioSpec mixer;\n\ntypedef struct _Mix_effectinfo\n{\n    Mix_EffectFunc_t callback;\n    Mix_EffectDone_t done_callback;\n    void *udata;\n    struct _Mix_effectinfo *next;\n} effect_info;\n\nstatic struct _Mix_Channel {\n    Mix_Chunk *chunk;\n    int playing;\n    int paused;\n    Uint8 *samples;\n    int volume;\n    int looping;\n    int tag;\n    Uint32 expire;\n    Uint32 start_time;\n    Mix_Fading fading;\n    int fade_volume;\n    int fade_volume_reset;\n    Uint32 fade_length;\n    Uint32 ticks_fade;\n    effect_info *effects;\n} *mix_channel = NULL;\n\nstatic effect_info *posteffects = NULL;\n\nstatic int num_channels;\nstatic int reserved_channels = 0;\n\n\n/* Support for hooking into the mixer callback system */\nstatic void (*mix_postmix)(void *udata, Uint8 *stream, int len) = NULL;\nstatic void *mix_postmix_data = NULL;\n\n/* rcg07062001 callback to alert when channels are done playing. */\nstatic void (*channel_done_callback)(int channel) = NULL;\n\n/* Music function declarations */\nextern int open_music(SDL_AudioSpec *mixer);\nextern void close_music(void);\n\n/* Support for user defined music functions, plus the default one */\nextern int volatile music_active;\nextern void music_mixer(void *udata, Uint8 *stream, int len);\nstatic void (*mix_music)(void *udata, Uint8 *stream, int len) = music_mixer;\nstatic void *music_data = NULL;\n\n/* rcg06042009 report available decoders at runtime. */\nstatic const char **chunk_decoders = NULL;\nstatic int num_decoders = 0;\n\n/* Semicolon-separated SoundFont paths */\n#ifdef MID_MUSIC\nextern char* soundfont_paths;\n#endif\n\nint Mix_GetNumChunkDecoders(void)\n{\n    return(num_decoders);\n}\n\nconst char *Mix_GetChunkDecoder(int index)\n{\n    if ((index < 0) || (index >= num_decoders)) {\n        return NULL;\n    }\n    return(chunk_decoders[index]);\n}\n\nstatic void add_chunk_decoder(const char *decoder)\n{\n    void *ptr = SDL_realloc((void *)chunk_decoders, (num_decoders + 1) * sizeof (const char *));\n    if (ptr == NULL) {\n        return;  /* oh well, go on without it. */\n    }\n    chunk_decoders = (const char **) ptr;\n    chunk_decoders[num_decoders++] = decoder;\n}\n\n/* rcg06192001 get linked library's version. */\nconst SDL_version *Mix_Linked_Version(void)\n{\n    static SDL_version linked_version;\n    SDL_MIXER_VERSION(&linked_version);\n    return(&linked_version);\n}\n\nstatic int initialized = 0;\n\nint Mix_Init(int flags)\n{\n    int result = 0;\n\n    if (flags & MIX_INIT_FLUIDSYNTH) {\n#ifdef USE_FLUIDSYNTH_MIDI\n        if ((initialized & MIX_INIT_FLUIDSYNTH) || Mix_InitFluidSynth() == 0) {\n            result |= MIX_INIT_FLUIDSYNTH;\n        }\n#else\n        Mix_SetError(\"Mixer not built with FluidSynth support\");\n#endif\n    }\n    if (flags & MIX_INIT_FLAC) {\n#ifdef FLAC_MUSIC\n        if ((initialized & MIX_INIT_FLAC) || Mix_InitFLAC() == 0) {\n            result |= MIX_INIT_FLAC;\n        }\n#else\n        Mix_SetError(\"Mixer not built with FLAC support\");\n#endif\n    }\n    if (flags & MIX_INIT_MODPLUG) {\n#ifdef MODPLUG_MUSIC\n        if ((initialized & MIX_INIT_MODPLUG) || Mix_InitModPlug() == 0) {\n            result |= MIX_INIT_MODPLUG;\n        }\n#else\n        Mix_SetError(\"Mixer not built with MOD modplug support\");\n#endif\n    }\n    if (flags & MIX_INIT_MOD) {\n#ifdef MOD_MUSIC\n        if ((initialized & MIX_INIT_MOD) || Mix_InitMOD() == 0) {\n            result |= MIX_INIT_MOD;\n        }\n#else\n        Mix_SetError(\"Mixer not built with MOD mikmod support\");\n#endif\n    }\n    if (flags & MIX_INIT_MP3) {\n#ifdef MP3_MUSIC\n        if ((initialized & MIX_INIT_MP3) || Mix_InitMP3() == 0) {\n            result |= MIX_INIT_MP3;\n        }\n#elif defined(MP3_MAD_MUSIC)\n        result |= MIX_INIT_MP3;\n#else\n        Mix_SetError(\"Mixer not built with MP3 support\");\n#endif\n    }\n    if (flags & MIX_INIT_OGG) {\n#ifdef OGG_MUSIC\n        if ((initialized & MIX_INIT_OGG) || Mix_InitOgg() == 0) {\n            result |= MIX_INIT_OGG;\n        }\n#else\n        Mix_SetError(\"Mixer not built with Ogg Vorbis support\");\n#endif\n    }\n    initialized |= result;\n\n    return (result);\n}\n\nvoid Mix_Quit()\n{\n#ifdef USE_FLUIDSYNTH_MIDI\n    if (initialized & MIX_INIT_FLUIDSYNTH) {\n        Mix_QuitFluidSynth();\n    }\n#endif\n#ifdef FLAC_MUSIC\n    if (initialized & MIX_INIT_FLAC) {\n        Mix_QuitFLAC();\n    }\n#endif\n#ifdef MODPLUG_MUSIC\n    if (initialized & MIX_INIT_MODPLUG) {\n        Mix_QuitModPlug();\n    }\n#endif\n#ifdef MOD_MUSIC\n    if (initialized & MIX_INIT_MOD) {\n        Mix_QuitMOD();\n    }\n#endif\n#ifdef MP3_MUSIC\n    if (initialized & MIX_INIT_MP3) {\n        Mix_QuitMP3();\n    }\n#endif\n#ifdef OGG_MUSIC\n    if (initialized & MIX_INIT_OGG) {\n        Mix_QuitOgg();\n    }\n#endif\n#ifdef MID_MUSIC\n    if (soundfont_paths) {\n        SDL_free(soundfont_paths);\n        soundfont_paths = NULL;\n    }\n#endif\n    initialized = 0;\n}\n\nstatic int _Mix_remove_all_effects(int channel, effect_info **e);\n\n/*\n * rcg06122001 Cleanup effect callbacks.\n *  MAKE SURE SDL_LockAudio() is called before this (or you're in the\n *   audio callback).\n */\nstatic void _Mix_channel_done_playing(int channel)\n{\n    if (channel_done_callback) {\n        channel_done_callback(channel);\n    }\n\n    /*\n     * Call internal function directly, to avoid locking audio from\n     *   inside audio callback.\n     */\n    _Mix_remove_all_effects(channel, &mix_channel[channel].effects);\n}\n\n\nstatic void *Mix_DoEffects(int chan, void *snd, int len)\n{\n    int posteffect = (chan == MIX_CHANNEL_POST);\n    effect_info *e = ((posteffect) ? posteffects : mix_channel[chan].effects);\n    void *buf = snd;\n\n    if (e != NULL) {    /* are there any registered effects? */\n        /* if this is the postmix, we can just overwrite the original. */\n        if (!posteffect) {\n            buf = SDL_malloc(len);\n            if (buf == NULL) {\n                return(snd);\n            }\n            SDL_memcpy(buf, snd, len);\n        }\n\n        for (; e != NULL; e = e->next) {\n            if (e->callback != NULL) {\n                e->callback(chan, buf, len, e->udata);\n            }\n        }\n    }\n\n    /* be sure to SDL_free() the return value if != snd ... */\n    return(buf);\n}\n\n\n/* Mixing function */\nstatic void mix_channels(void *udata, Uint8 *stream, int len)\n{\n    Uint8 *mix_input;\n    int i, mixable, volume = SDL_MIX_MAXVOLUME;\n    Uint32 sdl_ticks;\n\n#if SDL_VERSION_ATLEAST(1, 3, 0)\n    /* Need to initialize the stream in SDL 1.3+ */\n    SDL_memset(stream, mixer.silence, len);\n#endif\n\n    /* Mix the music (must be done before the channels are added) */\n    if ( music_active || (mix_music != music_mixer) ) {\n        mix_music(music_data, stream, len);\n    }\n\n    /* Mix any playing channels... */\n    sdl_ticks = SDL_GetTicks();\n    for ( i=0; i<num_channels; ++i ) {\n        if ( !mix_channel[i].paused ) {\n            if ( mix_channel[i].expire > 0 && mix_channel[i].expire < sdl_ticks ) {\n                /* Expiration delay for that channel is reached */\n                mix_channel[i].playing = 0;\n                mix_channel[i].looping = 0;\n                mix_channel[i].fading = MIX_NO_FADING;\n                mix_channel[i].expire = 0;\n                _Mix_channel_done_playing(i);\n            } else if ( mix_channel[i].fading != MIX_NO_FADING ) {\n                Uint32 ticks = sdl_ticks - mix_channel[i].ticks_fade;\n                if ( ticks >= mix_channel[i].fade_length ) {\n                    Mix_Volume(i, mix_channel[i].fade_volume_reset); /* Restore the volume */\n                    if( mix_channel[i].fading == MIX_FADING_OUT ) {\n                        mix_channel[i].playing = 0;\n                        mix_channel[i].looping = 0;\n                        mix_channel[i].expire = 0;\n                        _Mix_channel_done_playing(i);\n                    }\n                    mix_channel[i].fading = MIX_NO_FADING;\n                } else {\n                    if ( mix_channel[i].fading == MIX_FADING_OUT ) {\n                        Mix_Volume(i, (mix_channel[i].fade_volume * (mix_channel[i].fade_length-ticks))\n                                   / mix_channel[i].fade_length );\n                    } else {\n                        Mix_Volume(i, (mix_channel[i].fade_volume * ticks) / mix_channel[i].fade_length );\n                    }\n                }\n            }\n            if ( mix_channel[i].playing > 0 ) {\n                int index = 0;\n                int remaining = len;\n                while (mix_channel[i].playing > 0 && index < len) {\n                    remaining = len - index;\n                    volume = (mix_channel[i].volume*mix_channel[i].chunk->volume) / MIX_MAX_VOLUME;\n                    mixable = mix_channel[i].playing;\n                    if ( mixable > remaining ) {\n                        mixable = remaining;\n                    }\n\n                    mix_input = Mix_DoEffects(i, mix_channel[i].samples, mixable);\n                    SDL_MixAudio(stream+index,mix_input,mixable,volume);\n                    if (mix_input != mix_channel[i].samples)\n                        SDL_free(mix_input);\n\n                    mix_channel[i].samples += mixable;\n                    mix_channel[i].playing -= mixable;\n                    index += mixable;\n\n                    /* rcg06072001 Alert app if channel is done playing. */\n                    if (!mix_channel[i].playing && !mix_channel[i].looping) {\n                        _Mix_channel_done_playing(i);\n                    }\n                }\n\n                /* If looping the sample and we are at its end, make sure\n                   we will still return a full buffer */\n                while ( mix_channel[i].looping && index < len ) {\n                    int alen = mix_channel[i].chunk->alen;\n                    remaining = len - index;\n                    if (remaining > alen) {\n                        remaining = alen;\n                    }\n\n                    mix_input = Mix_DoEffects(i, mix_channel[i].chunk->abuf, remaining);\n                    SDL_MixAudio(stream+index, mix_input, remaining, volume);\n                    if (mix_input != mix_channel[i].chunk->abuf)\n                        SDL_free(mix_input);\n\n                    if (mix_channel[i].looping > 0) {\n                        --mix_channel[i].looping;\n                    }\n                    mix_channel[i].samples = mix_channel[i].chunk->abuf + remaining;\n                    mix_channel[i].playing = mix_channel[i].chunk->alen - remaining;\n                    index += remaining;\n                }\n                if ( ! mix_channel[i].playing && mix_channel[i].looping ) {\n                    if (mix_channel[i].looping > 0) {\n                        --mix_channel[i].looping;\n                    }\n                    mix_channel[i].samples = mix_channel[i].chunk->abuf;\n                    mix_channel[i].playing = mix_channel[i].chunk->alen;\n                }\n            }\n        }\n    }\n\n    /* rcg06122001 run posteffects... */\n    Mix_DoEffects(MIX_CHANNEL_POST, stream, len);\n\n    if ( mix_postmix ) {\n        mix_postmix(mix_postmix_data, stream, len);\n    }\n}\n\n#if 0\nstatic void PrintFormat(char *title, SDL_AudioSpec *fmt)\n{\n    printf(\"%s: %d bit %s audio (%s) at %u Hz\\n\", title, (fmt->format&0xFF),\n            (fmt->format&0x8000) ? \"signed\" : \"unsigned\",\n            (fmt->channels > 2) ? \"surround\" :\n            (fmt->channels > 1) ? \"stereo\" : \"mono\", fmt->freq);\n}\n#endif\n\n\n/* Open the mixer with a certain desired audio format */\nint Mix_OpenAudio(int frequency, Uint16 format, int nchannels, int chunksize)\n{\n    int i;\n    SDL_AudioSpec desired;\n\n    /* If the mixer is already opened, increment open count */\n    if ( audio_opened ) {\n        if ( format == mixer.format && nchannels == mixer.channels ) {\n            ++audio_opened;\n            return(0);\n        }\n        while ( audio_opened ) {\n            Mix_CloseAudio();\n        }\n    }\n\n    /* Set the desired format and frequency */\n    desired.freq = frequency;\n    desired.format = format;\n    desired.channels = nchannels;\n    desired.samples = chunksize;\n    desired.callback = mix_channels;\n    desired.userdata = NULL;\n\n    /* Accept nearly any audio format */\n    if ( SDL_OpenAudio(&desired, &mixer) < 0 ) {\n        return(-1);\n    }\n#if 0\n    PrintFormat(\"Audio device\", &mixer);\n#endif\n\n    /* Initialize the music players */\n    if ( open_music(&mixer) < 0 ) {\n        SDL_CloseAudio();\n        return(-1);\n    }\n\n    num_channels = MIX_CHANNELS;\n    mix_channel = (struct _Mix_Channel *) SDL_malloc(num_channels * sizeof(struct _Mix_Channel));\n\n    /* Clear out the audio channels */\n    for ( i=0; i<num_channels; ++i ) {\n        mix_channel[i].chunk = NULL;\n        mix_channel[i].playing = 0;\n        mix_channel[i].looping = 0;\n        mix_channel[i].volume = SDL_MIX_MAXVOLUME;\n        mix_channel[i].fade_volume = SDL_MIX_MAXVOLUME;\n        mix_channel[i].fade_volume_reset = SDL_MIX_MAXVOLUME;\n        mix_channel[i].fading = MIX_NO_FADING;\n        mix_channel[i].tag = -1;\n        mix_channel[i].expire = 0;\n        mix_channel[i].effects = NULL;\n        mix_channel[i].paused = 0;\n    }\n    Mix_VolumeMusic(SDL_MIX_MAXVOLUME);\n\n    _Mix_InitEffects();\n\n    /* This list is (currently) decided at build time. */\n    add_chunk_decoder(\"WAVE\");\n    add_chunk_decoder(\"AIFF\");\n    add_chunk_decoder(\"VOC\");\n#ifdef OGG_MUSIC\n    add_chunk_decoder(\"OGG\");\n#endif\n#ifdef FLAC_MUSIC\n    add_chunk_decoder(\"FLAC\");\n#endif\n#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)\n    add_chunk_decoder(\"MP3\");\n#endif\n\n    audio_opened = 1;\n    SDL_PauseAudio(0);\n    return(0);\n}\n\n/* Dynamically change the number of channels managed by the mixer.\n   If decreasing the number of channels, the upper channels are\n   stopped.\n */\nint Mix_AllocateChannels(int numchans)\n{\n    if ( numchans<0 || numchans==num_channels )\n        return(num_channels);\n\n    if ( numchans < num_channels ) {\n        /* Stop the affected channels */\n        int i;\n        for(i=numchans; i < num_channels; i++) {\n            Mix_UnregisterAllEffects(i);\n            Mix_HaltChannel(i);\n        }\n    }\n    SDL_LockAudio();\n    mix_channel = (struct _Mix_Channel *) SDL_realloc(mix_channel, numchans * sizeof(struct _Mix_Channel));\n    if ( numchans > num_channels ) {\n        /* Initialize the new channels */\n        int i;\n        for(i=num_channels; i < numchans; i++) {\n            mix_channel[i].chunk = NULL;\n            mix_channel[i].playing = 0;\n            mix_channel[i].looping = 0;\n            mix_channel[i].volume = SDL_MIX_MAXVOLUME;\n            mix_channel[i].fade_volume = SDL_MIX_MAXVOLUME;\n            mix_channel[i].fade_volume_reset = SDL_MIX_MAXVOLUME;\n            mix_channel[i].fading = MIX_NO_FADING;\n            mix_channel[i].tag = -1;\n            mix_channel[i].expire = 0;\n            mix_channel[i].effects = NULL;\n            mix_channel[i].paused = 0;\n        }\n    }\n    num_channels = numchans;\n    SDL_UnlockAudio();\n    return(num_channels);\n}\n\n/* Return the actual mixer parameters */\nint Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)\n{\n    if ( audio_opened ) {\n        if ( frequency ) {\n            *frequency = mixer.freq;\n        }\n        if ( format ) {\n            *format = mixer.format;\n        }\n        if ( channels ) {\n            *channels = mixer.channels;\n        }\n    }\n    return(audio_opened);\n}\n\nstatic int detect_mp3(Uint8 *magic)\n{\n    if ( strncmp((char *)magic, \"ID3\", 3) == 0 ) {\n        return 1;\n    }\n\n    /* Detection code lifted from SMPEG */\n    if(((magic[0] & 0xff) != 0xff) || // No sync bits\n       ((magic[1] & 0xf0) != 0xf0) || //\n       ((magic[2] & 0xf0) == 0x00) || // Bitrate is 0\n       ((magic[2] & 0xf0) == 0xf0) || // Bitrate is 15\n       ((magic[2] & 0x0c) == 0x0c) || // Frequency is 3\n       ((magic[1] & 0x06) == 0x00)) { // Layer is 4\n        return(0);\n    }\n    return 1;\n}\n\n/* Load a wave file */\nMix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc)\n{\n    Uint32 magic;\n    Mix_Chunk *chunk;\n    SDL_AudioSpec wavespec, *loaded;\n    SDL_AudioCVT wavecvt;\n    int samplesize;\n\n    /* rcg06012001 Make sure src is valid */\n    if ( ! src ) {\n        SDL_SetError(\"Mix_LoadWAV_RW with NULL src\");\n        return(NULL);\n    }\n\n    /* Make sure audio has been opened */\n    if ( ! audio_opened ) {\n        SDL_SetError(\"Audio device hasn't been opened\");\n        if ( freesrc ) {\n            SDL_RWclose(src);\n        }\n        return(NULL);\n    }\n\n    /* Allocate the chunk memory */\n    chunk = (Mix_Chunk *)SDL_malloc(sizeof(Mix_Chunk));\n    if ( chunk == NULL ) {\n        SDL_SetError(\"Out of memory\");\n        if ( freesrc ) {\n            SDL_RWclose(src);\n        }\n        return(NULL);\n    }\n\n    /* Find out what kind of audio file this is */\n    magic = SDL_ReadLE32(src);\n    /* Seek backwards for compatibility with older loaders */\n    SDL_RWseek(src, -(int)sizeof(Uint32), RW_SEEK_CUR);\n\n    switch (magic) {\n        case WAVE:\n        case RIFF:\n            loaded = SDL_LoadWAV_RW(src, freesrc, &wavespec,\n                    (Uint8 **)&chunk->abuf, &chunk->alen);\n            break;\n        case FORM:\n            loaded = Mix_LoadAIFF_RW(src, freesrc, &wavespec,\n                    (Uint8 **)&chunk->abuf, &chunk->alen);\n            break;\n#ifdef OGG_MUSIC\n        case OGGS:\n            loaded = Mix_LoadOGG_RW(src, freesrc, &wavespec,\n                    (Uint8 **)&chunk->abuf, &chunk->alen);\n            break;\n#endif\n#ifdef FLAC_MUSIC\n        case FLAC:\n            loaded = Mix_LoadFLAC_RW(src, freesrc, &wavespec,\n                    (Uint8 **)&chunk->abuf, &chunk->alen);\n            break;\n#endif\n        case CREA:\n            loaded = Mix_LoadVOC_RW(src, freesrc, &wavespec,\n                    (Uint8 **)&chunk->abuf, &chunk->alen);\n            break;\n        default:\n#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)\n\t\t\tif (detect_mp3((Uint8*)&magic))\n\t\t\t{\n\t\t\t\t/* note: send a copy of the mixer spec */\n\t\t\t\twavespec = mixer;\n\t\t\t\tloaded = Mix_LoadMP3_RW(src, freesrc, &wavespec,\n\t\t\t\t\t\t(Uint8 **)&chunk->abuf, &chunk->alen);\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n            SDL_SetError(\"Unrecognized sound file type\");\n            if ( freesrc ) {\n                SDL_RWclose(src);\n            }\n            loaded = NULL;\n            break;\n    }\n    if ( !loaded ) {\n        /* The individual loaders have closed src if needed */\n        SDL_free(chunk);\n        return(NULL);\n    }\n\n#if 0\n    PrintFormat(\"Audio device\", &mixer);\n    PrintFormat(\"-- Wave file\", &wavespec);\n#endif\n\n    /* Build the audio converter and create conversion buffers */\n    if ( wavespec.format != mixer.format ||\n         wavespec.channels != mixer.channels ||\n         wavespec.freq != mixer.freq ) {\n        if ( SDL_BuildAudioCVT(&wavecvt,\n                wavespec.format, wavespec.channels, wavespec.freq,\n                mixer.format, mixer.channels, mixer.freq) < 0 ) {\n            SDL_free(chunk->abuf);\n            SDL_free(chunk);\n            return(NULL);\n        }\n        samplesize = ((wavespec.format & 0xFF)/8)*wavespec.channels;\n        wavecvt.len = chunk->alen & ~(samplesize-1);\n        wavecvt.buf = (Uint8 *)SDL_calloc(1, wavecvt.len*wavecvt.len_mult);\n        if ( wavecvt.buf == NULL ) {\n            SDL_SetError(\"Out of memory\");\n            SDL_free(chunk->abuf);\n            SDL_free(chunk);\n            return(NULL);\n        }\n        SDL_memcpy(wavecvt.buf, chunk->abuf, chunk->alen);\n        SDL_free(chunk->abuf);\n\n        /* Run the audio converter */\n        if ( SDL_ConvertAudio(&wavecvt) < 0 ) {\n            SDL_free(wavecvt.buf);\n            SDL_free(chunk);\n            return(NULL);\n        }\n\n        chunk->abuf = wavecvt.buf;\n        chunk->alen = wavecvt.len_cvt;\n    }\n\n    chunk->allocated = 1;\n    chunk->volume = MIX_MAX_VOLUME;\n\n    return(chunk);\n}\n\n/* Load a wave file of the mixer format from a memory buffer */\nMix_Chunk *Mix_QuickLoad_WAV(Uint8 *mem)\n{\n    Mix_Chunk *chunk;\n    Uint8 magic[4];\n\n    /* Make sure audio has been opened */\n    if ( ! audio_opened ) {\n        SDL_SetError(\"Audio device hasn't been opened\");\n        return(NULL);\n    }\n\n    /* Allocate the chunk memory */\n    chunk = (Mix_Chunk *)SDL_calloc(1,sizeof(Mix_Chunk));\n    if ( chunk == NULL ) {\n        SDL_SetError(\"Out of memory\");\n        return(NULL);\n    }\n\n    /* Essentially just skip to the audio data (no error checking - fast) */\n    chunk->allocated = 0;\n    mem += 12; /* WAV header */\n    do {\n        SDL_memcpy(magic, mem, 4);\n        mem += 4;\n        chunk->alen = ((mem[3]<<24)|(mem[2]<<16)|(mem[1]<<8)|(mem[0]));\n        mem += 4;\n        chunk->abuf = mem;\n        mem += chunk->alen;\n    } while ( memcmp(magic, \"data\", 4) != 0 );\n    chunk->volume = MIX_MAX_VOLUME;\n\n    return(chunk);\n}\n\n/* Load raw audio data of the mixer format from a memory buffer */\nMix_Chunk *Mix_QuickLoad_RAW(Uint8 *mem, Uint32 len)\n{\n    Mix_Chunk *chunk;\n\n    /* Make sure audio has been opened */\n    if ( ! audio_opened ) {\n        SDL_SetError(\"Audio device hasn't been opened\");\n        return(NULL);\n    }\n\n    /* Allocate the chunk memory */\n    chunk = (Mix_Chunk *)SDL_malloc(sizeof(Mix_Chunk));\n    if ( chunk == NULL ) {\n        SDL_SetError(\"Out of memory\");\n        return(NULL);\n    }\n\n    /* Essentially just point at the audio data (no error checking - fast) */\n    chunk->allocated = 0;\n    chunk->alen = len;\n    chunk->abuf = mem;\n    chunk->volume = MIX_MAX_VOLUME;\n\n    return(chunk);\n}\n\n/* Free an audio chunk previously loaded */\nvoid Mix_FreeChunk(Mix_Chunk *chunk)\n{\n    int i;\n\n    /* Caution -- if the chunk is playing, the mixer will crash */\n    if ( chunk ) {\n        /* Guarantee that this chunk isn't playing */\n        SDL_LockAudio();\n        if ( mix_channel ) {\n            for ( i=0; i<num_channels; ++i ) {\n                if ( chunk == mix_channel[i].chunk ) {\n                    mix_channel[i].playing = 0;\n                    mix_channel[i].looping = 0;\n                }\n            }\n        }\n        SDL_UnlockAudio();\n        /* Actually free the chunk */\n        if ( chunk->allocated ) {\n            SDL_free(chunk->abuf);\n        }\n        SDL_free(chunk);\n    }\n}\n\n/* Set a function that is called after all mixing is performed.\n   This can be used to provide real-time visual display of the audio stream\n   or add a custom mixer filter for the stream data.\n*/\nvoid Mix_SetPostMix(void (*mix_func)\n                    (void *udata, Uint8 *stream, int len), void *arg)\n{\n    SDL_LockAudio();\n    mix_postmix_data = arg;\n    mix_postmix = mix_func;\n    SDL_UnlockAudio();\n}\n\n/* Add your own music player or mixer function.\n   If 'mix_func' is NULL, the default music player is re-enabled.\n */\nvoid Mix_HookMusic(void (*mix_func)(void *udata, Uint8 *stream, int len),\n                                                                void *arg)\n{\n    SDL_LockAudio();\n    if ( mix_func != NULL ) {\n        music_data = arg;\n        mix_music = mix_func;\n    } else {\n        music_data = NULL;\n        mix_music = music_mixer;\n    }\n    SDL_UnlockAudio();\n}\n\nvoid *Mix_GetMusicHookData(void)\n{\n    return(music_data);\n}\n\nvoid Mix_ChannelFinished(void (*channel_finished)(int channel))\n{\n    SDL_LockAudio();\n    channel_done_callback = channel_finished;\n    SDL_UnlockAudio();\n}\n\n\n/* Reserve the first channels (0 -> n-1) for the application, i.e. don't allocate\n   them dynamically to the next sample if requested with a -1 value below.\n   Returns the number of reserved channels.\n */\nint Mix_ReserveChannels(int num)\n{\n    if (num > num_channels)\n        num = num_channels;\n    reserved_channels = num;\n    return num;\n}\n\nstatic int checkchunkintegral(Mix_Chunk *chunk)\n{\n    int frame_width = 1;\n\n    if ((mixer.format & 0xFF) == 16) frame_width = 2;\n    frame_width *= mixer.channels;\n    while (chunk->alen % frame_width) chunk->alen--;\n    return chunk->alen;\n}\n\n/* Play an audio chunk on a specific channel.\n   If the specified channel is -1, play on the first free channel.\n   'ticks' is the number of milliseconds at most to play the sample, or -1\n   if there is no limit.\n   Returns which channel was used to play the sound.\n*/\nint Mix_PlayChannelTimed(int which, Mix_Chunk *chunk, int loops, int ticks)\n{\n    int i;\n\n    /* Don't play null pointers :-) */\n    if ( chunk == NULL ) {\n        Mix_SetError(\"Tried to play a NULL chunk\");\n        return(-1);\n    }\n    if ( !checkchunkintegral(chunk)) {\n        Mix_SetError(\"Tried to play a chunk with a bad frame\");\n        return(-1);\n    }\n\n    /* Lock the mixer while modifying the playing channels */\n    SDL_LockAudio();\n    {\n        /* If which is -1, play on the first free channel */\n        if ( which == -1 ) {\n            for ( i=reserved_channels; i<num_channels; ++i ) {\n                if ( mix_channel[i].playing <= 0 )\n                    break;\n            }\n            if ( i == num_channels ) {\n                Mix_SetError(\"No free channels available\");\n                which = -1;\n            } else {\n                which = i;\n            }\n        }\n\n        /* Queue up the audio data for this channel */\n        if ( which >= 0 && which < num_channels ) {\n            Uint32 sdl_ticks = SDL_GetTicks();\n            if (Mix_Playing(which))\n                _Mix_channel_done_playing(which);\n            mix_channel[which].samples = chunk->abuf;\n            mix_channel[which].playing = chunk->alen;\n            mix_channel[which].looping = loops;\n            mix_channel[which].chunk = chunk;\n            mix_channel[which].paused = 0;\n            mix_channel[which].fading = MIX_NO_FADING;\n            mix_channel[which].start_time = sdl_ticks;\n            mix_channel[which].expire = (ticks>0) ? (sdl_ticks + ticks) : 0;\n        }\n    }\n    SDL_UnlockAudio();\n\n    /* Return the channel on which the sound is being played */\n    return(which);\n}\n\n/* Change the expiration delay for a channel */\nint Mix_ExpireChannel(int which, int ticks)\n{\n    int status = 0;\n\n    if ( which == -1 ) {\n        int i;\n        for ( i=0; i < num_channels; ++ i ) {\n            status += Mix_ExpireChannel(i, ticks);\n        }\n    } else if ( which < num_channels ) {\n        SDL_LockAudio();\n        mix_channel[which].expire = (ticks>0) ? (SDL_GetTicks() + ticks) : 0;\n        SDL_UnlockAudio();\n        ++ status;\n    }\n    return(status);\n}\n\n/* Fade in a sound on a channel, over ms milliseconds */\nint Mix_FadeInChannelTimed(int which, Mix_Chunk *chunk, int loops, int ms, int ticks)\n{\n    int i;\n\n    /* Don't play null pointers :-) */\n    if ( chunk == NULL ) {\n        return(-1);\n    }\n    if ( !checkchunkintegral(chunk)) {\n        Mix_SetError(\"Tried to play a chunk with a bad frame\");\n        return(-1);\n    }\n\n    /* Lock the mixer while modifying the playing channels */\n    SDL_LockAudio();\n    {\n        /* If which is -1, play on the first free channel */\n        if ( which == -1 ) {\n            for ( i=reserved_channels; i<num_channels; ++i ) {\n                if ( mix_channel[i].playing <= 0 )\n                    break;\n            }\n            if ( i == num_channels ) {\n                which = -1;\n            } else {\n                which = i;\n            }\n        }\n\n        /* Queue up the audio data for this channel */\n        if ( which >= 0 && which < num_channels ) {\n            Uint32 sdl_ticks = SDL_GetTicks();\n            if (Mix_Playing(which))\n                _Mix_channel_done_playing(which);\n            mix_channel[which].samples = chunk->abuf;\n            mix_channel[which].playing = chunk->alen;\n            mix_channel[which].looping = loops;\n            mix_channel[which].chunk = chunk;\n            mix_channel[which].paused = 0;\n            mix_channel[which].fading = MIX_FADING_IN;\n            mix_channel[which].fade_volume = mix_channel[which].volume;\n            mix_channel[which].fade_volume_reset = mix_channel[which].volume;\n            mix_channel[which].volume = 0;\n            mix_channel[which].fade_length = (Uint32)ms;\n            mix_channel[which].start_time = mix_channel[which].ticks_fade = sdl_ticks;\n            mix_channel[which].expire = (ticks > 0) ? (sdl_ticks+ticks) : 0;\n        }\n    }\n    SDL_UnlockAudio();\n\n    /* Return the channel on which the sound is being played */\n    return(which);\n}\n\n/* Set volume of a particular channel */\nint Mix_Volume(int which, int volume)\n{\n    int i;\n    int prev_volume = 0;\n\n    if ( which == -1 ) {\n        for ( i=0; i<num_channels; ++i ) {\n            prev_volume += Mix_Volume(i, volume);\n        }\n        prev_volume /= num_channels;\n    } else if ( which < num_channels ) {\n        prev_volume = mix_channel[which].volume;\n        if ( volume >= 0 ) {\n            if ( volume > SDL_MIX_MAXVOLUME ) {\n                volume = SDL_MIX_MAXVOLUME;\n            }\n            mix_channel[which].volume = volume;\n        }\n    }\n    return(prev_volume);\n}\n/* Set volume of a particular chunk */\nint Mix_VolumeChunk(Mix_Chunk *chunk, int volume)\n{\n    int prev_volume;\n\n    prev_volume = chunk->volume;\n    if ( volume >= 0 ) {\n        if ( volume > MIX_MAX_VOLUME ) {\n            volume = MIX_MAX_VOLUME;\n        }\n        chunk->volume = volume;\n    }\n    return(prev_volume);\n}\n\n/* Halt playing of a particular channel */\nint Mix_HaltChannel(int which)\n{\n    int i;\n\n    if ( which == -1 ) {\n        for ( i=0; i<num_channels; ++i ) {\n            Mix_HaltChannel(i);\n        }\n    } else if ( which < num_channels ) {\n        SDL_LockAudio();\n        if (mix_channel[which].playing) {\n            _Mix_channel_done_playing(which);\n            mix_channel[which].playing = 0;\n            mix_channel[which].looping = 0;\n        }\n        mix_channel[which].expire = 0;\n        if(mix_channel[which].fading != MIX_NO_FADING) /* Restore volume */\n            mix_channel[which].volume = mix_channel[which].fade_volume_reset;\n        mix_channel[which].fading = MIX_NO_FADING;\n        SDL_UnlockAudio();\n    }\n    return(0);\n}\n\n/* Halt playing of a particular group of channels */\nint Mix_HaltGroup(int tag)\n{\n    int i;\n\n    for ( i=0; i<num_channels; ++i ) {\n        if( mix_channel[i].tag == tag ) {\n            Mix_HaltChannel(i);\n        }\n    }\n    return(0);\n}\n\n/* Fade out a channel and then stop it automatically */\nint Mix_FadeOutChannel(int which, int ms)\n{\n    int status;\n\n    status = 0;\n    if ( audio_opened ) {\n        if ( which == -1 ) {\n            int i;\n\n            for ( i=0; i<num_channels; ++i ) {\n                status += Mix_FadeOutChannel(i, ms);\n            }\n        } else if ( which < num_channels ) {\n            SDL_LockAudio();\n            if ( mix_channel[which].playing &&\n                (mix_channel[which].volume > 0) &&\n                (mix_channel[which].fading != MIX_FADING_OUT) ) {\n                mix_channel[which].fade_volume = mix_channel[which].volume;\n                mix_channel[which].fading = MIX_FADING_OUT;\n                mix_channel[which].fade_length = (Uint32)ms;\n                mix_channel[which].ticks_fade = SDL_GetTicks();\n\n                /* only change fade_volume_reset if we're not fading. */\n                if (mix_channel[which].fading == MIX_NO_FADING) {\n                    mix_channel[which].fade_volume_reset = mix_channel[which].volume;\n                }\n                ++status;\n            }\n            SDL_UnlockAudio();\n        }\n    }\n    return(status);\n}\n\n/* Halt playing of a particular group of channels */\nint Mix_FadeOutGroup(int tag, int ms)\n{\n    int i;\n    int status = 0;\n    for ( i=0; i<num_channels; ++i ) {\n        if( mix_channel[i].tag == tag ) {\n            status += Mix_FadeOutChannel(i,ms);\n        }\n    }\n    return(status);\n}\n\nMix_Fading Mix_FadingChannel(int which)\n{\n    if ( which < 0 || which >= num_channels ) {\n        return MIX_NO_FADING;\n    }\n    return mix_channel[which].fading;\n}\n\n/* Check the status of a specific channel.\n   If the specified mix_channel is -1, check all mix channels.\n*/\nint Mix_Playing(int which)\n{\n    int status;\n\n    status = 0;\n    if ( which == -1 ) {\n        int i;\n\n        for ( i=0; i<num_channels; ++i ) {\n            if ((mix_channel[i].playing > 0) ||\n                mix_channel[i].looping)\n            {\n                ++status;\n            }\n        }\n    } else if ( which < num_channels ) {\n        if ( (mix_channel[which].playing > 0) ||\n             mix_channel[which].looping )\n        {\n            ++status;\n        }\n    }\n    return(status);\n}\n\n/* rcg06072001 Get the chunk associated with a channel. */\nMix_Chunk *Mix_GetChunk(int channel)\n{\n    Mix_Chunk *retval = NULL;\n\n    if ((channel >= 0) && (channel < num_channels)) {\n        retval = mix_channel[channel].chunk;\n    }\n\n    return(retval);\n}\n\n/* Close the mixer, halting all playing audio */\nvoid Mix_CloseAudio(void)\n{\n    int i;\n\n    if ( audio_opened ) {\n        if ( audio_opened == 1 ) {\n            for (i = 0; i < num_channels; i++) {\n                Mix_UnregisterAllEffects(i);\n            }\n            Mix_UnregisterAllEffects(MIX_CHANNEL_POST);\n            close_music();\n            Mix_HaltChannel(-1);\n            _Mix_DeinitEffects();\n            SDL_CloseAudio();\n            SDL_free(mix_channel);\n            mix_channel = NULL;\n\n            /* rcg06042009 report available decoders at runtime. */\n            SDL_free((void *)chunk_decoders);\n            chunk_decoders = NULL;\n            num_decoders = 0;\n        }\n        --audio_opened;\n    }\n}\n\n/* Pause a particular channel (or all) */\nvoid Mix_Pause(int which)\n{\n    Uint32 sdl_ticks = SDL_GetTicks();\n    if ( which == -1 ) {\n        int i;\n\n        for ( i=0; i<num_channels; ++i ) {\n            if ( mix_channel[i].playing > 0 ) {\n                mix_channel[i].paused = sdl_ticks;\n            }\n        }\n    } else if ( which < num_channels ) {\n        if ( mix_channel[which].playing > 0 ) {\n            mix_channel[which].paused = sdl_ticks;\n        }\n    }\n}\n\n/* Resume a paused channel */\nvoid Mix_Resume(int which)\n{\n    Uint32 sdl_ticks = SDL_GetTicks();\n\n    SDL_LockAudio();\n    if ( which == -1 ) {\n        int i;\n\n        for ( i=0; i<num_channels; ++i ) {\n            if ( mix_channel[i].playing > 0 ) {\n                if(mix_channel[i].expire > 0)\n                    mix_channel[i].expire += sdl_ticks - mix_channel[i].paused;\n                mix_channel[i].paused = 0;\n            }\n        }\n    } else if ( which < num_channels ) {\n        if ( mix_channel[which].playing > 0 ) {\n            if(mix_channel[which].expire > 0)\n                mix_channel[which].expire += sdl_ticks - mix_channel[which].paused;\n            mix_channel[which].paused = 0;\n        }\n    }\n    SDL_UnlockAudio();\n}\n\nint Mix_Paused(int which)\n{\n    if ( which < 0 ) {\n        int status = 0;\n        int i;\n        for( i=0; i < num_channels; ++i ) {\n            if ( mix_channel[i].paused ) {\n                ++ status;\n            }\n        }\n        return(status);\n    } else if ( which < num_channels ) {\n        return(mix_channel[which].paused != 0);\n    } else {\n        return(0);\n    }\n}\n\n/* Change the group of a channel */\nint Mix_GroupChannel(int which, int tag)\n{\n    if ( which < 0 || which > num_channels )\n        return(0);\n\n    SDL_LockAudio();\n    mix_channel[which].tag = tag;\n    SDL_UnlockAudio();\n    return(1);\n}\n\n/* Assign several consecutive channels to a group */\nint Mix_GroupChannels(int from, int to, int tag)\n{\n    int status = 0;\n    for( ; from <= to; ++ from ) {\n        status += Mix_GroupChannel(from, tag);\n    }\n    return(status);\n}\n\n/* Finds the first available channel in a group of channels */\nint Mix_GroupAvailable(int tag)\n{\n    int i;\n    for( i=0; i < num_channels; i ++ ) {\n        if ( ((tag == -1) || (tag == mix_channel[i].tag)) &&\n                            (mix_channel[i].playing <= 0) )\n            return i;\n    }\n    return(-1);\n}\n\nint Mix_GroupCount(int tag)\n{\n    int count = 0;\n    int i;\n    for( i=0; i < num_channels; i ++ ) {\n        if ( mix_channel[i].tag==tag || tag==-1 )\n            ++ count;\n    }\n    return(count);\n}\n\n/* Finds the \"oldest\" sample playing in a group of channels */\nint Mix_GroupOldest(int tag)\n{\n    int chan = -1;\n    Uint32 mintime = SDL_GetTicks();\n    int i;\n    for( i=0; i < num_channels; i ++ ) {\n        if ( (mix_channel[i].tag==tag || tag==-1) && mix_channel[i].playing > 0\n             && mix_channel[i].start_time <= mintime ) {\n            mintime = mix_channel[i].start_time;\n            chan = i;\n        }\n    }\n    return(chan);\n}\n\n/* Finds the \"most recent\" (i.e. last) sample playing in a group of channels */\nint Mix_GroupNewer(int tag)\n{\n    int chan = -1;\n    Uint32 maxtime = 0;\n    int i;\n    for( i=0; i < num_channels; i ++ ) {\n        if ( (mix_channel[i].tag==tag || tag==-1) && mix_channel[i].playing > 0\n             && mix_channel[i].start_time >= maxtime ) {\n            maxtime = mix_channel[i].start_time;\n            chan = i;\n        }\n    }\n    return(chan);\n}\n\n\n\n/*\n * rcg06122001 The special effects exportable API.\n *  Please see effect_*.c for internally-implemented effects, such\n *  as Mix_SetPanning().\n */\n\n/* MAKE SURE you hold the audio lock (SDL_LockAudio()) before calling this! */\nstatic int _Mix_register_effect(effect_info **e, Mix_EffectFunc_t f,\n                Mix_EffectDone_t d, void *arg)\n{\n    effect_info *new_e;\n\n    if (!e) {\n        Mix_SetError(\"Internal error\");\n        return(0);\n    }\n\n    if (f == NULL) {\n        Mix_SetError(\"NULL effect callback\");\n        return(0);\n    }\n\n    new_e = SDL_malloc(sizeof (effect_info));\n    if (new_e == NULL) {\n        Mix_SetError(\"Out of memory\");\n        return(0);\n    }\n\n    new_e->callback = f;\n    new_e->done_callback = d;\n    new_e->udata = arg;\n    new_e->next = NULL;\n\n    /* add new effect to end of linked list... */\n    if (*e == NULL) {\n        *e = new_e;\n    } else {\n        effect_info *cur = *e;\n        while (1) {\n            if (cur->next == NULL) {\n                cur->next = new_e;\n                break;\n            }\n            cur = cur->next;\n        }\n    }\n\n    return(1);\n}\n\n\n/* MAKE SURE you hold the audio lock (SDL_LockAudio()) before calling this! */\nstatic int _Mix_remove_effect(int channel, effect_info **e, Mix_EffectFunc_t f)\n{\n    effect_info *cur;\n    effect_info *prev = NULL;\n    effect_info *next = NULL;\n\n    if (!e) {\n        Mix_SetError(\"Internal error\");\n        return(0);\n    }\n\n    for (cur = *e; cur != NULL; cur = cur->next) {\n        if (cur->callback == f) {\n            next = cur->next;\n            if (cur->done_callback != NULL) {\n                cur->done_callback(channel, cur->udata);\n            }\n            SDL_free(cur);\n\n            if (prev == NULL) {   /* removing first item of list? */\n                *e = next;\n            } else {\n                prev->next = next;\n            }\n            return(1);\n        }\n        prev = cur;\n    }\n\n    Mix_SetError(\"No such effect registered\");\n    return(0);\n}\n\n\n/* MAKE SURE you hold the audio lock (SDL_LockAudio()) before calling this! */\nstatic int _Mix_remove_all_effects(int channel, effect_info **e)\n{\n    effect_info *cur;\n    effect_info *next;\n\n    if (!e) {\n        Mix_SetError(\"Internal error\");\n        return(0);\n    }\n\n    for (cur = *e; cur != NULL; cur = next) {\n        next = cur->next;\n        if (cur->done_callback != NULL) {\n            cur->done_callback(channel, cur->udata);\n        }\n        SDL_free(cur);\n    }\n    *e = NULL;\n\n    return(1);\n}\n\n\n/* MAKE SURE you hold the audio lock (SDL_LockAudio()) before calling this! */\nint _Mix_RegisterEffect_locked(int channel, Mix_EffectFunc_t f,\n            Mix_EffectDone_t d, void *arg)\n{\n    effect_info **e = NULL;\n\n    if (channel == MIX_CHANNEL_POST) {\n        e = &posteffects;\n    } else {\n        if ((channel < 0) || (channel >= num_channels)) {\n            Mix_SetError(\"Invalid channel number\");\n            return(0);\n        }\n        e = &mix_channel[channel].effects;\n    }\n\n    return _Mix_register_effect(e, f, d, arg);\n}\n\nint Mix_RegisterEffect(int channel, Mix_EffectFunc_t f,\n            Mix_EffectDone_t d, void *arg)\n{\n    int retval;\n    SDL_LockAudio();\n    retval = _Mix_RegisterEffect_locked(channel, f, d, arg);\n    SDL_UnlockAudio();\n    return retval;\n}\n\n\n/* MAKE SURE you hold the audio lock (SDL_LockAudio()) before calling this! */\nint _Mix_UnregisterEffect_locked(int channel, Mix_EffectFunc_t f)\n{\n    effect_info **e = NULL;\n\n    if (channel == MIX_CHANNEL_POST) {\n        e = &posteffects;\n    } else {\n        if ((channel < 0) || (channel >= num_channels)) {\n            Mix_SetError(\"Invalid channel number\");\n            return(0);\n        }\n        e = &mix_channel[channel].effects;\n    }\n\n    return _Mix_remove_effect(channel, e, f);\n}\n\nint Mix_UnregisterEffect(int channel, Mix_EffectFunc_t f)\n{\n    int retval;\n    SDL_LockAudio();\n    retval = _Mix_UnregisterEffect_locked(channel, f);\n    SDL_UnlockAudio();\n    return(retval);\n}\n\n/* MAKE SURE you hold the audio lock (SDL_LockAudio()) before calling this! */\nint _Mix_UnregisterAllEffects_locked(int channel)\n{\n    effect_info **e = NULL;\n\n    if (channel == MIX_CHANNEL_POST) {\n        e = &posteffects;\n    } else {\n        if ((channel < 0) || (channel >= num_channels)) {\n            Mix_SetError(\"Invalid channel number\");\n            return(0);\n        }\n        e = &mix_channel[channel].effects;\n    }\n\n    return _Mix_remove_all_effects(channel, e);\n}\n\nint Mix_UnregisterAllEffects(int channel)\n{\n    int retval;\n    SDL_LockAudio();\n    retval = _Mix_UnregisterAllEffects_locked(channel);\n    SDL_UnlockAudio();\n    return(retval);\n}\n\n/* end of mixer.c ... */\n\n"
  },
  {
    "path": "libs/SDL2_mixer/src/music.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id$ */\n\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <assert.h>\n#include \"SDL_endian.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_timer.h\"\n\n#include \"SDL_mixer.h\"\n\n#ifdef CMD_MUSIC\n#include \"music_cmd.h\"\n#endif\n#ifdef WAV_MUSIC\n#include \"wavestream.h\"\n#endif\n#ifdef MODPLUG_MUSIC\n#include \"music_modplug.h\"\n#endif\n#ifdef MOD_MUSIC\n#include \"music_mod.h\"\n#endif\n#ifdef MID_MUSIC\n#  ifdef USE_TIMIDITY_MIDI\n#    include \"timidity.h\"\n#  endif\n#  ifdef USE_FLUIDSYNTH_MIDI\n#    include \"fluidsynth.h\"\n#  endif\n#  ifdef USE_NATIVE_MIDI\n#    include \"native_midi.h\"\n#  endif\n#endif\n#ifdef OGG_MUSIC\n#include \"music_ogg.h\"\n#endif\n#ifdef MP3_MUSIC\n#include \"dynamic_mp3.h\"\n#endif\n#ifdef MP3_MAD_MUSIC\n#include \"music_mad.h\"\n#endif\n#ifdef FLAC_MUSIC\n#include \"music_flac.h\"\n#endif\n\n#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)\nstatic SDL_AudioSpec used_mixer;\n#endif\n\n\nint volatile music_active = 1;\nstatic int volatile music_stopped = 0;\nstatic int music_loops = 0;\nstatic char *music_cmd = NULL;\nstatic Mix_Music * volatile music_playing = NULL;\nstatic int music_volume = MIX_MAX_VOLUME;\n\nstruct _Mix_Music {\n    Mix_MusicType type;\n    union {\n#ifdef CMD_MUSIC\n        MusicCMD *cmd;\n#endif\n#ifdef WAV_MUSIC\n        WAVStream *wave;\n#endif\n#ifdef MODPLUG_MUSIC\n        modplug_data *modplug;\n#endif\n#ifdef MOD_MUSIC\n        struct MODULE *module;\n#endif\n#ifdef MID_MUSIC\n#ifdef USE_TIMIDITY_MIDI\n        MidiSong *midi;\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\n        FluidSynthMidiSong *fluidsynthmidi;\n#endif\n#ifdef USE_NATIVE_MIDI\n        NativeMidiSong *nativemidi;\n#endif\n#endif\n#ifdef OGG_MUSIC\n        OGG_music *ogg;\n#endif\n#ifdef MP3_MUSIC\n        SMPEG *mp3;\n#endif\n#ifdef MP3_MAD_MUSIC\n        mad_data *mp3_mad;\n#endif\n#ifdef FLAC_MUSIC\n        FLAC_music *flac;\n#endif\n    } data;\n    Mix_Fading fading;\n    int fade_step;\n    int fade_steps;\n    int error;\n};\n#ifdef MID_MUSIC\n#ifdef USE_TIMIDITY_MIDI\nstatic int timidity_ok;\nstatic int samplesize;\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\nstatic int fluidsynth_ok;\n#endif\n#ifdef USE_NATIVE_MIDI\nstatic int native_midi_ok;\n#endif\n#endif\n\n/* Used to calculate fading steps */\nstatic int ms_per_step;\n\n/* rcg06042009 report available decoders at runtime. */\nstatic const char **music_decoders = NULL;\nstatic int num_decoders = 0;\n\n/* Semicolon-separated SoundFont paths */\n#ifdef MID_MUSIC\nchar* soundfont_paths = NULL;\n#endif\n\nint Mix_GetNumMusicDecoders(void)\n{\n    return(num_decoders);\n}\n\nconst char *Mix_GetMusicDecoder(int index)\n{\n    if ((index < 0) || (index >= num_decoders)) {\n        return NULL;\n    }\n    return(music_decoders[index]);\n}\n\nstatic void add_music_decoder(const char *decoder)\n{\n    void *ptr = SDL_realloc((void *)music_decoders, (num_decoders + 1) * sizeof (const char *));\n    if (ptr == NULL) {\n        return;  /* oh well, go on without it. */\n    }\n    music_decoders = (const char **) ptr;\n    music_decoders[num_decoders++] = decoder;\n}\n\n/* Local low-level functions prototypes */\nstatic void music_internal_initialize_volume(void);\nstatic void music_internal_volume(int volume);\nstatic int  music_internal_play(Mix_Music *music, double position);\nstatic int  music_internal_position(double position);\nstatic int  music_internal_playing();\nstatic void music_internal_halt(void);\n\n\n/* Support for hooking when the music has finished */\nstatic void (*music_finished_hook)(void) = NULL;\n\nvoid Mix_HookMusicFinished(void (*music_finished)(void))\n{\n    SDL_LockAudio();\n    music_finished_hook = music_finished;\n    SDL_UnlockAudio();\n}\n\n\n/* If music isn't playing, halt it if no looping is required, restart it */\n/* othesrchise. NOP if the music is playing */\nstatic int music_halt_or_loop (void)\n{\n    /* Restart music if it has to loop */\n\n    if (!music_internal_playing())\n    {\n#ifdef USE_NATIVE_MIDI\n        /* Native MIDI handles looping internally */\n        if (music_playing->type == MUS_MID && native_midi_ok) {\n            music_loops = 0;\n        }\n#endif\n\n        /* Restart music if it has to loop at a high level */\n        if (music_loops)\n        {\n            Mix_Fading current_fade;\n            if (music_loops > 0) {\n                --music_loops;\n            }\n            current_fade = music_playing->fading;\n            music_internal_play(music_playing, 0.0);\n            music_playing->fading = current_fade;\n        }\n        else\n        {\n            music_internal_halt();\n            if (music_finished_hook)\n                music_finished_hook();\n\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\n\n\n/* Mixing function */\nvoid music_mixer(void *udata, Uint8 *stream, int len)\n{\n    int left = 0;\n\n    if ( music_playing && music_active ) {\n        /* Handle fading */\n        if ( music_playing->fading != MIX_NO_FADING ) {\n            if ( music_playing->fade_step++ < music_playing->fade_steps ) {\n                int volume;\n                int fade_step = music_playing->fade_step;\n                int fade_steps = music_playing->fade_steps;\n\n                if ( music_playing->fading == MIX_FADING_OUT ) {\n                    volume = (music_volume * (fade_steps-fade_step)) / fade_steps;\n                } else { /* Fading in */\n                    volume = (music_volume * fade_step) / fade_steps;\n                }\n                music_internal_volume(volume);\n            } else {\n                if ( music_playing->fading == MIX_FADING_OUT ) {\n                    music_internal_halt();\n                    if ( music_finished_hook ) {\n                        music_finished_hook();\n                    }\n                    return;\n                }\n                music_playing->fading = MIX_NO_FADING;\n            }\n        }\n\n        music_halt_or_loop();\n        if (!music_internal_playing())\n            return;\n\n        switch (music_playing->type) {\n#ifdef CMD_MUSIC\n            case MUS_CMD:\n                /* The playing is done externally */\n                break;\n#endif\n#ifdef WAV_MUSIC\n            case MUS_WAV:\n                left = WAVStream_PlaySome(stream, len);\n                break;\n#endif\n#ifdef MODPLUG_MUSIC\n            case MUS_MODPLUG:\n                left = modplug_playAudio(music_playing->data.modplug, stream, len);\n                break;\n#endif\n#ifdef MOD_MUSIC\n            case MUS_MOD:\n                left = MOD_playAudio(music_playing->data.module, stream, len);\n                break;\n#endif\n#ifdef MID_MUSIC\n            case MUS_MID:\n#ifdef USE_NATIVE_MIDI\n                if ( native_midi_ok ) {\n                    /* Native midi is handled asynchronously */\n                    goto skip;\n                }\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\n                if ( fluidsynth_ok ) {\n                    fluidsynth_playsome(music_playing->data.fluidsynthmidi, stream, len);\n                    goto skip;\n                }\n#endif\n#ifdef USE_TIMIDITY_MIDI\n                if ( timidity_ok ) {\n                    int samples = len / samplesize;\n                    Timidity_PlaySome(stream, samples);\n                    goto skip;\n                }\n#endif\n                break;\n#endif\n#ifdef OGG_MUSIC\n            case MUS_OGG:\n\n                left = OGG_playAudio(music_playing->data.ogg, stream, len);\n                break;\n#endif\n#ifdef FLAC_MUSIC\n            case MUS_FLAC:\n                left = FLAC_playAudio(music_playing->data.flac, stream, len);\n                break;\n#endif\n#ifdef MP3_MUSIC\n            case MUS_MP3:\n                left = (len - smpeg.SMPEG_playAudio(music_playing->data.mp3, stream, len));\n                break;\n#endif\n#ifdef MP3_MAD_MUSIC\n            case MUS_MP3_MAD:\n                left = mad_getSamples(music_playing->data.mp3_mad, stream, len);\n                break;\n#endif\n            default:\n                /* Unknown music type?? */\n                break;\n        }\n    }\n\nskip:\n    /* Handle seamless music looping */\n    if (left > 0 && left < len) {\n        music_halt_or_loop();\n        if (music_internal_playing())\n            music_mixer(udata, stream+(len-left), left);\n    }\n}\n\n/* Initialize the music players with a certain desired audio format */\nint open_music(SDL_AudioSpec *mixer)\n{\n#ifdef WAV_MUSIC\n    if ( WAVStream_Init(mixer) == 0 ) {\n        add_music_decoder(\"WAVE\");\n    }\n#endif\n#ifdef MODPLUG_MUSIC\n    if ( modplug_init(mixer) == 0 ) {\n        add_music_decoder(\"MODPLUG\");\n    }\n#endif\n#ifdef MOD_MUSIC\n    if ( MOD_init(mixer) == 0 ) {\n        add_music_decoder(\"MIKMOD\");\n    }\n#endif\n#ifdef MID_MUSIC\n#ifdef USE_TIMIDITY_MIDI\n    samplesize = mixer->size / mixer->samples;\n    if ( Timidity_Init(mixer->freq, mixer->format,\n                        mixer->channels, mixer->samples) == 0 ) {\n        timidity_ok = 1;\n        add_music_decoder(\"TIMIDITY\");\n    } else {\n        timidity_ok = 0;\n    }\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\n    if ( fluidsynth_init(mixer) == 0 ) {\n        fluidsynth_ok = 1;\n        add_music_decoder(\"FLUIDSYNTH\");\n    } else {\n        fluidsynth_ok = 0;\n    }\n#endif\n#ifdef USE_NATIVE_MIDI\n#ifdef USE_FLUIDSYNTH_MIDI\n    native_midi_ok = !fluidsynth_ok;\n    if ( native_midi_ok )\n#endif\n#ifdef USE_TIMIDITY_MIDI\n        native_midi_ok = !timidity_ok;\n    if ( !native_midi_ok ) {\n        native_midi_ok = (getenv(\"SDL_NATIVE_MUSIC\") != NULL);\n    }\n    if ( native_midi_ok )\n#endif\n        native_midi_ok = native_midi_detect();\n    if ( native_midi_ok )\n        add_music_decoder(\"NATIVEMIDI\");\n#endif\n#endif\n#ifdef OGG_MUSIC\n    if ( OGG_init(mixer) == 0 ) {\n        add_music_decoder(\"OGG\");\n    }\n#endif\n#ifdef FLAC_MUSIC\n    if ( FLAC_init(mixer) == 0 ) {\n        add_music_decoder(\"FLAC\");\n    }\n#endif\n#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)\n    /* Keep a copy of the mixer */\n    used_mixer = *mixer;\n    add_music_decoder(\"MP3\");\n#endif\n\n    music_playing = NULL;\n    music_stopped = 0;\n    Mix_VolumeMusic(SDL_MIX_MAXVOLUME);\n\n    /* Calculate the number of ms for each callback */\n    ms_per_step = (int) (((float)mixer->samples * 1000.0) / mixer->freq);\n\n    return(0);\n}\n\n/* Portable case-insensitive string compare function */\nint MIX_string_equals(const char *str1, const char *str2)\n{\n    while ( *str1 && *str2 ) {\n        if ( toupper((unsigned char)*str1) !=\n             toupper((unsigned char)*str2) )\n            break;\n        ++str1;\n        ++str2;\n    }\n    return (!*str1 && !*str2);\n}\n\nstatic int detect_mp3(Uint8 *magic)\n{\n    if ( strncmp((char *)magic, \"ID3\", 3) == 0 ) {\n        return 1;\n    }\n\n    /* Detection code lifted from SMPEG */\n    if(((magic[0] & 0xff) != 0xff) || // No sync bits\n       ((magic[1] & 0xf0) != 0xf0) || //\n       ((magic[2] & 0xf0) == 0x00) || // Bitrate is 0\n       ((magic[2] & 0xf0) == 0xf0) || // Bitrate is 15\n       ((magic[2] & 0x0c) == 0x0c) || // Frequency is 3\n       ((magic[1] & 0x06) == 0x00)) { // Layer is 4\n        return(0);\n    }\n    return 1;\n}\n\n/* MUS_MOD can't be auto-detected. If no other format was detected, MOD is\n * assumed and MUS_MOD will be returned, meaning that the format might not\n * actually be MOD-based.\n *\n * Returns MUS_NONE in case of errors. */\nstatic Mix_MusicType detect_music_type(SDL_RWops *src)\n{\n    Uint8 magic[5];\n    Uint8 moremagic[9];\n\n    Sint64 start = SDL_RWtell(src);\n    if (SDL_RWread(src, magic, 1, 4) != 4 || SDL_RWread(src, moremagic, 1, 8) != 8 ) {\n        Mix_SetError(\"Couldn't read from RWops\");\n        return MUS_NONE;\n    }\n    SDL_RWseek(src, start, RW_SEEK_SET);\n    magic[4]='\\0';\n    moremagic[8] = '\\0';\n\n    /* WAVE files have the magic four bytes \"RIFF\"\n       AIFF files have the magic 12 bytes \"FORM\" XXXX \"AIFF\" */\n    if (((strcmp((char *)magic, \"RIFF\") == 0) && (strcmp((char *)(moremagic+4), \"WAVE\") == 0)) ||\n        (strcmp((char *)magic, \"FORM\") == 0)) {\n        return MUS_WAV;\n    }\n\n    /* Ogg Vorbis files have the magic four bytes \"OggS\" */\n    if (strcmp((char *)magic, \"OggS\") == 0) {\n        return MUS_OGG;\n    }\n\n    /* FLAC files have the magic four bytes \"fLaC\" */\n    if (strcmp((char *)magic, \"fLaC\") == 0) {\n        return MUS_FLAC;\n    }\n\n    /* MIDI files have the magic four bytes \"MThd\" */\n    if (strcmp((char *)magic, \"MThd\") == 0) {\n        return MUS_MID;\n    }\n\n    if (detect_mp3(magic)) {\n        return MUS_MP3;\n    }\n\n    /* Assume MOD format.\n     *\n     * Apparently there is no way to check if the file is really a MOD,\n     * or there are too many formats supported by MikMod/ModPlug, or\n     * MikMod/ModPlug does this check by itself. */\n    return MUS_MOD;\n}\n\n/* Load a music file */\nMix_Music *Mix_LoadMUS(const char *file)\n{\n    SDL_RWops *src;\n    Mix_Music *music;\n    Mix_MusicType type;\n    char *ext = strrchr(file, '.');\n\n#ifdef CMD_MUSIC\n    if ( music_cmd ) {\n        /* Allocate memory for the music structure */\n        music = (Mix_Music *)SDL_malloc(sizeof(Mix_Music));\n        if ( music == NULL ) {\n            Mix_SetError(\"Out of memory\");\n            return(NULL);\n        }\n        music->error = 0;\n        music->type = MUS_CMD;\n        music->data.cmd = MusicCMD_LoadSong(music_cmd, file);\n        if ( music->data.cmd == NULL ) {\n            SDL_free(music);\n            music = NULL;\n        }\n        return music;\n    }\n#endif\n\n    src = SDL_RWFromFile(file, \"rb\");\n    if ( src == NULL ) {\n        Mix_SetError(\"Couldn't open '%s'\", file);\n        return NULL;\n    }\n\n    /* Use the extension as a first guess on the file type */\n    type = MUS_NONE;\n    ext = strrchr(file, '.');\n    /* No need to guard these with #ifdef *_MUSIC stuff,\n     * since we simply call Mix_LoadMUSType_RW() later */\n    if ( ext ) {\n        ++ext; /* skip the dot in the extension */\n        if ( MIX_string_equals(ext, \"WAV\") ) {\n            type = MUS_WAV;\n        } else if ( MIX_string_equals(ext, \"MID\") ||\n                    MIX_string_equals(ext, \"MIDI\") ||\n                    MIX_string_equals(ext, \"KAR\") ) {\n            type = MUS_MID;\n        } else if ( MIX_string_equals(ext, \"OGG\") ) {\n            type = MUS_OGG;\n        } else if ( MIX_string_equals(ext, \"FLAC\") ) {\n            type = MUS_FLAC;\n        } else  if ( MIX_string_equals(ext, \"MPG\") ||\n                     MIX_string_equals(ext, \"MPEG\") ||\n                     MIX_string_equals(ext, \"MP3\") ||\n                     MIX_string_equals(ext, \"MAD\") ) {\n            type = MUS_MP3;\n        }\n    }\n    if ( type == MUS_NONE ) {\n        type = detect_music_type(src);\n    }\n\n    /* We need to know if a specific error occurs; if not, we'll set a\n     * generic one, so we clear the current one. */\n    SDL_ClearError();\n    music = Mix_LoadMUSType_RW(src, type, SDL_TRUE);\n    if ( music == NULL && Mix_GetError()[0] == '\\0' ) {\n        Mix_SetError(\"Unrecognized music format\");\n    }\n    return music;\n}\n\nMix_Music *Mix_LoadMUS_RW(SDL_RWops *src, int freesrc)\n{\n    return Mix_LoadMUSType_RW(src, MUS_NONE, freesrc);\n}\n\nMix_Music *Mix_LoadMUSType_RW(SDL_RWops *src, Mix_MusicType type, int freesrc)\n{\n    Mix_Music *music;\n    Sint64 start;\n\n    if (!src) {\n        Mix_SetError(\"RWops pointer is NULL\");\n        return NULL;\n    }\n    start = SDL_RWtell(src);\n\n    /* If the caller wants auto-detection, figure out what kind of file\n     * this is. */\n    if (type == MUS_NONE) {\n        if ((type = detect_music_type(src)) == MUS_NONE) {\n            /* Don't call Mix_SetError() here since detect_music_type()\n             * does that. */\n            if (freesrc) {\n                SDL_RWclose(src);\n            }\n            return NULL;\n        }\n    }\n\n    /* Allocate memory for the music structure */\n    music = (Mix_Music *)SDL_malloc(sizeof(Mix_Music));\n    if (music == NULL ) {\n        Mix_SetError(\"Out of memory\");\n        if (freesrc) {\n            SDL_RWclose(src);\n        }\n        return NULL;\n    }\n    music->error = 1;\n\n    switch (type) {\n#ifdef WAV_MUSIC\n    case MUS_WAV:\n        music->type = MUS_WAV;\n        music->data.wave = WAVStream_LoadSong_RW(src, freesrc);\n        if (music->data.wave) {\n            music->error = 0;\n        }\n        break;\n#endif\n#ifdef OGG_MUSIC\n    case MUS_OGG:\n        music->type = MUS_OGG;\n        music->data.ogg = OGG_new_RW(src, freesrc);\n        if (music->data.ogg) {\n            music->error = 0;\n        }\n        break;\n#endif\n#ifdef FLAC_MUSIC\n    case MUS_FLAC:\n        music->type = MUS_FLAC;\n        music->data.flac = FLAC_new_RW(src, freesrc);\n        if (music->data.flac) {\n            music->error = 0;\n        }\n        break;\n#endif\n#ifdef MP3_MUSIC\n    case MUS_MP3:\n        if (Mix_Init(MIX_INIT_MP3)) {\n            SMPEG_Info info;\n            music->type = MUS_MP3;\n            music->data.mp3 = smpeg.SMPEG_new_rwops(src, &info, freesrc, 0);\n            if (!info.has_audio) {\n                Mix_SetError(\"MPEG file does not have any audio stream.\");\n                smpeg.SMPEG_delete(music->data.mp3);\n                /* Deleting the MP3 closed the source if desired */\n                freesrc = SDL_FALSE;\n            } else {\n                smpeg.SMPEG_actualSpec(music->data.mp3, &used_mixer);\n                music->error = 0;\n            }\n        }\n        break;\n#elif defined(MP3_MAD_MUSIC)\n    case MUS_MP3:\n        music->type = MUS_MP3_MAD;\n        music->data.mp3_mad = mad_openFileRW(src, &used_mixer, freesrc);\n        if (music->data.mp3_mad) {\n            music->error = 0;\n        } else {\n            Mix_SetError(\"Could not initialize MPEG stream.\");\n        }\n        break;\n#endif\n#ifdef MID_MUSIC\n    case MUS_MID:\n        music->type = MUS_MID;\n#ifdef USE_NATIVE_MIDI\n        if (native_midi_ok) {\n            SDL_RWseek(src, start, RW_SEEK_SET);\n            music->data.nativemidi = native_midi_loadsong_RW(src, freesrc);\n            if (music->data.nativemidi) {\n                music->error = 0;\n            } else {\n                Mix_SetError(\"%s\", native_midi_error());\n            }\n            break;\n        }\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\n        if (fluidsynth_ok) {\n            SDL_RWseek(src, start, RW_SEEK_SET);\n            music->data.fluidsynthmidi = fluidsynth_loadsong_RW(src, freesrc);\n            if (music->data.fluidsynthmidi) {\n                music->error = 0;\n            }\n            break;\n        }\n#endif\n#ifdef USE_TIMIDITY_MIDI\n        if (timidity_ok) {\n            SDL_RWseek(src, start, RW_SEEK_SET);\n            music->data.midi = Timidity_LoadSong_RW(src, freesrc);\n            if (music->data.midi) {\n                music->error = 0;\n            } else {\n                Mix_SetError(\"%s\", Timidity_Error());\n            }\n        } else {\n            Mix_SetError(\"%s\", Timidity_Error());\n        }\n#endif\n        break;\n#endif\n#if defined(MODPLUG_MUSIC) || defined(MOD_MUSIC)\n    case MUS_MOD:\n#ifdef MODPLUG_MUSIC\n        if (music->error) {\n            SDL_RWseek(src, start, RW_SEEK_SET);\n            music->type = MUS_MODPLUG;\n            music->data.modplug = modplug_new_RW(src, freesrc);\n            if (music->data.modplug) {\n                music->error = 0;\n            }\n        }\n#endif\n#ifdef MOD_MUSIC\n        if (music->error) {\n            SDL_RWseek(src, start, RW_SEEK_SET);\n            music->type = MUS_MOD;\n            music->data.module = MOD_new_RW(src, freesrc);\n            if (music->data.module) {\n                music->error = 0;\n            }\n        }\n#endif\n        break;\n#endif\n\n    default:\n        Mix_SetError(\"Unrecognized music format\");\n        break;\n    } /* switch (want) */\n\n    if (music->error) {\n        SDL_free(music);\n        if (freesrc) {\n            SDL_RWclose(src);\n        } else {\n            SDL_RWseek(src, start, RW_SEEK_SET);\n        }\n        music = NULL;\n    }\n    return music;\n}\n\n/* Free a music chunk previously loaded */\nvoid Mix_FreeMusic(Mix_Music *music)\n{\n    if ( music ) {\n        /* Stop the music if it's currently playing */\n        SDL_LockAudio();\n        if ( music == music_playing ) {\n            /* Wait for any fade out to finish */\n            while ( music->fading == MIX_FADING_OUT ) {\n                SDL_UnlockAudio();\n                SDL_Delay(100);\n                SDL_LockAudio();\n            }\n            if ( music == music_playing ) {\n                music_internal_halt();\n            }\n        }\n        SDL_UnlockAudio();\n        switch (music->type) {\n#ifdef CMD_MUSIC\n            case MUS_CMD:\n                MusicCMD_FreeSong(music->data.cmd);\n                break;\n#endif\n#ifdef WAV_MUSIC\n            case MUS_WAV:\n                WAVStream_FreeSong(music->data.wave);\n                break;\n#endif\n#ifdef MODPLUG_MUSIC\n            case MUS_MODPLUG:\n                modplug_delete(music->data.modplug);\n                break;\n#endif\n#ifdef MOD_MUSIC\n            case MUS_MOD:\n                MOD_delete(music->data.module);\n                break;\n#endif\n#ifdef MID_MUSIC\n            case MUS_MID:\n#ifdef USE_NATIVE_MIDI\n                if ( native_midi_ok ) {\n                    native_midi_freesong(music->data.nativemidi);\n                    goto skip;\n                }\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\n                if ( fluidsynth_ok ) {\n                    fluidsynth_freesong(music->data.fluidsynthmidi);\n                    goto skip;\n                }\n#endif\n#ifdef USE_TIMIDITY_MIDI\n                if ( timidity_ok ) {\n                    Timidity_FreeSong(music->data.midi);\n                    goto skip;\n                }\n#endif\n                break;\n#endif\n#ifdef OGG_MUSIC\n            case MUS_OGG:\n                OGG_delete(music->data.ogg);\n                break;\n#endif\n#ifdef FLAC_MUSIC\n            case MUS_FLAC:\n                FLAC_delete(music->data.flac);\n                break;\n#endif\n#ifdef MP3_MUSIC\n            case MUS_MP3:\n                smpeg.SMPEG_delete(music->data.mp3);\n                break;\n#endif\n#ifdef MP3_MAD_MUSIC\n            case MUS_MP3_MAD:\n                mad_closeFile(music->data.mp3_mad);\n                break;\n#endif\n            default:\n                /* Unknown music type?? */\n                break;\n        }\n\n    skip:\n        SDL_free(music);\n    }\n}\n\n/* Find out the music format of a mixer music, or the currently playing\n   music, if 'music' is NULL.\n*/\nMix_MusicType Mix_GetMusicType(const Mix_Music *music)\n{\n    Mix_MusicType type = MUS_NONE;\n\n    if ( music ) {\n        type = music->type;\n    } else {\n        SDL_LockAudio();\n        if ( music_playing ) {\n            type = music_playing->type;\n        }\n        SDL_UnlockAudio();\n    }\n    return(type);\n}\n\n/* Play a music chunk.  Returns 0, or -1 if there was an error.\n */\nstatic int music_internal_play(Mix_Music *music, double position)\n{\n    int retval = 0;\n\n#if defined(__MACOSX__) && defined(USE_NATIVE_MIDI)\n    /* This fixes a bug with native MIDI on Mac OS X, where you\n       can't really stop and restart MIDI from the audio callback.\n    */\n    if ( music == music_playing && music->type == MUS_MID && native_midi_ok ) {\n        /* Just a seek suffices to restart playing */\n        music_internal_position(position);\n        return 0;\n    }\n#endif\n\n    /* Note the music we're playing */\n    if ( music_playing ) {\n        music_internal_halt();\n    }\n    music_playing = music;\n\n    /* Set the initial volume */\n    if ( music->type != MUS_MOD ) {\n        music_internal_initialize_volume();\n    }\n\n    /* Set up for playback */\n    switch (music->type) {\n#ifdef CMD_MUSIC\n        case MUS_CMD:\n        MusicCMD_Start(music->data.cmd);\n        break;\n#endif\n#ifdef WAV_MUSIC\n        case MUS_WAV:\n        WAVStream_Start(music->data.wave);\n        break;\n#endif\n#ifdef MODPLUG_MUSIC\n        case MUS_MODPLUG:\n        /* can't set volume until file is loaded, so finally set it now */\n        music_internal_initialize_volume();\n        modplug_play(music->data.modplug);\n        break;\n#endif\n#ifdef MOD_MUSIC\n        case MUS_MOD:\n        MOD_play(music->data.module);\n        /* Player_SetVolume() does nothing before Player_Start() */\n        music_internal_initialize_volume();\n        break;\n#endif\n#ifdef MID_MUSIC\n        case MUS_MID:\n#ifdef USE_NATIVE_MIDI\n        if ( native_midi_ok ) {\n            native_midi_start(music->data.nativemidi, music_loops);\n            goto skip;\n        }\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\n        if (fluidsynth_ok ) {\n            fluidsynth_start(music->data.fluidsynthmidi);\n            goto skip;\n        }\n#endif\n#ifdef USE_TIMIDITY_MIDI\n        if ( timidity_ok ) {\n            Timidity_Start(music->data.midi);\n            goto skip;\n        }\n#endif\n        break;\n#endif\n#ifdef OGG_MUSIC\n        case MUS_OGG:\n        OGG_play(music->data.ogg);\n        break;\n#endif\n#ifdef FLAC_MUSIC\n        case MUS_FLAC:\n        FLAC_play(music->data.flac);\n        break;\n#endif\n#ifdef MP3_MUSIC\n        case MUS_MP3:\n        smpeg.SMPEG_enableaudio(music->data.mp3,1);\n        smpeg.SMPEG_enablevideo(music->data.mp3,0);\n        smpeg.SMPEG_play(music_playing->data.mp3);\n        break;\n#endif\n#ifdef MP3_MAD_MUSIC\n        case MUS_MP3_MAD:\n        mad_start(music->data.mp3_mad);\n        break;\n#endif\n        default:\n        Mix_SetError(\"Can't play unknown music type\");\n        retval = -1;\n        break;\n    }\n\nskip:\n    /* Set the playback position, note any errors if an offset is used */\n    if ( retval == 0 ) {\n        if ( position > 0.0 ) {\n            if ( music_internal_position(position) < 0 ) {\n                Mix_SetError(\"Position not implemented for music type\");\n                retval = -1;\n            }\n        } else {\n            music_internal_position(0.0);\n        }\n    }\n\n    /* If the setup failed, we're not playing any music anymore */\n    if ( retval < 0 ) {\n        music_playing = NULL;\n    }\n    return(retval);\n}\nint Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position)\n{\n    int retval;\n\n    if ( ms_per_step == 0 ) {\n        SDL_SetError(\"Audio device hasn't been opened\");\n        return(-1);\n    }\n\n    /* Don't play null pointers :-) */\n    if ( music == NULL ) {\n        Mix_SetError(\"music parameter was NULL\");\n        return(-1);\n    }\n\n    /* Setup the data */\n    if ( ms ) {\n        music->fading = MIX_FADING_IN;\n    } else {\n        music->fading = MIX_NO_FADING;\n    }\n    music->fade_step = 0;\n    music->fade_steps = ms/ms_per_step;\n\n    /* Play the puppy */\n    SDL_LockAudio();\n    /* If the current music is fading out, wait for the fade to complete */\n    while ( music_playing && (music_playing->fading == MIX_FADING_OUT) ) {\n        SDL_UnlockAudio();\n        SDL_Delay(100);\n        SDL_LockAudio();\n    }\n    music_active = 1;\n    if (loops == 1) {\n        /* Loop is the number of times to play the audio */\n        loops = 0;\n    }\n    music_loops = loops;\n    retval = music_internal_play(music, position);\n    SDL_UnlockAudio();\n\n    return(retval);\n}\nint Mix_FadeInMusic(Mix_Music *music, int loops, int ms)\n{\n    return Mix_FadeInMusicPos(music, loops, ms, 0.0);\n}\nint Mix_PlayMusic(Mix_Music *music, int loops)\n{\n    return Mix_FadeInMusicPos(music, loops, 0, 0.0);\n}\n\n/* Set the playing music position */\nint music_internal_position(double position)\n{\n    int retval = 0;\n\n    switch (music_playing->type) {\n#ifdef MODPLUG_MUSIC\n        case MUS_MODPLUG:\n        modplug_jump_to_time(music_playing->data.modplug, position);\n        break;\n#endif\n#ifdef MOD_MUSIC\n        case MUS_MOD:\n        MOD_jump_to_time(music_playing->data.module, position);\n        break;\n#endif\n#ifdef OGG_MUSIC\n        case MUS_OGG:\n        OGG_jump_to_time(music_playing->data.ogg, position);\n        break;\n#endif\n#ifdef FLAC_MUSIC\n        case MUS_FLAC:\n        FLAC_jump_to_time(music_playing->data.flac, position);\n        break;\n#endif\n#ifdef MP3_MUSIC\n        case MUS_MP3:\n        smpeg.SMPEG_rewind(music_playing->data.mp3);\n        smpeg.SMPEG_play(music_playing->data.mp3);\n        if ( position > 0.0 ) {\n            smpeg.SMPEG_skip(music_playing->data.mp3, (float)position);\n        }\n        break;\n#endif\n#ifdef MP3_MAD_MUSIC\n        case MUS_MP3_MAD:\n        mad_seek(music_playing->data.mp3_mad, position);\n        break;\n#endif\n        default:\n        /* TODO: Implement this for other music backends */\n        retval = -1;\n        break;\n    }\n    return(retval);\n}\nint Mix_SetMusicPosition(double position)\n{\n    int retval;\n\n    SDL_LockAudio();\n    if ( music_playing ) {\n        retval = music_internal_position(position);\n        if ( retval < 0 ) {\n            Mix_SetError(\"Position not implemented for music type\");\n        }\n    } else {\n        Mix_SetError(\"Music isn't playing\");\n        retval = -1;\n    }\n    SDL_UnlockAudio();\n\n    return(retval);\n}\n\n/* Set the music's initial volume */\nstatic void music_internal_initialize_volume(void)\n{\n    if ( music_playing->fading == MIX_FADING_IN ) {\n        music_internal_volume(0);\n    } else {\n        music_internal_volume(music_volume);\n    }\n}\n\n/* Set the music volume */\nstatic void music_internal_volume(int volume)\n{\n    switch (music_playing->type) {\n#ifdef CMD_MUSIC\n        case MUS_CMD:\n        MusicCMD_SetVolume(volume);\n        break;\n#endif\n#ifdef WAV_MUSIC\n        case MUS_WAV:\n        WAVStream_SetVolume(volume);\n        break;\n#endif\n#ifdef MODPLUG_MUSIC\n        case MUS_MODPLUG:\n        modplug_setvolume(music_playing->data.modplug, volume);\n        break;\n#endif\n#ifdef MOD_MUSIC\n        case MUS_MOD:\n        MOD_setvolume(music_playing->data.module, volume);\n        break;\n#endif\n#ifdef MID_MUSIC\n        case MUS_MID:\n#ifdef USE_NATIVE_MIDI\n        if ( native_midi_ok ) {\n            native_midi_setvolume(volume);\n            return;\n        }\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\n        if ( fluidsynth_ok ) {\n            fluidsynth_setvolume(music_playing->data.fluidsynthmidi, volume);\n            return;\n        }\n#endif\n#ifdef USE_TIMIDITY_MIDI\n        if ( timidity_ok ) {\n            Timidity_SetVolume(volume);\n            return;\n        }\n#endif\n        break;\n#endif\n#ifdef OGG_MUSIC\n        case MUS_OGG:\n        OGG_setvolume(music_playing->data.ogg, volume);\n        break;\n#endif\n#ifdef FLAC_MUSIC\n        case MUS_FLAC:\n        FLAC_setvolume(music_playing->data.flac, volume);\n        break;\n#endif\n#ifdef MP3_MUSIC\n        case MUS_MP3:\n        smpeg.SMPEG_setvolume(music_playing->data.mp3,(int)(((float)volume/(float)MIX_MAX_VOLUME)*100.0));\n        break;\n#endif\n#ifdef MP3_MAD_MUSIC\n        case MUS_MP3_MAD:\n        mad_setVolume(music_playing->data.mp3_mad, volume);\n        break;\n#endif\n        default:\n        /* Unknown music type?? */\n        break;\n    }\n}\nint Mix_VolumeMusic(int volume)\n{\n    int prev_volume;\n\n    prev_volume = music_volume;\n    if ( volume < 0 ) {\n        return prev_volume;\n    }\n    if ( volume > SDL_MIX_MAXVOLUME ) {\n        volume = SDL_MIX_MAXVOLUME;\n    }\n    music_volume = volume;\n    SDL_LockAudio();\n    if ( music_playing ) {\n        music_internal_volume(music_volume);\n    }\n    SDL_UnlockAudio();\n    return(prev_volume);\n}\n\n/* Halt playing of music */\nstatic void music_internal_halt(void)\n{\n    switch (music_playing->type) {\n#ifdef CMD_MUSIC\n        case MUS_CMD:\n        MusicCMD_Stop(music_playing->data.cmd);\n        break;\n#endif\n#ifdef WAV_MUSIC\n        case MUS_WAV:\n        WAVStream_Stop();\n        break;\n#endif\n#ifdef MODPLUG_MUSIC\n        case MUS_MODPLUG:\n        modplug_stop(music_playing->data.modplug);\n        break;\n#endif\n#ifdef MOD_MUSIC\n        case MUS_MOD:\n        MOD_stop(music_playing->data.module);\n        break;\n#endif\n#ifdef MID_MUSIC\n        case MUS_MID:\n#ifdef USE_NATIVE_MIDI\n        if ( native_midi_ok ) {\n            native_midi_stop();\n            goto skip;\n        }\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\n        if ( fluidsynth_ok ) {\n            fluidsynth_stop(music_playing->data.fluidsynthmidi);\n            goto skip;\n        }\n#endif\n#ifdef USE_TIMIDITY_MIDI\n        if ( timidity_ok ) {\n            Timidity_Stop();\n            goto skip;\n        }\n#endif\n        break;\n#endif\n#ifdef OGG_MUSIC\n        case MUS_OGG:\n        OGG_stop(music_playing->data.ogg);\n        break;\n#endif\n#ifdef FLAC_MUSIC\n        case MUS_FLAC:\n        FLAC_stop(music_playing->data.flac);\n        break;\n#endif\n#ifdef MP3_MUSIC\n        case MUS_MP3:\n        smpeg.SMPEG_stop(music_playing->data.mp3);\n        break;\n#endif\n#ifdef MP3_MAD_MUSIC\n        case MUS_MP3_MAD:\n        mad_stop(music_playing->data.mp3_mad);\n        break;\n#endif\n        default:\n        /* Unknown music type?? */\n        return;\n    }\n\nskip:\n    music_playing->fading = MIX_NO_FADING;\n    music_playing = NULL;\n}\nint Mix_HaltMusic(void)\n{\n    SDL_LockAudio();\n    if ( music_playing ) {\n        music_internal_halt();\n        if ( music_finished_hook ) {\n            music_finished_hook();\n        }\n    }\n    SDL_UnlockAudio();\n\n    return(0);\n}\n\n/* Progressively stop the music */\nint Mix_FadeOutMusic(int ms)\n{\n    int retval = 0;\n\n    if ( ms_per_step == 0 ) {\n        SDL_SetError(\"Audio device hasn't been opened\");\n        return 0;\n    }\n\n    if (ms <= 0) {  /* just halt immediately. */\n        Mix_HaltMusic();\n        return 1;\n    }\n\n    SDL_LockAudio();\n    if ( music_playing) {\n                int fade_steps = (ms + ms_per_step - 1)/ms_per_step;\n                if ( music_playing->fading == MIX_NO_FADING ) {\n                music_playing->fade_step = 0;\n                } else {\n                        int step;\n                        int old_fade_steps = music_playing->fade_steps;\n                        if ( music_playing->fading == MIX_FADING_OUT ) {\n                                step = music_playing->fade_step;\n                        } else {\n                                step = old_fade_steps\n                                        - music_playing->fade_step + 1;\n                        }\n                        music_playing->fade_step = (step * fade_steps)\n                                / old_fade_steps;\n                }\n        music_playing->fading = MIX_FADING_OUT;\n        music_playing->fade_steps = fade_steps;\n        retval = 1;\n    }\n    SDL_UnlockAudio();\n\n    return(retval);\n}\n\nMix_Fading Mix_FadingMusic(void)\n{\n    Mix_Fading fading = MIX_NO_FADING;\n\n    SDL_LockAudio();\n    if ( music_playing ) {\n        fading = music_playing->fading;\n    }\n    SDL_UnlockAudio();\n\n    return(fading);\n}\n\n/* Pause/Resume the music stream */\nvoid Mix_PauseMusic(void)\n{\n    music_active = 0;\n}\n\nvoid Mix_ResumeMusic(void)\n{\n    music_active = 1;\n}\n\nvoid Mix_RewindMusic(void)\n{\n    Mix_SetMusicPosition(0.0);\n}\n\nint Mix_PausedMusic(void)\n{\n    return (music_active == 0);\n}\n\n/* Check the status of the music */\nstatic int music_internal_playing()\n{\n    int playing = 1;\n\n    if (music_playing == NULL) {\n        return 0;\n    }\n\n    switch (music_playing->type) {\n#ifdef CMD_MUSIC\n        case MUS_CMD:\n        if (!MusicCMD_Active(music_playing->data.cmd)) {\n            playing = 0;\n        }\n        break;\n#endif\n#ifdef WAV_MUSIC\n        case MUS_WAV:\n        if ( ! WAVStream_Active() ) {\n            playing = 0;\n        }\n        break;\n#endif\n#ifdef MODPLUG_MUSIC\n        case MUS_MODPLUG:\n        if ( ! modplug_playing(music_playing->data.modplug) ) {\n            playing = 0;\n        }\n        break;\n#endif\n#ifdef MOD_MUSIC\n        case MUS_MOD:\n        if ( ! MOD_playing(music_playing->data.module) ) {\n            playing = 0;\n        }\n        break;\n#endif\n#ifdef MID_MUSIC\n        case MUS_MID:\n#ifdef USE_NATIVE_MIDI\n        if ( native_midi_ok ) {\n            if ( ! native_midi_active() )\n                playing = 0;\n            goto skip;\n        }\n#endif\n#ifdef USE_FLUIDSYNTH_MIDI\n        if ( fluidsynth_ok ) {\n            if ( ! fluidsynth_active(music_playing->data.fluidsynthmidi) )\n                playing = 0;\n            goto skip;\n        }\n#endif\n#ifdef USE_TIMIDITY_MIDI\n        if ( timidity_ok ) {\n            if ( ! Timidity_Active() )\n                playing = 0;\n            goto skip;\n        }\n#endif\n        break;\n#endif\n#ifdef OGG_MUSIC\n        case MUS_OGG:\n        if ( ! OGG_playing(music_playing->data.ogg) ) {\n            playing = 0;\n        }\n        break;\n#endif\n#ifdef FLAC_MUSIC\n        case MUS_FLAC:\n        if ( ! FLAC_playing(music_playing->data.flac) ) {\n            playing = 0;\n        }\n        break;\n#endif\n#ifdef MP3_MUSIC\n        case MUS_MP3:\n        if ( smpeg.SMPEG_status(music_playing->data.mp3) != SMPEG_PLAYING )\n            playing = 0;\n        break;\n#endif\n#ifdef MP3_MAD_MUSIC\n        case MUS_MP3_MAD:\n        if (!mad_isPlaying(music_playing->data.mp3_mad)) {\n            playing = 0;\n        }\n        break;\n#endif\n        default:\n        playing = 0;\n        break;\n    }\n\nskip:\n    return(playing);\n}\nint Mix_PlayingMusic(void)\n{\n    int playing = 0;\n\n    SDL_LockAudio();\n    if ( music_playing ) {\n        playing = music_loops || music_internal_playing();\n    }\n    SDL_UnlockAudio();\n\n    return(playing);\n}\n\n/* Set the external music playback command */\nint Mix_SetMusicCMD(const char *command)\n{\n    Mix_HaltMusic();\n    if ( music_cmd ) {\n        SDL_free(music_cmd);\n        music_cmd = NULL;\n    }\n    if ( command ) {\n        music_cmd = (char *)SDL_malloc(strlen(command)+1);\n        if ( music_cmd == NULL ) {\n            return(-1);\n        }\n        strcpy(music_cmd, command);\n    }\n    return(0);\n}\n\nint Mix_SetSynchroValue(int i)\n{\n    /* Not supported by any players at this time */\n    return(-1);\n}\n\nint Mix_GetSynchroValue(void)\n{\n    /* Not supported by any players at this time */\n    return(-1);\n}\n\n\n/* Uninitialize the music players */\nvoid close_music(void)\n{\n    Mix_HaltMusic();\n#ifdef CMD_MUSIC\n    Mix_SetMusicCMD(NULL);\n#endif\n#ifdef MODPLUG_MUSIC\n    modplug_exit();\n#endif\n#ifdef MOD_MUSIC\n    MOD_exit();\n#endif\n#ifdef MID_MUSIC\n# ifdef USE_TIMIDITY_MIDI\n    Timidity_Close();\n# endif\n#endif\n\n    /* rcg06042009 report available decoders at runtime. */\n    SDL_free((void *)music_decoders);\n    music_decoders = NULL;\n    num_decoders = 0;\n\n    ms_per_step = 0;\n}\n\nint Mix_SetSoundFonts(const char *paths)\n{\n#ifdef MID_MUSIC\n    if (soundfont_paths) {\n        SDL_free(soundfont_paths);\n        soundfont_paths = NULL;\n    }\n\n    if (paths) {\n        if (!(soundfont_paths = SDL_strdup(paths))) {\n            Mix_SetError(\"Insufficient memory to set SoundFonts\");\n            return 0;\n        }\n    }\n#endif\n    return 1;\n}\n\n#ifdef MID_MUSIC\nconst char* Mix_GetSoundFonts(void)\n{\n    const char* force = getenv(\"SDL_FORCE_SOUNDFONTS\");\n\n    if (!soundfont_paths || (force && force[0] == '1')) {\n        return getenv(\"SDL_SOUNDFONTS\");\n    } else {\n        return soundfont_paths;\n    }\n}\n\nint Mix_EachSoundFont(int (*function)(const char*, void*), void *data)\n{\n    char *context, *path, *paths;\n    const char* cpaths = Mix_GetSoundFonts();\n\n    if (!cpaths) {\n        Mix_SetError(\"No SoundFonts have been requested\");\n        return 0;\n    }\n\n    if (!(paths = SDL_strdup(cpaths))) {\n        Mix_SetError(\"Insufficient memory to iterate over SoundFonts\");\n        return 0;\n    }\n\n#if defined(__MINGW32__) || defined(__MINGW64__)\n    for (path = strtok(paths, \";\"); path; path = strtok(NULL, \";\")) {\n#elif defined(_WIN32)\n    for (path = strtok_s(paths, \";\", &context); path; path = strtok_s(NULL, \";\", &context)) {\n#else\n    for (path = strtok_r(paths, \":;\", &context); path; path = strtok_r(NULL, \":;\", &context)) {\n#endif\n        if (!function(path, data)) {\n            SDL_free(paths);\n            return 0;\n        }\n    }\n\n    SDL_free(paths);\n    return 1;\n}\n#endif\n"
  },
  {
    "path": "libs/SDL2_mixer/src/music_cmd.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n#include \"SDL_config.h\"\n\n/* This file supports an external command for playing music */\n\n#ifdef CMD_MUSIC\n\n#include <sys/types.h>\n#include <sys/wait.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <string.h>\n#include <signal.h>\n#include <ctype.h>\n\n#include \"SDL_mixer.h\"\n#include \"music_cmd.h\"\n\n/* Unimplemented */\nvoid MusicCMD_SetVolume(int volume)\n{\n    Mix_SetError(\"No way to modify external player volume\");\n}\n\n/* Load a music stream from the given file */\nMusicCMD *MusicCMD_LoadSong(const char *cmd, const char *file)\n{\n    MusicCMD *music;\n\n    /* Allocate and fill the music structure */\n    music = (MusicCMD *)SDL_malloc(sizeof *music);\n    if ( music == NULL ) {\n        Mix_SetError(\"Out of memory\");\n        return(NULL);\n    }\n    music->file = SDL_strdup(file);\n    music->cmd = SDL_strdup(cmd);\n    music->pid = 0;\n\n    /* We're done */\n    return(music);\n}\n\n/* Parse a command line buffer into arguments */\nstatic int ParseCommandLine(char *cmdline, char **argv)\n{\n    char *bufp;\n    int argc;\n\n    argc = 0;\n    for ( bufp = cmdline; *bufp; ) {\n        /* Skip leading whitespace */\n        while ( isspace(*bufp) ) {\n            ++bufp;\n        }\n        /* Skip over argument */\n        if ( *bufp == '\"' ) {\n            ++bufp;\n            if ( *bufp ) {\n                if ( argv ) {\n                    argv[argc] = bufp;\n                }\n                ++argc;\n            }\n            /* Skip over word */\n            while ( *bufp && (*bufp != '\"') ) {\n                ++bufp;\n            }\n        } else {\n            if ( *bufp ) {\n                if ( argv ) {\n                    argv[argc] = bufp;\n                }\n                ++argc;\n            }\n            /* Skip over word */\n            while ( *bufp && ! isspace(*bufp) ) {\n                ++bufp;\n            }\n        }\n        if ( *bufp ) {\n            if ( argv ) {\n                *bufp = '\\0';\n            }\n            ++bufp;\n        }\n    }\n    if ( argv ) {\n        argv[argc] = NULL;\n    }\n    return(argc);\n}\n\nstatic char **parse_args(char *command, char *last_arg)\n{\n    int argc;\n    char **argv;\n\n    /* Parse the command line */\n    argc = ParseCommandLine(command, NULL);\n    if ( last_arg ) {\n        ++argc;\n    }\n    argv = (char **)SDL_malloc((argc+1)*(sizeof *argv));\n    if ( argv == NULL ) {\n        return(NULL);\n    }\n    argc = ParseCommandLine(command, argv);\n\n    /* Add last command line argument */\n    if ( last_arg ) {\n        argv[argc++] = last_arg;\n    }\n    argv[argc] = NULL;\n\n    /* We're ready! */\n    return(argv);\n}\n\n/* Start playback of a given music stream */\nvoid MusicCMD_Start(MusicCMD *music)\n{\n#ifdef HAVE_FORK\n    music->pid = fork();\n#else\n    music->pid = vfork();\n#endif\n    switch(music->pid) {\n        /* Failed fork() system call */\n        case -1:\n        Mix_SetError(\"fork() failed\");\n        return;\n\n        /* Child process - executes here */\n        case 0: {\n            char *command;\n            char **argv;\n\n            /* Unblock signals in case we're called from a thread */\n            {\n            sigset_t mask;\n            sigemptyset(&mask);\n            sigprocmask(SIG_SETMASK, &mask, NULL);\n            }\n\n            /* Execute the command */\n            command = SDL_strdup(music->cmd);\n            argv = parse_args(command, music->file);\n            if ( argv != NULL ) {\n            execvp(argv[0], argv);\n            }\n            SDL_free(command);\n\n            /* exec() failed */\n            perror(argv[0]);\n            _exit(-1);\n        }\n        break;\n\n        /* Parent process - executes here */\n        default:\n        break;\n    }\n    return;\n}\n\n/* Stop playback of a stream previously started with MusicCMD_Start() */\nvoid MusicCMD_Stop(MusicCMD *music)\n{\n    int status;\n\n    if ( music->pid > 0 ) {\n        while ( kill(music->pid, 0) == 0 ) {\n            kill(music->pid, SIGTERM);\n            sleep(1);\n            waitpid(music->pid, &status, WNOHANG);\n        }\n        music->pid = 0;\n    }\n}\n\n/* Pause playback of a given music stream */\nvoid MusicCMD_Pause(MusicCMD *music)\n{\n    if ( music->pid > 0 ) {\n        kill(music->pid, SIGSTOP);\n    }\n}\n\n/* Resume playback of a given music stream */\nvoid MusicCMD_Resume(MusicCMD *music)\n{\n    if ( music->pid > 0 ) {\n        kill(music->pid, SIGCONT);\n    }\n}\n\n/* Close the given music stream */\nvoid MusicCMD_FreeSong(MusicCMD *music)\n{\n    SDL_free(music->file);\n    SDL_free(music->cmd);\n    SDL_free(music);\n}\n\n/* Return non-zero if a stream is currently playing */\nint MusicCMD_Active(MusicCMD *music)\n{\n    int status;\n    int active;\n\n    active = 0;\n    if ( music->pid > 0 ) {\n        waitpid(music->pid, &status, WNOHANG);\n        if ( kill(music->pid, 0) == 0 ) {\n            active = 1;\n        }\n    }\n    return(active);\n}\n\n#endif /* CMD_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/music_flac.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  This file is used to support SDL_LoadMUS playback of FLAC files.\n    ~ Austen Dicken (admin@cvpcs.org)\n*/\n\n#ifdef FLAC_MUSIC\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL_mixer.h\"\n#include \"dynamic_flac.h\"\n#include \"music_flac.h\"\n\n/* This is the format of the audio mixer data */\nstatic SDL_AudioSpec mixer;\n\n/* Initialize the FLAC player, with the given mixer settings\n   This function returns 0, or -1 if there was an error.\n */\nint FLAC_init(SDL_AudioSpec *mixerfmt)\n{\n    mixer = *mixerfmt;\n    return(0);\n}\n\n/* Set the volume for an FLAC stream */\nvoid FLAC_setvolume(FLAC_music *music, int volume)\n{\n    music->volume = volume;\n}\n\nstatic FLAC__StreamDecoderReadStatus flac_read_music_cb(\n                                    const FLAC__StreamDecoder *decoder,\n                                    FLAC__byte buffer[],\n                                    size_t *bytes,\n                                    void *client_data)\n{\n    FLAC_music *data = (FLAC_music*)client_data;\n\n    // make sure there is something to be reading\n    if (*bytes > 0) {\n        *bytes = SDL_RWread (data->src, buffer, sizeof (FLAC__byte), *bytes);\n\n        if (*bytes == 0 ) { // error or no data was read (EOF)\n            return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;\n        } else { // data was read, continue\n            return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;\n        }\n    } else {\n        return FLAC__STREAM_DECODER_READ_STATUS_ABORT;\n    }\n}\n\nstatic FLAC__StreamDecoderSeekStatus flac_seek_music_cb(\n                                    const FLAC__StreamDecoder *decoder,\n                                    FLAC__uint64 absolute_byte_offset,\n                                    void *client_data)\n{\n    FLAC_music *data = (FLAC_music*)client_data;\n\n    if (SDL_RWseek (data->src, absolute_byte_offset, RW_SEEK_SET) < 0) {\n        return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;\n    } else {\n        return FLAC__STREAM_DECODER_SEEK_STATUS_OK;\n    }\n}\n\nstatic FLAC__StreamDecoderTellStatus flac_tell_music_cb(\n                                    const FLAC__StreamDecoder *decoder,\n                                    FLAC__uint64 *absolute_byte_offset,\n                                    void *client_data )\n{\n    FLAC_music *data = (FLAC_music*)client_data;\n\n    Sint64 pos = SDL_RWtell (data->src);\n\n    if (pos < 0) {\n        return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;\n    } else {\n        *absolute_byte_offset = (FLAC__uint64)pos;\n        return FLAC__STREAM_DECODER_TELL_STATUS_OK;\n    }\n}\n\nstatic FLAC__StreamDecoderLengthStatus flac_length_music_cb (\n                                    const FLAC__StreamDecoder *decoder,\n                                    FLAC__uint64 *stream_length,\n                                    void *client_data)\n{\n    FLAC_music *data = (FLAC_music*)client_data;\n\n    Sint64 pos = SDL_RWtell (data->src);\n    Sint64 length = SDL_RWseek (data->src, 0, RW_SEEK_END);\n\n    if (SDL_RWseek (data->src, pos, RW_SEEK_SET) != pos || length < 0) {\n        /* there was an error attempting to return the stream to the original\n         * position, or the length was invalid. */\n        return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;\n    } else {\n        *stream_length = (FLAC__uint64)length;\n        return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;\n    }\n}\n\nstatic FLAC__bool flac_eof_music_cb(\n                                const FLAC__StreamDecoder *decoder,\n                                void *client_data )\n{\n    FLAC_music *data = (FLAC_music*)client_data;\n\n    Sint64 pos = SDL_RWtell (data->src);\n    Sint64 end = SDL_RWseek (data->src, 0, RW_SEEK_END);\n\n    // was the original position equal to the end (a.k.a. the seek didn't move)?\n    if (pos == end) {\n        // must be EOF\n        return true;\n    } else {\n        // not EOF, return to the original position\n        SDL_RWseek (data->src, pos, RW_SEEK_SET);\n        return false;\n    }\n}\n\nstatic FLAC__StreamDecoderWriteStatus flac_write_music_cb(\n                                    const FLAC__StreamDecoder *decoder,\n                                    const FLAC__Frame *frame,\n                                    const FLAC__int32 *const buffer[],\n                                    void *client_data)\n{\n    FLAC_music *data = (FLAC_music *)client_data;\n    size_t i;\n\n    if (data->flac_data.total_samples == 0) {\n        SDL_SetError (\"Given FLAC file does not specify its sample count.\");\n        return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;\n    }\n\n    if (data->flac_data.channels != 2 ||\n        data->flac_data.bits_per_sample != 16) {\n        SDL_SetError(\"Current FLAC support is only for 16 bit Stereo files.\");\n        return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;\n    }\n\n    for (i = 0; i < frame->header.blocksize; i++) {\n        FLAC__int16 i16;\n        FLAC__uint16 ui16;\n\n        // make sure we still have at least two bytes that can be read (one for\n        // each channel)\n        if (data->flac_data.max_to_read >= 4) {\n            // does the data block exist?\n            if (!data->flac_data.data) {\n                data->flac_data.data_len = data->flac_data.max_to_read;\n                data->flac_data.data_read = 0;\n\n                // create it\n                data->flac_data.data =\n                    (char *)SDL_malloc (data->flac_data.data_len);\n\n                if (!data->flac_data.data) {\n                    return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;\n                }\n            }\n\n            i16 = (FLAC__int16)buffer[0][i];\n            ui16 = (FLAC__uint16)i16;\n\n            *((data->flac_data.data) + (data->flac_data.data_read++)) =\n                                                            (char)(ui16);\n            *((data->flac_data.data) + (data->flac_data.data_read++)) =\n                                                            (char)(ui16 >> 8);\n\n            i16 = (FLAC__int16)buffer[1][i];\n            ui16 = (FLAC__uint16)i16;\n\n            *((data->flac_data.data) + (data->flac_data.data_read++)) =\n                                                            (char)(ui16);\n            *((data->flac_data.data) + (data->flac_data.data_read++)) =\n                                                            (char)(ui16 >> 8);\n\n            data->flac_data.max_to_read -= 4;\n\n            if (data->flac_data.max_to_read < 4) {\n                // we need to set this so that the read halts from the\n                // FLAC_getsome function.\n                data->flac_data.max_to_read = 0;\n            }\n        }\n        else {\n            // we need to write to the overflow\n            if (!data->flac_data.overflow) {\n                data->flac_data.overflow_len =\n                                            4 * (frame->header.blocksize - i);\n                data->flac_data.overflow_read = 0;\n\n                // make it big enough for the rest of the block\n                data->flac_data.overflow =\n                    (char *)SDL_malloc (data->flac_data.overflow_len);\n\n                if (!data->flac_data.overflow) {\n                    return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;\n                }\n            }\n\n            i16 = (FLAC__int16)buffer[0][i];\n            ui16 = (FLAC__uint16)i16;\n\n            *((data->flac_data.overflow) + (data->flac_data.overflow_read++)) =\n                                                            (char)(ui16);\n            *((data->flac_data.overflow) + (data->flac_data.overflow_read++)) =\n                                                            (char)(ui16 >> 8);\n\n            i16 = (FLAC__int16)buffer[1][i];\n            ui16 = (FLAC__uint16)i16;\n\n            *((data->flac_data.overflow) + (data->flac_data.overflow_read++)) =\n                                                            (char)(ui16);\n            *((data->flac_data.overflow) + (data->flac_data.overflow_read++)) =\n                                                            (char)(ui16 >> 8);\n        }\n    }\n\n    return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;\n}\n\nstatic void flac_metadata_music_cb(\n                    const FLAC__StreamDecoder *decoder,\n                    const FLAC__StreamMetadata *metadata,\n                    void *client_data)\n{\n    FLAC_music *data = (FLAC_music *)client_data;\n\n    if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {\n        data->flac_data.sample_rate = metadata->data.stream_info.sample_rate;\n        data->flac_data.channels = metadata->data.stream_info.channels;\n        data->flac_data.total_samples =\n                            metadata->data.stream_info.total_samples;\n        data->flac_data.bits_per_sample =\n                            metadata->data.stream_info.bits_per_sample;\n        data->flac_data.sample_size = data->flac_data.channels *\n                                        ((data->flac_data.bits_per_sample) / 8);\n    }\n}\n\nstatic void flac_error_music_cb(\n                const FLAC__StreamDecoder *decoder,\n                FLAC__StreamDecoderErrorStatus status,\n                void *client_data)\n{\n    // print an SDL error based on the error status\n    switch (status) {\n        case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:\n            SDL_SetError (\"Error processing the FLAC file [LOST_SYNC].\");\n        break;\n        case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:\n            SDL_SetError (\"Error processing the FLAC file [BAD_HEADER].\");\n        break;\n        case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:\n            SDL_SetError (\"Error processing the FLAC file [CRC_MISMATCH].\");\n        break;\n        case FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM:\n            SDL_SetError (\"Error processing the FLAC file [UNPARSEABLE].\");\n        break;\n        default:\n            SDL_SetError (\"Error processing the FLAC file [UNKNOWN].\");\n        break;\n    }\n}\n\n/* Load an FLAC stream from an SDL_RWops object */\nFLAC_music *FLAC_new_RW(SDL_RWops *src, int freesrc)\n{\n    FLAC_music *music;\n    int init_stage = 0;\n    int was_error = 1;\n\n    if (!Mix_Init(MIX_INIT_FLAC)) {\n        return NULL;\n    }\n\n    music = (FLAC_music *)SDL_malloc ( sizeof (*music));\n    if (music) {\n        /* Initialize the music structure */\n        memset (music, 0, (sizeof (*music)));\n        FLAC_stop (music);\n        FLAC_setvolume (music, MIX_MAX_VOLUME);\n        music->section = -1;\n        music->src = src;\n        music->freesrc = freesrc;\n        music->flac_data.max_to_read = 0;\n        music->flac_data.overflow = NULL;\n        music->flac_data.overflow_len = 0;\n        music->flac_data.overflow_read = 0;\n        music->flac_data.data = NULL;\n        music->flac_data.data_len = 0;\n        music->flac_data.data_read = 0;\n\n        init_stage++; // stage 1!\n\n        music->flac_decoder = flac.FLAC__stream_decoder_new ();\n\n        if (music->flac_decoder != NULL) {\n            init_stage++; // stage 2!\n\n            if (flac.FLAC__stream_decoder_init_stream(\n                        music->flac_decoder,\n                        flac_read_music_cb, flac_seek_music_cb,\n                        flac_tell_music_cb, flac_length_music_cb,\n                        flac_eof_music_cb, flac_write_music_cb,\n                        flac_metadata_music_cb, flac_error_music_cb,\n                        music) == FLAC__STREAM_DECODER_INIT_STATUS_OK ) {\n                init_stage++; // stage 3!\n\n                if (flac.FLAC__stream_decoder_process_until_end_of_metadata\n                                        (music->flac_decoder)) {\n                    was_error = 0;\n                } else {\n                    SDL_SetError(\"FLAC__stream_decoder_process_until_end_of_metadata() failed\");\n                }\n            } else {\n                SDL_SetError(\"FLAC__stream_decoder_init_stream() failed\");\n            }\n        } else {\n            SDL_SetError(\"FLAC__stream_decoder_new() failed\");\n        }\n\n        if (was_error) {\n            switch (init_stage) {\n                case 3:\n                    flac.FLAC__stream_decoder_finish( music->flac_decoder );\n                case 2:\n                    flac.FLAC__stream_decoder_delete( music->flac_decoder );\n                case 1:\n                case 0:\n                    SDL_free(music);\n                    break;\n            }\n            return NULL;\n        }\n    } else {\n        SDL_OutOfMemory();\n        return NULL;\n    }\n\n    return music;\n}\n\n/* Start playback of a given FLAC stream */\nvoid FLAC_play(FLAC_music *music)\n{\n    music->playing = 1;\n}\n\n/* Return non-zero if a stream is currently playing */\nint FLAC_playing(FLAC_music *music)\n{\n    return(music->playing);\n}\n\n/* Read some FLAC stream data and convert it for output */\nstatic void FLAC_getsome(FLAC_music *music)\n{\n    SDL_AudioCVT *cvt;\n\n    /* GET AUDIO WAVE DATA */\n    // set the max number of characters to read\n    music->flac_data.max_to_read = 8192;\n    music->flac_data.data_len = music->flac_data.max_to_read;\n    music->flac_data.data_read = 0;\n    if (!music->flac_data.data) {\n        music->flac_data.data = (char *)SDL_malloc (music->flac_data.data_len);\n    }\n\n    // we have data to read\n    while(music->flac_data.max_to_read > 0) {\n        // first check if there is data in the overflow from before\n        if (music->flac_data.overflow) {\n            size_t overflow_len = music->flac_data.overflow_read;\n\n            if (overflow_len > (size_t)music->flac_data.max_to_read) {\n                size_t overflow_extra_len = overflow_len -\n                                                music->flac_data.max_to_read;\n\n                SDL_memcpy (music->flac_data.data+music->flac_data.data_read,\n                    music->flac_data.overflow, music->flac_data.max_to_read);\n                music->flac_data.data_read += music->flac_data.max_to_read;\n                SDL_memcpy (music->flac_data.overflow,\n                    music->flac_data.overflow + music->flac_data.max_to_read,\n                    overflow_extra_len);\n                music->flac_data.overflow_len = overflow_extra_len;\n                music->flac_data.overflow_read = overflow_extra_len;\n                music->flac_data.max_to_read = 0;\n            } else {\n                SDL_memcpy (music->flac_data.data+music->flac_data.data_read,\n                    music->flac_data.overflow, overflow_len);\n                music->flac_data.data_read += overflow_len;\n                SDL_free (music->flac_data.overflow);\n                music->flac_data.overflow = NULL;\n                music->flac_data.overflow_len = 0;\n                music->flac_data.overflow_read = 0;\n                music->flac_data.max_to_read -= overflow_len;\n            }\n        }\n        else {\n            if (!flac.FLAC__stream_decoder_process_single (\n                                                        music->flac_decoder)) {\n                music->flac_data.max_to_read = 0;\n            }\n\n            if (flac.FLAC__stream_decoder_get_state (music->flac_decoder)\n                                    == FLAC__STREAM_DECODER_END_OF_STREAM) {\n                music->flac_data.max_to_read = 0;\n            }\n        }\n    }\n\n    if (music->flac_data.data_read <= 0) {\n        if (music->flac_data.data_read == 0) {\n            music->playing = 0;\n        }\n        return;\n    }\n    cvt = &music->cvt;\n    if (music->section < 0) {\n        SDL_BuildAudioCVT (cvt, AUDIO_S16, (Uint8)music->flac_data.channels,\n                        (int)music->flac_data.sample_rate, mixer.format,\n                        mixer.channels, mixer.freq);\n        if (cvt->buf) {\n            SDL_free (cvt->buf);\n        }\n        cvt->buf = (Uint8 *)SDL_malloc (music->flac_data.data_len * cvt->len_mult);\n        music->section = 0;\n    }\n    if (cvt->buf) {\n        SDL_memcpy (cvt->buf, music->flac_data.data, music->flac_data.data_read);\n        if (cvt->needed) {\n            cvt->len = music->flac_data.data_read;\n            SDL_ConvertAudio (cvt);\n        }\n        else {\n            cvt->len_cvt = music->flac_data.data_read;\n        }\n        music->len_available = music->cvt.len_cvt;\n        music->snd_available = music->cvt.buf;\n    }\n    else {\n        SDL_SetError (\"Out of memory\");\n        music->playing = 0;\n    }\n}\n\n/* Play some of a stream previously started with FLAC_play() */\nint FLAC_playAudio(FLAC_music *music, Uint8 *snd, int len)\n{\n    int mixable;\n\n    while ((len > 0) && music->playing) {\n        if (!music->len_available) {\n            FLAC_getsome (music);\n        }\n        mixable = len;\n        if (mixable > music->len_available) {\n            mixable = music->len_available;\n        }\n        if (music->volume == MIX_MAX_VOLUME) {\n            SDL_memcpy (snd, music->snd_available, mixable);\n        }\n        else {\n            SDL_MixAudio (snd, music->snd_available, mixable, music->volume);\n        }\n        music->len_available -= mixable;\n        music->snd_available += mixable;\n        len -= mixable;\n        snd += mixable;\n    }\n\n    return len;\n}\n\n/* Stop playback of a stream previously started with FLAC_play() */\nvoid FLAC_stop(FLAC_music *music)\n{\n    music->playing = 0;\n}\n\n/* Close the given FLAC_music object */\nvoid FLAC_delete(FLAC_music *music)\n{\n    if (music) {\n        if (music->flac_decoder) {\n            flac.FLAC__stream_decoder_finish (music->flac_decoder);\n            flac.FLAC__stream_decoder_delete (music->flac_decoder);\n        }\n\n        if (music->flac_data.data) {\n            SDL_free (music->flac_data.data);\n        }\n\n        if (music->flac_data.overflow) {\n            SDL_free (music->flac_data.overflow);\n        }\n\n        if (music->cvt.buf) {\n            SDL_free (music->cvt.buf);\n        }\n\n        if (music->freesrc) {\n            SDL_RWclose(music->src);\n        }\n        SDL_free (music);\n    }\n}\n\n/* Jump (seek) to a given position (time is in seconds) */\nvoid FLAC_jump_to_time(FLAC_music *music, double time)\n{\n    if (music) {\n        if (music->flac_decoder) {\n            double seek_sample = music->flac_data.sample_rate * time;\n\n            // clear data if it has data\n            if (music->flac_data.data) {\n                SDL_free (music->flac_data.data);\n                music->flac_data.data = NULL;\n            }\n\n            // clear overflow if it has data\n            if (music->flac_data.overflow) {\n                SDL_free (music->flac_data.overflow);\n                music->flac_data.overflow = NULL;\n            }\n\n            if (!flac.FLAC__stream_decoder_seek_absolute (music->flac_decoder,\n                                                (FLAC__uint64)seek_sample)) {\n                if (flac.FLAC__stream_decoder_get_state (music->flac_decoder)\n                                        == FLAC__STREAM_DECODER_SEEK_ERROR) {\n                    flac.FLAC__stream_decoder_flush (music->flac_decoder);\n                }\n\n                SDL_SetError\n                    (\"Seeking of FLAC stream failed: libFLAC seek failed.\");\n            }\n        }\n        else {\n            SDL_SetError\n                (\"Seeking of FLAC stream failed: FLAC decoder was NULL.\");\n        }\n    }\n    else {\n        SDL_SetError (\"Seeking of FLAC stream failed: music was NULL.\");\n    }\n}\n\n#endif /* FLAC_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/music_mad.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MP3_MAD_MUSIC\n\n#include <string.h>\n\n#include \"music_mad.h\"\n\nmad_data *\nmad_openFileRW(SDL_RWops *src, SDL_AudioSpec *mixer, int freesrc)\n{\n  mad_data *mp3_mad;\n\n  mp3_mad = (mad_data *)SDL_malloc(sizeof(mad_data));\n  if (mp3_mad) {\n    mp3_mad->src = src;\n    mp3_mad->freesrc = freesrc;\n    mad_stream_init(&mp3_mad->stream);\n    mad_frame_init(&mp3_mad->frame);\n    mad_synth_init(&mp3_mad->synth);\n    mp3_mad->frames_read = 0;\n    mad_timer_reset(&mp3_mad->next_frame_start);\n    mp3_mad->volume = MIX_MAX_VOLUME;\n    mp3_mad->status = 0;\n    mp3_mad->output_begin = 0;\n    mp3_mad->output_end = 0;\n    mp3_mad->mixer = *mixer;\n  }\n  return mp3_mad;\n}\n\nvoid\nmad_closeFile(mad_data *mp3_mad)\n{\n  mad_stream_finish(&mp3_mad->stream);\n  mad_frame_finish(&mp3_mad->frame);\n  mad_synth_finish(&mp3_mad->synth);\n\n  if (mp3_mad->freesrc) {\n    SDL_RWclose(mp3_mad->src);\n  }\n  SDL_free(mp3_mad);\n}\n\n/* Starts the playback. */\nvoid\nmad_start(mad_data *mp3_mad) {\n  mp3_mad->status |= MS_playing;\n}\n\n/* Stops the playback. */\nvoid\nmad_stop(mad_data *mp3_mad) {\n  mp3_mad->status &= ~MS_playing;\n}\n\n/* Returns true if the playing is engaged, false otherwise. */\nint\nmad_isPlaying(mad_data *mp3_mad) {\n  return ((mp3_mad->status & MS_playing) != 0);\n}\n\n/* Reads the next frame from the file.  Returns true on success or\n   false on failure. */\nstatic int\nread_next_frame(mad_data *mp3_mad) {\n  if (mp3_mad->stream.buffer == NULL ||\n      mp3_mad->stream.error == MAD_ERROR_BUFLEN) {\n    size_t read_size;\n    size_t remaining;\n    unsigned char *read_start;\n\n    /* There might be some bytes in the buffer left over from last\n       time.  If so, move them down and read more bytes following\n       them. */\n    if (mp3_mad->stream.next_frame != NULL) {\n      remaining = mp3_mad->stream.bufend - mp3_mad->stream.next_frame;\n      memmove(mp3_mad->input_buffer, mp3_mad->stream.next_frame, remaining);\n      read_start = mp3_mad->input_buffer + remaining;\n      read_size = MAD_INPUT_BUFFER_SIZE - remaining;\n\n    } else {\n      read_size = MAD_INPUT_BUFFER_SIZE;\n      read_start = mp3_mad->input_buffer;\n      remaining = 0;\n    }\n\n    /* Now read additional bytes from the input file. */\n    read_size = SDL_RWread(mp3_mad->src, read_start, 1, read_size);\n\n    if (read_size <= 0) {\n      if ((mp3_mad->status & (MS_input_eof | MS_input_error)) == 0) {\n        if (read_size == 0) {\n          mp3_mad->status |= MS_input_eof;\n        } else {\n          mp3_mad->status |= MS_input_error;\n        }\n\n        /* At the end of the file, we must stuff MAD_BUFFER_GUARD\n           number of 0 bytes. */\n        SDL_memset(read_start + read_size, 0, MAD_BUFFER_GUARD);\n        read_size += MAD_BUFFER_GUARD;\n      }\n    }\n\n    /* Now feed those bytes into the libmad stream. */\n    mad_stream_buffer(&mp3_mad->stream, mp3_mad->input_buffer,\n                      read_size + remaining);\n    mp3_mad->stream.error = MAD_ERROR_NONE;\n  }\n\n  /* Now ask libmad to extract a frame from the data we just put in\n     its buffer. */\n  if (mad_frame_decode(&mp3_mad->frame, &mp3_mad->stream)) {\n    if (MAD_RECOVERABLE(mp3_mad->stream.error)) {\n      return 0;\n\n    } else if (mp3_mad->stream.error == MAD_ERROR_BUFLEN) {\n      return 0;\n\n    } else {\n      mp3_mad->status |= MS_decode_error;\n      return 0;\n    }\n  }\n\n  mp3_mad->frames_read++;\n  mad_timer_add(&mp3_mad->next_frame_start, mp3_mad->frame.header.duration);\n\n  return 1;\n}\n\n/* Scale a MAD sample to 16 bits for output. */\nstatic signed int\nscale(mad_fixed_t sample) {\n  /* round */\n  sample += (1L << (MAD_F_FRACBITS - 16));\n\n  /* clip */\n  if (sample >= MAD_F_ONE)\n    sample = MAD_F_ONE - 1;\n  else if (sample < -MAD_F_ONE)\n    sample = -MAD_F_ONE;\n\n  /* quantize */\n  return sample >> (MAD_F_FRACBITS + 1 - 16);\n}\n\n/* Once the frame has been read, copies its samples into the output\n   buffer. */\nstatic void\ndecode_frame(mad_data *mp3_mad) {\n  struct mad_pcm *pcm;\n  unsigned int nchannels, nsamples;\n  mad_fixed_t const *left_ch, *right_ch;\n  unsigned char *out;\n  int ret;\n\n  mad_synth_frame(&mp3_mad->synth, &mp3_mad->frame);\n  pcm = &mp3_mad->synth.pcm;\n  out = mp3_mad->output_buffer + mp3_mad->output_end;\n\n  if ((mp3_mad->status & MS_cvt_decoded) == 0) {\n    mp3_mad->status |= MS_cvt_decoded;\n\n    /* The first frame determines some key properties of the stream.\n       In particular, it tells us enough to set up the convert\n       structure now. */\n    SDL_BuildAudioCVT(&mp3_mad->cvt, AUDIO_S16, pcm->channels, mp3_mad->frame.header.samplerate, mp3_mad->mixer.format, mp3_mad->mixer.channels, mp3_mad->mixer.freq);\n  }\n\n  /* pcm->samplerate contains the sampling frequency */\n\n  nchannels = pcm->channels;\n  nsamples  = pcm->length;\n  left_ch   = pcm->samples[0];\n  right_ch  = pcm->samples[1];\n\n  while (nsamples--) {\n    signed int sample;\n\n    /* output sample(s) in 16-bit signed little-endian PCM */\n\n    sample = scale(*left_ch++);\n    *out++ = ((sample >> 0) & 0xff);\n    *out++ = ((sample >> 8) & 0xff);\n\n    if (nchannels == 2) {\n      sample = scale(*right_ch++);\n      *out++ = ((sample >> 0) & 0xff);\n      *out++ = ((sample >> 8) & 0xff);\n    }\n  }\n\n  mp3_mad->output_end = out - mp3_mad->output_buffer;\n  /*assert(mp3_mad->output_end <= MAD_OUTPUT_BUFFER_SIZE);*/\n}\n\nint\nmad_getSamples(mad_data *mp3_mad, Uint8 *stream, int len) {\n  int bytes_remaining;\n  int num_bytes;\n  Uint8 *out;\n\n  if ((mp3_mad->status & MS_playing) == 0) {\n    /* We're not supposed to be playing, so send silence instead. */\n    SDL_memset(stream, 0, len);\n    return 0;\n  }\n\n  out = stream;\n  bytes_remaining = len;\n  while (bytes_remaining > 0) {\n    if (mp3_mad->output_end == mp3_mad->output_begin) {\n      /* We need to get a new frame. */\n      mp3_mad->output_begin = 0;\n      mp3_mad->output_end = 0;\n      if (!read_next_frame(mp3_mad)) {\n        if ((mp3_mad->status & MS_error_flags) != 0) {\n          /* Couldn't read a frame; either an error condition or\n             end-of-file.  Stop. */\n          SDL_memset(out, 0, bytes_remaining);\n          mp3_mad->status &= ~MS_playing;\n          return bytes_remaining;\n        }\n      } else {\n        decode_frame(mp3_mad);\n\n        /* Now convert the frame data to the appropriate format for\n           output. */\n        mp3_mad->cvt.buf = mp3_mad->output_buffer;\n        mp3_mad->cvt.len = mp3_mad->output_end;\n\n        mp3_mad->output_end = (int)(mp3_mad->output_end * mp3_mad->cvt.len_ratio);\n        /*assert(mp3_mad->output_end <= MAD_OUTPUT_BUFFER_SIZE);*/\n        SDL_ConvertAudio(&mp3_mad->cvt);\n      }\n    }\n\n    num_bytes = mp3_mad->output_end - mp3_mad->output_begin;\n    if (bytes_remaining < num_bytes) {\n      num_bytes = bytes_remaining;\n    }\n\n    if (mp3_mad->volume == MIX_MAX_VOLUME) {\n      SDL_memcpy(out, mp3_mad->output_buffer + mp3_mad->output_begin, num_bytes);\n    } else {\n      SDL_MixAudio(out, mp3_mad->output_buffer + mp3_mad->output_begin,\n                   num_bytes, mp3_mad->volume);\n    }\n    out += num_bytes;\n    mp3_mad->output_begin += num_bytes;\n    bytes_remaining -= num_bytes;\n  }\n  return 0;\n}\n\nvoid\nmad_seek(mad_data *mp3_mad, double position) {\n  mad_timer_t target;\n  int int_part;\n\n  int_part = (int)position;\n  mad_timer_set(&target, int_part,\n                (int)((position - int_part) * 1000000), 1000000);\n\n  if (mad_timer_compare(mp3_mad->next_frame_start, target) > 0) {\n    /* In order to seek backwards in a VBR file, we have to rewind and\n       start again from the beginning.  This isn't necessary if the\n       file happens to be CBR, of course; in that case we could seek\n       directly to the frame we want.  But I leave that little\n       optimization for the future developer who discovers she really\n       needs it. */\n    mp3_mad->frames_read = 0;\n    mad_timer_reset(&mp3_mad->next_frame_start);\n    mp3_mad->status &= ~MS_error_flags;\n    mp3_mad->output_begin = 0;\n    mp3_mad->output_end = 0;\n\n    SDL_RWseek(mp3_mad->src, 0, RW_SEEK_SET);\n  }\n\n  /* Now we have to skip frames until we come to the right one.\n     Again, only truly necessary if the file is VBR. */\n  while (mad_timer_compare(mp3_mad->next_frame_start, target) < 0) {\n    if (!read_next_frame(mp3_mad)) {\n      if ((mp3_mad->status & MS_error_flags) != 0) {\n        /* Couldn't read a frame; either an error condition or\n           end-of-file.  Stop. */\n        mp3_mad->status &= ~MS_playing;\n        return;\n      }\n    }\n  }\n\n  /* Here we are, at the beginning of the frame that contains the\n     target time.  Ehh, I say that's close enough.  If we wanted to,\n     we could get more precise by decoding the frame now and counting\n     the appropriate number of samples out of it. */\n}\n\nvoid\nmad_setVolume(mad_data *mp3_mad, int volume) {\n  mp3_mad->volume = volume;\n}\n\n\n#endif  /* MP3_MAD_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/music_mod.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id: music_mod.c 4211 2008-12-08 00:27:32Z slouken $ */\n\n#ifdef MOD_MUSIC\n\n/* This file supports MOD tracker music streams */\n\n#include \"SDL_mixer.h\"\n#include \"dynamic_mod.h\"\n#include \"music_mod.h\"\n\n#include \"mikmod.h\"\n\n#define SDL_SURROUND\n#ifdef SDL_SURROUND\n#define MAX_OUTPUT_CHANNELS 6\n#else\n#define MAX_OUTPUT_CHANNELS 2\n#endif\n\n/* Reference for converting mikmod output to 4/6 channels */\nstatic int current_output_channels;\nstatic Uint16 current_output_format;\n\nstatic int music_swap8;\nstatic int music_swap16;\n\n/* Initialize the MOD player, with the given mixer settings\n   This function returns 0, or -1 if there was an error.\n */\nint MOD_init(SDL_AudioSpec *mixerfmt)\n{\n    CHAR *list;\n\n    if ( !Mix_Init(MIX_INIT_MOD) ) {\n        return -1;\n    }\n\n    /* Set the MikMod music format */\n    music_swap8 = 0;\n    music_swap16 = 0;\n    switch (mixerfmt->format) {\n\n        case AUDIO_U8:\n        case AUDIO_S8: {\n            if ( mixerfmt->format == AUDIO_S8 ) {\n                music_swap8 = 1;\n            }\n            *mikmod.md_mode = 0;\n        }\n        break;\n\n        case AUDIO_S16LSB:\n        case AUDIO_S16MSB: {\n            /* See if we need to correct MikMod mixing */\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n            if ( mixerfmt->format == AUDIO_S16MSB ) {\n#else\n            if ( mixerfmt->format == AUDIO_S16LSB ) {\n#endif\n                music_swap16 = 1;\n            }\n            *mikmod.md_mode = DMODE_16BITS;\n        }\n        break;\n\n        default: {\n            Mix_SetError(\"Unknown hardware audio format\");\n            return -1;\n        }\n    }\n    current_output_channels = mixerfmt->channels;\n    current_output_format = mixerfmt->format;\n    if ( mixerfmt->channels > 1 ) {\n        if ( mixerfmt->channels > MAX_OUTPUT_CHANNELS ) {\n            Mix_SetError(\"Hardware uses more channels than mixerfmt\");\n            return -1;\n        }\n        *mikmod.md_mode |= DMODE_STEREO;\n    }\n    *mikmod.md_mixfreq = mixerfmt->freq;\n    *mikmod.md_device  = 0;\n    *mikmod.md_volume  = 96;\n    *mikmod.md_musicvolume = 128;\n    *mikmod.md_sndfxvolume = 128;\n    *mikmod.md_pansep  = 128;\n    *mikmod.md_reverb  = 0;\n    *mikmod.md_mode    |= DMODE_HQMIXER|DMODE_SOFT_MUSIC|DMODE_SURROUND;\n\n    list = mikmod.MikMod_InfoDriver();\n    if ( list )\n      mikmod.MikMod_free(list);\n    else\n      mikmod.MikMod_RegisterDriver(mikmod.drv_nos);\n\n    list = mikmod.MikMod_InfoLoader();\n    if ( list )\n      mikmod.MikMod_free(list);\n    else\n      mikmod.MikMod_RegisterAllLoaders();\n\n    if ( mikmod.MikMod_Init(NULL) ) {\n        Mix_SetError(\"%s\", mikmod.MikMod_strerror(*mikmod.MikMod_errno));\n        return -1;\n    }\n\n    return 0;\n}\n\n/* Uninitialize the music players */\nvoid MOD_exit(void)\n{\n    if (mikmod.MikMod_Exit) {\n        mikmod.MikMod_Exit();\n    }\n}\n\n/* Set the volume for a MOD stream */\nvoid MOD_setvolume(MODULE *music, int volume)\n{\n    mikmod.Player_SetVolume((SWORD)volume);\n}\n\ntypedef struct\n{\n    MREADER mr;\n    Sint64 offset;\n    Sint64 eof;\n    SDL_RWops *src;\n} LMM_MREADER;\n\nBOOL LMM_Seek(struct MREADER *mr,long to,int dir)\n{\n\tSint64 offset = to;\n    LMM_MREADER* lmmmr = (LMM_MREADER*)mr;\n    if ( dir == SEEK_SET ) {\n        offset += lmmmr->offset;\n    }\n    return (SDL_RWseek(lmmmr->src, offset, dir) < lmmmr->offset);\n}\nlong LMM_Tell(struct MREADER *mr)\n{\n    LMM_MREADER* lmmmr = (LMM_MREADER*)mr;\n    return (long)(SDL_RWtell(lmmmr->src) - lmmmr->offset);\n}\nBOOL LMM_Read(struct MREADER *mr,void *buf,size_t sz)\n{\n    LMM_MREADER* lmmmr = (LMM_MREADER*)mr;\n    return SDL_RWread(lmmmr->src, buf, sz, 1);\n}\nint LMM_Get(struct MREADER *mr)\n{\n    unsigned char c;\n    LMM_MREADER* lmmmr = (LMM_MREADER*)mr;\n    if ( SDL_RWread(lmmmr->src, &c, 1, 1) ) {\n        return c;\n    }\n    return EOF;\n}\nBOOL LMM_Eof(struct MREADER *mr)\n{\n    Sint64 offset;\n    LMM_MREADER* lmmmr = (LMM_MREADER*)mr;\n    offset = LMM_Tell(mr);\n    return offset >= lmmmr->eof;\n}\nMODULE *MikMod_LoadSongRW(SDL_RWops *src, int maxchan)\n{\n    LMM_MREADER lmmmr = {\n        { LMM_Seek, LMM_Tell, LMM_Read, LMM_Get, LMM_Eof },\n        0,\n        0,\n        0\n    };\n    lmmmr.offset = SDL_RWtell(src);\n    SDL_RWseek(src, 0, RW_SEEK_END);\n    lmmmr.eof = SDL_RWtell(src);\n    SDL_RWseek(src, lmmmr.offset, RW_SEEK_SET);\n    lmmmr.src = src;\n    return mikmod.Player_LoadGeneric((MREADER*)&lmmmr, maxchan, 0);\n}\n\n/* Load a MOD stream from an SDL_RWops object */\nMODULE *MOD_new_RW(SDL_RWops *src, int freesrc)\n{\n    MODULE *module;\n\n    /* Make sure the mikmod library is loaded */\n    if ( !Mix_Init(MIX_INIT_MOD) ) {\n        return NULL;\n    }\n\n    module = MikMod_LoadSongRW(src, 64);\n    if (!module) {\n        Mix_SetError(\"%s\", mikmod.MikMod_strerror(*mikmod.MikMod_errno));\n        return NULL;\n    }\n\n    /* Stop implicit looping, fade out and other flags. */\n    module->extspd  = 1;\n    module->panflag = 1;\n    module->wrap    = 0;\n    module->loop    = 0;\n#if 0 /* Don't set fade out by default - unfortunately there's no real way\nto query the status of the song or set trigger actions.  Hum. */\n    module->fadeout = 1;\n#endif\n\n    if ( freesrc ) {\n        SDL_RWclose(src);\n    }\n    return module;\n}\n\n/* Start playback of a given MOD stream */\nvoid MOD_play(MODULE *music)\n{\n    mikmod.Player_Start(music);\n}\n\n/* Return non-zero if a stream is currently playing */\nint MOD_playing(MODULE *music)\n{\n    return mikmod.Player_Active();\n}\n\n/* Play some of a stream previously started with MOD_play() */\nint MOD_playAudio(MODULE *music, Uint8 *stream, int len)\n{\n    if (current_output_channels > 2) {\n        int small_len = 2 * len / current_output_channels;\n        int i;\n        Uint8 *src, *dst;\n\n        mikmod.VC_WriteBytes((SBYTE *)stream, small_len);\n        /* and extend to len by copying channels */\n        src = stream + small_len;\n        dst = stream + len;\n\n        switch (current_output_format & 0xFF) {\n            case 8:\n                for ( i=small_len/2; i; --i ) {\n                    src -= 2;\n                    dst -= current_output_channels;\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = src[0];\n                    dst[3] = src[1];\n                    if (current_output_channels == 6) {\n                        dst[4] = src[0];\n                        dst[5] = src[1];\n                    }\n                }\n                break;\n            case 16:\n                for ( i=small_len/4; i; --i ) {\n                    src -= 4;\n                    dst -= 2 * current_output_channels;\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = src[2];\n                    dst[3] = src[3];\n                    dst[4] = src[0];\n                    dst[5] = src[1];\n                    dst[6] = src[2];\n                    dst[7] = src[3];\n                    if (current_output_channels == 6) {\n                        dst[8] = src[0];\n                        dst[9] = src[1];\n                        dst[10] = src[2];\n                        dst[11] = src[3];\n                    }\n                }\n                break;\n        }\n    } else {\n        mikmod.VC_WriteBytes((SBYTE *)stream, len);\n    }\n    if ( music_swap8 ) {\n        Uint8 *dst;\n        int i;\n\n        dst = stream;\n        for ( i=len; i; --i ) {\n            *dst++ ^= 0x80;\n        }\n    } else\n    if ( music_swap16 ) {\n        Uint8 *dst, tmp;\n        int i;\n\n        dst = stream;\n        for ( i=(len/2); i; --i ) {\n            tmp = dst[0];\n            dst[0] = dst[1];\n            dst[1] = tmp;\n            dst += 2;\n        }\n    }\n    return 0;\n}\n\n/* Stop playback of a stream previously started with MOD_play() */\nvoid MOD_stop(MODULE *music)\n{\n    mikmod.Player_Stop();\n}\n\n/* Close the given MOD stream */\nvoid MOD_delete(MODULE *music)\n{\n    mikmod.Player_Free(music);\n}\n\n/* Jump (seek) to a given position (time is in seconds) */\nvoid MOD_jump_to_time(MODULE *music, double time)\n{\n    mikmod.Player_SetPosition((UWORD)time);\n}\n\n#endif /* MOD_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/music_modplug.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifdef MODPLUG_MUSIC\n\n#include \"SDL_mixer.h\"\n#include \"dynamic_modplug.h\"\n#include \"music_modplug.h\"\n\nstatic int current_output_channels=0;\nstatic int music_swap8=0;\nstatic int music_swap16=0;\nstatic ModPlug_Settings settings;\n\nint modplug_init(SDL_AudioSpec *spec)\n{\n    if ( !Mix_Init(MIX_INIT_MODPLUG) ) {\n        return -1;\n    }\n\n    modplug.ModPlug_GetSettings(&settings);\n    settings.mFlags=MODPLUG_ENABLE_OVERSAMPLING;\n    current_output_channels=spec->channels;\n    settings.mChannels=spec->channels>1?2:1;\n    settings.mBits=spec->format&0xFF;\n\n    music_swap8 = 0;\n    music_swap16 = 0;\n\n    switch(spec->format)\n    {\n        case AUDIO_U8:\n        case AUDIO_S8: {\n            if ( spec->format == AUDIO_S8 ) {\n                music_swap8 = 1;\n            }\n            settings.mBits=8;\n        }\n        break;\n\n        case AUDIO_S16LSB:\n        case AUDIO_S16MSB: {\n            /* See if we need to correct MikMod mixing */\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN\n            if ( spec->format == AUDIO_S16MSB ) {\n#else\n            if ( spec->format == AUDIO_S16LSB ) {\n#endif\n                music_swap16 = 1;\n            }\n            settings.mBits=16;\n        }\n        break;\n\n        default: {\n            Mix_SetError(\"Unknown hardware audio format\");\n            return -1;\n        }\n\n    }\n\n    settings.mFrequency=spec->freq; /*TODO: limit to 11025, 22050, or 44100 ? */\n    settings.mResamplingMode=MODPLUG_RESAMPLE_FIR;\n    settings.mReverbDepth=0;\n    settings.mReverbDelay=100;\n    settings.mBassAmount=0;\n    settings.mBassRange=50;\n    settings.mSurroundDepth=0;\n    settings.mSurroundDelay=10;\n    settings.mLoopCount=0;\n    modplug.ModPlug_SetSettings(&settings);\n    return 0;\n}\n\n/* Uninitialize the music players */\nvoid modplug_exit()\n{\n}\n\n/* Set the volume for a modplug stream */\nvoid modplug_setvolume(modplug_data *music, int volume)\n{\n    modplug.ModPlug_SetMasterVolume(music->file, volume*4);\n}\n\n/* Load a modplug stream from an SDL_RWops object */\nmodplug_data *modplug_new_RW(SDL_RWops *src, int freesrc)\n{\n    modplug_data *music = NULL;\n    Sint64 offset;\n    size_t sz;\n    char *buf;\n\n    /* Make sure the modplug library is loaded */\n    if ( !Mix_Init(MIX_INIT_MODPLUG) ) {\n        return NULL;\n    }\n\n    offset = SDL_RWtell(src);\n    SDL_RWseek(src, 0, RW_SEEK_END);\n    sz = (size_t)(SDL_RWtell(src) - offset);\n    SDL_RWseek(src, offset, RW_SEEK_SET);\n    buf = (char*)SDL_malloc(sz);\n    if (buf) {\n        if (SDL_RWread(src, buf, sz, 1) == 1) {\n            music = (modplug_data*)SDL_malloc(sizeof(modplug_data));\n            if (music) {\n                music->playing = 0;\n                music->file = modplug.ModPlug_Load(buf, sz);\n                if (!music->file) {\n                    SDL_free(music);\n                    music = NULL;\n                }\n            } else {\n                SDL_OutOfMemory();\n            }\n        }\n        SDL_free(buf);\n    } else {\n        SDL_OutOfMemory();\n    }\n    if (music && freesrc) {\n        SDL_RWclose(src);\n    }\n    return music;\n}\n\n/* Start playback of a given modplug stream */\nvoid modplug_play(modplug_data *music)\n{\n    modplug.ModPlug_Seek(music->file,0);\n    music->playing=1;\n}\n\n/* Return non-zero if a stream is currently playing */\nint modplug_playing(modplug_data *music)\n{\n    return music && music->playing;\n}\n\n/* Play some of a stream previously started with modplug_play() */\nint modplug_playAudio(modplug_data *music, Uint8 *stream, int len)\n{\n    if (current_output_channels > 2) {\n        int small_len = 2 * len / current_output_channels;\n        int i;\n        Uint8 *src, *dst;\n\n        i=modplug.ModPlug_Read(music->file, stream, small_len);\n        if(i<small_len)\n        {\n            SDL_memset(stream+i,0,small_len-i);\n            music->playing=0;\n        }\n        /* and extend to len by copying channels */\n        src = stream + small_len;\n        dst = stream + len;\n\n        switch (settings.mBits) {\n            case 8:\n                for ( i=small_len/2; i; --i ) {\n                    src -= 2;\n                    dst -= current_output_channels;\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = src[0];\n                    dst[3] = src[1];\n                    if (current_output_channels == 6) {\n                        dst[4] = src[0];\n                        dst[5] = src[1];\n                    }\n                }\n                break;\n            case 16:\n                for ( i=small_len/4; i; --i ) {\n                    src -= 4;\n                    dst -= 2 * current_output_channels;\n                    dst[0] = src[0];\n                    dst[1] = src[1];\n                    dst[2] = src[2];\n                    dst[3] = src[3];\n                    dst[4] = src[0];\n                    dst[5] = src[1];\n                    dst[6] = src[2];\n                    dst[7] = src[3];\n                    if (current_output_channels == 6) {\n                        dst[8] = src[0];\n                        dst[9] = src[1];\n                        dst[10] = src[2];\n                        dst[11] = src[3];\n                    }\n                }\n                break;\n        }\n    } else {\n        int i=modplug.ModPlug_Read(music->file, stream, len);\n        if(i<len)\n        {\n            SDL_memset(stream+i,0,len-i);\n            music->playing=0;\n        }\n    }\n    if ( music_swap8 ) {\n        Uint8 *dst;\n        int i;\n\n        dst = stream;\n        for ( i=len; i; --i ) {\n            *dst++ ^= 0x80;\n        }\n    } else\n    if ( music_swap16 ) {\n        Uint8 *dst, tmp;\n        int i;\n\n        dst = stream;\n        for ( i=(len/2); i; --i ) {\n            tmp = dst[0];\n            dst[0] = dst[1];\n            dst[1] = tmp;\n            dst += 2;\n        }\n    }\n    return 0;\n}\n\n/* Stop playback of a stream previously started with modplug_play() */\nvoid modplug_stop(modplug_data *music)\n{\n    music->playing=0;\n}\n\n/* Close the given modplug stream */\nvoid modplug_delete(modplug_data *music)\n{\n    modplug.ModPlug_Unload(music->file);\n    SDL_free(music);\n}\n\n/* Jump (seek) to a given position (time is in seconds) */\nvoid modplug_jump_to_time(modplug_data *music, double time)\n{\n    modplug.ModPlug_Seek(music->file,(int)(time*1000));\n}\n\n#endif /* MODPLUG_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/music_ogg.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id$ */\n\n#ifdef OGG_MUSIC\n\n/* This file supports Ogg Vorbis music streams */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL_mixer.h\"\n#include \"dynamic_ogg.h\"\n#include \"music_ogg.h\"\n\n/* This is the format of the audio mixer data */\nstatic SDL_AudioSpec mixer;\n\n/* Initialize the Ogg Vorbis player, with the given mixer settings\n   This function returns 0, or -1 if there was an error.\n */\nint OGG_init(SDL_AudioSpec *mixerfmt)\n{\n    mixer = *mixerfmt;\n    return(0);\n}\n\n/* Set the volume for an OGG stream */\nvoid OGG_setvolume(OGG_music *music, int volume)\n{\n    music->volume = volume;\n}\n\nstatic size_t sdl_read_func(void *ptr, size_t size, size_t nmemb, void *datasource)\n{\n    return SDL_RWread((SDL_RWops*)datasource, ptr, size, nmemb);\n}\n\nstatic int sdl_seek_func(void *datasource, ogg_int64_t offset, int whence)\n{\n    return (int)SDL_RWseek((SDL_RWops*)datasource, offset, whence);\n}\n\nstatic long sdl_tell_func(void *datasource)\n{\n    return (long)SDL_RWtell((SDL_RWops*)datasource);\n}\n\n/* Load an OGG stream from an SDL_RWops object */\nOGG_music *OGG_new_RW(SDL_RWops *src, int freesrc)\n{\n    OGG_music *music;\n    ov_callbacks callbacks;\n\n    if ( !Mix_Init(MIX_INIT_OGG) ) {\n        return(NULL);\n    }\n\n    SDL_memset(&callbacks, 0, sizeof(callbacks));\n    callbacks.read_func = sdl_read_func;\n    callbacks.seek_func = sdl_seek_func;\n    callbacks.tell_func = sdl_tell_func;\n\n    music = (OGG_music *)SDL_malloc(sizeof *music);\n    if ( music ) {\n        /* Initialize the music structure */\n        SDL_memset(music, 0, (sizeof *music));\n        music->src = src;\n        music->freesrc = freesrc;\n        OGG_stop(music);\n        OGG_setvolume(music, MIX_MAX_VOLUME);\n        music->section = -1;\n\n        if ( vorbis.ov_open_callbacks(src, &music->vf, NULL, 0, callbacks) < 0 ) {\n            SDL_SetError(\"Not an Ogg Vorbis audio stream\");\n            SDL_free(music);\n            return(NULL);\n        }\n    } else {\n        SDL_OutOfMemory();\n        return(NULL);\n    }\n    return(music);\n}\n\n/* Start playback of a given OGG stream */\nvoid OGG_play(OGG_music *music)\n{\n    music->playing = 1;\n}\n\n/* Return non-zero if a stream is currently playing */\nint OGG_playing(OGG_music *music)\n{\n    return(music->playing);\n}\n\n/* Read some Ogg stream data and convert it for output */\nstatic void OGG_getsome(OGG_music *music)\n{\n    int section;\n    int len;\n    char data[4096];\n    SDL_AudioCVT *cvt;\n\n#ifdef OGG_USE_TREMOR\n    len = vorbis.ov_read(&music->vf, data, sizeof(data), &section);\n#else\n    len = vorbis.ov_read(&music->vf, data, sizeof(data), 0, 2, 1, &section);\n#endif\n    if ( len <= 0 ) {\n        if ( len == 0 ) {\n            music->playing = 0;\n        }\n        return;\n    }\n    cvt = &music->cvt;\n    if ( section != music->section ) {\n        vorbis_info *vi;\n\n        vi = vorbis.ov_info(&music->vf, -1);\n        SDL_BuildAudioCVT(cvt, AUDIO_S16, vi->channels, vi->rate,\n                               mixer.format,mixer.channels,mixer.freq);\n        if ( cvt->buf ) {\n            SDL_free(cvt->buf);\n        }\n        cvt->buf = (Uint8 *)SDL_malloc(sizeof(data)*cvt->len_mult);\n        music->section = section;\n    }\n    if ( cvt->buf ) {\n        SDL_memcpy(cvt->buf, data, len);\n        if ( cvt->needed ) {\n            cvt->len = len;\n            SDL_ConvertAudio(cvt);\n        } else {\n            cvt->len_cvt = len;\n        }\n        music->len_available = music->cvt.len_cvt;\n        music->snd_available = music->cvt.buf;\n    } else {\n        SDL_SetError(\"Out of memory\");\n        music->playing = 0;\n    }\n}\n\n/* Play some of a stream previously started with OGG_play() */\nint OGG_playAudio(OGG_music *music, Uint8 *snd, int len)\n{\n    int mixable;\n\n    while ( (len > 0) && music->playing ) {\n        if ( ! music->len_available ) {\n            OGG_getsome(music);\n        }\n        mixable = len;\n        if ( mixable > music->len_available ) {\n            mixable = music->len_available;\n        }\n        if ( music->volume == MIX_MAX_VOLUME ) {\n            SDL_memcpy(snd, music->snd_available, mixable);\n        } else {\n            SDL_MixAudio(snd, music->snd_available, mixable,\n                                          music->volume);\n        }\n        music->len_available -= mixable;\n        music->snd_available += mixable;\n        len -= mixable;\n        snd += mixable;\n    }\n\n    return len;\n}\n\n/* Stop playback of a stream previously started with OGG_play() */\nvoid OGG_stop(OGG_music *music)\n{\n    music->playing = 0;\n}\n\n/* Close the given OGG stream */\nvoid OGG_delete(OGG_music *music)\n{\n    if ( music ) {\n        if ( music->cvt.buf ) {\n            SDL_free(music->cvt.buf);\n        }\n        if ( music->freesrc ) {\n            SDL_RWclose(music->src);\n        }\n        vorbis.ov_clear(&music->vf);\n        SDL_free(music);\n    }\n}\n\n/* Jump (seek) to a given position (time is in seconds) */\nvoid OGG_jump_to_time(OGG_music *music, double time)\n{\n#ifdef OGG_USE_TREMOR\n       vorbis.ov_time_seek( &music->vf, (ogg_int64_t)(time * 1000.0) );\n#else\n       vorbis.ov_time_seek( &music->vf, time );\n#endif\n}\n\n#endif /* OGG_MUSIC */\n"
  },
  {
    "path": "libs/SDL2_mixer/src/playmus.c",
    "content": "/*\n  PLAYMUS:  A test application for the SDL mixer library.\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* Quiet windows compiler warnings */\n#define _CRT_SECURE_NO_WARNINGS\n\n/* $Id$ */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#ifdef unix\n#include <unistd.h>\n#endif\n\n#include \"SDL.h\"\n#include \"SDL_mixer.h\"\n\n#ifdef HAVE_SIGNAL_H\n#include <signal.h>\n#endif\n\n\nstatic int audio_open = 0;\nstatic Mix_Music *music = NULL;\nstatic int next_track = 0;\n\nvoid CleanUp(int exitcode)\n{\n    if( Mix_PlayingMusic() ) {\n        Mix_FadeOutMusic(1500);\n        SDL_Delay(1500);\n    }\n    if ( music ) {\n        Mix_FreeMusic(music);\n        music = NULL;\n    }\n    if ( audio_open ) {\n        Mix_CloseAudio();\n        audio_open = 0;\n    }\n    SDL_Quit();\n    exit(exitcode);\n}\n\nvoid Usage(char *argv0)\n{\n    fprintf(stderr, \"Usage: %s [-i] [-l] [-8] [-r rate] [-c channels] [-b buffers] [-v N] [-rwops] <musicfile>\\n\", argv0);\n}\n\nvoid Menu(void)\n{\n    char buf[10];\n\n    printf(\"Available commands: (p)ause (r)esume (h)alt volume(v#) > \");\n    fflush(stdin);\n    if (scanf(\"%s\",buf) == 1) {\n        switch(buf[0]){\n        case 'p': case 'P':\n            Mix_PauseMusic();\n            break;\n        case 'r': case 'R':\n            Mix_ResumeMusic();\n            break;\n        case 'h': case 'H':\n            Mix_HaltMusic();\n            break;\n        case 'v': case 'V':\n            Mix_VolumeMusic(atoi(buf+1));\n            break;\n        }\n    }\n    printf(\"Music playing: %s Paused: %s\\n\", Mix_PlayingMusic() ? \"yes\" : \"no\",\n           Mix_PausedMusic() ? \"yes\" : \"no\");\n}\n\n#ifdef HAVE_SIGNAL_H\n\nvoid IntHandler(int sig)\n{\n    switch (sig) {\n            case SIGINT:\n            next_track++;\n            break;\n    }\n}\n\n#endif\n\nint main(int argc, char *argv[])\n{\n    int audio_rate;\n    Uint16 audio_format;\n    int audio_channels;\n    int audio_buffers;\n    int audio_volume = MIX_MAX_VOLUME;\n    int looping = 0;\n    int interactive = 0;\n    int rwops = 0;\n    int i;\n\n    /* Initialize variables */\n    audio_rate = 22050;\n    audio_format = AUDIO_S16;\n    audio_channels = 2;\n    audio_buffers = 4096;\n\n    /* Check command line usage */\n    for ( i=1; argv[i] && (*argv[i] == '-'); ++i ) {\n        if ( (strcmp(argv[i], \"-r\") == 0) && argv[i+1] ) {\n            ++i;\n            audio_rate = atoi(argv[i]);\n        } else\n        if ( strcmp(argv[i], \"-m\") == 0 ) {\n            audio_channels = 1;\n        } else\n        if ( (strcmp(argv[i], \"-c\") == 0) && argv[i+1] ) {\n            ++i;\n            audio_channels = atoi(argv[i]);\n        } else\n        if ( (strcmp(argv[i], \"-b\") == 0) && argv[i+1] ) {\n            ++i;\n            audio_buffers = atoi(argv[i]);\n        } else\n        if ( (strcmp(argv[i], \"-v\") == 0) && argv[i+1] ) {\n            ++i;\n            audio_volume = atoi(argv[i]);\n        } else\n        if ( strcmp(argv[i], \"-l\") == 0 ) {\n            looping = -1;\n        } else\n        if ( strcmp(argv[i], \"-i\") == 0 ) {\n            interactive = 1;\n        } else\n        if ( strcmp(argv[i], \"-8\") == 0 ) {\n            audio_format = AUDIO_U8;\n        } else\n        if ( strcmp(argv[i], \"-rwops\") == 0 ) {\n            rwops = 1;\n        } else {\n            Usage(argv[0]);\n            return(1);\n        }\n    }\n    if ( ! argv[i] ) {\n        Usage(argv[0]);\n        return(1);\n    }\n\n    /* Initialize the SDL library */\n    if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) {\n        fprintf(stderr, \"Couldn't initialize SDL: %s\\n\",SDL_GetError());\n        return(255);\n    }\n\n#ifdef HAVE_SIGNAL_H\n    signal(SIGINT, IntHandler);\n    signal(SIGTERM, CleanUp);\n#endif\n\n    /* Open the audio device */\n    if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) < 0) {\n        fprintf(stderr, \"Couldn't open audio: %s\\n\", SDL_GetError());\n        return(2);\n    } else {\n        Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels);\n        printf(\"Opened audio at %d Hz %d bit %s (%s), %d bytes audio buffer\\n\", audio_rate,\n            (audio_format&0xFF),\n            (audio_channels > 2) ? \"surround\" : (audio_channels > 1) ? \"stereo\" : \"mono\",\n            (audio_format&0x1000) ? \"BE\" : \"LE\",\n            audio_buffers );\n    }\n    audio_open = 1;\n\n    /* Set the music volume */\n    Mix_VolumeMusic(audio_volume);\n\n    /* Set the external music player, if any */\n    Mix_SetMusicCMD(SDL_getenv(\"MUSIC_CMD\"));\n\n    while (argv[i]) {\n        next_track = 0;\n\n        /* Load the requested music file */\n        if ( rwops ) {\n            music = Mix_LoadMUS_RW(SDL_RWFromFile(argv[i], \"rb\"), SDL_TRUE);\n        } else {\n            music = Mix_LoadMUS(argv[i]);\n        }\n        if ( music == NULL ) {\n            fprintf(stderr, \"Couldn't load %s: %s\\n\",\n                argv[i], SDL_GetError());\n            CleanUp(2);\n        }\n\n        /* Play and then exit */\n        printf(\"Playing %s\\n\", argv[i]);\n        Mix_FadeInMusic(music,looping,2000);\n        while ( !next_track && (Mix_PlayingMusic() || Mix_PausedMusic()) ) {\n            if(interactive)\n                Menu();\n            else\n                SDL_Delay(100);\n        }\n        Mix_FreeMusic(music);\n        music = NULL;\n\n        /* If the user presses Ctrl-C more than once, exit. */\n        SDL_Delay(500);\n        if ( next_track > 1 ) break;\n\n        i++;\n    }\n    CleanUp(0);\n\n    /* Not reached, but fixes compiler warnings */\n    return 0;\n}\n"
  },
  {
    "path": "libs/SDL2_mixer/src/playwave.c",
    "content": "/*\n  PLAYWAVE:  A test application for the SDL mixer library.\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id$ */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#ifdef unix\n#include <unistd.h>\n#endif\n\n#include \"SDL.h\"\n#include \"SDL_mixer.h\"\n\n#ifdef HAVE_SIGNAL_H\n#include <signal.h>\n#endif\n\n\n/*\n * rcg06132001 various mixer tests. Define the ones you want.\n */\n/*#define TEST_MIX_DECODERS*/\n/*#define TEST_MIX_VERSIONS*/\n/*#define TEST_MIX_CHANNELFINISHED*/\n/*#define TEST_MIX_PANNING*/\n/*#define TEST_MIX_DISTANCE*/\n/*#define TEST_MIX_POSITION*/\n\n\n#if (defined TEST_MIX_POSITION)\n\n#if (defined TEST_MIX_PANNING)\n#error TEST_MIX_POSITION interferes with TEST_MIX_PANNING.\n#endif\n\n#if (defined TEST_MIX_DISTANCE)\n#error TEST_MIX_POSITION interferes with TEST_MIX_DISTANCE.\n#endif\n\n#endif\n\n\n/* rcg06192001 for debugging purposes. */\nstatic void output_test_warnings(void)\n{\n#if (defined TEST_MIX_CHANNELFINISHED)\n    fprintf(stderr, \"Warning: TEST_MIX_CHANNELFINISHED is enabled in this binary...\\n\");\n#endif\n#if (defined TEST_MIX_PANNING)\n    fprintf(stderr, \"Warning: TEST_MIX_PANNING is enabled in this binary...\\n\");\n#endif\n#if (defined TEST_MIX_VERSIONS)\n    fprintf(stderr, \"Warning: TEST_MIX_VERSIONS is enabled in this binary...\\n\");\n#endif\n#if (defined TEST_MIX_DISTANCE)\n    fprintf(stderr, \"Warning: TEST_MIX_DISTANCE is enabled in this binary...\\n\");\n#endif\n#if (defined TEST_MIX_POSITION)\n    fprintf(stderr, \"Warning: TEST_MIX_POSITION is enabled in this binary...\\n\");\n#endif\n}\n\n\nstatic int audio_open = 0;\nstatic Mix_Chunk *wave = NULL;\n\n/* rcg06042009 Report available decoders. */\n#if (defined TEST_MIX_DECODERS)\nstatic void report_decoders(void)\n{\n    int i, total;\n\n    printf(\"Supported decoders...\\n\");\n    total = Mix_GetNumChunkDecoders();\n    for (i = 0; i < total; i++) {\n        fprintf(stderr, \" - chunk decoder: %s\\n\", Mix_GetChunkDecoder(i));\n    }\n\n    total = Mix_GetNumMusicDecoders();\n    for (i = 0; i < total; i++) {\n        fprintf(stderr, \" - music decoder: %s\\n\", Mix_GetMusicDecoder(i));\n    }\n}\n#endif\n\n/* rcg06192001 Check new Mixer version API. */\n#if (defined TEST_MIX_VERSIONS)\nstatic void output_versions(const char *libname, const SDL_version *compiled,\n                            const SDL_version *linked)\n{\n    fprintf(stderr,\n            \"This program was compiled against %s %d.%d.%d,\\n\"\n            \" and is dynamically linked to %d.%d.%d.\\n\", libname,\n            compiled->major, compiled->minor, compiled->patch,\n            linked->major, linked->minor, linked->patch);\n}\n\nstatic void test_versions(void)\n{\n    SDL_version compiled;\n    const SDL_version *linked;\n\n    SDL_VERSION(&compiled);\n    linked = SDL_Linked_Version();\n    output_versions(\"SDL\", &compiled, linked);\n\n    SDL_MIXER_VERSION(&compiled);\n    linked = Mix_Linked_Version();\n    output_versions(\"SDL_mixer\", &compiled, linked);\n}\n#endif\n\n\n#ifdef TEST_MIX_CHANNELFINISHED  /* rcg06072001 */\nstatic volatile int channel_is_done = 0;\nstatic void channel_complete_callback(int chan)\n{\n    Mix_Chunk *done_chunk = Mix_GetChunk(chan);\n    fprintf(stderr, \"We were just alerted that Mixer channel #%d is done.\\n\", chan);\n    fprintf(stderr, \"Channel's chunk pointer is (%p).\\n\", done_chunk);\n    fprintf(stderr, \" Which %s correct.\\n\", (wave == done_chunk) ? \"is\" : \"is NOT\");\n    channel_is_done = 1;\n}\n#endif\n\n\n/* rcg06192001 abstract this out for testing purposes. */\nstatic int still_playing(void)\n{\n#ifdef TEST_MIX_CHANNELFINISHED\n    return(!channel_is_done);\n#else\n    return(Mix_Playing(0));\n#endif\n}\n\n\n#if (defined TEST_MIX_PANNING)\nstatic void do_panning_update(void)\n{\n    static Uint8 leftvol = 128;\n    static Uint8 rightvol = 128;\n    static Uint8 leftincr = -1;\n    static Uint8 rightincr = 1;\n    static int panningok = 1;\n    static Uint32 next_panning_update = 0;\n\n    if ((panningok) && (SDL_GetTicks() >= next_panning_update)) {\n        panningok = Mix_SetPanning(0, leftvol, rightvol);\n        if (!panningok) {\n            fprintf(stderr, \"Mix_SetPanning(0, %d, %d) failed!\\n\",\n                    (int) leftvol, (int) rightvol);\n            fprintf(stderr, \"Reason: [%s].\\n\", Mix_GetError());\n        }\n\n        if ((leftvol == 255) || (leftvol == 0)) {\n            if (leftvol == 255)\n                printf(\"All the way in the left speaker.\\n\");\n                leftincr *= -1;\n        }\n\n        if ((rightvol == 255) || (rightvol == 0)) {\n            if (rightvol == 255)\n                printf(\"All the way in the right speaker.\\n\");\n            rightincr *= -1;\n        }\n\n        leftvol += leftincr;\n        rightvol += rightincr;\n        next_panning_update = SDL_GetTicks() + 10;\n    }\n}\n#endif\n\n\n#if (defined TEST_MIX_DISTANCE)\nstatic void do_distance_update(void)\n{\n    static Uint8 distance = 1;\n    static Uint8 distincr = 1;\n    static int distanceok = 1;\n    static Uint32 next_distance_update = 0;\n\n    if ((distanceok) && (SDL_GetTicks() >= next_distance_update)) {\n        distanceok = Mix_SetDistance(0, distance);\n        if (!distanceok) {\n            fprintf(stderr, \"Mix_SetDistance(0, %d) failed!\\n\", (int) distance);\n            fprintf(stderr, \"Reason: [%s].\\n\", Mix_GetError());\n        }\n\n        if (distance == 0) {\n            printf(\"Distance at nearest point.\\n\");\n            distincr *= -1;\n        }\n        else if (distance == 255) {\n            printf(\"Distance at furthest point.\\n\");\n            distincr *= -1;\n        }\n\n        distance += distincr;\n        next_distance_update = SDL_GetTicks() + 15;\n    }\n}\n#endif\n\n\n#if (defined TEST_MIX_POSITION)\nstatic void do_position_update(void)\n{\n    static Sint16 distance = 1;\n    static Sint8 distincr = 1;\n    static Uint16 angle = 0;\n    static Sint8 angleincr = 1;\n    static int positionok = 1;\n    static Uint32 next_position_update = 0;\n\n    if ((positionok) && (SDL_GetTicks() >= next_position_update)) {\n        positionok = Mix_SetPosition(0, angle, distance);\n        if (!positionok) {\n            fprintf(stderr, \"Mix_SetPosition(0, %d, %d) failed!\\n\",\n                    (int) angle, (int) distance);\n            fprintf(stderr, \"Reason: [%s].\\n\", Mix_GetError());\n        }\n\n        if (angle == 0) {\n            printf(\"Due north; now rotating clockwise...\\n\");\n            angleincr = 1;\n        }\n\n        else if (angle == 360) {\n            printf(\"Due north; now rotating counter-clockwise...\\n\");\n            angleincr = -1;\n        }\n\n        distance += distincr;\n\n        if (distance < 0) {\n            distance = 0;\n            distincr = 3;\n            printf(\"Distance is very, very near. Stepping away by threes...\\n\");\n        } else if (distance > 255) {\n            distance = 255;\n            distincr = -3;\n            printf(\"Distance is very, very far. Stepping towards by threes...\\n\");\n        }\n\n        angle += angleincr;\n        next_position_update = SDL_GetTicks() + 30;\n    }\n}\n#endif\n\n\nstatic void CleanUp(int exitcode)\n{\n    if ( wave ) {\n        Mix_FreeChunk(wave);\n        wave = NULL;\n    }\n    if ( audio_open ) {\n        Mix_CloseAudio();\n        audio_open = 0;\n    }\n    SDL_Quit();\n\n    exit(exitcode);\n}\n\n\nstatic void Usage(char *argv0)\n{\n    fprintf(stderr, \"Usage: %s [-8] [-r rate] [-c channels] [-f] [-F] [-l] [-m] <wavefile>\\n\", argv0);\n}\n\n\n/*\n * rcg06182001 This is sick, but cool.\n *\n *  Actually, it's meant to be an example of how to manipulate a voice\n *  without having to use the mixer effects API. This is more processing\n *  up front, but no extra during the mixing process. Also, in a case like\n *  this, when you need to touch the whole sample at once, it's the only\n *  option you've got. And, with the effects API, you are altering a copy of\n *  the original sample for each playback, and thus, your changes aren't\n *  permanent; here, you've got a reversed sample, and that's that until\n *  you either reverse it again, or reload it.\n */\nstatic void flip_sample(Mix_Chunk *wave)\n{\n    Uint16 format;\n    int channels, i, incr;\n    Uint8 *start = wave->abuf;\n    Uint8 *end = wave->abuf + wave->alen;\n\n    Mix_QuerySpec(NULL, &format, &channels);\n    incr = (format & 0xFF) * channels;\n\n    end -= incr;\n\n    switch (incr) {\n        case 8:\n            for (i = wave->alen / 2; i >= 0; i -= 1) {\n                Uint8 tmp = *start;\n                *start = *end;\n                *end = tmp;\n                start++;\n                end--;\n            }\n            break;\n\n        case 16:\n            for (i = wave->alen / 2; i >= 0; i -= 2) {\n                Uint16 tmp = *start;\n                *((Uint16 *) start) = *((Uint16 *) end);\n                *((Uint16 *) end) = tmp;\n                start += 2;\n                end -= 2;\n            }\n            break;\n\n        case 32:\n            for (i = wave->alen / 2; i >= 0; i -= 4) {\n                Uint32 tmp = *start;\n                *((Uint32 *) start) = *((Uint32 *) end);\n                *((Uint32 *) end) = tmp;\n                start += 4;\n                end -= 4;\n            }\n            break;\n\n        default:\n            fprintf(stderr, \"Unhandled format in sample flipping.\\n\");\n            return;\n    }\n}\n\n\nint main(int argc, char *argv[])\n{\n    int audio_rate;\n    Uint16 audio_format;\n    int audio_channels;\n    int loops = 0;\n    int i;\n    int reverse_stereo = 0;\n    int reverse_sample = 0;\n\n#ifdef HAVE_SETBUF\n    setbuf(stdout, NULL);    /* rcg06132001 for debugging purposes. */\n    setbuf(stderr, NULL);    /* rcg06192001 for debugging purposes, too. */\n#endif\n    output_test_warnings();\n\n    /* Initialize variables */\n    audio_rate = MIX_DEFAULT_FREQUENCY;\n    audio_format = MIX_DEFAULT_FORMAT;\n    audio_channels = 2;\n\n    /* Check command line usage */\n    for ( i=1; argv[i] && (*argv[i] == '-'); ++i ) {\n        if ( (strcmp(argv[i], \"-r\") == 0) && argv[i+1] ) {\n            ++i;\n            audio_rate = atoi(argv[i]);\n        } else\n        if ( strcmp(argv[i], \"-m\") == 0 ) {\n            audio_channels = 1;\n        } else\n        if ( (strcmp(argv[i], \"-c\") == 0) && argv[i+1] ) {\n            ++i;\n            audio_channels = atoi(argv[i]);\n        } else\n        if ( strcmp(argv[i], \"-l\") == 0 ) {\n            loops = -1;\n        } else\n        if ( strcmp(argv[i], \"-8\") == 0 ) {\n            audio_format = AUDIO_U8;\n        } else\n        if ( strcmp(argv[i], \"-f\") == 0 ) { /* rcg06122001 flip stereo */\n            reverse_stereo = 1;\n        } else\n        if ( strcmp(argv[i], \"-F\") == 0 ) { /* rcg06172001 flip sample */\n            reverse_sample = 1;\n        } else {\n            Usage(argv[0]);\n            return(1);\n        }\n    }\n    if ( ! argv[i] ) {\n        Usage(argv[0]);\n        return(1);\n    }\n\n    /* Initialize the SDL library */\n    if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) {\n        fprintf(stderr, \"Couldn't initialize SDL: %s\\n\",SDL_GetError());\n        return(255);\n    }\n#ifdef HAVE_SIGNAL_H\n    signal(SIGINT, CleanUp);\n    signal(SIGTERM, CleanUp);\n#endif\n\n    /* Open the audio device */\n    if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, 4096) < 0) {\n        fprintf(stderr, \"Couldn't open audio: %s\\n\", SDL_GetError());\n        CleanUp(2);\n    } else {\n        Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels);\n        printf(\"Opened audio at %d Hz %d bit %s\", audio_rate,\n            (audio_format&0xFF),\n            (audio_channels > 2) ? \"surround\" :\n            (audio_channels > 1) ? \"stereo\" : \"mono\");\n        if ( loops ) {\n          printf(\" (looping)\\n\");\n        } else {\n          putchar('\\n');\n        }\n    }\n    audio_open = 1;\n\n#if (defined TEST_MIX_VERSIONS)\n    test_versions();\n#endif\n\n#if (defined TEST_MIX_DECODERS)\n    report_decoders();\n#endif\n\n    /* Load the requested wave file */\n    wave = Mix_LoadWAV(argv[i]);\n    if ( wave == NULL ) {\n        fprintf(stderr, \"Couldn't load %s: %s\\n\",\n                        argv[i], SDL_GetError());\n        CleanUp(2);\n    }\n\n    if (reverse_sample) {\n        flip_sample(wave);\n    }\n\n#ifdef TEST_MIX_CHANNELFINISHED  /* rcg06072001 */\n    Mix_ChannelFinished(channel_complete_callback);\n#endif\n\n    if ( (!Mix_SetReverseStereo(MIX_CHANNEL_POST, reverse_stereo)) &&\n         (reverse_stereo) )\n    {\n        printf(\"Failed to set up reverse stereo effect!\\n\");\n        printf(\"Reason: [%s].\\n\", Mix_GetError());\n    }\n\n    /* Play and then exit */\n    Mix_PlayChannel(0, wave, loops);\n\n    while (still_playing()) {\n\n#if (defined TEST_MIX_PANNING)  /* rcg06132001 */\n        do_panning_update();\n#endif\n\n#if (defined TEST_MIX_DISTANCE) /* rcg06192001 */\n        do_distance_update();\n#endif\n\n#if (defined TEST_MIX_POSITION) /* rcg06202001 */\n        do_position_update();\n#endif\n\n        SDL_Delay(1);\n\n    } /* while still_playing() loop... */\n\n    CleanUp(0);\n\n    /* Not reached, but fixes compiler warnings */\n    return 0;\n}\n\n/* end of playwave.c ... */\n\n"
  },
  {
    "path": "libs/SDL2_mixer/src/wavestream.c",
    "content": "/*\n  SDL_mixer:  An audio mixer library based on the SDL library\n  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* $Id$ */\n\n/* This file supports streaming WAV files, without volume adjustment */\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"SDL_audio.h\"\n#include \"SDL_mutex.h\"\n#include \"SDL_rwops.h\"\n#include \"SDL_endian.h\"\n\n#include \"SDL_mixer.h\"\n#include \"wavestream.h\"\n\n/*\n    Taken with permission from SDL_wave.h, part of the SDL library,\n    available at: http://www.libsdl.org/\n    and placed under the same license as this mixer library.\n*/\n\n/* WAVE files are little-endian */\n\n/*******************************************/\n/* Define values for Microsoft WAVE format */\n/*******************************************/\n#define RIFF        0x46464952      /* \"RIFF\" */\n#define WAVE        0x45564157      /* \"WAVE\" */\n#define FMT         0x20746D66      /* \"fmt \" */\n#define DATA        0x61746164      /* \"data\" */\n#define SMPL        0x6c706d73      /* \"smpl\" */\n#define PCM_CODE    1\n#define ADPCM_CODE  2\n#define WAVE_MONO   1\n#define WAVE_STEREO 2\n\ntypedef struct {\n/* Not saved in the chunk we read:\n    Uint32  chunkID;\n    Uint32  chunkLen;\n*/\n    Uint16  encoding;\n    Uint16  channels;       /* 1 = mono, 2 = stereo */\n    Uint32  frequency;      /* One of 11025, 22050, or 44100 Hz */\n    Uint32  byterate;       /* Average bytes per second */\n    Uint16  blockalign;     /* Bytes per sample block */\n    Uint16  bitspersample;      /* One of 8, 12, 16, or 4 for ADPCM */\n} WaveFMT;\n\ntypedef struct {\n    Uint32 identifier;\n    Uint32 type;\n    Uint32 start;\n    Uint32 end;\n    Uint32 fraction;\n    Uint32 play_count;\n} SampleLoop;\n\ntypedef struct {\n/* Not saved in the chunk we read:\n    Uint32  chunkID;\n    Uint32  chunkLen;\n*/\n    Uint32  manufacturer;\n    Uint32  product;\n    Uint32  sample_period;\n    Uint32  MIDI_unity_note;\n    Uint32  MIDI_pitch_fraction;\n    Uint32  SMTPE_format;\n    Uint32  SMTPE_offset;\n    Uint32  sample_loops;\n    Uint32  sampler_data;\n    SampleLoop loops[];\n} SamplerChunk;\n\n/*********************************************/\n/* Define values for AIFF (IFF audio) format */\n/*********************************************/\n#define FORM        0x4d524f46      /* \"FORM\" */\n#define AIFF        0x46464941      /* \"AIFF\" */\n#define SSND        0x444e5353      /* \"SSND\" */\n#define COMM        0x4d4d4f43      /* \"COMM\" */\n\n\n/* Currently we only support a single stream at a time */\nstatic WAVStream *music = NULL;\n\n/* This is the format of the audio mixer data */\nstatic SDL_AudioSpec mixer;\nstatic int wavestream_volume = MIX_MAX_VOLUME;\n\n/* Function to load the WAV/AIFF stream */\nstatic SDL_bool LoadWAVStream(WAVStream *wave);\nstatic SDL_bool LoadAIFFStream(WAVStream *wave);\n\n/* Initialize the WAVStream player, with the given mixer settings\n   This function returns 0, or -1 if there was an error.\n */\nint WAVStream_Init(SDL_AudioSpec *mixerfmt)\n{\n    mixer = *mixerfmt;\n    return(0);\n}\n\nvoid WAVStream_SetVolume(int volume)\n{\n    wavestream_volume = volume;\n}\n\n/* Load a WAV stream from the given RWops object */\nWAVStream *WAVStream_LoadSong_RW(SDL_RWops *src, int freesrc)\n{\n    WAVStream *wave;\n    SDL_bool loaded = SDL_FALSE;\n\n    if (!mixer.format) {\n        Mix_SetError(\"WAV music output not started\");\n        return(NULL);\n    }\n\n    wave = (WAVStream *)SDL_malloc(sizeof *wave);\n    if (wave) {\n        Uint32 magic;\n\n        SDL_zerop(wave);\n        wave->src = src;\n        wave->freesrc = freesrc;\n\n        magic = SDL_ReadLE32(src);\n        if (magic == RIFF || magic == WAVE) {\n            loaded = LoadWAVStream(wave);\n        } else if (magic == FORM) {\n            loaded = LoadAIFFStream(wave);\n        } else {\n            Mix_SetError(\"Unknown WAVE format\");\n        }\n        if (!loaded) {\n            WAVStream_FreeSong(wave);\n            return(NULL);\n        }\n        SDL_BuildAudioCVT(&wave->cvt,\n            wave->spec.format, wave->spec.channels, wave->spec.freq,\n            mixer.format, mixer.channels, mixer.freq);\n    } else {\n        SDL_OutOfMemory();\n        return(NULL);\n    }\n    return(wave);\n}\n\n/* Start playback of a given WAV stream */\nvoid WAVStream_Start(WAVStream *wave)\n{\n    int i;\n    for (i = 0; i < wave->numloops; ++i) {\n        WAVLoopPoint *loop = &wave->loops[i];\n        loop->active = SDL_TRUE;\n        loop->current_play_count = loop->initial_play_count;\n    }\n    SDL_RWseek(wave->src, wave->start, RW_SEEK_SET);\n    music = wave;\n}\n\n/* Play some of a stream previously started with WAVStream_Start() */\nstatic int PlaySome(Uint8 *stream, int len)\n{\n    Sint64 pos, stop;\n    WAVLoopPoint *loop;\n    Sint64 loop_start;\n    Sint64 loop_stop;\n    int i;\n    int consumed;\n\n    pos = SDL_RWtell(music->src);\n    stop = music->stop;\n    loop = NULL;\n    for (i = 0; i < music->numloops; ++i) {\n        loop = &music->loops[i];\n        if (loop->active) {\n            const int bytes_per_sample = (SDL_AUDIO_BITSIZE(music->spec.format) / 8) * music->spec.channels;\n            loop_start = music->start + loop->start * bytes_per_sample;\n            loop_stop = music->start + (loop->stop + 1) * bytes_per_sample;\n            if (pos >= loop_start && pos < loop_stop)\n            {\n                stop = loop_stop;\n                break;\n            }\n        }\n        loop = NULL;\n    }\n\n    if (music->cvt.needed) {\n        int original_len;\n\n        original_len = (int)((double)len/music->cvt.len_ratio);\n        if (music->cvt.len != original_len) {\n            int worksize;\n            if (music->cvt.buf != NULL) {\n                SDL_free(music->cvt.buf);\n            }\n            worksize = original_len*music->cvt.len_mult;\n            music->cvt.buf=(Uint8 *)SDL_malloc(worksize);\n            if (music->cvt.buf == NULL) {\n                return 0;\n            }\n            music->cvt.len = original_len;\n        }\n        if ((stop - pos) < original_len) {\n            original_len = (int)(stop - pos);\n        }\n        original_len = SDL_RWread(music->src, music->cvt.buf, 1, original_len);\n        /* At least at the time of writing, SDL_ConvertAudio()\n           does byte-order swapping starting at the end of the\n           buffer. Thus, if we are reading 16-bit samples, we\n           had better make damn sure that we get an even\n           number of bytes, or we'll get garbage.\n         */\n        if ((music->cvt.src_format & 0x0010) && (original_len & 1)) {\n            original_len--;\n        }\n        music->cvt.len = original_len;\n        SDL_ConvertAudio(&music->cvt);\n        SDL_MixAudio(stream, music->cvt.buf, music->cvt.len_cvt, wavestream_volume);\n        consumed = music->cvt.len_cvt;\n    } else {\n        Uint8 *data;\n        if ((stop - pos) < len) {\n            len = (int)(stop - pos);\n        }\n        data = SDL_stack_alloc(Uint8, len);\n        if (data) {\n            len = SDL_RWread(music->src, data, 1, len);\n            SDL_MixAudio(stream, data, len, wavestream_volume);\n            SDL_stack_free(data);\n        }\n        consumed = len;\n    }\n\n    if (loop && SDL_RWtell(music->src) >= stop) {\n        if (loop->current_play_count == 1) {\n            loop->active = SDL_FALSE;\n        } else {\n            if (loop->current_play_count > 0) {\n                --loop->current_play_count;\n            }\n            SDL_RWseek(music->src, loop_start, RW_SEEK_SET);\n        }\n    }\n    return consumed;\n}\n\nint WAVStream_PlaySome(Uint8 *stream, int len)\n{\n    if (!music)\n        return 0;\n\n    while ((SDL_RWtell(music->src) < music->stop) && (len > 0)) {\n        int consumed = PlaySome(stream, len);\n        if (!consumed)\n            break;\n\n        stream += consumed;\n        len -= consumed;\n    }\n    return len;\n}\n\n/* Stop playback of a stream previously started with WAVStream_Start() */\nvoid WAVStream_Stop(void)\n{\n    music = NULL;\n}\n\n/* Close the given WAV stream */\nvoid WAVStream_FreeSong(WAVStream *wave)\n{\n    if (wave) {\n        /* Clean up associated data */\n        if (wave->loops) {\n            SDL_free(wave->loops);\n        }\n        if (wave->cvt.buf) {\n            SDL_free(wave->cvt.buf);\n        }\n        if (wave->freesrc) {\n            SDL_RWclose(wave->src);\n        }\n        SDL_free(wave);\n    }\n}\n\n/* Return non-zero if a stream is currently playing */\nint WAVStream_Active(void)\n{\n    int active;\n\n    active = 0;\n    if (music && (SDL_RWtell(music->src) < music->stop)) {\n        active = 1;\n    }\n    return(active);\n}\n\nstatic SDL_bool ParseFMT(WAVStream *wave, Uint32 chunk_length)\n{\n    SDL_RWops *src = wave->src;\n    SDL_AudioSpec *spec = &wave->spec;\n    WaveFMT *format;\n    Uint8 *data;\n    SDL_bool loaded = SDL_FALSE;\n\n    if (chunk_length < sizeof(*format)) {\n        Mix_SetError(\"Wave format chunk too small\");\n        return SDL_FALSE;\n    }\n\n    data = (Uint8 *)SDL_malloc(chunk_length);\n    if (!data) {\n        Mix_SetError(\"Out of memory\");\n        return SDL_FALSE;\n    }\n    if (!SDL_RWread(wave->src, data, chunk_length, 1)) {\n        Mix_SetError(\"Couldn't read %d bytes from WAV file\", chunk_length);\n        return SDL_FALSE;\n    }\n    format = (WaveFMT *)data;\n\n    /* Decode the audio data format */\n    switch (SDL_SwapLE16(format->encoding)) {\n        case PCM_CODE:\n            /* We can understand this */\n            break;\n        default:\n            Mix_SetError(\"Unknown WAVE data format\");\n            goto done;\n    }\n    spec->freq = SDL_SwapLE32(format->frequency);\n    switch (SDL_SwapLE16(format->bitspersample)) {\n        case 8:\n            spec->format = AUDIO_U8;\n            break;\n        case 16:\n            spec->format = AUDIO_S16;\n            break;\n        default:\n            Mix_SetError(\"Unknown PCM data format\");\n            goto done;\n    }\n    spec->channels = (Uint8) SDL_SwapLE16(format->channels);\n    spec->samples = 4096;       /* Good default buffer size */\n\n    loaded = SDL_TRUE;\n\ndone:\n    SDL_free(data);\n    return loaded;\n}\n\nstatic SDL_bool ParseDATA(WAVStream *wave, Uint32 chunk_length)\n{\n    wave->start = SDL_RWtell(wave->src);\n    wave->stop = wave->start + chunk_length;\n    SDL_RWseek(wave->src, chunk_length, RW_SEEK_CUR);\n    return SDL_TRUE;\n}\n\nstatic SDL_bool AddLoopPoint(WAVStream *wave, Uint32 play_count, Uint32 start, Uint32 stop)\n{\n    WAVLoopPoint *loop;\n    WAVLoopPoint *loops = SDL_realloc(wave->loops, (wave->numloops + 1)*sizeof(*wave->loops));\n    if (!loops) {\n        Mix_SetError(\"Out of memory\");\n        return SDL_FALSE;\n    }\n\n    loop = &loops[ wave->numloops ];\n    loop->start = start;\n    loop->stop = stop;\n    loop->initial_play_count = play_count;\n    loop->current_play_count = play_count;\n\n    wave->loops = loops;\n    ++wave->numloops;\n    return SDL_TRUE;\n}\n\nstatic SDL_bool ParseSMPL(WAVStream *wave, Uint32 chunk_length)\n{\n    SamplerChunk *chunk;\n    Uint8 *data;\n    int i;\n    SDL_bool loaded = SDL_FALSE;\n\n    data = (Uint8 *)SDL_malloc(chunk_length);\n    if (!data) {\n        Mix_SetError(\"Out of memory\");\n        return SDL_FALSE;\n    }\n    if (!SDL_RWread(wave->src, data, chunk_length, 1)) {\n        Mix_SetError(\"Couldn't read %d bytes from WAV file\", chunk_length);\n        return SDL_FALSE;\n    }\n    chunk = (SamplerChunk *)data;\n\n    for (i = 0; i < SDL_SwapLE32(chunk->sample_loops); ++i) {\n        const Uint32 LOOP_TYPE_FORWARD = 0;\n        Uint32 loop_type = SDL_SwapLE32(chunk->loops[i].type);\n        if (loop_type == LOOP_TYPE_FORWARD) {\n            AddLoopPoint(wave, SDL_SwapLE32(chunk->loops[i].play_count), SDL_SwapLE32(chunk->loops[i].start), SDL_SwapLE32(chunk->loops[i].end));\n        }\n    }\n\n    loaded = SDL_TRUE;\n\ndone:\n    SDL_free(data);\n    return loaded;\n}\n\nstatic SDL_bool LoadWAVStream(WAVStream *wave)\n{\n    SDL_RWops *src = wave->src;\n    Uint32 chunk_type;\n    Uint32 chunk_length;\n    SDL_bool found_FMT = SDL_FALSE;\n    SDL_bool found_DATA = SDL_FALSE;\n\n    /* WAV magic header */\n    Uint32 wavelen;\n    Uint32 WAVEmagic;\n\n    /* Check the magic header */\n    wavelen = SDL_ReadLE32(src);\n    WAVEmagic = SDL_ReadLE32(src);\n\n    /* Read the chunks */\n    for (; ;) {\n        chunk_type = SDL_ReadLE32(src);\n        chunk_length = SDL_ReadLE32(src);\n\n        if (chunk_length == 0)\n            break;\n\n        switch (chunk_type)\n        {\n        case FMT:\n            found_FMT = SDL_TRUE;\n            if (!ParseFMT(wave, chunk_length))\n                return SDL_FALSE;\n            break;\n        case DATA:\n            found_DATA = SDL_TRUE;\n            if (!ParseDATA(wave, chunk_length))\n                return SDL_FALSE;\n            break;\n        case SMPL:\n            if (!ParseSMPL(wave, chunk_length))\n                return SDL_FALSE;\n            break;\n        default:\n            SDL_RWseek(src, chunk_length, RW_SEEK_CUR);\n            break;\n        }\n    }\n\n    if (!found_FMT) {\n        Mix_SetError(\"Bad WAV file (no FMT chunk)\");\n        return SDL_FALSE;\n    }\n\n    if (!found_DATA) {\n        Mix_SetError(\"Bad WAV file (no DATA chunk)\");\n        return SDL_FALSE;\n    }\n\n    return SDL_TRUE;\n}\n\n/* I couldn't get SANE_to_double() to work, so I stole this from libsndfile.\n * I don't pretend to fully understand it.\n */\n\nstatic Uint32 SANE_to_Uint32 (Uint8 *sanebuf)\n{\n    /* Negative number? */\n    if (sanebuf[0] & 0x80)\n        return 0;\n\n    /* Less than 1? */\n    if (sanebuf[0] <= 0x3F)\n        return 1;\n\n    /* Way too big? */\n    if (sanebuf[0] > 0x40)\n        return 0x4000000;\n\n    /* Still too big? */\n    if (sanebuf[0] == 0x40 && sanebuf[1] > 0x1C)\n        return 800000000;\n\n    return ((sanebuf[2] << 23) | (sanebuf[3] << 15) | (sanebuf[4] << 7) |\n            (sanebuf[5] >> 1)) >> (29 - sanebuf[1]);\n}\n\nstatic SDL_bool LoadAIFFStream(WAVStream *wave)\n{\n    SDL_RWops *src = wave->src;\n    SDL_AudioSpec *spec = &wave->spec;\n    SDL_bool found_SSND = SDL_FALSE;\n    SDL_bool found_COMM = SDL_FALSE;\n\n    Uint32 chunk_type;\n    Uint32 chunk_length;\n    Sint64 next_chunk;\n\n    /* AIFF magic header */\n    Uint32 AIFFmagic;\n    /* SSND chunk        */\n    Uint32 offset;\n    Uint32 blocksize;\n    /* COMM format chunk */\n    Uint16 channels = 0;\n    Uint32 numsamples = 0;\n    Uint16 samplesize = 0;\n    Uint8 sane_freq[10];\n    Uint32 frequency = 0;\n\n    /* Check the magic header */\n    chunk_length = SDL_ReadBE32(src);\n    AIFFmagic = SDL_ReadLE32(src);\n    if (AIFFmagic != AIFF) {\n        Mix_SetError(\"Unrecognized file type (not AIFF)\");\n        return SDL_FALSE;\n    }\n\n    /* From what I understand of the specification, chunks may appear in\n     * any order, and we should just ignore unknown ones.\n     *\n     * TODO: Better sanity-checking. E.g. what happens if the AIFF file\n     *       contains compressed sound data?\n     */\n    do {\n        chunk_type      = SDL_ReadLE32(src);\n        chunk_length    = SDL_ReadBE32(src);\n        next_chunk      = SDL_RWtell(src) + chunk_length;\n\n        /* Paranoia to avoid infinite loops */\n        if (chunk_length == 0)\n            break;\n\n        switch (chunk_type) {\n        case SSND:\n            found_SSND = SDL_TRUE;\n            offset = SDL_ReadBE32(src);\n            blocksize = SDL_ReadBE32(src);\n            wave->start = SDL_RWtell(src) + offset;\n            break;\n\n        case COMM:\n            found_COMM = SDL_TRUE;\n\n            /* Read the audio data format chunk */\n            channels = SDL_ReadBE16(src);\n            numsamples = SDL_ReadBE32(src);\n            samplesize = SDL_ReadBE16(src);\n            SDL_RWread(src, sane_freq, sizeof(sane_freq), 1);\n            frequency = SANE_to_Uint32(sane_freq);\n            break;\n\n        default:\n            break;\n        }\n    } while ((!found_SSND || !found_COMM)\n         && SDL_RWseek(src, next_chunk, RW_SEEK_SET) != -1);\n\n    if (!found_SSND) {\n        Mix_SetError(\"Bad AIFF file (no SSND chunk)\");\n        return SDL_FALSE;\n    }\n\n    if (!found_COMM) {\n        Mix_SetError(\"Bad AIFF file (no COMM chunk)\");\n        return SDL_FALSE;\n    }\n\n    wave->stop = wave->start + channels * numsamples * (samplesize / 8);\n\n    /* Decode the audio data format */\n    SDL_memset(spec, 0, (sizeof *spec));\n    spec->freq = frequency;\n    switch (samplesize) {\n        case 8:\n            spec->format = AUDIO_S8;\n            break;\n        case 16:\n            spec->format = AUDIO_S16MSB;\n            break;\n        default:\n            Mix_SetError(\"Unknown samplesize in data format\");\n            return SDL_FALSE;\n    }\n    spec->channels = (Uint8) channels;\n    spec->samples = 4096;       /* Good default buffer size */\n\n    return SDL_TRUE;\n}\n\n"
  },
  {
    "path": "libs/SDL2_png/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\nproject(SDL2_png)\n\n# Creates and names a library, sets it as either STATIC\n# or SHARED, and provides the relative paths to its source code.\n# You can define multiple libraries, and CMake builds them for you.\n# Gradle automatically packages shared libraries with your APK.\n\nfind_library( # Sets the name of the path variable.\n        GLESv1_CM\n\n        # Specifies the name of the NDK library that\n        # you want CMake to locate.\n        GLESv1_CM )\n\nfind_library(\n        GLESv2\n        GLESv2\n)\n\nfind_library(\n        android\n        android\n)\n\nfind_library(\n        z\n        z\n)\n\nfind_library(\n        log\n        log\n)\n\ninclude_directories(include)\n\nadd_definitions(-DGL_GLEXT_PROTOTYPES)\n\nadd_library( # Sets the name of the library.\n        SDL2_png\n\n        # Sets the library as a shared library.\n        SHARED\n\n        src/pngrio.c\n        src/pngwtran.c\n        src/pngwutil.c\n        src/pngread.c\n        src/pngtrans.c\n        src/pngpread.c\n        src/png.c\n        src/pngwio.c\n        src/pngrutil.c\n        src/pngerror.c\n        src/pngset.c\n        src/pngmem.c\n        src/pngwrite.c\n        src/pngrtran.c\n        src/pngget.c\n        )\n\n\ntarget_link_libraries(\n        SDL2_png\n        SDL2\n        GLESv1_CM\n        GLESv2\n        android\n        z\n        log\n)"
  },
  {
    "path": "libs/SDL2_png/build.gradle",
    "content": "apply plugin: 'com.android.model.native'\n\nmodel {\n    android {\n        compileSdkVersion = gradle.sdkVersion\n        buildToolsVersion = gradle.buildToolsVersion\n\n        defaultConfig {\n            minSdkVersion.apiLevel = gradle.minSdkVersion\n            versionCode = 1\n            versionName = '1.0'\n        }\n        ndk {\n            moduleName = 'SDL2_png'\n            ldLibs.addAll([\"GLESv1_CM\", \"EGL\", \"GLESv2\", \"log\", \"android\", \"dl\", \"z\"])\n            CFlags.addAll([\n                           \"-DGL_GLEXT_PROTOTYPES\"\n            ])\n            CFlags.addAll([\"-I\" + file(\"include/\").absolutePath,\"-DGL_GLEXT_PROTOTYPES\"])\n        }\n\n        sources {\n            main {\n                jni {\n                    source {\n                        srcDir \"src\"\n                    }\n                }\n            }\n        }\n\n    }\n}\n\ntask(distributeLib, type : Copy) {\n    // trigger build library\n    dependsOn assemble\n    into gradle.libDistributionRoot + '/SDL2_png/'\n    from('build/outputs/native/release/lib') {\n        into 'lib/'\n    }\n}\n"
  },
  {
    "path": "libs/SDL2_png/cmake_install.cmake",
    "content": "# Install script for directory: C:/is-Engine/libs/SDL2_png\n\n# Set the install prefix\nif(NOT DEFINED CMAKE_INSTALL_PREFIX)\n  set(CMAKE_INSTALL_PREFIX \"C:/Program Files (x86)/Project\")\nendif()\nstring(REGEX REPLACE \"/$\" \"\" CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")\n\n# Set the install configuration name.\nif(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)\n  if(BUILD_TYPE)\n    string(REGEX REPLACE \"^[^A-Za-z0-9_]+\" \"\"\n           CMAKE_INSTALL_CONFIG_NAME \"${BUILD_TYPE}\")\n  else()\n    set(CMAKE_INSTALL_CONFIG_NAME \"Release\")\n  endif()\n  message(STATUS \"Install configuration: \\\"${CMAKE_INSTALL_CONFIG_NAME}\\\"\")\nendif()\n\n# Set the component getting installed.\nif(NOT CMAKE_INSTALL_COMPONENT)\n  if(COMPONENT)\n    message(STATUS \"Install component: \\\"${COMPONENT}\\\"\")\n    set(CMAKE_INSTALL_COMPONENT \"${COMPONENT}\")\n  else()\n    set(CMAKE_INSTALL_COMPONENT)\n  endif()\nendif()\n\n# Install shared libraries without execute permission?\nif(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n  set(CMAKE_INSTALL_SO_NO_EXE \"0\")\nendif()\n\n# Is this installation the result of a crosscompile?\nif(NOT DEFINED CMAKE_CROSSCOMPILING)\n  set(CMAKE_CROSSCOMPILING \"TRUE\")\nendif()\n\n"
  },
  {
    "path": "libs/SDL2_png/include/config.h",
    "content": "/* config.h.  Generated from config.h.in by configure.  */\n/* config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#define HAVE_DLFCN_H 0\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#define HAVE_INTTYPES_H 0\n\n/* Define to 1 if you have the `m' library (-lm). */\n#define HAVE_LIBM 1\n\n/* Define to 1 if you have the `z' library (-lz). */\n#define HAVE_LIBZ 1\n\n/* Define to 1 if you have the <malloc.h> header file. */\n#define HAVE_MALLOC_H 1\n\n/* Define to 1 if you have the <memory.h> header file. */\n#define HAVE_MEMORY_H 0\n\n/* Define to 1 if you have the `memset' function. */\n#define HAVE_MEMSET 1\n\n/* Define to 1 if you have the `pow' function. */\n/* #undef HAVE_POW */\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#define HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#define HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the <strings.h> header file. */\n#define HAVE_STRINGS_H 1\n\n/* Define to 1 if you have the <string.h> header file. */\n#define HAVE_STRING_H 1\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#define HAVE_SYS_STAT_H 1\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#define HAVE_SYS_TYPES_H 1\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#define HAVE_UNISTD_H 1\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n   */\n#define LT_OBJDIR \".libs/\"\n\n/* Name of package */\n#define PACKAGE \"libpng\"\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"png-mng-implement@lists.sourceforge.net\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"libpng\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"libpng 1.4.1\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"libpng\"\n\n/* Define to the home page for this package. */\n#define PACKAGE_URL \"\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"1.4.1\"\n\n/* Define to 1 if you have the ANSI C header files. */\n#define STDC_HEADERS 1\n\n/* Define to 1 if your <sys/time.h> declares `struct tm'. */\n/* #undef TM_IN_SYS_TIME */\n\n/* Version number of package */\n#define VERSION \"1.4.1\"\n\n/* Define to empty if `const' does not conform to ANSI C. */\n/* #undef const */\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n/* #undef size_t */\n"
  },
  {
    "path": "libs/SDL2_png/include/png.h",
    "content": "\n/* png.h - header file for PNG reference library\n *\n * libpng version 1.6.23, June 9, 2016\n *\n * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license (See LICENSE, below)\n *\n * Authors and maintainers:\n *   libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat\n *   libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger\n *   libpng versions 0.97, January 1998, through 1.6.23, June 9, 2016:\n *     Glenn Randers-Pehrson.\n *   See also \"Contributing Authors\", below.\n */\n\n/*\n * COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:\n *\n * If you modify libpng you may insert additional notices immediately following\n * this sentence.\n *\n * This code is released under the libpng license.\n *\n * Some files in the \"contrib\" directory and some configure-generated\n * files that are distributed with libpng have other copyright owners and\n * are released under other open source licenses.\n *\n * libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are\n * Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are\n * derived from libpng-1.0.6, and are distributed according to the same\n * disclaimer and license as libpng-1.0.6 with the following individuals\n * added to the list of Contributing Authors:\n *\n *    Simon-Pierre Cadieux\n *    Eric S. Raymond\n *    Mans Rullgard\n *    Cosmin Truta\n *    Gilles Vollant\n *    James Yu\n *\n * and with the following additions to the disclaimer:\n *\n *    There is no warranty against interference with your enjoyment of the\n *    library or against infringement.  There is no warranty that our\n *    efforts or the library will fulfill any of your particular purposes\n *    or needs.  This library is provided with all faults, and the entire\n *    risk of satisfactory quality, performance, accuracy, and effort is with\n *    the user.\n *\n * Some files in the \"contrib\" directory have other copyright owners and\n * are released under other open source licenses.\n *\n *\n * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are\n * Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from\n * libpng-0.96, and are distributed according to the same disclaimer and\n * license as libpng-0.96, with the following individuals added to the list\n * of Contributing Authors:\n *\n *    Tom Lane\n *    Glenn Randers-Pehrson\n *    Willem van Schaik\n *\n * Some files in the \"scripts\" directory have different copyright owners\n * but are also released under this license.\n *\n * libpng versions 0.89, June 1996, through 0.96, May 1997, are\n * Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,\n * and are distributed according to the same disclaimer and license as\n * libpng-0.88, with the following individuals added to the list of\n * Contributing Authors:\n *\n *    John Bowler\n *    Kevin Bracey\n *    Sam Bushell\n *    Magnus Holmgren\n *    Greg Roelofs\n *    Tom Tanner\n *\n * Some files in the \"scripts\" directory have other copyright owners\n * but are released under this license.\n *\n * libpng versions 0.5, May 1995, through 0.88, January 1996, are\n * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n *\n * For the purposes of this copyright and license, \"Contributing Authors\"\n * is defined as the following set of individuals:\n *\n *    Andreas Dilger\n *    Dave Martindale\n *    Guy Eric Schalnat\n *    Paul Schmidt\n *    Tim Wegner\n *\n * The PNG Reference Library is supplied \"AS IS\".  The Contributing Authors\n * and Group 42, Inc. disclaim all warranties, expressed or implied,\n * including, without limitation, the warranties of merchantability and of\n * fitness for any purpose.  The Contributing Authors and Group 42, Inc.\n * assume no liability for direct, indirect, incidental, special, exemplary,\n * or consequential damages, which may result from the use of the PNG\n * Reference Library, even if advised of the possibility of such damage.\n *\n * Permission is hereby granted to use, copy, modify, and distribute this\n * source code, or portions hereof, for any purpose, without fee, subject\n * to the following restrictions:\n *\n *   1. The origin of this source code must not be misrepresented.\n *\n *   2. Altered versions must be plainly marked as such and must not\n *      be misrepresented as being the original source.\n *\n *   3. This Copyright notice may not be removed or altered from any\n *      source or altered source distribution.\n *\n * The Contributing Authors and Group 42, Inc. specifically permit, without\n * fee, and encourage the use of this source code as a component to\n * supporting the PNG file format in commercial products.  If you use this\n * source code in a product, acknowledgment is not required but would be\n * appreciated.\n *\n * END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.\n *\n * TRADEMARK:\n *\n * The name \"libpng\" has not been registered by the Copyright owner\n * as a trademark in any jurisdiction.  However, because libpng has\n * been distributed and maintained world-wide, continually since 1995,\n * the Copyright owner claims \"common-law trademark protection\" in any\n * jurisdiction where common-law trademark is recognized.\n *\n * OSI CERTIFICATION:\n *\n * Libpng is OSI Certified Open Source Software.  OSI Certified Open Source is\n * a certification mark of the Open Source Initiative. OSI has not addressed\n * the additional disclaimers inserted at version 1.0.7.\n *\n * EXPORT CONTROL:\n *\n * The Copyright owner believes that the Export Control Classification\n * Number (ECCN) for libpng is EAR99, which means not subject to export\n * controls or International Traffic in Arms Regulations (ITAR) because\n * it is open source, publicly available software, that does not contain\n * any encryption software.  See the EAR, paragraphs 734.3(b)(3) and\n * 734.7(b).\n */\n\n/*\n * A \"png_get_copyright\" function is available, for convenient use in \"about\"\n * boxes and the like:\n *\n *    printf(\"%s\", png_get_copyright(NULL));\n *\n * Also, the PNG logo (in PNG format, of course) is supplied in the\n * files \"pngbar.png\" and \"pngbar.jpg (88x31) and \"pngnow.png\" (98x31).\n */\n\n/*\n * The contributing authors would like to thank all those who helped\n * with testing, bug fixes, and patience.  This wouldn't have been\n * possible without all of you.\n *\n * Thanks to Frank J. T. Wojcik for helping with the documentation.\n */\n\n/* Note about libpng version numbers:\n *\n *    Due to various miscommunications, unforeseen code incompatibilities\n *    and occasional factors outside the authors' control, version numbering\n *    on the library has not always been consistent and straightforward.\n *    The following table summarizes matters since version 0.89c, which was\n *    the first widely used release:\n *\n *    source                 png.h  png.h  shared-lib\n *    version                string   int  version\n *    -------                ------ -----  ----------\n *    0.89c \"1.0 beta 3\"     0.89      89  1.0.89\n *    0.90  \"1.0 beta 4\"     0.90      90  0.90  [should have been 2.0.90]\n *    0.95  \"1.0 beta 5\"     0.95      95  0.95  [should have been 2.0.95]\n *    0.96  \"1.0 beta 6\"     0.96      96  0.96  [should have been 2.0.96]\n *    0.97b \"1.00.97 beta 7\" 1.00.97   97  1.0.1 [should have been 2.0.97]\n *    0.97c                  0.97      97  2.0.97\n *    0.98                   0.98      98  2.0.98\n *    0.99                   0.99      98  2.0.99\n *    0.99a-m                0.99      99  2.0.99\n *    1.00                   1.00     100  2.1.0 [100 should be 10000]\n *    1.0.0      (from here on, the   100  2.1.0 [100 should be 10000]\n *    1.0.1       png.h string is   10001  2.1.0\n *    1.0.1a-e    identical to the  10002  from here on, the shared library\n *    1.0.2       source version)   10002  is 2.V where V is the source code\n *    1.0.2a-b                      10003  version, except as noted.\n *    1.0.3                         10003\n *    1.0.3a-d                      10004\n *    1.0.4                         10004\n *    1.0.4a-f                      10005\n *    1.0.5 (+ 2 patches)           10005\n *    1.0.5a-d                      10006\n *    1.0.5e-r                      10100 (not source compatible)\n *    1.0.5s-v                      10006 (not binary compatible)\n *    1.0.6 (+ 3 patches)           10006 (still binary incompatible)\n *    1.0.6d-f                      10007 (still binary incompatible)\n *    1.0.6g                        10007\n *    1.0.6h                        10007  10.6h (testing xy.z so-numbering)\n *    1.0.6i                        10007  10.6i\n *    1.0.6j                        10007  2.1.0.6j (incompatible with 1.0.0)\n *    1.0.7beta11-14        DLLNUM  10007  2.1.0.7beta11-14 (binary compatible)\n *    1.0.7beta15-18           1    10007  2.1.0.7beta15-18 (binary compatible)\n *    1.0.7rc1-2               1    10007  2.1.0.7rc1-2 (binary compatible)\n *    1.0.7                    1    10007  (still compatible)\n *    ...\n *    1.0.19                  10    10019  10.so.0.19[.0]\n *    ...\n *    1.2.56                  13    10256  12.so.0.56[.0]\n *    ...\n *    1.5.27                  15    10527  15.so.15.27[.0]\n *    ...\n *    1.6.23                  16    10623  16.so.16.23[.0]\n *\n *    Henceforth the source version will match the shared-library major\n *    and minor numbers; the shared-library major version number will be\n *    used for changes in backward compatibility, as it is intended.  The\n *    PNG_LIBPNG_VER macro, which is not used within libpng but is available\n *    for applications, is an unsigned integer of the form xyyzz corresponding\n *    to the source version x.y.z (leading zeros in y and z).  Beta versions\n *    were given the previous public release number plus a letter, until\n *    version 1.0.6j; from then on they were given the upcoming public\n *    release number plus \"betaNN\" or \"rcNN\".\n *\n *    Binary incompatibility exists only when applications make direct access\n *    to the info_ptr or png_ptr members through png.h, and the compiled\n *    application is loaded with a different version of the library.\n *\n *    DLLNUM will change each time there are forward or backward changes\n *    in binary compatibility (e.g., when a new feature is added).\n *\n * See libpng.txt or libpng.3 for more information.  The PNG specification\n * is available as a W3C Recommendation and as an ISO Specification,\n * <http://www.w3.org/TR/2003/REC-PNG-20031110/\n */\n\n/*\n * Y2K compliance in libpng:\n * =========================\n *\n *    June 9, 2016\n *\n *    Since the PNG Development group is an ad-hoc body, we can't make\n *    an official declaration.\n *\n *    This is your unofficial assurance that libpng from version 0.71 and\n *    upward through 1.6.23 are Y2K compliant.  It is my belief that\n *    earlier versions were also Y2K compliant.\n *\n *    Libpng only has two year fields.  One is a 2-byte unsigned integer\n *    that will hold years up to 65535.  The other, which is deprecated,\n *    holds the date in text format, and will hold years up to 9999.\n *\n *    The integer is\n *        \"png_uint_16 year\" in png_time_struct.\n *\n *    The string is\n *        \"char time_buffer[29]\" in png_struct.  This is no longer used\n *    in libpng-1.6.x and will be removed from libpng-1.7.0.\n *\n *    There are seven time-related functions:\n *        png.c: png_convert_to_rfc_1123_buffer() in png.c\n *          (formerly png_convert_to_rfc_1123() prior to libpng-1.5.x and\n *          png_convert_to_rfc_1152() in error prior to libpng-0.98)\n *        png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c\n *        png_convert_from_time_t() in pngwrite.c\n *        png_get_tIME() in pngget.c\n *        png_handle_tIME() in pngrutil.c, called in pngread.c\n *        png_set_tIME() in pngset.c\n *        png_write_tIME() in pngwutil.c, called in pngwrite.c\n *\n *    All handle dates properly in a Y2K environment.  The\n *    png_convert_from_time_t() function calls gmtime() to convert from system\n *    clock time, which returns (year - 1900), which we properly convert to\n *    the full 4-digit year.  There is a possibility that libpng applications\n *    are not passing 4-digit years into the png_convert_to_rfc_1123_buffer()\n *    function, or that they are incorrectly passing only a 2-digit year\n *    instead of \"year - 1900\" into the png_convert_from_struct_tm() function,\n *    but this is not under our control.  The libpng documentation has always\n *    stated that it works with 4-digit years, and the APIs have been\n *    documented as such.\n *\n *    The tIME chunk itself is also Y2K compliant.  It uses a 2-byte unsigned\n *    integer to hold the year, and can hold years as large as 65535.\n *\n *    zlib, upon which libpng depends, is also Y2K compliant.  It contains\n *    no date-related code.\n *\n *       Glenn Randers-Pehrson\n *       libpng maintainer\n *       PNG Development Group\n */\n\n#ifndef PNG_H\n#define PNG_H\n\n/* This is not the place to learn how to use libpng. The file libpng-manual.txt\n * describes how to use libpng, and the file example.c summarizes it\n * with some code on which to build.  This file is useful for looking\n * at the actual function definitions and structure components.  If that\n * file has been stripped from your copy of libpng, you can find it at\n * <http://www.libpng.org/pub/png/libpng-manual.txt>\n *\n * If you just need to read a PNG file and don't want to read the documentation\n * skip to the end of this file and read the section entitled 'simplified API'.\n */\n\n/* Version information for png.h - this should match the version in png.c */\n#define PNG_LIBPNG_VER_STRING \"1.6.23\"\n#define PNG_HEADER_VERSION_STRING \\\n     \" libpng version 1.6.23 - June 9, 2016\\n\"\n\n#define PNG_LIBPNG_VER_SONUM   16\n#define PNG_LIBPNG_VER_DLLNUM  16\n\n/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */\n#define PNG_LIBPNG_VER_MAJOR   1\n#define PNG_LIBPNG_VER_MINOR   6\n#define PNG_LIBPNG_VER_RELEASE 23\n\n/* This should match the numeric part of the final component of\n * PNG_LIBPNG_VER_STRING, omitting any leading zero:\n */\n\n#define PNG_LIBPNG_VER_BUILD  0\n\n/* Release Status */\n#define PNG_LIBPNG_BUILD_ALPHA    1\n#define PNG_LIBPNG_BUILD_BETA     2\n#define PNG_LIBPNG_BUILD_RC       3\n#define PNG_LIBPNG_BUILD_STABLE   4\n#define PNG_LIBPNG_BUILD_RELEASE_STATUS_MASK 7\n\n/* Release-Specific Flags */\n#define PNG_LIBPNG_BUILD_PATCH    8 /* Can be OR'ed with\n                                       PNG_LIBPNG_BUILD_STABLE only */\n#define PNG_LIBPNG_BUILD_PRIVATE 16 /* Cannot be OR'ed with\n                                       PNG_LIBPNG_BUILD_SPECIAL */\n#define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with\n                                       PNG_LIBPNG_BUILD_PRIVATE */\n\n#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE\n\n/* Careful here.  At one time, Guy wanted to use 082, but that would be octal.\n * We must not include leading zeros.\n * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only\n * version 1.0.0 was mis-numbered 100 instead of 10000).  From\n * version 1.0.1 it's    xxyyzz, where x=major, y=minor, z=release\n */\n#define PNG_LIBPNG_VER 10623 /* 1.6.23 */\n\n/* Library configuration: these options cannot be changed after\n * the library has been built.\n */\n#ifndef PNGLCONF_H\n    /* If pnglibconf.h is missing, you can\n     * copy scripts/pnglibconf.h.prebuilt to pnglibconf.h\n     */\n#   include \"pnglibconf.h\"\n#endif\n\n#ifndef PNG_VERSION_INFO_ONLY\n   /* Machine specific configuration. */\n#  include \"pngconf.h\"\n#endif\n\n/*\n * Added at libpng-1.2.8\n *\n * Ref MSDN: Private as priority over Special\n * VS_FF_PRIVATEBUILD File *was not* built using standard release\n * procedures. If this value is given, the StringFileInfo block must\n * contain a PrivateBuild string.\n *\n * VS_FF_SPECIALBUILD File *was* built by the original company using\n * standard release procedures but is a variation of the standard\n * file of the same version number. If this value is given, the\n * StringFileInfo block must contain a SpecialBuild string.\n */\n\n#ifdef PNG_USER_PRIVATEBUILD /* From pnglibconf.h */\n#  define PNG_LIBPNG_BUILD_TYPE \\\n       (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_PRIVATE)\n#else\n#  ifdef PNG_LIBPNG_SPECIALBUILD\n#    define PNG_LIBPNG_BUILD_TYPE \\\n         (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_SPECIAL)\n#  else\n#    define PNG_LIBPNG_BUILD_TYPE (PNG_LIBPNG_BUILD_BASE_TYPE)\n#  endif\n#endif\n\n#ifndef PNG_VERSION_INFO_ONLY\n\n/* Inhibit C++ name-mangling for libpng functions but not for system calls. */\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n/* Version information for C files, stored in png.c.  This had better match\n * the version above.\n */\n#define png_libpng_ver png_get_header_ver(NULL)\n\n/* This file is arranged in several sections:\n *\n * 1. [omitted]\n * 2. Any configuration options that can be specified by for the application\n *    code when it is built.  (Build time configuration is in pnglibconf.h)\n * 3. Type definitions (base types are defined in pngconf.h), structure\n *    definitions.\n * 4. Exported library functions.\n * 5. Simplified API.\n * 6. Implementation options.\n *\n * The library source code has additional files (principally pngpriv.h) that\n * allow configuration of the library.\n */\n\n/* Section 1: [omitted] */\n\n/* Section 2: run time configuration\n * See pnglibconf.h for build time configuration\n *\n * Run time configuration allows the application to choose between\n * implementations of certain arithmetic APIs.  The default is set\n * at build time and recorded in pnglibconf.h, but it is safe to\n * override these (and only these) settings.  Note that this won't\n * change what the library does, only application code, and the\n * settings can (and probably should) be made on a per-file basis\n * by setting the #defines before including png.h\n *\n * Use macros to read integers from PNG data or use the exported\n * functions?\n *   PNG_USE_READ_MACROS: use the macros (see below)  Note that\n *     the macros evaluate their argument multiple times.\n *   PNG_NO_USE_READ_MACROS: call the relevant library function.\n *\n * Use the alternative algorithm for compositing alpha samples that\n * does not use division?\n *   PNG_READ_COMPOSITE_NODIV_SUPPORTED: use the 'no division'\n *      algorithm.\n *   PNG_NO_READ_COMPOSITE_NODIV: use the 'division' algorithm.\n *\n * How to handle benign errors if PNG_ALLOW_BENIGN_ERRORS is\n * false?\n *   PNG_ALLOW_BENIGN_ERRORS: map calls to the benign error\n *      APIs to png_warning.\n * Otherwise the calls are mapped to png_error.\n */\n\n/* Section 3: type definitions, including structures and compile time\n * constants.\n * See pngconf.h for base types that vary by machine/system\n */\n\n/* This triggers a compiler error in png.c, if png.c and png.h\n * do not agree upon the version number.\n */\ntypedef char* png_libpng_version_1_6_23;\n\n/* Basic control structions.  Read libpng-manual.txt or libpng.3 for more info.\n *\n * png_struct is the cache of information used while reading or writing a single\n * PNG file.  One of these is always required, although the simplified API\n * (below) hides the creation and destruction of it.\n */\ntypedef struct png_struct_def png_struct;\ntypedef const png_struct * png_const_structp;\ntypedef png_struct * png_structp;\ntypedef png_struct * * png_structpp;\n\n/* png_info contains information read from or to be written to a PNG file.  One\n * or more of these must exist while reading or creating a PNG file.  The\n * information is not used by libpng during read but is used to control what\n * gets written when a PNG file is created.  \"png_get_\" function calls read\n * information during read and \"png_set_\" functions calls write information\n * when creating a PNG.\n * been moved into a separate header file that is not accessible to\n * applications.  Read libpng-manual.txt or libpng.3 for more info.\n */\ntypedef struct png_info_def png_info;\ntypedef png_info * png_infop;\ntypedef const png_info * png_const_infop;\ntypedef png_info * * png_infopp;\n\n/* Types with names ending 'p' are pointer types.  The corresponding types with\n * names ending 'rp' are identical pointer types except that the pointer is\n * marked 'restrict', which means that it is the only pointer to the object\n * passed to the function.  Applications should not use the 'restrict' types;\n * it is always valid to pass 'p' to a pointer with a function argument of the\n * corresponding 'rp' type.  Different compilers have different rules with\n * regard to type matching in the presence of 'restrict'.  For backward\n * compatibility libpng callbacks never have 'restrict' in their parameters and,\n * consequentially, writing portable application code is extremely difficult if\n * an attempt is made to use 'restrict'.\n */\ntypedef png_struct * PNG_RESTRICT png_structrp;\ntypedef const png_struct * PNG_RESTRICT png_const_structrp;\ntypedef png_info * PNG_RESTRICT png_inforp;\ntypedef const png_info * PNG_RESTRICT png_const_inforp;\n\n/* Three color definitions.  The order of the red, green, and blue, (and the\n * exact size) is not important, although the size of the fields need to\n * be png_byte or png_uint_16 (as defined below).\n */\ntypedef struct png_color_struct\n{\n   png_byte red;\n   png_byte green;\n   png_byte blue;\n} png_color;\ntypedef png_color * png_colorp;\ntypedef const png_color * png_const_colorp;\ntypedef png_color * * png_colorpp;\n\ntypedef struct png_color_16_struct\n{\n   png_byte index;    /* used for palette files */\n   png_uint_16 red;   /* for use in red green blue files */\n   png_uint_16 green;\n   png_uint_16 blue;\n   png_uint_16 gray;  /* for use in grayscale files */\n} png_color_16;\ntypedef png_color_16 * png_color_16p;\ntypedef const png_color_16 * png_const_color_16p;\ntypedef png_color_16 * * png_color_16pp;\n\ntypedef struct png_color_8_struct\n{\n   png_byte red;   /* for use in red green blue files */\n   png_byte green;\n   png_byte blue;\n   png_byte gray;  /* for use in grayscale files */\n   png_byte alpha; /* for alpha channel files */\n} png_color_8;\ntypedef png_color_8 * png_color_8p;\ntypedef const png_color_8 * png_const_color_8p;\ntypedef png_color_8 * * png_color_8pp;\n\n/*\n * The following two structures are used for the in-core representation\n * of sPLT chunks.\n */\ntypedef struct png_sPLT_entry_struct\n{\n   png_uint_16 red;\n   png_uint_16 green;\n   png_uint_16 blue;\n   png_uint_16 alpha;\n   png_uint_16 frequency;\n} png_sPLT_entry;\ntypedef png_sPLT_entry * png_sPLT_entryp;\ntypedef const png_sPLT_entry * png_const_sPLT_entryp;\ntypedef png_sPLT_entry * * png_sPLT_entrypp;\n\n/*  When the depth of the sPLT palette is 8 bits, the color and alpha samples\n *  occupy the LSB of their respective members, and the MSB of each member\n *  is zero-filled.  The frequency member always occupies the full 16 bits.\n */\n\ntypedef struct png_sPLT_struct\n{\n   png_charp name;           /* palette name */\n   png_byte depth;           /* depth of palette samples */\n   png_sPLT_entryp entries;  /* palette entries */\n   png_int_32 nentries;      /* number of palette entries */\n} png_sPLT_t;\ntypedef png_sPLT_t * png_sPLT_tp;\ntypedef const png_sPLT_t * png_const_sPLT_tp;\ntypedef png_sPLT_t * * png_sPLT_tpp;\n\n#ifdef PNG_TEXT_SUPPORTED\n/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file,\n * and whether that contents is compressed or not.  The \"key\" field\n * points to a regular zero-terminated C string.  The \"text\" fields can be a\n * regular C string, an empty string, or a NULL pointer.\n * However, the structure returned by png_get_text() will always contain\n * the \"text\" field as a regular zero-terminated C string (possibly\n * empty), never a NULL pointer, so it can be safely used in printf() and\n * other string-handling functions.  Note that the \"itxt_length\", \"lang\", and\n * \"lang_key\" members of the structure only exist when the library is built\n * with iTXt chunk support.  Prior to libpng-1.4.0 the library was built by\n * default without iTXt support. Also note that when iTXt *is* supported,\n * the \"lang\" and \"lang_key\" fields contain NULL pointers when the\n * \"compression\" field contains * PNG_TEXT_COMPRESSION_NONE or\n * PNG_TEXT_COMPRESSION_zTXt. Note that the \"compression value\" is not the\n * same as what appears in the PNG tEXt/zTXt/iTXt chunk's \"compression flag\"\n * which is always 0 or 1, or its \"compression method\" which is always 0.\n */\ntypedef struct png_text_struct\n{\n   int  compression;       /* compression value:\n                             -1: tEXt, none\n                              0: zTXt, deflate\n                              1: iTXt, none\n                              2: iTXt, deflate  */\n   png_charp key;          /* keyword, 1-79 character description of \"text\" */\n   png_charp text;         /* comment, may be an empty string (ie \"\")\n                              or a NULL pointer */\n   png_size_t text_length; /* length of the text string */\n   png_size_t itxt_length; /* length of the itxt string */\n   png_charp lang;         /* language code, 0-79 characters\n                              or a NULL pointer */\n   png_charp lang_key;     /* keyword translated UTF-8 string, 0 or more\n                              chars or a NULL pointer */\n} png_text;\ntypedef png_text * png_textp;\ntypedef const png_text * png_const_textp;\ntypedef png_text * * png_textpp;\n#endif\n\n/* Supported compression types for text in PNG files (tEXt, and zTXt).\n * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */\n#define PNG_TEXT_COMPRESSION_NONE_WR -3\n#define PNG_TEXT_COMPRESSION_zTXt_WR -2\n#define PNG_TEXT_COMPRESSION_NONE    -1\n#define PNG_TEXT_COMPRESSION_zTXt     0\n#define PNG_ITXT_COMPRESSION_NONE     1\n#define PNG_ITXT_COMPRESSION_zTXt     2\n#define PNG_TEXT_COMPRESSION_LAST     3  /* Not a valid value */\n\n/* png_time is a way to hold the time in an machine independent way.\n * Two conversions are provided, both from time_t and struct tm.  There\n * is no portable way to convert to either of these structures, as far\n * as I know.  If you know of a portable way, send it to me.  As a side\n * note - PNG has always been Year 2000 compliant!\n */\ntypedef struct png_time_struct\n{\n   png_uint_16 year; /* full year, as in, 1995 */\n   png_byte month;   /* month of year, 1 - 12 */\n   png_byte day;     /* day of month, 1 - 31 */\n   png_byte hour;    /* hour of day, 0 - 23 */\n   png_byte minute;  /* minute of hour, 0 - 59 */\n   png_byte second;  /* second of minute, 0 - 60 (for leap seconds) */\n} png_time;\ntypedef png_time * png_timep;\ntypedef const png_time * png_const_timep;\ntypedef png_time * * png_timepp;\n\n#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) ||\\\n   defined(PNG_USER_CHUNKS_SUPPORTED)\n/* png_unknown_chunk is a structure to hold queued chunks for which there is\n * no specific support.  The idea is that we can use this to queue\n * up private chunks for output even though the library doesn't actually\n * know about their semantics.\n *\n * The data in the structure is set by libpng on read and used on write.\n */\ntypedef struct png_unknown_chunk_t\n{\n    png_byte name[5]; /* Textual chunk name with '\\0' terminator */\n    png_byte *data;   /* Data, should not be modified on read! */\n    png_size_t size;\n\n    /* On write 'location' must be set using the flag values listed below.\n     * Notice that on read it is set by libpng however the values stored have\n     * more bits set than are listed below.  Always treat the value as a\n     * bitmask.  On write set only one bit - setting multiple bits may cause the\n     * chunk to be written in multiple places.\n     */\n    png_byte location; /* mode of operation at read time */\n}\npng_unknown_chunk;\n\ntypedef png_unknown_chunk * png_unknown_chunkp;\ntypedef const png_unknown_chunk * png_const_unknown_chunkp;\ntypedef png_unknown_chunk * * png_unknown_chunkpp;\n#endif\n\n/* Flag values for the unknown chunk location byte. */\n#define PNG_HAVE_IHDR  0x01\n#define PNG_HAVE_PLTE  0x02\n#define PNG_AFTER_IDAT 0x08\n\n/* Maximum positive integer used in PNG is (2^31)-1 */\n#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL)\n#define PNG_UINT_32_MAX ((png_uint_32)(-1))\n#define PNG_SIZE_MAX ((png_size_t)(-1))\n\n/* These are constants for fixed point values encoded in the\n * PNG specification manner (x100000)\n */\n#define PNG_FP_1    100000\n#define PNG_FP_HALF  50000\n#define PNG_FP_MAX  ((png_fixed_point)0x7fffffffL)\n#define PNG_FP_MIN  (-PNG_FP_MAX)\n\n/* These describe the color_type field in png_info. */\n/* color type masks */\n#define PNG_COLOR_MASK_PALETTE    1\n#define PNG_COLOR_MASK_COLOR      2\n#define PNG_COLOR_MASK_ALPHA      4\n\n/* color types.  Note that not all combinations are legal */\n#define PNG_COLOR_TYPE_GRAY 0\n#define PNG_COLOR_TYPE_PALETTE  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)\n#define PNG_COLOR_TYPE_RGB        (PNG_COLOR_MASK_COLOR)\n#define PNG_COLOR_TYPE_RGB_ALPHA  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA)\n#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA)\n/* aliases */\n#define PNG_COLOR_TYPE_RGBA  PNG_COLOR_TYPE_RGB_ALPHA\n#define PNG_COLOR_TYPE_GA  PNG_COLOR_TYPE_GRAY_ALPHA\n\n/* This is for compression type. PNG 1.0-1.2 only define the single type. */\n#define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */\n#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE\n\n/* This is for filter type. PNG 1.0-1.2 only define the single type. */\n#define PNG_FILTER_TYPE_BASE      0 /* Single row per-byte filtering */\n#define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */\n#define PNG_FILTER_TYPE_DEFAULT   PNG_FILTER_TYPE_BASE\n\n/* These are for the interlacing type.  These values should NOT be changed. */\n#define PNG_INTERLACE_NONE        0 /* Non-interlaced image */\n#define PNG_INTERLACE_ADAM7       1 /* Adam7 interlacing */\n#define PNG_INTERLACE_LAST        2 /* Not a valid value */\n\n/* These are for the oFFs chunk.  These values should NOT be changed. */\n#define PNG_OFFSET_PIXEL          0 /* Offset in pixels */\n#define PNG_OFFSET_MICROMETER     1 /* Offset in micrometers (1/10^6 meter) */\n#define PNG_OFFSET_LAST           2 /* Not a valid value */\n\n/* These are for the pCAL chunk.  These values should NOT be changed. */\n#define PNG_EQUATION_LINEAR       0 /* Linear transformation */\n#define PNG_EQUATION_BASE_E       1 /* Exponential base e transform */\n#define PNG_EQUATION_ARBITRARY    2 /* Arbitrary base exponential transform */\n#define PNG_EQUATION_HYPERBOLIC   3 /* Hyperbolic sine transformation */\n#define PNG_EQUATION_LAST         4 /* Not a valid value */\n\n/* These are for the sCAL chunk.  These values should NOT be changed. */\n#define PNG_SCALE_UNKNOWN         0 /* unknown unit (image scale) */\n#define PNG_SCALE_METER           1 /* meters per pixel */\n#define PNG_SCALE_RADIAN          2 /* radians per pixel */\n#define PNG_SCALE_LAST            3 /* Not a valid value */\n\n/* These are for the pHYs chunk.  These values should NOT be changed. */\n#define PNG_RESOLUTION_UNKNOWN    0 /* pixels/unknown unit (aspect ratio) */\n#define PNG_RESOLUTION_METER      1 /* pixels/meter */\n#define PNG_RESOLUTION_LAST       2 /* Not a valid value */\n\n/* These are for the sRGB chunk.  These values should NOT be changed. */\n#define PNG_sRGB_INTENT_PERCEPTUAL 0\n#define PNG_sRGB_INTENT_RELATIVE   1\n#define PNG_sRGB_INTENT_SATURATION 2\n#define PNG_sRGB_INTENT_ABSOLUTE   3\n#define PNG_sRGB_INTENT_LAST       4 /* Not a valid value */\n\n/* This is for text chunks */\n#define PNG_KEYWORD_MAX_LENGTH     79\n\n/* Maximum number of entries in PLTE/sPLT/tRNS arrays */\n#define PNG_MAX_PALETTE_LENGTH    256\n\n/* These determine if an ancillary chunk's data has been successfully read\n * from the PNG header, or if the application has filled in the corresponding\n * data in the info_struct to be written into the output file.  The values\n * of the PNG_INFO_<chunk> defines should NOT be changed.\n */\n#define PNG_INFO_gAMA 0x0001U\n#define PNG_INFO_sBIT 0x0002U\n#define PNG_INFO_cHRM 0x0004U\n#define PNG_INFO_PLTE 0x0008U\n#define PNG_INFO_tRNS 0x0010U\n#define PNG_INFO_bKGD 0x0020U\n#define PNG_INFO_hIST 0x0040U\n#define PNG_INFO_pHYs 0x0080U\n#define PNG_INFO_oFFs 0x0100U\n#define PNG_INFO_tIME 0x0200U\n#define PNG_INFO_pCAL 0x0400U\n#define PNG_INFO_sRGB 0x0800U  /* GR-P, 0.96a */\n#define PNG_INFO_iCCP 0x1000U  /* ESR, 1.0.6 */\n#define PNG_INFO_sPLT 0x2000U  /* ESR, 1.0.6 */\n#define PNG_INFO_sCAL 0x4000U  /* ESR, 1.0.6 */\n#define PNG_INFO_IDAT 0x8000U  /* ESR, 1.0.6 */\n\n/* This is used for the transformation routines, as some of them\n * change these values for the row.  It also should enable using\n * the routines for other purposes.\n */\ntypedef struct png_row_info_struct\n{\n   png_uint_32 width;    /* width of row */\n   png_size_t rowbytes;  /* number of bytes in row */\n   png_byte color_type;  /* color type of row */\n   png_byte bit_depth;   /* bit depth of row */\n   png_byte channels;    /* number of channels (1, 2, 3, or 4) */\n   png_byte pixel_depth; /* bits per pixel (depth * channels) */\n} png_row_info;\n\ntypedef png_row_info * png_row_infop;\ntypedef png_row_info * * png_row_infopp;\n\n/* These are the function types for the I/O functions and for the functions\n * that allow the user to override the default I/O functions with his or her\n * own.  The png_error_ptr type should match that of user-supplied warning\n * and error functions, while the png_rw_ptr type should match that of the\n * user read/write data functions.  Note that the 'write' function must not\n * modify the buffer it is passed. The 'read' function, on the other hand, is\n * expected to return the read data in the buffer.\n */\ntypedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp));\ntypedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t));\ntypedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp));\ntypedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32,\n    int));\ntypedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32,\n    int));\n\n#ifdef PNG_PROGRESSIVE_READ_SUPPORTED\ntypedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop));\ntypedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop));\n\n/* The following callback receives png_uint_32 row_number, int pass for the\n * png_bytep data of the row.  When transforming an interlaced image the\n * row number is the row number within the sub-image of the interlace pass, so\n * the value will increase to the height of the sub-image (not the full image)\n * then reset to 0 for the next pass.\n *\n * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to\n * find the output pixel (x,y) given an interlaced sub-image pixel\n * (row,col,pass).  (See below for these macros.)\n */\ntypedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep,\n    png_uint_32, int));\n#endif\n\n#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \\\n    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)\ntypedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop,\n    png_bytep));\n#endif\n\n#ifdef PNG_USER_CHUNKS_SUPPORTED\ntypedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp,\n    png_unknown_chunkp));\n#endif\n#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED\n/* not used anywhere */\n/* typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp)); */\n#endif\n\n#ifdef PNG_SETJMP_SUPPORTED\n/* This must match the function definition in <setjmp.h>, and the application\n * must include this before png.h to obtain the definition of jmp_buf.  The\n * function is required to be PNG_NORETURN, but this is not checked.  If the\n * function does return the application will crash via an abort() or similar\n * system level call.\n *\n * If you get a warning here while building the library you may need to make\n * changes to ensure that pnglibconf.h records the calling convention used by\n * your compiler.  This may be very difficult - try using a different compiler\n * to build the library!\n */\nPNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef);\n#endif\n\n/* Transform masks for the high-level interface */\n#define PNG_TRANSFORM_IDENTITY       0x0000    /* read and write */\n#define PNG_TRANSFORM_STRIP_16       0x0001    /* read only */\n#define PNG_TRANSFORM_STRIP_ALPHA    0x0002    /* read only */\n#define PNG_TRANSFORM_PACKING        0x0004    /* read and write */\n#define PNG_TRANSFORM_PACKSWAP       0x0008    /* read and write */\n#define PNG_TRANSFORM_EXPAND         0x0010    /* read only */\n#define PNG_TRANSFORM_INVERT_MONO    0x0020    /* read and write */\n#define PNG_TRANSFORM_SHIFT          0x0040    /* read and write */\n#define PNG_TRANSFORM_BGR            0x0080    /* read and write */\n#define PNG_TRANSFORM_SWAP_ALPHA     0x0100    /* read and write */\n#define PNG_TRANSFORM_SWAP_ENDIAN    0x0200    /* read and write */\n#define PNG_TRANSFORM_INVERT_ALPHA   0x0400    /* read and write */\n#define PNG_TRANSFORM_STRIP_FILLER   0x0800    /* write only */\n/* Added to libpng-1.2.34 */\n#define PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER\n#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */\n/* Added to libpng-1.4.0 */\n#define PNG_TRANSFORM_GRAY_TO_RGB   0x2000      /* read only */\n/* Added to libpng-1.5.4 */\n#define PNG_TRANSFORM_EXPAND_16     0x4000      /* read only */\n#if INT_MAX >= 0x8000 /* else this might break */\n#define PNG_TRANSFORM_SCALE_16      0x8000      /* read only */\n#endif\n\n/* Flags for MNG supported features */\n#define PNG_FLAG_MNG_EMPTY_PLTE     0x01\n#define PNG_FLAG_MNG_FILTER_64      0x04\n#define PNG_ALL_MNG_FEATURES        0x05\n\n/* NOTE: prior to 1.5 these functions had no 'API' style declaration,\n * this allowed the zlib default functions to be used on Windows\n * platforms.  In 1.5 the zlib default malloc (which just calls malloc and\n * ignores the first argument) should be completely compatible with the\n * following.\n */\ntypedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp,\n    png_alloc_size_t));\ntypedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp));\n\n/* Section 4: exported functions\n * Here are the function definitions most commonly used.  This is not\n * the place to find out how to use libpng.  See libpng-manual.txt for the\n * full explanation, see example.c for the summary.  This just provides\n * a simple one line description of the use of each function.\n *\n * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in\n * pngconf.h and in the *.dfn files in the scripts directory.\n *\n *   PNG_EXPORT(ordinal, type, name, (args));\n *\n *       ordinal:    ordinal that is used while building\n *                   *.def files. The ordinal value is only\n *                   relevant when preprocessing png.h with\n *                   the *.dfn files for building symbol table\n *                   entries, and are removed by pngconf.h.\n *       type:       return type of the function\n *       name:       function name\n *       args:       function arguments, with types\n *\n * When we wish to append attributes to a function prototype we use\n * the PNG_EXPORTA() macro instead.\n *\n *   PNG_EXPORTA(ordinal, type, name, (args), attributes);\n *\n *       ordinal, type, name, and args: same as in PNG_EXPORT().\n *       attributes: function attributes\n */\n\n/* Returns the version number of the library */\nPNG_EXPORT(1, png_uint_32, png_access_version_number, (void));\n\n/* Tell lib we have already handled the first <num_bytes> magic bytes.\n * Handling more than 8 bytes from the beginning of the file is an error.\n */\nPNG_EXPORT(2, void, png_set_sig_bytes, (png_structrp png_ptr, int num_bytes));\n\n/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a\n * PNG file.  Returns zero if the supplied bytes match the 8-byte PNG\n * signature, and non-zero otherwise.  Having num_to_check == 0 or\n * start > 7 will always fail (ie return non-zero).\n */\nPNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start,\n    png_size_t num_to_check));\n\n/* Simple signature checking function.  This is the same as calling\n * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n).\n */\n#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n))\n\n/* Allocate and initialize png_ptr struct for reading, and any other memory. */\nPNG_EXPORTA(4, png_structp, png_create_read_struct,\n    (png_const_charp user_png_ver, png_voidp error_ptr,\n    png_error_ptr error_fn, png_error_ptr warn_fn),\n    PNG_ALLOCATED);\n\n/* Allocate and initialize png_ptr struct for writing, and any other memory */\nPNG_EXPORTA(5, png_structp, png_create_write_struct,\n    (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,\n    png_error_ptr warn_fn),\n    PNG_ALLOCATED);\n\nPNG_EXPORT(6, png_size_t, png_get_compression_buffer_size,\n    (png_const_structrp png_ptr));\n\nPNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structrp png_ptr,\n    png_size_t size));\n\n/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp\n * match up.\n */\n#ifdef PNG_SETJMP_SUPPORTED\n/* This function returns the jmp_buf built in to *png_ptr.  It must be\n * supplied with an appropriate 'longjmp' function to use on that jmp_buf\n * unless the default error function is overridden in which case NULL is\n * acceptable.  The size of the jmp_buf is checked against the actual size\n * allocated by the library - the call will return NULL on a mismatch\n * indicating an ABI mismatch.\n */\nPNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structrp png_ptr,\n    png_longjmp_ptr longjmp_fn, size_t jmp_buf_size));\n#  define png_jmpbuf(png_ptr) \\\n      (*png_set_longjmp_fn((png_ptr), longjmp, (sizeof (jmp_buf))))\n#else\n#  define png_jmpbuf(png_ptr) \\\n      (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP)\n#endif\n/* This function should be used by libpng applications in place of\n * longjmp(png_ptr->jmpbuf, val).  If longjmp_fn() has been set, it\n * will use it; otherwise it will call PNG_ABORT().  This function was\n * added in libpng-1.5.0.\n */\nPNG_EXPORTA(9, void, png_longjmp, (png_const_structrp png_ptr, int val),\n    PNG_NORETURN);\n\n#ifdef PNG_READ_SUPPORTED\n/* Reset the compression stream */\nPNG_EXPORTA(10, int, png_reset_zstream, (png_structrp png_ptr), PNG_DEPRECATED);\n#endif\n\n/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */\n#ifdef PNG_USER_MEM_SUPPORTED\nPNG_EXPORTA(11, png_structp, png_create_read_struct_2,\n    (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,\n    png_error_ptr warn_fn,\n    png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn),\n    PNG_ALLOCATED);\nPNG_EXPORTA(12, png_structp, png_create_write_struct_2,\n    (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,\n    png_error_ptr warn_fn,\n    png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn),\n    PNG_ALLOCATED);\n#endif\n\n/* Write the PNG file signature. */\nPNG_EXPORT(13, void, png_write_sig, (png_structrp png_ptr));\n\n/* Write a PNG chunk - size, type, (optional) data, CRC. */\nPNG_EXPORT(14, void, png_write_chunk, (png_structrp png_ptr, png_const_bytep\n    chunk_name, png_const_bytep data, png_size_t length));\n\n/* Write the start of a PNG chunk - length and chunk name. */\nPNG_EXPORT(15, void, png_write_chunk_start, (png_structrp png_ptr,\n    png_const_bytep chunk_name, png_uint_32 length));\n\n/* Write the data of a PNG chunk started with png_write_chunk_start(). */\nPNG_EXPORT(16, void, png_write_chunk_data, (png_structrp png_ptr,\n    png_const_bytep data, png_size_t length));\n\n/* Finish a chunk started with png_write_chunk_start() (includes CRC). */\nPNG_EXPORT(17, void, png_write_chunk_end, (png_structrp png_ptr));\n\n/* Allocate and initialize the info structure */\nPNG_EXPORTA(18, png_infop, png_create_info_struct, (png_const_structrp png_ptr),\n    PNG_ALLOCATED);\n\n/* DEPRECATED: this function allowed init structures to be created using the\n * default allocation method (typically malloc).  Use is deprecated in 1.6.0 and\n * the API will be removed in the future.\n */\nPNG_EXPORTA(19, void, png_info_init_3, (png_infopp info_ptr,\n    png_size_t png_info_struct_size), PNG_DEPRECATED);\n\n/* Writes all the PNG information before the image. */\nPNG_EXPORT(20, void, png_write_info_before_PLTE,\n    (png_structrp png_ptr, png_const_inforp info_ptr));\nPNG_EXPORT(21, void, png_write_info,\n    (png_structrp png_ptr, png_const_inforp info_ptr));\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Read the information before the actual image data. */\nPNG_EXPORT(22, void, png_read_info,\n    (png_structrp png_ptr, png_inforp info_ptr));\n#endif\n\n#ifdef PNG_TIME_RFC1123_SUPPORTED\n   /* Convert to a US string format: there is no localization support in this\n    * routine.  The original implementation used a 29 character buffer in\n    * png_struct, this will be removed in future versions.\n    */\n#if PNG_LIBPNG_VER < 10700\n/* To do: remove this from libpng17 (and from libpng17/png.c and pngstruct.h) */\nPNG_EXPORTA(23, png_const_charp, png_convert_to_rfc1123, (png_structrp png_ptr,\n    png_const_timep ptime),PNG_DEPRECATED);\n#endif\nPNG_EXPORT(241, int, png_convert_to_rfc1123_buffer, (char out[29],\n    png_const_timep ptime));\n#endif\n\n#ifdef PNG_CONVERT_tIME_SUPPORTED\n/* Convert from a struct tm to png_time */\nPNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime,\n    const struct tm * ttime));\n\n/* Convert from time_t to png_time.  Uses gmtime() */\nPNG_EXPORT(25, void, png_convert_from_time_t, (png_timep ptime, time_t ttime));\n#endif /* CONVERT_tIME */\n\n#ifdef PNG_READ_EXPAND_SUPPORTED\n/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */\nPNG_EXPORT(26, void, png_set_expand, (png_structrp png_ptr));\nPNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structrp png_ptr));\nPNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structrp png_ptr));\nPNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structrp png_ptr));\n#endif\n\n#ifdef PNG_READ_EXPAND_16_SUPPORTED\n/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion\n * of a tRNS chunk if present.\n */\nPNG_EXPORT(221, void, png_set_expand_16, (png_structrp png_ptr));\n#endif\n\n#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)\n/* Use blue, green, red order for pixels. */\nPNG_EXPORT(30, void, png_set_bgr, (png_structrp png_ptr));\n#endif\n\n#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED\n/* Expand the grayscale to 24-bit RGB if necessary. */\nPNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structrp png_ptr));\n#endif\n\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\n/* Reduce RGB to grayscale. */\n#define PNG_ERROR_ACTION_NONE  1\n#define PNG_ERROR_ACTION_WARN  2\n#define PNG_ERROR_ACTION_ERROR 3\n#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/\n\nPNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structrp png_ptr,\n    int error_action, double red, double green))\nPNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structrp png_ptr,\n    int error_action, png_fixed_point red, png_fixed_point green))\n\nPNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structrp\n    png_ptr));\n#endif\n\n#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED\nPNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth,\n    png_colorp palette));\n#endif\n\n#ifdef PNG_READ_ALPHA_MODE_SUPPORTED\n/* How the alpha channel is interpreted - this affects how the color channels\n * of a PNG file are returned to the calling application when an alpha channel,\n * or a tRNS chunk in a palette file, is present.\n *\n * This has no effect on the way pixels are written into a PNG output\n * datastream. The color samples in a PNG datastream are never premultiplied\n * with the alpha samples.\n *\n * The default is to return data according to the PNG specification: the alpha\n * channel is a linear measure of the contribution of the pixel to the\n * corresponding composited pixel, and the color channels are unassociated\n * (not premultiplied).  The gamma encoded color channels must be scaled\n * according to the contribution and to do this it is necessary to undo\n * the encoding, scale the color values, perform the composition and reencode\n * the values.  This is the 'PNG' mode.\n *\n * The alternative is to 'associate' the alpha with the color information by\n * storing color channel values that have been scaled by the alpha.\n * image.  These are the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' modes\n * (the latter being the two common names for associated alpha color channels).\n *\n * For the 'OPTIMIZED' mode, a pixel is treated as opaque only if the alpha\n * value is equal to the maximum value.\n *\n * The final choice is to gamma encode the alpha channel as well.  This is\n * broken because, in practice, no implementation that uses this choice\n * correctly undoes the encoding before handling alpha composition.  Use this\n * choice only if other serious errors in the software or hardware you use\n * mandate it; the typical serious error is for dark halos to appear around\n * opaque areas of the composited PNG image because of arithmetic overflow.\n *\n * The API function png_set_alpha_mode specifies which of these choices to use\n * with an enumerated 'mode' value and the gamma of the required output:\n */\n#define PNG_ALPHA_PNG           0 /* according to the PNG standard */\n#define PNG_ALPHA_STANDARD      1 /* according to Porter/Duff */\n#define PNG_ALPHA_ASSOCIATED    1 /* as above; this is the normal practice */\n#define PNG_ALPHA_PREMULTIPLIED 1 /* as above */\n#define PNG_ALPHA_OPTIMIZED     2 /* 'PNG' for opaque pixels, else 'STANDARD' */\n#define PNG_ALPHA_BROKEN        3 /* the alpha channel is gamma encoded */\n\nPNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structrp png_ptr, int mode,\n    double output_gamma))\nPNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structrp png_ptr,\n    int mode, png_fixed_point output_gamma))\n#endif\n\n#if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED)\n/* The output_gamma value is a screen gamma in libpng terminology: it expresses\n * how to decode the output values, not how they are encoded.\n */\n#define PNG_DEFAULT_sRGB -1       /* sRGB gamma and color space */\n#define PNG_GAMMA_MAC_18 -2       /* Old Mac '1.8' gamma and color space */\n#define PNG_GAMMA_sRGB   220000   /* Television standards--matches sRGB gamma */\n#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */\n#endif\n\n/* The following are examples of calls to png_set_alpha_mode to achieve the\n * required overall gamma correction and, where necessary, alpha\n * premultiplication.\n *\n * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);\n *    This is the default libpng handling of the alpha channel - it is not\n *    pre-multiplied into the color components.  In addition the call states\n *    that the output is for a sRGB system and causes all PNG files without gAMA\n *    chunks to be assumed to be encoded using sRGB.\n *\n * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);\n *    In this case the output is assumed to be something like an sRGB conformant\n *    display preceeded by a power-law lookup table of power 1.45.  This is how\n *    early Mac systems behaved.\n *\n * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR);\n *    This is the classic Jim Blinn approach and will work in academic\n *    environments where everything is done by the book.  It has the shortcoming\n *    of assuming that input PNG data with no gamma information is linear - this\n *    is unlikely to be correct unless the PNG files where generated locally.\n *    Most of the time the output precision will be so low as to show\n *    significant banding in dark areas of the image.\n *\n * png_set_expand_16(pp);\n * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB);\n *    This is a somewhat more realistic Jim Blinn inspired approach.  PNG files\n *    are assumed to have the sRGB encoding if not marked with a gamma value and\n *    the output is always 16 bits per component.  This permits accurate scaling\n *    and processing of the data.  If you know that your input PNG files were\n *    generated locally you might need to replace PNG_DEFAULT_sRGB with the\n *    correct value for your system.\n *\n * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB);\n *    If you just need to composite the PNG image onto an existing background\n *    and if you control the code that does this you can use the optimization\n *    setting.  In this case you just copy completely opaque pixels to the\n *    output.  For pixels that are not completely transparent (you just skip\n *    those) you do the composition math using png_composite or png_composite_16\n *    below then encode the resultant 8-bit or 16-bit values to match the output\n *    encoding.\n *\n * Other cases\n *    If neither the PNG nor the standard linear encoding work for you because\n *    of the software or hardware you use then you have a big problem.  The PNG\n *    case will probably result in halos around the image.  The linear encoding\n *    will probably result in a washed out, too bright, image (it's actually too\n *    contrasty.)  Try the ALPHA_OPTIMIZED mode above - this will probably\n *    substantially reduce the halos.  Alternatively try:\n *\n * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB);\n *    This option will also reduce the halos, but there will be slight dark\n *    halos round the opaque parts of the image where the background is light.\n *    In the OPTIMIZED mode the halos will be light halos where the background\n *    is dark.  Take your pick - the halos are unavoidable unless you can get\n *    your hardware/software fixed!  (The OPTIMIZED approach is slightly\n *    faster.)\n *\n * When the default gamma of PNG files doesn't match the output gamma.\n *    If you have PNG files with no gamma information png_set_alpha_mode allows\n *    you to provide a default gamma, but it also sets the ouput gamma to the\n *    matching value.  If you know your PNG files have a gamma that doesn't\n *    match the output you can take advantage of the fact that\n *    png_set_alpha_mode always sets the output gamma but only sets the PNG\n *    default if it is not already set:\n *\n * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);\n * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);\n *    The first call sets both the default and the output gamma values, the\n *    second call overrides the output gamma without changing the default.  This\n *    is easier than achieving the same effect with png_set_gamma.  You must use\n *    PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will\n *    fire if more than one call to png_set_alpha_mode and png_set_background is\n *    made in the same read operation, however multiple calls with PNG_ALPHA_PNG\n *    are ignored.\n */\n\n#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED\nPNG_EXPORT(36, void, png_set_strip_alpha, (png_structrp png_ptr));\n#endif\n\n#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \\\n    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)\nPNG_EXPORT(37, void, png_set_swap_alpha, (png_structrp png_ptr));\n#endif\n\n#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \\\n    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)\nPNG_EXPORT(38, void, png_set_invert_alpha, (png_structrp png_ptr));\n#endif\n\n#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)\n/* Add a filler byte to 8-bit or 16-bit Gray or 24-bit or 48-bit RGB images. */\nPNG_EXPORT(39, void, png_set_filler, (png_structrp png_ptr, png_uint_32 filler,\n    int flags));\n/* The values of the PNG_FILLER_ defines should NOT be changed */\n#  define PNG_FILLER_BEFORE 0\n#  define PNG_FILLER_AFTER 1\n/* Add an alpha byte to 8-bit or 16-bit Gray or 24-bit or 48-bit RGB images. */\nPNG_EXPORT(40, void, png_set_add_alpha, (png_structrp png_ptr,\n    png_uint_32 filler, int flags));\n#endif /* READ_FILLER || WRITE_FILLER */\n\n#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)\n/* Swap bytes in 16-bit depth files. */\nPNG_EXPORT(41, void, png_set_swap, (png_structrp png_ptr));\n#endif\n\n#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)\n/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */\nPNG_EXPORT(42, void, png_set_packing, (png_structrp png_ptr));\n#endif\n\n#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \\\n    defined(PNG_WRITE_PACKSWAP_SUPPORTED)\n/* Swap packing order of pixels in bytes. */\nPNG_EXPORT(43, void, png_set_packswap, (png_structrp png_ptr));\n#endif\n\n#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)\n/* Converts files to legal bit depths. */\nPNG_EXPORT(44, void, png_set_shift, (png_structrp png_ptr, png_const_color_8p\n    true_bits));\n#endif\n\n#if defined(PNG_READ_INTERLACING_SUPPORTED) || \\\n    defined(PNG_WRITE_INTERLACING_SUPPORTED)\n/* Have the code handle the interlacing.  Returns the number of passes.\n * MUST be called before png_read_update_info or png_start_read_image,\n * otherwise it will not have the desired effect.  Note that it is still\n * necessary to call png_read_row or png_read_rows png_get_image_height\n * times for each pass.\n*/\nPNG_EXPORT(45, int, png_set_interlace_handling, (png_structrp png_ptr));\n#endif\n\n#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)\n/* Invert monochrome files */\nPNG_EXPORT(46, void, png_set_invert_mono, (png_structrp png_ptr));\n#endif\n\n#ifdef PNG_READ_BACKGROUND_SUPPORTED\n/* Handle alpha and tRNS by replacing with a background color.  Prior to\n * libpng-1.5.4 this API must not be called before the PNG file header has been\n * read.  Doing so will result in unexpected behavior and possible warnings or\n * errors if the PNG file contains a bKGD chunk.\n */\nPNG_FP_EXPORT(47, void, png_set_background, (png_structrp png_ptr,\n    png_const_color_16p background_color, int background_gamma_code,\n    int need_expand, double background_gamma))\nPNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structrp png_ptr,\n    png_const_color_16p background_color, int background_gamma_code,\n    int need_expand, png_fixed_point background_gamma))\n#endif\n#ifdef PNG_READ_BACKGROUND_SUPPORTED\n#  define PNG_BACKGROUND_GAMMA_UNKNOWN 0\n#  define PNG_BACKGROUND_GAMMA_SCREEN  1\n#  define PNG_BACKGROUND_GAMMA_FILE    2\n#  define PNG_BACKGROUND_GAMMA_UNIQUE  3\n#endif\n\n#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED\n/* Scale a 16-bit depth file down to 8-bit, accurately. */\nPNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr));\n#endif\n\n#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED\n#define PNG_READ_16_TO_8_SUPPORTED /* Name prior to 1.5.4 */\n/* Strip the second byte of information from a 16-bit depth file. */\nPNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr));\n#endif\n\n#ifdef PNG_READ_QUANTIZE_SUPPORTED\n/* Turn on quantizing, and reduce the palette to the number of colors\n * available.\n */\nPNG_EXPORT(49, void, png_set_quantize, (png_structrp png_ptr,\n    png_colorp palette, int num_palette, int maximum_colors,\n    png_const_uint_16p histogram, int full_quantize));\n#endif\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n/* The threshold on gamma processing is configurable but hard-wired into the\n * library.  The following is the floating point variant.\n */\n#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001)\n\n/* Handle gamma correction. Screen_gamma=(display_exponent).\n * NOTE: this API simply sets the screen and file gamma values. It will\n * therefore override the value for gamma in a PNG file if it is called after\n * the file header has been read - use with care  - call before reading the PNG\n * file for best results!\n *\n * These routines accept the same gamma values as png_set_alpha_mode (described\n * above).  The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either\n * API (floating point or fixed.)  Notice, however, that the 'file_gamma' value\n * is the inverse of a 'screen gamma' value.\n */\nPNG_FP_EXPORT(50, void, png_set_gamma, (png_structrp png_ptr,\n    double screen_gamma, double override_file_gamma))\nPNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structrp png_ptr,\n    png_fixed_point screen_gamma, png_fixed_point override_file_gamma))\n#endif\n\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\n/* Set how many lines between output flushes - 0 for no flushing */\nPNG_EXPORT(51, void, png_set_flush, (png_structrp png_ptr, int nrows));\n/* Flush the current PNG output buffer */\nPNG_EXPORT(52, void, png_write_flush, (png_structrp png_ptr));\n#endif\n\n/* Optional update palette with requested transformations */\nPNG_EXPORT(53, void, png_start_read_image, (png_structrp png_ptr));\n\n/* Optional call to update the users info structure */\nPNG_EXPORT(54, void, png_read_update_info, (png_structrp png_ptr,\n    png_inforp info_ptr));\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Read one or more rows of image data. */\nPNG_EXPORT(55, void, png_read_rows, (png_structrp png_ptr, png_bytepp row,\n    png_bytepp display_row, png_uint_32 num_rows));\n#endif\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Read a row of data. */\nPNG_EXPORT(56, void, png_read_row, (png_structrp png_ptr, png_bytep row,\n    png_bytep display_row));\n#endif\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Read the whole image into memory at once. */\nPNG_EXPORT(57, void, png_read_image, (png_structrp png_ptr, png_bytepp image));\n#endif\n\n/* Write a row of image data */\nPNG_EXPORT(58, void, png_write_row, (png_structrp png_ptr,\n    png_const_bytep row));\n\n/* Write a few rows of image data: (*row) is not written; however, the type\n * is declared as writeable to maintain compatibility with previous versions\n * of libpng and to allow the 'display_row' array from read_rows to be passed\n * unchanged to write_rows.\n */\nPNG_EXPORT(59, void, png_write_rows, (png_structrp png_ptr, png_bytepp row,\n    png_uint_32 num_rows));\n\n/* Write the image data */\nPNG_EXPORT(60, void, png_write_image, (png_structrp png_ptr, png_bytepp image));\n\n/* Write the end of the PNG file. */\nPNG_EXPORT(61, void, png_write_end, (png_structrp png_ptr,\n    png_inforp info_ptr));\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Read the end of the PNG file. */\nPNG_EXPORT(62, void, png_read_end, (png_structrp png_ptr, png_inforp info_ptr));\n#endif\n\n/* Free any memory associated with the png_info_struct */\nPNG_EXPORT(63, void, png_destroy_info_struct, (png_const_structrp png_ptr,\n    png_infopp info_ptr_ptr));\n\n/* Free any memory associated with the png_struct and the png_info_structs */\nPNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr,\n    png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr));\n\n/* Free any memory associated with the png_struct and the png_info_structs */\nPNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr,\n    png_infopp info_ptr_ptr));\n\n/* Set the libpng method of handling chunk CRC errors */\nPNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action,\n    int ancil_action));\n\n/* Values for png_set_crc_action() say how to handle CRC errors in\n * ancillary and critical chunks, and whether to use the data contained\n * therein.  Note that it is impossible to \"discard\" data in a critical\n * chunk.  For versions prior to 0.90, the action was always error/quit,\n * whereas in version 0.90 and later, the action for CRC errors in ancillary\n * chunks is warn/discard.  These values should NOT be changed.\n *\n *      value                       action:critical     action:ancillary\n */\n#define PNG_CRC_DEFAULT       0  /* error/quit          warn/discard data */\n#define PNG_CRC_ERROR_QUIT    1  /* error/quit          error/quit        */\n#define PNG_CRC_WARN_DISCARD  2  /* (INVALID)           warn/discard data */\n#define PNG_CRC_WARN_USE      3  /* warn/use data       warn/use data     */\n#define PNG_CRC_QUIET_USE     4  /* quiet/use data      quiet/use data    */\n#define PNG_CRC_NO_CHANGE     5  /* use current value   use current value */\n\n#ifdef PNG_WRITE_SUPPORTED\n/* These functions give the user control over the scan-line filtering in\n * libpng and the compression methods used by zlib.  These functions are\n * mainly useful for testing, as the defaults should work with most users.\n * Those users who are tight on memory or want faster performance at the\n * expense of compression can modify them.  See the compression library\n * header file (zlib.h) for an explination of the compression functions.\n */\n\n/* Set the filtering method(s) used by libpng.  Currently, the only valid\n * value for \"method\" is 0.\n */\nPNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,\n    int filters));\n#endif /* WRITE */\n\n/* Flags for png_set_filter() to say which filters to use.  The flags\n * are chosen so that they don't conflict with real filter types\n * below, in case they are supplied instead of the #defined constants.\n * These values should NOT be changed.\n */\n#define PNG_NO_FILTERS     0x00\n#define PNG_FILTER_NONE    0x08\n#define PNG_FILTER_SUB     0x10\n#define PNG_FILTER_UP      0x20\n#define PNG_FILTER_AVG     0x40\n#define PNG_FILTER_PAETH   0x80\n#define PNG_FAST_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP)\n#define PNG_ALL_FILTERS (PNG_FAST_FILTERS | PNG_FILTER_AVG | PNG_FILTER_PAETH)\n\n/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.\n * These defines should NOT be changed.\n */\n#define PNG_FILTER_VALUE_NONE  0\n#define PNG_FILTER_VALUE_SUB   1\n#define PNG_FILTER_VALUE_UP    2\n#define PNG_FILTER_VALUE_AVG   3\n#define PNG_FILTER_VALUE_PAETH 4\n#define PNG_FILTER_VALUE_LAST  5\n\n#ifdef PNG_WRITE_SUPPORTED\n#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* DEPRECATED */\nPNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr,\n    int heuristic_method, int num_weights, png_const_doublep filter_weights,\n    png_const_doublep filter_costs))\nPNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed,\n    (png_structrp png_ptr, int heuristic_method, int num_weights,\n    png_const_fixed_point_p filter_weights,\n    png_const_fixed_point_p filter_costs))\n#endif /* WRITE_WEIGHTED_FILTER */\n\n/* The following are no longer used and will be removed from libpng-1.7: */\n#define PNG_FILTER_HEURISTIC_DEFAULT    0  /* Currently \"UNWEIGHTED\" */\n#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1  /* Used by libpng < 0.95 */\n#define PNG_FILTER_HEURISTIC_WEIGHTED   2  /* Experimental feature */\n#define PNG_FILTER_HEURISTIC_LAST       3  /* Not a valid value */\n\n/* Set the library compression level.  Currently, valid values range from\n * 0 - 9, corresponding directly to the zlib compression levels 0 - 9\n * (0 - no compression, 9 - \"maximal\" compression).  Note that tests have\n * shown that zlib compression levels 3-6 usually perform as well as level 9\n * for PNG images, and do considerably fewer caclulations.  In the future,\n * these values may not correspond directly to the zlib compression levels.\n */\n#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED\nPNG_EXPORT(69, void, png_set_compression_level, (png_structrp png_ptr,\n    int level));\n\nPNG_EXPORT(70, void, png_set_compression_mem_level, (png_structrp png_ptr,\n    int mem_level));\n\nPNG_EXPORT(71, void, png_set_compression_strategy, (png_structrp png_ptr,\n    int strategy));\n\n/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a\n * smaller value of window_bits if it can do so safely.\n */\nPNG_EXPORT(72, void, png_set_compression_window_bits, (png_structrp png_ptr,\n    int window_bits));\n\nPNG_EXPORT(73, void, png_set_compression_method, (png_structrp png_ptr,\n    int method));\n#endif /* WRITE_CUSTOMIZE_COMPRESSION */\n\n#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED\n/* Also set zlib parameters for compressing non-IDAT chunks */\nPNG_EXPORT(222, void, png_set_text_compression_level, (png_structrp png_ptr,\n    int level));\n\nPNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structrp png_ptr,\n    int mem_level));\n\nPNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structrp png_ptr,\n    int strategy));\n\n/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a\n * smaller value of window_bits if it can do so safely.\n */\nPNG_EXPORT(225, void, png_set_text_compression_window_bits,\n    (png_structrp png_ptr, int window_bits));\n\nPNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr,\n    int method));\n#endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */\n#endif /* WRITE */\n\n/* These next functions are called for input/output, memory, and error\n * handling.  They are in the file pngrio.c, pngwio.c, and pngerror.c,\n * and call standard C I/O routines such as fread(), fwrite(), and\n * fprintf().  These functions can be made to use other I/O routines\n * at run time for those applications that need to handle I/O in a\n * different manner by calling png_set_???_fn().  See libpng-manual.txt for\n * more information.\n */\n\n#ifdef PNG_STDIO_SUPPORTED\n/* Initialize the input/output for the PNG file to the default functions. */\nPNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, png_FILE_p fp));\n#endif\n\n/* Replace the (error and abort), and warning functions with user\n * supplied functions.  If no messages are to be printed you must still\n * write and use replacement functions. The replacement error_fn should\n * still do a longjmp to the last setjmp location if you are using this\n * method of error handling.  If error_fn or warning_fn is NULL, the\n * default function will be used.\n */\n\nPNG_EXPORT(75, void, png_set_error_fn, (png_structrp png_ptr,\n    png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn));\n\n/* Return the user pointer associated with the error functions */\nPNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structrp png_ptr));\n\n/* Replace the default data output functions with a user supplied one(s).\n * If buffered output is not used, then output_flush_fn can be set to NULL.\n * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time\n * output_flush_fn will be ignored (and thus can be NULL).\n * It is probably a mistake to use NULL for output_flush_fn if\n * write_data_fn is not also NULL unless you have built libpng with\n * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's\n * default flush function, which uses the standard *FILE structure, will\n * be used.\n */\nPNG_EXPORT(77, void, png_set_write_fn, (png_structrp png_ptr, png_voidp io_ptr,\n    png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn));\n\n/* Replace the default data input function with a user supplied one. */\nPNG_EXPORT(78, void, png_set_read_fn, (png_structrp png_ptr, png_voidp io_ptr,\n    png_rw_ptr read_data_fn));\n\n/* Return the user pointer associated with the I/O functions */\nPNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_const_structrp png_ptr));\n\nPNG_EXPORT(80, void, png_set_read_status_fn, (png_structrp png_ptr,\n    png_read_status_ptr read_row_fn));\n\nPNG_EXPORT(81, void, png_set_write_status_fn, (png_structrp png_ptr,\n    png_write_status_ptr write_row_fn));\n\n#ifdef PNG_USER_MEM_SUPPORTED\n/* Replace the default memory allocation functions with user supplied one(s). */\nPNG_EXPORT(82, void, png_set_mem_fn, (png_structrp png_ptr, png_voidp mem_ptr,\n    png_malloc_ptr malloc_fn, png_free_ptr free_fn));\n/* Return the user pointer associated with the memory functions */\nPNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structrp png_ptr));\n#endif\n\n#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED\nPNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structrp png_ptr,\n    png_user_transform_ptr read_user_transform_fn));\n#endif\n\n#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED\nPNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structrp png_ptr,\n    png_user_transform_ptr write_user_transform_fn));\n#endif\n\n#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED\nPNG_EXPORT(86, void, png_set_user_transform_info, (png_structrp png_ptr,\n    png_voidp user_transform_ptr, int user_transform_depth,\n    int user_transform_channels));\n/* Return the user pointer associated with the user transform functions */\nPNG_EXPORT(87, png_voidp, png_get_user_transform_ptr,\n    (png_const_structrp png_ptr));\n#endif\n\n#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED\n/* Return information about the row currently being processed.  Note that these\n * APIs do not fail but will return unexpected results if called outside a user\n * transform callback.  Also note that when transforming an interlaced image the\n * row number is the row number within the sub-image of the interlace pass, so\n * the value will increase to the height of the sub-image (not the full image)\n * then reset to 0 for the next pass.\n *\n * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to\n * find the output pixel (x,y) given an interlaced sub-image pixel\n * (row,col,pass).  (See below for these macros.)\n */\nPNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structrp));\nPNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structrp));\n#endif\n\n#ifdef PNG_READ_USER_CHUNKS_SUPPORTED\n/* This callback is called only for *unknown* chunks.  If\n * PNG_HANDLE_AS_UNKNOWN_SUPPORTED is set then it is possible to set known\n * chunks to be treated as unknown, however in this case the callback must do\n * any processing required by the chunk (e.g. by calling the appropriate\n * png_set_ APIs.)\n *\n * There is no write support - on write, by default, all the chunks in the\n * 'unknown' list are written in the specified position.\n *\n * The integer return from the callback function is interpreted thus:\n *\n * negative: An error occurred; png_chunk_error will be called.\n *     zero: The chunk was not handled, the chunk will be saved. A critical\n *           chunk will cause an error at this point unless it is to be saved.\n * positive: The chunk was handled, libpng will ignore/discard it.\n *\n * See \"INTERACTION WTIH USER CHUNK CALLBACKS\" below for important notes about\n * how this behavior will change in libpng 1.7\n */\nPNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structrp png_ptr,\n    png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn));\n#endif\n\n#ifdef PNG_USER_CHUNKS_SUPPORTED\nPNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structrp png_ptr));\n#endif\n\n#ifdef PNG_PROGRESSIVE_READ_SUPPORTED\n/* Sets the function callbacks for the push reader, and a pointer to a\n * user-defined structure available to the callback functions.\n */\nPNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structrp png_ptr,\n    png_voidp progressive_ptr, png_progressive_info_ptr info_fn,\n    png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn));\n\n/* Returns the user pointer associated with the push read functions */\nPNG_EXPORT(91, png_voidp, png_get_progressive_ptr,\n    (png_const_structrp png_ptr));\n\n/* Function to be called when data becomes available */\nPNG_EXPORT(92, void, png_process_data, (png_structrp png_ptr,\n    png_inforp info_ptr, png_bytep buffer, png_size_t buffer_size));\n\n/* A function which may be called *only* within png_process_data to stop the\n * processing of any more data.  The function returns the number of bytes\n * remaining, excluding any that libpng has cached internally.  A subsequent\n * call to png_process_data must supply these bytes again.  If the argument\n * 'save' is set to true the routine will first save all the pending data and\n * will always return 0.\n */\nPNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structrp, int save));\n\n/* A function which may be called *only* outside (after) a call to\n * png_process_data.  It returns the number of bytes of data to skip in the\n * input.  Normally it will return 0, but if it returns a non-zero value the\n * application must skip than number of bytes of input data and pass the\n * following data to the next call to png_process_data.\n */\nPNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structrp));\n\n/* Function that combines rows.  'new_row' is a flag that should come from\n * the callback and be non-NULL if anything needs to be done; the library\n * stores its own version of the new data internally and ignores the passed\n * in value.\n */\nPNG_EXPORT(93, void, png_progressive_combine_row, (png_const_structrp png_ptr,\n    png_bytep old_row, png_const_bytep new_row));\n#endif /* PROGRESSIVE_READ */\n\nPNG_EXPORTA(94, png_voidp, png_malloc, (png_const_structrp png_ptr,\n    png_alloc_size_t size), PNG_ALLOCATED);\n/* Added at libpng version 1.4.0 */\nPNG_EXPORTA(95, png_voidp, png_calloc, (png_const_structrp png_ptr,\n    png_alloc_size_t size), PNG_ALLOCATED);\n\n/* Added at libpng version 1.2.4 */\nPNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_const_structrp png_ptr,\n    png_alloc_size_t size), PNG_ALLOCATED);\n\n/* Frees a pointer allocated by png_malloc() */\nPNG_EXPORT(97, void, png_free, (png_const_structrp png_ptr, png_voidp ptr));\n\n/* Free data that was allocated internally */\nPNG_EXPORT(98, void, png_free_data, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 free_me, int num));\n\n/* Reassign responsibility for freeing existing data, whether allocated\n * by libpng or by the application; this works on the png_info structure passed\n * in, it does not change the state for other png_info structures.\n *\n * It is unlikely that this function works correctly as of 1.6.0 and using it\n * may result either in memory leaks or double free of allocated data.\n */\nPNG_EXPORT(99, void, png_data_freer, (png_const_structrp png_ptr,\n    png_inforp info_ptr, int freer, png_uint_32 mask));\n\n/* Assignments for png_data_freer */\n#define PNG_DESTROY_WILL_FREE_DATA 1\n#define PNG_SET_WILL_FREE_DATA 1\n#define PNG_USER_WILL_FREE_DATA 2\n/* Flags for png_ptr->free_me and info_ptr->free_me */\n#define PNG_FREE_HIST 0x0008U\n#define PNG_FREE_ICCP 0x0010U\n#define PNG_FREE_SPLT 0x0020U\n#define PNG_FREE_ROWS 0x0040U\n#define PNG_FREE_PCAL 0x0080U\n#define PNG_FREE_SCAL 0x0100U\n#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\n#  define PNG_FREE_UNKN 0x0200U\n#endif\n/*      PNG_FREE_LIST 0x0400U   removed in 1.6.0 because it is ignored */\n#define PNG_FREE_PLTE 0x1000U\n#define PNG_FREE_TRNS 0x2000U\n#define PNG_FREE_TEXT 0x4000U\n#define PNG_FREE_ALL  0x7fffU\n#define PNG_FREE_MUL  0x4220U /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */\n\n#ifdef PNG_USER_MEM_SUPPORTED\nPNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr,\n    png_alloc_size_t size), PNG_ALLOCATED PNG_DEPRECATED);\nPNG_EXPORTA(101, void, png_free_default, (png_const_structrp png_ptr,\n    png_voidp ptr), PNG_DEPRECATED);\n#endif\n\n#ifdef PNG_ERROR_TEXT_SUPPORTED\n/* Fatal error in PNG image of libpng - can't continue */\nPNG_EXPORTA(102, void, png_error, (png_const_structrp png_ptr,\n    png_const_charp error_message), PNG_NORETURN);\n\n/* The same, but the chunk name is prepended to the error string. */\nPNG_EXPORTA(103, void, png_chunk_error, (png_const_structrp png_ptr,\n    png_const_charp error_message), PNG_NORETURN);\n\n#else\n/* Fatal error in PNG image of libpng - can't continue */\nPNG_EXPORTA(104, void, png_err, (png_const_structrp png_ptr), PNG_NORETURN);\n#  define png_error(s1,s2) png_err(s1)\n#  define png_chunk_error(s1,s2) png_err(s1)\n#endif\n\n#ifdef PNG_WARNINGS_SUPPORTED\n/* Non-fatal error in libpng.  Can continue, but may have a problem. */\nPNG_EXPORT(105, void, png_warning, (png_const_structrp png_ptr,\n    png_const_charp warning_message));\n\n/* Non-fatal error in libpng, chunk name is prepended to message. */\nPNG_EXPORT(106, void, png_chunk_warning, (png_const_structrp png_ptr,\n    png_const_charp warning_message));\n#else\n#  define png_warning(s1,s2) ((void)(s1))\n#  define png_chunk_warning(s1,s2) ((void)(s1))\n#endif\n\n#ifdef PNG_BENIGN_ERRORS_SUPPORTED\n/* Benign error in libpng.  Can continue, but may have a problem.\n * User can choose whether to handle as a fatal error or as a warning. */\nPNG_EXPORT(107, void, png_benign_error, (png_const_structrp png_ptr,\n    png_const_charp warning_message));\n\n#ifdef PNG_READ_SUPPORTED\n/* Same, chunk name is prepended to message (only during read) */\nPNG_EXPORT(108, void, png_chunk_benign_error, (png_const_structrp png_ptr,\n    png_const_charp warning_message));\n#endif\n\nPNG_EXPORT(109, void, png_set_benign_errors,\n    (png_structrp png_ptr, int allowed));\n#else\n#  ifdef PNG_ALLOW_BENIGN_ERRORS\n#    define png_benign_error png_warning\n#    define png_chunk_benign_error png_chunk_warning\n#  else\n#    define png_benign_error png_error\n#    define png_chunk_benign_error png_chunk_error\n#  endif\n#endif\n\n/* The png_set_<chunk> functions are for storing values in the png_info_struct.\n * Similarly, the png_get_<chunk> calls are used to read values from the\n * png_info_struct, either storing the parameters in the passed variables, or\n * setting pointers into the png_info_struct where the data is stored.  The\n * png_get_<chunk> functions return a non-zero value if the data was available\n * in info_ptr, or return zero and do not change any of the parameters if the\n * data was not available.\n *\n * These functions should be used instead of directly accessing png_info\n * to avoid problems with future changes in the size and internal layout of\n * png_info_struct.\n */\n/* Returns \"flag\" if chunk data is valid in info_ptr. */\nPNG_EXPORT(110, png_uint_32, png_get_valid, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr, png_uint_32 flag));\n\n/* Returns number of bytes needed to hold a transformed row. */\nPNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n#ifdef PNG_INFO_IMAGE_SUPPORTED\n/* Returns row_pointers, which is an array of pointers to scanlines that was\n * returned from png_read_png().\n */\nPNG_EXPORT(112, png_bytepp, png_get_rows, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n/* Set row_pointers, which is an array of pointers to scanlines for use\n * by png_write_png().\n */\nPNG_EXPORT(113, void, png_set_rows, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_bytepp row_pointers));\n#endif\n\n/* Returns number of color channels in image. */\nPNG_EXPORT(114, png_byte, png_get_channels, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n#ifdef PNG_EASY_ACCESS_SUPPORTED\n/* Returns image width in pixels. */\nPNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n/* Returns image height in pixels. */\nPNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n/* Returns image bit_depth. */\nPNG_EXPORT(117, png_byte, png_get_bit_depth, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n/* Returns image color_type. */\nPNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n/* Returns image filter_type. */\nPNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n/* Returns image interlace_type. */\nPNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n/* Returns image compression_type. */\nPNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n\n/* Returns image resolution in pixels per meter, from pHYs chunk data. */\nPNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\nPNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\nPNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\n\n/* Returns pixel aspect ratio, computed from pHYs chunk data.  */\nPNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr))\nPNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr))\n\n/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */\nPNG_EXPORT(126, png_int_32, png_get_x_offset_pixels,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\nPNG_EXPORT(127, png_int_32, png_get_y_offset_pixels,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\nPNG_EXPORT(128, png_int_32, png_get_x_offset_microns,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\nPNG_EXPORT(129, png_int_32, png_get_y_offset_microns,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\n\n#endif /* EASY_ACCESS */\n\n#ifdef PNG_READ_SUPPORTED\n/* Returns pointer to signature string read from PNG header */\nPNG_EXPORT(130, png_const_bytep, png_get_signature, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr));\n#endif\n\n#ifdef PNG_bKGD_SUPPORTED\nPNG_EXPORT(131, png_uint_32, png_get_bKGD, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_color_16p *background));\n#endif\n\n#ifdef PNG_bKGD_SUPPORTED\nPNG_EXPORT(132, void, png_set_bKGD, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_color_16p background));\n#endif\n\n#ifdef PNG_cHRM_SUPPORTED\nPNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr, double *white_x, double *white_y, double *red_x,\n    double *red_y, double *green_x, double *green_y, double *blue_x,\n    double *blue_y))\nPNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr, double *red_X, double *red_Y, double *red_Z,\n    double *green_X, double *green_Y, double *green_Z, double *blue_X,\n    double *blue_Y, double *blue_Z))\nPNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_fixed_point *int_white_x, png_fixed_point *int_white_y,\n    png_fixed_point *int_red_x, png_fixed_point *int_red_y,\n    png_fixed_point *int_green_x, png_fixed_point *int_green_y,\n    png_fixed_point *int_blue_x, png_fixed_point *int_blue_y))\nPNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_fixed_point *int_red_X, png_fixed_point *int_red_Y,\n    png_fixed_point *int_red_Z, png_fixed_point *int_green_X,\n    png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,\n    png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,\n    png_fixed_point *int_blue_Z))\n#endif\n\n#ifdef PNG_cHRM_SUPPORTED\nPNG_FP_EXPORT(135, void, png_set_cHRM, (png_const_structrp png_ptr,\n    png_inforp info_ptr,\n    double white_x, double white_y, double red_x, double red_y, double green_x,\n    double green_y, double blue_x, double blue_y))\nPNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_const_structrp png_ptr,\n    png_inforp info_ptr, double red_X, double red_Y, double red_Z,\n    double green_X, double green_Y, double green_Z, double blue_X,\n    double blue_Y, double blue_Z))\nPNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_fixed_point int_white_x,\n    png_fixed_point int_white_y, png_fixed_point int_red_x,\n    png_fixed_point int_red_y, png_fixed_point int_green_x,\n    png_fixed_point int_green_y, png_fixed_point int_blue_x,\n    png_fixed_point int_blue_y))\nPNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y,\n    png_fixed_point int_red_Z, png_fixed_point int_green_X,\n    png_fixed_point int_green_Y, png_fixed_point int_green_Z,\n    png_fixed_point int_blue_X, png_fixed_point int_blue_Y,\n    png_fixed_point int_blue_Z))\n#endif\n\n#ifdef PNG_gAMA_SUPPORTED\nPNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr, double *file_gamma))\nPNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_fixed_point *int_file_gamma))\n#endif\n\n#ifdef PNG_gAMA_SUPPORTED\nPNG_FP_EXPORT(139, void, png_set_gAMA, (png_const_structrp png_ptr,\n    png_inforp info_ptr, double file_gamma))\nPNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_fixed_point int_file_gamma))\n#endif\n\n#ifdef PNG_hIST_SUPPORTED\nPNG_EXPORT(141, png_uint_32, png_get_hIST, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_uint_16p *hist));\n#endif\n\n#ifdef PNG_hIST_SUPPORTED\nPNG_EXPORT(142, void, png_set_hIST, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_uint_16p hist));\n#endif\n\nPNG_EXPORT(143, png_uint_32, png_get_IHDR, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr, png_uint_32 *width, png_uint_32 *height,\n    int *bit_depth, int *color_type, int *interlace_method,\n    int *compression_method, int *filter_method));\n\nPNG_EXPORT(144, void, png_set_IHDR, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth,\n    int color_type, int interlace_method, int compression_method,\n    int filter_method));\n\n#ifdef PNG_oFFs_SUPPORTED\nPNG_EXPORT(145, png_uint_32, png_get_oFFs, (png_const_structrp png_ptr,\n   png_const_inforp info_ptr, png_int_32 *offset_x, png_int_32 *offset_y,\n   int *unit_type));\n#endif\n\n#ifdef PNG_oFFs_SUPPORTED\nPNG_EXPORT(146, void, png_set_oFFs, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_int_32 offset_x, png_int_32 offset_y,\n    int unit_type));\n#endif\n\n#ifdef PNG_pCAL_SUPPORTED\nPNG_EXPORT(147, png_uint_32, png_get_pCAL, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_charp *purpose, png_int_32 *X0,\n    png_int_32 *X1, int *type, int *nparams, png_charp *units,\n    png_charpp *params));\n#endif\n\n#ifdef PNG_pCAL_SUPPORTED\nPNG_EXPORT(148, void, png_set_pCAL, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_charp purpose, png_int_32 X0, png_int_32 X1,\n    int type, int nparams, png_const_charp units, png_charpp params));\n#endif\n\n#ifdef PNG_pHYs_SUPPORTED\nPNG_EXPORT(149, png_uint_32, png_get_pHYs, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y,\n    int *unit_type));\n#endif\n\n#ifdef PNG_pHYs_SUPPORTED\nPNG_EXPORT(150, void, png_set_pHYs, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type));\n#endif\n\nPNG_EXPORT(151, png_uint_32, png_get_PLTE, (png_const_structrp png_ptr,\n   png_inforp info_ptr, png_colorp *palette, int *num_palette));\n\nPNG_EXPORT(152, void, png_set_PLTE, (png_structrp png_ptr,\n    png_inforp info_ptr, png_const_colorp palette, int num_palette));\n\n#ifdef PNG_sBIT_SUPPORTED\nPNG_EXPORT(153, png_uint_32, png_get_sBIT, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_color_8p *sig_bit));\n#endif\n\n#ifdef PNG_sBIT_SUPPORTED\nPNG_EXPORT(154, void, png_set_sBIT, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_color_8p sig_bit));\n#endif\n\n#ifdef PNG_sRGB_SUPPORTED\nPNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr, int *file_srgb_intent));\n#endif\n\n#ifdef PNG_sRGB_SUPPORTED\nPNG_EXPORT(156, void, png_set_sRGB, (png_const_structrp png_ptr,\n    png_inforp info_ptr, int srgb_intent));\nPNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_const_structrp png_ptr,\n    png_inforp info_ptr, int srgb_intent));\n#endif\n\n#ifdef PNG_iCCP_SUPPORTED\nPNG_EXPORT(158, png_uint_32, png_get_iCCP, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_charpp name, int *compression_type,\n    png_bytepp profile, png_uint_32 *proflen));\n#endif\n\n#ifdef PNG_iCCP_SUPPORTED\nPNG_EXPORT(159, void, png_set_iCCP, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_charp name, int compression_type,\n    png_const_bytep profile, png_uint_32 proflen));\n#endif\n\n#ifdef PNG_sPLT_SUPPORTED\nPNG_EXPORT(160, int, png_get_sPLT, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_sPLT_tpp entries));\n#endif\n\n#ifdef PNG_sPLT_SUPPORTED\nPNG_EXPORT(161, void, png_set_sPLT, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_sPLT_tp entries, int nentries));\n#endif\n\n#ifdef PNG_TEXT_SUPPORTED\n/* png_get_text also returns the number of text chunks in *num_text */\nPNG_EXPORT(162, int, png_get_text, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_textp *text_ptr, int *num_text));\n#endif\n\n/* Note while png_set_text() will accept a structure whose text,\n * language, and  translated keywords are NULL pointers, the structure\n * returned by png_get_text will always contain regular\n * zero-terminated C strings.  They might be empty strings but\n * they will never be NULL pointers.\n */\n\n#ifdef PNG_TEXT_SUPPORTED\nPNG_EXPORT(163, void, png_set_text, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_textp text_ptr, int num_text));\n#endif\n\n#ifdef PNG_tIME_SUPPORTED\nPNG_EXPORT(164, png_uint_32, png_get_tIME, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_timep *mod_time));\n#endif\n\n#ifdef PNG_tIME_SUPPORTED\nPNG_EXPORT(165, void, png_set_tIME, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_timep mod_time));\n#endif\n\n#ifdef PNG_tRNS_SUPPORTED\nPNG_EXPORT(166, png_uint_32, png_get_tRNS, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_bytep *trans_alpha, int *num_trans,\n    png_color_16p *trans_color));\n#endif\n\n#ifdef PNG_tRNS_SUPPORTED\nPNG_EXPORT(167, void, png_set_tRNS, (png_structrp png_ptr,\n    png_inforp info_ptr, png_const_bytep trans_alpha, int num_trans,\n    png_const_color_16p trans_color));\n#endif\n\n#ifdef PNG_sCAL_SUPPORTED\nPNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr, int *unit, double *width, double *height))\n#if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \\\n   defined(PNG_FLOATING_POINT_SUPPORTED)\n/* NOTE: this API is currently implemented using floating point arithmetic,\n * consequently it can only be used on systems with floating point support.\n * In any case the range of values supported by png_fixed_point is small and it\n * is highly recommended that png_get_sCAL_s be used instead.\n */\nPNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit,\n    png_fixed_point *width, png_fixed_point *height))\n#endif\nPNG_EXPORT(169, png_uint_32, png_get_sCAL_s,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit,\n    png_charpp swidth, png_charpp sheight));\n\nPNG_FP_EXPORT(170, void, png_set_sCAL, (png_const_structrp png_ptr,\n    png_inforp info_ptr, int unit, double width, double height))\nPNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_const_structrp png_ptr,\n   png_inforp info_ptr, int unit, png_fixed_point width,\n   png_fixed_point height))\nPNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr,\n    png_inforp info_ptr, int unit,\n    png_const_charp swidth, png_const_charp sheight));\n#endif /* sCAL */\n\n#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n/* Provide the default handling for all unknown chunks or, optionally, for\n * specific unknown chunks.\n *\n * NOTE: prior to 1.6.0 the handling specified for particular chunks on read was\n * ignored and the default was used, the per-chunk setting only had an effect on\n * write.  If you wish to have chunk-specific handling on read in code that must\n * work on earlier versions you must use a user chunk callback to specify the\n * desired handling (keep or discard.)\n *\n * The 'keep' parameter is a PNG_HANDLE_CHUNK_ value as listed below.  The\n * parameter is interpreted as follows:\n *\n * READ:\n *    PNG_HANDLE_CHUNK_AS_DEFAULT:\n *       Known chunks: do normal libpng processing, do not keep the chunk (but\n *          see the comments below about PNG_HANDLE_AS_UNKNOWN_SUPPORTED)\n *       Unknown chunks: for a specific chunk use the global default, when used\n *          as the default discard the chunk data.\n *    PNG_HANDLE_CHUNK_NEVER:\n *       Discard the chunk data.\n *    PNG_HANDLE_CHUNK_IF_SAFE:\n *       Keep the chunk data if the chunk is not critical else raise a chunk\n *       error.\n *    PNG_HANDLE_CHUNK_ALWAYS:\n *       Keep the chunk data.\n *\n * If the chunk data is saved it can be retrieved using png_get_unknown_chunks,\n * below.  Notice that specifying \"AS_DEFAULT\" as a global default is equivalent\n * to specifying \"NEVER\", however when \"AS_DEFAULT\" is used for specific chunks\n * it simply resets the behavior to the libpng default.\n *\n * INTERACTION WTIH USER CHUNK CALLBACKS:\n * The per-chunk handling is always used when there is a png_user_chunk_ptr\n * callback and the callback returns 0; the chunk is then always stored *unless*\n * it is critical and the per-chunk setting is other than ALWAYS.  Notice that\n * the global default is *not* used in this case.  (In effect the per-chunk\n * value is incremented to at least IF_SAFE.)\n *\n * IMPORTANT NOTE: this behavior will change in libpng 1.7 - the global and\n * per-chunk defaults will be honored.  If you want to preserve the current\n * behavior when your callback returns 0 you must set PNG_HANDLE_CHUNK_IF_SAFE\n * as the default - if you don't do this libpng 1.6 will issue a warning.\n *\n * If you want unhandled unknown chunks to be discarded in libpng 1.6 and\n * earlier simply return '1' (handled).\n *\n * PNG_HANDLE_AS_UNKNOWN_SUPPORTED:\n *    If this is *not* set known chunks will always be handled by libpng and\n *    will never be stored in the unknown chunk list.  Known chunks listed to\n *    png_set_keep_unknown_chunks will have no effect.  If it is set then known\n *    chunks listed with a keep other than AS_DEFAULT will *never* be processed\n *    by libpng, in addition critical chunks must either be processed by the\n *    callback or saved.\n *\n *    The IHDR and IEND chunks must not be listed.  Because this turns off the\n *    default handling for chunks that would otherwise be recognized the\n *    behavior of libpng transformations may well become incorrect!\n *\n * WRITE:\n *    When writing chunks the options only apply to the chunks specified by\n *    png_set_unknown_chunks (below), libpng will *always* write known chunks\n *    required by png_set_ calls and will always write the core critical chunks\n *    (as required for PLTE).\n *\n *    Each chunk in the png_set_unknown_chunks list is looked up in the\n *    png_set_keep_unknown_chunks list to find the keep setting, this is then\n *    interpreted as follows:\n *\n *    PNG_HANDLE_CHUNK_AS_DEFAULT:\n *       Write safe-to-copy chunks and write other chunks if the global\n *       default is set to _ALWAYS, otherwise don't write this chunk.\n *    PNG_HANDLE_CHUNK_NEVER:\n *       Do not write the chunk.\n *    PNG_HANDLE_CHUNK_IF_SAFE:\n *       Write the chunk if it is safe-to-copy, otherwise do not write it.\n *    PNG_HANDLE_CHUNK_ALWAYS:\n *       Write the chunk.\n *\n * Note that the default behavior is effectively the opposite of the read case -\n * in read unknown chunks are not stored by default, in write they are written\n * by default.  Also the behavior of PNG_HANDLE_CHUNK_IF_SAFE is very different\n * - on write the safe-to-copy bit is checked, on read the critical bit is\n * checked and on read if the chunk is critical an error will be raised.\n *\n * num_chunks:\n * ===========\n *    If num_chunks is positive, then the \"keep\" parameter specifies the manner\n *    for handling only those chunks appearing in the chunk_list array,\n *    otherwise the chunk list array is ignored.\n *\n *    If num_chunks is 0 the \"keep\" parameter specifies the default behavior for\n *    unknown chunks, as described above.\n *\n *    If num_chunks is negative, then the \"keep\" parameter specifies the manner\n *    for handling all unknown chunks plus all chunks recognized by libpng\n *    except for the IHDR, PLTE, tRNS, IDAT, and IEND chunks (which continue to\n *    be processed by libpng.\n */\nPNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr,\n    int keep, png_const_bytep chunk_list, int num_chunks));\n\n/* The \"keep\" PNG_HANDLE_CHUNK_ parameter for the specified chunk is returned;\n * the result is therefore true (non-zero) if special handling is required,\n * false for the default handling.\n */\nPNG_EXPORT(173, int, png_handle_as_unknown, (png_const_structrp png_ptr,\n    png_const_bytep chunk_name));\n#endif\n\n#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\nPNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_unknown_chunkp unknowns,\n    int num_unknowns));\n   /* NOTE: prior to 1.6.0 this routine set the 'location' field of the added\n    * unknowns to the location currently stored in the png_struct.  This is\n    * invariably the wrong value on write.  To fix this call the following API\n    * for each chunk in the list with the correct location.  If you know your\n    * code won't be compiled on earlier versions you can rely on\n    * png_set_unknown_chunks(write-ptr, png_get_unknown_chunks(read-ptr)) doing\n    * the correct thing.\n    */\n\nPNG_EXPORT(175, void, png_set_unknown_chunk_location,\n    (png_const_structrp png_ptr, png_inforp info_ptr, int chunk, int location));\n\nPNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structrp png_ptr,\n    png_inforp info_ptr, png_unknown_chunkpp entries));\n#endif\n\n/* Png_free_data() will turn off the \"valid\" flag for anything it frees.\n * If you need to turn it off for a chunk that your application has freed,\n * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK);\n */\nPNG_EXPORT(177, void, png_set_invalid, (png_const_structrp png_ptr,\n    png_inforp info_ptr, int mask));\n\n#ifdef PNG_INFO_IMAGE_SUPPORTED\n/* The \"params\" pointer is currently not used and is for future expansion. */\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\nPNG_EXPORT(178, void, png_read_png, (png_structrp png_ptr, png_inforp info_ptr,\n    int transforms, png_voidp params));\n#endif\n#ifdef PNG_WRITE_SUPPORTED\nPNG_EXPORT(179, void, png_write_png, (png_structrp png_ptr, png_inforp info_ptr,\n    int transforms, png_voidp params));\n#endif\n#endif\n\nPNG_EXPORT(180, png_const_charp, png_get_copyright,\n    (png_const_structrp png_ptr));\nPNG_EXPORT(181, png_const_charp, png_get_header_ver,\n    (png_const_structrp png_ptr));\nPNG_EXPORT(182, png_const_charp, png_get_header_version,\n    (png_const_structrp png_ptr));\nPNG_EXPORT(183, png_const_charp, png_get_libpng_ver,\n    (png_const_structrp png_ptr));\n\n#ifdef PNG_MNG_FEATURES_SUPPORTED\nPNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structrp png_ptr,\n    png_uint_32 mng_features_permitted));\n#endif\n\n/* For use in png_set_keep_unknown, added to version 1.2.6 */\n#define PNG_HANDLE_CHUNK_AS_DEFAULT   0\n#define PNG_HANDLE_CHUNK_NEVER        1\n#define PNG_HANDLE_CHUNK_IF_SAFE      2\n#define PNG_HANDLE_CHUNK_ALWAYS       3\n#define PNG_HANDLE_CHUNK_LAST         4\n\n/* Strip the prepended error numbers (\"#nnn \") from error and warning\n * messages before passing them to the error or warning handler.\n */\n#ifdef PNG_ERROR_NUMBERS_SUPPORTED\nPNG_EXPORT(185, void, png_set_strip_error_numbers, (png_structrp png_ptr,\n    png_uint_32 strip_mode));\n#endif\n\n/* Added in libpng-1.2.6 */\n#ifdef PNG_SET_USER_LIMITS_SUPPORTED\nPNG_EXPORT(186, void, png_set_user_limits, (png_structrp png_ptr,\n    png_uint_32 user_width_max, png_uint_32 user_height_max));\nPNG_EXPORT(187, png_uint_32, png_get_user_width_max,\n    (png_const_structrp png_ptr));\nPNG_EXPORT(188, png_uint_32, png_get_user_height_max,\n    (png_const_structrp png_ptr));\n/* Added in libpng-1.4.0 */\nPNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structrp png_ptr,\n    png_uint_32 user_chunk_cache_max));\nPNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max,\n    (png_const_structrp png_ptr));\n/* Added in libpng-1.4.1 */\nPNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structrp png_ptr,\n    png_alloc_size_t user_chunk_cache_max));\nPNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max,\n    (png_const_structrp png_ptr));\n#endif\n\n#if defined(PNG_INCH_CONVERSIONS_SUPPORTED)\nPNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\n\nPNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\n\nPNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr));\n\nPNG_FP_EXPORT(196, float, png_get_x_offset_inches,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr))\n#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */\nPNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr))\n#endif\n\nPNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr))\n#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */\nPNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed,\n    (png_const_structrp png_ptr, png_const_inforp info_ptr))\n#endif\n\n#  ifdef PNG_pHYs_SUPPORTED\nPNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structrp png_ptr,\n    png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y,\n    int *unit_type));\n#  endif /* pHYs */\n#endif  /* INCH_CONVERSIONS */\n\n/* Added in libpng-1.4.0 */\n#ifdef PNG_IO_STATE_SUPPORTED\nPNG_EXPORT(199, png_uint_32, png_get_io_state, (png_const_structrp png_ptr));\n\n/* Removed from libpng 1.6; use png_get_io_chunk_type. */\nPNG_REMOVED(200, png_const_bytep, png_get_io_chunk_name, (png_structrp png_ptr),\n    PNG_DEPRECATED)\n\nPNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,\n    (png_const_structrp png_ptr));\n\n/* The flags returned by png_get_io_state() are the following: */\n#  define PNG_IO_NONE        0x0000   /* no I/O at this moment */\n#  define PNG_IO_READING     0x0001   /* currently reading */\n#  define PNG_IO_WRITING     0x0002   /* currently writing */\n#  define PNG_IO_SIGNATURE   0x0010   /* currently at the file signature */\n#  define PNG_IO_CHUNK_HDR   0x0020   /* currently at the chunk header */\n#  define PNG_IO_CHUNK_DATA  0x0040   /* currently at the chunk data */\n#  define PNG_IO_CHUNK_CRC   0x0080   /* currently at the chunk crc */\n#  define PNG_IO_MASK_OP     0x000f   /* current operation: reading/writing */\n#  define PNG_IO_MASK_LOC    0x00f0   /* current location: sig/hdr/data/crc */\n#endif /* IO_STATE */\n\n/* Interlace support.  The following macros are always defined so that if\n * libpng interlace handling is turned off the macros may be used to handle\n * interlaced images within the application.\n */\n#define PNG_INTERLACE_ADAM7_PASSES 7\n\n/* Two macros to return the first row and first column of the original,\n * full, image which appears in a given pass.  'pass' is in the range 0\n * to 6 and the result is in the range 0 to 7.\n */\n#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7)\n#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7)\n\n/* A macro to return the offset between pixels in the output row for a pair of\n * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that\n * follows.  Note that ROW_OFFSET is the offset from one row to the next whereas\n * COL_OFFSET is from one column to the next, within a row.\n */\n#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8)\n#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1))\n\n/* Two macros to help evaluate the number of rows or columns in each\n * pass.  This is expressed as a shift - effectively log2 of the number or\n * rows or columns in each 8x8 tile of the original image.\n */\n#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3)\n#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3)\n\n/* Hence two macros to determine the number of rows or columns in a given\n * pass of an image given its height or width.  In fact these macros may\n * return non-zero even though the sub-image is empty, because the other\n * dimension may be empty for a small image.\n */\n#define PNG_PASS_ROWS(height, pass) (((height)+(((1<<PNG_PASS_ROW_SHIFT(pass))\\\n   -1)-PNG_PASS_START_ROW(pass)))>>PNG_PASS_ROW_SHIFT(pass))\n#define PNG_PASS_COLS(width, pass) (((width)+(((1<<PNG_PASS_COL_SHIFT(pass))\\\n   -1)-PNG_PASS_START_COL(pass)))>>PNG_PASS_COL_SHIFT(pass))\n\n/* For the reader row callbacks (both progressive and sequential) it is\n * necessary to find the row in the output image given a row in an interlaced\n * image, so two more macros:\n */\n#define PNG_ROW_FROM_PASS_ROW(y_in, pass) \\\n   (((y_in)<<PNG_PASS_ROW_SHIFT(pass))+PNG_PASS_START_ROW(pass))\n#define PNG_COL_FROM_PASS_COL(x_in, pass) \\\n   (((x_in)<<PNG_PASS_COL_SHIFT(pass))+PNG_PASS_START_COL(pass))\n\n/* Two macros which return a boolean (0 or 1) saying whether the given row\n * or column is in a particular pass.  These use a common utility macro that\n * returns a mask for a given pass - the offset 'off' selects the row or\n * column version.  The mask has the appropriate bit set for each column in\n * the tile.\n */\n#define PNG_PASS_MASK(pass,off) ( \\\n   ((0x110145AF>>(((7-(off))-(pass))<<2)) & 0xF) | \\\n   ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0))\n\n#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \\\n   ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1)\n#define PNG_COL_IN_INTERLACE_PASS(x, pass) \\\n   ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1)\n\n#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED\n/* With these routines we avoid an integer divide, which will be slower on\n * most machines.  However, it does take more operations than the corresponding\n * divide method, so it may be slower on a few RISC systems.  There are two\n * shifts (by 8 or 16 bits) and an addition, versus a single integer divide.\n *\n * Note that the rounding factors are NOT supposed to be the same!  128 and\n * 32768 are correct for the NODIV code; 127 and 32767 are correct for the\n * standard method.\n *\n * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ]\n */\n\n /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */\n\n#  define png_composite(composite, fg, alpha, bg)         \\\n     { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \\\n           * (png_uint_16)(alpha)                         \\\n           + (png_uint_16)(bg)*(png_uint_16)(255          \\\n           - (png_uint_16)(alpha)) + 128);                \\\n       (composite) = (png_byte)(((temp + (temp >> 8)) >> 8) & 0xff); }\n\n#  define png_composite_16(composite, fg, alpha, bg)       \\\n     { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg)  \\\n           * (png_uint_32)(alpha)                          \\\n           + (png_uint_32)(bg)*(65535                      \\\n           - (png_uint_32)(alpha)) + 32768);               \\\n       (composite) = (png_uint_16)(0xffff & ((temp + (temp >> 16)) >> 16)); }\n\n#else  /* Standard method using integer division */\n\n#  define png_composite(composite, fg, alpha, bg)                        \\\n     (composite) =                                                       \\\n         (png_byte)(0xff & (((png_uint_16)(fg) * (png_uint_16)(alpha) +  \\\n         (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \\\n         127) / 255))\n\n#  define png_composite_16(composite, fg, alpha, bg)                         \\\n     (composite) =                                                           \\\n         (png_uint_16)(0xffff & (((png_uint_32)(fg) * (png_uint_32)(alpha) + \\\n         (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) +     \\\n         32767) / 65535))\n#endif /* READ_COMPOSITE_NODIV */\n\n#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED\nPNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf));\nPNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf));\nPNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf));\n#endif\n\nPNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_const_structrp png_ptr,\n    png_const_bytep buf));\n/* No png_get_int_16 -- may be added if there's a real need for it. */\n\n/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */\n#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED\nPNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i));\n#endif\n#ifdef PNG_SAVE_INT_32_SUPPORTED\nPNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i));\n#endif\n\n/* Place a 16-bit number into a buffer in PNG byte order.\n * The parameter is declared unsigned int, not png_uint_16,\n * just to avoid potential problems on pre-ANSI C compilers.\n */\n#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED\nPNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));\n/* No png_save_int_16 -- may be added if there's a real need for it. */\n#endif\n\n#ifdef PNG_USE_READ_MACROS\n/* Inline macros to do direct reads of bytes from the input buffer.\n * The png_get_int_32() routine assumes we are using two's complement\n * format for negative values, which is almost certainly true.\n */\n#  define PNG_get_uint_32(buf) \\\n     (((png_uint_32)(*(buf)) << 24) + \\\n      ((png_uint_32)(*((buf) + 1)) << 16) + \\\n      ((png_uint_32)(*((buf) + 2)) << 8) + \\\n      ((png_uint_32)(*((buf) + 3))))\n\n   /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the\n    * function) incorrectly returned a value of type png_uint_32.\n    */\n#  define PNG_get_uint_16(buf) \\\n     ((png_uint_16) \\\n      (((unsigned int)(*(buf)) << 8) + \\\n       ((unsigned int)(*((buf) + 1)))))\n\n#  define PNG_get_int_32(buf) \\\n     ((png_int_32)((*(buf) & 0x80) \\\n      ? -((png_int_32)(((png_get_uint_32(buf)^0xffffffffU)+1U)&0x7fffffffU)) \\\n      : (png_int_32)png_get_uint_32(buf)))\n\n   /* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h,\n    * but defining a macro name prefixed with PNG_PREFIX.\n    */\n#  ifndef PNG_PREFIX\n#     define png_get_uint_32(buf) PNG_get_uint_32(buf)\n#     define png_get_uint_16(buf) PNG_get_uint_16(buf)\n#     define png_get_int_32(buf)  PNG_get_int_32(buf)\n#  endif\n#else\n#  ifdef PNG_PREFIX\n      /* No macros; revert to the (redefined) function */\n#     define PNG_get_uint_32 (png_get_uint_32)\n#     define PNG_get_uint_16 (png_get_uint_16)\n#     define PNG_get_int_32  (png_get_int_32)\n#  endif\n#endif\n\n#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED\nPNG_EXPORT(242, void, png_set_check_for_invalid_index,\n    (png_structrp png_ptr, int allowed));\n#  ifdef PNG_GET_PALETTE_MAX_SUPPORTED\nPNG_EXPORT(243, int, png_get_palette_max, (png_const_structp png_ptr,\n    png_const_infop info_ptr));\n#  endif\n#endif /* CHECK_FOR_INVALID_INDEX */\n\n/*******************************************************************************\n * Section 5: SIMPLIFIED API\n *******************************************************************************\n *\n * Please read the documentation in libpng-manual.txt (TODO: write said\n * documentation) if you don't understand what follows.\n *\n * The simplified API hides the details of both libpng and the PNG file format\n * itself.  It allows PNG files to be read into a very limited number of\n * in-memory bitmap formats or to be written from the same formats.  If these\n * formats do not accomodate your needs then you can, and should, use the more\n * sophisticated APIs above - these support a wide variety of in-memory formats\n * and a wide variety of sophisticated transformations to those formats as well\n * as a wide variety of APIs to manipulate ancillary information.\n *\n * To read a PNG file using the simplified API:\n *\n * 1) Declare a 'png_image' structure (see below) on the stack, set the\n *    version field to PNG_IMAGE_VERSION and the 'opaque' pointer to NULL\n *    (this is REQUIRED, your program may crash if you don't do it.)\n * 2) Call the appropriate png_image_begin_read... function.\n * 3) Set the png_image 'format' member to the required sample format.\n * 4) Allocate a buffer for the image and, if required, the color-map.\n * 5) Call png_image_finish_read to read the image and, if required, the\n *    color-map into your buffers.\n *\n * There are no restrictions on the format of the PNG input itself; all valid\n * color types, bit depths, and interlace methods are acceptable, and the\n * input image is transformed as necessary to the requested in-memory format\n * during the png_image_finish_read() step.  The only caveat is that if you\n * request a color-mapped image from a PNG that is full-color or makes\n * complex use of an alpha channel the transformation is extremely lossy and the\n * result may look terrible.\n *\n * To write a PNG file using the simplified API:\n *\n * 1) Declare a 'png_image' structure on the stack and memset() it to all zero.\n * 2) Initialize the members of the structure that describe the image, setting\n *    the 'format' member to the format of the image samples.\n * 3) Call the appropriate png_image_write... function with a pointer to the\n *    image and, if necessary, the color-map to write the PNG data.\n *\n * png_image is a structure that describes the in-memory format of an image\n * when it is being read or defines the in-memory format of an image that you\n * need to write:\n */\n#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) || \\\n    defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)\n\n#define PNG_IMAGE_VERSION 1\n\ntypedef struct png_control *png_controlp;\ntypedef struct\n{\n   png_controlp opaque;    /* Initialize to NULL, free with png_image_free */\n   png_uint_32  version;   /* Set to PNG_IMAGE_VERSION */\n   png_uint_32  width;     /* Image width in pixels (columns) */\n   png_uint_32  height;    /* Image height in pixels (rows) */\n   png_uint_32  format;    /* Image format as defined below */\n   png_uint_32  flags;     /* A bit mask containing informational flags */\n   png_uint_32  colormap_entries;\n                           /* Number of entries in the color-map */\n\n   /* In the event of an error or warning the following field will be set to a\n    * non-zero value and the 'message' field will contain a '\\0' terminated\n    * string with the libpng error or warning message.  If both warnings and\n    * an error were encountered, only the error is recorded.  If there\n    * are multiple warnings, only the first one is recorded.\n    *\n    * The upper 30 bits of this value are reserved, the low two bits contain\n    * a value as follows:\n    */\n#  define PNG_IMAGE_WARNING 1\n#  define PNG_IMAGE_ERROR 2\n   /*\n    * The result is a two-bit code such that a value more than 1 indicates\n    * a failure in the API just called:\n    *\n    *    0 - no warning or error\n    *    1 - warning\n    *    2 - error\n    *    3 - error preceded by warning\n    */\n#  define PNG_IMAGE_FAILED(png_cntrl) ((((png_cntrl).warning_or_error)&0x03)>1)\n\n   png_uint_32  warning_or_error;\n\n   char         message[64];\n} png_image, *png_imagep;\n\n/* The samples of the image have one to four channels whose components have\n * original values in the range 0 to 1.0:\n *\n * 1: A single gray or luminance channel (G).\n * 2: A gray/luminance channel and an alpha channel (GA).\n * 3: Three red, green, blue color channels (RGB).\n * 4: Three color channels and an alpha channel (RGBA).\n *\n * The components are encoded in one of two ways:\n *\n * a) As a small integer, value 0..255, contained in a single byte.  For the\n * alpha channel the original value is simply value/255.  For the color or\n * luminance channels the value is encoded according to the sRGB specification\n * and matches the 8-bit format expected by typical display devices.\n *\n * The color/gray channels are not scaled (pre-multiplied) by the alpha\n * channel and are suitable for passing to color management software.\n *\n * b) As a value in the range 0..65535, contained in a 2-byte integer.  All\n * channels can be converted to the original value by dividing by 65535; all\n * channels are linear.  Color channels use the RGB encoding (RGB end-points) of\n * the sRGB specification.  This encoding is identified by the\n * PNG_FORMAT_FLAG_LINEAR flag below.\n *\n * When the simplified API needs to convert between sRGB and linear colorspaces,\n * the actual sRGB transfer curve defined in the sRGB specification (see the\n * article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2\n * approximation used elsewhere in libpng.\n *\n * When an alpha channel is present it is expected to denote pixel coverage\n * of the color or luminance channels and is returned as an associated alpha\n * channel: the color/gray channels are scaled (pre-multiplied) by the alpha\n * value.\n *\n * The samples are either contained directly in the image data, between 1 and 8\n * bytes per pixel according to the encoding, or are held in a color-map indexed\n * by bytes in the image data.  In the case of a color-map the color-map entries\n * are individual samples, encoded as above, and the image data has one byte per\n * pixel to select the relevant sample from the color-map.\n */\n\n/* PNG_FORMAT_*\n *\n * #defines to be used in png_image::format.  Each #define identifies a\n * particular layout of sample data and, if present, alpha values.  There are\n * separate defines for each of the two component encodings.\n *\n * A format is built up using single bit flag values.  All combinations are\n * valid.  Formats can be built up from the flag values or you can use one of\n * the predefined values below.  When testing formats always use the FORMAT_FLAG\n * macros to test for individual features - future versions of the library may\n * add new flags.\n *\n * When reading or writing color-mapped images the format should be set to the\n * format of the entries in the color-map then png_image_{read,write}_colormap\n * called to read or write the color-map and set the format correctly for the\n * image data.  Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly!\n *\n * NOTE: libpng can be built with particular features disabled. If you see\n * compiler errors because the definition of one of the following flags has been\n * compiled out it is because libpng does not have the required support.  It is\n * possible, however, for the libpng configuration to enable the format on just\n * read or just write; in that case you may see an error at run time.  You can\n * guard against this by checking for the definition of the appropriate\n * \"_SUPPORTED\" macro, one of:\n *\n *    PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED\n */\n#define PNG_FORMAT_FLAG_ALPHA    0x01U /* format with an alpha channel */\n#define PNG_FORMAT_FLAG_COLOR    0x02U /* color format: otherwise grayscale */\n#define PNG_FORMAT_FLAG_LINEAR   0x04U /* 2-byte channels else 1-byte */\n#define PNG_FORMAT_FLAG_COLORMAP 0x08U /* image data is color-mapped */\n\n#ifdef PNG_FORMAT_BGR_SUPPORTED\n#  define PNG_FORMAT_FLAG_BGR    0x10U /* BGR colors, else order is RGB */\n#endif\n\n#ifdef PNG_FORMAT_AFIRST_SUPPORTED\n#  define PNG_FORMAT_FLAG_AFIRST 0x20U /* alpha channel comes first */\n#endif\n\n/* Commonly used formats have predefined macros.\n *\n * First the single byte (sRGB) formats:\n */\n#define PNG_FORMAT_GRAY 0\n#define PNG_FORMAT_GA   PNG_FORMAT_FLAG_ALPHA\n#define PNG_FORMAT_AG   (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST)\n#define PNG_FORMAT_RGB  PNG_FORMAT_FLAG_COLOR\n#define PNG_FORMAT_BGR  (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR)\n#define PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA)\n#define PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST)\n#define PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA)\n#define PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST)\n\n/* Then the linear 2-byte formats.  When naming these \"Y\" is used to\n * indicate a luminance (gray) channel.\n */\n#define PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR\n#define PNG_FORMAT_LINEAR_Y_ALPHA (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA)\n#define PNG_FORMAT_LINEAR_RGB (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR)\n#define PNG_FORMAT_LINEAR_RGB_ALPHA \\\n   (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA)\n\n/* With color-mapped formats the image data is one byte for each pixel, the byte\n * is an index into the color-map which is formatted as above.  To obtain a\n * color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP\n * to one of the above definitions, or you can use one of the definitions below.\n */\n#define PNG_FORMAT_RGB_COLORMAP  (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_COLORMAP)\n#define PNG_FORMAT_BGR_COLORMAP  (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_COLORMAP)\n#define PNG_FORMAT_RGBA_COLORMAP (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_COLORMAP)\n#define PNG_FORMAT_ARGB_COLORMAP (PNG_FORMAT_ARGB|PNG_FORMAT_FLAG_COLORMAP)\n#define PNG_FORMAT_BGRA_COLORMAP (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_COLORMAP)\n#define PNG_FORMAT_ABGR_COLORMAP (PNG_FORMAT_ABGR|PNG_FORMAT_FLAG_COLORMAP)\n\n/* PNG_IMAGE macros\n *\n * These are convenience macros to derive information from a png_image\n * structure.  The PNG_IMAGE_SAMPLE_ macros return values appropriate to the\n * actual image sample values - either the entries in the color-map or the\n * pixels in the image.  The PNG_IMAGE_PIXEL_ macros return corresponding values\n * for the pixels and will always return 1 for color-mapped formats.  The\n * remaining macros return information about the rows in the image and the\n * complete image.\n *\n * NOTE: All the macros that take a png_image::format parameter are compile time\n * constants if the format parameter is, itself, a constant.  Therefore these\n * macros can be used in array declarations and case labels where required.\n * Similarly the macros are also pre-processor constants (sizeof is not used) so\n * they can be used in #if tests.\n *\n * First the information about the samples.\n */\n#define PNG_IMAGE_SAMPLE_CHANNELS(fmt)\\\n   (((fmt)&(PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA))+1)\n   /* Return the total number of channels in a given format: 1..4 */\n\n#define PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)\\\n   ((((fmt) & PNG_FORMAT_FLAG_LINEAR) >> 2)+1)\n   /* Return the size in bytes of a single component of a pixel or color-map\n    * entry (as appropriate) in the image: 1 or 2.\n    */\n\n#define PNG_IMAGE_SAMPLE_SIZE(fmt)\\\n   (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt))\n   /* This is the size of the sample data for one sample.  If the image is\n    * color-mapped it is the size of one color-map entry (and image pixels are\n    * one byte in size), otherwise it is the size of one image pixel.\n    */\n\n#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\\\n   (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256)\n   /* The maximum size of the color-map required by the format expressed in a\n    * count of components.  This can be used to compile-time allocate a\n    * color-map:\n    *\n    * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];\n    *\n    * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];\n    *\n    * Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the\n    * information from one of the png_image_begin_read_ APIs and dynamically\n    * allocate the required memory.\n    */\n\n/* Corresponding information about the pixels */\n#define PNG_IMAGE_PIXEL_(test,fmt)\\\n   (((fmt)&PNG_FORMAT_FLAG_COLORMAP)?1:test(fmt))\n\n#define PNG_IMAGE_PIXEL_CHANNELS(fmt)\\\n   PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_CHANNELS,fmt)\n   /* The number of separate channels (components) in a pixel; 1 for a\n    * color-mapped image.\n    */\n\n#define PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\\\n   PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_COMPONENT_SIZE,fmt)\n   /* The size, in bytes, of each component in a pixel; 1 for a color-mapped\n    * image.\n    */\n\n#define PNG_IMAGE_PIXEL_SIZE(fmt) PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_SIZE,fmt)\n   /* The size, in bytes, of a complete pixel; 1 for a color-mapped image. */\n\n/* Information about the whole row, or whole image */\n#define PNG_IMAGE_ROW_STRIDE(image)\\\n   (PNG_IMAGE_PIXEL_CHANNELS((image).format) * (image).width)\n   /* Return the total number of components in a single row of the image; this\n    * is the minimum 'row stride', the minimum count of components between each\n    * row.  For a color-mapped image this is the minimum number of bytes in a\n    * row.\n    *\n    * WARNING: this macro overflows for some images with more than one component\n    * and very large image widths.  libpng will refuse to process an image where\n    * this macro would overflow.\n    */\n\n#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\\\n   (PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride))\n   /* Return the size, in bytes, of an image buffer given a png_image and a row\n    * stride - the number of components to leave space for in each row.\n    *\n    * WARNING: this macro overflows a 32-bit integer for some large PNG images,\n    * libpng will refuse to process an image where such an overflow would occur.\n    */\n\n#define PNG_IMAGE_SIZE(image)\\\n   PNG_IMAGE_BUFFER_SIZE(image, PNG_IMAGE_ROW_STRIDE(image))\n   /* Return the size, in bytes, of the image in memory given just a png_image;\n    * the row stride is the minimum stride required for the image.\n    */\n\n#define PNG_IMAGE_COLORMAP_SIZE(image)\\\n   (PNG_IMAGE_SAMPLE_SIZE((image).format) * (image).colormap_entries)\n   /* Return the size, in bytes, of the color-map of this image.  If the image\n    * format is not a color-map format this will return a size sufficient for\n    * 256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if\n    * you don't want to allocate a color-map in this case.\n    */\n\n/* PNG_IMAGE_FLAG_*\n *\n * Flags containing additional information about the image are held in the\n * 'flags' field of png_image.\n */\n#define PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB 0x01\n   /* This indicates the the RGB values of the in-memory bitmap do not\n    * correspond to the red, green and blue end-points defined by sRGB.\n    */\n\n#define PNG_IMAGE_FLAG_FAST 0x02\n   /* On write emphasise speed over compression; the resultant PNG file will be\n    * larger but will be produced significantly faster, particular for large\n    * images.  Do not use this option for images which will be distributed, only\n    * used it when producing intermediate files that will be read back in\n    * repeatedly.  For a typical 24-bit image the option will double the read\n    * speed at the cost of increasing the image size by 25%, however for many\n    * more compressible images the PNG file can be 10 times larger with only a\n    * slight speed gain.\n    */\n\n#define PNG_IMAGE_FLAG_16BIT_sRGB 0x04\n   /* On read if the image is a 16-bit per component image and there is no gAMA\n    * or sRGB chunk assume that the components are sRGB encoded.  Notice that\n    * images output by the simplified API always have gamma information; setting\n    * this flag only affects the interpretation of 16-bit images from an\n    * external source.  It is recommended that the application expose this flag\n    * to the user; the user can normally easily recognize the difference between\n    * linear and sRGB encoding.  This flag has no effect on write - the data\n    * passed to the write APIs must have the correct encoding (as defined\n    * above.)\n    *\n    * If the flag is not set (the default) input 16-bit per component data is\n    * assumed to be linear.\n    *\n    * NOTE: the flag can only be set after the png_image_begin_read_ call,\n    * because that call initializes the 'flags' field.\n    */\n\n#ifdef PNG_SIMPLIFIED_READ_SUPPORTED\n/* READ APIs\n * ---------\n *\n * The png_image passed to the read APIs must have been initialized by setting\n * the png_controlp field 'opaque' to NULL (or, safer, memset the whole thing.)\n */\n#ifdef PNG_STDIO_SUPPORTED\nPNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image,\n   const char *file_name));\n   /* The named file is opened for read and the image header is filled in\n    * from the PNG header in the file.\n    */\n\nPNG_EXPORT(235, int, png_image_begin_read_from_stdio, (png_imagep image,\n   FILE* file));\n   /* The PNG header is read from the stdio FILE object. */\n#endif /* STDIO */\n\nPNG_EXPORT(236, int, png_image_begin_read_from_memory, (png_imagep image,\n   png_const_voidp memory, png_size_t size));\n   /* The PNG header is read from the given memory buffer. */\n\nPNG_EXPORT(237, int, png_image_finish_read, (png_imagep image,\n   png_const_colorp background, void *buffer, png_int_32 row_stride,\n   void *colormap));\n   /* Finish reading the image into the supplied buffer and clean up the\n    * png_image structure.\n    *\n    * row_stride is the step, in byte or 2-byte units as appropriate,\n    * between adjacent rows.  A positive stride indicates that the top-most row\n    * is first in the buffer - the normal top-down arrangement.  A negative\n    * stride indicates that the bottom-most row is first in the buffer.\n    *\n    * background need only be supplied if an alpha channel must be removed from\n    * a png_byte format and the removal is to be done by compositing on a solid\n    * color; otherwise it may be NULL and any composition will be done directly\n    * onto the buffer.  The value is an sRGB color to use for the background,\n    * for grayscale output the green channel is used.\n    *\n    * background must be supplied when an alpha channel must be removed from a\n    * single byte color-mapped output format, in other words if:\n    *\n    * 1) The original format from png_image_begin_read_from_* had\n    *    PNG_FORMAT_FLAG_ALPHA set.\n    * 2) The format set by the application does not.\n    * 3) The format set by the application has PNG_FORMAT_FLAG_COLORMAP set and\n    *    PNG_FORMAT_FLAG_LINEAR *not* set.\n    *\n    * For linear output removing the alpha channel is always done by compositing\n    * on black and background is ignored.\n    *\n    * colormap must be supplied when PNG_FORMAT_FLAG_COLORMAP is set.  It must\n    * be at least the size (in bytes) returned by PNG_IMAGE_COLORMAP_SIZE.\n    * image->colormap_entries will be updated to the actual number of entries\n    * written to the colormap; this may be less than the original value.\n    */\n\nPNG_EXPORT(238, void, png_image_free, (png_imagep image));\n   /* Free any data allocated by libpng in image->opaque, setting the pointer to\n    * NULL.  May be called at any time after the structure is initialized.\n    */\n#endif /* SIMPLIFIED_READ */\n\n#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED\n/* WRITE APIS\n * ----------\n * For write you must initialize a png_image structure to describe the image to\n * be written.  To do this use memset to set the whole structure to 0 then\n * initialize fields describing your image.\n *\n * version: must be set to PNG_IMAGE_VERSION\n * opaque: must be initialized to NULL\n * width: image width in pixels\n * height: image height in rows\n * format: the format of the data (image and color-map) you wish to write\n * flags: set to 0 unless one of the defined flags applies; set\n *    PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images where the RGB\n *    values do not correspond to the colors in sRGB.\n * colormap_entries: set to the number of entries in the color-map (0 to 256)\n */\n#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED\nPNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image,\n   const char *file, int convert_to_8bit, const void *buffer,\n   png_int_32 row_stride, const void *colormap));\n   /* Write the image to the named file. */\n\nPNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,\n   int convert_to_8_bit, const void *buffer, png_int_32 row_stride,\n   const void *colormap));\n   /* Write the image to the given (FILE*). */\n#endif /* SIMPLIFIED_WRITE_STDIO */\n\n/* With all write APIs if image is in one of the linear formats with 16-bit\n * data then setting convert_to_8_bit will cause the output to be an 8-bit PNG\n * gamma encoded according to the sRGB specification, otherwise a 16-bit linear\n * encoded PNG file is written.\n *\n * With color-mapped data formats the colormap parameter point to a color-map\n * with at least image->colormap_entries encoded in the specified format.  If\n * the format is linear the written PNG color-map will be converted to sRGB\n * regardless of the convert_to_8_bit flag.\n *\n * With all APIs row_stride is handled as in the read APIs - it is the spacing\n * from one row to the next in component sized units (1 or 2 bytes) and if\n * negative indicates a bottom-up row layout in the buffer.  If row_stride is\n * zero, libpng will calculate it for you from the image width and number of\n * channels.\n *\n * Note that the write API does not support interlacing, sub-8-bit pixels or\n * most ancillary chunks.  If you need to write text chunks (e.g. for copyright\n * notices) you need to use one of the other APIs.\n */\n\nPNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory,\n   png_alloc_size_t * PNG_RESTRICT memory_bytes, int convert_to_8_bit,\n   const void *buffer, png_int_32 row_stride, const void *colormap));\n   /* Write the image to the given memory buffer.  The function both writes the\n    * whole PNG data stream to *memory and updates *memory_bytes with the count\n    * of bytes written.\n    *\n    * 'memory' may be NULL.  In this case *memory_bytes is not read however on\n    * success the number of bytes which would have been written will still be\n    * stored in *memory_bytes.  On failure *memory_bytes will contain 0.\n    *\n    * If 'memory' is not NULL it must point to memory[*memory_bytes] of\n    * writeable memory.\n    *\n    * If the function returns success memory[*memory_bytes] (if 'memory' is not\n    * NULL) contains the written PNG data.  *memory_bytes will always be less\n    * than or equal to the original value.\n    *\n    * If the function returns false and *memory_bytes was not changed an error\n    * occured during write.  If *memory_bytes was changed, or is not 0 if\n    * 'memory' was NULL, the write would have succeeded but for the memory\n    * buffer being too small.  *memory_bytes contains the required number of\n    * bytes and will be bigger that the original value.\n    */\n\n#define png_image_write_get_memory_size(image, size, convert_to_8_bit, buffer,\\\n   row_stride, colormap)\\\n   png_image_write_to_memory(&(image), 0, &(size), convert_to_8_bit, buffer,\\\n         row_stride, colormap)\n   /* Return the amount of memory in 'size' required to compress this image.\n    * The png_image structure 'image' must be filled in as in the above\n    * function and must not be changed before the actual write call, the buffer\n    * and all other parameters must also be identical to that in the final\n    * write call.  The 'size' variable need not be initialized.\n    *\n    * NOTE: the macro returns true/false, if false is returned 'size' will be\n    * set to zero and the write failed and probably will fail if tried again.\n    */\n\n/* You can pre-allocate the buffer by making sure it is of sufficient size\n * regardless of the amount of compression achieved.  The buffer size will\n * always be bigger than the original image and it will never be filled.  The\n * following macros are provided to assist in allocating the buffer.\n */\n#define PNG_IMAGE_DATA_SIZE(image) (PNG_IMAGE_SIZE(image)+(image).height)\n   /* The number of uncompressed bytes in the PNG byte encoding of the image;\n    * uncompressing the PNG IDAT data will give this number of bytes.\n    *\n    * NOTE: while PNG_IMAGE_SIZE cannot overflow for an image in memory this\n    * macro can because of the extra bytes used in the PNG byte encoding.  You\n    * need to avoid this macro if your image size approaches 2^30 in width or\n    * height.  The same goes for the remainder of these macros; they all produce\n    * bigger numbers than the actual in-memory image size.\n    */\n#ifndef PNG_ZLIB_MAX_SIZE\n#  define PNG_ZLIB_MAX_SIZE(b) ((b)+(((b)+7U)>>3)+(((b)+63U)>>6)+11U)\n   /* An upper bound on the number of compressed bytes given 'b' uncompressed\n    * bytes.  This is based on deflateBounds() in zlib; different\n    * implementations of zlib compression may conceivably produce more data so\n    * if your zlib implementation is not zlib itself redefine this macro\n    * appropriately.\n    */\n#endif\n\n#define PNG_IMAGE_COMPRESSED_SIZE_MAX(image)\\\n   PNG_ZLIB_MAX_SIZE((png_alloc_size_t)PNG_IMAGE_DATA_SIZE(image))\n   /* An upper bound on the size of the data in the PNG IDAT chunks. */\n\n#define PNG_IMAGE_PNG_SIZE_MAX_(image, image_size)\\\n   ((8U/*sig*/+25U/*IHDR*/+16U/*gAMA*/+44U/*cHRM*/+12U/*IEND*/+\\\n    (((image).format&PNG_FORMAT_FLAG_COLORMAP)?/*colormap: PLTE, tRNS*/\\\n     12U+3U*(image).colormap_entries/*PLTE data*/+\\\n     (((image).format&PNG_FORMAT_FLAG_ALPHA)?\\\n      12U/*tRNS*/+(image).colormap_entries:0U):0U)+\\\n    12U)+(12U*((image_size)/PNG_ZBUF_SIZE))/*IDAT*/+(image_size))\n   /* A helper for the following macro; if your compiler cannot handle the\n    * following macro use this one with the result of\n    * PNG_IMAGE_COMPRESSED_SIZE_MAX(image) as the second argument (most\n    * compilers should handle this just fine.)\n    */\n\n#define PNG_IMAGE_PNG_SIZE_MAX(image)\\\n   PNG_IMAGE_PNG_SIZE_MAX_(image, PNG_IMAGE_COMPRESSED_SIZE_MAX(image))\n   /* An upper bound on the total length of the PNG data stream for 'image'.\n    * The result is of type png_alloc_size_t, on 32-bit systems this may\n    * overflow even though PNG_IMAGE_DATA_SIZE does not overflow; the write will\n    * run out of buffer space but return a corrected size which should work.\n    */\n#endif /* SIMPLIFIED_WRITE */\n/*******************************************************************************\n *  END OF SIMPLIFIED API\n ******************************************************************************/\n#endif /* SIMPLIFIED_{READ|WRITE} */\n\n/*******************************************************************************\n * Section 6: IMPLEMENTATION OPTIONS\n *******************************************************************************\n *\n * Support for arbitrary implementation-specific optimizations.  The API allows\n * particular options to be turned on or off.  'Option' is the number of the\n * option and 'onoff' is 0 (off) or non-0 (on).  The value returned is given\n * by the PNG_OPTION_ defines below.\n *\n * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions,\n *           are detected at run time, however sometimes it may be impossible\n *           to do this in user mode, in which case it is necessary to discover\n *           the capabilities in an OS specific way.  Such capabilities are\n *           listed here when libpng has support for them and must be turned\n *           ON by the application if present.\n *\n * SOFTWARE: sometimes software optimizations actually result in performance\n *           decrease on some architectures or systems, or with some sets of\n *           PNG images.  'Software' options allow such optimizations to be\n *           selected at run time.\n */\n#ifdef PNG_SET_OPTION_SUPPORTED\n#ifdef PNG_ARM_NEON_API_SUPPORTED\n#  define PNG_ARM_NEON   0 /* HARDWARE: ARM Neon SIMD instructions supported */\n#endif\n#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */\n#define PNG_SKIP_sRGB_CHECK_PROFILE 4 /* SOFTWARE: Check ICC profile for sRGB */\n#define PNG_OPTION_NEXT  6 /* Next option - numbers must be even */\n\n/* Return values: NOTE: there are four values and 'off' is *not* zero */\n#define PNG_OPTION_UNSET   0 /* Unset - defaults to off */\n#define PNG_OPTION_INVALID 1 /* Option number out of range */\n#define PNG_OPTION_OFF     2\n#define PNG_OPTION_ON      3\n\nPNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option,\n   int onoff));\n#endif /* SET_OPTION */\n\n/*******************************************************************************\n *  END OF HARDWARE AND SOFTWARE OPTIONS\n ******************************************************************************/\n\n/* Maintainer: Put new public prototypes here ^, in libpng.3, in project\n * defs, and in scripts/symbols.def.\n */\n\n/* The last ordinal number (this is the *last* one already used; the next\n * one to use is one more than this.)\n */\n#ifdef PNG_EXPORT_LAST_ORDINAL\n  PNG_EXPORT_LAST_ORDINAL(245);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* PNG_VERSION_INFO_ONLY */\n/* Do not put anything past this line */\n#endif /* PNG_H */\n"
  },
  {
    "path": "libs/SDL2_png/include/pngconf.h",
    "content": "\n/* pngconf.h - machine configurable file for libpng\n *\n * libpng version 1.6.23, June 9, 2016\n *\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * Any machine specific code is near the front of this file, so if you\n * are configuring libpng for a machine, you may want to read the section\n * starting here down to where it starts to typedef png_color, png_text,\n * and png_info.\n */\n\n#ifndef PNGCONF_H\n#define PNGCONF_H\n\n#ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */\n\n/* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 (\"ISOC90\") compliant C\n * compiler for correct compilation.  The following header files are required by\n * the standard.  If your compiler doesn't provide these header files, or they\n * do not match the standard, you will need to provide/improve them.\n */\n#include <limits.h>\n#include <stddef.h>\n\n/* Library header files.  These header files are all defined by ISOC90; libpng\n * expects conformant implementations, however, an ISOC90 conformant system need\n * not provide these header files if the functionality cannot be implemented.\n * In this case it will be necessary to disable the relevant parts of libpng in\n * the build of pnglibconf.h.\n *\n * Prior to 1.6.0 string.h was included here; the API changes in 1.6.0 to not\n * include this unnecessary header file.\n */\n\n#ifdef PNG_STDIO_SUPPORTED\n   /* Required for the definition of FILE: */\n#  include <stdio.h>\n#endif\n\n#ifdef PNG_SETJMP_SUPPORTED\n   /* Required for the definition of jmp_buf and the declaration of longjmp: */\n#  include <setjmp.h>\n#endif\n\n#ifdef PNG_CONVERT_tIME_SUPPORTED\n   /* Required for struct tm: */\n#  include <time.h>\n#endif\n\n#endif /* PNG_BUILDING_SYMBOL_TABLE */\n\n/* Prior to 1.6.0 it was possible to turn off 'const' in declarations using\n * PNG_NO_CONST; this is no longer supported except for data declarations which\n * apparently still cause problems in 2011 on some compilers.\n */\n#define PNG_CONST const /* backward compatibility only */\n\n/* This controls optimization of the reading of 16-bit and 32-bit values\n * from PNG files.  It can be set on a per-app-file basis - it\n * just changes whether a macro is used when the function is called.\n * The library builder sets the default; if read functions are not\n * built into the library the macro implementation is forced on.\n */\n#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED\n#  define PNG_USE_READ_MACROS\n#endif\n#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS)\n#  if PNG_DEFAULT_READ_MACROS\n#    define PNG_USE_READ_MACROS\n#  endif\n#endif\n\n/* COMPILER SPECIFIC OPTIONS.\n *\n * These options are provided so that a variety of difficult compilers\n * can be used.  Some are fixed at build time (e.g. PNG_API_RULE\n * below) but still have compiler specific implementations, others\n * may be changed on a per-file basis when compiling against libpng.\n */\n\n/* The PNGARG macro was used in versions of libpng prior to 1.6.0 to protect\n * against legacy (pre ISOC90) compilers that did not understand function\n * prototypes.  It is not required for modern C compilers.\n */\n#ifndef PNGARG\n#  define PNGARG(arglist) arglist\n#endif\n\n/* Function calling conventions.\n * =============================\n * Normally it is not necessary to specify to the compiler how to call\n * a function - it just does it - however on x86 systems derived from\n * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems\n * and some others) there are multiple ways to call a function and the\n * default can be changed on the compiler command line.  For this reason\n * libpng specifies the calling convention of every exported function and\n * every function called via a user supplied function pointer.  This is\n * done in this file by defining the following macros:\n *\n * PNGAPI    Calling convention for exported functions.\n * PNGCBAPI  Calling convention for user provided (callback) functions.\n * PNGCAPI   Calling convention used by the ANSI-C library (required\n *           for longjmp callbacks and sometimes used internally to\n *           specify the calling convention for zlib).\n *\n * These macros should never be overridden.  If it is necessary to\n * change calling convention in a private build this can be done\n * by setting PNG_API_RULE (which defaults to 0) to one of the values\n * below to select the correct 'API' variants.\n *\n * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout.\n *                This is correct in every known environment.\n * PNG_API_RULE=1 Use the operating system convention for PNGAPI and\n *                the 'C' calling convention (from PNGCAPI) for\n *                callbacks (PNGCBAPI).  This is no longer required\n *                in any known environment - if it has to be used\n *                please post an explanation of the problem to the\n *                libpng mailing list.\n *\n * These cases only differ if the operating system does not use the C\n * calling convention, at present this just means the above cases\n * (x86 DOS/Windows sytems) and, even then, this does not apply to\n * Cygwin running on those systems.\n *\n * Note that the value must be defined in pnglibconf.h so that what\n * the application uses to call the library matches the conventions\n * set when building the library.\n */\n\n/* Symbol export\n * =============\n * When building a shared library it is almost always necessary to tell\n * the compiler which symbols to export.  The png.h macro 'PNG_EXPORT'\n * is used to mark the symbols.  On some systems these symbols can be\n * extracted at link time and need no special processing by the compiler,\n * on other systems the symbols are flagged by the compiler and just\n * the declaration requires a special tag applied (unfortunately) in a\n * compiler dependent way.  Some systems can do either.\n *\n * A small number of older systems also require a symbol from a DLL to\n * be flagged to the program that calls it.  This is a problem because\n * we do not know in the header file included by application code that\n * the symbol will come from a shared library, as opposed to a statically\n * linked one.  For this reason the application must tell us by setting\n * the magic flag PNG_USE_DLL to turn on the special processing before\n * it includes png.h.\n *\n * Four additional macros are used to make this happen:\n *\n * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from\n *            the build or imported if PNG_USE_DLL is set - compiler\n *            and system specific.\n *\n * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to\n *                       'type', compiler specific.\n *\n * PNG_DLL_EXPORT Set to the magic to use during a libpng build to\n *                make a symbol exported from the DLL.  Not used in the\n *                public header files; see pngpriv.h for how it is used\n *                in the libpng build.\n *\n * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come\n *                from a DLL - used to define PNG_IMPEXP when\n *                PNG_USE_DLL is set.\n */\n\n/* System specific discovery.\n * ==========================\n * This code is used at build time to find PNG_IMPEXP, the API settings\n * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL\n * import processing is possible.  On Windows systems it also sets\n * compiler-specific macros to the values required to change the calling\n * conventions of the various functions.\n */\n#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\\\n    defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)\n  /* Windows system (DOS doesn't support DLLs).  Includes builds under Cygwin or\n   * MinGW on any architecture currently supported by Windows.  Also includes\n   * Watcom builds but these need special treatment because they are not\n   * compatible with GCC or Visual C because of different calling conventions.\n   */\n#  if PNG_API_RULE == 2\n    /* If this line results in an error, either because __watcall is not\n     * understood or because of a redefine just below you cannot use *this*\n     * build of the library with the compiler you are using.  *This* build was\n     * build using Watcom and applications must also be built using Watcom!\n     */\n#    define PNGCAPI __watcall\n#  endif\n\n#  if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800))\n#    define PNGCAPI __cdecl\n#    if PNG_API_RULE == 1\n       /* If this line results in an error __stdcall is not understood and\n        * PNG_API_RULE should not have been set to '1'.\n        */\n#      define PNGAPI __stdcall\n#    endif\n#  else\n    /* An older compiler, or one not detected (erroneously) above,\n     * if necessary override on the command line to get the correct\n     * variants for the compiler.\n     */\n#    ifndef PNGCAPI\n#      define PNGCAPI _cdecl\n#    endif\n#    if PNG_API_RULE == 1 && !defined(PNGAPI)\n#      define PNGAPI _stdcall\n#    endif\n#  endif /* compiler/api */\n\n  /* NOTE: PNGCBAPI always defaults to PNGCAPI. */\n\n#  if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD)\n#     error \"PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed\"\n#  endif\n\n#  if (defined(_MSC_VER) && _MSC_VER < 800) ||\\\n      (defined(__BORLANDC__) && __BORLANDC__ < 0x500)\n    /* older Borland and MSC\n     * compilers used '__export' and required this to be after\n     * the type.\n     */\n#    ifndef PNG_EXPORT_TYPE\n#      define PNG_EXPORT_TYPE(type) type PNG_IMPEXP\n#    endif\n#    define PNG_DLL_EXPORT __export\n#  else /* newer compiler */\n#    define PNG_DLL_EXPORT __declspec(dllexport)\n#    ifndef PNG_DLL_IMPORT\n#      define PNG_DLL_IMPORT __declspec(dllimport)\n#    endif\n#  endif /* compiler */\n\n#else /* !Windows */\n#  if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__)\n#    define PNGAPI _System\n#  else /* !Windows/x86 && !OS/2 */\n    /* Use the defaults, or define PNG*API on the command line (but\n     * this will have to be done for every compile!)\n     */\n#  endif /* other system, !OS/2 */\n#endif /* !Windows/x86 */\n\n/* Now do all the defaulting . */\n#ifndef PNGCAPI\n#  define PNGCAPI\n#endif\n#ifndef PNGCBAPI\n#  define PNGCBAPI PNGCAPI\n#endif\n#ifndef PNGAPI\n#  define PNGAPI PNGCAPI\n#endif\n\n/* PNG_IMPEXP may be set on the compilation system command line or (if not set)\n * then in an internal header file when building the library, otherwise (when\n * using the library) it is set here.\n */\n#ifndef PNG_IMPEXP\n#  if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT)\n     /* This forces use of a DLL, disallowing static linking */\n#    define PNG_IMPEXP PNG_DLL_IMPORT\n#  endif\n\n#  ifndef PNG_IMPEXP\n#    define PNG_IMPEXP\n#  endif\n#endif\n\n/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat\n * 'attributes' as a storage class - the attributes go at the start of the\n * function definition, and attributes are always appended regardless of the\n * compiler.  This considerably simplifies these macros but may cause problems\n * if any compilers both need function attributes and fail to handle them as\n * a storage class (this is unlikely.)\n */\n#ifndef PNG_FUNCTION\n#  define PNG_FUNCTION(type, name, args, attributes) attributes type name args\n#endif\n\n#ifndef PNG_EXPORT_TYPE\n#  define PNG_EXPORT_TYPE(type) PNG_IMPEXP type\n#endif\n\n   /* The ordinal value is only relevant when preprocessing png.h for symbol\n    * table entries, so we discard it here.  See the .dfn files in the\n    * scripts directory.\n    */\n\n#ifndef PNG_EXPORTA\n#  define PNG_EXPORTA(ordinal, type, name, args, attributes) \\\n      PNG_FUNCTION(PNG_EXPORT_TYPE(type), (PNGAPI name), PNGARG(args), \\\n      PNG_LINKAGE_API attributes)\n#endif\n\n/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument,\n * so make something non-empty to satisfy the requirement:\n */\n#define PNG_EMPTY /*empty list*/\n\n#define PNG_EXPORT(ordinal, type, name, args) \\\n   PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY)\n\n/* Use PNG_REMOVED to comment out a removed interface. */\n#ifndef PNG_REMOVED\n#  define PNG_REMOVED(ordinal, type, name, args, attributes)\n#endif\n\n#ifndef PNG_CALLBACK\n#  define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args)\n#endif\n\n/* Support for compiler specific function attributes.  These are used\n * so that where compiler support is available incorrect use of API\n * functions in png.h will generate compiler warnings.\n *\n * Added at libpng-1.2.41.\n */\n\n#ifndef PNG_NO_PEDANTIC_WARNINGS\n#  ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED\n#    define PNG_PEDANTIC_WARNINGS_SUPPORTED\n#  endif\n#endif\n\n#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED\n  /* Support for compiler specific function attributes.  These are used\n   * so that where compiler support is available, incorrect use of API\n   * functions in png.h will generate compiler warnings.  Added at libpng\n   * version 1.2.41.  Disabling these removes the warnings but may also produce\n   * less efficient code.\n   */\n#  if defined(__clang__) && defined(__has_attribute)\n     /* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */\n#    if !defined(PNG_USE_RESULT) && __has_attribute(__warn_unused_result__)\n#      define PNG_USE_RESULT __attribute__((__warn_unused_result__))\n#    endif\n#    if !defined(PNG_NORETURN) && __has_attribute(__noreturn__)\n#      define PNG_NORETURN __attribute__((__noreturn__))\n#    endif\n#    if !defined(PNG_ALLOCATED) && __has_attribute(__malloc__)\n#      define PNG_ALLOCATED __attribute__((__malloc__))\n#    endif\n#    if !defined(PNG_DEPRECATED) && __has_attribute(__deprecated__)\n#      define PNG_DEPRECATED __attribute__((__deprecated__))\n#    endif\n#    if !defined(PNG_PRIVATE)\n#      ifdef __has_extension\n#        if __has_extension(attribute_unavailable_with_message)\n#          define PNG_PRIVATE __attribute__((__unavailable__(\\\n             \"This function is not exported by libpng.\")))\n#        endif\n#      endif\n#    endif\n#    ifndef PNG_RESTRICT\n#      define PNG_RESTRICT __restrict\n#    endif\n\n#  elif defined(__GNUC__)\n#    ifndef PNG_USE_RESULT\n#      define PNG_USE_RESULT __attribute__((__warn_unused_result__))\n#    endif\n#    ifndef PNG_NORETURN\n#      define PNG_NORETURN   __attribute__((__noreturn__))\n#    endif\n#    if __GNUC__ >= 3\n#      ifndef PNG_ALLOCATED\n#        define PNG_ALLOCATED  __attribute__((__malloc__))\n#      endif\n#      ifndef PNG_DEPRECATED\n#        define PNG_DEPRECATED __attribute__((__deprecated__))\n#      endif\n#      ifndef PNG_PRIVATE\n#        if 0 /* Doesn't work so we use deprecated instead*/\n#          define PNG_PRIVATE \\\n            __attribute__((warning(\"This function is not exported by libpng.\")))\n#        else\n#          define PNG_PRIVATE \\\n            __attribute__((__deprecated__))\n#        endif\n#      endif\n#      if ((__GNUC__ > 3) || !defined(__GNUC_MINOR__) || (__GNUC_MINOR__ >= 1))\n#        ifndef PNG_RESTRICT\n#          define PNG_RESTRICT __restrict\n#        endif\n#      endif /* __GNUC__.__GNUC_MINOR__ > 3.0 */\n#    endif /* __GNUC__ >= 3 */\n\n#  elif defined(_MSC_VER)  && (_MSC_VER >= 1300)\n#    ifndef PNG_USE_RESULT\n#      define PNG_USE_RESULT /* not supported */\n#    endif\n#    ifndef PNG_NORETURN\n#      define PNG_NORETURN   __declspec(noreturn)\n#    endif\n#    ifndef PNG_ALLOCATED\n#      if (_MSC_VER >= 1400)\n#        define PNG_ALLOCATED __declspec(restrict)\n#      endif\n#    endif\n#    ifndef PNG_DEPRECATED\n#      define PNG_DEPRECATED __declspec(deprecated)\n#    endif\n#    ifndef PNG_PRIVATE\n#      define PNG_PRIVATE __declspec(deprecated)\n#    endif\n#    ifndef PNG_RESTRICT\n#      if (_MSC_VER >= 1400)\n#        define PNG_RESTRICT __restrict\n#      endif\n#    endif\n\n#  elif defined(__WATCOMC__)\n#    ifndef PNG_RESTRICT\n#      define PNG_RESTRICT __restrict\n#    endif\n#  endif\n#endif /* PNG_PEDANTIC_WARNINGS */\n\n#ifndef PNG_DEPRECATED\n#  define PNG_DEPRECATED  /* Use of this function is deprecated */\n#endif\n#ifndef PNG_USE_RESULT\n#  define PNG_USE_RESULT  /* The result of this function must be checked */\n#endif\n#ifndef PNG_NORETURN\n#  define PNG_NORETURN    /* This function does not return */\n#endif\n#ifndef PNG_ALLOCATED\n#  define PNG_ALLOCATED   /* The result of the function is new memory */\n#endif\n#ifndef PNG_PRIVATE\n#  define PNG_PRIVATE     /* This is a private libpng function */\n#endif\n#ifndef PNG_RESTRICT\n#  define PNG_RESTRICT    /* The C99 \"restrict\" feature */\n#endif\n\n#ifndef PNG_FP_EXPORT     /* A floating point API. */\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\n#     define PNG_FP_EXPORT(ordinal, type, name, args)\\\n         PNG_EXPORT(ordinal, type, name, args);\n#  else                   /* No floating point APIs */\n#     define PNG_FP_EXPORT(ordinal, type, name, args)\n#  endif\n#endif\n#ifndef PNG_FIXED_EXPORT  /* A fixed point API. */\n#  ifdef PNG_FIXED_POINT_SUPPORTED\n#     define PNG_FIXED_EXPORT(ordinal, type, name, args)\\\n         PNG_EXPORT(ordinal, type, name, args);\n#  else                   /* No fixed point APIs */\n#     define PNG_FIXED_EXPORT(ordinal, type, name, args)\n#  endif\n#endif\n\n#ifndef PNG_BUILDING_SYMBOL_TABLE\n/* Some typedefs to get us started.  These should be safe on most of the common\n * platforms.\n *\n * png_uint_32 and png_int_32 may, currently, be larger than required to hold a\n * 32-bit value however this is not normally advisable.\n *\n * png_uint_16 and png_int_16 should always be two bytes in size - this is\n * verified at library build time.\n *\n * png_byte must always be one byte in size.\n *\n * The checks below use constants from limits.h, as defined by the ISOC90\n * standard.\n */\n#if CHAR_BIT == 8 && UCHAR_MAX == 255\n   typedef unsigned char png_byte;\n#else\n#  error \"libpng requires 8-bit bytes\"\n#endif\n\n#if INT_MIN == -32768 && INT_MAX == 32767\n   typedef int png_int_16;\n#elif SHRT_MIN == -32768 && SHRT_MAX == 32767\n   typedef short png_int_16;\n#else\n#  error \"libpng requires a signed 16-bit type\"\n#endif\n\n#if UINT_MAX == 65535\n   typedef unsigned int png_uint_16;\n#elif USHRT_MAX == 65535\n   typedef unsigned short png_uint_16;\n#else\n#  error \"libpng requires an unsigned 16-bit type\"\n#endif\n\n#if INT_MIN < -2147483646 && INT_MAX > 2147483646\n   typedef int png_int_32;\n#elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646\n   typedef long int png_int_32;\n#else\n#  error \"libpng requires a signed 32-bit (or more) type\"\n#endif\n\n#if UINT_MAX > 4294967294\n   typedef unsigned int png_uint_32;\n#elif ULONG_MAX > 4294967294\n   typedef unsigned long int png_uint_32;\n#else\n#  error \"libpng requires an unsigned 32-bit (or more) type\"\n#endif\n\n/* Prior to 1.6.0 it was possible to disable the use of size_t, 1.6.0, however,\n * requires an ISOC90 compiler and relies on consistent behavior of sizeof.\n */\ntypedef size_t png_size_t;\ntypedef ptrdiff_t png_ptrdiff_t;\n\n/* libpng needs to know the maximum value of 'size_t' and this controls the\n * definition of png_alloc_size_t, below.  This maximum value of size_t limits\n * but does not control the maximum allocations the library makes - there is\n * direct application control of this through png_set_user_limits().\n */\n#ifndef PNG_SMALL_SIZE_T\n   /* Compiler specific tests for systems where size_t is known to be less than\n    * 32 bits (some of these systems may no longer work because of the lack of\n    * 'far' support; see above.)\n    */\n#  if (defined(__TURBOC__) && !defined(__FLAT__)) ||\\\n   (defined(_MSC_VER) && defined(MAXSEG_64K))\n#     define PNG_SMALL_SIZE_T\n#  endif\n#endif\n\n/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, and no\n * smaller than png_uint_32.  Casts from png_size_t or png_uint_32 to\n * png_alloc_size_t are not necessary; in fact, it is recommended not to use\n * them at all so that the compiler can complain when something turns out to be\n * problematic.\n *\n * Casts in the other direction (from png_alloc_size_t to png_size_t or\n * png_uint_32) should be explicitly applied; however, we do not expect to\n * encounter practical situations that require such conversions.\n *\n * PNG_SMALL_SIZE_T must be defined if the maximum value of size_t is less than\n * 4294967295 - i.e. less than the maximum value of png_uint_32.\n */\n#ifdef PNG_SMALL_SIZE_T\n   typedef png_uint_32 png_alloc_size_t;\n#else\n   typedef png_size_t png_alloc_size_t;\n#endif\n\n/* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler\n * implementations of Intel CPU specific support of user-mode segmented address\n * spaces, where 16-bit pointers address more than 65536 bytes of memory using\n * separate 'segment' registers.  The implementation requires two different\n * types of pointer (only one of which includes the segment value.)\n *\n * If required this support is available in version 1.2 of libpng and may be\n * available in versions through 1.5, although the correctness of the code has\n * not been verified recently.\n */\n\n/* Typedef for floating-point numbers that are converted to fixed-point with a\n * multiple of 100,000, e.g., gamma\n */\ntypedef png_int_32 png_fixed_point;\n\n/* Add typedefs for pointers */\ntypedef void                  * png_voidp;\ntypedef const void            * png_const_voidp;\ntypedef png_byte              * png_bytep;\ntypedef const png_byte        * png_const_bytep;\ntypedef png_uint_32           * png_uint_32p;\ntypedef const png_uint_32     * png_const_uint_32p;\ntypedef png_int_32            * png_int_32p;\ntypedef const png_int_32      * png_const_int_32p;\ntypedef png_uint_16           * png_uint_16p;\ntypedef const png_uint_16     * png_const_uint_16p;\ntypedef png_int_16            * png_int_16p;\ntypedef const png_int_16      * png_const_int_16p;\ntypedef char                  * png_charp;\ntypedef const char            * png_const_charp;\ntypedef png_fixed_point       * png_fixed_point_p;\ntypedef const png_fixed_point * png_const_fixed_point_p;\ntypedef png_size_t            * png_size_tp;\ntypedef const png_size_t      * png_const_size_tp;\n\n#ifdef PNG_STDIO_SUPPORTED\ntypedef FILE            * png_FILE_p;\n#endif\n\n#ifdef PNG_FLOATING_POINT_SUPPORTED\ntypedef double       * png_doublep;\ntypedef const double * png_const_doublep;\n#endif\n\n/* Pointers to pointers; i.e. arrays */\ntypedef png_byte        * * png_bytepp;\ntypedef png_uint_32     * * png_uint_32pp;\ntypedef png_int_32      * * png_int_32pp;\ntypedef png_uint_16     * * png_uint_16pp;\ntypedef png_int_16      * * png_int_16pp;\ntypedef const char      * * png_const_charpp;\ntypedef char            * * png_charpp;\ntypedef png_fixed_point * * png_fixed_point_pp;\n#ifdef PNG_FLOATING_POINT_SUPPORTED\ntypedef double          * * png_doublepp;\n#endif\n\n/* Pointers to pointers to pointers; i.e., pointer to array */\ntypedef char            * * * png_charppp;\n\n#endif /* PNG_BUILDING_SYMBOL_TABLE */\n\n#endif /* PNGCONF_H */\n"
  },
  {
    "path": "libs/SDL2_png/include/pngdebug.h",
    "content": "\n/* pngdebug.h - Debugging macros for libpng, also used in pngtest.c\n *\n * Last changed in libpng 1.6.8 [December 19, 2013]\n * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n/* Define PNG_DEBUG at compile time for debugging information.  Higher\n * numbers for PNG_DEBUG mean more debugging information.  This has\n * only been added since version 0.95 so it is not implemented throughout\n * libpng yet, but more support will be added as needed.\n *\n * png_debug[1-2]?(level, message ,arg{0-2})\n *   Expands to a statement (either a simple expression or a compound\n *   do..while(0) statement) that outputs a message with parameter\n *   substitution if PNG_DEBUG is defined to 2 or more.  If PNG_DEBUG\n *   is undefined, 0 or 1 every png_debug expands to a simple expression\n *   (actually ((void)0)).\n *\n *   level: level of detail of message, starting at 0.  A level 'n'\n *          message is preceded by 'n' 3-space indentations (not implemented\n *          on Microsoft compilers unless PNG_DEBUG_FILE is also\n *          defined, to allow debug DLL compilation with no standard IO).\n *   message: a printf(3) style text string.  A trailing '\\n' is added\n *            to the message.\n *   arg: 0 to 2 arguments for printf(3) style substitution in message.\n */\n#ifndef PNGDEBUG_H\n#define PNGDEBUG_H\n/* These settings control the formatting of messages in png.c and pngerror.c */\n/* Moved to pngdebug.h at 1.5.0 */\n#  ifndef PNG_LITERAL_SHARP\n#    define PNG_LITERAL_SHARP 0x23\n#  endif\n#  ifndef PNG_LITERAL_LEFT_SQUARE_BRACKET\n#    define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b\n#  endif\n#  ifndef PNG_LITERAL_RIGHT_SQUARE_BRACKET\n#    define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5d\n#  endif\n#  ifndef PNG_STRING_NEWLINE\n#    define PNG_STRING_NEWLINE \"\\n\"\n#  endif\n\n#ifdef PNG_DEBUG\n#  if (PNG_DEBUG > 0)\n#    if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER)\n#      include <crtdbg.h>\n#      if (PNG_DEBUG > 1)\n#        ifndef _DEBUG\n#          define _DEBUG\n#        endif\n#        ifndef png_debug\n#          define png_debug(l,m)  _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE)\n#        endif\n#        ifndef png_debug1\n#          define png_debug1(l,m,p1)  _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1)\n#        endif\n#        ifndef png_debug2\n#          define png_debug2(l,m,p1,p2) \\\n             _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2)\n#        endif\n#      endif\n#    else /* PNG_DEBUG_FILE || !_MSC_VER */\n#      ifndef PNG_STDIO_SUPPORTED\n#        include <stdio.h> /* not included yet */\n#      endif\n#      ifndef PNG_DEBUG_FILE\n#        define PNG_DEBUG_FILE stderr\n#      endif /* PNG_DEBUG_FILE */\n\n#      if (PNG_DEBUG > 1)\n#        ifdef __STDC__\n#          ifndef png_debug\n#            define png_debug(l,m) \\\n       do { \\\n       int num_tabs=l; \\\n       fprintf(PNG_DEBUG_FILE,\"%s\" m PNG_STRING_NEWLINE,(num_tabs==1 ? \"   \" : \\\n         (num_tabs==2 ? \"      \" : (num_tabs>2 ? \"         \" : \"\")))); \\\n       } while (0)\n#          endif\n#          ifndef png_debug1\n#            define png_debug1(l,m,p1) \\\n       do { \\\n       int num_tabs=l; \\\n       fprintf(PNG_DEBUG_FILE,\"%s\" m PNG_STRING_NEWLINE,(num_tabs==1 ? \"   \" : \\\n         (num_tabs==2 ? \"      \" : (num_tabs>2 ? \"         \" : \"\"))),p1); \\\n       } while (0)\n#          endif\n#          ifndef png_debug2\n#            define png_debug2(l,m,p1,p2) \\\n       do { \\\n       int num_tabs=l; \\\n       fprintf(PNG_DEBUG_FILE,\"%s\" m PNG_STRING_NEWLINE,(num_tabs==1 ? \"   \" : \\\n         (num_tabs==2 ? \"      \" : (num_tabs>2 ? \"         \" : \"\"))),p1,p2);\\\n       } while (0)\n#          endif\n#        else /* __STDC __ */\n#          ifndef png_debug\n#            define png_debug(l,m) \\\n       do { \\\n       int num_tabs=l; \\\n       char format[256]; \\\n       snprintf(format,256,\"%s%s%s\",(num_tabs==1 ? \"\\t\" : \\\n         (num_tabs==2 ? \"\\t\\t\":(num_tabs>2 ? \"\\t\\t\\t\":\"\"))), \\\n         m,PNG_STRING_NEWLINE); \\\n       fprintf(PNG_DEBUG_FILE,format); \\\n       } while (0)\n#          endif\n#          ifndef png_debug1\n#            define png_debug1(l,m,p1) \\\n       do { \\\n       int num_tabs=l; \\\n       char format[256]; \\\n       snprintf(format,256,\"%s%s%s\",(num_tabs==1 ? \"\\t\" : \\\n         (num_tabs==2 ? \"\\t\\t\":(num_tabs>2 ? \"\\t\\t\\t\":\"\"))), \\\n         m,PNG_STRING_NEWLINE); \\\n       fprintf(PNG_DEBUG_FILE,format,p1); \\\n       } while (0)\n#          endif\n#          ifndef png_debug2\n#            define png_debug2(l,m,p1,p2) \\\n       do { \\\n       int num_tabs=l; \\\n       char format[256]; \\\n       snprintf(format,256,\"%s%s%s\",(num_tabs==1 ? \"\\t\" : \\\n         (num_tabs==2 ? \"\\t\\t\":(num_tabs>2 ? \"\\t\\t\\t\":\"\"))), \\\n         m,PNG_STRING_NEWLINE); \\\n       fprintf(PNG_DEBUG_FILE,format,p1,p2); \\\n       } while (0)\n#          endif\n#        endif /* __STDC __ */\n#      endif /* (PNG_DEBUG > 1) */\n\n#    endif /* _MSC_VER */\n#  endif /* (PNG_DEBUG > 0) */\n#endif /* PNG_DEBUG */\n#ifndef png_debug\n#  define png_debug(l, m) ((void)0)\n#endif\n#ifndef png_debug1\n#  define png_debug1(l, m, p1) ((void)0)\n#endif\n#ifndef png_debug2\n#  define png_debug2(l, m, p1, p2) ((void)0)\n#endif\n#endif /* PNGDEBUG_H */\n"
  },
  {
    "path": "libs/SDL2_png/include/pnginfo.h",
    "content": "\n/* pnginfo.h - header file for PNG reference library\n *\n * Last changed in libpng 1.6.1 [March 28, 2013]\n * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n /* png_info is a structure that holds the information in a PNG file so\n * that the application can find out the characteristics of the image.\n * If you are reading the file, this structure will tell you what is\n * in the PNG file.  If you are writing the file, fill in the information\n * you want to put into the PNG file, using png_set_*() functions, then\n * call png_write_info().\n *\n * The names chosen should be very close to the PNG specification, so\n * consult that document for information about the meaning of each field.\n *\n * With libpng < 0.95, it was only possible to directly set and read the\n * the values in the png_info_struct, which meant that the contents and\n * order of the values had to remain fixed.  With libpng 0.95 and later,\n * however, there are now functions that abstract the contents of\n * png_info_struct from the application, so this makes it easier to use\n * libpng with dynamic libraries, and even makes it possible to use\n * libraries that don't have all of the libpng ancillary chunk-handing\n * functionality.  In libpng-1.5.0 this was moved into a separate private\n * file that is not visible to applications.\n *\n * The following members may have allocated storage attached that should be\n * cleaned up before the structure is discarded: palette, trans, text,\n * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile,\n * splt_palettes, scal_unit, row_pointers, and unknowns.   By default, these\n * are automatically freed when the info structure is deallocated, if they were\n * allocated internally by libpng.  This behavior can be changed by means\n * of the png_data_freer() function.\n *\n * More allocation details: all the chunk-reading functions that\n * change these members go through the corresponding png_set_*\n * functions.  A function to clear these members is available: see\n * png_free_data().  The png_set_* functions do not depend on being\n * able to point info structure members to any of the storage they are\n * passed (they make their own copies), EXCEPT that the png_set_text\n * functions use the same storage passed to them in the text_ptr or\n * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns\n * functions do not make their own copies.\n */\n#ifndef PNGINFO_H\n#define PNGINFO_H\n\nstruct png_info_def\n{\n   /* The following are necessary for every PNG file */\n   png_uint_32 width;  /* width of image in pixels (from IHDR) */\n   png_uint_32 height; /* height of image in pixels (from IHDR) */\n   png_uint_32 valid;  /* valid chunk data (see PNG_INFO_ below) */\n   png_size_t rowbytes; /* bytes needed to hold an untransformed row */\n   png_colorp palette;      /* array of color values (valid & PNG_INFO_PLTE) */\n   png_uint_16 num_palette; /* number of color entries in \"palette\" (PLTE) */\n   png_uint_16 num_trans;   /* number of transparent palette color (tRNS) */\n   png_byte bit_depth;      /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */\n   png_byte color_type;     /* see PNG_COLOR_TYPE_ below (from IHDR) */\n   /* The following three should have been named *_method not *_type */\n   png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */\n   png_byte filter_type;    /* must be PNG_FILTER_TYPE_BASE (from IHDR) */\n   png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */\n\n   /* The following are set by png_set_IHDR, called from the application on\n    * write, but the are never actually used by the write code.\n    */\n   png_byte channels;       /* number of data channels per pixel (1, 2, 3, 4) */\n   png_byte pixel_depth;    /* number of bits per pixel */\n   png_byte spare_byte;     /* to align the data, and for future use */\n\n#ifdef PNG_READ_SUPPORTED\n   /* This is never set during write */\n   png_byte signature[8];   /* magic bytes read by libpng from start of file */\n#endif\n\n   /* The rest of the data is optional.  If you are reading, check the\n    * valid field to see if the information in these are valid.  If you\n    * are writing, set the valid field to those chunks you want written,\n    * and initialize the appropriate fields below.\n    */\n\n#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)\n   /* png_colorspace only contains 'flags' if neither GAMMA or COLORSPACE are\n    * defined.  When COLORSPACE is switched on all the colorspace-defining\n    * chunks should be enabled, when GAMMA is switched on all the gamma-defining\n    * chunks should be enabled.  If this is not done it becomes possible to read\n    * inconsistent PNG files and assign a probably incorrect interpretation to\n    * the information.  (In other words, by carefully choosing which chunks to\n    * recognize the system configuration can select an interpretation for PNG\n    * files containing ambiguous data and this will result in inconsistent\n    * behavior between different libpng builds!)\n    */\n   png_colorspace colorspace;\n#endif\n\n#ifdef PNG_iCCP_SUPPORTED\n   /* iCCP chunk data. */\n   png_charp iccp_name;     /* profile name */\n   png_bytep iccp_profile;  /* International Color Consortium profile data */\n   png_uint_32 iccp_proflen;  /* ICC profile data length */\n#endif\n\n#ifdef PNG_TEXT_SUPPORTED\n   /* The tEXt, and zTXt chunks contain human-readable textual data in\n    * uncompressed, compressed, and optionally compressed forms, respectively.\n    * The data in \"text\" is an array of pointers to uncompressed,\n    * null-terminated C strings. Each chunk has a keyword that describes the\n    * textual data contained in that chunk.  Keywords are not required to be\n    * unique, and the text string may be empty.  Any number of text chunks may\n    * be in an image.\n    */\n   int num_text; /* number of comments read or comments to write */\n   int max_text; /* current size of text array */\n   png_textp text; /* array of comments read or comments to write */\n#endif /* TEXT */\n\n#ifdef PNG_tIME_SUPPORTED\n   /* The tIME chunk holds the last time the displayed image data was\n    * modified.  See the png_time struct for the contents of this struct.\n    */\n   png_time mod_time;\n#endif\n\n#ifdef PNG_sBIT_SUPPORTED\n   /* The sBIT chunk specifies the number of significant high-order bits\n    * in the pixel data.  Values are in the range [1, bit_depth], and are\n    * only specified for the channels in the pixel data.  The contents of\n    * the low-order bits is not specified.  Data is valid if\n    * (valid & PNG_INFO_sBIT) is non-zero.\n    */\n   png_color_8 sig_bit; /* significant bits in color channels */\n#endif\n\n#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \\\ndefined(PNG_READ_BACKGROUND_SUPPORTED)\n   /* The tRNS chunk supplies transparency data for paletted images and\n    * other image types that don't need a full alpha channel.  There are\n    * \"num_trans\" transparency values for a paletted image, stored in the\n    * same order as the palette colors, starting from index 0.  Values\n    * for the data are in the range [0, 255], ranging from fully transparent\n    * to fully opaque, respectively.  For non-paletted images, there is a\n    * single color specified that should be treated as fully transparent.\n    * Data is valid if (valid & PNG_INFO_tRNS) is non-zero.\n    */\n   png_bytep trans_alpha;    /* alpha values for paletted image */\n   png_color_16 trans_color; /* transparent color for non-palette image */\n#endif\n\n#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)\n   /* The bKGD chunk gives the suggested image background color if the\n    * display program does not have its own background color and the image\n    * is needs to composited onto a background before display.  The colors\n    * in \"background\" are normally in the same color space/depth as the\n    * pixel data.  Data is valid if (valid & PNG_INFO_bKGD) is non-zero.\n    */\n   png_color_16 background;\n#endif\n\n#ifdef PNG_oFFs_SUPPORTED\n   /* The oFFs chunk gives the offset in \"offset_unit_type\" units rightwards\n    * and downwards from the top-left corner of the display, page, or other\n    * application-specific co-ordinate space.  See the PNG_OFFSET_ defines\n    * below for the unit types.  Valid if (valid & PNG_INFO_oFFs) non-zero.\n    */\n   png_int_32 x_offset; /* x offset on page */\n   png_int_32 y_offset; /* y offset on page */\n   png_byte offset_unit_type; /* offset units type */\n#endif\n\n#ifdef PNG_pHYs_SUPPORTED\n   /* The pHYs chunk gives the physical pixel density of the image for\n    * display or printing in \"phys_unit_type\" units (see PNG_RESOLUTION_\n    * defines below).  Data is valid if (valid & PNG_INFO_pHYs) is non-zero.\n    */\n   png_uint_32 x_pixels_per_unit; /* horizontal pixel density */\n   png_uint_32 y_pixels_per_unit; /* vertical pixel density */\n   png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */\n#endif\n\n#ifdef PNG_hIST_SUPPORTED\n   /* The hIST chunk contains the relative frequency or importance of the\n    * various palette entries, so that a viewer can intelligently select a\n    * reduced-color palette, if required.  Data is an array of \"num_palette\"\n    * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST)\n    * is non-zero.\n    */\n   png_uint_16p hist;\n#endif\n\n#ifdef PNG_pCAL_SUPPORTED\n   /* The pCAL chunk describes a transformation between the stored pixel\n    * values and original physical data values used to create the image.\n    * The integer range [0, 2^bit_depth - 1] maps to the floating-point\n    * range given by [pcal_X0, pcal_X1], and are further transformed by a\n    * (possibly non-linear) transformation function given by \"pcal_type\"\n    * and \"pcal_params\" into \"pcal_units\".  Please see the PNG_EQUATION_\n    * defines below, and the PNG-Group's PNG extensions document for a\n    * complete description of the transformations and how they should be\n    * implemented, and for a description of the ASCII parameter strings.\n    * Data values are valid if (valid & PNG_INFO_pCAL) non-zero.\n    */\n   png_charp pcal_purpose;  /* pCAL chunk description string */\n   png_int_32 pcal_X0;      /* minimum value */\n   png_int_32 pcal_X1;      /* maximum value */\n   png_charp pcal_units;    /* Latin-1 string giving physical units */\n   png_charpp pcal_params;  /* ASCII strings containing parameter values */\n   png_byte pcal_type;      /* equation type (see PNG_EQUATION_ below) */\n   png_byte pcal_nparams;   /* number of parameters given in pcal_params */\n#endif\n\n/* New members added in libpng-1.0.6 */\n   png_uint_32 free_me;     /* flags items libpng is responsible for freeing */\n\n#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\n   /* Storage for unknown chunks that the library doesn't recognize. */\n   png_unknown_chunkp unknown_chunks;\n\n   /* The type of this field is limited by the type of\n    * png_struct::user_chunk_cache_max, else overflow can occur.\n    */\n   int                unknown_chunks_num;\n#endif\n\n#ifdef PNG_sPLT_SUPPORTED\n   /* Data on sPLT chunks (there may be more than one). */\n   png_sPLT_tp splt_palettes;\n   int         splt_palettes_num; /* Match type returned by png_get API */\n#endif\n\n#ifdef PNG_sCAL_SUPPORTED\n   /* The sCAL chunk describes the actual physical dimensions of the\n    * subject matter of the graphic.  The chunk contains a unit specification\n    * a byte value, and two ASCII strings representing floating-point\n    * values.  The values are width and height corresponsing to one pixel\n    * in the image.  Data values are valid if (valid & PNG_INFO_sCAL) is\n    * non-zero.\n    */\n   png_byte scal_unit;         /* unit of physical scale */\n   png_charp scal_s_width;     /* string containing height */\n   png_charp scal_s_height;    /* string containing width */\n#endif\n\n#ifdef PNG_INFO_IMAGE_SUPPORTED\n   /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS)\n      non-zero */\n   /* Data valid if (valid & PNG_INFO_IDAT) non-zero */\n   png_bytepp row_pointers;        /* the image bits */\n#endif\n\n};\n#endif /* PNGINFO_H */\n"
  },
  {
    "path": "libs/SDL2_png/include/pnglibconf.h",
    "content": "/* libpng 1.6.23 STANDARD API DEFINITION */\n\n/* pnglibconf.h - library build configuration */\n\n/* Libpng version 1.6.23 - June 9, 2016 */\n\n/* Copyright (c) 1998-2015 Glenn Randers-Pehrson */\n\n/* This code is released under the libpng license. */\n/* For conditions of distribution and use, see the disclaimer */\n/* and license in png.h */\n\n/* pnglibconf.h */\n/* Machine generated file: DO NOT EDIT */\n/* Derived from: scripts/pnglibconf.dfa */\n#ifndef PNGLCONF_H\n#define PNGLCONF_H\n/* options */\n#define PNG_16BIT_SUPPORTED\n#define PNG_ALIGNED_MEMORY_SUPPORTED\n/*#undef PNG_ARM_NEON_API_SUPPORTED*/\n/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/\n#define PNG_BENIGN_ERRORS_SUPPORTED\n#define PNG_BENIGN_READ_ERRORS_SUPPORTED\n/*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/\n#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED\n#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED\n#define PNG_COLORSPACE_SUPPORTED\n#define PNG_CONSOLE_IO_SUPPORTED\n#define PNG_CONVERT_tIME_SUPPORTED\n#define PNG_EASY_ACCESS_SUPPORTED\n/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/\n#define PNG_ERROR_TEXT_SUPPORTED\n#define PNG_FIXED_POINT_SUPPORTED\n#define PNG_FLOATING_ARITHMETIC_SUPPORTED\n#define PNG_FLOATING_POINT_SUPPORTED\n#define PNG_FORMAT_AFIRST_SUPPORTED\n#define PNG_FORMAT_BGR_SUPPORTED\n#define PNG_GAMMA_SUPPORTED\n#define PNG_GET_PALETTE_MAX_SUPPORTED\n#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n#define PNG_INCH_CONVERSIONS_SUPPORTED\n#define PNG_INFO_IMAGE_SUPPORTED\n#define PNG_IO_STATE_SUPPORTED\n#define PNG_MNG_FEATURES_SUPPORTED\n#define PNG_POINTER_INDEXING_SUPPORTED\n#define PNG_PROGRESSIVE_READ_SUPPORTED\n#define PNG_READ_16BIT_SUPPORTED\n#define PNG_READ_ALPHA_MODE_SUPPORTED\n#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED\n#define PNG_READ_BACKGROUND_SUPPORTED\n#define PNG_READ_BGR_SUPPORTED\n#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED\n#define PNG_READ_COMPOSITE_NODIV_SUPPORTED\n#define PNG_READ_COMPRESSED_TEXT_SUPPORTED\n#define PNG_READ_EXPAND_16_SUPPORTED\n#define PNG_READ_EXPAND_SUPPORTED\n#define PNG_READ_FILLER_SUPPORTED\n#define PNG_READ_GAMMA_SUPPORTED\n#define PNG_READ_GET_PALETTE_MAX_SUPPORTED\n#define PNG_READ_GRAY_TO_RGB_SUPPORTED\n#define PNG_READ_INTERLACING_SUPPORTED\n#define PNG_READ_INT_FUNCTIONS_SUPPORTED\n#define PNG_READ_INVERT_ALPHA_SUPPORTED\n#define PNG_READ_INVERT_SUPPORTED\n#define PNG_READ_OPT_PLTE_SUPPORTED\n#define PNG_READ_PACKSWAP_SUPPORTED\n#define PNG_READ_PACK_SUPPORTED\n#define PNG_READ_QUANTIZE_SUPPORTED\n#define PNG_READ_RGB_TO_GRAY_SUPPORTED\n#define PNG_READ_SCALE_16_TO_8_SUPPORTED\n#define PNG_READ_SHIFT_SUPPORTED\n#define PNG_READ_STRIP_16_TO_8_SUPPORTED\n#define PNG_READ_STRIP_ALPHA_SUPPORTED\n#define PNG_READ_SUPPORTED\n#define PNG_READ_SWAP_ALPHA_SUPPORTED\n#define PNG_READ_SWAP_SUPPORTED\n#define PNG_READ_TEXT_SUPPORTED\n#define PNG_READ_TRANSFORMS_SUPPORTED\n#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_READ_USER_CHUNKS_SUPPORTED\n#define PNG_READ_USER_TRANSFORM_SUPPORTED\n#define PNG_READ_bKGD_SUPPORTED\n#define PNG_READ_cHRM_SUPPORTED\n#define PNG_READ_gAMA_SUPPORTED\n#define PNG_READ_hIST_SUPPORTED\n#define PNG_READ_iCCP_SUPPORTED\n#define PNG_READ_iTXt_SUPPORTED\n#define PNG_READ_oFFs_SUPPORTED\n#define PNG_READ_pCAL_SUPPORTED\n#define PNG_READ_pHYs_SUPPORTED\n#define PNG_READ_sBIT_SUPPORTED\n#define PNG_READ_sCAL_SUPPORTED\n#define PNG_READ_sPLT_SUPPORTED\n#define PNG_READ_sRGB_SUPPORTED\n#define PNG_READ_tEXt_SUPPORTED\n#define PNG_READ_tIME_SUPPORTED\n#define PNG_READ_tRNS_SUPPORTED\n#define PNG_READ_zTXt_SUPPORTED\n#define PNG_SAVE_INT_32_SUPPORTED\n#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_SEQUENTIAL_READ_SUPPORTED\n#define PNG_SETJMP_SUPPORTED\n#define PNG_SET_OPTION_SUPPORTED\n#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_SET_USER_LIMITS_SUPPORTED\n#define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED\n#define PNG_SIMPLIFIED_READ_BGR_SUPPORTED\n#define PNG_SIMPLIFIED_READ_SUPPORTED\n#define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED\n#define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED\n#define PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED\n#define PNG_SIMPLIFIED_WRITE_SUPPORTED\n#define PNG_STDIO_SUPPORTED\n#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_TEXT_SUPPORTED\n#define PNG_TIME_RFC1123_SUPPORTED\n#define PNG_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_USER_CHUNKS_SUPPORTED\n#define PNG_USER_LIMITS_SUPPORTED\n#define PNG_USER_MEM_SUPPORTED\n#define PNG_USER_TRANSFORM_INFO_SUPPORTED\n#define PNG_USER_TRANSFORM_PTR_SUPPORTED\n#define PNG_WARNINGS_SUPPORTED\n#define PNG_WRITE_16BIT_SUPPORTED\n#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED\n#define PNG_WRITE_BGR_SUPPORTED\n#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED\n#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED\n#define PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED\n#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED\n#define PNG_WRITE_FILLER_SUPPORTED\n#define PNG_WRITE_FILTER_SUPPORTED\n#define PNG_WRITE_FLUSH_SUPPORTED\n#define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED\n#define PNG_WRITE_INTERLACING_SUPPORTED\n#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED\n#define PNG_WRITE_INVERT_ALPHA_SUPPORTED\n#define PNG_WRITE_INVERT_SUPPORTED\n#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED\n#define PNG_WRITE_PACKSWAP_SUPPORTED\n#define PNG_WRITE_PACK_SUPPORTED\n#define PNG_WRITE_SHIFT_SUPPORTED\n#define PNG_WRITE_SUPPORTED\n#define PNG_WRITE_SWAP_ALPHA_SUPPORTED\n#define PNG_WRITE_SWAP_SUPPORTED\n#define PNG_WRITE_TEXT_SUPPORTED\n#define PNG_WRITE_TRANSFORMS_SUPPORTED\n#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_WRITE_USER_TRANSFORM_SUPPORTED\n#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED\n#define PNG_WRITE_bKGD_SUPPORTED\n#define PNG_WRITE_cHRM_SUPPORTED\n#define PNG_WRITE_gAMA_SUPPORTED\n#define PNG_WRITE_hIST_SUPPORTED\n#define PNG_WRITE_iCCP_SUPPORTED\n#define PNG_WRITE_iTXt_SUPPORTED\n#define PNG_WRITE_oFFs_SUPPORTED\n#define PNG_WRITE_pCAL_SUPPORTED\n#define PNG_WRITE_pHYs_SUPPORTED\n#define PNG_WRITE_sBIT_SUPPORTED\n#define PNG_WRITE_sCAL_SUPPORTED\n#define PNG_WRITE_sPLT_SUPPORTED\n#define PNG_WRITE_sRGB_SUPPORTED\n#define PNG_WRITE_tEXt_SUPPORTED\n#define PNG_WRITE_tIME_SUPPORTED\n#define PNG_WRITE_tRNS_SUPPORTED\n#define PNG_WRITE_zTXt_SUPPORTED\n#define PNG_bKGD_SUPPORTED\n#define PNG_cHRM_SUPPORTED\n#define PNG_gAMA_SUPPORTED\n#define PNG_hIST_SUPPORTED\n#define PNG_iCCP_SUPPORTED\n#define PNG_iTXt_SUPPORTED\n#define PNG_oFFs_SUPPORTED\n#define PNG_pCAL_SUPPORTED\n#define PNG_pHYs_SUPPORTED\n#define PNG_sBIT_SUPPORTED\n#define PNG_sCAL_SUPPORTED\n#define PNG_sPLT_SUPPORTED\n#define PNG_sRGB_SUPPORTED\n#define PNG_tEXt_SUPPORTED\n#define PNG_tIME_SUPPORTED\n#define PNG_tRNS_SUPPORTED\n#define PNG_zTXt_SUPPORTED\n/* end of options */\n/* settings */\n#define PNG_API_RULE 0\n#define PNG_DEFAULT_READ_MACROS 1\n#define PNG_GAMMA_THRESHOLD_FIXED 5000\n#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE\n#define PNG_INFLATE_BUF_SIZE 1024\n#define PNG_LINKAGE_API extern\n#define PNG_LINKAGE_CALLBACK extern\n#define PNG_LINKAGE_DATA extern\n#define PNG_LINKAGE_FUNCTION extern\n#define PNG_MAX_GAMMA_8 11\n#define PNG_QUANTIZE_BLUE_BITS 5\n#define PNG_QUANTIZE_GREEN_BITS 5\n#define PNG_QUANTIZE_RED_BITS 5\n#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1)\n#define PNG_TEXT_Z_DEFAULT_STRATEGY 0\n#define PNG_USER_CHUNK_CACHE_MAX 1000\n#define PNG_USER_CHUNK_MALLOC_MAX 8000000\n#define PNG_USER_HEIGHT_MAX 1000000\n#define PNG_USER_WIDTH_MAX 1000000\n#define PNG_ZBUF_SIZE 8192\n#define PNG_ZLIB_VERNUM 0 /* unknown */\n#define PNG_Z_DEFAULT_COMPRESSION (-1)\n#define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0\n#define PNG_Z_DEFAULT_STRATEGY 1\n#define PNG_sCAL_PRECISION 5\n#define PNG_sRGB_PROFILE_CHECKS 2\n/* end of settings */\n#endif /* PNGLCONF_H */\n"
  },
  {
    "path": "libs/SDL2_png/include/pngprefix.h",
    "content": ""
  },
  {
    "path": "libs/SDL2_png/include/pngpriv.h",
    "content": "\n/* pngpriv.h - private declarations for use inside libpng\n *\n * Last changed in libpng 1.6.22 [May 26, 2016]\n * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n/* The symbols declared in this file (including the functions declared\n * as extern) are PRIVATE.  They are not part of the libpng public\n * interface, and are not recommended for use by regular applications.\n * Some of them may become public in the future; others may stay private,\n * change in an incompatible way, or even disappear.\n * Although the libpng users are not forbidden to include this header,\n * they should be well aware of the issues that may arise from doing so.\n */\n\n#ifndef PNGPRIV_H\n#define PNGPRIV_H\n\n/* Feature Test Macros.  The following are defined here to ensure that correctly\n * implemented libraries reveal the APIs libpng needs to build and hide those\n * that are not needed and potentially damaging to the compilation.\n *\n * Feature Test Macros must be defined before any system header is included (see\n * POSIX 1003.1 2.8.2 \"POSIX Symbols.\"\n *\n * These macros only have an effect if the operating system supports either\n * POSIX 1003.1 or C99, or both.  On other operating systems (particularly\n * Windows/Visual Studio) there is no effect; the OS specific tests below are\n * still required (as of 2011-05-02.)\n */\n#define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */\n\n#ifndef PNG_VERSION_INFO_ONLY\n/* Standard library headers not required by png.h: */\n#  include <stdlib.h>\n#  include <string.h>\n#endif\n\n#define PNGLIB_BUILD /*libpng is being built, not used*/\n\n/* If HAVE_CONFIG_H is defined during the build then the build system must\n * provide an appropriate \"config.h\" file on the include path.  The header file\n * must provide definitions as required below (search for \"HAVE_CONFIG_H\");\n * see configure.ac for more details of the requirements.  The macro\n * \"PNG_NO_CONFIG_H\" is provided for maintainers to test for dependencies on\n * 'configure'; define this macro to prevent the configure build including the\n * configure generated config.h.  Libpng is expected to compile without *any*\n * special build system support on a reasonably ANSI-C compliant system.\n */\n#if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H)\n#  include <config.h>\n\n   /* Pick up the definition of 'restrict' from config.h if it was read: */\n#  define PNG_RESTRICT restrict\n#endif\n\n/* To support symbol prefixing it is necessary to know *before* including png.h\n * whether the fixed point (and maybe other) APIs are exported, because if they\n * are not internal definitions may be required.  This is handled below just\n * before png.h is included, but load the configuration now if it is available.\n */\n#ifndef PNGLCONF_H\n#  include \"pnglibconf.h\"\n#endif\n\n/* Local renames may change non-exported API functions from png.h */\n#if defined(PNG_PREFIX) && !defined(PNGPREFIX_H)\n#  include \"pngprefix.h\"\n#endif\n\n#ifdef PNG_USER_CONFIG\n#  include \"pngusr.h\"\n   /* These should have been defined in pngusr.h */\n#  ifndef PNG_USER_PRIVATEBUILD\n#    define PNG_USER_PRIVATEBUILD \"Custom libpng build\"\n#  endif\n#  ifndef PNG_USER_DLLFNAME_POSTFIX\n#    define PNG_USER_DLLFNAME_POSTFIX \"Cb\"\n#  endif\n#endif\n\n/* Compile time options.\n * =====================\n * In a multi-arch build the compiler may compile the code several times for the\n * same object module, producing different binaries for different architectures.\n * When this happens configure-time setting of the target host options cannot be\n * done and this interferes with the handling of the ARM NEON optimizations, and\n * possibly other similar optimizations.  Put additional tests here; in general\n * this is needed when the same option can be changed at both compile time and\n * run time depending on the target OS (i.e. iOS vs Android.)\n *\n * NOTE: symbol prefixing does not pass $(CFLAGS) to the preprocessor, because\n * this is not possible with certain compilers (Oracle SUN OS CC), as a result\n * it is necessary to ensure that all extern functions that *might* be used\n * regardless of $(CFLAGS) get declared in this file.  The test on __ARM_NEON__\n * below is one example of this behavior because it is controlled by the\n * presence or not of -mfpu=neon on the GCC command line, it is possible to do\n * this in $(CC), e.g. \"CC=gcc -mfpu=neon\", but people who build libpng rarely\n * do this.\n */\n#ifndef PNG_ARM_NEON_OPT\n   /* ARM NEON optimizations are being controlled by the compiler settings,\n    * typically the target FPU.  If the FPU has been set to NEON (-mfpu=neon\n    * with GCC) then the compiler will define __ARM_NEON__ and we can rely\n    * unconditionally on NEON instructions not crashing, otherwise we must\n    * disable use of NEON instructions.\n    *\n    * NOTE: at present these optimizations depend on 'ALIGNED_MEMORY', so they\n    * can only be turned on automatically if that is supported too.  If\n    * PNG_ARM_NEON_OPT is set in CPPFLAGS (to >0) then arm/arm_init.c will fail\n    * to compile with an appropriate #error if ALIGNED_MEMORY has been turned\n    * off.\n    *\n    * Note that gcc-4.9 defines __ARM_NEON instead of the deprecated\n    * __ARM_NEON__, so we check both variants.\n    *\n    * To disable ARM_NEON optimizations entirely, and skip compiling the\n    * associated assembler code, pass --enable-arm-neon=no to configure\n    * or put -DPNG_ARM_NEON_OPT=0 in CPPFLAGS.\n    */\n#  if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \\\n   defined(PNG_ALIGNED_MEMORY_SUPPORTED)\n#     define PNG_ARM_NEON_OPT 0\n#  else\n#     define PNG_ARM_NEON_OPT 0\n#  endif\n#endif\n\n#if PNG_ARM_NEON_OPT > 0\n   /* NEON optimizations are to be at least considered by libpng, so enable the\n    * callbacks to do this.\n    */\n#  define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_neon\n\n   /* By default the 'intrinsics' code in arm/filter_neon_intrinsics.c is used\n    * if possible - if __ARM_NEON__ is set and the compiler version is not known\n    * to be broken.  This is controlled by PNG_ARM_NEON_IMPLEMENTATION which can\n    * be:\n    *\n    *    1  The intrinsics code (the default with __ARM_NEON__)\n    *    2  The hand coded assembler (the default without __ARM_NEON__)\n    *\n    * It is possible to set PNG_ARM_NEON_IMPLEMENTATION in CPPFLAGS, however\n    * this is *NOT* supported and may cease to work even after a minor revision\n    * to libpng.  It *is* valid to do this for testing purposes, e.g. speed\n    * testing or a new compiler, but the results should be communicated to the\n    * libpng implementation list for incorporation in the next minor release.\n    */\n#  ifndef PNG_ARM_NEON_IMPLEMENTATION\n#     if defined(__ARM_NEON__) || defined(__ARM_NEON)\n#        if defined(__clang__)\n            /* At present it is unknown by the libpng developers which versions\n             * of clang support the intrinsics, however some or perhaps all\n             * versions do not work with the assembler so this may be\n             * irrelevant, so just use the default (do nothing here.)\n             */\n#        elif defined(__GNUC__)\n            /* GCC 4.5.4 NEON support is known to be broken.  4.6.3 is known to\n             * work, so if this *is* GCC, or G++, look for a version >4.5\n             */\n#           if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)\n#              define PNG_ARM_NEON_IMPLEMENTATION 2\n#           endif /* no GNUC support */\n#        endif /* __GNUC__ */\n#     else /* !defined __ARM_NEON__ */\n         /* The 'intrinsics' code simply won't compile without this -mfpu=neon:\n          */\n#        define PNG_ARM_NEON_IMPLEMENTATION 2\n#     endif /* __ARM_NEON__ */\n#  endif /* !PNG_ARM_NEON_IMPLEMENTATION */\n\n#  ifndef PNG_ARM_NEON_IMPLEMENTATION\n      /* Use the intrinsics code by default. */\n#     define PNG_ARM_NEON_IMPLEMENTATION 1\n#  endif\n#endif /* PNG_ARM_NEON_OPT > 0 */\n\n/* Is this a build of a DLL where compilation of the object modules requires\n * different preprocessor settings to those required for a simple library?  If\n * so PNG_BUILD_DLL must be set.\n *\n * If libpng is used inside a DLL but that DLL does not export the libpng APIs\n * PNG_BUILD_DLL must not be set.  To avoid the code below kicking in build a\n * static library of libpng then link the DLL against that.\n */\n#ifndef PNG_BUILD_DLL\n#  ifdef DLL_EXPORT\n      /* This is set by libtool when files are compiled for a DLL; libtool\n       * always compiles twice, even on systems where it isn't necessary.  Set\n       * PNG_BUILD_DLL in case it is necessary:\n       */\n#     define PNG_BUILD_DLL\n#  else\n#     ifdef _WINDLL\n         /* This is set by the Microsoft Visual Studio IDE in projects that\n          * build a DLL.  It can't easily be removed from those projects (it\n          * isn't visible in the Visual Studio UI) so it is a fairly reliable\n          * indication that PNG_IMPEXP needs to be set to the DLL export\n          * attributes.\n          */\n#        define PNG_BUILD_DLL\n#     else\n#        ifdef __DLL__\n            /* This is set by the Borland C system when compiling for a DLL\n             * (as above.)\n             */\n#           define PNG_BUILD_DLL\n#        else\n            /* Add additional compiler cases here. */\n#        endif\n#     endif\n#  endif\n#endif /* Setting PNG_BUILD_DLL if required */\n\n/* See pngconf.h for more details: the builder of the library may set this on\n * the command line to the right thing for the specific compilation system or it\n * may be automagically set above (at present we know of no system where it does\n * need to be set on the command line.)\n *\n * PNG_IMPEXP must be set here when building the library to prevent pngconf.h\n * setting it to the \"import\" setting for a DLL build.\n */\n#ifndef PNG_IMPEXP\n#  ifdef PNG_BUILD_DLL\n#     define PNG_IMPEXP PNG_DLL_EXPORT\n#  else\n      /* Not building a DLL, or the DLL doesn't require specific export\n       * definitions.\n       */\n#     define PNG_IMPEXP\n#  endif\n#endif\n\n/* No warnings for private or deprecated functions in the build: */\n#ifndef PNG_DEPRECATED\n#  define PNG_DEPRECATED\n#endif\n#ifndef PNG_PRIVATE\n#  define PNG_PRIVATE\n#endif\n\n/* Symbol preprocessing support.\n *\n * To enable listing global, but internal, symbols the following macros should\n * always be used to declare an extern data or function object in this file.\n */\n#ifndef PNG_INTERNAL_DATA\n#  define PNG_INTERNAL_DATA(type, name, array) PNG_LINKAGE_DATA type name array\n#endif\n\n#ifndef PNG_INTERNAL_FUNCTION\n#  define PNG_INTERNAL_FUNCTION(type, name, args, attributes)\\\n      PNG_LINKAGE_FUNCTION PNG_FUNCTION(type, name, args, PNG_EMPTY attributes)\n#endif\n\n#ifndef PNG_INTERNAL_CALLBACK\n#  define PNG_INTERNAL_CALLBACK(type, name, args, attributes)\\\n      PNG_LINKAGE_CALLBACK PNG_FUNCTION(type, (PNGCBAPI name), args,\\\n         PNG_EMPTY attributes)\n#endif\n\n/* If floating or fixed point APIs are disabled they may still be compiled\n * internally.  To handle this make sure they are declared as the appropriate\n * internal extern function (otherwise the symbol prefixing stuff won't work and\n * the functions will be used without definitions.)\n *\n * NOTE: although all the API functions are declared here they are not all\n * actually built!  Because the declarations are still made it is necessary to\n * fake out types that they depend on.\n */\n#ifndef PNG_FP_EXPORT\n#  ifndef PNG_FLOATING_POINT_SUPPORTED\n#     define PNG_FP_EXPORT(ordinal, type, name, args)\\\n         PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY);\n#     ifndef PNG_VERSION_INFO_ONLY\n         typedef struct png_incomplete png_double;\n         typedef png_double*           png_doublep;\n         typedef const png_double*     png_const_doublep;\n         typedef png_double**          png_doublepp;\n#     endif\n#  endif\n#endif\n#ifndef PNG_FIXED_EXPORT\n#  ifndef PNG_FIXED_POINT_SUPPORTED\n#     define PNG_FIXED_EXPORT(ordinal, type, name, args)\\\n         PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY);\n#  endif\n#endif\n\n#include \"png.h\"\n\n/* pngconf.h does not set PNG_DLL_EXPORT unless it is required, so: */\n#ifndef PNG_DLL_EXPORT\n#  define PNG_DLL_EXPORT\n#endif\n\n/* This is a global switch to set the compilation for an installed system\n * (a release build).  It can be set for testing debug builds to ensure that\n * they will compile when the build type is switched to RC or STABLE, the\n * default is just to use PNG_LIBPNG_BUILD_BASE_TYPE.  Set this in CPPFLAGS\n * with either:\n *\n *   -DPNG_RELEASE_BUILD Turns on the release compile path\n *   -DPNG_RELEASE_BUILD=0 Turns it off\n * or in your pngusr.h with\n *   #define PNG_RELEASE_BUILD=1 Turns on the release compile path\n *   #define PNG_RELEASE_BUILD=0 Turns it off\n */\n#ifndef PNG_RELEASE_BUILD\n#  define PNG_RELEASE_BUILD (PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC)\n#endif\n\n/* SECURITY and SAFETY:\n *\n * libpng is built with support for internal limits on image dimensions and\n * memory usage.  These are documented in scripts/pnglibconf.dfa of the\n * source and recorded in the machine generated header file pnglibconf.h.\n */\n\n/* If you are running on a machine where you cannot allocate more\n * than 64K of memory at once, uncomment this.  While libpng will not\n * normally need that much memory in a chunk (unless you load up a very\n * large file), zlib needs to know how big of a chunk it can use, and\n * libpng thus makes sure to check any memory allocation to verify it\n * will fit into memory.\n *\n * zlib provides 'MAXSEG_64K' which, if defined, indicates the\n * same limit and pngconf.h (already included) sets the limit\n * if certain operating systems are detected.\n */\n#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)\n#  define PNG_MAX_MALLOC_64K\n#endif\n\n#ifndef PNG_UNUSED\n/* Unused formal parameter warnings are silenced using the following macro\n * which is expected to have no bad effects on performance (optimizing\n * compilers will probably remove it entirely).  Note that if you replace\n * it with something other than whitespace, you must include the terminating\n * semicolon.\n */\n#  define PNG_UNUSED(param) (void)param;\n#endif\n\n/* Just a little check that someone hasn't tried to define something\n * contradictory.\n */\n#if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K)\n#  undef PNG_ZBUF_SIZE\n#  define PNG_ZBUF_SIZE 65536L\n#endif\n\n/* If warnings or errors are turned off the code is disabled or redirected here.\n * From 1.5.4 functions have been added to allow very limited formatting of\n * error and warning messages - this code will also be disabled here.\n */\n#ifdef PNG_WARNINGS_SUPPORTED\n#  define PNG_WARNING_PARAMETERS(p) png_warning_parameters p;\n#else\n#  define png_warning_parameter(p,number,string) ((void)0)\n#  define png_warning_parameter_unsigned(p,number,format,value) ((void)0)\n#  define png_warning_parameter_signed(p,number,format,value) ((void)0)\n#  define png_formatted_warning(pp,p,message) ((void)(pp))\n#  define PNG_WARNING_PARAMETERS(p)\n#endif\n#ifndef PNG_ERROR_TEXT_SUPPORTED\n#  define png_fixed_error(s1,s2) png_err(s1)\n#endif\n\n/* C allows up-casts from (void*) to any pointer and (const void*) to any\n * pointer to a const object.  C++ regards this as a type error and requires an\n * explicit, static, cast and provides the static_cast<> rune to ensure that\n * const is not cast away.\n */\n#ifdef __cplusplus\n#  define png_voidcast(type, value) static_cast<type>(value)\n#  define png_constcast(type, value) const_cast<type>(value)\n#  define png_aligncast(type, value) \\\n   static_cast<type>(static_cast<void*>(value))\n#  define png_aligncastconst(type, value) \\\n   static_cast<type>(static_cast<const void*>(value))\n#else\n#  define png_voidcast(type, value) (value)\n#  define png_constcast(type, value) ((type)(value))\n#  define png_aligncast(type, value) ((void*)(value))\n#  define png_aligncastconst(type, value) ((const void*)(value))\n#endif /* __cplusplus */\n\n/* Some fixed point APIs are still required even if not exported because\n * they get used by the corresponding floating point APIs.  This magic\n * deals with this:\n */\n#ifdef PNG_FIXED_POINT_SUPPORTED\n#  define PNGFAPI PNGAPI\n#else\n#  define PNGFAPI /* PRIVATE */\n#endif\n\n#ifndef PNG_VERSION_INFO_ONLY\n/* Other defines specific to compilers can go here.  Try to keep\n * them inside an appropriate ifdef/endif pair for portability.\n */\n#if defined(PNG_FLOATING_POINT_SUPPORTED) ||\\\n    defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)\n   /* png.c requires the following ANSI-C constants if the conversion of\n    * floating point to ASCII is implemented therein:\n    *\n    *  DBL_DIG  Maximum number of decimal digits (can be set to any constant)\n    *  DBL_MIN  Smallest normalized fp number (can be set to an arbitrary value)\n    *  DBL_MAX  Maximum floating point number (can be set to an arbitrary value)\n    */\n#  include <float.h>\n\n#  if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \\\n    defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC)\n     /* We need to check that <math.h> hasn't already been included earlier\n      * as it seems it doesn't agree with <fp.h>, yet we should really use\n      * <fp.h> if possible.\n      */\n#    if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__)\n#      include <fp.h>\n#    endif\n#  else\n#    include <math.h>\n#  endif\n#  if defined(_AMIGA) && defined(__SASC) && defined(_M68881)\n     /* Amiga SAS/C: We must include builtin FPU functions when compiling using\n      * MATH=68881\n      */\n#    include <m68881.h>\n#  endif\n#endif\n\n/* This provides the non-ANSI (far) memory allocation routines. */\n#if defined(__TURBOC__) && defined(__MSDOS__)\n#  include <mem.h>\n#  include <alloc.h>\n#endif\n\n#if defined(WIN32) || defined(_Windows) || defined(_WINDOWS) || \\\n    defined(_WIN32) || defined(__WIN32__)\n#  include <windows.h>  /* defines _WINDOWS_ macro */\n#endif\n#endif /* PNG_VERSION_INFO_ONLY */\n\n/* Moved here around 1.5.0beta36 from pngconf.h */\n/* Users may want to use these so they are not private.  Any library\n * functions that are passed far data must be model-independent.\n */\n\n/* Memory model/platform independent fns */\n#ifndef PNG_ABORT\n#  ifdef _WINDOWS_\n#    define PNG_ABORT() ExitProcess(0)\n#  else\n#    define PNG_ABORT() abort()\n#  endif\n#endif\n\n/* These macros may need to be architecture dependent. */\n#define PNG_ALIGN_NONE   0 /* do not use data alignment */\n#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */\n#ifdef offsetof\n#  define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */\n#else\n#  define PNG_ALIGN_OFFSET -1 /* prevent the use of this */\n#endif\n#define PNG_ALIGN_SIZE   3 /* use sizeof to determine alignment */\n\n#ifndef PNG_ALIGN_TYPE\n   /* Default to using aligned access optimizations and requiring alignment to a\n    * multiple of the data type size.  Override in a compiler specific fashion\n    * if necessary by inserting tests here:\n    */\n#  define PNG_ALIGN_TYPE PNG_ALIGN_SIZE\n#endif\n\n#if PNG_ALIGN_TYPE == PNG_ALIGN_SIZE\n   /* This is used because in some compiler implementations non-aligned\n    * structure members are supported, so the offsetof approach below fails.\n    * Set PNG_ALIGN_SIZE=0 for compiler combinations where unaligned access\n    * is good for performance.  Do not do this unless you have tested the result\n    * and understand it.\n    */\n#  define png_alignof(type) (sizeof (type))\n#else\n#  if PNG_ALIGN_TYPE == PNG_ALIGN_OFFSET\n#     define png_alignof(type) offsetof(struct{char c; type t;}, t)\n#  else\n#     if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS\n#        define png_alignof(type) (1)\n#     endif\n      /* Else leave png_alignof undefined to prevent use thereof */\n#  endif\n#endif\n\n/* This implicitly assumes alignment is always to a power of 2. */\n#ifdef png_alignof\n#  define png_isaligned(ptr, type)\\\n   ((((const char*)ptr-(const char*)0) & (png_alignof(type)-1)) == 0)\n#else\n#  define png_isaligned(ptr, type) 0\n#endif\n\n/* End of memory model/platform independent support */\n/* End of 1.5.0beta36 move from pngconf.h */\n\n/* CONSTANTS and UTILITY MACROS\n * These are used internally by libpng and not exposed in the API\n */\n\n/* Various modes of operation.  Note that after an init, mode is set to\n * zero automatically when the structure is created.  Three of these\n * are defined in png.h because they need to be visible to applications\n * that call png_set_unknown_chunk().\n */\n/* #define PNG_HAVE_IHDR            0x01 (defined in png.h) */\n/* #define PNG_HAVE_PLTE            0x02 (defined in png.h) */\n#define PNG_HAVE_IDAT               0x04\n/* #define PNG_AFTER_IDAT           0x08 (defined in png.h) */\n#define PNG_HAVE_IEND               0x10\n                   /*               0x20 (unused) */\n                   /*               0x40 (unused) */\n                   /*               0x80 (unused) */\n#define PNG_HAVE_CHUNK_HEADER      0x100\n#define PNG_WROTE_tIME             0x200\n#define PNG_WROTE_INFO_BEFORE_PLTE 0x400\n#define PNG_BACKGROUND_IS_GRAY     0x800\n#define PNG_HAVE_PNG_SIGNATURE    0x1000\n#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */\n                   /*             0x4000 (unused) */\n#define PNG_IS_READ_STRUCT        0x8000 /* Else is a write struct */\n\n/* Flags for the transformations the PNG library does on the image data */\n#define PNG_BGR                 0x0001\n#define PNG_INTERLACE           0x0002\n#define PNG_PACK                0x0004\n#define PNG_SHIFT               0x0008\n#define PNG_SWAP_BYTES          0x0010\n#define PNG_INVERT_MONO         0x0020\n#define PNG_QUANTIZE            0x0040\n#define PNG_COMPOSE             0x0080     /* Was PNG_BACKGROUND */\n#define PNG_BACKGROUND_EXPAND   0x0100\n#define PNG_EXPAND_16           0x0200     /* Added to libpng 1.5.2 */\n#define PNG_16_TO_8             0x0400     /* Becomes 'chop' in 1.5.4 */\n#define PNG_RGBA                0x0800\n#define PNG_EXPAND              0x1000\n#define PNG_GAMMA               0x2000\n#define PNG_GRAY_TO_RGB         0x4000\n#define PNG_FILLER              0x8000\n#define PNG_PACKSWAP           0x10000\n#define PNG_SWAP_ALPHA         0x20000\n#define PNG_STRIP_ALPHA        0x40000\n#define PNG_INVERT_ALPHA       0x80000\n#define PNG_USER_TRANSFORM    0x100000\n#define PNG_RGB_TO_GRAY_ERR   0x200000\n#define PNG_RGB_TO_GRAY_WARN  0x400000\n#define PNG_RGB_TO_GRAY       0x600000 /* two bits, RGB_TO_GRAY_ERR|WARN */\n#define PNG_ENCODE_ALPHA      0x800000 /* Added to libpng-1.5.4 */\n#define PNG_ADD_ALPHA        0x1000000 /* Added to libpng-1.2.7 */\n#define PNG_EXPAND_tRNS      0x2000000 /* Added to libpng-1.2.9 */\n#define PNG_SCALE_16_TO_8    0x4000000 /* Added to libpng-1.5.4 */\n                       /*    0x8000000 unused */\n                       /*   0x10000000 unused */\n                       /*   0x20000000 unused */\n                       /*   0x40000000 unused */\n/* Flags for png_create_struct */\n#define PNG_STRUCT_PNG   0x0001\n#define PNG_STRUCT_INFO  0x0002\n\n/* Flags for the png_ptr->flags rather than declaring a byte for each one */\n#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY     0x0001\n#define PNG_FLAG_ZSTREAM_INITIALIZED      0x0002 /* Added to libpng-1.6.0 */\n                                  /*      0x0004    unused */\n#define PNG_FLAG_ZSTREAM_ENDED            0x0008 /* Added to libpng-1.6.0 */\n                                  /*      0x0010    unused */\n                                  /*      0x0020    unused */\n#define PNG_FLAG_ROW_INIT                 0x0040\n#define PNG_FLAG_FILLER_AFTER             0x0080\n#define PNG_FLAG_CRC_ANCILLARY_USE        0x0100\n#define PNG_FLAG_CRC_ANCILLARY_NOWARN     0x0200\n#define PNG_FLAG_CRC_CRITICAL_USE         0x0400\n#define PNG_FLAG_CRC_CRITICAL_IGNORE      0x0800\n#define PNG_FLAG_ASSUME_sRGB              0x1000 /* Added to libpng-1.5.4 */\n#define PNG_FLAG_OPTIMIZE_ALPHA           0x2000 /* Added to libpng-1.5.4 */\n#define PNG_FLAG_DETECT_UNINITIALIZED     0x4000 /* Added to libpng-1.5.4 */\n/* #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS      0x8000 */\n/* #define PNG_FLAG_KEEP_UNSAFE_CHUNKS      0x10000 */\n#define PNG_FLAG_LIBRARY_MISMATCH        0x20000\n#define PNG_FLAG_STRIP_ERROR_NUMBERS     0x40000\n#define PNG_FLAG_STRIP_ERROR_TEXT        0x80000\n#define PNG_FLAG_BENIGN_ERRORS_WARN     0x100000 /* Added to libpng-1.4.0 */\n#define PNG_FLAG_APP_WARNINGS_WARN      0x200000 /* Added to libpng-1.6.0 */\n#define PNG_FLAG_APP_ERRORS_WARN        0x400000 /* Added to libpng-1.6.0 */\n                                  /*    0x800000    unused */\n                                  /*   0x1000000    unused */\n                                  /*   0x2000000    unused */\n                                  /*   0x4000000    unused */\n                                  /*   0x8000000    unused */\n                                  /*  0x10000000    unused */\n                                  /*  0x20000000    unused */\n                                  /*  0x40000000    unused */\n\n#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \\\n                                     PNG_FLAG_CRC_ANCILLARY_NOWARN)\n\n#define PNG_FLAG_CRC_CRITICAL_MASK  (PNG_FLAG_CRC_CRITICAL_USE | \\\n                                     PNG_FLAG_CRC_CRITICAL_IGNORE)\n\n#define PNG_FLAG_CRC_MASK           (PNG_FLAG_CRC_ANCILLARY_MASK | \\\n                                     PNG_FLAG_CRC_CRITICAL_MASK)\n\n/* Save typing and make code easier to understand */\n\n#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \\\n   abs((int)((c1).green) - (int)((c2).green)) + \\\n   abs((int)((c1).blue) - (int)((c2).blue)))\n\n/* Added to libpng-1.6.0: scale a 16-bit value in the range 0..65535 to 0..255\n * by dividing by 257 *with rounding*.  This macro is exact for the given range.\n * See the discourse in pngrtran.c png_do_scale_16_to_8.  The values in the\n * macro were established by experiment (modifying the added value).  The macro\n * has a second variant that takes a value already scaled by 255 and divides by\n * 65535 - this has a maximum error of .502.  Over the range 0..65535*65535 it\n * only gives off-by-one errors and only for 0.5% (1 in 200) of the values.\n */\n#define PNG_DIV65535(v24) (((v24) + 32895) >> 16)\n#define PNG_DIV257(v16) PNG_DIV65535((png_uint_32)(v16) * 255)\n\n/* Added to libpng-1.2.6 JB */\n#define PNG_ROWBYTES(pixel_bits, width) \\\n    ((pixel_bits) >= 8 ? \\\n    ((png_size_t)(width) * (((png_size_t)(pixel_bits)) >> 3)) : \\\n    (( ((png_size_t)(width) * ((png_size_t)(pixel_bits))) + 7) >> 3) )\n\n/* PNG_OUT_OF_RANGE returns true if value is outside the range\n * ideal-delta..ideal+delta.  Each argument is evaluated twice.\n * \"ideal\" and \"delta\" should be constants, normally simple\n * integers, \"value\" a variable. Added to libpng-1.2.6 JB\n */\n#define PNG_OUT_OF_RANGE(value, ideal, delta) \\\n   ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) )\n\n/* Conversions between fixed and floating point, only defined if\n * required (to make sure the code doesn't accidentally use float\n * when it is supposedly disabled.)\n */\n#ifdef PNG_FLOATING_POINT_SUPPORTED\n/* The floating point conversion can't overflow, though it can and\n * does lose accuracy relative to the original fixed point value.\n * In practice this doesn't matter because png_fixed_point only\n * stores numbers with very low precision.  The png_ptr and s\n * arguments are unused by default but are there in case error\n * checking becomes a requirement.\n */\n#define png_float(png_ptr, fixed, s) (.00001 * (fixed))\n\n/* The fixed point conversion performs range checking and evaluates\n * its argument multiple times, so must be used with care.  The\n * range checking uses the PNG specification values for a signed\n * 32-bit fixed point value except that the values are deliberately\n * rounded-to-zero to an integral value - 21474 (21474.83 is roughly\n * (2^31-1) * 100000). 's' is a string that describes the value being\n * converted.\n *\n * NOTE: this macro will raise a png_error if the range check fails,\n * therefore it is normally only appropriate to use this on values\n * that come from API calls or other sources where an out of range\n * error indicates a programming error, not a data error!\n *\n * NOTE: by default this is off - the macro is not used - because the\n * function call saves a lot of code.\n */\n#ifdef PNG_FIXED_POINT_MACRO_SUPPORTED\n#define png_fixed(png_ptr, fp, s) ((fp) <= 21474 && (fp) >= -21474 ?\\\n    ((png_fixed_point)(100000 * (fp))) : (png_fixed_error(png_ptr, s),0))\n#endif\n/* else the corresponding function is defined below, inside the scope of the\n * cplusplus test.\n */\n#endif\n\n/* Constants for known chunk types.  If you need to add a chunk, define the name\n * here.  For historical reasons these constants have the form png_<name>; i.e.\n * the prefix is lower case.  Please use decimal values as the parameters to\n * match the ISO PNG specification and to avoid relying on the C locale\n * interpretation of character values.\n *\n * Prior to 1.5.6 these constants were strings, as of 1.5.6 png_uint_32 values\n * are computed and a new macro (PNG_STRING_FROM_CHUNK) added to allow a string\n * to be generated if required.\n *\n * PNG_32b correctly produces a value shifted by up to 24 bits, even on\n * architectures where (int) is only 16 bits.\n */\n#define PNG_32b(b,s) ((png_uint_32)(b) << (s))\n#define PNG_U32(b1,b2,b3,b4) \\\n   (PNG_32b(b1,24) | PNG_32b(b2,16) | PNG_32b(b3,8) | PNG_32b(b4,0))\n\n/* Constants for known chunk types.\n *\n * MAINTAINERS: If you need to add a chunk, define the name here.\n * For historical reasons these constants have the form png_<name>; i.e.\n * the prefix is lower case.  Please use decimal values as the parameters to\n * match the ISO PNG specification and to avoid relying on the C locale\n * interpretation of character values.  Please keep the list sorted.\n *\n * Notice that PNG_U32 is used to define a 32-bit value for the 4 byte chunk\n * type.  In fact the specification does not express chunk types this way,\n * however using a 32-bit value means that the chunk type can be read from the\n * stream using exactly the same code as used for a 32-bit unsigned value and\n * can be examined far more efficiently (using one arithmetic compare).\n *\n * Prior to 1.5.6 the chunk type constants were expressed as C strings.  The\n * libpng API still uses strings for 'unknown' chunks and a macro,\n * PNG_STRING_FROM_CHUNK, allows a string to be generated if required.  Notice\n * that for portable code numeric values must still be used; the string \"IHDR\"\n * is not portable and neither is PNG_U32('I', 'H', 'D', 'R').\n *\n * In 1.7.0 the definitions will be made public in png.h to avoid having to\n * duplicate the same definitions in application code.\n */\n#define png_IDAT PNG_U32( 73,  68,  65,  84)\n#define png_IEND PNG_U32( 73,  69,  78,  68)\n#define png_IHDR PNG_U32( 73,  72,  68,  82)\n#define png_PLTE PNG_U32( 80,  76,  84,  69)\n#define png_bKGD PNG_U32( 98,  75,  71,  68)\n#define png_cHRM PNG_U32( 99,  72,  82,  77)\n#define png_fRAc PNG_U32(102,  82,  65,  99) /* registered, not defined */\n#define png_gAMA PNG_U32(103,  65,  77,  65)\n#define png_gIFg PNG_U32(103,  73,  70, 103)\n#define png_gIFt PNG_U32(103,  73,  70, 116) /* deprecated */\n#define png_gIFx PNG_U32(103,  73,  70, 120)\n#define png_hIST PNG_U32(104,  73,  83,  84)\n#define png_iCCP PNG_U32(105,  67,  67,  80)\n#define png_iTXt PNG_U32(105,  84,  88, 116)\n#define png_oFFs PNG_U32(111,  70,  70, 115)\n#define png_pCAL PNG_U32(112,  67,  65,  76)\n#define png_pHYs PNG_U32(112,  72,  89, 115)\n#define png_sBIT PNG_U32(115,  66,  73,  84)\n#define png_sCAL PNG_U32(115,  67,  65,  76)\n#define png_sPLT PNG_U32(115,  80,  76,  84)\n#define png_sRGB PNG_U32(115,  82,  71,  66)\n#define png_sTER PNG_U32(115,  84,  69,  82)\n#define png_tEXt PNG_U32(116,  69,  88, 116)\n#define png_tIME PNG_U32(116,  73,  77,  69)\n#define png_tRNS PNG_U32(116,  82,  78,  83)\n#define png_zTXt PNG_U32(122,  84,  88, 116)\n\n/* The following will work on (signed char*) strings, whereas the get_uint_32\n * macro will fail on top-bit-set values because of the sign extension.\n */\n#define PNG_CHUNK_FROM_STRING(s)\\\n   PNG_U32(0xff & (s)[0], 0xff & (s)[1], 0xff & (s)[2], 0xff & (s)[3])\n\n/* This uses (char), not (png_byte) to avoid warnings on systems where (char) is\n * signed and the argument is a (char[])  This macro will fail miserably on\n * systems where (char) is more than 8 bits.\n */\n#define PNG_STRING_FROM_CHUNK(s,c)\\\n   (void)(((char*)(s))[0]=(char)(((c)>>24) & 0xff), \\\n   ((char*)(s))[1]=(char)(((c)>>16) & 0xff),\\\n   ((char*)(s))[2]=(char)(((c)>>8) & 0xff), \\\n   ((char*)(s))[3]=(char)((c & 0xff)))\n\n/* Do the same but terminate with a null character. */\n#define PNG_CSTRING_FROM_CHUNK(s,c)\\\n   (void)(PNG_STRING_FROM_CHUNK(s,c), ((char*)(s))[4] = 0)\n\n/* Test on flag values as defined in the spec (section 5.4): */\n#define PNG_CHUNK_ANCILLARY(c)   (1 & ((c) >> 29))\n#define PNG_CHUNK_CRITICAL(c)     (!PNG_CHUNK_ANCILLARY(c))\n#define PNG_CHUNK_PRIVATE(c)      (1 & ((c) >> 21))\n#define PNG_CHUNK_RESERVED(c)     (1 & ((c) >> 13))\n#define PNG_CHUNK_SAFE_TO_COPY(c) (1 & ((c) >>  5))\n\n/* Gamma values (new at libpng-1.5.4): */\n#define PNG_GAMMA_MAC_OLD 151724  /* Assume '1.8' is really 2.2/1.45! */\n#define PNG_GAMMA_MAC_INVERSE 65909\n#define PNG_GAMMA_sRGB_INVERSE 45455\n\n/* Almost everything below is C specific; the #defines above can be used in\n * non-C code (so long as it is C-preprocessed) the rest of this stuff cannot.\n */\n#ifndef PNG_VERSION_INFO_ONLY\n\n#include \"pngstruct.h\"\n#include \"pnginfo.h\"\n\n/* Validate the include paths - the include path used to generate pnglibconf.h\n * must match that used in the build, or we must be using pnglibconf.h.prebuilt:\n */\n#if PNG_ZLIB_VERNUM != 0 && PNG_ZLIB_VERNUM != ZLIB_VERNUM\n#  error ZLIB_VERNUM != PNG_ZLIB_VERNUM \\\n      \"-I (include path) error: see the notes in pngpriv.h\"\n   /* This means that when pnglibconf.h was built the copy of zlib.h that it\n    * used is not the same as the one being used here.  Because the build of\n    * libpng makes decisions to use inflateInit2 and inflateReset2 based on the\n    * zlib version number and because this affects handling of certain broken\n    * PNG files the -I directives must match.\n    *\n    * The most likely explanation is that you passed a -I in CFLAGS. This will\n    * not work; all the preprocessor directories and in particular all the -I\n    * directives must be in CPPFLAGS.\n    */\n#endif\n\n/* This is used for 16-bit gamma tables -- only the top level pointers are\n * const; this could be changed:\n */\ntypedef const png_uint_16p * png_const_uint_16pp;\n\n/* Added to libpng-1.5.7: sRGB conversion tables */\n#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\\\n   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)\n#ifdef PNG_SIMPLIFIED_READ_SUPPORTED\nPNG_INTERNAL_DATA(const png_uint_16, png_sRGB_table, [256]);\n   /* Convert from an sRGB encoded value 0..255 to a 16-bit linear value,\n    * 0..65535.  This table gives the closest 16-bit answers (no errors).\n    */\n#endif\n\nPNG_INTERNAL_DATA(const png_uint_16, png_sRGB_base, [512]);\nPNG_INTERNAL_DATA(const png_byte, png_sRGB_delta, [512]);\n\n#define PNG_sRGB_FROM_LINEAR(linear) \\\n  ((png_byte)(0xff & ((png_sRGB_base[(linear)>>15] \\\n   + ((((linear) & 0x7fff)*png_sRGB_delta[(linear)>>15])>>12)) >> 8)))\n   /* Given a value 'linear' in the range 0..255*65535 calculate the 8-bit sRGB\n    * encoded value with maximum error 0.646365.  Note that the input is not a\n    * 16-bit value; it has been multiplied by 255! */\n#endif /* SIMPLIFIED_READ/WRITE */\n\n\n/* Inhibit C++ name-mangling for libpng functions but not for system calls. */\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n/* Internal functions; these are not exported from a DLL however because they\n * are used within several of the C source files they have to be C extern.\n *\n * All of these functions must be declared with PNG_INTERNAL_FUNCTION.\n */\n\n/* Zlib support */\n#define PNG_UNEXPECTED_ZLIB_RETURN (-7)\nPNG_INTERNAL_FUNCTION(void, png_zstream_error,(png_structrp png_ptr, int ret),\n   PNG_EMPTY);\n   /* Used by the zlib handling functions to ensure that z_stream::msg is always\n    * set before they return.\n    */\n\n#ifdef PNG_WRITE_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_free_buffer_list,(png_structrp png_ptr,\n   png_compression_bufferp *list),PNG_EMPTY);\n   /* Free the buffer list used by the compressed write code. */\n#endif\n\n#if defined(PNG_FLOATING_POINT_SUPPORTED) && \\\n   !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \\\n   (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \\\n   defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \\\n   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \\\n   (defined(PNG_sCAL_SUPPORTED) && \\\n   defined(PNG_FLOATING_ARITHMETIC_SUPPORTED))\nPNG_INTERNAL_FUNCTION(png_fixed_point,png_fixed,(png_const_structrp png_ptr,\n   double fp, png_const_charp text),PNG_EMPTY);\n#endif\n\n/* Check the user version string for compatibility, returns false if the version\n * numbers aren't compatible.\n */\nPNG_INTERNAL_FUNCTION(int,png_user_version_check,(png_structrp png_ptr,\n   png_const_charp user_png_ver),PNG_EMPTY);\n\n/* Internal base allocator - no messages, NULL on failure to allocate.  This\n * does, however, call the application provided allocator and that could call\n * png_error (although that would be a bug in the application implementation.)\n */\nPNG_INTERNAL_FUNCTION(png_voidp,png_malloc_base,(png_const_structrp png_ptr,\n   png_alloc_size_t size),PNG_ALLOCATED);\n\n#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\\\n   defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)\n/* Internal array allocator, outputs no error or warning messages on failure,\n * just returns NULL.\n */\nPNG_INTERNAL_FUNCTION(png_voidp,png_malloc_array,(png_const_structrp png_ptr,\n   int nelements, size_t element_size),PNG_ALLOCATED);\n\n/* The same but an existing array is extended by add_elements.  This function\n * also memsets the new elements to 0 and copies the old elements.  The old\n * array is not freed or altered.\n */\nPNG_INTERNAL_FUNCTION(png_voidp,png_realloc_array,(png_const_structrp png_ptr,\n   png_const_voidp array, int old_elements, int add_elements,\n   size_t element_size),PNG_ALLOCATED);\n#endif /* text, sPLT or unknown chunks */\n\n/* Magic to create a struct when there is no struct to call the user supplied\n * memory allocators.  Because error handling has not been set up the memory\n * handlers can't safely call png_error, but this is an obscure and undocumented\n * restriction so libpng has to assume that the 'free' handler, at least, might\n * call png_error.\n */\nPNG_INTERNAL_FUNCTION(png_structp,png_create_png_struct,\n   (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,\n    png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn,\n    png_free_ptr free_fn),PNG_ALLOCATED);\n\n/* Free memory from internal libpng struct */\nPNG_INTERNAL_FUNCTION(void,png_destroy_png_struct,(png_structrp png_ptr),\n   PNG_EMPTY);\n\n/* Free an allocated jmp_buf (always succeeds) */\nPNG_INTERNAL_FUNCTION(void,png_free_jmpbuf,(png_structrp png_ptr),PNG_EMPTY);\n\n/* Function to allocate memory for zlib.  PNGAPI is disallowed. */\nPNG_INTERNAL_FUNCTION(voidpf,png_zalloc,(voidpf png_ptr, uInt items, uInt size),\n   PNG_ALLOCATED);\n\n/* Function to free memory for zlib.  PNGAPI is disallowed. */\nPNG_INTERNAL_FUNCTION(void,png_zfree,(voidpf png_ptr, voidpf ptr),PNG_EMPTY);\n\n/* Next four functions are used internally as callbacks.  PNGCBAPI is required\n * but not PNG_EXPORT.  PNGAPI added at libpng version 1.2.3, changed to\n * PNGCBAPI at 1.5.0\n */\n\nPNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_read_data,(png_structp png_ptr,\n    png_bytep data, png_size_t length),PNG_EMPTY);\n\n#ifdef PNG_PROGRESSIVE_READ_SUPPORTED\nPNG_INTERNAL_FUNCTION(void PNGCBAPI,png_push_fill_buffer,(png_structp png_ptr,\n    png_bytep buffer, png_size_t length),PNG_EMPTY);\n#endif\n\nPNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_write_data,(png_structp png_ptr,\n    png_bytep data, png_size_t length),PNG_EMPTY);\n\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\n#  ifdef PNG_STDIO_SUPPORTED\nPNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_flush,(png_structp png_ptr),\n   PNG_EMPTY);\n#  endif\n#endif\n\n/* Reset the CRC variable */\nPNG_INTERNAL_FUNCTION(void,png_reset_crc,(png_structrp png_ptr),PNG_EMPTY);\n\n/* Write the \"data\" buffer to whatever output you are using */\nPNG_INTERNAL_FUNCTION(void,png_write_data,(png_structrp png_ptr,\n    png_const_bytep data, png_size_t length),PNG_EMPTY);\n\n/* Read and check the PNG file signature */\nPNG_INTERNAL_FUNCTION(void,png_read_sig,(png_structrp png_ptr,\n   png_inforp info_ptr),PNG_EMPTY);\n\n/* Read the chunk header (length + type name) */\nPNG_INTERNAL_FUNCTION(png_uint_32,png_read_chunk_header,(png_structrp png_ptr),\n   PNG_EMPTY);\n\n/* Read data from whatever input you are using into the \"data\" buffer */\nPNG_INTERNAL_FUNCTION(void,png_read_data,(png_structrp png_ptr, png_bytep data,\n    png_size_t length),PNG_EMPTY);\n\n/* Read bytes into buf, and update png_ptr->crc */\nPNG_INTERNAL_FUNCTION(void,png_crc_read,(png_structrp png_ptr, png_bytep buf,\n    png_uint_32 length),PNG_EMPTY);\n\n/* Read \"skip\" bytes, read the file crc, and (optionally) verify png_ptr->crc */\nPNG_INTERNAL_FUNCTION(int,png_crc_finish,(png_structrp png_ptr,\n   png_uint_32 skip),PNG_EMPTY);\n\n/* Read the CRC from the file and compare it to the libpng calculated CRC */\nPNG_INTERNAL_FUNCTION(int,png_crc_error,(png_structrp png_ptr),PNG_EMPTY);\n\n/* Calculate the CRC over a section of data.  Note that we are only\n * passing a maximum of 64K on systems that have this as a memory limit,\n * since this is the maximum buffer size we can specify.\n */\nPNG_INTERNAL_FUNCTION(void,png_calculate_crc,(png_structrp png_ptr,\n   png_const_bytep ptr, png_size_t length),PNG_EMPTY);\n\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_flush,(png_structrp png_ptr),PNG_EMPTY);\n#endif\n\n/* Write various chunks */\n\n/* Write the IHDR chunk, and update the png_struct with the necessary\n * information.\n */\nPNG_INTERNAL_FUNCTION(void,png_write_IHDR,(png_structrp png_ptr,\n   png_uint_32 width, png_uint_32 height, int bit_depth, int color_type,\n   int compression_method, int filter_method, int interlace_method),PNG_EMPTY);\n\nPNG_INTERNAL_FUNCTION(void,png_write_PLTE,(png_structrp png_ptr,\n   png_const_colorp palette, png_uint_32 num_pal),PNG_EMPTY);\n\nPNG_INTERNAL_FUNCTION(void,png_compress_IDAT,(png_structrp png_ptr,\n   png_const_bytep row_data, png_alloc_size_t row_data_length, int flush),\n   PNG_EMPTY);\n\nPNG_INTERNAL_FUNCTION(void,png_write_IEND,(png_structrp png_ptr),PNG_EMPTY);\n\n#ifdef PNG_WRITE_gAMA_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_gAMA_fixed,(png_structrp png_ptr,\n    png_fixed_point file_gamma),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_sBIT_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_sBIT,(png_structrp png_ptr,\n    png_const_color_8p sbit, int color_type),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_cHRM_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_cHRM_fixed,(png_structrp png_ptr,\n    const png_xy *xy), PNG_EMPTY);\n    /* The xy value must have been previously validated */\n#endif\n\n#ifdef PNG_WRITE_sRGB_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_sRGB,(png_structrp png_ptr,\n    int intent),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_iCCP_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_iCCP,(png_structrp png_ptr,\n   png_const_charp name, png_const_bytep profile), PNG_EMPTY);\n   /* The profile must have been previously validated for correctness, the\n    * length comes from the first four bytes.  Only the base, deflate,\n    * compression is supported.\n    */\n#endif\n\n#ifdef PNG_WRITE_sPLT_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_sPLT,(png_structrp png_ptr,\n    png_const_sPLT_tp palette),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_tRNS_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_tRNS,(png_structrp png_ptr,\n    png_const_bytep trans, png_const_color_16p values, int number,\n    int color_type),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_bKGD_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_bKGD,(png_structrp png_ptr,\n    png_const_color_16p values, int color_type),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_hIST_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_hIST,(png_structrp png_ptr,\n    png_const_uint_16p hist, int num_hist),PNG_EMPTY);\n#endif\n\n/* Chunks that have keywords */\n#ifdef PNG_WRITE_tEXt_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_tEXt,(png_structrp png_ptr,\n   png_const_charp key, png_const_charp text, png_size_t text_len),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_zTXt_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_zTXt,(png_structrp png_ptr, png_const_charp\n    key, png_const_charp text, int compression),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_iTXt_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_iTXt,(png_structrp png_ptr,\n    int compression, png_const_charp key, png_const_charp lang,\n    png_const_charp lang_key, png_const_charp text),PNG_EMPTY);\n#endif\n\n#ifdef PNG_TEXT_SUPPORTED  /* Added at version 1.0.14 and 1.2.4 */\nPNG_INTERNAL_FUNCTION(int,png_set_text_2,(png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_textp text_ptr, int num_text),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_oFFs_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_oFFs,(png_structrp png_ptr,\n    png_int_32 x_offset, png_int_32 y_offset, int unit_type),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_pCAL_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_pCAL,(png_structrp png_ptr,\n    png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,\n    png_const_charp units, png_charpp params),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_pHYs_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_pHYs,(png_structrp png_ptr,\n    png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit,\n    int unit_type),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_tIME_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_tIME,(png_structrp png_ptr,\n    png_const_timep mod_time),PNG_EMPTY);\n#endif\n\n#ifdef PNG_WRITE_sCAL_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_write_sCAL_s,(png_structrp png_ptr,\n    int unit, png_const_charp width, png_const_charp height),PNG_EMPTY);\n#endif\n\n/* Called when finished processing a row of data */\nPNG_INTERNAL_FUNCTION(void,png_write_finish_row,(png_structrp png_ptr),\n    PNG_EMPTY);\n\n/* Internal use only.   Called before first row of data */\nPNG_INTERNAL_FUNCTION(void,png_write_start_row,(png_structrp png_ptr),\n    PNG_EMPTY);\n\n/* Combine a row of data, dealing with alpha, etc. if requested.  'row' is an\n * array of png_ptr->width pixels.  If the image is not interlaced or this\n * is the final pass this just does a memcpy, otherwise the \"display\" flag\n * is used to determine whether to copy pixels that are not in the current pass.\n *\n * Because 'png_do_read_interlace' (below) replicates pixels this allows this\n * function to achieve the documented 'blocky' appearance during interlaced read\n * if display is 1 and the 'sparkle' appearance, where existing pixels in 'row'\n * are not changed if they are not in the current pass, when display is 0.\n *\n * 'display' must be 0 or 1, otherwise the memcpy will be done regardless.\n *\n * The API always reads from the png_struct row buffer and always assumes that\n * it is full width (png_do_read_interlace has already been called.)\n *\n * This function is only ever used to write to row buffers provided by the\n * caller of the relevant libpng API and the row must have already been\n * transformed by the read transformations.\n *\n * The PNG_USE_COMPILE_TIME_MASKS option causes generation of pre-computed\n * bitmasks for use within the code, otherwise runtime generated masks are used.\n * The default is compile time masks.\n */\n#ifndef PNG_USE_COMPILE_TIME_MASKS\n#  define PNG_USE_COMPILE_TIME_MASKS 1\n#endif\nPNG_INTERNAL_FUNCTION(void,png_combine_row,(png_const_structrp png_ptr,\n    png_bytep row, int display),PNG_EMPTY);\n\n#ifdef PNG_READ_INTERLACING_SUPPORTED\n/* Expand an interlaced row: the 'row_info' describes the pass data that has\n * been read in and must correspond to the pixels in 'row', the pixels are\n * expanded (moved apart) in 'row' to match the final layout, when doing this\n * the pixels are *replicated* to the intervening space.  This is essential for\n * the correct operation of png_combine_row, above.\n */\nPNG_INTERNAL_FUNCTION(void,png_do_read_interlace,(png_row_infop row_info,\n    png_bytep row, int pass, png_uint_32 transformations),PNG_EMPTY);\n#endif\n\n/* GRR TO DO (2.0 or whenever):  simplify other internal calling interfaces */\n\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n/* Grab pixels out of a row for an interlaced pass */\nPNG_INTERNAL_FUNCTION(void,png_do_write_interlace,(png_row_infop row_info,\n    png_bytep row, int pass),PNG_EMPTY);\n#endif\n\n/* Unfilter a row: check the filter value before calling this, there is no point\n * calling it for PNG_FILTER_VALUE_NONE.\n */\nPNG_INTERNAL_FUNCTION(void,png_read_filter_row,(png_structrp pp, png_row_infop\n    row_info, png_bytep row, png_const_bytep prev_row, int filter),PNG_EMPTY);\n\nPNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_neon,(png_row_infop row_info,\n    png_bytep row, png_const_bytep prev_row),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_neon,(png_row_infop\n    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_neon,(png_row_infop\n    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_neon,(png_row_infop\n    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_neon,(png_row_infop\n    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_neon,(png_row_infop\n    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_neon,(png_row_infop\n    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);\n\n/* Choose the best filter to use and filter the row data */\nPNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr,\n    png_row_infop row_info),PNG_EMPTY);\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_read_IDAT_data,(png_structrp png_ptr,\n   png_bytep output, png_alloc_size_t avail_out),PNG_EMPTY);\n   /* Read 'avail_out' bytes of data from the IDAT stream.  If the output buffer\n    * is NULL the function checks, instead, for the end of the stream.  In this\n    * case a benign error will be issued if the stream end is not found or if\n    * extra data has to be consumed.\n    */\nPNG_INTERNAL_FUNCTION(void,png_read_finish_IDAT,(png_structrp png_ptr),\n   PNG_EMPTY);\n   /* This cleans up when the IDAT LZ stream does not end when the last image\n    * byte is read; there is still some pending input.\n    */\n\nPNG_INTERNAL_FUNCTION(void,png_read_finish_row,(png_structrp png_ptr),\n   PNG_EMPTY);\n   /* Finish a row while reading, dealing with interlacing passes, etc. */\n#endif /* SEQUENTIAL_READ */\n\n/* Initialize the row buffers, etc. */\nPNG_INTERNAL_FUNCTION(void,png_read_start_row,(png_structrp png_ptr),PNG_EMPTY);\n\n#if PNG_ZLIB_VERNUM >= 0x1240\nPNG_INTERNAL_FUNCTION(int,png_zlib_inflate,(png_structrp png_ptr, int flush),\n      PNG_EMPTY);\n#  define PNG_INFLATE(pp, flush) png_zlib_inflate(pp, flush)\n#else /* Zlib < 1.2.4 */\n#  define PNG_INFLATE(pp, flush) inflate(&(pp)->zstream, flush)\n#endif /* Zlib < 1.2.4 */\n\n#ifdef PNG_READ_TRANSFORMS_SUPPORTED\n/* Optional call to update the users info structure */\nPNG_INTERNAL_FUNCTION(void,png_read_transform_info,(png_structrp png_ptr,\n    png_inforp info_ptr),PNG_EMPTY);\n#endif\n\n/* Shared transform functions, defined in pngtran.c */\n#if defined(PNG_WRITE_FILLER_SUPPORTED) || \\\n    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)\nPNG_INTERNAL_FUNCTION(void,png_do_strip_channel,(png_row_infop row_info,\n    png_bytep row, int at_start),PNG_EMPTY);\n#endif\n\n#ifdef PNG_16BIT_SUPPORTED\n#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)\nPNG_INTERNAL_FUNCTION(void,png_do_swap,(png_row_infop row_info,\n    png_bytep row),PNG_EMPTY);\n#endif\n#endif\n\n#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \\\n    defined(PNG_WRITE_PACKSWAP_SUPPORTED)\nPNG_INTERNAL_FUNCTION(void,png_do_packswap,(png_row_infop row_info,\n    png_bytep row),PNG_EMPTY);\n#endif\n\n#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)\nPNG_INTERNAL_FUNCTION(void,png_do_invert,(png_row_infop row_info,\n    png_bytep row),PNG_EMPTY);\n#endif\n\n#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)\nPNG_INTERNAL_FUNCTION(void,png_do_bgr,(png_row_infop row_info,\n    png_bytep row),PNG_EMPTY);\n#endif\n\n/* The following decodes the appropriate chunks, and does error correction,\n * then calls the appropriate callback for the chunk if it is valid.\n */\n\n/* Decode the IHDR chunk */\nPNG_INTERNAL_FUNCTION(void,png_handle_IHDR,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_handle_PLTE,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_handle_IEND,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n\n#ifdef PNG_READ_bKGD_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_bKGD,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_cHRM_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_cHRM,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_gAMA_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_gAMA,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_hIST_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_hIST,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_iCCP_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_iCCP,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif /* READ_iCCP */\n\n#ifdef PNG_READ_iTXt_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_iTXt,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_oFFs_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_oFFs,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_pCAL_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_pCAL,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_pHYs_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_pHYs,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_sBIT_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_sBIT,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_sCAL_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_sCAL,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_sPLT_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_sPLT,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif /* READ_sPLT */\n\n#ifdef PNG_READ_sRGB_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_sRGB,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_tEXt_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_tEXt,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_tIME_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_tIME,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_tRNS_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_tRNS,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_zTXt_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_handle_zTXt,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\n#endif\n\nPNG_INTERNAL_FUNCTION(void,png_check_chunk_name,(png_structrp png_ptr,\n    png_uint_32 chunk_name),PNG_EMPTY);\n\nPNG_INTERNAL_FUNCTION(void,png_handle_unknown,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length, int keep),PNG_EMPTY);\n   /* This is the function that gets called for unknown chunks.  The 'keep'\n    * argument is either non-zero for a known chunk that has been set to be\n    * handled as unknown or zero for an unknown chunk.  By default the function\n    * just skips the chunk or errors out if it is critical.\n    */\n\n#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) ||\\\n    defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)\nPNG_INTERNAL_FUNCTION(int,png_chunk_unknown_handling,\n    (png_const_structrp png_ptr, png_uint_32 chunk_name),PNG_EMPTY);\n   /* Exactly as the API png_handle_as_unknown() except that the argument is a\n    * 32-bit chunk name, not a string.\n    */\n#endif /* READ_UNKNOWN_CHUNKS || HANDLE_AS_UNKNOWN */\n\n/* Handle the transformations for reading and writing */\n#ifdef PNG_READ_TRANSFORMS_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_do_read_transformations,(png_structrp png_ptr,\n   png_row_infop row_info),PNG_EMPTY);\n#endif\n#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_do_write_transformations,(png_structrp png_ptr,\n   png_row_infop row_info),PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_TRANSFORMS_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_init_read_transformations,(png_structrp png_ptr),\n    PNG_EMPTY);\n#endif\n\n#ifdef PNG_PROGRESSIVE_READ_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_push_read_chunk,(png_structrp png_ptr,\n    png_inforp info_ptr),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_read_sig,(png_structrp png_ptr,\n    png_inforp info_ptr),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_check_crc,(png_structrp png_ptr),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_save_buffer,(png_structrp png_ptr),\n    PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_restore_buffer,(png_structrp png_ptr,\n    png_bytep buffer, png_size_t buffer_length),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_read_IDAT,(png_structrp png_ptr),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_process_IDAT_data,(png_structrp png_ptr,\n    png_bytep buffer, png_size_t buffer_length),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_process_row,(png_structrp png_ptr),\n    PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_handle_unknown,(png_structrp png_ptr,\n   png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_have_info,(png_structrp png_ptr,\n   png_inforp info_ptr),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_have_end,(png_structrp png_ptr,\n   png_inforp info_ptr),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_have_row,(png_structrp png_ptr,\n     png_bytep row),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_read_end,(png_structrp png_ptr,\n    png_inforp info_ptr),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_process_some_data,(png_structrp png_ptr,\n    png_inforp info_ptr),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_read_push_finish_row,(png_structrp png_ptr),\n    PNG_EMPTY);\n#  ifdef PNG_READ_tEXt_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_push_handle_tEXt,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_read_tEXt,(png_structrp png_ptr,\n    png_inforp info_ptr),PNG_EMPTY);\n#  endif\n#  ifdef PNG_READ_zTXt_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_push_handle_zTXt,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_read_zTXt,(png_structrp png_ptr,\n    png_inforp info_ptr),PNG_EMPTY);\n#  endif\n#  ifdef PNG_READ_iTXt_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_push_handle_iTXt,(png_structrp png_ptr,\n    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_push_read_iTXt,(png_structrp png_ptr,\n    png_inforp info_ptr),PNG_EMPTY);\n#  endif\n\n#endif /* PROGRESSIVE_READ */\n\n/* Added at libpng version 1.6.0 */\n#ifdef PNG_GAMMA_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_colorspace_set_gamma,(png_const_structrp png_ptr,\n    png_colorspacerp colorspace, png_fixed_point gAMA), PNG_EMPTY);\n   /* Set the colorspace gamma with a value provided by the application or by\n    * the gAMA chunk on read.  The value will override anything set by an ICC\n    * profile.\n    */\n\nPNG_INTERNAL_FUNCTION(void,png_colorspace_sync_info,(png_const_structrp png_ptr,\n    png_inforp info_ptr), PNG_EMPTY);\n    /* Synchronize the info 'valid' flags with the colorspace */\n\nPNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr,\n    png_inforp info_ptr), PNG_EMPTY);\n    /* Copy the png_struct colorspace to the info_struct and call the above to\n     * synchronize the flags.  Checks for NULL info_ptr and does nothing.\n     */\n#endif\n\n/* Added at libpng version 1.4.0 */\n#ifdef PNG_COLORSPACE_SUPPORTED\n/* These internal functions are for maintaining the colorspace structure within\n * a png_info or png_struct (or, indeed, both).\n */\nPNG_INTERNAL_FUNCTION(int,png_colorspace_set_chromaticities,\n   (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_xy *xy,\n    int preferred), PNG_EMPTY);\n\nPNG_INTERNAL_FUNCTION(int,png_colorspace_set_endpoints,\n   (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_XYZ *XYZ,\n    int preferred), PNG_EMPTY);\n\n#ifdef PNG_sRGB_SUPPORTED\nPNG_INTERNAL_FUNCTION(int,png_colorspace_set_sRGB,(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, int intent), PNG_EMPTY);\n   /* This does set the colorspace gAMA and cHRM values too, but doesn't set the\n    * flags to write them, if it returns false there was a problem and an error\n    * message has already been output (but the colorspace may still need to be\n    * synced to record the invalid flag).\n    */\n#endif /* sRGB */\n\n#ifdef PNG_iCCP_SUPPORTED\nPNG_INTERNAL_FUNCTION(int,png_colorspace_set_ICC,(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, png_const_charp name,\n   png_uint_32 profile_length, png_const_bytep profile, int color_type),\n   PNG_EMPTY);\n   /* The 'name' is used for information only */\n\n/* Routines for checking parts of an ICC profile. */\nPNG_INTERNAL_FUNCTION(int,png_icc_check_length,(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, png_const_charp name,\n   png_uint_32 profile_length), PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(int,png_icc_check_header,(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, png_const_charp name,\n   png_uint_32 profile_length,\n   png_const_bytep profile /* first 132 bytes only */, int color_type),\n   PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(int,png_icc_check_tag_table,(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, png_const_charp name,\n   png_uint_32 profile_length,\n   png_const_bytep profile /* header plus whole tag table */), PNG_EMPTY);\n#ifdef PNG_sRGB_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_icc_set_sRGB,(\n   png_const_structrp png_ptr, png_colorspacerp colorspace,\n   png_const_bytep profile, uLong adler), PNG_EMPTY);\n   /* 'adler' is the Adler32 checksum of the uncompressed profile data. It may\n    * be zero to indicate that it is not available.  It is used, if provided,\n    * as a fast check on the profile when checking to see if it is sRGB.\n    */\n#endif\n#endif /* iCCP */\n\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_colorspace_set_rgb_coefficients,\n   (png_structrp png_ptr), PNG_EMPTY);\n   /* Set the rgb_to_gray coefficients from the colorspace Y values */\n#endif /* READ_RGB_TO_GRAY */\n#endif /* COLORSPACE */\n\n/* Added at libpng version 1.4.0 */\nPNG_INTERNAL_FUNCTION(void,png_check_IHDR,(png_const_structrp png_ptr,\n    png_uint_32 width, png_uint_32 height, int bit_depth,\n    int color_type, int interlace_type, int compression_type,\n    int filter_type),PNG_EMPTY);\n\n/* Added at libpng version 1.5.10 */\n#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \\\n    defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)\nPNG_INTERNAL_FUNCTION(void,png_do_check_palette_indexes,\n   (png_structrp png_ptr, png_row_infop row_info),PNG_EMPTY);\n#endif\n\n#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)\nPNG_INTERNAL_FUNCTION(void,png_fixed_error,(png_const_structrp png_ptr,\n   png_const_charp name),PNG_NORETURN);\n#endif\n\n/* Puts 'string' into 'buffer' at buffer[pos], taking care never to overwrite\n * the end.  Always leaves the buffer nul terminated.  Never errors out (and\n * there is no error code.)\n */\nPNG_INTERNAL_FUNCTION(size_t,png_safecat,(png_charp buffer, size_t bufsize,\n   size_t pos, png_const_charp string),PNG_EMPTY);\n\n/* Various internal functions to handle formatted warning messages, currently\n * only implemented for warnings.\n */\n#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED)\n/* Utility to dump an unsigned value into a buffer, given a start pointer and\n * and end pointer (which should point just *beyond* the end of the buffer!)\n * Returns the pointer to the start of the formatted string.  This utility only\n * does unsigned values.\n */\nPNG_INTERNAL_FUNCTION(png_charp,png_format_number,(png_const_charp start,\n   png_charp end, int format, png_alloc_size_t number),PNG_EMPTY);\n\n/* Convenience macro that takes an array: */\n#define PNG_FORMAT_NUMBER(buffer,format,number) \\\n   png_format_number(buffer, buffer + (sizeof buffer), format, number)\n\n/* Suggested size for a number buffer (enough for 64 bits and a sign!) */\n#define PNG_NUMBER_BUFFER_SIZE 24\n\n/* These are the integer formats currently supported, the name is formed from\n * the standard printf(3) format string.\n */\n#define PNG_NUMBER_FORMAT_u     1 /* chose unsigned API! */\n#define PNG_NUMBER_FORMAT_02u   2\n#define PNG_NUMBER_FORMAT_d     1 /* chose signed API! */\n#define PNG_NUMBER_FORMAT_02d   2\n#define PNG_NUMBER_FORMAT_x     3\n#define PNG_NUMBER_FORMAT_02x   4\n#define PNG_NUMBER_FORMAT_fixed 5 /* choose the signed API */\n#endif\n\n#ifdef PNG_WARNINGS_SUPPORTED\n/* New defines and members adding in libpng-1.5.4 */\n#  define PNG_WARNING_PARAMETER_SIZE 32\n#  define PNG_WARNING_PARAMETER_COUNT 8 /* Maximum 9; see pngerror.c */\n\n/* An l-value of this type has to be passed to the APIs below to cache the\n * values of the parameters to a formatted warning message.\n */\ntypedef char png_warning_parameters[PNG_WARNING_PARAMETER_COUNT][\n   PNG_WARNING_PARAMETER_SIZE];\n\nPNG_INTERNAL_FUNCTION(void,png_warning_parameter,(png_warning_parameters p,\n   int number, png_const_charp string),PNG_EMPTY);\n   /* Parameters are limited in size to PNG_WARNING_PARAMETER_SIZE characters,\n    * including the trailing '\\0'.\n    */\nPNG_INTERNAL_FUNCTION(void,png_warning_parameter_unsigned,\n   (png_warning_parameters p, int number, int format, png_alloc_size_t value),\n   PNG_EMPTY);\n   /* Use png_alloc_size_t because it is an unsigned type as big as any we\n    * need to output.  Use the following for a signed value.\n    */\nPNG_INTERNAL_FUNCTION(void,png_warning_parameter_signed,\n   (png_warning_parameters p, int number, int format, png_int_32 value),\n   PNG_EMPTY);\n\nPNG_INTERNAL_FUNCTION(void,png_formatted_warning,(png_const_structrp png_ptr,\n   png_warning_parameters p, png_const_charp message),PNG_EMPTY);\n   /* 'message' follows the X/Open approach of using @1, @2 to insert\n    * parameters previously supplied using the above functions.  Errors in\n    * specifying the parameters will simply result in garbage substitutions.\n    */\n#endif\n\n#ifdef PNG_BENIGN_ERRORS_SUPPORTED\n/* Application errors (new in 1.6); use these functions (declared below) for\n * errors in the parameters or order of API function calls on read.  The\n * 'warning' should be used for an error that can be handled completely; the\n * 'error' for one which can be handled safely but which may lose application\n * information or settings.\n *\n * By default these both result in a png_error call prior to release, while in a\n * released version the 'warning' is just a warning.  However if the application\n * explicitly disables benign errors (explicitly permitting the code to lose\n * information) they both turn into warnings.\n *\n * If benign errors aren't supported they end up as the corresponding base call\n * (png_warning or png_error.)\n */\nPNG_INTERNAL_FUNCTION(void,png_app_warning,(png_const_structrp png_ptr,\n   png_const_charp message),PNG_EMPTY);\n   /* The application provided invalid parameters to an API function or called\n    * an API function at the wrong time, libpng can completely recover.\n    */\n\nPNG_INTERNAL_FUNCTION(void,png_app_error,(png_const_structrp png_ptr,\n   png_const_charp message),PNG_EMPTY);\n   /* As above but libpng will ignore the call, or attempt some other partial\n    * recovery from the error.\n    */\n#else\n#  define png_app_warning(pp,s) png_warning(pp,s)\n#  define png_app_error(pp,s) png_error(pp,s)\n#endif\n\nPNG_INTERNAL_FUNCTION(void,png_chunk_report,(png_const_structrp png_ptr,\n   png_const_charp message, int error),PNG_EMPTY);\n   /* Report a recoverable issue in chunk data.  On read this is used to report\n    * a problem found while reading a particular chunk and the\n    * png_chunk_benign_error or png_chunk_warning function is used as\n    * appropriate.  On write this is used to report an error that comes from\n    * data set via an application call to a png_set_ API and png_app_error or\n    * png_app_warning is used as appropriate.\n    *\n    * The 'error' parameter must have one of the following values:\n    */\n#define PNG_CHUNK_WARNING     0 /* never an error */\n#define PNG_CHUNK_WRITE_ERROR 1 /* an error only on write */\n#define PNG_CHUNK_ERROR       2 /* always an error */\n\n/* ASCII to FP interfaces, currently only implemented if sCAL\n * support is required.\n */\n#if defined(PNG_sCAL_SUPPORTED)\n/* MAX_DIGITS is actually the maximum number of characters in an sCAL\n * width or height, derived from the precision (number of significant\n * digits - a build time settable option) and assumptions about the\n * maximum ridiculous exponent.\n */\n#define PNG_sCAL_MAX_DIGITS (PNG_sCAL_PRECISION+1/*.*/+1/*E*/+10/*exponent*/)\n\n#ifdef PNG_FLOATING_POINT_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_ascii_from_fp,(png_const_structrp png_ptr,\n   png_charp ascii, png_size_t size, double fp, unsigned int precision),\n   PNG_EMPTY);\n#endif /* FLOATING_POINT */\n\n#ifdef PNG_FIXED_POINT_SUPPORTED\nPNG_INTERNAL_FUNCTION(void,png_ascii_from_fixed,(png_const_structrp png_ptr,\n   png_charp ascii, png_size_t size, png_fixed_point fp),PNG_EMPTY);\n#endif /* FIXED_POINT */\n#endif /* sCAL */\n\n#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED)\n/* An internal API to validate the format of a floating point number.\n * The result is the index of the next character.  If the number is\n * not valid it will be the index of a character in the supposed number.\n *\n * The format of a number is defined in the PNG extensions specification\n * and this API is strictly conformant to that spec, not anyone elses!\n *\n * The format as a regular expression is:\n *\n * [+-]?[0-9]+.?([Ee][+-]?[0-9]+)?\n *\n * or:\n *\n * [+-]?.[0-9]+(.[0-9]+)?([Ee][+-]?[0-9]+)?\n *\n * The complexity is that either integer or fraction must be present and the\n * fraction is permitted to have no digits only if the integer is present.\n *\n * NOTE: The dangling E problem.\n *   There is a PNG valid floating point number in the following:\n *\n *       PNG floating point numbers are not greedy.\n *\n *   Working this out requires *TWO* character lookahead (because of the\n *   sign), the parser does not do this - it will fail at the 'r' - this\n *   doesn't matter for PNG sCAL chunk values, but it requires more care\n *   if the value were ever to be embedded in something more complex.  Use\n *   ANSI-C strtod if you need the lookahead.\n */\n/* State table for the parser. */\n#define PNG_FP_INTEGER    0  /* before or in integer */\n#define PNG_FP_FRACTION   1  /* before or in fraction */\n#define PNG_FP_EXPONENT   2  /* before or in exponent */\n#define PNG_FP_STATE      3  /* mask for the above */\n#define PNG_FP_SAW_SIGN   4  /* Saw +/- in current state */\n#define PNG_FP_SAW_DIGIT  8  /* Saw a digit in current state */\n#define PNG_FP_SAW_DOT   16  /* Saw a dot in current state */\n#define PNG_FP_SAW_E     32  /* Saw an E (or e) in current state */\n#define PNG_FP_SAW_ANY   60  /* Saw any of the above 4 */\n\n/* These three values don't affect the parser.  They are set but not used.\n */\n#define PNG_FP_WAS_VALID 64  /* Preceding substring is a valid fp number */\n#define PNG_FP_NEGATIVE 128  /* A negative number, including \"-0\" */\n#define PNG_FP_NONZERO  256  /* A non-zero value */\n#define PNG_FP_STICKY   448  /* The above three flags */\n\n/* This is available for the caller to store in 'state' if required.  Do not\n * call the parser after setting it (the parser sometimes clears it.)\n */\n#define PNG_FP_INVALID  512  /* Available for callers as a distinct value */\n\n/* Result codes for the parser (boolean - true meants ok, false means\n * not ok yet.)\n */\n#define PNG_FP_MAYBE      0  /* The number may be valid in the future */\n#define PNG_FP_OK         1  /* The number is valid */\n\n/* Tests on the sticky non-zero and negative flags.  To pass these checks\n * the state must also indicate that the whole number is valid - this is\n * achieved by testing PNG_FP_SAW_DIGIT (see the implementation for why this\n * is equivalent to PNG_FP_OK above.)\n */\n#define PNG_FP_NZ_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NEGATIVE | PNG_FP_NONZERO)\n   /* NZ_MASK: the string is valid and a non-zero negative value */\n#define PNG_FP_Z_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NONZERO)\n   /* Z MASK: the string is valid and a non-zero value. */\n   /* PNG_FP_SAW_DIGIT: the string is valid. */\n#define PNG_FP_IS_ZERO(state) (((state) & PNG_FP_Z_MASK) == PNG_FP_SAW_DIGIT)\n#define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK)\n#define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK)\n\n/* The actual parser.  This can be called repeatedly. It updates\n * the index into the string and the state variable (which must\n * be initialized to 0).  It returns a result code, as above.  There\n * is no point calling the parser any more if it fails to advance to\n * the end of the string - it is stuck on an invalid character (or\n * terminated by '\\0').\n *\n * Note that the pointer will consume an E or even an E+ and then leave\n * a 'maybe' state even though a preceding integer.fraction is valid.\n * The PNG_FP_WAS_VALID flag indicates that a preceding substring was\n * a valid number.  It's possible to recover from this by calling\n * the parser again (from the start, with state 0) but with a string\n * that omits the last character (i.e. set the size to the index of\n * the problem character.)  This has not been tested within libpng.\n */\nPNG_INTERNAL_FUNCTION(int,png_check_fp_number,(png_const_charp string,\n   png_size_t size, int *statep, png_size_tp whereami),PNG_EMPTY);\n\n/* This is the same but it checks a complete string and returns true\n * only if it just contains a floating point number.  As of 1.5.4 this\n * function also returns the state at the end of parsing the number if\n * it was valid (otherwise it returns 0.)  This can be used for testing\n * for negative or zero values using the sticky flag.\n */\nPNG_INTERNAL_FUNCTION(int,png_check_fp_string,(png_const_charp string,\n   png_size_t size),PNG_EMPTY);\n#endif /* pCAL || sCAL */\n\n#if defined(PNG_GAMMA_SUPPORTED) ||\\\n    defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED)\n/* Added at libpng version 1.5.0 */\n/* This is a utility to provide a*times/div (rounded) and indicate\n * if there is an overflow.  The result is a boolean - false (0)\n * for overflow, true (1) if no overflow, in which case *res\n * holds the result.\n */\nPNG_INTERNAL_FUNCTION(int,png_muldiv,(png_fixed_point_p res, png_fixed_point a,\n   png_int_32 multiplied_by, png_int_32 divided_by),PNG_EMPTY);\n#endif\n\n#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED)\n/* Same deal, but issue a warning on overflow and return 0. */\nPNG_INTERNAL_FUNCTION(png_fixed_point,png_muldiv_warn,\n   (png_const_structrp png_ptr, png_fixed_point a, png_int_32 multiplied_by,\n   png_int_32 divided_by),PNG_EMPTY);\n#endif\n\n#ifdef PNG_GAMMA_SUPPORTED\n/* Calculate a reciprocal - used for gamma values.  This returns\n * 0 if the argument is 0 in order to maintain an undefined value;\n * there are no warnings.\n */\nPNG_INTERNAL_FUNCTION(png_fixed_point,png_reciprocal,(png_fixed_point a),\n   PNG_EMPTY);\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n/* The same but gives a reciprocal of the product of two fixed point\n * values.  Accuracy is suitable for gamma calculations but this is\n * not exact - use png_muldiv for that.  Only required at present on read.\n */\nPNG_INTERNAL_FUNCTION(png_fixed_point,png_reciprocal2,(png_fixed_point a,\n   png_fixed_point b),PNG_EMPTY);\n#endif\n\n/* Return true if the gamma value is significantly different from 1.0 */\nPNG_INTERNAL_FUNCTION(int,png_gamma_significant,(png_fixed_point gamma_value),\n   PNG_EMPTY);\n#endif\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n/* Internal fixed point gamma correction.  These APIs are called as\n * required to convert single values - they don't need to be fast,\n * they are not used when processing image pixel values.\n *\n * While the input is an 'unsigned' value it must actually be the\n * correct bit value - 0..255 or 0..65535 as required.\n */\nPNG_INTERNAL_FUNCTION(png_uint_16,png_gamma_correct,(png_structrp png_ptr,\n   unsigned int value, png_fixed_point gamma_value),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(png_uint_16,png_gamma_16bit_correct,(unsigned int value,\n   png_fixed_point gamma_value),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(png_byte,png_gamma_8bit_correct,(unsigned int value,\n   png_fixed_point gamma_value),PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_destroy_gamma_table,(png_structrp png_ptr),\n   PNG_EMPTY);\nPNG_INTERNAL_FUNCTION(void,png_build_gamma_table,(png_structrp png_ptr,\n   int bit_depth),PNG_EMPTY);\n#endif\n\n/* SIMPLIFIED READ/WRITE SUPPORT */\n#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\\\n   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)\n/* The internal structure that png_image::opaque points to. */\ntypedef struct png_control\n{\n   png_structp png_ptr;\n   png_infop   info_ptr;\n   png_voidp   error_buf;           /* Always a jmp_buf at present. */\n\n   png_const_bytep memory;          /* Memory buffer. */\n   png_size_t      size;            /* Size of the memory buffer. */\n\n   unsigned int for_write       :1; /* Otherwise it is a read structure */\n   unsigned int owned_file      :1; /* We own the file in io_ptr */\n} png_control;\n\n/* Return the pointer to the jmp_buf from a png_control: necessary because C\n * does not reveal the type of the elements of jmp_buf.\n */\n#ifdef __cplusplus\n#  define png_control_jmp_buf(pc) (((jmp_buf*)((pc)->error_buf))[0])\n#else\n#  define png_control_jmp_buf(pc) ((pc)->error_buf)\n#endif\n\n/* Utility to safely execute a piece of libpng code catching and logging any\n * errors that might occur.  Returns true on success, false on failure (either\n * of the function or as a result of a png_error.)\n */\nPNG_INTERNAL_CALLBACK(void,png_safe_error,(png_structp png_ptr,\n   png_const_charp error_message),PNG_NORETURN);\n\n#ifdef PNG_WARNINGS_SUPPORTED\nPNG_INTERNAL_CALLBACK(void,png_safe_warning,(png_structp png_ptr,\n   png_const_charp warning_message),PNG_EMPTY);\n#else\n#  define png_safe_warning 0/*dummy argument*/\n#endif\n\nPNG_INTERNAL_FUNCTION(int,png_safe_execute,(png_imagep image,\n   int (*function)(png_voidp), png_voidp arg),PNG_EMPTY);\n\n/* Utility to log an error; this also cleans up the png_image; the function\n * always returns 0 (false).\n */\nPNG_INTERNAL_FUNCTION(int,png_image_error,(png_imagep image,\n   png_const_charp error_message),PNG_EMPTY);\n\n#ifndef PNG_SIMPLIFIED_READ_SUPPORTED\n/* png_image_free is used by the write code but not exported */\nPNG_INTERNAL_FUNCTION(void, png_image_free, (png_imagep image), PNG_EMPTY);\n#endif /* !SIMPLIFIED_READ */\n\n#endif /* SIMPLIFIED READ/WRITE */\n\n/* These are initialization functions for hardware specific PNG filter\n * optimizations; list these here then select the appropriate one at compile\n * time using the macro PNG_FILTER_OPTIMIZATIONS.  If the macro is not defined\n * the generic code is used.\n */\n#ifdef PNG_FILTER_OPTIMIZATIONS\nPNG_INTERNAL_FUNCTION(void, PNG_FILTER_OPTIMIZATIONS, (png_structp png_ptr,\n   unsigned int bpp), PNG_EMPTY);\n   /* Just declare the optimization that will be used */\n#else\n   /* List *all* the possible optimizations here - this branch is required if\n    * the builder of libpng passes the definition of PNG_FILTER_OPTIMIZATIONS in\n    * CFLAGS in place of CPPFLAGS *and* uses symbol prefixing.\n    */\nPNG_INTERNAL_FUNCTION(void, png_init_filter_functions_neon,\n   (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);\n#endif\n\nPNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,\n   png_const_charp key, png_bytep new_key), PNG_EMPTY);\n\n/* Maintainer: Put new private prototypes here ^ */\n\n#include \"pngdebug.h\"\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* PNG_VERSION_INFO_ONLY */\n#endif /* PNGPRIV_H */\n"
  },
  {
    "path": "libs/SDL2_png/include/pngstruct.h",
    "content": "\n/* pngstruct.h - header file for PNG reference library\n *\n * Last changed in libpng 1.6.18 [July 23, 2015]\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n/* The structure that holds the information to read and write PNG files.\n * The only people who need to care about what is inside of this are the\n * people who will be modifying the library for their own special needs.\n * It should NOT be accessed directly by an application.\n */\n\n#ifndef PNGSTRUCT_H\n#define PNGSTRUCT_H\n/* zlib.h defines the structure z_stream, an instance of which is included\n * in this structure and is required for decompressing the LZ compressed\n * data in PNG files.\n */\n#ifndef ZLIB_CONST\n   /* We must ensure that zlib uses 'const' in declarations. */\n#  define ZLIB_CONST\n#endif\n#include \"zlib.h\"\n#ifdef const\n   /* zlib.h sometimes #defines const to nothing, undo this. */\n#  undef const\n#endif\n\n/* zlib.h has mediocre z_const use before 1.2.6, this stuff is for compatibility\n * with older builds.\n */\n#if ZLIB_VERNUM < 0x1260\n#  define PNGZ_MSG_CAST(s) png_constcast(char*,s)\n#  define PNGZ_INPUT_CAST(b) png_constcast(png_bytep,b)\n#else\n#  define PNGZ_MSG_CAST(s) (s)\n#  define PNGZ_INPUT_CAST(b) (b)\n#endif\n\n/* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib\n * can handle at once.  This type need be no larger than 16 bits (so maximum of\n * 65535), this define allows us to discover how big it is, but limited by the\n * maximuum for png_size_t.  The value can be overriden in a library build\n * (pngusr.h, or set it in CPPFLAGS) and it works to set it to a considerably\n * lower value (e.g. 255 works).  A lower value may help memory usage (slightly)\n * and may even improve performance on some systems (and degrade it on others.)\n */\n#ifndef ZLIB_IO_MAX\n#  define ZLIB_IO_MAX ((uInt)-1)\n#endif\n\n#ifdef PNG_WRITE_SUPPORTED\n/* The type of a compression buffer list used by the write code. */\ntypedef struct png_compression_buffer\n{\n   struct png_compression_buffer *next;\n   png_byte                       output[1]; /* actually zbuf_size */\n} png_compression_buffer, *png_compression_bufferp;\n\n#define PNG_COMPRESSION_BUFFER_SIZE(pp)\\\n   (offsetof(png_compression_buffer, output) + (pp)->zbuffer_size)\n#endif\n\n/* Colorspace support; structures used in png_struct, png_info and in internal\n * functions to hold and communicate information about the color space.\n *\n * PNG_COLORSPACE_SUPPORTED is only required if the application will perform\n * colorspace corrections, otherwise all the colorspace information can be\n * skipped and the size of libpng can be reduced (significantly) by compiling\n * out the colorspace support.\n */\n#ifdef PNG_COLORSPACE_SUPPORTED\n/* The chromaticities of the red, green and blue colorants and the chromaticity\n * of the corresponding white point (i.e. of rgb(1.0,1.0,1.0)).\n */\ntypedef struct png_xy\n{\n   png_fixed_point redx, redy;\n   png_fixed_point greenx, greeny;\n   png_fixed_point bluex, bluey;\n   png_fixed_point whitex, whitey;\n} png_xy;\n\n/* The same data as above but encoded as CIE XYZ values.  When this data comes\n * from chromaticities the sum of the Y values is assumed to be 1.0\n */\ntypedef struct png_XYZ\n{\n   png_fixed_point red_X, red_Y, red_Z;\n   png_fixed_point green_X, green_Y, green_Z;\n   png_fixed_point blue_X, blue_Y, blue_Z;\n} png_XYZ;\n#endif /* COLORSPACE */\n\n#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)\n/* A colorspace is all the above plus, potentially, profile information;\n * however at present libpng does not use the profile internally so it is only\n * stored in the png_info struct (if iCCP is supported.)  The rendering intent\n * is retained here and is checked.\n *\n * The file gamma encoding information is also stored here and gamma correction\n * is done by libpng, whereas color correction must currently be done by the\n * application.\n */\ntypedef struct png_colorspace\n{\n#ifdef PNG_GAMMA_SUPPORTED\n   png_fixed_point gamma;        /* File gamma */\n#endif\n\n#ifdef PNG_COLORSPACE_SUPPORTED\n   png_xy      end_points_xy;    /* End points as chromaticities */\n   png_XYZ     end_points_XYZ;   /* End points as CIE XYZ colorant values */\n   png_uint_16 rendering_intent; /* Rendering intent of a profile */\n#endif\n\n   /* Flags are always defined to simplify the code. */\n   png_uint_16 flags;            /* As defined below */\n} png_colorspace, * PNG_RESTRICT png_colorspacerp;\n\ntypedef const png_colorspace * PNG_RESTRICT png_const_colorspacerp;\n\n/* General flags for the 'flags' field */\n#define PNG_COLORSPACE_HAVE_GAMMA           0x0001\n#define PNG_COLORSPACE_HAVE_ENDPOINTS       0x0002\n#define PNG_COLORSPACE_HAVE_INTENT          0x0004\n#define PNG_COLORSPACE_FROM_gAMA            0x0008\n#define PNG_COLORSPACE_FROM_cHRM            0x0010\n#define PNG_COLORSPACE_FROM_sRGB            0x0020\n#define PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB 0x0040\n#define PNG_COLORSPACE_MATCHES_sRGB         0x0080 /* exact match on profile */\n#define PNG_COLORSPACE_INVALID              0x8000\n#define PNG_COLORSPACE_CANCEL(flags)        (0xffff ^ (flags))\n#endif /* COLORSPACE || GAMMA */\n\nstruct png_struct_def\n{\n#ifdef PNG_SETJMP_SUPPORTED\n   jmp_buf jmp_buf_local;     /* New name in 1.6.0 for jmp_buf in png_struct */\n   png_longjmp_ptr longjmp_fn;/* setjmp non-local goto function. */\n   jmp_buf *jmp_buf_ptr;      /* passed to longjmp_fn */\n   size_t jmp_buf_size;       /* size of the above, if allocated */\n#endif\n   png_error_ptr error_fn;    /* function for printing errors and aborting */\n#ifdef PNG_WARNINGS_SUPPORTED\n   png_error_ptr warning_fn;  /* function for printing warnings */\n#endif\n   png_voidp error_ptr;       /* user supplied struct for error functions */\n   png_rw_ptr write_data_fn;  /* function for writing output data */\n   png_rw_ptr read_data_fn;   /* function for reading input data */\n   png_voidp io_ptr;          /* ptr to application struct for I/O functions */\n\n#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED\n   png_user_transform_ptr read_user_transform_fn; /* user read transform */\n#endif\n\n#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED\n   png_user_transform_ptr write_user_transform_fn; /* user write transform */\n#endif\n\n/* These were added in libpng-1.0.2 */\n#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED\n#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \\\n    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)\n   png_voidp user_transform_ptr; /* user supplied struct for user transform */\n   png_byte user_transform_depth;    /* bit depth of user transformed pixels */\n   png_byte user_transform_channels; /* channels in user transformed pixels */\n#endif\n#endif\n\n   png_uint_32 mode;          /* tells us where we are in the PNG file */\n   png_uint_32 flags;         /* flags indicating various things to libpng */\n   png_uint_32 transformations; /* which transformations to perform */\n\n   png_uint_32 zowner;        /* ID (chunk type) of zstream owner, 0 if none */\n   z_stream    zstream;       /* decompression structure */\n\n#ifdef PNG_WRITE_SUPPORTED\n   png_compression_bufferp zbuffer_list; /* Created on demand during write */\n   uInt                    zbuffer_size; /* size of the actual buffer */\n\n   int zlib_level;            /* holds zlib compression level */\n   int zlib_method;           /* holds zlib compression method */\n   int zlib_window_bits;      /* holds zlib compression window bits */\n   int zlib_mem_level;        /* holds zlib compression memory level */\n   int zlib_strategy;         /* holds zlib compression strategy */\n#endif\n/* Added at libpng 1.5.4 */\n#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED\n   int zlib_text_level;            /* holds zlib compression level */\n   int zlib_text_method;           /* holds zlib compression method */\n   int zlib_text_window_bits;      /* holds zlib compression window bits */\n   int zlib_text_mem_level;        /* holds zlib compression memory level */\n   int zlib_text_strategy;         /* holds zlib compression strategy */\n#endif\n/* End of material added at libpng 1.5.4 */\n/* Added at libpng 1.6.0 */\n#ifdef PNG_WRITE_SUPPORTED\n   int zlib_set_level;        /* Actual values set into the zstream on write */\n   int zlib_set_method;\n   int zlib_set_window_bits;\n   int zlib_set_mem_level;\n   int zlib_set_strategy;\n#endif\n\n   png_uint_32 width;         /* width of image in pixels */\n   png_uint_32 height;        /* height of image in pixels */\n   png_uint_32 num_rows;      /* number of rows in current pass */\n   png_uint_32 usr_width;     /* width of row at start of write */\n   png_size_t rowbytes;       /* size of row in bytes */\n   png_uint_32 iwidth;        /* width of current interlaced row in pixels */\n   png_uint_32 row_number;    /* current row in interlace pass */\n   png_uint_32 chunk_name;    /* PNG_CHUNK() id of current chunk */\n   png_bytep prev_row;        /* buffer to save previous (unfiltered) row.\n                               * While reading this is a pointer into\n                               * big_prev_row; while writing it is separately\n                               * allocated if needed.\n                               */\n   png_bytep row_buf;         /* buffer to save current (unfiltered) row.\n                               * While reading, this is a pointer into\n                               * big_row_buf; while writing it is separately\n                               * allocated.\n                               */\n#ifdef PNG_WRITE_FILTER_SUPPORTED\n   png_bytep try_row;    /* buffer to save trial row when filtering */\n   png_bytep tst_row;    /* buffer to save best trial row when filtering */\n#endif\n   png_size_t info_rowbytes;  /* Added in 1.5.4: cache of updated row bytes */\n\n   png_uint_32 idat_size;     /* current IDAT size for read */\n   png_uint_32 crc;           /* current chunk CRC value */\n   png_colorp palette;        /* palette from the input file */\n   png_uint_16 num_palette;   /* number of color entries in palette */\n\n/* Added at libpng-1.5.10 */\n#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED\n   int num_palette_max;       /* maximum palette index found in IDAT */\n#endif\n\n   png_uint_16 num_trans;     /* number of transparency values */\n   png_byte compression;      /* file compression type (always 0) */\n   png_byte filter;           /* file filter type (always 0) */\n   png_byte interlaced;       /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */\n   png_byte pass;             /* current interlace pass (0 - 6) */\n   png_byte do_filter;        /* row filter flags (see PNG_FILTER_ below ) */\n   png_byte color_type;       /* color type of file */\n   png_byte bit_depth;        /* bit depth of file */\n   png_byte usr_bit_depth;    /* bit depth of users row: write only */\n   png_byte pixel_depth;      /* number of bits per pixel */\n   png_byte channels;         /* number of channels in file */\n#ifdef PNG_WRITE_SUPPORTED\n   png_byte usr_channels;     /* channels at start of write: write only */\n#endif\n   png_byte sig_bytes;        /* magic bytes read/written from start of file */\n   png_byte maximum_pixel_depth;\n                              /* pixel depth used for the row buffers */\n   png_byte transformed_pixel_depth;\n                              /* pixel depth after read/write transforms */\n#if PNG_ZLIB_VERNUM >= 0x1240\n   png_byte zstream_start;    /* at start of an input zlib stream */\n#endif /* Zlib >= 1.2.4 */\n#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)\n   png_uint_16 filler;           /* filler bytes for pixel expansion */\n#endif\n\n#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) ||\\\n   defined(PNG_READ_ALPHA_MODE_SUPPORTED)\n   png_byte background_gamma_type;\n   png_fixed_point background_gamma;\n   png_color_16 background;   /* background color in screen gamma space */\n#ifdef PNG_READ_GAMMA_SUPPORTED\n   png_color_16 background_1; /* background normalized to gamma 1.0 */\n#endif\n#endif /* bKGD */\n\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\n   png_flush_ptr output_flush_fn; /* Function for flushing output */\n   png_uint_32 flush_dist;    /* how many rows apart to flush, 0 - no flush */\n   png_uint_32 flush_rows;    /* number of rows written since last flush */\n#endif\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n   int gamma_shift;      /* number of \"insignificant\" bits in 16-bit gamma */\n   png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */\n\n   png_bytep gamma_table;     /* gamma table for 8-bit depth files */\n   png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \\\n   defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \\\n   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)\n   png_bytep gamma_from_1;    /* converts from 1.0 to screen */\n   png_bytep gamma_to_1;      /* converts from file to 1.0 */\n   png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */\n   png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */\n#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */\n#endif\n\n#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED)\n   png_color_8 sig_bit;       /* significant bits in each available channel */\n#endif\n\n#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)\n   png_color_8 shift;         /* shift for significant bit tranformation */\n#endif\n\n#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \\\n || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)\n   png_bytep trans_alpha;           /* alpha values for paletted files */\n   png_color_16 trans_color;  /* transparent color for non-paletted files */\n#endif\n\n   png_read_status_ptr read_row_fn;   /* called after each row is decoded */\n   png_write_status_ptr write_row_fn; /* called after each row is encoded */\n#ifdef PNG_PROGRESSIVE_READ_SUPPORTED\n   png_progressive_info_ptr info_fn; /* called after header data fully read */\n   png_progressive_row_ptr row_fn;   /* called after a prog. row is decoded */\n   png_progressive_end_ptr end_fn;   /* called after image is complete */\n   png_bytep save_buffer_ptr;        /* current location in save_buffer */\n   png_bytep save_buffer;            /* buffer for previously read data */\n   png_bytep current_buffer_ptr;     /* current location in current_buffer */\n   png_bytep current_buffer;         /* buffer for recently used data */\n   png_uint_32 push_length;          /* size of current input chunk */\n   png_uint_32 skip_length;          /* bytes to skip in input data */\n   png_size_t save_buffer_size;      /* amount of data now in save_buffer */\n   png_size_t save_buffer_max;       /* total size of save_buffer */\n   png_size_t buffer_size;           /* total amount of available input data */\n   png_size_t current_buffer_size;   /* amount of data now in current_buffer */\n   int process_mode;                 /* what push library is currently doing */\n   int cur_palette;                  /* current push library palette index */\n\n#endif /* PROGRESSIVE_READ */\n\n#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)\n/* For the Borland special 64K segment handler */\n   png_bytepp offset_table_ptr;\n   png_bytep offset_table;\n   png_uint_16 offset_table_number;\n   png_uint_16 offset_table_count;\n   png_uint_16 offset_table_count_free;\n#endif\n\n#ifdef PNG_READ_QUANTIZE_SUPPORTED\n   png_bytep palette_lookup; /* lookup table for quantizing */\n   png_bytep quantize_index; /* index translation for palette files */\n#endif\n\n/* Options */\n#ifdef PNG_SET_OPTION_SUPPORTED\n   png_byte options;           /* On/off state (up to 4 options) */\n#endif\n\n#if PNG_LIBPNG_VER < 10700\n/* To do: remove this from libpng-1.7 */\n#ifdef PNG_TIME_RFC1123_SUPPORTED\n   char time_buffer[29]; /* String to hold RFC 1123 time text */\n#endif\n#endif\n\n/* New members added in libpng-1.0.6 */\n\n   png_uint_32 free_me;    /* flags items libpng is responsible for freeing */\n\n#ifdef PNG_USER_CHUNKS_SUPPORTED\n   png_voidp user_chunk_ptr;\n#ifdef PNG_READ_USER_CHUNKS_SUPPORTED\n   png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */\n#endif\n#endif\n\n#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n   int          unknown_default; /* As PNG_HANDLE_* */\n   unsigned int num_chunk_list;  /* Number of entries in the list */\n   png_bytep    chunk_list;      /* List of png_byte[5]; the textual chunk name\n                                  * followed by a PNG_HANDLE_* byte */\n#endif\n\n/* New members added in libpng-1.0.3 */\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\n   png_byte rgb_to_gray_status;\n   /* Added in libpng 1.5.5 to record setting of coefficients: */\n   png_byte rgb_to_gray_coefficients_set;\n   /* These were changed from png_byte in libpng-1.0.6 */\n   png_uint_16 rgb_to_gray_red_coeff;\n   png_uint_16 rgb_to_gray_green_coeff;\n   /* deleted in 1.5.5: rgb_to_gray_blue_coeff; */\n#endif\n\n/* New member added in libpng-1.0.4 (renamed in 1.0.9) */\n#if defined(PNG_MNG_FEATURES_SUPPORTED)\n/* Changed from png_byte to png_uint_32 at version 1.2.0 */\n   png_uint_32 mng_features_permitted;\n#endif\n\n/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n   png_byte filter_type;\n#endif\n\n/* New members added in libpng-1.2.0 */\n\n/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */\n#ifdef PNG_USER_MEM_SUPPORTED\n   png_voidp mem_ptr;             /* user supplied struct for mem functions */\n   png_malloc_ptr malloc_fn;      /* function for allocating memory */\n   png_free_ptr free_fn;          /* function for freeing memory */\n#endif\n\n/* New member added in libpng-1.0.13 and 1.2.0 */\n   png_bytep big_row_buf;         /* buffer to save current (unfiltered) row */\n\n#ifdef PNG_READ_QUANTIZE_SUPPORTED\n/* The following three members were added at version 1.0.14 and 1.2.4 */\n   png_bytep quantize_sort;          /* working sort array */\n   png_bytep index_to_palette;       /* where the original index currently is\n                                        in the palette */\n   png_bytep palette_to_index;       /* which original index points to this\n                                         palette color */\n#endif\n\n/* New members added in libpng-1.0.16 and 1.2.6 */\n   png_byte compression_type;\n\n#ifdef PNG_USER_LIMITS_SUPPORTED\n   png_uint_32 user_width_max;\n   png_uint_32 user_height_max;\n\n   /* Added in libpng-1.4.0: Total number of sPLT, text, and unknown\n    * chunks that can be stored (0 means unlimited).\n    */\n   png_uint_32 user_chunk_cache_max;\n\n   /* Total memory that a zTXt, sPLT, iTXt, iCCP, or unknown chunk\n    * can occupy when decompressed.  0 means unlimited.\n    */\n   png_alloc_size_t user_chunk_malloc_max;\n#endif\n\n/* New member added in libpng-1.0.25 and 1.2.17 */\n#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED\n   /* Temporary storage for unknown chunk that the library doesn't recognize,\n    * used while reading the chunk.\n    */\n   png_unknown_chunk unknown_chunk;\n#endif\n\n/* New member added in libpng-1.2.26 */\n  png_size_t old_big_row_buf_size;\n\n#ifdef PNG_READ_SUPPORTED\n/* New member added in libpng-1.2.30 */\n  png_bytep        read_buffer;      /* buffer for reading chunk data */\n  png_alloc_size_t read_buffer_size; /* current size of the buffer */\n#endif\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n  uInt             IDAT_read_size;   /* limit on read buffer size for IDAT */\n#endif\n\n#ifdef PNG_IO_STATE_SUPPORTED\n/* New member added in libpng-1.4.0 */\n   png_uint_32 io_state;\n#endif\n\n/* New member added in libpng-1.5.6 */\n   png_bytep big_prev_row;\n\n/* New member added in libpng-1.5.7 */\n   void (*read_filter[PNG_FILTER_VALUE_LAST-1])(png_row_infop row_info,\n      png_bytep row, png_const_bytep prev_row);\n\n#ifdef PNG_READ_SUPPORTED\n#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)\n   png_colorspace   colorspace;\n#endif\n#endif\n};\n#endif /* PNGSTRUCT_H */\n"
  },
  {
    "path": "libs/SDL2_png/src/png.c",
    "content": "\n/* png.c - location for general purpose libpng functions\n *\n * Last changed in libpng 1.6.19 [November 12, 2015]\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n#include \"pngpriv.h\"\n\n/* Generate a compiler error if there is an old png.h in the search path. */\ntypedef png_libpng_version_1_6_23 Your_png_h_is_not_version_1_6_23;\n\n/* Tells libpng that we have already handled the first \"num_bytes\" bytes\n * of the PNG file signature.  If the PNG data is embedded into another\n * stream we can set num_bytes = 8 so that libpng will not attempt to read\n * or write any of the magic bytes before it starts on the IHDR.\n */\n\n#ifdef PNG_READ_SUPPORTED\nvoid PNGAPI\npng_set_sig_bytes(png_structrp png_ptr, int num_bytes)\n{\n   unsigned int nb = (unsigned int)num_bytes;\n\n   png_debug(1, \"in png_set_sig_bytes\");\n\n   if (png_ptr == NULL)\n      return;\n\n   if (num_bytes < 0)\n      nb = 0;\n\n   if (nb > 8)\n      png_error(png_ptr, \"Too many bytes for PNG signature\");\n\n   png_ptr->sig_bytes = (png_byte)nb;\n}\n\n/* Checks whether the supplied bytes match the PNG signature.  We allow\n * checking less than the full 8-byte signature so that those apps that\n * already read the first few bytes of a file to determine the file type\n * can simply check the remaining bytes for extra assurance.  Returns\n * an integer less than, equal to, or greater than zero if sig is found,\n * respectively, to be less than, to match, or be greater than the correct\n * PNG signature (this is the same behavior as strcmp, memcmp, etc).\n */\nint PNGAPI\npng_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check)\n{\n   png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};\n\n   if (num_to_check > 8)\n      num_to_check = 8;\n\n   else if (num_to_check < 1)\n      return (-1);\n\n   if (start > 7)\n      return (-1);\n\n   if (start + num_to_check > 8)\n      num_to_check = 8 - start;\n\n   return ((int)(memcmp(&sig[start], &png_signature[start], num_to_check)));\n}\n\n#endif /* READ */\n\n#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)\n/* Function to allocate memory for zlib */\nPNG_FUNCTION(voidpf /* PRIVATE */,\npng_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED)\n{\n   png_alloc_size_t num_bytes = size;\n\n   if (png_ptr == NULL)\n      return NULL;\n\n   if (items >= (~(png_alloc_size_t)0)/size)\n   {\n      png_warning (png_voidcast(png_structrp, png_ptr),\n         \"Potential overflow in png_zalloc()\");\n      return NULL;\n   }\n\n   num_bytes *= items;\n   return png_malloc_warn(png_voidcast(png_structrp, png_ptr), num_bytes);\n}\n\n/* Function to free memory for zlib */\nvoid /* PRIVATE */\npng_zfree(voidpf png_ptr, voidpf ptr)\n{\n   png_free(png_voidcast(png_const_structrp,png_ptr), ptr);\n}\n\n/* Reset the CRC variable to 32 bits of 1's.  Care must be taken\n * in case CRC is > 32 bits to leave the top bits 0.\n */\nvoid /* PRIVATE */\npng_reset_crc(png_structrp png_ptr)\n{\n   /* The cast is safe because the crc is a 32-bit value. */\n   png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);\n}\n\n/* Calculate the CRC over a section of data.  We can only pass as\n * much data to this routine as the largest single buffer size.  We\n * also check that this data will actually be used before going to the\n * trouble of calculating it.\n */\nvoid /* PRIVATE */\npng_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)\n{\n   int need_crc = 1;\n\n   if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0)\n   {\n      if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==\n          (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))\n         need_crc = 0;\n   }\n\n   else /* critical */\n   {\n      if ((png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) != 0)\n         need_crc = 0;\n   }\n\n   /* 'uLong' is defined in zlib.h as unsigned long; this means that on some\n    * systems it is a 64-bit value.  crc32, however, returns 32 bits so the\n    * following cast is safe.  'uInt' may be no more than 16 bits, so it is\n    * necessary to perform a loop here.\n    */\n   if (need_crc != 0 && length > 0)\n   {\n      uLong crc = png_ptr->crc; /* Should never issue a warning */\n\n      do\n      {\n         uInt safe_length = (uInt)length;\n#ifndef __COVERITY__\n         if (safe_length == 0)\n            safe_length = (uInt)-1; /* evil, but safe */\n#endif\n\n         crc = crc32(crc, ptr, safe_length);\n\n         /* The following should never issue compiler warnings; if they do the\n          * target system has characteristics that will probably violate other\n          * assumptions within the libpng code.\n          */\n         ptr += safe_length;\n         length -= safe_length;\n      }\n      while (length > 0);\n\n      /* And the following is always safe because the crc is only 32 bits. */\n      png_ptr->crc = (png_uint_32)crc;\n   }\n}\n\n/* Check a user supplied version number, called from both read and write\n * functions that create a png_struct.\n */\nint\npng_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)\n{\n     /* Libpng versions 1.0.0 and later are binary compatible if the version\n      * string matches through the second '.'; we must recompile any\n      * applications that use any older library version.\n      */\n\n   if (user_png_ver != NULL)\n   {\n      int i = -1;\n      int found_dots = 0;\n\n      do\n      {\n         i++;\n         if (user_png_ver[i] != PNG_LIBPNG_VER_STRING[i])\n            png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;\n         if (user_png_ver[i] == '.')\n            found_dots++;\n      } while (found_dots < 2 && user_png_ver[i] != 0 &&\n            PNG_LIBPNG_VER_STRING[i] != 0);\n   }\n\n   else\n      png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;\n\n   if ((png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) != 0)\n   {\n#ifdef PNG_WARNINGS_SUPPORTED\n      size_t pos = 0;\n      char m[128];\n\n      pos = png_safecat(m, (sizeof m), pos,\n          \"Application built with libpng-\");\n      pos = png_safecat(m, (sizeof m), pos, user_png_ver);\n      pos = png_safecat(m, (sizeof m), pos, \" but running with \");\n      pos = png_safecat(m, (sizeof m), pos, PNG_LIBPNG_VER_STRING);\n      PNG_UNUSED(pos)\n\n      png_warning(png_ptr, m);\n#endif\n\n#ifdef PNG_ERROR_NUMBERS_SUPPORTED\n      png_ptr->flags = 0;\n#endif\n\n      return 0;\n   }\n\n   /* Success return. */\n   return 1;\n}\n\n/* Generic function to create a png_struct for either read or write - this\n * contains the common initialization.\n */\nPNG_FUNCTION(png_structp /* PRIVATE */,\npng_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,\n    png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,\n    png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)\n{\n   png_struct create_struct;\n#  ifdef PNG_SETJMP_SUPPORTED\n      jmp_buf create_jmp_buf;\n#  endif\n\n   /* This temporary stack-allocated structure is used to provide a place to\n    * build enough context to allow the user provided memory allocator (if any)\n    * to be called.\n    */\n   memset(&create_struct, 0, (sizeof create_struct));\n\n   /* Added at libpng-1.2.6 */\n#  ifdef PNG_USER_LIMITS_SUPPORTED\n      create_struct.user_width_max = PNG_USER_WIDTH_MAX;\n      create_struct.user_height_max = PNG_USER_HEIGHT_MAX;\n\n#     ifdef PNG_USER_CHUNK_CACHE_MAX\n      /* Added at libpng-1.2.43 and 1.4.0 */\n      create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;\n#     endif\n\n#     ifdef PNG_USER_CHUNK_MALLOC_MAX\n      /* Added at libpng-1.2.43 and 1.4.1, required only for read but exists\n       * in png_struct regardless.\n       */\n      create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;\n#     endif\n#  endif\n\n   /* The following two API calls simply set fields in png_struct, so it is safe\n    * to do them now even though error handling is not yet set up.\n    */\n#  ifdef PNG_USER_MEM_SUPPORTED\n      png_set_mem_fn(&create_struct, mem_ptr, malloc_fn, free_fn);\n#  else\n      PNG_UNUSED(mem_ptr)\n      PNG_UNUSED(malloc_fn)\n      PNG_UNUSED(free_fn)\n#  endif\n\n   /* (*error_fn) can return control to the caller after the error_ptr is set,\n    * this will result in a memory leak unless the error_fn does something\n    * extremely sophisticated.  The design lacks merit but is implicit in the\n    * API.\n    */\n   png_set_error_fn(&create_struct, error_ptr, error_fn, warn_fn);\n\n#  ifdef PNG_SETJMP_SUPPORTED\n      if (!setjmp(create_jmp_buf))\n#  endif\n      {\n#  ifdef PNG_SETJMP_SUPPORTED\n         /* Temporarily fake out the longjmp information until we have\n          * successfully completed this function.  This only works if we have\n          * setjmp() support compiled in, but it is safe - this stuff should\n          * never happen.\n          */\n         create_struct.jmp_buf_ptr = &create_jmp_buf;\n         create_struct.jmp_buf_size = 0; /*stack allocation*/\n         create_struct.longjmp_fn = longjmp;\n#  endif\n         /* Call the general version checker (shared with read and write code):\n          */\n         if (png_user_version_check(&create_struct, user_png_ver) != 0)\n         {\n            png_structrp png_ptr = png_voidcast(png_structrp,\n               png_malloc_warn(&create_struct, (sizeof *png_ptr)));\n\n            if (png_ptr != NULL)\n            {\n               /* png_ptr->zstream holds a back-pointer to the png_struct, so\n                * this can only be done now:\n                */\n               create_struct.zstream.zalloc = png_zalloc;\n               create_struct.zstream.zfree = png_zfree;\n               create_struct.zstream.opaque = png_ptr;\n\n#              ifdef PNG_SETJMP_SUPPORTED\n               /* Eliminate the local error handling: */\n               create_struct.jmp_buf_ptr = NULL;\n               create_struct.jmp_buf_size = 0;\n               create_struct.longjmp_fn = 0;\n#              endif\n\n               *png_ptr = create_struct;\n\n               /* This is the successful return point */\n               return png_ptr;\n            }\n         }\n      }\n\n   /* A longjmp because of a bug in the application storage allocator or a\n    * simple failure to allocate the png_struct.\n    */\n   return NULL;\n}\n\n/* Allocate the memory for an info_struct for the application. */\nPNG_FUNCTION(png_infop,PNGAPI\npng_create_info_struct,(png_const_structrp png_ptr),PNG_ALLOCATED)\n{\n   png_inforp info_ptr;\n\n   png_debug(1, \"in png_create_info_struct\");\n\n   if (png_ptr == NULL)\n      return NULL;\n\n   /* Use the internal API that does not (or at least should not) error out, so\n    * that this call always returns ok.  The application typically sets up the\n    * error handling *after* creating the info_struct because this is the way it\n    * has always been done in 'example.c'.\n    */\n   info_ptr = png_voidcast(png_inforp, png_malloc_base(png_ptr,\n      (sizeof *info_ptr)));\n\n   if (info_ptr != NULL)\n      memset(info_ptr, 0, (sizeof *info_ptr));\n\n   return info_ptr;\n}\n\n/* This function frees the memory associated with a single info struct.\n * Normally, one would use either png_destroy_read_struct() or\n * png_destroy_write_struct() to free an info struct, but this may be\n * useful for some applications.  From libpng 1.6.0 this function is also used\n * internally to implement the png_info release part of the 'struct' destroy\n * APIs.  This ensures that all possible approaches free the same data (all of\n * it).\n */\nvoid PNGAPI\npng_destroy_info_struct(png_const_structrp png_ptr, png_infopp info_ptr_ptr)\n{\n   png_inforp info_ptr = NULL;\n\n   png_debug(1, \"in png_destroy_info_struct\");\n\n   if (png_ptr == NULL)\n      return;\n\n   if (info_ptr_ptr != NULL)\n      info_ptr = *info_ptr_ptr;\n\n   if (info_ptr != NULL)\n   {\n      /* Do this first in case of an error below; if the app implements its own\n       * memory management this can lead to png_free calling png_error, which\n       * will abort this routine and return control to the app error handler.\n       * An infinite loop may result if it then tries to free the same info\n       * ptr.\n       */\n      *info_ptr_ptr = NULL;\n\n      png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);\n      memset(info_ptr, 0, (sizeof *info_ptr));\n      png_free(png_ptr, info_ptr);\n   }\n}\n\n/* Initialize the info structure.  This is now an internal function (0.89)\n * and applications using it are urged to use png_create_info_struct()\n * instead.  Use deprecated in 1.6.0, internal use removed (used internally it\n * is just a memset).\n *\n * NOTE: it is almost inconceivable that this API is used because it bypasses\n * the user-memory mechanism and the user error handling/warning mechanisms in\n * those cases where it does anything other than a memset.\n */\nPNG_FUNCTION(void,PNGAPI\npng_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size),\n   PNG_DEPRECATED)\n{\n   png_inforp info_ptr = *ptr_ptr;\n\n   png_debug(1, \"in png_info_init_3\");\n\n   if (info_ptr == NULL)\n      return;\n\n   if ((sizeof (png_info)) > png_info_struct_size)\n   {\n      *ptr_ptr = NULL;\n      /* The following line is why this API should not be used: */\n      free(info_ptr);\n      info_ptr = png_voidcast(png_inforp, png_malloc_base(NULL,\n         (sizeof *info_ptr)));\n      if (info_ptr == NULL)\n         return;\n      *ptr_ptr = info_ptr;\n   }\n\n   /* Set everything to 0 */\n   memset(info_ptr, 0, (sizeof *info_ptr));\n}\n\n/* The following API is not called internally */\nvoid PNGAPI\npng_data_freer(png_const_structrp png_ptr, png_inforp info_ptr,\n   int freer, png_uint_32 mask)\n{\n   png_debug(1, \"in png_data_freer\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   if (freer == PNG_DESTROY_WILL_FREE_DATA)\n      info_ptr->free_me |= mask;\n\n   else if (freer == PNG_USER_WILL_FREE_DATA)\n      info_ptr->free_me &= ~mask;\n\n   else\n      png_error(png_ptr, \"Unknown freer parameter in png_data_freer\");\n}\n\nvoid PNGAPI\npng_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,\n   int num)\n{\n   png_debug(1, \"in png_free_data\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n#ifdef PNG_TEXT_SUPPORTED\n   /* Free text item num or (if num == -1) all text items */\n   if (info_ptr->text != 0 &&\n       ((mask & PNG_FREE_TEXT) & info_ptr->free_me) != 0)\n   {\n      if (num != -1)\n      {\n         png_free(png_ptr, info_ptr->text[num].key);\n         info_ptr->text[num].key = NULL;\n      }\n\n      else\n      {\n         int i;\n\n         for (i = 0; i < info_ptr->num_text; i++)\n            png_free(png_ptr, info_ptr->text[i].key);\n\n         png_free(png_ptr, info_ptr->text);\n         info_ptr->text = NULL;\n         info_ptr->num_text = 0;\n      }\n   }\n#endif\n\n#ifdef PNG_tRNS_SUPPORTED\n   /* Free any tRNS entry */\n   if (((mask & PNG_FREE_TRNS) & info_ptr->free_me) != 0)\n   {\n      info_ptr->valid &= ~PNG_INFO_tRNS;\n      png_free(png_ptr, info_ptr->trans_alpha);\n      info_ptr->trans_alpha = NULL;\n      info_ptr->num_trans = 0;\n   }\n#endif\n\n#ifdef PNG_sCAL_SUPPORTED\n   /* Free any sCAL entry */\n   if (((mask & PNG_FREE_SCAL) & info_ptr->free_me) != 0)\n   {\n      png_free(png_ptr, info_ptr->scal_s_width);\n      png_free(png_ptr, info_ptr->scal_s_height);\n      info_ptr->scal_s_width = NULL;\n      info_ptr->scal_s_height = NULL;\n      info_ptr->valid &= ~PNG_INFO_sCAL;\n   }\n#endif\n\n#ifdef PNG_pCAL_SUPPORTED\n   /* Free any pCAL entry */\n   if (((mask & PNG_FREE_PCAL) & info_ptr->free_me) != 0)\n   {\n      png_free(png_ptr, info_ptr->pcal_purpose);\n      png_free(png_ptr, info_ptr->pcal_units);\n      info_ptr->pcal_purpose = NULL;\n      info_ptr->pcal_units = NULL;\n\n      if (info_ptr->pcal_params != NULL)\n         {\n            int i;\n\n            for (i = 0; i < info_ptr->pcal_nparams; i++)\n               png_free(png_ptr, info_ptr->pcal_params[i]);\n\n            png_free(png_ptr, info_ptr->pcal_params);\n            info_ptr->pcal_params = NULL;\n         }\n      info_ptr->valid &= ~PNG_INFO_pCAL;\n   }\n#endif\n\n#ifdef PNG_iCCP_SUPPORTED\n   /* Free any profile entry */\n   if (((mask & PNG_FREE_ICCP) & info_ptr->free_me) != 0)\n   {\n      png_free(png_ptr, info_ptr->iccp_name);\n      png_free(png_ptr, info_ptr->iccp_profile);\n      info_ptr->iccp_name = NULL;\n      info_ptr->iccp_profile = NULL;\n      info_ptr->valid &= ~PNG_INFO_iCCP;\n   }\n#endif\n\n#ifdef PNG_sPLT_SUPPORTED\n   /* Free a given sPLT entry, or (if num == -1) all sPLT entries */\n   if (info_ptr->splt_palettes != 0 &&\n       ((mask & PNG_FREE_SPLT) & info_ptr->free_me) != 0)\n   {\n      if (num != -1)\n      {\n         png_free(png_ptr, info_ptr->splt_palettes[num].name);\n         png_free(png_ptr, info_ptr->splt_palettes[num].entries);\n         info_ptr->splt_palettes[num].name = NULL;\n         info_ptr->splt_palettes[num].entries = NULL;\n      }\n\n      else\n      {\n         int i;\n\n         for (i = 0; i < info_ptr->splt_palettes_num; i++)\n         {\n            png_free(png_ptr, info_ptr->splt_palettes[i].name);\n            png_free(png_ptr, info_ptr->splt_palettes[i].entries);\n         }\n\n         png_free(png_ptr, info_ptr->splt_palettes);\n         info_ptr->splt_palettes = NULL;\n         info_ptr->splt_palettes_num = 0;\n         info_ptr->valid &= ~PNG_INFO_sPLT;\n      }\n   }\n#endif\n\n#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\n   if (info_ptr->unknown_chunks != 0 &&\n       ((mask & PNG_FREE_UNKN) & info_ptr->free_me) != 0)\n   {\n      if (num != -1)\n      {\n          png_free(png_ptr, info_ptr->unknown_chunks[num].data);\n          info_ptr->unknown_chunks[num].data = NULL;\n      }\n\n      else\n      {\n         int i;\n\n         for (i = 0; i < info_ptr->unknown_chunks_num; i++)\n            png_free(png_ptr, info_ptr->unknown_chunks[i].data);\n\n         png_free(png_ptr, info_ptr->unknown_chunks);\n         info_ptr->unknown_chunks = NULL;\n         info_ptr->unknown_chunks_num = 0;\n      }\n   }\n#endif\n\n#ifdef PNG_hIST_SUPPORTED\n   /* Free any hIST entry */\n   if (((mask & PNG_FREE_HIST) & info_ptr->free_me) != 0)\n   {\n      png_free(png_ptr, info_ptr->hist);\n      info_ptr->hist = NULL;\n      info_ptr->valid &= ~PNG_INFO_hIST;\n   }\n#endif\n\n   /* Free any PLTE entry that was internally allocated */\n   if (((mask & PNG_FREE_PLTE) & info_ptr->free_me) != 0)\n   {\n      png_free(png_ptr, info_ptr->palette);\n      info_ptr->palette = NULL;\n      info_ptr->valid &= ~PNG_INFO_PLTE;\n      info_ptr->num_palette = 0;\n   }\n\n#ifdef PNG_INFO_IMAGE_SUPPORTED\n   /* Free any image bits attached to the info structure */\n   if (((mask & PNG_FREE_ROWS) & info_ptr->free_me) != 0)\n   {\n      if (info_ptr->row_pointers != 0)\n      {\n         png_uint_32 row;\n         for (row = 0; row < info_ptr->height; row++)\n            png_free(png_ptr, info_ptr->row_pointers[row]);\n\n         png_free(png_ptr, info_ptr->row_pointers);\n         info_ptr->row_pointers = NULL;\n      }\n      info_ptr->valid &= ~PNG_INFO_IDAT;\n   }\n#endif\n\n   if (num != -1)\n      mask &= ~PNG_FREE_MUL;\n\n   info_ptr->free_me &= ~mask;\n}\n#endif /* READ || WRITE */\n\n/* This function returns a pointer to the io_ptr associated with the user\n * functions.  The application should free any memory associated with this\n * pointer before png_write_destroy() or png_read_destroy() are called.\n */\npng_voidp PNGAPI\npng_get_io_ptr(png_const_structrp png_ptr)\n{\n   if (png_ptr == NULL)\n      return (NULL);\n\n   return (png_ptr->io_ptr);\n}\n\n#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)\n#  ifdef PNG_STDIO_SUPPORTED\n/* Initialize the default input/output functions for the PNG file.  If you\n * use your own read or write routines, you can call either png_set_read_fn()\n * or png_set_write_fn() instead of png_init_io().  If you have defined\n * PNG_NO_STDIO or otherwise disabled PNG_STDIO_SUPPORTED, you must use a\n * function of your own because \"FILE *\" isn't necessarily available.\n */\nvoid PNGAPI\npng_init_io(png_structrp png_ptr, png_FILE_p fp)\n{\n   png_debug(1, \"in png_init_io\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->io_ptr = (png_voidp)fp;\n}\n#  endif\n\n#  ifdef PNG_SAVE_INT_32_SUPPORTED\n/* PNG signed integers are saved in 32-bit 2's complement format.  ANSI C-90\n * defines a cast of a signed integer to an unsigned integer either to preserve\n * the value, if it is positive, or to calculate:\n *\n *     (UNSIGNED_MAX+1) + integer\n *\n * Where UNSIGNED_MAX is the appropriate maximum unsigned value, so when the\n * negative integral value is added the result will be an unsigned value\n * correspnding to the 2's complement representation.\n */\nvoid PNGAPI\npng_save_int_32(png_bytep buf, png_int_32 i)\n{\n   png_save_uint_32(buf, i);\n}\n#  endif\n\n#  ifdef PNG_TIME_RFC1123_SUPPORTED\n/* Convert the supplied time into an RFC 1123 string suitable for use in\n * a \"Creation Time\" or other text-based time string.\n */\nint PNGAPI\npng_convert_to_rfc1123_buffer(char out[29], png_const_timep ptime)\n{\n   static PNG_CONST char short_months[12][4] =\n        {\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n         \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"};\n\n   if (out == NULL)\n      return 0;\n\n   if (ptime->year > 9999 /* RFC1123 limitation */ ||\n       ptime->month == 0    ||  ptime->month > 12  ||\n       ptime->day   == 0    ||  ptime->day   > 31  ||\n       ptime->hour  > 23    ||  ptime->minute > 59 ||\n       ptime->second > 60)\n      return 0;\n\n   {\n      size_t pos = 0;\n      char number_buf[5]; /* enough for a four-digit year */\n\n#     define APPEND_STRING(string) pos = png_safecat(out, 29, pos, (string))\n#     define APPEND_NUMBER(format, value)\\\n         APPEND_STRING(PNG_FORMAT_NUMBER(number_buf, format, (value)))\n#     define APPEND(ch) if (pos < 28) out[pos++] = (ch)\n\n      APPEND_NUMBER(PNG_NUMBER_FORMAT_u, (unsigned)ptime->day);\n      APPEND(' ');\n      APPEND_STRING(short_months[(ptime->month - 1)]);\n      APPEND(' ');\n      APPEND_NUMBER(PNG_NUMBER_FORMAT_u, ptime->year);\n      APPEND(' ');\n      APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->hour);\n      APPEND(':');\n      APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->minute);\n      APPEND(':');\n      APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->second);\n      APPEND_STRING(\" +0000\"); /* This reliably terminates the buffer */\n      PNG_UNUSED (pos)\n\n#     undef APPEND\n#     undef APPEND_NUMBER\n#     undef APPEND_STRING\n   }\n\n   return 1;\n}\n\n#    if PNG_LIBPNG_VER < 10700\n/* To do: remove the following from libpng-1.7 */\n/* Original API that uses a private buffer in png_struct.\n * Deprecated because it causes png_struct to carry a spurious temporary\n * buffer (png_struct::time_buffer), better to have the caller pass this in.\n */\npng_const_charp PNGAPI\npng_convert_to_rfc1123(png_structrp png_ptr, png_const_timep ptime)\n{\n   if (png_ptr != NULL)\n   {\n      /* The only failure above if png_ptr != NULL is from an invalid ptime */\n      if (png_convert_to_rfc1123_buffer(png_ptr->time_buffer, ptime) == 0)\n         png_warning(png_ptr, \"Ignoring invalid time value\");\n\n      else\n         return png_ptr->time_buffer;\n   }\n\n   return NULL;\n}\n#    endif /* LIBPNG_VER < 10700 */\n#  endif /* TIME_RFC1123 */\n\n#endif /* READ || WRITE */\n\npng_const_charp PNGAPI\npng_get_copyright(png_const_structrp png_ptr)\n{\n   PNG_UNUSED(png_ptr)  /* Silence compiler warning about unused png_ptr */\n#ifdef PNG_STRING_COPYRIGHT\n   return PNG_STRING_COPYRIGHT\n#else\n#  ifdef __STDC__\n   return PNG_STRING_NEWLINE \\\n      \"libpng version 1.6.23 - June 9, 2016\" PNG_STRING_NEWLINE \\\n      \"Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\" \\\n      PNG_STRING_NEWLINE \\\n      \"Copyright (c) 1996-1997 Andreas Dilger\" PNG_STRING_NEWLINE \\\n      \"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\" \\\n      PNG_STRING_NEWLINE;\n#  else\n   return \"libpng version 1.6.23 - June 9, 2016\\\n      Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\\\n      Copyright (c) 1996-1997 Andreas Dilger\\\n      Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\";\n#  endif\n#endif\n}\n\n/* The following return the library version as a short string in the\n * format 1.0.0 through 99.99.99zz.  To get the version of *.h files\n * used with your application, print out PNG_LIBPNG_VER_STRING, which\n * is defined in png.h.\n * Note: now there is no difference between png_get_libpng_ver() and\n * png_get_header_ver().  Due to the version_nn_nn_nn typedef guard,\n * it is guaranteed that png.c uses the correct version of png.h.\n */\npng_const_charp PNGAPI\npng_get_libpng_ver(png_const_structrp png_ptr)\n{\n   /* Version of *.c files used when building libpng */\n   return png_get_header_ver(png_ptr);\n}\n\npng_const_charp PNGAPI\npng_get_header_ver(png_const_structrp png_ptr)\n{\n   /* Version of *.h files used when building libpng */\n   PNG_UNUSED(png_ptr)  /* Silence compiler warning about unused png_ptr */\n   return PNG_LIBPNG_VER_STRING;\n}\n\npng_const_charp PNGAPI\npng_get_header_version(png_const_structrp png_ptr)\n{\n   /* Returns longer string containing both version and date */\n   PNG_UNUSED(png_ptr)  /* Silence compiler warning about unused png_ptr */\n#ifdef __STDC__\n   return PNG_HEADER_VERSION_STRING\n#  ifndef PNG_READ_SUPPORTED\n      \" (NO READ SUPPORT)\"\n#  endif\n      PNG_STRING_NEWLINE;\n#else\n   return PNG_HEADER_VERSION_STRING;\n#endif\n}\n\n#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED\n/* NOTE: this routine is not used internally! */\n/* Build a grayscale palette.  Palette is assumed to be 1 << bit_depth\n * large of png_color.  This lets grayscale images be treated as\n * paletted.  Most useful for gamma correction and simplification\n * of code.  This API is not used internally.\n */\nvoid PNGAPI\npng_build_grayscale_palette(int bit_depth, png_colorp palette)\n{\n   int num_palette;\n   int color_inc;\n   int i;\n   int v;\n\n   png_debug(1, \"in png_do_build_grayscale_palette\");\n\n   if (palette == NULL)\n      return;\n\n   switch (bit_depth)\n   {\n      case 1:\n         num_palette = 2;\n         color_inc = 0xff;\n         break;\n\n      case 2:\n         num_palette = 4;\n         color_inc = 0x55;\n         break;\n\n      case 4:\n         num_palette = 16;\n         color_inc = 0x11;\n         break;\n\n      case 8:\n         num_palette = 256;\n         color_inc = 1;\n         break;\n\n      default:\n         num_palette = 0;\n         color_inc = 0;\n         break;\n   }\n\n   for (i = 0, v = 0; i < num_palette; i++, v += color_inc)\n   {\n      palette[i].red = (png_byte)(v & 0xff);\n      palette[i].green = (png_byte)(v & 0xff);\n      palette[i].blue = (png_byte)(v & 0xff);\n   }\n}\n#endif\n\n#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\nint PNGAPI\npng_handle_as_unknown(png_const_structrp png_ptr, png_const_bytep chunk_name)\n{\n   /* Check chunk_name and return \"keep\" value if it's on the list, else 0 */\n   png_const_bytep p, p_end;\n\n   if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list == 0)\n      return PNG_HANDLE_CHUNK_AS_DEFAULT;\n\n   p_end = png_ptr->chunk_list;\n   p = p_end + png_ptr->num_chunk_list*5; /* beyond end */\n\n   /* The code is the fifth byte after each four byte string.  Historically this\n    * code was always searched from the end of the list, this is no longer\n    * necessary because the 'set' routine handles duplicate entries correcty.\n    */\n   do /* num_chunk_list > 0, so at least one */\n   {\n      p -= 5;\n\n      if (memcmp(chunk_name, p, 4) == 0)\n         return p[4];\n   }\n   while (p > p_end);\n\n   /* This means that known chunks should be processed and unknown chunks should\n    * be handled according to the value of png_ptr->unknown_default; this can be\n    * confusing because, as a result, there are two levels of defaulting for\n    * unknown chunks.\n    */\n   return PNG_HANDLE_CHUNK_AS_DEFAULT;\n}\n\n#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) ||\\\n   defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)\nint /* PRIVATE */\npng_chunk_unknown_handling(png_const_structrp png_ptr, png_uint_32 chunk_name)\n{\n   png_byte chunk_string[5];\n\n   PNG_CSTRING_FROM_CHUNK(chunk_string, chunk_name);\n   return png_handle_as_unknown(png_ptr, chunk_string);\n}\n#endif /* READ_UNKNOWN_CHUNKS || HANDLE_AS_UNKNOWN */\n#endif /* SET_UNKNOWN_CHUNKS */\n\n#ifdef PNG_READ_SUPPORTED\n/* This function, added to libpng-1.0.6g, is untested. */\nint PNGAPI\npng_reset_zstream(png_structrp png_ptr)\n{\n   if (png_ptr == NULL)\n      return Z_STREAM_ERROR;\n\n   /* WARNING: this resets the window bits to the maximum! */\n   return (inflateReset(&png_ptr->zstream));\n}\n#endif /* READ */\n\n/* This function was added to libpng-1.0.7 */\npng_uint_32 PNGAPI\npng_access_version_number(void)\n{\n   /* Version of *.c files used when building libpng */\n   return((png_uint_32)PNG_LIBPNG_VER);\n}\n\n#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)\n/* Ensure that png_ptr->zstream.msg holds some appropriate error message string.\n * If it doesn't 'ret' is used to set it to something appropriate, even in cases\n * like Z_OK or Z_STREAM_END where the error code is apparently a success code.\n */\nvoid /* PRIVATE */\npng_zstream_error(png_structrp png_ptr, int ret)\n{\n   /* Translate 'ret' into an appropriate error string, priority is given to the\n    * one in zstream if set.  This always returns a string, even in cases like\n    * Z_OK or Z_STREAM_END where the error code is a success code.\n    */\n   if (png_ptr->zstream.msg == NULL) switch (ret)\n   {\n      default:\n      case Z_OK:\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"unexpected zlib return code\");\n         break;\n\n      case Z_STREAM_END:\n         /* Normal exit */\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"unexpected end of LZ stream\");\n         break;\n\n      case Z_NEED_DICT:\n         /* This means the deflate stream did not have a dictionary; this\n          * indicates a bogus PNG.\n          */\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"missing LZ dictionary\");\n         break;\n\n      case Z_ERRNO:\n         /* gz APIs only: should not happen */\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"zlib IO error\");\n         break;\n\n      case Z_STREAM_ERROR:\n         /* internal libpng error */\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"bad parameters to zlib\");\n         break;\n\n      case Z_DATA_ERROR:\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"damaged LZ stream\");\n         break;\n\n      case Z_MEM_ERROR:\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"insufficient memory\");\n         break;\n\n      case Z_BUF_ERROR:\n         /* End of input or output; not a problem if the caller is doing\n          * incremental read or write.\n          */\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"truncated\");\n         break;\n\n      case Z_VERSION_ERROR:\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"unsupported zlib version\");\n         break;\n\n      case PNG_UNEXPECTED_ZLIB_RETURN:\n         /* Compile errors here mean that zlib now uses the value co-opted in\n          * pngpriv.h for PNG_UNEXPECTED_ZLIB_RETURN; update the switch above\n          * and change pngpriv.h.  Note that this message is \"... return\",\n          * whereas the default/Z_OK one is \"... return code\".\n          */\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"unexpected zlib return\");\n         break;\n   }\n}\n\n/* png_convert_size: a PNGAPI but no longer in png.h, so deleted\n * at libpng 1.5.5!\n */\n\n/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */\n#ifdef PNG_GAMMA_SUPPORTED /* always set if COLORSPACE */\nstatic int\npng_colorspace_check_gamma(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, png_fixed_point gAMA, int from)\n   /* This is called to check a new gamma value against an existing one.  The\n    * routine returns false if the new gamma value should not be written.\n    *\n    * 'from' says where the new gamma value comes from:\n    *\n    *    0: the new gamma value is the libpng estimate for an ICC profile\n    *    1: the new gamma value comes from a gAMA chunk\n    *    2: the new gamma value comes from an sRGB chunk\n    */\n{\n   png_fixed_point gtest;\n\n   if ((colorspace->flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&\n      (png_muldiv(&gtest, colorspace->gamma, PNG_FP_1, gAMA) == 0  ||\n      png_gamma_significant(gtest) != 0))\n   {\n      /* Either this is an sRGB image, in which case the calculated gamma\n       * approximation should match, or this is an image with a profile and the\n       * value libpng calculates for the gamma of the profile does not match the\n       * value recorded in the file.  The former, sRGB, case is an error, the\n       * latter is just a warning.\n       */\n      if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0 || from == 2)\n      {\n         png_chunk_report(png_ptr, \"gamma value does not match sRGB\",\n            PNG_CHUNK_ERROR);\n         /* Do not overwrite an sRGB value */\n         return from == 2;\n      }\n\n      else /* sRGB tag not involved */\n      {\n         png_chunk_report(png_ptr, \"gamma value does not match libpng estimate\",\n            PNG_CHUNK_WARNING);\n         return from == 1;\n      }\n   }\n\n   return 1;\n}\n\nvoid /* PRIVATE */\npng_colorspace_set_gamma(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, png_fixed_point gAMA)\n{\n   /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't\n    * occur.  Since the fixed point representation is asymetrical it is\n    * possible for 1/gamma to overflow the limit of 21474 and this means the\n    * gamma value must be at least 5/100000 and hence at most 20000.0.  For\n    * safety the limits here are a little narrower.  The values are 0.00016 to\n    * 6250.0, which are truly ridiculous gamma values (and will produce\n    * displays that are all black or all white.)\n    *\n    * In 1.6.0 this test replaces the ones in pngrutil.c, in the gAMA chunk\n    * handling code, which only required the value to be >0.\n    */\n   png_const_charp errmsg;\n\n   if (gAMA < 16 || gAMA > 625000000)\n      errmsg = \"gamma value out of range\";\n\n#  ifdef PNG_READ_gAMA_SUPPORTED\n   /* Allow the application to set the gamma value more than once */\n   else if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&\n      (colorspace->flags & PNG_COLORSPACE_FROM_gAMA) != 0)\n      errmsg = \"duplicate\";\n#  endif\n\n   /* Do nothing if the colorspace is already invalid */\n   else if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)\n      return;\n\n   else\n   {\n      if (png_colorspace_check_gamma(png_ptr, colorspace, gAMA,\n          1/*from gAMA*/) != 0)\n      {\n         /* Store this gamma value. */\n         colorspace->gamma = gAMA;\n         colorspace->flags |=\n            (PNG_COLORSPACE_HAVE_GAMMA | PNG_COLORSPACE_FROM_gAMA);\n      }\n\n      /* At present if the check_gamma test fails the gamma of the colorspace is\n       * not updated however the colorspace is not invalidated.  This\n       * corresponds to the case where the existing gamma comes from an sRGB\n       * chunk or profile.  An error message has already been output.\n       */\n      return;\n   }\n\n   /* Error exit - errmsg has been set. */\n   colorspace->flags |= PNG_COLORSPACE_INVALID;\n   png_chunk_report(png_ptr, errmsg, PNG_CHUNK_WRITE_ERROR);\n}\n\nvoid /* PRIVATE */\npng_colorspace_sync_info(png_const_structrp png_ptr, png_inforp info_ptr)\n{\n   if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)\n   {\n      /* Everything is invalid */\n      info_ptr->valid &= ~(PNG_INFO_gAMA|PNG_INFO_cHRM|PNG_INFO_sRGB|\n         PNG_INFO_iCCP);\n\n#     ifdef PNG_COLORSPACE_SUPPORTED\n      /* Clean up the iCCP profile now if it won't be used. */\n      png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, -1/*not used*/);\n#     else\n      PNG_UNUSED(png_ptr)\n#     endif\n   }\n\n   else\n   {\n#     ifdef PNG_COLORSPACE_SUPPORTED\n      /* Leave the INFO_iCCP flag set if the pngset.c code has already set\n       * it; this allows a PNG to contain a profile which matches sRGB and\n       * yet still have that profile retrievable by the application.\n       */\n      if ((info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) != 0)\n         info_ptr->valid |= PNG_INFO_sRGB;\n\n      else\n         info_ptr->valid &= ~PNG_INFO_sRGB;\n\n      if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)\n         info_ptr->valid |= PNG_INFO_cHRM;\n\n      else\n         info_ptr->valid &= ~PNG_INFO_cHRM;\n#     endif\n\n      if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0)\n         info_ptr->valid |= PNG_INFO_gAMA;\n\n      else\n         info_ptr->valid &= ~PNG_INFO_gAMA;\n   }\n}\n\n#ifdef PNG_READ_SUPPORTED\nvoid /* PRIVATE */\npng_colorspace_sync(png_const_structrp png_ptr, png_inforp info_ptr)\n{\n   if (info_ptr == NULL) /* reduce code size; check here not in the caller */\n      return;\n\n   info_ptr->colorspace = png_ptr->colorspace;\n   png_colorspace_sync_info(png_ptr, info_ptr);\n}\n#endif\n#endif /* GAMMA */\n\n#ifdef PNG_COLORSPACE_SUPPORTED\n/* Added at libpng-1.5.5 to support read and write of true CIEXYZ values for\n * cHRM, as opposed to using chromaticities.  These internal APIs return\n * non-zero on a parameter error.  The X, Y and Z values are required to be\n * positive and less than 1.0.\n */\nstatic int\npng_xy_from_XYZ(png_xy *xy, const png_XYZ *XYZ)\n{\n   png_int_32 d, dwhite, whiteX, whiteY;\n\n   d = XYZ->red_X + XYZ->red_Y + XYZ->red_Z;\n   if (png_muldiv(&xy->redx, XYZ->red_X, PNG_FP_1, d) == 0)\n      return 1;\n   if (png_muldiv(&xy->redy, XYZ->red_Y, PNG_FP_1, d) == 0)\n      return 1;\n   dwhite = d;\n   whiteX = XYZ->red_X;\n   whiteY = XYZ->red_Y;\n\n   d = XYZ->green_X + XYZ->green_Y + XYZ->green_Z;\n   if (png_muldiv(&xy->greenx, XYZ->green_X, PNG_FP_1, d) == 0)\n      return 1;\n   if (png_muldiv(&xy->greeny, XYZ->green_Y, PNG_FP_1, d) == 0)\n      return 1;\n   dwhite += d;\n   whiteX += XYZ->green_X;\n   whiteY += XYZ->green_Y;\n\n   d = XYZ->blue_X + XYZ->blue_Y + XYZ->blue_Z;\n   if (png_muldiv(&xy->bluex, XYZ->blue_X, PNG_FP_1, d) == 0)\n      return 1;\n   if (png_muldiv(&xy->bluey, XYZ->blue_Y, PNG_FP_1, d) == 0)\n      return 1;\n   dwhite += d;\n   whiteX += XYZ->blue_X;\n   whiteY += XYZ->blue_Y;\n\n   /* The reference white is simply the sum of the end-point (X,Y,Z) vectors,\n    * thus:\n    */\n   if (png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite) == 0)\n      return 1;\n   if (png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite) == 0)\n      return 1;\n\n   return 0;\n}\n\nstatic int\npng_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy)\n{\n   png_fixed_point red_inverse, green_inverse, blue_scale;\n   png_fixed_point left, right, denominator;\n\n   /* Check xy and, implicitly, z.  Note that wide gamut color spaces typically\n    * have end points with 0 tristimulus values (these are impossible end\n    * points, but they are used to cover the possible colors).  We check\n    * xy->whitey against 5, not 0, to avoid a possible integer overflow.\n    */\n   if (xy->redx   < 0 || xy->redx > PNG_FP_1) return 1;\n   if (xy->redy   < 0 || xy->redy > PNG_FP_1-xy->redx) return 1;\n   if (xy->greenx < 0 || xy->greenx > PNG_FP_1) return 1;\n   if (xy->greeny < 0 || xy->greeny > PNG_FP_1-xy->greenx) return 1;\n   if (xy->bluex  < 0 || xy->bluex > PNG_FP_1) return 1;\n   if (xy->bluey  < 0 || xy->bluey > PNG_FP_1-xy->bluex) return 1;\n   if (xy->whitex < 0 || xy->whitex > PNG_FP_1) return 1;\n   if (xy->whitey < 5 || xy->whitey > PNG_FP_1-xy->whitex) return 1;\n\n   /* The reverse calculation is more difficult because the original tristimulus\n    * value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8\n    * derived values were recorded in the cHRM chunk;\n    * (red,green,blue,white)x(x,y).  This loses one degree of freedom and\n    * therefore an arbitrary ninth value has to be introduced to undo the\n    * original transformations.\n    *\n    * Think of the original end-points as points in (X,Y,Z) space.  The\n    * chromaticity values (c) have the property:\n    *\n    *           C\n    *   c = ---------\n    *       X + Y + Z\n    *\n    * For each c (x,y,z) from the corresponding original C (X,Y,Z).  Thus the\n    * three chromaticity values (x,y,z) for each end-point obey the\n    * relationship:\n    *\n    *   x + y + z = 1\n    *\n    * This describes the plane in (X,Y,Z) space that intersects each axis at the\n    * value 1.0; call this the chromaticity plane.  Thus the chromaticity\n    * calculation has scaled each end-point so that it is on the x+y+z=1 plane\n    * and chromaticity is the intersection of the vector from the origin to the\n    * (X,Y,Z) value with the chromaticity plane.\n    *\n    * To fully invert the chromaticity calculation we would need the three\n    * end-point scale factors, (red-scale, green-scale, blue-scale), but these\n    * were not recorded.  Instead we calculated the reference white (X,Y,Z) and\n    * recorded the chromaticity of this.  The reference white (X,Y,Z) would have\n    * given all three of the scale factors since:\n    *\n    *    color-C = color-c * color-scale\n    *    white-C = red-C + green-C + blue-C\n    *            = red-c*red-scale + green-c*green-scale + blue-c*blue-scale\n    *\n    * But cHRM records only white-x and white-y, so we have lost the white scale\n    * factor:\n    *\n    *    white-C = white-c*white-scale\n    *\n    * To handle this the inverse transformation makes an arbitrary assumption\n    * about white-scale:\n    *\n    *    Assume: white-Y = 1.0\n    *    Hence:  white-scale = 1/white-y\n    *    Or:     red-Y + green-Y + blue-Y = 1.0\n    *\n    * Notice the last statement of the assumption gives an equation in three of\n    * the nine values we want to calculate.  8 more equations come from the\n    * above routine as summarised at the top above (the chromaticity\n    * calculation):\n    *\n    *    Given: color-x = color-X / (color-X + color-Y + color-Z)\n    *    Hence: (color-x - 1)*color-X + color.x*color-Y + color.x*color-Z = 0\n    *\n    * This is 9 simultaneous equations in the 9 variables \"color-C\" and can be\n    * solved by Cramer's rule.  Cramer's rule requires calculating 10 9x9 matrix\n    * determinants, however this is not as bad as it seems because only 28 of\n    * the total of 90 terms in the various matrices are non-zero.  Nevertheless\n    * Cramer's rule is notoriously numerically unstable because the determinant\n    * calculation involves the difference of large, but similar, numbers.  It is\n    * difficult to be sure that the calculation is stable for real world values\n    * and it is certain that it becomes unstable where the end points are close\n    * together.\n    *\n    * So this code uses the perhaps slightly less optimal but more\n    * understandable and totally obvious approach of calculating color-scale.\n    *\n    * This algorithm depends on the precision in white-scale and that is\n    * (1/white-y), so we can immediately see that as white-y approaches 0 the\n    * accuracy inherent in the cHRM chunk drops off substantially.\n    *\n    * libpng arithmetic: a simple inversion of the above equations\n    * ------------------------------------------------------------\n    *\n    *    white_scale = 1/white-y\n    *    white-X = white-x * white-scale\n    *    white-Y = 1.0\n    *    white-Z = (1 - white-x - white-y) * white_scale\n    *\n    *    white-C = red-C + green-C + blue-C\n    *            = red-c*red-scale + green-c*green-scale + blue-c*blue-scale\n    *\n    * This gives us three equations in (red-scale,green-scale,blue-scale) where\n    * all the coefficients are now known:\n    *\n    *    red-x*red-scale + green-x*green-scale + blue-x*blue-scale\n    *       = white-x/white-y\n    *    red-y*red-scale + green-y*green-scale + blue-y*blue-scale = 1\n    *    red-z*red-scale + green-z*green-scale + blue-z*blue-scale\n    *       = (1 - white-x - white-y)/white-y\n    *\n    * In the last equation color-z is (1 - color-x - color-y) so we can add all\n    * three equations together to get an alternative third:\n    *\n    *    red-scale + green-scale + blue-scale = 1/white-y = white-scale\n    *\n    * So now we have a Cramer's rule solution where the determinants are just\n    * 3x3 - far more tractible.  Unfortunately 3x3 determinants still involve\n    * multiplication of three coefficients so we can't guarantee to avoid\n    * overflow in the libpng fixed point representation.  Using Cramer's rule in\n    * floating point is probably a good choice here, but it's not an option for\n    * fixed point.  Instead proceed to simplify the first two equations by\n    * eliminating what is likely to be the largest value, blue-scale:\n    *\n    *    blue-scale = white-scale - red-scale - green-scale\n    *\n    * Hence:\n    *\n    *    (red-x - blue-x)*red-scale + (green-x - blue-x)*green-scale =\n    *                (white-x - blue-x)*white-scale\n    *\n    *    (red-y - blue-y)*red-scale + (green-y - blue-y)*green-scale =\n    *                1 - blue-y*white-scale\n    *\n    * And now we can trivially solve for (red-scale,green-scale):\n    *\n    *    green-scale =\n    *                (white-x - blue-x)*white-scale - (red-x - blue-x)*red-scale\n    *                -----------------------------------------------------------\n    *                                  green-x - blue-x\n    *\n    *    red-scale =\n    *                1 - blue-y*white-scale - (green-y - blue-y) * green-scale\n    *                ---------------------------------------------------------\n    *                                  red-y - blue-y\n    *\n    * Hence:\n    *\n    *    red-scale =\n    *          ( (green-x - blue-x) * (white-y - blue-y) -\n    *            (green-y - blue-y) * (white-x - blue-x) ) / white-y\n    * -------------------------------------------------------------------------\n    *  (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)\n    *\n    *    green-scale =\n    *          ( (red-y - blue-y) * (white-x - blue-x) -\n    *            (red-x - blue-x) * (white-y - blue-y) ) / white-y\n    * -------------------------------------------------------------------------\n    *  (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)\n    *\n    * Accuracy:\n    * The input values have 5 decimal digits of accuracy.  The values are all in\n    * the range 0 < value < 1, so simple products are in the same range but may\n    * need up to 10 decimal digits to preserve the original precision and avoid\n    * underflow.  Because we are using a 32-bit signed representation we cannot\n    * match this; the best is a little over 9 decimal digits, less than 10.\n    *\n    * The approach used here is to preserve the maximum precision within the\n    * signed representation.  Because the red-scale calculation above uses the\n    * difference between two products of values that must be in the range -1..+1\n    * it is sufficient to divide the product by 7; ceil(100,000/32767*2).  The\n    * factor is irrelevant in the calculation because it is applied to both\n    * numerator and denominator.\n    *\n    * Note that the values of the differences of the products of the\n    * chromaticities in the above equations tend to be small, for example for\n    * the sRGB chromaticities they are:\n    *\n    * red numerator:    -0.04751\n    * green numerator:  -0.08788\n    * denominator:      -0.2241 (without white-y multiplication)\n    *\n    *  The resultant Y coefficients from the chromaticities of some widely used\n    *  color space definitions are (to 15 decimal places):\n    *\n    *  sRGB\n    *    0.212639005871510 0.715168678767756 0.072192315360734\n    *  Kodak ProPhoto\n    *    0.288071128229293 0.711843217810102 0.000085653960605\n    *  Adobe RGB\n    *    0.297344975250536 0.627363566255466 0.075291458493998\n    *  Adobe Wide Gamut RGB\n    *    0.258728243040113 0.724682314948566 0.016589442011321\n    */\n   /* By the argument, above overflow should be impossible here. The return\n    * value of 2 indicates an internal error to the caller.\n    */\n   if (png_muldiv(&left, xy->greenx-xy->bluex, xy->redy - xy->bluey, 7) == 0)\n      return 2;\n   if (png_muldiv(&right, xy->greeny-xy->bluey, xy->redx - xy->bluex, 7) == 0)\n      return 2;\n   denominator = left - right;\n\n   /* Now find the red numerator. */\n   if (png_muldiv(&left, xy->greenx-xy->bluex, xy->whitey-xy->bluey, 7) == 0)\n      return 2;\n   if (png_muldiv(&right, xy->greeny-xy->bluey, xy->whitex-xy->bluex, 7) == 0)\n      return 2;\n\n   /* Overflow is possible here and it indicates an extreme set of PNG cHRM\n    * chunk values.  This calculation actually returns the reciprocal of the\n    * scale value because this allows us to delay the multiplication of white-y\n    * into the denominator, which tends to produce a small number.\n    */\n   if (png_muldiv(&red_inverse, xy->whitey, denominator, left-right) == 0 ||\n       red_inverse <= xy->whitey /* r+g+b scales = white scale */)\n      return 1;\n\n   /* Similarly for green_inverse: */\n   if (png_muldiv(&left, xy->redy-xy->bluey, xy->whitex-xy->bluex, 7) == 0)\n      return 2;\n   if (png_muldiv(&right, xy->redx-xy->bluex, xy->whitey-xy->bluey, 7) == 0)\n      return 2;\n   if (png_muldiv(&green_inverse, xy->whitey, denominator, left-right) == 0 ||\n       green_inverse <= xy->whitey)\n      return 1;\n\n   /* And the blue scale, the checks above guarantee this can't overflow but it\n    * can still produce 0 for extreme cHRM values.\n    */\n   blue_scale = png_reciprocal(xy->whitey) - png_reciprocal(red_inverse) -\n       png_reciprocal(green_inverse);\n   if (blue_scale <= 0)\n      return 1;\n\n\n   /* And fill in the png_XYZ: */\n   if (png_muldiv(&XYZ->red_X, xy->redx, PNG_FP_1, red_inverse) == 0)\n      return 1;\n   if (png_muldiv(&XYZ->red_Y, xy->redy, PNG_FP_1, red_inverse) == 0)\n      return 1;\n   if (png_muldiv(&XYZ->red_Z, PNG_FP_1 - xy->redx - xy->redy, PNG_FP_1,\n       red_inverse) == 0)\n      return 1;\n\n   if (png_muldiv(&XYZ->green_X, xy->greenx, PNG_FP_1, green_inverse) == 0)\n      return 1;\n   if (png_muldiv(&XYZ->green_Y, xy->greeny, PNG_FP_1, green_inverse) == 0)\n      return 1;\n   if (png_muldiv(&XYZ->green_Z, PNG_FP_1 - xy->greenx - xy->greeny, PNG_FP_1,\n       green_inverse) == 0)\n      return 1;\n\n   if (png_muldiv(&XYZ->blue_X, xy->bluex, blue_scale, PNG_FP_1) == 0)\n      return 1;\n   if (png_muldiv(&XYZ->blue_Y, xy->bluey, blue_scale, PNG_FP_1) == 0)\n      return 1;\n   if (png_muldiv(&XYZ->blue_Z, PNG_FP_1 - xy->bluex - xy->bluey, blue_scale,\n       PNG_FP_1) == 0)\n      return 1;\n\n   return 0; /*success*/\n}\n\nstatic int\npng_XYZ_normalize(png_XYZ *XYZ)\n{\n   png_int_32 Y;\n\n   if (XYZ->red_Y < 0 || XYZ->green_Y < 0 || XYZ->blue_Y < 0 ||\n      XYZ->red_X < 0 || XYZ->green_X < 0 || XYZ->blue_X < 0 ||\n      XYZ->red_Z < 0 || XYZ->green_Z < 0 || XYZ->blue_Z < 0)\n      return 1;\n\n   /* Normalize by scaling so the sum of the end-point Y values is PNG_FP_1.\n    * IMPLEMENTATION NOTE: ANSI requires signed overflow not to occur, therefore\n    * relying on addition of two positive values producing a negative one is not\n    * safe.\n    */\n   Y = XYZ->red_Y;\n   if (0x7fffffff - Y < XYZ->green_X)\n      return 1;\n   Y += XYZ->green_Y;\n   if (0x7fffffff - Y < XYZ->blue_X)\n      return 1;\n   Y += XYZ->blue_Y;\n\n   if (Y != PNG_FP_1)\n   {\n      if (png_muldiv(&XYZ->red_X, XYZ->red_X, PNG_FP_1, Y) == 0)\n         return 1;\n      if (png_muldiv(&XYZ->red_Y, XYZ->red_Y, PNG_FP_1, Y) == 0)\n         return 1;\n      if (png_muldiv(&XYZ->red_Z, XYZ->red_Z, PNG_FP_1, Y) == 0)\n         return 1;\n\n      if (png_muldiv(&XYZ->green_X, XYZ->green_X, PNG_FP_1, Y) == 0)\n         return 1;\n      if (png_muldiv(&XYZ->green_Y, XYZ->green_Y, PNG_FP_1, Y) == 0)\n         return 1;\n      if (png_muldiv(&XYZ->green_Z, XYZ->green_Z, PNG_FP_1, Y) == 0)\n         return 1;\n\n      if (png_muldiv(&XYZ->blue_X, XYZ->blue_X, PNG_FP_1, Y) == 0)\n         return 1;\n      if (png_muldiv(&XYZ->blue_Y, XYZ->blue_Y, PNG_FP_1, Y) == 0)\n         return 1;\n      if (png_muldiv(&XYZ->blue_Z, XYZ->blue_Z, PNG_FP_1, Y) == 0)\n         return 1;\n   }\n\n   return 0;\n}\n\nstatic int\npng_colorspace_endpoints_match(const png_xy *xy1, const png_xy *xy2, int delta)\n{\n   /* Allow an error of +/-0.01 (absolute value) on each chromaticity */\n   if (PNG_OUT_OF_RANGE(xy1->whitex, xy2->whitex,delta) ||\n       PNG_OUT_OF_RANGE(xy1->whitey, xy2->whitey,delta) ||\n       PNG_OUT_OF_RANGE(xy1->redx,   xy2->redx,  delta) ||\n       PNG_OUT_OF_RANGE(xy1->redy,   xy2->redy,  delta) ||\n       PNG_OUT_OF_RANGE(xy1->greenx, xy2->greenx,delta) ||\n       PNG_OUT_OF_RANGE(xy1->greeny, xy2->greeny,delta) ||\n       PNG_OUT_OF_RANGE(xy1->bluex,  xy2->bluex, delta) ||\n       PNG_OUT_OF_RANGE(xy1->bluey,  xy2->bluey, delta))\n      return 0;\n   return 1;\n}\n\n/* Added in libpng-1.6.0, a different check for the validity of a set of cHRM\n * chunk chromaticities.  Earlier checks used to simply look for the overflow\n * condition (where the determinant of the matrix to solve for XYZ ends up zero\n * because the chromaticity values are not all distinct.)  Despite this it is\n * theoretically possible to produce chromaticities that are apparently valid\n * but that rapidly degrade to invalid, potentially crashing, sets because of\n * arithmetic inaccuracies when calculations are performed on them.  The new\n * check is to round-trip xy -> XYZ -> xy and then check that the result is\n * within a small percentage of the original.\n */\nstatic int\npng_colorspace_check_xy(png_XYZ *XYZ, const png_xy *xy)\n{\n   int result;\n   png_xy xy_test;\n\n   /* As a side-effect this routine also returns the XYZ endpoints. */\n   result = png_XYZ_from_xy(XYZ, xy);\n   if (result != 0)\n      return result;\n\n   result = png_xy_from_XYZ(&xy_test, XYZ);\n   if (result != 0)\n      return result;\n\n   if (png_colorspace_endpoints_match(xy, &xy_test,\n       5/*actually, the math is pretty accurate*/) != 0)\n      return 0;\n\n   /* Too much slip */\n   return 1;\n}\n\n/* This is the check going the other way.  The XYZ is modified to normalize it\n * (another side-effect) and the xy chromaticities are returned.\n */\nstatic int\npng_colorspace_check_XYZ(png_xy *xy, png_XYZ *XYZ)\n{\n   int result;\n   png_XYZ XYZtemp;\n\n   result = png_XYZ_normalize(XYZ);\n   if (result != 0)\n      return result;\n\n   result = png_xy_from_XYZ(xy, XYZ);\n   if (result != 0)\n      return result;\n\n   XYZtemp = *XYZ;\n   return png_colorspace_check_xy(&XYZtemp, xy);\n}\n\n/* Used to check for an endpoint match against sRGB */\nstatic const png_xy sRGB_xy = /* From ITU-R BT.709-3 */\n{\n   /* color      x       y */\n   /* red   */ 64000, 33000,\n   /* green */ 30000, 60000,\n   /* blue  */ 15000,  6000,\n   /* white */ 31270, 32900\n};\n\nstatic int\npng_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, const png_xy *xy, const png_XYZ *XYZ,\n   int preferred)\n{\n   if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)\n      return 0;\n\n   /* The consistency check is performed on the chromaticities; this factors out\n    * variations because of the normalization (or not) of the end point Y\n    * values.\n    */\n   if (preferred < 2 &&\n       (colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)\n   {\n      /* The end points must be reasonably close to any we already have.  The\n       * following allows an error of up to +/-.001\n       */\n      if (png_colorspace_endpoints_match(xy, &colorspace->end_points_xy,\n          100) == 0)\n      {\n         colorspace->flags |= PNG_COLORSPACE_INVALID;\n         png_benign_error(png_ptr, \"inconsistent chromaticities\");\n         return 0; /* failed */\n      }\n\n      /* Only overwrite with preferred values */\n      if (preferred == 0)\n         return 1; /* ok, but no change */\n   }\n\n   colorspace->end_points_xy = *xy;\n   colorspace->end_points_XYZ = *XYZ;\n   colorspace->flags |= PNG_COLORSPACE_HAVE_ENDPOINTS;\n\n   /* The end points are normally quoted to two decimal digits, so allow +/-0.01\n    * on this test.\n    */\n   if (png_colorspace_endpoints_match(xy, &sRGB_xy, 1000) != 0)\n      colorspace->flags |= PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB;\n\n   else\n      colorspace->flags &= PNG_COLORSPACE_CANCEL(\n         PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB);\n\n   return 2; /* ok and changed */\n}\n\nint /* PRIVATE */\npng_colorspace_set_chromaticities(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, const png_xy *xy, int preferred)\n{\n   /* We must check the end points to ensure they are reasonable - in the past\n    * color management systems have crashed as a result of getting bogus\n    * colorant values, while this isn't the fault of libpng it is the\n    * responsibility of libpng because PNG carries the bomb and libpng is in a\n    * position to protect against it.\n    */\n   png_XYZ XYZ;\n\n   switch (png_colorspace_check_xy(&XYZ, xy))\n   {\n      case 0: /* success */\n         return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, xy, &XYZ,\n            preferred);\n\n      case 1:\n         /* We can't invert the chromaticities so we can't produce value XYZ\n          * values.  Likely as not a color management system will fail too.\n          */\n         colorspace->flags |= PNG_COLORSPACE_INVALID;\n         png_benign_error(png_ptr, \"invalid chromaticities\");\n         break;\n\n      default:\n         /* libpng is broken; this should be a warning but if it happens we\n          * want error reports so for the moment it is an error.\n          */\n         colorspace->flags |= PNG_COLORSPACE_INVALID;\n         png_error(png_ptr, \"internal error checking chromaticities\");\n   }\n\n   return 0; /* failed */\n}\n\nint /* PRIVATE */\npng_colorspace_set_endpoints(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, const png_XYZ *XYZ_in, int preferred)\n{\n   png_XYZ XYZ = *XYZ_in;\n   png_xy xy;\n\n   switch (png_colorspace_check_XYZ(&xy, &XYZ))\n   {\n      case 0:\n         return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, &xy, &XYZ,\n            preferred);\n\n      case 1:\n         /* End points are invalid. */\n         colorspace->flags |= PNG_COLORSPACE_INVALID;\n         png_benign_error(png_ptr, \"invalid end points\");\n         break;\n\n      default:\n         colorspace->flags |= PNG_COLORSPACE_INVALID;\n         png_error(png_ptr, \"internal error checking chromaticities\");\n   }\n\n   return 0; /* failed */\n}\n\n#if defined(PNG_sRGB_SUPPORTED) || defined(PNG_iCCP_SUPPORTED)\n/* Error message generation */\nstatic char\npng_icc_tag_char(png_uint_32 byte)\n{\n   byte &= 0xff;\n   if (byte >= 32 && byte <= 126)\n      return (char)byte;\n   else\n      return '?';\n}\n\nstatic void\npng_icc_tag_name(char *name, png_uint_32 tag)\n{\n   name[0] = '\\'';\n   name[1] = png_icc_tag_char(tag >> 24);\n   name[2] = png_icc_tag_char(tag >> 16);\n   name[3] = png_icc_tag_char(tag >>  8);\n   name[4] = png_icc_tag_char(tag      );\n   name[5] = '\\'';\n}\n\nstatic int\nis_ICC_signature_char(png_alloc_size_t it)\n{\n   return it == 32 || (it >= 48 && it <= 57) || (it >= 65 && it <= 90) ||\n      (it >= 97 && it <= 122);\n}\n\nstatic int\nis_ICC_signature(png_alloc_size_t it)\n{\n   return is_ICC_signature_char(it >> 24) /* checks all the top bits */ &&\n      is_ICC_signature_char((it >> 16) & 0xff) &&\n      is_ICC_signature_char((it >> 8) & 0xff) &&\n      is_ICC_signature_char(it & 0xff);\n}\n\nstatic int\npng_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace,\n   png_const_charp name, png_alloc_size_t value, png_const_charp reason)\n{\n   size_t pos;\n   char message[196]; /* see below for calculation */\n\n   if (colorspace != NULL)\n      colorspace->flags |= PNG_COLORSPACE_INVALID;\n\n   pos = png_safecat(message, (sizeof message), 0, \"profile '\"); /* 9 chars */\n   pos = png_safecat(message, pos+79, pos, name); /* Truncate to 79 chars */\n   pos = png_safecat(message, (sizeof message), pos, \"': \"); /* +2 = 90 */\n   if (is_ICC_signature(value) != 0)\n   {\n      /* So 'value' is at most 4 bytes and the following cast is safe */\n      png_icc_tag_name(message+pos, (png_uint_32)value);\n      pos += 6; /* total +8; less than the else clause */\n      message[pos++] = ':';\n      message[pos++] = ' ';\n   }\n#  ifdef PNG_WARNINGS_SUPPORTED\n   else\n      {\n         char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/\n\n         pos = png_safecat(message, (sizeof message), pos,\n            png_format_number(number, number+(sizeof number),\n               PNG_NUMBER_FORMAT_x, value));\n         pos = png_safecat(message, (sizeof message), pos, \"h: \"); /*+2 = 116*/\n      }\n#  endif\n   /* The 'reason' is an arbitrary message, allow +79 maximum 195 */\n   pos = png_safecat(message, (sizeof message), pos, reason);\n   PNG_UNUSED(pos)\n\n   /* This is recoverable, but make it unconditionally an app_error on write to\n    * avoid writing invalid ICC profiles into PNG files (i.e., we handle them\n    * on read, with a warning, but on write unless the app turns off\n    * application errors the PNG won't be written.)\n    */\n   png_chunk_report(png_ptr, message,\n      (colorspace != NULL) ? PNG_CHUNK_ERROR : PNG_CHUNK_WRITE_ERROR);\n\n   return 0;\n}\n#endif /* sRGB || iCCP */\n\n#ifdef PNG_sRGB_SUPPORTED\nint /* PRIVATE */\npng_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,\n   int intent)\n{\n   /* sRGB sets known gamma, end points and (from the chunk) intent. */\n   /* IMPORTANT: these are not necessarily the values found in an ICC profile\n    * because ICC profiles store values adapted to a D50 environment; it is\n    * expected that the ICC profile mediaWhitePointTag will be D50; see the\n    * checks and code elsewhere to understand this better.\n    *\n    * These XYZ values, which are accurate to 5dp, produce rgb to gray\n    * coefficients of (6968,23435,2366), which are reduced (because they add up\n    * to 32769 not 32768) to (6968,23434,2366).  These are the values that\n    * libpng has traditionally used (and are the best values given the 15bit\n    * algorithm used by the rgb to gray code.)\n    */\n   static const png_XYZ sRGB_XYZ = /* D65 XYZ (*not* the D50 adapted values!) */\n   {\n      /* color      X      Y      Z */\n      /* red   */ 41239, 21264,  1933,\n      /* green */ 35758, 71517, 11919,\n      /* blue  */ 18048,  7219, 95053\n   };\n\n   /* Do nothing if the colorspace is already invalidated. */\n   if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)\n      return 0;\n\n   /* Check the intent, then check for existing settings.  It is valid for the\n    * PNG file to have cHRM or gAMA chunks along with sRGB, but the values must\n    * be consistent with the correct values.  If, however, this function is\n    * called below because an iCCP chunk matches sRGB then it is quite\n    * conceivable that an older app recorded incorrect gAMA and cHRM because of\n    * an incorrect calculation based on the values in the profile - this does\n    * *not* invalidate the profile (though it still produces an error, which can\n    * be ignored.)\n    */\n   if (intent < 0 || intent >= PNG_sRGB_INTENT_LAST)\n      return png_icc_profile_error(png_ptr, colorspace, \"sRGB\",\n         (unsigned)intent, \"invalid sRGB rendering intent\");\n\n   if ((colorspace->flags & PNG_COLORSPACE_HAVE_INTENT) != 0 &&\n      colorspace->rendering_intent != intent)\n      return png_icc_profile_error(png_ptr, colorspace, \"sRGB\",\n         (unsigned)intent, \"inconsistent rendering intents\");\n\n   if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0)\n   {\n      png_benign_error(png_ptr, \"duplicate sRGB information ignored\");\n      return 0;\n   }\n\n   /* If the standard sRGB cHRM chunk does not match the one from the PNG file\n    * warn but overwrite the value with the correct one.\n    */\n   if ((colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0 &&\n      !png_colorspace_endpoints_match(&sRGB_xy, &colorspace->end_points_xy,\n         100))\n      png_chunk_report(png_ptr, \"cHRM chunk does not match sRGB\",\n         PNG_CHUNK_ERROR);\n\n   /* This check is just done for the error reporting - the routine always\n    * returns true when the 'from' argument corresponds to sRGB (2).\n    */\n   (void)png_colorspace_check_gamma(png_ptr, colorspace, PNG_GAMMA_sRGB_INVERSE,\n      2/*from sRGB*/);\n\n   /* intent: bugs in GCC force 'int' to be used as the parameter type. */\n   colorspace->rendering_intent = (png_uint_16)intent;\n   colorspace->flags |= PNG_COLORSPACE_HAVE_INTENT;\n\n   /* endpoints */\n   colorspace->end_points_xy = sRGB_xy;\n   colorspace->end_points_XYZ = sRGB_XYZ;\n   colorspace->flags |=\n      (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB);\n\n   /* gamma */\n   colorspace->gamma = PNG_GAMMA_sRGB_INVERSE;\n   colorspace->flags |= PNG_COLORSPACE_HAVE_GAMMA;\n\n   /* Finally record that we have an sRGB profile */\n   colorspace->flags |=\n      (PNG_COLORSPACE_MATCHES_sRGB|PNG_COLORSPACE_FROM_sRGB);\n\n   return 1; /* set */\n}\n#endif /* sRGB */\n\n#ifdef PNG_iCCP_SUPPORTED\n/* Encoded value of D50 as an ICC XYZNumber.  From the ICC 2010 spec the value\n * is XYZ(0.9642,1.0,0.8249), which scales to:\n *\n *    (63189.8112, 65536, 54060.6464)\n */\nstatic const png_byte D50_nCIEXYZ[12] =\n   { 0x00, 0x00, 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d };\n\nint /* PRIVATE */\npng_icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace,\n   png_const_charp name, png_uint_32 profile_length)\n{\n   if (profile_length < 132)\n      return png_icc_profile_error(png_ptr, colorspace, name, profile_length,\n         \"too short\");\n\n   return 1;\n}\n\nint /* PRIVATE */\npng_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,\n   png_const_charp name, png_uint_32 profile_length,\n   png_const_bytep profile/* first 132 bytes only */, int color_type)\n{\n   png_uint_32 temp;\n\n   /* Length check; this cannot be ignored in this code because profile_length\n    * is used later to check the tag table, so even if the profile seems over\n    * long profile_length from the caller must be correct.  The caller can fix\n    * this up on read or write by just passing in the profile header length.\n    */\n   temp = png_get_uint_32(profile);\n   if (temp != profile_length)\n      return png_icc_profile_error(png_ptr, colorspace, name, temp,\n         \"length does not match profile\");\n\n   temp = (png_uint_32) (*(profile+8));\n   if (temp > 3 && (profile_length & 3))\n      return png_icc_profile_error(png_ptr, colorspace, name, profile_length,\n         \"invalid length\");\n\n   temp = png_get_uint_32(profile+128); /* tag count: 12 bytes/tag */\n   if (temp > 357913930 || /* (2^32-4-132)/12: maximum possible tag count */\n      profile_length < 132+12*temp) /* truncated tag table */\n      return png_icc_profile_error(png_ptr, colorspace, name, temp,\n         \"tag count too large\");\n\n   /* The 'intent' must be valid or we can't store it, ICC limits the intent to\n    * 16 bits.\n    */\n   temp = png_get_uint_32(profile+64);\n   if (temp >= 0xffff) /* The ICC limit */\n      return png_icc_profile_error(png_ptr, colorspace, name, temp,\n         \"invalid rendering intent\");\n\n   /* This is just a warning because the profile may be valid in future\n    * versions.\n    */\n   if (temp >= PNG_sRGB_INTENT_LAST)\n      (void)png_icc_profile_error(png_ptr, NULL, name, temp,\n         \"intent outside defined range\");\n\n   /* At this point the tag table can't be checked because it hasn't necessarily\n    * been loaded; however, various header fields can be checked.  These checks\n    * are for values permitted by the PNG spec in an ICC profile; the PNG spec\n    * restricts the profiles that can be passed in an iCCP chunk (they must be\n    * appropriate to processing PNG data!)\n    */\n\n   /* Data checks (could be skipped).  These checks must be independent of the\n    * version number; however, the version number doesn't accomodate changes in\n    * the header fields (just the known tags and the interpretation of the\n    * data.)\n    */\n   temp = png_get_uint_32(profile+36); /* signature 'ascp' */\n   if (temp != 0x61637370)\n      return png_icc_profile_error(png_ptr, colorspace, name, temp,\n         \"invalid signature\");\n\n   /* Currently the PCS illuminant/adopted white point (the computational\n    * white point) are required to be D50,\n    * however the profile contains a record of the illuminant so perhaps ICC\n    * expects to be able to change this in the future (despite the rationale in\n    * the introduction for using a fixed PCS adopted white.)  Consequently the\n    * following is just a warning.\n    */\n   if (memcmp(profile+68, D50_nCIEXYZ, 12) != 0)\n      (void)png_icc_profile_error(png_ptr, NULL, name, 0/*no tag value*/,\n         \"PCS illuminant is not D50\");\n\n   /* The PNG spec requires this:\n    * \"If the iCCP chunk is present, the image samples conform to the colour\n    * space represented by the embedded ICC profile as defined by the\n    * International Color Consortium [ICC]. The colour space of the ICC profile\n    * shall be an RGB colour space for colour images (PNG colour types 2, 3, and\n    * 6), or a greyscale colour space for greyscale images (PNG colour types 0\n    * and 4).\"\n    *\n    * This checking code ensures the embedded profile (on either read or write)\n    * conforms to the specification requirements.  Notice that an ICC 'gray'\n    * color-space profile contains the information to transform the monochrome\n    * data to XYZ or L*a*b (according to which PCS the profile uses) and this\n    * should be used in preference to the standard libpng K channel replication\n    * into R, G and B channels.\n    *\n    * Previously it was suggested that an RGB profile on grayscale data could be\n    * handled.  However it it is clear that using an RGB profile in this context\n    * must be an error - there is no specification of what it means.  Thus it is\n    * almost certainly more correct to ignore the profile.\n    */\n   temp = png_get_uint_32(profile+16); /* data colour space field */\n   switch (temp)\n   {\n      case 0x52474220: /* 'RGB ' */\n         if ((color_type & PNG_COLOR_MASK_COLOR) == 0)\n            return png_icc_profile_error(png_ptr, colorspace, name, temp,\n               \"RGB color space not permitted on grayscale PNG\");\n         break;\n\n      case 0x47524159: /* 'GRAY' */\n         if ((color_type & PNG_COLOR_MASK_COLOR) != 0)\n            return png_icc_profile_error(png_ptr, colorspace, name, temp,\n               \"Gray color space not permitted on RGB PNG\");\n         break;\n\n      default:\n         return png_icc_profile_error(png_ptr, colorspace, name, temp,\n            \"invalid ICC profile color space\");\n   }\n\n   /* It is up to the application to check that the profile class matches the\n    * application requirements; the spec provides no guidance, but it's pretty\n    * weird if the profile is not scanner ('scnr'), monitor ('mntr'), printer\n    * ('prtr') or 'spac' (for generic color spaces).  Issue a warning in these\n    * cases.  Issue an error for device link or abstract profiles - these don't\n    * contain the records necessary to transform the color-space to anything\n    * other than the target device (and not even that for an abstract profile).\n    * Profiles of these classes may not be embedded in images.\n    */\n   temp = png_get_uint_32(profile+12); /* profile/device class */\n   switch (temp)\n   {\n      case 0x73636e72: /* 'scnr' */\n      case 0x6d6e7472: /* 'mntr' */\n      case 0x70727472: /* 'prtr' */\n      case 0x73706163: /* 'spac' */\n         /* All supported */\n         break;\n\n      case 0x61627374: /* 'abst' */\n         /* May not be embedded in an image */\n         return png_icc_profile_error(png_ptr, colorspace, name, temp,\n            \"invalid embedded Abstract ICC profile\");\n\n      case 0x6c696e6b: /* 'link' */\n         /* DeviceLink profiles cannot be interpreted in a non-device specific\n          * fashion, if an app uses the AToB0Tag in the profile the results are\n          * undefined unless the result is sent to the intended device,\n          * therefore a DeviceLink profile should not be found embedded in a\n          * PNG.\n          */\n         return png_icc_profile_error(png_ptr, colorspace, name, temp,\n            \"unexpected DeviceLink ICC profile class\");\n\n      case 0x6e6d636c: /* 'nmcl' */\n         /* A NamedColor profile is also device specific, however it doesn't\n          * contain an AToB0 tag that is open to misinterpretation.  Almost\n          * certainly it will fail the tests below.\n          */\n         (void)png_icc_profile_error(png_ptr, NULL, name, temp,\n            \"unexpected NamedColor ICC profile class\");\n         break;\n\n      default:\n         /* To allow for future enhancements to the profile accept unrecognized\n          * profile classes with a warning, these then hit the test below on the\n          * tag content to ensure they are backward compatible with one of the\n          * understood profiles.\n          */\n         (void)png_icc_profile_error(png_ptr, NULL, name, temp,\n            \"unrecognized ICC profile class\");\n         break;\n   }\n\n   /* For any profile other than a device link one the PCS must be encoded\n    * either in XYZ or Lab.\n    */\n   temp = png_get_uint_32(profile+20);\n   switch (temp)\n   {\n      case 0x58595a20: /* 'XYZ ' */\n      case 0x4c616220: /* 'Lab ' */\n         break;\n\n      default:\n         return png_icc_profile_error(png_ptr, colorspace, name, temp,\n            \"unexpected ICC PCS encoding\");\n   }\n\n   return 1;\n}\n\nint /* PRIVATE */\npng_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace,\n   png_const_charp name, png_uint_32 profile_length,\n   png_const_bytep profile /* header plus whole tag table */)\n{\n   png_uint_32 tag_count = png_get_uint_32(profile+128);\n   png_uint_32 itag;\n   png_const_bytep tag = profile+132; /* The first tag */\n\n   /* First scan all the tags in the table and add bits to the icc_info value\n    * (temporarily in 'tags').\n    */\n   for (itag=0; itag < tag_count; ++itag, tag += 12)\n   {\n      png_uint_32 tag_id = png_get_uint_32(tag+0);\n      png_uint_32 tag_start = png_get_uint_32(tag+4); /* must be aligned */\n      png_uint_32 tag_length = png_get_uint_32(tag+8);/* not padded */\n\n      /* The ICC specification does not exclude zero length tags, therefore the\n       * start might actually be anywhere if there is no data, but this would be\n       * a clear abuse of the intent of the standard so the start is checked for\n       * being in range.  All defined tag types have an 8 byte header - a 4 byte\n       * type signature then 0.\n       */\n      if ((tag_start & 3) != 0)\n      {\n         /* CNHP730S.icc shipped with Microsoft Windows 64 violates this, it is\n          * only a warning here because libpng does not care about the\n          * alignment.\n          */\n         (void)png_icc_profile_error(png_ptr, NULL, name, tag_id,\n            \"ICC profile tag start not a multiple of 4\");\n      }\n\n      /* This is a hard error; potentially it can cause read outside the\n       * profile.\n       */\n      if (tag_start > profile_length || tag_length > profile_length - tag_start)\n         return png_icc_profile_error(png_ptr, colorspace, name, tag_id,\n            \"ICC profile tag outside profile\");\n   }\n\n   return 1; /* success, maybe with warnings */\n}\n\n#ifdef PNG_sRGB_SUPPORTED\n#if PNG_sRGB_PROFILE_CHECKS >= 0\n/* Information about the known ICC sRGB profiles */\nstatic const struct\n{\n   png_uint_32 adler, crc, length;\n   png_uint_32 md5[4];\n   png_byte    have_md5;\n   png_byte    is_broken;\n   png_uint_16 intent;\n\n#  define PNG_MD5(a,b,c,d) { a, b, c, d }, (a!=0)||(b!=0)||(c!=0)||(d!=0)\n#  define PNG_ICC_CHECKSUM(adler, crc, md5, intent, broke, date, length, fname)\\\n      { adler, crc, length, md5, broke, intent },\n\n} png_sRGB_checks[] =\n{\n   /* This data comes from contrib/tools/checksum-icc run on downloads of\n    * all four ICC sRGB profiles from www.color.org.\n    */\n   /* adler32, crc32, MD5[4], intent, date, length, file-name */\n   PNG_ICC_CHECKSUM(0x0a3fd9f6, 0x3b8772b9,\n      PNG_MD5(0x29f83dde, 0xaff255ae, 0x7842fae4, 0xca83390d), 0, 0,\n      \"2009/03/27 21:36:31\", 3048, \"sRGB_IEC61966-2-1_black_scaled.icc\")\n\n   /* ICC sRGB v2 perceptual no black-compensation: */\n   PNG_ICC_CHECKSUM(0x4909e5e1, 0x427ebb21,\n      PNG_MD5(0xc95bd637, 0xe95d8a3b, 0x0df38f99, 0xc1320389), 1, 0,\n      \"2009/03/27 21:37:45\", 3052, \"sRGB_IEC61966-2-1_no_black_scaling.icc\")\n\n   PNG_ICC_CHECKSUM(0xfd2144a1, 0x306fd8ae,\n      PNG_MD5(0xfc663378, 0x37e2886b, 0xfd72e983, 0x8228f1b8), 0, 0,\n      \"2009/08/10 17:28:01\", 60988, \"sRGB_v4_ICC_preference_displayclass.icc\")\n\n   /* ICC sRGB v4 perceptual */\n   PNG_ICC_CHECKSUM(0x209c35d2, 0xbbef7812,\n      PNG_MD5(0x34562abf, 0x994ccd06, 0x6d2c5721, 0xd0d68c5d), 0, 0,\n      \"2007/07/25 00:05:37\", 60960, \"sRGB_v4_ICC_preference.icc\")\n\n   /* The following profiles have no known MD5 checksum. If there is a match\n    * on the (empty) MD5 the other fields are used to attempt a match and\n    * a warning is produced.  The first two of these profiles have a 'cprt' tag\n    * which suggests that they were also made by Hewlett Packard.\n    */\n   PNG_ICC_CHECKSUM(0xa054d762, 0x5d5129ce,\n      PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 0,\n      \"2004/07/21 18:57:42\", 3024, \"sRGB_IEC61966-2-1_noBPC.icc\")\n\n   /* This is a 'mntr' (display) profile with a mediaWhitePointTag that does not\n    * match the D50 PCS illuminant in the header (it is in fact the D65 values,\n    * so the white point is recorded as the un-adapted value.)  The profiles\n    * below only differ in one byte - the intent - and are basically the same as\n    * the previous profile except for the mediaWhitePointTag error and a missing\n    * chromaticAdaptationTag.\n    */\n   PNG_ICC_CHECKSUM(0xf784f3fb, 0x182ea552,\n      PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 0, 1/*broken*/,\n      \"1998/02/09 06:49:00\", 3144, \"HP-Microsoft sRGB v2 perceptual\")\n\n   PNG_ICC_CHECKSUM(0x0398f3fc, 0xf29e526d,\n      PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 1/*broken*/,\n      \"1998/02/09 06:49:00\", 3144, \"HP-Microsoft sRGB v2 media-relative\")\n};\n\nstatic int\npng_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,\n   png_const_bytep profile, uLong adler)\n{\n   /* The quick check is to verify just the MD5 signature and trust the\n    * rest of the data.  Because the profile has already been verified for\n    * correctness this is safe.  png_colorspace_set_sRGB will check the 'intent'\n    * field too, so if the profile has been edited with an intent not defined\n    * by sRGB (but maybe defined by a later ICC specification) the read of\n    * the profile will fail at that point.\n    */\n\n   png_uint_32 length = 0;\n   png_uint_32 intent = 0x10000; /* invalid */\n#if PNG_sRGB_PROFILE_CHECKS > 1\n   uLong crc = 0; /* the value for 0 length data */\n#endif\n   unsigned int i;\n\n#ifdef PNG_SET_OPTION_SUPPORTED\n   /* First see if PNG_SKIP_sRGB_CHECK_PROFILE has been set to \"on\" */\n   if (((png_ptr->options >> PNG_SKIP_sRGB_CHECK_PROFILE) & 3) ==\n               PNG_OPTION_ON)\n      return 0;\n#endif\n\n   for (i=0; i < (sizeof png_sRGB_checks) / (sizeof png_sRGB_checks[0]); ++i)\n   {\n      if (png_get_uint_32(profile+84) == png_sRGB_checks[i].md5[0] &&\n         png_get_uint_32(profile+88) == png_sRGB_checks[i].md5[1] &&\n         png_get_uint_32(profile+92) == png_sRGB_checks[i].md5[2] &&\n         png_get_uint_32(profile+96) == png_sRGB_checks[i].md5[3])\n      {\n         /* This may be one of the old HP profiles without an MD5, in that\n          * case we can only use the length and Adler32 (note that these\n          * are not used by default if there is an MD5!)\n          */\n#        if PNG_sRGB_PROFILE_CHECKS == 0\n            if (png_sRGB_checks[i].have_md5 != 0)\n               return 1+png_sRGB_checks[i].is_broken;\n#        endif\n\n         /* Profile is unsigned or more checks have been configured in. */\n         if (length == 0)\n         {\n            length = png_get_uint_32(profile);\n            intent = png_get_uint_32(profile+64);\n         }\n\n         /* Length *and* intent must match */\n         if (length == (png_uint_32) png_sRGB_checks[i].length &&\n            intent == (png_uint_32) png_sRGB_checks[i].intent)\n         {\n            /* Now calculate the adler32 if not done already. */\n            if (adler == 0)\n            {\n               adler = adler32(0, NULL, 0);\n               adler = adler32(adler, profile, length);\n            }\n\n            if (adler == png_sRGB_checks[i].adler)\n            {\n               /* These basic checks suggest that the data has not been\n                * modified, but if the check level is more than 1 perform\n                * our own crc32 checksum on the data.\n                */\n#              if PNG_sRGB_PROFILE_CHECKS > 1\n                  if (crc == 0)\n                  {\n                     crc = crc32(0, NULL, 0);\n                     crc = crc32(crc, profile, length);\n                  }\n\n                  /* So this check must pass for the 'return' below to happen.\n                   */\n                  if (crc == png_sRGB_checks[i].crc)\n#              endif\n               {\n                  if (png_sRGB_checks[i].is_broken != 0)\n                  {\n                     /* These profiles are known to have bad data that may cause\n                      * problems if they are used, therefore attempt to\n                      * discourage their use, skip the 'have_md5' warning below,\n                      * which is made irrelevant by this error.\n                      */\n                     png_chunk_report(png_ptr, \"known incorrect sRGB profile\",\n                        PNG_CHUNK_ERROR);\n                  }\n\n                  /* Warn that this being done; this isn't even an error since\n                   * the profile is perfectly valid, but it would be nice if\n                   * people used the up-to-date ones.\n                   */\n                  else if (png_sRGB_checks[i].have_md5 == 0)\n                  {\n                     png_chunk_report(png_ptr,\n                        \"out-of-date sRGB profile with no signature\",\n                        PNG_CHUNK_WARNING);\n                  }\n\n                  return 1+png_sRGB_checks[i].is_broken;\n               }\n            }\n\n# if PNG_sRGB_PROFILE_CHECKS > 0\n         /* The signature matched, but the profile had been changed in some\n          * way.  This probably indicates a data error or uninformed hacking.\n          * Fall through to \"no match\".\n          */\n         png_chunk_report(png_ptr,\n             \"Not recognizing known sRGB profile that has been edited\",\n             PNG_CHUNK_WARNING);\n         break;\n# endif\n         }\n      }\n   }\n\n   return 0; /* no match */\n}\n#endif /* PNG_sRGB_PROFILE_CHECKS >= 0 */\n\nvoid /* PRIVATE */\npng_icc_set_sRGB(png_const_structrp png_ptr,\n   png_colorspacerp colorspace, png_const_bytep profile, uLong adler)\n{\n   /* Is this profile one of the known ICC sRGB profiles?  If it is, just set\n    * the sRGB information.\n    */\n#if PNG_sRGB_PROFILE_CHECKS >= 0\n   if (png_compare_ICC_profile_with_sRGB(png_ptr, profile, adler) != 0)\n#endif\n      (void)png_colorspace_set_sRGB(png_ptr, colorspace,\n         (int)/*already checked*/png_get_uint_32(profile+64));\n}\n#endif /* sRGB */\n\nint /* PRIVATE */\npng_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace,\n   png_const_charp name, png_uint_32 profile_length, png_const_bytep profile,\n   int color_type)\n{\n   if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)\n      return 0;\n\n   if (png_icc_check_length(png_ptr, colorspace, name, profile_length) != 0 &&\n       png_icc_check_header(png_ptr, colorspace, name, profile_length, profile,\n          color_type) != 0 &&\n       png_icc_check_tag_table(png_ptr, colorspace, name, profile_length,\n          profile) != 0)\n   {\n#     ifdef PNG_sRGB_SUPPORTED\n         /* If no sRGB support, don't try storing sRGB information */\n         png_icc_set_sRGB(png_ptr, colorspace, profile, 0);\n#     endif\n      return 1;\n   }\n\n   /* Failure case */\n   return 0;\n}\n#endif /* iCCP */\n\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\nvoid /* PRIVATE */\npng_colorspace_set_rgb_coefficients(png_structrp png_ptr)\n{\n   /* Set the rgb_to_gray coefficients from the colorspace. */\n   if (png_ptr->rgb_to_gray_coefficients_set == 0 &&\n      (png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)\n   {\n      /* png_set_background has not been called, get the coefficients from the Y\n       * values of the colorspace colorants.\n       */\n      png_fixed_point r = png_ptr->colorspace.end_points_XYZ.red_Y;\n      png_fixed_point g = png_ptr->colorspace.end_points_XYZ.green_Y;\n      png_fixed_point b = png_ptr->colorspace.end_points_XYZ.blue_Y;\n      png_fixed_point total = r+g+b;\n\n      if (total > 0 &&\n         r >= 0 && png_muldiv(&r, r, 32768, total) && r >= 0 && r <= 32768 &&\n         g >= 0 && png_muldiv(&g, g, 32768, total) && g >= 0 && g <= 32768 &&\n         b >= 0 && png_muldiv(&b, b, 32768, total) && b >= 0 && b <= 32768 &&\n         r+g+b <= 32769)\n      {\n         /* We allow 0 coefficients here.  r+g+b may be 32769 if two or\n          * all of the coefficients were rounded up.  Handle this by\n          * reducing the *largest* coefficient by 1; this matches the\n          * approach used for the default coefficients in pngrtran.c\n          */\n         int add = 0;\n\n         if (r+g+b > 32768)\n            add = -1;\n         else if (r+g+b < 32768)\n            add = 1;\n\n         if (add != 0)\n         {\n            if (g >= r && g >= b)\n               g += add;\n            else if (r >= g && r >= b)\n               r += add;\n            else\n               b += add;\n         }\n\n         /* Check for an internal error. */\n         if (r+g+b != 32768)\n            png_error(png_ptr,\n               \"internal error handling cHRM coefficients\");\n\n         else\n         {\n            png_ptr->rgb_to_gray_red_coeff   = (png_uint_16)r;\n            png_ptr->rgb_to_gray_green_coeff = (png_uint_16)g;\n         }\n      }\n\n      /* This is a png_error at present even though it could be ignored -\n       * it should never happen, but it is important that if it does, the\n       * bug is fixed.\n       */\n      else\n         png_error(png_ptr, \"internal error handling cHRM->XYZ\");\n   }\n}\n#endif /* READ_RGB_TO_GRAY */\n\n#endif /* COLORSPACE */\n\n#ifdef __GNUC__\n/* This exists solely to work round a warning from GNU C. */\nstatic int /* PRIVATE */\npng_gt(size_t a, size_t b)\n{\n    return a > b;\n}\n#else\n#   define png_gt(a,b) ((a) > (b))\n#endif\n\nvoid /* PRIVATE */\npng_check_IHDR(png_const_structrp png_ptr,\n   png_uint_32 width, png_uint_32 height, int bit_depth,\n   int color_type, int interlace_type, int compression_type,\n   int filter_type)\n{\n   int error = 0;\n\n   /* Check for width and height valid values */\n   if (width == 0)\n   {\n      png_warning(png_ptr, \"Image width is zero in IHDR\");\n      error = 1;\n   }\n\n   if (width > PNG_UINT_31_MAX)\n   {\n      png_warning(png_ptr, \"Invalid image width in IHDR\");\n      error = 1;\n   }\n\n   if (png_gt(((width + 7) & (~7)),\n       ((PNG_SIZE_MAX\n           - 48        /* big_row_buf hack */\n           - 1)        /* filter byte */\n           / 8)        /* 8-byte RGBA pixels */\n           - 1))       /* extra max_pixel_depth pad */\n   {\n      /* The size of the row must be within the limits of this architecture.\n       * Because the read code can perform arbitrary transformations the\n       * maximum size is checked here.  Because the code in png_read_start_row\n       * adds extra space \"for safety's sake\" in several places a conservative\n       * limit is used here.\n       *\n       * NOTE: it would be far better to check the size that is actually used,\n       * but the effect in the real world is minor and the changes are more\n       * extensive, therefore much more dangerous and much more difficult to\n       * write in a way that avoids compiler warnings.\n       */\n      png_warning(png_ptr, \"Image width is too large for this architecture\");\n      error = 1;\n   }\n\n#ifdef PNG_SET_USER_LIMITS_SUPPORTED\n   if (width > png_ptr->user_width_max)\n#else\n   if (width > PNG_USER_WIDTH_MAX)\n#endif\n   {\n      png_warning(png_ptr, \"Image width exceeds user limit in IHDR\");\n      error = 1;\n   }\n\n   if (height == 0)\n   {\n      png_warning(png_ptr, \"Image height is zero in IHDR\");\n      error = 1;\n   }\n\n   if (height > PNG_UINT_31_MAX)\n   {\n      png_warning(png_ptr, \"Invalid image height in IHDR\");\n      error = 1;\n   }\n\n#ifdef PNG_SET_USER_LIMITS_SUPPORTED\n   if (height > png_ptr->user_height_max)\n#else\n   if (height > PNG_USER_HEIGHT_MAX)\n#endif\n   {\n      png_warning(png_ptr, \"Image height exceeds user limit in IHDR\");\n      error = 1;\n   }\n\n   /* Check other values */\n   if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 &&\n       bit_depth != 8 && bit_depth != 16)\n   {\n      png_warning(png_ptr, \"Invalid bit depth in IHDR\");\n      error = 1;\n   }\n\n   if (color_type < 0 || color_type == 1 ||\n       color_type == 5 || color_type > 6)\n   {\n      png_warning(png_ptr, \"Invalid color type in IHDR\");\n      error = 1;\n   }\n\n   if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) ||\n       ((color_type == PNG_COLOR_TYPE_RGB ||\n         color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||\n         color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8))\n   {\n      png_warning(png_ptr, \"Invalid color type/bit depth combination in IHDR\");\n      error = 1;\n   }\n\n   if (interlace_type >= PNG_INTERLACE_LAST)\n   {\n      png_warning(png_ptr, \"Unknown interlace method in IHDR\");\n      error = 1;\n   }\n\n   if (compression_type != PNG_COMPRESSION_TYPE_BASE)\n   {\n      png_warning(png_ptr, \"Unknown compression method in IHDR\");\n      error = 1;\n   }\n\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n   /* Accept filter_method 64 (intrapixel differencing) only if\n    * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and\n    * 2. Libpng did not read a PNG signature (this filter_method is only\n    *    used in PNG datastreams that are embedded in MNG datastreams) and\n    * 3. The application called png_permit_mng_features with a mask that\n    *    included PNG_FLAG_MNG_FILTER_64 and\n    * 4. The filter_method is 64 and\n    * 5. The color_type is RGB or RGBA\n    */\n   if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 &&\n       png_ptr->mng_features_permitted != 0)\n      png_warning(png_ptr, \"MNG features are not allowed in a PNG datastream\");\n\n   if (filter_type != PNG_FILTER_TYPE_BASE)\n   {\n      if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&\n          (filter_type == PNG_INTRAPIXEL_DIFFERENCING) &&\n          ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) &&\n          (color_type == PNG_COLOR_TYPE_RGB ||\n          color_type == PNG_COLOR_TYPE_RGB_ALPHA)))\n      {\n         png_warning(png_ptr, \"Unknown filter method in IHDR\");\n         error = 1;\n      }\n\n      if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0)\n      {\n         png_warning(png_ptr, \"Invalid filter method in IHDR\");\n         error = 1;\n      }\n   }\n\n#else\n   if (filter_type != PNG_FILTER_TYPE_BASE)\n   {\n      png_warning(png_ptr, \"Unknown filter method in IHDR\");\n      error = 1;\n   }\n#endif\n\n   if (error == 1)\n      png_error(png_ptr, \"Invalid IHDR data\");\n}\n\n#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED)\n/* ASCII to fp functions */\n/* Check an ASCII formated floating point value, see the more detailed\n * comments in pngpriv.h\n */\n/* The following is used internally to preserve the sticky flags */\n#define png_fp_add(state, flags) ((state) |= (flags))\n#define png_fp_set(state, value) ((state) = (value) | ((state) & PNG_FP_STICKY))\n\nint /* PRIVATE */\npng_check_fp_number(png_const_charp string, png_size_t size, int *statep,\n   png_size_tp whereami)\n{\n   int state = *statep;\n   png_size_t i = *whereami;\n\n   while (i < size)\n   {\n      int type;\n      /* First find the type of the next character */\n      switch (string[i])\n      {\n      case 43:  type = PNG_FP_SAW_SIGN;                   break;\n      case 45:  type = PNG_FP_SAW_SIGN + PNG_FP_NEGATIVE; break;\n      case 46:  type = PNG_FP_SAW_DOT;                    break;\n      case 48:  type = PNG_FP_SAW_DIGIT;                  break;\n      case 49: case 50: case 51: case 52:\n      case 53: case 54: case 55: case 56:\n      case 57:  type = PNG_FP_SAW_DIGIT + PNG_FP_NONZERO; break;\n      case 69:\n      case 101: type = PNG_FP_SAW_E;                      break;\n      default:  goto PNG_FP_End;\n      }\n\n      /* Now deal with this type according to the current\n       * state, the type is arranged to not overlap the\n       * bits of the PNG_FP_STATE.\n       */\n      switch ((state & PNG_FP_STATE) + (type & PNG_FP_SAW_ANY))\n      {\n      case PNG_FP_INTEGER + PNG_FP_SAW_SIGN:\n         if ((state & PNG_FP_SAW_ANY) != 0)\n            goto PNG_FP_End; /* not a part of the number */\n\n         png_fp_add(state, type);\n         break;\n\n      case PNG_FP_INTEGER + PNG_FP_SAW_DOT:\n         /* Ok as trailer, ok as lead of fraction. */\n         if ((state & PNG_FP_SAW_DOT) != 0) /* two dots */\n            goto PNG_FP_End;\n\n         else if ((state & PNG_FP_SAW_DIGIT) != 0) /* trailing dot? */\n            png_fp_add(state, type);\n\n         else\n            png_fp_set(state, PNG_FP_FRACTION | type);\n\n         break;\n\n      case PNG_FP_INTEGER + PNG_FP_SAW_DIGIT:\n         if ((state & PNG_FP_SAW_DOT) != 0) /* delayed fraction */\n            png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);\n\n         png_fp_add(state, type | PNG_FP_WAS_VALID);\n\n         break;\n\n      case PNG_FP_INTEGER + PNG_FP_SAW_E:\n         if ((state & PNG_FP_SAW_DIGIT) == 0)\n            goto PNG_FP_End;\n\n         png_fp_set(state, PNG_FP_EXPONENT);\n\n         break;\n\n   /* case PNG_FP_FRACTION + PNG_FP_SAW_SIGN:\n         goto PNG_FP_End; ** no sign in fraction */\n\n   /* case PNG_FP_FRACTION + PNG_FP_SAW_DOT:\n         goto PNG_FP_End; ** Because SAW_DOT is always set */\n\n      case PNG_FP_FRACTION + PNG_FP_SAW_DIGIT:\n         png_fp_add(state, type | PNG_FP_WAS_VALID);\n         break;\n\n      case PNG_FP_FRACTION + PNG_FP_SAW_E:\n         /* This is correct because the trailing '.' on an\n          * integer is handled above - so we can only get here\n          * with the sequence \".E\" (with no preceding digits).\n          */\n         if ((state & PNG_FP_SAW_DIGIT) == 0)\n            goto PNG_FP_End;\n\n         png_fp_set(state, PNG_FP_EXPONENT);\n\n         break;\n\n      case PNG_FP_EXPONENT + PNG_FP_SAW_SIGN:\n         if ((state & PNG_FP_SAW_ANY) != 0)\n            goto PNG_FP_End; /* not a part of the number */\n\n         png_fp_add(state, PNG_FP_SAW_SIGN);\n\n         break;\n\n   /* case PNG_FP_EXPONENT + PNG_FP_SAW_DOT:\n         goto PNG_FP_End; */\n\n      case PNG_FP_EXPONENT + PNG_FP_SAW_DIGIT:\n         png_fp_add(state, PNG_FP_SAW_DIGIT | PNG_FP_WAS_VALID);\n\n         break;\n\n   /* case PNG_FP_EXPONEXT + PNG_FP_SAW_E:\n         goto PNG_FP_End; */\n\n      default: goto PNG_FP_End; /* I.e. break 2 */\n      }\n\n      /* The character seems ok, continue. */\n      ++i;\n   }\n\nPNG_FP_End:\n   /* Here at the end, update the state and return the correct\n    * return code.\n    */\n   *statep = state;\n   *whereami = i;\n\n   return (state & PNG_FP_SAW_DIGIT) != 0;\n}\n\n\n/* The same but for a complete string. */\nint\npng_check_fp_string(png_const_charp string, png_size_t size)\n{\n   int        state=0;\n   png_size_t char_index=0;\n\n   if (png_check_fp_number(string, size, &state, &char_index) != 0 &&\n      (char_index == size || string[char_index] == 0))\n      return state /* must be non-zero - see above */;\n\n   return 0; /* i.e. fail */\n}\n#endif /* pCAL || sCAL */\n\n#ifdef PNG_sCAL_SUPPORTED\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\n/* Utility used below - a simple accurate power of ten from an integral\n * exponent.\n */\nstatic double\npng_pow10(int power)\n{\n   int recip = 0;\n   double d = 1;\n\n   /* Handle negative exponent with a reciprocal at the end because\n    * 10 is exact whereas .1 is inexact in base 2\n    */\n   if (power < 0)\n   {\n      if (power < DBL_MIN_10_EXP) return 0;\n      recip = 1, power = -power;\n   }\n\n   if (power > 0)\n   {\n      /* Decompose power bitwise. */\n      double mult = 10;\n      do\n      {\n         if (power & 1) d *= mult;\n         mult *= mult;\n         power >>= 1;\n      }\n      while (power > 0);\n\n      if (recip != 0) d = 1/d;\n   }\n   /* else power is 0 and d is 1 */\n\n   return d;\n}\n\n/* Function to format a floating point value in ASCII with a given\n * precision.\n */\nvoid /* PRIVATE */\npng_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,\n    double fp, unsigned int precision)\n{\n   /* We use standard functions from math.h, but not printf because\n    * that would require stdio.  The caller must supply a buffer of\n    * sufficient size or we will png_error.  The tests on size and\n    * the space in ascii[] consumed are indicated below.\n    */\n   if (precision < 1)\n      precision = DBL_DIG;\n\n   /* Enforce the limit of the implementation precision too. */\n   if (precision > DBL_DIG+1)\n      precision = DBL_DIG+1;\n\n   /* Basic sanity checks */\n   if (size >= precision+5) /* See the requirements below. */\n   {\n      if (fp < 0)\n      {\n         fp = -fp;\n         *ascii++ = 45; /* '-'  PLUS 1 TOTAL 1 */\n         --size;\n      }\n\n      if (fp >= DBL_MIN && fp <= DBL_MAX)\n      {\n         int exp_b10;   /* A base 10 exponent */\n         double base;   /* 10^exp_b10 */\n\n         /* First extract a base 10 exponent of the number,\n          * the calculation below rounds down when converting\n          * from base 2 to base 10 (multiply by log10(2) -\n          * 0.3010, but 77/256 is 0.3008, so exp_b10 needs to\n          * be increased.  Note that the arithmetic shift\n          * performs a floor() unlike C arithmetic - using a\n          * C multiply would break the following for negative\n          * exponents.\n          */\n         (void)frexp(fp, &exp_b10); /* exponent to base 2 */\n\n         exp_b10 = (exp_b10 * 77) >> 8; /* <= exponent to base 10 */\n\n         /* Avoid underflow here. */\n         base = png_pow10(exp_b10); /* May underflow */\n\n         while (base < DBL_MIN || base < fp)\n         {\n            /* And this may overflow. */\n            double test = png_pow10(exp_b10+1);\n\n            if (test <= DBL_MAX)\n               ++exp_b10, base = test;\n\n            else\n               break;\n         }\n\n         /* Normalize fp and correct exp_b10, after this fp is in the\n          * range [.1,1) and exp_b10 is both the exponent and the digit\n          * *before* which the decimal point should be inserted\n          * (starting with 0 for the first digit).  Note that this\n          * works even if 10^exp_b10 is out of range because of the\n          * test on DBL_MAX above.\n          */\n         fp /= base;\n         while (fp >= 1) fp /= 10, ++exp_b10;\n\n         /* Because of the code above fp may, at this point, be\n          * less than .1, this is ok because the code below can\n          * handle the leading zeros this generates, so no attempt\n          * is made to correct that here.\n          */\n\n         {\n            unsigned int czero, clead, cdigits;\n            char exponent[10];\n\n            /* Allow up to two leading zeros - this will not lengthen\n             * the number compared to using E-n.\n             */\n            if (exp_b10 < 0 && exp_b10 > -3) /* PLUS 3 TOTAL 4 */\n            {\n               czero = -exp_b10; /* PLUS 2 digits: TOTAL 3 */\n               exp_b10 = 0;      /* Dot added below before first output. */\n            }\n            else\n               czero = 0;    /* No zeros to add */\n\n            /* Generate the digit list, stripping trailing zeros and\n             * inserting a '.' before a digit if the exponent is 0.\n             */\n            clead = czero; /* Count of leading zeros */\n            cdigits = 0;   /* Count of digits in list. */\n\n            do\n            {\n               double d;\n\n               fp *= 10;\n               /* Use modf here, not floor and subtract, so that\n                * the separation is done in one step.  At the end\n                * of the loop don't break the number into parts so\n                * that the final digit is rounded.\n                */\n               if (cdigits+czero+1 < precision+clead)\n                  fp = modf(fp, &d);\n\n               else\n               {\n                  d = floor(fp + .5);\n\n                  if (d > 9)\n                  {\n                     /* Rounding up to 10, handle that here. */\n                     if (czero > 0)\n                     {\n                        --czero, d = 1;\n                        if (cdigits == 0) --clead;\n                     }\n                     else\n                     {\n                        while (cdigits > 0 && d > 9)\n                        {\n                           int ch = *--ascii;\n\n                           if (exp_b10 != (-1))\n                              ++exp_b10;\n\n                           else if (ch == 46)\n                           {\n                              ch = *--ascii, ++size;\n                              /* Advance exp_b10 to '1', so that the\n                               * decimal point happens after the\n                               * previous digit.\n                               */\n                              exp_b10 = 1;\n                           }\n\n                           --cdigits;\n                           d = ch - 47;  /* I.e. 1+(ch-48) */\n                        }\n\n                        /* Did we reach the beginning? If so adjust the\n                         * exponent but take into account the leading\n                         * decimal point.\n                         */\n                        if (d > 9)  /* cdigits == 0 */\n                        {\n                           if (exp_b10 == (-1))\n                           {\n                              /* Leading decimal point (plus zeros?), if\n                               * we lose the decimal point here it must\n                               * be reentered below.\n                               */\n                              int ch = *--ascii;\n\n                              if (ch == 46)\n                                 ++size, exp_b10 = 1;\n\n                              /* Else lost a leading zero, so 'exp_b10' is\n                               * still ok at (-1)\n                               */\n                           }\n                           else\n                              ++exp_b10;\n\n                           /* In all cases we output a '1' */\n                           d = 1;\n                        }\n                     }\n                  }\n                  fp = 0; /* Guarantees termination below. */\n               }\n\n               if (d == 0)\n               {\n                  ++czero;\n                  if (cdigits == 0) ++clead;\n               }\n               else\n               {\n                  /* Included embedded zeros in the digit count. */\n                  cdigits += czero - clead;\n                  clead = 0;\n\n                  while (czero > 0)\n                  {\n                     /* exp_b10 == (-1) means we just output the decimal\n                      * place - after the DP don't adjust 'exp_b10' any\n                      * more!\n                      */\n                     if (exp_b10 != (-1))\n                     {\n                        if (exp_b10 == 0) *ascii++ = 46, --size;\n                        /* PLUS 1: TOTAL 4 */\n                        --exp_b10;\n                     }\n                     *ascii++ = 48, --czero;\n                  }\n\n                  if (exp_b10 != (-1))\n                  {\n                     if (exp_b10 == 0)\n                        *ascii++ = 46, --size; /* counted above */\n\n                     --exp_b10;\n                  }\n                  *ascii++ = (char)(48 + (int)d), ++cdigits;\n               }\n            }\n            while (cdigits+czero < precision+clead && fp > DBL_MIN);\n\n            /* The total output count (max) is now 4+precision */\n\n            /* Check for an exponent, if we don't need one we are\n             * done and just need to terminate the string.  At\n             * this point exp_b10==(-1) is effectively if flag - it got\n             * to '-1' because of the decrement after outputting\n             * the decimal point above (the exponent required is\n             * *not* -1!)\n             */\n            if (exp_b10 >= (-1) && exp_b10 <= 2)\n            {\n               /* The following only happens if we didn't output the\n                * leading zeros above for negative exponent, so this\n                * doesn't add to the digit requirement.  Note that the\n                * two zeros here can only be output if the two leading\n                * zeros were *not* output, so this doesn't increase\n                * the output count.\n                */\n               while (--exp_b10 >= 0) *ascii++ = 48;\n\n               *ascii = 0;\n\n               /* Total buffer requirement (including the '\\0') is\n                * 5+precision - see check at the start.\n                */\n               return;\n            }\n\n            /* Here if an exponent is required, adjust size for\n             * the digits we output but did not count.  The total\n             * digit output here so far is at most 1+precision - no\n             * decimal point and no leading or trailing zeros have\n             * been output.\n             */\n            size -= cdigits;\n\n            *ascii++ = 69, --size;    /* 'E': PLUS 1 TOTAL 2+precision */\n\n            /* The following use of an unsigned temporary avoids ambiguities in\n             * the signed arithmetic on exp_b10 and permits GCC at least to do\n             * better optimization.\n             */\n            {\n               unsigned int uexp_b10;\n\n               if (exp_b10 < 0)\n               {\n                  *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */\n                  uexp_b10 = -exp_b10;\n               }\n\n               else\n                  uexp_b10 = exp_b10;\n\n               cdigits = 0;\n\n               while (uexp_b10 > 0)\n               {\n                  exponent[cdigits++] = (char)(48 + uexp_b10 % 10);\n                  uexp_b10 /= 10;\n               }\n            }\n\n            /* Need another size check here for the exponent digits, so\n             * this need not be considered above.\n             */\n            if (size > cdigits)\n            {\n               while (cdigits > 0) *ascii++ = exponent[--cdigits];\n\n               *ascii = 0;\n\n               return;\n            }\n         }\n      }\n      else if (!(fp >= DBL_MIN))\n      {\n         *ascii++ = 48; /* '0' */\n         *ascii = 0;\n         return;\n      }\n      else\n      {\n         *ascii++ = 105; /* 'i' */\n         *ascii++ = 110; /* 'n' */\n         *ascii++ = 102; /* 'f' */\n         *ascii = 0;\n         return;\n      }\n   }\n\n   /* Here on buffer too small. */\n   png_error(png_ptr, \"ASCII conversion buffer too small\");\n}\n\n#  endif /* FLOATING_POINT */\n\n#  ifdef PNG_FIXED_POINT_SUPPORTED\n/* Function to format a fixed point value in ASCII.\n */\nvoid /* PRIVATE */\npng_ascii_from_fixed(png_const_structrp png_ptr, png_charp ascii,\n    png_size_t size, png_fixed_point fp)\n{\n   /* Require space for 10 decimal digits, a decimal point, a minus sign and a\n    * trailing \\0, 13 characters:\n    */\n   if (size > 12)\n   {\n      png_uint_32 num;\n\n      /* Avoid overflow here on the minimum integer. */\n      if (fp < 0)\n         *ascii++ = 45, num = -fp;\n      else\n         num = fp;\n\n      if (num <= 0x80000000) /* else overflowed */\n      {\n         unsigned int ndigits = 0, first = 16 /* flag value */;\n         char digits[10];\n\n         while (num)\n         {\n            /* Split the low digit off num: */\n            unsigned int tmp = num/10;\n            num -= tmp*10;\n            digits[ndigits++] = (char)(48 + num);\n            /* Record the first non-zero digit, note that this is a number\n             * starting at 1, it's not actually the array index.\n             */\n            if (first == 16 && num > 0)\n               first = ndigits;\n            num = tmp;\n         }\n\n         if (ndigits > 0)\n         {\n            while (ndigits > 5) *ascii++ = digits[--ndigits];\n            /* The remaining digits are fractional digits, ndigits is '5' or\n             * smaller at this point.  It is certainly not zero.  Check for a\n             * non-zero fractional digit:\n             */\n            if (first <= 5)\n            {\n               unsigned int i;\n               *ascii++ = 46; /* decimal point */\n               /* ndigits may be <5 for small numbers, output leading zeros\n                * then ndigits digits to first:\n                */\n               i = 5;\n               while (ndigits < i) *ascii++ = 48, --i;\n               while (ndigits >= first) *ascii++ = digits[--ndigits];\n               /* Don't output the trailing zeros! */\n            }\n         }\n         else\n            *ascii++ = 48;\n\n         /* And null terminate the string: */\n         *ascii = 0;\n         return;\n      }\n   }\n\n   /* Here on buffer too small. */\n   png_error(png_ptr, \"ASCII conversion buffer too small\");\n}\n#   endif /* FIXED_POINT */\n#endif /* SCAL */\n\n#if defined(PNG_FLOATING_POINT_SUPPORTED) && \\\n   !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \\\n   (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \\\n   defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \\\n   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \\\n   (defined(PNG_sCAL_SUPPORTED) && \\\n   defined(PNG_FLOATING_ARITHMETIC_SUPPORTED))\npng_fixed_point\npng_fixed(png_const_structrp png_ptr, double fp, png_const_charp text)\n{\n   double r = floor(100000 * fp + .5);\n\n   if (r > 2147483647. || r < -2147483648.)\n      png_fixed_error(png_ptr, text);\n\n#  ifndef PNG_ERROR_TEXT_SUPPORTED\n   PNG_UNUSED(text)\n#  endif\n\n   return (png_fixed_point)r;\n}\n#endif\n\n#if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_COLORSPACE_SUPPORTED) ||\\\n    defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED)\n/* muldiv functions */\n/* This API takes signed arguments and rounds the result to the nearest\n * integer (or, for a fixed point number - the standard argument - to\n * the nearest .00001).  Overflow and divide by zero are signalled in\n * the result, a boolean - true on success, false on overflow.\n */\nint\npng_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times,\n    png_int_32 divisor)\n{\n   /* Return a * times / divisor, rounded. */\n   if (divisor != 0)\n   {\n      if (a == 0 || times == 0)\n      {\n         *res = 0;\n         return 1;\n      }\n      else\n      {\n#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED\n         double r = a;\n         r *= times;\n         r /= divisor;\n         r = floor(r+.5);\n\n         /* A png_fixed_point is a 32-bit integer. */\n         if (r <= 2147483647. && r >= -2147483648.)\n         {\n            *res = (png_fixed_point)r;\n            return 1;\n         }\n#else\n         int negative = 0;\n         png_uint_32 A, T, D;\n         png_uint_32 s16, s32, s00;\n\n         if (a < 0)\n            negative = 1, A = -a;\n         else\n            A = a;\n\n         if (times < 0)\n            negative = !negative, T = -times;\n         else\n            T = times;\n\n         if (divisor < 0)\n            negative = !negative, D = -divisor;\n         else\n            D = divisor;\n\n         /* Following can't overflow because the arguments only\n          * have 31 bits each, however the result may be 32 bits.\n          */\n         s16 = (A >> 16) * (T & 0xffff) +\n                           (A & 0xffff) * (T >> 16);\n         /* Can't overflow because the a*times bit is only 30\n          * bits at most.\n          */\n         s32 = (A >> 16) * (T >> 16) + (s16 >> 16);\n         s00 = (A & 0xffff) * (T & 0xffff);\n\n         s16 = (s16 & 0xffff) << 16;\n         s00 += s16;\n\n         if (s00 < s16)\n            ++s32; /* carry */\n\n         if (s32 < D) /* else overflow */\n         {\n            /* s32.s00 is now the 64-bit product, do a standard\n             * division, we know that s32 < D, so the maximum\n             * required shift is 31.\n             */\n            int bitshift = 32;\n            png_fixed_point result = 0; /* NOTE: signed */\n\n            while (--bitshift >= 0)\n            {\n               png_uint_32 d32, d00;\n\n               if (bitshift > 0)\n                  d32 = D >> (32-bitshift), d00 = D << bitshift;\n\n               else\n                  d32 = 0, d00 = D;\n\n               if (s32 > d32)\n               {\n                  if (s00 < d00) --s32; /* carry */\n                  s32 -= d32, s00 -= d00, result += 1<<bitshift;\n               }\n\n               else\n                  if (s32 == d32 && s00 >= d00)\n                     s32 = 0, s00 -= d00, result += 1<<bitshift;\n            }\n\n            /* Handle the rounding. */\n            if (s00 >= (D >> 1))\n               ++result;\n\n            if (negative != 0)\n               result = -result;\n\n            /* Check for overflow. */\n            if ((negative != 0 && result <= 0) ||\n                (negative == 0 && result >= 0))\n            {\n               *res = result;\n               return 1;\n            }\n         }\n#endif\n      }\n   }\n\n   return 0;\n}\n#endif /* READ_GAMMA || INCH_CONVERSIONS */\n\n#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED)\n/* The following is for when the caller doesn't much care about the\n * result.\n */\npng_fixed_point\npng_muldiv_warn(png_const_structrp png_ptr, png_fixed_point a, png_int_32 times,\n    png_int_32 divisor)\n{\n   png_fixed_point result;\n\n   if (png_muldiv(&result, a, times, divisor) != 0)\n      return result;\n\n   png_warning(png_ptr, \"fixed point overflow ignored\");\n   return 0;\n}\n#endif\n\n#ifdef PNG_GAMMA_SUPPORTED /* more fixed point functions for gamma */\n/* Calculate a reciprocal, return 0 on div-by-zero or overflow. */\npng_fixed_point\npng_reciprocal(png_fixed_point a)\n{\n#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED\n   double r = floor(1E10/a+.5);\n\n   if (r <= 2147483647. && r >= -2147483648.)\n      return (png_fixed_point)r;\n#else\n   png_fixed_point res;\n\n   if (png_muldiv(&res, 100000, 100000, a) != 0)\n      return res;\n#endif\n\n   return 0; /* error/overflow */\n}\n\n/* This is the shared test on whether a gamma value is 'significant' - whether\n * it is worth doing gamma correction.\n */\nint /* PRIVATE */\npng_gamma_significant(png_fixed_point gamma_val)\n{\n   return gamma_val < PNG_FP_1 - PNG_GAMMA_THRESHOLD_FIXED ||\n       gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED;\n}\n#endif\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n#ifdef PNG_16BIT_SUPPORTED\n/* A local convenience routine. */\nstatic png_fixed_point\npng_product2(png_fixed_point a, png_fixed_point b)\n{\n   /* The required result is 1/a * 1/b; the following preserves accuracy. */\n#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED\n   double r = a * 1E-5;\n   r *= b;\n   r = floor(r+.5);\n\n   if (r <= 2147483647. && r >= -2147483648.)\n      return (png_fixed_point)r;\n#else\n   png_fixed_point res;\n\n   if (png_muldiv(&res, a, b, 100000) != 0)\n      return res;\n#endif\n\n   return 0; /* overflow */\n}\n#endif /* 16BIT */\n\n/* The inverse of the above. */\npng_fixed_point\npng_reciprocal2(png_fixed_point a, png_fixed_point b)\n{\n   /* The required result is 1/a * 1/b; the following preserves accuracy. */\n#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED\n   if (a != 0 && b != 0)\n   {\n      double r = 1E15/a;\n      r /= b;\n      r = floor(r+.5);\n\n      if (r <= 2147483647. && r >= -2147483648.)\n         return (png_fixed_point)r;\n   }\n#else\n   /* This may overflow because the range of png_fixed_point isn't symmetric,\n    * but this API is only used for the product of file and screen gamma so it\n    * doesn't matter that the smallest number it can produce is 1/21474, not\n    * 1/100000\n    */\n   png_fixed_point res = png_product2(a, b);\n\n   if (res != 0)\n      return png_reciprocal(res);\n#endif\n\n   return 0; /* overflow */\n}\n#endif /* READ_GAMMA */\n\n#ifdef PNG_READ_GAMMA_SUPPORTED /* gamma table code */\n#ifndef PNG_FLOATING_ARITHMETIC_SUPPORTED\n/* Fixed point gamma.\n *\n * The code to calculate the tables used below can be found in the shell script\n * contrib/tools/intgamma.sh\n *\n * To calculate gamma this code implements fast log() and exp() calls using only\n * fixed point arithmetic.  This code has sufficient precision for either 8-bit\n * or 16-bit sample values.\n *\n * The tables used here were calculated using simple 'bc' programs, but C double\n * precision floating point arithmetic would work fine.\n *\n * 8-bit log table\n *   This is a table of -log(value/255)/log(2) for 'value' in the range 128 to\n *   255, so it's the base 2 logarithm of a normalized 8-bit floating point\n *   mantissa.  The numbers are 32-bit fractions.\n */\nstatic const png_uint_32\npng_8bit_l2[128] =\n{\n   4270715492U, 4222494797U, 4174646467U, 4127164793U, 4080044201U, 4033279239U,\n   3986864580U, 3940795015U, 3895065449U, 3849670902U, 3804606499U, 3759867474U,\n   3715449162U, 3671346997U, 3627556511U, 3584073329U, 3540893168U, 3498011834U,\n   3455425220U, 3413129301U, 3371120137U, 3329393864U, 3287946700U, 3246774933U,\n   3205874930U, 3165243125U, 3124876025U, 3084770202U, 3044922296U, 3005329011U,\n   2965987113U, 2926893432U, 2888044853U, 2849438323U, 2811070844U, 2772939474U,\n   2735041326U, 2697373562U, 2659933400U, 2622718104U, 2585724991U, 2548951424U,\n   2512394810U, 2476052606U, 2439922311U, 2404001468U, 2368287663U, 2332778523U,\n   2297471715U, 2262364947U, 2227455964U, 2192742551U, 2158222529U, 2123893754U,\n   2089754119U, 2055801552U, 2022034013U, 1988449497U, 1955046031U, 1921821672U,\n   1888774511U, 1855902668U, 1823204291U, 1790677560U, 1758320682U, 1726131893U,\n   1694109454U, 1662251657U, 1630556815U, 1599023271U, 1567649391U, 1536433567U,\n   1505374214U, 1474469770U, 1443718700U, 1413119487U, 1382670639U, 1352370686U,\n   1322218179U, 1292211689U, 1262349810U, 1232631153U, 1203054352U, 1173618059U,\n   1144320946U, 1115161701U, 1086139034U, 1057251672U, 1028498358U, 999877854U,\n   971388940U, 943030410U, 914801076U, 886699767U, 858725327U, 830876614U,\n   803152505U, 775551890U, 748073672U, 720716771U, 693480120U, 666362667U,\n   639363374U, 612481215U, 585715177U, 559064263U, 532527486U, 506103872U,\n   479792461U, 453592303U, 427502463U, 401522014U, 375650043U, 349885648U,\n   324227938U, 298676034U, 273229066U, 247886176U, 222646516U, 197509248U,\n   172473545U, 147538590U, 122703574U, 97967701U, 73330182U, 48790236U,\n   24347096U, 0U\n\n#if 0\n   /* The following are the values for 16-bit tables - these work fine for the\n    * 8-bit conversions but produce very slightly larger errors in the 16-bit\n    * log (about 1.2 as opposed to 0.7 absolute error in the final value).  To\n    * use these all the shifts below must be adjusted appropriately.\n    */\n   65166, 64430, 63700, 62976, 62257, 61543, 60835, 60132, 59434, 58741, 58054,\n   57371, 56693, 56020, 55352, 54689, 54030, 53375, 52726, 52080, 51439, 50803,\n   50170, 49542, 48918, 48298, 47682, 47070, 46462, 45858, 45257, 44661, 44068,\n   43479, 42894, 42312, 41733, 41159, 40587, 40020, 39455, 38894, 38336, 37782,\n   37230, 36682, 36137, 35595, 35057, 34521, 33988, 33459, 32932, 32408, 31887,\n   31369, 30854, 30341, 29832, 29325, 28820, 28319, 27820, 27324, 26830, 26339,\n   25850, 25364, 24880, 24399, 23920, 23444, 22970, 22499, 22029, 21562, 21098,\n   20636, 20175, 19718, 19262, 18808, 18357, 17908, 17461, 17016, 16573, 16132,\n   15694, 15257, 14822, 14390, 13959, 13530, 13103, 12678, 12255, 11834, 11415,\n   10997, 10582, 10168, 9756, 9346, 8937, 8531, 8126, 7723, 7321, 6921, 6523,\n   6127, 5732, 5339, 4947, 4557, 4169, 3782, 3397, 3014, 2632, 2251, 1872, 1495,\n   1119, 744, 372\n#endif\n};\n\nstatic png_int_32\npng_log8bit(unsigned int x)\n{\n   unsigned int lg2 = 0;\n   /* Each time 'x' is multiplied by 2, 1 must be subtracted off the final log,\n    * because the log is actually negate that means adding 1.  The final\n    * returned value thus has the range 0 (for 255 input) to 7.994 (for 1\n    * input), return -1 for the overflow (log 0) case, - so the result is\n    * always at most 19 bits.\n    */\n   if ((x &= 0xff) == 0)\n      return -1;\n\n   if ((x & 0xf0) == 0)\n      lg2  = 4, x <<= 4;\n\n   if ((x & 0xc0) == 0)\n      lg2 += 2, x <<= 2;\n\n   if ((x & 0x80) == 0)\n      lg2 += 1, x <<= 1;\n\n   /* result is at most 19 bits, so this cast is safe: */\n   return (png_int_32)((lg2 << 16) + ((png_8bit_l2[x-128]+32768)>>16));\n}\n\n/* The above gives exact (to 16 binary places) log2 values for 8-bit images,\n * for 16-bit images we use the most significant 8 bits of the 16-bit value to\n * get an approximation then multiply the approximation by a correction factor\n * determined by the remaining up to 8 bits.  This requires an additional step\n * in the 16-bit case.\n *\n * We want log2(value/65535), we have log2(v'/255), where:\n *\n *    value = v' * 256 + v''\n *          = v' * f\n *\n * So f is value/v', which is equal to (256+v''/v') since v' is in the range 128\n * to 255 and v'' is in the range 0 to 255 f will be in the range 256 to less\n * than 258.  The final factor also needs to correct for the fact that our 8-bit\n * value is scaled by 255, whereas the 16-bit values must be scaled by 65535.\n *\n * This gives a final formula using a calculated value 'x' which is value/v' and\n * scaling by 65536 to match the above table:\n *\n *   log2(x/257) * 65536\n *\n * Since these numbers are so close to '1' we can use simple linear\n * interpolation between the two end values 256/257 (result -368.61) and 258/257\n * (result 367.179).  The values used below are scaled by a further 64 to give\n * 16-bit precision in the interpolation:\n *\n * Start (256): -23591\n * Zero  (257):      0\n * End   (258):  23499\n */\n#ifdef PNG_16BIT_SUPPORTED\nstatic png_int_32\npng_log16bit(png_uint_32 x)\n{\n   unsigned int lg2 = 0;\n\n   /* As above, but now the input has 16 bits. */\n   if ((x &= 0xffff) == 0)\n      return -1;\n\n   if ((x & 0xff00) == 0)\n      lg2  = 8, x <<= 8;\n\n   if ((x & 0xf000) == 0)\n      lg2 += 4, x <<= 4;\n\n   if ((x & 0xc000) == 0)\n      lg2 += 2, x <<= 2;\n\n   if ((x & 0x8000) == 0)\n      lg2 += 1, x <<= 1;\n\n   /* Calculate the base logarithm from the top 8 bits as a 28-bit fractional\n    * value.\n    */\n   lg2 <<= 28;\n   lg2 += (png_8bit_l2[(x>>8)-128]+8) >> 4;\n\n   /* Now we need to interpolate the factor, this requires a division by the top\n    * 8 bits.  Do this with maximum precision.\n    */\n   x = ((x << 16) + (x >> 9)) / (x >> 8);\n\n   /* Since we divided by the top 8 bits of 'x' there will be a '1' at 1<<24,\n    * the value at 1<<16 (ignoring this) will be 0 or 1; this gives us exactly\n    * 16 bits to interpolate to get the low bits of the result.  Round the\n    * answer.  Note that the end point values are scaled by 64 to retain overall\n    * precision and that 'lg2' is current scaled by an extra 12 bits, so adjust\n    * the overall scaling by 6-12.  Round at every step.\n    */\n   x -= 1U << 24;\n\n   if (x <= 65536U) /* <= '257' */\n      lg2 += ((23591U * (65536U-x)) + (1U << (16+6-12-1))) >> (16+6-12);\n\n   else\n      lg2 -= ((23499U * (x-65536U)) + (1U << (16+6-12-1))) >> (16+6-12);\n\n   /* Safe, because the result can't have more than 20 bits: */\n   return (png_int_32)((lg2 + 2048) >> 12);\n}\n#endif /* 16BIT */\n\n/* The 'exp()' case must invert the above, taking a 20-bit fixed point\n * logarithmic value and returning a 16 or 8-bit number as appropriate.  In\n * each case only the low 16 bits are relevant - the fraction - since the\n * integer bits (the top 4) simply determine a shift.\n *\n * The worst case is the 16-bit distinction between 65535 and 65534. This\n * requires perhaps spurious accuracy in the decoding of the logarithm to\n * distinguish log2(65535/65534.5) - 10^-5 or 17 bits.  There is little chance\n * of getting this accuracy in practice.\n *\n * To deal with this the following exp() function works out the exponent of the\n * frational part of the logarithm by using an accurate 32-bit value from the\n * top four fractional bits then multiplying in the remaining bits.\n */\nstatic const png_uint_32\npng_32bit_exp[16] =\n{\n   /* NOTE: the first entry is deliberately set to the maximum 32-bit value. */\n   4294967295U, 4112874773U, 3938502376U, 3771522796U, 3611622603U, 3458501653U,\n   3311872529U, 3171459999U, 3037000500U, 2908241642U, 2784941738U, 2666869345U,\n   2553802834U, 2445529972U, 2341847524U, 2242560872U\n};\n\n/* Adjustment table; provided to explain the numbers in the code below. */\n#if 0\nfor (i=11;i>=0;--i){ print i, \" \", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), \"\\n\"}\n   11 44937.64284865548751208448\n   10 45180.98734845585101160448\n    9 45303.31936980687359311872\n    8 45364.65110595323018870784\n    7 45395.35850361789624614912\n    6 45410.72259715102037508096\n    5 45418.40724413220722311168\n    4 45422.25021786898173001728\n    3 45424.17186732298419044352\n    2 45425.13273269940811464704\n    1 45425.61317555035558641664\n    0 45425.85339951654943850496\n#endif\n\nstatic png_uint_32\npng_exp(png_fixed_point x)\n{\n   if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */\n   {\n      /* Obtain a 4-bit approximation */\n      png_uint_32 e = png_32bit_exp[(x >> 12) & 0x0f];\n\n      /* Incorporate the low 12 bits - these decrease the returned value by\n       * multiplying by a number less than 1 if the bit is set.  The multiplier\n       * is determined by the above table and the shift. Notice that the values\n       * converge on 45426 and this is used to allow linear interpolation of the\n       * low bits.\n       */\n      if (x & 0x800)\n         e -= (((e >> 16) * 44938U) +  16U) >> 5;\n\n      if (x & 0x400)\n         e -= (((e >> 16) * 45181U) +  32U) >> 6;\n\n      if (x & 0x200)\n         e -= (((e >> 16) * 45303U) +  64U) >> 7;\n\n      if (x & 0x100)\n         e -= (((e >> 16) * 45365U) + 128U) >> 8;\n\n      if (x & 0x080)\n         e -= (((e >> 16) * 45395U) + 256U) >> 9;\n\n      if (x & 0x040)\n         e -= (((e >> 16) * 45410U) + 512U) >> 10;\n\n      /* And handle the low 6 bits in a single block. */\n      e -= (((e >> 16) * 355U * (x & 0x3fU)) + 256U) >> 9;\n\n      /* Handle the upper bits of x. */\n      e >>= x >> 16;\n      return e;\n   }\n\n   /* Check for overflow */\n   if (x <= 0)\n      return png_32bit_exp[0];\n\n   /* Else underflow */\n   return 0;\n}\n\nstatic png_byte\npng_exp8bit(png_fixed_point lg2)\n{\n   /* Get a 32-bit value: */\n   png_uint_32 x = png_exp(lg2);\n\n   /* Convert the 32-bit value to 0..255 by multiplying by 256-1. Note that the\n    * second, rounding, step can't overflow because of the first, subtraction,\n    * step.\n    */\n   x -= x >> 8;\n   return (png_byte)(((x + 0x7fffffU) >> 24) & 0xff);\n}\n\n#ifdef PNG_16BIT_SUPPORTED\nstatic png_uint_16\npng_exp16bit(png_fixed_point lg2)\n{\n   /* Get a 32-bit value: */\n   png_uint_32 x = png_exp(lg2);\n\n   /* Convert the 32-bit value to 0..65535 by multiplying by 65536-1: */\n   x -= x >> 16;\n   return (png_uint_16)((x + 32767U) >> 16);\n}\n#endif /* 16BIT */\n#endif /* FLOATING_ARITHMETIC */\n\npng_byte\npng_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val)\n{\n   if (value > 0 && value < 255)\n   {\n#     ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED\n         /* 'value' is unsigned, ANSI-C90 requires the compiler to correctly\n          * convert this to a floating point value.  This includes values that\n          * would overflow if 'value' were to be converted to 'int'.\n          *\n          * Apparently GCC, however, does an intermediate conversion to (int)\n          * on some (ARM) but not all (x86) platforms, possibly because of\n          * hardware FP limitations.  (E.g. if the hardware conversion always\n          * assumes the integer register contains a signed value.)  This results\n          * in ANSI-C undefined behavior for large values.\n          *\n          * Other implementations on the same machine might actually be ANSI-C90\n          * conformant and therefore compile spurious extra code for the large\n          * values.\n          *\n          * We can be reasonably sure that an unsigned to float conversion\n          * won't be faster than an int to float one.  Therefore this code\n          * assumes responsibility for the undefined behavior, which it knows\n          * can't happen because of the check above.\n          *\n          * Note the argument to this routine is an (unsigned int) because, on\n          * 16-bit platforms, it is assigned a value which might be out of\n          * range for an (int); that would result in undefined behavior in the\n          * caller if the *argument* ('value') were to be declared (int).\n          */\n         double r = floor(255*pow((int)/*SAFE*/value/255.,gamma_val*.00001)+.5);\n         return (png_byte)r;\n#     else\n         png_int_32 lg2 = png_log8bit(value);\n         png_fixed_point res;\n\n         if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0)\n            return png_exp8bit(res);\n\n         /* Overflow. */\n         value = 0;\n#     endif\n   }\n\n   return (png_byte)(value & 0xff);\n}\n\n#ifdef PNG_16BIT_SUPPORTED\npng_uint_16\npng_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val)\n{\n   if (value > 0 && value < 65535)\n   {\n#     ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED\n         /* The same (unsigned int)->(double) constraints apply here as above,\n          * however in this case the (unsigned int) to (int) conversion can\n          * overflow on an ANSI-C90 compliant system so the cast needs to ensure\n          * that this is not possible.\n          */\n         double r = floor(65535*pow((png_int_32)value/65535.,\n                     gamma_val*.00001)+.5);\n         return (png_uint_16)r;\n#     else\n         png_int_32 lg2 = png_log16bit(value);\n         png_fixed_point res;\n\n         if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0)\n            return png_exp16bit(res);\n\n         /* Overflow. */\n         value = 0;\n#     endif\n   }\n\n   return (png_uint_16)value;\n}\n#endif /* 16BIT */\n\n/* This does the right thing based on the bit_depth field of the\n * png_struct, interpreting values as 8-bit or 16-bit.  While the result\n * is nominally a 16-bit value if bit depth is 8 then the result is\n * 8-bit (as are the arguments.)\n */\npng_uint_16 /* PRIVATE */\npng_gamma_correct(png_structrp png_ptr, unsigned int value,\n    png_fixed_point gamma_val)\n{\n   if (png_ptr->bit_depth == 8)\n      return png_gamma_8bit_correct(value, gamma_val);\n\n#ifdef PNG_16BIT_SUPPORTED\n   else\n      return png_gamma_16bit_correct(value, gamma_val);\n#else\n      /* should not reach this */\n      return 0;\n#endif /* 16BIT */\n}\n\n#ifdef PNG_16BIT_SUPPORTED\n/* Internal function to build a single 16-bit table - the table consists of\n * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount\n * to shift the input values right (or 16-number_of_signifiant_bits).\n *\n * The caller is responsible for ensuring that the table gets cleaned up on\n * png_error (i.e. if one of the mallocs below fails) - i.e. the *table argument\n * should be somewhere that will be cleaned.\n */\nstatic void\npng_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable,\n   PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)\n{\n   /* Various values derived from 'shift': */\n   PNG_CONST unsigned int num = 1U << (8U - shift);\n#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED\n   /* CSE the division and work round wacky GCC warnings (see the comments\n    * in png_gamma_8bit_correct for where these come from.)\n    */\n   PNG_CONST double fmax = 1./(((png_int_32)1 << (16U - shift))-1);\n#endif\n   PNG_CONST unsigned int max = (1U << (16U - shift))-1U;\n   PNG_CONST unsigned int max_by_2 = 1U << (15U-shift);\n   unsigned int i;\n\n   png_uint_16pp table = *ptable =\n       (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p)));\n\n   for (i = 0; i < num; i++)\n   {\n      png_uint_16p sub_table = table[i] =\n          (png_uint_16p)png_malloc(png_ptr, 256 * (sizeof (png_uint_16)));\n\n      /* The 'threshold' test is repeated here because it can arise for one of\n       * the 16-bit tables even if the others don't hit it.\n       */\n      if (png_gamma_significant(gamma_val) != 0)\n      {\n         /* The old code would overflow at the end and this would cause the\n          * 'pow' function to return a result >1, resulting in an\n          * arithmetic error.  This code follows the spec exactly; ig is\n          * the recovered input sample, it always has 8-16 bits.\n          *\n          * We want input * 65535/max, rounded, the arithmetic fits in 32\n          * bits (unsigned) so long as max <= 32767.\n          */\n         unsigned int j;\n         for (j = 0; j < 256; j++)\n         {\n            png_uint_32 ig = (j << (8-shift)) + i;\n#           ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED\n               /* Inline the 'max' scaling operation: */\n               /* See png_gamma_8bit_correct for why the cast to (int) is\n                * required here.\n                */\n               double d = floor(65535.*pow(ig*fmax, gamma_val*.00001)+.5);\n               sub_table[j] = (png_uint_16)d;\n#           else\n               if (shift != 0)\n                  ig = (ig * 65535U + max_by_2)/max;\n\n               sub_table[j] = png_gamma_16bit_correct(ig, gamma_val);\n#           endif\n         }\n      }\n      else\n      {\n         /* We must still build a table, but do it the fast way. */\n         unsigned int j;\n\n         for (j = 0; j < 256; j++)\n         {\n            png_uint_32 ig = (j << (8-shift)) + i;\n\n            if (shift != 0)\n               ig = (ig * 65535U + max_by_2)/max;\n\n            sub_table[j] = (png_uint_16)ig;\n         }\n      }\n   }\n}\n\n/* NOTE: this function expects the *inverse* of the overall gamma transformation\n * required.\n */\nstatic void\npng_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable,\n   PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)\n{\n   PNG_CONST unsigned int num = 1U << (8U - shift);\n   PNG_CONST unsigned int max = (1U << (16U - shift))-1U;\n   unsigned int i;\n   png_uint_32 last;\n\n   png_uint_16pp table = *ptable =\n       (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p)));\n\n   /* 'num' is the number of tables and also the number of low bits of low\n    * bits of the input 16-bit value used to select a table.  Each table is\n    * itself indexed by the high 8 bits of the value.\n    */\n   for (i = 0; i < num; i++)\n      table[i] = (png_uint_16p)png_malloc(png_ptr,\n          256 * (sizeof (png_uint_16)));\n\n   /* 'gamma_val' is set to the reciprocal of the value calculated above, so\n    * pow(out,g) is an *input* value.  'last' is the last input value set.\n    *\n    * In the loop 'i' is used to find output values.  Since the output is\n    * 8-bit there are only 256 possible values.  The tables are set up to\n    * select the closest possible output value for each input by finding\n    * the input value at the boundary between each pair of output values\n    * and filling the table up to that boundary with the lower output\n    * value.\n    *\n    * The boundary values are 0.5,1.5..253.5,254.5.  Since these are 9-bit\n    * values the code below uses a 16-bit value in i; the values start at\n    * 128.5 (for 0.5) and step by 257, for a total of 254 values (the last\n    * entries are filled with 255).  Start i at 128 and fill all 'last'\n    * table entries <= 'max'\n    */\n   last = 0;\n   for (i = 0; i < 255; ++i) /* 8-bit output value */\n   {\n      /* Find the corresponding maximum input value */\n      png_uint_16 out = (png_uint_16)(i * 257U); /* 16-bit output value */\n\n      /* Find the boundary value in 16 bits: */\n      png_uint_32 bound = png_gamma_16bit_correct(out+128U, gamma_val);\n\n      /* Adjust (round) to (16-shift) bits: */\n      bound = (bound * max + 32768U)/65535U + 1U;\n\n      while (last < bound)\n      {\n         table[last & (0xffU >> shift)][last >> (8U - shift)] = out;\n         last++;\n      }\n   }\n\n   /* And fill in the final entries. */\n   while (last < (num << 8))\n   {\n      table[last & (0xff >> shift)][last >> (8U - shift)] = 65535U;\n      last++;\n   }\n}\n#endif /* 16BIT */\n\n/* Build a single 8-bit table: same as the 16-bit case but much simpler (and\n * typically much faster).  Note that libpng currently does no sBIT processing\n * (apparently contrary to the spec) so a 256-entry table is always generated.\n */\nstatic void\npng_build_8bit_table(png_structrp png_ptr, png_bytepp ptable,\n   PNG_CONST png_fixed_point gamma_val)\n{\n   unsigned int i;\n   png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256);\n\n   if (png_gamma_significant(gamma_val) != 0)\n      for (i=0; i<256; i++)\n         table[i] = png_gamma_8bit_correct(i, gamma_val);\n\n   else\n      for (i=0; i<256; ++i)\n         table[i] = (png_byte)(i & 0xff);\n}\n\n/* Used from png_read_destroy and below to release the memory used by the gamma\n * tables.\n */\nvoid /* PRIVATE */\npng_destroy_gamma_table(png_structrp png_ptr)\n{\n   png_free(png_ptr, png_ptr->gamma_table);\n   png_ptr->gamma_table = NULL;\n\n#ifdef PNG_16BIT_SUPPORTED\n   if (png_ptr->gamma_16_table != NULL)\n   {\n      int i;\n      int istop = (1 << (8 - png_ptr->gamma_shift));\n      for (i = 0; i < istop; i++)\n      {\n         png_free(png_ptr, png_ptr->gamma_16_table[i]);\n      }\n   png_free(png_ptr, png_ptr->gamma_16_table);\n   png_ptr->gamma_16_table = NULL;\n   }\n#endif /* 16BIT */\n\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \\\n   defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \\\n   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)\n   png_free(png_ptr, png_ptr->gamma_from_1);\n   png_ptr->gamma_from_1 = NULL;\n   png_free(png_ptr, png_ptr->gamma_to_1);\n   png_ptr->gamma_to_1 = NULL;\n\n#ifdef PNG_16BIT_SUPPORTED\n   if (png_ptr->gamma_16_from_1 != NULL)\n   {\n      int i;\n      int istop = (1 << (8 - png_ptr->gamma_shift));\n      for (i = 0; i < istop; i++)\n      {\n         png_free(png_ptr, png_ptr->gamma_16_from_1[i]);\n      }\n   png_free(png_ptr, png_ptr->gamma_16_from_1);\n   png_ptr->gamma_16_from_1 = NULL;\n   }\n   if (png_ptr->gamma_16_to_1 != NULL)\n   {\n      int i;\n      int istop = (1 << (8 - png_ptr->gamma_shift));\n      for (i = 0; i < istop; i++)\n      {\n         png_free(png_ptr, png_ptr->gamma_16_to_1[i]);\n      }\n   png_free(png_ptr, png_ptr->gamma_16_to_1);\n   png_ptr->gamma_16_to_1 = NULL;\n   }\n#endif /* 16BIT */\n#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */\n}\n\n/* We build the 8- or 16-bit gamma tables here.  Note that for 16-bit\n * tables, we don't make a full table if we are reducing to 8-bit in\n * the future.  Note also how the gamma_16 tables are segmented so that\n * we don't need to allocate > 64K chunks for a full 16-bit table.\n */\nvoid /* PRIVATE */\npng_build_gamma_table(png_structrp png_ptr, int bit_depth)\n{\n  png_debug(1, \"in png_build_gamma_table\");\n\n  /* Remove any existing table; this copes with multiple calls to\n   * png_read_update_info.  The warning is because building the gamma tables\n   * multiple times is a performance hit - it's harmless but the ability to call\n   * png_read_update_info() multiple times is new in 1.5.6 so it seems sensible\n   * to warn if the app introduces such a hit.\n   */\n  if (png_ptr->gamma_table != NULL || png_ptr->gamma_16_table != NULL)\n  {\n    png_warning(png_ptr, \"gamma table being rebuilt\");\n    png_destroy_gamma_table(png_ptr);\n  }\n\n  if (bit_depth <= 8)\n  {\n     png_build_8bit_table(png_ptr, &png_ptr->gamma_table,\n         png_ptr->screen_gamma > 0 ?  png_reciprocal2(png_ptr->colorspace.gamma,\n         png_ptr->screen_gamma) : PNG_FP_1);\n\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \\\n   defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \\\n   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)\n     if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)\n     {\n        png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1,\n            png_reciprocal(png_ptr->colorspace.gamma));\n\n        png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1,\n            png_ptr->screen_gamma > 0 ?  png_reciprocal(png_ptr->screen_gamma) :\n            png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);\n     }\n#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */\n  }\n#ifdef PNG_16BIT_SUPPORTED\n  else\n  {\n     png_byte shift, sig_bit;\n\n     if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)\n     {\n        sig_bit = png_ptr->sig_bit.red;\n\n        if (png_ptr->sig_bit.green > sig_bit)\n           sig_bit = png_ptr->sig_bit.green;\n\n        if (png_ptr->sig_bit.blue > sig_bit)\n           sig_bit = png_ptr->sig_bit.blue;\n     }\n     else\n        sig_bit = png_ptr->sig_bit.gray;\n\n     /* 16-bit gamma code uses this equation:\n      *\n      *   ov = table[(iv & 0xff) >> gamma_shift][iv >> 8]\n      *\n      * Where 'iv' is the input color value and 'ov' is the output value -\n      * pow(iv, gamma).\n      *\n      * Thus the gamma table consists of up to 256 256-entry tables.  The table\n      * is selected by the (8-gamma_shift) most significant of the low 8 bits of\n      * the color value then indexed by the upper 8 bits:\n      *\n      *   table[low bits][high 8 bits]\n      *\n      * So the table 'n' corresponds to all those 'iv' of:\n      *\n      *   <all high 8-bit values><n << gamma_shift>..<(n+1 << gamma_shift)-1>\n      *\n      */\n     if (sig_bit > 0 && sig_bit < 16U)\n        /* shift == insignificant bits */\n        shift = (png_byte)((16U - sig_bit) & 0xff);\n\n     else\n        shift = 0; /* keep all 16 bits */\n\n     if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)\n     {\n        /* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively\n         * the significant bits in the *input* when the output will\n         * eventually be 8 bits.  By default it is 11.\n         */\n        if (shift < (16U - PNG_MAX_GAMMA_8))\n           shift = (16U - PNG_MAX_GAMMA_8);\n     }\n\n     if (shift > 8U)\n        shift = 8U; /* Guarantees at least one table! */\n\n     png_ptr->gamma_shift = shift;\n\n     /* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now\n      * PNG_COMPOSE).  This effectively smashed the background calculation for\n      * 16-bit output because the 8-bit table assumes the result will be reduced\n      * to 8 bits.\n      */\n     if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)\n         png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift,\n         png_ptr->screen_gamma > 0 ? png_product2(png_ptr->colorspace.gamma,\n         png_ptr->screen_gamma) : PNG_FP_1);\n\n     else\n         png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift,\n         png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma,\n         png_ptr->screen_gamma) : PNG_FP_1);\n\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \\\n   defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \\\n   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)\n     if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)\n     {\n        png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift,\n            png_reciprocal(png_ptr->colorspace.gamma));\n\n        /* Notice that the '16 from 1' table should be full precision, however\n         * the lookup on this table still uses gamma_shift, so it can't be.\n         * TODO: fix this.\n         */\n        png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift,\n            png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :\n            png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);\n     }\n#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */\n  }\n#endif /* 16BIT */\n}\n#endif /* READ_GAMMA */\n\n/* HARDWARE OR SOFTWARE OPTION SUPPORT */\n#ifdef PNG_SET_OPTION_SUPPORTED\nint PNGAPI\npng_set_option(png_structrp png_ptr, int option, int onoff)\n{\n   if (png_ptr != NULL && option >= 0 && option < PNG_OPTION_NEXT &&\n      (option & 1) == 0)\n   {\n      int mask = 3 << option;\n      int setting = (2 + (onoff != 0)) << option;\n      int current = png_ptr->options;\n\n      png_ptr->options = (png_byte)(((current & ~mask) | setting) & 0xff);\n\n      return (current & mask) >> option;\n   }\n\n   return PNG_OPTION_INVALID;\n}\n#endif\n\n/* sRGB support */\n#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\\\n   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)\n/* sRGB conversion tables; these are machine generated with the code in\n * contrib/tools/makesRGB.c.  The actual sRGB transfer curve defined in the\n * specification (see the article at http://en.wikipedia.org/wiki/SRGB)\n * is used, not the gamma=1/2.2 approximation use elsewhere in libpng.\n * The sRGB to linear table is exact (to the nearest 16-bit linear fraction).\n * The inverse (linear to sRGB) table has accuracies as follows:\n *\n * For all possible (255*65535+1) input values:\n *\n *    error: -0.515566 - 0.625971, 79441 (0.475369%) of readings inexact\n *\n * For the input values corresponding to the 65536 16-bit values:\n *\n *    error: -0.513727 - 0.607759, 308 (0.469978%) of readings inexact\n *\n * In all cases the inexact readings are only off by one.\n */\n\n#ifdef PNG_SIMPLIFIED_READ_SUPPORTED\n/* The convert-to-sRGB table is only currently required for read. */\nconst png_uint_16 png_sRGB_table[256] =\n{\n   0,20,40,60,80,99,119,139,\n   159,179,199,219,241,264,288,313,\n   340,367,396,427,458,491,526,562,\n   599,637,677,718,761,805,851,898,\n   947,997,1048,1101,1156,1212,1270,1330,\n   1391,1453,1517,1583,1651,1720,1790,1863,\n   1937,2013,2090,2170,2250,2333,2418,2504,\n   2592,2681,2773,2866,2961,3058,3157,3258,\n   3360,3464,3570,3678,3788,3900,4014,4129,\n   4247,4366,4488,4611,4736,4864,4993,5124,\n   5257,5392,5530,5669,5810,5953,6099,6246,\n   6395,6547,6700,6856,7014,7174,7335,7500,\n   7666,7834,8004,8177,8352,8528,8708,8889,\n   9072,9258,9445,9635,9828,10022,10219,10417,\n   10619,10822,11028,11235,11446,11658,11873,12090,\n   12309,12530,12754,12980,13209,13440,13673,13909,\n   14146,14387,14629,14874,15122,15371,15623,15878,\n   16135,16394,16656,16920,17187,17456,17727,18001,\n   18277,18556,18837,19121,19407,19696,19987,20281,\n   20577,20876,21177,21481,21787,22096,22407,22721,\n   23038,23357,23678,24002,24329,24658,24990,25325,\n   25662,26001,26344,26688,27036,27386,27739,28094,\n   28452,28813,29176,29542,29911,30282,30656,31033,\n   31412,31794,32179,32567,32957,33350,33745,34143,\n   34544,34948,35355,35764,36176,36591,37008,37429,\n   37852,38278,38706,39138,39572,40009,40449,40891,\n   41337,41785,42236,42690,43147,43606,44069,44534,\n   45002,45473,45947,46423,46903,47385,47871,48359,\n   48850,49344,49841,50341,50844,51349,51858,52369,\n   52884,53401,53921,54445,54971,55500,56032,56567,\n   57105,57646,58190,58737,59287,59840,60396,60955,\n   61517,62082,62650,63221,63795,64372,64952,65535\n};\n#endif /* SIMPLIFIED_READ */\n\n/* The base/delta tables are required for both read and write (but currently\n * only the simplified versions.)\n */\nconst png_uint_16 png_sRGB_base[512] =\n{\n   128,1782,3383,4644,5675,6564,7357,8074,\n   8732,9346,9921,10463,10977,11466,11935,12384,\n   12816,13233,13634,14024,14402,14769,15125,15473,\n   15812,16142,16466,16781,17090,17393,17690,17981,\n   18266,18546,18822,19093,19359,19621,19879,20133,\n   20383,20630,20873,21113,21349,21583,21813,22041,\n   22265,22487,22707,22923,23138,23350,23559,23767,\n   23972,24175,24376,24575,24772,24967,25160,25352,\n   25542,25730,25916,26101,26284,26465,26645,26823,\n   27000,27176,27350,27523,27695,27865,28034,28201,\n   28368,28533,28697,28860,29021,29182,29341,29500,\n   29657,29813,29969,30123,30276,30429,30580,30730,\n   30880,31028,31176,31323,31469,31614,31758,31902,\n   32045,32186,32327,32468,32607,32746,32884,33021,\n   33158,33294,33429,33564,33697,33831,33963,34095,\n   34226,34357,34486,34616,34744,34873,35000,35127,\n   35253,35379,35504,35629,35753,35876,35999,36122,\n   36244,36365,36486,36606,36726,36845,36964,37083,\n   37201,37318,37435,37551,37668,37783,37898,38013,\n   38127,38241,38354,38467,38580,38692,38803,38915,\n   39026,39136,39246,39356,39465,39574,39682,39790,\n   39898,40005,40112,40219,40325,40431,40537,40642,\n   40747,40851,40955,41059,41163,41266,41369,41471,\n   41573,41675,41777,41878,41979,42079,42179,42279,\n   42379,42478,42577,42676,42775,42873,42971,43068,\n   43165,43262,43359,43456,43552,43648,43743,43839,\n   43934,44028,44123,44217,44311,44405,44499,44592,\n   44685,44778,44870,44962,45054,45146,45238,45329,\n   45420,45511,45601,45692,45782,45872,45961,46051,\n   46140,46229,46318,46406,46494,46583,46670,46758,\n   46846,46933,47020,47107,47193,47280,47366,47452,\n   47538,47623,47709,47794,47879,47964,48048,48133,\n   48217,48301,48385,48468,48552,48635,48718,48801,\n   48884,48966,49048,49131,49213,49294,49376,49458,\n   49539,49620,49701,49782,49862,49943,50023,50103,\n   50183,50263,50342,50422,50501,50580,50659,50738,\n   50816,50895,50973,51051,51129,51207,51285,51362,\n   51439,51517,51594,51671,51747,51824,51900,51977,\n   52053,52129,52205,52280,52356,52432,52507,52582,\n   52657,52732,52807,52881,52956,53030,53104,53178,\n   53252,53326,53400,53473,53546,53620,53693,53766,\n   53839,53911,53984,54056,54129,54201,54273,54345,\n   54417,54489,54560,54632,54703,54774,54845,54916,\n   54987,55058,55129,55199,55269,55340,55410,55480,\n   55550,55620,55689,55759,55828,55898,55967,56036,\n   56105,56174,56243,56311,56380,56448,56517,56585,\n   56653,56721,56789,56857,56924,56992,57059,57127,\n   57194,57261,57328,57395,57462,57529,57595,57662,\n   57728,57795,57861,57927,57993,58059,58125,58191,\n   58256,58322,58387,58453,58518,58583,58648,58713,\n   58778,58843,58908,58972,59037,59101,59165,59230,\n   59294,59358,59422,59486,59549,59613,59677,59740,\n   59804,59867,59930,59993,60056,60119,60182,60245,\n   60308,60370,60433,60495,60558,60620,60682,60744,\n   60806,60868,60930,60992,61054,61115,61177,61238,\n   61300,61361,61422,61483,61544,61605,61666,61727,\n   61788,61848,61909,61969,62030,62090,62150,62211,\n   62271,62331,62391,62450,62510,62570,62630,62689,\n   62749,62808,62867,62927,62986,63045,63104,63163,\n   63222,63281,63340,63398,63457,63515,63574,63632,\n   63691,63749,63807,63865,63923,63981,64039,64097,\n   64155,64212,64270,64328,64385,64443,64500,64557,\n   64614,64672,64729,64786,64843,64900,64956,65013,\n   65070,65126,65183,65239,65296,65352,65409,65465\n};\n\nconst png_byte png_sRGB_delta[512] =\n{\n   207,201,158,129,113,100,90,82,77,72,68,64,61,59,56,54,\n   52,50,49,47,46,45,43,42,41,40,39,39,38,37,36,36,\n   35,34,34,33,33,32,32,31,31,30,30,30,29,29,28,28,\n   28,27,27,27,27,26,26,26,25,25,25,25,24,24,24,24,\n   23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21,\n   21,20,20,20,20,20,20,20,20,19,19,19,19,19,19,19,\n   19,18,18,18,18,18,18,18,18,18,18,17,17,17,17,17,\n   17,17,17,17,17,17,16,16,16,16,16,16,16,16,16,16,\n   16,16,16,16,15,15,15,15,15,15,15,15,15,15,15,15,\n   15,15,15,15,14,14,14,14,14,14,14,14,14,14,14,14,\n   14,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13,\n   13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,\n   12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,\n   12,12,12,12,12,12,12,12,12,12,12,12,11,11,11,11,\n   11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,\n   11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,\n   11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,\n   10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,\n   10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,\n   10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n   9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n   9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n   9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n   9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n   8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,\n   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7\n};\n#endif /* SIMPLIFIED READ/WRITE sRGB support */\n\n/* SIMPLIFIED READ/WRITE SUPPORT */\n#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\\\n   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)\nstatic int\npng_image_free_function(png_voidp argument)\n{\n   png_imagep image = png_voidcast(png_imagep, argument);\n   png_controlp cp = image->opaque;\n   png_control c;\n\n   /* Double check that we have a png_ptr - it should be impossible to get here\n    * without one.\n    */\n   if (cp->png_ptr == NULL)\n      return 0;\n\n   /* First free any data held in the control structure. */\n#  ifdef PNG_STDIO_SUPPORTED\n      if (cp->owned_file != 0)\n      {\n         FILE *fp = png_voidcast(FILE*, cp->png_ptr->io_ptr);\n         cp->owned_file = 0;\n\n         /* Ignore errors here. */\n         if (fp != NULL)\n         {\n            cp->png_ptr->io_ptr = NULL;\n            (void)fclose(fp);\n         }\n      }\n#  endif\n\n   /* Copy the control structure so that the original, allocated, version can be\n    * safely freed.  Notice that a png_error here stops the remainder of the\n    * cleanup, but this is probably fine because that would indicate bad memory\n    * problems anyway.\n    */\n   c = *cp;\n   image->opaque = &c;\n   png_free(c.png_ptr, cp);\n\n   /* Then the structures, calling the correct API. */\n   if (c.for_write != 0)\n   {\n#     ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED\n         png_destroy_write_struct(&c.png_ptr, &c.info_ptr);\n#     else\n         png_error(c.png_ptr, \"simplified write not supported\");\n#     endif\n   }\n   else\n   {\n#     ifdef PNG_SIMPLIFIED_READ_SUPPORTED\n         png_destroy_read_struct(&c.png_ptr, &c.info_ptr, NULL);\n#     else\n         png_error(c.png_ptr, \"simplified read not supported\");\n#     endif\n   }\n\n   /* Success. */\n   return 1;\n}\n\nvoid PNGAPI\npng_image_free(png_imagep image)\n{\n   /* Safely call the real function, but only if doing so is safe at this point\n    * (if not inside an error handling context).  Otherwise assume\n    * png_safe_execute will call this API after the return.\n    */\n   if (image != NULL && image->opaque != NULL &&\n      image->opaque->error_buf == NULL)\n   {\n      /* Ignore errors here: */\n      (void)png_safe_execute(image, png_image_free_function, image);\n      image->opaque = NULL;\n   }\n}\n\nint /* PRIVATE */\npng_image_error(png_imagep image, png_const_charp error_message)\n{\n   /* Utility to log an error. */\n   png_safecat(image->message, (sizeof image->message), 0, error_message);\n   image->warning_or_error |= PNG_IMAGE_ERROR;\n   png_image_free(image);\n   return 0;\n}\n\n#endif /* SIMPLIFIED READ/WRITE */\n#endif /* READ || WRITE */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngerror.c",
    "content": "\n/* pngerror.c - stub functions for i/o and memory allocation\n *\n * Last changed in libpng 1.6.15 [November 20, 2014]\n * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * This file provides a location for all error handling.  Users who\n * need special error handling are expected to write replacement functions\n * and use png_set_error_fn() to use those functions.  See the instructions\n * at each function.\n */\n\n#include \"pngpriv.h\"\n\n#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)\n\nstatic PNG_FUNCTION(void, png_default_error,PNGARG((png_const_structrp png_ptr,\n    png_const_charp error_message)),PNG_NORETURN);\n\n#ifdef PNG_WARNINGS_SUPPORTED\nstatic void /* PRIVATE */\npng_default_warning PNGARG((png_const_structrp png_ptr,\n   png_const_charp warning_message));\n#endif /* WARNINGS */\n\n/* This function is called whenever there is a fatal error.  This function\n * should not be changed.  If there is a need to handle errors differently,\n * you should supply a replacement error function and use png_set_error_fn()\n * to replace the error function at run-time.\n */\n#ifdef PNG_ERROR_TEXT_SUPPORTED\nPNG_FUNCTION(void,PNGAPI\npng_error,(png_const_structrp png_ptr, png_const_charp error_message),\n   PNG_NORETURN)\n{\n#ifdef PNG_ERROR_NUMBERS_SUPPORTED\n   char msg[16];\n   if (png_ptr != NULL)\n   {\n      if ((png_ptr->flags &\n         (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)\n      {\n         if (*error_message == PNG_LITERAL_SHARP)\n         {\n            /* Strip \"#nnnn \" from beginning of error message. */\n            int offset;\n            for (offset = 1; offset<15; offset++)\n               if (error_message[offset] == ' ')\n                  break;\n\n            if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)\n            {\n               int i;\n               for (i = 0; i < offset - 1; i++)\n                  msg[i] = error_message[i + 1];\n               msg[i - 1] = '\\0';\n               error_message = msg;\n            }\n\n            else\n               error_message += offset;\n      }\n\n      else\n      {\n         if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)\n         {\n            msg[0] = '0';\n            msg[1] = '\\0';\n            error_message = msg;\n         }\n       }\n     }\n   }\n#endif\n   if (png_ptr != NULL && png_ptr->error_fn != NULL)\n      (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr),\n          error_message);\n\n   /* If the custom handler doesn't exist, or if it returns,\n      use the default handler, which will not return. */\n   png_default_error(png_ptr, error_message);\n}\n#else\nPNG_FUNCTION(void,PNGAPI\npng_err,(png_const_structrp png_ptr),PNG_NORETURN)\n{\n   /* Prior to 1.5.2 the error_fn received a NULL pointer, expressed\n    * erroneously as '\\0', instead of the empty string \"\".  This was\n    * apparently an error, introduced in libpng-1.2.20, and png_default_error\n    * will crash in this case.\n    */\n   if (png_ptr != NULL && png_ptr->error_fn != NULL)\n      (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr), \"\");\n\n   /* If the custom handler doesn't exist, or if it returns,\n      use the default handler, which will not return. */\n   png_default_error(png_ptr, \"\");\n}\n#endif /* ERROR_TEXT */\n\n/* Utility to safely appends strings to a buffer.  This never errors out so\n * error checking is not required in the caller.\n */\nsize_t\npng_safecat(png_charp buffer, size_t bufsize, size_t pos,\n   png_const_charp string)\n{\n   if (buffer != NULL && pos < bufsize)\n   {\n      if (string != NULL)\n         while (*string != '\\0' && pos < bufsize-1)\n           buffer[pos++] = *string++;\n\n      buffer[pos] = '\\0';\n   }\n\n   return pos;\n}\n\n#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED)\n/* Utility to dump an unsigned value into a buffer, given a start pointer and\n * and end pointer (which should point just *beyond* the end of the buffer!)\n * Returns the pointer to the start of the formatted string.\n */\npng_charp\npng_format_number(png_const_charp start, png_charp end, int format,\n   png_alloc_size_t number)\n{\n   int count = 0;    /* number of digits output */\n   int mincount = 1; /* minimum number required */\n   int output = 0;   /* digit output (for the fixed point format) */\n\n   *--end = '\\0';\n\n   /* This is written so that the loop always runs at least once, even with\n    * number zero.\n    */\n   while (end > start && (number != 0 || count < mincount))\n   {\n\n      static const char digits[] = \"0123456789ABCDEF\";\n\n      switch (format)\n      {\n         case PNG_NUMBER_FORMAT_fixed:\n            /* Needs five digits (the fraction) */\n            mincount = 5;\n            if (output != 0 || number % 10 != 0)\n            {\n               *--end = digits[number % 10];\n               output = 1;\n            }\n            number /= 10;\n            break;\n\n         case PNG_NUMBER_FORMAT_02u:\n            /* Expects at least 2 digits. */\n            mincount = 2;\n            /* FALL THROUGH */\n\n         case PNG_NUMBER_FORMAT_u:\n            *--end = digits[number % 10];\n            number /= 10;\n            break;\n\n         case PNG_NUMBER_FORMAT_02x:\n            /* This format expects at least two digits */\n            mincount = 2;\n            /* FALL THROUGH */\n\n         case PNG_NUMBER_FORMAT_x:\n            *--end = digits[number & 0xf];\n            number >>= 4;\n            break;\n\n         default: /* an error */\n            number = 0;\n            break;\n      }\n\n      /* Keep track of the number of digits added */\n      ++count;\n\n      /* Float a fixed number here: */\n      if ((format == PNG_NUMBER_FORMAT_fixed) && (count == 5) && (end > start))\n      {\n         /* End of the fraction, but maybe nothing was output?  In that case\n          * drop the decimal point.  If the number is a true zero handle that\n          * here.\n          */\n         if (output != 0)\n            *--end = '.';\n         else if (number == 0) /* and !output */\n            *--end = '0';\n      }\n   }\n\n   return end;\n}\n#endif\n\n#ifdef PNG_WARNINGS_SUPPORTED\n/* This function is called whenever there is a non-fatal error.  This function\n * should not be changed.  If there is a need to handle warnings differently,\n * you should supply a replacement warning function and use\n * png_set_error_fn() to replace the warning function at run-time.\n */\nvoid PNGAPI\npng_warning(png_const_structrp png_ptr, png_const_charp warning_message)\n{\n   int offset = 0;\n   if (png_ptr != NULL)\n   {\n#ifdef PNG_ERROR_NUMBERS_SUPPORTED\n   if ((png_ptr->flags &\n       (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)\n#endif\n      {\n         if (*warning_message == PNG_LITERAL_SHARP)\n         {\n            for (offset = 1; offset < 15; offset++)\n               if (warning_message[offset] == ' ')\n                  break;\n         }\n      }\n   }\n   if (png_ptr != NULL && png_ptr->warning_fn != NULL)\n      (*(png_ptr->warning_fn))(png_constcast(png_structrp,png_ptr),\n         warning_message + offset);\n   else\n      png_default_warning(png_ptr, warning_message + offset);\n}\n\n/* These functions support 'formatted' warning messages with up to\n * PNG_WARNING_PARAMETER_COUNT parameters.  In the format string the parameter\n * is introduced by @<number>, where 'number' starts at 1.  This follows the\n * standard established by X/Open for internationalizable error messages.\n */\nvoid\npng_warning_parameter(png_warning_parameters p, int number,\n   png_const_charp string)\n{\n   if (number > 0 && number <= PNG_WARNING_PARAMETER_COUNT)\n      (void)png_safecat(p[number-1], (sizeof p[number-1]), 0, string);\n}\n\nvoid\npng_warning_parameter_unsigned(png_warning_parameters p, int number, int format,\n   png_alloc_size_t value)\n{\n   char buffer[PNG_NUMBER_BUFFER_SIZE];\n   png_warning_parameter(p, number, PNG_FORMAT_NUMBER(buffer, format, value));\n}\n\nvoid\npng_warning_parameter_signed(png_warning_parameters p, int number, int format,\n   png_int_32 value)\n{\n   png_alloc_size_t u;\n   png_charp str;\n   char buffer[PNG_NUMBER_BUFFER_SIZE];\n\n   /* Avoid overflow by doing the negate in a png_alloc_size_t: */\n   u = (png_alloc_size_t)value;\n   if (value < 0)\n      u = ~u + 1;\n\n   str = PNG_FORMAT_NUMBER(buffer, format, u);\n\n   if (value < 0 && str > buffer)\n      *--str = '-';\n\n   png_warning_parameter(p, number, str);\n}\n\nvoid\npng_formatted_warning(png_const_structrp png_ptr, png_warning_parameters p,\n   png_const_charp message)\n{\n   /* The internal buffer is just 192 bytes - enough for all our messages,\n    * overflow doesn't happen because this code checks!  If someone figures\n    * out how to send us a message longer than 192 bytes, all that will\n    * happen is that the message will be truncated appropriately.\n    */\n   size_t i = 0; /* Index in the msg[] buffer: */\n   char msg[192];\n\n   /* Each iteration through the following loop writes at most one character\n    * to msg[i++] then returns here to validate that there is still space for\n    * the trailing '\\0'.  It may (in the case of a parameter) read more than\n    * one character from message[]; it must check for '\\0' and continue to the\n    * test if it finds the end of string.\n    */\n   while (i<(sizeof msg)-1 && *message != '\\0')\n   {\n      /* '@' at end of string is now just printed (previously it was skipped);\n       * it is an error in the calling code to terminate the string with @.\n       */\n      if (p != NULL && *message == '@' && message[1] != '\\0')\n      {\n         int parameter_char = *++message; /* Consume the '@' */\n         static const char valid_parameters[] = \"123456789\";\n         int parameter = 0;\n\n         /* Search for the parameter digit, the index in the string is the\n          * parameter to use.\n          */\n         while (valid_parameters[parameter] != parameter_char &&\n            valid_parameters[parameter] != '\\0')\n            ++parameter;\n\n         /* If the parameter digit is out of range it will just get printed. */\n         if (parameter < PNG_WARNING_PARAMETER_COUNT)\n         {\n            /* Append this parameter */\n            png_const_charp parm = p[parameter];\n            png_const_charp pend = p[parameter] + (sizeof p[parameter]);\n\n            /* No need to copy the trailing '\\0' here, but there is no guarantee\n             * that parm[] has been initialized, so there is no guarantee of a\n             * trailing '\\0':\n             */\n            while (i<(sizeof msg)-1 && *parm != '\\0' && parm < pend)\n               msg[i++] = *parm++;\n\n            /* Consume the parameter digit too: */\n            ++message;\n            continue;\n         }\n\n         /* else not a parameter and there is a character after the @ sign; just\n          * copy that.  This is known not to be '\\0' because of the test above.\n          */\n      }\n\n      /* At this point *message can't be '\\0', even in the bad parameter case\n       * above where there is a lone '@' at the end of the message string.\n       */\n      msg[i++] = *message++;\n   }\n\n   /* i is always less than (sizeof msg), so: */\n   msg[i] = '\\0';\n\n   /* And this is the formatted message. It may be larger than\n    * PNG_MAX_ERROR_TEXT, but that is only used for 'chunk' errors and these\n    * are not (currently) formatted.\n    */\n   png_warning(png_ptr, msg);\n}\n#endif /* WARNINGS */\n\n#ifdef PNG_BENIGN_ERRORS_SUPPORTED\nvoid PNGAPI\npng_benign_error(png_const_structrp png_ptr, png_const_charp error_message)\n{\n   if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0)\n   {\n#     ifdef PNG_READ_SUPPORTED\n         if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&\n            png_ptr->chunk_name != 0)\n            png_chunk_warning(png_ptr, error_message);\n         else\n#     endif\n      png_warning(png_ptr, error_message);\n   }\n\n   else\n   {\n#     ifdef PNG_READ_SUPPORTED\n         if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&\n            png_ptr->chunk_name != 0)\n            png_chunk_error(png_ptr, error_message);\n         else\n#     endif\n      png_error(png_ptr, error_message);\n   }\n\n#  ifndef PNG_ERROR_TEXT_SUPPORTED\n      PNG_UNUSED(error_message)\n#  endif\n}\n\nvoid /* PRIVATE */\npng_app_warning(png_const_structrp png_ptr, png_const_charp error_message)\n{\n  if ((png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) != 0)\n     png_warning(png_ptr, error_message);\n  else\n     png_error(png_ptr, error_message);\n\n#  ifndef PNG_ERROR_TEXT_SUPPORTED\n      PNG_UNUSED(error_message)\n#  endif\n}\n\nvoid /* PRIVATE */\npng_app_error(png_const_structrp png_ptr, png_const_charp error_message)\n{\n  if ((png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) != 0)\n     png_warning(png_ptr, error_message);\n  else\n     png_error(png_ptr, error_message);\n\n#  ifndef PNG_ERROR_TEXT_SUPPORTED\n      PNG_UNUSED(error_message)\n#  endif\n}\n#endif /* BENIGN_ERRORS */\n\n#define PNG_MAX_ERROR_TEXT 196 /* Currently limited by profile_error in png.c */\n#if defined(PNG_WARNINGS_SUPPORTED) || \\\n   (defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED))\n/* These utilities are used internally to build an error message that relates\n * to the current chunk.  The chunk name comes from png_ptr->chunk_name,\n * which is used to prefix the message.  The message is limited in length\n * to 63 bytes. The name characters are output as hex digits wrapped in []\n * if the character is invalid.\n */\n#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))\nstatic PNG_CONST char png_digit[16] = {\n   '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n   'A', 'B', 'C', 'D', 'E', 'F'\n};\n\nstatic void /* PRIVATE */\npng_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp\n    error_message)\n{\n   png_uint_32 chunk_name = png_ptr->chunk_name;\n   int iout = 0, ishift = 24;\n\n   while (ishift >= 0)\n   {\n      int c = (int)(chunk_name >> ishift) & 0xff;\n\n      ishift -= 8;\n      if (isnonalpha(c) != 0)\n      {\n         buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET;\n         buffer[iout++] = png_digit[(c & 0xf0) >> 4];\n         buffer[iout++] = png_digit[c & 0x0f];\n         buffer[iout++] = PNG_LITERAL_RIGHT_SQUARE_BRACKET;\n      }\n\n      else\n      {\n         buffer[iout++] = (char)c;\n      }\n   }\n\n   if (error_message == NULL)\n      buffer[iout] = '\\0';\n\n   else\n   {\n      int iin = 0;\n\n      buffer[iout++] = ':';\n      buffer[iout++] = ' ';\n\n      while (iin < PNG_MAX_ERROR_TEXT-1 && error_message[iin] != '\\0')\n         buffer[iout++] = error_message[iin++];\n\n      /* iin < PNG_MAX_ERROR_TEXT, so the following is safe: */\n      buffer[iout] = '\\0';\n   }\n}\n#endif /* WARNINGS || ERROR_TEXT */\n\n#if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)\nPNG_FUNCTION(void,PNGAPI\npng_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message),\n   PNG_NORETURN)\n{\n   char msg[18+PNG_MAX_ERROR_TEXT];\n   if (png_ptr == NULL)\n      png_error(png_ptr, error_message);\n\n   else\n   {\n      png_format_buffer(png_ptr, msg, error_message);\n      png_error(png_ptr, msg);\n   }\n}\n#endif /* READ && ERROR_TEXT */\n\n#ifdef PNG_WARNINGS_SUPPORTED\nvoid PNGAPI\npng_chunk_warning(png_const_structrp png_ptr, png_const_charp warning_message)\n{\n   char msg[18+PNG_MAX_ERROR_TEXT];\n   if (png_ptr == NULL)\n      png_warning(png_ptr, warning_message);\n\n   else\n   {\n      png_format_buffer(png_ptr, msg, warning_message);\n      png_warning(png_ptr, msg);\n   }\n}\n#endif /* WARNINGS */\n\n#ifdef PNG_READ_SUPPORTED\n#ifdef PNG_BENIGN_ERRORS_SUPPORTED\nvoid PNGAPI\npng_chunk_benign_error(png_const_structrp png_ptr, png_const_charp\n    error_message)\n{\n   if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0)\n      png_chunk_warning(png_ptr, error_message);\n\n   else\n      png_chunk_error(png_ptr, error_message);\n\n#  ifndef PNG_ERROR_TEXT_SUPPORTED\n      PNG_UNUSED(error_message)\n#  endif\n}\n#endif\n#endif /* READ */\n\nvoid /* PRIVATE */\npng_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error)\n{\n#  ifndef PNG_WARNINGS_SUPPORTED\n      PNG_UNUSED(message)\n#  endif\n\n   /* This is always supported, but for just read or just write it\n    * unconditionally does the right thing.\n    */\n#  if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED)\n      if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)\n#  endif\n\n#  ifdef PNG_READ_SUPPORTED\n      {\n         if (error < PNG_CHUNK_ERROR)\n            png_chunk_warning(png_ptr, message);\n\n         else\n            png_chunk_benign_error(png_ptr, message);\n      }\n#  endif\n\n#  if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED)\n      else if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)\n#  endif\n\n#  ifdef PNG_WRITE_SUPPORTED\n      {\n         if (error < PNG_CHUNK_WRITE_ERROR)\n            png_app_warning(png_ptr, message);\n\n         else\n            png_app_error(png_ptr, message);\n      }\n#  endif\n}\n\n#ifdef PNG_ERROR_TEXT_SUPPORTED\n#ifdef PNG_FLOATING_POINT_SUPPORTED\nPNG_FUNCTION(void,\npng_fixed_error,(png_const_structrp png_ptr, png_const_charp name),PNG_NORETURN)\n{\n#  define fixed_message \"fixed point overflow in \"\n#  define fixed_message_ln ((sizeof fixed_message)-1)\n   int  iin;\n   char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT];\n   memcpy(msg, fixed_message, fixed_message_ln);\n   iin = 0;\n   if (name != NULL)\n      while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0)\n      {\n         msg[fixed_message_ln + iin] = name[iin];\n         ++iin;\n      }\n   msg[fixed_message_ln + iin] = 0;\n   png_error(png_ptr, msg);\n}\n#endif\n#endif\n\n#ifdef PNG_SETJMP_SUPPORTED\n/* This API only exists if ANSI-C style error handling is used,\n * otherwise it is necessary for png_default_error to be overridden.\n */\njmp_buf* PNGAPI\npng_set_longjmp_fn(png_structrp png_ptr, png_longjmp_ptr longjmp_fn,\n    size_t jmp_buf_size)\n{\n   /* From libpng 1.6.0 the app gets one chance to set a 'jmpbuf_size' value\n    * and it must not change after that.  Libpng doesn't care how big the\n    * buffer is, just that it doesn't change.\n    *\n    * If the buffer size is no *larger* than the size of jmp_buf when libpng is\n    * compiled a built in jmp_buf is returned; this preserves the pre-1.6.0\n    * semantics that this call will not fail.  If the size is larger, however,\n    * the buffer is allocated and this may fail, causing the function to return\n    * NULL.\n    */\n   if (png_ptr == NULL)\n      return NULL;\n\n   if (png_ptr->jmp_buf_ptr == NULL)\n   {\n      png_ptr->jmp_buf_size = 0; /* not allocated */\n\n      if (jmp_buf_size <= (sizeof png_ptr->jmp_buf_local))\n         png_ptr->jmp_buf_ptr = &png_ptr->jmp_buf_local;\n\n      else\n      {\n         png_ptr->jmp_buf_ptr = png_voidcast(jmp_buf *,\n            png_malloc_warn(png_ptr, jmp_buf_size));\n\n         if (png_ptr->jmp_buf_ptr == NULL)\n            return NULL; /* new NULL return on OOM */\n\n         png_ptr->jmp_buf_size = jmp_buf_size;\n      }\n   }\n\n   else /* Already allocated: check the size */\n   {\n      size_t size = png_ptr->jmp_buf_size;\n\n      if (size == 0)\n      {\n         size = (sizeof png_ptr->jmp_buf_local);\n         if (png_ptr->jmp_buf_ptr != &png_ptr->jmp_buf_local)\n         {\n            /* This is an internal error in libpng: somehow we have been left\n             * with a stack allocated jmp_buf when the application regained\n             * control.  It's always possible to fix this up, but for the moment\n             * this is a png_error because that makes it easy to detect.\n             */\n            png_error(png_ptr, \"Libpng jmp_buf still allocated\");\n            /* png_ptr->jmp_buf_ptr = &png_ptr->jmp_buf_local; */\n         }\n      }\n\n      if (size != jmp_buf_size)\n      {\n         png_warning(png_ptr, \"Application jmp_buf size changed\");\n         return NULL; /* caller will probably crash: no choice here */\n      }\n   }\n\n   /* Finally fill in the function, now we have a satisfactory buffer. It is\n    * valid to change the function on every call.\n    */\n   png_ptr->longjmp_fn = longjmp_fn;\n   return png_ptr->jmp_buf_ptr;\n}\n\nvoid /* PRIVATE */\npng_free_jmpbuf(png_structrp png_ptr)\n{\n   if (png_ptr != NULL)\n   {\n      jmp_buf *jb = png_ptr->jmp_buf_ptr;\n\n      /* A size of 0 is used to indicate a local, stack, allocation of the\n       * pointer; used here and in png.c\n       */\n      if (jb != NULL && png_ptr->jmp_buf_size > 0)\n      {\n\n         /* This stuff is so that a failure to free the error control structure\n          * does not leave libpng in a state with no valid error handling: the\n          * free always succeeds, if there is an error it gets ignored.\n          */\n         if (jb != &png_ptr->jmp_buf_local)\n         {\n            /* Make an internal, libpng, jmp_buf to return here */\n            jmp_buf free_jmp_buf;\n\n            if (!setjmp(free_jmp_buf))\n            {\n               png_ptr->jmp_buf_ptr = &free_jmp_buf; /* come back here */\n               png_ptr->jmp_buf_size = 0; /* stack allocation */\n               png_ptr->longjmp_fn = longjmp;\n               png_free(png_ptr, jb); /* Return to setjmp on error */\n            }\n         }\n      }\n\n      /* *Always* cancel everything out: */\n      png_ptr->jmp_buf_size = 0;\n      png_ptr->jmp_buf_ptr = NULL;\n      png_ptr->longjmp_fn = 0;\n   }\n}\n#endif\n\n/* This is the default error handling function.  Note that replacements for\n * this function MUST NOT RETURN, or the program will likely crash.  This\n * function is used by default, or if the program supplies NULL for the\n * error function pointer in png_set_error_fn().\n */\nstatic PNG_FUNCTION(void /* PRIVATE */,\npng_default_error,(png_const_structrp png_ptr, png_const_charp error_message),\n   PNG_NORETURN)\n{\n#ifdef PNG_CONSOLE_IO_SUPPORTED\n#ifdef PNG_ERROR_NUMBERS_SUPPORTED\n   /* Check on NULL only added in 1.5.4 */\n   if (error_message != NULL && *error_message == PNG_LITERAL_SHARP)\n   {\n      /* Strip \"#nnnn \" from beginning of error message. */\n      int offset;\n      char error_number[16];\n      for (offset = 0; offset<15; offset++)\n      {\n         error_number[offset] = error_message[offset + 1];\n         if (error_message[offset] == ' ')\n            break;\n      }\n\n      if ((offset > 1) && (offset < 15))\n      {\n         error_number[offset - 1] = '\\0';\n         fprintf(stderr, \"libpng error no. %s: %s\",\n             error_number, error_message + offset + 1);\n         fprintf(stderr, PNG_STRING_NEWLINE);\n      }\n\n      else\n      {\n         fprintf(stderr, \"libpng error: %s, offset=%d\",\n             error_message, offset);\n         fprintf(stderr, PNG_STRING_NEWLINE);\n      }\n   }\n   else\n#endif\n   {\n      fprintf(stderr, \"libpng error: %s\", error_message ? error_message :\n         \"undefined\");\n      fprintf(stderr, PNG_STRING_NEWLINE);\n   }\n#else\n   PNG_UNUSED(error_message) /* Make compiler happy */\n#endif\n   png_longjmp(png_ptr, 1);\n}\n\nPNG_FUNCTION(void,PNGAPI\npng_longjmp,(png_const_structrp png_ptr, int val),PNG_NORETURN)\n{\n#ifdef PNG_SETJMP_SUPPORTED\n   if (png_ptr != NULL && png_ptr->longjmp_fn != NULL &&\n       png_ptr->jmp_buf_ptr != NULL)\n      png_ptr->longjmp_fn(*png_ptr->jmp_buf_ptr, val);\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(val)\n#endif\n\n   /* If control reaches this point, png_longjmp() must not return. The only\n    * choice is to terminate the whole process (or maybe the thread); to do\n    * this the ANSI-C abort() function is used unless a different method is\n    * implemented by overriding the default configuration setting for\n    * PNG_ABORT().\n    */\n   PNG_ABORT();\n}\n\n#ifdef PNG_WARNINGS_SUPPORTED\n/* This function is called when there is a warning, but the library thinks\n * it can continue anyway.  Replacement functions don't have to do anything\n * here if you don't want them to.  In the default configuration, png_ptr is\n * not used, but it is passed in case it may be useful.\n */\nstatic void /* PRIVATE */\npng_default_warning(png_const_structrp png_ptr, png_const_charp warning_message)\n{\n#ifdef PNG_CONSOLE_IO_SUPPORTED\n#  ifdef PNG_ERROR_NUMBERS_SUPPORTED\n   if (*warning_message == PNG_LITERAL_SHARP)\n   {\n      int offset;\n      char warning_number[16];\n      for (offset = 0; offset < 15; offset++)\n      {\n         warning_number[offset] = warning_message[offset + 1];\n         if (warning_message[offset] == ' ')\n            break;\n      }\n\n      if ((offset > 1) && (offset < 15))\n      {\n         warning_number[offset + 1] = '\\0';\n         fprintf(stderr, \"libpng warning no. %s: %s\",\n             warning_number, warning_message + offset);\n         fprintf(stderr, PNG_STRING_NEWLINE);\n      }\n\n      else\n      {\n         fprintf(stderr, \"libpng warning: %s\",\n             warning_message);\n         fprintf(stderr, PNG_STRING_NEWLINE);\n      }\n   }\n   else\n#  endif\n\n   {\n      fprintf(stderr, \"libpng warning: %s\", warning_message);\n      fprintf(stderr, PNG_STRING_NEWLINE);\n   }\n#else\n   PNG_UNUSED(warning_message) /* Make compiler happy */\n#endif\n   PNG_UNUSED(png_ptr) /* Make compiler happy */\n}\n#endif /* WARNINGS */\n\n/* This function is called when the application wants to use another method\n * of handling errors and warnings.  Note that the error function MUST NOT\n * return to the calling routine or serious problems will occur.  The return\n * method used in the default routine calls longjmp(png_ptr->jmp_buf_ptr, 1)\n */\nvoid PNGAPI\npng_set_error_fn(png_structrp png_ptr, png_voidp error_ptr,\n    png_error_ptr error_fn, png_error_ptr warning_fn)\n{\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->error_ptr = error_ptr;\n   png_ptr->error_fn = error_fn;\n#ifdef PNG_WARNINGS_SUPPORTED\n   png_ptr->warning_fn = warning_fn;\n#else\n   PNG_UNUSED(warning_fn)\n#endif\n}\n\n\n/* This function returns a pointer to the error_ptr associated with the user\n * functions.  The application should free any memory associated with this\n * pointer before png_write_destroy and png_read_destroy are called.\n */\npng_voidp PNGAPI\npng_get_error_ptr(png_const_structrp png_ptr)\n{\n   if (png_ptr == NULL)\n      return NULL;\n\n   return ((png_voidp)png_ptr->error_ptr);\n}\n\n\n#ifdef PNG_ERROR_NUMBERS_SUPPORTED\nvoid PNGAPI\npng_set_strip_error_numbers(png_structrp png_ptr, png_uint_32 strip_mode)\n{\n   if (png_ptr != NULL)\n   {\n      png_ptr->flags &=\n         ((~(PNG_FLAG_STRIP_ERROR_NUMBERS |\n         PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode);\n   }\n}\n#endif\n\n#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\\\n   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)\n   /* Currently the above both depend on SETJMP_SUPPORTED, however it would be\n    * possible to implement without setjmp support just so long as there is some\n    * way to handle the error return here:\n    */\nPNG_FUNCTION(void /* PRIVATE */, (PNGCBAPI\npng_safe_error),(png_structp png_nonconst_ptr, png_const_charp error_message),\n   PNG_NORETURN)\n{\n   const png_const_structrp png_ptr = png_nonconst_ptr;\n   png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr);\n\n   /* An error is always logged here, overwriting anything (typically a warning)\n    * that is already there:\n    */\n   if (image != NULL)\n   {\n      png_safecat(image->message, (sizeof image->message), 0, error_message);\n      image->warning_or_error |= PNG_IMAGE_ERROR;\n\n      /* Retrieve the jmp_buf from within the png_control, making this work for\n       * C++ compilation too is pretty tricky: C++ wants a pointer to the first\n       * element of a jmp_buf, but C doesn't tell us the type of that.\n       */\n      if (image->opaque != NULL && image->opaque->error_buf != NULL)\n         longjmp(png_control_jmp_buf(image->opaque), 1);\n\n      /* Missing longjmp buffer, the following is to help debugging: */\n      {\n         size_t pos = png_safecat(image->message, (sizeof image->message), 0,\n            \"bad longjmp: \");\n         png_safecat(image->message, (sizeof image->message), pos,\n             error_message);\n      }\n   }\n\n   /* Here on an internal programming error. */\n   abort();\n}\n\n#ifdef PNG_WARNINGS_SUPPORTED\nvoid /* PRIVATE */ PNGCBAPI\npng_safe_warning(png_structp png_nonconst_ptr, png_const_charp warning_message)\n{\n   const png_const_structrp png_ptr = png_nonconst_ptr;\n   png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr);\n\n   /* A warning is only logged if there is no prior warning or error. */\n   if (image->warning_or_error == 0)\n   {\n      png_safecat(image->message, (sizeof image->message), 0, warning_message);\n      image->warning_or_error |= PNG_IMAGE_WARNING;\n   }\n}\n#endif\n\nint /* PRIVATE */\npng_safe_execute(png_imagep image_in, int (*function)(png_voidp), png_voidp arg)\n{\n   volatile png_imagep image = image_in;\n   volatile int result;\n   volatile png_voidp saved_error_buf;\n   jmp_buf safe_jmpbuf;\n\n   /* Safely execute function(arg) with png_error returning to this function. */\n   saved_error_buf = image->opaque->error_buf;\n   result = setjmp(safe_jmpbuf) == 0;\n\n   if (result != 0)\n   {\n\n      image->opaque->error_buf = safe_jmpbuf;\n      result = function(arg);\n   }\n\n   image->opaque->error_buf = saved_error_buf;\n\n   /* And do the cleanup prior to any failure return. */\n   if (result == 0)\n      png_image_free(image);\n\n   return result;\n}\n#endif /* SIMPLIFIED READ || SIMPLIFIED_WRITE */\n#endif /* READ || WRITE */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngget.c",
    "content": "\n/* pngget.c - retrieval of values from info struct\n *\n * Last changed in libpng 1.6.17 [March 26, 2015]\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n */\n\n#include \"pngpriv.h\"\n\n#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)\n\npng_uint_32 PNGAPI\npng_get_valid(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_uint_32 flag)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return(info_ptr->valid & flag);\n\n   return(0);\n}\n\npng_size_t PNGAPI\npng_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return(info_ptr->rowbytes);\n\n   return(0);\n}\n\n#ifdef PNG_INFO_IMAGE_SUPPORTED\npng_bytepp PNGAPI\npng_get_rows(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return(info_ptr->row_pointers);\n\n   return(0);\n}\n#endif\n\n#ifdef PNG_EASY_ACCESS_SUPPORTED\n/* Easy access to info, added in libpng-0.99 */\npng_uint_32 PNGAPI\npng_get_image_width(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return info_ptr->width;\n\n   return (0);\n}\n\npng_uint_32 PNGAPI\npng_get_image_height(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return info_ptr->height;\n\n   return (0);\n}\n\npng_byte PNGAPI\npng_get_bit_depth(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return info_ptr->bit_depth;\n\n   return (0);\n}\n\npng_byte PNGAPI\npng_get_color_type(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return info_ptr->color_type;\n\n   return (0);\n}\n\npng_byte PNGAPI\npng_get_filter_type(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return info_ptr->filter_type;\n\n   return (0);\n}\n\npng_byte PNGAPI\npng_get_interlace_type(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return info_ptr->interlace_type;\n\n   return (0);\n}\n\npng_byte PNGAPI\npng_get_compression_type(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return info_ptr->compression_type;\n\n   return (0);\n}\n\npng_uint_32 PNGAPI\npng_get_x_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp\n   info_ptr)\n{\n#ifdef PNG_pHYs_SUPPORTED\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_pHYs) != 0)\n      {\n         png_debug1(1, \"in %s retrieval function\",\n             \"png_get_x_pixels_per_meter\");\n\n         if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)\n            return (info_ptr->x_pixels_per_unit);\n      }\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(info_ptr)\n#endif\n\n   return (0);\n}\n\npng_uint_32 PNGAPI\npng_get_y_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp\n    info_ptr)\n{\n#ifdef PNG_pHYs_SUPPORTED\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_pHYs) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\",\n          \"png_get_y_pixels_per_meter\");\n\n      if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)\n         return (info_ptr->y_pixels_per_unit);\n   }\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(info_ptr)\n#endif\n\n   return (0);\n}\n\npng_uint_32 PNGAPI\npng_get_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n#ifdef PNG_pHYs_SUPPORTED\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_pHYs) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"png_get_pixels_per_meter\");\n\n      if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER &&\n          info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit)\n         return (info_ptr->x_pixels_per_unit);\n   }\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(info_ptr)\n#endif\n\n   return (0);\n}\n\n#ifdef PNG_FLOATING_POINT_SUPPORTED\nfloat PNGAPI\npng_get_pixel_aspect_ratio(png_const_structrp png_ptr, png_const_inforp\n   info_ptr)\n{\n#ifdef PNG_READ_pHYs_SUPPORTED\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_pHYs) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"png_get_aspect_ratio\");\n\n      if (info_ptr->x_pixels_per_unit != 0)\n         return ((float)((float)info_ptr->y_pixels_per_unit\n             /(float)info_ptr->x_pixels_per_unit));\n   }\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(info_ptr)\n#endif\n\n   return ((float)0.0);\n}\n#endif\n\n#ifdef PNG_FIXED_POINT_SUPPORTED\npng_fixed_point PNGAPI\npng_get_pixel_aspect_ratio_fixed(png_const_structrp png_ptr,\n    png_const_inforp info_ptr)\n{\n#ifdef PNG_READ_pHYs_SUPPORTED\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_pHYs) != 0 &&\n       info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 &&\n       info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX &&\n       info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX)\n   {\n      png_fixed_point res;\n\n      png_debug1(1, \"in %s retrieval function\", \"png_get_aspect_ratio_fixed\");\n\n      /* The following casts work because a PNG 4 byte integer only has a valid\n       * range of 0..2^31-1; otherwise the cast might overflow.\n       */\n      if (png_muldiv(&res, (png_int_32)info_ptr->y_pixels_per_unit, PNG_FP_1,\n          (png_int_32)info_ptr->x_pixels_per_unit) != 0)\n         return res;\n   }\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(info_ptr)\n#endif\n\n   return 0;\n}\n#endif\n\npng_int_32 PNGAPI\npng_get_x_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n#ifdef PNG_oFFs_SUPPORTED\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_oFFs) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"png_get_x_offset_microns\");\n\n      if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)\n         return (info_ptr->x_offset);\n   }\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(info_ptr)\n#endif\n\n   return (0);\n}\n\npng_int_32 PNGAPI\npng_get_y_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n#ifdef PNG_oFFs_SUPPORTED\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_oFFs) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"png_get_y_offset_microns\");\n\n      if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)\n         return (info_ptr->y_offset);\n   }\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(info_ptr)\n#endif\n\n   return (0);\n}\n\npng_int_32 PNGAPI\npng_get_x_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n#ifdef PNG_oFFs_SUPPORTED\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_oFFs) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"png_get_x_offset_pixels\");\n\n      if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)\n         return (info_ptr->x_offset);\n   }\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(info_ptr)\n#endif\n\n   return (0);\n}\n\npng_int_32 PNGAPI\npng_get_y_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n#ifdef PNG_oFFs_SUPPORTED\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_oFFs) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"png_get_y_offset_pixels\");\n\n      if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)\n         return (info_ptr->y_offset);\n   }\n#else\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(info_ptr)\n#endif\n\n   return (0);\n}\n\n#ifdef PNG_INCH_CONVERSIONS_SUPPORTED\nstatic png_uint_32\nppi_from_ppm(png_uint_32 ppm)\n{\n#if 0\n   /* The conversion is *(2.54/100), in binary (32 digits):\n    * .00000110100000001001110101001001\n    */\n   png_uint_32 t1001, t1101;\n   ppm >>= 1;                  /* .1 */\n   t1001 = ppm + (ppm >> 3);   /* .1001 */\n   t1101 = t1001 + (ppm >> 1); /* .1101 */\n   ppm >>= 20;                 /* .000000000000000000001 */\n   t1101 += t1101 >> 15;       /* .1101000000000001101 */\n   t1001 >>= 11;               /* .000000000001001 */\n   t1001 += t1001 >> 12;       /* .000000000001001000000001001 */\n   ppm += t1001;               /* .000000000001001000001001001 */\n   ppm += t1101;               /* .110100000001001110101001001 */\n   return (ppm + 16) >> 5;/* .00000110100000001001110101001001 */\n#else\n   /* The argument is a PNG unsigned integer, so it is not permitted\n    * to be bigger than 2^31.\n    */\n   png_fixed_point result;\n   if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127,\n       5000) != 0)\n      return result;\n\n   /* Overflow. */\n   return 0;\n#endif\n}\n\npng_uint_32 PNGAPI\npng_get_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   return ppi_from_ppm(png_get_pixels_per_meter(png_ptr, info_ptr));\n}\n\npng_uint_32 PNGAPI\npng_get_x_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   return ppi_from_ppm(png_get_x_pixels_per_meter(png_ptr, info_ptr));\n}\n\npng_uint_32 PNGAPI\npng_get_y_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   return ppi_from_ppm(png_get_y_pixels_per_meter(png_ptr, info_ptr));\n}\n\n#ifdef PNG_FIXED_POINT_SUPPORTED\nstatic png_fixed_point\npng_fixed_inches_from_microns(png_const_structrp png_ptr, png_int_32 microns)\n{\n   /* Convert from metres * 1,000,000 to inches * 100,000, meters to\n    * inches is simply *(100/2.54), so we want *(10/2.54) == 500/127.\n    * Notice that this can overflow - a warning is output and 0 is\n    * returned.\n    */\n   return png_muldiv_warn(png_ptr, microns, 500, 127);\n}\n\npng_fixed_point PNGAPI\npng_get_x_offset_inches_fixed(png_const_structrp png_ptr,\n    png_const_inforp info_ptr)\n{\n   return png_fixed_inches_from_microns(png_ptr,\n       png_get_x_offset_microns(png_ptr, info_ptr));\n}\n#endif\n\n#ifdef PNG_FIXED_POINT_SUPPORTED\npng_fixed_point PNGAPI\npng_get_y_offset_inches_fixed(png_const_structrp png_ptr,\n    png_const_inforp info_ptr)\n{\n   return png_fixed_inches_from_microns(png_ptr,\n       png_get_y_offset_microns(png_ptr, info_ptr));\n}\n#endif\n\n#ifdef PNG_FLOATING_POINT_SUPPORTED\nfloat PNGAPI\npng_get_x_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   /* To avoid the overflow do the conversion directly in floating\n    * point.\n    */\n   return (float)(png_get_x_offset_microns(png_ptr, info_ptr) * .00003937);\n}\n#endif\n\n#ifdef PNG_FLOATING_POINT_SUPPORTED\nfloat PNGAPI\npng_get_y_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   /* To avoid the overflow do the conversion directly in floating\n    * point.\n    */\n   return (float)(png_get_y_offset_microns(png_ptr, info_ptr) * .00003937);\n}\n#endif\n\n#ifdef PNG_pHYs_SUPPORTED\npng_uint_32 PNGAPI\npng_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)\n{\n   png_uint_32 retval = 0;\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_pHYs) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"pHYs\");\n\n      if (res_x != NULL)\n      {\n         *res_x = info_ptr->x_pixels_per_unit;\n         retval |= PNG_INFO_pHYs;\n      }\n\n      if (res_y != NULL)\n      {\n         *res_y = info_ptr->y_pixels_per_unit;\n         retval |= PNG_INFO_pHYs;\n      }\n\n      if (unit_type != NULL)\n      {\n         *unit_type = (int)info_ptr->phys_unit_type;\n         retval |= PNG_INFO_pHYs;\n\n         if (*unit_type == 1)\n         {\n            if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);\n            if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50);\n         }\n      }\n   }\n\n   return (retval);\n}\n#endif /* pHYs */\n#endif /* INCH_CONVERSIONS */\n\n/* png_get_channels really belongs in here, too, but it's been around longer */\n\n#endif /* EASY_ACCESS */\n\n\npng_byte PNGAPI\npng_get_channels(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return(info_ptr->channels);\n\n   return (0);\n}\n\n#ifdef PNG_READ_SUPPORTED\npng_const_bytep PNGAPI\npng_get_signature(png_const_structrp png_ptr, png_const_inforp info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return(info_ptr->signature);\n\n   return (NULL);\n}\n#endif\n\n#ifdef PNG_bKGD_SUPPORTED\npng_uint_32 PNGAPI\npng_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,\n   png_color_16p *background)\n{\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_bKGD) != 0 &&\n       background != NULL)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"bKGD\");\n\n      *background = &(info_ptr->background);\n      return (PNG_INFO_bKGD);\n   }\n\n   return (0);\n}\n#endif\n\n#ifdef PNG_cHRM_SUPPORTED\n/* The XYZ APIs were added in 1.5.5 to take advantage of the code added at the\n * same time to correct the rgb grayscale coefficient defaults obtained from the\n * cHRM chunk in 1.5.4\n */\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\npng_uint_32 PNGAPI\npng_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    double *white_x, double *white_y, double *red_x, double *red_y,\n    double *green_x, double *green_y, double *blue_x, double *blue_y)\n{\n   /* Quiet API change: this code used to only return the end points if a cHRM\n    * chunk was present, but the end points can also come from iCCP or sRGB\n    * chunks, so in 1.6.0 the png_get_ APIs return the end points regardless and\n    * the png_set_ APIs merely check that set end points are mutually\n    * consistent.\n    */\n   if (png_ptr != NULL && info_ptr != NULL &&\n      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"cHRM\");\n\n      if (white_x != NULL)\n         *white_x = png_float(png_ptr,\n            info_ptr->colorspace.end_points_xy.whitex, \"cHRM white X\");\n      if (white_y != NULL)\n         *white_y = png_float(png_ptr,\n            info_ptr->colorspace.end_points_xy.whitey, \"cHRM white Y\");\n      if (red_x != NULL)\n         *red_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redx,\n            \"cHRM red X\");\n      if (red_y != NULL)\n         *red_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redy,\n            \"cHRM red Y\");\n      if (green_x != NULL)\n         *green_x = png_float(png_ptr,\n            info_ptr->colorspace.end_points_xy.greenx, \"cHRM green X\");\n      if (green_y != NULL)\n         *green_y = png_float(png_ptr,\n            info_ptr->colorspace.end_points_xy.greeny, \"cHRM green Y\");\n      if (blue_x != NULL)\n         *blue_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluex,\n            \"cHRM blue X\");\n      if (blue_y != NULL)\n         *blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey,\n            \"cHRM blue Y\");\n      return (PNG_INFO_cHRM);\n   }\n\n   return (0);\n}\n\npng_uint_32 PNGAPI\npng_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr,\n   double *red_X, double *red_Y, double *red_Z, double *green_X,\n   double *green_Y, double *green_Z, double *blue_X, double *blue_Y,\n   double *blue_Z)\n{\n   if (png_ptr != NULL && info_ptr != NULL &&\n      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"cHRM_XYZ(float)\");\n\n      if (red_X != NULL)\n         *red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X,\n            \"cHRM red X\");\n      if (red_Y != NULL)\n         *red_Y = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Y,\n            \"cHRM red Y\");\n      if (red_Z != NULL)\n         *red_Z = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Z,\n            \"cHRM red Z\");\n      if (green_X != NULL)\n         *green_X = png_float(png_ptr,\n            info_ptr->colorspace.end_points_XYZ.green_X, \"cHRM green X\");\n      if (green_Y != NULL)\n         *green_Y = png_float(png_ptr,\n            info_ptr->colorspace.end_points_XYZ.green_Y, \"cHRM green Y\");\n      if (green_Z != NULL)\n         *green_Z = png_float(png_ptr,\n            info_ptr->colorspace.end_points_XYZ.green_Z, \"cHRM green Z\");\n      if (blue_X != NULL)\n         *blue_X = png_float(png_ptr,\n            info_ptr->colorspace.end_points_XYZ.blue_X, \"cHRM blue X\");\n      if (blue_Y != NULL)\n         *blue_Y = png_float(png_ptr,\n            info_ptr->colorspace.end_points_XYZ.blue_Y, \"cHRM blue Y\");\n      if (blue_Z != NULL)\n         *blue_Z = png_float(png_ptr,\n            info_ptr->colorspace.end_points_XYZ.blue_Z, \"cHRM blue Z\");\n      return (PNG_INFO_cHRM);\n   }\n\n   return (0);\n}\n#  endif\n\n#  ifdef PNG_FIXED_POINT_SUPPORTED\npng_uint_32 PNGAPI\npng_get_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_fixed_point *int_red_X, png_fixed_point *int_red_Y,\n    png_fixed_point *int_red_Z, png_fixed_point *int_green_X,\n    png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,\n    png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,\n    png_fixed_point *int_blue_Z)\n{\n   if (png_ptr != NULL && info_ptr != NULL &&\n      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"cHRM_XYZ\");\n\n      if (int_red_X != NULL)\n         *int_red_X = info_ptr->colorspace.end_points_XYZ.red_X;\n      if (int_red_Y != NULL)\n         *int_red_Y = info_ptr->colorspace.end_points_XYZ.red_Y;\n      if (int_red_Z != NULL)\n         *int_red_Z = info_ptr->colorspace.end_points_XYZ.red_Z;\n      if (int_green_X != NULL)\n         *int_green_X = info_ptr->colorspace.end_points_XYZ.green_X;\n      if (int_green_Y != NULL)\n         *int_green_Y = info_ptr->colorspace.end_points_XYZ.green_Y;\n      if (int_green_Z != NULL)\n         *int_green_Z = info_ptr->colorspace.end_points_XYZ.green_Z;\n      if (int_blue_X != NULL)\n         *int_blue_X = info_ptr->colorspace.end_points_XYZ.blue_X;\n      if (int_blue_Y != NULL)\n         *int_blue_Y = info_ptr->colorspace.end_points_XYZ.blue_Y;\n      if (int_blue_Z != NULL)\n         *int_blue_Z = info_ptr->colorspace.end_points_XYZ.blue_Z;\n      return (PNG_INFO_cHRM);\n   }\n\n   return (0);\n}\n\npng_uint_32 PNGAPI\npng_get_cHRM_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,\n    png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,\n    png_fixed_point *blue_x, png_fixed_point *blue_y)\n{\n   png_debug1(1, \"in %s retrieval function\", \"cHRM\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)\n   {\n      if (white_x != NULL)\n         *white_x = info_ptr->colorspace.end_points_xy.whitex;\n      if (white_y != NULL)\n         *white_y = info_ptr->colorspace.end_points_xy.whitey;\n      if (red_x != NULL)\n         *red_x = info_ptr->colorspace.end_points_xy.redx;\n      if (red_y != NULL)\n         *red_y = info_ptr->colorspace.end_points_xy.redy;\n      if (green_x != NULL)\n         *green_x = info_ptr->colorspace.end_points_xy.greenx;\n      if (green_y != NULL)\n         *green_y = info_ptr->colorspace.end_points_xy.greeny;\n      if (blue_x != NULL)\n         *blue_x = info_ptr->colorspace.end_points_xy.bluex;\n      if (blue_y != NULL)\n         *blue_y = info_ptr->colorspace.end_points_xy.bluey;\n      return (PNG_INFO_cHRM);\n   }\n\n   return (0);\n}\n#  endif\n#endif\n\n#ifdef PNG_gAMA_SUPPORTED\n#  ifdef PNG_FIXED_POINT_SUPPORTED\npng_uint_32 PNGAPI\npng_get_gAMA_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_fixed_point *file_gamma)\n{\n   png_debug1(1, \"in %s retrieval function\", \"gAMA\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&\n      file_gamma != NULL)\n   {\n      *file_gamma = info_ptr->colorspace.gamma;\n      return (PNG_INFO_gAMA);\n   }\n\n   return (0);\n}\n#  endif\n\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\npng_uint_32 PNGAPI\npng_get_gAMA(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    double *file_gamma)\n{\n   png_debug1(1, \"in %s retrieval function\", \"gAMA(float)\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&\n      file_gamma != NULL)\n   {\n      *file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma,\n         \"png_get_gAMA\");\n      return (PNG_INFO_gAMA);\n   }\n\n   return (0);\n}\n#  endif\n#endif\n\n#ifdef PNG_sRGB_SUPPORTED\npng_uint_32 PNGAPI\npng_get_sRGB(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    int *file_srgb_intent)\n{\n   png_debug1(1, \"in %s retrieval function\", \"sRGB\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n      (info_ptr->valid & PNG_INFO_sRGB) != 0 && file_srgb_intent != NULL)\n   {\n      *file_srgb_intent = info_ptr->colorspace.rendering_intent;\n      return (PNG_INFO_sRGB);\n   }\n\n   return (0);\n}\n#endif\n\n#ifdef PNG_iCCP_SUPPORTED\npng_uint_32 PNGAPI\npng_get_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_charpp name, int *compression_type,\n    png_bytepp profile, png_uint_32 *proflen)\n{\n   png_debug1(1, \"in %s retrieval function\", \"iCCP\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_iCCP) != 0 &&\n       name != NULL && compression_type != NULL && profile != NULL &&\n           proflen != NULL)\n   {\n      *name = info_ptr->iccp_name;\n      *profile = info_ptr->iccp_profile;\n      *proflen = png_get_uint_32(info_ptr->iccp_profile);\n      /* This is somewhat irrelevant since the profile data returned has\n       * actually been uncompressed.\n       */\n      *compression_type = PNG_COMPRESSION_TYPE_BASE;\n      return (PNG_INFO_iCCP);\n   }\n\n   return (0);\n}\n#endif\n\n#ifdef PNG_sPLT_SUPPORTED\nint PNGAPI\npng_get_sPLT(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_sPLT_tpp spalettes)\n{\n   if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)\n   {\n      *spalettes = info_ptr->splt_palettes;\n      return info_ptr->splt_palettes_num;\n   }\n\n   return (0);\n}\n#endif\n\n#ifdef PNG_hIST_SUPPORTED\npng_uint_32 PNGAPI\npng_get_hIST(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_uint_16p *hist)\n{\n   png_debug1(1, \"in %s retrieval function\", \"hIST\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_hIST) != 0 && hist != NULL)\n   {\n      *hist = info_ptr->hist;\n      return (PNG_INFO_hIST);\n   }\n\n   return (0);\n}\n#endif\n\npng_uint_32 PNGAPI\npng_get_IHDR(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_uint_32 *width, png_uint_32 *height, int *bit_depth,\n    int *color_type, int *interlace_type, int *compression_type,\n    int *filter_type)\n{\n   png_debug1(1, \"in %s retrieval function\", \"IHDR\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return (0);\n\n   if (width != NULL)\n       *width = info_ptr->width;\n\n   if (height != NULL)\n       *height = info_ptr->height;\n\n   if (bit_depth != NULL)\n       *bit_depth = info_ptr->bit_depth;\n\n   if (color_type != NULL)\n       *color_type = info_ptr->color_type;\n\n   if (compression_type != NULL)\n      *compression_type = info_ptr->compression_type;\n\n   if (filter_type != NULL)\n      *filter_type = info_ptr->filter_type;\n\n   if (interlace_type != NULL)\n      *interlace_type = info_ptr->interlace_type;\n\n   /* This is redundant if we can be sure that the info_ptr values were all\n    * assigned in png_set_IHDR().  We do the check anyhow in case an\n    * application has ignored our advice not to mess with the members\n    * of info_ptr directly.\n    */\n   png_check_IHDR(png_ptr, info_ptr->width, info_ptr->height,\n       info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,\n       info_ptr->compression_type, info_ptr->filter_type);\n\n   return (1);\n}\n\n#ifdef PNG_oFFs_SUPPORTED\npng_uint_32 PNGAPI\npng_get_oFFs(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)\n{\n   png_debug1(1, \"in %s retrieval function\", \"oFFs\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_oFFs) != 0 &&\n       offset_x != NULL && offset_y != NULL && unit_type != NULL)\n   {\n      *offset_x = info_ptr->x_offset;\n      *offset_y = info_ptr->y_offset;\n      *unit_type = (int)info_ptr->offset_unit_type;\n      return (PNG_INFO_oFFs);\n   }\n\n   return (0);\n}\n#endif\n\n#ifdef PNG_pCAL_SUPPORTED\npng_uint_32 PNGAPI\npng_get_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,\n    png_charp *units, png_charpp *params)\n{\n   png_debug1(1, \"in %s retrieval function\", \"pCAL\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_pCAL) != 0 &&\n       purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&\n       nparams != NULL && units != NULL && params != NULL)\n   {\n      *purpose = info_ptr->pcal_purpose;\n      *X0 = info_ptr->pcal_X0;\n      *X1 = info_ptr->pcal_X1;\n      *type = (int)info_ptr->pcal_type;\n      *nparams = (int)info_ptr->pcal_nparams;\n      *units = info_ptr->pcal_units;\n      *params = info_ptr->pcal_params;\n      return (PNG_INFO_pCAL);\n   }\n\n   return (0);\n}\n#endif\n\n#ifdef PNG_sCAL_SUPPORTED\n#  ifdef PNG_FIXED_POINT_SUPPORTED\n#    if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \\\n         defined(PNG_FLOATING_POINT_SUPPORTED)\npng_uint_32 PNGAPI\npng_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    int *unit, png_fixed_point *width, png_fixed_point *height)\n{\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_sCAL) != 0)\n   {\n      *unit = info_ptr->scal_unit;\n      /*TODO: make this work without FP support; the API is currently eliminated\n       * if neither floating point APIs nor internal floating point arithmetic\n       * are enabled.\n       */\n      *width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), \"sCAL width\");\n      *height = png_fixed(png_ptr, atof(info_ptr->scal_s_height),\n         \"sCAL height\");\n      return (PNG_INFO_sCAL);\n   }\n\n   return(0);\n}\n#    endif /* FLOATING_ARITHMETIC */\n#  endif /* FIXED_POINT */\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\npng_uint_32 PNGAPI\npng_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    int *unit, double *width, double *height)\n{\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_sCAL) != 0)\n   {\n      *unit = info_ptr->scal_unit;\n      *width = atof(info_ptr->scal_s_width);\n      *height = atof(info_ptr->scal_s_height);\n      return (PNG_INFO_sCAL);\n   }\n\n   return(0);\n}\n#  endif /* FLOATING POINT */\npng_uint_32 PNGAPI\npng_get_sCAL_s(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    int *unit, png_charpp width, png_charpp height)\n{\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_sCAL) != 0)\n   {\n      *unit = info_ptr->scal_unit;\n      *width = info_ptr->scal_s_width;\n      *height = info_ptr->scal_s_height;\n      return (PNG_INFO_sCAL);\n   }\n\n   return(0);\n}\n#endif /* sCAL */\n\n#ifdef PNG_pHYs_SUPPORTED\npng_uint_32 PNGAPI\npng_get_pHYs(png_const_structrp png_ptr, png_const_inforp info_ptr,\n    png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)\n{\n   png_uint_32 retval = 0;\n\n   png_debug1(1, \"in %s retrieval function\", \"pHYs\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_pHYs) != 0)\n   {\n      if (res_x != NULL)\n      {\n         *res_x = info_ptr->x_pixels_per_unit;\n         retval |= PNG_INFO_pHYs;\n      }\n\n      if (res_y != NULL)\n      {\n         *res_y = info_ptr->y_pixels_per_unit;\n         retval |= PNG_INFO_pHYs;\n      }\n\n      if (unit_type != NULL)\n      {\n         *unit_type = (int)info_ptr->phys_unit_type;\n         retval |= PNG_INFO_pHYs;\n      }\n   }\n\n   return (retval);\n}\n#endif /* pHYs */\n\npng_uint_32 PNGAPI\npng_get_PLTE(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_colorp *palette, int *num_palette)\n{\n   png_debug1(1, \"in %s retrieval function\", \"PLTE\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_PLTE) != 0 && palette != NULL)\n   {\n      *palette = info_ptr->palette;\n      *num_palette = info_ptr->num_palette;\n      png_debug1(3, \"num_palette = %d\", *num_palette);\n      return (PNG_INFO_PLTE);\n   }\n\n   return (0);\n}\n\n#ifdef PNG_sBIT_SUPPORTED\npng_uint_32 PNGAPI\npng_get_sBIT(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_color_8p *sig_bit)\n{\n   png_debug1(1, \"in %s retrieval function\", \"sBIT\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_sBIT) != 0 && sig_bit != NULL)\n   {\n      *sig_bit = &(info_ptr->sig_bit);\n      return (PNG_INFO_sBIT);\n   }\n\n   return (0);\n}\n#endif\n\n#ifdef PNG_TEXT_SUPPORTED\nint PNGAPI\npng_get_text(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_textp *text_ptr, int *num_text)\n{\n   if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)\n   {\n      png_debug1(1, \"in 0x%lx retrieval function\",\n         (unsigned long)png_ptr->chunk_name);\n\n      if (text_ptr != NULL)\n         *text_ptr = info_ptr->text;\n\n      if (num_text != NULL)\n         *num_text = info_ptr->num_text;\n\n      return info_ptr->num_text;\n   }\n\n   if (num_text != NULL)\n      *num_text = 0;\n\n   return(0);\n}\n#endif\n\n#ifdef PNG_tIME_SUPPORTED\npng_uint_32 PNGAPI\npng_get_tIME(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_timep *mod_time)\n{\n   png_debug1(1, \"in %s retrieval function\", \"tIME\");\n\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_tIME) != 0 && mod_time != NULL)\n   {\n      *mod_time = &(info_ptr->mod_time);\n      return (PNG_INFO_tIME);\n   }\n\n   return (0);\n}\n#endif\n\n#ifdef PNG_tRNS_SUPPORTED\npng_uint_32 PNGAPI\npng_get_tRNS(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)\n{\n   png_uint_32 retval = 0;\n   if (png_ptr != NULL && info_ptr != NULL &&\n       (info_ptr->valid & PNG_INFO_tRNS) != 0)\n   {\n      png_debug1(1, \"in %s retrieval function\", \"tRNS\");\n\n      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      {\n         if (trans_alpha != NULL)\n         {\n            *trans_alpha = info_ptr->trans_alpha;\n            retval |= PNG_INFO_tRNS;\n         }\n\n         if (trans_color != NULL)\n            *trans_color = &(info_ptr->trans_color);\n      }\n\n      else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */\n      {\n         if (trans_color != NULL)\n         {\n            *trans_color = &(info_ptr->trans_color);\n            retval |= PNG_INFO_tRNS;\n         }\n\n         if (trans_alpha != NULL)\n            *trans_alpha = NULL;\n      }\n\n      if (num_trans != NULL)\n      {\n         *num_trans = info_ptr->num_trans;\n         retval |= PNG_INFO_tRNS;\n      }\n   }\n\n   return (retval);\n}\n#endif\n\n#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\nint PNGAPI\npng_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_unknown_chunkpp unknowns)\n{\n   if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)\n   {\n      *unknowns = info_ptr->unknown_chunks;\n      return info_ptr->unknown_chunks_num;\n   }\n\n   return (0);\n}\n#endif\n\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\npng_byte PNGAPI\npng_get_rgb_to_gray_status (png_const_structrp png_ptr)\n{\n   return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0);\n}\n#endif\n\n#ifdef PNG_USER_CHUNKS_SUPPORTED\npng_voidp PNGAPI\npng_get_user_chunk_ptr(png_const_structrp png_ptr)\n{\n   return (png_ptr ? png_ptr->user_chunk_ptr : NULL);\n}\n#endif\n\npng_size_t PNGAPI\npng_get_compression_buffer_size(png_const_structrp png_ptr)\n{\n   if (png_ptr == NULL)\n      return 0;\n\n#ifdef PNG_WRITE_SUPPORTED\n   if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)\n#endif\n   {\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n      return png_ptr->IDAT_read_size;\n#else\n      return PNG_IDAT_READ_SIZE;\n#endif\n   }\n\n#ifdef PNG_WRITE_SUPPORTED\n   else\n      return png_ptr->zbuffer_size;\n#endif\n}\n\n#ifdef PNG_SET_USER_LIMITS_SUPPORTED\n/* These functions were added to libpng 1.2.6 and were enabled\n * by default in libpng-1.4.0 */\npng_uint_32 PNGAPI\npng_get_user_width_max (png_const_structrp png_ptr)\n{\n   return (png_ptr ? png_ptr->user_width_max : 0);\n}\n\npng_uint_32 PNGAPI\npng_get_user_height_max (png_const_structrp png_ptr)\n{\n   return (png_ptr ? png_ptr->user_height_max : 0);\n}\n\n/* This function was added to libpng 1.4.0 */\npng_uint_32 PNGAPI\npng_get_chunk_cache_max (png_const_structrp png_ptr)\n{\n   return (png_ptr ? png_ptr->user_chunk_cache_max : 0);\n}\n\n/* This function was added to libpng 1.4.1 */\npng_alloc_size_t PNGAPI\npng_get_chunk_malloc_max (png_const_structrp png_ptr)\n{\n   return (png_ptr ? png_ptr->user_chunk_malloc_max : 0);\n}\n#endif /* SET_USER_LIMITS */\n\n/* These functions were added to libpng 1.4.0 */\n#ifdef PNG_IO_STATE_SUPPORTED\npng_uint_32 PNGAPI\npng_get_io_state (png_const_structrp png_ptr)\n{\n   return png_ptr->io_state;\n}\n\npng_uint_32 PNGAPI\npng_get_io_chunk_type (png_const_structrp png_ptr)\n{\n   return png_ptr->chunk_name;\n}\n#endif /* IO_STATE */\n\n#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED\n#  ifdef PNG_GET_PALETTE_MAX_SUPPORTED\nint PNGAPI\npng_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      return png_ptr->num_palette_max;\n\n   return (-1);\n}\n#  endif\n#endif\n\n#endif /* READ || WRITE */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngmem.c",
    "content": "\n/* pngmem.c - stub functions for memory allocation\n *\n * Last changed in libpng 1.6.15 [November 20, 2014]\n * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * This file provides a location for all memory allocation.  Users who\n * need special memory handling are expected to supply replacement\n * functions for png_malloc() and png_free(), and to use\n * png_create_read_struct_2() and png_create_write_struct_2() to\n * identify the replacement functions.\n */\n\n#include \"pngpriv.h\"\n\n#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)\n/* Free a png_struct */\nvoid /* PRIVATE */\npng_destroy_png_struct(png_structrp png_ptr)\n{\n   if (png_ptr != NULL)\n   {\n      /* png_free might call png_error and may certainly call\n       * png_get_mem_ptr, so fake a temporary png_struct to support this.\n       */\n      png_struct dummy_struct = *png_ptr;\n      memset(png_ptr, 0, (sizeof *png_ptr));\n      png_free(&dummy_struct, png_ptr);\n\n#     ifdef PNG_SETJMP_SUPPORTED\n         /* We may have a jmp_buf left to deallocate. */\n         png_free_jmpbuf(&dummy_struct);\n#     endif\n   }\n}\n\n/* Allocate memory.  For reasonable files, size should never exceed\n * 64K.  However, zlib may allocate more than 64K if you don't tell\n * it not to.  See zconf.h and png.h for more information.  zlib does\n * need to allocate exactly 64K, so whatever you call here must\n * have the ability to do that.\n */\nPNG_FUNCTION(png_voidp,PNGAPI\npng_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)\n{\n   png_voidp ret;\n\n   ret = png_malloc(png_ptr, size);\n\n   if (ret != NULL)\n      memset(ret, 0, size);\n\n   return ret;\n}\n\n/* png_malloc_base, an internal function added at libpng 1.6.0, does the work of\n * allocating memory, taking into account limits and PNG_USER_MEM_SUPPORTED.\n * Checking and error handling must happen outside this routine; it returns NULL\n * if the allocation cannot be done (for any reason.)\n */\nPNG_FUNCTION(png_voidp /* PRIVATE */,\npng_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),\n   PNG_ALLOCATED)\n{\n   /* Moved to png_malloc_base from png_malloc_default in 1.6.0; the DOS\n    * allocators have also been removed in 1.6.0, so any 16-bit system now has\n    * to implement a user memory handler.  This checks to be sure it isn't\n    * called with big numbers.\n    */\n#ifndef PNG_USER_MEM_SUPPORTED\n   PNG_UNUSED(png_ptr)\n#endif\n\n   /* Some compilers complain that this is always true.  However, it\n    * can be false when integer overflow happens.\n    */\n   if (size > 0 && size <= PNG_SIZE_MAX\n#     ifdef PNG_MAX_MALLOC_64K\n         && size <= 65536U\n#     endif\n      )\n   {\n#ifdef PNG_USER_MEM_SUPPORTED\n      if (png_ptr != NULL && png_ptr->malloc_fn != NULL)\n         return png_ptr->malloc_fn(png_constcast(png_structrp,png_ptr), size);\n\n      else\n#endif\n         return malloc((size_t)size); /* checked for truncation above */\n   }\n\n   else\n      return NULL;\n}\n\n#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\\\n   defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)\n/* This is really here only to work round a spurious warning in GCC 4.6 and 4.7\n * that arises because of the checks in png_realloc_array that are repeated in\n * png_malloc_array.\n */\nstatic png_voidp\npng_malloc_array_checked(png_const_structrp png_ptr, int nelements,\n   size_t element_size)\n{\n   png_alloc_size_t req = nelements; /* known to be > 0 */\n\n   if (req <= PNG_SIZE_MAX/element_size)\n      return png_malloc_base(png_ptr, req * element_size);\n\n   /* The failure case when the request is too large */\n   return NULL;\n}\n\nPNG_FUNCTION(png_voidp /* PRIVATE */,\npng_malloc_array,(png_const_structrp png_ptr, int nelements,\n   size_t element_size),PNG_ALLOCATED)\n{\n   if (nelements <= 0 || element_size == 0)\n      png_error(png_ptr, \"internal error: array alloc\");\n\n   return png_malloc_array_checked(png_ptr, nelements, element_size);\n}\n\nPNG_FUNCTION(png_voidp /* PRIVATE */,\npng_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,\n   int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED)\n{\n   /* These are internal errors: */\n   if (add_elements <= 0 || element_size == 0 || old_elements < 0 ||\n      (old_array == NULL && old_elements > 0))\n      png_error(png_ptr, \"internal error: array realloc\");\n\n   /* Check for overflow on the elements count (so the caller does not have to\n    * check.)\n    */\n   if (add_elements <= INT_MAX - old_elements)\n   {\n      png_voidp new_array = png_malloc_array_checked(png_ptr,\n         old_elements+add_elements, element_size);\n\n      if (new_array != NULL)\n      {\n         /* Because png_malloc_array worked the size calculations below cannot\n          * overflow.\n          */\n         if (old_elements > 0)\n            memcpy(new_array, old_array, element_size*(unsigned)old_elements);\n\n         memset((char*)new_array + element_size*(unsigned)old_elements, 0,\n            element_size*(unsigned)add_elements);\n\n         return new_array;\n      }\n   }\n\n   return NULL; /* error */\n}\n#endif /* TEXT || sPLT || STORE_UNKNOWN_CHUNKS */\n\n/* Various functions that have different error handling are derived from this.\n * png_malloc always exists, but if PNG_USER_MEM_SUPPORTED is defined a separate\n * function png_malloc_default is also provided.\n */\nPNG_FUNCTION(png_voidp,PNGAPI\npng_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)\n{\n   png_voidp ret;\n\n   if (png_ptr == NULL)\n      return NULL;\n\n   ret = png_malloc_base(png_ptr, size);\n\n   if (ret == NULL)\n       png_error(png_ptr, \"Out of memory\"); /* 'm' means png_malloc */\n\n   return ret;\n}\n\n#ifdef PNG_USER_MEM_SUPPORTED\nPNG_FUNCTION(png_voidp,PNGAPI\npng_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),\n   PNG_ALLOCATED PNG_DEPRECATED)\n{\n   png_voidp ret;\n\n   if (png_ptr == NULL)\n      return NULL;\n\n   /* Passing 'NULL' here bypasses the application provided memory handler. */\n   ret = png_malloc_base(NULL/*use malloc*/, size);\n\n   if (ret == NULL)\n      png_error(png_ptr, \"Out of Memory\"); /* 'M' means png_malloc_default */\n\n   return ret;\n}\n#endif /* USER_MEM */\n\n/* This function was added at libpng version 1.2.3.  The png_malloc_warn()\n * function will issue a png_warning and return NULL instead of issuing a\n * png_error, if it fails to allocate the requested memory.\n */\nPNG_FUNCTION(png_voidp,PNGAPI\npng_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size),\n   PNG_ALLOCATED)\n{\n   if (png_ptr != NULL)\n   {\n      png_voidp ret = png_malloc_base(png_ptr, size);\n\n      if (ret != NULL)\n         return ret;\n\n      png_warning(png_ptr, \"Out of memory\");\n   }\n\n   return NULL;\n}\n\n/* Free a pointer allocated by png_malloc().  If ptr is NULL, return\n * without taking any action.\n */\nvoid PNGAPI\npng_free(png_const_structrp png_ptr, png_voidp ptr)\n{\n   if (png_ptr == NULL || ptr == NULL)\n      return;\n\n#ifdef PNG_USER_MEM_SUPPORTED\n   if (png_ptr->free_fn != NULL)\n      png_ptr->free_fn(png_constcast(png_structrp,png_ptr), ptr);\n\n   else\n      png_free_default(png_ptr, ptr);\n}\n\nPNG_FUNCTION(void,PNGAPI\npng_free_default,(png_const_structrp png_ptr, png_voidp ptr),PNG_DEPRECATED)\n{\n   if (png_ptr == NULL || ptr == NULL)\n      return;\n#endif /* USER_MEM */\n\n   free(ptr);\n}\n\n#ifdef PNG_USER_MEM_SUPPORTED\n/* This function is called when the application wants to use another method\n * of allocating and freeing memory.\n */\nvoid PNGAPI\npng_set_mem_fn(png_structrp png_ptr, png_voidp mem_ptr, png_malloc_ptr\n  malloc_fn, png_free_ptr free_fn)\n{\n   if (png_ptr != NULL)\n   {\n      png_ptr->mem_ptr = mem_ptr;\n      png_ptr->malloc_fn = malloc_fn;\n      png_ptr->free_fn = free_fn;\n   }\n}\n\n/* This function returns a pointer to the mem_ptr associated with the user\n * functions.  The application should free any memory associated with this\n * pointer before png_write_destroy and png_read_destroy are called.\n */\npng_voidp PNGAPI\npng_get_mem_ptr(png_const_structrp png_ptr)\n{\n   if (png_ptr == NULL)\n      return NULL;\n\n   return png_ptr->mem_ptr;\n}\n#endif /* USER_MEM */\n#endif /* READ || WRITE */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngpread.c",
    "content": "\n/* pngpread.c - read a png file in push mode\n *\n * Last changed in libpng 1.6.23 [June 9, 2016]\n * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n#include \"pngpriv.h\"\n\n#ifdef PNG_PROGRESSIVE_READ_SUPPORTED\n\n/* Push model modes */\n#define PNG_READ_SIG_MODE   0\n#define PNG_READ_CHUNK_MODE 1\n#define PNG_READ_IDAT_MODE  2\n#define PNG_READ_tEXt_MODE  4\n#define PNG_READ_zTXt_MODE  5\n#define PNG_READ_DONE_MODE  6\n#define PNG_READ_iTXt_MODE  7\n#define PNG_ERROR_MODE      8\n\n#define PNG_PUSH_SAVE_BUFFER_IF_FULL \\\nif (png_ptr->push_length + 4 > png_ptr->buffer_size) \\\n   { png_push_save_buffer(png_ptr); return; }\n#define PNG_PUSH_SAVE_BUFFER_IF_LT(N) \\\nif (png_ptr->buffer_size < N) \\\n   { png_push_save_buffer(png_ptr); return; }\n\nvoid PNGAPI\npng_process_data(png_structrp png_ptr, png_inforp info_ptr,\n    png_bytep buffer, png_size_t buffer_size)\n{\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   png_push_restore_buffer(png_ptr, buffer, buffer_size);\n\n   while (png_ptr->buffer_size)\n   {\n      png_process_some_data(png_ptr, info_ptr);\n   }\n}\n\npng_size_t PNGAPI\npng_process_data_pause(png_structrp png_ptr, int save)\n{\n   if (png_ptr != NULL)\n   {\n      /* It's easiest for the caller if we do the save; then the caller doesn't\n       * have to supply the same data again:\n       */\n      if (save != 0)\n         png_push_save_buffer(png_ptr);\n      else\n      {\n         /* This includes any pending saved bytes: */\n         png_size_t remaining = png_ptr->buffer_size;\n         png_ptr->buffer_size = 0;\n\n         /* So subtract the saved buffer size, unless all the data\n          * is actually 'saved', in which case we just return 0\n          */\n         if (png_ptr->save_buffer_size < remaining)\n            return remaining - png_ptr->save_buffer_size;\n      }\n   }\n\n   return 0;\n}\n\npng_uint_32 PNGAPI\npng_process_data_skip(png_structrp png_ptr)\n{\n  /* TODO: Deprecate and remove this API.\n   * Somewhere the implementation of this seems to have been lost,\n   * or abandoned.  It was only to support some internal back-door access\n   * to png_struct) in libpng-1.4.x.\n   */\n   png_app_warning(png_ptr,\n\"png_process_data_skip is not implemented in any current version of libpng\");\n   return 0;\n}\n\n/* What we do with the incoming data depends on what we were previously\n * doing before we ran out of data...\n */\nvoid /* PRIVATE */\npng_process_some_data(png_structrp png_ptr, png_inforp info_ptr)\n{\n   if (png_ptr == NULL)\n      return;\n\n   switch (png_ptr->process_mode)\n   {\n      case PNG_READ_SIG_MODE:\n      {\n         png_push_read_sig(png_ptr, info_ptr);\n         break;\n      }\n\n      case PNG_READ_CHUNK_MODE:\n      {\n         png_push_read_chunk(png_ptr, info_ptr);\n         break;\n      }\n\n      case PNG_READ_IDAT_MODE:\n      {\n         png_push_read_IDAT(png_ptr);\n         break;\n      }\n\n      default:\n      {\n         png_ptr->buffer_size = 0;\n         break;\n      }\n   }\n}\n\n/* Read any remaining signature bytes from the stream and compare them with\n * the correct PNG signature.  It is possible that this routine is called\n * with bytes already read from the signature, either because they have been\n * checked by the calling application, or because of multiple calls to this\n * routine.\n */\nvoid /* PRIVATE */\npng_push_read_sig(png_structrp png_ptr, png_inforp info_ptr)\n{\n   png_size_t num_checked = png_ptr->sig_bytes, /* SAFE, does not exceed 8 */\n       num_to_check = 8 - num_checked;\n\n   if (png_ptr->buffer_size < num_to_check)\n   {\n      num_to_check = png_ptr->buffer_size;\n   }\n\n   png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),\n       num_to_check);\n   png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check);\n\n   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))\n   {\n      if (num_checked < 4 &&\n          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))\n         png_error(png_ptr, \"Not a PNG file\");\n\n      else\n         png_error(png_ptr, \"PNG file corrupted by ASCII conversion\");\n   }\n   else\n   {\n      if (png_ptr->sig_bytes >= 8)\n      {\n         png_ptr->process_mode = PNG_READ_CHUNK_MODE;\n      }\n   }\n}\n\nvoid /* PRIVATE */\npng_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)\n{\n   png_uint_32 chunk_name;\n#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n   int keep; /* unknown handling method */\n#endif\n\n   /* First we make sure we have enough data for the 4-byte chunk name\n    * and the 4-byte chunk length before proceeding with decoding the\n    * chunk data.  To fully decode each of these chunks, we also make\n    * sure we have enough data in the buffer for the 4-byte CRC at the\n    * end of every chunk (except IDAT, which is handled separately).\n    */\n   if ((png_ptr->mode & PNG_HAVE_CHUNK_HEADER) == 0)\n   {\n      png_byte chunk_length[4];\n      png_byte chunk_tag[4];\n\n      PNG_PUSH_SAVE_BUFFER_IF_LT(8)\n      png_push_fill_buffer(png_ptr, chunk_length, 4);\n      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);\n      png_reset_crc(png_ptr);\n      png_crc_read(png_ptr, chunk_tag, 4);\n      png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);\n      png_check_chunk_name(png_ptr, png_ptr->chunk_name);\n      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;\n   }\n\n   chunk_name = png_ptr->chunk_name;\n\n   if (chunk_name == png_IDAT)\n   {\n      if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)\n         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;\n\n      /* If we reach an IDAT chunk, this means we have read all of the\n       * header chunks, and we can start reading the image (or if this\n       * is called after the image has been read - we have an error).\n       */\n      if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n         png_error(png_ptr, \"Missing IHDR before IDAT\");\n\n      else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&\n          (png_ptr->mode & PNG_HAVE_PLTE) == 0)\n         png_error(png_ptr, \"Missing PLTE before IDAT\");\n\n      png_ptr->process_mode = PNG_READ_IDAT_MODE;\n\n      if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n         if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)\n            if (png_ptr->push_length == 0)\n               return;\n\n      png_ptr->mode |= PNG_HAVE_IDAT;\n\n      if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)\n         png_benign_error(png_ptr, \"Too many IDATs found\");\n   }\n\n   if (chunk_name == png_IHDR)\n   {\n      if (png_ptr->push_length != 13)\n         png_error(png_ptr, \"Invalid IHDR length\");\n\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n   else if (chunk_name == png_IEND)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);\n\n      png_ptr->process_mode = PNG_READ_DONE_MODE;\n      png_push_have_end(png_ptr, info_ptr);\n   }\n\n#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n   else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length, keep);\n\n      if (chunk_name == png_PLTE)\n         png_ptr->mode |= PNG_HAVE_PLTE;\n   }\n#endif\n\n   else if (chunk_name == png_PLTE)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n   else if (chunk_name == png_IDAT)\n   {\n      png_ptr->idat_size = png_ptr->push_length;\n      png_ptr->process_mode = PNG_READ_IDAT_MODE;\n      png_push_have_info(png_ptr, info_ptr);\n      png_ptr->zstream.avail_out =\n          (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,\n          png_ptr->iwidth) + 1;\n      png_ptr->zstream.next_out = png_ptr->row_buf;\n      return;\n   }\n\n#ifdef PNG_READ_gAMA_SUPPORTED\n   else if (png_ptr->chunk_name == png_gAMA)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_sBIT_SUPPORTED\n   else if (png_ptr->chunk_name == png_sBIT)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_cHRM_SUPPORTED\n   else if (png_ptr->chunk_name == png_cHRM)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_sRGB_SUPPORTED\n   else if (chunk_name == png_sRGB)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_iCCP_SUPPORTED\n   else if (png_ptr->chunk_name == png_iCCP)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_sPLT_SUPPORTED\n   else if (chunk_name == png_sPLT)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_tRNS_SUPPORTED\n   else if (chunk_name == png_tRNS)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_bKGD_SUPPORTED\n   else if (chunk_name == png_bKGD)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_hIST_SUPPORTED\n   else if (chunk_name == png_hIST)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_pHYs_SUPPORTED\n   else if (chunk_name == png_pHYs)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_oFFs_SUPPORTED\n   else if (chunk_name == png_oFFs)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);\n   }\n#endif\n\n#ifdef PNG_READ_pCAL_SUPPORTED\n   else if (chunk_name == png_pCAL)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_sCAL_SUPPORTED\n   else if (chunk_name == png_sCAL)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_tIME_SUPPORTED\n   else if (chunk_name == png_tIME)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_tEXt_SUPPORTED\n   else if (chunk_name == png_tEXt)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_zTXt_SUPPORTED\n   else if (chunk_name == png_zTXt)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);\n   }\n\n#endif\n#ifdef PNG_READ_iTXt_SUPPORTED\n   else if (chunk_name == png_iTXt)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);\n   }\n#endif\n\n   else\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_FULL\n      png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length,\n         PNG_HANDLE_CHUNK_AS_DEFAULT);\n   }\n\n   png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;\n}\n\nvoid PNGCBAPI\npng_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)\n{\n   png_bytep ptr;\n\n   if (png_ptr == NULL)\n      return;\n\n   ptr = buffer;\n   if (png_ptr->save_buffer_size != 0)\n   {\n      png_size_t save_size;\n\n      if (length < png_ptr->save_buffer_size)\n         save_size = length;\n\n      else\n         save_size = png_ptr->save_buffer_size;\n\n      memcpy(ptr, png_ptr->save_buffer_ptr, save_size);\n      length -= save_size;\n      ptr += save_size;\n      png_ptr->buffer_size -= save_size;\n      png_ptr->save_buffer_size -= save_size;\n      png_ptr->save_buffer_ptr += save_size;\n   }\n   if (length != 0 && png_ptr->current_buffer_size != 0)\n   {\n      png_size_t save_size;\n\n      if (length < png_ptr->current_buffer_size)\n         save_size = length;\n\n      else\n         save_size = png_ptr->current_buffer_size;\n\n      memcpy(ptr, png_ptr->current_buffer_ptr, save_size);\n      png_ptr->buffer_size -= save_size;\n      png_ptr->current_buffer_size -= save_size;\n      png_ptr->current_buffer_ptr += save_size;\n   }\n}\n\nvoid /* PRIVATE */\npng_push_save_buffer(png_structrp png_ptr)\n{\n   if (png_ptr->save_buffer_size != 0)\n   {\n      if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)\n      {\n         png_size_t i, istop;\n         png_bytep sp;\n         png_bytep dp;\n\n         istop = png_ptr->save_buffer_size;\n         for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;\n             i < istop; i++, sp++, dp++)\n         {\n            *dp = *sp;\n         }\n      }\n   }\n   if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >\n       png_ptr->save_buffer_max)\n   {\n      png_size_t new_max;\n      png_bytep old_buffer;\n\n      if (png_ptr->save_buffer_size > PNG_SIZE_MAX -\n          (png_ptr->current_buffer_size + 256))\n      {\n         png_error(png_ptr, \"Potential overflow of save_buffer\");\n      }\n\n      new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;\n      old_buffer = png_ptr->save_buffer;\n      png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr,\n          (png_size_t)new_max);\n\n      if (png_ptr->save_buffer == NULL)\n      {\n         png_free(png_ptr, old_buffer);\n         png_error(png_ptr, \"Insufficient memory for save_buffer\");\n      }\n\n      if (old_buffer)\n         memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);\n      else if (png_ptr->save_buffer_size)\n         png_error(png_ptr, \"save_buffer error\");\n      png_free(png_ptr, old_buffer);\n      png_ptr->save_buffer_max = new_max;\n   }\n   if (png_ptr->current_buffer_size)\n   {\n      memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,\n         png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);\n      png_ptr->save_buffer_size += png_ptr->current_buffer_size;\n      png_ptr->current_buffer_size = 0;\n   }\n   png_ptr->save_buffer_ptr = png_ptr->save_buffer;\n   png_ptr->buffer_size = 0;\n}\n\nvoid /* PRIVATE */\npng_push_restore_buffer(png_structrp png_ptr, png_bytep buffer,\n   png_size_t buffer_length)\n{\n   png_ptr->current_buffer = buffer;\n   png_ptr->current_buffer_size = buffer_length;\n   png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size;\n   png_ptr->current_buffer_ptr = png_ptr->current_buffer;\n}\n\nvoid /* PRIVATE */\npng_push_read_IDAT(png_structrp png_ptr)\n{\n   if ((png_ptr->mode & PNG_HAVE_CHUNK_HEADER) == 0)\n   {\n      png_byte chunk_length[4];\n      png_byte chunk_tag[4];\n\n      /* TODO: this code can be commoned up with the same code in push_read */\n      PNG_PUSH_SAVE_BUFFER_IF_LT(8)\n      png_push_fill_buffer(png_ptr, chunk_length, 4);\n      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);\n      png_reset_crc(png_ptr);\n      png_crc_read(png_ptr, chunk_tag, 4);\n      png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);\n      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;\n\n      if (png_ptr->chunk_name != png_IDAT)\n      {\n         png_ptr->process_mode = PNG_READ_CHUNK_MODE;\n\n         if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)\n            png_error(png_ptr, \"Not enough compressed data\");\n\n         return;\n      }\n\n      png_ptr->idat_size = png_ptr->push_length;\n   }\n\n   if (png_ptr->idat_size != 0 && png_ptr->save_buffer_size != 0)\n   {\n      png_size_t save_size = png_ptr->save_buffer_size;\n      png_uint_32 idat_size = png_ptr->idat_size;\n\n      /* We want the smaller of 'idat_size' and 'current_buffer_size', but they\n       * are of different types and we don't know which variable has the fewest\n       * bits.  Carefully select the smaller and cast it to the type of the\n       * larger - this cannot overflow.  Do not cast in the following test - it\n       * will break on either 16-bit or 64-bit platforms.\n       */\n      if (idat_size < save_size)\n         save_size = (png_size_t)idat_size;\n\n      else\n         idat_size = (png_uint_32)save_size;\n\n      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);\n\n      png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);\n\n      png_ptr->idat_size -= idat_size;\n      png_ptr->buffer_size -= save_size;\n      png_ptr->save_buffer_size -= save_size;\n      png_ptr->save_buffer_ptr += save_size;\n   }\n\n   if (png_ptr->idat_size != 0 && png_ptr->current_buffer_size != 0)\n   {\n      png_size_t save_size = png_ptr->current_buffer_size;\n      png_uint_32 idat_size = png_ptr->idat_size;\n\n      /* We want the smaller of 'idat_size' and 'current_buffer_size', but they\n       * are of different types and we don't know which variable has the fewest\n       * bits.  Carefully select the smaller and cast it to the type of the\n       * larger - this cannot overflow.\n       */\n      if (idat_size < save_size)\n         save_size = (png_size_t)idat_size;\n\n      else\n         idat_size = (png_uint_32)save_size;\n\n      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);\n\n      png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);\n\n      png_ptr->idat_size -= idat_size;\n      png_ptr->buffer_size -= save_size;\n      png_ptr->current_buffer_size -= save_size;\n      png_ptr->current_buffer_ptr += save_size;\n   }\n\n   if (png_ptr->idat_size == 0)\n   {\n      PNG_PUSH_SAVE_BUFFER_IF_LT(4)\n      png_crc_finish(png_ptr, 0);\n      png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;\n      png_ptr->mode |= PNG_AFTER_IDAT;\n      png_ptr->zowner = 0;\n   }\n}\n\nvoid /* PRIVATE */\npng_process_IDAT_data(png_structrp png_ptr, png_bytep buffer,\n   png_size_t buffer_length)\n{\n   /* The caller checks for a non-zero buffer length. */\n   if (!(buffer_length > 0) || buffer == NULL)\n      png_error(png_ptr, \"No IDAT data (internal error)\");\n\n   /* This routine must process all the data it has been given\n    * before returning, calling the row callback as required to\n    * handle the uncompressed results.\n    */\n   png_ptr->zstream.next_in = buffer;\n   /* TODO: WARNING: TRUNCATION ERROR: DANGER WILL ROBINSON: */\n   png_ptr->zstream.avail_in = (uInt)buffer_length;\n\n   /* Keep going until the decompressed data is all processed\n    * or the stream marked as finished.\n    */\n   while (png_ptr->zstream.avail_in > 0 &&\n      (png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)\n   {\n      int ret;\n\n      /* We have data for zlib, but we must check that zlib\n       * has someplace to put the results.  It doesn't matter\n       * if we don't expect any results -- it may be the input\n       * data is just the LZ end code.\n       */\n      if (!(png_ptr->zstream.avail_out > 0))\n      {\n         /* TODO: WARNING: TRUNCATION ERROR: DANGER WILL ROBINSON: */\n         png_ptr->zstream.avail_out = (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth,\n             png_ptr->iwidth) + 1);\n\n         png_ptr->zstream.next_out = png_ptr->row_buf;\n      }\n\n      /* Using Z_SYNC_FLUSH here means that an unterminated\n       * LZ stream (a stream with a missing end code) can still\n       * be handled, otherwise (Z_NO_FLUSH) a future zlib\n       * implementation might defer output and therefore\n       * change the current behavior (see comments in inflate.c\n       * for why this doesn't happen at present with zlib 1.2.5).\n       */\n      ret = PNG_INFLATE(png_ptr, Z_SYNC_FLUSH);\n\n      /* Check for any failure before proceeding. */\n      if (ret != Z_OK && ret != Z_STREAM_END)\n      {\n         /* Terminate the decompression. */\n         png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;\n         png_ptr->zowner = 0;\n\n         /* This may be a truncated stream (missing or\n          * damaged end code).  Treat that as a warning.\n          */\n         if (png_ptr->row_number >= png_ptr->num_rows ||\n             png_ptr->pass > 6)\n            png_warning(png_ptr, \"Truncated compressed data in IDAT\");\n\n         else\n            png_error(png_ptr, \"Decompression error in IDAT\");\n\n         /* Skip the check on unprocessed input */\n         return;\n      }\n\n      /* Did inflate output any data? */\n      if (png_ptr->zstream.next_out != png_ptr->row_buf)\n      {\n         /* Is this unexpected data after the last row?\n          * If it is, artificially terminate the LZ output\n          * here.\n          */\n         if (png_ptr->row_number >= png_ptr->num_rows ||\n             png_ptr->pass > 6)\n         {\n            /* Extra data. */\n            png_warning(png_ptr, \"Extra compressed data in IDAT\");\n            png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;\n            png_ptr->zowner = 0;\n\n            /* Do no more processing; skip the unprocessed\n             * input check below.\n             */\n            return;\n         }\n\n         /* Do we have a complete row? */\n         if (png_ptr->zstream.avail_out == 0)\n            png_push_process_row(png_ptr);\n      }\n\n      /* And check for the end of the stream. */\n      if (ret == Z_STREAM_END)\n         png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;\n   }\n\n   /* All the data should have been processed, if anything\n    * is left at this point we have bytes of IDAT data\n    * after the zlib end code.\n    */\n   if (png_ptr->zstream.avail_in > 0)\n      png_warning(png_ptr, \"Extra compression data in IDAT\");\n}\n\nvoid /* PRIVATE */\npng_push_process_row(png_structrp png_ptr)\n{\n   /* 1.5.6: row_info moved out of png_struct to a local here. */\n   png_row_info row_info;\n\n   row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */\n   row_info.color_type = png_ptr->color_type;\n   row_info.bit_depth = png_ptr->bit_depth;\n   row_info.channels = png_ptr->channels;\n   row_info.pixel_depth = png_ptr->pixel_depth;\n   row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);\n\n   if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)\n   {\n      if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)\n         png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,\n            png_ptr->prev_row + 1, png_ptr->row_buf[0]);\n      else\n         png_error(png_ptr, \"bad adaptive filter value\");\n   }\n\n   /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before\n    * 1.5.6, while the buffer really is this big in current versions of libpng\n    * it may not be in the future, so this was changed just to copy the\n    * interlaced row count:\n    */\n   memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);\n\n#ifdef PNG_READ_TRANSFORMS_SUPPORTED\n   if (png_ptr->transformations != 0)\n      png_do_read_transformations(png_ptr, &row_info);\n#endif\n\n   /* The transformed pixel depth should match the depth now in row_info. */\n   if (png_ptr->transformed_pixel_depth == 0)\n   {\n      png_ptr->transformed_pixel_depth = row_info.pixel_depth;\n      if (row_info.pixel_depth > png_ptr->maximum_pixel_depth)\n         png_error(png_ptr, \"progressive row overflow\");\n   }\n\n   else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth)\n      png_error(png_ptr, \"internal progressive row size calculation error\");\n\n\n#ifdef PNG_READ_INTERLACING_SUPPORTED\n   /* Expand interlaced rows to full size */\n   if (png_ptr->interlaced != 0 &&\n       (png_ptr->transformations & PNG_INTERLACE) != 0)\n   {\n      if (png_ptr->pass < 6)\n         png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,\n            png_ptr->transformations);\n\n      switch (png_ptr->pass)\n      {\n         case 0:\n         {\n            int i;\n            for (i = 0; i < 8 && png_ptr->pass == 0; i++)\n            {\n               png_push_have_row(png_ptr, png_ptr->row_buf + 1);\n               png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */\n            }\n\n            if (png_ptr->pass == 2) /* Pass 1 might be empty */\n            {\n               for (i = 0; i < 4 && png_ptr->pass == 2; i++)\n               {\n                  png_push_have_row(png_ptr, NULL);\n                  png_read_push_finish_row(png_ptr);\n               }\n            }\n\n            if (png_ptr->pass == 4 && png_ptr->height <= 4)\n            {\n               for (i = 0; i < 2 && png_ptr->pass == 4; i++)\n               {\n                  png_push_have_row(png_ptr, NULL);\n                  png_read_push_finish_row(png_ptr);\n               }\n            }\n\n            if (png_ptr->pass == 6 && png_ptr->height <= 4)\n            {\n                png_push_have_row(png_ptr, NULL);\n                png_read_push_finish_row(png_ptr);\n            }\n\n            break;\n         }\n\n         case 1:\n         {\n            int i;\n            for (i = 0; i < 8 && png_ptr->pass == 1; i++)\n            {\n               png_push_have_row(png_ptr, png_ptr->row_buf + 1);\n               png_read_push_finish_row(png_ptr);\n            }\n\n            if (png_ptr->pass == 2) /* Skip top 4 generated rows */\n            {\n               for (i = 0; i < 4 && png_ptr->pass == 2; i++)\n               {\n                  png_push_have_row(png_ptr, NULL);\n                  png_read_push_finish_row(png_ptr);\n               }\n            }\n\n            break;\n         }\n\n         case 2:\n         {\n            int i;\n\n            for (i = 0; i < 4 && png_ptr->pass == 2; i++)\n            {\n               png_push_have_row(png_ptr, png_ptr->row_buf + 1);\n               png_read_push_finish_row(png_ptr);\n            }\n\n            for (i = 0; i < 4 && png_ptr->pass == 2; i++)\n            {\n               png_push_have_row(png_ptr, NULL);\n               png_read_push_finish_row(png_ptr);\n            }\n\n            if (png_ptr->pass == 4) /* Pass 3 might be empty */\n            {\n               for (i = 0; i < 2 && png_ptr->pass == 4; i++)\n               {\n                  png_push_have_row(png_ptr, NULL);\n                  png_read_push_finish_row(png_ptr);\n               }\n            }\n\n            break;\n         }\n\n         case 3:\n         {\n            int i;\n\n            for (i = 0; i < 4 && png_ptr->pass == 3; i++)\n            {\n               png_push_have_row(png_ptr, png_ptr->row_buf + 1);\n               png_read_push_finish_row(png_ptr);\n            }\n\n            if (png_ptr->pass == 4) /* Skip top two generated rows */\n            {\n               for (i = 0; i < 2 && png_ptr->pass == 4; i++)\n               {\n                  png_push_have_row(png_ptr, NULL);\n                  png_read_push_finish_row(png_ptr);\n               }\n            }\n\n            break;\n         }\n\n         case 4:\n         {\n            int i;\n\n            for (i = 0; i < 2 && png_ptr->pass == 4; i++)\n            {\n               png_push_have_row(png_ptr, png_ptr->row_buf + 1);\n               png_read_push_finish_row(png_ptr);\n            }\n\n            for (i = 0; i < 2 && png_ptr->pass == 4; i++)\n            {\n               png_push_have_row(png_ptr, NULL);\n               png_read_push_finish_row(png_ptr);\n            }\n\n            if (png_ptr->pass == 6) /* Pass 5 might be empty */\n            {\n               png_push_have_row(png_ptr, NULL);\n               png_read_push_finish_row(png_ptr);\n            }\n\n            break;\n         }\n\n         case 5:\n         {\n            int i;\n\n            for (i = 0; i < 2 && png_ptr->pass == 5; i++)\n            {\n               png_push_have_row(png_ptr, png_ptr->row_buf + 1);\n               png_read_push_finish_row(png_ptr);\n            }\n\n            if (png_ptr->pass == 6) /* Skip top generated row */\n            {\n               png_push_have_row(png_ptr, NULL);\n               png_read_push_finish_row(png_ptr);\n            }\n\n            break;\n         }\n\n         default:\n         case 6:\n         {\n            png_push_have_row(png_ptr, png_ptr->row_buf + 1);\n            png_read_push_finish_row(png_ptr);\n\n            if (png_ptr->pass != 6)\n               break;\n\n            png_push_have_row(png_ptr, NULL);\n            png_read_push_finish_row(png_ptr);\n         }\n      }\n   }\n   else\n#endif\n   {\n      png_push_have_row(png_ptr, png_ptr->row_buf + 1);\n      png_read_push_finish_row(png_ptr);\n   }\n}\n\nvoid /* PRIVATE */\npng_read_push_finish_row(png_structrp png_ptr)\n{\n#ifdef PNG_READ_INTERLACING_SUPPORTED\n   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */\n\n   /* Start of interlace block */\n   static PNG_CONST png_byte png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};\n\n   /* Offset to next interlace block */\n   static PNG_CONST png_byte png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};\n\n   /* Start of interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};\n\n   /* Offset to next interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};\n\n   /* Height of interlace block.  This is not currently used - if you need\n    * it, uncomment it here and in png.h\n   static PNG_CONST png_byte png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};\n   */\n#endif\n\n   png_ptr->row_number++;\n   if (png_ptr->row_number < png_ptr->num_rows)\n      return;\n\n#ifdef PNG_READ_INTERLACING_SUPPORTED\n   if (png_ptr->interlaced != 0)\n   {\n      png_ptr->row_number = 0;\n      memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);\n\n      do\n      {\n         png_ptr->pass++;\n         if ((png_ptr->pass == 1 && png_ptr->width < 5) ||\n             (png_ptr->pass == 3 && png_ptr->width < 3) ||\n             (png_ptr->pass == 5 && png_ptr->width < 2))\n            png_ptr->pass++;\n\n         if (png_ptr->pass > 7)\n            png_ptr->pass--;\n\n         if (png_ptr->pass >= 7)\n            break;\n\n         png_ptr->iwidth = (png_ptr->width +\n             png_pass_inc[png_ptr->pass] - 1 -\n             png_pass_start[png_ptr->pass]) /\n             png_pass_inc[png_ptr->pass];\n\n         if ((png_ptr->transformations & PNG_INTERLACE) != 0)\n            break;\n\n         png_ptr->num_rows = (png_ptr->height +\n             png_pass_yinc[png_ptr->pass] - 1 -\n             png_pass_ystart[png_ptr->pass]) /\n             png_pass_yinc[png_ptr->pass];\n\n      } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);\n   }\n#endif /* READ_INTERLACING */\n}\n\nvoid /* PRIVATE */\npng_push_have_info(png_structrp png_ptr, png_inforp info_ptr)\n{\n   if (png_ptr->info_fn != NULL)\n      (*(png_ptr->info_fn))(png_ptr, info_ptr);\n}\n\nvoid /* PRIVATE */\npng_push_have_end(png_structrp png_ptr, png_inforp info_ptr)\n{\n   if (png_ptr->end_fn != NULL)\n      (*(png_ptr->end_fn))(png_ptr, info_ptr);\n}\n\nvoid /* PRIVATE */\npng_push_have_row(png_structrp png_ptr, png_bytep row)\n{\n   if (png_ptr->row_fn != NULL)\n      (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,\n         (int)png_ptr->pass);\n}\n\n#ifdef PNG_READ_INTERLACING_SUPPORTED\nvoid PNGAPI\npng_progressive_combine_row(png_const_structrp png_ptr, png_bytep old_row,\n    png_const_bytep new_row)\n{\n   if (png_ptr == NULL)\n      return;\n\n   /* new_row is a flag here - if it is NULL then the app callback was called\n    * from an empty row (see the calls to png_struct::row_fn below), otherwise\n    * it must be png_ptr->row_buf+1\n    */\n   if (new_row != NULL)\n      png_combine_row(png_ptr, old_row, 1/*blocky display*/);\n}\n#endif /* READ_INTERLACING */\n\nvoid PNGAPI\npng_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr,\n    png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,\n    png_progressive_end_ptr end_fn)\n{\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->info_fn = info_fn;\n   png_ptr->row_fn = row_fn;\n   png_ptr->end_fn = end_fn;\n\n   png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);\n}\n\npng_voidp PNGAPI\npng_get_progressive_ptr(png_const_structrp png_ptr)\n{\n   if (png_ptr == NULL)\n      return (NULL);\n\n   return png_ptr->io_ptr;\n}\n#endif /* PROGRESSIVE_READ */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngread.c",
    "content": "\n/* pngread.c - read a PNG file\n *\n * Last changed in libpng 1.6.23 [June 9, 2016]\n * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * This file contains routines that an application calls directly to\n * read a PNG file or stream.\n */\n\n#include \"pngpriv.h\"\n#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)\n#  include <errno.h>\n#endif\n\n#ifdef PNG_READ_SUPPORTED\n\n/* Create a PNG structure for reading, and allocate any memory needed. */\nPNG_FUNCTION(png_structp,PNGAPI\npng_create_read_struct,(png_const_charp user_png_ver, png_voidp error_ptr,\n    png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED)\n{\n#ifndef PNG_USER_MEM_SUPPORTED\n   png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,\n      error_fn, warn_fn, NULL, NULL, NULL);\n#else\n   return png_create_read_struct_2(user_png_ver, error_ptr, error_fn,\n       warn_fn, NULL, NULL, NULL);\n}\n\n/* Alternate create PNG structure for reading, and allocate any memory\n * needed.\n */\nPNG_FUNCTION(png_structp,PNGAPI\npng_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,\n    png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,\n    png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)\n{\n   png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,\n      error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);\n#endif /* USER_MEM */\n\n   if (png_ptr != NULL)\n   {\n      png_ptr->mode = PNG_IS_READ_STRUCT;\n\n      /* Added in libpng-1.6.0; this can be used to detect a read structure if\n       * required (it will be zero in a write structure.)\n       */\n#     ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n         png_ptr->IDAT_read_size = PNG_IDAT_READ_SIZE;\n#     endif\n\n#     ifdef PNG_BENIGN_READ_ERRORS_SUPPORTED\n         png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;\n\n         /* In stable builds only warn if an application error can be completely\n          * handled.\n          */\n#        if PNG_RELEASE_BUILD\n            png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;\n#        endif\n#     endif\n\n      /* TODO: delay this, it can be done in png_init_io (if the app doesn't\n       * do it itself) avoiding setting the default function if it is not\n       * required.\n       */\n      png_set_read_fn(png_ptr, NULL, NULL);\n   }\n\n   return png_ptr;\n}\n\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Read the information before the actual image data.  This has been\n * changed in v0.90 to allow reading a file that already has the magic\n * bytes read from the stream.  You can tell libpng how many bytes have\n * been read from the beginning of the stream (up to the maximum of 8)\n * via png_set_sig_bytes(), and we will only check the remaining bytes\n * here.  The application can then have access to the signature bytes we\n * read if it is determined that this isn't a valid PNG file.\n */\nvoid PNGAPI\npng_read_info(png_structrp png_ptr, png_inforp info_ptr)\n{\n#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n   int keep;\n#endif\n\n   png_debug(1, \"in png_read_info\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   /* Read and check the PNG file signature. */\n   png_read_sig(png_ptr, info_ptr);\n\n   for (;;)\n   {\n      png_uint_32 length = png_read_chunk_header(png_ptr);\n      png_uint_32 chunk_name = png_ptr->chunk_name;\n\n      /* IDAT logic needs to happen here to simplify getting the two flags\n       * right.\n       */\n      if (chunk_name == png_IDAT)\n      {\n         if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n            png_chunk_error(png_ptr, \"Missing IHDR before IDAT\");\n\n         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&\n             (png_ptr->mode & PNG_HAVE_PLTE) == 0)\n            png_chunk_error(png_ptr, \"Missing PLTE before IDAT\");\n\n         else if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)\n            png_chunk_benign_error(png_ptr, \"Too many IDATs found\");\n\n         png_ptr->mode |= PNG_HAVE_IDAT;\n      }\n\n      else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n      {\n         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;\n         png_ptr->mode |= PNG_AFTER_IDAT;\n      }\n\n      /* This should be a binary subdivision search or a hash for\n       * matching the chunk name rather than a linear search.\n       */\n      if (chunk_name == png_IHDR)\n         png_handle_IHDR(png_ptr, info_ptr, length);\n\n      else if (chunk_name == png_IEND)\n         png_handle_IEND(png_ptr, info_ptr, length);\n\n#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n      else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)\n      {\n         png_handle_unknown(png_ptr, info_ptr, length, keep);\n\n         if (chunk_name == png_PLTE)\n            png_ptr->mode |= PNG_HAVE_PLTE;\n\n         else if (chunk_name == png_IDAT)\n         {\n            png_ptr->idat_size = 0; /* It has been consumed */\n            break;\n         }\n      }\n#endif\n      else if (chunk_name == png_PLTE)\n         png_handle_PLTE(png_ptr, info_ptr, length);\n\n      else if (chunk_name == png_IDAT)\n      {\n         png_ptr->idat_size = length;\n         break;\n      }\n\n#ifdef PNG_READ_bKGD_SUPPORTED\n      else if (chunk_name == png_bKGD)\n         png_handle_bKGD(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_cHRM_SUPPORTED\n      else if (chunk_name == png_cHRM)\n         png_handle_cHRM(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_gAMA_SUPPORTED\n      else if (chunk_name == png_gAMA)\n         png_handle_gAMA(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_hIST_SUPPORTED\n      else if (chunk_name == png_hIST)\n         png_handle_hIST(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_oFFs_SUPPORTED\n      else if (chunk_name == png_oFFs)\n         png_handle_oFFs(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_pCAL_SUPPORTED\n      else if (chunk_name == png_pCAL)\n         png_handle_pCAL(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_sCAL_SUPPORTED\n      else if (chunk_name == png_sCAL)\n         png_handle_sCAL(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_pHYs_SUPPORTED\n      else if (chunk_name == png_pHYs)\n         png_handle_pHYs(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_sBIT_SUPPORTED\n      else if (chunk_name == png_sBIT)\n         png_handle_sBIT(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_sRGB_SUPPORTED\n      else if (chunk_name == png_sRGB)\n         png_handle_sRGB(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_iCCP_SUPPORTED\n      else if (chunk_name == png_iCCP)\n         png_handle_iCCP(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_sPLT_SUPPORTED\n      else if (chunk_name == png_sPLT)\n         png_handle_sPLT(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_tEXt_SUPPORTED\n      else if (chunk_name == png_tEXt)\n         png_handle_tEXt(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_tIME_SUPPORTED\n      else if (chunk_name == png_tIME)\n         png_handle_tIME(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_tRNS_SUPPORTED\n      else if (chunk_name == png_tRNS)\n         png_handle_tRNS(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_zTXt_SUPPORTED\n      else if (chunk_name == png_zTXt)\n         png_handle_zTXt(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_iTXt_SUPPORTED\n      else if (chunk_name == png_iTXt)\n         png_handle_iTXt(png_ptr, info_ptr, length);\n#endif\n\n      else\n         png_handle_unknown(png_ptr, info_ptr, length,\n            PNG_HANDLE_CHUNK_AS_DEFAULT);\n   }\n}\n#endif /* SEQUENTIAL_READ */\n\n/* Optional call to update the users info_ptr structure */\nvoid PNGAPI\npng_read_update_info(png_structrp png_ptr, png_inforp info_ptr)\n{\n   png_debug(1, \"in png_read_update_info\");\n\n   if (png_ptr != NULL)\n   {\n      if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)\n      {\n         png_read_start_row(png_ptr);\n\n#        ifdef PNG_READ_TRANSFORMS_SUPPORTED\n            png_read_transform_info(png_ptr, info_ptr);\n#        else\n            PNG_UNUSED(info_ptr)\n#        endif\n      }\n\n      /* New in 1.6.0 this avoids the bug of doing the initializations twice */\n      else\n         png_app_error(png_ptr,\n            \"png_read_update_info/png_start_read_image: duplicate call\");\n   }\n}\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Initialize palette, background, etc, after transformations\n * are set, but before any reading takes place.  This allows\n * the user to obtain a gamma-corrected palette, for example.\n * If the user doesn't call this, we will do it ourselves.\n */\nvoid PNGAPI\npng_start_read_image(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_start_read_image\");\n\n   if (png_ptr != NULL)\n   {\n      if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)\n         png_read_start_row(png_ptr);\n\n      /* New in 1.6.0 this avoids the bug of doing the initializations twice */\n      else\n         png_app_error(png_ptr,\n            \"png_start_read_image/png_read_update_info: duplicate call\");\n   }\n}\n#endif /* SEQUENTIAL_READ */\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n/* Undoes intrapixel differencing,\n * NOTE: this is apparently only supported in the 'sequential' reader.\n */\nstatic void\npng_do_read_intrapixel(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_read_intrapixel\");\n\n   if (\n       (row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)\n   {\n      int bytes_per_pixel;\n      png_uint_32 row_width = row_info->width;\n\n      if (row_info->bit_depth == 8)\n      {\n         png_bytep rp;\n         png_uint_32 i;\n\n         if (row_info->color_type == PNG_COLOR_TYPE_RGB)\n            bytes_per_pixel = 3;\n\n         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n            bytes_per_pixel = 4;\n\n         else\n            return;\n\n         for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)\n         {\n            *(rp) = (png_byte)((256 + *rp + *(rp + 1)) & 0xff);\n            *(rp+2) = (png_byte)((256 + *(rp + 2) + *(rp + 1)) & 0xff);\n         }\n      }\n      else if (row_info->bit_depth == 16)\n      {\n         png_bytep rp;\n         png_uint_32 i;\n\n         if (row_info->color_type == PNG_COLOR_TYPE_RGB)\n            bytes_per_pixel = 6;\n\n         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n            bytes_per_pixel = 8;\n\n         else\n            return;\n\n         for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)\n         {\n            png_uint_32 s0   = (*(rp    ) << 8) | *(rp + 1);\n            png_uint_32 s1   = (*(rp + 2) << 8) | *(rp + 3);\n            png_uint_32 s2   = (*(rp + 4) << 8) | *(rp + 5);\n            png_uint_32 red  = (s0 + s1 + 65536) & 0xffff;\n            png_uint_32 blue = (s2 + s1 + 65536) & 0xffff;\n            *(rp    ) = (png_byte)((red >> 8) & 0xff);\n            *(rp + 1) = (png_byte)(red & 0xff);\n            *(rp + 4) = (png_byte)((blue >> 8) & 0xff);\n            *(rp + 5) = (png_byte)(blue & 0xff);\n         }\n      }\n   }\n}\n#endif /* MNG_FEATURES */\n\nvoid PNGAPI\npng_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row)\n{\n   png_row_info row_info;\n\n   if (png_ptr == NULL)\n      return;\n\n   png_debug2(1, \"in png_read_row (row %lu, pass %d)\",\n       (unsigned long)png_ptr->row_number, png_ptr->pass);\n\n   /* png_read_start_row sets the information (in particular iwidth) for this\n    * interlace pass.\n    */\n   if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)\n      png_read_start_row(png_ptr);\n\n   /* 1.5.6: row_info moved out of png_struct to a local here. */\n   row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */\n   row_info.color_type = png_ptr->color_type;\n   row_info.bit_depth = png_ptr->bit_depth;\n   row_info.channels = png_ptr->channels;\n   row_info.pixel_depth = png_ptr->pixel_depth;\n   row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);\n\n#ifdef PNG_WARNINGS_SUPPORTED\n   if (png_ptr->row_number == 0 && png_ptr->pass == 0)\n   {\n   /* Check for transforms that have been set but were defined out */\n#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)\n   if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)\n      png_warning(png_ptr, \"PNG_READ_INVERT_SUPPORTED is not defined\");\n#endif\n\n#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)\n   if ((png_ptr->transformations & PNG_FILLER) != 0)\n      png_warning(png_ptr, \"PNG_READ_FILLER_SUPPORTED is not defined\");\n#endif\n\n#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \\\n    !defined(PNG_READ_PACKSWAP_SUPPORTED)\n   if ((png_ptr->transformations & PNG_PACKSWAP) != 0)\n      png_warning(png_ptr, \"PNG_READ_PACKSWAP_SUPPORTED is not defined\");\n#endif\n\n#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)\n   if ((png_ptr->transformations & PNG_PACK) != 0)\n      png_warning(png_ptr, \"PNG_READ_PACK_SUPPORTED is not defined\");\n#endif\n\n#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)\n   if ((png_ptr->transformations & PNG_SHIFT) != 0)\n      png_warning(png_ptr, \"PNG_READ_SHIFT_SUPPORTED is not defined\");\n#endif\n\n#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)\n   if ((png_ptr->transformations & PNG_BGR) != 0)\n      png_warning(png_ptr, \"PNG_READ_BGR_SUPPORTED is not defined\");\n#endif\n\n#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)\n   if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)\n      png_warning(png_ptr, \"PNG_READ_SWAP_SUPPORTED is not defined\");\n#endif\n   }\n#endif /* WARNINGS */\n\n#ifdef PNG_READ_INTERLACING_SUPPORTED\n   /* If interlaced and we do not need a new row, combine row and return.\n    * Notice that the pixels we have from previous rows have been transformed\n    * already; we can only combine like with like (transformed or\n    * untransformed) and, because of the libpng API for interlaced images, this\n    * means we must transform before de-interlacing.\n    */\n   if (png_ptr->interlaced != 0 &&\n       (png_ptr->transformations & PNG_INTERLACE) != 0)\n   {\n      switch (png_ptr->pass)\n      {\n         case 0:\n            if (png_ptr->row_number & 0x07)\n            {\n               if (dsp_row != NULL)\n                  png_combine_row(png_ptr, dsp_row, 1/*display*/);\n               png_read_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 1:\n            if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)\n            {\n               if (dsp_row != NULL)\n                  png_combine_row(png_ptr, dsp_row, 1/*display*/);\n\n               png_read_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 2:\n            if ((png_ptr->row_number & 0x07) != 4)\n            {\n               if (dsp_row != NULL && (png_ptr->row_number & 4))\n                  png_combine_row(png_ptr, dsp_row, 1/*display*/);\n\n               png_read_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 3:\n            if ((png_ptr->row_number & 3) || png_ptr->width < 3)\n            {\n               if (dsp_row != NULL)\n                  png_combine_row(png_ptr, dsp_row, 1/*display*/);\n\n               png_read_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 4:\n            if ((png_ptr->row_number & 3) != 2)\n            {\n               if (dsp_row != NULL && (png_ptr->row_number & 2))\n                  png_combine_row(png_ptr, dsp_row, 1/*display*/);\n\n               png_read_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 5:\n            if ((png_ptr->row_number & 1) || png_ptr->width < 2)\n            {\n               if (dsp_row != NULL)\n                  png_combine_row(png_ptr, dsp_row, 1/*display*/);\n\n               png_read_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         default:\n         case 6:\n            if ((png_ptr->row_number & 1) == 0)\n            {\n               png_read_finish_row(png_ptr);\n               return;\n            }\n            break;\n      }\n   }\n#endif\n\n   if ((png_ptr->mode & PNG_HAVE_IDAT) == 0)\n      png_error(png_ptr, \"Invalid attempt to read row data\");\n\n   /* Fill the row with IDAT data: */\n   png_read_IDAT_data(png_ptr, png_ptr->row_buf, row_info.rowbytes + 1);\n\n   if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)\n   {\n      if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)\n         png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,\n            png_ptr->prev_row + 1, png_ptr->row_buf[0]);\n      else\n         png_error(png_ptr, \"bad adaptive filter value\");\n   }\n\n   /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before\n    * 1.5.6, while the buffer really is this big in current versions of libpng\n    * it may not be in the future, so this was changed just to copy the\n    * interlaced count:\n    */\n   memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);\n\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&\n       (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))\n   {\n      /* Intrapixel differencing */\n      png_do_read_intrapixel(&row_info, png_ptr->row_buf + 1);\n   }\n#endif\n\n#ifdef PNG_READ_TRANSFORMS_SUPPORTED\n   if (png_ptr->transformations)\n      png_do_read_transformations(png_ptr, &row_info);\n#endif\n\n   /* The transformed pixel depth should match the depth now in row_info. */\n   if (png_ptr->transformed_pixel_depth == 0)\n   {\n      png_ptr->transformed_pixel_depth = row_info.pixel_depth;\n      if (row_info.pixel_depth > png_ptr->maximum_pixel_depth)\n         png_error(png_ptr, \"sequential row overflow\");\n   }\n\n   else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth)\n      png_error(png_ptr, \"internal sequential row size calculation error\");\n\n#ifdef PNG_READ_INTERLACING_SUPPORTED\n   /* Expand interlaced rows to full size */\n   if (png_ptr->interlaced != 0 &&\n      (png_ptr->transformations & PNG_INTERLACE) != 0)\n   {\n      if (png_ptr->pass < 6)\n         png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,\n            png_ptr->transformations);\n\n      if (dsp_row != NULL)\n         png_combine_row(png_ptr, dsp_row, 1/*display*/);\n\n      if (row != NULL)\n         png_combine_row(png_ptr, row, 0/*row*/);\n   }\n\n   else\n#endif\n   {\n      if (row != NULL)\n         png_combine_row(png_ptr, row, -1/*ignored*/);\n\n      if (dsp_row != NULL)\n         png_combine_row(png_ptr, dsp_row, -1/*ignored*/);\n   }\n   png_read_finish_row(png_ptr);\n\n   if (png_ptr->read_row_fn != NULL)\n      (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);\n\n}\n#endif /* SEQUENTIAL_READ */\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Read one or more rows of image data.  If the image is interlaced,\n * and png_set_interlace_handling() has been called, the rows need to\n * contain the contents of the rows from the previous pass.  If the\n * image has alpha or transparency, and png_handle_alpha()[*] has been\n * called, the rows contents must be initialized to the contents of the\n * screen.\n *\n * \"row\" holds the actual image, and pixels are placed in it\n * as they arrive.  If the image is displayed after each pass, it will\n * appear to \"sparkle\" in.  \"display_row\" can be used to display a\n * \"chunky\" progressive image, with finer detail added as it becomes\n * available.  If you do not want this \"chunky\" display, you may pass\n * NULL for display_row.  If you do not want the sparkle display, and\n * you have not called png_handle_alpha(), you may pass NULL for rows.\n * If you have called png_handle_alpha(), and the image has either an\n * alpha channel or a transparency chunk, you must provide a buffer for\n * rows.  In this case, you do not have to provide a display_row buffer\n * also, but you may.  If the image is not interlaced, or if you have\n * not called png_set_interlace_handling(), the display_row buffer will\n * be ignored, so pass NULL to it.\n *\n * [*] png_handle_alpha() does not exist yet, as of this version of libpng\n */\n\nvoid PNGAPI\npng_read_rows(png_structrp png_ptr, png_bytepp row,\n    png_bytepp display_row, png_uint_32 num_rows)\n{\n   png_uint_32 i;\n   png_bytepp rp;\n   png_bytepp dp;\n\n   png_debug(1, \"in png_read_rows\");\n\n   if (png_ptr == NULL)\n      return;\n\n   rp = row;\n   dp = display_row;\n   if (rp != NULL && dp != NULL)\n      for (i = 0; i < num_rows; i++)\n      {\n         png_bytep rptr = *rp++;\n         png_bytep dptr = *dp++;\n\n         png_read_row(png_ptr, rptr, dptr);\n      }\n\n   else if (rp != NULL)\n      for (i = 0; i < num_rows; i++)\n      {\n         png_bytep rptr = *rp;\n         png_read_row(png_ptr, rptr, NULL);\n         rp++;\n      }\n\n   else if (dp != NULL)\n      for (i = 0; i < num_rows; i++)\n      {\n         png_bytep dptr = *dp;\n         png_read_row(png_ptr, NULL, dptr);\n         dp++;\n      }\n}\n#endif /* SEQUENTIAL_READ */\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Read the entire image.  If the image has an alpha channel or a tRNS\n * chunk, and you have called png_handle_alpha()[*], you will need to\n * initialize the image to the current image that PNG will be overlaying.\n * We set the num_rows again here, in case it was incorrectly set in\n * png_read_start_row() by a call to png_read_update_info() or\n * png_start_read_image() if png_set_interlace_handling() wasn't called\n * prior to either of these functions like it should have been.  You can\n * only call this function once.  If you desire to have an image for\n * each pass of a interlaced image, use png_read_rows() instead.\n *\n * [*] png_handle_alpha() does not exist yet, as of this version of libpng\n */\nvoid PNGAPI\npng_read_image(png_structrp png_ptr, png_bytepp image)\n{\n   png_uint_32 i, image_height;\n   int pass, j;\n   png_bytepp rp;\n\n   png_debug(1, \"in png_read_image\");\n\n   if (png_ptr == NULL)\n      return;\n\n#ifdef PNG_READ_INTERLACING_SUPPORTED\n   if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)\n   {\n      pass = png_set_interlace_handling(png_ptr);\n      /* And make sure transforms are initialized. */\n      png_start_read_image(png_ptr);\n   }\n   else\n   {\n      if (png_ptr->interlaced != 0 &&\n          (png_ptr->transformations & PNG_INTERLACE) == 0)\n      {\n         /* Caller called png_start_read_image or png_read_update_info without\n          * first turning on the PNG_INTERLACE transform.  We can fix this here,\n          * but the caller should do it!\n          */\n         png_warning(png_ptr, \"Interlace handling should be turned on when \"\n            \"using png_read_image\");\n         /* Make sure this is set correctly */\n         png_ptr->num_rows = png_ptr->height;\n      }\n\n      /* Obtain the pass number, which also turns on the PNG_INTERLACE flag in\n       * the above error case.\n       */\n      pass = png_set_interlace_handling(png_ptr);\n   }\n#else\n   if (png_ptr->interlaced)\n      png_error(png_ptr,\n          \"Cannot read interlaced image -- interlace handler disabled\");\n\n   pass = 1;\n#endif\n\n   image_height=png_ptr->height;\n\n   for (j = 0; j < pass; j++)\n   {\n      rp = image;\n      for (i = 0; i < image_height; i++)\n      {\n         png_read_row(png_ptr, *rp, NULL);\n         rp++;\n      }\n   }\n}\n#endif /* SEQUENTIAL_READ */\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n/* Read the end of the PNG file.  Will not read past the end of the\n * file, will verify the end is accurate, and will read any comments\n * or time information at the end of the file, if info is not NULL.\n */\nvoid PNGAPI\npng_read_end(png_structrp png_ptr, png_inforp info_ptr)\n{\n#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n   int keep;\n#endif\n\n   png_debug(1, \"in png_read_end\");\n\n   if (png_ptr == NULL)\n      return;\n\n   /* If png_read_end is called in the middle of reading the rows there may\n    * still be pending IDAT data and an owned zstream.  Deal with this here.\n    */\n#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n   if (png_chunk_unknown_handling(png_ptr, png_IDAT) == 0)\n#endif\n      png_read_finish_IDAT(png_ptr);\n\n#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED\n   /* Report invalid palette index; added at libng-1.5.10 */\n   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&\n      png_ptr->num_palette_max > png_ptr->num_palette)\n     png_benign_error(png_ptr, \"Read palette index exceeding num_palette\");\n#endif\n\n   do\n   {\n      png_uint_32 length = png_read_chunk_header(png_ptr);\n      png_uint_32 chunk_name = png_ptr->chunk_name;\n\n      if (chunk_name != png_IDAT)\n         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;\n\n      if (chunk_name == png_IEND)\n         png_handle_IEND(png_ptr, info_ptr, length);\n\n      else if (chunk_name == png_IHDR)\n         png_handle_IHDR(png_ptr, info_ptr, length);\n\n      else if (info_ptr == NULL)\n         png_crc_finish(png_ptr, length);\n\n#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n      else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)\n      {\n         if (chunk_name == png_IDAT)\n         {\n            if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))\n                || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)\n               png_benign_error(png_ptr, \".Too many IDATs found\");\n         }\n         png_handle_unknown(png_ptr, info_ptr, length, keep);\n         if (chunk_name == png_PLTE)\n            png_ptr->mode |= PNG_HAVE_PLTE;\n      }\n#endif\n\n      else if (chunk_name == png_IDAT)\n      {\n         /* Zero length IDATs are legal after the last IDAT has been\n          * read, but not after other chunks have been read.  1.6 does not\n          * always read all the deflate data; specifically it cannot be relied\n          * upon to read the Adler32 at the end.  If it doesn't ignore IDAT\n          * chunks which are longer than zero as well:\n          */\n         if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))\n             || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)\n            png_benign_error(png_ptr, \"..Too many IDATs found\");\n\n         png_crc_finish(png_ptr, length);\n      }\n      else if (chunk_name == png_PLTE)\n         png_handle_PLTE(png_ptr, info_ptr, length);\n\n#ifdef PNG_READ_bKGD_SUPPORTED\n      else if (chunk_name == png_bKGD)\n         png_handle_bKGD(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_cHRM_SUPPORTED\n      else if (chunk_name == png_cHRM)\n         png_handle_cHRM(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_gAMA_SUPPORTED\n      else if (chunk_name == png_gAMA)\n         png_handle_gAMA(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_hIST_SUPPORTED\n      else if (chunk_name == png_hIST)\n         png_handle_hIST(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_oFFs_SUPPORTED\n      else if (chunk_name == png_oFFs)\n         png_handle_oFFs(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_pCAL_SUPPORTED\n      else if (chunk_name == png_pCAL)\n         png_handle_pCAL(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_sCAL_SUPPORTED\n      else if (chunk_name == png_sCAL)\n         png_handle_sCAL(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_pHYs_SUPPORTED\n      else if (chunk_name == png_pHYs)\n         png_handle_pHYs(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_sBIT_SUPPORTED\n      else if (chunk_name == png_sBIT)\n         png_handle_sBIT(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_sRGB_SUPPORTED\n      else if (chunk_name == png_sRGB)\n         png_handle_sRGB(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_iCCP_SUPPORTED\n      else if (chunk_name == png_iCCP)\n         png_handle_iCCP(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_sPLT_SUPPORTED\n      else if (chunk_name == png_sPLT)\n         png_handle_sPLT(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_tEXt_SUPPORTED\n      else if (chunk_name == png_tEXt)\n         png_handle_tEXt(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_tIME_SUPPORTED\n      else if (chunk_name == png_tIME)\n         png_handle_tIME(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_tRNS_SUPPORTED\n      else if (chunk_name == png_tRNS)\n         png_handle_tRNS(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_zTXt_SUPPORTED\n      else if (chunk_name == png_zTXt)\n         png_handle_zTXt(png_ptr, info_ptr, length);\n#endif\n\n#ifdef PNG_READ_iTXt_SUPPORTED\n      else if (chunk_name == png_iTXt)\n         png_handle_iTXt(png_ptr, info_ptr, length);\n#endif\n\n      else\n         png_handle_unknown(png_ptr, info_ptr, length,\n            PNG_HANDLE_CHUNK_AS_DEFAULT);\n   } while ((png_ptr->mode & PNG_HAVE_IEND) == 0);\n}\n#endif /* SEQUENTIAL_READ */\n\n/* Free all memory used in the read struct */\nstatic void\npng_read_destroy(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_read_destroy\");\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n   png_destroy_gamma_table(png_ptr);\n#endif\n\n   png_free(png_ptr, png_ptr->big_row_buf);\n   png_ptr->big_row_buf = NULL;\n   png_free(png_ptr, png_ptr->big_prev_row);\n   png_ptr->big_prev_row = NULL;\n   png_free(png_ptr, png_ptr->read_buffer);\n   png_ptr->read_buffer = NULL;\n\n#ifdef PNG_READ_QUANTIZE_SUPPORTED\n   png_free(png_ptr, png_ptr->palette_lookup);\n   png_ptr->palette_lookup = NULL;\n   png_free(png_ptr, png_ptr->quantize_index);\n   png_ptr->quantize_index = NULL;\n#endif\n\n   if ((png_ptr->free_me & PNG_FREE_PLTE) != 0)\n   {\n      png_zfree(png_ptr, png_ptr->palette);\n      png_ptr->palette = NULL;\n   }\n   png_ptr->free_me &= ~PNG_FREE_PLTE;\n\n#if defined(PNG_tRNS_SUPPORTED) || \\\n    defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)\n   if ((png_ptr->free_me & PNG_FREE_TRNS) != 0)\n   {\n      png_free(png_ptr, png_ptr->trans_alpha);\n      png_ptr->trans_alpha = NULL;\n   }\n   png_ptr->free_me &= ~PNG_FREE_TRNS;\n#endif\n\n   inflateEnd(&png_ptr->zstream);\n\n#ifdef PNG_PROGRESSIVE_READ_SUPPORTED\n   png_free(png_ptr, png_ptr->save_buffer);\n   png_ptr->save_buffer = NULL;\n#endif\n\n#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) && \\\n   defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)\n   png_free(png_ptr, png_ptr->unknown_chunk.data);\n   png_ptr->unknown_chunk.data = NULL;\n#endif\n\n#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n   png_free(png_ptr, png_ptr->chunk_list);\n   png_ptr->chunk_list = NULL;\n#endif\n\n   /* NOTE: the 'setjmp' buffer may still be allocated and the memory and error\n    * callbacks are still set at this point.  They are required to complete the\n    * destruction of the png_struct itself.\n    */\n}\n\n/* Free all memory used by the read */\nvoid PNGAPI\npng_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,\n    png_infopp end_info_ptr_ptr)\n{\n   png_structrp png_ptr = NULL;\n\n   png_debug(1, \"in png_destroy_read_struct\");\n\n   if (png_ptr_ptr != NULL)\n      png_ptr = *png_ptr_ptr;\n\n   if (png_ptr == NULL)\n      return;\n\n   /* libpng 1.6.0: use the API to destroy info structs to ensure consistent\n    * behavior.  Prior to 1.6.0 libpng did extra 'info' destruction in this API.\n    * The extra was, apparently, unnecessary yet this hides memory leak bugs.\n    */\n   png_destroy_info_struct(png_ptr, end_info_ptr_ptr);\n   png_destroy_info_struct(png_ptr, info_ptr_ptr);\n\n   *png_ptr_ptr = NULL;\n   png_read_destroy(png_ptr);\n   png_destroy_png_struct(png_ptr);\n}\n\nvoid PNGAPI\npng_set_read_status_fn(png_structrp png_ptr, png_read_status_ptr read_row_fn)\n{\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->read_row_fn = read_row_fn;\n}\n\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n#ifdef PNG_INFO_IMAGE_SUPPORTED\nvoid PNGAPI\npng_read_png(png_structrp png_ptr, png_inforp info_ptr,\n                           int transforms,\n                           voidp params)\n{\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   /* png_read_info() gives us all of the information from the\n    * PNG file before the first IDAT (image data chunk).\n    */\n   png_read_info(png_ptr, info_ptr);\n   if (info_ptr->height > PNG_UINT_32_MAX/(sizeof (png_bytep)))\n      png_error(png_ptr, \"Image is too high to process with png_read_png()\");\n\n   /* -------------- image transformations start here ------------------- */\n   /* libpng 1.6.10: add code to cause a png_app_error if a selected TRANSFORM\n    * is not implemented.  This will only happen in de-configured (non-default)\n    * libpng builds.  The results can be unexpected - png_read_png may return\n    * short or mal-formed rows because the transform is skipped.\n    */\n\n   /* Tell libpng to strip 16-bit/color files down to 8 bits per color.\n    */\n   if ((transforms & PNG_TRANSFORM_SCALE_16) != 0)\n      /* Added at libpng-1.5.4. \"strip_16\" produces the same result that it\n       * did in earlier versions, while \"scale_16\" is now more accurate.\n       */\n#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED\n      png_set_scale_16(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_SCALE_16 not supported\");\n#endif\n\n   /* If both SCALE and STRIP are required pngrtran will effectively cancel the\n    * latter by doing SCALE first.  This is ok and allows apps not to check for\n    * which is supported to get the right answer.\n    */\n   if ((transforms & PNG_TRANSFORM_STRIP_16) != 0)\n#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED\n      png_set_strip_16(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_STRIP_16 not supported\");\n#endif\n\n   /* Strip alpha bytes from the input data without combining with\n    * the background (not recommended).\n    */\n   if ((transforms & PNG_TRANSFORM_STRIP_ALPHA) != 0)\n#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED\n      png_set_strip_alpha(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_STRIP_ALPHA not supported\");\n#endif\n\n   /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single\n    * byte into separate bytes (useful for paletted and grayscale images).\n    */\n   if ((transforms & PNG_TRANSFORM_PACKING) != 0)\n#ifdef PNG_READ_PACK_SUPPORTED\n      png_set_packing(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_PACKING not supported\");\n#endif\n\n   /* Change the order of packed pixels to least significant bit first\n    * (not useful if you are using png_set_packing).\n    */\n   if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0)\n#ifdef PNG_READ_PACKSWAP_SUPPORTED\n      png_set_packswap(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_PACKSWAP not supported\");\n#endif\n\n   /* Expand paletted colors into true RGB triplets\n    * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel\n    * Expand paletted or RGB images with transparency to full alpha\n    * channels so the data will be available as RGBA quartets.\n    */\n   if ((transforms & PNG_TRANSFORM_EXPAND) != 0)\n#ifdef PNG_READ_EXPAND_SUPPORTED\n      png_set_expand(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_EXPAND not supported\");\n#endif\n\n   /* We don't handle background color or gamma transformation or quantizing.\n    */\n\n   /* Invert monochrome files to have 0 as white and 1 as black\n    */\n   if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0)\n#ifdef PNG_READ_INVERT_SUPPORTED\n      png_set_invert_mono(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_INVERT_MONO not supported\");\n#endif\n\n   /* If you want to shift the pixel values from the range [0,255] or\n    * [0,65535] to the original [0,7] or [0,31], or whatever range the\n    * colors were originally in:\n    */\n   if ((transforms & PNG_TRANSFORM_SHIFT) != 0)\n#ifdef PNG_READ_SHIFT_SUPPORTED\n      if ((info_ptr->valid & PNG_INFO_sBIT) != 0)\n         png_set_shift(png_ptr, &info_ptr->sig_bit);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_SHIFT not supported\");\n#endif\n\n   /* Flip the RGB pixels to BGR (or RGBA to BGRA) */\n   if ((transforms & PNG_TRANSFORM_BGR) != 0)\n#ifdef PNG_READ_BGR_SUPPORTED\n      png_set_bgr(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_BGR not supported\");\n#endif\n\n   /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */\n   if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0)\n#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED\n      png_set_swap_alpha(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_SWAP_ALPHA not supported\");\n#endif\n\n   /* Swap bytes of 16-bit files to least significant byte first */\n   if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0)\n#ifdef PNG_READ_SWAP_SUPPORTED\n      png_set_swap(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_SWAP_ENDIAN not supported\");\n#endif\n\n/* Added at libpng-1.2.41 */\n   /* Invert the alpha channel from opacity to transparency */\n   if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0)\n#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED\n      png_set_invert_alpha(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_INVERT_ALPHA not supported\");\n#endif\n\n/* Added at libpng-1.2.41 */\n   /* Expand grayscale image to RGB */\n   if ((transforms & PNG_TRANSFORM_GRAY_TO_RGB) != 0)\n#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED\n      png_set_gray_to_rgb(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_GRAY_TO_RGB not supported\");\n#endif\n\n/* Added at libpng-1.5.4 */\n   if ((transforms & PNG_TRANSFORM_EXPAND_16) != 0)\n#ifdef PNG_READ_EXPAND_16_SUPPORTED\n      png_set_expand_16(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_EXPAND_16 not supported\");\n#endif\n\n   /* We don't handle adding filler bytes */\n\n   /* We use png_read_image and rely on that for interlace handling, but we also\n    * call png_read_update_info therefore must turn on interlace handling now:\n    */\n   (void)png_set_interlace_handling(png_ptr);\n\n   /* Optional call to gamma correct and add the background to the palette\n    * and update info structure.  REQUIRED if you are expecting libpng to\n    * update the palette for you (i.e., you selected such a transform above).\n    */\n   png_read_update_info(png_ptr, info_ptr);\n\n   /* -------------- image transformations end here ------------------- */\n\n   png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);\n   if (info_ptr->row_pointers == NULL)\n   {\n      png_uint_32 iptr;\n\n      info_ptr->row_pointers = png_voidcast(png_bytepp, png_malloc(png_ptr,\n          info_ptr->height * (sizeof (png_bytep))));\n\n      for (iptr=0; iptr<info_ptr->height; iptr++)\n         info_ptr->row_pointers[iptr] = NULL;\n\n      info_ptr->free_me |= PNG_FREE_ROWS;\n\n      for (iptr = 0; iptr < info_ptr->height; iptr++)\n         info_ptr->row_pointers[iptr] = png_voidcast(png_bytep,\n             png_malloc(png_ptr, info_ptr->rowbytes));\n   }\n\n   png_read_image(png_ptr, info_ptr->row_pointers);\n   info_ptr->valid |= PNG_INFO_IDAT;\n\n   /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */\n   png_read_end(png_ptr, info_ptr);\n\n   PNG_UNUSED(params)\n}\n#endif /* INFO_IMAGE */\n#endif /* SEQUENTIAL_READ */\n\n#ifdef PNG_SIMPLIFIED_READ_SUPPORTED\n/* SIMPLIFIED READ\n *\n * This code currently relies on the sequential reader, though it could easily\n * be made to work with the progressive one.\n */\n/* Arguments to png_image_finish_read: */\n\n/* Encoding of PNG data (used by the color-map code) */\n#  define P_NOTSET  0 /* File encoding not yet known */\n#  define P_sRGB    1 /* 8-bit encoded to sRGB gamma */\n#  define P_LINEAR  2 /* 16-bit linear: not encoded, NOT pre-multiplied! */\n#  define P_FILE    3 /* 8-bit encoded to file gamma, not sRGB or linear */\n#  define P_LINEAR8 4 /* 8-bit linear: only from a file value */\n\n/* Color-map processing: after libpng has run on the PNG image further\n * processing may be needed to convert the data to color-map indices.\n */\n#define PNG_CMAP_NONE      0\n#define PNG_CMAP_GA        1 /* Process GA data to a color-map with alpha */\n#define PNG_CMAP_TRANS     2 /* Process GA data to a background index */\n#define PNG_CMAP_RGB       3 /* Process RGB data */\n#define PNG_CMAP_RGB_ALPHA 4 /* Process RGBA data */\n\n/* The following document where the background is for each processing case. */\n#define PNG_CMAP_NONE_BACKGROUND      256\n#define PNG_CMAP_GA_BACKGROUND        231\n#define PNG_CMAP_TRANS_BACKGROUND     254\n#define PNG_CMAP_RGB_BACKGROUND       256\n#define PNG_CMAP_RGB_ALPHA_BACKGROUND 216\n\ntypedef struct\n{\n   /* Arguments: */\n   png_imagep image;\n   png_voidp  buffer;\n   png_int_32 row_stride;\n   png_voidp  colormap;\n   png_const_colorp background;\n   /* Local variables: */\n   png_voidp       local_row;\n   png_voidp       first_row;\n   ptrdiff_t       row_bytes;           /* step between rows */\n   int             file_encoding;       /* E_ values above */\n   png_fixed_point gamma_to_linear;     /* For P_FILE, reciprocal of gamma */\n   int             colormap_processing; /* PNG_CMAP_ values above */\n} png_image_read_control;\n\n/* Do all the *safe* initialization - 'safe' means that png_error won't be\n * called, so setting up the jmp_buf is not required.  This means that anything\n * called from here must *not* call png_malloc - it has to call png_malloc_warn\n * instead so that control is returned safely back to this routine.\n */\nstatic int\npng_image_read_init(png_imagep image)\n{\n   if (image->opaque == NULL)\n   {\n      png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, image,\n          png_safe_error, png_safe_warning);\n\n      /* And set the rest of the structure to NULL to ensure that the various\n       * fields are consistent.\n       */\n      memset(image, 0, (sizeof *image));\n      image->version = PNG_IMAGE_VERSION;\n\n      if (png_ptr != NULL)\n      {\n         png_infop info_ptr = png_create_info_struct(png_ptr);\n\n         if (info_ptr != NULL)\n         {\n            png_controlp control = png_voidcast(png_controlp,\n               png_malloc_warn(png_ptr, (sizeof *control)));\n\n            if (control != NULL)\n            {\n               memset(control, 0, (sizeof *control));\n\n               control->png_ptr = png_ptr;\n               control->info_ptr = info_ptr;\n               control->for_write = 0;\n\n               image->opaque = control;\n               return 1;\n            }\n\n            /* Error clean up */\n            png_destroy_info_struct(png_ptr, &info_ptr);\n         }\n\n         png_destroy_read_struct(&png_ptr, NULL, NULL);\n      }\n\n      return png_image_error(image, \"png_image_read: out of memory\");\n   }\n\n   return png_image_error(image, \"png_image_read: opaque pointer not NULL\");\n}\n\n/* Utility to find the base format of a PNG file from a png_struct. */\nstatic png_uint_32\npng_image_format(png_structrp png_ptr)\n{\n   png_uint_32 format = 0;\n\n   if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)\n      format |= PNG_FORMAT_FLAG_COLOR;\n\n   if ((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)\n      format |= PNG_FORMAT_FLAG_ALPHA;\n\n   /* Use png_ptr here, not info_ptr, because by examination png_handle_tRNS\n    * sets the png_struct fields; that's all we are interested in here.  The\n    * precise interaction with an app call to png_set_tRNS and PNG file reading\n    * is unclear.\n    */\n   else if (png_ptr->num_trans > 0)\n      format |= PNG_FORMAT_FLAG_ALPHA;\n\n   if (png_ptr->bit_depth == 16)\n      format |= PNG_FORMAT_FLAG_LINEAR;\n\n   if ((png_ptr->color_type & PNG_COLOR_MASK_PALETTE) != 0)\n      format |= PNG_FORMAT_FLAG_COLORMAP;\n\n   return format;\n}\n\n/* Is the given gamma significantly different from sRGB?  The test is the same\n * one used in pngrtran.c when deciding whether to do gamma correction.  The\n * arithmetic optimizes the division by using the fact that the inverse of the\n * file sRGB gamma is 2.2\n */\nstatic int\npng_gamma_not_sRGB(png_fixed_point g)\n{\n   if (g < PNG_FP_1)\n   {\n      /* An uninitialized gamma is assumed to be sRGB for the simplified API. */\n      if (g == 0)\n         return 0;\n\n      return png_gamma_significant((g * 11 + 2)/5 /* i.e. *2.2, rounded */);\n   }\n\n   return 1;\n}\n\n/* Do the main body of a 'png_image_begin_read' function; read the PNG file\n * header and fill in all the information.  This is executed in a safe context,\n * unlike the init routine above.\n */\nstatic int\npng_image_read_header(png_voidp argument)\n{\n   png_imagep image = png_voidcast(png_imagep, argument);\n   png_structrp png_ptr = image->opaque->png_ptr;\n   png_inforp info_ptr = image->opaque->info_ptr;\n\n   png_set_benign_errors(png_ptr, 1/*warn*/);\n   png_read_info(png_ptr, info_ptr);\n\n   /* Do this the fast way; just read directly out of png_struct. */\n   image->width = png_ptr->width;\n   image->height = png_ptr->height;\n\n   {\n      png_uint_32 format = png_image_format(png_ptr);\n\n      image->format = format;\n\n#ifdef PNG_COLORSPACE_SUPPORTED\n      /* Does the colorspace match sRGB?  If there is no color endpoint\n       * (colorant) information assume yes, otherwise require the\n       * 'ENDPOINTS_MATCHP_sRGB' colorspace flag to have been set.  If the\n       * colorspace has been determined to be invalid ignore it.\n       */\n      if ((format & PNG_FORMAT_FLAG_COLOR) != 0 && ((png_ptr->colorspace.flags\n         & (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB|\n            PNG_COLORSPACE_INVALID)) == PNG_COLORSPACE_HAVE_ENDPOINTS))\n         image->flags |= PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB;\n#endif\n   }\n\n   /* We need the maximum number of entries regardless of the format the\n    * application sets here.\n    */\n   {\n      png_uint_32 cmap_entries;\n\n      switch (png_ptr->color_type)\n      {\n         case PNG_COLOR_TYPE_GRAY:\n            cmap_entries = 1U << png_ptr->bit_depth;\n            break;\n\n         case PNG_COLOR_TYPE_PALETTE:\n            cmap_entries = png_ptr->num_palette;\n            break;\n\n         default:\n            cmap_entries = 256;\n            break;\n      }\n\n      if (cmap_entries > 256)\n         cmap_entries = 256;\n\n      image->colormap_entries = cmap_entries;\n   }\n\n   return 1;\n}\n\n#ifdef PNG_STDIO_SUPPORTED\nint PNGAPI\npng_image_begin_read_from_stdio(png_imagep image, FILE* file)\n{\n   if (image != NULL && image->version == PNG_IMAGE_VERSION)\n   {\n      if (file != NULL)\n      {\n         if (png_image_read_init(image) != 0)\n         {\n            /* This is slightly evil, but png_init_io doesn't do anything other\n             * than this and we haven't changed the standard IO functions so\n             * this saves a 'safe' function.\n             */\n            image->opaque->png_ptr->io_ptr = file;\n            return png_safe_execute(image, png_image_read_header, image);\n         }\n      }\n\n      else\n         return png_image_error(image,\n            \"png_image_begin_read_from_stdio: invalid argument\");\n   }\n\n   else if (image != NULL)\n      return png_image_error(image,\n         \"png_image_begin_read_from_stdio: incorrect PNG_IMAGE_VERSION\");\n\n   return 0;\n}\n\nint PNGAPI\npng_image_begin_read_from_file(png_imagep image, const char *file_name)\n{\n   if (image != NULL && image->version == PNG_IMAGE_VERSION)\n   {\n      if (file_name != NULL)\n      {\n         FILE *fp = fopen(file_name, \"rb\");\n\n         if (fp != NULL)\n         {\n            if (png_image_read_init(image) != 0)\n            {\n               image->opaque->png_ptr->io_ptr = fp;\n               image->opaque->owned_file = 1;\n               return png_safe_execute(image, png_image_read_header, image);\n            }\n\n            /* Clean up: just the opened file. */\n            (void)fclose(fp);\n         }\n\n         else\n            return png_image_error(image, strerror(errno));\n      }\n\n      else\n         return png_image_error(image,\n            \"png_image_begin_read_from_file: invalid argument\");\n   }\n\n   else if (image != NULL)\n      return png_image_error(image,\n         \"png_image_begin_read_from_file: incorrect PNG_IMAGE_VERSION\");\n\n   return 0;\n}\n#endif /* STDIO */\n\nstatic void PNGCBAPI\npng_image_memory_read(png_structp png_ptr, png_bytep out, png_size_t need)\n{\n   if (png_ptr != NULL)\n   {\n      png_imagep image = png_voidcast(png_imagep, png_ptr->io_ptr);\n      if (image != NULL)\n      {\n         png_controlp cp = image->opaque;\n         if (cp != NULL)\n         {\n            png_const_bytep memory = cp->memory;\n            png_size_t size = cp->size;\n\n            if (memory != NULL && size >= need)\n            {\n               memcpy(out, memory, need);\n               cp->memory = memory + need;\n               cp->size = size - need;\n               return;\n            }\n\n            png_error(png_ptr, \"read beyond end of data\");\n         }\n      }\n\n      png_error(png_ptr, \"invalid memory read\");\n   }\n}\n\nint PNGAPI png_image_begin_read_from_memory(png_imagep image,\n   png_const_voidp memory, png_size_t size)\n{\n   if (image != NULL && image->version == PNG_IMAGE_VERSION)\n   {\n      if (memory != NULL && size > 0)\n      {\n         if (png_image_read_init(image) != 0)\n         {\n            /* Now set the IO functions to read from the memory buffer and\n             * store it into io_ptr.  Again do this in-place to avoid calling a\n             * libpng function that requires error handling.\n             */\n            image->opaque->memory = png_voidcast(png_const_bytep, memory);\n            image->opaque->size = size;\n            image->opaque->png_ptr->io_ptr = image;\n            image->opaque->png_ptr->read_data_fn = png_image_memory_read;\n\n            return png_safe_execute(image, png_image_read_header, image);\n         }\n      }\n\n      else\n         return png_image_error(image,\n            \"png_image_begin_read_from_memory: invalid argument\");\n   }\n\n   else if (image != NULL)\n      return png_image_error(image,\n         \"png_image_begin_read_from_memory: incorrect PNG_IMAGE_VERSION\");\n\n   return 0;\n}\n\n/* Utility function to skip chunks that are not used by the simplified image\n * read functions and an appropriate macro to call it.\n */\n#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\nstatic void\npng_image_skip_unused_chunks(png_structrp png_ptr)\n{\n   /* Prepare the reader to ignore all recognized chunks whose data will not\n    * be used, i.e., all chunks recognized by libpng except for those\n    * involved in basic image reading:\n    *\n    *    IHDR, PLTE, IDAT, IEND\n    *\n    * Or image data handling:\n    *\n    *    tRNS, bKGD, gAMA, cHRM, sRGB, [iCCP] and sBIT.\n    *\n    * This provides a small performance improvement and eliminates any\n    * potential vulnerability to security problems in the unused chunks.\n    *\n    * At present the iCCP chunk data isn't used, so iCCP chunk can be ignored\n    * too.  This allows the simplified API to be compiled without iCCP support,\n    * however if the support is there the chunk is still checked to detect\n    * errors (which are unfortunately quite common.)\n    */\n   {\n         static PNG_CONST png_byte chunks_to_process[] = {\n            98,  75,  71,  68, '\\0',  /* bKGD */\n            99,  72,  82,  77, '\\0',  /* cHRM */\n           103,  65,  77,  65, '\\0',  /* gAMA */\n#        ifdef PNG_READ_iCCP_SUPPORTED\n           105,  67,  67,  80, '\\0',  /* iCCP */\n#        endif\n           115,  66,  73,  84, '\\0',  /* sBIT */\n           115,  82,  71,  66, '\\0',  /* sRGB */\n           };\n\n       /* Ignore unknown chunks and all other chunks except for the\n        * IHDR, PLTE, tRNS, IDAT, and IEND chunks.\n        */\n       png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_NEVER,\n         NULL, -1);\n\n       /* But do not ignore image data handling chunks */\n       png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_AS_DEFAULT,\n         chunks_to_process, (int)/*SAFE*/(sizeof chunks_to_process)/5);\n    }\n}\n\n#  define PNG_SKIP_CHUNKS(p) png_image_skip_unused_chunks(p)\n#else\n#  define PNG_SKIP_CHUNKS(p) ((void)0)\n#endif /* HANDLE_AS_UNKNOWN */\n\n/* The following macro gives the exact rounded answer for all values in the\n * range 0..255 (it actually divides by 51.2, but the rounding still generates\n * the correct numbers 0..5\n */\n#define PNG_DIV51(v8) (((v8) * 5 + 130) >> 8)\n\n/* Utility functions to make particular color-maps */\nstatic void\nset_file_encoding(png_image_read_control *display)\n{\n   png_fixed_point g = display->image->opaque->png_ptr->colorspace.gamma;\n   if (png_gamma_significant(g) != 0)\n   {\n      if (png_gamma_not_sRGB(g) != 0)\n      {\n         display->file_encoding = P_FILE;\n         display->gamma_to_linear = png_reciprocal(g);\n      }\n\n      else\n         display->file_encoding = P_sRGB;\n   }\n\n   else\n      display->file_encoding = P_LINEAR8;\n}\n\nstatic unsigned int\ndecode_gamma(png_image_read_control *display, png_uint_32 value, int encoding)\n{\n   if (encoding == P_FILE) /* double check */\n      encoding = display->file_encoding;\n\n   if (encoding == P_NOTSET) /* must be the file encoding */\n   {\n      set_file_encoding(display);\n      encoding = display->file_encoding;\n   }\n\n   switch (encoding)\n   {\n      case P_FILE:\n         value = png_gamma_16bit_correct(value*257, display->gamma_to_linear);\n         break;\n\n      case P_sRGB:\n         value = png_sRGB_table[value];\n         break;\n\n      case P_LINEAR:\n         break;\n\n      case P_LINEAR8:\n         value *= 257;\n         break;\n\n#ifdef __GNUC__\n      default:\n         png_error(display->image->opaque->png_ptr,\n            \"unexpected encoding (internal error)\");\n#endif\n   }\n\n   return value;\n}\n\nstatic png_uint_32\npng_colormap_compose(png_image_read_control *display,\n   png_uint_32 foreground, int foreground_encoding, png_uint_32 alpha,\n   png_uint_32 background, int encoding)\n{\n   /* The file value is composed on the background, the background has the given\n    * encoding and so does the result, the file is encoded with P_FILE and the\n    * file and alpha are 8-bit values.  The (output) encoding will always be\n    * P_LINEAR or P_sRGB.\n    */\n   png_uint_32 f = decode_gamma(display, foreground, foreground_encoding);\n   png_uint_32 b = decode_gamma(display, background, encoding);\n\n   /* The alpha is always an 8-bit value (it comes from the palette), the value\n    * scaled by 255 is what PNG_sRGB_FROM_LINEAR requires.\n    */\n   f = f * alpha + b * (255-alpha);\n\n   if (encoding == P_LINEAR)\n   {\n      /* Scale to 65535; divide by 255, approximately (in fact this is extremely\n       * accurate, it divides by 255.00000005937181414556, with no overflow.)\n       */\n      f *= 257; /* Now scaled by 65535 */\n      f += f >> 16;\n      f = (f+32768) >> 16;\n   }\n\n   else /* P_sRGB */\n      f = PNG_sRGB_FROM_LINEAR(f);\n\n   return f;\n}\n\n/* NOTE: P_LINEAR values to this routine must be 16-bit, but P_FILE values must\n * be 8-bit.\n */\nstatic void\npng_create_colormap_entry(png_image_read_control *display,\n   png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue,\n   png_uint_32 alpha, int encoding)\n{\n   png_imagep image = display->image;\n   const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) != 0 ?\n      P_LINEAR : P_sRGB;\n   const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 &&\n      (red != green || green != blue);\n\n   if (ip > 255)\n      png_error(image->opaque->png_ptr, \"color-map index out of range\");\n\n   /* Update the cache with whether the file gamma is significantly different\n    * from sRGB.\n    */\n   if (encoding == P_FILE)\n   {\n      if (display->file_encoding == P_NOTSET)\n         set_file_encoding(display);\n\n      /* Note that the cached value may be P_FILE too, but if it is then the\n       * gamma_to_linear member has been set.\n       */\n      encoding = display->file_encoding;\n   }\n\n   if (encoding == P_FILE)\n   {\n      png_fixed_point g = display->gamma_to_linear;\n\n      red = png_gamma_16bit_correct(red*257, g);\n      green = png_gamma_16bit_correct(green*257, g);\n      blue = png_gamma_16bit_correct(blue*257, g);\n\n      if (convert_to_Y != 0 || output_encoding == P_LINEAR)\n      {\n         alpha *= 257;\n         encoding = P_LINEAR;\n      }\n\n      else\n      {\n         red = PNG_sRGB_FROM_LINEAR(red * 255);\n         green = PNG_sRGB_FROM_LINEAR(green * 255);\n         blue = PNG_sRGB_FROM_LINEAR(blue * 255);\n         encoding = P_sRGB;\n      }\n   }\n\n   else if (encoding == P_LINEAR8)\n   {\n      /* This encoding occurs quite frequently in test cases because PngSuite\n       * includes a gAMA 1.0 chunk with most images.\n       */\n      red *= 257;\n      green *= 257;\n      blue *= 257;\n      alpha *= 257;\n      encoding = P_LINEAR;\n   }\n\n   else if (encoding == P_sRGB &&\n       (convert_to_Y  != 0 || output_encoding == P_LINEAR))\n   {\n      /* The values are 8-bit sRGB values, but must be converted to 16-bit\n       * linear.\n       */\n      red = png_sRGB_table[red];\n      green = png_sRGB_table[green];\n      blue = png_sRGB_table[blue];\n      alpha *= 257;\n      encoding = P_LINEAR;\n   }\n\n   /* This is set if the color isn't gray but the output is. */\n   if (encoding == P_LINEAR)\n   {\n      if (convert_to_Y != 0)\n      {\n         /* NOTE: these values are copied from png_do_rgb_to_gray */\n         png_uint_32 y = (png_uint_32)6968 * red  + (png_uint_32)23434 * green +\n            (png_uint_32)2366 * blue;\n\n         if (output_encoding == P_LINEAR)\n            y = (y + 16384) >> 15;\n\n         else\n         {\n            /* y is scaled by 32768, we need it scaled by 255: */\n            y = (y + 128) >> 8;\n            y *= 255;\n            y = PNG_sRGB_FROM_LINEAR((y + 64) >> 7);\n            alpha = PNG_DIV257(alpha);\n            encoding = P_sRGB;\n         }\n\n         blue = red = green = y;\n      }\n\n      else if (output_encoding == P_sRGB)\n      {\n         red = PNG_sRGB_FROM_LINEAR(red * 255);\n         green = PNG_sRGB_FROM_LINEAR(green * 255);\n         blue = PNG_sRGB_FROM_LINEAR(blue * 255);\n         alpha = PNG_DIV257(alpha);\n         encoding = P_sRGB;\n      }\n   }\n\n   if (encoding != output_encoding)\n      png_error(image->opaque->png_ptr, \"bad encoding (internal error)\");\n\n   /* Store the value. */\n   {\n#     ifdef PNG_FORMAT_AFIRST_SUPPORTED\n         const int afirst = (image->format & PNG_FORMAT_FLAG_AFIRST) != 0 &&\n            (image->format & PNG_FORMAT_FLAG_ALPHA) != 0;\n#     else\n#        define afirst 0\n#     endif\n#     ifdef PNG_FORMAT_BGR_SUPPORTED\n         const int bgr = (image->format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;\n#     else\n#        define bgr 0\n#     endif\n\n      if (output_encoding == P_LINEAR)\n      {\n         png_uint_16p entry = png_voidcast(png_uint_16p, display->colormap);\n\n         entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format);\n\n         /* The linear 16-bit values must be pre-multiplied by the alpha channel\n          * value, if less than 65535 (this is, effectively, composite on black\n          * if the alpha channel is removed.)\n          */\n         switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format))\n         {\n            case 4:\n               entry[afirst ? 0 : 3] = (png_uint_16)alpha;\n               /* FALL THROUGH */\n\n            case 3:\n               if (alpha < 65535)\n               {\n                  if (alpha > 0)\n                  {\n                     blue = (blue * alpha + 32767U)/65535U;\n                     green = (green * alpha + 32767U)/65535U;\n                     red = (red * alpha + 32767U)/65535U;\n                  }\n\n                  else\n                     red = green = blue = 0;\n               }\n               entry[afirst + (2 ^ bgr)] = (png_uint_16)blue;\n               entry[afirst + 1] = (png_uint_16)green;\n               entry[afirst + bgr] = (png_uint_16)red;\n               break;\n\n            case 2:\n               entry[1 ^ afirst] = (png_uint_16)alpha;\n               /* FALL THROUGH */\n\n            case 1:\n               if (alpha < 65535)\n               {\n                  if (alpha > 0)\n                     green = (green * alpha + 32767U)/65535U;\n\n                  else\n                     green = 0;\n               }\n               entry[afirst] = (png_uint_16)green;\n               break;\n\n            default:\n               break;\n         }\n      }\n\n      else /* output encoding is P_sRGB */\n      {\n         png_bytep entry = png_voidcast(png_bytep, display->colormap);\n\n         entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format);\n\n         switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format))\n         {\n            case 4:\n               entry[afirst ? 0 : 3] = (png_byte)alpha;\n            case 3:\n               entry[afirst + (2 ^ bgr)] = (png_byte)blue;\n               entry[afirst + 1] = (png_byte)green;\n               entry[afirst + bgr] = (png_byte)red;\n               break;\n\n            case 2:\n               entry[1 ^ afirst] = (png_byte)alpha;\n            case 1:\n               entry[afirst] = (png_byte)green;\n               break;\n\n            default:\n               break;\n         }\n      }\n\n#     ifdef afirst\n#        undef afirst\n#     endif\n#     ifdef bgr\n#        undef bgr\n#     endif\n   }\n}\n\nstatic int\nmake_gray_file_colormap(png_image_read_control *display)\n{\n   unsigned int i;\n\n   for (i=0; i<256; ++i)\n      png_create_colormap_entry(display, i, i, i, i, 255, P_FILE);\n\n   return i;\n}\n\nstatic int\nmake_gray_colormap(png_image_read_control *display)\n{\n   unsigned int i;\n\n   for (i=0; i<256; ++i)\n      png_create_colormap_entry(display, i, i, i, i, 255, P_sRGB);\n\n   return i;\n}\n#define PNG_GRAY_COLORMAP_ENTRIES 256\n\nstatic int\nmake_ga_colormap(png_image_read_control *display)\n{\n   unsigned int i, a;\n\n   /* Alpha is retained, the output will be a color-map with entries\n    * selected by six levels of alpha.  One transparent entry, 6 gray\n    * levels for all the intermediate alpha values, leaving 230 entries\n    * for the opaque grays.  The color-map entries are the six values\n    * [0..5]*51, the GA processing uses PNG_DIV51(value) to find the\n    * relevant entry.\n    *\n    * if (alpha > 229) // opaque\n    * {\n    *    // The 231 entries are selected to make the math below work:\n    *    base = 0;\n    *    entry = (231 * gray + 128) >> 8;\n    * }\n    * else if (alpha < 26) // transparent\n    * {\n    *    base = 231;\n    *    entry = 0;\n    * }\n    * else // partially opaque\n    * {\n    *    base = 226 + 6 * PNG_DIV51(alpha);\n    *    entry = PNG_DIV51(gray);\n    * }\n    */\n   i = 0;\n   while (i < 231)\n   {\n      unsigned int gray = (i * 256 + 115) / 231;\n      png_create_colormap_entry(display, i++, gray, gray, gray, 255, P_sRGB);\n   }\n\n   /* 255 is used here for the component values for consistency with the code\n    * that undoes premultiplication in pngwrite.c.\n    */\n   png_create_colormap_entry(display, i++, 255, 255, 255, 0, P_sRGB);\n\n   for (a=1; a<5; ++a)\n   {\n      unsigned int g;\n\n      for (g=0; g<6; ++g)\n         png_create_colormap_entry(display, i++, g*51, g*51, g*51, a*51,\n            P_sRGB);\n   }\n\n   return i;\n}\n\n#define PNG_GA_COLORMAP_ENTRIES 256\n\nstatic int\nmake_rgb_colormap(png_image_read_control *display)\n{\n   unsigned int i, r;\n\n   /* Build a 6x6x6 opaque RGB cube */\n   for (i=r=0; r<6; ++r)\n   {\n      unsigned int g;\n\n      for (g=0; g<6; ++g)\n      {\n         unsigned int b;\n\n         for (b=0; b<6; ++b)\n            png_create_colormap_entry(display, i++, r*51, g*51, b*51, 255,\n               P_sRGB);\n      }\n   }\n\n   return i;\n}\n\n#define PNG_RGB_COLORMAP_ENTRIES 216\n\n/* Return a palette index to the above palette given three 8-bit sRGB values. */\n#define PNG_RGB_INDEX(r,g,b) \\\n   ((png_byte)(6 * (6 * PNG_DIV51(r) + PNG_DIV51(g)) + PNG_DIV51(b)))\n\nstatic int\npng_image_read_colormap(png_voidp argument)\n{\n   png_image_read_control *display =\n      png_voidcast(png_image_read_control*, argument);\n   const png_imagep image = display->image;\n\n   const png_structrp png_ptr = image->opaque->png_ptr;\n   const png_uint_32 output_format = image->format;\n   const int output_encoding = (output_format & PNG_FORMAT_FLAG_LINEAR) != 0 ?\n      P_LINEAR : P_sRGB;\n\n   unsigned int cmap_entries;\n   unsigned int output_processing;        /* Output processing option */\n   unsigned int data_encoding = P_NOTSET; /* Encoding libpng must produce */\n\n   /* Background information; the background color and the index of this color\n    * in the color-map if it exists (else 256).\n    */\n   unsigned int background_index = 256;\n   png_uint_32 back_r, back_g, back_b;\n\n   /* Flags to accumulate things that need to be done to the input. */\n   int expand_tRNS = 0;\n\n   /* Exclude the NYI feature of compositing onto a color-mapped buffer; it is\n    * very difficult to do, the results look awful, and it is difficult to see\n    * what possible use it is because the application can't control the\n    * color-map.\n    */\n   if (((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0 ||\n         png_ptr->num_trans > 0) /* alpha in input */ &&\n      ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0) /* no alpha in output */)\n   {\n      if (output_encoding == P_LINEAR) /* compose on black */\n         back_b = back_g = back_r = 0;\n\n      else if (display->background == NULL /* no way to remove it */)\n         png_error(png_ptr,\n            \"a background color must be supplied to remove alpha/transparency\");\n\n      /* Get a copy of the background color (this avoids repeating the checks\n       * below.)  The encoding is 8-bit sRGB or 16-bit linear, depending on the\n       * output format.\n       */\n      else\n      {\n         back_g = display->background->green;\n         if ((output_format & PNG_FORMAT_FLAG_COLOR) != 0)\n         {\n            back_r = display->background->red;\n            back_b = display->background->blue;\n         }\n         else\n            back_b = back_r = back_g;\n      }\n   }\n\n   else if (output_encoding == P_LINEAR)\n      back_b = back_r = back_g = 65535;\n\n   else\n      back_b = back_r = back_g = 255;\n\n   /* Default the input file gamma if required - this is necessary because\n    * libpng assumes that if no gamma information is present the data is in the\n    * output format, but the simplified API deduces the gamma from the input\n    * format.\n    */\n   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) == 0)\n   {\n      /* Do this directly, not using the png_colorspace functions, to ensure\n       * that it happens even if the colorspace is invalid (though probably if\n       * it is the setting will be ignored)  Note that the same thing can be\n       * achieved at the application interface with png_set_gAMA.\n       */\n      if (png_ptr->bit_depth == 16 &&\n         (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0)\n         png_ptr->colorspace.gamma = PNG_GAMMA_LINEAR;\n\n      else\n         png_ptr->colorspace.gamma = PNG_GAMMA_sRGB_INVERSE;\n\n      png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;\n   }\n\n   /* Decide what to do based on the PNG color type of the input data.  The\n    * utility function png_create_colormap_entry deals with most aspects of the\n    * output transformations; this code works out how to produce bytes of\n    * color-map entries from the original format.\n    */\n   switch (png_ptr->color_type)\n   {\n      case PNG_COLOR_TYPE_GRAY:\n         if (png_ptr->bit_depth <= 8)\n         {\n            /* There at most 256 colors in the output, regardless of\n             * transparency.\n             */\n            unsigned int step, i, val, trans = 256/*ignore*/, back_alpha = 0;\n\n            cmap_entries = 1U << png_ptr->bit_depth;\n            if (cmap_entries > image->colormap_entries)\n               png_error(png_ptr, \"gray[8] color-map: too few entries\");\n\n            step = 255 / (cmap_entries - 1);\n            output_processing = PNG_CMAP_NONE;\n\n            /* If there is a tRNS chunk then this either selects a transparent\n             * value or, if the output has no alpha, the background color.\n             */\n            if (png_ptr->num_trans > 0)\n            {\n               trans = png_ptr->trans_color.gray;\n\n               if ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0)\n                  back_alpha = output_encoding == P_LINEAR ? 65535 : 255;\n            }\n\n            /* png_create_colormap_entry just takes an RGBA and writes the\n             * corresponding color-map entry using the format from 'image',\n             * including the required conversion to sRGB or linear as\n             * appropriate.  The input values are always either sRGB (if the\n             * gamma correction flag is 0) or 0..255 scaled file encoded values\n             * (if the function must gamma correct them).\n             */\n            for (i=val=0; i<cmap_entries; ++i, val += step)\n            {\n               /* 'i' is a file value.  While this will result in duplicated\n                * entries for 8-bit non-sRGB encoded files it is necessary to\n                * have non-gamma corrected values to do tRNS handling.\n                */\n               if (i != trans)\n                  png_create_colormap_entry(display, i, val, val, val, 255,\n                     P_FILE/*8-bit with file gamma*/);\n\n               /* Else this entry is transparent.  The colors don't matter if\n                * there is an alpha channel (back_alpha == 0), but it does no\n                * harm to pass them in; the values are not set above so this\n                * passes in white.\n                *\n                * NOTE: this preserves the full precision of the application\n                * supplied background color when it is used.\n                */\n               else\n                  png_create_colormap_entry(display, i, back_r, back_g, back_b,\n                     back_alpha, output_encoding);\n            }\n\n            /* We need libpng to preserve the original encoding. */\n            data_encoding = P_FILE;\n\n            /* The rows from libpng, while technically gray values, are now also\n             * color-map indices; however, they may need to be expanded to 1\n             * byte per pixel.  This is what png_set_packing does (i.e., it\n             * unpacks the bit values into bytes.)\n             */\n            if (png_ptr->bit_depth < 8)\n               png_set_packing(png_ptr);\n         }\n\n         else /* bit depth is 16 */\n         {\n            /* The 16-bit input values can be converted directly to 8-bit gamma\n             * encoded values; however, if a tRNS chunk is present 257 color-map\n             * entries are required.  This means that the extra entry requires\n             * special processing; add an alpha channel, sacrifice gray level\n             * 254 and convert transparent (alpha==0) entries to that.\n             *\n             * Use libpng to chop the data to 8 bits.  Convert it to sRGB at the\n             * same time to minimize quality loss.  If a tRNS chunk is present\n             * this means libpng must handle it too; otherwise it is impossible\n             * to do the exact match on the 16-bit value.\n             *\n             * If the output has no alpha channel *and* the background color is\n             * gray then it is possible to let libpng handle the substitution by\n             * ensuring that the corresponding gray level matches the background\n             * color exactly.\n             */\n            data_encoding = P_sRGB;\n\n            if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)\n               png_error(png_ptr, \"gray[16] color-map: too few entries\");\n\n            cmap_entries = make_gray_colormap(display);\n\n            if (png_ptr->num_trans > 0)\n            {\n               unsigned int back_alpha;\n\n               if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)\n                  back_alpha = 0;\n\n               else\n               {\n                  if (back_r == back_g && back_g == back_b)\n                  {\n                     /* Background is gray; no special processing will be\n                      * required.\n                      */\n                     png_color_16 c;\n                     png_uint_32 gray = back_g;\n\n                     if (output_encoding == P_LINEAR)\n                     {\n                        gray = PNG_sRGB_FROM_LINEAR(gray * 255);\n\n                        /* And make sure the corresponding palette entry\n                         * matches.\n                         */\n                        png_create_colormap_entry(display, gray, back_g, back_g,\n                           back_g, 65535, P_LINEAR);\n                     }\n\n                     /* The background passed to libpng, however, must be the\n                      * sRGB value.\n                      */\n                     c.index = 0; /*unused*/\n                     c.gray = c.red = c.green = c.blue = (png_uint_16)gray;\n\n                     /* NOTE: does this work without expanding tRNS to alpha?\n                      * It should be the color->gray case below apparently\n                      * doesn't.\n                      */\n                     png_set_background_fixed(png_ptr, &c,\n                        PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,\n                        0/*gamma: not used*/);\n\n                     output_processing = PNG_CMAP_NONE;\n                     break;\n                  }\n#ifdef __COVERITY__\n                 /* Coverity claims that output_encoding cannot be 2 (P_LINEAR)\n                  * here.\n                  */\n                  back_alpha = 255;\n#else\n                  back_alpha = output_encoding == P_LINEAR ? 65535 : 255;\n#endif\n               }\n\n               /* output_processing means that the libpng-processed row will be\n                * 8-bit GA and it has to be processing to single byte color-map\n                * values.  Entry 254 is replaced by either a completely\n                * transparent entry or by the background color at full\n                * precision (and the background color is not a simple gray\n                * level in this case.)\n                */\n               expand_tRNS = 1;\n               output_processing = PNG_CMAP_TRANS;\n               background_index = 254;\n\n               /* And set (overwrite) color-map entry 254 to the actual\n                * background color at full precision.\n                */\n               png_create_colormap_entry(display, 254, back_r, back_g, back_b,\n                  back_alpha, output_encoding);\n            }\n\n            else\n               output_processing = PNG_CMAP_NONE;\n         }\n         break;\n\n      case PNG_COLOR_TYPE_GRAY_ALPHA:\n         /* 8-bit or 16-bit PNG with two channels - gray and alpha.  A minimum\n          * of 65536 combinations.  If, however, the alpha channel is to be\n          * removed there are only 256 possibilities if the background is gray.\n          * (Otherwise there is a subset of the 65536 possibilities defined by\n          * the triangle between black, white and the background color.)\n          *\n          * Reduce 16-bit files to 8-bit and sRGB encode the result.  No need to\n          * worry about tRNS matching - tRNS is ignored if there is an alpha\n          * channel.\n          */\n         data_encoding = P_sRGB;\n\n         if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)\n         {\n            if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)\n               png_error(png_ptr, \"gray+alpha color-map: too few entries\");\n\n            cmap_entries = make_ga_colormap(display);\n\n            background_index = PNG_CMAP_GA_BACKGROUND;\n            output_processing = PNG_CMAP_GA;\n         }\n\n         else /* alpha is removed */\n         {\n            /* Alpha must be removed as the PNG data is processed when the\n             * background is a color because the G and A channels are\n             * independent and the vector addition (non-parallel vectors) is a\n             * 2-D problem.\n             *\n             * This can be reduced to the same algorithm as above by making a\n             * colormap containing gray levels (for the opaque grays), a\n             * background entry (for a transparent pixel) and a set of four six\n             * level color values, one set for each intermediate alpha value.\n             * See the comments in make_ga_colormap for how this works in the\n             * per-pixel processing.\n             *\n             * If the background is gray, however, we only need a 256 entry gray\n             * level color map.  It is sufficient to make the entry generated\n             * for the background color be exactly the color specified.\n             */\n            if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0 ||\n               (back_r == back_g && back_g == back_b))\n            {\n               /* Background is gray; no special processing will be required. */\n               png_color_16 c;\n               png_uint_32 gray = back_g;\n\n               if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)\n                  png_error(png_ptr, \"gray-alpha color-map: too few entries\");\n\n               cmap_entries = make_gray_colormap(display);\n\n               if (output_encoding == P_LINEAR)\n               {\n                  gray = PNG_sRGB_FROM_LINEAR(gray * 255);\n\n                  /* And make sure the corresponding palette entry matches. */\n                  png_create_colormap_entry(display, gray, back_g, back_g,\n                     back_g, 65535, P_LINEAR);\n               }\n\n               /* The background passed to libpng, however, must be the sRGB\n                * value.\n                */\n               c.index = 0; /*unused*/\n               c.gray = c.red = c.green = c.blue = (png_uint_16)gray;\n\n               png_set_background_fixed(png_ptr, &c,\n                  PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,\n                  0/*gamma: not used*/);\n\n               output_processing = PNG_CMAP_NONE;\n            }\n\n            else\n            {\n               png_uint_32 i, a;\n\n               /* This is the same as png_make_ga_colormap, above, except that\n                * the entries are all opaque.\n                */\n               if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)\n                  png_error(png_ptr, \"ga-alpha color-map: too few entries\");\n\n               i = 0;\n               while (i < 231)\n               {\n                  png_uint_32 gray = (i * 256 + 115) / 231;\n                  png_create_colormap_entry(display, i++, gray, gray, gray,\n                     255, P_sRGB);\n               }\n\n               /* NOTE: this preserves the full precision of the application\n                * background color.\n                */\n               background_index = i;\n               png_create_colormap_entry(display, i++, back_r, back_g, back_b,\n#ifdef __COVERITY__\n                 /* Coverity claims that output_encoding cannot be 2 (P_LINEAR)\n                  * here.\n                  */ 255U,\n#else\n                  output_encoding == P_LINEAR ? 65535U : 255U,\n#endif\n                  output_encoding);\n\n               /* For non-opaque input composite on the sRGB background - this\n                * requires inverting the encoding for each component.  The input\n                * is still converted to the sRGB encoding because this is a\n                * reasonable approximate to the logarithmic curve of human\n                * visual sensitivity, at least over the narrow range which PNG\n                * represents.  Consequently 'G' is always sRGB encoded, while\n                * 'A' is linear.  We need the linear background colors.\n                */\n               if (output_encoding == P_sRGB) /* else already linear */\n               {\n                  /* This may produce a value not exactly matching the\n                   * background, but that's ok because these numbers are only\n                   * used when alpha != 0\n                   */\n                  back_r = png_sRGB_table[back_r];\n                  back_g = png_sRGB_table[back_g];\n                  back_b = png_sRGB_table[back_b];\n               }\n\n               for (a=1; a<5; ++a)\n               {\n                  unsigned int g;\n\n                  /* PNG_sRGB_FROM_LINEAR expects a 16-bit linear value scaled\n                   * by an 8-bit alpha value (0..255).\n                   */\n                  png_uint_32 alpha = 51 * a;\n                  png_uint_32 back_rx = (255-alpha) * back_r;\n                  png_uint_32 back_gx = (255-alpha) * back_g;\n                  png_uint_32 back_bx = (255-alpha) * back_b;\n\n                  for (g=0; g<6; ++g)\n                  {\n                     png_uint_32 gray = png_sRGB_table[g*51] * alpha;\n\n                     png_create_colormap_entry(display, i++,\n                        PNG_sRGB_FROM_LINEAR(gray + back_rx),\n                        PNG_sRGB_FROM_LINEAR(gray + back_gx),\n                        PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, P_sRGB);\n                  }\n               }\n\n               cmap_entries = i;\n               output_processing = PNG_CMAP_GA;\n            }\n         }\n         break;\n\n      case PNG_COLOR_TYPE_RGB:\n      case PNG_COLOR_TYPE_RGB_ALPHA:\n         /* Exclude the case where the output is gray; we can always handle this\n          * with the cases above.\n          */\n         if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0)\n         {\n            /* The color-map will be grayscale, so we may as well convert the\n             * input RGB values to a simple grayscale and use the grayscale\n             * code above.\n             *\n             * NOTE: calling this apparently damages the recognition of the\n             * transparent color in background color handling; call\n             * png_set_tRNS_to_alpha before png_set_background_fixed.\n             */\n            png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, -1,\n               -1);\n            data_encoding = P_sRGB;\n\n            /* The output will now be one or two 8-bit gray or gray+alpha\n             * channels.  The more complex case arises when the input has alpha.\n             */\n            if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||\n               png_ptr->num_trans > 0) &&\n               (output_format & PNG_FORMAT_FLAG_ALPHA) != 0)\n            {\n               /* Both input and output have an alpha channel, so no background\n                * processing is required; just map the GA bytes to the right\n                * color-map entry.\n                */\n               expand_tRNS = 1;\n\n               if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)\n                  png_error(png_ptr, \"rgb[ga] color-map: too few entries\");\n\n               cmap_entries = make_ga_colormap(display);\n               background_index = PNG_CMAP_GA_BACKGROUND;\n               output_processing = PNG_CMAP_GA;\n            }\n\n            else\n            {\n               /* Either the input or the output has no alpha channel, so there\n                * will be no non-opaque pixels in the color-map; it will just be\n                * grayscale.\n                */\n               if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)\n                  png_error(png_ptr, \"rgb[gray] color-map: too few entries\");\n\n               /* Ideally this code would use libpng to do the gamma correction,\n                * but if an input alpha channel is to be removed we will hit the\n                * libpng bug in gamma+compose+rgb-to-gray (the double gamma\n                * correction bug).  Fix this by dropping the gamma correction in\n                * this case and doing it in the palette; this will result in\n                * duplicate palette entries, but that's better than the\n                * alternative of double gamma correction.\n                */\n               if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||\n                  png_ptr->num_trans > 0) &&\n                  png_gamma_not_sRGB(png_ptr->colorspace.gamma) != 0)\n               {\n                  cmap_entries = make_gray_file_colormap(display);\n                  data_encoding = P_FILE;\n               }\n\n               else\n                  cmap_entries = make_gray_colormap(display);\n\n               /* But if the input has alpha or transparency it must be removed\n                */\n               if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||\n                  png_ptr->num_trans > 0)\n               {\n                  png_color_16 c;\n                  png_uint_32 gray = back_g;\n\n                  /* We need to ensure that the application background exists in\n                   * the colormap and that completely transparent pixels map to\n                   * it.  Achieve this simply by ensuring that the entry\n                   * selected for the background really is the background color.\n                   */\n                  if (data_encoding == P_FILE) /* from the fixup above */\n                  {\n                     /* The app supplied a gray which is in output_encoding, we\n                      * need to convert it to a value of the input (P_FILE)\n                      * encoding then set this palette entry to the required\n                      * output encoding.\n                      */\n                     if (output_encoding == P_sRGB)\n                        gray = png_sRGB_table[gray]; /* now P_LINEAR */\n\n                     gray = PNG_DIV257(png_gamma_16bit_correct(gray,\n                        png_ptr->colorspace.gamma)); /* now P_FILE */\n\n                     /* And make sure the corresponding palette entry contains\n                      * exactly the required sRGB value.\n                      */\n                     png_create_colormap_entry(display, gray, back_g, back_g,\n                        back_g, 0/*unused*/, output_encoding);\n                  }\n\n                  else if (output_encoding == P_LINEAR)\n                  {\n                     gray = PNG_sRGB_FROM_LINEAR(gray * 255);\n\n                     /* And make sure the corresponding palette entry matches.\n                      */\n                     png_create_colormap_entry(display, gray, back_g, back_g,\n                        back_g, 0/*unused*/, P_LINEAR);\n                  }\n\n                  /* The background passed to libpng, however, must be the\n                   * output (normally sRGB) value.\n                   */\n                  c.index = 0; /*unused*/\n                  c.gray = c.red = c.green = c.blue = (png_uint_16)gray;\n\n                  /* NOTE: the following is apparently a bug in libpng. Without\n                   * it the transparent color recognition in\n                   * png_set_background_fixed seems to go wrong.\n                   */\n                  expand_tRNS = 1;\n                  png_set_background_fixed(png_ptr, &c,\n                     PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,\n                     0/*gamma: not used*/);\n               }\n\n               output_processing = PNG_CMAP_NONE;\n            }\n         }\n\n         else /* output is color */\n         {\n            /* We could use png_quantize here so long as there is no transparent\n             * color or alpha; png_quantize ignores alpha.  Easier overall just\n             * to do it once and using PNG_DIV51 on the 6x6x6 reduced RGB cube.\n             * Consequently we always want libpng to produce sRGB data.\n             */\n            data_encoding = P_sRGB;\n\n            /* Is there any transparency or alpha? */\n            if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||\n               png_ptr->num_trans > 0)\n            {\n               /* Is there alpha in the output too?  If so all four channels are\n                * processed into a special RGB cube with alpha support.\n                */\n               if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)\n               {\n                  png_uint_32 r;\n\n                  if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)\n                     png_error(png_ptr, \"rgb+alpha color-map: too few entries\");\n\n                  cmap_entries = make_rgb_colormap(display);\n\n                  /* Add a transparent entry. */\n                  png_create_colormap_entry(display, cmap_entries, 255, 255,\n                     255, 0, P_sRGB);\n\n                  /* This is stored as the background index for the processing\n                   * algorithm.\n                   */\n                  background_index = cmap_entries++;\n\n                  /* Add 27 r,g,b entries each with alpha 0.5. */\n                  for (r=0; r<256; r = (r << 1) | 0x7f)\n                  {\n                     png_uint_32 g;\n\n                     for (g=0; g<256; g = (g << 1) | 0x7f)\n                     {\n                        png_uint_32 b;\n\n                        /* This generates components with the values 0, 127 and\n                         * 255\n                         */\n                        for (b=0; b<256; b = (b << 1) | 0x7f)\n                           png_create_colormap_entry(display, cmap_entries++,\n                              r, g, b, 128, P_sRGB);\n                     }\n                  }\n\n                  expand_tRNS = 1;\n                  output_processing = PNG_CMAP_RGB_ALPHA;\n               }\n\n               else\n               {\n                  /* Alpha/transparency must be removed.  The background must\n                   * exist in the color map (achieved by setting adding it after\n                   * the 666 color-map).  If the standard processing code will\n                   * pick up this entry automatically that's all that is\n                   * required; libpng can be called to do the background\n                   * processing.\n                   */\n                  unsigned int sample_size =\n                     PNG_IMAGE_SAMPLE_SIZE(output_format);\n                  png_uint_32 r, g, b; /* sRGB background */\n\n                  if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)\n                     png_error(png_ptr, \"rgb-alpha color-map: too few entries\");\n\n                  cmap_entries = make_rgb_colormap(display);\n\n                  png_create_colormap_entry(display, cmap_entries, back_r,\n                        back_g, back_b, 0/*unused*/, output_encoding);\n\n                  if (output_encoding == P_LINEAR)\n                  {\n                     r = PNG_sRGB_FROM_LINEAR(back_r * 255);\n                     g = PNG_sRGB_FROM_LINEAR(back_g * 255);\n                     b = PNG_sRGB_FROM_LINEAR(back_b * 255);\n                  }\n\n                  else\n                  {\n                     r = back_r;\n                     g = back_g;\n                     b = back_g;\n                  }\n\n                  /* Compare the newly-created color-map entry with the one the\n                   * PNG_CMAP_RGB algorithm will use.  If the two entries don't\n                   * match, add the new one and set this as the background\n                   * index.\n                   */\n                  if (memcmp((png_const_bytep)display->colormap +\n                        sample_size * cmap_entries,\n                     (png_const_bytep)display->colormap +\n                        sample_size * PNG_RGB_INDEX(r,g,b),\n                     sample_size) != 0)\n                  {\n                     /* The background color must be added. */\n                     background_index = cmap_entries++;\n\n                     /* Add 27 r,g,b entries each with created by composing with\n                      * the background at alpha 0.5.\n                      */\n                     for (r=0; r<256; r = (r << 1) | 0x7f)\n                     {\n                        for (g=0; g<256; g = (g << 1) | 0x7f)\n                        {\n                           /* This generates components with the values 0, 127\n                            * and 255\n                            */\n                           for (b=0; b<256; b = (b << 1) | 0x7f)\n                              png_create_colormap_entry(display, cmap_entries++,\n                                 png_colormap_compose(display, r, P_sRGB, 128,\n                                    back_r, output_encoding),\n                                 png_colormap_compose(display, g, P_sRGB, 128,\n                                    back_g, output_encoding),\n                                 png_colormap_compose(display, b, P_sRGB, 128,\n                                    back_b, output_encoding),\n                                 0/*unused*/, output_encoding);\n                        }\n                     }\n\n                     expand_tRNS = 1;\n                     output_processing = PNG_CMAP_RGB_ALPHA;\n                  }\n\n                  else /* background color is in the standard color-map */\n                  {\n                     png_color_16 c;\n\n                     c.index = 0; /*unused*/\n                     c.red = (png_uint_16)back_r;\n                     c.gray = c.green = (png_uint_16)back_g;\n                     c.blue = (png_uint_16)back_b;\n\n                     png_set_background_fixed(png_ptr, &c,\n                        PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,\n                        0/*gamma: not used*/);\n\n                     output_processing = PNG_CMAP_RGB;\n                  }\n               }\n            }\n\n            else /* no alpha or transparency in the input */\n            {\n               /* Alpha in the output is irrelevant, simply map the opaque input\n                * pixels to the 6x6x6 color-map.\n                */\n               if (PNG_RGB_COLORMAP_ENTRIES > image->colormap_entries)\n                  png_error(png_ptr, \"rgb color-map: too few entries\");\n\n               cmap_entries = make_rgb_colormap(display);\n               output_processing = PNG_CMAP_RGB;\n            }\n         }\n         break;\n\n      case PNG_COLOR_TYPE_PALETTE:\n         /* It's already got a color-map.  It may be necessary to eliminate the\n          * tRNS entries though.\n          */\n         {\n            unsigned int num_trans = png_ptr->num_trans;\n            png_const_bytep trans = num_trans > 0 ? png_ptr->trans_alpha : NULL;\n            png_const_colorp colormap = png_ptr->palette;\n            const int do_background = trans != NULL &&\n               (output_format & PNG_FORMAT_FLAG_ALPHA) == 0;\n            unsigned int i;\n\n            /* Just in case: */\n            if (trans == NULL)\n               num_trans = 0;\n\n            output_processing = PNG_CMAP_NONE;\n            data_encoding = P_FILE; /* Don't change from color-map indices */\n            cmap_entries = png_ptr->num_palette;\n            if (cmap_entries > 256)\n               cmap_entries = 256;\n\n            if (cmap_entries > image->colormap_entries)\n               png_error(png_ptr, \"palette color-map: too few entries\");\n\n            for (i=0; i < cmap_entries; ++i)\n            {\n               if (do_background != 0 && i < num_trans && trans[i] < 255)\n               {\n                  if (trans[i] == 0)\n                     png_create_colormap_entry(display, i, back_r, back_g,\n                        back_b, 0, output_encoding);\n\n                  else\n                  {\n                     /* Must compose the PNG file color in the color-map entry\n                      * on the sRGB color in 'back'.\n                      */\n                     png_create_colormap_entry(display, i,\n                        png_colormap_compose(display, colormap[i].red, P_FILE,\n                           trans[i], back_r, output_encoding),\n                        png_colormap_compose(display, colormap[i].green, P_FILE,\n                           trans[i], back_g, output_encoding),\n                        png_colormap_compose(display, colormap[i].blue, P_FILE,\n                           trans[i], back_b, output_encoding),\n                        output_encoding == P_LINEAR ? trans[i] * 257U :\n                           trans[i],\n                        output_encoding);\n                  }\n               }\n\n               else\n                  png_create_colormap_entry(display, i, colormap[i].red,\n                     colormap[i].green, colormap[i].blue,\n                     i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/);\n            }\n\n            /* The PNG data may have indices packed in fewer than 8 bits, it\n             * must be expanded if so.\n             */\n            if (png_ptr->bit_depth < 8)\n               png_set_packing(png_ptr);\n         }\n         break;\n\n      default:\n         png_error(png_ptr, \"invalid PNG color type\");\n         /*NOT REACHED*/\n   }\n\n   /* Now deal with the output processing */\n   if (expand_tRNS != 0 && png_ptr->num_trans > 0 &&\n       (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) == 0)\n      png_set_tRNS_to_alpha(png_ptr);\n\n   switch (data_encoding)\n   {\n      case P_sRGB:\n         /* Change to 8-bit sRGB */\n         png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, PNG_GAMMA_sRGB);\n         /* FALL THROUGH */\n\n      case P_FILE:\n         if (png_ptr->bit_depth > 8)\n            png_set_scale_16(png_ptr);\n         break;\n\n#ifdef __GNUC__\n      default:\n         png_error(png_ptr, \"bad data option (internal error)\");\n#endif\n   }\n\n   if (cmap_entries > 256 || cmap_entries > image->colormap_entries)\n      png_error(png_ptr, \"color map overflow (BAD internal error)\");\n\n   image->colormap_entries = cmap_entries;\n\n   /* Double check using the recorded background index */\n   switch (output_processing)\n   {\n      case PNG_CMAP_NONE:\n         if (background_index != PNG_CMAP_NONE_BACKGROUND)\n            goto bad_background;\n         break;\n\n      case PNG_CMAP_GA:\n         if (background_index != PNG_CMAP_GA_BACKGROUND)\n            goto bad_background;\n         break;\n\n      case PNG_CMAP_TRANS:\n         if (background_index >= cmap_entries ||\n            background_index != PNG_CMAP_TRANS_BACKGROUND)\n            goto bad_background;\n         break;\n\n      case PNG_CMAP_RGB:\n         if (background_index != PNG_CMAP_RGB_BACKGROUND)\n            goto bad_background;\n         break;\n\n      case PNG_CMAP_RGB_ALPHA:\n         if (background_index != PNG_CMAP_RGB_ALPHA_BACKGROUND)\n            goto bad_background;\n         break;\n\n      default:\n         png_error(png_ptr, \"bad processing option (internal error)\");\n\n      bad_background:\n         png_error(png_ptr, \"bad background index (internal error)\");\n   }\n\n   display->colormap_processing = output_processing;\n\n   return 1/*ok*/;\n}\n\n/* The final part of the color-map read called from png_image_finish_read. */\nstatic int\npng_image_read_and_map(png_voidp argument)\n{\n   png_image_read_control *display = png_voidcast(png_image_read_control*,\n      argument);\n   png_imagep image = display->image;\n   png_structrp png_ptr = image->opaque->png_ptr;\n   int passes;\n\n   /* Called when the libpng data must be transformed into the color-mapped\n    * form.  There is a local row buffer in display->local and this routine must\n    * do the interlace handling.\n    */\n   switch (png_ptr->interlaced)\n   {\n      case PNG_INTERLACE_NONE:\n         passes = 1;\n         break;\n\n      case PNG_INTERLACE_ADAM7:\n         passes = PNG_INTERLACE_ADAM7_PASSES;\n         break;\n\n      default:\n         png_error(png_ptr, \"unknown interlace type\");\n   }\n\n   {\n      png_uint_32  height = image->height;\n      png_uint_32  width = image->width;\n      int          proc = display->colormap_processing;\n      png_bytep    first_row = png_voidcast(png_bytep, display->first_row);\n      ptrdiff_t    step_row = display->row_bytes;\n      int pass;\n\n      for (pass = 0; pass < passes; ++pass)\n      {\n         unsigned int     startx, stepx, stepy;\n         png_uint_32      y;\n\n         if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)\n         {\n            /* The row may be empty for a short image: */\n            if (PNG_PASS_COLS(width, pass) == 0)\n               continue;\n\n            startx = PNG_PASS_START_COL(pass);\n            stepx = PNG_PASS_COL_OFFSET(pass);\n            y = PNG_PASS_START_ROW(pass);\n            stepy = PNG_PASS_ROW_OFFSET(pass);\n         }\n\n         else\n         {\n            y = 0;\n            startx = 0;\n            stepx = stepy = 1;\n         }\n\n         for (; y<height; y += stepy)\n         {\n            png_bytep inrow = png_voidcast(png_bytep, display->local_row);\n            png_bytep outrow = first_row + y * step_row;\n            png_const_bytep end_row = outrow + width;\n\n            /* Read read the libpng data into the temporary buffer. */\n            png_read_row(png_ptr, inrow, NULL);\n\n            /* Now process the row according to the processing option, note\n             * that the caller verifies that the format of the libpng output\n             * data is as required.\n             */\n            outrow += startx;\n            switch (proc)\n            {\n               case PNG_CMAP_GA:\n                  for (; outrow < end_row; outrow += stepx)\n                  {\n                     /* The data is always in the PNG order */\n                     unsigned int gray = *inrow++;\n                     unsigned int alpha = *inrow++;\n                     unsigned int entry;\n\n                     /* NOTE: this code is copied as a comment in\n                      * make_ga_colormap above.  Please update the\n                      * comment if you change this code!\n                      */\n                     if (alpha > 229) /* opaque */\n                     {\n                        entry = (231 * gray + 128) >> 8;\n                     }\n                     else if (alpha < 26) /* transparent */\n                     {\n                        entry = 231;\n                     }\n                     else /* partially opaque */\n                     {\n                        entry = 226 + 6 * PNG_DIV51(alpha) + PNG_DIV51(gray);\n                     }\n\n                     *outrow = (png_byte)entry;\n                  }\n                  break;\n\n               case PNG_CMAP_TRANS:\n                  for (; outrow < end_row; outrow += stepx)\n                  {\n                     png_byte gray = *inrow++;\n                     png_byte alpha = *inrow++;\n\n                     if (alpha == 0)\n                        *outrow = PNG_CMAP_TRANS_BACKGROUND;\n\n                     else if (gray != PNG_CMAP_TRANS_BACKGROUND)\n                        *outrow = gray;\n\n                     else\n                        *outrow = (png_byte)(PNG_CMAP_TRANS_BACKGROUND+1);\n                  }\n                  break;\n\n               case PNG_CMAP_RGB:\n                  for (; outrow < end_row; outrow += stepx)\n                  {\n                     *outrow = PNG_RGB_INDEX(inrow[0], inrow[1], inrow[2]);\n                     inrow += 3;\n                  }\n                  break;\n\n               case PNG_CMAP_RGB_ALPHA:\n                  for (; outrow < end_row; outrow += stepx)\n                  {\n                     unsigned int alpha = inrow[3];\n\n                     /* Because the alpha entries only hold alpha==0.5 values\n                      * split the processing at alpha==0.25 (64) and 0.75\n                      * (196).\n                      */\n\n                     if (alpha >= 196)\n                        *outrow = PNG_RGB_INDEX(inrow[0], inrow[1],\n                           inrow[2]);\n\n                     else if (alpha < 64)\n                        *outrow = PNG_CMAP_RGB_ALPHA_BACKGROUND;\n\n                     else\n                     {\n                        /* Likewise there are three entries for each of r, g\n                         * and b.  We could select the entry by popcount on\n                         * the top two bits on those architectures that\n                         * support it, this is what the code below does,\n                         * crudely.\n                         */\n                        unsigned int back_i = PNG_CMAP_RGB_ALPHA_BACKGROUND+1;\n\n                        /* Here are how the values map:\n                         *\n                         * 0x00 .. 0x3f -> 0\n                         * 0x40 .. 0xbf -> 1\n                         * 0xc0 .. 0xff -> 2\n                         *\n                         * So, as above with the explicit alpha checks, the\n                         * breakpoints are at 64 and 196.\n                         */\n                        if (inrow[0] & 0x80) back_i += 9; /* red */\n                        if (inrow[0] & 0x40) back_i += 9;\n                        if (inrow[0] & 0x80) back_i += 3; /* green */\n                        if (inrow[0] & 0x40) back_i += 3;\n                        if (inrow[0] & 0x80) back_i += 1; /* blue */\n                        if (inrow[0] & 0x40) back_i += 1;\n\n                        *outrow = (png_byte)back_i;\n                     }\n\n                     inrow += 4;\n                  }\n                  break;\n\n               default:\n                  break;\n            }\n         }\n      }\n   }\n\n   return 1;\n}\n\nstatic int\npng_image_read_colormapped(png_voidp argument)\n{\n   png_image_read_control *display = png_voidcast(png_image_read_control*,\n      argument);\n   png_imagep image = display->image;\n   png_controlp control = image->opaque;\n   png_structrp png_ptr = control->png_ptr;\n   png_inforp info_ptr = control->info_ptr;\n\n   int passes = 0; /* As a flag */\n\n   PNG_SKIP_CHUNKS(png_ptr);\n\n   /* Update the 'info' structure and make sure the result is as required; first\n    * make sure to turn on the interlace handling if it will be required\n    * (because it can't be turned on *after* the call to png_read_update_info!)\n    */\n   if (display->colormap_processing == PNG_CMAP_NONE)\n      passes = png_set_interlace_handling(png_ptr);\n\n   png_read_update_info(png_ptr, info_ptr);\n\n   /* The expected output can be deduced from the colormap_processing option. */\n   switch (display->colormap_processing)\n   {\n      case PNG_CMAP_NONE:\n         /* Output must be one channel and one byte per pixel, the output\n          * encoding can be anything.\n          */\n         if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE ||\n            info_ptr->color_type == PNG_COLOR_TYPE_GRAY) &&\n            info_ptr->bit_depth == 8)\n            break;\n\n         goto bad_output;\n\n      case PNG_CMAP_TRANS:\n      case PNG_CMAP_GA:\n         /* Output must be two channels and the 'G' one must be sRGB, the latter\n          * can be checked with an exact number because it should have been set\n          * to this number above!\n          */\n         if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&\n            info_ptr->bit_depth == 8 &&\n            png_ptr->screen_gamma == PNG_GAMMA_sRGB &&\n            image->colormap_entries == 256)\n            break;\n\n         goto bad_output;\n\n      case PNG_CMAP_RGB:\n         /* Output must be 8-bit sRGB encoded RGB */\n         if (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&\n            info_ptr->bit_depth == 8 &&\n            png_ptr->screen_gamma == PNG_GAMMA_sRGB &&\n            image->colormap_entries == 216)\n            break;\n\n         goto bad_output;\n\n      case PNG_CMAP_RGB_ALPHA:\n         /* Output must be 8-bit sRGB encoded RGBA */\n         if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&\n            info_ptr->bit_depth == 8 &&\n            png_ptr->screen_gamma == PNG_GAMMA_sRGB &&\n            image->colormap_entries == 244 /* 216 + 1 + 27 */)\n            break;\n\n         /* goto bad_output; */\n         /* FALL THROUGH */\n\n      default:\n      bad_output:\n         png_error(png_ptr, \"bad color-map processing (internal error)\");\n   }\n\n   /* Now read the rows.  Do this here if it is possible to read directly into\n    * the output buffer, otherwise allocate a local row buffer of the maximum\n    * size libpng requires and call the relevant processing routine safely.\n    */\n   {\n      png_voidp first_row = display->buffer;\n      ptrdiff_t row_bytes = display->row_stride;\n\n      /* The following expression is designed to work correctly whether it gives\n       * a signed or an unsigned result.\n       */\n      if (row_bytes < 0)\n      {\n         char *ptr = png_voidcast(char*, first_row);\n         ptr += (image->height-1) * (-row_bytes);\n         first_row = png_voidcast(png_voidp, ptr);\n      }\n\n      display->first_row = first_row;\n      display->row_bytes = row_bytes;\n   }\n\n   if (passes == 0)\n   {\n      int result;\n      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));\n\n      display->local_row = row;\n      result = png_safe_execute(image, png_image_read_and_map, display);\n      display->local_row = NULL;\n      png_free(png_ptr, row);\n\n      return result;\n   }\n\n   else\n   {\n      png_alloc_size_t row_bytes = display->row_bytes;\n\n      while (--passes >= 0)\n      {\n         png_uint_32      y = image->height;\n         png_bytep        row = png_voidcast(png_bytep, display->first_row);\n\n         while (y-- > 0)\n         {\n            png_read_row(png_ptr, row, NULL);\n            row += row_bytes;\n         }\n      }\n\n      return 1;\n   }\n}\n\n/* Just the row reading part of png_image_read. */\nstatic int\npng_image_read_composite(png_voidp argument)\n{\n   png_image_read_control *display = png_voidcast(png_image_read_control*,\n      argument);\n   png_imagep image = display->image;\n   png_structrp png_ptr = image->opaque->png_ptr;\n   int passes;\n\n   switch (png_ptr->interlaced)\n   {\n      case PNG_INTERLACE_NONE:\n         passes = 1;\n         break;\n\n      case PNG_INTERLACE_ADAM7:\n         passes = PNG_INTERLACE_ADAM7_PASSES;\n         break;\n\n      default:\n         png_error(png_ptr, \"unknown interlace type\");\n   }\n\n   {\n      png_uint_32  height = image->height;\n      png_uint_32  width = image->width;\n      ptrdiff_t    step_row = display->row_bytes;\n      unsigned int channels =\n          (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;\n      int pass;\n\n      for (pass = 0; pass < passes; ++pass)\n      {\n         unsigned int     startx, stepx, stepy;\n         png_uint_32      y;\n\n         if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)\n         {\n            /* The row may be empty for a short image: */\n            if (PNG_PASS_COLS(width, pass) == 0)\n               continue;\n\n            startx = PNG_PASS_START_COL(pass) * channels;\n            stepx = PNG_PASS_COL_OFFSET(pass) * channels;\n            y = PNG_PASS_START_ROW(pass);\n            stepy = PNG_PASS_ROW_OFFSET(pass);\n         }\n\n         else\n         {\n            y = 0;\n            startx = 0;\n            stepx = channels;\n            stepy = 1;\n         }\n\n         for (; y<height; y += stepy)\n         {\n            png_bytep inrow = png_voidcast(png_bytep, display->local_row);\n            png_bytep outrow;\n            png_const_bytep end_row;\n\n            /* Read the row, which is packed: */\n            png_read_row(png_ptr, inrow, NULL);\n\n            outrow = png_voidcast(png_bytep, display->first_row);\n            outrow += y * step_row;\n            end_row = outrow + width * channels;\n\n            /* Now do the composition on each pixel in this row. */\n            outrow += startx;\n            for (; outrow < end_row; outrow += stepx)\n            {\n               png_byte alpha = inrow[channels];\n\n               if (alpha > 0) /* else no change to the output */\n               {\n                  unsigned int c;\n\n                  for (c=0; c<channels; ++c)\n                  {\n                     png_uint_32 component = inrow[c];\n\n                     if (alpha < 255) /* else just use component */\n                     {\n                        /* This is PNG_OPTIMIZED_ALPHA, the component value\n                         * is a linear 8-bit value.  Combine this with the\n                         * current outrow[c] value which is sRGB encoded.\n                         * Arithmetic here is 16-bits to preserve the output\n                         * values correctly.\n                         */\n                        component *= 257*255; /* =65535 */\n                        component += (255-alpha)*png_sRGB_table[outrow[c]];\n\n                        /* So 'component' is scaled by 255*65535 and is\n                         * therefore appropriate for the sRGB to linear\n                         * conversion table.\n                         */\n                        component = PNG_sRGB_FROM_LINEAR(component);\n                     }\n\n                     outrow[c] = (png_byte)component;\n                  }\n               }\n\n               inrow += channels+1; /* components and alpha channel */\n            }\n         }\n      }\n   }\n\n   return 1;\n}\n\n/* The do_local_background case; called when all the following transforms are to\n * be done:\n *\n * PNG_RGB_TO_GRAY\n * PNG_COMPOSITE\n * PNG_GAMMA\n *\n * This is a work-around for the fact that both the PNG_RGB_TO_GRAY and\n * PNG_COMPOSITE code performs gamma correction, so we get double gamma\n * correction.  The fix-up is to prevent the PNG_COMPOSITE operation from\n * happening inside libpng, so this routine sees an 8 or 16-bit gray+alpha\n * row and handles the removal or pre-multiplication of the alpha channel.\n */\nstatic int\npng_image_read_background(png_voidp argument)\n{\n   png_image_read_control *display = png_voidcast(png_image_read_control*,\n      argument);\n   png_imagep image = display->image;\n   png_structrp png_ptr = image->opaque->png_ptr;\n   png_inforp info_ptr = image->opaque->info_ptr;\n   png_uint_32 height = image->height;\n   png_uint_32 width = image->width;\n   int pass, passes;\n\n   /* Double check the convoluted logic below.  We expect to get here with\n    * libpng doing rgb to gray and gamma correction but background processing\n    * left to the png_image_read_background function.  The rows libpng produce\n    * might be 8 or 16-bit but should always have two channels; gray plus alpha.\n    */\n   if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == 0)\n      png_error(png_ptr, \"lost rgb to gray\");\n\n   if ((png_ptr->transformations & PNG_COMPOSE) != 0)\n      png_error(png_ptr, \"unexpected compose\");\n\n   if (png_get_channels(png_ptr, info_ptr) != 2)\n      png_error(png_ptr, \"lost/gained channels\");\n\n   /* Expect the 8-bit case to always remove the alpha channel */\n   if ((image->format & PNG_FORMAT_FLAG_LINEAR) == 0 &&\n      (image->format & PNG_FORMAT_FLAG_ALPHA) != 0)\n      png_error(png_ptr, \"unexpected 8-bit transformation\");\n\n   switch (png_ptr->interlaced)\n   {\n      case PNG_INTERLACE_NONE:\n         passes = 1;\n         break;\n\n      case PNG_INTERLACE_ADAM7:\n         passes = PNG_INTERLACE_ADAM7_PASSES;\n         break;\n\n      default:\n         png_error(png_ptr, \"unknown interlace type\");\n   }\n\n   /* Use direct access to info_ptr here because otherwise the simplified API\n    * would require PNG_EASY_ACCESS_SUPPORTED (just for this.)  Note this is\n    * checking the value after libpng expansions, not the original value in the\n    * PNG.\n    */\n   switch (info_ptr->bit_depth)\n   {\n      case 8:\n         /* 8-bit sRGB gray values with an alpha channel; the alpha channel is\n          * to be removed by composing on a background: either the row if\n          * display->background is NULL or display->background->green if not.\n          * Unlike the code above ALPHA_OPTIMIZED has *not* been done.\n          */\n         {\n            png_bytep first_row = png_voidcast(png_bytep, display->first_row);\n            ptrdiff_t step_row = display->row_bytes;\n\n            for (pass = 0; pass < passes; ++pass)\n            {\n               png_bytep        row = png_voidcast(png_bytep,\n                                                   display->first_row);\n               unsigned int     startx, stepx, stepy;\n               png_uint_32      y;\n\n               if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)\n               {\n                  /* The row may be empty for a short image: */\n                  if (PNG_PASS_COLS(width, pass) == 0)\n                     continue;\n\n                  startx = PNG_PASS_START_COL(pass);\n                  stepx = PNG_PASS_COL_OFFSET(pass);\n                  y = PNG_PASS_START_ROW(pass);\n                  stepy = PNG_PASS_ROW_OFFSET(pass);\n               }\n\n               else\n               {\n                  y = 0;\n                  startx = 0;\n                  stepx = stepy = 1;\n               }\n\n               if (display->background == NULL)\n               {\n                  for (; y<height; y += stepy)\n                  {\n                     png_bytep inrow = png_voidcast(png_bytep,\n                        display->local_row);\n                     png_bytep outrow = first_row + y * step_row;\n                     png_const_bytep end_row = outrow + width;\n\n                     /* Read the row, which is packed: */\n                     png_read_row(png_ptr, inrow, NULL);\n\n                     /* Now do the composition on each pixel in this row. */\n                     outrow += startx;\n                     for (; outrow < end_row; outrow += stepx)\n                     {\n                        png_byte alpha = inrow[1];\n\n                        if (alpha > 0) /* else no change to the output */\n                        {\n                           png_uint_32 component = inrow[0];\n\n                           if (alpha < 255) /* else just use component */\n                           {\n                              /* Since PNG_OPTIMIZED_ALPHA was not set it is\n                               * necessary to invert the sRGB transfer\n                               * function and multiply the alpha out.\n                               */\n                              component = png_sRGB_table[component] * alpha;\n                              component += png_sRGB_table[outrow[0]] *\n                                 (255-alpha);\n                              component = PNG_sRGB_FROM_LINEAR(component);\n                           }\n\n                           outrow[0] = (png_byte)component;\n                        }\n\n                        inrow += 2; /* gray and alpha channel */\n                     }\n                  }\n               }\n\n               else /* constant background value */\n               {\n                  png_byte background8 = display->background->green;\n                  png_uint_16 background = png_sRGB_table[background8];\n\n                  for (; y<height; y += stepy)\n                  {\n                     png_bytep inrow = png_voidcast(png_bytep,\n                        display->local_row);\n                     png_bytep outrow = first_row + y * step_row;\n                     png_const_bytep end_row = outrow + width;\n\n                     /* Read the row, which is packed: */\n                     png_read_row(png_ptr, inrow, NULL);\n\n                     /* Now do the composition on each pixel in this row. */\n                     outrow += startx;\n                     for (; outrow < end_row; outrow += stepx)\n                     {\n                        png_byte alpha = inrow[1];\n\n                        if (alpha > 0) /* else use background */\n                        {\n                           png_uint_32 component = inrow[0];\n\n                           if (alpha < 255) /* else just use component */\n                           {\n                              component = png_sRGB_table[component] * alpha;\n                              component += background * (255-alpha);\n                              component = PNG_sRGB_FROM_LINEAR(component);\n                           }\n\n                           outrow[0] = (png_byte)component;\n                        }\n\n                        else\n                           outrow[0] = background8;\n\n                        inrow += 2; /* gray and alpha channel */\n                     }\n\n                     row += display->row_bytes;\n                  }\n               }\n            }\n         }\n         break;\n\n      case 16:\n         /* 16-bit linear with pre-multiplied alpha; the pre-multiplication must\n          * still be done and, maybe, the alpha channel removed.  This code also\n          * handles the alpha-first option.\n          */\n         {\n            png_uint_16p first_row = png_voidcast(png_uint_16p,\n               display->first_row);\n            /* The division by two is safe because the caller passed in a\n             * stride which was multiplied by 2 (below) to get row_bytes.\n             */\n            ptrdiff_t    step_row = display->row_bytes / 2;\n            int preserve_alpha = (image->format & PNG_FORMAT_FLAG_ALPHA) != 0;\n            unsigned int outchannels = 1+preserve_alpha;\n            int swap_alpha = 0;\n\n#           ifdef PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED\n               if (preserve_alpha != 0 &&\n                   (image->format & PNG_FORMAT_FLAG_AFIRST) != 0)\n                  swap_alpha = 1;\n#           endif\n\n            for (pass = 0; pass < passes; ++pass)\n            {\n               unsigned int     startx, stepx, stepy;\n               png_uint_32      y;\n\n               /* The 'x' start and step are adjusted to output components here.\n                */\n               if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)\n               {\n                  /* The row may be empty for a short image: */\n                  if (PNG_PASS_COLS(width, pass) == 0)\n                     continue;\n\n                  startx = PNG_PASS_START_COL(pass) * outchannels;\n                  stepx = PNG_PASS_COL_OFFSET(pass) * outchannels;\n                  y = PNG_PASS_START_ROW(pass);\n                  stepy = PNG_PASS_ROW_OFFSET(pass);\n               }\n\n               else\n               {\n                  y = 0;\n                  startx = 0;\n                  stepx = outchannels;\n                  stepy = 1;\n               }\n\n               for (; y<height; y += stepy)\n               {\n                  png_const_uint_16p inrow;\n                  png_uint_16p outrow = first_row + y*step_row;\n                  png_uint_16p end_row = outrow + width * outchannels;\n\n                  /* Read the row, which is packed: */\n                  png_read_row(png_ptr, png_voidcast(png_bytep,\n                     display->local_row), NULL);\n                  inrow = png_voidcast(png_const_uint_16p, display->local_row);\n\n                  /* Now do the pre-multiplication on each pixel in this row.\n                   */\n                  outrow += startx;\n                  for (; outrow < end_row; outrow += stepx)\n                  {\n                     png_uint_32 component = inrow[0];\n                     png_uint_16 alpha = inrow[1];\n\n                     if (alpha > 0) /* else 0 */\n                     {\n                        if (alpha < 65535) /* else just use component */\n                        {\n                           component *= alpha;\n                           component += 32767;\n                           component /= 65535;\n                        }\n                     }\n\n                     else\n                        component = 0;\n\n                     outrow[swap_alpha] = (png_uint_16)component;\n                     if (preserve_alpha != 0)\n                        outrow[1 ^ swap_alpha] = alpha;\n\n                     inrow += 2; /* components and alpha channel */\n                  }\n               }\n            }\n         }\n         break;\n\n#ifdef __GNUC__\n      default:\n         png_error(png_ptr, \"unexpected bit depth\");\n#endif\n   }\n\n   return 1;\n}\n\n/* The guts of png_image_finish_read as a png_safe_execute callback. */\nstatic int\npng_image_read_direct(png_voidp argument)\n{\n   png_image_read_control *display = png_voidcast(png_image_read_control*,\n      argument);\n   png_imagep image = display->image;\n   png_structrp png_ptr = image->opaque->png_ptr;\n   png_inforp info_ptr = image->opaque->info_ptr;\n\n   png_uint_32 format = image->format;\n   int linear = (format & PNG_FORMAT_FLAG_LINEAR) != 0;\n   int do_local_compose = 0;\n   int do_local_background = 0; /* to avoid double gamma correction bug */\n   int passes = 0;\n\n   /* Add transforms to ensure the correct output format is produced then check\n    * that the required implementation support is there.  Always expand; always\n    * need 8 bits minimum, no palette and expanded tRNS.\n    */\n   png_set_expand(png_ptr);\n\n   /* Now check the format to see if it was modified. */\n   {\n      png_uint_32 base_format = png_image_format(png_ptr) &\n         ~PNG_FORMAT_FLAG_COLORMAP /* removed by png_set_expand */;\n      png_uint_32 change = format ^ base_format;\n      png_fixed_point output_gamma;\n      int mode; /* alpha mode */\n\n      /* Do this first so that we have a record if rgb to gray is happening. */\n      if ((change & PNG_FORMAT_FLAG_COLOR) != 0)\n      {\n         /* gray<->color transformation required. */\n         if ((format & PNG_FORMAT_FLAG_COLOR) != 0)\n            png_set_gray_to_rgb(png_ptr);\n\n         else\n         {\n            /* libpng can't do both rgb to gray and\n             * background/pre-multiplication if there is also significant gamma\n             * correction, because both operations require linear colors and\n             * the code only supports one transform doing the gamma correction.\n             * Handle this by doing the pre-multiplication or background\n             * operation in this code, if necessary.\n             *\n             * TODO: fix this by rewriting pngrtran.c (!)\n             *\n             * For the moment (given that fixing this in pngrtran.c is an\n             * enormous change) 'do_local_background' is used to indicate that\n             * the problem exists.\n             */\n            if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)\n               do_local_background = 1/*maybe*/;\n\n            png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE,\n               PNG_RGB_TO_GRAY_DEFAULT, PNG_RGB_TO_GRAY_DEFAULT);\n         }\n\n         change &= ~PNG_FORMAT_FLAG_COLOR;\n      }\n\n      /* Set the gamma appropriately, linear for 16-bit input, sRGB otherwise.\n       */\n      {\n         png_fixed_point input_gamma_default;\n\n         if ((base_format & PNG_FORMAT_FLAG_LINEAR) != 0 &&\n             (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0)\n            input_gamma_default = PNG_GAMMA_LINEAR;\n         else\n            input_gamma_default = PNG_DEFAULT_sRGB;\n\n         /* Call png_set_alpha_mode to set the default for the input gamma; the\n          * output gamma is set by a second call below.\n          */\n         png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, input_gamma_default);\n      }\n\n      if (linear != 0)\n      {\n         /* If there *is* an alpha channel in the input it must be multiplied\n          * out; use PNG_ALPHA_STANDARD, otherwise just use PNG_ALPHA_PNG.\n          */\n         if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)\n            mode = PNG_ALPHA_STANDARD; /* associated alpha */\n\n         else\n            mode = PNG_ALPHA_PNG;\n\n         output_gamma = PNG_GAMMA_LINEAR;\n      }\n\n      else\n      {\n         mode = PNG_ALPHA_PNG;\n         output_gamma = PNG_DEFAULT_sRGB;\n      }\n\n      /* If 'do_local_background' is set check for the presence of gamma\n       * correction; this is part of the work-round for the libpng bug\n       * described above.\n       *\n       * TODO: fix libpng and remove this.\n       */\n      if (do_local_background != 0)\n      {\n         png_fixed_point gtest;\n\n         /* This is 'png_gamma_threshold' from pngrtran.c; the test used for\n          * gamma correction, the screen gamma hasn't been set on png_struct\n          * yet; it's set below.  png_struct::gamma, however, is set to the\n          * final value.\n          */\n         if (png_muldiv(&gtest, output_gamma, png_ptr->colorspace.gamma,\n               PNG_FP_1) != 0 && png_gamma_significant(gtest) == 0)\n            do_local_background = 0;\n\n         else if (mode == PNG_ALPHA_STANDARD)\n         {\n            do_local_background = 2/*required*/;\n            mode = PNG_ALPHA_PNG; /* prevent libpng doing it */\n         }\n\n         /* else leave as 1 for the checks below */\n      }\n\n      /* If the bit-depth changes then handle that here. */\n      if ((change & PNG_FORMAT_FLAG_LINEAR) != 0)\n      {\n         if (linear != 0 /*16-bit output*/)\n            png_set_expand_16(png_ptr);\n\n         else /* 8-bit output */\n            png_set_scale_16(png_ptr);\n\n         change &= ~PNG_FORMAT_FLAG_LINEAR;\n      }\n\n      /* Now the background/alpha channel changes. */\n      if ((change & PNG_FORMAT_FLAG_ALPHA) != 0)\n      {\n         /* Removing an alpha channel requires composition for the 8-bit\n          * formats; for the 16-bit it is already done, above, by the\n          * pre-multiplication and the channel just needs to be stripped.\n          */\n         if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)\n         {\n            /* If RGB->gray is happening the alpha channel must be left and the\n             * operation completed locally.\n             *\n             * TODO: fix libpng and remove this.\n             */\n            if (do_local_background != 0)\n               do_local_background = 2/*required*/;\n\n            /* 16-bit output: just remove the channel */\n            else if (linear != 0) /* compose on black (well, pre-multiply) */\n               png_set_strip_alpha(png_ptr);\n\n            /* 8-bit output: do an appropriate compose */\n            else if (display->background != NULL)\n            {\n               png_color_16 c;\n\n               c.index = 0; /*unused*/\n               c.red = display->background->red;\n               c.green = display->background->green;\n               c.blue = display->background->blue;\n               c.gray = display->background->green;\n\n               /* This is always an 8-bit sRGB value, using the 'green' channel\n                * for gray is much better than calculating the luminance here;\n                * we can get off-by-one errors in that calculation relative to\n                * the app expectations and that will show up in transparent\n                * pixels.\n                */\n               png_set_background_fixed(png_ptr, &c,\n                  PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,\n                  0/*gamma: not used*/);\n            }\n\n            else /* compose on row: implemented below. */\n            {\n               do_local_compose = 1;\n               /* This leaves the alpha channel in the output, so it has to be\n                * removed by the code below.  Set the encoding to the 'OPTIMIZE'\n                * one so the code only has to hack on the pixels that require\n                * composition.\n                */\n               mode = PNG_ALPHA_OPTIMIZED;\n            }\n         }\n\n         else /* output needs an alpha channel */\n         {\n            /* This is tricky because it happens before the swap operation has\n             * been accomplished; however, the swap does *not* swap the added\n             * alpha channel (weird API), so it must be added in the correct\n             * place.\n             */\n            png_uint_32 filler; /* opaque filler */\n            int where;\n\n            if (linear != 0)\n               filler = 65535;\n\n            else\n               filler = 255;\n\n#ifdef PNG_FORMAT_AFIRST_SUPPORTED\n            if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)\n            {\n               where = PNG_FILLER_BEFORE;\n               change &= ~PNG_FORMAT_FLAG_AFIRST;\n            }\n\n            else\n#endif\n            where = PNG_FILLER_AFTER;\n\n            png_set_add_alpha(png_ptr, filler, where);\n         }\n\n         /* This stops the (irrelevant) call to swap_alpha below. */\n         change &= ~PNG_FORMAT_FLAG_ALPHA;\n      }\n\n      /* Now set the alpha mode correctly; this is always done, even if there is\n       * no alpha channel in either the input or the output because it correctly\n       * sets the output gamma.\n       */\n      png_set_alpha_mode_fixed(png_ptr, mode, output_gamma);\n\n#     ifdef PNG_FORMAT_BGR_SUPPORTED\n         if ((change & PNG_FORMAT_FLAG_BGR) != 0)\n         {\n            /* Check only the output format; PNG is never BGR; don't do this if\n             * the output is gray, but fix up the 'format' value in that case.\n             */\n            if ((format & PNG_FORMAT_FLAG_COLOR) != 0)\n               png_set_bgr(png_ptr);\n\n            else\n               format &= ~PNG_FORMAT_FLAG_BGR;\n\n            change &= ~PNG_FORMAT_FLAG_BGR;\n         }\n#     endif\n\n#     ifdef PNG_FORMAT_AFIRST_SUPPORTED\n         if ((change & PNG_FORMAT_FLAG_AFIRST) != 0)\n         {\n            /* Only relevant if there is an alpha channel - it's particularly\n             * important to handle this correctly because do_local_compose may\n             * be set above and then libpng will keep the alpha channel for this\n             * code to remove.\n             */\n            if ((format & PNG_FORMAT_FLAG_ALPHA) != 0)\n            {\n               /* Disable this if doing a local background,\n                * TODO: remove this when local background is no longer required.\n                */\n               if (do_local_background != 2)\n                  png_set_swap_alpha(png_ptr);\n            }\n\n            else\n               format &= ~PNG_FORMAT_FLAG_AFIRST;\n\n            change &= ~PNG_FORMAT_FLAG_AFIRST;\n         }\n#     endif\n\n      /* If the *output* is 16-bit then we need to check for a byte-swap on this\n       * architecture.\n       */\n      if (linear != 0)\n      {\n         PNG_CONST png_uint_16 le = 0x0001;\n\n         if ((*(png_const_bytep) & le) != 0)\n            png_set_swap(png_ptr);\n      }\n\n      /* If change is not now 0 some transformation is missing - error out. */\n      if (change != 0)\n         png_error(png_ptr, \"png_read_image: unsupported transformation\");\n   }\n\n   PNG_SKIP_CHUNKS(png_ptr);\n\n   /* Update the 'info' structure and make sure the result is as required; first\n    * make sure to turn on the interlace handling if it will be required\n    * (because it can't be turned on *after* the call to png_read_update_info!)\n    *\n    * TODO: remove the do_local_background fixup below.\n    */\n   if (do_local_compose == 0 && do_local_background != 2)\n      passes = png_set_interlace_handling(png_ptr);\n\n   png_read_update_info(png_ptr, info_ptr);\n\n   {\n      png_uint_32 info_format = 0;\n\n      if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)\n         info_format |= PNG_FORMAT_FLAG_COLOR;\n\n      if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)\n      {\n         /* do_local_compose removes this channel below. */\n         if (do_local_compose == 0)\n         {\n            /* do_local_background does the same if required. */\n            if (do_local_background != 2 ||\n               (format & PNG_FORMAT_FLAG_ALPHA) != 0)\n               info_format |= PNG_FORMAT_FLAG_ALPHA;\n         }\n      }\n\n      else if (do_local_compose != 0) /* internal error */\n         png_error(png_ptr, \"png_image_read: alpha channel lost\");\n\n      if (info_ptr->bit_depth == 16)\n         info_format |= PNG_FORMAT_FLAG_LINEAR;\n\n#ifdef PNG_FORMAT_BGR_SUPPORTED\n      if ((png_ptr->transformations & PNG_BGR) != 0)\n         info_format |= PNG_FORMAT_FLAG_BGR;\n#endif\n\n#ifdef PNG_FORMAT_AFIRST_SUPPORTED\n         if (do_local_background == 2)\n         {\n            if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)\n               info_format |= PNG_FORMAT_FLAG_AFIRST;\n         }\n\n         if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0 ||\n            ((png_ptr->transformations & PNG_ADD_ALPHA) != 0 &&\n            (png_ptr->flags & PNG_FLAG_FILLER_AFTER) == 0))\n         {\n            if (do_local_background == 2)\n               png_error(png_ptr, \"unexpected alpha swap transformation\");\n\n            info_format |= PNG_FORMAT_FLAG_AFIRST;\n         }\n#     endif\n\n      /* This is actually an internal error. */\n      if (info_format != format)\n         png_error(png_ptr, \"png_read_image: invalid transformations\");\n   }\n\n   /* Now read the rows.  If do_local_compose is set then it is necessary to use\n    * a local row buffer.  The output will be GA, RGBA or BGRA and must be\n    * converted to G, RGB or BGR as appropriate.  The 'local_row' member of the\n    * display acts as a flag.\n    */\n   {\n      png_voidp first_row = display->buffer;\n      ptrdiff_t row_bytes = display->row_stride;\n\n      if (linear != 0)\n         row_bytes *= 2;\n\n      /* The following expression is designed to work correctly whether it gives\n       * a signed or an unsigned result.\n       */\n      if (row_bytes < 0)\n      {\n         char *ptr = png_voidcast(char*, first_row);\n         ptr += (image->height-1) * (-row_bytes);\n         first_row = png_voidcast(png_voidp, ptr);\n      }\n\n      display->first_row = first_row;\n      display->row_bytes = row_bytes;\n   }\n\n   if (do_local_compose != 0)\n   {\n      int result;\n      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));\n\n      display->local_row = row;\n      result = png_safe_execute(image, png_image_read_composite, display);\n      display->local_row = NULL;\n      png_free(png_ptr, row);\n\n      return result;\n   }\n\n   else if (do_local_background == 2)\n   {\n      int result;\n      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));\n\n      display->local_row = row;\n      result = png_safe_execute(image, png_image_read_background, display);\n      display->local_row = NULL;\n      png_free(png_ptr, row);\n\n      return result;\n   }\n\n   else\n   {\n      png_alloc_size_t row_bytes = display->row_bytes;\n\n      while (--passes >= 0)\n      {\n         png_uint_32      y = image->height;\n         png_bytep        row = png_voidcast(png_bytep, display->first_row);\n\n         while (y-- > 0)\n         {\n            png_read_row(png_ptr, row, NULL);\n            row += row_bytes;\n         }\n      }\n\n      return 1;\n   }\n}\n\nint PNGAPI\npng_image_finish_read(png_imagep image, png_const_colorp background,\n   void *buffer, png_int_32 row_stride, void *colormap)\n{\n   if (image != NULL && image->version == PNG_IMAGE_VERSION)\n   {\n      /* Check for row_stride overflow.  This check is not performed on the\n       * original PNG format because it may not occur in the output PNG format\n       * and libpng deals with the issues of reading the original.\n       */\n      const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);\n\n      if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */\n      {\n         png_uint_32 check;\n         const png_uint_32 png_row_stride = image->width * channels;\n\n         if (row_stride == 0)\n            row_stride = (png_int_32)/*SAFE*/png_row_stride;\n\n         if (row_stride < 0)\n            check = -row_stride;\n\n         else\n            check = row_stride;\n\n         if (image->opaque != NULL && buffer != NULL && check >= png_row_stride)\n         {\n            /* Now check for overflow of the image buffer calculation; this\n             * limits the whole image size to 32 bits for API compatibility with\n             * the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.\n             */\n            if (image->height <= 0xFFFFFFFF/png_row_stride)\n            {\n               if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||\n                  (image->colormap_entries > 0 && colormap != NULL))\n               {\n                  int result;\n                  png_image_read_control display;\n\n                  memset(&display, 0, (sizeof display));\n                  display.image = image;\n                  display.buffer = buffer;\n                  display.row_stride = row_stride;\n                  display.colormap = colormap;\n                  display.background = background;\n                  display.local_row = NULL;\n\n                  /* Choose the correct 'end' routine; for the color-map case\n                   * all the setup has already been done.\n                   */\n                  if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)\n                     result = png_safe_execute(image,\n                                    png_image_read_colormap, &display) &&\n                              png_safe_execute(image,\n                                    png_image_read_colormapped, &display);\n\n                  else\n                     result =\n                        png_safe_execute(image,\n                              png_image_read_direct, &display);\n\n                  png_image_free(image);\n                  return result;\n               }\n\n               else\n                  return png_image_error(image,\n                     \"png_image_finish_read[color-map]: no color-map\");\n            }\n\n            else\n               return png_image_error(image,\n                  \"png_image_finish_read: image too large\");\n         }\n\n         else\n            return png_image_error(image,\n               \"png_image_finish_read: invalid argument\");\n      }\n\n      else\n         return png_image_error(image,\n            \"png_image_finish_read: row_stride too large\");\n   }\n\n   else if (image != NULL)\n      return png_image_error(image,\n         \"png_image_finish_read: damaged PNG_IMAGE_VERSION\");\n\n   return 0;\n}\n\n#endif /* SIMPLIFIED_READ */\n#endif /* READ */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngrio.c",
    "content": "\n/* pngrio.c - functions for data input\n *\n * Last changed in libpng 1.6.17 [March 26, 2015]\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * This file provides a location for all input.  Users who need\n * special handling are expected to write a function that has the same\n * arguments as this and performs a similar function, but that possibly\n * has a different input method.  Note that you shouldn't change this\n * function, but rather write a replacement function and then make\n * libpng use it at run time with png_set_read_fn(...).\n */\n\n#include \"pngpriv.h\"\n\n#ifdef PNG_READ_SUPPORTED\n\n/* Read the data from whatever input you are using.  The default routine\n * reads from a file pointer.  Note that this routine sometimes gets called\n * with very small lengths, so you should implement some kind of simple\n * buffering if you are using unbuffered reads.  This should never be asked\n * to read more than 64K on a 16-bit machine.\n */\nvoid /* PRIVATE */\npng_read_data(png_structrp png_ptr, png_bytep data, png_size_t length)\n{\n   png_debug1(4, \"reading %d bytes\", (int)length);\n\n   if (png_ptr->read_data_fn != NULL)\n      (*(png_ptr->read_data_fn))(png_ptr, data, length);\n\n   else\n      png_error(png_ptr, \"Call to NULL read function\");\n}\n\n#ifdef PNG_STDIO_SUPPORTED\n/* This is the function that does the actual reading of data.  If you are\n * not reading from a standard C stream, you should create a replacement\n * read_data function and use it at run time with png_set_read_fn(), rather\n * than changing the library.\n */\nvoid PNGCBAPI\npng_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)\n{\n   png_size_t check;\n\n   if (png_ptr == NULL)\n      return;\n\n   /* fread() returns 0 on error, so it is OK to store this in a png_size_t\n    * instead of an int, which is what fread() actually returns.\n    */\n   check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr));\n\n   if (check != length)\n      png_error(png_ptr, \"Read Error\");\n}\n#endif\n\n/* This function allows the application to supply a new input function\n * for libpng if standard C streams aren't being used.\n *\n * This function takes as its arguments:\n *\n * png_ptr      - pointer to a png input data structure\n *\n * io_ptr       - pointer to user supplied structure containing info about\n *                the input functions.  May be NULL.\n *\n * read_data_fn - pointer to a new input function that takes as its\n *                arguments a pointer to a png_struct, a pointer to\n *                a location where input data can be stored, and a 32-bit\n *                unsigned int that is the number of bytes to be read.\n *                To exit and output any fatal error messages the new write\n *                function should call png_error(png_ptr, \"Error msg\").\n *                May be NULL, in which case libpng's default function will\n *                be used.\n */\nvoid PNGAPI\npng_set_read_fn(png_structrp png_ptr, png_voidp io_ptr,\n   png_rw_ptr read_data_fn)\n{\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->io_ptr = io_ptr;\n\n#ifdef PNG_STDIO_SUPPORTED\n   if (read_data_fn != NULL)\n      png_ptr->read_data_fn = read_data_fn;\n\n   else\n      png_ptr->read_data_fn = png_default_read_data;\n#else\n   png_ptr->read_data_fn = read_data_fn;\n#endif\n\n#ifdef PNG_WRITE_SUPPORTED\n   /* It is an error to write to a read device */\n   if (png_ptr->write_data_fn != NULL)\n   {\n      png_ptr->write_data_fn = NULL;\n      png_warning(png_ptr,\n          \"Can't set both read_data_fn and write_data_fn in the\"\n          \" same structure\");\n   }\n#endif\n\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\n   png_ptr->output_flush_fn = NULL;\n#endif\n}\n#endif /* READ */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngrtran.c",
    "content": "\n/* pngrtran.c - transforms the data in a row for PNG readers\n *\n * Last changed in libpng 1.6.22 [May 26, 2016]\n * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * This file contains functions optionally called by an application\n * in order to tell libpng how to handle data when reading a PNG.\n * Transformations that are used in both reading and writing are\n * in pngtrans.c.\n */\n\n#include \"pngpriv.h\"\n\n#ifdef PNG_READ_SUPPORTED\n\n/* Set the action on getting a CRC error for an ancillary or critical chunk. */\nvoid PNGAPI\npng_set_crc_action(png_structrp png_ptr, int crit_action, int ancil_action)\n{\n   png_debug(1, \"in png_set_crc_action\");\n\n   if (png_ptr == NULL)\n      return;\n\n   /* Tell libpng how we react to CRC errors in critical chunks */\n   switch (crit_action)\n   {\n      case PNG_CRC_NO_CHANGE:                        /* Leave setting as is */\n         break;\n\n      case PNG_CRC_WARN_USE:                               /* Warn/use data */\n         png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;\n         png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE;\n         break;\n\n      case PNG_CRC_QUIET_USE:                             /* Quiet/use data */\n         png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;\n         png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE |\n                           PNG_FLAG_CRC_CRITICAL_IGNORE;\n         break;\n\n      case PNG_CRC_WARN_DISCARD:    /* Not a valid action for critical data */\n         png_warning(png_ptr,\n            \"Can't discard critical data on CRC error\");\n      case PNG_CRC_ERROR_QUIT:                                /* Error/quit */\n\n      case PNG_CRC_DEFAULT:\n      default:\n         png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;\n         break;\n   }\n\n   /* Tell libpng how we react to CRC errors in ancillary chunks */\n   switch (ancil_action)\n   {\n      case PNG_CRC_NO_CHANGE:                       /* Leave setting as is */\n         break;\n\n      case PNG_CRC_WARN_USE:                              /* Warn/use data */\n         png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;\n         png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE;\n         break;\n\n      case PNG_CRC_QUIET_USE:                            /* Quiet/use data */\n         png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;\n         png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE |\n                           PNG_FLAG_CRC_ANCILLARY_NOWARN;\n         break;\n\n      case PNG_CRC_ERROR_QUIT:                               /* Error/quit */\n         png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;\n         png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN;\n         break;\n\n      case PNG_CRC_WARN_DISCARD:                      /* Warn/discard data */\n\n      case PNG_CRC_DEFAULT:\n      default:\n         png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;\n         break;\n   }\n}\n\n#ifdef PNG_READ_TRANSFORMS_SUPPORTED\n/* Is it OK to set a transformation now?  Only if png_start_read_image or\n * png_read_update_info have not been called.  It is not necessary for the IHDR\n * to have been read in all cases; the need_IHDR parameter allows for this\n * check too.\n */\nstatic int\npng_rtran_ok(png_structrp png_ptr, int need_IHDR)\n{\n   if (png_ptr != NULL)\n   {\n      if ((png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)\n         png_app_error(png_ptr,\n            \"invalid after png_start_read_image or png_read_update_info\");\n\n      else if (need_IHDR && (png_ptr->mode & PNG_HAVE_IHDR) == 0)\n         png_app_error(png_ptr, \"invalid before the PNG header has been read\");\n\n      else\n      {\n         /* Turn on failure to initialize correctly for all transforms. */\n         png_ptr->flags |= PNG_FLAG_DETECT_UNINITIALIZED;\n\n         return 1; /* Ok */\n      }\n   }\n\n   return 0; /* no png_error possible! */\n}\n#endif\n\n#ifdef PNG_READ_BACKGROUND_SUPPORTED\n/* Handle alpha and tRNS via a background color */\nvoid PNGFAPI\npng_set_background_fixed(png_structrp png_ptr,\n    png_const_color_16p background_color, int background_gamma_code,\n    int need_expand, png_fixed_point background_gamma)\n{\n   png_debug(1, \"in png_set_background_fixed\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0 || background_color == NULL)\n      return;\n\n   if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN)\n   {\n      png_warning(png_ptr, \"Application must supply a known background gamma\");\n      return;\n   }\n\n   png_ptr->transformations |= PNG_COMPOSE | PNG_STRIP_ALPHA;\n   png_ptr->transformations &= ~PNG_ENCODE_ALPHA;\n   png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;\n\n   png_ptr->background = *background_color;\n   png_ptr->background_gamma = background_gamma;\n   png_ptr->background_gamma_type = (png_byte)(background_gamma_code);\n   if (need_expand != 0)\n      png_ptr->transformations |= PNG_BACKGROUND_EXPAND;\n   else\n      png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND;\n}\n\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\nvoid PNGAPI\npng_set_background(png_structrp png_ptr,\n    png_const_color_16p background_color, int background_gamma_code,\n    int need_expand, double background_gamma)\n{\n   png_set_background_fixed(png_ptr, background_color, background_gamma_code,\n      need_expand, png_fixed(png_ptr, background_gamma, \"png_set_background\"));\n}\n#  endif /* FLOATING_POINT */\n#endif /* READ_BACKGROUND */\n\n/* Scale 16-bit depth files to 8-bit depth.  If both of these are set then the\n * one that pngrtran does first (scale) happens.  This is necessary to allow the\n * TRANSFORM and API behavior to be somewhat consistent, and it's simpler.\n */\n#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED\nvoid PNGAPI\npng_set_scale_16(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_scale_16\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   png_ptr->transformations |= PNG_SCALE_16_TO_8;\n}\n#endif\n\n#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED\n/* Chop 16-bit depth files to 8-bit depth */\nvoid PNGAPI\npng_set_strip_16(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_strip_16\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   png_ptr->transformations |= PNG_16_TO_8;\n}\n#endif\n\n#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED\nvoid PNGAPI\npng_set_strip_alpha(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_strip_alpha\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   png_ptr->transformations |= PNG_STRIP_ALPHA;\n}\n#endif\n\n#if defined(PNG_READ_ALPHA_MODE_SUPPORTED) || defined(PNG_READ_GAMMA_SUPPORTED)\nstatic png_fixed_point\ntranslate_gamma_flags(png_structrp png_ptr, png_fixed_point output_gamma,\n   int is_screen)\n{\n   /* Check for flag values.  The main reason for having the old Mac value as a\n    * flag is that it is pretty near impossible to work out what the correct\n    * value is from Apple documentation - a working Mac system is needed to\n    * discover the value!\n    */\n   if (output_gamma == PNG_DEFAULT_sRGB ||\n      output_gamma == PNG_FP_1 / PNG_DEFAULT_sRGB)\n   {\n      /* If there is no sRGB support this just sets the gamma to the standard\n       * sRGB value.  (This is a side effect of using this function!)\n       */\n#     ifdef PNG_READ_sRGB_SUPPORTED\n         png_ptr->flags |= PNG_FLAG_ASSUME_sRGB;\n#     else\n         PNG_UNUSED(png_ptr)\n#     endif\n      if (is_screen != 0)\n         output_gamma = PNG_GAMMA_sRGB;\n      else\n         output_gamma = PNG_GAMMA_sRGB_INVERSE;\n   }\n\n   else if (output_gamma == PNG_GAMMA_MAC_18 ||\n      output_gamma == PNG_FP_1 / PNG_GAMMA_MAC_18)\n   {\n      if (is_screen != 0)\n         output_gamma = PNG_GAMMA_MAC_OLD;\n      else\n         output_gamma = PNG_GAMMA_MAC_INVERSE;\n   }\n\n   return output_gamma;\n}\n\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\nstatic png_fixed_point\nconvert_gamma_value(png_structrp png_ptr, double output_gamma)\n{\n   /* The following silently ignores cases where fixed point (times 100,000)\n    * gamma values are passed to the floating point API.  This is safe and it\n    * means the fixed point constants work just fine with the floating point\n    * API.  The alternative would just lead to undetected errors and spurious\n    * bug reports.  Negative values fail inside the _fixed API unless they\n    * correspond to the flag values.\n    */\n   if (output_gamma > 0 && output_gamma < 128)\n      output_gamma *= PNG_FP_1;\n\n   /* This preserves -1 and -2 exactly: */\n   output_gamma = floor(output_gamma + .5);\n\n   if (output_gamma > PNG_FP_MAX || output_gamma < PNG_FP_MIN)\n      png_fixed_error(png_ptr, \"gamma value\");\n\n   return (png_fixed_point)output_gamma;\n}\n#  endif\n#endif /* READ_ALPHA_MODE || READ_GAMMA */\n\n#ifdef PNG_READ_ALPHA_MODE_SUPPORTED\nvoid PNGFAPI\npng_set_alpha_mode_fixed(png_structrp png_ptr, int mode,\n   png_fixed_point output_gamma)\n{\n   int compose = 0;\n   png_fixed_point file_gamma;\n\n   png_debug(1, \"in png_set_alpha_mode\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   output_gamma = translate_gamma_flags(png_ptr, output_gamma, 1/*screen*/);\n\n   /* Validate the value to ensure it is in a reasonable range. The value\n    * is expected to be 1 or greater, but this range test allows for some\n    * viewing correction values.  The intent is to weed out users of this API\n    * who use the inverse of the gamma value accidentally!  Since some of these\n    * values are reasonable this may have to be changed:\n    *\n    * 1.6.x: changed from 0.07..3 to 0.01..100 (to accomodate the optimal 16-bit\n    * gamma of 36, and its reciprocal.)\n    */\n   if (output_gamma < 1000 || output_gamma > 10000000)\n      png_error(png_ptr, \"output gamma out of expected range\");\n\n   /* The default file gamma is the inverse of the output gamma; the output\n    * gamma may be changed below so get the file value first:\n    */\n   file_gamma = png_reciprocal(output_gamma);\n\n   /* There are really 8 possibilities here, composed of any combination\n    * of:\n    *\n    *    premultiply the color channels\n    *    do not encode non-opaque pixels\n    *    encode the alpha as well as the color channels\n    *\n    * The differences disappear if the input/output ('screen') gamma is 1.0,\n    * because then the encoding is a no-op and there is only the choice of\n    * premultiplying the color channels or not.\n    *\n    * png_set_alpha_mode and png_set_background interact because both use\n    * png_compose to do the work.  Calling both is only useful when\n    * png_set_alpha_mode is used to set the default mode - PNG_ALPHA_PNG - along\n    * with a default gamma value.  Otherwise PNG_COMPOSE must not be set.\n    */\n   switch (mode)\n   {\n      case PNG_ALPHA_PNG:        /* default: png standard */\n         /* No compose, but it may be set by png_set_background! */\n         png_ptr->transformations &= ~PNG_ENCODE_ALPHA;\n         png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;\n         break;\n\n      case PNG_ALPHA_ASSOCIATED: /* color channels premultiplied */\n         compose = 1;\n         png_ptr->transformations &= ~PNG_ENCODE_ALPHA;\n         png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;\n         /* The output is linear: */\n         output_gamma = PNG_FP_1;\n         break;\n\n      case PNG_ALPHA_OPTIMIZED:  /* associated, non-opaque pixels linear */\n         compose = 1;\n         png_ptr->transformations &= ~PNG_ENCODE_ALPHA;\n         png_ptr->flags |= PNG_FLAG_OPTIMIZE_ALPHA;\n         /* output_gamma records the encoding of opaque pixels! */\n         break;\n\n      case PNG_ALPHA_BROKEN:     /* associated, non-linear, alpha encoded */\n         compose = 1;\n         png_ptr->transformations |= PNG_ENCODE_ALPHA;\n         png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;\n         break;\n\n      default:\n         png_error(png_ptr, \"invalid alpha mode\");\n   }\n\n   /* Only set the default gamma if the file gamma has not been set (this has\n    * the side effect that the gamma in a second call to png_set_alpha_mode will\n    * be ignored.)\n    */\n   if (png_ptr->colorspace.gamma == 0)\n   {\n      png_ptr->colorspace.gamma = file_gamma;\n      png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;\n   }\n\n   /* But always set the output gamma: */\n   png_ptr->screen_gamma = output_gamma;\n\n   /* Finally, if pre-multiplying, set the background fields to achieve the\n    * desired result.\n    */\n   if (compose != 0)\n   {\n      /* And obtain alpha pre-multiplication by composing on black: */\n      memset(&png_ptr->background, 0, (sizeof png_ptr->background));\n      png_ptr->background_gamma = png_ptr->colorspace.gamma; /* just in case */\n      png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_FILE;\n      png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND;\n\n      if ((png_ptr->transformations & PNG_COMPOSE) != 0)\n         png_error(png_ptr,\n            \"conflicting calls to set alpha mode and background\");\n\n      png_ptr->transformations |= PNG_COMPOSE;\n   }\n}\n\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\nvoid PNGAPI\npng_set_alpha_mode(png_structrp png_ptr, int mode, double output_gamma)\n{\n   png_set_alpha_mode_fixed(png_ptr, mode, convert_gamma_value(png_ptr,\n      output_gamma));\n}\n#  endif\n#endif\n\n#ifdef PNG_READ_QUANTIZE_SUPPORTED\n/* Dither file to 8-bit.  Supply a palette, the current number\n * of elements in the palette, the maximum number of elements\n * allowed, and a histogram if possible.  If the current number\n * of colors is greater than the maximum number, the palette will be\n * modified to fit in the maximum number.  \"full_quantize\" indicates\n * whether we need a quantizing cube set up for RGB images, or if we\n * simply are reducing the number of colors in a paletted image.\n */\n\ntypedef struct png_dsort_struct\n{\n   struct png_dsort_struct * next;\n   png_byte left;\n   png_byte right;\n} png_dsort;\ntypedef png_dsort *   png_dsortp;\ntypedef png_dsort * * png_dsortpp;\n\nvoid PNGAPI\npng_set_quantize(png_structrp png_ptr, png_colorp palette,\n    int num_palette, int maximum_colors, png_const_uint_16p histogram,\n    int full_quantize)\n{\n   png_debug(1, \"in png_set_quantize\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   png_ptr->transformations |= PNG_QUANTIZE;\n\n   if (full_quantize == 0)\n   {\n      int i;\n\n      png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr,\n          (png_uint_32)(num_palette * (sizeof (png_byte))));\n      for (i = 0; i < num_palette; i++)\n         png_ptr->quantize_index[i] = (png_byte)i;\n   }\n\n   if (num_palette > maximum_colors)\n   {\n      if (histogram != NULL)\n      {\n         /* This is easy enough, just throw out the least used colors.\n          * Perhaps not the best solution, but good enough.\n          */\n\n         int i;\n\n         /* Initialize an array to sort colors */\n         png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr,\n             (png_uint_32)(num_palette * (sizeof (png_byte))));\n\n         /* Initialize the quantize_sort array */\n         for (i = 0; i < num_palette; i++)\n            png_ptr->quantize_sort[i] = (png_byte)i;\n\n         /* Find the least used palette entries by starting a\n          * bubble sort, and running it until we have sorted\n          * out enough colors.  Note that we don't care about\n          * sorting all the colors, just finding which are\n          * least used.\n          */\n\n         for (i = num_palette - 1; i >= maximum_colors; i--)\n         {\n            int done; /* To stop early if the list is pre-sorted */\n            int j;\n\n            done = 1;\n            for (j = 0; j < i; j++)\n            {\n               if (histogram[png_ptr->quantize_sort[j]]\n                   < histogram[png_ptr->quantize_sort[j + 1]])\n               {\n                  png_byte t;\n\n                  t = png_ptr->quantize_sort[j];\n                  png_ptr->quantize_sort[j] = png_ptr->quantize_sort[j + 1];\n                  png_ptr->quantize_sort[j + 1] = t;\n                  done = 0;\n               }\n            }\n\n            if (done != 0)\n               break;\n         }\n\n         /* Swap the palette around, and set up a table, if necessary */\n         if (full_quantize != 0)\n         {\n            int j = num_palette;\n\n            /* Put all the useful colors within the max, but don't\n             * move the others.\n             */\n            for (i = 0; i < maximum_colors; i++)\n            {\n               if ((int)png_ptr->quantize_sort[i] >= maximum_colors)\n               {\n                  do\n                     j--;\n                  while ((int)png_ptr->quantize_sort[j] >= maximum_colors);\n\n                  palette[i] = palette[j];\n               }\n            }\n         }\n         else\n         {\n            int j = num_palette;\n\n            /* Move all the used colors inside the max limit, and\n             * develop a translation table.\n             */\n            for (i = 0; i < maximum_colors; i++)\n            {\n               /* Only move the colors we need to */\n               if ((int)png_ptr->quantize_sort[i] >= maximum_colors)\n               {\n                  png_color tmp_color;\n\n                  do\n                     j--;\n                  while ((int)png_ptr->quantize_sort[j] >= maximum_colors);\n\n                  tmp_color = palette[j];\n                  palette[j] = palette[i];\n                  palette[i] = tmp_color;\n                  /* Indicate where the color went */\n                  png_ptr->quantize_index[j] = (png_byte)i;\n                  png_ptr->quantize_index[i] = (png_byte)j;\n               }\n            }\n\n            /* Find closest color for those colors we are not using */\n            for (i = 0; i < num_palette; i++)\n            {\n               if ((int)png_ptr->quantize_index[i] >= maximum_colors)\n               {\n                  int min_d, k, min_k, d_index;\n\n                  /* Find the closest color to one we threw out */\n                  d_index = png_ptr->quantize_index[i];\n                  min_d = PNG_COLOR_DIST(palette[d_index], palette[0]);\n                  for (k = 1, min_k = 0; k < maximum_colors; k++)\n                  {\n                     int d;\n\n                     d = PNG_COLOR_DIST(palette[d_index], palette[k]);\n\n                     if (d < min_d)\n                     {\n                        min_d = d;\n                        min_k = k;\n                     }\n                  }\n                  /* Point to closest color */\n                  png_ptr->quantize_index[i] = (png_byte)min_k;\n               }\n            }\n         }\n         png_free(png_ptr, png_ptr->quantize_sort);\n         png_ptr->quantize_sort = NULL;\n      }\n      else\n      {\n         /* This is much harder to do simply (and quickly).  Perhaps\n          * we need to go through a median cut routine, but those\n          * don't always behave themselves with only a few colors\n          * as input.  So we will just find the closest two colors,\n          * and throw out one of them (chosen somewhat randomly).\n          * [We don't understand this at all, so if someone wants to\n          *  work on improving it, be our guest - AED, GRP]\n          */\n         int i;\n         int max_d;\n         int num_new_palette;\n         png_dsortp t;\n         png_dsortpp hash;\n\n         t = NULL;\n\n         /* Initialize palette index arrays */\n         png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr,\n             (png_uint_32)(num_palette * (sizeof (png_byte))));\n         png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr,\n             (png_uint_32)(num_palette * (sizeof (png_byte))));\n\n         /* Initialize the sort array */\n         for (i = 0; i < num_palette; i++)\n         {\n            png_ptr->index_to_palette[i] = (png_byte)i;\n            png_ptr->palette_to_index[i] = (png_byte)i;\n         }\n\n         hash = (png_dsortpp)png_calloc(png_ptr, (png_uint_32)(769 *\n             (sizeof (png_dsortp))));\n\n         num_new_palette = num_palette;\n\n         /* Initial wild guess at how far apart the farthest pixel\n          * pair we will be eliminating will be.  Larger\n          * numbers mean more areas will be allocated, Smaller\n          * numbers run the risk of not saving enough data, and\n          * having to do this all over again.\n          *\n          * I have not done extensive checking on this number.\n          */\n         max_d = 96;\n\n         while (num_new_palette > maximum_colors)\n         {\n            for (i = 0; i < num_new_palette - 1; i++)\n            {\n               int j;\n\n               for (j = i + 1; j < num_new_palette; j++)\n               {\n                  int d;\n\n                  d = PNG_COLOR_DIST(palette[i], palette[j]);\n\n                  if (d <= max_d)\n                  {\n\n                     t = (png_dsortp)png_malloc_warn(png_ptr,\n                         (png_uint_32)(sizeof (png_dsort)));\n\n                     if (t == NULL)\n                         break;\n\n                     t->next = hash[d];\n                     t->left = (png_byte)i;\n                     t->right = (png_byte)j;\n                     hash[d] = t;\n                  }\n               }\n               if (t == NULL)\n                  break;\n            }\n\n            if (t != NULL)\n            for (i = 0; i <= max_d; i++)\n            {\n               if (hash[i] != NULL)\n               {\n                  png_dsortp p;\n\n                  for (p = hash[i]; p; p = p->next)\n                  {\n                     if ((int)png_ptr->index_to_palette[p->left]\n                         < num_new_palette &&\n                         (int)png_ptr->index_to_palette[p->right]\n                         < num_new_palette)\n                     {\n                        int j, next_j;\n\n                        if (num_new_palette & 0x01)\n                        {\n                           j = p->left;\n                           next_j = p->right;\n                        }\n                        else\n                        {\n                           j = p->right;\n                           next_j = p->left;\n                        }\n\n                        num_new_palette--;\n                        palette[png_ptr->index_to_palette[j]]\n                            = palette[num_new_palette];\n                        if (full_quantize == 0)\n                        {\n                           int k;\n\n                           for (k = 0; k < num_palette; k++)\n                           {\n                              if (png_ptr->quantize_index[k] ==\n                                  png_ptr->index_to_palette[j])\n                                 png_ptr->quantize_index[k] =\n                                     png_ptr->index_to_palette[next_j];\n\n                              if ((int)png_ptr->quantize_index[k] ==\n                                  num_new_palette)\n                                 png_ptr->quantize_index[k] =\n                                     png_ptr->index_to_palette[j];\n                           }\n                        }\n\n                        png_ptr->index_to_palette[png_ptr->palette_to_index\n                            [num_new_palette]] = png_ptr->index_to_palette[j];\n\n                        png_ptr->palette_to_index[png_ptr->index_to_palette[j]]\n                            = png_ptr->palette_to_index[num_new_palette];\n\n                        png_ptr->index_to_palette[j] =\n                            (png_byte)num_new_palette;\n\n                        png_ptr->palette_to_index[num_new_palette] =\n                            (png_byte)j;\n                     }\n                     if (num_new_palette <= maximum_colors)\n                        break;\n                  }\n                  if (num_new_palette <= maximum_colors)\n                     break;\n               }\n            }\n\n            for (i = 0; i < 769; i++)\n            {\n               if (hash[i] != NULL)\n               {\n                  png_dsortp p = hash[i];\n                  while (p)\n                  {\n                     t = p->next;\n                     png_free(png_ptr, p);\n                     p = t;\n                  }\n               }\n               hash[i] = 0;\n            }\n            max_d += 96;\n         }\n         png_free(png_ptr, hash);\n         png_free(png_ptr, png_ptr->palette_to_index);\n         png_free(png_ptr, png_ptr->index_to_palette);\n         png_ptr->palette_to_index = NULL;\n         png_ptr->index_to_palette = NULL;\n      }\n      num_palette = maximum_colors;\n   }\n   if (png_ptr->palette == NULL)\n   {\n      png_ptr->palette = palette;\n   }\n   png_ptr->num_palette = (png_uint_16)num_palette;\n\n   if (full_quantize != 0)\n   {\n      int i;\n      png_bytep distance;\n      int total_bits = PNG_QUANTIZE_RED_BITS + PNG_QUANTIZE_GREEN_BITS +\n          PNG_QUANTIZE_BLUE_BITS;\n      int num_red = (1 << PNG_QUANTIZE_RED_BITS);\n      int num_green = (1 << PNG_QUANTIZE_GREEN_BITS);\n      int num_blue = (1 << PNG_QUANTIZE_BLUE_BITS);\n      png_size_t num_entries = ((png_size_t)1 << total_bits);\n\n      png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr,\n          (png_uint_32)(num_entries * (sizeof (png_byte))));\n\n      distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries *\n          (sizeof (png_byte))));\n\n      memset(distance, 0xff, num_entries * (sizeof (png_byte)));\n\n      for (i = 0; i < num_palette; i++)\n      {\n         int ir, ig, ib;\n         int r = (palette[i].red >> (8 - PNG_QUANTIZE_RED_BITS));\n         int g = (palette[i].green >> (8 - PNG_QUANTIZE_GREEN_BITS));\n         int b = (palette[i].blue >> (8 - PNG_QUANTIZE_BLUE_BITS));\n\n         for (ir = 0; ir < num_red; ir++)\n         {\n            /* int dr = abs(ir - r); */\n            int dr = ((ir > r) ? ir - r : r - ir);\n            int index_r = (ir << (PNG_QUANTIZE_BLUE_BITS +\n                PNG_QUANTIZE_GREEN_BITS));\n\n            for (ig = 0; ig < num_green; ig++)\n            {\n               /* int dg = abs(ig - g); */\n               int dg = ((ig > g) ? ig - g : g - ig);\n               int dt = dr + dg;\n               int dm = ((dr > dg) ? dr : dg);\n               int index_g = index_r | (ig << PNG_QUANTIZE_BLUE_BITS);\n\n               for (ib = 0; ib < num_blue; ib++)\n               {\n                  int d_index = index_g | ib;\n                  /* int db = abs(ib - b); */\n                  int db = ((ib > b) ? ib - b : b - ib);\n                  int dmax = ((dm > db) ? dm : db);\n                  int d = dmax + dt + db;\n\n                  if (d < (int)distance[d_index])\n                  {\n                     distance[d_index] = (png_byte)d;\n                     png_ptr->palette_lookup[d_index] = (png_byte)i;\n                  }\n               }\n            }\n         }\n      }\n\n      png_free(png_ptr, distance);\n   }\n}\n#endif /* READ_QUANTIZE */\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\nvoid PNGFAPI\npng_set_gamma_fixed(png_structrp png_ptr, png_fixed_point scrn_gamma,\n   png_fixed_point file_gamma)\n{\n   png_debug(1, \"in png_set_gamma_fixed\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   /* New in libpng-1.5.4 - reserve particular negative values as flags. */\n   scrn_gamma = translate_gamma_flags(png_ptr, scrn_gamma, 1/*screen*/);\n   file_gamma = translate_gamma_flags(png_ptr, file_gamma, 0/*file*/);\n\n   /* Checking the gamma values for being >0 was added in 1.5.4 along with the\n    * premultiplied alpha support; this actually hides an undocumented feature\n    * of the previous implementation which allowed gamma processing to be\n    * disabled in background handling.  There is no evidence (so far) that this\n    * was being used; however, png_set_background itself accepted and must still\n    * accept '0' for the gamma value it takes, because it isn't always used.\n    *\n    * Since this is an API change (albeit a very minor one that removes an\n    * undocumented API feature) the following checks were only enabled in\n    * libpng-1.6.0.\n    */\n   if (file_gamma <= 0)\n      png_error(png_ptr, \"invalid file gamma in png_set_gamma\");\n\n   if (scrn_gamma <= 0)\n      png_error(png_ptr, \"invalid screen gamma in png_set_gamma\");\n\n   /* Set the gamma values unconditionally - this overrides the value in the PNG\n    * file if a gAMA chunk was present.  png_set_alpha_mode provides a\n    * different, easier, way to default the file gamma.\n    */\n   png_ptr->colorspace.gamma = file_gamma;\n   png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;\n   png_ptr->screen_gamma = scrn_gamma;\n}\n\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\nvoid PNGAPI\npng_set_gamma(png_structrp png_ptr, double scrn_gamma, double file_gamma)\n{\n   png_set_gamma_fixed(png_ptr, convert_gamma_value(png_ptr, scrn_gamma),\n      convert_gamma_value(png_ptr, file_gamma));\n}\n#  endif /* FLOATING_POINT */\n#endif /* READ_GAMMA */\n\n#ifdef PNG_READ_EXPAND_SUPPORTED\n/* Expand paletted images to RGB, expand grayscale images of\n * less than 8-bit depth to 8-bit depth, and expand tRNS chunks\n * to alpha channels.\n */\nvoid PNGAPI\npng_set_expand(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_expand\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);\n}\n\n/* GRR 19990627:  the following three functions currently are identical\n *  to png_set_expand().  However, it is entirely reasonable that someone\n *  might wish to expand an indexed image to RGB but *not* expand a single,\n *  fully transparent palette entry to a full alpha channel--perhaps instead\n *  convert tRNS to the grayscale/RGB format (16-bit RGB value), or replace\n *  the transparent color with a particular RGB value, or drop tRNS entirely.\n *  IOW, a future version of the library may make the transformations flag\n *  a bit more fine-grained, with separate bits for each of these three\n *  functions.\n *\n *  More to the point, these functions make it obvious what libpng will be\n *  doing, whereas \"expand\" can (and does) mean any number of things.\n *\n *  GRP 20060307: In libpng-1.2.9, png_set_gray_1_2_4_to_8() was modified\n *  to expand only the sample depth but not to expand the tRNS to alpha\n *  and its name was changed to png_set_expand_gray_1_2_4_to_8().\n */\n\n/* Expand paletted images to RGB. */\nvoid PNGAPI\npng_set_palette_to_rgb(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_palette_to_rgb\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);\n}\n\n/* Expand grayscale images of less than 8-bit depth to 8 bits. */\nvoid PNGAPI\npng_set_expand_gray_1_2_4_to_8(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_expand_gray_1_2_4_to_8\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   png_ptr->transformations |= PNG_EXPAND;\n}\n\n/* Expand tRNS chunks to alpha channels. */\nvoid PNGAPI\npng_set_tRNS_to_alpha(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_tRNS_to_alpha\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);\n}\n#endif /* READ_EXPAND */\n\n#ifdef PNG_READ_EXPAND_16_SUPPORTED\n/* Expand to 16-bit channels, expand the tRNS chunk too (because otherwise\n * it may not work correctly.)\n */\nvoid PNGAPI\npng_set_expand_16(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_expand_16\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   png_ptr->transformations |= (PNG_EXPAND_16 | PNG_EXPAND | PNG_EXPAND_tRNS);\n}\n#endif\n\n#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED\nvoid PNGAPI\npng_set_gray_to_rgb(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_gray_to_rgb\");\n\n   if (png_rtran_ok(png_ptr, 0) == 0)\n      return;\n\n   /* Because rgb must be 8 bits or more: */\n   png_set_expand_gray_1_2_4_to_8(png_ptr);\n   png_ptr->transformations |= PNG_GRAY_TO_RGB;\n}\n#endif\n\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\nvoid PNGFAPI\npng_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action,\n    png_fixed_point red, png_fixed_point green)\n{\n   png_debug(1, \"in png_set_rgb_to_gray\");\n\n   /* Need the IHDR here because of the check on color_type below. */\n   /* TODO: fix this */\n   if (png_rtran_ok(png_ptr, 1) == 0)\n      return;\n\n   switch (error_action)\n   {\n      case PNG_ERROR_ACTION_NONE:\n         png_ptr->transformations |= PNG_RGB_TO_GRAY;\n         break;\n\n      case PNG_ERROR_ACTION_WARN:\n         png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN;\n         break;\n\n      case PNG_ERROR_ACTION_ERROR:\n         png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR;\n         break;\n\n      default:\n         png_error(png_ptr, \"invalid error action to rgb_to_gray\");\n   }\n\n   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n#ifdef PNG_READ_EXPAND_SUPPORTED\n      png_ptr->transformations |= PNG_EXPAND;\n#else\n   {\n      /* Make this an error in 1.6 because otherwise the application may assume\n       * that it just worked and get a memory overwrite.\n       */\n      png_error(png_ptr,\n        \"Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED\");\n\n      /* png_ptr->transformations &= ~PNG_RGB_TO_GRAY; */\n   }\n#endif\n   {\n      if (red >= 0 && green >= 0 && red + green <= PNG_FP_1)\n      {\n         png_uint_16 red_int, green_int;\n\n         /* NOTE: this calculation does not round, but this behavior is retained\n          * for consistency; the inaccuracy is very small.  The code here always\n          * overwrites the coefficients, regardless of whether they have been\n          * defaulted or set already.\n          */\n         red_int = (png_uint_16)(((png_uint_32)red*32768)/100000);\n         green_int = (png_uint_16)(((png_uint_32)green*32768)/100000);\n\n         png_ptr->rgb_to_gray_red_coeff   = red_int;\n         png_ptr->rgb_to_gray_green_coeff = green_int;\n         png_ptr->rgb_to_gray_coefficients_set = 1;\n      }\n\n      else\n      {\n         if (red >= 0 && green >= 0)\n            png_app_warning(png_ptr,\n               \"ignoring out of range rgb_to_gray coefficients\");\n\n         /* Use the defaults, from the cHRM chunk if set, else the historical\n          * values which are close to the sRGB/HDTV/ITU-Rec 709 values.  See\n          * png_do_rgb_to_gray for more discussion of the values.  In this case\n          * the coefficients are not marked as 'set' and are not overwritten if\n          * something has already provided a default.\n          */\n         if (png_ptr->rgb_to_gray_red_coeff == 0 &&\n            png_ptr->rgb_to_gray_green_coeff == 0)\n         {\n            png_ptr->rgb_to_gray_red_coeff   = 6968;\n            png_ptr->rgb_to_gray_green_coeff = 23434;\n            /* png_ptr->rgb_to_gray_blue_coeff  = 2366; */\n         }\n      }\n   }\n}\n\n#ifdef PNG_FLOATING_POINT_SUPPORTED\n/* Convert a RGB image to a grayscale of the same width.  This allows us,\n * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image.\n */\n\nvoid PNGAPI\npng_set_rgb_to_gray(png_structrp png_ptr, int error_action, double red,\n   double green)\n{\n   png_set_rgb_to_gray_fixed(png_ptr, error_action,\n      png_fixed(png_ptr, red, \"rgb to gray red coefficient\"),\n      png_fixed(png_ptr, green, \"rgb to gray green coefficient\"));\n}\n#endif /* FLOATING POINT */\n\n#endif /* RGB_TO_GRAY */\n\n#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \\\n    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)\nvoid PNGAPI\npng_set_read_user_transform_fn(png_structrp png_ptr, png_user_transform_ptr\n    read_user_transform_fn)\n{\n   png_debug(1, \"in png_set_read_user_transform_fn\");\n\n#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED\n   png_ptr->transformations |= PNG_USER_TRANSFORM;\n   png_ptr->read_user_transform_fn = read_user_transform_fn;\n#endif\n}\n#endif\n\n#ifdef PNG_READ_TRANSFORMS_SUPPORTED\n#ifdef PNG_READ_GAMMA_SUPPORTED\n/* In the case of gamma transformations only do transformations on images where\n * the [file] gamma and screen_gamma are not close reciprocals, otherwise it\n * slows things down slightly, and also needlessly introduces small errors.\n */\nstatic int /* PRIVATE */\npng_gamma_threshold(png_fixed_point screen_gamma, png_fixed_point file_gamma)\n{\n   /* PNG_GAMMA_THRESHOLD is the threshold for performing gamma\n    * correction as a difference of the overall transform from 1.0\n    *\n    * We want to compare the threshold with s*f - 1, if we get\n    * overflow here it is because of wacky gamma values so we\n    * turn on processing anyway.\n    */\n   png_fixed_point gtest;\n   return !png_muldiv(&gtest, screen_gamma, file_gamma, PNG_FP_1) ||\n       png_gamma_significant(gtest);\n}\n#endif\n\n/* Initialize everything needed for the read.  This includes modifying\n * the palette.\n */\n\n/* For the moment 'png_init_palette_transformations' and\n * 'png_init_rgb_transformations' only do some flag canceling optimizations.\n * The intent is that these two routines should have palette or rgb operations\n * extracted from 'png_init_read_transformations'.\n */\nstatic void /* PRIVATE */\npng_init_palette_transformations(png_structrp png_ptr)\n{\n   /* Called to handle the (input) palette case.  In png_do_read_transformations\n    * the first step is to expand the palette if requested, so this code must\n    * take care to only make changes that are invariant with respect to the\n    * palette expansion, or only do them if there is no expansion.\n    *\n    * STRIP_ALPHA has already been handled in the caller (by setting num_trans\n    * to 0.)\n    */\n   int input_has_alpha = 0;\n   int input_has_transparency = 0;\n\n   if (png_ptr->num_trans > 0)\n   {\n      int i;\n\n      /* Ignore if all the entries are opaque (unlikely!) */\n      for (i=0; i<png_ptr->num_trans; ++i)\n      {\n         if (png_ptr->trans_alpha[i] == 255)\n            continue;\n         else if (png_ptr->trans_alpha[i] == 0)\n            input_has_transparency = 1;\n         else\n         {\n            input_has_transparency = 1;\n            input_has_alpha = 1;\n            break;\n         }\n      }\n   }\n\n   /* If no alpha we can optimize. */\n   if (input_has_alpha == 0)\n   {\n      /* Any alpha means background and associative alpha processing is\n       * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA\n       * and ENCODE_ALPHA are irrelevant.\n       */\n      png_ptr->transformations &= ~PNG_ENCODE_ALPHA;\n      png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;\n\n      if (input_has_transparency == 0)\n         png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND);\n   }\n\n#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)\n   /* png_set_background handling - deals with the complexity of whether the\n    * background color is in the file format or the screen format in the case\n    * where an 'expand' will happen.\n    */\n\n   /* The following code cannot be entered in the alpha pre-multiplication case\n    * because PNG_BACKGROUND_EXPAND is cancelled below.\n    */\n   if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0 &&\n       (png_ptr->transformations & PNG_EXPAND) != 0)\n   {\n      {\n         png_ptr->background.red   =\n             png_ptr->palette[png_ptr->background.index].red;\n         png_ptr->background.green =\n             png_ptr->palette[png_ptr->background.index].green;\n         png_ptr->background.blue  =\n             png_ptr->palette[png_ptr->background.index].blue;\n\n#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED\n        if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)\n        {\n           if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0)\n           {\n              /* Invert the alpha channel (in tRNS) unless the pixels are\n               * going to be expanded, in which case leave it for later\n               */\n              int i, istop = png_ptr->num_trans;\n\n              for (i=0; i<istop; i++)\n                 png_ptr->trans_alpha[i] = (png_byte)(255 -\n                    png_ptr->trans_alpha[i]);\n           }\n        }\n#endif /* READ_INVERT_ALPHA */\n      }\n   } /* background expand and (therefore) no alpha association. */\n#endif /* READ_EXPAND && READ_BACKGROUND */\n}\n\nstatic void /* PRIVATE */\npng_init_rgb_transformations(png_structrp png_ptr)\n{\n   /* Added to libpng-1.5.4: check the color type to determine whether there\n    * is any alpha or transparency in the image and simply cancel the\n    * background and alpha mode stuff if there isn't.\n    */\n   int input_has_alpha = (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0;\n   int input_has_transparency = png_ptr->num_trans > 0;\n\n   /* If no alpha we can optimize. */\n   if (input_has_alpha == 0)\n   {\n      /* Any alpha means background and associative alpha processing is\n       * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA\n       * and ENCODE_ALPHA are irrelevant.\n       */\n#     ifdef PNG_READ_ALPHA_MODE_SUPPORTED\n         png_ptr->transformations &= ~PNG_ENCODE_ALPHA;\n         png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;\n#     endif\n\n      if (input_has_transparency == 0)\n         png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND);\n   }\n\n#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)\n   /* png_set_background handling - deals with the complexity of whether the\n    * background color is in the file format or the screen format in the case\n    * where an 'expand' will happen.\n    */\n\n   /* The following code cannot be entered in the alpha pre-multiplication case\n    * because PNG_BACKGROUND_EXPAND is cancelled below.\n    */\n   if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0 &&\n       (png_ptr->transformations & PNG_EXPAND) != 0 &&\n       (png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)\n       /* i.e., GRAY or GRAY_ALPHA */\n   {\n      {\n         /* Expand background and tRNS chunks */\n         int gray = png_ptr->background.gray;\n         int trans_gray = png_ptr->trans_color.gray;\n\n         switch (png_ptr->bit_depth)\n         {\n            case 1:\n               gray *= 0xff;\n               trans_gray *= 0xff;\n               break;\n\n            case 2:\n               gray *= 0x55;\n               trans_gray *= 0x55;\n               break;\n\n            case 4:\n               gray *= 0x11;\n               trans_gray *= 0x11;\n               break;\n\n            default:\n\n            case 8:\n               /* FALL THROUGH (Already 8 bits) */\n\n            case 16:\n               /* Already a full 16 bits */\n               break;\n         }\n\n         png_ptr->background.red = png_ptr->background.green =\n            png_ptr->background.blue = (png_uint_16)gray;\n\n         if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0)\n         {\n            png_ptr->trans_color.red = png_ptr->trans_color.green =\n               png_ptr->trans_color.blue = (png_uint_16)trans_gray;\n         }\n      }\n   } /* background expand and (therefore) no alpha association. */\n#endif /* READ_EXPAND && READ_BACKGROUND */\n}\n\nvoid /* PRIVATE */\npng_init_read_transformations(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_init_read_transformations\");\n\n   /* This internal function is called from png_read_start_row in pngrutil.c\n    * and it is called before the 'rowbytes' calculation is done, so the code\n    * in here can change or update the transformations flags.\n    *\n    * First do updates that do not depend on the details of the PNG image data\n    * being processed.\n    */\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n   /* Prior to 1.5.4 these tests were performed from png_set_gamma, 1.5.4 adds\n    * png_set_alpha_mode and this is another source for a default file gamma so\n    * the test needs to be performed later - here.  In addition prior to 1.5.4\n    * the tests were repeated for the PALETTE color type here - this is no\n    * longer necessary (and doesn't seem to have been necessary before.)\n    */\n   {\n      /* The following temporary indicates if overall gamma correction is\n       * required.\n       */\n      int gamma_correction = 0;\n\n      if (png_ptr->colorspace.gamma != 0) /* has been set */\n      {\n         if (png_ptr->screen_gamma != 0) /* screen set too */\n            gamma_correction = png_gamma_threshold(png_ptr->colorspace.gamma,\n               png_ptr->screen_gamma);\n\n         else\n            /* Assume the output matches the input; a long time default behavior\n             * of libpng, although the standard has nothing to say about this.\n             */\n            png_ptr->screen_gamma = png_reciprocal(png_ptr->colorspace.gamma);\n      }\n\n      else if (png_ptr->screen_gamma != 0)\n         /* The converse - assume the file matches the screen, note that this\n          * perhaps undesireable default can (from 1.5.4) be changed by calling\n          * png_set_alpha_mode (even if the alpha handling mode isn't required\n          * or isn't changed from the default.)\n          */\n         png_ptr->colorspace.gamma = png_reciprocal(png_ptr->screen_gamma);\n\n      else /* neither are set */\n         /* Just in case the following prevents any processing - file and screen\n          * are both assumed to be linear and there is no way to introduce a\n          * third gamma value other than png_set_background with 'UNIQUE', and,\n          * prior to 1.5.4\n          */\n         png_ptr->screen_gamma = png_ptr->colorspace.gamma = PNG_FP_1;\n\n      /* We have a gamma value now. */\n      png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;\n\n      /* Now turn the gamma transformation on or off as appropriate.  Notice\n       * that PNG_GAMMA just refers to the file->screen correction.  Alpha\n       * composition may independently cause gamma correction because it needs\n       * linear data (e.g. if the file has a gAMA chunk but the screen gamma\n       * hasn't been specified.)  In any case this flag may get turned off in\n       * the code immediately below if the transform can be handled outside the\n       * row loop.\n       */\n      if (gamma_correction != 0)\n         png_ptr->transformations |= PNG_GAMMA;\n\n      else\n         png_ptr->transformations &= ~PNG_GAMMA;\n   }\n#endif\n\n   /* Certain transformations have the effect of preventing other\n    * transformations that happen afterward in png_do_read_transformations;\n    * resolve the interdependencies here.  From the code of\n    * png_do_read_transformations the order is:\n    *\n    *  1) PNG_EXPAND (including PNG_EXPAND_tRNS)\n    *  2) PNG_STRIP_ALPHA (if no compose)\n    *  3) PNG_RGB_TO_GRAY\n    *  4) PNG_GRAY_TO_RGB iff !PNG_BACKGROUND_IS_GRAY\n    *  5) PNG_COMPOSE\n    *  6) PNG_GAMMA\n    *  7) PNG_STRIP_ALPHA (if compose)\n    *  8) PNG_ENCODE_ALPHA\n    *  9) PNG_SCALE_16_TO_8\n    * 10) PNG_16_TO_8\n    * 11) PNG_QUANTIZE (converts to palette)\n    * 12) PNG_EXPAND_16\n    * 13) PNG_GRAY_TO_RGB iff PNG_BACKGROUND_IS_GRAY\n    * 14) PNG_INVERT_MONO\n    * 15) PNG_INVERT_ALPHA\n    * 16) PNG_SHIFT\n    * 17) PNG_PACK\n    * 18) PNG_BGR\n    * 19) PNG_PACKSWAP\n    * 20) PNG_FILLER (includes PNG_ADD_ALPHA)\n    * 21) PNG_SWAP_ALPHA\n    * 22) PNG_SWAP_BYTES\n    * 23) PNG_USER_TRANSFORM [must be last]\n    */\n#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED\n   if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 &&\n       (png_ptr->transformations & PNG_COMPOSE) == 0)\n   {\n      /* Stripping the alpha channel happens immediately after the 'expand'\n       * transformations, before all other transformation, so it cancels out\n       * the alpha handling.  It has the side effect negating the effect of\n       * PNG_EXPAND_tRNS too:\n       */\n      png_ptr->transformations &= ~(PNG_BACKGROUND_EXPAND | PNG_ENCODE_ALPHA |\n         PNG_EXPAND_tRNS);\n      png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;\n\n      /* Kill the tRNS chunk itself too.  Prior to 1.5.4 this did not happen\n       * so transparency information would remain just so long as it wasn't\n       * expanded.  This produces unexpected API changes if the set of things\n       * that do PNG_EXPAND_tRNS changes (perfectly possible given the\n       * documentation - which says ask for what you want, accept what you\n       * get.)  This makes the behavior consistent from 1.5.4:\n       */\n      png_ptr->num_trans = 0;\n   }\n#endif /* STRIP_ALPHA supported, no COMPOSE */\n\n#ifdef PNG_READ_ALPHA_MODE_SUPPORTED\n   /* If the screen gamma is about 1.0 then the OPTIMIZE_ALPHA and ENCODE_ALPHA\n    * settings will have no effect.\n    */\n   if (png_gamma_significant(png_ptr->screen_gamma) == 0)\n   {\n      png_ptr->transformations &= ~PNG_ENCODE_ALPHA;\n      png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;\n   }\n#endif\n\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\n   /* Make sure the coefficients for the rgb to gray conversion are set\n    * appropriately.\n    */\n   if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)\n      png_colorspace_set_rgb_coefficients(png_ptr);\n#endif\n\n#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED\n#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)\n   /* Detect gray background and attempt to enable optimization for\n    * gray --> RGB case.\n    *\n    * Note:  if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or\n    * RGB_ALPHA (in which case need_expand is superfluous anyway), the\n    * background color might actually be gray yet not be flagged as such.\n    * This is not a problem for the current code, which uses\n    * PNG_BACKGROUND_IS_GRAY only to decide when to do the\n    * png_do_gray_to_rgb() transformation.\n    *\n    * TODO: this code needs to be revised to avoid the complexity and\n    * interdependencies.  The color type of the background should be recorded in\n    * png_set_background, along with the bit depth, then the code has a record\n    * of exactly what color space the background is currently in.\n    */\n   if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0)\n   {\n      /* PNG_BACKGROUND_EXPAND: the background is in the file color space, so if\n       * the file was grayscale the background value is gray.\n       */\n      if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)\n         png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;\n   }\n\n   else if ((png_ptr->transformations & PNG_COMPOSE) != 0)\n   {\n      /* PNG_COMPOSE: png_set_background was called with need_expand false,\n       * so the color is in the color space of the output or png_set_alpha_mode\n       * was called and the color is black.  Ignore RGB_TO_GRAY because that\n       * happens before GRAY_TO_RGB.\n       */\n      if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0)\n      {\n         if (png_ptr->background.red == png_ptr->background.green &&\n             png_ptr->background.red == png_ptr->background.blue)\n         {\n            png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;\n            png_ptr->background.gray = png_ptr->background.red;\n         }\n      }\n   }\n#endif /* READ_EXPAND && READ_BACKGROUND */\n#endif /* READ_GRAY_TO_RGB */\n\n   /* For indexed PNG data (PNG_COLOR_TYPE_PALETTE) many of the transformations\n    * can be performed directly on the palette, and some (such as rgb to gray)\n    * can be optimized inside the palette.  This is particularly true of the\n    * composite (background and alpha) stuff, which can be pretty much all done\n    * in the palette even if the result is expanded to RGB or gray afterward.\n    *\n    * NOTE: this is Not Yet Implemented, the code behaves as in 1.5.1 and\n    * earlier and the palette stuff is actually handled on the first row.  This\n    * leads to the reported bug that the palette returned by png_get_PLTE is not\n    * updated.\n    */\n   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      png_init_palette_transformations(png_ptr);\n\n   else\n      png_init_rgb_transformations(png_ptr);\n\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \\\n   defined(PNG_READ_EXPAND_16_SUPPORTED)\n   if ((png_ptr->transformations & PNG_EXPAND_16) != 0 &&\n       (png_ptr->transformations & PNG_COMPOSE) != 0 &&\n       (png_ptr->transformations & PNG_BACKGROUND_EXPAND) == 0 &&\n       png_ptr->bit_depth != 16)\n   {\n      /* TODO: fix this.  Because the expand_16 operation is after the compose\n       * handling the background color must be 8, not 16, bits deep, but the\n       * application will supply a 16-bit value so reduce it here.\n       *\n       * The PNG_BACKGROUND_EXPAND code above does not expand to 16 bits at\n       * present, so that case is ok (until do_expand_16 is moved.)\n       *\n       * NOTE: this discards the low 16 bits of the user supplied background\n       * color, but until expand_16 works properly there is no choice!\n       */\n#     define CHOP(x) (x)=((png_uint_16)PNG_DIV257(x))\n      CHOP(png_ptr->background.red);\n      CHOP(png_ptr->background.green);\n      CHOP(png_ptr->background.blue);\n      CHOP(png_ptr->background.gray);\n#     undef CHOP\n   }\n#endif /* READ_BACKGROUND && READ_EXPAND_16 */\n\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \\\n   (defined(PNG_READ_SCALE_16_TO_8_SUPPORTED) || \\\n   defined(PNG_READ_STRIP_16_TO_8_SUPPORTED))\n   if ((png_ptr->transformations & (PNG_16_TO_8|PNG_SCALE_16_TO_8)) != 0 &&\n       (png_ptr->transformations & PNG_COMPOSE) != 0 &&\n       (png_ptr->transformations & PNG_BACKGROUND_EXPAND) == 0 &&\n       png_ptr->bit_depth == 16)\n   {\n      /* On the other hand, if a 16-bit file is to be reduced to 8-bits per\n       * component this will also happen after PNG_COMPOSE and so the background\n       * color must be pre-expanded here.\n       *\n       * TODO: fix this too.\n       */\n      png_ptr->background.red = (png_uint_16)(png_ptr->background.red * 257);\n      png_ptr->background.green =\n         (png_uint_16)(png_ptr->background.green * 257);\n      png_ptr->background.blue = (png_uint_16)(png_ptr->background.blue * 257);\n      png_ptr->background.gray = (png_uint_16)(png_ptr->background.gray * 257);\n   }\n#endif\n\n   /* NOTE: below 'PNG_READ_ALPHA_MODE_SUPPORTED' is presumed to also enable the\n    * background support (see the comments in scripts/pnglibconf.dfa), this\n    * allows pre-multiplication of the alpha channel to be implemented as\n    * compositing on black.  This is probably sub-optimal and has been done in\n    * 1.5.4 betas simply to enable external critique and testing (i.e. to\n    * implement the new API quickly, without lots of internal changes.)\n    */\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n#  ifdef PNG_READ_BACKGROUND_SUPPORTED\n      /* Includes ALPHA_MODE */\n      png_ptr->background_1 = png_ptr->background;\n#  endif\n\n   /* This needs to change - in the palette image case a whole set of tables are\n    * built when it would be quicker to just calculate the correct value for\n    * each palette entry directly.  Also, the test is too tricky - why check\n    * PNG_RGB_TO_GRAY if PNG_GAMMA is not set?  The answer seems to be that\n    * PNG_GAMMA is cancelled even if the gamma is known?  The test excludes the\n    * PNG_COMPOSE case, so apparently if there is no *overall* gamma correction\n    * the gamma tables will not be built even if composition is required on a\n    * gamma encoded value.\n    *\n    * In 1.5.4 this is addressed below by an additional check on the individual\n    * file gamma - if it is not 1.0 both RGB_TO_GRAY and COMPOSE need the\n    * tables.\n    */\n   if ((png_ptr->transformations & PNG_GAMMA) != 0 ||\n       ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0 &&\n        (png_gamma_significant(png_ptr->colorspace.gamma) != 0 ||\n         png_gamma_significant(png_ptr->screen_gamma) != 0)) ||\n        ((png_ptr->transformations & PNG_COMPOSE) != 0 &&\n         (png_gamma_significant(png_ptr->colorspace.gamma) != 0 ||\n          png_gamma_significant(png_ptr->screen_gamma) != 0\n#  ifdef PNG_READ_BACKGROUND_SUPPORTED\n         || (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_UNIQUE &&\n           png_gamma_significant(png_ptr->background_gamma) != 0)\n#  endif\n        )) || ((png_ptr->transformations & PNG_ENCODE_ALPHA) != 0 &&\n       png_gamma_significant(png_ptr->screen_gamma) != 0))\n   {\n      png_build_gamma_table(png_ptr, png_ptr->bit_depth);\n\n#ifdef PNG_READ_BACKGROUND_SUPPORTED\n      if ((png_ptr->transformations & PNG_COMPOSE) != 0)\n      {\n         /* Issue a warning about this combination: because RGB_TO_GRAY is\n          * optimized to do the gamma transform if present yet do_background has\n          * to do the same thing if both options are set a\n          * double-gamma-correction happens.  This is true in all versions of\n          * libpng to date.\n          */\n         if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)\n            png_warning(png_ptr,\n               \"libpng does not support gamma+background+rgb_to_gray\");\n\n         if ((png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) != 0)\n         {\n            /* We don't get to here unless there is a tRNS chunk with non-opaque\n             * entries - see the checking code at the start of this function.\n             */\n            png_color back, back_1;\n            png_colorp palette = png_ptr->palette;\n            int num_palette = png_ptr->num_palette;\n            int i;\n            if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE)\n            {\n\n               back.red = png_ptr->gamma_table[png_ptr->background.red];\n               back.green = png_ptr->gamma_table[png_ptr->background.green];\n               back.blue = png_ptr->gamma_table[png_ptr->background.blue];\n\n               back_1.red = png_ptr->gamma_to_1[png_ptr->background.red];\n               back_1.green = png_ptr->gamma_to_1[png_ptr->background.green];\n               back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue];\n            }\n            else\n            {\n               png_fixed_point g, gs;\n\n               switch (png_ptr->background_gamma_type)\n               {\n                  case PNG_BACKGROUND_GAMMA_SCREEN:\n                     g = (png_ptr->screen_gamma);\n                     gs = PNG_FP_1;\n                     break;\n\n                  case PNG_BACKGROUND_GAMMA_FILE:\n                     g = png_reciprocal(png_ptr->colorspace.gamma);\n                     gs = png_reciprocal2(png_ptr->colorspace.gamma,\n                        png_ptr->screen_gamma);\n                     break;\n\n                  case PNG_BACKGROUND_GAMMA_UNIQUE:\n                     g = png_reciprocal(png_ptr->background_gamma);\n                     gs = png_reciprocal2(png_ptr->background_gamma,\n                        png_ptr->screen_gamma);\n                     break;\n                  default:\n                     g = PNG_FP_1;    /* back_1 */\n                     gs = PNG_FP_1;   /* back */\n                     break;\n               }\n\n               if (png_gamma_significant(gs) != 0)\n               {\n                  back.red = png_gamma_8bit_correct(png_ptr->background.red,\n                      gs);\n                  back.green = png_gamma_8bit_correct(png_ptr->background.green,\n                      gs);\n                  back.blue = png_gamma_8bit_correct(png_ptr->background.blue,\n                      gs);\n               }\n\n               else\n               {\n                  back.red   = (png_byte)png_ptr->background.red;\n                  back.green = (png_byte)png_ptr->background.green;\n                  back.blue  = (png_byte)png_ptr->background.blue;\n               }\n\n               if (png_gamma_significant(g) != 0)\n               {\n                  back_1.red = png_gamma_8bit_correct(png_ptr->background.red,\n                     g);\n                  back_1.green = png_gamma_8bit_correct(\n                     png_ptr->background.green, g);\n                  back_1.blue = png_gamma_8bit_correct(png_ptr->background.blue,\n                     g);\n               }\n\n               else\n               {\n                  back_1.red   = (png_byte)png_ptr->background.red;\n                  back_1.green = (png_byte)png_ptr->background.green;\n                  back_1.blue  = (png_byte)png_ptr->background.blue;\n               }\n            }\n\n            for (i = 0; i < num_palette; i++)\n            {\n               if (i < (int)png_ptr->num_trans &&\n                   png_ptr->trans_alpha[i] != 0xff)\n               {\n                  if (png_ptr->trans_alpha[i] == 0)\n                  {\n                     palette[i] = back;\n                  }\n                  else /* if (png_ptr->trans_alpha[i] != 0xff) */\n                  {\n                     png_byte v, w;\n\n                     v = png_ptr->gamma_to_1[palette[i].red];\n                     png_composite(w, v, png_ptr->trans_alpha[i], back_1.red);\n                     palette[i].red = png_ptr->gamma_from_1[w];\n\n                     v = png_ptr->gamma_to_1[palette[i].green];\n                     png_composite(w, v, png_ptr->trans_alpha[i], back_1.green);\n                     palette[i].green = png_ptr->gamma_from_1[w];\n\n                     v = png_ptr->gamma_to_1[palette[i].blue];\n                     png_composite(w, v, png_ptr->trans_alpha[i], back_1.blue);\n                     palette[i].blue = png_ptr->gamma_from_1[w];\n                  }\n               }\n               else\n               {\n                  palette[i].red = png_ptr->gamma_table[palette[i].red];\n                  palette[i].green = png_ptr->gamma_table[palette[i].green];\n                  palette[i].blue = png_ptr->gamma_table[palette[i].blue];\n               }\n            }\n\n            /* Prevent the transformations being done again.\n             *\n             * NOTE: this is highly dubious; it removes the transformations in\n             * place.  This seems inconsistent with the general treatment of the\n             * transformations elsewhere.\n             */\n            png_ptr->transformations &= ~(PNG_COMPOSE | PNG_GAMMA);\n         } /* color_type == PNG_COLOR_TYPE_PALETTE */\n\n         /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */\n         else /* color_type != PNG_COLOR_TYPE_PALETTE */\n         {\n            int gs_sig, g_sig;\n            png_fixed_point g = PNG_FP_1;  /* Correction to linear */\n            png_fixed_point gs = PNG_FP_1; /* Correction to screen */\n\n            switch (png_ptr->background_gamma_type)\n            {\n               case PNG_BACKGROUND_GAMMA_SCREEN:\n                  g = png_ptr->screen_gamma;\n                  /* gs = PNG_FP_1; */\n                  break;\n\n               case PNG_BACKGROUND_GAMMA_FILE:\n                  g = png_reciprocal(png_ptr->colorspace.gamma);\n                  gs = png_reciprocal2(png_ptr->colorspace.gamma,\n                     png_ptr->screen_gamma);\n                  break;\n\n               case PNG_BACKGROUND_GAMMA_UNIQUE:\n                  g = png_reciprocal(png_ptr->background_gamma);\n                  gs = png_reciprocal2(png_ptr->background_gamma,\n                      png_ptr->screen_gamma);\n                  break;\n\n               default:\n                  png_error(png_ptr, \"invalid background gamma type\");\n            }\n\n            g_sig = png_gamma_significant(g);\n            gs_sig = png_gamma_significant(gs);\n\n            if (g_sig != 0)\n               png_ptr->background_1.gray = png_gamma_correct(png_ptr,\n                   png_ptr->background.gray, g);\n\n            if (gs_sig != 0)\n               png_ptr->background.gray = png_gamma_correct(png_ptr,\n                   png_ptr->background.gray, gs);\n\n            if ((png_ptr->background.red != png_ptr->background.green) ||\n                (png_ptr->background.red != png_ptr->background.blue) ||\n                (png_ptr->background.red != png_ptr->background.gray))\n            {\n               /* RGB or RGBA with color background */\n               if (g_sig != 0)\n               {\n                  png_ptr->background_1.red = png_gamma_correct(png_ptr,\n                      png_ptr->background.red, g);\n\n                  png_ptr->background_1.green = png_gamma_correct(png_ptr,\n                      png_ptr->background.green, g);\n\n                  png_ptr->background_1.blue = png_gamma_correct(png_ptr,\n                      png_ptr->background.blue, g);\n               }\n\n               if (gs_sig != 0)\n               {\n                  png_ptr->background.red = png_gamma_correct(png_ptr,\n                      png_ptr->background.red, gs);\n\n                  png_ptr->background.green = png_gamma_correct(png_ptr,\n                      png_ptr->background.green, gs);\n\n                  png_ptr->background.blue = png_gamma_correct(png_ptr,\n                      png_ptr->background.blue, gs);\n               }\n            }\n\n            else\n            {\n               /* GRAY, GRAY ALPHA, RGB, or RGBA with gray background */\n               png_ptr->background_1.red = png_ptr->background_1.green\n                   = png_ptr->background_1.blue = png_ptr->background_1.gray;\n\n               png_ptr->background.red = png_ptr->background.green\n                   = png_ptr->background.blue = png_ptr->background.gray;\n            }\n\n            /* The background is now in screen gamma: */\n            png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_SCREEN;\n         } /* color_type != PNG_COLOR_TYPE_PALETTE */\n      }/* png_ptr->transformations & PNG_BACKGROUND */\n\n      else\n      /* Transformation does not include PNG_BACKGROUND */\n#endif /* READ_BACKGROUND */\n      if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\n         /* RGB_TO_GRAY needs to have non-gamma-corrected values! */\n         && ((png_ptr->transformations & PNG_EXPAND) == 0 ||\n         (png_ptr->transformations & PNG_RGB_TO_GRAY) == 0)\n#endif\n         )\n      {\n         png_colorp palette = png_ptr->palette;\n         int num_palette = png_ptr->num_palette;\n         int i;\n\n         /* NOTE: there are other transformations that should probably be in\n          * here too.\n          */\n         for (i = 0; i < num_palette; i++)\n         {\n            palette[i].red = png_ptr->gamma_table[palette[i].red];\n            palette[i].green = png_ptr->gamma_table[palette[i].green];\n            palette[i].blue = png_ptr->gamma_table[palette[i].blue];\n         }\n\n         /* Done the gamma correction. */\n         png_ptr->transformations &= ~PNG_GAMMA;\n      } /* color_type == PALETTE && !PNG_BACKGROUND transformation */\n   }\n#ifdef PNG_READ_BACKGROUND_SUPPORTED\n   else\n#endif\n#endif /* READ_GAMMA */\n\n#ifdef PNG_READ_BACKGROUND_SUPPORTED\n   /* No GAMMA transformation (see the hanging else 4 lines above) */\n   if ((png_ptr->transformations & PNG_COMPOSE) != 0 &&\n       (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))\n   {\n      int i;\n      int istop = (int)png_ptr->num_trans;\n      png_color back;\n      png_colorp palette = png_ptr->palette;\n\n      back.red   = (png_byte)png_ptr->background.red;\n      back.green = (png_byte)png_ptr->background.green;\n      back.blue  = (png_byte)png_ptr->background.blue;\n\n      for (i = 0; i < istop; i++)\n      {\n         if (png_ptr->trans_alpha[i] == 0)\n         {\n            palette[i] = back;\n         }\n\n         else if (png_ptr->trans_alpha[i] != 0xff)\n         {\n            /* The png_composite() macro is defined in png.h */\n            png_composite(palette[i].red, palette[i].red,\n                png_ptr->trans_alpha[i], back.red);\n\n            png_composite(palette[i].green, palette[i].green,\n                png_ptr->trans_alpha[i], back.green);\n\n            png_composite(palette[i].blue, palette[i].blue,\n                png_ptr->trans_alpha[i], back.blue);\n         }\n      }\n\n      png_ptr->transformations &= ~PNG_COMPOSE;\n   }\n#endif /* READ_BACKGROUND */\n\n#ifdef PNG_READ_SHIFT_SUPPORTED\n   if ((png_ptr->transformations & PNG_SHIFT) != 0 &&\n       (png_ptr->transformations & PNG_EXPAND) == 0 &&\n       (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))\n   {\n      int i;\n      int istop = png_ptr->num_palette;\n      int shift = 8 - png_ptr->sig_bit.red;\n\n      png_ptr->transformations &= ~PNG_SHIFT;\n\n      /* significant bits can be in the range 1 to 7 for a meaninful result, if\n       * the number of significant bits is 0 then no shift is done (this is an\n       * error condition which is silently ignored.)\n       */\n      if (shift > 0 && shift < 8)\n         for (i=0; i<istop; ++i)\n         {\n            int component = png_ptr->palette[i].red;\n\n            component >>= shift;\n            png_ptr->palette[i].red = (png_byte)component;\n         }\n\n      shift = 8 - png_ptr->sig_bit.green;\n      if (shift > 0 && shift < 8)\n         for (i=0; i<istop; ++i)\n         {\n            int component = png_ptr->palette[i].green;\n\n            component >>= shift;\n            png_ptr->palette[i].green = (png_byte)component;\n         }\n\n      shift = 8 - png_ptr->sig_bit.blue;\n      if (shift > 0 && shift < 8)\n         for (i=0; i<istop; ++i)\n         {\n            int component = png_ptr->palette[i].blue;\n\n            component >>= shift;\n            png_ptr->palette[i].blue = (png_byte)component;\n         }\n   }\n#endif /* READ_SHIFT */\n}\n\n/* Modify the info structure to reflect the transformations.  The\n * info should be updated so a PNG file could be written with it,\n * assuming the transformations result in valid PNG data.\n */\nvoid /* PRIVATE */\npng_read_transform_info(png_structrp png_ptr, png_inforp info_ptr)\n{\n   png_debug(1, \"in png_read_transform_info\");\n\n#ifdef PNG_READ_EXPAND_SUPPORTED\n   if ((png_ptr->transformations & PNG_EXPAND) != 0)\n   {\n      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      {\n         /* This check must match what actually happens in\n          * png_do_expand_palette; if it ever checks the tRNS chunk to see if\n          * it is all opaque we must do the same (at present it does not.)\n          */\n         if (png_ptr->num_trans > 0)\n            info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA;\n\n         else\n            info_ptr->color_type = PNG_COLOR_TYPE_RGB;\n\n         info_ptr->bit_depth = 8;\n         info_ptr->num_trans = 0;\n\n         if (png_ptr->palette == NULL)\n            png_error (png_ptr, \"Palette is NULL in indexed image\");\n      }\n      else\n      {\n         if (png_ptr->num_trans != 0)\n         {\n            if ((png_ptr->transformations & PNG_EXPAND_tRNS) != 0)\n               info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;\n         }\n         if (info_ptr->bit_depth < 8)\n            info_ptr->bit_depth = 8;\n\n         info_ptr->num_trans = 0;\n      }\n   }\n#endif\n\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\\\n   defined(PNG_READ_ALPHA_MODE_SUPPORTED)\n   /* The following is almost certainly wrong unless the background value is in\n    * the screen space!\n    */\n   if ((png_ptr->transformations & PNG_COMPOSE) != 0)\n      info_ptr->background = png_ptr->background;\n#endif\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n   /* The following used to be conditional on PNG_GAMMA (prior to 1.5.4),\n    * however it seems that the code in png_init_read_transformations, which has\n    * been called before this from png_read_update_info->png_read_start_row\n    * sometimes does the gamma transform and cancels the flag.\n    *\n    * TODO: this looks wrong; the info_ptr should end up with a gamma equal to\n    * the screen_gamma value.  The following probably results in weirdness if\n    * the info_ptr is used by the app after the rows have been read.\n    */\n   info_ptr->colorspace.gamma = png_ptr->colorspace.gamma;\n#endif\n\n   if (info_ptr->bit_depth == 16)\n   {\n#  ifdef PNG_READ_16BIT_SUPPORTED\n#     ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED\n         if ((png_ptr->transformations & PNG_SCALE_16_TO_8) != 0)\n            info_ptr->bit_depth = 8;\n#     endif\n\n#     ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED\n         if ((png_ptr->transformations & PNG_16_TO_8) != 0)\n            info_ptr->bit_depth = 8;\n#     endif\n\n#  else\n      /* No 16-bit support: force chopping 16-bit input down to 8, in this case\n       * the app program can chose if both APIs are available by setting the\n       * correct scaling to use.\n       */\n#     ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED\n         /* For compatibility with previous versions use the strip method by\n          * default.  This code works because if PNG_SCALE_16_TO_8 is already\n          * set the code below will do that in preference to the chop.\n          */\n         png_ptr->transformations |= PNG_16_TO_8;\n         info_ptr->bit_depth = 8;\n#     else\n\n#        ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED\n            png_ptr->transformations |= PNG_SCALE_16_TO_8;\n            info_ptr->bit_depth = 8;\n#        else\n\n            CONFIGURATION ERROR: you must enable at least one 16 to 8 method\n#        endif\n#    endif\n#endif /* !READ_16BIT */\n   }\n\n#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED\n   if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0)\n      info_ptr->color_type = (png_byte)(info_ptr->color_type |\n         PNG_COLOR_MASK_COLOR);\n#endif\n\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\n   if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)\n      info_ptr->color_type = (png_byte)(info_ptr->color_type &\n         ~PNG_COLOR_MASK_COLOR);\n#endif\n\n#ifdef PNG_READ_QUANTIZE_SUPPORTED\n   if ((png_ptr->transformations & PNG_QUANTIZE) != 0)\n   {\n      if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) ||\n          (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) &&\n          png_ptr->palette_lookup != 0 && info_ptr->bit_depth == 8)\n      {\n         info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;\n      }\n   }\n#endif\n\n#ifdef PNG_READ_EXPAND_16_SUPPORTED\n   if ((png_ptr->transformations & PNG_EXPAND_16) != 0 &&\n       info_ptr->bit_depth == 8 &&\n       info_ptr->color_type != PNG_COLOR_TYPE_PALETTE)\n   {\n      info_ptr->bit_depth = 16;\n   }\n#endif\n\n#ifdef PNG_READ_PACK_SUPPORTED\n   if ((png_ptr->transformations & PNG_PACK) != 0 &&\n       (info_ptr->bit_depth < 8))\n      info_ptr->bit_depth = 8;\n#endif\n\n   if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      info_ptr->channels = 1;\n\n   else if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)\n      info_ptr->channels = 3;\n\n   else\n      info_ptr->channels = 1;\n\n#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED\n   if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0)\n   {\n      info_ptr->color_type = (png_byte)(info_ptr->color_type &\n         ~PNG_COLOR_MASK_ALPHA);\n      info_ptr->num_trans = 0;\n   }\n#endif\n\n   if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)\n      info_ptr->channels++;\n\n#ifdef PNG_READ_FILLER_SUPPORTED\n   /* STRIP_ALPHA and FILLER allowed:  MASK_ALPHA bit stripped above */\n   if ((png_ptr->transformations & PNG_FILLER) != 0 &&\n       (info_ptr->color_type == PNG_COLOR_TYPE_RGB ||\n       info_ptr->color_type == PNG_COLOR_TYPE_GRAY))\n   {\n      info_ptr->channels++;\n      /* If adding a true alpha channel not just filler */\n      if ((png_ptr->transformations & PNG_ADD_ALPHA) != 0)\n         info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;\n   }\n#endif\n\n#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \\\ndefined(PNG_READ_USER_TRANSFORM_SUPPORTED)\n   if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)\n   {\n      if (png_ptr->user_transform_depth != 0)\n         info_ptr->bit_depth = png_ptr->user_transform_depth;\n\n      if (png_ptr->user_transform_channels != 0)\n         info_ptr->channels = png_ptr->user_transform_channels;\n   }\n#endif\n\n   info_ptr->pixel_depth = (png_byte)(info_ptr->channels *\n       info_ptr->bit_depth);\n\n   info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width);\n\n   /* Adding in 1.5.4: cache the above value in png_struct so that we can later\n    * check in png_rowbytes that the user buffer won't get overwritten.  Note\n    * that the field is not always set - if png_read_update_info isn't called\n    * the application has to either not do any transforms or get the calculation\n    * right itself.\n    */\n   png_ptr->info_rowbytes = info_ptr->rowbytes;\n\n#ifndef PNG_READ_EXPAND_SUPPORTED\n   if (png_ptr != NULL)\n      return;\n#endif\n}\n\n#ifdef PNG_READ_PACK_SUPPORTED\n/* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel,\n * without changing the actual values.  Thus, if you had a row with\n * a bit depth of 1, you would end up with bytes that only contained\n * the numbers 0 or 1.  If you would rather they contain 0 and 255, use\n * png_do_shift() after this.\n */\nstatic void\npng_do_unpack(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_unpack\");\n\n   if (row_info->bit_depth < 8)\n   {\n      png_uint_32 i;\n      png_uint_32 row_width=row_info->width;\n\n      switch (row_info->bit_depth)\n      {\n         case 1:\n         {\n            png_bytep sp = row + (png_size_t)((row_width - 1) >> 3);\n            png_bytep dp = row + (png_size_t)row_width - 1;\n            png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07);\n            for (i = 0; i < row_width; i++)\n            {\n               *dp = (png_byte)((*sp >> shift) & 0x01);\n\n               if (shift == 7)\n               {\n                  shift = 0;\n                  sp--;\n               }\n\n               else\n                  shift++;\n\n               dp--;\n            }\n            break;\n         }\n\n         case 2:\n         {\n\n            png_bytep sp = row + (png_size_t)((row_width - 1) >> 2);\n            png_bytep dp = row + (png_size_t)row_width - 1;\n            png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);\n            for (i = 0; i < row_width; i++)\n            {\n               *dp = (png_byte)((*sp >> shift) & 0x03);\n\n               if (shift == 6)\n               {\n                  shift = 0;\n                  sp--;\n               }\n\n               else\n                  shift += 2;\n\n               dp--;\n            }\n            break;\n         }\n\n         case 4:\n         {\n            png_bytep sp = row + (png_size_t)((row_width - 1) >> 1);\n            png_bytep dp = row + (png_size_t)row_width - 1;\n            png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);\n            for (i = 0; i < row_width; i++)\n            {\n               *dp = (png_byte)((*sp >> shift) & 0x0f);\n\n               if (shift == 4)\n               {\n                  shift = 0;\n                  sp--;\n               }\n\n               else\n                  shift = 4;\n\n               dp--;\n            }\n            break;\n         }\n\n         default:\n            break;\n      }\n      row_info->bit_depth = 8;\n      row_info->pixel_depth = (png_byte)(8 * row_info->channels);\n      row_info->rowbytes = row_width * row_info->channels;\n   }\n}\n#endif\n\n#ifdef PNG_READ_SHIFT_SUPPORTED\n/* Reverse the effects of png_do_shift.  This routine merely shifts the\n * pixels back to their significant bits values.  Thus, if you have\n * a row of bit depth 8, but only 5 are significant, this will shift\n * the values back to 0 through 31.\n */\nstatic void\npng_do_unshift(png_row_infop row_info, png_bytep row,\n    png_const_color_8p sig_bits)\n{\n   int color_type;\n\n   png_debug(1, \"in png_do_unshift\");\n\n   /* The palette case has already been handled in the _init routine. */\n   color_type = row_info->color_type;\n\n   if (color_type != PNG_COLOR_TYPE_PALETTE)\n   {\n      int shift[4];\n      int channels = 0;\n      int bit_depth = row_info->bit_depth;\n\n      if ((color_type & PNG_COLOR_MASK_COLOR) != 0)\n      {\n         shift[channels++] = bit_depth - sig_bits->red;\n         shift[channels++] = bit_depth - sig_bits->green;\n         shift[channels++] = bit_depth - sig_bits->blue;\n      }\n\n      else\n      {\n         shift[channels++] = bit_depth - sig_bits->gray;\n      }\n\n      if ((color_type & PNG_COLOR_MASK_ALPHA) != 0)\n      {\n         shift[channels++] = bit_depth - sig_bits->alpha;\n      }\n\n      {\n         int c, have_shift;\n\n         for (c = have_shift = 0; c < channels; ++c)\n         {\n            /* A shift of more than the bit depth is an error condition but it\n             * gets ignored here.\n             */\n            if (shift[c] <= 0 || shift[c] >= bit_depth)\n               shift[c] = 0;\n\n            else\n               have_shift = 1;\n         }\n\n         if (have_shift == 0)\n            return;\n      }\n\n      switch (bit_depth)\n      {\n         default:\n         /* Must be 1bpp gray: should not be here! */\n            /* NOTREACHED */\n            break;\n\n         case 2:\n         /* Must be 2bpp gray */\n         /* assert(channels == 1 && shift[0] == 1) */\n         {\n            png_bytep bp = row;\n            png_bytep bp_end = bp + row_info->rowbytes;\n\n            while (bp < bp_end)\n            {\n               int b = (*bp >> 1) & 0x55;\n               *bp++ = (png_byte)b;\n            }\n            break;\n         }\n\n         case 4:\n         /* Must be 4bpp gray */\n         /* assert(channels == 1) */\n         {\n            png_bytep bp = row;\n            png_bytep bp_end = bp + row_info->rowbytes;\n            int gray_shift = shift[0];\n            int mask =  0xf >> gray_shift;\n\n            mask |= mask << 4;\n\n            while (bp < bp_end)\n            {\n               int b = (*bp >> gray_shift) & mask;\n               *bp++ = (png_byte)b;\n            }\n            break;\n         }\n\n         case 8:\n         /* Single byte components, G, GA, RGB, RGBA */\n         {\n            png_bytep bp = row;\n            png_bytep bp_end = bp + row_info->rowbytes;\n            int channel = 0;\n\n            while (bp < bp_end)\n            {\n               int b = *bp >> shift[channel];\n               if (++channel >= channels)\n                  channel = 0;\n               *bp++ = (png_byte)b;\n            }\n            break;\n         }\n\n#ifdef PNG_READ_16BIT_SUPPORTED\n         case 16:\n         /* Double byte components, G, GA, RGB, RGBA */\n         {\n            png_bytep bp = row;\n            png_bytep bp_end = bp + row_info->rowbytes;\n            int channel = 0;\n\n            while (bp < bp_end)\n            {\n               int value = (bp[0] << 8) + bp[1];\n\n               value >>= shift[channel];\n               if (++channel >= channels)\n                  channel = 0;\n               *bp++ = (png_byte)(value >> 8);\n               *bp++ = (png_byte)value;\n            }\n            break;\n         }\n#endif\n      }\n   }\n}\n#endif\n\n#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED\n/* Scale rows of bit depth 16 down to 8 accurately */\nstatic void\npng_do_scale_16_to_8(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_scale_16_to_8\");\n\n   if (row_info->bit_depth == 16)\n   {\n      png_bytep sp = row; /* source */\n      png_bytep dp = row; /* destination */\n      png_bytep ep = sp + row_info->rowbytes; /* end+1 */\n\n      while (sp < ep)\n      {\n         /* The input is an array of 16-bit components, these must be scaled to\n          * 8 bits each.  For a 16-bit value V the required value (from the PNG\n          * specification) is:\n          *\n          *    (V * 255) / 65535\n          *\n          * This reduces to round(V / 257), or floor((V + 128.5)/257)\n          *\n          * Represent V as the two byte value vhi.vlo.  Make a guess that the\n          * result is the top byte of V, vhi, then the correction to this value\n          * is:\n          *\n          *    error = floor(((V-vhi.vhi) + 128.5) / 257)\n          *          = floor(((vlo-vhi) + 128.5) / 257)\n          *\n          * This can be approximated using integer arithmetic (and a signed\n          * shift):\n          *\n          *    error = (vlo-vhi+128) >> 8;\n          *\n          * The approximate differs from the exact answer only when (vlo-vhi) is\n          * 128; it then gives a correction of +1 when the exact correction is\n          * 0.  This gives 128 errors.  The exact answer (correct for all 16-bit\n          * input values) is:\n          *\n          *    error = (vlo-vhi+128)*65535 >> 24;\n          *\n          * An alternative arithmetic calculation which also gives no errors is:\n          *\n          *    (V * 255 + 32895) >> 16\n          */\n\n         png_int_32 tmp = *sp++; /* must be signed! */\n         tmp += (((int)*sp++ - tmp + 128) * 65535) >> 24;\n         *dp++ = (png_byte)tmp;\n      }\n\n      row_info->bit_depth = 8;\n      row_info->pixel_depth = (png_byte)(8 * row_info->channels);\n      row_info->rowbytes = row_info->width * row_info->channels;\n   }\n}\n#endif\n\n#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED\nstatic void\n/* Simply discard the low byte.  This was the default behavior prior\n * to libpng-1.5.4.\n */\npng_do_chop(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_chop\");\n\n   if (row_info->bit_depth == 16)\n   {\n      png_bytep sp = row; /* source */\n      png_bytep dp = row; /* destination */\n      png_bytep ep = sp + row_info->rowbytes; /* end+1 */\n\n      while (sp < ep)\n      {\n         *dp++ = *sp;\n         sp += 2; /* skip low byte */\n      }\n\n      row_info->bit_depth = 8;\n      row_info->pixel_depth = (png_byte)(8 * row_info->channels);\n      row_info->rowbytes = row_info->width * row_info->channels;\n   }\n}\n#endif\n\n#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED\nstatic void\npng_do_read_swap_alpha(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_read_swap_alpha\");\n\n   {\n      png_uint_32 row_width = row_info->width;\n      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n      {\n         /* This converts from RGBA to ARGB */\n         if (row_info->bit_depth == 8)\n         {\n            png_bytep sp = row + row_info->rowbytes;\n            png_bytep dp = sp;\n            png_byte save;\n            png_uint_32 i;\n\n            for (i = 0; i < row_width; i++)\n            {\n               save = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = save;\n            }\n         }\n\n#ifdef PNG_READ_16BIT_SUPPORTED\n         /* This converts from RRGGBBAA to AARRGGBB */\n         else\n         {\n            png_bytep sp = row + row_info->rowbytes;\n            png_bytep dp = sp;\n            png_byte save[2];\n            png_uint_32 i;\n\n            for (i = 0; i < row_width; i++)\n            {\n               save[0] = *(--sp);\n               save[1] = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = save[0];\n               *(--dp) = save[1];\n            }\n         }\n#endif\n      }\n\n      else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)\n      {\n         /* This converts from GA to AG */\n         if (row_info->bit_depth == 8)\n         {\n            png_bytep sp = row + row_info->rowbytes;\n            png_bytep dp = sp;\n            png_byte save;\n            png_uint_32 i;\n\n            for (i = 0; i < row_width; i++)\n            {\n               save = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = save;\n            }\n         }\n\n#ifdef PNG_READ_16BIT_SUPPORTED\n         /* This converts from GGAA to AAGG */\n         else\n         {\n            png_bytep sp = row + row_info->rowbytes;\n            png_bytep dp = sp;\n            png_byte save[2];\n            png_uint_32 i;\n\n            for (i = 0; i < row_width; i++)\n            {\n               save[0] = *(--sp);\n               save[1] = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = save[0];\n               *(--dp) = save[1];\n            }\n         }\n#endif\n      }\n   }\n}\n#endif\n\n#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED\nstatic void\npng_do_read_invert_alpha(png_row_infop row_info, png_bytep row)\n{\n   png_uint_32 row_width;\n   png_debug(1, \"in png_do_read_invert_alpha\");\n\n   row_width = row_info->width;\n   if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n   {\n      if (row_info->bit_depth == 8)\n      {\n         /* This inverts the alpha channel in RGBA */\n         png_bytep sp = row + row_info->rowbytes;\n         png_bytep dp = sp;\n         png_uint_32 i;\n\n         for (i = 0; i < row_width; i++)\n         {\n            *(--dp) = (png_byte)(255 - *(--sp));\n\n/*          This does nothing:\n            *(--dp) = *(--sp);\n            *(--dp) = *(--sp);\n            *(--dp) = *(--sp);\n            We can replace it with:\n*/\n            sp-=3;\n            dp=sp;\n         }\n      }\n\n#ifdef PNG_READ_16BIT_SUPPORTED\n      /* This inverts the alpha channel in RRGGBBAA */\n      else\n      {\n         png_bytep sp = row + row_info->rowbytes;\n         png_bytep dp = sp;\n         png_uint_32 i;\n\n         for (i = 0; i < row_width; i++)\n         {\n            *(--dp) = (png_byte)(255 - *(--sp));\n            *(--dp) = (png_byte)(255 - *(--sp));\n\n/*          This does nothing:\n            *(--dp) = *(--sp);\n            *(--dp) = *(--sp);\n            *(--dp) = *(--sp);\n            *(--dp) = *(--sp);\n            *(--dp) = *(--sp);\n            *(--dp) = *(--sp);\n            We can replace it with:\n*/\n            sp-=6;\n            dp=sp;\n         }\n      }\n#endif\n   }\n   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)\n   {\n      if (row_info->bit_depth == 8)\n      {\n         /* This inverts the alpha channel in GA */\n         png_bytep sp = row + row_info->rowbytes;\n         png_bytep dp = sp;\n         png_uint_32 i;\n\n         for (i = 0; i < row_width; i++)\n         {\n            *(--dp) = (png_byte)(255 - *(--sp));\n            *(--dp) = *(--sp);\n         }\n      }\n\n#ifdef PNG_READ_16BIT_SUPPORTED\n      else\n      {\n         /* This inverts the alpha channel in GGAA */\n         png_bytep sp  = row + row_info->rowbytes;\n         png_bytep dp = sp;\n         png_uint_32 i;\n\n         for (i = 0; i < row_width; i++)\n         {\n            *(--dp) = (png_byte)(255 - *(--sp));\n            *(--dp) = (png_byte)(255 - *(--sp));\n/*\n            *(--dp) = *(--sp);\n            *(--dp) = *(--sp);\n*/\n            sp-=2;\n            dp=sp;\n         }\n      }\n#endif\n   }\n}\n#endif\n\n#ifdef PNG_READ_FILLER_SUPPORTED\n/* Add filler channel if we have RGB color */\nstatic void\npng_do_read_filler(png_row_infop row_info, png_bytep row,\n    png_uint_32 filler, png_uint_32 flags)\n{\n   png_uint_32 i;\n   png_uint_32 row_width = row_info->width;\n\n#ifdef PNG_READ_16BIT_SUPPORTED\n   png_byte hi_filler = (png_byte)(filler>>8);\n#endif\n   png_byte lo_filler = (png_byte)filler;\n\n   png_debug(1, \"in png_do_read_filler\");\n\n   if (\n       row_info->color_type == PNG_COLOR_TYPE_GRAY)\n   {\n      if (row_info->bit_depth == 8)\n      {\n         if ((flags & PNG_FLAG_FILLER_AFTER) != 0)\n         {\n            /* This changes the data from G to GX */\n            png_bytep sp = row + (png_size_t)row_width;\n            png_bytep dp =  sp + (png_size_t)row_width;\n            for (i = 1; i < row_width; i++)\n            {\n               *(--dp) = lo_filler;\n               *(--dp) = *(--sp);\n            }\n            *(--dp) = lo_filler;\n            row_info->channels = 2;\n            row_info->pixel_depth = 16;\n            row_info->rowbytes = row_width * 2;\n         }\n\n         else\n         {\n            /* This changes the data from G to XG */\n            png_bytep sp = row + (png_size_t)row_width;\n            png_bytep dp = sp  + (png_size_t)row_width;\n            for (i = 0; i < row_width; i++)\n            {\n               *(--dp) = *(--sp);\n               *(--dp) = lo_filler;\n            }\n            row_info->channels = 2;\n            row_info->pixel_depth = 16;\n            row_info->rowbytes = row_width * 2;\n         }\n      }\n\n#ifdef PNG_READ_16BIT_SUPPORTED\n      else if (row_info->bit_depth == 16)\n      {\n         if ((flags & PNG_FLAG_FILLER_AFTER) != 0)\n         {\n            /* This changes the data from GG to GGXX */\n            png_bytep sp = row + (png_size_t)row_width * 2;\n            png_bytep dp = sp  + (png_size_t)row_width * 2;\n            for (i = 1; i < row_width; i++)\n            {\n               *(--dp) = lo_filler;\n               *(--dp) = hi_filler;\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n            }\n            *(--dp) = lo_filler;\n            *(--dp) = hi_filler;\n            row_info->channels = 2;\n            row_info->pixel_depth = 32;\n            row_info->rowbytes = row_width * 4;\n         }\n\n         else\n         {\n            /* This changes the data from GG to XXGG */\n            png_bytep sp = row + (png_size_t)row_width * 2;\n            png_bytep dp = sp  + (png_size_t)row_width * 2;\n            for (i = 0; i < row_width; i++)\n            {\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = lo_filler;\n               *(--dp) = hi_filler;\n            }\n            row_info->channels = 2;\n            row_info->pixel_depth = 32;\n            row_info->rowbytes = row_width * 4;\n         }\n      }\n#endif\n   } /* COLOR_TYPE == GRAY */\n   else if (row_info->color_type == PNG_COLOR_TYPE_RGB)\n   {\n      if (row_info->bit_depth == 8)\n      {\n         if ((flags & PNG_FLAG_FILLER_AFTER) != 0)\n         {\n            /* This changes the data from RGB to RGBX */\n            png_bytep sp = row + (png_size_t)row_width * 3;\n            png_bytep dp = sp  + (png_size_t)row_width;\n            for (i = 1; i < row_width; i++)\n            {\n               *(--dp) = lo_filler;\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n            }\n            *(--dp) = lo_filler;\n            row_info->channels = 4;\n            row_info->pixel_depth = 32;\n            row_info->rowbytes = row_width * 4;\n         }\n\n         else\n         {\n            /* This changes the data from RGB to XRGB */\n            png_bytep sp = row + (png_size_t)row_width * 3;\n            png_bytep dp = sp + (png_size_t)row_width;\n            for (i = 0; i < row_width; i++)\n            {\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = lo_filler;\n            }\n            row_info->channels = 4;\n            row_info->pixel_depth = 32;\n            row_info->rowbytes = row_width * 4;\n         }\n      }\n\n#ifdef PNG_READ_16BIT_SUPPORTED\n      else if (row_info->bit_depth == 16)\n      {\n         if ((flags & PNG_FLAG_FILLER_AFTER) != 0)\n         {\n            /* This changes the data from RRGGBB to RRGGBBXX */\n            png_bytep sp = row + (png_size_t)row_width * 6;\n            png_bytep dp = sp  + (png_size_t)row_width * 2;\n            for (i = 1; i < row_width; i++)\n            {\n               *(--dp) = lo_filler;\n               *(--dp) = hi_filler;\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n            }\n            *(--dp) = lo_filler;\n            *(--dp) = hi_filler;\n            row_info->channels = 4;\n            row_info->pixel_depth = 64;\n            row_info->rowbytes = row_width * 8;\n         }\n\n         else\n         {\n            /* This changes the data from RRGGBB to XXRRGGBB */\n            png_bytep sp = row + (png_size_t)row_width * 6;\n            png_bytep dp = sp  + (png_size_t)row_width * 2;\n            for (i = 0; i < row_width; i++)\n            {\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = *(--sp);\n               *(--dp) = lo_filler;\n               *(--dp) = hi_filler;\n            }\n\n            row_info->channels = 4;\n            row_info->pixel_depth = 64;\n            row_info->rowbytes = row_width * 8;\n         }\n      }\n#endif\n   } /* COLOR_TYPE == RGB */\n}\n#endif\n\n#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED\n/* Expand grayscale files to RGB, with or without alpha */\nstatic void\npng_do_gray_to_rgb(png_row_infop row_info, png_bytep row)\n{\n   png_uint_32 i;\n   png_uint_32 row_width = row_info->width;\n\n   png_debug(1, \"in png_do_gray_to_rgb\");\n\n   if (row_info->bit_depth >= 8 &&\n       (row_info->color_type & PNG_COLOR_MASK_COLOR) == 0)\n   {\n      if (row_info->color_type == PNG_COLOR_TYPE_GRAY)\n      {\n         if (row_info->bit_depth == 8)\n         {\n            /* This changes G to RGB */\n            png_bytep sp = row + (png_size_t)row_width - 1;\n            png_bytep dp = sp  + (png_size_t)row_width * 2;\n            for (i = 0; i < row_width; i++)\n            {\n               *(dp--) = *sp;\n               *(dp--) = *sp;\n               *(dp--) = *(sp--);\n            }\n         }\n\n         else\n         {\n            /* This changes GG to RRGGBB */\n            png_bytep sp = row + (png_size_t)row_width * 2 - 1;\n            png_bytep dp = sp  + (png_size_t)row_width * 4;\n            for (i = 0; i < row_width; i++)\n            {\n               *(dp--) = *sp;\n               *(dp--) = *(sp - 1);\n               *(dp--) = *sp;\n               *(dp--) = *(sp - 1);\n               *(dp--) = *(sp--);\n               *(dp--) = *(sp--);\n            }\n         }\n      }\n\n      else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)\n      {\n         if (row_info->bit_depth == 8)\n         {\n            /* This changes GA to RGBA */\n            png_bytep sp = row + (png_size_t)row_width * 2 - 1;\n            png_bytep dp = sp  + (png_size_t)row_width * 2;\n            for (i = 0; i < row_width; i++)\n            {\n               *(dp--) = *(sp--);\n               *(dp--) = *sp;\n               *(dp--) = *sp;\n               *(dp--) = *(sp--);\n            }\n         }\n\n         else\n         {\n            /* This changes GGAA to RRGGBBAA */\n            png_bytep sp = row + (png_size_t)row_width * 4 - 1;\n            png_bytep dp = sp  + (png_size_t)row_width * 4;\n            for (i = 0; i < row_width; i++)\n            {\n               *(dp--) = *(sp--);\n               *(dp--) = *(sp--);\n               *(dp--) = *sp;\n               *(dp--) = *(sp - 1);\n               *(dp--) = *sp;\n               *(dp--) = *(sp - 1);\n               *(dp--) = *(sp--);\n               *(dp--) = *(sp--);\n            }\n         }\n      }\n      row_info->channels = (png_byte)(row_info->channels + 2);\n      row_info->color_type |= PNG_COLOR_MASK_COLOR;\n      row_info->pixel_depth = (png_byte)(row_info->channels *\n          row_info->bit_depth);\n      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);\n   }\n}\n#endif\n\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\n/* Reduce RGB files to grayscale, with or without alpha\n * using the equation given in Poynton's ColorFAQ of 1998-01-04 at\n * <http://www.inforamp.net/~poynton/>  (THIS LINK IS DEAD June 2008 but\n * versions dated 1998 through November 2002 have been archived at\n * http://web.archive.org/web/20000816232553/http://www.inforamp.net/\n * ~poynton/notes/colour_and_gamma/ColorFAQ.txt )\n * Charles Poynton poynton at poynton.com\n *\n *     Y = 0.212671 * R + 0.715160 * G + 0.072169 * B\n *\n *  which can be expressed with integers as\n *\n *     Y = (6969 * R + 23434 * G + 2365 * B)/32768\n *\n * Poynton's current link (as of January 2003 through July 2011):\n * <http://www.poynton.com/notes/colour_and_gamma/>\n * has changed the numbers slightly:\n *\n *     Y = 0.2126*R + 0.7152*G + 0.0722*B\n *\n *  which can be expressed with integers as\n *\n *     Y = (6966 * R + 23436 * G + 2366 * B)/32768\n *\n *  Historically, however, libpng uses numbers derived from the ITU-R Rec 709\n *  end point chromaticities and the D65 white point.  Depending on the\n *  precision used for the D65 white point this produces a variety of different\n *  numbers, however if the four decimal place value used in ITU-R Rec 709 is\n *  used (0.3127,0.3290) the Y calculation would be:\n *\n *     Y = (6968 * R + 23435 * G + 2366 * B)/32768\n *\n *  While this is correct the rounding results in an overflow for white, because\n *  the sum of the rounded coefficients is 32769, not 32768.  Consequently\n *  libpng uses, instead, the closest non-overflowing approximation:\n *\n *     Y = (6968 * R + 23434 * G + 2366 * B)/32768\n *\n *  Starting with libpng-1.5.5, if the image being converted has a cHRM chunk\n *  (including an sRGB chunk) then the chromaticities are used to calculate the\n *  coefficients.  See the chunk handling in pngrutil.c for more information.\n *\n *  In all cases the calculation is to be done in a linear colorspace.  If no\n *  gamma information is available to correct the encoding of the original RGB\n *  values this results in an implicit assumption that the original PNG RGB\n *  values were linear.\n *\n *  Other integer coefficents can be used via png_set_rgb_to_gray().  Because\n *  the API takes just red and green coefficients the blue coefficient is\n *  calculated to make the sum 32768.  This will result in different rounding\n *  to that used above.\n */\nstatic int\npng_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row)\n\n{\n   int rgb_error = 0;\n\n   png_debug(1, \"in png_do_rgb_to_gray\");\n\n   if ((row_info->color_type & PNG_COLOR_MASK_PALETTE) == 0 &&\n       (row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)\n   {\n      PNG_CONST png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff;\n      PNG_CONST png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff;\n      PNG_CONST png_uint_32 bc = 32768 - rc - gc;\n      PNG_CONST png_uint_32 row_width = row_info->width;\n      PNG_CONST int have_alpha =\n         (row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0;\n\n      if (row_info->bit_depth == 8)\n      {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n         /* Notice that gamma to/from 1 are not necessarily inverses (if\n          * there is an overall gamma correction).  Prior to 1.5.5 this code\n          * checked the linearized values for equality; this doesn't match\n          * the documentation, the original values must be checked.\n          */\n         if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL)\n         {\n            png_bytep sp = row;\n            png_bytep dp = row;\n            png_uint_32 i;\n\n            for (i = 0; i < row_width; i++)\n            {\n               png_byte red   = *(sp++);\n               png_byte green = *(sp++);\n               png_byte blue  = *(sp++);\n\n               if (red != green || red != blue)\n               {\n                  red = png_ptr->gamma_to_1[red];\n                  green = png_ptr->gamma_to_1[green];\n                  blue = png_ptr->gamma_to_1[blue];\n\n                  rgb_error |= 1;\n                  *(dp++) = png_ptr->gamma_from_1[\n                      (rc*red + gc*green + bc*blue + 16384)>>15];\n               }\n\n               else\n               {\n                  /* If there is no overall correction the table will not be\n                   * set.\n                   */\n                  if (png_ptr->gamma_table != NULL)\n                     red = png_ptr->gamma_table[red];\n\n                  *(dp++) = red;\n               }\n\n               if (have_alpha != 0)\n                  *(dp++) = *(sp++);\n            }\n         }\n         else\n#endif\n         {\n            png_bytep sp = row;\n            png_bytep dp = row;\n            png_uint_32 i;\n\n            for (i = 0; i < row_width; i++)\n            {\n               png_byte red   = *(sp++);\n               png_byte green = *(sp++);\n               png_byte blue  = *(sp++);\n\n               if (red != green || red != blue)\n               {\n                  rgb_error |= 1;\n                  /* NOTE: this is the historical approach which simply\n                   * truncates the results.\n                   */\n                  *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15);\n               }\n\n               else\n                  *(dp++) = red;\n\n               if (have_alpha != 0)\n                  *(dp++) = *(sp++);\n            }\n         }\n      }\n\n      else /* RGB bit_depth == 16 */\n      {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n         if (png_ptr->gamma_16_to_1 != NULL && png_ptr->gamma_16_from_1 != NULL)\n         {\n            png_bytep sp = row;\n            png_bytep dp = row;\n            png_uint_32 i;\n\n            for (i = 0; i < row_width; i++)\n            {\n               png_uint_16 red, green, blue, w;\n               png_byte hi,lo;\n\n               hi=*(sp)++; lo=*(sp)++; red   = (png_uint_16)((hi << 8) | (lo));\n               hi=*(sp)++; lo=*(sp)++; green = (png_uint_16)((hi << 8) | (lo));\n               hi=*(sp)++; lo=*(sp)++; blue  = (png_uint_16)((hi << 8) | (lo));\n\n               if (red == green && red == blue)\n               {\n                  if (png_ptr->gamma_16_table != NULL)\n                     w = png_ptr->gamma_16_table[(red & 0xff)\n                         >> png_ptr->gamma_shift][red >> 8];\n\n                  else\n                     w = red;\n               }\n\n               else\n               {\n                  png_uint_16 red_1   = png_ptr->gamma_16_to_1[(red & 0xff)\n                      >> png_ptr->gamma_shift][red>>8];\n                  png_uint_16 green_1 =\n                      png_ptr->gamma_16_to_1[(green & 0xff) >>\n                      png_ptr->gamma_shift][green>>8];\n                  png_uint_16 blue_1  = png_ptr->gamma_16_to_1[(blue & 0xff)\n                      >> png_ptr->gamma_shift][blue>>8];\n                  png_uint_16 gray16  = (png_uint_16)((rc*red_1 + gc*green_1\n                      + bc*blue_1 + 16384)>>15);\n                  w = png_ptr->gamma_16_from_1[(gray16 & 0xff) >>\n                      png_ptr->gamma_shift][gray16 >> 8];\n                  rgb_error |= 1;\n               }\n\n               *(dp++) = (png_byte)((w>>8) & 0xff);\n               *(dp++) = (png_byte)(w & 0xff);\n\n               if (have_alpha != 0)\n               {\n                  *(dp++) = *(sp++);\n                  *(dp++) = *(sp++);\n               }\n            }\n         }\n         else\n#endif\n         {\n            png_bytep sp = row;\n            png_bytep dp = row;\n            png_uint_32 i;\n\n            for (i = 0; i < row_width; i++)\n            {\n               png_uint_16 red, green, blue, gray16;\n               png_byte hi,lo;\n\n               hi=*(sp)++; lo=*(sp)++; red   = (png_uint_16)((hi << 8) | (lo));\n               hi=*(sp)++; lo=*(sp)++; green = (png_uint_16)((hi << 8) | (lo));\n               hi=*(sp)++; lo=*(sp)++; blue  = (png_uint_16)((hi << 8) | (lo));\n\n               if (red != green || red != blue)\n                  rgb_error |= 1;\n\n               /* From 1.5.5 in the 16-bit case do the accurate conversion even\n                * in the 'fast' case - this is because this is where the code\n                * ends up when handling linear 16-bit data.\n                */\n               gray16  = (png_uint_16)((rc*red + gc*green + bc*blue + 16384) >>\n                  15);\n               *(dp++) = (png_byte)((gray16 >> 8) & 0xff);\n               *(dp++) = (png_byte)(gray16 & 0xff);\n\n               if (have_alpha != 0)\n               {\n                  *(dp++) = *(sp++);\n                  *(dp++) = *(sp++);\n               }\n            }\n         }\n      }\n\n      row_info->channels = (png_byte)(row_info->channels - 2);\n      row_info->color_type = (png_byte)(row_info->color_type &\n          ~PNG_COLOR_MASK_COLOR);\n      row_info->pixel_depth = (png_byte)(row_info->channels *\n          row_info->bit_depth);\n      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);\n   }\n   return rgb_error;\n}\n#endif\n\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\\\n   defined(PNG_READ_ALPHA_MODE_SUPPORTED)\n/* Replace any alpha or transparency with the supplied background color.\n * \"background\" is already in the screen gamma, while \"background_1\" is\n * at a gamma of 1.0.  Paletted files have already been taken care of.\n */\nstatic void\npng_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)\n{\n#ifdef PNG_READ_GAMMA_SUPPORTED\n   png_const_bytep gamma_table = png_ptr->gamma_table;\n   png_const_bytep gamma_from_1 = png_ptr->gamma_from_1;\n   png_const_bytep gamma_to_1 = png_ptr->gamma_to_1;\n   png_const_uint_16pp gamma_16 = png_ptr->gamma_16_table;\n   png_const_uint_16pp gamma_16_from_1 = png_ptr->gamma_16_from_1;\n   png_const_uint_16pp gamma_16_to_1 = png_ptr->gamma_16_to_1;\n   int gamma_shift = png_ptr->gamma_shift;\n   int optimize = (png_ptr->flags & PNG_FLAG_OPTIMIZE_ALPHA) != 0;\n#endif\n\n   png_bytep sp;\n   png_uint_32 i;\n   png_uint_32 row_width = row_info->width;\n   int shift;\n\n   png_debug(1, \"in png_do_compose\");\n\n   {\n      switch (row_info->color_type)\n      {\n         case PNG_COLOR_TYPE_GRAY:\n         {\n            switch (row_info->bit_depth)\n            {\n               case 1:\n               {\n                  sp = row;\n                  shift = 7;\n                  for (i = 0; i < row_width; i++)\n                  {\n                     if ((png_uint_16)((*sp >> shift) & 0x01)\n                        == png_ptr->trans_color.gray)\n                     {\n                        unsigned int tmp = *sp & (0x7f7f >> (7 - shift));\n                        tmp |= png_ptr->background.gray << shift;\n                        *sp = (png_byte)(tmp & 0xff);\n                     }\n\n                     if (shift == 0)\n                     {\n                        shift = 7;\n                        sp++;\n                     }\n\n                     else\n                        shift--;\n                  }\n                  break;\n               }\n\n               case 2:\n               {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n                  if (gamma_table != NULL)\n                  {\n                     sp = row;\n                     shift = 6;\n                     for (i = 0; i < row_width; i++)\n                     {\n                        if ((png_uint_16)((*sp >> shift) & 0x03)\n                            == png_ptr->trans_color.gray)\n                        {\n                           unsigned int tmp = *sp & (0x3f3f >> (6 - shift));\n                           tmp |= png_ptr->background.gray << shift;\n                           *sp = (png_byte)(tmp & 0xff);\n                        }\n\n                        else\n                        {\n                           unsigned int p = (*sp >> shift) & 0x03;\n                           unsigned int g = (gamma_table [p | (p << 2) |\n                               (p << 4) | (p << 6)] >> 6) & 0x03;\n                           unsigned int tmp = *sp & (0x3f3f >> (6 - shift));\n                           tmp |= g << shift;\n                           *sp = (png_byte)(tmp & 0xff);\n                        }\n\n                        if (shift == 0)\n                        {\n                           shift = 6;\n                           sp++;\n                        }\n\n                        else\n                           shift -= 2;\n                     }\n                  }\n\n                  else\n#endif\n                  {\n                     sp = row;\n                     shift = 6;\n                     for (i = 0; i < row_width; i++)\n                     {\n                        if ((png_uint_16)((*sp >> shift) & 0x03)\n                            == png_ptr->trans_color.gray)\n                        {\n                           unsigned int tmp = *sp & (0x3f3f >> (6 - shift));\n                           tmp |= png_ptr->background.gray << shift;\n                           *sp = (png_byte)(tmp & 0xff);\n                        }\n\n                        if (shift == 0)\n                        {\n                           shift = 6;\n                           sp++;\n                        }\n\n                        else\n                           shift -= 2;\n                     }\n                  }\n                  break;\n               }\n\n               case 4:\n               {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n                  if (gamma_table != NULL)\n                  {\n                     sp = row;\n                     shift = 4;\n                     for (i = 0; i < row_width; i++)\n                     {\n                        if ((png_uint_16)((*sp >> shift) & 0x0f)\n                            == png_ptr->trans_color.gray)\n                        {\n                           unsigned int tmp = *sp & (0x0f0f >> (4 - shift));\n                           tmp |= png_ptr->background.gray << shift;\n                           *sp = (png_byte)(tmp & 0xff);\n                        }\n\n                        else\n                        {\n                           unsigned int p = (*sp >> shift) & 0x0f;\n                           unsigned int g = (gamma_table[p | (p << 4)] >> 4) &\n                              0x0f;\n                           unsigned int tmp = *sp & (0x0f0f >> (4 - shift));\n                           tmp |= g << shift;\n                           *sp = (png_byte)(tmp & 0xff);\n                        }\n\n                        if (shift == 0)\n                        {\n                           shift = 4;\n                           sp++;\n                        }\n\n                        else\n                           shift -= 4;\n                     }\n                  }\n\n                  else\n#endif\n                  {\n                     sp = row;\n                     shift = 4;\n                     for (i = 0; i < row_width; i++)\n                     {\n                        if ((png_uint_16)((*sp >> shift) & 0x0f)\n                            == png_ptr->trans_color.gray)\n                        {\n                           unsigned int tmp = *sp & (0x0f0f >> (4 - shift));\n                           tmp |= png_ptr->background.gray << shift;\n                           *sp = (png_byte)(tmp & 0xff);\n                        }\n\n                        if (shift == 0)\n                        {\n                           shift = 4;\n                           sp++;\n                        }\n\n                        else\n                           shift -= 4;\n                     }\n                  }\n                  break;\n               }\n\n               case 8:\n               {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n                  if (gamma_table != NULL)\n                  {\n                     sp = row;\n                     for (i = 0; i < row_width; i++, sp++)\n                     {\n                        if (*sp == png_ptr->trans_color.gray)\n                           *sp = (png_byte)png_ptr->background.gray;\n\n                        else\n                           *sp = gamma_table[*sp];\n                     }\n                  }\n                  else\n#endif\n                  {\n                     sp = row;\n                     for (i = 0; i < row_width; i++, sp++)\n                     {\n                        if (*sp == png_ptr->trans_color.gray)\n                           *sp = (png_byte)png_ptr->background.gray;\n                     }\n                  }\n                  break;\n               }\n\n               case 16:\n               {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n                  if (gamma_16 != NULL)\n                  {\n                     sp = row;\n                     for (i = 0; i < row_width; i++, sp += 2)\n                     {\n                        png_uint_16 v;\n\n                        v = (png_uint_16)(((*sp) << 8) + *(sp + 1));\n\n                        if (v == png_ptr->trans_color.gray)\n                        {\n                           /* Background is already in screen gamma */\n                           *sp = (png_byte)((png_ptr->background.gray >> 8)\n                                & 0xff);\n                           *(sp + 1) = (png_byte)(png_ptr->background.gray\n                                & 0xff);\n                        }\n\n                        else\n                        {\n                           v = gamma_16[*(sp + 1) >> gamma_shift][*sp];\n                           *sp = (png_byte)((v >> 8) & 0xff);\n                           *(sp + 1) = (png_byte)(v & 0xff);\n                        }\n                     }\n                  }\n                  else\n#endif\n                  {\n                     sp = row;\n                     for (i = 0; i < row_width; i++, sp += 2)\n                     {\n                        png_uint_16 v;\n\n                        v = (png_uint_16)(((*sp) << 8) + *(sp + 1));\n\n                        if (v == png_ptr->trans_color.gray)\n                        {\n                           *sp = (png_byte)((png_ptr->background.gray >> 8)\n                                & 0xff);\n                           *(sp + 1) = (png_byte)(png_ptr->background.gray\n                                & 0xff);\n                        }\n                     }\n                  }\n                  break;\n               }\n\n               default:\n                  break;\n            }\n            break;\n         }\n\n         case PNG_COLOR_TYPE_RGB:\n         {\n            if (row_info->bit_depth == 8)\n            {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n               if (gamma_table != NULL)\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 3)\n                  {\n                     if (*sp == png_ptr->trans_color.red &&\n                         *(sp + 1) == png_ptr->trans_color.green &&\n                         *(sp + 2) == png_ptr->trans_color.blue)\n                     {\n                        *sp = (png_byte)png_ptr->background.red;\n                        *(sp + 1) = (png_byte)png_ptr->background.green;\n                        *(sp + 2) = (png_byte)png_ptr->background.blue;\n                     }\n\n                     else\n                     {\n                        *sp = gamma_table[*sp];\n                        *(sp + 1) = gamma_table[*(sp + 1)];\n                        *(sp + 2) = gamma_table[*(sp + 2)];\n                     }\n                  }\n               }\n               else\n#endif\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 3)\n                  {\n                     if (*sp == png_ptr->trans_color.red &&\n                         *(sp + 1) == png_ptr->trans_color.green &&\n                         *(sp + 2) == png_ptr->trans_color.blue)\n                     {\n                        *sp = (png_byte)png_ptr->background.red;\n                        *(sp + 1) = (png_byte)png_ptr->background.green;\n                        *(sp + 2) = (png_byte)png_ptr->background.blue;\n                     }\n                  }\n               }\n            }\n            else /* if (row_info->bit_depth == 16) */\n            {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n               if (gamma_16 != NULL)\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 6)\n                  {\n                     png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));\n\n                     png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)\n                         + *(sp + 3));\n\n                     png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)\n                         + *(sp + 5));\n\n                     if (r == png_ptr->trans_color.red &&\n                         g == png_ptr->trans_color.green &&\n                         b == png_ptr->trans_color.blue)\n                     {\n                        /* Background is already in screen gamma */\n                        *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);\n                        *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)\n                                & 0xff);\n                        *(sp + 3) = (png_byte)(png_ptr->background.green\n                                & 0xff);\n                        *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)\n                                & 0xff);\n                        *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);\n                     }\n\n                     else\n                     {\n                        png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp];\n                        *sp = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(v & 0xff);\n\n                        v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];\n                        *(sp + 2) = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 3) = (png_byte)(v & 0xff);\n\n                        v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];\n                        *(sp + 4) = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 5) = (png_byte)(v & 0xff);\n                     }\n                  }\n               }\n\n               else\n#endif\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 6)\n                  {\n                     png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));\n\n                     png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)\n                         + *(sp + 3));\n\n                     png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)\n                         + *(sp + 5));\n\n                     if (r == png_ptr->trans_color.red &&\n                         g == png_ptr->trans_color.green &&\n                         b == png_ptr->trans_color.blue)\n                     {\n                        *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);\n                        *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)\n                                & 0xff);\n                        *(sp + 3) = (png_byte)(png_ptr->background.green\n                                & 0xff);\n                        *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)\n                                & 0xff);\n                        *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);\n                     }\n                  }\n               }\n            }\n            break;\n         }\n\n         case PNG_COLOR_TYPE_GRAY_ALPHA:\n         {\n            if (row_info->bit_depth == 8)\n            {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n               if (gamma_to_1 != NULL && gamma_from_1 != NULL &&\n                   gamma_table != NULL)\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 2)\n                  {\n                     png_uint_16 a = *(sp + 1);\n\n                     if (a == 0xff)\n                        *sp = gamma_table[*sp];\n\n                     else if (a == 0)\n                     {\n                        /* Background is already in screen gamma */\n                        *sp = (png_byte)png_ptr->background.gray;\n                     }\n\n                     else\n                     {\n                        png_byte v, w;\n\n                        v = gamma_to_1[*sp];\n                        png_composite(w, v, a, png_ptr->background_1.gray);\n                        if (optimize == 0)\n                           w = gamma_from_1[w];\n                        *sp = w;\n                     }\n                  }\n               }\n               else\n#endif\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 2)\n                  {\n                     png_byte a = *(sp + 1);\n\n                     if (a == 0)\n                        *sp = (png_byte)png_ptr->background.gray;\n\n                     else if (a < 0xff)\n                        png_composite(*sp, *sp, a, png_ptr->background.gray);\n                  }\n               }\n            }\n            else /* if (png_ptr->bit_depth == 16) */\n            {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n               if (gamma_16 != NULL && gamma_16_from_1 != NULL &&\n                   gamma_16_to_1 != NULL)\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 4)\n                  {\n                     png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)\n                         + *(sp + 3));\n\n                     if (a == (png_uint_16)0xffff)\n                     {\n                        png_uint_16 v;\n\n                        v = gamma_16[*(sp + 1) >> gamma_shift][*sp];\n                        *sp = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(v & 0xff);\n                     }\n\n                     else if (a == 0)\n                     {\n                        /* Background is already in screen gamma */\n                        *sp = (png_byte)((png_ptr->background.gray >> 8)\n                                & 0xff);\n                        *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);\n                     }\n\n                     else\n                     {\n                        png_uint_16 g, v, w;\n\n                        g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];\n                        png_composite_16(v, g, a, png_ptr->background_1.gray);\n                        if (optimize != 0)\n                           w = v;\n                        else\n                           w = gamma_16_from_1[(v & 0xff) >>\n                               gamma_shift][v >> 8];\n                        *sp = (png_byte)((w >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(w & 0xff);\n                     }\n                  }\n               }\n               else\n#endif\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 4)\n                  {\n                     png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)\n                         + *(sp + 3));\n\n                     if (a == 0)\n                     {\n                        *sp = (png_byte)((png_ptr->background.gray >> 8)\n                                & 0xff);\n                        *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);\n                     }\n\n                     else if (a < 0xffff)\n                     {\n                        png_uint_16 g, v;\n\n                        g = (png_uint_16)(((*sp) << 8) + *(sp + 1));\n                        png_composite_16(v, g, a, png_ptr->background.gray);\n                        *sp = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(v & 0xff);\n                     }\n                  }\n               }\n            }\n            break;\n         }\n\n         case PNG_COLOR_TYPE_RGB_ALPHA:\n         {\n            if (row_info->bit_depth == 8)\n            {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n               if (gamma_to_1 != NULL && gamma_from_1 != NULL &&\n                   gamma_table != NULL)\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 4)\n                  {\n                     png_byte a = *(sp + 3);\n\n                     if (a == 0xff)\n                     {\n                        *sp = gamma_table[*sp];\n                        *(sp + 1) = gamma_table[*(sp + 1)];\n                        *(sp + 2) = gamma_table[*(sp + 2)];\n                     }\n\n                     else if (a == 0)\n                     {\n                        /* Background is already in screen gamma */\n                        *sp = (png_byte)png_ptr->background.red;\n                        *(sp + 1) = (png_byte)png_ptr->background.green;\n                        *(sp + 2) = (png_byte)png_ptr->background.blue;\n                     }\n\n                     else\n                     {\n                        png_byte v, w;\n\n                        v = gamma_to_1[*sp];\n                        png_composite(w, v, a, png_ptr->background_1.red);\n                        if (optimize == 0) w = gamma_from_1[w];\n                        *sp = w;\n\n                        v = gamma_to_1[*(sp + 1)];\n                        png_composite(w, v, a, png_ptr->background_1.green);\n                        if (optimize == 0) w = gamma_from_1[w];\n                        *(sp + 1) = w;\n\n                        v = gamma_to_1[*(sp + 2)];\n                        png_composite(w, v, a, png_ptr->background_1.blue);\n                        if (optimize == 0) w = gamma_from_1[w];\n                        *(sp + 2) = w;\n                     }\n                  }\n               }\n               else\n#endif\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 4)\n                  {\n                     png_byte a = *(sp + 3);\n\n                     if (a == 0)\n                     {\n                        *sp = (png_byte)png_ptr->background.red;\n                        *(sp + 1) = (png_byte)png_ptr->background.green;\n                        *(sp + 2) = (png_byte)png_ptr->background.blue;\n                     }\n\n                     else if (a < 0xff)\n                     {\n                        png_composite(*sp, *sp, a, png_ptr->background.red);\n\n                        png_composite(*(sp + 1), *(sp + 1), a,\n                            png_ptr->background.green);\n\n                        png_composite(*(sp + 2), *(sp + 2), a,\n                            png_ptr->background.blue);\n                     }\n                  }\n               }\n            }\n            else /* if (row_info->bit_depth == 16) */\n            {\n#ifdef PNG_READ_GAMMA_SUPPORTED\n               if (gamma_16 != NULL && gamma_16_from_1 != NULL &&\n                   gamma_16_to_1 != NULL)\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 8)\n                  {\n                     png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))\n                         << 8) + (png_uint_16)(*(sp + 7)));\n\n                     if (a == (png_uint_16)0xffff)\n                     {\n                        png_uint_16 v;\n\n                        v = gamma_16[*(sp + 1) >> gamma_shift][*sp];\n                        *sp = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(v & 0xff);\n\n                        v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];\n                        *(sp + 2) = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 3) = (png_byte)(v & 0xff);\n\n                        v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];\n                        *(sp + 4) = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 5) = (png_byte)(v & 0xff);\n                     }\n\n                     else if (a == 0)\n                     {\n                        /* Background is already in screen gamma */\n                        *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);\n                        *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)\n                                & 0xff);\n                        *(sp + 3) = (png_byte)(png_ptr->background.green\n                                & 0xff);\n                        *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)\n                                & 0xff);\n                        *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);\n                     }\n\n                     else\n                     {\n                        png_uint_16 v, w;\n\n                        v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];\n                        png_composite_16(w, v, a, png_ptr->background_1.red);\n                        if (optimize == 0)\n                           w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>\n                                8];\n                        *sp = (png_byte)((w >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(w & 0xff);\n\n                        v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];\n                        png_composite_16(w, v, a, png_ptr->background_1.green);\n                        if (optimize == 0)\n                           w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>\n                                8];\n\n                        *(sp + 2) = (png_byte)((w >> 8) & 0xff);\n                        *(sp + 3) = (png_byte)(w & 0xff);\n\n                        v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];\n                        png_composite_16(w, v, a, png_ptr->background_1.blue);\n                        if (optimize == 0)\n                           w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>\n                                8];\n\n                        *(sp + 4) = (png_byte)((w >> 8) & 0xff);\n                        *(sp + 5) = (png_byte)(w & 0xff);\n                     }\n                  }\n               }\n\n               else\n#endif\n               {\n                  sp = row;\n                  for (i = 0; i < row_width; i++, sp += 8)\n                  {\n                     png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))\n                         << 8) + (png_uint_16)(*(sp + 7)));\n\n                     if (a == 0)\n                     {\n                        *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);\n                        *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)\n                                & 0xff);\n                        *(sp + 3) = (png_byte)(png_ptr->background.green\n                                & 0xff);\n                        *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)\n                                & 0xff);\n                        *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);\n                     }\n\n                     else if (a < 0xffff)\n                     {\n                        png_uint_16 v;\n\n                        png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));\n                        png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)\n                            + *(sp + 3));\n                        png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)\n                            + *(sp + 5));\n\n                        png_composite_16(v, r, a, png_ptr->background.red);\n                        *sp = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 1) = (png_byte)(v & 0xff);\n\n                        png_composite_16(v, g, a, png_ptr->background.green);\n                        *(sp + 2) = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 3) = (png_byte)(v & 0xff);\n\n                        png_composite_16(v, b, a, png_ptr->background.blue);\n                        *(sp + 4) = (png_byte)((v >> 8) & 0xff);\n                        *(sp + 5) = (png_byte)(v & 0xff);\n                     }\n                  }\n               }\n            }\n            break;\n         }\n\n         default:\n            break;\n      }\n   }\n}\n#endif /* READ_BACKGROUND || READ_ALPHA_MODE */\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n/* Gamma correct the image, avoiding the alpha channel.  Make sure\n * you do this after you deal with the transparency issue on grayscale\n * or RGB images. If your bit depth is 8, use gamma_table, if it\n * is 16, use gamma_16_table and gamma_shift.  Build these with\n * build_gamma_table().\n */\nstatic void\npng_do_gamma(png_row_infop row_info, png_bytep row, png_structrp png_ptr)\n{\n   png_const_bytep gamma_table = png_ptr->gamma_table;\n   png_const_uint_16pp gamma_16_table = png_ptr->gamma_16_table;\n   int gamma_shift = png_ptr->gamma_shift;\n\n   png_bytep sp;\n   png_uint_32 i;\n   png_uint_32 row_width=row_info->width;\n\n   png_debug(1, \"in png_do_gamma\");\n\n   if (((row_info->bit_depth <= 8 && gamma_table != NULL) ||\n       (row_info->bit_depth == 16 && gamma_16_table != NULL)))\n   {\n      switch (row_info->color_type)\n      {\n         case PNG_COLOR_TYPE_RGB:\n         {\n            if (row_info->bit_depth == 8)\n            {\n               sp = row;\n               for (i = 0; i < row_width; i++)\n               {\n                  *sp = gamma_table[*sp];\n                  sp++;\n                  *sp = gamma_table[*sp];\n                  sp++;\n                  *sp = gamma_table[*sp];\n                  sp++;\n               }\n            }\n\n            else /* if (row_info->bit_depth == 16) */\n            {\n               sp = row;\n               for (i = 0; i < row_width; i++)\n               {\n                  png_uint_16 v;\n\n                  v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];\n                  *sp = (png_byte)((v >> 8) & 0xff);\n                  *(sp + 1) = (png_byte)(v & 0xff);\n                  sp += 2;\n\n                  v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];\n                  *sp = (png_byte)((v >> 8) & 0xff);\n                  *(sp + 1) = (png_byte)(v & 0xff);\n                  sp += 2;\n\n                  v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];\n                  *sp = (png_byte)((v >> 8) & 0xff);\n                  *(sp + 1) = (png_byte)(v & 0xff);\n                  sp += 2;\n               }\n            }\n            break;\n         }\n\n         case PNG_COLOR_TYPE_RGB_ALPHA:\n         {\n            if (row_info->bit_depth == 8)\n            {\n               sp = row;\n               for (i = 0; i < row_width; i++)\n               {\n                  *sp = gamma_table[*sp];\n                  sp++;\n\n                  *sp = gamma_table[*sp];\n                  sp++;\n\n                  *sp = gamma_table[*sp];\n                  sp++;\n\n                  sp++;\n               }\n            }\n\n            else /* if (row_info->bit_depth == 16) */\n            {\n               sp = row;\n               for (i = 0; i < row_width; i++)\n               {\n                  png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];\n                  *sp = (png_byte)((v >> 8) & 0xff);\n                  *(sp + 1) = (png_byte)(v & 0xff);\n                  sp += 2;\n\n                  v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];\n                  *sp = (png_byte)((v >> 8) & 0xff);\n                  *(sp + 1) = (png_byte)(v & 0xff);\n                  sp += 2;\n\n                  v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];\n                  *sp = (png_byte)((v >> 8) & 0xff);\n                  *(sp + 1) = (png_byte)(v & 0xff);\n                  sp += 4;\n               }\n            }\n            break;\n         }\n\n         case PNG_COLOR_TYPE_GRAY_ALPHA:\n         {\n            if (row_info->bit_depth == 8)\n            {\n               sp = row;\n               for (i = 0; i < row_width; i++)\n               {\n                  *sp = gamma_table[*sp];\n                  sp += 2;\n               }\n            }\n\n            else /* if (row_info->bit_depth == 16) */\n            {\n               sp = row;\n               for (i = 0; i < row_width; i++)\n               {\n                  png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];\n                  *sp = (png_byte)((v >> 8) & 0xff);\n                  *(sp + 1) = (png_byte)(v & 0xff);\n                  sp += 4;\n               }\n            }\n            break;\n         }\n\n         case PNG_COLOR_TYPE_GRAY:\n         {\n            if (row_info->bit_depth == 2)\n            {\n               sp = row;\n               for (i = 0; i < row_width; i += 4)\n               {\n                  int a = *sp & 0xc0;\n                  int b = *sp & 0x30;\n                  int c = *sp & 0x0c;\n                  int d = *sp & 0x03;\n\n                  *sp = (png_byte)(\n                      ((((int)gamma_table[a|(a>>2)|(a>>4)|(a>>6)])   ) & 0xc0)|\n                      ((((int)gamma_table[(b<<2)|b|(b>>2)|(b>>4)])>>2) & 0x30)|\n                      ((((int)gamma_table[(c<<4)|(c<<2)|c|(c>>2)])>>4) & 0x0c)|\n                      ((((int)gamma_table[(d<<6)|(d<<4)|(d<<2)|d])>>6) ));\n                  sp++;\n               }\n            }\n\n            if (row_info->bit_depth == 4)\n            {\n               sp = row;\n               for (i = 0; i < row_width; i += 2)\n               {\n                  int msb = *sp & 0xf0;\n                  int lsb = *sp & 0x0f;\n\n                  *sp = (png_byte)((((int)gamma_table[msb | (msb >> 4)]) & 0xf0)\n                      | (((int)gamma_table[(lsb << 4) | lsb]) >> 4));\n                  sp++;\n               }\n            }\n\n            else if (row_info->bit_depth == 8)\n            {\n               sp = row;\n               for (i = 0; i < row_width; i++)\n               {\n                  *sp = gamma_table[*sp];\n                  sp++;\n               }\n            }\n\n            else if (row_info->bit_depth == 16)\n            {\n               sp = row;\n               for (i = 0; i < row_width; i++)\n               {\n                  png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];\n                  *sp = (png_byte)((v >> 8) & 0xff);\n                  *(sp + 1) = (png_byte)(v & 0xff);\n                  sp += 2;\n               }\n            }\n            break;\n         }\n\n         default:\n            break;\n      }\n   }\n}\n#endif\n\n#ifdef PNG_READ_ALPHA_MODE_SUPPORTED\n/* Encode the alpha channel to the output gamma (the input channel is always\n * linear.)  Called only with color types that have an alpha channel.  Needs the\n * from_1 tables.\n */\nstatic void\npng_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structrp png_ptr)\n{\n   png_uint_32 row_width = row_info->width;\n\n   png_debug(1, \"in png_do_encode_alpha\");\n\n   if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)\n   {\n      if (row_info->bit_depth == 8)\n      {\n         PNG_CONST png_bytep table = png_ptr->gamma_from_1;\n\n         if (table != NULL)\n         {\n            PNG_CONST int step =\n               (row_info->color_type & PNG_COLOR_MASK_COLOR) ? 4 : 2;\n\n            /* The alpha channel is the last component: */\n            row += step - 1;\n\n            for (; row_width > 0; --row_width, row += step)\n               *row = table[*row];\n\n            return;\n         }\n      }\n\n      else if (row_info->bit_depth == 16)\n      {\n         PNG_CONST png_uint_16pp table = png_ptr->gamma_16_from_1;\n         PNG_CONST int gamma_shift = png_ptr->gamma_shift;\n\n         if (table != NULL)\n         {\n            PNG_CONST int step =\n               (row_info->color_type & PNG_COLOR_MASK_COLOR) ? 8 : 4;\n\n            /* The alpha channel is the last component: */\n            row += step - 2;\n\n            for (; row_width > 0; --row_width, row += step)\n            {\n               png_uint_16 v;\n\n               v = table[*(row + 1) >> gamma_shift][*row];\n               *row = (png_byte)((v >> 8) & 0xff);\n               *(row + 1) = (png_byte)(v & 0xff);\n            }\n\n            return;\n         }\n      }\n   }\n\n   /* Only get to here if called with a weird row_info; no harm has been done,\n    * so just issue a warning.\n    */\n   png_warning(png_ptr, \"png_do_encode_alpha: unexpected call\");\n}\n#endif\n\n#ifdef PNG_READ_EXPAND_SUPPORTED\n/* Expands a palette row to an RGB or RGBA row depending\n * upon whether you supply trans and num_trans.\n */\nstatic void\npng_do_expand_palette(png_row_infop row_info, png_bytep row,\n   png_const_colorp palette, png_const_bytep trans_alpha, int num_trans)\n{\n   int shift, value;\n   png_bytep sp, dp;\n   png_uint_32 i;\n   png_uint_32 row_width=row_info->width;\n\n   png_debug(1, \"in png_do_expand_palette\");\n\n   if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)\n   {\n      if (row_info->bit_depth < 8)\n      {\n         switch (row_info->bit_depth)\n         {\n            case 1:\n            {\n               sp = row + (png_size_t)((row_width - 1) >> 3);\n               dp = row + (png_size_t)row_width - 1;\n               shift = 7 - (int)((row_width + 7) & 0x07);\n               for (i = 0; i < row_width; i++)\n               {\n                  if ((*sp >> shift) & 0x01)\n                     *dp = 1;\n\n                  else\n                     *dp = 0;\n\n                  if (shift == 7)\n                  {\n                     shift = 0;\n                     sp--;\n                  }\n\n                  else\n                     shift++;\n\n                  dp--;\n               }\n               break;\n            }\n\n            case 2:\n            {\n               sp = row + (png_size_t)((row_width - 1) >> 2);\n               dp = row + (png_size_t)row_width - 1;\n               shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);\n               for (i = 0; i < row_width; i++)\n               {\n                  value = (*sp >> shift) & 0x03;\n                  *dp = (png_byte)value;\n                  if (shift == 6)\n                  {\n                     shift = 0;\n                     sp--;\n                  }\n\n                  else\n                     shift += 2;\n\n                  dp--;\n               }\n               break;\n            }\n\n            case 4:\n            {\n               sp = row + (png_size_t)((row_width - 1) >> 1);\n               dp = row + (png_size_t)row_width - 1;\n               shift = (int)((row_width & 0x01) << 2);\n               for (i = 0; i < row_width; i++)\n               {\n                  value = (*sp >> shift) & 0x0f;\n                  *dp = (png_byte)value;\n                  if (shift == 4)\n                  {\n                     shift = 0;\n                     sp--;\n                  }\n\n                  else\n                     shift += 4;\n\n                  dp--;\n               }\n               break;\n            }\n\n            default:\n               break;\n         }\n         row_info->bit_depth = 8;\n         row_info->pixel_depth = 8;\n         row_info->rowbytes = row_width;\n      }\n\n      if (row_info->bit_depth == 8)\n      {\n         {\n            if (num_trans > 0)\n            {\n               sp = row + (png_size_t)row_width - 1;\n               dp = row + (png_size_t)(row_width << 2) - 1;\n\n               for (i = 0; i < row_width; i++)\n               {\n                  if ((int)(*sp) >= num_trans)\n                     *dp-- = 0xff;\n\n                  else\n                     *dp-- = trans_alpha[*sp];\n\n                  *dp-- = palette[*sp].blue;\n                  *dp-- = palette[*sp].green;\n                  *dp-- = palette[*sp].red;\n                  sp--;\n               }\n               row_info->bit_depth = 8;\n               row_info->pixel_depth = 32;\n               row_info->rowbytes = row_width * 4;\n               row_info->color_type = 6;\n               row_info->channels = 4;\n            }\n\n            else\n            {\n               sp = row + (png_size_t)row_width - 1;\n               dp = row + (png_size_t)(row_width * 3) - 1;\n\n               for (i = 0; i < row_width; i++)\n               {\n                  *dp-- = palette[*sp].blue;\n                  *dp-- = palette[*sp].green;\n                  *dp-- = palette[*sp].red;\n                  sp--;\n               }\n\n               row_info->bit_depth = 8;\n               row_info->pixel_depth = 24;\n               row_info->rowbytes = row_width * 3;\n               row_info->color_type = 2;\n               row_info->channels = 3;\n            }\n         }\n      }\n   }\n}\n\n/* If the bit depth < 8, it is expanded to 8.  Also, if the already\n * expanded transparency value is supplied, an alpha channel is built.\n */\nstatic void\npng_do_expand(png_row_infop row_info, png_bytep row,\n    png_const_color_16p trans_color)\n{\n   int shift, value;\n   png_bytep sp, dp;\n   png_uint_32 i;\n   png_uint_32 row_width=row_info->width;\n\n   png_debug(1, \"in png_do_expand\");\n\n   {\n      if (row_info->color_type == PNG_COLOR_TYPE_GRAY)\n      {\n         unsigned int gray = trans_color != NULL ? trans_color->gray : 0;\n\n         if (row_info->bit_depth < 8)\n         {\n            switch (row_info->bit_depth)\n            {\n               case 1:\n               {\n                  gray = (gray & 0x01) * 0xff;\n                  sp = row + (png_size_t)((row_width - 1) >> 3);\n                  dp = row + (png_size_t)row_width - 1;\n                  shift = 7 - (int)((row_width + 7) & 0x07);\n                  for (i = 0; i < row_width; i++)\n                  {\n                     if ((*sp >> shift) & 0x01)\n                        *dp = 0xff;\n\n                     else\n                        *dp = 0;\n\n                     if (shift == 7)\n                     {\n                        shift = 0;\n                        sp--;\n                     }\n\n                     else\n                        shift++;\n\n                     dp--;\n                  }\n                  break;\n               }\n\n               case 2:\n               {\n                  gray = (gray & 0x03) * 0x55;\n                  sp = row + (png_size_t)((row_width - 1) >> 2);\n                  dp = row + (png_size_t)row_width - 1;\n                  shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);\n                  for (i = 0; i < row_width; i++)\n                  {\n                     value = (*sp >> shift) & 0x03;\n                     *dp = (png_byte)(value | (value << 2) | (value << 4) |\n                        (value << 6));\n                     if (shift == 6)\n                     {\n                        shift = 0;\n                        sp--;\n                     }\n\n                     else\n                        shift += 2;\n\n                     dp--;\n                  }\n                  break;\n               }\n\n               case 4:\n               {\n                  gray = (gray & 0x0f) * 0x11;\n                  sp = row + (png_size_t)((row_width - 1) >> 1);\n                  dp = row + (png_size_t)row_width - 1;\n                  shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);\n                  for (i = 0; i < row_width; i++)\n                  {\n                     value = (*sp >> shift) & 0x0f;\n                     *dp = (png_byte)(value | (value << 4));\n                     if (shift == 4)\n                     {\n                        shift = 0;\n                        sp--;\n                     }\n\n                     else\n                        shift = 4;\n\n                     dp--;\n                  }\n                  break;\n               }\n\n               default:\n                  break;\n            }\n\n            row_info->bit_depth = 8;\n            row_info->pixel_depth = 8;\n            row_info->rowbytes = row_width;\n         }\n\n         if (trans_color != NULL)\n         {\n            if (row_info->bit_depth == 8)\n            {\n               gray = gray & 0xff;\n               sp = row + (png_size_t)row_width - 1;\n               dp = row + (png_size_t)(row_width << 1) - 1;\n\n               for (i = 0; i < row_width; i++)\n               {\n                  if ((*sp & 0xffU) == gray)\n                     *dp-- = 0;\n\n                  else\n                     *dp-- = 0xff;\n\n                  *dp-- = *sp--;\n               }\n            }\n\n            else if (row_info->bit_depth == 16)\n            {\n               unsigned int gray_high = (gray >> 8) & 0xff;\n               unsigned int gray_low = gray & 0xff;\n               sp = row + row_info->rowbytes - 1;\n               dp = row + (row_info->rowbytes << 1) - 1;\n               for (i = 0; i < row_width; i++)\n               {\n                  if ((*(sp - 1) & 0xffU) == gray_high &&\n                      (*(sp) & 0xffU) == gray_low)\n                  {\n                     *dp-- = 0;\n                     *dp-- = 0;\n                  }\n\n                  else\n                  {\n                     *dp-- = 0xff;\n                     *dp-- = 0xff;\n                  }\n\n                  *dp-- = *sp--;\n                  *dp-- = *sp--;\n               }\n            }\n\n            row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA;\n            row_info->channels = 2;\n            row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1);\n            row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,\n               row_width);\n         }\n      }\n      else if (row_info->color_type == PNG_COLOR_TYPE_RGB &&\n          trans_color != NULL)\n      {\n         if (row_info->bit_depth == 8)\n         {\n            png_byte red = (png_byte)(trans_color->red & 0xff);\n            png_byte green = (png_byte)(trans_color->green & 0xff);\n            png_byte blue = (png_byte)(trans_color->blue & 0xff);\n            sp = row + (png_size_t)row_info->rowbytes - 1;\n            dp = row + (png_size_t)(row_width << 2) - 1;\n            for (i = 0; i < row_width; i++)\n            {\n               if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue)\n                  *dp-- = 0;\n\n               else\n                  *dp-- = 0xff;\n\n               *dp-- = *sp--;\n               *dp-- = *sp--;\n               *dp-- = *sp--;\n            }\n         }\n         else if (row_info->bit_depth == 16)\n         {\n            png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff);\n            png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff);\n            png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff);\n            png_byte red_low = (png_byte)(trans_color->red & 0xff);\n            png_byte green_low = (png_byte)(trans_color->green & 0xff);\n            png_byte blue_low = (png_byte)(trans_color->blue & 0xff);\n            sp = row + row_info->rowbytes - 1;\n            dp = row + (png_size_t)(row_width << 3) - 1;\n            for (i = 0; i < row_width; i++)\n            {\n               if (*(sp - 5) == red_high &&\n                   *(sp - 4) == red_low &&\n                   *(sp - 3) == green_high &&\n                   *(sp - 2) == green_low &&\n                   *(sp - 1) == blue_high &&\n                   *(sp    ) == blue_low)\n               {\n                  *dp-- = 0;\n                  *dp-- = 0;\n               }\n\n               else\n               {\n                  *dp-- = 0xff;\n                  *dp-- = 0xff;\n               }\n\n               *dp-- = *sp--;\n               *dp-- = *sp--;\n               *dp-- = *sp--;\n               *dp-- = *sp--;\n               *dp-- = *sp--;\n               *dp-- = *sp--;\n            }\n         }\n         row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA;\n         row_info->channels = 4;\n         row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2);\n         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);\n      }\n   }\n}\n#endif\n\n#ifdef PNG_READ_EXPAND_16_SUPPORTED\n/* If the bit depth is 8 and the color type is not a palette type expand the\n * whole row to 16 bits.  Has no effect otherwise.\n */\nstatic void\npng_do_expand_16(png_row_infop row_info, png_bytep row)\n{\n   if (row_info->bit_depth == 8 &&\n      row_info->color_type != PNG_COLOR_TYPE_PALETTE)\n   {\n      /* The row have a sequence of bytes containing [0..255] and we need\n       * to turn it into another row containing [0..65535], to do this we\n       * calculate:\n       *\n       *  (input / 255) * 65535\n       *\n       *  Which happens to be exactly input * 257 and this can be achieved\n       *  simply by byte replication in place (copying backwards).\n       */\n      png_byte *sp = row + row_info->rowbytes; /* source, last byte + 1 */\n      png_byte *dp = sp + row_info->rowbytes;  /* destination, end + 1 */\n      while (dp > sp)\n         dp[-2] = dp[-1] = *--sp, dp -= 2;\n\n      row_info->rowbytes *= 2;\n      row_info->bit_depth = 16;\n      row_info->pixel_depth = (png_byte)(row_info->channels * 16);\n   }\n}\n#endif\n\n#ifdef PNG_READ_QUANTIZE_SUPPORTED\nstatic void\npng_do_quantize(png_row_infop row_info, png_bytep row,\n    png_const_bytep palette_lookup, png_const_bytep quantize_lookup)\n{\n   png_bytep sp, dp;\n   png_uint_32 i;\n   png_uint_32 row_width=row_info->width;\n\n   png_debug(1, \"in png_do_quantize\");\n\n   if (row_info->bit_depth == 8)\n   {\n      if (row_info->color_type == PNG_COLOR_TYPE_RGB && palette_lookup)\n      {\n         int r, g, b, p;\n         sp = row;\n         dp = row;\n         for (i = 0; i < row_width; i++)\n         {\n            r = *sp++;\n            g = *sp++;\n            b = *sp++;\n\n            /* This looks real messy, but the compiler will reduce\n             * it down to a reasonable formula.  For example, with\n             * 5 bits per color, we get:\n             * p = (((r >> 3) & 0x1f) << 10) |\n             *    (((g >> 3) & 0x1f) << 5) |\n             *    ((b >> 3) & 0x1f);\n             */\n            p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) &\n                ((1 << PNG_QUANTIZE_RED_BITS) - 1)) <<\n                (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) |\n                (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) &\n                ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) <<\n                (PNG_QUANTIZE_BLUE_BITS)) |\n                ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) &\n                ((1 << PNG_QUANTIZE_BLUE_BITS) - 1));\n\n            *dp++ = palette_lookup[p];\n         }\n\n         row_info->color_type = PNG_COLOR_TYPE_PALETTE;\n         row_info->channels = 1;\n         row_info->pixel_depth = row_info->bit_depth;\n         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);\n      }\n\n      else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&\n         palette_lookup != NULL)\n      {\n         int r, g, b, p;\n         sp = row;\n         dp = row;\n         for (i = 0; i < row_width; i++)\n         {\n            r = *sp++;\n            g = *sp++;\n            b = *sp++;\n            sp++;\n\n            p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) &\n                ((1 << PNG_QUANTIZE_RED_BITS) - 1)) <<\n                (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) |\n                (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) &\n                ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) <<\n                (PNG_QUANTIZE_BLUE_BITS)) |\n                ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) &\n                ((1 << PNG_QUANTIZE_BLUE_BITS) - 1));\n\n            *dp++ = palette_lookup[p];\n         }\n\n         row_info->color_type = PNG_COLOR_TYPE_PALETTE;\n         row_info->channels = 1;\n         row_info->pixel_depth = row_info->bit_depth;\n         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);\n      }\n\n      else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE &&\n         quantize_lookup)\n      {\n         sp = row;\n\n         for (i = 0; i < row_width; i++, sp++)\n         {\n            *sp = quantize_lookup[*sp];\n         }\n      }\n   }\n}\n#endif /* READ_QUANTIZE */\n\n/* Transform the row.  The order of transformations is significant,\n * and is very touchy.  If you add a transformation, take care to\n * decide how it fits in with the other transformations here.\n */\nvoid /* PRIVATE */\npng_do_read_transformations(png_structrp png_ptr, png_row_infop row_info)\n{\n   png_debug(1, \"in png_do_read_transformations\");\n\n   if (png_ptr->row_buf == NULL)\n   {\n      /* Prior to 1.5.4 this output row/pass where the NULL pointer is, but this\n       * error is incredibly rare and incredibly easy to debug without this\n       * information.\n       */\n      png_error(png_ptr, \"NULL row buffer\");\n   }\n\n   /* The following is debugging; prior to 1.5.4 the code was never compiled in;\n    * in 1.5.4 PNG_FLAG_DETECT_UNINITIALIZED was added and the macro\n    * PNG_WARN_UNINITIALIZED_ROW removed.  In 1.6 the new flag is set only for\n    * all transformations, however in practice the ROW_INIT always gets done on\n    * demand, if necessary.\n    */\n   if ((png_ptr->flags & PNG_FLAG_DETECT_UNINITIALIZED) != 0 &&\n       (png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)\n   {\n      /* Application has failed to call either png_read_start_image() or\n       * png_read_update_info() after setting transforms that expand pixels.\n       * This check added to libpng-1.2.19 (but not enabled until 1.5.4).\n       */\n      png_error(png_ptr, \"Uninitialized row\");\n   }\n\n#ifdef PNG_READ_EXPAND_SUPPORTED\n   if ((png_ptr->transformations & PNG_EXPAND) != 0)\n   {\n      if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)\n      {\n         png_do_expand_palette(row_info, png_ptr->row_buf + 1,\n             png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans);\n      }\n\n      else\n      {\n         if (png_ptr->num_trans != 0 &&\n             (png_ptr->transformations & PNG_EXPAND_tRNS) != 0)\n            png_do_expand(row_info, png_ptr->row_buf + 1,\n                &(png_ptr->trans_color));\n\n         else\n            png_do_expand(row_info, png_ptr->row_buf + 1,\n                NULL);\n      }\n   }\n#endif\n\n#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED\n   if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 &&\n       (png_ptr->transformations & PNG_COMPOSE) == 0 &&\n       (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||\n       row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))\n      png_do_strip_channel(row_info, png_ptr->row_buf + 1,\n         0 /* at_start == false, because SWAP_ALPHA happens later */);\n#endif\n\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\n   if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)\n   {\n      int rgb_error =\n          png_do_rgb_to_gray(png_ptr, row_info,\n              png_ptr->row_buf + 1);\n\n      if (rgb_error != 0)\n      {\n         png_ptr->rgb_to_gray_status=1;\n         if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==\n             PNG_RGB_TO_GRAY_WARN)\n            png_warning(png_ptr, \"png_do_rgb_to_gray found nongray pixel\");\n\n         if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==\n             PNG_RGB_TO_GRAY_ERR)\n            png_error(png_ptr, \"png_do_rgb_to_gray found nongray pixel\");\n      }\n   }\n#endif\n\n/* From Andreas Dilger e-mail to png-implement, 26 March 1998:\n *\n *   In most cases, the \"simple transparency\" should be done prior to doing\n *   gray-to-RGB, or you will have to test 3x as many bytes to check if a\n *   pixel is transparent.  You would also need to make sure that the\n *   transparency information is upgraded to RGB.\n *\n *   To summarize, the current flow is:\n *   - Gray + simple transparency -> compare 1 or 2 gray bytes and composite\n *                                   with background \"in place\" if transparent,\n *                                   convert to RGB if necessary\n *   - Gray + alpha -> composite with gray background and remove alpha bytes,\n *                                   convert to RGB if necessary\n *\n *   To support RGB backgrounds for gray images we need:\n *   - Gray + simple transparency -> convert to RGB + simple transparency,\n *                                   compare 3 or 6 bytes and composite with\n *                                   background \"in place\" if transparent\n *                                   (3x compare/pixel compared to doing\n *                                   composite with gray bkgrnd)\n *   - Gray + alpha -> convert to RGB + alpha, composite with background and\n *                                   remove alpha bytes (3x float\n *                                   operations/pixel compared with composite\n *                                   on gray background)\n *\n *  Greg's change will do this.  The reason it wasn't done before is for\n *  performance, as this increases the per-pixel operations.  If we would check\n *  in advance if the background was gray or RGB, and position the gray-to-RGB\n *  transform appropriately, then it would save a lot of work/time.\n */\n\n#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED\n   /* If gray -> RGB, do so now only if background is non-gray; else do later\n    * for performance reasons\n    */\n   if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0 &&\n       (png_ptr->mode & PNG_BACKGROUND_IS_GRAY) == 0)\n      png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);\n#endif\n\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\\\n   defined(PNG_READ_ALPHA_MODE_SUPPORTED)\n   if ((png_ptr->transformations & PNG_COMPOSE) != 0)\n      png_do_compose(row_info, png_ptr->row_buf + 1, png_ptr);\n#endif\n\n#ifdef PNG_READ_GAMMA_SUPPORTED\n   if ((png_ptr->transformations & PNG_GAMMA) != 0 &&\n#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED\n      /* Because RGB_TO_GRAY does the gamma transform. */\n      (png_ptr->transformations & PNG_RGB_TO_GRAY) == 0 &&\n#endif\n#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\\\n   defined(PNG_READ_ALPHA_MODE_SUPPORTED)\n      /* Because PNG_COMPOSE does the gamma transform if there is something to\n       * do (if there is an alpha channel or transparency.)\n       */\n       !((png_ptr->transformations & PNG_COMPOSE) != 0 &&\n       ((png_ptr->num_trans != 0) ||\n       (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)) &&\n#endif\n      /* Because png_init_read_transformations transforms the palette, unless\n       * RGB_TO_GRAY will do the transform.\n       */\n       (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))\n      png_do_gamma(row_info, png_ptr->row_buf + 1, png_ptr);\n#endif\n\n#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED\n   if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 &&\n       (png_ptr->transformations & PNG_COMPOSE) != 0 &&\n       (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||\n       row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))\n      png_do_strip_channel(row_info, png_ptr->row_buf + 1,\n          0 /* at_start == false, because SWAP_ALPHA happens later */);\n#endif\n\n#ifdef PNG_READ_ALPHA_MODE_SUPPORTED\n   if ((png_ptr->transformations & PNG_ENCODE_ALPHA) != 0 &&\n       (row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)\n      png_do_encode_alpha(row_info, png_ptr->row_buf + 1, png_ptr);\n#endif\n\n#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED\n   if ((png_ptr->transformations & PNG_SCALE_16_TO_8) != 0)\n      png_do_scale_16_to_8(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED\n   /* There is no harm in doing both of these because only one has any effect,\n    * by putting the 'scale' option first if the app asks for scale (either by\n    * calling the API or in a TRANSFORM flag) this is what happens.\n    */\n   if ((png_ptr->transformations & PNG_16_TO_8) != 0)\n      png_do_chop(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_QUANTIZE_SUPPORTED\n   if ((png_ptr->transformations & PNG_QUANTIZE) != 0)\n   {\n      png_do_quantize(row_info, png_ptr->row_buf + 1,\n          png_ptr->palette_lookup, png_ptr->quantize_index);\n\n      if (row_info->rowbytes == 0)\n         png_error(png_ptr, \"png_do_quantize returned rowbytes=0\");\n   }\n#endif /* READ_QUANTIZE */\n\n#ifdef PNG_READ_EXPAND_16_SUPPORTED\n   /* Do the expansion now, after all the arithmetic has been done.  Notice\n    * that previous transformations can handle the PNG_EXPAND_16 flag if this\n    * is efficient (particularly true in the case of gamma correction, where\n    * better accuracy results faster!)\n    */\n   if ((png_ptr->transformations & PNG_EXPAND_16) != 0)\n      png_do_expand_16(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED\n   /* NOTE: moved here in 1.5.4 (from much later in this list.) */\n   if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0 &&\n       (png_ptr->mode & PNG_BACKGROUND_IS_GRAY) != 0)\n      png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_INVERT_SUPPORTED\n   if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)\n      png_do_invert(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED\n   if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)\n      png_do_read_invert_alpha(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_SHIFT_SUPPORTED\n   if ((png_ptr->transformations & PNG_SHIFT) != 0)\n      png_do_unshift(row_info, png_ptr->row_buf + 1,\n          &(png_ptr->shift));\n#endif\n\n#ifdef PNG_READ_PACK_SUPPORTED\n   if ((png_ptr->transformations & PNG_PACK) != 0)\n      png_do_unpack(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED\n   /* Added at libpng-1.5.10 */\n   if (row_info->color_type == PNG_COLOR_TYPE_PALETTE &&\n       png_ptr->num_palette_max >= 0)\n      png_do_check_palette_indexes(png_ptr, row_info);\n#endif\n\n#ifdef PNG_READ_BGR_SUPPORTED\n   if ((png_ptr->transformations & PNG_BGR) != 0)\n      png_do_bgr(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_PACKSWAP_SUPPORTED\n   if ((png_ptr->transformations & PNG_PACKSWAP) != 0)\n      png_do_packswap(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_FILLER_SUPPORTED\n   if ((png_ptr->transformations & PNG_FILLER) != 0)\n      png_do_read_filler(row_info, png_ptr->row_buf + 1,\n          (png_uint_32)png_ptr->filler, png_ptr->flags);\n#endif\n\n#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED\n   if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0)\n      png_do_read_swap_alpha(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_READ_16BIT_SUPPORTED\n#ifdef PNG_READ_SWAP_SUPPORTED\n   if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)\n      png_do_swap(row_info, png_ptr->row_buf + 1);\n#endif\n#endif\n\n#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED\n   if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)\n   {\n      if (png_ptr->read_user_transform_fn != NULL)\n         (*(png_ptr->read_user_transform_fn)) /* User read transform function */\n             (png_ptr,     /* png_ptr */\n             row_info,     /* row_info: */\n                /*  png_uint_32 width;       width of row */\n                /*  png_size_t rowbytes;     number of bytes in row */\n                /*  png_byte color_type;     color type of pixels */\n                /*  png_byte bit_depth;      bit depth of samples */\n                /*  png_byte channels;       number of channels (1-4) */\n                /*  png_byte pixel_depth;    bits per pixel (depth*channels) */\n             png_ptr->row_buf + 1);    /* start of pixel data for row */\n#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED\n      if (png_ptr->user_transform_depth != 0)\n         row_info->bit_depth = png_ptr->user_transform_depth;\n\n      if (png_ptr->user_transform_channels != 0)\n         row_info->channels = png_ptr->user_transform_channels;\n#endif\n      row_info->pixel_depth = (png_byte)(row_info->bit_depth *\n          row_info->channels);\n\n      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_info->width);\n   }\n#endif\n}\n\n#endif /* READ_TRANSFORMS */\n#endif /* READ */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngrutil.c",
    "content": "\n/* pngrutil.c - utilities to read a PNG file\n *\n * Last changed in libpng 1.6.20 [December 3, 2014]\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * This file contains routines that are only called from within\n * libpng itself during the course of reading an image.\n */\n\n#include \"pngpriv.h\"\n\n#ifdef PNG_READ_SUPPORTED\n\npng_uint_32 PNGAPI\npng_get_uint_31(png_const_structrp png_ptr, png_const_bytep buf)\n{\n   png_uint_32 uval = png_get_uint_32(buf);\n\n   if (uval > PNG_UINT_31_MAX)\n      png_error(png_ptr, \"PNG unsigned integer out of range\");\n\n   return (uval);\n}\n\n#if defined(PNG_READ_gAMA_SUPPORTED) || defined(PNG_READ_cHRM_SUPPORTED)\n/* The following is a variation on the above for use with the fixed\n * point values used for gAMA and cHRM.  Instead of png_error it\n * issues a warning and returns (-1) - an invalid value because both\n * gAMA and cHRM use *unsigned* integers for fixed point values.\n */\n#define PNG_FIXED_ERROR (-1)\n\nstatic png_fixed_point /* PRIVATE */\npng_get_fixed_point(png_structrp png_ptr, png_const_bytep buf)\n{\n   png_uint_32 uval = png_get_uint_32(buf);\n\n   if (uval <= PNG_UINT_31_MAX)\n      return (png_fixed_point)uval; /* known to be in range */\n\n   /* The caller can turn off the warning by passing NULL. */\n   if (png_ptr != NULL)\n      png_warning(png_ptr, \"PNG fixed point integer out of range\");\n\n   return PNG_FIXED_ERROR;\n}\n#endif\n\n#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED\n/* NOTE: the read macros will obscure these definitions, so that if\n * PNG_USE_READ_MACROS is set the library will not use them internally,\n * but the APIs will still be available externally.\n *\n * The parentheses around \"PNGAPI function_name\" in the following three\n * functions are necessary because they allow the macros to co-exist with\n * these (unused but exported) functions.\n */\n\n/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */\npng_uint_32 (PNGAPI\npng_get_uint_32)(png_const_bytep buf)\n{\n   png_uint_32 uval =\n       ((png_uint_32)(*(buf    )) << 24) +\n       ((png_uint_32)(*(buf + 1)) << 16) +\n       ((png_uint_32)(*(buf + 2)) <<  8) +\n       ((png_uint_32)(*(buf + 3))      ) ;\n\n   return uval;\n}\n\n/* Grab a signed 32-bit integer from a buffer in big-endian format.  The\n * data is stored in the PNG file in two's complement format and there\n * is no guarantee that a 'png_int_32' is exactly 32 bits, therefore\n * the following code does a two's complement to native conversion.\n */\npng_int_32 (PNGAPI\npng_get_int_32)(png_const_bytep buf)\n{\n   png_uint_32 uval = png_get_uint_32(buf);\n   if ((uval & 0x80000000) == 0) /* non-negative */\n      return uval;\n\n   uval = (uval ^ 0xffffffff) + 1;  /* 2's complement: -x = ~x+1 */\n   if ((uval & 0x80000000) == 0) /* no overflow */\n       return -(png_int_32)uval;\n   /* The following has to be safe; this function only gets called on PNG data\n    * and if we get here that data is invalid.  0 is the most safe value and\n    * if not then an attacker would surely just generate a PNG with 0 instead.\n    */\n   return 0;\n}\n\n/* Grab an unsigned 16-bit integer from a buffer in big-endian format. */\npng_uint_16 (PNGAPI\npng_get_uint_16)(png_const_bytep buf)\n{\n   /* ANSI-C requires an int value to accomodate at least 16 bits so this\n    * works and allows the compiler not to worry about possible narrowing\n    * on 32-bit systems.  (Pre-ANSI systems did not make integers smaller\n    * than 16 bits either.)\n    */\n   unsigned int val =\n       ((unsigned int)(*buf) << 8) +\n       ((unsigned int)(*(buf + 1)));\n\n   return (png_uint_16)val;\n}\n\n#endif /* READ_INT_FUNCTIONS */\n\n/* Read and check the PNG file signature */\nvoid /* PRIVATE */\npng_read_sig(png_structrp png_ptr, png_inforp info_ptr)\n{\n   png_size_t num_checked, num_to_check;\n\n   /* Exit if the user application does not expect a signature. */\n   if (png_ptr->sig_bytes >= 8)\n      return;\n\n   num_checked = png_ptr->sig_bytes;\n   num_to_check = 8 - num_checked;\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   png_ptr->io_state = PNG_IO_READING | PNG_IO_SIGNATURE;\n#endif\n\n   /* The signature must be serialized in a single I/O call. */\n   png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);\n   png_ptr->sig_bytes = 8;\n\n   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check) != 0)\n   {\n      if (num_checked < 4 &&\n          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))\n         png_error(png_ptr, \"Not a PNG file\");\n      else\n         png_error(png_ptr, \"PNG file corrupted by ASCII conversion\");\n   }\n   if (num_checked < 3)\n      png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;\n}\n\n/* Read the chunk header (length + type name).\n * Put the type name into png_ptr->chunk_name, and return the length.\n */\npng_uint_32 /* PRIVATE */\npng_read_chunk_header(png_structrp png_ptr)\n{\n   png_byte buf[8];\n   png_uint_32 length;\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_HDR;\n#endif\n\n   /* Read the length and the chunk name.\n    * This must be performed in a single I/O call.\n    */\n   png_read_data(png_ptr, buf, 8);\n   length = png_get_uint_31(png_ptr, buf);\n\n   /* Put the chunk name into png_ptr->chunk_name. */\n   png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(buf+4);\n\n   png_debug2(0, \"Reading %lx chunk, length = %lu\",\n       (unsigned long)png_ptr->chunk_name, (unsigned long)length);\n\n   /* Reset the crc and run it over the chunk name. */\n   png_reset_crc(png_ptr);\n   png_calculate_crc(png_ptr, buf + 4, 4);\n\n   /* Check to see if chunk name is valid. */\n   png_check_chunk_name(png_ptr, png_ptr->chunk_name);\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_DATA;\n#endif\n\n   return length;\n}\n\n/* Read data, and (optionally) run it through the CRC. */\nvoid /* PRIVATE */\npng_crc_read(png_structrp png_ptr, png_bytep buf, png_uint_32 length)\n{\n   if (png_ptr == NULL)\n      return;\n\n   png_read_data(png_ptr, buf, length);\n   png_calculate_crc(png_ptr, buf, length);\n}\n\n/* Optionally skip data and then check the CRC.  Depending on whether we\n * are reading an ancillary or critical chunk, and how the program has set\n * things up, we may calculate the CRC on the data and print a message.\n * Returns '1' if there was a CRC error, '0' otherwise.\n */\nint /* PRIVATE */\npng_crc_finish(png_structrp png_ptr, png_uint_32 skip)\n{\n   /* The size of the local buffer for inflate is a good guess as to a\n    * reasonable size to use for buffering reads from the application.\n    */\n   while (skip > 0)\n   {\n      png_uint_32 len;\n      png_byte tmpbuf[PNG_INFLATE_BUF_SIZE];\n\n      len = (sizeof tmpbuf);\n      if (len > skip)\n         len = skip;\n      skip -= len;\n\n      png_crc_read(png_ptr, tmpbuf, len);\n   }\n\n   if (png_crc_error(png_ptr) != 0)\n   {\n      if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0 ?\n          (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) == 0 :\n          (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE) != 0)\n      {\n         png_chunk_warning(png_ptr, \"CRC error\");\n      }\n\n      else\n         png_chunk_error(png_ptr, \"CRC error\");\n\n      return (1);\n   }\n\n   return (0);\n}\n\n/* Compare the CRC stored in the PNG file with that calculated by libpng from\n * the data it has read thus far.\n */\nint /* PRIVATE */\npng_crc_error(png_structrp png_ptr)\n{\n   png_byte crc_bytes[4];\n   png_uint_32 crc;\n   int need_crc = 1;\n\n   if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0)\n   {\n      if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==\n          (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))\n         need_crc = 0;\n   }\n\n   else /* critical */\n   {\n      if ((png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) != 0)\n         need_crc = 0;\n   }\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_CRC;\n#endif\n\n   /* The chunk CRC must be serialized in a single I/O call. */\n   png_read_data(png_ptr, crc_bytes, 4);\n\n   if (need_crc != 0)\n   {\n      crc = png_get_uint_32(crc_bytes);\n      return ((int)(crc != png_ptr->crc));\n   }\n\n   else\n      return (0);\n}\n\n#if defined(PNG_READ_iCCP_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) ||\\\n    defined(PNG_READ_pCAL_SUPPORTED) || defined(PNG_READ_sCAL_SUPPORTED) ||\\\n    defined(PNG_READ_sPLT_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) ||\\\n    defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_SEQUENTIAL_READ_SUPPORTED)\n/* Manage the read buffer; this simply reallocates the buffer if it is not small\n * enough (or if it is not allocated).  The routine returns a pointer to the\n * buffer; if an error occurs and 'warn' is set the routine returns NULL, else\n * it will call png_error (via png_malloc) on failure.  (warn == 2 means\n * 'silent').\n */\nstatic png_bytep\npng_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn)\n{\n   png_bytep buffer = png_ptr->read_buffer;\n\n   if (buffer != NULL && new_size > png_ptr->read_buffer_size)\n   {\n      png_ptr->read_buffer = NULL;\n      png_ptr->read_buffer = NULL;\n      png_ptr->read_buffer_size = 0;\n      png_free(png_ptr, buffer);\n      buffer = NULL;\n   }\n\n   if (buffer == NULL)\n   {\n      buffer = png_voidcast(png_bytep, png_malloc_base(png_ptr, new_size));\n\n      if (buffer != NULL)\n      {\n         png_ptr->read_buffer = buffer;\n         png_ptr->read_buffer_size = new_size;\n      }\n\n      else if (warn < 2) /* else silent */\n      {\n         if (warn != 0)\n             png_chunk_warning(png_ptr, \"insufficient memory to read chunk\");\n\n         else\n             png_chunk_error(png_ptr, \"insufficient memory to read chunk\");\n      }\n   }\n\n   return buffer;\n}\n#endif /* READ_iCCP|iTXt|pCAL|sCAL|sPLT|tEXt|zTXt|SEQUENTIAL_READ */\n\n/* png_inflate_claim: claim the zstream for some nefarious purpose that involves\n * decompression.  Returns Z_OK on success, else a zlib error code.  It checks\n * the owner but, in final release builds, just issues a warning if some other\n * chunk apparently owns the stream.  Prior to release it does a png_error.\n */\nstatic int\npng_inflate_claim(png_structrp png_ptr, png_uint_32 owner)\n{\n   if (png_ptr->zowner != 0)\n   {\n      char msg[64];\n\n      PNG_STRING_FROM_CHUNK(msg, png_ptr->zowner);\n      /* So the message that results is \"<chunk> using zstream\"; this is an\n       * internal error, but is very useful for debugging.  i18n requirements\n       * are minimal.\n       */\n      (void)png_safecat(msg, (sizeof msg), 4, \" using zstream\");\n#if PNG_RELEASE_BUILD\n      png_chunk_warning(png_ptr, msg);\n      png_ptr->zowner = 0;\n#else\n      png_chunk_error(png_ptr, msg);\n#endif\n   }\n\n   /* Implementation note: unlike 'png_deflate_claim' this internal function\n    * does not take the size of the data as an argument.  Some efficiency could\n    * be gained by using this when it is known *if* the zlib stream itself does\n    * not record the number; however, this is an illusion: the original writer\n    * of the PNG may have selected a lower window size, and we really must\n    * follow that because, for systems with with limited capabilities, we\n    * would otherwise reject the application's attempts to use a smaller window\n    * size (zlib doesn't have an interface to say \"this or lower\"!).\n    *\n    * inflateReset2 was added to zlib 1.2.4; before this the window could not be\n    * reset, therefore it is necessary to always allocate the maximum window\n    * size with earlier zlibs just in case later compressed chunks need it.\n    */\n   {\n      int ret; /* zlib return code */\n#if PNG_ZLIB_VERNUM >= 0x1240\n\n# if defined(PNG_SET_OPTION_SUPPORTED) && defined(PNG_MAXIMUM_INFLATE_WINDOW)\n      int window_bits;\n\n      if (((png_ptr->options >> PNG_MAXIMUM_INFLATE_WINDOW) & 3) ==\n          PNG_OPTION_ON)\n      {\n         window_bits = 15;\n         png_ptr->zstream_start = 0; /* fixed window size */\n      }\n\n      else\n      {\n         window_bits = 0;\n         png_ptr->zstream_start = 1;\n      }\n# else\n#   define window_bits 0\n# endif\n#endif\n\n      /* Set this for safety, just in case the previous owner left pointers to\n       * memory allocations.\n       */\n      png_ptr->zstream.next_in = NULL;\n      png_ptr->zstream.avail_in = 0;\n      png_ptr->zstream.next_out = NULL;\n      png_ptr->zstream.avail_out = 0;\n\n      if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)\n      {\n#if PNG_ZLIB_VERNUM < 0x1240\n         ret = inflateReset(&png_ptr->zstream);\n#else\n         ret = inflateReset2(&png_ptr->zstream, window_bits);\n#endif\n      }\n\n      else\n      {\n#if PNG_ZLIB_VERNUM < 0x1240\n         ret = inflateInit(&png_ptr->zstream);\n#else\n         ret = inflateInit2(&png_ptr->zstream, window_bits);\n#endif\n\n         if (ret == Z_OK)\n            png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED;\n      }\n\n      if (ret == Z_OK)\n         png_ptr->zowner = owner;\n\n      else\n         png_zstream_error(png_ptr, ret);\n\n      return ret;\n   }\n\n#ifdef window_bits\n# undef window_bits\n#endif\n}\n\n#if PNG_ZLIB_VERNUM >= 0x1240\n/* Handle the start of the inflate stream if we called inflateInit2(strm,0);\n * in this case some zlib versions skip validation of the CINFO field and, in\n * certain circumstances, libpng may end up displaying an invalid image, in\n * contrast to implementations that call zlib in the normal way (e.g. libpng\n * 1.5).\n */\nint /* PRIVATE */\npng_zlib_inflate(png_structrp png_ptr, int flush)\n{\n   if (png_ptr->zstream_start && png_ptr->zstream.avail_in > 0)\n   {\n      if ((*png_ptr->zstream.next_in >> 4) > 7)\n      {\n         png_ptr->zstream.msg = \"invalid window size (libpng)\";\n         return Z_DATA_ERROR;\n      }\n\n      png_ptr->zstream_start = 0;\n   }\n\n   return inflate(&png_ptr->zstream, flush);\n}\n#endif /* Zlib >= 1.2.4 */\n\n#ifdef PNG_READ_COMPRESSED_TEXT_SUPPORTED\n/* png_inflate now returns zlib error codes including Z_OK and Z_STREAM_END to\n * allow the caller to do multiple calls if required.  If the 'finish' flag is\n * set Z_FINISH will be passed to the final inflate() call and Z_STREAM_END must\n * be returned or there has been a problem, otherwise Z_SYNC_FLUSH is used and\n * Z_OK or Z_STREAM_END will be returned on success.\n *\n * The input and output sizes are updated to the actual amounts of data consumed\n * or written, not the amount available (as in a z_stream).  The data pointers\n * are not changed, so the next input is (data+input_size) and the next\n * available output is (output+output_size).\n */\nstatic int\npng_inflate(png_structrp png_ptr, png_uint_32 owner, int finish,\n    /* INPUT: */ png_const_bytep input, png_uint_32p input_size_ptr,\n    /* OUTPUT: */ png_bytep output, png_alloc_size_t *output_size_ptr)\n{\n   if (png_ptr->zowner == owner) /* Else not claimed */\n   {\n      int ret;\n      png_alloc_size_t avail_out = *output_size_ptr;\n      png_uint_32 avail_in = *input_size_ptr;\n\n      /* zlib can't necessarily handle more than 65535 bytes at once (i.e. it\n       * can't even necessarily handle 65536 bytes) because the type uInt is\n       * \"16 bits or more\".  Consequently it is necessary to chunk the input to\n       * zlib.  This code uses ZLIB_IO_MAX, from pngpriv.h, as the maximum (the\n       * maximum value that can be stored in a uInt.)  It is possible to set\n       * ZLIB_IO_MAX to a lower value in pngpriv.h and this may sometimes have\n       * a performance advantage, because it reduces the amount of data accessed\n       * at each step and that may give the OS more time to page it in.\n       */\n      png_ptr->zstream.next_in = PNGZ_INPUT_CAST(input);\n      /* avail_in and avail_out are set below from 'size' */\n      png_ptr->zstream.avail_in = 0;\n      png_ptr->zstream.avail_out = 0;\n\n      /* Read directly into the output if it is available (this is set to\n       * a local buffer below if output is NULL).\n       */\n      if (output != NULL)\n         png_ptr->zstream.next_out = output;\n\n      do\n      {\n         uInt avail;\n         Byte local_buffer[PNG_INFLATE_BUF_SIZE];\n\n         /* zlib INPUT BUFFER */\n         /* The setting of 'avail_in' used to be outside the loop; by setting it\n          * inside it is possible to chunk the input to zlib and simply rely on\n          * zlib to advance the 'next_in' pointer.  This allows arbitrary\n          * amounts of data to be passed through zlib at the unavoidable cost of\n          * requiring a window save (memcpy of up to 32768 output bytes)\n          * every ZLIB_IO_MAX input bytes.\n          */\n         avail_in += png_ptr->zstream.avail_in; /* not consumed last time */\n\n         avail = ZLIB_IO_MAX;\n\n         if (avail_in < avail)\n            avail = (uInt)avail_in; /* safe: < than ZLIB_IO_MAX */\n\n         avail_in -= avail;\n         png_ptr->zstream.avail_in = avail;\n\n         /* zlib OUTPUT BUFFER */\n         avail_out += png_ptr->zstream.avail_out; /* not written last time */\n\n         avail = ZLIB_IO_MAX; /* maximum zlib can process */\n\n         if (output == NULL)\n         {\n            /* Reset the output buffer each time round if output is NULL and\n             * make available the full buffer, up to 'remaining_space'\n             */\n            png_ptr->zstream.next_out = local_buffer;\n            if ((sizeof local_buffer) < avail)\n               avail = (sizeof local_buffer);\n         }\n\n         if (avail_out < avail)\n            avail = (uInt)avail_out; /* safe: < ZLIB_IO_MAX */\n\n         png_ptr->zstream.avail_out = avail;\n         avail_out -= avail;\n\n         /* zlib inflate call */\n         /* In fact 'avail_out' may be 0 at this point, that happens at the end\n          * of the read when the final LZ end code was not passed at the end of\n          * the previous chunk of input data.  Tell zlib if we have reached the\n          * end of the output buffer.\n          */\n         ret = PNG_INFLATE(png_ptr, avail_out > 0 ? Z_NO_FLUSH :\n             (finish ? Z_FINISH : Z_SYNC_FLUSH));\n      } while (ret == Z_OK);\n\n      /* For safety kill the local buffer pointer now */\n      if (output == NULL)\n         png_ptr->zstream.next_out = NULL;\n\n      /* Claw back the 'size' and 'remaining_space' byte counts. */\n      avail_in += png_ptr->zstream.avail_in;\n      avail_out += png_ptr->zstream.avail_out;\n\n      /* Update the input and output sizes; the updated values are the amount\n       * consumed or written, effectively the inverse of what zlib uses.\n       */\n      if (avail_out > 0)\n         *output_size_ptr -= avail_out;\n\n      if (avail_in > 0)\n         *input_size_ptr -= avail_in;\n\n      /* Ensure png_ptr->zstream.msg is set (even in the success case!) */\n      png_zstream_error(png_ptr, ret);\n      return ret;\n   }\n\n   else\n   {\n      /* This is a bad internal error.  The recovery assigns to the zstream msg\n       * pointer, which is not owned by the caller, but this is safe; it's only\n       * used on errors!\n       */\n      png_ptr->zstream.msg = PNGZ_MSG_CAST(\"zstream unclaimed\");\n      return Z_STREAM_ERROR;\n   }\n}\n\n/*\n * Decompress trailing data in a chunk.  The assumption is that read_buffer\n * points at an allocated area holding the contents of a chunk with a\n * trailing compressed part.  What we get back is an allocated area\n * holding the original prefix part and an uncompressed version of the\n * trailing part (the malloc area passed in is freed).\n */\nstatic int\npng_decompress_chunk(png_structrp png_ptr,\n   png_uint_32 chunklength, png_uint_32 prefix_size,\n   png_alloc_size_t *newlength /* must be initialized to the maximum! */,\n   int terminate /*add a '\\0' to the end of the uncompressed data*/)\n{\n   /* TODO: implement different limits for different types of chunk.\n    *\n    * The caller supplies *newlength set to the maximum length of the\n    * uncompressed data, but this routine allocates space for the prefix and\n    * maybe a '\\0' terminator too.  We have to assume that 'prefix_size' is\n    * limited only by the maximum chunk size.\n    */\n   png_alloc_size_t limit = PNG_SIZE_MAX;\n\n# ifdef PNG_SET_USER_LIMITS_SUPPORTED\n   if (png_ptr->user_chunk_malloc_max > 0 &&\n       png_ptr->user_chunk_malloc_max < limit)\n      limit = png_ptr->user_chunk_malloc_max;\n# elif PNG_USER_CHUNK_MALLOC_MAX > 0\n   if (PNG_USER_CHUNK_MALLOC_MAX < limit)\n      limit = PNG_USER_CHUNK_MALLOC_MAX;\n# endif\n\n   if (limit >= prefix_size + (terminate != 0))\n   {\n      int ret;\n\n      limit -= prefix_size + (terminate != 0);\n\n      if (limit < *newlength)\n         *newlength = limit;\n\n      /* Now try to claim the stream. */\n      ret = png_inflate_claim(png_ptr, png_ptr->chunk_name);\n\n      if (ret == Z_OK)\n      {\n         png_uint_32 lzsize = chunklength - prefix_size;\n\n         ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/,\n            /* input: */ png_ptr->read_buffer + prefix_size, &lzsize,\n            /* output: */ NULL, newlength);\n\n         if (ret == Z_STREAM_END)\n         {\n            /* Use 'inflateReset' here, not 'inflateReset2' because this\n             * preserves the previously decided window size (otherwise it would\n             * be necessary to store the previous window size.)  In practice\n             * this doesn't matter anyway, because png_inflate will call inflate\n             * with Z_FINISH in almost all cases, so the window will not be\n             * maintained.\n             */\n            if (inflateReset(&png_ptr->zstream) == Z_OK)\n            {\n               /* Because of the limit checks above we know that the new,\n                * expanded, size will fit in a size_t (let alone an\n                * png_alloc_size_t).  Use png_malloc_base here to avoid an\n                * extra OOM message.\n                */\n               png_alloc_size_t new_size = *newlength;\n               png_alloc_size_t buffer_size = prefix_size + new_size +\n                  (terminate != 0);\n               png_bytep text = png_voidcast(png_bytep, png_malloc_base(png_ptr,\n                  buffer_size));\n\n               if (text != NULL)\n               {\n                  ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/,\n                     png_ptr->read_buffer + prefix_size, &lzsize,\n                     text + prefix_size, newlength);\n\n                  if (ret == Z_STREAM_END)\n                  {\n                     if (new_size == *newlength)\n                     {\n                        if (terminate != 0)\n                           text[prefix_size + *newlength] = 0;\n\n                        if (prefix_size > 0)\n                           memcpy(text, png_ptr->read_buffer, prefix_size);\n\n                        {\n                           png_bytep old_ptr = png_ptr->read_buffer;\n\n                           png_ptr->read_buffer = text;\n                           png_ptr->read_buffer_size = buffer_size;\n                           text = old_ptr; /* freed below */\n                        }\n                     }\n\n                     else\n                     {\n                        /* The size changed on the second read, there can be no\n                         * guarantee that anything is correct at this point.\n                         * The 'msg' pointer has been set to \"unexpected end of\n                         * LZ stream\", which is fine, but return an error code\n                         * that the caller won't accept.\n                         */\n                        ret = PNG_UNEXPECTED_ZLIB_RETURN;\n                     }\n                  }\n\n                  else if (ret == Z_OK)\n                     ret = PNG_UNEXPECTED_ZLIB_RETURN; /* for safety */\n\n                  /* Free the text pointer (this is the old read_buffer on\n                   * success)\n                   */\n                  png_free(png_ptr, text);\n\n                  /* This really is very benign, but it's still an error because\n                   * the extra space may otherwise be used as a Trojan Horse.\n                   */\n                  if (ret == Z_STREAM_END &&\n                     chunklength - prefix_size != lzsize)\n                     png_chunk_benign_error(png_ptr, \"extra compressed data\");\n               }\n\n               else\n               {\n                  /* Out of memory allocating the buffer */\n                  ret = Z_MEM_ERROR;\n                  png_zstream_error(png_ptr, Z_MEM_ERROR);\n               }\n            }\n\n            else\n            {\n               /* inflateReset failed, store the error message */\n               png_zstream_error(png_ptr, ret);\n\n               if (ret == Z_STREAM_END)\n                  ret = PNG_UNEXPECTED_ZLIB_RETURN;\n            }\n         }\n\n         else if (ret == Z_OK)\n            ret = PNG_UNEXPECTED_ZLIB_RETURN;\n\n         /* Release the claimed stream */\n         png_ptr->zowner = 0;\n      }\n\n      else /* the claim failed */ if (ret == Z_STREAM_END) /* impossible! */\n         ret = PNG_UNEXPECTED_ZLIB_RETURN;\n\n      return ret;\n   }\n\n   else\n   {\n      /* Application/configuration limits exceeded */\n      png_zstream_error(png_ptr, Z_MEM_ERROR);\n      return Z_MEM_ERROR;\n   }\n}\n#endif /* READ_COMPRESSED_TEXT */\n\n#ifdef PNG_READ_iCCP_SUPPORTED\n/* Perform a partial read and decompress, producing 'avail_out' bytes and\n * reading from the current chunk as required.\n */\nstatic int\npng_inflate_read(png_structrp png_ptr, png_bytep read_buffer, uInt read_size,\n   png_uint_32p chunk_bytes, png_bytep next_out, png_alloc_size_t *out_size,\n   int finish)\n{\n   if (png_ptr->zowner == png_ptr->chunk_name)\n   {\n      int ret;\n\n      /* next_in and avail_in must have been initialized by the caller. */\n      png_ptr->zstream.next_out = next_out;\n      png_ptr->zstream.avail_out = 0; /* set in the loop */\n\n      do\n      {\n         if (png_ptr->zstream.avail_in == 0)\n         {\n            if (read_size > *chunk_bytes)\n               read_size = (uInt)*chunk_bytes;\n            *chunk_bytes -= read_size;\n\n            if (read_size > 0)\n               png_crc_read(png_ptr, read_buffer, read_size);\n\n            png_ptr->zstream.next_in = read_buffer;\n            png_ptr->zstream.avail_in = read_size;\n         }\n\n         if (png_ptr->zstream.avail_out == 0)\n         {\n            uInt avail = ZLIB_IO_MAX;\n            if (avail > *out_size)\n               avail = (uInt)*out_size;\n            *out_size -= avail;\n\n            png_ptr->zstream.avail_out = avail;\n         }\n\n         /* Use Z_SYNC_FLUSH when there is no more chunk data to ensure that all\n          * the available output is produced; this allows reading of truncated\n          * streams.\n          */\n         ret = PNG_INFLATE(png_ptr,\n            *chunk_bytes > 0 ? Z_NO_FLUSH : (finish ? Z_FINISH : Z_SYNC_FLUSH));\n      }\n      while (ret == Z_OK && (*out_size > 0 || png_ptr->zstream.avail_out > 0));\n\n      *out_size += png_ptr->zstream.avail_out;\n      png_ptr->zstream.avail_out = 0; /* Should not be required, but is safe */\n\n      /* Ensure the error message pointer is always set: */\n      png_zstream_error(png_ptr, ret);\n      return ret;\n   }\n\n   else\n   {\n      png_ptr->zstream.msg = PNGZ_MSG_CAST(\"zstream unclaimed\");\n      return Z_STREAM_ERROR;\n   }\n}\n#endif\n\n/* Read and check the IDHR chunk */\n\nvoid /* PRIVATE */\npng_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_byte buf[13];\n   png_uint_32 width, height;\n   int bit_depth, color_type, compression_type, filter_type;\n   int interlace_type;\n\n   png_debug(1, \"in png_handle_IHDR\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) != 0)\n      png_chunk_error(png_ptr, \"out of place\");\n\n   /* Check the length */\n   if (length != 13)\n      png_chunk_error(png_ptr, \"invalid\");\n\n   png_ptr->mode |= PNG_HAVE_IHDR;\n\n   png_crc_read(png_ptr, buf, 13);\n   png_crc_finish(png_ptr, 0);\n\n   width = png_get_uint_31(png_ptr, buf);\n   height = png_get_uint_31(png_ptr, buf + 4);\n   bit_depth = buf[8];\n   color_type = buf[9];\n   compression_type = buf[10];\n   filter_type = buf[11];\n   interlace_type = buf[12];\n\n   /* Set internal variables */\n   png_ptr->width = width;\n   png_ptr->height = height;\n   png_ptr->bit_depth = (png_byte)bit_depth;\n   png_ptr->interlaced = (png_byte)interlace_type;\n   png_ptr->color_type = (png_byte)color_type;\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n   png_ptr->filter_type = (png_byte)filter_type;\n#endif\n   png_ptr->compression_type = (png_byte)compression_type;\n\n   /* Find number of channels */\n   switch (png_ptr->color_type)\n   {\n      default: /* invalid, png_set_IHDR calls png_error */\n      case PNG_COLOR_TYPE_GRAY:\n      case PNG_COLOR_TYPE_PALETTE:\n         png_ptr->channels = 1;\n         break;\n\n      case PNG_COLOR_TYPE_RGB:\n         png_ptr->channels = 3;\n         break;\n\n      case PNG_COLOR_TYPE_GRAY_ALPHA:\n         png_ptr->channels = 2;\n         break;\n\n      case PNG_COLOR_TYPE_RGB_ALPHA:\n         png_ptr->channels = 4;\n         break;\n   }\n\n   /* Set up other useful info */\n   png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * png_ptr->channels);\n   png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width);\n   png_debug1(3, \"bit_depth = %d\", png_ptr->bit_depth);\n   png_debug1(3, \"channels = %d\", png_ptr->channels);\n   png_debug1(3, \"rowbytes = %lu\", (unsigned long)png_ptr->rowbytes);\n   png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth,\n       color_type, interlace_type, compression_type, filter_type);\n}\n\n/* Read and check the palette */\nvoid /* PRIVATE */\npng_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_color palette[PNG_MAX_PALETTE_LENGTH];\n   int max_palette_length, num, i;\n#ifdef PNG_POINTER_INDEXING_SUPPORTED\n   png_colorp pal_ptr;\n#endif\n\n   png_debug(1, \"in png_handle_PLTE\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   /* Moved to before the 'after IDAT' check below because otherwise duplicate\n    * PLTE chunks are potentially ignored (the spec says there shall not be more\n    * than one PLTE, the error is not treated as benign, so this check trumps\n    * the requirement that PLTE appears before IDAT.)\n    */\n   else if ((png_ptr->mode & PNG_HAVE_PLTE) != 0)\n      png_chunk_error(png_ptr, \"duplicate\");\n\n   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n   {\n      /* This is benign because the non-benign error happened before, when an\n       * IDAT was encountered in a color-mapped image with no PLTE.\n       */\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   png_ptr->mode |= PNG_HAVE_PLTE;\n\n   if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"ignored in grayscale PNG\");\n      return;\n   }\n\n#ifndef PNG_READ_OPT_PLTE_SUPPORTED\n   if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)\n   {\n      png_crc_finish(png_ptr, length);\n      return;\n   }\n#endif\n\n   if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3)\n   {\n      png_crc_finish(png_ptr, length);\n\n      if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)\n         png_chunk_benign_error(png_ptr, \"invalid\");\n\n      else\n         png_chunk_error(png_ptr, \"invalid\");\n\n      return;\n   }\n\n   /* The cast is safe because 'length' is less than 3*PNG_MAX_PALETTE_LENGTH */\n   num = (int)length / 3;\n\n   /* If the palette has 256 or fewer entries but is too large for the bit\n    * depth, we don't issue an error, to preserve the behavior of previous\n    * libpng versions. We silently truncate the unused extra palette entries\n    * here.\n    */\n   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      max_palette_length = (1 << png_ptr->bit_depth);\n   else\n      max_palette_length = PNG_MAX_PALETTE_LENGTH;\n\n   if (num > max_palette_length)\n      num = max_palette_length;\n\n#ifdef PNG_POINTER_INDEXING_SUPPORTED\n   for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++)\n   {\n      png_byte buf[3];\n\n      png_crc_read(png_ptr, buf, 3);\n      pal_ptr->red = buf[0];\n      pal_ptr->green = buf[1];\n      pal_ptr->blue = buf[2];\n   }\n#else\n   for (i = 0; i < num; i++)\n   {\n      png_byte buf[3];\n\n      png_crc_read(png_ptr, buf, 3);\n      /* Don't depend upon png_color being any order */\n      palette[i].red = buf[0];\n      palette[i].green = buf[1];\n      palette[i].blue = buf[2];\n   }\n#endif\n\n   /* If we actually need the PLTE chunk (ie for a paletted image), we do\n    * whatever the normal CRC configuration tells us.  However, if we\n    * have an RGB image, the PLTE can be considered ancillary, so\n    * we will act as though it is.\n    */\n#ifndef PNG_READ_OPT_PLTE_SUPPORTED\n   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n#endif\n   {\n      png_crc_finish(png_ptr, (int) length - num * 3);\n   }\n\n#ifndef PNG_READ_OPT_PLTE_SUPPORTED\n   else if (png_crc_error(png_ptr) != 0)  /* Only if we have a CRC error */\n   {\n      /* If we don't want to use the data from an ancillary chunk,\n       * we have two options: an error abort, or a warning and we\n       * ignore the data in this chunk (which should be OK, since\n       * it's considered ancillary for a RGB or RGBA image).\n       *\n       * IMPLEMENTATION NOTE: this is only here because png_crc_finish uses the\n       * chunk type to determine whether to check the ancillary or the critical\n       * flags.\n       */\n      if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE) == 0)\n      {\n         if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) != 0)\n            return;\n\n         else\n            png_chunk_error(png_ptr, \"CRC error\");\n      }\n\n      /* Otherwise, we (optionally) emit a warning and use the chunk. */\n      else if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) == 0)\n         png_chunk_warning(png_ptr, \"CRC error\");\n   }\n#endif\n\n   /* TODO: png_set_PLTE has the side effect of setting png_ptr->palette to its\n    * own copy of the palette.  This has the side effect that when png_start_row\n    * is called (this happens after any call to png_read_update_info) the\n    * info_ptr palette gets changed.  This is extremely unexpected and\n    * confusing.\n    *\n    * Fix this by not sharing the palette in this way.\n    */\n   png_set_PLTE(png_ptr, info_ptr, palette, num);\n\n   /* The three chunks, bKGD, hIST and tRNS *must* appear after PLTE and before\n    * IDAT.  Prior to 1.6.0 this was not checked; instead the code merely\n    * checked the apparent validity of a tRNS chunk inserted before PLTE on a\n    * palette PNG.  1.6.0 attempts to rigorously follow the standard and\n    * therefore does a benign error if the erroneous condition is detected *and*\n    * cancels the tRNS if the benign error returns.  The alternative is to\n    * amend the standard since it would be rather hypocritical of the standards\n    * maintainers to ignore it.\n    */\n#ifdef PNG_READ_tRNS_SUPPORTED\n   if (png_ptr->num_trans > 0 ||\n       (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0))\n   {\n      /* Cancel this because otherwise it would be used if the transforms\n       * require it.  Don't cancel the 'valid' flag because this would prevent\n       * detection of duplicate chunks.\n       */\n      png_ptr->num_trans = 0;\n\n      if (info_ptr != NULL)\n         info_ptr->num_trans = 0;\n\n      png_chunk_benign_error(png_ptr, \"tRNS must be after\");\n   }\n#endif\n\n#ifdef PNG_READ_hIST_SUPPORTED\n   if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) != 0)\n      png_chunk_benign_error(png_ptr, \"hIST must be after\");\n#endif\n\n#ifdef PNG_READ_bKGD_SUPPORTED\n   if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) != 0)\n      png_chunk_benign_error(png_ptr, \"bKGD must be after\");\n#endif\n}\n\nvoid /* PRIVATE */\npng_handle_IEND(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_debug(1, \"in png_handle_IEND\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0 ||\n       (png_ptr->mode & PNG_HAVE_IDAT) == 0)\n      png_chunk_error(png_ptr, \"out of place\");\n\n   png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND);\n\n   png_crc_finish(png_ptr, length);\n\n   if (length != 0)\n      png_chunk_benign_error(png_ptr, \"invalid\");\n\n   PNG_UNUSED(info_ptr)\n}\n\n#ifdef PNG_READ_gAMA_SUPPORTED\nvoid /* PRIVATE */\npng_handle_gAMA(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_fixed_point igamma;\n   png_byte buf[4];\n\n   png_debug(1, \"in png_handle_gAMA\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   if (length != 4)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   png_crc_read(png_ptr, buf, 4);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   igamma = png_get_fixed_point(NULL, buf);\n\n   png_colorspace_set_gamma(png_ptr, &png_ptr->colorspace, igamma);\n   png_colorspace_sync(png_ptr, info_ptr);\n}\n#endif\n\n#ifdef PNG_READ_sBIT_SUPPORTED\nvoid /* PRIVATE */\npng_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   unsigned int truelen, i;\n   png_byte sample_depth;\n   png_byte buf[4];\n\n   png_debug(1, \"in png_handle_sBIT\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n   {\n      truelen = 3;\n      sample_depth = 8;\n   }\n\n   else\n   {\n      truelen = png_ptr->channels;\n      sample_depth = png_ptr->bit_depth;\n   }\n\n   if (length != truelen || length > 4)\n   {\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      png_crc_finish(png_ptr, length);\n      return;\n   }\n\n   buf[0] = buf[1] = buf[2] = buf[3] = sample_depth;\n   png_crc_read(png_ptr, buf, truelen);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   for (i=0; i<truelen; ++i)\n   {\n      if (buf[i] == 0 || buf[i] > sample_depth)\n      {\n         png_chunk_benign_error(png_ptr, \"invalid\");\n         return;\n      }\n   }\n\n   if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)\n   {\n      png_ptr->sig_bit.red = buf[0];\n      png_ptr->sig_bit.green = buf[1];\n      png_ptr->sig_bit.blue = buf[2];\n      png_ptr->sig_bit.alpha = buf[3];\n   }\n\n   else\n   {\n      png_ptr->sig_bit.gray = buf[0];\n      png_ptr->sig_bit.red = buf[0];\n      png_ptr->sig_bit.green = buf[0];\n      png_ptr->sig_bit.blue = buf[0];\n      png_ptr->sig_bit.alpha = buf[1];\n   }\n\n   png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit));\n}\n#endif\n\n#ifdef PNG_READ_cHRM_SUPPORTED\nvoid /* PRIVATE */\npng_handle_cHRM(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_byte buf[32];\n   png_xy xy;\n\n   png_debug(1, \"in png_handle_cHRM\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   if (length != 32)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   png_crc_read(png_ptr, buf, 32);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   xy.whitex = png_get_fixed_point(NULL, buf);\n   xy.whitey = png_get_fixed_point(NULL, buf + 4);\n   xy.redx   = png_get_fixed_point(NULL, buf + 8);\n   xy.redy   = png_get_fixed_point(NULL, buf + 12);\n   xy.greenx = png_get_fixed_point(NULL, buf + 16);\n   xy.greeny = png_get_fixed_point(NULL, buf + 20);\n   xy.bluex  = png_get_fixed_point(NULL, buf + 24);\n   xy.bluey  = png_get_fixed_point(NULL, buf + 28);\n\n   if (xy.whitex == PNG_FIXED_ERROR ||\n       xy.whitey == PNG_FIXED_ERROR ||\n       xy.redx   == PNG_FIXED_ERROR ||\n       xy.redy   == PNG_FIXED_ERROR ||\n       xy.greenx == PNG_FIXED_ERROR ||\n       xy.greeny == PNG_FIXED_ERROR ||\n       xy.bluex  == PNG_FIXED_ERROR ||\n       xy.bluey  == PNG_FIXED_ERROR)\n   {\n      png_chunk_benign_error(png_ptr, \"invalid values\");\n      return;\n   }\n\n   /* If a colorspace error has already been output skip this chunk */\n   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)\n      return;\n\n   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0)\n   {\n      png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID;\n      png_colorspace_sync(png_ptr, info_ptr);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   png_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;\n   (void)png_colorspace_set_chromaticities(png_ptr, &png_ptr->colorspace, &xy,\n      1/*prefer cHRM values*/);\n   png_colorspace_sync(png_ptr, info_ptr);\n}\n#endif\n\n#ifdef PNG_READ_sRGB_SUPPORTED\nvoid /* PRIVATE */\npng_handle_sRGB(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_byte intent;\n\n   png_debug(1, \"in png_handle_sRGB\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   if (length != 1)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   png_crc_read(png_ptr, &intent, 1);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   /* If a colorspace error has already been output skip this chunk */\n   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)\n      return;\n\n   /* Only one sRGB or iCCP chunk is allowed, use the HAVE_INTENT flag to detect\n    * this.\n    */\n   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) != 0)\n   {\n      png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID;\n      png_colorspace_sync(png_ptr, info_ptr);\n      png_chunk_benign_error(png_ptr, \"too many profiles\");\n      return;\n   }\n\n   (void)png_colorspace_set_sRGB(png_ptr, &png_ptr->colorspace, intent);\n   png_colorspace_sync(png_ptr, info_ptr);\n}\n#endif /* READ_sRGB */\n\n#ifdef PNG_READ_iCCP_SUPPORTED\nvoid /* PRIVATE */\npng_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n/* Note: this does not properly handle profiles that are > 64K under DOS */\n{\n   png_const_charp errmsg = NULL; /* error message output, or no error */\n   int finished = 0; /* crc checked */\n\n   png_debug(1, \"in png_handle_iCCP\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   /* Consistent with all the above colorspace handling an obviously *invalid*\n    * chunk is just ignored, so does not invalidate the color space.  An\n    * alternative is to set the 'invalid' flags at the start of this routine\n    * and only clear them in they were not set before and all the tests pass.\n    * The minimum 'deflate' stream is assumed to be just the 2 byte header and\n    * 4 byte checksum.  The keyword must be at least one character and there is\n    * a terminator (0) byte and the compression method.\n    */\n   if (length < 9)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"too short\");\n      return;\n   }\n\n   /* If a colorspace error has already been output skip this chunk */\n   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      return;\n   }\n\n   /* Only one sRGB or iCCP chunk is allowed, use the HAVE_INTENT flag to detect\n    * this.\n    */\n   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) == 0)\n   {\n      uInt read_length, keyword_length;\n      char keyword[81];\n\n      /* Find the keyword; the keyword plus separator and compression method\n       * bytes can be at most 81 characters long.\n       */\n      read_length = 81; /* maximum */\n      if (read_length > length)\n         read_length = (uInt)length;\n\n      png_crc_read(png_ptr, (png_bytep)keyword, read_length);\n      length -= read_length;\n\n      keyword_length = 0;\n      while (keyword_length < 80 && keyword_length < read_length &&\n         keyword[keyword_length] != 0)\n         ++keyword_length;\n\n      /* TODO: make the keyword checking common */\n      if (keyword_length >= 1 && keyword_length <= 79)\n      {\n         /* We only understand '0' compression - deflate - so if we get a\n          * different value we can't safely decode the chunk.\n          */\n         if (keyword_length+1 < read_length &&\n            keyword[keyword_length+1] == PNG_COMPRESSION_TYPE_BASE)\n         {\n            read_length -= keyword_length+2;\n\n            if (png_inflate_claim(png_ptr, png_iCCP) == Z_OK)\n            {\n               Byte profile_header[132];\n               Byte local_buffer[PNG_INFLATE_BUF_SIZE];\n               png_alloc_size_t size = (sizeof profile_header);\n\n               png_ptr->zstream.next_in = (Bytef*)keyword + (keyword_length+2);\n               png_ptr->zstream.avail_in = read_length;\n               (void)png_inflate_read(png_ptr, local_buffer,\n                  (sizeof local_buffer), &length, profile_header, &size,\n                  0/*finish: don't, because the output is too small*/);\n\n               if (size == 0)\n               {\n                  /* We have the ICC profile header; do the basic header checks.\n                   */\n                  const png_uint_32 profile_length =\n                     png_get_uint_32(profile_header);\n\n                  if (png_icc_check_length(png_ptr, &png_ptr->colorspace,\n                     keyword, profile_length) != 0)\n                  {\n                     /* The length is apparently ok, so we can check the 132\n                      * byte header.\n                      */\n                     if (png_icc_check_header(png_ptr, &png_ptr->colorspace,\n                        keyword, profile_length, profile_header,\n                        png_ptr->color_type) != 0)\n                     {\n                        /* Now read the tag table; a variable size buffer is\n                         * needed at this point, allocate one for the whole\n                         * profile.  The header check has already validated\n                         * that none of these stuff will overflow.\n                         */\n                        const png_uint_32 tag_count = png_get_uint_32(\n                           profile_header+128);\n                        png_bytep profile = png_read_buffer(png_ptr,\n                           profile_length, 2/*silent*/);\n\n                        if (profile != NULL)\n                        {\n                           memcpy(profile, profile_header,\n                              (sizeof profile_header));\n\n                           size = 12 * tag_count;\n\n                           (void)png_inflate_read(png_ptr, local_buffer,\n                              (sizeof local_buffer), &length,\n                              profile + (sizeof profile_header), &size, 0);\n\n                           /* Still expect a buffer error because we expect\n                            * there to be some tag data!\n                            */\n                           if (size == 0)\n                           {\n                              if (png_icc_check_tag_table(png_ptr,\n                                 &png_ptr->colorspace, keyword, profile_length,\n                                 profile) != 0)\n                              {\n                                 /* The profile has been validated for basic\n                                  * security issues, so read the whole thing in.\n                                  */\n                                 size = profile_length - (sizeof profile_header)\n                                    - 12 * tag_count;\n\n                                 (void)png_inflate_read(png_ptr, local_buffer,\n                                    (sizeof local_buffer), &length,\n                                    profile + (sizeof profile_header) +\n                                    12 * tag_count, &size, 1/*finish*/);\n\n                                 if (length > 0 && !(png_ptr->flags &\n                                       PNG_FLAG_BENIGN_ERRORS_WARN))\n                                    errmsg = \"extra compressed data\";\n\n                                 /* But otherwise allow extra data: */\n                                 else if (size == 0)\n                                 {\n                                    if (length > 0)\n                                    {\n                                       /* This can be handled completely, so\n                                        * keep going.\n                                        */\n                                       png_chunk_warning(png_ptr,\n                                          \"extra compressed data\");\n                                    }\n\n                                    png_crc_finish(png_ptr, length);\n                                    finished = 1;\n\n#                                   ifdef PNG_sRGB_SUPPORTED\n                                    /* Check for a match against sRGB */\n                                    png_icc_set_sRGB(png_ptr,\n                                       &png_ptr->colorspace, profile,\n                                       png_ptr->zstream.adler);\n#                                   endif\n\n                                    /* Steal the profile for info_ptr. */\n                                    if (info_ptr != NULL)\n                                    {\n                                       png_free_data(png_ptr, info_ptr,\n                                          PNG_FREE_ICCP, 0);\n\n                                       info_ptr->iccp_name = png_voidcast(char*,\n                                          png_malloc_base(png_ptr,\n                                          keyword_length+1));\n                                       if (info_ptr->iccp_name != NULL)\n                                       {\n                                          memcpy(info_ptr->iccp_name, keyword,\n                                             keyword_length+1);\n                                          info_ptr->iccp_proflen =\n                                             profile_length;\n                                          info_ptr->iccp_profile = profile;\n                                          png_ptr->read_buffer = NULL; /*steal*/\n                                          info_ptr->free_me |= PNG_FREE_ICCP;\n                                          info_ptr->valid |= PNG_INFO_iCCP;\n                                       }\n\n                                       else\n                                       {\n                                          png_ptr->colorspace.flags |=\n                                             PNG_COLORSPACE_INVALID;\n                                          errmsg = \"out of memory\";\n                                       }\n                                    }\n\n                                    /* else the profile remains in the read\n                                     * buffer which gets reused for subsequent\n                                     * chunks.\n                                     */\n\n                                    if (info_ptr != NULL)\n                                       png_colorspace_sync(png_ptr, info_ptr);\n\n                                    if (errmsg == NULL)\n                                    {\n                                       png_ptr->zowner = 0;\n                                       return;\n                                    }\n                                 }\n\n                                 else if (size > 0)\n                                    errmsg = \"truncated\";\n\n#ifndef __COVERITY__\n                                 else\n                                    errmsg = png_ptr->zstream.msg;\n#endif\n                              }\n\n                              /* else png_icc_check_tag_table output an error */\n                           }\n\n                           else /* profile truncated */\n                              errmsg = png_ptr->zstream.msg;\n                        }\n\n                        else\n                           errmsg = \"out of memory\";\n                     }\n\n                     /* else png_icc_check_header output an error */\n                  }\n\n                  /* else png_icc_check_length output an error */\n               }\n\n               else /* profile truncated */\n                  errmsg = png_ptr->zstream.msg;\n\n               /* Release the stream */\n               png_ptr->zowner = 0;\n            }\n\n            else /* png_inflate_claim failed */\n               errmsg = png_ptr->zstream.msg;\n         }\n\n         else\n            errmsg = \"bad compression method\"; /* or missing */\n      }\n\n      else\n         errmsg = \"bad keyword\";\n   }\n\n   else\n      errmsg = \"too many profiles\";\n\n   /* Failure: the reason is in 'errmsg' */\n   if (finished == 0)\n      png_crc_finish(png_ptr, length);\n\n   png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID;\n   png_colorspace_sync(png_ptr, info_ptr);\n   if (errmsg != NULL) /* else already output */\n      png_chunk_benign_error(png_ptr, errmsg);\n}\n#endif /* READ_iCCP */\n\n#ifdef PNG_READ_sPLT_SUPPORTED\nvoid /* PRIVATE */\npng_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n/* Note: this does not properly handle chunks that are > 64K under DOS */\n{\n   png_bytep entry_start, buffer;\n   png_sPLT_t new_palette;\n   png_sPLT_entryp pp;\n   png_uint_32 data_length;\n   int entry_size, i;\n   png_uint_32 skip = 0;\n   png_uint_32 dl;\n   png_size_t max_dl;\n\n   png_debug(1, \"in png_handle_sPLT\");\n\n#ifdef PNG_USER_LIMITS_SUPPORTED\n   if (png_ptr->user_chunk_cache_max != 0)\n   {\n      if (png_ptr->user_chunk_cache_max == 1)\n      {\n         png_crc_finish(png_ptr, length);\n         return;\n      }\n\n      if (--png_ptr->user_chunk_cache_max == 1)\n      {\n         png_warning(png_ptr, \"No space in chunk cache for sPLT\");\n         png_crc_finish(png_ptr, length);\n         return;\n      }\n   }\n#endif\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n#ifdef PNG_MAX_MALLOC_64K\n   if (length > 65535U)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"too large to fit in memory\");\n      return;\n   }\n#endif\n\n   buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);\n   if (buffer == NULL)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of memory\");\n      return;\n   }\n\n\n   /* WARNING: this may break if size_t is less than 32 bits; it is assumed\n    * that the PNG_MAX_MALLOC_64K test is enabled in this case, but this is a\n    * potential breakage point if the types in pngconf.h aren't exactly right.\n    */\n   png_crc_read(png_ptr, buffer, length);\n\n   if (png_crc_finish(png_ptr, skip) != 0)\n      return;\n\n   buffer[length] = 0;\n\n   for (entry_start = buffer; *entry_start; entry_start++)\n      /* Empty loop to find end of name */ ;\n\n   ++entry_start;\n\n   /* A sample depth should follow the separator, and we should be on it  */\n   if (length < 2U || entry_start > buffer + (length - 2U))\n   {\n      png_warning(png_ptr, \"malformed sPLT chunk\");\n      return;\n   }\n\n   new_palette.depth = *entry_start++;\n   entry_size = (new_palette.depth == 8 ? 6 : 10);\n   /* This must fit in a png_uint_32 because it is derived from the original\n    * chunk data length.\n    */\n   data_length = length - (png_uint_32)(entry_start - buffer);\n\n   /* Integrity-check the data length */\n   if ((data_length % entry_size) != 0)\n   {\n      png_warning(png_ptr, \"sPLT chunk has bad length\");\n      return;\n   }\n\n   dl = (png_int_32)(data_length / entry_size);\n   max_dl = PNG_SIZE_MAX / (sizeof (png_sPLT_entry));\n\n   if (dl > max_dl)\n   {\n      png_warning(png_ptr, \"sPLT chunk too long\");\n      return;\n   }\n\n   new_palette.nentries = (png_int_32)(data_length / entry_size);\n\n   new_palette.entries = (png_sPLT_entryp)png_malloc_warn(\n       png_ptr, new_palette.nentries * (sizeof (png_sPLT_entry)));\n\n   if (new_palette.entries == NULL)\n   {\n      png_warning(png_ptr, \"sPLT chunk requires too much memory\");\n      return;\n   }\n\n#ifdef PNG_POINTER_INDEXING_SUPPORTED\n   for (i = 0; i < new_palette.nentries; i++)\n   {\n      pp = new_palette.entries + i;\n\n      if (new_palette.depth == 8)\n      {\n         pp->red = *entry_start++;\n         pp->green = *entry_start++;\n         pp->blue = *entry_start++;\n         pp->alpha = *entry_start++;\n      }\n\n      else\n      {\n         pp->red   = png_get_uint_16(entry_start); entry_start += 2;\n         pp->green = png_get_uint_16(entry_start); entry_start += 2;\n         pp->blue  = png_get_uint_16(entry_start); entry_start += 2;\n         pp->alpha = png_get_uint_16(entry_start); entry_start += 2;\n      }\n\n      pp->frequency = png_get_uint_16(entry_start); entry_start += 2;\n   }\n#else\n   pp = new_palette.entries;\n\n   for (i = 0; i < new_palette.nentries; i++)\n   {\n\n      if (new_palette.depth == 8)\n      {\n         pp[i].red   = *entry_start++;\n         pp[i].green = *entry_start++;\n         pp[i].blue  = *entry_start++;\n         pp[i].alpha = *entry_start++;\n      }\n\n      else\n      {\n         pp[i].red   = png_get_uint_16(entry_start); entry_start += 2;\n         pp[i].green = png_get_uint_16(entry_start); entry_start += 2;\n         pp[i].blue  = png_get_uint_16(entry_start); entry_start += 2;\n         pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2;\n      }\n\n      pp[i].frequency = png_get_uint_16(entry_start); entry_start += 2;\n   }\n#endif\n\n   /* Discard all chunk data except the name and stash that */\n   new_palette.name = (png_charp)buffer;\n\n   png_set_sPLT(png_ptr, info_ptr, &new_palette, 1);\n\n   png_free(png_ptr, new_palette.entries);\n}\n#endif /* READ_sPLT */\n\n#ifdef PNG_READ_tRNS_SUPPORTED\nvoid /* PRIVATE */\npng_handle_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_byte readbuf[PNG_MAX_PALETTE_LENGTH];\n\n   png_debug(1, \"in png_handle_tRNS\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)\n   {\n      png_byte buf[2];\n\n      if (length != 2)\n      {\n         png_crc_finish(png_ptr, length);\n         png_chunk_benign_error(png_ptr, \"invalid\");\n         return;\n      }\n\n      png_crc_read(png_ptr, buf, 2);\n      png_ptr->num_trans = 1;\n      png_ptr->trans_color.gray = png_get_uint_16(buf);\n   }\n\n   else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)\n   {\n      png_byte buf[6];\n\n      if (length != 6)\n      {\n         png_crc_finish(png_ptr, length);\n         png_chunk_benign_error(png_ptr, \"invalid\");\n         return;\n      }\n\n      png_crc_read(png_ptr, buf, length);\n      png_ptr->num_trans = 1;\n      png_ptr->trans_color.red = png_get_uint_16(buf);\n      png_ptr->trans_color.green = png_get_uint_16(buf + 2);\n      png_ptr->trans_color.blue = png_get_uint_16(buf + 4);\n   }\n\n   else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n   {\n      if ((png_ptr->mode & PNG_HAVE_PLTE) == 0)\n      {\n         /* TODO: is this actually an error in the ISO spec? */\n         png_crc_finish(png_ptr, length);\n         png_chunk_benign_error(png_ptr, \"out of place\");\n         return;\n      }\n\n      if (length > (unsigned int) png_ptr->num_palette ||\n         length > (unsigned int) PNG_MAX_PALETTE_LENGTH ||\n         length == 0)\n      {\n         png_crc_finish(png_ptr, length);\n         png_chunk_benign_error(png_ptr, \"invalid\");\n         return;\n      }\n\n      png_crc_read(png_ptr, readbuf, length);\n      png_ptr->num_trans = (png_uint_16)length;\n   }\n\n   else\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid with alpha channel\");\n      return;\n   }\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n   {\n      png_ptr->num_trans = 0;\n      return;\n   }\n\n   /* TODO: this is a horrible side effect in the palette case because the\n    * png_struct ends up with a pointer to the tRNS buffer owned by the\n    * png_info.  Fix this.\n    */\n   png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans,\n       &(png_ptr->trans_color));\n}\n#endif\n\n#ifdef PNG_READ_bKGD_SUPPORTED\nvoid /* PRIVATE */\npng_handle_bKGD(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   unsigned int truelen;\n   png_byte buf[6];\n   png_color_16 background;\n\n   png_debug(1, \"in png_handle_bKGD\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0 ||\n       (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&\n       (png_ptr->mode & PNG_HAVE_PLTE) == 0))\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      truelen = 1;\n\n   else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)\n      truelen = 6;\n\n   else\n      truelen = 2;\n\n   if (length != truelen)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   png_crc_read(png_ptr, buf, truelen);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   /* We convert the index value into RGB components so that we can allow\n    * arbitrary RGB values for background when we have transparency, and\n    * so it is easy to determine the RGB values of the background color\n    * from the info_ptr struct.\n    */\n   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n   {\n      background.index = buf[0];\n\n      if (info_ptr != NULL && info_ptr->num_palette != 0)\n      {\n         if (buf[0] >= info_ptr->num_palette)\n         {\n            png_chunk_benign_error(png_ptr, \"invalid index\");\n            return;\n         }\n\n         background.red = (png_uint_16)png_ptr->palette[buf[0]].red;\n         background.green = (png_uint_16)png_ptr->palette[buf[0]].green;\n         background.blue = (png_uint_16)png_ptr->palette[buf[0]].blue;\n      }\n\n      else\n         background.red = background.green = background.blue = 0;\n\n      background.gray = 0;\n   }\n\n   else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0) /* GRAY */\n   {\n      background.index = 0;\n      background.red =\n      background.green =\n      background.blue =\n      background.gray = png_get_uint_16(buf);\n   }\n\n   else\n   {\n      background.index = 0;\n      background.red = png_get_uint_16(buf);\n      background.green = png_get_uint_16(buf + 2);\n      background.blue = png_get_uint_16(buf + 4);\n      background.gray = 0;\n   }\n\n   png_set_bKGD(png_ptr, info_ptr, &background);\n}\n#endif\n\n#ifdef PNG_READ_hIST_SUPPORTED\nvoid /* PRIVATE */\npng_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   unsigned int num, i;\n   png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH];\n\n   png_debug(1, \"in png_handle_hIST\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0 ||\n       (png_ptr->mode & PNG_HAVE_PLTE) == 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   num = length / 2 ;\n\n   if (num != (unsigned int) png_ptr->num_palette ||\n       num > (unsigned int) PNG_MAX_PALETTE_LENGTH)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   for (i = 0; i < num; i++)\n   {\n      png_byte buf[2];\n\n      png_crc_read(png_ptr, buf, 2);\n      readbuf[i] = png_get_uint_16(buf);\n   }\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   png_set_hIST(png_ptr, info_ptr, readbuf);\n}\n#endif\n\n#ifdef PNG_READ_pHYs_SUPPORTED\nvoid /* PRIVATE */\npng_handle_pHYs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_byte buf[9];\n   png_uint_32 res_x, res_y;\n   int unit_type;\n\n   png_debug(1, \"in png_handle_pHYs\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   if (length != 9)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   png_crc_read(png_ptr, buf, 9);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   res_x = png_get_uint_32(buf);\n   res_y = png_get_uint_32(buf + 4);\n   unit_type = buf[8];\n   png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type);\n}\n#endif\n\n#ifdef PNG_READ_oFFs_SUPPORTED\nvoid /* PRIVATE */\npng_handle_oFFs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_byte buf[9];\n   png_int_32 offset_x, offset_y;\n   int unit_type;\n\n   png_debug(1, \"in png_handle_oFFs\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   if (length != 9)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   png_crc_read(png_ptr, buf, 9);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   offset_x = png_get_int_32(buf);\n   offset_y = png_get_int_32(buf + 4);\n   unit_type = buf[8];\n   png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type);\n}\n#endif\n\n#ifdef PNG_READ_pCAL_SUPPORTED\n/* Read the pCAL chunk (described in the PNG Extensions document) */\nvoid /* PRIVATE */\npng_handle_pCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_int_32 X0, X1;\n   png_byte type, nparams;\n   png_bytep buffer, buf, units, endptr;\n   png_charpp params;\n   int i;\n\n   png_debug(1, \"in png_handle_pCAL\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   png_debug1(2, \"Allocating and reading pCAL chunk data (%u bytes)\",\n       length + 1);\n\n   buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);\n\n   if (buffer == NULL)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of memory\");\n      return;\n   }\n\n   png_crc_read(png_ptr, buffer, length);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   buffer[length] = 0; /* Null terminate the last string */\n\n   png_debug(3, \"Finding end of pCAL purpose string\");\n   for (buf = buffer; *buf; buf++)\n      /* Empty loop */ ;\n\n   endptr = buffer + length;\n\n   /* We need to have at least 12 bytes after the purpose string\n    * in order to get the parameter information.\n    */\n   if (endptr - buf <= 12)\n   {\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   png_debug(3, \"Reading pCAL X0, X1, type, nparams, and units\");\n   X0 = png_get_int_32((png_bytep)buf+1);\n   X1 = png_get_int_32((png_bytep)buf+5);\n   type = buf[9];\n   nparams = buf[10];\n   units = buf + 11;\n\n   png_debug(3, \"Checking pCAL equation type and number of parameters\");\n   /* Check that we have the right number of parameters for known\n    * equation types.\n    */\n   if ((type == PNG_EQUATION_LINEAR && nparams != 2) ||\n       (type == PNG_EQUATION_BASE_E && nparams != 3) ||\n       (type == PNG_EQUATION_ARBITRARY && nparams != 3) ||\n       (type == PNG_EQUATION_HYPERBOLIC && nparams != 4))\n   {\n      png_chunk_benign_error(png_ptr, \"invalid parameter count\");\n      return;\n   }\n\n   else if (type >= PNG_EQUATION_LAST)\n   {\n      png_chunk_benign_error(png_ptr, \"unrecognized equation type\");\n   }\n\n   for (buf = units; *buf; buf++)\n      /* Empty loop to move past the units string. */ ;\n\n   png_debug(3, \"Allocating pCAL parameters array\");\n\n   params = png_voidcast(png_charpp, png_malloc_warn(png_ptr,\n       nparams * (sizeof (png_charp))));\n\n   if (params == NULL)\n   {\n      png_chunk_benign_error(png_ptr, \"out of memory\");\n      return;\n   }\n\n   /* Get pointers to the start of each parameter string. */\n   for (i = 0; i < nparams; i++)\n   {\n      buf++; /* Skip the null string terminator from previous parameter. */\n\n      png_debug1(3, \"Reading pCAL parameter %d\", i);\n\n      for (params[i] = (png_charp)buf; buf <= endptr && *buf != 0; buf++)\n         /* Empty loop to move past each parameter string */ ;\n\n      /* Make sure we haven't run out of data yet */\n      if (buf > endptr)\n      {\n         png_free(png_ptr, params);\n         png_chunk_benign_error(png_ptr, \"invalid data\");\n         return;\n      }\n   }\n\n   png_set_pCAL(png_ptr, info_ptr, (png_charp)buffer, X0, X1, type, nparams,\n      (png_charp)units, params);\n\n   png_free(png_ptr, params);\n}\n#endif\n\n#ifdef PNG_READ_sCAL_SUPPORTED\n/* Read the sCAL chunk */\nvoid /* PRIVATE */\npng_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_bytep buffer;\n   png_size_t i;\n   int state;\n\n   png_debug(1, \"in png_handle_sCAL\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of place\");\n      return;\n   }\n\n   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   /* Need unit type, width, \\0, height: minimum 4 bytes */\n   else if (length < 4)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   png_debug1(2, \"Allocating and reading sCAL chunk data (%u bytes)\",\n      length + 1);\n\n   buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);\n\n   if (buffer == NULL)\n   {\n      png_chunk_benign_error(png_ptr, \"out of memory\");\n      png_crc_finish(png_ptr, length);\n      return;\n   }\n\n   png_crc_read(png_ptr, buffer, length);\n   buffer[length] = 0; /* Null terminate the last string */\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   /* Validate the unit. */\n   if (buffer[0] != 1 && buffer[0] != 2)\n   {\n      png_chunk_benign_error(png_ptr, \"invalid unit\");\n      return;\n   }\n\n   /* Validate the ASCII numbers, need two ASCII numbers separated by\n    * a '\\0' and they need to fit exactly in the chunk data.\n    */\n   i = 1;\n   state = 0;\n\n   if (png_check_fp_number((png_const_charp)buffer, length, &state, &i) == 0 ||\n       i >= length || buffer[i++] != 0)\n      png_chunk_benign_error(png_ptr, \"bad width format\");\n\n   else if (PNG_FP_IS_POSITIVE(state) == 0)\n      png_chunk_benign_error(png_ptr, \"non-positive width\");\n\n   else\n   {\n      png_size_t heighti = i;\n\n      state = 0;\n      if (png_check_fp_number((png_const_charp)buffer, length,\n          &state, &i) == 0 || i != length)\n         png_chunk_benign_error(png_ptr, \"bad height format\");\n\n      else if (PNG_FP_IS_POSITIVE(state) == 0)\n         png_chunk_benign_error(png_ptr, \"non-positive height\");\n\n      else\n         /* This is the (only) success case. */\n         png_set_sCAL_s(png_ptr, info_ptr, buffer[0],\n            (png_charp)buffer+1, (png_charp)buffer+heighti);\n   }\n}\n#endif\n\n#ifdef PNG_READ_tIME_SUPPORTED\nvoid /* PRIVATE */\npng_handle_tIME(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_byte buf[7];\n   png_time mod_time;\n\n   png_debug(1, \"in png_handle_tIME\");\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) != 0)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"duplicate\");\n      return;\n   }\n\n   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n      png_ptr->mode |= PNG_AFTER_IDAT;\n\n   if (length != 7)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"invalid\");\n      return;\n   }\n\n   png_crc_read(png_ptr, buf, 7);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   mod_time.second = buf[6];\n   mod_time.minute = buf[5];\n   mod_time.hour = buf[4];\n   mod_time.day = buf[3];\n   mod_time.month = buf[2];\n   mod_time.year = png_get_uint_16(buf);\n\n   png_set_tIME(png_ptr, info_ptr, &mod_time);\n}\n#endif\n\n#ifdef PNG_READ_tEXt_SUPPORTED\n/* Note: this does not properly handle chunks that are > 64K under DOS */\nvoid /* PRIVATE */\npng_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_text  text_info;\n   png_bytep buffer;\n   png_charp key;\n   png_charp text;\n   png_uint_32 skip = 0;\n\n   png_debug(1, \"in png_handle_tEXt\");\n\n#ifdef PNG_USER_LIMITS_SUPPORTED\n   if (png_ptr->user_chunk_cache_max != 0)\n   {\n      if (png_ptr->user_chunk_cache_max == 1)\n      {\n         png_crc_finish(png_ptr, length);\n         return;\n      }\n\n      if (--png_ptr->user_chunk_cache_max == 1)\n      {\n         png_crc_finish(png_ptr, length);\n         png_chunk_benign_error(png_ptr, \"no space in chunk cache\");\n         return;\n      }\n   }\n#endif\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n      png_ptr->mode |= PNG_AFTER_IDAT;\n\n#ifdef PNG_MAX_MALLOC_64K\n   if (length > 65535U)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"too large to fit in memory\");\n      return;\n   }\n#endif\n\n   buffer = png_read_buffer(png_ptr, length+1, 1/*warn*/);\n\n   if (buffer == NULL)\n   {\n     png_chunk_benign_error(png_ptr, \"out of memory\");\n     return;\n   }\n\n   png_crc_read(png_ptr, buffer, length);\n\n   if (png_crc_finish(png_ptr, skip) != 0)\n      return;\n\n   key = (png_charp)buffer;\n   key[length] = 0;\n\n   for (text = key; *text; text++)\n      /* Empty loop to find end of key */ ;\n\n   if (text != key + length)\n      text++;\n\n   text_info.compression = PNG_TEXT_COMPRESSION_NONE;\n   text_info.key = key;\n   text_info.lang = NULL;\n   text_info.lang_key = NULL;\n   text_info.itxt_length = 0;\n   text_info.text = text;\n   text_info.text_length = strlen(text);\n\n   if (png_set_text_2(png_ptr, info_ptr, &text_info, 1) != 0)\n      png_warning(png_ptr, \"Insufficient memory to process text chunk\");\n}\n#endif\n\n#ifdef PNG_READ_zTXt_SUPPORTED\n/* Note: this does not correctly handle chunks that are > 64K under DOS */\nvoid /* PRIVATE */\npng_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_const_charp errmsg = NULL;\n   png_bytep       buffer;\n   png_uint_32     keyword_length;\n\n   png_debug(1, \"in png_handle_zTXt\");\n\n#ifdef PNG_USER_LIMITS_SUPPORTED\n   if (png_ptr->user_chunk_cache_max != 0)\n   {\n      if (png_ptr->user_chunk_cache_max == 1)\n      {\n         png_crc_finish(png_ptr, length);\n         return;\n      }\n\n      if (--png_ptr->user_chunk_cache_max == 1)\n      {\n         png_crc_finish(png_ptr, length);\n         png_chunk_benign_error(png_ptr, \"no space in chunk cache\");\n         return;\n      }\n   }\n#endif\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n      png_ptr->mode |= PNG_AFTER_IDAT;\n\n   buffer = png_read_buffer(png_ptr, length, 2/*silent*/);\n\n   if (buffer == NULL)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of memory\");\n      return;\n   }\n\n   png_crc_read(png_ptr, buffer, length);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   /* TODO: also check that the keyword contents match the spec! */\n   for (keyword_length = 0;\n      keyword_length < length && buffer[keyword_length] != 0;\n      ++keyword_length)\n      /* Empty loop to find end of name */ ;\n\n   if (keyword_length > 79 || keyword_length < 1)\n      errmsg = \"bad keyword\";\n\n   /* zTXt must have some LZ data after the keyword, although it may expand to\n    * zero bytes; we need a '\\0' at the end of the keyword, the compression type\n    * then the LZ data:\n    */\n   else if (keyword_length + 3 > length)\n      errmsg = \"truncated\";\n\n   else if (buffer[keyword_length+1] != PNG_COMPRESSION_TYPE_BASE)\n      errmsg = \"unknown compression type\";\n\n   else\n   {\n      png_alloc_size_t uncompressed_length = PNG_SIZE_MAX;\n\n      /* TODO: at present png_decompress_chunk imposes a single application\n       * level memory limit, this should be split to different values for iCCP\n       * and text chunks.\n       */\n      if (png_decompress_chunk(png_ptr, length, keyword_length+2,\n         &uncompressed_length, 1/*terminate*/) == Z_STREAM_END)\n      {\n         png_text text;\n\n         /* It worked; png_ptr->read_buffer now looks like a tEXt chunk except\n          * for the extra compression type byte and the fact that it isn't\n          * necessarily '\\0' terminated.\n          */\n         buffer = png_ptr->read_buffer;\n         buffer[uncompressed_length+(keyword_length+2)] = 0;\n\n         text.compression = PNG_TEXT_COMPRESSION_zTXt;\n         text.key = (png_charp)buffer;\n         text.text = (png_charp)(buffer + keyword_length+2);\n         text.text_length = uncompressed_length;\n         text.itxt_length = 0;\n         text.lang = NULL;\n         text.lang_key = NULL;\n\n         if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0)\n            errmsg = \"insufficient memory\";\n      }\n\n      else\n         errmsg = png_ptr->zstream.msg;\n   }\n\n   if (errmsg != NULL)\n      png_chunk_benign_error(png_ptr, errmsg);\n}\n#endif\n\n#ifdef PNG_READ_iTXt_SUPPORTED\n/* Note: this does not correctly handle chunks that are > 64K under DOS */\nvoid /* PRIVATE */\npng_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\n{\n   png_const_charp errmsg = NULL;\n   png_bytep buffer;\n   png_uint_32 prefix_length;\n\n   png_debug(1, \"in png_handle_iTXt\");\n\n#ifdef PNG_USER_LIMITS_SUPPORTED\n   if (png_ptr->user_chunk_cache_max != 0)\n   {\n      if (png_ptr->user_chunk_cache_max == 1)\n      {\n         png_crc_finish(png_ptr, length);\n         return;\n      }\n\n      if (--png_ptr->user_chunk_cache_max == 1)\n      {\n         png_crc_finish(png_ptr, length);\n         png_chunk_benign_error(png_ptr, \"no space in chunk cache\");\n         return;\n      }\n   }\n#endif\n\n   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\n      png_chunk_error(png_ptr, \"missing IHDR\");\n\n   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)\n      png_ptr->mode |= PNG_AFTER_IDAT;\n\n   buffer = png_read_buffer(png_ptr, length+1, 1/*warn*/);\n\n   if (buffer == NULL)\n   {\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"out of memory\");\n      return;\n   }\n\n   png_crc_read(png_ptr, buffer, length);\n\n   if (png_crc_finish(png_ptr, 0) != 0)\n      return;\n\n   /* First the keyword. */\n   for (prefix_length=0;\n      prefix_length < length && buffer[prefix_length] != 0;\n      ++prefix_length)\n      /* Empty loop */ ;\n\n   /* Perform a basic check on the keyword length here. */\n   if (prefix_length > 79 || prefix_length < 1)\n      errmsg = \"bad keyword\";\n\n   /* Expect keyword, compression flag, compression type, language, translated\n    * keyword (both may be empty but are 0 terminated) then the text, which may\n    * be empty.\n    */\n   else if (prefix_length + 5 > length)\n      errmsg = \"truncated\";\n\n   else if (buffer[prefix_length+1] == 0 ||\n      (buffer[prefix_length+1] == 1 &&\n      buffer[prefix_length+2] == PNG_COMPRESSION_TYPE_BASE))\n   {\n      int compressed = buffer[prefix_length+1] != 0;\n      png_uint_32 language_offset, translated_keyword_offset;\n      png_alloc_size_t uncompressed_length = 0;\n\n      /* Now the language tag */\n      prefix_length += 3;\n      language_offset = prefix_length;\n\n      for (; prefix_length < length && buffer[prefix_length] != 0;\n         ++prefix_length)\n         /* Empty loop */ ;\n\n      /* WARNING: the length may be invalid here, this is checked below. */\n      translated_keyword_offset = ++prefix_length;\n\n      for (; prefix_length < length && buffer[prefix_length] != 0;\n         ++prefix_length)\n         /* Empty loop */ ;\n\n      /* prefix_length should now be at the trailing '\\0' of the translated\n       * keyword, but it may already be over the end.  None of this arithmetic\n       * can overflow because chunks are at most 2^31 bytes long, but on 16-bit\n       * systems the available allocation may overflow.\n       */\n      ++prefix_length;\n\n      if (compressed == 0 && prefix_length <= length)\n         uncompressed_length = length - prefix_length;\n\n      else if (compressed != 0 && prefix_length < length)\n      {\n         uncompressed_length = PNG_SIZE_MAX;\n\n         /* TODO: at present png_decompress_chunk imposes a single application\n          * level memory limit, this should be split to different values for\n          * iCCP and text chunks.\n          */\n         if (png_decompress_chunk(png_ptr, length, prefix_length,\n            &uncompressed_length, 1/*terminate*/) == Z_STREAM_END)\n            buffer = png_ptr->read_buffer;\n\n         else\n            errmsg = png_ptr->zstream.msg;\n      }\n\n      else\n         errmsg = \"truncated\";\n\n      if (errmsg == NULL)\n      {\n         png_text text;\n\n         buffer[uncompressed_length+prefix_length] = 0;\n\n         if (compressed == 0)\n            text.compression = PNG_ITXT_COMPRESSION_NONE;\n\n         else\n            text.compression = PNG_ITXT_COMPRESSION_zTXt;\n\n         text.key = (png_charp)buffer;\n         text.lang = (png_charp)buffer + language_offset;\n         text.lang_key = (png_charp)buffer + translated_keyword_offset;\n         text.text = (png_charp)buffer + prefix_length;\n         text.text_length = 0;\n         text.itxt_length = uncompressed_length;\n\n         if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0)\n            errmsg = \"insufficient memory\";\n      }\n   }\n\n   else\n      errmsg = \"bad compression info\";\n\n   if (errmsg != NULL)\n      png_chunk_benign_error(png_ptr, errmsg);\n}\n#endif\n\n#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED\n/* Utility function for png_handle_unknown; set up png_ptr::unknown_chunk */\nstatic int\npng_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length)\n{\n   png_alloc_size_t limit = PNG_SIZE_MAX;\n\n   if (png_ptr->unknown_chunk.data != NULL)\n   {\n      png_free(png_ptr, png_ptr->unknown_chunk.data);\n      png_ptr->unknown_chunk.data = NULL;\n   }\n\n#  ifdef PNG_SET_USER_LIMITS_SUPPORTED\n   if (png_ptr->user_chunk_malloc_max > 0 &&\n       png_ptr->user_chunk_malloc_max < limit)\n      limit = png_ptr->user_chunk_malloc_max;\n\n#  elif PNG_USER_CHUNK_MALLOC_MAX > 0\n   if (PNG_USER_CHUNK_MALLOC_MAX < limit)\n      limit = PNG_USER_CHUNK_MALLOC_MAX;\n#  endif\n\n   if (length <= limit)\n   {\n      PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name);\n      /* The following is safe because of the PNG_SIZE_MAX init above */\n      png_ptr->unknown_chunk.size = (png_size_t)length/*SAFE*/;\n      /* 'mode' is a flag array, only the bottom four bits matter here */\n      png_ptr->unknown_chunk.location = (png_byte)png_ptr->mode/*SAFE*/;\n\n      if (length == 0)\n         png_ptr->unknown_chunk.data = NULL;\n\n      else\n      {\n         /* Do a 'warn' here - it is handled below. */\n         png_ptr->unknown_chunk.data = png_voidcast(png_bytep,\n            png_malloc_warn(png_ptr, length));\n      }\n   }\n\n   if (png_ptr->unknown_chunk.data == NULL && length > 0)\n   {\n      /* This is benign because we clean up correctly */\n      png_crc_finish(png_ptr, length);\n      png_chunk_benign_error(png_ptr, \"unknown chunk exceeds memory limits\");\n      return 0;\n   }\n\n   else\n   {\n      if (length > 0)\n         png_crc_read(png_ptr, png_ptr->unknown_chunk.data, length);\n      png_crc_finish(png_ptr, 0);\n      return 1;\n   }\n}\n#endif /* READ_UNKNOWN_CHUNKS */\n\n/* Handle an unknown, or known but disabled, chunk */\nvoid /* PRIVATE */\npng_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,\n   png_uint_32 length, int keep)\n{\n   int handled = 0; /* the chunk was handled */\n\n   png_debug(1, \"in png_handle_unknown\");\n\n#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED\n   /* NOTE: this code is based on the code in libpng-1.4.12 except for fixing\n    * the bug which meant that setting a non-default behavior for a specific\n    * chunk would be ignored (the default was always used unless a user\n    * callback was installed).\n    *\n    * 'keep' is the value from the png_chunk_unknown_handling, the setting for\n    * this specific chunk_name, if PNG_HANDLE_AS_UNKNOWN_SUPPORTED, if not it\n    * will always be PNG_HANDLE_CHUNK_AS_DEFAULT and it needs to be set here.\n    * This is just an optimization to avoid multiple calls to the lookup\n    * function.\n    */\n#  ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n#     ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n   keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name);\n#     endif\n#  endif\n\n   /* One of the following methods will read the chunk or skip it (at least one\n    * of these is always defined because this is the only way to switch on\n    * PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)\n    */\n#  ifdef PNG_READ_USER_CHUNKS_SUPPORTED\n   /* The user callback takes precedence over the chunk keep value, but the\n    * keep value is still required to validate a save of a critical chunk.\n    */\n   if (png_ptr->read_user_chunk_fn != NULL)\n   {\n      if (png_cache_unknown_chunk(png_ptr, length) != 0)\n      {\n         /* Callback to user unknown chunk handler */\n         int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr,\n            &png_ptr->unknown_chunk);\n\n         /* ret is:\n          * negative: An error occurred; png_chunk_error will be called.\n          *     zero: The chunk was not handled, the chunk will be discarded\n          *           unless png_set_keep_unknown_chunks has been used to set\n          *           a 'keep' behavior for this particular chunk, in which\n          *           case that will be used.  A critical chunk will cause an\n          *           error at this point unless it is to be saved.\n          * positive: The chunk was handled, libpng will ignore/discard it.\n          */\n         if (ret < 0)\n            png_chunk_error(png_ptr, \"error in user chunk\");\n\n         else if (ret == 0)\n         {\n            /* If the keep value is 'default' or 'never' override it, but\n             * still error out on critical chunks unless the keep value is\n             * 'always'  While this is weird it is the behavior in 1.4.12.\n             * A possible improvement would be to obey the value set for the\n             * chunk, but this would be an API change that would probably\n             * damage some applications.\n             *\n             * The png_app_warning below catches the case that matters, where\n             * the application has not set specific save or ignore for this\n             * chunk or global save or ignore.\n             */\n            if (keep < PNG_HANDLE_CHUNK_IF_SAFE)\n            {\n#              ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n               if (png_ptr->unknown_default < PNG_HANDLE_CHUNK_IF_SAFE)\n               {\n                  png_chunk_warning(png_ptr, \"Saving unknown chunk:\");\n                  png_app_warning(png_ptr,\n                     \"forcing save of an unhandled chunk;\"\n                     \" please call png_set_keep_unknown_chunks\");\n                     /* with keep = PNG_HANDLE_CHUNK_IF_SAFE */\n               }\n#              endif\n               keep = PNG_HANDLE_CHUNK_IF_SAFE;\n            }\n         }\n\n         else /* chunk was handled */\n         {\n            handled = 1;\n            /* Critical chunks can be safely discarded at this point. */\n            keep = PNG_HANDLE_CHUNK_NEVER;\n         }\n      }\n\n      else\n         keep = PNG_HANDLE_CHUNK_NEVER; /* insufficient memory */\n   }\n\n   else\n   /* Use the SAVE_UNKNOWN_CHUNKS code or skip the chunk */\n#  endif /* READ_USER_CHUNKS */\n\n#  ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED\n   {\n      /* keep is currently just the per-chunk setting, if there was no\n       * setting change it to the global default now (not that this may\n       * still be AS_DEFAULT) then obtain the cache of the chunk if required,\n       * if not simply skip the chunk.\n       */\n      if (keep == PNG_HANDLE_CHUNK_AS_DEFAULT)\n         keep = png_ptr->unknown_default;\n\n      if (keep == PNG_HANDLE_CHUNK_ALWAYS ||\n         (keep == PNG_HANDLE_CHUNK_IF_SAFE &&\n          PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))\n      {\n         if (png_cache_unknown_chunk(png_ptr, length) == 0)\n            keep = PNG_HANDLE_CHUNK_NEVER;\n      }\n\n      else\n         png_crc_finish(png_ptr, length);\n   }\n#  else\n#     ifndef PNG_READ_USER_CHUNKS_SUPPORTED\n#        error no method to support READ_UNKNOWN_CHUNKS\n#     endif\n\n   {\n      /* If here there is no read callback pointer set and no support is\n       * compiled in to just save the unknown chunks, so simply skip this\n       * chunk.  If 'keep' is something other than AS_DEFAULT or NEVER then\n       * the app has erroneously asked for unknown chunk saving when there\n       * is no support.\n       */\n      if (keep > PNG_HANDLE_CHUNK_NEVER)\n         png_app_error(png_ptr, \"no unknown chunk support available\");\n\n      png_crc_finish(png_ptr, length);\n   }\n#  endif\n\n#  ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\n   /* Now store the chunk in the chunk list if appropriate, and if the limits\n    * permit it.\n    */\n   if (keep == PNG_HANDLE_CHUNK_ALWAYS ||\n      (keep == PNG_HANDLE_CHUNK_IF_SAFE &&\n       PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))\n   {\n#     ifdef PNG_USER_LIMITS_SUPPORTED\n      switch (png_ptr->user_chunk_cache_max)\n      {\n         case 2:\n            png_ptr->user_chunk_cache_max = 1;\n            png_chunk_benign_error(png_ptr, \"no space in chunk cache\");\n            /* FALL THROUGH */\n         case 1:\n            /* NOTE: prior to 1.6.0 this case resulted in an unknown critical\n             * chunk being skipped, now there will be a hard error below.\n             */\n            break;\n\n         default: /* not at limit */\n            --(png_ptr->user_chunk_cache_max);\n            /* FALL THROUGH */\n         case 0: /* no limit */\n#  endif /* USER_LIMITS */\n            /* Here when the limit isn't reached or when limits are compiled\n             * out; store the chunk.\n             */\n            png_set_unknown_chunks(png_ptr, info_ptr,\n               &png_ptr->unknown_chunk, 1);\n            handled = 1;\n#  ifdef PNG_USER_LIMITS_SUPPORTED\n            break;\n      }\n#  endif\n   }\n#  else /* no store support: the chunk must be handled by the user callback */\n   PNG_UNUSED(info_ptr)\n#  endif\n\n   /* Regardless of the error handling below the cached data (if any) can be\n    * freed now.  Notice that the data is not freed if there is a png_error, but\n    * it will be freed by destroy_read_struct.\n    */\n   if (png_ptr->unknown_chunk.data != NULL)\n      png_free(png_ptr, png_ptr->unknown_chunk.data);\n   png_ptr->unknown_chunk.data = NULL;\n\n#else /* !PNG_READ_UNKNOWN_CHUNKS_SUPPORTED */\n   /* There is no support to read an unknown chunk, so just skip it. */\n   png_crc_finish(png_ptr, length);\n   PNG_UNUSED(info_ptr)\n   PNG_UNUSED(keep)\n#endif /* !READ_UNKNOWN_CHUNKS */\n\n   /* Check for unhandled critical chunks */\n   if (handled == 0 && PNG_CHUNK_CRITICAL(png_ptr->chunk_name))\n      png_chunk_error(png_ptr, \"unhandled critical chunk\");\n}\n\n/* This function is called to verify that a chunk name is valid.\n * This function can't have the \"critical chunk check\" incorporated\n * into it, since in the future we will need to be able to call user\n * functions to handle unknown critical chunks after we check that\n * the chunk name itself is valid.\n */\n\n/* Bit hacking: the test for an invalid byte in the 4 byte chunk name is:\n *\n * ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))\n */\n\nvoid /* PRIVATE */\npng_check_chunk_name(png_structrp png_ptr, png_uint_32 chunk_name)\n{\n   int i;\n\n   png_debug(1, \"in png_check_chunk_name\");\n\n   for (i=1; i<=4; ++i)\n   {\n      int c = chunk_name & 0xff;\n\n      if (c < 65 || c > 122 || (c > 90 && c < 97))\n         png_chunk_error(png_ptr, \"invalid chunk type\");\n\n      chunk_name >>= 8;\n   }\n}\n\n/* Combines the row recently read in with the existing pixels in the row.  This\n * routine takes care of alpha and transparency if requested.  This routine also\n * handles the two methods of progressive display of interlaced images,\n * depending on the 'display' value; if 'display' is true then the whole row\n * (dp) is filled from the start by replicating the available pixels.  If\n * 'display' is false only those pixels present in the pass are filled in.\n */\nvoid /* PRIVATE */\npng_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)\n{\n   unsigned int pixel_depth = png_ptr->transformed_pixel_depth;\n   png_const_bytep sp = png_ptr->row_buf + 1;\n   png_alloc_size_t row_width = png_ptr->width;\n   unsigned int pass = png_ptr->pass;\n   png_bytep end_ptr = 0;\n   png_byte end_byte = 0;\n   unsigned int end_mask;\n\n   png_debug(1, \"in png_combine_row\");\n\n   /* Added in 1.5.6: it should not be possible to enter this routine until at\n    * least one row has been read from the PNG data and transformed.\n    */\n   if (pixel_depth == 0)\n      png_error(png_ptr, \"internal row logic error\");\n\n   /* Added in 1.5.4: the pixel depth should match the information returned by\n    * any call to png_read_update_info at this point.  Do not continue if we got\n    * this wrong.\n    */\n   if (png_ptr->info_rowbytes != 0 && png_ptr->info_rowbytes !=\n          PNG_ROWBYTES(pixel_depth, row_width))\n      png_error(png_ptr, \"internal row size calculation error\");\n\n   /* Don't expect this to ever happen: */\n   if (row_width == 0)\n      png_error(png_ptr, \"internal row width error\");\n\n   /* Preserve the last byte in cases where only part of it will be overwritten,\n    * the multiply below may overflow, we don't care because ANSI-C guarantees\n    * we get the low bits.\n    */\n   end_mask = (pixel_depth * row_width) & 7;\n   if (end_mask != 0)\n   {\n      /* end_ptr == NULL is a flag to say do nothing */\n      end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1;\n      end_byte = *end_ptr;\n#     ifdef PNG_READ_PACKSWAP_SUPPORTED\n      if ((png_ptr->transformations & PNG_PACKSWAP) != 0)\n         /* little-endian byte */\n         end_mask = 0xff << end_mask;\n\n      else /* big-endian byte */\n#     endif\n      end_mask = 0xff >> end_mask;\n      /* end_mask is now the bits to *keep* from the destination row */\n   }\n\n   /* For non-interlaced images this reduces to a memcpy(). A memcpy()\n    * will also happen if interlacing isn't supported or if the application\n    * does not call png_set_interlace_handling().  In the latter cases the\n    * caller just gets a sequence of the unexpanded rows from each interlace\n    * pass.\n    */\n#ifdef PNG_READ_INTERLACING_SUPPORTED\n   if (png_ptr->interlaced != 0 &&\n       (png_ptr->transformations & PNG_INTERLACE) != 0 &&\n       pass < 6 && (display == 0 ||\n       /* The following copies everything for 'display' on passes 0, 2 and 4. */\n       (display == 1 && (pass & 1) != 0)))\n   {\n      /* Narrow images may have no bits in a pass; the caller should handle\n       * this, but this test is cheap:\n       */\n      if (row_width <= PNG_PASS_START_COL(pass))\n         return;\n\n      if (pixel_depth < 8)\n      {\n         /* For pixel depths up to 4 bpp the 8-pixel mask can be expanded to fit\n          * into 32 bits, then a single loop over the bytes using the four byte\n          * values in the 32-bit mask can be used.  For the 'display' option the\n          * expanded mask may also not require any masking within a byte.  To\n          * make this work the PACKSWAP option must be taken into account - it\n          * simply requires the pixels to be reversed in each byte.\n          *\n          * The 'regular' case requires a mask for each of the first 6 passes,\n          * the 'display' case does a copy for the even passes in the range\n          * 0..6.  This has already been handled in the test above.\n          *\n          * The masks are arranged as four bytes with the first byte to use in\n          * the lowest bits (little-endian) regardless of the order (PACKSWAP or\n          * not) of the pixels in each byte.\n          *\n          * NOTE: the whole of this logic depends on the caller of this function\n          * only calling it on rows appropriate to the pass.  This function only\n          * understands the 'x' logic; the 'y' logic is handled by the caller.\n          *\n          * The following defines allow generation of compile time constant bit\n          * masks for each pixel depth and each possibility of swapped or not\n          * swapped bytes.  Pass 'p' is in the range 0..6; 'x', a pixel index,\n          * is in the range 0..7; and the result is 1 if the pixel is to be\n          * copied in the pass, 0 if not.  'S' is for the sparkle method, 'B'\n          * for the block method.\n          *\n          * With some compilers a compile time expression of the general form:\n          *\n          *    (shift >= 32) ? (a >> (shift-32)) : (b >> shift)\n          *\n          * Produces warnings with values of 'shift' in the range 33 to 63\n          * because the right hand side of the ?: expression is evaluated by\n          * the compiler even though it isn't used.  Microsoft Visual C (various\n          * versions) and the Intel C compiler are known to do this.  To avoid\n          * this the following macros are used in 1.5.6.  This is a temporary\n          * solution to avoid destabilizing the code during the release process.\n          */\n#        if PNG_USE_COMPILE_TIME_MASKS\n#           define PNG_LSR(x,s) ((x)>>((s) & 0x1f))\n#           define PNG_LSL(x,s) ((x)<<((s) & 0x1f))\n#        else\n#           define PNG_LSR(x,s) ((x)>>(s))\n#           define PNG_LSL(x,s) ((x)<<(s))\n#        endif\n#        define S_COPY(p,x) (((p)<4 ? PNG_LSR(0x80088822,(3-(p))*8+(7-(x))) :\\\n           PNG_LSR(0xaa55ff00,(7-(p))*8+(7-(x)))) & 1)\n#        define B_COPY(p,x) (((p)<4 ? PNG_LSR(0xff0fff33,(3-(p))*8+(7-(x))) :\\\n           PNG_LSR(0xff55ff00,(7-(p))*8+(7-(x)))) & 1)\n\n         /* Return a mask for pass 'p' pixel 'x' at depth 'd'.  The mask is\n          * little endian - the first pixel is at bit 0 - however the extra\n          * parameter 's' can be set to cause the mask position to be swapped\n          * within each byte, to match the PNG format.  This is done by XOR of\n          * the shift with 7, 6 or 4 for bit depths 1, 2 and 4.\n          */\n#        define PIXEL_MASK(p,x,d,s) \\\n            (PNG_LSL(((PNG_LSL(1U,(d)))-1),(((x)*(d))^((s)?8-(d):0))))\n\n         /* Hence generate the appropriate 'block' or 'sparkle' pixel copy mask.\n          */\n#        define S_MASKx(p,x,d,s) (S_COPY(p,x)?PIXEL_MASK(p,x,d,s):0)\n#        define B_MASKx(p,x,d,s) (B_COPY(p,x)?PIXEL_MASK(p,x,d,s):0)\n\n         /* Combine 8 of these to get the full mask.  For the 1-bpp and 2-bpp\n          * cases the result needs replicating, for the 4-bpp case the above\n          * generates a full 32 bits.\n          */\n#        define MASK_EXPAND(m,d) ((m)*((d)==1?0x01010101:((d)==2?0x00010001:1)))\n\n#        define S_MASK(p,d,s) MASK_EXPAND(S_MASKx(p,0,d,s) + S_MASKx(p,1,d,s) +\\\n            S_MASKx(p,2,d,s) + S_MASKx(p,3,d,s) + S_MASKx(p,4,d,s) +\\\n            S_MASKx(p,5,d,s) + S_MASKx(p,6,d,s) + S_MASKx(p,7,d,s), d)\n\n#        define B_MASK(p,d,s) MASK_EXPAND(B_MASKx(p,0,d,s) + B_MASKx(p,1,d,s) +\\\n            B_MASKx(p,2,d,s) + B_MASKx(p,3,d,s) + B_MASKx(p,4,d,s) +\\\n            B_MASKx(p,5,d,s) + B_MASKx(p,6,d,s) + B_MASKx(p,7,d,s), d)\n\n#if PNG_USE_COMPILE_TIME_MASKS\n         /* Utility macros to construct all the masks for a depth/swap\n          * combination.  The 's' parameter says whether the format is PNG\n          * (big endian bytes) or not.  Only the three odd-numbered passes are\n          * required for the display/block algorithm.\n          */\n#        define S_MASKS(d,s) { S_MASK(0,d,s), S_MASK(1,d,s), S_MASK(2,d,s),\\\n            S_MASK(3,d,s), S_MASK(4,d,s), S_MASK(5,d,s) }\n\n#        define B_MASKS(d,s) { B_MASK(1,d,s), B_MASK(3,d,s), B_MASK(5,d,s) }\n\n#        define DEPTH_INDEX(d) ((d)==1?0:((d)==2?1:2))\n\n         /* Hence the pre-compiled masks indexed by PACKSWAP (or not), depth and\n          * then pass:\n          */\n         static PNG_CONST png_uint_32 row_mask[2/*PACKSWAP*/][3/*depth*/][6] =\n         {\n            /* Little-endian byte masks for PACKSWAP */\n            { S_MASKS(1,0), S_MASKS(2,0), S_MASKS(4,0) },\n            /* Normal (big-endian byte) masks - PNG format */\n            { S_MASKS(1,1), S_MASKS(2,1), S_MASKS(4,1) }\n         };\n\n         /* display_mask has only three entries for the odd passes, so index by\n          * pass>>1.\n          */\n         static PNG_CONST png_uint_32 display_mask[2][3][3] =\n         {\n            /* Little-endian byte masks for PACKSWAP */\n            { B_MASKS(1,0), B_MASKS(2,0), B_MASKS(4,0) },\n            /* Normal (big-endian byte) masks - PNG format */\n            { B_MASKS(1,1), B_MASKS(2,1), B_MASKS(4,1) }\n         };\n\n#        define MASK(pass,depth,display,png)\\\n            ((display)?display_mask[png][DEPTH_INDEX(depth)][pass>>1]:\\\n               row_mask[png][DEPTH_INDEX(depth)][pass])\n\n#else /* !PNG_USE_COMPILE_TIME_MASKS */\n         /* This is the runtime alternative: it seems unlikely that this will\n          * ever be either smaller or faster than the compile time approach.\n          */\n#        define MASK(pass,depth,display,png)\\\n            ((display)?B_MASK(pass,depth,png):S_MASK(pass,depth,png))\n#endif /* !USE_COMPILE_TIME_MASKS */\n\n         /* Use the appropriate mask to copy the required bits.  In some cases\n          * the byte mask will be 0 or 0xff; optimize these cases.  row_width is\n          * the number of pixels, but the code copies bytes, so it is necessary\n          * to special case the end.\n          */\n         png_uint_32 pixels_per_byte = 8 / pixel_depth;\n         png_uint_32 mask;\n\n#        ifdef PNG_READ_PACKSWAP_SUPPORTED\n         if ((png_ptr->transformations & PNG_PACKSWAP) != 0)\n            mask = MASK(pass, pixel_depth, display, 0);\n\n         else\n#        endif\n         mask = MASK(pass, pixel_depth, display, 1);\n\n         for (;;)\n         {\n            png_uint_32 m;\n\n            /* It doesn't matter in the following if png_uint_32 has more than\n             * 32 bits because the high bits always match those in m<<24; it is,\n             * however, essential to use OR here, not +, because of this.\n             */\n            m = mask;\n            mask = (m >> 8) | (m << 24); /* rotate right to good compilers */\n            m &= 0xff;\n\n            if (m != 0) /* something to copy */\n            {\n               if (m != 0xff)\n                  *dp = (png_byte)((*dp & ~m) | (*sp & m));\n               else\n                  *dp = *sp;\n            }\n\n            /* NOTE: this may overwrite the last byte with garbage if the image\n             * is not an exact number of bytes wide; libpng has always done\n             * this.\n             */\n            if (row_width <= pixels_per_byte)\n               break; /* May need to restore part of the last byte */\n\n            row_width -= pixels_per_byte;\n            ++dp;\n            ++sp;\n         }\n      }\n\n      else /* pixel_depth >= 8 */\n      {\n         unsigned int bytes_to_copy, bytes_to_jump;\n\n         /* Validate the depth - it must be a multiple of 8 */\n         if (pixel_depth & 7)\n            png_error(png_ptr, \"invalid user transform pixel depth\");\n\n         pixel_depth >>= 3; /* now in bytes */\n         row_width *= pixel_depth;\n\n         /* Regardless of pass number the Adam 7 interlace always results in a\n          * fixed number of pixels to copy then to skip.  There may be a\n          * different number of pixels to skip at the start though.\n          */\n         {\n            unsigned int offset = PNG_PASS_START_COL(pass) * pixel_depth;\n\n            row_width -= offset;\n            dp += offset;\n            sp += offset;\n         }\n\n         /* Work out the bytes to copy. */\n         if (display != 0)\n         {\n            /* When doing the 'block' algorithm the pixel in the pass gets\n             * replicated to adjacent pixels.  This is why the even (0,2,4,6)\n             * passes are skipped above - the entire expanded row is copied.\n             */\n            bytes_to_copy = (1<<((6-pass)>>1)) * pixel_depth;\n\n            /* But don't allow this number to exceed the actual row width. */\n            if (bytes_to_copy > row_width)\n               bytes_to_copy = (unsigned int)/*SAFE*/row_width;\n         }\n\n         else /* normal row; Adam7 only ever gives us one pixel to copy. */\n            bytes_to_copy = pixel_depth;\n\n         /* In Adam7 there is a constant offset between where the pixels go. */\n         bytes_to_jump = PNG_PASS_COL_OFFSET(pass) * pixel_depth;\n\n         /* And simply copy these bytes.  Some optimization is possible here,\n          * depending on the value of 'bytes_to_copy'.  Special case the low\n          * byte counts, which we know to be frequent.\n          *\n          * Notice that these cases all 'return' rather than 'break' - this\n          * avoids an unnecessary test on whether to restore the last byte\n          * below.\n          */\n         switch (bytes_to_copy)\n         {\n            case 1:\n               for (;;)\n               {\n                  *dp = *sp;\n\n                  if (row_width <= bytes_to_jump)\n                     return;\n\n                  dp += bytes_to_jump;\n                  sp += bytes_to_jump;\n                  row_width -= bytes_to_jump;\n               }\n\n            case 2:\n               /* There is a possibility of a partial copy at the end here; this\n                * slows the code down somewhat.\n                */\n               do\n               {\n                  dp[0] = sp[0], dp[1] = sp[1];\n\n                  if (row_width <= bytes_to_jump)\n                     return;\n\n                  sp += bytes_to_jump;\n                  dp += bytes_to_jump;\n                  row_width -= bytes_to_jump;\n               }\n               while (row_width > 1);\n\n               /* And there can only be one byte left at this point: */\n               *dp = *sp;\n               return;\n\n            case 3:\n               /* This can only be the RGB case, so each copy is exactly one\n                * pixel and it is not necessary to check for a partial copy.\n                */\n               for (;;)\n               {\n                  dp[0] = sp[0], dp[1] = sp[1], dp[2] = sp[2];\n\n                  if (row_width <= bytes_to_jump)\n                     return;\n\n                  sp += bytes_to_jump;\n                  dp += bytes_to_jump;\n                  row_width -= bytes_to_jump;\n               }\n\n            default:\n#if PNG_ALIGN_TYPE != PNG_ALIGN_NONE\n               /* Check for double byte alignment and, if possible, use a\n                * 16-bit copy.  Don't attempt this for narrow images - ones that\n                * are less than an interlace panel wide.  Don't attempt it for\n                * wide bytes_to_copy either - use the memcpy there.\n                */\n               if (bytes_to_copy < 16 /*else use memcpy*/ &&\n                   png_isaligned(dp, png_uint_16) &&\n                   png_isaligned(sp, png_uint_16) &&\n                   bytes_to_copy % (sizeof (png_uint_16)) == 0 &&\n                   bytes_to_jump % (sizeof (png_uint_16)) == 0)\n               {\n                  /* Everything is aligned for png_uint_16 copies, but try for\n                   * png_uint_32 first.\n                   */\n                  if (png_isaligned(dp, png_uint_32) != 0 &&\n                      png_isaligned(sp, png_uint_32) != 0 &&\n                      bytes_to_copy % (sizeof (png_uint_32)) == 0 &&\n                      bytes_to_jump % (sizeof (png_uint_32)) == 0)\n                  {\n                     png_uint_32p dp32 = png_aligncast(png_uint_32p,dp);\n                     png_const_uint_32p sp32 = png_aligncastconst(\n                         png_const_uint_32p, sp);\n                     size_t skip = (bytes_to_jump-bytes_to_copy) /\n                         (sizeof (png_uint_32));\n\n                     do\n                     {\n                        size_t c = bytes_to_copy;\n                        do\n                        {\n                           *dp32++ = *sp32++;\n                           c -= (sizeof (png_uint_32));\n                        }\n                        while (c > 0);\n\n                        if (row_width <= bytes_to_jump)\n                           return;\n\n                        dp32 += skip;\n                        sp32 += skip;\n                        row_width -= bytes_to_jump;\n                     }\n                     while (bytes_to_copy <= row_width);\n\n                     /* Get to here when the row_width truncates the final copy.\n                      * There will be 1-3 bytes left to copy, so don't try the\n                      * 16-bit loop below.\n                      */\n                     dp = (png_bytep)dp32;\n                     sp = (png_const_bytep)sp32;\n                     do\n                        *dp++ = *sp++;\n                     while (--row_width > 0);\n                     return;\n                  }\n\n                  /* Else do it in 16-bit quantities, but only if the size is\n                   * not too large.\n                   */\n                  else\n                  {\n                     png_uint_16p dp16 = png_aligncast(png_uint_16p, dp);\n                     png_const_uint_16p sp16 = png_aligncastconst(\n                        png_const_uint_16p, sp);\n                     size_t skip = (bytes_to_jump-bytes_to_copy) /\n                        (sizeof (png_uint_16));\n\n                     do\n                     {\n                        size_t c = bytes_to_copy;\n                        do\n                        {\n                           *dp16++ = *sp16++;\n                           c -= (sizeof (png_uint_16));\n                        }\n                        while (c > 0);\n\n                        if (row_width <= bytes_to_jump)\n                           return;\n\n                        dp16 += skip;\n                        sp16 += skip;\n                        row_width -= bytes_to_jump;\n                     }\n                     while (bytes_to_copy <= row_width);\n\n                     /* End of row - 1 byte left, bytes_to_copy > row_width: */\n                     dp = (png_bytep)dp16;\n                     sp = (png_const_bytep)sp16;\n                     do\n                        *dp++ = *sp++;\n                     while (--row_width > 0);\n                     return;\n                  }\n               }\n#endif /* ALIGN_TYPE code */\n\n               /* The true default - use a memcpy: */\n               for (;;)\n               {\n                  memcpy(dp, sp, bytes_to_copy);\n\n                  if (row_width <= bytes_to_jump)\n                     return;\n\n                  sp += bytes_to_jump;\n                  dp += bytes_to_jump;\n                  row_width -= bytes_to_jump;\n                  if (bytes_to_copy > row_width)\n                     bytes_to_copy = (unsigned int)/*SAFE*/row_width;\n               }\n         }\n\n         /* NOT REACHED*/\n      } /* pixel_depth >= 8 */\n\n      /* Here if pixel_depth < 8 to check 'end_ptr' below. */\n   }\n   else\n#endif /* READ_INTERLACING */\n\n   /* If here then the switch above wasn't used so just memcpy the whole row\n    * from the temporary row buffer (notice that this overwrites the end of the\n    * destination row if it is a partial byte.)\n    */\n   memcpy(dp, sp, PNG_ROWBYTES(pixel_depth, row_width));\n\n   /* Restore the overwritten bits from the last byte if necessary. */\n   if (end_ptr != NULL)\n      *end_ptr = (png_byte)((end_byte & end_mask) | (*end_ptr & ~end_mask));\n}\n\n#ifdef PNG_READ_INTERLACING_SUPPORTED\nvoid /* PRIVATE */\npng_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,\n   png_uint_32 transformations /* Because these may affect the byte layout */)\n{\n   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */\n   /* Offset to next interlace block */\n   static PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};\n\n   png_debug(1, \"in png_do_read_interlace\");\n   if (row != NULL && row_info != NULL)\n   {\n      png_uint_32 final_width;\n\n      final_width = row_info->width * png_pass_inc[pass];\n\n      switch (row_info->pixel_depth)\n      {\n         case 1:\n         {\n            png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3);\n            png_bytep dp = row + (png_size_t)((final_width - 1) >> 3);\n            int sshift, dshift;\n            int s_start, s_end, s_inc;\n            int jstop = png_pass_inc[pass];\n            png_byte v;\n            png_uint_32 i;\n            int j;\n\n#ifdef PNG_READ_PACKSWAP_SUPPORTED\n            if ((transformations & PNG_PACKSWAP) != 0)\n            {\n                sshift = (int)((row_info->width + 7) & 0x07);\n                dshift = (int)((final_width + 7) & 0x07);\n                s_start = 7;\n                s_end = 0;\n                s_inc = -1;\n            }\n\n            else\n#endif\n            {\n                sshift = 7 - (int)((row_info->width + 7) & 0x07);\n                dshift = 7 - (int)((final_width + 7) & 0x07);\n                s_start = 0;\n                s_end = 7;\n                s_inc = 1;\n            }\n\n            for (i = 0; i < row_info->width; i++)\n            {\n               v = (png_byte)((*sp >> sshift) & 0x01);\n               for (j = 0; j < jstop; j++)\n               {\n                  unsigned int tmp = *dp & (0x7f7f >> (7 - dshift));\n                  tmp |= v << dshift;\n                  *dp = (png_byte)(tmp & 0xff);\n\n                  if (dshift == s_end)\n                  {\n                     dshift = s_start;\n                     dp--;\n                  }\n\n                  else\n                     dshift += s_inc;\n               }\n\n               if (sshift == s_end)\n               {\n                  sshift = s_start;\n                  sp--;\n               }\n\n               else\n                  sshift += s_inc;\n            }\n            break;\n         }\n\n         case 2:\n         {\n            png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2);\n            png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2);\n            int sshift, dshift;\n            int s_start, s_end, s_inc;\n            int jstop = png_pass_inc[pass];\n            png_uint_32 i;\n\n#ifdef PNG_READ_PACKSWAP_SUPPORTED\n            if ((transformations & PNG_PACKSWAP) != 0)\n            {\n               sshift = (int)(((row_info->width + 3) & 0x03) << 1);\n               dshift = (int)(((final_width + 3) & 0x03) << 1);\n               s_start = 6;\n               s_end = 0;\n               s_inc = -2;\n            }\n\n            else\n#endif\n            {\n               sshift = (int)((3 - ((row_info->width + 3) & 0x03)) << 1);\n               dshift = (int)((3 - ((final_width + 3) & 0x03)) << 1);\n               s_start = 0;\n               s_end = 6;\n               s_inc = 2;\n            }\n\n            for (i = 0; i < row_info->width; i++)\n            {\n               png_byte v;\n               int j;\n\n               v = (png_byte)((*sp >> sshift) & 0x03);\n               for (j = 0; j < jstop; j++)\n               {\n                  unsigned int tmp = *dp & (0x3f3f >> (6 - dshift));\n                  tmp |= v << dshift;\n                  *dp = (png_byte)(tmp & 0xff);\n\n                  if (dshift == s_end)\n                  {\n                     dshift = s_start;\n                     dp--;\n                  }\n\n                  else\n                     dshift += s_inc;\n               }\n\n               if (sshift == s_end)\n               {\n                  sshift = s_start;\n                  sp--;\n               }\n\n               else\n                  sshift += s_inc;\n            }\n            break;\n         }\n\n         case 4:\n         {\n            png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1);\n            png_bytep dp = row + (png_size_t)((final_width - 1) >> 1);\n            int sshift, dshift;\n            int s_start, s_end, s_inc;\n            png_uint_32 i;\n            int jstop = png_pass_inc[pass];\n\n#ifdef PNG_READ_PACKSWAP_SUPPORTED\n            if ((transformations & PNG_PACKSWAP) != 0)\n            {\n               sshift = (int)(((row_info->width + 1) & 0x01) << 2);\n               dshift = (int)(((final_width + 1) & 0x01) << 2);\n               s_start = 4;\n               s_end = 0;\n               s_inc = -4;\n            }\n\n            else\n#endif\n            {\n               sshift = (int)((1 - ((row_info->width + 1) & 0x01)) << 2);\n               dshift = (int)((1 - ((final_width + 1) & 0x01)) << 2);\n               s_start = 0;\n               s_end = 4;\n               s_inc = 4;\n            }\n\n            for (i = 0; i < row_info->width; i++)\n            {\n               png_byte v = (png_byte)((*sp >> sshift) & 0x0f);\n               int j;\n\n               for (j = 0; j < jstop; j++)\n               {\n                  unsigned int tmp = *dp & (0xf0f >> (4 - dshift));\n                  tmp |= v << dshift;\n                  *dp = (png_byte)(tmp & 0xff);\n\n                  if (dshift == s_end)\n                  {\n                     dshift = s_start;\n                     dp--;\n                  }\n\n                  else\n                     dshift += s_inc;\n               }\n\n               if (sshift == s_end)\n               {\n                  sshift = s_start;\n                  sp--;\n               }\n\n               else\n                  sshift += s_inc;\n            }\n            break;\n         }\n\n         default:\n         {\n            png_size_t pixel_bytes = (row_info->pixel_depth >> 3);\n\n            png_bytep sp = row + (png_size_t)(row_info->width - 1)\n                * pixel_bytes;\n\n            png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes;\n\n            int jstop = png_pass_inc[pass];\n            png_uint_32 i;\n\n            for (i = 0; i < row_info->width; i++)\n            {\n               png_byte v[8]; /* SAFE; pixel_depth does not exceed 64 */\n               int j;\n\n               memcpy(v, sp, pixel_bytes);\n\n               for (j = 0; j < jstop; j++)\n               {\n                  memcpy(dp, v, pixel_bytes);\n                  dp -= pixel_bytes;\n               }\n\n               sp -= pixel_bytes;\n            }\n            break;\n         }\n      }\n\n      row_info->width = final_width;\n      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width);\n   }\n#ifndef PNG_READ_PACKSWAP_SUPPORTED\n   PNG_UNUSED(transformations)  /* Silence compiler warning */\n#endif\n}\n#endif /* READ_INTERLACING */\n\nstatic void\npng_read_filter_row_sub(png_row_infop row_info, png_bytep row,\n   png_const_bytep prev_row)\n{\n   png_size_t i;\n   png_size_t istop = row_info->rowbytes;\n   unsigned int bpp = (row_info->pixel_depth + 7) >> 3;\n   png_bytep rp = row + bpp;\n\n   PNG_UNUSED(prev_row)\n\n   for (i = bpp; i < istop; i++)\n   {\n      *rp = (png_byte)(((int)(*rp) + (int)(*(rp-bpp))) & 0xff);\n      rp++;\n   }\n}\n\nstatic void\npng_read_filter_row_up(png_row_infop row_info, png_bytep row,\n   png_const_bytep prev_row)\n{\n   png_size_t i;\n   png_size_t istop = row_info->rowbytes;\n   png_bytep rp = row;\n   png_const_bytep pp = prev_row;\n\n   for (i = 0; i < istop; i++)\n   {\n      *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);\n      rp++;\n   }\n}\n\nstatic void\npng_read_filter_row_avg(png_row_infop row_info, png_bytep row,\n   png_const_bytep prev_row)\n{\n   png_size_t i;\n   png_bytep rp = row;\n   png_const_bytep pp = prev_row;\n   unsigned int bpp = (row_info->pixel_depth + 7) >> 3;\n   png_size_t istop = row_info->rowbytes - bpp;\n\n   for (i = 0; i < bpp; i++)\n   {\n      *rp = (png_byte)(((int)(*rp) +\n         ((int)(*pp++) / 2 )) & 0xff);\n\n      rp++;\n   }\n\n   for (i = 0; i < istop; i++)\n   {\n      *rp = (png_byte)(((int)(*rp) +\n         (int)(*pp++ + *(rp-bpp)) / 2 ) & 0xff);\n\n      rp++;\n   }\n}\n\nstatic void\npng_read_filter_row_paeth_1byte_pixel(png_row_infop row_info, png_bytep row,\n   png_const_bytep prev_row)\n{\n   png_bytep rp_end = row + row_info->rowbytes;\n   int a, c;\n\n   /* First pixel/byte */\n   c = *prev_row++;\n   a = *row + c;\n   *row++ = (png_byte)a;\n\n   /* Remainder */\n   while (row < rp_end)\n   {\n      int b, pa, pb, pc, p;\n\n      a &= 0xff; /* From previous iteration or start */\n      b = *prev_row++;\n\n      p = b - c;\n      pc = a - c;\n\n#ifdef PNG_USE_ABS\n      pa = abs(p);\n      pb = abs(pc);\n      pc = abs(p + pc);\n#else\n      pa = p < 0 ? -p : p;\n      pb = pc < 0 ? -pc : pc;\n      pc = (p + pc) < 0 ? -(p + pc) : p + pc;\n#endif\n\n      /* Find the best predictor, the least of pa, pb, pc favoring the earlier\n       * ones in the case of a tie.\n       */\n      if (pb < pa) pa = pb, a = b;\n      if (pc < pa) a = c;\n\n      /* Calculate the current pixel in a, and move the previous row pixel to c\n       * for the next time round the loop\n       */\n      c = b;\n      a += *row;\n      *row++ = (png_byte)a;\n   }\n}\n\nstatic void\npng_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row,\n   png_const_bytep prev_row)\n{\n   int bpp = (row_info->pixel_depth + 7) >> 3;\n   png_bytep rp_end = row + bpp;\n\n   /* Process the first pixel in the row completely (this is the same as 'up'\n    * because there is only one candidate predictor for the first row).\n    */\n   while (row < rp_end)\n   {\n      int a = *row + *prev_row++;\n      *row++ = (png_byte)a;\n   }\n\n   /* Remainder */\n   rp_end += row_info->rowbytes - bpp;\n\n   while (row < rp_end)\n   {\n      int a, b, c, pa, pb, pc, p;\n\n      c = *(prev_row - bpp);\n      a = *(row - bpp);\n      b = *prev_row++;\n\n      p = b - c;\n      pc = a - c;\n\n#ifdef PNG_USE_ABS\n      pa = abs(p);\n      pb = abs(pc);\n      pc = abs(p + pc);\n#else\n      pa = p < 0 ? -p : p;\n      pb = pc < 0 ? -pc : pc;\n      pc = (p + pc) < 0 ? -(p + pc) : p + pc;\n#endif\n\n      if (pb < pa) pa = pb, a = b;\n      if (pc < pa) a = c;\n\n      a += *row;\n      *row++ = (png_byte)a;\n   }\n}\n\nstatic void\npng_init_filter_functions(png_structrp pp)\n   /* This function is called once for every PNG image (except for PNG images\n    * that only use PNG_FILTER_VALUE_NONE for all rows) to set the\n    * implementations required to reverse the filtering of PNG rows.  Reversing\n    * the filter is the first transformation performed on the row data.  It is\n    * performed in place, therefore an implementation can be selected based on\n    * the image pixel format.  If the implementation depends on image width then\n    * take care to ensure that it works correctly if the image is interlaced -\n    * interlacing causes the actual row width to vary.\n    */\n{\n   unsigned int bpp = (pp->pixel_depth + 7) >> 3;\n\n   pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub;\n   pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up;\n   pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg;\n   if (bpp == 1)\n      pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =\n         png_read_filter_row_paeth_1byte_pixel;\n   else\n      pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =\n         png_read_filter_row_paeth_multibyte_pixel;\n\n#ifdef PNG_FILTER_OPTIMIZATIONS\n   /* To use this define PNG_FILTER_OPTIMIZATIONS as the name of a function to\n    * call to install hardware optimizations for the above functions; simply\n    * replace whatever elements of the pp->read_filter[] array with a hardware\n    * specific (or, for that matter, generic) optimization.\n    *\n    * To see an example of this examine what configure.ac does when\n    * --enable-arm-neon is specified on the command line.\n    */\n   PNG_FILTER_OPTIMIZATIONS(pp, bpp);\n#endif\n}\n\nvoid /* PRIVATE */\npng_read_filter_row(png_structrp pp, png_row_infop row_info, png_bytep row,\n   png_const_bytep prev_row, int filter)\n{\n   /* OPTIMIZATION: DO NOT MODIFY THIS FUNCTION, instead #define\n    * PNG_FILTER_OPTIMIZATIONS to a function that overrides the generic\n    * implementations.  See png_init_filter_functions above.\n    */\n   if (filter > PNG_FILTER_VALUE_NONE && filter < PNG_FILTER_VALUE_LAST)\n   {\n      if (pp->read_filter[0] == NULL)\n         png_init_filter_functions(pp);\n\n      pp->read_filter[filter-1](row_info, row, prev_row);\n   }\n}\n\n#ifdef PNG_SEQUENTIAL_READ_SUPPORTED\nvoid /* PRIVATE */\npng_read_IDAT_data(png_structrp png_ptr, png_bytep output,\n   png_alloc_size_t avail_out)\n{\n   /* Loop reading IDATs and decompressing the result into output[avail_out] */\n   png_ptr->zstream.next_out = output;\n   png_ptr->zstream.avail_out = 0; /* safety: set below */\n\n   if (output == NULL)\n      avail_out = 0;\n\n   do\n   {\n      int ret;\n      png_byte tmpbuf[PNG_INFLATE_BUF_SIZE];\n\n      if (png_ptr->zstream.avail_in == 0)\n      {\n         uInt avail_in;\n         png_bytep buffer;\n\n         while (png_ptr->idat_size == 0)\n         {\n            png_crc_finish(png_ptr, 0);\n\n            png_ptr->idat_size = png_read_chunk_header(png_ptr);\n            /* This is an error even in the 'check' case because the code just\n             * consumed a non-IDAT header.\n             */\n            if (png_ptr->chunk_name != png_IDAT)\n               png_error(png_ptr, \"Not enough image data\");\n         }\n\n         avail_in = png_ptr->IDAT_read_size;\n\n         if (avail_in > png_ptr->idat_size)\n            avail_in = (uInt)png_ptr->idat_size;\n\n         /* A PNG with a gradually increasing IDAT size will defeat this attempt\n          * to minimize memory usage by causing lots of re-allocs, but\n          * realistically doing IDAT_read_size re-allocs is not likely to be a\n          * big problem.\n          */\n         buffer = png_read_buffer(png_ptr, avail_in, 0/*error*/);\n\n         png_crc_read(png_ptr, buffer, avail_in);\n         png_ptr->idat_size -= avail_in;\n\n         png_ptr->zstream.next_in = buffer;\n         png_ptr->zstream.avail_in = avail_in;\n      }\n\n      /* And set up the output side. */\n      if (output != NULL) /* standard read */\n      {\n         uInt out = ZLIB_IO_MAX;\n\n         if (out > avail_out)\n            out = (uInt)avail_out;\n\n         avail_out -= out;\n         png_ptr->zstream.avail_out = out;\n      }\n\n      else /* after last row, checking for end */\n      {\n         png_ptr->zstream.next_out = tmpbuf;\n         png_ptr->zstream.avail_out = (sizeof tmpbuf);\n      }\n\n      /* Use NO_FLUSH; this gives zlib the maximum opportunity to optimize the\n       * process.  If the LZ stream is truncated the sequential reader will\n       * terminally damage the stream, above, by reading the chunk header of the\n       * following chunk (it then exits with png_error).\n       *\n       * TODO: deal more elegantly with truncated IDAT lists.\n       */\n      ret = PNG_INFLATE(png_ptr, Z_NO_FLUSH);\n\n      /* Take the unconsumed output back. */\n      if (output != NULL)\n         avail_out += png_ptr->zstream.avail_out;\n\n      else /* avail_out counts the extra bytes */\n         avail_out += (sizeof tmpbuf) - png_ptr->zstream.avail_out;\n\n      png_ptr->zstream.avail_out = 0;\n\n      if (ret == Z_STREAM_END)\n      {\n         /* Do this for safety; we won't read any more into this row. */\n         png_ptr->zstream.next_out = NULL;\n\n         png_ptr->mode |= PNG_AFTER_IDAT;\n         png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;\n\n         if (png_ptr->zstream.avail_in > 0 || png_ptr->idat_size > 0)\n            png_chunk_benign_error(png_ptr, \"Extra compressed data\");\n         break;\n      }\n\n      if (ret != Z_OK)\n      {\n         png_zstream_error(png_ptr, ret);\n\n         if (output != NULL)\n            png_chunk_error(png_ptr, png_ptr->zstream.msg);\n\n         else /* checking */\n         {\n            png_chunk_benign_error(png_ptr, png_ptr->zstream.msg);\n            return;\n         }\n      }\n   } while (avail_out > 0);\n\n   if (avail_out > 0)\n   {\n      /* The stream ended before the image; this is the same as too few IDATs so\n       * should be handled the same way.\n       */\n      if (output != NULL)\n         png_error(png_ptr, \"Not enough image data\");\n\n      else /* the deflate stream contained extra data */\n         png_chunk_benign_error(png_ptr, \"Too much image data\");\n   }\n}\n\nvoid /* PRIVATE */\npng_read_finish_IDAT(png_structrp png_ptr)\n{\n   /* We don't need any more data and the stream should have ended, however the\n    * LZ end code may actually not have been processed.  In this case we must\n    * read it otherwise stray unread IDAT data or, more likely, an IDAT chunk\n    * may still remain to be consumed.\n    */\n   if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)\n   {\n      /* The NULL causes png_read_IDAT_data to swallow any remaining bytes in\n       * the compressed stream, but the stream may be damaged too, so even after\n       * this call we may need to terminate the zstream ownership.\n       */\n      png_read_IDAT_data(png_ptr, NULL, 0);\n      png_ptr->zstream.next_out = NULL; /* safety */\n\n      /* Now clear everything out for safety; the following may not have been\n       * done.\n       */\n      if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)\n      {\n         png_ptr->mode |= PNG_AFTER_IDAT;\n         png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;\n      }\n   }\n\n   /* If the zstream has not been released do it now *and* terminate the reading\n    * of the final IDAT chunk.\n    */\n   if (png_ptr->zowner == png_IDAT)\n   {\n      /* Always do this; the pointers otherwise point into the read buffer. */\n      png_ptr->zstream.next_in = NULL;\n      png_ptr->zstream.avail_in = 0;\n\n      /* Now we no longer own the zstream. */\n      png_ptr->zowner = 0;\n\n      /* The slightly weird semantics of the sequential IDAT reading is that we\n       * are always in or at the end of an IDAT chunk, so we always need to do a\n       * crc_finish here.  If idat_size is non-zero we also need to read the\n       * spurious bytes at the end of the chunk now.\n       */\n      (void)png_crc_finish(png_ptr, png_ptr->idat_size);\n   }\n}\n\nvoid /* PRIVATE */\npng_read_finish_row(png_structrp png_ptr)\n{\n   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */\n\n   /* Start of interlace block */\n   static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};\n\n   /* Offset to next interlace block */\n   static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};\n\n   /* Start of interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};\n\n   /* Offset to next interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};\n\n   png_debug(1, \"in png_read_finish_row\");\n   png_ptr->row_number++;\n   if (png_ptr->row_number < png_ptr->num_rows)\n      return;\n\n   if (png_ptr->interlaced != 0)\n   {\n      png_ptr->row_number = 0;\n\n      /* TO DO: don't do this if prev_row isn't needed (requires\n       * read-ahead of the next row's filter byte.\n       */\n      memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);\n\n      do\n      {\n         png_ptr->pass++;\n\n         if (png_ptr->pass >= 7)\n            break;\n\n         png_ptr->iwidth = (png_ptr->width +\n            png_pass_inc[png_ptr->pass] - 1 -\n            png_pass_start[png_ptr->pass]) /\n            png_pass_inc[png_ptr->pass];\n\n         if ((png_ptr->transformations & PNG_INTERLACE) == 0)\n         {\n            png_ptr->num_rows = (png_ptr->height +\n                png_pass_yinc[png_ptr->pass] - 1 -\n                png_pass_ystart[png_ptr->pass]) /\n                png_pass_yinc[png_ptr->pass];\n         }\n\n         else  /* if (png_ptr->transformations & PNG_INTERLACE) */\n            break; /* libpng deinterlacing sees every row */\n\n      } while (png_ptr->num_rows == 0 || png_ptr->iwidth == 0);\n\n      if (png_ptr->pass < 7)\n         return;\n   }\n\n   /* Here after at the end of the last row of the last pass. */\n   png_read_finish_IDAT(png_ptr);\n}\n#endif /* SEQUENTIAL_READ */\n\nvoid /* PRIVATE */\npng_read_start_row(png_structrp png_ptr)\n{\n   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */\n\n   /* Start of interlace block */\n   static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};\n\n   /* Offset to next interlace block */\n   static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};\n\n   /* Start of interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};\n\n   /* Offset to next interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};\n\n   int max_pixel_depth;\n   png_size_t row_bytes;\n\n   png_debug(1, \"in png_read_start_row\");\n\n#ifdef PNG_READ_TRANSFORMS_SUPPORTED\n   png_init_read_transformations(png_ptr);\n#endif\n   if (png_ptr->interlaced != 0)\n   {\n      if ((png_ptr->transformations & PNG_INTERLACE) == 0)\n         png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -\n             png_pass_ystart[0]) / png_pass_yinc[0];\n\n      else\n         png_ptr->num_rows = png_ptr->height;\n\n      png_ptr->iwidth = (png_ptr->width +\n          png_pass_inc[png_ptr->pass] - 1 -\n          png_pass_start[png_ptr->pass]) /\n          png_pass_inc[png_ptr->pass];\n   }\n\n   else\n   {\n      png_ptr->num_rows = png_ptr->height;\n      png_ptr->iwidth = png_ptr->width;\n   }\n\n   max_pixel_depth = png_ptr->pixel_depth;\n\n   /* WARNING: * png_read_transform_info (pngrtran.c) performs a simpler set of\n    * calculations to calculate the final pixel depth, then\n    * png_do_read_transforms actually does the transforms.  This means that the\n    * code which effectively calculates this value is actually repeated in three\n    * separate places.  They must all match.  Innocent changes to the order of\n    * transformations can and will break libpng in a way that causes memory\n    * overwrites.\n    *\n    * TODO: fix this.\n    */\n#ifdef PNG_READ_PACK_SUPPORTED\n   if ((png_ptr->transformations & PNG_PACK) != 0 && png_ptr->bit_depth < 8)\n      max_pixel_depth = 8;\n#endif\n\n#ifdef PNG_READ_EXPAND_SUPPORTED\n   if ((png_ptr->transformations & PNG_EXPAND) != 0)\n   {\n      if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      {\n         if (png_ptr->num_trans != 0)\n            max_pixel_depth = 32;\n\n         else\n            max_pixel_depth = 24;\n      }\n\n      else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)\n      {\n         if (max_pixel_depth < 8)\n            max_pixel_depth = 8;\n\n         if (png_ptr->num_trans != 0)\n            max_pixel_depth *= 2;\n      }\n\n      else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)\n      {\n         if (png_ptr->num_trans != 0)\n         {\n            max_pixel_depth *= 4;\n            max_pixel_depth /= 3;\n         }\n      }\n   }\n#endif\n\n#ifdef PNG_READ_EXPAND_16_SUPPORTED\n   if ((png_ptr->transformations & PNG_EXPAND_16) != 0)\n   {\n#  ifdef PNG_READ_EXPAND_SUPPORTED\n      /* In fact it is an error if it isn't supported, but checking is\n       * the safe way.\n       */\n      if ((png_ptr->transformations & PNG_EXPAND) != 0)\n      {\n         if (png_ptr->bit_depth < 16)\n            max_pixel_depth *= 2;\n      }\n      else\n#  endif\n      png_ptr->transformations &= ~PNG_EXPAND_16;\n   }\n#endif\n\n#ifdef PNG_READ_FILLER_SUPPORTED\n   if ((png_ptr->transformations & (PNG_FILLER)) != 0)\n   {\n      if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)\n      {\n         if (max_pixel_depth <= 8)\n            max_pixel_depth = 16;\n\n         else\n            max_pixel_depth = 32;\n      }\n\n      else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB ||\n         png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      {\n         if (max_pixel_depth <= 32)\n            max_pixel_depth = 32;\n\n         else\n            max_pixel_depth = 64;\n      }\n   }\n#endif\n\n#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED\n   if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0)\n   {\n      if (\n#ifdef PNG_READ_EXPAND_SUPPORTED\n          (png_ptr->num_trans != 0 &&\n          (png_ptr->transformations & PNG_EXPAND) != 0) ||\n#endif\n#ifdef PNG_READ_FILLER_SUPPORTED\n          (png_ptr->transformations & (PNG_FILLER)) != 0 ||\n#endif\n          png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)\n      {\n         if (max_pixel_depth <= 16)\n            max_pixel_depth = 32;\n\n         else\n            max_pixel_depth = 64;\n      }\n\n      else\n      {\n         if (max_pixel_depth <= 8)\n         {\n            if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n               max_pixel_depth = 32;\n\n            else\n               max_pixel_depth = 24;\n         }\n\n         else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n            max_pixel_depth = 64;\n\n         else\n            max_pixel_depth = 48;\n      }\n   }\n#endif\n\n#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \\\ndefined(PNG_USER_TRANSFORM_PTR_SUPPORTED)\n   if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)\n   {\n      int user_pixel_depth = png_ptr->user_transform_depth *\n         png_ptr->user_transform_channels;\n\n      if (user_pixel_depth > max_pixel_depth)\n         max_pixel_depth = user_pixel_depth;\n   }\n#endif\n\n   /* This value is stored in png_struct and double checked in the row read\n    * code.\n    */\n   png_ptr->maximum_pixel_depth = (png_byte)max_pixel_depth;\n   png_ptr->transformed_pixel_depth = 0; /* calculated on demand */\n\n   /* Align the width on the next larger 8 pixels.  Mainly used\n    * for interlacing\n    */\n   row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7));\n   /* Calculate the maximum bytes needed, adding a byte and a pixel\n    * for safety's sake\n    */\n   row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) +\n       1 + ((max_pixel_depth + 7) >> 3);\n\n#ifdef PNG_MAX_MALLOC_64K\n   if (row_bytes > (png_uint_32)65536L)\n      png_error(png_ptr, \"This image requires a row greater than 64KB\");\n#endif\n\n   if (row_bytes + 48 > png_ptr->old_big_row_buf_size)\n   {\n     png_free(png_ptr, png_ptr->big_row_buf);\n     png_free(png_ptr, png_ptr->big_prev_row);\n\n     if (png_ptr->interlaced != 0)\n        png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr,\n            row_bytes + 48);\n\n     else\n        png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 48);\n\n     png_ptr->big_prev_row = (png_bytep)png_malloc(png_ptr, row_bytes + 48);\n\n#ifdef PNG_ALIGNED_MEMORY_SUPPORTED\n     /* Use 16-byte aligned memory for row_buf with at least 16 bytes\n      * of padding before and after row_buf; treat prev_row similarly.\n      * NOTE: the alignment is to the start of the pixels, one beyond the start\n      * of the buffer, because of the filter byte.  Prior to libpng 1.5.6 this\n      * was incorrect; the filter byte was aligned, which had the exact\n      * opposite effect of that intended.\n      */\n     {\n        png_bytep temp = png_ptr->big_row_buf + 32;\n        int extra = (int)((temp - (png_bytep)0) & 0x0f);\n        png_ptr->row_buf = temp - extra - 1/*filter byte*/;\n\n        temp = png_ptr->big_prev_row + 32;\n        extra = (int)((temp - (png_bytep)0) & 0x0f);\n        png_ptr->prev_row = temp - extra - 1/*filter byte*/;\n     }\n\n#else\n     /* Use 31 bytes of padding before and 17 bytes after row_buf. */\n     png_ptr->row_buf = png_ptr->big_row_buf + 31;\n     png_ptr->prev_row = png_ptr->big_prev_row + 31;\n#endif\n     png_ptr->old_big_row_buf_size = row_bytes + 48;\n   }\n\n#ifdef PNG_MAX_MALLOC_64K\n   if (png_ptr->rowbytes > 65535)\n      png_error(png_ptr, \"This image requires a row greater than 64KB\");\n\n#endif\n   if (png_ptr->rowbytes > (PNG_SIZE_MAX - 1))\n      png_error(png_ptr, \"Row has too many bytes to allocate in memory\");\n\n   memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);\n\n   png_debug1(3, \"width = %u,\", png_ptr->width);\n   png_debug1(3, \"height = %u,\", png_ptr->height);\n   png_debug1(3, \"iwidth = %u,\", png_ptr->iwidth);\n   png_debug1(3, \"num_rows = %u,\", png_ptr->num_rows);\n   png_debug1(3, \"rowbytes = %lu,\", (unsigned long)png_ptr->rowbytes);\n   png_debug1(3, \"irowbytes = %lu\",\n       (unsigned long)PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1);\n\n   /* The sequential reader needs a buffer for IDAT, but the progressive reader\n    * does not, so free the read buffer now regardless; the sequential reader\n    * reallocates it on demand.\n    */\n   if (png_ptr->read_buffer != 0)\n   {\n      png_bytep buffer = png_ptr->read_buffer;\n\n      png_ptr->read_buffer_size = 0;\n      png_ptr->read_buffer = NULL;\n      png_free(png_ptr, buffer);\n   }\n\n   /* Finally claim the zstream for the inflate of the IDAT data, use the bits\n    * value from the stream (note that this will result in a fatal error if the\n    * IDAT stream has a bogus deflate header window_bits value, but this should\n    * not be happening any longer!)\n    */\n   if (png_inflate_claim(png_ptr, png_IDAT) != Z_OK)\n      png_error(png_ptr, png_ptr->zstream.msg);\n\n   png_ptr->flags |= PNG_FLAG_ROW_INIT;\n}\n#endif /* READ */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngset.c",
    "content": "\n/* pngset.c - storage of image information into info struct\n *\n * Last changed in libpng 1.6.23 [June 9, 2016]\n * Copyright (c) 1998-2016 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * The functions here are used during reads to store data from the file\n * into the info struct, and during writes to store application data\n * into the info struct for writing into the file.  This abstracts the\n * info struct and allows us to change the structure in the future.\n */\n\n#include \"pngpriv.h\"\n\n#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)\n\n#ifdef PNG_bKGD_SUPPORTED\nvoid PNGAPI\npng_set_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_const_color_16p background)\n{\n   png_debug1(1, \"in %s storage function\", \"bKGD\");\n\n   if (png_ptr == NULL || info_ptr == NULL || background == NULL)\n      return;\n\n   info_ptr->background = *background;\n   info_ptr->valid |= PNG_INFO_bKGD;\n}\n#endif\n\n#ifdef PNG_cHRM_SUPPORTED\nvoid PNGFAPI\npng_set_cHRM_fixed(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,\n    png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,\n    png_fixed_point blue_x, png_fixed_point blue_y)\n{\n   png_xy xy;\n\n   png_debug1(1, \"in %s storage function\", \"cHRM fixed\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   xy.redx = red_x;\n   xy.redy = red_y;\n   xy.greenx = green_x;\n   xy.greeny = green_y;\n   xy.bluex = blue_x;\n   xy.bluey = blue_y;\n   xy.whitex = white_x;\n   xy.whitey = white_y;\n\n   if (png_colorspace_set_chromaticities(png_ptr, &info_ptr->colorspace, &xy,\n       2/* override with app values*/) != 0)\n      info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;\n\n   png_colorspace_sync_info(png_ptr, info_ptr);\n}\n\nvoid PNGFAPI\npng_set_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_fixed_point int_red_X, png_fixed_point int_red_Y,\n    png_fixed_point int_red_Z, png_fixed_point int_green_X,\n    png_fixed_point int_green_Y, png_fixed_point int_green_Z,\n    png_fixed_point int_blue_X, png_fixed_point int_blue_Y,\n    png_fixed_point int_blue_Z)\n{\n   png_XYZ XYZ;\n\n   png_debug1(1, \"in %s storage function\", \"cHRM XYZ fixed\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   XYZ.red_X = int_red_X;\n   XYZ.red_Y = int_red_Y;\n   XYZ.red_Z = int_red_Z;\n   XYZ.green_X = int_green_X;\n   XYZ.green_Y = int_green_Y;\n   XYZ.green_Z = int_green_Z;\n   XYZ.blue_X = int_blue_X;\n   XYZ.blue_Y = int_blue_Y;\n   XYZ.blue_Z = int_blue_Z;\n\n   if (png_colorspace_set_endpoints(png_ptr, &info_ptr->colorspace,\n       &XYZ, 2) != 0)\n      info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;\n\n   png_colorspace_sync_info(png_ptr, info_ptr);\n}\n\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\nvoid PNGAPI\npng_set_cHRM(png_const_structrp png_ptr, png_inforp info_ptr,\n    double white_x, double white_y, double red_x, double red_y,\n    double green_x, double green_y, double blue_x, double blue_y)\n{\n   png_set_cHRM_fixed(png_ptr, info_ptr,\n      png_fixed(png_ptr, white_x, \"cHRM White X\"),\n      png_fixed(png_ptr, white_y, \"cHRM White Y\"),\n      png_fixed(png_ptr, red_x, \"cHRM Red X\"),\n      png_fixed(png_ptr, red_y, \"cHRM Red Y\"),\n      png_fixed(png_ptr, green_x, \"cHRM Green X\"),\n      png_fixed(png_ptr, green_y, \"cHRM Green Y\"),\n      png_fixed(png_ptr, blue_x, \"cHRM Blue X\"),\n      png_fixed(png_ptr, blue_y, \"cHRM Blue Y\"));\n}\n\nvoid PNGAPI\npng_set_cHRM_XYZ(png_const_structrp png_ptr, png_inforp info_ptr, double red_X,\n    double red_Y, double red_Z, double green_X, double green_Y, double green_Z,\n    double blue_X, double blue_Y, double blue_Z)\n{\n   png_set_cHRM_XYZ_fixed(png_ptr, info_ptr,\n      png_fixed(png_ptr, red_X, \"cHRM Red X\"),\n      png_fixed(png_ptr, red_Y, \"cHRM Red Y\"),\n      png_fixed(png_ptr, red_Z, \"cHRM Red Z\"),\n      png_fixed(png_ptr, green_X, \"cHRM Green X\"),\n      png_fixed(png_ptr, green_Y, \"cHRM Green Y\"),\n      png_fixed(png_ptr, green_Z, \"cHRM Green Z\"),\n      png_fixed(png_ptr, blue_X, \"cHRM Blue X\"),\n      png_fixed(png_ptr, blue_Y, \"cHRM Blue Y\"),\n      png_fixed(png_ptr, blue_Z, \"cHRM Blue Z\"));\n}\n#  endif /* FLOATING_POINT */\n\n#endif /* cHRM */\n\n#ifdef PNG_gAMA_SUPPORTED\nvoid PNGFAPI\npng_set_gAMA_fixed(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_fixed_point file_gamma)\n{\n   png_debug1(1, \"in %s storage function\", \"gAMA\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   png_colorspace_set_gamma(png_ptr, &info_ptr->colorspace, file_gamma);\n   png_colorspace_sync_info(png_ptr, info_ptr);\n}\n\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\nvoid PNGAPI\npng_set_gAMA(png_const_structrp png_ptr, png_inforp info_ptr, double file_gamma)\n{\n   png_set_gAMA_fixed(png_ptr, info_ptr, png_fixed(png_ptr, file_gamma,\n       \"png_set_gAMA\"));\n}\n#  endif\n#endif\n\n#ifdef PNG_hIST_SUPPORTED\nvoid PNGAPI\npng_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_const_uint_16p hist)\n{\n   int i;\n\n   png_debug1(1, \"in %s storage function\", \"hIST\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   if (info_ptr->num_palette == 0 || info_ptr->num_palette\n       > PNG_MAX_PALETTE_LENGTH)\n   {\n      png_warning(png_ptr,\n          \"Invalid palette size, hIST allocation skipped\");\n\n      return;\n   }\n\n   png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0);\n\n   /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in\n    * version 1.2.1\n    */\n   info_ptr->hist = png_voidcast(png_uint_16p, png_malloc_warn(png_ptr,\n       PNG_MAX_PALETTE_LENGTH * (sizeof (png_uint_16))));\n\n   if (info_ptr->hist == NULL)\n   {\n      png_warning(png_ptr, \"Insufficient memory for hIST chunk data\");\n\n      return;\n   }\n\n   info_ptr->free_me |= PNG_FREE_HIST;\n\n   for (i = 0; i < info_ptr->num_palette; i++)\n      info_ptr->hist[i] = hist[i];\n\n   info_ptr->valid |= PNG_INFO_hIST;\n}\n#endif\n\nvoid PNGAPI\npng_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_uint_32 width, png_uint_32 height, int bit_depth,\n    int color_type, int interlace_type, int compression_type,\n    int filter_type)\n{\n   png_debug1(1, \"in %s storage function\", \"IHDR\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   info_ptr->width = width;\n   info_ptr->height = height;\n   info_ptr->bit_depth = (png_byte)bit_depth;\n   info_ptr->color_type = (png_byte)color_type;\n   info_ptr->compression_type = (png_byte)compression_type;\n   info_ptr->filter_type = (png_byte)filter_type;\n   info_ptr->interlace_type = (png_byte)interlace_type;\n\n   png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height,\n       info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,\n       info_ptr->compression_type, info_ptr->filter_type);\n\n   if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      info_ptr->channels = 1;\n\n   else if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)\n      info_ptr->channels = 3;\n\n   else\n      info_ptr->channels = 1;\n\n   if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)\n      info_ptr->channels++;\n\n   info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);\n\n   info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);\n}\n\n#ifdef PNG_oFFs_SUPPORTED\nvoid PNGAPI\npng_set_oFFs(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_int_32 offset_x, png_int_32 offset_y, int unit_type)\n{\n   png_debug1(1, \"in %s storage function\", \"oFFs\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   info_ptr->x_offset = offset_x;\n   info_ptr->y_offset = offset_y;\n   info_ptr->offset_unit_type = (png_byte)unit_type;\n   info_ptr->valid |= PNG_INFO_oFFs;\n}\n#endif\n\n#ifdef PNG_pCAL_SUPPORTED\nvoid PNGAPI\npng_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,\n    int nparams, png_const_charp units, png_charpp params)\n{\n   png_size_t length;\n   int i;\n\n   png_debug1(1, \"in %s storage function\", \"pCAL\");\n\n   if (png_ptr == NULL || info_ptr == NULL || purpose == NULL || units == NULL\n       || (nparams > 0 && params == NULL))\n      return;\n\n   length = strlen(purpose) + 1;\n   png_debug1(3, \"allocating purpose for info (%lu bytes)\",\n       (unsigned long)length);\n\n   /* TODO: validate format of calibration name and unit name */\n\n   /* Check that the type matches the specification. */\n   if (type < 0 || type > 3)\n      png_error(png_ptr, \"Invalid pCAL equation type\");\n\n   if (nparams < 0 || nparams > 255)\n      png_error(png_ptr, \"Invalid pCAL parameter count\");\n\n   /* Validate params[nparams] */\n   for (i=0; i<nparams; ++i)\n   {\n      if (params[i] == NULL ||\n          !png_check_fp_string(params[i], strlen(params[i])))\n         png_error(png_ptr, \"Invalid format for pCAL parameter\");\n   }\n\n   info_ptr->pcal_purpose = png_voidcast(png_charp,\n       png_malloc_warn(png_ptr, length));\n\n   if (info_ptr->pcal_purpose == NULL)\n   {\n      png_warning(png_ptr, \"Insufficient memory for pCAL purpose\");\n\n      return;\n   }\n\n   memcpy(info_ptr->pcal_purpose, purpose, length);\n\n   png_debug(3, \"storing X0, X1, type, and nparams in info\");\n   info_ptr->pcal_X0 = X0;\n   info_ptr->pcal_X1 = X1;\n   info_ptr->pcal_type = (png_byte)type;\n   info_ptr->pcal_nparams = (png_byte)nparams;\n\n   length = strlen(units) + 1;\n   png_debug1(3, \"allocating units for info (%lu bytes)\",\n     (unsigned long)length);\n\n   info_ptr->pcal_units = png_voidcast(png_charp,\n      png_malloc_warn(png_ptr, length));\n\n   if (info_ptr->pcal_units == NULL)\n   {\n      png_warning(png_ptr, \"Insufficient memory for pCAL units\");\n\n      return;\n   }\n\n   memcpy(info_ptr->pcal_units, units, length);\n\n   info_ptr->pcal_params = png_voidcast(png_charpp, png_malloc_warn(png_ptr,\n       (png_size_t)((nparams + 1) * (sizeof (png_charp)))));\n\n   if (info_ptr->pcal_params == NULL)\n   {\n      png_warning(png_ptr, \"Insufficient memory for pCAL params\");\n\n      return;\n   }\n\n   memset(info_ptr->pcal_params, 0, (nparams + 1) * (sizeof (png_charp)));\n\n   for (i = 0; i < nparams; i++)\n   {\n      length = strlen(params[i]) + 1;\n      png_debug2(3, \"allocating parameter %d for info (%lu bytes)\", i,\n          (unsigned long)length);\n\n      info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length);\n\n      if (info_ptr->pcal_params[i] == NULL)\n      {\n         png_warning(png_ptr, \"Insufficient memory for pCAL parameter\");\n\n         return;\n      }\n\n      memcpy(info_ptr->pcal_params[i], params[i], length);\n   }\n\n   info_ptr->valid |= PNG_INFO_pCAL;\n   info_ptr->free_me |= PNG_FREE_PCAL;\n}\n#endif\n\n#ifdef PNG_sCAL_SUPPORTED\nvoid PNGAPI\npng_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,\n    int unit, png_const_charp swidth, png_const_charp sheight)\n{\n   png_size_t lengthw = 0, lengthh = 0;\n\n   png_debug1(1, \"in %s storage function\", \"sCAL\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   /* Double check the unit (should never get here with an invalid\n    * unit unless this is an API call.)\n    */\n   if (unit != 1 && unit != 2)\n      png_error(png_ptr, \"Invalid sCAL unit\");\n\n   if (swidth == NULL || (lengthw = strlen(swidth)) == 0 ||\n       swidth[0] == 45 /* '-' */ || !png_check_fp_string(swidth, lengthw))\n      png_error(png_ptr, \"Invalid sCAL width\");\n\n   if (sheight == NULL || (lengthh = strlen(sheight)) == 0 ||\n       sheight[0] == 45 /* '-' */ || !png_check_fp_string(sheight, lengthh))\n      png_error(png_ptr, \"Invalid sCAL height\");\n\n   info_ptr->scal_unit = (png_byte)unit;\n\n   ++lengthw;\n\n   png_debug1(3, \"allocating unit for info (%u bytes)\", (unsigned int)lengthw);\n\n   info_ptr->scal_s_width = png_voidcast(png_charp,\n      png_malloc_warn(png_ptr, lengthw));\n\n   if (info_ptr->scal_s_width == NULL)\n   {\n      png_warning(png_ptr, \"Memory allocation failed while processing sCAL\");\n\n      return;\n   }\n\n   memcpy(info_ptr->scal_s_width, swidth, lengthw);\n\n   ++lengthh;\n\n   png_debug1(3, \"allocating unit for info (%u bytes)\", (unsigned int)lengthh);\n\n   info_ptr->scal_s_height = png_voidcast(png_charp,\n      png_malloc_warn(png_ptr, lengthh));\n\n   if (info_ptr->scal_s_height == NULL)\n   {\n      png_free (png_ptr, info_ptr->scal_s_width);\n      info_ptr->scal_s_width = NULL;\n\n      png_warning(png_ptr, \"Memory allocation failed while processing sCAL\");\n\n      return;\n   }\n\n   memcpy(info_ptr->scal_s_height, sheight, lengthh);\n\n   info_ptr->valid |= PNG_INFO_sCAL;\n   info_ptr->free_me |= PNG_FREE_SCAL;\n}\n\n#  ifdef PNG_FLOATING_POINT_SUPPORTED\nvoid PNGAPI\npng_set_sCAL(png_const_structrp png_ptr, png_inforp info_ptr, int unit,\n    double width, double height)\n{\n   png_debug1(1, \"in %s storage function\", \"sCAL\");\n\n   /* Check the arguments. */\n   if (width <= 0)\n      png_warning(png_ptr, \"Invalid sCAL width ignored\");\n\n   else if (height <= 0)\n      png_warning(png_ptr, \"Invalid sCAL height ignored\");\n\n   else\n   {\n      /* Convert 'width' and 'height' to ASCII. */\n      char swidth[PNG_sCAL_MAX_DIGITS+1];\n      char sheight[PNG_sCAL_MAX_DIGITS+1];\n\n      png_ascii_from_fp(png_ptr, swidth, (sizeof swidth), width,\n         PNG_sCAL_PRECISION);\n      png_ascii_from_fp(png_ptr, sheight, (sizeof sheight), height,\n         PNG_sCAL_PRECISION);\n\n      png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);\n   }\n}\n#  endif\n\n#  ifdef PNG_FIXED_POINT_SUPPORTED\nvoid PNGAPI\npng_set_sCAL_fixed(png_const_structrp png_ptr, png_inforp info_ptr, int unit,\n    png_fixed_point width, png_fixed_point height)\n{\n   png_debug1(1, \"in %s storage function\", \"sCAL\");\n\n   /* Check the arguments. */\n   if (width <= 0)\n      png_warning(png_ptr, \"Invalid sCAL width ignored\");\n\n   else if (height <= 0)\n      png_warning(png_ptr, \"Invalid sCAL height ignored\");\n\n   else\n   {\n      /* Convert 'width' and 'height' to ASCII. */\n      char swidth[PNG_sCAL_MAX_DIGITS+1];\n      char sheight[PNG_sCAL_MAX_DIGITS+1];\n\n      png_ascii_from_fixed(png_ptr, swidth, (sizeof swidth), width);\n      png_ascii_from_fixed(png_ptr, sheight, (sizeof sheight), height);\n\n      png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);\n   }\n}\n#  endif\n#endif\n\n#ifdef PNG_pHYs_SUPPORTED\nvoid PNGAPI\npng_set_pHYs(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_uint_32 res_x, png_uint_32 res_y, int unit_type)\n{\n   png_debug1(1, \"in %s storage function\", \"pHYs\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   info_ptr->x_pixels_per_unit = res_x;\n   info_ptr->y_pixels_per_unit = res_y;\n   info_ptr->phys_unit_type = (png_byte)unit_type;\n   info_ptr->valid |= PNG_INFO_pHYs;\n}\n#endif\n\nvoid PNGAPI\npng_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,\n    png_const_colorp palette, int num_palette)\n{\n\n   png_uint_32 max_palette_length;\n\n   png_debug1(1, \"in %s storage function\", \"PLTE\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   max_palette_length = (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?\n      (1 << info_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;\n\n   if (num_palette < 0 || num_palette > (int) max_palette_length)\n   {\n      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n         png_error(png_ptr, \"Invalid palette length\");\n\n      else\n      {\n         png_warning(png_ptr, \"Invalid palette length\");\n\n         return;\n      }\n   }\n\n   if ((num_palette > 0 && palette == NULL) ||\n      (num_palette == 0\n#        ifdef PNG_MNG_FEATURES_SUPPORTED\n            && (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0\n#        endif\n      ))\n   {\n      png_error(png_ptr, \"Invalid palette\");\n   }\n\n   /* It may not actually be necessary to set png_ptr->palette here;\n    * we do it for backward compatibility with the way the png_handle_tRNS\n    * function used to do the allocation.\n    *\n    * 1.6.0: the above statement appears to be incorrect; something has to set\n    * the palette inside png_struct on read.\n    */\n   png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);\n\n   /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead\n    * of num_palette entries, in case of an invalid PNG file or incorrect\n    * call to png_set_PLTE() with too-large sample values.\n    */\n   png_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr,\n       PNG_MAX_PALETTE_LENGTH * (sizeof (png_color))));\n\n   if (num_palette > 0)\n      memcpy(png_ptr->palette, palette, num_palette * (sizeof (png_color)));\n   info_ptr->palette = png_ptr->palette;\n   info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;\n\n   info_ptr->free_me |= PNG_FREE_PLTE;\n\n   info_ptr->valid |= PNG_INFO_PLTE;\n}\n\n#ifdef PNG_sBIT_SUPPORTED\nvoid PNGAPI\npng_set_sBIT(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_const_color_8p sig_bit)\n{\n   png_debug1(1, \"in %s storage function\", \"sBIT\");\n\n   if (png_ptr == NULL || info_ptr == NULL || sig_bit == NULL)\n      return;\n\n   info_ptr->sig_bit = *sig_bit;\n   info_ptr->valid |= PNG_INFO_sBIT;\n}\n#endif\n\n#ifdef PNG_sRGB_SUPPORTED\nvoid PNGAPI\npng_set_sRGB(png_const_structrp png_ptr, png_inforp info_ptr, int srgb_intent)\n{\n   png_debug1(1, \"in %s storage function\", \"sRGB\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   (void)png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace, srgb_intent);\n   png_colorspace_sync_info(png_ptr, info_ptr);\n}\n\nvoid PNGAPI\npng_set_sRGB_gAMA_and_cHRM(png_const_structrp png_ptr, png_inforp info_ptr,\n    int srgb_intent)\n{\n   png_debug1(1, \"in %s storage function\", \"sRGB_gAMA_and_cHRM\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   if (png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace,\n       srgb_intent) != 0)\n   {\n      /* This causes the gAMA and cHRM to be written too */\n      info_ptr->colorspace.flags |=\n         PNG_COLORSPACE_FROM_gAMA|PNG_COLORSPACE_FROM_cHRM;\n   }\n\n   png_colorspace_sync_info(png_ptr, info_ptr);\n}\n#endif /* sRGB */\n\n\n#ifdef PNG_iCCP_SUPPORTED\nvoid PNGAPI\npng_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_const_charp name, int compression_type,\n    png_const_bytep profile, png_uint_32 proflen)\n{\n   png_charp new_iccp_name;\n   png_bytep new_iccp_profile;\n   png_size_t length;\n\n   png_debug1(1, \"in %s storage function\", \"iCCP\");\n\n   if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)\n      return;\n\n   if (compression_type != PNG_COMPRESSION_TYPE_BASE)\n      png_app_error(png_ptr, \"Invalid iCCP compression method\");\n\n   /* Set the colorspace first because this validates the profile; do not\n    * override previously set app cHRM or gAMA here (because likely as not the\n    * application knows better than libpng what the correct values are.)  Pass\n    * the info_ptr color_type field to png_colorspace_set_ICC because in the\n    * write case it has not yet been stored in png_ptr.\n    */\n   {\n      int result = png_colorspace_set_ICC(png_ptr, &info_ptr->colorspace, name,\n         proflen, profile, info_ptr->color_type);\n\n      png_colorspace_sync_info(png_ptr, info_ptr);\n\n      /* Don't do any of the copying if the profile was bad, or inconsistent. */\n      if (result == 0)\n         return;\n\n      /* But do write the gAMA and cHRM chunks from the profile. */\n      info_ptr->colorspace.flags |=\n         PNG_COLORSPACE_FROM_gAMA|PNG_COLORSPACE_FROM_cHRM;\n   }\n\n   length = strlen(name)+1;\n   new_iccp_name = png_voidcast(png_charp, png_malloc_warn(png_ptr, length));\n\n   if (new_iccp_name == NULL)\n   {\n      png_benign_error(png_ptr, \"Insufficient memory to process iCCP chunk\");\n\n      return;\n   }\n\n   memcpy(new_iccp_name, name, length);\n   new_iccp_profile = png_voidcast(png_bytep,\n      png_malloc_warn(png_ptr, proflen));\n\n   if (new_iccp_profile == NULL)\n   {\n      png_free(png_ptr, new_iccp_name);\n      png_benign_error(png_ptr,\n          \"Insufficient memory to process iCCP profile\");\n\n      return;\n   }\n\n   memcpy(new_iccp_profile, profile, proflen);\n\n   png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0);\n\n   info_ptr->iccp_proflen = proflen;\n   info_ptr->iccp_name = new_iccp_name;\n   info_ptr->iccp_profile = new_iccp_profile;\n   info_ptr->free_me |= PNG_FREE_ICCP;\n   info_ptr->valid |= PNG_INFO_iCCP;\n}\n#endif\n\n#ifdef PNG_TEXT_SUPPORTED\nvoid PNGAPI\npng_set_text(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_const_textp text_ptr, int num_text)\n{\n   int ret;\n   ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);\n\n   if (ret != 0)\n      png_error(png_ptr, \"Insufficient memory to store text\");\n}\n\nint /* PRIVATE */\npng_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_const_textp text_ptr, int num_text)\n{\n   int i;\n\n   png_debug1(1, \"in %lx storage function\", png_ptr == NULL ? 0xabadca11U :\n      (unsigned long)png_ptr->chunk_name);\n\n   if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL)\n      return(0);\n\n   /* Make sure we have enough space in the \"text\" array in info_struct\n    * to hold all of the incoming text_ptr objects.  This compare can't overflow\n    * because max_text >= num_text (anyway, subtract of two positive integers\n    * can't overflow in any case.)\n    */\n   if (num_text > info_ptr->max_text - info_ptr->num_text)\n   {\n      int old_num_text = info_ptr->num_text;\n      int max_text;\n      png_textp new_text = NULL;\n\n      /* Calculate an appropriate max_text, checking for overflow. */\n      max_text = old_num_text;\n      if (num_text <= INT_MAX - max_text)\n      {\n         max_text += num_text;\n\n         /* Round up to a multiple of 8 */\n         if (max_text < INT_MAX-8)\n            max_text = (max_text + 8) & ~0x7;\n\n         else\n            max_text = INT_MAX;\n\n         /* Now allocate a new array and copy the old members in; this does all\n          * the overflow checks.\n          */\n         new_text = png_voidcast(png_textp,png_realloc_array(png_ptr,\n            info_ptr->text, old_num_text, max_text-old_num_text,\n            sizeof *new_text));\n      }\n\n      if (new_text == NULL)\n      {\n         png_chunk_report(png_ptr, \"too many text chunks\",\n            PNG_CHUNK_WRITE_ERROR);\n\n         return 1;\n      }\n\n      png_free(png_ptr, info_ptr->text);\n\n      info_ptr->text = new_text;\n      info_ptr->free_me |= PNG_FREE_TEXT;\n      info_ptr->max_text = max_text;\n      /* num_text is adjusted below as the entries are copied in */\n\n      png_debug1(3, \"allocated %d entries for info_ptr->text\", max_text);\n   }\n\n   for (i = 0; i < num_text; i++)\n   {\n      size_t text_length, key_len;\n      size_t lang_len, lang_key_len;\n      png_textp textp = &(info_ptr->text[info_ptr->num_text]);\n\n      if (text_ptr[i].key == NULL)\n          continue;\n\n      if (text_ptr[i].compression < PNG_TEXT_COMPRESSION_NONE ||\n          text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST)\n      {\n         png_chunk_report(png_ptr, \"text compression mode is out of range\",\n            PNG_CHUNK_WRITE_ERROR);\n         continue;\n      }\n\n      key_len = strlen(text_ptr[i].key);\n\n      if (text_ptr[i].compression <= 0)\n      {\n         lang_len = 0;\n         lang_key_len = 0;\n      }\n\n      else\n#  ifdef PNG_iTXt_SUPPORTED\n      {\n         /* Set iTXt data */\n\n         if (text_ptr[i].lang != NULL)\n            lang_len = strlen(text_ptr[i].lang);\n\n         else\n            lang_len = 0;\n\n         if (text_ptr[i].lang_key != NULL)\n            lang_key_len = strlen(text_ptr[i].lang_key);\n\n         else\n            lang_key_len = 0;\n      }\n#  else /* iTXt */\n      {\n         png_chunk_report(png_ptr, \"iTXt chunk not supported\",\n            PNG_CHUNK_WRITE_ERROR);\n         continue;\n      }\n#  endif\n\n      if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\\0')\n      {\n         text_length = 0;\n#  ifdef PNG_iTXt_SUPPORTED\n         if (text_ptr[i].compression > 0)\n            textp->compression = PNG_ITXT_COMPRESSION_NONE;\n\n         else\n#  endif\n            textp->compression = PNG_TEXT_COMPRESSION_NONE;\n      }\n\n      else\n      {\n         text_length = strlen(text_ptr[i].text);\n         textp->compression = text_ptr[i].compression;\n      }\n\n      textp->key = png_voidcast(png_charp,png_malloc_base(png_ptr,\n          key_len + text_length + lang_len + lang_key_len + 4));\n\n      if (textp->key == NULL)\n      {\n         png_chunk_report(png_ptr, \"text chunk: out of memory\",\n               PNG_CHUNK_WRITE_ERROR);\n\n         return 1;\n      }\n\n      png_debug2(2, \"Allocated %lu bytes at %p in png_set_text\",\n          (unsigned long)(png_uint_32)\n          (key_len + lang_len + lang_key_len + text_length + 4),\n          textp->key);\n\n      memcpy(textp->key, text_ptr[i].key, key_len);\n      *(textp->key + key_len) = '\\0';\n\n      if (text_ptr[i].compression > 0)\n      {\n         textp->lang = textp->key + key_len + 1;\n         memcpy(textp->lang, text_ptr[i].lang, lang_len);\n         *(textp->lang + lang_len) = '\\0';\n         textp->lang_key = textp->lang + lang_len + 1;\n         memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);\n         *(textp->lang_key + lang_key_len) = '\\0';\n         textp->text = textp->lang_key + lang_key_len + 1;\n      }\n\n      else\n      {\n         textp->lang=NULL;\n         textp->lang_key=NULL;\n         textp->text = textp->key + key_len + 1;\n      }\n\n      if (text_length != 0)\n         memcpy(textp->text, text_ptr[i].text, text_length);\n\n      *(textp->text + text_length) = '\\0';\n\n#  ifdef PNG_iTXt_SUPPORTED\n      if (textp->compression > 0)\n      {\n         textp->text_length = 0;\n         textp->itxt_length = text_length;\n      }\n\n      else\n#  endif\n      {\n         textp->text_length = text_length;\n         textp->itxt_length = 0;\n      }\n\n      info_ptr->num_text++;\n      png_debug1(3, \"transferred text chunk %d\", info_ptr->num_text);\n   }\n\n   return(0);\n}\n#endif\n\n#ifdef PNG_tIME_SUPPORTED\nvoid PNGAPI\npng_set_tIME(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_const_timep mod_time)\n{\n   png_debug1(1, \"in %s storage function\", \"tIME\");\n\n   if (png_ptr == NULL || info_ptr == NULL || mod_time == NULL ||\n       (png_ptr->mode & PNG_WROTE_tIME) != 0)\n      return;\n\n   if (mod_time->month == 0   || mod_time->month > 12  ||\n       mod_time->day   == 0   || mod_time->day   > 31  ||\n       mod_time->hour  > 23   || mod_time->minute > 59 ||\n       mod_time->second > 60)\n   {\n      png_warning(png_ptr, \"Ignoring invalid time value\");\n\n      return;\n   }\n\n   info_ptr->mod_time = *mod_time;\n   info_ptr->valid |= PNG_INFO_tIME;\n}\n#endif\n\n#ifdef PNG_tRNS_SUPPORTED\nvoid PNGAPI\npng_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,\n    png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color)\n{\n   png_debug1(1, \"in %s storage function\", \"tRNS\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n\n      return;\n\n   if (trans_alpha != NULL)\n   {\n       /* It may not actually be necessary to set png_ptr->trans_alpha here;\n        * we do it for backward compatibility with the way the png_handle_tRNS\n        * function used to do the allocation.\n        *\n        * 1.6.0: The above statement is incorrect; png_handle_tRNS effectively\n        * relies on png_set_tRNS storing the information in png_struct\n        * (otherwise it won't be there for the code in pngrtran.c).\n        */\n\n       png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);\n\n       if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)\n       {\n         /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */\n          info_ptr->trans_alpha = png_voidcast(png_bytep,\n             png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));\n          memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);\n       }\n       png_ptr->trans_alpha = info_ptr->trans_alpha;\n   }\n\n   if (trans_color != NULL)\n   {\n#ifdef PNG_WARNINGS_SUPPORTED\n      if (info_ptr->bit_depth < 16)\n      {\n         int sample_max = (1 << info_ptr->bit_depth) - 1;\n\n         if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&\n             trans_color->gray > sample_max) ||\n             (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&\n             (trans_color->red > sample_max ||\n             trans_color->green > sample_max ||\n             trans_color->blue > sample_max)))\n            png_warning(png_ptr,\n               \"tRNS chunk has out-of-range samples for bit_depth\");\n      }\n#endif\n\n      info_ptr->trans_color = *trans_color;\n\n      if (num_trans == 0)\n         num_trans = 1;\n   }\n\n   info_ptr->num_trans = (png_uint_16)num_trans;\n\n   if (num_trans != 0)\n   {\n      info_ptr->valid |= PNG_INFO_tRNS;\n      info_ptr->free_me |= PNG_FREE_TRNS;\n   }\n}\n#endif\n\n#ifdef PNG_sPLT_SUPPORTED\nvoid PNGAPI\npng_set_sPLT(png_const_structrp png_ptr,\n    png_inforp info_ptr, png_const_sPLT_tp entries, int nentries)\n/*\n *  entries        - array of png_sPLT_t structures\n *                   to be added to the list of palettes\n *                   in the info structure.\n *\n *  nentries       - number of palette structures to be\n *                   added.\n */\n{\n   png_sPLT_tp np;\n\n   if (png_ptr == NULL || info_ptr == NULL || nentries <= 0 || entries == NULL)\n      return;\n\n   /* Use the internal realloc function, which checks for all the possible\n    * overflows.  Notice that the parameters are (int) and (size_t)\n    */\n   np = png_voidcast(png_sPLT_tp,png_realloc_array(png_ptr,\n      info_ptr->splt_palettes, info_ptr->splt_palettes_num, nentries,\n      sizeof *np));\n\n   if (np == NULL)\n   {\n      /* Out of memory or too many chunks */\n      png_chunk_report(png_ptr, \"too many sPLT chunks\", PNG_CHUNK_WRITE_ERROR);\n\n      return;\n   }\n\n   png_free(png_ptr, info_ptr->splt_palettes);\n   info_ptr->splt_palettes = np;\n   info_ptr->free_me |= PNG_FREE_SPLT;\n\n   np += info_ptr->splt_palettes_num;\n\n   do\n   {\n      png_size_t length;\n\n      /* Skip invalid input entries */\n      if (entries->name == NULL || entries->entries == NULL)\n      {\n         /* png_handle_sPLT doesn't do this, so this is an app error */\n         png_app_error(png_ptr, \"png_set_sPLT: invalid sPLT\");\n         /* Just skip the invalid entry */\n         continue;\n      }\n\n      np->depth = entries->depth;\n\n      /* In the event of out-of-memory just return - there's no point keeping\n       * on trying to add sPLT chunks.\n       */\n      length = strlen(entries->name) + 1;\n      np->name = png_voidcast(png_charp, png_malloc_base(png_ptr, length));\n\n      if (np->name == NULL)\n         break;\n\n      memcpy(np->name, entries->name, length);\n\n      /* IMPORTANT: we have memory now that won't get freed if something else\n       * goes wrong; this code must free it.  png_malloc_array produces no\n       * warnings; use a png_chunk_report (below) if there is an error.\n       */\n      np->entries = png_voidcast(png_sPLT_entryp, png_malloc_array(png_ptr,\n          entries->nentries, sizeof (png_sPLT_entry)));\n\n      if (np->entries == NULL)\n      {\n         png_free(png_ptr, np->name);\n         np->name = NULL;\n         break;\n      }\n\n      np->nentries = entries->nentries;\n      /* This multiply can't overflow because png_malloc_array has already\n       * checked it when doing the allocation.\n       */\n      memcpy(np->entries, entries->entries,\n         entries->nentries * sizeof (png_sPLT_entry));\n\n      /* Note that 'continue' skips the advance of the out pointer and out\n       * count, so an invalid entry is not added.\n       */\n      info_ptr->valid |= PNG_INFO_sPLT;\n      ++(info_ptr->splt_palettes_num);\n      ++np;\n   }\n   while (++entries, --nentries);\n\n   if (nentries > 0)\n      png_chunk_report(png_ptr, \"sPLT out of memory\", PNG_CHUNK_WRITE_ERROR);\n}\n#endif /* sPLT */\n\n#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\nstatic png_byte\ncheck_location(png_const_structrp png_ptr, int location)\n{\n   location &= (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT);\n\n   /* New in 1.6.0; copy the location and check it.  This is an API\n    * change; previously the app had to use the\n    * png_set_unknown_chunk_location API below for each chunk.\n    */\n   if (location == 0 && (png_ptr->mode & PNG_IS_READ_STRUCT) == 0)\n   {\n      /* Write struct, so unknown chunks come from the app */\n      png_app_warning(png_ptr,\n         \"png_set_unknown_chunks now expects a valid location\");\n      /* Use the old behavior */\n      location = (png_byte)(png_ptr->mode &\n         (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT));\n   }\n\n   /* This need not be an internal error - if the app calls\n    * png_set_unknown_chunks on a read pointer it must get the location right.\n    */\n   if (location == 0)\n      png_error(png_ptr, \"invalid location in png_set_unknown_chunks\");\n\n   /* Now reduce the location to the top-most set bit by removing each least\n    * significant bit in turn.\n    */\n   while (location != (location & -location))\n      location &= ~(location & -location);\n\n   /* The cast is safe because 'location' is a bit mask and only the low four\n    * bits are significant.\n    */\n   return (png_byte)location;\n}\n\nvoid PNGAPI\npng_set_unknown_chunks(png_const_structrp png_ptr,\n   png_inforp info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)\n{\n   png_unknown_chunkp np;\n\n   if (png_ptr == NULL || info_ptr == NULL || num_unknowns <= 0 ||\n       unknowns == NULL)\n      return;\n\n   /* Check for the failure cases where support has been disabled at compile\n    * time.  This code is hardly ever compiled - it's here because\n    * STORE_UNKNOWN_CHUNKS is set by both read and write code (compiling in this\n    * code) but may be meaningless if the read or write handling of unknown\n    * chunks is not compiled in.\n    */\n#  if !defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) && \\\n      defined(PNG_READ_SUPPORTED)\n      if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)\n      {\n         png_app_error(png_ptr, \"no unknown chunk support on read\");\n\n         return;\n      }\n#  endif\n#  if !defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) && \\\n      defined(PNG_WRITE_SUPPORTED)\n      if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)\n      {\n         png_app_error(png_ptr, \"no unknown chunk support on write\");\n\n         return;\n      }\n#  endif\n\n   /* Prior to 1.6.0 this code used png_malloc_warn; however, this meant that\n    * unknown critical chunks could be lost with just a warning resulting in\n    * undefined behavior.  Now png_chunk_report is used to provide behavior\n    * appropriate to read or write.\n    */\n   np = png_voidcast(png_unknown_chunkp, png_realloc_array(png_ptr,\n         info_ptr->unknown_chunks, info_ptr->unknown_chunks_num, num_unknowns,\n         sizeof *np));\n\n   if (np == NULL)\n   {\n      png_chunk_report(png_ptr, \"too many unknown chunks\",\n         PNG_CHUNK_WRITE_ERROR);\n\n      return;\n   }\n\n   png_free(png_ptr, info_ptr->unknown_chunks);\n   info_ptr->unknown_chunks = np; /* safe because it is initialized */\n   info_ptr->free_me |= PNG_FREE_UNKN;\n\n   np += info_ptr->unknown_chunks_num;\n\n   /* Increment unknown_chunks_num each time round the loop to protect the\n    * just-allocated chunk data.\n    */\n   for (; num_unknowns > 0; --num_unknowns, ++unknowns)\n   {\n      memcpy(np->name, unknowns->name, (sizeof np->name));\n      np->name[(sizeof np->name)-1] = '\\0';\n      np->location = check_location(png_ptr, unknowns->location);\n\n      if (unknowns->size == 0)\n      {\n         np->data = NULL;\n         np->size = 0;\n      }\n\n      else\n      {\n         np->data = png_voidcast(png_bytep,\n            png_malloc_base(png_ptr, unknowns->size));\n\n         if (np->data == NULL)\n         {\n            png_chunk_report(png_ptr, \"unknown chunk: out of memory\",\n               PNG_CHUNK_WRITE_ERROR);\n            /* But just skip storing the unknown chunk */\n            continue;\n         }\n\n         memcpy(np->data, unknowns->data, unknowns->size);\n         np->size = unknowns->size;\n      }\n\n      /* These increments are skipped on out-of-memory for the data - the\n       * unknown chunk entry gets overwritten if the png_chunk_report returns.\n       * This is correct in the read case (the chunk is just dropped.)\n       */\n      ++np;\n      ++(info_ptr->unknown_chunks_num);\n   }\n}\n\nvoid PNGAPI\npng_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr,\n    int chunk, int location)\n{\n   /* This API is pretty pointless in 1.6.0 because the location can be set\n    * before the call to png_set_unknown_chunks.\n    *\n    * TODO: add a png_app_warning in 1.7\n    */\n   if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 &&\n      chunk < info_ptr->unknown_chunks_num)\n   {\n      if ((location & (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT)) == 0)\n      {\n         png_app_error(png_ptr, \"invalid unknown chunk location\");\n         /* Fake out the pre 1.6.0 behavior: */\n         if ((location & PNG_HAVE_IDAT) != 0) /* undocumented! */\n            location = PNG_AFTER_IDAT;\n\n         else\n            location = PNG_HAVE_IHDR; /* also undocumented */\n      }\n\n      info_ptr->unknown_chunks[chunk].location =\n         check_location(png_ptr, location);\n   }\n}\n#endif /* STORE_UNKNOWN_CHUNKS */\n\n#ifdef PNG_MNG_FEATURES_SUPPORTED\npng_uint_32 PNGAPI\npng_permit_mng_features (png_structrp png_ptr, png_uint_32 mng_features)\n{\n   png_debug(1, \"in png_permit_mng_features\");\n\n   if (png_ptr == NULL)\n      return 0;\n\n   png_ptr->mng_features_permitted = mng_features & PNG_ALL_MNG_FEATURES;\n\n   return png_ptr->mng_features_permitted;\n}\n#endif\n\n#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED\nstatic unsigned int\nadd_one_chunk(png_bytep list, unsigned int count, png_const_bytep add, int keep)\n{\n   unsigned int i;\n\n   /* Utility function: update the 'keep' state of a chunk if it is already in\n    * the list, otherwise add it to the list.\n    */\n   for (i=0; i<count; ++i, list += 5)\n   {\n      if (memcmp(list, add, 4) == 0)\n      {\n         list[4] = (png_byte)keep;\n\n         return count;\n      }\n   }\n\n   if (keep != PNG_HANDLE_CHUNK_AS_DEFAULT)\n   {\n      ++count;\n      memcpy(list, add, 4);\n      list[4] = (png_byte)keep;\n   }\n\n   return count;\n}\n\nvoid PNGAPI\npng_set_keep_unknown_chunks(png_structrp png_ptr, int keep,\n    png_const_bytep chunk_list, int num_chunks_in)\n{\n   png_bytep new_list;\n   unsigned int num_chunks, old_num_chunks;\n\n   if (png_ptr == NULL)\n      return;\n\n   if (keep < 0 || keep >= PNG_HANDLE_CHUNK_LAST)\n   {\n      png_app_error(png_ptr, \"png_set_keep_unknown_chunks: invalid keep\");\n\n      return;\n   }\n\n   if (num_chunks_in <= 0)\n   {\n      png_ptr->unknown_default = keep;\n\n      /* '0' means just set the flags, so stop here */\n      if (num_chunks_in == 0)\n        return;\n   }\n\n   if (num_chunks_in < 0)\n   {\n      /* Ignore all unknown chunks and all chunks recognized by\n       * libpng except for IHDR, PLTE, tRNS, IDAT, and IEND\n       */\n      static PNG_CONST png_byte chunks_to_ignore[] = {\n         98,  75,  71,  68, '\\0',  /* bKGD */\n         99,  72,  82,  77, '\\0',  /* cHRM */\n        103,  65,  77,  65, '\\0',  /* gAMA */\n        104,  73,  83,  84, '\\0',  /* hIST */\n        105,  67,  67,  80, '\\0',  /* iCCP */\n        105,  84,  88, 116, '\\0',  /* iTXt */\n        111,  70,  70, 115, '\\0',  /* oFFs */\n        112,  67,  65,  76, '\\0',  /* pCAL */\n        112,  72,  89, 115, '\\0',  /* pHYs */\n        115,  66,  73,  84, '\\0',  /* sBIT */\n        115,  67,  65,  76, '\\0',  /* sCAL */\n        115,  80,  76,  84, '\\0',  /* sPLT */\n        115,  84,  69,  82, '\\0',  /* sTER */\n        115,  82,  71,  66, '\\0',  /* sRGB */\n        116,  69,  88, 116, '\\0',  /* tEXt */\n        116,  73,  77,  69, '\\0',  /* tIME */\n        122,  84,  88, 116, '\\0'   /* zTXt */\n      };\n\n      chunk_list = chunks_to_ignore;\n      num_chunks = (unsigned int)/*SAFE*/(sizeof chunks_to_ignore)/5U;\n   }\n\n   else /* num_chunks_in > 0 */\n   {\n      if (chunk_list == NULL)\n      {\n         /* Prior to 1.6.0 this was silently ignored, now it is an app_error\n          * which can be switched off.\n          */\n         png_app_error(png_ptr, \"png_set_keep_unknown_chunks: no chunk list\");\n\n         return;\n      }\n\n      num_chunks = num_chunks_in;\n   }\n\n   old_num_chunks = png_ptr->num_chunk_list;\n   if (png_ptr->chunk_list == NULL)\n      old_num_chunks = 0;\n\n   /* Since num_chunks is always restricted to UINT_MAX/5 this can't overflow.\n    */\n   if (num_chunks + old_num_chunks > UINT_MAX/5)\n   {\n      png_app_error(png_ptr, \"png_set_keep_unknown_chunks: too many chunks\");\n\n      return;\n   }\n\n   /* If these chunks are being reset to the default then no more memory is\n    * required because add_one_chunk above doesn't extend the list if the 'keep'\n    * parameter is the default.\n    */\n   if (keep != 0)\n   {\n      new_list = png_voidcast(png_bytep, png_malloc(png_ptr,\n          5 * (num_chunks + old_num_chunks)));\n\n      if (old_num_chunks > 0)\n         memcpy(new_list, png_ptr->chunk_list, 5*old_num_chunks);\n   }\n\n   else if (old_num_chunks > 0)\n      new_list = png_ptr->chunk_list;\n\n   else\n      new_list = NULL;\n\n   /* Add the new chunks together with each one's handling code.  If the chunk\n    * already exists the code is updated, otherwise the chunk is added to the\n    * end.  (In libpng 1.6.0 order no longer matters because this code enforces\n    * the earlier convention that the last setting is the one that is used.)\n    */\n   if (new_list != NULL)\n   {\n      png_const_bytep inlist;\n      png_bytep outlist;\n      unsigned int i;\n\n      for (i=0; i<num_chunks; ++i)\n      {\n         old_num_chunks = add_one_chunk(new_list, old_num_chunks,\n            chunk_list+5*i, keep);\n      }\n\n      /* Now remove any spurious 'default' entries. */\n      num_chunks = 0;\n      for (i=0, inlist=outlist=new_list; i<old_num_chunks; ++i, inlist += 5)\n      {\n         if (inlist[4])\n         {\n            if (outlist != inlist)\n               memcpy(outlist, inlist, 5);\n            outlist += 5;\n            ++num_chunks;\n         }\n      }\n\n      /* This means the application has removed all the specialized handling. */\n      if (num_chunks == 0)\n      {\n         if (png_ptr->chunk_list != new_list)\n            png_free(png_ptr, new_list);\n\n         new_list = NULL;\n      }\n   }\n\n   else\n      num_chunks = 0;\n\n   png_ptr->num_chunk_list = num_chunks;\n\n   if (png_ptr->chunk_list != new_list)\n   {\n      if (png_ptr->chunk_list != NULL)\n         png_free(png_ptr, png_ptr->chunk_list);\n\n      png_ptr->chunk_list = new_list;\n   }\n}\n#endif\n\n#ifdef PNG_READ_USER_CHUNKS_SUPPORTED\nvoid PNGAPI\npng_set_read_user_chunk_fn(png_structrp png_ptr, png_voidp user_chunk_ptr,\n    png_user_chunk_ptr read_user_chunk_fn)\n{\n   png_debug(1, \"in png_set_read_user_chunk_fn\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->read_user_chunk_fn = read_user_chunk_fn;\n   png_ptr->user_chunk_ptr = user_chunk_ptr;\n}\n#endif\n\n#ifdef PNG_INFO_IMAGE_SUPPORTED\nvoid PNGAPI\npng_set_rows(png_const_structrp png_ptr, png_inforp info_ptr,\n    png_bytepp row_pointers)\n{\n   png_debug1(1, \"in %s storage function\", \"rows\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   if (info_ptr->row_pointers != NULL &&\n       (info_ptr->row_pointers != row_pointers))\n      png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);\n\n   info_ptr->row_pointers = row_pointers;\n\n   if (row_pointers != NULL)\n      info_ptr->valid |= PNG_INFO_IDAT;\n}\n#endif\n\nvoid PNGAPI\npng_set_compression_buffer_size(png_structrp png_ptr, png_size_t size)\n{\n    if (png_ptr == NULL)\n       return;\n\n    if (size == 0 || size > PNG_UINT_31_MAX)\n       png_error(png_ptr, \"invalid compression buffer size\");\n\n#  ifdef PNG_SEQUENTIAL_READ_SUPPORTED\n      if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)\n      {\n         png_ptr->IDAT_read_size = (png_uint_32)size; /* checked above */\n         return;\n      }\n#  endif\n\n#  ifdef PNG_WRITE_SUPPORTED\n      if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)\n      {\n         if (png_ptr->zowner != 0)\n         {\n            png_warning(png_ptr,\n              \"Compression buffer size cannot be changed because it is in use\");\n\n            return;\n         }\n\n#ifndef __COVERITY__\n         /* Some compilers complain that this is always false.  However, it\n          * can be true when integer overflow happens.\n          */\n         if (size > ZLIB_IO_MAX)\n         {\n            png_warning(png_ptr,\n               \"Compression buffer size limited to system maximum\");\n            size = ZLIB_IO_MAX; /* must fit */\n         }\n#endif\n\n         if (size < 6)\n         {\n            /* Deflate will potentially go into an infinite loop on a SYNC_FLUSH\n             * if this is permitted.\n             */\n            png_warning(png_ptr,\n               \"Compression buffer size cannot be reduced below 6\");\n\n            return;\n         }\n\n         if (png_ptr->zbuffer_size != size)\n         {\n            png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);\n            png_ptr->zbuffer_size = (uInt)size;\n         }\n      }\n#  endif\n}\n\nvoid PNGAPI\npng_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask)\n{\n   if (png_ptr != NULL && info_ptr != NULL)\n      info_ptr->valid &= ~mask;\n}\n\n\n#ifdef PNG_SET_USER_LIMITS_SUPPORTED\n/* This function was added to libpng 1.2.6 */\nvoid PNGAPI\npng_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max,\n    png_uint_32 user_height_max)\n{\n   /* Images with dimensions larger than these limits will be\n    * rejected by png_set_IHDR().  To accept any PNG datastream\n    * regardless of dimensions, set both limits to 0x7fffffff.\n    */\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->user_width_max = user_width_max;\n   png_ptr->user_height_max = user_height_max;\n}\n\n/* This function was added to libpng 1.4.0 */\nvoid PNGAPI\npng_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max)\n{\n   if (png_ptr != NULL)\n      png_ptr->user_chunk_cache_max = user_chunk_cache_max;\n}\n\n/* This function was added to libpng 1.4.1 */\nvoid PNGAPI\npng_set_chunk_malloc_max (png_structrp png_ptr,\n    png_alloc_size_t user_chunk_malloc_max)\n{\n   if (png_ptr != NULL)\n      png_ptr->user_chunk_malloc_max = user_chunk_malloc_max;\n}\n#endif /* ?SET_USER_LIMITS */\n\n\n#ifdef PNG_BENIGN_ERRORS_SUPPORTED\nvoid PNGAPI\npng_set_benign_errors(png_structrp png_ptr, int allowed)\n{\n   png_debug(1, \"in png_set_benign_errors\");\n\n   /* If allowed is 1, png_benign_error() is treated as a warning.\n    *\n    * If allowed is 0, png_benign_error() is treated as an error (which\n    * is the default behavior if png_set_benign_errors() is not called).\n    */\n\n   if (allowed != 0)\n      png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN |\n         PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN;\n\n   else\n      png_ptr->flags &= ~(PNG_FLAG_BENIGN_ERRORS_WARN |\n         PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN);\n}\n#endif /* BENIGN_ERRORS */\n\n#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED\n   /* Whether to report invalid palette index; added at libng-1.5.10.\n    * It is possible for an indexed (color-type==3) PNG file to contain\n    * pixels with invalid (out-of-range) indexes if the PLTE chunk has\n    * fewer entries than the image's bit-depth would allow. We recover\n    * from this gracefully by filling any incomplete palette with zeros\n    * (opaque black).  By default, when this occurs libpng will issue\n    * a benign error.  This API can be used to override that behavior.\n    */\nvoid PNGAPI\npng_set_check_for_invalid_index(png_structrp png_ptr, int allowed)\n{\n   png_debug(1, \"in png_set_check_for_invalid_index\");\n\n   if (allowed > 0)\n      png_ptr->num_palette_max = 0;\n\n   else\n      png_ptr->num_palette_max = -1;\n}\n#endif\n\n#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) || \\\n    defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)\n/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,\n * and if invalid, correct the keyword rather than discarding the entire\n * chunk.  The PNG 1.0 specification requires keywords 1-79 characters in\n * length, forbids leading or trailing whitespace, multiple internal spaces,\n * and the non-break space (0x80) from ISO 8859-1.  Returns keyword length.\n *\n * The 'new_key' buffer must be 80 characters in size (for the keyword plus a\n * trailing '\\0').  If this routine returns 0 then there was no keyword, or a\n * valid one could not be generated, and the caller must png_error.\n */\npng_uint_32 /* PRIVATE */\npng_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)\n{\n   png_const_charp orig_key = key;\n   png_uint_32 key_len = 0;\n   int bad_character = 0;\n   int space = 1;\n\n   png_debug(1, \"in png_check_keyword\");\n\n   if (key == NULL)\n   {\n      *new_key = 0;\n      return 0;\n   }\n\n   while (*key && key_len < 79)\n   {\n      png_byte ch = (png_byte)*key++;\n\n      if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))\n         *new_key++ = ch, ++key_len, space = 0;\n\n      else if (space == 0)\n      {\n         /* A space or an invalid character when one wasn't seen immediately\n          * before; output just a space.\n          */\n         *new_key++ = 32, ++key_len, space = 1;\n\n         /* If the character was not a space then it is invalid. */\n         if (ch != 32)\n            bad_character = ch;\n      }\n\n      else if (bad_character == 0)\n         bad_character = ch; /* just skip it, record the first error */\n   }\n\n   if (key_len > 0 && space != 0) /* trailing space */\n   {\n      --key_len, --new_key;\n      if (bad_character == 0)\n         bad_character = 32;\n   }\n\n   /* Terminate the keyword */\n   *new_key = 0;\n\n   if (key_len == 0)\n      return 0;\n\n#ifdef PNG_WARNINGS_SUPPORTED\n   /* Try to only output one warning per keyword: */\n   if (*key != 0) /* keyword too long */\n      png_warning(png_ptr, \"keyword truncated\");\n\n   else if (bad_character != 0)\n   {\n      PNG_WARNING_PARAMETERS(p)\n\n      png_warning_parameter(p, 1, orig_key);\n      png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);\n\n      png_formatted_warning(png_ptr, p, \"keyword \\\"@1\\\": bad character '0x@2'\");\n   }\n#endif /* WARNINGS */\n\n   return key_len;\n}\n#endif /* TEXT || pCAL || iCCP || sPLT */\n#endif /* READ || WRITE */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngtest.c",
    "content": "\n/* pngtest.c - a simple test program to test libpng\n *\n * Last changed in libpng 1.5.25 [December 3, 2015]\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * This program reads in a PNG image, writes it out again, and then\n * compares the two files.  If the files are identical, this shows that\n * the basic chunk handling, filtering, and (de)compression code is working\n * properly.  It does not currently test all of the transforms, although\n * it probably should.\n *\n * The program will report \"FAIL\" in certain legitimate cases:\n * 1) when the compression level or filter selection method is changed.\n * 2) when the maximum IDAT size (PNG_ZBUF_SIZE in pngconf.h) is not 8192.\n * 3) unknown unsafe-to-copy ancillary chunks or unknown critical chunks\n *    exist in the input file.\n * 4) others not listed here...\n * In these cases, it is best to check with another tool such as \"pngcheck\"\n * to see what the differences between the two files are.\n *\n * If a filename is given on the command-line, then this file is used\n * for the input, rather than the default \"pngtest.png\".  This allows\n * testing a wide variety of files easily.  You can also test a number\n * of files at once by typing \"pngtest -m file1.png file2.png ...\"\n */\n\n#define _POSIX_SOURCE 1\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n/* Defined so I can write to a file on gui/windowing platforms */\n/*  #define STDERR stderr  */\n#define STDERR stdout   /* For DOS */\n\n#include \"png.h\"\n\n/* 1.6.1 added support for the configure test harness, which uses 77 to indicate\n * a skipped test, in earlier versions we need to succeed on a skipped test, so:\n */\n#if PNG_LIBPNG_VER >= 10601 && defined(HAVE_CONFIG_H)\n#  define SKIP 77\n#else\n#  define SKIP 0\n#endif\n\n/* Known chunks that exist in pngtest.png must be supported or pngtest will fail\n * simply as a result of re-ordering them.  This may be fixed in 1.7\n *\n * pngtest allocates a single row buffer for each row and overwrites it,\n * therefore if the write side doesn't support the writing of interlaced images\n * nothing can be done for an interlaced image (and the code below will fail\n * horribly trying to write extra data after writing garbage).\n */\n#if defined PNG_READ_SUPPORTED && /* else nothing can be done */\\\n   defined PNG_READ_bKGD_SUPPORTED &&\\\n   defined PNG_READ_cHRM_SUPPORTED &&\\\n   defined PNG_READ_gAMA_SUPPORTED &&\\\n   defined PNG_READ_oFFs_SUPPORTED &&\\\n   defined PNG_READ_pCAL_SUPPORTED &&\\\n   defined PNG_READ_pHYs_SUPPORTED &&\\\n   defined PNG_READ_sBIT_SUPPORTED &&\\\n   defined PNG_READ_sCAL_SUPPORTED &&\\\n   defined PNG_READ_sRGB_SUPPORTED &&\\\n   defined PNG_READ_sPLT_SUPPORTED &&\\\n   defined PNG_READ_tEXt_SUPPORTED &&\\\n   defined PNG_READ_tIME_SUPPORTED &&\\\n   defined PNG_READ_zTXt_SUPPORTED &&\\\n   (defined PNG_WRITE_INTERLACING_SUPPORTED || PNG_LIBPNG_VER >= 10700)\n\n#ifdef PNG_ZLIB_HEADER\n#  include PNG_ZLIB_HEADER /* defined by pnglibconf.h from 1.7 */\n#else\n#  include \"zlib.h\"\n#endif\n\n/* Copied from pngpriv.h but only used in error messages below. */\n#ifndef PNG_ZBUF_SIZE\n#  define PNG_ZBUF_SIZE 8192\n#endif\n#define FCLOSE(file) fclose(file)\n\n#ifndef PNG_STDIO_SUPPORTED\ntypedef FILE                * png_FILE_p;\n#endif\n\n/* Makes pngtest verbose so we can find problems. */\n#ifndef PNG_DEBUG\n#  define PNG_DEBUG 0\n#endif\n\n#if PNG_DEBUG > 1\n#  define pngtest_debug(m)        ((void)fprintf(stderr, m \"\\n\"))\n#  define pngtest_debug1(m,p1)    ((void)fprintf(stderr, m \"\\n\", p1))\n#  define pngtest_debug2(m,p1,p2) ((void)fprintf(stderr, m \"\\n\", p1, p2))\n#else\n#  define pngtest_debug(m)        ((void)0)\n#  define pngtest_debug1(m,p1)    ((void)0)\n#  define pngtest_debug2(m,p1,p2) ((void)0)\n#endif\n\n#if !PNG_DEBUG\n#  define SINGLE_ROWBUF_ALLOC  /* Makes buffer overruns easier to nail */\n#endif\n\n#ifndef PNG_UNUSED\n#  define PNG_UNUSED(param) (void)param;\n#endif\n\n/* Turn on CPU timing\n#define PNGTEST_TIMING\n*/\n\n#ifndef PNG_FLOATING_POINT_SUPPORTED\n#undef PNGTEST_TIMING\n#endif\n\n#ifdef PNGTEST_TIMING\nstatic float t_start, t_stop, t_decode, t_encode, t_misc;\n#include <time.h>\n#endif\n\n#ifdef PNG_TIME_RFC1123_SUPPORTED\n#define PNG_tIME_STRING_LENGTH 29\nstatic int tIME_chunk_present = 0;\nstatic char tIME_string[PNG_tIME_STRING_LENGTH] = \"tIME chunk is not present\";\n\n#if PNG_LIBPNG_VER < 10619\n#define png_convert_to_rfc1123_buffer(ts, t) tIME_to_str(read_ptr, ts, t)\n\nstatic int\ntIME_to_str(png_structp png_ptr, png_charp ts, png_const_timep t)\n{\n    png_const_charp str = png_convert_to_rfc1123(png_ptr, t);\n\n    if (str == NULL)\n        return 0;\n\n    strcpy(ts, str);\n    return 1;\n}\n#endif /* older libpng */\n#endif\n\nstatic int verbose = 0;\nstatic int strict = 0;\nstatic int relaxed = 0;\nstatic int unsupported_chunks = 0; /* chunk unsupported by libpng in input */\nstatic int error_count = 0; /* count calls to png_error */\nstatic int warning_count = 0; /* count calls to png_warning */\n\n/* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */\n#ifndef png_jmpbuf\n#  define png_jmpbuf(png_ptr) png_ptr->jmpbuf\n#endif\n\n/* Defines for unknown chunk handling if required. */\n#ifndef PNG_HANDLE_CHUNK_ALWAYS\n#  define PNG_HANDLE_CHUNK_ALWAYS       3\n#endif\n#ifndef PNG_HANDLE_CHUNK_IF_SAFE\n#  define PNG_HANDLE_CHUNK_IF_SAFE      2\n#endif\n\n/* Utility to save typing/errors, the argument must be a name */\n#define MEMZERO(var) ((void)memset(&var, 0, sizeof var))\n\n/* Example of using row callbacks to make a simple progress meter */\nstatic int status_pass = 1;\nstatic int status_dots_requested = 0;\nstatic int status_dots = 1;\n\nstatic void PNGCBAPI\nread_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)\n{\n   if (png_ptr == NULL || row_number > PNG_UINT_31_MAX)\n      return;\n\n   if (status_pass != pass)\n   {\n      fprintf(stdout, \"\\n Pass %d: \", pass);\n      status_pass = pass;\n      status_dots = 31;\n   }\n\n   status_dots--;\n\n   if (status_dots == 0)\n   {\n      fprintf(stdout, \"\\n         \");\n      status_dots=30;\n   }\n\n   fprintf(stdout, \"r\");\n}\n\n#ifdef PNG_WRITE_SUPPORTED\nstatic void PNGCBAPI\nwrite_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)\n{\n   if (png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7)\n      return;\n\n   fprintf(stdout, \"w\");\n}\n#endif\n\n\n#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED\n/* Example of using a user transform callback (doesn't do anything at present).\n */\nstatic void PNGCBAPI\nread_user_callback(png_structp png_ptr, png_row_infop row_info, png_bytep data)\n{\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(row_info)\n   PNG_UNUSED(data)\n}\n#endif\n\n#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED\n/* Example of using user transform callback (we don't transform anything,\n * but merely count the zero samples)\n */\n\nstatic png_uint_32 zero_samples;\n\nstatic void PNGCBAPI\ncount_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data)\n{\n   png_bytep dp = data;\n   if (png_ptr == NULL)\n      return;\n\n   /* Contents of row_info:\n    *  png_uint_32 width      width of row\n    *  png_uint_32 rowbytes   number of bytes in row\n    *  png_byte color_type    color type of pixels\n    *  png_byte bit_depth     bit depth of samples\n    *  png_byte channels      number of channels (1-4)\n    *  png_byte pixel_depth   bits per pixel (depth*channels)\n    */\n\n    /* Counts the number of zero samples (or zero pixels if color_type is 3 */\n\n    if (row_info->color_type == 0 || row_info->color_type == 3)\n    {\n       int pos = 0;\n       png_uint_32 n, nstop;\n\n       for (n = 0, nstop=row_info->width; n<nstop; n++)\n       {\n          if (row_info->bit_depth == 1)\n          {\n             if (((*dp << pos++ ) & 0x80) == 0)\n                zero_samples++;\n\n             if (pos == 8)\n             {\n                pos = 0;\n                dp++;\n             }\n          }\n\n          if (row_info->bit_depth == 2)\n          {\n             if (((*dp << (pos+=2)) & 0xc0) == 0)\n                zero_samples++;\n\n             if (pos == 8)\n             {\n                pos = 0;\n                dp++;\n             }\n          }\n\n          if (row_info->bit_depth == 4)\n          {\n             if (((*dp << (pos+=4)) & 0xf0) == 0)\n                zero_samples++;\n\n             if (pos == 8)\n             {\n                pos = 0;\n                dp++;\n             }\n          }\n\n          if (row_info->bit_depth == 8)\n             if (*dp++ == 0)\n                zero_samples++;\n\n          if (row_info->bit_depth == 16)\n          {\n             if ((*dp | *(dp+1)) == 0)\n                zero_samples++;\n             dp+=2;\n          }\n       }\n    }\n    else /* Other color types */\n    {\n       png_uint_32 n, nstop;\n       int channel;\n       int color_channels = row_info->channels;\n       if (row_info->color_type > 3)\n          color_channels--;\n\n       for (n = 0, nstop=row_info->width; n<nstop; n++)\n       {\n          for (channel = 0; channel < color_channels; channel++)\n          {\n             if (row_info->bit_depth == 8)\n                if (*dp++ == 0)\n                   zero_samples++;\n\n             if (row_info->bit_depth == 16)\n             {\n                if ((*dp | *(dp+1)) == 0)\n                   zero_samples++;\n\n                dp+=2;\n             }\n          }\n          if (row_info->color_type > 3)\n          {\n             dp++;\n             if (row_info->bit_depth == 16)\n                dp++;\n          }\n       }\n    }\n}\n#endif /* WRITE_USER_TRANSFORM */\n\n#ifndef PNG_STDIO_SUPPORTED\n/* START of code to validate stdio-free compilation */\n/* These copies of the default read/write functions come from pngrio.c and\n * pngwio.c.  They allow \"don't include stdio\" testing of the library.\n * This is the function that does the actual reading of data.  If you are\n * not reading from a standard C stream, you should create a replacement\n * read_data function and use it at run time with png_set_read_fn(), rather\n * than changing the library.\n */\n\n#ifdef PNG_IO_STATE_SUPPORTED\nvoid\npngtest_check_io_state(png_structp png_ptr, png_size_t data_length,\n   png_uint_32 io_op);\nvoid\npngtest_check_io_state(png_structp png_ptr, png_size_t data_length,\n   png_uint_32 io_op)\n{\n   png_uint_32 io_state = png_get_io_state(png_ptr);\n   int err = 0;\n\n   /* Check if the current operation (reading / writing) is as expected. */\n   if ((io_state & PNG_IO_MASK_OP) != io_op)\n      png_error(png_ptr, \"Incorrect operation in I/O state\");\n\n   /* Check if the buffer size specific to the current location\n    * (file signature / header / data / crc) is as expected.\n    */\n   switch (io_state & PNG_IO_MASK_LOC)\n   {\n   case PNG_IO_SIGNATURE:\n      if (data_length > 8)\n         err = 1;\n      break;\n   case PNG_IO_CHUNK_HDR:\n      if (data_length != 8)\n         err = 1;\n      break;\n   case PNG_IO_CHUNK_DATA:\n      break;  /* no restrictions here */\n   case PNG_IO_CHUNK_CRC:\n      if (data_length != 4)\n         err = 1;\n      break;\n   default:\n      err = 1;  /* uninitialized */\n   }\n   if (err != 0)\n      png_error(png_ptr, \"Bad I/O state or buffer size\");\n}\n#endif\n\nstatic void PNGCBAPI\npngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)\n{\n   png_size_t check = 0;\n   png_voidp io_ptr;\n\n   /* fread() returns 0 on error, so it is OK to store this in a png_size_t\n    * instead of an int, which is what fread() actually returns.\n    */\n   io_ptr = png_get_io_ptr(png_ptr);\n   if (io_ptr != NULL)\n   {\n      check = fread(data, 1, length, (png_FILE_p)io_ptr);\n   }\n\n   if (check != length)\n   {\n      png_error(png_ptr, \"Read Error\");\n   }\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   pngtest_check_io_state(png_ptr, length, PNG_IO_READING);\n#endif\n}\n\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\nstatic void PNGCBAPI\npngtest_flush(png_structp png_ptr)\n{\n   /* Do nothing; fflush() is said to be just a waste of energy. */\n   PNG_UNUSED(png_ptr)   /* Stifle compiler warning */\n}\n#endif\n\n/* This is the function that does the actual writing of data.  If you are\n * not writing to a standard C stream, you should create a replacement\n * write_data function and use it at run time with png_set_write_fn(), rather\n * than changing the library.\n */\nstatic void PNGCBAPI\npngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)\n{\n   png_size_t check;\n\n   check = fwrite(data, 1, length, (png_FILE_p)png_get_io_ptr(png_ptr));\n\n   if (check != length)\n   {\n      png_error(png_ptr, \"Write Error\");\n   }\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING);\n#endif\n}\n#endif /* !STDIO */\n\n/* This function is called when there is a warning, but the library thinks\n * it can continue anyway.  Replacement functions don't have to do anything\n * here if you don't want to.  In the default configuration, png_ptr is\n * not used, but it is passed in case it may be useful.\n */\ntypedef struct\n{\n   PNG_CONST char *file_name;\n}  pngtest_error_parameters;\n\nstatic void PNGCBAPI\npngtest_warning(png_structp png_ptr, png_const_charp message)\n{\n   PNG_CONST char *name = \"UNKNOWN (ERROR!)\";\n   pngtest_error_parameters *test =\n      (pngtest_error_parameters*)png_get_error_ptr(png_ptr);\n\n   ++warning_count;\n\n   if (test != NULL && test->file_name != NULL)\n      name = test->file_name;\n\n   fprintf(STDERR, \"%s: libpng warning: %s\\n\", name, message);\n}\n\n/* This is the default error handling function.  Note that replacements for\n * this function MUST NOT RETURN, or the program will likely crash.  This\n * function is used by default, or if the program supplies NULL for the\n * error function pointer in png_set_error_fn().\n */\nstatic void PNGCBAPI\npngtest_error(png_structp png_ptr, png_const_charp message)\n{\n   ++error_count;\n\n   pngtest_warning(png_ptr, message);\n   /* We can return because png_error calls the default handler, which is\n    * actually OK in this case.\n    */\n}\n\n/* END of code to validate stdio-free compilation */\n\n/* START of code to validate memory allocation and deallocation */\n#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG\n\n/* Allocate memory.  For reasonable files, size should never exceed\n * 64K.  However, zlib may allocate more than 64K if you don't tell\n * it not to.  See zconf.h and png.h for more information.  zlib does\n * need to allocate exactly 64K, so whatever you call here must\n * have the ability to do that.\n *\n * This piece of code can be compiled to validate max 64K allocations\n * by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K.\n */\ntypedef struct memory_information\n{\n   png_alloc_size_t          size;\n   png_voidp                 pointer;\n   struct memory_information *next;\n} memory_information;\ntypedef memory_information *memory_infop;\n\nstatic memory_infop pinformation = NULL;\nstatic int current_allocation = 0;\nstatic int maximum_allocation = 0;\nstatic int total_allocation = 0;\nstatic int num_allocations = 0;\n\npng_voidp PNGCBAPI png_debug_malloc PNGARG((png_structp png_ptr,\n    png_alloc_size_t size));\nvoid PNGCBAPI png_debug_free PNGARG((png_structp png_ptr, png_voidp ptr));\n\npng_voidp\nPNGCBAPI png_debug_malloc(png_structp png_ptr, png_alloc_size_t size)\n{\n\n   /* png_malloc has already tested for NULL; png_create_struct calls\n    * png_debug_malloc directly, with png_ptr == NULL which is OK\n    */\n\n   if (size == 0)\n      return (NULL);\n\n   /* This calls the library allocator twice, once to get the requested\n      buffer and once to get a new free list entry. */\n   {\n      /* Disable malloc_fn and free_fn */\n      memory_infop pinfo;\n      png_set_mem_fn(png_ptr, NULL, NULL, NULL);\n      pinfo = (memory_infop)png_malloc(png_ptr,\n         (sizeof *pinfo));\n      pinfo->size = size;\n      current_allocation += size;\n      total_allocation += size;\n      num_allocations ++;\n\n      if (current_allocation > maximum_allocation)\n         maximum_allocation = current_allocation;\n\n      pinfo->pointer = png_malloc(png_ptr, size);\n      /* Restore malloc_fn and free_fn */\n\n      png_set_mem_fn(png_ptr,\n          NULL, png_debug_malloc, png_debug_free);\n\n      if (size != 0 && pinfo->pointer == NULL)\n      {\n         current_allocation -= size;\n         total_allocation -= size;\n         png_error(png_ptr,\n           \"out of memory in pngtest->png_debug_malloc\");\n      }\n\n      pinfo->next = pinformation;\n      pinformation = pinfo;\n      /* Make sure the caller isn't assuming zeroed memory. */\n      memset(pinfo->pointer, 0xdd, pinfo->size);\n\n      if (verbose != 0)\n         printf(\"png_malloc %lu bytes at %p\\n\", (unsigned long)size,\n            pinfo->pointer);\n\n      return (png_voidp)(pinfo->pointer);\n   }\n}\n\n/* Free a pointer.  It is removed from the list at the same time. */\nvoid PNGCBAPI\npng_debug_free(png_structp png_ptr, png_voidp ptr)\n{\n   if (png_ptr == NULL)\n      fprintf(STDERR, \"NULL pointer to png_debug_free.\\n\");\n\n   if (ptr == 0)\n   {\n#if 0 /* This happens all the time. */\n      fprintf(STDERR, \"WARNING: freeing NULL pointer\\n\");\n#endif\n      return;\n   }\n\n   /* Unlink the element from the list. */\n   if (pinformation != NULL)\n   {\n      memory_infop *ppinfo = &pinformation;\n\n      for (;;)\n      {\n         memory_infop pinfo = *ppinfo;\n\n         if (pinfo->pointer == ptr)\n         {\n            *ppinfo = pinfo->next;\n            current_allocation -= pinfo->size;\n            if (current_allocation < 0)\n               fprintf(STDERR, \"Duplicate free of memory\\n\");\n            /* We must free the list element too, but first kill\n               the memory that is to be freed. */\n            memset(ptr, 0x55, pinfo->size);\n            free(pinfo);\n            pinfo = NULL;\n            break;\n         }\n\n         if (pinfo->next == NULL)\n         {\n            fprintf(STDERR, \"Pointer %p not found\\n\", ptr);\n            break;\n         }\n\n         ppinfo = &pinfo->next;\n      }\n   }\n\n   /* Finally free the data. */\n   if (verbose != 0)\n      printf(\"Freeing %p\\n\", ptr);\n\n   if (ptr != NULL)\n      free(ptr);\n   ptr = NULL;\n}\n#endif /* USER_MEM && DEBUG */\n/* END of code to test memory allocation/deallocation */\n\n\n#ifdef PNG_READ_USER_CHUNKS_SUPPORTED\n/* Demonstration of user chunk support of the sTER and vpAg chunks */\n\n/* (sTER is a public chunk not yet known by libpng.  vpAg is a private\nchunk used in ImageMagick to store \"virtual page\" size).  */\n\nstatic struct user_chunk_data\n{\n   png_const_infop info_ptr;\n   png_uint_32     vpAg_width, vpAg_height;\n   png_byte        vpAg_units;\n   png_byte        sTER_mode;\n   int             location[2];\n}\nuser_chunk_data;\n\n/* Used for location and order; zero means nothing. */\n#define have_sTER   0x01\n#define have_vpAg   0x02\n#define before_PLTE 0x10\n#define before_IDAT 0x20\n#define after_IDAT  0x40\n\nstatic void\ninit_callback_info(png_const_infop info_ptr)\n{\n   MEMZERO(user_chunk_data);\n   user_chunk_data.info_ptr = info_ptr;\n}\n\nstatic int\nset_location(png_structp png_ptr, struct user_chunk_data *data, int what)\n{\n   int location;\n\n   if ((data->location[0] & what) != 0 || (data->location[1] & what) != 0)\n      return 0; /* already have one of these */\n\n   /* Find where we are (the code below zeroes info_ptr to indicate that the\n    * chunks before the first IDAT have been read.)\n    */\n   if (data->info_ptr == NULL) /* after IDAT */\n      location = what | after_IDAT;\n\n   else if (png_get_valid(png_ptr, data->info_ptr, PNG_INFO_PLTE) != 0)\n      location = what | before_IDAT;\n\n   else\n      location = what | before_PLTE;\n\n   if (data->location[0] == 0)\n      data->location[0] = location;\n\n   else\n      data->location[1] = location;\n\n   return 1; /* handled */\n}\n\nstatic int PNGCBAPI\nread_user_chunk_callback(png_struct *png_ptr, png_unknown_chunkp chunk)\n{\n   struct user_chunk_data *my_user_chunk_data =\n      (struct user_chunk_data*)png_get_user_chunk_ptr(png_ptr);\n\n   if (my_user_chunk_data == NULL)\n      png_error(png_ptr, \"lost user chunk pointer\");\n\n   /* Return one of the following:\n    *    return (-n);  chunk had an error\n    *    return (0);  did not recognize\n    *    return (n);  success\n    *\n    * The unknown chunk structure contains the chunk data:\n    * png_byte name[5];\n    * png_byte *data;\n    * png_size_t size;\n    *\n    * Note that libpng has already taken care of the CRC handling.\n    */\n\n   if (chunk->name[0] == 115 && chunk->name[1] ==  84 &&     /* s  T */\n       chunk->name[2] ==  69 && chunk->name[3] ==  82)       /* E  R */\n      {\n         /* Found sTER chunk */\n         if (chunk->size != 1)\n            return (-1); /* Error return */\n\n         if (chunk->data[0] != 0 && chunk->data[0] != 1)\n            return (-1);  /* Invalid mode */\n\n         if (set_location(png_ptr, my_user_chunk_data, have_sTER) != 0)\n         {\n            my_user_chunk_data->sTER_mode=chunk->data[0];\n            return (1);\n         }\n\n         else\n            return (0); /* duplicate sTER - give it to libpng */\n      }\n\n   if (chunk->name[0] != 118 || chunk->name[1] != 112 ||    /* v  p */\n       chunk->name[2] !=  65 || chunk->name[3] != 103)      /* A  g */\n      return (0); /* Did not recognize */\n\n   /* Found ImageMagick vpAg chunk */\n\n   if (chunk->size != 9)\n      return (-1); /* Error return */\n\n   if (set_location(png_ptr, my_user_chunk_data, have_vpAg) == 0)\n      return (0);  /* duplicate vpAg */\n\n   my_user_chunk_data->vpAg_width = png_get_uint_31(png_ptr, chunk->data);\n   my_user_chunk_data->vpAg_height = png_get_uint_31(png_ptr, chunk->data + 4);\n   my_user_chunk_data->vpAg_units = chunk->data[8];\n\n   return (1);\n}\n\n#ifdef PNG_WRITE_SUPPORTED\nstatic void\nwrite_sTER_chunk(png_structp write_ptr)\n{\n   png_byte sTER[5] = {115,  84,  69,  82, '\\0'};\n\n   if (verbose != 0)\n      fprintf(STDERR, \"\\n stereo mode = %d\\n\", user_chunk_data.sTER_mode);\n\n   png_write_chunk(write_ptr, sTER, &user_chunk_data.sTER_mode, 1);\n}\n\nstatic void\nwrite_vpAg_chunk(png_structp write_ptr)\n{\n   png_byte vpAg[5] = {118, 112,  65, 103, '\\0'};\n\n   png_byte vpag_chunk_data[9];\n\n   if (verbose != 0)\n      fprintf(STDERR, \" vpAg = %lu x %lu, units = %d\\n\",\n        (unsigned long)user_chunk_data.vpAg_width,\n        (unsigned long)user_chunk_data.vpAg_height,\n        user_chunk_data.vpAg_units);\n\n   png_save_uint_32(vpag_chunk_data, user_chunk_data.vpAg_width);\n   png_save_uint_32(vpag_chunk_data + 4, user_chunk_data.vpAg_height);\n   vpag_chunk_data[8] = user_chunk_data.vpAg_units;\n   png_write_chunk(write_ptr, vpAg, vpag_chunk_data, 9);\n}\n\nstatic void\nwrite_chunks(png_structp write_ptr, int location)\n{\n   int i;\n\n   /* Notice that this preserves the original chunk order, however chunks\n    * intercepted by the callback will be written *after* chunks passed to\n    * libpng.  This will actually reverse a pair of sTER chunks or a pair of\n    * vpAg chunks, resulting in an error later.  This is not worth worrying\n    * about - the chunks should not be duplicated!\n    */\n   for (i=0; i<2; ++i)\n   {\n      if (user_chunk_data.location[i] == (location | have_sTER))\n         write_sTER_chunk(write_ptr);\n\n      else if (user_chunk_data.location[i] == (location | have_vpAg))\n         write_vpAg_chunk(write_ptr);\n   }\n}\n#endif /* WRITE */\n#else /* !READ_USER_CHUNKS */\n#  define write_chunks(pp,loc) ((void)0)\n#endif\n/* END of code to demonstrate user chunk support */\n\n/* START of code to check that libpng has the required text support; this only\n * checks for the write support because if read support is missing the chunk\n * will simply not be reported back to pngtest.\n */\n#ifdef PNG_TEXT_SUPPORTED\nstatic void\npngtest_check_text_support(png_structp png_ptr, png_textp text_ptr,\n   int num_text)\n{\n   while (num_text > 0)\n   {\n      switch (text_ptr[--num_text].compression)\n      {\n         case PNG_TEXT_COMPRESSION_NONE:\n            break;\n\n         case PNG_TEXT_COMPRESSION_zTXt:\n#           ifndef PNG_WRITE_zTXt_SUPPORTED\n               ++unsupported_chunks;\n               /* In libpng 1.7 this now does an app-error, so stop it: */\n               text_ptr[num_text].compression = PNG_TEXT_COMPRESSION_NONE;\n#           endif\n            break;\n\n         case PNG_ITXT_COMPRESSION_NONE:\n         case PNG_ITXT_COMPRESSION_zTXt:\n#           ifndef PNG_WRITE_iTXt_SUPPORTED\n               ++unsupported_chunks;\n               text_ptr[num_text].compression = PNG_TEXT_COMPRESSION_NONE;\n#           endif\n            break;\n\n         default:\n            /* This is an error */\n            png_error(png_ptr, \"invalid text chunk compression field\");\n            break;\n      }\n   }\n}\n#endif\n/* END of code to check that libpng has the required text support */\n\n/* Test one file */\nstatic int\ntest_one_file(PNG_CONST char *inname, PNG_CONST char *outname)\n{\n   static png_FILE_p fpin;\n   static png_FILE_p fpout;  /* \"static\" prevents setjmp corruption */\n   pngtest_error_parameters error_parameters;\n   png_structp read_ptr;\n   png_infop read_info_ptr, end_info_ptr;\n#ifdef PNG_WRITE_SUPPORTED\n   png_structp write_ptr;\n   png_infop write_info_ptr;\n   png_infop write_end_info_ptr;\n#ifdef PNG_WRITE_FILTER_SUPPORTED\n   int interlace_preserved = 1;\n#endif /* WRITE_FILTER */\n#else /* !WRITE */\n   png_structp write_ptr = NULL;\n   png_infop write_info_ptr = NULL;\n   png_infop write_end_info_ptr = NULL;\n#endif /* !WRITE */\n   png_bytep row_buf;\n   png_uint_32 y;\n   png_uint_32 width, height;\n   volatile int num_passes;\n   int pass;\n   int bit_depth, color_type;\n\n   row_buf = NULL;\n   error_parameters.file_name = inname;\n\n   if ((fpin = fopen(inname, \"rb\")) == NULL)\n   {\n      fprintf(STDERR, \"Could not find input file %s\\n\", inname);\n      return (1);\n   }\n\n   if ((fpout = fopen(outname, \"wb\")) == NULL)\n   {\n      fprintf(STDERR, \"Could not open output file %s\\n\", outname);\n      FCLOSE(fpin);\n      return (1);\n   }\n\n   pngtest_debug(\"Allocating read and write structures\");\n#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG\n   read_ptr =\n      png_create_read_struct_2(PNG_LIBPNG_VER_STRING, NULL,\n      NULL, NULL, NULL, png_debug_malloc, png_debug_free);\n#else\n   read_ptr =\n      png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n#endif\n   png_set_error_fn(read_ptr, &error_parameters, pngtest_error,\n      pngtest_warning);\n\n#ifdef PNG_WRITE_SUPPORTED\n#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG\n   write_ptr =\n      png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL,\n      NULL, NULL, NULL, png_debug_malloc, png_debug_free);\n#else\n   write_ptr =\n      png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n#endif\n   png_set_error_fn(write_ptr, &error_parameters, pngtest_error,\n      pngtest_warning);\n#endif\n   pngtest_debug(\"Allocating read_info, write_info and end_info structures\");\n   read_info_ptr = png_create_info_struct(read_ptr);\n   end_info_ptr = png_create_info_struct(read_ptr);\n#ifdef PNG_WRITE_SUPPORTED\n   write_info_ptr = png_create_info_struct(write_ptr);\n   write_end_info_ptr = png_create_info_struct(write_ptr);\n#endif\n\n#ifdef PNG_READ_USER_CHUNKS_SUPPORTED\n   init_callback_info(read_info_ptr);\n   png_set_read_user_chunk_fn(read_ptr, &user_chunk_data,\n     read_user_chunk_callback);\n#endif\n\n#ifdef PNG_SETJMP_SUPPORTED\n   pngtest_debug(\"Setting jmpbuf for read struct\");\n   if (setjmp(png_jmpbuf(read_ptr)))\n   {\n      fprintf(STDERR, \"%s -> %s: libpng read error\\n\", inname, outname);\n      png_free(read_ptr, row_buf);\n      row_buf = NULL;\n      png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);\n#ifdef PNG_WRITE_SUPPORTED\n      png_destroy_info_struct(write_ptr, &write_end_info_ptr);\n      png_destroy_write_struct(&write_ptr, &write_info_ptr);\n#endif\n      FCLOSE(fpin);\n      FCLOSE(fpout);\n      return (1);\n   }\n\n#ifdef PNG_WRITE_SUPPORTED\n   pngtest_debug(\"Setting jmpbuf for write struct\");\n\n   if (setjmp(png_jmpbuf(write_ptr)))\n   {\n      fprintf(STDERR, \"%s -> %s: libpng write error\\n\", inname, outname);\n      png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);\n      png_destroy_info_struct(write_ptr, &write_end_info_ptr);\n#ifdef PNG_WRITE_SUPPORTED\n      png_destroy_write_struct(&write_ptr, &write_info_ptr);\n#endif\n      FCLOSE(fpin);\n      FCLOSE(fpout);\n      return (1);\n   }\n#endif\n#endif\n\n   if (strict != 0)\n   {\n      /* Treat png_benign_error() as errors on read */\n      png_set_benign_errors(read_ptr, 0);\n\n#ifdef PNG_WRITE_SUPPORTED\n      /* Treat them as errors on write */\n      png_set_benign_errors(write_ptr, 0);\n#endif\n\n      /* if strict is not set, then app warnings and errors are treated as\n       * warnings in release builds, but not in unstable builds; this can be\n       * changed with '--relaxed'.\n       */\n   }\n\n   else if (relaxed != 0)\n   {\n      /* Allow application (pngtest) errors and warnings to pass */\n      png_set_benign_errors(read_ptr, 1);\n\n#ifdef PNG_WRITE_SUPPORTED\n      png_set_benign_errors(write_ptr, 1);\n#endif\n   }\n\n   pngtest_debug(\"Initializing input and output streams\");\n#ifdef PNG_STDIO_SUPPORTED\n   png_init_io(read_ptr, fpin);\n#  ifdef PNG_WRITE_SUPPORTED\n   png_init_io(write_ptr, fpout);\n#  endif\n#else\n   png_set_read_fn(read_ptr, (png_voidp)fpin, pngtest_read_data);\n#  ifdef PNG_WRITE_SUPPORTED\n   png_set_write_fn(write_ptr, (png_voidp)fpout,  pngtest_write_data,\n#    ifdef PNG_WRITE_FLUSH_SUPPORTED\n      pngtest_flush);\n#    else\n      NULL);\n#    endif\n#  endif\n#endif\n\n   if (status_dots_requested == 1)\n   {\n#ifdef PNG_WRITE_SUPPORTED\n      png_set_write_status_fn(write_ptr, write_row_callback);\n#endif\n      png_set_read_status_fn(read_ptr, read_row_callback);\n   }\n\n   else\n   {\n#ifdef PNG_WRITE_SUPPORTED\n      png_set_write_status_fn(write_ptr, NULL);\n#endif\n      png_set_read_status_fn(read_ptr, NULL);\n   }\n\n#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED\n   png_set_read_user_transform_fn(read_ptr, read_user_callback);\n#endif\n#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED\n   zero_samples = 0;\n   png_set_write_user_transform_fn(write_ptr, count_zero_samples);\n#endif\n\n#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n   /* Preserve all the unknown chunks, if possible.  If this is disabled then,\n    * even if the png_{get,set}_unknown_chunks stuff is enabled, we can't use\n    * libpng to *save* the unknown chunks on read (because we can't switch the\n    * save option on!)\n    *\n    * Notice that if SET_UNKNOWN_CHUNKS is *not* supported read will discard all\n    * unknown chunks and write will write them all.\n    */\n#ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED\n   png_set_keep_unknown_chunks(read_ptr, PNG_HANDLE_CHUNK_ALWAYS,\n      NULL, 0);\n#endif\n#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n   png_set_keep_unknown_chunks(write_ptr, PNG_HANDLE_CHUNK_ALWAYS,\n      NULL, 0);\n#endif\n#endif\n\n   pngtest_debug(\"Reading info struct\");\n   png_read_info(read_ptr, read_info_ptr);\n\n#ifdef PNG_READ_USER_CHUNKS_SUPPORTED\n   /* This is a bit of a hack; there is no obvious way in the callback function\n    * to determine that the chunks before the first IDAT have been read, so\n    * remove the info_ptr (which is only used to determine position relative to\n    * PLTE) here to indicate that we are after the IDAT.\n    */\n   user_chunk_data.info_ptr = NULL;\n#endif\n\n   pngtest_debug(\"Transferring info struct\");\n   {\n      int interlace_type, compression_type, filter_type;\n\n      if (png_get_IHDR(read_ptr, read_info_ptr, &width, &height, &bit_depth,\n          &color_type, &interlace_type, &compression_type, &filter_type) != 0)\n      {\n         png_set_IHDR(write_ptr, write_info_ptr, width, height, bit_depth,\n            color_type, interlace_type, compression_type, filter_type);\n         /* num_passes may not be available below if interlace support is not\n          * provided by libpng for both read and write.\n          */\n         switch (interlace_type)\n         {\n            case PNG_INTERLACE_NONE:\n               num_passes = 1;\n               break;\n\n            case PNG_INTERLACE_ADAM7:\n               num_passes = 7;\n               break;\n\n            default:\n               png_error(read_ptr, \"invalid interlace type\");\n               /*NOT REACHED*/\n         }\n      }\n\n      else\n         png_error(read_ptr, \"png_get_IHDR failed\");\n   }\n#ifdef PNG_FIXED_POINT_SUPPORTED\n#ifdef PNG_cHRM_SUPPORTED\n   {\n      png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x,\n         blue_y;\n\n      if (png_get_cHRM_fixed(read_ptr, read_info_ptr, &white_x, &white_y,\n         &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y) != 0)\n      {\n         png_set_cHRM_fixed(write_ptr, write_info_ptr, white_x, white_y, red_x,\n            red_y, green_x, green_y, blue_x, blue_y);\n      }\n   }\n#endif\n#ifdef PNG_gAMA_SUPPORTED\n   {\n      png_fixed_point gamma;\n\n      if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma) != 0)\n         png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma);\n   }\n#endif\n#else /* Use floating point versions */\n#ifdef PNG_FLOATING_POINT_SUPPORTED\n#ifdef PNG_cHRM_SUPPORTED\n   {\n      double white_x, white_y, red_x, red_y, green_x, green_y, blue_x,\n         blue_y;\n\n      if (png_get_cHRM(read_ptr, read_info_ptr, &white_x, &white_y, &red_x,\n         &red_y, &green_x, &green_y, &blue_x, &blue_y) != 0)\n      {\n         png_set_cHRM(write_ptr, write_info_ptr, white_x, white_y, red_x,\n            red_y, green_x, green_y, blue_x, blue_y);\n      }\n   }\n#endif\n#ifdef PNG_gAMA_SUPPORTED\n   {\n      double gamma;\n\n      if (png_get_gAMA(read_ptr, read_info_ptr, &gamma) != 0)\n         png_set_gAMA(write_ptr, write_info_ptr, gamma);\n   }\n#endif\n#endif /* Floating point */\n#endif /* Fixed point */\n#ifdef PNG_iCCP_SUPPORTED\n   {\n      png_charp name;\n      png_bytep profile;\n      png_uint_32 proflen;\n      int compression_type;\n\n      if (png_get_iCCP(read_ptr, read_info_ptr, &name, &compression_type,\n                      &profile, &proflen) != 0)\n      {\n         png_set_iCCP(write_ptr, write_info_ptr, name, compression_type,\n                      profile, proflen);\n      }\n   }\n#endif\n#ifdef PNG_sRGB_SUPPORTED\n   {\n      int intent;\n\n      if (png_get_sRGB(read_ptr, read_info_ptr, &intent) != 0)\n         png_set_sRGB(write_ptr, write_info_ptr, intent);\n   }\n#endif\n   {\n      png_colorp palette;\n      int num_palette;\n\n      if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette) != 0)\n         png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);\n   }\n#ifdef PNG_bKGD_SUPPORTED\n   {\n      png_color_16p background;\n\n      if (png_get_bKGD(read_ptr, read_info_ptr, &background) != 0)\n      {\n         png_set_bKGD(write_ptr, write_info_ptr, background);\n      }\n   }\n#endif\n#ifdef PNG_hIST_SUPPORTED\n   {\n      png_uint_16p hist;\n\n      if (png_get_hIST(read_ptr, read_info_ptr, &hist) != 0)\n         png_set_hIST(write_ptr, write_info_ptr, hist);\n   }\n#endif\n#ifdef PNG_oFFs_SUPPORTED\n   {\n      png_int_32 offset_x, offset_y;\n      int unit_type;\n\n      if (png_get_oFFs(read_ptr, read_info_ptr, &offset_x, &offset_y,\n          &unit_type) != 0)\n      {\n         png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type);\n      }\n   }\n#endif\n#ifdef PNG_pCAL_SUPPORTED\n   {\n      png_charp purpose, units;\n      png_charpp params;\n      png_int_32 X0, X1;\n      int type, nparams;\n\n      if (png_get_pCAL(read_ptr, read_info_ptr, &purpose, &X0, &X1, &type,\n         &nparams, &units, &params) != 0)\n      {\n         png_set_pCAL(write_ptr, write_info_ptr, purpose, X0, X1, type,\n            nparams, units, params);\n      }\n   }\n#endif\n#ifdef PNG_pHYs_SUPPORTED\n   {\n      png_uint_32 res_x, res_y;\n      int unit_type;\n\n      if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y,\n          &unit_type) != 0)\n         png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type);\n   }\n#endif\n#ifdef PNG_sBIT_SUPPORTED\n   {\n      png_color_8p sig_bit;\n\n      if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit) != 0)\n         png_set_sBIT(write_ptr, write_info_ptr, sig_bit);\n   }\n#endif\n#ifdef PNG_sCAL_SUPPORTED\n#if defined(PNG_FLOATING_POINT_SUPPORTED) && \\\n   defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)\n   {\n      int unit;\n      double scal_width, scal_height;\n\n      if (png_get_sCAL(read_ptr, read_info_ptr, &unit, &scal_width,\n         &scal_height) != 0)\n      {\n         png_set_sCAL(write_ptr, write_info_ptr, unit, scal_width, scal_height);\n      }\n   }\n#else\n#ifdef PNG_FIXED_POINT_SUPPORTED\n   {\n      int unit;\n      png_charp scal_width, scal_height;\n\n      if (png_get_sCAL_s(read_ptr, read_info_ptr, &unit, &scal_width,\n          &scal_height) != 0)\n      {\n         png_set_sCAL_s(write_ptr, write_info_ptr, unit, scal_width,\n             scal_height);\n      }\n   }\n#endif\n#endif\n#endif\n\n#ifdef PNG_sPLT_SUPPORTED\n   {\n       png_sPLT_tp entries;\n\n       int num_entries = (int) png_get_sPLT(read_ptr, read_info_ptr, &entries);\n       if (num_entries)\n       {\n           png_set_sPLT(write_ptr, write_info_ptr, entries, num_entries);\n       }\n   }\n#endif\n\n#ifdef PNG_TEXT_SUPPORTED\n   {\n      png_textp text_ptr;\n      int num_text;\n\n      if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0)\n      {\n         pngtest_debug1(\"Handling %d iTXt/tEXt/zTXt chunks\", num_text);\n\n         pngtest_check_text_support(read_ptr, text_ptr, num_text);\n\n         if (verbose != 0)\n         {\n            int i;\n\n            printf(\"\\n\");\n            for (i=0; i<num_text; i++)\n            {\n               printf(\"   Text compression[%d]=%d\\n\",\n                     i, text_ptr[i].compression);\n            }\n         }\n\n         png_set_text(write_ptr, write_info_ptr, text_ptr, num_text);\n      }\n   }\n#endif\n#ifdef PNG_tIME_SUPPORTED\n   {\n      png_timep mod_time;\n\n      if (png_get_tIME(read_ptr, read_info_ptr, &mod_time) != 0)\n      {\n         png_set_tIME(write_ptr, write_info_ptr, mod_time);\n#ifdef PNG_TIME_RFC1123_SUPPORTED\n         if (png_convert_to_rfc1123_buffer(tIME_string, mod_time) != 0)\n            tIME_string[(sizeof tIME_string) - 1] = '\\0';\n\n         else\n         {\n            strncpy(tIME_string, \"*** invalid time ***\", (sizeof tIME_string));\n            tIME_string[(sizeof tIME_string) - 1] = '\\0';\n         }\n\n         tIME_chunk_present++;\n#endif /* TIME_RFC1123 */\n      }\n   }\n#endif\n#ifdef PNG_tRNS_SUPPORTED\n   {\n      png_bytep trans_alpha;\n      int num_trans;\n      png_color_16p trans_color;\n\n      if (png_get_tRNS(read_ptr, read_info_ptr, &trans_alpha, &num_trans,\n         &trans_color) != 0)\n      {\n         int sample_max = (1 << bit_depth);\n         /* libpng doesn't reject a tRNS chunk with out-of-range samples */\n         if (!((color_type == PNG_COLOR_TYPE_GRAY &&\n             (int)trans_color->gray > sample_max) ||\n             (color_type == PNG_COLOR_TYPE_RGB &&\n             ((int)trans_color->red > sample_max ||\n             (int)trans_color->green > sample_max ||\n             (int)trans_color->blue > sample_max))))\n            png_set_tRNS(write_ptr, write_info_ptr, trans_alpha, num_trans,\n               trans_color);\n      }\n   }\n#endif\n#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n   {\n      png_unknown_chunkp unknowns;\n      int num_unknowns = png_get_unknown_chunks(read_ptr, read_info_ptr,\n         &unknowns);\n\n      if (num_unknowns != 0)\n      {\n         png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns,\n           num_unknowns);\n#if PNG_LIBPNG_VER < 10600\n         /* Copy the locations from the read_info_ptr.  The automatically\n          * generated locations in write_end_info_ptr are wrong prior to 1.6.0\n          * because they are reset from the write pointer (removed in 1.6.0).\n          */\n         {\n            int i;\n            for (i = 0; i < num_unknowns; i++)\n              png_set_unknown_chunk_location(write_ptr, write_info_ptr, i,\n                unknowns[i].location);\n         }\n#endif\n      }\n   }\n#endif\n\n#ifdef PNG_WRITE_SUPPORTED\n   pngtest_debug(\"Writing info struct\");\n\n   /* Write the info in two steps so that if we write the 'unknown' chunks here\n    * they go to the correct place.\n    */\n   png_write_info_before_PLTE(write_ptr, write_info_ptr);\n\n   write_chunks(write_ptr, before_PLTE); /* before PLTE */\n\n   png_write_info(write_ptr, write_info_ptr);\n\n   write_chunks(write_ptr, before_IDAT); /* after PLTE */\n#endif\n\n#ifdef SINGLE_ROWBUF_ALLOC\n   pngtest_debug(\"Allocating row buffer...\");\n   row_buf = (png_bytep)png_malloc(read_ptr,\n      png_get_rowbytes(read_ptr, read_info_ptr));\n\n   pngtest_debug1(\"\\t0x%08lx\", (unsigned long)row_buf);\n#endif /* SINGLE_ROWBUF_ALLOC */\n   pngtest_debug(\"Writing row data\");\n\n#if defined(PNG_READ_INTERLACING_SUPPORTED) &&\\\n   defined(PNG_WRITE_INTERLACING_SUPPORTED)\n   /* Both must be defined for libpng to be able to handle the interlace,\n    * otherwise it gets handled below by simply reading and writing the passes\n    * directly.\n    */\n   if (png_set_interlace_handling(read_ptr) != num_passes)\n      png_error(write_ptr,\n            \"png_set_interlace_handling(read): wrong pass count \");\n   if (png_set_interlace_handling(write_ptr) != num_passes)\n      png_error(write_ptr,\n            \"png_set_interlace_handling(write): wrong pass count \");\n#else /* png_set_interlace_handling not called on either read or write */\n#  define calc_pass_height\n#endif /* not using libpng interlace handling */\n\n#ifdef PNGTEST_TIMING\n   t_stop = (float)clock();\n   t_misc += (t_stop - t_start);\n   t_start = t_stop;\n#endif\n   for (pass = 0; pass < num_passes; pass++)\n   {\n#     ifdef calc_pass_height\n         png_uint_32 pass_height;\n\n         if (num_passes == 7) /* interlaced */\n         {\n            if (PNG_PASS_COLS(width, pass) > 0)\n               pass_height = PNG_PASS_ROWS(height, pass);\n\n            else\n               pass_height = 0;\n         }\n\n         else /* not interlaced */\n            pass_height = height;\n#     else\n#        define pass_height height\n#     endif\n\n      pngtest_debug1(\"Writing row data for pass %d\", pass);\n      for (y = 0; y < pass_height; y++)\n      {\n#ifndef SINGLE_ROWBUF_ALLOC\n         pngtest_debug2(\"Allocating row buffer (pass %d, y = %u)...\", pass, y);\n\n         row_buf = (png_bytep)png_malloc(read_ptr,\n            png_get_rowbytes(read_ptr, read_info_ptr));\n\n         pngtest_debug2(\"\\t0x%08lx (%lu bytes)\", (unsigned long)row_buf,\n            (unsigned long)png_get_rowbytes(read_ptr, read_info_ptr));\n\n#endif /* !SINGLE_ROWBUF_ALLOC */\n         png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1);\n\n#ifdef PNG_WRITE_SUPPORTED\n#ifdef PNGTEST_TIMING\n         t_stop = (float)clock();\n         t_decode += (t_stop - t_start);\n         t_start = t_stop;\n#endif\n         png_write_rows(write_ptr, (png_bytepp)&row_buf, 1);\n#ifdef PNGTEST_TIMING\n         t_stop = (float)clock();\n         t_encode += (t_stop - t_start);\n         t_start = t_stop;\n#endif\n#endif /* WRITE */\n\n#ifndef SINGLE_ROWBUF_ALLOC\n         pngtest_debug2(\"Freeing row buffer (pass %d, y = %u)\", pass, y);\n         png_free(read_ptr, row_buf);\n         row_buf = NULL;\n#endif /* !SINGLE_ROWBUF_ALLOC */\n      }\n   }\n\n#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\n#  ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED\n      png_free_data(read_ptr, read_info_ptr, PNG_FREE_UNKN, -1);\n#  endif\n#  ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n      png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1);\n#  endif\n#endif\n\n   pngtest_debug(\"Reading and writing end_info data\");\n\n   png_read_end(read_ptr, end_info_ptr);\n#ifdef PNG_TEXT_SUPPORTED\n   {\n      png_textp text_ptr;\n      int num_text;\n\n      if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0)\n      {\n         pngtest_debug1(\"Handling %d iTXt/tEXt/zTXt chunks\", num_text);\n\n         pngtest_check_text_support(read_ptr, text_ptr, num_text);\n\n         if (verbose != 0)\n         {\n            int i;\n\n            printf(\"\\n\");\n            for (i=0; i<num_text; i++)\n            {\n               printf(\"   Text compression[%d]=%d\\n\",\n                     i, text_ptr[i].compression);\n            }\n         }\n\n         png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text);\n      }\n   }\n#endif\n#ifdef PNG_tIME_SUPPORTED\n   {\n      png_timep mod_time;\n\n      if (png_get_tIME(read_ptr, end_info_ptr, &mod_time) != 0)\n      {\n         png_set_tIME(write_ptr, write_end_info_ptr, mod_time);\n#ifdef PNG_TIME_RFC1123_SUPPORTED\n         if (png_convert_to_rfc1123_buffer(tIME_string, mod_time) != 0)\n            tIME_string[(sizeof tIME_string) - 1] = '\\0';\n\n         else\n         {\n            strncpy(tIME_string, \"*** invalid time ***\", sizeof tIME_string);\n            tIME_string[(sizeof tIME_string)-1] = '\\0';\n         }\n\n         tIME_chunk_present++;\n#endif /* TIME_RFC1123 */\n      }\n   }\n#endif\n#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n   {\n      png_unknown_chunkp unknowns;\n      int num_unknowns = png_get_unknown_chunks(read_ptr, end_info_ptr,\n         &unknowns);\n\n      if (num_unknowns != 0)\n      {\n         png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns,\n           num_unknowns);\n#if PNG_LIBPNG_VER < 10600\n         /* Copy the locations from the read_info_ptr.  The automatically\n          * generated locations in write_end_info_ptr are wrong prior to 1.6.0\n          * because they are reset from the write pointer (removed in 1.6.0).\n          */\n         {\n            int i;\n            for (i = 0; i < num_unknowns; i++)\n              png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i,\n                unknowns[i].location);\n         }\n#endif\n      }\n   }\n#endif\n\n#ifdef PNG_WRITE_SUPPORTED\n#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED\n   /* Normally one would use Z_DEFAULT_STRATEGY for text compression.\n    * This is here just to make pngtest replicate the results from libpng\n    * versions prior to 1.5.4, and to test this new API.\n    */\n   png_set_text_compression_strategy(write_ptr, Z_FILTERED);\n#endif\n\n   /* When the unknown vpAg/sTER chunks are written by pngtest the only way to\n    * do it is to write them *before* calling png_write_end.  When unknown\n    * chunks are written by libpng, however, they are written just before IEND.\n    * There seems to be no way round this, however vpAg/sTER are not expected\n    * after IDAT.\n    */\n   write_chunks(write_ptr, after_IDAT);\n\n   png_write_end(write_ptr, write_end_info_ptr);\n#endif\n\n#ifdef PNG_EASY_ACCESS_SUPPORTED\n   if (verbose != 0)\n   {\n      png_uint_32 iwidth, iheight;\n      iwidth = png_get_image_width(write_ptr, write_info_ptr);\n      iheight = png_get_image_height(write_ptr, write_info_ptr);\n      fprintf(STDERR, \"\\n Image width = %lu, height = %lu\\n\",\n         (unsigned long)iwidth, (unsigned long)iheight);\n   }\n#endif\n\n   pngtest_debug(\"Destroying data structs\");\n#ifdef SINGLE_ROWBUF_ALLOC\n   pngtest_debug(\"destroying row_buf for read_ptr\");\n   png_free(read_ptr, row_buf);\n   row_buf = NULL;\n#endif /* SINGLE_ROWBUF_ALLOC */\n   pngtest_debug(\"destroying read_ptr, read_info_ptr, end_info_ptr\");\n   png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);\n#ifdef PNG_WRITE_SUPPORTED\n   pngtest_debug(\"destroying write_end_info_ptr\");\n   png_destroy_info_struct(write_ptr, &write_end_info_ptr);\n   pngtest_debug(\"destroying write_ptr, write_info_ptr\");\n   png_destroy_write_struct(&write_ptr, &write_info_ptr);\n#endif\n   pngtest_debug(\"Destruction complete.\");\n\n   FCLOSE(fpin);\n   FCLOSE(fpout);\n\n   /* Summarize any warnings or errors and in 'strict' mode fail the test.\n    * Unsupported chunks can result in warnings, in that case ignore the strict\n    * setting, otherwise fail the test on warnings as well as errors.\n    */\n   if (error_count > 0)\n   {\n      /* We don't really expect to get here because of the setjmp handling\n       * above, but this is safe.\n       */\n      fprintf(STDERR, \"\\n  %s: %d libpng errors found (%d warnings)\",\n         inname, error_count, warning_count);\n\n      if (strict != 0)\n         return (1);\n   }\n\n#  ifdef PNG_WRITE_SUPPORTED\n      /* If there is no write support nothing was written! */\n      else if (unsupported_chunks > 0)\n      {\n         fprintf(STDERR, \"\\n  %s: unsupported chunks (%d)%s\",\n            inname, unsupported_chunks, strict ? \": IGNORED --strict!\" : \"\");\n      }\n#  endif\n\n   else if (warning_count > 0)\n   {\n      fprintf(STDERR, \"\\n  %s: %d libpng warnings found\",\n         inname, warning_count);\n\n      if (strict != 0)\n         return (1);\n   }\n\n   pngtest_debug(\"Opening files for comparison\");\n   if ((fpin = fopen(inname, \"rb\")) == NULL)\n   {\n      fprintf(STDERR, \"Could not find file %s\\n\", inname);\n      return (1);\n   }\n\n   if ((fpout = fopen(outname, \"rb\")) == NULL)\n   {\n      fprintf(STDERR, \"Could not find file %s\\n\", outname);\n      FCLOSE(fpin);\n      return (1);\n   }\n\n#if defined (PNG_WRITE_SUPPORTED) /* else nothing was written */ &&\\\n    defined (PNG_WRITE_FILTER_SUPPORTED)\n   if (interlace_preserved != 0) /* else the files will be changed */\n   {\n      for (;;)\n      {\n         static int wrote_question = 0;\n         png_size_t num_in, num_out;\n         char inbuf[256], outbuf[256];\n\n         num_in = fread(inbuf, 1, sizeof inbuf, fpin);\n         num_out = fread(outbuf, 1, sizeof outbuf, fpout);\n\n         if (num_in != num_out)\n         {\n            fprintf(STDERR, \"\\nFiles %s and %s are of a different size\\n\",\n                    inname, outname);\n\n            if (wrote_question == 0 && unsupported_chunks == 0)\n            {\n               fprintf(STDERR,\n         \"   Was %s written with the same maximum IDAT chunk size (%d bytes),\",\n                 inname, PNG_ZBUF_SIZE);\n               fprintf(STDERR,\n                 \"\\n   filtering heuristic (libpng default), compression\");\n               fprintf(STDERR,\n                 \" level (zlib default),\\n   and zlib version (%s)?\\n\\n\",\n                 ZLIB_VERSION);\n               wrote_question = 1;\n            }\n\n            FCLOSE(fpin);\n            FCLOSE(fpout);\n\n            if (strict != 0 && unsupported_chunks == 0)\n              return (1);\n\n            else\n              return (0);\n         }\n\n         if (num_in == 0)\n            break;\n\n         if (memcmp(inbuf, outbuf, num_in))\n         {\n            fprintf(STDERR, \"\\nFiles %s and %s are different\\n\", inname,\n               outname);\n\n            if (wrote_question == 0 && unsupported_chunks == 0)\n            {\n               fprintf(STDERR,\n         \"   Was %s written with the same maximum IDAT chunk size (%d bytes),\",\n                    inname, PNG_ZBUF_SIZE);\n               fprintf(STDERR,\n                 \"\\n   filtering heuristic (libpng default), compression\");\n               fprintf(STDERR,\n                 \" level (zlib default),\\n   and zlib version (%s)?\\n\\n\",\n                 ZLIB_VERSION);\n               wrote_question = 1;\n            }\n\n            FCLOSE(fpin);\n            FCLOSE(fpout);\n\n            /* NOTE: the unsupported_chunks escape is permitted here because\n             * unsupported text chunk compression will result in the compression\n             * mode being changed (to NONE) yet, in the test case, the result\n             * can be exactly the same size!\n             */\n            if (strict != 0 && unsupported_chunks == 0)\n              return (1);\n\n            else\n              return (0);\n         }\n      }\n   }\n#endif /* WRITE && WRITE_FILTER */\n\n   FCLOSE(fpin);\n   FCLOSE(fpout);\n\n   return (0);\n}\n\n/* Input and output filenames */\n#ifdef RISCOS\nstatic PNG_CONST char *inname = \"pngtest/png\";\nstatic PNG_CONST char *outname = \"pngout/png\";\n#else\nstatic PNG_CONST char *inname = \"pngtest.png\";\nstatic PNG_CONST char *outname = \"pngout.png\";\n#endif\n\nint\nmain(int argc, char *argv[])\n{\n   int multiple = 0;\n   int ierror = 0;\n\n   png_structp dummy_ptr;\n\n   fprintf(STDERR, \"\\n Testing libpng version %s\\n\", PNG_LIBPNG_VER_STRING);\n   fprintf(STDERR, \"   with zlib   version %s\\n\", ZLIB_VERSION);\n   fprintf(STDERR, \"%s\", png_get_copyright(NULL));\n   /* Show the version of libpng used in building the library */\n   fprintf(STDERR, \" library (%lu):%s\",\n      (unsigned long)png_access_version_number(),\n      png_get_header_version(NULL));\n\n   /* Show the version of libpng used in building the application */\n   fprintf(STDERR, \" pngtest (%lu):%s\", (unsigned long)PNG_LIBPNG_VER,\n      PNG_HEADER_VERSION_STRING);\n\n   /* Do some consistency checking on the memory allocation settings, I'm\n    * not sure this matters, but it is nice to know, the first of these\n    * tests should be impossible because of the way the macros are set\n    * in pngconf.h\n    */\n#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)\n      fprintf(STDERR, \" NOTE: Zlib compiled for max 64k, libpng not\\n\");\n#endif\n   /* I think the following can happen. */\n#if !defined(MAXSEG_64K) && defined(PNG_MAX_MALLOC_64K)\n      fprintf(STDERR, \" NOTE: libpng compiled for max 64k, zlib not\\n\");\n#endif\n\n   if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING))\n   {\n      fprintf(STDERR,\n         \"Warning: versions are different between png.h and png.c\\n\");\n      fprintf(STDERR, \"  png.h version: %s\\n\", PNG_LIBPNG_VER_STRING);\n      fprintf(STDERR, \"  png.c version: %s\\n\\n\", png_libpng_ver);\n      ++ierror;\n   }\n\n   if (argc > 1)\n   {\n      if (strcmp(argv[1], \"-m\") == 0)\n      {\n         multiple = 1;\n         status_dots_requested = 0;\n      }\n\n      else if (strcmp(argv[1], \"-mv\") == 0 ||\n               strcmp(argv[1], \"-vm\") == 0 )\n      {\n         multiple = 1;\n         verbose = 1;\n         status_dots_requested = 1;\n      }\n\n      else if (strcmp(argv[1], \"-v\") == 0)\n      {\n         verbose = 1;\n         status_dots_requested = 1;\n         inname = argv[2];\n      }\n\n      else if (strcmp(argv[1], \"--strict\") == 0)\n      {\n         status_dots_requested = 0;\n         verbose = 1;\n         inname = argv[2];\n         strict++;\n         relaxed = 0;\n      }\n\n      else if (strcmp(argv[1], \"--relaxed\") == 0)\n      {\n         status_dots_requested = 0;\n         verbose = 1;\n         inname = argv[2];\n         strict = 0;\n         relaxed++;\n      }\n\n      else\n      {\n         inname = argv[1];\n         status_dots_requested = 0;\n      }\n   }\n\n   if (multiple == 0 && argc == 3 + verbose)\n     outname = argv[2 + verbose];\n\n   if ((multiple == 0 && argc > 3 + verbose) ||\n       (multiple != 0 && argc < 2))\n   {\n     fprintf(STDERR,\n       \"usage: %s [infile.png] [outfile.png]\\n\\t%s -m {infile.png}\\n\",\n        argv[0], argv[0]);\n     fprintf(STDERR,\n       \"  reads/writes one PNG file (without -m) or multiple files (-m)\\n\");\n     fprintf(STDERR,\n       \"  with -m %s is used as a temporary file\\n\", outname);\n     exit(1);\n   }\n\n   if (multiple != 0)\n   {\n      int i;\n#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG\n      int allocation_now = current_allocation;\n#endif\n      for (i=2; i<argc; ++i)\n      {\n         int kerror;\n         fprintf(STDERR, \"\\n Testing %s:\", argv[i]);\n#if PNG_DEBUG > 0\n         fprintf(STDERR, \"\\n\");\n#endif\n         kerror = test_one_file(argv[i], outname);\n         if (kerror == 0)\n         {\n#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED\n            fprintf(STDERR, \"\\n PASS (%lu zero samples)\\n\",\n               (unsigned long)zero_samples);\n#else\n            fprintf(STDERR, \" PASS\\n\");\n#endif\n#ifdef PNG_TIME_RFC1123_SUPPORTED\n            if (tIME_chunk_present != 0)\n               fprintf(STDERR, \" tIME = %s\\n\", tIME_string);\n\n            tIME_chunk_present = 0;\n#endif /* TIME_RFC1123 */\n         }\n\n         else\n         {\n            fprintf(STDERR, \" FAIL\\n\");\n            ierror += kerror;\n         }\n#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG\n         if (allocation_now != current_allocation)\n            fprintf(STDERR, \"MEMORY ERROR: %d bytes lost\\n\",\n               current_allocation - allocation_now);\n\n         if (current_allocation != 0)\n         {\n            memory_infop pinfo = pinformation;\n\n            fprintf(STDERR, \"MEMORY ERROR: %d bytes still allocated\\n\",\n               current_allocation);\n\n            while (pinfo != NULL)\n            {\n               fprintf(STDERR, \" %lu bytes at %p\\n\",\n                 (unsigned long)pinfo->size,\n                 pinfo->pointer);\n               pinfo = pinfo->next;\n            }\n         }\n#endif\n      }\n#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG\n         fprintf(STDERR, \" Current memory allocation: %10d bytes\\n\",\n            current_allocation);\n         fprintf(STDERR, \" Maximum memory allocation: %10d bytes\\n\",\n            maximum_allocation);\n         fprintf(STDERR, \" Total   memory allocation: %10d bytes\\n\",\n            total_allocation);\n         fprintf(STDERR, \"     Number of allocations: %10d\\n\",\n            num_allocations);\n#endif\n   }\n\n   else\n   {\n      int i;\n      for (i = 0; i<3; ++i)\n      {\n         int kerror;\n#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG\n         int allocation_now = current_allocation;\n#endif\n         if (i == 1)\n            status_dots_requested = 1;\n\n         else if (verbose == 0)\n            status_dots_requested = 0;\n\n         if (i == 0 || verbose == 1 || ierror != 0)\n         {\n            fprintf(STDERR, \"\\n Testing %s:\", inname);\n#if PNG_DEBUG > 0\n            fprintf(STDERR, \"\\n\");\n#endif\n         }\n\n         kerror = test_one_file(inname, outname);\n\n         if (kerror == 0)\n         {\n            if (verbose == 1 || i == 2)\n            {\n#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED\n                fprintf(STDERR, \"\\n PASS (%lu zero samples)\\n\",\n                   (unsigned long)zero_samples);\n#else\n                fprintf(STDERR, \" PASS\\n\");\n#endif\n#ifdef PNG_TIME_RFC1123_SUPPORTED\n             if (tIME_chunk_present != 0)\n                fprintf(STDERR, \" tIME = %s\\n\", tIME_string);\n#endif /* TIME_RFC1123 */\n            }\n         }\n\n         else\n         {\n            if (verbose == 0 && i != 2)\n            {\n               fprintf(STDERR, \"\\n Testing %s:\", inname);\n#if PNG_DEBUG > 0\n               fprintf(STDERR, \"\\n\");\n#endif\n            }\n\n            fprintf(STDERR, \" FAIL\\n\");\n            ierror += kerror;\n         }\n#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG\n         if (allocation_now != current_allocation)\n             fprintf(STDERR, \"MEMORY ERROR: %d bytes lost\\n\",\n               current_allocation - allocation_now);\n\n         if (current_allocation != 0)\n         {\n             memory_infop pinfo = pinformation;\n\n             fprintf(STDERR, \"MEMORY ERROR: %d bytes still allocated\\n\",\n                current_allocation);\n\n             while (pinfo != NULL)\n             {\n                fprintf(STDERR, \" %lu bytes at %p\\n\",\n                   (unsigned long)pinfo->size, pinfo->pointer);\n                pinfo = pinfo->next;\n             }\n          }\n#endif\n       }\n#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG\n       fprintf(STDERR, \" Current memory allocation: %10d bytes\\n\",\n          current_allocation);\n       fprintf(STDERR, \" Maximum memory allocation: %10d bytes\\n\",\n          maximum_allocation);\n       fprintf(STDERR, \" Total   memory allocation: %10d bytes\\n\",\n          total_allocation);\n       fprintf(STDERR, \"     Number of allocations: %10d\\n\",\n            num_allocations);\n#endif\n   }\n\n#ifdef PNGTEST_TIMING\n   t_stop = (float)clock();\n   t_misc += (t_stop - t_start);\n   t_start = t_stop;\n   fprintf(STDERR, \" CPU time used = %.3f seconds\",\n      (t_misc+t_decode+t_encode)/(float)CLOCKS_PER_SEC);\n   fprintf(STDERR, \" (decoding %.3f,\\n\",\n      t_decode/(float)CLOCKS_PER_SEC);\n   fprintf(STDERR, \"        encoding %.3f ,\",\n      t_encode/(float)CLOCKS_PER_SEC);\n   fprintf(STDERR, \" other %.3f seconds)\\n\\n\",\n      t_misc/(float)CLOCKS_PER_SEC);\n#endif\n\n   if (ierror == 0)\n      fprintf(STDERR, \" libpng passes test\\n\");\n\n   else\n      fprintf(STDERR, \" libpng FAILS test\\n\");\n\n   dummy_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n   fprintf(STDERR, \" Default limits:\\n\");\n   fprintf(STDERR, \"  width_max  = %lu\\n\",\n      (unsigned long) png_get_user_width_max(dummy_ptr));\n   fprintf(STDERR, \"  height_max = %lu\\n\",\n      (unsigned long) png_get_user_height_max(dummy_ptr));\n   if (png_get_chunk_cache_max(dummy_ptr) == 0)\n      fprintf(STDERR, \"  cache_max  = unlimited\\n\");\n   else\n      fprintf(STDERR, \"  cache_max  = %lu\\n\",\n         (unsigned long) png_get_chunk_cache_max(dummy_ptr));\n   if (png_get_chunk_malloc_max(dummy_ptr) == 0)\n      fprintf(STDERR, \"  malloc_max = unlimited\\n\");\n   else\n      fprintf(STDERR, \"  malloc_max = %lu\\n\",\n         (unsigned long) png_get_chunk_malloc_max(dummy_ptr));\n   png_destroy_read_struct(&dummy_ptr, NULL, NULL);\n\n   return (int)(ierror != 0);\n}\n#else\nint\nmain(void)\n{\n   fprintf(STDERR,\n      \" test ignored because libpng was not built with read support\\n\");\n   /* And skip this test */\n   return SKIP;\n}\n#endif\n\n/* Generate a compiler error if there is an old png.h in the search path. */\ntypedef png_libpng_version_1_6_23 Your_png_h_is_not_version_1_6_23;\n"
  },
  {
    "path": "libs/SDL2_png/src/pngtrans.c",
    "content": "\n/* pngtrans.c - transforms the data in a row (used by both readers and writers)\n *\n * Last changed in libpng 1.6.18 [July 23, 2015]\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n#include \"pngpriv.h\"\n\n#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)\n\n#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)\n/* Turn on BGR-to-RGB mapping */\nvoid PNGAPI\npng_set_bgr(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_bgr\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->transformations |= PNG_BGR;\n}\n#endif\n\n#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)\n/* Turn on 16-bit byte swapping */\nvoid PNGAPI\npng_set_swap(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_swap\");\n\n   if (png_ptr == NULL)\n      return;\n\n   if (png_ptr->bit_depth == 16)\n      png_ptr->transformations |= PNG_SWAP_BYTES;\n}\n#endif\n\n#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)\n/* Turn on pixel packing */\nvoid PNGAPI\npng_set_packing(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_packing\");\n\n   if (png_ptr == NULL)\n      return;\n\n   if (png_ptr->bit_depth < 8)\n   {\n      png_ptr->transformations |= PNG_PACK;\n#     ifdef PNG_WRITE_SUPPORTED\n         png_ptr->usr_bit_depth = 8;\n#     endif\n   }\n}\n#endif\n\n#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)\n/* Turn on packed pixel swapping */\nvoid PNGAPI\npng_set_packswap(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_packswap\");\n\n   if (png_ptr == NULL)\n      return;\n\n   if (png_ptr->bit_depth < 8)\n      png_ptr->transformations |= PNG_PACKSWAP;\n}\n#endif\n\n#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)\nvoid PNGAPI\npng_set_shift(png_structrp png_ptr, png_const_color_8p true_bits)\n{\n   png_debug(1, \"in png_set_shift\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->transformations |= PNG_SHIFT;\n   png_ptr->shift = *true_bits;\n}\n#endif\n\n#if defined(PNG_READ_INTERLACING_SUPPORTED) || \\\n    defined(PNG_WRITE_INTERLACING_SUPPORTED)\nint PNGAPI\npng_set_interlace_handling(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_interlace handling\");\n\n   if (png_ptr != 0 && png_ptr->interlaced != 0)\n   {\n      png_ptr->transformations |= PNG_INTERLACE;\n      return (7);\n   }\n\n   return (1);\n}\n#endif\n\n#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)\n/* Add a filler byte on read, or remove a filler or alpha byte on write.\n * The filler type has changed in v0.95 to allow future 2-byte fillers\n * for 48-bit input data, as well as to avoid problems with some compilers\n * that don't like bytes as parameters.\n */\nvoid PNGAPI\npng_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc)\n{\n   png_debug(1, \"in png_set_filler\");\n\n   if (png_ptr == NULL)\n      return;\n\n   /* In libpng 1.6 it is possible to determine whether this is a read or write\n    * operation and therefore to do more checking here for a valid call.\n    */\n   if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)\n   {\n#     ifdef PNG_READ_FILLER_SUPPORTED\n         /* On read png_set_filler is always valid, regardless of the base PNG\n          * format, because other transformations can give a format where the\n          * filler code can execute (basically an 8 or 16-bit component RGB or G\n          * format.)\n          *\n          * NOTE: usr_channels is not used by the read code!  (This has led to\n          * confusion in the past.)  The filler is only used in the read code.\n          */\n         png_ptr->filler = (png_uint_16)filler;\n#     else\n         png_app_error(png_ptr, \"png_set_filler not supported on read\");\n         PNG_UNUSED(filler) /* not used in the write case */\n         return;\n#     endif\n   }\n\n   else /* write */\n   {\n#     ifdef PNG_WRITE_FILLER_SUPPORTED\n         /* On write the usr_channels parameter must be set correctly at the\n          * start to record the number of channels in the app-supplied data.\n          */\n         switch (png_ptr->color_type)\n         {\n            case PNG_COLOR_TYPE_RGB:\n               png_ptr->usr_channels = 4;\n               break;\n\n            case PNG_COLOR_TYPE_GRAY:\n               if (png_ptr->bit_depth >= 8)\n               {\n                  png_ptr->usr_channels = 2;\n                  break;\n               }\n\n               else\n               {\n                  /* There simply isn't any code in libpng to strip out bits\n                   * from bytes when the components are less than a byte in\n                   * size!\n                   */\n                  png_app_error(png_ptr,\n                     \"png_set_filler is invalid for low bit depth gray output\");\n                  return;\n               }\n\n            default:\n               png_app_error(png_ptr,\n                  \"png_set_filler: inappropriate color type\");\n               return;\n         }\n#     else\n         png_app_error(png_ptr, \"png_set_filler not supported on write\");\n         return;\n#     endif\n   }\n\n   /* Here on success - libpng supports the operation, set the transformation\n    * and the flag to say where the filler channel is.\n    */\n   png_ptr->transformations |= PNG_FILLER;\n\n   if (filler_loc == PNG_FILLER_AFTER)\n      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;\n\n   else\n      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;\n}\n\n/* Added to libpng-1.2.7 */\nvoid PNGAPI\npng_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc)\n{\n   png_debug(1, \"in png_set_add_alpha\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_set_filler(png_ptr, filler, filler_loc);\n   /* The above may fail to do anything. */\n   if ((png_ptr->transformations & PNG_FILLER) != 0)\n      png_ptr->transformations |= PNG_ADD_ALPHA;\n}\n\n#endif\n\n#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \\\n    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)\nvoid PNGAPI\npng_set_swap_alpha(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_swap_alpha\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->transformations |= PNG_SWAP_ALPHA;\n}\n#endif\n\n#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \\\n    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)\nvoid PNGAPI\npng_set_invert_alpha(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_invert_alpha\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->transformations |= PNG_INVERT_ALPHA;\n}\n#endif\n\n#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)\nvoid PNGAPI\npng_set_invert_mono(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_set_invert_mono\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->transformations |= PNG_INVERT_MONO;\n}\n\n/* Invert monochrome grayscale data */\nvoid /* PRIVATE */\npng_do_invert(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_invert\");\n\n  /* This test removed from libpng version 1.0.13 and 1.2.0:\n   *   if (row_info->bit_depth == 1 &&\n   */\n   if (row_info->color_type == PNG_COLOR_TYPE_GRAY)\n   {\n      png_bytep rp = row;\n      png_size_t i;\n      png_size_t istop = row_info->rowbytes;\n\n      for (i = 0; i < istop; i++)\n      {\n         *rp = (png_byte)(~(*rp));\n         rp++;\n      }\n   }\n\n   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&\n      row_info->bit_depth == 8)\n   {\n      png_bytep rp = row;\n      png_size_t i;\n      png_size_t istop = row_info->rowbytes;\n\n      for (i = 0; i < istop; i += 2)\n      {\n         *rp = (png_byte)(~(*rp));\n         rp += 2;\n      }\n   }\n\n#ifdef PNG_16BIT_SUPPORTED\n   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&\n      row_info->bit_depth == 16)\n   {\n      png_bytep rp = row;\n      png_size_t i;\n      png_size_t istop = row_info->rowbytes;\n\n      for (i = 0; i < istop; i += 4)\n      {\n         *rp = (png_byte)(~(*rp));\n         *(rp + 1) = (png_byte)(~(*(rp + 1)));\n         rp += 4;\n      }\n   }\n#endif\n}\n#endif\n\n#ifdef PNG_16BIT_SUPPORTED\n#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)\n/* Swaps byte order on 16-bit depth images */\nvoid /* PRIVATE */\npng_do_swap(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_swap\");\n\n   if (row_info->bit_depth == 16)\n   {\n      png_bytep rp = row;\n      png_uint_32 i;\n      png_uint_32 istop= row_info->width * row_info->channels;\n\n      for (i = 0; i < istop; i++, rp += 2)\n      {\n#ifdef PNG_BUILTIN_BSWAP16_SUPPORTED\n         /* Feature added to libpng-1.6.11 for testing purposes, not\n          * enabled by default.\n          */\n         *(png_uint_16*)rp = __builtin_bswap16(*(png_uint_16*)rp);\n#else\n         png_byte t = *rp;\n         *rp = *(rp + 1);\n         *(rp + 1) = t;\n#endif\n      }\n   }\n}\n#endif\n#endif\n\n#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)\nstatic PNG_CONST png_byte onebppswaptable[256] = {\n   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,\n   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,\n   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,\n   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,\n   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,\n   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,\n   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,\n   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,\n   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,\n   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,\n   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,\n   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,\n   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,\n   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,\n   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,\n   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,\n   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,\n   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,\n   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,\n   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,\n   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,\n   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,\n   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,\n   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,\n   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,\n   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,\n   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,\n   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,\n   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,\n   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,\n   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,\n   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF\n};\n\nstatic PNG_CONST png_byte twobppswaptable[256] = {\n   0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,\n   0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,\n   0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,\n   0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,\n   0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,\n   0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,\n   0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,\n   0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,\n   0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,\n   0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,\n   0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,\n   0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,\n   0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,\n   0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,\n   0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,\n   0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,\n   0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,\n   0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,\n   0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,\n   0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,\n   0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,\n   0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,\n   0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,\n   0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,\n   0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,\n   0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,\n   0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,\n   0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,\n   0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,\n   0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,\n   0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,\n   0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF\n};\n\nstatic PNG_CONST png_byte fourbppswaptable[256] = {\n   0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,\n   0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,\n   0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,\n   0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,\n   0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,\n   0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,\n   0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,\n   0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,\n   0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,\n   0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,\n   0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,\n   0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,\n   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,\n   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,\n   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,\n   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,\n   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,\n   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,\n   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,\n   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,\n   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,\n   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,\n   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,\n   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,\n   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,\n   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,\n   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,\n   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,\n   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,\n   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,\n   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,\n   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF\n};\n\n/* Swaps pixel packing order within bytes */\nvoid /* PRIVATE */\npng_do_packswap(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_packswap\");\n\n   if (row_info->bit_depth < 8)\n   {\n      png_bytep rp;\n      png_const_bytep end, table;\n\n      end = row + row_info->rowbytes;\n\n      if (row_info->bit_depth == 1)\n         table = onebppswaptable;\n\n      else if (row_info->bit_depth == 2)\n         table = twobppswaptable;\n\n      else if (row_info->bit_depth == 4)\n         table = fourbppswaptable;\n\n      else\n         return;\n\n      for (rp = row; rp < end; rp++)\n         *rp = table[*rp];\n   }\n}\n#endif /* PACKSWAP || WRITE_PACKSWAP */\n\n#if defined(PNG_WRITE_FILLER_SUPPORTED) || \\\n    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)\n/* Remove a channel - this used to be 'png_do_strip_filler' but it used a\n * somewhat weird combination of flags to determine what to do.  All the calls\n * to png_do_strip_filler are changed in 1.5.2 to call this instead with the\n * correct arguments.\n *\n * The routine isn't general - the channel must be the channel at the start or\n * end (not in the middle) of each pixel.\n */\nvoid /* PRIVATE */\npng_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)\n{\n   png_bytep sp = row; /* source pointer */\n   png_bytep dp = row; /* destination pointer */\n   png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */\n\n   /* At the start sp will point to the first byte to copy and dp to where\n    * it is copied to.  ep always points just beyond the end of the row, so\n    * the loop simply copies (channels-1) channels until sp reaches ep.\n    *\n    * at_start:        0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc.\n    *            nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc.\n    */\n\n   /* GA, GX, XG cases */\n   if (row_info->channels == 2)\n   {\n      if (row_info->bit_depth == 8)\n      {\n         if (at_start != 0) /* Skip initial filler */\n            ++sp;\n         else          /* Skip initial channel and, for sp, the filler */\n            sp += 2, ++dp;\n\n         /* For a 1 pixel wide image there is nothing to do */\n         while (sp < ep)\n            *dp++ = *sp, sp += 2;\n\n         row_info->pixel_depth = 8;\n      }\n\n      else if (row_info->bit_depth == 16)\n      {\n         if (at_start != 0) /* Skip initial filler */\n            sp += 2;\n         else          /* Skip initial channel and, for sp, the filler */\n            sp += 4, dp += 2;\n\n         while (sp < ep)\n            *dp++ = *sp++, *dp++ = *sp, sp += 3;\n\n         row_info->pixel_depth = 16;\n      }\n\n      else\n         return; /* bad bit depth */\n\n      row_info->channels = 1;\n\n      /* Finally fix the color type if it records an alpha channel */\n      if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)\n         row_info->color_type = PNG_COLOR_TYPE_GRAY;\n   }\n\n   /* RGBA, RGBX, XRGB cases */\n   else if (row_info->channels == 4)\n   {\n      if (row_info->bit_depth == 8)\n      {\n         if (at_start != 0) /* Skip initial filler */\n            ++sp;\n         else          /* Skip initial channels and, for sp, the filler */\n            sp += 4, dp += 3;\n\n         /* Note that the loop adds 3 to dp and 4 to sp each time. */\n         while (sp < ep)\n            *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2;\n\n         row_info->pixel_depth = 24;\n      }\n\n      else if (row_info->bit_depth == 16)\n      {\n         if (at_start != 0) /* Skip initial filler */\n            sp += 2;\n         else          /* Skip initial channels and, for sp, the filler */\n            sp += 8, dp += 6;\n\n         while (sp < ep)\n         {\n            /* Copy 6 bytes, skip 2 */\n            *dp++ = *sp++, *dp++ = *sp++;\n            *dp++ = *sp++, *dp++ = *sp++;\n            *dp++ = *sp++, *dp++ = *sp, sp += 3;\n         }\n\n         row_info->pixel_depth = 48;\n      }\n\n      else\n         return; /* bad bit depth */\n\n      row_info->channels = 3;\n\n      /* Finally fix the color type if it records an alpha channel */\n      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n         row_info->color_type = PNG_COLOR_TYPE_RGB;\n   }\n\n   else\n      return; /* The filler channel has gone already */\n\n   /* Fix the rowbytes value. */\n   row_info->rowbytes = dp-row;\n}\n#endif\n\n#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)\n/* Swaps red and blue bytes within a pixel */\nvoid /* PRIVATE */\npng_do_bgr(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_bgr\");\n\n   if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)\n   {\n      png_uint_32 row_width = row_info->width;\n      if (row_info->bit_depth == 8)\n      {\n         if (row_info->color_type == PNG_COLOR_TYPE_RGB)\n         {\n            png_bytep rp;\n            png_uint_32 i;\n\n            for (i = 0, rp = row; i < row_width; i++, rp += 3)\n            {\n               png_byte save = *rp;\n               *rp = *(rp + 2);\n               *(rp + 2) = save;\n            }\n         }\n\n         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n         {\n            png_bytep rp;\n            png_uint_32 i;\n\n            for (i = 0, rp = row; i < row_width; i++, rp += 4)\n            {\n               png_byte save = *rp;\n               *rp = *(rp + 2);\n               *(rp + 2) = save;\n            }\n         }\n      }\n\n#ifdef PNG_16BIT_SUPPORTED\n      else if (row_info->bit_depth == 16)\n      {\n         if (row_info->color_type == PNG_COLOR_TYPE_RGB)\n         {\n            png_bytep rp;\n            png_uint_32 i;\n\n            for (i = 0, rp = row; i < row_width; i++, rp += 6)\n            {\n               png_byte save = *rp;\n               *rp = *(rp + 4);\n               *(rp + 4) = save;\n               save = *(rp + 1);\n               *(rp + 1) = *(rp + 5);\n               *(rp + 5) = save;\n            }\n         }\n\n         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n         {\n            png_bytep rp;\n            png_uint_32 i;\n\n            for (i = 0, rp = row; i < row_width; i++, rp += 8)\n            {\n               png_byte save = *rp;\n               *rp = *(rp + 4);\n               *(rp + 4) = save;\n               save = *(rp + 1);\n               *(rp + 1) = *(rp + 5);\n               *(rp + 5) = save;\n            }\n         }\n      }\n#endif\n   }\n}\n#endif /* READ_BGR || WRITE_BGR */\n\n#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \\\n    defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)\n/* Added at libpng-1.5.10 */\nvoid /* PRIVATE */\npng_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)\n{\n   if (png_ptr->num_palette < (1 << row_info->bit_depth) &&\n      png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */\n   {\n      /* Calculations moved outside switch in an attempt to stop different\n       * compiler warnings.  'padding' is in *bits* within the last byte, it is\n       * an 'int' because pixel_depth becomes an 'int' in the expression below,\n       * and this calculation is used because it avoids warnings that other\n       * forms produced on either GCC or MSVC.\n       */\n      int padding = (-row_info->pixel_depth * row_info->width) & 7;\n      png_bytep rp = png_ptr->row_buf + row_info->rowbytes;\n\n      switch (row_info->bit_depth)\n      {\n         case 1:\n         {\n            /* in this case, all bytes must be 0 so we don't need\n             * to unpack the pixels except for the rightmost one.\n             */\n            for (; rp > png_ptr->row_buf; rp--)\n            {\n              if ((*rp >> padding) != 0)\n                 png_ptr->num_palette_max = 1;\n              padding = 0;\n            }\n\n            break;\n         }\n\n         case 2:\n         {\n            for (; rp > png_ptr->row_buf; rp--)\n            {\n              int i = ((*rp >> padding) & 0x03);\n\n              if (i > png_ptr->num_palette_max)\n                 png_ptr->num_palette_max = i;\n\n              i = (((*rp >> padding) >> 2) & 0x03);\n\n              if (i > png_ptr->num_palette_max)\n                 png_ptr->num_palette_max = i;\n\n              i = (((*rp >> padding) >> 4) & 0x03);\n\n              if (i > png_ptr->num_palette_max)\n                 png_ptr->num_palette_max = i;\n\n              i = (((*rp >> padding) >> 6) & 0x03);\n\n              if (i > png_ptr->num_palette_max)\n                 png_ptr->num_palette_max = i;\n\n              padding = 0;\n            }\n\n            break;\n         }\n\n         case 4:\n         {\n            for (; rp > png_ptr->row_buf; rp--)\n            {\n              int i = ((*rp >> padding) & 0x0f);\n\n              if (i > png_ptr->num_palette_max)\n                 png_ptr->num_palette_max = i;\n\n              i = (((*rp >> padding) >> 4) & 0x0f);\n\n              if (i > png_ptr->num_palette_max)\n                 png_ptr->num_palette_max = i;\n\n              padding = 0;\n            }\n\n            break;\n         }\n\n         case 8:\n         {\n            for (; rp > png_ptr->row_buf; rp--)\n            {\n               if (*rp > png_ptr->num_palette_max)\n                  png_ptr->num_palette_max = (int) *rp;\n            }\n\n            break;\n         }\n\n         default:\n            break;\n      }\n   }\n}\n#endif /* CHECK_FOR_INVALID_INDEX */\n\n#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \\\n    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)\n#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED\nvoid PNGAPI\npng_set_user_transform_info(png_structrp png_ptr, png_voidp\n   user_transform_ptr, int user_transform_depth, int user_transform_channels)\n{\n   png_debug(1, \"in png_set_user_transform_info\");\n\n   if (png_ptr == NULL)\n      return;\n\n#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED\n   if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&\n      (png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)\n   {\n      png_app_error(png_ptr,\n            \"info change after png_start_read_image or png_read_update_info\");\n      return;\n   }\n#endif\n\n   png_ptr->user_transform_ptr = user_transform_ptr;\n   png_ptr->user_transform_depth = (png_byte)user_transform_depth;\n   png_ptr->user_transform_channels = (png_byte)user_transform_channels;\n}\n#endif\n\n/* This function returns a pointer to the user_transform_ptr associated with\n * the user transform functions.  The application should free any memory\n * associated with this pointer before png_write_destroy and png_read_destroy\n * are called.\n */\n#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED\npng_voidp PNGAPI\npng_get_user_transform_ptr(png_const_structrp png_ptr)\n{\n   if (png_ptr == NULL)\n      return (NULL);\n\n   return png_ptr->user_transform_ptr;\n}\n#endif\n\n#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED\npng_uint_32 PNGAPI\npng_get_current_row_number(png_const_structrp png_ptr)\n{\n   /* See the comments in png.h - this is the sub-image row when reading an\n    * interlaced image.\n    */\n   if (png_ptr != NULL)\n      return png_ptr->row_number;\n\n   return PNG_UINT_32_MAX; /* help the app not to fail silently */\n}\n\npng_byte PNGAPI\npng_get_current_pass_number(png_const_structrp png_ptr)\n{\n   if (png_ptr != NULL)\n      return png_ptr->pass;\n   return 8; /* invalid */\n}\n#endif /* USER_TRANSFORM_INFO */\n#endif /* READ_USER_TRANSFORM || WRITE_USER_TRANSFORM */\n#endif /* READ || WRITE */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngwio.c",
    "content": "\n/* pngwio.c - functions for data output\n *\n * Last changed in libpng 1.6.15 [November 20, 2014]\n * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n *\n * This file provides a location for all output.  Users who need\n * special handling are expected to write functions that have the same\n * arguments as these and perform similar functions, but that possibly\n * use different output methods.  Note that you shouldn't change these\n * functions, but rather write replacement functions and then change\n * them at run time with png_set_write_fn(...).\n */\n\n#include \"pngpriv.h\"\n\n#ifdef PNG_WRITE_SUPPORTED\n\n/* Write the data to whatever output you are using.  The default routine\n * writes to a file pointer.  Note that this routine sometimes gets called\n * with very small lengths, so you should implement some kind of simple\n * buffering if you are using unbuffered writes.  This should never be asked\n * to write more than 64K on a 16-bit machine.\n */\n\nvoid /* PRIVATE */\npng_write_data(png_structrp png_ptr, png_const_bytep data, png_size_t length)\n{\n   /* NOTE: write_data_fn must not change the buffer! */\n   if (png_ptr->write_data_fn != NULL )\n      (*(png_ptr->write_data_fn))(png_ptr, png_constcast(png_bytep,data),\n         length);\n\n   else\n      png_error(png_ptr, \"Call to NULL write function\");\n}\n\n#ifdef PNG_STDIO_SUPPORTED\n/* This is the function that does the actual writing of data.  If you are\n * not writing to a standard C stream, you should create a replacement\n * write_data function and use it at run time with png_set_write_fn(), rather\n * than changing the library.\n */\nvoid PNGCBAPI\npng_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)\n{\n   png_size_t check;\n\n   if (png_ptr == NULL)\n      return;\n\n   check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));\n\n   if (check != length)\n      png_error(png_ptr, \"Write Error\");\n}\n#endif\n\n/* This function is called to output any data pending writing (normally\n * to disk).  After png_flush is called, there should be no data pending\n * writing in any buffers.\n */\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\nvoid /* PRIVATE */\npng_flush(png_structrp png_ptr)\n{\n   if (png_ptr->output_flush_fn != NULL)\n      (*(png_ptr->output_flush_fn))(png_ptr);\n}\n\n#  ifdef PNG_STDIO_SUPPORTED\nvoid PNGCBAPI\npng_default_flush(png_structp png_ptr)\n{\n   png_FILE_p io_ptr;\n\n   if (png_ptr == NULL)\n      return;\n\n   io_ptr = png_voidcast(png_FILE_p, (png_ptr->io_ptr));\n   fflush(io_ptr);\n}\n#  endif\n#endif\n\n/* This function allows the application to supply new output functions for\n * libpng if standard C streams aren't being used.\n *\n * This function takes as its arguments:\n * png_ptr       - pointer to a png output data structure\n * io_ptr        - pointer to user supplied structure containing info about\n *                 the output functions.  May be NULL.\n * write_data_fn - pointer to a new output function that takes as its\n *                 arguments a pointer to a png_struct, a pointer to\n *                 data to be written, and a 32-bit unsigned int that is\n *                 the number of bytes to be written.  The new write\n *                 function should call png_error(png_ptr, \"Error msg\")\n *                 to exit and output any fatal error messages.  May be\n *                 NULL, in which case libpng's default function will\n *                 be used.\n * flush_data_fn - pointer to a new flush function that takes as its\n *                 arguments a pointer to a png_struct.  After a call to\n *                 the flush function, there should be no data in any buffers\n *                 or pending transmission.  If the output method doesn't do\n *                 any buffering of output, a function prototype must still be\n *                 supplied although it doesn't have to do anything.  If\n *                 PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile\n *                 time, output_flush_fn will be ignored, although it must be\n *                 supplied for compatibility.  May be NULL, in which case\n *                 libpng's default function will be used, if\n *                 PNG_WRITE_FLUSH_SUPPORTED is defined.  This is not\n *                 a good idea if io_ptr does not point to a standard\n *                 *FILE structure.\n */\nvoid PNGAPI\npng_set_write_fn(png_structrp png_ptr, png_voidp io_ptr,\n    png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)\n{\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->io_ptr = io_ptr;\n\n#ifdef PNG_STDIO_SUPPORTED\n   if (write_data_fn != NULL)\n      png_ptr->write_data_fn = write_data_fn;\n\n   else\n      png_ptr->write_data_fn = png_default_write_data;\n#else\n   png_ptr->write_data_fn = write_data_fn;\n#endif\n\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\n#  ifdef PNG_STDIO_SUPPORTED\n\n   if (output_flush_fn != NULL)\n      png_ptr->output_flush_fn = output_flush_fn;\n\n   else\n      png_ptr->output_flush_fn = png_default_flush;\n\n#  else\n   png_ptr->output_flush_fn = output_flush_fn;\n#  endif\n#else\n   PNG_UNUSED(output_flush_fn)\n#endif /* WRITE_FLUSH */\n\n#ifdef PNG_READ_SUPPORTED\n   /* It is an error to read while writing a png file */\n   if (png_ptr->read_data_fn != NULL)\n   {\n      png_ptr->read_data_fn = NULL;\n\n      png_warning(png_ptr,\n          \"Can't set both read_data_fn and write_data_fn in the\"\n          \" same structure\");\n   }\n#endif\n}\n#endif /* WRITE */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngwrite.c",
    "content": "\n/* pngwrite.c - general routines to write a PNG file\n *\n * Last changed in libpng 1.6.19 [November 12, 2015]\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n#include \"pngpriv.h\"\n#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED\n#  include <errno.h>\n#endif /* SIMPLIFIED_WRITE_STDIO */\n\n#ifdef PNG_WRITE_SUPPORTED\n\n#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n/* Write out all the unknown chunks for the current given location */\nstatic void\nwrite_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr,\n   unsigned int where)\n{\n   if (info_ptr->unknown_chunks_num != 0)\n   {\n      png_const_unknown_chunkp up;\n\n      png_debug(5, \"writing extra chunks\");\n\n      for (up = info_ptr->unknown_chunks;\n           up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;\n           ++up)\n         if ((up->location & where) != 0)\n      {\n         /* If per-chunk unknown chunk handling is enabled use it, otherwise\n          * just write the chunks the application has set.\n          */\n#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n         int keep = png_handle_as_unknown(png_ptr, up->name);\n\n         /* NOTE: this code is radically different from the read side in the\n          * matter of handling an ancillary unknown chunk.  In the read side\n          * the default behavior is to discard it, in the code below the default\n          * behavior is to write it.  Critical chunks are, however, only\n          * written if explicitly listed or if the default is set to write all\n          * unknown chunks.\n          *\n          * The default handling is also slightly weird - it is not possible to\n          * stop the writing of all unsafe-to-copy chunks!\n          *\n          * TODO: REVIEW: this would seem to be a bug.\n          */\n         if (keep != PNG_HANDLE_CHUNK_NEVER &&\n             ((up->name[3] & 0x20) /* safe-to-copy overrides everything */ ||\n              keep == PNG_HANDLE_CHUNK_ALWAYS ||\n              (keep == PNG_HANDLE_CHUNK_AS_DEFAULT &&\n               png_ptr->unknown_default == PNG_HANDLE_CHUNK_ALWAYS)))\n#endif\n         {\n            /* TODO: review, what is wrong with a zero length unknown chunk? */\n            if (up->size == 0)\n               png_warning(png_ptr, \"Writing zero-length unknown chunk\");\n\n            png_write_chunk(png_ptr, up->name, up->data, up->size);\n         }\n      }\n   }\n}\n#endif /* WRITE_UNKNOWN_CHUNKS */\n\n/* Writes all the PNG information.  This is the suggested way to use the\n * library.  If you have a new chunk to add, make a function to write it,\n * and put it in the correct location here.  If you want the chunk written\n * after the image data, put it in png_write_end().  I strongly encourage\n * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing\n * the chunk, as that will keep the code from breaking if you want to just\n * write a plain PNG file.  If you have long comments, I suggest writing\n * them in png_write_end(), and compressing them.\n */\nvoid PNGAPI\npng_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)\n{\n   png_debug(1, \"in png_write_info_before_PLTE\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)\n   {\n      /* Write PNG signature */\n      png_write_sig(png_ptr);\n\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n      if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \\\n          png_ptr->mng_features_permitted != 0)\n      {\n         png_warning(png_ptr,\n             \"MNG features are not allowed in a PNG datastream\");\n         png_ptr->mng_features_permitted = 0;\n      }\n#endif\n\n      /* Write IHDR information. */\n      png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,\n          info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,\n          info_ptr->filter_type,\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n          info_ptr->interlace_type\n#else\n          0\n#endif\n         );\n\n      /* The rest of these check to see if the valid field has the appropriate\n       * flag set, and if it does, writes the chunk.\n       *\n       * 1.6.0: COLORSPACE support controls the writing of these chunks too, and\n       * the chunks will be written if the WRITE routine is there and\n       * information * is available in the COLORSPACE. (See\n       * png_colorspace_sync_info in png.c for where the valid flags get set.)\n       *\n       * Under certain circumstances the colorspace can be invalidated without\n       * syncing the info_struct 'valid' flags; this happens if libpng detects\n       * an error and calls png_error while the color space is being set, yet\n       * the application continues writing the PNG.  So check the 'invalid'\n       * flag here too.\n       */\n#ifdef PNG_GAMMA_SUPPORTED\n#  ifdef PNG_WRITE_gAMA_SUPPORTED\n      if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&\n          (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_gAMA) != 0 &&\n          (info_ptr->valid & PNG_INFO_gAMA) != 0)\n         png_write_gAMA_fixed(png_ptr, info_ptr->colorspace.gamma);\n#  endif\n#endif\n\n#ifdef PNG_COLORSPACE_SUPPORTED\n      /* Write only one of sRGB or an ICC profile.  If a profile was supplied\n       * and it matches one of the known sRGB ones issue a warning.\n       */\n#  ifdef PNG_WRITE_iCCP_SUPPORTED\n         if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&\n             (info_ptr->valid & PNG_INFO_iCCP) != 0)\n         {\n#    ifdef PNG_WRITE_sRGB_SUPPORTED\n               if ((info_ptr->valid & PNG_INFO_sRGB) != 0)\n                  png_app_warning(png_ptr,\n                     \"profile matches sRGB but writing iCCP instead\");\n#     endif\n\n            png_write_iCCP(png_ptr, info_ptr->iccp_name,\n               info_ptr->iccp_profile);\n         }\n#     ifdef PNG_WRITE_sRGB_SUPPORTED\n         else\n#     endif\n#  endif\n\n#  ifdef PNG_WRITE_sRGB_SUPPORTED\n         if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&\n             (info_ptr->valid & PNG_INFO_sRGB) != 0)\n            png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent);\n#  endif /* WRITE_sRGB */\n#endif /* COLORSPACE */\n\n#ifdef PNG_WRITE_sBIT_SUPPORTED\n         if ((info_ptr->valid & PNG_INFO_sBIT) != 0)\n            png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);\n#endif\n\n#ifdef PNG_COLORSPACE_SUPPORTED\n#  ifdef PNG_WRITE_cHRM_SUPPORTED\n         if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&\n             (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 &&\n             (info_ptr->valid & PNG_INFO_cHRM) != 0)\n            png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy);\n#  endif\n#endif\n\n#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n         write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR);\n#endif\n\n      png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;\n   }\n}\n\nvoid PNGAPI\npng_write_info(png_structrp png_ptr, png_const_inforp info_ptr)\n{\n#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)\n   int i;\n#endif\n\n   png_debug(1, \"in png_write_info\");\n\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   png_write_info_before_PLTE(png_ptr, info_ptr);\n\n   if ((info_ptr->valid & PNG_INFO_PLTE) != 0)\n      png_write_PLTE(png_ptr, info_ptr->palette,\n          (png_uint_32)info_ptr->num_palette);\n\n   else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      png_error(png_ptr, \"Valid palette required for paletted images\");\n\n#ifdef PNG_WRITE_tRNS_SUPPORTED\n   if ((info_ptr->valid & PNG_INFO_tRNS) !=0)\n   {\n#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED\n      /* Invert the alpha channel (in tRNS) */\n      if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0 &&\n          info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      {\n         int j, jend;\n\n         jend = info_ptr->num_trans;\n         if (jend > PNG_MAX_PALETTE_LENGTH)\n            jend = PNG_MAX_PALETTE_LENGTH;\n\n         for (j = 0; j<jend; ++j)\n            info_ptr->trans_alpha[j] =\n               (png_byte)(255 - info_ptr->trans_alpha[j]);\n      }\n#endif\n      png_write_tRNS(png_ptr, info_ptr->trans_alpha, &(info_ptr->trans_color),\n          info_ptr->num_trans, info_ptr->color_type);\n   }\n#endif\n#ifdef PNG_WRITE_bKGD_SUPPORTED\n   if ((info_ptr->valid & PNG_INFO_bKGD) != 0)\n      png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type);\n#endif\n\n#ifdef PNG_WRITE_hIST_SUPPORTED\n   if ((info_ptr->valid & PNG_INFO_hIST) != 0)\n      png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette);\n#endif\n\n#ifdef PNG_WRITE_oFFs_SUPPORTED\n   if ((info_ptr->valid & PNG_INFO_oFFs) != 0)\n      png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset,\n          info_ptr->offset_unit_type);\n#endif\n\n#ifdef PNG_WRITE_pCAL_SUPPORTED\n   if ((info_ptr->valid & PNG_INFO_pCAL) != 0)\n      png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0,\n          info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,\n          info_ptr->pcal_units, info_ptr->pcal_params);\n#endif\n\n#ifdef PNG_WRITE_sCAL_SUPPORTED\n   if ((info_ptr->valid & PNG_INFO_sCAL) != 0)\n      png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit,\n          info_ptr->scal_s_width, info_ptr->scal_s_height);\n#endif /* sCAL */\n\n#ifdef PNG_WRITE_pHYs_SUPPORTED\n   if ((info_ptr->valid & PNG_INFO_pHYs) != 0)\n      png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,\n          info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type);\n#endif /* pHYs */\n\n#ifdef PNG_WRITE_tIME_SUPPORTED\n   if ((info_ptr->valid & PNG_INFO_tIME) != 0)\n   {\n      png_write_tIME(png_ptr, &(info_ptr->mod_time));\n      png_ptr->mode |= PNG_WROTE_tIME;\n   }\n#endif /* tIME */\n\n#ifdef PNG_WRITE_sPLT_SUPPORTED\n   if ((info_ptr->valid & PNG_INFO_sPLT) != 0)\n      for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)\n         png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);\n#endif /* sPLT */\n\n#ifdef PNG_WRITE_TEXT_SUPPORTED\n   /* Check to see if we need to write text chunks */\n   for (i = 0; i < info_ptr->num_text; i++)\n   {\n      png_debug2(2, \"Writing header text chunk %d, type %d\", i,\n          info_ptr->text[i].compression);\n      /* An internationalized chunk? */\n      if (info_ptr->text[i].compression > 0)\n      {\n#ifdef PNG_WRITE_iTXt_SUPPORTED\n         /* Write international chunk */\n         png_write_iTXt(png_ptr,\n             info_ptr->text[i].compression,\n             info_ptr->text[i].key,\n             info_ptr->text[i].lang,\n             info_ptr->text[i].lang_key,\n             info_ptr->text[i].text);\n         /* Mark this chunk as written */\n         if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)\n            info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;\n         else\n            info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;\n#else\n         png_warning(png_ptr, \"Unable to write international text\");\n#endif\n      }\n\n      /* If we want a compressed text chunk */\n      else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt)\n      {\n#ifdef PNG_WRITE_zTXt_SUPPORTED\n         /* Write compressed chunk */\n         png_write_zTXt(png_ptr, info_ptr->text[i].key,\n             info_ptr->text[i].text, info_ptr->text[i].compression);\n         /* Mark this chunk as written */\n         info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;\n#else\n         png_warning(png_ptr, \"Unable to write compressed text\");\n#endif\n      }\n\n      else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)\n      {\n#ifdef PNG_WRITE_tEXt_SUPPORTED\n         /* Write uncompressed chunk */\n         png_write_tEXt(png_ptr, info_ptr->text[i].key,\n             info_ptr->text[i].text,\n             0);\n         /* Mark this chunk as written */\n         info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;\n#else\n         /* Can't get here */\n         png_warning(png_ptr, \"Unable to write uncompressed text\");\n#endif\n      }\n   }\n#endif /* tEXt */\n\n#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n   write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_PLTE);\n#endif\n}\n\n/* Writes the end of the PNG file.  If you don't want to write comments or\n * time information, you can pass NULL for info.  If you already wrote these\n * in png_write_info(), do not write them again here.  If you have long\n * comments, I suggest writing them here, and compressing them.\n */\nvoid PNGAPI\npng_write_end(png_structrp png_ptr, png_inforp info_ptr)\n{\n   png_debug(1, \"in png_write_end\");\n\n   if (png_ptr == NULL)\n      return;\n\n   if ((png_ptr->mode & PNG_HAVE_IDAT) == 0)\n      png_error(png_ptr, \"No IDATs written into file\");\n\n#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED\n   if (png_ptr->num_palette_max > png_ptr->num_palette)\n      png_benign_error(png_ptr, \"Wrote palette index exceeding num_palette\");\n#endif\n\n   /* See if user wants us to write information chunks */\n   if (info_ptr != NULL)\n   {\n#ifdef PNG_WRITE_TEXT_SUPPORTED\n      int i; /* local index variable */\n#endif\n#ifdef PNG_WRITE_tIME_SUPPORTED\n      /* Check to see if user has supplied a time chunk */\n      if ((info_ptr->valid & PNG_INFO_tIME) != 0 &&\n          (png_ptr->mode & PNG_WROTE_tIME) == 0)\n         png_write_tIME(png_ptr, &(info_ptr->mod_time));\n\n#endif\n#ifdef PNG_WRITE_TEXT_SUPPORTED\n      /* Loop through comment chunks */\n      for (i = 0; i < info_ptr->num_text; i++)\n      {\n         png_debug2(2, \"Writing trailer text chunk %d, type %d\", i,\n            info_ptr->text[i].compression);\n         /* An internationalized chunk? */\n         if (info_ptr->text[i].compression > 0)\n         {\n#ifdef PNG_WRITE_iTXt_SUPPORTED\n            /* Write international chunk */\n            png_write_iTXt(png_ptr,\n                info_ptr->text[i].compression,\n                info_ptr->text[i].key,\n                info_ptr->text[i].lang,\n                info_ptr->text[i].lang_key,\n                info_ptr->text[i].text);\n            /* Mark this chunk as written */\n            if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)\n               info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;\n            else\n               info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;\n#else\n            png_warning(png_ptr, \"Unable to write international text\");\n#endif\n         }\n\n         else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)\n         {\n#ifdef PNG_WRITE_zTXt_SUPPORTED\n            /* Write compressed chunk */\n            png_write_zTXt(png_ptr, info_ptr->text[i].key,\n                info_ptr->text[i].text, info_ptr->text[i].compression);\n            /* Mark this chunk as written */\n            info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;\n#else\n            png_warning(png_ptr, \"Unable to write compressed text\");\n#endif\n         }\n\n         else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)\n         {\n#ifdef PNG_WRITE_tEXt_SUPPORTED\n            /* Write uncompressed chunk */\n            png_write_tEXt(png_ptr, info_ptr->text[i].key,\n                info_ptr->text[i].text, 0);\n            /* Mark this chunk as written */\n            info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;\n#else\n            png_warning(png_ptr, \"Unable to write uncompressed text\");\n#endif\n         }\n      }\n#endif\n#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n      write_unknown_chunks(png_ptr, info_ptr, PNG_AFTER_IDAT);\n#endif\n   }\n\n   png_ptr->mode |= PNG_AFTER_IDAT;\n\n   /* Write end of PNG file */\n   png_write_IEND(png_ptr);\n\n   /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03,\n    * and restored again in libpng-1.2.30, may cause some applications that\n    * do not set png_ptr->output_flush_fn to crash.  If your application\n    * experiences a problem, please try building libpng with\n    * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to\n    * png-mng-implement at lists.sf.net .\n    */\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\n#  ifdef PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED\n   png_flush(png_ptr);\n#  endif\n#endif\n}\n\n#ifdef PNG_CONVERT_tIME_SUPPORTED\nvoid PNGAPI\npng_convert_from_struct_tm(png_timep ptime, PNG_CONST struct tm * ttime)\n{\n   png_debug(1, \"in png_convert_from_struct_tm\");\n\n   ptime->year = (png_uint_16)(1900 + ttime->tm_year);\n   ptime->month = (png_byte)(ttime->tm_mon + 1);\n   ptime->day = (png_byte)ttime->tm_mday;\n   ptime->hour = (png_byte)ttime->tm_hour;\n   ptime->minute = (png_byte)ttime->tm_min;\n   ptime->second = (png_byte)ttime->tm_sec;\n}\n\nvoid PNGAPI\npng_convert_from_time_t(png_timep ptime, time_t ttime)\n{\n   struct tm *tbuf;\n\n   png_debug(1, \"in png_convert_from_time_t\");\n\n   tbuf = gmtime(&ttime);\n   png_convert_from_struct_tm(ptime, tbuf);\n}\n#endif\n\n/* Initialize png_ptr structure, and allocate any memory needed */\nPNG_FUNCTION(png_structp,PNGAPI\npng_create_write_struct,(png_const_charp user_png_ver, png_voidp error_ptr,\n    png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED)\n{\n#ifndef PNG_USER_MEM_SUPPORTED\n   png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr,\n       error_fn, warn_fn, NULL, NULL, NULL);\n#else\n   return png_create_write_struct_2(user_png_ver, error_ptr, error_fn,\n       warn_fn, NULL, NULL, NULL);\n}\n\n/* Alternate initialize png_ptr structure, and allocate any memory needed */\nPNG_FUNCTION(png_structp,PNGAPI\npng_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,\n    png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,\n    png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)\n{\n   png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr,\n       error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);\n#endif /* USER_MEM */\n   if (png_ptr != NULL)\n   {\n      /* Set the zlib control values to defaults; they can be overridden by the\n       * application after the struct has been created.\n       */\n      png_ptr->zbuffer_size = PNG_ZBUF_SIZE;\n\n      /* The 'zlib_strategy' setting is irrelevant because png_default_claim in\n       * pngwutil.c defaults it according to whether or not filters will be\n       * used, and ignores this setting.\n       */\n      png_ptr->zlib_strategy = PNG_Z_DEFAULT_STRATEGY;\n      png_ptr->zlib_level = PNG_Z_DEFAULT_COMPRESSION;\n      png_ptr->zlib_mem_level = 8;\n      png_ptr->zlib_window_bits = 15;\n      png_ptr->zlib_method = 8;\n\n#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED\n      png_ptr->zlib_text_strategy = PNG_TEXT_Z_DEFAULT_STRATEGY;\n      png_ptr->zlib_text_level = PNG_TEXT_Z_DEFAULT_COMPRESSION;\n      png_ptr->zlib_text_mem_level = 8;\n      png_ptr->zlib_text_window_bits = 15;\n      png_ptr->zlib_text_method = 8;\n#endif /* WRITE_COMPRESSED_TEXT */\n\n      /* This is a highly dubious configuration option; by default it is off,\n       * but it may be appropriate for private builds that are testing\n       * extensions not conformant to the current specification, or of\n       * applications that must not fail to write at all costs!\n       */\n#ifdef PNG_BENIGN_WRITE_ERRORS_SUPPORTED\n      /* In stable builds only warn if an application error can be completely\n       * handled.\n       */\n      png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;\n#endif\n\n      /* App warnings are warnings in release (or release candidate) builds but\n       * are errors during development.\n       */\n#if PNG_RELEASE_BUILD\n      png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;\n#endif\n\n      /* TODO: delay this, it can be done in png_init_io() (if the app doesn't\n       * do it itself) avoiding setting the default function if it is not\n       * required.\n       */\n      png_set_write_fn(png_ptr, NULL, NULL, NULL);\n   }\n\n   return png_ptr;\n}\n\n\n/* Write a few rows of image data.  If the image is interlaced,\n * either you will have to write the 7 sub images, or, if you\n * have called png_set_interlace_handling(), you will have to\n * \"write\" the image seven times.\n */\nvoid PNGAPI\npng_write_rows(png_structrp png_ptr, png_bytepp row,\n    png_uint_32 num_rows)\n{\n   png_uint_32 i; /* row counter */\n   png_bytepp rp; /* row pointer */\n\n   png_debug(1, \"in png_write_rows\");\n\n   if (png_ptr == NULL)\n      return;\n\n   /* Loop through the rows */\n   for (i = 0, rp = row; i < num_rows; i++, rp++)\n   {\n      png_write_row(png_ptr, *rp);\n   }\n}\n\n/* Write the image.  You only need to call this function once, even\n * if you are writing an interlaced image.\n */\nvoid PNGAPI\npng_write_image(png_structrp png_ptr, png_bytepp image)\n{\n   png_uint_32 i; /* row index */\n   int pass, num_pass; /* pass variables */\n   png_bytepp rp; /* points to current row */\n\n   if (png_ptr == NULL)\n      return;\n\n   png_debug(1, \"in png_write_image\");\n\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n   /* Initialize interlace handling.  If image is not interlaced,\n    * this will set pass to 1\n    */\n   num_pass = png_set_interlace_handling(png_ptr);\n#else\n   num_pass = 1;\n#endif\n   /* Loop through passes */\n   for (pass = 0; pass < num_pass; pass++)\n   {\n      /* Loop through image */\n      for (i = 0, rp = image; i < png_ptr->height; i++, rp++)\n      {\n         png_write_row(png_ptr, *rp);\n      }\n   }\n}\n\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n/* Performs intrapixel differencing  */\nstatic void\npng_do_write_intrapixel(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_write_intrapixel\");\n\n   if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)\n   {\n      int bytes_per_pixel;\n      png_uint_32 row_width = row_info->width;\n      if (row_info->bit_depth == 8)\n      {\n         png_bytep rp;\n         png_uint_32 i;\n\n         if (row_info->color_type == PNG_COLOR_TYPE_RGB)\n            bytes_per_pixel = 3;\n\n         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n            bytes_per_pixel = 4;\n\n         else\n            return;\n\n         for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)\n         {\n            *(rp)     = (png_byte)(*rp       - *(rp + 1));\n            *(rp + 2) = (png_byte)(*(rp + 2) - *(rp + 1));\n         }\n      }\n\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n      else if (row_info->bit_depth == 16)\n      {\n         png_bytep rp;\n         png_uint_32 i;\n\n         if (row_info->color_type == PNG_COLOR_TYPE_RGB)\n            bytes_per_pixel = 6;\n\n         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n            bytes_per_pixel = 8;\n\n         else\n            return;\n\n         for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)\n         {\n            png_uint_32 s0   = (*(rp    ) << 8) | *(rp + 1);\n            png_uint_32 s1   = (*(rp + 2) << 8) | *(rp + 3);\n            png_uint_32 s2   = (*(rp + 4) << 8) | *(rp + 5);\n            png_uint_32 red  = (png_uint_32)((s0 - s1) & 0xffffL);\n            png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);\n            *(rp    ) = (png_byte)(red >> 8);\n            *(rp + 1) = (png_byte)red;\n            *(rp + 4) = (png_byte)(blue >> 8);\n            *(rp + 5) = (png_byte)blue;\n         }\n      }\n#endif /* WRITE_16BIT */\n   }\n}\n#endif /* MNG_FEATURES */\n\n/* Called by user to write a row of image data */\nvoid PNGAPI\npng_write_row(png_structrp png_ptr, png_const_bytep row)\n{\n   /* 1.5.6: moved from png_struct to be a local structure: */\n   png_row_info row_info;\n\n   if (png_ptr == NULL)\n      return;\n\n   png_debug2(1, \"in png_write_row (row %u, pass %d)\",\n      png_ptr->row_number, png_ptr->pass);\n\n   /* Initialize transformations and other stuff if first time */\n   if (png_ptr->row_number == 0 && png_ptr->pass == 0)\n   {\n      /* Make sure we wrote the header info */\n      if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)\n         png_error(png_ptr,\n             \"png_write_info was never called before png_write_row\");\n\n      /* Check for transforms that have been set but were defined out */\n#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED)\n      if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)\n         png_warning(png_ptr, \"PNG_WRITE_INVERT_SUPPORTED is not defined\");\n#endif\n\n#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED)\n      if ((png_ptr->transformations & PNG_FILLER) != 0)\n         png_warning(png_ptr, \"PNG_WRITE_FILLER_SUPPORTED is not defined\");\n#endif\n#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \\\n    defined(PNG_READ_PACKSWAP_SUPPORTED)\n      if ((png_ptr->transformations & PNG_PACKSWAP) != 0)\n         png_warning(png_ptr,\n             \"PNG_WRITE_PACKSWAP_SUPPORTED is not defined\");\n#endif\n\n#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED)\n      if ((png_ptr->transformations & PNG_PACK) != 0)\n         png_warning(png_ptr, \"PNG_WRITE_PACK_SUPPORTED is not defined\");\n#endif\n\n#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED)\n      if ((png_ptr->transformations & PNG_SHIFT) != 0)\n         png_warning(png_ptr, \"PNG_WRITE_SHIFT_SUPPORTED is not defined\");\n#endif\n\n#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED)\n      if ((png_ptr->transformations & PNG_BGR) != 0)\n         png_warning(png_ptr, \"PNG_WRITE_BGR_SUPPORTED is not defined\");\n#endif\n\n#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED)\n      if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)\n         png_warning(png_ptr, \"PNG_WRITE_SWAP_SUPPORTED is not defined\");\n#endif\n\n      png_write_start_row(png_ptr);\n   }\n\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n   /* If interlaced and not interested in row, return */\n   if (png_ptr->interlaced != 0 &&\n       (png_ptr->transformations & PNG_INTERLACE) != 0)\n   {\n      switch (png_ptr->pass)\n      {\n         case 0:\n            if ((png_ptr->row_number & 0x07) != 0)\n            {\n               png_write_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 1:\n            if ((png_ptr->row_number & 0x07) != 0 || png_ptr->width < 5)\n            {\n               png_write_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 2:\n            if ((png_ptr->row_number & 0x07) != 4)\n            {\n               png_write_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 3:\n            if ((png_ptr->row_number & 0x03) != 0 || png_ptr->width < 3)\n            {\n               png_write_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 4:\n            if ((png_ptr->row_number & 0x03) != 2)\n            {\n               png_write_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 5:\n            if ((png_ptr->row_number & 0x01) != 0 || png_ptr->width < 2)\n            {\n               png_write_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         case 6:\n            if ((png_ptr->row_number & 0x01) == 0)\n            {\n               png_write_finish_row(png_ptr);\n               return;\n            }\n            break;\n\n         default: /* error: ignore it */\n            break;\n      }\n   }\n#endif\n\n   /* Set up row info for transformations */\n   row_info.color_type = png_ptr->color_type;\n   row_info.width = png_ptr->usr_width;\n   row_info.channels = png_ptr->usr_channels;\n   row_info.bit_depth = png_ptr->usr_bit_depth;\n   row_info.pixel_depth = (png_byte)(row_info.bit_depth * row_info.channels);\n   row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);\n\n   png_debug1(3, \"row_info->color_type = %d\", row_info.color_type);\n   png_debug1(3, \"row_info->width = %u\", row_info.width);\n   png_debug1(3, \"row_info->channels = %d\", row_info.channels);\n   png_debug1(3, \"row_info->bit_depth = %d\", row_info.bit_depth);\n   png_debug1(3, \"row_info->pixel_depth = %d\", row_info.pixel_depth);\n   png_debug1(3, \"row_info->rowbytes = %lu\", (unsigned long)row_info.rowbytes);\n\n   /* Copy user's row into buffer, leaving room for filter byte. */\n   memcpy(png_ptr->row_buf + 1, row, row_info.rowbytes);\n\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n   /* Handle interlacing */\n   if (png_ptr->interlaced && png_ptr->pass < 6 &&\n       (png_ptr->transformations & PNG_INTERLACE) != 0)\n   {\n      png_do_write_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass);\n      /* This should always get caught above, but still ... */\n      if (row_info.width == 0)\n      {\n         png_write_finish_row(png_ptr);\n         return;\n      }\n   }\n#endif\n\n#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED\n   /* Handle other transformations */\n   if (png_ptr->transformations != 0)\n      png_do_write_transformations(png_ptr, &row_info);\n#endif\n\n   /* At this point the row_info pixel depth must match the 'transformed' depth,\n    * which is also the output depth.\n    */\n   if (row_info.pixel_depth != png_ptr->pixel_depth ||\n       row_info.pixel_depth != png_ptr->transformed_pixel_depth)\n      png_error(png_ptr, \"internal write transform logic error\");\n\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n   /* Write filter_method 64 (intrapixel differencing) only if\n    * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and\n    * 2. Libpng did not write a PNG signature (this filter_method is only\n    *    used in PNG datastreams that are embedded in MNG datastreams) and\n    * 3. The application called png_permit_mng_features with a mask that\n    *    included PNG_FLAG_MNG_FILTER_64 and\n    * 4. The filter_method is 64 and\n    * 5. The color_type is RGB or RGBA\n    */\n   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&\n       (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))\n   {\n      /* Intrapixel differencing */\n      png_do_write_intrapixel(&row_info, png_ptr->row_buf + 1);\n   }\n#endif\n\n/* Added at libpng-1.5.10 */\n#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED\n   /* Check for out-of-range palette index */\n   if (row_info.color_type == PNG_COLOR_TYPE_PALETTE &&\n       png_ptr->num_palette_max >= 0)\n      png_do_check_palette_indexes(png_ptr, &row_info);\n#endif\n\n   /* Find a filter if necessary, filter the row and write it out. */\n   png_write_find_filter(png_ptr, &row_info);\n\n   if (png_ptr->write_row_fn != NULL)\n      (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);\n}\n\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\n/* Set the automatic flush interval or 0 to turn flushing off */\nvoid PNGAPI\npng_set_flush(png_structrp png_ptr, int nrows)\n{\n   png_debug(1, \"in png_set_flush\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->flush_dist = (nrows < 0 ? 0 : nrows);\n}\n\n/* Flush the current output buffers now */\nvoid PNGAPI\npng_write_flush(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_write_flush\");\n\n   if (png_ptr == NULL)\n      return;\n\n   /* We have already written out all of the data */\n   if (png_ptr->row_number >= png_ptr->num_rows)\n      return;\n\n   png_compress_IDAT(png_ptr, NULL, 0, Z_SYNC_FLUSH);\n   png_ptr->flush_rows = 0;\n   png_flush(png_ptr);\n}\n#endif /* WRITE_FLUSH */\n\n/* Free any memory used in png_ptr struct without freeing the struct itself. */\nstatic void\npng_write_destroy(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_write_destroy\");\n\n   /* Free any memory zlib uses */\n   if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)\n      deflateEnd(&png_ptr->zstream);\n\n   /* Free our memory.  png_free checks NULL for us. */\n   png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);\n   png_free(png_ptr, png_ptr->row_buf);\n   png_ptr->row_buf = NULL;\n#ifdef PNG_WRITE_FILTER_SUPPORTED\n   png_free(png_ptr, png_ptr->prev_row);\n   png_free(png_ptr, png_ptr->try_row);\n   png_free(png_ptr, png_ptr->tst_row);\n   png_ptr->prev_row = NULL;\n   png_ptr->try_row = NULL;\n   png_ptr->tst_row = NULL;\n#endif\n\n#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n   png_free(png_ptr, png_ptr->chunk_list);\n   png_ptr->chunk_list = NULL;\n#endif\n\n   /* The error handling and memory handling information is left intact at this\n    * point: the jmp_buf may still have to be freed.  See png_destroy_png_struct\n    * for how this happens.\n    */\n}\n\n/* Free all memory used by the write.\n * In libpng 1.6.0 this API changed quietly to no longer accept a NULL value for\n * *png_ptr_ptr.  Prior to 1.6.0 it would accept such a value and it would free\n * the passed in info_structs but it would quietly fail to free any of the data\n * inside them.  In 1.6.0 it quietly does nothing (it has to be quiet because it\n * has no png_ptr.)\n */\nvoid PNGAPI\npng_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)\n{\n   png_debug(1, \"in png_destroy_write_struct\");\n\n   if (png_ptr_ptr != NULL)\n   {\n      png_structrp png_ptr = *png_ptr_ptr;\n\n      if (png_ptr != NULL) /* added in libpng 1.6.0 */\n      {\n         png_destroy_info_struct(png_ptr, info_ptr_ptr);\n\n         *png_ptr_ptr = NULL;\n         png_write_destroy(png_ptr);\n         png_destroy_png_struct(png_ptr);\n      }\n   }\n}\n\n/* Allow the application to select one or more row filters to use. */\nvoid PNGAPI\npng_set_filter(png_structrp png_ptr, int method, int filters)\n{\n   png_debug(1, \"in png_set_filter\");\n\n   if (png_ptr == NULL)\n      return;\n\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&\n       (method == PNG_INTRAPIXEL_DIFFERENCING))\n      method = PNG_FILTER_TYPE_BASE;\n\n#endif\n   if (method == PNG_FILTER_TYPE_BASE)\n   {\n      switch (filters & (PNG_ALL_FILTERS | 0x07))\n      {\n#ifdef PNG_WRITE_FILTER_SUPPORTED\n         case 5:\n         case 6:\n         case 7: png_app_error(png_ptr, \"Unknown row filter for method 0\");\n            /* FALL THROUGH */\n#endif /* WRITE_FILTER */\n         case PNG_FILTER_VALUE_NONE:\n            png_ptr->do_filter = PNG_FILTER_NONE; break;\n\n#ifdef PNG_WRITE_FILTER_SUPPORTED\n         case PNG_FILTER_VALUE_SUB:\n            png_ptr->do_filter = PNG_FILTER_SUB; break;\n\n         case PNG_FILTER_VALUE_UP:\n            png_ptr->do_filter = PNG_FILTER_UP; break;\n\n         case PNG_FILTER_VALUE_AVG:\n            png_ptr->do_filter = PNG_FILTER_AVG; break;\n\n         case PNG_FILTER_VALUE_PAETH:\n            png_ptr->do_filter = PNG_FILTER_PAETH; break;\n\n         default:\n            png_ptr->do_filter = (png_byte)filters; break;\n#else\n         default:\n            png_app_error(png_ptr, \"Unknown row filter for method 0\");\n#endif /* WRITE_FILTER */\n      }\n\n#ifdef PNG_WRITE_FILTER_SUPPORTED\n      /* If we have allocated the row_buf, this means we have already started\n       * with the image and we should have allocated all of the filter buffers\n       * that have been selected.  If prev_row isn't already allocated, then\n       * it is too late to start using the filters that need it, since we\n       * will be missing the data in the previous row.  If an application\n       * wants to start and stop using particular filters during compression,\n       * it should start out with all of the filters, and then remove them\n       * or add them back after the start of compression.\n       *\n       * NOTE: this is a nasty constraint on the code, because it means that the\n       * prev_row buffer must be maintained even if there are currently no\n       * 'prev_row' requiring filters active.\n       */\n      if (png_ptr->row_buf != NULL)\n      {\n         int num_filters;\n         png_alloc_size_t buf_size;\n\n         /* Repeat the checks in png_write_start_row; 1 pixel high or wide\n          * images cannot benefit from certain filters.  If this isn't done here\n          * the check below will fire on 1 pixel high images.\n          */\n         if (png_ptr->height == 1)\n            filters &= ~(PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH);\n\n         if (png_ptr->width == 1)\n            filters &= ~(PNG_FILTER_SUB|PNG_FILTER_AVG|PNG_FILTER_PAETH);\n\n         if ((filters & (PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH)) != 0\n            && png_ptr->prev_row == NULL)\n         {\n            /* This is the error case, however it is benign - the previous row\n             * is not available so the filter can't be used.  Just warn here.\n             */\n            png_app_warning(png_ptr,\n               \"png_set_filter: UP/AVG/PAETH cannot be added after start\");\n            filters &= ~(PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH);\n         }\n\n         num_filters = 0;\n\n         if (filters & PNG_FILTER_SUB)\n            num_filters++;\n\n         if (filters & PNG_FILTER_UP)\n            num_filters++;\n\n         if (filters & PNG_FILTER_AVG)\n            num_filters++;\n\n         if (filters & PNG_FILTER_PAETH)\n            num_filters++;\n\n         /* Allocate needed row buffers if they have not already been\n          * allocated.\n          */\n         buf_size = PNG_ROWBYTES(png_ptr->usr_channels * png_ptr->usr_bit_depth,\n             png_ptr->width) + 1;\n\n         if (png_ptr->try_row == NULL)\n            png_ptr->try_row = png_voidcast(png_bytep,\n               png_malloc(png_ptr, buf_size));\n\n         if (num_filters > 1)\n         {\n            if (png_ptr->tst_row == NULL)\n               png_ptr->tst_row = png_voidcast(png_bytep,\n                  png_malloc(png_ptr, buf_size));\n         }\n      }\n      png_ptr->do_filter = (png_byte)filters;\n#endif\n   }\n   else\n      png_error(png_ptr, \"Unknown custom filter method\");\n}\n\n#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* DEPRECATED */\n/* Provide floating and fixed point APIs */\n#ifdef PNG_FLOATING_POINT_SUPPORTED\nvoid PNGAPI\npng_set_filter_heuristics(png_structrp png_ptr, int heuristic_method,\n    int num_weights, png_const_doublep filter_weights,\n    png_const_doublep filter_costs)\n{\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(heuristic_method)\n   PNG_UNUSED(num_weights)\n   PNG_UNUSED(filter_weights)\n   PNG_UNUSED(filter_costs)\n}\n#endif /* FLOATING_POINT */\n\n#ifdef PNG_FIXED_POINT_SUPPORTED\nvoid PNGAPI\npng_set_filter_heuristics_fixed(png_structrp png_ptr, int heuristic_method,\n    int num_weights, png_const_fixed_point_p filter_weights,\n    png_const_fixed_point_p filter_costs)\n{\n   PNG_UNUSED(png_ptr)\n   PNG_UNUSED(heuristic_method)\n   PNG_UNUSED(num_weights)\n   PNG_UNUSED(filter_weights)\n   PNG_UNUSED(filter_costs)\n}\n#endif /* FIXED_POINT */\n#endif /* WRITE_WEIGHTED_FILTER */\n\n#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED\nvoid PNGAPI\npng_set_compression_level(png_structrp png_ptr, int level)\n{\n   png_debug(1, \"in png_set_compression_level\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->zlib_level = level;\n}\n\nvoid PNGAPI\npng_set_compression_mem_level(png_structrp png_ptr, int mem_level)\n{\n   png_debug(1, \"in png_set_compression_mem_level\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->zlib_mem_level = mem_level;\n}\n\nvoid PNGAPI\npng_set_compression_strategy(png_structrp png_ptr, int strategy)\n{\n   png_debug(1, \"in png_set_compression_strategy\");\n\n   if (png_ptr == NULL)\n      return;\n\n   /* The flag setting here prevents the libpng dynamic selection of strategy.\n    */\n   png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY;\n   png_ptr->zlib_strategy = strategy;\n}\n\n/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a\n * smaller value of window_bits if it can do so safely.\n */\nvoid PNGAPI\npng_set_compression_window_bits(png_structrp png_ptr, int window_bits)\n{\n   if (png_ptr == NULL)\n      return;\n\n   /* Prior to 1.6.0 this would warn but then set the window_bits value. This\n    * meant that negative window bits values could be selected that would cause\n    * libpng to write a non-standard PNG file with raw deflate or gzip\n    * compressed IDAT or ancillary chunks.  Such files can be read and there is\n    * no warning on read, so this seems like a very bad idea.\n    */\n   if (window_bits > 15)\n   {\n      png_warning(png_ptr, \"Only compression windows <= 32k supported by PNG\");\n      window_bits = 15;\n   }\n\n   else if (window_bits < 8)\n   {\n      png_warning(png_ptr, \"Only compression windows >= 256 supported by PNG\");\n      window_bits = 8;\n   }\n\n   png_ptr->zlib_window_bits = window_bits;\n}\n\nvoid PNGAPI\npng_set_compression_method(png_structrp png_ptr, int method)\n{\n   png_debug(1, \"in png_set_compression_method\");\n\n   if (png_ptr == NULL)\n      return;\n\n   /* This would produce an invalid PNG file if it worked, but it doesn't and\n    * deflate will fault it, so it is harmless to just warn here.\n    */\n   if (method != 8)\n      png_warning(png_ptr, \"Only compression method 8 is supported by PNG\");\n\n   png_ptr->zlib_method = method;\n}\n#endif /* WRITE_CUSTOMIZE_COMPRESSION */\n\n/* The following were added to libpng-1.5.4 */\n#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED\nvoid PNGAPI\npng_set_text_compression_level(png_structrp png_ptr, int level)\n{\n   png_debug(1, \"in png_set_text_compression_level\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->zlib_text_level = level;\n}\n\nvoid PNGAPI\npng_set_text_compression_mem_level(png_structrp png_ptr, int mem_level)\n{\n   png_debug(1, \"in png_set_text_compression_mem_level\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->zlib_text_mem_level = mem_level;\n}\n\nvoid PNGAPI\npng_set_text_compression_strategy(png_structrp png_ptr, int strategy)\n{\n   png_debug(1, \"in png_set_text_compression_strategy\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->zlib_text_strategy = strategy;\n}\n\n/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a\n * smaller value of window_bits if it can do so safely.\n */\nvoid PNGAPI\npng_set_text_compression_window_bits(png_structrp png_ptr, int window_bits)\n{\n   if (png_ptr == NULL)\n      return;\n\n   if (window_bits > 15)\n   {\n      png_warning(png_ptr, \"Only compression windows <= 32k supported by PNG\");\n      window_bits = 15;\n   }\n\n   else if (window_bits < 8)\n   {\n      png_warning(png_ptr, \"Only compression windows >= 256 supported by PNG\");\n      window_bits = 8;\n   }\n\n   png_ptr->zlib_text_window_bits = window_bits;\n}\n\nvoid PNGAPI\npng_set_text_compression_method(png_structrp png_ptr, int method)\n{\n   png_debug(1, \"in png_set_text_compression_method\");\n\n   if (png_ptr == NULL)\n      return;\n\n   if (method != 8)\n      png_warning(png_ptr, \"Only compression method 8 is supported by PNG\");\n\n   png_ptr->zlib_text_method = method;\n}\n#endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */\n/* end of API added to libpng-1.5.4 */\n\nvoid PNGAPI\npng_set_write_status_fn(png_structrp png_ptr, png_write_status_ptr write_row_fn)\n{\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->write_row_fn = write_row_fn;\n}\n\n#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED\nvoid PNGAPI\npng_set_write_user_transform_fn(png_structrp png_ptr, png_user_transform_ptr\n    write_user_transform_fn)\n{\n   png_debug(1, \"in png_set_write_user_transform_fn\");\n\n   if (png_ptr == NULL)\n      return;\n\n   png_ptr->transformations |= PNG_USER_TRANSFORM;\n   png_ptr->write_user_transform_fn = write_user_transform_fn;\n}\n#endif\n\n\n#ifdef PNG_INFO_IMAGE_SUPPORTED\nvoid PNGAPI\npng_write_png(png_structrp png_ptr, png_inforp info_ptr,\n    int transforms, voidp params)\n{\n   if (png_ptr == NULL || info_ptr == NULL)\n      return;\n\n   if ((info_ptr->valid & PNG_INFO_IDAT) == 0)\n   {\n      png_app_error(png_ptr, \"no rows for png_write_image to write\");\n      return;\n   }\n\n   /* Write the file header information. */\n   png_write_info(png_ptr, info_ptr);\n\n   /* ------ these transformations don't touch the info structure ------- */\n\n   /* Invert monochrome pixels */\n   if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0)\n#ifdef PNG_WRITE_INVERT_SUPPORTED\n      png_set_invert_mono(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_INVERT_MONO not supported\");\n#endif\n\n   /* Shift the pixels up to a legal bit depth and fill in\n    * as appropriate to correctly scale the image.\n    */\n   if ((transforms & PNG_TRANSFORM_SHIFT) != 0)\n#ifdef PNG_WRITE_SHIFT_SUPPORTED\n      if ((info_ptr->valid & PNG_INFO_sBIT) != 0)\n         png_set_shift(png_ptr, &info_ptr->sig_bit);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_SHIFT not supported\");\n#endif\n\n   /* Pack pixels into bytes */\n   if ((transforms & PNG_TRANSFORM_PACKING) != 0)\n#ifdef PNG_WRITE_PACK_SUPPORTED\n      png_set_packing(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_PACKING not supported\");\n#endif\n\n   /* Swap location of alpha bytes from ARGB to RGBA */\n   if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0)\n#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED\n      png_set_swap_alpha(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_SWAP_ALPHA not supported\");\n#endif\n\n   /* Remove a filler (X) from XRGB/RGBX/AG/GA into to convert it into\n    * RGB, note that the code expects the input color type to be G or RGB; no\n    * alpha channel.\n    */\n   if ((transforms & (PNG_TRANSFORM_STRIP_FILLER_AFTER|\n       PNG_TRANSFORM_STRIP_FILLER_BEFORE)) != 0)\n   {\n#ifdef PNG_WRITE_FILLER_SUPPORTED\n      if ((transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) != 0)\n      {\n         if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)\n            png_app_error(png_ptr,\n                \"PNG_TRANSFORM_STRIP_FILLER: BEFORE+AFTER not supported\");\n\n         /* Continue if ignored - this is the pre-1.6.10 behavior */\n         png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);\n      }\n\n      else if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)\n         png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_STRIP_FILLER not supported\");\n#endif\n   }\n\n   /* Flip BGR pixels to RGB */\n   if ((transforms & PNG_TRANSFORM_BGR) != 0)\n#ifdef PNG_WRITE_BGR_SUPPORTED\n      png_set_bgr(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_BGR not supported\");\n#endif\n\n   /* Swap bytes of 16-bit files to most significant byte first */\n   if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0)\n#ifdef PNG_WRITE_SWAP_SUPPORTED\n      png_set_swap(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_SWAP_ENDIAN not supported\");\n#endif\n\n   /* Swap bits of 1-bit, 2-bit, 4-bit packed pixel formats */\n   if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0)\n#ifdef PNG_WRITE_PACKSWAP_SUPPORTED\n      png_set_packswap(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_PACKSWAP not supported\");\n#endif\n\n   /* Invert the alpha channel from opacity to transparency */\n   if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0)\n#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED\n      png_set_invert_alpha(png_ptr);\n#else\n      png_app_error(png_ptr, \"PNG_TRANSFORM_INVERT_ALPHA not supported\");\n#endif\n\n   /* ----------------------- end of transformations ------------------- */\n\n   /* Write the bits */\n   png_write_image(png_ptr, info_ptr->row_pointers);\n\n   /* It is REQUIRED to call this to finish writing the rest of the file */\n   png_write_end(png_ptr, info_ptr);\n\n   PNG_UNUSED(params)\n}\n#endif\n\n\n#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED\n/* Initialize the write structure - general purpose utility. */\nstatic int\npng_image_write_init(png_imagep image)\n{\n   png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, image,\n       png_safe_error, png_safe_warning);\n\n   if (png_ptr != NULL)\n   {\n      png_infop info_ptr = png_create_info_struct(png_ptr);\n\n      if (info_ptr != NULL)\n      {\n         png_controlp control = png_voidcast(png_controlp,\n             png_malloc_warn(png_ptr, (sizeof *control)));\n\n         if (control != NULL)\n         {\n            memset(control, 0, (sizeof *control));\n\n            control->png_ptr = png_ptr;\n            control->info_ptr = info_ptr;\n            control->for_write = 1;\n\n            image->opaque = control;\n            return 1;\n         }\n\n         /* Error clean up */\n         png_destroy_info_struct(png_ptr, &info_ptr);\n      }\n\n      png_destroy_write_struct(&png_ptr, NULL);\n   }\n\n   return png_image_error(image, \"png_image_write_: out of memory\");\n}\n\n/* Arguments to png_image_write_main: */\ntypedef struct\n{\n   /* Arguments: */\n   png_imagep      image;\n   png_const_voidp buffer;\n   png_int_32      row_stride;\n   png_const_voidp colormap;\n   int             convert_to_8bit;\n   /* Local variables: */\n   png_const_voidp first_row;\n   ptrdiff_t       row_bytes;\n   png_voidp       local_row;\n   /* Byte count for memory writing */\n   png_bytep        memory;\n   png_alloc_size_t memory_bytes; /* not used for STDIO */\n   png_alloc_size_t output_bytes; /* running total */\n} png_image_write_control;\n\n/* Write png_uint_16 input to a 16-bit PNG; the png_ptr has already been set to\n * do any necessary byte swapping.  The component order is defined by the\n * png_image format value.\n */\nstatic int\npng_write_image_16bit(png_voidp argument)\n{\n   png_image_write_control *display = png_voidcast(png_image_write_control*,\n       argument);\n   png_imagep image = display->image;\n   png_structrp png_ptr = image->opaque->png_ptr;\n\n   png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,\n       display->first_row);\n   png_uint_16p output_row = png_voidcast(png_uint_16p, display->local_row);\n   png_uint_16p row_end;\n   const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;\n   int aindex = 0;\n   png_uint_32 y = image->height;\n\n   if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)\n   {\n#   ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED\n      if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)\n      {\n         aindex = -1;\n         ++input_row; /* To point to the first component */\n         ++output_row;\n      }\n         else\n            aindex = channels;\n#     else\n         aindex = channels;\n#     endif\n   }\n\n   else\n      png_error(png_ptr, \"png_write_image: internal call error\");\n\n   /* Work out the output row end and count over this, note that the increment\n    * above to 'row' means that row_end can actually be beyond the end of the\n    * row; this is correct.\n    */\n   row_end = output_row + image->width * (channels+1);\n\n   while (y-- > 0)\n   {\n      png_const_uint_16p in_ptr = input_row;\n      png_uint_16p out_ptr = output_row;\n\n      while (out_ptr < row_end)\n      {\n         const png_uint_16 alpha = in_ptr[aindex];\n         png_uint_32 reciprocal = 0;\n         int c;\n\n         out_ptr[aindex] = alpha;\n\n         /* Calculate a reciprocal.  The correct calculation is simply\n          * component/alpha*65535 << 15. (I.e. 15 bits of precision); this\n          * allows correct rounding by adding .5 before the shift.  'reciprocal'\n          * is only initialized when required.\n          */\n         if (alpha > 0 && alpha < 65535)\n            reciprocal = ((0xffff<<15)+(alpha>>1))/alpha;\n\n         c = channels;\n         do /* always at least one channel */\n         {\n            png_uint_16 component = *in_ptr++;\n\n            /* The following gives 65535 for an alpha of 0, which is fine,\n             * otherwise if 0/0 is represented as some other value there is more\n             * likely to be a discontinuity which will probably damage\n             * compression when moving from a fully transparent area to a\n             * nearly transparent one.  (The assumption here is that opaque\n             * areas tend not to be 0 intensity.)\n             */\n            if (component >= alpha)\n               component = 65535;\n\n            /* component<alpha, so component/alpha is less than one and\n             * component*reciprocal is less than 2^31.\n             */\n            else if (component > 0 && alpha < 65535)\n            {\n               png_uint_32 calc = component * reciprocal;\n               calc += 16384; /* round to nearest */\n               component = (png_uint_16)(calc >> 15);\n            }\n\n            *out_ptr++ = component;\n         }\n         while (--c > 0);\n\n         /* Skip to next component (skip the intervening alpha channel) */\n         ++in_ptr;\n         ++out_ptr;\n      }\n\n      png_write_row(png_ptr, png_voidcast(png_const_bytep, display->local_row));\n      input_row += display->row_bytes/(sizeof (png_uint_16));\n   }\n\n   return 1;\n}\n\n/* Given 16-bit input (1 to 4 channels) write 8-bit output.  If an alpha channel\n * is present it must be removed from the components, the components are then\n * written in sRGB encoding.  No components are added or removed.\n *\n * Calculate an alpha reciprocal to reverse pre-multiplication.  As above the\n * calculation can be done to 15 bits of accuracy; however, the output needs to\n * be scaled in the range 0..255*65535, so include that scaling here.\n */\n#   define UNP_RECIPROCAL(alpha) ((((0xffff*0xff)<<7)+(alpha>>1))/alpha)\n\nstatic png_byte\npng_unpremultiply(png_uint_32 component, png_uint_32 alpha,\n   png_uint_32 reciprocal/*from the above macro*/)\n{\n   /* The following gives 1.0 for an alpha of 0, which is fine, otherwise if 0/0\n    * is represented as some other value there is more likely to be a\n    * discontinuity which will probably damage compression when moving from a\n    * fully transparent area to a nearly transparent one.  (The assumption here\n    * is that opaque areas tend not to be 0 intensity.)\n    *\n    * There is a rounding problem here; if alpha is less than 128 it will end up\n    * as 0 when scaled to 8 bits.  To avoid introducing spurious colors into the\n    * output change for this too.\n    */\n   if (component >= alpha || alpha < 128)\n      return 255;\n\n   /* component<alpha, so component/alpha is less than one and\n    * component*reciprocal is less than 2^31.\n    */\n   else if (component > 0)\n   {\n      /* The test is that alpha/257 (rounded) is less than 255, the first value\n       * that becomes 255 is 65407.\n       * NOTE: this must agree with the PNG_DIV257 macro (which must, therefore,\n       * be exact!)  [Could also test reciprocal != 0]\n       */\n      if (alpha < 65407)\n      {\n         component *= reciprocal;\n         component += 64; /* round to nearest */\n         component >>= 7;\n      }\n\n      else\n         component *= 255;\n\n      /* Convert the component to sRGB. */\n      return (png_byte)PNG_sRGB_FROM_LINEAR(component);\n   }\n\n   else\n      return 0;\n}\n\nstatic int\npng_write_image_8bit(png_voidp argument)\n{\n   png_image_write_control *display = png_voidcast(png_image_write_control*,\n       argument);\n   png_imagep image = display->image;\n   png_structrp png_ptr = image->opaque->png_ptr;\n\n   png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,\n       display->first_row);\n   png_bytep output_row = png_voidcast(png_bytep, display->local_row);\n   png_uint_32 y = image->height;\n   const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;\n\n   if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)\n   {\n      png_bytep row_end;\n      int aindex;\n\n#   ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED\n      if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)\n      {\n         aindex = -1;\n         ++input_row; /* To point to the first component */\n         ++output_row;\n      }\n\n      else\n#   endif\n      aindex = channels;\n\n      /* Use row_end in place of a loop counter: */\n      row_end = output_row + image->width * (channels+1);\n\n      while (y-- > 0)\n      {\n         png_const_uint_16p in_ptr = input_row;\n         png_bytep out_ptr = output_row;\n\n         while (out_ptr < row_end)\n         {\n            png_uint_16 alpha = in_ptr[aindex];\n            png_byte alphabyte = (png_byte)PNG_DIV257(alpha);\n            png_uint_32 reciprocal = 0;\n            int c;\n\n            /* Scale and write the alpha channel. */\n            out_ptr[aindex] = alphabyte;\n\n            if (alphabyte > 0 && alphabyte < 255)\n               reciprocal = UNP_RECIPROCAL(alpha);\n\n            c = channels;\n            do /* always at least one channel */\n               *out_ptr++ = png_unpremultiply(*in_ptr++, alpha, reciprocal);\n            while (--c > 0);\n\n            /* Skip to next component (skip the intervening alpha channel) */\n            ++in_ptr;\n            ++out_ptr;\n         } /* while out_ptr < row_end */\n\n         png_write_row(png_ptr, png_voidcast(png_const_bytep,\n             display->local_row));\n         input_row += display->row_bytes/(sizeof (png_uint_16));\n      } /* while y */\n   }\n\n   else\n   {\n      /* No alpha channel, so the row_end really is the end of the row and it\n       * is sufficient to loop over the components one by one.\n       */\n      png_bytep row_end = output_row + image->width * channels;\n\n      while (y-- > 0)\n      {\n         png_const_uint_16p in_ptr = input_row;\n         png_bytep out_ptr = output_row;\n\n         while (out_ptr < row_end)\n         {\n            png_uint_32 component = *in_ptr++;\n\n            component *= 255;\n            *out_ptr++ = (png_byte)PNG_sRGB_FROM_LINEAR(component);\n         }\n\n         png_write_row(png_ptr, output_row);\n         input_row += display->row_bytes/(sizeof (png_uint_16));\n      }\n   }\n\n   return 1;\n}\n\nstatic void\npng_image_set_PLTE(png_image_write_control *display)\n{\n   const png_imagep image = display->image;\n   const void *cmap = display->colormap;\n   const int entries = image->colormap_entries > 256 ? 256 :\n       (int)image->colormap_entries;\n\n   /* NOTE: the caller must check for cmap != NULL and entries != 0 */\n   const png_uint_32 format = image->format;\n   const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format);\n\n#   if defined(PNG_FORMAT_BGR_SUPPORTED) &&\\\n      defined(PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED)\n      const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 &&\n          (format & PNG_FORMAT_FLAG_ALPHA) != 0;\n#   else\n#     define afirst 0\n#   endif\n\n#   ifdef PNG_FORMAT_BGR_SUPPORTED\n      const int bgr = (format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;\n#   else\n#     define bgr 0\n#   endif\n\n   int i, num_trans;\n   png_color palette[256];\n   png_byte tRNS[256];\n\n   memset(tRNS, 255, (sizeof tRNS));\n   memset(palette, 0, (sizeof palette));\n\n   for (i=num_trans=0; i<entries; ++i)\n   {\n      /* This gets automatically converted to sRGB with reversal of the\n       * pre-multiplication if the color-map has an alpha channel.\n       */\n      if ((format & PNG_FORMAT_FLAG_LINEAR) != 0)\n      {\n         png_const_uint_16p entry = png_voidcast(png_const_uint_16p, cmap);\n\n         entry += i * channels;\n\n         if ((channels & 1) != 0) /* no alpha */\n         {\n            if (channels >= 3) /* RGB */\n            {\n               palette[i].blue = (png_byte)PNG_sRGB_FROM_LINEAR(255 *\n                   entry[(2 ^ bgr)]);\n               palette[i].green = (png_byte)PNG_sRGB_FROM_LINEAR(255 *\n                   entry[1]);\n               palette[i].red = (png_byte)PNG_sRGB_FROM_LINEAR(255 *\n                   entry[bgr]);\n            }\n\n            else /* Gray */\n               palette[i].blue = palette[i].red = palette[i].green =\n                  (png_byte)PNG_sRGB_FROM_LINEAR(255 * *entry);\n         }\n\n         else /* alpha */\n         {\n            png_uint_16 alpha = entry[afirst ? 0 : channels-1];\n            png_byte alphabyte = (png_byte)PNG_DIV257(alpha);\n            png_uint_32 reciprocal = 0;\n\n            /* Calculate a reciprocal, as in the png_write_image_8bit code above\n             * this is designed to produce a value scaled to 255*65535 when\n             * divided by 128 (i.e. asr 7).\n             */\n            if (alphabyte > 0 && alphabyte < 255)\n               reciprocal = (((0xffff*0xff)<<7)+(alpha>>1))/alpha;\n\n            tRNS[i] = alphabyte;\n            if (alphabyte < 255)\n               num_trans = i+1;\n\n            if (channels >= 3) /* RGB */\n            {\n               palette[i].blue = png_unpremultiply(entry[afirst + (2 ^ bgr)],\n                  alpha, reciprocal);\n               palette[i].green = png_unpremultiply(entry[afirst + 1], alpha,\n                  reciprocal);\n               palette[i].red = png_unpremultiply(entry[afirst + bgr], alpha,\n                  reciprocal);\n            }\n\n            else /* gray */\n               palette[i].blue = palette[i].red = palette[i].green =\n                  png_unpremultiply(entry[afirst], alpha, reciprocal);\n         }\n      }\n\n      else /* Color-map has sRGB values */\n      {\n         png_const_bytep entry = png_voidcast(png_const_bytep, cmap);\n\n         entry += i * channels;\n\n         switch (channels)\n         {\n            case 4:\n               tRNS[i] = entry[afirst ? 0 : 3];\n               if (tRNS[i] < 255)\n                  num_trans = i+1;\n               /* FALL THROUGH */\n            case 3:\n               palette[i].blue = entry[afirst + (2 ^ bgr)];\n               palette[i].green = entry[afirst + 1];\n               palette[i].red = entry[afirst + bgr];\n               break;\n\n            case 2:\n               tRNS[i] = entry[1 ^ afirst];\n               if (tRNS[i] < 255)\n                  num_trans = i+1;\n               /* FALL THROUGH */\n            case 1:\n               palette[i].blue = palette[i].red = palette[i].green =\n                  entry[afirst];\n               break;\n\n            default:\n               break;\n         }\n      }\n   }\n\n#   ifdef afirst\n#     undef afirst\n#   endif\n#   ifdef bgr\n#     undef bgr\n#   endif\n\n   png_set_PLTE(image->opaque->png_ptr, image->opaque->info_ptr, palette,\n      entries);\n\n   if (num_trans > 0)\n      png_set_tRNS(image->opaque->png_ptr, image->opaque->info_ptr, tRNS,\n         num_trans, NULL);\n\n   image->colormap_entries = entries;\n}\n\nstatic int\npng_image_write_main(png_voidp argument)\n{\n   png_image_write_control *display = png_voidcast(png_image_write_control*,\n      argument);\n   png_imagep image = display->image;\n   png_structrp png_ptr = image->opaque->png_ptr;\n   png_inforp info_ptr = image->opaque->info_ptr;\n   png_uint_32 format = image->format;\n\n   /* The following four ints are actually booleans */\n   int colormap = (format & PNG_FORMAT_FLAG_COLORMAP);\n   int linear = !colormap && (format & PNG_FORMAT_FLAG_LINEAR); /* input */\n   int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA);\n   int write_16bit = linear && !colormap && (display->convert_to_8bit == 0);\n\n#   ifdef PNG_BENIGN_ERRORS_SUPPORTED\n      /* Make sure we error out on any bad situation */\n      png_set_benign_errors(png_ptr, 0/*error*/);\n#   endif\n\n   /* Default the 'row_stride' parameter if required, also check the row stride\n    * and total image size to ensure that they are within the system limits.\n    */\n   {\n      const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);\n\n      if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */\n      {\n         png_uint_32 check;\n         const png_uint_32 png_row_stride = image->width * channels;\n\n         if (display->row_stride == 0)\n            display->row_stride = (png_int_32)/*SAFE*/png_row_stride;\n\n         if (display->row_stride < 0)\n            check = -display->row_stride;\n\n         else\n            check = display->row_stride;\n\n         if (check >= png_row_stride)\n         {\n            /* Now check for overflow of the image buffer calculation; this\n             * limits the whole image size to 32 bits for API compatibility with\n             * the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.\n             */\n            if (image->height > 0xFFFFFFFF/png_row_stride)\n               png_error(image->opaque->png_ptr, \"memory image too large\");\n         }\n\n         else\n            png_error(image->opaque->png_ptr, \"supplied row stride too small\");\n      }\n\n      else\n         png_error(image->opaque->png_ptr, \"image row stride too large\");\n   }\n\n   /* Set the required transforms then write the rows in the correct order. */\n   if ((format & PNG_FORMAT_FLAG_COLORMAP) != 0)\n   {\n      if (display->colormap != NULL && image->colormap_entries > 0)\n      {\n         png_uint_32 entries = image->colormap_entries;\n\n         png_set_IHDR(png_ptr, info_ptr, image->width, image->height,\n            entries > 16 ? 8 : (entries > 4 ? 4 : (entries > 2 ? 2 : 1)),\n            PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,\n            PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);\n\n         png_image_set_PLTE(display);\n      }\n\n      else\n         png_error(image->opaque->png_ptr,\n            \"no color-map for color-mapped image\");\n   }\n\n   else\n      png_set_IHDR(png_ptr, info_ptr, image->width, image->height,\n         write_16bit ? 16 : 8,\n         ((format & PNG_FORMAT_FLAG_COLOR) ? PNG_COLOR_MASK_COLOR : 0) +\n         ((format & PNG_FORMAT_FLAG_ALPHA) ? PNG_COLOR_MASK_ALPHA : 0),\n         PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);\n\n   /* Counter-intuitively the data transformations must be called *after*\n    * png_write_info, not before as in the read code, but the 'set' functions\n    * must still be called before.  Just set the color space information, never\n    * write an interlaced image.\n    */\n\n   if (write_16bit != 0)\n   {\n      /* The gamma here is 1.0 (linear) and the cHRM chunk matches sRGB. */\n      png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_LINEAR);\n\n      if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0)\n         png_set_cHRM_fixed(png_ptr, info_ptr,\n            /* color      x       y */\n            /* white */ 31270, 32900,\n            /* red   */ 64000, 33000,\n            /* green */ 30000, 60000,\n            /* blue  */ 15000,  6000\n         );\n   }\n\n   else if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0)\n      png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL);\n\n   /* Else writing an 8-bit file and the *colors* aren't sRGB, but the 8-bit\n    * space must still be gamma encoded.\n    */\n   else\n      png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE);\n\n   /* Write the file header. */\n   png_write_info(png_ptr, info_ptr);\n\n   /* Now set up the data transformations (*after* the header is written),\n    * remove the handled transformations from the 'format' flags for checking.\n    *\n    * First check for a little endian system if writing 16-bit files.\n    */\n   if (write_16bit != 0)\n   {\n      PNG_CONST png_uint_16 le = 0x0001;\n\n      if ((*(png_const_bytep) & le) != 0)\n         png_set_swap(png_ptr);\n   }\n\n#   ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED\n      if ((format & PNG_FORMAT_FLAG_BGR) != 0)\n      {\n         if (colormap == 0 && (format & PNG_FORMAT_FLAG_COLOR) != 0)\n            png_set_bgr(png_ptr);\n         format &= ~PNG_FORMAT_FLAG_BGR;\n      }\n#   endif\n\n#   ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED\n      if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)\n      {\n         if (colormap == 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0)\n            png_set_swap_alpha(png_ptr);\n         format &= ~PNG_FORMAT_FLAG_AFIRST;\n      }\n#   endif\n\n   /* If there are 16 or fewer color-map entries we wrote a lower bit depth\n    * above, but the application data is still byte packed.\n    */\n   if (colormap != 0 && image->colormap_entries <= 16)\n      png_set_packing(png_ptr);\n\n   /* That should have handled all (both) the transforms. */\n   if ((format & ~(png_uint_32)(PNG_FORMAT_FLAG_COLOR | PNG_FORMAT_FLAG_LINEAR |\n         PNG_FORMAT_FLAG_ALPHA | PNG_FORMAT_FLAG_COLORMAP)) != 0)\n      png_error(png_ptr, \"png_write_image: unsupported transformation\");\n\n   {\n      png_const_bytep row = png_voidcast(png_const_bytep, display->buffer);\n      ptrdiff_t row_bytes = display->row_stride;\n\n      if (linear != 0)\n         row_bytes *= (sizeof (png_uint_16));\n\n      if (row_bytes < 0)\n         row += (image->height-1) * (-row_bytes);\n\n      display->first_row = row;\n      display->row_bytes = row_bytes;\n   }\n\n   /* Apply 'fast' options if the flag is set. */\n   if ((image->flags & PNG_IMAGE_FLAG_FAST) != 0)\n   {\n      png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, PNG_NO_FILTERS);\n      /* NOTE: determined by experiment using pngstest, this reflects some\n       * balance between the time to write the image once and the time to read\n       * it about 50 times.  The speed-up in pngstest was about 10-20% of the\n       * total (user) time on a heavily loaded system.\n       */\n#   ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED\n      png_set_compression_level(png_ptr, 3);\n#   endif\n   }\n\n   /* Check for the cases that currently require a pre-transform on the row\n    * before it is written.  This only applies when the input is 16-bit and\n    * either there is an alpha channel or it is converted to 8-bit.\n    */\n   if ((linear != 0 && alpha != 0 ) ||\n       (colormap == 0 && display->convert_to_8bit != 0))\n   {\n      png_bytep row = png_voidcast(png_bytep, png_malloc(png_ptr,\n         png_get_rowbytes(png_ptr, info_ptr)));\n      int result;\n\n      display->local_row = row;\n      if (write_16bit != 0)\n         result = png_safe_execute(image, png_write_image_16bit, display);\n      else\n         result = png_safe_execute(image, png_write_image_8bit, display);\n      display->local_row = NULL;\n\n      png_free(png_ptr, row);\n\n      /* Skip the 'write_end' on error: */\n      if (result == 0)\n         return 0;\n   }\n\n   /* Otherwise this is the case where the input is in a format currently\n    * supported by the rest of the libpng write code; call it directly.\n    */\n   else\n   {\n      png_const_bytep row = png_voidcast(png_const_bytep, display->first_row);\n      ptrdiff_t row_bytes = display->row_bytes;\n      png_uint_32 y = image->height;\n\n      while (y-- > 0)\n      {\n         png_write_row(png_ptr, row);\n         row += row_bytes;\n      }\n   }\n\n   png_write_end(png_ptr, info_ptr);\n   return 1;\n}\n\n\nstatic void (PNGCBAPI\nimage_memory_write)(png_structp png_ptr, png_bytep/*const*/ data,\n   png_size_t size)\n{\n   png_image_write_control *display = png_voidcast(png_image_write_control*,\n      png_ptr->io_ptr/*backdoor: png_get_io_ptr(png_ptr)*/);\n   const png_alloc_size_t ob = display->output_bytes;\n\n   /* Check for overflow; this should never happen: */\n   if (size <= ((png_alloc_size_t)-1) - ob)\n   {\n      /* I don't think libpng ever does this, but just in case: */\n      if (size > 0)\n      {\n         if (display->memory_bytes >= ob+size) /* writing */\n            memcpy(display->memory+ob, data, size);\n\n         /* Always update the size: */\n         display->output_bytes = ob+size;\n      }\n   }\n\n   else\n      png_error(png_ptr, \"png_image_write_to_memory: PNG too big\");\n}\n\nstatic void (PNGCBAPI\nimage_memory_flush)(png_structp png_ptr)\n{\n   PNG_UNUSED(png_ptr)\n}\n\nstatic int\npng_image_write_memory(png_voidp argument)\n{\n   png_image_write_control *display = png_voidcast(png_image_write_control*,\n      argument);\n\n   /* The rest of the memory-specific init and write_main in an error protected\n    * environment.  This case needs to use callbacks for the write operations\n    * since libpng has no built in support for writing to memory.\n    */\n   png_set_write_fn(display->image->opaque->png_ptr, display/*io_ptr*/,\n         image_memory_write, image_memory_flush);\n\n   return png_image_write_main(display);\n}\n\nint PNGAPI\npng_image_write_to_memory(png_imagep image, void *memory,\n   png_alloc_size_t * PNG_RESTRICT memory_bytes, int convert_to_8bit,\n   const void *buffer, png_int_32 row_stride, const void *colormap)\n{\n   /* Write the image to the given buffer, or count the bytes if it is NULL */\n   if (image != NULL && image->version == PNG_IMAGE_VERSION)\n   {\n      if (memory_bytes != NULL && buffer != NULL)\n      {\n         /* This is to give the caller an easier error detection in the NULL\n          * case and guard against uninitialized variable problems:\n          */\n         if (memory == NULL)\n            *memory_bytes = 0;\n\n         if (png_image_write_init(image) != 0)\n         {\n            png_image_write_control display;\n            int result;\n\n            memset(&display, 0, (sizeof display));\n            display.image = image;\n            display.buffer = buffer;\n            display.row_stride = row_stride;\n            display.colormap = colormap;\n            display.convert_to_8bit = convert_to_8bit;\n            display.memory = png_voidcast(png_bytep, memory);\n            display.memory_bytes = *memory_bytes;\n            display.output_bytes = 0;\n\n            result = png_safe_execute(image, png_image_write_memory, &display);\n            png_image_free(image);\n\n            /* write_memory returns true even if we ran out of buffer. */\n            if (result)\n            {\n               /* On out-of-buffer this function returns '0' but still updates\n                * memory_bytes:\n                */\n               if (memory != NULL && display.output_bytes > *memory_bytes)\n                  result = 0;\n\n               *memory_bytes = display.output_bytes;\n            }\n\n            return result;\n         }\n\n         else\n            return 0;\n      }\n\n      else\n         return png_image_error(image,\n            \"png_image_write_to_memory: invalid argument\");\n   }\n\n   else if (image != NULL)\n      return png_image_error(image,\n         \"png_image_write_to_memory: incorrect PNG_IMAGE_VERSION\");\n\n   else\n      return 0;\n}\n\n#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED\nint PNGAPI\npng_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit,\n   const void *buffer, png_int_32 row_stride, const void *colormap)\n{\n   /* Write the image to the given (FILE*). */\n   if (image != NULL && image->version == PNG_IMAGE_VERSION)\n   {\n      if (file != NULL && buffer != NULL)\n      {\n         if (png_image_write_init(image) != 0)\n         {\n            png_image_write_control display;\n            int result;\n\n            /* This is slightly evil, but png_init_io doesn't do anything other\n             * than this and we haven't changed the standard IO functions so\n             * this saves a 'safe' function.\n             */\n            image->opaque->png_ptr->io_ptr = file;\n\n            memset(&display, 0, (sizeof display));\n            display.image = image;\n            display.buffer = buffer;\n            display.row_stride = row_stride;\n            display.colormap = colormap;\n            display.convert_to_8bit = convert_to_8bit;\n\n            result = png_safe_execute(image, png_image_write_main, &display);\n            png_image_free(image);\n            return result;\n         }\n\n         else\n            return 0;\n      }\n\n      else\n         return png_image_error(image,\n            \"png_image_write_to_stdio: invalid argument\");\n   }\n\n   else if (image != NULL)\n      return png_image_error(image,\n         \"png_image_write_to_stdio: incorrect PNG_IMAGE_VERSION\");\n\n   else\n      return 0;\n}\n\nint PNGAPI\npng_image_write_to_file(png_imagep image, const char *file_name,\n   int convert_to_8bit, const void *buffer, png_int_32 row_stride,\n   const void *colormap)\n{\n   /* Write the image to the named file. */\n   if (image != NULL && image->version == PNG_IMAGE_VERSION)\n   {\n      if (file_name != NULL && buffer != NULL)\n      {\n         FILE *fp = fopen(file_name, \"wb\");\n\n         if (fp != NULL)\n         {\n            if (png_image_write_to_stdio(image, fp, convert_to_8bit, buffer,\n               row_stride, colormap) != 0)\n            {\n               int error; /* from fflush/fclose */\n\n               /* Make sure the file is flushed correctly. */\n               if (fflush(fp) == 0 && ferror(fp) == 0)\n               {\n                  if (fclose(fp) == 0)\n                     return 1;\n\n                  error = errno; /* from fclose */\n               }\n\n               else\n               {\n                  error = errno; /* from fflush or ferror */\n                  (void)fclose(fp);\n               }\n\n               (void)remove(file_name);\n               /* The image has already been cleaned up; this is just used to\n                * set the error (because the original write succeeded).\n                */\n               return png_image_error(image, strerror(error));\n            }\n\n            else\n            {\n               /* Clean up: just the opened file. */\n               (void)fclose(fp);\n               (void)remove(file_name);\n               return 0;\n            }\n         }\n\n         else\n            return png_image_error(image, strerror(errno));\n      }\n\n      else\n         return png_image_error(image,\n            \"png_image_write_to_file: invalid argument\");\n   }\n\n   else if (image != NULL)\n      return png_image_error(image,\n         \"png_image_write_to_file: incorrect PNG_IMAGE_VERSION\");\n\n   else\n      return 0;\n}\n#endif /* SIMPLIFIED_WRITE_STDIO */\n#endif /* SIMPLIFIED_WRITE */\n#endif /* WRITE */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngwtran.c",
    "content": "\n/* pngwtran.c - transforms the data in a row for PNG writers\n *\n * Last changed in libpng 1.6.18 [July 23, 2015]\n * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n#include \"pngpriv.h\"\n\n#ifdef PNG_WRITE_SUPPORTED\n#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED\n\n#ifdef PNG_WRITE_PACK_SUPPORTED\n/* Pack pixels into bytes.  Pass the true bit depth in bit_depth.  The\n * row_info bit depth should be 8 (one pixel per byte).  The channels\n * should be 1 (this only happens on grayscale and paletted images).\n */\nstatic void\npng_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)\n{\n   png_debug(1, \"in png_do_pack\");\n\n   if (row_info->bit_depth == 8 &&\n      row_info->channels == 1)\n   {\n      switch ((int)bit_depth)\n      {\n         case 1:\n         {\n            png_bytep sp, dp;\n            int mask, v;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            sp = row;\n            dp = row;\n            mask = 0x80;\n            v = 0;\n\n            for (i = 0; i < row_width; i++)\n            {\n               if (*sp != 0)\n                  v |= mask;\n\n               sp++;\n\n               if (mask > 1)\n                  mask >>= 1;\n\n               else\n               {\n                  mask = 0x80;\n                  *dp = (png_byte)v;\n                  dp++;\n                  v = 0;\n               }\n            }\n\n            if (mask != 0x80)\n               *dp = (png_byte)v;\n\n            break;\n         }\n\n         case 2:\n         {\n            png_bytep sp, dp;\n            unsigned int shift;\n            int v;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            sp = row;\n            dp = row;\n            shift = 6;\n            v = 0;\n\n            for (i = 0; i < row_width; i++)\n            {\n               png_byte value;\n\n               value = (png_byte)(*sp & 0x03);\n               v |= (value << shift);\n\n               if (shift == 0)\n               {\n                  shift = 6;\n                  *dp = (png_byte)v;\n                  dp++;\n                  v = 0;\n               }\n\n               else\n                  shift -= 2;\n\n               sp++;\n            }\n\n            if (shift != 6)\n               *dp = (png_byte)v;\n\n            break;\n         }\n\n         case 4:\n         {\n            png_bytep sp, dp;\n            unsigned int shift;\n            int v;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            sp = row;\n            dp = row;\n            shift = 4;\n            v = 0;\n\n            for (i = 0; i < row_width; i++)\n            {\n               png_byte value;\n\n               value = (png_byte)(*sp & 0x0f);\n               v |= (value << shift);\n\n               if (shift == 0)\n               {\n                  shift = 4;\n                  *dp = (png_byte)v;\n                  dp++;\n                  v = 0;\n               }\n\n               else\n                  shift -= 4;\n\n               sp++;\n            }\n\n            if (shift != 4)\n               *dp = (png_byte)v;\n\n            break;\n         }\n\n         default:\n            break;\n      }\n\n      row_info->bit_depth = (png_byte)bit_depth;\n      row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels);\n      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,\n          row_info->width);\n   }\n}\n#endif\n\n#ifdef PNG_WRITE_SHIFT_SUPPORTED\n/* Shift pixel values to take advantage of whole range.  Pass the\n * true number of bits in bit_depth.  The row should be packed\n * according to row_info->bit_depth.  Thus, if you had a row of\n * bit depth 4, but the pixels only had values from 0 to 7, you\n * would pass 3 as bit_depth, and this routine would translate the\n * data to 0 to 15.\n */\nstatic void\npng_do_shift(png_row_infop row_info, png_bytep row,\n    png_const_color_8p bit_depth)\n{\n   png_debug(1, \"in png_do_shift\");\n\n   if (row_info->color_type != PNG_COLOR_TYPE_PALETTE)\n   {\n      int shift_start[4], shift_dec[4];\n      int channels = 0;\n\n      if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)\n      {\n         shift_start[channels] = row_info->bit_depth - bit_depth->red;\n         shift_dec[channels] = bit_depth->red;\n         channels++;\n\n         shift_start[channels] = row_info->bit_depth - bit_depth->green;\n         shift_dec[channels] = bit_depth->green;\n         channels++;\n\n         shift_start[channels] = row_info->bit_depth - bit_depth->blue;\n         shift_dec[channels] = bit_depth->blue;\n         channels++;\n      }\n\n      else\n      {\n         shift_start[channels] = row_info->bit_depth - bit_depth->gray;\n         shift_dec[channels] = bit_depth->gray;\n         channels++;\n      }\n\n      if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)\n      {\n         shift_start[channels] = row_info->bit_depth - bit_depth->alpha;\n         shift_dec[channels] = bit_depth->alpha;\n         channels++;\n      }\n\n      /* With low row depths, could only be grayscale, so one channel */\n      if (row_info->bit_depth < 8)\n      {\n         png_bytep bp = row;\n         png_size_t i;\n         unsigned int mask;\n         png_size_t row_bytes = row_info->rowbytes;\n\n         if (bit_depth->gray == 1 && row_info->bit_depth == 2)\n            mask = 0x55;\n\n         else if (row_info->bit_depth == 4 && bit_depth->gray == 3)\n            mask = 0x11;\n\n         else\n            mask = 0xff;\n\n         for (i = 0; i < row_bytes; i++, bp++)\n         {\n            int j;\n            unsigned int v, out;\n\n            v = *bp;\n            out = 0;\n\n            for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0])\n            {\n               if (j > 0)\n                  out |= v << j;\n\n               else\n                  out |= (v >> (-j)) & mask;\n            }\n\n            *bp = (png_byte)(out & 0xff);\n         }\n      }\n\n      else if (row_info->bit_depth == 8)\n      {\n         png_bytep bp = row;\n         png_uint_32 i;\n         png_uint_32 istop = channels * row_info->width;\n\n         for (i = 0; i < istop; i++, bp++)\n         {\n\n            const unsigned int c = i%channels;\n            int j;\n            unsigned int v, out;\n\n            v = *bp;\n            out = 0;\n\n            for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])\n            {\n               if (j > 0)\n                  out |= v << j;\n\n               else\n                  out |= v >> (-j);\n            }\n\n            *bp = (png_byte)(out & 0xff);\n         }\n      }\n\n      else\n      {\n         png_bytep bp;\n         png_uint_32 i;\n         png_uint_32 istop = channels * row_info->width;\n\n         for (bp = row, i = 0; i < istop; i++)\n         {\n            const unsigned int c = i%channels;\n            int j;\n            unsigned int value, v;\n\n            v = png_get_uint_16(bp);\n            value = 0;\n\n            for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])\n            {\n               if (j > 0)\n                  value |= v << j;\n\n               else\n                  value |= v >> (-j);\n            }\n            *bp++ = (png_byte)((value >> 8) & 0xff);\n            *bp++ = (png_byte)(value & 0xff);\n         }\n      }\n   }\n}\n#endif\n\n#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED\nstatic void\npng_do_write_swap_alpha(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_write_swap_alpha\");\n\n   {\n      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n      {\n         if (row_info->bit_depth == 8)\n         {\n            /* This converts from ARGB to RGBA */\n            png_bytep sp, dp;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            for (i = 0, sp = dp = row; i < row_width; i++)\n            {\n               png_byte save = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = save;\n            }\n         }\n\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n         else\n         {\n            /* This converts from AARRGGBB to RRGGBBAA */\n            png_bytep sp, dp;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            for (i = 0, sp = dp = row; i < row_width; i++)\n            {\n               png_byte save[2];\n               save[0] = *(sp++);\n               save[1] = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = save[0];\n               *(dp++) = save[1];\n            }\n         }\n#endif /* WRITE_16BIT */\n      }\n\n      else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)\n      {\n         if (row_info->bit_depth == 8)\n         {\n            /* This converts from AG to GA */\n            png_bytep sp, dp;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            for (i = 0, sp = dp = row; i < row_width; i++)\n            {\n               png_byte save = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = save;\n            }\n         }\n\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n         else\n         {\n            /* This converts from AAGG to GGAA */\n            png_bytep sp, dp;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            for (i = 0, sp = dp = row; i < row_width; i++)\n            {\n               png_byte save[2];\n               save[0] = *(sp++);\n               save[1] = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = save[0];\n               *(dp++) = save[1];\n            }\n         }\n#endif /* WRITE_16BIT */\n      }\n   }\n}\n#endif\n\n#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED\nstatic void\npng_do_write_invert_alpha(png_row_infop row_info, png_bytep row)\n{\n   png_debug(1, \"in png_do_write_invert_alpha\");\n\n   {\n      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)\n      {\n         if (row_info->bit_depth == 8)\n         {\n            /* This inverts the alpha channel in RGBA */\n            png_bytep sp, dp;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            for (i = 0, sp = dp = row; i < row_width; i++)\n            {\n               /* Does nothing\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               */\n               sp+=3; dp = sp;\n               *dp = (png_byte)(255 - *(sp++));\n            }\n         }\n\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n         else\n         {\n            /* This inverts the alpha channel in RRGGBBAA */\n            png_bytep sp, dp;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            for (i = 0, sp = dp = row; i < row_width; i++)\n            {\n               /* Does nothing\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               */\n               sp+=6; dp = sp;\n               *(dp++) = (png_byte)(255 - *(sp++));\n               *dp     = (png_byte)(255 - *(sp++));\n            }\n         }\n#endif /* WRITE_16BIT */\n      }\n\n      else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)\n      {\n         if (row_info->bit_depth == 8)\n         {\n            /* This inverts the alpha channel in GA */\n            png_bytep sp, dp;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            for (i = 0, sp = dp = row; i < row_width; i++)\n            {\n               *(dp++) = *(sp++);\n               *(dp++) = (png_byte)(255 - *(sp++));\n            }\n         }\n\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n         else\n         {\n            /* This inverts the alpha channel in GGAA */\n            png_bytep sp, dp;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            for (i = 0, sp = dp = row; i < row_width; i++)\n            {\n               /* Does nothing\n               *(dp++) = *(sp++);\n               *(dp++) = *(sp++);\n               */\n               sp+=2; dp = sp;\n               *(dp++) = (png_byte)(255 - *(sp++));\n               *dp     = (png_byte)(255 - *(sp++));\n            }\n         }\n#endif /* WRITE_16BIT */\n      }\n   }\n}\n#endif\n\n/* Transform the data according to the user's wishes.  The order of\n * transformations is significant.\n */\nvoid /* PRIVATE */\npng_do_write_transformations(png_structrp png_ptr, png_row_infop row_info)\n{\n   png_debug(1, \"in png_do_write_transformations\");\n\n   if (png_ptr == NULL)\n      return;\n\n#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED\n   if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)\n      if (png_ptr->write_user_transform_fn != NULL)\n         (*(png_ptr->write_user_transform_fn)) /* User write transform\n                                                 function */\n             (png_ptr,  /* png_ptr */\n             row_info,  /* row_info: */\n                /*  png_uint_32 width;       width of row */\n                /*  png_size_t rowbytes;     number of bytes in row */\n                /*  png_byte color_type;     color type of pixels */\n                /*  png_byte bit_depth;      bit depth of samples */\n                /*  png_byte channels;       number of channels (1-4) */\n                /*  png_byte pixel_depth;    bits per pixel (depth*channels) */\n             png_ptr->row_buf + 1);      /* start of pixel data for row */\n#endif\n\n#ifdef PNG_WRITE_FILLER_SUPPORTED\n   if ((png_ptr->transformations & PNG_FILLER) != 0)\n      png_do_strip_channel(row_info, png_ptr->row_buf + 1,\n         !(png_ptr->flags & PNG_FLAG_FILLER_AFTER));\n#endif\n\n#ifdef PNG_WRITE_PACKSWAP_SUPPORTED\n   if ((png_ptr->transformations & PNG_PACKSWAP) != 0)\n      png_do_packswap(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_WRITE_PACK_SUPPORTED\n   if ((png_ptr->transformations & PNG_PACK) != 0)\n      png_do_pack(row_info, png_ptr->row_buf + 1,\n          (png_uint_32)png_ptr->bit_depth);\n#endif\n\n#ifdef PNG_WRITE_SWAP_SUPPORTED\n#  ifdef PNG_16BIT_SUPPORTED\n   if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)\n      png_do_swap(row_info, png_ptr->row_buf + 1);\n#  endif\n#endif\n\n#ifdef PNG_WRITE_SHIFT_SUPPORTED\n   if ((png_ptr->transformations & PNG_SHIFT) != 0)\n      png_do_shift(row_info, png_ptr->row_buf + 1,\n          &(png_ptr->shift));\n#endif\n\n#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED\n   if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0)\n      png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED\n   if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)\n      png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_WRITE_BGR_SUPPORTED\n   if ((png_ptr->transformations & PNG_BGR) != 0)\n      png_do_bgr(row_info, png_ptr->row_buf + 1);\n#endif\n\n#ifdef PNG_WRITE_INVERT_SUPPORTED\n   if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)\n      png_do_invert(row_info, png_ptr->row_buf + 1);\n#endif\n}\n#endif /* WRITE_TRANSFORMS */\n#endif /* WRITE */\n"
  },
  {
    "path": "libs/SDL2_png/src/pngwutil.c",
    "content": "\n/* pngwutil.c - utilities to write a PNG file\n *\n * Last changed in libpng 1.6.22 [May 26, 2016]\n * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\n * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\n * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\n *\n * This code is released under the libpng license.\n * For conditions of distribution and use, see the disclaimer\n * and license in png.h\n */\n\n#include \"pngpriv.h\"\n\n#ifdef PNG_WRITE_SUPPORTED\n\n#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED\n/* Place a 32-bit number into a buffer in PNG byte order.  We work\n * with unsigned numbers for convenience, although one supported\n * ancillary chunk uses signed (two's complement) numbers.\n */\nvoid PNGAPI\npng_save_uint_32(png_bytep buf, png_uint_32 i)\n{\n   buf[0] = (png_byte)((i >> 24) & 0xffU);\n   buf[1] = (png_byte)((i >> 16) & 0xffU);\n   buf[2] = (png_byte)((i >>  8) & 0xffU);\n   buf[3] = (png_byte)( i        & 0xffU);\n}\n\n/* Place a 16-bit number into a buffer in PNG byte order.\n * The parameter is declared unsigned int, not png_uint_16,\n * just to avoid potential problems on pre-ANSI C compilers.\n */\nvoid PNGAPI\npng_save_uint_16(png_bytep buf, unsigned int i)\n{\n   buf[0] = (png_byte)((i >> 8) & 0xffU);\n   buf[1] = (png_byte)( i       & 0xffU);\n}\n#endif\n\n/* Simple function to write the signature.  If we have already written\n * the magic bytes of the signature, or more likely, the PNG stream is\n * being embedded into another stream and doesn't need its own signature,\n * we should call png_set_sig_bytes() to tell libpng how many of the\n * bytes have already been written.\n */\nvoid PNGAPI\npng_write_sig(png_structrp png_ptr)\n{\n   png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   /* Inform the I/O callback that the signature is being written */\n   png_ptr->io_state = PNG_IO_WRITING | PNG_IO_SIGNATURE;\n#endif\n\n   /* Write the rest of the 8 byte signature */\n   png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes],\n      (png_size_t)(8 - png_ptr->sig_bytes));\n\n   if (png_ptr->sig_bytes < 3)\n      png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;\n}\n\n/* Write the start of a PNG chunk.  The type is the chunk type.\n * The total_length is the sum of the lengths of all the data you will be\n * passing in png_write_chunk_data().\n */\nstatic void\npng_write_chunk_header(png_structrp png_ptr, png_uint_32 chunk_name,\n    png_uint_32 length)\n{\n   png_byte buf[8];\n\n#if defined(PNG_DEBUG) && (PNG_DEBUG > 0)\n   PNG_CSTRING_FROM_CHUNK(buf, chunk_name);\n   png_debug2(0, \"Writing %s chunk, length = %lu\", buf, (unsigned long)length);\n#endif\n\n   if (png_ptr == NULL)\n      return;\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   /* Inform the I/O callback that the chunk header is being written.\n    * PNG_IO_CHUNK_HDR requires a single I/O call.\n    */\n   png_ptr->io_state = PNG_IO_WRITING | PNG_IO_CHUNK_HDR;\n#endif\n\n   /* Write the length and the chunk name */\n   png_save_uint_32(buf, length);\n   png_save_uint_32(buf + 4, chunk_name);\n   png_write_data(png_ptr, buf, 8);\n\n   /* Put the chunk name into png_ptr->chunk_name */\n   png_ptr->chunk_name = chunk_name;\n\n   /* Reset the crc and run it over the chunk name */\n   png_reset_crc(png_ptr);\n\n   png_calculate_crc(png_ptr, buf + 4, 4);\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   /* Inform the I/O callback that chunk data will (possibly) be written.\n    * PNG_IO_CHUNK_DATA does NOT require a specific number of I/O calls.\n    */\n   png_ptr->io_state = PNG_IO_WRITING | PNG_IO_CHUNK_DATA;\n#endif\n}\n\nvoid PNGAPI\npng_write_chunk_start(png_structrp png_ptr, png_const_bytep chunk_string,\n    png_uint_32 length)\n{\n   png_write_chunk_header(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), length);\n}\n\n/* Write the data of a PNG chunk started with png_write_chunk_header().\n * Note that multiple calls to this function are allowed, and that the\n * sum of the lengths from these calls *must* add up to the total_length\n * given to png_write_chunk_header().\n */\nvoid PNGAPI\npng_write_chunk_data(png_structrp png_ptr, png_const_bytep data,\n    png_size_t length)\n{\n   /* Write the data, and run the CRC over it */\n   if (png_ptr == NULL)\n      return;\n\n   if (data != NULL && length > 0)\n   {\n      png_write_data(png_ptr, data, length);\n\n      /* Update the CRC after writing the data,\n       * in case the user I/O routine alters it.\n       */\n      png_calculate_crc(png_ptr, data, length);\n   }\n}\n\n/* Finish a chunk started with png_write_chunk_header(). */\nvoid PNGAPI\npng_write_chunk_end(png_structrp png_ptr)\n{\n   png_byte buf[4];\n\n   if (png_ptr == NULL) return;\n\n#ifdef PNG_IO_STATE_SUPPORTED\n   /* Inform the I/O callback that the chunk CRC is being written.\n    * PNG_IO_CHUNK_CRC requires a single I/O function call.\n    */\n   png_ptr->io_state = PNG_IO_WRITING | PNG_IO_CHUNK_CRC;\n#endif\n\n   /* Write the crc in a single operation */\n   png_save_uint_32(buf, png_ptr->crc);\n\n   png_write_data(png_ptr, buf, (png_size_t)4);\n}\n\n/* Write a PNG chunk all at once.  The type is an array of ASCII characters\n * representing the chunk name.  The array must be at least 4 bytes in\n * length, and does not need to be null terminated.  To be safe, pass the\n * pre-defined chunk names here, and if you need a new one, define it\n * where the others are defined.  The length is the length of the data.\n * All the data must be present.  If that is not possible, use the\n * png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end()\n * functions instead.\n */\nstatic void\npng_write_complete_chunk(png_structrp png_ptr, png_uint_32 chunk_name,\n   png_const_bytep data, png_size_t length)\n{\n   if (png_ptr == NULL)\n      return;\n\n   /* On 64-bit architectures 'length' may not fit in a png_uint_32. */\n   if (length > PNG_UINT_31_MAX)\n      png_error(png_ptr, \"length exceeds PNG maximum\");\n\n   png_write_chunk_header(png_ptr, chunk_name, (png_uint_32)length);\n   png_write_chunk_data(png_ptr, data, length);\n   png_write_chunk_end(png_ptr);\n}\n\n/* This is the API that calls the internal function above. */\nvoid PNGAPI\npng_write_chunk(png_structrp png_ptr, png_const_bytep chunk_string,\n   png_const_bytep data, png_size_t length)\n{\n   png_write_complete_chunk(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), data,\n      length);\n}\n\n/* This is used below to find the size of an image to pass to png_deflate_claim,\n * so it only needs to be accurate if the size is less than 16384 bytes (the\n * point at which a lower LZ window size can be used.)\n */\nstatic png_alloc_size_t\npng_image_size(png_structrp png_ptr)\n{\n   /* Only return sizes up to the maximum of a png_uint_32; do this by limiting\n    * the width and height used to 15 bits.\n    */\n   png_uint_32 h = png_ptr->height;\n\n   if (png_ptr->rowbytes < 32768 && h < 32768)\n   {\n      if (png_ptr->interlaced != 0)\n      {\n         /* Interlacing makes the image larger because of the replication of\n          * both the filter byte and the padding to a byte boundary.\n          */\n         png_uint_32 w = png_ptr->width;\n         unsigned int pd = png_ptr->pixel_depth;\n         png_alloc_size_t cb_base;\n         int pass;\n\n         for (cb_base=0, pass=0; pass<=6; ++pass)\n         {\n            png_uint_32 pw = PNG_PASS_COLS(w, pass);\n\n            if (pw > 0)\n               cb_base += (PNG_ROWBYTES(pd, pw)+1) * PNG_PASS_ROWS(h, pass);\n         }\n\n         return cb_base;\n      }\n\n      else\n         return (png_ptr->rowbytes+1) * h;\n   }\n\n   else\n      return 0xffffffffU;\n}\n\n#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED\n   /* This is the code to hack the first two bytes of the deflate stream (the\n    * deflate header) to correct the windowBits value to match the actual data\n    * size.  Note that the second argument is the *uncompressed* size but the\n    * first argument is the *compressed* data (and it must be deflate\n    * compressed.)\n    */\nstatic void\noptimize_cmf(png_bytep data, png_alloc_size_t data_size)\n{\n   /* Optimize the CMF field in the zlib stream.  The resultant zlib stream is\n    * still compliant to the stream specification.\n    */\n   if (data_size <= 16384) /* else windowBits must be 15 */\n   {\n      unsigned int z_cmf = data[0];  /* zlib compression method and flags */\n\n      if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70)\n      {\n         unsigned int z_cinfo;\n         unsigned int half_z_window_size;\n\n         z_cinfo = z_cmf >> 4;\n         half_z_window_size = 1U << (z_cinfo + 7);\n\n         if (data_size <= half_z_window_size) /* else no change */\n         {\n            unsigned int tmp;\n\n            do\n            {\n               half_z_window_size >>= 1;\n               --z_cinfo;\n            }\n            while (z_cinfo > 0 && data_size <= half_z_window_size);\n\n            z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4);\n\n            data[0] = (png_byte)z_cmf;\n            tmp = data[1] & 0xe0;\n            tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f;\n            data[1] = (png_byte)tmp;\n         }\n      }\n   }\n}\n#endif /* WRITE_OPTIMIZE_CMF */\n\n/* Initialize the compressor for the appropriate type of compression. */\nstatic int\npng_deflate_claim(png_structrp png_ptr, png_uint_32 owner,\n   png_alloc_size_t data_size)\n{\n   if (png_ptr->zowner != 0)\n   {\n#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED)\n      char msg[64];\n\n      PNG_STRING_FROM_CHUNK(msg, owner);\n      msg[4] = ':';\n      msg[5] = ' ';\n      PNG_STRING_FROM_CHUNK(msg+6, png_ptr->zowner);\n      /* So the message that results is \"<chunk> using zstream\"; this is an\n       * internal error, but is very useful for debugging.  i18n requirements\n       * are minimal.\n       */\n      (void)png_safecat(msg, (sizeof msg), 10, \" using zstream\");\n#endif\n#if PNG_RELEASE_BUILD\n         png_warning(png_ptr, msg);\n\n         /* Attempt sane error recovery */\n         if (png_ptr->zowner == png_IDAT) /* don't steal from IDAT */\n         {\n            png_ptr->zstream.msg = PNGZ_MSG_CAST(\"in use by IDAT\");\n            return Z_STREAM_ERROR;\n         }\n\n         png_ptr->zowner = 0;\n#else\n         png_error(png_ptr, msg);\n#endif\n   }\n\n   {\n      int level = png_ptr->zlib_level;\n      int method = png_ptr->zlib_method;\n      int windowBits = png_ptr->zlib_window_bits;\n      int memLevel = png_ptr->zlib_mem_level;\n      int strategy; /* set below */\n      int ret; /* zlib return code */\n\n      if (owner == png_IDAT)\n      {\n         if ((png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY) != 0)\n            strategy = png_ptr->zlib_strategy;\n\n         else if (png_ptr->do_filter != PNG_FILTER_NONE)\n            strategy = PNG_Z_DEFAULT_STRATEGY;\n\n         else\n            strategy = PNG_Z_DEFAULT_NOFILTER_STRATEGY;\n      }\n\n      else\n      {\n#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED\n            level = png_ptr->zlib_text_level;\n            method = png_ptr->zlib_text_method;\n            windowBits = png_ptr->zlib_text_window_bits;\n            memLevel = png_ptr->zlib_text_mem_level;\n            strategy = png_ptr->zlib_text_strategy;\n#else\n            /* If customization is not supported the values all come from the\n             * IDAT values except for the strategy, which is fixed to the\n             * default.  (This is the pre-1.6.0 behavior too, although it was\n             * implemented in a very different way.)\n             */\n            strategy = Z_DEFAULT_STRATEGY;\n#endif\n      }\n\n      /* Adjust 'windowBits' down if larger than 'data_size'; to stop this\n       * happening just pass 32768 as the data_size parameter.  Notice that zlib\n       * requires an extra 262 bytes in the window in addition to the data to be\n       * able to see the whole of the data, so if data_size+262 takes us to the\n       * next windowBits size we need to fix up the value later.  (Because even\n       * though deflate needs the extra window, inflate does not!)\n       */\n      if (data_size <= 16384)\n      {\n         /* IMPLEMENTATION NOTE: this 'half_window_size' stuff is only here to\n          * work round a Microsoft Visual C misbehavior which, contrary to C-90,\n          * widens the result of the following shift to 64-bits if (and,\n          * apparently, only if) it is used in a test.\n          */\n         unsigned int half_window_size = 1U << (windowBits-1);\n\n         while (data_size + 262 <= half_window_size)\n         {\n            half_window_size >>= 1;\n            --windowBits;\n         }\n      }\n\n      /* Check against the previous initialized values, if any. */\n      if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0 &&\n         (png_ptr->zlib_set_level != level ||\n         png_ptr->zlib_set_method != method ||\n         png_ptr->zlib_set_window_bits != windowBits ||\n         png_ptr->zlib_set_mem_level != memLevel ||\n         png_ptr->zlib_set_strategy != strategy))\n      {\n         if (deflateEnd(&png_ptr->zstream) != Z_OK)\n            png_warning(png_ptr, \"deflateEnd failed (ignored)\");\n\n         png_ptr->flags &= ~PNG_FLAG_ZSTREAM_INITIALIZED;\n      }\n\n      /* For safety clear out the input and output pointers (currently zlib\n       * doesn't use them on Init, but it might in the future).\n       */\n      png_ptr->zstream.next_in = NULL;\n      png_ptr->zstream.avail_in = 0;\n      png_ptr->zstream.next_out = NULL;\n      png_ptr->zstream.avail_out = 0;\n\n      /* Now initialize if required, setting the new parameters, otherwise just\n       * to a simple reset to the previous parameters.\n       */\n      if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)\n         ret = deflateReset(&png_ptr->zstream);\n\n      else\n      {\n         ret = deflateInit2(&png_ptr->zstream, level, method, windowBits,\n            memLevel, strategy);\n\n         if (ret == Z_OK)\n            png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED;\n      }\n\n      /* The return code is from either deflateReset or deflateInit2; they have\n       * pretty much the same set of error codes.\n       */\n      if (ret == Z_OK)\n         png_ptr->zowner = owner;\n\n      else\n         png_zstream_error(png_ptr, ret);\n\n      return ret;\n   }\n}\n\n/* Clean up (or trim) a linked list of compression buffers. */\nvoid /* PRIVATE */\npng_free_buffer_list(png_structrp png_ptr, png_compression_bufferp *listp)\n{\n   png_compression_bufferp list = *listp;\n\n   if (list != NULL)\n   {\n      *listp = NULL;\n\n      do\n      {\n         png_compression_bufferp next = list->next;\n\n         png_free(png_ptr, list);\n         list = next;\n      }\n      while (list != NULL);\n   }\n}\n\n#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED\n/* This pair of functions encapsulates the operation of (a) compressing a\n * text string, and (b) issuing it later as a series of chunk data writes.\n * The compression_state structure is shared context for these functions\n * set up by the caller to allow access to the relevant local variables.\n *\n * compression_buffer (new in 1.6.0) is just a linked list of zbuffer_size\n * temporary buffers.  From 1.6.0 it is retained in png_struct so that it will\n * be correctly freed in the event of a write error (previous implementations\n * just leaked memory.)\n */\ntypedef struct\n{\n   png_const_bytep      input;        /* The uncompressed input data */\n   png_alloc_size_t     input_len;    /* Its length */\n   png_uint_32          output_len;   /* Final compressed length */\n   png_byte             output[1024]; /* First block of output */\n} compression_state;\n\nstatic void\npng_text_compress_init(compression_state *comp, png_const_bytep input,\n   png_alloc_size_t input_len)\n{\n   comp->input = input;\n   comp->input_len = input_len;\n   comp->output_len = 0;\n}\n\n/* Compress the data in the compression state input */\nstatic int\npng_text_compress(png_structrp png_ptr, png_uint_32 chunk_name,\n   compression_state *comp, png_uint_32 prefix_len)\n{\n   int ret;\n\n   /* To find the length of the output it is necessary to first compress the\n    * input. The result is buffered rather than using the two-pass algorithm\n    * that is used on the inflate side; deflate is assumed to be slower and a\n    * PNG writer is assumed to have more memory available than a PNG reader.\n    *\n    * IMPLEMENTATION NOTE: the zlib API deflateBound() can be used to find an\n    * upper limit on the output size, but it is always bigger than the input\n    * size so it is likely to be more efficient to use this linked-list\n    * approach.\n    */\n   ret = png_deflate_claim(png_ptr, chunk_name, comp->input_len);\n\n   if (ret != Z_OK)\n      return ret;\n\n   /* Set up the compression buffers, we need a loop here to avoid overflowing a\n    * uInt.  Use ZLIB_IO_MAX to limit the input.  The output is always limited\n    * by the output buffer size, so there is no need to check that.  Since this\n    * is ANSI-C we know that an 'int', hence a uInt, is always at least 16 bits\n    * in size.\n    */\n   {\n      png_compression_bufferp *end = &png_ptr->zbuffer_list;\n      png_alloc_size_t input_len = comp->input_len; /* may be zero! */\n      png_uint_32 output_len;\n\n      /* zlib updates these for us: */\n      png_ptr->zstream.next_in = PNGZ_INPUT_CAST(comp->input);\n      png_ptr->zstream.avail_in = 0; /* Set below */\n      png_ptr->zstream.next_out = comp->output;\n      png_ptr->zstream.avail_out = (sizeof comp->output);\n\n      output_len = png_ptr->zstream.avail_out;\n\n      do\n      {\n         uInt avail_in = ZLIB_IO_MAX;\n\n         if (avail_in > input_len)\n            avail_in = (uInt)input_len;\n\n         input_len -= avail_in;\n\n         png_ptr->zstream.avail_in = avail_in;\n\n         if (png_ptr->zstream.avail_out == 0)\n         {\n            png_compression_buffer *next;\n\n            /* Chunk data is limited to 2^31 bytes in length, so the prefix\n             * length must be counted here.\n             */\n            if (output_len + prefix_len > PNG_UINT_31_MAX)\n            {\n               ret = Z_MEM_ERROR;\n               break;\n            }\n\n            /* Need a new (malloc'ed) buffer, but there may be one present\n             * already.\n             */\n            next = *end;\n            if (next == NULL)\n            {\n               next = png_voidcast(png_compression_bufferp, png_malloc_base\n                  (png_ptr, PNG_COMPRESSION_BUFFER_SIZE(png_ptr)));\n\n               if (next == NULL)\n               {\n                  ret = Z_MEM_ERROR;\n                  break;\n               }\n\n               /* Link in this buffer (so that it will be freed later) */\n               next->next = NULL;\n               *end = next;\n            }\n\n            png_ptr->zstream.next_out = next->output;\n            png_ptr->zstream.avail_out = png_ptr->zbuffer_size;\n            output_len += png_ptr->zstream.avail_out;\n\n            /* Move 'end' to the next buffer pointer. */\n            end = &next->next;\n         }\n\n         /* Compress the data */\n         ret = deflate(&png_ptr->zstream,\n            input_len > 0 ? Z_NO_FLUSH : Z_FINISH);\n\n         /* Claw back input data that was not consumed (because avail_in is\n          * reset above every time round the loop).\n          */\n         input_len += png_ptr->zstream.avail_in;\n         png_ptr->zstream.avail_in = 0; /* safety */\n      }\n      while (ret == Z_OK);\n\n      /* There may be some space left in the last output buffer. This needs to\n       * be subtracted from output_len.\n       */\n      output_len -= png_ptr->zstream.avail_out;\n      png_ptr->zstream.avail_out = 0; /* safety */\n      comp->output_len = output_len;\n\n      /* Now double check the output length, put in a custom message if it is\n       * too long.  Otherwise ensure the z_stream::msg pointer is set to\n       * something.\n       */\n      if (output_len + prefix_len >= PNG_UINT_31_MAX)\n      {\n         png_ptr->zstream.msg = PNGZ_MSG_CAST(\"compressed data too long\");\n         ret = Z_MEM_ERROR;\n      }\n\n      else\n         png_zstream_error(png_ptr, ret);\n\n      /* Reset zlib for another zTXt/iTXt or image data */\n      png_ptr->zowner = 0;\n\n      /* The only success case is Z_STREAM_END, input_len must be 0; if not this\n       * is an internal error.\n       */\n      if (ret == Z_STREAM_END && input_len == 0)\n      {\n#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED\n         /* Fix up the deflate header, if required */\n         optimize_cmf(comp->output, comp->input_len);\n#endif\n         /* But Z_OK is returned, not Z_STREAM_END; this allows the claim\n          * function above to return Z_STREAM_END on an error (though it never\n          * does in the current versions of zlib.)\n          */\n         return Z_OK;\n      }\n\n      else\n         return ret;\n   }\n}\n\n/* Ship the compressed text out via chunk writes */\nstatic void\npng_write_compressed_data_out(png_structrp png_ptr, compression_state *comp)\n{\n   png_uint_32 output_len = comp->output_len;\n   png_const_bytep output = comp->output;\n   png_uint_32 avail = (sizeof comp->output);\n   png_compression_buffer *next = png_ptr->zbuffer_list;\n\n   for (;;)\n   {\n      if (avail > output_len)\n         avail = output_len;\n\n      png_write_chunk_data(png_ptr, output, avail);\n\n      output_len -= avail;\n\n      if (output_len == 0 || next == NULL)\n         break;\n\n      avail = png_ptr->zbuffer_size;\n      output = next->output;\n      next = next->next;\n   }\n\n   /* This is an internal error; 'next' must have been NULL! */\n   if (output_len > 0)\n      png_error(png_ptr, \"error writing ancillary chunked compressed data\");\n}\n#endif /* WRITE_COMPRESSED_TEXT */\n\n/* Write the IHDR chunk, and update the png_struct with the necessary\n * information.  Note that the rest of this code depends upon this\n * information being correct.\n */\nvoid /* PRIVATE */\npng_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height,\n    int bit_depth, int color_type, int compression_type, int filter_type,\n    int interlace_type)\n{\n   png_byte buf[13]; /* Buffer to store the IHDR info */\n\n   png_debug(1, \"in png_write_IHDR\");\n\n   /* Check that we have valid input data from the application info */\n   switch (color_type)\n   {\n      case PNG_COLOR_TYPE_GRAY:\n         switch (bit_depth)\n         {\n            case 1:\n            case 2:\n            case 4:\n            case 8:\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n            case 16:\n#endif\n               png_ptr->channels = 1; break;\n\n            default:\n               png_error(png_ptr,\n                   \"Invalid bit depth for grayscale image\");\n         }\n         break;\n\n      case PNG_COLOR_TYPE_RGB:\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n         if (bit_depth != 8 && bit_depth != 16)\n#else\n         if (bit_depth != 8)\n#endif\n            png_error(png_ptr, \"Invalid bit depth for RGB image\");\n\n         png_ptr->channels = 3;\n         break;\n\n      case PNG_COLOR_TYPE_PALETTE:\n         switch (bit_depth)\n         {\n            case 1:\n            case 2:\n            case 4:\n            case 8:\n               png_ptr->channels = 1;\n               break;\n\n            default:\n               png_error(png_ptr, \"Invalid bit depth for paletted image\");\n         }\n         break;\n\n      case PNG_COLOR_TYPE_GRAY_ALPHA:\n         if (bit_depth != 8 && bit_depth != 16)\n            png_error(png_ptr, \"Invalid bit depth for grayscale+alpha image\");\n\n         png_ptr->channels = 2;\n         break;\n\n      case PNG_COLOR_TYPE_RGB_ALPHA:\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n         if (bit_depth != 8 && bit_depth != 16)\n#else\n         if (bit_depth != 8)\n#endif\n            png_error(png_ptr, \"Invalid bit depth for RGBA image\");\n\n         png_ptr->channels = 4;\n         break;\n\n      default:\n         png_error(png_ptr, \"Invalid image color type specified\");\n   }\n\n   if (compression_type != PNG_COMPRESSION_TYPE_BASE)\n   {\n      png_warning(png_ptr, \"Invalid compression type specified\");\n      compression_type = PNG_COMPRESSION_TYPE_BASE;\n   }\n\n   /* Write filter_method 64 (intrapixel differencing) only if\n    * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and\n    * 2. Libpng did not write a PNG signature (this filter_method is only\n    *    used in PNG datastreams that are embedded in MNG datastreams) and\n    * 3. The application called png_permit_mng_features with a mask that\n    *    included PNG_FLAG_MNG_FILTER_64 and\n    * 4. The filter_method is 64 and\n    * 5. The color_type is RGB or RGBA\n    */\n   if (\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n       !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&\n       ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) &&\n       (color_type == PNG_COLOR_TYPE_RGB ||\n        color_type == PNG_COLOR_TYPE_RGB_ALPHA) &&\n       (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) &&\n#endif\n       filter_type != PNG_FILTER_TYPE_BASE)\n   {\n      png_warning(png_ptr, \"Invalid filter type specified\");\n      filter_type = PNG_FILTER_TYPE_BASE;\n   }\n\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n   if (interlace_type != PNG_INTERLACE_NONE &&\n       interlace_type != PNG_INTERLACE_ADAM7)\n   {\n      png_warning(png_ptr, \"Invalid interlace type specified\");\n      interlace_type = PNG_INTERLACE_ADAM7;\n   }\n#else\n   interlace_type=PNG_INTERLACE_NONE;\n#endif\n\n   /* Save the relevant information */\n   png_ptr->bit_depth = (png_byte)bit_depth;\n   png_ptr->color_type = (png_byte)color_type;\n   png_ptr->interlaced = (png_byte)interlace_type;\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n   png_ptr->filter_type = (png_byte)filter_type;\n#endif\n   png_ptr->compression_type = (png_byte)compression_type;\n   png_ptr->width = width;\n   png_ptr->height = height;\n\n   png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels);\n   png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width);\n   /* Set the usr info, so any transformations can modify it */\n   png_ptr->usr_width = png_ptr->width;\n   png_ptr->usr_bit_depth = png_ptr->bit_depth;\n   png_ptr->usr_channels = png_ptr->channels;\n\n   /* Pack the header information into the buffer */\n   png_save_uint_32(buf, width);\n   png_save_uint_32(buf + 4, height);\n   buf[8] = (png_byte)bit_depth;\n   buf[9] = (png_byte)color_type;\n   buf[10] = (png_byte)compression_type;\n   buf[11] = (png_byte)filter_type;\n   buf[12] = (png_byte)interlace_type;\n\n   /* Write the chunk */\n   png_write_complete_chunk(png_ptr, png_IHDR, buf, (png_size_t)13);\n\n   if ((png_ptr->do_filter) == PNG_NO_FILTERS)\n   {\n      if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE ||\n          png_ptr->bit_depth < 8)\n         png_ptr->do_filter = PNG_FILTER_NONE;\n\n      else\n         png_ptr->do_filter = PNG_ALL_FILTERS;\n   }\n\n   png_ptr->mode = PNG_HAVE_IHDR; /* not READY_FOR_ZTXT */\n}\n\n/* Write the palette.  We are careful not to trust png_color to be in the\n * correct order for PNG, so people can redefine it to any convenient\n * structure.\n */\nvoid /* PRIVATE */\npng_write_PLTE(png_structrp png_ptr, png_const_colorp palette,\n    png_uint_32 num_pal)\n{\n   png_uint_32 max_palette_length, i;\n   png_const_colorp pal_ptr;\n   png_byte buf[3];\n\n   png_debug(1, \"in png_write_PLTE\");\n\n   max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?\n      (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;\n\n   if ((\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n       (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0 &&\n#endif\n       num_pal == 0) || num_pal > max_palette_length)\n   {\n      if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\n      {\n         png_error(png_ptr, \"Invalid number of colors in palette\");\n      }\n\n      else\n      {\n         png_warning(png_ptr, \"Invalid number of colors in palette\");\n         return;\n      }\n   }\n\n   if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)\n   {\n      png_warning(png_ptr,\n          \"Ignoring request to write a PLTE chunk in grayscale PNG\");\n\n      return;\n   }\n\n   png_ptr->num_palette = (png_uint_16)num_pal;\n   png_debug1(3, \"num_palette = %d\", png_ptr->num_palette);\n\n   png_write_chunk_header(png_ptr, png_PLTE, (png_uint_32)(num_pal * 3));\n#ifdef PNG_POINTER_INDEXING_SUPPORTED\n\n   for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++)\n   {\n      buf[0] = pal_ptr->red;\n      buf[1] = pal_ptr->green;\n      buf[2] = pal_ptr->blue;\n      png_write_chunk_data(png_ptr, buf, (png_size_t)3);\n   }\n\n#else\n   /* This is a little slower but some buggy compilers need to do this\n    * instead\n    */\n   pal_ptr=palette;\n\n   for (i = 0; i < num_pal; i++)\n   {\n      buf[0] = pal_ptr[i].red;\n      buf[1] = pal_ptr[i].green;\n      buf[2] = pal_ptr[i].blue;\n      png_write_chunk_data(png_ptr, buf, (png_size_t)3);\n   }\n\n#endif\n   png_write_chunk_end(png_ptr);\n   png_ptr->mode |= PNG_HAVE_PLTE;\n}\n\n/* This is similar to png_text_compress, above, except that it does not require\n * all of the data at once and, instead of buffering the compressed result,\n * writes it as IDAT chunks.  Unlike png_text_compress it *can* png_error out\n * because it calls the write interface.  As a result it does its own error\n * reporting and does not return an error code.  In the event of error it will\n * just call png_error.  The input data length may exceed 32-bits.  The 'flush'\n * parameter is exactly the same as that to deflate, with the following\n * meanings:\n *\n * Z_NO_FLUSH: normal incremental output of compressed data\n * Z_SYNC_FLUSH: do a SYNC_FLUSH, used by png_write_flush\n * Z_FINISH: this is the end of the input, do a Z_FINISH and clean up\n *\n * The routine manages the acquire and release of the png_ptr->zstream by\n * checking and (at the end) clearing png_ptr->zowner; it does some sanity\n * checks on the 'mode' flags while doing this.\n */\nvoid /* PRIVATE */\npng_compress_IDAT(png_structrp png_ptr, png_const_bytep input,\n   png_alloc_size_t input_len, int flush)\n{\n   if (png_ptr->zowner != png_IDAT)\n   {\n      /* First time.   Ensure we have a temporary buffer for compression and\n       * trim the buffer list if it has more than one entry to free memory.\n       * If 'WRITE_COMPRESSED_TEXT' is not set the list will never have been\n       * created at this point, but the check here is quick and safe.\n       */\n      if (png_ptr->zbuffer_list == NULL)\n      {\n         png_ptr->zbuffer_list = png_voidcast(png_compression_bufferp,\n            png_malloc(png_ptr, PNG_COMPRESSION_BUFFER_SIZE(png_ptr)));\n         png_ptr->zbuffer_list->next = NULL;\n      }\n\n      else\n         png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list->next);\n\n      /* It is a terminal error if we can't claim the zstream. */\n      if (png_deflate_claim(png_ptr, png_IDAT, png_image_size(png_ptr)) != Z_OK)\n         png_error(png_ptr, png_ptr->zstream.msg);\n\n      /* The output state is maintained in png_ptr->zstream, so it must be\n       * initialized here after the claim.\n       */\n      png_ptr->zstream.next_out = png_ptr->zbuffer_list->output;\n      png_ptr->zstream.avail_out = png_ptr->zbuffer_size;\n   }\n\n   /* Now loop reading and writing until all the input is consumed or an error\n    * terminates the operation.  The _out values are maintained across calls to\n    * this function, but the input must be reset each time.\n    */\n   png_ptr->zstream.next_in = PNGZ_INPUT_CAST(input);\n   png_ptr->zstream.avail_in = 0; /* set below */\n   for (;;)\n   {\n      int ret;\n\n      /* INPUT: from the row data */\n      uInt avail = ZLIB_IO_MAX;\n\n      if (avail > input_len)\n         avail = (uInt)input_len; /* safe because of the check */\n\n      png_ptr->zstream.avail_in = avail;\n      input_len -= avail;\n\n      ret = deflate(&png_ptr->zstream, input_len > 0 ? Z_NO_FLUSH : flush);\n\n      /* Include as-yet unconsumed input */\n      input_len += png_ptr->zstream.avail_in;\n      png_ptr->zstream.avail_in = 0;\n\n      /* OUTPUT: write complete IDAT chunks when avail_out drops to zero. Note\n       * that these two zstream fields are preserved across the calls, therefore\n       * there is no need to set these up on entry to the loop.\n       */\n      if (png_ptr->zstream.avail_out == 0)\n      {\n         png_bytep data = png_ptr->zbuffer_list->output;\n         uInt size = png_ptr->zbuffer_size;\n\n         /* Write an IDAT containing the data then reset the buffer.  The\n          * first IDAT may need deflate header optimization.\n          */\n#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED\n            if ((png_ptr->mode & PNG_HAVE_IDAT) == 0 &&\n                png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE)\n               optimize_cmf(data, png_image_size(png_ptr));\n#endif\n\n         png_write_complete_chunk(png_ptr, png_IDAT, data, size);\n         png_ptr->mode |= PNG_HAVE_IDAT;\n\n         png_ptr->zstream.next_out = data;\n         png_ptr->zstream.avail_out = size;\n\n         /* For SYNC_FLUSH or FINISH it is essential to keep calling zlib with\n          * the same flush parameter until it has finished output, for NO_FLUSH\n          * it doesn't matter.\n          */\n         if (ret == Z_OK && flush != Z_NO_FLUSH)\n            continue;\n      }\n\n      /* The order of these checks doesn't matter much; it just affects which\n       * possible error might be detected if multiple things go wrong at once.\n       */\n      if (ret == Z_OK) /* most likely return code! */\n      {\n         /* If all the input has been consumed then just return.  If Z_FINISH\n          * was used as the flush parameter something has gone wrong if we get\n          * here.\n          */\n         if (input_len == 0)\n         {\n            if (flush == Z_FINISH)\n               png_error(png_ptr, \"Z_OK on Z_FINISH with output space\");\n\n            return;\n         }\n      }\n\n      else if (ret == Z_STREAM_END && flush == Z_FINISH)\n      {\n         /* This is the end of the IDAT data; any pending output must be\n          * flushed.  For small PNG files we may still be at the beginning.\n          */\n         png_bytep data = png_ptr->zbuffer_list->output;\n         uInt size = png_ptr->zbuffer_size - png_ptr->zstream.avail_out;\n\n#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED\n         if ((png_ptr->mode & PNG_HAVE_IDAT) == 0 &&\n             png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE)\n            optimize_cmf(data, png_image_size(png_ptr));\n#endif\n\n         png_write_complete_chunk(png_ptr, png_IDAT, data, size);\n         png_ptr->zstream.avail_out = 0;\n         png_ptr->zstream.next_out = NULL;\n         png_ptr->mode |= PNG_HAVE_IDAT | PNG_AFTER_IDAT;\n\n         png_ptr->zowner = 0; /* Release the stream */\n         return;\n      }\n\n      else\n      {\n         /* This is an error condition. */\n         png_zstream_error(png_ptr, ret);\n         png_error(png_ptr, png_ptr->zstream.msg);\n      }\n   }\n}\n\n/* Write an IEND chunk */\nvoid /* PRIVATE */\npng_write_IEND(png_structrp png_ptr)\n{\n   png_debug(1, \"in png_write_IEND\");\n\n   png_write_complete_chunk(png_ptr, png_IEND, NULL, (png_size_t)0);\n   png_ptr->mode |= PNG_HAVE_IEND;\n}\n\n#ifdef PNG_WRITE_gAMA_SUPPORTED\n/* Write a gAMA chunk */\nvoid /* PRIVATE */\npng_write_gAMA_fixed(png_structrp png_ptr, png_fixed_point file_gamma)\n{\n   png_byte buf[4];\n\n   png_debug(1, \"in png_write_gAMA\");\n\n   /* file_gamma is saved in 1/100,000ths */\n   png_save_uint_32(buf, (png_uint_32)file_gamma);\n   png_write_complete_chunk(png_ptr, png_gAMA, buf, (png_size_t)4);\n}\n#endif\n\n#ifdef PNG_WRITE_sRGB_SUPPORTED\n/* Write a sRGB chunk */\nvoid /* PRIVATE */\npng_write_sRGB(png_structrp png_ptr, int srgb_intent)\n{\n   png_byte buf[1];\n\n   png_debug(1, \"in png_write_sRGB\");\n\n   if (srgb_intent >= PNG_sRGB_INTENT_LAST)\n      png_warning(png_ptr,\n          \"Invalid sRGB rendering intent specified\");\n\n   buf[0]=(png_byte)srgb_intent;\n   png_write_complete_chunk(png_ptr, png_sRGB, buf, (png_size_t)1);\n}\n#endif\n\n#ifdef PNG_WRITE_iCCP_SUPPORTED\n/* Write an iCCP chunk */\nvoid /* PRIVATE */\npng_write_iCCP(png_structrp png_ptr, png_const_charp name,\n    png_const_bytep profile)\n{\n   png_uint_32 name_len;\n   png_uint_32 profile_len;\n   png_byte new_name[81]; /* 1 byte for the compression byte */\n   compression_state comp;\n   png_uint_32 temp;\n\n   png_debug(1, \"in png_write_iCCP\");\n\n   /* These are all internal problems: the profile should have been checked\n    * before when it was stored.\n    */\n   if (profile == NULL)\n      png_error(png_ptr, \"No profile for iCCP chunk\"); /* internal error */\n\n   profile_len = png_get_uint_32(profile);\n\n   if (profile_len < 132)\n      png_error(png_ptr, \"ICC profile too short\");\n\n   temp = (png_uint_32) (*(profile+8));\n   if (temp > 3 && (profile_len & 0x03))\n      png_error(png_ptr, \"ICC profile length invalid (not a multiple of 4)\");\n\n   {\n      png_uint_32 embedded_profile_len = png_get_uint_32(profile);\n\n      if (profile_len != embedded_profile_len)\n         png_error(png_ptr, \"Profile length does not match profile\");\n   }\n\n   name_len = png_check_keyword(png_ptr, name, new_name);\n\n   if (name_len == 0)\n      png_error(png_ptr, \"iCCP: invalid keyword\");\n\n   new_name[++name_len] = PNG_COMPRESSION_TYPE_BASE;\n\n   /* Make sure we include the NULL after the name and the compression type */\n   ++name_len;\n\n   png_text_compress_init(&comp, profile, profile_len);\n\n   /* Allow for keyword terminator and compression byte */\n   if (png_text_compress(png_ptr, png_iCCP, &comp, name_len) != Z_OK)\n      png_error(png_ptr, png_ptr->zstream.msg);\n\n   png_write_chunk_header(png_ptr, png_iCCP, name_len + comp.output_len);\n\n   png_write_chunk_data(png_ptr, new_name, name_len);\n\n   png_write_compressed_data_out(png_ptr, &comp);\n\n   png_write_chunk_end(png_ptr);\n}\n#endif\n\n#ifdef PNG_WRITE_sPLT_SUPPORTED\n/* Write a sPLT chunk */\nvoid /* PRIVATE */\npng_write_sPLT(png_structrp png_ptr, png_const_sPLT_tp spalette)\n{\n   png_uint_32 name_len;\n   png_byte new_name[80];\n   png_byte entrybuf[10];\n   png_size_t entry_size = (spalette->depth == 8 ? 6 : 10);\n   png_size_t palette_size = entry_size * spalette->nentries;\n   png_sPLT_entryp ep;\n#ifndef PNG_POINTER_INDEXING_SUPPORTED\n   int i;\n#endif\n\n   png_debug(1, \"in png_write_sPLT\");\n\n   name_len = png_check_keyword(png_ptr, spalette->name, new_name);\n\n   if (name_len == 0)\n      png_error(png_ptr, \"sPLT: invalid keyword\");\n\n   /* Make sure we include the NULL after the name */\n   png_write_chunk_header(png_ptr, png_sPLT,\n       (png_uint_32)(name_len + 2 + palette_size));\n\n   png_write_chunk_data(png_ptr, (png_bytep)new_name,\n       (png_size_t)(name_len + 1));\n\n   png_write_chunk_data(png_ptr, &spalette->depth, (png_size_t)1);\n\n   /* Loop through each palette entry, writing appropriately */\n#ifdef PNG_POINTER_INDEXING_SUPPORTED\n   for (ep = spalette->entries; ep<spalette->entries + spalette->nentries; ep++)\n   {\n      if (spalette->depth == 8)\n      {\n         entrybuf[0] = (png_byte)ep->red;\n         entrybuf[1] = (png_byte)ep->green;\n         entrybuf[2] = (png_byte)ep->blue;\n         entrybuf[3] = (png_byte)ep->alpha;\n         png_save_uint_16(entrybuf + 4, ep->frequency);\n      }\n\n      else\n      {\n         png_save_uint_16(entrybuf + 0, ep->red);\n         png_save_uint_16(entrybuf + 2, ep->green);\n         png_save_uint_16(entrybuf + 4, ep->blue);\n         png_save_uint_16(entrybuf + 6, ep->alpha);\n         png_save_uint_16(entrybuf + 8, ep->frequency);\n      }\n\n      png_write_chunk_data(png_ptr, entrybuf, entry_size);\n   }\n#else\n   ep=spalette->entries;\n   for (i = 0; i>spalette->nentries; i++)\n   {\n      if (spalette->depth == 8)\n      {\n         entrybuf[0] = (png_byte)ep[i].red;\n         entrybuf[1] = (png_byte)ep[i].green;\n         entrybuf[2] = (png_byte)ep[i].blue;\n         entrybuf[3] = (png_byte)ep[i].alpha;\n         png_save_uint_16(entrybuf + 4, ep[i].frequency);\n      }\n\n      else\n      {\n         png_save_uint_16(entrybuf + 0, ep[i].red);\n         png_save_uint_16(entrybuf + 2, ep[i].green);\n         png_save_uint_16(entrybuf + 4, ep[i].blue);\n         png_save_uint_16(entrybuf + 6, ep[i].alpha);\n         png_save_uint_16(entrybuf + 8, ep[i].frequency);\n      }\n\n      png_write_chunk_data(png_ptr, entrybuf, entry_size);\n   }\n#endif\n\n   png_write_chunk_end(png_ptr);\n}\n#endif\n\n#ifdef PNG_WRITE_sBIT_SUPPORTED\n/* Write the sBIT chunk */\nvoid /* PRIVATE */\npng_write_sBIT(png_structrp png_ptr, png_const_color_8p sbit, int color_type)\n{\n   png_byte buf[4];\n   png_size_t size;\n\n   png_debug(1, \"in png_write_sBIT\");\n\n   /* Make sure we don't depend upon the order of PNG_COLOR_8 */\n   if ((color_type & PNG_COLOR_MASK_COLOR) != 0)\n   {\n      png_byte maxbits;\n\n      maxbits = (png_byte)(color_type==PNG_COLOR_TYPE_PALETTE ? 8 :\n          png_ptr->usr_bit_depth);\n\n      if (sbit->red == 0 || sbit->red > maxbits ||\n          sbit->green == 0 || sbit->green > maxbits ||\n          sbit->blue == 0 || sbit->blue > maxbits)\n      {\n         png_warning(png_ptr, \"Invalid sBIT depth specified\");\n         return;\n      }\n\n      buf[0] = sbit->red;\n      buf[1] = sbit->green;\n      buf[2] = sbit->blue;\n      size = 3;\n   }\n\n   else\n   {\n      if (sbit->gray == 0 || sbit->gray > png_ptr->usr_bit_depth)\n      {\n         png_warning(png_ptr, \"Invalid sBIT depth specified\");\n         return;\n      }\n\n      buf[0] = sbit->gray;\n      size = 1;\n   }\n\n   if ((color_type & PNG_COLOR_MASK_ALPHA) != 0)\n   {\n      if (sbit->alpha == 0 || sbit->alpha > png_ptr->usr_bit_depth)\n      {\n         png_warning(png_ptr, \"Invalid sBIT depth specified\");\n         return;\n      }\n\n      buf[size++] = sbit->alpha;\n   }\n\n   png_write_complete_chunk(png_ptr, png_sBIT, buf, size);\n}\n#endif\n\n#ifdef PNG_WRITE_cHRM_SUPPORTED\n/* Write the cHRM chunk */\nvoid /* PRIVATE */\npng_write_cHRM_fixed(png_structrp png_ptr, const png_xy *xy)\n{\n   png_byte buf[32];\n\n   png_debug(1, \"in png_write_cHRM\");\n\n   /* Each value is saved in 1/100,000ths */\n   png_save_int_32(buf,      xy->whitex);\n   png_save_int_32(buf +  4, xy->whitey);\n\n   png_save_int_32(buf +  8, xy->redx);\n   png_save_int_32(buf + 12, xy->redy);\n\n   png_save_int_32(buf + 16, xy->greenx);\n   png_save_int_32(buf + 20, xy->greeny);\n\n   png_save_int_32(buf + 24, xy->bluex);\n   png_save_int_32(buf + 28, xy->bluey);\n\n   png_write_complete_chunk(png_ptr, png_cHRM, buf, 32);\n}\n#endif\n\n#ifdef PNG_WRITE_tRNS_SUPPORTED\n/* Write the tRNS chunk */\nvoid /* PRIVATE */\npng_write_tRNS(png_structrp png_ptr, png_const_bytep trans_alpha,\n    png_const_color_16p tran, int num_trans, int color_type)\n{\n   png_byte buf[6];\n\n   png_debug(1, \"in png_write_tRNS\");\n\n   if (color_type == PNG_COLOR_TYPE_PALETTE)\n   {\n      if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette)\n      {\n         png_app_warning(png_ptr,\n             \"Invalid number of transparent colors specified\");\n         return;\n      }\n\n      /* Write the chunk out as it is */\n      png_write_complete_chunk(png_ptr, png_tRNS, trans_alpha,\n         (png_size_t)num_trans);\n   }\n\n   else if (color_type == PNG_COLOR_TYPE_GRAY)\n   {\n      /* One 16-bit value */\n      if (tran->gray >= (1 << png_ptr->bit_depth))\n      {\n         png_app_warning(png_ptr,\n             \"Ignoring attempt to write tRNS chunk out-of-range for bit_depth\");\n\n         return;\n      }\n\n      png_save_uint_16(buf, tran->gray);\n      png_write_complete_chunk(png_ptr, png_tRNS, buf, (png_size_t)2);\n   }\n\n   else if (color_type == PNG_COLOR_TYPE_RGB)\n   {\n      /* Three 16-bit values */\n      png_save_uint_16(buf, tran->red);\n      png_save_uint_16(buf + 2, tran->green);\n      png_save_uint_16(buf + 4, tran->blue);\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n      if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]) != 0)\n#else\n      if ((buf[0] | buf[2] | buf[4]) != 0)\n#endif\n      {\n         png_app_warning(png_ptr,\n           \"Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8\");\n         return;\n      }\n\n      png_write_complete_chunk(png_ptr, png_tRNS, buf, (png_size_t)6);\n   }\n\n   else\n   {\n      png_app_warning(png_ptr, \"Can't write tRNS with an alpha channel\");\n   }\n}\n#endif\n\n#ifdef PNG_WRITE_bKGD_SUPPORTED\n/* Write the background chunk */\nvoid /* PRIVATE */\npng_write_bKGD(png_structrp png_ptr, png_const_color_16p back, int color_type)\n{\n   png_byte buf[6];\n\n   png_debug(1, \"in png_write_bKGD\");\n\n   if (color_type == PNG_COLOR_TYPE_PALETTE)\n   {\n      if (\n#ifdef PNG_MNG_FEATURES_SUPPORTED\n          (png_ptr->num_palette != 0 ||\n          (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0) &&\n#endif\n         back->index >= png_ptr->num_palette)\n      {\n         png_warning(png_ptr, \"Invalid background palette index\");\n         return;\n      }\n\n      buf[0] = back->index;\n      png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)1);\n   }\n\n   else if ((color_type & PNG_COLOR_MASK_COLOR) != 0)\n   {\n      png_save_uint_16(buf, back->red);\n      png_save_uint_16(buf + 2, back->green);\n      png_save_uint_16(buf + 4, back->blue);\n#ifdef PNG_WRITE_16BIT_SUPPORTED\n      if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]) != 0)\n#else\n      if ((buf[0] | buf[2] | buf[4]) != 0)\n#endif\n      {\n         png_warning(png_ptr,\n             \"Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8\");\n\n         return;\n      }\n\n      png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)6);\n   }\n\n   else\n   {\n      if (back->gray >= (1 << png_ptr->bit_depth))\n      {\n         png_warning(png_ptr,\n             \"Ignoring attempt to write bKGD chunk out-of-range for bit_depth\");\n\n         return;\n      }\n\n      png_save_uint_16(buf, back->gray);\n      png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)2);\n   }\n}\n#endif\n\n#ifdef PNG_WRITE_hIST_SUPPORTED\n/* Write the histogram */\nvoid /* PRIVATE */\npng_write_hIST(png_structrp png_ptr, png_const_uint_16p hist, int num_hist)\n{\n   int i;\n   png_byte buf[3];\n\n   png_debug(1, \"in png_write_hIST\");\n\n   if (num_hist > (int)png_ptr->num_palette)\n   {\n      png_debug2(3, \"num_hist = %d, num_palette = %d\", num_hist,\n          png_ptr->num_palette);\n\n      png_warning(png_ptr, \"Invalid number of histogram entries specified\");\n      return;\n   }\n\n   png_write_chunk_header(png_ptr, png_hIST, (png_uint_32)(num_hist * 2));\n\n   for (i = 0; i < num_hist; i++)\n   {\n      png_save_uint_16(buf, hist[i]);\n      png_write_chunk_data(png_ptr, buf, (png_size_t)2);\n   }\n\n   png_write_chunk_end(png_ptr);\n}\n#endif\n\n#ifdef PNG_WRITE_tEXt_SUPPORTED\n/* Write a tEXt chunk */\nvoid /* PRIVATE */\npng_write_tEXt(png_structrp png_ptr, png_const_charp key, png_const_charp text,\n    png_size_t text_len)\n{\n   png_uint_32 key_len;\n   png_byte new_key[80];\n\n   png_debug(1, \"in png_write_tEXt\");\n\n   key_len = png_check_keyword(png_ptr, key, new_key);\n\n   if (key_len == 0)\n      png_error(png_ptr, \"tEXt: invalid keyword\");\n\n   if (text == NULL || *text == '\\0')\n      text_len = 0;\n\n   else\n      text_len = strlen(text);\n\n   if (text_len > PNG_UINT_31_MAX - (key_len+1))\n      png_error(png_ptr, \"tEXt: text too long\");\n\n   /* Make sure we include the 0 after the key */\n   png_write_chunk_header(png_ptr, png_tEXt,\n       (png_uint_32)/*checked above*/(key_len + text_len + 1));\n   /*\n    * We leave it to the application to meet PNG-1.0 requirements on the\n    * contents of the text.  PNG-1.0 through PNG-1.2 discourage the use of\n    * any non-Latin-1 characters except for NEWLINE.  ISO PNG will forbid them.\n    * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.\n    */\n   png_write_chunk_data(png_ptr, new_key, key_len + 1);\n\n   if (text_len != 0)\n      png_write_chunk_data(png_ptr, (png_const_bytep)text, text_len);\n\n   png_write_chunk_end(png_ptr);\n}\n#endif\n\n#ifdef PNG_WRITE_zTXt_SUPPORTED\n/* Write a compressed text chunk */\nvoid /* PRIVATE */\npng_write_zTXt(png_structrp png_ptr, png_const_charp key, png_const_charp text,\n    int compression)\n{\n   png_uint_32 key_len;\n   png_byte new_key[81];\n   compression_state comp;\n\n   png_debug(1, \"in png_write_zTXt\");\n\n   if (compression == PNG_TEXT_COMPRESSION_NONE)\n   {\n      png_write_tEXt(png_ptr, key, text, 0);\n      return;\n   }\n\n   if (compression != PNG_TEXT_COMPRESSION_zTXt)\n      png_error(png_ptr, \"zTXt: invalid compression type\");\n\n   key_len = png_check_keyword(png_ptr, key, new_key);\n\n   if (key_len == 0)\n      png_error(png_ptr, \"zTXt: invalid keyword\");\n\n   /* Add the compression method and 1 for the keyword separator. */\n   new_key[++key_len] = PNG_COMPRESSION_TYPE_BASE;\n   ++key_len;\n\n   /* Compute the compressed data; do it now for the length */\n   png_text_compress_init(&comp, (png_const_bytep)text,\n      text == NULL ? 0 : strlen(text));\n\n   if (png_text_compress(png_ptr, png_zTXt, &comp, key_len) != Z_OK)\n      png_error(png_ptr, png_ptr->zstream.msg);\n\n   /* Write start of chunk */\n   png_write_chunk_header(png_ptr, png_zTXt, key_len + comp.output_len);\n\n   /* Write key */\n   png_write_chunk_data(png_ptr, new_key, key_len);\n\n   /* Write the compressed data */\n   png_write_compressed_data_out(png_ptr, &comp);\n\n   /* Close the chunk */\n   png_write_chunk_end(png_ptr);\n}\n#endif\n\n#ifdef PNG_WRITE_iTXt_SUPPORTED\n/* Write an iTXt chunk */\nvoid /* PRIVATE */\npng_write_iTXt(png_structrp png_ptr, int compression, png_const_charp key,\n    png_const_charp lang, png_const_charp lang_key, png_const_charp text)\n{\n   png_uint_32 key_len, prefix_len;\n   png_size_t lang_len, lang_key_len;\n   png_byte new_key[82];\n   compression_state comp;\n\n   png_debug(1, \"in png_write_iTXt\");\n\n   key_len = png_check_keyword(png_ptr, key, new_key);\n\n   if (key_len == 0)\n      png_error(png_ptr, \"iTXt: invalid keyword\");\n\n   /* Set the compression flag */\n   switch (compression)\n   {\n      case PNG_ITXT_COMPRESSION_NONE:\n      case PNG_TEXT_COMPRESSION_NONE:\n         compression = new_key[++key_len] = 0; /* no compression */\n         break;\n\n      case PNG_TEXT_COMPRESSION_zTXt:\n      case PNG_ITXT_COMPRESSION_zTXt:\n         compression = new_key[++key_len] = 1; /* compressed */\n         break;\n\n      default:\n         png_error(png_ptr, \"iTXt: invalid compression\");\n   }\n\n   new_key[++key_len] = PNG_COMPRESSION_TYPE_BASE;\n   ++key_len; /* for the keywod separator */\n\n   /* We leave it to the application to meet PNG-1.0 requirements on the\n    * contents of the text.  PNG-1.0 through PNG-1.2 discourage the use of\n    * any non-Latin-1 characters except for NEWLINE.  ISO PNG, however,\n    * specifies that the text is UTF-8 and this really doesn't require any\n    * checking.\n    *\n    * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.\n    *\n    * TODO: validate the language tag correctly (see the spec.)\n    */\n   if (lang == NULL) lang = \"\"; /* empty language is valid */\n   lang_len = strlen(lang)+1;\n   if (lang_key == NULL) lang_key = \"\"; /* may be empty */\n   lang_key_len = strlen(lang_key)+1;\n   if (text == NULL) text = \"\"; /* may be empty */\n\n   prefix_len = key_len;\n   if (lang_len > PNG_UINT_31_MAX-prefix_len)\n      prefix_len = PNG_UINT_31_MAX;\n   else\n      prefix_len = (png_uint_32)(prefix_len + lang_len);\n\n   if (lang_key_len > PNG_UINT_31_MAX-prefix_len)\n      prefix_len = PNG_UINT_31_MAX;\n   else\n      prefix_len = (png_uint_32)(prefix_len + lang_key_len);\n\n   png_text_compress_init(&comp, (png_const_bytep)text, strlen(text));\n\n   if (compression != 0)\n   {\n      if (png_text_compress(png_ptr, png_iTXt, &comp, prefix_len) != Z_OK)\n         png_error(png_ptr, png_ptr->zstream.msg);\n   }\n\n   else\n   {\n      if (comp.input_len > PNG_UINT_31_MAX-prefix_len)\n         png_error(png_ptr, \"iTXt: uncompressed text too long\");\n\n      /* So the string will fit in a chunk: */\n      comp.output_len = (png_uint_32)/*SAFE*/comp.input_len;\n   }\n\n   png_write_chunk_header(png_ptr, png_iTXt, comp.output_len + prefix_len);\n\n   png_write_chunk_data(png_ptr, new_key, key_len);\n\n   png_write_chunk_data(png_ptr, (png_const_bytep)lang, lang_len);\n\n   png_write_chunk_data(png_ptr, (png_const_bytep)lang_key, lang_key_len);\n\n   if (compression != 0)\n      png_write_compressed_data_out(png_ptr, &comp);\n\n   else\n      png_write_chunk_data(png_ptr, (png_const_bytep)text, comp.output_len);\n\n   png_write_chunk_end(png_ptr);\n}\n#endif\n\n#ifdef PNG_WRITE_oFFs_SUPPORTED\n/* Write the oFFs chunk */\nvoid /* PRIVATE */\npng_write_oFFs(png_structrp png_ptr, png_int_32 x_offset, png_int_32 y_offset,\n    int unit_type)\n{\n   png_byte buf[9];\n\n   png_debug(1, \"in png_write_oFFs\");\n\n   if (unit_type >= PNG_OFFSET_LAST)\n      png_warning(png_ptr, \"Unrecognized unit type for oFFs chunk\");\n\n   png_save_int_32(buf, x_offset);\n   png_save_int_32(buf + 4, y_offset);\n   buf[8] = (png_byte)unit_type;\n\n   png_write_complete_chunk(png_ptr, png_oFFs, buf, (png_size_t)9);\n}\n#endif\n#ifdef PNG_WRITE_pCAL_SUPPORTED\n/* Write the pCAL chunk (described in the PNG extensions document) */\nvoid /* PRIVATE */\npng_write_pCAL(png_structrp png_ptr, png_charp purpose, png_int_32 X0,\n    png_int_32 X1, int type, int nparams, png_const_charp units,\n    png_charpp params)\n{\n   png_uint_32 purpose_len;\n   png_size_t units_len, total_len;\n   png_size_tp params_len;\n   png_byte buf[10];\n   png_byte new_purpose[80];\n   int i;\n\n   png_debug1(1, \"in png_write_pCAL (%d parameters)\", nparams);\n\n   if (type >= PNG_EQUATION_LAST)\n      png_error(png_ptr, \"Unrecognized equation type for pCAL chunk\");\n\n   purpose_len = png_check_keyword(png_ptr, purpose, new_purpose);\n\n   if (purpose_len == 0)\n      png_error(png_ptr, \"pCAL: invalid keyword\");\n\n   ++purpose_len; /* terminator */\n\n   png_debug1(3, \"pCAL purpose length = %d\", (int)purpose_len);\n   units_len = strlen(units) + (nparams == 0 ? 0 : 1);\n   png_debug1(3, \"pCAL units length = %d\", (int)units_len);\n   total_len = purpose_len + units_len + 10;\n\n   params_len = (png_size_tp)png_malloc(png_ptr,\n       (png_alloc_size_t)(nparams * (sizeof (png_size_t))));\n\n   /* Find the length of each parameter, making sure we don't count the\n    * null terminator for the last parameter.\n    */\n   for (i = 0; i < nparams; i++)\n   {\n      params_len[i] = strlen(params[i]) + (i == nparams - 1 ? 0 : 1);\n      png_debug2(3, \"pCAL parameter %d length = %lu\", i,\n          (unsigned long)params_len[i]);\n      total_len += params_len[i];\n   }\n\n   png_debug1(3, \"pCAL total length = %d\", (int)total_len);\n   png_write_chunk_header(png_ptr, png_pCAL, (png_uint_32)total_len);\n   png_write_chunk_data(png_ptr, new_purpose, purpose_len);\n   png_save_int_32(buf, X0);\n   png_save_int_32(buf + 4, X1);\n   buf[8] = (png_byte)type;\n   buf[9] = (png_byte)nparams;\n   png_write_chunk_data(png_ptr, buf, (png_size_t)10);\n   png_write_chunk_data(png_ptr, (png_const_bytep)units, (png_size_t)units_len);\n\n   for (i = 0; i < nparams; i++)\n   {\n      png_write_chunk_data(png_ptr, (png_const_bytep)params[i], params_len[i]);\n   }\n\n   png_free(png_ptr, params_len);\n   png_write_chunk_end(png_ptr);\n}\n#endif\n\n#ifdef PNG_WRITE_sCAL_SUPPORTED\n/* Write the sCAL chunk */\nvoid /* PRIVATE */\npng_write_sCAL_s(png_structrp png_ptr, int unit, png_const_charp width,\n    png_const_charp height)\n{\n   png_byte buf[64];\n   png_size_t wlen, hlen, total_len;\n\n   png_debug(1, \"in png_write_sCAL_s\");\n\n   wlen = strlen(width);\n   hlen = strlen(height);\n   total_len = wlen + hlen + 2;\n\n   if (total_len > 64)\n   {\n      png_warning(png_ptr, \"Can't write sCAL (buffer too small)\");\n      return;\n   }\n\n   buf[0] = (png_byte)unit;\n   memcpy(buf + 1, width, wlen + 1);      /* Append the '\\0' here */\n   memcpy(buf + wlen + 2, height, hlen);  /* Do NOT append the '\\0' here */\n\n   png_debug1(3, \"sCAL total length = %u\", (unsigned int)total_len);\n   png_write_complete_chunk(png_ptr, png_sCAL, buf, total_len);\n}\n#endif\n\n#ifdef PNG_WRITE_pHYs_SUPPORTED\n/* Write the pHYs chunk */\nvoid /* PRIVATE */\npng_write_pHYs(png_structrp png_ptr, png_uint_32 x_pixels_per_unit,\n    png_uint_32 y_pixels_per_unit,\n    int unit_type)\n{\n   png_byte buf[9];\n\n   png_debug(1, \"in png_write_pHYs\");\n\n   if (unit_type >= PNG_RESOLUTION_LAST)\n      png_warning(png_ptr, \"Unrecognized unit type for pHYs chunk\");\n\n   png_save_uint_32(buf, x_pixels_per_unit);\n   png_save_uint_32(buf + 4, y_pixels_per_unit);\n   buf[8] = (png_byte)unit_type;\n\n   png_write_complete_chunk(png_ptr, png_pHYs, buf, (png_size_t)9);\n}\n#endif\n\n#ifdef PNG_WRITE_tIME_SUPPORTED\n/* Write the tIME chunk.  Use either png_convert_from_struct_tm()\n * or png_convert_from_time_t(), or fill in the structure yourself.\n */\nvoid /* PRIVATE */\npng_write_tIME(png_structrp png_ptr, png_const_timep mod_time)\n{\n   png_byte buf[7];\n\n   png_debug(1, \"in png_write_tIME\");\n\n   if (mod_time->month  > 12 || mod_time->month  < 1 ||\n       mod_time->day    > 31 || mod_time->day    < 1 ||\n       mod_time->hour   > 23 || mod_time->second > 60)\n   {\n      png_warning(png_ptr, \"Invalid time specified for tIME chunk\");\n      return;\n   }\n\n   png_save_uint_16(buf, mod_time->year);\n   buf[2] = mod_time->month;\n   buf[3] = mod_time->day;\n   buf[4] = mod_time->hour;\n   buf[5] = mod_time->minute;\n   buf[6] = mod_time->second;\n\n   png_write_complete_chunk(png_ptr, png_tIME, buf, (png_size_t)7);\n}\n#endif\n\n/* Initializes the row writing capability of libpng */\nvoid /* PRIVATE */\npng_write_start_row(png_structrp png_ptr)\n{\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */\n\n   /* Start of interlace block */\n   static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};\n\n   /* Offset to next interlace block */\n   static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};\n\n   /* Start of interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};\n\n   /* Offset to next interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};\n#endif\n\n   png_alloc_size_t buf_size;\n   int usr_pixel_depth;\n\n#ifdef PNG_WRITE_FILTER_SUPPORTED\n   png_byte filters;\n#endif\n\n   png_debug(1, \"in png_write_start_row\");\n\n   usr_pixel_depth = png_ptr->usr_channels * png_ptr->usr_bit_depth;\n   buf_size = PNG_ROWBYTES(usr_pixel_depth, png_ptr->width) + 1;\n\n   /* 1.5.6: added to allow checking in the row write code. */\n   png_ptr->transformed_pixel_depth = png_ptr->pixel_depth;\n   png_ptr->maximum_pixel_depth = (png_byte)usr_pixel_depth;\n\n   /* Set up row buffer */\n   png_ptr->row_buf = png_voidcast(png_bytep, png_malloc(png_ptr, buf_size));\n\n   png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE;\n\n#ifdef PNG_WRITE_FILTER_SUPPORTED\n   filters = png_ptr->do_filter;\n\n   if (png_ptr->height == 1)\n      filters &= 0xff & ~(PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH);\n\n   if (png_ptr->width == 1)\n      filters &= 0xff & ~(PNG_FILTER_SUB|PNG_FILTER_AVG|PNG_FILTER_PAETH);\n\n   if (filters == 0)\n      filters = PNG_FILTER_NONE;\n\n   png_ptr->do_filter = filters;\n\n   if (((filters & (PNG_FILTER_SUB | PNG_FILTER_UP | PNG_FILTER_AVG |\n       PNG_FILTER_PAETH)) != 0) && png_ptr->try_row == NULL)\n   {\n      int num_filters = 0;\n\n      png_ptr->try_row = png_voidcast(png_bytep, png_malloc(png_ptr, buf_size));\n\n      if (filters & PNG_FILTER_SUB)\n         num_filters++;\n\n      if (filters & PNG_FILTER_UP)\n         num_filters++;\n\n      if (filters & PNG_FILTER_AVG)\n         num_filters++;\n\n      if (filters & PNG_FILTER_PAETH)\n         num_filters++;\n\n      if (num_filters > 1)\n         png_ptr->tst_row = png_voidcast(png_bytep, png_malloc(png_ptr,\n             buf_size));\n   }\n\n   /* We only need to keep the previous row if we are using one of the following\n    * filters.\n    */\n   if ((filters & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) != 0)\n      png_ptr->prev_row = png_voidcast(png_bytep,\n         png_calloc(png_ptr, buf_size));\n#endif /* WRITE_FILTER */\n\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n   /* If interlaced, we need to set up width and height of pass */\n   if (png_ptr->interlaced != 0)\n   {\n      if ((png_ptr->transformations & PNG_INTERLACE) == 0)\n      {\n         png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -\n             png_pass_ystart[0]) / png_pass_yinc[0];\n\n         png_ptr->usr_width = (png_ptr->width + png_pass_inc[0] - 1 -\n             png_pass_start[0]) / png_pass_inc[0];\n      }\n\n      else\n      {\n         png_ptr->num_rows = png_ptr->height;\n         png_ptr->usr_width = png_ptr->width;\n      }\n   }\n\n   else\n#endif\n   {\n      png_ptr->num_rows = png_ptr->height;\n      png_ptr->usr_width = png_ptr->width;\n   }\n}\n\n/* Internal use only.  Called when finished processing a row of data. */\nvoid /* PRIVATE */\npng_write_finish_row(png_structrp png_ptr)\n{\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */\n\n   /* Start of interlace block */\n   static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};\n\n   /* Offset to next interlace block */\n   static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};\n\n   /* Start of interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};\n\n   /* Offset to next interlace block in the y direction */\n   static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};\n#endif\n\n   png_debug(1, \"in png_write_finish_row\");\n\n   /* Next row */\n   png_ptr->row_number++;\n\n   /* See if we are done */\n   if (png_ptr->row_number < png_ptr->num_rows)\n      return;\n\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n   /* If interlaced, go to next pass */\n   if (png_ptr->interlaced != 0)\n   {\n      png_ptr->row_number = 0;\n      if ((png_ptr->transformations & PNG_INTERLACE) != 0)\n      {\n         png_ptr->pass++;\n      }\n\n      else\n      {\n         /* Loop until we find a non-zero width or height pass */\n         do\n         {\n            png_ptr->pass++;\n\n            if (png_ptr->pass >= 7)\n               break;\n\n            png_ptr->usr_width = (png_ptr->width +\n                png_pass_inc[png_ptr->pass] - 1 -\n                png_pass_start[png_ptr->pass]) /\n                png_pass_inc[png_ptr->pass];\n\n            png_ptr->num_rows = (png_ptr->height +\n                png_pass_yinc[png_ptr->pass] - 1 -\n                png_pass_ystart[png_ptr->pass]) /\n                png_pass_yinc[png_ptr->pass];\n\n            if ((png_ptr->transformations & PNG_INTERLACE) != 0)\n               break;\n\n         } while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0);\n\n      }\n\n      /* Reset the row above the image for the next pass */\n      if (png_ptr->pass < 7)\n      {\n         if (png_ptr->prev_row != NULL)\n            memset(png_ptr->prev_row, 0,\n                (png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels*\n                png_ptr->usr_bit_depth, png_ptr->width)) + 1);\n\n         return;\n      }\n   }\n#endif\n\n   /* If we get here, we've just written the last row, so we need\n      to flush the compressor */\n   png_compress_IDAT(png_ptr, NULL, 0, Z_FINISH);\n}\n\n#ifdef PNG_WRITE_INTERLACING_SUPPORTED\n/* Pick out the correct pixels for the interlace pass.\n * The basic idea here is to go through the row with a source\n * pointer and a destination pointer (sp and dp), and copy the\n * correct pixels for the pass.  As the row gets compacted,\n * sp will always be >= dp, so we should never overwrite anything.\n * See the default: case for the easiest code to understand.\n */\nvoid /* PRIVATE */\npng_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)\n{\n   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */\n\n   /* Start of interlace block */\n   static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};\n\n   /* Offset to next interlace block */\n   static PNG_CONST png_byte  png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};\n\n   png_debug(1, \"in png_do_write_interlace\");\n\n   /* We don't have to do anything on the last pass (6) */\n   if (pass < 6)\n   {\n      /* Each pixel depth is handled separately */\n      switch (row_info->pixel_depth)\n      {\n         case 1:\n         {\n            png_bytep sp;\n            png_bytep dp;\n            unsigned int shift;\n            int d;\n            int value;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            dp = row;\n            d = 0;\n            shift = 7;\n\n            for (i = png_pass_start[pass]; i < row_width;\n               i += png_pass_inc[pass])\n            {\n               sp = row + (png_size_t)(i >> 3);\n               value = (int)(*sp >> (7 - (int)(i & 0x07))) & 0x01;\n               d |= (value << shift);\n\n               if (shift == 0)\n               {\n                  shift = 7;\n                  *dp++ = (png_byte)d;\n                  d = 0;\n               }\n\n               else\n                  shift--;\n\n            }\n            if (shift != 7)\n               *dp = (png_byte)d;\n\n            break;\n         }\n\n         case 2:\n         {\n            png_bytep sp;\n            png_bytep dp;\n            unsigned int shift;\n            int d;\n            int value;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            dp = row;\n            shift = 6;\n            d = 0;\n\n            for (i = png_pass_start[pass]; i < row_width;\n               i += png_pass_inc[pass])\n            {\n               sp = row + (png_size_t)(i >> 2);\n               value = (*sp >> ((3 - (int)(i & 0x03)) << 1)) & 0x03;\n               d |= (value << shift);\n\n               if (shift == 0)\n               {\n                  shift = 6;\n                  *dp++ = (png_byte)d;\n                  d = 0;\n               }\n\n               else\n                  shift -= 2;\n            }\n            if (shift != 6)\n               *dp = (png_byte)d;\n\n            break;\n         }\n\n         case 4:\n         {\n            png_bytep sp;\n            png_bytep dp;\n            unsigned int shift;\n            int d;\n            int value;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n\n            dp = row;\n            shift = 4;\n            d = 0;\n            for (i = png_pass_start[pass]; i < row_width;\n                i += png_pass_inc[pass])\n            {\n               sp = row + (png_size_t)(i >> 1);\n               value = (*sp >> ((1 - (int)(i & 0x01)) << 2)) & 0x0f;\n               d |= (value << shift);\n\n               if (shift == 0)\n               {\n                  shift = 4;\n                  *dp++ = (png_byte)d;\n                  d = 0;\n               }\n\n               else\n                  shift -= 4;\n            }\n            if (shift != 4)\n               *dp = (png_byte)d;\n\n            break;\n         }\n\n         default:\n         {\n            png_bytep sp;\n            png_bytep dp;\n            png_uint_32 i;\n            png_uint_32 row_width = row_info->width;\n            png_size_t pixel_bytes;\n\n            /* Start at the beginning */\n            dp = row;\n\n            /* Find out how many bytes each pixel takes up */\n            pixel_bytes = (row_info->pixel_depth >> 3);\n\n            /* Loop through the row, only looking at the pixels that matter */\n            for (i = png_pass_start[pass]; i < row_width;\n               i += png_pass_inc[pass])\n            {\n               /* Find out where the original pixel is */\n               sp = row + (png_size_t)i * pixel_bytes;\n\n               /* Move the pixel */\n               if (dp != sp)\n                  memcpy(dp, sp, pixel_bytes);\n\n               /* Next pixel */\n               dp += pixel_bytes;\n            }\n            break;\n         }\n      }\n      /* Set new row width */\n      row_info->width = (row_info->width +\n          png_pass_inc[pass] - 1 -\n          png_pass_start[pass]) /\n          png_pass_inc[pass];\n\n      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,\n          row_info->width);\n   }\n}\n#endif\n\n\n/* This filters the row, chooses which filter to use, if it has not already\n * been specified by the application, and then writes the row out with the\n * chosen filter.\n */\nstatic void /* PRIVATE */\npng_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row,\n   png_size_t row_bytes);\n\n#ifdef PNG_WRITE_FILTER_SUPPORTED\nstatic png_size_t /* PRIVATE */\npng_setup_sub_row(png_structrp png_ptr, const png_uint_32 bpp,\n    const png_size_t row_bytes, const png_size_t lmins)\n{\n   png_bytep rp, dp, lp;\n   png_size_t i;\n   png_size_t sum = 0;\n   int v;\n\n   png_ptr->try_row[0] = PNG_FILTER_VALUE_SUB;\n\n   for (i = 0, rp = png_ptr->row_buf + 1, dp = png_ptr->try_row + 1; i < bpp;\n        i++, rp++, dp++)\n   {\n      v = *dp = *rp;\n      sum += (v < 128) ? v : 256 - v;\n   }\n\n   for (lp = png_ptr->row_buf + 1; i < row_bytes;\n      i++, rp++, lp++, dp++)\n   {\n      v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff);\n      sum += (v < 128) ? v : 256 - v;\n\n      if (sum > lmins)  /* We are already worse, don't continue. */\n        break;\n   }\n\n   return (sum);\n}\n\nstatic png_size_t /* PRIVATE */\npng_setup_up_row(png_structrp png_ptr, const png_size_t row_bytes,\n    const png_size_t lmins)\n{\n   png_bytep rp, dp, pp;\n   png_size_t i;\n   png_size_t sum = 0;\n   int v;\n\n   png_ptr->try_row[0] = PNG_FILTER_VALUE_UP;\n\n   for (i = 0, rp = png_ptr->row_buf + 1, dp = png_ptr->try_row + 1,\n       pp = png_ptr->prev_row + 1; i < row_bytes;\n       i++, rp++, pp++, dp++)\n   {\n      v = *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff);\n      sum += (v < 128) ? v : 256 - v;\n\n      if (sum > lmins)  /* We are already worse, don't continue. */\n        break;\n   }\n\n   return (sum);\n}\n\nstatic png_size_t /* PRIVATE */\npng_setup_avg_row(png_structrp png_ptr, const png_uint_32 bpp,\n      const png_size_t row_bytes, const png_size_t lmins)\n{\n   png_bytep rp, dp, pp, lp;\n   png_uint_32 i;\n   png_size_t sum = 0;\n   int v;\n\n   png_ptr->try_row[0] = PNG_FILTER_VALUE_AVG;\n\n   for (i = 0, rp = png_ptr->row_buf + 1, dp = png_ptr->try_row + 1,\n        pp = png_ptr->prev_row + 1; i < bpp; i++)\n   {\n      v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff);\n\n      sum += (v < 128) ? v : 256 - v;\n   }\n\n   for (lp = png_ptr->row_buf + 1; i < row_bytes; i++)\n   {\n      v = *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2))\n          & 0xff);\n\n      sum += (v < 128) ? v : 256 - v;\n\n      if (sum > lmins)  /* We are already worse, don't continue. */\n        break;\n   }\n\n   return (sum);\n}\n\nstatic png_size_t /* PRIVATE */\npng_setup_paeth_row(png_structrp png_ptr, const png_uint_32 bpp,\n    const png_size_t row_bytes, const png_size_t lmins)\n{\n   png_bytep rp, dp, pp, cp, lp;\n   png_size_t i;\n   png_size_t sum = 0;\n   int v;\n\n   png_ptr->try_row[0] = PNG_FILTER_VALUE_PAETH;\n\n   for (i = 0, rp = png_ptr->row_buf + 1, dp = png_ptr->try_row + 1,\n       pp = png_ptr->prev_row + 1; i < bpp; i++)\n   {\n      v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff);\n\n      sum += (v < 128) ? v : 256 - v;\n   }\n\n   for (lp = png_ptr->row_buf + 1, cp = png_ptr->prev_row + 1; i < row_bytes;\n        i++)\n   {\n      int a, b, c, pa, pb, pc, p;\n\n      b = *pp++;\n      c = *cp++;\n      a = *lp++;\n\n      p = b - c;\n      pc = a - c;\n\n#ifdef PNG_USE_ABS\n      pa = abs(p);\n      pb = abs(pc);\n      pc = abs(p + pc);\n#else\n      pa = p < 0 ? -p : p;\n      pb = pc < 0 ? -pc : pc;\n      pc = (p + pc) < 0 ? -(p + pc) : p + pc;\n#endif\n\n      p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;\n\n      v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff);\n\n      sum += (v < 128) ? v : 256 - v;\n\n      if (sum > lmins)  /* We are already worse, don't continue. */\n        break;\n   }\n\n   return (sum);\n}\n#endif /* WRITE_FILTER */\n\nvoid /* PRIVATE */\npng_write_find_filter(png_structrp png_ptr, png_row_infop row_info)\n{\n#ifndef PNG_WRITE_FILTER_SUPPORTED\n   png_write_filtered_row(png_ptr, png_ptr->row_buf, row_info->rowbytes+1);\n#else\n   png_byte filter_to_do = png_ptr->do_filter;\n   png_bytep row_buf;\n   png_bytep best_row;\n   png_uint_32 bpp;\n   png_size_t mins;\n   png_size_t row_bytes = row_info->rowbytes;\n\n   png_debug(1, \"in png_write_find_filter\");\n\n   /* Find out how many bytes offset each pixel is */\n   bpp = (row_info->pixel_depth + 7) >> 3;\n\n   row_buf = png_ptr->row_buf;\n   mins = PNG_SIZE_MAX - 256/* so we can detect potential overflow of the\n                               running sum */;\n\n   /* The prediction method we use is to find which method provides the\n    * smallest value when summing the absolute values of the distances\n    * from zero, using anything >= 128 as negative numbers.  This is known\n    * as the \"minimum sum of absolute differences\" heuristic.  Other\n    * heuristics are the \"weighted minimum sum of absolute differences\"\n    * (experimental and can in theory improve compression), and the \"zlib\n    * predictive\" method (not implemented yet), which does test compressions\n    * of lines using different filter methods, and then chooses the\n    * (series of) filter(s) that give minimum compressed data size (VERY\n    * computationally expensive).\n    *\n    * GRR 980525:  consider also\n    *\n    *   (1) minimum sum of absolute differences from running average (i.e.,\n    *       keep running sum of non-absolute differences & count of bytes)\n    *       [track dispersion, too?  restart average if dispersion too large?]\n    *\n    *  (1b) minimum sum of absolute differences from sliding average, probably\n    *       with window size <= deflate window (usually 32K)\n    *\n    *   (2) minimum sum of squared differences from zero or running average\n    *       (i.e., ~ root-mean-square approach)\n    */\n\n\n   /* We don't need to test the 'no filter' case if this is the only filter\n    * that has been chosen, as it doesn't actually do anything to the data.\n    */\n   best_row = png_ptr->row_buf;\n\n\n   if ((filter_to_do & PNG_FILTER_NONE) != 0 && filter_to_do != PNG_FILTER_NONE)\n   {\n      png_bytep rp;\n      png_size_t sum = 0;\n      png_size_t i;\n      int v;\n\n      if (PNG_SIZE_MAX/128 <= row_bytes)\n      {\n         for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++)\n         {\n            /* Check for overflow */\n            if (sum > PNG_SIZE_MAX/128 - 256)\n               break;\n\n            v = *rp;\n            sum += (v < 128) ? v : 256 - v;\n         }\n      }\n      else /* Overflow is not possible */\n      {\n         for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++)\n         {\n            v = *rp;\n            sum += (v < 128) ? v : 256 - v;\n         }\n      }\n\n      mins = sum;\n   }\n\n   /* Sub filter */\n   if (filter_to_do == PNG_FILTER_SUB)\n   /* It's the only filter so no testing is needed */\n   {\n      (void) png_setup_sub_row(png_ptr, bpp, row_bytes, mins);\n      best_row = png_ptr->try_row;\n   }\n\n   else if ((filter_to_do & PNG_FILTER_SUB) != 0)\n   {\n      png_size_t sum;\n      png_size_t lmins = mins;\n\n      sum = png_setup_sub_row(png_ptr, bpp, row_bytes, lmins);\n\n      if (sum < mins)\n      {\n         mins = sum;\n         best_row = png_ptr->try_row;\n         if (png_ptr->tst_row != NULL)\n         {\n            png_ptr->try_row = png_ptr->tst_row;\n            png_ptr->tst_row = best_row;\n         }\n      }\n   }\n\n   /* Up filter */\n   if (filter_to_do == PNG_FILTER_UP)\n   {\n      (void) png_setup_up_row(png_ptr, row_bytes, mins);\n      best_row = png_ptr->try_row;\n   }\n\n   else if ((filter_to_do & PNG_FILTER_UP) != 0)\n   {\n      png_size_t sum;\n      png_size_t lmins = mins;\n\n      sum = png_setup_up_row(png_ptr, row_bytes, lmins);\n\n      if (sum < mins)\n      {\n         mins = sum;\n         best_row = png_ptr->try_row;\n         if (png_ptr->tst_row != NULL)\n         {\n            png_ptr->try_row = png_ptr->tst_row;\n            png_ptr->tst_row = best_row;\n         }\n      }\n   }\n\n   /* Avg filter */\n   if (filter_to_do == PNG_FILTER_AVG)\n   {\n      (void) png_setup_avg_row(png_ptr, bpp, row_bytes, mins);\n      best_row = png_ptr->try_row;\n   }\n\n   else if ((filter_to_do & PNG_FILTER_AVG) != 0)\n   {\n      png_size_t sum;\n      png_size_t lmins = mins;\n\n      sum= png_setup_avg_row(png_ptr, bpp, row_bytes, lmins);\n\n      if (sum < mins)\n      {\n         mins = sum;\n         best_row = png_ptr->try_row;\n         if (png_ptr->tst_row != NULL)\n         {\n            png_ptr->try_row = png_ptr->tst_row;\n            png_ptr->tst_row = best_row;\n         }\n      }\n   }\n\n   /* Paeth filter */\n   if ((filter_to_do == PNG_FILTER_PAETH) != 0)\n   {\n      (void) png_setup_paeth_row(png_ptr, bpp, row_bytes, mins);\n      best_row = png_ptr->try_row;\n   }\n\n   else if ((filter_to_do & PNG_FILTER_PAETH) != 0)\n   {\n      png_size_t sum;\n      png_size_t lmins = mins;\n\n      sum = png_setup_paeth_row(png_ptr, bpp, row_bytes, lmins);\n\n      if (sum < mins)\n      {\n         best_row = png_ptr->try_row;\n         if (png_ptr->tst_row != NULL)\n         {\n            png_ptr->try_row = png_ptr->tst_row;\n            png_ptr->tst_row = best_row;\n         }\n      }\n   }\n\n   /* Do the actual writing of the filtered row data from the chosen filter. */\n   png_write_filtered_row(png_ptr, best_row, row_info->rowbytes+1);\n\n#endif /* WRITE_FILTER */\n}\n\n\n/* Do the actual writing of a previously filtered row. */\nstatic void\npng_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row,\n   png_size_t full_row_length/*includes filter byte*/)\n{\n   png_debug(1, \"in png_write_filtered_row\");\n\n   png_debug1(2, \"filter = %d\", filtered_row[0]);\n\n   png_compress_IDAT(png_ptr, filtered_row, full_row_length, Z_NO_FLUSH);\n\n#ifdef PNG_WRITE_FILTER_SUPPORTED\n   /* Swap the current and previous rows */\n   if (png_ptr->prev_row != NULL)\n   {\n      png_bytep tptr;\n\n      tptr = png_ptr->prev_row;\n      png_ptr->prev_row = png_ptr->row_buf;\n      png_ptr->row_buf = tptr;\n   }\n#endif /* WRITE_FILTER */\n\n   /* Finish row - updates counters and flushes zlib if last row */\n   png_write_finish_row(png_ptr);\n\n#ifdef PNG_WRITE_FLUSH_SUPPORTED\n   png_ptr->flush_rows++;\n\n   if (png_ptr->flush_dist > 0 &&\n       png_ptr->flush_rows >= png_ptr->flush_dist)\n   {\n      png_write_flush(png_ptr);\n   }\n#endif /* WRITE_FLUSH */\n}\n#endif /* WRITE */\n"
  },
  {
    "path": "libs/SDL2_ttf/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\nproject(SDL2_ttf)\n\n# Creates and names a library, sets it as either STATIC\n# or SHARED, and provides the relative paths to its source code.\n# You can define multiple libraries, and CMake builds them for you.\n# Gradle automatically packages shared libraries with your APK.\n\nfind_library( # Sets the name of the path variable.\n        GLESv1_CM\n\n        # Specifies the name of the NDK library that\n        # you want CMake to locate.\n        GLESv1_CM )\n\nfind_library(\n        GLESv2\n        GLESv2\n)\n\nfind_library(\n        android\n        android\n)\n\nfind_library(\n        log\n        log\n)\n\ninclude_directories(\n        include\n        ${CMAKE_CURRENT_SOURCE_DIR}/../freetype/include\n)\n\nadd_definitions(-DGL_GLEXT_PROTOTYPES)\n\nadd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../freetype/ ${CMAKE_CURRENT_SOURCE_DIR}/../freetype/)\n\nadd_library( # Sets the name of the library.\n        SDL2_ttf\n\n        # Sets the library as a shared library.\n        SHARED\n\n        src/glfont.c\n        src/SDL_ttf.c\n        )\n\n\ntarget_link_libraries(\n        SDL2_ttf\n        freetype\n        SDL2\n        GLESv1_CM\n        GLESv2\n        android\n        log\n)"
  },
  {
    "path": "libs/SDL2_ttf/build.gradle",
    "content": "apply plugin: 'com.android.model.native'\n\nmodel {\n    android {\n        compileSdkVersion = gradle.sdkVersion\n        buildToolsVersion = gradle.buildToolsVersion\n\n        defaultConfig {\n            minSdkVersion.apiLevel = gradle.minSdkVersion\n            versionCode = 1\n            versionName = '1.0'\n        }\n        ndk {\n            moduleName = 'SDL2_ttf'\n            ldLibs.addAll([\"GLESv1_CM\", \"EGL\", \"GLESv2\", \"log\", \"android\", \"dl\"])\n            CFlags.addAll([\"-DGL_GLEXT_PROTOTYPES\"])\n            CFlags.addAll([\"-I\" + file(\"include/\").absolutePath,\"-DGL_GLEXT_PROTOTYPES\"])\n        }\n\n        sources {\n            main {\n                jni {\n                    dependencies {\n                        project ':SDL2' linkage 'shared'\n                        project ':freetype' linkage 'shared'\n                    }\n                    exportedHeaders {\n                        srcDir \"../SDL2/include\"\n                        srcDir \"../freetype/include\"\n                    }\n                    source {\n                        srcDir \"src\"\n                        exclude \"showfont.c\"\n                    }\n                }\n            }\n        }\n\n    }\n}\n\ntask(distributeLib, type : Copy) {\n    dependsOn assemble\n    into '../distribution/SDL2_ttf/'\n    from('build/outputs/native/release/lib') {\n        into 'lib/'\n    }\n}\n"
  },
  {
    "path": "libs/SDL2_ttf/cmake_install.cmake",
    "content": "# Install script for directory: C:/is-Engine/libs/SDL2_ttf\n\n# Set the install prefix\nif(NOT DEFINED CMAKE_INSTALL_PREFIX)\n  set(CMAKE_INSTALL_PREFIX \"C:/Program Files (x86)/Project\")\nendif()\nstring(REGEX REPLACE \"/$\" \"\" CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")\n\n# Set the install configuration name.\nif(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)\n  if(BUILD_TYPE)\n    string(REGEX REPLACE \"^[^A-Za-z0-9_]+\" \"\"\n           CMAKE_INSTALL_CONFIG_NAME \"${BUILD_TYPE}\")\n  else()\n    set(CMAKE_INSTALL_CONFIG_NAME \"Release\")\n  endif()\n  message(STATUS \"Install configuration: \\\"${CMAKE_INSTALL_CONFIG_NAME}\\\"\")\nendif()\n\n# Set the component getting installed.\nif(NOT CMAKE_INSTALL_COMPONENT)\n  if(COMPONENT)\n    message(STATUS \"Install component: \\\"${COMPONENT}\\\"\")\n    set(CMAKE_INSTALL_COMPONENT \"${COMPONENT}\")\n  else()\n    set(CMAKE_INSTALL_COMPONENT)\n  endif()\nendif()\n\n# Install shared libraries without execute permission?\nif(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n  set(CMAKE_INSTALL_SO_NO_EXE \"0\")\nendif()\n\n# Is this installation the result of a crosscompile?\nif(NOT DEFINED CMAKE_CROSSCOMPILING)\n  set(CMAKE_CROSSCOMPILING \"TRUE\")\nendif()\n\nif(NOT CMAKE_INSTALL_LOCAL_ONLY)\n  # Include the install script for each subdirectory.\n  include(\"C:/is-Engine/libs/freetype/cmake_install.cmake\")\n\nendif()\n\n"
  },
  {
    "path": "libs/SDL2_ttf/include/SDL_ttf.h",
    "content": "/*\n  SDL_ttf:  A companion library to SDL for working with TrueType (tm) fonts\n  Copyright (C) 2001-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* This library is a wrapper around the excellent FreeType 2.0 library,\n   available at:\n    http://www.freetype.org/\n*/\n\n/* Note: In many places, SDL_ttf will say \"glyph\" when it means \"code point.\"\n   Unicode is hard, we learn as we go, and we apologize for adding to the\n   confusion. */\n\n#ifndef _SDL_TTF_H\n#define _SDL_TTF_H\n\n#include \"SDL.h\"\n#include \"begin_code.h\"\n\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Printable format: \"%d.%d.%d\", MAJOR, MINOR, PATCHLEVEL\n*/\n#define SDL_TTF_MAJOR_VERSION   2\n#define SDL_TTF_MINOR_VERSION   0\n#define SDL_TTF_PATCHLEVEL      14\n\n/* This macro can be used to fill a version structure with the compile-time\n * version of the SDL_ttf library.\n */\n#define SDL_TTF_VERSION(X)                          \\\n{                                                   \\\n    (X)->major = SDL_TTF_MAJOR_VERSION;             \\\n    (X)->minor = SDL_TTF_MINOR_VERSION;             \\\n    (X)->patch = SDL_TTF_PATCHLEVEL;                \\\n}\n\n/* Backwards compatibility */\n#define TTF_MAJOR_VERSION   SDL_TTF_MAJOR_VERSION\n#define TTF_MINOR_VERSION   SDL_TTF_MINOR_VERSION\n#define TTF_PATCHLEVEL      SDL_TTF_PATCHLEVEL\n#define TTF_VERSION(X)      SDL_TTF_VERSION(X)\n\n/* Make sure this is defined (only available in newer SDL versions) */\n#ifndef SDL_DEPRECATED\n#define SDL_DEPRECATED\n#endif\n\n/* This function gets the version of the dynamically linked SDL_ttf library.\n   it should NOT be used to fill a version structure, instead you should\n   use the SDL_TTF_VERSION() macro.\n */\nextern DECLSPEC const SDL_version * SDLCALL TTF_Linked_Version(void);\n\n/* ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark) */\n#define UNICODE_BOM_NATIVE  0xFEFF\n#define UNICODE_BOM_SWAPPED 0xFFFE\n\n/* This function tells the library whether UNICODE text is generally\n   byteswapped.  A UNICODE BOM character in a string will override\n   this setting for the remainder of that string.\n*/\nextern DECLSPEC void SDLCALL TTF_ByteSwappedUNICODE(int swapped);\n\n/* The internal structure containing font information */\ntypedef struct _TTF_Font TTF_Font;\n\n/* Initialize the TTF engine - returns 0 if successful, -1 on error */\nextern DECLSPEC int SDLCALL TTF_Init(void);\n\n/* Open a font file and create a font of the specified point size.\n * Some .fon fonts will have several sizes embedded in the file, so the\n * point size becomes the index of choosing which size.  If the value\n * is too high, the last indexed size will be the default. */\nextern DECLSPEC TTF_Font * SDLCALL TTF_OpenFont(const char *file, int ptsize);\nextern DECLSPEC TTF_Font * SDLCALL TTF_OpenFontIndex(const char *file, int ptsize, long index);\nextern DECLSPEC TTF_Font * SDLCALL TTF_OpenFontRW(SDL_RWops *src, int freesrc, int ptsize);\nextern DECLSPEC TTF_Font * SDLCALL TTF_OpenFontIndexRW(SDL_RWops *src, int freesrc, int ptsize, long index);\n\n/* Set and retrieve the font style */\n#define TTF_STYLE_NORMAL        0x00\n#define TTF_STYLE_BOLD          0x01\n#define TTF_STYLE_ITALIC        0x02\n#define TTF_STYLE_UNDERLINE     0x04\n#define TTF_STYLE_STRIKETHROUGH 0x08\nextern DECLSPEC int SDLCALL TTF_GetFontStyle(const TTF_Font *font);\nextern DECLSPEC void SDLCALL TTF_SetFontStyle(TTF_Font *font, int style);\nextern DECLSPEC int SDLCALL TTF_GetFontOutline(const TTF_Font *font);\nextern DECLSPEC void SDLCALL TTF_SetFontOutline(TTF_Font *font, int outline);\n\n/* Set and retrieve FreeType hinter settings */\n#define TTF_HINTING_NORMAL    0\n#define TTF_HINTING_LIGHT     1\n#define TTF_HINTING_MONO      2\n#define TTF_HINTING_NONE      3\nextern DECLSPEC int SDLCALL TTF_GetFontHinting(const TTF_Font *font);\nextern DECLSPEC void SDLCALL TTF_SetFontHinting(TTF_Font *font, int hinting);\n\n/* Get the total height of the font - usually equal to point size */\nextern DECLSPEC int SDLCALL TTF_FontHeight(const TTF_Font *font);\n\n/* Get the offset from the baseline to the top of the font\n   This is a positive value, relative to the baseline.\n */\nextern DECLSPEC int SDLCALL TTF_FontAscent(const TTF_Font *font);\n\n/* Get the offset from the baseline to the bottom of the font\n   This is a negative value, relative to the baseline.\n */\nextern DECLSPEC int SDLCALL TTF_FontDescent(const TTF_Font *font);\n\n/* Get the recommended spacing between lines of text for this font */\nextern DECLSPEC int SDLCALL TTF_FontLineSkip(const TTF_Font *font);\n\n/* Get/Set whether or not kerning is allowed for this font */\nextern DECLSPEC int SDLCALL TTF_GetFontKerning(const TTF_Font *font);\nextern DECLSPEC void SDLCALL TTF_SetFontKerning(TTF_Font *font, int allowed);\n\n/* Get the number of faces of the font */\nextern DECLSPEC long SDLCALL TTF_FontFaces(const TTF_Font *font);\n\n/* Get the font face attributes, if any */\nextern DECLSPEC int SDLCALL TTF_FontFaceIsFixedWidth(const TTF_Font *font);\nextern DECLSPEC char * SDLCALL TTF_FontFaceFamilyName(const TTF_Font *font);\nextern DECLSPEC char * SDLCALL TTF_FontFaceStyleName(const TTF_Font *font);\n\n/* Check wether a glyph is provided by the font or not */\nextern DECLSPEC int SDLCALL TTF_GlyphIsProvided(const TTF_Font *font, Uint16 ch);\n\n/* Get the metrics (dimensions) of a glyph\n   To understand what these metrics mean, here is a useful link:\n    http://freetype.sourceforge.net/freetype2/docs/tutorial/step2.html\n */\nextern DECLSPEC int SDLCALL TTF_GlyphMetrics(TTF_Font *font, Uint16 ch,\n                     int *minx, int *maxx,\n                                     int *miny, int *maxy, int *advance);\n\n/* Get the dimensions of a rendered string of text */\nextern DECLSPEC int SDLCALL TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h);\nextern DECLSPEC int SDLCALL TTF_SizeUTF8(TTF_Font *font, const char *text, int *w, int *h);\nextern DECLSPEC int SDLCALL TTF_SizeUNICODE(TTF_Font *font, const Uint16 *text, int *w, int *h);\n\n/* Create an 8-bit palettized surface and render the given text at\n   fast quality with the given font and color.  The 0 pixel is the\n   colorkey, giving a transparent background, and the 1 pixel is set\n   to the text color.\n   This function returns the new surface, or NULL if there was an error.\n*/\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Solid(TTF_Font *font,\n                const char *text, SDL_Color fg);\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUTF8_Solid(TTF_Font *font,\n                const char *text, SDL_Color fg);\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUNICODE_Solid(TTF_Font *font,\n                const Uint16 *text, SDL_Color fg);\n\n/* Create an 8-bit palettized surface and render the given glyph at\n   fast quality with the given font and color.  The 0 pixel is the\n   colorkey, giving a transparent background, and the 1 pixel is set\n   to the text color.  The glyph is rendered without any padding or\n   centering in the X direction, and aligned normally in the Y direction.\n   This function returns the new surface, or NULL if there was an error.\n*/\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderGlyph_Solid(TTF_Font *font,\n                    Uint16 ch, SDL_Color fg);\n\n/* Create an 8-bit palettized surface and render the given text at\n   high quality with the given font and colors.  The 0 pixel is background,\n   while other pixels have varying degrees of the foreground color.\n   This function returns the new surface, or NULL if there was an error.\n*/\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Shaded(TTF_Font *font,\n                const char *text, SDL_Color fg, SDL_Color bg);\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUTF8_Shaded(TTF_Font *font,\n                const char *text, SDL_Color fg, SDL_Color bg);\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUNICODE_Shaded(TTF_Font *font,\n                const Uint16 *text, SDL_Color fg, SDL_Color bg);\n\n/* Create an 8-bit palettized surface and render the given glyph at\n   high quality with the given font and colors.  The 0 pixel is background,\n   while other pixels have varying degrees of the foreground color.\n   The glyph is rendered without any padding or centering in the X\n   direction, and aligned normally in the Y direction.\n   This function returns the new surface, or NULL if there was an error.\n*/\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderGlyph_Shaded(TTF_Font *font,\n                Uint16 ch, SDL_Color fg, SDL_Color bg);\n\n/* Create a 32-bit ARGB surface and render the given text at high quality,\n   using alpha blending to dither the font with the given color.\n   This function returns the new surface, or NULL if there was an error.\n*/\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Blended(TTF_Font *font,\n                const char *text, SDL_Color fg);\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUTF8_Blended(TTF_Font *font,\n                const char *text, SDL_Color fg);\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUNICODE_Blended(TTF_Font *font,\n                const Uint16 *text, SDL_Color fg);\n\n\n/* Create a 32-bit ARGB surface and render the given text at high quality,\n   using alpha blending to dither the font with the given color.\n   Text is wrapped to multiple lines on line endings and on word boundaries\n   if it extends beyond wrapLength in pixels.\n   This function returns the new surface, or NULL if there was an error.\n*/\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Blended_Wrapped(TTF_Font *font,\n                const char *text, SDL_Color fg, Uint32 wrapLength);\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUTF8_Blended_Wrapped(TTF_Font *font,\n                const char *text, SDL_Color fg, Uint32 wrapLength);\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUNICODE_Blended_Wrapped(TTF_Font *font,\n                const Uint16 *text, SDL_Color fg, Uint32 wrapLength);\n\n/* Create a 32-bit ARGB surface and render the given glyph at high quality,\n   using alpha blending to dither the font with the given color.\n   The glyph is rendered without any padding or centering in the X\n   direction, and aligned normally in the Y direction.\n   This function returns the new surface, or NULL if there was an error.\n*/\nextern DECLSPEC SDL_Surface * SDLCALL TTF_RenderGlyph_Blended(TTF_Font *font,\n                        Uint16 ch, SDL_Color fg);\n\n/* For compatibility with previous versions, here are the old functions */\n#define TTF_RenderText(font, text, fg, bg)  \\\n    TTF_RenderText_Shaded(font, text, fg, bg)\n#define TTF_RenderUTF8(font, text, fg, bg)  \\\n    TTF_RenderUTF8_Shaded(font, text, fg, bg)\n#define TTF_RenderUNICODE(font, text, fg, bg)   \\\n    TTF_RenderUNICODE_Shaded(font, text, fg, bg)\n\n/* Close an opened font file */\nextern DECLSPEC void SDLCALL TTF_CloseFont(TTF_Font *font);\n\n/* De-initialize the TTF engine */\nextern DECLSPEC void SDLCALL TTF_Quit(void);\n\n/* Check if the TTF engine is initialized */\nextern DECLSPEC int SDLCALL TTF_WasInit(void);\n\n/* Get the kerning size of two glyphs indices */\n/* DEPRECATED: this function requires FreeType font indexes, not glyphs,\n   by accident, which we don't expose through this API, so it could give\n   wildly incorrect results, especially with non-ASCII values.\n   Going forward, please use TTF_GetFontKerningSizeGlyphs() instead, which\n   does what you probably expected this function to do. */\nextern DECLSPEC int TTF_GetFontKerningSize(TTF_Font *font, int prev_index, int index) SDL_DEPRECATED;\n\n/* Get the kerning size of two glyphs */\nextern DECLSPEC int TTF_GetFontKerningSizeGlyphs(TTF_Font *font, Uint16 previous_ch, Uint16 ch);\n\n/* We'll use SDL for reporting errors */\n#define TTF_SetError    SDL_SetError\n#define TTF_GetError    SDL_GetError\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* _SDL_TTF_H */\n"
  },
  {
    "path": "libs/SDL2_ttf/src/SDL_ttf.c",
    "content": "/*\n  SDL_ttf:  A companion library to SDL for working with TrueType (tm) fonts\n  Copyright (C) 2001-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_OUTLINE_H\n#include FT_STROKER_H\n#include FT_GLYPH_H\n#include FT_TRUETYPE_IDS_H\n\n#include \"SDL.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_ttf.h\"\n\n/* FIXME: Right now we assume the gray-scale renderer Freetype is using\n   supports 256 shades of gray, but we should instead key off of num_grays\n   in the result FT_Bitmap after the FT_Render_Glyph() call. */\n#define NUM_GRAYS       256\n\n/* Handy routines for converting from fixed point */\n#define FT_FLOOR(X) ((X & -64) / 64)\n#define FT_CEIL(X)  (((X + 63) & -64) / 64)\n\n#define CACHED_METRICS  0x10\n#define CACHED_BITMAP   0x01\n#define CACHED_PIXMAP   0x02\n\n/* Cached glyph information */\ntypedef struct cached_glyph {\n    int stored;\n    FT_UInt index;\n    FT_Bitmap bitmap;\n    FT_Bitmap pixmap;\n    int minx;\n    int maxx;\n    int miny;\n    int maxy;\n    int yoffset;\n    int advance;\n    Uint16 cached;\n} c_glyph;\n\n/* The structure used to hold internal font information */\nstruct _TTF_Font {\n    /* Freetype2 maintains all sorts of useful info itself */\n    FT_Face face;\n\n    /* We'll cache these ourselves */\n    int height;\n    int ascent;\n    int descent;\n    int lineskip;\n\n    /* The font style */\n    int face_style;\n    int style;\n    int outline;\n\n    /* Whether kerning is desired */\n    int kerning;\n\n    /* Extra width in glyph bounds for text styles */\n    int glyph_overhang;\n    float glyph_italics;\n\n    /* Information in the font for underlining */\n    int underline_offset;\n    int underline_height;\n\n    /* Cache for style-transformed glyphs */\n    c_glyph *current;\n    c_glyph cache[257]; /* 257 is a prime */\n\n    /* We are responsible for closing the font stream */\n    SDL_RWops *src;\n    int freesrc;\n    FT_Open_Args args;\n\n    /* For non-scalable formats, we must remember which font index size */\n    int font_size_family;\n\n    /* really just flags passed into FT_Load_Glyph */\n    int hinting;\n};\n\n/* Handle a style only if the font does not already handle it */\n#define TTF_HANDLE_STYLE_BOLD(font) (((font)->style & TTF_STYLE_BOLD) && \\\n                                    !((font)->face_style & TTF_STYLE_BOLD))\n#define TTF_HANDLE_STYLE_ITALIC(font) (((font)->style & TTF_STYLE_ITALIC) && \\\n                                      !((font)->face_style & TTF_STYLE_ITALIC))\n#define TTF_HANDLE_STYLE_UNDERLINE(font) ((font)->style & TTF_STYLE_UNDERLINE)\n#define TTF_HANDLE_STYLE_STRIKETHROUGH(font) ((font)->style & TTF_STYLE_STRIKETHROUGH)\n\n/* Font styles that does not impact glyph drawing */\n#define TTF_STYLE_NO_GLYPH_CHANGE   (TTF_STYLE_UNDERLINE | TTF_STYLE_STRIKETHROUGH)\n\n/* The FreeType font engine/library */\nstatic FT_Library library;\nstatic int TTF_initialized = 0;\nstatic int TTF_byteswapped = 0;\n\n#define TTF_CHECKPOINTER(p, errval)                 \\\n    if ( !TTF_initialized ) {                   \\\n        TTF_SetError(\"Library not initialized\");        \\\n        return errval;                      \\\n    }                               \\\n    if ( !p ) {                         \\\n        TTF_SetError(\"Passed a NULL pointer\");          \\\n        return errval;                      \\\n    }\n\n/* Gets the top row of the underline. The outline\n   is taken into account.\n*/\nstatic int TTF_underline_top_row(TTF_Font *font)\n{\n    /* With outline, the underline_offset is underline_offset+outline. */\n    /* So, we don't have to remove the top part of the outline height. */\n    return font->ascent - font->underline_offset - 1;\n}\n\n/* Gets the top row of the underline. for a given glyph. The outline\n   is taken into account.\n   Need to update row according to height difference between font and glyph:\n   font_value - font->ascent + glyph->maxy\n*/\nstatic int TTF_Glyph_underline_top_row(TTF_Font *font, c_glyph *glyph)\n{\n    return glyph->maxy - font->underline_offset - 1;\n}\n\n/* Gets the bottom row of the underline. The outline\n   is taken into account.\n*/\nstatic int TTF_underline_bottom_row(TTF_Font *font)\n{\n    int row = TTF_underline_top_row(font) + font->underline_height;\n    if ( font->outline  > 0 ) {\n        /* Add underline_offset outline offset and */\n        /* the bottom part of the outline. */\n        row += font->outline * 2;\n    }\n    return row;\n}\n\n/* Gets the bottom row of the underline. for a given glyph. The outline\n   is taken into account.\n   Need to update row according to height difference between font and glyph:\n   font_value - font->ascent + glyph->maxy\n*/\nstatic int TTF_Glyph_underline_bottom_row(TTF_Font *font, c_glyph *glyph)\n{\n    return TTF_underline_bottom_row(font) - font->ascent + glyph->maxy;\n}\n\n/* Gets the top row of the strikethrough. The outline\n   is taken into account.\n*/\nstatic int TTF_strikethrough_top_row(TTF_Font *font)\n{\n    /* With outline, the first text row is 'outline'. */\n    /* So, we don't have to remove the top part of the outline height. */\n    return font->height / 2;\n}\n\n/* Gets the top row of the strikethrough for a given glyph. The outline\n   is taken into account.\n   Need to update row according to height difference between font and glyph:\n   font_value - font->ascent + glyph->maxy\n*/\nstatic int TTF_Glyph_strikethrough_top_row(TTF_Font *font, c_glyph *glyph)\n{\n    return TTF_strikethrough_top_row(font) - font->ascent + glyph->maxy;\n}\n\nstatic void TTF_initLineMectrics(const TTF_Font *font, const SDL_Surface *textbuf, const int row, Uint8 **pdst, int *pheight)\n{\n    Uint8 *dst;\n    int height;\n\n    dst = (Uint8 *)textbuf->pixels;\n    if ( row > 0 ) {\n        dst += row * textbuf->pitch;\n    }\n\n    height = font->underline_height;\n    /* Take outline into account */\n    if ( font->outline > 0 ) {\n        height += font->outline * 2;\n    }\n    *pdst = dst;\n    *pheight = height;\n}\n\n/* Draw a solid line of underline_height (+ optional outline)\n   at the given row. The row value must take the\n   outline into account.\n*/\nstatic void TTF_drawLine_Solid(const TTF_Font *font, const SDL_Surface *textbuf, const int row)\n{\n    int line;\n    Uint8 *dst_check = (Uint8*)textbuf->pixels + textbuf->pitch * textbuf->h;\n    Uint8 *dst;\n    int height;\n\n    TTF_initLineMectrics(font, textbuf, row, &dst, &height);\n\n    /* Draw line */\n    for ( line=height; line>0 && dst < dst_check; --line ) {\n        /* 1 because 0 is the bg color */\n        SDL_memset( dst, 1, textbuf->w );\n        dst += textbuf->pitch;\n    }\n}\n\n/* Draw a shaded line of underline_height (+ optional outline)\n   at the given row. The row value must take the\n   outline into account.\n*/\nstatic void TTF_drawLine_Shaded(const TTF_Font *font, const SDL_Surface *textbuf, const int row)\n{\n    int line;\n    Uint8 *dst_check = (Uint8*)textbuf->pixels + textbuf->pitch * textbuf->h;\n    Uint8 *dst;\n    int height;\n\n    TTF_initLineMectrics(font, textbuf, row, &dst, &height);\n\n    /* Draw line */\n    for ( line=height; line>0 && dst < dst_check; --line ) {\n        SDL_memset( dst, NUM_GRAYS - 1, textbuf->w );\n        dst += textbuf->pitch;\n    }\n}\n\n/* Draw a blended line of underline_height (+ optional outline)\n   at the given row. The row value must take the\n   outline into account.\n*/\nstatic void TTF_drawLine_Blended(const TTF_Font *font, const SDL_Surface *textbuf, const int row, const Uint32 color)\n{\n    int line;\n    Uint32 *dst_check = (Uint32*)textbuf->pixels + textbuf->pitch/4 * textbuf->h;\n    Uint8 *dst8; /* destination, byte version */\n    Uint32 *dst;\n    int height;\n    int col;\n    Uint32 pixel = color | 0xFF000000; /* Amask */\n\n    TTF_initLineMectrics(font, textbuf, row, &dst8, &height);\n    dst = (Uint32 *) dst8;\n\n    /* Draw line */\n    for ( line=height; line>0 && dst < dst_check; --line ) {\n        for ( col=0; col < textbuf->w; ++col ) {\n            dst[col] = pixel;\n        }\n        dst += textbuf->pitch/4;\n    }\n}\n\n/* rcg06192001 get linked library's version. */\nconst SDL_version *TTF_Linked_Version(void)\n{\n    static SDL_version linked_version;\n    SDL_TTF_VERSION(&linked_version);\n    return(&linked_version);\n}\n\n/* This function tells the library whether UNICODE text is generally\n   byteswapped.  A UNICODE BOM character at the beginning of a string\n   will override this setting for that string.\n */\nvoid TTF_ByteSwappedUNICODE(int swapped)\n{\n    TTF_byteswapped = swapped;\n}\n\nstatic void TTF_SetFTError(const char *msg, FT_Error error)\n{\n#ifdef USE_FREETYPE_ERRORS\n#undef FTERRORS_H\n#define FT_ERRORDEF( e, v, s )  { e, s },\n    static const struct\n    {\n      int          err_code;\n      const char*  err_msg;\n    } ft_errors[] = {\n#include <freetype/fterrors.h>\n    };\n    int i;\n    const char *err_msg;\n    char buffer[1024];\n\n    err_msg = NULL;\n    for ( i=0; i<((sizeof ft_errors)/(sizeof ft_errors[0])); ++i ) {\n        if ( error == ft_errors[i].err_code ) {\n            err_msg = ft_errors[i].err_msg;\n            break;\n        }\n    }\n    if ( ! err_msg ) {\n        err_msg = \"unknown FreeType error\";\n    }\n    TTF_SetError(\"%s: %s\", msg, err_msg);\n#else\n    TTF_SetError(\"%s\", msg);\n#endif /* USE_FREETYPE_ERRORS */\n}\n\nint TTF_Init( void )\n{\n    int status = 0;\n\n    if ( ! TTF_initialized ) {\n        FT_Error error = FT_Init_FreeType( &library );\n        if ( error ) {\n            TTF_SetFTError(\"Couldn't init FreeType engine\", error);\n            status = -1;\n        }\n    }\n    if ( status == 0 ) {\n        ++TTF_initialized;\n    }\n    return status;\n}\n\nstatic unsigned long RWread(\n    FT_Stream stream,\n    unsigned long offset,\n    unsigned char* buffer,\n    unsigned long count\n)\n{\n    SDL_RWops *src;\n\n    src = (SDL_RWops *)stream->descriptor.pointer;\n    SDL_RWseek( src, (int)offset, RW_SEEK_SET );\n    if ( count == 0 ) {\n        return 0;\n    }\n    return (unsigned long)SDL_RWread( src, buffer, 1, (int)count );\n}\n\nTTF_Font* TTF_OpenFontIndexRW( SDL_RWops *src, int freesrc, int ptsize, long index )\n{\n    TTF_Font* font;\n    FT_Error error;\n    FT_Face face;\n    FT_Fixed scale;\n    FT_Stream stream;\n    FT_CharMap found;\n    Sint64 position;\n    int i;\n\n    if ( ! TTF_initialized ) {\n        TTF_SetError( \"Library not initialized\" );\n        if ( src && freesrc ) {\n            SDL_RWclose( src );\n        }\n        return NULL;\n    }\n\n    if ( ! src ) {\n        TTF_SetError( \"Passed a NULL font source\" );\n        return NULL;\n    }\n\n    /* Check to make sure we can seek in this stream */\n    position = SDL_RWtell(src);\n    if ( position < 0 ) {\n        TTF_SetError( \"Can't seek in stream\" );\n        if ( freesrc ) {\n            SDL_RWclose( src );\n        }\n        return NULL;\n    }\n\n    font = (TTF_Font*)SDL_malloc(sizeof *font);\n    if ( font == NULL ) {\n        TTF_SetError( \"Out of memory\" );\n        if ( freesrc ) {\n            SDL_RWclose( src );\n        }\n        return NULL;\n    }\n    SDL_memset(font, 0, sizeof(*font));\n\n    font->src = src;\n    font->freesrc = freesrc;\n\n    stream = (FT_Stream)SDL_malloc(sizeof(*stream));\n    if ( stream == NULL ) {\n        TTF_SetError( \"Out of memory\" );\n        TTF_CloseFont( font );\n        return NULL;\n    }\n    SDL_memset(stream, 0, sizeof(*stream));\n\n    stream->read = RWread;\n    stream->descriptor.pointer = src;\n    stream->pos = (unsigned long)position;\n    stream->size = (unsigned long)(SDL_RWsize(src) - position);\n\n    font->args.flags = FT_OPEN_STREAM;\n    font->args.stream = stream;\n\n    error = FT_Open_Face( library, &font->args, index, &font->face );\n    if ( error ) {\n        TTF_SetFTError( \"Couldn't load font file\", error );\n        TTF_CloseFont( font );\n        return NULL;\n    }\n    face = font->face;\n\n    /* Set charmap for loaded font */\n    found = 0;\n    for (i = 0; i < face->num_charmaps; i++) {\n        FT_CharMap charmap = face->charmaps[i];\n        if ((charmap->platform_id == 3 && charmap->encoding_id == 1) /* Windows Unicode */\n         || (charmap->platform_id == 3 && charmap->encoding_id == 0) /* Windows Symbol */\n         || (charmap->platform_id == 2 && charmap->encoding_id == 1) /* ISO Unicode */\n         || (charmap->platform_id == 0)) { /* Apple Unicode */\n            found = charmap;\n            break;\n        }\n    }\n    if ( found ) {\n        /* If this fails, continue using the default charmap */\n        FT_Set_Charmap(face, found);\n    }\n\n    /* Make sure that our font face is scalable (global metrics) */\n    if ( FT_IS_SCALABLE(face) ) {\n        /* Set the character size and use default DPI (72) */\n        error = FT_Set_Char_Size( font->face, 0, ptsize * 64, 0, 0 );\n        if ( error ) {\n            TTF_SetFTError( \"Couldn't set font size\", error );\n            TTF_CloseFont( font );\n            return NULL;\n        }\n\n        /* Get the scalable font metrics for this font */\n        scale = face->size->metrics.y_scale;\n        font->ascent  = FT_CEIL(FT_MulFix(face->ascender, scale));\n        font->descent = FT_CEIL(FT_MulFix(face->descender, scale));\n        font->height  = font->ascent - font->descent + /* baseline */ 1;\n        font->lineskip = FT_CEIL(FT_MulFix(face->height, scale));\n        font->underline_offset = FT_FLOOR(FT_MulFix(face->underline_position, scale));\n        font->underline_height = FT_FLOOR(FT_MulFix(face->underline_thickness, scale));\n\n    } else {\n        /* Non-scalable font case.  ptsize determines which family\n         * or series of fonts to grab from the non-scalable format.\n         * It is not the point size of the font.\n         * */\n        if ( ptsize >= font->face->num_fixed_sizes )\n            ptsize = font->face->num_fixed_sizes - 1;\n        font->font_size_family = ptsize;\n        error = FT_Set_Pixel_Sizes( face,\n                face->available_sizes[ptsize].width,\n                face->available_sizes[ptsize].height );\n\n        /* With non-scalale fonts, Freetype2 likes to fill many of the\n         * font metrics with the value of 0.  The size of the\n         * non-scalable fonts must be determined differently\n         * or sometimes cannot be determined.\n         * */\n        font->ascent = face->available_sizes[ptsize].height;\n        font->descent = 0;\n        font->height = face->available_sizes[ptsize].height;\n        font->lineskip = FT_CEIL(font->ascent);\n        font->underline_offset = FT_FLOOR(face->underline_position);\n        font->underline_height = FT_FLOOR(face->underline_thickness);\n    }\n\n    if ( font->underline_height < 1 ) {\n        font->underline_height = 1;\n    }\n\n#ifdef DEBUG_FONTS\n    printf(\"Font metrics:\\n\");\n    printf(\"\\tascent = %d, descent = %d\\n\",\n        font->ascent, font->descent);\n    printf(\"\\theight = %d, lineskip = %d\\n\",\n        font->height, font->lineskip);\n    printf(\"\\tunderline_offset = %d, underline_height = %d\\n\",\n        font->underline_offset, font->underline_height);\n    printf(\"\\tunderline_top_row = %d, strikethrough_top_row = %d\\n\",\n        TTF_underline_top_row(font), TTF_strikethrough_top_row(font));\n#endif\n\n    /* Initialize the font face style */\n    font->face_style = TTF_STYLE_NORMAL;\n    if ( font->face->style_flags & FT_STYLE_FLAG_BOLD ) {\n        font->face_style |= TTF_STYLE_BOLD;\n    }\n    if ( font->face->style_flags & FT_STYLE_FLAG_ITALIC ) {\n        font->face_style |= TTF_STYLE_ITALIC;\n    }\n\n    /* Set the default font style */\n    font->style = font->face_style;\n    font->outline = 0;\n    font->kerning = 1;\n    font->glyph_overhang = face->size->metrics.y_ppem / 10;\n    /* x offset = cos(((90.0-12)/360)*2*M_PI), or 12 degree angle */\n    font->glyph_italics = 0.207f;\n    font->glyph_italics *= font->height;\n\n    return font;\n}\n\nTTF_Font* TTF_OpenFontRW( SDL_RWops *src, int freesrc, int ptsize )\n{\n    return TTF_OpenFontIndexRW(src, freesrc, ptsize, 0);\n}\n\nTTF_Font* TTF_OpenFontIndex( const char *file, int ptsize, long index )\n{\n    SDL_RWops *rw = SDL_RWFromFile(file, \"rb\");\n    if ( rw == NULL ) {\n        return NULL;\n    }\n    return TTF_OpenFontIndexRW(rw, 1, ptsize, index);\n}\n\nTTF_Font* TTF_OpenFont( const char *file, int ptsize )\n{\n    return TTF_OpenFontIndex(file, ptsize, 0);\n}\n\nstatic void Flush_Glyph( c_glyph* glyph )\n{\n    glyph->stored = 0;\n    glyph->index = 0;\n    if ( glyph->bitmap.buffer ) {\n        SDL_free( glyph->bitmap.buffer );\n        glyph->bitmap.buffer = 0;\n    }\n    if ( glyph->pixmap.buffer ) {\n        SDL_free( glyph->pixmap.buffer );\n        glyph->pixmap.buffer = 0;\n    }\n    glyph->cached = 0;\n}\n\nstatic void Flush_Cache( TTF_Font* font )\n{\n    int i;\n    int size = sizeof( font->cache ) / sizeof( font->cache[0] );\n\n    for ( i = 0; i < size; ++i ) {\n        if ( font->cache[i].cached ) {\n            Flush_Glyph( &font->cache[i] );\n        }\n\n    }\n}\n\nstatic FT_Error Load_Glyph( TTF_Font* font, Uint16 ch, c_glyph* cached, int want )\n{\n    FT_Face face;\n    FT_Error error;\n    FT_GlyphSlot glyph;\n    FT_Glyph_Metrics* metrics;\n    FT_Outline* outline;\n\n    if ( !font || !font->face ) {\n        return FT_Err_Invalid_Handle;\n    }\n\n    face = font->face;\n\n    /* Load the glyph */\n    if ( ! cached->index ) {\n        cached->index = FT_Get_Char_Index( face, ch );\n    }\n    error = FT_Load_Glyph( face, cached->index, FT_LOAD_DEFAULT | font->hinting);\n    if ( error ) {\n        return error;\n    }\n\n    /* Get our glyph shortcuts */\n    glyph = face->glyph;\n    metrics = &glyph->metrics;\n    outline = &glyph->outline;\n\n    /* Get the glyph metrics if desired */\n    if ( (want & CACHED_METRICS) && !(cached->stored & CACHED_METRICS) ) {\n        if ( FT_IS_SCALABLE( face ) ) {\n            /* Get the bounding box */\n            cached->minx = FT_FLOOR(metrics->horiBearingX);\n            cached->maxx = FT_CEIL(metrics->horiBearingX + metrics->width);\n            cached->maxy = FT_FLOOR(metrics->horiBearingY);\n            cached->miny = cached->maxy - FT_CEIL(metrics->height);\n            cached->yoffset = font->ascent - cached->maxy;\n            cached->advance = FT_CEIL(metrics->horiAdvance);\n        } else {\n            /* Get the bounding box for non-scalable format.\n             * Again, freetype2 fills in many of the font metrics\n             * with the value of 0, so some of the values we\n             * need must be calculated differently with certain\n             * assumptions about non-scalable formats.\n             * */\n            cached->minx = FT_FLOOR(metrics->horiBearingX);\n            cached->maxx = FT_CEIL(metrics->horiBearingX + metrics->width);\n            cached->maxy = FT_FLOOR(metrics->horiBearingY);\n            cached->miny = cached->maxy - FT_CEIL(face->available_sizes[font->font_size_family].height);\n            cached->yoffset = 0;\n            cached->advance = FT_CEIL(metrics->horiAdvance);\n        }\n\n        /* Adjust for bold and italic text */\n        if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n            cached->maxx += font->glyph_overhang;\n        }\n        if ( TTF_HANDLE_STYLE_ITALIC(font) ) {\n            cached->maxx += (int)SDL_ceil(font->glyph_italics);\n        }\n        cached->stored |= CACHED_METRICS;\n    }\n\n    if ( ((want & CACHED_BITMAP) && !(cached->stored & CACHED_BITMAP)) ||\n         ((want & CACHED_PIXMAP) && !(cached->stored & CACHED_PIXMAP)) ) {\n        int mono = (want & CACHED_BITMAP);\n        int i;\n        FT_Bitmap* src;\n        FT_Bitmap* dst;\n        FT_Glyph bitmap_glyph = NULL;\n\n        /* Handle the italic style */\n        if ( TTF_HANDLE_STYLE_ITALIC(font) ) {\n            FT_Matrix shear;\n\n            shear.xx = 1 << 16;\n            shear.xy = (int) ( font->glyph_italics * ( 1 << 16 ) ) / font->height;\n            shear.yx = 0;\n            shear.yy = 1 << 16;\n\n            FT_Outline_Transform( outline, &shear );\n        }\n\n        /* Render as outline */\n        if ( (font->outline > 0) && glyph->format != FT_GLYPH_FORMAT_BITMAP ) {\n            FT_Stroker stroker;\n            FT_Get_Glyph( glyph, &bitmap_glyph );\n            error = FT_Stroker_New( library, &stroker );\n            if ( error ) {\n                return error;\n            }\n            FT_Stroker_Set( stroker, font->outline * 64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0 );\n            FT_Glyph_Stroke( &bitmap_glyph, stroker, 1 /* delete the original glyph */ );\n            FT_Stroker_Done( stroker );\n            /* Render the glyph */\n            error = FT_Glyph_To_Bitmap( &bitmap_glyph, mono ? ft_render_mode_mono : ft_render_mode_normal, 0, 1 );\n            if ( error ) {\n                FT_Done_Glyph( bitmap_glyph );\n                return error;\n            }\n            src = &((FT_BitmapGlyph)bitmap_glyph)->bitmap;\n        } else {\n            /* Render the glyph */\n            error = FT_Render_Glyph( glyph, mono ? ft_render_mode_mono : ft_render_mode_normal );\n            if ( error ) {\n                return error;\n            }\n            src = &glyph->bitmap;\n        }\n        /* Copy over information to cache */\n        if ( mono ) {\n            dst = &cached->bitmap;\n        } else {\n            dst = &cached->pixmap;\n        }\n        SDL_memcpy( dst, src, sizeof( *dst ) );\n\n        /* FT_Render_Glyph() and .fon fonts always generate a\n         * two-color (black and white) glyphslot surface, even\n         * when rendered in ft_render_mode_normal. */\n        /* FT_IS_SCALABLE() means that the font is in outline format,\n         * but does not imply that outline is rendered as 8-bit\n         * grayscale, because embedded bitmap/graymap is preferred\n         * (see FT_LOAD_DEFAULT section of FreeType2 API Reference).\n         * FT_Render_Glyph() canreturn two-color bitmap or 4/16/256-\n         * color graymap according to the format of embedded bitmap/\n         * graymap. */\n        if ( src->pixel_mode == FT_PIXEL_MODE_MONO ) {\n            dst->pitch *= 8;\n        } else if ( src->pixel_mode == FT_PIXEL_MODE_GRAY2 ) {\n            dst->pitch *= 4;\n        } else if ( src->pixel_mode == FT_PIXEL_MODE_GRAY4 ) {\n            dst->pitch *= 2;\n        }\n\n        /* Adjust for bold and italic text */\n        if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n            int bump = font->glyph_overhang;\n            dst->pitch += bump;\n            dst->width += bump;\n        }\n        if ( TTF_HANDLE_STYLE_ITALIC(font) ) {\n            int bump = (int)SDL_ceil(font->glyph_italics);\n            dst->pitch += bump;\n            dst->width += bump;\n        }\n\n        if (dst->rows != 0) {\n            dst->buffer = (unsigned char *)SDL_malloc( dst->pitch * dst->rows );\n            if ( !dst->buffer ) {\n                return FT_Err_Out_Of_Memory;\n            }\n            SDL_memset( dst->buffer, 0, dst->pitch * dst->rows );\n\n            for ( i = 0; i < src->rows; i++ ) {\n                int soffset = i * src->pitch;\n                int doffset = i * dst->pitch;\n                if ( mono ) {\n                    unsigned char *srcp = src->buffer + soffset;\n                    unsigned char *dstp = dst->buffer + doffset;\n                    int j;\n                    if ( src->pixel_mode == FT_PIXEL_MODE_MONO ) {\n                        for ( j = 0; j < src->width; j += 8 ) {\n                            unsigned char c = *srcp++;\n                            *dstp++ = (c&0x80) >> 7;\n                            c <<= 1;\n                            *dstp++ = (c&0x80) >> 7;\n                            c <<= 1;\n                            *dstp++ = (c&0x80) >> 7;\n                            c <<= 1;\n                            *dstp++ = (c&0x80) >> 7;\n                            c <<= 1;\n                            *dstp++ = (c&0x80) >> 7;\n                            c <<= 1;\n                            *dstp++ = (c&0x80) >> 7;\n                            c <<= 1;\n                            *dstp++ = (c&0x80) >> 7;\n                            c <<= 1;\n                            *dstp++ = (c&0x80) >> 7;\n                        }\n                    }  else if ( src->pixel_mode == FT_PIXEL_MODE_GRAY2 ) {\n                        for ( j = 0; j < src->width; j += 4 ) {\n                            unsigned char c = *srcp++;\n                            *dstp++ = (((c&0xA0) >> 6) >= 0x2) ? 1 : 0;\n                            c <<= 2;\n                            *dstp++ = (((c&0xA0) >> 6) >= 0x2) ? 1 : 0;\n                            c <<= 2;\n                            *dstp++ = (((c&0xA0) >> 6) >= 0x2) ? 1 : 0;\n                            c <<= 2;\n                            *dstp++ = (((c&0xA0) >> 6) >= 0x2) ? 1 : 0;\n                        }\n                    } else if ( src->pixel_mode == FT_PIXEL_MODE_GRAY4 ) {\n                        for ( j = 0; j < src->width; j += 2 ) {\n                            unsigned char c = *srcp++;\n                            *dstp++ = (((c&0xF0) >> 4) >= 0x8) ? 1 : 0;\n                            c <<= 4;\n                            *dstp++ = (((c&0xF0) >> 4) >= 0x8) ? 1 : 0;\n                        }\n                    } else {\n                        for ( j = 0; j < src->width; j++ ) {\n                            unsigned char c = *srcp++;\n                            *dstp++ = (c >= 0x80) ? 1 : 0;\n                        }\n                    }\n                } else if ( src->pixel_mode == FT_PIXEL_MODE_MONO ) {\n                    /* This special case wouldn't\n                     * be here if the FT_Render_Glyph()\n                     * function wasn't buggy when it tried\n                     * to render a .fon font with 256\n                     * shades of gray.  Instead, it\n                     * returns a black and white surface\n                     * and we have to translate it back\n                     * to a 256 gray shaded surface.\n                     * */\n                    unsigned char *srcp = src->buffer + soffset;\n                    unsigned char *dstp = dst->buffer + doffset;\n                    unsigned char c;\n                    int j, k;\n                    for ( j = 0; j < src->width; j += 8) {\n                        c = *srcp++;\n                        for (k = 0; k < 8; ++k) {\n                            if ((c&0x80) >> 7) {\n                                *dstp++ = NUM_GRAYS - 1;\n                            } else {\n                                *dstp++ = 0x00;\n                            }\n                            c <<= 1;\n                        }\n                    }\n                } else if ( src->pixel_mode == FT_PIXEL_MODE_GRAY2 ) {\n                    unsigned char *srcp = src->buffer + soffset;\n                    unsigned char *dstp = dst->buffer + doffset;\n                    unsigned char c;\n                    int j, k;\n                    for ( j = 0; j < src->width; j += 4 ) {\n                        c = *srcp++;\n                        for ( k = 0; k < 4; ++k ) {\n                            if ((c&0xA0) >> 6) {\n                                *dstp++ = NUM_GRAYS * ((c&0xA0) >> 6) / 3 - 1;\n                            } else {\n                                *dstp++ = 0x00;\n                            }\n                            c <<= 2;\n                        }\n                    }\n                } else if ( src->pixel_mode == FT_PIXEL_MODE_GRAY4 ) {\n                    unsigned char *srcp = src->buffer + soffset;\n                    unsigned char *dstp = dst->buffer + doffset;\n                    unsigned char c;\n                    int j, k;\n                    for ( j = 0; j < src->width; j += 2 ) {\n                        c = *srcp++;\n                        for ( k = 0; k < 2; ++k ) {\n                            if ((c&0xF0) >> 4) {\n                                *dstp++ = NUM_GRAYS * ((c&0xF0) >> 4) / 15 - 1;\n                            } else {\n                                *dstp++ = 0x00;\n                            }\n                            c <<= 4;\n                        }\n                    }\n                } else {\n                    SDL_memcpy(dst->buffer+doffset,\n                           src->buffer+soffset, src->pitch);\n                }\n            }\n        }\n\n        /* Handle the bold style */\n        if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n            int row;\n            int col;\n            int offset;\n            int pixel;\n            Uint8* pixmap;\n\n            /* The pixmap is a little hard, we have to add and clamp */\n            for ( row = dst->rows - 1; row >= 0; --row ) {\n                pixmap = (Uint8*) dst->buffer + row * dst->pitch;\n                for ( offset=1; offset <= font->glyph_overhang; ++offset ) {\n                    for ( col = dst->width - 1; col > 0; --col ) {\n                        if ( mono ) {\n                            pixmap[col] |= pixmap[col-1];\n                        } else {\n                            pixel = (pixmap[col] + pixmap[col-1]);\n                            if ( pixel > NUM_GRAYS - 1 ) {\n                                pixel = NUM_GRAYS - 1;\n                            }\n                            pixmap[col] = (Uint8) pixel;\n                        }\n                    }\n                }\n            }\n        }\n\n        /* Mark that we rendered this format */\n        if ( mono ) {\n            cached->stored |= CACHED_BITMAP;\n        } else {\n            cached->stored |= CACHED_PIXMAP;\n        }\n\n        /* Free outlined glyph */\n        if ( bitmap_glyph ) {\n            FT_Done_Glyph( bitmap_glyph );\n        }\n    }\n\n    /* We're done, mark this glyph cached */\n    cached->cached = ch;\n\n    return 0;\n}\n\nstatic FT_Error Find_Glyph( TTF_Font* font, Uint16 ch, int want )\n{\n    int retval = 0;\n    int hsize = sizeof( font->cache ) / sizeof( font->cache[0] );\n\n    int h = ch % hsize;\n    font->current = &font->cache[h];\n\n    if (font->current->cached != ch)\n        Flush_Glyph( font->current );\n\n    if ( (font->current->stored & want) != want ) {\n        retval = Load_Glyph( font, ch, font->current, want );\n    }\n    return retval;\n}\n\nvoid TTF_CloseFont( TTF_Font* font )\n{\n    if ( font ) {\n        Flush_Cache( font );\n        if ( font->face ) {\n            FT_Done_Face( font->face );\n        }\n        if ( font->args.stream ) {\n            SDL_free( font->args.stream );\n        }\n        if ( font->freesrc ) {\n            SDL_RWclose( font->src );\n        }\n        SDL_free( font );\n    }\n}\n\n/* Gets the number of bytes used by a null terminated UCS2 string */\nstatic size_t UCS2_len(const Uint16 *text)\n{\n    size_t count = 0;\n    while (*text++) {\n        ++count;\n    }\n    return count * sizeof(*text);\n}\n\n/* Convert a Latin-1 string to a UTF-8 string */\nstatic void LATIN1_to_UTF8(const char *src, Uint8 *dst)\n{\n    while (*src) {\n        Uint8 ch = *(Uint8*)src++;\n        if (ch <= 0x7F) {\n            *dst++ = ch;\n        } else {\n            *dst++ = 0xC0 | ((ch >> 6) & 0x1F);\n            *dst++ = 0x80 | (ch & 0x3F);\n        }\n    }\n    *dst = '\\0';\n}\n\n/* Convert a UCS-2 string to a UTF-8 string */\nstatic void UCS2_to_UTF8(const Uint16 *src, Uint8 *dst)\n{\n    int swapped = TTF_byteswapped;\n\n    while (*src) {\n        Uint16 ch = *(Uint16*)src++;\n        if (ch == UNICODE_BOM_NATIVE) {\n            swapped = 0;\n            continue;\n        }\n        if (ch == UNICODE_BOM_SWAPPED) {\n            swapped = 1;\n            continue;\n        }\n        if (swapped) {\n            ch = SDL_Swap16(ch);\n        }\n        if (ch <= 0x7F) {\n            *dst++ = (Uint8) ch;\n        } else if (ch <= 0x7FF) {\n            *dst++ = 0xC0 | (Uint8) ((ch >> 6) & 0x1F);\n            *dst++ = 0x80 | (Uint8) (ch & 0x3F);\n        } else {\n            *dst++ = 0xE0 | (Uint8) ((ch >> 12) & 0x0F);\n            *dst++ = 0x80 | (Uint8) ((ch >> 6) & 0x3F);\n            *dst++ = 0x80 | (Uint8) (ch & 0x3F);\n        }\n    }\n    *dst = '\\0';\n}\n\n/* Gets a unicode value from a UTF-8 encoded string and advance the string */\n#define UNKNOWN_UNICODE 0xFFFD\nstatic Uint32 UTF8_getch(const char **src, size_t *srclen)\n{\n    const Uint8 *p = *(const Uint8**)src;\n    size_t left = 0;\n    SDL_bool overlong = SDL_FALSE;\n    SDL_bool underflow = SDL_FALSE;\n    Uint32 ch = UNKNOWN_UNICODE;\n\n    if (*srclen == 0) {\n        return UNKNOWN_UNICODE;\n    }\n    if (p[0] >= 0xFC) {\n        if ((p[0] & 0xFE) == 0xFC) {\n            if (p[0] == 0xFC && (p[1] & 0xFC) == 0x80) {\n                overlong = SDL_TRUE;\n            }\n            ch = (Uint32) (p[0] & 0x01);\n            left = 5;\n        }\n    } else if (p[0] >= 0xF8) {\n        if ((p[0] & 0xFC) == 0xF8) {\n            if (p[0] == 0xF8 && (p[1] & 0xF8) == 0x80) {\n                overlong = SDL_TRUE;\n            }\n            ch = (Uint32) (p[0] & 0x03);\n            left = 4;\n        }\n    } else if (p[0] >= 0xF0) {\n        if ((p[0] & 0xF8) == 0xF0) {\n            if (p[0] == 0xF0 && (p[1] & 0xF0) == 0x80) {\n                overlong = SDL_TRUE;\n            }\n            ch = (Uint32) (p[0] & 0x07);\n            left = 3;\n        }\n    } else if (p[0] >= 0xE0) {\n        if ((p[0] & 0xF0) == 0xE0) {\n            if (p[0] == 0xE0 && (p[1] & 0xE0) == 0x80) {\n                overlong = SDL_TRUE;\n            }\n            ch = (Uint32) (p[0] & 0x0F);\n            left = 2;\n        }\n    } else if (p[0] >= 0xC0) {\n        if ((p[0] & 0xE0) == 0xC0) {\n            if ((p[0] & 0xDE) == 0xC0) {\n                overlong = SDL_TRUE;\n            }\n            ch = (Uint32) (p[0] & 0x1F);\n            left = 1;\n        }\n    } else {\n        if ((p[0] & 0x80) == 0x00) {\n            ch = (Uint32) p[0];\n        }\n    }\n    ++*src;\n    --*srclen;\n    while (left > 0 && *srclen > 0) {\n        ++p;\n        if ((p[0] & 0xC0) != 0x80) {\n            ch = UNKNOWN_UNICODE;\n            break;\n        }\n        ch <<= 6;\n        ch |= (p[0] & 0x3F);\n        ++*src;\n        --*srclen;\n        --left;\n    }\n    if (left > 0) {\n        underflow = SDL_TRUE;\n    }\n    /* Technically overlong sequences are invalid and should not be interpreted.\n       However, it doesn't cause a security risk here and I don't see any harm in\n       displaying them. The application is responsible for any other side effects\n       of allowing overlong sequences (e.g. string compares failing, etc.)\n       See bug 1931 for sample input that triggers this.\n    */\n    /*if (overlong) return UNKNOWN_UNICODE;*/\n    if (underflow ||\n        (ch >= 0xD800 && ch <= 0xDFFF) ||\n        (ch == 0xFFFE || ch == 0xFFFF) || ch > 0x10FFFF) {\n        ch = UNKNOWN_UNICODE;\n    }\n    return ch;\n}\n\nint TTF_FontHeight(const TTF_Font *font)\n{\n    return(font->height);\n}\n\nint TTF_FontAscent(const TTF_Font *font)\n{\n    return(font->ascent);\n}\n\nint TTF_FontDescent(const TTF_Font *font)\n{\n    return(font->descent);\n}\n\nint TTF_FontLineSkip(const TTF_Font *font)\n{\n    return(font->lineskip);\n}\n\nint TTF_GetFontKerning(const TTF_Font *font)\n{\n    return(font->kerning);\n}\n\nvoid TTF_SetFontKerning(TTF_Font *font, int allowed)\n{\n    font->kerning = allowed;\n}\n\nlong TTF_FontFaces(const TTF_Font *font)\n{\n    return(font->face->num_faces);\n}\n\nint TTF_FontFaceIsFixedWidth(const TTF_Font *font)\n{\n    return(FT_IS_FIXED_WIDTH(font->face));\n}\n\nchar *TTF_FontFaceFamilyName(const TTF_Font *font)\n{\n    return(font->face->family_name);\n}\n\nchar *TTF_FontFaceStyleName(const TTF_Font *font)\n{\n    return(font->face->style_name);\n}\n\nint TTF_GlyphIsProvided(const TTF_Font *font, Uint16 ch)\n{\n  return(FT_Get_Char_Index(font->face, ch));\n}\n\nint TTF_GlyphMetrics(TTF_Font *font, Uint16 ch,\n                     int* minx, int* maxx, int* miny, int* maxy, int* advance)\n{\n    FT_Error error;\n\n    error = Find_Glyph(font, ch, CACHED_METRICS);\n    if ( error ) {\n        TTF_SetFTError(\"Couldn't find glyph\", error);\n        return -1;\n    }\n\n    if ( minx ) {\n        *minx = font->current->minx;\n    }\n    if ( maxx ) {\n        *maxx = font->current->maxx;\n        if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n            *maxx += font->glyph_overhang;\n        }\n    }\n    if ( miny ) {\n        *miny = font->current->miny;\n    }\n    if ( maxy ) {\n        *maxy = font->current->maxy;\n    }\n    if ( advance ) {\n        *advance = font->current->advance;\n        if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n            *advance += font->glyph_overhang;\n        }\n    }\n    return 0;\n}\n\nint TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h)\n{\n    int status = -1;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, -1);\n\n    utf8 = SDL_stack_alloc(Uint8, SDL_strlen(text)*2+1);\n    if ( utf8 ) {\n        LATIN1_to_UTF8(text, utf8);\n        status = TTF_SizeUTF8(font, (char *)utf8, w, h);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return status;\n}\n\nint TTF_SizeUTF8(TTF_Font *font, const char *text, int *w, int *h)\n{\n    int status;\n    int x, z;\n    int minx, maxx;\n    int miny, maxy;\n    c_glyph *glyph;\n    FT_Error error;\n    FT_Long use_kerning;\n    FT_UInt prev_index = 0;\n    int outline_delta = 0;\n    size_t textlen;\n\n    TTF_CHECKPOINTER(text, -1);\n\n    /* Initialize everything to 0 */\n    status = 0;\n    minx = maxx = 0;\n    miny = maxy = 0;\n\n    /* check kerning */\n    use_kerning = FT_HAS_KERNING( font->face ) && font->kerning;\n\n    /* Init outline handling */\n    if ( font->outline  > 0 ) {\n        outline_delta = font->outline * 2;\n    }\n\n    /* Load each character and sum it's bounding box */\n    textlen = SDL_strlen(text);\n    x= 0;\n    while ( textlen > 0 ) {\n        Uint16 c = UTF8_getch(&text, &textlen);\n        if ( c == UNICODE_BOM_NATIVE || c == UNICODE_BOM_SWAPPED ) {\n            continue;\n        }\n\n        error = Find_Glyph(font, c, CACHED_METRICS);\n        if ( error ) {\n            TTF_SetFTError(\"Couldn't find glyph\", error);\n            return -1;\n        }\n        glyph = font->current;\n\n        /* handle kerning */\n        if ( use_kerning && prev_index && glyph->index ) {\n            FT_Vector delta;\n            FT_Get_Kerning( font->face, prev_index, glyph->index, ft_kerning_default, &delta );\n            x += delta.x >> 6;\n        }\n\n#if 0\n        if ( (ch == text) && (glyph->minx < 0) ) {\n        /* Fixes the texture wrapping bug when the first letter\n         * has a negative minx value or horibearing value.  The entire\n         * bounding box must be adjusted to be bigger so the entire\n         * letter can fit without any texture corruption or wrapping.\n         *\n         * Effects: First enlarges bounding box.\n         * Second, xstart has to start ahead of its normal spot in the\n         * negative direction of the negative minx value.\n         * (pushes everything to the right).\n         *\n         * This will make the memory copy of the glyph bitmap data\n         * work out correctly.\n         * */\n            z -= glyph->minx;\n        }\n#endif\n\n        z = x + glyph->minx;\n        if ( minx > z ) {\n            minx = z;\n        }\n        if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n            x += font->glyph_overhang;\n        }\n        if ( glyph->advance > glyph->maxx ) {\n            z = x + glyph->advance;\n        } else {\n            z = x + glyph->maxx;\n        }\n        if ( maxx < z ) {\n            maxx = z;\n        }\n        x += glyph->advance;\n\n        if ( glyph->miny < miny ) {\n            miny = glyph->miny;\n        }\n        if ( glyph->maxy > maxy ) {\n            maxy = glyph->maxy;\n        }\n        prev_index = glyph->index;\n    }\n\n    /* Fill the bounds rectangle */\n    if ( w ) {\n        /* Add outline extra width */\n        *w = (maxx - minx) + outline_delta;\n    }\n    if ( h ) {\n        /* Some fonts descend below font height (FletcherGothicFLF) */\n        /* Add outline extra height */\n        *h = (font->ascent - miny) + outline_delta;\n        if ( *h < font->height ) {\n            *h = font->height;\n        }\n        /* Update height according to the needs of the underline style */\n        if ( TTF_HANDLE_STYLE_UNDERLINE(font) ) {\n            int bottom_row = TTF_underline_bottom_row(font);\n            if ( *h < bottom_row ) {\n                *h = bottom_row;\n            }\n        }\n    }\n    return status;\n}\n\nint TTF_SizeUNICODE(TTF_Font *font, const Uint16 *text, int *w, int *h)\n{\n    int status = -1;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, -1);\n\n    utf8 = SDL_stack_alloc(Uint8, UCS2_len(text)*3+1);\n    if ( utf8 ) {\n        UCS2_to_UTF8(text, utf8);\n        status = TTF_SizeUTF8(font, (char *)utf8, w, h);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return status;\n}\n\nSDL_Surface *TTF_RenderText_Solid(TTF_Font *font,\n                const char *text, SDL_Color fg)\n{\n    SDL_Surface *surface = NULL;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    utf8 = SDL_stack_alloc(Uint8, SDL_strlen(text)*2+1);\n    if ( utf8 ) {\n        LATIN1_to_UTF8(text, utf8);\n        surface = TTF_RenderUTF8_Solid(font, (char *)utf8, fg);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return surface;\n}\n\nSDL_Surface *TTF_RenderUTF8_Solid(TTF_Font *font,\n                const char *text, SDL_Color fg)\n{\n    SDL_bool first;\n    int xstart;\n    int width;\n    int height;\n    SDL_Surface* textbuf;\n    SDL_Palette* palette;\n    Uint8* src;\n    Uint8* dst;\n    Uint8 *dst_check;\n    int row, col;\n    c_glyph *glyph;\n\n    FT_Bitmap *current;\n    FT_Error error;\n    FT_Long use_kerning;\n    FT_UInt prev_index = 0;\n    size_t textlen;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    /* Get the dimensions of the text surface */\n    if ( ( TTF_SizeUTF8(font, text, &width, &height) < 0 ) || !width ) {\n        TTF_SetError( \"Text has zero width\" );\n        return NULL;\n    }\n\n    /* Create the target surface */\n    textbuf = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 8, 0, 0, 0, 0);\n    if ( textbuf == NULL ) {\n        return NULL;\n    }\n\n    /* Adding bound checking to avoid all kinds of memory corruption errors\n       that may occur. */\n    dst_check = (Uint8*)textbuf->pixels + textbuf->pitch * textbuf->h;\n\n    /* Fill the palette with the foreground color */\n    palette = textbuf->format->palette;\n    palette->colors[0].r = 255 - fg.r;\n    palette->colors[0].g = 255 - fg.g;\n    palette->colors[0].b = 255 - fg.b;\n    palette->colors[1].r = fg.r;\n    palette->colors[1].g = fg.g;\n    palette->colors[1].b = fg.b;\n    SDL_SetColorKey( textbuf, SDL_TRUE, 0 );\n\n    /* check kerning */\n    use_kerning = FT_HAS_KERNING( font->face ) && font->kerning;\n\n    /* Load and render each character */\n    textlen = SDL_strlen(text);\n    first = SDL_TRUE;\n    xstart = 0;\n    while ( textlen > 0 ) {\n        Uint16 c = UTF8_getch(&text, &textlen);\n        if ( c == UNICODE_BOM_NATIVE || c == UNICODE_BOM_SWAPPED ) {\n            continue;\n        }\n\n        error = Find_Glyph(font, c, CACHED_METRICS|CACHED_BITMAP);\n        if ( error ) {\n            TTF_SetFTError(\"Couldn't find glyph\", error);\n            SDL_FreeSurface( textbuf );\n            return NULL;\n        }\n        glyph = font->current;\n        current = &glyph->bitmap;\n        /* Ensure the width of the pixmap is correct. On some cases,\n         * freetype may report a larger pixmap than possible.*/\n        width = current->width;\n        if (font->outline <= 0 && width > glyph->maxx - glyph->minx) {\n            width = glyph->maxx - glyph->minx;\n        }\n        /* do kerning, if possible AC-Patch */\n        if ( use_kerning && prev_index && glyph->index ) {\n            FT_Vector delta;\n            FT_Get_Kerning( font->face, prev_index, glyph->index, ft_kerning_default, &delta );\n            xstart += delta.x >> 6;\n        }\n        /* Compensate for wrap around bug with negative minx's */\n        if ( first && (glyph->minx < 0) ) {\n            xstart -= glyph->minx;\n        }\n        first = SDL_FALSE;\n\n        for ( row = 0; row < current->rows; ++row ) {\n            /* Make sure we don't go either over, or under the\n             * limit */\n            if ( row+glyph->yoffset < 0 ) {\n                continue;\n            }\n            if ( row+glyph->yoffset >= textbuf->h ) {\n                continue;\n            }\n            dst = (Uint8*) textbuf->pixels +\n                (row+glyph->yoffset) * textbuf->pitch +\n                xstart + glyph->minx;\n            src = current->buffer + row * current->pitch;\n\n            for ( col=width; col>0 && dst < dst_check; --col ) {\n                *dst++ |= *src++;\n            }\n        }\n\n        xstart += glyph->advance;\n        if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n            xstart += font->glyph_overhang;\n        }\n        prev_index = glyph->index;\n    }\n\n    /* Handle the underline style */\n    if ( TTF_HANDLE_STYLE_UNDERLINE(font) ) {\n        row = TTF_underline_top_row(font);\n        TTF_drawLine_Solid(font, textbuf, row);\n    }\n\n    /* Handle the strikethrough style */\n    if ( TTF_HANDLE_STYLE_STRIKETHROUGH(font) ) {\n        row = TTF_strikethrough_top_row(font);\n        TTF_drawLine_Solid(font, textbuf, row);\n    }\n    return textbuf;\n}\n\nSDL_Surface *TTF_RenderUNICODE_Solid(TTF_Font *font,\n                const Uint16 *text, SDL_Color fg)\n{\n    SDL_Surface *surface = NULL;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    utf8 = SDL_stack_alloc(Uint8, UCS2_len(text)*3+1);\n    if ( utf8 ) {\n        UCS2_to_UTF8(text, utf8);\n        surface = TTF_RenderUTF8_Solid(font, (char *)utf8, fg);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return surface;\n}\n\nSDL_Surface *TTF_RenderGlyph_Solid(TTF_Font *font, Uint16 ch, SDL_Color fg)\n{\n    Uint16 ucs2[2] = { ch, 0 };\n    Uint8 utf8[4];\n\n    UCS2_to_UTF8(ucs2, utf8);\n    return TTF_RenderUTF8_Solid(font, (char *)utf8, fg);\n}\n\nSDL_Surface *TTF_RenderText_Shaded(TTF_Font *font,\n                const char *text, SDL_Color fg, SDL_Color bg)\n{\n    SDL_Surface *surface = NULL;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    utf8 = SDL_stack_alloc(Uint8, SDL_strlen(text)*2+1);\n    if ( utf8 ) {\n        LATIN1_to_UTF8(text, utf8);\n        surface = TTF_RenderUTF8_Shaded(font, (char *)utf8, fg, bg);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return surface;\n}\n\n/* Convert the UTF-8 text to UNICODE and render it\n*/\nSDL_Surface *TTF_RenderUTF8_Shaded(TTF_Font *font,\n                const char *text, SDL_Color fg, SDL_Color bg)\n{\n    SDL_bool first;\n    int xstart;\n    int width;\n    int height;\n    SDL_Surface* textbuf;\n    SDL_Palette* palette;\n    int index;\n    int rdiff;\n    int gdiff;\n    int bdiff;\n    Uint8* src;\n    Uint8* dst;\n    Uint8* dst_check;\n    int row, col;\n    FT_Bitmap* current;\n    c_glyph *glyph;\n    FT_Error error;\n    FT_Long use_kerning;\n    FT_UInt prev_index = 0;\n    size_t textlen;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    /* Get the dimensions of the text surface */\n    if ( ( TTF_SizeUTF8(font, text, &width, &height) < 0 ) || !width ) {\n        TTF_SetError(\"Text has zero width\");\n        return NULL;\n    }\n\n    /* Create the target surface */\n    textbuf = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 8, 0, 0, 0, 0);\n    if ( textbuf == NULL ) {\n        return NULL;\n    }\n\n    /* Adding bound checking to avoid all kinds of memory corruption errors\n       that may occur. */\n    dst_check = (Uint8*)textbuf->pixels + textbuf->pitch * textbuf->h;\n\n    /* Fill the palette with NUM_GRAYS levels of shading from bg to fg */\n    palette = textbuf->format->palette;\n    rdiff = fg.r - bg.r;\n    gdiff = fg.g - bg.g;\n    bdiff = fg.b - bg.b;\n\n    for ( index = 0; index < NUM_GRAYS; ++index ) {\n        palette->colors[index].r = bg.r + (index*rdiff) / (NUM_GRAYS-1);\n        palette->colors[index].g = bg.g + (index*gdiff) / (NUM_GRAYS-1);\n        palette->colors[index].b = bg.b + (index*bdiff) / (NUM_GRAYS-1);\n    }\n\n    /* check kerning */\n    use_kerning = FT_HAS_KERNING( font->face ) && font->kerning;\n\n    /* Load and render each character */\n    textlen = SDL_strlen(text);\n    first = SDL_TRUE;\n    xstart = 0;\n    while ( textlen > 0 ) {\n        Uint16 c = UTF8_getch(&text, &textlen);\n        if ( c == UNICODE_BOM_NATIVE || c == UNICODE_BOM_SWAPPED ) {\n            continue;\n        }\n\n        error = Find_Glyph(font, c, CACHED_METRICS|CACHED_PIXMAP);\n        if ( error ) {\n            TTF_SetFTError(\"Couldn't find glyph\", error);\n            SDL_FreeSurface( textbuf );\n            return NULL;\n        }\n        glyph = font->current;\n        /* Ensure the width of the pixmap is correct. On some cases,\n         * freetype may report a larger pixmap than possible.*/\n        width = glyph->pixmap.width;\n        if (font->outline <= 0 && width > glyph->maxx - glyph->minx) {\n            width = glyph->maxx - glyph->minx;\n        }\n        /* do kerning, if possible AC-Patch */\n        if ( use_kerning && prev_index && glyph->index ) {\n            FT_Vector delta;\n            FT_Get_Kerning( font->face, prev_index, glyph->index, ft_kerning_default, &delta );\n            xstart += delta.x >> 6;\n        }\n        /* Compensate for the wrap around with negative minx's */\n        if ( first && (glyph->minx < 0) ) {\n            xstart -= glyph->minx;\n        }\n        first = SDL_FALSE;\n\n        current = &glyph->pixmap;\n        for ( row = 0; row < current->rows; ++row ) {\n            /* Make sure we don't go either over, or under the\n             * limit */\n            if ( row+glyph->yoffset < 0 ) {\n                continue;\n            }\n            if ( row+glyph->yoffset >= textbuf->h ) {\n                continue;\n            }\n            dst = (Uint8*) textbuf->pixels +\n                (row+glyph->yoffset) * textbuf->pitch +\n                xstart + glyph->minx;\n            src = current->buffer + row * current->pitch;\n            for ( col=width; col>0 && dst < dst_check; --col ) {\n                *dst++ |= *src++;\n            }\n        }\n\n        xstart += glyph->advance;\n        if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n            xstart += font->glyph_overhang;\n        }\n        prev_index = glyph->index;\n    }\n\n    /* Handle the underline style */\n    if ( TTF_HANDLE_STYLE_UNDERLINE(font) ) {\n        row = TTF_underline_top_row(font);\n        TTF_drawLine_Shaded(font, textbuf, row);\n    }\n\n    /* Handle the strikethrough style */\n    if ( TTF_HANDLE_STYLE_STRIKETHROUGH(font) ) {\n        row = TTF_strikethrough_top_row(font);\n        TTF_drawLine_Shaded(font, textbuf, row);\n    }\n    return textbuf;\n}\n\nSDL_Surface* TTF_RenderUNICODE_Shaded( TTF_Font* font,\n                       const Uint16* text,\n                       SDL_Color fg,\n                       SDL_Color bg )\n{\n    SDL_Surface *surface = NULL;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    utf8 = SDL_stack_alloc(Uint8, UCS2_len(text)*3+1);\n    if ( utf8 ) {\n        UCS2_to_UTF8(text, utf8);\n        surface = TTF_RenderUTF8_Shaded(font, (char *)utf8, fg, bg);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return surface;\n}\n\nSDL_Surface* TTF_RenderGlyph_Shaded( TTF_Font* font,\n                     Uint16 ch,\n                     SDL_Color fg,\n                     SDL_Color bg )\n{\n    Uint16 ucs2[2] = { ch, 0 };\n    Uint8 utf8[4];\n\n    UCS2_to_UTF8(ucs2, utf8);\n    return TTF_RenderUTF8_Shaded(font, (char *)utf8, fg, bg);\n}\n\nSDL_Surface *TTF_RenderText_Blended(TTF_Font *font,\n                const char *text, SDL_Color fg)\n{\n    SDL_Surface *surface = NULL;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    utf8 = SDL_stack_alloc(Uint8, SDL_strlen(text)*2+1);\n    if ( utf8 ) {\n        LATIN1_to_UTF8(text, utf8);\n        surface = TTF_RenderUTF8_Blended(font, (char *)utf8, fg);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return surface;\n}\n\nSDL_Surface *TTF_RenderUTF8_Blended(TTF_Font *font,\n                const char *text, SDL_Color fg)\n{\n    SDL_bool first;\n    int xstart;\n    int width, height;\n    SDL_Surface *textbuf;\n    Uint32 alpha;\n    Uint32 pixel;\n    Uint8 *src;\n    Uint32 *dst;\n    Uint32 *dst_check;\n    int row, col;\n    c_glyph *glyph;\n    FT_Error error;\n    FT_Long use_kerning;\n    FT_UInt prev_index = 0;\n    size_t textlen;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    /* Get the dimensions of the text surface */\n    if ( ( TTF_SizeUTF8(font, text, &width, &height) < 0 ) || !width ) {\n        TTF_SetError(\"Text has zero width\");\n        return(NULL);\n    }\n\n    /* Create the target surface */\n    textbuf = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32,\n                               0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);\n    if ( textbuf == NULL ) {\n        return(NULL);\n    }\n\n    /* Adding bound checking to avoid all kinds of memory corruption errors\n       that may occur. */\n    dst_check = (Uint32*)textbuf->pixels + textbuf->pitch/4 * textbuf->h;\n\n    /* check kerning */\n    use_kerning = FT_HAS_KERNING( font->face ) && font->kerning;\n\n    /* Load and render each character */\n    textlen = SDL_strlen(text);\n    first = SDL_TRUE;\n    xstart = 0;\n    pixel = (fg.r<<16)|(fg.g<<8)|fg.b;\n    SDL_FillRect(textbuf, NULL, pixel); /* Initialize with fg and 0 alpha */\n    while ( textlen > 0 ) {\n        Uint16 c = UTF8_getch(&text, &textlen);\n        if ( c == UNICODE_BOM_NATIVE || c == UNICODE_BOM_SWAPPED ) {\n            continue;\n        }\n\n        error = Find_Glyph(font, c, CACHED_METRICS|CACHED_PIXMAP);\n        if ( error ) {\n            TTF_SetFTError(\"Couldn't find glyph\", error);\n            SDL_FreeSurface( textbuf );\n            return NULL;\n        }\n        glyph = font->current;\n        /* Ensure the width of the pixmap is correct. On some cases,\n         * freetype may report a larger pixmap than possible.*/\n        width = glyph->pixmap.width;\n        if (font->outline <= 0 && width > glyph->maxx - glyph->minx) {\n            width = glyph->maxx - glyph->minx;\n        }\n        /* do kerning, if possible AC-Patch */\n        if ( use_kerning && prev_index && glyph->index ) {\n            FT_Vector delta;\n            FT_Get_Kerning( font->face, prev_index, glyph->index, ft_kerning_default, &delta );\n            xstart += delta.x >> 6;\n        }\n\n        /* Compensate for the wrap around bug with negative minx's */\n        if ( first && (glyph->minx < 0) ) {\n            xstart -= glyph->minx;\n        }\n        first = SDL_FALSE;\n\n        for ( row = 0; row < glyph->pixmap.rows; ++row ) {\n            /* Make sure we don't go either over, or under the\n             * limit */\n            if ( row+glyph->yoffset < 0 ) {\n                continue;\n            }\n            if ( row+glyph->yoffset >= textbuf->h ) {\n                continue;\n            }\n            dst = (Uint32*) textbuf->pixels +\n                (row+glyph->yoffset) * textbuf->pitch/4 +\n                xstart + glyph->minx;\n\n            /* Added code to adjust src pointer for pixmaps to\n             * account for pitch.\n             * */\n            src = (Uint8*) (glyph->pixmap.buffer + glyph->pixmap.pitch * row);\n            for ( col = width; col>0 && dst < dst_check; --col) {\n                alpha = *src++;\n                *dst++ |= pixel | (alpha << 24);\n            }\n        }\n\n        xstart += glyph->advance;\n        if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n            xstart += font->glyph_overhang;\n        }\n        prev_index = glyph->index;\n    }\n\n    /* Handle the underline style */\n    if ( TTF_HANDLE_STYLE_UNDERLINE(font) ) {\n        row = TTF_underline_top_row(font);\n        TTF_drawLine_Blended(font, textbuf, row, pixel);\n    }\n\n    /* Handle the strikethrough style */\n    if ( TTF_HANDLE_STYLE_STRIKETHROUGH(font) ) {\n        row = TTF_strikethrough_top_row(font);\n        TTF_drawLine_Blended(font, textbuf, row, pixel);\n    }\n    return(textbuf);\n}\n\nSDL_Surface *TTF_RenderUNICODE_Blended(TTF_Font *font,\n                const Uint16 *text, SDL_Color fg)\n{\n    SDL_Surface *surface = NULL;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    utf8 = SDL_stack_alloc(Uint8, UCS2_len(text)*3+1);\n    if ( utf8 ) {\n        UCS2_to_UTF8(text, utf8);\n        surface = TTF_RenderUTF8_Blended(font, (char *)utf8, fg);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return surface;\n}\n\n\nSDL_Surface *TTF_RenderText_Blended_Wrapped(TTF_Font *font, const char *text, SDL_Color fg, Uint32 wrapLength)\n{\n    SDL_Surface *surface = NULL;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    utf8 = SDL_stack_alloc(Uint8, SDL_strlen(text)*2+1);\n    if ( utf8 ) {\n        LATIN1_to_UTF8(text, utf8);\n        surface = TTF_RenderUTF8_Blended_Wrapped(font, (char *)utf8, fg, wrapLength);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return surface;\n}\n\nstatic SDL_bool CharacterIsDelimiter(char c, const char *delimiters)\n{\n    while (*delimiters) {\n        if (c == *delimiters) {\n            return SDL_TRUE;\n        }\n        ++delimiters;\n    }\n    return SDL_FALSE;\n}\n\nSDL_Surface *TTF_RenderUTF8_Blended_Wrapped(TTF_Font *font,\n                                    const char *text, SDL_Color fg, Uint32 wrapLength)\n{\n    SDL_bool first;\n    int xstart;\n    int width, height;\n    SDL_Surface *textbuf;\n    Uint32 alpha;\n    Uint32 pixel;\n    Uint8 *src;\n    Uint32 *dst;\n    Uint32 *dst_check;\n    int row, col;\n    c_glyph *glyph;\n    FT_Error error;\n    FT_Long use_kerning;\n    FT_UInt prev_index = 0;\n    const int lineSpace = 2;\n    int line, numLines, rowSize;\n    char *str, **strLines;\n    size_t textlen;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    /* Get the dimensions of the text surface */\n    if ( (TTF_SizeUTF8(font, text, &width, &height) < 0) || !width ) {\n        TTF_SetError(\"Text has zero width\");\n        return(NULL);\n    }\n\n    numLines = 1;\n    str = NULL;\n    strLines = NULL;\n    if ( wrapLength > 0 && *text ) {\n        const char *wrapDelims = \" \\t\\r\\n\";\n        int w, h;\n        int line = 0;\n        char *spot, *tok, *next_tok, *end;\n        char delim;\n        size_t str_len = SDL_strlen(text);\n\n        numLines = 0;\n\n        str = SDL_stack_alloc(char, str_len+1);\n        if ( str == NULL ) {\n            TTF_SetError(\"Out of memory\");\n            return(NULL);\n        }\n\n        SDL_strlcpy(str, text, str_len+1);\n        tok = str;\n        end = str + str_len;\n        do {\n            strLines = (char **)SDL_realloc(strLines, (numLines+1)*sizeof(*strLines));\n            if (!strLines) {\n                TTF_SetError(\"Out of memory\");\n                return(NULL);\n            }\n            strLines[numLines++] = tok;\n\n            /* Look for the end of the line */\n            if ((spot = SDL_strchr(tok, '\\r')) != NULL ||\n                (spot = SDL_strchr(tok, '\\n')) != NULL) {\n                if (*spot == '\\r') {\n                    ++spot;\n                }\n                if (*spot == '\\n') {\n                    ++spot;\n                }\n            } else {\n                spot = end;\n            }\n            next_tok = spot;\n\n            /* Get the longest string that will fit in the desired space */\n            for ( ; ; ) {\n                /* Strip trailing whitespace */\n                while ( spot > tok &&\n                        CharacterIsDelimiter(spot[-1], wrapDelims) ) {\n                    --spot;\n                }\n                if ( spot == tok ) {\n                    if (CharacterIsDelimiter(*spot, wrapDelims)) {\n                        *spot = '\\0';\n                    }\n                    break;\n                }\n                delim = *spot;\n                *spot = '\\0';\n\n                TTF_SizeUTF8(font, tok, &w, &h);\n                if ((Uint32)w <= wrapLength) {\n                    break;\n                } else {\n                    /* Back up and try again... */\n                    *spot = delim;\n                }\n\n                while ( spot > tok &&\n                        !CharacterIsDelimiter(spot[-1], wrapDelims) ) {\n                    --spot;\n                }\n                if ( spot > tok ) {\n                    next_tok = spot;\n                }\n            }\n            tok = next_tok;\n        } while (tok < end);\n    }\n\n    /* Create the target surface */\n    textbuf = SDL_CreateRGBSurface(SDL_SWSURFACE,\n            (numLines > 1) ? wrapLength : width,\n            height * numLines + (lineSpace * (numLines - 1)),\n            32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);\n    if ( textbuf == NULL ) {\n        if ( strLines ) {\n            SDL_free(strLines);\n            SDL_stack_free(str);\n        }\n        return(NULL);\n    }\n\n    rowSize = textbuf->pitch/4 * height;\n\n    /* Adding bound checking to avoid all kinds of memory corruption errors\n     that may occur. */\n    dst_check = (Uint32*)textbuf->pixels + textbuf->pitch/4 * textbuf->h;\n\n    /* check kerning */\n    use_kerning = FT_HAS_KERNING( font->face ) && font->kerning;\n\n    /* Load and render each character */\n    pixel = (fg.r<<16)|(fg.g<<8)|fg.b;\n    SDL_FillRect(textbuf, NULL, pixel); /* Initialize with fg and 0 alpha */\n\n    for ( line = 0; line < numLines; line++ ) {\n        if ( strLines ) {\n            text = strLines[line];\n        }\n        textlen = SDL_strlen(text);\n        first = SDL_TRUE;\n        xstart = 0;\n        while ( textlen > 0 ) {\n            Uint16 c = UTF8_getch(&text, &textlen);\n            if ( c == UNICODE_BOM_NATIVE || c == UNICODE_BOM_SWAPPED ) {\n                continue;\n            }\n\n            error = Find_Glyph(font, c, CACHED_METRICS|CACHED_PIXMAP);\n            if ( error ) {\n                TTF_SetFTError(\"Couldn't find glyph\", error);\n                SDL_FreeSurface( textbuf );\n                return NULL;\n            }\n            glyph = font->current;\n            /* Ensure the width of the pixmap is correct. On some cases,\n             * freetype may report a larger pixmap than possible.*/\n            width = glyph->pixmap.width;\n            if ( font->outline <= 0 && width > glyph->maxx - glyph->minx ) {\n                width = glyph->maxx - glyph->minx;\n            }\n            /* do kerning, if possible AC-Patch */\n            if ( use_kerning && prev_index && glyph->index ) {\n                FT_Vector delta;\n                FT_Get_Kerning( font->face, prev_index, glyph->index, ft_kerning_default, &delta );\n                xstart += delta.x >> 6;\n            }\n\n            /* Compensate for the wrap around bug with negative minx's */\n            if ( first && (glyph->minx < 0) ) {\n                xstart -= glyph->minx;\n            }\n            first = SDL_FALSE;\n\n            for ( row = 0; row < glyph->pixmap.rows; ++row ) {\n                /* Make sure we don't go either over, or under the\n                 * limit */\n                if ( row+glyph->yoffset < 0 ) {\n                    continue;\n                }\n                if ( row+glyph->yoffset >= textbuf->h ) {\n                    continue;\n                }\n                dst =  ((Uint32*)textbuf->pixels + rowSize * line) +\n                (row+glyph->yoffset) * textbuf->pitch/4 +\n                xstart + glyph->minx;\n\n                /* Added code to adjust src pointer for pixmaps to\n                 * account for pitch.\n                 * */\n                src = (Uint8*) (glyph->pixmap.buffer + glyph->pixmap.pitch * row);\n                for ( col = width; col>0 && dst < dst_check; --col) {\n                    alpha = *src++;\n                    *dst++ |= pixel | (alpha << 24);\n                }\n            }\n\n            xstart += glyph->advance;\n            if ( TTF_HANDLE_STYLE_BOLD(font) ) {\n                xstart += font->glyph_overhang;\n            }\n            prev_index = glyph->index;\n        }\n\n        /* Handle the underline style *\n        if ( TTF_HANDLE_STYLE_UNDERLINE(font) ) {\n            row = TTF_underline_top_row(font);\n            TTF_drawLine_Blended(font, textbuf, row, pixel);\n        }\n        */\n\n        /* Handle the strikethrough style *\n        if ( TTF_HANDLE_STYLE_STRIKETHROUGH(font) ) {\n            row = TTF_strikethrough_top_row(font);\n            TTF_drawLine_Blended(font, textbuf, row, pixel);\n        }\n        */\n    }\n\n    if ( strLines ) {\n        SDL_free(strLines);\n        SDL_stack_free(str);\n    }\n    return(textbuf);\n}\n\nSDL_Surface *TTF_RenderUNICODE_Blended_Wrapped(TTF_Font *font, const Uint16* text,\n                                               SDL_Color fg, Uint32 wrapLength)\n{\n    SDL_Surface *surface = NULL;\n    Uint8 *utf8;\n\n    TTF_CHECKPOINTER(text, NULL);\n\n    utf8 = SDL_stack_alloc(Uint8, UCS2_len(text)*3+1);\n    if ( utf8 ) {\n        UCS2_to_UTF8(text, utf8);\n        surface = TTF_RenderUTF8_Blended_Wrapped(font, (char *)utf8, fg, wrapLength);\n        SDL_stack_free(utf8);\n    } else {\n        SDL_OutOfMemory();\n    }\n    return surface;\n}\n\nSDL_Surface *TTF_RenderGlyph_Blended(TTF_Font *font, Uint16 ch, SDL_Color fg)\n{\n    Uint16 ucs2[2] = { ch, 0 };\n    Uint8 utf8[4];\n\n    UCS2_to_UTF8(ucs2, utf8);\n    return TTF_RenderUTF8_Blended(font, (char *)utf8, fg);\n}\n\nvoid TTF_SetFontStyle( TTF_Font* font, int style )\n{\n    int prev_style = font->style;\n    font->style = style | font->face_style;\n\n    /* Flush the cache if the style has changed.\n     * Ignore UNDERLINE which does not impact glyph drawning.\n     * */\n    if ( (font->style | TTF_STYLE_NO_GLYPH_CHANGE ) != ( prev_style | TTF_STYLE_NO_GLYPH_CHANGE )) {\n        Flush_Cache( font );\n    }\n}\n\nint TTF_GetFontStyle( const TTF_Font* font )\n{\n    return font->style;\n}\n\nvoid TTF_SetFontOutline( TTF_Font* font, int outline )\n{\n    font->outline = outline;\n    Flush_Cache( font );\n}\n\nint TTF_GetFontOutline( const TTF_Font* font )\n{\n    return font->outline;\n}\n\nvoid TTF_SetFontHinting( TTF_Font* font, int hinting )\n{\n    if (hinting == TTF_HINTING_LIGHT)\n        font->hinting = FT_LOAD_TARGET_LIGHT;\n    else if (hinting == TTF_HINTING_MONO)\n        font->hinting = FT_LOAD_TARGET_MONO;\n    else if (hinting == TTF_HINTING_NONE)\n        font->hinting = FT_LOAD_NO_HINTING;\n    else\n        font->hinting = 0;\n\n    Flush_Cache( font );\n}\n\nint TTF_GetFontHinting( const TTF_Font* font )\n{\n    if (font->hinting == FT_LOAD_TARGET_LIGHT)\n        return TTF_HINTING_LIGHT;\n    else if (font->hinting == FT_LOAD_TARGET_MONO)\n        return TTF_HINTING_MONO;\n    else if (font->hinting == FT_LOAD_NO_HINTING)\n        return TTF_HINTING_NONE;\n    return 0;\n}\n\nvoid TTF_Quit( void )\n{\n    if ( TTF_initialized ) {\n        if ( --TTF_initialized == 0 ) {\n            FT_Done_FreeType( library );\n        }\n    }\n}\n\nint TTF_WasInit( void )\n{\n    return TTF_initialized;\n}\n\n/* don't use this function. It's just here for binary compatibility. */\nint TTF_GetFontKerningSize(TTF_Font* font, int prev_index, int index)\n{\n    FT_Vector delta;\n    FT_Get_Kerning( font->face, prev_index, index, ft_kerning_default, &delta );\n    return (delta.x >> 6);\n}\n\nint TTF_GetFontKerningSizeGlyphs(TTF_Font *font, Uint16 previous_ch, Uint16 ch)\n{\n    int error;\n    int glyph_index, prev_index;\n    FT_Vector delta;\n\n    if (ch == UNICODE_BOM_NATIVE || ch == UNICODE_BOM_SWAPPED) {\n        return 0;\n    }\n\n    if (previous_ch == UNICODE_BOM_NATIVE || previous_ch == UNICODE_BOM_SWAPPED) {\n        return 0;\n    }\n\n    error = Find_Glyph(font, ch, CACHED_METRICS);\n    if (error) {\n        TTF_SetFTError(\"Couldn't find glyph\", error);\n        return -1;\n    }\n    glyph_index = font->current->index;\n\n    error = Find_Glyph(font, previous_ch, CACHED_METRICS);\n    if (error) {\n        TTF_SetFTError(\"Couldn't find glyph\", error);\n        return -1;\n    }\n    prev_index = font->current->index;\n\n    error = FT_Get_Kerning(font->face, prev_index, glyph_index, ft_kerning_default, &delta);\n    if (error) {\n        TTF_SetFTError(\"Couldn't get glyph kerning\", error);\n        return -1;\n    }\n    return (delta.x >> 6);\n}\n\n"
  },
  {
    "path": "libs/SDL2_ttf/src/glfont.c",
    "content": "/*\n  glfont:  An example of using the SDL_ttf library with OpenGL.\n  Copyright (C) 2001-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* A simple program to test the text rendering feature of the TTF library */\n\n/* quiet windows compiler warnings */\n#define _CRT_SECURE_NO_WARNINGS\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"SDL.h\"\n#include \"SDL_ttf.h\"\n\n#ifdef HAVE_OPENGL\n\n#include \"SDL_opengl.h\"\n\n#define DEFAULT_PTSIZE  18\n#define DEFAULT_TEXT    \"The quick brown fox jumped over the lazy dog\"\n#define WIDTH   640\n#define HEIGHT  480\n\nstatic char *Usage =\n\"Usage: %s [-utf8|-unicode] [-b] [-i] [-u] [-fgcol r,g,b] [-bgcol r,g,b] \\\n<font>.ttf [ptsize] [text]\\n\";\n\nvoid SDL_GL_Enter2DMode(int width, int height)\n{\n    /* Note, there may be other things you need to change,\n       depending on how you have your OpenGL state set up.\n    */\n    glPushAttrib(GL_ENABLE_BIT);\n    glDisable(GL_DEPTH_TEST);\n    glDisable(GL_CULL_FACE);\n    glEnable(GL_TEXTURE_2D);\n\n    /* This allows alpha blending of 2D textures with the scene */\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\n    glViewport(0, 0, width, height);\n\n    glMatrixMode(GL_PROJECTION);\n    glPushMatrix();\n    glLoadIdentity();\n\n    glOrtho(0.0, (GLdouble)width, (GLdouble)height, 0.0, 0.0, 1.0);\n\n    glMatrixMode(GL_MODELVIEW);\n    glPushMatrix();\n    glLoadIdentity();\n\n    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);\n}\n\nvoid SDL_GL_Leave2DMode()\n{\n    glMatrixMode(GL_MODELVIEW);\n    glPopMatrix();\n\n    glMatrixMode(GL_PROJECTION);\n    glPopMatrix();\n\n    glPopAttrib();\n}\n\n/* Quick utility function for texture creation */\nstatic int power_of_two(int input)\n{\n    int value = 1;\n\n    while ( value < input ) {\n        value <<= 1;\n    }\n    return value;\n}\n\nGLuint SDL_GL_LoadTexture(SDL_Surface *surface, GLfloat *texcoord)\n{\n    GLuint texture;\n    int w, h;\n    SDL_Surface *image;\n    SDL_Rect area;\n    Uint8  saved_alpha;\n    SDL_BlendMode saved_mode;\n\n    /* Use the surface width and height expanded to powers of 2 */\n    w = power_of_two(surface->w);\n    h = power_of_two(surface->h);\n    texcoord[0] = 0.0f;         /* Min X */\n    texcoord[1] = 0.0f;         /* Min Y */\n    texcoord[2] = (GLfloat)surface->w / w;  /* Max X */\n    texcoord[3] = (GLfloat)surface->h / h;  /* Max Y */\n\n    image = SDL_CreateRGBSurface(\n            SDL_SWSURFACE,\n            w, h,\n            32,\n#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */\n            0x000000FF,\n            0x0000FF00,\n            0x00FF0000,\n            0xFF000000\n#else\n            0xFF000000,\n            0x00FF0000,\n            0x0000FF00,\n            0x000000FF\n#endif\n               );\n    if ( image == NULL ) {\n        return 0;\n    }\n\n    /* Save the alpha blending attributes */\n    SDL_GetSurfaceAlphaMod(surface, &saved_alpha);\n    SDL_SetSurfaceAlphaMod(surface, 0xFF);\n    SDL_GetSurfaceBlendMode(surface, &saved_mode);\n    SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE);\n\n    /* Copy the surface into the GL texture image */\n    area.x = 0;\n    area.y = 0;\n    area.w = surface->w;\n    area.h = surface->h;\n    SDL_BlitSurface(surface, &area, image, &area);\n\n    /* Restore the alpha blending attributes */\n    SDL_SetSurfaceAlphaMod(surface, saved_alpha);\n    SDL_SetSurfaceBlendMode(surface, saved_mode);\n\n    /* Create an OpenGL texture for the image */\n    glGenTextures(1, &texture);\n    glBindTexture(GL_TEXTURE_2D, texture);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n    glTexImage2D(GL_TEXTURE_2D,\n             0,\n             GL_RGBA,\n             w, h,\n             0,\n             GL_RGBA,\n             GL_UNSIGNED_BYTE,\n             image->pixels);\n    SDL_FreeSurface(image); /* No longer needed */\n\n    return texture;\n}\n\nstatic void cleanup(int exitcode)\n{\n    TTF_Quit();\n    SDL_Quit();\n    exit(exitcode);\n}\n\nint main(int argc, char *argv[])\n{\n    char *argv0 = argv[0];\n    SDL_Window *window;\n    SDL_GLContext context;\n    TTF_Font *font;\n    SDL_Surface *text;\n    int ptsize;\n    int i, done;\n    SDL_Color white = { 0xFF, 0xFF, 0xFF, 0 };\n    SDL_Color black = { 0x00, 0x00, 0x00, 0 };\n    SDL_Color *forecol;\n    SDL_Color *backcol;\n    GLenum gl_error;\n    GLuint texture;\n    int x, y, w, h;\n    GLfloat texcoord[4];\n    GLfloat texMinX, texMinY;\n    GLfloat texMaxX, texMaxY;\n        float color[8][3]= {{ 1.0,  1.0,  0.0},\n                { 1.0,  0.0,  0.0},\n                { 0.0,  0.0,  0.0},\n                { 0.0,  1.0,  0.0},\n                { 0.0,  1.0,  1.0},\n                { 1.0,  1.0,  1.0},\n                { 1.0,  0.0,  1.0},\n                { 0.0,  0.0,  1.0}};\n    float cube[8][3]= {{ 0.5,  0.5, -0.5},\n               { 0.5, -0.5, -0.5},\n               {-0.5, -0.5, -0.5},\n               {-0.5,  0.5, -0.5},\n               {-0.5,  0.5,  0.5},\n               { 0.5,  0.5,  0.5},\n               { 0.5, -0.5,  0.5},\n               {-0.5, -0.5,  0.5}};\n    SDL_Event event;\n    int renderstyle;\n    int dump;\n    enum {\n        RENDER_LATIN1,\n        RENDER_UTF8,\n        RENDER_UNICODE\n    } rendertype;\n    char *message;\n\n    /* Look for special execution mode */\n    dump = 0;\n    /* Look for special rendering types */\n    renderstyle = TTF_STYLE_NORMAL;\n    rendertype = RENDER_LATIN1;\n    /* Default is black and white */\n    forecol = &black;\n    backcol = &white;\n    for ( i=1; argv[i] && argv[i][0] == '-'; ++i ) {\n        if ( strcmp(argv[i], \"-utf8\") == 0 ) {\n            rendertype = RENDER_UTF8;\n        } else\n        if ( strcmp(argv[i], \"-unicode\") == 0 ) {\n            rendertype = RENDER_UNICODE;\n        } else\n        if ( strcmp(argv[i], \"-b\") == 0 ) {\n            renderstyle |= TTF_STYLE_BOLD;\n        } else\n        if ( strcmp(argv[i], \"-i\") == 0 ) {\n            renderstyle |= TTF_STYLE_ITALIC;\n        } else\n        if ( strcmp(argv[i], \"-u\") == 0 ) {\n            renderstyle |= TTF_STYLE_UNDERLINE;\n        } else\n        if ( strcmp(argv[i], \"-dump\") == 0 ) {\n            dump = 1;\n        } else\n        if ( strcmp(argv[i], \"-fgcol\") == 0 ) {\n            int r, g, b;\n            if ( sscanf (argv[++i], \"%d,%d,%d\", &r, &g, &b) != 3 ) {\n                fprintf(stderr, Usage, argv0);\n                return(1);\n            }\n            forecol->r = (Uint8)r;\n            forecol->g = (Uint8)g;\n            forecol->b = (Uint8)b;\n        } else\n        if ( strcmp(argv[i], \"-bgcol\") == 0 ) {\n            int r, g, b;\n            if ( sscanf (argv[++i], \"%d,%d,%d\", &r, &g, &b) != 3 ) {\n                fprintf(stderr, Usage, argv0);\n                return(1);\n            }\n            backcol->r = (Uint8)r;\n            backcol->g = (Uint8)g;\n            backcol->b = (Uint8)b;\n        } else {\n            fprintf(stderr, Usage, argv0);\n            return(1);\n        }\n    }\n    argv += i;\n    argc -= i;\n\n    /* Check usage */\n    if ( ! argv[0] ) {\n        fprintf(stderr, Usage, argv0);\n        return(1);\n    }\n\n    /* Initialize the TTF library */\n    if ( TTF_Init() < 0 ) {\n        fprintf(stderr, \"Couldn't initialize TTF: %s\\n\",SDL_GetError());\n        SDL_Quit();\n        return(2);\n    }\n\n    /* Open the font file with the requested point size */\n    ptsize = 0;\n    if ( argc > 1 ) {\n        ptsize = atoi(argv[1]);\n    }\n    if ( ptsize == 0 ) {\n        i = 2;\n        ptsize = DEFAULT_PTSIZE;\n    } else {\n        i = 3;\n    }\n    font = TTF_OpenFont(argv[0], ptsize);\n    if ( font == NULL ) {\n        fprintf(stderr, \"Couldn't load %d pt font from %s: %s\\n\",\n                    ptsize, argv[0], SDL_GetError());\n        cleanup(2);\n    }\n    TTF_SetFontStyle(font, renderstyle);\n\n    if( dump ) {\n        for( i = 48; i < 123; i++ ) {\n            SDL_Surface* glyph = NULL;\n\n            glyph = TTF_RenderGlyph_Shaded( font, i, *forecol, *backcol );\n\n            if( glyph ) {\n                char outname[64];\n                sprintf( outname, \"glyph-%d.bmp\", i );\n                SDL_SaveBMP( glyph, outname );\n            }\n\n        }\n        cleanup(0);\n    }\n\n    /* Set a 640x480 video mode */\n    window = SDL_CreateWindow(\"glfont\",\n                                SDL_WINDOWPOS_UNDEFINED,\n                                SDL_WINDOWPOS_UNDEFINED,\n                                WIDTH, HEIGHT, SDL_WINDOW_OPENGL);\n    if ( window == NULL ) {\n        fprintf(stderr, \"Couldn't create window: %s\\n\", SDL_GetError());\n        cleanup(2);\n    }\n\n    context = SDL_GL_CreateContext(window);\n    if ( context == NULL ) {\n        fprintf(stderr, \"Couldn't create OpenGL context: %s\\n\", SDL_GetError());\n        cleanup(2);\n    }\n\n    /* Render and center the message */\n    if ( argc > 2 ) {\n        message = argv[2];\n    } else {\n        message = DEFAULT_TEXT;\n    }\n    switch (rendertype) {\n        case RENDER_LATIN1:\n        text = TTF_RenderText_Blended(font, message, *forecol);\n        break;\n\n        case RENDER_UTF8:\n        text = TTF_RenderUTF8_Blended(font, message, *forecol);\n        break;\n\n        case RENDER_UNICODE:\n        {\n            /* This doesn't actually work because you can't pass\n               UNICODE text in via command line, AFAIK, but...\n             */\n            Uint16 unicode_text[BUFSIZ];\n            int index;\n            for ( index = 0; (message[0] || message[1]); ++index ) {\n                unicode_text[index]  = ((Uint8 *)message)[0];\n                unicode_text[index] <<= 8;\n                unicode_text[index] |= ((Uint8 *)message)[1];\n                message += 2;\n            }\n            text = TTF_RenderUNICODE_Blended(font,\n                    unicode_text, *forecol);\n        }\n        break;\n        default:\n        text = NULL; /* This shouldn't happen */\n        break;\n    }\n    if ( text == NULL ) {\n        fprintf(stderr, \"Couldn't render text: %s\\n\", SDL_GetError());\n        TTF_CloseFont(font);\n        cleanup(2);\n    }\n    x = (WIDTH - text->w)/2;\n    y = (HEIGHT - text->h)/2;\n    w = text->w;\n    h = text->h;\n    printf(\"Font is generally %d big, and string is %d big\\n\",\n                        TTF_FontHeight(font), text->h);\n\n    /* Convert the text into an OpenGL texture */\n    glGetError();\n    texture = SDL_GL_LoadTexture(text, texcoord);\n    if ( (gl_error = glGetError()) != GL_NO_ERROR ) {\n        /* If this failed, the text may exceed texture size limits */\n        printf(\"Warning: Couldn't create texture: 0x%x\\n\", gl_error);\n    }\n\n    /* Make texture coordinates easy to understand */\n    texMinX = texcoord[0];\n    texMinY = texcoord[1];\n    texMaxX = texcoord[2];\n    texMaxY = texcoord[3];\n\n    /* We don't need the original text surface anymore */\n    SDL_FreeSurface(text);\n\n    /* Initialize the GL state */\n    glViewport( 0, 0, WIDTH, HEIGHT );\n    glMatrixMode( GL_PROJECTION );\n    glLoadIdentity( );\n\n    glOrtho( -2.0, 2.0, -2.0, 2.0, -20.0, 20.0 );\n\n    glMatrixMode( GL_MODELVIEW );\n    glLoadIdentity( );\n\n    glEnable(GL_DEPTH_TEST);\n\n    glDepthFunc(GL_LESS);\n\n    glShadeModel(GL_SMOOTH);\n\n    /* Wait for a keystroke, and blit text on mouse press */\n    done = 0;\n    while ( ! done ) {\n        while ( SDL_PollEvent(&event) ) {\n            switch (event.type) {\n                case SDL_MOUSEMOTION:\n                x = event.motion.x - w/2;\n                y = event.motion.y - h/2;\n                break;\n\n                case SDL_KEYDOWN:\n                case SDL_QUIT:\n                done = 1;\n                break;\n                default:\n                break;\n            }\n        }\n\n        /* Clear the screen */\n        glClearColor(1.0, 1.0, 1.0, 1.0);\n        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n        /* Draw the spinning cube */\n        glBegin( GL_QUADS );\n\n            glColor3fv(color[0]);\n            glVertex3fv(cube[0]);\n            glColor3fv(color[1]);\n            glVertex3fv(cube[1]);\n            glColor3fv(color[2]);\n            glVertex3fv(cube[2]);\n            glColor3fv(color[3]);\n            glVertex3fv(cube[3]);\n\n            glColor3fv(color[3]);\n            glVertex3fv(cube[3]);\n            glColor3fv(color[4]);\n            glVertex3fv(cube[4]);\n            glColor3fv(color[7]);\n            glVertex3fv(cube[7]);\n            glColor3fv(color[2]);\n            glVertex3fv(cube[2]);\n\n            glColor3fv(color[0]);\n            glVertex3fv(cube[0]);\n            glColor3fv(color[5]);\n            glVertex3fv(cube[5]);\n            glColor3fv(color[6]);\n            glVertex3fv(cube[6]);\n            glColor3fv(color[1]);\n            glVertex3fv(cube[1]);\n\n            glColor3fv(color[5]);\n            glVertex3fv(cube[5]);\n            glColor3fv(color[4]);\n            glVertex3fv(cube[4]);\n            glColor3fv(color[7]);\n            glVertex3fv(cube[7]);\n            glColor3fv(color[6]);\n            glVertex3fv(cube[6]);\n\n            glColor3fv(color[5]);\n            glVertex3fv(cube[5]);\n            glColor3fv(color[0]);\n            glVertex3fv(cube[0]);\n            glColor3fv(color[3]);\n            glVertex3fv(cube[3]);\n            glColor3fv(color[4]);\n            glVertex3fv(cube[4]);\n\n            glColor3fv(color[6]);\n            glVertex3fv(cube[6]);\n            glColor3fv(color[1]);\n            glVertex3fv(cube[1]);\n            glColor3fv(color[2]);\n            glVertex3fv(cube[2]);\n            glColor3fv(color[7]);\n            glVertex3fv(cube[7]);\n        glEnd( );\n\n        /* Rotate the cube */\n        glMatrixMode(GL_MODELVIEW);\n        glRotatef(5.0, 1.0, 1.0, 1.0);\n\n        /* Show the text on the screen */\n        SDL_GL_Enter2DMode(WIDTH, HEIGHT);\n        glBindTexture(GL_TEXTURE_2D, texture);\n        glBegin(GL_TRIANGLE_STRIP);\n        glTexCoord2f(texMinX, texMinY); glVertex2i(x,   y  );\n        glTexCoord2f(texMaxX, texMinY); glVertex2i(x+w, y  );\n        glTexCoord2f(texMinX, texMaxY); glVertex2i(x,   y+h);\n        glTexCoord2f(texMaxX, texMaxY); glVertex2i(x+w, y+h);\n        glEnd();\n        SDL_GL_Leave2DMode();\n\n        /* Swap the buffers so everything is visible */\n        SDL_GL_SwapWindow(window);\n    }\n    SDL_GL_DeleteContext(context);\n    TTF_CloseFont(font);\n    cleanup(0);\n\n    /* Not reached, but fixes compiler warnings */\n    return 0;\n}\n\n#else /* HAVE_OPENGL */\n\nint main(int argc, char *argv[])\n{\n    printf(\"No OpenGL support on this system\\n\");\n    return 1;\n}\n\n#endif /* HAVE_OPENGL */\n"
  },
  {
    "path": "libs/SDL2_ttf/src/showfont.c",
    "content": "/*\n  showfont:  An example of using the SDL_ttf library with 2D graphics.\n  Copyright (C) 2001-2016 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/* A simple program to test the text rendering feature of the TTF library */\n\n/* quiet windows compiler warnings */\n#define _CRT_SECURE_NO_WARNINGS\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"SDL.h\"\n#include \"SDL_ttf.h\"\n\n#define DEFAULT_PTSIZE  18\n#define DEFAULT_TEXT    \"The quick brown fox jumped over the lazy dog\"\n#define NUM_COLORS      256\n#define WIDTH   640\n#define HEIGHT  480\n\nstatic char *Usage =\n\"Usage: %s [-solid] [-utf8|-unicode] [-b] [-i] [-u] [-s] [-outline size] [-hintlight|-hintmono|-hintnone] [-nokerning] [-fgcol r,g,b] [-bgcol r,g,b] <font>.ttf [ptsize] [text]\\n\";\n\ntypedef struct {\n    SDL_Texture *caption;\n    SDL_Rect captionRect;\n    SDL_Texture *message;\n    SDL_Rect messageRect;\n} Scene;\n\nstatic void draw_scene(SDL_Renderer *renderer, Scene *scene)\n{\n    /* Clear the background to background color */\n    SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);\n    SDL_RenderClear(renderer);\n\n    SDL_RenderCopy(renderer, scene->caption, NULL, &scene->captionRect);\n    SDL_RenderCopy(renderer, scene->message, NULL, &scene->messageRect);\n    SDL_RenderPresent(renderer);\n}\n\nstatic void cleanup(int exitcode)\n{\n    TTF_Quit();\n    SDL_Quit();\n    exit(exitcode);\n}\n\nint main(int argc, char *argv[])\n{\n    char *argv0 = argv[0];\n    SDL_Window *window;\n    SDL_Renderer *renderer;\n    TTF_Font *font;\n    SDL_Surface *text;\n    Scene scene;\n    int ptsize;\n    int i, done;\n    SDL_Color white = { 0xFF, 0xFF, 0xFF, 0 };\n    SDL_Color black = { 0x00, 0x00, 0x00, 0 };\n    SDL_Color *forecol;\n    SDL_Color *backcol;\n    SDL_Event event;\n    int rendersolid;\n    int renderstyle;\n    int outline;\n    int hinting;\n    int kerning;\n    int dump;\n    enum {\n        RENDER_LATIN1,\n        RENDER_UTF8,\n        RENDER_UNICODE\n    } rendertype;\n    char *message, string[128];\n\n    /* Look for special execution mode */\n    dump = 0;\n    /* Look for special rendering types */\n    rendersolid = 0;\n    renderstyle = TTF_STYLE_NORMAL;\n    rendertype = RENDER_LATIN1;\n    outline = 0;\n    hinting = TTF_HINTING_NORMAL;\n    kerning = 1;\n    /* Default is black and white */\n    forecol = &black;\n    backcol = &white;\n    for ( i=1; argv[i] && argv[i][0] == '-'; ++i ) {\n        if ( strcmp(argv[i], \"-solid\") == 0 ) {\n            rendersolid = 1;\n        } else\n        if ( strcmp(argv[i], \"-utf8\") == 0 ) {\n            rendertype = RENDER_UTF8;\n        } else\n        if ( strcmp(argv[i], \"-unicode\") == 0 ) {\n            rendertype = RENDER_UNICODE;\n        } else\n        if ( strcmp(argv[i], \"-b\") == 0 ) {\n            renderstyle |= TTF_STYLE_BOLD;\n        } else\n        if ( strcmp(argv[i], \"-i\") == 0 ) {\n            renderstyle |= TTF_STYLE_ITALIC;\n        } else\n        if ( strcmp(argv[i], \"-u\") == 0 ) {\n            renderstyle |= TTF_STYLE_UNDERLINE;\n        } else\n        if ( strcmp(argv[i], \"-s\") == 0 ) {\n            renderstyle |= TTF_STYLE_STRIKETHROUGH;\n        } else\n        if ( strcmp(argv[i], \"-outline\") == 0 ) {\n            if ( sscanf (argv[++i], \"%d\", &outline) != 1 ) {\n                fprintf(stderr, Usage, argv0);\n                return(1);\n            }\n        } else\n        if ( strcmp(argv[i], \"-hintlight\") == 0 ) {\n            hinting = TTF_HINTING_LIGHT;\n        } else\n        if ( strcmp(argv[i], \"-hintmono\") == 0 ) {\n            hinting = TTF_HINTING_MONO;\n        } else\n        if ( strcmp(argv[i], \"-hintnone\") == 0 ) {\n            hinting = TTF_HINTING_NONE;\n        } else\n        if ( strcmp(argv[i], \"-nokerning\") == 0 ) {\n            kerning = 0;\n        } else\n        if ( strcmp(argv[i], \"-dump\") == 0 ) {\n            dump = 1;\n        } else\n        if ( strcmp(argv[i], \"-fgcol\") == 0 ) {\n            int r, g, b;\n            if ( sscanf (argv[++i], \"%d,%d,%d\", &r, &g, &b) != 3 ) {\n                fprintf(stderr, Usage, argv0);\n                return(1);\n            }\n            forecol->r = (Uint8)r;\n            forecol->g = (Uint8)g;\n            forecol->b = (Uint8)b;\n        } else\n        if ( strcmp(argv[i], \"-bgcol\") == 0 ) {\n            int r, g, b;\n            if ( sscanf (argv[++i], \"%d,%d,%d\", &r, &g, &b) != 3 ) {\n                fprintf(stderr, Usage, argv0);\n                return(1);\n            }\n            backcol->r = (Uint8)r;\n            backcol->g = (Uint8)g;\n            backcol->b = (Uint8)b;\n        } else {\n            fprintf(stderr, Usage, argv0);\n            return(1);\n        }\n    }\n    argv += i;\n    argc -= i;\n\n    /* Check usage */\n    if ( ! argv[0] ) {\n        fprintf(stderr, Usage, argv0);\n        return(1);\n    }\n\n    /* Initialize the TTF library */\n    if ( TTF_Init() < 0 ) {\n        fprintf(stderr, \"Couldn't initialize TTF: %s\\n\",SDL_GetError());\n        SDL_Quit();\n        return(2);\n    }\n\n    /* Open the font file with the requested point size */\n    ptsize = 0;\n    if ( argc > 1 ) {\n        ptsize = atoi(argv[1]);\n    }\n    if ( ptsize == 0 ) {\n        i = 2;\n        ptsize = DEFAULT_PTSIZE;\n    } else {\n        i = 3;\n    }\n    font = TTF_OpenFont(argv[0], ptsize);\n    if ( font == NULL ) {\n        fprintf(stderr, \"Couldn't load %d pt font from %s: %s\\n\",\n                    ptsize, argv[0], SDL_GetError());\n        cleanup(2);\n    }\n    TTF_SetFontStyle(font, renderstyle);\n    TTF_SetFontOutline(font, outline);\n    TTF_SetFontKerning(font, kerning);\n    TTF_SetFontHinting(font, hinting);\n\n    if( dump ) {\n        for( i = 48; i < 123; i++ ) {\n            SDL_Surface* glyph = NULL;\n\n            glyph = TTF_RenderGlyph_Shaded( font, i, *forecol, *backcol );\n\n            if( glyph ) {\n                char outname[64];\n                sprintf( outname, \"glyph-%d.bmp\", i );\n                SDL_SaveBMP( glyph, outname );\n            }\n\n        }\n        cleanup(0);\n    }\n\n    /* Create a window */\n    if (SDL_CreateWindowAndRenderer(WIDTH, HEIGHT, 0, &window, &renderer) < 0) {\n        fprintf(stderr, \"SDL_CreateWindowAndRenderer() failed: %s\\n\", SDL_GetError());\n        cleanup(2);\n    }\n\n    /* Show which font file we're looking at */\n    sprintf(string, \"Font file: %s\", argv[0]);  /* possible overflow */\n    if ( rendersolid ) {\n        text = TTF_RenderText_Solid(font, string, *forecol);\n    } else {\n        text = TTF_RenderText_Shaded(font, string, *forecol, *backcol);\n    }\n    if ( text != NULL ) {\n        scene.captionRect.x = 4;\n        scene.captionRect.y = 4;\n        scene.captionRect.w = text->w;\n        scene.captionRect.h = text->h;\n        scene.caption = SDL_CreateTextureFromSurface(renderer, text);\n        SDL_FreeSurface(text);\n    }\n\n    /* Render and center the message */\n    if ( argc > 2 ) {\n        message = argv[2];\n    } else {\n        message = DEFAULT_TEXT;\n    }\n    switch (rendertype) {\n        case RENDER_LATIN1:\n        if ( rendersolid ) {\n            text = TTF_RenderText_Solid(font,message,*forecol);\n        } else {\n            text = TTF_RenderText_Shaded(font,message,*forecol,*backcol);\n        }\n        break;\n\n        case RENDER_UTF8:\n        if ( rendersolid ) {\n            text = TTF_RenderUTF8_Solid(font,message,*forecol);\n        } else {\n            text = TTF_RenderUTF8_Shaded(font,message,*forecol,*backcol);\n        }\n        break;\n\n        case RENDER_UNICODE:\n        {\n            Uint16 *unicode_text = SDL_iconv_utf8_ucs2(message);\n            if ( rendersolid ) {\n                text = TTF_RenderUNICODE_Solid(font,\n                    unicode_text, *forecol);\n            } else {\n                text = TTF_RenderUNICODE_Shaded(font,\n                    unicode_text, *forecol, *backcol);\n            }\n            SDL_free(unicode_text);\n        }\n        break;\n        default:\n        text = NULL; /* This shouldn't happen */\n        break;\n    }\n    if ( text == NULL ) {\n        fprintf(stderr, \"Couldn't render text: %s\\n\", SDL_GetError());\n        TTF_CloseFont(font);\n        cleanup(2);\n    }\n    scene.messageRect.x = (WIDTH - text->w)/2;\n    scene.messageRect.y = (HEIGHT - text->h)/2;\n    scene.messageRect.w = text->w;\n    scene.messageRect.h = text->h;\n    scene.message = SDL_CreateTextureFromSurface(renderer, text);\n    printf(\"Font is generally %d big, and string is %d big\\n\",\n                        TTF_FontHeight(font), text->h);\n\n    draw_scene(renderer, &scene);\n\n    /* Wait for a keystroke, and blit text on mouse press */\n    done = 0;\n    while ( ! done ) {\n        if ( SDL_WaitEvent(&event) < 0 ) {\n            fprintf(stderr, \"SDL_PullEvent() error: %s\\n\",\n                                SDL_GetError());\n            done = 1;\n            continue;\n        }\n        switch (event.type) {\n            case SDL_MOUSEBUTTONDOWN:\n                scene.messageRect.x = event.button.x - text->w/2;\n                scene.messageRect.y = event.button.y - text->h/2;\n                scene.messageRect.w = text->w;\n                scene.messageRect.h = text->h;\n                draw_scene(renderer, &scene);\n                break;\n\n            case SDL_KEYDOWN:\n            case SDL_QUIT:\n                done = 1;\n                break;\n            default:\n                break;\n        }\n    }\n    SDL_FreeSurface(text);\n    TTF_CloseFont(font);\n    SDL_DestroyTexture(scene.caption);\n    SDL_DestroyTexture(scene.message);\n    cleanup(0);\n\n    /* Not reached, but fixes compiler warnings */\n    return 0;\n}\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "libs/freetype/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\nproject(freetype)\n\n# Creates and names a library, sets it as either STATIC\n# or SHARED, and provides the relative paths to its source code.\n# You can define multiple libraries, and CMake builds them for you.\n# Gradle automatically packages shared libraries with your APK.\n\nfind_library( # Sets the name of the path variable.\n        GLESv1_CM\n\n        # Specifies the name of the NDK library that\n        # you want CMake to locate.\n        GLESv1_CM )\n\nfind_library(\n        GLESv2\n        GLESv2\n)\n\nfind_library(\n        android\n        android\n)\n\nfind_library(\n        z\n        z\n)\n\nfind_library(\n        log\n        log\n)\n\ninclude_directories(include)\n\nadd_definitions(-DFT_CONFIG_CONFIG_H=<ftconfig.h> -DFT2_BUILD_LIBRARY -DFT_CONFIG_MODULES_H=<ftmodule.h>)\n\nadd_library( # Sets the name of the library.\n        freetype\n\n        # Sets the library as a shared library.\n        SHARED\n\n        src/sfnt/sfobjs.c\n        src/sfnt/sfntpic.c\n        src/sfnt/sfdriver.c\n        src/sfnt/ttmtx.c\n        src/sfnt/ttload.c\n        src/sfnt/ttbdf.c\n        src/sfnt/ttpost.c\n        src/sfnt/ttcmap.c\n        src/sfnt/ttkern.c\n        src/sfnt/ttsbit.c\n        src/base/md5.c\n        src/base/ftglyph.c\n        src/base/ftotval.c\n        src/base/ftinit.c\n        src/base/ftbdf.c\n        src/base/ftgasp.c\n        src/base/ftsystem.c\n        src/base/ftstroke.c\n        src/base/ftapi.c\n        src/base/ftlcdfil.c\n        src/base/ftdebug.c\n        src/base/ftcid.c\n        src/base/ftfstype.c\n        src/base/ftxf86.c\n        src/base/ftbitmap.c\n        src/base/ftpfr.c\n        src/base/ftwinfnt.c\n        src/base/ftgxval.c\n        src/base/ftpatent.c\n        src/base/ftbbox.c\n        src/base/ftbase.c\n        src/base/ftsynth.c\n        src/base/fttype1.c\n        src/base/ftmm.c\n        src/smooth/ftsmooth.c\n        src/smooth/ftgrays.c\n        src/smooth/ftspic.c\n        src/raster/ftraster.c\n        src/raster/rastpic.c\n        src/raster/ftrend1.c\n        src/bzip2/ftbzip2.c\n        src/truetype/ttobjs.c\n        src/truetype/ttgload.c\n        src/truetype/ttpic.c\n        src/truetype/ttgxvar.c\n        src/truetype/ttsubpix.c\n        src/truetype/ttinterp.c\n        src/truetype/ttdriver.c\n        src/truetype/ttpload.c\n        )\n\n\ntarget_link_libraries(\n        freetype\n        GLESv1_CM\n        GLESv2\n        android\n        z\n        log\n)"
  },
  {
    "path": "libs/freetype/build.gradle",
    "content": "apply plugin: 'com.android.model.native'\n\nmodel {\n    android {\n        compileSdkVersion = gradle.sdkVersion\n        buildToolsVersion = gradle.buildToolsVersion\n\n        defaultConfig {\n            minSdkVersion.apiLevel = gradle.minSdkVersion\n            versionCode = 1\n            versionName = '1.0'\n        }\n        ndk {\n            moduleName = 'freetype'\n            ldLibs.addAll([\"GLESv1_CM\", \"EGL\", \"GLESv2\", \"log\", \"android\", \"dl\"])\n            CFlags.addAll([\"-DFT_CONFIG_CONFIG_H=<ftconfig.h>\", \"-DFT2_BUILD_LIBRARY\", \"-DFT_CONFIG_MODULES_H=<ftmodule.h>\"])\n            CFlags.addAll([\n                \"-I\" + file(\"include/\").absolutePath, \n                \"-DGL_GLEXT_PROTOTYPES\"])\n        }\n\n        sources {\n            main {\n                jni {\n                    source {\n                        srcDir \"src\"\n                        exclude \"autofit\"\n                        exclude \"base/ftpic.c\"\n                        exclude \"base/basepic.c\"\n                        exclude \"base/ftadvanc.c\"\n                        exclude \"base/ftcalc.c\"\n                        exclude \"base/ftdbgmem.c\"\n                        exclude \"base/ftgloadr.c\"\n                        exclude \"base/ftobjs.c\"\n                        exclude \"base/ftoutln.c\"\n                        exclude \"base/ftrfork.c\"\n                        exclude \"base/ftsnames.c\"\n                        exclude \"base/ftstream.c\"\n                        exclude \"base/fttrigon.c\"\n                        exclude \"base/ftutil.c\"\n                        exclude \"base/ftmac.c\"\n                        exclude \"bdf\"\n                        exclude \"cache\"\n                        exclude \"cff/cffcmap.c\"\n                        exclude \"cid\"\n                        exclude \"cff\"\n                        exclude \"gzip\"\n                        exclude \"gxvalid\"\n                        exclude \"lzw\"\n                        exclude \"otvalid\"\n                        exclude \"outvalid\"\n                        exclude \"pcf\"\n                        exclude \"pfr\"\n                        exclude \"pshinter\"\n                        exclude \"psnames\"\n                        exclude \"psaux\"\n                        exclude \"raster/raster.c\"\n                        exclude \"sfnt/sfnt.c\"\n                        exclude \"sfnt/ttsbit0.c\"\n                        exclude \"smooth/smooth.c\"\n                        exclude \"tools\"\n                        // Including this file in build causes duplications, because it includes directly C files\n                        exclude \"truetype/truetype.c\"\n                        exclude \"type1\"\n                        exclude \"type42\"\n                        exclude \"winfonts\"\n                    }\n                }\n            }\n        }\n\n    }\n}\n\ntask(distributeLib, type : Copy) {\n    // trigger build library\n    dependsOn assemble\n    into gradle.libDistributionRoot + '/freetype/'\n    from('build/outputs/native/release/lib') {\n        into 'lib/'\n    }\n}\n"
  },
  {
    "path": "libs/freetype/cmake_install.cmake",
    "content": "# Install script for directory: C:/is-Engine/libs/freetype\n\n# Set the install prefix\nif(NOT DEFINED CMAKE_INSTALL_PREFIX)\n  set(CMAKE_INSTALL_PREFIX \"C:/Program Files (x86)/Project\")\nendif()\nstring(REGEX REPLACE \"/$\" \"\" CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")\n\n# Set the install configuration name.\nif(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)\n  if(BUILD_TYPE)\n    string(REGEX REPLACE \"^[^A-Za-z0-9_]+\" \"\"\n           CMAKE_INSTALL_CONFIG_NAME \"${BUILD_TYPE}\")\n  else()\n    set(CMAKE_INSTALL_CONFIG_NAME \"Release\")\n  endif()\n  message(STATUS \"Install configuration: \\\"${CMAKE_INSTALL_CONFIG_NAME}\\\"\")\nendif()\n\n# Set the component getting installed.\nif(NOT CMAKE_INSTALL_COMPONENT)\n  if(COMPONENT)\n    message(STATUS \"Install component: \\\"${COMPONENT}\\\"\")\n    set(CMAKE_INSTALL_COMPONENT \"${COMPONENT}\")\n  else()\n    set(CMAKE_INSTALL_COMPONENT)\n  endif()\nendif()\n\n# Install shared libraries without execute permission?\nif(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n  set(CMAKE_INSTALL_SO_NO_EXE \"0\")\nendif()\n\n# Is this installation the result of a crosscompile?\nif(NOT DEFINED CMAKE_CROSSCOMPILING)\n  set(CMAKE_CROSSCOMPILING \"TRUE\")\nendif()\n\n"
  },
  {
    "path": "libs/freetype/include/freetype/config/ftconfig.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftconfig.h                                                             */\n/*                                                                         */\n/*    ANSI-specific configuration file (specification only).               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This header file contains a number of macro definitions that are used */\n  /* by the rest of the engine.  Most of the macros here are automatically */\n  /* determined at compile time, and you should not need to change it to   */\n  /* port FreeType, except to compile the library with a non-ANSI          */\n  /* compiler.                                                             */\n  /*                                                                       */\n  /* Note however that if some specific modifications are needed, we       */\n  /* advise you to place a modified copy in your build directory.          */\n  /*                                                                       */\n  /* The build directory is usually `freetype/builds/<system>', and        */\n  /* contains system-specific files that are always included first when    */\n  /* building the library.                                                 */\n  /*                                                                       */\n  /* This ANSI version should stay in `include/freetype/config'.           */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __FTCONFIG_H__\n#define __FTCONFIG_H__\n\n#include <ft2build.h>\n#include FT_CONFIG_OPTIONS_H\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */\n  /*                                                                       */\n  /* These macros can be toggled to suit a specific system.  The current   */\n  /* ones are defaults used to compile FreeType in an ANSI C environment   */\n  /* (16bit compilers are also supported).  Copy this file to your own     */\n  /* `freetype/builds/<system>' directory, and edit it to port the engine. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* There are systems (like the Texas Instruments 'C54x) where a `char' */\n  /* has 16 bits.  ANSI C says that sizeof(char) is always 1.  Since an  */\n  /* `int' has 16 bits also for this system, sizeof(int) gives 1 which   */\n  /* is probably unexpected.                                             */\n  /*                                                                     */\n  /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a      */\n  /* `char' type.                                                        */\n\n#ifndef FT_CHAR_BIT\n#define FT_CHAR_BIT  CHAR_BIT\n#endif\n\n\n  /* The size of an `int' type.  */\n#if                                 FT_UINT_MAX == 0xFFFFUL\n#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)\n#elif                               FT_UINT_MAX == 0xFFFFFFFFUL\n#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)\n#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL\n#define FT_SIZEOF_INT  (64 / FT_CHAR_BIT)\n#else\n#error \"Unsupported size of `int' type!\"\n#endif\n\n  /* The size of a `long' type.  A five-byte `long' (as used e.g. on the */\n  /* DM642) is recognized but avoided.                                   */\n#if                                  FT_ULONG_MAX == 0xFFFFFFFFUL\n#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)\n#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL\n#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)\n#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL\n#define FT_SIZEOF_LONG  (64 / FT_CHAR_BIT)\n#else\n#error \"Unsupported size of `long' type!\"\n#endif\n\n\n  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */\n  /* used -- this is only used to get rid of unpleasant compiler warnings */\n#ifndef FT_UNUSED\n#define FT_UNUSED( arg )  ( (arg) = (arg) )\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                     AUTOMATIC CONFIGURATION MACROS                    */\n  /*                                                                       */\n  /* These macros are computed from the ones defined above.  Don't touch   */\n  /* their definition, unless you know precisely what you are doing.  No   */\n  /* porter should need to mess with them.                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Mac support                                                           */\n  /*                                                                       */\n  /*   This is the only necessary change, so it is defined here instead    */\n  /*   providing a new configuration file.                                 */\n  /*                                                                       */\n#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )\n  /* no Carbon frameworks for 64bit 10.4.x */\n  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */\n  /* so guess the system version by maximum errno before inclusion */\n#include <errno.h>\n#ifdef ECANCELED /* defined since 10.2 */\n#include \"AvailabilityMacros.h\"\n#endif\n#if defined( __LP64__ ) && \\\n    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )\n#undef FT_MACINTOSH\n#endif\n\n#elif defined( __SC__ ) || defined( __MRC__ )\n  /* Classic MacOS compilers */\n#include \"ConditionalMacros.h\"\n#if TARGET_OS_MAC\n#define FT_MACINTOSH 1\n#endif\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int16                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 16bit signed integer type.                         */\n  /*                                                                       */\n  typedef signed short  FT_Int16;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt16                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 16bit unsigned integer type.                       */\n  /*                                                                       */\n  typedef unsigned short  FT_UInt16;\n\n  /* */\n\n\n  /* this #if 0 ... #endif clause is for documentation purposes */\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int32                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 32bit signed integer type.  The size depends on    */\n  /*    the configuration.                                                 */\n  /*                                                                       */\n  typedef signed XXX  FT_Int32;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt32                                                          */\n  /*                                                                       */\n  /*    A typedef for a 32bit unsigned integer type.  The size depends on  */\n  /*    the configuration.                                                 */\n  /*                                                                       */\n  typedef unsigned XXX  FT_UInt32;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int64                                                           */\n  /*                                                                       */\n  /*    A typedef for a 64bit signed integer type.  The size depends on    */\n  /*    the configuration.  Only defined if there is real 64bit support;   */\n  /*    otherwise, it gets emulated with a structure (if necessary).       */\n  /*                                                                       */\n  typedef signed XXX  FT_Int64;\n\n  /* */\n\n#endif\n\n#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)\n\n  typedef signed int      FT_Int32;\n  typedef unsigned int    FT_UInt32;\n\n#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)\n\n  typedef signed long     FT_Int32;\n  typedef unsigned long   FT_UInt32;\n\n#else\n#error \"no 32bit type found -- please check your configuration files\"\n#endif\n\n\n  /* look up an integer type that is at least 32 bits */\n#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)\n\n  typedef int            FT_Fast;\n  typedef unsigned int   FT_UFast;\n\n#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)\n\n  typedef long           FT_Fast;\n  typedef unsigned long  FT_UFast;\n\n#endif\n\n\n  /* determine whether we have a 64-bit int type for platforms without */\n  /* Autoconf                                                          */\n#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)\n\n  /* FT_LONG64 must be defined if a 64-bit type is available */\n#define FT_LONG64\n#define FT_INT64  long\n\n#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */\n\n  /* this compiler provides the __int64 type */\n#define FT_LONG64\n#define FT_INT64  __int64\n\n#elif defined( __BORLANDC__ )  /* Borland C++ */\n\n  /* XXXX: We should probably check the value of __BORLANDC__ in order */\n  /*       to test the compiler version.                               */\n\n  /* this compiler provides the __int64 type */\n#define FT_LONG64\n#define FT_INT64  __int64\n\n#elif defined( __WATCOMC__ )   /* Watcom C++ */\n\n  /* Watcom doesn't provide 64-bit data types */\n\n#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */\n\n#define FT_LONG64\n#define FT_INT64  long long int\n\n#elif defined( __GNUC__ )\n\n  /* GCC provides the `long long' type */\n#define FT_LONG64\n#define FT_INT64  long long int\n\n#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A 64-bit data type will create compilation problems if you compile    */\n  /* in strict ANSI mode.  To avoid them, we disable its use if __STDC__   */\n  /* is defined.  You can however ignore this rule by defining the         */\n  /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro.                     */\n  /*                                                                       */\n#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )\n\n#ifdef __STDC__\n\n  /* undefine the 64-bit macros in strict ANSI compilation mode */\n#undef FT_LONG64\n#undef FT_INT64\n\n#endif /* __STDC__ */\n\n#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */\n\n#ifdef FT_LONG64\n  typedef FT_INT64  FT_Int64;\n#endif\n\n\n#define FT_BEGIN_STMNT  do {\n#define FT_END_STMNT    } while ( 0 )\n#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT\n\n\n#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER\n  /* Provide assembler fragments for performance-critical functions. */\n  /* These must be defined `static __inline__' with GCC.             */\n\n#if defined( __CC_ARM ) || defined( __ARMCC__ )  /* RVCT */\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm\n\n  /* documentation is in freetype.h */\n\n  static __inline FT_Int32\n  FT_MulFix_arm( FT_Int32  a,\n                 FT_Int32  b )\n  {\n    register FT_Int32  t, t2;\n\n\n    __asm\n    {\n      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */\n      mov   a,  t,  asr #31         /* a   = (hi >> 31) */\n      add   a,  a,  #0x8000         /* a  += 0x8000 */\n      adds  t2, t2, a               /* t2 += a */\n      adc   t,  t,  #0              /* t  += carry */\n      mov   a,  t2, lsr #16         /* a   = t2 >> 16 */\n      orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */\n    }\n    return a;\n  }\n\n#endif /* __CC_ARM || __ARMCC__ */\n\n\n#ifdef __GNUC__\n\n#if defined( __arm__ ) && !defined( __thumb__ )    && \\\n    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm\n\n  /* documentation is in freetype.h */\n\n  static __inline__ FT_Int32\n  FT_MulFix_arm( FT_Int32  a,\n                 FT_Int32  b )\n  {\n    register FT_Int32  t, t2;\n\n\n    __asm__ __volatile__ (\n      \"smull  %1, %2, %4, %3\\n\\t\"       /* (lo=%1,hi=%2) = a*b */\n      \"mov    %0, %2, asr #31\\n\\t\"      /* %0  = (hi >> 31) */\n      \"add    %0, %0, #0x8000\\n\\t\"      /* %0 += 0x8000 */\n      \"adds   %1, %1, %0\\n\\t\"           /* %1 += %0 */\n      \"adc    %2, %2, #0\\n\\t\"           /* %2 += carry */\n      \"mov    %0, %1, lsr #16\\n\\t\"      /* %0  = %1 >> 16 */\n      \"orr    %0, %0, %2, lsl #16\\n\\t\"  /* %0 |= %2 << 16 */\n      : \"=r\"(a), \"=&r\"(t2), \"=&r\"(t)\n      : \"r\"(a), \"r\"(b)\n      : \"cc\" );\n    return a;\n  }\n\n#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */\n\n#if defined( __i386__ )\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386\n\n  /* documentation is in freetype.h */\n\n  static __inline__ FT_Int32\n  FT_MulFix_i386( FT_Int32  a,\n                  FT_Int32  b )\n  {\n    register FT_Int32  result;\n\n\n    __asm__ __volatile__ (\n      \"imul  %%edx\\n\"\n      \"movl  %%edx, %%ecx\\n\"\n      \"sarl  $31, %%ecx\\n\"\n      \"addl  $0x8000, %%ecx\\n\"\n      \"addl  %%ecx, %%eax\\n\"\n      \"adcl  $0, %%edx\\n\"\n      \"shrl  $16, %%eax\\n\"\n      \"shll  $16, %%edx\\n\"\n      \"addl  %%edx, %%eax\\n\"\n      : \"=a\"(result), \"=d\"(b)\n      : \"a\"(a), \"d\"(b)\n      : \"%ecx\", \"cc\" );\n    return result;\n  }\n\n#endif /* i386 */\n\n#endif /* __GNUC__ */\n\n\n#ifdef _MSC_VER /* Visual C++ */\n\n#ifdef _M_IX86\n\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386\n\n  /* documentation is in freetype.h */\n\n  static __inline FT_Int32\n  FT_MulFix_i386( FT_Int32  a,\n                  FT_Int32  b )\n  {\n    register FT_Int32  result;\n\n    __asm\n    {\n      mov eax, a\n      mov edx, b\n      imul edx\n      mov ecx, edx\n      sar ecx, 31\n      add ecx, 8000h\n      add eax, ecx\n      adc edx, 0\n      shr eax, 16\n      shl edx, 16\n      add eax, edx\n      mov result, eax\n    }\n    return result;\n  }\n\n#endif /* _M_IX86 */\n\n#endif /* _MSC_VER */\n\n#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */\n\n\n#ifdef FT_CONFIG_OPTION_INLINE_MULFIX\n#ifdef FT_MULFIX_ASSEMBLER\n#define FT_MULFIX_INLINED  FT_MULFIX_ASSEMBLER\n#endif\n#endif\n\n\n#ifdef FT_MAKE_OPTION_SINGLE_OBJECT\n\n#define FT_LOCAL( x )      static  x\n#define FT_LOCAL_DEF( x )  static  x\n\n#else\n\n#ifdef __cplusplus\n#define FT_LOCAL( x )      extern \"C\"  x\n#define FT_LOCAL_DEF( x )  extern \"C\"  x\n#else\n#define FT_LOCAL( x )      extern  x\n#define FT_LOCAL_DEF( x )  x\n#endif\n\n#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */\n\n\n#ifndef FT_BASE\n\n#ifdef __cplusplus\n#define FT_BASE( x )  extern \"C\"  x\n#else\n#define FT_BASE( x )  extern  x\n#endif\n\n#endif /* !FT_BASE */\n\n\n#ifndef FT_BASE_DEF\n\n#ifdef __cplusplus\n#define FT_BASE_DEF( x )  x\n#else\n#define FT_BASE_DEF( x )  x\n#endif\n\n#endif /* !FT_BASE_DEF */\n\n\n#ifndef FT_EXPORT\n\n#ifdef __cplusplus\n#define FT_EXPORT( x )  extern \"C\"  x\n#else\n#define FT_EXPORT( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT */\n\n\n#ifndef FT_EXPORT_DEF\n\n#ifdef __cplusplus\n#define FT_EXPORT_DEF( x )  extern \"C\"  x\n#else\n#define FT_EXPORT_DEF( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT_DEF */\n\n\n#ifndef FT_EXPORT_VAR\n\n#ifdef __cplusplus\n#define FT_EXPORT_VAR( x )  extern \"C\"  x\n#else\n#define FT_EXPORT_VAR( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT_VAR */\n\n  /* The following macros are needed to compile the library with a   */\n  /* C++ compiler and with 16bit compilers.                          */\n  /*                                                                 */\n\n  /* This is special.  Within C++, you must specify `extern \"C\"' for */\n  /* functions which are used via function pointers, and you also    */\n  /* must do that for structures which contain function pointers to  */\n  /* assure C linkage -- it's not possible to have (local) anonymous */\n  /* functions which are accessed by (global) function pointers.     */\n  /*                                                                 */\n  /*                                                                 */\n  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */\n  /*                                                                 */\n  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */\n  /* contains pointers to callback functions.                        */\n  /*                                                                 */\n  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */\n  /* that contains pointers to callback functions.                   */\n  /*                                                                 */\n  /*                                                                 */\n  /* Some 16bit compilers have to redefine these macros to insert    */\n  /* the infamous `_cdecl' or `__fastcall' declarations.             */\n  /*                                                                 */\n#ifndef FT_CALLBACK_DEF\n#ifdef __cplusplus\n#define FT_CALLBACK_DEF( x )  extern \"C\"  x\n#else\n#define FT_CALLBACK_DEF( x )  static  x\n#endif\n#endif /* FT_CALLBACK_DEF */\n\n#ifndef FT_CALLBACK_TABLE\n#ifdef __cplusplus\n#define FT_CALLBACK_TABLE      extern \"C\"\n#define FT_CALLBACK_TABLE_DEF  extern \"C\"\n#else\n#define FT_CALLBACK_TABLE      extern\n#define FT_CALLBACK_TABLE_DEF  /* nothing */\n#endif\n#endif /* FT_CALLBACK_TABLE */\n\n\nFT_END_HEADER\n\n\n#endif /* __FTCONFIG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/config/ftheader.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftheader.h                                                             */\n/*                                                                         */\n/*    Build macros of the FreeType 2 library.                              */\n/*                                                                         */\n/*  Copyright 1996-2008, 2010, 2012, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#ifndef __FT_HEADER_H__\n#define __FT_HEADER_H__\n\n\n  /*@***********************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_BEGIN_HEADER                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro is used in association with @FT_END_HEADER in header    */\n  /*    files to ensure that the declarations within are properly          */\n  /*    encapsulated in an `extern \"C\" { .. }' block when included from a  */\n  /*    C++ compiler.                                                      */\n  /*                                                                       */\n#ifdef __cplusplus\n#define FT_BEGIN_HEADER  extern \"C\" {\n#else\n#define FT_BEGIN_HEADER  /* nothing */\n#endif\n\n\n  /*@***********************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_END_HEADER                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro is used in association with @FT_BEGIN_HEADER in header  */\n  /*    files to ensure that the declarations within are properly          */\n  /*    encapsulated in an `extern \"C\" { .. }' block when included from a  */\n  /*    C++ compiler.                                                      */\n  /*                                                                       */\n#ifdef __cplusplus\n#define FT_END_HEADER  }\n#else\n#define FT_END_HEADER  /* nothing */\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Aliases for the FreeType 2 public and configuration files.            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    header_file_macros                                                 */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Header File Macros                                                 */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Macro definitions used to #include specific header files.          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The following macros are defined to the name of specific           */\n  /*    FreeType~2 header files.  They can be used directly in #include    */\n  /*    statements as in:                                                  */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      #include FT_FREETYPE_H                                           */\n  /*      #include FT_MULTIPLE_MASTERS_H                                   */\n  /*      #include FT_GLYPH_H                                              */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    There are several reasons why we are now using macros to name      */\n  /*    public header files.  The first one is that such macros are not    */\n  /*    limited to the infamous 8.3~naming rule required by DOS (and       */\n  /*    `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h').   */\n  /*                                                                       */\n  /*    The second reason is that it allows for more flexibility in the    */\n  /*    way FreeType~2 is installed on a given system.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* configuration files */\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_CONFIG_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   FreeType~2 configuration data.\n   *\n   */\n#ifndef FT_CONFIG_CONFIG_H\n#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>\n#endif\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_STANDARD_LIBRARY_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   FreeType~2 interface to the standard C library functions.\n   *\n   */\n#ifndef FT_CONFIG_STANDARD_LIBRARY_H\n#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>\n#endif\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_OPTIONS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   FreeType~2 project-specific configuration options.\n   *\n   */\n#ifndef FT_CONFIG_OPTIONS_H\n#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>\n#endif\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CONFIG_MODULES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list of FreeType~2 modules that are statically linked to new library\n   *   instances in @FT_Init_FreeType.\n   *\n   */\n#ifndef FT_CONFIG_MODULES_H\n#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>\n#endif\n\n  /* */\n\n  /* public headers */\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_FREETYPE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   base FreeType~2 API.\n   *\n   */\n#define FT_FREETYPE_H  <freetype/freetype.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ERRORS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list of FreeType~2 error codes (and messages).\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_ERRORS_H  <freetype/fterrors.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MODULE_ERRORS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list of FreeType~2 module error offsets (and messages).\n   *\n   */\n#define FT_MODULE_ERRORS_H  <freetype/ftmoderr.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SYSTEM_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 interface to low-level operations (i.e., memory management\n   *   and stream i/o).\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_SYSTEM_H  <freetype/ftsystem.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IMAGE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing type\n   *   definitions related to glyph images (i.e., bitmaps, outlines,\n   *   scan-converter parameters).\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_IMAGE_H  <freetype/ftimage.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TYPES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   basic data types defined by FreeType~2.\n   *\n   *   It is included by @FT_FREETYPE_H.\n   *\n   */\n#define FT_TYPES_H  <freetype/fttypes.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_LIST_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   list management API of FreeType~2.\n   *\n   *   (Most applications will never need to include this file.)\n   *\n   */\n#define FT_LIST_H  <freetype/ftlist.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_OUTLINE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   scalable outline management API of FreeType~2.\n   *\n   */\n#define FT_OUTLINE_H  <freetype/ftoutln.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SIZES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API which manages multiple @FT_Size objects per face.\n   *\n   */\n#define FT_SIZES_H  <freetype/ftsizes.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MODULE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   module management API of FreeType~2.\n   *\n   */\n#define FT_MODULE_H  <freetype/ftmodapi.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_RENDER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   renderer module management API of FreeType~2.\n   *\n   */\n#define FT_RENDER_H  <freetype/ftrender.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_AUTOHINTER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   structures and macros related to the auto-hinting module.\n   *\n   */\n#define FT_AUTOHINTER_H  <freetype/ftautoh.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CFF_DRIVER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing\n   *   structures and macros related to the CFF driver module.\n   *\n   */\n#define FT_CFF_DRIVER_H  <freetype/ftcffdrv.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TYPE1_TABLES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   types and API specific to the Type~1 format.\n   *\n   */\n#define FT_TYPE1_TABLES_H  <freetype/t1tables.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_IDS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   enumeration values which identify name strings, languages, encodings,\n   *   etc.  This file really contains a _large_ set of constant macro\n   *   definitions, taken from the TrueType and OpenType specifications.\n   *\n   */\n#define FT_TRUETYPE_IDS_H  <freetype/ttnameid.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_TABLES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   types and API specific to the TrueType (as well as OpenType) format.\n   *\n   */\n#define FT_TRUETYPE_TABLES_H  <freetype/tttables.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRUETYPE_TAGS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of TrueType four-byte `tags' which identify blocks in\n   *   SFNT-based font formats (i.e., TrueType and OpenType).\n   *\n   */\n#define FT_TRUETYPE_TAGS_H  <freetype/tttags.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BDF_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which accesses BDF-specific strings from a\n   *   face.\n   *\n   */\n#define FT_BDF_H  <freetype/ftbdf.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CID_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which access CID font information from a\n   *   face.\n   *\n   */\n#define FT_CID_H  <freetype/ftcid.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GZIP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports gzip-compressed files.\n   *\n   */\n#define FT_GZIP_H  <freetype/ftgzip.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_LZW_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports LZW-compressed files.\n   *\n   */\n#define FT_LZW_H  <freetype/ftlzw.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BZIP2_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports bzip2-compressed files.\n   *\n   */\n#define FT_BZIP2_H  <freetype/ftbzip2.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_WINFONTS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   definitions of an API which supports Windows FNT files.\n   *\n   */\n#define FT_WINFONTS_H   <freetype/ftwinfnt.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GLYPH_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional glyph management component.\n   *\n   */\n#define FT_GLYPH_H  <freetype/ftglyph.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BITMAP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional bitmap conversion component.\n   *\n   */\n#define FT_BITMAP_H  <freetype/ftbitmap.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_BBOX_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional exact bounding box computation routines.\n   *\n   */\n#define FT_BBOX_H  <freetype/ftbbox.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   API of the optional FreeType~2 cache sub-system.\n   *\n   */\n#define FT_CACHE_H  <freetype/ftcache.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_IMAGE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   `glyph image' API of the FreeType~2 cache sub-system.\n   *\n   *   It is used to define a cache for @FT_Glyph elements.  You can also\n   *   use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to\n   *   store small glyph bitmaps, as it will use less memory.\n   *\n   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all\n   *   glyph image-related cache declarations.\n   *\n   */\n#define FT_CACHE_IMAGE_H  FT_CACHE_H\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_SMALL_BITMAPS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   `small bitmaps' API of the FreeType~2 cache sub-system.\n   *\n   *   It is used to define a cache for small glyph bitmaps in a relatively\n   *   memory-efficient way.  You can also use the API defined in\n   *   @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,\n   *   including scalable outlines.\n   *\n   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all\n   *   small bitmaps-related cache declarations.\n   *\n   */\n#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_CACHE_CHARMAP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   `charmap' API of the FreeType~2 cache sub-system.\n   *\n   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all\n   *   charmap-based cache declarations.\n   *\n   */\n#define FT_CACHE_CHARMAP_H  FT_CACHE_H\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MAC_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   Macintosh-specific FreeType~2 API.  The latter is used to access\n   *   fonts embedded in resource forks.\n   *\n   *   This header file must be explicitly included by client applications\n   *   compiled on the Mac (note that the base API still works though).\n   *\n   */\n#define FT_MAC_H  <freetype/ftmac.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_MULTIPLE_MASTERS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional multiple-masters management API of FreeType~2.\n   *\n   */\n#define FT_MULTIPLE_MASTERS_H  <freetype/ftmm.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SFNT_NAMES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional FreeType~2 API which accesses embedded `name' strings in\n   *   SFNT-based font formats (i.e., TrueType and OpenType).\n   *\n   */\n#define FT_SFNT_NAMES_H  <freetype/ftsnames.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_OPENTYPE_VALIDATE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional FreeType~2 API which validates OpenType tables (BASE, GDEF,\n   *   GPOS, GSUB, JSTF).\n   *\n   */\n#define FT_OPENTYPE_VALIDATE_H  <freetype/ftotval.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GX_VALIDATE_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,\n   *   mort, morx, bsln, just, kern, opbd, trak, prop).\n   *\n   */\n#define FT_GX_VALIDATE_H  <freetype/ftgxval.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_PFR_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which accesses PFR-specific data.\n   *\n   */\n#define FT_PFR_H  <freetype/ftpfr.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_STROKER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which provides functions to stroke outline paths.\n   */\n#define FT_STROKER_H  <freetype/ftstroke.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SYNTHESIS_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs artificial obliquing and emboldening.\n   */\n#define FT_SYNTHESIS_H  <freetype/ftsynth.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_XFREE86_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which provides functions specific to the XFree86 and\n   *   X.Org X11 servers.\n   */\n#define FT_XFREE86_H  <freetype/ftxf86.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_TRIGONOMETRY_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs trigonometric computations (e.g.,\n   *   cosines and arc tangents).\n   */\n#define FT_TRIGONOMETRY_H  <freetype/fttrigon.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_LCD_FILTER_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs color filtering for subpixel rendering.\n   */\n#define FT_LCD_FILTER_H  <freetype/ftlcdfil.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_UNPATENTED_HINTING_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs color filtering for subpixel rendering.\n   */\n#define FT_UNPATENTED_HINTING_H  <freetype/ttunpat.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_INCREMENTAL_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which performs color filtering for subpixel rendering.\n   */\n#define FT_INCREMENTAL_H  <freetype/ftincrem.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_GASP_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which returns entries from the TrueType GASP table.\n   */\n#define FT_GASP_H  <freetype/ftgasp.h>\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ADVANCES_H\n   *\n   * @description:\n   *   A macro used in #include statements to name the file containing the\n   *   FreeType~2 API which returns individual and ranged glyph advances.\n   */\n#define FT_ADVANCES_H  <freetype/ftadvanc.h>\n\n\n  /* */\n\n#define FT_ERROR_DEFINITIONS_H  <freetype/fterrdef.h>\n\n\n  /* The internals of the cache sub-system are no longer exposed.  We */\n  /* default to FT_CACHE_H at the moment just in case, but we know of */\n  /* no rogue client that uses them.                                  */\n  /*                                                                  */\n#define FT_CACHE_MANAGER_H           <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_MRU_H      <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_MANAGER_H  <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_CACHE_H    <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_GLYPH_H    <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_IMAGE_H    <freetype/ftcache.h>\n#define FT_CACHE_INTERNAL_SBITS_H    <freetype/ftcache.h>\n\n\n#define FT_INCREMENTAL_H          <freetype/ftincrem.h>\n\n#define FT_TRUETYPE_UNPATENTED_H  <freetype/ttunpat.h>\n\n\n  /*\n   * Include internal headers definitions from <freetype/internal/...>\n   * only when building the library.\n   */\n#ifdef FT2_BUILD_LIBRARY\n#define  FT_INTERNAL_INTERNAL_H  <freetype/internal/internal.h>\n#include FT_INTERNAL_INTERNAL_H\n#endif /* FT2_BUILD_LIBRARY */\n\n\n#endif /* __FT2_BUILD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/config/ftmodule.h",
    "content": "/*\n *  This file registers the FreeType modules compiled into the library.\n *\n *  If you use GNU make, this file IS NOT USED!  Instead, it is created in\n *  the objects directory (normally `<topdir>/objs/') based on information\n *  from `<topdir>/modules.cfg'.\n *\n *  Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile\n *  FreeType without GNU make.\n *\n */\n\nFT_USE_MODULE( FT_Module_Class, autofit_module_class )\nFT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )\nFT_USE_MODULE( FT_Module_Class, psaux_module_class )\nFT_USE_MODULE( FT_Module_Class, psnames_module_class )\nFT_USE_MODULE( FT_Module_Class, pshinter_module_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )\nFT_USE_MODULE( FT_Module_Class, sfnt_module_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )\nFT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )\n\n/* EOF */\n"
  },
  {
    "path": "libs/freetype/include/freetype/config/ftoption.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftoption.h                                                             */\n/*                                                                         */\n/*    User-selectable configuration macros (specification only).           */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTOPTION_H__\n#define __FTOPTION_H__\n\n\n#include <ft2build.h>\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                 USER-SELECTABLE CONFIGURATION MACROS                  */\n  /*                                                                       */\n  /* This file contains the default configuration macro definitions for    */\n  /* a standard build of the FreeType library.  There are three ways to    */\n  /* use this file to build project-specific versions of the library:      */\n  /*                                                                       */\n  /*  - You can modify this file by hand, but this is not recommended in   */\n  /*    cases where you would like to build several versions of the        */\n  /*    library from a single source directory.                            */\n  /*                                                                       */\n  /*  - You can put a copy of this file in your build directory, more      */\n  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */\n  /*    is the name of a directory that is included _before_ the FreeType  */\n  /*    include path during compilation.                                   */\n  /*                                                                       */\n  /*    The default FreeType Makefiles and Jamfiles use the build          */\n  /*    directory `builds/<system>' by default, but you can easily change  */\n  /*    that for your own projects.                                        */\n  /*                                                                       */\n  /*  - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it    */\n  /*    slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to       */\n  /*    locate this file during the build.  For example,                   */\n  /*                                                                       */\n  /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */\n  /*      #include <freetype/config/ftheader.h>                            */\n  /*                                                                       */\n  /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */\n  /*    definitions.                                                       */\n  /*                                                                       */\n  /*    Note also that you can similarly pre-define the macro              */\n  /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */\n  /*    that are statically linked to the library at compile time.  By     */\n  /*    default, this file is <freetype/config/ftmodule.h>.                */\n  /*                                                                       */\n  /*  We highly recommend using the third method whenever possible.        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /**** G E N E R A L   F R E E T Y P E   2   C O N F I G U R A T I O N ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Uncomment the line below if you want to activate sub-pixel rendering  */\n  /* (a.k.a. LCD rendering, or ClearType) in this build of the library.    */\n  /*                                                                       */\n  /* Note that this feature is covered by several Microsoft patents        */\n  /* and should not be activated in any default build of the library.      */\n  /*                                                                       */\n  /* This macro has no impact on the FreeType API, only on its             */\n  /* _implementation_.  For example, using FT_RENDER_MODE_LCD when calling */\n  /* FT_Render_Glyph still generates a bitmap that is 3 times wider than   */\n  /* the original size in case this macro isn't defined; however, each     */\n  /* triplet of subpixels has R=G=B.                                       */\n  /*                                                                       */\n  /* This is done to allow FreeType clients to run unmodified, forcing     */\n  /* them to display normal gray-level anti-aliased glyphs.                */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Many compilers provide a non-ANSI 64-bit data type that can be used   */\n  /* by FreeType to speed up some computations.  However, this will create */\n  /* some problems when compiling the library in strict ANSI mode.         */\n  /*                                                                       */\n  /* For this reason, the use of 64-bit integers is normally disabled when */\n  /* the __STDC__ macro is defined.  You can however disable this by       */\n  /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here.                 */\n  /*                                                                       */\n  /* For most compilers, this will only create compilation warnings when   */\n  /* building the library.                                                 */\n  /*                                                                       */\n  /* ObNote: The compiler-specific 64-bit integers are detected in the     */\n  /*         file `ftconfig.h' either statically or through the            */\n  /*         `configure' script on supported platforms.                    */\n  /*                                                                       */\n#undef FT_CONFIG_OPTION_FORCE_INT64\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If this macro is defined, do not try to use an assembler version of   */\n  /* performance-critical functions (e.g. FT_MulFix).  You should only do  */\n  /* that to verify that the assembler function works properly, or to      */\n  /* execute benchmark tests of the various implementations.               */\n/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If this macro is defined, try to use an inlined assembler version of  */\n  /* the `FT_MulFix' function, which is a `hotspot' when loading and       */\n  /* hinting glyphs, and which should be executed as fast as possible.     */\n  /*                                                                       */\n  /* Note that if your compiler or CPU is not supported, this will default */\n  /* to the standard and portable implementation found in `ftcalc.c'.      */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_INLINE_MULFIX\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LZW-compressed file support.                                          */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `compress' program.  This is mostly used to parse many of the PCF   */\n  /*   files that come with various X11 distributions.  The implementation */\n  /*   uses NetBSD's `zopen' to partially uncompress the file on the fly   */\n  /*   (see src/lzw/ftgzip.c).                                             */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_USE_LZW\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Gzip-compressed file support.                                         */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `gzip' program.  This is mostly used to parse many of the PCF files */\n  /*   that come with XFree86.  The implementation uses `zlib' to          */\n  /*   partially uncompress the file on the fly (see src/gzip/ftgzip.c).   */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.  See also   */\n  /*   the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below.                       */\n  /*                                                                       */\n/*#define FT_CONFIG_OPTION_USE_ZLIB*/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ZLib library selection                                                */\n  /*                                                                       */\n  /*   This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined.  */\n  /*   It allows FreeType's `ftgzip' component to link to the system's     */\n  /*   installation of the ZLib library.  This is useful on systems like   */\n  /*   Unix or VMS where it generally is already available.                */\n  /*                                                                       */\n  /*   If you let it undefined, the component will use its own copy        */\n  /*   of the zlib sources instead.  These have been modified to be        */\n  /*   included directly within the component and *not* export external    */\n  /*   function names.  This allows you to link any program with FreeType  */\n  /*   _and_ ZLib without linking conflicts.                               */\n  /*                                                                       */\n  /*   Do not #undef this macro here since the build system might define   */\n  /*   it for certain configurations only.                                 */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Bzip2-compressed file support.                                        */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `bzip2' program.  This is mostly used to parse many of the PCF      */\n  /*   files that come with XFree86.  The implementation uses `libbz2' to  */\n  /*   partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */\n  /*   Contrary to gzip, bzip2 currently is not included and need to use   */\n  /*   the system available bzip2 implementation.                          */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_USE_BZIP2 */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define to disable the use of file stream functions and types, FILE,   */\n  /* fopen() etc.  Enables the use of smaller system libraries on embedded */\n  /* systems that have multiple system libraries, some with or without     */\n  /* file stream support, in the cases where file stream support is not    */\n  /* necessary such as memory loading of font files.                       */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DLL export compilation                                                */\n  /*                                                                       */\n  /*   When compiling FreeType as a DLL, some systems/compilers need a     */\n  /*   special keyword in front OR after the return type of function       */\n  /*   declarations.                                                       */\n  /*                                                                       */\n  /*   Two macros are used within the FreeType source code to define       */\n  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */\n  /*                                                                       */\n  /*     FT_EXPORT( return_type )                                          */\n  /*                                                                       */\n  /*       is used in a function declaration, as in                        */\n  /*                                                                       */\n  /*         FT_EXPORT( FT_Error )                                         */\n  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */\n  /*                                                                       */\n  /*                                                                       */\n  /*     FT_EXPORT_DEF( return_type )                                      */\n  /*                                                                       */\n  /*       is used in a function definition, as in                         */\n  /*                                                                       */\n  /*         FT_EXPORT_DEF( FT_Error )                                     */\n  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */\n  /*         {                                                             */\n  /*           ... some code ...                                           */\n  /*           return FT_Err_Ok;                                           */\n  /*         }                                                             */\n  /*                                                                       */\n  /*   You can provide your own implementation of FT_EXPORT and            */\n  /*   FT_EXPORT_DEF here if you want.  If you leave them undefined, they  */\n  /*   will be later automatically defined as `extern return_type' to      */\n  /*   allow normal compilation.                                           */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_EXPORT(x)      extern x */\n/* #define FT_EXPORT_DEF(x)  x */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Glyph Postscript Names handling                                       */\n  /*                                                                       */\n  /*   By default, FreeType 2 is compiled with the `psnames' module.  This */\n  /*   module is in charge of converting a glyph name string into a        */\n  /*   Unicode value, or return a Macintosh standard glyph name for the    */\n  /*   use with the TrueType `post' table.                                 */\n  /*                                                                       */\n  /*   Undefine this macro if you do not want `psnames' compiled in your   */\n  /*   build of FreeType.  This has the following effects:                 */\n  /*                                                                       */\n  /*   - The TrueType driver will provide its own set of glyph names,      */\n  /*     if you build it to support postscript names in the TrueType       */\n  /*     `post' table.                                                     */\n  /*                                                                       */\n  /*   - The Type 1 driver will not be able to synthesize a Unicode        */\n  /*     charmap out of the glyphs found in the fonts.                     */\n  /*                                                                       */\n  /*   You would normally undefine this configuration macro when building  */\n  /*   a version of FreeType that doesn't contain a Type 1 or CFF driver.  */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Postscript Names to Unicode Values support                            */\n  /*                                                                       */\n  /*   By default, FreeType 2 is built with the `PSNames' module compiled  */\n  /*   in.  Among other things, the module is used to convert a glyph name */\n  /*   into a Unicode value.  This is especially useful in order to        */\n  /*   synthesize on the fly a Unicode charmap from the CFF/Type 1 driver  */\n  /*   through a big table named the `Adobe Glyph List' (AGL).             */\n  /*                                                                       */\n  /*   Undefine this macro if you do not want the Adobe Glyph List         */\n  /*   compiled in your `PSNames' module.  The Type 1 driver will not be   */\n  /*   able to synthesize a Unicode charmap out of the glyphs found in the */\n  /*   fonts.                                                              */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Support for Mac fonts                                                 */\n  /*                                                                       */\n  /*   Define this macro if you want support for outline fonts in Mac      */\n  /*   format (mac dfont, mac resource, macbinary containing a mac         */\n  /*   resource) on non-Mac platforms.                                     */\n  /*                                                                       */\n  /*   Note that the `FOND' resource isn't checked.                        */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_MAC_FONTS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Guessing methods to access embedded resource forks                    */\n  /*                                                                       */\n  /*   Enable extra Mac fonts support on non-Mac platforms (e.g.           */\n  /*   GNU/Linux).                                                         */\n  /*                                                                       */\n  /*   Resource forks which include fonts data are stored sometimes in     */\n  /*   locations which users or developers don't expected.  In some cases, */\n  /*   resource forks start with some offset from the head of a file.  In  */\n  /*   other cases, the actual resource fork is stored in file different   */\n  /*   from what the user specifies.  If this option is activated,         */\n  /*   FreeType tries to guess whether such offsets or different file      */\n  /*   names must be used.                                                 */\n  /*                                                                       */\n  /*   Note that normal, direct access of resource forks is controlled via */\n  /*   the FT_CONFIG_OPTION_MAC_FONTS option.                              */\n  /*                                                                       */\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Allow the use of FT_Incremental_Interface to load typefaces that      */\n  /* contain no glyph data, but supply it via a callback function.         */\n  /* This is required by clients supporting document formats which         */\n  /* supply font data incrementally as the document is parsed, such        */\n  /* as the Ghostscript interpreter for the PostScript language.           */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_INCREMENTAL\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The size in bytes of the render pool used by the scan-line converter  */\n  /* to do all of its work.                                                */\n  /*                                                                       */\n  /* This must be greater than 4KByte if you use FreeType to rasterize     */\n  /* glyphs; otherwise, you may set it to zero to avoid unnecessary        */\n  /* allocation of the render pool.                                        */\n  /*                                                                       */\n#define FT_RENDER_POOL_SIZE  16384L\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FT_MAX_MODULES                                                        */\n  /*                                                                       */\n  /*   The maximum number of modules that can be registered in a single    */\n  /*   FreeType library object.  32 is the default.                        */\n  /*                                                                       */\n#define FT_MAX_MODULES  32\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Debug level                                                           */\n  /*                                                                       */\n  /*   FreeType can be compiled in debug or trace mode.  In debug mode,    */\n  /*   errors are reported through the `ftdebug' component.  In trace      */\n  /*   mode, additional messages are sent to the standard output during    */\n  /*   execution.                                                          */\n  /*                                                                       */\n  /*   Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode.     */\n  /*   Define FT_DEBUG_LEVEL_TRACE to build it in trace mode.              */\n  /*                                                                       */\n  /*   Don't define any of these macros to compile in `release' mode!      */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_DEBUG_LEVEL_ERROR */\n/* #define FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Autofitter debugging                                                  */\n  /*                                                                       */\n  /*   If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to     */\n  /*   control the autofitter behaviour for debugging purposes with global */\n  /*   boolean variables (consequently, you should *never* enable this     */\n  /*   while compiling in `release' mode):                                 */\n  /*                                                                       */\n  /*     _af_debug_disable_horz_hints                                      */\n  /*     _af_debug_disable_vert_hints                                      */\n  /*     _af_debug_disable_blue_hints                                      */\n  /*                                                                       */\n  /*   Additionally, the following functions provide dumps of various      */\n  /*   internal autofit structures to stdout (using `printf'):             */\n  /*                                                                       */\n  /*     af_glyph_hints_dump_points                                        */\n  /*     af_glyph_hints_dump_segments                                      */\n  /*     af_glyph_hints_dump_edges                                         */\n  /*                                                                       */\n  /*   As an argument, they use another global variable:                   */\n  /*                                                                       */\n  /*     _af_debug_hints                                                   */\n  /*                                                                       */\n  /*   Please have a look at the `ftgrid' demo program to see how those    */\n  /*   variables and macros should be used.                                */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_DEBUG_AUTOFIT */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Memory Debugging                                                      */\n  /*                                                                       */\n  /*   FreeType now comes with an integrated memory debugger that is       */\n  /*   capable of detecting simple errors like memory leaks or double      */\n  /*   deletes.  To compile it within your build of the library, you       */\n  /*   should define FT_DEBUG_MEMORY here.                                 */\n  /*                                                                       */\n  /*   Note that the memory debugger is only activated at runtime when     */\n  /*   when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */\n  /*                                                                       */\n  /*   Do not #undef this macro here since the build system might define   */\n  /*   it for certain configurations only.                                 */\n  /*                                                                       */\n/* #define FT_DEBUG_MEMORY */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Module errors                                                         */\n  /*                                                                       */\n  /*   If this macro is set (which is _not_ the default), the higher byte  */\n  /*   of an error code gives the module in which the error has occurred,  */\n  /*   while the lower byte is the real error code.                        */\n  /*                                                                       */\n  /*   Setting this macro makes sense for debugging purposes only, since   */\n  /*   it would break source compatibility of certain programs that use    */\n  /*   FreeType 2.                                                         */\n  /*                                                                       */\n  /*   More details can be found in the files ftmoderr.h and fterrors.h.   */\n  /*                                                                       */\n#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Position Independent Code                                             */\n  /*                                                                       */\n  /*   If this macro is set (which is _not_ the default), FreeType2 will   */\n  /*   avoid creating constants that require address fixups.  Instead the  */\n  /*   constants will be moved into a struct and additional intialization  */\n  /*   code will be used.                                                  */\n  /*                                                                       */\n  /*   Setting this macro is needed for systems that prohibit address      */\n  /*   fixups, such as BREW.                                               */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****        S F N T   D R I V E R    C O N F I G U R A T I O N       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support       */\n  /* embedded bitmaps in all formats using the SFNT module (namely         */\n  /* TrueType & OpenType).                                                 */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to    */\n  /* load and enumerate the glyph Postscript names in a TrueType or        */\n  /* OpenType file.                                                        */\n  /*                                                                       */\n  /* Note that when you do not compile the `PSNames' module by undefining  */\n  /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will   */\n  /* contain additional code used to read the PS Names table from a font.  */\n  /*                                                                       */\n  /* (By default, the module uses `PSNames' to extract glyph names.)       */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to       */\n  /* access the internal name table in a SFNT-based format like TrueType   */\n  /* or OpenType.  The name table contains various strings used to         */\n  /* describe the font, like family name, copyright, version, etc.  It     */\n  /* does not contain any glyph name though.                               */\n  /*                                                                       */\n  /* Accessing SFNT names is done through the functions declared in        */\n  /* `freetype/ftsnames.h'.                                                */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_SFNT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TrueType CMap support                                                 */\n  /*                                                                       */\n  /*   Here you can fine-tune which TrueType CMap table format shall be    */\n  /*   supported.                                                          */\n#define TT_CONFIG_CMAP_FORMAT_0\n#define TT_CONFIG_CMAP_FORMAT_2\n#define TT_CONFIG_CMAP_FORMAT_4\n#define TT_CONFIG_CMAP_FORMAT_6\n#define TT_CONFIG_CMAP_FORMAT_8\n#define TT_CONFIG_CMAP_FORMAT_10\n#define TT_CONFIG_CMAP_FORMAT_12\n#define TT_CONFIG_CMAP_FORMAT_13\n#define TT_CONFIG_CMAP_FORMAT_14\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****    T R U E T Y P E   D R I V E R    C O N F I G U R A T I O N   ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile   */\n  /* a bytecode interpreter in the TrueType driver.                        */\n  /*                                                                       */\n  /* By undefining this, you will only compile the code necessary to load  */\n  /* TrueType glyphs without hinting.                                      */\n  /*                                                                       */\n  /*   Do not #undef this macro here, since the build system might         */\n  /*   define it for certain configurations only.                          */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile       */\n  /* EXPERIMENTAL subpixel hinting support into the TrueType driver.  This */\n  /* replaces the native TrueType hinting mechanism when anything but      */\n  /* FT_RENDER_MODE_MONO is requested.                                     */\n  /*                                                                       */\n  /* Enabling this causes the TrueType driver to ignore instructions under */\n  /* certain conditions.  This is done in accordance with the guide here,  */\n  /* with some minor differences:                                          */\n  /*                                                                       */\n  /*  http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */\n  /*                                                                       */\n  /* By undefining this, you only compile the code necessary to hint       */\n  /* TrueType glyphs with native TT hinting.                               */\n  /*                                                                       */\n  /*   This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be    */\n  /*   defined.                                                            */\n  /*                                                                       */\n/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */\n  /* of the TrueType bytecode interpreter is used that doesn't implement   */\n  /* any of the patented opcodes and algorithms.  The patents related to   */\n  /* TrueType hinting have expired worldwide since May 2010; this option   */\n  /* is now deprecated.                                                    */\n  /*                                                                       */\n  /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored*  */\n  /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words,  */\n  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */\n  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */\n  /*                                                                       */\n  /* This macro is only useful for a small number of font files (mostly    */\n  /* for Asian scripts) that require bytecode interpretation to properly   */\n  /* load glyphs.  For all other fonts, this produces unpleasant results,  */\n  /* thus the unpatented interpreter is never used to load glyphs from     */\n  /* TrueType fonts unless one of the following two options is used.       */\n  /*                                                                       */\n  /*   - The unpatented interpreter is explicitly activated by the user    */\n  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */\n  /*     when opening the FT_Face.                                         */\n  /*                                                                       */\n  /*   - FreeType detects that the FT_Face corresponds to one of the       */\n  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */\n  /*     contains a hard-coded list of font names and other matching       */\n  /*     parameters (see function `tt_face_init' in file                   */\n  /*     `src/truetype/ttobjs.c').                                         */\n  /*                                                                       */\n  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */\n  /*                                                                       */\n  /*   {                                                                   */\n  /*     FT_Parameter  parameter;                                          */\n  /*     FT_Open_Args  open_args;                                          */\n  /*                                                                       */\n  /*                                                                       */\n  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */\n  /*                                                                       */\n  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */\n  /*     open_args.pathname   = my_font_pathname;                          */\n  /*     open_args.num_params = 1;                                         */\n  /*     open_args.params     = &parameter;                                */\n  /*                                                                       */\n  /*     error = FT_Open_Face( library, &open_args, index, &face );        */\n  /*     ...                                                               */\n  /*   }                                                                   */\n  /*                                                                       */\n/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType    */\n  /* bytecode interpreter with a huge switch statement, rather than a call */\n  /* table.  This results in smaller and faster code for a number of       */\n  /* architectures.                                                        */\n  /*                                                                       */\n  /* Note however that on some compiler/processor combinations, undefining */\n  /* this macro will generate faster, though larger, code.                 */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_INTERPRETER_SWITCH\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the        */\n  /* TrueType glyph loader to use Apple's definition of how to handle      */\n  /* component offsets in composite glyphs.                                */\n  /*                                                                       */\n  /* Apple and MS disagree on the default behavior of component offsets    */\n  /* in composites.  Apple says that they should be scaled by the scaling  */\n  /* factors in the transformation matrix (roughly, it's more complex)     */\n  /* while MS says they should not.  OpenType defines two bits in the      */\n  /* composite flags array which can be used to disambiguate, but old      */\n  /* fonts will not have them.                                             */\n  /*                                                                       */\n  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */\n  /*   http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html                 */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include         */\n  /* support for Apple's distortable font technology (fvar, gvar, cvar,    */\n  /* and avar tables).  This has many similarities to Type 1 Multiple      */\n  /* Masters support.                                                      */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_BDF if you want to include support for        */\n  /* an embedded `BDF ' table within SFNT-based bitmap formats.            */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_BDF\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and       */\n  /* arrays in the Type 1 stream (see t1load.c).  A minimum of 4 is        */\n  /* required.                                                             */\n  /*                                                                       */\n#define T1_MAX_DICT_DEPTH  5\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */\n  /* calls during glyph loading.                                           */\n  /*                                                                       */\n#define T1_MAX_SUBRS_CALLS  16\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */\n  /* minimum of 16 is required.                                            */\n  /*                                                                       */\n  /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */\n  /*                                                                       */\n#define T1_MAX_CHARSTRINGS_OPERANDS  256\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define this configuration macro if you want to prevent the            */\n  /* compilation of `t1afm', which is in charge of reading Type 1 AFM      */\n  /* files into an existing face.  Note that if set, the T1 driver will be */\n  /* unable to produce kerning distances.                                  */\n  /*                                                                       */\n#undef T1_CONFIG_OPTION_NO_AFM\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define this configuration macro if you want to prevent the            */\n  /* compilation of the Multiple Masters font support in the Type 1        */\n  /* driver.                                                               */\n  /*                                                                       */\n#undef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with CJK (Chinese, Japanese, Korean) script    */\n  /* support.                                                              */\n  /*                                                                       */\n#define AF_CONFIG_OPTION_CJK\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with Indic script support.                     */\n  /*                                                                       */\n#define AF_CONFIG_OPTION_INDIC\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with warp hinting.  The idea of the warping    */\n  /* code is to slightly scale and shift a glyph within a single dimension */\n  /* so that as much of its segments are aligned (more or less) on the     */\n  /* grid.  To find out the optimal scaling and shifting value, various    */\n  /* parameter combinations are tried and scored.                          */\n  /*                                                                       */\n  /* This experimental option is only active if the render mode is         */\n  /* FT_RENDER_MODE_LIGHT.                                                 */\n  /*                                                                       */\n/* #define AF_CONFIG_OPTION_USE_WARPER */\n\n  /* */\n\n\n  /*\n   * Define this variable if you want to keep the layout of internal\n   * structures that was used prior to FreeType 2.2.  This also compiles in\n   * a few obsolete functions to avoid linking problems on typical Unix\n   * distributions.\n   *\n   * For embedded systems or building a new distribution from scratch, it\n   * is recommended to disable the macro since it reduces the library's code\n   * size and activates a few memory-saving optimizations as well.\n   */\n/* #define FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*\n   *  To detect legacy cache-lookup call from a rogue client (<= 2.1.7),\n   *  we restrict the number of charmaps in a font.  The current API of\n   *  FTC_CMapCache_Lookup() takes cmap_index & charcode, but old API\n   *  takes charcode only.  To determine the passed value is for cmap_index\n   *  or charcode, the possible cmap_index is restricted not to exceed\n   *  the minimum possible charcode by a rogue client.  It is also very\n   *  unlikely that a rogue client is interested in Unicode values 0 to 15.\n   *\n   *  NOTE: The original threshold was 4 deduced from popular number of\n   *        cmap subtables in UCS-4 TrueType fonts, but now it is not\n   *        irregular for OpenType fonts to have more than 4 subtables,\n   *        because variation selector subtables are available for Apple\n   *        and Microsoft platforms.\n   */\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n#define FT_MAX_CHARMAP_CACHEABLE 15\n#endif\n\n\n  /*\n   * This macro is defined if either unpatented or native TrueType\n   * hinting is requested by the definitions above.\n   */\n#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER\n#define  TT_USE_BYTECODE_INTERPRETER\n#undef   TT_CONFIG_OPTION_UNPATENTED_HINTING\n#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING\n#define  TT_USE_BYTECODE_INTERPRETER\n#endif\n\nFT_END_HEADER\n\n\n#endif /* __FTOPTION_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/config/ftstdlib.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstdlib.h                                                             */\n/*                                                                         */\n/*    ANSI-specific library and header configuration file (specification   */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 2002-2007, 2009, 2011-2012 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to group all #includes to the ANSI C library that   */\n  /* FreeType normally requires.  It also defines macros to rename the     */\n  /* standard functions within the FreeType source code.                   */\n  /*                                                                       */\n  /* Load a file which defines __FTSTDLIB_H__ before this one to override  */\n  /* it.                                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTSTDLIB_H__\n#define __FTSTDLIB_H__\n\n\n#include <stddef.h>\n\n#define ft_ptrdiff_t  ptrdiff_t\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                           integer limits                           */\n  /*                                                                    */\n  /* UINT_MAX and ULONG_MAX are used to automatically compute the size  */\n  /* of `int' and `long' in bytes at compile-time.  So far, this works  */\n  /* for all platforms the library has been tested on.                  */\n  /*                                                                    */\n  /* Note that on the extremely rare platforms that do not provide      */\n  /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some    */\n  /* old Crays where `int' is 36 bits), we do not make any guarantee    */\n  /* about the correct behaviour of FT2 with all fonts.                 */\n  /*                                                                    */\n  /* In these case, `ftconfig.h' will refuse to compile anyway with a   */\n  /* message like `couldn't find 32-bit type' or something similar.     */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#include <limits.h>\n\n#define FT_CHAR_BIT    CHAR_BIT\n#define FT_USHORT_MAX  USHRT_MAX\n#define FT_INT_MAX     INT_MAX\n#define FT_INT_MIN     INT_MIN\n#define FT_UINT_MAX    UINT_MAX\n#define FT_ULONG_MAX   ULONG_MAX\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                 character and string processing                    */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#include <string.h>\n\n#define ft_memchr   memchr\n#define ft_memcmp   memcmp\n#define ft_memcpy   memcpy\n#define ft_memmove  memmove\n#define ft_memset   memset\n#define ft_strcat   strcat\n#define ft_strcmp   strcmp\n#define ft_strcpy   strcpy\n#define ft_strlen   strlen\n#define ft_strncmp  strncmp\n#define ft_strncpy  strncpy\n#define ft_strrchr  strrchr\n#define ft_strstr   strstr\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                           file handling                            */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#include <stdio.h>\n\n#define FT_FILE     FILE\n#define ft_fclose   fclose\n#define ft_fopen    fopen\n#define ft_fread    fread\n#define ft_fseek    fseek\n#define ft_ftell    ftell\n#define ft_sprintf  sprintf\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                             sorting                                */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#include <stdlib.h>\n\n#define ft_qsort  qsort\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                        memory allocation                           */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#define ft_scalloc   calloc\n#define ft_sfree     free\n#define ft_smalloc   malloc\n#define ft_srealloc  realloc\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                          miscellaneous                             */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#define ft_atol   atol\n#define ft_labs   labs\n\n\n  /**********************************************************************/\n  /*                                                                    */\n  /*                         execution control                          */\n  /*                                                                    */\n  /**********************************************************************/\n\n\n#include <setjmp.h>\n\n#define ft_jmp_buf     jmp_buf  /* note: this cannot be a typedef since */\n                                /*       jmp_buf is defined as a macro  */\n                                /*       on certain platforms           */\n\n#define ft_longjmp     longjmp\n#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */\n\n\n  /* the following is only used for debugging purposes, i.e., if */\n  /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined    */\n\n#include <stdarg.h>\n\n\n#endif /* __FTSTDLIB_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/freetype.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  freetype.h                                                             */\n/*                                                                         */\n/*    FreeType high-level API and common types (specification only).       */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FREETYPE_H__\n#define __FREETYPE_H__\n\n\n#ifndef FT_FREETYPE_H\n#error \"`ft2build.h' hasn't been included yet!\"\n#error \"Please always use macros to include FreeType header files.\"\n#error \"Example:\"\n#error \"  #include <ft2build.h>\"\n#error \"  #include FT_FREETYPE_H\"\n#endif\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n#include FT_TYPES_H\n#include FT_ERRORS_H\n\n\nFT_BEGIN_HEADER\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    user_allocation                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    User allocation                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How client applications should allocate FreeType data structures.  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType assumes that structures allocated by the user and passed  */\n  /*    as arguments are zeroed out except for the actual data.  In other  */\n  /*    words, it is recommended to use `calloc' (or variants of it)       */\n  /*    instead of `malloc' for allocation.                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                        B A S I C   T Y P E S                          */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    base_interface                                                     */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Base Interface                                                     */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    The FreeType~2 base font interface.                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section describes the public high-level API of FreeType~2.    */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_Library                                                         */\n  /*    FT_Face                                                            */\n  /*    FT_Size                                                            */\n  /*    FT_GlyphSlot                                                       */\n  /*    FT_CharMap                                                         */\n  /*    FT_Encoding                                                        */\n  /*                                                                       */\n  /*    FT_FaceRec                                                         */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_SCALABLE                                              */\n  /*    FT_FACE_FLAG_FIXED_SIZES                                           */\n  /*    FT_FACE_FLAG_FIXED_WIDTH                                           */\n  /*    FT_FACE_FLAG_HORIZONTAL                                            */\n  /*    FT_FACE_FLAG_VERTICAL                                              */\n  /*    FT_FACE_FLAG_SFNT                                                  */\n  /*    FT_FACE_FLAG_KERNING                                               */\n  /*    FT_FACE_FLAG_MULTIPLE_MASTERS                                      */\n  /*    FT_FACE_FLAG_GLYPH_NAMES                                           */\n  /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */\n  /*    FT_FACE_FLAG_FAST_GLYPHS                                           */\n  /*    FT_FACE_FLAG_HINTER                                                */\n  /*                                                                       */\n  /*    FT_STYLE_FLAG_BOLD                                                 */\n  /*    FT_STYLE_FLAG_ITALIC                                               */\n  /*                                                                       */\n  /*    FT_SizeRec                                                         */\n  /*    FT_Size_Metrics                                                    */\n  /*                                                                       */\n  /*    FT_GlyphSlotRec                                                    */\n  /*    FT_Glyph_Metrics                                                   */\n  /*    FT_SubGlyph                                                        */\n  /*                                                                       */\n  /*    FT_Bitmap_Size                                                     */\n  /*                                                                       */\n  /*    FT_Init_FreeType                                                   */\n  /*    FT_Done_FreeType                                                   */\n  /*                                                                       */\n  /*    FT_New_Face                                                        */\n  /*    FT_Done_Face                                                       */\n  /*    FT_New_Memory_Face                                                 */\n  /*    FT_Open_Face                                                       */\n  /*    FT_Open_Args                                                       */\n  /*    FT_Parameter                                                       */\n  /*    FT_Attach_File                                                     */\n  /*    FT_Attach_Stream                                                   */\n  /*                                                                       */\n  /*    FT_Set_Char_Size                                                   */\n  /*    FT_Set_Pixel_Sizes                                                 */\n  /*    FT_Request_Size                                                    */\n  /*    FT_Select_Size                                                     */\n  /*    FT_Size_Request_Type                                               */\n  /*    FT_Size_Request                                                    */\n  /*    FT_Set_Transform                                                   */\n  /*    FT_Load_Glyph                                                      */\n  /*    FT_Get_Char_Index                                                  */\n  /*    FT_Get_Name_Index                                                  */\n  /*    FT_Load_Char                                                       */\n  /*                                                                       */\n  /*    FT_OPEN_MEMORY                                                     */\n  /*    FT_OPEN_STREAM                                                     */\n  /*    FT_OPEN_PATHNAME                                                   */\n  /*    FT_OPEN_DRIVER                                                     */\n  /*    FT_OPEN_PARAMS                                                     */\n  /*                                                                       */\n  /*    FT_LOAD_DEFAULT                                                    */\n  /*    FT_LOAD_RENDER                                                     */\n  /*    FT_LOAD_MONOCHROME                                                 */\n  /*    FT_LOAD_LINEAR_DESIGN                                              */\n  /*    FT_LOAD_NO_SCALE                                                   */\n  /*    FT_LOAD_NO_HINTING                                                 */\n  /*    FT_LOAD_NO_BITMAP                                                  */\n  /*    FT_LOAD_CROP_BITMAP                                                */\n  /*                                                                       */\n  /*    FT_LOAD_VERTICAL_LAYOUT                                            */\n  /*    FT_LOAD_IGNORE_TRANSFORM                                           */\n  /*    FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH                                */\n  /*    FT_LOAD_FORCE_AUTOHINT                                             */\n  /*    FT_LOAD_NO_RECURSE                                                 */\n  /*    FT_LOAD_PEDANTIC                                                   */\n  /*                                                                       */\n  /*    FT_LOAD_TARGET_NORMAL                                              */\n  /*    FT_LOAD_TARGET_LIGHT                                               */\n  /*    FT_LOAD_TARGET_MONO                                                */\n  /*    FT_LOAD_TARGET_LCD                                                 */\n  /*    FT_LOAD_TARGET_LCD_V                                               */\n  /*                                                                       */\n  /*    FT_Render_Glyph                                                    */\n  /*    FT_Render_Mode                                                     */\n  /*    FT_Get_Kerning                                                     */\n  /*    FT_Kerning_Mode                                                    */\n  /*    FT_Get_Track_Kerning                                               */\n  /*    FT_Get_Glyph_Name                                                  */\n  /*    FT_Get_Postscript_Name                                             */\n  /*                                                                       */\n  /*    FT_CharMapRec                                                      */\n  /*    FT_Select_Charmap                                                  */\n  /*    FT_Set_Charmap                                                     */\n  /*    FT_Get_Charmap_Index                                               */\n  /*                                                                       */\n  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING                                    */\n  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING                             */\n  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING                              */\n  /*    FT_FSTYPE_EDITABLE_EMBEDDING                                       */\n  /*    FT_FSTYPE_NO_SUBSETTING                                            */\n  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY                                    */\n  /*                                                                       */\n  /*    FT_Get_FSType_Flags                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Glyph_Metrics                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the metrics of a single glyph.  The      */\n  /*    values are expressed in 26.6 fractional pixel format; if the flag  */\n  /*    @FT_LOAD_NO_SCALE has been used while loading the glyph, values    */\n  /*    are expressed in font units instead.                               */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    width ::                                                           */\n  /*      The glyph's width.                                               */\n  /*                                                                       */\n  /*    height ::                                                          */\n  /*      The glyph's height.                                              */\n  /*                                                                       */\n  /*    horiBearingX ::                                                    */\n  /*      Left side bearing for horizontal layout.                         */\n  /*                                                                       */\n  /*    horiBearingY ::                                                    */\n  /*      Top side bearing for horizontal layout.                          */\n  /*                                                                       */\n  /*    horiAdvance ::                                                     */\n  /*      Advance width for horizontal layout.                             */\n  /*                                                                       */\n  /*    vertBearingX ::                                                    */\n  /*      Left side bearing for vertical layout.                           */\n  /*                                                                       */\n  /*    vertBearingY ::                                                    */\n  /*      Top side bearing for vertical layout.  Larger positive values    */\n  /*      mean further below the vertical glyph origin.                    */\n  /*                                                                       */\n  /*    vertAdvance ::                                                     */\n  /*      Advance height for vertical layout.  Positive values mean the    */\n  /*      glyph has a positive advance downward.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If not disabled with @FT_LOAD_NO_HINTING, the values represent     */\n  /*    dimensions of the hinted glyph (in case hinting is applicable).    */\n  /*                                                                       */\n  /*    Stroking a glyph with an outside border does not increase          */\n  /*    `horiAdvance' or `vertAdvance'; you have to manually adjust these  */\n  /*    values to account for the added width and height.                  */\n  /*                                                                       */\n  typedef struct  FT_Glyph_Metrics_\n  {\n    FT_Pos  width;\n    FT_Pos  height;\n\n    FT_Pos  horiBearingX;\n    FT_Pos  horiBearingY;\n    FT_Pos  horiAdvance;\n\n    FT_Pos  vertBearingX;\n    FT_Pos  vertBearingY;\n    FT_Pos  vertAdvance;\n\n  } FT_Glyph_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Bitmap_Size                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure models the metrics of a bitmap strike (i.e., a set  */\n  /*    of glyphs for a given point size and resolution) in a bitmap font. */\n  /*    It is used for the `available_sizes' field of @FT_Face.            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    height :: The vertical distance, in pixels, between two            */\n  /*              consecutive baselines.  It is always positive.           */\n  /*                                                                       */\n  /*    width  :: The average width, in pixels, of all glyphs in the       */\n  /*              strike.                                                  */\n  /*                                                                       */\n  /*    size   :: The nominal size of the strike in 26.6 fractional        */\n  /*              points.  This field is not very useful.                  */\n  /*                                                                       */\n  /*    x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional   */\n  /*              pixels.                                                  */\n  /*                                                                       */\n  /*    y_ppem :: The vertical ppem (nominal height) in 26.6 fractional    */\n  /*              pixels.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Windows FNT:                                                       */\n  /*      The nominal size given in a FNT font is not reliable.  Thus when */\n  /*      the driver finds it incorrect, it sets `size' to some calculated */\n  /*      values and sets `x_ppem' and `y_ppem' to the pixel width and     */\n  /*      height given in the font, respectively.                          */\n  /*                                                                       */\n  /*    TrueType embedded bitmaps:                                         */\n  /*      `size', `width', and `height' values are not contained in the    */\n  /*      bitmap strike itself.  They are computed from the global font    */\n  /*      parameters.                                                      */\n  /*                                                                       */\n  typedef struct  FT_Bitmap_Size_\n  {\n    FT_Short  height;\n    FT_Short  width;\n\n    FT_Pos    size;\n\n    FT_Pos    x_ppem;\n    FT_Pos    y_ppem;\n\n  } FT_Bitmap_Size;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                     O B J E C T   C L A S S E S                       */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Library                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a FreeType library instance.  Each `library' is        */\n  /*    completely independent from the others; it is the `root' of a set  */\n  /*    of objects like fonts, faces, sizes, etc.                          */\n  /*                                                                       */\n  /*    It also embeds a memory manager (see @FT_Memory), as well as a     */\n  /*    scan-line converter object (see @FT_Raster).                       */\n  /*                                                                       */\n  /*    For multi-threading applications each thread should have its own   */\n  /*    FT_Library object.                                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Library objects are normally created by @FT_Init_FreeType, and     */\n  /*    destroyed with @FT_Done_FreeType.                                  */\n  /*                                                                       */\n  typedef struct FT_LibraryRec_  *FT_Library;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Module                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given FreeType module object.  Each module can be a  */\n  /*    font driver, a renderer, or anything else that provides services   */\n  /*    to the formers.                                                    */\n  /*                                                                       */\n  typedef struct FT_ModuleRec_*  FT_Module;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Driver                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given FreeType font driver object.  Each font driver */\n  /*    is a special module capable of creating faces from font files.     */\n  /*                                                                       */\n  typedef struct FT_DriverRec_*  FT_Driver;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Renderer                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given FreeType renderer.  A renderer is a special    */\n  /*    module in charge of converting a glyph image to a bitmap, when     */\n  /*    necessary.  Each renderer supports a given glyph image format, and */\n  /*    one or more target surface depths.                                 */\n  /*                                                                       */\n  typedef struct FT_RendererRec_*  FT_Renderer;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Face                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given typographic face object.  A face object models */\n  /*    a given typeface, in a given style.                                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Each face object also owns a single @FT_GlyphSlot object, as well  */\n  /*    as one or more @FT_Size objects.                                   */\n  /*                                                                       */\n  /*    Use @FT_New_Face or @FT_Open_Face to create a new face object from */\n  /*    a given filepathname or a custom input stream.                     */\n  /*                                                                       */\n  /*    Use @FT_Done_Face to destroy it (along with its slot and sizes).   */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_FaceRec for the publicly accessible fields of a given face */\n  /*    object.                                                            */\n  /*                                                                       */\n  typedef struct FT_FaceRec_*  FT_Face;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Size                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an object used to model a face scaled to a given       */\n  /*    character size.                                                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Each @FT_Face has an _active_ @FT_Size object that is used by      */\n  /*    functions like @FT_Load_Glyph to determine the scaling             */\n  /*    transformation which is used to load and hint glyphs and metrics.  */\n  /*                                                                       */\n  /*    You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes,                */\n  /*    @FT_Request_Size or even @FT_Select_Size to change the content     */\n  /*    (i.e., the scaling values) of the active @FT_Size.                 */\n  /*                                                                       */\n  /*    You can use @FT_New_Size to create additional size objects for a   */\n  /*    given @FT_Face, but they won't be used by other functions until    */\n  /*    you activate it through @FT_Activate_Size.  Only one size can be   */\n  /*    activated at any given time per face.                              */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_SizeRec for the publicly accessible fields of a given size */\n  /*    object.                                                            */\n  /*                                                                       */\n  typedef struct FT_SizeRec_*  FT_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_GlyphSlot                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given `glyph slot'.  A slot is a container where it  */\n  /*    is possible to load any of the glyphs contained in its parent      */\n  /*    face.                                                              */\n  /*                                                                       */\n  /*    In other words, each time you call @FT_Load_Glyph or               */\n  /*    @FT_Load_Char, the slot's content is erased by the new glyph data, */\n  /*    i.e., the glyph's metrics, its image (bitmap or outline), and      */\n  /*    other control information.                                         */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_GlyphSlotRec for the publicly accessible glyph fields.     */\n  /*                                                                       */\n  typedef struct FT_GlyphSlotRec_*  FT_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_CharMap                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a given character map.  A charmap is used to translate */\n  /*    character codes in a given encoding into glyph indexes for its     */\n  /*    parent's face.  Some font formats may provide several charmaps per */\n  /*    font.                                                              */\n  /*                                                                       */\n  /*    Each face object owns zero or more charmaps, but only one of them  */\n  /*    can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char.   */\n  /*                                                                       */\n  /*    The list of available charmaps in a face is available through the  */\n  /*    `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec.   */\n  /*                                                                       */\n  /*    The currently active charmap is available as `face->charmap'.      */\n  /*    You should call @FT_Set_Charmap to change it.                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    When a new face is created (either through @FT_New_Face or         */\n  /*    @FT_Open_Face), the library looks for a Unicode charmap within     */\n  /*    the list and automatically activates it.                           */\n  /*                                                                       */\n  /* <Also>                                                                */\n  /*    See @FT_CharMapRec for the publicly accessible fields of a given   */\n  /*    character map.                                                     */\n  /*                                                                       */\n  typedef struct FT_CharMapRec_*  FT_CharMap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_ENC_TAG                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro converts four-letter tags into an unsigned long.  It is */\n  /*    used to define `encoding' identifiers (see @FT_Encoding).          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */\n  /*    should redefine this macro in case of problems to something like   */\n  /*    this:                                                              */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      #define FT_ENC_TAG( value, a, b, c, d )  value                   */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    to get a simple enumeration without assigning special numbers.     */\n  /*                                                                       */\n\n#ifndef FT_ENC_TAG\n#define FT_ENC_TAG( value, a, b, c, d )         \\\n          value = ( ( (FT_UInt32)(a) << 24 ) |  \\\n                    ( (FT_UInt32)(b) << 16 ) |  \\\n                    ( (FT_UInt32)(c) <<  8 ) |  \\\n                      (FT_UInt32)(d)         )\n\n#endif /* FT_ENC_TAG */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Encoding                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used to specify character sets supported by         */\n  /*    charmaps.  Used in the @FT_Select_Charmap API function.            */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Despite the name, this enumeration lists specific character        */\n  /*    repertories (i.e., charsets), and not text encoding methods (e.g., */\n  /*    UTF-8, UTF-16, etc.).                                              */\n  /*                                                                       */\n  /*    Other encodings might be defined in the future.                    */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_ENCODING_NONE ::                                                */\n  /*      The encoding value~0 is reserved.                                */\n  /*                                                                       */\n  /*    FT_ENCODING_UNICODE ::                                             */\n  /*      Corresponds to the Unicode character set.  This value covers     */\n  /*      all versions of the Unicode repertoire, including ASCII and      */\n  /*      Latin-1.  Most fonts include a Unicode charmap, but not all      */\n  /*      of them.                                                         */\n  /*                                                                       */\n  /*      For example, if you want to access Unicode value U+1F028 (and    */\n  /*      the font contains it), use value 0x1F028 as the input value for  */\n  /*      @FT_Get_Char_Index.                                              */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_SYMBOL ::                                           */\n  /*      Corresponds to the Microsoft Symbol encoding, used to encode     */\n  /*      mathematical symbols in the 32..255 character code range.  For   */\n  /*      more information, see `http://www.ceviz.net/symbol.htm'.         */\n  /*                                                                       */\n  /*    FT_ENCODING_SJIS ::                                                */\n  /*      Corresponds to Japanese SJIS encoding.  More info at             */\n  /*      at `http://langsupport.japanreference.com/encoding.shtml'.       */\n  /*      See note on multi-byte encodings below.                          */\n  /*                                                                       */\n  /*    FT_ENCODING_GB2312 ::                                              */\n  /*      Corresponds to an encoding system for Simplified Chinese as used */\n  /*      used in mainland China.                                          */\n  /*                                                                       */\n  /*    FT_ENCODING_BIG5 ::                                                */\n  /*      Corresponds to an encoding system for Traditional Chinese as     */\n  /*      used in Taiwan and Hong Kong.                                    */\n  /*                                                                       */\n  /*    FT_ENCODING_WANSUNG ::                                             */\n  /*      Corresponds to the Korean encoding system known as Wansung.      */\n  /*      For more information see                                         */\n  /*      `http://www.microsoft.com/typography/unicode/949.txt'.           */\n  /*                                                                       */\n  /*    FT_ENCODING_JOHAB ::                                               */\n  /*      The Korean standard character set (KS~C 5601-1992), which        */\n  /*      corresponds to MS Windows code page 1361.  This character set    */\n  /*      includes all possible Hangeul character combinations.            */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_LATIN_1 ::                                       */\n  /*      Corresponds to a Latin-1 encoding as defined in a Type~1         */\n  /*      PostScript font.  It is limited to 256 character codes.          */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_STANDARD ::                                      */\n  /*      Corresponds to the Adobe Standard encoding, as found in Type~1,  */\n  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */\n  /*      codes.                                                           */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_EXPERT ::                                        */\n  /*      Corresponds to the Adobe Expert encoding, as found in Type~1,    */\n  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */\n  /*      codes.                                                           */\n  /*                                                                       */\n  /*    FT_ENCODING_ADOBE_CUSTOM ::                                        */\n  /*      Corresponds to a custom encoding, as found in Type~1, CFF, and   */\n  /*      OpenType/CFF fonts.  It is limited to 256 character codes.       */\n  /*                                                                       */\n  /*    FT_ENCODING_APPLE_ROMAN ::                                         */\n  /*      Corresponds to the 8-bit Apple roman encoding.  Many TrueType    */\n  /*      and OpenType fonts contain a charmap for this encoding, since    */\n  /*      older versions of Mac OS are able to use it.                     */\n  /*                                                                       */\n  /*    FT_ENCODING_OLD_LATIN_2 ::                                         */\n  /*      This value is deprecated and was never used nor reported by      */\n  /*      FreeType.  Don't use or test for it.                             */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_SJIS ::                                             */\n  /*      Same as FT_ENCODING_SJIS.  Deprecated.                           */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_GB2312 ::                                           */\n  /*      Same as FT_ENCODING_GB2312.  Deprecated.                         */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_BIG5 ::                                             */\n  /*      Same as FT_ENCODING_BIG5.  Deprecated.                           */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_WANSUNG ::                                          */\n  /*      Same as FT_ENCODING_WANSUNG.  Deprecated.                        */\n  /*                                                                       */\n  /*    FT_ENCODING_MS_JOHAB ::                                            */\n  /*      Same as FT_ENCODING_JOHAB.  Deprecated.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    By default, FreeType automatically synthesizes a Unicode charmap   */\n  /*    for PostScript fonts, using their glyph names dictionaries.        */\n  /*    However, it also reports the encodings defined explicitly in the   */\n  /*    font file, for the cases when they are needed, with the Adobe      */\n  /*    values as well.                                                    */\n  /*                                                                       */\n  /*    FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap  */\n  /*    is neither Unicode nor ISO-8859-1 (otherwise it is set to          */\n  /*    FT_ENCODING_UNICODE).  Use @FT_Get_BDF_Charset_ID to find out      */\n  /*    which encoding is really present.  If, for example, the            */\n  /*    `cs_registry' field is `KOI8' and the `cs_encoding' field is `R',  */\n  /*    the font is encoded in KOI8-R.                                     */\n  /*                                                                       */\n  /*    FT_ENCODING_NONE is always set (with a single exception) by the    */\n  /*    winfonts driver.  Use @FT_Get_WinFNT_Header and examine the        */\n  /*    `charset' field of the @FT_WinFNT_HeaderRec structure to find out  */\n  /*    which encoding is really present.  For example,                    */\n  /*    @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for       */\n  /*    Russian).                                                          */\n  /*                                                                       */\n  /*    FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */\n  /*    and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to  */\n  /*    FT_ENCODING_APPLE_ROMAN).                                          */\n  /*                                                                       */\n  /*    If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function       */\n  /*    @FT_Get_CMap_Language_ID  to query the Mac language ID which may   */\n  /*    be needed to be able to distinguish Apple encoding variants.  See  */\n  /*                                                                       */\n  /*      http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT  */\n  /*                                                                       */\n  /*    to get an idea how to do that.  Basically, if the language ID      */\n  /*    is~0, don't use it, otherwise subtract 1 from the language ID.     */\n  /*    Then examine `encoding_id'.  If, for example, `encoding_id' is     */\n  /*    @TT_MAC_ID_ROMAN and the language ID (minus~1) is                  */\n  /*    `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman.        */\n  /*    @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi       */\n  /*    variant the Arabic encoding.                                       */\n  /*                                                                       */\n  typedef enum  FT_Encoding_\n  {\n    FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),\n\n    FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),\n    FT_ENC_TAG( FT_ENCODING_UNICODE,   'u', 'n', 'i', 'c' ),\n\n    FT_ENC_TAG( FT_ENCODING_SJIS,    's', 'j', 'i', 's' ),\n    FT_ENC_TAG( FT_ENCODING_GB2312,  'g', 'b', ' ', ' ' ),\n    FT_ENC_TAG( FT_ENCODING_BIG5,    'b', 'i', 'g', '5' ),\n    FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),\n    FT_ENC_TAG( FT_ENCODING_JOHAB,   'j', 'o', 'h', 'a' ),\n\n    /* for backwards compatibility */\n    FT_ENCODING_MS_SJIS    = FT_ENCODING_SJIS,\n    FT_ENCODING_MS_GB2312  = FT_ENCODING_GB2312,\n    FT_ENCODING_MS_BIG5    = FT_ENCODING_BIG5,\n    FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,\n    FT_ENCODING_MS_JOHAB   = FT_ENCODING_JOHAB,\n\n    FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),\n    FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT,   'A', 'D', 'B', 'E' ),\n    FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM,   'A', 'D', 'B', 'C' ),\n    FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1,  'l', 'a', 't', '1' ),\n\n    FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),\n\n    FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )\n\n  } FT_Encoding;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_encoding_xxx                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    These constants are deprecated; use the corresponding @FT_Encoding */\n  /*    values instead.                                                    */\n  /*                                                                       */\n#define ft_encoding_none            FT_ENCODING_NONE\n#define ft_encoding_unicode         FT_ENCODING_UNICODE\n#define ft_encoding_symbol          FT_ENCODING_MS_SYMBOL\n#define ft_encoding_latin_1         FT_ENCODING_ADOBE_LATIN_1\n#define ft_encoding_latin_2         FT_ENCODING_OLD_LATIN_2\n#define ft_encoding_sjis            FT_ENCODING_SJIS\n#define ft_encoding_gb2312          FT_ENCODING_GB2312\n#define ft_encoding_big5            FT_ENCODING_BIG5\n#define ft_encoding_wansung         FT_ENCODING_WANSUNG\n#define ft_encoding_johab           FT_ENCODING_JOHAB\n\n#define ft_encoding_adobe_standard  FT_ENCODING_ADOBE_STANDARD\n#define ft_encoding_adobe_expert    FT_ENCODING_ADOBE_EXPERT\n#define ft_encoding_adobe_custom    FT_ENCODING_ADOBE_CUSTOM\n#define ft_encoding_apple_roman     FT_ENCODING_APPLE_ROMAN\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_CharMapRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The base charmap structure.                                        */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face        :: A handle to the parent face object.                 */\n  /*                                                                       */\n  /*    encoding    :: An @FT_Encoding tag identifying the charmap.  Use   */\n  /*                   this with @FT_Select_Charmap.                       */\n  /*                                                                       */\n  /*    platform_id :: An ID number describing the platform for the        */\n  /*                   following encoding ID.  This comes directly from    */\n  /*                   the TrueType specification and should be emulated   */\n  /*                   for other formats.                                  */\n  /*                                                                       */\n  /*    encoding_id :: A platform specific encoding number.  This also     */\n  /*                   comes from the TrueType specification and should be */\n  /*                   emulated similarly.                                 */\n  /*                                                                       */\n  typedef struct  FT_CharMapRec_\n  {\n    FT_Face      face;\n    FT_Encoding  encoding;\n    FT_UShort    platform_id;\n    FT_UShort    encoding_id;\n\n  } FT_CharMapRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                 B A S E   O B J E C T   C L A S S E S                 */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Face_Internal                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to an `FT_Face_InternalRec' structure, used to    */\n  /*    model private data of a given @FT_Face object.                     */\n  /*                                                                       */\n  /*    This structure might change between releases of FreeType~2 and is  */\n  /*    not generally available to client applications.                    */\n  /*                                                                       */\n  typedef struct FT_Face_InternalRec_*  FT_Face_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_FaceRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType root face class structure.  A face object models a        */\n  /*    typeface in a font file.                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_faces           :: The number of faces in the font file.  Some */\n  /*                           font formats can have multiple faces in     */\n  /*                           a font file.                                */\n  /*                                                                       */\n  /*    face_index          :: The index of the face in the font file.  It */\n  /*                           is set to~0 if there is only one face in    */\n  /*                           the font file.                              */\n  /*                                                                       */\n  /*    face_flags          :: A set of bit flags that give important      */\n  /*                           information about the face; see             */\n  /*                           @FT_FACE_FLAG_XXX for the details.          */\n  /*                                                                       */\n  /*    style_flags         :: A set of bit flags indicating the style of  */\n  /*                           the face; see @FT_STYLE_FLAG_XXX for the    */\n  /*                           details.                                    */\n  /*                                                                       */\n  /*    num_glyphs          :: The number of glyphs in the face.  If the   */\n  /*                           face is scalable and has sbits (see         */\n  /*                           `num_fixed_sizes'), it is set to the number */\n  /*                           of outline glyphs.                          */\n  /*                                                                       */\n  /*                           For CID-keyed fonts, this value gives the   */\n  /*                           highest CID used in the font.               */\n  /*                                                                       */\n  /*    family_name         :: The face's family name.  This is an ASCII   */\n  /*                           string, usually in English, which describes */\n  /*                           the typeface's family (like `Times New      */\n  /*                           Roman', `Bodoni', `Garamond', etc).  This   */\n  /*                           is a least common denominator used to list  */\n  /*                           fonts.  Some formats (TrueType & OpenType)  */\n  /*                           provide localized and Unicode versions of   */\n  /*                           this string.  Applications should use the   */\n  /*                           format specific interface to access them.   */\n  /*                           Can be NULL (e.g., in fonts embedded in a   */\n  /*                           PDF file).                                  */\n  /*                                                                       */\n  /*    style_name          :: The face's style name.  This is an ASCII    */\n  /*                           string, usually in English, which describes */\n  /*                           the typeface's style (like `Italic',        */\n  /*                           `Bold', `Condensed', etc).  Not all font    */\n  /*                           formats provide a style name, so this field */\n  /*                           is optional, and can be set to NULL.  As    */\n  /*                           for `family_name', some formats provide     */\n  /*                           localized and Unicode versions of this      */\n  /*                           string.  Applications should use the format */\n  /*                           specific interface to access them.          */\n  /*                                                                       */\n  /*    num_fixed_sizes     :: The number of bitmap strikes in the face.   */\n  /*                           Even if the face is scalable, there might   */\n  /*                           still be bitmap strikes, which are called   */\n  /*                           `sbits' in that case.                       */\n  /*                                                                       */\n  /*    available_sizes     :: An array of @FT_Bitmap_Size for all bitmap  */\n  /*                           strikes in the face.  It is set to NULL if  */\n  /*                           there is no bitmap strike.                  */\n  /*                                                                       */\n  /*    num_charmaps        :: The number of charmaps in the face.         */\n  /*                                                                       */\n  /*    charmaps            :: An array of the charmaps of the face.       */\n  /*                                                                       */\n  /*    generic             :: A field reserved for client uses.  See the  */\n  /*                           @FT_Generic type description.               */\n  /*                                                                       */\n  /*    bbox                :: The font bounding box.  Coordinates are     */\n  /*                           expressed in font units (see                */\n  /*                           `units_per_EM').  The box is large enough   */\n  /*                           to contain any glyph from the font.  Thus,  */\n  /*                           `bbox.yMax' can be seen as the `maximum     */\n  /*                           ascender', and `bbox.yMin' as the `minimum  */\n  /*                           descender'.  Only relevant for scalable     */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*                           Note that the bounding box might be off by  */\n  /*                           (at least) one pixel for hinted fonts.  See */\n  /*                           @FT_Size_Metrics for further discussion.    */\n  /*                                                                       */\n  /*    units_per_EM        :: The number of font units per EM square for  */\n  /*                           this face.  This is typically 2048 for      */\n  /*                           TrueType fonts, and 1000 for Type~1 fonts.  */\n  /*                           Only relevant for scalable formats.         */\n  /*                                                                       */\n  /*    ascender            :: The typographic ascender of the face,       */\n  /*                           expressed in font units.  For font formats  */\n  /*                           not having this information, it is set to   */\n  /*                           `bbox.yMax'.  Only relevant for scalable    */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*    descender           :: The typographic descender of the face,      */\n  /*                           expressed in font units.  For font formats  */\n  /*                           not having this information, it is set to   */\n  /*                           `bbox.yMin'.  Note that this field is       */\n  /*                           usually negative.  Only relevant for        */\n  /*                           scalable formats.                           */\n  /*                                                                       */\n  /*    height              :: This value is the vertical distance         */\n  /*                           between two consecutive baselines,          */\n  /*                           expressed in font units.  It is always      */\n  /*                           positive.  Only relevant for scalable       */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*                           If you want the global glyph height, use    */\n  /*                           `ascender - descender'.                     */\n  /*                                                                       */\n  /*    max_advance_width   :: The maximum advance width, in font units,   */\n  /*                           for all glyphs in this face.  This can be   */\n  /*                           used to make word wrapping computations     */\n  /*                           faster.  Only relevant for scalable         */\n  /*                           formats.                                    */\n  /*                                                                       */\n  /*    max_advance_height  :: The maximum advance height, in font units,  */\n  /*                           for all glyphs in this face.  This is only  */\n  /*                           relevant for vertical layouts, and is set   */\n  /*                           to `height' for fonts that do not provide   */\n  /*                           vertical metrics.  Only relevant for        */\n  /*                           scalable formats.                           */\n  /*                                                                       */\n  /*    underline_position  :: The position, in font units, of the         */\n  /*                           underline line for this face.  It is the    */\n  /*                           center of the underlining stem.  Only       */\n  /*                           relevant for scalable formats.              */\n  /*                                                                       */\n  /*    underline_thickness :: The thickness, in font units, of the        */\n  /*                           underline for this face.  Only relevant for */\n  /*                           scalable formats.                           */\n  /*                                                                       */\n  /*    glyph               :: The face's associated glyph slot(s).        */\n  /*                                                                       */\n  /*    size                :: The current active size for this face.      */\n  /*                                                                       */\n  /*    charmap             :: The current active charmap for this face.   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Fields may be changed after a call to @FT_Attach_File or           */\n  /*    @FT_Attach_Stream.                                                 */\n  /*                                                                       */\n  typedef struct  FT_FaceRec_\n  {\n    FT_Long           num_faces;\n    FT_Long           face_index;\n\n    FT_Long           face_flags;\n    FT_Long           style_flags;\n\n    FT_Long           num_glyphs;\n\n    FT_String*        family_name;\n    FT_String*        style_name;\n\n    FT_Int            num_fixed_sizes;\n    FT_Bitmap_Size*   available_sizes;\n\n    FT_Int            num_charmaps;\n    FT_CharMap*       charmaps;\n\n    FT_Generic        generic;\n\n    /*# The following member variables (down to `underline_thickness') */\n    /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size    */\n    /*# for bitmap fonts.                                              */\n    FT_BBox           bbox;\n\n    FT_UShort         units_per_EM;\n    FT_Short          ascender;\n    FT_Short          descender;\n    FT_Short          height;\n\n    FT_Short          max_advance_width;\n    FT_Short          max_advance_height;\n\n    FT_Short          underline_position;\n    FT_Short          underline_thickness;\n\n    FT_GlyphSlot      glyph;\n    FT_Size           size;\n    FT_CharMap        charmap;\n\n    /*@private begin */\n\n    FT_Driver         driver;\n    FT_Memory         memory;\n    FT_Stream         stream;\n\n    FT_ListRec        sizes_list;\n\n    FT_Generic        autohint;   /* face-specific auto-hinter data */\n    void*             extensions; /* unused                         */\n\n    FT_Face_Internal  internal;\n\n    /*@private end */\n\n  } FT_FaceRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_FACE_FLAG_XXX                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit flags used in the `face_flags' field of the          */\n  /*    @FT_FaceRec structure.  They inform client applications of         */\n  /*    properties of the corresponding face.                              */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_FACE_FLAG_SCALABLE ::                                           */\n  /*      Indicates that the face contains outline glyphs.  This doesn't   */\n  /*      prevent bitmap strikes, i.e., a face can have both this and      */\n  /*      and @FT_FACE_FLAG_FIXED_SIZES set.                               */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_FIXED_SIZES ::                                        */\n  /*      Indicates that the face contains bitmap strikes.  See also the   */\n  /*      `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec.   */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_FIXED_WIDTH ::                                        */\n  /*      Indicates that the face contains fixed-width characters (like    */\n  /*      Courier, Lucido, MonoType, etc.).                                */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_SFNT ::                                               */\n  /*      Indicates that the face uses the `sfnt' storage scheme.  For     */\n  /*      now, this means TrueType and OpenType.                           */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_HORIZONTAL ::                                         */\n  /*      Indicates that the face contains horizontal glyph metrics.  This */\n  /*      should be set for all common formats.                            */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_VERTICAL ::                                           */\n  /*      Indicates that the face contains vertical glyph metrics.  This   */\n  /*      is only available in some formats, not all of them.              */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_KERNING ::                                            */\n  /*      Indicates that the face contains kerning information.  If set,   */\n  /*      the kerning distance can be retrieved through the function       */\n  /*      @FT_Get_Kerning.  Otherwise the function always return the       */\n  /*      vector (0,0).  Note that FreeType doesn't handle kerning data    */\n  /*      from the `GPOS' table (as present in some OpenType fonts).       */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_FAST_GLYPHS ::                                        */\n  /*      THIS FLAG IS DEPRECATED.  DO NOT USE OR TEST IT.                 */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_MULTIPLE_MASTERS ::                                   */\n  /*      Indicates that the font contains multiple masters and is capable */\n  /*      of interpolating between them.  See the multiple-masters         */\n  /*      specific API for details.                                        */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_GLYPH_NAMES ::                                        */\n  /*      Indicates that the font contains glyph names that can be         */\n  /*      retrieved through @FT_Get_Glyph_Name.  Note that some TrueType   */\n  /*      fonts contain broken glyph name tables.  Use the function        */\n  /*      @FT_Has_PS_Glyph_Names when needed.                              */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_EXTERNAL_STREAM ::                                    */\n  /*      Used internally by FreeType to indicate that a face's stream was */\n  /*      provided by the client application and should not be destroyed   */\n  /*      when @FT_Done_Face is called.  Don't read or test this flag.     */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_HINTER ::                                             */\n  /*      Set if the font driver has a hinting machine of its own.  For    */\n  /*      example, with TrueType fonts, it makes sense to use data from    */\n  /*      the SFNT `gasp' table only if the native TrueType hinting engine */\n  /*      (with the bytecode interpreter) is available and active.         */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_CID_KEYED ::                                          */\n  /*      Set if the font is CID-keyed.  In that case, the font is not     */\n  /*      accessed by glyph indices but by CID values.  For subsetted      */\n  /*      CID-keyed fonts this has the consequence that not all index      */\n  /*      values are a valid argument to FT_Load_Glyph.  Only the CID      */\n  /*      values for which corresponding glyphs in the subsetted font      */\n  /*      exist make FT_Load_Glyph return successfully; in all other cases */\n  /*      you get an `FT_Err_Invalid_Argument' error.                      */\n  /*                                                                       */\n  /*      Note that CID-keyed fonts which are in an SFNT wrapper don't     */\n  /*      have this flag set since the glyphs are accessed in the normal   */\n  /*      way (using contiguous indices); the `CID-ness' isn't visible to  */\n  /*      the application.                                                 */\n  /*                                                                       */\n  /*    FT_FACE_FLAG_TRICKY ::                                             */\n  /*      Set if the font is `tricky', this is, it always needs the        */\n  /*      font format's native hinting engine to get a reasonable result.  */\n  /*      A typical example is the Chinese font `mingli.ttf' which uses    */\n  /*      TrueType bytecode instructions to move and scale all of its      */\n  /*      subglyphs.                                                       */\n  /*                                                                       */\n  /*      It is not possible to autohint such fonts using                  */\n  /*      @FT_LOAD_FORCE_AUTOHINT; it will also ignore                     */\n  /*      @FT_LOAD_NO_HINTING.  You have to set both @FT_LOAD_NO_HINTING   */\n  /*      and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */\n  /*      probably never want this except for demonstration purposes.      */\n  /*                                                                       */\n  /*      Currently, there are about a dozen TrueType fonts in the list of */\n  /*      tricky fonts; they are hard-coded in file `ttobjs.c'.            */\n  /*                                                                       */\n#define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )\n#define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )\n#define FT_FACE_FLAG_FIXED_WIDTH       ( 1L <<  2 )\n#define FT_FACE_FLAG_SFNT              ( 1L <<  3 )\n#define FT_FACE_FLAG_HORIZONTAL        ( 1L <<  4 )\n#define FT_FACE_FLAG_VERTICAL          ( 1L <<  5 )\n#define FT_FACE_FLAG_KERNING           ( 1L <<  6 )\n#define FT_FACE_FLAG_FAST_GLYPHS       ( 1L <<  7 )\n#define FT_FACE_FLAG_MULTIPLE_MASTERS  ( 1L <<  8 )\n#define FT_FACE_FLAG_GLYPH_NAMES       ( 1L <<  9 )\n#define FT_FACE_FLAG_EXTERNAL_STREAM   ( 1L << 10 )\n#define FT_FACE_FLAG_HINTER            ( 1L << 11 )\n#define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )\n#define FT_FACE_FLAG_TRICKY            ( 1L << 13 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_HORIZONTAL( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains\n   *   horizontal metrics (this is true for all font formats though).\n   *\n   * @also:\n   *   @FT_HAS_VERTICAL can be used to check for vertical metrics.\n   *\n   */\n#define FT_HAS_HORIZONTAL( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_VERTICAL( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains real\n   *   vertical metrics (and not only synthesized ones).\n   *\n   */\n#define FT_HAS_VERTICAL( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_VERTICAL )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_KERNING( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains kerning\n   *   data that can be accessed with @FT_Get_Kerning.\n   *\n   */\n#define FT_HAS_KERNING( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_KERNING )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_SCALABLE( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a scalable\n   *   font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,\n   *   and PFR font formats.\n   *\n   */\n#define FT_IS_SCALABLE( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_SCALABLE )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_SFNT( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a font\n   *   whose format is based on the SFNT storage scheme.  This usually\n   *   means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded\n   *   bitmap fonts.\n   *\n   *   If this macro is true, all functions defined in @FT_SFNT_NAMES_H and\n   *   @FT_TRUETYPE_TABLES_H are available.\n   *\n   */\n#define FT_IS_SFNT( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_SFNT )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_FIXED_WIDTH( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a font face\n   *   that contains fixed-width (or `monospace', `fixed-pitch', etc.)\n   *   glyphs.\n   *\n   */\n#define FT_IS_FIXED_WIDTH( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_FIXED_SIZES( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains some\n   *   embedded bitmaps.  See the `available_sizes' field of the\n   *   @FT_FaceRec structure.\n   *\n   */\n#define FT_HAS_FIXED_SIZES( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_FAST_GLYPHS( face )\n   *\n   * @description:\n   *   Deprecated.\n   *\n   */\n#define FT_HAS_FAST_GLYPHS( face )  0\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_GLYPH_NAMES( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains some glyph\n   *   names that can be accessed through @FT_Get_Glyph_Name.\n   *\n   */\n#define FT_HAS_GLYPH_NAMES( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_HAS_MULTIPLE_MASTERS( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains some\n   *   multiple masters.  The functions provided by @FT_MULTIPLE_MASTERS_H\n   *   are then available to choose the exact design you want.\n   *\n   */\n#define FT_HAS_MULTIPLE_MASTERS( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_CID_KEYED( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face object contains a CID-keyed\n   *   font.  See the discussion of @FT_FACE_FLAG_CID_KEYED for more\n   *   details.\n   *\n   *   If this macro is true, all functions defined in @FT_CID_H are\n   *   available.\n   *\n   */\n#define FT_IS_CID_KEYED( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_CID_KEYED )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_IS_TRICKY( face )\n   *\n   * @description:\n   *   A macro that returns true whenever a face represents a `tricky' font.\n   *   See the discussion of @FT_FACE_FLAG_TRICKY for more details.\n   *\n   */\n#define FT_IS_TRICKY( face ) \\\n          ( face->face_flags & FT_FACE_FLAG_TRICKY )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    FT_STYLE_FLAG_XXX                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit-flags used to indicate the style of a given face.    */\n  /*    These are used in the `style_flags' field of @FT_FaceRec.          */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_STYLE_FLAG_ITALIC ::                                            */\n  /*      Indicates that a given face style is italic or oblique.          */\n  /*                                                                       */\n  /*    FT_STYLE_FLAG_BOLD ::                                              */\n  /*      Indicates that a given face is bold.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The style information as provided by FreeType is very basic.  More */\n  /*    details are beyond the scope and should be done on a higher level  */\n  /*    (for example, by analyzing various fields of the `OS/2' table in   */\n  /*    SFNT based fonts).                                                 */\n  /*                                                                       */\n#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )\n#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Size_Internal                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to an `FT_Size_InternalRec' structure, used to    */\n  /*    model private data of a given @FT_Size object.                     */\n  /*                                                                       */\n  typedef struct FT_Size_InternalRec_*  FT_Size_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_Metrics                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The size metrics structure gives the metrics of a size object.     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x_ppem       :: The width of the scaled EM square in pixels, hence */\n  /*                    the term `ppem' (pixels per EM).  It is also       */\n  /*                    referred to as `nominal width'.                    */\n  /*                                                                       */\n  /*    y_ppem       :: The height of the scaled EM square in pixels,      */\n  /*                    hence the term `ppem' (pixels per EM).  It is also */\n  /*                    referred to as `nominal height'.                   */\n  /*                                                                       */\n  /*    x_scale      :: A 16.16 fractional scaling value used to convert   */\n  /*                    horizontal metrics from font units to 26.6         */\n  /*                    fractional pixels.  Only relevant for scalable     */\n  /*                    font formats.                                      */\n  /*                                                                       */\n  /*    y_scale      :: A 16.16 fractional scaling value used to convert   */\n  /*                    vertical metrics from font units to 26.6           */\n  /*                    fractional pixels.  Only relevant for scalable     */\n  /*                    font formats.                                      */\n  /*                                                                       */\n  /*    ascender     :: The ascender in 26.6 fractional pixels.  See       */\n  /*                    @FT_FaceRec for the details.                       */\n  /*                                                                       */\n  /*    descender    :: The descender in 26.6 fractional pixels.  See      */\n  /*                    @FT_FaceRec for the details.                       */\n  /*                                                                       */\n  /*    height       :: The height in 26.6 fractional pixels.  See         */\n  /*                    @FT_FaceRec for the details.                       */\n  /*                                                                       */\n  /*    max_advance  :: The maximum advance width in 26.6 fractional       */\n  /*                    pixels.  See @FT_FaceRec for the details.          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The scaling values, if relevant, are determined first during a     */\n  /*    size changing operation.  The remaining fields are then set by the */\n  /*    driver.  For scalable formats, they are usually set to scaled      */\n  /*    values of the corresponding fields in @FT_FaceRec.                 */\n  /*                                                                       */\n  /*    Note that due to glyph hinting, these values might not be exact    */\n  /*    for certain fonts.  Thus they must be treated as unreliable        */\n  /*    with an error margin of at least one pixel!                        */\n  /*                                                                       */\n  /*    Indeed, the only way to get the exact metrics is to render _all_   */\n  /*    glyphs.  As this would be a definite performance hit, it is up to  */\n  /*    client applications to perform such computations.                  */\n  /*                                                                       */\n  /*    The FT_Size_Metrics structure is valid for bitmap fonts also.      */\n  /*                                                                       */\n  typedef struct  FT_Size_Metrics_\n  {\n    FT_UShort  x_ppem;      /* horizontal pixels per EM               */\n    FT_UShort  y_ppem;      /* vertical pixels per EM                 */\n\n    FT_Fixed   x_scale;     /* scaling values used to convert font    */\n    FT_Fixed   y_scale;     /* units to 26.6 fractional pixels        */\n\n    FT_Pos     ascender;    /* ascender in 26.6 frac. pixels          */\n    FT_Pos     descender;   /* descender in 26.6 frac. pixels         */\n    FT_Pos     height;      /* text height in 26.6 frac. pixels       */\n    FT_Pos     max_advance; /* max horizontal advance, in 26.6 pixels */\n\n  } FT_Size_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_SizeRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType root size class structure.  A size object models a face   */\n  /*    object at a given size.                                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face    :: Handle to the parent face object.                       */\n  /*                                                                       */\n  /*    generic :: A typeless pointer, which is unused by the FreeType     */\n  /*               library or any of its drivers.  It can be used by       */\n  /*               client applications to link their own data to each size */\n  /*               object.                                                 */\n  /*                                                                       */\n  /*    metrics :: Metrics for this size object.  This field is read-only. */\n  /*                                                                       */\n  typedef struct  FT_SizeRec_\n  {\n    FT_Face           face;      /* parent face object              */\n    FT_Generic        generic;   /* generic pointer for client uses */\n    FT_Size_Metrics   metrics;   /* size metrics                    */\n    FT_Size_Internal  internal;\n\n  } FT_SizeRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_SubGlyph                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The subglyph structure is an internal object used to describe      */\n  /*    subglyphs (for example, in the case of composites).                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The subglyph implementation is not part of the high-level API,     */\n  /*    hence the forward structure declaration.                           */\n  /*                                                                       */\n  /*    You can however retrieve subglyph information with                 */\n  /*    @FT_Get_SubGlyph_Info.                                             */\n  /*                                                                       */\n  typedef struct FT_SubGlyphRec_*  FT_SubGlyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Slot_Internal                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to an `FT_Slot_InternalRec' structure, used to    */\n  /*    model private data of a given @FT_GlyphSlot object.                */\n  /*                                                                       */\n  typedef struct FT_Slot_InternalRec_*  FT_Slot_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_GlyphSlotRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType root glyph slot class structure.  A glyph slot is a       */\n  /*    container where individual glyphs can be loaded, be they in        */\n  /*    outline or bitmap format.                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    library           :: A handle to the FreeType library instance     */\n  /*                         this slot belongs to.                         */\n  /*                                                                       */\n  /*    face              :: A handle to the parent face object.           */\n  /*                                                                       */\n  /*    next              :: In some cases (like some font tools), several */\n  /*                         glyph slots per face object can be a good     */\n  /*                         thing.  As this is rare, the glyph slots are  */\n  /*                         listed through a direct, single-linked list   */\n  /*                         using its `next' field.                       */\n  /*                                                                       */\n  /*    generic           :: A typeless pointer which is unused by the     */\n  /*                         FreeType library or any of its drivers.  It   */\n  /*                         can be used by client applications to link    */\n  /*                         their own data to each glyph slot object.     */\n  /*                                                                       */\n  /*    metrics           :: The metrics of the last loaded glyph in the   */\n  /*                         slot.  The returned values depend on the last */\n  /*                         load flags (see the @FT_Load_Glyph API        */\n  /*                         function) and can be expressed either in 26.6 */\n  /*                         fractional pixels or font units.              */\n  /*                                                                       */\n  /*                         Note that even when the glyph image is        */\n  /*                         transformed, the metrics are not.             */\n  /*                                                                       */\n  /*    linearHoriAdvance :: The advance width of the unhinted glyph.      */\n  /*                         Its value is expressed in 16.16 fractional    */\n  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */\n  /*                         when loading the glyph.  This field can be    */\n  /*                         important to perform correct WYSIWYG layout.  */\n  /*                         Only relevant for outline glyphs.             */\n  /*                                                                       */\n  /*    linearVertAdvance :: The advance height of the unhinted glyph.     */\n  /*                         Its value is expressed in 16.16 fractional    */\n  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */\n  /*                         when loading the glyph.  This field can be    */\n  /*                         important to perform correct WYSIWYG layout.  */\n  /*                         Only relevant for outline glyphs.             */\n  /*                                                                       */\n  /*    advance           :: This shorthand is, depending on               */\n  /*                         @FT_LOAD_IGNORE_TRANSFORM, the transformed    */\n  /*                         advance width for the glyph (in 26.6          */\n  /*                         fractional pixel format).  As specified with  */\n  /*                         @FT_LOAD_VERTICAL_LAYOUT, it uses either the  */\n  /*                         `horiAdvance' or the `vertAdvance' value of   */\n  /*                         `metrics' field.                              */\n  /*                                                                       */\n  /*    format            :: This field indicates the format of the image  */\n  /*                         contained in the glyph slot.  Typically       */\n  /*                         @FT_GLYPH_FORMAT_BITMAP,                      */\n  /*                         @FT_GLYPH_FORMAT_OUTLINE, or                  */\n  /*                         @FT_GLYPH_FORMAT_COMPOSITE, but others are    */\n  /*                         possible.                                     */\n  /*                                                                       */\n  /*    bitmap            :: This field is used as a bitmap descriptor     */\n  /*                         when the slot format is                       */\n  /*                         @FT_GLYPH_FORMAT_BITMAP.  Note that the       */\n  /*                         address and content of the bitmap buffer can  */\n  /*                         change between calls of @FT_Load_Glyph and a  */\n  /*                         few other functions.                          */\n  /*                                                                       */\n  /*    bitmap_left       :: This is the bitmap's left bearing expressed   */\n  /*                         in integer pixels.  Of course, this is only   */\n  /*                         valid if the format is                        */\n  /*                         @FT_GLYPH_FORMAT_BITMAP.                      */\n  /*                                                                       */\n  /*    bitmap_top        :: This is the bitmap's top bearing expressed in */\n  /*                         integer pixels.  Remember that this is the    */\n  /*                         distance from the baseline to the top-most    */\n  /*                         glyph scanline, upwards y~coordinates being   */\n  /*                         *positive*.                                   */\n  /*                                                                       */\n  /*    outline           :: The outline descriptor for the current glyph  */\n  /*                         image if its format is                        */\n  /*                         @FT_GLYPH_FORMAT_OUTLINE.  Once a glyph is    */\n  /*                         loaded, `outline' can be transformed,         */\n  /*                         distorted, embolded, etc.  However, it must   */\n  /*                         not be freed.                                 */\n  /*                                                                       */\n  /*    num_subglyphs     :: The number of subglyphs in a composite glyph. */\n  /*                         This field is only valid for the composite    */\n  /*                         glyph format that should normally only be     */\n  /*                         loaded with the @FT_LOAD_NO_RECURSE flag.     */\n  /*                         For now this is internal to FreeType.         */\n  /*                                                                       */\n  /*    subglyphs         :: An array of subglyph descriptors for          */\n  /*                         composite glyphs.  There are `num_subglyphs'  */\n  /*                         elements in there.  Currently internal to     */\n  /*                         FreeType.                                     */\n  /*                                                                       */\n  /*    control_data      :: Certain font drivers can also return the      */\n  /*                         control data for a given glyph image (e.g.    */\n  /*                         TrueType bytecode, Type~1 charstrings, etc.). */\n  /*                         This field is a pointer to such data.         */\n  /*                                                                       */\n  /*    control_len       :: This is the length in bytes of the control    */\n  /*                         data.                                         */\n  /*                                                                       */\n  /*    other             :: Really wicked formats can use this pointer to */\n  /*                         present their own glyph image to client       */\n  /*                         applications.  Note that the application      */\n  /*                         needs to know about the image format.         */\n  /*                                                                       */\n  /*    lsb_delta         :: The difference between hinted and unhinted    */\n  /*                         left side bearing while autohinting is        */\n  /*                         active.  Zero otherwise.                      */\n  /*                                                                       */\n  /*    rsb_delta         :: The difference between hinted and unhinted    */\n  /*                         right side bearing while autohinting is       */\n  /*                         active.  Zero otherwise.                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If @FT_Load_Glyph is called with default flags (see                */\n  /*    @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in   */\n  /*    its native format (e.g., an outline glyph for TrueType and Type~1  */\n  /*    formats).                                                          */\n  /*                                                                       */\n  /*    This image can later be converted into a bitmap by calling         */\n  /*    @FT_Render_Glyph.  This function finds the current renderer for    */\n  /*    the native image's format, then invokes it.                        */\n  /*                                                                       */\n  /*    The renderer is in charge of transforming the native image through */\n  /*    the slot's face transformation fields, then converting it into a   */\n  /*    bitmap that is returned in `slot->bitmap'.                         */\n  /*                                                                       */\n  /*    Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */\n  /*    to specify the position of the bitmap relative to the current pen  */\n  /*    position (e.g., coordinates (0,0) on the baseline).  Of course,    */\n  /*    `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP.         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Here a small pseudo code fragment which shows how to use           */\n  /*    `lsb_delta' and `rsb_delta':                                       */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      FT_Pos  origin_x       = 0;                                      */\n  /*      FT_Pos  prev_rsb_delta = 0;                                      */\n  /*                                                                       */\n  /*                                                                       */\n  /*      for all glyphs do                                                */\n  /*        <compute kern between current and previous glyph and add it to */\n  /*         `origin_x'>                                                   */\n  /*                                                                       */\n  /*        <load glyph with `FT_Load_Glyph'>                              */\n  /*                                                                       */\n  /*        if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )           */\n  /*          origin_x -= 64;                                              */\n  /*        else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )      */\n  /*          origin_x += 64;                                              */\n  /*                                                                       */\n  /*        prev_rsb_delta = face->glyph->rsb_delta;                       */\n  /*                                                                       */\n  /*        <save glyph image, or render glyph, or ...>                    */\n  /*                                                                       */\n  /*        origin_x += face->glyph->advance.x;                            */\n  /*      endfor                                                           */\n  /*    }                                                                  */\n  /*                                                                       */\n  typedef struct  FT_GlyphSlotRec_\n  {\n    FT_Library        library;\n    FT_Face           face;\n    FT_GlyphSlot      next;\n    FT_UInt           reserved;       /* retained for binary compatibility */\n    FT_Generic        generic;\n\n    FT_Glyph_Metrics  metrics;\n    FT_Fixed          linearHoriAdvance;\n    FT_Fixed          linearVertAdvance;\n    FT_Vector         advance;\n\n    FT_Glyph_Format   format;\n\n    FT_Bitmap         bitmap;\n    FT_Int            bitmap_left;\n    FT_Int            bitmap_top;\n\n    FT_Outline        outline;\n\n    FT_UInt           num_subglyphs;\n    FT_SubGlyph       subglyphs;\n\n    void*             control_data;\n    long              control_len;\n\n    FT_Pos            lsb_delta;\n    FT_Pos            rsb_delta;\n\n    void*             other;\n\n    FT_Slot_Internal  internal;\n\n  } FT_GlyphSlotRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                         F U N C T I O N S                             */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Init_FreeType                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a new FreeType library object.  The set of modules      */\n  /*    that are registered by this function is determined at build time.  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    alibrary :: A handle to a new library object.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In case you want to provide your own memory allocating routines,   */\n  /*    use @FT_New_Library instead, followed by a call to                 */\n  /*    @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module).  */\n  /*                                                                       */\n  /*    For multi-threading applications each thread should have its own   */\n  /*    FT_Library object.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Init_FreeType( FT_Library  *alibrary );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_FreeType                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a given FreeType library object and all of its children,   */\n  /*    including resources, drivers, faces, sizes, etc.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to the target library object.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_FreeType( FT_Library  library );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_OPEN_XXX                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit-field constants used within the `flags' field of the */\n  /*    @FT_Open_Args structure.                                           */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_OPEN_MEMORY   :: This is a memory-based stream.                 */\n  /*                                                                       */\n  /*    FT_OPEN_STREAM   :: Copy the stream from the `stream' field.       */\n  /*                                                                       */\n  /*    FT_OPEN_PATHNAME :: Create a new input stream from a C~path        */\n  /*                        name.                                          */\n  /*                                                                       */\n  /*    FT_OPEN_DRIVER   :: Use the `driver' field.                        */\n  /*                                                                       */\n  /*    FT_OPEN_PARAMS   :: Use the `num_params' and `params' fields.      */\n  /*                                                                       */\n  /*    ft_open_memory   :: Deprecated; use @FT_OPEN_MEMORY instead.       */\n  /*                                                                       */\n  /*    ft_open_stream   :: Deprecated; use @FT_OPEN_STREAM instead.       */\n  /*                                                                       */\n  /*    ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead.     */\n  /*                                                                       */\n  /*    ft_open_driver   :: Deprecated; use @FT_OPEN_DRIVER instead.       */\n  /*                                                                       */\n  /*    ft_open_params   :: Deprecated; use @FT_OPEN_PARAMS instead.       */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME'     */\n  /*    flags are mutually exclusive.                                      */\n  /*                                                                       */\n#define FT_OPEN_MEMORY    0x1\n#define FT_OPEN_STREAM    0x2\n#define FT_OPEN_PATHNAME  0x4\n#define FT_OPEN_DRIVER    0x8\n#define FT_OPEN_PARAMS    0x10\n\n#define ft_open_memory    FT_OPEN_MEMORY     /* deprecated */\n#define ft_open_stream    FT_OPEN_STREAM     /* deprecated */\n#define ft_open_pathname  FT_OPEN_PATHNAME   /* deprecated */\n#define ft_open_driver    FT_OPEN_DRIVER     /* deprecated */\n#define ft_open_params    FT_OPEN_PARAMS     /* deprecated */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Parameter                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to pass more or less generic parameters to */\n  /*    @FT_Open_Face.                                                     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    tag  :: A four-byte identification tag.                            */\n  /*                                                                       */\n  /*    data :: A pointer to the parameter data.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The ID and function of parameters are driver-specific.  See the    */\n  /*    various FT_PARAM_TAG_XXX flags for more information.               */\n  /*                                                                       */\n  typedef struct  FT_Parameter_\n  {\n    FT_ULong    tag;\n    FT_Pointer  data;\n\n  } FT_Parameter;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Open_Args                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to indicate how to open a new font file or        */\n  /*    stream.  A pointer to such a structure can be used as a parameter  */\n  /*    for the functions @FT_Open_Face and @FT_Attach_Stream.             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    flags       :: A set of bit flags indicating how to use the        */\n  /*                   structure.                                          */\n  /*                                                                       */\n  /*    memory_base :: The first byte of the file in memory.               */\n  /*                                                                       */\n  /*    memory_size :: The size in bytes of the file in memory.            */\n  /*                                                                       */\n  /*    pathname    :: A pointer to an 8-bit file pathname.                */\n  /*                                                                       */\n  /*    stream      :: A handle to a source stream object.                 */\n  /*                                                                       */\n  /*    driver      :: This field is exclusively used by @FT_Open_Face;    */\n  /*                   it simply specifies the font driver to use to open  */\n  /*                   the face.  If set to~0, FreeType tries to load the  */\n  /*                   face with each one of the drivers in its list.      */\n  /*                                                                       */\n  /*    num_params  :: The number of extra parameters.                     */\n  /*                                                                       */\n  /*    params      :: Extra parameters passed to the font driver when     */\n  /*                   opening a new face.                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream type is determined by the contents of `flags' which     */\n  /*    are tested in the following order by @FT_Open_Face:                */\n  /*                                                                       */\n  /*    If the `FT_OPEN_MEMORY' bit is set, assume that this is a          */\n  /*    memory file of `memory_size' bytes, located at `memory_address'.   */\n  /*    The data are are not copied, and the client is responsible for     */\n  /*    releasing and destroying them _after_ the corresponding call to    */\n  /*    @FT_Done_Face.                                                     */\n  /*                                                                       */\n  /*    Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a       */\n  /*    custom input stream `stream' is used.                              */\n  /*                                                                       */\n  /*    Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this  */\n  /*    is a normal file and use `pathname' to open it.                    */\n  /*                                                                       */\n  /*    If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to    */\n  /*    open the file with the driver whose handler is in `driver'.        */\n  /*                                                                       */\n  /*    If the `FT_OPEN_PARAMS' bit is set, the parameters given by        */\n  /*    `num_params' and `params' is used.  They are ignored otherwise.    */\n  /*                                                                       */\n  /*    Ideally, both the `pathname' and `params' fields should be tagged  */\n  /*    as `const'; this is missing for API backwards compatibility.  In   */\n  /*    other words, applications should treat them as read-only.          */\n  /*                                                                       */\n  typedef struct  FT_Open_Args_\n  {\n    FT_UInt         flags;\n    const FT_Byte*  memory_base;\n    FT_Long         memory_size;\n    FT_String*      pathname;\n    FT_Stream       stream;\n    FT_Module       driver;\n    FT_Int          num_params;\n    FT_Parameter*   params;\n\n  } FT_Open_Args;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Open_Face to open a font by its pathname.  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    pathname   :: A path to the font file.                             */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the font.  The first    */\n  /*                  face has index~0.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.  If `face_index' is   */\n  /*                  greater than or equal to zero, it must be non-NULL.  */\n  /*                  See @FT_Open_Face for more details.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face( FT_Library   library,\n               const char*  filepathname,\n               FT_Long      face_index,\n               FT_Face     *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Memory_Face                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Open_Face to open a font which has been    */\n  /*    loaded into memory.                                                */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    file_base  :: A pointer to the beginning of the font data.         */\n  /*                                                                       */\n  /*    file_size  :: The size of the memory chunk used by the font data.  */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the font.  The first    */\n  /*                  face has index~0.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.  If `face_index' is   */\n  /*                  greater than or equal to zero, it must be non-NULL.  */\n  /*                  See @FT_Open_Face for more details.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You must not deallocate the memory before calling @FT_Done_Face.   */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Memory_Face( FT_Library      library,\n                      const FT_Byte*  file_base,\n                      FT_Long         file_size,\n                      FT_Long         face_index,\n                      FT_Face        *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Open_Face                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a face object from a given resource described by            */\n  /*    @FT_Open_Args.                                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    args       :: A pointer to an `FT_Open_Args' structure which must  */\n  /*                  be filled by the caller.                             */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the font.  The first    */\n  /*                  face has index~0.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.  If `face_index' is   */\n  /*                  greater than or equal to zero, it must be non-NULL.  */\n  /*                  See note below.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */\n  /*    slot for the face object which can be accessed directly through    */\n  /*    `face->glyph'.                                                     */\n  /*                                                                       */\n  /*    FT_Open_Face can be used to quickly check whether the font         */\n  /*    format of a given font resource is supported by FreeType.  If the  */\n  /*    `face_index' field is negative, the function's return value is~0   */\n  /*    if the font format is recognized, or non-zero otherwise;           */\n  /*    the function returns a more or less empty face handle in `*aface'  */\n  /*    (if `aface' isn't NULL).  The only useful field in this special    */\n  /*    case is `face->num_faces' which gives the number of faces within   */\n  /*    the font file.  After examination, the returned @FT_Face structure */\n  /*    should be deallocated with a call to @FT_Done_Face.                */\n  /*                                                                       */\n  /*    Each new face object created with this function also owns a        */\n  /*    default @FT_Size object, accessible as `face->size'.               */\n  /*                                                                       */\n  /*    One @FT_Library instance can have multiple face objects, this is,  */\n  /*    @FT_Open_Face and its siblings can be called multiple times using  */\n  /*    the same `library' argument.                                       */\n  /*                                                                       */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Face.                                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Open_Face( FT_Library           library,\n                const FT_Open_Args*  args,\n                FT_Long              face_index,\n                FT_Face             *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Attach_File                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Attach_Stream to attach a file.            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face         :: The target face object.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    filepathname :: The pathname.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Attach_File( FT_Face      face,\n                  const char*  filepathname );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Attach_Stream                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    `Attach' data to a face object.  Normally, this is used to read    */\n  /*    additional information for the face object.  For example, you can  */\n  /*    attach an AFM file that comes with a Type~1 font to get the        */\n  /*    kerning values and other metrics.                                  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The target face object.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    parameters :: A pointer to @FT_Open_Args which must be filled by   */\n  /*                  the caller.                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The meaning of the `attach' (i.e., what really happens when the    */\n  /*    new file is read) is not fixed by FreeType itself.  It really      */\n  /*    depends on the font format (and thus the font driver).             */\n  /*                                                                       */\n  /*    Client applications are expected to know what they are doing       */\n  /*    when invoking this function.  Most drivers simply do not implement */\n  /*    file attachments.                                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Attach_Stream( FT_Face        face,\n                    FT_Open_Args*  parameters );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Reference_Face                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A counter gets initialized to~1 at the time an @FT_Face structure  */\n  /*    is created.  This function increments the counter.  @FT_Done_Face  */\n  /*    then only destroys a face if the counter is~1, otherwise it simply */\n  /*    decrements the counter.                                            */\n  /*                                                                       */\n  /*    This function helps in managing life-cycles of structures which    */\n  /*    reference @FT_Face objects.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to a target face object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.4.2                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Reference_Face( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Face                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard a given face object, as well as all of its child slots and */\n  /*    sizes.                                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to a target face object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Face.                                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_Face( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Select_Size                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select a bitmap strike.                                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face         :: A handle to a target face object.                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    strike_index :: The index of the bitmap strike in the              */\n  /*                    `available_sizes' field of @FT_FaceRec structure.  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Select_Size( FT_Face  face,\n                  FT_Int   strike_index );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Size_Request_Type                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type that lists the supported size request types.   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_SIZE_REQUEST_TYPE_NOMINAL ::                                    */\n  /*      The nominal size.  The `units_per_EM' field of @FT_FaceRec is    */\n  /*      used to determine both scaling values.                           */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_REAL_DIM ::                                   */\n  /*      The real dimension.  The sum of the the `ascender' and (minus    */\n  /*      of) the `descender' fields of @FT_FaceRec are used to determine  */\n  /*      both scaling values.                                             */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_BBOX ::                                       */\n  /*      The font bounding box.  The width and height of the `bbox' field */\n  /*      of @FT_FaceRec are used to determine the horizontal and vertical */\n  /*      scaling value, respectively.                                     */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_CELL ::                                       */\n  /*      The `max_advance_width' field of @FT_FaceRec is used to          */\n  /*      determine the horizontal scaling value; the vertical scaling     */\n  /*      value is determined the same way as                              */\n  /*      @FT_SIZE_REQUEST_TYPE_REAL_DIM does.  Finally, both scaling      */\n  /*      values are set to the smaller one.  This type is useful if you   */\n  /*      want to specify the font size for, say, a window of a given      */\n  /*      dimension and 80x24 cells.                                       */\n  /*                                                                       */\n  /*    FT_SIZE_REQUEST_TYPE_SCALES ::                                     */\n  /*      Specify the scaling values directly.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The above descriptions only apply to scalable formats.  For bitmap */\n  /*    formats, the behaviour is up to the driver.                        */\n  /*                                                                       */\n  /*    See the note section of @FT_Size_Metrics if you wonder how size    */\n  /*    requesting relates to scaling values.                              */\n  /*                                                                       */\n  typedef enum  FT_Size_Request_Type_\n  {\n    FT_SIZE_REQUEST_TYPE_NOMINAL,\n    FT_SIZE_REQUEST_TYPE_REAL_DIM,\n    FT_SIZE_REQUEST_TYPE_BBOX,\n    FT_SIZE_REQUEST_TYPE_CELL,\n    FT_SIZE_REQUEST_TYPE_SCALES,\n\n    FT_SIZE_REQUEST_TYPE_MAX\n\n  } FT_Size_Request_Type;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_RequestRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a size request.                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    type           :: See @FT_Size_Request_Type.                       */\n  /*                                                                       */\n  /*    width          :: The desired width.                               */\n  /*                                                                       */\n  /*    height         :: The desired height.                              */\n  /*                                                                       */\n  /*    horiResolution :: The horizontal resolution.  If set to zero,      */\n  /*                      `width' is treated as a 26.6 fractional pixel    */\n  /*                      value.                                           */\n  /*                                                                       */\n  /*    vertResolution :: The vertical resolution.  If set to zero,        */\n  /*                      `height' is treated as a 26.6 fractional pixel   */\n  /*                      value.                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If `width' is zero, then the horizontal scaling value is set equal */\n  /*    to the vertical scaling value, and vice versa.                     */\n  /*                                                                       */\n  typedef struct  FT_Size_RequestRec_\n  {\n    FT_Size_Request_Type  type;\n    FT_Long               width;\n    FT_Long               height;\n    FT_UInt               horiResolution;\n    FT_UInt               vertResolution;\n\n  } FT_Size_RequestRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_Request                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a size request structure.                              */\n  /*                                                                       */\n  typedef struct FT_Size_RequestRec_  *FT_Size_Request;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Request_Size                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Resize the scale of the active @FT_Size object in a face.          */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face :: A handle to a target face object.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    req  :: A pointer to a @FT_Size_RequestRec.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Although drivers may select the bitmap strike matching the         */\n  /*    request, you should not rely on this if you intend to select a     */\n  /*    particular bitmap strike.  Use @FT_Select_Size instead in that     */\n  /*    case.                                                              */\n  /*                                                                       */\n  /*    The relation between the requested size and the resulting glyph    */\n  /*    size is dependent entirely on how the size is defined in the       */\n  /*    source face.  The font designer chooses the final size of each     */\n  /*    glyph relative to this size.  For more information refer to        */\n  /*    `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Request_Size( FT_Face          face,\n                   FT_Size_Request  req );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Char_Size                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Request_Size to request the nominal size   */\n  /*    (in points).                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face            :: A handle to a target face object.               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    char_width      :: The nominal width, in 26.6 fractional points.   */\n  /*                                                                       */\n  /*    char_height     :: The nominal height, in 26.6 fractional points.  */\n  /*                                                                       */\n  /*    horz_resolution :: The horizontal resolution in dpi.               */\n  /*                                                                       */\n  /*    vert_resolution :: The vertical resolution in dpi.                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If either the character width or height is zero, it is set equal   */\n  /*    to the other value.                                                */\n  /*                                                                       */\n  /*    If either the horizontal or vertical resolution is zero, it is set */\n  /*    equal to the other value.                                          */\n  /*                                                                       */\n  /*    A character width or height smaller than 1pt is set to 1pt; if     */\n  /*    both resolution values are zero, they are set to 72dpi.            */\n  /*                                                                       */\n  /*    Don't use this function if you are using the FreeType cache API.   */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Char_Size( FT_Face     face,\n                    FT_F26Dot6  char_width,\n                    FT_F26Dot6  char_height,\n                    FT_UInt     horz_resolution,\n                    FT_UInt     vert_resolution );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Pixel_Sizes                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function calls @FT_Request_Size to request the nominal size   */\n  /*    (in pixels).                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face         :: A handle to the target face object.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    pixel_width  :: The nominal width, in pixels.                      */\n  /*                                                                       */\n  /*    pixel_height :: The nominal height, in pixels.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should not rely on the resulting glyphs matching, or being     */\n  /*    constrained, to this pixel size.  Refer to @FT_Request_Size to     */\n  /*    understand how requested sizes relate to actual sizes.             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Pixel_Sizes( FT_Face  face,\n                      FT_UInt  pixel_width,\n                      FT_UInt  pixel_height );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Load_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to load a single glyph into the glyph slot of a    */\n  /*    face object.                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face        :: A handle to the target face object where the glyph  */\n  /*                   is loaded.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph_index :: The index of the glyph in the font file.  For       */\n  /*                   CID-keyed fonts (either in PS or in CFF format)     */\n  /*                   this argument specifies the CID value.              */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   @FT_LOAD_XXX constants can be used to control the   */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The loaded glyph may be transformed.  See @FT_Set_Transform for    */\n  /*    the details.                                                       */\n  /*                                                                       */\n  /*    For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is        */\n  /*    returned for invalid CID values (this is, for CID values which     */\n  /*    don't have a corresponding glyph in the font).  See the discussion */\n  /*    of the @FT_FACE_FLAG_CID_KEYED flag for more details.              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Load_Glyph( FT_Face   face,\n                 FT_UInt   glyph_index,\n                 FT_Int32  load_flags );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Load_Char                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to load a single glyph into the glyph slot of a    */\n  /*    face object, according to its character code.                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face        :: A handle to a target face object where the glyph    */\n  /*                   is loaded.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    char_code   :: The glyph's character code, according to the        */\n  /*                   current charmap used in the face.                   */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   @FT_LOAD_XXX constants can be used to control the   */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph.  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Load_Char( FT_Face   face,\n                FT_ULong  char_code,\n                FT_Int32  load_flags );\n\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FT_LOAD_XXX\n   *\n   * @description:\n   *   A list of bit-field constants used with @FT_Load_Glyph to indicate\n   *   what kind of operations to perform during glyph loading.\n   *\n   * @values:\n   *   FT_LOAD_DEFAULT ::\n   *     Corresponding to~0, this value is used as the default glyph load\n   *     operation.  In this case, the following happens:\n   *\n   *     1. FreeType looks for a bitmap for the glyph corresponding to the\n   *        face's current size.  If one is found, the function returns.\n   *        The bitmap data can be accessed from the glyph slot (see note\n   *        below).\n   *\n   *     2. If no embedded bitmap is searched or found, FreeType looks for a\n   *        scalable outline.  If one is found, it is loaded from the font\n   *        file, scaled to device pixels, then `hinted' to the pixel grid\n   *        in order to optimize it.  The outline data can be accessed from\n   *        the glyph slot (see note below).\n   *\n   *     Note that by default, the glyph loader doesn't render outlines into\n   *     bitmaps.  The following flags are used to modify this default\n   *     behaviour to more specific and useful cases.\n   *\n   *   FT_LOAD_NO_SCALE ::\n   *     Don't scale the loaded outline glyph but keep it in font units.\n   *\n   *     This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and\n   *     unsets @FT_LOAD_RENDER.\n   *\n   *     If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using\n   *     FT_LOAD_NO_SCALE usually yields meaningless outlines because the\n   *     subglyphs must be scaled and positioned with hinting instructions.\n   *     This can be solved by loading the font without FT_LOAD_NO_SCALE and\n   *     setting the character size to `font->units_per_EM'.\n   *\n   *   FT_LOAD_NO_HINTING ::\n   *     Disable hinting.  This generally generates `blurrier' bitmap glyphs\n   *     when the glyph are rendered in any of the anti-aliased modes.  See\n   *     also the note below.\n   *\n   *     This flag is implied by @FT_LOAD_NO_SCALE.\n   *\n   *   FT_LOAD_RENDER ::\n   *     Call @FT_Render_Glyph after the glyph is loaded.  By default, the\n   *     glyph is rendered in @FT_RENDER_MODE_NORMAL mode.  This can be\n   *     overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.\n   *\n   *     This flag is unset by @FT_LOAD_NO_SCALE.\n   *\n   *   FT_LOAD_NO_BITMAP ::\n   *     Ignore bitmap strikes when loading.  Bitmap-only fonts ignore this\n   *     flag.\n   *\n   *     @FT_LOAD_NO_SCALE always sets this flag.\n   *\n   *   FT_LOAD_VERTICAL_LAYOUT ::\n   *     Load the glyph for vertical text layout.  In particular, the\n   *     `advance' value in the @FT_GlyphSlotRec structure is set to the\n   *     `vertAdvance' value of the `metrics' field.\n   *\n   *     In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use\n   *     this flag currently.  Reason is that in this case vertical metrics\n   *     get synthesized, and those values are not always consistent across\n   *     various font formats.\n   *\n   *   FT_LOAD_FORCE_AUTOHINT ::\n   *     Indicates that the auto-hinter is preferred over the font's native\n   *     hinter.  See also the note below.\n   *\n   *   FT_LOAD_CROP_BITMAP ::\n   *     Indicates that the font driver should crop the loaded bitmap glyph\n   *     (i.e., remove all space around its black bits).  Not all drivers\n   *     implement this.\n   *\n   *   FT_LOAD_PEDANTIC ::\n   *     Indicates that the font driver should perform pedantic verifications\n   *     during glyph loading.  This is mostly used to detect broken glyphs\n   *     in fonts.  By default, FreeType tries to handle broken fonts also.\n   *\n   *     In particular, errors from the TrueType bytecode engine are not\n   *     passed to the application if this flag is not set; this might\n   *     result in partially hinted or distorted glyphs in case a glyph's\n   *     bytecode is buggy.\n   *\n   *   FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::\n   *     Ignored.  Deprecated.\n   *\n   *   FT_LOAD_NO_RECURSE ::\n   *     This flag is only used internally.  It merely indicates that the\n   *     font driver should not load composite glyphs recursively.  Instead,\n   *     it should set the `num_subglyph' and `subglyphs' values of the\n   *     glyph slot accordingly, and set `glyph->format' to\n   *     @FT_GLYPH_FORMAT_COMPOSITE.\n   *\n   *     The description of sub-glyphs is not available to client\n   *     applications for now.\n   *\n   *     This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.\n   *\n   *   FT_LOAD_IGNORE_TRANSFORM ::\n   *     Indicates that the transform matrix set by @FT_Set_Transform should\n   *     be ignored.\n   *\n   *   FT_LOAD_MONOCHROME ::\n   *     This flag is used with @FT_LOAD_RENDER to indicate that you want to\n   *     render an outline glyph to a 1-bit monochrome bitmap glyph, with\n   *     8~pixels packed into each byte of the bitmap data.\n   *\n   *     Note that this has no effect on the hinting algorithm used.  You\n   *     should rather use @FT_LOAD_TARGET_MONO so that the\n   *     monochrome-optimized hinting algorithm is used.\n   *\n   *   FT_LOAD_LINEAR_DESIGN ::\n   *     Indicates that the `linearHoriAdvance' and `linearVertAdvance'\n   *     fields of @FT_GlyphSlotRec should be kept in font units.  See\n   *     @FT_GlyphSlotRec for details.\n   *\n   *   FT_LOAD_NO_AUTOHINT ::\n   *     Disable auto-hinter.  See also the note below.\n   *\n   * @note:\n   *   By default, hinting is enabled and the font's native hinter (see\n   *   @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter.  You can\n   *   disable hinting by setting @FT_LOAD_NO_HINTING or change the\n   *   precedence by setting @FT_LOAD_FORCE_AUTOHINT.  You can also set\n   *   @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be\n   *   used at all.\n   *\n   *   See the description of @FT_FACE_FLAG_TRICKY for a special exception\n   *   (affecting only a handful of Asian fonts).\n   *\n   *   Besides deciding which hinter to use, you can also decide which\n   *   hinting algorithm to use.  See @FT_LOAD_TARGET_XXX for details.\n   *\n   *   Note that the auto-hinter needs a valid Unicode cmap (either a native\n   *   one or synthesized by FreeType) for producing correct results.  If a\n   *   font provides an incorrect mapping (for example, assigning the\n   *   character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a\n   *   mathematical integral sign), the auto-hinter might produce useless\n   *   results.\n   *\n   */\n#define FT_LOAD_DEFAULT                      0x0\n#define FT_LOAD_NO_SCALE                     ( 1L << 0 )\n#define FT_LOAD_NO_HINTING                   ( 1L << 1 )\n#define FT_LOAD_RENDER                       ( 1L << 2 )\n#define FT_LOAD_NO_BITMAP                    ( 1L << 3 )\n#define FT_LOAD_VERTICAL_LAYOUT              ( 1L << 4 )\n#define FT_LOAD_FORCE_AUTOHINT               ( 1L << 5 )\n#define FT_LOAD_CROP_BITMAP                  ( 1L << 6 )\n#define FT_LOAD_PEDANTIC                     ( 1L << 7 )\n#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  ( 1L << 9 )\n#define FT_LOAD_NO_RECURSE                   ( 1L << 10 )\n#define FT_LOAD_IGNORE_TRANSFORM             ( 1L << 11 )\n#define FT_LOAD_MONOCHROME                   ( 1L << 12 )\n#define FT_LOAD_LINEAR_DESIGN                ( 1L << 13 )\n#define FT_LOAD_NO_AUTOHINT                  ( 1L << 15 )\n\n  /* */\n\n  /* used internally only by certain font drivers! */\n#define FT_LOAD_ADVANCE_ONLY                 ( 1L << 8 )\n#define FT_LOAD_SBITS_ONLY                   ( 1L << 14 )\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   FT_LOAD_TARGET_XXX\n   *\n   * @description:\n   *   A list of values that are used to select a specific hinting algorithm\n   *   to use by the hinter.  You should OR one of these values to your\n   *   `load_flags' when calling @FT_Load_Glyph.\n   *\n   *   Note that font's native hinters may ignore the hinting algorithm you\n   *   have specified (e.g., the TrueType bytecode interpreter).  You can set\n   *   @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.\n   *\n   *   Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it\n   *   always implies @FT_LOAD_FORCE_AUTOHINT.\n   *\n   * @values:\n   *   FT_LOAD_TARGET_NORMAL ::\n   *     This corresponds to the default hinting algorithm, optimized for\n   *     standard gray-level rendering.  For monochrome output, use\n   *     @FT_LOAD_TARGET_MONO instead.\n   *\n   *   FT_LOAD_TARGET_LIGHT ::\n   *     A lighter hinting algorithm for non-monochrome modes.  Many\n   *     generated glyphs are more fuzzy but better resemble its original\n   *     shape.  A bit like rendering on Mac OS~X.\n   *\n   *     As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.\n   *\n   *   FT_LOAD_TARGET_MONO ::\n   *     Strong hinting algorithm that should only be used for monochrome\n   *     output.  The result is probably unpleasant if the glyph is rendered\n   *     in non-monochrome modes.\n   *\n   *   FT_LOAD_TARGET_LCD ::\n   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally\n   *     decimated LCD displays.\n   *\n   *   FT_LOAD_TARGET_LCD_V ::\n   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically\n   *     decimated LCD displays.\n   *\n   * @note:\n   *   You should use only _one_ of the FT_LOAD_TARGET_XXX values in your\n   *   `load_flags'.  They can't be ORed.\n   *\n   *   If @FT_LOAD_RENDER is also set, the glyph is rendered in the\n   *   corresponding mode (i.e., the mode which matches the used algorithm\n   *   best).  An exeption is FT_LOAD_TARGET_MONO since it implies\n   *   @FT_LOAD_MONOCHROME.\n   *\n   *   You can use a hinting algorithm that doesn't correspond to the same\n   *   rendering mode.  As an example, it is possible to use the `light'\n   *   hinting algorithm and have the results rendered in horizontal LCD\n   *   pixel mode, with code like\n   *\n   *     {\n   *       FT_Load_Glyph( face, glyph_index,\n   *                      load_flags | FT_LOAD_TARGET_LIGHT );\n   *\n   *       FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );\n   *     }\n   *\n   */\n#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )\n\n#define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )\n#define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )\n#define FT_LOAD_TARGET_MONO    FT_LOAD_TARGET_( FT_RENDER_MODE_MONO   )\n#define FT_LOAD_TARGET_LCD     FT_LOAD_TARGET_( FT_RENDER_MODE_LCD    )\n#define FT_LOAD_TARGET_LCD_V   FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V  )\n\n\n  /**************************************************************************\n   *\n   * @macro:\n   *   FT_LOAD_TARGET_MODE\n   *\n   * @description:\n   *   Return the @FT_Render_Mode corresponding to a given\n   *   @FT_LOAD_TARGET_XXX value.\n   *\n   */\n#define FT_LOAD_TARGET_MODE( x )  ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Transform                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to set the transformation that is applied to glyph */\n  /*    images when they are loaded into a glyph slot through              */\n  /*    @FT_Load_Glyph.                                                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the source face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix :: A pointer to the transformation's 2x2 matrix.  Use~0 for */\n  /*              the identity matrix.                                     */\n  /*    delta  :: A pointer to the translation vector.  Use~0 for the null */\n  /*              vector.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The transformation is only applied to scalable image formats after */\n  /*    the glyph has been loaded.  It means that hinting is unaltered by  */\n  /*    the transformation and is performed on the character size given in */\n  /*    the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes.         */\n  /*                                                                       */\n  /*    Note that this also transforms the `face.glyph.advance' field, but */\n  /*    *not* the values in `face.glyph.metrics'.                          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Set_Transform( FT_Face     face,\n                    FT_Matrix*  matrix,\n                    FT_Vector*  delta );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Render_Mode                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type that lists the render modes supported by       */\n  /*    FreeType~2.  Each mode corresponds to a specific type of scanline  */\n  /*    conversion performed on the outline.                               */\n  /*                                                                       */\n  /*    For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode'     */\n  /*    field in the @FT_GlyphSlotRec structure gives the format of the    */\n  /*    returned bitmap.                                                   */\n  /*                                                                       */\n  /*    All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity.   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_RENDER_MODE_NORMAL ::                                           */\n  /*      This is the default render mode; it corresponds to 8-bit         */\n  /*      anti-aliased bitmaps.                                            */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_LIGHT ::                                            */\n  /*      This is equivalent to @FT_RENDER_MODE_NORMAL.  It is only        */\n  /*      defined as a separate value because render modes are also used   */\n  /*      indirectly to define hinting algorithm selectors.  See           */\n  /*      @FT_LOAD_TARGET_XXX for details.                                 */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_MONO ::                                             */\n  /*      This mode corresponds to 1-bit bitmaps (with 2~levels of         */\n  /*      opacity).                                                        */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_LCD ::                                              */\n  /*      This mode corresponds to horizontal RGB and BGR sub-pixel        */\n  /*      displays like LCD screens.  It produces 8-bit bitmaps that are   */\n  /*      3~times the width of the original glyph outline in pixels, and   */\n  /*      which use the @FT_PIXEL_MODE_LCD mode.                           */\n  /*                                                                       */\n  /*    FT_RENDER_MODE_LCD_V ::                                            */\n  /*      This mode corresponds to vertical RGB and BGR sub-pixel displays */\n  /*      (like PDA screens, rotated LCD displays, etc.).  It produces     */\n  /*      8-bit bitmaps that are 3~times the height of the original        */\n  /*      glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode.   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */\n  /*    filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */\n  /*    (not active in the default builds).  It is up to the caller to     */\n  /*    either call @FT_Library_SetLcdFilter (if available) or do the      */\n  /*    filtering itself.                                                  */\n  /*                                                                       */\n  /*    The selected render mode only affects vector glyphs of a font.     */\n  /*    Embedded bitmaps often have a different pixel mode like            */\n  /*    @FT_PIXEL_MODE_MONO.  You can use @FT_Bitmap_Convert to transform  */\n  /*    them into 8-bit pixmaps.                                           */\n  /*                                                                       */\n  typedef enum  FT_Render_Mode_\n  {\n    FT_RENDER_MODE_NORMAL = 0,\n    FT_RENDER_MODE_LIGHT,\n    FT_RENDER_MODE_MONO,\n    FT_RENDER_MODE_LCD,\n    FT_RENDER_MODE_LCD_V,\n\n    FT_RENDER_MODE_MAX\n\n  } FT_Render_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_render_mode_xxx                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    These constants are deprecated.  Use the corresponding             */\n  /*    @FT_Render_Mode values instead.                                    */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL                */\n  /*    ft_render_mode_mono   :: see @FT_RENDER_MODE_MONO                  */\n  /*                                                                       */\n#define ft_render_mode_normal  FT_RENDER_MODE_NORMAL\n#define ft_render_mode_mono    FT_RENDER_MODE_MONO\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Render_Glyph                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a given glyph image to a bitmap.  It does so by inspecting */\n  /*    the glyph image format, finding the relevant renderer, and         */\n  /*    invoking it.                                                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    slot        :: A handle to the glyph slot containing the image to  */\n  /*                   convert.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    render_mode :: This is the render mode used to render the glyph    */\n  /*                   image into a bitmap.  See @FT_Render_Mode for a     */\n  /*                   list of possible values.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Render_Glyph( FT_GlyphSlot    slot,\n                   FT_Render_Mode  render_mode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Kerning_Mode                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used to specify which kerning values to return in   */\n  /*    @FT_Get_Kerning.                                                   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_KERNING_DEFAULT  :: Return scaled and grid-fitted kerning       */\n  /*                           distances (value is~0).                     */\n  /*                                                                       */\n  /*    FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning    */\n  /*                           distances.                                  */\n  /*                                                                       */\n  /*    FT_KERNING_UNSCALED :: Return the kerning vector in original font  */\n  /*                           units.                                      */\n  /*                                                                       */\n  typedef enum  FT_Kerning_Mode_\n  {\n    FT_KERNING_DEFAULT  = 0,\n    FT_KERNING_UNFITTED,\n    FT_KERNING_UNSCALED\n\n  } FT_Kerning_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    ft_kerning_default                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This constant is deprecated.  Please use @FT_KERNING_DEFAULT       */\n  /*    instead.                                                           */\n  /*                                                                       */\n#define ft_kerning_default   FT_KERNING_DEFAULT\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    ft_kerning_unfitted                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This constant is deprecated.  Please use @FT_KERNING_UNFITTED      */\n  /*    instead.                                                           */\n  /*                                                                       */\n#define ft_kerning_unfitted  FT_KERNING_UNFITTED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    ft_kerning_unscaled                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This constant is deprecated.  Please use @FT_KERNING_UNSCALED      */\n  /*    instead.                                                           */\n  /*                                                                       */\n#define ft_kerning_unscaled  FT_KERNING_UNSCALED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Kerning                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the kerning vector between two glyphs of a same face.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to a source face object.                   */\n  /*                                                                       */\n  /*    left_glyph  :: The index of the left glyph in the kern pair.       */\n  /*                                                                       */\n  /*    right_glyph :: The index of the right glyph in the kern pair.      */\n  /*                                                                       */\n  /*    kern_mode   :: See @FT_Kerning_Mode for more information.          */\n  /*                   Determines the scale and dimension of the returned  */\n  /*                   kerning vector.                                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    akerning    :: The kerning vector.  This is either in font units   */\n  /*                   or in pixels (26.6 format) for scalable formats,    */\n  /*                   and in pixels for fixed-sizes formats.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only horizontal layouts (left-to-right & right-to-left) are        */\n  /*    supported by this method.  Other layouts, or more sophisticated    */\n  /*    kernings, are out of the scope of this API function -- they can be */\n  /*    implemented through format-specific interfaces.                    */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Kerning( FT_Face     face,\n                  FT_UInt     left_glyph,\n                  FT_UInt     right_glyph,\n                  FT_UInt     kern_mode,\n                  FT_Vector  *akerning );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Track_Kerning                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the track kerning for a given face object at a given size.  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: A handle to a source face object.                    */\n  /*                                                                       */\n  /*    point_size :: The point size in 16.16 fractional points.           */\n  /*                                                                       */\n  /*    degree     :: The degree of tightness.  Increasingly negative      */\n  /*                  values represent tighter track kerning, while        */\n  /*                  increasingly positive values represent looser track  */\n  /*                  kerning.  Value zero means no track kerning.         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    akerning   :: The kerning in 16.16 fractional points, to be        */\n  /*                  uniformly applied between all glyphs.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Currently, only the Type~1 font driver supports track kerning,     */\n  /*    using data from AFM files (if attached with @FT_Attach_File or     */\n  /*    @FT_Attach_Stream).                                                */\n  /*                                                                       */\n  /*    Only very few AFM files come with track kerning data; please refer */\n  /*    to the Adobe's AFM specification for more details.                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Track_Kerning( FT_Face    face,\n                        FT_Fixed   point_size,\n                        FT_Int     degree,\n                        FT_Fixed*  akerning );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Glyph_Name                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the ASCII name of a given glyph in a face.  This only     */\n  /*    works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to a source face object.                   */\n  /*                                                                       */\n  /*    glyph_index :: The glyph index.                                    */\n  /*                                                                       */\n  /*    buffer_max  :: The maximum number of bytes available in the        */\n  /*                   buffer.                                             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    buffer      :: A pointer to a target buffer where the name is      */\n  /*                   copied to.                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An error is returned if the face doesn't provide glyph names or if */\n  /*    the glyph index is invalid.  In all cases of failure, the first    */\n  /*    byte of `buffer' is set to~0 to indicate an empty name.            */\n  /*                                                                       */\n  /*    The glyph name is truncated to fit within the buffer if it is too  */\n  /*    long.  The returned string is always zero-terminated.              */\n  /*                                                                       */\n  /*    Be aware that FreeType reorders glyph indices internally so that   */\n  /*    glyph index~0 always corresponds to the `missing glyph' (called    */\n  /*    `.notdef').                                                        */\n  /*                                                                       */\n  /*    This function is not compiled within the library if the config     */\n  /*    macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in              */\n  /*    `include/freetype/config/ftoptions.h'.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Glyph_Name( FT_Face     face,\n                     FT_UInt     glyph_index,\n                     FT_Pointer  buffer,\n                     FT_UInt     buffer_max );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Postscript_Name                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the ASCII PostScript name of a given face, if available.  */\n  /*    This only works with PostScript and TrueType fonts.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to the face's PostScript name.  NULL if unavailable.     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned pointer is owned by the face and is destroyed with    */\n  /*    it.                                                                */\n  /*                                                                       */\n  FT_EXPORT( const char* )\n  FT_Get_Postscript_Name( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Select_Charmap                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select a given charmap by its encoding tag (as listed in           */\n  /*    `freetype.h').                                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face     :: A handle to the source face object.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    encoding :: A handle to the selected encoding.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function returns an error if no charmap in the face           */\n  /*    corresponds to the encoding queried here.                          */\n  /*                                                                       */\n  /*    Because many fonts contain more than a single cmap for Unicode     */\n  /*    encoding, this function has some special code to select the one    */\n  /*    which covers Unicode best (`best' in the sense that a UCS-4 cmap   */\n  /*    is preferred to a UCS-2 cmap).  It is thus preferable to           */\n  /*    @FT_Set_Charmap in this case.                                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Select_Charmap( FT_Face      face,\n                     FT_Encoding  encoding );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Charmap                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select a given charmap for character code to glyph index mapping.  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face    :: A handle to the source face object.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charmap :: A handle to the selected charmap.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function returns an error if the charmap is not part of       */\n  /*    the face (i.e., if it is not listed in the `face->charmaps'        */\n  /*    table).                                                            */\n  /*                                                                       */\n  /*    It also fails if a type~14 charmap is selected.                    */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Charmap( FT_Face     face,\n                  FT_CharMap  charmap );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Get_Charmap_Index\n   *\n   * @description:\n   *   Retrieve index of a given charmap.\n   *\n   * @input:\n   *   charmap ::\n   *     A handle to a charmap.\n   *\n   * @return:\n   *   The index into the array of character maps within the face to which\n   *   `charmap' belongs.  If an error occurs, -1 is returned.\n   *\n   */\n  FT_EXPORT( FT_Int )\n  FT_Get_Charmap_Index( FT_CharMap  charmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Char_Index                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the glyph index of a given character code.  This function   */\n  /*    uses a charmap object to do the mapping.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the source face object.                    */\n  /*                                                                       */\n  /*    charcode :: The character code.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The glyph index.  0~means `undefined character code'.              */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If you use FreeType to manipulate the contents of font files       */\n  /*    directly, be aware that the glyph index returned by this function  */\n  /*    doesn't always correspond to the internal indices used within the  */\n  /*    file.  This is done to ensure that value~0 always corresponds to   */\n  /*    the `missing glyph'.  If the first glyph is not named `.notdef',   */\n  /*    then for Type~1 and Type~42 fonts, `.notdef' will be moved into    */\n  /*    the glyph ID~0 position, and whatever was there will be moved to   */\n  /*    the position `.notdef' had.  For Type~1 fonts, if there is no      */\n  /*    `.notdef' glyph at all, then one will be created at index~0 and    */\n  /*    whatever was there will be moved to the last index -- Type~42      */\n  /*    fonts are considered invalid under this condition.                 */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Get_Char_Index( FT_Face   face,\n                     FT_ULong  charcode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_First_Char                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to return the first character code in the    */\n  /*    current charmap of a given face.  It also returns the              */\n  /*    corresponding glyph index.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: A handle to the source face object.                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    agindex :: Glyph index of first character code.  0~if charmap is   */\n  /*               empty.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The charmap's first character code.                                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should use this function with @FT_Get_Next_Char to be able to  */\n  /*    parse all character codes available in a given charmap.  The code  */\n  /*    should look like this:                                             */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      FT_ULong  charcode;                                              */\n  /*      FT_UInt   gindex;                                                */\n  /*                                                                       */\n  /*                                                                       */\n  /*      charcode = FT_Get_First_Char( face, &gindex );                   */\n  /*      while ( gindex != 0 )                                            */\n  /*      {                                                                */\n  /*        ... do something with (charcode,gindex) pair ...               */\n  /*                                                                       */\n  /*        charcode = FT_Get_Next_Char( face, charcode, &gindex );        */\n  /*      }                                                                */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Note that `*agindex' is set to~0 if the charmap is empty.  The     */\n  /*    result itself can be~0 in two cases: if the charmap is empty or    */\n  /*    if the value~0 is the first valid character code.                  */\n  /*                                                                       */\n  FT_EXPORT( FT_ULong )\n  FT_Get_First_Char( FT_Face   face,\n                     FT_UInt  *agindex );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Next_Char                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to return the next character code in the     */\n  /*    current charmap of a given face following the value `char_code',   */\n  /*    as well as the corresponding glyph index.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face      :: A handle to the source face object.                   */\n  /*    char_code :: The starting character code.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    agindex   :: Glyph index of next character code.  0~if charmap     */\n  /*                 is empty.                                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The charmap's next character code.                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should use this function with @FT_Get_First_Char to walk       */\n  /*    over all character codes available in a given charmap.  See the    */\n  /*    note for this function for a simple code example.                  */\n  /*                                                                       */\n  /*    Note that `*agindex' is set to~0 when there are no more codes in   */\n  /*    the charmap.                                                       */\n  /*                                                                       */\n  FT_EXPORT( FT_ULong )\n  FT_Get_Next_Char( FT_Face    face,\n                    FT_ULong   char_code,\n                    FT_UInt   *agindex );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Name_Index                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the glyph index of a given glyph name.  This function uses  */\n  /*    driver specific objects to do the translation.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: A handle to the source face object.                  */\n  /*                                                                       */\n  /*    glyph_name :: The glyph name.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The glyph index.  0~means `undefined character code'.              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Get_Name_Index( FT_Face     face,\n                     FT_String*  glyph_name );\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_SUBGLYPH_FLAG_XXX\n   *\n   * @description:\n   *   A list of constants used to describe subglyphs.  Please refer to the\n   *   TrueType specification for the meaning of the various flags.\n   *\n   * @values:\n   *   FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::\n   *   FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::\n   *   FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::\n   *   FT_SUBGLYPH_FLAG_SCALE ::\n   *   FT_SUBGLYPH_FLAG_XY_SCALE ::\n   *   FT_SUBGLYPH_FLAG_2X2 ::\n   *   FT_SUBGLYPH_FLAG_USE_MY_METRICS ::\n   *\n   */\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2\n#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4\n#define FT_SUBGLYPH_FLAG_SCALE                   8\n#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40\n#define FT_SUBGLYPH_FLAG_2X2                  0x80\n#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200\n\n\n  /*************************************************************************\n   *\n   * @func:\n   *   FT_Get_SubGlyph_Info\n   *\n   * @description:\n   *   Retrieve a description of a given subglyph.  Only use it if\n   *   `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is\n   *   returned otherwise.\n   *\n   * @input:\n   *   glyph ::\n   *     The source glyph slot.\n   *\n   *   sub_index ::\n   *     The index of the subglyph.  Must be less than\n   *     `glyph->num_subglyphs'.\n   *\n   * @output:\n   *   p_index ::\n   *     The glyph index of the subglyph.\n   *\n   *   p_flags ::\n   *     The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.\n   *\n   *   p_arg1 ::\n   *     The subglyph's first argument (if any).\n   *\n   *   p_arg2 ::\n   *     The subglyph's second argument (if any).\n   *\n   *   p_transform ::\n   *     The subglyph transformation (if any).\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   The values of `*p_arg1', `*p_arg2', and `*p_transform' must be\n   *   interpreted depending on the flags returned in `*p_flags'.  See the\n   *   TrueType specification for details.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,\n                        FT_UInt       sub_index,\n                        FT_Int       *p_index,\n                        FT_UInt      *p_flags,\n                        FT_Int       *p_arg1,\n                        FT_Int       *p_arg2,\n                        FT_Matrix    *p_transform );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_FSTYPE_XXX                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit flags used in the `fsType' field of the OS/2 table   */\n  /*    in a TrueType or OpenType font and the `FSType' entry in a         */\n  /*    PostScript font.  These bit flags are returned by                  */\n  /*    @FT_Get_FSType_Flags; they inform client applications of embedding */\n  /*    and subsetting restrictions associated with a font.                */\n  /*                                                                       */\n  /*    See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for  */\n  /*    more details.                                                      */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING ::                                 */\n  /*      Fonts with no fsType bit set may be embedded and permanently     */\n  /*      installed on the remote system by an application.                */\n  /*                                                                       */\n  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING ::                          */\n  /*      Fonts that have only this bit set must not be modified, embedded */\n  /*      or exchanged in any manner without first obtaining permission of */\n  /*      the font software copyright owner.                               */\n  /*                                                                       */\n  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING ::                           */\n  /*      If this bit is set, the font may be embedded and temporarily     */\n  /*      loaded on the remote system.  Documents containing Preview &     */\n  /*      Print fonts must be opened `read-only'; no edits can be applied  */\n  /*      to the document.                                                 */\n  /*                                                                       */\n  /*    FT_FSTYPE_EDITABLE_EMBEDDING ::                                    */\n  /*      If this bit is set, the font may be embedded but must only be    */\n  /*      installed temporarily on other systems.  In contrast to Preview  */\n  /*      & Print fonts, documents containing editable fonts may be opened */\n  /*      for reading, editing is permitted, and changes may be saved.     */\n  /*                                                                       */\n  /*    FT_FSTYPE_NO_SUBSETTING ::                                         */\n  /*      If this bit is set, the font may not be subsetted prior to       */\n  /*      embedding.                                                       */\n  /*                                                                       */\n  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY ::                                 */\n  /*      If this bit is set, only bitmaps contained in the font may be    */\n  /*      embedded; no outline data may be embedded.  If there are no      */\n  /*      bitmaps available in the font, then the font is unembeddable.    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    While the fsType flags can indicate that a font may be embedded, a */\n  /*    license with the font vendor may be separately required to use the */\n  /*    font in this way.                                                  */\n  /*                                                                       */\n#define FT_FSTYPE_INSTALLABLE_EMBEDDING         0x0000\n#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING  0x0002\n#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING   0x0004\n#define FT_FSTYPE_EDITABLE_EMBEDDING            0x0008\n#define FT_FSTYPE_NO_SUBSETTING                 0x0100\n#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY         0x0200\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_FSType_Flags                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the fsType flags for a font.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The fsType flags, @FT_FSTYPE_XXX.                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Use this function rather than directly reading the `fs_type' field */\n  /*    in the @PS_FontInfoRec structure which is only guaranteed to       */\n  /*    return the correct results for Type~1 fonts.                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.8                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UShort )\n  FT_Get_FSType_Flags( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    glyph_variants                                                     */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Glyph Variants                                                     */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    The FreeType~2 interface to Unicode Ideographic Variation          */\n  /*    Sequences (IVS), using the SFNT cmap format~14.                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Many CJK characters have variant forms.  They are a sort of grey   */\n  /*    area somewhere between being totally irrelevant and semantically   */\n  /*    distinct; for this reason, the Unicode consortium decided to       */\n  /*    introduce Ideographic Variation Sequences (IVS), consisting of a   */\n  /*    Unicode base character and one of 240 variant selectors            */\n  /*    (U+E0100-U+E01EF), instead of further extending the already huge   */\n  /*    code range for CJK characters.                                     */\n  /*                                                                       */\n  /*    An IVS is registered and unique; for further details please refer  */\n  /*    to Unicode Technical Standard #37, the Ideographic Variation       */\n  /*    Database:                                                          */\n  /*                                                                       */\n  /*      http://www.unicode.org/reports/tr37/                             */\n  /*                                                                       */\n  /*    To date (November 2012), the character with the most variants is   */\n  /*    U+9089, having 31 such IVS.                                        */\n  /*                                                                       */\n  /*    Adobe and MS decided to support IVS with a new cmap subtable       */\n  /*    (format~14).  It is an odd subtable because it is not a mapping of */\n  /*    input code points to glyphs, but contains lists of all variants    */\n  /*    supported by the font.                                             */\n  /*                                                                       */\n  /*    A variant may be either `default' or `non-default'.  A default     */\n  /*    variant is the one you will get for that code point if you look it */\n  /*    up in the standard Unicode cmap.  A non-default variant is a       */\n  /*    different glyph.                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetCharVariantIndex                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the glyph index of a given character code as modified by    */\n  /*    the variation selector.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    charcode ::                                                        */\n  /*      The character code point in Unicode.                             */\n  /*                                                                       */\n  /*    variantSelector ::                                                 */\n  /*      The Unicode code point of the variation selector.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The glyph index.  0~means either `undefined character code', or    */\n  /*    `undefined selector code', or `no variation selector cmap          */\n  /*    subtable', or `current CharMap is not Unicode'.                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If you use FreeType to manipulate the contents of font files       */\n  /*    directly, be aware that the glyph index returned by this function  */\n  /*    doesn't always correspond to the internal indices used within      */\n  /*    the file.  This is done to ensure that value~0 always corresponds  */\n  /*    to the `missing glyph'.                                            */\n  /*                                                                       */\n  /*    This function is only meaningful if                                */\n  /*      a) the font has a variation selector cmap sub table,             */\n  /*    and                                                                */\n  /*      b) the current charmap has a Unicode encoding.                   */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Face_GetCharVariantIndex( FT_Face   face,\n                               FT_ULong  charcode,\n                               FT_ULong  variantSelector );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetCharVariantIsDefault                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check whether this variant of this Unicode character is the one to */\n  /*    be found in the `cmap'.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    charcode ::                                                        */\n  /*      The character codepoint in Unicode.                              */\n  /*                                                                       */\n  /*    variantSelector ::                                                 */\n  /*      The Unicode codepoint of the variation selector.                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    1~if found in the standard (Unicode) cmap, 0~if found in the       */\n  /*    variation selector cmap, or -1 if it is not a variant.             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is only meaningful if the font has a variation       */\n  /*    selector cmap subtable.                                            */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Int )\n  FT_Face_GetCharVariantIsDefault( FT_Face   face,\n                                   FT_ULong  charcode,\n                                   FT_ULong  variantSelector );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetVariantSelectors                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a zero-terminated list of Unicode variant selectors found   */\n  /*    in the font.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to an array of selector code points, or NULL if there is */\n  /*    no valid variant selector cmap subtable.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The last item in the array is~0; the array is owned by the         */\n  /*    @FT_Face object but can be overwritten or released on the next     */\n  /*    call to a FreeType function.                                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt32* )\n  FT_Face_GetVariantSelectors( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetVariantsOfChar                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a zero-terminated list of Unicode variant selectors found   */\n  /*    for the specified character code.                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    charcode ::                                                        */\n  /*      The character codepoint in Unicode.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to an array of variant selector code points which are    */\n  /*    active for the given character, or NULL if the corresponding list  */\n  /*    is empty.                                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The last item in the array is~0; the array is owned by the         */\n  /*    @FT_Face object but can be overwritten or released on the next     */\n  /*    call to a FreeType function.                                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt32* )\n  FT_Face_GetVariantsOfChar( FT_Face   face,\n                             FT_ULong  charcode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_GetCharsOfVariant                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a zero-terminated list of Unicode character codes found for */\n  /*    the specified variant selector.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      A handle to the source face object.                              */\n  /*                                                                       */\n  /*    variantSelector ::                                                 */\n  /*      The variant selector code point in Unicode.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A list of all the code points which are specified by this selector */\n  /*    (both default and non-default codes are returned) or NULL if there */\n  /*    is no valid cmap or the variant selector is invalid.               */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The last item in the array is~0; the array is owned by the         */\n  /*    @FT_Face object but can be overwritten or released on the next     */\n  /*    call to a FreeType function.                                       */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.6                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt32* )\n  FT_Face_GetCharsOfVariant( FT_Face   face,\n                             FT_ULong  variantSelector );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    computations                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Computations                                                       */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Crunching fixed numbers and vectors.                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains various functions used to perform            */\n  /*    computations on 16.16 fixed-float numbers or 2d vectors.           */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_MulDiv                                                          */\n  /*    FT_MulFix                                                          */\n  /*    FT_DivFix                                                          */\n  /*    FT_RoundFix                                                        */\n  /*    FT_CeilFix                                                         */\n  /*    FT_FloorFix                                                        */\n  /*    FT_Vector_Transform                                                */\n  /*    FT_Matrix_Multiply                                                 */\n  /*    FT_Matrix_Invert                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_MulDiv                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation `(a*b)/c'   */\n  /*    with maximum accuracy (it uses a 64-bit intermediate integer       */\n  /*    whenever necessary).                                               */\n  /*                                                                       */\n  /*    This function isn't necessarily as fast as some processor specific */\n  /*    operations, but is at least completely portable.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.                                        */\n  /*    c :: The divisor.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*b)/c'.  This function never traps when trying to */\n  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */\n  /*    on the signs of `a' and `b'.                                       */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_MulDiv( FT_Long  a,\n             FT_Long  b,\n             FT_Long  c );\n\n\n  /* */\n\n  /* The following #if 0 ... #endif is for the documentation formatter, */\n  /* hiding the internal `FT_MULFIX_INLINED' macro.                     */\n\n#if 0\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_MulFix                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation             */\n  /*    `(a*b)/0x10000' with maximum accuracy.  Most of the time this is   */\n  /*    used to multiply a given value by a 16.16 fixed-point factor.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */\n  /*         possible (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*b)/0x10000'.                                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function has been optimized for the case where the absolute   */\n  /*    value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */\n  /*    As this happens mainly when scaling from notional units to         */\n  /*    fractional pixels in FreeType, it resulted in noticeable speed     */\n  /*    improvements between versions 2.x and 1.x.                         */\n  /*                                                                       */\n  /*    As a conclusion, always try to place a 16.16 factor as the         */\n  /*    _second_ argument of this function; this can make a great          */\n  /*    difference.                                                        */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b );\n\n  /* */\n#endif\n\n#ifdef FT_MULFIX_INLINED\n#define FT_MulFix( a, b )  FT_MULFIX_INLINED( a, b )\n#else\n  FT_EXPORT( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b );\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_DivFix                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation             */\n  /*    `(a*0x10000)/b' with maximum accuracy.  Most of the time, this is  */\n  /*    used to divide a given value by a 16.16 fixed-point factor.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */\n  /*         possible (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*0x10000)/b'.                                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The optimization for FT_DivFix() is simple: If (a~<<~16) fits in   */\n  /*    32~bits, then the division is computed directly.  Otherwise, we    */\n  /*    use a specialized version of @FT_MulDiv.                           */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_DivFix( FT_Long  a,\n             FT_Long  b );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_RoundFix                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to round a 16.16 fixed number.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The number to be rounded.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a + 0x8000) & -0x10000'.                           */\n  /*                                                                       */\n  FT_EXPORT( FT_Fixed )\n  FT_RoundFix( FT_Fixed  a );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_CeilFix                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to compute the ceiling function of a   */\n  /*    16.16 fixed number.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The number for which the ceiling function is to be computed.  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a + 0x10000 - 1) & -0x10000'.                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Fixed )\n  FT_CeilFix( FT_Fixed  a );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_FloorFix                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to compute the floor function of a     */\n  /*    16.16 fixed number.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The number for which the floor function is to be computed.    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `a & -0x10000'.                                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Fixed )\n  FT_FloorFix( FT_Fixed  a );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Vector_Transform                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Transform a single vector through a 2x2 matrix.                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    vector :: The target vector to transform.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix :: A pointer to the source 2x2 matrix.                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The result is undefined if either `vector' or `matrix' is invalid. */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Vector_Transform( FT_Vector*        vec,\n                       const FT_Matrix*  matrix );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    version                                                            */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    FreeType Version                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Functions and macros related to FreeType versions.                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Note that those functions and macros are of limited use because    */\n  /*    even a new release of FreeType with only documentation changes     */\n  /*    increases the version number.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FREETYPE_XXX\n   *\n   * @description:\n   *   These three macros identify the FreeType source code version.\n   *   Use @FT_Library_Version to access them at runtime.\n   *\n   * @values:\n   *   FREETYPE_MAJOR :: The major version number.\n   *   FREETYPE_MINOR :: The minor version number.\n   *   FREETYPE_PATCH :: The patch level.\n   *\n   * @note:\n   *   The version number of FreeType if built as a dynamic link library\n   *   with the `libtool' package is _not_ controlled by these three\n   *   macros.\n   *\n   */\n#define FREETYPE_MAJOR  2\n#define FREETYPE_MINOR  4\n#define FREETYPE_PATCH  12\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Library_Version                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the version of the FreeType library being used.  This is    */\n  /*    useful when dynamically linking to the library, since one cannot   */\n  /*    use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and               */\n  /*    @FREETYPE_PATCH.                                                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A source library handle.                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amajor  :: The major version number.                               */\n  /*                                                                       */\n  /*    aminor  :: The minor version number.                               */\n  /*                                                                       */\n  /*    apatch  :: The patch version number.                               */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The reason why this function takes a `library' argument is because */\n  /*    certain programs implement library initialization in a custom way  */\n  /*    that doesn't use @FT_Init_FreeType.                                */\n  /*                                                                       */\n  /*    In such cases, the library version might not be available before   */\n  /*    the library object has been created.                               */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Library_Version( FT_Library   library,\n                      FT_Int      *amajor,\n                      FT_Int      *aminor,\n                      FT_Int      *apatch );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_CheckTrueTypePatents                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parse all bytecode instructions of a TrueType font file to check   */\n  /*    whether any of the patented opcodes are used.  This is only useful */\n  /*    if you want to be able to use the unpatented hinter with           */\n  /*    fonts that do *not* use these opcodes.                             */\n  /*                                                                       */\n  /*    Note that this function parses *all* glyph instructions in the     */\n  /*    font file, which may be slow.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A face handle.                                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    1~if this is a TrueType font that uses one of the patented         */\n  /*    opcodes, 0~otherwise.                                              */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since May 2010, TrueType hinting is no longer patented.            */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.5                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Bool )\n  FT_Face_CheckTrueTypePatents( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Face_SetUnpatentedHinting                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Enable or disable the unpatented hinter for a given face.          */\n  /*    Only enable it if you have determined that the face doesn't        */\n  /*    use any patented opcodes (see @FT_Face_CheckTrueTypePatents).      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face  :: A face handle.                                            */\n  /*                                                                       */\n  /*    value :: New boolean setting.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The old setting value.  This will always be false if this is not   */\n  /*    an SFNT font, or if the unpatented hinter is not compiled in this  */\n  /*    instance of the library.                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since May 2010, TrueType hinting is no longer patented.            */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.3.5                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Bool )\n  FT_Face_SetUnpatentedHinting( FT_Face  face,\n                                FT_Bool  value );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FREETYPE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftadvanc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftadvanc.h                                                             */\n/*                                                                         */\n/*    Quick computation of advance widths (specification only).            */\n/*                                                                         */\n/*  Copyright 2008 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTADVANC_H__\n#define __FTADVANC_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   quick_advance\n   *\n   * @title:\n   *   Quick retrieval of advance values\n   *\n   * @abstract:\n   *   Retrieve horizontal and vertical advance values without processing\n   *   glyph outlines, if possible.\n   *\n   * @description:\n   *   This section contains functions to quickly extract advance values\n   *   without handling glyph outlines, if possible.\n   */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Const>                                                               */\n  /*    FT_ADVANCE_FLAG_FAST_ONLY                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A bit-flag to be OR-ed with the `flags' parameter of the           */\n  /*    @FT_Get_Advance and @FT_Get_Advances functions.                    */\n  /*                                                                       */\n  /*    If set, it indicates that you want these functions to fail if the  */\n  /*    corresponding hinting mode or font driver doesn't allow for very   */\n  /*    quick advance computation.                                         */\n  /*                                                                       */\n  /*    Typically, glyphs which are either unscaled, unhinted, bitmapped,  */\n  /*    or light-hinted can have their advance width computed very         */\n  /*    quickly.                                                           */\n  /*                                                                       */\n  /*    Normal and bytecode hinted modes, which require loading, scaling,  */\n  /*    and hinting of the glyph outline, are extremely slow by            */\n  /*    comparison.                                                        */\n  /*                                                                       */\n#define FT_ADVANCE_FLAG_FAST_ONLY  0x20000000UL\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Advance                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the advance value of a given glyph outline in an          */\n  /*    @FT_Face.  By default, the unhinted advance is returned in font    */\n  /*    units.                                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: The source @FT_Face handle.                          */\n  /*                                                                       */\n  /*    gindex     :: The glyph index.                                     */\n  /*                                                                       */\n  /*    load_flags :: A set of bit flags similar to those used when        */\n  /*                  calling @FT_Load_Glyph, used to determine what kind  */\n  /*                  of advances you need.                                */\n  /* <Output>                                                              */\n  /*    padvance :: The advance value, in either font units or 16.16       */\n  /*                format.                                                */\n  /*                                                                       */\n  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, this is the        */\n  /*                vertical advance corresponding to a vertical layout.   */\n  /*                Otherwise, it is the horizontal advance in a           */\n  /*                horizontal layout.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */\n  /*    if the corresponding font backend doesn't have a quick way to      */\n  /*    retrieve the advances.                                             */\n  /*                                                                       */\n  /*    A scaled advance is returned in 16.16 format but isn't transformed */\n  /*    by the affine transformation specified by @FT_Set_Transform.       */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Advance( FT_Face    face,\n                  FT_UInt    gindex,\n                  FT_Int32   load_flags,\n                  FT_Fixed  *padvance );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Advances                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the advance values of several glyph outlines in an        */\n  /*    @FT_Face.  By default, the unhinted advances are returned in font  */\n  /*    units.                                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: The source @FT_Face handle.                         */\n  /*                                                                       */\n  /*    start       :: The first glyph index.                              */\n  /*                                                                       */\n  /*    count       :: The number of advance values you want to retrieve.  */\n  /*                                                                       */\n  /*    load_flags  :: A set of bit flags similar to those used when       */\n  /*                   calling @FT_Load_Glyph.                             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    padvance :: The advances, in either font units or 16.16 format.    */\n  /*                This array must contain at least `count' elements.     */\n  /*                                                                       */\n  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, these are the      */\n  /*                vertical advances corresponding to a vertical layout.  */\n  /*                Otherwise, they are the horizontal advances in a       */\n  /*                horizontal layout.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */\n  /*    if the corresponding font backend doesn't have a quick way to      */\n  /*    retrieve the advances.                                             */\n  /*                                                                       */\n  /*    Scaled advances are returned in 16.16 format but aren't            */\n  /*    transformed by the affine transformation specified by              */\n  /*    @FT_Set_Transform.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Advances( FT_Face    face,\n                   FT_UInt    start,\n                   FT_UInt    count,\n                   FT_Int32   load_flags,\n                   FT_Fixed  *padvances );\n\n/* */\n\n\nFT_END_HEADER\n\n#endif /* __FTADVANC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftautoh.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftautoh.h                                                              */\n/*                                                                         */\n/*    FreeType API for controlling the auto-hinter (specification only).   */\n/*                                                                         */\n/*  Copyright 2012 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTAUTOH_H__\n#define __FTAUTOH_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   auto_hinter\n   *\n   * @title:\n   *   The auto-hinter\n   *\n   * @abstract:\n   *   Controlling the auto-hinting module.\n   *\n   * @description:\n   *   While FreeType's auto-hinter doesn't expose API functions by itself,\n   *   it is possible to control its behaviour with @FT_Property_Set and\n   *   @FT_Property_Get.  The following lists the available properties\n   *   together with the necessary macros and structures.\n   *\n   *   Note that the auto-hinter's module name is `autofitter' for\n   *   historical reasons.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   glyph-to-script-map\n   *\n   * @description:\n   *   The auto-hinter provides various script modules to hint glyphs.\n   *   Examples of supported scripts are Latin or CJK.  Before a glyph is\n   *   auto-hinted, the Unicode character map of the font gets examined, and\n   *   the script is then determined based on Unicode character ranges, see\n   *   below.\n   *\n   *   OpenType fonts, however, often provide much more glyphs than\n   *   character codes (small caps, superscripts, ligatures, swashes, etc.),\n   *   to be controlled by so-called `features'.  Handling OpenType features\n   *   can be quite complicated and thus needs a separate library on top of\n   *   FreeType.\n   *\n   *   The mapping between glyph indices and scripts (in the auto-hinter\n   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an\n   *   array with `num_glyphs' elements, as found in the font's @FT_Face\n   *   structure.  The `glyph-to-script-map' property returns a pointer to\n   *   this array which can be modified as needed.  Note that the\n   *   modification should happen before the first glyph gets processed by\n   *   the auto-hinter so that the global analysis of the font shapes\n   *   actually uses the modified mapping.\n   *\n   *   The following example code demonstrates how to access it (omitting\n   *   the error handling).\n   *\n   *   {\n   *     FT_Library                library;\n   *     FT_Face                   face;\n   *     FT_Prop_GlyphToScriptMap  prop;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *     FT_New_Face( library, \"foo.ttf\", 0, &face );\n   *\n   *     prop.face = face;\n   *\n   *     FT_Property_Get( library, \"autofitter\",\n   *                               \"glyph-to-script-map\", &prop );\n   *\n   *     // adjust `prop.map' as needed right here\n   *\n   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );\n   *   }\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   FT_AUTOHINTER_SCRIPT_XXX\n   *\n   * @description:\n   *   A list of constants used for the @glyph-to-script-map property to\n   *   specify the script submodule the auto-hinter should use for hinting a\n   *   particular glyph.\n   *\n   * @values:\n   *   FT_AUTOHINTER_SCRIPT_NONE ::\n   *     Don't auto-hint this glyph.\n   *\n   *   FT_AUTOHINTER_SCRIPT_LATIN ::\n   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a\n   *     very broad term, including Cyrillic and Greek also since characters\n   *     from those scripts share the same design constraints.\n   *\n   *     By default, characters from the following Unicode ranges are\n   *     assigned to this submodule.\n   *\n   *     {\n   *       U+0020 - U+007F  // Basic Latin (no control characters)\n   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)\n   *       U+0100 - U+017F  // Latin Extended-A\n   *       U+0180 - U+024F  // Latin Extended-B\n   *       U+0250 - U+02AF  // IPA Extensions\n   *       U+02B0 - U+02FF  // Spacing Modifier Letters\n   *       U+0300 - U+036F  // Combining Diacritical Marks\n   *       U+0370 - U+03FF  // Greek and Coptic\n   *       U+0400 - U+04FF  // Cyrillic\n   *       U+0500 - U+052F  // Cyrillic Supplement\n   *       U+1D00 - U+1D7F  // Phonetic Extensions\n   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement\n   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement\n   *       U+1E00 - U+1EFF  // Latin Extended Additional\n   *       U+1F00 - U+1FFF  // Greek Extended\n   *       U+2000 - U+206F  // General Punctuation\n   *       U+2070 - U+209F  // Superscripts and Subscripts\n   *       U+20A0 - U+20CF  // Currency Symbols\n   *       U+2150 - U+218F  // Number Forms\n   *       U+2460 - U+24FF  // Enclosed Alphanumerics\n   *       U+2C60 - U+2C7F  // Latin Extended-C\n   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A\n   *       U+2E00 - U+2E7F  // Supplemental Punctuation\n   *       U+A640 - U+A69F  // Cyrillic Extended-B\n   *       U+A720 - U+A7FF  // Latin Extended-D\n   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)\n   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols\n   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement\n   *     }\n   *\n   *   FT_AUTOHINTER_SCRIPT_CJK ::\n   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old\n   *     Vietnamese, and some other scripts.\n   *\n   *     By default, characters from the following Unicode ranges are\n   *     assigned to this submodule.\n   *\n   *     {\n   *       U+1100 - U+11FF  // Hangul Jamo\n   *       U+2E80 - U+2EFF  // CJK Radicals Supplement\n   *       U+2F00 - U+2FDF  // Kangxi Radicals\n   *       U+2FF0 - U+2FFF  // Ideographic Description Characters\n   *       U+3000 - U+303F  // CJK Symbols and Punctuation\n   *       U+3040 - U+309F  // Hiragana\n   *       U+30A0 - U+30FF  // Katakana\n   *       U+3100 - U+312F  // Bopomofo\n   *       U+3130 - U+318F  // Hangul Compatibility Jamo\n   *       U+3190 - U+319F  // Kanbun\n   *       U+31A0 - U+31BF  // Bopomofo Extended\n   *       U+31C0 - U+31EF  // CJK Strokes\n   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions\n   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months\n   *       U+3300 - U+33FF  // CJK Compatibility\n   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A\n   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols\n   *       U+4E00 - U+9FFF  // CJK Unified Ideographs\n   *       U+A960 - U+A97F  // Hangul Jamo Extended-A\n   *       U+AC00 - U+D7AF  // Hangul Syllables\n   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B\n   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs\n   *       U+FE10 - U+FE1F  // Vertical forms\n   *       U+FE30 - U+FE4F  // CJK Compatibility Forms\n   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms\n   *      U+1B000 - U+1B0FF // Kana Supplement\n   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols\n   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement\n   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B\n   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C\n   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D\n   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement\n   *     }\n   *\n   *   FT_AUTOHINTER_SCRIPT_INDIC ::\n   *     Apply the indic auto-hinter, covering all major scripts from the\n   *     Indian sub-continent and some other related scripts like Thai, Lao,\n   *     or Tibetan.\n   *\n   *     By default, characters from the following Unicode ranges are\n   *     assigned to this submodule.\n   *\n   *     {\n   *       U+0900 - U+0DFF  // Indic Range\n   *       U+0F00 - U+0FFF  // Tibetan\n   *       U+1900 - U+194F  // Limbu\n   *       U+1B80 - U+1BBF  // Sundanese\n   *       U+1C80 - U+1CDF  // Meetei Mayak\n   *       U+A800 - U+A82F  // Syloti Nagri\n   *      U+11800 - U+118DF // Sharada\n   *     }\n   *\n   *     Note that currently Indic support is rudimentary only, missing blue\n   *     zone support.\n   *\n   */\n#define FT_AUTOHINTER_SCRIPT_NONE   0\n#define FT_AUTOHINTER_SCRIPT_LATIN  1\n#define FT_AUTOHINTER_SCRIPT_CJK    2\n#define FT_AUTOHINTER_SCRIPT_INDIC  3\n\n\n  /**************************************************************************\n   *\n   * @struct:\n   *   FT_Prop_GlyphToScriptMap\n   *\n   * @description:\n   *   The data exchange structure for the @glyph-to-script-map property.\n   *\n   */\n   typedef struct  FT_Prop_GlyphToScriptMap_\n   {\n     FT_Face   face;\n     FT_Byte*  map;\n\n   } FT_Prop_GlyphToScriptMap;\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   fallback-script\n   *\n   * @description:\n   *   If no auto-hinter script module can be assigned to a glyph, a\n   *   fallback script gets assigned to it (see also the\n   *   @glyph-to-script-map property).  By default, this is\n   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,\n   *   this fallback value can be changed.\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"autofitter\",\n   *                               \"fallback-script\", &fallback_script );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   *   It's important to use the right timing for changing this value: The\n   *   creation of the glyph-to-script map which eventually uses the\n   *   fallback script value gets triggered either by setting or reading a\n   *   face-specific property like @glyph-to-script-map, or by auto-hinting\n   *   any glyph from that face.  In particular, if you have already created\n   *   an @FT_Face structure but not loaded any glyph (using the\n   *   auto-hinter), a change of the fallback glyph will affect this face.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   increase-x-height\n   *\n   * @description:\n   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round\n   *   up the font's x~height much more often than normally.  If the value\n   *   is set to~0, which is the default, this feature is switched off.  Use\n   *   this property to improve the legibility of small font sizes if\n   *   necessary.\n   *\n   *   {\n   *     FT_Library               library;\n   *     FT_Face                  face;\n   *     FT_Prop_IncreaseXHeight  prop;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *     FT_New_Face( library, \"foo.ttf\", 0, &face );\n   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );\n   *\n   *     prop.face  = face;\n   *     prop.limit = 14;\n   *\n   *     FT_Property_Set( library, \"autofitter\",\n   *                               \"increase-x-height\", &prop );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   *   Set this value right after calling @FT_Set_Char_Size, but before\n   *   loading any glyph (using the auto-hinter).\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @struct:\n   *   FT_Prop_IncreaseXHeight\n   *\n   * @description:\n   *   The data exchange structure for the @increase-x-height property.\n   *\n   */\n   typedef struct  FT_Prop_IncreaseXHeight_\n   {\n     FT_Face  face;\n     FT_UInt  limit;\n\n   } FT_Prop_IncreaseXHeight;\n\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTAUTOH_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftbbox.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbbox.h                                                               */\n/*                                                                         */\n/*    FreeType exact bbox computation (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2007, 2011 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This component has a _single_ role: to compute exact outline bounding */\n  /* boxes.                                                                */\n  /*                                                                       */\n  /* It is separated from the rest of the engine for various technical     */\n  /* reasons.  It may well be integrated in `ftoutln' later.               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTBBOX_H__\n#define __FTBBOX_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    outline_processing                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Get_BBox                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the exact bounding box of an outline.  This is slower      */\n  /*    than computing the control box.  However, it uses an advanced      */\n  /*    algorithm which returns _very_ quickly when the two boxes          */\n  /*    coincide.  Otherwise, the outline Bézier arcs are traversed to     */\n  /*    extract their extrema.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline :: A pointer to the source outline.                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    abbox   :: The outline's exact bounding box.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If the font is tricky and the glyph has been loaded with           */\n  /*    @FT_LOAD_NO_SCALE, the resulting BBox is meaningless.  To get      */\n  /*    reasonable values for the BBox it is necessary to load the glyph   */\n  /*    at a large ppem value (so that the hinting instructions can        */\n  /*    properly shift and scale the subglyphs), then extracting the BBox  */\n  /*    which can be eventually converted back to font units.              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Get_BBox( FT_Outline*  outline,\n                       FT_BBox     *abbox );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTBBOX_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftbdf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbdf.h                                                                */\n/*                                                                         */\n/*    FreeType API for accessing BDF-specific strings (specification).     */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006, 2009 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBDF_H__\n#define __FTBDF_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    bdf_fonts                                                          */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    BDF and PCF Files                                                  */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    BDF and PCF specific API.                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of functions specific to BDF */\n  /*    and PCF fonts.                                                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /**********************************************************************\n   *\n   * @enum:\n   *    FT_PropertyType\n   *\n   * @description:\n   *    A list of BDF property types.\n   *\n   * @values:\n   *    BDF_PROPERTY_TYPE_NONE ::\n   *      Value~0 is used to indicate a missing property.\n   *\n   *    BDF_PROPERTY_TYPE_ATOM ::\n   *      Property is a string atom.\n   *\n   *    BDF_PROPERTY_TYPE_INTEGER ::\n   *      Property is a 32-bit signed integer.\n   *\n   *    BDF_PROPERTY_TYPE_CARDINAL ::\n   *      Property is a 32-bit unsigned integer.\n   */\n  typedef enum  BDF_PropertyType_\n  {\n    BDF_PROPERTY_TYPE_NONE     = 0,\n    BDF_PROPERTY_TYPE_ATOM     = 1,\n    BDF_PROPERTY_TYPE_INTEGER  = 2,\n    BDF_PROPERTY_TYPE_CARDINAL = 3\n\n  } BDF_PropertyType;\n\n\n  /**********************************************************************\n   *\n   * @type:\n   *    BDF_Property\n   *\n   * @description:\n   *    A handle to a @BDF_PropertyRec structure to model a given\n   *    BDF/PCF property.\n   */\n  typedef struct BDF_PropertyRec_*  BDF_Property;\n\n\n /**********************************************************************\n  *\n  * @struct:\n  *    BDF_PropertyRec\n  *\n  * @description:\n  *    This structure models a given BDF/PCF property.\n  *\n  * @fields:\n  *    type ::\n  *      The property type.\n  *\n  *    u.atom ::\n  *      The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.\n  *\n  *    u.integer ::\n  *      A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.\n  *\n  *    u.cardinal ::\n  *      An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.\n  */\n  typedef struct  BDF_PropertyRec_\n  {\n    BDF_PropertyType  type;\n    union {\n      const char*     atom;\n      FT_Int32        integer;\n      FT_UInt32       cardinal;\n\n    } u;\n\n  } BDF_PropertyRec;\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_BDF_Charset_ID\n  *\n  * @description:\n  *    Retrieve a BDF font character set identity, according to\n  *    the BDF specification.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  * @output:\n  *    acharset_encoding ::\n  *       Charset encoding, as a C~string, owned by the face.\n  *\n  *    acharset_registry ::\n  *       Charset registry, as a C~string, owned by the face.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function only works with BDF faces, returning an error otherwise.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_BDF_Charset_ID( FT_Face       face,\n                         const char*  *acharset_encoding,\n                         const char*  *acharset_registry );\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_BDF_Property\n  *\n  * @description:\n  *    Retrieve a BDF property from a BDF or PCF font file.\n  *\n  * @input:\n  *    face :: A handle to the input face.\n  *\n  *    name :: The property name.\n  *\n  * @output:\n  *    aproperty :: The property.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function works with BDF _and_ PCF fonts.  It returns an error\n  *   otherwise.  It also returns an error if the property is not in the\n  *   font.\n  *\n  *   A `property' is a either key-value pair within the STARTPROPERTIES\n  *   ... ENDPROPERTIES block of a BDF font or a key-value pair from the\n  *   `info->props' array within a `FontRec' structure of a PCF font.\n  *\n  *   Integer properties are always stored as `signed' within PCF fonts;\n  *   consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value\n  *   for BDF fonts only.\n  *\n  *   In case of error, `aproperty->type' is always set to\n  *   @BDF_PROPERTY_TYPE_NONE.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_BDF_Property( FT_Face           face,\n                       const char*       prop_name,\n                       BDF_PropertyRec  *aproperty );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTBDF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftbitmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbitmap.h                                                             */\n/*                                                                         */\n/*    FreeType utility functions for bitmaps (specification).              */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006, 2008 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBITMAP_H__\n#define __FTBITMAP_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    bitmap_handling                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Bitmap Handling                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Handling FT_Bitmap objects.                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains functions for converting FT_Bitmap objects.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_New                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a pointer to an @FT_Bitmap structure.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    abitmap :: A pointer to the bitmap structure.                      */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Bitmap_New( FT_Bitmap  *abitmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Copy                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Copy a bitmap into another one.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a library object.                           */\n  /*                                                                       */\n  /*    source  :: A handle to the source bitmap.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target  :: A handle to the target bitmap.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Copy( FT_Library        library,\n                  const FT_Bitmap  *source,\n                  FT_Bitmap        *target);\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Embolden                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Embolden a bitmap.  The new bitmap will be about `xStrength'       */\n  /*    pixels wider and `yStrength' pixels higher.  The left and bottom   */\n  /*    borders are kept unchanged.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library   :: A handle to a library object.                         */\n  /*                                                                       */\n  /*    xStrength :: How strong the glyph is emboldened horizontally.      */\n  /*                 Expressed in 26.6 pixel format.                       */\n  /*                                                                       */\n  /*    yStrength :: How strong the glyph is emboldened vertically.        */\n  /*                 Expressed in 26.6 pixel format.                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    bitmap    :: A handle to the target bitmap.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The current implementation restricts `xStrength' to be less than   */\n  /*    or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO.      */\n  /*                                                                       */\n  /*    If you want to embolden the bitmap owned by a @FT_GlyphSlotRec,    */\n  /*    you should call @FT_GlyphSlot_Own_Bitmap on the slot first.        */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Embolden( FT_Library  library,\n                      FT_Bitmap*  bitmap,\n                      FT_Pos      xStrength,\n                      FT_Pos      yStrength );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Convert                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a  */\n  /*    bitmap object with depth 8bpp, making the number of used bytes per */\n  /*    line (a.k.a. the `pitch') a multiple of `alignment'.               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library   :: A handle to a library object.                         */\n  /*                                                                       */\n  /*    source    :: The source bitmap.                                    */\n  /*                                                                       */\n  /*    alignment :: The pitch of the bitmap is a multiple of this         */\n  /*                 parameter.  Common values are 1, 2, or 4.             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target    :: The target bitmap.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    It is possible to call @FT_Bitmap_Convert multiple times without   */\n  /*    calling @FT_Bitmap_Done (the memory is simply reallocated).        */\n  /*                                                                       */\n  /*    Use @FT_Bitmap_Done to finally remove the bitmap object.           */\n  /*                                                                       */\n  /*    The `library' argument is taken to have access to FreeType's       */\n  /*    memory handling functions.                                         */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Convert( FT_Library        library,\n                     const FT_Bitmap  *source,\n                     FT_Bitmap        *target,\n                     FT_Int            alignment );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GlyphSlot_Own_Bitmap                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Make sure that a glyph slot owns `slot->bitmap'.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot :: The glyph slot.                                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is to be used in combination with                    */\n  /*    @FT_Bitmap_Embolden.                                               */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Bitmap_Done                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a bitmap object created with @FT_Bitmap_New.               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a library object.                           */\n  /*                                                                       */\n  /*    bitmap  :: The bitmap object to be freed.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `library' argument is taken to have access to FreeType's       */\n  /*    memory handling functions.                                         */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Bitmap_Done( FT_Library  library,\n                  FT_Bitmap  *bitmap );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTBITMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftbzip2.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbzip2.h                                                              */\n/*                                                                         */\n/*    Bzip2-compressed stream support.                                     */\n/*                                                                         */\n/*  Copyright 2010 by                                                      */\n/*  Joel Klinghed.                                                         */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBZIP2_H__\n#define __FTBZIP2_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    bzip2                                                              */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    BZIP2 Streams                                                      */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Using bzip2-compressed font files.                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of Bzip2-specific functions. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /************************************************************************\n  *\n  * @function:\n  *   FT_Stream_OpenBzip2\n  *\n  * @description:\n  *   Open a new stream to parse bzip2-compressed font files.  This is\n  *   mainly used to support the compressed `*.pcf.bz2' fonts that come\n  *   with XFree86.\n  *\n  * @input:\n  *   stream ::\n  *     The target embedding stream.\n  *\n  *   source ::\n  *     The source stream.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   The source stream must be opened _before_ calling this function.\n  *\n  *   Calling the internal function `FT_Stream_Close' on the new stream will\n  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream\n  *   objects will be released to the heap.\n  *\n  *   The stream implementation is very basic and resets the decompression\n  *   process each time seeking backwards is needed within the stream.\n  *\n  *   In certain builds of the library, bzip2 compression recognition is\n  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.\n  *   This means that if no font driver is capable of handling the raw\n  *   compressed file, the library will try to open a bzip2 compressed stream\n  *   from it and re-open the face with it.\n  *\n  *   This function may return `FT_Err_Unimplemented_Feature' if your build\n  *   of FreeType was not compiled with bzip2 support.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Stream_OpenBzip2( FT_Stream  stream,\n                       FT_Stream  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTBZIP2_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftcache.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcache.h                                                              */\n/*                                                                         */\n/*    FreeType Cache subsystem (specification).                            */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCACHE_H__\n#define __FTCACHE_H__\n\n\n#include <ft2build.h>\n#include FT_GLYPH_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************\n   *\n   * <Section>\n   *    cache_subsystem\n   *\n   * <Title>\n   *    Cache Sub-System\n   *\n   * <Abstract>\n   *    How to cache face, size, and glyph data with FreeType~2.\n   *\n   * <Description>\n   *   This section describes the FreeType~2 cache sub-system, which is used\n   *   to limit the number of concurrently opened @FT_Face and @FT_Size\n   *   objects, as well as caching information like character maps and glyph\n   *   images while limiting their maximum memory usage.\n   *\n   *   Note that all types and functions begin with the `FTC_' prefix.\n   *\n   *   The cache is highly portable and thus doesn't know anything about the\n   *   fonts installed on your system, or how to access them.  This implies\n   *   the following scheme:\n   *\n   *   First, available or installed font faces are uniquely identified by\n   *   @FTC_FaceID values, provided to the cache by the client.  Note that\n   *   the cache only stores and compares these values, and doesn't try to\n   *   interpret them in any way.\n   *\n   *   Second, the cache calls, only when needed, a client-provided function\n   *   to convert an @FTC_FaceID into a new @FT_Face object.  The latter is\n   *   then completely managed by the cache, including its termination\n   *   through @FT_Done_Face.  To monitor termination of face objects, the\n   *   finalizer callback in the `generic' field of the @FT_Face object can\n   *   be used, which might also be used to store the @FTC_FaceID of the\n   *   face.\n   *\n   *   Clients are free to map face IDs to anything else.  The most simple\n   *   usage is to associate them to a (pathname,face_index) pair that is\n   *   used to call @FT_New_Face.  However, more complex schemes are also\n   *   possible.\n   *\n   *   Note that for the cache to work correctly, the face ID values must be\n   *   *persistent*, which means that the contents they point to should not\n   *   change at runtime, or that their value should not become invalid.\n   *\n   *   If this is unavoidable (e.g., when a font is uninstalled at runtime),\n   *   you should call @FTC_Manager_RemoveFaceID as soon as possible, to let\n   *   the cache get rid of any references to the old @FTC_FaceID it may\n   *   keep internally.  Failure to do so will lead to incorrect behaviour\n   *   or even crashes.\n   *\n   *   To use the cache, start with calling @FTC_Manager_New to create a new\n   *   @FTC_Manager object, which models a single cache instance.  You can\n   *   then look up @FT_Face and @FT_Size objects with\n   *   @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.\n   *\n   *   If you want to use the charmap caching, call @FTC_CMapCache_New, then\n   *   later use @FTC_CMapCache_Lookup to perform the equivalent of\n   *   @FT_Get_Char_Index, only much faster.\n   *\n   *   If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then\n   *   later use @FTC_ImageCache_Lookup to retrieve the corresponding\n   *   @FT_Glyph objects from the cache.\n   *\n   *   If you need lots of small bitmaps, it is much more memory efficient\n   *   to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup.  This\n   *   returns @FTC_SBitRec structures, which are used to store small\n   *   bitmaps directly.  (A small bitmap is one whose metrics and\n   *   dimensions all fit into 8-bit integers).\n   *\n   *   We hope to also provide a kerning cache in the near future.\n   *\n   *\n   * <Order>\n   *   FTC_Manager\n   *   FTC_FaceID\n   *   FTC_Face_Requester\n   *\n   *   FTC_Manager_New\n   *   FTC_Manager_Reset\n   *   FTC_Manager_Done\n   *   FTC_Manager_LookupFace\n   *   FTC_Manager_LookupSize\n   *   FTC_Manager_RemoveFaceID\n   *\n   *   FTC_Node\n   *   FTC_Node_Unref\n   *\n   *   FTC_ImageCache\n   *   FTC_ImageCache_New\n   *   FTC_ImageCache_Lookup\n   *\n   *   FTC_SBit\n   *   FTC_SBitCache\n   *   FTC_SBitCache_New\n   *   FTC_SBitCache_Lookup\n   *\n   *   FTC_CMapCache\n   *   FTC_CMapCache_New\n   *   FTC_CMapCache_Lookup\n   *\n   *************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    BASIC TYPE DEFINITIONS                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type: FTC_FaceID\n   *\n   * @description:\n   *   An opaque pointer type that is used to identity face objects.  The\n   *   contents of such objects is application-dependent.\n   *\n   *   These pointers are typically used to point to a user-defined\n   *   structure containing a font file path, and face index.\n   *\n   * @note:\n   *   Never use NULL as a valid @FTC_FaceID.\n   *\n   *   Face IDs are passed by the client to the cache manager, which calls,\n   *   when needed, the @FTC_Face_Requester to translate them into new\n   *   @FT_Face objects.\n   *\n   *   If the content of a given face ID changes at runtime, or if the value\n   *   becomes invalid (e.g., when uninstalling a font), you should\n   *   immediately call @FTC_Manager_RemoveFaceID before any other cache\n   *   function.\n   *\n   *   Failure to do so will result in incorrect behaviour or even\n   *   memory leaks and crashes.\n   */\n  typedef FT_Pointer  FTC_FaceID;\n\n\n  /************************************************************************\n   *\n   * @functype:\n   *   FTC_Face_Requester\n   *\n   * @description:\n   *   A callback function provided by client applications.  It is used by\n   *   the cache manager to translate a given @FTC_FaceID into a new valid\n   *   @FT_Face object, on demand.\n   *\n   * <Input>\n   *   face_id ::\n   *     The face ID to resolve.\n   *\n   *   library ::\n   *     A handle to a FreeType library object.\n   *\n   *   req_data ::\n   *     Application-provided request data (see note below).\n   *\n   * <Output>\n   *   aface ::\n   *     A new @FT_Face handle.\n   *\n   * <Return>\n   *   FreeType error code.  0~means success.\n   *\n   * <Note>\n   *   The third parameter `req_data' is the same as the one passed by the\n   *   client when @FTC_Manager_New is called.\n   *\n   *   The face requester should not perform funny things on the returned\n   *   face object, like creating a new @FT_Size for it, or setting a\n   *   transformation through @FT_Set_Transform!\n   */\n  typedef FT_Error\n  (*FTC_Face_Requester)( FTC_FaceID  face_id,\n                         FT_Library  library,\n                         FT_Pointer  request_data,\n                         FT_Face*    aface );\n\n /* */\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /* these macros are incompatible with LLP64, should not be used */\n\n#define FT_POINTER_TO_ULONG( p )  ( (FT_ULong)(FT_Pointer)(p) )\n\n#define FTC_FACE_ID_HASH( i )                                \\\n          ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^   \\\n                       ( FT_POINTER_TO_ULONG( i ) << 7 ) ) )\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      CACHE MANAGER OBJECT                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_Manager                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This object corresponds to one instance of the cache-subsystem.    */\n  /*    It is used to cache one or more @FT_Face objects, along with       */\n  /*    corresponding @FT_Size objects.                                    */\n  /*                                                                       */\n  /*    The manager intentionally limits the total number of opened        */\n  /*    @FT_Face and @FT_Size objects to control memory usage.  See the    */\n  /*    `max_faces' and `max_sizes' parameters of @FTC_Manager_New.        */\n  /*                                                                       */\n  /*    The manager is also used to cache `nodes' of various types while   */\n  /*    limiting their total memory usage.                                 */\n  /*                                                                       */\n  /*    All limitations are enforced by keeping lists of managed objects   */\n  /*    in most-recently-used order, and flushing old nodes to make room   */\n  /*    for new ones.                                                      */\n  /*                                                                       */\n  typedef struct FTC_ManagerRec_*  FTC_Manager;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_Node                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An opaque handle to a cache node object.  Each cache node is       */\n  /*    reference-counted.  A node with a count of~0 might be flushed      */\n  /*    out of a full cache whenever a lookup request is performed.        */\n  /*                                                                       */\n  /*    If you look up nodes, you have the ability to `acquire' them,      */\n  /*    i.e., to increment their reference count.  This will prevent the   */\n  /*    node from being flushed out of the cache until you explicitly      */\n  /*    `release' it (see @FTC_Node_Unref).                                */\n  /*                                                                       */\n  /*    See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup.         */\n  /*                                                                       */\n  typedef struct FTC_NodeRec_*  FTC_Node;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_New                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new cache manager.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library   :: The parent FreeType library handle to use.            */\n  /*                                                                       */\n  /*    max_faces :: Maximum number of opened @FT_Face objects managed by  */\n  /*                 this cache instance.  Use~0 for defaults.             */\n  /*                                                                       */\n  /*    max_sizes :: Maximum number of opened @FT_Size objects managed by  */\n  /*                 this cache instance.  Use~0 for defaults.             */\n  /*                                                                       */\n  /*    max_bytes :: Maximum number of bytes to use for cached data nodes. */\n  /*                 Use~0 for defaults.  Note that this value does not    */\n  /*                 account for managed @FT_Face and @FT_Size objects.    */\n  /*                                                                       */\n  /*    requester :: An application-provided callback used to translate    */\n  /*                 face IDs into real @FT_Face objects.                  */\n  /*                                                                       */\n  /*    req_data  :: A generic pointer that is passed to the requester     */\n  /*                 each time it is called (see @FTC_Face_Requester).     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amanager  :: A handle to a new manager object.  0~in case of       */\n  /*                 failure.                                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_Manager_New( FT_Library          library,\n                   FT_UInt             max_faces,\n                   FT_UInt             max_sizes,\n                   FT_ULong            max_bytes,\n                   FTC_Face_Requester  requester,\n                   FT_Pointer          req_data,\n                   FTC_Manager        *amanager );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_Reset                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Empty a given cache manager.  This simply gets rid of all the      */\n  /*    currently cached @FT_Face and @FT_Size objects within the manager. */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    manager :: A handle to the manager.                                */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FTC_Manager_Reset( FTC_Manager  manager );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_Done                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a given manager after emptying it.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the target cache manager object.            */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FTC_Manager_Done( FTC_Manager  manager );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_LookupFace                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the @FT_Face object that corresponds to a given face ID   */\n  /*    through a cache manager.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the cache manager.                          */\n  /*                                                                       */\n  /*    face_id :: The ID of the face object.                              */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface   :: A handle to the face object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned @FT_Face object is always owned by the manager.  You  */\n  /*    should never try to discard it yourself.                           */\n  /*                                                                       */\n  /*    The @FT_Face object doesn't necessarily have a current size object */\n  /*    (i.e., face->size can be 0).  If you need a specific `font size',  */\n  /*    use @FTC_Manager_LookupSize instead.                               */\n  /*                                                                       */\n  /*    Never change the face's transformation matrix (i.e., never call    */\n  /*    the @FT_Set_Transform function) on a returned face!  If you need   */\n  /*    to transform glyphs, do it yourself after glyph loading.           */\n  /*                                                                       */\n  /*    When you perform a lookup, out-of-memory errors are detected       */\n  /*    _within_ the lookup and force incremental flushes of the cache     */\n  /*    until enough memory is released for the lookup to succeed.         */\n  /*                                                                       */\n  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */\n  /*    already been completely flushed, and still no memory was available */\n  /*    for the operation.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_Manager_LookupFace( FTC_Manager  manager,\n                          FTC_FaceID   face_id,\n                          FT_Face     *aface );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_ScalerRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to describe a given character size in either      */\n  /*    pixels or points to the cache manager.  See                        */\n  /*    @FTC_Manager_LookupSize.                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face_id :: The source face ID.                                     */\n  /*                                                                       */\n  /*    width   :: The character width.                                    */\n  /*                                                                       */\n  /*    height  :: The character height.                                   */\n  /*                                                                       */\n  /*    pixel   :: A Boolean.  If 1, the `width' and `height' fields are   */\n  /*               interpreted as integer pixel character sizes.           */\n  /*               Otherwise, they are expressed as 1/64th of points.      */\n  /*                                                                       */\n  /*    x_res   :: Only used when `pixel' is value~0 to indicate the       */\n  /*               horizontal resolution in dpi.                           */\n  /*                                                                       */\n  /*    y_res   :: Only used when `pixel' is value~0 to indicate the       */\n  /*               vertical resolution in dpi.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This type is mainly used to retrieve @FT_Size objects through the  */\n  /*    cache manager.                                                     */\n  /*                                                                       */\n  typedef struct  FTC_ScalerRec_\n  {\n    FTC_FaceID  face_id;\n    FT_UInt     width;\n    FT_UInt     height;\n    FT_Int      pixel;\n    FT_UInt     x_res;\n    FT_UInt     y_res;\n\n  } FTC_ScalerRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_Scaler                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an @FTC_ScalerRec structure.                           */\n  /*                                                                       */\n  typedef struct FTC_ScalerRec_*  FTC_Scaler;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_LookupSize                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the @FT_Size object that corresponds to a given           */\n  /*    @FTC_ScalerRec pointer through a cache manager.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the cache manager.                          */\n  /*                                                                       */\n  /*    scaler  :: A scaler handle.                                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    asize   :: A handle to the size object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned @FT_Size object is always owned by the manager.  You  */\n  /*    should never try to discard it by yourself.                        */\n  /*                                                                       */\n  /*    You can access the parent @FT_Face object simply as `size->face'   */\n  /*    if you need it.  Note that this object is also owned by the        */\n  /*    manager.                                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    When you perform a lookup, out-of-memory errors are detected       */\n  /*    _within_ the lookup and force incremental flushes of the cache     */\n  /*    until enough memory is released for the lookup to succeed.         */\n  /*                                                                       */\n  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */\n  /*    already been completely flushed, and still no memory is available  */\n  /*    for the operation.                                                 */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_Manager_LookupSize( FTC_Manager  manager,\n                          FTC_Scaler   scaler,\n                          FT_Size     *asize );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Node_Unref                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Decrement a cache node's internal reference count.  When the count */\n  /*    reaches 0, it is not destroyed but becomes eligible for subsequent */\n  /*    cache flushes.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    node    :: The cache node handle.                                  */\n  /*                                                                       */\n  /*    manager :: The cache manager handle.                               */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FTC_Node_Unref( FTC_Node     node,\n                  FTC_Manager  manager );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FTC_Manager_RemoveFaceID\n   *\n   * @description:\n   *   A special function used to indicate to the cache manager that\n   *   a given @FTC_FaceID is no longer valid, either because its\n   *   content changed, or because it was deallocated or uninstalled.\n   *\n   * @input:\n   *   manager ::\n   *     The cache manager handle.\n   *\n   *   face_id ::\n   *     The @FTC_FaceID to be removed.\n   *\n   * @note:\n   *   This function flushes all nodes from the cache corresponding to this\n   *   `face_id', with the exception of nodes with a non-null reference\n   *   count.\n   *\n   *   Such nodes are however modified internally so as to never appear\n   *   in later lookups with the same `face_id' value, and to be immediately\n   *   destroyed when released by all their users.\n   *\n   */\n  FT_EXPORT( void )\n  FTC_Manager_RemoveFaceID( FTC_Manager  manager,\n                            FTC_FaceID   face_id );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cache_subsystem                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FTC_CMapCache\n   *\n   * @description:\n   *   An opaque handle used to model a charmap cache.  This cache is to\n   *   hold character codes -> glyph indices mappings.\n   *\n   */\n  typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FTC_CMapCache_New\n   *\n   * @description:\n   *   Create a new charmap cache.\n   *\n   * @input:\n   *   manager ::\n   *     A handle to the cache manager.\n   *\n   * @output:\n   *   acache ::\n   *     A new cache handle.  NULL in case of error.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   Like all other caches, this one will be destroyed with the cache\n   *   manager.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FTC_CMapCache_New( FTC_Manager     manager,\n                     FTC_CMapCache  *acache );\n\n\n  /************************************************************************\n   *\n   * @function:\n   *   FTC_CMapCache_Lookup\n   *\n   * @description:\n   *   Translate a character code into a glyph index, using the charmap\n   *   cache.\n   *\n   * @input:\n   *   cache ::\n   *     A charmap cache handle.\n   *\n   *   face_id ::\n   *     The source face ID.\n   *\n   *   cmap_index ::\n   *     The index of the charmap in the source face.  Any negative value\n   *     means to use the cache @FT_Face's default charmap.\n   *\n   *   char_code ::\n   *     The character code (in the corresponding charmap).\n   *\n   * @return:\n   *    Glyph index.  0~means `no glyph'.\n   *\n   */\n  FT_EXPORT( FT_UInt )\n  FTC_CMapCache_Lookup( FTC_CMapCache  cache,\n                        FTC_FaceID     face_id,\n                        FT_Int         cmap_index,\n                        FT_UInt32      char_code );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cache_subsystem                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       IMAGE CACHE OBJECT                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FTC_ImageTypeRec\n   *\n   * @description:\n   *   A structure used to model the type of images in a glyph cache.\n   *\n   * @fields:\n   *   face_id ::\n   *     The face ID.\n   *\n   *   width ::\n   *     The width in pixels.\n   *\n   *   height ::\n   *     The height in pixels.\n   *\n   *   flags ::\n   *     The load flags, as in @FT_Load_Glyph.\n   *\n   */\n  typedef struct  FTC_ImageTypeRec_\n  {\n    FTC_FaceID  face_id;\n    FT_Int      width;\n    FT_Int      height;\n    FT_Int32    flags;\n\n  } FTC_ImageTypeRec;\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FTC_ImageType\n   *\n   * @description:\n   *   A handle to an @FTC_ImageTypeRec structure.\n   *\n   */\n  typedef struct FTC_ImageTypeRec_*  FTC_ImageType;\n\n\n  /* */\n\n\n#define FTC_IMAGE_TYPE_COMPARE( d1, d2 )      \\\n          ( (d1)->face_id == (d2)->face_id && \\\n            (d1)->width   == (d2)->width   && \\\n            (d1)->flags   == (d2)->flags   )\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /* this macro is incompatible with LLP64, should not be used */\n\n#define FTC_IMAGE_TYPE_HASH( d )                          \\\n          (FT_UFast)( FTC_FACE_ID_HASH( (d)->face_id )  ^ \\\n                      ( (d)->width << 8 ) ^ (d)->height ^ \\\n                      ( (d)->flags << 4 )               )\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_ImageCache                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an glyph image cache object.  They are designed to     */\n  /*    hold many distinct glyph images while not exceeding a certain      */\n  /*    memory threshold.                                                  */\n  /*                                                                       */\n  typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_ImageCache_New                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new glyph image cache.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: The parent manager for the image cache.                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acache  :: A handle to the new glyph image cache object.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_ImageCache_New( FTC_Manager      manager,\n                      FTC_ImageCache  *acache );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_ImageCache_Lookup                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve a given glyph image from a glyph image cache.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache  :: A handle to the source glyph image cache.                */\n  /*                                                                       */\n  /*    type   :: A pointer to a glyph image type descriptor.              */\n  /*                                                                       */\n  /*    gindex :: The glyph index to retrieve.                             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aglyph :: The corresponding @FT_Glyph object.  0~in case of        */\n  /*              failure.                                                 */\n  /*                                                                       */\n  /*    anode  :: Used to return the address of of the corresponding cache */\n  /*              node after incrementing its reference count (see note    */\n  /*              below).                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned glyph is owned and managed by the glyph image cache.  */\n  /*    Never try to transform or discard it manually!  You can however    */\n  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the glyph image, after increasing its reference    */\n  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */\n  /*    always be kept in the cache until you call @FTC_Node_Unref to      */\n  /*    `release' it.                                                      */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the @FT_Glyph could be flushed out of the cache on the next   */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_ImageCache_Lookup( FTC_ImageCache  cache,\n                         FTC_ImageType   type,\n                         FT_UInt         gindex,\n                         FT_Glyph       *aglyph,\n                         FTC_Node       *anode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_ImageCache_LookupScaler                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec    */\n  /*    to specify the face ID and its size.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache      :: A handle to the source glyph image cache.            */\n  /*                                                                       */\n  /*    scaler     :: A pointer to a scaler descriptor.                    */\n  /*                                                                       */\n  /*    load_flags :: The corresponding load flags.                        */\n  /*                                                                       */\n  /*    gindex     :: The glyph index to retrieve.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aglyph     :: The corresponding @FT_Glyph object.  0~in case of    */\n  /*                  failure.                                             */\n  /*                                                                       */\n  /*    anode      :: Used to return the address of of the corresponding   */\n  /*                  cache node after incrementing its reference count    */\n  /*                  (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The returned glyph is owned and managed by the glyph image cache.  */\n  /*    Never try to transform or discard it manually!  You can however    */\n  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the glyph image, after increasing its reference    */\n  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */\n  /*    always be kept in the cache until you call @FTC_Node_Unref to      */\n  /*    `release' it.                                                      */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the @FT_Glyph could be flushed out of the cache on the next   */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  /*    Calls to @FT_Set_Char_Size and friends have no effect on cached    */\n  /*    glyphs; you should always use the FreeType cache API instead.      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,\n                               FTC_Scaler      scaler,\n                               FT_ULong        load_flags,\n                               FT_UInt         gindex,\n                               FT_Glyph       *aglyph,\n                               FTC_Node       *anode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_SBit                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a small bitmap descriptor.  See the @FTC_SBitRec       */\n  /*    structure for details.                                             */\n  /*                                                                       */\n  typedef struct FTC_SBitRec_*  FTC_SBit;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_SBitRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very compact structure used to describe a small glyph bitmap.    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    width     :: The bitmap width in pixels.                           */\n  /*                                                                       */\n  /*    height    :: The bitmap height in pixels.                          */\n  /*                                                                       */\n  /*    left      :: The horizontal distance from the pen position to the  */\n  /*                 left bitmap border (a.k.a. `left side bearing', or    */\n  /*                 `lsb').                                               */\n  /*                                                                       */\n  /*    top       :: The vertical distance from the pen position (on the   */\n  /*                 baseline) to the upper bitmap border (a.k.a. `top     */\n  /*                 side bearing').  The distance is positive for upwards */\n  /*                 y~coordinates.                                        */\n  /*                                                                       */\n  /*    format    :: The format of the glyph bitmap (monochrome or gray).  */\n  /*                                                                       */\n  /*    max_grays :: Maximum gray level value (in the range 1 to~255).     */\n  /*                                                                       */\n  /*    pitch     :: The number of bytes per bitmap line.  May be positive */\n  /*                 or negative.                                          */\n  /*                                                                       */\n  /*    xadvance  :: The horizontal advance width in pixels.               */\n  /*                                                                       */\n  /*    yadvance  :: The vertical advance height in pixels.                */\n  /*                                                                       */\n  /*    buffer    :: A pointer to the bitmap pixels.                       */\n  /*                                                                       */\n  typedef struct  FTC_SBitRec_\n  {\n    FT_Byte   width;\n    FT_Byte   height;\n    FT_Char   left;\n    FT_Char   top;\n\n    FT_Byte   format;\n    FT_Byte   max_grays;\n    FT_Short  pitch;\n    FT_Char   xadvance;\n    FT_Char   yadvance;\n\n    FT_Byte*  buffer;\n\n  } FTC_SBitRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FTC_SBitCache                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a small bitmap cache.  These are special cache objects */\n  /*    used to store small glyph bitmaps (and anti-aliased pixmaps) in a  */\n  /*    much more efficient way than the traditional glyph image cache     */\n  /*    implemented by @FTC_ImageCache.                                    */\n  /*                                                                       */\n  typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_SBitCache_New                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new cache to store small glyph bitmaps.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    manager :: A handle to the source cache manager.                   */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acache  :: A handle to the new sbit cache.  NULL in case of error. */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_SBitCache_New( FTC_Manager     manager,\n                     FTC_SBitCache  *acache );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_SBitCache_Lookup                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Look up a given small glyph bitmap in a given sbit cache and       */\n  /*    `lock' it to prevent its flushing from the cache until needed.     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache  :: A handle to the source sbit cache.                       */\n  /*                                                                       */\n  /*    type   :: A pointer to the glyph image type descriptor.            */\n  /*                                                                       */\n  /*    gindex :: The glyph index.                                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    sbit   :: A handle to a small bitmap descriptor.                   */\n  /*                                                                       */\n  /*    anode  :: Used to return the address of of the corresponding cache */\n  /*              node after incrementing its reference count (see note    */\n  /*              below).                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The small bitmap descriptor and its bit buffer are owned by the    */\n  /*    cache and should never be freed by the application.  They might    */\n  /*    as well disappear from memory on the next cache lookup, so don't   */\n  /*    treat them as persistent data.                                     */\n  /*                                                                       */\n  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */\n  /*    glyph bitmap.                                                      */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the bitmap, after increasing its reference count.  */\n  /*    This ensures that the node (as well as the image) will always be   */\n  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the bitmap could be flushed out of the cache on the next      */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_SBitCache_Lookup( FTC_SBitCache    cache,\n                        FTC_ImageType    type,\n                        FT_UInt          gindex,\n                        FTC_SBit        *sbit,\n                        FTC_Node        *anode );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_SBitCache_LookupScaler                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec     */\n  /*    to specify the face ID and its size.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    cache      :: A handle to the source sbit cache.                   */\n  /*                                                                       */\n  /*    scaler     :: A pointer to the scaler descriptor.                  */\n  /*                                                                       */\n  /*    load_flags :: The corresponding load flags.                        */\n  /*                                                                       */\n  /*    gindex     :: The glyph index.                                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    sbit       :: A handle to a small bitmap descriptor.               */\n  /*                                                                       */\n  /*    anode      :: Used to return the address of of the corresponding   */\n  /*                  cache node after incrementing its reference count    */\n  /*                  (see note below).                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The small bitmap descriptor and its bit buffer are owned by the    */\n  /*    cache and should never be freed by the application.  They might    */\n  /*    as well disappear from memory on the next cache lookup, so don't   */\n  /*    treat them as persistent data.                                     */\n  /*                                                                       */\n  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */\n  /*    glyph bitmap.                                                      */\n  /*                                                                       */\n  /*    If `anode' is _not_ NULL, it receives the address of the cache     */\n  /*    node containing the bitmap, after increasing its reference count.  */\n  /*    This ensures that the node (as well as the image) will always be   */\n  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */\n  /*                                                                       */\n  /*    If `anode' is NULL, the cache node is left unchanged, which means  */\n  /*    that the bitmap could be flushed out of the cache on the next      */\n  /*    call to one of the caching sub-system APIs.  Don't assume that it  */\n  /*    is persistent!                                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,\n                              FTC_Scaler     scaler,\n                              FT_ULong       load_flags,\n                              FT_UInt        gindex,\n                              FTC_SBit      *sbit,\n                              FTC_Node      *anode );\n\n\n /* */\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /*@***********************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FTC_FontRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to describe a given `font' to the cache    */\n  /*    manager.  Note that a `font' is the combination of a given face    */\n  /*    with a given character size.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    face_id    :: The ID of the face to use.                           */\n  /*                                                                       */\n  /*    pix_width  :: The character width in integer pixels.               */\n  /*                                                                       */\n  /*    pix_height :: The character height in integer pixels.              */\n  /*                                                                       */\n  typedef struct  FTC_FontRec_\n  {\n    FTC_FaceID  face_id;\n    FT_UShort   pix_width;\n    FT_UShort   pix_height;\n\n  } FTC_FontRec;\n\n\n  /* */\n\n\n#define FTC_FONT_COMPARE( f1, f2 )                  \\\n          ( (f1)->face_id    == (f2)->face_id    && \\\n            (f1)->pix_width  == (f2)->pix_width  && \\\n            (f1)->pix_height == (f2)->pix_height )\n\n  /* this macro is incompatible with LLP64, should not be used */\n#define FTC_FONT_HASH( f )                              \\\n          (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \\\n                       ((f)->pix_width << 8)          ^ \\\n                       ((f)->pix_height)              )\n\n  typedef FTC_FontRec*  FTC_Font;\n\n\n  FT_EXPORT( FT_Error )\n  FTC_Manager_Lookup_Face( FTC_Manager  manager,\n                           FTC_FaceID   face_id,\n                           FT_Face     *aface );\n\n  FT_EXPORT( FT_Error )\n  FTC_Manager_Lookup_Size( FTC_Manager  manager,\n                           FTC_Font     font,\n                           FT_Face     *aface,\n                           FT_Size     *asize );\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTCACHE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftcffdrv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcffdrv.h                                                             */\n/*                                                                         */\n/*    FreeType API for controlling the CFF driver (specification only).    */\n/*                                                                         */\n/*  Copyright 2013 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCFFDRV_H__\n#define __FTCFFDRV_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   cff_driver\n   *\n   * @title:\n   *   The CFF driver\n   *\n   * @abstract:\n   *   Controlling the CFF driver module.\n   *\n   * @description:\n   *   While FreeType's CFF driver doesn't expose API functions by itself,\n   *   it is possible to control its behaviour with @FT_Property_Set and\n   *   @FT_Property_Get.  The following lists the available properties\n   *   together with the necessary macros and structures.\n   *\n   *   The CFF driver's module name is `cff'.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   hinting-engine\n   *\n   * @description:\n   *   Thanks to Adobe, which contributed a new hinting (and parsing)\n   *   engine, an application can select between `freetype' and `adobe'.\n   *\n   *   Right now, the default engine is `freetype'.  However, this will\n   *   change: After a certain time of intensive testing it is planned to\n   *   make `adobe' the default due to its superior rendering results.\n   *\n   *   The following example code demonstrates how to select Adobe's hinting\n   *   engine (omitting the error handling).\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_Face     face;\n   *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"cff\",\n   *                               \"hinting-engine\", &hinting_engine );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   * @enum:\n   *   FT_CFF_HINTING_XXX\n   *\n   * @description:\n   *   A list of constants used for the @hinting-engine property to select\n   *   the hinting engine for CFF fonts.\n   *\n   * @values:\n   *   FT_CFF_HINTING_FREETYPE ::\n   *     Use the old FreeType hinting engine.\n   *\n   *   FT_CFF_HINTING_ADOBE ::\n   *     Use the hinting engine contributed by Adobe.\n   *\n   */\n#define FT_CFF_HINTING_FREETYPE  0\n#define FT_CFF_HINTING_ADOBE     1\n\n\n  /**************************************************************************\n   *\n   * @property:\n   *   no-stem-darkening\n   *\n   * @description:\n   *   By default, the Adobe CFF engine darkens stems at smaller sizes,\n   *   regardless of hinting, to enhance contrast.  Setting this property,\n   *   stem darkening gets switched off.\n   *\n   *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.\n   *\n   *   {\n   *     FT_Library  library;\n   *     FT_Face     face;\n   *     FT_Bool     no_stem_darkening = TRUE;\n   *\n   *\n   *     FT_Init_FreeType( &library );\n   *\n   *     FT_Property_Set( library, \"cff\",\n   *                               \"no-stem-darkening\", &no_stem_darkening );\n   *   }\n   *\n   * @note:\n   *   This property can be used with @FT_Property_Get also.\n   *\n   */\n\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __FTCFFDRV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftchapters.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/* This file defines the structure of the FreeType reference.              */\n/* It is used by the python script which generates the HTML files.         */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* <Chapter>                                                               */\n/*    general_remarks                                                      */\n/*                                                                         */\n/* <Title>                                                                 */\n/*    General Remarks                                                      */\n/*                                                                         */\n/* <Sections>                                                              */\n/*    user_allocation                                                      */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* <Chapter>                                                               */\n/*    core_api                                                             */\n/*                                                                         */\n/* <Title>                                                                 */\n/*    Core API                                                             */\n/*                                                                         */\n/* <Sections>                                                              */\n/*    version                                                              */\n/*    basic_types                                                          */\n/*    base_interface                                                       */\n/*    glyph_variants                                                       */\n/*    glyph_management                                                     */\n/*    mac_specific                                                         */\n/*    sizes_management                                                     */\n/*    header_file_macros                                                   */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* <Chapter>                                                               */\n/*    format_specific                                                      */\n/*                                                                         */\n/* <Title>                                                                 */\n/*    Format-Specific API                                                  */\n/*                                                                         */\n/* <Sections>                                                              */\n/*    multiple_masters                                                     */\n/*    truetype_tables                                                      */\n/*    type1_tables                                                         */\n/*    sfnt_names                                                           */\n/*    bdf_fonts                                                            */\n/*    cid_fonts                                                            */\n/*    pfr_fonts                                                            */\n/*    winfnt_fonts                                                         */\n/*    font_formats                                                         */\n/*    gasp_table                                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* <Chapter>                                                               */\n/*    auto_hinter                                                          */\n/*                                                                         */\n/* <Title>                                                                 */\n/*    The Auto-Hinter                                                      */\n/*                                                                         */\n/* <Sections>                                                              */\n/*    auto_hinter                                                          */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* <Chapter>                                                               */\n/*    cff_driver                                                           */\n/*                                                                         */\n/* <Title>                                                                 */\n/*    The CFF Driver                                                       */\n/*                                                                         */\n/* <Sections>                                                              */\n/*    cff_driver                                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* <Chapter>                                                               */\n/*    cache_subsystem                                                      */\n/*                                                                         */\n/* <Title>                                                                 */\n/*    Cache Sub-System                                                     */\n/*                                                                         */\n/* <Sections>                                                              */\n/*    cache_subsystem                                                      */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* <Chapter>                                                               */\n/*    support_api                                                          */\n/*                                                                         */\n/* <Title>                                                                 */\n/*    Support API                                                          */\n/*                                                                         */\n/* <Sections>                                                              */\n/*    computations                                                         */\n/*    list_processing                                                      */\n/*    outline_processing                                                   */\n/*    quick_advance                                                        */\n/*    bitmap_handling                                                      */\n/*    raster                                                               */\n/*    glyph_stroker                                                        */\n/*    system_interface                                                     */\n/*    module_management                                                    */\n/*    gzip                                                                 */\n/*    lzw                                                                  */\n/*    bzip2                                                                */\n/*    lcd_filtering                                                        */\n/*                                                                         */\n/***************************************************************************/\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftcid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcid.h                                                                */\n/*                                                                         */\n/*    FreeType API for accessing CID font information (specification).     */\n/*                                                                         */\n/*  Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal.                  */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCID_H__\n#define __FTCID_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cid_fonts                                                          */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    CID Fonts                                                          */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    CID-keyed font specific API.                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of CID-keyed font specific   */\n  /*    functions.                                                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_CID_Registry_Ordering_Supplement\n   *\n   * @description:\n   *    Retrieve the Registry/Ordering/Supplement triple (also known as the\n   *    \"R/O/S\") from a CID-keyed font.\n   *\n   * @input:\n   *    face ::\n   *       A handle to the input face.\n   *\n   * @output:\n   *    registry ::\n   *       The registry, as a C~string, owned by the face.\n   *\n   *    ordering ::\n   *       The ordering, as a C~string, owned by the face.\n   *\n   *    supplement ::\n   *       The supplement.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    This function only works with CID faces, returning an error\n   *    otherwise.\n   *\n   * @since:\n   *    2.3.6\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,\n                                           const char*  *registry,\n                                           const char*  *ordering,\n                                           FT_Int       *supplement);\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_CID_Is_Internally_CID_Keyed\n   *\n   * @description:\n   *    Retrieve the type of the input face, CID keyed or not.  In\n   *    constrast to the @FT_IS_CID_KEYED macro this function returns\n   *    successfully also for CID-keyed fonts in an SNFT wrapper.\n   *\n   * @input:\n   *    face ::\n   *       A handle to the input face.\n   *\n   * @output:\n   *    is_cid ::\n   *       The type of the face as an @FT_Bool.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    This function only works with CID faces and OpenType fonts,\n   *    returning an error otherwise.\n   *\n   * @since:\n   *    2.3.9\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,\n                                      FT_Bool  *is_cid );\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_CID_From_Glyph_Index\n   *\n   * @description:\n   *    Retrieve the CID of the input glyph index.\n   *\n   * @input:\n   *    face ::\n   *       A handle to the input face.\n   *\n   *    glyph_index ::\n   *       The input glyph index.\n   *\n   * @output:\n   *    cid ::\n   *       The CID as an @FT_UInt.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    This function only works with CID faces and OpenType fonts,\n   *    returning an error otherwise.\n   *\n   * @since:\n   *    2.3.9\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_CID_From_Glyph_Index( FT_Face   face,\n                               FT_UInt   glyph_index,\n                               FT_UInt  *cid );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTCID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/fterrdef.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fterrdef.h                                                             */\n/*                                                                         */\n/*    FreeType error codes (specification).                                */\n/*                                                                         */\n/*  Copyright 2002, 2004, 2006, 2007, 2010-2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                LIST OF ERROR CODES/MESSAGES             *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n  /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */\n  /* including this file.                                           */\n\n\n  /* generic errors */\n\n  FT_NOERRORDEF_( Ok,                                        0x00, \\\n                  \"no error\" )\n\n  FT_ERRORDEF_( Cannot_Open_Resource,                        0x01, \\\n                \"cannot open resource\" )\n  FT_ERRORDEF_( Unknown_File_Format,                         0x02, \\\n                \"unknown file format\" )\n  FT_ERRORDEF_( Invalid_File_Format,                         0x03, \\\n                \"broken file\" )\n  FT_ERRORDEF_( Invalid_Version,                             0x04, \\\n                \"invalid FreeType version\" )\n  FT_ERRORDEF_( Lower_Module_Version,                        0x05, \\\n                \"module version is too low\" )\n  FT_ERRORDEF_( Invalid_Argument,                            0x06, \\\n                \"invalid argument\" )\n  FT_ERRORDEF_( Unimplemented_Feature,                       0x07, \\\n                \"unimplemented feature\" )\n  FT_ERRORDEF_( Invalid_Table,                               0x08, \\\n                \"broken table\" )\n  FT_ERRORDEF_( Invalid_Offset,                              0x09, \\\n                \"broken offset within table\" )\n  FT_ERRORDEF_( Array_Too_Large,                             0x0A, \\\n                \"array allocation size too large\" )\n  FT_ERRORDEF_( Missing_Module,                              0x0B, \\\n                \"missing module\" )\n  FT_ERRORDEF_( Missing_Property,                            0x0C, \\\n                \"missing property\" )\n\n  /* glyph/character errors */\n\n  FT_ERRORDEF_( Invalid_Glyph_Index,                         0x10, \\\n                \"invalid glyph index\" )\n  FT_ERRORDEF_( Invalid_Character_Code,                      0x11, \\\n                \"invalid character code\" )\n  FT_ERRORDEF_( Invalid_Glyph_Format,                        0x12, \\\n                \"unsupported glyph image format\" )\n  FT_ERRORDEF_( Cannot_Render_Glyph,                         0x13, \\\n                \"cannot render this glyph format\" )\n  FT_ERRORDEF_( Invalid_Outline,                             0x14, \\\n                \"invalid outline\" )\n  FT_ERRORDEF_( Invalid_Composite,                           0x15, \\\n                \"invalid composite glyph\" )\n  FT_ERRORDEF_( Too_Many_Hints,                              0x16, \\\n                \"too many hints\" )\n  FT_ERRORDEF_( Invalid_Pixel_Size,                          0x17, \\\n                \"invalid pixel size\" )\n\n  /* handle errors */\n\n  FT_ERRORDEF_( Invalid_Handle,                              0x20, \\\n                \"invalid object handle\" )\n  FT_ERRORDEF_( Invalid_Library_Handle,                      0x21, \\\n                \"invalid library handle\" )\n  FT_ERRORDEF_( Invalid_Driver_Handle,                       0x22, \\\n                \"invalid module handle\" )\n  FT_ERRORDEF_( Invalid_Face_Handle,                         0x23, \\\n                \"invalid face handle\" )\n  FT_ERRORDEF_( Invalid_Size_Handle,                         0x24, \\\n                \"invalid size handle\" )\n  FT_ERRORDEF_( Invalid_Slot_Handle,                         0x25, \\\n                \"invalid glyph slot handle\" )\n  FT_ERRORDEF_( Invalid_CharMap_Handle,                      0x26, \\\n                \"invalid charmap handle\" )\n  FT_ERRORDEF_( Invalid_Cache_Handle,                        0x27, \\\n                \"invalid cache manager handle\" )\n  FT_ERRORDEF_( Invalid_Stream_Handle,                       0x28, \\\n                \"invalid stream handle\" )\n\n  /* driver errors */\n\n  FT_ERRORDEF_( Too_Many_Drivers,                            0x30, \\\n                \"too many modules\" )\n  FT_ERRORDEF_( Too_Many_Extensions,                         0x31, \\\n                \"too many extensions\" )\n\n  /* memory errors */\n\n  FT_ERRORDEF_( Out_Of_Memory,                               0x40, \\\n                \"out of memory\" )\n  FT_ERRORDEF_( Unlisted_Object,                             0x41, \\\n                \"unlisted object\" )\n\n  /* stream errors */\n\n  FT_ERRORDEF_( Cannot_Open_Stream,                          0x51, \\\n                \"cannot open stream\" )\n  FT_ERRORDEF_( Invalid_Stream_Seek,                         0x52, \\\n                \"invalid stream seek\" )\n  FT_ERRORDEF_( Invalid_Stream_Skip,                         0x53, \\\n                \"invalid stream skip\" )\n  FT_ERRORDEF_( Invalid_Stream_Read,                         0x54, \\\n                \"invalid stream read\" )\n  FT_ERRORDEF_( Invalid_Stream_Operation,                    0x55, \\\n                \"invalid stream operation\" )\n  FT_ERRORDEF_( Invalid_Frame_Operation,                     0x56, \\\n                \"invalid frame operation\" )\n  FT_ERRORDEF_( Nested_Frame_Access,                         0x57, \\\n                \"nested frame access\" )\n  FT_ERRORDEF_( Invalid_Frame_Read,                          0x58, \\\n                \"invalid frame read\" )\n\n  /* raster errors */\n\n  FT_ERRORDEF_( Raster_Uninitialized,                        0x60, \\\n                \"raster uninitialized\" )\n  FT_ERRORDEF_( Raster_Corrupted,                            0x61, \\\n                \"raster corrupted\" )\n  FT_ERRORDEF_( Raster_Overflow,                             0x62, \\\n                \"raster overflow\" )\n  FT_ERRORDEF_( Raster_Negative_Height,                      0x63, \\\n                \"negative height while rastering\" )\n\n  /* cache errors */\n\n  FT_ERRORDEF_( Too_Many_Caches,                             0x70, \\\n                \"too many registered caches\" )\n\n  /* TrueType and SFNT errors */\n\n  FT_ERRORDEF_( Invalid_Opcode,                              0x80, \\\n                \"invalid opcode\" )\n  FT_ERRORDEF_( Too_Few_Arguments,                           0x81, \\\n                \"too few arguments\" )\n  FT_ERRORDEF_( Stack_Overflow,                              0x82, \\\n                \"stack overflow\" )\n  FT_ERRORDEF_( Code_Overflow,                               0x83, \\\n                \"code overflow\" )\n  FT_ERRORDEF_( Bad_Argument,                                0x84, \\\n                \"bad argument\" )\n  FT_ERRORDEF_( Divide_By_Zero,                              0x85, \\\n                \"division by zero\" )\n  FT_ERRORDEF_( Invalid_Reference,                           0x86, \\\n                \"invalid reference\" )\n  FT_ERRORDEF_( Debug_OpCode,                                0x87, \\\n                \"found debug opcode\" )\n  FT_ERRORDEF_( ENDF_In_Exec_Stream,                         0x88, \\\n                \"found ENDF opcode in execution stream\" )\n  FT_ERRORDEF_( Nested_DEFS,                                 0x89, \\\n                \"nested DEFS\" )\n  FT_ERRORDEF_( Invalid_CodeRange,                           0x8A, \\\n                \"invalid code range\" )\n  FT_ERRORDEF_( Execution_Too_Long,                          0x8B, \\\n                \"execution context too long\" )\n  FT_ERRORDEF_( Too_Many_Function_Defs,                      0x8C, \\\n                \"too many function definitions\" )\n  FT_ERRORDEF_( Too_Many_Instruction_Defs,                   0x8D, \\\n                \"too many instruction definitions\" )\n  FT_ERRORDEF_( Table_Missing,                               0x8E, \\\n                \"SFNT font table missing\" )\n  FT_ERRORDEF_( Horiz_Header_Missing,                        0x8F, \\\n                \"horizontal header (hhea) table missing\" )\n  FT_ERRORDEF_( Locations_Missing,                           0x90, \\\n                \"locations (loca) table missing\" )\n  FT_ERRORDEF_( Name_Table_Missing,                          0x91, \\\n                \"name table missing\" )\n  FT_ERRORDEF_( CMap_Table_Missing,                          0x92, \\\n                \"character map (cmap) table missing\" )\n  FT_ERRORDEF_( Hmtx_Table_Missing,                          0x93, \\\n                \"horizontal metrics (hmtx) table missing\" )\n  FT_ERRORDEF_( Post_Table_Missing,                          0x94, \\\n                \"PostScript (post) table missing\" )\n  FT_ERRORDEF_( Invalid_Horiz_Metrics,                       0x95, \\\n                \"invalid horizontal metrics\" )\n  FT_ERRORDEF_( Invalid_CharMap_Format,                      0x96, \\\n                \"invalid character map (cmap) format\" )\n  FT_ERRORDEF_( Invalid_PPem,                                0x97, \\\n                \"invalid ppem value\" )\n  FT_ERRORDEF_( Invalid_Vert_Metrics,                        0x98, \\\n                \"invalid vertical metrics\" )\n  FT_ERRORDEF_( Could_Not_Find_Context,                      0x99, \\\n                \"could not find context\" )\n  FT_ERRORDEF_( Invalid_Post_Table_Format,                   0x9A, \\\n                \"invalid PostScript (post) table format\" )\n  FT_ERRORDEF_( Invalid_Post_Table,                          0x9B, \\\n                \"invalid PostScript (post) table\" )\n\n  /* CFF, CID, and Type 1 errors */\n\n  FT_ERRORDEF_( Syntax_Error,                                0xA0, \\\n                \"opcode syntax error\" )\n  FT_ERRORDEF_( Stack_Underflow,                             0xA1, \\\n                \"argument stack underflow\" )\n  FT_ERRORDEF_( Ignore,                                      0xA2, \\\n                \"ignore\" )\n  FT_ERRORDEF_( No_Unicode_Glyph_Name,                       0xA3, \\\n                \"no Unicode glyph name found\" )\n  FT_ERRORDEF_( Glyph_Too_Big,                               0xA4, \\\n                \"glyph to big for hinting\" )\n\n  /* BDF errors */\n\n  FT_ERRORDEF_( Missing_Startfont_Field,                     0xB0, \\\n                \"`STARTFONT' field missing\" )\n  FT_ERRORDEF_( Missing_Font_Field,                          0xB1, \\\n                \"`FONT' field missing\" )\n  FT_ERRORDEF_( Missing_Size_Field,                          0xB2, \\\n                \"`SIZE' field missing\" )\n  FT_ERRORDEF_( Missing_Fontboundingbox_Field,               0xB3, \\\n                \"`FONTBOUNDINGBOX' field missing\" )\n  FT_ERRORDEF_( Missing_Chars_Field,                         0xB4, \\\n                \"`CHARS' field missing\" )\n  FT_ERRORDEF_( Missing_Startchar_Field,                     0xB5, \\\n                \"`STARTCHAR' field missing\" )\n  FT_ERRORDEF_( Missing_Encoding_Field,                      0xB6, \\\n                \"`ENCODING' field missing\" )\n  FT_ERRORDEF_( Missing_Bbx_Field,                           0xB7, \\\n                \"`BBX' field missing\" )\n  FT_ERRORDEF_( Bbx_Too_Big,                                 0xB8, \\\n                \"`BBX' too big\" )\n  FT_ERRORDEF_( Corrupted_Font_Header,                       0xB9, \\\n                \"Font header corrupted or missing fields\" )\n  FT_ERRORDEF_( Corrupted_Font_Glyphs,                       0xBA, \\\n                \"Font glyphs corrupted or missing fields\" )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/fterrors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fterrors.h                                                             */\n/*                                                                         */\n/*    FreeType error code handling (specification).                        */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2007, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This special header file is used to define the handling of FT2        */\n  /* enumeration constants.  It can also be used to generate error message */\n  /* strings with a small macro trick explained below.                     */\n  /*                                                                       */\n  /* I - Error Formats                                                     */\n  /* -----------------                                                     */\n  /*                                                                       */\n  /*   The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be   */\n  /*   defined in ftoption.h in order to make the higher byte indicate     */\n  /*   the module where the error has happened (this is not compatible     */\n  /*   with standard builds of FreeType 2).  See the file `ftmoderr.h' for */\n  /*   more details.                                                       */\n  /*                                                                       */\n  /*                                                                       */\n  /* II - Error Message strings                                            */\n  /* --------------------------                                            */\n  /*                                                                       */\n  /*   The error definitions below are made through special macros that    */\n  /*   allow client applications to build a table of error message strings */\n  /*   if they need it.  The strings are not included in a normal build of */\n  /*   FreeType 2 to save space (most client applications do not use       */\n  /*   them).                                                              */\n  /*                                                                       */\n  /*   To do so, you have to define the following macros before including  */\n  /*   this file:                                                          */\n  /*                                                                       */\n  /*   FT_ERROR_START_LIST ::                                              */\n  /*     This macro is called before anything else to define the start of  */\n  /*     the error list.  It is followed by several FT_ERROR_DEF calls     */\n  /*     (see below).                                                      */\n  /*                                                                       */\n  /*   FT_ERROR_DEF( e, v, s ) ::                                          */\n  /*     This macro is called to define one single error.                  */\n  /*     `e' is the error code identifier (e.g. FT_Err_Invalid_Argument).  */\n  /*     `v' is the error numerical value.                                 */\n  /*     `s' is the corresponding error string.                            */\n  /*                                                                       */\n  /*   FT_ERROR_END_LIST ::                                                */\n  /*     This macro ends the list.                                         */\n  /*                                                                       */\n  /*   Additionally, you have to undefine __FTERRORS_H__ before #including */\n  /*   this file.                                                          */\n  /*                                                                       */\n  /*   Here is a simple example:                                           */\n  /*                                                                       */\n  /*     {                                                                 */\n  /*       #undef __FTERRORS_H__                                           */\n  /*       #define FT_ERRORDEF( e, v, s )  { e, s },                       */\n  /*       #define FT_ERROR_START_LIST     {                               */\n  /*       #define FT_ERROR_END_LIST       { 0, 0 } };                     */\n  /*                                                                       */\n  /*       const struct                                                    */\n  /*       {                                                               */\n  /*         int          err_code;                                        */\n  /*         const char*  err_msg;                                         */\n  /*       } ft_errors[] =                                                 */\n  /*                                                                       */\n  /*       #include FT_ERRORS_H                                            */\n  /*     }                                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTERRORS_H__\n#define __FTERRORS_H__\n\n\n  /* include module base error codes */\n#include FT_MODULE_ERRORS_H\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                       SETUP MACROS                      *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#undef  FT_NEED_EXTERN_C\n\n\n  /* FT_ERR_PREFIX is used as a prefix for error identifiers. */\n  /* By default, we use `FT_Err_'.                            */\n  /*                                                          */\n#ifndef FT_ERR_PREFIX\n#define FT_ERR_PREFIX  FT_Err_\n#endif\n\n\n  /* FT_ERR_BASE is used as the base for module-specific errors. */\n  /*                                                             */\n#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n\n#ifndef FT_ERR_BASE\n#define FT_ERR_BASE  FT_Mod_Err_Base\n#endif\n\n#else\n\n#undef FT_ERR_BASE\n#define FT_ERR_BASE  0\n\n#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */\n\n\n  /* If FT_ERRORDEF is not defined, we need to define a simple */\n  /* enumeration type.                                         */\n  /*                                                           */\n#ifndef FT_ERRORDEF\n\n#define FT_ERRORDEF( e, v, s )  e = v,\n#define FT_ERROR_START_LIST     enum {\n#define FT_ERROR_END_LIST       FT_ERR_CAT( FT_ERR_PREFIX, Max ) };\n\n#ifdef __cplusplus\n#define FT_NEED_EXTERN_C\n  extern \"C\" {\n#endif\n\n#endif /* !FT_ERRORDEF */\n\n\n  /* this macro is used to define an error */\n#define FT_ERRORDEF_( e, v, s )                                             \\\n          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )\n\n  /* this is only used for <module>_Err_Ok, which must be 0! */\n#define FT_NOERRORDEF_( e, v, s )                             \\\n          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )\n\n\n#ifdef FT_ERROR_START_LIST\n  FT_ERROR_START_LIST\n#endif\n\n\n  /* now include the error codes */\n#include FT_ERROR_DEFINITIONS_H\n\n\n#ifdef FT_ERROR_END_LIST\n  FT_ERROR_END_LIST\n#endif\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                      SIMPLE CLEANUP                     *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n#ifdef FT_NEED_EXTERN_C\n  }\n#endif\n\n#undef FT_ERROR_START_LIST\n#undef FT_ERROR_END_LIST\n\n#undef FT_ERRORDEF\n#undef FT_ERRORDEF_\n#undef FT_NOERRORDEF_\n\n#undef FT_NEED_EXTERN_C\n#undef FT_ERR_BASE\n\n  /* FT_ERR_PREFIX is needed internally */\n#ifndef FT2_BUILD_LIBRARY\n#undef FT_ERR_PREFIX\n#endif\n\n#endif /* __FTERRORS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftgasp.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgasp.h                                                               */\n/*                                                                         */\n/*    Access of TrueType's `gasp' table (specification).                   */\n/*                                                                         */\n/*  Copyright 2007, 2008, 2011 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef _FT_GASP_H_\n#define _FT_GASP_H_\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\n  /***************************************************************************\n   *\n   * @section:\n   *   gasp_table\n   *\n   * @title:\n   *   Gasp Table\n   *\n   * @abstract:\n   *   Retrieving TrueType `gasp' table entries.\n   *\n   * @description:\n   *   The function @FT_Get_Gasp can be used to query a TrueType or OpenType\n   *   font for specific entries in its `gasp' table, if any.  This is\n   *   mainly useful when implementing native TrueType hinting with the\n   *   bytecode interpreter to duplicate the Windows text rendering results.\n   */\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FT_GASP_XXX\n   *\n   * @description:\n   *   A list of values and/or bit-flags returned by the @FT_Get_Gasp\n   *   function.\n   *\n   * @values:\n   *   FT_GASP_NO_TABLE ::\n   *     This special value means that there is no GASP table in this face.\n   *     It is up to the client to decide what to do.\n   *\n   *   FT_GASP_DO_GRIDFIT ::\n   *     Grid-fitting and hinting should be performed at the specified ppem.\n   *     This *really* means TrueType bytecode interpretation.  If this bit\n   *     is not set, no hinting gets applied.\n   *\n   *   FT_GASP_DO_GRAY ::\n   *     Anti-aliased rendering should be performed at the specified ppem.\n   *     If not set, do monochrome rendering.\n   *\n   *   FT_GASP_SYMMETRIC_SMOOTHING ::\n   *     If set, smoothing along multiple axes must be used with ClearType.\n   *\n   *   FT_GASP_SYMMETRIC_GRIDFIT ::\n   *     Grid-fitting must be used with ClearType's symmetric smoothing.\n   *\n   * @note:\n   *   The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be\n   *   used for standard font rasterization only.  Independently of that,\n   *   `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to\n   *   be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and\n   *   `FT_GASP_DO_GRAY' are consequently ignored).\n   *\n   *   `ClearType' is Microsoft's implementation of LCD rendering, partly\n   *   protected by patents.\n   *\n   * @since:\n   *   2.3.0\n   */\n#define FT_GASP_NO_TABLE               -1\n#define FT_GASP_DO_GRIDFIT           0x01\n#define FT_GASP_DO_GRAY              0x02\n#define FT_GASP_SYMMETRIC_SMOOTHING  0x08\n#define FT_GASP_SYMMETRIC_GRIDFIT    0x10\n\n\n  /*************************************************************************\n   *\n   * @func:\n   *   FT_Get_Gasp\n   *\n   * @description:\n   *   Read the `gasp' table from a TrueType or OpenType font file and\n   *   return the entry corresponding to a given character pixel size.\n   *\n   * @input:\n   *   face :: The source face handle.\n   *   ppem :: The vertical character pixel size.\n   *\n   * @return:\n   *   Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no\n   *   `gasp' table in the face.\n   *\n   * @since:\n   *   2.3.0\n   */\n  FT_EXPORT( FT_Int )\n  FT_Get_Gasp( FT_Face  face,\n               FT_UInt  ppem );\n\n/* */\n\n#endif /* _FT_GASP_H_ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftglyph.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftglyph.h                                                              */\n/*                                                                         */\n/*    FreeType convenience functions to handle glyphs (specification).     */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006, 2008, 2009, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file contains the definition of several convenience functions    */\n  /* that can be used by client applications to easily retrieve glyph      */\n  /* bitmaps and outlines from a given face.                               */\n  /*                                                                       */\n  /* These functions should be optional if you are writing a font server   */\n  /* or text layout engine on top of FreeType.  However, they are pretty   */\n  /* handy for many other simple uses of the library.                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTGLYPH_H__\n#define __FTGLYPH_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    glyph_management                                                   */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Glyph Management                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Generic interface to manage individual glyph data.                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains definitions used to manage glyph data        */\n  /*    through generic FT_Glyph objects.  Each of them can contain a      */\n  /*    bitmap, a vector outline, or even images in other formats.         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* forward declaration to a private type */\n  typedef struct FT_Glyph_Class_  FT_Glyph_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Glyph                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Handle to an object used to model generic glyph images.  It is a   */\n  /*    pointer to the @FT_GlyphRec structure and can contain a glyph      */\n  /*    bitmap or pointer.                                                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Glyph objects are not owned by the library.  You must thus release */\n  /*    them manually (through @FT_Done_Glyph) _before_ calling            */\n  /*    @FT_Done_FreeType.                                                 */\n  /*                                                                       */\n  typedef struct FT_GlyphRec_*  FT_Glyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_GlyphRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The root glyph structure contains a given glyph image plus its     */\n  /*    advance width in 16.16 fixed-point format.                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    library :: A handle to the FreeType library object.                */\n  /*                                                                       */\n  /*    clazz   :: A pointer to the glyph's class.  Private.               */\n  /*                                                                       */\n  /*    format  :: The format of the glyph's image.                        */\n  /*                                                                       */\n  /*    advance :: A 16.16 vector that gives the glyph's advance width.    */\n  /*                                                                       */\n  typedef struct  FT_GlyphRec_\n  {\n    FT_Library             library;\n    const FT_Glyph_Class*  clazz;\n    FT_Glyph_Format        format;\n    FT_Vector              advance;\n\n  } FT_GlyphRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_BitmapGlyph                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an object used to model a bitmap glyph image.  This is */\n  /*    a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec.     */\n  /*                                                                       */\n  typedef struct FT_BitmapGlyphRec_*  FT_BitmapGlyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_BitmapGlyphRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used for bitmap glyph images.  This really is a        */\n  /*    `sub-class' of @FT_GlyphRec.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root   :: The root @FT_Glyph fields.                               */\n  /*                                                                       */\n  /*    left   :: The left-side bearing, i.e., the horizontal distance     */\n  /*              from the current pen position to the left border of the  */\n  /*              glyph bitmap.                                            */\n  /*                                                                       */\n  /*    top    :: The top-side bearing, i.e., the vertical distance from   */\n  /*              the current pen position to the top border of the glyph  */\n  /*              bitmap.  This distance is positive for upwards~y!        */\n  /*                                                                       */\n  /*    bitmap :: A descriptor for the bitmap.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have       */\n  /*    `glyph->format == FT_GLYPH_FORMAT_BITMAP'.  This lets you access   */\n  /*    the bitmap's contents easily.                                      */\n  /*                                                                       */\n  /*    The corresponding pixel buffer is always owned by @FT_BitmapGlyph  */\n  /*    and is thus created and destroyed with it.                         */\n  /*                                                                       */\n  typedef struct  FT_BitmapGlyphRec_\n  {\n    FT_GlyphRec  root;\n    FT_Int       left;\n    FT_Int       top;\n    FT_Bitmap    bitmap;\n\n  } FT_BitmapGlyphRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_OutlineGlyph                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an object used to model an outline glyph image.  This  */\n  /*    is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */\n  /*                                                                       */\n  typedef struct FT_OutlineGlyphRec_*  FT_OutlineGlyph;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_OutlineGlyphRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used for outline (vectorial) glyph images.  This       */\n  /*    really is a `sub-class' of @FT_GlyphRec.                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root    :: The root @FT_Glyph fields.                              */\n  /*                                                                       */\n  /*    outline :: A descriptor for the outline.                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have      */\n  /*    `glyph->format == FT_GLYPH_FORMAT_OUTLINE'.  This lets you access  */\n  /*    the outline's content easily.                                      */\n  /*                                                                       */\n  /*    As the outline is extracted from a glyph slot, its coordinates are */\n  /*    expressed normally in 26.6 pixels, unless the flag                 */\n  /*    @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */\n  /*                                                                       */\n  /*    The outline's tables are always owned by the object and are        */\n  /*    destroyed with it.                                                 */\n  /*                                                                       */\n  typedef struct  FT_OutlineGlyphRec_\n  {\n    FT_GlyphRec  root;\n    FT_Outline   outline;\n\n  } FT_OutlineGlyphRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Glyph                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to extract a glyph image from a slot.  Note that   */\n  /*    the created @FT_Glyph object must be released with @FT_Done_Glyph. */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot   :: A handle to the source glyph slot.                       */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aglyph :: A handle to the glyph object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Glyph( FT_GlyphSlot  slot,\n                FT_Glyph     *aglyph );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_Copy                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to copy a glyph image.  Note that the created      */\n  /*    @FT_Glyph object must be released with @FT_Done_Glyph.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    source :: A handle to the source glyph object.                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target :: A handle to the target glyph object.  0~in case of       */\n  /*              error.                                                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_Copy( FT_Glyph   source,\n                 FT_Glyph  *target );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_Transform                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Transform a glyph image if its format is scalable.                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    glyph  :: A handle to the target glyph object.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix :: A pointer to a 2x2 matrix to apply.                      */\n  /*                                                                       */\n  /*    delta  :: A pointer to a 2d vector to apply.  Coordinates are      */\n  /*              expressed in 1/64th of a pixel.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code (if not 0, the glyph format is not scalable).  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The 2x2 transformation matrix is also applied to the glyph's       */\n  /*    advance vector.                                                    */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_Transform( FT_Glyph    glyph,\n                      FT_Matrix*  matrix,\n                      FT_Vector*  delta );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Glyph_BBox_Mode                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The mode how the values of @FT_Glyph_Get_CBox are returned.        */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_GLYPH_BBOX_UNSCALED ::                                          */\n  /*      Return unscaled font units.                                      */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_SUBPIXELS ::                                         */\n  /*      Return unfitted 26.6 coordinates.                                */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_GRIDFIT ::                                           */\n  /*      Return grid-fitted 26.6 coordinates.                             */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_TRUNCATE ::                                          */\n  /*      Return coordinates in integer pixels.                            */\n  /*                                                                       */\n  /*    FT_GLYPH_BBOX_PIXELS ::                                            */\n  /*      Return grid-fitted pixel coordinates.                            */\n  /*                                                                       */\n  typedef enum  FT_Glyph_BBox_Mode_\n  {\n    FT_GLYPH_BBOX_UNSCALED  = 0,\n    FT_GLYPH_BBOX_SUBPIXELS = 0,\n    FT_GLYPH_BBOX_GRIDFIT   = 1,\n    FT_GLYPH_BBOX_TRUNCATE  = 2,\n    FT_GLYPH_BBOX_PIXELS    = 3\n\n  } FT_Glyph_BBox_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_glyph_bbox_xxx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    These constants are deprecated.  Use the corresponding             */\n  /*    @FT_Glyph_BBox_Mode values instead.                                */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*   ft_glyph_bbox_unscaled  :: See @FT_GLYPH_BBOX_UNSCALED.             */\n  /*   ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS.            */\n  /*   ft_glyph_bbox_gridfit   :: See @FT_GLYPH_BBOX_GRIDFIT.              */\n  /*   ft_glyph_bbox_truncate  :: See @FT_GLYPH_BBOX_TRUNCATE.             */\n  /*   ft_glyph_bbox_pixels    :: See @FT_GLYPH_BBOX_PIXELS.               */\n  /*                                                                       */\n#define ft_glyph_bbox_unscaled   FT_GLYPH_BBOX_UNSCALED\n#define ft_glyph_bbox_subpixels  FT_GLYPH_BBOX_SUBPIXELS\n#define ft_glyph_bbox_gridfit    FT_GLYPH_BBOX_GRIDFIT\n#define ft_glyph_bbox_truncate   FT_GLYPH_BBOX_TRUNCATE\n#define ft_glyph_bbox_pixels     FT_GLYPH_BBOX_PIXELS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_Get_CBox                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a glyph's `control box'.  The control box encloses all the  */\n  /*    outline's points, including Bézier control points.  Though it      */\n  /*    coincides with the exact bounding box for most glyphs, it can be   */\n  /*    slightly larger in some situations (like when rotating an outline  */\n  /*    which contains Bézier outside arcs).                               */\n  /*                                                                       */\n  /*    Computing the control box is very fast, while getting the bounding */\n  /*    box can take much more time as it needs to walk over all segments  */\n  /*    and arcs in the outline.  To get the latter, you can use the       */\n  /*    `ftbbox' component which is dedicated to this single task.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph :: A handle to the source glyph object.                      */\n  /*                                                                       */\n  /*    mode  :: The mode which indicates how to interpret the returned    */\n  /*             bounding box values.                                      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acbox :: The glyph coordinate bounding box.  Coordinates are       */\n  /*             expressed in 1/64th of pixels if it is grid-fitted.       */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Coordinates are relative to the glyph origin, using the y~upwards  */\n  /*    convention.                                                        */\n  /*                                                                       */\n  /*    If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode'   */\n  /*    must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font        */\n  /*    units in 26.6 pixel format.  The value @FT_GLYPH_BBOX_SUBPIXELS    */\n  /*    is another name for this constant.                                 */\n  /*                                                                       */\n  /*    If the font is tricky and the glyph has been loaded with           */\n  /*    @FT_LOAD_NO_SCALE, the resulting CBox is meaningless.  To get      */\n  /*    reasonable values for the CBox it is necessary to load the glyph   */\n  /*    at a large ppem value (so that the hinting instructions can        */\n  /*    properly shift and scale the subglyphs), then extracting the CBox  */\n  /*    which can be eventually converted back to font units.              */\n  /*                                                                       */\n  /*    Note that the maximum coordinates are exclusive, which means that  */\n  /*    one can compute the width and height of the glyph image (be it in  */\n  /*    integer or 26.6 pixels) as:                                        */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      width  = bbox.xMax - bbox.xMin;                                  */\n  /*      height = bbox.yMax - bbox.yMin;                                  */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Note also that for 26.6 coordinates, if `bbox_mode' is set to      */\n  /*    @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted,  */\n  /*    which corresponds to:                                              */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      bbox.xMin = FLOOR(bbox.xMin);                                    */\n  /*      bbox.yMin = FLOOR(bbox.yMin);                                    */\n  /*      bbox.xMax = CEILING(bbox.xMax);                                  */\n  /*      bbox.yMax = CEILING(bbox.yMax);                                  */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    To get the bbox in pixel coordinates, set `bbox_mode' to           */\n  /*    @FT_GLYPH_BBOX_TRUNCATE.                                           */\n  /*                                                                       */\n  /*    To get the bbox in grid-fitted pixel coordinates, set `bbox_mode'  */\n  /*    to @FT_GLYPH_BBOX_PIXELS.                                          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Glyph_Get_CBox( FT_Glyph  glyph,\n                     FT_UInt   bbox_mode,\n                     FT_BBox  *acbox );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Glyph_To_Bitmap                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a given glyph object to a bitmap glyph object.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    the_glyph   :: A pointer to a handle to the target glyph.          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    render_mode :: An enumeration that describes how the data is       */\n  /*                   rendered.                                           */\n  /*                                                                       */\n  /*    origin      :: A pointer to a vector used to translate the glyph   */\n  /*                   image before rendering.  Can be~0 (if no            */\n  /*                   translation).  The origin is expressed in           */\n  /*                   26.6 pixels.                                        */\n  /*                                                                       */\n  /*    destroy     :: A boolean that indicates that the original glyph    */\n  /*                   image should be destroyed by this function.  It is  */\n  /*                   never destroyed in case of error.                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does nothing if the glyph format isn't scalable.     */\n  /*                                                                       */\n  /*    The glyph image is translated with the `origin' vector before      */\n  /*    rendering.                                                         */\n  /*                                                                       */\n  /*    The first parameter is a pointer to an @FT_Glyph handle, that will */\n  /*    be _replaced_ by this function (with newly allocated data).        */\n  /*    Typically, you would use (omitting error handling):                */\n  /*                                                                       */\n  /*                                                                       */\n  /*      {                                                                */\n  /*        FT_Glyph        glyph;                                         */\n  /*        FT_BitmapGlyph  glyph_bitmap;                                  */\n  /*                                                                       */\n  /*                                                                       */\n  /*        // load glyph                                                  */\n  /*        error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT );     */\n  /*                                                                       */\n  /*        // extract glyph image                                         */\n  /*        error = FT_Get_Glyph( face->glyph, &glyph );                   */\n  /*                                                                       */\n  /*        // convert to a bitmap (default render mode + destroying old)  */\n  /*        if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )                 */\n  /*        {                                                              */\n  /*          error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL,   */\n  /*                                      0, 1 );                          */\n  /*          if ( error ) // `glyph' unchanged                            */\n  /*            ...                                                        */\n  /*        }                                                              */\n  /*                                                                       */\n  /*        // access bitmap content by typecasting                        */\n  /*        glyph_bitmap = (FT_BitmapGlyph)glyph;                          */\n  /*                                                                       */\n  /*        // do funny stuff with it, like blitting/drawing               */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        // discard glyph image (bitmap or not)                         */\n  /*        FT_Done_Glyph( glyph );                                        */\n  /*      }                                                                */\n  /*                                                                       */\n  /*                                                                       */\n  /*    Here another example, again without error handling:                */\n  /*                                                                       */\n  /*                                                                       */\n  /*      {                                                                */\n  /*        FT_Glyph  glyphs[MAX_GLYPHS]                                   */\n  /*                                                                       */\n  /*                                                                       */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */\n  /*          error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||       */\n  /*                  FT_Get_Glyph ( face->glyph, &glyph[idx] );           */\n  /*                                                                       */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */\n  /*        {                                                              */\n  /*          FT_Glyph  bitmap = glyphs[idx];                              */\n  /*                                                                       */\n  /*                                                                       */\n  /*          ...                                                          */\n  /*                                                                       */\n  /*          // after this call, `bitmap' no longer points into           */\n  /*          // the `glyphs' array (and the old value isn't destroyed)    */\n  /*          FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 );    */\n  /*                                                                       */\n  /*          ...                                                          */\n  /*                                                                       */\n  /*          FT_Done_Glyph( bitmap );                                     */\n  /*        }                                                              */\n  /*                                                                       */\n  /*        ...                                                            */\n  /*                                                                       */\n  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */\n  /*          FT_Done_Glyph( glyphs[idx] );                                */\n  /*      }                                                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,\n                      FT_Render_Mode  render_mode,\n                      FT_Vector*      origin,\n                      FT_Bool         destroy );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy a given glyph.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph :: A handle to the target glyph object.                      */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Done_Glyph( FT_Glyph  glyph );\n\n  /* */\n\n\n  /* other helpful functions */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    computations                                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Matrix_Multiply                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Perform the matrix operation `b = a*b'.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: A pointer to matrix `a'.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    b :: A pointer to matrix `b'.                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The result is undefined if either `a' or `b' is zero.              */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Matrix_Multiply( const FT_Matrix*  a,\n                      FT_Matrix*        b );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Matrix_Invert                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Invert a 2x2 matrix.  Return an error if it can't be inverted.     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    matrix :: A pointer to the target matrix.  Remains untouched in    */\n  /*              case of error.                                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Matrix_Invert( FT_Matrix*  matrix );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGLYPH_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftgxval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgxval.h                                                              */\n/*                                                                         */\n/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006 by                                          */\n/*  Masatake YAMATO, Redhat K.K,                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGXVAL_H__\n#define __FTGXVAL_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    gx_validation                                                      */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    TrueTypeGX/AAT Validation                                          */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    An API to validate TrueTypeGX/AAT tables.                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of functions to validate     */\n  /*    some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd,  */\n  /*    trak, prop, lcar).                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                                                                       */\n  /* Warning: Use FT_VALIDATE_XXX to validate a table.                     */\n  /*          Following definitions are for gxvalid developers.            */\n  /*                                                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define FT_VALIDATE_feat_INDEX     0\n#define FT_VALIDATE_mort_INDEX     1\n#define FT_VALIDATE_morx_INDEX     2\n#define FT_VALIDATE_bsln_INDEX     3\n#define FT_VALIDATE_just_INDEX     4\n#define FT_VALIDATE_kern_INDEX     5\n#define FT_VALIDATE_opbd_INDEX     6\n#define FT_VALIDATE_trak_INDEX     7\n#define FT_VALIDATE_prop_INDEX     8\n#define FT_VALIDATE_lcar_INDEX     9\n#define FT_VALIDATE_GX_LAST_INDEX  FT_VALIDATE_lcar_INDEX\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_VALIDATE_GX_LENGTH\n   *\n   * @description:\n   *   The number of tables checked in this module.  Use it as a parameter\n   *   for the `table-length' argument of function @FT_TrueTypeGX_Validate.\n   */\n#define FT_VALIDATE_GX_LENGTH     (FT_VALIDATE_GX_LAST_INDEX + 1)\n\n  /* */\n\n  /* Up to 0x1000 is used by otvalid.\n     Ox2xxx is reserved for feature OT extension. */\n#define FT_VALIDATE_GX_START 0x4000\n#define FT_VALIDATE_GX_BITFIELD( tag )                  \\\n  ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )\n\n\n /**********************************************************************\n  *\n  * @enum:\n  *    FT_VALIDATE_GXXXX\n  *\n  * @description:\n  *    A list of bit-field constants used with @FT_TrueTypeGX_Validate to\n  *    indicate which TrueTypeGX/AAT Type tables should be validated.\n  *\n  * @values:\n  *    FT_VALIDATE_feat ::\n  *      Validate `feat' table.\n  *\n  *    FT_VALIDATE_mort ::\n  *      Validate `mort' table.\n  *\n  *    FT_VALIDATE_morx ::\n  *      Validate `morx' table.\n  *\n  *    FT_VALIDATE_bsln ::\n  *      Validate `bsln' table.\n  *\n  *    FT_VALIDATE_just ::\n  *      Validate `just' table.\n  *\n  *    FT_VALIDATE_kern ::\n  *      Validate `kern' table.\n  *\n  *    FT_VALIDATE_opbd ::\n  *      Validate `opbd' table.\n  *\n  *    FT_VALIDATE_trak ::\n  *      Validate `trak' table.\n  *\n  *    FT_VALIDATE_prop ::\n  *      Validate `prop' table.\n  *\n  *    FT_VALIDATE_lcar ::\n  *      Validate `lcar' table.\n  *\n  *    FT_VALIDATE_GX ::\n  *      Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,\n  *      opbd, trak, prop and lcar).\n  *\n  */\n\n#define FT_VALIDATE_feat  FT_VALIDATE_GX_BITFIELD( feat )\n#define FT_VALIDATE_mort  FT_VALIDATE_GX_BITFIELD( mort )\n#define FT_VALIDATE_morx  FT_VALIDATE_GX_BITFIELD( morx )\n#define FT_VALIDATE_bsln  FT_VALIDATE_GX_BITFIELD( bsln )\n#define FT_VALIDATE_just  FT_VALIDATE_GX_BITFIELD( just )\n#define FT_VALIDATE_kern  FT_VALIDATE_GX_BITFIELD( kern )\n#define FT_VALIDATE_opbd  FT_VALIDATE_GX_BITFIELD( opbd )\n#define FT_VALIDATE_trak  FT_VALIDATE_GX_BITFIELD( trak )\n#define FT_VALIDATE_prop  FT_VALIDATE_GX_BITFIELD( prop )\n#define FT_VALIDATE_lcar  FT_VALIDATE_GX_BITFIELD( lcar )\n\n#define FT_VALIDATE_GX  ( FT_VALIDATE_feat | \\\n                          FT_VALIDATE_mort | \\\n                          FT_VALIDATE_morx | \\\n                          FT_VALIDATE_bsln | \\\n                          FT_VALIDATE_just | \\\n                          FT_VALIDATE_kern | \\\n                          FT_VALIDATE_opbd | \\\n                          FT_VALIDATE_trak | \\\n                          FT_VALIDATE_prop | \\\n                          FT_VALIDATE_lcar )\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_TrueTypeGX_Validate\n  *\n  * @description:\n  *    Validate various TrueTypeGX tables to assure that all offsets and\n  *    indices are valid.  The idea is that a higher-level library which\n  *    actually does the text layout can access those tables without\n  *    error checking (which can be quite time consuming).\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    validation_flags ::\n  *       A bit field which specifies the tables to be validated.  See\n  *       @FT_VALIDATE_GXXXX for possible values.\n  *\n  *    table_length ::\n  *       The size of the `tables' array.  Normally, @FT_VALIDATE_GX_LENGTH\n  *       should be passed.\n  *\n  * @output:\n  *    tables ::\n  *       The array where all validated sfnt tables are stored.\n  *       The array itself must be allocated by a client.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function only works with TrueTypeGX fonts, returning an error\n  *   otherwise.\n  *\n  *   After use, the application should deallocate the buffers pointed to by\n  *   each `tables' element, by calling @FT_TrueTypeGX_Free.  A NULL value\n  *   indicates that the table either doesn't exist in the font, the\n  *   application hasn't asked for validation, or the validator doesn't have\n  *   the ability to validate the sfnt table.\n  */\n  FT_EXPORT( FT_Error )\n  FT_TrueTypeGX_Validate( FT_Face   face,\n                          FT_UInt   validation_flags,\n                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],\n                          FT_UInt   table_length );\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_TrueTypeGX_Free\n  *\n  * @description:\n  *    Free the buffer allocated by TrueTypeGX validator.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    table ::\n  *       The pointer to the buffer allocated by\n  *       @FT_TrueTypeGX_Validate.\n  *\n  * @note:\n  *   This function must be used to free the buffer allocated by\n  *   @FT_TrueTypeGX_Validate only.\n  */\n  FT_EXPORT( void )\n  FT_TrueTypeGX_Free( FT_Face   face,\n                      FT_Bytes  table );\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @enum:\n  *    FT_VALIDATE_CKERNXXX\n  *\n  * @description:\n  *    A list of bit-field constants used with @FT_ClassicKern_Validate\n  *    to indicate the classic kern dialect or dialects.  If the selected\n  *    type doesn't fit, @FT_ClassicKern_Validate regards the table as\n  *    invalid.\n  *\n  * @values:\n  *    FT_VALIDATE_MS ::\n  *      Handle the `kern' table as a classic Microsoft kern table.\n  *\n  *    FT_VALIDATE_APPLE ::\n  *      Handle the `kern' table as a classic Apple kern table.\n  *\n  *    FT_VALIDATE_CKERN ::\n  *      Handle the `kern' as either classic Apple or Microsoft kern table.\n  */\n#define FT_VALIDATE_MS     ( FT_VALIDATE_GX_START << 0 )\n#define FT_VALIDATE_APPLE  ( FT_VALIDATE_GX_START << 1 )\n\n#define FT_VALIDATE_CKERN  ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_ClassicKern_Validate\n  *\n  * @description:\n  *    Validate classic (16-bit format) kern table to assure that the offsets\n  *    and indices are valid.  The idea is that a higher-level library which\n  *    actually does the text layout can access those tables without error\n  *    checking (which can be quite time consuming).\n  *\n  *    The `kern' table validator in @FT_TrueTypeGX_Validate deals with both\n  *    the new 32-bit format and the classic 16-bit format, while\n  *    FT_ClassicKern_Validate only supports the classic 16-bit format.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    validation_flags ::\n  *       A bit field which specifies the dialect to be validated.  See\n  *       @FT_VALIDATE_CKERNXXX for possible values.\n  *\n  * @output:\n  *    ckern_table ::\n  *       A pointer to the kern table.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   After use, the application should deallocate the buffers pointed to by\n  *   `ckern_table', by calling @FT_ClassicKern_Free.  A NULL value\n  *   indicates that the table doesn't exist in the font.\n  */\n  FT_EXPORT( FT_Error )\n  FT_ClassicKern_Validate( FT_Face    face,\n                           FT_UInt    validation_flags,\n                           FT_Bytes  *ckern_table );\n\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_ClassicKern_Free\n  *\n  * @description:\n  *    Free the buffer allocated by classic Kern validator.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    table ::\n  *       The pointer to the buffer that is allocated by\n  *       @FT_ClassicKern_Validate.\n  *\n  * @note:\n  *   This function must be used to free the buffer allocated by\n  *   @FT_ClassicKern_Validate only.\n  */\n  FT_EXPORT( void )\n  FT_ClassicKern_Free( FT_Face   face,\n                       FT_Bytes  table );\n\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGXVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftgzip.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgzip.h                                                               */\n/*                                                                         */\n/*    Gzip-compressed stream support.                                      */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGZIP_H__\n#define __FTGZIP_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    gzip                                                               */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    GZIP Streams                                                       */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Using gzip-compressed font files.                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of Gzip-specific functions.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /************************************************************************\n  *\n  * @function:\n  *   FT_Stream_OpenGzip\n  *\n  * @description:\n  *   Open a new stream to parse gzip-compressed font files.  This is\n  *   mainly used to support the compressed `*.pcf.gz' fonts that come\n  *   with XFree86.\n  *\n  * @input:\n  *   stream ::\n  *     The target embedding stream.\n  *\n  *   source ::\n  *     The source stream.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   The source stream must be opened _before_ calling this function.\n  *\n  *   Calling the internal function `FT_Stream_Close' on the new stream will\n  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream\n  *   objects will be released to the heap.\n  *\n  *   The stream implementation is very basic and resets the decompression\n  *   process each time seeking backwards is needed within the stream.\n  *\n  *   In certain builds of the library, gzip compression recognition is\n  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.\n  *   This means that if no font driver is capable of handling the raw\n  *   compressed file, the library will try to open a gzipped stream from\n  *   it and re-open the face with it.\n  *\n  *   This function may return `FT_Err_Unimplemented_Feature' if your build\n  *   of FreeType was not compiled with zlib support.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Stream_OpenGzip( FT_Stream  stream,\n                      FT_Stream  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGZIP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftimage.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftimage.h                                                              */\n/*                                                                         */\n/*    FreeType glyph image formats and default raster interface            */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,   */\n/*            2010 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Note: A `raster' is simply a scan-line converter, used to render      */\n  /*       FT_Outlines into FT_Bitmaps.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTIMAGE_H__\n#define __FTIMAGE_H__\n\n\n  /* _STANDALONE_ is from ftgrays.c */\n#ifndef _STANDALONE_\n#include <ft2build.h>\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Pos                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The type FT_Pos is used to store vectorial coordinates.  Depending */\n  /*    on the context, these can represent distances in integer font      */\n  /*    units, or 16.16, or 26.6 fixed-point pixel coordinates.            */\n  /*                                                                       */\n  typedef signed long  FT_Pos;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Vector                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to store a 2D vector; coordinates are of   */\n  /*    the FT_Pos type.                                                   */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x :: The horizontal coordinate.                                    */\n  /*    y :: The vertical coordinate.                                      */\n  /*                                                                       */\n  typedef struct  FT_Vector_\n  {\n    FT_Pos  x;\n    FT_Pos  y;\n\n  } FT_Vector;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_BBox                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold an outline's bounding box, i.e., the      */\n  /*    coordinates of its extrema in the horizontal and vertical          */\n  /*    directions.                                                        */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    xMin :: The horizontal minimum (left-most).                        */\n  /*                                                                       */\n  /*    yMin :: The vertical minimum (bottom-most).                        */\n  /*                                                                       */\n  /*    xMax :: The horizontal maximum (right-most).                       */\n  /*                                                                       */\n  /*    yMax :: The vertical maximum (top-most).                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The bounding box is specified with the coordinates of the lower    */\n  /*    left and the upper right corner.  In PostScript, those values are  */\n  /*    often called (llx,lly) and (urx,ury), respectively.                */\n  /*                                                                       */\n  /*    If `yMin' is negative, this value gives the glyph's descender.     */\n  /*    Otherwise, the glyph doesn't descend below the baseline.           */\n  /*    Similarly, if `ymax' is positive, this value gives the glyph's     */\n  /*    ascender.                                                          */\n  /*                                                                       */\n  /*    `xMin' gives the horizontal distance from the glyph's origin to    */\n  /*    the left edge of the glyph's bounding box.  If `xMin' is negative, */\n  /*    the glyph extends to the left of the origin.                       */\n  /*                                                                       */\n  typedef struct  FT_BBox_\n  {\n    FT_Pos  xMin, yMin;\n    FT_Pos  xMax, yMax;\n\n  } FT_BBox;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Pixel_Mode                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type used to describe the format of pixels in a     */\n  /*    given bitmap.  Note that additional formats may be added in the    */\n  /*    future.                                                            */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_PIXEL_MODE_NONE ::                                              */\n  /*      Value~0 is reserved.                                             */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_MONO ::                                              */\n  /*      A monochrome bitmap, using 1~bit per pixel.  Note that pixels    */\n  /*      are stored in most-significant order (MSB), which means that     */\n  /*      the left-most pixel in a byte has value 128.                     */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_GRAY ::                                              */\n  /*      An 8-bit bitmap, generally used to represent anti-aliased glyph  */\n  /*      images.  Each pixel is stored in one byte.  Note that the number */\n  /*      of `gray' levels is stored in the `num_grays' field of the       */\n  /*      @FT_Bitmap structure (it generally is 256).                      */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_GRAY2 ::                                             */\n  /*      A 2-bit per pixel bitmap, used to represent embedded             */\n  /*      anti-aliased bitmaps in font files according to the OpenType     */\n  /*      specification.  We haven't found a single font using this        */\n  /*      format, however.                                                 */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_GRAY4 ::                                             */\n  /*      A 4-bit per pixel bitmap, representing embedded anti-aliased     */\n  /*      bitmaps in font files according to the OpenType specification.   */\n  /*      We haven't found a single font using this format, however.       */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_LCD ::                                               */\n  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */\n  /*      used for display on LCD displays; the bitmap is three times      */\n  /*      wider than the original glyph image.  See also                   */\n  /*      @FT_RENDER_MODE_LCD.                                             */\n  /*                                                                       */\n  /*    FT_PIXEL_MODE_LCD_V ::                                             */\n  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */\n  /*      used for display on rotated LCD displays; the bitmap is three    */\n  /*      times taller than the original glyph image.  See also            */\n  /*      @FT_RENDER_MODE_LCD_V.                                           */\n  /*                                                                       */\n  typedef enum  FT_Pixel_Mode_\n  {\n    FT_PIXEL_MODE_NONE = 0,\n    FT_PIXEL_MODE_MONO,\n    FT_PIXEL_MODE_GRAY,\n    FT_PIXEL_MODE_GRAY2,\n    FT_PIXEL_MODE_GRAY4,\n    FT_PIXEL_MODE_LCD,\n    FT_PIXEL_MODE_LCD_V,\n\n    FT_PIXEL_MODE_MAX      /* do not remove */\n\n  } FT_Pixel_Mode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_pixel_mode_xxx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of deprecated constants.  Use the corresponding             */\n  /*    @FT_Pixel_Mode values instead.                                     */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_pixel_mode_none  :: See @FT_PIXEL_MODE_NONE.                    */\n  /*    ft_pixel_mode_mono  :: See @FT_PIXEL_MODE_MONO.                    */\n  /*    ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY.                    */\n  /*    ft_pixel_mode_pal2  :: See @FT_PIXEL_MODE_GRAY2.                   */\n  /*    ft_pixel_mode_pal4  :: See @FT_PIXEL_MODE_GRAY4.                   */\n  /*                                                                       */\n#define ft_pixel_mode_none   FT_PIXEL_MODE_NONE\n#define ft_pixel_mode_mono   FT_PIXEL_MODE_MONO\n#define ft_pixel_mode_grays  FT_PIXEL_MODE_GRAY\n#define ft_pixel_mode_pal2   FT_PIXEL_MODE_GRAY2\n#define ft_pixel_mode_pal4   FT_PIXEL_MODE_GRAY4\n\n /* */\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Palette_Mode                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT!                           */\n  /*                                                                       */\n  /*    An enumeration type to describe the format of a bitmap palette,    */\n  /*    used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8.               */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_palette_mode_rgb  :: The palette is an array of 3-byte RGB      */\n  /*                            records.                                   */\n  /*                                                                       */\n  /*    ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA     */\n  /*                            records.                                   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by       */\n  /*    FreeType, these types are not handled by the library itself.       */\n  /*                                                                       */\n  typedef enum  FT_Palette_Mode_\n  {\n    ft_palette_mode_rgb = 0,\n    ft_palette_mode_rgba,\n\n    ft_palette_mode_max   /* do not remove */\n\n  } FT_Palette_Mode;\n\n  /* */\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Bitmap                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to describe a bitmap or pixmap to the raster.     */\n  /*    Note that we now manage pixmaps of various depths through the      */\n  /*    `pixel_mode' field.                                                */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    rows         :: The number of bitmap rows.                         */\n  /*                                                                       */\n  /*    width        :: The number of pixels in bitmap row.                */\n  /*                                                                       */\n  /*    pitch        :: The pitch's absolute value is the number of bytes  */\n  /*                    taken by one bitmap row, including padding.        */\n  /*                    However, the pitch is positive when the bitmap has */\n  /*                    a `down' flow, and negative when it has an `up'    */\n  /*                    flow.  In all cases, the pitch is an offset to add */\n  /*                    to a bitmap pointer in order to go down one row.   */\n  /*                                                                       */\n  /*                    Note that `padding' means the alignment of a       */\n  /*                    bitmap to a byte border, and FreeType functions    */\n  /*                    normally align to the smallest possible integer    */\n  /*                    value.                                             */\n  /*                                                                       */\n  /*                    For the B/W rasterizer, `pitch' is always an even  */\n  /*                    number.                                            */\n  /*                                                                       */\n  /*                    To change the pitch of a bitmap (say, to make it a */\n  /*                    multiple of 4), use @FT_Bitmap_Convert.            */\n  /*                    Alternatively, you might use callback functions to */\n  /*                    directly render to the application's surface; see  */\n  /*                    the file `example2.cpp' in the tutorial for a      */\n  /*                    demonstration.                                     */\n  /*                                                                       */\n  /*    buffer       :: A typeless pointer to the bitmap buffer.  This     */\n  /*                    value should be aligned on 32-bit boundaries in    */\n  /*                    most cases.                                        */\n  /*                                                                       */\n  /*    num_grays    :: This field is only used with                       */\n  /*                    @FT_PIXEL_MODE_GRAY; it gives the number of gray   */\n  /*                    levels used in the bitmap.                         */\n  /*                                                                       */\n  /*    pixel_mode   :: The pixel mode, i.e., how pixel bits are stored.   */\n  /*                    See @FT_Pixel_Mode for possible values.            */\n  /*                                                                       */\n  /*    palette_mode :: This field is intended for paletted pixel modes;   */\n  /*                    it indicates how the palette is stored.  Not       */\n  /*                    used currently.                                    */\n  /*                                                                       */\n  /*    palette      :: A typeless pointer to the bitmap palette; this     */\n  /*                    field is intended for paletted pixel modes.  Not   */\n  /*                    used currently.                                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*   For now, the only pixel modes supported by FreeType are mono and    */\n  /*   grays.  However, drivers might be added in the future to support    */\n  /*   more `colorful' options.                                            */\n  /*                                                                       */\n  typedef struct  FT_Bitmap_\n  {\n    int             rows;\n    int             width;\n    int             pitch;\n    unsigned char*  buffer;\n    short           num_grays;\n    char            pixel_mode;\n    char            palette_mode;\n    void*           palette;\n\n  } FT_Bitmap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    outline_processing                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Outline                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure is used to describe an outline to the scan-line     */\n  /*    converter.                                                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    n_contours :: The number of contours in the outline.               */\n  /*                                                                       */\n  /*    n_points   :: The number of points in the outline.                 */\n  /*                                                                       */\n  /*    points     :: A pointer to an array of `n_points' @FT_Vector       */\n  /*                  elements, giving the outline's point coordinates.    */\n  /*                                                                       */\n  /*    tags       :: A pointer to an array of `n_points' chars, giving    */\n  /*                  each outline point's type.                           */\n  /*                                                                       */\n  /*                  If bit~0 is unset, the point is `off' the curve,     */\n  /*                  i.e., a Bézier control point, while it is `on' if    */\n  /*                  set.                                                 */\n  /*                                                                       */\n  /*                  Bit~1 is meaningful for `off' points only.  If set,  */\n  /*                  it indicates a third-order Bézier arc control point; */\n  /*                  and a second-order control point if unset.           */\n  /*                                                                       */\n  /*                  If bit~2 is set, bits 5-7 contain the drop-out mode  */\n  /*                  (as defined in the OpenType specification; the value */\n  /*                  is the same as the argument to the SCANMODE          */\n  /*                  instruction).                                        */\n  /*                                                                       */\n  /*                  Bits 3 and~4 are reserved for internal purposes.     */\n  /*                                                                       */\n  /*    contours   :: An array of `n_contours' shorts, giving the end      */\n  /*                  point of each contour within the outline.  For       */\n  /*                  example, the first contour is defined by the points  */\n  /*                  `0' to `contours[0]', the second one is defined by   */\n  /*                  the points `contours[0]+1' to `contours[1]', etc.    */\n  /*                                                                       */\n  /*    flags      :: A set of bit flags used to characterize the outline  */\n  /*                  and give hints to the scan-converter and hinter on   */\n  /*                  how to convert/grid-fit it.  See @FT_OUTLINE_FLAGS.  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The B/W rasterizer only checks bit~2 in the `tags' array for the   */\n  /*    first point of each contour.  The drop-out mode as given with      */\n  /*    @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and       */\n  /*    @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden.           */\n  /*                                                                       */\n  typedef struct  FT_Outline_\n  {\n    short       n_contours;      /* number of contours in glyph        */\n    short       n_points;        /* number of points in the glyph      */\n\n    FT_Vector*  points;          /* the outline's points               */\n    char*       tags;            /* the points flags                   */\n    short*      contours;        /* the contour end points             */\n\n    int         flags;           /* outline masks                      */\n\n  } FT_Outline;\n\n  /* Following limits must be consistent with */\n  /* FT_Outline.{n_contours,n_points}         */\n#define FT_OUTLINE_CONTOURS_MAX  SHRT_MAX\n#define FT_OUTLINE_POINTS_MAX    SHRT_MAX\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_OUTLINE_FLAGS                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit-field constants use for the flags in an outline's    */\n  /*    `flags' field.                                                     */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_OUTLINE_NONE ::                                                 */\n  /*      Value~0 is reserved.                                             */\n  /*                                                                       */\n  /*    FT_OUTLINE_OWNER ::                                                */\n  /*      If set, this flag indicates that the outline's field arrays      */\n  /*      (i.e., `points', `flags', and `contours') are `owned' by the     */\n  /*      outline object, and should thus be freed when it is destroyed.   */\n  /*                                                                       */\n  /*    FT_OUTLINE_EVEN_ODD_FILL ::                                        */\n  /*      By default, outlines are filled using the non-zero winding rule. */\n  /*      If set to 1, the outline will be filled using the even-odd fill  */\n  /*      rule (only works with the smooth rasterizer).                    */\n  /*                                                                       */\n  /*    FT_OUTLINE_REVERSE_FILL ::                                         */\n  /*      By default, outside contours of an outline are oriented in       */\n  /*      clock-wise direction, as defined in the TrueType specification.  */\n  /*      This flag is set if the outline uses the opposite direction      */\n  /*      (typically for Type~1 fonts).  This flag is ignored by the scan  */\n  /*      converter.                                                       */\n  /*                                                                       */\n  /*    FT_OUTLINE_IGNORE_DROPOUTS ::                                      */\n  /*      By default, the scan converter will try to detect drop-outs in   */\n  /*      an outline and correct the glyph bitmap to ensure consistent     */\n  /*      shape continuity.  If set, this flag hints the scan-line         */\n  /*      converter to ignore such cases.  See below for more information. */\n  /*                                                                       */\n  /*    FT_OUTLINE_SMART_DROPOUTS ::                                       */\n  /*      Select smart dropout control.  If unset, use simple dropout      */\n  /*      control.  Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See    */\n  /*      below for more information.                                      */\n  /*                                                                       */\n  /*    FT_OUTLINE_INCLUDE_STUBS ::                                        */\n  /*      If set, turn pixels on for `stubs', otherwise exclude them.      */\n  /*      Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See below for    */\n  /*      more information.                                                */\n  /*                                                                       */\n  /*    FT_OUTLINE_HIGH_PRECISION ::                                       */\n  /*      This flag indicates that the scan-line converter should try to   */\n  /*      convert this outline to bitmaps with the highest possible        */\n  /*      quality.  It is typically set for small character sizes.  Note   */\n  /*      that this is only a hint that might be completely ignored by a   */\n  /*      given scan-converter.                                            */\n  /*                                                                       */\n  /*    FT_OUTLINE_SINGLE_PASS ::                                          */\n  /*      This flag is set to force a given scan-converter to only use a   */\n  /*      single pass over the outline to render a bitmap glyph image.     */\n  /*      Normally, it is set for very large character sizes.  It is only  */\n  /*      a hint that might be completely ignored by a given               */\n  /*      scan-converter.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */\n  /*    and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth            */\n  /*    rasterizer.                                                        */\n  /*                                                                       */\n  /*    There exists a second mechanism to pass the drop-out mode to the   */\n  /*    B/W rasterizer; see the `tags' field in @FT_Outline.               */\n  /*                                                                       */\n  /*    Please refer to the description of the `SCANTYPE' instruction in   */\n  /*    the OpenType specification (in file `ttinst1.doc') how simple      */\n  /*    drop-outs, smart drop-outs, and stubs are defined.                 */\n  /*                                                                       */\n#define FT_OUTLINE_NONE             0x0\n#define FT_OUTLINE_OWNER            0x1\n#define FT_OUTLINE_EVEN_ODD_FILL    0x2\n#define FT_OUTLINE_REVERSE_FILL     0x4\n#define FT_OUTLINE_IGNORE_DROPOUTS  0x8\n#define FT_OUTLINE_SMART_DROPOUTS   0x10\n#define FT_OUTLINE_INCLUDE_STUBS    0x20\n\n#define FT_OUTLINE_HIGH_PRECISION   0x100\n#define FT_OUTLINE_SINGLE_PASS      0x200\n\n\n /*************************************************************************\n  *\n  * @enum:\n  *   ft_outline_flags\n  *\n  * @description:\n  *   These constants are deprecated.  Please use the corresponding\n  *   @FT_OUTLINE_FLAGS values.\n  *\n  * @values:\n  *   ft_outline_none            :: See @FT_OUTLINE_NONE.\n  *   ft_outline_owner           :: See @FT_OUTLINE_OWNER.\n  *   ft_outline_even_odd_fill   :: See @FT_OUTLINE_EVEN_ODD_FILL.\n  *   ft_outline_reverse_fill    :: See @FT_OUTLINE_REVERSE_FILL.\n  *   ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS.\n  *   ft_outline_high_precision  :: See @FT_OUTLINE_HIGH_PRECISION.\n  *   ft_outline_single_pass     :: See @FT_OUTLINE_SINGLE_PASS.\n  */\n#define ft_outline_none             FT_OUTLINE_NONE\n#define ft_outline_owner            FT_OUTLINE_OWNER\n#define ft_outline_even_odd_fill    FT_OUTLINE_EVEN_ODD_FILL\n#define ft_outline_reverse_fill     FT_OUTLINE_REVERSE_FILL\n#define ft_outline_ignore_dropouts  FT_OUTLINE_IGNORE_DROPOUTS\n#define ft_outline_high_precision   FT_OUTLINE_HIGH_PRECISION\n#define ft_outline_single_pass      FT_OUTLINE_SINGLE_PASS\n\n  /* */\n\n#define FT_CURVE_TAG( flag )  ( flag & 3 )\n\n#define FT_CURVE_TAG_ON            1\n#define FT_CURVE_TAG_CONIC         0\n#define FT_CURVE_TAG_CUBIC         2\n\n#define FT_CURVE_TAG_HAS_SCANMODE  4\n\n#define FT_CURVE_TAG_TOUCH_X       8  /* reserved for the TrueType hinter */\n#define FT_CURVE_TAG_TOUCH_Y      16  /* reserved for the TrueType hinter */\n\n#define FT_CURVE_TAG_TOUCH_BOTH    ( FT_CURVE_TAG_TOUCH_X | \\\n                                     FT_CURVE_TAG_TOUCH_Y )\n\n#define FT_Curve_Tag_On       FT_CURVE_TAG_ON\n#define FT_Curve_Tag_Conic    FT_CURVE_TAG_CONIC\n#define FT_Curve_Tag_Cubic    FT_CURVE_TAG_CUBIC\n#define FT_Curve_Tag_Touch_X  FT_CURVE_TAG_TOUCH_X\n#define FT_Curve_Tag_Touch_Y  FT_CURVE_TAG_TOUCH_Y\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_MoveToFunc                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `move  */\n  /*    to' function during outline walking/decomposition.                 */\n  /*                                                                       */\n  /*    A `move to' is emitted to start a new contour in an outline.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    to   :: A pointer to the target point of the `move to'.            */\n  /*                                                                       */\n  /*    user :: A typeless pointer which is passed from the caller of the  */\n  /*            decomposition function.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_MoveToFunc)( const FT_Vector*  to,\n                            void*             user );\n\n#define FT_Outline_MoveTo_Func  FT_Outline_MoveToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_LineToFunc                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `line  */\n  /*    to' function during outline walking/decomposition.                 */\n  /*                                                                       */\n  /*    A `line to' is emitted to indicate a segment in the outline.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    to   :: A pointer to the target point of the `line to'.            */\n  /*                                                                       */\n  /*    user :: A typeless pointer which is passed from the caller of the  */\n  /*            decomposition function.                                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_LineToFunc)( const FT_Vector*  to,\n                            void*             user );\n\n#define FT_Outline_LineTo_Func  FT_Outline_LineToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_ConicToFunc                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `conic */\n  /*    to' function during outline walking or decomposition.              */\n  /*                                                                       */\n  /*    A `conic to' is emitted to indicate a second-order Bézier arc in   */\n  /*    the outline.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control :: An intermediate control point between the last position */\n  /*               and the new target in `to'.                             */\n  /*                                                                       */\n  /*    to      :: A pointer to the target end point of the conic arc.     */\n  /*                                                                       */\n  /*    user    :: A typeless pointer which is passed from the caller of   */\n  /*               the decomposition function.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_ConicToFunc)( const FT_Vector*  control,\n                             const FT_Vector*  to,\n                             void*             user );\n\n#define FT_Outline_ConicTo_Func  FT_Outline_ConicToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Outline_CubicToFunc                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function pointer type used to describe the signature of a `cubic */\n  /*    to' function during outline walking or decomposition.              */\n  /*                                                                       */\n  /*    A `cubic to' is emitted to indicate a third-order Bézier arc.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control1 :: A pointer to the first Bézier control point.           */\n  /*                                                                       */\n  /*    control2 :: A pointer to the second Bézier control point.          */\n  /*                                                                       */\n  /*    to       :: A pointer to the target end point.                     */\n  /*                                                                       */\n  /*    user     :: A typeless pointer which is passed from the caller of  */\n  /*                the decomposition function.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  typedef int\n  (*FT_Outline_CubicToFunc)( const FT_Vector*  control1,\n                             const FT_Vector*  control2,\n                             const FT_Vector*  to,\n                             void*             user );\n\n#define FT_Outline_CubicTo_Func  FT_Outline_CubicToFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Outline_Funcs                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure to hold various function pointers used during outline  */\n  /*    decomposition in order to emit segments, conic, and cubic Béziers. */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    move_to  :: The `move to' emitter.                                 */\n  /*                                                                       */\n  /*    line_to  :: The segment emitter.                                   */\n  /*                                                                       */\n  /*    conic_to :: The second-order Bézier arc emitter.                   */\n  /*                                                                       */\n  /*    cubic_to :: The third-order Bézier arc emitter.                    */\n  /*                                                                       */\n  /*    shift    :: The shift that is applied to coordinates before they   */\n  /*                are sent to the emitter.                               */\n  /*                                                                       */\n  /*    delta    :: The delta that is applied to coordinates before they   */\n  /*                are sent to the emitter, but after the shift.          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The point coordinates sent to the emitters are the transformed     */\n  /*    version of the original coordinates (this is important for high    */\n  /*    accuracy during scan-conversion).  The transformation is simple:   */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      x' = (x << shift) - delta                                        */\n  /*      y' = (x << shift) - delta                                        */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Set the values of `shift' and `delta' to~0 to get the original     */\n  /*    point coordinates.                                                 */\n  /*                                                                       */\n  typedef struct  FT_Outline_Funcs_\n  {\n    FT_Outline_MoveToFunc   move_to;\n    FT_Outline_LineToFunc   line_to;\n    FT_Outline_ConicToFunc  conic_to;\n    FT_Outline_CubicToFunc  cubic_to;\n\n    int                     shift;\n    FT_Pos                  delta;\n\n  } FT_Outline_Funcs;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_IMAGE_TAG                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro converts four-letter tags to an unsigned long type.     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */\n  /*    should redefine this macro in case of problems to something like   */\n  /*    this:                                                              */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  value         */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    to get a simple enumeration without assigning special numbers.     */\n  /*                                                                       */\n#ifndef FT_IMAGE_TAG\n#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  \\\n          value = ( ( (unsigned long)_x1 << 24 ) | \\\n                    ( (unsigned long)_x2 << 16 ) | \\\n                    ( (unsigned long)_x3 << 8  ) | \\\n                      (unsigned long)_x4         )\n#endif /* FT_IMAGE_TAG */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Glyph_Format                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration type used to describe the format of a given glyph   */\n  /*    image.  Note that this version of FreeType only supports two image */\n  /*    formats, even though future font drivers will be able to register  */\n  /*    their own format.                                                  */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_GLYPH_FORMAT_NONE ::                                            */\n  /*      The value~0 is reserved.                                         */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_COMPOSITE ::                                       */\n  /*      The glyph image is a composite of several other images.  This    */\n  /*      format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to   */\n  /*      report compound glyphs (like accented characters).               */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_BITMAP ::                                          */\n  /*      The glyph image is a bitmap, and can be described as an          */\n  /*      @FT_Bitmap.  You generally need to access the `bitmap' field of  */\n  /*      the @FT_GlyphSlotRec structure to read it.                       */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_OUTLINE ::                                         */\n  /*      The glyph image is a vectorial outline made of line segments     */\n  /*      and Bézier arcs; it can be described as an @FT_Outline; you      */\n  /*      generally want to access the `outline' field of the              */\n  /*      @FT_GlyphSlotRec structure to read it.                           */\n  /*                                                                       */\n  /*    FT_GLYPH_FORMAT_PLOTTER ::                                         */\n  /*      The glyph image is a vectorial path with no inside and outside   */\n  /*      contours.  Some Type~1 fonts, like those in the Hershey family,  */\n  /*      contain glyphs in this format.  These are described as           */\n  /*      @FT_Outline, but FreeType isn't currently capable of rendering   */\n  /*      them correctly.                                                  */\n  /*                                                                       */\n  typedef enum  FT_Glyph_Format_\n  {\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),\n\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP,    'b', 'i', 't', 's' ),\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE,   'o', 'u', 't', 'l' ),\n    FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER,   'p', 'l', 'o', 't' )\n\n  } FT_Glyph_Format;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    ft_glyph_format_xxx                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of deprecated constants.  Use the corresponding             */\n  /*    @FT_Glyph_Format values instead.                                   */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    ft_glyph_format_none      :: See @FT_GLYPH_FORMAT_NONE.            */\n  /*    ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE.       */\n  /*    ft_glyph_format_bitmap    :: See @FT_GLYPH_FORMAT_BITMAP.          */\n  /*    ft_glyph_format_outline   :: See @FT_GLYPH_FORMAT_OUTLINE.         */\n  /*    ft_glyph_format_plotter   :: See @FT_GLYPH_FORMAT_PLOTTER.         */\n  /*                                                                       */\n#define ft_glyph_format_none       FT_GLYPH_FORMAT_NONE\n#define ft_glyph_format_composite  FT_GLYPH_FORMAT_COMPOSITE\n#define ft_glyph_format_bitmap     FT_GLYPH_FORMAT_BITMAP\n#define ft_glyph_format_outline    FT_GLYPH_FORMAT_OUTLINE\n#define ft_glyph_format_plotter    FT_GLYPH_FORMAT_PLOTTER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****            R A S T E R   D E F I N I T I O N S                *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A raster is a scan converter, in charge of rendering an outline into  */\n  /* a a bitmap.  This section contains the public API for rasters.        */\n  /*                                                                       */\n  /* Note that in FreeType 2, all rasters are now encapsulated within      */\n  /* specific modules called `renderers'.  See `freetype/ftrender.h' for   */\n  /* more details on renderers.                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    raster                                                             */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Scanline Converter                                                 */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How vectorial outlines are converted into bitmaps and pixmaps.     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains technical definitions.                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Raster                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle (pointer) to a raster object.  Each object can be used    */\n  /*    independently to convert an outline into a bitmap or pixmap.       */\n  /*                                                                       */\n  typedef struct FT_RasterRec_*  FT_Raster;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Span                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a single span of gray (or black) pixels  */\n  /*    when rendering a monochrome or anti-aliased bitmap.                */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x        :: The span's horizontal start position.                  */\n  /*                                                                       */\n  /*    len      :: The span's length in pixels.                           */\n  /*                                                                       */\n  /*    coverage :: The span color/coverage, ranging from 0 (background)   */\n  /*                to 255 (foreground).  Only used for anti-aliased       */\n  /*                rendering.                                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This structure is used by the span drawing callback type named     */\n  /*    @FT_SpanFunc which takes the y~coordinate of the span as a         */\n  /*    a parameter.                                                       */\n  /*                                                                       */\n  /*    The coverage value is always between 0 and 255.  If you want less  */\n  /*    gray values, the callback function has to reduce them.             */\n  /*                                                                       */\n  typedef struct  FT_Span_\n  {\n    short           x;\n    unsigned short  len;\n    unsigned char   coverage;\n\n  } FT_Span;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_SpanFunc                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used as a call-back by the anti-aliased renderer in     */\n  /*    order to let client applications draw themselves the gray pixel    */\n  /*    spans on each scan line.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y     :: The scanline's y~coordinate.                              */\n  /*                                                                       */\n  /*    count :: The number of spans to draw on this scanline.             */\n  /*                                                                       */\n  /*    spans :: A table of `count' spans to draw on the scanline.         */\n  /*                                                                       */\n  /*    user  :: User-supplied data that is passed to the callback.        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This callback allows client applications to directly render the    */\n  /*    gray spans of the anti-aliased bitmap to any kind of surfaces.     */\n  /*                                                                       */\n  /*    This can be used to write anti-aliased outlines directly to a      */\n  /*    given background bitmap, and even perform translucency.            */\n  /*                                                                       */\n  /*    Note that the `count' field cannot be greater than a fixed value   */\n  /*    defined by the `FT_MAX_GRAY_SPANS' configuration macro in          */\n  /*    `ftoption.h'.  By default, this value is set to~32, which means    */\n  /*    that if there are more than 32~spans on a given scanline, the      */\n  /*    callback is called several times with the same `y' parameter in    */\n  /*    order to draw all callbacks.                                       */\n  /*                                                                       */\n  /*    Otherwise, the callback is only called once per scan-line, and     */\n  /*    only for those scanlines that do have `gray' pixels on them.       */\n  /*                                                                       */\n  typedef void\n  (*FT_SpanFunc)( int             y,\n                  int             count,\n                  const FT_Span*  spans,\n                  void*           user );\n\n#define FT_Raster_Span_Func  FT_SpanFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_BitTest_Func                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */\n  /*                                                                       */\n  /*    A function used as a call-back by the monochrome scan-converter    */\n  /*    to test whether a given target pixel is already set to the drawing */\n  /*    `color'.  These tests are crucial to implement drop-out control    */\n  /*    per-se the TrueType spec.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y     :: The pixel's y~coordinate.                                 */\n  /*                                                                       */\n  /*    x     :: The pixel's x~coordinate.                                 */\n  /*                                                                       */\n  /*    user  :: User-supplied data that is passed to the callback.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   1~if the pixel is `set', 0~otherwise.                               */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_BitTest_Func)( int    y,\n                             int    x,\n                             void*  user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_BitSet_Func                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */\n  /*                                                                       */\n  /*    A function used as a call-back by the monochrome scan-converter    */\n  /*    to set an individual target pixel.  This is crucial to implement   */\n  /*    drop-out control according to the TrueType specification.          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y     :: The pixel's y~coordinate.                                 */\n  /*                                                                       */\n  /*    x     :: The pixel's x~coordinate.                                 */\n  /*                                                                       */\n  /*    user  :: User-supplied data that is passed to the callback.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    1~if the pixel is `set', 0~otherwise.                              */\n  /*                                                                       */\n  typedef void\n  (*FT_Raster_BitSet_Func)( int    y,\n                            int    x,\n                            void*  user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_RASTER_FLAG_XXX                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A list of bit flag constants as used in the `flags' field of a     */\n  /*    @FT_Raster_Params structure.                                       */\n  /*                                                                       */\n  /* <Values>                                                              */\n  /*    FT_RASTER_FLAG_DEFAULT :: This value is 0.                         */\n  /*                                                                       */\n  /*    FT_RASTER_FLAG_AA      :: This flag is set to indicate that an     */\n  /*                              anti-aliased glyph image should be       */\n  /*                              generated.  Otherwise, it will be        */\n  /*                              monochrome (1-bit).                      */\n  /*                                                                       */\n  /*    FT_RASTER_FLAG_DIRECT  :: This flag is set to indicate direct      */\n  /*                              rendering.  In this mode, client         */\n  /*                              applications must provide their own span */\n  /*                              callback.  This lets them directly       */\n  /*                              draw or compose over an existing bitmap. */\n  /*                              If this bit is not set, the target       */\n  /*                              pixmap's buffer _must_ be zeroed before  */\n  /*                              rendering.                               */\n  /*                                                                       */\n  /*                              Note that for now, direct rendering is   */\n  /*                              only possible with anti-aliased glyphs.  */\n  /*                                                                       */\n  /*    FT_RASTER_FLAG_CLIP    :: This flag is only used in direct         */\n  /*                              rendering mode.  If set, the output will */\n  /*                              be clipped to a box specified in the     */\n  /*                              `clip_box' field of the                  */\n  /*                              @FT_Raster_Params structure.             */\n  /*                                                                       */\n  /*                              Note that by default, the glyph bitmap   */\n  /*                              is clipped to the target pixmap, except  */\n  /*                              in direct rendering mode where all spans */\n  /*                              are generated if no clipping box is set. */\n  /*                                                                       */\n#define FT_RASTER_FLAG_DEFAULT  0x0\n#define FT_RASTER_FLAG_AA       0x1\n#define FT_RASTER_FLAG_DIRECT   0x2\n#define FT_RASTER_FLAG_CLIP     0x4\n\n  /* deprecated */\n#define ft_raster_flag_default  FT_RASTER_FLAG_DEFAULT\n#define ft_raster_flag_aa       FT_RASTER_FLAG_AA\n#define ft_raster_flag_direct   FT_RASTER_FLAG_DIRECT\n#define ft_raster_flag_clip     FT_RASTER_FLAG_CLIP\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Raster_Params                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure to hold the arguments used by a raster's render        */\n  /*    function.                                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    target      :: The target bitmap.                                  */\n  /*                                                                       */\n  /*    source      :: A pointer to the source glyph image (e.g., an       */\n  /*                   @FT_Outline).                                       */\n  /*                                                                       */\n  /*    flags       :: The rendering flags.                                */\n  /*                                                                       */\n  /*    gray_spans  :: The gray span drawing callback.                     */\n  /*                                                                       */\n  /*    black_spans :: The black span drawing callback.  UNIMPLEMENTED!    */\n  /*                                                                       */\n  /*    bit_test    :: The bit test callback.  UNIMPLEMENTED!              */\n  /*                                                                       */\n  /*    bit_set     :: The bit set callback.  UNIMPLEMENTED!               */\n  /*                                                                       */\n  /*    user        :: User-supplied data that is passed to each drawing   */\n  /*                   callback.                                           */\n  /*                                                                       */\n  /*    clip_box    :: An optional clipping box.  It is only used in       */\n  /*                   direct rendering mode.  Note that coordinates here  */\n  /*                   should be expressed in _integer_ pixels (and not in */\n  /*                   26.6 fixed-point units).                            */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA    */\n  /*    bit flag is set in the `flags' field, otherwise a monochrome       */\n  /*    bitmap is generated.                                               */\n  /*                                                                       */\n  /*    If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the      */\n  /*    raster will call the `gray_spans' callback to draw gray pixel      */\n  /*    spans, in the case of an aa glyph bitmap, it will call             */\n  /*    `black_spans', and `bit_test' and `bit_set' in the case of a       */\n  /*    monochrome bitmap.  This allows direct composition over a          */\n  /*    pre-existing bitmap through user-provided callbacks to perform the */\n  /*    span drawing/composition.                                          */\n  /*                                                                       */\n  /*    Note that the `bit_test' and `bit_set' callbacks are required when */\n  /*    rendering a monochrome bitmap, as they are crucial to implement    */\n  /*    correct drop-out control as defined in the TrueType specification. */\n  /*                                                                       */\n  typedef struct  FT_Raster_Params_\n  {\n    const FT_Bitmap*        target;\n    const void*             source;\n    int                     flags;\n    FT_SpanFunc             gray_spans;\n    FT_SpanFunc             black_spans;  /* doesn't work! */\n    FT_Raster_BitTest_Func  bit_test;     /* doesn't work! */\n    FT_Raster_BitSet_Func   bit_set;      /* doesn't work! */\n    void*                   user;\n    FT_BBox                 clip_box;\n\n  } FT_Raster_Params;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_NewFunc                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to create a new raster object.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the memory allocator.                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    raster :: A handle to the new raster object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `memory' parameter is a typeless pointer in order to avoid     */\n  /*    un-wanted dependencies on the rest of the FreeType code.  In       */\n  /*    practice, it is an @FT_Memory object, i.e., a handle to the        */\n  /*    standard FreeType memory allocator.  However, this field can be    */\n  /*    completely ignored by a given raster implementation.               */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_NewFunc)( void*       memory,\n                        FT_Raster*  raster );\n\n#define FT_Raster_New_Func  FT_Raster_NewFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_DoneFunc                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to destroy a given raster object.                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster :: A handle to the raster object.                           */\n  /*                                                                       */\n  typedef void\n  (*FT_Raster_DoneFunc)( FT_Raster  raster );\n\n#define FT_Raster_Done_Func  FT_Raster_DoneFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_ResetFunc                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FreeType provides an area of memory called the `render pool',      */\n  /*    available to all registered rasters.  This pool can be freely used */\n  /*    during a given scan-conversion but is shared by all rasters.  Its  */\n  /*    content is thus transient.                                         */\n  /*                                                                       */\n  /*    This function is called each time the render pool changes, or just */\n  /*    after a new raster object is created.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster    :: A handle to the new raster object.                    */\n  /*                                                                       */\n  /*    pool_base :: The address in memory of the render pool.             */\n  /*                                                                       */\n  /*    pool_size :: The size in bytes of the render pool.                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Rasters can ignore the render pool and rely on dynamic memory      */\n  /*    allocation if they want to (a handle to the memory allocator is    */\n  /*    passed to the raster constructor).  However, this is not           */\n  /*    recommended for efficiency purposes.                               */\n  /*                                                                       */\n  typedef void\n  (*FT_Raster_ResetFunc)( FT_Raster       raster,\n                          unsigned char*  pool_base,\n                          unsigned long   pool_size );\n\n#define FT_Raster_Reset_Func  FT_Raster_ResetFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_SetModeFunc                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is a generic facility to change modes or attributes  */\n  /*    in a given raster.  This can be used for debugging purposes, or    */\n  /*    simply to allow implementation-specific `features' in a given      */\n  /*    raster module.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster :: A handle to the new raster object.                       */\n  /*                                                                       */\n  /*    mode   :: A 4-byte tag used to name the mode or property.          */\n  /*                                                                       */\n  /*    args   :: A pointer to the new mode/property to use.               */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_SetModeFunc)( FT_Raster      raster,\n                            unsigned long  mode,\n                            void*          args );\n\n#define FT_Raster_Set_Mode_Func  FT_Raster_SetModeFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Raster_RenderFunc                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Invoke a given raster to scan-convert a given glyph image into a   */\n  /*    target bitmap.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    raster :: A handle to the raster object.                           */\n  /*                                                                       */\n  /*    params :: A pointer to an @FT_Raster_Params structure used to      */\n  /*              store the rendering parameters.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0~means success.                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The exact format of the source image depends on the raster's glyph */\n  /*    format defined in its @FT_Raster_Funcs structure.  It can be an    */\n  /*    @FT_Outline or anything else in order to support a large array of  */\n  /*    glyph formats.                                                     */\n  /*                                                                       */\n  /*    Note also that the render function can fail and return a           */\n  /*    `FT_Err_Unimplemented_Feature' error code if the raster used does  */\n  /*    not support direct composition.                                    */\n  /*                                                                       */\n  /*    XXX: For now, the standard raster doesn't support direct           */\n  /*         composition but this should change for the final release (see */\n  /*         the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c'    */\n  /*         for examples of distinct implementations which support direct */\n  /*         composition).                                                 */\n  /*                                                                       */\n  typedef int\n  (*FT_Raster_RenderFunc)( FT_Raster                raster,\n                           const FT_Raster_Params*  params );\n\n#define FT_Raster_Render_Func  FT_Raster_RenderFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Raster_Funcs                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   A structure used to describe a given raster class to the library.   */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    glyph_format  :: The supported glyph format for this raster.       */\n  /*                                                                       */\n  /*    raster_new    :: The raster constructor.                           */\n  /*                                                                       */\n  /*    raster_reset  :: Used to reset the render pool within the raster.  */\n  /*                                                                       */\n  /*    raster_render :: A function to render a glyph into a given bitmap. */\n  /*                                                                       */\n  /*    raster_done   :: The raster destructor.                            */\n  /*                                                                       */\n  typedef struct  FT_Raster_Funcs_\n  {\n    FT_Glyph_Format        glyph_format;\n    FT_Raster_NewFunc      raster_new;\n    FT_Raster_ResetFunc    raster_reset;\n    FT_Raster_SetModeFunc  raster_set_mode;\n    FT_Raster_RenderFunc   raster_render;\n    FT_Raster_DoneFunc     raster_done;\n\n  } FT_Raster_Funcs;\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTIMAGE_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftincrem.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftincrem.h                                                             */\n/*                                                                         */\n/*    FreeType incremental loading (specification).                        */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006, 2007, 2008, 2010 by                        */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTINCREM_H__\n#define __FTINCREM_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /***************************************************************************\n   *\n   * @section:\n   *    incremental\n   *\n   * @title:\n   *    Incremental Loading\n   *\n   * @abstract:\n   *    Custom Glyph Loading.\n   *\n   * @description:\n   *   This section contains various functions used to perform so-called\n   *   `incremental' glyph loading.  This is a mode where all glyphs loaded\n   *   from a given @FT_Face are provided by the client application,\n   *\n   *   Apart from that, all other tables are loaded normally from the font\n   *   file.  This mode is useful when FreeType is used within another\n   *   engine, e.g., a PostScript Imaging Processor.\n   *\n   *   To enable this mode, you must use @FT_Open_Face, passing an\n   *   @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an\n   *   @FT_Incremental_Interface value.  See the comments for\n   *   @FT_Incremental_InterfaceRec for an example.\n   *\n   */\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental\n   *\n   * @description:\n   *   An opaque type describing a user-provided object used to implement\n   *   `incremental' glyph loading within FreeType.  This is used to support\n   *   embedded fonts in certain environments (e.g., PostScript interpreters),\n   *   where the glyph data isn't in the font file, or must be overridden by\n   *   different values.\n   *\n   * @note:\n   *   It is up to client applications to create and implement @FT_Incremental\n   *   objects, as long as they provide implementations for the methods\n   *   @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc\n   *   and @FT_Incremental_GetGlyphMetricsFunc.\n   *\n   *   See the description of @FT_Incremental_InterfaceRec to understand how\n   *   to use incremental objects with FreeType.\n   *\n   */\n  typedef struct FT_IncrementalRec_*  FT_Incremental;\n\n\n  /***************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_MetricsRec\n   *\n   * @description:\n   *   A small structure used to contain the basic glyph metrics returned\n   *   by the @FT_Incremental_GetGlyphMetricsFunc method.\n   *\n   * @fields:\n   *   bearing_x ::\n   *     Left bearing, in font units.\n   *\n   *   bearing_y ::\n   *     Top bearing, in font units.\n   *\n   *   advance ::\n   *     Horizontal component of glyph advance, in font units.\n   *\n   *   advance_v ::\n   *     Vertical component of glyph advance, in font units.\n   *\n   * @note:\n   *   These correspond to horizontal or vertical metrics depending on the\n   *   value of the `vertical' argument to the function\n   *   @FT_Incremental_GetGlyphMetricsFunc.\n   *\n   */\n  typedef struct  FT_Incremental_MetricsRec_\n  {\n    FT_Long  bearing_x;\n    FT_Long  bearing_y;\n    FT_Long  advance;\n    FT_Long  advance_v;     /* since 2.3.12 */\n\n  } FT_Incremental_MetricsRec;\n\n\n  /***************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_Metrics\n   *\n   * @description:\n   *   A handle to an @FT_Incremental_MetricsRec structure.\n   *\n   */\n   typedef struct FT_Incremental_MetricsRec_*  FT_Incremental_Metrics;\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_GetGlyphDataFunc\n   *\n   * @description:\n   *   A function called by FreeType to access a given glyph's data bytes\n   *   during @FT_Load_Glyph or @FT_Load_Char if incremental loading is\n   *   enabled.\n   *\n   *   Note that the format of the glyph's data bytes depends on the font\n   *   file format.  For TrueType, it must correspond to the raw bytes within\n   *   the `glyf' table.  For PostScript formats, it must correspond to the\n   *   *unencrypted* charstring bytes, without any `lenIV' header.  It is\n   *   undefined for any other format.\n   *\n   * @input:\n   *   incremental ::\n   *     Handle to an opaque @FT_Incremental handle provided by the client\n   *     application.\n   *\n   *   glyph_index ::\n   *     Index of relevant glyph.\n   *\n   * @output:\n   *   adata ::\n   *     A structure describing the returned glyph data bytes (which will be\n   *     accessed as a read-only byte block).\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   If this function returns successfully the method\n   *   @FT_Incremental_FreeGlyphDataFunc will be called later to release\n   *   the data bytes.\n   *\n   *   Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for\n   *   compound glyphs.\n   *\n   */\n  typedef FT_Error\n  (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental  incremental,\n                                      FT_UInt         glyph_index,\n                                      FT_Data*        adata );\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_FreeGlyphDataFunc\n   *\n   * @description:\n   *   A function used to release the glyph data bytes returned by a\n   *   successful call to @FT_Incremental_GetGlyphDataFunc.\n   *\n   * @input:\n   *   incremental ::\n   *     A handle to an opaque @FT_Incremental handle provided by the client\n   *     application.\n   *\n   *   data ::\n   *     A structure describing the glyph data bytes (which will be accessed\n   *     as a read-only byte block).\n   *\n   */\n  typedef void\n  (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental  incremental,\n                                       FT_Data*        data );\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_GetGlyphMetricsFunc\n   *\n   * @description:\n   *   A function used to retrieve the basic metrics of a given glyph index\n   *   before accessing its data.  This is necessary because, in certain\n   *   formats like TrueType, the metrics are stored in a different place from\n   *   the glyph images proper.\n   *\n   * @input:\n   *   incremental ::\n   *     A handle to an opaque @FT_Incremental handle provided by the client\n   *     application.\n   *\n   *   glyph_index ::\n   *     Index of relevant glyph.\n   *\n   *   vertical ::\n   *     If true, return vertical metrics.\n   *\n   *   ametrics ::\n   *     This parameter is used for both input and output.\n   *     The original glyph metrics, if any, in font units.  If metrics are\n   *     not available all the values must be set to zero.\n   *\n   * @output:\n   *   ametrics ::\n   *     The replacement glyph metrics in font units.\n   *\n   */\n  typedef FT_Error\n  (*FT_Incremental_GetGlyphMetricsFunc)\n                      ( FT_Incremental              incremental,\n                        FT_UInt                     glyph_index,\n                        FT_Bool                     vertical,\n                        FT_Incremental_MetricsRec  *ametrics );\n\n\n  /**************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_FuncsRec\n   *\n   * @description:\n   *   A table of functions for accessing fonts that load data\n   *   incrementally.  Used in @FT_Incremental_InterfaceRec.\n   *\n   * @fields:\n   *   get_glyph_data ::\n   *     The function to get glyph data.  Must not be null.\n   *\n   *   free_glyph_data ::\n   *     The function to release glyph data.  Must not be null.\n   *\n   *   get_glyph_metrics ::\n   *     The function to get glyph metrics.  May be null if the font does\n   *     not provide overriding glyph metrics.\n   *\n   */\n  typedef struct  FT_Incremental_FuncsRec_\n  {\n    FT_Incremental_GetGlyphDataFunc     get_glyph_data;\n    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;\n    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;\n\n  } FT_Incremental_FuncsRec;\n\n\n  /***************************************************************************\n   *\n   * @struct:\n   *   FT_Incremental_InterfaceRec\n   *\n   * @description:\n   *   A structure to be used with @FT_Open_Face to indicate that the user\n   *   wants to support incremental glyph loading.  You should use it with\n   *   @FT_PARAM_TAG_INCREMENTAL as in the following example:\n   *\n   *     {\n   *       FT_Incremental_InterfaceRec  inc_int;\n   *       FT_Parameter                 parameter;\n   *       FT_Open_Args                 open_args;\n   *\n   *\n   *       // set up incremental descriptor\n   *       inc_int.funcs  = my_funcs;\n   *       inc_int.object = my_object;\n   *\n   *       // set up optional parameter\n   *       parameter.tag  = FT_PARAM_TAG_INCREMENTAL;\n   *       parameter.data = &inc_int;\n   *\n   *       // set up FT_Open_Args structure\n   *       open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;\n   *       open_args.pathname   = my_font_pathname;\n   *       open_args.num_params = 1;\n   *       open_args.params     = &parameter; // we use one optional argument\n   *\n   *       // open the font\n   *       error = FT_Open_Face( library, &open_args, index, &face );\n   *       ...\n   *     }\n   *\n   */\n  typedef struct  FT_Incremental_InterfaceRec_\n  {\n    const FT_Incremental_FuncsRec*  funcs;\n    FT_Incremental                  object;\n\n  } FT_Incremental_InterfaceRec;\n\n\n  /***************************************************************************\n   *\n   * @type:\n   *   FT_Incremental_Interface\n   *\n   * @description:\n   *   A pointer to an @FT_Incremental_InterfaceRec structure.\n   *\n   */\n  typedef FT_Incremental_InterfaceRec*   FT_Incremental_Interface;\n\n\n  /***************************************************************************\n   *\n   * @constant:\n   *   FT_PARAM_TAG_INCREMENTAL\n   *\n   * @description:\n   *   A constant used as the tag of @FT_Parameter structures to indicate\n   *   an incremental loading object to be used by FreeType.\n   *\n   */\n#define FT_PARAM_TAG_INCREMENTAL  FT_MAKE_TAG( 'i', 'n', 'c', 'r' )\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTINCREM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftlcdfil.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlcdfil.h                                                             */\n/*                                                                         */\n/*    FreeType API for color filtering of subpixel bitmap glyphs           */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 2006, 2007, 2008, 2010 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FT_LCD_FILTER_H__\n#define __FT_LCD_FILTER_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /***************************************************************************\n   *\n   * @section:\n   *   lcd_filtering\n   *\n   * @title:\n   *   LCD Filtering\n   *\n   * @abstract:\n   *   Reduce color fringes of LCD-optimized bitmaps.\n   *\n   * @description:\n   *   The @FT_Library_SetLcdFilter API can be used to specify a low-pass\n   *   filter which is then applied to LCD-optimized bitmaps generated\n   *   through @FT_Render_Glyph.  This is useful to reduce color fringes\n   *   which would occur with unfiltered rendering.\n   *\n   *   Note that no filter is active by default, and that this function is\n   *   *not* implemented in default builds of the library.  You need to\n   *   #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file\n   *   in order to activate it.\n   *\n   *   FreeType generates alpha coverage maps, which are linear by nature.\n   *   For instance, the value 0x80 in bitmap representation means that\n   *   (within numerical precision) 0x80/0xff fraction of that pixel is\n   *   covered by the glyph's outline.  The blending function for placing\n   *   text over a background is\n   *\n   *   {\n   *     dst = alpha * src + (1 - alpha) * dst    ,\n   *   }\n   *\n   *   which is known as OVER.  However, when calculating the output of the\n   *   OVER operator, the source colors should first be transformed to a\n   *   linear color space, then alpha blended in that space, and transformed\n   *   back to the output color space.\n   *\n   *   When linear light blending is used, the default FIR5 filtering\n   *   weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as\n   *   they have been designed for black on white rendering while lacking\n   *   gamma correction.  To preserve color neutrality, weights for a FIR5\n   *   filter should be chosen according to two free parameters `a' and `c',\n   *   and the FIR weights should be\n   *\n   *   {\n   *     [a - c, a + c, 2 * a, a + c, a - c]    .\n   *   }\n   *\n   *   This formula generates equal weights for all the color primaries\n   *   across the filter kernel, which makes it colorless.  One suggested\n   *   set of weights is\n   *\n   *   {\n   *     [0x10, 0x50, 0x60, 0x50, 0x10]    ,\n   *   }\n   *\n   *   where `a' has value 0x30 and `b' value 0x20.  The weights in filter\n   *   may have a sum larger than 0x100, which increases coloration slightly\n   *   but also improves contrast.\n   */\n\n\n  /****************************************************************************\n   *\n   * @enum:\n   *   FT_LcdFilter\n   *\n   * @description:\n   *   A list of values to identify various types of LCD filters.\n   *\n   * @values:\n   *   FT_LCD_FILTER_NONE ::\n   *     Do not perform filtering.  When used with subpixel rendering, this\n   *     results in sometimes severe color fringes.\n   *\n   *   FT_LCD_FILTER_DEFAULT ::\n   *     The default filter reduces color fringes considerably, at the cost\n   *     of a slight blurriness in the output.\n   *\n   *   FT_LCD_FILTER_LIGHT ::\n   *     The light filter is a variant that produces less blurriness at the\n   *     cost of slightly more color fringes than the default one.  It might\n   *     be better, depending on taste, your monitor, or your personal vision.\n   *\n   *   FT_LCD_FILTER_LEGACY ::\n   *     This filter corresponds to the original libXft color filter.  It\n   *     provides high contrast output but can exhibit really bad color\n   *     fringes if glyphs are not extremely well hinted to the pixel grid.\n   *     In other words, it only works well if the TrueType bytecode\n   *     interpreter is enabled *and* high-quality hinted fonts are used.\n   *\n   *     This filter is only provided for comparison purposes, and might be\n   *     disabled or stay unsupported in the future.\n   *\n   * @since:\n   *   2.3.0\n   */\n  typedef enum  FT_LcdFilter_\n  {\n    FT_LCD_FILTER_NONE    = 0,\n    FT_LCD_FILTER_DEFAULT = 1,\n    FT_LCD_FILTER_LIGHT   = 2,\n    FT_LCD_FILTER_LEGACY  = 16,\n\n    FT_LCD_FILTER_MAX   /* do not remove */\n\n  } FT_LcdFilter;\n\n\n  /**************************************************************************\n   *\n   * @func:\n   *   FT_Library_SetLcdFilter\n   *\n   * @description:\n   *   This function is used to apply color filtering to LCD decimated\n   *   bitmaps, like the ones used when calling @FT_Render_Glyph with\n   *   @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.\n   *\n   * @input:\n   *   library ::\n   *     A handle to the target library instance.\n   *\n   *   filter ::\n   *     The filter type.\n   *\n   *     You can use @FT_LCD_FILTER_NONE here to disable this feature, or\n   *     @FT_LCD_FILTER_DEFAULT to use a default filter that should work\n   *     well on most LCD screens.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   This feature is always disabled by default.  Clients must make an\n   *   explicit call to this function with a `filter' value other than\n   *   @FT_LCD_FILTER_NONE in order to enable it.\n   *\n   *   Due to *PATENTS* covering subpixel rendering, this function doesn't\n   *   do anything except returning `FT_Err_Unimplemented_Feature' if the\n   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not\n   *   defined in your build of the library, which should correspond to all\n   *   default builds of FreeType.\n   *\n   *   The filter affects glyph bitmaps rendered through @FT_Render_Glyph,\n   *   @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.\n   *\n   *   It does _not_ affect the output of @FT_Outline_Render and\n   *   @FT_Outline_Get_Bitmap.\n   *\n   *   If this feature is activated, the dimensions of LCD glyph bitmaps are\n   *   either larger or taller than the dimensions of the corresponding\n   *   outline with regards to the pixel grid.  For example, for\n   *   @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and\n   *   up to 3~pixels to the right.\n   *\n   *   The bitmap offset values are adjusted correctly, so clients shouldn't\n   *   need to modify their layout and glyph positioning code when enabling\n   *   the filter.\n   *\n   * @since:\n   *   2.3.0\n   */\n  FT_EXPORT( FT_Error )\n  FT_Library_SetLcdFilter( FT_Library    library,\n                           FT_LcdFilter  filter );\n\n\n  /**************************************************************************\n   *\n   * @func:\n   *   FT_Library_SetLcdFilterWeights\n   *\n   * @description:\n   *   Use this function to override the filter weights selected by\n   *   @FT_Library_SetLcdFilter.  By default, FreeType uses the quintuple\n   *   (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,\n   *   0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and\n   *   FT_LCD_FILTER_LEGACY.\n   *\n   * @input:\n   *   library ::\n   *     A handle to the target library instance.\n   *\n   *   weights ::\n   *     A pointer to an array; the function copies the first five bytes and\n   *     uses them to specify the filter weights.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   Due to *PATENTS* covering subpixel rendering, this function doesn't\n   *   do anything except returning `FT_Err_Unimplemented_Feature' if the\n   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not\n   *   defined in your build of the library, which should correspond to all\n   *   default builds of FreeType.\n   *\n   *   This function must be called after @FT_Library_SetLcdFilter to have\n   *   any effect.\n   *\n   * @since:\n   *   2.4.0\n   */\n  FT_EXPORT( FT_Error )\n  FT_Library_SetLcdFilterWeights( FT_Library      library,\n                                  unsigned char  *weights );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FT_LCD_FILTER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftlist.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlist.h                                                               */\n/*                                                                         */\n/*    Generic list support for FreeType (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2007, 2010 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  This file implements functions relative to list processing.  Its     */\n  /*  data structures are defined in `freetype.h'.                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTLIST_H__\n#define __FTLIST_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    list_processing                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    List Processing                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Simple management of lists.                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains various definitions related to list          */\n  /*    processing using doubly-linked nodes.                              */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_List                                                            */\n  /*    FT_ListNode                                                        */\n  /*    FT_ListRec                                                         */\n  /*    FT_ListNodeRec                                                     */\n  /*                                                                       */\n  /*    FT_List_Add                                                        */\n  /*    FT_List_Insert                                                     */\n  /*    FT_List_Find                                                       */\n  /*    FT_List_Remove                                                     */\n  /*    FT_List_Up                                                         */\n  /*    FT_List_Iterate                                                    */\n  /*    FT_List_Iterator                                                   */\n  /*    FT_List_Finalize                                                   */\n  /*    FT_List_Destructor                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Find                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Find the list node for a given listed object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*    data :: The address of the listed object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    List node.  NULL if it wasn't found.                               */\n  /*                                                                       */\n  FT_EXPORT( FT_ListNode )\n  FT_List_Find( FT_List  list,\n                void*    data );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Add                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Append an element to the end of a list.                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*    node :: The node to append.                                        */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Add( FT_List      list,\n               FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Insert                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Insert an element at the head of a list.                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to parent list.                                  */\n  /*    node :: The node to insert.                                        */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Insert( FT_List      list,\n                  FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Remove                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Remove a node from a list.  This function doesn't check whether    */\n  /*    the node is in the list!                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    node :: The node to remove.                                        */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Remove( FT_List      list,\n                  FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Up                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Move a node to the head/top of a list.  Used to maintain LRU       */\n  /*    lists.                                                             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    list :: A pointer to the parent list.                              */\n  /*    node :: The node to move.                                          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Up( FT_List      list,\n              FT_ListNode  node );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_List_Iterator                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An FT_List iterator function which is called during a list parse   */\n  /*    by @FT_List_Iterate.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    node :: The current iteration list node.                           */\n  /*                                                                       */\n  /*    user :: A typeless pointer passed to @FT_List_Iterate.             */\n  /*            Can be used to point to the iteration's state.             */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_List_Iterator)( FT_ListNode  node,\n                       void*        user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Iterate                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parse a list and calls a given iterator function on each element.  */\n  /*    Note that parsing is stopped as soon as one of the iterator calls  */\n  /*    returns a non-zero value.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    list     :: A handle to the list.                                  */\n  /*    iterator :: An iterator function, called on each node of the list. */\n  /*    user     :: A user-supplied field which is passed as the second    */\n  /*                argument to the iterator.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result (a FreeType error code) of the last iterator call.      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_List_Iterate( FT_List           list,\n                   FT_List_Iterator  iterator,\n                   void*             user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_List_Destructor                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An @FT_List iterator function which is called during a list        */\n  /*    finalization by @FT_List_Finalize to destroy all elements in a     */\n  /*    given list.                                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    system :: The current system object.                               */\n  /*                                                                       */\n  /*    data   :: The current object to destroy.                           */\n  /*                                                                       */\n  /*    user   :: A typeless pointer passed to @FT_List_Iterate.  It can   */\n  /*              be used to point to the iteration's state.               */\n  /*                                                                       */\n  typedef void\n  (*FT_List_Destructor)( FT_Memory  memory,\n                         void*      data,\n                         void*      user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_List_Finalize                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy all elements in the list as well as the list itself.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    list    :: A handle to the list.                                   */\n  /*                                                                       */\n  /*    destroy :: A list destructor that will be applied to each element  */\n  /*               of the list.                                            */\n  /*                                                                       */\n  /*    memory  :: The current memory object which handles deallocation.   */\n  /*                                                                       */\n  /*    user    :: A user-supplied field which is passed as the last       */\n  /*               argument to the destructor.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function expects that all nodes added by @FT_List_Add or      */\n  /*    @FT_List_Insert have been dynamically allocated.                   */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_List_Finalize( FT_List             list,\n                    FT_List_Destructor  destroy,\n                    FT_Memory           memory,\n                    void*               user );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTLIST_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftlzw.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlzw.h                                                                */\n/*                                                                         */\n/*    LZW-compressed stream support.                                       */\n/*                                                                         */\n/*  Copyright 2004, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTLZW_H__\n#define __FTLZW_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    lzw                                                                */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    LZW Streams                                                        */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Using LZW-compressed font files.                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of LZW-specific functions.   */\n  /*                                                                       */\n  /*************************************************************************/\n\n /************************************************************************\n  *\n  * @function:\n  *   FT_Stream_OpenLZW\n  *\n  * @description:\n  *   Open a new stream to parse LZW-compressed font files.  This is\n  *   mainly used to support the compressed `*.pcf.Z' fonts that come\n  *   with XFree86.\n  *\n  * @input:\n  *   stream :: The target embedding stream.\n  *\n  *   source :: The source stream.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   The source stream must be opened _before_ calling this function.\n  *\n  *   Calling the internal function `FT_Stream_Close' on the new stream will\n  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream\n  *   objects will be released to the heap.\n  *\n  *   The stream implementation is very basic and resets the decompression\n  *   process each time seeking backwards is needed within the stream\n  *\n  *   In certain builds of the library, LZW compression recognition is\n  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.\n  *   This means that if no font driver is capable of handling the raw\n  *   compressed file, the library will try to open a LZW stream from it\n  *   and re-open the face with it.\n  *\n  *   This function may return `FT_Err_Unimplemented_Feature' if your build\n  *   of FreeType was not compiled with LZW support.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Stream_OpenLZW( FT_Stream  stream,\n                     FT_Stream  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTLZW_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftmac.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmac.h                                                                */\n/*                                                                         */\n/*    Additional Mac-specific API.                                         */\n/*                                                                         */\n/*  Copyright 1996-2001, 2004, 2006, 2007 by                               */\n/*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* NOTE: Include this file after <freetype/freetype.h> and after any       */\n/*       Mac-specific headers (because this header uses Mac types such as  */\n/*       Handle, FSSpec, FSRef, etc.)                                      */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMAC_H__\n#define __FTMAC_H__\n\n\n#include <ft2build.h>\n\n\nFT_BEGIN_HEADER\n\n\n/* gcc-3.4.1 and later can warn about functions tagged as deprecated */\n#ifndef FT_DEPRECATED_ATTRIBUTE\n#if defined(__GNUC__)                                               && \\\n    ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))\n#define FT_DEPRECATED_ATTRIBUTE  __attribute__((deprecated))\n#else\n#define FT_DEPRECATED_ATTRIBUTE\n#endif\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    mac_specific                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Mac Specific Interface                                             */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Only available on the Macintosh.                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The following definitions are only available if FreeType is        */\n  /*    compiled on a Macintosh.                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FOND                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new face object from a FOND resource.                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fond       :: A FOND resource.                                     */\n  /*                                                                       */\n  /*    face_index :: Only supported for the -1 `sanity check' special     */\n  /*                  case.                                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Notes>                                                               */\n  /*    This function can be used to create @FT_Face objects from fonts    */\n  /*    that are installed in the system as follows.                       */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      fond = GetResource( 'FOND', fontName );                          */\n  /*      error = FT_New_Face_From_FOND( library, fond, 0, &face );        */\n  /*    }                                                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face_From_FOND( FT_Library  library,\n                         Handle      fond,\n                         FT_Long     face_index,\n                         FT_Face    *aface )\n                       FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GetFile_From_Mac_Name                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return an FSSpec for the disk file containing the named font.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fontName   :: Mac OS name of the font (e.g., Times New Roman       */\n  /*                  Bold).                                               */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    pathSpec   :: FSSpec to the file.  For passing to                  */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /*    face_index :: Index of the face.  For passing to                   */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GetFile_From_Mac_Name( const char*  fontName,\n                            FSSpec*      pathSpec,\n                            FT_Long*     face_index )\n                          FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GetFile_From_Mac_ATS_Name                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return an FSSpec for the disk file containing the named font.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fontName   :: Mac OS name of the font in ATS framework.            */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    pathSpec   :: FSSpec to the file. For passing to                   */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /*    face_index :: Index of the face. For passing to                    */\n  /*                  @FT_New_Face_From_FSSpec.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,\n                                FSSpec*      pathSpec,\n                                FT_Long*     face_index )\n                              FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_GetFilePath_From_Mac_ATS_Name                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a pathname of the disk file and face index for given font   */\n  /*    name which is handled by ATS framework.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    fontName    :: Mac OS name of the font in ATS framework.           */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    path        :: Buffer to store pathname of the file.  For passing  */\n  /*                   to @FT_New_Face.  The client must allocate this     */\n  /*                   buffer before calling this function.                */\n  /*                                                                       */\n  /*    maxPathSize :: Lengths of the buffer `path' that client allocated. */\n  /*                                                                       */\n  /*    face_index  :: Index of the face.  For passing to @FT_New_Face.    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,\n                                    UInt8*       path,\n                                    UInt32       maxPathSize,\n                                    FT_Long*     face_index )\n                                  FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSSpec                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new face object from a given resource and typeface index  */\n  /*    using an FSSpec to the font file.                                  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    spec       :: FSSpec to the font file.                             */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the resource.  The      */\n  /*                  first face has index~0.                              */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    @FT_New_Face_From_FSSpec is identical to @FT_New_Face except       */\n  /*    it accepts an FSSpec instead of a path.                            */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face_From_FSSpec( FT_Library     library,\n                           const FSSpec  *spec,\n                           FT_Long        face_index,\n                           FT_Face       *aface )\n                         FT_DEPRECATED_ATTRIBUTE;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSRef                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new face object from a given resource and typeface index  */\n  /*    using an FSRef to the font file.                                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library resource.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    spec       :: FSRef to the font file.                              */\n  /*                                                                       */\n  /*    face_index :: The index of the face within the resource.  The      */\n  /*                  first face has index~0.                              */\n  /* <Output>                                                              */\n  /*    aface      :: A handle to a new face object.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    @FT_New_Face_From_FSRef is identical to @FT_New_Face except        */\n  /*    it accepts an FSRef instead of a path.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Face_From_FSRef( FT_Library    library,\n                          const FSRef  *ref,\n                          FT_Long       face_index,\n                          FT_Face      *aface )\n                        FT_DEPRECATED_ATTRIBUTE;\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __FTMAC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftmm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmm.h                                                                 */\n/*                                                                         */\n/*    FreeType Multiple Master font interface (specification).             */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMM_H__\n#define __FTMM_H__\n\n\n#include <ft2build.h>\n#include FT_TYPE1_TABLES_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    multiple_masters                                                   */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Multiple Masters                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How to manage Multiple Masters fonts.                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The following types and functions are used to manage Multiple      */\n  /*    Master fonts, i.e., the selection of specific design instances by  */\n  /*    setting design axis coordinates.                                   */\n  /*                                                                       */\n  /*    George Williams has extended this interface to make it work with   */\n  /*    both Type~1 Multiple Masters fonts and GX distortable (var)        */\n  /*    fonts.  Some of these routines only work with MM fonts, others     */\n  /*    will work with both types.  They are similar enough that a         */\n  /*    consistent interface makes sense.                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_MM_Axis                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to model a given axis in design space for  */\n  /*    Multiple Masters fonts.                                            */\n  /*                                                                       */\n  /*    This structure can't be used for GX var fonts.                     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    name    :: The axis's name.                                        */\n  /*                                                                       */\n  /*    minimum :: The axis's minimum design coordinate.                   */\n  /*                                                                       */\n  /*    maximum :: The axis's maximum design coordinate.                   */\n  /*                                                                       */\n  typedef struct  FT_MM_Axis_\n  {\n    FT_String*  name;\n    FT_Long     minimum;\n    FT_Long     maximum;\n\n  } FT_MM_Axis;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Multi_Master                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the axes and space of a Multiple Masters */\n  /*    font.                                                              */\n  /*                                                                       */\n  /*    This structure can't be used for GX var fonts.                     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_axis    :: Number of axes.  Cannot exceed~4.                   */\n  /*                                                                       */\n  /*    num_designs :: Number of designs; should be normally 2^num_axis    */\n  /*                   even though the Type~1 specification strangely      */\n  /*                   allows for intermediate designs to be present. This */\n  /*                   number cannot exceed~16.                            */\n  /*                                                                       */\n  /*    axis        :: A table of axis descriptors.                        */\n  /*                                                                       */\n  typedef struct  FT_Multi_Master_\n  {\n    FT_UInt     num_axis;\n    FT_UInt     num_designs;\n    FT_MM_Axis  axis[T1_MAX_MM_AXIS];\n\n  } FT_Multi_Master;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Var_Axis                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to model a given axis in design space for  */\n  /*    Multiple Masters and GX var fonts.                                 */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    name    :: The axis's name.                                        */\n  /*               Not always meaningful for GX.                           */\n  /*                                                                       */\n  /*    minimum :: The axis's minimum design coordinate.                   */\n  /*                                                                       */\n  /*    def     :: The axis's default design coordinate.                   */\n  /*               FreeType computes meaningful default values for MM; it  */\n  /*               is then an integer value, not in 16.16 format.          */\n  /*                                                                       */\n  /*    maximum :: The axis's maximum design coordinate.                   */\n  /*                                                                       */\n  /*    tag     :: The axis's tag (the GX equivalent to `name').           */\n  /*               FreeType provides default values for MM if possible.    */\n  /*                                                                       */\n  /*    strid   :: The entry in `name' table (another GX version of        */\n  /*               `name').                                                */\n  /*               Not meaningful for MM.                                  */\n  /*                                                                       */\n  typedef struct  FT_Var_Axis_\n  {\n    FT_String*  name;\n\n    FT_Fixed    minimum;\n    FT_Fixed    def;\n    FT_Fixed    maximum;\n\n    FT_ULong    tag;\n    FT_UInt     strid;\n\n  } FT_Var_Axis;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Var_Named_Style                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to model a named style in a GX var font.   */\n  /*                                                                       */\n  /*    This structure can't be used for MM fonts.                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    coords :: The design coordinates for this style.                   */\n  /*              This is an array with one entry for each axis.           */\n  /*                                                                       */\n  /*    strid  :: The entry in `name' table identifying this style.        */\n  /*                                                                       */\n  typedef struct  FT_Var_Named_Style_\n  {\n    FT_Fixed*  coords;\n    FT_UInt    strid;\n\n  } FT_Var_Named_Style;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_MM_Var                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the axes and space of a Multiple Masters */\n  /*    or GX var distortable font.                                        */\n  /*                                                                       */\n  /*    Some fields are specific to one format and not to the other.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_axis        :: The number of axes.  The maximum value is~4 for */\n  /*                       MM; no limit in GX.                             */\n  /*                                                                       */\n  /*    num_designs     :: The number of designs; should be normally       */\n  /*                       2^num_axis for MM fonts.  Not meaningful for GX */\n  /*                       (where every glyph could have a different       */\n  /*                       number of designs).                             */\n  /*                                                                       */\n  /*    num_namedstyles :: The number of named styles; only meaningful for */\n  /*                       GX which allows certain design coordinates to   */\n  /*                       have a string ID (in the `name' table)          */\n  /*                       associated with them.  The font can tell the    */\n  /*                       user that, for example, Weight=1.5 is `Bold'.   */\n  /*                                                                       */\n  /*    axis            :: A table of axis descriptors.                    */\n  /*                       GX fonts contain slightly more data than MM.    */\n  /*                                                                       */\n  /*    namedstyles     :: A table of named styles.                        */\n  /*                       Only meaningful with GX.                        */\n  /*                                                                       */\n  typedef struct  FT_MM_Var_\n  {\n    FT_UInt              num_axis;\n    FT_UInt              num_designs;\n    FT_UInt              num_namedstyles;\n    FT_Var_Axis*         axis;\n    FT_Var_Named_Style*  namedstyle;\n\n  } FT_MM_Var;\n\n\n  /* */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Multi_Master                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the Multiple Master descriptor of a given font.           */\n  /*                                                                       */\n  /*    This function can't be used with GX fonts.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: A handle to the source face.                            */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amaster :: The Multiple Masters descriptor.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Multi_Master( FT_Face           face,\n                       FT_Multi_Master  *amaster );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_MM_Var                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the Multiple Master/GX var descriptor of a given font.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: A handle to the source face.                            */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amaster :: The Multiple Masters/GX var descriptor.                 */\n  /*               Allocates a data structure, which the user must free    */\n  /*               (a single call to FT_FREE will do it).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_MM_Var( FT_Face      face,\n                 FT_MM_Var*  *amaster );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_MM_Design_Coordinates                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    For Multiple Masters fonts, choose an interpolated font design     */\n  /*    through design coordinates.                                        */\n  /*                                                                       */\n  /*    This function can't be used with GX fonts.                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: A handle to the source face.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: The number of design coordinates (must be equal to   */\n  /*                  the number of axes in the font).                     */\n  /*                                                                       */\n  /*    coords     :: An array of design coordinates.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_MM_Design_Coordinates( FT_Face   face,\n                                FT_UInt   num_coords,\n                                FT_Long*  coords );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Var_Design_Coordinates                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    For Multiple Master or GX Var fonts, choose an interpolated font   */\n  /*    design through design coordinates.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: A handle to the source face.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: The number of design coordinates (must be equal to   */\n  /*                  the number of axes in the font).                     */\n  /*                                                                       */\n  /*    coords     :: An array of design coordinates.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Var_Design_Coordinates( FT_Face    face,\n                                 FT_UInt    num_coords,\n                                 FT_Fixed*  coords );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_MM_Blend_Coordinates                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    For Multiple Masters and GX var fonts, choose an interpolated font */\n  /*    design through normalized blend coordinates.                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: A handle to the source face.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: The number of design coordinates (must be equal to   */\n  /*                  the number of axes in the font).                     */\n  /*                                                                       */\n  /*    coords     :: The design coordinates array (each element must be   */\n  /*                  between 0 and 1.0).                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_MM_Blend_Coordinates( FT_Face    face,\n                               FT_UInt    num_coords,\n                               FT_Fixed*  coords );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Var_Blend_Coordinates                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is another name of @FT_Set_MM_Blend_Coordinates.              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Var_Blend_Coordinates( FT_Face    face,\n                                FT_UInt    num_coords,\n                                FT_Fixed*  coords );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTMM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftmodapi.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmodapi.h                                                             */\n/*                                                                         */\n/*    FreeType modules public interface (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006, 2008-2010, 2012 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMODAPI_H__\n#define __FTMODAPI_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    module_management                                                  */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Module Management                                                  */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    How to add, upgrade, remove, and control modules from FreeType.    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The definitions below are used to manage modules within FreeType.  */\n  /*    Modules can be added, upgraded, and removed at runtime.            */\n  /*    Additionally, some module properties can be controlled also.       */\n  /*                                                                       */\n  /*    Here is a list of possible values of the `module_name' field in    */\n  /*    the @FT_Module_Class structure.                                    */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      autofitter                                                       */\n  /*      bdf                                                              */\n  /*      cff                                                              */\n  /*      gxvalid                                                          */\n  /*      otvalid                                                          */\n  /*      pcf                                                              */\n  /*      pfr                                                              */\n  /*      psaux                                                            */\n  /*      pshinter                                                         */\n  /*      psnames                                                          */\n  /*      raster1, raster5                                                 */\n  /*      sfnt                                                             */\n  /*      smooth, smooth-lcd, smooth-lcdv                                  */\n  /*      truetype                                                         */\n  /*      type1                                                            */\n  /*      type42                                                           */\n  /*      t1cid                                                            */\n  /*      winfonts                                                         */\n  /*    }                                                                  */\n  /*                                                                       */\n  /*    Note that the FreeType Cache sub-system is not a FreeType module.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* module bit flags */\n#define FT_MODULE_FONT_DRIVER         1  /* this module is a font driver  */\n#define FT_MODULE_RENDERER            2  /* this module is a renderer     */\n#define FT_MODULE_HINTER              4  /* this module is a glyph hinter */\n#define FT_MODULE_STYLER              8  /* this module is a styler       */\n\n#define FT_MODULE_DRIVER_SCALABLE     0x100   /* the driver supports      */\n                                              /* scalable fonts           */\n#define FT_MODULE_DRIVER_NO_OUTLINES  0x200   /* the driver does not      */\n                                              /* support vector outlines  */\n#define FT_MODULE_DRIVER_HAS_HINTER   0x400   /* the driver provides its  */\n                                              /* own hinter               */\n\n\n  /* deprecated values */\n#define ft_module_font_driver         FT_MODULE_FONT_DRIVER\n#define ft_module_renderer            FT_MODULE_RENDERER\n#define ft_module_hinter              FT_MODULE_HINTER\n#define ft_module_styler              FT_MODULE_STYLER\n\n#define ft_module_driver_scalable     FT_MODULE_DRIVER_SCALABLE\n#define ft_module_driver_no_outlines  FT_MODULE_DRIVER_NO_OUTLINES\n#define ft_module_driver_has_hinter   FT_MODULE_DRIVER_HAS_HINTER\n\n\n  typedef FT_Pointer  FT_Module_Interface;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Constructor                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to initialize (not create) a new module object.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module :: The module to initialize.                                */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_Module_Constructor)( FT_Module  module );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Destructor                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to finalize (not destroy) a given module object.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module :: The module to finalize.                                  */\n  /*                                                                       */\n  typedef void\n  (*FT_Module_Destructor)( FT_Module  module );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Requester                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to query a given module for a specific interface.  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module :: The module to be searched.                               */\n  /*                                                                       */\n  /*    name ::   The name of the interface in the module.                 */\n  /*                                                                       */\n  typedef FT_Module_Interface\n  (*FT_Module_Requester)( FT_Module    module,\n                          const char*  name );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Module_Class                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The module class descriptor.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    module_flags    :: Bit flags describing the module.                */\n  /*                                                                       */\n  /*    module_size     :: The size of one module object/instance in       */\n  /*                       bytes.                                          */\n  /*                                                                       */\n  /*    module_name     :: The name of the module.                         */\n  /*                                                                       */\n  /*    module_version  :: The version, as a 16.16 fixed number            */\n  /*                       (major.minor).                                  */\n  /*                                                                       */\n  /*    module_requires :: The version of FreeType this module requires,   */\n  /*                       as a 16.16 fixed number (major.minor).  Starts  */\n  /*                       at version 2.0, i.e., 0x20000.                  */\n  /*                                                                       */\n  /*    module_init     :: The initializing function.                      */\n  /*                                                                       */\n  /*    module_done     :: The finalizing function.                        */\n  /*                                                                       */\n  /*    get_interface   :: The interface requesting function.              */\n  /*                                                                       */\n  typedef struct  FT_Module_Class_\n  {\n    FT_ULong               module_flags;\n    FT_Long                module_size;\n    const FT_String*       module_name;\n    FT_Fixed               module_version;\n    FT_Fixed               module_requires;\n\n    const void*            module_interface;\n\n    FT_Module_Constructor  module_init;\n    FT_Module_Destructor   module_done;\n    FT_Module_Requester    get_interface;\n\n  } FT_Module_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Add_Module                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Add a new module to a given library instance.                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library :: A handle to the library object.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    clazz   :: A pointer to class descriptor for the module.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An error will be returned if a module already exists by that name, */\n  /*    or if the module requires a version of FreeType that is too great. */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Add_Module( FT_Library              library,\n                 const FT_Module_Class*  clazz );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Module                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Find a module by its name.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library     :: A handle to the library object.                     */\n  /*                                                                       */\n  /*    module_name :: The module's name (as an ASCII string).             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A module handle.  0~if none was found.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    FreeType's internal modules aren't documented very well, and you   */\n  /*    should look up the source code for details.                        */\n  /*                                                                       */\n  FT_EXPORT( FT_Module )\n  FT_Get_Module( FT_Library   library,\n                 const char*  module_name );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Remove_Module                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Remove a given module from a library instance.                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library :: A handle to a library object.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    module  :: A handle to a module object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The module object is destroyed by the function in case of success. */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Remove_Module( FT_Library  library,\n                    FT_Module   module );\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Property_Set\n   *\n   * @description:\n   *    Set a property for a given module.\n   *\n   * @input:\n   *    library ::\n   *       A handle to the library the module is part of.\n   *\n   *    module_name ::\n   *       The module name.\n   *\n   *    property_name ::\n   *       The property name.  Properties are described in the `Synopsis'\n   *       subsection of the module's documentation.\n   *\n   *       Note that only a few modules have properties.\n   *\n   *    value ::\n   *       A generic pointer to a variable or structure which gives the new\n   *       value of the property.  The exact definition of `value' is\n   *       dependent on the property; see the `Synopsis' subsection of the\n   *       module's documentation.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *    If `module_name' isn't a valid module name, or `property_name'\n   *    doesn't specify a valid property, or if `value' doesn't represent a\n   *    valid value for the given property, an error is returned.\n   *\n   *    The following example sets property `bar' (a simple integer) in\n   *    module `foo' to value~1.\n   *\n   *    {\n   *      FT_UInt  bar;\n   *\n   *\n   *      bar = 1;\n   *      FT_Property_Set( library, \"foo\", \"bar\", &bar );\n   *    }\n   *\n   *    It is not possible to set properties of the FreeType Cache\n   *    sub-system with FT_Property_Set; use @FTC_Property_Set instead.\n   *\n   *  @since:\n   *    2.4.11\n   *\n   */\n  FT_Error\n  FT_Property_Set( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   const void*       value );\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Property_Get\n   *\n   * @description:\n   *    Get a module's property value.\n   *\n   * @input:\n   *    library ::\n   *       A handle to the library the module is part of.\n   *\n   *    module_name ::\n   *       The module name.\n   *\n   *    property_name ::\n   *       The property name.  Properties are described in the `Synopsis'\n   *       subsection of the module's documentation.\n   *\n   * @inout:\n   *    value ::\n   *       A generic pointer to a variable or structure which gives the\n   *       value of the property.  The exact definition of `value' is\n   *       dependent on the property; see the `Synopsis' subsection of the\n   *       module's documentation.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *    If `module_name' isn't a valid module name, or `property_name'\n   *    doesn't specify a valid property, or if `value' doesn't represent a\n   *    valid value for the given property, an error is returned.\n   *\n   *    The following example gets property `baz' (a range) in module `foo'.\n   *\n   *    {\n   *      typedef  range_\n   *      {\n   *        FT_Int32  min;\n   *        FT_Int32  max;\n   *\n   *      } range;\n   *\n   *      range  baz;\n   *\n   *\n   *      FT_Property_Get( library, \"foo\", \"baz\", &baz );\n   *    }\n   *\n   *    It is not possible to retrieve properties of the FreeType Cache\n   *    sub-system with FT_Property_Get; use @FTC_Property_Get instead.\n   *\n   *  @since:\n   *    2.4.11\n   *\n   */\n  FT_Error\n  FT_Property_Get( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   void*             value );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Reference_Library                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A counter gets initialized to~1 at the time an @FT_Library         */\n  /*    structure is created.  This function increments the counter.       */\n  /*    @FT_Done_Library then only destroys a library if the counter is~1, */\n  /*    otherwise it simply decrements the counter.                        */\n  /*                                                                       */\n  /*    This function helps in managing life-cycles of structures which    */\n  /*    reference @FT_Library objects.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a target library object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Since>                                                               */\n  /*    2.4.2                                                              */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Reference_Library( FT_Library  library );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Library                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to create a new FreeType library instance    */\n  /*    from a given memory object.  It is thus possible to use libraries  */\n  /*    with distinct memory allocators within the same program.           */\n  /*                                                                       */\n  /*    Normally, you would call this function (followed by a call to      */\n  /*    @FT_Add_Default_Modules or a series of calls to @FT_Add_Module)    */\n  /*    instead of @FT_Init_FreeType to initialize the FreeType library.   */\n  /*                                                                       */\n  /*    Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a      */\n  /*    library instance.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory   :: A handle to the original memory object.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    alibrary :: A pointer to handle of a new library object.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Library.                                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Library( FT_Memory    memory,\n                  FT_Library  *alibrary );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Library                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard a given library object.  This closes all drivers and       */\n  /*    discards all resource objects.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to the target library.                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See the discussion of reference counters in the description of     */\n  /*    @FT_Reference_Library.                                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_Library( FT_Library  library );\n\n/* */\n\n  typedef void\n  (*FT_DebugHook_Func)( void*  arg );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Debug_Hook                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set a debug hook function for debugging the interpreter of a font  */\n  /*    format.                                                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hook_index :: The index of the debug hook.  You should use the     */\n  /*                  values defined in `ftobjs.h', e.g.,                  */\n  /*                  `FT_DEBUG_HOOK_TRUETYPE'.                            */\n  /*                                                                       */\n  /*    debug_hook :: The function used to debug the interpreter.          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Currently, four debug hook slots are available, but only two (for  */\n  /*    the TrueType and the Type~1 interpreter) are defined.              */\n  /*                                                                       */\n  /*    Since the internal headers of FreeType are no longer installed,    */\n  /*    the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly.      */\n  /*    This is a bug and will be fixed in a forthcoming release.          */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Set_Debug_Hook( FT_Library         library,\n                     FT_UInt            hook_index,\n                     FT_DebugHook_Func  debug_hook );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Add_Default_Modules                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Add the set of default drivers to a given library object.          */\n  /*    This is only useful when you create a library object with          */\n  /*    @FT_New_Library (usually to plug a custom memory manager).         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library :: A handle to a new library object.                       */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Add_Default_Modules( FT_Library  library );\n\n\n\n  /**************************************************************************\n   *\n   * @section:\n   *   truetype_engine\n   *\n   * @title:\n   *   The TrueType Engine\n   *\n   * @abstract:\n   *   TrueType bytecode support.\n   *\n   * @description:\n   *   This section contains a function used to query the level of TrueType\n   *   bytecode support compiled in this version of the library.\n   *\n   */\n\n\n  /**************************************************************************\n   *\n   *  @enum:\n   *     FT_TrueTypeEngineType\n   *\n   *  @description:\n   *     A list of values describing which kind of TrueType bytecode\n   *     engine is implemented in a given FT_Library instance.  It is used\n   *     by the @FT_Get_TrueType_Engine_Type function.\n   *\n   *  @values:\n   *     FT_TRUETYPE_ENGINE_TYPE_NONE ::\n   *       The library doesn't implement any kind of bytecode interpreter.\n   *\n   *     FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::\n   *       The library implements a bytecode interpreter that doesn't\n   *       support the patented operations of the TrueType virtual machine.\n   *\n   *       Its main use is to load certain Asian fonts which position and\n   *       scale glyph components with bytecode instructions.  It produces\n   *       bad output for most other fonts.\n   *\n   *     FT_TRUETYPE_ENGINE_TYPE_PATENTED ::\n   *       The library implements a bytecode interpreter that covers\n   *       the full instruction set of the TrueType virtual machine (this\n   *       was governed by patents until May 2010, hence the name).\n   *\n   *  @since:\n   *     2.2\n   *\n   */\n  typedef enum  FT_TrueTypeEngineType_\n  {\n    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,\n    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,\n    FT_TRUETYPE_ENGINE_TYPE_PATENTED\n\n  } FT_TrueTypeEngineType;\n\n\n  /**************************************************************************\n   *\n   *  @func:\n   *     FT_Get_TrueType_Engine_Type\n   *\n   *  @description:\n   *     Return an @FT_TrueTypeEngineType value to indicate which level of\n   *     the TrueType virtual machine a given library instance supports.\n   *\n   *  @input:\n   *     library ::\n   *       A library instance.\n   *\n   *  @return:\n   *     A value indicating which level is supported.\n   *\n   *  @since:\n   *     2.2\n   *\n   */\n  FT_EXPORT( FT_TrueTypeEngineType )\n  FT_Get_TrueType_Engine_Type( FT_Library  library );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTMODAPI_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftmoderr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmoderr.h                                                             */\n/*                                                                         */\n/*    FreeType module error offsets (specification).                       */\n/*                                                                         */\n/*  Copyright 2001-2005, 2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the FreeType module error codes.          */\n  /*                                                                       */\n  /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is    */\n  /* set, the lower byte of an error value identifies the error code as    */\n  /* usual.  In addition, the higher byte identifies the module.  For      */\n  /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */\n  /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error        */\n  /* `T1_Err_Invalid_File_Format' has value 0x1403, etc.                   */\n  /*                                                                       */\n  /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero,    */\n  /* including the high byte.                                              */\n  /*                                                                       */\n  /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of   */\n  /* an error value is set to zero.                                        */\n  /*                                                                       */\n  /* To hide the various `XXX_Err_' prefixes in the source code, FreeType  */\n  /* provides some macros in `fttypes.h'.                                  */\n  /*                                                                       */\n  /*   FT_ERR( err )                                                       */\n  /*     Add current error module prefix (as defined with the              */\n  /*     `FT_ERR_PREFIX' macro) to `err'.  For example, in the BDF module  */\n  /*     the line                                                          */\n  /*                                                                       */\n  /*       error = FT_ERR( Invalid_Outline );                              */\n  /*                                                                       */\n  /*     expands to                                                        */\n  /*                                                                       */\n  /*       error = BDF_Err_Invalid_Outline;                                */\n  /*                                                                       */\n  /*     For simplicity, you can always use `FT_Err_Ok' directly instead   */\n  /*     of `FT_ERR( Ok )'.                                                */\n  /*                                                                       */\n  /*   FT_ERR_EQ( errcode, err )                                           */\n  /*   FT_ERR_NEQ( errcode, err )                                          */\n  /*     Compare error code `errcode' with the error `err' for equality    */\n  /*     and inequality, respectively.  Example:                           */\n  /*                                                                       */\n  /*       if ( FT_ERR_EQ( error, Invalid_Outline ) )                      */\n  /*         ...                                                           */\n  /*                                                                       */\n  /*     Using this macro you don't have to think about error prefixes.    */\n  /*     Of course, if module errors are not active, the above example is  */\n  /*     the same as                                                       */\n  /*                                                                       */\n  /*       if ( error == FT_Err_Invalid_Outline )                          */\n  /*         ...                                                           */\n  /*                                                                       */\n  /*   FT_ERROR_BASE( errcode )                                            */\n  /*   FT_ERROR_MODULE( errcode )                                          */\n  /*     Get base error and module error code, respectively.               */\n  /*                                                                       */\n  /*                                                                       */\n  /* It can also be used to create a module error message table easily     */\n  /* with something like                                                   */\n  /*                                                                       */\n  /*   {                                                                   */\n  /*     #undef __FTMODERR_H__                                             */\n  /*     #define FT_MODERRDEF( e, v, s )  { FT_Mod_Err_ ## e, s },         */\n  /*     #define FT_MODERR_START_LIST     {                                */\n  /*     #define FT_MODERR_END_LIST       { 0, 0 } };                      */\n  /*                                                                       */\n  /*     const struct                                                      */\n  /*     {                                                                 */\n  /*       int          mod_err_offset;                                    */\n  /*       const char*  mod_err_msg                                        */\n  /*     } ft_mod_errors[] =                                               */\n  /*                                                                       */\n  /*     #include FT_MODULE_ERRORS_H                                       */\n  /*   }                                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTMODERR_H__\n#define __FTMODERR_H__\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                       SETUP MACROS                      *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#undef  FT_NEED_EXTERN_C\n\n#ifndef FT_MODERRDEF\n\n#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = v,\n#else\n#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = 0,\n#endif\n\n#define FT_MODERR_START_LIST  enum {\n#define FT_MODERR_END_LIST    FT_Mod_Err_Max };\n\n#ifdef __cplusplus\n#define FT_NEED_EXTERN_C\n  extern \"C\" {\n#endif\n\n#endif /* !FT_MODERRDEF */\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****               LIST MODULE ERROR BASES                   *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#ifdef FT_MODERR_START_LIST\n  FT_MODERR_START_LIST\n#endif\n\n\n  FT_MODERRDEF( Base,      0x000, \"base module\" )\n  FT_MODERRDEF( Autofit,   0x100, \"autofitter module\" )\n  FT_MODERRDEF( BDF,       0x200, \"BDF module\" )\n  FT_MODERRDEF( Bzip2,     0x300, \"Bzip2 module\" )\n  FT_MODERRDEF( Cache,     0x400, \"cache module\" )\n  FT_MODERRDEF( CFF,       0x500, \"CFF module\" )\n  FT_MODERRDEF( CID,       0x600, \"CID module\" )\n  FT_MODERRDEF( Gzip,      0x700, \"Gzip module\" )\n  FT_MODERRDEF( LZW,       0x800, \"LZW module\" )\n  FT_MODERRDEF( OTvalid,   0x900, \"OpenType validation module\" )\n  FT_MODERRDEF( PCF,       0xA00, \"PCF module\" )\n  FT_MODERRDEF( PFR,       0xB00, \"PFR module\" )\n  FT_MODERRDEF( PSaux,     0xC00, \"PS auxiliary module\" )\n  FT_MODERRDEF( PShinter,  0xD00, \"PS hinter module\" )\n  FT_MODERRDEF( PSnames,   0xE00, \"PS names module\" )\n  FT_MODERRDEF( Raster,    0xF00, \"raster module\" )\n  FT_MODERRDEF( SFNT,     0x1000, \"SFNT module\" )\n  FT_MODERRDEF( Smooth,   0x1100, \"smooth raster module\" )\n  FT_MODERRDEF( TrueType, 0x1200, \"TrueType module\" )\n  FT_MODERRDEF( Type1,    0x1300, \"Type 1 module\" )\n  FT_MODERRDEF( Type42,   0x1400, \"Type 42 module\" )\n  FT_MODERRDEF( Winfonts, 0x1500, \"Windows FON/FNT module\" )\n  FT_MODERRDEF( GXvalid,  0x1600, \"GX validation module\" )\n\n\n#ifdef FT_MODERR_END_LIST\n  FT_MODERR_END_LIST\n#endif\n\n\n  /*******************************************************************/\n  /*******************************************************************/\n  /*****                                                         *****/\n  /*****                      CLEANUP                            *****/\n  /*****                                                         *****/\n  /*******************************************************************/\n  /*******************************************************************/\n\n\n#ifdef FT_NEED_EXTERN_C\n  }\n#endif\n\n#undef FT_MODERR_START_LIST\n#undef FT_MODERR_END_LIST\n#undef FT_MODERRDEF\n#undef FT_NEED_EXTERN_C\n\n\n#endif /* __FTMODERR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftotval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftotval.h                                                              */\n/*                                                                         */\n/*    FreeType API for validating OpenType tables (specification).         */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006, 2007 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/*                                                                         */\n/* Warning: This module might be moved to a different library in the       */\n/*          future to avoid a tight dependency between FreeType and the    */\n/*          OpenType specification.                                        */\n/*                                                                         */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTOTVAL_H__\n#define __FTOTVAL_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    ot_validation                                                      */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    OpenType Validation                                                */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    An API to validate OpenType tables.                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of functions to validate     */\n  /*    some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /**********************************************************************\n  *\n  * @enum:\n  *    FT_VALIDATE_OTXXX\n  *\n  * @description:\n  *    A list of bit-field constants used with @FT_OpenType_Validate to\n  *    indicate which OpenType tables should be validated.\n  *\n  * @values:\n  *    FT_VALIDATE_BASE ::\n  *      Validate BASE table.\n  *\n  *    FT_VALIDATE_GDEF ::\n  *      Validate GDEF table.\n  *\n  *    FT_VALIDATE_GPOS ::\n  *      Validate GPOS table.\n  *\n  *    FT_VALIDATE_GSUB ::\n  *      Validate GSUB table.\n  *\n  *    FT_VALIDATE_JSTF ::\n  *      Validate JSTF table.\n  *\n  *    FT_VALIDATE_MATH ::\n  *      Validate MATH table.\n  *\n  *    FT_VALIDATE_OT ::\n  *      Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).\n  *\n  */\n#define FT_VALIDATE_BASE  0x0100\n#define FT_VALIDATE_GDEF  0x0200\n#define FT_VALIDATE_GPOS  0x0400\n#define FT_VALIDATE_GSUB  0x0800\n#define FT_VALIDATE_JSTF  0x1000\n#define FT_VALIDATE_MATH  0x2000\n\n#define FT_VALIDATE_OT  FT_VALIDATE_BASE | \\\n                        FT_VALIDATE_GDEF | \\\n                        FT_VALIDATE_GPOS | \\\n                        FT_VALIDATE_GSUB | \\\n                        FT_VALIDATE_JSTF | \\\n                        FT_VALIDATE_MATH\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_OpenType_Validate\n  *\n  * @description:\n  *    Validate various OpenType tables to assure that all offsets and\n  *    indices are valid.  The idea is that a higher-level library which\n  *    actually does the text layout can access those tables without\n  *    error checking (which can be quite time consuming).\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    validation_flags ::\n  *       A bit field which specifies the tables to be validated.  See\n  *       @FT_VALIDATE_OTXXX for possible values.\n  *\n  * @output:\n  *    BASE_table ::\n  *       A pointer to the BASE table.\n  *\n  *    GDEF_table ::\n  *       A pointer to the GDEF table.\n  *\n  *    GPOS_table ::\n  *       A pointer to the GPOS table.\n  *\n  *    GSUB_table ::\n  *       A pointer to the GSUB table.\n  *\n  *    JSTF_table ::\n  *       A pointer to the JSTF table.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   This function only works with OpenType fonts, returning an error\n  *   otherwise.\n  *\n  *   After use, the application should deallocate the five tables with\n  *   @FT_OpenType_Free.  A NULL value indicates that the table either\n  *   doesn't exist in the font, or the application hasn't asked for\n  *   validation.\n  */\n  FT_EXPORT( FT_Error )\n  FT_OpenType_Validate( FT_Face    face,\n                        FT_UInt    validation_flags,\n                        FT_Bytes  *BASE_table,\n                        FT_Bytes  *GDEF_table,\n                        FT_Bytes  *GPOS_table,\n                        FT_Bytes  *GSUB_table,\n                        FT_Bytes  *JSTF_table );\n\n  /* */\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_OpenType_Free\n  *\n  * @description:\n  *    Free the buffer allocated by OpenType validator.\n  *\n  * @input:\n  *    face ::\n  *       A handle to the input face.\n  *\n  *    table ::\n  *       The pointer to the buffer that is allocated by\n  *       @FT_OpenType_Validate.\n  *\n  * @note:\n  *   This function must be used to free the buffer allocated by\n  *   @FT_OpenType_Validate only.\n  */\n  FT_EXPORT( void )\n  FT_OpenType_Free( FT_Face   face,\n                    FT_Bytes  table );\n\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTOTVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftoutln.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftoutln.h                                                              */\n/*                                                                         */\n/*    Support for the FT_Outline type used to store glyph shapes of        */\n/*    most scalable font formats (specification).                          */\n/*                                                                         */\n/*  Copyright 1996-2003, 2005-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTOUTLN_H__\n#define __FTOUTLN_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    outline_processing                                                 */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Outline Processing                                                 */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Functions to create, transform, and render vectorial glyph images. */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains routines used to create and destroy scalable */\n  /*    glyph images known as `outlines'.  These can also be measured,     */\n  /*    transformed, and converted into bitmaps and pixmaps.               */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_Outline                                                         */\n  /*    FT_OUTLINE_FLAGS                                                   */\n  /*    FT_Outline_New                                                     */\n  /*    FT_Outline_Done                                                    */\n  /*    FT_Outline_Copy                                                    */\n  /*    FT_Outline_Translate                                               */\n  /*    FT_Outline_Transform                                               */\n  /*    FT_Outline_Embolden                                                */\n  /*    FT_Outline_EmboldenXY                                              */\n  /*    FT_Outline_Reverse                                                 */\n  /*    FT_Outline_Check                                                   */\n  /*                                                                       */\n  /*    FT_Outline_Get_CBox                                                */\n  /*    FT_Outline_Get_BBox                                                */\n  /*                                                                       */\n  /*    FT_Outline_Get_Bitmap                                              */\n  /*    FT_Outline_Render                                                  */\n  /*                                                                       */\n  /*    FT_Outline_Decompose                                               */\n  /*    FT_Outline_Funcs                                                   */\n  /*    FT_Outline_MoveTo_Func                                             */\n  /*    FT_Outline_LineTo_Func                                             */\n  /*    FT_Outline_ConicTo_Func                                            */\n  /*    FT_Outline_CubicTo_Func                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Decompose                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Walk over an outline's structure to decompose it into individual   */\n  /*    segments and Bézier arcs.  This function also emits `move to'      */\n  /*    operations to indicate the start of new contours in the outline.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline        :: A pointer to the source target.                  */\n  /*                                                                       */\n  /*    func_interface :: A table of `emitters', i.e., function pointers   */\n  /*                      called during decomposition to indicate path     */\n  /*                      operations.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user           :: A typeless pointer which is passed to each       */\n  /*                      emitter during the decomposition.  It can be     */\n  /*                      used to store the state during the               */\n  /*                      decomposition.                                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Decompose( FT_Outline*              outline,\n                        const FT_Outline_Funcs*  func_interface,\n                        void*                    user );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_New                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new outline of a given size.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library     :: A handle to the library object from where the       */\n  /*                   outline is allocated.  Note however that the new    */\n  /*                   outline will *not* necessarily be *freed*, when     */\n  /*                   destroying the library, by @FT_Done_FreeType.       */\n  /*                                                                       */\n  /*    numPoints   :: The maximum number of points within the outline.    */\n  /*                   Must be smaller than or equal to 0xFFFF (65535).    */\n  /*                                                                       */\n  /*    numContours :: The maximum number of contours within the outline.  */\n  /*                   This value must be in the range 0 to `numPoints'.   */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    anoutline   :: A handle to the new outline.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The reason why this function takes a `library' parameter is simply */\n  /*    to use the library's memory allocator.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_New( FT_Library   library,\n                  FT_UInt      numPoints,\n                  FT_Int       numContours,\n                  FT_Outline  *anoutline );\n\n\n  FT_EXPORT( FT_Error )\n  FT_Outline_New_Internal( FT_Memory    memory,\n                           FT_UInt      numPoints,\n                           FT_Int       numContours,\n                           FT_Outline  *anoutline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Done                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroy an outline created with @FT_Outline_New.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle of the library object used to allocate the     */\n  /*               outline.                                                */\n  /*                                                                       */\n  /*    outline :: A pointer to the outline object to be discarded.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If the outline's `owner' field is not set, only the outline        */\n  /*    descriptor will be released.                                       */\n  /*                                                                       */\n  /*    The reason why this function takes an `library' parameter is       */\n  /*    simply to use ft_mem_free().                                       */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Done( FT_Library   library,\n                   FT_Outline*  outline );\n\n\n  FT_EXPORT( FT_Error )\n  FT_Outline_Done_Internal( FT_Memory    memory,\n                            FT_Outline*  outline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Check                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check the contents of an outline descriptor.                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline :: A handle to a source outline.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Check( FT_Outline*  outline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Get_CBox                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return an outline's `control box'.  The control box encloses all   */\n  /*    the outline's points, including Bézier control points.  Though it  */\n  /*    coincides with the exact bounding box for most glyphs, it can be   */\n  /*    slightly larger in some situations (like when rotating an outline  */\n  /*    which contains Bézier outside arcs).                               */\n  /*                                                                       */\n  /*    Computing the control box is very fast, while getting the bounding */\n  /*    box can take much more time as it needs to walk over all segments  */\n  /*    and arcs in the outline.  To get the latter, you can use the       */\n  /*    `ftbbox' component which is dedicated to this single task.         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline :: A pointer to the source outline descriptor.             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    acbox   :: The outline's control box.                              */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    See @FT_Glyph_Get_CBox for a discussion of tricky fonts.           */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Get_CBox( const FT_Outline*  outline,\n                       FT_BBox           *acbox );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Translate                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Apply a simple translation to the points of an outline.            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline :: A pointer to the target outline descriptor.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    xOffset :: The horizontal offset.                                  */\n  /*                                                                       */\n  /*    yOffset :: The vertical offset.                                    */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Translate( const FT_Outline*  outline,\n                        FT_Pos             xOffset,\n                        FT_Pos             yOffset );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Copy                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Copy an outline into another one.  Both objects must have the      */\n  /*    same sizes (number of points & number of contours) when this       */\n  /*    function is called.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    source :: A handle to the source outline.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    target :: A handle to the target outline.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Copy( const FT_Outline*  source,\n                   FT_Outline        *target );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Transform                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Apply a simple 2x2 matrix to all of an outline's points.  Useful   */\n  /*    for applying rotations, slanting, flipping, etc.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline :: A pointer to the target outline descriptor.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    matrix  :: A pointer to the transformation matrix.                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You can use @FT_Outline_Translate if you need to translate the     */\n  /*    outline's points.                                                  */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Transform( const FT_Outline*  outline,\n                        const FT_Matrix*   matrix );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Embolden                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Embolden an outline.  The new outline will be at most 4~times      */\n  /*    `strength' pixels wider and higher.  You may think of the left and */\n  /*    bottom borders as unchanged.                                       */\n  /*                                                                       */\n  /*    Negative `strength' values to reduce the outline thickness are     */\n  /*    possible also.                                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline  :: A handle to the target outline.                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    strength :: How strong the glyph is emboldened.  Expressed in      */\n  /*                26.6 pixel format.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The used algorithm to increase or decrease the thickness of the    */\n  /*    glyph doesn't change the number of points; this means that certain */\n  /*    situations like acute angles or intersections are sometimes        */\n  /*    handled incorrectly.                                               */\n  /*                                                                       */\n  /*    If you need `better' metrics values you should call                */\n  /*    @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.                      */\n  /*                                                                       */\n  /*    Example call:                                                      */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   */\n  /*      if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE )             */\n  /*        FT_Outline_Embolden( &face->slot->outline, strength );         */\n  /*    }                                                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Embolden( FT_Outline*  outline,\n                       FT_Pos       strength );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_EmboldenXY                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Embolden an outline.  The new outline will be `xstrength' pixels   */\n  /*    wider and `ystrength' pixels higher.  Otherwise, it is similar to  */\n  /*    @FT_Outline_Embolden, which uses the same strength in both         */\n  /*    directions.                                                        */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_EmboldenXY( FT_Outline*  outline,\n                         FT_Pos       xstrength,\n                         FT_Pos       ystrength );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Reverse                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Reverse the drawing direction of an outline.  This is used to      */\n  /*    ensure consistent fill conventions for mirrored glyphs.            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    outline :: A pointer to the target outline descriptor.             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in     */\n  /*    the outline's `flags' field.                                       */\n  /*                                                                       */\n  /*    It shouldn't be used by a normal client application, unless it     */\n  /*    knows what it is doing.                                            */\n  /*                                                                       */\n  FT_EXPORT( void )\n  FT_Outline_Reverse( FT_Outline*  outline );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Get_Bitmap                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render an outline within a bitmap.  The outline's image is simply  */\n  /*    OR-ed to the target bitmap.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a FreeType library object.                  */\n  /*                                                                       */\n  /*    outline :: A pointer to the source outline descriptor.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    abitmap :: A pointer to the target bitmap descriptor.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does NOT CREATE the bitmap, it only renders an       */\n  /*    outline image within the one you pass to it!  Consequently, the    */\n  /*    various fields in `abitmap' should be set accordingly.             */\n  /*                                                                       */\n  /*    It will use the raster corresponding to the default glyph format.  */\n  /*                                                                       */\n  /*    The value of the `num_grays' field in `abitmap' is ignored.  If    */\n  /*    you select the gray-level rasterizer, and you want less than 256   */\n  /*    gray levels, you have to use @FT_Outline_Render directly.          */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Get_Bitmap( FT_Library        library,\n                         FT_Outline*       outline,\n                         const FT_Bitmap  *abitmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Render                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render an outline within a bitmap using the current scan-convert.  */\n  /*    This function uses an @FT_Raster_Params structure as an argument,  */\n  /*    allowing advanced features like direct composition, translucency,  */\n  /*    etc.                                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to a FreeType library object.                  */\n  /*                                                                       */\n  /*    outline :: A pointer to the source outline descriptor.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    params  :: A pointer to an @FT_Raster_Params structure used to     */\n  /*               describe the rendering operation.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should know what you are doing and how @FT_Raster_Params works */\n  /*    to use this function.                                              */\n  /*                                                                       */\n  /*    The field `params.source' will be set to `outline' before the scan */\n  /*    converter is called, which means that the value you give to it is  */\n  /*    actually ignored.                                                  */\n  /*                                                                       */\n  /*    The gray-level rasterizer always uses 256 gray levels.  If you     */\n  /*    want less gray levels, you have to provide your own span callback. */\n  /*    See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the   */\n  /*    @FT_Raster_Params structure for more details.                      */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Outline_Render( FT_Library         library,\n                     FT_Outline*        outline,\n                     FT_Raster_Params*  params );\n\n\n /**************************************************************************\n  *\n  * @enum:\n  *   FT_Orientation\n  *\n  * @description:\n  *   A list of values used to describe an outline's contour orientation.\n  *\n  *   The TrueType and PostScript specifications use different conventions\n  *   to determine whether outline contours should be filled or unfilled.\n  *\n  * @values:\n  *   FT_ORIENTATION_TRUETYPE ::\n  *     According to the TrueType specification, clockwise contours must\n  *     be filled, and counter-clockwise ones must be unfilled.\n  *\n  *   FT_ORIENTATION_POSTSCRIPT ::\n  *     According to the PostScript specification, counter-clockwise contours\n  *     must be filled, and clockwise ones must be unfilled.\n  *\n  *   FT_ORIENTATION_FILL_RIGHT ::\n  *     This is identical to @FT_ORIENTATION_TRUETYPE, but is used to\n  *     remember that in TrueType, everything that is to the right of\n  *     the drawing direction of a contour must be filled.\n  *\n  *   FT_ORIENTATION_FILL_LEFT ::\n  *     This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to\n  *     remember that in PostScript, everything that is to the left of\n  *     the drawing direction of a contour must be filled.\n  *\n  *   FT_ORIENTATION_NONE ::\n  *     The orientation cannot be determined.  That is, different parts of\n  *     the glyph have different orientation.\n  *\n  */\n  typedef enum  FT_Orientation_\n  {\n    FT_ORIENTATION_TRUETYPE   = 0,\n    FT_ORIENTATION_POSTSCRIPT = 1,\n    FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,\n    FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,\n    FT_ORIENTATION_NONE\n\n  } FT_Orientation;\n\n\n /**************************************************************************\n  *\n  * @function:\n  *   FT_Outline_Get_Orientation\n  *\n  * @description:\n  *   This function analyzes a glyph outline and tries to compute its\n  *   fill orientation (see @FT_Orientation).  This is done by computing\n  *   the direction of each global horizontal and/or vertical extrema\n  *   within the outline.\n  *\n  *   Note that this will return @FT_ORIENTATION_TRUETYPE for empty\n  *   outlines.\n  *\n  * @input:\n  *   outline ::\n  *     A handle to the source outline.\n  *\n  * @return:\n  *   The orientation.\n  *\n  */\n  FT_EXPORT( FT_Orientation )\n  FT_Outline_Get_Orientation( FT_Outline*  outline );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTOUTLN_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftpfr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpfr.h                                                                */\n/*                                                                         */\n/*    FreeType API for accessing PFR-specific data (specification only).   */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006, 2008, 2009 by                        */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTPFR_H__\n#define __FTPFR_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    pfr_fonts                                                          */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    PFR Fonts                                                          */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    PFR/TrueDoc specific API.                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of PFR-specific functions.   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_PFR_Metrics\n  *\n  * @description:\n  *    Return the outline and metrics resolutions of a given PFR face.\n  *\n  * @input:\n  *    face :: Handle to the input face.  It can be a non-PFR face.\n  *\n  * @output:\n  *    aoutline_resolution ::\n  *      Outline resolution.  This is equivalent to `face->units_per_EM'\n  *      for non-PFR fonts.  Optional (parameter can be NULL).\n  *\n  *    ametrics_resolution ::\n  *      Metrics resolution.  This is equivalent to `outline_resolution'\n  *      for non-PFR fonts.  Optional (parameter can be NULL).\n  *\n  *    ametrics_x_scale ::\n  *      A 16.16 fixed-point number used to scale distance expressed\n  *      in metrics units to device sub-pixels.  This is equivalent to\n  *      `face->size->x_scale', but for metrics only.  Optional (parameter\n  *      can be NULL).\n  *\n  *    ametrics_y_scale ::\n  *      Same as `ametrics_x_scale' but for the vertical direction.\n  *      optional (parameter can be NULL).\n  *\n  * @return:\n  *    FreeType error code.  0~means success.\n  *\n  * @note:\n  *   If the input face is not a PFR, this function will return an error.\n  *   However, in all cases, it will return valid values.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_PFR_Metrics( FT_Face    face,\n                      FT_UInt   *aoutline_resolution,\n                      FT_UInt   *ametrics_resolution,\n                      FT_Fixed  *ametrics_x_scale,\n                      FT_Fixed  *ametrics_y_scale );\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_PFR_Kerning\n  *\n  * @description:\n  *    Return the kerning pair corresponding to two glyphs in a PFR face.\n  *    The distance is expressed in metrics units, unlike the result of\n  *    @FT_Get_Kerning.\n  *\n  * @input:\n  *    face  :: A handle to the input face.\n  *\n  *    left  :: Index of the left glyph.\n  *\n  *    right :: Index of the right glyph.\n  *\n  * @output:\n  *    avector :: A kerning vector.\n  *\n  * @return:\n  *    FreeType error code.  0~means success.\n  *\n  * @note:\n  *    This function always return distances in original PFR metrics\n  *    units.  This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED\n  *    mode, which always returns distances converted to outline units.\n  *\n  *    You can use the value of the `x_scale' and `y_scale' parameters\n  *    returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_PFR_Kerning( FT_Face     face,\n                      FT_UInt     left,\n                      FT_UInt     right,\n                      FT_Vector  *avector );\n\n\n /**********************************************************************\n  *\n  * @function:\n  *    FT_Get_PFR_Advance\n  *\n  * @description:\n  *    Return a given glyph advance, expressed in original metrics units,\n  *    from a PFR font.\n  *\n  * @input:\n  *    face   :: A handle to the input face.\n  *\n  *    gindex :: The glyph index.\n  *\n  * @output:\n  *    aadvance :: The glyph advance in metrics units.\n  *\n  * @return:\n  *    FreeType error code.  0~means success.\n  *\n  * @note:\n  *    You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics\n  *    to convert the advance to device sub-pixels (i.e., 1/64th of pixels).\n  */\n  FT_EXPORT( FT_Error )\n  FT_Get_PFR_Advance( FT_Face   face,\n                      FT_UInt   gindex,\n                      FT_Pos   *aadvance );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTPFR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftrender.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrender.h                                                             */\n/*                                                                         */\n/*    FreeType renderer modules public interface (specification).          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2005, 2006, 2010 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTRENDER_H__\n#define __FTRENDER_H__\n\n\n#include <ft2build.h>\n#include FT_MODULE_H\n#include FT_GLYPH_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    module_management                                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* create a new glyph object */\n  typedef FT_Error\n  (*FT_Glyph_InitFunc)( FT_Glyph      glyph,\n                        FT_GlyphSlot  slot );\n\n  /* destroys a given glyph object */\n  typedef void\n  (*FT_Glyph_DoneFunc)( FT_Glyph  glyph );\n\n  typedef void\n  (*FT_Glyph_TransformFunc)( FT_Glyph          glyph,\n                             const FT_Matrix*  matrix,\n                             const FT_Vector*  delta );\n\n  typedef void\n  (*FT_Glyph_GetBBoxFunc)( FT_Glyph  glyph,\n                           FT_BBox*  abbox );\n\n  typedef FT_Error\n  (*FT_Glyph_CopyFunc)( FT_Glyph   source,\n                        FT_Glyph   target );\n\n  typedef FT_Error\n  (*FT_Glyph_PrepareFunc)( FT_Glyph      glyph,\n                           FT_GlyphSlot  slot );\n\n/* deprecated */\n#define FT_Glyph_Init_Func       FT_Glyph_InitFunc\n#define FT_Glyph_Done_Func       FT_Glyph_DoneFunc\n#define FT_Glyph_Transform_Func  FT_Glyph_TransformFunc\n#define FT_Glyph_BBox_Func       FT_Glyph_GetBBoxFunc\n#define FT_Glyph_Copy_Func       FT_Glyph_CopyFunc\n#define FT_Glyph_Prepare_Func    FT_Glyph_PrepareFunc\n\n\n  struct  FT_Glyph_Class_\n  {\n    FT_Long                 glyph_size;\n    FT_Glyph_Format         glyph_format;\n    FT_Glyph_InitFunc       glyph_init;\n    FT_Glyph_DoneFunc       glyph_done;\n    FT_Glyph_CopyFunc       glyph_copy;\n    FT_Glyph_TransformFunc  glyph_transform;\n    FT_Glyph_GetBBoxFunc    glyph_bbox;\n    FT_Glyph_PrepareFunc    glyph_prepare;\n  };\n\n\n  typedef FT_Error\n  (*FT_Renderer_RenderFunc)( FT_Renderer       renderer,\n                             FT_GlyphSlot      slot,\n                             FT_UInt           mode,\n                             const FT_Vector*  origin );\n\n  typedef FT_Error\n  (*FT_Renderer_TransformFunc)( FT_Renderer       renderer,\n                                FT_GlyphSlot      slot,\n                                const FT_Matrix*  matrix,\n                                const FT_Vector*  delta );\n\n\n  typedef void\n  (*FT_Renderer_GetCBoxFunc)( FT_Renderer   renderer,\n                              FT_GlyphSlot  slot,\n                              FT_BBox*      cbox );\n\n\n  typedef FT_Error\n  (*FT_Renderer_SetModeFunc)( FT_Renderer  renderer,\n                              FT_ULong     mode_tag,\n                              FT_Pointer   mode_ptr );\n\n/* deprecated identifiers */\n#define FTRenderer_render  FT_Renderer_RenderFunc\n#define FTRenderer_transform  FT_Renderer_TransformFunc\n#define FTRenderer_getCBox  FT_Renderer_GetCBoxFunc\n#define FTRenderer_setMode  FT_Renderer_SetModeFunc\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Renderer_Class                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The renderer module class descriptor.                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root            :: The root @FT_Module_Class fields.               */\n  /*                                                                       */\n  /*    glyph_format    :: The glyph image format this renderer handles.   */\n  /*                                                                       */\n  /*    render_glyph    :: A method used to render the image that is in a  */\n  /*                       given glyph slot into a bitmap.                 */\n  /*                                                                       */\n  /*    transform_glyph :: A method used to transform the image that is in */\n  /*                       a given glyph slot.                             */\n  /*                                                                       */\n  /*    get_glyph_cbox  :: A method used to access the glyph's cbox.       */\n  /*                                                                       */\n  /*    set_mode        :: A method used to pass additional parameters.    */\n  /*                                                                       */\n  /*    raster_class    :: For @FT_GLYPH_FORMAT_OUTLINE renderers only.    */\n  /*                       This is a pointer to its raster's class.        */\n  /*                                                                       */\n  typedef struct  FT_Renderer_Class_\n  {\n    FT_Module_Class            root;\n\n    FT_Glyph_Format            glyph_format;\n\n    FT_Renderer_RenderFunc     render_glyph;\n    FT_Renderer_TransformFunc  transform_glyph;\n    FT_Renderer_GetCBoxFunc    get_glyph_cbox;\n    FT_Renderer_SetModeFunc    set_mode;\n\n    FT_Raster_Funcs*           raster_class;\n\n  } FT_Renderer_Class;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Renderer                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the current renderer for a given glyph format.            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library :: A handle to the library object.                         */\n  /*                                                                       */\n  /*    format  :: The glyph format.                                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A renderer handle.  0~if none found.                               */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    An error will be returned if a module already exists by that name, */\n  /*    or if the module requires a version of FreeType that is too great. */\n  /*                                                                       */\n  /*    To add a new renderer, simply use @FT_Add_Module.  To retrieve a   */\n  /*    renderer by its name, use @FT_Get_Module.                          */\n  /*                                                                       */\n  FT_EXPORT( FT_Renderer )\n  FT_Get_Renderer( FT_Library       library,\n                   FT_Glyph_Format  format );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Set_Renderer                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set the current renderer to use, and set additional mode.          */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    library    :: A handle to the library object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    renderer   :: A handle to the renderer object.                     */\n  /*                                                                       */\n  /*    num_params :: The number of additional parameters.                 */\n  /*                                                                       */\n  /*    parameters :: Additional parameters.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In case of success, the renderer will be used to convert glyph     */\n  /*    images in the renderer's known format into bitmaps.                */\n  /*                                                                       */\n  /*    This doesn't change the current renderer for other formats.        */\n  /*                                                                       */\n  /*    Currently, only the B/W renderer, if compiled with                 */\n  /*    FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels               */\n  /*    anti-aliasing mode; this option must be set directly in            */\n  /*    `ftraster.c' and is undefined by default) accepts a single tag     */\n  /*    `pal5' to set its gray palette as a character string with          */\n  /*    5~elements.  Consequently, the third and fourth argument are zero  */\n  /*    normally.                                                          */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Set_Renderer( FT_Library     library,\n                   FT_Renderer    renderer,\n                   FT_UInt        num_params,\n                   FT_Parameter*  parameters );\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTRENDER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftsizes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsizes.h                                                              */\n/*                                                                         */\n/*    FreeType size objects management (specification).                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Typical application would normally not need to use these functions.   */\n  /* However, they have been placed in a public API for the rare cases     */\n  /* where they are needed.                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTSIZES_H__\n#define __FTSIZES_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    sizes_management                                                   */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Size Management                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Managing multiple sizes per face.                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    When creating a new face object (e.g., with @FT_New_Face), an      */\n  /*    @FT_Size object is automatically created and used to store all     */\n  /*    pixel-size dependent information, available in the `face->size'    */\n  /*    field.                                                             */\n  /*                                                                       */\n  /*    It is however possible to create more sizes for a given face,      */\n  /*    mostly in order to manage several character pixel sizes of the     */\n  /*    same font family and style.  See @FT_New_Size and @FT_Done_Size.   */\n  /*                                                                       */\n  /*    Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only           */\n  /*    modify the contents of the current `active' size; you thus need    */\n  /*    to use @FT_Activate_Size to change it.                             */\n  /*                                                                       */\n  /*    99% of applications won't need the functions provided here,        */\n  /*    especially if they use the caching sub-system, so be cautious      */\n  /*    when using these.                                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Size                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new size object from a given face object.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to a parent face object.                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    asize :: A handle to a new size object.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You need to call @FT_Activate_Size in order to select the new size */\n  /*    for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size,      */\n  /*    @FT_Load_Glyph, @FT_Load_Char, etc.                                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_New_Size( FT_Face   face,\n               FT_Size*  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Size                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard a given size object.  Note that @FT_Done_Face              */\n  /*    automatically discards all size objects allocated with             */\n  /*    @FT_New_Size.                                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to a target size object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Done_Size( FT_Size  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Activate_Size                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Even though it is possible to create several size objects for a    */\n  /*    given face (see @FT_New_Size for details), functions like          */\n  /*    @FT_Load_Glyph or @FT_Load_Char only use the one which has been    */\n  /*    activated last to determine the `current character pixel size'.    */\n  /*                                                                       */\n  /*    This function can be used to `activate' a previously created size  */\n  /*    object.                                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to a target size object.                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    If `face' is the size's parent face object, this function changes  */\n  /*    the value of `face->size' to the input size handle.                */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Activate_Size( FT_Size  size );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTSIZES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftsnames.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsnames.h                                                             */\n/*                                                                         */\n/*    Simple interface to access SFNT name tables (which are used          */\n/*    to hold font names, copyright info, notices, etc.) (specification).  */\n/*                                                                         */\n/*    This is _not_ used to retrieve glyph names!                          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FT_SFNT_NAMES_H__\n#define __FT_SFNT_NAMES_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    sfnt_names                                                         */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    SFNT Names                                                         */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Access the names embedded in TrueType and OpenType files.          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType and OpenType specifications allow the inclusion of    */\n  /*    a special `names table' in font files.  This table contains        */\n  /*    textual (and internationalized) information regarding the font,    */\n  /*    like family name, copyright, version, etc.                         */\n  /*                                                                       */\n  /*    The definitions below are used to access them if available.        */\n  /*                                                                       */\n  /*    Note that this has nothing to do with glyph names!                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_SfntName                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model an SFNT `name' table entry.              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    platform_id :: The platform ID for `string'.                       */\n  /*                                                                       */\n  /*    encoding_id :: The encoding ID for `string'.                       */\n  /*                                                                       */\n  /*    language_id :: The language ID for `string'.                       */\n  /*                                                                       */\n  /*    name_id     :: An identifier for `string'.                         */\n  /*                                                                       */\n  /*    string      :: The `name' string.  Note that its format differs    */\n  /*                   depending on the (platform,encoding) pair.  It can  */\n  /*                   be a Pascal String, a UTF-16 one, etc.              */\n  /*                                                                       */\n  /*                   Generally speaking, the string is not               */\n  /*                   zero-terminated.  Please refer to the TrueType      */\n  /*                   specification for details.                          */\n  /*                                                                       */\n  /*    string_len  :: The length of `string' in bytes.                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Possible values for `platform_id', `encoding_id', `language_id',   */\n  /*    and `name_id' are given in the file `ttnameid.h'.  For details     */\n  /*    please refer to the TrueType or OpenType specification.            */\n  /*                                                                       */\n  /*    See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX,       */\n  /*    @TT_ISO_ID_XXX, and @TT_MS_ID_XXX.                                 */\n  /*                                                                       */\n  typedef struct  FT_SfntName_\n  {\n    FT_UShort  platform_id;\n    FT_UShort  encoding_id;\n    FT_UShort  language_id;\n    FT_UShort  name_id;\n\n    FT_Byte*   string;      /* this string is *not* null-terminated! */\n    FT_UInt    string_len;  /* in bytes */\n\n  } FT_SfntName;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Sfnt_Name_Count                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the number of name strings in the SFNT `name' table.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The number of strings in the `name' table.                         */\n  /*                                                                       */\n  FT_EXPORT( FT_UInt )\n  FT_Get_Sfnt_Name_Count( FT_Face  face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Sfnt_Name                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve a string of the SFNT `name' table for a given index.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face  :: A handle to the source face.                              */\n  /*                                                                       */\n  /*    idx   :: The index of the `name' string.                           */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aname :: The indexed @FT_SfntName structure.                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0~means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The `string' array returned in the `aname' structure is not        */\n  /*    null-terminated.  The application should deallocate it if it is no */\n  /*    longer in use.                                                     */\n  /*                                                                       */\n  /*    Use @FT_Get_Sfnt_Name_Count to get the total number of available   */\n  /*    `name' table entries, then do a loop until you get the right       */\n  /*    platform, encoding, and name ID.                                   */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  FT_Get_Sfnt_Name( FT_Face       face,\n                    FT_UInt       idx,\n                    FT_SfntName  *aname );\n\n\n  /***************************************************************************\n   *\n   * @constant:\n   *   FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY\n   *\n   * @description:\n   *   A constant used as the tag of @FT_Parameter structures to make\n   *   FT_Open_Face() ignore preferred family subfamily names in `name'\n   *   table since OpenType version 1.4.  For backwards compatibility with\n   *   legacy systems which has 4-face-per-family restriction.\n   *\n   */\n#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 'f' )\n\n\n  /***************************************************************************\n   *\n   * @constant:\n   *   FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY\n   *\n   * @description:\n   *   A constant used as the tag of @FT_Parameter structures to make\n   *   FT_Open_Face() ignore preferred subfamily names in `name' table since\n   *   OpenType version 1.4.  For backwards compatibility with legacy\n   *   systems which has 4-face-per-family restriction.\n   *\n   */\n#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 's' )\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FT_SFNT_NAMES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftstroke.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstroke.h                                                             */\n/*                                                                         */\n/*    FreeType path stroker (specification).                               */\n/*                                                                         */\n/*  Copyright 2002-2006, 2008, 2009, 2011-2012 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FT_STROKE_H__\n#define __FT_STROKE_H__\n\n#include <ft2build.h>\n#include FT_OUTLINE_H\n#include FT_GLYPH_H\n\n\nFT_BEGIN_HEADER\n\n\n /************************************************************************\n  *\n  * @section:\n  *    glyph_stroker\n  *\n  * @title:\n  *    Glyph Stroker\n  *\n  * @abstract:\n  *    Generating bordered and stroked glyphs.\n  *\n  * @description:\n  *    This component generates stroked outlines of a given vectorial\n  *    glyph.  It also allows you to retrieve the `outside' and/or the\n  *    `inside' borders of the stroke.\n  *\n  *    This can be useful to generate `bordered' glyph, i.e., glyphs\n  *    displayed with a coloured (and anti-aliased) border around their\n  *    shape.\n  */\n\n\n /**************************************************************\n  *\n  * @type:\n  *   FT_Stroker\n  *\n  * @description:\n  *   Opaque handler to a path stroker object.\n  */\n  typedef struct FT_StrokerRec_*  FT_Stroker;\n\n\n  /**************************************************************\n   *\n   * @enum:\n   *   FT_Stroker_LineJoin\n   *\n   * @description:\n   *   These values determine how two joining lines are rendered\n   *   in a stroker.\n   *\n   * @values:\n   *   FT_STROKER_LINEJOIN_ROUND ::\n   *     Used to render rounded line joins.  Circular arcs are used\n   *     to join two lines smoothly.\n   *\n   *   FT_STROKER_LINEJOIN_BEVEL ::\n   *     Used to render beveled line joins.  The outer corner of\n   *     the joined lines is filled by enclosing the triangular\n   *     region of the corner with a straight line between the\n   *     outer corners of each stroke.\n   *\n   *   FT_STROKER_LINEJOIN_MITER_FIXED ::\n   *     Used to render mitered line joins, with fixed bevels if the\n   *     miter limit is exceeded.  The outer edges of the strokes\n   *     for the two segments are extended until they meet at an\n   *     angle.  If the segments meet at too sharp an angle (such\n   *     that the miter would extend from the intersection of the\n   *     segments a distance greater than the product of the miter\n   *     limit value and the border radius), then a bevel join (see\n   *     above) is used instead.  This prevents long spikes being\n   *     created.  FT_STROKER_LINEJOIN_MITER_FIXED generates a miter\n   *     line join as used in PostScript and PDF.\n   *\n   *   FT_STROKER_LINEJOIN_MITER_VARIABLE ::\n   *   FT_STROKER_LINEJOIN_MITER ::\n   *     Used to render mitered line joins, with variable bevels if\n   *     the miter limit is exceeded.  The intersection of the\n   *     strokes is clipped at a line perpendicular to the bisector\n   *     of the angle between the strokes, at the distance from the\n   *     intersection of the segments equal to the product of the\n   *     miter limit value and the border radius.  This prevents\n   *     long spikes being created.\n   *     FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line\n   *     join as used in XPS.  FT_STROKER_LINEJOIN_MITER is an alias\n   *     for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for\n   *     backwards compatibility.\n   */\n  typedef enum  FT_Stroker_LineJoin_\n  {\n    FT_STROKER_LINEJOIN_ROUND          = 0,\n    FT_STROKER_LINEJOIN_BEVEL          = 1,\n    FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,\n    FT_STROKER_LINEJOIN_MITER          = FT_STROKER_LINEJOIN_MITER_VARIABLE,\n    FT_STROKER_LINEJOIN_MITER_FIXED    = 3\n\n  } FT_Stroker_LineJoin;\n\n\n  /**************************************************************\n   *\n   * @enum:\n   *   FT_Stroker_LineCap\n   *\n   * @description:\n   *   These values determine how the end of opened sub-paths are\n   *   rendered in a stroke.\n   *\n   * @values:\n   *   FT_STROKER_LINECAP_BUTT ::\n   *     The end of lines is rendered as a full stop on the last\n   *     point itself.\n   *\n   *   FT_STROKER_LINECAP_ROUND ::\n   *     The end of lines is rendered as a half-circle around the\n   *     last point.\n   *\n   *   FT_STROKER_LINECAP_SQUARE ::\n   *     The end of lines is rendered as a square around the\n   *     last point.\n   */\n  typedef enum  FT_Stroker_LineCap_\n  {\n    FT_STROKER_LINECAP_BUTT = 0,\n    FT_STROKER_LINECAP_ROUND,\n    FT_STROKER_LINECAP_SQUARE\n\n  } FT_Stroker_LineCap;\n\n\n  /**************************************************************\n   *\n   * @enum:\n   *   FT_StrokerBorder\n   *\n   * @description:\n   *   These values are used to select a given stroke border\n   *   in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.\n   *\n   * @values:\n   *   FT_STROKER_BORDER_LEFT ::\n   *     Select the left border, relative to the drawing direction.\n   *\n   *   FT_STROKER_BORDER_RIGHT ::\n   *     Select the right border, relative to the drawing direction.\n   *\n   * @note:\n   *   Applications are generally interested in the `inside' and `outside'\n   *   borders.  However, there is no direct mapping between these and the\n   *   `left' and `right' ones, since this really depends on the glyph's\n   *   drawing orientation, which varies between font formats.\n   *\n   *   You can however use @FT_Outline_GetInsideBorder and\n   *   @FT_Outline_GetOutsideBorder to get these.\n   */\n  typedef enum  FT_StrokerBorder_\n  {\n    FT_STROKER_BORDER_LEFT = 0,\n    FT_STROKER_BORDER_RIGHT\n\n  } FT_StrokerBorder;\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Outline_GetInsideBorder\n   *\n   * @description:\n   *   Retrieve the @FT_StrokerBorder value corresponding to the\n   *   `inside' borders of a given outline.\n   *\n   * @input:\n   *   outline ::\n   *     The source outline handle.\n   *\n   * @return:\n   *   The border index.  @FT_STROKER_BORDER_RIGHT for empty or invalid\n   *   outlines.\n   */\n  FT_EXPORT( FT_StrokerBorder )\n  FT_Outline_GetInsideBorder( FT_Outline*  outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Outline_GetOutsideBorder\n   *\n   * @description:\n   *   Retrieve the @FT_StrokerBorder value corresponding to the\n   *   `outside' borders of a given outline.\n   *\n   * @input:\n   *   outline ::\n   *     The source outline handle.\n   *\n   * @return:\n   *   The border index.  @FT_STROKER_BORDER_LEFT for empty or invalid\n   *   outlines.\n   */\n  FT_EXPORT( FT_StrokerBorder )\n  FT_Outline_GetOutsideBorder( FT_Outline*  outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_New\n   *\n   * @description:\n   *   Create a new stroker object.\n   *\n   * @input:\n   *   library ::\n   *     FreeType library handle.\n   *\n   * @output:\n   *   astroker ::\n   *     A new stroker object handle.  NULL in case of error.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_New( FT_Library   library,\n                  FT_Stroker  *astroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Set\n   *\n   * @description:\n   *   Reset a stroker object's attributes.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   radius ::\n   *     The border radius.\n   *\n   *   line_cap ::\n   *     The line cap style.\n   *\n   *   line_join ::\n   *     The line join style.\n   *\n   *   miter_limit ::\n   *     The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and\n   *     FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,\n   *     expressed as 16.16 fixed-point value.\n   *\n   * @note:\n   *   The radius is expressed in the same units as the outline\n   *   coordinates.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Set( FT_Stroker           stroker,\n                  FT_Fixed             radius,\n                  FT_Stroker_LineCap   line_cap,\n                  FT_Stroker_LineJoin  line_join,\n                  FT_Fixed             miter_limit );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Rewind\n   *\n   * @description:\n   *   Reset a stroker object without changing its attributes.\n   *   You should call this function before beginning a new\n   *   series of calls to @FT_Stroker_BeginSubPath or\n   *   @FT_Stroker_EndSubPath.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Rewind( FT_Stroker  stroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_ParseOutline\n   *\n   * @description:\n   *   A convenience function used to parse a whole outline with\n   *   the stroker.  The resulting outline(s) can be retrieved\n   *   later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   outline ::\n   *     The source outline.\n   *\n   *   opened ::\n   *     A boolean.  If~1, the outline is treated as an open path instead\n   *     of a closed one.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   If `opened' is~0 (the default), the outline is treated as a closed\n   *   path, and the stroker generates two distinct `border' outlines.\n   *\n   *   If `opened' is~1, the outline is processed as an open path, and the\n   *   stroker generates a single `stroke' outline.\n   *\n   *   This function calls @FT_Stroker_Rewind automatically.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_ParseOutline( FT_Stroker   stroker,\n                           FT_Outline*  outline,\n                           FT_Bool      opened );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_BeginSubPath\n   *\n   * @description:\n   *   Start a new sub-path in the stroker.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   to ::\n   *     A pointer to the start vector.\n   *\n   *   open ::\n   *     A boolean.  If~1, the sub-path is treated as an open one.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   This function is useful when you need to stroke a path that is\n   *   not stored as an @FT_Outline object.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_BeginSubPath( FT_Stroker  stroker,\n                           FT_Vector*  to,\n                           FT_Bool     open );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_EndSubPath\n   *\n   * @description:\n   *   Close the current sub-path in the stroker.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function after @FT_Stroker_BeginSubPath.\n   *   If the subpath was not `opened', this function `draws' a\n   *   single line segment to the start position when needed.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_EndSubPath( FT_Stroker  stroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_LineTo\n   *\n   * @description:\n   *   `Draw' a single line segment in the stroker's current sub-path,\n   *   from the last position.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   to ::\n   *     A pointer to the destination point.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function between @FT_Stroker_BeginSubPath and\n   *   @FT_Stroker_EndSubPath.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_LineTo( FT_Stroker  stroker,\n                     FT_Vector*  to );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_ConicTo\n   *\n   * @description:\n   *   `Draw' a single quadratic Bézier in the stroker's current sub-path,\n   *   from the last position.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   control ::\n   *     A pointer to a Bézier control point.\n   *\n   *   to ::\n   *     A pointer to the destination point.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function between @FT_Stroker_BeginSubPath and\n   *   @FT_Stroker_EndSubPath.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_ConicTo( FT_Stroker  stroker,\n                      FT_Vector*  control,\n                      FT_Vector*  to );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_CubicTo\n   *\n   * @description:\n   *   `Draw' a single cubic Bézier in the stroker's current sub-path,\n   *   from the last position.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   control1 ::\n   *     A pointer to the first Bézier control point.\n   *\n   *   control2 ::\n   *     A pointer to second Bézier control point.\n   *\n   *   to ::\n   *     A pointer to the destination point.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   You should call this function between @FT_Stroker_BeginSubPath and\n   *   @FT_Stroker_EndSubPath.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_CubicTo( FT_Stroker  stroker,\n                      FT_Vector*  control1,\n                      FT_Vector*  control2,\n                      FT_Vector*  to );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_GetBorderCounts\n   *\n   * @description:\n   *   Call this function once you have finished parsing your paths\n   *   with the stroker.  It returns the number of points and\n   *   contours necessary to export one of the `border' or `stroke'\n   *   outlines generated by the stroker.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   border ::\n   *     The border index.\n   *\n   * @output:\n   *   anum_points ::\n   *     The number of points.\n   *\n   *   anum_contours ::\n   *     The number of contours.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   When an outline, or a sub-path, is `closed', the stroker generates\n   *   two independent `border' outlines, named `left' and `right'.\n   *\n   *   When the outline, or a sub-path, is `opened', the stroker merges\n   *   the `border' outlines with caps.  The `left' border receives all\n   *   points, while the `right' border becomes empty.\n   *\n   *   Use the function @FT_Stroker_GetCounts instead if you want to\n   *   retrieve the counts associated to both borders.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,\n                              FT_StrokerBorder  border,\n                              FT_UInt          *anum_points,\n                              FT_UInt          *anum_contours );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_ExportBorder\n   *\n   * @description:\n   *   Call this function after @FT_Stroker_GetBorderCounts to\n   *   export the corresponding border to your own @FT_Outline\n   *   structure.\n   *\n   *   Note that this function appends the border points and\n   *   contours to your outline, but does not try to resize its\n   *   arrays.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   border ::\n   *     The border index.\n   *\n   *   outline ::\n   *     The target outline handle.\n   *\n   * @note:\n   *   Always call this function after @FT_Stroker_GetBorderCounts to\n   *   get sure that there is enough room in your @FT_Outline object to\n   *   receive all new data.\n   *\n   *   When an outline, or a sub-path, is `closed', the stroker generates\n   *   two independent `border' outlines, named `left' and `right'\n   *\n   *   When the outline, or a sub-path, is `opened', the stroker merges\n   *   the `border' outlines with caps. The `left' border receives all\n   *   points, while the `right' border becomes empty.\n   *\n   *   Use the function @FT_Stroker_Export instead if you want to\n   *   retrieve all borders at once.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_ExportBorder( FT_Stroker        stroker,\n                           FT_StrokerBorder  border,\n                           FT_Outline*       outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_GetCounts\n   *\n   * @description:\n   *   Call this function once you have finished parsing your paths\n   *   with the stroker.  It returns the number of points and\n   *   contours necessary to export all points/borders from the stroked\n   *   outline/path.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   * @output:\n   *   anum_points ::\n   *     The number of points.\n   *\n   *   anum_contours ::\n   *     The number of contours.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Stroker_GetCounts( FT_Stroker  stroker,\n                        FT_UInt    *anum_points,\n                        FT_UInt    *anum_contours );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Export\n   *\n   * @description:\n   *   Call this function after @FT_Stroker_GetBorderCounts to\n   *   export all borders to your own @FT_Outline structure.\n   *\n   *   Note that this function appends the border points and\n   *   contours to your outline, but does not try to resize its\n   *   arrays.\n   *\n   * @input:\n   *   stroker ::\n   *     The target stroker handle.\n   *\n   *   outline ::\n   *     The target outline handle.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Export( FT_Stroker   stroker,\n                     FT_Outline*  outline );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Stroker_Done\n   *\n   * @description:\n   *   Destroy a stroker object.\n   *\n   * @input:\n   *   stroker ::\n   *     A stroker handle.  Can be NULL.\n   */\n  FT_EXPORT( void )\n  FT_Stroker_Done( FT_Stroker  stroker );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Glyph_Stroke\n   *\n   * @description:\n   *   Stroke a given outline glyph object with a given stroker.\n   *\n   * @inout:\n   *   pglyph ::\n   *     Source glyph handle on input, new glyph handle on output.\n   *\n   * @input:\n   *   stroker ::\n   *     A stroker handle.\n   *\n   *   destroy ::\n   *     A Boolean.  If~1, the source glyph object is destroyed\n   *     on success.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *   The source glyph is untouched in case of error.\n   *\n   *   Adding stroke may yield a significantly wider and taller glyph\n   *   depending on how large of a radius was used to stroke the glyph.  You\n   *   may need to manually adjust horizontal and vertical advance amounts\n   *   to account for this added size.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_Stroke( FT_Glyph    *pglyph,\n                   FT_Stroker   stroker,\n                   FT_Bool      destroy );\n\n\n  /**************************************************************\n   *\n   * @function:\n   *   FT_Glyph_StrokeBorder\n   *\n   * @description:\n   *   Stroke a given outline glyph object with a given stroker, but\n   *   only return either its inside or outside border.\n   *\n   * @inout:\n   *   pglyph ::\n   *     Source glyph handle on input, new glyph handle on output.\n   *\n   * @input:\n   *   stroker ::\n   *     A stroker handle.\n   *\n   *   inside ::\n   *     A Boolean.  If~1, return the inside border, otherwise\n   *     the outside border.\n   *\n   *   destroy ::\n   *     A Boolean.  If~1, the source glyph object is destroyed\n   *     on success.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *   The source glyph is untouched in case of error.\n   *\n   *   Adding stroke may yield a significantly wider and taller glyph\n   *   depending on how large of a radius was used to stroke the glyph.  You\n   *   may need to manually adjust horizontal and vertical advance amounts\n   *   to account for this added size.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,\n                         FT_Stroker   stroker,\n                         FT_Bool      inside,\n                         FT_Bool      destroy );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FT_STROKE_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftsynth.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsynth.h                                                              */\n/*                                                                         */\n/*    FreeType synthesizing code for emboldening and slanting              */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 2000-2001, 2003, 2006, 2008, 2012 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*********                                                       *********/\n  /*********        WARNING, THIS IS ALPHA CODE!  THIS API         *********/\n  /*********    IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE    *********/\n  /*********            FREETYPE DEVELOPMENT TEAM                  *********/\n  /*********                                                       *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* Main reason for not lifting the functions in this module to a  */\n  /* `standard' API is that the used parameters for emboldening and */\n  /* slanting are not configurable.  Consider the functions as a    */\n  /* code resource which should be copied into the application and  */\n  /* adapted to the particular needs.                               */\n\n\n#ifndef __FTSYNTH_H__\n#define __FTSYNTH_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /* Embolden a glyph by a `reasonable' value (which is highly a matter of */\n  /* taste).  This function is actually a convenience function, providing  */\n  /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden.           */\n  /*                                                                       */\n  /* For emboldened outlines the height, width, and advance metrics are    */\n  /* increased by the strength of the emboldening.  You can also call      */\n  /* @FT_Outline_Get_CBox to get precise values.                           */\n  FT_EXPORT( void )\n  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot );\n\n  /* Slant an outline glyph to the right by about 12 degrees. */\n  FT_EXPORT( void )\n  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot );\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTSYNTH_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftsystem.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsystem.h                                                             */\n/*                                                                         */\n/*    FreeType low-level system interface definition (specification).      */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2005, 2010 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSYSTEM_H__\n#define __FTSYSTEM_H__\n\n\n#include <ft2build.h>\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*   system_interface                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*   System Interface                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*   How FreeType manages memory and i/o.                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   This section contains various definitions related to memory         */\n  /*   management and i/o access.  You need to understand this             */\n  /*   information if you want to use a custom memory manager or you own   */\n  /*   i/o streams.                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                  M E M O R Y   M A N A G E M E N T                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FT_Memory\n   *\n   * @description:\n   *   A handle to a given memory manager object, defined with an\n   *   @FT_MemoryRec structure.\n   *\n   */\n  typedef struct FT_MemoryRec_*  FT_Memory;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Alloc_Func\n   *\n   * @description:\n   *   A function used to allocate `size' bytes from `memory'.\n   *\n   * @input:\n   *   memory ::\n   *     A handle to the source memory manager.\n   *\n   *   size ::\n   *     The size in bytes to allocate.\n   *\n   * @return:\n   *   Address of new memory block.  0~in case of failure.\n   *\n   */\n  typedef void*\n  (*FT_Alloc_Func)( FT_Memory  memory,\n                    long       size );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Free_Func\n   *\n   * @description:\n   *   A function used to release a given block of memory.\n   *\n   * @input:\n   *   memory ::\n   *     A handle to the source memory manager.\n   *\n   *   block ::\n   *     The address of the target memory block.\n   *\n   */\n  typedef void\n  (*FT_Free_Func)( FT_Memory  memory,\n                   void*      block );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Realloc_Func\n   *\n   * @description:\n   *   A function used to re-allocate a given block of memory.\n   *\n   * @input:\n   *   memory ::\n   *     A handle to the source memory manager.\n   *\n   *   cur_size ::\n   *     The block's current size in bytes.\n   *\n   *   new_size ::\n   *     The block's requested new size.\n   *\n   *   block ::\n   *     The block's current address.\n   *\n   * @return:\n   *   New block address.  0~in case of memory shortage.\n   *\n   * @note:\n   *   In case of error, the old block must still be available.\n   *\n   */\n  typedef void*\n  (*FT_Realloc_Func)( FT_Memory  memory,\n                      long       cur_size,\n                      long       new_size,\n                      void*      block );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FT_MemoryRec\n   *\n   * @description:\n   *   A structure used to describe a given memory manager to FreeType~2.\n   *\n   * @fields:\n   *   user ::\n   *     A generic typeless pointer for user data.\n   *\n   *   alloc ::\n   *     A pointer type to an allocation function.\n   *\n   *   free ::\n   *     A pointer type to an memory freeing function.\n   *\n   *   realloc ::\n   *     A pointer type to a reallocation function.\n   *\n   */\n  struct  FT_MemoryRec_\n  {\n    void*            user;\n    FT_Alloc_Func    alloc;\n    FT_Free_Func     free;\n    FT_Realloc_Func  realloc;\n  };\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                       I / O   M A N A G E M E N T                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FT_Stream\n   *\n   * @description:\n   *   A handle to an input stream.\n   *\n   */\n  typedef struct FT_StreamRec_*  FT_Stream;\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FT_StreamDesc\n   *\n   * @description:\n   *   A union type used to store either a long or a pointer.  This is used\n   *   to store a file descriptor or a `FILE*' in an input stream.\n   *\n   */\n  typedef union  FT_StreamDesc_\n  {\n    long   value;\n    void*  pointer;\n\n  } FT_StreamDesc;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Stream_IoFunc\n   *\n   * @description:\n   *   A function used to seek and read data from a given input stream.\n   *\n   * @input:\n   *   stream ::\n   *     A handle to the source stream.\n   *\n   *   offset ::\n   *     The offset of read in stream (always from start).\n   *\n   *   buffer ::\n   *     The address of the read buffer.\n   *\n   *   count ::\n   *     The number of bytes to read from the stream.\n   *\n   * @return:\n   *   The number of bytes effectively read by the stream.\n   *\n   * @note:\n   *   This function might be called to perform a seek or skip operation\n   *   with a `count' of~0.  A non-zero return value then indicates an\n   *   error.\n   *\n   */\n  typedef unsigned long\n  (*FT_Stream_IoFunc)( FT_Stream       stream,\n                       unsigned long   offset,\n                       unsigned char*  buffer,\n                       unsigned long   count );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   FT_Stream_CloseFunc\n   *\n   * @description:\n   *   A function used to close a given input stream.\n   *\n   * @input:\n   *  stream ::\n   *     A handle to the target stream.\n   *\n   */\n  typedef void\n  (*FT_Stream_CloseFunc)( FT_Stream  stream );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   FT_StreamRec\n   *\n   * @description:\n   *   A structure used to describe an input stream.\n   *\n   * @input:\n   *   base ::\n   *     For memory-based streams, this is the address of the first stream\n   *     byte in memory.  This field should always be set to NULL for\n   *     disk-based streams.\n   *\n   *   size ::\n   *     The stream size in bytes.\n   *\n   *   pos ::\n   *     The current position within the stream.\n   *\n   *   descriptor ::\n   *     This field is a union that can hold an integer or a pointer.  It is\n   *     used by stream implementations to store file descriptors or `FILE*'\n   *     pointers.\n   *\n   *   pathname ::\n   *     This field is completely ignored by FreeType.  However, it is often\n   *     useful during debugging to use it to store the stream's filename\n   *     (where available).\n   *\n   *   read ::\n   *     The stream's input function.\n   *\n   *   close ::\n   *     The stream's close function.\n   *\n   *   memory ::\n   *     The memory manager to use to preload frames.  This is set\n   *     internally by FreeType and shouldn't be touched by stream\n   *     implementations.\n   *\n   *   cursor ::\n   *     This field is set and used internally by FreeType when parsing\n   *     frames.\n   *\n   *   limit ::\n   *     This field is set and used internally by FreeType when parsing\n   *     frames.\n   *\n   */\n  typedef struct  FT_StreamRec_\n  {\n    unsigned char*       base;\n    unsigned long        size;\n    unsigned long        pos;\n\n    FT_StreamDesc        descriptor;\n    FT_StreamDesc        pathname;\n    FT_Stream_IoFunc     read;\n    FT_Stream_CloseFunc  close;\n\n    FT_Memory            memory;\n    unsigned char*       cursor;\n    unsigned char*       limit;\n\n  } FT_StreamRec;\n\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTSYSTEM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/fttrigon.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttrigon.h                                                             */\n/*                                                                         */\n/*    FreeType trigonometric functions (specification).                    */\n/*                                                                         */\n/*  Copyright 2001, 2003, 2005, 2007, 2013 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTTRIGON_H__\n#define __FTTRIGON_H__\n\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*   computations                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   FT_Angle\n   *\n   * @description:\n   *   This type is used to model angle values in FreeType.  Note that the\n   *   angle is a 16.16 fixed-point value expressed in degrees.\n   *\n   */\n  typedef FT_Fixed  FT_Angle;\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_PI\n   *\n   * @description:\n   *   The angle pi expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_PI  ( 180L << 16 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_2PI\n   *\n   * @description:\n   *   The angle 2*pi expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_2PI  ( FT_ANGLE_PI * 2 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_PI2\n   *\n   * @description:\n   *   The angle pi/2 expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_PI2  ( FT_ANGLE_PI / 2 )\n\n\n  /*************************************************************************\n   *\n   * @macro:\n   *   FT_ANGLE_PI4\n   *\n   * @description:\n   *   The angle pi/4 expressed in @FT_Angle units.\n   *\n   */\n#define FT_ANGLE_PI4  ( FT_ANGLE_PI / 4 )\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Sin\n   *\n   * @description:\n   *   Return the sinus of a given angle in fixed-point format.\n   *\n   * @input:\n   *   angle ::\n   *     The input angle.\n   *\n   * @return:\n   *   The sinus value.\n   *\n   * @note:\n   *   If you need both the sinus and cosinus for a given angle, use the\n   *   function @FT_Vector_Unit.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Sin( FT_Angle  angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Cos\n   *\n   * @description:\n   *   Return the cosinus of a given angle in fixed-point format.\n   *\n   * @input:\n   *   angle ::\n   *     The input angle.\n   *\n   * @return:\n   *   The cosinus value.\n   *\n   * @note:\n   *   If you need both the sinus and cosinus for a given angle, use the\n   *   function @FT_Vector_Unit.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Cos( FT_Angle  angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Tan\n   *\n   * @description:\n   *   Return the tangent of a given angle in fixed-point format.\n   *\n   * @input:\n   *   angle ::\n   *     The input angle.\n   *\n   * @return:\n   *   The tangent value.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Tan( FT_Angle  angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Atan2\n   *\n   * @description:\n   *   Return the arc-tangent corresponding to a given vector (x,y) in\n   *   the 2d plane.\n   *\n   * @input:\n   *   x ::\n   *     The horizontal vector coordinate.\n   *\n   *   y ::\n   *     The vertical vector coordinate.\n   *\n   * @return:\n   *   The arc-tangent value (i.e. angle).\n   *\n   */\n  FT_EXPORT( FT_Angle )\n  FT_Atan2( FT_Fixed  x,\n            FT_Fixed  y );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Angle_Diff\n   *\n   * @description:\n   *   Return the difference between two angles.  The result is always\n   *   constrained to the ]-PI..PI] interval.\n   *\n   * @input:\n   *   angle1 ::\n   *     First angle.\n   *\n   *   angle2 ::\n   *     Second angle.\n   *\n   * @return:\n   *   Constrained value of `value2-value1'.\n   *\n   */\n  FT_EXPORT( FT_Angle )\n  FT_Angle_Diff( FT_Angle  angle1,\n                 FT_Angle  angle2 );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Unit\n   *\n   * @description:\n   *   Return the unit vector corresponding to a given angle.  After the\n   *   call, the value of `vec.x' will be `sin(angle)', and the value of\n   *   `vec.y' will be `cos(angle)'.\n   *\n   *   This function is useful to retrieve both the sinus and cosinus of a\n   *   given angle quickly.\n   *\n   * @output:\n   *   vec ::\n   *     The address of target vector.\n   *\n   * @input:\n   *   angle ::\n   *     The address of angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_Unit( FT_Vector*  vec,\n                  FT_Angle    angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Rotate\n   *\n   * @description:\n   *   Rotate a vector by a given angle.\n   *\n   * @inout:\n   *   vec ::\n   *     The address of target vector.\n   *\n   * @input:\n   *   angle ::\n   *     The address of angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_Rotate( FT_Vector*  vec,\n                    FT_Angle    angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Length\n   *\n   * @description:\n   *   Return the length of a given vector.\n   *\n   * @input:\n   *   vec ::\n   *     The address of target vector.\n   *\n   * @return:\n   *   The vector length, expressed in the same units that the original\n   *   vector coordinates.\n   *\n   */\n  FT_EXPORT( FT_Fixed )\n  FT_Vector_Length( FT_Vector*  vec );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_Polarize\n   *\n   * @description:\n   *   Compute both the length and angle of a given vector.\n   *\n   * @input:\n   *   vec ::\n   *     The address of source vector.\n   *\n   * @output:\n   *   length ::\n   *     The vector length.\n   *\n   *   angle ::\n   *     The vector angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_Polarize( FT_Vector*  vec,\n                      FT_Fixed   *length,\n                      FT_Angle   *angle );\n\n\n  /*************************************************************************\n   *\n   * @function:\n   *   FT_Vector_From_Polar\n   *\n   * @description:\n   *   Compute vector coordinates from a length and angle.\n   *\n   * @output:\n   *   vec ::\n   *     The address of source vector.\n   *\n   * @input:\n   *   length ::\n   *     The vector length.\n   *\n   *   angle ::\n   *     The vector angle.\n   *\n   */\n  FT_EXPORT( void )\n  FT_Vector_From_Polar( FT_Vector*  vec,\n                        FT_Fixed    length,\n                        FT_Angle    angle );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTTRIGON_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/fttypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttypes.h                                                              */\n/*                                                                         */\n/*    FreeType simple types definitions (specification only).              */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2006-2009, 2012, 2013 by                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTTYPES_H__\n#define __FTTYPES_H__\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n#include FT_SYSTEM_H\n#include FT_IMAGE_H\n\n#include <stddef.h>\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Basic Data Types                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    The basic data types defined by the library.                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the basic data types defined by FreeType~2,  */\n  /*    ranging from simple scalar types to bitmap descriptors.  More      */\n  /*    font-specific structures are defined in a different section.       */\n  /*                                                                       */\n  /* <Order>                                                               */\n  /*    FT_Byte                                                            */\n  /*    FT_Bytes                                                           */\n  /*    FT_Char                                                            */\n  /*    FT_Int                                                             */\n  /*    FT_UInt                                                            */\n  /*    FT_Int16                                                           */\n  /*    FT_UInt16                                                          */\n  /*    FT_Int32                                                           */\n  /*    FT_UInt32                                                          */\n  /*    FT_Short                                                           */\n  /*    FT_UShort                                                          */\n  /*    FT_Long                                                            */\n  /*    FT_ULong                                                           */\n  /*    FT_Bool                                                            */\n  /*    FT_Offset                                                          */\n  /*    FT_PtrDist                                                         */\n  /*    FT_String                                                          */\n  /*    FT_Tag                                                             */\n  /*    FT_Error                                                           */\n  /*    FT_Fixed                                                           */\n  /*    FT_Pointer                                                         */\n  /*    FT_Pos                                                             */\n  /*    FT_Vector                                                          */\n  /*    FT_BBox                                                            */\n  /*    FT_Matrix                                                          */\n  /*    FT_FWord                                                           */\n  /*    FT_UFWord                                                          */\n  /*    FT_F2Dot14                                                         */\n  /*    FT_UnitVector                                                      */\n  /*    FT_F26Dot6                                                         */\n  /*                                                                       */\n  /*                                                                       */\n  /*    FT_Generic                                                         */\n  /*    FT_Generic_Finalizer                                               */\n  /*                                                                       */\n  /*    FT_Bitmap                                                          */\n  /*    FT_Pixel_Mode                                                      */\n  /*    FT_Palette_Mode                                                    */\n  /*    FT_Glyph_Format                                                    */\n  /*    FT_IMAGE_TAG                                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Bool                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef of unsigned char, used for simple booleans.  As usual,   */\n  /*    values 1 and~0 represent true and false, respectively.             */\n  /*                                                                       */\n  typedef unsigned char  FT_Bool;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_FWord                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A signed 16-bit integer used to store a distance in original font  */\n  /*    units.                                                             */\n  /*                                                                       */\n  typedef signed short  FT_FWord;   /* distance in FUnits */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UFWord                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An unsigned 16-bit integer used to store a distance in original    */\n  /*    font units.                                                        */\n  /*                                                                       */\n  typedef unsigned short  FT_UFWord;  /* unsigned distance */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Char                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for the _signed_ char type.                       */\n  /*                                                                       */\n  typedef signed char  FT_Char;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Byte                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for the _unsigned_ char type.                     */\n  /*                                                                       */\n  typedef unsigned char  FT_Byte;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Bytes                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for constant memory areas.                               */\n  /*                                                                       */\n  typedef const FT_Byte*  FT_Bytes;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Tag                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for 32-bit tags (as used in the SFNT format).            */\n  /*                                                                       */\n  typedef FT_UInt32  FT_Tag;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_String                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for the char type, usually used for strings.      */\n  /*                                                                       */\n  typedef char  FT_String;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Short                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for signed short.                                        */\n  /*                                                                       */\n  typedef signed short  FT_Short;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UShort                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for unsigned short.                                      */\n  /*                                                                       */\n  typedef unsigned short  FT_UShort;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for the int type.                                        */\n  /*                                                                       */\n  typedef signed int  FT_Int;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for the unsigned int type.                               */\n  /*                                                                       */\n  typedef unsigned int  FT_UInt;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Long                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for signed long.                                         */\n  /*                                                                       */\n  typedef signed long  FT_Long;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_ULong                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for unsigned long.                                       */\n  /*                                                                       */\n  typedef unsigned long  FT_ULong;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_F2Dot14                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A signed 2.14 fixed-point type used for unit vectors.              */\n  /*                                                                       */\n  typedef signed short  FT_F2Dot14;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_F26Dot6                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A signed 26.6 fixed-point type used for vectorial pixel            */\n  /*    coordinates.                                                       */\n  /*                                                                       */\n  typedef signed long  FT_F26Dot6;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Fixed                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This type is used to store 16.16 fixed-point values, like scaling  */\n  /*    values or matrix coefficients.                                     */\n  /*                                                                       */\n  typedef signed long  FT_Fixed;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Error                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The FreeType error code type.  A value of~0 is always interpreted  */\n  /*    as a successful operation.                                         */\n  /*                                                                       */\n  typedef int  FT_Error;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Pointer                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple typedef for a typeless pointer.                           */\n  /*                                                                       */\n  typedef void*  FT_Pointer;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Offset                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is equivalent to the ANSI~C `size_t' type, i.e., the largest  */\n  /*    _unsigned_ integer type used to express a file size or position,   */\n  /*    or a memory block size.                                            */\n  /*                                                                       */\n  typedef size_t  FT_Offset;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_PtrDist                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the       */\n  /*    largest _signed_ integer type used to express the distance         */\n  /*    between two pointers.                                              */\n  /*                                                                       */\n  typedef ft_ptrdiff_t  FT_PtrDist;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_UnitVector                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to store a 2D vector unit vector.  Uses    */\n  /*    FT_F2Dot14 types.                                                  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    x :: Horizontal coordinate.                                        */\n  /*                                                                       */\n  /*    y :: Vertical coordinate.                                          */\n  /*                                                                       */\n  typedef struct  FT_UnitVector_\n  {\n    FT_F2Dot14  x;\n    FT_F2Dot14  y;\n\n  } FT_UnitVector;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Matrix                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure used to store a 2x2 matrix.  Coefficients are   */\n  /*    in 16.16 fixed-point format.  The computation performed is:        */\n  /*                                                                       */\n  /*       {                                                               */\n  /*          x' = x*xx + y*xy                                             */\n  /*          y' = x*yx + y*yy                                             */\n  /*       }                                                               */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    xx :: Matrix coefficient.                                          */\n  /*                                                                       */\n  /*    xy :: Matrix coefficient.                                          */\n  /*                                                                       */\n  /*    yx :: Matrix coefficient.                                          */\n  /*                                                                       */\n  /*    yy :: Matrix coefficient.                                          */\n  /*                                                                       */\n  typedef struct  FT_Matrix_\n  {\n    FT_Fixed  xx, xy;\n    FT_Fixed  yx, yy;\n\n  } FT_Matrix;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Data                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Read-only binary data represented as a pointer and a length.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    pointer :: The data.                                               */\n  /*                                                                       */\n  /*    length  :: The length of the data in bytes.                        */\n  /*                                                                       */\n  typedef struct  FT_Data_\n  {\n    const FT_Byte*  pointer;\n    FT_Int          length;\n\n  } FT_Data;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Generic_Finalizer                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Describe a function used to destroy the `client' data of any       */\n  /*    FreeType object.  See the description of the @FT_Generic type for  */\n  /*    details of usage.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    The address of the FreeType object which is under finalization.    */\n  /*    Its client data is accessed through its `generic' field.           */\n  /*                                                                       */\n  typedef void  (*FT_Generic_Finalizer)(void*  object);\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Generic                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Client applications often need to associate their own data to a    */\n  /*    variety of FreeType core objects.  For example, a text layout API  */\n  /*    might want to associate a glyph cache to a given size object.      */\n  /*                                                                       */\n  /*    Some FreeType object contains a `generic' field, of type           */\n  /*    FT_Generic, which usage is left to client applications and font    */\n  /*    servers.                                                           */\n  /*                                                                       */\n  /*    It can be used to store a pointer to client-specific data, as well */\n  /*    as the address of a `finalizer' function, which will be called by  */\n  /*    FreeType when the object is destroyed (for example, the previous   */\n  /*    client example would put the address of the glyph cache destructor */\n  /*    in the `finalizer' field).                                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    data      :: A typeless pointer to any client-specified data. This */\n  /*                 field is completely ignored by the FreeType library.  */\n  /*                                                                       */\n  /*    finalizer :: A pointer to a `generic finalizer' function, which    */\n  /*                 will be called when the object is destroyed.  If this */\n  /*                 field is set to NULL, no code will be called.         */\n  /*                                                                       */\n  typedef struct  FT_Generic_\n  {\n    void*                 data;\n    FT_Generic_Finalizer  finalizer;\n\n  } FT_Generic;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_MAKE_TAG                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro converts four-letter tags which are used to label       */\n  /*    TrueType tables into an unsigned long to be used within FreeType.  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The produced values *must* be 32-bit integers.  Don't redefine     */\n  /*    this macro.                                                        */\n  /*                                                                       */\n#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \\\n          (FT_Tag)                        \\\n          ( ( (FT_ULong)_x1 << 24 ) |     \\\n            ( (FT_ULong)_x2 << 16 ) |     \\\n            ( (FT_ULong)_x3 <<  8 ) |     \\\n              (FT_ULong)_x4         )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*                                                                       */\n  /*                    L I S T   M A N A G E M E N T                      */\n  /*                                                                       */\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    list_processing                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_ListNode                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*     Many elements and objects in FreeType are listed through an       */\n  /*     @FT_List record (see @FT_ListRec).  As its name suggests, an      */\n  /*     FT_ListNode is a handle to a single list element.                 */\n  /*                                                                       */\n  typedef struct FT_ListNodeRec_*  FT_ListNode;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_List                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a list record (see @FT_ListRec).                       */\n  /*                                                                       */\n  typedef struct FT_ListRec_*  FT_List;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_ListNodeRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold a single list element.                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    prev :: The previous element in the list.  NULL if first.          */\n  /*                                                                       */\n  /*    next :: The next element in the list.  NULL if last.               */\n  /*                                                                       */\n  /*    data :: A typeless pointer to the listed object.                   */\n  /*                                                                       */\n  typedef struct  FT_ListNodeRec_\n  {\n    FT_ListNode  prev;\n    FT_ListNode  next;\n    void*        data;\n\n  } FT_ListNodeRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_ListRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold a simple doubly-linked list.  These are   */\n  /*    used in many parts of FreeType.                                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    head :: The head (first element) of doubly-linked list.            */\n  /*                                                                       */\n  /*    tail :: The tail (last element) of doubly-linked list.             */\n  /*                                                                       */\n  typedef struct  FT_ListRec_\n  {\n    FT_ListNode  head;\n    FT_ListNode  tail;\n\n  } FT_ListRec;\n\n\n  /* */\n\n#define FT_IS_EMPTY( list )  ( (list).head == 0 )\n#define FT_BOOL( x )  ( (FT_Bool)( x ) )\n\n  /* concatenate C tokens */\n#define FT_ERR_XCAT( x, y )  x ## y\n#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )\n\n  /* see `ftmoderr.h' for descriptions of the following macros */\n\n#define FT_ERR( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )\n\n#define FT_ERROR_BASE( x )    ( (x) & 0xFF )\n#define FT_ERROR_MODULE( x )  ( (x) & 0xFF00U )\n\n#define FT_ERR_EQ( x, e )                                        \\\n          ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )\n#define FT_ERR_NEQ( x, e )                                       \\\n          ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )\n\n\nFT_END_HEADER\n\n#endif /* __FTTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftwinfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftwinfnt.h                                                             */\n/*                                                                         */\n/*    FreeType API for accessing Windows fnt-specific data.                */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2008 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTWINFNT_H__\n#define __FTWINFNT_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    winfnt_fonts                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Window FNT Files                                                   */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Windows FNT specific API.                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the declaration of Windows FNT specific      */\n  /*    functions.                                                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************\n   *\n   * @enum:\n   *   FT_WinFNT_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `charset' byte in\n   *   @FT_WinFNT_HeaderRec.  Exact mapping tables for the various cpXXXX\n   *   encodings (except for cp1361) can be found at ftp://ftp.unicode.org\n   *   in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory.  cp1361 is\n   *   roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.\n   *\n   * @values:\n   *   FT_WinFNT_ID_DEFAULT ::\n   *     This is used for font enumeration and font creation as a\n   *     `don't care' value.  Valid font files don't contain this value.\n   *     When querying for information about the character set of the font\n   *     that is currently selected into a specified device context, this\n   *     return value (of the related Windows API) simply denotes failure.\n   *\n   *   FT_WinFNT_ID_SYMBOL ::\n   *     There is no known mapping table available.\n   *\n   *   FT_WinFNT_ID_MAC ::\n   *     Mac Roman encoding.\n   *\n   *   FT_WinFNT_ID_OEM ::\n   *     From Michael Pöttgen <michael@poettgen.de>:\n   *\n   *       The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM\n   *       is used for the charset of vector fonts, like `modern.fon',\n   *       `roman.fon', and `script.fon' on Windows.\n   *\n   *       The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value\n   *       specifies a character set that is operating-system dependent.\n   *\n   *       The `IFIMETRICS' documentation from the `Windows Driver\n   *       Development Kit' says: This font supports an OEM-specific\n   *       character set.  The OEM character set is system dependent.\n   *\n   *       In general OEM, as opposed to ANSI (i.e., cp1252), denotes the\n   *       second default codepage that most international versions of\n   *       Windows have.  It is one of the OEM codepages from\n   *\n   *         http://www.microsoft.com/globaldev/reference/cphome.mspx,\n   *\n   *       and is used for the `DOS boxes', to support legacy applications.\n   *       A German Windows version for example usually uses ANSI codepage\n   *       1252 and OEM codepage 850.\n   *\n   *   FT_WinFNT_ID_CP874 ::\n   *     A superset of Thai TIS 620 and ISO 8859-11.\n   *\n   *   FT_WinFNT_ID_CP932 ::\n   *     A superset of Japanese Shift-JIS (with minor deviations).\n   *\n   *   FT_WinFNT_ID_CP936 ::\n   *     A superset of simplified Chinese GB 2312-1980 (with different\n   *     ordering and minor deviations).\n   *\n   *   FT_WinFNT_ID_CP949 ::\n   *     A superset of Korean Hangul KS~C 5601-1987 (with different\n   *     ordering and minor deviations).\n   *\n   *   FT_WinFNT_ID_CP950 ::\n   *     A superset of traditional Chinese Big~5 ETen (with different\n   *     ordering and minor deviations).\n   *\n   *   FT_WinFNT_ID_CP1250 ::\n   *     A superset of East European ISO 8859-2 (with slightly different\n   *     ordering).\n   *\n   *   FT_WinFNT_ID_CP1251 ::\n   *     A superset of Russian ISO 8859-5 (with different ordering).\n   *\n   *   FT_WinFNT_ID_CP1252 ::\n   *     ANSI encoding.  A superset of ISO 8859-1.\n   *\n   *   FT_WinFNT_ID_CP1253 ::\n   *     A superset of Greek ISO 8859-7 (with minor modifications).\n   *\n   *   FT_WinFNT_ID_CP1254 ::\n   *     A superset of Turkish ISO 8859-9.\n   *\n   *   FT_WinFNT_ID_CP1255 ::\n   *     A superset of Hebrew ISO 8859-8 (with some modifications).\n   *\n   *   FT_WinFNT_ID_CP1256 ::\n   *     A superset of Arabic ISO 8859-6 (with different ordering).\n   *\n   *   FT_WinFNT_ID_CP1257 ::\n   *     A superset of Baltic ISO 8859-13 (with some deviations).\n   *\n   *   FT_WinFNT_ID_CP1258 ::\n   *     For Vietnamese.  This encoding doesn't cover all necessary\n   *     characters.\n   *\n   *   FT_WinFNT_ID_CP1361 ::\n   *     Korean (Johab).\n   */\n\n#define FT_WinFNT_ID_CP1252    0\n#define FT_WinFNT_ID_DEFAULT   1\n#define FT_WinFNT_ID_SYMBOL    2\n#define FT_WinFNT_ID_MAC      77\n#define FT_WinFNT_ID_CP932   128\n#define FT_WinFNT_ID_CP949   129\n#define FT_WinFNT_ID_CP1361  130\n#define FT_WinFNT_ID_CP936   134\n#define FT_WinFNT_ID_CP950   136\n#define FT_WinFNT_ID_CP1253  161\n#define FT_WinFNT_ID_CP1254  162\n#define FT_WinFNT_ID_CP1258  163\n#define FT_WinFNT_ID_CP1255  177\n#define FT_WinFNT_ID_CP1256  178\n#define FT_WinFNT_ID_CP1257  186\n#define FT_WinFNT_ID_CP1251  204\n#define FT_WinFNT_ID_CP874   222\n#define FT_WinFNT_ID_CP1250  238\n#define FT_WinFNT_ID_OEM     255\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_WinFNT_HeaderRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Windows FNT Header info.                                           */\n  /*                                                                       */\n  typedef struct  FT_WinFNT_HeaderRec_\n  {\n    FT_UShort  version;\n    FT_ULong   file_size;\n    FT_Byte    copyright[60];\n    FT_UShort  file_type;\n    FT_UShort  nominal_point_size;\n    FT_UShort  vertical_resolution;\n    FT_UShort  horizontal_resolution;\n    FT_UShort  ascent;\n    FT_UShort  internal_leading;\n    FT_UShort  external_leading;\n    FT_Byte    italic;\n    FT_Byte    underline;\n    FT_Byte    strike_out;\n    FT_UShort  weight;\n    FT_Byte    charset;\n    FT_UShort  pixel_width;\n    FT_UShort  pixel_height;\n    FT_Byte    pitch_and_family;\n    FT_UShort  avg_width;\n    FT_UShort  max_width;\n    FT_Byte    first_char;\n    FT_Byte    last_char;\n    FT_Byte    default_char;\n    FT_Byte    break_char;\n    FT_UShort  bytes_per_row;\n    FT_ULong   device_offset;\n    FT_ULong   face_name_offset;\n    FT_ULong   bits_pointer;\n    FT_ULong   bits_offset;\n    FT_Byte    reserved;\n    FT_ULong   flags;\n    FT_UShort  A_space;\n    FT_UShort  B_space;\n    FT_UShort  C_space;\n    FT_UShort  color_table_offset;\n    FT_ULong   reserved1[4];\n\n  } FT_WinFNT_HeaderRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_WinFNT_Header                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an @FT_WinFNT_HeaderRec structure.                     */\n  /*                                                                       */\n  typedef struct FT_WinFNT_HeaderRec_*  FT_WinFNT_Header;\n\n\n  /**********************************************************************\n   *\n   * @function:\n   *    FT_Get_WinFNT_Header\n   *\n   * @description:\n   *    Retrieve a Windows FNT font info header.\n   *\n   * @input:\n   *    face    :: A handle to the input face.\n   *\n   * @output:\n   *    aheader :: The WinFNT header.\n   *\n   * @return:\n   *   FreeType error code.  0~means success.\n   *\n   * @note:\n   *   This function only works with Windows FNT faces, returning an error\n   *   otherwise.\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_WinFNT_Header( FT_Face               face,\n                        FT_WinFNT_HeaderRec  *aheader );\n\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTWINFNT_H__ */\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ftxf86.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftxf86.h                                                               */\n/*                                                                         */\n/*    Support functions for X11.                                           */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004, 2006, 2007 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTXF86_H__\n#define __FTXF86_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*   font_formats                                                        */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*   Font Formats                                                        */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*   Getting the font format.                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   The single function in this section can be used to get the font     */\n  /*   format.  Note that this information is not needed normally;         */\n  /*   however, there are special cases (like in PDF devices) where it is  */\n  /*   important to differentiate, in spite of FreeType's uniform API.     */\n  /*                                                                       */\n  /*   This function is in the X11/xf86 namespace for historical reasons   */\n  /*   and in no way depends on that windowing system.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*   FT_Get_X11_Font_Format                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   Return a string describing the format of a given face, using values */\n  /*   which can be used as an X11 FONT_PROPERTY.  Possible values are     */\n  /*   `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */\n  /*   `PFR', and `Windows~FNT'.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*   face ::                                                             */\n  /*     Input face handle.                                                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   Font format string.  NULL in case of error.                         */\n  /*                                                                       */\n  FT_EXPORT( const char* )\n  FT_Get_X11_Font_Format( FT_Face  face );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTXF86_H__ */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/autohint.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  autohint.h                                                             */\n/*                                                                         */\n/*    High-level `autohint' module-specific interface (specification).     */\n/*                                                                         */\n/*  Copyright 1996-2002, 2007, 2009, 2012 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The auto-hinter is used to load and automatically hint glyphs if a    */\n  /* format-specific hinter isn't available.                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __AUTOHINT_H__\n#define __AUTOHINT_H__\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A small technical note regarding automatic hinting in order to        */\n  /* clarify this module interface.                                        */\n  /*                                                                       */\n  /* An automatic hinter might compute two kinds of data for a given face: */\n  /*                                                                       */\n  /* - global hints: Usually some metrics that describe global properties  */\n  /*                 of the face.  It is computed by scanning more or less */\n  /*                 aggressively the glyphs in the face, and thus can be  */\n  /*                 very slow to compute (even if the size of global      */\n  /*                 hints is really small).                               */\n  /*                                                                       */\n  /* - glyph hints:  These describe some important features of the glyph   */\n  /*                 outline, as well as how to align them.  They are      */\n  /*                 generally much faster to compute than global hints.   */\n  /*                                                                       */\n  /* The current FreeType auto-hinter does a pretty good job while         */\n  /* performing fast computations for both global and glyph hints.         */\n  /* However, we might be interested in introducing more complex and       */\n  /* powerful algorithms in the future, like the one described in the John */\n  /* D. Hobby paper, which unfortunately requires a lot more horsepower.   */\n  /*                                                                       */\n  /* Because a sufficiently sophisticated font management system would     */\n  /* typically implement an LRU cache of opened face objects to reduce     */\n  /* memory usage, it is a good idea to be able to avoid recomputing       */\n  /* global hints every time the same face is re-opened.                   */\n  /*                                                                       */\n  /* We thus provide the ability to cache global hints outside of the face */\n  /* object, in order to speed up font re-opening time.  Of course, this   */\n  /* feature is purely optional, so most client programs won't even notice */\n  /* it.                                                                   */\n  /*                                                                       */\n  /* I initially thought that it would be a good idea to cache the glyph   */\n  /* hints too.  However, my general idea now is that if you really need   */\n  /* to cache these too, you are simply in need of a new font format,      */\n  /* where all this information could be stored within the font file and   */\n  /* decoded on the fly.                                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct FT_AutoHinterRec_  *FT_AutoHinter;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlobalGetFunc                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Retrieve the global hints computed for a given face object.  The   */\n  /*    resulting data is dissociated from the face and will survive a     */\n  /*    call to FT_Done_Face().  It must be discarded through the API      */\n  /*    FT_AutoHinter_GlobalDoneFunc().                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hinter       :: A handle to the source auto-hinter.                */\n  /*                                                                       */\n  /*    face         :: A handle to the source face object.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    global_hints :: A typeless pointer to the global hints.            */\n  /*                                                                       */\n  /*    global_len   :: The size in bytes of the global hints.             */\n  /*                                                                       */\n  typedef void\n  (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter  hinter,\n                                  FT_Face        face,\n                                  void**         global_hints,\n                                  long*          global_len );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlobalDoneFunc                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discard the global hints retrieved through                         */\n  /*    FT_AutoHinter_GlobalGetFunc().  This is the only way these hints   */\n  /*    are freed from memory.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hinter :: A handle to the auto-hinter module.                      */\n  /*                                                                       */\n  /*    global :: A pointer to retrieved global hints to discard.          */\n  /*                                                                       */\n  typedef void\n  (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter  hinter,\n                                   void*          global );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlobalResetFunc                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to recompute the global metrics in a given   */\n  /*    font.  This is useful when global font data changes (e.g. Multiple */\n  /*    Masters fonts where blend coordinates change).                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    hinter :: A handle to the source auto-hinter.                      */\n  /*                                                                       */\n  /*    face   :: A handle to the face.                                    */\n  /*                                                                       */\n  typedef void\n  (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter  hinter,\n                                    FT_Face        face );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_AutoHinter_GlyphLoadFunc                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to load, scale, and automatically hint a     */\n  /*    glyph from a given face.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the face.                               */\n  /*                                                                       */\n  /*    glyph_index :: The glyph index.                                    */\n  /*                                                                       */\n  /*    load_flags  :: The load flags.                                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is capable of loading composite glyphs by hinting    */\n  /*    each sub-glyph independently (which improves quality).             */\n  /*                                                                       */\n  /*    It will call the font driver with @FT_Load_Glyph, with             */\n  /*    @FT_LOAD_NO_SCALE set.                                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter  hinter,\n                                  FT_GlyphSlot   slot,\n                                  FT_Size        size,\n                                  FT_UInt        glyph_index,\n                                  FT_Int32       load_flags );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_AutoHinter_InterfaceRec                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The auto-hinter module's interface.                                */\n  /*                                                                       */\n  typedef struct  FT_AutoHinter_InterfaceRec_\n  {\n    FT_AutoHinter_GlobalResetFunc  reset_face;\n    FT_AutoHinter_GlobalGetFunc    get_global_hints;\n    FT_AutoHinter_GlobalDoneFunc   done_global_hints;\n    FT_AutoHinter_GlyphLoadFunc    load_glyph;\n\n  } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_AUTOHINTER_INTERFACE(       \\\n          class_,                             \\\n          reset_face_,                        \\\n          get_global_hints_,                  \\\n          done_global_hints_,                 \\\n          load_glyph_ )                       \\\n  FT_CALLBACK_TABLE_DEF                       \\\n  const FT_AutoHinter_InterfaceRec  class_ =  \\\n  {                                           \\\n    reset_face_,                              \\\n    get_global_hints_,                        \\\n    done_global_hints_,                       \\\n    load_glyph_                               \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_AUTOHINTER_INTERFACE(                            \\\n          class_,                                                  \\\n          reset_face_,                                             \\\n          get_global_hints_,                                       \\\n          done_global_hints_,                                      \\\n          load_glyph_ )                                            \\\n  void                                                             \\\n  FT_Init_Class_ ## class_( FT_Library                   library,  \\\n                            FT_AutoHinter_InterfaceRec*  clazz )   \\\n  {                                                                \\\n    FT_UNUSED( library );                                          \\\n                                                                   \\\n    clazz->reset_face        = reset_face_;                        \\\n    clazz->get_global_hints  = get_global_hints_;                  \\\n    clazz->done_global_hints = done_global_hints_;                 \\\n    clazz->load_glyph        = load_glyph_;                        \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __AUTOHINT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftcalc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcalc.h                                                               */\n/*                                                                         */\n/*    Arithmetic computations (specification).                             */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2009, 2012-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCALC_H__\n#define __FTCALC_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_FixedSqrt                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the square root of a 16.16 fixed-point value.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    x :: The value to compute the root for.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `sqrt(x)'.                                           */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is not very fast.                                    */\n  /*                                                                       */\n  FT_BASE( FT_Int32 )\n  FT_SqrtFixed( FT_Int32  x );\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Sqrt32                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the square root of an Int32 integer (which will be        */\n  /*    handled as an unsigned long value).                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    x :: The value to compute the root for.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `sqrt(x)'.                                           */\n  /*                                                                       */\n  FT_EXPORT( FT_Int32 )\n  FT_Sqrt32( FT_Int32  x );\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FT_MulDiv() and FT_MulFix() are declared in freetype.h.               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_MulDiv_No_Round                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A very simple function used to perform the computation `(a*b)/c'   */\n  /*    (without rounding) with maximum accuracy (it uses a 64-bit         */\n  /*    intermediate integer whenever necessary).                          */\n  /*                                                                       */\n  /*    This function isn't necessarily as fast as some processor specific */\n  /*    operations, but is at least completely portable.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    a :: The first multiplier.                                         */\n  /*    b :: The second multiplier.                                        */\n  /*    c :: The divisor.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The result of `(a*b)/c'.  This function never traps when trying to */\n  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */\n  /*    on the signs of `a' and `b'.                                       */\n  /*                                                                       */\n  FT_BASE( FT_Long )\n  FT_MulDiv_No_Round( FT_Long  a,\n                      FT_Long  b,\n                      FT_Long  c );\n\n\n  /*\n   *  A variant of FT_Matrix_Multiply which scales its result afterwards.\n   *  The idea is that both `a' and `b' are scaled by factors of 10 so that\n   *  the values are as precise as possible to get a correct result during\n   *  the 64bit multiplication.  Let `sa' and `sb' be the scaling factors of\n   *  `a' and `b', respectively, then the scaling factor of the result is\n   *  `sa*sb'.\n   */\n  FT_BASE( void )\n  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,\n                             FT_Matrix        *b,\n                             FT_Long           scaling );\n\n\n  /*\n   *  A variant of FT_Vector_Transform.  See comments for\n   *  FT_Matrix_Multiply_Scaled.\n   */\n  FT_BASE( void )\n  FT_Vector_Transform_Scaled( FT_Vector*        vector,\n                              const FT_Matrix*  matrix,\n                              FT_Long           scaling );\n\n\n  /*\n   *  Return -1, 0, or +1, depending on the orientation of a given corner.\n   *  We use the Cartesian coordinate system, with positive vertical values\n   *  going upwards.  The function returns +1 if the corner turns to the\n   *  left, -1 to the right, and 0 for undecidable cases.\n   */\n  FT_BASE( FT_Int )\n  ft_corner_orientation( FT_Pos  in_x,\n                         FT_Pos  in_y,\n                         FT_Pos  out_x,\n                         FT_Pos  out_y );\n\n  /*\n   *  Return TRUE if a corner is flat or nearly flat.  This is equivalent to\n   *  saying that the angle difference between the `in' and `out' vectors is\n   *  very small.\n   */\n  FT_BASE( FT_Int )\n  ft_corner_is_flat( FT_Pos  in_x,\n                     FT_Pos  in_y,\n                     FT_Pos  out_x,\n                     FT_Pos  out_y );\n\n\n  /*\n   *  Return the most significant bit index.\n   */\n  FT_BASE( FT_Int )\n  FT_MSB( FT_UInt32  z );\n\n\n  /*\n   *  Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses\n   *  two fixed-point arguments instead.\n   */\n  FT_BASE( FT_Fixed )\n  FT_Hypot( FT_Fixed  x,\n            FT_Fixed  y );\n\n\n#define INT_TO_F26DOT6( x )    ( (FT_Long)(x) << 6  )\n#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) << 14 )\n#define INT_TO_FIXED( x )      ( (FT_Long)(x) << 16 )\n#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) << 2  )\n#define FLOAT_TO_FIXED( x )    ( (FT_Long)( x * 65536.0 ) )\n#define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )\n\n#define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \\\n                                        : ( -( ( 32 - (x) ) & -64 ) ) )\n\n\nFT_END_HEADER\n\n#endif /* __FTCALC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftdebug.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdebug.h                                                              */\n/*                                                                         */\n/*    Debugging and logging component (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2006-2009, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/*                                                                         */\n/*  IMPORTANT: A description of FreeType's debugging support can be        */\n/*             found in `docs/DEBUG.TXT'.  Read it if you need to use or   */\n/*             understand this code.                                       */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTDEBUG_H__\n#define __FTDEBUG_H__\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n#include FT_FREETYPE_H\n\n\nFT_BEGIN_HEADER\n\n\n  /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */\n  /* is already defined; this simplifies the following #ifdefs            */\n  /*                                                                      */\n#ifdef FT_DEBUG_LEVEL_TRACE\n#undef  FT_DEBUG_LEVEL_ERROR\n#define FT_DEBUG_LEVEL_ERROR\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the trace enums as well as the trace levels array when they    */\n  /* are needed.                                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#define FT_TRACE_DEF( x )  trace_ ## x ,\n\n  /* defining the enumeration */\n  typedef enum  FT_Trace_\n  {\n#include FT_INTERNAL_TRACE_H\n    trace_count\n\n  } FT_Trace;\n\n\n  /* defining the array of trace levels, provided by `src/base/ftdebug.c' */\n  extern int  ft_trace_levels[trace_count];\n\n#undef FT_TRACE_DEF\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the FT_TRACE macro                                             */\n  /*                                                                       */\n  /* IMPORTANT!                                                            */\n  /*                                                                       */\n  /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */\n  /* value before using any TRACE macro.                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#define FT_TRACE( level, varformat )                      \\\n          do                                              \\\n          {                                               \\\n            if ( ft_trace_levels[FT_COMPONENT] >= level ) \\\n              FT_Message varformat;                       \\\n          } while ( 0 )\n\n#else /* !FT_DEBUG_LEVEL_TRACE */\n\n#define FT_TRACE( level, varformat )  do { } while ( 0 )      /* nothing */\n\n#endif /* !FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Trace_Get_Count                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the number of available trace components.                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The number of trace components.  0 if FreeType 2 is not built with */\n  /*    FT_DEBUG_LEVEL_TRACE definition.                                   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function may be useful if you want to access elements of      */\n  /*    the internal `ft_trace_levels' array by an index.                  */\n  /*                                                                       */\n  FT_BASE( FT_Int )\n  FT_Trace_Get_Count( void );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Trace_Get_Name                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return the name of a trace component.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    The index of the trace component.                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The name of the trace component.  This is a statically allocated   */\n  /*    C string, so do not free it after use.  NULL if FreeType 2 is not  */\n  /*    built with FT_DEBUG_LEVEL_TRACE definition.                        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Use @FT_Trace_Get_Count to get the number of available trace       */\n  /*    components.                                                        */\n  /*                                                                       */\n  /*    This function may be useful if you want to control FreeType 2's    */\n  /*    debug level in your application.                                   */\n  /*                                                                       */\n  FT_BASE( const char * )\n  FT_Trace_Get_Name( FT_Int  idx );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* You need two opening and closing parentheses!                         */\n  /*                                                                       */\n  /* Example: FT_TRACE0(( \"Value is %i\", foo ))                            */\n  /*                                                                       */\n  /* Output of the FT_TRACEX macros is sent to stderr.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define FT_TRACE0( varformat )  FT_TRACE( 0, varformat )\n#define FT_TRACE1( varformat )  FT_TRACE( 1, varformat )\n#define FT_TRACE2( varformat )  FT_TRACE( 2, varformat )\n#define FT_TRACE3( varformat )  FT_TRACE( 3, varformat )\n#define FT_TRACE4( varformat )  FT_TRACE( 4, varformat )\n#define FT_TRACE5( varformat )  FT_TRACE( 5, varformat )\n#define FT_TRACE6( varformat )  FT_TRACE( 6, varformat )\n#define FT_TRACE7( varformat )  FT_TRACE( 7, varformat )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the FT_ERROR macro.                                            */\n  /*                                                                       */\n  /* Output of this macro is sent to stderr.                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n#define FT_ERROR( varformat )  FT_Message  varformat\n\n#else  /* !FT_DEBUG_LEVEL_ERROR */\n\n#define FT_ERROR( varformat )  do { } while ( 0 )      /* nothing */\n\n#endif /* !FT_DEBUG_LEVEL_ERROR */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the FT_ASSERT and FT_THROW macros.  The call to `FT_Throw'     */\n  /* makes it possible to easily set a breakpoint at this function.        */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n#define FT_ASSERT( condition )                                      \\\n          do                                                        \\\n          {                                                         \\\n            if ( !( condition ) )                                   \\\n              FT_Panic( \"assertion failed on line %d of file %s\\n\", \\\n                        __LINE__, __FILE__ );                       \\\n          } while ( 0 )\n\n#define FT_THROW( e )                                   \\\n          ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ),   \\\n                      __LINE__,                         \\\n                      __FILE__ )                      | \\\n            FT_ERR_CAT( FT_ERR_PREFIX, e )            )\n\n#else /* !FT_DEBUG_LEVEL_ERROR */\n\n#define FT_ASSERT( condition )  do { } while ( 0 )\n\n#define FT_THROW( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )\n\n#endif /* !FT_DEBUG_LEVEL_ERROR */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define `FT_Message' and `FT_Panic' when needed.                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n#include \"stdio.h\"  /* for vfprintf() */\n\n  /* print a message */\n  FT_BASE( void )\n  FT_Message( const char*  fmt,\n              ... );\n\n  /* print a message and exit */\n  FT_BASE( void )\n  FT_Panic( const char*  fmt,\n            ... );\n\n  /* report file name and line number of an error */\n  FT_BASE( int )\n  FT_Throw( FT_Error     error,\n            int          line,\n            const char*  file );\n\n#endif /* FT_DEBUG_LEVEL_ERROR */\n\n\n  FT_BASE( void )\n  ft_debug_init( void );\n\n\n#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */\n\n  /* We disable the warning `conditional expression is constant' here */\n  /* in order to compile cleanly with the maximum level of warnings.  */\n#pragma warning( disable : 4127 )\n\n#endif /* _MSC_VER */\n\n\nFT_END_HEADER\n\n#endif /* __FTDEBUG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftdriver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdriver.h                                                             */\n/*                                                                         */\n/*    FreeType font driver interface (specification).                      */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006, 2008, 2011-2012 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTDRIVER_H__\n#define __FTDRIVER_H__\n\n\n#include <ft2build.h>\n#include FT_MODULE_H\n\n\nFT_BEGIN_HEADER\n\n\n  typedef FT_Error\n  (*FT_Face_InitFunc)( FT_Stream      stream,\n                       FT_Face        face,\n                       FT_Int         typeface_index,\n                       FT_Int         num_params,\n                       FT_Parameter*  parameters );\n\n  typedef void\n  (*FT_Face_DoneFunc)( FT_Face  face );\n\n\n  typedef FT_Error\n  (*FT_Size_InitFunc)( FT_Size  size );\n\n  typedef void\n  (*FT_Size_DoneFunc)( FT_Size  size );\n\n\n  typedef FT_Error\n  (*FT_Slot_InitFunc)( FT_GlyphSlot  slot );\n\n  typedef void\n  (*FT_Slot_DoneFunc)( FT_GlyphSlot  slot );\n\n\n  typedef FT_Error\n  (*FT_Size_RequestFunc)( FT_Size          size,\n                          FT_Size_Request  req );\n\n  typedef FT_Error\n  (*FT_Size_SelectFunc)( FT_Size   size,\n                         FT_ULong  size_index );\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  typedef FT_Error\n  (*FT_Size_ResetPointsFunc)( FT_Size     size,\n                              FT_F26Dot6  char_width,\n                              FT_F26Dot6  char_height,\n                              FT_UInt     horz_resolution,\n                              FT_UInt     vert_resolution );\n\n  typedef FT_Error\n  (*FT_Size_ResetPixelsFunc)( FT_Size  size,\n                              FT_UInt  pixel_width,\n                              FT_UInt  pixel_height );\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n  typedef FT_Error\n  (*FT_Slot_LoadFunc)( FT_GlyphSlot  slot,\n                       FT_Size       size,\n                       FT_UInt       glyph_index,\n                       FT_Int32      load_flags );\n\n\n  typedef FT_UInt\n  (*FT_CharMap_CharIndexFunc)( FT_CharMap  charmap,\n                               FT_Long     charcode );\n\n  typedef FT_Long\n  (*FT_CharMap_CharNextFunc)( FT_CharMap  charmap,\n                              FT_Long     charcode );\n\n\n  typedef FT_Error\n  (*FT_Face_GetKerningFunc)( FT_Face     face,\n                             FT_UInt     left_glyph,\n                             FT_UInt     right_glyph,\n                             FT_Vector*  kerning );\n\n\n  typedef FT_Error\n  (*FT_Face_AttachFunc)( FT_Face    face,\n                         FT_Stream  stream );\n\n\n  typedef FT_Error\n  (*FT_Face_GetAdvancesFunc)( FT_Face    face,\n                              FT_UInt    first,\n                              FT_UInt    count,\n                              FT_Int32   flags,\n                              FT_Fixed*  advances );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Driver_ClassRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The font driver class.  This structure mostly contains pointers to */\n  /*    driver methods.                                                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root             :: The parent module.                             */\n  /*                                                                       */\n  /*    face_object_size :: The size of a face object in bytes.            */\n  /*                                                                       */\n  /*    size_object_size :: The size of a size object in bytes.            */\n  /*                                                                       */\n  /*    slot_object_size :: The size of a glyph object in bytes.           */\n  /*                                                                       */\n  /*    init_face        :: The format-specific face constructor.          */\n  /*                                                                       */\n  /*    done_face        :: The format-specific face destructor.           */\n  /*                                                                       */\n  /*    init_size        :: The format-specific size constructor.          */\n  /*                                                                       */\n  /*    done_size        :: The format-specific size destructor.           */\n  /*                                                                       */\n  /*    init_slot        :: The format-specific slot constructor.          */\n  /*                                                                       */\n  /*    done_slot        :: The format-specific slot destructor.           */\n  /*                                                                       */\n  /*                                                                       */\n  /*    load_glyph       :: A function handle to load a glyph to a slot.   */\n  /*                        This field is mandatory!                       */\n  /*                                                                       */\n  /*    get_kerning      :: A function handle to return the unscaled       */\n  /*                        kerning for a given pair of glyphs.  Can be    */\n  /*                        set to 0 if the format doesn't support         */\n  /*                        kerning.                                       */\n  /*                                                                       */\n  /*    attach_file      :: This function handle is used to read           */\n  /*                        additional data for a face from another        */\n  /*                        file/stream.  For example, this can be used to */\n  /*                        add data from AFM or PFM files on a Type 1     */\n  /*                        face, or a CIDMap on a CID-keyed face.         */\n  /*                                                                       */\n  /*    get_advances     :: A function handle used to return advance       */\n  /*                        widths of `count' glyphs (in font units),      */\n  /*                        starting at `first'.  The `vertical' flag must */\n  /*                        be set to get vertical advance heights.  The   */\n  /*                        `advances' buffer is caller-allocated.         */\n  /*                        The idea of this function is to be able to     */\n  /*                        perform device-independent text layout without */\n  /*                        loading a single glyph image.                  */\n  /*                                                                       */\n  /*    request_size     :: A handle to a function used to request the new */\n  /*                        character size.  Can be set to 0 if the        */\n  /*                        scaling done in the base layer suffices.       */\n  /*                                                                       */\n  /*    select_size      :: A handle to a function used to select a new    */\n  /*                        fixed size.  It is used only if                */\n  /*                        @FT_FACE_FLAG_FIXED_SIZES is set.  Can be set  */\n  /*                        to 0 if the scaling done in the base layer     */\n  /*                        suffices.                                      */\n  /* <Note>                                                                */\n  /*    Most function pointers, with the exception of `load_glyph', can be */\n  /*    set to 0 to indicate a default behaviour.                          */\n  /*                                                                       */\n  typedef struct  FT_Driver_ClassRec_\n  {\n    FT_Module_Class          root;\n\n    FT_Long                  face_object_size;\n    FT_Long                  size_object_size;\n    FT_Long                  slot_object_size;\n\n    FT_Face_InitFunc         init_face;\n    FT_Face_DoneFunc         done_face;\n\n    FT_Size_InitFunc         init_size;\n    FT_Size_DoneFunc         done_size;\n\n    FT_Slot_InitFunc         init_slot;\n    FT_Slot_DoneFunc         done_slot;\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n    FT_Size_ResetPointsFunc  set_char_sizes;\n    FT_Size_ResetPixelsFunc  set_pixel_sizes;\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    FT_Slot_LoadFunc         load_glyph;\n\n    FT_Face_GetKerningFunc   get_kerning;\n    FT_Face_AttachFunc       attach_file;\n    FT_Face_GetAdvancesFunc  get_advances;\n\n    /* since version 2.2 */\n    FT_Size_RequestFunc      request_size;\n    FT_Size_SelectFunc       select_size;\n\n  } FT_Driver_ClassRec, *FT_Driver_Class;\n\n\n  /*\n   *  The following functions are used as stubs for `set_char_sizes' and\n   *  `set_pixel_sizes'; the code uses `request_size' and `select_size'\n   *  functions instead.\n   *\n   *  Implementation is in `src/base/ftobjs.c'.\n   */\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  FT_BASE( FT_Error )\n  ft_stub_set_char_sizes( FT_Size     size,\n                          FT_F26Dot6  width,\n                          FT_F26Dot6  height,\n                          FT_UInt     horz_res,\n                          FT_UInt     vert_res );\n\n  FT_BASE( FT_Error )\n  ft_stub_set_pixel_sizes( FT_Size  size,\n                           FT_UInt  width,\n                           FT_UInt  height );\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DECLARE_DRIVER                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to create a forward declaration of an FT_Driver_ClassRec      */\n  /*    struct instance.                                                   */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_DRIVER                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Driver_ClassRec struct.       */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */\n  /*    called with a pointer where the allocated structure is returned.   */\n  /*    And when it is no longer needed a `destroy' function needs to be   */\n  /*    called to release that allocation.                                 */\n  /*                                                                       */\n  /*    `fcinit.c' (ft_create_default_module_classes) already contains a   */\n  /*    mechanism to call these functions for the default modules          */\n  /*    described in `ftmodule.h'.                                         */\n  /*                                                                       */\n  /*    Notice that the created `create' and `destroy' functions call      */\n  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */\n  /*    initialize any additional global data, like a module specific      */\n  /*    interface, and put them in the global pic container defined in     */\n  /*    `ftpic.h'.  If you don't need them just implement the functions as */\n  /*    empty to resolve the link error.  Also the `pic_init' and          */\n  /*    `pic_free' functions should be declared in `pic.h', to be referred */\n  /*    by driver definition calling `FT_DEFINE_DRIVER' in following.      */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro is     */\n  /*    used).                                                             */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n#define FT_DEFINE_DRIVERS_OLD_INTERNALS( a_, b_ ) \\\n          a_, b_,\n#else\n#define FT_DEFINE_DRIVERS_OLD_INTERNALS( a_, b_ )  /* empty */\n#endif\n\n#define FT_DECLARE_DRIVER( class_ )  \\\n  FT_CALLBACK_TABLE                   \\\n  const FT_Driver_ClassRec  class_;\n\n#define FT_DEFINE_DRIVER(                                    \\\n          class_,                                            \\\n          flags_,                                            \\\n          size_,                                             \\\n          name_,                                             \\\n          version_,                                          \\\n          requires_,                                         \\\n          interface_,                                        \\\n          init_,                                             \\\n          done_,                                             \\\n          get_interface_,                                    \\\n          face_object_size_,                                 \\\n          size_object_size_,                                 \\\n          slot_object_size_,                                 \\\n          init_face_,                                        \\\n          done_face_,                                        \\\n          init_size_,                                        \\\n          done_size_,                                        \\\n          init_slot_,                                        \\\n          done_slot_,                                        \\\n          old_set_char_sizes_,                               \\\n          old_set_pixel_sizes_,                              \\\n          load_glyph_,                                       \\\n          get_kerning_,                                      \\\n          attach_file_,                                      \\\n          get_advances_,                                     \\\n          request_size_,                                     \\\n          select_size_ )                                     \\\n  FT_CALLBACK_TABLE_DEF                                      \\\n  const FT_Driver_ClassRec  class_ =                         \\\n  {                                                          \\\n    FT_DEFINE_ROOT_MODULE( flags_,                           \\\n                           size_,                            \\\n                           name_,                            \\\n                           version_,                         \\\n                           requires_,                        \\\n                           interface_,                       \\\n                           init_,                            \\\n                           done_,                            \\\n                           get_interface_ )                  \\\n                                                             \\\n    face_object_size_,                                       \\\n    size_object_size_,                                       \\\n    slot_object_size_,                                       \\\n                                                             \\\n    init_face_,                                              \\\n    done_face_,                                              \\\n                                                             \\\n    init_size_,                                              \\\n    done_size_,                                              \\\n                                                             \\\n    init_slot_,                                              \\\n    done_slot_,                                              \\\n                                                             \\\n    FT_DEFINE_DRIVERS_OLD_INTERNALS( old_set_char_sizes_,    \\\n                                     old_set_pixel_sizes_ )  \\\n                                                             \\\n    load_glyph_,                                             \\\n                                                             \\\n    get_kerning_,                                            \\\n    attach_file_,                                            \\\n    get_advances_,                                           \\\n                                                             \\\n    request_size_,                                           \\\n    select_size_                                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n#define FT_DEFINE_DRIVERS_OLD_INTERNALS( a_, b_ )  \\\n          clazz->set_char_sizes  = a_;             \\\n          clazz->set_pixel_sizes = b_;\n#else\n#define FT_DEFINE_DRIVERS_OLD_INTERNALS( a_, b_ )  /* empty */\n#endif\n\n#define FT_DECLARE_DRIVER( class_ )  FT_DECLARE_MODULE( class_ )\n\n#define FT_DEFINE_DRIVER(                                        \\\n          class_,                                                \\\n          flags_,                                                \\\n          size_,                                                 \\\n          name_,                                                 \\\n          version_,                                              \\\n          requires_,                                             \\\n          interface_,                                            \\\n          init_,                                                 \\\n          done_,                                                 \\\n          get_interface_,                                        \\\n          face_object_size_,                                     \\\n          size_object_size_,                                     \\\n          slot_object_size_,                                     \\\n          init_face_,                                            \\\n          done_face_,                                            \\\n          init_size_,                                            \\\n          done_size_,                                            \\\n          init_slot_,                                            \\\n          done_slot_,                                            \\\n          old_set_char_sizes_,                                   \\\n          old_set_pixel_sizes_,                                  \\\n          load_glyph_,                                           \\\n          get_kerning_,                                          \\\n          attach_file_,                                          \\\n          get_advances_,                                         \\\n          request_size_,                                         \\\n          select_size_ )                                         \\\n  void                                                           \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,        \\\n                               FT_Module_Class*  clazz )         \\\n  {                                                              \\\n    FT_Memory        memory = library->memory;                   \\\n    FT_Driver_Class  dclazz = (FT_Driver_Class)clazz;            \\\n                                                                 \\\n                                                                 \\\n    class_ ## _pic_free( library );                              \\\n    if ( dclazz )                                                \\\n      FT_FREE( dclazz );                                         \\\n  }                                                              \\\n                                                                 \\\n                                                                 \\\n  FT_Error                                                       \\\n  FT_Create_Class_ ## class_( FT_Library         library,        \\\n                              FT_Module_Class**  output_class )  \\\n  {                                                              \\\n    FT_Driver_Class  clazz  = NULL;                              \\\n    FT_Error         error;                                      \\\n    FT_Memory        memory = library->memory;                   \\\n                                                                 \\\n                                                                 \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \\\n      return error;                                              \\\n                                                                 \\\n    error = class_ ## _pic_init( library );                      \\\n    if ( error )                                                 \\\n    {                                                            \\\n      FT_FREE( clazz );                                          \\\n      return error;                                              \\\n    }                                                            \\\n                                                                 \\\n    FT_DEFINE_ROOT_MODULE( flags_,                               \\\n                           size_,                                \\\n                           name_,                                \\\n                           version_,                             \\\n                           requires_,                            \\\n                           interface_,                           \\\n                           init_,                                \\\n                           done_,                                \\\n                           get_interface_ )                      \\\n                                                                 \\\n    clazz->face_object_size = face_object_size_;                 \\\n    clazz->size_object_size = size_object_size_;                 \\\n    clazz->slot_object_size = slot_object_size_;                 \\\n                                                                 \\\n    clazz->init_face        = init_face_;                        \\\n    clazz->done_face        = done_face_;                        \\\n                                                                 \\\n    clazz->init_size        = init_size_;                        \\\n    clazz->done_size        = done_size_;                        \\\n                                                                 \\\n    clazz->init_slot        = init_slot_;                        \\\n    clazz->done_slot        = done_slot_;                        \\\n                                                                 \\\n    FT_DEFINE_DRIVERS_OLD_INTERNALS( old_set_char_sizes_,        \\\n                                     old_set_pixel_sizes_ )      \\\n                                                                 \\\n    clazz->load_glyph       = load_glyph_;                       \\\n                                                                 \\\n    clazz->get_kerning      = get_kerning_;                      \\\n    clazz->attach_file      = attach_file_;                      \\\n    clazz->get_advances     = get_advances_;                     \\\n                                                                 \\\n    clazz->request_size     = request_size_;                     \\\n    clazz->select_size      = select_size_;                      \\\n                                                                 \\\n    *output_class = (FT_Module_Class*)clazz;                     \\\n                                                                 \\\n    return FT_Err_Ok;                                            \\\n  }\n\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __FTDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftgloadr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgloadr.h                                                             */\n/*                                                                         */\n/*    The FreeType glyph loader (specification).                           */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2005, 2006 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGLOADR_H__\n#define __FTGLOADR_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_GlyphLoader                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The glyph loader is an internal object used to load several glyphs */\n  /*    together (for example, in the case of composites).                 */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The glyph loader implementation is not part of the high-level API, */\n  /*    hence the forward structure declaration.                           */\n  /*                                                                       */\n  typedef struct FT_GlyphLoaderRec_*  FT_GlyphLoader ;\n\n\n#if 0  /* moved to freetype.h in version 2.2 */\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1\n#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2\n#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4\n#define FT_SUBGLYPH_FLAG_SCALE                   8\n#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40\n#define FT_SUBGLYPH_FLAG_2X2                  0x80\n#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200\n#endif\n\n\n  typedef struct  FT_SubGlyphRec_\n  {\n    FT_Int     index;\n    FT_UShort  flags;\n    FT_Int     arg1;\n    FT_Int     arg2;\n    FT_Matrix  transform;\n\n  } FT_SubGlyphRec;\n\n\n  typedef struct  FT_GlyphLoadRec_\n  {\n    FT_Outline   outline;       /* outline                   */\n    FT_Vector*   extra_points;  /* extra points table        */\n    FT_Vector*   extra_points2; /* second extra points table */\n    FT_UInt      num_subglyphs; /* number of subglyphs       */\n    FT_SubGlyph  subglyphs;     /* subglyphs                 */\n\n  } FT_GlyphLoadRec, *FT_GlyphLoad;\n\n\n  typedef struct  FT_GlyphLoaderRec_\n  {\n    FT_Memory        memory;\n    FT_UInt          max_points;\n    FT_UInt          max_contours;\n    FT_UInt          max_subglyphs;\n    FT_Bool          use_extra;\n\n    FT_GlyphLoadRec  base;\n    FT_GlyphLoadRec  current;\n\n    void*            other;            /* for possible future extension? */\n\n  } FT_GlyphLoaderRec;\n\n\n  /* create new empty glyph loader */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_New( FT_Memory        memory,\n                      FT_GlyphLoader  *aloader );\n\n  /* add an extra points table to a glyph loader */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader );\n\n  /* destroy a glyph loader */\n  FT_BASE( void )\n  FT_GlyphLoader_Done( FT_GlyphLoader  loader );\n\n  /* reset a glyph loader (frees everything int it) */\n  FT_BASE( void )\n  FT_GlyphLoader_Reset( FT_GlyphLoader  loader );\n\n  /* rewind a glyph loader */\n  FT_BASE( void )\n  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader );\n\n  /* check that there is enough space to add `n_points' and `n_contours' */\n  /* to the glyph loader                                                 */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,\n                              FT_UInt         n_points,\n                              FT_UInt         n_contours );\n\n\n#define FT_GLYPHLOADER_CHECK_P( _loader, _count )                         \\\n   ( (_count) == 0 || ((_loader)->base.outline.n_points    +              \\\n                       (_loader)->current.outline.n_points +              \\\n                       (unsigned long)(_count)) <= (_loader)->max_points )\n\n#define FT_GLYPHLOADER_CHECK_C( _loader, _count )                          \\\n  ( (_count) == 0 || ((_loader)->base.outline.n_contours    +              \\\n                      (_loader)->current.outline.n_contours +              \\\n                      (unsigned long)(_count)) <= (_loader)->max_contours )\n\n#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours )      \\\n  ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points )   &&                  \\\n      FT_GLYPHLOADER_CHECK_C( _loader, _contours ) )                   \\\n    ? 0                                                                \\\n    : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) )\n\n\n  /* check that there is enough space to add `n_subs' sub-glyphs to */\n  /* a glyph loader                                                 */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,\n                                 FT_UInt         n_subs );\n\n  /* prepare a glyph loader, i.e. empty the current glyph */\n  FT_BASE( void )\n  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader );\n\n  /* add the current glyph to the base glyph */\n  FT_BASE( void )\n  FT_GlyphLoader_Add( FT_GlyphLoader  loader );\n\n  /* copy points from one glyph loader to another */\n  FT_BASE( FT_Error )\n  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,\n                             FT_GlyphLoader  source );\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTGLOADR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftmemory.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmemory.h                                                             */\n/*                                                                         */\n/*    The FreeType memory management macros (specification).               */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2010 by             */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTMEMORY_H__\n#define __FTMEMORY_H__\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n#include FT_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_SET_ERROR                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This macro is used to set an implicit `error' variable to a given  */\n  /*    expression's value (usually a function call), and convert it to a  */\n  /*    boolean which is set whenever the value is != 0.                   */\n  /*                                                                       */\n#undef  FT_SET_ERROR\n#define FT_SET_ERROR( expression ) \\\n          ( ( error = (expression) ) != 0 )\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                           M E M O R Y                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*\n   *  C++ refuses to handle statements like p = (void*)anything, with `p' a\n   *  typed pointer.  Since we don't have a `typeof' operator in standard\n   *  C++, we have to use a template to emulate it.\n   */\n\n#ifdef __cplusplus\n\n  extern \"C++\"\n  template <typename T> inline T*\n  cplusplus_typeof(        T*,\n                    void  *v )\n  {\n    return static_cast <T*> ( v );\n  }\n\n#define FT_ASSIGNP( p, val )  (p) = cplusplus_typeof( (p), (val) )\n\n#else\n\n#define FT_ASSIGNP( p, val )  (p) = (val)\n\n#endif\n\n\n\n#ifdef FT_DEBUG_MEMORY\n\n  FT_BASE( const char* )  _ft_debug_file;\n  FT_BASE( long )         _ft_debug_lineno;\n\n#define FT_DEBUG_INNER( exp )  ( _ft_debug_file   = __FILE__, \\\n                                 _ft_debug_lineno = __LINE__, \\\n                                 (exp) )\n\n#define FT_ASSIGNP_INNER( p, exp )  ( _ft_debug_file   = __FILE__, \\\n                                      _ft_debug_lineno = __LINE__, \\\n                                      FT_ASSIGNP( p, exp ) )\n\n#else /* !FT_DEBUG_MEMORY */\n\n#define FT_DEBUG_INNER( exp )       (exp)\n#define FT_ASSIGNP_INNER( p, exp )  FT_ASSIGNP( p, exp )\n\n#endif /* !FT_DEBUG_MEMORY */\n\n\n  /*\n   *  The allocation functions return a pointer, and the error code\n   *  is written to through the `p_error' parameter.  See below for\n   *  for documentation.\n   */\n\n  FT_BASE( FT_Pointer )\n  ft_mem_alloc( FT_Memory  memory,\n                FT_Long    size,\n                FT_Error  *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_qalloc( FT_Memory  memory,\n                 FT_Long    size,\n                 FT_Error  *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_realloc( FT_Memory  memory,\n                  FT_Long    item_size,\n                  FT_Long    cur_count,\n                  FT_Long    new_count,\n                  void*      block,\n                  FT_Error  *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_qrealloc( FT_Memory  memory,\n                   FT_Long    item_size,\n                   FT_Long    cur_count,\n                   FT_Long    new_count,\n                   void*      block,\n                   FT_Error  *p_error );\n\n  FT_BASE( void )\n  ft_mem_free( FT_Memory    memory,\n               const void*  P );\n\n\n#define FT_MEM_ALLOC( ptr, size )                                         \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) )\n\n#define FT_MEM_FREE( ptr )                \\\n          FT_BEGIN_STMNT                  \\\n            ft_mem_free( memory, (ptr) ); \\\n            (ptr) = NULL;                 \\\n          FT_END_STMNT\n\n#define FT_MEM_NEW( ptr )                        \\\n          FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )\n\n#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, 1,        \\\n                                                 (cursz), (newsz), \\\n                                                 (ptr), &error ) )\n\n#define FT_MEM_QALLOC( ptr, size )                                         \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, (size), &error ) )\n\n#define FT_MEM_QNEW( ptr )                        \\\n          FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )\n\n#define FT_MEM_QREALLOC( ptr, cursz, newsz )                         \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, 1,        \\\n                                                  (cursz), (newsz), \\\n                                                  (ptr), &error ) )\n\n#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \\\n                                                  (cursz), (newsz),          \\\n                                                  (ptr), &error ) )\n\n#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                    \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (item_size), \\\n                                                 0, (count),          \\\n                                                 NULL, &error ) )\n\n#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )            \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (itmsz),    \\\n                                                 (oldcnt), (newcnt), \\\n                                                 (ptr), &error ) )\n\n#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                    \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (item_size), \\\n                                                  0, (count),          \\\n                                                  NULL, &error ) )\n\n#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (itmsz),    \\\n                                                  (oldcnt), (newcnt), \\\n                                                  (ptr), &error ) )\n\n\n#define FT_MEM_SET_ERROR( cond )  ( (cond), error != 0 )\n\n\n#define FT_MEM_SET( dest, byte, count )     ft_memset( dest, byte, count )\n\n#define FT_MEM_COPY( dest, source, count )  ft_memcpy( dest, source, count )\n\n#define FT_MEM_MOVE( dest, source, count )  ft_memmove( dest, source, count )\n\n\n#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )\n\n#define FT_ZERO( p )                FT_MEM_ZERO( p, sizeof ( *(p) ) )\n\n\n#define FT_ARRAY_ZERO( dest, count )                        \\\n          FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) )\n\n#define FT_ARRAY_COPY( dest, source, count )                        \\\n          FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) )\n\n#define FT_ARRAY_MOVE( dest, source, count )                        \\\n          FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) )\n\n\n  /*\n   *  Return the maximum number of addressable elements in an array.\n   *  We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid\n   *  any problems.\n   */\n#define FT_ARRAY_MAX( ptr )           ( FT_INT_MAX / sizeof ( *(ptr) ) )\n\n#define FT_ARRAY_CHECK( ptr, count )  ( (count) <= FT_ARRAY_MAX( ptr ) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following functions macros expect that their pointer argument is  */\n  /* _typed_ in order to automatically compute array element sizes.        */\n  /*                                                                       */\n\n#define FT_MEM_NEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \\\n                                                 0, (count),                \\\n                                                 NULL, &error ) )\n\n#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \\\n                                                 (cursz), (newsz),          \\\n                                                 (ptr), &error ) )\n\n#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \\\n                                                  0, (count),                \\\n                                                  NULL, &error ) )\n\n#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \\\n          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \\\n                                                  (cursz), (newsz),          \\\n                                                  (ptr), &error ) )\n\n\n#define FT_ALLOC( ptr, size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )\n\n#define FT_REALLOC( ptr, cursz, newsz )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )\n\n#define FT_ALLOC_MULT( ptr, count, item_size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )\n\n#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \\\n          FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt,      \\\n                                                 newcnt, itmsz ) )\n\n#define FT_QALLOC( ptr, size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )\n\n#define FT_QREALLOC( ptr, cursz, newsz )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )\n\n#define FT_QALLOC_MULT( ptr, count, item_size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )\n\n#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \\\n          FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt,      \\\n                                                  newcnt, itmsz ) )\n\n#define FT_FREE( ptr )  FT_MEM_FREE( ptr )\n\n#define FT_NEW( ptr )  FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )\n\n#define FT_NEW_ARRAY( ptr, count )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )\n\n#define FT_RENEW_ARRAY( ptr, curcnt, newcnt )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )\n\n#define FT_QNEW( ptr )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )\n\n#define FT_QNEW_ARRAY( ptr, count )                          \\\n          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )\n\n#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt )                          \\\n          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  FT_BASE( FT_Error )\n  FT_Alloc( FT_Memory  memory,\n            FT_Long    size,\n            void*     *P );\n\n  FT_BASE( FT_Error )\n  FT_QAlloc( FT_Memory  memory,\n             FT_Long    size,\n             void*     *p );\n\n  FT_BASE( FT_Error )\n  FT_Realloc( FT_Memory  memory,\n              FT_Long    current,\n              FT_Long    size,\n              void*     *P );\n\n  FT_BASE( FT_Error )\n  FT_QRealloc( FT_Memory  memory,\n               FT_Long    current,\n               FT_Long    size,\n               void*     *p );\n\n  FT_BASE( void )\n  FT_Free( FT_Memory  memory,\n           void*     *P );\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  FT_BASE( FT_Pointer )\n  ft_mem_strdup( FT_Memory    memory,\n                 const char*  str,\n                 FT_Error    *p_error );\n\n  FT_BASE( FT_Pointer )\n  ft_mem_dup( FT_Memory    memory,\n              const void*  address,\n              FT_ULong     size,\n              FT_Error    *p_error );\n\n#define FT_MEM_STRDUP( dst, str )                                            \\\n          (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )\n\n#define FT_STRDUP( dst, str )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )\n\n#define FT_MEM_DUP( dst, address, size )                                    \\\n          (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )\n\n#define FT_DUP( dst, address, size )                           \\\n          FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )\n\n\n  /* Return >= 1 if a truncation occurs.            */\n  /* Return 0 if the source string fits the buffer. */\n  /* This is *not* the same as strlcpy().           */\n  FT_BASE( FT_Int )\n  ft_mem_strcpyn( char*        dst,\n                  const char*  src,\n                  FT_ULong     size );\n\n#define FT_STRCPYN( dst, src, size )                                         \\\n          ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __FTMEMORY_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftobjs.h                                                               */\n/*                                                                         */\n/*    The FreeType private base classes (specification).                   */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2010, 2012 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  This file contains the definition of all internal FreeType classes.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTOBJS_H__\n#define __FTOBJS_H__\n\n#include <ft2build.h>\n#include FT_RENDER_H\n#include FT_SIZES_H\n#include FT_LCD_FILTER_H\n#include FT_INTERNAL_MEMORY_H\n#include FT_INTERNAL_GLYPH_LOADER_H\n#include FT_INTERNAL_DRIVER_H\n#include FT_INTERNAL_AUTOHINT_H\n#include FT_INTERNAL_SERVICE_H\n#include FT_INTERNAL_PIC_H\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n#include FT_INCREMENTAL_H\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Some generic definitions.                                             */\n  /*                                                                       */\n#ifndef TRUE\n#define TRUE  1\n#endif\n\n#ifndef FALSE\n#define FALSE  0\n#endif\n\n#ifndef NULL\n#define NULL  (void*)0\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The min and max functions missing in C.  As usual, be careful not to  */\n  /* write things like FT_MIN( a++, b++ ) to avoid side effects.           */\n  /*                                                                       */\n#define FT_MIN( a, b )  ( (a) < (b) ? (a) : (b) )\n#define FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )\n\n#define FT_ABS( a )     ( (a) < 0 ? -(a) : (a) )\n\n\n#define FT_PAD_FLOOR( x, n )  ( (x) & ~((n)-1) )\n#define FT_PAD_ROUND( x, n )  FT_PAD_FLOOR( (x) + ((n)/2), n )\n#define FT_PAD_CEIL( x, n )   FT_PAD_FLOOR( (x) + ((n)-1), n )\n\n#define FT_PIX_FLOOR( x )     ( (x) & ~63 )\n#define FT_PIX_ROUND( x )     FT_PIX_FLOOR( (x) + 32 )\n#define FT_PIX_CEIL( x )      FT_PIX_FLOOR( (x) + 63 )\n\n\n  /*\n   *  Return the highest power of 2 that is <= value; this correspond to\n   *  the highest bit in a given 32-bit value.\n   */\n  FT_BASE( FT_UInt32 )\n  ft_highpow2( FT_UInt32  value );\n\n\n  /*\n   *  character classification functions -- since these are used to parse\n   *  font files, we must not use those in <ctypes.h> which are\n   *  locale-dependent\n   */\n#define  ft_isdigit( x )   ( ( (unsigned)(x) - '0' ) < 10U )\n\n#define  ft_isxdigit( x )  ( ( (unsigned)(x) - '0' ) < 10U || \\\n                             ( (unsigned)(x) - 'a' ) < 6U  || \\\n                             ( (unsigned)(x) - 'A' ) < 6U  )\n\n  /* the next two macros assume ASCII representation */\n#define  ft_isupper( x )  ( ( (unsigned)(x) - 'A' ) < 26U )\n#define  ft_islower( x )  ( ( (unsigned)(x) - 'a' ) < 26U )\n\n#define  ft_isalpha( x )  ( ft_isupper( x ) || ft_islower( x ) )\n#define  ft_isalnum( x )  ( ft_isdigit( x ) || ft_isalpha( x ) )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                       C H A R M A P S                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* handle to internal charmap object */\n  typedef struct FT_CMapRec_*              FT_CMap;\n\n  /* handle to charmap class structure */\n  typedef const struct FT_CMap_ClassRec_*  FT_CMap_Class;\n\n  /* internal charmap object structure */\n  typedef struct  FT_CMapRec_\n  {\n    FT_CharMapRec  charmap;\n    FT_CMap_Class  clazz;\n\n  } FT_CMapRec;\n\n  /* typecase any pointer to a charmap handle */\n#define FT_CMAP( x )              ((FT_CMap)( x ))\n\n  /* obvious macros */\n#define FT_CMAP_PLATFORM_ID( x )  FT_CMAP( x )->charmap.platform_id\n#define FT_CMAP_ENCODING_ID( x )  FT_CMAP( x )->charmap.encoding_id\n#define FT_CMAP_ENCODING( x )     FT_CMAP( x )->charmap.encoding\n#define FT_CMAP_FACE( x )         FT_CMAP( x )->charmap.face\n\n\n  /* class method definitions */\n  typedef FT_Error\n  (*FT_CMap_InitFunc)( FT_CMap     cmap,\n                       FT_Pointer  init_data );\n\n  typedef void\n  (*FT_CMap_DoneFunc)( FT_CMap  cmap );\n\n  typedef FT_UInt\n  (*FT_CMap_CharIndexFunc)( FT_CMap    cmap,\n                            FT_UInt32  char_code );\n\n  typedef FT_UInt\n  (*FT_CMap_CharNextFunc)( FT_CMap     cmap,\n                           FT_UInt32  *achar_code );\n\n  typedef FT_UInt\n  (*FT_CMap_CharVarIndexFunc)( FT_CMap    cmap,\n                               FT_CMap    unicode_cmap,\n                               FT_UInt32  char_code,\n                               FT_UInt32  variant_selector );\n\n  typedef FT_Bool\n  (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap    cmap,\n                                   FT_UInt32  char_code,\n                                   FT_UInt32  variant_selector );\n\n  typedef FT_UInt32 *\n  (*FT_CMap_VariantListFunc)( FT_CMap    cmap,\n                              FT_Memory  mem );\n\n  typedef FT_UInt32 *\n  (*FT_CMap_CharVariantListFunc)( FT_CMap    cmap,\n                                  FT_Memory  mem,\n                                  FT_UInt32  char_code );\n\n  typedef FT_UInt32 *\n  (*FT_CMap_VariantCharListFunc)( FT_CMap    cmap,\n                                  FT_Memory  mem,\n                                  FT_UInt32  variant_selector );\n\n\n  typedef struct  FT_CMap_ClassRec_\n  {\n    FT_ULong               size;\n    FT_CMap_InitFunc       init;\n    FT_CMap_DoneFunc       done;\n    FT_CMap_CharIndexFunc  char_index;\n    FT_CMap_CharNextFunc   char_next;\n\n    /* Subsequent entries are special ones for format 14 -- the variant */\n    /* selector subtable which behaves like no other                    */\n\n    FT_CMap_CharVarIndexFunc      char_var_index;\n    FT_CMap_CharVarIsDefaultFunc  char_var_default;\n    FT_CMap_VariantListFunc       variant_list;\n    FT_CMap_CharVariantListFunc   charvariant_list;\n    FT_CMap_VariantCharListFunc   variantchar_list;\n\n  } FT_CMap_ClassRec;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_CMAP_CLASS( class_ )              \\\n  FT_CALLBACK_TABLE const  FT_CMap_ClassRec class_;\n\n#define FT_DEFINE_CMAP_CLASS(       \\\n          class_,                   \\\n          size_,                    \\\n          init_,                    \\\n          done_,                    \\\n          char_index_,              \\\n          char_next_,               \\\n          char_var_index_,          \\\n          char_var_default_,        \\\n          variant_list_,            \\\n          charvariant_list_,        \\\n          variantchar_list_ )       \\\n  FT_CALLBACK_TABLE_DEF             \\\n  const FT_CMap_ClassRec  class_ =  \\\n  {                                 \\\n    size_,                          \\\n    init_,                          \\\n    done_,                          \\\n    char_index_,                    \\\n    char_next_,                     \\\n    char_var_index_,                \\\n    char_var_default_,              \\\n    variant_list_,                  \\\n    charvariant_list_,              \\\n    variantchar_list_               \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_CMAP_CLASS( class_ )                  \\\n  void                                                   \\\n  FT_Init_Class_ ## class_( FT_Library         library,  \\\n                            FT_CMap_ClassRec*  clazz );\n\n#define FT_DEFINE_CMAP_CLASS(                            \\\n          class_,                                        \\\n          size_,                                         \\\n          init_,                                         \\\n          done_,                                         \\\n          char_index_,                                   \\\n          char_next_,                                    \\\n          char_var_index_,                               \\\n          char_var_default_,                             \\\n          variant_list_,                                 \\\n          charvariant_list_,                             \\\n          variantchar_list_ )                            \\\n  void                                                   \\\n  FT_Init_Class_ ## class_( FT_Library         library,  \\\n                            FT_CMap_ClassRec*  clazz )   \\\n  {                                                      \\\n    FT_UNUSED( library );                                \\\n                                                         \\\n    clazz->size             = size_;                     \\\n    clazz->init             = init_;                     \\\n    clazz->done             = done_;                     \\\n    clazz->char_index       = char_index_;               \\\n    clazz->char_next        = char_next_;                \\\n    clazz->char_var_index   = char_var_index_;           \\\n    clazz->char_var_default = char_var_default_;         \\\n    clazz->variant_list     = variant_list_;             \\\n    clazz->charvariant_list = charvariant_list_;         \\\n    clazz->variantchar_list = variantchar_list_;         \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* create a new charmap and add it to charmap->face */\n  FT_BASE( FT_Error )\n  FT_CMap_New( FT_CMap_Class  clazz,\n               FT_Pointer     init_data,\n               FT_CharMap     charmap,\n               FT_CMap       *acmap );\n\n  /* destroy a charmap and remove it from face's list */\n  FT_BASE( void )\n  FT_CMap_Done( FT_CMap  cmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Face_InternalRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure contains the internal fields of each FT_Face        */\n  /*    object.  These fields may change between different releases of     */\n  /*    FreeType.                                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    max_points ::                                                      */\n  /*      The maximum number of points used to store the vectorial outline */\n  /*      of any glyph in this face.  If this value cannot be known in     */\n  /*      advance, or if the face isn't scalable, this should be set to 0. */\n  /*      Only relevant for scalable formats.                              */\n  /*                                                                       */\n  /*    max_contours ::                                                    */\n  /*      The maximum number of contours used to store the vectorial       */\n  /*      outline of any glyph in this face.  If this value cannot be      */\n  /*      known in advance, or if the face isn't scalable, this should be  */\n  /*      set to 0.  Only relevant for scalable formats.                   */\n  /*                                                                       */\n  /*    transform_matrix ::                                                */\n  /*      A 2x2 matrix of 16.16 coefficients used to transform glyph       */\n  /*      outlines after they are loaded from the font.  Only used by the  */\n  /*      convenience functions.                                           */\n  /*                                                                       */\n  /*    transform_delta ::                                                 */\n  /*      A translation vector used to transform glyph outlines after they */\n  /*      are loaded from the font.  Only used by the convenience          */\n  /*      functions.                                                       */\n  /*                                                                       */\n  /*    transform_flags ::                                                 */\n  /*      Some flags used to classify the transform.  Only used by the     */\n  /*      convenience functions.                                           */\n  /*                                                                       */\n  /*    services ::                                                        */\n  /*      A cache for frequently used services.  It should be only         */\n  /*      accessed with the macro `FT_FACE_LOOKUP_SERVICE'.                */\n  /*                                                                       */\n  /*    incremental_interface ::                                           */\n  /*      If non-null, the interface through which glyph data and metrics  */\n  /*      are loaded incrementally for faces that do not provide all of    */\n  /*      this data when first opened.  This field exists only if          */\n  /*      @FT_CONFIG_OPTION_INCREMENTAL is defined.                        */\n  /*                                                                       */\n  /*    ignore_unpatented_hinter ::                                        */\n  /*      This boolean flag instructs the glyph loader to ignore the       */\n  /*      native font hinter, if one is found.  This is exclusively used   */\n  /*      in the case when the unpatented hinter is compiled within the    */\n  /*      library.                                                         */\n  /*                                                                       */\n  /*    refcount ::                                                        */\n  /*      A counter initialized to~1 at the time an @FT_Face structure is  */\n  /*      created.  @FT_Reference_Face increments this counter, and        */\n  /*      @FT_Done_Face only destroys a face if the counter is~1,          */\n  /*      otherwise it simply decrements it.                               */\n  /*                                                                       */\n  typedef struct  FT_Face_InternalRec_\n  {\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    FT_UShort           reserved1;\n    FT_Short            reserved2;\n#endif\n    FT_Matrix           transform_matrix;\n    FT_Vector           transform_delta;\n    FT_Int              transform_flags;\n\n    FT_ServiceCacheRec  services;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_Incremental_InterfaceRec*  incremental_interface;\n#endif\n\n    FT_Bool             ignore_unpatented_hinter;\n    FT_UInt             refcount;\n\n  } FT_Face_InternalRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Slot_InternalRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure contains the internal fields of each FT_GlyphSlot   */\n  /*    object.  These fields may change between different releases of     */\n  /*    FreeType.                                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    loader            :: The glyph loader object used to load outlines */\n  /*                         into the glyph slot.                          */\n  /*                                                                       */\n  /*    flags             :: Possible values are zero or                   */\n  /*                         FT_GLYPH_OWN_BITMAP.  The latter indicates    */\n  /*                         that the FT_GlyphSlot structure owns the      */\n  /*                         bitmap buffer.                                */\n  /*                                                                       */\n  /*    glyph_transformed :: Boolean.  Set to TRUE when the loaded glyph   */\n  /*                         must be transformed through a specific        */\n  /*                         font transformation.  This is _not_ the same  */\n  /*                         as the face transform set through             */\n  /*                         FT_Set_Transform().                           */\n  /*                                                                       */\n  /*    glyph_matrix      :: The 2x2 matrix corresponding to the glyph     */\n  /*                         transformation, if necessary.                 */\n  /*                                                                       */\n  /*    glyph_delta       :: The 2d translation vector corresponding to    */\n  /*                         the glyph transformation, if necessary.       */\n  /*                                                                       */\n  /*    glyph_hints       :: Format-specific glyph hints management.       */\n  /*                                                                       */\n\n#define FT_GLYPH_OWN_BITMAP  0x1\n\n  typedef struct  FT_Slot_InternalRec_\n  {\n    FT_GlyphLoader  loader;\n    FT_UInt         flags;\n    FT_Bool         glyph_transformed;\n    FT_Matrix       glyph_matrix;\n    FT_Vector       glyph_delta;\n    void*           glyph_hints;\n\n  } FT_GlyphSlot_InternalRec;\n\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_Size_InternalRec                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure contains the internal fields of each FT_Size        */\n  /*    object.  Currently, it's empty.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n  typedef struct  FT_Size_InternalRec_\n  {\n    /* empty */\n\n  } FT_Size_InternalRec;\n\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                         M O D U L E S                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_ModuleRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A module object instance.                                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    clazz   :: A pointer to the module's class.                        */\n  /*                                                                       */\n  /*    library :: A handle to the parent library object.                  */\n  /*                                                                       */\n  /*    memory  :: A handle to the memory manager.                         */\n  /*                                                                       */\n  typedef struct  FT_ModuleRec_\n  {\n    FT_Module_Class*  clazz;\n    FT_Library        library;\n    FT_Memory         memory;\n\n  } FT_ModuleRec;\n\n\n  /* typecast an object to an FT_Module */\n#define FT_MODULE( x )          ((FT_Module)( x ))\n#define FT_MODULE_CLASS( x )    FT_MODULE( x )->clazz\n#define FT_MODULE_LIBRARY( x )  FT_MODULE( x )->library\n#define FT_MODULE_MEMORY( x )   FT_MODULE( x )->memory\n\n\n#define FT_MODULE_IS_DRIVER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                    FT_MODULE_FONT_DRIVER )\n\n#define FT_MODULE_IS_RENDERER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                      FT_MODULE_RENDERER )\n\n#define FT_MODULE_IS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                    FT_MODULE_HINTER )\n\n#define FT_MODULE_IS_STYLER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                    FT_MODULE_STYLER )\n\n#define FT_DRIVER_IS_SCALABLE( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                      FT_MODULE_DRIVER_SCALABLE )\n\n#define FT_DRIVER_USES_OUTLINES( x )  !( FT_MODULE_CLASS( x )->module_flags & \\\n                                         FT_MODULE_DRIVER_NO_OUTLINES )\n\n#define FT_DRIVER_HAS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \\\n                                     FT_MODULE_DRIVER_HAS_HINTER )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Module_Interface                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finds a module and returns its specific interface as a typeless    */\n  /*    pointer.                                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library     :: A handle to the library object.                     */\n  /*                                                                       */\n  /*    module_name :: The module's name (as an ASCII string).             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A module-specific interface if available, 0 otherwise.             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    You should better be familiar with FreeType internals to know      */\n  /*    which module to look for, and what its interface is :-)            */\n  /*                                                                       */\n  FT_BASE( const void* )\n  FT_Get_Module_Interface( FT_Library   library,\n                           const char*  mod_name );\n\n  FT_BASE( FT_Pointer )\n  ft_module_get_service( FT_Module    module,\n                         const char*  service_id );\n\n  /* */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****   F A C E,   S I Z E   &   G L Y P H   S L O T   O B J E C T S  ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* a few macros used to perform easy typecasts with minimal brain damage */\n\n#define FT_FACE( x )          ((FT_Face)(x))\n#define FT_SIZE( x )          ((FT_Size)(x))\n#define FT_SLOT( x )          ((FT_GlyphSlot)(x))\n\n#define FT_FACE_DRIVER( x )   FT_FACE( x )->driver\n#define FT_FACE_LIBRARY( x )  FT_FACE_DRIVER( x )->root.library\n#define FT_FACE_MEMORY( x )   FT_FACE( x )->memory\n#define FT_FACE_STREAM( x )   FT_FACE( x )->stream\n\n#define FT_SIZE_FACE( x )     FT_SIZE( x )->face\n#define FT_SLOT_FACE( x )     FT_SLOT( x )->face\n\n#define FT_FACE_SLOT( x )     FT_FACE( x )->glyph\n#define FT_FACE_SIZE( x )     FT_FACE( x )->size\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_GlyphSlot                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    It is sometimes useful to have more than one glyph slot for a      */\n  /*    given face object.  This function is used to create additional     */\n  /*    slots.  All of them are automatically discarded when the face is   */\n  /*    destroyed.                                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face  :: A handle to a parent face object.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    aslot :: A handle to a new glyph slot object.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_BASE( FT_Error )\n  FT_New_GlyphSlot( FT_Face        face,\n                    FT_GlyphSlot  *aslot );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_GlyphSlot                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroys a given glyph slot.  Remember however that all slots are  */\n  /*    automatically destroyed with its parent.  Using this function is   */\n  /*    not always mandatory.                                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot :: A handle to a target glyph slot.                           */\n  /*                                                                       */\n  FT_BASE( void )\n  FT_Done_GlyphSlot( FT_GlyphSlot  slot );\n\n /* */\n\n#define FT_REQUEST_WIDTH( req )                                            \\\n          ( (req)->horiResolution                                          \\\n              ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \\\n              : (req)->width )\n\n#define FT_REQUEST_HEIGHT( req )                                            \\\n          ( (req)->vertResolution                                           \\\n              ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \\\n              : (req)->height )\n\n\n  /* Set the metrics according to a bitmap strike. */\n  FT_BASE( void )\n  FT_Select_Metrics( FT_Face   face,\n                     FT_ULong  strike_index );\n\n\n  /* Set the metrics according to a size request. */\n  FT_BASE( void )\n  FT_Request_Metrics( FT_Face          face,\n                      FT_Size_Request  req );\n\n\n  /* Match a size request against `available_sizes'. */\n  FT_BASE( FT_Error )\n  FT_Match_Size( FT_Face          face,\n                 FT_Size_Request  req,\n                 FT_Bool          ignore_width,\n                 FT_ULong*        size_index );\n\n\n  /* Use the horizontal metrics to synthesize the vertical metrics. */\n  /* If `advance' is zero, it is also synthesized.                  */\n  FT_BASE( void )\n  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,\n                                  FT_Pos             advance );\n\n\n  /* Free the bitmap of a given glyphslot when needed (i.e., only when it */\n  /* was allocated with ft_glyphslot_alloc_bitmap).                       */\n  FT_BASE( void )\n  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot );\n\n\n  /* Allocate a new bitmap buffer in a glyph slot. */\n  FT_BASE( FT_Error )\n  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,\n                             FT_ULong      size );\n\n\n  /* Set the bitmap buffer in a glyph slot to a given pointer.  The buffer */\n  /* will not be freed by a later call to ft_glyphslot_free_bitmap.        */\n  FT_BASE( void )\n  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,\n                           FT_Byte*      buffer );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                        R E N D E R E R S                        ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#define FT_RENDERER( x )      ((FT_Renderer)( x ))\n#define FT_GLYPH( x )         ((FT_Glyph)( x ))\n#define FT_BITMAP_GLYPH( x )  ((FT_BitmapGlyph)( x ))\n#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))\n\n\n  typedef struct  FT_RendererRec_\n  {\n    FT_ModuleRec            root;\n    FT_Renderer_Class*      clazz;\n    FT_Glyph_Format         glyph_format;\n    FT_Glyph_Class          glyph_class;\n\n    FT_Raster               raster;\n    FT_Raster_Render_Func   raster_render;\n    FT_Renderer_RenderFunc  render;\n\n  } FT_RendererRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                    F O N T   D R I V E R S                      ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* typecast a module into a driver easily */\n#define FT_DRIVER( x )        ((FT_Driver)(x))\n\n  /* typecast a module as a driver, and get its driver class */\n#define FT_DRIVER_CLASS( x )  FT_DRIVER( x )->clazz\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_DriverRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The root font driver class.  A font driver is responsible for      */\n  /*    managing and loading font files of a given format.                 */\n  /*                                                                       */\n  /*  <Fields>                                                             */\n  /*     root         :: Contains the fields of the root module class.     */\n  /*                                                                       */\n  /*     clazz        :: A pointer to the font driver's class.  Note that  */\n  /*                     this is NOT root.clazz.  `class' wasn't used      */\n  /*                     as it is a reserved word in C++.                  */\n  /*                                                                       */\n  /*     faces_list   :: The list of faces currently opened by this        */\n  /*                     driver.                                           */\n  /*                                                                       */\n  /*     glyph_loader :: The glyph loader for all faces managed by this    */\n  /*                     driver.  This object isn't defined for unscalable */\n  /*                     formats.                                          */\n  /*                                                                       */\n  typedef struct  FT_DriverRec_\n  {\n    FT_ModuleRec     root;\n    FT_Driver_Class  clazz;\n    FT_ListRec       faces_list;\n    FT_GlyphLoader   glyph_loader;\n\n  } FT_DriverRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                       L I B R A R I E S                         ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* This hook is used by the TrueType debugger.  It must be set to an */\n  /* alternate truetype bytecode interpreter function.                 */\n#define FT_DEBUG_HOOK_TRUETYPE            0\n\n\n  /* Set this debug hook to a non-null pointer to force unpatented hinting */\n  /* for all faces when both TT_USE_BYTECODE_INTERPRETER and               */\n  /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined.  This is only used   */\n  /* during debugging.                                                     */\n#define FT_DEBUG_HOOK_UNPATENTED_HINTING  1\n\n\n  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,\n                                            FT_Render_Mode  render_mode,\n                                            FT_Library      library );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    FT_LibraryRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The FreeType library class.  This is the root of all FreeType      */\n  /*    data.  Use FT_New_Library() to create a library object, and        */\n  /*    FT_Done_Library() to discard it and all child objects.             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory           :: The library's memory object.  Manages memory   */\n  /*                        allocation.                                    */\n  /*                                                                       */\n  /*    version_major    :: The major version number of the library.       */\n  /*                                                                       */\n  /*    version_minor    :: The minor version number of the library.       */\n  /*                                                                       */\n  /*    version_patch    :: The current patch level of the library.        */\n  /*                                                                       */\n  /*    num_modules      :: The number of modules currently registered     */\n  /*                        within this library.  This is set to 0 for new */\n  /*                        libraries.  New modules are added through the  */\n  /*                        FT_Add_Module() API function.                  */\n  /*                                                                       */\n  /*    modules          :: A table used to store handles to the currently */\n  /*                        registered modules. Note that each font driver */\n  /*                        contains a list of its opened faces.           */\n  /*                                                                       */\n  /*    renderers        :: The list of renderers currently registered     */\n  /*                        within the library.                            */\n  /*                                                                       */\n  /*    cur_renderer     :: The current outline renderer.  This is a       */\n  /*                        shortcut used to avoid parsing the list on     */\n  /*                        each call to FT_Outline_Render().  It is a     */\n  /*                        handle to the current renderer for the         */\n  /*                        FT_GLYPH_FORMAT_OUTLINE format.                */\n  /*                                                                       */\n  /*    auto_hinter      :: XXX                                            */\n  /*                                                                       */\n  /*    raster_pool      :: The raster object's render pool.  This can     */\n  /*                        ideally be changed dynamically at run-time.    */\n  /*                                                                       */\n  /*    raster_pool_size :: The size of the render pool in bytes.          */\n  /*                                                                       */\n  /*    debug_hooks      :: XXX                                            */\n  /*                                                                       */\n  /*    lcd_filter       :: If subpixel rendering is activated, the        */\n  /*                        selected LCD filter mode.                      */\n  /*                                                                       */\n  /*    lcd_extra        :: If subpixel rendering is activated, the number */\n  /*                        of extra pixels needed for the LCD filter.     */\n  /*                                                                       */\n  /*    lcd_weights      :: If subpixel rendering is activated, the LCD    */\n  /*                        filter weights, if any.                        */\n  /*                                                                       */\n  /*    lcd_filter_func  :: If subpixel rendering is activated, the LCD    */\n  /*                        filtering callback function.                   */\n  /*                                                                       */\n  /*    pic_container    :: Contains global structs and tables, instead    */\n  /*                        of defining them globallly.                    */\n  /*                                                                       */\n  /*    refcount         :: A counter initialized to~1 at the time an      */\n  /*                        @FT_Library structure is created.              */\n  /*                        @FT_Reference_Library increments this counter, */\n  /*                        and @FT_Done_Library only destroys a library   */\n  /*                        if the counter is~1, otherwise it simply       */\n  /*                        decrements it.                                 */\n  /*                                                                       */\n  typedef struct  FT_LibraryRec_\n  {\n    FT_Memory          memory;           /* library's memory manager */\n\n    FT_Int             version_major;\n    FT_Int             version_minor;\n    FT_Int             version_patch;\n\n    FT_UInt            num_modules;\n    FT_Module          modules[FT_MAX_MODULES];  /* module objects  */\n\n    FT_ListRec         renderers;        /* list of renderers        */\n    FT_Renderer        cur_renderer;     /* current outline renderer */\n    FT_Module          auto_hinter;\n\n    FT_Byte*           raster_pool;      /* scan-line conversion */\n                                         /* render pool          */\n    FT_ULong           raster_pool_size; /* size of render pool in bytes */\n\n    FT_DebugHook_Func  debug_hooks[4];\n\n#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n    FT_LcdFilter             lcd_filter;\n    FT_Int                   lcd_extra;        /* number of extra pixels */\n    FT_Byte                  lcd_weights[7];   /* filter weights, if any */\n    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */\n#endif\n\n#ifdef FT_CONFIG_OPTION_PIC\n    FT_PIC_Container   pic_container;\n#endif\n\n    FT_UInt            refcount;\n\n  } FT_LibraryRec;\n\n\n  FT_BASE( FT_Renderer )\n  FT_Lookup_Renderer( FT_Library       library,\n                      FT_Glyph_Format  format,\n                      FT_ListNode*     node );\n\n  FT_BASE( FT_Error )\n  FT_Render_Glyph_Internal( FT_Library      library,\n                            FT_GlyphSlot    slot,\n                            FT_Render_Mode  render_mode );\n\n  typedef const char*\n  (*FT_Face_GetPostscriptNameFunc)( FT_Face  face );\n\n  typedef FT_Error\n  (*FT_Face_GetGlyphNameFunc)( FT_Face     face,\n                               FT_UInt     glyph_index,\n                               FT_Pointer  buffer,\n                               FT_UInt     buffer_max );\n\n  typedef FT_UInt\n  (*FT_Face_GetGlyphNameIndexFunc)( FT_Face     face,\n                                    FT_String*  glyph_name );\n\n\n#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Memory                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Creates a new memory object.                                       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to the new memory object.  0 in case of error.           */\n  /*                                                                       */\n  FT_BASE( FT_Memory )\n  FT_New_Memory( void );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Done_Memory                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Discards memory manager.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the memory manager.                          */\n  /*                                                                       */\n  FT_BASE( void )\n  FT_Done_Memory( FT_Memory  memory );\n\n#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */\n\n\n  /* Define default raster's interface.  The default raster is located in  */\n  /* `src/base/ftraster.c'.                                                */\n  /*                                                                       */\n  /* Client applications can register new rasters through the              */\n  /* FT_Set_Raster() API.                                                  */\n\n#ifndef FT_NO_DEFAULT_RASTER\n  FT_EXPORT_VAR( FT_Raster_Funcs )  ft_default_raster;\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                      P I C   S U P P O R T                      ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* PIC support macros for ftimage.h */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_OUTLINE_FUNCS                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Outline_Funcs struct.         */\n  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */\n  /*    be called with a pre-allocated structure to be filled.             */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_OUTLINE_FUNCS(           \\\n          class_,                          \\\n          move_to_,                        \\\n          line_to_,                        \\\n          conic_to_,                       \\\n          cubic_to_,                       \\\n          shift_,                          \\\n          delta_ )                         \\\n  static const  FT_Outline_Funcs class_ =  \\\n  {                                        \\\n    move_to_,                              \\\n    line_to_,                              \\\n    conic_to_,                             \\\n    cubic_to_,                             \\\n    shift_,                                \\\n    delta_                                 \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_OUTLINE_FUNCS(                     \\\n          class_,                                    \\\n          move_to_,                                  \\\n          line_to_,                                  \\\n          conic_to_,                                 \\\n          cubic_to_,                                 \\\n          shift_,                                    \\\n          delta_ )                                   \\\n  static FT_Error                                    \\\n  Init_Class_ ## class_( FT_Outline_Funcs*  clazz )  \\\n  {                                                  \\\n    clazz->move_to  = move_to_;                      \\\n    clazz->line_to  = line_to_;                      \\\n    clazz->conic_to = conic_to_;                     \\\n    clazz->cubic_to = cubic_to_;                     \\\n    clazz->shift    = shift_;                        \\\n    clazz->delta    = delta_;                        \\\n                                                     \\\n    return FT_Err_Ok;                                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_RASTER_FUNCS                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Raster_Funcs struct.          */\n  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */\n  /*    be called with a pre-allocated structure to be filled.             */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_RASTER_FUNCS(    \\\n          class_,                  \\\n          glyph_format_,           \\\n          raster_new_,             \\\n          raster_reset_,           \\\n          raster_set_mode_,        \\\n          raster_render_,          \\\n          raster_done_ )           \\\n  const FT_Raster_Funcs  class_ =  \\\n  {                                \\\n    glyph_format_,                 \\\n    raster_new_,                   \\\n    raster_reset_,                 \\\n    raster_set_mode_,              \\\n    raster_render_,                \\\n    raster_done_                   \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_RASTER_FUNCS(                        \\\n          class_,                                      \\\n          glyph_format_,                               \\\n          raster_new_,                                 \\\n          raster_reset_,                               \\\n          raster_set_mode_,                            \\\n          raster_render_,                              \\\n          raster_done_ )                               \\\n  void                                                 \\\n  FT_Init_Class_ ## class_( FT_Raster_Funcs*  clazz )  \\\n  {                                                    \\\n    clazz->glyph_format    = glyph_format_;            \\\n    clazz->raster_new      = raster_new_;              \\\n    clazz->raster_reset    = raster_reset_;            \\\n    clazz->raster_set_mode = raster_set_mode_;         \\\n    clazz->raster_render   = raster_render_;           \\\n    clazz->raster_done     = raster_done_;             \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* PIC support macros for ftrender.h */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_GLYPH                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Glyph_Class struct.           */\n  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */\n  /*    be called with a pre-allocated stcture to be filled.               */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_GLYPH(          \\\n          class_,                 \\\n          size_,                  \\\n          format_,                \\\n          init_,                  \\\n          done_,                  \\\n          copy_,                  \\\n          transform_,             \\\n          bbox_,                  \\\n          prepare_ )              \\\n  FT_CALLBACK_TABLE_DEF           \\\n  const FT_Glyph_Class  class_ =  \\\n  {                               \\\n    size_,                        \\\n    format_,                      \\\n    init_,                        \\\n    done_,                        \\\n    copy_,                        \\\n    transform_,                   \\\n    bbox_,                        \\\n    prepare_                      \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_GLYPH(                              \\\n          class_,                                     \\\n          size_,                                      \\\n          format_,                                    \\\n          init_,                                      \\\n          done_,                                      \\\n          copy_,                                      \\\n          transform_,                                 \\\n          bbox_,                                      \\\n          prepare_ )                                  \\\n  void                                                \\\n  FT_Init_Class_ ## class_( FT_Glyph_Class*  clazz )  \\\n  {                                                   \\\n    clazz->glyph_size      = size_;                   \\\n    clazz->glyph_format    = format_;                 \\\n    clazz->glyph_init      = init_;                   \\\n    clazz->glyph_done      = done_;                   \\\n    clazz->glyph_copy      = copy_;                   \\\n    clazz->glyph_transform = transform_;              \\\n    clazz->glyph_bbox      = bbox_;                   \\\n    clazz->glyph_prepare   = prepare_;                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DECLARE_RENDERER                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to create a forward declaration of a                          */\n  /*    FT_Renderer_Class struct instance.                                 */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_RENDERER                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of FT_Renderer_Class struct.        */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need  */\n  /*    to be called with a pointer where the allocated structure is       */\n  /*    returned.  And when it is no longer needed a `destroy' function    */\n  /*    needs to be called to release that allocation.                     */\n  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */\n  /*    a mechanism to call these functions for the default modules        */\n  /*    described in `ftmodule.h'.                                         */\n  /*                                                                       */\n  /*    Notice that the created `create' and `destroy' functions call      */\n  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */\n  /*    initialize any additional global data, like a module specific      */\n  /*    interface, and put them in the global pic container defined in     */\n  /*    `ftpic.h'.  If you don't need them just implement the functions as */\n  /*    empty to resolve the link error.  Also the `pic_init' and          */\n  /*    `pic_free' functions should be declared in `pic.h', to be referred */\n  /*    by the renderer definition calling `FT_DEFINE_RENDERER' in the     */\n  /*    following.                                                         */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_RENDERER( class_ )               \\\n  FT_EXPORT_VAR( const FT_Renderer_Class ) class_;\n\n#define FT_DEFINE_RENDERER(                  \\\n          class_,                            \\\n          flags_,                            \\\n          size_,                             \\\n          name_,                             \\\n          version_,                          \\\n          requires_,                         \\\n          interface_,                        \\\n          init_,                             \\\n          done_,                             \\\n          get_interface_,                    \\\n          glyph_format_,                     \\\n          render_glyph_,                     \\\n          transform_glyph_,                  \\\n          get_glyph_cbox_,                   \\\n          set_mode_,                         \\\n          raster_class_ )                    \\\n  FT_CALLBACK_TABLE_DEF                      \\\n  const FT_Renderer_Class  class_ =          \\\n  {                                          \\\n    FT_DEFINE_ROOT_MODULE( flags_,           \\\n                           size_,            \\\n                           name_,            \\\n                           version_,         \\\n                           requires_,        \\\n                           interface_,       \\\n                           init_,            \\\n                           done_,            \\\n                           get_interface_ )  \\\n    glyph_format_,                           \\\n                                             \\\n    render_glyph_,                           \\\n    transform_glyph_,                        \\\n    get_glyph_cbox_,                         \\\n    set_mode_,                               \\\n                                             \\\n    raster_class_                            \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_RENDERER( class_ )  FT_DECLARE_MODULE( class_ )\n\n#define FT_DEFINE_RENDERER(                                      \\\n          class_,                                                \\\n          flags_,                                                \\\n          size_,                                                 \\\n          name_,                                                 \\\n          version_,                                              \\\n          requires_,                                             \\\n          interface_,                                            \\\n          init_,                                                 \\\n          done_,                                                 \\\n          get_interface_,                                        \\\n          glyph_format_,                                         \\\n          render_glyph_,                                         \\\n          transform_glyph_,                                      \\\n          get_glyph_cbox_,                                       \\\n          set_mode_,                                             \\\n          raster_class_ )                                        \\\n  void                                                           \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,        \\\n                               FT_Module_Class*  clazz )         \\\n  {                                                              \\\n    FT_Renderer_Class*  rclazz = (FT_Renderer_Class*)clazz;      \\\n    FT_Memory           memory = library->memory;                \\\n                                                                 \\\n                                                                 \\\n    class_ ## _pic_free( library );                              \\\n    if ( rclazz )                                                \\\n      FT_FREE( rclazz );                                         \\\n  }                                                              \\\n                                                                 \\\n                                                                 \\\n  FT_Error                                                       \\\n  FT_Create_Class_ ## class_( FT_Library         library,        \\\n                              FT_Module_Class**  output_class )  \\\n  {                                                              \\\n    FT_Renderer_Class*  clazz = NULL;                            \\\n    FT_Error            error;                                   \\\n    FT_Memory           memory = library->memory;                \\\n                                                                 \\\n                                                                 \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \\\n      return error;                                              \\\n                                                                 \\\n    error = class_ ## _pic_init( library );                      \\\n    if ( error )                                                 \\\n    {                                                            \\\n      FT_FREE( clazz );                                          \\\n      return error;                                              \\\n    }                                                            \\\n                                                                 \\\n    FT_DEFINE_ROOT_MODULE( flags_,                               \\\n                           size_,                                \\\n                           name_,                                \\\n                           version_,                             \\\n                           requires_,                            \\\n                           interface_,                           \\\n                           init_,                                \\\n                           done_,                                \\\n                           get_interface_ )                      \\\n                                                                 \\\n    clazz->glyph_format    = glyph_format_;                      \\\n                                                                 \\\n    clazz->render_glyph    = render_glyph_;                      \\\n    clazz->transform_glyph = transform_glyph_;                   \\\n    clazz->get_glyph_cbox  = get_glyph_cbox_;                    \\\n    clazz->set_mode        = set_mode_;                          \\\n                                                                 \\\n    clazz->raster_class    = raster_class_;                      \\\n                                                                 \\\n    *output_class = (FT_Module_Class*)clazz;                     \\\n                                                                 \\\n    return FT_Err_Ok;                                            \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* PIC support macros for ftmodapi.h **/\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Creator                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to create (allocate) a new module class object.    */\n  /*    The object's members are initialized, but the module itself is     */\n  /*    not.                                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory       :: A handle to the memory manager.                    */\n  /*    output_class :: Initialized with the newly allocated class.        */\n  /*                                                                       */\n  typedef FT_Error\n  (*FT_Module_Creator)( FT_Memory          memory,\n                        FT_Module_Class**  output_class );\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    FT_Module_Destroyer                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to destroy (deallocate) a module class object.     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the memory manager.                          */\n  /*    clazz  :: Module class to destroy.                                 */\n  /*                                                                       */\n  typedef void\n  (*FT_Module_Destroyer)( FT_Memory         memory,\n                          FT_Module_Class*  clazz );\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DECLARE_MODULE                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to create a forward declaration of a                          */\n  /*    FT_Module_Class struct instance.                                   */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_MODULE                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of an FT_Module_Class struct.       */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to   */\n  /*    be called with a pointer where the allocated structure is          */\n  /*    returned.  And when it is no longer needed a `destroy' function    */\n  /*    needs to be called to release that allocation.                     */\n  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */\n  /*    a mechanism to call these functions for the default modules        */\n  /*    described in `ftmodule.h'.                                         */\n  /*                                                                       */\n  /*    Notice that the created `create' and `destroy' functions call      */\n  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */\n  /*    initialize any additional global data, like a module specific      */\n  /*    interface, and put them in the global pic container defined in     */\n  /*    `ftpic.h'.  If you don't need them just implement the functions as */\n  /*    empty to resolve the link error.  Also the `pic_init' and          */\n  /*    `pic_free' functions should be declared in `pic.h', to be referred */\n  /*    by the module definition calling `FT_DEFINE_MODULE' in the         */\n  /*    following.                                                         */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */\n  /*    allocated in the global scope (or the scope where the macro        */\n  /*    is used).                                                          */\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_ROOT_MODULE                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an instance of an FT_Module_Class struct inside */\n  /*    another struct that contains it or in a function that initializes  */\n  /*    that containing struct.                                            */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DECLARE_MODULE( class_ )  \\\n  FT_CALLBACK_TABLE                  \\\n  const FT_Module_Class  class_;\n\n#define FT_DEFINE_ROOT_MODULE(  \\\n          flags_,               \\\n          size_,                \\\n          name_,                \\\n          version_,             \\\n          requires_,            \\\n          interface_,           \\\n          init_,                \\\n          done_,                \\\n          get_interface_ )      \\\n  {                             \\\n    flags_,                     \\\n    size_,                      \\\n                                \\\n    name_,                      \\\n    version_,                   \\\n    requires_,                  \\\n                                \\\n    interface_,                 \\\n                                \\\n    init_,                      \\\n    done_,                      \\\n    get_interface_,             \\\n  },\n\n#define FT_DEFINE_MODULE(         \\\n          class_,                 \\\n          flags_,                 \\\n          size_,                  \\\n          name_,                  \\\n          version_,               \\\n          requires_,              \\\n          interface_,             \\\n          init_,                  \\\n          done_,                  \\\n          get_interface_ )        \\\n  FT_CALLBACK_TABLE_DEF           \\\n  const FT_Module_Class class_ =  \\\n  {                               \\\n    flags_,                       \\\n    size_,                        \\\n                                  \\\n    name_,                        \\\n    version_,                     \\\n    requires_,                    \\\n                                  \\\n    interface_,                   \\\n                                  \\\n    init_,                        \\\n    done_,                        \\\n    get_interface_,               \\\n  };\n\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DECLARE_MODULE( class_ )                               \\\n  FT_Error                                                        \\\n  FT_Create_Class_ ## class_( FT_Library         library,         \\\n                              FT_Module_Class**  output_class );  \\\n  void                                                            \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,         \\\n                               FT_Module_Class*  clazz );\n\n#define FT_DEFINE_ROOT_MODULE(                      \\\n          flags_,                                   \\\n          size_,                                    \\\n          name_,                                    \\\n          version_,                                 \\\n          requires_,                                \\\n          interface_,                               \\\n          init_,                                    \\\n          done_,                                    \\\n          get_interface_ )                          \\\n    clazz->root.module_flags     = flags_;          \\\n    clazz->root.module_size      = size_;           \\\n    clazz->root.module_name      = name_;           \\\n    clazz->root.module_version   = version_;        \\\n    clazz->root.module_requires  = requires_;       \\\n                                                    \\\n    clazz->root.module_interface = interface_;      \\\n                                                    \\\n    clazz->root.module_init      = init_;           \\\n    clazz->root.module_done      = done_;           \\\n    clazz->root.get_interface    = get_interface_;\n\n#define FT_DEFINE_MODULE(                                        \\\n          class_,                                                \\\n          flags_,                                                \\\n          size_,                                                 \\\n          name_,                                                 \\\n          version_,                                              \\\n          requires_,                                             \\\n          interface_,                                            \\\n          init_,                                                 \\\n          done_,                                                 \\\n          get_interface_ )                                       \\\n  void                                                           \\\n  FT_Destroy_Class_ ## class_( FT_Library        library,        \\\n                               FT_Module_Class*  clazz )         \\\n  {                                                              \\\n    FT_Memory memory = library->memory;                          \\\n                                                                 \\\n                                                                 \\\n    class_ ## _pic_free( library );                              \\\n    if ( clazz )                                                 \\\n      FT_FREE( clazz );                                          \\\n  }                                                              \\\n                                                                 \\\n                                                                 \\\n  FT_Error                                                       \\\n  FT_Create_Class_ ## class_( FT_Library         library,        \\\n                              FT_Module_Class**  output_class )  \\\n  {                                                              \\\n    FT_Memory         memory = library->memory;                  \\\n    FT_Module_Class*  clazz  = NULL;                             \\\n    FT_Error          error;                                     \\\n                                                                 \\\n                                                                 \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \\\n      return error;                                              \\\n    error = class_ ## _pic_init( library );                      \\\n    if ( error )                                                 \\\n    {                                                            \\\n      FT_FREE( clazz );                                          \\\n      return error;                                              \\\n    }                                                            \\\n                                                                 \\\n    clazz->module_flags     = flags_;                            \\\n    clazz->module_size      = size_;                             \\\n    clazz->module_name      = name_;                             \\\n    clazz->module_version   = version_;                          \\\n    clazz->module_requires  = requires_;                         \\\n                                                                 \\\n    clazz->module_interface = interface_;                        \\\n                                                                 \\\n    clazz->module_init      = init_;                             \\\n    clazz->module_done      = done_;                             \\\n    clazz->get_interface    = get_interface_;                    \\\n                                                                 \\\n    *output_class = clazz;                                       \\\n                                                                 \\\n    return FT_Err_Ok;                                            \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\nFT_END_HEADER\n\n#endif /* __FTOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpic.h                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services (declaration).       */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Modules that ordinarily have const global data that need address     */\n  /*  can instead define pointers here.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTPIC_H__\n#define __FTPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  typedef struct  FT_PIC_Container_\n  {\n    /* pic containers for base */\n    void*  base;\n\n    /* pic containers for modules */\n    void*  autofit;\n    void*  cff;\n    void*  pshinter;\n    void*  psnames;\n    void*  raster;\n    void*  sfnt;\n    void*  smooth;\n    void*  truetype;\n\n  } FT_PIC_Container;\n\n\n  /* Initialize the various function tables, structs, etc. */\n  /* stored in the container.                              */\n  FT_BASE( FT_Error )\n  ft_pic_container_init( FT_Library  library );\n\n\n  /* Destroy the contents of the container. */\n  FT_BASE( void )\n  ft_pic_container_destroy( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftrfork.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrfork.h                                                              */\n/*                                                                         */\n/*    Embedded resource forks accessor (specification).                    */\n/*                                                                         */\n/*  Copyright 2004, 2006, 2007, 2012 by                                    */\n/*  Masatake YAMATO and Redhat K.K.                                        */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/* Development of the code in this file is support of                      */\n/* Information-technology Promotion Agency, Japan.                         */\n/***************************************************************************/\n\n\n#ifndef __FTRFORK_H__\n#define __FTRFORK_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n\n\nFT_BEGIN_HEADER\n\n\n  /* Number of guessing rules supported in `FT_Raccess_Guess'.            */\n  /* Don't forget to increment the number if you add a new guessing rule. */\n#define FT_RACCESS_N_RULES  9\n\n\n  /* A structure to describe a reference in a resource by its resource ID */\n  /* and internal offset.  The `POST' resource expects to be concatenated */\n  /* by the order of resource IDs instead of its appearance in the file.  */\n\n  typedef struct  FT_RFork_Ref_\n  {\n    FT_UShort  res_id;\n    FT_ULong   offset;\n\n  } FT_RFork_Ref;\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n  typedef FT_Error\n  (*ft_raccess_guess_func)( FT_Library  library,\n                            FT_Stream   stream,\n                            char       *base_file_name,\n                            char      **result_file_name,\n                            FT_Long    *result_offset );\n\n  typedef enum  FT_RFork_Rule_ {\n    FT_RFork_Rule_invalid = -2,\n    FT_RFork_Rule_uknown, /* -1 */\n    FT_RFork_Rule_apple_double,\n    FT_RFork_Rule_apple_single,\n    FT_RFork_Rule_darwin_ufs_export,\n    FT_RFork_Rule_darwin_newvfs,\n    FT_RFork_Rule_darwin_hfsplus,\n    FT_RFork_Rule_vfat,\n    FT_RFork_Rule_linux_cap,\n    FT_RFork_Rule_linux_double,\n    FT_RFork_Rule_linux_netatalk\n  } FT_RFork_Rule;\n\n  /* For fast translation between rule index and rule type,\n   * the macros FT_RFORK_xxx should be kept consistent with\n   * the raccess_guess_funcs table\n   */\n  typedef struct ft_raccess_guess_rec_ {\n    ft_raccess_guess_func  func;\n    FT_RFork_Rule          type;\n  } ft_raccess_guess_rec;\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n  /* this array is a storage in non-PIC mode, so ; is needed in END */\n#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \\\n          const type name[] = {\n#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \\\n          { raccess_guess_ ## func_suffix,                           \\\n            FT_RFork_Rule_ ## type_suffix },\n#define CONST_FT_RFORK_RULE_ARRAY_END  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  /* this array is a function in PIC mode, so no ; is needed in END */\n#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \\\n          void                                         \\\n          FT_Init_ ## name( type*  storage )           \\\n          {                                            \\\n            type*  local = storage;                    \\\n                                                       \\\n                                                       \\\n            int  i = 0;\n#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \\\n          local[i].func = raccess_guess_ ## func_suffix;             \\\n          local[i].type = FT_RFork_Rule_ ## type_suffix;             \\\n          i++;\n#define CONST_FT_RFORK_RULE_ARRAY_END  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Raccess_Guess                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Guess a file name and offset where the actual resource fork is     */\n  /*    stored.  The macro FT_RACCESS_N_RULES holds the number of          */\n  /*    guessing rules;  the guessed result for the Nth rule is            */\n  /*    represented as a triplet: a new file name (new_names[N]), a file   */\n  /*    offset (offsets[N]), and an error code (errors[N]).                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library ::                                                         */\n  /*      A FreeType library instance.                                     */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      A file stream containing the resource fork.                      */\n  /*                                                                       */\n  /*    base_name ::                                                       */\n  /*      The (base) file name of the resource fork used for some          */\n  /*      guessing rules.                                                  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    new_names ::                                                       */\n  /*      An array of guessed file names in which the resource forks may   */\n  /*      exist.  If `new_names[N]' is NULL, the guessed file name is      */\n  /*      equal to `base_name'.                                            */\n  /*                                                                       */\n  /*    offsets ::                                                         */\n  /*      An array of guessed file offsets.  `offsets[N]' holds the file   */\n  /*      offset of the possible start of the resource fork in file        */\n  /*      `new_names[N]'.                                                  */\n  /*                                                                       */\n  /*    errors ::                                                          */\n  /*      An array of FreeType error codes.  `errors[N]' is the error      */\n  /*      code of Nth guessing rule function.  If `errors[N]' is not       */\n  /*      FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless.      */\n  /*                                                                       */\n  FT_BASE( void )\n  FT_Raccess_Guess( FT_Library  library,\n                    FT_Stream   stream,\n                    char*       base_name,\n                    char**      new_names,\n                    FT_Long*    offsets,\n                    FT_Error*   errors );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Raccess_Get_HeaderInfo                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the information from the header of resource fork.  The         */\n  /*    information includes the file offset where the resource map        */\n  /*    starts, and the file offset where the resource data starts.        */\n  /*    `FT_Raccess_Get_DataOffsets' requires these two data.              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library ::                                                         */\n  /*      A FreeType library instance.                                     */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      A file stream containing the resource fork.                      */\n  /*                                                                       */\n  /*    rfork_offset ::                                                    */\n  /*      The file offset where the resource fork starts.                  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    map_offset ::                                                      */\n  /*      The file offset where the resource map starts.                   */\n  /*                                                                       */\n  /*    rdata_pos ::                                                       */\n  /*      The file offset where the resource data starts.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  FT_Err_Ok means success.                     */\n  /*                                                                       */\n  FT_BASE( FT_Error )\n  FT_Raccess_Get_HeaderInfo( FT_Library  library,\n                             FT_Stream   stream,\n                             FT_Long     rfork_offset,\n                             FT_Long    *map_offset,\n                             FT_Long    *rdata_pos );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Raccess_Get_DataOffsets                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the data offsets for a tag in a resource fork.  Offsets are    */\n  /*    stored in an array because, in some cases, resources in a resource */\n  /*    fork have the same tag.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    library ::                                                         */\n  /*      A FreeType library instance.                                     */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      A file stream containing the resource fork.                      */\n  /*                                                                       */\n  /*    map_offset ::                                                      */\n  /*      The file offset where the resource map starts.                   */\n  /*                                                                       */\n  /*    rdata_pos ::                                                       */\n  /*      The file offset where the resource data starts.                  */\n  /*                                                                       */\n  /*    tag ::                                                             */\n  /*      The resource tag.                                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    offsets ::                                                         */\n  /*      The stream offsets for the resource data specified by `tag'.     */\n  /*      This array is allocated by the function, so you have to call     */\n  /*      @ft_mem_free after use.                                          */\n  /*                                                                       */\n  /*    count ::                                                           */\n  /*      The length of offsets array.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  FT_Err_Ok means success.                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Normally you should use `FT_Raccess_Get_HeaderInfo' to get the     */\n  /*    value for `map_offset' and `rdata_pos'.                            */\n  /*                                                                       */\n  FT_BASE( FT_Error )\n  FT_Raccess_Get_DataOffsets( FT_Library  library,\n                              FT_Stream   stream,\n                              FT_Long     map_offset,\n                              FT_Long     rdata_pos,\n                              FT_Long     tag,\n                              FT_Long   **offsets,\n                              FT_Long    *count );\n\n\nFT_END_HEADER\n\n#endif /* __FTRFORK_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftserv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftserv.h                                                               */\n/*                                                                         */\n/*    The FreeType services (specification only).                          */\n/*                                                                         */\n/*  Copyright 2003-2007, 2009, 2012, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Each module can export one or more `services'.  Each service is      */\n  /*  identified by a constant string and modeled by a pointer; the latter */\n  /*  generally corresponds to a structure containing function pointers.   */\n  /*                                                                       */\n  /*  Note that a service's data cannot be a mere function pointer because */\n  /*  in C it is possible that function pointers might be implemented      */\n  /*  differently than data pointers (e.g. 48 bits instead of 32).         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTSERV_H__\n#define __FTSERV_H__\n\n\nFT_BEGIN_HEADER\n\n#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */\n\n  /* we disable the warning `conditional expression is constant' here */\n  /* in order to compile cleanly with the maximum level of warnings   */\n#pragma warning( disable : 4127 )\n\n#endif /* _MSC_VER */\n\n  /*\n   * @macro:\n   *   FT_FACE_FIND_SERVICE\n   *\n   * @description:\n   *   This macro is used to look up a service from a face's driver module.\n   *\n   * @input:\n   *   face ::\n   *     The source face handle.\n   *\n   *   id ::\n   *     A string describing the service as defined in the service's\n   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to\n   *     `multi-masters').  It is automatically prefixed with\n   *     `FT_SERVICE_ID_'.\n   *\n   * @output:\n   *   ptr ::\n   *     A variable that receives the service pointer.  Will be NULL\n   *     if not found.\n   */\n#ifdef __cplusplus\n\n#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \\\n  FT_BEGIN_STMNT                                                            \\\n    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );             \\\n    FT_Pointer   _tmp_  = NULL;                                             \\\n    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                              \\\n                                                                            \\\n                                                                            \\\n    if ( module->clazz->get_interface )                                     \\\n      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \\\n    *_pptr_ = _tmp_;                                                        \\\n  FT_END_STMNT\n\n#else /* !C++ */\n\n#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \\\n  FT_BEGIN_STMNT                                                            \\\n    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );              \\\n    FT_Pointer  _tmp_  = NULL;                                              \\\n                                                                            \\\n    if ( module->clazz->get_interface )                                     \\\n      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \\\n    ptr = _tmp_;                                                            \\\n  FT_END_STMNT\n\n#endif /* !C++ */\n\n\n  /*\n   * @macro:\n   *   FT_FACE_FIND_GLOBAL_SERVICE\n   *\n   * @description:\n   *   This macro is used to look up a service from all modules.\n   *\n   * @input:\n   *   face ::\n   *     The source face handle.\n   *\n   *   id ::\n   *     A string describing the service as defined in the service's\n   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to\n   *     `multi-masters').  It is automatically prefixed with\n   *     `FT_SERVICE_ID_'.\n   *\n   * @output:\n   *   ptr ::\n   *     A variable that receives the service pointer.  Will be NULL\n   *     if not found.\n   */\n#ifdef __cplusplus\n\n#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \\\n  FT_BEGIN_STMNT                                                   \\\n    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );    \\\n    FT_Pointer   _tmp_;                                            \\\n    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                     \\\n                                                                   \\\n                                                                   \\\n    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \\\n    *_pptr_ = _tmp_;                                               \\\n  FT_END_STMNT\n\n#else /* !C++ */\n\n#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \\\n  FT_BEGIN_STMNT                                                   \\\n    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );     \\\n    FT_Pointer  _tmp_;                                             \\\n                                                                   \\\n                                                                   \\\n    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \\\n    ptr   = _tmp_;                                                 \\\n  FT_END_STMNT\n\n#endif /* !C++ */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****         S E R V I C E   D E S C R I P T O R S                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   *  The following structure is used to _describe_ a given service\n   *  to the library.  This is useful to build simple static service lists.\n   */\n  typedef struct  FT_ServiceDescRec_\n  {\n    const char*  serv_id;     /* service name         */\n    const void*  serv_data;   /* service pointer/data */\n\n  } FT_ServiceDescRec;\n\n  typedef const FT_ServiceDescRec*  FT_ServiceDesc;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Macro>                                                               */\n  /*    FT_DEFINE_SERVICEDESCREC1                                          */\n  /*    FT_DEFINE_SERVICEDESCREC2                                          */\n  /*    FT_DEFINE_SERVICEDESCREC3                                          */\n  /*    FT_DEFINE_SERVICEDESCREC4                                          */\n  /*    FT_DEFINE_SERVICEDESCREC5                                          */\n  /*    FT_DEFINE_SERVICEDESCREC6                                          */\n  /*    FT_DEFINE_SERVICEDESCREC7                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Used to initialize an array of FT_ServiceDescRec structures.       */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function needs to  */\n  /*    be called with a pointer to return an allocated array.  As soon as */\n  /*    it is no longer needed, a `destroy' function needs to be called to */\n  /*    release that allocation.                                           */\n  /*                                                                       */\n  /*    These functions should be manually called from the `pic_init' and  */\n  /*    `pic_free' functions of your module (see FT_DEFINE_MODULE).        */\n  /*                                                                       */\n  /*    When FT_CONFIG_OPTION_PIC is not defined the array will be         */\n  /*    allocated in the global scope (or the scope where the macro is     */\n  /*    used).                                                             */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \\\n                                   serv_id_1, serv_data_1 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { serv_id_5, serv_data_5 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { serv_id_5, serv_data_5 },                                             \\\n    { serv_id_6, serv_data_6 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6,                  \\\n                                   serv_id_7, serv_data_7 )                 \\\n  static const FT_ServiceDescRec  class_[] =                                \\\n  {                                                                         \\\n    { serv_id_1, serv_data_1 },                                             \\\n    { serv_id_2, serv_data_2 },                                             \\\n    { serv_id_3, serv_data_3 },                                             \\\n    { serv_id_4, serv_data_4 },                                             \\\n    { serv_id_5, serv_data_5 },                                             \\\n    { serv_id_6, serv_data_6 },                                             \\\n    { serv_id_7, serv_data_7 },                                             \\\n    { NULL, NULL }                                                          \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \\\n                                   serv_id_1, serv_data_1 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = NULL;                                              \\\n    clazz[1].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = NULL;                                              \\\n    clazz[2].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = NULL;                                              \\\n    clazz[3].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = NULL;                                              \\\n    clazz[4].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class )           \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = serv_id_5;                                         \\\n    clazz[4].serv_data = serv_data_5;                                       \\\n    clazz[5].serv_id   = NULL;                                              \\\n    clazz[5].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class)            \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = serv_id_5;                                         \\\n    clazz[4].serv_data = serv_data_5;                                       \\\n    clazz[5].serv_id   = serv_id_6;                                         \\\n    clazz[5].serv_data = serv_data_6;                                       \\\n    clazz[6].serv_id   = NULL;                                              \\\n    clazz[6].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \\\n                                   serv_id_1, serv_data_1,                  \\\n                                   serv_id_2, serv_data_2,                  \\\n                                   serv_id_3, serv_data_3,                  \\\n                                   serv_id_4, serv_data_4,                  \\\n                                   serv_id_5, serv_data_5,                  \\\n                                   serv_id_6, serv_data_6,                  \\\n                                   serv_id_7, serv_data_7 )                 \\\n  void                                                                      \\\n  FT_Destroy_Class_ ## class_( FT_Library          library,                 \\\n                               FT_ServiceDescRec*  clazz )                  \\\n  {                                                                         \\\n    FT_Memory  memory = library->memory;                                    \\\n                                                                            \\\n                                                                            \\\n    if ( clazz )                                                            \\\n      FT_FREE( clazz );                                                     \\\n  }                                                                         \\\n                                                                            \\\n  FT_Error                                                                  \\\n  FT_Create_Class_ ## class_( FT_Library           library,                 \\\n                              FT_ServiceDescRec**  output_class)            \\\n  {                                                                         \\\n    FT_ServiceDescRec*  clazz  = NULL;                                      \\\n    FT_Error            error;                                              \\\n    FT_Memory           memory = library->memory;                           \\\n                                                                            \\\n                                                                            \\\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) )                         \\\n      return error;                                                         \\\n                                                                            \\\n    clazz[0].serv_id   = serv_id_1;                                         \\\n    clazz[0].serv_data = serv_data_1;                                       \\\n    clazz[1].serv_id   = serv_id_2;                                         \\\n    clazz[1].serv_data = serv_data_2;                                       \\\n    clazz[2].serv_id   = serv_id_3;                                         \\\n    clazz[2].serv_data = serv_data_3;                                       \\\n    clazz[3].serv_id   = serv_id_4;                                         \\\n    clazz[3].serv_data = serv_data_4;                                       \\\n    clazz[4].serv_id   = serv_id_5;                                         \\\n    clazz[4].serv_data = serv_data_5;                                       \\\n    clazz[5].serv_id   = serv_id_6;                                         \\\n    clazz[5].serv_data = serv_data_6;                                       \\\n    clazz[6].serv_id   = serv_id_7;                                         \\\n    clazz[6].serv_data = serv_data_7;                                       \\\n    clazz[7].serv_id   = NULL;                                              \\\n    clazz[7].serv_data = NULL;                                              \\\n                                                                            \\\n    *output_class = clazz;                                                  \\\n                                                                            \\\n    return FT_Err_Ok;                                                       \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /*\n   *  Parse a list of FT_ServiceDescRec descriptors and look for\n   *  a specific service by ID.  Note that the last element in the\n   *  array must be { NULL, NULL }, and that the function should\n   *  return NULL if the service isn't available.\n   *\n   *  This function can be used by modules to implement their\n   *  `get_service' method.\n   */\n  FT_BASE( FT_Pointer )\n  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,\n                          const char*     service_id );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****             S E R V I C E S   C A C H E                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   *  This structure is used to store a cache for several frequently used\n   *  services.  It is the type of `face->internal->services'.  You\n   *  should only use FT_FACE_LOOKUP_SERVICE to access it.\n   *\n   *  All fields should have the type FT_Pointer to relax compilation\n   *  dependencies.  We assume the developer isn't completely stupid.\n   *\n   *  Each field must be named `service_XXXX' where `XXX' corresponds to\n   *  the correct FT_SERVICE_ID_XXXX macro.  See the definition of\n   *  FT_FACE_LOOKUP_SERVICE below how this is implemented.\n   *\n   */\n  typedef struct  FT_ServiceCacheRec_\n  {\n    FT_Pointer  service_POSTSCRIPT_FONT_NAME;\n    FT_Pointer  service_MULTI_MASTERS;\n    FT_Pointer  service_GLYPH_DICT;\n    FT_Pointer  service_PFR_METRICS;\n    FT_Pointer  service_WINFNT;\n\n  } FT_ServiceCacheRec, *FT_ServiceCache;\n\n\n  /*\n   *  A magic number used within the services cache.\n   */\n#define FT_SERVICE_UNAVAILABLE  ((FT_Pointer)~1)  /* magic number */\n\n\n  /*\n   * @macro:\n   *   FT_FACE_LOOKUP_SERVICE\n   *\n   * @description:\n   *   This macro is used to lookup a service from a face's driver module\n   *   using its cache.\n   *\n   * @input:\n   *   face::\n   *     The source face handle containing the cache.\n   *\n   *   field ::\n   *     The field name in the cache.\n   *\n   *   id ::\n   *     The service ID.\n   *\n   * @output:\n   *   ptr ::\n   *     A variable receiving the service data.  NULL if not available.\n   */\n#ifdef __cplusplus\n\n#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \\\n  FT_BEGIN_STMNT                                               \\\n    FT_Pointer   svc;                                          \\\n    FT_Pointer*  Pptr = (FT_Pointer*)&(ptr);                   \\\n                                                               \\\n                                                               \\\n    svc = FT_FACE( face )->internal->services. service_ ## id; \\\n    if ( svc == FT_SERVICE_UNAVAILABLE )                       \\\n      svc = NULL;                                              \\\n    else if ( svc == NULL )                                    \\\n    {                                                          \\\n      FT_FACE_FIND_SERVICE( face, svc, id );                   \\\n                                                               \\\n      FT_FACE( face )->internal->services. service_ ## id =    \\\n        (FT_Pointer)( svc != NULL ? svc                        \\\n                                  : FT_SERVICE_UNAVAILABLE );  \\\n    }                                                          \\\n    *Pptr = svc;                                               \\\n  FT_END_STMNT\n\n#else /* !C++ */\n\n#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \\\n  FT_BEGIN_STMNT                                               \\\n    FT_Pointer  svc;                                           \\\n                                                               \\\n                                                               \\\n    svc = FT_FACE( face )->internal->services. service_ ## id; \\\n    if ( svc == FT_SERVICE_UNAVAILABLE )                       \\\n      svc = NULL;                                              \\\n    else if ( svc == NULL )                                    \\\n    {                                                          \\\n      FT_FACE_FIND_SERVICE( face, svc, id );                   \\\n                                                               \\\n      FT_FACE( face )->internal->services. service_ ## id =    \\\n        (FT_Pointer)( svc != NULL ? svc                        \\\n                                  : FT_SERVICE_UNAVAILABLE );  \\\n    }                                                          \\\n    ptr = svc;                                                 \\\n  FT_END_STMNT\n\n#endif /* !C++ */\n\n  /*\n   *  A macro used to define new service structure types.\n   */\n\n#define FT_DEFINE_SERVICE( name )            \\\n  typedef struct FT_Service_ ## name ## Rec_ \\\n    FT_Service_ ## name ## Rec ;             \\\n  typedef struct FT_Service_ ## name ## Rec_ \\\n    const * FT_Service_ ## name ;            \\\n  struct FT_Service_ ## name ## Rec_\n\n  /* */\n\n  /*\n   *  The header files containing the services.\n   */\n\n#define FT_SERVICE_BDF_H                <freetype/internal/services/svbdf.h>\n#define FT_SERVICE_CID_H                <freetype/internal/services/svcid.h>\n#define FT_SERVICE_GLYPH_DICT_H         <freetype/internal/services/svgldict.h>\n#define FT_SERVICE_GX_VALIDATE_H        <freetype/internal/services/svgxval.h>\n#define FT_SERVICE_KERNING_H            <freetype/internal/services/svkern.h>\n#define FT_SERVICE_MULTIPLE_MASTERS_H   <freetype/internal/services/svmm.h>\n#define FT_SERVICE_OPENTYPE_VALIDATE_H  <freetype/internal/services/svotval.h>\n#define FT_SERVICE_PFR_H                <freetype/internal/services/svpfr.h>\n#define FT_SERVICE_POSTSCRIPT_CMAPS_H   <freetype/internal/services/svpscmap.h>\n#define FT_SERVICE_POSTSCRIPT_INFO_H    <freetype/internal/services/svpsinfo.h>\n#define FT_SERVICE_POSTSCRIPT_NAME_H    <freetype/internal/services/svpostnm.h>\n#define FT_SERVICE_PROPERTIES_H         <freetype/internal/services/svprop.h>\n#define FT_SERVICE_SFNT_H               <freetype/internal/services/svsfnt.h>\n#define FT_SERVICE_TRUETYPE_ENGINE_H    <freetype/internal/services/svtteng.h>\n#define FT_SERVICE_TT_CMAP_H            <freetype/internal/services/svttcmap.h>\n#define FT_SERVICE_WINFNT_H             <freetype/internal/services/svwinfnt.h>\n#define FT_SERVICE_XFREE86_NAME_H       <freetype/internal/services/svxf86nm.h>\n#define FT_SERVICE_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.h>\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTSERV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftstream.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstream.h                                                             */\n/*                                                                         */\n/*    Stream handling (specification).                                     */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2006, 2011, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSTREAM_H__\n#define __FTSTREAM_H__\n\n\n#include <ft2build.h>\n#include FT_SYSTEM_H\n#include FT_INTERNAL_OBJECTS_H\n\n\nFT_BEGIN_HEADER\n\n\n  /* format of an 8-bit frame_op value:           */\n  /*                                              */\n  /* bit  76543210                                */\n  /*      xxxxxxes                                */\n  /*                                              */\n  /* s is set to 1 if the value is signed.        */\n  /* e is set to 1 if the value is little-endian. */\n  /* xxx is a command.                            */\n\n#define FT_FRAME_OP_SHIFT         2\n#define FT_FRAME_OP_SIGNED        1\n#define FT_FRAME_OP_LITTLE        2\n#define FT_FRAME_OP_COMMAND( x )  ( x >> FT_FRAME_OP_SHIFT )\n\n#define FT_MAKE_FRAME_OP( command, little, sign ) \\\n          ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )\n\n#define FT_FRAME_OP_END    0\n#define FT_FRAME_OP_START  1  /* start a new frame     */\n#define FT_FRAME_OP_BYTE   2  /* read 1-byte value     */\n#define FT_FRAME_OP_SHORT  3  /* read 2-byte value     */\n#define FT_FRAME_OP_LONG   4  /* read 4-byte value     */\n#define FT_FRAME_OP_OFF3   5  /* read 3-byte value     */\n#define FT_FRAME_OP_BYTES  6  /* read a bytes sequence */\n\n\n  typedef enum  FT_Frame_Op_\n  {\n    ft_frame_end       = 0,\n    ft_frame_start     = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),\n\n    ft_frame_byte      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 0 ),\n    ft_frame_schar     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 1 ),\n\n    ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),\n    ft_frame_short_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),\n    ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),\n    ft_frame_short_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),\n\n    ft_frame_ulong_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),\n    ft_frame_long_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),\n    ft_frame_ulong_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),\n    ft_frame_long_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),\n\n    ft_frame_uoff3_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),\n    ft_frame_off3_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),\n    ft_frame_uoff3_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),\n    ft_frame_off3_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),\n\n    ft_frame_bytes     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),\n    ft_frame_skip      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )\n\n  } FT_Frame_Op;\n\n\n  typedef struct  FT_Frame_Field_\n  {\n    FT_Byte    value;\n    FT_Byte    size;\n    FT_UShort  offset;\n\n  } FT_Frame_Field;\n\n\n  /* Construct an FT_Frame_Field out of a structure type and a field name. */\n  /* The structure type must be set in the FT_STRUCTURE macro before       */\n  /* calling the FT_FRAME_START() macro.                                   */\n  /*                                                                       */\n#define FT_FIELD_SIZE( f ) \\\n          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )\n\n#define FT_FIELD_SIZE_DELTA( f ) \\\n          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )\n\n#define FT_FIELD_OFFSET( f ) \\\n          (FT_UShort)( offsetof( FT_STRUCTURE, f ) )\n\n#define FT_FRAME_FIELD( frame_op, field ) \\\n          {                               \\\n            frame_op,                     \\\n            FT_FIELD_SIZE( field ),       \\\n            FT_FIELD_OFFSET( field )      \\\n          }\n\n#define FT_MAKE_EMPTY_FIELD( frame_op )  { frame_op, 0, 0 }\n\n#define FT_FRAME_START( size )   { ft_frame_start, 0, size }\n#define FT_FRAME_END             { ft_frame_end, 0, 0 }\n\n#define FT_FRAME_LONG( f )       FT_FRAME_FIELD( ft_frame_long_be, f )\n#define FT_FRAME_ULONG( f )      FT_FRAME_FIELD( ft_frame_ulong_be, f )\n#define FT_FRAME_SHORT( f )      FT_FRAME_FIELD( ft_frame_short_be, f )\n#define FT_FRAME_USHORT( f )     FT_FRAME_FIELD( ft_frame_ushort_be, f )\n#define FT_FRAME_OFF3( f )       FT_FRAME_FIELD( ft_frame_off3_be, f )\n#define FT_FRAME_UOFF3( f )      FT_FRAME_FIELD( ft_frame_uoff3_be, f )\n#define FT_FRAME_BYTE( f )       FT_FRAME_FIELD( ft_frame_byte, f )\n#define FT_FRAME_CHAR( f )       FT_FRAME_FIELD( ft_frame_schar, f )\n\n#define FT_FRAME_LONG_LE( f )    FT_FRAME_FIELD( ft_frame_long_le, f )\n#define FT_FRAME_ULONG_LE( f )   FT_FRAME_FIELD( ft_frame_ulong_le, f )\n#define FT_FRAME_SHORT_LE( f )   FT_FRAME_FIELD( ft_frame_short_le, f )\n#define FT_FRAME_USHORT_LE( f )  FT_FRAME_FIELD( ft_frame_ushort_le, f )\n#define FT_FRAME_OFF3_LE( f )    FT_FRAME_FIELD( ft_frame_off3_le, f )\n#define FT_FRAME_UOFF3_LE( f )   FT_FRAME_FIELD( ft_frame_uoff3_le, f )\n\n#define FT_FRAME_SKIP_LONG       { ft_frame_long_be, 0, 0 }\n#define FT_FRAME_SKIP_SHORT      { ft_frame_short_be, 0, 0 }\n#define FT_FRAME_SKIP_BYTE       { ft_frame_byte, 0, 0 }\n\n#define FT_FRAME_BYTES( field, count ) \\\n          {                            \\\n            ft_frame_bytes,            \\\n            count,                     \\\n            FT_FIELD_OFFSET( field )   \\\n          }\n\n#define FT_FRAME_SKIP_BYTES( count )  { ft_frame_skip, count, 0 }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */\n  /* type `char*' or equivalent (1-byte elements).                         */\n  /*                                                                       */\n\n#define FT_BYTE_( p, i )  ( ((const FT_Byte*)(p))[(i)] )\n\n#define FT_INT16( x )   ( (FT_Int16)(x)  )\n#define FT_UINT16( x )  ( (FT_UInt16)(x) )\n#define FT_INT32( x )   ( (FT_Int32)(x)  )\n#define FT_UINT32( x )  ( (FT_UInt32)(x) )\n\n\n#define FT_BYTE_U16( p, i, s )  ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )\n#define FT_BYTE_U32( p, i, s )  ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )\n\n\n#define FT_PEEK_SHORT( p )  FT_INT16( FT_BYTE_U16( p, 0, 8) | \\\n                                      FT_BYTE_U16( p, 1, 0) )\n\n#define FT_PEEK_USHORT( p )  FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \\\n                                        FT_BYTE_U16( p, 1, 0 ) )\n\n#define FT_PEEK_LONG( p )  FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \\\n                                     FT_BYTE_U32( p, 1, 16 ) | \\\n                                     FT_BYTE_U32( p, 2,  8 ) | \\\n                                     FT_BYTE_U32( p, 3,  0 ) )\n\n#define FT_PEEK_ULONG( p )  FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \\\n                                       FT_BYTE_U32( p, 1, 16 ) | \\\n                                       FT_BYTE_U32( p, 2,  8 ) | \\\n                                       FT_BYTE_U32( p, 3,  0 ) )\n\n#define FT_PEEK_OFF3( p )  FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \\\n                                     FT_BYTE_U32( p, 1,  8 ) | \\\n                                     FT_BYTE_U32( p, 2,  0 ) )\n\n#define FT_PEEK_UOFF3( p )  FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \\\n                                       FT_BYTE_U32( p, 1,  8 ) | \\\n                                       FT_BYTE_U32( p, 2,  0 ) )\n\n#define FT_PEEK_SHORT_LE( p )  FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \\\n                                         FT_BYTE_U16( p, 0, 0 ) )\n\n#define FT_PEEK_USHORT_LE( p )  FT_UINT16( FT_BYTE_U16( p, 1, 8 ) |  \\\n                                           FT_BYTE_U16( p, 0, 0 ) )\n\n#define FT_PEEK_LONG_LE( p )  FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \\\n                                        FT_BYTE_U32( p, 2, 16 ) | \\\n                                        FT_BYTE_U32( p, 1,  8 ) | \\\n                                        FT_BYTE_U32( p, 0,  0 ) )\n\n#define FT_PEEK_ULONG_LE( p )  FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \\\n                                          FT_BYTE_U32( p, 2, 16 ) | \\\n                                          FT_BYTE_U32( p, 1,  8 ) | \\\n                                          FT_BYTE_U32( p, 0,  0 ) )\n\n#define FT_PEEK_OFF3_LE( p )  FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \\\n                                        FT_BYTE_U32( p, 1,  8 ) | \\\n                                        FT_BYTE_U32( p, 0,  0 ) )\n\n#define FT_PEEK_UOFF3_LE( p )  FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \\\n                                          FT_BYTE_U32( p, 1,  8 ) | \\\n                                          FT_BYTE_U32( p, 0,  0 ) )\n\n\n#define FT_NEXT_CHAR( buffer )       \\\n          ( (signed char)*buffer++ )\n\n#define FT_NEXT_BYTE( buffer )         \\\n          ( (unsigned char)*buffer++ )\n\n#define FT_NEXT_SHORT( buffer )                                   \\\n          ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )\n\n#define FT_NEXT_USHORT( buffer )                                            \\\n          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )\n\n#define FT_NEXT_OFF3( buffer )                                  \\\n          ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )\n\n#define FT_NEXT_UOFF3( buffer )                                           \\\n          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )\n\n#define FT_NEXT_LONG( buffer )                                  \\\n          ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )\n\n#define FT_NEXT_ULONG( buffer )                                           \\\n          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )\n\n\n#define FT_NEXT_SHORT_LE( buffer )                                   \\\n          ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )\n\n#define FT_NEXT_USHORT_LE( buffer )                                            \\\n          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )\n\n#define FT_NEXT_OFF3_LE( buffer )                                  \\\n          ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )\n\n#define FT_NEXT_UOFF3_LE( buffer )                                           \\\n          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )\n\n#define FT_NEXT_LONG_LE( buffer )                                  \\\n          ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )\n\n#define FT_NEXT_ULONG_LE( buffer )                                           \\\n          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Each GET_xxxx() macro uses an implicit `stream' variable.             */\n  /*                                                                       */\n#if 0\n#define FT_GET_MACRO( type )    FT_NEXT_ ## type ( stream->cursor )\n\n#define FT_GET_CHAR()       FT_GET_MACRO( CHAR )\n#define FT_GET_BYTE()       FT_GET_MACRO( BYTE )\n#define FT_GET_SHORT()      FT_GET_MACRO( SHORT )\n#define FT_GET_USHORT()     FT_GET_MACRO( USHORT )\n#define FT_GET_OFF3()       FT_GET_MACRO( OFF3 )\n#define FT_GET_UOFF3()      FT_GET_MACRO( UOFF3 )\n#define FT_GET_LONG()       FT_GET_MACRO( LONG )\n#define FT_GET_ULONG()      FT_GET_MACRO( ULONG )\n#define FT_GET_TAG4()       FT_GET_MACRO( ULONG )\n\n#define FT_GET_SHORT_LE()   FT_GET_MACRO( SHORT_LE )\n#define FT_GET_USHORT_LE()  FT_GET_MACRO( USHORT_LE )\n#define FT_GET_LONG_LE()    FT_GET_MACRO( LONG_LE )\n#define FT_GET_ULONG_LE()   FT_GET_MACRO( ULONG_LE )\n\n#else\n#define FT_GET_MACRO( func, type )        ( (type)func( stream ) )\n\n#define FT_GET_CHAR()       FT_GET_MACRO( FT_Stream_GetChar, FT_Char )\n#define FT_GET_BYTE()       FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )\n#define FT_GET_SHORT()      FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )\n#define FT_GET_USHORT()     FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )\n#define FT_GET_OFF3()       FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )\n#define FT_GET_UOFF3()      FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )\n#define FT_GET_LONG()       FT_GET_MACRO( FT_Stream_GetULong, FT_Long )\n#define FT_GET_ULONG()      FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )\n#define FT_GET_TAG4()       FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )\n\n#define FT_GET_SHORT_LE()   FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )\n#define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )\n#define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )\n#define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )\n#endif\n\n#define FT_READ_MACRO( func, type, var )        \\\n          ( var = (type)func( stream, &error ), \\\n            error != FT_Err_Ok )\n\n#define FT_READ_BYTE( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )\n#define FT_READ_CHAR( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )\n#define FT_READ_SHORT( var )      FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )\n#define FT_READ_USHORT( var )     FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )\n#define FT_READ_OFF3( var )       FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )\n#define FT_READ_UOFF3( var )      FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )\n#define FT_READ_LONG( var )       FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )\n#define FT_READ_ULONG( var )      FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )\n\n#define FT_READ_SHORT_LE( var )   FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )\n#define FT_READ_USHORT_LE( var )  FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )\n#define FT_READ_LONG_LE( var )    FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )\n#define FT_READ_ULONG_LE( var )   FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )\n\n\n#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM\n\n  /* initialize a stream for reading a regular system stream */\n  FT_BASE( FT_Error )\n  FT_Stream_Open( FT_Stream    stream,\n                  const char*  filepathname );\n\n#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */\n\n\n  /* create a new (input) stream from an FT_Open_Args structure */\n  FT_BASE( FT_Error )\n  FT_Stream_New( FT_Library           library,\n                 const FT_Open_Args*  args,\n                 FT_Stream           *astream );\n\n  /* free a stream */\n  FT_BASE( void )\n  FT_Stream_Free( FT_Stream  stream,\n                  FT_Int     external );\n\n  /* initialize a stream for reading in-memory data */\n  FT_BASE( void )\n  FT_Stream_OpenMemory( FT_Stream       stream,\n                        const FT_Byte*  base,\n                        FT_ULong        size );\n\n  /* close a stream (does not destroy the stream structure) */\n  FT_BASE( void )\n  FT_Stream_Close( FT_Stream  stream );\n\n\n  /* seek within a stream. position is relative to start of stream */\n  FT_BASE( FT_Error )\n  FT_Stream_Seek( FT_Stream  stream,\n                  FT_ULong   pos );\n\n  /* skip bytes in a stream */\n  FT_BASE( FT_Error )\n  FT_Stream_Skip( FT_Stream  stream,\n                  FT_Long    distance );\n\n  /* return current stream position */\n  FT_BASE( FT_Long )\n  FT_Stream_Pos( FT_Stream  stream );\n\n  /* read bytes from a stream into a user-allocated buffer, returns an */\n  /* error if not all bytes could be read.                             */\n  FT_BASE( FT_Error )\n  FT_Stream_Read( FT_Stream  stream,\n                  FT_Byte*   buffer,\n                  FT_ULong   count );\n\n  /* read bytes from a stream at a given position */\n  FT_BASE( FT_Error )\n  FT_Stream_ReadAt( FT_Stream  stream,\n                    FT_ULong   pos,\n                    FT_Byte*   buffer,\n                    FT_ULong   count );\n\n  /* try to read bytes at the end of a stream; return number of bytes */\n  /* really available                                                 */\n  FT_BASE( FT_ULong )\n  FT_Stream_TryRead( FT_Stream  stream,\n                     FT_Byte*   buffer,\n                     FT_ULong   count );\n\n  /* Enter a frame of `count' consecutive bytes in a stream.  Returns an */\n  /* error if the frame could not be read/accessed.  The caller can use  */\n  /* the FT_Stream_Get_XXX functions to retrieve frame data without      */\n  /* error checks.                                                       */\n  /*                                                                     */\n  /* You must _always_ call FT_Stream_ExitFrame() once you have entered  */\n  /* a stream frame!                                                     */\n  /*                                                                     */\n  FT_BASE( FT_Error )\n  FT_Stream_EnterFrame( FT_Stream  stream,\n                        FT_ULong   count );\n\n  /* exit a stream frame */\n  FT_BASE( void )\n  FT_Stream_ExitFrame( FT_Stream  stream );\n\n  /* Extract a stream frame.  If the stream is disk-based, a heap block */\n  /* is allocated and the frame bytes are read into it.  If the stream  */\n  /* is memory-based, this function simply set a pointer to the data.   */\n  /*                                                                    */\n  /* Useful to optimize access to memory-based streams transparently.   */\n  /*                                                                    */\n  /* All extracted frames must be `freed' with a call to the function   */\n  /* FT_Stream_ReleaseFrame().                                          */\n  /*                                                                    */\n  FT_BASE( FT_Error )\n  FT_Stream_ExtractFrame( FT_Stream  stream,\n                          FT_ULong   count,\n                          FT_Byte**  pbytes );\n\n  /* release an extract frame (see FT_Stream_ExtractFrame) */\n  FT_BASE( void )\n  FT_Stream_ReleaseFrame( FT_Stream  stream,\n                          FT_Byte**  pbytes );\n\n  /* read a byte from an entered frame */\n  FT_BASE( FT_Char )\n  FT_Stream_GetChar( FT_Stream  stream );\n\n  /* read a 16-bit big-endian unsigned integer from an entered frame */\n  FT_BASE( FT_UShort )\n  FT_Stream_GetUShort( FT_Stream  stream );\n\n  /* read a 24-bit big-endian unsigned integer from an entered frame */\n  FT_BASE( FT_ULong )\n  FT_Stream_GetUOffset( FT_Stream  stream );\n\n  /* read a 32-bit big-endian unsigned integer from an entered frame */\n  FT_BASE( FT_ULong )\n  FT_Stream_GetULong( FT_Stream  stream );\n\n  /* read a 16-bit little-endian unsigned integer from an entered frame */\n  FT_BASE( FT_UShort )\n  FT_Stream_GetUShortLE( FT_Stream  stream );\n\n  /* read a 32-bit little-endian unsigned integer from an entered frame */\n  FT_BASE( FT_ULong )\n  FT_Stream_GetULongLE( FT_Stream  stream );\n\n\n  /* read a byte from a stream */\n  FT_BASE( FT_Char )\n  FT_Stream_ReadChar( FT_Stream  stream,\n                      FT_Error*  error );\n\n  /* read a 16-bit big-endian unsigned integer from a stream */\n  FT_BASE( FT_UShort )\n  FT_Stream_ReadUShort( FT_Stream  stream,\n                        FT_Error*  error );\n\n  /* read a 24-bit big-endian unsigned integer from a stream */\n  FT_BASE( FT_ULong )\n  FT_Stream_ReadUOffset( FT_Stream  stream,\n                         FT_Error*  error );\n\n  /* read a 32-bit big-endian integer from a stream */\n  FT_BASE( FT_ULong )\n  FT_Stream_ReadULong( FT_Stream  stream,\n                       FT_Error*  error );\n\n  /* read a 16-bit little-endian unsigned integer from a stream */\n  FT_BASE( FT_UShort )\n  FT_Stream_ReadUShortLE( FT_Stream  stream,\n                          FT_Error*  error );\n\n  /* read a 32-bit little-endian unsigned integer from a stream */\n  FT_BASE( FT_ULong )\n  FT_Stream_ReadULongLE( FT_Stream  stream,\n                         FT_Error*  error );\n\n  /* Read a structure from a stream.  The structure must be described */\n  /* by an array of FT_Frame_Field records.                           */\n  FT_BASE( FT_Error )\n  FT_Stream_ReadFields( FT_Stream              stream,\n                        const FT_Frame_Field*  fields,\n                        void*                  structure );\n\n\n#define FT_STREAM_POS()           \\\n          FT_Stream_Pos( stream )\n\n#define FT_STREAM_SEEK( position )                           \\\n          FT_SET_ERROR( FT_Stream_Seek( stream, position ) )\n\n#define FT_STREAM_SKIP( distance )                           \\\n          FT_SET_ERROR( FT_Stream_Skip( stream, distance ) )\n\n#define FT_STREAM_READ( buffer, count )                   \\\n          FT_SET_ERROR( FT_Stream_Read( stream,           \\\n                                        (FT_Byte*)buffer, \\\n                                        count ) )\n\n#define FT_STREAM_READ_AT( position, buffer, count )         \\\n          FT_SET_ERROR( FT_Stream_ReadAt( stream,            \\\n                                           position,         \\\n                                           (FT_Byte*)buffer, \\\n                                           count ) )\n\n#define FT_STREAM_READ_FIELDS( fields, object )                          \\\n          FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )\n\n\n#define FT_FRAME_ENTER( size )                                       \\\n          FT_SET_ERROR(                                              \\\n            FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, size ) ) )\n\n#define FT_FRAME_EXIT()                 \\\n          FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )\n\n#define FT_FRAME_EXTRACT( size, bytes )                                       \\\n          FT_SET_ERROR(                                                       \\\n            FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, size,             \\\n                                                    (FT_Byte**)&(bytes) ) ) )\n\n#define FT_FRAME_RELEASE( bytes )                                         \\\n          FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream,                 \\\n                                                  (FT_Byte**)&(bytes) ) )\n\n\nFT_END_HEADER\n\n#endif /* __FTSTREAM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/fttrace.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttrace.h                                                              */\n/*                                                                         */\n/*    Tracing handling (specification only).                               */\n/*                                                                         */\n/*  Copyright 2002, 2004-2007, 2009, 2011-2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /* definitions of trace levels for FreeType 2 */\n\n  /* the first level must always be `trace_any' */\nFT_TRACE_DEF( any )\n\n  /* base components */\nFT_TRACE_DEF( calc )      /* calculations            (ftcalc.c)   */\nFT_TRACE_DEF( memory )    /* memory manager          (ftobjs.c)   */\nFT_TRACE_DEF( stream )    /* stream manager          (ftstream.c) */\nFT_TRACE_DEF( io )        /* i/o interface           (ftsystem.c) */\nFT_TRACE_DEF( list )      /* list management         (ftlist.c)   */\nFT_TRACE_DEF( init )      /* initialization          (ftinit.c)   */\nFT_TRACE_DEF( objs )      /* base objects            (ftobjs.c)   */\nFT_TRACE_DEF( outline )   /* outline management      (ftoutln.c)  */\nFT_TRACE_DEF( glyph )     /* glyph management        (ftglyph.c)  */\nFT_TRACE_DEF( gloader )   /* glyph loader            (ftgloadr.c) */\n\nFT_TRACE_DEF( raster )    /* monochrome rasterizer   (ftraster.c) */\nFT_TRACE_DEF( smooth )    /* anti-aliasing raster    (ftgrays.c)  */\nFT_TRACE_DEF( mm )        /* MM interface            (ftmm.c)     */\nFT_TRACE_DEF( raccess )   /* resource fork accessor  (ftrfork.c)  */\nFT_TRACE_DEF( synth )     /* bold/slant synthesizer  (ftsynth.c)  */\nFT_TRACE_DEF( bitmap )    /* bitmap checksum         (ftobjs.c)   */\n\n  /* Cache sub-system */\nFT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc.) */\n\n  /* SFNT driver components */\nFT_TRACE_DEF( sfdriver )  /* SFNT font driver        (sfdriver.c) */\nFT_TRACE_DEF( sfobjs )    /* SFNT object handler     (sfobjs.c)   */\nFT_TRACE_DEF( ttcmap )    /* charmap handler         (ttcmap.c)   */\nFT_TRACE_DEF( ttkern )    /* kerning handler         (ttkern.c)   */\nFT_TRACE_DEF( ttload )    /* basic TrueType tables   (ttload.c)   */\nFT_TRACE_DEF( ttmtx )     /* metrics-related tables  (ttmtx.c)    */\nFT_TRACE_DEF( ttpost )    /* PS table processing     (ttpost.c)   */\nFT_TRACE_DEF( ttsbit )    /* TrueType sbit handling  (ttsbit.c)   */\nFT_TRACE_DEF( ttbdf )     /* TrueType embedded BDF   (ttbdf.c)    */\n\n  /* TrueType driver components */\nFT_TRACE_DEF( ttdriver )  /* TT font driver          (ttdriver.c) */\nFT_TRACE_DEF( ttgload )   /* TT glyph loader         (ttgload.c)  */\nFT_TRACE_DEF( ttinterp )  /* bytecode interpreter    (ttinterp.c) */\nFT_TRACE_DEF( ttobjs )    /* TT objects manager      (ttobjs.c)   */\nFT_TRACE_DEF( ttpload )   /* TT data/program loader  (ttpload.c)  */\nFT_TRACE_DEF( ttgxvar )   /* TrueType GX var handler (ttgxvar.c)  */\n\n  /* Type 1 driver components */\nFT_TRACE_DEF( t1afm )\nFT_TRACE_DEF( t1driver )\nFT_TRACE_DEF( t1gload )\nFT_TRACE_DEF( t1hint )\nFT_TRACE_DEF( t1load )\nFT_TRACE_DEF( t1objs )\nFT_TRACE_DEF( t1parse )\n\n  /* PostScript helper module `psaux' */\nFT_TRACE_DEF( t1decode )\nFT_TRACE_DEF( psobjs )\nFT_TRACE_DEF( psconv )\n\n  /* PostScript hinting module `pshinter' */\nFT_TRACE_DEF( pshrec )\nFT_TRACE_DEF( pshalgo1 )\nFT_TRACE_DEF( pshalgo2 )\n\n  /* Type 2 driver components */\nFT_TRACE_DEF( cffdriver )\nFT_TRACE_DEF( cffgload )\nFT_TRACE_DEF( cffload )\nFT_TRACE_DEF( cffobjs )\nFT_TRACE_DEF( cffparse )\n\nFT_TRACE_DEF( cf2blues )\nFT_TRACE_DEF( cf2hints )\nFT_TRACE_DEF( cf2interp )\n\n  /* Type 42 driver component */\nFT_TRACE_DEF( t42 )\n\n  /* CID driver components */\nFT_TRACE_DEF( cidafm )\nFT_TRACE_DEF( ciddriver )\nFT_TRACE_DEF( cidgload )\nFT_TRACE_DEF( cidload )\nFT_TRACE_DEF( cidobjs )\nFT_TRACE_DEF( cidparse )\n\n  /* Windows font component */\nFT_TRACE_DEF( winfnt )\n\n  /* PCF font components */\nFT_TRACE_DEF( pcfdriver )\nFT_TRACE_DEF( pcfread )\n\n  /* BDF font components */\nFT_TRACE_DEF( bdfdriver )\nFT_TRACE_DEF( bdflib )\n\n  /* PFR font component */\nFT_TRACE_DEF( pfr )\n\n  /* OpenType validation components */\nFT_TRACE_DEF( otvmodule )\nFT_TRACE_DEF( otvcommon )\nFT_TRACE_DEF( otvbase )\nFT_TRACE_DEF( otvgdef )\nFT_TRACE_DEF( otvgpos )\nFT_TRACE_DEF( otvgsub )\nFT_TRACE_DEF( otvjstf )\nFT_TRACE_DEF( otvmath )\n\n  /* TrueTypeGX/AAT validation components */\nFT_TRACE_DEF( gxvmodule )\nFT_TRACE_DEF( gxvcommon )\nFT_TRACE_DEF( gxvfeat )\nFT_TRACE_DEF( gxvmort )\nFT_TRACE_DEF( gxvmorx )\nFT_TRACE_DEF( gxvbsln )\nFT_TRACE_DEF( gxvjust )\nFT_TRACE_DEF( gxvkern )\nFT_TRACE_DEF( gxvopbd )\nFT_TRACE_DEF( gxvtrak )\nFT_TRACE_DEF( gxvprop )\nFT_TRACE_DEF( gxvlcar )\n\n  /* autofit components */\nFT_TRACE_DEF( afmodule )\nFT_TRACE_DEF( afhints )\nFT_TRACE_DEF( afcjk )\nFT_TRACE_DEF( aflatin )\nFT_TRACE_DEF( aflatin2 )\nFT_TRACE_DEF( afwarp )\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/ftvalid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftvalid.h                                                              */\n/*                                                                         */\n/*    FreeType validation support (specification).                         */\n/*                                                                         */\n/*  Copyright 2004 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTVALID_H__\n#define __FTVALID_H__\n\n#include <ft2build.h>\n#include FT_CONFIG_STANDARD_LIBRARY_H   /* for ft_setjmp and ft_longjmp */\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                    V A L I D A T I O N                          ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* handle to a validation object */\n  typedef struct FT_ValidatorRec_ volatile*  FT_Validator;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* There are three distinct validation levels defined here:              */\n  /*                                                                       */\n  /* FT_VALIDATE_DEFAULT ::                                                */\n  /*   A table that passes this validation level can be used reliably by   */\n  /*   FreeType.  It generally means that all offsets have been checked to */\n  /*   prevent out-of-bound reads, that array counts are correct, etc.     */\n  /*                                                                       */\n  /* FT_VALIDATE_TIGHT ::                                                  */\n  /*   A table that passes this validation level can be used reliably and  */\n  /*   doesn't contain invalid data.  For example, a charmap table that    */\n  /*   returns invalid glyph indices will not pass, even though it can     */\n  /*   be used with FreeType in default mode (the library will simply      */\n  /*   return an error later when trying to load the glyph).               */\n  /*                                                                       */\n  /*   It also checks that fields which must be a multiple of 2, 4, or 8,  */\n  /*   don't have incorrect values, etc.                                   */\n  /*                                                                       */\n  /* FT_VALIDATE_PARANOID ::                                               */\n  /*   Only for font debugging.  Checks that a table follows the           */\n  /*   specification by 100%.  Very few fonts will be able to pass this    */\n  /*   level anyway but it can be useful for certain tools like font       */\n  /*   editors/converters.                                                 */\n  /*                                                                       */\n  typedef enum  FT_ValidationLevel_\n  {\n    FT_VALIDATE_DEFAULT = 0,\n    FT_VALIDATE_TIGHT,\n    FT_VALIDATE_PARANOID\n\n  } FT_ValidationLevel;\n\n\n  /* validator structure */\n  typedef struct  FT_ValidatorRec_\n  {\n    const FT_Byte*      base;        /* address of table in memory       */\n    const FT_Byte*      limit;       /* `base' + sizeof(table) in memory */\n    FT_ValidationLevel  level;       /* validation level                 */\n    FT_Error            error;       /* error returned. 0 means success  */\n\n    ft_jmp_buf          jump_buffer; /* used for exception handling      */\n\n  } FT_ValidatorRec;\n\n\n#define FT_VALIDATOR( x )  ((FT_Validator)( x ))\n\n\n  FT_BASE( void )\n  ft_validator_init( FT_Validator        valid,\n                     const FT_Byte*      base,\n                     const FT_Byte*      limit,\n                     FT_ValidationLevel  level );\n\n  /* Do not use this. It's broken and will cause your validator to crash */\n  /* if you run it on an invalid font.                                   */\n  FT_BASE( FT_Int )\n  ft_validator_run( FT_Validator  valid );\n\n  /* Sets the error field in a validator, then calls `longjmp' to return */\n  /* to high-level caller.  Using `setjmp/longjmp' avoids many stupid    */\n  /* error checks within the validation routines.                        */\n  /*                                                                     */\n  FT_BASE( void )\n  ft_validator_error( FT_Validator  valid,\n                      FT_Error      error );\n\n\n  /* Calls ft_validate_error.  Assumes that the `valid' local variable */\n  /* holds a pointer to the current validator object.                  */\n  /*                                                                   */\n  /* Use preprocessor prescan to pass FT_ERR_PREFIX.                   */\n  /*                                                                   */\n#define FT_INVALID( _prefix, _error )  FT_INVALID_( _prefix, _error )\n#define FT_INVALID_( _prefix, _error ) \\\n          ft_validator_error( valid, _prefix ## _error )\n\n  /* called when a broken table is detected */\n#define FT_INVALID_TOO_SHORT \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )\n\n  /* called when an invalid offset is detected */\n#define FT_INVALID_OFFSET \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )\n\n  /* called when an invalid format/value is detected */\n#define FT_INVALID_FORMAT \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )\n\n  /* called when an invalid glyph index is detected */\n#define FT_INVALID_GLYPH_ID \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )\n\n  /* called when an invalid field value is detected */\n#define FT_INVALID_DATA \\\n          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )\n\n\nFT_END_HEADER\n\n#endif /* __FTVALID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/internal.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  internal.h                                                             */\n/*                                                                         */\n/*    Internal header files (specification only).                          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is automatically included by `ft2build.h'.                  */\n  /* Do not include it manually!                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define FT_INTERNAL_OBJECTS_H             <freetype/internal/ftobjs.h>\n#define FT_INTERNAL_PIC_H                 <freetype/internal/ftpic.h>\n#define FT_INTERNAL_STREAM_H              <freetype/internal/ftstream.h>\n#define FT_INTERNAL_MEMORY_H              <freetype/internal/ftmemory.h>\n#define FT_INTERNAL_DEBUG_H               <freetype/internal/ftdebug.h>\n#define FT_INTERNAL_CALC_H                <freetype/internal/ftcalc.h>\n#define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdriver.h>\n#define FT_INTERNAL_TRACE_H               <freetype/internal/fttrace.h>\n#define FT_INTERNAL_GLYPH_LOADER_H        <freetype/internal/ftgloadr.h>\n#define FT_INTERNAL_SFNT_H                <freetype/internal/sfnt.h>\n#define FT_INTERNAL_SERVICE_H             <freetype/internal/ftserv.h>\n#define FT_INTERNAL_RFORK_H               <freetype/internal/ftrfork.h>\n#define FT_INTERNAL_VALIDATE_H            <freetype/internal/ftvalid.h>\n\n#define FT_INTERNAL_TRUETYPE_TYPES_H      <freetype/internal/tttypes.h>\n#define FT_INTERNAL_TYPE1_TYPES_H         <freetype/internal/t1types.h>\n\n#define FT_INTERNAL_POSTSCRIPT_AUX_H      <freetype/internal/psaux.h>\n#define FT_INTERNAL_POSTSCRIPT_HINTS_H    <freetype/internal/pshints.h>\n#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H  <freetype/internal/psglobal.h>\n\n#define FT_INTERNAL_AUTOHINT_H            <freetype/internal/autohint.h>\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/psaux.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psaux.h                                                                */\n/*                                                                         */\n/*    Auxiliary functions and data structures related to PostScript fonts  */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2012 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSAUX_H__\n#define __PSAUX_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                             T1_TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct PS_TableRec_*              PS_Table;\n  typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_Table_FuncsRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A set of function pointers to manage PS_Table objects.             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    table_init    :: Used to initialize a table.                       */\n  /*                                                                       */\n  /*    table_done    :: Finalizes resp. destroy a given table.            */\n  /*                                                                       */\n  /*    table_add     :: Adds a new object to a table.                     */\n  /*                                                                       */\n  /*    table_release :: Releases table data, then finalizes it.           */\n  /*                                                                       */\n  typedef struct  PS_Table_FuncsRec_\n  {\n    FT_Error\n    (*init)( PS_Table   table,\n             FT_Int     count,\n             FT_Memory  memory );\n\n    void\n    (*done)( PS_Table  table );\n\n    FT_Error\n    (*add)( PS_Table    table,\n            FT_Int      idx,\n            void*       object,\n            FT_PtrDist  length );\n\n    void\n    (*release)( PS_Table  table );\n\n  } PS_Table_FuncsRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_TableRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A PS_Table is a simple object used to store an array of objects in */\n  /*    a single memory block.                                             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    block     :: The address in memory of the growheap's block.  This  */\n  /*                 can change between two object adds, due to            */\n  /*                 reallocation.                                         */\n  /*                                                                       */\n  /*    cursor    :: The current top of the grow heap within its block.    */\n  /*                                                                       */\n  /*    capacity  :: The current size of the heap block.  Increments by    */\n  /*                 1kByte chunks.                                        */\n  /*                                                                       */\n  /*    init      :: Set to 0xDEADBEEF if `elements' and `lengths' have    */\n  /*                 been allocated.                                       */\n  /*                                                                       */\n  /*    max_elems :: The maximum number of elements in table.              */\n  /*                                                                       */\n  /*    num_elems :: The current number of elements in table.              */\n  /*                                                                       */\n  /*    elements  :: A table of element addresses within the block.        */\n  /*                                                                       */\n  /*    lengths   :: A table of element sizes within the block.            */\n  /*                                                                       */\n  /*    memory    :: The object used for memory operations                 */\n  /*                 (alloc/realloc).                                      */\n  /*                                                                       */\n  /*    funcs     :: A table of method pointers for this object.           */\n  /*                                                                       */\n  typedef struct  PS_TableRec_\n  {\n    FT_Byte*           block;          /* current memory block           */\n    FT_Offset          cursor;         /* current cursor in memory block */\n    FT_Offset          capacity;       /* current size of memory block   */\n    FT_Long            init;\n\n    FT_Int             max_elems;\n    FT_Int             num_elems;\n    FT_Byte**          elements;       /* addresses of table elements */\n    FT_PtrDist*        lengths;        /* lengths of table elements   */\n\n    FT_Memory          memory;\n    PS_Table_FuncsRec  funcs;\n\n  } PS_TableRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       T1 FIELDS & TOKENS                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct PS_ParserRec_*  PS_Parser;\n\n  typedef struct T1_TokenRec_*   T1_Token;\n\n  typedef struct T1_FieldRec_*   T1_Field;\n\n\n  /* simple enumeration type used to identify token types */\n  typedef enum  T1_TokenType_\n  {\n    T1_TOKEN_TYPE_NONE = 0,\n    T1_TOKEN_TYPE_ANY,\n    T1_TOKEN_TYPE_STRING,\n    T1_TOKEN_TYPE_ARRAY,\n    T1_TOKEN_TYPE_KEY, /* aka `name' */\n\n    /* do not remove */\n    T1_TOKEN_TYPE_MAX\n\n  } T1_TokenType;\n\n\n  /* a simple structure used to identify tokens */\n  typedef struct  T1_TokenRec_\n  {\n    FT_Byte*      start;   /* first character of token in input stream */\n    FT_Byte*      limit;   /* first character after the token          */\n    T1_TokenType  type;    /* type of token                            */\n\n  } T1_TokenRec;\n\n\n  /* enumeration type used to identify object fields */\n  typedef enum  T1_FieldType_\n  {\n    T1_FIELD_TYPE_NONE = 0,\n    T1_FIELD_TYPE_BOOL,\n    T1_FIELD_TYPE_INTEGER,\n    T1_FIELD_TYPE_FIXED,\n    T1_FIELD_TYPE_FIXED_1000,\n    T1_FIELD_TYPE_STRING,\n    T1_FIELD_TYPE_KEY,\n    T1_FIELD_TYPE_BBOX,\n    T1_FIELD_TYPE_MM_BBOX,\n    T1_FIELD_TYPE_INTEGER_ARRAY,\n    T1_FIELD_TYPE_FIXED_ARRAY,\n    T1_FIELD_TYPE_CALLBACK,\n\n    /* do not remove */\n    T1_FIELD_TYPE_MAX\n\n  } T1_FieldType;\n\n\n  typedef enum  T1_FieldLocation_\n  {\n    T1_FIELD_LOCATION_CID_INFO,\n    T1_FIELD_LOCATION_FONT_DICT,\n    T1_FIELD_LOCATION_FONT_EXTRA,\n    T1_FIELD_LOCATION_FONT_INFO,\n    T1_FIELD_LOCATION_PRIVATE,\n    T1_FIELD_LOCATION_BBOX,\n    T1_FIELD_LOCATION_LOADER,\n    T1_FIELD_LOCATION_FACE,\n    T1_FIELD_LOCATION_BLEND,\n\n    /* do not remove */\n    T1_FIELD_LOCATION_MAX\n\n  } T1_FieldLocation;\n\n\n  typedef void\n  (*T1_Field_ParseFunc)( FT_Face     face,\n                         FT_Pointer  parser );\n\n\n  /* structure type used to model object fields */\n  typedef struct  T1_FieldRec_\n  {\n    const char*         ident;        /* field identifier               */\n    T1_FieldLocation    location;\n    T1_FieldType        type;         /* type of field                  */\n    T1_Field_ParseFunc  reader;\n    FT_UInt             offset;       /* offset of field in object      */\n    FT_Byte             size;         /* size of field in bytes         */\n    FT_UInt             array_max;    /* maximum number of elements for */\n                                      /* array                          */\n    FT_UInt             count_offset; /* offset of element count for    */\n                                      /* arrays; must not be zero if in */\n                                      /* use -- in other words, a       */\n                                      /* `num_FOO' element must not     */\n                                      /* start the used structure if we */\n                                      /* parse a `FOO' array            */\n    FT_UInt             dict;         /* where we expect it             */\n  } T1_FieldRec;\n\n#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */\n#define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )\n\n\n\n#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \\\n          {                                                 \\\n            _ident, T1CODE, _type,                          \\\n            0,                                              \\\n            FT_FIELD_OFFSET( _fname ),                      \\\n            FT_FIELD_SIZE( _fname ),                        \\\n            0, 0,                                           \\\n            _dict                                           \\\n          },\n\n#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \\\n          {                                             \\\n            _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \\\n            (T1_Field_ParseFunc)_reader,                \\\n            0, 0,                                       \\\n            0, 0,                                       \\\n            _dict                                       \\\n          },\n\n#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \\\n          {                                                      \\\n            _ident, T1CODE, _type,                               \\\n            0,                                                   \\\n            FT_FIELD_OFFSET( _fname ),                           \\\n            FT_FIELD_SIZE_DELTA( _fname ),                       \\\n            _max,                                                \\\n            FT_FIELD_OFFSET( num_ ## _fname ),                   \\\n            _dict                                                \\\n          },\n\n#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \\\n          {                                                       \\\n            _ident, T1CODE, _type,                                \\\n            0,                                                    \\\n            FT_FIELD_OFFSET( _fname ),                            \\\n            FT_FIELD_SIZE_DELTA( _fname ),                        \\\n            _max, 0,                                              \\\n            _dict                                                 \\\n          },\n\n\n#define T1_FIELD_BOOL( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )\n\n#define T1_FIELD_NUM( _ident, _fname, _dict )                                 \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )\n\n#define T1_FIELD_FIXED( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )\n\n#define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \\\n                               _dict )\n\n#define T1_FIELD_STRING( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )\n\n#define T1_FIELD_KEY( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )\n\n#define T1_FIELD_BBOX( _ident, _fname, _dict )                             \\\n          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )\n\n\n#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \\\n          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \\\n                              _fname, _fmax, _dict )\n\n#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \\\n          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \\\n                              _fname, _fmax, _dict )\n\n#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \\\n          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \\\n                               _fname, _fmax, _dict )\n\n#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \\\n          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \\\n                               _fname, _fmax, _dict )\n\n#define T1_FIELD_CALLBACK( _ident, _name, _dict )       \\\n          T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 PARSER                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;\n\n  typedef struct  PS_Parser_FuncsRec_\n  {\n    void\n    (*init)( PS_Parser  parser,\n             FT_Byte*   base,\n             FT_Byte*   limit,\n             FT_Memory  memory );\n\n    void\n    (*done)( PS_Parser  parser );\n\n    void\n    (*skip_spaces)( PS_Parser  parser );\n    void\n    (*skip_PS_token)( PS_Parser  parser );\n\n    FT_Long\n    (*to_int)( PS_Parser  parser );\n    FT_Fixed\n    (*to_fixed)( PS_Parser  parser,\n                 FT_Int     power_ten );\n\n    FT_Error\n    (*to_bytes)( PS_Parser  parser,\n                 FT_Byte*   bytes,\n                 FT_Offset  max_bytes,\n                 FT_Long*   pnum_bytes,\n                 FT_Bool    delimiters );\n\n    FT_Int\n    (*to_coord_array)( PS_Parser  parser,\n                       FT_Int     max_coords,\n                       FT_Short*  coords );\n    FT_Int\n    (*to_fixed_array)( PS_Parser  parser,\n                       FT_Int     max_values,\n                       FT_Fixed*  values,\n                       FT_Int     power_ten );\n\n    void\n    (*to_token)( PS_Parser  parser,\n                 T1_Token   token );\n    void\n    (*to_token_array)( PS_Parser  parser,\n                       T1_Token   tokens,\n                       FT_UInt    max_tokens,\n                       FT_Int*    pnum_tokens );\n\n    FT_Error\n    (*load_field)( PS_Parser       parser,\n                   const T1_Field  field,\n                   void**          objects,\n                   FT_UInt         max_objects,\n                   FT_ULong*       pflags );\n\n    FT_Error\n    (*load_field_table)( PS_Parser       parser,\n                         const T1_Field  field,\n                         void**          objects,\n                         FT_UInt         max_objects,\n                         FT_ULong*       pflags );\n\n  } PS_Parser_FuncsRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_ParserRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    cursor :: The current position in the text.                        */\n  /*                                                                       */\n  /*    base   :: Start of the processed text.                             */\n  /*                                                                       */\n  /*    limit  :: End of the processed text.                               */\n  /*                                                                       */\n  /*    error  :: The last error returned.                                 */\n  /*                                                                       */\n  /*    memory :: The object used for memory operations (alloc/realloc).   */\n  /*                                                                       */\n  /*    funcs  :: A table of functions for the parser.                     */\n  /*                                                                       */\n  typedef struct  PS_ParserRec_\n  {\n    FT_Byte*   cursor;\n    FT_Byte*   base;\n    FT_Byte*   limit;\n    FT_Error   error;\n    FT_Memory  memory;\n\n    PS_Parser_FuncsRec  funcs;\n\n  } PS_ParserRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         T1 BUILDER                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct T1_BuilderRec_*  T1_Builder;\n\n\n  typedef FT_Error\n  (*T1_Builder_Check_Points_Func)( T1_Builder  builder,\n                                   FT_Int      count );\n\n  typedef void\n  (*T1_Builder_Add_Point_Func)( T1_Builder  builder,\n                                FT_Pos      x,\n                                FT_Pos      y,\n                                FT_Byte     flag );\n\n  typedef FT_Error\n  (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,\n                                 FT_Pos      x,\n                                 FT_Pos      y );\n\n  typedef FT_Error\n  (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );\n\n  typedef FT_Error\n  (*T1_Builder_Start_Point_Func)( T1_Builder  builder,\n                                  FT_Pos      x,\n                                  FT_Pos      y );\n\n  typedef void\n  (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );\n\n\n  typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;\n\n  typedef struct  T1_Builder_FuncsRec_\n  {\n    void\n    (*init)( T1_Builder    builder,\n             FT_Face       face,\n             FT_Size       size,\n             FT_GlyphSlot  slot,\n             FT_Bool       hinting );\n\n    void\n    (*done)( T1_Builder   builder );\n\n    T1_Builder_Check_Points_Func   check_points;\n    T1_Builder_Add_Point_Func      add_point;\n    T1_Builder_Add_Point1_Func     add_point1;\n    T1_Builder_Add_Contour_Func    add_contour;\n    T1_Builder_Start_Point_Func    start_point;\n    T1_Builder_Close_Contour_Func  close_contour;\n\n  } T1_Builder_FuncsRec;\n\n\n  /* an enumeration type to handle charstring parsing states */\n  typedef enum  T1_ParseState_\n  {\n    T1_Parse_Start,\n    T1_Parse_Have_Width,\n    T1_Parse_Have_Moveto,\n    T1_Parse_Have_Path\n\n  } T1_ParseState;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Structure>                                                           */\n  /*    T1_BuilderRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*     A structure used during glyph loading to store its outline.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory       :: The current memory object.                         */\n  /*                                                                       */\n  /*    face         :: The current face object.                           */\n  /*                                                                       */\n  /*    glyph        :: The current glyph slot.                            */\n  /*                                                                       */\n  /*    loader       :: XXX                                                */\n  /*                                                                       */\n  /*    base         :: The base glyph outline.                            */\n  /*                                                                       */\n  /*    current      :: The current glyph outline.                         */\n  /*                                                                       */\n  /*    max_points   :: maximum points in builder outline                  */\n  /*                                                                       */\n  /*    max_contours :: Maximum number of contours in builder outline.     */\n  /*                                                                       */\n  /*    pos_x        :: The horizontal translation (if composite glyph).   */\n  /*                                                                       */\n  /*    pos_y        :: The vertical translation (if composite glyph).     */\n  /*                                                                       */\n  /*    left_bearing :: The left side bearing point.                       */\n  /*                                                                       */\n  /*    advance      :: The horizontal advance vector.                     */\n  /*                                                                       */\n  /*    bbox         :: Unused.                                            */\n  /*                                                                       */\n  /*    parse_state  :: An enumeration which controls the charstring       */\n  /*                    parsing state.                                     */\n  /*                                                                       */\n  /*    load_points  :: If this flag is not set, no points are loaded.     */\n  /*                                                                       */\n  /*    no_recurse   :: Set but not used.                                  */\n  /*                                                                       */\n  /*    metrics_only :: A boolean indicating that we only want to compute  */\n  /*                    the metrics of a given glyph, not load all of its  */\n  /*                    points.                                            */\n  /*                                                                       */\n  /*    funcs        :: An array of function pointers for the builder.     */\n  /*                                                                       */\n  typedef struct  T1_BuilderRec_\n  {\n    FT_Memory       memory;\n    FT_Face         face;\n    FT_GlyphSlot    glyph;\n    FT_GlyphLoader  loader;\n    FT_Outline*     base;\n    FT_Outline*     current;\n\n    FT_Pos          pos_x;\n    FT_Pos          pos_y;\n\n    FT_Vector       left_bearing;\n    FT_Vector       advance;\n\n    FT_BBox         bbox;          /* bounding box */\n    T1_ParseState   parse_state;\n    FT_Bool         load_points;\n    FT_Bool         no_recurse;\n\n    FT_Bool         metrics_only;\n\n    void*           hints_funcs;    /* hinter-specific */\n    void*           hints_globals;  /* hinter-specific */\n\n    T1_Builder_FuncsRec  funcs;\n\n  } T1_BuilderRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         T1 DECODER                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */\n  /* calls during glyph loading.                                           */\n  /*                                                                       */\n#define T1_MAX_SUBRS_CALLS  8\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */\n  /* minimum of 16 is required.                                            */\n  /*                                                                       */\n#define T1_MAX_CHARSTRINGS_OPERANDS  32\n\n#endif /* 0 */\n\n\n  typedef struct  T1_Decoder_ZoneRec_\n  {\n    FT_Byte*  cursor;\n    FT_Byte*  base;\n    FT_Byte*  limit;\n\n  } T1_Decoder_ZoneRec, *T1_Decoder_Zone;\n\n\n  typedef struct T1_DecoderRec_*              T1_Decoder;\n  typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;\n\n\n  typedef FT_Error\n  (*T1_Decoder_Callback)( T1_Decoder  decoder,\n                          FT_UInt     glyph_index );\n\n\n  typedef struct  T1_Decoder_FuncsRec_\n  {\n    FT_Error\n    (*init)( T1_Decoder           decoder,\n             FT_Face              face,\n             FT_Size              size,\n             FT_GlyphSlot         slot,\n             FT_Byte**            glyph_names,\n             PS_Blend             blend,\n             FT_Bool              hinting,\n             FT_Render_Mode       hint_mode,\n             T1_Decoder_Callback  callback );\n\n    void\n    (*done)( T1_Decoder  decoder );\n\n    FT_Error\n    (*parse_charstrings)( T1_Decoder  decoder,\n                          FT_Byte*    base,\n                          FT_UInt     len );\n\n  } T1_Decoder_FuncsRec;\n\n\n  typedef struct  T1_DecoderRec_\n  {\n    T1_BuilderRec        builder;\n\n    FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];\n    FT_Long*             top;\n\n    T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];\n    T1_Decoder_Zone      zone;\n\n    FT_Service_PsCMaps   psnames;      /* for seac */\n    FT_UInt              num_glyphs;\n    FT_Byte**            glyph_names;\n\n    FT_Int               lenIV;        /* internal for sub routine calls */\n    FT_UInt              num_subrs;\n    FT_Byte**            subrs;\n    FT_PtrDist*          subrs_len;    /* array of subrs length (optional) */\n\n    FT_Matrix            font_matrix;\n    FT_Vector            font_offset;\n\n    FT_Int               flex_state;\n    FT_Int               num_flex_vectors;\n    FT_Vector            flex_vectors[7];\n\n    PS_Blend             blend;       /* for multiple master support */\n\n    FT_Render_Mode       hint_mode;\n\n    T1_Decoder_Callback  parse_callback;\n    T1_Decoder_FuncsRec  funcs;\n\n    FT_Long*             buildchar;\n    FT_UInt              len_buildchar;\n\n    FT_Bool              seac;\n\n  } T1_DecoderRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            AFM PARSER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct AFM_ParserRec_*  AFM_Parser;\n\n  typedef struct  AFM_Parser_FuncsRec_\n  {\n    FT_Error\n    (*init)( AFM_Parser  parser,\n             FT_Memory   memory,\n             FT_Byte*    base,\n             FT_Byte*    limit );\n\n    void\n    (*done)( AFM_Parser  parser );\n\n    FT_Error\n    (*parse)( AFM_Parser  parser );\n\n  } AFM_Parser_FuncsRec;\n\n\n  typedef struct AFM_StreamRec_*  AFM_Stream;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    AFM_ParserRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An AFM_Parser is a parser for the AFM files.                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory    :: The object used for memory operations (alloc and      */\n  /*                 realloc).                                             */\n  /*                                                                       */\n  /*    stream    :: This is an opaque object.                             */\n  /*                                                                       */\n  /*    FontInfo  :: The result will be stored here.                       */\n  /*                                                                       */\n  /*    get_index :: A user provided function to get a glyph index by its  */\n  /*                 name.                                                 */\n  /*                                                                       */\n  typedef struct  AFM_ParserRec_\n  {\n    FT_Memory     memory;\n    AFM_Stream    stream;\n\n    AFM_FontInfo  FontInfo;\n\n    FT_Int\n    (*get_index)( const char*  name,\n                  FT_Offset    len,\n                  void*        user_data );\n\n    void*         user_data;\n\n  } AFM_ParserRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     TYPE1 CHARMAPS                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;\n\n  typedef struct T1_CMap_ClassesRec_\n  {\n    FT_CMap_Class  standard;\n    FT_CMap_Class  expert;\n    FT_CMap_Class  custom;\n    FT_CMap_Class  unicode;\n\n  } T1_CMap_ClassesRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        PSAux Module Interface                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  PSAux_ServiceRec_\n  {\n    /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */\n    const PS_Table_FuncsRec*    ps_table_funcs;\n    const PS_Parser_FuncsRec*   ps_parser_funcs;\n    const T1_Builder_FuncsRec*  t1_builder_funcs;\n    const T1_Decoder_FuncsRec*  t1_decoder_funcs;\n\n    void\n    (*t1_decrypt)( FT_Byte*   buffer,\n                   FT_Offset  length,\n                   FT_UShort  seed );\n\n    T1_CMap_Classes  t1_cmap_classes;\n\n    /* fields after this comment line were added after version 2.1.10 */\n    const AFM_Parser_FuncsRec*  afm_parser_funcs;\n\n  } PSAux_ServiceRec, *PSAux_Service;\n\n  /* backwards-compatible type definition */\n  typedef PSAux_ServiceRec   PSAux_Interface;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                 Some convenience functions                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define IS_PS_NEWLINE( ch ) \\\n  ( (ch) == '\\r' ||         \\\n    (ch) == '\\n' )\n\n#define IS_PS_SPACE( ch )  \\\n  ( (ch) == ' '         || \\\n    IS_PS_NEWLINE( ch ) || \\\n    (ch) == '\\t'        || \\\n    (ch) == '\\f'        || \\\n    (ch) == '\\0' )\n\n#define IS_PS_SPECIAL( ch )       \\\n  ( (ch) == '/'                || \\\n    (ch) == '(' || (ch) == ')' || \\\n    (ch) == '<' || (ch) == '>' || \\\n    (ch) == '[' || (ch) == ']' || \\\n    (ch) == '{' || (ch) == '}' || \\\n    (ch) == '%'                )\n\n#define IS_PS_DELIM( ch )  \\\n  ( IS_PS_SPACE( ch )   || \\\n    IS_PS_SPECIAL( ch ) )\n\n#define IS_PS_DIGIT( ch )        \\\n  ( (ch) >= '0' && (ch) <= '9' )\n\n#define IS_PS_XDIGIT( ch )            \\\n  ( IS_PS_DIGIT( ch )              || \\\n    ( (ch) >= 'A' && (ch) <= 'F' ) || \\\n    ( (ch) >= 'a' && (ch) <= 'f' ) )\n\n#define IS_PS_BASE85( ch )       \\\n  ( (ch) >= '!' && (ch) <= 'u' )\n\n#define IS_PS_TOKEN( cur, limit, token )                                \\\n  ( (char)(cur)[0] == (token)[0]                                     && \\\n    ( (cur) + sizeof ( (token) ) == (limit) ||                          \\\n      ( (cur) + sizeof( (token) ) < (limit)          &&                 \\\n        IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \\\n    ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )\n\n\nFT_END_HEADER\n\n#endif /* __PSAUX_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/pshints.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshints.h                                                              */\n/*                                                                         */\n/*    Interface to Postscript-specific (Type 1 and Type 2) hints           */\n/*    recorders (specification only).  These are used to support native    */\n/*    T1/T2 hints in the `type1', `cid', and `cff' font drivers.           */\n/*                                                                         */\n/*  Copyright 2001-2003, 2005-2007, 2009, 2012 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHINTS_H__\n#define __PSHINTS_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_TYPE1_TABLES_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               INTERNAL REPRESENTATION OF GLOBALS              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct PSH_GlobalsRec_*  PSH_Globals;\n\n  typedef FT_Error\n  (*PSH_Globals_NewFunc)( FT_Memory     memory,\n                          T1_Private*   private_dict,\n                          PSH_Globals*  aglobals );\n\n  typedef FT_Error\n  (*PSH_Globals_SetScaleFunc)( PSH_Globals  globals,\n                               FT_Fixed     x_scale,\n                               FT_Fixed     y_scale,\n                               FT_Fixed     x_delta,\n                               FT_Fixed     y_delta );\n\n  typedef void\n  (*PSH_Globals_DestroyFunc)( PSH_Globals  globals );\n\n\n  typedef struct  PSH_Globals_FuncsRec_\n  {\n    PSH_Globals_NewFunc       create;\n    PSH_Globals_SetScaleFunc  set_scale;\n    PSH_Globals_DestroyFunc   destroy;\n\n  } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  PUBLIC TYPE 1 HINTS RECORDER                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T1_Hints\n   *\n   * @description:\n   *   This is a handle to an opaque structure used to record glyph hints\n   *   from a Type 1 character glyph character string.\n   *\n   *   The methods used to operate on this object are defined by the\n   *   @T1_Hints_FuncsRec structure.  Recording glyph hints is normally\n   *   achieved through the following scheme:\n   *\n   *   - Open a new hint recording session by calling the `open' method.\n   *     This rewinds the recorder and prepare it for new input.\n   *\n   *   - For each hint found in the glyph charstring, call the corresponding\n   *     method (`stem', `stem3', or `reset').  Note that these functions do\n   *     not return an error code.\n   *\n   *   - Close the recording session by calling the `close' method.  It\n   *     returns an error code if the hints were invalid or something\n   *     strange happened (e.g., memory shortage).\n   *\n   *   The hints accumulated in the object can later be used by the\n   *   PostScript hinter.\n   *\n   */\n  typedef struct T1_HintsRec_*  T1_Hints;\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T1_Hints_Funcs\n   *\n   * @description:\n   *   A pointer to the @T1_Hints_FuncsRec structure that defines the API of\n   *   a given @T1_Hints object.\n   *\n   */\n  typedef const struct T1_Hints_FuncsRec_*  T1_Hints_Funcs;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_OpenFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to prepare it for a new Type 1\n   *   hints recording session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   * @note:\n   *   You should always call the @T1_Hints_CloseFunc method in order to\n   *   close an opened recording session.\n   *\n   */\n  typedef void\n  (*T1_Hints_OpenFunc)( T1_Hints  hints );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_SetStemFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to record a new horizontal or\n   *   vertical stem.  This corresponds to the Type 1 `hstem' and `vstem'\n   *   operators.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   dimension ::\n   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).\n   *\n   *   coords ::\n   *     Array of 2 coordinates in 16.16 format, used as (position,length)\n   *     stem descriptor.\n   *\n   * @note:\n   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use\n   *   horizontal coordinates (x) for vertical stems (dim=1).\n   *\n   *   `coords[0]' is the absolute stem position (lowest coordinate);\n   *   `coords[1]' is the length.\n   *\n   *   The length can be negative, in which case it must be either -20 or\n   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1\n   *   specification.\n   *\n   *   If the length is -21 (corresponding to a bottom ghost stem), then\n   *   the real stem position is `coords[0]+coords[1]'.\n   *\n   */\n  typedef void\n  (*T1_Hints_SetStemFunc)( T1_Hints   hints,\n                           FT_UInt    dimension,\n                           FT_Fixed*  coords );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_SetStem3Func\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to record three\n   *   counter-controlled horizontal or vertical stems at once.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   dimension ::\n   *     0 for horizontal stems, 1 for vertical ones.\n   *\n   *   coords ::\n   *     An array of 6 values in 16.16 format, holding 3 (position,length)\n   *     pairs for the counter-controlled stems.\n   *\n   * @note:\n   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use\n   *   horizontal coordinates (x) for vertical stems (dim=1).\n   *\n   *   The lengths cannot be negative (ghost stems are never\n   *   counter-controlled).\n   *\n   */\n  typedef void\n  (*T1_Hints_SetStem3Func)( T1_Hints   hints,\n                            FT_UInt    dimension,\n                            FT_Fixed*  coords );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_ResetFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to reset the stems hints in a\n   *   recording session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   end_point ::\n   *     The index of the last point in the input glyph in which the\n   *     previously defined hints apply.\n   *\n   */\n  typedef void\n  (*T1_Hints_ResetFunc)( T1_Hints  hints,\n                         FT_UInt   end_point );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_CloseFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to close a hint recording\n   *   session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   end_point ::\n   *     The index of the last point in the input glyph.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   The error code is set to indicate that an error occurred during the\n   *   recording session.\n   *\n   */\n  typedef FT_Error\n  (*T1_Hints_CloseFunc)( T1_Hints  hints,\n                         FT_UInt   end_point );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T1_Hints_ApplyFunc\n   *\n   * @description:\n   *   A method of the @T1_Hints class used to apply hints to the\n   *   corresponding glyph outline.  Must be called once all hints have been\n   *   recorded.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 1 hints recorder.\n   *\n   *   outline ::\n   *     A pointer to the target outline descriptor.\n   *\n   *   globals ::\n   *     The hinter globals for this font.\n   *\n   *   hint_mode ::\n   *     Hinting information.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   On input, all points within the outline are in font coordinates. On\n   *   output, they are in 1/64th of pixels.\n   *\n   *   The scaling transformation is taken from the `globals' object which\n   *   must correspond to the same font as the glyph.\n   *\n   */\n  typedef FT_Error\n  (*T1_Hints_ApplyFunc)( T1_Hints        hints,\n                         FT_Outline*     outline,\n                         PSH_Globals     globals,\n                         FT_Render_Mode  hint_mode );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   T1_Hints_FuncsRec\n   *\n   * @description:\n   *   The structure used to provide the API to @T1_Hints objects.\n   *\n   * @fields:\n   *   hints ::\n   *     A handle to the T1 Hints recorder.\n   *\n   *   open ::\n   *     The function to open a recording session.\n   *\n   *   close ::\n   *     The function to close a recording session.\n   *\n   *   stem ::\n   *     The function to set a simple stem.\n   *\n   *   stem3 ::\n   *     The function to set counter-controlled stems.\n   *\n   *   reset ::\n   *     The function to reset stem hints.\n   *\n   *   apply ::\n   *     The function to apply the hints to the corresponding glyph outline.\n   *\n   */\n  typedef struct  T1_Hints_FuncsRec_\n  {\n    T1_Hints               hints;\n    T1_Hints_OpenFunc      open;\n    T1_Hints_CloseFunc     close;\n    T1_Hints_SetStemFunc   stem;\n    T1_Hints_SetStem3Func  stem3;\n    T1_Hints_ResetFunc     reset;\n    T1_Hints_ApplyFunc     apply;\n\n  } T1_Hints_FuncsRec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  PUBLIC TYPE 2 HINTS RECORDER                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T2_Hints\n   *\n   * @description:\n   *   This is a handle to an opaque structure used to record glyph hints\n   *   from a Type 2 character glyph character string.\n   *\n   *   The methods used to operate on this object are defined by the\n   *   @T2_Hints_FuncsRec structure.  Recording glyph hints is normally\n   *   achieved through the following scheme:\n   *\n   *   - Open a new hint recording session by calling the `open' method.\n   *     This rewinds the recorder and prepare it for new input.\n   *\n   *   - For each hint found in the glyph charstring, call the corresponding\n   *     method (`stems', `hintmask', `counters').  Note that these\n   *     functions do not return an error code.\n   *\n   *   - Close the recording session by calling the `close' method.  It\n   *     returns an error code if the hints were invalid or something\n   *     strange happened (e.g., memory shortage).\n   *\n   *   The hints accumulated in the object can later be used by the\n   *   Postscript hinter.\n   *\n   */\n  typedef struct T2_HintsRec_*  T2_Hints;\n\n\n  /*************************************************************************\n   *\n   * @type:\n   *   T2_Hints_Funcs\n   *\n   * @description:\n   *   A pointer to the @T2_Hints_FuncsRec structure that defines the API of\n   *   a given @T2_Hints object.\n   *\n   */\n  typedef const struct T2_Hints_FuncsRec_*  T2_Hints_Funcs;\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_OpenFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to prepare it for a new Type 2\n   *   hints recording session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   * @note:\n   *   You should always call the @T2_Hints_CloseFunc method in order to\n   *   close an opened recording session.\n   *\n   */\n  typedef void\n  (*T2_Hints_OpenFunc)( T2_Hints  hints );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_StemsFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to set the table of stems in\n   *   either the vertical or horizontal dimension.  Equivalent to the\n   *   `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   dimension ::\n   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).\n   *\n   *   count ::\n   *     The number of stems.\n   *\n   *   coords ::\n   *     An array of `count' (position,length) pairs in 16.16 format.\n   *\n   * @note:\n   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use\n   *   horizontal coordinates (x) for vertical stems (dim=1).\n   *\n   *   There are `2*count' elements in the `coords' array.  Each even\n   *   element is an absolute position in font units, each odd element is a\n   *   length in font units.\n   *\n   *   A length can be negative, in which case it must be either -20 or\n   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1\n   *   specification.\n   *\n   */\n  typedef void\n  (*T2_Hints_StemsFunc)( T2_Hints   hints,\n                         FT_UInt    dimension,\n                         FT_UInt    count,\n                         FT_Fixed*  coordinates );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_MaskFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to set a given hintmask (this\n   *   corresponds to the `hintmask' Type 2 operator).\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   end_point ::\n   *     The glyph index of the last point to which the previously defined\n   *     or activated hints apply.\n   *\n   *   bit_count ::\n   *     The number of bits in the hint mask.\n   *\n   *   bytes ::\n   *     An array of bytes modelling the hint mask.\n   *\n   * @note:\n   *   If the hintmask starts the charstring (before any glyph point\n   *   definition), the value of `end_point' should be 0.\n   *\n   *   `bit_count' is the number of meaningful bits in the `bytes' array; it\n   *   must be equal to the total number of hints defined so far (i.e.,\n   *   horizontal+verticals).\n   *\n   *   The `bytes' array can come directly from the Type 2 charstring and\n   *   respects the same format.\n   *\n   */\n  typedef void\n  (*T2_Hints_MaskFunc)( T2_Hints        hints,\n                        FT_UInt         end_point,\n                        FT_UInt         bit_count,\n                        const FT_Byte*  bytes );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_CounterFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to set a given counter mask\n   *   (this corresponds to the `hintmask' Type 2 operator).\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   end_point ::\n   *     A glyph index of the last point to which the previously defined or\n   *     active hints apply.\n   *\n   *   bit_count ::\n   *     The number of bits in the hint mask.\n   *\n   *   bytes ::\n   *     An array of bytes modelling the hint mask.\n   *\n   * @note:\n   *   If the hintmask starts the charstring (before any glyph point\n   *   definition), the value of `end_point' should be 0.\n   *\n   *   `bit_count' is the number of meaningful bits in the `bytes' array; it\n   *   must be equal to the total number of hints defined so far (i.e.,\n   *   horizontal+verticals).\n   *\n   *    The `bytes' array can come directly from the Type 2 charstring and\n   *    respects the same format.\n   *\n   */\n  typedef void\n  (*T2_Hints_CounterFunc)( T2_Hints        hints,\n                           FT_UInt         bit_count,\n                           const FT_Byte*  bytes );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_CloseFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to close a hint recording\n   *   session.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   end_point ::\n   *     The index of the last point in the input glyph.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   The error code is set to indicate that an error occurred during the\n   *   recording session.\n   *\n   */\n  typedef FT_Error\n  (*T2_Hints_CloseFunc)( T2_Hints  hints,\n                         FT_UInt   end_point );\n\n\n  /*************************************************************************\n   *\n   * @functype:\n   *   T2_Hints_ApplyFunc\n   *\n   * @description:\n   *   A method of the @T2_Hints class used to apply hints to the\n   *   corresponding glyph outline.  Must be called after the `close'\n   *   method.\n   *\n   * @input:\n   *   hints ::\n   *     A handle to the Type 2 hints recorder.\n   *\n   *   outline ::\n   *     A pointer to the target outline descriptor.\n   *\n   *   globals ::\n   *     The hinter globals for this font.\n   *\n   *   hint_mode ::\n   *     Hinting information.\n   *\n   * @return:\n   *   FreeType error code.  0 means success.\n   *\n   * @note:\n   *   On input, all points within the outline are in font coordinates. On\n   *   output, they are in 1/64th of pixels.\n   *\n   *   The scaling transformation is taken from the `globals' object which\n   *   must correspond to the same font than the glyph.\n   *\n   */\n  typedef FT_Error\n  (*T2_Hints_ApplyFunc)( T2_Hints        hints,\n                         FT_Outline*     outline,\n                         PSH_Globals     globals,\n                         FT_Render_Mode  hint_mode );\n\n\n  /*************************************************************************\n   *\n   * @struct:\n   *   T2_Hints_FuncsRec\n   *\n   * @description:\n   *   The structure used to provide the API to @T2_Hints objects.\n   *\n   * @fields:\n   *   hints ::\n   *     A handle to the T2 hints recorder object.\n   *\n   *   open ::\n   *     The function to open a recording session.\n   *\n   *   close ::\n   *     The function to close a recording session.\n   *\n   *   stems ::\n   *     The function to set the dimension's stems table.\n   *\n   *   hintmask ::\n   *     The function to set hint masks.\n   *\n   *   counter ::\n   *     The function to set counter masks.\n   *\n   *   apply ::\n   *     The function to apply the hints on the corresponding glyph outline.\n   *\n   */\n  typedef struct  T2_Hints_FuncsRec_\n  {\n    T2_Hints              hints;\n    T2_Hints_OpenFunc     open;\n    T2_Hints_CloseFunc    close;\n    T2_Hints_StemsFunc    stems;\n    T2_Hints_MaskFunc     hintmask;\n    T2_Hints_CounterFunc  counter;\n    T2_Hints_ApplyFunc    apply;\n\n  } T2_Hints_FuncsRec;\n\n\n  /* */\n\n\n  typedef struct  PSHinter_Interface_\n  {\n    PSH_Globals_Funcs  (*get_globals_funcs)( FT_Module  module );\n    T1_Hints_Funcs     (*get_t1_funcs)     ( FT_Module  module );\n    T2_Hints_Funcs     (*get_t2_funcs)     ( FT_Module  module );\n\n  } PSHinter_Interface;\n\n  typedef PSHinter_Interface*  PSHinter_Service;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_PSHINTER_INTERFACE(        \\\n          class_,                            \\\n          get_globals_funcs_,                \\\n          get_t1_funcs_,                     \\\n          get_t2_funcs_ )                    \\\n  static const PSHinter_Interface  class_ =  \\\n  {                                          \\\n    get_globals_funcs_,                      \\\n    get_t1_funcs_,                           \\\n    get_t2_funcs_                            \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_PSHINTER_INTERFACE(                      \\\n          class_,                                          \\\n          get_globals_funcs_,                              \\\n          get_t1_funcs_,                                   \\\n          get_t2_funcs_ )                                  \\\n  void                                                     \\\n  FT_Init_Class_ ## class_( FT_Library           library,  \\\n                            PSHinter_Interface*  clazz )   \\\n  {                                                        \\\n    FT_UNUSED( library );                                  \\\n                                                           \\\n    clazz->get_globals_funcs = get_globals_funcs_;         \\\n    clazz->get_t1_funcs      = get_t1_funcs_;              \\\n    clazz->get_t2_funcs      = get_t2_funcs_;              \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __PSHINTS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svbdf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svbdf.h                                                                */\n/*                                                                         */\n/*    The FreeType BDF services (specification).                           */\n/*                                                                         */\n/*  Copyright 2003, 2009, 2012 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVBDF_H__\n#define __SVBDF_H__\n\n#include FT_BDF_H\n#include FT_INTERNAL_SERVICE_H\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_BDF  \"bdf\"\n\n  typedef FT_Error\n  (*FT_BDF_GetCharsetIdFunc)( FT_Face       face,\n                              const char*  *acharset_encoding,\n                              const char*  *acharset_registry );\n\n  typedef FT_Error\n  (*FT_BDF_GetPropertyFunc)( FT_Face           face,\n                             const char*       prop_name,\n                             BDF_PropertyRec  *aproperty );\n\n\n  FT_DEFINE_SERVICE( BDF )\n  {\n    FT_BDF_GetCharsetIdFunc  get_charset_id;\n    FT_BDF_GetPropertyFunc   get_property;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_BDFRec( class_,                                \\\n                                  get_charset_id_,                       \\\n                                  get_property_ )                        \\\n  static const FT_Service_BDFRec  class_ =                               \\\n  {                                                                      \\\n    get_charset_id_, get_property_                                       \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_BDFRec( class_,                                \\\n                                  get_charset_id_,                       \\\n                                  get_property_ )                        \\\n  void                                                                   \\\n  FT_Init_Class_ ## class_( FT_Service_BDFRec*  clazz )                  \\\n  {                                                                      \\\n    clazz->get_charset_id = get_charset_id_;                             \\\n    clazz->get_property   = get_property_;                               \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVBDF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svcid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svcid.h                                                                */\n/*                                                                         */\n/*    The FreeType CID font services (specification).                      */\n/*                                                                         */\n/*  Copyright 2007, 2009, 2012 by Derek Clegg, Michael Toftdal.            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVCID_H__\n#define __SVCID_H__\n\n#include FT_INTERNAL_SERVICE_H\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_CID  \"CID\"\n\n  typedef FT_Error\n  (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face       face,\n                                               const char*  *registry,\n                                               const char*  *ordering,\n                                               FT_Int       *supplement );\n  typedef FT_Error\n  (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face   face,\n                                         FT_Bool  *is_cid );\n  typedef FT_Error\n  (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face   face,\n                                      FT_UInt   glyph_index,\n                                      FT_UInt  *cid );\n\n  FT_DEFINE_SERVICE( CID )\n  {\n    FT_CID_GetRegistryOrderingSupplementFunc  get_ros;\n    FT_CID_GetIsInternallyCIDKeyedFunc        get_is_cid;\n    FT_CID_GetCIDFromGlyphIndexFunc           get_cid_from_glyph_index;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \\\n                                  get_ros_,                                 \\\n                                  get_is_cid_,                              \\\n                                  get_cid_from_glyph_index_ )               \\\n  static const FT_Service_CIDRec class_ =                                   \\\n  {                                                                         \\\n    get_ros_, get_is_cid_, get_cid_from_glyph_index_                        \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \\\n                                  get_ros_,                                 \\\n                                  get_is_cid_,                              \\\n                                  get_cid_from_glyph_index_ )               \\\n  void                                                                      \\\n  FT_Init_Class_ ## class_( FT_Library          library,                    \\\n                            FT_Service_CIDRec*  clazz )                     \\\n  {                                                                         \\\n    FT_UNUSED( library );                                                   \\\n                                                                            \\\n    clazz->get_ros                  = get_ros_;                             \\\n    clazz->get_is_cid               = get_is_cid_;                          \\\n    clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_;            \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVCID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svgldict.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svgldict.h                                                             */\n/*                                                                         */\n/*    The FreeType glyph dictionary services (specification).              */\n/*                                                                         */\n/*  Copyright 2003, 2009, 2012 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVGLDICT_H__\n#define __SVGLDICT_H__\n\n#include FT_INTERNAL_SERVICE_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  A service used to retrieve glyph names, as well as to find the\n   *  index of a given glyph name in a font.\n   *\n   */\n\n#define FT_SERVICE_ID_GLYPH_DICT  \"glyph-dict\"\n\n\n  typedef FT_Error\n  (*FT_GlyphDict_GetNameFunc)( FT_Face     face,\n                               FT_UInt     glyph_index,\n                               FT_Pointer  buffer,\n                               FT_UInt     buffer_max );\n\n  typedef FT_UInt\n  (*FT_GlyphDict_NameIndexFunc)( FT_Face     face,\n                                 FT_String*  glyph_name );\n\n\n  FT_DEFINE_SERVICE( GlyphDict )\n  {\n    FT_GlyphDict_GetNameFunc    get_name;\n    FT_GlyphDict_NameIndexFunc  name_index;  /* optional */\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \\\n                                        get_name_,                     \\\n                                        name_index_)                   \\\n  static const FT_Service_GlyphDictRec  class_ =                       \\\n  {                                                                    \\\n    get_name_, name_index_                                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \\\n                                        get_name_,                     \\\n                                        name_index_)                   \\\n  void                                                                 \\\n  FT_Init_Class_ ## class_( FT_Library                library,         \\\n                            FT_Service_GlyphDictRec*  clazz )          \\\n  {                                                                    \\\n    FT_UNUSED( library );                                              \\\n                                                                       \\\n    clazz->get_name   = get_name_;                                     \\\n    clazz->name_index = name_index_;                                   \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVGLDICT_H__ */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svgxval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svgxval.h                                                              */\n/*                                                                         */\n/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */\n/*                                                                         */\n/*  Copyright 2004, 2005 by                                                */\n/*  Masatake YAMATO, Red Hat K.K.,                                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVGXVAL_H__\n#define __SVGXVAL_H__\n\n#include FT_GX_VALIDATE_H\n#include FT_INTERNAL_VALIDATE_H\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_GX_VALIDATE           \"truetypegx-validate\"\n#define FT_SERVICE_ID_CLASSICKERN_VALIDATE  \"classickern-validate\"\n\n  typedef FT_Error\n  (*gxv_validate_func)( FT_Face   face,\n                        FT_UInt   gx_flags,\n                        FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],\n                        FT_UInt   table_length );\n\n\n  typedef FT_Error\n  (*ckern_validate_func)( FT_Face   face,\n                          FT_UInt   ckern_flags,\n                          FT_Bytes  *ckern_table );\n\n\n  FT_DEFINE_SERVICE( GXvalidate )\n  {\n    gxv_validate_func  validate;\n  };\n\n  FT_DEFINE_SERVICE( CKERNvalidate )\n  {\n    ckern_validate_func  validate;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVGXVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svkern.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svkern.h                                                               */\n/*                                                                         */\n/*    The FreeType Kerning service (specification).                        */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVKERN_H__\n#define __SVKERN_H__\n\n#include FT_INTERNAL_SERVICE_H\n#include FT_TRUETYPE_TABLES_H\n\n\nFT_BEGIN_HEADER\n\n#define FT_SERVICE_ID_KERNING  \"kerning\"\n\n\n  typedef FT_Error\n  (*FT_Kerning_TrackGetFunc)( FT_Face    face,\n                              FT_Fixed   point_size,\n                              FT_Int     degree,\n                              FT_Fixed*  akerning );\n\n  FT_DEFINE_SERVICE( Kerning )\n  {\n    FT_Kerning_TrackGetFunc  get_track;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVKERN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svmm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svmm.h                                                                 */\n/*                                                                         */\n/*    The FreeType Multiple Masters and GX var services (specification).   */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVMM_H__\n#define __SVMM_H__\n\n#include FT_INTERNAL_SERVICE_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  A service used to manage multiple-masters data in a given face.\n   *\n   *  See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).\n   *\n   */\n\n#define FT_SERVICE_ID_MULTI_MASTERS  \"multi-masters\"\n\n\n  typedef FT_Error\n  (*FT_Get_MM_Func)( FT_Face           face,\n                     FT_Multi_Master*  master );\n\n  typedef FT_Error\n  (*FT_Get_MM_Var_Func)( FT_Face      face,\n                         FT_MM_Var*  *master );\n\n  typedef FT_Error\n  (*FT_Set_MM_Design_Func)( FT_Face   face,\n                            FT_UInt   num_coords,\n                            FT_Long*  coords );\n\n  typedef FT_Error\n  (*FT_Set_Var_Design_Func)( FT_Face    face,\n                             FT_UInt    num_coords,\n                             FT_Fixed*  coords );\n\n  typedef FT_Error\n  (*FT_Set_MM_Blend_Func)( FT_Face   face,\n                           FT_UInt   num_coords,\n                           FT_Long*  coords );\n\n\n  FT_DEFINE_SERVICE( MultiMasters )\n  {\n    FT_Get_MM_Func          get_mm;\n    FT_Set_MM_Design_Func   set_mm_design;\n    FT_Set_MM_Blend_Func    set_mm_blend;\n    FT_Get_MM_Var_Func      get_mm_var;\n    FT_Set_Var_Design_Func  set_var_design;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \\\n                                           get_mm_,                         \\\n                                           set_mm_design_,                  \\\n                                           set_mm_blend_,                   \\\n                                           get_mm_var_,                     \\\n                                           set_var_design_ )                \\\n  static const FT_Service_MultiMastersRec  class_ =                         \\\n  {                                                                         \\\n    get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_    \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \\\n                                           get_mm_,                         \\\n                                           set_mm_design_,                  \\\n                                           set_mm_blend_,                   \\\n                                           get_mm_var_,                     \\\n                                           set_var_design_ )                \\\n  void                                                                      \\\n  FT_Init_Class_ ## class_( FT_Service_MultiMastersRec*  clazz )            \\\n  {                                                                         \\\n    clazz->get_mm         = get_mm_;                                        \\\n    clazz->set_mm_design  = set_mm_design_;                                 \\\n    clazz->set_mm_blend   = set_mm_blend_;                                  \\\n    clazz->get_mm_var     = get_mm_var_;                                    \\\n    clazz->set_var_design = set_var_design_;                                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __SVMM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svotval.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svotval.h                                                              */\n/*                                                                         */\n/*    The FreeType OpenType validation service (specification).            */\n/*                                                                         */\n/*  Copyright 2004, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVOTVAL_H__\n#define __SVOTVAL_H__\n\n#include FT_OPENTYPE_VALIDATE_H\n#include FT_INTERNAL_VALIDATE_H\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_OPENTYPE_VALIDATE  \"opentype-validate\"\n\n\n  typedef FT_Error\n  (*otv_validate_func)( FT_Face volatile  face,\n                        FT_UInt           ot_flags,\n                        FT_Bytes         *base,\n                        FT_Bytes         *gdef,\n                        FT_Bytes         *gpos,\n                        FT_Bytes         *gsub,\n                        FT_Bytes         *jstf );\n\n\n  FT_DEFINE_SERVICE( OTvalidate )\n  {\n    otv_validate_func  validate;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVOTVAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svpfr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpfr.h                                                                */\n/*                                                                         */\n/*    Internal PFR service functions (specification).                      */\n/*                                                                         */\n/*  Copyright 2003, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPFR_H__\n#define __SVPFR_H__\n\n#include FT_PFR_H\n#include FT_INTERNAL_SERVICE_H\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_PFR_METRICS  \"pfr-metrics\"\n\n\n  typedef FT_Error\n  (*FT_PFR_GetMetricsFunc)( FT_Face    face,\n                            FT_UInt   *aoutline,\n                            FT_UInt   *ametrics,\n                            FT_Fixed  *ax_scale,\n                            FT_Fixed  *ay_scale );\n\n  typedef FT_Error\n  (*FT_PFR_GetKerningFunc)( FT_Face     face,\n                            FT_UInt     left,\n                            FT_UInt     right,\n                            FT_Vector  *avector );\n\n  typedef FT_Error\n  (*FT_PFR_GetAdvanceFunc)( FT_Face   face,\n                            FT_UInt   gindex,\n                            FT_Pos   *aadvance );\n\n\n  FT_DEFINE_SERVICE( PfrMetrics )\n  {\n    FT_PFR_GetMetricsFunc  get_metrics;\n    FT_PFR_GetKerningFunc  get_kerning;\n    FT_PFR_GetAdvanceFunc  get_advance;\n\n  };\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __SVPFR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svpostnm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpostnm.h                                                             */\n/*                                                                         */\n/*    The FreeType PostScript name services (specification).               */\n/*                                                                         */\n/*  Copyright 2003, 2007, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPOSTNM_H__\n#define __SVPOSTNM_H__\n\n#include FT_INTERNAL_SERVICE_H\n\n\nFT_BEGIN_HEADER\n\n  /*\n   *  A trivial service used to retrieve the PostScript name of a given\n   *  font when available.  The `get_name' field should never be NULL.\n   *\n   *  The corresponding function can return NULL to indicate that the\n   *  PostScript name is not available.\n   *\n   *  The name is owned by the face and will be destroyed with it.\n   */\n\n#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME  \"postscript-font-name\"\n\n\n  typedef const char*\n  (*FT_PsName_GetFunc)( FT_Face  face );\n\n\n  FT_DEFINE_SERVICE( PsFontName )\n  {\n    FT_PsName_GetFunc  get_ps_font_name;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \\\n  static const FT_Service_PsFontNameRec  class_ =                    \\\n  {                                                                  \\\n    get_ps_font_name_                                                \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \\\n  void                                                               \\\n  FT_Init_Class_ ## class_( FT_Library                 library,      \\\n                            FT_Service_PsFontNameRec*  clazz )       \\\n  {                                                                  \\\n    FT_UNUSED( library );                                            \\\n                                                                     \\\n    clazz->get_ps_font_name = get_ps_font_name_;                     \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPOSTNM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svprop.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svprop.h                                                               */\n/*                                                                         */\n/*    The FreeType property service (specification).                       */\n/*                                                                         */\n/*  Copyright 2012 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPROP_H__\n#define __SVPROP_H__\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_PROPERTIES  \"properties\"\n\n\n  typedef FT_Error\n  (*FT_Properties_SetFunc)( FT_Module    module,\n                            const char*  property_name,\n                            const void*  value );\n\n  typedef FT_Error\n  (*FT_Properties_GetFunc)( FT_Module    module,\n                            const char*  property_name,\n                            void*        value );\n\n\n  FT_DEFINE_SERVICE( Properties )\n  {\n    FT_Properties_SetFunc  set_property;\n    FT_Properties_GetFunc  get_property;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,          \\\n                                         set_property_,   \\\n                                         get_property_ )  \\\n  static const FT_Service_PropertiesRec  class_ =         \\\n  {                                                       \\\n    set_property_,                                        \\\n    get_property_                                         \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,                \\\n                                         set_property_,         \\\n                                         get_property_ )        \\\n  void                                                          \\\n  FT_Init_Class_ ## class_( FT_Service_PropertiesRec*  clazz )  \\\n  {                                                             \\\n    clazz->set_property = set_property_;                        \\\n    clazz->get_property = get_property_;                        \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPROP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svpscmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpscmap.h                                                             */\n/*                                                                         */\n/*    The FreeType PostScript charmap service (specification).             */\n/*                                                                         */\n/*  Copyright 2003, 2006, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPSCMAP_H__\n#define __SVPSCMAP_H__\n\n#include FT_INTERNAL_OBJECTS_H\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_POSTSCRIPT_CMAPS  \"postscript-cmaps\"\n\n\n  /*\n   *  Adobe glyph name to unicode value.\n   */\n  typedef FT_UInt32\n  (*PS_Unicode_ValueFunc)( const char*  glyph_name );\n\n  /*\n   *  Macintosh name id to glyph name.  NULL if invalid index.\n   */\n  typedef const char*\n  (*PS_Macintosh_NameFunc)( FT_UInt  name_index );\n\n  /*\n   *  Adobe standard string ID to glyph name.  NULL if invalid index.\n   */\n  typedef const char*\n  (*PS_Adobe_Std_StringsFunc)( FT_UInt  string_index );\n\n\n  /*\n   *  Simple unicode -> glyph index charmap built from font glyph names\n   *  table.\n   */\n  typedef struct  PS_UniMap_\n  {\n    FT_UInt32  unicode;      /* bit 31 set: is glyph variant */\n    FT_UInt    glyph_index;\n\n  } PS_UniMap;\n\n\n  typedef struct PS_UnicodesRec_*  PS_Unicodes;\n\n  typedef struct  PS_UnicodesRec_\n  {\n    FT_CMapRec  cmap;\n    FT_UInt     num_maps;\n    PS_UniMap*  maps;\n\n  } PS_UnicodesRec;\n\n\n  /*\n   *  A function which returns a glyph name for a given index.  Returns\n   *  NULL if invalid index.\n   */\n  typedef const char*\n  (*PS_GetGlyphNameFunc)( FT_Pointer  data,\n                          FT_UInt     string_index );\n\n  /*\n   *  A function used to release the glyph name returned by\n   *  PS_GetGlyphNameFunc, when needed\n   */\n  typedef void\n  (*PS_FreeGlyphNameFunc)( FT_Pointer  data,\n                           const char*  name );\n\n  typedef FT_Error\n  (*PS_Unicodes_InitFunc)( FT_Memory             memory,\n                           PS_Unicodes           unicodes,\n                           FT_UInt               num_glyphs,\n                           PS_GetGlyphNameFunc   get_glyph_name,\n                           PS_FreeGlyphNameFunc  free_glyph_name,\n                           FT_Pointer            glyph_data );\n\n  typedef FT_UInt\n  (*PS_Unicodes_CharIndexFunc)( PS_Unicodes  unicodes,\n                                FT_UInt32    unicode );\n\n  typedef FT_UInt32\n  (*PS_Unicodes_CharNextFunc)( PS_Unicodes  unicodes,\n                               FT_UInt32   *unicode );\n\n\n  FT_DEFINE_SERVICE( PsCMaps )\n  {\n    PS_Unicode_ValueFunc       unicode_value;\n\n    PS_Unicodes_InitFunc       unicodes_init;\n    PS_Unicodes_CharIndexFunc  unicodes_char_index;\n    PS_Unicodes_CharNextFunc   unicodes_char_next;\n\n    PS_Macintosh_NameFunc      macintosh_name;\n    PS_Adobe_Std_StringsFunc   adobe_std_strings;\n    const unsigned short*      adobe_std_encoding;\n    const unsigned short*      adobe_expert_encoding;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \\\n                                      unicode_value_,                       \\\n                                      unicodes_init_,                       \\\n                                      unicodes_char_index_,                 \\\n                                      unicodes_char_next_,                  \\\n                                      macintosh_name_,                      \\\n                                      adobe_std_strings_,                   \\\n                                      adobe_std_encoding_,                  \\\n                                      adobe_expert_encoding_ )              \\\n  static const FT_Service_PsCMapsRec  class_ =                              \\\n  {                                                                         \\\n    unicode_value_, unicodes_init_,                                         \\\n    unicodes_char_index_, unicodes_char_next_, macintosh_name_,             \\\n    adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_         \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \\\n                                      unicode_value_,                       \\\n                                      unicodes_init_,                       \\\n                                      unicodes_char_index_,                 \\\n                                      unicodes_char_next_,                  \\\n                                      macintosh_name_,                      \\\n                                      adobe_std_strings_,                   \\\n                                      adobe_std_encoding_,                  \\\n                                      adobe_expert_encoding_ )              \\\n  void                                                                      \\\n  FT_Init_Class_ ## class_( FT_Library              library,                \\\n                            FT_Service_PsCMapsRec*  clazz )                 \\\n  {                                                                         \\\n    FT_UNUSED( library );                                                   \\\n                                                                            \\\n    clazz->unicode_value         = unicode_value_;                          \\\n    clazz->unicodes_init         = unicodes_init_;                          \\\n    clazz->unicodes_char_index   = unicodes_char_index_;                    \\\n    clazz->unicodes_char_next    = unicodes_char_next_;                     \\\n    clazz->macintosh_name        = macintosh_name_;                         \\\n    clazz->adobe_std_strings     = adobe_std_strings_;                      \\\n    clazz->adobe_std_encoding    = adobe_std_encoding_;                     \\\n    clazz->adobe_expert_encoding = adobe_expert_encoding_;                  \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPSCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svpsinfo.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svpsinfo.h                                                             */\n/*                                                                         */\n/*    The FreeType PostScript info service (specification).                */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2009, 2011, 2012 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVPSINFO_H__\n#define __SVPSINFO_H__\n\n#include FT_INTERNAL_SERVICE_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_POSTSCRIPT_INFO  \"postscript-info\"\n\n\n  typedef FT_Error\n  (*PS_GetFontInfoFunc)( FT_Face          face,\n                         PS_FontInfoRec*  afont_info );\n\n  typedef FT_Error\n  (*PS_GetFontExtraFunc)( FT_Face           face,\n                          PS_FontExtraRec*  afont_extra );\n\n  typedef FT_Int\n  (*PS_HasGlyphNamesFunc)( FT_Face  face );\n\n  typedef FT_Error\n  (*PS_GetFontPrivateFunc)( FT_Face         face,\n                            PS_PrivateRec*  afont_private );\n\n  typedef FT_Long\n  (*PS_GetFontValueFunc)( FT_Face       face,\n                          PS_Dict_Keys  key,\n                          FT_UInt       idx,\n                          void         *value,\n                          FT_Long       value_len );\n\n\n  FT_DEFINE_SERVICE( PsInfo )\n  {\n    PS_GetFontInfoFunc     ps_get_font_info;\n    PS_GetFontExtraFunc    ps_get_font_extra;\n    PS_HasGlyphNamesFunc   ps_has_glyph_names;\n    PS_GetFontPrivateFunc  ps_get_font_private;\n    PS_GetFontValueFunc    ps_get_font_value;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \\\n                                     get_font_info_,             \\\n                                     ps_get_font_extra_,         \\\n                                     has_glyph_names_,           \\\n                                     get_font_private_,          \\\n                                     get_font_value_ )           \\\n  static const FT_Service_PsInfoRec  class_ =                    \\\n  {                                                              \\\n    get_font_info_, ps_get_font_extra_, has_glyph_names_,        \\\n    get_font_private_, get_font_value_                           \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \\\n                                     get_font_info_,             \\\n                                     ps_get_font_extra_,         \\\n                                     has_glyph_names_,           \\\n                                     get_font_private_,          \\\n                                     get_font_value_ )           \\\n  void                                                           \\\n  FT_Init_Class_ ## class_( FT_Library             library,      \\\n                            FT_Service_PsInfoRec*  clazz )       \\\n  {                                                              \\\n    FT_UNUSED( library );                                        \\\n                                                                 \\\n    clazz->ps_get_font_info    = get_font_info_;                 \\\n    clazz->ps_get_font_extra   = ps_get_font_extra_;             \\\n    clazz->ps_has_glyph_names  = has_glyph_names_;               \\\n    clazz->ps_get_font_private = get_font_private_;              \\\n    clazz->ps_get_font_value   = get_font_value_;                \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVPSINFO_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svsfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svsfnt.h                                                               */\n/*                                                                         */\n/*    The FreeType SFNT table loading service (specification).             */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVSFNT_H__\n#define __SVSFNT_H__\n\n#include FT_INTERNAL_SERVICE_H\n#include FT_TRUETYPE_TABLES_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  SFNT table loading service.\n   */\n\n#define FT_SERVICE_ID_SFNT_TABLE  \"sfnt-table\"\n\n\n  /*\n   * Used to implement FT_Load_Sfnt_Table().\n   */\n  typedef FT_Error\n  (*FT_SFNT_TableLoadFunc)( FT_Face    face,\n                            FT_ULong   tag,\n                            FT_Long    offset,\n                            FT_Byte*   buffer,\n                            FT_ULong*  length );\n\n  /*\n   * Used to implement FT_Get_Sfnt_Table().\n   */\n  typedef void*\n  (*FT_SFNT_TableGetFunc)( FT_Face      face,\n                           FT_Sfnt_Tag  tag );\n\n\n  /*\n   * Used to implement FT_Sfnt_Table_Info().\n   */\n  typedef FT_Error\n  (*FT_SFNT_TableInfoFunc)( FT_Face    face,\n                            FT_UInt    idx,\n                            FT_ULong  *tag,\n                            FT_ULong  *offset,\n                            FT_ULong  *length );\n\n\n  FT_DEFINE_SERVICE( SFNT_Table )\n  {\n    FT_SFNT_TableLoadFunc  load_table;\n    FT_SFNT_TableGetFunc   get_table;\n    FT_SFNT_TableInfoFunc  table_info;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ )  \\\n  static const FT_Service_SFNT_TableRec  class_ =                      \\\n  {                                                                    \\\n    load_, get_, info_                                                 \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \\\n  void                                                                \\\n  FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec*  clazz )        \\\n  {                                                                   \\\n    clazz->load_table = load_;                                        \\\n    clazz->get_table  = get_;                                         \\\n    clazz->table_info = info_;                                        \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVSFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svttcmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svttcmap.h                                                             */\n/*                                                                         */\n/*    The FreeType TrueType/sfnt cmap extra information service.           */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  Masatake YAMATO, Redhat K.K.                                           */\n/*                                                                         */\n/*  Copyright 2003, 2008, 2009, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/* Development of this service is support of\n   Information-technology Promotion Agency, Japan. */\n\n#ifndef __SVTTCMAP_H__\n#define __SVTTCMAP_H__\n\n#include FT_INTERNAL_SERVICE_H\n#include FT_TRUETYPE_TABLES_H\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_TT_CMAP  \"tt-cmaps\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_CMapInfo                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to store TrueType/sfnt specific cmap information  */\n  /*    which is not covered by the generic @FT_CharMap structure.  This   */\n  /*    structure can be accessed with the @FT_Get_TT_CMap_Info function.  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    language ::                                                        */\n  /*      The language ID used in Mac fonts.  Definitions of values are in */\n  /*      freetype/ttnameid.h.                                             */\n  /*                                                                       */\n  /*    format ::                                                          */\n  /*      The cmap format.  OpenType 1.5 defines the formats 0 (byte       */\n  /*      encoding table), 2~(high-byte mapping through table), 4~(segment */\n  /*      mapping to delta values), 6~(trimmed table mapping), 8~(mixed    */\n  /*      16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented   */\n  /*      coverage), and 14 (Unicode Variation Sequences).                 */\n  /*                                                                       */\n  typedef struct  TT_CMapInfo_\n  {\n    FT_ULong  language;\n    FT_Long   format;\n\n  } TT_CMapInfo;\n\n\n  typedef FT_Error\n  (*TT_CMap_Info_GetFunc)( FT_CharMap    charmap,\n                           TT_CMapInfo  *cmap_info );\n\n\n  FT_DEFINE_SERVICE( TTCMaps )\n  {\n    TT_CMap_Info_GetFunc  get_cmap_info;\n  };\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \\\n  static const FT_Service_TTCMapsRec  class_ =                  \\\n  {                                                             \\\n    get_cmap_info_                                              \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \\\n  void                                                          \\\n  FT_Init_Class_ ## class_( FT_Library              library,    \\\n                            FT_Service_TTCMapsRec*  clazz )     \\\n  {                                                             \\\n    FT_UNUSED( library );                                       \\\n                                                                \\\n    clazz->get_cmap_info = get_cmap_info_;                      \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __SVTTCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svtteng.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svtteng.h                                                              */\n/*                                                                         */\n/*    The FreeType TrueType engine query service (specification).          */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVTTENG_H__\n#define __SVTTENG_H__\n\n#include FT_INTERNAL_SERVICE_H\n#include FT_MODULE_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  SFNT table loading service.\n   */\n\n#define FT_SERVICE_ID_TRUETYPE_ENGINE  \"truetype-engine\"\n\n  /*\n   * Used to implement FT_Get_TrueType_Engine_Type\n   */\n\n  FT_DEFINE_SERVICE( TrueTypeEngine )\n  {\n    FT_TrueTypeEngineType  engine_type;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVTTENG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svttglyf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svttglyf.h                                                             */\n/*                                                                         */\n/*    The FreeType TrueType glyph service.                                 */\n/*                                                                         */\n/*  Copyright 2007, 2009, 2012 by David Turner.                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#ifndef __SVTTGLYF_H__\n#define __SVTTGLYF_H__\n\n#include FT_INTERNAL_SERVICE_H\n#include FT_TRUETYPE_TABLES_H\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_TT_GLYF  \"tt-glyf\"\n\n\n  typedef FT_ULong\n  (*TT_Glyf_GetLocationFunc)( FT_Face    face,\n                              FT_UInt    gindex,\n                              FT_ULong  *psize );\n\n  FT_DEFINE_SERVICE( TTGlyf )\n  {\n    TT_Glyf_GetLocationFunc  get_location;\n  };\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \\\n  static const FT_Service_TTGlyfRec  class_ =                 \\\n  {                                                           \\\n    get_location_                                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \\\n  void                                                        \\\n  FT_Init_Class_ ## class_( FT_Service_TTGlyfRec*  clazz )    \\\n  {                                                           \\\n    clazz->get_location = get_location_;                      \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __SVTTGLYF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svwinfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svwinfnt.h                                                             */\n/*                                                                         */\n/*    The FreeType Windows FNT/FONT service (specification).               */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVWINFNT_H__\n#define __SVWINFNT_H__\n\n#include FT_INTERNAL_SERVICE_H\n#include FT_WINFONTS_H\n\n\nFT_BEGIN_HEADER\n\n\n#define FT_SERVICE_ID_WINFNT  \"winfonts\"\n\n  typedef FT_Error\n  (*FT_WinFnt_GetHeaderFunc)( FT_Face               face,\n                              FT_WinFNT_HeaderRec  *aheader );\n\n\n  FT_DEFINE_SERVICE( WinFnt )\n  {\n    FT_WinFnt_GetHeaderFunc  get_header;\n  };\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVWINFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/services/svxf86nm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  svxf86nm.h                                                             */\n/*                                                                         */\n/*    The FreeType XFree86 services (specification only).                  */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SVXF86NM_H__\n#define __SVXF86NM_H__\n\n#include FT_INTERNAL_SERVICE_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  A trivial service used to return the name of a face's font driver,\n   *  according to the XFree86 nomenclature.  Note that the service data\n   *  is a simple constant string pointer.\n   */\n\n#define FT_SERVICE_ID_XF86_NAME  \"xf86-driver-name\"\n\n#define FT_XF86_FORMAT_TRUETYPE  \"TrueType\"\n#define FT_XF86_FORMAT_TYPE_1    \"Type 1\"\n#define FT_XF86_FORMAT_BDF       \"BDF\"\n#define FT_XF86_FORMAT_PCF       \"PCF\"\n#define FT_XF86_FORMAT_TYPE_42   \"Type 42\"\n#define FT_XF86_FORMAT_CID       \"CID Type 1\"\n#define FT_XF86_FORMAT_CFF       \"CFF\"\n#define FT_XF86_FORMAT_PFR       \"PFR\"\n#define FT_XF86_FORMAT_WINFNT    \"Windows FNT\"\n\n  /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __SVXF86NM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/sfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfnt.h                                                                 */\n/*                                                                         */\n/*    High-level `sfnt' driver interface (specification).                  */\n/*                                                                         */\n/*  Copyright 1996-2006, 2009, 2012 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SFNT_H__\n#define __SFNT_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Init_Face_Func                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    First part of the SFNT face object initialization.  This finds     */\n  /*    the face in a SFNT file or collection, and load its format tag in  */\n  /*    face->format_tag.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The input stream.                                    */\n  /*                                                                       */\n  /*    face       :: A handle to the target face object.                  */\n  /*                                                                       */\n  /*    face_index :: The index of the TrueType font, if we are opening a  */\n  /*                  collection.                                          */\n  /*                                                                       */\n  /*    num_params :: The number of additional parameters.                 */\n  /*                                                                       */\n  /*    params     :: Optional additional parameters.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be at the font file's origin.               */\n  /*                                                                       */\n  /*    This function recognizes fonts embedded in a `TrueType             */\n  /*    collection'.                                                       */\n  /*                                                                       */\n  /*    Once the format tag has been validated by the font driver, it      */\n  /*    should then call the TT_Load_Face_Func() callback to read the rest */\n  /*    of the SFNT tables in the object.                                  */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Init_Face_Func)( FT_Stream      stream,\n                        TT_Face        face,\n                        FT_Int         face_index,\n                        FT_Int         num_params,\n                        FT_Parameter*  params );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Face_Func                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Second part of the SFNT face object initialization.  This loads    */\n  /*    the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the    */\n  /*    face object.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The input stream.                                    */\n  /*                                                                       */\n  /*    face       :: A handle to the target face object.                  */\n  /*                                                                       */\n  /*    face_index :: The index of the TrueType font, if we are opening a  */\n  /*                  collection.                                          */\n  /*                                                                       */\n  /*    num_params :: The number of additional parameters.                 */\n  /*                                                                       */\n  /*    params     :: Optional additional parameters.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function must be called after TT_Init_Face_Func().            */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Face_Func)( FT_Stream      stream,\n                        TT_Face        face,\n                        FT_Int         face_index,\n                        FT_Int         num_params,\n                        FT_Parameter*  params );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Done_Face_Func                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A callback used to delete the common SFNT data from a face.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the target face object.                        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does NOT destroy the face object.                    */\n  /*                                                                       */\n  typedef void\n  (*TT_Done_Face_Func)( TT_Face  face );\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_SFNT_HeaderRec_Func                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the header of a SFNT font file.  Supports collections.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: A handle to the target face object.                  */\n  /*                                                                       */\n  /*    stream     :: The input stream.                                    */\n  /*                                                                       */\n  /*    face_index :: The index of the TrueType font, if we are opening a  */\n  /*                  collection.                                          */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    sfnt       :: The SFNT header.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be at the font file's origin.               */\n  /*                                                                       */\n  /*    This function recognizes fonts embedded in a `TrueType             */\n  /*    collection'.                                                       */\n  /*                                                                       */\n  /*    This function checks that the header is valid by looking at the    */\n  /*    values of `search_range', `entry_selector', and `range_shift'.     */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_SFNT_HeaderRec_Func)( TT_Face      face,\n                                  FT_Stream    stream,\n                                  FT_Long      face_index,\n                                  SFNT_Header  sfnt );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Directory_Func                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the table directory into a face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /*    sfnt   :: The SFNT header.                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be on the first byte after the 4-byte font  */\n  /*    format tag.  This is the case just after a call to                 */\n  /*    TT_Load_Format_Tag().                                              */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Directory_Func)( TT_Face      face,\n                             FT_Stream    stream,\n                             SFNT_Header  sfnt );\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Any_Func                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load any font table into client memory.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: The face object to look for.                             */\n  /*                                                                       */\n  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */\n  /*              to access the whole font file, else set this parameter   */\n  /*              to a valid TrueType table tag that you can forge with    */\n  /*              the MAKE_TT_TAG macro.                                   */\n  /*                                                                       */\n  /*    offset :: The starting offset in the table (or the file if         */\n  /*              tag == 0).                                               */\n  /*                                                                       */\n  /*    length :: The address of the decision variable:                    */\n  /*                                                                       */\n  /*                If length == NULL:                                     */\n  /*                  Loads the whole table.  Returns an error if          */\n  /*                  `offset' == 0!                                       */\n  /*                                                                       */\n  /*                If *length == 0:                                       */\n  /*                  Exits immediately; returning the length of the given */\n  /*                  table or of the font file, depending on the value of */\n  /*                  `tag'.                                               */\n  /*                                                                       */\n  /*                If *length != 0:                                       */\n  /*                  Loads the next `length' bytes of table or font,      */\n  /*                  starting at offset `offset' (in table or font too).  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    buffer :: The address of target buffer.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    TrueType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Any_Func)( TT_Face    face,\n                       FT_ULong   tag,\n                       FT_Long    offset,\n                       FT_Byte   *buffer,\n                       FT_ULong*  length );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Find_SBit_Image_Func                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check whether an embedded bitmap (an `sbit') exists for a given    */\n  /*    glyph, at a given strike.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    glyph_index   :: The glyph index.                                  */\n  /*                                                                       */\n  /*    strike_index  :: The current strike index.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    arange        :: The SBit range containing the glyph index.        */\n  /*                                                                       */\n  /*    astrike       :: The SBit strike containing the glyph index.       */\n  /*                                                                       */\n  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns                    */\n  /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */\n  /*    glyph.                                                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Find_SBit_Image_Func)( TT_Face          face,\n                              FT_UInt          glyph_index,\n                              FT_ULong         strike_index,\n                              TT_SBit_Range   *arange,\n                              TT_SBit_Strike  *astrike,\n                              FT_ULong        *aglyph_offset );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_SBit_Metrics_Func                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the big metrics for a given embedded bitmap.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream      :: The input stream.                                   */\n  /*                                                                       */\n  /*    range       :: The SBit range containing the glyph.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    big_metrics :: A big SBit metrics structure for the glyph.         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be positioned at the glyph's offset within  */\n  /*    the `EBDT' table before the call.                                  */\n  /*                                                                       */\n  /*    If the image format uses variable metrics, the stream cursor is    */\n  /*    positioned just after the metrics header in the `EBDT' table on    */\n  /*    function exit.                                                     */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_SBit_Metrics_Func)( FT_Stream        stream,\n                                TT_SBit_Range    range,\n                                TT_SBit_Metrics  metrics );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_SBit_Image_Func                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load a given glyph sbit image from the font resource.  This also   */\n  /*    returns its metrics.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face ::                                                            */\n  /*      The target face object.                                          */\n  /*                                                                       */\n  /*    strike_index ::                                                    */\n  /*      The strike index.                                                */\n  /*                                                                       */\n  /*    glyph_index ::                                                     */\n  /*      The current glyph index.                                         */\n  /*                                                                       */\n  /*    load_flags ::                                                      */\n  /*      The current load flags.                                          */\n  /*                                                                       */\n  /*    stream ::                                                          */\n  /*      The input stream.                                                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    amap ::                                                            */\n  /*      The target pixmap.                                               */\n  /*                                                                       */\n  /*    ametrics ::                                                        */\n  /*      A big sbit metrics structure for the glyph image.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    glyph sbit exists for the index.                                   */\n  /*                                                                       */\n  /*  <Note>                                                               */\n  /*    The `map.buffer' field is always freed before the glyph is loaded. */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_SBit_Image_Func)( TT_Face              face,\n                              FT_ULong             strike_index,\n                              FT_UInt              glyph_index,\n                              FT_UInt              load_flags,\n                              FT_Stream            stream,\n                              FT_Bitmap           *amap,\n                              TT_SBit_MetricsRec  *ametrics );\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Set_SBit_Strike_OldFunc                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select an sbit strike for a given size request.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    req           :: The size request.                                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    astrike_index :: The index of the sbit strike.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    sbit strike exists for the selected ppem values.                   */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Set_SBit_Strike_OldFunc)( TT_Face    face,\n                                 FT_UInt    x_ppem,\n                                 FT_UInt    y_ppem,\n                                 FT_ULong*  astrike_index );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_CharMap_Load_Func                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads a given TrueType character map into memory.                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the parent face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the current stream object.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    cmap   :: A pointer to a cmap object.                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The function assumes that the stream is already in use (i.e.,      */\n  /*    opened).  In case of error, all partially allocated tables are     */\n  /*    released.                                                          */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_CharMap_Load_Func)( TT_Face    face,\n                           void*      cmap,\n                           FT_Stream  input );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_CharMap_Free_Func                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroys a character mapping table.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the parent face object.                        */\n  /*                                                                       */\n  /*    cmap :: A handle to a cmap object.                                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_CharMap_Free_Func)( TT_Face       face,\n                           void*         cmap );\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Set_SBit_Strike_Func                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Select an sbit strike for a given size request.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    req           :: The size request.                                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    astrike_index :: The index of the sbit strike.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    sbit strike exists for the selected ppem values.                   */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Set_SBit_Strike_Func)( TT_Face          face,\n                              FT_Size_Request  req,\n                              FT_ULong*        astrike_index );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Strike_Metrics_Func                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the metrics of a given strike.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    strike_index  :: The strike index.                                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    metrics       :: the metrics of the strike.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    such sbit strike exists.                                           */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Strike_Metrics_Func)( TT_Face           face,\n                                  FT_ULong          strike_index,\n                                  FT_Size_Metrics*  metrics );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Get_PS_Name_Func                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the PostScript glyph name of a glyph.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    idx  :: The glyph index.                                           */\n  /*                                                                       */\n  /*    PSname :: The address of a string pointer.  Will be NULL in case   */\n  /*              of error, otherwise it is a pointer to the glyph name.   */\n  /*                                                                       */\n  /*              You must not modify the returned string!                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Get_PS_Name_Func)( TT_Face      face,\n                          FT_UInt      idx,\n                          FT_String**  PSname );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Metrics_Func                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load a metrics table, which is a table with a horizontal and a     */\n  /*    vertical version.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load the vertical one.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Metrics_Func)( TT_Face    face,\n                           FT_Stream  stream,\n                           FT_Bool    vertical );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Get_Metrics_Func                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the horizontal or vertical header in a face object.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load vertical metrics.        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Get_Metrics_Func)( TT_Face     face,\n                          FT_Bool     vertical,\n                          FT_UInt     gindex,\n                          FT_Short*   abearing,\n                          FT_UShort*  aadvance );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Load_Table_Func                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load a given TrueType table.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The function uses `face->goto_table' to seek the stream to the     */\n  /*    start of the table, except while loading the font directory.       */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Load_Table_Func)( TT_Face    face,\n                         FT_Stream  stream );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Free_Table_Func                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Free a given TrueType table.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the target face object.                        */\n  /*                                                                       */\n  typedef void\n  (*TT_Free_Table_Func)( TT_Face  face );\n\n\n  /*\n   * @functype:\n   *    TT_Face_GetKerningFunc\n   *\n   * @description:\n   *    Return the horizontal kerning value between two glyphs.\n   *\n   * @input:\n   *    face        :: A handle to the source face object.\n   *    left_glyph  :: The left glyph index.\n   *    right_glyph :: The right glyph index.\n   *\n   * @return:\n   *    The kerning value in font units.\n   */\n  typedef FT_Int\n  (*TT_Face_GetKerningFunc)( TT_Face  face,\n                             FT_UInt  left_glyph,\n                             FT_UInt  right_glyph );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    SFNT_Interface                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure holds pointers to the functions used to load and    */\n  /*    free the basic tables that are required in a `sfnt' font file.     */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Check the various xxx_Func() descriptions for details.             */\n  /*                                                                       */\n  typedef struct  SFNT_Interface_\n  {\n    TT_Loader_GotoTableFunc      goto_table;\n\n    TT_Init_Face_Func            init_face;\n    TT_Load_Face_Func            load_face;\n    TT_Done_Face_Func            done_face;\n    FT_Module_Requester          get_interface;\n\n    TT_Load_Any_Func             load_any;\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    TT_Load_SFNT_HeaderRec_Func  load_sfnt_header;\n    TT_Load_Directory_Func       load_directory;\n#endif\n\n    /* these functions are called by `load_face' but they can also  */\n    /* be called from external modules, if there is a need to do so */\n    TT_Load_Table_Func           load_head;\n    TT_Load_Metrics_Func         load_hhea;\n    TT_Load_Table_Func           load_cmap;\n    TT_Load_Table_Func           load_maxp;\n    TT_Load_Table_Func           load_os2;\n    TT_Load_Table_Func           load_post;\n\n    TT_Load_Table_Func           load_name;\n    TT_Free_Table_Func           free_name;\n\n    /* optional tables */\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    TT_Load_Table_Func           load_hdmx_stub;\n    TT_Free_Table_Func           free_hdmx_stub;\n#endif\n\n    /* this field was called `load_kerning' up to version 2.1.10 */\n    TT_Load_Table_Func           load_kern;\n\n    TT_Load_Table_Func           load_gasp;\n    TT_Load_Table_Func           load_pclt;\n\n    /* see `ttload.h'; this field was called `load_bitmap_header' up to */\n    /* version 2.1.10                                                   */\n    TT_Load_Table_Func           load_bhed;\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n    /* see `ttsbit.h' */\n    TT_Set_SBit_Strike_OldFunc   set_sbit_strike_stub;\n    TT_Load_Table_Func           load_sbits_stub;\n\n    /*\n     *  The following two fields appeared in version 2.1.8, and were placed\n     *  between `load_sbits' and `load_sbit_image'.  We support them as a\n     *  special exception since they are used by Xfont library within the\n     *  X.Org xserver, and because the probability that other rogue clients\n     *  use the other version 2.1.7 fields below is _extremely_ low.\n     *\n     *  Note that this forces us to disable an interesting memory-saving\n     *  optimization though...\n     */\n\n    TT_Find_SBit_Image_Func      find_sbit_image;\n    TT_Load_SBit_Metrics_Func    load_sbit_metrics;\n\n#endif\n\n    TT_Load_SBit_Image_Func      load_sbit_image;\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    TT_Free_Table_Func           free_sbits_stub;\n#endif\n\n    /* see `ttpost.h' */\n    TT_Get_PS_Name_Func          get_psname;\n    TT_Free_Table_Func           free_psnames;\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    TT_CharMap_Load_Func         load_charmap_stub;\n    TT_CharMap_Free_Func         free_charmap_stub;\n#endif\n\n    /* starting here, the structure differs from version 2.1.7 */\n\n    /* this field was introduced in version 2.1.8, named `get_psname' */\n    TT_Face_GetKerningFunc       get_kerning;\n\n    /* new elements introduced after version 2.1.10 */\n\n    /* load the font directory, i.e., the offset table and */\n    /* the table directory                                 */\n    TT_Load_Table_Func           load_font_dir;\n    TT_Load_Metrics_Func         load_hmtx;\n\n    TT_Load_Table_Func           load_eblc;\n    TT_Free_Table_Func           free_eblc;\n\n    TT_Set_SBit_Strike_Func      set_sbit_strike;\n    TT_Load_Strike_Metrics_Func  load_strike_metrics;\n\n    TT_Get_Metrics_Func          get_metrics;\n\n  } SFNT_Interface;\n\n\n  /* transitional */\n  typedef SFNT_Interface*   SFNT_Service;\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n#define FT_DEFINE_DRIVERS_OLD_INTERNAL( a )  \\\n          a,\n#else\n#define FT_DEFINE_DRIVERS_OLD_INTERNAL( a )  /* empty */\n#endif\n\n#define FT_INTERNAL( a ) \\\n          a,\n\n#define FT_DEFINE_SFNT_INTERFACE(                            \\\n          class_,                                            \\\n          goto_table_,                                       \\\n          init_face_,                                        \\\n          load_face_,                                        \\\n          done_face_,                                        \\\n          get_interface_,                                    \\\n          load_any_,                                         \\\n          load_sfnt_header_,                                 \\\n          load_directory_,                                   \\\n          load_head_,                                        \\\n          load_hhea_,                                        \\\n          load_cmap_,                                        \\\n          load_maxp_,                                        \\\n          load_os2_,                                         \\\n          load_post_,                                        \\\n          load_name_,                                        \\\n          free_name_,                                        \\\n          load_hdmx_stub_,                                   \\\n          free_hdmx_stub_,                                   \\\n          load_kern_,                                        \\\n          load_gasp_,                                        \\\n          load_pclt_,                                        \\\n          load_bhed_,                                        \\\n          set_sbit_strike_stub_,                             \\\n          load_sbits_stub_,                                  \\\n          find_sbit_image_,                                  \\\n          load_sbit_metrics_,                                \\\n          load_sbit_image_,                                  \\\n          free_sbits_stub_,                                  \\\n          get_psname_,                                       \\\n          free_psnames_,                                     \\\n          load_charmap_stub_,                                \\\n          free_charmap_stub_,                                \\\n          get_kerning_,                                      \\\n          load_font_dir_,                                    \\\n          load_hmtx_,                                        \\\n          load_eblc_,                                        \\\n          free_eblc_,                                        \\\n          set_sbit_strike_,                                  \\\n          load_strike_metrics_,                              \\\n          get_metrics_ )                                     \\\n  static const SFNT_Interface  class_ =                      \\\n  {                                                          \\\n    FT_INTERNAL( goto_table_ )                               \\\n    FT_INTERNAL( init_face_ )                                \\\n    FT_INTERNAL( load_face_ )                                \\\n    FT_INTERNAL( done_face_ )                                \\\n    FT_INTERNAL( get_interface_ )                            \\\n    FT_INTERNAL( load_any_ )                                 \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_sfnt_header_ )      \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_directory_ )        \\\n    FT_INTERNAL( load_head_ )                                \\\n    FT_INTERNAL( load_hhea_ )                                \\\n    FT_INTERNAL( load_cmap_ )                                \\\n    FT_INTERNAL( load_maxp_ )                                \\\n    FT_INTERNAL( load_os2_ )                                 \\\n    FT_INTERNAL( load_post_ )                                \\\n    FT_INTERNAL( load_name_ )                                \\\n    FT_INTERNAL( free_name_ )                                \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_hdmx_stub_ )        \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( free_hdmx_stub_ )        \\\n    FT_INTERNAL( load_kern_ )                                \\\n    FT_INTERNAL( load_gasp_ )                                \\\n    FT_INTERNAL( load_pclt_ )                                \\\n    FT_INTERNAL( load_bhed_ )                                \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( set_sbit_strike_stub_ )  \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_sbits_stub_ )       \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( find_sbit_image_ )       \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_sbit_metrics_ )     \\\n    FT_INTERNAL( load_sbit_image_ )                          \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( free_sbits_stub_ )       \\\n    FT_INTERNAL( get_psname_ )                               \\\n    FT_INTERNAL( free_psnames_ )                             \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_charmap_stub_ )     \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( free_charmap_stub_ )     \\\n    FT_INTERNAL( get_kerning_ )                              \\\n    FT_INTERNAL( load_font_dir_ )                            \\\n    FT_INTERNAL( load_hmtx_ )                                \\\n    FT_INTERNAL( load_eblc_ )                                \\\n    FT_INTERNAL( free_eblc_ )                                \\\n    FT_INTERNAL( set_sbit_strike_ )                          \\\n    FT_INTERNAL( load_strike_metrics_ )                      \\\n    FT_INTERNAL( get_metrics_ )                              \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n#define FT_DEFINE_DRIVERS_OLD_INTERNAL( a, a_ )  \\\n          clazz->a = a_;\n#else\n#define FT_DEFINE_DRIVERS_OLD_INTERNAL( a, a_ )  /* empty */\n#endif\n\n#define FT_INTERNAL( a, a_ )  \\\n          clazz->a = a_;\n\n#define FT_DEFINE_SFNT_INTERFACE(                             \\\n          class_,                                             \\\n          goto_table_,                                        \\\n          init_face_,                                         \\\n          load_face_,                                         \\\n          done_face_,                                         \\\n          get_interface_,                                     \\\n          load_any_,                                          \\\n          load_sfnt_header_,                                  \\\n          load_directory_,                                    \\\n          load_head_,                                         \\\n          load_hhea_,                                         \\\n          load_cmap_,                                         \\\n          load_maxp_,                                         \\\n          load_os2_,                                          \\\n          load_post_,                                         \\\n          load_name_,                                         \\\n          free_name_,                                         \\\n          load_hdmx_stub_,                                    \\\n          free_hdmx_stub_,                                    \\\n          load_kern_,                                         \\\n          load_gasp_,                                         \\\n          load_pclt_,                                         \\\n          load_bhed_,                                         \\\n          set_sbit_strike_stub_,                              \\\n          load_sbits_stub_,                                   \\\n          find_sbit_image_,                                   \\\n          load_sbit_metrics_,                                 \\\n          load_sbit_image_,                                   \\\n          free_sbits_stub_,                                   \\\n          get_psname_,                                        \\\n          free_psnames_,                                      \\\n          load_charmap_stub_,                                 \\\n          free_charmap_stub_,                                 \\\n          get_kerning_,                                       \\\n          load_font_dir_,                                     \\\n          load_hmtx_,                                         \\\n          load_eblc_,                                         \\\n          free_eblc_,                                         \\\n          set_sbit_strike_,                                   \\\n          load_strike_metrics_,                               \\\n          get_metrics_ )                                      \\\n  void                                                        \\\n  FT_Init_Class_ ## class_( FT_Library       library,         \\\n                            SFNT_Interface*  clazz )          \\\n  {                                                           \\\n    FT_UNUSED( library );                                     \\\n                                                              \\\n    FT_INTERNAL( goto_table, goto_table_ )                    \\\n    FT_INTERNAL( init_face, init_face_ )                      \\\n    FT_INTERNAL( load_face, load_face_ )                      \\\n    FT_INTERNAL( done_face, done_face_ )                      \\\n    FT_INTERNAL( get_interface, get_interface_ )              \\\n    FT_INTERNAL( load_any, load_any_ )                        \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_sfnt_header,         \\\n                                    load_sfnt_header_ )       \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_directory,           \\\n                                    load_directory_ )         \\\n    FT_INTERNAL( load_head, load_head_ )                      \\\n    FT_INTERNAL( load_hhea, load_hhea_ )                      \\\n    FT_INTERNAL( load_cmap, load_cmap_ )                      \\\n    FT_INTERNAL( load_maxp, load_maxp_ )                      \\\n    FT_INTERNAL( load_os2, load_os2_ )                        \\\n    FT_INTERNAL( load_post, load_post_ )                      \\\n    FT_INTERNAL( load_name, load_name_ )                      \\\n    FT_INTERNAL( free_name, free_name_ )                      \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_hdmx_stub,           \\\n                                    load_hdmx_stub_ )         \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( free_hdmx_stub,           \\\n                                    free_hdmx_stub_ )         \\\n    FT_INTERNAL( load_kern, load_kern_ )                      \\\n    FT_INTERNAL( load_gasp, load_gasp_ )                      \\\n    FT_INTERNAL( load_pclt, load_pclt_ )                      \\\n    FT_INTERNAL( load_bhed, load_bhed_ )                      \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( set_sbit_strike_stub,     \\\n                                    set_sbit_strike_stub_ )   \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_sbits_stub,          \\\n                                    load_sbits_stub_ )        \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( find_sbit_image,          \\\n                                    find_sbit_image_ )        \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_sbit_metrics,        \\\n                                    load_sbit_metrics_ )      \\\n    FT_INTERNAL( load_sbit_image, load_sbit_image_ )          \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( free_sbits_stub,          \\\n                                    free_sbits_stub_ )        \\\n    FT_INTERNAL( get_psname, get_psname_ )                    \\\n    FT_INTERNAL( free_psnames, free_psnames_ )                \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( load_charmap_stub,        \\\n                                    load_charmap_stub_ )      \\\n    FT_DEFINE_DRIVERS_OLD_INTERNAL( free_charmap_stub,        \\\n                                    free_charmap_stub_ )      \\\n    FT_INTERNAL( get_kerning, get_kerning_ )                  \\\n    FT_INTERNAL( load_font_dir, load_font_dir_ )              \\\n    FT_INTERNAL( load_hmtx, load_hmtx_ )                      \\\n    FT_INTERNAL( load_eblc, load_eblc_ )                      \\\n    FT_INTERNAL( free_eblc, free_eblc_ )                      \\\n    FT_INTERNAL( set_sbit_strike, set_sbit_strike_ )          \\\n    FT_INTERNAL( load_strike_metrics, load_strike_metrics_ )  \\\n    FT_INTERNAL( get_metrics, get_metrics_ )                  \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\nFT_END_HEADER\n\n#endif /* __SFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/t1types.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1types.h                                                              */\n/*                                                                         */\n/*    Basic Type1/Type2 type definitions and interface (specification      */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1TYPES_H__\n#define __T1TYPES_H__\n\n\n#include <ft2build.h>\n#include FT_TYPE1_TABLES_H\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n#include FT_INTERNAL_SERVICE_H\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***              REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS              ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_EncodingRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling a custom encoding.                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_chars  :: The number of character codes in the encoding.       */\n  /*                  Usually 256.                                         */\n  /*                                                                       */\n  /*    code_first :: The lowest valid character code in the encoding.     */\n  /*                                                                       */\n  /*    code_last  :: The highest valid character code in the encoding     */\n  /*                  + 1. When equal to code_first there are no valid     */\n  /*                  character codes.                                     */\n  /*                                                                       */\n  /*    char_index :: An array of corresponding glyph indices.             */\n  /*                                                                       */\n  /*    char_name  :: An array of corresponding glyph names.               */\n  /*                                                                       */\n  typedef struct  T1_EncodingRecRec_\n  {\n    FT_Int       num_chars;\n    FT_Int       code_first;\n    FT_Int       code_last;\n\n    FT_UShort*   char_index;\n    FT_String**  char_name;\n\n  } T1_EncodingRec, *T1_Encoding;\n\n\n  /* used to hold extra data of PS_FontInfoRec that\n   * cannot be stored in the publicly defined structure.\n   *\n   * Note these can't be blended with multiple-masters.\n   */\n  typedef struct  PS_FontExtraRec_\n  {\n    FT_UShort  fs_type;\n\n  } PS_FontExtraRec;\n\n\n  typedef struct  T1_FontRec_\n  {\n    PS_FontInfoRec   font_info;         /* font info dictionary   */\n    PS_FontExtraRec  font_extra;        /* font info extra fields */\n    PS_PrivateRec    private_dict;      /* private dictionary     */\n    FT_String*       font_name;         /* top-level dictionary   */\n\n    T1_EncodingType  encoding_type;\n    T1_EncodingRec   encoding;\n\n    FT_Byte*         subrs_block;\n    FT_Byte*         charstrings_block;\n    FT_Byte*         glyph_names_block;\n\n    FT_Int           num_subrs;\n    FT_Byte**        subrs;\n    FT_PtrDist*      subrs_len;\n\n    FT_Int           num_glyphs;\n    FT_String**      glyph_names;       /* array of glyph names       */\n    FT_Byte**        charstrings;       /* array of glyph charstrings */\n    FT_PtrDist*      charstrings_len;\n\n    FT_Byte          paint_type;\n    FT_Byte          font_type;\n    FT_Matrix        font_matrix;\n    FT_Vector        font_offset;\n    FT_BBox          font_bbox;\n    FT_Long          font_id;\n\n    FT_Fixed         stroke_width;\n\n  } T1_FontRec, *T1_Font;\n\n\n  typedef struct  CID_SubrsRec_\n  {\n    FT_UInt    num_subrs;\n    FT_Byte**  code;\n\n  } CID_SubrsRec, *CID_Subrs;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                AFM FONT INFORMATION STRUCTURES                    ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  AFM_TrackKernRec_\n  {\n    FT_Int    degree;\n    FT_Fixed  min_ptsize;\n    FT_Fixed  min_kern;\n    FT_Fixed  max_ptsize;\n    FT_Fixed  max_kern;\n\n  } AFM_TrackKernRec, *AFM_TrackKern;\n\n  typedef struct  AFM_KernPairRec_\n  {\n    FT_Int  index1;\n    FT_Int  index2;\n    FT_Int  x;\n    FT_Int  y;\n\n  } AFM_KernPairRec, *AFM_KernPair;\n\n  typedef struct  AFM_FontInfoRec_\n  {\n    FT_Bool        IsCIDFont;\n    FT_BBox        FontBBox;\n    FT_Fixed       Ascender;\n    FT_Fixed       Descender;\n    AFM_TrackKern  TrackKerns;   /* free if non-NULL */\n    FT_Int         NumTrackKern;\n    AFM_KernPair   KernPairs;    /* free if non-NULL */\n    FT_Int         NumKernPair;\n\n  } AFM_FontInfoRec, *AFM_FontInfo;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                ORIGINAL T1_FACE CLASS DEFINITION                  ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct T1_FaceRec_*   T1_Face;\n  typedef struct CID_FaceRec_*  CID_Face;\n\n\n  typedef struct  T1_FaceRec_\n  {\n    FT_FaceRec      root;\n    T1_FontRec      type1;\n    const void*     psnames;\n    const void*     psaux;\n    const void*     afm_data;\n    FT_CharMapRec   charmaprecs[2];\n    FT_CharMap      charmaps[2];\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    PS_Unicodes     unicode_map;\n#endif\n\n    /* support for Multiple Masters fonts */\n    PS_Blend        blend;\n\n    /* undocumented, optional: indices of subroutines that express      */\n    /* the NormalizeDesignVector and the ConvertDesignVector procedure, */\n    /* respectively, as Type 2 charstrings; -1 if keywords not present  */\n    FT_Int           ndv_idx;\n    FT_Int           cdv_idx;\n\n    /* undocumented, optional: has the same meaning as len_buildchar */\n    /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25    */\n    FT_UInt          len_buildchar;\n    FT_Long*         buildchar;\n\n    /* since version 2.1 - interface to PostScript hinter */\n    const void*     pshinter;\n\n  } T1_FaceRec;\n\n\n  typedef struct  CID_FaceRec_\n  {\n    FT_FaceRec       root;\n    void*            psnames;\n    void*            psaux;\n    CID_FaceInfoRec  cid;\n    PS_FontExtraRec  font_extra;\n#if 0\n    void*            afm_data;\n#endif\n    CID_Subrs        subrs;\n\n    /* since version 2.1 - interface to PostScript hinter */\n    void*            pshinter;\n\n    /* since version 2.1.8, but was originally positioned after `afm_data' */\n    FT_Byte*         binary_data; /* used if hex data has been converted */\n    FT_Stream        cid_stream;\n\n  } CID_FaceRec;\n\n\nFT_END_HEADER\n\n#endif /* __T1TYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/internal/tttypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tttypes.h                                                              */\n/*                                                                         */\n/*    Basic SFNT/TrueType type definitions and interface (specification    */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2008, 2012-2013 by                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTTYPES_H__\n#define __TTTYPES_H__\n\n\n#include <ft2build.h>\n#include FT_TRUETYPE_TABLES_H\n#include FT_INTERNAL_OBJECTS_H\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include FT_MULTIPLE_MASTERS_H\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***             REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TTC_HeaderRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    TrueType collection header.  This table contains the offsets of    */\n  /*    the font headers of each distinct TrueType face in the file.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    tag     :: Must be `ttc ' to indicate a TrueType collection.       */\n  /*                                                                       */\n  /*    version :: The version number.                                     */\n  /*                                                                       */\n  /*    count   :: The number of faces in the collection.  The             */\n  /*               specification says this should be an unsigned long, but */\n  /*               we use a signed long since we need the value -1 for     */\n  /*               specific purposes.                                      */\n  /*                                                                       */\n  /*    offsets :: The offsets of the font headers, one per face.          */\n  /*                                                                       */\n  typedef struct  TTC_HeaderRec_\n  {\n    FT_ULong   tag;\n    FT_Fixed   version;\n    FT_Long    count;\n    FT_ULong*  offsets;\n\n  } TTC_HeaderRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    SFNT_HeaderRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    SFNT file format header.                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    format_tag     :: The font format tag.                             */\n  /*                                                                       */\n  /*    num_tables     :: The number of tables in file.                    */\n  /*                                                                       */\n  /*    search_range   :: Must be `16 * (max power of 2 <= num_tables)'.   */\n  /*                                                                       */\n  /*    entry_selector :: Must be log2 of `search_range / 16'.             */\n  /*                                                                       */\n  /*    range_shift    :: Must be `num_tables * 16 - search_range'.        */\n  /*                                                                       */\n  typedef struct  SFNT_HeaderRec_\n  {\n    FT_ULong   format_tag;\n    FT_UShort  num_tables;\n    FT_UShort  search_range;\n    FT_UShort  entry_selector;\n    FT_UShort  range_shift;\n\n    FT_ULong   offset;  /* not in file */\n\n  } SFNT_HeaderRec, *SFNT_Header;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_TableRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This structure describes a given table of a TrueType font.         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Tag      :: A four-bytes tag describing the table.                 */\n  /*                                                                       */\n  /*    CheckSum :: The table checksum.  This value can be ignored.        */\n  /*                                                                       */\n  /*    Offset   :: The offset of the table from the start of the TrueType */\n  /*                font in its resource.                                  */\n  /*                                                                       */\n  /*    Length   :: The table length (in bytes).                           */\n  /*                                                                       */\n  typedef struct  TT_TableRec_\n  {\n    FT_ULong  Tag;        /*        table type */\n    FT_ULong  CheckSum;   /*    table checksum */\n    FT_ULong  Offset;     /* table file offset */\n    FT_ULong  Length;     /*      table length */\n\n  } TT_TableRec, *TT_Table;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_LongMetricsRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling the long metrics of the `hmtx' and `vmtx'     */\n  /*    TrueType tables.  The values are expressed in font units.          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    advance :: The advance width or height for the glyph.              */\n  /*                                                                       */\n  /*    bearing :: The left-side or top-side bearing for the glyph.        */\n  /*                                                                       */\n  typedef struct  TT_LongMetricsRec_\n  {\n    FT_UShort  advance;\n    FT_Short   bearing;\n\n  } TT_LongMetricsRec, *TT_LongMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_ShortMetrics                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple type to model the short metrics of the `hmtx' and `vmtx'  */\n  /*    tables.                                                            */\n  /*                                                                       */\n  typedef FT_Short  TT_ShortMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_NameEntryRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling TrueType name records.  Name records are used */\n  /*    to store important strings like family name, style name,           */\n  /*    copyright, etc. in _localized_ versions (i.e., language, encoding, */\n  /*    etc).                                                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    platformID   :: The ID of the name's encoding platform.            */\n  /*                                                                       */\n  /*    encodingID   :: The platform-specific ID for the name's encoding.  */\n  /*                                                                       */\n  /*    languageID   :: The platform-specific ID for the name's language.  */\n  /*                                                                       */\n  /*    nameID       :: The ID specifying what kind of name this is.       */\n  /*                                                                       */\n  /*    stringLength :: The length of the string in bytes.                 */\n  /*                                                                       */\n  /*    stringOffset :: The offset to the string in the `name' table.      */\n  /*                                                                       */\n  /*    string       :: A pointer to the string's bytes.  Note that these  */\n  /*                    are usually UTF-16 encoded characters.             */\n  /*                                                                       */\n  typedef struct  TT_NameEntryRec_\n  {\n    FT_UShort  platformID;\n    FT_UShort  encodingID;\n    FT_UShort  languageID;\n    FT_UShort  nameID;\n    FT_UShort  stringLength;\n    FT_ULong   stringOffset;\n\n    /* this last field is not defined in the spec */\n    /* but used by the FreeType engine            */\n\n    FT_Byte*   string;\n\n  } TT_NameEntryRec, *TT_NameEntry;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_NameTableRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling the TrueType name table.                      */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    format         :: The format of the name table.                    */\n  /*                                                                       */\n  /*    numNameRecords :: The number of names in table.                    */\n  /*                                                                       */\n  /*    storageOffset  :: The offset of the name table in the `name'       */\n  /*                      TrueType table.                                  */\n  /*                                                                       */\n  /*    names          :: An array of name records.                        */\n  /*                                                                       */\n  /*    stream         :: the file's input stream.                         */\n  /*                                                                       */\n  typedef struct  TT_NameTableRec_\n  {\n    FT_UShort         format;\n    FT_UInt           numNameRecords;\n    FT_UInt           storageOffset;\n    TT_NameEntryRec*  names;\n    FT_Stream         stream;\n\n  } TT_NameTableRec, *TT_NameTable;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***             OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_GaspRangeRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A tiny structure used to model a gasp range according to the       */\n  /*    TrueType specification.                                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    maxPPEM  :: The maximum ppem value to which `gaspFlag' applies.    */\n  /*                                                                       */\n  /*    gaspFlag :: A flag describing the grid-fitting and anti-aliasing   */\n  /*                modes to be used.                                      */\n  /*                                                                       */\n  typedef struct  TT_GaspRangeRec_\n  {\n    FT_UShort  maxPPEM;\n    FT_UShort  gaspFlag;\n\n  } TT_GaspRangeRec, *TT_GaspRange;\n\n\n#define TT_GASP_GRIDFIT  0x01\n#define TT_GASP_DOGRAY   0x02\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_GaspRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure modeling the TrueType `gasp' table used to specify     */\n  /*    grid-fitting and anti-aliasing behaviour.                          */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    version    :: The version number.                                  */\n  /*                                                                       */\n  /*    numRanges  :: The number of gasp ranges in table.                  */\n  /*                                                                       */\n  /*    gaspRanges :: An array of gasp ranges.                             */\n  /*                                                                       */\n  typedef struct  TT_Gasp_\n  {\n    FT_UShort     version;\n    FT_UShort     numRanges;\n    TT_GaspRange  gaspRanges;\n\n  } TT_GaspRec;\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_HdmxEntryRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A small structure used to model the pre-computed widths of a given */\n  /*    size.  They are found in the `hdmx' table.                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    ppem      :: The pixels per EM value at which these metrics apply. */\n  /*                                                                       */\n  /*    max_width :: The maximum advance width for this metric.            */\n  /*                                                                       */\n  /*    widths    :: An array of widths.  Note: These are 8-bit bytes.     */\n  /*                                                                       */\n  typedef struct  TT_HdmxEntryRec_\n  {\n    FT_Byte   ppem;\n    FT_Byte   max_width;\n    FT_Byte*  widths;\n\n  } TT_HdmxEntryRec, *TT_HdmxEntry;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_HdmxRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model the `hdmx' table, which contains         */\n  /*    pre-computed widths for a set of given sizes/dimensions.           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    version     :: The version number.                                 */\n  /*                                                                       */\n  /*    num_records :: The number of hdmx records.                         */\n  /*                                                                       */\n  /*    records     :: An array of hdmx records.                           */\n  /*                                                                       */\n  typedef struct  TT_HdmxRec_\n  {\n    FT_UShort     version;\n    FT_Short      num_records;\n    TT_HdmxEntry  records;\n\n  } TT_HdmxRec, *TT_Hdmx;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Kern0_PairRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a kerning pair for the kerning table     */\n  /*    format 0.  The engine now loads this table if it finds one in the  */\n  /*    font file.                                                         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    left  :: The index of the left glyph in pair.                      */\n  /*                                                                       */\n  /*    right :: The index of the right glyph in pair.                     */\n  /*                                                                       */\n  /*    value :: The kerning distance.  A positive value spaces the        */\n  /*             glyphs, a negative one makes them closer.                 */\n  /*                                                                       */\n  typedef struct  TT_Kern0_PairRec_\n  {\n    FT_UShort  left;   /* index of left  glyph in pair */\n    FT_UShort  right;  /* index of right glyph in pair */\n    FT_FWord   value;  /* kerning value                */\n\n  } TT_Kern0_PairRec, *TT_Kern0_Pair;\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                    EMBEDDED BITMAPS SUPPORT                       ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_MetricsRec                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold the big metrics of a given glyph bitmap   */\n  /*    in a TrueType or OpenType font.  These are usually found in the    */\n  /*    `EBDT' (Microsoft) or `bloc' (Apple) table.                        */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    height       :: The glyph height in pixels.                        */\n  /*                                                                       */\n  /*    width        :: The glyph width in pixels.                         */\n  /*                                                                       */\n  /*    horiBearingX :: The horizontal left bearing.                       */\n  /*                                                                       */\n  /*    horiBearingY :: The horizontal top bearing.                        */\n  /*                                                                       */\n  /*    horiAdvance  :: The horizontal advance.                            */\n  /*                                                                       */\n  /*    vertBearingX :: The vertical left bearing.                         */\n  /*                                                                       */\n  /*    vertBearingY :: The vertical top bearing.                          */\n  /*                                                                       */\n  /*    vertAdvance  :: The vertical advance.                              */\n  /*                                                                       */\n  typedef struct  TT_SBit_MetricsRec_\n  {\n    FT_Byte  height;\n    FT_Byte  width;\n\n    FT_Char  horiBearingX;\n    FT_Char  horiBearingY;\n    FT_Byte  horiAdvance;\n\n    FT_Char  vertBearingX;\n    FT_Char  vertBearingY;\n    FT_Byte  vertAdvance;\n\n  } TT_SBit_MetricsRec, *TT_SBit_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_SmallMetricsRec                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to hold the small metrics of a given glyph bitmap */\n  /*    in a TrueType or OpenType font.  These are usually found in the    */\n  /*    `EBDT' (Microsoft) or the `bdat' (Apple) table.                    */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    height   :: The glyph height in pixels.                            */\n  /*                                                                       */\n  /*    width    :: The glyph width in pixels.                             */\n  /*                                                                       */\n  /*    bearingX :: The left-side bearing.                                 */\n  /*                                                                       */\n  /*    bearingY :: The top-side bearing.                                  */\n  /*                                                                       */\n  /*    advance  :: The advance width or height.                           */\n  /*                                                                       */\n  typedef struct  TT_SBit_Small_Metrics_\n  {\n    FT_Byte  height;\n    FT_Byte  width;\n\n    FT_Char  bearingX;\n    FT_Char  bearingY;\n    FT_Byte  advance;\n\n  } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_LineMetricsRec                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to describe the text line metrics of a given      */\n  /*    bitmap strike, for either a horizontal or vertical layout.         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    ascender                :: The ascender in pixels.                 */\n  /*                                                                       */\n  /*    descender               :: The descender in pixels.                */\n  /*                                                                       */\n  /*    max_width               :: The maximum glyph width in pixels.      */\n  /*                                                                       */\n  /*    caret_slope_enumerator  :: Rise of the caret slope, typically set  */\n  /*                               to 1 for non-italic fonts.              */\n  /*                                                                       */\n  /*    caret_slope_denominator :: Rise of the caret slope, typically set  */\n  /*                               to 0 for non-italic fonts.              */\n  /*                                                                       */\n  /*    caret_offset            :: Offset in pixels to move the caret for  */\n  /*                               proper positioning.                     */\n  /*                                                                       */\n  /*    min_origin_SB           :: Minimum of horiBearingX (resp.          */\n  /*                               vertBearingY).                          */\n  /*    min_advance_SB          :: Minimum of                              */\n  /*                                                                       */\n  /*                                 horizontal advance -                  */\n  /*                                   ( horiBearingX + width )            */\n  /*                                                                       */\n  /*                               resp.                                   */\n  /*                                                                       */\n  /*                                 vertical advance -                    */\n  /*                                   ( vertBearingY + height )           */\n  /*                                                                       */\n  /*    max_before_BL           :: Maximum of horiBearingY (resp.          */\n  /*                               vertBearingY).                          */\n  /*                                                                       */\n  /*    min_after_BL            :: Minimum of                              */\n  /*                                                                       */\n  /*                                 horiBearingY - height                 */\n  /*                                                                       */\n  /*                               resp.                                   */\n  /*                                                                       */\n  /*                                 vertBearingX - width                  */\n  /*                                                                       */\n  /*    pads                    :: Unused (to make the size of the record  */\n  /*                               a multiple of 32 bits.                  */\n  /*                                                                       */\n  typedef struct  TT_SBit_LineMetricsRec_\n  {\n    FT_Char  ascender;\n    FT_Char  descender;\n    FT_Byte  max_width;\n    FT_Char  caret_slope_numerator;\n    FT_Char  caret_slope_denominator;\n    FT_Char  caret_offset;\n    FT_Char  min_origin_SB;\n    FT_Char  min_advance_SB;\n    FT_Char  max_before_BL;\n    FT_Char  min_after_BL;\n    FT_Char  pads[2];\n\n  } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_RangeRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A TrueType/OpenType subIndexTable as defined in the `EBLC'         */\n  /*    (Microsoft) or `bloc' (Apple) tables.                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    first_glyph   :: The first glyph index in the range.               */\n  /*                                                                       */\n  /*    last_glyph    :: The last glyph index in the range.                */\n  /*                                                                       */\n  /*    index_format  :: The format of index table.  Valid values are 1    */\n  /*                     to 5.                                             */\n  /*                                                                       */\n  /*    image_format  :: The format of `EBDT' image data.                  */\n  /*                                                                       */\n  /*    image_offset  :: The offset to image data in `EBDT'.               */\n  /*                                                                       */\n  /*    image_size    :: For index formats 2 and 5.  This is the size in   */\n  /*                     bytes of each glyph bitmap.                       */\n  /*                                                                       */\n  /*    big_metrics   :: For index formats 2 and 5.  This is the big       */\n  /*                     metrics for each glyph bitmap.                    */\n  /*                                                                       */\n  /*    num_glyphs    :: For index formats 4 and 5.  This is the number of */\n  /*                     glyphs in the code array.                         */\n  /*                                                                       */\n  /*    glyph_offsets :: For index formats 1 and 3.                        */\n  /*                                                                       */\n  /*    glyph_codes   :: For index formats 4 and 5.                        */\n  /*                                                                       */\n  /*    table_offset  :: The offset of the index table in the `EBLC'       */\n  /*                     table.  Only used during strike loading.          */\n  /*                                                                       */\n  typedef struct  TT_SBit_RangeRec_\n  {\n    FT_UShort           first_glyph;\n    FT_UShort           last_glyph;\n\n    FT_UShort           index_format;\n    FT_UShort           image_format;\n    FT_ULong            image_offset;\n\n    FT_ULong            image_size;\n    TT_SBit_MetricsRec  metrics;\n    FT_ULong            num_glyphs;\n\n    FT_ULong*           glyph_offsets;\n    FT_UShort*          glyph_codes;\n\n    FT_ULong            table_offset;\n\n  } TT_SBit_RangeRec, *TT_SBit_Range;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_StrikeRec                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used describe a given bitmap strike in the `EBLC'      */\n  /*    (Microsoft) or `bloc' (Apple) tables.                              */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*   num_index_ranges :: The number of index ranges.                     */\n  /*                                                                       */\n  /*   index_ranges     :: An array of glyph index ranges.                 */\n  /*                                                                       */\n  /*   color_ref        :: Unused.  `color_ref' is put in for future       */\n  /*                       enhancements, but these fields are already      */\n  /*                       in use by other platforms (e.g. Newton).        */\n  /*                       For details, please see                         */\n  /*                                                                       */\n  /*                         http://fonts.apple.com/                       */\n  /*                                TTRefMan/RM06/Chap6bloc.html           */\n  /*                                                                       */\n  /*   hori             :: The line metrics for horizontal layouts.        */\n  /*                                                                       */\n  /*   vert             :: The line metrics for vertical layouts.          */\n  /*                                                                       */\n  /*   start_glyph      :: The lowest glyph index for this strike.         */\n  /*                                                                       */\n  /*   end_glyph        :: The highest glyph index for this strike.        */\n  /*                                                                       */\n  /*   x_ppem           :: The number of horizontal pixels per EM.         */\n  /*                                                                       */\n  /*   y_ppem           :: The number of vertical pixels per EM.           */\n  /*                                                                       */\n  /*   bit_depth        :: The bit depth.  Valid values are 1, 2, 4,       */\n  /*                       and 8.                                          */\n  /*                                                                       */\n  /*   flags            :: Is this a vertical or horizontal strike?  For   */\n  /*                       details, please see                             */\n  /*                                                                       */\n  /*                         http://fonts.apple.com/                       */\n  /*                                TTRefMan/RM06/Chap6bloc.html           */\n  /*                                                                       */\n  typedef struct  TT_SBit_StrikeRec_\n  {\n    FT_Int                  num_ranges;\n    TT_SBit_Range           sbit_ranges;\n    FT_ULong                ranges_offset;\n\n    FT_ULong                color_ref;\n\n    TT_SBit_LineMetricsRec  hori;\n    TT_SBit_LineMetricsRec  vert;\n\n    FT_UShort               start_glyph;\n    FT_UShort               end_glyph;\n\n    FT_Byte                 x_ppem;\n    FT_Byte                 y_ppem;\n\n    FT_Byte                 bit_depth;\n    FT_Char                 flags;\n\n  } TT_SBit_StrikeRec, *TT_SBit_Strike;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_ComponentRec                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A simple structure to describe a compound sbit element.            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    glyph_code :: The element's glyph index.                           */\n  /*                                                                       */\n  /*    x_offset   :: The element's left bearing.                          */\n  /*                                                                       */\n  /*    y_offset   :: The element's top bearing.                           */\n  /*                                                                       */\n  typedef struct  TT_SBit_ComponentRec_\n  {\n    FT_UShort  glyph_code;\n    FT_Char    x_offset;\n    FT_Char    y_offset;\n\n  } TT_SBit_ComponentRec, *TT_SBit_Component;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_SBit_ScaleRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used describe a given bitmap scaling table, as defined */\n  /*    in the `EBSC' table.                                               */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    hori              :: The horizontal line metrics.                  */\n  /*                                                                       */\n  /*    vert              :: The vertical line metrics.                    */\n  /*                                                                       */\n  /*    x_ppem            :: The number of horizontal pixels per EM.       */\n  /*                                                                       */\n  /*    y_ppem            :: The number of vertical pixels per EM.         */\n  /*                                                                       */\n  /*    x_ppem_substitute :: Substitution x_ppem value.                    */\n  /*                                                                       */\n  /*    y_ppem_substitute :: Substitution y_ppem value.                    */\n  /*                                                                       */\n  typedef struct  TT_SBit_ScaleRec_\n  {\n    TT_SBit_LineMetricsRec  hori;\n    TT_SBit_LineMetricsRec  vert;\n\n    FT_Byte                 x_ppem;\n    FT_Byte                 y_ppem;\n\n    FT_Byte                 x_ppem_substitute;\n    FT_Byte                 y_ppem_substitute;\n\n  } TT_SBit_ScaleRec, *TT_SBit_Scale;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                  POSTSCRIPT GLYPH NAMES SUPPORT                   ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Post_20Rec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Postscript names sub-table, format 2.0.  Stores the PS name of     */\n  /*    each glyph in the font face.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_glyphs    :: The number of named glyphs in the table.          */\n  /*                                                                       */\n  /*    num_names     :: The number of PS names stored in the table.       */\n  /*                                                                       */\n  /*    glyph_indices :: The indices of the glyphs in the names arrays.    */\n  /*                                                                       */\n  /*    glyph_names   :: The PS names not in Mac Encoding.                 */\n  /*                                                                       */\n  typedef struct  TT_Post_20Rec_\n  {\n    FT_UShort   num_glyphs;\n    FT_UShort   num_names;\n    FT_UShort*  glyph_indices;\n    FT_Char**   glyph_names;\n\n  } TT_Post_20Rec, *TT_Post_20;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Post_25Rec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Postscript names sub-table, format 2.5.  Stores the PS name of     */\n  /*    each glyph in the font face.                                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_glyphs :: The number of glyphs in the table.                   */\n  /*                                                                       */\n  /*    offsets    :: An array of signed offsets in a normal Mac           */\n  /*                  Postscript name encoding.                            */\n  /*                                                                       */\n  typedef struct  TT_Post_25_\n  {\n    FT_UShort  num_glyphs;\n    FT_Char*   offsets;\n\n  } TT_Post_25Rec, *TT_Post_25;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Post_NamesRec                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Postscript names table, either format 2.0 or 2.5.                  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    loaded    :: A flag to indicate whether the PS names are loaded.   */\n  /*                                                                       */\n  /*    format_20 :: The sub-table used for format 2.0.                    */\n  /*                                                                       */\n  /*    format_25 :: The sub-table used for format 2.5.                    */\n  /*                                                                       */\n  typedef struct  TT_Post_NamesRec_\n  {\n    FT_Bool  loaded;\n\n    union\n    {\n      TT_Post_20Rec  format_20;\n      TT_Post_25Rec  format_25;\n\n    } names;\n\n  } TT_Post_NamesRec, *TT_Post_Names;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                    GX VARIATION TABLE SUPPORT                     ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n  typedef struct GX_BlendRec_  *GX_Blend;\n#endif\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***              EMBEDDED BDF PROPERTIES TABLE SUPPORT                ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   * These types are used to support a `BDF ' table that isn't part of the\n   * official TrueType specification.  It is mainly used in SFNT-based\n   * bitmap fonts that were generated from a set of BDF fonts.\n   *\n   * The format of the table is as follows.\n   *\n   *   USHORT   version      `BDF ' table version number, should be 0x0001.\n   *   USHORT   strikeCount  Number of strikes (bitmap sizes) in this table.\n   *   ULONG    stringTable  Offset (from start of BDF table) to string\n   *                         table.\n   *\n   * This is followed by an array of `strikeCount' descriptors, having the\n   * following format.\n   *\n   *   USHORT   ppem         Vertical pixels per EM for this strike.\n   *   USHORT   numItems     Number of items for this strike (properties and\n   *                         atoms).  Maximum is 255.\n   *\n   * This array in turn is followed by `strikeCount' value sets.  Each\n   * `value set' is an array of `numItems' items with the following format.\n   *\n   *   ULONG    item_name    Offset in string table to item name.\n   *   USHORT   item_type    The item type.  Possible values are\n   *                            0 => string (e.g., COMMENT)\n   *                            1 => atom   (e.g., FONT or even SIZE)\n   *                            2 => int32\n   *                            3 => uint32\n   *                         0x10 => A flag to indicate a properties.  This\n   *                                 is ORed with the above values.\n   *   ULONG    item_value   For strings  => Offset into string table without\n   *                                         the corresponding double quotes.\n   *                         For atoms    => Offset into string table.\n   *                         For integers => Direct value.\n   *\n   * All strings in the string table consist of bytes and are\n   * zero-terminated.\n   *\n   */\n\n#ifdef TT_CONFIG_OPTION_BDF\n\n  typedef struct  TT_BDFRec_\n  {\n    FT_Byte*   table;\n    FT_Byte*   table_end;\n    FT_Byte*   strings;\n    FT_ULong   strings_size;\n    FT_UInt    num_strikes;\n    FT_Bool    loaded;\n\n  } TT_BDFRec, *TT_BDF;\n\n#endif /* TT_CONFIG_OPTION_BDF */\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /***                  ORIGINAL TT_FACE CLASS DEFINITION                ***/\n  /***                                                                   ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This structure/class is defined here because it is common to the      */\n  /* following formats: TTF, OpenType-TT, and OpenType-CFF.                */\n  /*                                                                       */\n  /* Note, however, that the classes TT_Size and TT_GlyphSlot are not      */\n  /* shared between font drivers, and are thus defined in `ttobjs.h'.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_Face                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a TrueType face/font object.  A TT_Face encapsulates   */\n  /*    the resolution and scaling independent parts of a TrueType font    */\n  /*    resource.                                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The TT_Face structure is also used as a `parent class' for the     */\n  /*    OpenType-CFF class (T2_Face).                                      */\n  /*                                                                       */\n  typedef struct TT_FaceRec_*  TT_Face;\n\n\n  /* a function type used for the truetype bytecode interpreter hooks */\n  typedef FT_Error\n  (*TT_Interpreter)( void*  exec_context );\n\n  /* forward declaration */\n  typedef struct TT_LoaderRec_*  TT_Loader;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_GotoTableFunc                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Seeks a stream to the start of a given TrueType table.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    tag    :: A 4-byte tag used to name the table.                     */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    length :: The length of the table in bytes.  Set to 0 if not       */\n  /*              needed.                                                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be at the font file's origin.               */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Loader_GotoTableFunc)( TT_Face    face,\n                              FT_ULong   tag,\n                              FT_Stream  stream,\n                              FT_ULong*  length );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_StartGlyphFunc                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Seeks a stream to the start of a given glyph element, and opens a  */\n  /*    frame for it.                                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    loader      :: The current TrueType glyph loader object.           */\n  /*                                                                       */\n  /*    glyph index :: The index of the glyph to access.                   */\n  /*                                                                       */\n  /*    offset      :: The offset of the glyph according to the            */\n  /*                   `locations' table.                                  */\n  /*                                                                       */\n  /*    byte_count  :: The size of the frame in bytes.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function is normally equivalent to FT_STREAM_SEEK(offset)     */\n  /*    followed by FT_FRAME_ENTER(byte_count) with the loader's stream,   */\n  /*    but alternative formats (e.g. compressed ones) might use something */\n  /*    different.                                                         */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Loader_StartGlyphFunc)( TT_Loader  loader,\n                               FT_UInt    glyph_index,\n                               FT_ULong   offset,\n                               FT_UInt    byte_count );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_ReadGlyphFunc                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Reads one glyph element (its header, a simple glyph, or a          */\n  /*    composite) from the loader's current stream frame.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    loader :: The current TrueType glyph loader object.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  typedef FT_Error\n  (*TT_Loader_ReadGlyphFunc)( TT_Loader  loader );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <FuncType>                                                            */\n  /*    TT_Loader_EndGlyphFunc                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Closes the current loader stream frame for the glyph.              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    loader :: The current TrueType glyph loader object.                */\n  /*                                                                       */\n  typedef void\n  (*TT_Loader_EndGlyphFunc)( TT_Loader  loader );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                         TrueType Face Type                            */\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Face                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType face class.  These objects model the resolution and   */\n  /*    point-size independent data found in a TrueType font file.         */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root                 :: The base FT_Face structure, managed by the */\n  /*                            base layer.                                */\n  /*                                                                       */\n  /*    ttc_header           :: The TrueType collection header, used when  */\n  /*                            the file is a `ttc' rather than a `ttf'.   */\n  /*                            For ordinary font files, the field         */\n  /*                            `ttc_header.count' is set to 0.            */\n  /*                                                                       */\n  /*    format_tag           :: The font format tag.                       */\n  /*                                                                       */\n  /*    num_tables           :: The number of TrueType tables in this font */\n  /*                            file.                                      */\n  /*                                                                       */\n  /*    dir_tables           :: The directory of TrueType tables for this  */\n  /*                            font file.                                 */\n  /*                                                                       */\n  /*    header               :: The font's font header (`head' table).     */\n  /*                            Read on font opening.                      */\n  /*                                                                       */\n  /*    horizontal           :: The font's horizontal header (`hhea'       */\n  /*                            table).  This field also contains the      */\n  /*                            associated horizontal metrics table        */\n  /*                            (`hmtx').                                  */\n  /*                                                                       */\n  /*    max_profile          :: The font's maximum profile table.  Read on */\n  /*                            font opening.  Note that some maximum      */\n  /*                            values cannot be taken directly from this  */\n  /*                            table.  We thus define additional fields   */\n  /*                            below to hold the computed maxima.         */\n  /*                                                                       */\n  /*    vertical_info        :: A boolean which is set when the font file  */\n  /*                            contains vertical metrics.  If not, the    */\n  /*                            value of the `vertical' field is           */\n  /*                            undefined.                                 */\n  /*                                                                       */\n  /*    vertical             :: The font's vertical header (`vhea' table). */\n  /*                            This field also contains the associated    */\n  /*                            vertical metrics table (`vmtx'), if found. */\n  /*                            IMPORTANT: The contents of this field is   */\n  /*                            undefined if the `verticalInfo' field is   */\n  /*                            unset.                                     */\n  /*                                                                       */\n  /*    num_names            :: The number of name records within this     */\n  /*                            TrueType font.                             */\n  /*                                                                       */\n  /*    name_table           :: The table of name records (`name').        */\n  /*                                                                       */\n  /*    os2                  :: The font's OS/2 table (`OS/2').            */\n  /*                                                                       */\n  /*    postscript           :: The font's PostScript table (`post'        */\n  /*                            table).  The PostScript glyph names are    */\n  /*                            not loaded by the driver on face opening.  */\n  /*                            See the `ttpost' module for more details.  */\n  /*                                                                       */\n  /*    cmap_table           :: Address of the face's `cmap' SFNT table    */\n  /*                            in memory (it's an extracted frame).       */\n  /*                                                                       */\n  /*    cmap_size            :: The size in bytes of the `cmap_table'      */\n  /*                            described above.                           */\n  /*                                                                       */\n  /*    goto_table           :: A function called by each TrueType table   */\n  /*                            loader to position a stream's cursor to    */\n  /*                            the start of a given table according to    */\n  /*                            its tag.  It defaults to TT_Goto_Face but  */\n  /*                            can be different for strange formats (e.g. */\n  /*                            Type 42).                                  */\n  /*                                                                       */\n  /*    access_glyph_frame   :: A function used to access the frame of a   */\n  /*                            given glyph within the face's font file.   */\n  /*                                                                       */\n  /*    forget_glyph_frame   :: A function used to forget the frame of a   */\n  /*                            given glyph when all data has been loaded. */\n  /*                                                                       */\n  /*    read_glyph_header    :: A function used to read a glyph header.    */\n  /*                            It must be called between an `access' and  */\n  /*                            `forget'.                                  */\n  /*                                                                       */\n  /*    read_simple_glyph    :: A function used to read a simple glyph.    */\n  /*                            It must be called after the header was     */\n  /*                            read, and before the `forget'.             */\n  /*                                                                       */\n  /*    read_composite_glyph :: A function used to read a composite glyph. */\n  /*                            It must be called after the header was     */\n  /*                            read, and before the `forget'.             */\n  /*                                                                       */\n  /*    sfnt                 :: A pointer to the SFNT service.             */\n  /*                                                                       */\n  /*    psnames              :: A pointer to the PostScript names service. */\n  /*                                                                       */\n  /*    hdmx                 :: The face's horizontal device metrics       */\n  /*                            (`hdmx' table).  This table is optional in */\n  /*                            TrueType/OpenType fonts.                   */\n  /*                                                                       */\n  /*    gasp                 :: The grid-fitting and scaling properties    */\n  /*                            table (`gasp').  This table is optional in */\n  /*                            TrueType/OpenType fonts.                   */\n  /*                                                                       */\n  /*    pclt                 :: The `pclt' SFNT table.                     */\n  /*                                                                       */\n  /*    num_sbit_strikes     :: The number of sbit strikes, i.e., bitmap   */\n  /*                            sizes, embedded in this font.              */\n  /*                                                                       */\n  /*    sbit_strikes         :: An array of sbit strikes embedded in this  */\n  /*                            font.  This table is optional in a         */\n  /*                            TrueType/OpenType font.                    */\n  /*                                                                       */\n  /*    num_sbit_scales      :: The number of sbit scales for this font.   */\n  /*                                                                       */\n  /*    sbit_scales          :: Array of sbit scales embedded in this      */\n  /*                            font.  This table is optional in a         */\n  /*                            TrueType/OpenType font.                    */\n  /*                                                                       */\n  /*    postscript_names     :: A table used to store the Postscript names */\n  /*                            of  the glyphs for this font.  See the     */\n  /*                            file  `ttconfig.h' for comments on the     */\n  /*                            TT_CONFIG_OPTION_POSTSCRIPT_NAMES option.  */\n  /*                                                                       */\n  /*    num_locations        :: The number of glyph locations in this      */\n  /*                            TrueType file.  This should be             */\n  /*                            identical to the number of glyphs.         */\n  /*                            Ignored for Type 2 fonts.                  */\n  /*                                                                       */\n  /*    glyph_locations      :: An array of longs.  These are offsets to   */\n  /*                            glyph data within the `glyf' table.        */\n  /*                            Ignored for Type 2 font faces.             */\n  /*                                                                       */\n  /*    glyf_len             :: The length of the `glyf' table.  Needed    */\n  /*                            for malformed `loca' tables.               */\n  /*                                                                       */\n  /*    font_program_size    :: Size in bytecodes of the face's font       */\n  /*                            program.  0 if none defined.  Ignored for  */\n  /*                            Type 2 fonts.                              */\n  /*                                                                       */\n  /*    font_program         :: The face's font program (bytecode stream)  */\n  /*                            executed at load time, also used during    */\n  /*                            glyph rendering.  Comes from the `fpgm'    */\n  /*                            table.  Ignored for Type 2 font fonts.     */\n  /*                                                                       */\n  /*    cvt_program_size     :: The size in bytecodes of the face's cvt    */\n  /*                            program.  Ignored for Type 2 fonts.        */\n  /*                                                                       */\n  /*    cvt_program          :: The face's cvt program (bytecode stream)   */\n  /*                            executed each time an instance/size is     */\n  /*                            changed/reset.  Comes from the `prep'      */\n  /*                            table.  Ignored for Type 2 fonts.          */\n  /*                                                                       */\n  /*    cvt_size             :: Size of the control value table (in        */\n  /*                            entries).   Ignored for Type 2 fonts.      */\n  /*                                                                       */\n  /*    cvt                  :: The face's original control value table.   */\n  /*                            Coordinates are expressed in unscaled font */\n  /*                            units.  Comes from the `cvt ' table.       */\n  /*                            Ignored for Type 2 fonts.                  */\n  /*                                                                       */\n  /*    num_kern_pairs       :: The number of kerning pairs present in the */\n  /*                            font file.  The engine only loads the      */\n  /*                            first horizontal format 0 kern table it    */\n  /*                            finds in the font file.  Ignored for       */\n  /*                            Type 2 fonts.                              */\n  /*                                                                       */\n  /*    kern_table_index     :: The index of the kerning table in the font */\n  /*                            kerning directory.  Ignored for Type 2     */\n  /*                            fonts.                                     */\n  /*                                                                       */\n  /*    interpreter          :: A pointer to the TrueType bytecode         */\n  /*                            interpreters field is also used to hook    */\n  /*                            the debugger in `ttdebug'.                 */\n  /*                                                                       */\n  /*    unpatented_hinting   :: If true, use only unpatented methods in    */\n  /*                            the bytecode interpreter.                  */\n  /*                                                                       */\n  /*    doblend              :: A boolean which is set if the font should  */\n  /*                            be blended (this is for GX var).           */\n  /*                                                                       */\n  /*    blend                :: Contains the data needed to control GX     */\n  /*                            variation tables (rather like Multiple     */\n  /*                            Master data).                              */\n  /*                                                                       */\n  /*    extra                :: Reserved for third-party font drivers.     */\n  /*                                                                       */\n  /*    postscript_name      :: The PS name of the font.  Used by the      */\n  /*                            postscript name service.                   */\n  /*                                                                       */\n  typedef struct  TT_FaceRec_\n  {\n    FT_FaceRec            root;\n\n    TTC_HeaderRec         ttc_header;\n\n    FT_ULong              format_tag;\n    FT_UShort             num_tables;\n    TT_Table              dir_tables;\n\n    TT_Header             header;       /* TrueType header table          */\n    TT_HoriHeader         horizontal;   /* TrueType horizontal header     */\n\n    TT_MaxProfile         max_profile;\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    FT_ULong              max_components;  /* stubbed to 0 */\n#endif\n\n    FT_Bool               vertical_info;\n    TT_VertHeader         vertical;     /* TT Vertical header, if present */\n\n    FT_UShort             num_names;    /* number of name records  */\n    TT_NameTableRec       name_table;   /* name table              */\n\n    TT_OS2                os2;          /* TrueType OS/2 table            */\n    TT_Postscript         postscript;   /* TrueType Postscript table      */\n\n    FT_Byte*              cmap_table;   /* extracted `cmap' table */\n    FT_ULong              cmap_size;\n\n    TT_Loader_GotoTableFunc   goto_table;\n\n    TT_Loader_StartGlyphFunc  access_glyph_frame;\n    TT_Loader_EndGlyphFunc    forget_glyph_frame;\n    TT_Loader_ReadGlyphFunc   read_glyph_header;\n    TT_Loader_ReadGlyphFunc   read_simple_glyph;\n    TT_Loader_ReadGlyphFunc   read_composite_glyph;\n\n    /* a typeless pointer to the SFNT_Interface table used to load */\n    /* the basic TrueType tables in the face object                */\n    void*                 sfnt;\n\n    /* a typeless pointer to the FT_Service_PsCMapsRec table used to */\n    /* handle glyph names <-> unicode & Mac values                   */\n    void*                 psnames;\n\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* Optional TrueType/OpenType tables                                   */\n    /*                                                                     */\n    /***********************************************************************/\n\n    /* horizontal device metrics */\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    TT_HdmxRec            hdmx;\n#endif\n\n    /* grid-fitting and scaling table */\n    TT_GaspRec            gasp;                 /* the `gasp' table */\n\n    /* PCL 5 table */\n    TT_PCLT               pclt;\n\n    /* embedded bitmaps support */\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    FT_ULong              num_sbit_strikes;\n    TT_SBit_Strike        sbit_strikes;\n#endif\n\n    FT_ULong              num_sbit_scales;\n    TT_SBit_Scale         sbit_scales;\n\n    /* postscript names table */\n    TT_Post_NamesRec      postscript_names;\n\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* TrueType-specific fields (ignored by the OTF-Type2 driver)          */\n    /*                                                                     */\n    /***********************************************************************/\n\n    /* the glyph locations */\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    FT_UShort             num_locations_stub;\n    FT_Long*              glyph_locations_stub;\n#endif\n\n    /* the font program, if any */\n    FT_ULong              font_program_size;\n    FT_Byte*              font_program;\n\n    /* the cvt program, if any */\n    FT_ULong              cvt_program_size;\n    FT_Byte*              cvt_program;\n\n    /* the original, unscaled, control value table */\n    FT_ULong              cvt_size;\n    FT_Short*             cvt;\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    /* the format 0 kerning table, if any */\n    FT_Int                num_kern_pairs;\n    FT_Int                kern_table_index;\n    TT_Kern0_Pair         kern_pairs;\n#endif\n\n    /* A pointer to the bytecode interpreter to use.  This is also */\n    /* used to hook the debugger for the `ttdebug' utility.        */\n    TT_Interpreter        interpreter;\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    /* Use unpatented hinting only. */\n    FT_Bool               unpatented_hinting;\n#endif\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* Other tables or fields. This is used by derivative formats like     */\n    /* OpenType.                                                           */\n    /*                                                                     */\n    /***********************************************************************/\n\n    FT_Generic            extra;\n\n    const char*           postscript_name;\n\n    /* since version 2.1.8, but was originally placed after */\n    /* `glyph_locations_stub'                               */\n    FT_ULong              glyf_len;\n\n    /* since version 2.1.8, but was originally placed before `extra' */\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    FT_Bool               doblend;\n    GX_Blend              blend;\n#endif\n\n    /* since version 2.2 */\n\n    FT_Byte*              horz_metrics;\n    FT_ULong              horz_metrics_size;\n\n    FT_Byte*              vert_metrics;\n    FT_ULong              vert_metrics_size;\n\n    FT_ULong              num_locations; /* in broken TTF, gid > 0xFFFF */\n    FT_Byte*              glyph_locations;\n\n    FT_Byte*              hdmx_table;\n    FT_ULong              hdmx_table_size;\n    FT_UInt               hdmx_record_count;\n    FT_ULong              hdmx_record_size;\n    FT_Byte*              hdmx_record_sizes;\n\n    FT_Byte*              sbit_table;\n    FT_ULong              sbit_table_size;\n    FT_UInt               sbit_num_strikes;\n\n    FT_Byte*              kern_table;\n    FT_ULong              kern_table_size;\n    FT_UInt               num_kern_tables;\n    FT_UInt32             kern_avail_bits;\n    FT_UInt32             kern_order_bits;\n\n#ifdef TT_CONFIG_OPTION_BDF\n    TT_BDFRec             bdf;\n#endif /* TT_CONFIG_OPTION_BDF */\n\n    /* since 2.3.0 */\n    FT_ULong              horz_metrics_offset;\n    FT_ULong              vert_metrics_offset;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* since 2.4.12 */\n    FT_ULong              sph_found_func_flags; /* special functions found */\n                                                /* for this face           */\n    FT_Bool               sph_compatibility_mode;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n  } TT_FaceRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  <Struct>                                                             */\n  /*     TT_GlyphZoneRec                                                   */\n  /*                                                                       */\n  /*  <Description>                                                        */\n  /*     A glyph zone is used to load, scale and hint glyph outline        */\n  /*     coordinates.                                                      */\n  /*                                                                       */\n  /*  <Fields>                                                             */\n  /*     memory       :: A handle to the memory manager.                   */\n  /*                                                                       */\n  /*     max_points   :: The maximum size in points of the zone.           */\n  /*                                                                       */\n  /*     max_contours :: Max size in links contours of the zone.           */\n  /*                                                                       */\n  /*     n_points     :: The current number of points in the zone.         */\n  /*                                                                       */\n  /*     n_contours   :: The current number of contours in the zone.       */\n  /*                                                                       */\n  /*     org          :: The original glyph coordinates (font              */\n  /*                     units/scaled).                                    */\n  /*                                                                       */\n  /*     cur          :: The current glyph coordinates (scaled/hinted).    */\n  /*                                                                       */\n  /*     tags         :: The point control tags.                           */\n  /*                                                                       */\n  /*     contours     :: The contours end points.                          */\n  /*                                                                       */\n  /*     first_point  :: Offset of the current subglyph's first point.     */\n  /*                                                                       */\n  typedef struct  TT_GlyphZoneRec_\n  {\n    FT_Memory   memory;\n    FT_UShort   max_points;\n    FT_UShort   max_contours;\n    FT_UShort   n_points;    /* number of points in zone    */\n    FT_Short    n_contours;  /* number of contours          */\n\n    FT_Vector*  org;         /* original point coordinates  */\n    FT_Vector*  cur;         /* current point coordinates   */\n    FT_Vector*  orus;        /* original (unscaled) point coordinates */\n\n    FT_Byte*    tags;        /* current touch flags         */\n    FT_UShort*  contours;    /* contour end points          */\n\n    FT_UShort   first_point; /* offset of first (#0) point  */\n\n  } TT_GlyphZoneRec, *TT_GlyphZone;\n\n\n  /* handle to execution context */\n  typedef struct TT_ExecContextRec_*  TT_ExecContext;\n\n  /* glyph loader structure */\n  typedef struct  TT_LoaderRec_\n  {\n    FT_Face          face;\n    FT_Size          size;\n    FT_GlyphSlot     glyph;\n    FT_GlyphLoader   gloader;\n\n    FT_ULong         load_flags;\n    FT_UInt          glyph_index;\n\n    FT_Stream        stream;\n    FT_Int           byte_len;\n\n    FT_Short         n_contours;\n    FT_BBox          bbox;\n    FT_Int           left_bearing;\n    FT_Int           advance;\n    FT_Int           linear;\n    FT_Bool          linear_def;\n    FT_Bool          preserve_pps;\n    FT_Vector        pp1;\n    FT_Vector        pp2;\n\n    FT_ULong         glyf_offset;\n\n    /* the zone where we load our glyphs */\n    TT_GlyphZoneRec  base;\n    TT_GlyphZoneRec  zone;\n\n    TT_ExecContext   exec;\n    FT_Byte*         instructions;\n    FT_ULong         ins_pos;\n\n    /* for possible extensibility in other formats */\n    void*            other;\n\n    /* since version 2.1.8 */\n    FT_Int           top_bearing;\n    FT_Int           vadvance;\n    FT_Vector        pp3;\n    FT_Vector        pp4;\n\n    /* since version 2.2.1 */\n    FT_Byte*         cursor;\n    FT_Byte*         limit;\n\n  } TT_LoaderRec;\n\n\nFT_END_HEADER\n\n#endif /* __TTTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/t1tables.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1tables.h                                                             */\n/*                                                                         */\n/*    Basic Type 1/Type 2 tables definitions and interface (specification  */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1TABLES_H__\n#define __T1TABLES_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    type1_tables                                                       */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    Type 1 Tables                                                      */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    Type~1 (PostScript) specific font tables.                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the definition of Type 1-specific tables,    */\n  /*    including structures related to other PostScript font formats.     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */\n  /* structures in order to support Multiple Master fonts.               */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_FontInfoRec                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a Type~1 or Type~2 FontInfo dictionary.  */\n  /*    Note that for Multiple Master fonts, each instance has its own     */\n  /*    FontInfo dictionary.                                               */\n  /*                                                                       */\n  typedef struct  PS_FontInfoRec_\n  {\n    FT_String*  version;\n    FT_String*  notice;\n    FT_String*  full_name;\n    FT_String*  family_name;\n    FT_String*  weight;\n    FT_Long     italic_angle;\n    FT_Bool     is_fixed_pitch;\n    FT_Short    underline_position;\n    FT_UShort   underline_thickness;\n\n  } PS_FontInfoRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_FontInfo                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @PS_FontInfoRec structure.                           */\n  /*                                                                       */\n  typedef struct PS_FontInfoRec_*  PS_FontInfo;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_FontInfo                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This type is equivalent to @PS_FontInfoRec.  It is deprecated but  */\n  /*    kept to maintain source compatibility between various versions of  */\n  /*    FreeType.                                                          */\n  /*                                                                       */\n  typedef PS_FontInfoRec  T1_FontInfo;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_PrivateRec                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a Type~1 or Type~2 private dictionary.   */\n  /*    Note that for Multiple Master fonts, each instance has its own     */\n  /*    Private dictionary.                                                */\n  /*                                                                       */\n  typedef struct  PS_PrivateRec_\n  {\n    FT_Int     unique_id;\n    FT_Int     lenIV;\n\n    FT_Byte    num_blue_values;\n    FT_Byte    num_other_blues;\n    FT_Byte    num_family_blues;\n    FT_Byte    num_family_other_blues;\n\n    FT_Short   blue_values[14];\n    FT_Short   other_blues[10];\n\n    FT_Short   family_blues      [14];\n    FT_Short   family_other_blues[10];\n\n    FT_Fixed   blue_scale;\n    FT_Int     blue_shift;\n    FT_Int     blue_fuzz;\n\n    FT_UShort  standard_width[1];\n    FT_UShort  standard_height[1];\n\n    FT_Byte    num_snap_widths;\n    FT_Byte    num_snap_heights;\n    FT_Bool    force_bold;\n    FT_Bool    round_stem_up;\n\n    FT_Short   snap_widths [13];  /* including std width  */\n    FT_Short   snap_heights[13];  /* including std height */\n\n    FT_Fixed   expansion_factor;\n\n    FT_Long    language_group;\n    FT_Long    password;\n\n    FT_Short   min_feature[2];\n\n  } PS_PrivateRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    PS_Private                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @PS_PrivateRec structure.                            */\n  /*                                                                       */\n  typedef struct PS_PrivateRec_*  PS_Private;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_Private                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   This type is equivalent to @PS_PrivateRec.  It is deprecated but    */\n  /*   kept to maintain source compatibility between various versions of   */\n  /*   FreeType.                                                           */\n  /*                                                                       */\n  typedef PS_PrivateRec  T1_Private;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    T1_Blend_Flags                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A set of flags used to indicate which fields are present in a      */\n  /*    given blend dictionary (font info or private).  Used to support    */\n  /*    Multiple Masters fonts.                                            */\n  /*                                                                       */\n  typedef enum  T1_Blend_Flags_\n  {\n    /*# required fields in a FontInfo blend dictionary */\n    T1_BLEND_UNDERLINE_POSITION = 0,\n    T1_BLEND_UNDERLINE_THICKNESS,\n    T1_BLEND_ITALIC_ANGLE,\n\n    /*# required fields in a Private blend dictionary */\n    T1_BLEND_BLUE_VALUES,\n    T1_BLEND_OTHER_BLUES,\n    T1_BLEND_STANDARD_WIDTH,\n    T1_BLEND_STANDARD_HEIGHT,\n    T1_BLEND_STEM_SNAP_WIDTHS,\n    T1_BLEND_STEM_SNAP_HEIGHTS,\n    T1_BLEND_BLUE_SCALE,\n    T1_BLEND_BLUE_SHIFT,\n    T1_BLEND_FAMILY_BLUES,\n    T1_BLEND_FAMILY_OTHER_BLUES,\n    T1_BLEND_FORCE_BOLD,\n\n    /*# never remove */\n    T1_BLEND_MAX\n\n  } T1_Blend_Flags;\n\n  /* */\n\n\n  /*# backwards compatible definitions */\n#define t1_blend_underline_position   T1_BLEND_UNDERLINE_POSITION\n#define t1_blend_underline_thickness  T1_BLEND_UNDERLINE_THICKNESS\n#define t1_blend_italic_angle         T1_BLEND_ITALIC_ANGLE\n#define t1_blend_blue_values          T1_BLEND_BLUE_VALUES\n#define t1_blend_other_blues          T1_BLEND_OTHER_BLUES\n#define t1_blend_standard_widths      T1_BLEND_STANDARD_WIDTH\n#define t1_blend_standard_height      T1_BLEND_STANDARD_HEIGHT\n#define t1_blend_stem_snap_widths     T1_BLEND_STEM_SNAP_WIDTHS\n#define t1_blend_stem_snap_heights    T1_BLEND_STEM_SNAP_HEIGHTS\n#define t1_blend_blue_scale           T1_BLEND_BLUE_SCALE\n#define t1_blend_blue_shift           T1_BLEND_BLUE_SHIFT\n#define t1_blend_family_blues         T1_BLEND_FAMILY_BLUES\n#define t1_blend_family_other_blues   T1_BLEND_FAMILY_OTHER_BLUES\n#define t1_blend_force_bold           T1_BLEND_FORCE_BOLD\n#define t1_blend_max                  T1_BLEND_MAX\n\n\n  /* maximum number of Multiple Masters designs, as defined in the spec */\n#define T1_MAX_MM_DESIGNS     16\n\n  /* maximum number of Multiple Masters axes, as defined in the spec */\n#define T1_MAX_MM_AXIS        4\n\n  /* maximum number of elements in a design map */\n#define T1_MAX_MM_MAP_POINTS  20\n\n\n  /* this structure is used to store the BlendDesignMap entry for an axis */\n  typedef struct  PS_DesignMap_\n  {\n    FT_Byte    num_points;\n    FT_Long*   design_points;\n    FT_Fixed*  blend_points;\n\n  } PS_DesignMapRec, *PS_DesignMap;\n\n  /* backwards-compatible definition */\n  typedef PS_DesignMapRec  T1_DesignMap;\n\n\n  typedef struct  PS_BlendRec_\n  {\n    FT_UInt          num_designs;\n    FT_UInt          num_axis;\n\n    FT_String*       axis_names[T1_MAX_MM_AXIS];\n    FT_Fixed*        design_pos[T1_MAX_MM_DESIGNS];\n    PS_DesignMapRec  design_map[T1_MAX_MM_AXIS];\n\n    FT_Fixed*        weight_vector;\n    FT_Fixed*        default_weight_vector;\n\n    PS_FontInfo      font_infos[T1_MAX_MM_DESIGNS + 1];\n    PS_Private       privates  [T1_MAX_MM_DESIGNS + 1];\n\n    FT_ULong         blend_bitflags;\n\n    FT_BBox*         bboxes    [T1_MAX_MM_DESIGNS + 1];\n\n    /* since 2.3.0 */\n\n    /* undocumented, optional: the default design instance;   */\n    /* corresponds to default_weight_vector --                */\n    /* num_default_design_vector == 0 means it is not present */\n    /* in the font and associated metrics files               */\n    FT_UInt          default_design_vector[T1_MAX_MM_DESIGNS];\n    FT_UInt          num_default_design_vector;\n\n  } PS_BlendRec, *PS_Blend;\n\n\n  /* backwards-compatible definition */\n  typedef PS_BlendRec  T1_Blend;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceDictRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to represent data in a CID top-level dictionary.  */\n  /*                                                                       */\n  typedef struct  CID_FaceDictRec_\n  {\n    PS_PrivateRec  private_dict;\n\n    FT_UInt        len_buildchar;\n    FT_Fixed       forcebold_threshold;\n    FT_Pos         stroke_width;\n    FT_Fixed       expansion_factor;\n\n    FT_Byte        paint_type;\n    FT_Byte        font_type;\n    FT_Matrix      font_matrix;\n    FT_Vector      font_offset;\n\n    FT_UInt        num_subrs;\n    FT_ULong       subrmap_offset;\n    FT_Int         sd_bytes;\n\n  } CID_FaceDictRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceDict                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @CID_FaceDictRec structure.                          */\n  /*                                                                       */\n  typedef struct CID_FaceDictRec_*  CID_FaceDict;\n\n  /* */\n\n\n  /* backwards-compatible definition */\n  typedef CID_FaceDictRec  CID_FontDict;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceInfoRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to represent CID Face information.                */\n  /*                                                                       */\n  typedef struct  CID_FaceInfoRec_\n  {\n    FT_String*      cid_font_name;\n    FT_Fixed        cid_version;\n    FT_Int          cid_font_type;\n\n    FT_String*      registry;\n    FT_String*      ordering;\n    FT_Int          supplement;\n\n    PS_FontInfoRec  font_info;\n    FT_BBox         font_bbox;\n    FT_ULong        uid_base;\n\n    FT_Int          num_xuid;\n    FT_ULong        xuid[16];\n\n    FT_ULong        cidmap_offset;\n    FT_Int          fd_bytes;\n    FT_Int          gd_bytes;\n    FT_ULong        cid_count;\n\n    FT_Int          num_dicts;\n    CID_FaceDict    font_dicts;\n\n    FT_ULong        data_offset;\n\n  } CID_FaceInfoRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_FaceInfo                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a @CID_FaceInfoRec structure.                          */\n  /*                                                                       */\n  typedef struct CID_FaceInfoRec_*  CID_FaceInfo;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_Info                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*   This type is equivalent to @CID_FaceInfoRec.  It is deprecated but  */\n  /*   kept to maintain source compatibility between various versions of   */\n  /*   FreeType.                                                           */\n  /*                                                                       */\n  typedef CID_FaceInfoRec  CID_Info;\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Has_PS_Glyph_Names\n   *\n   * @description:\n   *    Return true if a given face provides reliable PostScript glyph\n   *    names.  This is similar to using the @FT_HAS_GLYPH_NAMES macro,\n   *    except that certain fonts (mostly TrueType) contain incorrect\n   *    glyph name tables.\n   *\n   *    When this function returns true, the caller is sure that the glyph\n   *    names returned by @FT_Get_Glyph_Name are reliable.\n   *\n   * @input:\n   *    face ::\n   *       face handle\n   *\n   * @return:\n   *    Boolean.  True if glyph names are reliable.\n   *\n   */\n  FT_EXPORT( FT_Int )\n  FT_Has_PS_Glyph_Names( FT_Face  face );\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Get_PS_Font_Info\n   *\n   * @description:\n   *    Retrieve the @PS_FontInfoRec structure corresponding to a given\n   *    PostScript font.\n   *\n   * @input:\n   *    face ::\n   *       PostScript face handle.\n   *\n   * @output:\n   *    afont_info ::\n   *       Output font info structure pointer.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    The string pointers within the font info structure are owned by\n   *    the face and don't need to be freed by the caller.\n   *\n   *    If the font's format is not PostScript-based, this function will\n   *    return the `FT_Err_Invalid_Argument' error code.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_PS_Font_Info( FT_Face      face,\n                       PS_FontInfo  afont_info );\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Get_PS_Font_Private\n   *\n   * @description:\n   *    Retrieve the @PS_PrivateRec structure corresponding to a given\n   *    PostScript font.\n   *\n   * @input:\n   *    face ::\n   *       PostScript face handle.\n   *\n   * @output:\n   *    afont_private ::\n   *       Output private dictionary structure pointer.\n   *\n   * @return:\n   *    FreeType error code.  0~means success.\n   *\n   * @note:\n   *    The string pointers within the @PS_PrivateRec structure are owned by\n   *    the face and don't need to be freed by the caller.\n   *\n   *    If the font's format is not PostScript-based, this function returns\n   *    the `FT_Err_Invalid_Argument' error code.\n   *\n   */\n  FT_EXPORT( FT_Error )\n  FT_Get_PS_Font_Private( FT_Face     face,\n                          PS_Private  afont_private );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    T1_EncodingType                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration describing the `Encoding' entry in a Type 1         */\n  /*    dictionary.                                                        */\n  /*                                                                       */\n  typedef enum  T1_EncodingType_\n  {\n    T1_ENCODING_TYPE_NONE = 0,\n    T1_ENCODING_TYPE_ARRAY,\n    T1_ENCODING_TYPE_STANDARD,\n    T1_ENCODING_TYPE_ISOLATIN1,\n    T1_ENCODING_TYPE_EXPERT\n\n  } T1_EncodingType;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    PS_Dict_Keys                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used in calls to @FT_Get_PS_Font_Value to identify  */\n  /*    the Type~1 dictionary entry to retrieve.                           */\n  /*                                                                       */\n  typedef enum  PS_Dict_Keys_\n  {\n    /* conventionally in the font dictionary */\n    PS_DICT_FONT_TYPE,              /* FT_Byte         */\n    PS_DICT_FONT_MATRIX,            /* FT_Fixed        */\n    PS_DICT_FONT_BBOX,              /* FT_Fixed        */\n    PS_DICT_PAINT_TYPE,             /* FT_Byte         */\n    PS_DICT_FONT_NAME,              /* FT_String*      */\n    PS_DICT_UNIQUE_ID,              /* FT_Int          */\n    PS_DICT_NUM_CHAR_STRINGS,       /* FT_Int          */\n    PS_DICT_CHAR_STRING_KEY,        /* FT_String*      */\n    PS_DICT_CHAR_STRING,            /* FT_String*      */\n    PS_DICT_ENCODING_TYPE,          /* T1_EncodingType */\n    PS_DICT_ENCODING_ENTRY,         /* FT_String*      */\n\n    /* conventionally in the font Private dictionary */\n    PS_DICT_NUM_SUBRS,              /* FT_Int     */\n    PS_DICT_SUBR,                   /* FT_String* */\n    PS_DICT_STD_HW,                 /* FT_UShort  */\n    PS_DICT_STD_VW,                 /* FT_UShort  */\n    PS_DICT_NUM_BLUE_VALUES,        /* FT_Byte    */\n    PS_DICT_BLUE_VALUE,             /* FT_Short   */\n    PS_DICT_BLUE_FUZZ,              /* FT_Int     */\n    PS_DICT_NUM_OTHER_BLUES,        /* FT_Byte    */\n    PS_DICT_OTHER_BLUE,             /* FT_Short   */\n    PS_DICT_NUM_FAMILY_BLUES,       /* FT_Byte    */\n    PS_DICT_FAMILY_BLUE,            /* FT_Short   */\n    PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte    */\n    PS_DICT_FAMILY_OTHER_BLUE,      /* FT_Short   */\n    PS_DICT_BLUE_SCALE,             /* FT_Fixed   */\n    PS_DICT_BLUE_SHIFT,             /* FT_Int     */\n    PS_DICT_NUM_STEM_SNAP_H,        /* FT_Byte    */\n    PS_DICT_STEM_SNAP_H,            /* FT_Short   */\n    PS_DICT_NUM_STEM_SNAP_V,        /* FT_Byte    */\n    PS_DICT_STEM_SNAP_V,            /* FT_Short   */\n    PS_DICT_FORCE_BOLD,             /* FT_Bool    */\n    PS_DICT_RND_STEM_UP,            /* FT_Bool    */\n    PS_DICT_MIN_FEATURE,            /* FT_Short   */\n    PS_DICT_LEN_IV,                 /* FT_Int     */\n    PS_DICT_PASSWORD,               /* FT_Long    */\n    PS_DICT_LANGUAGE_GROUP,         /* FT_Long    */\n\n    /* conventionally in the font FontInfo dictionary */\n    PS_DICT_VERSION,                /* FT_String* */\n    PS_DICT_NOTICE,                 /* FT_String* */\n    PS_DICT_FULL_NAME,              /* FT_String* */\n    PS_DICT_FAMILY_NAME,            /* FT_String* */\n    PS_DICT_WEIGHT,                 /* FT_String* */\n    PS_DICT_IS_FIXED_PITCH,         /* FT_Bool    */\n    PS_DICT_UNDERLINE_POSITION,     /* FT_Short   */\n    PS_DICT_UNDERLINE_THICKNESS,    /* FT_UShort  */\n    PS_DICT_FS_TYPE,                /* FT_UShort  */\n    PS_DICT_ITALIC_ANGLE,           /* FT_Long    */\n\n    PS_DICT_MAX = PS_DICT_ITALIC_ANGLE\n\n  } PS_Dict_Keys;\n\n\n  /************************************************************************\n   *\n   * @function:\n   *    FT_Get_PS_Font_Value\n   *\n   * @description:\n   *    Retrieve the value for the supplied key from a PostScript font.\n   *\n   * @input:\n   *    face ::\n   *       PostScript face handle.\n   *\n   *    key ::\n   *       An enumeration value representing the dictionary key to retrieve.\n   *\n   *    idx ::\n   *       For array values, this specifies the index to be returned.\n   *\n   *    value ::\n   *       A pointer to memory into which to write the value.\n   *\n   *    valen_len ::\n   *       The size, in bytes, of the memory supplied for the value.\n   *\n   * @output:\n   *    value ::\n   *       The value matching the above key, if it exists.\n   *\n   * @return:\n   *    The amount of memory (in bytes) required to hold the requested\n   *    value (if it exists, -1 otherwise).\n   *\n   * @note:\n   *    The values returned are not pointers into the internal structures of\n   *    the face, but are `fresh' copies, so that the memory containing them\n   *    belongs to the calling application.  This also enforces the\n   *    `read-only' nature of these values, i.e., this function cannot be\n   *    used to manipulate the face.\n   *\n   *    `value' is a void pointer because the values returned can be of\n   *    various types.\n   *\n   *    If either `value' is NULL or `value_len' is too small, just the\n   *    required memory size for the requested entry is returned.\n   *\n   *    The `idx' parameter is used, not only to retrieve elements of, for\n   *    example, the FontMatrix or FontBBox, but also to retrieve name keys\n   *    from the CharStrings dictionary, and the charstrings themselves.  It\n   *    is ignored for atomic values.\n   *\n   *    PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000.  To\n   *    get the value as in the font stream, you need to divide by\n   *    65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).\n   *\n   *    IMPORTANT: Only key/value pairs read by the FreeType interpreter can\n   *    be retrieved.  So, for example, PostScript procedures such as NP,\n   *    ND, and RD are not available.  Arbitrary keys are, obviously, not be\n   *    available either.\n   *\n   *    If the font's format is not PostScript-based, this function returns\n   *    the `FT_Err_Invalid_Argument' error code.\n   *\n   */\n  FT_EXPORT( FT_Long )\n  FT_Get_PS_Font_Value( FT_Face       face,\n                        PS_Dict_Keys  key,\n                        FT_UInt       idx,\n                        void         *value,\n                        FT_Long       value_len );\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __T1TABLES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ttnameid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttnameid.h                                                             */\n/*                                                                         */\n/*    TrueType name ID definitions (specification only).                   */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2008, 2012 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTNAMEID_H__\n#define __TTNAMEID_H__\n\n\n#include <ft2build.h>\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    truetype_tables                                                    */\n  /*                                                                       */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values for the `platform' identifier code in the name        */\n  /* records of the TTF `name' table.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_PLATFORM_XXX\n   *\n   * @description:\n   *   A list of valid values for the `platform_id' identifier code in\n   *   @FT_CharMapRec and @FT_SfntName structures.\n   *\n   * @values:\n   *   TT_PLATFORM_APPLE_UNICODE ::\n   *     Used by Apple to indicate a Unicode character map and/or name entry.\n   *     See @TT_APPLE_ID_XXX for corresponding `encoding_id' values.  Note\n   *     that name entries in this format are coded as big-endian UCS-2\n   *     character codes _only_.\n   *\n   *   TT_PLATFORM_MACINTOSH ::\n   *     Used by Apple to indicate a MacOS-specific charmap and/or name entry.\n   *     See @TT_MAC_ID_XXX for corresponding `encoding_id' values.  Note that\n   *     most TrueType fonts contain an Apple roman charmap to be usable on\n   *     MacOS systems (even if they contain a Microsoft charmap as well).\n   *\n   *   TT_PLATFORM_ISO ::\n   *     This value was used to specify ISO/IEC 10646 charmaps.  It is however\n   *     now deprecated.  See @TT_ISO_ID_XXX for a list of corresponding\n   *     `encoding_id' values.\n   *\n   *   TT_PLATFORM_MICROSOFT ::\n   *     Used by Microsoft to indicate Windows-specific charmaps.  See\n   *     @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.\n   *     Note that most fonts contain a Unicode charmap using\n   *     (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).\n   *\n   *   TT_PLATFORM_CUSTOM ::\n   *     Used to indicate application-specific charmaps.\n   *\n   *   TT_PLATFORM_ADOBE ::\n   *     This value isn't part of any font format specification, but is used\n   *     by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec\n   *     structure.  See @TT_ADOBE_ID_XXX.\n   */\n\n#define TT_PLATFORM_APPLE_UNICODE  0\n#define TT_PLATFORM_MACINTOSH      1\n#define TT_PLATFORM_ISO            2 /* deprecated */\n#define TT_PLATFORM_MICROSOFT      3\n#define TT_PLATFORM_CUSTOM         4\n#define TT_PLATFORM_ADOBE          7 /* artificial */\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_APPLE_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.\n   *\n   * @values:\n   *   TT_APPLE_ID_DEFAULT ::\n   *     Unicode version 1.0.\n   *\n   *   TT_APPLE_ID_UNICODE_1_1 ::\n   *     Unicode 1.1; specifies Hangul characters starting at U+34xx.\n   *\n   *   TT_APPLE_ID_ISO_10646 ::\n   *     Deprecated (identical to preceding).\n   *\n   *   TT_APPLE_ID_UNICODE_2_0 ::\n   *     Unicode 2.0 and beyond (UTF-16 BMP only).\n   *\n   *   TT_APPLE_ID_UNICODE_32 ::\n   *     Unicode 3.1 and beyond, using UTF-32.\n   *\n   *   TT_APPLE_ID_VARIANT_SELECTOR ::\n   *     From Adobe, not Apple.  Not a normal cmap.  Specifies variations\n   *     on a real cmap.\n   */\n\n#define TT_APPLE_ID_DEFAULT           0 /* Unicode 1.0 */\n#define TT_APPLE_ID_UNICODE_1_1       1 /* specify Hangul at U+34xx */\n#define TT_APPLE_ID_ISO_10646         2 /* deprecated */\n#define TT_APPLE_ID_UNICODE_2_0       3 /* or later */\n#define TT_APPLE_ID_UNICODE_32        4 /* 2.0 or later, full repertoire */\n#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data */\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_MAC_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_MACINTOSH charmaps and name entries.\n   *\n   * @values:\n   *   TT_MAC_ID_ROMAN ::\n   *   TT_MAC_ID_JAPANESE ::\n   *   TT_MAC_ID_TRADITIONAL_CHINESE ::\n   *   TT_MAC_ID_KOREAN ::\n   *   TT_MAC_ID_ARABIC ::\n   *   TT_MAC_ID_HEBREW ::\n   *   TT_MAC_ID_GREEK ::\n   *   TT_MAC_ID_RUSSIAN ::\n   *   TT_MAC_ID_RSYMBOL ::\n   *   TT_MAC_ID_DEVANAGARI ::\n   *   TT_MAC_ID_GURMUKHI ::\n   *   TT_MAC_ID_GUJARATI ::\n   *   TT_MAC_ID_ORIYA ::\n   *   TT_MAC_ID_BENGALI ::\n   *   TT_MAC_ID_TAMIL ::\n   *   TT_MAC_ID_TELUGU ::\n   *   TT_MAC_ID_KANNADA ::\n   *   TT_MAC_ID_MALAYALAM ::\n   *   TT_MAC_ID_SINHALESE ::\n   *   TT_MAC_ID_BURMESE ::\n   *   TT_MAC_ID_KHMER ::\n   *   TT_MAC_ID_THAI ::\n   *   TT_MAC_ID_LAOTIAN ::\n   *   TT_MAC_ID_GEORGIAN ::\n   *   TT_MAC_ID_ARMENIAN ::\n   *   TT_MAC_ID_MALDIVIAN ::\n   *   TT_MAC_ID_SIMPLIFIED_CHINESE ::\n   *   TT_MAC_ID_TIBETAN ::\n   *   TT_MAC_ID_MONGOLIAN ::\n   *   TT_MAC_ID_GEEZ ::\n   *   TT_MAC_ID_SLAVIC ::\n   *   TT_MAC_ID_VIETNAMESE ::\n   *   TT_MAC_ID_SINDHI ::\n   *   TT_MAC_ID_UNINTERP ::\n   */\n\n#define TT_MAC_ID_ROMAN                 0\n#define TT_MAC_ID_JAPANESE              1\n#define TT_MAC_ID_TRADITIONAL_CHINESE   2\n#define TT_MAC_ID_KOREAN                3\n#define TT_MAC_ID_ARABIC                4\n#define TT_MAC_ID_HEBREW                5\n#define TT_MAC_ID_GREEK                 6\n#define TT_MAC_ID_RUSSIAN               7\n#define TT_MAC_ID_RSYMBOL               8\n#define TT_MAC_ID_DEVANAGARI            9\n#define TT_MAC_ID_GURMUKHI             10\n#define TT_MAC_ID_GUJARATI             11\n#define TT_MAC_ID_ORIYA                12\n#define TT_MAC_ID_BENGALI              13\n#define TT_MAC_ID_TAMIL                14\n#define TT_MAC_ID_TELUGU               15\n#define TT_MAC_ID_KANNADA              16\n#define TT_MAC_ID_MALAYALAM            17\n#define TT_MAC_ID_SINHALESE            18\n#define TT_MAC_ID_BURMESE              19\n#define TT_MAC_ID_KHMER                20\n#define TT_MAC_ID_THAI                 21\n#define TT_MAC_ID_LAOTIAN              22\n#define TT_MAC_ID_GEORGIAN             23\n#define TT_MAC_ID_ARMENIAN             24\n#define TT_MAC_ID_MALDIVIAN            25\n#define TT_MAC_ID_SIMPLIFIED_CHINESE   25\n#define TT_MAC_ID_TIBETAN              26\n#define TT_MAC_ID_MONGOLIAN            27\n#define TT_MAC_ID_GEEZ                 28\n#define TT_MAC_ID_SLAVIC               29\n#define TT_MAC_ID_VIETNAMESE           30\n#define TT_MAC_ID_SINDHI               31\n#define TT_MAC_ID_UNINTERP             32\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_ISO_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_ISO charmaps and name entries.\n   *\n   *   Their use is now deprecated.\n   *\n   * @values:\n   *   TT_ISO_ID_7BIT_ASCII ::\n   *     ASCII.\n   *   TT_ISO_ID_10646 ::\n   *     ISO/10646.\n   *   TT_ISO_ID_8859_1 ::\n   *     Also known as Latin-1.\n   */\n\n#define TT_ISO_ID_7BIT_ASCII  0\n#define TT_ISO_ID_10646       1\n#define TT_ISO_ID_8859_1      2\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_MS_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_MICROSOFT charmaps and name entries.\n   *\n   * @values:\n   *   TT_MS_ID_SYMBOL_CS ::\n   *     Corresponds to Microsoft symbol encoding. See\n   *     @FT_ENCODING_MS_SYMBOL.\n   *\n   *   TT_MS_ID_UNICODE_CS ::\n   *     Corresponds to a Microsoft WGL4 charmap, matching Unicode.  See\n   *     @FT_ENCODING_UNICODE.\n   *\n   *   TT_MS_ID_SJIS ::\n   *     Corresponds to SJIS Japanese encoding.  See @FT_ENCODING_SJIS.\n   *\n   *   TT_MS_ID_GB2312 ::\n   *     Corresponds to Simplified Chinese as used in Mainland China.  See\n   *     @FT_ENCODING_GB2312.\n   *\n   *   TT_MS_ID_BIG_5 ::\n   *     Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.\n   *     See @FT_ENCODING_BIG5.\n   *\n   *   TT_MS_ID_WANSUNG ::\n   *     Corresponds to Korean Wansung encoding.  See @FT_ENCODING_WANSUNG.\n   *\n   *   TT_MS_ID_JOHAB ::\n   *     Corresponds to Johab encoding.  See @FT_ENCODING_JOHAB.\n   *\n   *   TT_MS_ID_UCS_4 ::\n   *     Corresponds to UCS-4 or UTF-32 charmaps.  This has been added to\n   *     the OpenType specification version 1.4 (mid-2001.)\n   */\n\n#define TT_MS_ID_SYMBOL_CS    0\n#define TT_MS_ID_UNICODE_CS   1\n#define TT_MS_ID_SJIS         2\n#define TT_MS_ID_GB2312       3\n#define TT_MS_ID_BIG_5        4\n#define TT_MS_ID_WANSUNG      5\n#define TT_MS_ID_JOHAB        6\n#define TT_MS_ID_UCS_4       10\n\n\n  /***********************************************************************\n   *\n   * @enum:\n   *   TT_ADOBE_ID_XXX\n   *\n   * @description:\n   *   A list of valid values for the `encoding_id' for\n   *   @TT_PLATFORM_ADOBE charmaps.  This is a FreeType-specific extension!\n   *\n   * @values:\n   *   TT_ADOBE_ID_STANDARD ::\n   *     Adobe standard encoding.\n   *   TT_ADOBE_ID_EXPERT ::\n   *     Adobe expert encoding.\n   *   TT_ADOBE_ID_CUSTOM ::\n   *     Adobe custom encoding.\n   *   TT_ADOBE_ID_LATIN_1 ::\n   *     Adobe Latin~1 encoding.\n   */\n\n#define TT_ADOBE_ID_STANDARD  0\n#define TT_ADOBE_ID_EXPERT    1\n#define TT_ADOBE_ID_CUSTOM    2\n#define TT_ADOBE_ID_LATIN_1   3\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values of the language identifier field in the name records  */\n  /* of the TTF `name' table if the `platform' identifier code is          */\n  /* TT_PLATFORM_MACINTOSH.  These values are also used as return values   */\n  /* for function @FT_Get_CMap_Language_ID.                                */\n  /*                                                                       */\n  /* The canonical source for the Apple assigned Language ID's is at       */\n  /*                                                                       */\n  /*   https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html      */\n  /*                                                                       */\n#define TT_MAC_LANGID_ENGLISH                       0\n#define TT_MAC_LANGID_FRENCH                        1\n#define TT_MAC_LANGID_GERMAN                        2\n#define TT_MAC_LANGID_ITALIAN                       3\n#define TT_MAC_LANGID_DUTCH                         4\n#define TT_MAC_LANGID_SWEDISH                       5\n#define TT_MAC_LANGID_SPANISH                       6\n#define TT_MAC_LANGID_DANISH                        7\n#define TT_MAC_LANGID_PORTUGUESE                    8\n#define TT_MAC_LANGID_NORWEGIAN                     9\n#define TT_MAC_LANGID_HEBREW                       10\n#define TT_MAC_LANGID_JAPANESE                     11\n#define TT_MAC_LANGID_ARABIC                       12\n#define TT_MAC_LANGID_FINNISH                      13\n#define TT_MAC_LANGID_GREEK                        14\n#define TT_MAC_LANGID_ICELANDIC                    15\n#define TT_MAC_LANGID_MALTESE                      16\n#define TT_MAC_LANGID_TURKISH                      17\n#define TT_MAC_LANGID_CROATIAN                     18\n#define TT_MAC_LANGID_CHINESE_TRADITIONAL          19\n#define TT_MAC_LANGID_URDU                         20\n#define TT_MAC_LANGID_HINDI                        21\n#define TT_MAC_LANGID_THAI                         22\n#define TT_MAC_LANGID_KOREAN                       23\n#define TT_MAC_LANGID_LITHUANIAN                   24\n#define TT_MAC_LANGID_POLISH                       25\n#define TT_MAC_LANGID_HUNGARIAN                    26\n#define TT_MAC_LANGID_ESTONIAN                     27\n#define TT_MAC_LANGID_LETTISH                      28\n#define TT_MAC_LANGID_SAAMISK                      29\n#define TT_MAC_LANGID_FAEROESE                     30\n#define TT_MAC_LANGID_FARSI                        31\n#define TT_MAC_LANGID_RUSSIAN                      32\n#define TT_MAC_LANGID_CHINESE_SIMPLIFIED           33\n#define TT_MAC_LANGID_FLEMISH                      34\n#define TT_MAC_LANGID_IRISH                        35\n#define TT_MAC_LANGID_ALBANIAN                     36\n#define TT_MAC_LANGID_ROMANIAN                     37\n#define TT_MAC_LANGID_CZECH                        38\n#define TT_MAC_LANGID_SLOVAK                       39\n#define TT_MAC_LANGID_SLOVENIAN                    40\n#define TT_MAC_LANGID_YIDDISH                      41\n#define TT_MAC_LANGID_SERBIAN                      42\n#define TT_MAC_LANGID_MACEDONIAN                   43\n#define TT_MAC_LANGID_BULGARIAN                    44\n#define TT_MAC_LANGID_UKRAINIAN                    45\n#define TT_MAC_LANGID_BYELORUSSIAN                 46\n#define TT_MAC_LANGID_UZBEK                        47\n#define TT_MAC_LANGID_KAZAKH                       48\n#define TT_MAC_LANGID_AZERBAIJANI                  49\n#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT  49\n#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT    50\n#define TT_MAC_LANGID_ARMENIAN                     51\n#define TT_MAC_LANGID_GEORGIAN                     52\n#define TT_MAC_LANGID_MOLDAVIAN                    53\n#define TT_MAC_LANGID_KIRGHIZ                      54\n#define TT_MAC_LANGID_TAJIKI                       55\n#define TT_MAC_LANGID_TURKMEN                      56\n#define TT_MAC_LANGID_MONGOLIAN                    57\n#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT   57\n#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT    58\n#define TT_MAC_LANGID_PASHTO                       59\n#define TT_MAC_LANGID_KURDISH                      60\n#define TT_MAC_LANGID_KASHMIRI                     61\n#define TT_MAC_LANGID_SINDHI                       62\n#define TT_MAC_LANGID_TIBETAN                      63\n#define TT_MAC_LANGID_NEPALI                       64\n#define TT_MAC_LANGID_SANSKRIT                     65\n#define TT_MAC_LANGID_MARATHI                      66\n#define TT_MAC_LANGID_BENGALI                      67\n#define TT_MAC_LANGID_ASSAMESE                     68\n#define TT_MAC_LANGID_GUJARATI                     69\n#define TT_MAC_LANGID_PUNJABI                      70\n#define TT_MAC_LANGID_ORIYA                        71\n#define TT_MAC_LANGID_MALAYALAM                    72\n#define TT_MAC_LANGID_KANNADA                      73\n#define TT_MAC_LANGID_TAMIL                        74\n#define TT_MAC_LANGID_TELUGU                       75\n#define TT_MAC_LANGID_SINHALESE                    76\n#define TT_MAC_LANGID_BURMESE                      77\n#define TT_MAC_LANGID_KHMER                        78\n#define TT_MAC_LANGID_LAO                          79\n#define TT_MAC_LANGID_VIETNAMESE                   80\n#define TT_MAC_LANGID_INDONESIAN                   81\n#define TT_MAC_LANGID_TAGALOG                      82\n#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT           83\n#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT          84\n#define TT_MAC_LANGID_AMHARIC                      85\n#define TT_MAC_LANGID_TIGRINYA                     86\n#define TT_MAC_LANGID_GALLA                        87\n#define TT_MAC_LANGID_SOMALI                       88\n#define TT_MAC_LANGID_SWAHILI                      89\n#define TT_MAC_LANGID_RUANDA                       90\n#define TT_MAC_LANGID_RUNDI                        91\n#define TT_MAC_LANGID_CHEWA                        92\n#define TT_MAC_LANGID_MALAGASY                     93\n#define TT_MAC_LANGID_ESPERANTO                    94\n#define TT_MAC_LANGID_WELSH                       128\n#define TT_MAC_LANGID_BASQUE                      129\n#define TT_MAC_LANGID_CATALAN                     130\n#define TT_MAC_LANGID_LATIN                       131\n#define TT_MAC_LANGID_QUECHUA                     132\n#define TT_MAC_LANGID_GUARANI                     133\n#define TT_MAC_LANGID_AYMARA                      134\n#define TT_MAC_LANGID_TATAR                       135\n#define TT_MAC_LANGID_UIGHUR                      136\n#define TT_MAC_LANGID_DZONGKHA                    137\n#define TT_MAC_LANGID_JAVANESE                    138\n#define TT_MAC_LANGID_SUNDANESE                   139\n\n\n#if 0  /* these seem to be errors that have been dropped */\n\n#define TT_MAC_LANGID_SCOTTISH_GAELIC             140\n#define TT_MAC_LANGID_IRISH_GAELIC                141\n\n#endif\n\n\n  /* The following codes are new as of 2000-03-10 */\n#define TT_MAC_LANGID_GALICIAN                    140\n#define TT_MAC_LANGID_AFRIKAANS                   141\n#define TT_MAC_LANGID_BRETON                      142\n#define TT_MAC_LANGID_INUKTITUT                   143\n#define TT_MAC_LANGID_SCOTTISH_GAELIC             144\n#define TT_MAC_LANGID_MANX_GAELIC                 145\n#define TT_MAC_LANGID_IRISH_GAELIC                146\n#define TT_MAC_LANGID_TONGAN                      147\n#define TT_MAC_LANGID_GREEK_POLYTONIC             148\n#define TT_MAC_LANGID_GREELANDIC                  149\n#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT    150\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values of the language identifier field in the name records  */\n  /* of the TTF `name' table if the `platform' identifier code is          */\n  /* TT_PLATFORM_MICROSOFT.                                                */\n  /*                                                                       */\n  /* The canonical source for the MS assigned LCIDs is                     */\n  /*                                                                       */\n  /*   http://www.microsoft.com/globaldev/reference/lcid-all.mspx          */\n  /*                                                                       */\n\n#define TT_MS_LANGID_ARABIC_GENERAL                    0x0001\n#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA               0x0401\n#define TT_MS_LANGID_ARABIC_IRAQ                       0x0801\n#define TT_MS_LANGID_ARABIC_EGYPT                      0x0c01\n#define TT_MS_LANGID_ARABIC_LIBYA                      0x1001\n#define TT_MS_LANGID_ARABIC_ALGERIA                    0x1401\n#define TT_MS_LANGID_ARABIC_MOROCCO                    0x1801\n#define TT_MS_LANGID_ARABIC_TUNISIA                    0x1c01\n#define TT_MS_LANGID_ARABIC_OMAN                       0x2001\n#define TT_MS_LANGID_ARABIC_YEMEN                      0x2401\n#define TT_MS_LANGID_ARABIC_SYRIA                      0x2801\n#define TT_MS_LANGID_ARABIC_JORDAN                     0x2c01\n#define TT_MS_LANGID_ARABIC_LEBANON                    0x3001\n#define TT_MS_LANGID_ARABIC_KUWAIT                     0x3401\n#define TT_MS_LANGID_ARABIC_UAE                        0x3801\n#define TT_MS_LANGID_ARABIC_BAHRAIN                    0x3c01\n#define TT_MS_LANGID_ARABIC_QATAR                      0x4001\n#define TT_MS_LANGID_BULGARIAN_BULGARIA                0x0402\n#define TT_MS_LANGID_CATALAN_SPAIN                     0x0403\n#define TT_MS_LANGID_CHINESE_GENERAL                   0x0004\n#define TT_MS_LANGID_CHINESE_TAIWAN                    0x0404\n#define TT_MS_LANGID_CHINESE_PRC                       0x0804\n#define TT_MS_LANGID_CHINESE_HONG_KONG                 0x0c04\n#define TT_MS_LANGID_CHINESE_SINGAPORE                 0x1004\n\n#if 1  /* this looks like the correct value */\n#define TT_MS_LANGID_CHINESE_MACAU                     0x1404\n#else  /* but beware, Microsoft may change its mind...\n          the most recent Word reference has the following: */\n#define TT_MS_LANGID_CHINESE_MACAU  TT_MS_LANGID_CHINESE_HONG_KONG\n#endif\n\n#if 0  /* used only with .NET `cultures'; commented out */\n#define TT_MS_LANGID_CHINESE_TRADITIONAL               0x7C04\n#endif\n\n#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC              0x0405\n#define TT_MS_LANGID_DANISH_DENMARK                    0x0406\n#define TT_MS_LANGID_GERMAN_GERMANY                    0x0407\n#define TT_MS_LANGID_GERMAN_SWITZERLAND                0x0807\n#define TT_MS_LANGID_GERMAN_AUSTRIA                    0x0c07\n#define TT_MS_LANGID_GERMAN_LUXEMBOURG                 0x1007\n#define TT_MS_LANGID_GERMAN_LIECHTENSTEI               0x1407\n#define TT_MS_LANGID_GREEK_GREECE                      0x0408\n\n  /* don't ask what this one means... It is commented out currently. */\n#if 0\n#define TT_MS_LANGID_GREEK_GREECE2                     0x2008\n#endif\n\n#define TT_MS_LANGID_ENGLISH_GENERAL                   0x0009\n#define TT_MS_LANGID_ENGLISH_UNITED_STATES             0x0409\n#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM            0x0809\n#define TT_MS_LANGID_ENGLISH_AUSTRALIA                 0x0c09\n#define TT_MS_LANGID_ENGLISH_CANADA                    0x1009\n#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND               0x1409\n#define TT_MS_LANGID_ENGLISH_IRELAND                   0x1809\n#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA              0x1c09\n#define TT_MS_LANGID_ENGLISH_JAMAICA                   0x2009\n#define TT_MS_LANGID_ENGLISH_CARIBBEAN                 0x2409\n#define TT_MS_LANGID_ENGLISH_BELIZE                    0x2809\n#define TT_MS_LANGID_ENGLISH_TRINIDAD                  0x2c09\n#define TT_MS_LANGID_ENGLISH_ZIMBABWE                  0x3009\n#define TT_MS_LANGID_ENGLISH_PHILIPPINES               0x3409\n#define TT_MS_LANGID_ENGLISH_INDONESIA                 0x3809\n#define TT_MS_LANGID_ENGLISH_HONG_KONG                 0x3c09\n#define TT_MS_LANGID_ENGLISH_INDIA                     0x4009\n#define TT_MS_LANGID_ENGLISH_MALAYSIA                  0x4409\n#define TT_MS_LANGID_ENGLISH_SINGAPORE                 0x4809\n#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT    0x040a\n#define TT_MS_LANGID_SPANISH_MEXICO                    0x080a\n#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT  0x0c0a\n#define TT_MS_LANGID_SPANISH_GUATEMALA                 0x100a\n#define TT_MS_LANGID_SPANISH_COSTA_RICA                0x140a\n#define TT_MS_LANGID_SPANISH_PANAMA                    0x180a\n#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC        0x1c0a\n#define TT_MS_LANGID_SPANISH_VENEZUELA                 0x200a\n#define TT_MS_LANGID_SPANISH_COLOMBIA                  0x240a\n#define TT_MS_LANGID_SPANISH_PERU                      0x280a\n#define TT_MS_LANGID_SPANISH_ARGENTINA                 0x2c0a\n#define TT_MS_LANGID_SPANISH_ECUADOR                   0x300a\n#define TT_MS_LANGID_SPANISH_CHILE                     0x340a\n#define TT_MS_LANGID_SPANISH_URUGUAY                   0x380a\n#define TT_MS_LANGID_SPANISH_PARAGUAY                  0x3c0a\n#define TT_MS_LANGID_SPANISH_BOLIVIA                   0x400a\n#define TT_MS_LANGID_SPANISH_EL_SALVADOR               0x440a\n#define TT_MS_LANGID_SPANISH_HONDURAS                  0x480a\n#define TT_MS_LANGID_SPANISH_NICARAGUA                 0x4c0a\n#define TT_MS_LANGID_SPANISH_PUERTO_RICO               0x500a\n#define TT_MS_LANGID_SPANISH_UNITED_STATES             0x540a\n  /* The following ID blatantly violate MS specs by using a */\n  /* sublanguage > 0x1F.                                    */\n#define TT_MS_LANGID_SPANISH_LATIN_AMERICA             0xE40aU\n#define TT_MS_LANGID_FINNISH_FINLAND                   0x040b\n#define TT_MS_LANGID_FRENCH_FRANCE                     0x040c\n#define TT_MS_LANGID_FRENCH_BELGIUM                    0x080c\n#define TT_MS_LANGID_FRENCH_CANADA                     0x0c0c\n#define TT_MS_LANGID_FRENCH_SWITZERLAND                0x100c\n#define TT_MS_LANGID_FRENCH_LUXEMBOURG                 0x140c\n#define TT_MS_LANGID_FRENCH_MONACO                     0x180c\n#define TT_MS_LANGID_FRENCH_WEST_INDIES                0x1c0c\n#define TT_MS_LANGID_FRENCH_REUNION                    0x200c\n#define TT_MS_LANGID_FRENCH_CONGO                      0x240c\n  /* which was formerly: */\n#define TT_MS_LANGID_FRENCH_ZAIRE  TT_MS_LANGID_FRENCH_CONGO\n#define TT_MS_LANGID_FRENCH_SENEGAL                    0x280c\n#define TT_MS_LANGID_FRENCH_CAMEROON                   0x2c0c\n#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE              0x300c\n#define TT_MS_LANGID_FRENCH_MALI                       0x340c\n#define TT_MS_LANGID_FRENCH_MOROCCO                    0x380c\n#define TT_MS_LANGID_FRENCH_HAITI                      0x3c0c\n  /* and another violation of the spec (see 0xE40aU) */\n#define TT_MS_LANGID_FRENCH_NORTH_AFRICA               0xE40cU\n#define TT_MS_LANGID_HEBREW_ISRAEL                     0x040d\n#define TT_MS_LANGID_HUNGARIAN_HUNGARY                 0x040e\n#define TT_MS_LANGID_ICELANDIC_ICELAND                 0x040f\n#define TT_MS_LANGID_ITALIAN_ITALY                     0x0410\n#define TT_MS_LANGID_ITALIAN_SWITZERLAND               0x0810\n#define TT_MS_LANGID_JAPANESE_JAPAN                    0x0411\n#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA     0x0412\n#define TT_MS_LANGID_KOREAN_JOHAB_KOREA                0x0812\n#define TT_MS_LANGID_DUTCH_NETHERLANDS                 0x0413\n#define TT_MS_LANGID_DUTCH_BELGIUM                     0x0813\n#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL           0x0414\n#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK          0x0814\n#define TT_MS_LANGID_POLISH_POLAND                     0x0415\n#define TT_MS_LANGID_PORTUGUESE_BRAZIL                 0x0416\n#define TT_MS_LANGID_PORTUGUESE_PORTUGAL               0x0816\n#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND        0x0417\n#define TT_MS_LANGID_ROMANIAN_ROMANIA                  0x0418\n#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA                0x0818\n#define TT_MS_LANGID_RUSSIAN_RUSSIA                    0x0419\n#define TT_MS_LANGID_RUSSIAN_MOLDAVIA                  0x0819\n#define TT_MS_LANGID_CROATIAN_CROATIA                  0x041a\n#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN              0x081a\n#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC           0x0c1a\n\n#if 0  /* this used to be this value, but it looks like we were wrong */\n#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x101a\n#else  /* current sources say */\n#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA       0x101a\n#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x141a\n       /* and XPsp2 Platform SDK added (2004-07-26) */\n       /* Names are shortened to be significant within 40 chars. */\n#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN         0x181a\n#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC      0x181a\n#endif\n\n#define TT_MS_LANGID_SLOVAK_SLOVAKIA                   0x041b\n#define TT_MS_LANGID_ALBANIAN_ALBANIA                  0x041c\n#define TT_MS_LANGID_SWEDISH_SWEDEN                    0x041d\n#define TT_MS_LANGID_SWEDISH_FINLAND                   0x081d\n#define TT_MS_LANGID_THAI_THAILAND                     0x041e\n#define TT_MS_LANGID_TURKISH_TURKEY                    0x041f\n#define TT_MS_LANGID_URDU_PAKISTAN                     0x0420\n#define TT_MS_LANGID_URDU_INDIA                        0x0820\n#define TT_MS_LANGID_INDONESIAN_INDONESIA              0x0421\n#define TT_MS_LANGID_UKRAINIAN_UKRAINE                 0x0422\n#define TT_MS_LANGID_BELARUSIAN_BELARUS                0x0423\n#define TT_MS_LANGID_SLOVENE_SLOVENIA                  0x0424\n#define TT_MS_LANGID_ESTONIAN_ESTONIA                  0x0425\n#define TT_MS_LANGID_LATVIAN_LATVIA                    0x0426\n#define TT_MS_LANGID_LITHUANIAN_LITHUANIA              0x0427\n#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA      0x0827\n#define TT_MS_LANGID_TAJIK_TAJIKISTAN                  0x0428\n#define TT_MS_LANGID_FARSI_IRAN                        0x0429\n#define TT_MS_LANGID_VIETNAMESE_VIET_NAM               0x042a\n#define TT_MS_LANGID_ARMENIAN_ARMENIA                  0x042b\n#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN            0x042c\n#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC         0x082c\n#define TT_MS_LANGID_BASQUE_SPAIN                      0x042d\n#define TT_MS_LANGID_SORBIAN_GERMANY                   0x042e\n#define TT_MS_LANGID_MACEDONIAN_MACEDONIA              0x042f\n#define TT_MS_LANGID_SUTU_SOUTH_AFRICA                 0x0430\n#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA               0x0431\n#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA               0x0432\n#define TT_MS_LANGID_VENDA_SOUTH_AFRICA                0x0433\n#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA                0x0434\n#define TT_MS_LANGID_ZULU_SOUTH_AFRICA                 0x0435\n#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA            0x0436\n#define TT_MS_LANGID_GEORGIAN_GEORGIA                  0x0437\n#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS           0x0438\n#define TT_MS_LANGID_HINDI_INDIA                       0x0439\n#define TT_MS_LANGID_MALTESE_MALTA                     0x043a\n  /* Added by XPsp2 Platform SDK (2004-07-26) */\n#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY              0x043b\n#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN              0x083b\n#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND             0x0C3b\n#define TT_MS_LANGID_SAMI_LULE_NORWAY                  0x103b\n#define TT_MS_LANGID_SAMI_LULE_SWEDEN                  0x143b\n#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY              0x183b\n#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN              0x1C3b\n#define TT_MS_LANGID_SAMI_SKOLT_FINLAND                0x203b\n#define TT_MS_LANGID_SAMI_INARI_FINLAND                0x243b\n  /* ... and we also keep our old identifier... */\n#define TT_MS_LANGID_SAAMI_LAPONIA                     0x043b\n\n#if 0 /* this seems to be a previous inversion */\n#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c\n#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c\n#else\n#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c\n#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c\n#endif\n\n#define TT_MS_LANGID_YIDDISH_GERMANY                   0x043d\n#define TT_MS_LANGID_MALAY_MALAYSIA                    0x043e\n#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM           0x083e\n#define TT_MS_LANGID_KAZAK_KAZAKSTAN                   0x043f\n#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440\n  /* alias declared in Windows 2000 */\n#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \\\n          TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN\n\n#define TT_MS_LANGID_SWAHILI_KENYA                     0x0441\n#define TT_MS_LANGID_TURKMEN_TURKMENISTAN              0x0442\n#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN            0x0443\n#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC         0x0843\n#define TT_MS_LANGID_TATAR_TATARSTAN                   0x0444\n#define TT_MS_LANGID_BENGALI_INDIA                     0x0445\n#define TT_MS_LANGID_BENGALI_BANGLADESH                0x0845\n#define TT_MS_LANGID_PUNJABI_INDIA                     0x0446\n#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN           0x0846\n#define TT_MS_LANGID_GUJARATI_INDIA                    0x0447\n#define TT_MS_LANGID_ORIYA_INDIA                       0x0448\n#define TT_MS_LANGID_TAMIL_INDIA                       0x0449\n#define TT_MS_LANGID_TELUGU_INDIA                      0x044a\n#define TT_MS_LANGID_KANNADA_INDIA                     0x044b\n#define TT_MS_LANGID_MALAYALAM_INDIA                   0x044c\n#define TT_MS_LANGID_ASSAMESE_INDIA                    0x044d\n#define TT_MS_LANGID_MARATHI_INDIA                     0x044e\n#define TT_MS_LANGID_SANSKRIT_INDIA                    0x044f\n#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450\n#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN      0x0850\n#define TT_MS_LANGID_TIBETAN_CHINA                     0x0451\n  /* Don't use the next constant!  It has            */\n  /*   (1) the wrong spelling (Dzonghka)             */\n  /*   (2) Microsoft doesn't officially define it -- */\n  /*       at least it is not in the List of Local   */\n  /*       ID Values.                                */\n  /*   (3) Dzongkha is not the same language as      */\n  /*       Tibetan, so merging it is wrong anyway.   */\n  /*                                                 */\n  /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW.    */\n#define TT_MS_LANGID_DZONGHKA_BHUTAN                   0x0851\n\n#if 0\n  /* the following used to be defined */\n#define TT_MS_LANGID_TIBETAN_BHUTAN                    0x0451\n  /* ... but it was changed; */\n#else\n  /* So we will continue to #define it, but with the correct value */\n#define TT_MS_LANGID_TIBETAN_BHUTAN   TT_MS_LANGID_DZONGHKA_BHUTAN\n#endif\n\n#define TT_MS_LANGID_WELSH_WALES                       0x0452\n#define TT_MS_LANGID_KHMER_CAMBODIA                    0x0453\n#define TT_MS_LANGID_LAO_LAOS                          0x0454\n#define TT_MS_LANGID_BURMESE_MYANMAR                   0x0455\n#define TT_MS_LANGID_GALICIAN_SPAIN                    0x0456\n#define TT_MS_LANGID_KONKANI_INDIA                     0x0457\n#define TT_MS_LANGID_MANIPURI_INDIA  /* Bengali */     0x0458\n#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */         0x0459\n#define TT_MS_LANGID_SINDHI_PAKISTAN                   0x0859\n  /* Missing a LCID for Sindhi in Devanagari script */\n#define TT_MS_LANGID_SYRIAC_SYRIA                      0x045a\n#define TT_MS_LANGID_SINHALESE_SRI_LANKA               0x045b\n#define TT_MS_LANGID_CHEROKEE_UNITED_STATES            0x045c\n#define TT_MS_LANGID_INUKTITUT_CANADA                  0x045d\n#define TT_MS_LANGID_AMHARIC_ETHIOPIA                  0x045e\n#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */    0x045f\n#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN           0x085f\n  /* Missing a LCID for Tifinagh script */\n#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */    0x0460\n  /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */\n  /* script is yet unclear... might be Arabic, Nagari or Sharada */\n#define TT_MS_LANGID_KASHMIRI_SASIA                    0x0860\n  /* ... and aliased (by MS) for compatibility reasons. */\n#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA\n#define TT_MS_LANGID_NEPALI_NEPAL                      0x0461\n#define TT_MS_LANGID_NEPALI_INDIA                      0x0861\n#define TT_MS_LANGID_FRISIAN_NETHERLANDS               0x0462\n#define TT_MS_LANGID_PASHTO_AFGHANISTAN                0x0463\n#define TT_MS_LANGID_FILIPINO_PHILIPPINES              0x0464\n#define TT_MS_LANGID_DHIVEHI_MALDIVES                  0x0465\n  /* alias declared in Windows 2000 */\n#define TT_MS_LANGID_DIVEHI_MALDIVES  TT_MS_LANGID_DHIVEHI_MALDIVES\n#define TT_MS_LANGID_EDO_NIGERIA                       0x0466\n#define TT_MS_LANGID_FULFULDE_NIGERIA                  0x0467\n#define TT_MS_LANGID_HAUSA_NIGERIA                     0x0468\n#define TT_MS_LANGID_IBIBIO_NIGERIA                    0x0469\n#define TT_MS_LANGID_YORUBA_NIGERIA                    0x046a\n#define TT_MS_LANGID_QUECHUA_BOLIVIA                   0x046b\n#define TT_MS_LANGID_QUECHUA_ECUADOR                   0x086b\n#define TT_MS_LANGID_QUECHUA_PERU                      0x0c6b\n#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA               0x046c\n  /* Also spelled by XPsp2 Platform SDK (2004-07-26) */\n#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \\\n          TT_MS_LANGID_SEPEDI_SOUTH_AFRICA\n  /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */\n#define TT_MS_LANGID_IGBO_NIGERIA                      0x0470\n#define TT_MS_LANGID_KANURI_NIGERIA                    0x0471\n#define TT_MS_LANGID_OROMO_ETHIOPIA                    0x0472\n#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA                 0x0473\n#define TT_MS_LANGID_TIGRIGNA_ERYTHREA                 0x0873\n  /* also spelled in the `Passport SDK' list as: */\n#define TT_MS_LANGID_TIGRIGNA_ERYTREA  TT_MS_LANGID_TIGRIGNA_ERYTHREA\n#define TT_MS_LANGID_GUARANI_PARAGUAY                  0x0474\n#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES            0x0475\n#define TT_MS_LANGID_LATIN                             0x0476\n#define TT_MS_LANGID_SOMALI_SOMALIA                    0x0477\n  /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */\n  /*       not written (but OTOH the peculiar writing system is worth     */\n  /*       studying).                                                     */\n#define TT_MS_LANGID_YI_CHINA                          0x0478\n#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES   0x0479\n  /* language codes from 0x047a to 0x047f are (still) unknown. */\n#define TT_MS_LANGID_UIGHUR_CHINA                      0x0480\n#define TT_MS_LANGID_MAORI_NEW_ZEALAND                 0x0481\n\n#if 0  /* not deemed useful for fonts */\n#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE            0x04ff\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Possible values of the `name' identifier field in the name records of */\n  /* the TTF `name' table.  These values are platform independent.         */\n  /*                                                                       */\n#define TT_NAME_ID_COPYRIGHT            0\n#define TT_NAME_ID_FONT_FAMILY          1\n#define TT_NAME_ID_FONT_SUBFAMILY       2\n#define TT_NAME_ID_UNIQUE_ID            3\n#define TT_NAME_ID_FULL_NAME            4\n#define TT_NAME_ID_VERSION_STRING       5\n#define TT_NAME_ID_PS_NAME              6\n#define TT_NAME_ID_TRADEMARK            7\n\n  /* the following values are from the OpenType spec */\n#define TT_NAME_ID_MANUFACTURER         8\n#define TT_NAME_ID_DESIGNER             9\n#define TT_NAME_ID_DESCRIPTION          10\n#define TT_NAME_ID_VENDOR_URL           11\n#define TT_NAME_ID_DESIGNER_URL         12\n#define TT_NAME_ID_LICENSE              13\n#define TT_NAME_ID_LICENSE_URL          14\n  /* number 15 is reserved */\n#define TT_NAME_ID_PREFERRED_FAMILY     16\n#define TT_NAME_ID_PREFERRED_SUBFAMILY  17\n#define TT_NAME_ID_MAC_FULL_NAME        18\n\n  /* The following code is new as of 2000-01-21 */\n#define TT_NAME_ID_SAMPLE_TEXT          19\n\n  /* This is new in OpenType 1.3 */\n#define TT_NAME_ID_CID_FINDFONT_NAME    20\n\n  /* This is new in OpenType 1.5 */\n#define TT_NAME_ID_WWS_FAMILY           21\n#define TT_NAME_ID_WWS_SUBFAMILY        22\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table.     */\n  /*                                                                       */\n  /* Updated 08-Nov-2008.                                                  */\n  /*                                                                       */\n\n  /* Bit  0   Basic Latin */\n#define TT_UCR_BASIC_LATIN                     (1L <<  0) /* U+0020-U+007E */\n  /* Bit  1   C1 Controls and Latin-1 Supplement */\n#define TT_UCR_LATIN1_SUPPLEMENT               (1L <<  1) /* U+0080-U+00FF */\n  /* Bit  2   Latin Extended-A */\n#define TT_UCR_LATIN_EXTENDED_A                (1L <<  2) /* U+0100-U+017F */\n  /* Bit  3   Latin Extended-B */\n#define TT_UCR_LATIN_EXTENDED_B                (1L <<  3) /* U+0180-U+024F */\n  /* Bit  4   IPA Extensions                 */\n  /*          Phonetic Extensions            */\n  /*          Phonetic Extensions Supplement */\n#define TT_UCR_IPA_EXTENSIONS                  (1L <<  4) /* U+0250-U+02AF */\n                                                          /* U+1D00-U+1D7F */\n                                                          /* U+1D80-U+1DBF */\n  /* Bit  5   Spacing Modifier Letters */\n  /*          Modifier Tone Letters    */\n#define TT_UCR_SPACING_MODIFIER                (1L <<  5) /* U+02B0-U+02FF */\n                                                          /* U+A700-U+A71F */\n  /* Bit  6   Combining Diacritical Marks            */\n  /*          Combining Diacritical Marks Supplement */\n#define TT_UCR_COMBINING_DIACRITICS            (1L <<  6) /* U+0300-U+036F */\n                                                          /* U+1DC0-U+1DFF */\n  /* Bit  7   Greek and Coptic */\n#define TT_UCR_GREEK                           (1L <<  7) /* U+0370-U+03FF */\n  /* Bit  8   Coptic */\n#define TT_UCR_COPTIC                          (1L <<  8) /* U+2C80-U+2CFF */\n  /* Bit  9   Cyrillic            */\n  /*          Cyrillic Supplement */\n  /*          Cyrillic Extended-A */\n  /*          Cyrillic Extended-B */\n#define TT_UCR_CYRILLIC                        (1L <<  9) /* U+0400-U+04FF */\n                                                          /* U+0500-U+052F */\n                                                          /* U+2DE0-U+2DFF */\n                                                          /* U+A640-U+A69F */\n  /* Bit 10   Armenian */\n#define TT_UCR_ARMENIAN                        (1L << 10) /* U+0530-U+058F */\n  /* Bit 11   Hebrew */\n#define TT_UCR_HEBREW                          (1L << 11) /* U+0590-U+05FF */\n  /* Bit 12   Vai */\n#define TT_UCR_VAI                             (1L << 12) /* U+A500-U+A63F */\n  /* Bit 13   Arabic            */\n  /*          Arabic Supplement */\n#define TT_UCR_ARABIC                          (1L << 13) /* U+0600-U+06FF */\n                                                          /* U+0750-U+077F */\n  /* Bit 14   NKo */\n#define TT_UCR_NKO                             (1L << 14) /* U+07C0-U+07FF */\n  /* Bit 15   Devanagari */\n#define TT_UCR_DEVANAGARI                      (1L << 15) /* U+0900-U+097F */\n  /* Bit 16   Bengali */\n#define TT_UCR_BENGALI                         (1L << 16) /* U+0980-U+09FF */\n  /* Bit 17   Gurmukhi */\n#define TT_UCR_GURMUKHI                        (1L << 17) /* U+0A00-U+0A7F */\n  /* Bit 18   Gujarati */\n#define TT_UCR_GUJARATI                        (1L << 18) /* U+0A80-U+0AFF */\n  /* Bit 19   Oriya */\n#define TT_UCR_ORIYA                           (1L << 19) /* U+0B00-U+0B7F */\n  /* Bit 20   Tamil */\n#define TT_UCR_TAMIL                           (1L << 20) /* U+0B80-U+0BFF */\n  /* Bit 21   Telugu */\n#define TT_UCR_TELUGU                          (1L << 21) /* U+0C00-U+0C7F */\n  /* Bit 22   Kannada */\n#define TT_UCR_KANNADA                         (1L << 22) /* U+0C80-U+0CFF */\n  /* Bit 23   Malayalam */\n#define TT_UCR_MALAYALAM                       (1L << 23) /* U+0D00-U+0D7F */\n  /* Bit 24   Thai */\n#define TT_UCR_THAI                            (1L << 24) /* U+0E00-U+0E7F */\n  /* Bit 25   Lao */\n#define TT_UCR_LAO                             (1L << 25) /* U+0E80-U+0EFF */\n  /* Bit 26   Georgian            */\n  /*          Georgian Supplement */\n#define TT_UCR_GEORGIAN                        (1L << 26) /* U+10A0-U+10FF */\n                                                          /* U+2D00-U+2D2F */\n  /* Bit 27   Balinese */\n#define TT_UCR_BALINESE                        (1L << 27) /* U+1B00-U+1B7F */\n  /* Bit 28   Hangul Jamo */\n#define TT_UCR_HANGUL_JAMO                     (1L << 28) /* U+1100-U+11FF */\n  /* Bit 29   Latin Extended Additional */\n  /*          Latin Extended-C          */\n  /*          Latin Extended-D          */\n#define TT_UCR_LATIN_EXTENDED_ADDITIONAL       (1L << 29) /* U+1E00-U+1EFF */\n                                                          /* U+2C60-U+2C7F */\n                                                          /* U+A720-U+A7FF */\n  /* Bit 30   Greek Extended */\n#define TT_UCR_GREEK_EXTENDED                  (1L << 30) /* U+1F00-U+1FFF */\n  /* Bit 31   General Punctuation      */\n  /*          Supplemental Punctuation */\n#define TT_UCR_GENERAL_PUNCTUATION             (1L << 31) /* U+2000-U+206F */\n                                                          /* U+2E00-U+2E7F */\n  /* Bit 32   Superscripts And Subscripts */\n#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS         (1L <<  0) /* U+2070-U+209F */\n  /* Bit 33   Currency Symbols */\n#define TT_UCR_CURRENCY_SYMBOLS                (1L <<  1) /* U+20A0-U+20CF */\n  /* Bit 34   Combining Diacritical Marks For Symbols */\n#define TT_UCR_COMBINING_DIACRITICS_SYMB       (1L <<  2) /* U+20D0-U+20FF */\n  /* Bit 35   Letterlike Symbols */\n#define TT_UCR_LETTERLIKE_SYMBOLS              (1L <<  3) /* U+2100-U+214F */\n  /* Bit 36   Number Forms */\n#define TT_UCR_NUMBER_FORMS                    (1L <<  4) /* U+2150-U+218F */\n  /* Bit 37   Arrows                           */\n  /*          Supplemental Arrows-A            */\n  /*          Supplemental Arrows-B            */\n  /*          Miscellaneous Symbols and Arrows */\n#define TT_UCR_ARROWS                          (1L <<  5) /* U+2190-U+21FF */\n                                                          /* U+27F0-U+27FF */\n                                                          /* U+2900-U+297F */\n                                                          /* U+2B00-U+2BFF */\n  /* Bit 38   Mathematical Operators               */\n  /*          Supplemental Mathematical Operators  */\n  /*          Miscellaneous Mathematical Symbols-A */\n  /*          Miscellaneous Mathematical Symbols-B */\n#define TT_UCR_MATHEMATICAL_OPERATORS          (1L <<  6) /* U+2200-U+22FF */\n                                                          /* U+2A00-U+2AFF */\n                                                          /* U+27C0-U+27EF */\n                                                          /* U+2980-U+29FF */\n  /* Bit 39 Miscellaneous Technical */\n#define TT_UCR_MISCELLANEOUS_TECHNICAL         (1L <<  7) /* U+2300-U+23FF */\n  /* Bit 40   Control Pictures */\n#define TT_UCR_CONTROL_PICTURES                (1L <<  8) /* U+2400-U+243F */\n  /* Bit 41   Optical Character Recognition */\n#define TT_UCR_OCR                             (1L <<  9) /* U+2440-U+245F */\n  /* Bit 42   Enclosed Alphanumerics */\n#define TT_UCR_ENCLOSED_ALPHANUMERICS          (1L << 10) /* U+2460-U+24FF */\n  /* Bit 43   Box Drawing */\n#define TT_UCR_BOX_DRAWING                     (1L << 11) /* U+2500-U+257F */\n  /* Bit 44   Block Elements */\n#define TT_UCR_BLOCK_ELEMENTS                  (1L << 12) /* U+2580-U+259F */\n  /* Bit 45   Geometric Shapes */\n#define TT_UCR_GEOMETRIC_SHAPES                (1L << 13) /* U+25A0-U+25FF */\n  /* Bit 46   Miscellaneous Symbols */\n#define TT_UCR_MISCELLANEOUS_SYMBOLS           (1L << 14) /* U+2600-U+26FF */\n  /* Bit 47   Dingbats */\n#define TT_UCR_DINGBATS                        (1L << 15) /* U+2700-U+27BF */\n  /* Bit 48   CJK Symbols and Punctuation */\n#define TT_UCR_CJK_SYMBOLS                     (1L << 16) /* U+3000-U+303F */\n  /* Bit 49   Hiragana */\n#define TT_UCR_HIRAGANA                        (1L << 17) /* U+3040-U+309F */\n  /* Bit 50   Katakana                     */\n  /*          Katakana Phonetic Extensions */\n#define TT_UCR_KATAKANA                        (1L << 18) /* U+30A0-U+30FF */\n                                                          /* U+31F0-U+31FF */\n  /* Bit 51   Bopomofo          */\n  /*          Bopomofo Extended */\n#define TT_UCR_BOPOMOFO                        (1L << 19) /* U+3100-U+312F */\n                                                          /* U+31A0-U+31BF */\n  /* Bit 52   Hangul Compatibility Jamo */\n#define TT_UCR_HANGUL_COMPATIBILITY_JAMO       (1L << 20) /* U+3130-U+318F */\n  /* Bit 53   Phags-Pa */\n#define TT_UCR_CJK_MISC                        (1L << 21) /* U+A840-U+A87F */\n#define TT_UCR_KANBUN  TT_UCR_CJK_MISC /* deprecated */\n#define TT_UCR_PHAGSPA\n  /* Bit 54   Enclosed CJK Letters and Months */\n#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS     (1L << 22) /* U+3200-U+32FF */\n  /* Bit 55   CJK Compatibility */\n#define TT_UCR_CJK_COMPATIBILITY               (1L << 23) /* U+3300-U+33FF */\n  /* Bit 56   Hangul Syllables */\n#define TT_UCR_HANGUL                          (1L << 24) /* U+AC00-U+D7A3 */\n  /* Bit 57   High Surrogates              */\n  /*          High Private Use Surrogates  */\n  /*          Low Surrogates               */\n  /*                                       */\n  /* According to OpenType specs v.1.3+,   */\n  /* setting bit 57 implies that there is  */\n  /* at least one codepoint beyond the     */\n  /* Basic Multilingual Plane that is      */\n  /* supported by this font.  So it really */\n  /* means >= U+10000                      */\n#define TT_UCR_SURROGATES                      (1L << 25) /* U+D800-U+DB7F */\n                                                          /* U+DB80-U+DBFF */\n                                                          /* U+DC00-U+DFFF */\n#define TT_UCR_NON_PLANE_0  TT_UCR_SURROGATES\n  /* Bit 58  Phoenician */\n#define TT_UCR_PHOENICIAN                      (1L << 26) /*U+10900-U+1091F*/\n  /* Bit 59   CJK Unified Ideographs             */\n  /*          CJK Radicals Supplement            */\n  /*          Kangxi Radicals                    */\n  /*          Ideographic Description Characters */\n  /*          CJK Unified Ideographs Extension A */\n  /*          CJK Unified Ideographs Extension B */\n  /*          Kanbun                             */\n#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS          (1L << 27) /* U+4E00-U+9FFF */\n                                                          /* U+2E80-U+2EFF */\n                                                          /* U+2F00-U+2FDF */\n                                                          /* U+2FF0-U+2FFF */\n                                                          /* U+3400-U+4DB5 */\n                                                          /*U+20000-U+2A6DF*/\n                                                          /* U+3190-U+319F */\n  /* Bit 60   Private Use */\n#define TT_UCR_PRIVATE_USE                     (1L << 28) /* U+E000-U+F8FF */\n  /* Bit 61   CJK Strokes                             */\n  /*          CJK Compatibility Ideographs            */\n  /*          CJK Compatibility Ideographs Supplement */\n#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS    (1L << 29) /* U+31C0-U+31EF */\n                                                          /* U+F900-U+FAFF */\n                                                          /*U+2F800-U+2FA1F*/\n  /* Bit 62   Alphabetic Presentation Forms */\n#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS   (1L << 30) /* U+FB00-U+FB4F */\n  /* Bit 63   Arabic Presentation Forms-A */\n#define TT_UCR_ARABIC_PRESENTATIONS_A          (1L << 31) /* U+FB50-U+FDFF */\n  /* Bit 64   Combining Half Marks */\n#define TT_UCR_COMBINING_HALF_MARKS            (1L <<  0) /* U+FE20-U+FE2F */\n  /* Bit 65   Vertical forms          */\n  /*          CJK Compatibility Forms */\n#define TT_UCR_CJK_COMPATIBILITY_FORMS         (1L <<  1) /* U+FE10-U+FE1F */\n                                                          /* U+FE30-U+FE4F */\n  /* Bit 66   Small Form Variants */\n#define TT_UCR_SMALL_FORM_VARIANTS             (1L <<  2) /* U+FE50-U+FE6F */\n  /* Bit 67   Arabic Presentation Forms-B */\n#define TT_UCR_ARABIC_PRESENTATIONS_B          (1L <<  3) /* U+FE70-U+FEFE */\n  /* Bit 68   Halfwidth and Fullwidth Forms */\n#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS       (1L <<  4) /* U+FF00-U+FFEF */\n  /* Bit 69   Specials */\n#define TT_UCR_SPECIALS                        (1L <<  5) /* U+FFF0-U+FFFD */\n  /* Bit 70   Tibetan */\n#define TT_UCR_TIBETAN                         (1L <<  6) /* U+0F00-U+0FFF */\n  /* Bit 71   Syriac */\n#define TT_UCR_SYRIAC                          (1L <<  7) /* U+0700-U+074F */\n  /* Bit 72   Thaana */\n#define TT_UCR_THAANA                          (1L <<  8) /* U+0780-U+07BF */\n  /* Bit 73   Sinhala */\n#define TT_UCR_SINHALA                         (1L <<  9) /* U+0D80-U+0DFF */\n  /* Bit 74   Myanmar */\n#define TT_UCR_MYANMAR                         (1L << 10) /* U+1000-U+109F */\n  /* Bit 75   Ethiopic            */\n  /*          Ethiopic Supplement */\n  /*          Ethiopic Extended   */\n#define TT_UCR_ETHIOPIC                        (1L << 11) /* U+1200-U+137F */\n                                                          /* U+1380-U+139F */\n                                                          /* U+2D80-U+2DDF */\n  /* Bit 76   Cherokee */\n#define TT_UCR_CHEROKEE                        (1L << 12) /* U+13A0-U+13FF */\n  /* Bit 77   Unified Canadian Aboriginal Syllabics */\n#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS   (1L << 13) /* U+1400-U+167F */\n  /* Bit 78   Ogham */\n#define TT_UCR_OGHAM                           (1L << 14) /* U+1680-U+169F */\n  /* Bit 79   Runic */\n#define TT_UCR_RUNIC                           (1L << 15) /* U+16A0-U+16FF */\n  /* Bit 80   Khmer         */\n  /*          Khmer Symbols */\n#define TT_UCR_KHMER                           (1L << 16) /* U+1780-U+17FF */\n                                                          /* U+19E0-U+19FF */\n  /* Bit 81   Mongolian */\n#define TT_UCR_MONGOLIAN                       (1L << 17) /* U+1800-U+18AF */\n  /* Bit 82   Braille Patterns */\n#define TT_UCR_BRAILLE                         (1L << 18) /* U+2800-U+28FF */\n  /* Bit 83   Yi Syllables */\n  /*          Yi Radicals  */\n#define TT_UCR_YI                              (1L << 19) /* U+A000-U+A48F */\n                                                          /* U+A490-U+A4CF */\n  /* Bit 84   Tagalog  */\n  /*          Hanunoo  */\n  /*          Buhid    */\n  /*          Tagbanwa */\n#define TT_UCR_PHILIPPINE                      (1L << 20) /* U+1700-U+171F */\n                                                          /* U+1720-U+173F */\n                                                          /* U+1740-U+175F */\n                                                          /* U+1760-U+177F */\n  /* Bit 85   Old Italic */\n#define TT_UCR_OLD_ITALIC                      (1L << 21) /*U+10300-U+1032F*/\n  /* Bit 86   Gothic */\n#define TT_UCR_GOTHIC                          (1L << 22) /*U+10330-U+1034F*/\n  /* Bit 87   Deseret */\n#define TT_UCR_DESERET                         (1L << 23) /*U+10400-U+1044F*/\n  /* Bit 88   Byzantine Musical Symbols      */\n  /*          Musical Symbols                */\n  /*          Ancient Greek Musical Notation */\n#define TT_UCR_MUSICAL_SYMBOLS                 (1L << 24) /*U+1D000-U+1D0FF*/\n                                                          /*U+1D100-U+1D1FF*/\n                                                          /*U+1D200-U+1D24F*/\n  /* Bit 89   Mathematical Alphanumeric Symbols */\n#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS       (1L << 25) /*U+1D400-U+1D7FF*/\n  /* Bit 90   Private Use (plane 15) */\n  /*          Private Use (plane 16) */\n#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY       (1L << 26) /*U+F0000-U+FFFFD*/\n                                                        /*U+100000-U+10FFFD*/\n  /* Bit 91   Variation Selectors            */\n  /*          Variation Selectors Supplement */\n#define TT_UCR_VARIATION_SELECTORS             (1L << 27) /* U+FE00-U+FE0F */\n                                                          /*U+E0100-U+E01EF*/\n  /* Bit 92   Tags */\n#define TT_UCR_TAGS                            (1L << 28) /*U+E0000-U+E007F*/\n  /* Bit 93   Limbu */\n#define TT_UCR_LIMBU                           (1L << 29) /* U+1900-U+194F */\n  /* Bit 94   Tai Le */\n#define TT_UCR_TAI_LE                          (1L << 30) /* U+1950-U+197F */\n  /* Bit 95   New Tai Lue */\n#define TT_UCR_NEW_TAI_LUE                     (1L << 31) /* U+1980-U+19DF */\n  /* Bit 96   Buginese */\n#define TT_UCR_BUGINESE                        (1L <<  0) /* U+1A00-U+1A1F */\n  /* Bit 97   Glagolitic */\n#define TT_UCR_GLAGOLITIC                      (1L <<  1) /* U+2C00-U+2C5F */\n  /* Bit 98   Tifinagh */\n#define TT_UCR_TIFINAGH                        (1L <<  2) /* U+2D30-U+2D7F */\n  /* Bit 99   Yijing Hexagram Symbols */\n#define TT_UCR_YIJING                          (1L <<  3) /* U+4DC0-U+4DFF */\n  /* Bit 100  Syloti Nagri */\n#define TT_UCR_SYLOTI_NAGRI                    (1L <<  4) /* U+A800-U+A82F */\n  /* Bit 101  Linear B Syllabary */\n  /*          Linear B Ideograms */\n  /*          Aegean Numbers     */\n#define TT_UCR_LINEAR_B                        (1L <<  5) /*U+10000-U+1007F*/\n                                                          /*U+10080-U+100FF*/\n                                                          /*U+10100-U+1013F*/\n  /* Bit 102  Ancient Greek Numbers */\n#define TT_UCR_ANCIENT_GREEK_NUMBERS           (1L <<  6) /*U+10140-U+1018F*/\n  /* Bit 103  Ugaritic */\n#define TT_UCR_UGARITIC                        (1L <<  7) /*U+10380-U+1039F*/\n  /* Bit 104  Old Persian */\n#define TT_UCR_OLD_PERSIAN                     (1L <<  8) /*U+103A0-U+103DF*/\n  /* Bit 105  Shavian */\n#define TT_UCR_SHAVIAN                         (1L <<  9) /*U+10450-U+1047F*/\n  /* Bit 106  Osmanya */\n#define TT_UCR_OSMANYA                         (1L << 10) /*U+10480-U+104AF*/\n  /* Bit 107  Cypriot Syllabary */\n#define TT_UCR_CYPRIOT_SYLLABARY               (1L << 11) /*U+10800-U+1083F*/\n  /* Bit 108  Kharoshthi */\n#define TT_UCR_KHAROSHTHI                      (1L << 12) /*U+10A00-U+10A5F*/\n  /* Bit 109  Tai Xuan Jing Symbols */\n#define TT_UCR_TAI_XUAN_JING                   (1L << 13) /*U+1D300-U+1D35F*/\n  /* Bit 110  Cuneiform                         */\n  /*          Cuneiform Numbers and Punctuation */\n#define TT_UCR_CUNEIFORM                       (1L << 14) /*U+12000-U+123FF*/\n                                                          /*U+12400-U+1247F*/\n  /* Bit 111  Counting Rod Numerals */\n#define TT_UCR_COUNTING_ROD_NUMERALS           (1L << 15) /*U+1D360-U+1D37F*/\n  /* Bit 112  Sundanese */\n#define TT_UCR_SUNDANESE                       (1L << 16) /* U+1B80-U+1BBF */\n  /* Bit 113  Lepcha */\n#define TT_UCR_LEPCHA                          (1L << 17) /* U+1C00-U+1C4F */\n  /* Bit 114  Ol Chiki */\n#define TT_UCR_OL_CHIKI                        (1L << 18) /* U+1C50-U+1C7F */\n  /* Bit 115  Saurashtra */\n#define TT_UCR_SAURASHTRA                      (1L << 19) /* U+A880-U+A8DF */\n  /* Bit 116  Kayah Li */\n#define TT_UCR_KAYAH_LI                        (1L << 20) /* U+A900-U+A92F */\n  /* Bit 117  Rejang */\n#define TT_UCR_REJANG                          (1L << 21) /* U+A930-U+A95F */\n  /* Bit 118  Cham */\n#define TT_UCR_CHAM                            (1L << 22) /* U+AA00-U+AA5F */\n  /* Bit 119  Ancient Symbols */\n#define TT_UCR_ANCIENT_SYMBOLS                 (1L << 23) /*U+10190-U+101CF*/\n  /* Bit 120  Phaistos Disc */\n#define TT_UCR_PHAISTOS_DISC                   (1L << 24) /*U+101D0-U+101FF*/\n  /* Bit 121  Carian */\n  /*          Lycian */\n  /*          Lydian */\n#define TT_UCR_OLD_ANATOLIAN                   (1L << 25) /*U+102A0-U+102DF*/\n                                                          /*U+10280-U+1029F*/\n                                                          /*U+10920-U+1093F*/\n  /* Bit 122  Domino Tiles  */\n  /*          Mahjong Tiles */\n#define TT_UCR_GAME_TILES                      (1L << 26) /*U+1F030-U+1F09F*/\n                                                          /*U+1F000-U+1F02F*/\n  /* Bit 123-127 Reserved for process-internal usage */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Some compilers have a very limited length of identifiers.             */\n  /*                                                                       */\n#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )\n#define HAVE_LIMIT_ON_IDENTS\n#endif\n\n\n#ifndef HAVE_LIMIT_ON_IDENTS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Here some alias #defines in order to be clearer.                      */\n  /*                                                                       */\n  /* These are not always #defined to stay within the 31~character limit   */\n  /* which some compilers have.                                            */\n  /*                                                                       */\n  /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern  */\n  /* Borland compilers (read: from BC++ 3.1 on) can increase this limit.   */\n  /* If you get a warning with such a compiler, use the -i40 switch.       */\n  /*                                                                       */\n#define TT_UCR_ARABIC_PRESENTATION_FORMS_A      \\\n         TT_UCR_ARABIC_PRESENTATIONS_A\n#define TT_UCR_ARABIC_PRESENTATION_FORMS_B      \\\n         TT_UCR_ARABIC_PRESENTATIONS_B\n\n#define TT_UCR_COMBINING_DIACRITICAL_MARKS      \\\n         TT_UCR_COMBINING_DIACRITICS\n#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \\\n         TT_UCR_COMBINING_DIACRITICS_SYMB\n\n\n#endif /* !HAVE_LIMIT_ON_IDENTS */\n\n\nFT_END_HEADER\n\n#endif /* __TTNAMEID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/tttables.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tttables.h                                                             */\n/*                                                                         */\n/*    Basic SFNT/TrueType tables definitions and interface                 */\n/*    (specification only).                                                */\n/*                                                                         */\n/*  Copyright 1996-2005, 2008-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTTABLES_H__\n#define __TTTABLES_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    truetype_tables                                                    */\n  /*                                                                       */\n  /* <Title>                                                               */\n  /*    TrueType Tables                                                    */\n  /*                                                                       */\n  /* <Abstract>                                                            */\n  /*    TrueType specific table types and functions.                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This section contains the definition of TrueType-specific tables   */\n  /*    as well as some routines used to access and process them.          */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Header                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType font header table.  All       */\n  /*    fields follow the TrueType specification.                          */\n  /*                                                                       */\n  typedef struct  TT_Header_\n  {\n    FT_Fixed   Table_Version;\n    FT_Fixed   Font_Revision;\n\n    FT_Long    CheckSum_Adjust;\n    FT_Long    Magic_Number;\n\n    FT_UShort  Flags;\n    FT_UShort  Units_Per_EM;\n\n    FT_Long    Created [2];\n    FT_Long    Modified[2];\n\n    FT_Short   xMin;\n    FT_Short   yMin;\n    FT_Short   xMax;\n    FT_Short   yMax;\n\n    FT_UShort  Mac_Style;\n    FT_UShort  Lowest_Rec_PPEM;\n\n    FT_Short   Font_Direction;\n    FT_Short   Index_To_Loc_Format;\n    FT_Short   Glyph_Data_Format;\n\n  } TT_Header;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_HoriHeader                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType horizontal header, the `hhea' */\n  /*    table, as well as the corresponding horizontal metrics table,      */\n  /*    i.e., the `hmtx' table.                                            */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Version                :: The table version.                       */\n  /*                                                                       */\n  /*    Ascender               :: The font's ascender, i.e., the distance  */\n  /*                              from the baseline to the top-most of all */\n  /*                              glyph points found in the font.          */\n  /*                                                                       */\n  /*                              This value is invalid in many fonts, as  */\n  /*                              it is usually set by the font designer,  */\n  /*                              and often reflects only a portion of the */\n  /*                              glyphs found in the font (maybe ASCII).  */\n  /*                                                                       */\n  /*                              You should use the `sTypoAscender' field */\n  /*                              of the OS/2 table instead if you want    */\n  /*                              the correct one.                         */\n  /*                                                                       */\n  /*    Descender              :: The font's descender, i.e., the distance */\n  /*                              from the baseline to the bottom-most of  */\n  /*                              all glyph points found in the font.  It  */\n  /*                              is negative.                             */\n  /*                                                                       */\n  /*                              This value is invalid in many fonts, as  */\n  /*                              it is usually set by the font designer,  */\n  /*                              and often reflects only a portion of the */\n  /*                              glyphs found in the font (maybe ASCII).  */\n  /*                                                                       */\n  /*                              You should use the `sTypoDescender'      */\n  /*                              field of the OS/2 table instead if you   */\n  /*                              want the correct one.                    */\n  /*                                                                       */\n  /*    Line_Gap               :: The font's line gap, i.e., the distance  */\n  /*                              to add to the ascender and descender to  */\n  /*                              get the BTB, i.e., the                   */\n  /*                              baseline-to-baseline distance for the    */\n  /*                              font.                                    */\n  /*                                                                       */\n  /*    advance_Width_Max      :: This field is the maximum of all advance */\n  /*                              widths found in the font.  It can be     */\n  /*                              used to compute the maximum width of an  */\n  /*                              arbitrary string of text.                */\n  /*                                                                       */\n  /*    min_Left_Side_Bearing  :: The minimum left side bearing of all     */\n  /*                              glyphs within the font.                  */\n  /*                                                                       */\n  /*    min_Right_Side_Bearing :: The minimum right side bearing of all    */\n  /*                              glyphs within the font.                  */\n  /*                                                                       */\n  /*    xMax_Extent            :: The maximum horizontal extent (i.e., the */\n  /*                              `width' of a glyph's bounding box) for   */\n  /*                              all glyphs in the font.                  */\n  /*                                                                       */\n  /*    caret_Slope_Rise       :: The rise coefficient of the cursor's     */\n  /*                              slope of the cursor (slope=rise/run).    */\n  /*                                                                       */\n  /*    caret_Slope_Run        :: The run coefficient of the cursor's      */\n  /*                              slope.                                   */\n  /*                                                                       */\n  /*    Reserved               :: 8~reserved bytes.                        */\n  /*                                                                       */\n  /*    metric_Data_Format     :: Always~0.                                */\n  /*                                                                       */\n  /*    number_Of_HMetrics     :: Number of HMetrics entries in the `hmtx' */\n  /*                              table -- this value can be smaller than  */\n  /*                              the total number of glyphs in the font.  */\n  /*                                                                       */\n  /*    long_metrics           :: A pointer into the `hmtx' table.         */\n  /*                                                                       */\n  /*    short_metrics          :: A pointer into the `hmtx' table.         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */\n  /*               be identical except for the names of their fields which */\n  /*               are different.                                          */\n  /*                                                                       */\n  /*               This ensures that a single function in the `ttload'     */\n  /*               module is able to read both the horizontal and vertical */\n  /*               headers.                                                */\n  /*                                                                       */\n  typedef struct  TT_HoriHeader_\n  {\n    FT_Fixed   Version;\n    FT_Short   Ascender;\n    FT_Short   Descender;\n    FT_Short   Line_Gap;\n\n    FT_UShort  advance_Width_Max;      /* advance width maximum */\n\n    FT_Short   min_Left_Side_Bearing;  /* minimum left-sb       */\n    FT_Short   min_Right_Side_Bearing; /* minimum right-sb      */\n    FT_Short   xMax_Extent;            /* xmax extents          */\n    FT_Short   caret_Slope_Rise;\n    FT_Short   caret_Slope_Run;\n    FT_Short   caret_Offset;\n\n    FT_Short   Reserved[4];\n\n    FT_Short   metric_Data_Format;\n    FT_UShort  number_Of_HMetrics;\n\n    /* The following fields are not defined by the TrueType specification */\n    /* but they are used to connect the metrics header to the relevant    */\n    /* `HMTX' table.                                                      */\n\n    void*      long_metrics;\n    void*      short_metrics;\n\n  } TT_HoriHeader;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_VertHeader                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType vertical header, the `vhea'   */\n  /*    table, as well as the corresponding vertical metrics table, i.e.,  */\n  /*    the `vmtx' table.                                                  */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    Version                 :: The table version.                      */\n  /*                                                                       */\n  /*    Ascender                :: The font's ascender, i.e., the distance */\n  /*                               from the baseline to the top-most of    */\n  /*                               all glyph points found in the font.     */\n  /*                                                                       */\n  /*                               This value is invalid in many fonts, as */\n  /*                               it is usually set by the font designer, */\n  /*                               and often reflects only a portion of    */\n  /*                               the glyphs found in the font (maybe     */\n  /*                               ASCII).                                 */\n  /*                                                                       */\n  /*                               You should use the `sTypoAscender'      */\n  /*                               field of the OS/2 table instead if you  */\n  /*                               want the correct one.                   */\n  /*                                                                       */\n  /*    Descender               :: The font's descender, i.e., the         */\n  /*                               distance from the baseline to the       */\n  /*                               bottom-most of all glyph points found   */\n  /*                               in the font.  It is negative.           */\n  /*                                                                       */\n  /*                               This value is invalid in many fonts, as */\n  /*                               it is usually set by the font designer, */\n  /*                               and often reflects only a portion of    */\n  /*                               the glyphs found in the font (maybe     */\n  /*                               ASCII).                                 */\n  /*                                                                       */\n  /*                               You should use the `sTypoDescender'     */\n  /*                               field of the OS/2 table instead if you  */\n  /*                               want the correct one.                   */\n  /*                                                                       */\n  /*    Line_Gap                :: The font's line gap, i.e., the distance */\n  /*                               to add to the ascender and descender to */\n  /*                               get the BTB, i.e., the                  */\n  /*                               baseline-to-baseline distance for the   */\n  /*                               font.                                   */\n  /*                                                                       */\n  /*    advance_Height_Max      :: This field is the maximum of all        */\n  /*                               advance heights found in the font.  It  */\n  /*                               can be used to compute the maximum      */\n  /*                               height of an arbitrary string of text.  */\n  /*                                                                       */\n  /*    min_Top_Side_Bearing    :: The minimum top side bearing of all     */\n  /*                               glyphs within the font.                 */\n  /*                                                                       */\n  /*    min_Bottom_Side_Bearing :: The minimum bottom side bearing of all  */\n  /*                               glyphs within the font.                 */\n  /*                                                                       */\n  /*    yMax_Extent             :: The maximum vertical extent (i.e., the  */\n  /*                               `height' of a glyph's bounding box) for */\n  /*                               all glyphs in the font.                 */\n  /*                                                                       */\n  /*    caret_Slope_Rise        :: The rise coefficient of the cursor's    */\n  /*                               slope of the cursor (slope=rise/run).   */\n  /*                                                                       */\n  /*    caret_Slope_Run         :: The run coefficient of the cursor's     */\n  /*                               slope.                                  */\n  /*                                                                       */\n  /*    caret_Offset            :: The cursor's offset for slanted fonts.  */\n  /*                               This value is `reserved' in vmtx        */\n  /*                               version 1.0.                            */\n  /*                                                                       */\n  /*    Reserved                :: 8~reserved bytes.                       */\n  /*                                                                       */\n  /*    metric_Data_Format      :: Always~0.                               */\n  /*                                                                       */\n  /*    number_Of_HMetrics      :: Number of VMetrics entries in the       */\n  /*                               `vmtx' table -- this value can be       */\n  /*                               smaller than the total number of glyphs */\n  /*                               in the font.                            */\n  /*                                                                       */\n  /*    long_metrics           :: A pointer into the `vmtx' table.         */\n  /*                                                                       */\n  /*    short_metrics          :: A pointer into the `vmtx' table.         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */\n  /*               be identical except for the names of their fields which */\n  /*               are different.                                          */\n  /*                                                                       */\n  /*               This ensures that a single function in the `ttload'     */\n  /*               module is able to read both the horizontal and vertical */\n  /*               headers.                                                */\n  /*                                                                       */\n  typedef struct  TT_VertHeader_\n  {\n    FT_Fixed   Version;\n    FT_Short   Ascender;\n    FT_Short   Descender;\n    FT_Short   Line_Gap;\n\n    FT_UShort  advance_Height_Max;      /* advance height maximum */\n\n    FT_Short   min_Top_Side_Bearing;    /* minimum left-sb or top-sb       */\n    FT_Short   min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb   */\n    FT_Short   yMax_Extent;             /* xmax or ymax extents            */\n    FT_Short   caret_Slope_Rise;\n    FT_Short   caret_Slope_Run;\n    FT_Short   caret_Offset;\n\n    FT_Short   Reserved[4];\n\n    FT_Short   metric_Data_Format;\n    FT_UShort  number_Of_VMetrics;\n\n    /* The following fields are not defined by the TrueType specification */\n    /* but they're used to connect the metrics header to the relevant     */\n    /* `HMTX' or `VMTX' table.                                            */\n\n    void*      long_metrics;\n    void*      short_metrics;\n\n  } TT_VertHeader;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_OS2                                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType OS/2 table. This is the long  */\n  /*    table version.  All fields comply to the TrueType specification.   */\n  /*                                                                       */\n  /*    Note that we now support old Mac fonts which do not include an     */\n  /*    OS/2 table.  In this case, the `version' field is always set to    */\n  /*    0xFFFF.                                                            */\n  /*                                                                       */\n  typedef struct  TT_OS2_\n  {\n    FT_UShort  version;                /* 0x0001 - more or 0xFFFF */\n    FT_Short   xAvgCharWidth;\n    FT_UShort  usWeightClass;\n    FT_UShort  usWidthClass;\n    FT_Short   fsType;\n    FT_Short   ySubscriptXSize;\n    FT_Short   ySubscriptYSize;\n    FT_Short   ySubscriptXOffset;\n    FT_Short   ySubscriptYOffset;\n    FT_Short   ySuperscriptXSize;\n    FT_Short   ySuperscriptYSize;\n    FT_Short   ySuperscriptXOffset;\n    FT_Short   ySuperscriptYOffset;\n    FT_Short   yStrikeoutSize;\n    FT_Short   yStrikeoutPosition;\n    FT_Short   sFamilyClass;\n\n    FT_Byte    panose[10];\n\n    FT_ULong   ulUnicodeRange1;        /* Bits 0-31   */\n    FT_ULong   ulUnicodeRange2;        /* Bits 32-63  */\n    FT_ULong   ulUnicodeRange3;        /* Bits 64-95  */\n    FT_ULong   ulUnicodeRange4;        /* Bits 96-127 */\n\n    FT_Char    achVendID[4];\n\n    FT_UShort  fsSelection;\n    FT_UShort  usFirstCharIndex;\n    FT_UShort  usLastCharIndex;\n    FT_Short   sTypoAscender;\n    FT_Short   sTypoDescender;\n    FT_Short   sTypoLineGap;\n    FT_UShort  usWinAscent;\n    FT_UShort  usWinDescent;\n\n    /* only version 1 tables: */\n\n    FT_ULong   ulCodePageRange1;       /* Bits 0-31   */\n    FT_ULong   ulCodePageRange2;       /* Bits 32-63  */\n\n    /* only version 2 tables: */\n\n    FT_Short   sxHeight;\n    FT_Short   sCapHeight;\n    FT_UShort  usDefaultChar;\n    FT_UShort  usBreakChar;\n    FT_UShort  usMaxContext;\n\n  } TT_OS2;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_Postscript                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType PostScript table.  All fields */\n  /*    comply to the TrueType specification.  This structure does not     */\n  /*    reference the PostScript glyph names, which can be nevertheless    */\n  /*    accessed with the `ttpost' module.                                 */\n  /*                                                                       */\n  typedef struct  TT_Postscript_\n  {\n    FT_Fixed  FormatType;\n    FT_Fixed  italicAngle;\n    FT_Short  underlinePosition;\n    FT_Short  underlineThickness;\n    FT_ULong  isFixedPitch;\n    FT_ULong  minMemType42;\n    FT_ULong  maxMemType42;\n    FT_ULong  minMemType1;\n    FT_ULong  maxMemType1;\n\n    /* Glyph names follow in the file, but we don't   */\n    /* load them by default.  See the ttpost.c file.  */\n\n  } TT_Postscript;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_PCLT                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a TrueType PCLT table.  All fields       */\n  /*    comply to the TrueType specification.                              */\n  /*                                                                       */\n  typedef struct  TT_PCLT_\n  {\n    FT_Fixed   Version;\n    FT_ULong   FontNumber;\n    FT_UShort  Pitch;\n    FT_UShort  xHeight;\n    FT_UShort  Style;\n    FT_UShort  TypeFamily;\n    FT_UShort  CapHeight;\n    FT_UShort  SymbolSet;\n    FT_Char    TypeFace[16];\n    FT_Char    CharacterComplement[8];\n    FT_Char    FileName[6];\n    FT_Char    StrokeWeight;\n    FT_Char    WidthType;\n    FT_Byte    SerifStyle;\n    FT_Byte    Reserved;\n\n  } TT_PCLT;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_MaxProfile                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The maximum profile is a table containing many max values which    */\n  /*    can be used to pre-allocate arrays.  This ensures that no memory   */\n  /*    allocation occurs during a glyph load.                             */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    version               :: The version number.                       */\n  /*                                                                       */\n  /*    numGlyphs             :: The number of glyphs in this TrueType     */\n  /*                             font.                                     */\n  /*                                                                       */\n  /*    maxPoints             :: The maximum number of points in a         */\n  /*                             non-composite TrueType glyph.  See also   */\n  /*                             the structure element                     */\n  /*                             `maxCompositePoints'.                     */\n  /*                                                                       */\n  /*    maxContours           :: The maximum number of contours in a       */\n  /*                             non-composite TrueType glyph.  See also   */\n  /*                             the structure element                     */\n  /*                             `maxCompositeContours'.                   */\n  /*                                                                       */\n  /*    maxCompositePoints    :: The maximum number of points in a         */\n  /*                             composite TrueType glyph.  See also the   */\n  /*                             structure element `maxPoints'.            */\n  /*                                                                       */\n  /*    maxCompositeContours  :: The maximum number of contours in a       */\n  /*                             composite TrueType glyph.  See also the   */\n  /*                             structure element `maxContours'.          */\n  /*                                                                       */\n  /*    maxZones              :: The maximum number of zones used for      */\n  /*                             glyph hinting.                            */\n  /*                                                                       */\n  /*    maxTwilightPoints     :: The maximum number of points in the       */\n  /*                             twilight zone used for glyph hinting.     */\n  /*                                                                       */\n  /*    maxStorage            :: The maximum number of elements in the     */\n  /*                             storage area used for glyph hinting.      */\n  /*                                                                       */\n  /*    maxFunctionDefs       :: The maximum number of function            */\n  /*                             definitions in the TrueType bytecode for  */\n  /*                             this font.                                */\n  /*                                                                       */\n  /*    maxInstructionDefs    :: The maximum number of instruction         */\n  /*                             definitions in the TrueType bytecode for  */\n  /*                             this font.                                */\n  /*                                                                       */\n  /*    maxStackElements      :: The maximum number of stack elements used */\n  /*                             during bytecode interpretation.           */\n  /*                                                                       */\n  /*    maxSizeOfInstructions :: The maximum number of TrueType opcodes    */\n  /*                             used for glyph hinting.                   */\n  /*                                                                       */\n  /*    maxComponentElements  :: The maximum number of simple (i.e., non-  */\n  /*                             composite) glyphs in a composite glyph.   */\n  /*                                                                       */\n  /*    maxComponentDepth     :: The maximum nesting depth of composite    */\n  /*                             glyphs.                                   */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This structure is only used during font loading.                   */\n  /*                                                                       */\n  typedef struct  TT_MaxProfile_\n  {\n    FT_Fixed   version;\n    FT_UShort  numGlyphs;\n    FT_UShort  maxPoints;\n    FT_UShort  maxContours;\n    FT_UShort  maxCompositePoints;\n    FT_UShort  maxCompositeContours;\n    FT_UShort  maxZones;\n    FT_UShort  maxTwilightPoints;\n    FT_UShort  maxStorage;\n    FT_UShort  maxFunctionDefs;\n    FT_UShort  maxInstructionDefs;\n    FT_UShort  maxStackElements;\n    FT_UShort  maxSizeOfInstructions;\n    FT_UShort  maxComponentElements;\n    FT_UShort  maxComponentDepth;\n\n  } TT_MaxProfile;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Enum>                                                                */\n  /*    FT_Sfnt_Tag                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    An enumeration used to specify the index of an SFNT table.         */\n  /*    Used in the @FT_Get_Sfnt_Table API function.                       */\n  /*                                                                       */\n  typedef enum  FT_Sfnt_Tag_\n  {\n    ft_sfnt_head = 0,    /* TT_Header     */\n    ft_sfnt_maxp = 1,    /* TT_MaxProfile */\n    ft_sfnt_os2  = 2,    /* TT_OS2        */\n    ft_sfnt_hhea = 3,    /* TT_HoriHeader */\n    ft_sfnt_vhea = 4,    /* TT_VertHeader */\n    ft_sfnt_post = 5,    /* TT_Postscript */\n    ft_sfnt_pclt = 6,    /* TT_PCLT       */\n\n    sfnt_max   /* internal end mark */\n\n  } FT_Sfnt_Tag;\n\n  /* */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_Sfnt_Table                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return a pointer to a given SFNT table within a face.              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source.                                    */\n  /*                                                                       */\n  /*    tag  :: The index of the SFNT table.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A type-less pointer to the table.  This will be~0 in case of       */\n  /*    error, or if the corresponding table was not found *OR* loaded     */\n  /*    from the file.                                                     */\n  /*                                                                       */\n  /*    Use a typecast according to `tag' to access the structure          */\n  /*    elements.                                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The table is owned by the face object and disappears with it.      */\n  /*                                                                       */\n  /*    This function is only useful to access SFNT tables that are loaded */\n  /*    by the sfnt, truetype, and opentype drivers.  See @FT_Sfnt_Tag for */\n  /*    a list.                                                            */\n  /*                                                                       */\n  /*    Here an example how to access the `vhea' table:                    */\n  /*                                                                       */\n  /*    {                                                                  */\n  /*      TT_VertHeader*  vert_header;                                     */\n  /*                                                                       */\n  /*                                                                       */\n  /*      vert_header =                                                    */\n  /*        (TT_VertHeader*)FT_Get_Sfnt_Table( face, ft_sfnt_vhea );       */\n  /*    }                                                                  */\n  /*                                                                       */\n  FT_EXPORT( void* )\n  FT_Get_Sfnt_Table( FT_Face      face,\n                     FT_Sfnt_Tag  tag );\n\n\n /**************************************************************************\n  *\n  * @function:\n  *   FT_Load_Sfnt_Table\n  *\n  * @description:\n  *   Load any font table into client memory.\n  *\n  * @input:\n  *   face ::\n  *     A handle to the source face.\n  *\n  *   tag ::\n  *     The four-byte tag of the table to load.  Use the value~0 if you want\n  *     to access the whole font file.  Otherwise, you can use one of the\n  *     definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new\n  *     one with @FT_MAKE_TAG.\n  *\n  *   offset ::\n  *     The starting offset in the table (or file if tag == 0).\n  *\n  * @output:\n  *   buffer ::\n  *     The target buffer address.  The client must ensure that the memory\n  *     array is big enough to hold the data.\n  *\n  * @inout:\n  *   length ::\n  *     If the `length' parameter is NULL, then try to load the whole table.\n  *     Return an error code if it fails.\n  *\n  *     Else, if `*length' is~0, exit immediately while returning the\n  *     table's (or file) full size in it.\n  *\n  *     Else the number of bytes to read from the table or file, from the\n  *     starting offset.\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   If you need to determine the table's length you should first call this\n  *   function with `*length' set to~0, as in the following example:\n  *\n  *     {\n  *       FT_ULong  length = 0;\n  *\n  *\n  *       error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );\n  *       if ( error ) { ... table does not exist ... }\n  *\n  *       buffer = malloc( length );\n  *       if ( buffer == NULL ) { ... not enough memory ... }\n  *\n  *       error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );\n  *       if ( error ) { ... could not load table ... }\n  *     }\n  */\n  FT_EXPORT( FT_Error )\n  FT_Load_Sfnt_Table( FT_Face    face,\n                      FT_ULong   tag,\n                      FT_Long    offset,\n                      FT_Byte*   buffer,\n                      FT_ULong*  length );\n\n\n /**************************************************************************\n  *\n  * @function:\n  *   FT_Sfnt_Table_Info\n  *\n  * @description:\n  *   Return information on an SFNT table.\n  *\n  * @input:\n  *   face ::\n  *     A handle to the source face.\n  *\n  *   table_index ::\n  *     The index of an SFNT table.  The function returns\n  *     FT_Err_Table_Missing for an invalid value.\n  *\n  * @inout:\n  *   tag ::\n  *     The name tag of the SFNT table.  If the value is NULL, `table_index'\n  *     is ignored, and `length' returns the number of SFNT tables in the\n  *     font.\n  *\n  * @output:\n  *   length ::\n  *     The length of the SFNT table (or the number of SFNT tables, depending\n  *     on `tag').\n  *\n  * @return:\n  *   FreeType error code.  0~means success.\n  *\n  * @note:\n  *   While parsing fonts, FreeType handles SFNT tables with length zero as\n  *   missing.\n  *\n  */\n  FT_EXPORT( FT_Error )\n  FT_Sfnt_Table_Info( FT_Face    face,\n                      FT_UInt    table_index,\n                      FT_ULong  *tag,\n                      FT_ULong  *length );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_CMap_Language_ID                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return TrueType/sfnt specific cmap language ID.  Definitions of    */\n  /*    language ID values are in `freetype/ttnameid.h'.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charmap ::                                                         */\n  /*      The target charmap.                                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The language ID of `charmap'.  If `charmap' doesn't belong to a    */\n  /*    TrueType/sfnt face, just return~0 as the default value.            */\n  /*                                                                       */\n  /*    For a format~14 cmap (to access Unicode IVS), the return value is  */\n  /*    0xFFFFFFFF.                                                        */\n  /*                                                                       */\n  FT_EXPORT( FT_ULong )\n  FT_Get_CMap_Language_ID( FT_CharMap  charmap );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Get_CMap_Format                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Return TrueType/sfnt specific cmap format.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charmap ::                                                         */\n  /*      The target charmap.                                              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The format of `charmap'.  If `charmap' doesn't belong to a         */\n  /*    TrueType/sfnt face, return -1.                                     */\n  /*                                                                       */\n  FT_EXPORT( FT_Long )\n  FT_Get_CMap_Format( FT_CharMap  charmap );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __TTTABLES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/tttags.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tttags.h                                                               */\n/*                                                                         */\n/*    Tags for TrueType and OpenType tables (specification only).          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2004, 2005, 2007, 2008 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTAGS_H__\n#define __TTAGS_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n#define TTAG_avar  FT_MAKE_TAG( 'a', 'v', 'a', 'r' )\n#define TTAG_BASE  FT_MAKE_TAG( 'B', 'A', 'S', 'E' )\n#define TTAG_bdat  FT_MAKE_TAG( 'b', 'd', 'a', 't' )\n#define TTAG_BDF   FT_MAKE_TAG( 'B', 'D', 'F', ' ' )\n#define TTAG_bhed  FT_MAKE_TAG( 'b', 'h', 'e', 'd' )\n#define TTAG_bloc  FT_MAKE_TAG( 'b', 'l', 'o', 'c' )\n#define TTAG_bsln  FT_MAKE_TAG( 'b', 's', 'l', 'n' )\n#define TTAG_CFF   FT_MAKE_TAG( 'C', 'F', 'F', ' ' )\n#define TTAG_CID   FT_MAKE_TAG( 'C', 'I', 'D', ' ' )\n#define TTAG_cmap  FT_MAKE_TAG( 'c', 'm', 'a', 'p' )\n#define TTAG_cvar  FT_MAKE_TAG( 'c', 'v', 'a', 'r' )\n#define TTAG_cvt   FT_MAKE_TAG( 'c', 'v', 't', ' ' )\n#define TTAG_DSIG  FT_MAKE_TAG( 'D', 'S', 'I', 'G' )\n#define TTAG_EBDT  FT_MAKE_TAG( 'E', 'B', 'D', 'T' )\n#define TTAG_EBLC  FT_MAKE_TAG( 'E', 'B', 'L', 'C' )\n#define TTAG_EBSC  FT_MAKE_TAG( 'E', 'B', 'S', 'C' )\n#define TTAG_feat  FT_MAKE_TAG( 'f', 'e', 'a', 't' )\n#define TTAG_FOND  FT_MAKE_TAG( 'F', 'O', 'N', 'D' )\n#define TTAG_fpgm  FT_MAKE_TAG( 'f', 'p', 'g', 'm' )\n#define TTAG_fvar  FT_MAKE_TAG( 'f', 'v', 'a', 'r' )\n#define TTAG_gasp  FT_MAKE_TAG( 'g', 'a', 's', 'p' )\n#define TTAG_GDEF  FT_MAKE_TAG( 'G', 'D', 'E', 'F' )\n#define TTAG_glyf  FT_MAKE_TAG( 'g', 'l', 'y', 'f' )\n#define TTAG_GPOS  FT_MAKE_TAG( 'G', 'P', 'O', 'S' )\n#define TTAG_GSUB  FT_MAKE_TAG( 'G', 'S', 'U', 'B' )\n#define TTAG_gvar  FT_MAKE_TAG( 'g', 'v', 'a', 'r' )\n#define TTAG_hdmx  FT_MAKE_TAG( 'h', 'd', 'm', 'x' )\n#define TTAG_head  FT_MAKE_TAG( 'h', 'e', 'a', 'd' )\n#define TTAG_hhea  FT_MAKE_TAG( 'h', 'h', 'e', 'a' )\n#define TTAG_hmtx  FT_MAKE_TAG( 'h', 'm', 't', 'x' )\n#define TTAG_JSTF  FT_MAKE_TAG( 'J', 'S', 'T', 'F' )\n#define TTAG_just  FT_MAKE_TAG( 'j', 'u', 's', 't' )\n#define TTAG_kern  FT_MAKE_TAG( 'k', 'e', 'r', 'n' )\n#define TTAG_lcar  FT_MAKE_TAG( 'l', 'c', 'a', 'r' )\n#define TTAG_loca  FT_MAKE_TAG( 'l', 'o', 'c', 'a' )\n#define TTAG_LTSH  FT_MAKE_TAG( 'L', 'T', 'S', 'H' )\n#define TTAG_LWFN  FT_MAKE_TAG( 'L', 'W', 'F', 'N' )\n#define TTAG_MATH  FT_MAKE_TAG( 'M', 'A', 'T', 'H' )\n#define TTAG_maxp  FT_MAKE_TAG( 'm', 'a', 'x', 'p' )\n#define TTAG_META  FT_MAKE_TAG( 'M', 'E', 'T', 'A' )\n#define TTAG_MMFX  FT_MAKE_TAG( 'M', 'M', 'F', 'X' )\n#define TTAG_MMSD  FT_MAKE_TAG( 'M', 'M', 'S', 'D' )\n#define TTAG_mort  FT_MAKE_TAG( 'm', 'o', 'r', 't' )\n#define TTAG_morx  FT_MAKE_TAG( 'm', 'o', 'r', 'x' )\n#define TTAG_name  FT_MAKE_TAG( 'n', 'a', 'm', 'e' )\n#define TTAG_opbd  FT_MAKE_TAG( 'o', 'p', 'b', 'd' )\n#define TTAG_OS2   FT_MAKE_TAG( 'O', 'S', '/', '2' )\n#define TTAG_OTTO  FT_MAKE_TAG( 'O', 'T', 'T', 'O' )\n#define TTAG_PCLT  FT_MAKE_TAG( 'P', 'C', 'L', 'T' )\n#define TTAG_POST  FT_MAKE_TAG( 'P', 'O', 'S', 'T' )\n#define TTAG_post  FT_MAKE_TAG( 'p', 'o', 's', 't' )\n#define TTAG_prep  FT_MAKE_TAG( 'p', 'r', 'e', 'p' )\n#define TTAG_prop  FT_MAKE_TAG( 'p', 'r', 'o', 'p' )\n#define TTAG_sfnt  FT_MAKE_TAG( 's', 'f', 'n', 't' )\n#define TTAG_SING  FT_MAKE_TAG( 'S', 'I', 'N', 'G' )\n#define TTAG_trak  FT_MAKE_TAG( 't', 'r', 'a', 'k' )\n#define TTAG_true  FT_MAKE_TAG( 't', 'r', 'u', 'e' )\n#define TTAG_ttc   FT_MAKE_TAG( 't', 't', 'c', ' ' )\n#define TTAG_ttcf  FT_MAKE_TAG( 't', 't', 'c', 'f' )\n#define TTAG_TYP1  FT_MAKE_TAG( 'T', 'Y', 'P', '1' )\n#define TTAG_typ1  FT_MAKE_TAG( 't', 'y', 'p', '1' )\n#define TTAG_VDMX  FT_MAKE_TAG( 'V', 'D', 'M', 'X' )\n#define TTAG_vhea  FT_MAKE_TAG( 'v', 'h', 'e', 'a' )\n#define TTAG_vmtx  FT_MAKE_TAG( 'v', 'm', 't', 'x' )\n\n\nFT_END_HEADER\n\n#endif /* __TTAGS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/freetype/ttunpat.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttunpat.h                                                              */\n/*                                                                         */\n/*    Definitions for the unpatented TrueType hinting system               */\n/*                                                                         */\n/*  Copyright 2003, 2006 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  Written by Graham Asher <graham.asher@btinternet.com>                  */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTUNPAT_H__\n#define __TTUNPAT_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n /***************************************************************************\n  *\n  * @constant:\n  *   FT_PARAM_TAG_UNPATENTED_HINTING\n  *\n  * @description:\n  *   A constant used as the tag of an @FT_Parameter structure to indicate\n  *   that unpatented methods only should be used by the TrueType bytecode\n  *   interpreter for a typeface opened by @FT_Open_Face.\n  *\n  */\n#define FT_PARAM_TAG_UNPATENTED_HINTING  FT_MAKE_TAG( 'u', 'n', 'p', 'a' )\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __TTUNPAT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/ft2build.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ft2build.h                                                             */\n/*                                                                         */\n/*    FreeType 2 build and setup macros.                                   */\n/*    (Generic version)                                                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2006 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file corresponds to the default `ft2build.h' file for            */\n  /* FreeType 2.  It uses the `freetype' include root.                     */\n  /*                                                                       */\n  /* Note that specific platforms might use a different configuration.     */\n  /* See builds/unix/ft2unix.h for an example.                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FT2_BUILD_GENERIC_H__\n#define __FT2_BUILD_GENERIC_H__\n\n#include <freetype/config/ftheader.h>\n\n#endif /* __FT2_BUILD_GENERIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/ftconfig.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftconfig.h                                                             */\n/*                                                                         */\n/*    ANSI-specific configuration file (specification only).               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This header file contains a number of macro definitions that are used */\n  /* by the rest of the engine.  Most of the macros here are automatically */\n  /* determined at compile time, and you should not need to change it to   */\n  /* port FreeType, except to compile the library with a non-ANSI          */\n  /* compiler.                                                             */\n  /*                                                                       */\n  /* Note however that if some specific modifications are needed, we       */\n  /* advise you to place a modified copy in your build directory.          */\n  /*                                                                       */\n  /* The build directory is usually `freetype/builds/<system>', and        */\n  /* contains system-specific files that are always included first when    */\n  /* building the library.                                                 */\n  /*                                                                       */\n  /* This ANSI version should stay in `include/freetype/config'.           */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __FTCONFIG_H__\n#define __FTCONFIG_H__\n\n#include <ft2build.h>\n#include FT_CONFIG_OPTIONS_H\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */\n  /*                                                                       */\n  /* These macros can be toggled to suit a specific system.  The current   */\n  /* ones are defaults used to compile FreeType in an ANSI C environment   */\n  /* (16bit compilers are also supported).  Copy this file to your own     */\n  /* `freetype/builds/<system>' directory, and edit it to port the engine. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* There are systems (like the Texas Instruments 'C54x) where a `char' */\n  /* has 16 bits.  ANSI C says that sizeof(char) is always 1.  Since an  */\n  /* `int' has 16 bits also for this system, sizeof(int) gives 1 which   */\n  /* is probably unexpected.                                             */\n  /*                                                                     */\n  /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a      */\n  /* `char' type.                                                        */\n\n#ifndef FT_CHAR_BIT\n#define FT_CHAR_BIT  CHAR_BIT\n#endif\n\n\n  /* The size of an `int' type.  */\n#if                                 FT_UINT_MAX == 0xFFFFUL\n#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)\n#elif                               FT_UINT_MAX == 0xFFFFFFFFUL\n#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)\n#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL\n#define FT_SIZEOF_INT  (64 / FT_CHAR_BIT)\n#else\n#error \"Unsupported size of `int' type!\"\n#endif\n\n  /* The size of a `long' type.  A five-byte `long' (as used e.g. on the */\n  /* DM642) is recognized but avoided.                                   */\n#if                                  FT_ULONG_MAX == 0xFFFFFFFFUL\n#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)\n#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL\n#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)\n#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL\n#define FT_SIZEOF_LONG  (64 / FT_CHAR_BIT)\n#else\n#error \"Unsupported size of `long' type!\"\n#endif\n\n\n  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */\n  /* used -- this is only used to get rid of unpleasant compiler warnings */\n#ifndef FT_UNUSED\n#define FT_UNUSED( arg )  ( (arg) = (arg) )\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                     AUTOMATIC CONFIGURATION MACROS                    */\n  /*                                                                       */\n  /* These macros are computed from the ones defined above.  Don't touch   */\n  /* their definition, unless you know precisely what you are doing.  No   */\n  /* porter should need to mess with them.                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Mac support                                                           */\n  /*                                                                       */\n  /*   This is the only necessary change, so it is defined here instead    */\n  /*   providing a new configuration file.                                 */\n  /*                                                                       */\n#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )\n  /* no Carbon frameworks for 64bit 10.4.x */\n  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */\n  /* so guess the system version by maximum errno before inclusion */\n#include <errno.h>\n#ifdef ECANCELED /* defined since 10.2 */\n#include \"AvailabilityMacros.h\"\n#endif\n#if defined( __LP64__ ) && \\\n    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )\n#undef FT_MACINTOSH\n#endif\n\n#elif defined( __SC__ ) || defined( __MRC__ )\n  /* Classic MacOS compilers */\n#include \"ConditionalMacros.h\"\n#if TARGET_OS_MAC\n#define FT_MACINTOSH 1\n#endif\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    basic_types                                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int16                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 16bit signed integer type.                         */\n  /*                                                                       */\n  typedef signed short  FT_Int16;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt16                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 16bit unsigned integer type.                       */\n  /*                                                                       */\n  typedef unsigned short  FT_UInt16;\n\n  /* */\n\n\n  /* this #if 0 ... #endif clause is for documentation purposes */\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int32                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A typedef for a 32bit signed integer type.  The size depends on    */\n  /*    the configuration.                                                 */\n  /*                                                                       */\n  typedef signed XXX  FT_Int32;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_UInt32                                                          */\n  /*                                                                       */\n  /*    A typedef for a 32bit unsigned integer type.  The size depends on  */\n  /*    the configuration.                                                 */\n  /*                                                                       */\n  typedef unsigned XXX  FT_UInt32;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    FT_Int64                                                           */\n  /*                                                                       */\n  /*    A typedef for a 64bit signed integer type.  The size depends on    */\n  /*    the configuration.  Only defined if there is real 64bit support;   */\n  /*    otherwise, it gets emulated with a structure (if necessary).       */\n  /*                                                                       */\n  typedef signed XXX  FT_Int64;\n\n  /* */\n\n#endif\n\n#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)\n\n  typedef signed int      FT_Int32;\n  typedef unsigned int    FT_UInt32;\n\n#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)\n\n  typedef signed long     FT_Int32;\n  typedef unsigned long   FT_UInt32;\n\n#else\n#error \"no 32bit type found -- please check your configuration files\"\n#endif\n\n\n  /* look up an integer type that is at least 32 bits */\n#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)\n\n  typedef int            FT_Fast;\n  typedef unsigned int   FT_UFast;\n\n#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)\n\n  typedef long           FT_Fast;\n  typedef unsigned long  FT_UFast;\n\n#endif\n\n\n  /* determine whether we have a 64-bit int type for platforms without */\n  /* Autoconf                                                          */\n#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)\n\n  /* FT_LONG64 must be defined if a 64-bit type is available */\n#define FT_LONG64\n#define FT_INT64  long\n\n#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */\n\n  /* this compiler provides the __int64 type */\n#define FT_LONG64\n#define FT_INT64  __int64\n\n#elif defined( __BORLANDC__ )  /* Borland C++ */\n\n  /* XXXX: We should probably check the value of __BORLANDC__ in order */\n  /*       to test the compiler version.                               */\n\n  /* this compiler provides the __int64 type */\n#define FT_LONG64\n#define FT_INT64  __int64\n\n#elif defined( __WATCOMC__ )   /* Watcom C++ */\n\n  /* Watcom doesn't provide 64-bit data types */\n\n#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */\n\n#define FT_LONG64\n#define FT_INT64  long long int\n\n#elif defined( __GNUC__ )\n\n  /* GCC provides the `long long' type */\n#define FT_LONG64\n#define FT_INT64  long long int\n\n#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A 64-bit data type will create compilation problems if you compile    */\n  /* in strict ANSI mode.  To avoid them, we disable its use if __STDC__   */\n  /* is defined.  You can however ignore this rule by defining the         */\n  /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro.                     */\n  /*                                                                       */\n#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )\n\n#ifdef __STDC__\n\n  /* undefine the 64-bit macros in strict ANSI compilation mode */\n#undef FT_LONG64\n#undef FT_INT64\n\n#endif /* __STDC__ */\n\n#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */\n\n#ifdef FT_LONG64\n  typedef FT_INT64  FT_Int64;\n#endif\n\n\n#define FT_BEGIN_STMNT  do {\n#define FT_END_STMNT    } while ( 0 )\n#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT\n\n\n#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER\n  /* Provide assembler fragments for performance-critical functions. */\n  /* These must be defined `static __inline__' with GCC.             */\n\n#if defined( __CC_ARM ) || defined( __ARMCC__ )  /* RVCT */\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm\n\n  /* documentation is in freetype.h */\n\n  static __inline FT_Int32\n  FT_MulFix_arm( FT_Int32  a,\n                 FT_Int32  b )\n  {\n    register FT_Int32  t, t2;\n\n\n    __asm\n    {\n      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */\n      mov   a,  t,  asr #31         /* a   = (hi >> 31) */\n      add   a,  a,  #0x8000         /* a  += 0x8000 */\n      adds  t2, t2, a               /* t2 += a */\n      adc   t,  t,  #0              /* t  += carry */\n      mov   a,  t2, lsr #16         /* a   = t2 >> 16 */\n      orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */\n    }\n    return a;\n  }\n\n#endif /* __CC_ARM || __ARMCC__ */\n\n\n#ifdef __GNUC__\n\n#if defined( __arm__ ) && !defined( __thumb__ )    && \\\n    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm\n\n  /* documentation is in freetype.h */\n\n  static __inline__ FT_Int32\n  FT_MulFix_arm( FT_Int32  a,\n                 FT_Int32  b )\n  {\n    register FT_Int32  t, t2;\n\n\n    __asm__ __volatile__ (\n      \"smull  %1, %2, %4, %3\\n\\t\"       /* (lo=%1,hi=%2) = a*b */\n      \"mov    %0, %2, asr #31\\n\\t\"      /* %0  = (hi >> 31) */\n      \"add    %0, %0, #0x8000\\n\\t\"      /* %0 += 0x8000 */\n      \"adds   %1, %1, %0\\n\\t\"           /* %1 += %0 */\n      \"adc    %2, %2, #0\\n\\t\"           /* %2 += carry */\n      \"mov    %0, %1, lsr #16\\n\\t\"      /* %0  = %1 >> 16 */\n      \"orr    %0, %0, %2, lsl #16\\n\\t\"  /* %0 |= %2 << 16 */\n      : \"=r\"(a), \"=&r\"(t2), \"=&r\"(t)\n      : \"r\"(a), \"r\"(b)\n      : \"cc\" );\n    return a;\n  }\n\n#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */\n\n#if defined( __i386__ )\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386\n\n  /* documentation is in freetype.h */\n\n  static __inline__ FT_Int32\n  FT_MulFix_i386( FT_Int32  a,\n                  FT_Int32  b )\n  {\n    register FT_Int32  result;\n\n\n    __asm__ __volatile__ (\n      \"imul  %%edx\\n\"\n      \"movl  %%edx, %%ecx\\n\"\n      \"sarl  $31, %%ecx\\n\"\n      \"addl  $0x8000, %%ecx\\n\"\n      \"addl  %%ecx, %%eax\\n\"\n      \"adcl  $0, %%edx\\n\"\n      \"shrl  $16, %%eax\\n\"\n      \"shll  $16, %%edx\\n\"\n      \"addl  %%edx, %%eax\\n\"\n      : \"=a\"(result), \"=d\"(b)\n      : \"a\"(a), \"d\"(b)\n      : \"%ecx\", \"cc\" );\n    return result;\n  }\n\n#endif /* i386 */\n\n#endif /* __GNUC__ */\n\n\n#ifdef _MSC_VER /* Visual C++ */\n\n#ifdef _M_IX86\n\n#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386\n\n  /* documentation is in freetype.h */\n\n  static __inline FT_Int32\n  FT_MulFix_i386( FT_Int32  a,\n                  FT_Int32  b )\n  {\n    register FT_Int32  result;\n\n    __asm\n    {\n      mov eax, a\n      mov edx, b\n      imul edx\n      mov ecx, edx\n      sar ecx, 31\n      add ecx, 8000h\n      add eax, ecx\n      adc edx, 0\n      shr eax, 16\n      shl edx, 16\n      add eax, edx\n      mov result, eax\n    }\n    return result;\n  }\n\n#endif /* _M_IX86 */\n\n#endif /* _MSC_VER */\n\n#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */\n\n\n#ifdef FT_CONFIG_OPTION_INLINE_MULFIX\n#ifdef FT_MULFIX_ASSEMBLER\n#define FT_MULFIX_INLINED  FT_MULFIX_ASSEMBLER\n#endif\n#endif\n\n\n#ifdef FT_MAKE_OPTION_SINGLE_OBJECT\n\n#define FT_LOCAL( x )      static  x\n#define FT_LOCAL_DEF( x )  static  x\n\n#else\n\n#ifdef __cplusplus\n#define FT_LOCAL( x )      extern \"C\"  x\n#define FT_LOCAL_DEF( x )  extern \"C\"  x\n#else\n#define FT_LOCAL( x )      extern  x\n#define FT_LOCAL_DEF( x )  x\n#endif\n\n#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */\n\n\n#ifndef FT_BASE\n\n#ifdef __cplusplus\n#define FT_BASE( x )  extern \"C\"  x\n#else\n#define FT_BASE( x )  extern  x\n#endif\n\n#endif /* !FT_BASE */\n\n\n#ifndef FT_BASE_DEF\n\n#ifdef __cplusplus\n#define FT_BASE_DEF( x )  x\n#else\n#define FT_BASE_DEF( x )  x\n#endif\n\n#endif /* !FT_BASE_DEF */\n\n\n#ifndef FT_EXPORT\n\n#ifdef __cplusplus\n#define FT_EXPORT( x )  extern \"C\"  x\n#else\n#define FT_EXPORT( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT */\n\n\n#ifndef FT_EXPORT_DEF\n\n#ifdef __cplusplus\n#define FT_EXPORT_DEF( x )  extern \"C\"  x\n#else\n#define FT_EXPORT_DEF( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT_DEF */\n\n\n#ifndef FT_EXPORT_VAR\n\n#ifdef __cplusplus\n#define FT_EXPORT_VAR( x )  extern \"C\"  x\n#else\n#define FT_EXPORT_VAR( x )  extern  x\n#endif\n\n#endif /* !FT_EXPORT_VAR */\n\n  /* The following macros are needed to compile the library with a   */\n  /* C++ compiler and with 16bit compilers.                          */\n  /*                                                                 */\n\n  /* This is special.  Within C++, you must specify `extern \"C\"' for */\n  /* functions which are used via function pointers, and you also    */\n  /* must do that for structures which contain function pointers to  */\n  /* assure C linkage -- it's not possible to have (local) anonymous */\n  /* functions which are accessed by (global) function pointers.     */\n  /*                                                                 */\n  /*                                                                 */\n  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */\n  /*                                                                 */\n  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */\n  /* contains pointers to callback functions.                        */\n  /*                                                                 */\n  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */\n  /* that contains pointers to callback functions.                   */\n  /*                                                                 */\n  /*                                                                 */\n  /* Some 16bit compilers have to redefine these macros to insert    */\n  /* the infamous `_cdecl' or `__fastcall' declarations.             */\n  /*                                                                 */\n#ifndef FT_CALLBACK_DEF\n#ifdef __cplusplus\n#define FT_CALLBACK_DEF( x )  extern \"C\"  x\n#else\n#define FT_CALLBACK_DEF( x )  static  x\n#endif\n#endif /* FT_CALLBACK_DEF */\n\n#ifndef FT_CALLBACK_TABLE\n#ifdef __cplusplus\n#define FT_CALLBACK_TABLE      extern \"C\"\n#define FT_CALLBACK_TABLE_DEF  extern \"C\"\n#else\n#define FT_CALLBACK_TABLE      extern\n#define FT_CALLBACK_TABLE_DEF  /* nothing */\n#endif\n#endif /* FT_CALLBACK_TABLE */\n\n\nFT_END_HEADER\n\n\n#endif /* __FTCONFIG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/include/ftmodule.h",
    "content": "/*\n *  This file registers the FreeType modules compiled into the library.\n *\n *  If you use GNU make, this file IS NOT USED!  Instead, it is created in\n *  the objects directory (normally `<topdir>/objs/') based on information\n *  from `<topdir>/modules.cfg'.\n *\n *  Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile\n *  FreeType without GNU make.\n *\n */\n/*\nFT_USE_MODULE( FT_Module_Class, autofit_module_class )\n*/\nFT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )\n/*FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )\nFT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )\nFT_USE_MODULE( FT_Module_Class, psaux_module_class )\nFT_USE_MODULE( FT_Module_Class, psnames_module_class )\nFT_USE_MODULE( FT_Module_Class, pshinter_module_class )\n*/\nFT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )\nFT_USE_MODULE( FT_Module_Class, sfnt_module_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )\n/*\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )\nFT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )\nFT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )\n*/\n/* EOF */\n"
  },
  {
    "path": "libs/freetype/src/Jamfile",
    "content": "# FreeType 2 src Jamfile\n#\n# Copyright 2001, 2002 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) ;\n\n# The file <freetype/internal/internal.h> is used to define macros that are\n# later used in #include statements.  It needs to be parsed in order to\n# record these definitions.\n#\nHDRMACRO  [ FT2_SubDir $(FT2_INCLUDE_DIR) internal internal.h ] ;\n\nfor xx in $(FT2_COMPONENTS)\n{\n  SubInclude FT2_TOP $(FT2_SRC_DIR) $(xx) ;\n}\n\n# end of src Jamfile\n"
  },
  {
    "path": "libs/freetype/src/autofit/Jamfile",
    "content": "# FreeType 2 src/autofit Jamfile\n#\n# Copyright 2003, 2004, 2005, 2006, 2007, 2009 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir FT2_TOP src autofit ;\n\n{\n  local  _sources ;\n\n  # define FT2_AUTOFIT2 to enable experimental latin hinter replacement\n  if $(FT2_AUTOFIT2)\n  {\n    DEFINES += FT_OPTION_AUTOFIT2 ;\n  }\n  if $(FT2_MULTI)\n  {\n    _sources = afangles afglobal afhints aflatin afcjk afindic afloader afmodule afdummy afwarp afpic ;\n\n    if $(FT2_AUTOFIT2)\n    {\n      _sources += aflatin2 ;\n    }\n  }\n  else\n  {\n    _sources = autofit ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/autofit Jamfile\n"
  },
  {
    "path": "libs/freetype/src/autofit/afangles.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afangles.c                                                             */\n/*                                                                         */\n/*    Routines used to compute vector angles with limited accuracy         */\n/*    and very high speed.  It also contains sorting routines (body).      */\n/*                                                                         */\n/*  Copyright 2003-2006, 2011-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"aftypes.h\"\n\n\n#if 0\n\n  FT_LOCAL_DEF( FT_Int )\n  af_corner_is_flat( FT_Pos  x_in,\n                     FT_Pos  y_in,\n                     FT_Pos  x_out,\n                     FT_Pos  y_out )\n  {\n    FT_Pos  ax = x_in;\n    FT_Pos  ay = y_in;\n\n    FT_Pos  d_in, d_out, d_corner;\n\n\n    if ( ax < 0 )\n      ax = -ax;\n    if ( ay < 0 )\n      ay = -ay;\n    d_in = ax + ay;\n\n    ax = x_out;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = y_out;\n    if ( ay < 0 )\n      ay = -ay;\n    d_out = ax + ay;\n\n    ax = x_out + x_in;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = y_out + y_in;\n    if ( ay < 0 )\n      ay = -ay;\n    d_corner = ax + ay;\n\n    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );\n  }\n\n\n  FT_LOCAL_DEF( FT_Int )\n  af_corner_orientation( FT_Pos  x_in,\n                         FT_Pos  y_in,\n                         FT_Pos  x_out,\n                         FT_Pos  y_out )\n  {\n    FT_Pos  delta;\n\n\n    delta = x_in * y_out - y_in * x_out;\n\n    if ( delta == 0 )\n      return 0;\n    else\n      return 1 - 2 * ( delta < 0 );\n  }\n\n#endif /* 0 */\n\n\n  /*\n   *  We are not using `af_angle_atan' anymore, but we keep the source\n   *  code below just in case...\n   */\n\n\n#if 0\n\n\n  /*\n   *  The trick here is to realize that we don't need a very accurate angle\n   *  approximation.  We are going to use the result of `af_angle_atan' to\n   *  only compare the sign of angle differences, or check whether its\n   *  magnitude is very small.\n   *\n   *  The approximation\n   *\n   *    dy * PI / (|dx|+|dy|)\n   *\n   *  should be enough, and much faster to compute.\n   */\n  FT_LOCAL_DEF( AF_Angle )\n  af_angle_atan( FT_Fixed  dx,\n                 FT_Fixed  dy )\n  {\n    AF_Angle  angle;\n    FT_Fixed  ax = dx;\n    FT_Fixed  ay = dy;\n\n\n    if ( ax < 0 )\n      ax = -ax;\n    if ( ay < 0 )\n      ay = -ay;\n\n    ax += ay;\n\n    if ( ax == 0 )\n      angle = 0;\n    else\n    {\n      angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay );\n      if ( dx < 0 )\n      {\n        if ( angle >= 0 )\n          angle = AF_ANGLE_PI - angle;\n        else\n          angle = -AF_ANGLE_PI - angle;\n      }\n    }\n\n    return angle;\n  }\n\n\n#elif 0\n\n\n  /* the following table has been automatically generated with */\n  /* the `mather.py' Python script                             */\n\n#define AF_ATAN_BITS  8\n\n  static const FT_Byte  af_arctan[1L << AF_ATAN_BITS] =\n  {\n     0,  0,  1,  1,  1,  2,  2,  2,\n     3,  3,  3,  3,  4,  4,  4,  5,\n     5,  5,  6,  6,  6,  7,  7,  7,\n     8,  8,  8,  9,  9,  9, 10, 10,\n    10, 10, 11, 11, 11, 12, 12, 12,\n    13, 13, 13, 14, 14, 14, 14, 15,\n    15, 15, 16, 16, 16, 17, 17, 17,\n    18, 18, 18, 18, 19, 19, 19, 20,\n    20, 20, 21, 21, 21, 21, 22, 22,\n    22, 23, 23, 23, 24, 24, 24, 24,\n    25, 25, 25, 26, 26, 26, 26, 27,\n    27, 27, 28, 28, 28, 28, 29, 29,\n    29, 30, 30, 30, 30, 31, 31, 31,\n    31, 32, 32, 32, 33, 33, 33, 33,\n    34, 34, 34, 34, 35, 35, 35, 35,\n    36, 36, 36, 36, 37, 37, 37, 38,\n    38, 38, 38, 39, 39, 39, 39, 40,\n    40, 40, 40, 41, 41, 41, 41, 42,\n    42, 42, 42, 42, 43, 43, 43, 43,\n    44, 44, 44, 44, 45, 45, 45, 45,\n    46, 46, 46, 46, 46, 47, 47, 47,\n    47, 48, 48, 48, 48, 48, 49, 49,\n    49, 49, 50, 50, 50, 50, 50, 51,\n    51, 51, 51, 51, 52, 52, 52, 52,\n    52, 53, 53, 53, 53, 53, 54, 54,\n    54, 54, 54, 55, 55, 55, 55, 55,\n    56, 56, 56, 56, 56, 57, 57, 57,\n    57, 57, 57, 58, 58, 58, 58, 58,\n    59, 59, 59, 59, 59, 59, 60, 60,\n    60, 60, 60, 61, 61, 61, 61, 61,\n    61, 62, 62, 62, 62, 62, 62, 63,\n    63, 63, 63, 63, 63, 64, 64, 64\n  };\n\n\n  FT_LOCAL_DEF( AF_Angle )\n  af_angle_atan( FT_Fixed  dx,\n                 FT_Fixed  dy )\n  {\n    AF_Angle  angle;\n\n\n    /* check trivial cases */\n    if ( dy == 0 )\n    {\n      angle = 0;\n      if ( dx < 0 )\n        angle = AF_ANGLE_PI;\n      return angle;\n    }\n    else if ( dx == 0 )\n    {\n      angle = AF_ANGLE_PI2;\n      if ( dy < 0 )\n        angle = -AF_ANGLE_PI2;\n      return angle;\n    }\n\n    angle = 0;\n    if ( dx < 0 )\n    {\n      dx = -dx;\n      dy = -dy;\n      angle = AF_ANGLE_PI;\n    }\n\n    if ( dy < 0 )\n    {\n      FT_Pos  tmp;\n\n\n      tmp = dx;\n      dx  = -dy;\n      dy  = tmp;\n      angle -= AF_ANGLE_PI2;\n    }\n\n    if ( dx == 0 && dy == 0 )\n      return 0;\n\n    if ( dx == dy )\n      angle += AF_ANGLE_PI4;\n    else if ( dx > dy )\n      angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )];\n    else\n      angle += AF_ANGLE_PI2 -\n               af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )];\n\n    if ( angle > AF_ANGLE_PI )\n      angle -= AF_ANGLE_2PI;\n\n    return angle;\n  }\n\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( void )\n  af_sort_pos( FT_UInt  count,\n               FT_Pos*  table )\n  {\n    FT_UInt  i, j;\n    FT_Pos   swap;\n\n\n    for ( i = 1; i < count; i++ )\n    {\n      for ( j = i; j > 0; j-- )\n      {\n        if ( table[j] >= table[j - 1] )\n          break;\n\n        swap         = table[j];\n        table[j]     = table[j - 1];\n        table[j - 1] = swap;\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_sort_and_quantize_widths( FT_UInt*  count,\n                               AF_Width  table,\n                               FT_Pos    threshold )\n  {\n    FT_UInt      i, j;\n    FT_UInt      cur_idx;\n    FT_Pos       cur_val;\n    FT_Pos       sum;\n    AF_WidthRec  swap;\n\n\n    if ( *count == 1 )\n      return;\n\n    /* sort */\n    for ( i = 1; i < *count; i++ )\n    {\n      for ( j = i; j > 0; j-- )\n      {\n        if ( table[j].org >= table[j - 1].org )\n          break;\n\n        swap         = table[j];\n        table[j]     = table[j - 1];\n        table[j - 1] = swap;\n      }\n    }\n\n    cur_idx = 0;\n    cur_val = table[cur_idx].org;\n\n    /* compute and use mean values for clusters not larger than  */\n    /* `threshold'; this is very primitive and might not yield   */\n    /* the best result, but normally, using reference character  */\n    /* `o', `*count' is 2, so the code below is fully sufficient */\n    for ( i = 1; i < *count; i++ )\n    {\n      if ( table[i].org - cur_val > threshold ||\n           i == *count - 1                    )\n      {\n        sum = 0;\n\n        /* fix loop for end of array */\n        if ( table[i].org - cur_val <= threshold &&\n             i == *count - 1                     )\n          i++;\n\n        for ( j = cur_idx; j < i; j++ )\n        {\n          sum         += table[j].org;\n          table[j].org = 0;\n        }\n        table[cur_idx].org = sum / j;\n\n        if ( i < *count - 1 )\n        {\n          cur_idx = i + 1;\n          cur_val = table[cur_idx].org;\n        }\n      }\n    }\n\n    cur_idx = 1;\n\n    /* compress array to remove zero values */\n    for ( i = 1; i < *count; i++ )\n    {\n      if ( table[i].org )\n        table[cur_idx++] = table[i];\n    }\n\n    *count = cur_idx;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afangles.h",
    "content": "/*\n *  afangles.h\n *\n *  This is a dummy file, used to please the build system.  It is never\n *  included by the auto-fitter sources.\n *\n */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afcjk.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afcjk.c                                                                */\n/*                                                                         */\n/*    Auto-fitter hinting routines for CJK script (body).                  */\n/*                                                                         */\n/*  Copyright 2006-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*\n   *  The algorithm is based on akito's autohint patch, available here:\n   *\n   *  http://www.kde.gr.jp/~akito/patch/freetype2/\n   *\n   */\n\n#include <ft2build.h>\n#include FT_ADVANCES_H\n#include FT_INTERNAL_DEBUG_H\n\n#include \"aftypes.h\"\n#include \"aflatin.h\"\n\n\n#ifdef AF_CONFIG_OPTION_CJK\n\n#undef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT\n\n#include \"afcjk.h\"\n#include \"aferrors.h\"\n\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n#include \"afwarp.h\"\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_afcjk\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****              C J K   G L O B A L   M E T R I C S              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* Basically the Latin version with AF_CJKMetrics */\n  /* to replace AF_LatinMetrics.                    */\n\n  FT_LOCAL_DEF( void )\n  af_cjk_metrics_init_widths( AF_CJKMetrics  metrics,\n                              FT_Face        face )\n  {\n    /* scan the array of segments in each direction */\n    AF_GlyphHintsRec  hints[1];\n\n\n    af_glyph_hints_init( hints, face->memory );\n\n    metrics->axis[AF_DIMENSION_HORZ].width_count = 0;\n    metrics->axis[AF_DIMENSION_VERT].width_count = 0;\n\n    {\n      FT_Error          error;\n      FT_UInt           glyph_index;\n      int               dim;\n      AF_CJKMetricsRec  dummy[1];\n      AF_Scaler         scaler = &dummy->root.scaler;\n\n\n      glyph_index = FT_Get_Char_Index( face,\n                                       metrics->root.clazz->standard_char );\n      if ( glyph_index == 0 )\n        goto Exit;\n\n      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );\n      if ( error || face->glyph->outline.n_points <= 0 )\n        goto Exit;\n\n      FT_ZERO( dummy );\n\n      dummy->units_per_em = metrics->units_per_em;\n\n      scaler->x_scale = 0x10000L;\n      scaler->y_scale = 0x10000L;\n      scaler->x_delta = 0;\n      scaler->y_delta = 0;\n\n      scaler->face        = face;\n      scaler->render_mode = FT_RENDER_MODE_NORMAL;\n      scaler->flags       = 0;\n\n      af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy );\n\n      error = af_glyph_hints_reload( hints, &face->glyph->outline );\n      if ( error )\n        goto Exit;\n\n      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n      {\n        AF_CJKAxis    axis    = &metrics->axis[dim];\n        AF_AxisHints  axhints = &hints->axis[dim];\n        AF_Segment    seg, limit, link;\n        FT_UInt       num_widths = 0;\n\n\n        error = af_latin_hints_compute_segments( hints, (AF_Dimension)dim );\n        if ( error )\n          goto Exit;\n\n        af_latin_hints_link_segments( hints, (AF_Dimension)dim );\n\n        seg   = axhints->segments;\n        limit = seg + axhints->num_segments;\n\n        for ( ; seg < limit; seg++ )\n        {\n          link = seg->link;\n\n          /* we only consider stem segments there! */\n          if ( link && link->link == seg && link > seg )\n          {\n            FT_Pos  dist;\n\n\n            dist = seg->pos - link->pos;\n            if ( dist < 0 )\n              dist = -dist;\n\n            if ( num_widths < AF_CJK_MAX_WIDTHS )\n              axis->widths[num_widths++].org = dist;\n          }\n        }\n\n        /* this also replaces multiple almost identical stem widths */\n        /* with a single one (the value 100 is heuristic) */\n        af_sort_and_quantize_widths( &num_widths, axis->widths,\n                                     dummy->units_per_em / 100 );\n        axis->width_count = num_widths;\n      }\n\n    Exit:\n      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n      {\n        AF_CJKAxis  axis = &metrics->axis[dim];\n        FT_Pos      stdw;\n\n\n        stdw = ( axis->width_count > 0 ) ? axis->widths[0].org\n                                         : AF_LATIN_CONSTANT( metrics, 50 );\n\n        /* let's try 20% of the smallest width */\n        axis->edge_distance_threshold = stdw / 5;\n        axis->standard_width          = stdw;\n        axis->extra_light             = 0;\n      }\n    }\n\n    af_glyph_hints_done( hints );\n  }\n\n\n#define AF_CJK_MAX_TEST_CHARACTERS  32\n\n\n  /* Each blue zone has two types of fill and unfill, this is, */\n  /* filling the entire glyph square or not.                   */\n\n  enum\n  {\n    AF_CJK_BLUE_TYPE_FILL,\n    AF_CJK_BLUE_TYPE_UNFILL,\n    AF_CJK_BLUE_TYPE_MAX\n  };\n\n\n  /* Put some common and representative Han Ideographs characters here. */\n  static const FT_ULong af_cjk_hani_blue_chars[AF_CJK_BLUE_MAX]\n                                              [AF_CJK_BLUE_TYPE_MAX]\n                                              [AF_CJK_MAX_TEST_CHARACTERS] =\n  {\n    {\n      {\n        0x4ED6, 0x4EEC, 0x4F60, 0x4F86, 0x5011, 0x5230, 0x548C, 0x5730,\n        0x5BF9, 0x5C0D, 0x5C31, 0x5E2D, 0x6211, 0x65F6, 0x6642, 0x6703,\n        0x6765, 0x70BA, 0x80FD, 0x8230, 0x8AAA, 0x8BF4, 0x8FD9, 0x9019,\n        0x9F4A /* top fill */\n      },\n      {\n        0x519B, 0x540C, 0x5DF2, 0x613F, 0x65E2, 0x661F, 0x662F, 0x666F,\n        0x6C11, 0x7167, 0x73B0, 0x73FE, 0x7406, 0x7528, 0x7F6E, 0x8981,\n        0x8ECD, 0x90A3, 0x914D, 0x91CC, 0x958B, 0x96F7, 0x9732, 0x9762,\n        0x987E /* top unfill */\n      }\n    },\n    {\n      {\n        0x4E2A, 0x4E3A, 0x4EBA, 0x4ED6, 0x4EE5, 0x4EEC, 0x4F60, 0x4F86,\n        0x500B, 0x5011, 0x5230, 0x548C, 0x5927, 0x5BF9, 0x5C0D, 0x5C31,\n        0x6211, 0x65F6, 0x6642, 0x6709, 0x6765, 0x70BA, 0x8981, 0x8AAA,\n        0x8BF4 /* bottom fill */\n      },\n      {\n        0x4E3B, 0x4E9B, 0x56E0, 0x5B83, 0x60F3, 0x610F, 0x7406, 0x751F,\n        0x7576, 0x770B, 0x7740, 0x7F6E, 0x8005, 0x81EA, 0x8457, 0x88E1,\n        0x8FC7, 0x8FD8, 0x8FDB, 0x9032, 0x904E, 0x9053, 0x9084, 0x91CC,\n        0x9762 /* bottom unfill */\n      }\n    },\n#ifndef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT\n      { {0x0000}, {0x0000} },\n      { {0x0000}, {0x0000} }\n#else\n    {\n      {\n        0x4E9B, 0x4EEC, 0x4F60, 0x4F86, 0x5011, 0x5230, 0x548C, 0x5730,\n        0x5979, 0x5C06, 0x5C07, 0x5C31, 0x5E74, 0x5F97, 0x60C5, 0x6700,\n        0x6837, 0x6A23, 0x7406, 0x80FD, 0x8AAA, 0x8BF4, 0x8FD9, 0x9019,\n        0x901A /* left fill */\n      },\n      {\n        0x5373, 0x5417, 0x5427, 0x542C, 0x5462, 0x54C1, 0x54CD, 0x55CE,\n        0x5E08, 0x5E2B, 0x6536, 0x65AD, 0x65B7, 0x660E, 0x773C, 0x9593,\n        0x95F4, 0x9645, 0x9648, 0x9650, 0x9664, 0x9673, 0x968F, 0x969B,\n        0x96A8 /* left unfill */\n      }\n    },\n    {\n      {\n        0x4E8B, 0x524D, 0x5B78, 0x5C06, 0x5C07, 0x60C5, 0x60F3, 0x6216,\n        0x653F, 0x65AF, 0x65B0, 0x6837, 0x6A23, 0x6C11, 0x6C92, 0x6CA1,\n        0x7136, 0x7279, 0x73B0, 0x73FE, 0x7403, 0x7B2C, 0x7D93, 0x8C01,\n        0x8D77 /* right fill */\n      },\n      {\n        0x4F8B, 0x5225, 0x522B, 0x5236, 0x52A8, 0x52D5, 0x5417, 0x55CE,\n        0x589E, 0x6307, 0x660E, 0x671D, 0x671F, 0x6784, 0x7269, 0x786E,\n        0x79CD, 0x8ABF, 0x8C03, 0x8CBB, 0x8D39, 0x90A3, 0x90FD, 0x9593,\n        0x95F4 /* right unfill */\n      }\n    }\n#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */\n  };\n\n\n  /* Calculate blue zones for all the CJK_BLUE_XXX's. */\n\n  static void\n  af_cjk_metrics_init_blues( AF_CJKMetrics   metrics,\n                             FT_Face         face,\n                             const FT_ULong  blue_chars\n                                               [AF_CJK_BLUE_MAX]\n                                               [AF_CJK_BLUE_TYPE_MAX]\n                                               [AF_CJK_MAX_TEST_CHARACTERS] )\n  {\n    FT_Pos        fills[AF_CJK_MAX_TEST_CHARACTERS];\n    FT_Pos        flats[AF_CJK_MAX_TEST_CHARACTERS];\n\n    FT_Int        num_fills;\n    FT_Int        num_flats;\n\n    FT_Int        bb;\n    AF_CJKBlue    blue;\n    FT_Error      error;\n    AF_CJKAxis    axis;\n    FT_GlyphSlot  glyph = face->glyph;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    FT_String*  cjk_blue_name[AF_CJK_BLUE_MAX] = {\n      (FT_String*)\"top\",\n      (FT_String*)\"bottom\",\n      (FT_String*)\"left\",\n      (FT_String*)\"right\"\n    };\n    FT_String*  cjk_blue_type_name[AF_CJK_BLUE_TYPE_MAX] = {\n      (FT_String*)\"filled\",\n      (FT_String*)\"unfilled\"\n    };\n#endif\n\n\n    /* We compute the blues simply by loading each character from the */\n    /* `blue_chars[blues]' string, then computing its extreme points  */\n    /* (depending blue zone type etc.).                               */\n\n    FT_TRACE5(( \"cjk blue zones computation\\n\" ));\n    FT_TRACE5(( \"------------------------------------------------\\n\" ));\n\n    for ( bb = 0; bb < AF_CJK_BLUE_MAX; bb++ )\n    {\n      FT_Int   fill_type;\n      FT_Pos*  blue_ref;\n      FT_Pos*  blue_shoot;\n\n\n      num_fills = 0;\n      num_flats = 0;\n\n      for ( fill_type = 0; fill_type < AF_CJK_BLUE_TYPE_MAX; fill_type++ )\n      {\n        const FT_ULong*  p     = blue_chars[bb][fill_type];\n        const FT_ULong*  limit = p + AF_CJK_MAX_TEST_CHARACTERS;\n        FT_Bool          fill  = FT_BOOL(\n                                   fill_type == AF_CJK_BLUE_TYPE_FILL );\n\n\n        FT_TRACE5(( \"cjk blue %s/%s\\n\", cjk_blue_name[bb],\n                                        cjk_blue_type_name[fill_type] ));\n\n\n        for ( ; p < limit && *p; p++ )\n        {\n          FT_UInt     glyph_index;\n          FT_Pos      best_pos; /* same as points.y */\n          FT_Int      best_point;\n          FT_Vector*  points;\n\n\n          FT_TRACE5(( \"  U+%lX...\", *p ));\n\n          /* load the character in the face -- skip unknown or empty ones */\n          glyph_index = FT_Get_Char_Index( face, *p );\n          if ( glyph_index == 0 )\n          {\n            FT_TRACE5(( \"unavailable\\n\" ));\n            continue;\n          }\n\n          error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );\n          if ( error || glyph->outline.n_points <= 0 )\n          {\n            FT_TRACE5(( \"no outline\\n\" ));\n            continue;\n          }\n\n          /* now compute min or max point indices and coordinates */\n          points     = glyph->outline.points;\n          best_point = -1;\n          best_pos   = 0;  /* make compiler happy */\n\n          {\n            FT_Int  nn;\n            FT_Int  first = 0;\n            FT_Int  last  = -1;\n\n\n            for ( nn = 0;\n                  nn < glyph->outline.n_contours;\n                  first = last + 1, nn++ )\n            {\n              FT_Int  pp;\n\n\n              last = glyph->outline.contours[nn];\n\n              /* Avoid single-point contours since they are never       */\n              /* rasterized.  In some fonts, they correspond to mark    */\n              /* attachment points which are way outside of the glyph's */\n              /* real outline.                                          */\n              if ( last <= first )\n                continue;\n\n              switch ( bb )\n              {\n              case AF_CJK_BLUE_TOP:\n                for ( pp = first; pp <= last; pp++ )\n                  if ( best_point < 0 || points[pp].y > best_pos )\n                  {\n                    best_point = pp;\n                    best_pos   = points[pp].y;\n                  }\n                break;\n\n              case AF_CJK_BLUE_BOTTOM:\n                for ( pp = first; pp <= last; pp++ )\n                  if ( best_point < 0 || points[pp].y < best_pos )\n                  {\n                    best_point = pp;\n                    best_pos   = points[pp].y;\n                  }\n                break;\n\n              case AF_CJK_BLUE_LEFT:\n                for ( pp = first; pp <= last; pp++ )\n                  if ( best_point < 0 || points[pp].x < best_pos )\n                  {\n                    best_point = pp;\n                    best_pos   = points[pp].x;\n                  }\n                break;\n\n              case AF_CJK_BLUE_RIGHT:\n                for ( pp = first; pp <= last; pp++ )\n                  if ( best_point < 0 || points[pp].x > best_pos )\n                  {\n                    best_point = pp;\n                    best_pos   = points[pp].x;\n                  }\n                break;\n\n              default:\n                ;\n              }\n            }\n            FT_TRACE5(( \"best_pos=%5ld\\n\", best_pos ));\n          }\n\n          if ( fill )\n            fills[num_fills++] = best_pos;\n          else\n            flats[num_flats++] = best_pos;\n        }\n      }\n\n      if ( num_flats == 0 && num_fills == 0 )\n      {\n        /*\n         *  we couldn't find a single glyph to compute this blue zone,\n         *  we will simply ignore it then\n         */\n        FT_TRACE5(( \"empty\\n\" ));\n        continue;\n      }\n\n      /* we have computed the contents of the `fill' and `flats' tables, */\n      /* now determine the reference position of the blue --             */\n      /* we simply take the median value after a simple sort             */\n      af_sort_pos( num_flats, flats );\n      af_sort_pos( num_fills, fills );\n\n      if ( AF_CJK_BLUE_TOP == bb || AF_CJK_BLUE_BOTTOM == bb )\n        axis = &metrics->axis[AF_DIMENSION_VERT];\n      else\n        axis = &metrics->axis[AF_DIMENSION_HORZ];\n\n      blue       = & axis->blues[axis->blue_count];\n      blue_ref   = & blue->ref.org;\n      blue_shoot = & blue->shoot.org;\n\n      axis->blue_count++;\n      if ( num_flats == 0 )\n      {\n        *blue_ref   = fills[num_fills / 2];\n        *blue_shoot = fills[num_fills / 2];\n      }\n      else if ( num_fills == 0 )\n      {\n        *blue_ref   = flats[num_flats / 2];\n        *blue_shoot = flats[num_flats / 2];\n      }\n      else\n      {\n        *blue_ref   = fills[num_fills / 2];\n        *blue_shoot = flats[num_flats / 2];\n      }\n\n      /* make sure blue_ref >= blue_shoot for top/right or */\n      /* vice versa for bottom/left                        */\n      if ( *blue_shoot != *blue_ref )\n      {\n        FT_Pos   ref       = *blue_ref;\n        FT_Pos   shoot     = *blue_shoot;\n        FT_Bool  under_ref = FT_BOOL( shoot < ref );\n\n\n        if ( ( AF_CJK_BLUE_TOP == bb   ||\n               AF_CJK_BLUE_RIGHT == bb ) ^ under_ref )\n          *blue_shoot = *blue_ref = ( shoot + ref ) / 2;\n      }\n\n      blue->flags = 0;\n      if ( AF_CJK_BLUE_TOP == bb )\n        blue->flags |= AF_CJK_BLUE_IS_TOP;\n      else if ( AF_CJK_BLUE_RIGHT == bb )\n        blue->flags |= AF_CJK_BLUE_IS_RIGHT;\n\n      FT_TRACE5(( \"-- cjk %s bluezone ref = %ld shoot = %ld\\n\",\n                  cjk_blue_name[bb], *blue_ref, *blue_shoot ));\n    }\n\n    return;\n  }\n\n\n  /* Basically the Latin version with type AF_CJKMetrics for metrics. */\n  FT_LOCAL_DEF( void )\n  af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,\n                               FT_Face        face )\n  {\n    FT_UInt   i;\n    FT_Bool   started = 0, same_width = 1;\n    FT_Fixed  advance, old_advance = 0;\n\n\n    /* check whether all ASCII digits have the same advance width; */\n    /* digit `0' is 0x30 in all supported charmaps                 */\n    for ( i = 0x30; i <= 0x39; i++ )\n    {\n      FT_UInt  glyph_index;\n\n\n      glyph_index = FT_Get_Char_Index( face, i );\n      if ( glyph_index == 0 )\n        continue;\n\n      if ( FT_Get_Advance( face, glyph_index,\n                           FT_LOAD_NO_SCALE         |\n                           FT_LOAD_NO_HINTING       |\n                           FT_LOAD_IGNORE_TRANSFORM,\n                           &advance ) )\n        continue;\n\n      if ( started )\n      {\n        if ( advance != old_advance )\n        {\n          same_width = 0;\n          break;\n        }\n      }\n      else\n      {\n        old_advance = advance;\n        started     = 1;\n      }\n    }\n\n    metrics->root.digits_have_same_width = same_width;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  af_cjk_metrics_init( AF_CJKMetrics  metrics,\n                       FT_Face        face )\n  {\n    FT_CharMap  oldmap = face->charmap;\n\n\n    metrics->units_per_em = face->units_per_EM;\n\n    if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) )\n      face->charmap = NULL;\n    else\n    {\n      af_cjk_metrics_init_widths( metrics, face );\n      af_cjk_metrics_init_blues( metrics, face, af_cjk_hani_blue_chars );\n      af_cjk_metrics_check_digits( metrics, face );\n    }\n\n    FT_Set_Charmap( face, oldmap );\n\n    return FT_Err_Ok;\n  }\n\n\n  static void\n  af_cjk_metrics_scale_dim( AF_CJKMetrics  metrics,\n                            AF_Scaler      scaler,\n                            AF_Dimension   dim )\n  {\n    FT_Fixed    scale;\n    FT_Pos      delta;\n    AF_CJKAxis  axis;\n    FT_UInt     nn;\n\n\n    axis = &metrics->axis[dim];\n\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      scale = scaler->x_scale;\n      delta = scaler->x_delta;\n    }\n    else\n    {\n      scale = scaler->y_scale;\n      delta = scaler->y_delta;\n    }\n\n    if ( axis->org_scale == scale && axis->org_delta == delta )\n      return;\n\n    axis->org_scale = scale;\n    axis->org_delta = delta;\n\n    axis->scale = scale;\n    axis->delta = delta;\n\n    /* scale the blue zones */\n    for ( nn = 0; nn < axis->blue_count; nn++ )\n    {\n      AF_CJKBlue  blue = &axis->blues[nn];\n      FT_Pos      dist;\n\n\n      blue->ref.cur   = FT_MulFix( blue->ref.org, scale ) + delta;\n      blue->ref.fit   = blue->ref.cur;\n      blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta;\n      blue->shoot.fit = blue->shoot.cur;\n      blue->flags    &= ~AF_CJK_BLUE_ACTIVE;\n\n      /* a blue zone is only active if it is less than 3/4 pixels tall */\n      dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale );\n      if ( dist <= 48 && dist >= -48 )\n      {\n        FT_Pos  delta1, delta2;\n\n\n        blue->ref.fit  = FT_PIX_ROUND( blue->ref.cur );\n\n        /* shoot is under shoot for cjk */\n        delta1 = FT_DivFix( blue->ref.fit, scale ) - blue->shoot.org;\n        delta2 = delta1;\n        if ( delta1 < 0 )\n          delta2 = -delta2;\n\n        delta2 = FT_MulFix( delta2, scale );\n\n        FT_TRACE5(( \"delta: %d\", delta1 ));\n        if ( delta2 < 32 )\n          delta2 = 0;\n#if 0\n        else if ( delta2 < 64 )\n          delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );\n#endif\n        else\n          delta2 = FT_PIX_ROUND( delta2 );\n        FT_TRACE5(( \"/%d\\n\", delta2 ));\n\n        if ( delta1 < 0 )\n          delta2 = -delta2;\n\n        blue->shoot.fit = blue->ref.fit - delta2;\n\n        FT_TRACE5(( \">> active cjk blue zone %c%d[%ld/%ld]: \"\n                     \"ref: cur=%.2f fit=%.2f shoot: cur=%.2f fit=%.2f\\n\",\n                       ( dim == AF_DIMENSION_HORZ ) ? 'H' : 'V',\n                       nn, blue->ref.org, blue->shoot.org,\n                       blue->ref.cur / 64.0, blue->ref.fit / 64.0,\n                       blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 ));\n\n        blue->flags |= AF_CJK_BLUE_ACTIVE;\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_cjk_metrics_scale( AF_CJKMetrics  metrics,\n                        AF_Scaler      scaler )\n  {\n    metrics->root.scaler = *scaler;\n\n    af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ );\n    af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****              C J K   G L Y P H   A N A L Y S I S              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_Error\n  af_cjk_hints_compute_segments( AF_GlyphHints  hints,\n                                 AF_Dimension   dim )\n  {\n    AF_AxisHints  axis          = &hints->axis[dim];\n    AF_Segment    segments      = axis->segments;\n    AF_Segment    segment_limit = segments + axis->num_segments;\n    FT_Error      error;\n    AF_Segment    seg;\n\n\n    error = af_latin_hints_compute_segments( hints, dim );\n    if ( error )\n      return error;\n\n    /* a segment is round if it doesn't have successive */\n    /* on-curve points.                                 */\n    for ( seg = segments; seg < segment_limit; seg++ )\n    {\n      AF_Point  pt   = seg->first;\n      AF_Point  last = seg->last;\n      AF_Flags  f0   = (AF_Flags)( pt->flags & AF_FLAG_CONTROL );\n      AF_Flags  f1;\n\n\n      seg->flags &= ~AF_EDGE_ROUND;\n\n      for ( ; pt != last; f0 = f1 )\n      {\n        pt = pt->next;\n        f1 = (AF_Flags)( pt->flags & AF_FLAG_CONTROL );\n\n        if ( !f0 && !f1 )\n          break;\n\n        if ( pt == last )\n          seg->flags |= AF_EDGE_ROUND;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  static void\n  af_cjk_hints_link_segments( AF_GlyphHints  hints,\n                              AF_Dimension   dim )\n  {\n    AF_AxisHints  axis          = &hints->axis[dim];\n    AF_Segment    segments      = axis->segments;\n    AF_Segment    segment_limit = segments + axis->num_segments;\n    AF_Direction  major_dir     = axis->major_dir;\n    AF_Segment    seg1, seg2;\n    FT_Pos        len_threshold;\n    FT_Pos        dist_threshold;\n\n\n    len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 );\n\n    dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale\n                                                  : hints->y_scale;\n    dist_threshold = FT_DivFix( 64 * 3, dist_threshold );\n\n    /* now compare each segment to the others */\n    for ( seg1 = segments; seg1 < segment_limit; seg1++ )\n    {\n      /* the fake segments are for metrics hinting only */\n      if ( seg1->first == seg1->last )\n        continue;\n\n      if ( seg1->dir != major_dir )\n        continue;\n\n      for ( seg2 = segments; seg2 < segment_limit; seg2++ )\n        if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 )\n        {\n          FT_Pos  dist = seg2->pos - seg1->pos;\n\n\n          if ( dist < 0 )\n            continue;\n\n          {\n            FT_Pos  min = seg1->min_coord;\n            FT_Pos  max = seg1->max_coord;\n            FT_Pos  len;\n\n\n            if ( min < seg2->min_coord )\n              min = seg2->min_coord;\n\n            if ( max > seg2->max_coord )\n              max = seg2->max_coord;\n\n            len = max - min;\n            if ( len >= len_threshold )\n            {\n              if ( dist * 8 < seg1->score * 9                        &&\n                   ( dist * 8 < seg1->score * 7 || seg1->len < len ) )\n              {\n                seg1->score = dist;\n                seg1->len   = len;\n                seg1->link  = seg2;\n              }\n\n              if ( dist * 8 < seg2->score * 9                        &&\n                   ( dist * 8 < seg2->score * 7 || seg2->len < len ) )\n              {\n                seg2->score = dist;\n                seg2->len   = len;\n                seg2->link  = seg1;\n              }\n            }\n          }\n        }\n    }\n\n    /*\n     *  now compute the `serif' segments\n     *\n     *  In Hanzi, some strokes are wider on one or both of the ends.\n     *  We either identify the stems on the ends as serifs or remove\n     *  the linkage, depending on the length of the stems.\n     *\n     */\n\n    {\n      AF_Segment  link1, link2;\n\n\n      for ( seg1 = segments; seg1 < segment_limit; seg1++ )\n      {\n        link1 = seg1->link;\n        if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos )\n          continue;\n\n        if ( seg1->score >= dist_threshold )\n          continue;\n\n        for ( seg2 = segments; seg2 < segment_limit; seg2++ )\n        {\n          if ( seg2->pos > seg1->pos || seg1 == seg2 )\n            continue;\n\n          link2 = seg2->link;\n          if ( !link2 || link2->link != seg2 || link2->pos < link1->pos )\n            continue;\n\n          if ( seg1->pos == seg2->pos && link1->pos == link2->pos )\n            continue;\n\n          if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score )\n            continue;\n\n          /* seg2 < seg1 < link1 < link2 */\n\n          if ( seg1->len >= seg2->len * 3 )\n          {\n            AF_Segment  seg;\n\n\n            for ( seg = segments; seg < segment_limit; seg++ )\n            {\n              AF_Segment  link = seg->link;\n\n\n              if ( link == seg2 )\n              {\n                seg->link  = 0;\n                seg->serif = link1;\n              }\n              else if ( link == link2 )\n              {\n                seg->link  = 0;\n                seg->serif = seg1;\n              }\n            }\n          }\n          else\n          {\n            seg1->link = link1->link = 0;\n\n            break;\n          }\n        }\n      }\n    }\n\n    for ( seg1 = segments; seg1 < segment_limit; seg1++ )\n    {\n      seg2 = seg1->link;\n\n      if ( seg2 )\n      {\n        seg2->num_linked++;\n        if ( seg2->link != seg1 )\n        {\n          seg1->link = 0;\n\n          if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 )\n            seg1->serif = seg2->link;\n          else\n            seg2->num_linked--;\n        }\n      }\n    }\n  }\n\n\n  static FT_Error\n  af_cjk_hints_compute_edges( AF_GlyphHints  hints,\n                              AF_Dimension   dim )\n  {\n    AF_AxisHints  axis   = &hints->axis[dim];\n    FT_Error      error  = FT_Err_Ok;\n    FT_Memory     memory = hints->memory;\n    AF_CJKAxis    laxis  = &((AF_CJKMetrics)hints->metrics)->axis[dim];\n\n    AF_Segment    segments      = axis->segments;\n    AF_Segment    segment_limit = segments + axis->num_segments;\n    AF_Segment    seg;\n\n    FT_Fixed      scale;\n    FT_Pos        edge_distance_threshold;\n\n\n    axis->num_edges = 0;\n\n    scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale\n                                         : hints->y_scale;\n\n    /*********************************************************************/\n    /*                                                                   */\n    /* We begin by generating a sorted table of edges for the current    */\n    /* direction.  To do so, we simply scan each segment and try to find */\n    /* an edge in our table that corresponds to its position.            */\n    /*                                                                   */\n    /* If no edge is found, we create and insert a new edge in the       */\n    /* sorted table.  Otherwise, we simply add the segment to the edge's */\n    /* list which is then processed in the second step to compute the    */\n    /* edge's properties.                                                */\n    /*                                                                   */\n    /* Note that the edges table is sorted along the segment/edge        */\n    /* position.                                                         */\n    /*                                                                   */\n    /*********************************************************************/\n\n    edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold,\n                                         scale );\n    if ( edge_distance_threshold > 64 / 4 )\n      edge_distance_threshold = FT_DivFix( 64 / 4, scale );\n    else\n      edge_distance_threshold = laxis->edge_distance_threshold;\n\n    for ( seg = segments; seg < segment_limit; seg++ )\n    {\n      AF_Edge  found = 0;\n      FT_Pos   best  = 0xFFFFU;\n      FT_Int   ee;\n\n\n      /* look for an edge corresponding to the segment */\n      for ( ee = 0; ee < axis->num_edges; ee++ )\n      {\n        AF_Edge  edge = axis->edges + ee;\n        FT_Pos   dist;\n\n\n        if ( edge->dir != seg->dir )\n          continue;\n\n        dist = seg->pos - edge->fpos;\n        if ( dist < 0 )\n          dist = -dist;\n\n        if ( dist < edge_distance_threshold && dist < best )\n        {\n          AF_Segment  link = seg->link;\n\n\n          /* check whether all linked segments of the candidate edge */\n          /* can make a single edge.                                 */\n          if ( link )\n          {\n            AF_Segment  seg1 = edge->first;\n            AF_Segment  link1;\n            FT_Pos      dist2 = 0;\n\n\n            do\n            {\n              link1 = seg1->link;\n              if ( link1 )\n              {\n                dist2 = AF_SEGMENT_DIST( link, link1 );\n                if ( dist2 >= edge_distance_threshold )\n                  break;\n              }\n\n            } while ( ( seg1 = seg1->edge_next ) != edge->first );\n\n            if ( dist2 >= edge_distance_threshold )\n              continue;\n          }\n\n          best  = dist;\n          found = edge;\n        }\n      }\n\n      if ( !found )\n      {\n        AF_Edge  edge;\n\n\n        /* insert a new edge in the list and */\n        /* sort according to the position    */\n        error = af_axis_hints_new_edge( axis, seg->pos,\n                                        (AF_Direction)seg->dir,\n                                        memory, &edge );\n        if ( error )\n          goto Exit;\n\n        /* add the segment to the new edge's list */\n        FT_ZERO( edge );\n\n        edge->first    = seg;\n        edge->last     = seg;\n        edge->fpos     = seg->pos;\n        edge->opos     = edge->pos = FT_MulFix( seg->pos, scale );\n        seg->edge_next = seg;\n        edge->dir      = seg->dir;\n      }\n      else\n      {\n        /* if an edge was found, simply add the segment to the edge's */\n        /* list                                                       */\n        seg->edge_next         = found->first;\n        found->last->edge_next = seg;\n        found->last            = seg;\n      }\n    }\n\n    /*********************************************************************/\n    /*                                                                   */\n    /* Good, we now compute each edge's properties according to segments */\n    /* found on its position.  Basically, these are as follows.          */\n    /*                                                                   */\n    /*  - edge's main direction                                          */\n    /*  - stem edge, serif edge or both (which defaults to stem then)    */\n    /*  - rounded edge, straight or both (which defaults to straight)    */\n    /*  - link for edge                                                  */\n    /*                                                                   */\n    /*********************************************************************/\n\n    /* first of all, set the `edge' field in each segment -- this is     */\n    /* required in order to compute edge links                           */\n    /*                                                                   */\n    /* Note that removing this loop and setting the `edge' field of each */\n    /* segment directly in the code above slows down execution speed for */\n    /* some reasons on platforms like the Sun.                           */\n\n    {\n      AF_Edge  edges      = axis->edges;\n      AF_Edge  edge_limit = edges + axis->num_edges;\n      AF_Edge  edge;\n\n\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        seg = edge->first;\n        if ( seg )\n          do\n          {\n            seg->edge = edge;\n            seg       = seg->edge_next;\n\n          } while ( seg != edge->first );\n      }\n\n      /* now compute each edge properties */\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        FT_Int  is_round    = 0;  /* does it contain round segments?    */\n        FT_Int  is_straight = 0;  /* does it contain straight segments? */\n\n\n        seg = edge->first;\n\n        do\n        {\n          FT_Bool  is_serif;\n\n\n          /* check for roundness of segment */\n          if ( seg->flags & AF_EDGE_ROUND )\n            is_round++;\n          else\n            is_straight++;\n\n          /* check for links -- if seg->serif is set, then seg->link must */\n          /* be ignored                                                   */\n          is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge );\n\n          if ( seg->link || is_serif )\n          {\n            AF_Edge     edge2;\n            AF_Segment  seg2;\n\n\n            edge2 = edge->link;\n            seg2  = seg->link;\n\n            if ( is_serif )\n            {\n              seg2  = seg->serif;\n              edge2 = edge->serif;\n            }\n\n            if ( edge2 )\n            {\n              FT_Pos  edge_delta;\n              FT_Pos  seg_delta;\n\n\n              edge_delta = edge->fpos - edge2->fpos;\n              if ( edge_delta < 0 )\n                edge_delta = -edge_delta;\n\n              seg_delta = AF_SEGMENT_DIST( seg, seg2 );\n\n              if ( seg_delta < edge_delta )\n                edge2 = seg2->edge;\n            }\n            else\n              edge2 = seg2->edge;\n\n            if ( is_serif )\n            {\n              edge->serif   = edge2;\n              edge2->flags |= AF_EDGE_SERIF;\n            }\n            else\n              edge->link  = edge2;\n          }\n\n          seg = seg->edge_next;\n\n        } while ( seg != edge->first );\n\n        /* set the round/straight flags */\n        edge->flags = AF_EDGE_NORMAL;\n\n        if ( is_round > 0 && is_round >= is_straight )\n          edge->flags |= AF_EDGE_ROUND;\n\n        /* get rid of serifs if link is set                 */\n        /* XXX: This gets rid of many unpleasant artefacts! */\n        /*      Example: the `c' in cour.pfa at size 13     */\n\n        if ( edge->serif && edge->link )\n          edge->serif = 0;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  af_cjk_hints_detect_features( AF_GlyphHints  hints,\n                                AF_Dimension   dim )\n  {\n    FT_Error  error;\n\n\n    error = af_cjk_hints_compute_segments( hints, dim );\n    if ( !error )\n    {\n      af_cjk_hints_link_segments( hints, dim );\n\n      error = af_cjk_hints_compute_edges( hints, dim );\n    }\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_cjk_hints_compute_blue_edges( AF_GlyphHints  hints,\n                                   AF_CJKMetrics  metrics,\n                                   AF_Dimension   dim )\n  {\n    AF_AxisHints  axis       = &hints->axis[dim];\n    AF_Edge       edge       = axis->edges;\n    AF_Edge       edge_limit = edge + axis->num_edges;\n    AF_CJKAxis    cjk        = &metrics->axis[dim];\n    FT_Fixed      scale      = cjk->scale;\n    FT_Pos        best_dist0;  /* initial threshold */\n\n\n    /* compute the initial threshold as a fraction of the EM size */\n    best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale );\n\n    if ( best_dist0 > 64 / 2 ) /* maximum 1/2 pixel */\n      best_dist0 = 64 / 2;\n\n    /* compute which blue zones are active, i.e. have their scaled */\n    /* size < 3/4 pixels                                           */\n\n    /* If the distant between an edge and a blue zone is shorter than */\n    /* best_dist0, set the blue zone for the edge.  Then search for   */\n    /* the blue zone with the smallest best_dist to the edge.         */\n\n    for ( ; edge < edge_limit; edge++ )\n    {\n      FT_UInt   bb;\n      AF_Width  best_blue = NULL;\n      FT_Pos    best_dist = best_dist0;\n\n\n      for ( bb = 0; bb < cjk->blue_count; bb++ )\n      {\n        AF_CJKBlue  blue = cjk->blues + bb;\n        FT_Bool     is_top_right_blue, is_major_dir;\n\n\n        /* skip inactive blue zones (i.e., those that are too small) */\n        if ( !( blue->flags & AF_CJK_BLUE_ACTIVE ) )\n          continue;\n\n        /* if it is a top zone, check for right edges -- if it is a bottom */\n        /* zone, check for left edges                                      */\n        /*                                                                 */\n        /* of course, that's for TrueType                                  */\n        is_top_right_blue  =\n          FT_BOOL( ( ( blue->flags & AF_CJK_BLUE_IS_TOP )   != 0 ) ||\n                   ( ( blue->flags & AF_CJK_BLUE_IS_RIGHT ) != 0 ) );\n        is_major_dir = FT_BOOL( edge->dir == axis->major_dir );\n\n        /* if it is a top zone, the edge must be against the major    */\n        /* direction; if it is a bottom zone, it must be in the major */\n        /* direction                                                  */\n        if ( is_top_right_blue ^ is_major_dir )\n        {\n          FT_Pos    dist;\n          AF_Width  compare;\n\n\n          /* Compare the edge to the closest blue zone type */\n          if ( FT_ABS( edge->fpos - blue->ref.org ) >\n               FT_ABS( edge->fpos - blue->shoot.org ) )\n            compare = &blue->shoot;\n          else\n            compare = &blue->ref;\n\n          dist = edge->fpos - compare->org;\n          if ( dist < 0 )\n            dist = -dist;\n\n          dist = FT_MulFix( dist, scale );\n          if ( dist < best_dist )\n          {\n            best_dist = dist;\n            best_blue = compare;\n          }\n        }\n      }\n\n      if ( best_blue )\n        edge->blue_edge = best_blue;\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  af_cjk_hints_init( AF_GlyphHints  hints,\n                     AF_CJKMetrics  metrics )\n  {\n    FT_Render_Mode  mode;\n    FT_UInt32       scaler_flags, other_flags;\n\n\n    af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics );\n\n    /*\n     *  correct x_scale and y_scale when needed, since they may have\n     *  been modified af_cjk_scale_dim above\n     */\n    hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale;\n    hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta;\n    hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale;\n    hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta;\n\n    /* compute flags depending on render mode, etc. */\n    mode = metrics->root.scaler.render_mode;\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n    if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V )\n      metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL;\n#endif\n\n    scaler_flags = hints->scaler_flags;\n    other_flags  = 0;\n\n    /*\n     *  We snap the width of vertical stems for the monochrome and\n     *  horizontal LCD rendering targets only.\n     */\n    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD )\n      other_flags |= AF_LATIN_HINTS_HORZ_SNAP;\n\n    /*\n     *  We snap the width of horizontal stems for the monochrome and\n     *  vertical LCD rendering targets only.\n     */\n    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V )\n      other_flags |= AF_LATIN_HINTS_VERT_SNAP;\n\n    /*\n     *  We adjust stems to full pixels only if we don't use the `light' mode.\n     */\n    if ( mode != FT_RENDER_MODE_LIGHT )\n      other_flags |= AF_LATIN_HINTS_STEM_ADJUST;\n\n    if ( mode == FT_RENDER_MODE_MONO )\n      other_flags |= AF_LATIN_HINTS_MONO;\n\n    scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE;\n\n    hints->scaler_flags = scaler_flags;\n    hints->other_flags  = other_flags;\n\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****          C J K   G L Y P H   G R I D - F I T T I N G          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* snap a given width in scaled coordinates to one of the */\n  /* current standard widths                                */\n\n  static FT_Pos\n  af_cjk_snap_width( AF_Width  widths,\n                     FT_Int    count,\n                     FT_Pos    width )\n  {\n    int     n;\n    FT_Pos  best      = 64 + 32 + 2;\n    FT_Pos  reference = width;\n    FT_Pos  scaled;\n\n\n    for ( n = 0; n < count; n++ )\n    {\n      FT_Pos  w;\n      FT_Pos  dist;\n\n\n      w = widths[n].cur;\n      dist = width - w;\n      if ( dist < 0 )\n        dist = -dist;\n      if ( dist < best )\n      {\n        best      = dist;\n        reference = w;\n      }\n    }\n\n    scaled = FT_PIX_ROUND( reference );\n\n    if ( width >= reference )\n    {\n      if ( width < scaled + 48 )\n        width = reference;\n    }\n    else\n    {\n      if ( width > scaled - 48 )\n        width = reference;\n    }\n\n    return width;\n  }\n\n\n  /* compute the snapped width of a given stem */\n\n  static FT_Pos\n  af_cjk_compute_stem_width( AF_GlyphHints  hints,\n                             AF_Dimension   dim,\n                             FT_Pos         width,\n                             AF_Edge_Flags  base_flags,\n                             AF_Edge_Flags  stem_flags )\n  {\n    AF_CJKMetrics  metrics  = (AF_CJKMetrics) hints->metrics;\n    AF_CJKAxis     axis     = & metrics->axis[dim];\n    FT_Pos         dist     = width;\n    FT_Int         sign     = 0;\n    FT_Bool        vertical = FT_BOOL( dim == AF_DIMENSION_VERT );\n\n    FT_UNUSED( base_flags );\n    FT_UNUSED( stem_flags );\n\n\n    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) )\n      return width;\n\n    if ( dist < 0 )\n    {\n      dist = -width;\n      sign = 1;\n    }\n\n    if ( (  vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||\n         ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )\n    {\n      /* smooth hinting process: very lightly quantize the stem width */\n\n      if ( axis->width_count > 0 )\n      {\n        if ( FT_ABS( dist - axis->widths[0].cur ) < 40 )\n        {\n          dist = axis->widths[0].cur;\n          if ( dist < 48 )\n            dist = 48;\n\n          goto Done_Width;\n        }\n      }\n\n      if ( dist < 54 )\n        dist += ( 54 - dist ) / 2 ;\n      else if ( dist < 3 * 64 )\n      {\n        FT_Pos  delta;\n\n\n        delta  = dist & 63;\n        dist  &= -64;\n\n        if ( delta < 10 )\n          dist += delta;\n        else if ( delta < 22 )\n          dist += 10;\n        else if ( delta < 42 )\n          dist += delta;\n        else if ( delta < 54 )\n          dist += 54;\n        else\n          dist += delta;\n      }\n    }\n    else\n    {\n      /* strong hinting process: snap the stem width to integer pixels */\n\n      dist = af_cjk_snap_width( axis->widths, axis->width_count, dist );\n\n      if ( vertical )\n      {\n        /* in the case of vertical hinting, always round */\n        /* the stem heights to integer pixels            */\n\n        if ( dist >= 64 )\n          dist = ( dist + 16 ) & ~63;\n        else\n          dist = 64;\n      }\n      else\n      {\n        if ( AF_LATIN_HINTS_DO_MONO( hints ) )\n        {\n          /* monochrome horizontal hinting: snap widths to integer pixels */\n          /* with a different threshold                                   */\n\n          if ( dist < 64 )\n            dist = 64;\n          else\n            dist = ( dist + 32 ) & ~63;\n        }\n        else\n        {\n          /* for horizontal anti-aliased hinting, we adopt a more subtle */\n          /* approach: we strengthen small stems, round stems whose size */\n          /* is between 1 and 2 pixels to an integer, otherwise nothing  */\n\n          if ( dist < 48 )\n            dist = ( dist + 64 ) >> 1;\n\n          else if ( dist < 128 )\n            dist = ( dist + 22 ) & ~63;\n          else\n            /* round otherwise to prevent color fringes in LCD mode */\n            dist = ( dist + 32 ) & ~63;\n        }\n      }\n    }\n\n  Done_Width:\n    if ( sign )\n      dist = -dist;\n\n    return dist;\n  }\n\n\n  /* align one stem edge relative to the previous stem edge */\n\n  static void\n  af_cjk_align_linked_edge( AF_GlyphHints  hints,\n                            AF_Dimension   dim,\n                            AF_Edge        base_edge,\n                            AF_Edge        stem_edge )\n  {\n    FT_Pos  dist = stem_edge->opos - base_edge->opos;\n\n    FT_Pos  fitted_width = af_cjk_compute_stem_width(\n                             hints, dim, dist,\n                             (AF_Edge_Flags)base_edge->flags,\n                             (AF_Edge_Flags)stem_edge->flags );\n\n\n    stem_edge->pos = base_edge->pos + fitted_width;\n  }\n\n\n  static void\n  af_cjk_align_serif_edge( AF_GlyphHints  hints,\n                           AF_Edge        base,\n                           AF_Edge        serif )\n  {\n    FT_UNUSED( hints );\n\n    serif->pos = base->pos + ( serif->opos - base->opos );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                    E D G E   H I N T I N G                      ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#define AF_LIGHT_MODE_MAX_HORZ_GAP    9\n#define AF_LIGHT_MODE_MAX_VERT_GAP   15\n#define AF_LIGHT_MODE_MAX_DELTA_ABS  14\n\n\n  static FT_Pos\n  af_hint_normal_stem( AF_GlyphHints  hints,\n                       AF_Edge        edge,\n                       AF_Edge        edge2,\n                       FT_Pos         anchor,\n                       AF_Dimension   dim )\n  {\n    FT_Pos  org_len, cur_len, org_center;\n    FT_Pos  cur_pos1, cur_pos2;\n    FT_Pos  d_off1, u_off1, d_off2, u_off2, delta;\n    FT_Pos  offset;\n    FT_Pos  threshold = 64;\n\n\n    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) )\n    {\n      if ( ( edge->flags  & AF_EDGE_ROUND ) &&\n           ( edge2->flags & AF_EDGE_ROUND ) )\n      {\n        if ( dim == AF_DIMENSION_VERT )\n          threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP;\n        else\n          threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP;\n      }\n      else\n      {\n        if ( dim == AF_DIMENSION_VERT )\n          threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3;\n        else\n          threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3;\n      }\n    }\n\n    org_len    = edge2->opos - edge->opos;\n    cur_len    = af_cjk_compute_stem_width( hints, dim, org_len,\n                                            (AF_Edge_Flags)edge->flags,\n                                            (AF_Edge_Flags)edge2->flags );\n\n    org_center = ( edge->opos + edge2->opos ) / 2 + anchor;\n    cur_pos1   = org_center - cur_len / 2;\n    cur_pos2   = cur_pos1 + cur_len;\n    d_off1     = cur_pos1 - FT_PIX_FLOOR( cur_pos1 );\n    d_off2     = cur_pos2 - FT_PIX_FLOOR( cur_pos2 );\n    u_off1     = 64 - d_off1;\n    u_off2     = 64 - d_off2;\n    delta      = 0;\n\n\n    if ( d_off1 == 0 || d_off2 == 0 )\n      goto Exit;\n\n    if ( cur_len <= threshold )\n    {\n      if ( d_off2 < cur_len )\n      {\n        if ( u_off1 <= d_off2 )\n          delta =  u_off1;\n        else\n          delta = -d_off2;\n      }\n\n      goto Exit;\n    }\n\n    if ( threshold < 64 )\n    {\n      if ( d_off1 >= threshold || u_off1 >= threshold ||\n           d_off2 >= threshold || u_off2 >= threshold )\n        goto Exit;\n    }\n\n    offset = cur_len & 63;\n\n    if ( offset < 32 )\n    {\n      if ( u_off1 <= offset || d_off2 <= offset )\n        goto Exit;\n    }\n    else\n      offset = 64 - threshold;\n\n    d_off1 = threshold - u_off1;\n    u_off1 = u_off1    - offset;\n    u_off2 = threshold - d_off2;\n    d_off2 = d_off2    - offset;\n\n    if ( d_off1 <= u_off1 )\n      u_off1 = -d_off1;\n\n    if ( d_off2 <= u_off2 )\n      u_off2 = -d_off2;\n\n    if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) )\n      delta = u_off1;\n    else\n      delta = u_off2;\n\n  Exit:\n\n#if 1\n    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) )\n    {\n      if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS )\n        delta = AF_LIGHT_MODE_MAX_DELTA_ABS;\n      else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS )\n        delta = -AF_LIGHT_MODE_MAX_DELTA_ABS;\n    }\n#endif\n\n    cur_pos1 += delta;\n\n    if ( edge->opos < edge2->opos )\n    {\n      edge->pos  = cur_pos1;\n      edge2->pos = cur_pos1 + cur_len;\n    }\n    else\n    {\n      edge->pos  = cur_pos1 + cur_len;\n      edge2->pos = cur_pos1;\n    }\n\n    return delta;\n  }\n\n\n  static void\n  af_cjk_hint_edges( AF_GlyphHints  hints,\n                     AF_Dimension   dim )\n  {\n    AF_AxisHints  axis       = &hints->axis[dim];\n    AF_Edge       edges      = axis->edges;\n    AF_Edge       edge_limit = edges + axis->num_edges;\n    FT_PtrDist    n_edges;\n    AF_Edge       edge;\n    AF_Edge       anchor   = 0;\n    FT_Pos        delta    = 0;\n    FT_Int        skipped  = 0;\n    FT_Bool       has_last_stem = FALSE;\n    FT_Pos        last_stem_pos = 0;\n\n\n    /* we begin by aligning all stems relative to the blue zone */\n    FT_TRACE5(( \"==== cjk hinting %s edges =====\\n\",\n          dim == AF_DIMENSION_HORZ ? \"vertical\" : \"horizontal\" ));\n\n    if ( AF_HINTS_DO_BLUES( hints ) )\n    {\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        AF_Width  blue;\n        AF_Edge   edge1, edge2;\n\n\n        if ( edge->flags & AF_EDGE_DONE )\n          continue;\n\n        blue  = edge->blue_edge;\n        edge1 = NULL;\n        edge2 = edge->link;\n\n        if ( blue )\n        {\n          edge1 = edge;\n        }\n        else if ( edge2 && edge2->blue_edge )\n        {\n          blue  = edge2->blue_edge;\n          edge1 = edge2;\n          edge2 = edge;\n        }\n\n        if ( !edge1 )\n          continue;\n\n        FT_TRACE5(( \"CJKBLUE: edge %d @%d (opos=%.2f) snapped to (%.2f), \"\n                 \"was (%.2f)\\n\",\n                 edge1-edges, edge1->fpos, edge1->opos / 64.0, blue->fit / 64.0,\n                 edge1->pos / 64.0 ));\n\n        edge1->pos    = blue->fit;\n        edge1->flags |= AF_EDGE_DONE;\n\n        if ( edge2 && !edge2->blue_edge )\n        {\n          af_cjk_align_linked_edge( hints, dim, edge1, edge2 );\n          edge2->flags |= AF_EDGE_DONE;\n        }\n\n        if ( !anchor )\n          anchor = edge;\n      }\n    }\n\n    /* now we align all stem edges. */\n    for ( edge = edges; edge < edge_limit; edge++ )\n    {\n      AF_Edge  edge2;\n\n\n      if ( edge->flags & AF_EDGE_DONE )\n        continue;\n\n      /* skip all non-stem edges */\n      edge2 = edge->link;\n      if ( !edge2 )\n      {\n        skipped++;\n        continue;\n      }\n\n      /* Some CJK characters have so many stems that\n       * the hinter is likely to merge two adjacent ones.\n       * To solve this problem, if either edge of a stem\n       * is too close to the previous one, we avoid\n       * aligning the two edges, but rather interpolate\n       * their locations at the end of this function in\n       * order to preserve the space between the stems.\n       */\n      if ( has_last_stem                       &&\n           ( edge->pos  < last_stem_pos + 64 ||\n             edge2->pos < last_stem_pos + 64 ) )\n      {\n        skipped++;\n        continue;\n      }\n\n      /* now align the stem */\n      /* this should not happen, but it's better to be safe */\n      if ( edge2->blue_edge )\n      {\n        FT_TRACE5(( \"ASSERTION FAILED for edge %d\\n\", edge2-edges ));\n\n        af_cjk_align_linked_edge( hints, dim, edge2, edge );\n        edge->flags |= AF_EDGE_DONE;\n        continue;\n      }\n\n      if ( edge2 < edge )\n      {\n        af_cjk_align_linked_edge( hints, dim, edge2, edge );\n        edge->flags |= AF_EDGE_DONE;\n        /* We rarely reaches here it seems;\n         * usually the two edges belonging\n         * to one stem are marked as DONE together\n         */\n        has_last_stem = TRUE;\n        last_stem_pos = edge->pos;\n        continue;\n      }\n\n      if ( dim != AF_DIMENSION_VERT && !anchor )\n      {\n\n#if 0\n        if ( fixedpitch )\n        {\n          AF_Edge     left  = edge;\n          AF_Edge     right = edge_limit - 1;\n          AF_EdgeRec  left1, left2, right1, right2;\n          FT_Pos      target, center1, center2;\n          FT_Pos      delta1, delta2, d1, d2;\n\n\n          while ( right > left && !right->link )\n            right--;\n\n          left1  = *left;\n          left2  = *left->link;\n          right1 = *right->link;\n          right2 = *right;\n\n          delta  = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2;\n          target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16;\n\n          delta1  = delta;\n          delta1 += af_hint_normal_stem( hints, left, left->link,\n                                         delta1, 0 );\n\n          if ( left->link != right )\n            af_hint_normal_stem( hints, right->link, right, delta1, 0 );\n\n          center1 = left->pos + ( right->pos - left->pos ) / 2;\n\n          if ( center1 >= target )\n            delta2 = delta - 32;\n          else\n            delta2 = delta + 32;\n\n          delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 );\n\n          if ( delta1 != delta2 )\n          {\n            if ( left->link != right )\n              af_hint_normal_stem( hints, &right1, &right2, delta2, 0 );\n\n            center2 = left1.pos + ( right2.pos - left1.pos ) / 2;\n\n            d1 = center1 - target;\n            d2 = center2 - target;\n\n            if ( FT_ABS( d2 ) < FT_ABS( d1 ) )\n            {\n              left->pos       = left1.pos;\n              left->link->pos = left2.pos;\n\n              if ( left->link != right )\n              {\n                right->link->pos = right1.pos;\n                right->pos       = right2.pos;\n              }\n\n              delta1 = delta2;\n            }\n          }\n\n          delta               = delta1;\n          right->link->flags |= AF_EDGE_DONE;\n          right->flags       |= AF_EDGE_DONE;\n        }\n        else\n\n#endif /* 0 */\n\n          delta = af_hint_normal_stem( hints, edge, edge2, 0,\n                                       AF_DIMENSION_HORZ );\n      }\n      else\n        af_hint_normal_stem( hints, edge, edge2, delta, dim );\n\n#if 0\n      printf( \"stem (%d,%d) adjusted (%.1f,%.1f)\\n\",\n               edge - edges, edge2 - edges,\n               ( edge->pos - edge->opos ) / 64.0,\n               ( edge2->pos - edge2->opos ) / 64.0 );\n#endif\n\n      anchor = edge;\n      edge->flags  |= AF_EDGE_DONE;\n      edge2->flags |= AF_EDGE_DONE;\n      has_last_stem = TRUE;\n      last_stem_pos = edge2->pos;\n    }\n\n    /* make sure that lowercase m's maintain their symmetry */\n\n    /* In general, lowercase m's have six vertical edges if they are sans */\n    /* serif, or twelve if they are with serifs.  This implementation is  */\n    /* based on that assumption, and seems to work very well with most    */\n    /* faces.  However, if for a certain face this assumption is not      */\n    /* true, the m is just rendered like before.  In addition, any stem   */\n    /* correction will only be applied to symmetrical glyphs (even if the */\n    /* glyph is not an m), so the potential for unwanted distortion is    */\n    /* relatively low.                                                    */\n\n    /* We don't handle horizontal edges since we can't easily assure that */\n    /* the third (lowest) stem aligns with the base line; it might end up */\n    /* one pixel higher or lower.                                         */\n\n    n_edges = edge_limit - edges;\n    if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) )\n    {\n      AF_Edge  edge1, edge2, edge3;\n      FT_Pos   dist1, dist2, span;\n\n\n      if ( n_edges == 6 )\n      {\n        edge1 = edges;\n        edge2 = edges + 2;\n        edge3 = edges + 4;\n      }\n      else\n      {\n        edge1 = edges + 1;\n        edge2 = edges + 5;\n        edge3 = edges + 9;\n      }\n\n      dist1 = edge2->opos - edge1->opos;\n      dist2 = edge3->opos - edge2->opos;\n\n      span = dist1 - dist2;\n      if ( span < 0 )\n        span = -span;\n\n      if ( edge1->link == edge1 + 1 &&\n           edge2->link == edge2 + 1 &&\n           edge3->link == edge3 + 1 && span < 8 )\n      {\n        delta = edge3->pos - ( 2 * edge2->pos - edge1->pos );\n        edge3->pos -= delta;\n        if ( edge3->link )\n          edge3->link->pos -= delta;\n\n        /* move the serifs along with the stem */\n        if ( n_edges == 12 )\n        {\n          ( edges + 8 )->pos -= delta;\n          ( edges + 11 )->pos -= delta;\n        }\n\n        edge3->flags |= AF_EDGE_DONE;\n        if ( edge3->link )\n          edge3->link->flags |= AF_EDGE_DONE;\n      }\n    }\n\n    if ( !skipped )\n      return;\n\n    /*\n     *  now hint the remaining edges (serifs and single) in order\n     *  to complete our processing\n     */\n    for ( edge = edges; edge < edge_limit; edge++ )\n    {\n      if ( edge->flags & AF_EDGE_DONE )\n        continue;\n\n      if ( edge->serif )\n      {\n        af_cjk_align_serif_edge( hints, edge->serif, edge );\n        edge->flags |= AF_EDGE_DONE;\n        skipped--;\n      }\n    }\n\n    if ( !skipped )\n      return;\n\n    for ( edge = edges; edge < edge_limit; edge++ )\n    {\n      AF_Edge  before, after;\n\n\n      if ( edge->flags & AF_EDGE_DONE )\n        continue;\n\n      before = after = edge;\n\n      while ( --before >= edges )\n        if ( before->flags & AF_EDGE_DONE )\n          break;\n\n      while ( ++after < edge_limit )\n        if ( after->flags & AF_EDGE_DONE )\n          break;\n\n      if ( before >= edges || after < edge_limit )\n      {\n        if ( before < edges )\n          af_cjk_align_serif_edge( hints, after, edge );\n        else if ( after >= edge_limit )\n          af_cjk_align_serif_edge( hints, before, edge );\n        else\n        {\n          if ( after->fpos == before->fpos )\n            edge->pos = before->pos;\n          else\n            edge->pos = before->pos +\n                        FT_MulDiv( edge->fpos - before->fpos,\n                                   after->pos - before->pos,\n                                   after->fpos - before->fpos );\n        }\n      }\n    }\n  }\n\n\n  static void\n  af_cjk_align_edge_points( AF_GlyphHints  hints,\n                            AF_Dimension   dim )\n  {\n    AF_AxisHints  axis       = & hints->axis[dim];\n    AF_Edge       edges      = axis->edges;\n    AF_Edge       edge_limit = edges + axis->num_edges;\n    AF_Edge       edge;\n    FT_Bool       snapping;\n\n\n    snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ             &&\n                          AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) )  ||\n                        ( dim == AF_DIMENSION_VERT             &&\n                          AF_LATIN_HINTS_DO_VERT_SNAP( hints ) )  );\n\n    for ( edge = edges; edge < edge_limit; edge++ )\n    {\n      /* move the points of each segment     */\n      /* in each edge to the edge's position */\n      AF_Segment  seg = edge->first;\n\n\n      if ( snapping )\n      {\n        do\n        {\n          AF_Point  point = seg->first;\n\n\n          for (;;)\n          {\n            if ( dim == AF_DIMENSION_HORZ )\n            {\n              point->x      = edge->pos;\n              point->flags |= AF_FLAG_TOUCH_X;\n            }\n            else\n            {\n              point->y      = edge->pos;\n              point->flags |= AF_FLAG_TOUCH_Y;\n            }\n\n            if ( point == seg->last )\n              break;\n\n            point = point->next;\n          }\n\n          seg = seg->edge_next;\n\n        } while ( seg != edge->first );\n      }\n      else\n      {\n        FT_Pos  delta = edge->pos - edge->opos;\n\n\n        do\n        {\n          AF_Point  point = seg->first;\n\n\n          for (;;)\n          {\n            if ( dim == AF_DIMENSION_HORZ )\n            {\n              point->x     += delta;\n              point->flags |= AF_FLAG_TOUCH_X;\n            }\n            else\n            {\n              point->y     += delta;\n              point->flags |= AF_FLAG_TOUCH_Y;\n            }\n\n            if ( point == seg->last )\n              break;\n\n            point = point->next;\n          }\n\n          seg = seg->edge_next;\n\n        } while ( seg != edge->first );\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  af_cjk_hints_apply( AF_GlyphHints  hints,\n                      FT_Outline*    outline,\n                      AF_CJKMetrics  metrics )\n  {\n    FT_Error  error;\n    int       dim;\n\n    FT_UNUSED( metrics );\n\n\n    error = af_glyph_hints_reload( hints, outline );\n    if ( error )\n      goto Exit;\n\n    /* analyze glyph outline */\n    if ( AF_HINTS_DO_HORIZONTAL( hints ) )\n    {\n      error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ );\n      if ( error )\n        goto Exit;\n\n      af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_HORZ );\n    }\n\n    if ( AF_HINTS_DO_VERTICAL( hints ) )\n    {\n      error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT );\n      if ( error )\n        goto Exit;\n\n      af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_VERT );\n    }\n\n    /* grid-fit the outline */\n    for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n    {\n      if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) ||\n           ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) )   )\n      {\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n        if ( dim == AF_DIMENSION_HORZ                                  &&\n             metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL )\n        {\n          AF_WarperRec  warper;\n          FT_Fixed      scale;\n          FT_Pos        delta;\n\n\n          af_warper_compute( &warper, hints, (AF_Dimension)dim,\n                             &scale, &delta );\n          af_glyph_hints_scale_dim( hints, (AF_Dimension)dim,\n                                    scale, delta );\n          continue;\n        }\n#endif /* AF_CONFIG_OPTION_USE_WARPER */\n\n        af_cjk_hint_edges( hints, (AF_Dimension)dim );\n        af_cjk_align_edge_points( hints, (AF_Dimension)dim );\n        af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim );\n        af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim );\n      }\n    }\n\n#if 0\n    af_glyph_hints_dump_points( hints );\n    af_glyph_hints_dump_segments( hints );\n    af_glyph_hints_dump_edges( hints );\n#endif\n\n    af_glyph_hints_save( hints, outline );\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                C J K   S C R I P T   C L A S S                *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* this corresponds to Unicode 6.0 */\n\n  static const AF_Script_UniRangeRec  af_cjk_uniranges[] =\n  {\n    AF_UNIRANGE_REC(  0x1100UL,  0x11FFUL ),  /* Hangul Jamo                             */\n    AF_UNIRANGE_REC(  0x2E80UL,  0x2EFFUL ),  /* CJK Radicals Supplement                 */\n    AF_UNIRANGE_REC(  0x2F00UL,  0x2FDFUL ),  /* Kangxi Radicals                         */\n    AF_UNIRANGE_REC(  0x2FF0UL,  0x2FFFUL ),  /* Ideographic Description Characters      */\n    AF_UNIRANGE_REC(  0x3000UL,  0x303FUL ),  /* CJK Symbols and Punctuation             */\n    AF_UNIRANGE_REC(  0x3040UL,  0x309FUL ),  /* Hiragana                                */\n    AF_UNIRANGE_REC(  0x30A0UL,  0x30FFUL ),  /* Katakana                                */\n    AF_UNIRANGE_REC(  0x3100UL,  0x312FUL ),  /* Bopomofo                                */\n    AF_UNIRANGE_REC(  0x3130UL,  0x318FUL ),  /* Hangul Compatibility Jamo               */\n    AF_UNIRANGE_REC(  0x3190UL,  0x319FUL ),  /* Kanbun                                  */\n    AF_UNIRANGE_REC(  0x31A0UL,  0x31BFUL ),  /* Bopomofo Extended                       */\n    AF_UNIRANGE_REC(  0x31C0UL,  0x31EFUL ),  /* CJK Strokes                             */\n    AF_UNIRANGE_REC(  0x31F0UL,  0x31FFUL ),  /* Katakana Phonetic Extensions            */\n    AF_UNIRANGE_REC(  0x3200UL,  0x32FFUL ),  /* Enclosed CJK Letters and Months         */\n    AF_UNIRANGE_REC(  0x3300UL,  0x33FFUL ),  /* CJK Compatibility                       */\n    AF_UNIRANGE_REC(  0x3400UL,  0x4DBFUL ),  /* CJK Unified Ideographs Extension A      */\n    AF_UNIRANGE_REC(  0x4DC0UL,  0x4DFFUL ),  /* Yijing Hexagram Symbols                 */\n    AF_UNIRANGE_REC(  0x4E00UL,  0x9FFFUL ),  /* CJK Unified Ideographs                  */\n    AF_UNIRANGE_REC(  0xA960UL,  0xA97FUL ),  /* Hangul Jamo Extended-A                  */\n    AF_UNIRANGE_REC(  0xAC00UL,  0xD7AFUL ),  /* Hangul Syllables                        */\n    AF_UNIRANGE_REC(  0xD7B0UL,  0xD7FFUL ),  /* Hangul Jamo Extended-B                  */\n    AF_UNIRANGE_REC(  0xF900UL,  0xFAFFUL ),  /* CJK Compatibility Ideographs            */\n    AF_UNIRANGE_REC(  0xFE10UL,  0xFE1FUL ),  /* Vertical forms                          */\n    AF_UNIRANGE_REC(  0xFE30UL,  0xFE4FUL ),  /* CJK Compatibility Forms                 */\n    AF_UNIRANGE_REC(  0xFF00UL,  0xFFEFUL ),  /* Halfwidth and Fullwidth Forms           */\n    AF_UNIRANGE_REC( 0x1B000UL, 0x1B0FFUL ),  /* Kana Supplement                         */\n    AF_UNIRANGE_REC( 0x1D300UL, 0x1D35FUL ),  /* Tai Xuan Hing Symbols                   */\n    AF_UNIRANGE_REC( 0x1F200UL, 0x1F2FFUL ),  /* Enclosed Ideographic Supplement         */\n    AF_UNIRANGE_REC( 0x20000UL, 0x2A6DFUL ),  /* CJK Unified Ideographs Extension B      */\n    AF_UNIRANGE_REC( 0x2A700UL, 0x2B73FUL ),  /* CJK Unified Ideographs Extension C      */\n    AF_UNIRANGE_REC( 0x2B740UL, 0x2B81FUL ),  /* CJK Unified Ideographs Extension D      */\n    AF_UNIRANGE_REC( 0x2F800UL, 0x2FA1FUL ),  /* CJK Compatibility Ideographs Supplement */\n    AF_UNIRANGE_REC(       0UL,       0UL )\n  };\n\n\n  AF_DEFINE_SCRIPT_CLASS( af_cjk_script_class,\n    AF_SCRIPT_CJK,\n    af_cjk_uniranges,\n    0x7530, /* 田 */\n\n    sizeof ( AF_CJKMetricsRec ),\n\n    (AF_Script_InitMetricsFunc) af_cjk_metrics_init,\n    (AF_Script_ScaleMetricsFunc)af_cjk_metrics_scale,\n    (AF_Script_DoneMetricsFunc) NULL,\n\n    (AF_Script_InitHintsFunc)   af_cjk_hints_init,\n    (AF_Script_ApplyHintsFunc)  af_cjk_hints_apply\n  )\n\n#else /* !AF_CONFIG_OPTION_CJK */\n\n  static const AF_Script_UniRangeRec  af_cjk_uniranges[] =\n  {\n    AF_UNIRANGE_REC( 0UL, 0UL )\n  };\n\n\n  AF_DEFINE_SCRIPT_CLASS( af_cjk_script_class,\n    AF_SCRIPT_CJK,\n    af_cjk_uniranges,\n    0,\n\n    sizeof ( AF_CJKMetricsRec ),\n\n    (AF_Script_InitMetricsFunc) NULL,\n    (AF_Script_ScaleMetricsFunc)NULL,\n    (AF_Script_DoneMetricsFunc) NULL,\n\n    (AF_Script_InitHintsFunc)   NULL,\n    (AF_Script_ApplyHintsFunc)  NULL\n  )\n\n#endif /* !AF_CONFIG_OPTION_CJK */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afcjk.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afcjk.h                                                                */\n/*                                                                         */\n/*    Auto-fitter hinting routines for CJK script (specification).         */\n/*                                                                         */\n/*  Copyright 2006, 2007, 2011, 2012 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFCJK_H__\n#define __AFCJK_H__\n\n#include \"afhints.h\"\n#include \"aflatin.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* the CJK-specific script class */\n\n  AF_DECLARE_SCRIPT_CLASS( af_cjk_script_class )\n\n  /* CJK (global) metrics management */\n\n  /*\n   *  CJK glyphs tend to fill the square.  So we have both vertical and\n   *  horizontal blue zones.  But some glyphs have flat bounding strokes that\n   *  leave some space between neighbour glyphs.\n   */\n  enum\n  {\n    AF_CJK_BLUE_TOP,\n    AF_CJK_BLUE_BOTTOM,\n    AF_CJK_BLUE_LEFT,\n    AF_CJK_BLUE_RIGHT,\n\n    AF_CJK_BLUE_MAX\n  };\n\n\n#define AF_CJK_MAX_WIDTHS  16\n#define AF_CJK_MAX_BLUES   AF_CJK_BLUE_MAX\n\n\n  enum\n  {\n    AF_CJK_BLUE_ACTIVE     = 1 << 0,\n    AF_CJK_BLUE_IS_TOP     = 1 << 1,\n    AF_CJK_BLUE_IS_RIGHT   = 1 << 2,\n    AF_CJK_BLUE_ADJUSTMENT = 1 << 3,  /* used for scale adjustment */\n                                      /* optimization              */\n    AF_CJK_BLUE_FLAG_MAX\n  };\n\n\n  typedef struct  AF_CJKBlueRec_\n  {\n    AF_WidthRec  ref;\n    AF_WidthRec  shoot; /* undershoot */\n    FT_UInt      flags;\n\n  } AF_CJKBlueRec, *AF_CJKBlue;\n\n\n  typedef struct  AF_CJKAxisRec_\n  {\n    FT_Fixed       scale;\n    FT_Pos         delta;\n\n    FT_UInt        width_count;\n    AF_WidthRec    widths[AF_CJK_MAX_WIDTHS];\n    FT_Pos         edge_distance_threshold;\n    FT_Pos         standard_width;\n    FT_Bool        extra_light;\n\n    /* used for horizontal metrics too for CJK */\n    FT_Bool        control_overshoot;\n    FT_UInt        blue_count;\n    AF_CJKBlueRec  blues[AF_CJK_BLUE_MAX];\n\n    FT_Fixed       org_scale;\n    FT_Pos         org_delta;\n\n  } AF_CJKAxisRec, *AF_CJKAxis;\n\n\n  typedef struct  AF_CJKMetricsRec_\n  {\n    AF_ScriptMetricsRec  root;\n    FT_UInt              units_per_em;\n    AF_CJKAxisRec        axis[AF_DIMENSION_MAX];\n\n  } AF_CJKMetricsRec, *AF_CJKMetrics;\n\n\n#ifdef AF_CONFIG_OPTION_CJK\n  FT_LOCAL( FT_Error )\n  af_cjk_metrics_init( AF_CJKMetrics  metrics,\n                       FT_Face        face );\n\n  FT_LOCAL( void )\n  af_cjk_metrics_scale( AF_CJKMetrics  metrics,\n                        AF_Scaler      scaler );\n\n  FT_LOCAL( FT_Error )\n  af_cjk_hints_init( AF_GlyphHints  hints,\n                     AF_CJKMetrics  metrics );\n\n  FT_LOCAL( FT_Error )\n  af_cjk_hints_apply( AF_GlyphHints  hints,\n                      FT_Outline*    outline,\n                      AF_CJKMetrics  metrics );\n\n  /* shared; called from afindic.c */\n  FT_LOCAL( void )\n  af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,\n                               FT_Face        face );\n\n  FT_LOCAL( void )\n  af_cjk_metrics_init_widths( AF_CJKMetrics  metrics,\n                              FT_Face        face );\n#endif /* AF_CONFIG_OPTION_CJK */\n\n\n/* */\n\nFT_END_HEADER\n\n#endif /* __AFCJK_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afdummy.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afdummy.c                                                              */\n/*                                                                         */\n/*    Auto-fitter dummy routines to be used if no hinting should be        */\n/*    performed (body).                                                    */\n/*                                                                         */\n/*  Copyright 2003-2005, 2011, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"afdummy.h\"\n#include \"afhints.h\"\n#include \"aferrors.h\"\n\n\n  static FT_Error\n  af_dummy_hints_init( AF_GlyphHints     hints,\n                       AF_ScriptMetrics  metrics )\n  {\n    af_glyph_hints_rescale( hints,\n                            metrics );\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  af_dummy_hints_apply( AF_GlyphHints  hints,\n                        FT_Outline*    outline )\n  {\n    FT_UNUSED( hints );\n    FT_UNUSED( outline );\n\n    return FT_Err_Ok;\n  }\n\n\n  AF_DEFINE_SCRIPT_CLASS( af_dummy_script_class,\n    AF_SCRIPT_DUMMY,\n    NULL,\n    0,\n\n    sizeof ( AF_ScriptMetricsRec ),\n\n    (AF_Script_InitMetricsFunc) NULL,\n    (AF_Script_ScaleMetricsFunc)NULL,\n    (AF_Script_DoneMetricsFunc) NULL,\n\n    (AF_Script_InitHintsFunc)   af_dummy_hints_init,\n    (AF_Script_ApplyHintsFunc)  af_dummy_hints_apply\n  )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afdummy.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afdummy.h                                                              */\n/*                                                                         */\n/*    Auto-fitter dummy routines to be used if no hinting should be        */\n/*    performed (specification).                                           */\n/*                                                                         */\n/*  Copyright 2003-2005, 2011 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFDUMMY_H__\n#define __AFDUMMY_H__\n\n#include \"aftypes.h\"\n\n\nFT_BEGIN_HEADER\n\n /*  A dummy script metrics class used when no hinting should\n  *  be performed.  This is the default for non-latin glyphs!\n  */\n\n  AF_DECLARE_SCRIPT_CLASS( af_dummy_script_class )\n\n/* */\n\nFT_END_HEADER\n\n\n#endif /* __AFDUMMY_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/aferrors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  aferrors.h                                                             */\n/*                                                                         */\n/*    Autofitter error codes (specification only).                         */\n/*                                                                         */\n/*  Copyright 2005, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the Autofitter error enumeration          */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __AFERRORS_H__\n#define __AFERRORS_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  AF_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Autofit\n\n#include FT_ERRORS_H\n\n#endif /* __AFERRORS_H__ */\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afglobal.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afglobal.c                                                             */\n/*                                                                         */\n/*    Auto-fitter routines to compute global hinting values (body).        */\n/*                                                                         */\n/*  Copyright 2003-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"afglobal.h\"\n#include \"afdummy.h\"\n#include \"aflatin.h\"\n#include \"afcjk.h\"\n#include \"afindic.h\"\n#include \"afpic.h\"\n\n#include \"aferrors.h\"\n\n#ifdef FT_OPTION_AUTOFIT2\n#include \"aflatin2.h\"\n#endif\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n  /* when updating this table, don't forget to update          */\n  /* AF_SCRIPT_CLASSES_COUNT and autofit_module_class_pic_init */\n\n  /* populate this list when you add new scripts */\n  static AF_ScriptClass const  af_script_classes[] =\n  {\n    &af_dummy_script_class,\n#ifdef FT_OPTION_AUTOFIT2\n    &af_latin2_script_class,\n#endif\n    &af_latin_script_class,\n    &af_cjk_script_class,\n    &af_indic_script_class,\n    NULL  /* do not remove */\n  };\n\n#endif /* !FT_CONFIG_OPTION_PIC */\n\n\n  /* Compute the script index of each glyph within a given face. */\n\n  static FT_Error\n  af_face_globals_compute_script_coverage( AF_FaceGlobals  globals )\n  {\n    FT_Error    error       = FT_Err_Ok;\n    FT_Face     face        = globals->face;\n    FT_CharMap  old_charmap = face->charmap;\n    FT_Byte*    gscripts    = globals->glyph_scripts;\n    FT_UInt     ss;\n    FT_UInt     i;\n\n\n    /* the value AF_SCRIPT_NONE means `uncovered glyph' */\n    FT_MEM_SET( globals->glyph_scripts,\n                AF_SCRIPT_NONE,\n                globals->glyph_count );\n\n    error = FT_Select_Charmap( face, FT_ENCODING_UNICODE );\n    if ( error )\n    {\n     /*\n      *  Ignore this error; we simply use the fallback script.\n      *  XXX: Shouldn't we rather disable hinting?\n      */\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    /* scan each script in a Unicode charmap */\n    for ( ss = 0; AF_SCRIPT_CLASSES_GET[ss]; ss++ )\n    {\n      AF_ScriptClass      clazz = AF_SCRIPT_CLASSES_GET[ss];\n      AF_Script_UniRange  range;\n\n\n      if ( clazz->script_uni_ranges == NULL )\n        continue;\n\n      /*\n       *  Scan all Unicode points in the range and set the corresponding\n       *  glyph script index.\n       */\n      for ( range = clazz->script_uni_ranges; range->first != 0; range++ )\n      {\n        FT_ULong  charcode = range->first;\n        FT_UInt   gindex;\n\n\n        gindex = FT_Get_Char_Index( face, charcode );\n\n        if ( gindex != 0                             &&\n             gindex < (FT_ULong)globals->glyph_count &&\n             gscripts[gindex] == AF_SCRIPT_NONE )\n          gscripts[gindex] = (FT_Byte)ss;\n\n        for (;;)\n        {\n          charcode = FT_Get_Next_Char( face, charcode, &gindex );\n\n          if ( gindex == 0 || charcode > range->last )\n            break;\n\n          if ( gindex < (FT_ULong)globals->glyph_count &&\n               gscripts[gindex] == AF_SCRIPT_NONE )\n            gscripts[gindex] = (FT_Byte)ss;\n        }\n      }\n    }\n\n    /* mark ASCII digits */\n    for ( i = 0x30; i <= 0x39; i++ )\n    {\n      FT_UInt  gindex = FT_Get_Char_Index( face, i );\n\n\n      if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count )\n        gscripts[gindex] |= AF_DIGIT;\n    }\n\n  Exit:\n    /*\n     *  By default, all uncovered glyphs are set to the fallback script.\n     *  XXX: Shouldn't we disable hinting or do something similar?\n     */\n    if ( globals->module->fallback_script != AF_SCRIPT_NONE )\n    {\n      FT_Long  nn;\n\n\n      for ( nn = 0; nn < globals->glyph_count; nn++ )\n      {\n        if ( ( gscripts[nn] & ~AF_DIGIT ) == AF_SCRIPT_NONE )\n        {\n          gscripts[nn] &= ~AF_SCRIPT_NONE;\n          gscripts[nn] |= globals->module->fallback_script;\n        }\n      }\n    }\n\n    FT_Set_Charmap( face, old_charmap );\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  af_face_globals_new( FT_Face          face,\n                       AF_FaceGlobals  *aglobals,\n                       AF_Module        module )\n  {\n    FT_Error        error;\n    FT_Memory       memory;\n    AF_FaceGlobals  globals = NULL;\n\n\n    memory = face->memory;\n\n    if ( FT_ALLOC( globals, sizeof ( *globals ) +\n                            face->num_glyphs * sizeof ( FT_Byte ) ) )\n      goto Exit;\n\n    globals->face          = face;\n    globals->glyph_count   = face->num_glyphs;\n    globals->glyph_scripts = (FT_Byte*)( globals + 1 );\n    globals->module        = module;\n\n    error = af_face_globals_compute_script_coverage( globals );\n    if ( error )\n    {\n      af_face_globals_free( globals );\n      globals = NULL;\n    }\n\n    globals->increase_x_height = AF_PROP_INCREASE_X_HEIGHT_MAX;\n\n  Exit:\n    *aglobals = globals;\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_face_globals_free( AF_FaceGlobals  globals )\n  {\n    if ( globals )\n    {\n      FT_Memory  memory = globals->face->memory;\n      FT_UInt    nn;\n\n\n      for ( nn = 0; nn < AF_SCRIPT_MAX; nn++ )\n      {\n        if ( globals->metrics[nn] )\n        {\n          AF_ScriptClass  clazz = AF_SCRIPT_CLASSES_GET[nn];\n\n\n          FT_ASSERT( globals->metrics[nn]->clazz == clazz );\n\n          if ( clazz->script_metrics_done )\n            clazz->script_metrics_done( globals->metrics[nn] );\n\n          FT_FREE( globals->metrics[nn] );\n        }\n      }\n\n      globals->glyph_count   = 0;\n      globals->glyph_scripts = NULL;  /* no need to free this one! */\n      globals->face          = NULL;\n\n      FT_FREE( globals );\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  af_face_globals_get_metrics( AF_FaceGlobals     globals,\n                               FT_UInt            gindex,\n                               FT_UInt            options,\n                               AF_ScriptMetrics  *ametrics )\n  {\n    AF_ScriptMetrics  metrics = NULL;\n    FT_UInt           gidx;\n    AF_ScriptClass    clazz;\n    FT_UInt           script     = options & 15;\n    const FT_Offset   script_max = sizeof ( AF_SCRIPT_CLASSES_GET ) /\n                                     sizeof ( AF_SCRIPT_CLASSES_GET[0] );\n    FT_Error          error      = FT_Err_Ok;\n\n\n    if ( gindex >= (FT_ULong)globals->glyph_count )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    gidx = script;\n    if ( gidx == 0 || gidx + 1 >= script_max )\n      gidx = globals->glyph_scripts[gindex] & AF_SCRIPT_NONE;\n\n    clazz = AF_SCRIPT_CLASSES_GET[gidx];\n    if ( script == 0 )\n      script = clazz->script;\n\n    metrics = globals->metrics[clazz->script];\n    if ( metrics == NULL )\n    {\n      /* create the global metrics object if necessary */\n      FT_Memory  memory = globals->face->memory;\n\n\n      if ( FT_ALLOC( metrics, clazz->script_metrics_size ) )\n        goto Exit;\n\n      metrics->clazz   = clazz;\n      metrics->globals = globals;\n\n      if ( clazz->script_metrics_init )\n      {\n        error = clazz->script_metrics_init( metrics, globals->face );\n        if ( error )\n        {\n          if ( clazz->script_metrics_done )\n            clazz->script_metrics_done( metrics );\n\n          FT_FREE( metrics );\n          goto Exit;\n        }\n      }\n\n      globals->metrics[clazz->script] = metrics;\n    }\n\n  Exit:\n    *ametrics = metrics;\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  af_face_globals_is_digit( AF_FaceGlobals  globals,\n                            FT_UInt         gindex )\n  {\n    if ( gindex < (FT_ULong)globals->glyph_count )\n      return (FT_Bool)( globals->glyph_scripts[gindex] & AF_DIGIT );\n\n    return (FT_Bool)0;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afglobal.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afglobal.h                                                             */\n/*                                                                         */\n/*    Auto-fitter routines to compute global hinting values                */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 2003-2005, 2007, 2009, 2011-2012 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFGLOBAL_H__\n#define __AFGLOBAL_H__\n\n\n#include \"aftypes.h\"\n#include \"afmodule.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  Default values and flags for both autofitter globals (found in\n   *  AF_ModuleRec) and face globals (in AF_FaceGlobalsRec).\n   */\n\n  /* index of fallback script in `af_script_classes' */\n#define AF_SCRIPT_FALLBACK  2\n  /* a bit mask indicating an uncovered glyph        */\n#define AF_SCRIPT_NONE      0x7F\n  /* if this flag is set, we have an ASCII digit     */\n#define AF_DIGIT            0x80\n\n  /* `increase-x-height' property */\n#define AF_PROP_INCREASE_X_HEIGHT_MIN  6\n#define AF_PROP_INCREASE_X_HEIGHT_MAX  0\n\n\n  /************************************************************************/\n  /************************************************************************/\n  /*****                                                              *****/\n  /*****                  F A C E   G L O B A L S                     *****/\n  /*****                                                              *****/\n  /************************************************************************/\n  /************************************************************************/\n\n\n  /*\n   *  Note that glyph_scripts[] is used to map each glyph into\n   *  an index into the `af_script_classes' array.\n   *\n   */\n  typedef struct  AF_FaceGlobalsRec_\n  {\n    FT_Face           face;\n    FT_Long           glyph_count;    /* same as face->num_glyphs */\n    FT_Byte*          glyph_scripts;\n\n    /* per-face auto-hinter properties */\n    FT_UInt           increase_x_height;\n\n    AF_ScriptMetrics  metrics[AF_SCRIPT_MAX];\n\n    AF_Module         module;         /* to access global properties */\n\n  } AF_FaceGlobalsRec;\n\n\n  /*\n   *  model the global hints data for a given face, decomposed into\n   *  script-specific items\n   */\n\n  FT_LOCAL( FT_Error )\n  af_face_globals_new( FT_Face          face,\n                       AF_FaceGlobals  *aglobals,\n                       AF_Module        module );\n\n  FT_LOCAL( FT_Error )\n  af_face_globals_get_metrics( AF_FaceGlobals     globals,\n                               FT_UInt            gindex,\n                               FT_UInt            options,\n                               AF_ScriptMetrics  *ametrics );\n\n  FT_LOCAL( void )\n  af_face_globals_free( AF_FaceGlobals  globals );\n\n  FT_LOCAL_DEF( FT_Bool )\n  af_face_globals_is_digit( AF_FaceGlobals  globals,\n                            FT_UInt         gindex );\n\n  /* */\n\n\nFT_END_HEADER\n\n#endif /* __AFGLOBAL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afhints.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afhints.c                                                              */\n/*                                                                         */\n/*    Auto-fitter hinting routines (body).                                 */\n/*                                                                         */\n/*  Copyright 2003-2007, 2009-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"afhints.h\"\n#include \"aferrors.h\"\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_DEBUG_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_afhints\n\n\n  /* Get new segment for given axis. */\n\n  FT_LOCAL_DEF( FT_Error )\n  af_axis_hints_new_segment( AF_AxisHints  axis,\n                             FT_Memory     memory,\n                             AF_Segment   *asegment )\n  {\n    FT_Error    error   = FT_Err_Ok;\n    AF_Segment  segment = NULL;\n\n\n    if ( axis->num_segments >= axis->max_segments )\n    {\n      FT_Int  old_max = axis->max_segments;\n      FT_Int  new_max = old_max;\n      FT_Int  big_max = (FT_Int)( FT_INT_MAX / sizeof ( *segment ) );\n\n\n      if ( old_max >= big_max )\n      {\n        error = FT_THROW( Out_Of_Memory );\n        goto Exit;\n      }\n\n      new_max += ( new_max >> 2 ) + 4;\n      if ( new_max < old_max || new_max > big_max )\n        new_max = big_max;\n\n      if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) )\n        goto Exit;\n\n      axis->max_segments = new_max;\n    }\n\n    segment = axis->segments + axis->num_segments++;\n\n  Exit:\n    *asegment = segment;\n    return error;\n  }\n\n\n  /* Get new edge for given axis, direction, and position. */\n\n  FT_LOCAL( FT_Error )\n  af_axis_hints_new_edge( AF_AxisHints  axis,\n                          FT_Int        fpos,\n                          AF_Direction  dir,\n                          FT_Memory     memory,\n                          AF_Edge      *anedge )\n  {\n    FT_Error  error = FT_Err_Ok;\n    AF_Edge   edge  = NULL;\n    AF_Edge   edges;\n\n\n    if ( axis->num_edges >= axis->max_edges )\n    {\n      FT_Int  old_max = axis->max_edges;\n      FT_Int  new_max = old_max;\n      FT_Int  big_max = (FT_Int)( FT_INT_MAX / sizeof ( *edge ) );\n\n\n      if ( old_max >= big_max )\n      {\n        error = FT_THROW( Out_Of_Memory );\n        goto Exit;\n      }\n\n      new_max += ( new_max >> 2 ) + 4;\n      if ( new_max < old_max || new_max > big_max )\n        new_max = big_max;\n\n      if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) )\n        goto Exit;\n\n      axis->max_edges = new_max;\n    }\n\n    edges = axis->edges;\n    edge  = edges + axis->num_edges;\n\n    while ( edge > edges )\n    {\n      if ( edge[-1].fpos < fpos )\n        break;\n\n      /* we want the edge with same position and minor direction */\n      /* to appear before those in the major one in the list     */\n      if ( edge[-1].fpos == fpos && dir == axis->major_dir )\n        break;\n\n      edge[0] = edge[-1];\n      edge--;\n    }\n\n    axis->num_edges++;\n\n    FT_ZERO( edge );\n    edge->fpos = (FT_Short)fpos;\n    edge->dir  = (FT_Char)dir;\n\n  Exit:\n    *anedge = edge;\n    return error;\n  }\n\n\n#ifdef FT_DEBUG_AUTOFIT\n\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\n  static const char*\n  af_dir_str( AF_Direction  dir )\n  {\n    const char*  result;\n\n\n    switch ( dir )\n    {\n    case AF_DIR_UP:\n      result = \"up\";\n      break;\n    case AF_DIR_DOWN:\n      result = \"down\";\n      break;\n    case AF_DIR_LEFT:\n      result = \"left\";\n      break;\n    case AF_DIR_RIGHT:\n      result = \"right\";\n      break;\n    default:\n      result = \"none\";\n    }\n\n    return result;\n  }\n\n\n#define AF_INDEX_NUM( ptr, base )  ( (ptr) ? ( (ptr) - (base) ) : -1 )\n\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n  void\n  af_glyph_hints_dump_points( AF_GlyphHints  hints )\n  {\n    AF_Point  points = hints->points;\n    AF_Point  limit  = points + hints->num_points;\n    AF_Point  point;\n\n\n    FT_TRACE7(( \"Table of points:\\n\"\n                \"  [ index |  xorg |  yorg | xscale | yscale\"\n                \" |  xfit |  yfit |  flags ]\\n\" ));\n\n    for ( point = points; point < limit; point++ )\n      FT_TRACE7(( \"  [ %5d | %5d | %5d | %6.2f | %6.2f\"\n                  \" | %5.2f | %5.2f | %c%c%c%c%c%c ]\\n\",\n                  point - points,\n                  point->fx,\n                  point->fy,\n                  point->ox / 64.0,\n                  point->oy / 64.0,\n                  point->x / 64.0,\n                  point->y / 64.0,\n                  ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' ',\n                  ( point->flags & AF_FLAG_INFLECTION )         ? 'i' : ' ',\n                  ( point->flags & AF_FLAG_EXTREMA_X )          ? '<' : ' ',\n                  ( point->flags & AF_FLAG_EXTREMA_Y )          ? 'v' : ' ',\n                  ( point->flags & AF_FLAG_ROUND_X )            ? '(' : ' ',\n                  ( point->flags & AF_FLAG_ROUND_Y )            ? 'u' : ' '));\n    FT_TRACE7(( \"\\n\" ));\n  }\n#ifdef __cplusplus\n  }\n#endif\n\n\n  static const char*\n  af_edge_flags_to_string( AF_Edge_Flags  flags )\n  {\n    static char  temp[32];\n    int          pos = 0;\n\n\n    if ( flags & AF_EDGE_ROUND )\n    {\n      ft_memcpy( temp + pos, \"round\", 5 );\n      pos += 5;\n    }\n    if ( flags & AF_EDGE_SERIF )\n    {\n      if ( pos > 0 )\n        temp[pos++] = ' ';\n      ft_memcpy( temp + pos, \"serif\", 5 );\n      pos += 5;\n    }\n    if ( pos == 0 )\n      return \"normal\";\n\n    temp[pos] = '\\0';\n\n    return temp;\n  }\n\n\n  /* Dump the array of linked segments. */\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n  void\n  af_glyph_hints_dump_segments( AF_GlyphHints  hints )\n  {\n    FT_Int  dimension;\n\n\n    for ( dimension = 1; dimension >= 0; dimension-- )\n    {\n      AF_AxisHints  axis     = &hints->axis[dimension];\n      AF_Point      points   = hints->points;\n      AF_Edge       edges    = axis->edges;\n      AF_Segment    segments = axis->segments;\n      AF_Segment    limit    = segments + axis->num_segments;\n      AF_Segment    seg;\n\n\n      FT_TRACE7(( \"Table of %s segments:\\n\",\n                  dimension == AF_DIMENSION_HORZ ? \"vertical\"\n                                                 : \"horizontal\" ));\n      if ( axis->num_segments )\n        FT_TRACE7(( \"  [ index |  pos  |  dir  | from\"\n                    \" |  to  | link | serif | edge\"\n                    \" | height | extra |    flags    ]\\n\" ));\n      else\n        FT_TRACE7(( \"  (none)\\n\" ));\n\n      for ( seg = segments; seg < limit; seg++ )\n        FT_TRACE7(( \"  [ %5d | %5.2g | %5s | %4d\"\n                    \" | %4d | %4d | %5d | %4d\"\n                    \" | %6d | %5d | %11s ]\\n\",\n                    seg - segments,\n                    dimension == AF_DIMENSION_HORZ\n                                 ? (int)seg->first->ox / 64.0\n                                 : (int)seg->first->oy / 64.0,\n                    af_dir_str( (AF_Direction)seg->dir ),\n                    AF_INDEX_NUM( seg->first, points ),\n                    AF_INDEX_NUM( seg->last, points ),\n                    AF_INDEX_NUM( seg->link, segments ),\n                    AF_INDEX_NUM( seg->serif, segments ),\n                    AF_INDEX_NUM( seg->edge, edges ),\n                    seg->height,\n                    seg->height - ( seg->max_coord - seg->min_coord ),\n                    af_edge_flags_to_string( (AF_Edge_Flags)seg->flags ) ));\n      FT_TRACE7(( \"\\n\" ));\n    }\n  }\n#ifdef __cplusplus\n  }\n#endif\n\n\n  /* Fetch number of segments. */\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n  FT_Error\n  af_glyph_hints_get_num_segments( AF_GlyphHints  hints,\n                                   FT_Int         dimension,\n                                   FT_Int*        num_segments )\n  {\n    AF_Dimension  dim;\n    AF_AxisHints  axis;\n\n\n    dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT;\n\n    axis          = &hints->axis[dim];\n    *num_segments = axis->num_segments;\n\n    return FT_Err_Ok;\n  }\n#ifdef __cplusplus\n  }\n#endif\n\n\n  /* Fetch offset of segments into user supplied offset array. */\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n  FT_Error\n  af_glyph_hints_get_segment_offset( AF_GlyphHints  hints,\n                                     FT_Int         dimension,\n                                     FT_Int         idx,\n                                     FT_Pos*        offset )\n  {\n    AF_Dimension  dim;\n    AF_AxisHints  axis;\n    AF_Segment    seg;\n\n\n    if ( !offset )\n      return FT_THROW( Invalid_Argument );\n\n    dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT;\n\n    axis = &hints->axis[dim];\n\n    if ( idx < 0 || idx >= axis->num_segments )\n      return FT_THROW( Invalid_Argument );\n\n    seg     = &axis->segments[idx];\n    *offset = ( dim == AF_DIMENSION_HORZ ) ? seg->first->ox\n                                           : seg->first->oy;\n\n    return FT_Err_Ok;\n  }\n#ifdef __cplusplus\n  }\n#endif\n\n\n  /* Dump the array of linked edges. */\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n  void\n  af_glyph_hints_dump_edges( AF_GlyphHints  hints )\n  {\n    FT_Int  dimension;\n\n\n    for ( dimension = 1; dimension >= 0; dimension-- )\n    {\n      AF_AxisHints  axis  = &hints->axis[dimension];\n      AF_Edge       edges = axis->edges;\n      AF_Edge       limit = edges + axis->num_edges;\n      AF_Edge       edge;\n\n\n      /*\n       *  note: AF_DIMENSION_HORZ corresponds to _vertical_ edges\n       *        since they have a constant X coordinate.\n       */\n      FT_TRACE7(( \"Table of %s edges:\\n\",\n                  dimension == AF_DIMENSION_HORZ ? \"vertical\"\n                                                 : \"horizontal\" ));\n      if ( axis->num_edges )\n        FT_TRACE7(( \"  [ index |  pos  |  dir  | link\"\n                    \" | serif | blue | opos  |  pos  |    flags    ]\\n\" ));\n      else\n        FT_TRACE7(( \"  (none)\\n\" ));\n\n      for ( edge = edges; edge < limit; edge++ )\n        FT_TRACE7(( \"  [ %5d | %5.2g | %5s | %4d\"\n                    \" | %5d |   %c  | %5.2f | %5.2f | %11s ]\\n\",\n                    edge - edges,\n                    (int)edge->opos / 64.0,\n                    af_dir_str( (AF_Direction)edge->dir ),\n                    AF_INDEX_NUM( edge->link, edges ),\n                    AF_INDEX_NUM( edge->serif, edges ),\n                    edge->blue_edge ? 'y' : 'n',\n                    edge->opos / 64.0,\n                    edge->pos / 64.0,\n                    af_edge_flags_to_string( (AF_Edge_Flags)edge->flags ) ));\n      FT_TRACE7(( \"\\n\" ));\n    }\n  }\n#ifdef __cplusplus\n  }\n#endif\n\n#else /* !FT_DEBUG_AUTOFIT */\n\n  /* these empty stubs are only used to link the `ftgrid' test program */\n  /* if debugging is disabled                                          */\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n  void\n  af_glyph_hints_dump_points( AF_GlyphHints  hints )\n  {\n    FT_UNUSED( hints );\n  }\n\n\n  void\n  af_glyph_hints_dump_segments( AF_GlyphHints  hints )\n  {\n    FT_UNUSED( hints );\n  }\n\n\n  FT_Error\n  af_glyph_hints_get_num_segments( AF_GlyphHints  hints,\n                                   FT_Int         dimension,\n                                   FT_Int*        num_segments )\n  {\n    FT_UNUSED( hints );\n    FT_UNUSED( dimension );\n    FT_UNUSED( num_segments );\n\n    return 0;\n  }\n\n\n  FT_Error\n  af_glyph_hints_get_segment_offset( AF_GlyphHints  hints,\n                                     FT_Int         dimension,\n                                     FT_Int         idx,\n                                     FT_Pos*        offset )\n  {\n    FT_UNUSED( hints );\n    FT_UNUSED( dimension );\n    FT_UNUSED( idx );\n    FT_UNUSED( offset );\n\n    return 0;\n  }\n\n\n  void\n  af_glyph_hints_dump_edges( AF_GlyphHints  hints )\n  {\n    FT_UNUSED( hints );\n  }\n\n#ifdef __cplusplus\n  }\n#endif\n\n#endif /* !FT_DEBUG_AUTOFIT */\n\n\n  /* Compute the direction value of a given vector. */\n\n  FT_LOCAL_DEF( AF_Direction )\n  af_direction_compute( FT_Pos  dx,\n                        FT_Pos  dy )\n  {\n    FT_Pos        ll, ss;  /* long and short arm lengths */\n    AF_Direction  dir;     /* candidate direction        */\n\n\n    if ( dy >= dx )\n    {\n      if ( dy >= -dx )\n      {\n        dir = AF_DIR_UP;\n        ll  = dy;\n        ss  = dx;\n      }\n      else\n      {\n        dir = AF_DIR_LEFT;\n        ll  = -dx;\n        ss  = dy;\n      }\n    }\n    else /* dy < dx */\n    {\n      if ( dy >= -dx )\n      {\n        dir = AF_DIR_RIGHT;\n        ll  = dx;\n        ss  = dy;\n      }\n      else\n      {\n        dir = AF_DIR_DOWN;\n        ll  = dy;\n        ss  = dx;\n      }\n    }\n\n    /* return no direction if arm lengths differ too much            */\n    /* (value 14 is heuristic, corresponding to approx. 4.1 degrees) */\n    ss *= 14;\n    if ( FT_ABS( ll ) <= FT_ABS( ss ) )\n      dir = AF_DIR_NONE;\n\n    return dir;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_glyph_hints_init( AF_GlyphHints  hints,\n                       FT_Memory      memory )\n  {\n    FT_ZERO( hints );\n    hints->memory = memory;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_glyph_hints_done( AF_GlyphHints  hints )\n  {\n    FT_Memory  memory = hints->memory;\n    int        dim;\n\n\n    if ( !( hints && hints->memory ) )\n      return;\n\n    /*\n     *  note that we don't need to free the segment and edge\n     *  buffers since they are really within the hints->points array\n     */\n    for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n    {\n      AF_AxisHints  axis = &hints->axis[dim];\n\n\n      axis->num_segments = 0;\n      axis->max_segments = 0;\n      FT_FREE( axis->segments );\n\n      axis->num_edges = 0;\n      axis->max_edges = 0;\n      FT_FREE( axis->edges );\n    }\n\n    FT_FREE( hints->contours );\n    hints->max_contours = 0;\n    hints->num_contours = 0;\n\n    FT_FREE( hints->points );\n    hints->num_points = 0;\n    hints->max_points = 0;\n\n    hints->memory = NULL;\n  }\n\n\n  /* Reset metrics. */\n\n  FT_LOCAL_DEF( void )\n  af_glyph_hints_rescale( AF_GlyphHints     hints,\n                          AF_ScriptMetrics  metrics )\n  {\n    hints->metrics      = metrics;\n    hints->scaler_flags = metrics->scaler.flags;\n  }\n\n\n  /* Recompute all AF_Point in AF_GlyphHints from the definitions */\n  /* in a source outline.                                         */\n\n  FT_LOCAL_DEF( FT_Error )\n  af_glyph_hints_reload( AF_GlyphHints  hints,\n                         FT_Outline*    outline )\n  {\n    FT_Error   error   = FT_Err_Ok;\n    AF_Point   points;\n    FT_UInt    old_max, new_max;\n    FT_Fixed   x_scale = hints->x_scale;\n    FT_Fixed   y_scale = hints->y_scale;\n    FT_Pos     x_delta = hints->x_delta;\n    FT_Pos     y_delta = hints->y_delta;\n    FT_Memory  memory  = hints->memory;\n\n\n    hints->num_points   = 0;\n    hints->num_contours = 0;\n\n    hints->axis[0].num_segments = 0;\n    hints->axis[0].num_edges    = 0;\n    hints->axis[1].num_segments = 0;\n    hints->axis[1].num_edges    = 0;\n\n    /* first of all, reallocate the contours array if necessary */\n    new_max = (FT_UInt)outline->n_contours;\n    old_max = hints->max_contours;\n    if ( new_max > old_max )\n    {\n      new_max = ( new_max + 3 ) & ~3; /* round up to a multiple of 4 */\n\n      if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) )\n        goto Exit;\n\n      hints->max_contours = new_max;\n    }\n\n    /*\n     *  then reallocate the points arrays if necessary --\n     *  note that we reserve two additional point positions, used to\n     *  hint metrics appropriately\n     */\n    new_max = (FT_UInt)( outline->n_points + 2 );\n    old_max = hints->max_points;\n    if ( new_max > old_max )\n    {\n      new_max = ( new_max + 2 + 7 ) & ~7; /* round up to a multiple of 8 */\n\n      if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) )\n        goto Exit;\n\n      hints->max_points = new_max;\n    }\n\n    hints->num_points   = outline->n_points;\n    hints->num_contours = outline->n_contours;\n\n    /* We can't rely on the value of `FT_Outline.flags' to know the fill   */\n    /* direction used for a glyph, given that some fonts are broken (e.g., */\n    /* the Arphic ones).  We thus recompute it each time we need to.       */\n    /*                                                                     */\n    hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP;\n    hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT;\n\n    if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT )\n    {\n      hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN;\n      hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT;\n    }\n\n    hints->x_scale = x_scale;\n    hints->y_scale = y_scale;\n    hints->x_delta = x_delta;\n    hints->y_delta = y_delta;\n\n    hints->xmin_delta = 0;\n    hints->xmax_delta = 0;\n\n    points = hints->points;\n    if ( hints->num_points == 0 )\n      goto Exit;\n\n    {\n      AF_Point  point;\n      AF_Point  point_limit = points + hints->num_points;\n\n\n      /* compute coordinates & Bezier flags, next and prev */\n      {\n        FT_Vector*  vec           = outline->points;\n        char*       tag           = outline->tags;\n        AF_Point    end           = points + outline->contours[0];\n        AF_Point    prev          = end;\n        FT_Int      contour_index = 0;\n\n\n        for ( point = points; point < point_limit; point++, vec++, tag++ )\n        {\n          point->fx = (FT_Short)vec->x;\n          point->fy = (FT_Short)vec->y;\n          point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta;\n          point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta;\n\n          switch ( FT_CURVE_TAG( *tag ) )\n          {\n          case FT_CURVE_TAG_CONIC:\n            point->flags = AF_FLAG_CONIC;\n            break;\n          case FT_CURVE_TAG_CUBIC:\n            point->flags = AF_FLAG_CUBIC;\n            break;\n          default:\n            point->flags = AF_FLAG_NONE;\n          }\n\n          point->prev = prev;\n          prev->next  = point;\n          prev        = point;\n\n          if ( point == end )\n          {\n            if ( ++contour_index < outline->n_contours )\n            {\n              end  = points + outline->contours[contour_index];\n              prev = end;\n            }\n          }\n        }\n      }\n\n      /* set up the contours array */\n      {\n        AF_Point*  contour       = hints->contours;\n        AF_Point*  contour_limit = contour + hints->num_contours;\n        short*     end           = outline->contours;\n        short      idx           = 0;\n\n\n        for ( ; contour < contour_limit; contour++, end++ )\n        {\n          contour[0] = points + idx;\n          idx        = (short)( end[0] + 1 );\n        }\n      }\n\n      /* compute directions of in & out vectors */\n      {\n        AF_Point      first  = points;\n        AF_Point      prev   = NULL;\n        FT_Pos        in_x   = 0;\n        FT_Pos        in_y   = 0;\n        AF_Direction  in_dir = AF_DIR_NONE;\n\n\n        for ( point = points; point < point_limit; point++ )\n        {\n          AF_Point  next;\n          FT_Pos    out_x, out_y;\n\n\n          if ( point == first )\n          {\n            prev   = first->prev;\n            in_x   = first->fx - prev->fx;\n            in_y   = first->fy - prev->fy;\n            in_dir = af_direction_compute( in_x, in_y );\n            first  = prev + 1;\n          }\n\n          point->in_dir = (FT_Char)in_dir;\n\n          next  = point->next;\n          out_x = next->fx - point->fx;\n          out_y = next->fy - point->fy;\n\n          in_dir         = af_direction_compute( out_x, out_y );\n          point->out_dir = (FT_Char)in_dir;\n\n          /* check for weak points */\n\n          if ( point->flags & AF_FLAG_CONTROL )\n          {\n          Is_Weak_Point:\n            point->flags |= AF_FLAG_WEAK_INTERPOLATION;\n          }\n          else if ( point->out_dir == point->in_dir )\n          {\n            if ( point->out_dir != AF_DIR_NONE )\n              goto Is_Weak_Point;\n\n            if ( ft_corner_is_flat( in_x, in_y, out_x, out_y ) )\n              goto Is_Weak_Point;\n          }\n          else if ( point->in_dir == -point->out_dir )\n            goto Is_Weak_Point;\n\n          in_x = out_x;\n          in_y = out_y;\n          prev = point;\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* Store the hinted outline in an FT_Outline structure. */\n\n  FT_LOCAL_DEF( void )\n  af_glyph_hints_save( AF_GlyphHints  hints,\n                       FT_Outline*    outline )\n  {\n    AF_Point    point = hints->points;\n    AF_Point    limit = point + hints->num_points;\n    FT_Vector*  vec   = outline->points;\n    char*       tag   = outline->tags;\n\n\n    for ( ; point < limit; point++, vec++, tag++ )\n    {\n      vec->x = point->x;\n      vec->y = point->y;\n\n      if ( point->flags & AF_FLAG_CONIC )\n        tag[0] = FT_CURVE_TAG_CONIC;\n      else if ( point->flags & AF_FLAG_CUBIC )\n        tag[0] = FT_CURVE_TAG_CUBIC;\n      else\n        tag[0] = FT_CURVE_TAG_ON;\n    }\n  }\n\n\n  /****************************************************************\n   *\n   *                     EDGE POINT GRID-FITTING\n   *\n   ****************************************************************/\n\n\n  /* Align all points of an edge to the same coordinate value, */\n  /* either horizontally or vertically.                        */\n\n  FT_LOCAL_DEF( void )\n  af_glyph_hints_align_edge_points( AF_GlyphHints  hints,\n                                    AF_Dimension   dim )\n  {\n    AF_AxisHints  axis          = & hints->axis[dim];\n    AF_Segment    segments      = axis->segments;\n    AF_Segment    segment_limit = segments + axis->num_segments;\n    AF_Segment    seg;\n\n\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      for ( seg = segments; seg < segment_limit; seg++ )\n      {\n        AF_Edge   edge = seg->edge;\n        AF_Point  point, first, last;\n\n\n        if ( edge == NULL )\n          continue;\n\n        first = seg->first;\n        last  = seg->last;\n        point = first;\n        for (;;)\n        {\n          point->x      = edge->pos;\n          point->flags |= AF_FLAG_TOUCH_X;\n\n          if ( point == last )\n            break;\n\n          point = point->next;\n        }\n      }\n    }\n    else\n    {\n      for ( seg = segments; seg < segment_limit; seg++ )\n      {\n        AF_Edge   edge = seg->edge;\n        AF_Point  point, first, last;\n\n\n        if ( edge == NULL )\n          continue;\n\n        first = seg->first;\n        last  = seg->last;\n        point = first;\n        for (;;)\n        {\n          point->y      = edge->pos;\n          point->flags |= AF_FLAG_TOUCH_Y;\n\n          if ( point == last )\n            break;\n\n          point = point->next;\n        }\n      }\n    }\n  }\n\n\n  /****************************************************************\n   *\n   *                    STRONG POINT INTERPOLATION\n   *\n   ****************************************************************/\n\n\n  /* Hint the strong points -- this is equivalent to the TrueType `IP' */\n  /* hinting instruction.                                              */\n\n  FT_LOCAL_DEF( void )\n  af_glyph_hints_align_strong_points( AF_GlyphHints  hints,\n                                      AF_Dimension   dim )\n  {\n    AF_Point      points      = hints->points;\n    AF_Point      point_limit = points + hints->num_points;\n    AF_AxisHints  axis        = &hints->axis[dim];\n    AF_Edge       edges       = axis->edges;\n    AF_Edge       edge_limit  = edges + axis->num_edges;\n    AF_Flags      touch_flag;\n\n\n    if ( dim == AF_DIMENSION_HORZ )\n      touch_flag = AF_FLAG_TOUCH_X;\n    else\n      touch_flag  = AF_FLAG_TOUCH_Y;\n\n    if ( edges < edge_limit )\n    {\n      AF_Point  point;\n      AF_Edge   edge;\n\n\n      for ( point = points; point < point_limit; point++ )\n      {\n        FT_Pos  u, ou, fu;  /* point position */\n        FT_Pos  delta;\n\n\n        if ( point->flags & touch_flag )\n          continue;\n\n        /* if this point is candidate to weak interpolation, we       */\n        /* interpolate it after all strong points have been processed */\n\n        if (  ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) &&\n             !( point->flags & AF_FLAG_INFLECTION )         )\n          continue;\n\n        if ( dim == AF_DIMENSION_VERT )\n        {\n          u  = point->fy;\n          ou = point->oy;\n        }\n        else\n        {\n          u  = point->fx;\n          ou = point->ox;\n        }\n\n        fu = u;\n\n        /* is the point before the first edge? */\n        edge  = edges;\n        delta = edge->fpos - u;\n        if ( delta >= 0 )\n        {\n          u = edge->pos - ( edge->opos - ou );\n          goto Store_Point;\n        }\n\n        /* is the point after the last edge? */\n        edge  = edge_limit - 1;\n        delta = u - edge->fpos;\n        if ( delta >= 0 )\n        {\n          u = edge->pos + ( ou - edge->opos );\n          goto Store_Point;\n        }\n\n        {\n          FT_PtrDist  min, max, mid;\n          FT_Pos      fpos;\n\n\n          /* find enclosing edges */\n          min = 0;\n          max = edge_limit - edges;\n\n#if 1\n          /* for a small number of edges, a linear search is better */\n          if ( max <= 8 )\n          {\n            FT_PtrDist  nn;\n\n\n            for ( nn = 0; nn < max; nn++ )\n              if ( edges[nn].fpos >= u )\n                break;\n\n            if ( edges[nn].fpos == u )\n            {\n              u = edges[nn].pos;\n              goto Store_Point;\n            }\n            min = nn;\n          }\n          else\n#endif\n          while ( min < max )\n          {\n            mid  = ( max + min ) >> 1;\n            edge = edges + mid;\n            fpos = edge->fpos;\n\n            if ( u < fpos )\n              max = mid;\n            else if ( u > fpos )\n              min = mid + 1;\n            else\n            {\n              /* we are on the edge */\n              u = edge->pos;\n              goto Store_Point;\n            }\n          }\n\n          /* point is not on an edge */\n          {\n            AF_Edge  before = edges + min - 1;\n            AF_Edge  after  = edges + min + 0;\n\n\n            /* assert( before && after && before != after ) */\n            if ( before->scale == 0 )\n              before->scale = FT_DivFix( after->pos - before->pos,\n                                         after->fpos - before->fpos );\n\n            u = before->pos + FT_MulFix( fu - before->fpos,\n                                         before->scale );\n          }\n        }\n\n      Store_Point:\n        /* save the point position */\n        if ( dim == AF_DIMENSION_HORZ )\n          point->x = u;\n        else\n          point->y = u;\n\n        point->flags |= touch_flag;\n      }\n    }\n  }\n\n\n  /****************************************************************\n   *\n   *                    WEAK POINT INTERPOLATION\n   *\n   ****************************************************************/\n\n\n  /* Shift the original coordinates of all points between `p1' and */\n  /* `p2' to get hinted coordinates, using the same difference as  */\n  /* given by `ref'.                                               */\n\n  static void\n  af_iup_shift( AF_Point  p1,\n                AF_Point  p2,\n                AF_Point  ref )\n  {\n    AF_Point  p;\n    FT_Pos    delta = ref->u - ref->v;\n\n\n    if ( delta == 0 )\n      return;\n\n    for ( p = p1; p < ref; p++ )\n      p->u = p->v + delta;\n\n    for ( p = ref + 1; p <= p2; p++ )\n      p->u = p->v + delta;\n  }\n\n\n  /* Interpolate the original coordinates of all points between `p1' and  */\n  /* `p2' to get hinted coordinates, using `ref1' and `ref2' as the       */\n  /* reference points.  The `u' and `v' members are the current and       */\n  /* original coordinate values, respectively.                            */\n  /*                                                                      */\n  /* Details can be found in the TrueType bytecode specification.         */\n\n  static void\n  af_iup_interp( AF_Point  p1,\n                 AF_Point  p2,\n                 AF_Point  ref1,\n                 AF_Point  ref2 )\n  {\n    AF_Point  p;\n    FT_Pos    u;\n    FT_Pos    v1 = ref1->v;\n    FT_Pos    v2 = ref2->v;\n    FT_Pos    d1 = ref1->u - v1;\n    FT_Pos    d2 = ref2->u - v2;\n\n\n    if ( p1 > p2 )\n      return;\n\n    if ( v1 == v2 )\n    {\n      for ( p = p1; p <= p2; p++ )\n      {\n        u = p->v;\n\n        if ( u <= v1 )\n          u += d1;\n        else\n          u += d2;\n\n        p->u = u;\n      }\n      return;\n    }\n\n    if ( v1 < v2 )\n    {\n      for ( p = p1; p <= p2; p++ )\n      {\n        u = p->v;\n\n        if ( u <= v1 )\n          u += d1;\n        else if ( u >= v2 )\n          u += d2;\n        else\n          u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 );\n\n        p->u = u;\n      }\n    }\n    else\n    {\n      for ( p = p1; p <= p2; p++ )\n      {\n        u = p->v;\n\n        if ( u <= v2 )\n          u += d2;\n        else if ( u >= v1 )\n          u += d1;\n        else\n          u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 );\n\n        p->u = u;\n      }\n    }\n  }\n\n\n  /* Hint the weak points -- this is equivalent to the TrueType `IUP' */\n  /* hinting instruction.                                             */\n\n  FT_LOCAL_DEF( void )\n  af_glyph_hints_align_weak_points( AF_GlyphHints  hints,\n                                    AF_Dimension   dim )\n  {\n    AF_Point   points        = hints->points;\n    AF_Point   point_limit   = points + hints->num_points;\n    AF_Point*  contour       = hints->contours;\n    AF_Point*  contour_limit = contour + hints->num_contours;\n    AF_Flags   touch_flag;\n    AF_Point   point;\n    AF_Point   end_point;\n    AF_Point   first_point;\n\n\n    /* PASS 1: Move segment points to edge positions */\n\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      touch_flag = AF_FLAG_TOUCH_X;\n\n      for ( point = points; point < point_limit; point++ )\n      {\n        point->u = point->x;\n        point->v = point->ox;\n      }\n    }\n    else\n    {\n      touch_flag = AF_FLAG_TOUCH_Y;\n\n      for ( point = points; point < point_limit; point++ )\n      {\n        point->u = point->y;\n        point->v = point->oy;\n      }\n    }\n\n    point = points;\n\n    for ( ; contour < contour_limit; contour++ )\n    {\n      AF_Point  first_touched, last_touched;\n\n\n      point       = *contour;\n      end_point   = point->prev;\n      first_point = point;\n\n      /* find first touched point */\n      for (;;)\n      {\n        if ( point > end_point )  /* no touched point in contour */\n          goto NextContour;\n\n        if ( point->flags & touch_flag )\n          break;\n\n        point++;\n      }\n\n      first_touched = point;\n      last_touched  = point;\n\n      for (;;)\n      {\n        FT_ASSERT( point <= end_point                 &&\n                   ( point->flags & touch_flag ) != 0 );\n\n        /* skip any touched neighbours */\n        while ( point < end_point                    &&\n                ( point[1].flags & touch_flag ) != 0 )\n          point++;\n\n        last_touched = point;\n\n        /* find the next touched point, if any */\n        point++;\n        for (;;)\n        {\n          if ( point > end_point )\n            goto EndContour;\n\n          if ( ( point->flags & touch_flag ) != 0 )\n            break;\n\n          point++;\n        }\n\n        /* interpolate between last_touched and point */\n        af_iup_interp( last_touched + 1, point - 1,\n                       last_touched, point );\n      }\n\n    EndContour:\n      /* special case: only one point was touched */\n      if ( last_touched == first_touched )\n        af_iup_shift( first_point, end_point, first_touched );\n\n      else /* interpolate the last part */\n      {\n        if ( last_touched < end_point )\n          af_iup_interp( last_touched + 1, end_point,\n                         last_touched, first_touched );\n\n        if ( first_touched > points )\n          af_iup_interp( first_point, first_touched - 1,\n                         last_touched, first_touched );\n      }\n\n    NextContour:\n      ;\n    }\n\n    /* now save the interpolated values back to x/y */\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      for ( point = points; point < point_limit; point++ )\n        point->x = point->u;\n    }\n    else\n    {\n      for ( point = points; point < point_limit; point++ )\n        point->y = point->u;\n    }\n  }\n\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n\n  /* Apply (small) warp scale and warp delta for given dimension. */\n\n  FT_LOCAL_DEF( void )\n  af_glyph_hints_scale_dim( AF_GlyphHints  hints,\n                            AF_Dimension   dim,\n                            FT_Fixed       scale,\n                            FT_Pos         delta )\n  {\n    AF_Point  points       = hints->points;\n    AF_Point  points_limit = points + hints->num_points;\n    AF_Point  point;\n\n\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      for ( point = points; point < points_limit; point++ )\n        point->x = FT_MulFix( point->fx, scale ) + delta;\n    }\n    else\n    {\n      for ( point = points; point < points_limit; point++ )\n        point->y = FT_MulFix( point->fy, scale ) + delta;\n    }\n  }\n\n#endif /* AF_CONFIG_OPTION_USE_WARPER */\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afhints.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afhints.h                                                              */\n/*                                                                         */\n/*    Auto-fitter hinting routines (specification).                        */\n/*                                                                         */\n/*  Copyright 2003-2008, 2010-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFHINTS_H__\n#define __AFHINTS_H__\n\n#include \"aftypes.h\"\n\n#define xxAF_SORT_SEGMENTS\n\nFT_BEGIN_HEADER\n\n  /*\n   *  The definition of outline glyph hints.  These are shared by all\n   *  script analysis routines (until now).\n   */\n\n  typedef enum  AF_Dimension_\n  {\n    AF_DIMENSION_HORZ = 0,  /* x coordinates,                    */\n                            /* i.e., vertical segments & edges   */\n    AF_DIMENSION_VERT = 1,  /* y coordinates,                    */\n                            /* i.e., horizontal segments & edges */\n\n    AF_DIMENSION_MAX  /* do not remove */\n\n  } AF_Dimension;\n\n\n  /* hint directions -- the values are computed so that two vectors are */\n  /* in opposite directions iff `dir1 + dir2 == 0'                      */\n  typedef enum  AF_Direction_\n  {\n    AF_DIR_NONE  =  4,\n    AF_DIR_RIGHT =  1,\n    AF_DIR_LEFT  = -1,\n    AF_DIR_UP    =  2,\n    AF_DIR_DOWN  = -2\n\n  } AF_Direction;\n\n\n  /*\n   *  The following explanations are mostly taken from the article\n   *\n   *    Real-Time Grid Fitting of Typographic Outlines\n   *\n   *  by David Turner and Werner Lemberg\n   *\n   *   http://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf\n   *\n   *\n   *  Segments\n   *\n   *    `af_{cjk,latin,...}_hints_compute_segments' are the functions to\n   *    find segments in an outline.  A segment is a series of consecutive\n   *    points that are approximately aligned along a coordinate axis.  The\n   *    analysis to do so is specific to a script.\n   *\n   *    A segment must have at least two points, except in the case of\n   *    `fake' segments that are generated to hint metrics appropriately,\n   *    and which consist of a single point.\n   *\n   *\n   *  Edges\n   *\n   *    As soon as segments are defined, the auto-hinter groups them into\n   *    edges.  An edge corresponds to a single position on the main\n   *    dimension that collects one or more segments (allowing for a small\n   *    threshold).\n   *\n   *    The auto-hinter first tries to grid fit edges, then to align\n   *    segments on the edges unless it detects that they form a serif.\n   *\n   *    `af_{cjk,latin,...}_hints_compute_edges' are the functions to find\n   *    edges; they are specific to a script.\n   *\n   *\n   *                      A          H\n   *                       |        |\n   *                       |        |\n   *                       |        |\n   *                       |        |\n   *         C             |        |             F\n   *          +------<-----+        +-----<------+\n   *          |             B      G             |\n   *          |                                  |\n   *          |                                  |\n   *          +--------------->------------------+\n   *         D                                    E\n   *\n   *\n   *  Stems\n   *\n   *    Segments need to be `linked' to other ones in order to detect stems.\n   *    A stem is made of two segments that face each other in opposite\n   *    directions and that are sufficiently close to each other.  Using\n   *    vocabulary from the TrueType specification, stem segments form a\n   *    `black distance'.\n   *\n   *    In the above ASCII drawing, the horizontal segments are BC, DE, and\n   *    FG; the vertical segments are AB, CD, EF, and GH.\n   *\n   *    Each segment has at most one `best' candidate to form a black\n   *    distance, or no candidate at all.  Notice that two distinct segments\n   *    can have the same candidate, which frequently means a serif.\n   *\n   *    A stem is recognized by the following condition:\n   *\n   *      best segment_1 = segment_2 && best segment_2 = segment_1\n   *\n   *    The best candidate is stored in field `link' in structure\n   *    `AF_Segment'.\n   *\n   *    Stems are detected by `af_{cjk,latin,...}_hint_edges'.\n   *\n   *    In the above ASCII drawing, the best candidate for both AB and CD is\n   *    GH, while the best candidate for GH is AB.  Similarly, the best\n   *    candidate for EF and GH is AB, while the best candidate for AB is\n   *    GH.\n   *\n   *\n   *  Serifs\n   *\n   *    On the opposite, a serif has\n   *\n   *      best segment_1 = segment_2 && best segment_2 != segment_1\n   *\n   *    where segment_1 corresponds to the serif segment (CD and EF in the\n   *    above ASCII drawing).\n   *\n   *    The best candidate is stored in field `serif' in structure\n   *    `AF_Segment' (and `link' is set to NULL).\n   *\n   *    Serifs are detected by `af_{cjk,latin,...}_hint_edges'.\n   *\n   *\n   *  Touched points\n   *\n   *    A point is called `touched' if it has been processed somehow by the\n   *    auto-hinter.  It basically means that it shouldn't be moved again\n   *    (or moved only under certain constraints to preserve the already\n   *    applied processing).\n   *\n   *\n   *  Flat and round segments\n   *\n   *    Segments are `round' or `flat', depending on the series of points\n   *    that define them.  A segment is round if the next and previous point\n   *    of an extremum (which can be either a single point or sequence of\n   *    points) are both conic or cubic control points.  Otherwise, a\n   *    segment with an extremum is flat.\n   *\n   *\n   *  Strong Points\n   *\n   *    Experience has shown that points which are not part of an edge need\n   *    to be interpolated linearly between their two closest edges, even if\n   *    these are not part of the contour of those particular points.\n   *    Typical candidates for this are\n   *\n   *    - angle points (i.e., points where the `in' and `out' direction\n   *      differ greatly)\n   *\n   *    - inflection points (i.e., where the `in' and `out' angles are the\n   *      same, but the curvature changes sign)\n   *\n   *    `af_glyph_hints_align_strong_points' is the function which takes\n   *    care of such situations; it is equivalent to the TrueType `IP'\n   *    hinting instruction.\n   *\n   *\n   *  Weak Points\n   *\n   *    Other points in the outline must be interpolated using the\n   *    coordinates of their previous and next unfitted contour neighbours.\n   *    These are called `weak points' and are touched by the function\n   *    `af_glyph_hints_align_weak_points', equivalent to the TrueType `IUP'\n   *    hinting instruction.  Typical candidates are control points and\n   *    points on the contour without a major direction.\n   *\n   *    The major effect is to reduce possible distortion caused by\n   *    alignment of edges and strong points, thus weak points are processed\n   *    after strong points.\n   */\n\n\n  /* point hint flags */\n  typedef enum  AF_Flags_\n  {\n    AF_FLAG_NONE = 0,\n\n    /* point type flags */\n    AF_FLAG_CONIC   = 1 << 0,\n    AF_FLAG_CUBIC   = 1 << 1,\n    AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC,\n\n    /* point extremum flags */\n    AF_FLAG_EXTREMA_X = 1 << 2,\n    AF_FLAG_EXTREMA_Y = 1 << 3,\n\n    /* point roundness flags */\n    AF_FLAG_ROUND_X = 1 << 4,\n    AF_FLAG_ROUND_Y = 1 << 5,\n\n    /* point touch flags */\n    AF_FLAG_TOUCH_X = 1 << 6,\n    AF_FLAG_TOUCH_Y = 1 << 7,\n\n    /* candidates for weak interpolation have this flag set */\n    AF_FLAG_WEAK_INTERPOLATION = 1 << 8,\n\n    /* all inflection points in the outline have this flag set */\n    AF_FLAG_INFLECTION = 1 << 9\n\n  } AF_Flags;\n\n\n  /* edge hint flags */\n  typedef enum  AF_Edge_Flags_\n  {\n    AF_EDGE_NORMAL = 0,\n    AF_EDGE_ROUND  = 1 << 0,\n    AF_EDGE_SERIF  = 1 << 1,\n    AF_EDGE_DONE   = 1 << 2\n\n  } AF_Edge_Flags;\n\n\n  typedef struct AF_PointRec_*    AF_Point;\n  typedef struct AF_SegmentRec_*  AF_Segment;\n  typedef struct AF_EdgeRec_*     AF_Edge;\n\n\n  typedef struct  AF_PointRec_\n  {\n    FT_UShort  flags;    /* point flags used by hinter   */\n    FT_Char    in_dir;   /* direction of inwards vector  */\n    FT_Char    out_dir;  /* direction of outwards vector */\n\n    FT_Pos     ox, oy;   /* original, scaled position                   */\n    FT_Short   fx, fy;   /* original, unscaled position (in font units) */\n    FT_Pos     x, y;     /* current position                            */\n    FT_Pos     u, v;     /* current (x,y) or (y,x) depending on context */\n\n    AF_Point   next;     /* next point in contour     */\n    AF_Point   prev;     /* previous point in contour */\n\n  } AF_PointRec;\n\n\n  typedef struct  AF_SegmentRec_\n  {\n    FT_Byte     flags;       /* edge/segment flags for this segment */\n    FT_Char     dir;         /* segment direction                   */\n    FT_Short    pos;         /* position of segment                 */\n    FT_Short    min_coord;   /* minimum coordinate of segment       */\n    FT_Short    max_coord;   /* maximum coordinate of segment       */\n    FT_Short    height;      /* the hinted segment height           */\n\n    AF_Edge     edge;        /* the segment's parent edge           */\n    AF_Segment  edge_next;   /* link to next segment in parent edge */\n\n    AF_Segment  link;        /* (stem) link segment        */\n    AF_Segment  serif;       /* primary segment for serifs */\n    FT_Pos      num_linked;  /* number of linked segments  */\n    FT_Pos      score;       /* used during stem matching  */\n    FT_Pos      len;         /* used during stem matching  */\n\n    AF_Point    first;       /* first point in edge segment */\n    AF_Point    last;        /* last point in edge segment  */\n\n  } AF_SegmentRec;\n\n\n  typedef struct  AF_EdgeRec_\n  {\n    FT_Short    fpos;       /* original, unscaled position (in font units) */\n    FT_Pos      opos;       /* original, scaled position                   */\n    FT_Pos      pos;        /* current position                            */\n\n    FT_Byte     flags;      /* edge flags                                   */\n    FT_Char     dir;        /* edge direction                               */\n    FT_Fixed    scale;      /* used to speed up interpolation between edges */\n\n    AF_Width    blue_edge;  /* non-NULL if this is a blue edge */\n    AF_Edge     link;       /* link edge                       */\n    AF_Edge     serif;      /* primary edge for serifs         */\n    FT_Short    num_linked; /* number of linked edges          */\n    FT_Int      score;      /* used during stem matching       */\n\n    AF_Segment  first;      /* first segment in edge */\n    AF_Segment  last;       /* last segment in edge  */\n\n  } AF_EdgeRec;\n\n\n  typedef struct  AF_AxisHintsRec_\n  {\n    FT_Int        num_segments; /* number of used segments      */\n    FT_Int        max_segments; /* number of allocated segments */\n    AF_Segment    segments;     /* segments array               */\n#ifdef AF_SORT_SEGMENTS\n    FT_Int        mid_segments;\n#endif\n\n    FT_Int        num_edges;    /* number of used edges      */\n    FT_Int        max_edges;    /* number of allocated edges */\n    AF_Edge       edges;        /* edges array               */\n\n    AF_Direction  major_dir;    /* either vertical or horizontal */\n\n  } AF_AxisHintsRec, *AF_AxisHints;\n\n\n  typedef struct  AF_GlyphHintsRec_\n  {\n    FT_Memory         memory;\n\n    FT_Fixed          x_scale;\n    FT_Pos            x_delta;\n\n    FT_Fixed          y_scale;\n    FT_Pos            y_delta;\n\n    FT_Int            max_points;    /* number of allocated points */\n    FT_Int            num_points;    /* number of used points      */\n    AF_Point          points;        /* points array               */\n\n    FT_Int            max_contours;  /* number of allocated contours */\n    FT_Int            num_contours;  /* number of used contours      */\n    AF_Point*         contours;      /* contours array               */\n\n    AF_AxisHintsRec   axis[AF_DIMENSION_MAX];\n\n    FT_UInt32         scaler_flags;  /* copy of scaler flags     */\n    FT_UInt32         other_flags;   /* free for script-specific */\n                                     /* implementations          */\n    AF_ScriptMetrics  metrics;\n\n    FT_Pos            xmin_delta;    /* used for warping */\n    FT_Pos            xmax_delta;\n\n  } AF_GlyphHintsRec;\n\n\n#define AF_HINTS_TEST_SCALER( h, f )  ( (h)->scaler_flags & (f) )\n#define AF_HINTS_TEST_OTHER( h, f )   ( (h)->other_flags  & (f) )\n\n\n#ifdef FT_DEBUG_AUTOFIT\n\n#define AF_HINTS_DO_HORIZONTAL( h )                                     \\\n          ( !_af_debug_disable_horz_hints                            && \\\n            !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) )\n\n#define AF_HINTS_DO_VERTICAL( h )                                     \\\n          ( !_af_debug_disable_vert_hints                          && \\\n            !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) )\n\n#define AF_HINTS_DO_ADVANCE( h )                                \\\n          !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )\n\n#define AF_HINTS_DO_BLUES( h )  ( !_af_debug_disable_blue_hints )\n\n#else /* !FT_DEBUG_AUTOFIT */\n\n#define AF_HINTS_DO_HORIZONTAL( h )                                \\\n          !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL )\n\n#define AF_HINTS_DO_VERTICAL( h )                                \\\n          !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL )\n\n#define AF_HINTS_DO_ADVANCE( h )                                \\\n          !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )\n\n#define AF_HINTS_DO_BLUES( h )  1\n\n#endif /* !FT_DEBUG_AUTOFIT */\n\n\n  FT_LOCAL( AF_Direction )\n  af_direction_compute( FT_Pos  dx,\n                        FT_Pos  dy );\n\n\n  FT_LOCAL( FT_Error )\n  af_axis_hints_new_segment( AF_AxisHints  axis,\n                             FT_Memory     memory,\n                             AF_Segment   *asegment );\n\n  FT_LOCAL( FT_Error)\n  af_axis_hints_new_edge( AF_AxisHints  axis,\n                          FT_Int        fpos,\n                          AF_Direction  dir,\n                          FT_Memory     memory,\n                          AF_Edge      *edge );\n\n  FT_LOCAL( void )\n  af_glyph_hints_init( AF_GlyphHints  hints,\n                       FT_Memory      memory );\n\n  FT_LOCAL( void )\n  af_glyph_hints_rescale( AF_GlyphHints     hints,\n                          AF_ScriptMetrics  metrics );\n\n  FT_LOCAL( FT_Error )\n  af_glyph_hints_reload( AF_GlyphHints  hints,\n                         FT_Outline*    outline );\n\n  FT_LOCAL( void )\n  af_glyph_hints_save( AF_GlyphHints  hints,\n                       FT_Outline*    outline );\n\n  FT_LOCAL( void )\n  af_glyph_hints_align_edge_points( AF_GlyphHints  hints,\n                                    AF_Dimension   dim );\n\n  FT_LOCAL( void )\n  af_glyph_hints_align_strong_points( AF_GlyphHints  hints,\n                                      AF_Dimension   dim );\n\n  FT_LOCAL( void )\n  af_glyph_hints_align_weak_points( AF_GlyphHints  hints,\n                                    AF_Dimension   dim );\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n  FT_LOCAL( void )\n  af_glyph_hints_scale_dim( AF_GlyphHints  hints,\n                            AF_Dimension   dim,\n                            FT_Fixed       scale,\n                            FT_Pos         delta );\n#endif\n\n  FT_LOCAL( void )\n  af_glyph_hints_done( AF_GlyphHints  hints );\n\n/* */\n\n#define AF_SEGMENT_LEN( seg )          ( (seg)->max_coord - (seg)->min_coord )\n\n#define AF_SEGMENT_DIST( seg1, seg2 )  ( ( (seg1)->pos > (seg2)->pos )   \\\n                                           ? (seg1)->pos - (seg2)->pos   \\\n                                           : (seg2)->pos - (seg1)->pos )\n\n\nFT_END_HEADER\n\n#endif /* __AFHINTS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afindic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afindic.c                                                              */\n/*                                                                         */\n/*    Auto-fitter hinting routines for Indic scripts (body).               */\n/*                                                                         */\n/*  Copyright 2007, 2011-2013 by                                           */\n/*  Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>.    */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"aftypes.h\"\n#include \"aflatin.h\"\n\n\n#ifdef AF_CONFIG_OPTION_INDIC\n\n#include \"afindic.h\"\n#include \"aferrors.h\"\n#include \"afcjk.h\"\n\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n#include \"afwarp.h\"\n#endif\n\n\n  static FT_Error\n  af_indic_metrics_init( AF_CJKMetrics  metrics,\n                         FT_Face        face )\n  {\n    /* skip blue zone init in CJK routines */\n    FT_CharMap  oldmap = face->charmap;\n\n\n    metrics->units_per_em = face->units_per_EM;\n\n    if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) )\n      face->charmap = NULL;\n    else\n    {\n      af_cjk_metrics_init_widths( metrics, face );\n#if 0\n      /* either need indic specific blue_chars[] or just skip blue zones */\n      af_cjk_metrics_init_blues( metrics, face, af_cjk_blue_chars );\n#endif\n      af_cjk_metrics_check_digits( metrics, face );\n    }\n\n    FT_Set_Charmap( face, oldmap );\n\n    return FT_Err_Ok;\n  }\n\n\n  static void\n  af_indic_metrics_scale( AF_CJKMetrics  metrics,\n                          AF_Scaler      scaler )\n  {\n    /* use CJK routines */\n    af_cjk_metrics_scale( metrics, scaler );\n  }\n\n\n  static FT_Error\n  af_indic_hints_init( AF_GlyphHints  hints,\n                       AF_CJKMetrics  metrics )\n  {\n    /* use CJK routines */\n    return af_cjk_hints_init( hints, metrics );\n  }\n\n\n  static FT_Error\n  af_indic_hints_apply( AF_GlyphHints  hints,\n                        FT_Outline*    outline,\n                        AF_CJKMetrics  metrics )\n  {\n    /* use CJK routines */\n    return af_cjk_hints_apply( hints, outline, metrics );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                I N D I C   S C R I P T   C L A S S            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  static const AF_Script_UniRangeRec  af_indic_uniranges[] =\n  {\n#if 0\n    AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ),  /* why this? */\n#endif\n    AF_UNIRANGE_REC( 0x0900UL, 0x0DFFUL),    /* Indic Range */\n    AF_UNIRANGE_REC( 0x0F00UL, 0x0FFFUL),    /* Tibetan */\n    AF_UNIRANGE_REC( 0x1900UL, 0x194FUL),    /* Limbu */\n    AF_UNIRANGE_REC( 0x1B80UL, 0x1BBFUL),    /* Sundanese */\n    AF_UNIRANGE_REC( 0x1C80UL, 0x1CDFUL),    /* Meetei Mayak */\n    AF_UNIRANGE_REC( 0xA800UL, 0xA82FUL),    /* Syloti Nagri */\n    AF_UNIRANGE_REC( 0x11800UL, 0x118DFUL),  /* Sharada */\n    AF_UNIRANGE_REC(      0UL,      0UL)\n  };\n\n\n  AF_DEFINE_SCRIPT_CLASS( af_indic_script_class,\n    AF_SCRIPT_INDIC,\n    af_indic_uniranges,\n    'o', /* XXX */\n\n    sizeof ( AF_CJKMetricsRec ),\n\n    (AF_Script_InitMetricsFunc) af_indic_metrics_init,\n    (AF_Script_ScaleMetricsFunc)af_indic_metrics_scale,\n    (AF_Script_DoneMetricsFunc) NULL,\n\n    (AF_Script_InitHintsFunc)   af_indic_hints_init,\n    (AF_Script_ApplyHintsFunc)  af_indic_hints_apply\n  )\n\n#else /* !AF_CONFIG_OPTION_INDIC */\n\n  static const AF_Script_UniRangeRec  af_indic_uniranges[] =\n  {\n    { 0, 0 }\n  };\n\n\n  AF_DEFINE_SCRIPT_CLASS( af_indic_script_class,\n    AF_SCRIPT_INDIC,\n    af_indic_uniranges,\n    0,\n\n    sizeof ( AF_CJKMetricsRec ),\n\n    (AF_Script_InitMetricsFunc) NULL,\n    (AF_Script_ScaleMetricsFunc)NULL,\n    (AF_Script_DoneMetricsFunc) NULL,\n\n    (AF_Script_InitHintsFunc)   NULL,\n    (AF_Script_ApplyHintsFunc)  NULL\n  )\n\n#endif /* !AF_CONFIG_OPTION_INDIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afindic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afindic.h                                                              */\n/*                                                                         */\n/*    Auto-fitter hinting routines for Indic scripts (specification).      */\n/*                                                                         */\n/*  Copyright 2007, 2012 by                                                */\n/*  Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>.    */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFINDIC_H__\n#define __AFINDIC_H__\n\n#include \"afhints.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* the Indic-specific script class */\n\n  AF_DECLARE_SCRIPT_CLASS( af_indic_script_class )\n\n\n/* */\n\nFT_END_HEADER\n\n#endif /* __AFINDIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/aflatin.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  aflatin.c                                                              */\n/*                                                                         */\n/*    Auto-fitter hinting routines for latin script (body).                */\n/*                                                                         */\n/*  Copyright 2003-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_ADVANCES_H\n#include FT_INTERNAL_DEBUG_H\n\n#include \"afglobal.h\"\n#include \"aflatin.h\"\n#include \"aferrors.h\"\n\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n#include \"afwarp.h\"\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_aflatin\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****            L A T I N   G L O B A L   M E T R I C S            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* Find segments and links, compute all stem widths, and initialize */\n  /* standard width and height for the glyph with given charcode.     */\n\n  FT_LOCAL_DEF( void )\n  af_latin_metrics_init_widths( AF_LatinMetrics  metrics,\n                                FT_Face          face )\n  {\n    /* scan the array of segments in each direction */\n    AF_GlyphHintsRec  hints[1];\n\n\n    FT_TRACE5(( \"standard widths computation\\n\"\n                \"===========================\\n\\n\" ));\n\n    af_glyph_hints_init( hints, face->memory );\n\n    metrics->axis[AF_DIMENSION_HORZ].width_count = 0;\n    metrics->axis[AF_DIMENSION_VERT].width_count = 0;\n\n    {\n      FT_Error            error;\n      FT_UInt             glyph_index;\n      int                 dim;\n      AF_LatinMetricsRec  dummy[1];\n      AF_Scaler           scaler = &dummy->root.scaler;\n\n\n      glyph_index = FT_Get_Char_Index( face,\n                                       metrics->root.clazz->standard_char );\n      if ( glyph_index == 0 )\n        goto Exit;\n\n      FT_TRACE5(( \"standard character: 0x%X (glyph index %d)\\n\",\n                  metrics->root.clazz->standard_char, glyph_index ));\n\n      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );\n      if ( error || face->glyph->outline.n_points <= 0 )\n        goto Exit;\n\n      FT_ZERO( dummy );\n\n      dummy->units_per_em = metrics->units_per_em;\n\n      scaler->x_scale = 0x10000L;\n      scaler->y_scale = 0x10000L;\n      scaler->x_delta = 0;\n      scaler->y_delta = 0;\n\n      scaler->face        = face;\n      scaler->render_mode = FT_RENDER_MODE_NORMAL;\n      scaler->flags       = 0;\n\n      af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy );\n\n      error = af_glyph_hints_reload( hints, &face->glyph->outline );\n      if ( error )\n        goto Exit;\n\n      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n      {\n        AF_LatinAxis  axis    = &metrics->axis[dim];\n        AF_AxisHints  axhints = &hints->axis[dim];\n        AF_Segment    seg, limit, link;\n        FT_UInt       num_widths = 0;\n\n\n        error = af_latin_hints_compute_segments( hints,\n                                                 (AF_Dimension)dim );\n        if ( error )\n          goto Exit;\n\n        af_latin_hints_link_segments( hints,\n                                      (AF_Dimension)dim );\n\n        seg   = axhints->segments;\n        limit = seg + axhints->num_segments;\n\n        for ( ; seg < limit; seg++ )\n        {\n          link = seg->link;\n\n          /* we only consider stem segments there! */\n          if ( link && link->link == seg && link > seg )\n          {\n            FT_Pos  dist;\n\n\n            dist = seg->pos - link->pos;\n            if ( dist < 0 )\n              dist = -dist;\n\n            if ( num_widths < AF_LATIN_MAX_WIDTHS )\n              axis->widths[num_widths++].org = dist;\n          }\n        }\n\n        /* this also replaces multiple almost identical stem widths */\n        /* with a single one (the value 100 is heuristic) */\n        af_sort_and_quantize_widths( &num_widths, axis->widths,\n                                     dummy->units_per_em / 100 );\n        axis->width_count = num_widths;\n      }\n\n  Exit:\n      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n      {\n        AF_LatinAxis  axis = &metrics->axis[dim];\n        FT_Pos        stdw;\n\n\n        stdw = ( axis->width_count > 0 )\n                 ? axis->widths[0].org\n                 : AF_LATIN_CONSTANT( metrics, 50 );\n\n        /* let's try 20% of the smallest width */\n        axis->edge_distance_threshold = stdw / 5;\n        axis->standard_width          = stdw;\n        axis->extra_light             = 0;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        {\n          FT_UInt  i;\n\n\n          FT_TRACE5(( \"%s widths:\\n\",\n                      dim == AF_DIMENSION_VERT ? \"horizontal\"\n                                               : \"vertical\" ));\n\n          FT_TRACE5(( \"  %d (standard)\", axis->standard_width ));\n          for ( i = 1; i < axis->width_count; i++ )\n            FT_TRACE5(( \" %d\", axis->widths[i].org ));\n\n          FT_TRACE5(( \"\\n\" ));\n        }\n#endif\n      }\n    }\n\n    FT_TRACE5(( \"\\n\" ));\n\n    af_glyph_hints_done( hints );\n  }\n\n\n\n#define AF_LATIN_MAX_TEST_CHARACTERS  12\n\n\n  static const char af_latin_blue_chars[AF_LATIN_MAX_BLUES]\n                                       [AF_LATIN_MAX_TEST_CHARACTERS + 1] =\n  {\n    \"THEZOCQS\",\n    \"HEZLOCUS\",\n    \"fijkdbh\",\n    \"xzroesc\",\n    \"xzroesc\",\n    \"pqgjy\"\n  };\n\n\n  /* Find all blue zones.  Flat segments give the reference points, */\n  /* round segments the overshoot positions.                        */\n\n  static void\n  af_latin_metrics_init_blues( AF_LatinMetrics  metrics,\n                               FT_Face          face )\n  {\n    FT_Pos        flats [AF_LATIN_MAX_TEST_CHARACTERS];\n    FT_Pos        rounds[AF_LATIN_MAX_TEST_CHARACTERS];\n    FT_Int        num_flats;\n    FT_Int        num_rounds;\n    FT_Int        bb;\n    AF_LatinBlue  blue;\n    FT_Error      error;\n    AF_LatinAxis  axis  = &metrics->axis[AF_DIMENSION_VERT];\n    FT_Outline    outline;\n\n\n    /* we compute the blues simply by loading each character from the    */\n    /* `af_latin_blue_chars[blues]' string, then finding its top-most or */\n    /* bottom-most points (depending on `AF_IS_TOP_BLUE')                */\n\n    FT_TRACE5(( \"blue zones computation\\n\"\n                \"======================\\n\\n\" ));\n\n    for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )\n    {\n      const char*  p     = af_latin_blue_chars[bb];\n      const char*  limit = p + AF_LATIN_MAX_TEST_CHARACTERS;\n      FT_Pos*      blue_ref;\n      FT_Pos*      blue_shoot;\n\n\n      FT_TRACE5(( \"blue zone %d:\\n\", bb ));\n\n      num_flats  = 0;\n      num_rounds = 0;\n\n      for ( ; p < limit && *p; p++ )\n      {\n        FT_UInt     glyph_index;\n        FT_Pos      best_y;                            /* same as points.y */\n        FT_Int      best_point, best_contour_first, best_contour_last;\n        FT_Vector*  points;\n        FT_Bool     round = 0;\n\n\n        /* load the character in the face -- skip unknown or empty ones */\n        glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p );\n        if ( glyph_index == 0 )\n          continue;\n\n        error   = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );\n        outline = face->glyph->outline;\n        if ( error || outline.n_points <= 0 )\n          continue;\n\n        /* now compute min or max point indices and coordinates */\n        points             = outline.points;\n        best_point         = -1;\n        best_y             = 0;  /* make compiler happy */\n        best_contour_first = 0;  /* ditto */\n        best_contour_last  = 0;  /* ditto */\n\n        {\n          FT_Int  nn;\n          FT_Int  first = 0;\n          FT_Int  last  = -1;\n\n\n          for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ )\n          {\n            FT_Int  old_best_point = best_point;\n            FT_Int  pp;\n\n\n            last = outline.contours[nn];\n\n            /* Avoid single-point contours since they are never rasterized. */\n            /* In some fonts, they correspond to mark attachment points     */\n            /* which are way outside of the glyph's real outline.           */\n            if ( last <= first )\n              continue;\n\n            if ( AF_LATIN_IS_TOP_BLUE( bb ) )\n            {\n              for ( pp = first; pp <= last; pp++ )\n                if ( best_point < 0 || points[pp].y > best_y )\n                {\n                  best_point = pp;\n                  best_y     = points[pp].y;\n                }\n            }\n            else\n            {\n              for ( pp = first; pp <= last; pp++ )\n                if ( best_point < 0 || points[pp].y < best_y )\n                {\n                  best_point = pp;\n                  best_y     = points[pp].y;\n                }\n            }\n\n            if ( best_point != old_best_point )\n            {\n              best_contour_first = first;\n              best_contour_last  = last;\n            }\n          }\n          FT_TRACE5(( \"  %c  %ld\", *p, best_y ));\n        }\n\n        /* now check whether the point belongs to a straight or round   */\n        /* segment; we first need to find in which contour the extremum */\n        /* lies, then inspect its previous and next points              */\n        if ( best_point >= 0 )\n        {\n          FT_Pos  best_x = points[best_point].x;\n          FT_Int  prev, next;\n          FT_Int  best_on_point_first, best_on_point_last;\n          FT_Pos  dist;\n\n\n          if ( FT_CURVE_TAG( outline.tags[best_point] ) == FT_CURVE_TAG_ON )\n          {\n            best_on_point_first = best_point;\n            best_on_point_last  = best_point;\n          }\n          else\n          {\n            best_on_point_first = -1;\n            best_on_point_last  = -1;\n          }\n\n          /* look for the previous and next points that are not on the */\n          /* same Y coordinate, then threshold the `closeness'...      */\n          prev = best_point;\n          next = prev;\n\n          do\n          {\n            if ( prev > best_contour_first )\n              prev--;\n            else\n              prev = best_contour_last;\n\n            dist = FT_ABS( points[prev].y - best_y );\n            /* accept a small distance or a small angle (both values are */\n            /* heuristic; value 20 corresponds to approx. 2.9 degrees)   */\n            if ( dist > 5 )\n              if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist )\n                break;\n\n            if ( FT_CURVE_TAG( outline.tags[prev] ) == FT_CURVE_TAG_ON )\n            {\n              best_on_point_first = prev;\n              if ( best_on_point_last < 0 )\n                best_on_point_last = prev;\n            }\n\n          } while ( prev != best_point );\n\n          do\n          {\n            if ( next < best_contour_last )\n              next++;\n            else\n              next = best_contour_first;\n\n            dist = FT_ABS( points[next].y - best_y );\n            if ( dist > 5 )\n              if ( FT_ABS( points[next].x - best_x ) <= 20 * dist )\n                break;\n\n            if ( FT_CURVE_TAG( outline.tags[next] ) == FT_CURVE_TAG_ON )\n            {\n              best_on_point_last = next;\n              if ( best_on_point_first < 0 )\n                best_on_point_first = next;\n            }\n\n          } while ( next != best_point );\n\n          /* now set the `round' flag depending on the segment's kind */\n          /* (value 8 is heuristic)                                   */\n          if ( best_on_point_first >= 0                               &&\n               best_on_point_last >= 0                                &&\n               (FT_UInt)( FT_ABS( points[best_on_point_last].x -\n                                  points[best_on_point_first].x ) ) >\n                 metrics->units_per_em / 8                            )\n            round = 0;\n          else\n            round = FT_BOOL(\n              FT_CURVE_TAG( outline.tags[prev] ) != FT_CURVE_TAG_ON ||\n              FT_CURVE_TAG( outline.tags[next] ) != FT_CURVE_TAG_ON );\n\n          FT_TRACE5(( \" (%s)\\n\", round ? \"round\" : \"flat\" ));\n        }\n\n        if ( round )\n          rounds[num_rounds++] = best_y;\n        else\n          flats[num_flats++]   = best_y;\n      }\n\n      if ( num_flats == 0 && num_rounds == 0 )\n      {\n        /*\n         *  we couldn't find a single glyph to compute this blue zone,\n         *  we will simply ignore it then\n         */\n        FT_TRACE5(( \"  empty\\n\" ));\n        continue;\n      }\n\n      /* we have computed the contents of the `rounds' and `flats' tables, */\n      /* now determine the reference and overshoot position of the blue -- */\n      /* we simply take the median value after a simple sort               */\n      af_sort_pos( num_rounds, rounds );\n      af_sort_pos( num_flats,  flats );\n\n      blue       = &axis->blues[axis->blue_count];\n      blue_ref   = &blue->ref.org;\n      blue_shoot = &blue->shoot.org;\n\n      axis->blue_count++;\n\n      if ( num_flats == 0 )\n      {\n        *blue_ref   =\n        *blue_shoot = rounds[num_rounds / 2];\n      }\n      else if ( num_rounds == 0 )\n      {\n        *blue_ref   =\n        *blue_shoot = flats[num_flats / 2];\n      }\n      else\n      {\n        *blue_ref   = flats[num_flats / 2];\n        *blue_shoot = rounds[num_rounds / 2];\n      }\n\n      /* there are sometimes problems: if the overshoot position of top     */\n      /* zones is under its reference position, or the opposite for bottom  */\n      /* zones.  We must thus check everything there and correct the errors */\n      if ( *blue_shoot != *blue_ref )\n      {\n        FT_Pos   ref      = *blue_ref;\n        FT_Pos   shoot    = *blue_shoot;\n        FT_Bool  over_ref = FT_BOOL( shoot > ref );\n\n\n        if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref )\n        {\n          *blue_ref   =\n          *blue_shoot = ( shoot + ref ) / 2;\n\n          FT_TRACE5(( \"  [overshoot smaller than reference,\"\n                      \" taking mean value]\\n\" ));\n        }\n      }\n\n      blue->flags = 0;\n      if ( AF_LATIN_IS_TOP_BLUE( bb ) )\n        blue->flags |= AF_LATIN_BLUE_TOP;\n\n      /*\n       * The following flag is used later to adjust the y and x scales\n       * in order to optimize the pixel grid alignment of the top of small\n       * letters.\n       */\n      if ( bb == AF_LATIN_BLUE_SMALL_TOP )\n        blue->flags |= AF_LATIN_BLUE_ADJUSTMENT;\n\n      FT_TRACE5(( \"    -> reference = %ld\\n\"\n                  \"       overshoot = %ld\\n\",\n                  *blue_ref, *blue_shoot ));\n    }\n\n    FT_TRACE5(( \"\\n\" ));\n\n    return;\n  }\n\n\n  /* Check whether all ASCII digits have the same advance width. */\n\n  FT_LOCAL_DEF( void )\n  af_latin_metrics_check_digits( AF_LatinMetrics  metrics,\n                                 FT_Face          face )\n  {\n    FT_UInt   i;\n    FT_Bool   started = 0, same_width = 1;\n    FT_Fixed  advance, old_advance = 0;\n\n\n    /* digit `0' is 0x30 in all supported charmaps */\n    for ( i = 0x30; i <= 0x39; i++ )\n    {\n      FT_UInt  glyph_index;\n\n\n      glyph_index = FT_Get_Char_Index( face, i );\n      if ( glyph_index == 0 )\n        continue;\n\n      if ( FT_Get_Advance( face, glyph_index,\n                           FT_LOAD_NO_SCALE         |\n                           FT_LOAD_NO_HINTING       |\n                           FT_LOAD_IGNORE_TRANSFORM,\n                           &advance ) )\n        continue;\n\n      if ( started )\n      {\n        if ( advance != old_advance )\n        {\n          same_width = 0;\n          break;\n        }\n      }\n      else\n      {\n        old_advance = advance;\n        started     = 1;\n      }\n    }\n\n    metrics->root.digits_have_same_width = same_width;\n  }\n\n\n  /* Initialize global metrics. */\n\n  FT_LOCAL_DEF( FT_Error )\n  af_latin_metrics_init( AF_LatinMetrics  metrics,\n                         FT_Face          face )\n  {\n    FT_CharMap  oldmap = face->charmap;\n\n\n    metrics->units_per_em = face->units_per_EM;\n\n    if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) )\n    {\n      af_latin_metrics_init_widths( metrics, face );\n      af_latin_metrics_init_blues( metrics, face );\n      af_latin_metrics_check_digits( metrics, face );\n    }\n\n    FT_Set_Charmap( face, oldmap );\n    return FT_Err_Ok;\n  }\n\n\n  /* Adjust scaling value, then scale and shift widths   */\n  /* and blue zones (if applicable) for given dimension. */\n\n  static void\n  af_latin_metrics_scale_dim( AF_LatinMetrics  metrics,\n                              AF_Scaler        scaler,\n                              AF_Dimension     dim )\n  {\n    FT_Fixed      scale;\n    FT_Pos        delta;\n    AF_LatinAxis  axis;\n    FT_UInt       nn;\n\n\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      scale = scaler->x_scale;\n      delta = scaler->x_delta;\n    }\n    else\n    {\n      scale = scaler->y_scale;\n      delta = scaler->y_delta;\n    }\n\n    axis = &metrics->axis[dim];\n\n    if ( axis->org_scale == scale && axis->org_delta == delta )\n      return;\n\n    axis->org_scale = scale;\n    axis->org_delta = delta;\n\n    /*\n     * correct X and Y scale to optimize the alignment of the top of small\n     * letters to the pixel grid\n     */\n    {\n      AF_LatinAxis  Axis = &metrics->axis[AF_DIMENSION_VERT];\n      AF_LatinBlue  blue = NULL;\n\n\n      for ( nn = 0; nn < Axis->blue_count; nn++ )\n      {\n        if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT )\n        {\n          blue = &Axis->blues[nn];\n          break;\n        }\n      }\n\n      if ( blue )\n      {\n        FT_Pos   scaled;\n        FT_Pos   threshold;\n        FT_Pos   fitted;\n        FT_UInt  limit;\n        FT_UInt  ppem;\n\n\n        scaled    = FT_MulFix( blue->shoot.org, scaler->y_scale );\n        ppem      = metrics->root.scaler.face->size->metrics.x_ppem;\n        limit     = metrics->root.globals->increase_x_height;\n        threshold = 40;\n\n        /* if the `increase-x-height' property is active, */\n        /* we round up much more often                    */\n        if ( limit                                 &&\n             ppem <= limit                         &&\n             ppem >= AF_PROP_INCREASE_X_HEIGHT_MIN )\n          threshold = 52;\n\n        fitted = ( scaled + threshold ) & ~63;\n\n        if ( scaled != fitted )\n        {\n#if 0\n          if ( dim == AF_DIMENSION_HORZ )\n          {\n            if ( fitted < scaled )\n              scale -= scale / 50;  /* scale *= 0.98 */\n          }\n          else\n#endif\n          if ( dim == AF_DIMENSION_VERT )\n            scale = FT_MulDiv( scale, fitted, scaled );\n        }\n      }\n    }\n\n    axis->scale = scale;\n    axis->delta = delta;\n\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      metrics->root.scaler.x_scale = scale;\n      metrics->root.scaler.x_delta = delta;\n    }\n    else\n    {\n      metrics->root.scaler.y_scale = scale;\n      metrics->root.scaler.y_delta = delta;\n    }\n\n    /* scale the widths */\n    for ( nn = 0; nn < axis->width_count; nn++ )\n    {\n      AF_Width  width = axis->widths + nn;\n\n\n      width->cur = FT_MulFix( width->org, scale );\n      width->fit = width->cur;\n    }\n\n    /* an extra-light axis corresponds to a standard width that is */\n    /* smaller than 5/8 pixels                                     */\n    axis->extra_light =\n      (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 );\n\n    if ( dim == AF_DIMENSION_VERT )\n    {\n      /* scale the blue zones */\n      for ( nn = 0; nn < axis->blue_count; nn++ )\n      {\n        AF_LatinBlue  blue = &axis->blues[nn];\n        FT_Pos        dist;\n\n\n        blue->ref.cur   = FT_MulFix( blue->ref.org, scale ) + delta;\n        blue->ref.fit   = blue->ref.cur;\n        blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta;\n        blue->shoot.fit = blue->shoot.cur;\n        blue->flags    &= ~AF_LATIN_BLUE_ACTIVE;\n\n        /* a blue zone is only active if it is less than 3/4 pixels tall */\n        dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale );\n        if ( dist <= 48 && dist >= -48 )\n        {\n#if 0\n          FT_Pos  delta1;\n#endif\n          FT_Pos  delta2;\n\n\n          /* use discrete values for blue zone widths */\n\n#if 0\n\n          /* generic, original code */\n          delta1 = blue->shoot.org - blue->ref.org;\n          delta2 = delta1;\n          if ( delta1 < 0 )\n            delta2 = -delta2;\n\n          delta2 = FT_MulFix( delta2, scale );\n\n          if ( delta2 < 32 )\n            delta2 = 0;\n          else if ( delta2 < 64 )\n            delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );\n          else\n            delta2 = FT_PIX_ROUND( delta2 );\n\n          if ( delta1 < 0 )\n            delta2 = -delta2;\n\n          blue->ref.fit   = FT_PIX_ROUND( blue->ref.cur );\n          blue->shoot.fit = blue->ref.fit + delta2;\n\n#else\n\n          /* simplified version due to abs(dist) <= 48 */\n          delta2 = dist;\n          if ( dist < 0 )\n            delta2 = -delta2;\n\n          if ( delta2 < 32 )\n            delta2 = 0;\n          else if ( delta2 < 48 )\n            delta2 = 32;\n          else\n            delta2 = 64;\n\n          if ( dist < 0 )\n            delta2 = -delta2;\n\n          blue->ref.fit   = FT_PIX_ROUND( blue->ref.cur );\n          blue->shoot.fit = blue->ref.fit - delta2;\n\n#endif\n\n          blue->flags |= AF_LATIN_BLUE_ACTIVE;\n        }\n      }\n    }\n  }\n\n\n  /* Scale global values in both directions. */\n\n  FT_LOCAL_DEF( void )\n  af_latin_metrics_scale( AF_LatinMetrics  metrics,\n                          AF_Scaler        scaler )\n  {\n    metrics->root.scaler.render_mode = scaler->render_mode;\n    metrics->root.scaler.face        = scaler->face;\n    metrics->root.scaler.flags       = scaler->flags;\n\n    af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ );\n    af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* Walk over all contours and compute its segments. */\n\n  FT_LOCAL_DEF( FT_Error )\n  af_latin_hints_compute_segments( AF_GlyphHints  hints,\n                                   AF_Dimension   dim )\n  {\n    AF_AxisHints   axis          = &hints->axis[dim];\n    FT_Memory      memory        = hints->memory;\n    FT_Error       error         = FT_Err_Ok;\n    AF_Segment     segment       = NULL;\n    AF_SegmentRec  seg0;\n    AF_Point*      contour       = hints->contours;\n    AF_Point*      contour_limit = contour + hints->num_contours;\n    AF_Direction   major_dir, segment_dir;\n\n\n    FT_ZERO( &seg0 );\n    seg0.score = 32000;\n    seg0.flags = AF_EDGE_NORMAL;\n\n    major_dir   = (AF_Direction)FT_ABS( axis->major_dir );\n    segment_dir = major_dir;\n\n    axis->num_segments = 0;\n\n    /* set up (u,v) in each point */\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      AF_Point  point = hints->points;\n      AF_Point  limit = point + hints->num_points;\n\n\n      for ( ; point < limit; point++ )\n      {\n        point->u = point->fx;\n        point->v = point->fy;\n      }\n    }\n    else\n    {\n      AF_Point  point = hints->points;\n      AF_Point  limit = point + hints->num_points;\n\n\n      for ( ; point < limit; point++ )\n      {\n        point->u = point->fy;\n        point->v = point->fx;\n      }\n    }\n\n    /* do each contour separately */\n    for ( ; contour < contour_limit; contour++ )\n    {\n      AF_Point  point   =  contour[0];\n      AF_Point  last    =  point->prev;\n      int       on_edge =  0;\n      FT_Pos    min_pos =  32000;  /* minimum segment pos != min_coord */\n      FT_Pos    max_pos = -32000;  /* maximum segment pos != max_coord */\n      FT_Bool   passed;\n\n\n      if ( point == last )  /* skip singletons -- just in case */\n        continue;\n\n      if ( FT_ABS( last->out_dir )  == major_dir &&\n           FT_ABS( point->out_dir ) == major_dir )\n      {\n        /* we are already on an edge, try to locate its start */\n        last = point;\n\n        for (;;)\n        {\n          point = point->prev;\n          if ( FT_ABS( point->out_dir ) != major_dir )\n          {\n            point = point->next;\n            break;\n          }\n          if ( point == last )\n            break;\n        }\n      }\n\n      last   = point;\n      passed = 0;\n\n      for (;;)\n      {\n        FT_Pos  u, v;\n\n\n        if ( on_edge )\n        {\n          u = point->u;\n          if ( u < min_pos )\n            min_pos = u;\n          if ( u > max_pos )\n            max_pos = u;\n\n          if ( point->out_dir != segment_dir || point == last )\n          {\n            /* we are just leaving an edge; record a new segment! */\n            segment->last = point;\n            segment->pos  = (FT_Short)( ( min_pos + max_pos ) >> 1 );\n\n            /* a segment is round if either its first or last point */\n            /* is a control point                                   */\n            if ( ( segment->first->flags | point->flags ) &\n                 AF_FLAG_CONTROL                          )\n              segment->flags |= AF_EDGE_ROUND;\n\n            /* compute segment size */\n            min_pos = max_pos = point->v;\n\n            v = segment->first->v;\n            if ( v < min_pos )\n              min_pos = v;\n            if ( v > max_pos )\n              max_pos = v;\n\n            segment->min_coord = (FT_Short)min_pos;\n            segment->max_coord = (FT_Short)max_pos;\n            segment->height    = (FT_Short)( segment->max_coord -\n                                             segment->min_coord );\n\n            on_edge = 0;\n            segment = NULL;\n            /* fall through */\n          }\n        }\n\n        /* now exit if we are at the start/end point */\n        if ( point == last )\n        {\n          if ( passed )\n            break;\n          passed = 1;\n        }\n\n        if ( !on_edge && FT_ABS( point->out_dir ) == major_dir )\n        {\n          /* this is the start of a new segment! */\n          segment_dir = (AF_Direction)point->out_dir;\n\n          /* clear all segment fields */\n          error = af_axis_hints_new_segment( axis, memory, &segment );\n          if ( error )\n            goto Exit;\n\n          segment[0]        = seg0;\n          segment->dir      = (FT_Char)segment_dir;\n          min_pos = max_pos = point->u;\n          segment->first    = point;\n          segment->last     = point;\n          on_edge           = 1;\n        }\n\n        point = point->next;\n      }\n\n    } /* contours */\n\n\n    /* now slightly increase the height of segments if this makes */\n    /* sense -- this is used to better detect and ignore serifs   */\n    {\n      AF_Segment  segments     = axis->segments;\n      AF_Segment  segments_end = segments + axis->num_segments;\n\n\n      for ( segment = segments; segment < segments_end; segment++ )\n      {\n        AF_Point  first   = segment->first;\n        AF_Point  last    = segment->last;\n        FT_Pos    first_v = first->v;\n        FT_Pos    last_v  = last->v;\n\n\n        if ( first == last )\n          continue;\n\n        if ( first_v < last_v )\n        {\n          AF_Point  p;\n\n\n          p = first->prev;\n          if ( p->v < first_v )\n            segment->height = (FT_Short)( segment->height +\n                                          ( ( first_v - p->v ) >> 1 ) );\n\n          p = last->next;\n          if ( p->v > last_v )\n            segment->height = (FT_Short)( segment->height +\n                                          ( ( p->v - last_v ) >> 1 ) );\n        }\n        else\n        {\n          AF_Point  p;\n\n\n          p = first->prev;\n          if ( p->v > first_v )\n            segment->height = (FT_Short)( segment->height +\n                                          ( ( p->v - first_v ) >> 1 ) );\n\n          p = last->next;\n          if ( p->v < last_v )\n            segment->height = (FT_Short)( segment->height +\n                                          ( ( last_v - p->v ) >> 1 ) );\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* Link segments to form stems and serifs. */\n\n  FT_LOCAL_DEF( void )\n  af_latin_hints_link_segments( AF_GlyphHints  hints,\n                                AF_Dimension   dim )\n  {\n    AF_AxisHints  axis          = &hints->axis[dim];\n    AF_Segment    segments      = axis->segments;\n    AF_Segment    segment_limit = segments + axis->num_segments;\n    FT_Pos        len_threshold, len_score;\n    AF_Segment    seg1, seg2;\n\n\n    len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 );\n    if ( len_threshold == 0 )\n      len_threshold = 1;\n\n    len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 );\n\n    /* now compare each segment to the others */\n    for ( seg1 = segments; seg1 < segment_limit; seg1++ )\n    {\n      /* the fake segments are introduced to hint the metrics -- */\n      /* we must never link them to anything                     */\n      if ( seg1->dir != axis->major_dir || seg1->first == seg1->last )\n        continue;\n\n      /* search for stems having opposite directions, */\n      /* with seg1 to the `left' of seg2              */\n      for ( seg2 = segments; seg2 < segment_limit; seg2++ )\n      {\n        FT_Pos  pos1 = seg1->pos;\n        FT_Pos  pos2 = seg2->pos;\n\n\n        if ( seg1->dir + seg2->dir == 0 && pos2 > pos1 )\n        {\n          /* compute distance between the two segments */\n          FT_Pos  dist = pos2 - pos1;\n          FT_Pos  min  = seg1->min_coord;\n          FT_Pos  max  = seg1->max_coord;\n          FT_Pos  len, score;\n\n\n          if ( min < seg2->min_coord )\n            min = seg2->min_coord;\n\n          if ( max > seg2->max_coord )\n            max = seg2->max_coord;\n\n          /* compute maximum coordinate difference of the two segments */\n          len = max - min;\n          if ( len >= len_threshold )\n          {\n            /* small coordinate differences cause a higher score, and     */\n            /* segments with a greater distance cause a higher score also */\n            score = dist + len_score / len;\n\n            /* and we search for the smallest score */\n            /* of the sum of the two values         */\n            if ( score < seg1->score )\n            {\n              seg1->score = score;\n              seg1->link  = seg2;\n            }\n\n            if ( score < seg2->score )\n            {\n              seg2->score = score;\n              seg2->link  = seg1;\n            }\n          }\n        }\n      }\n    }\n\n    /* now compute the `serif' segments, cf. explanations in `afhints.h' */\n    for ( seg1 = segments; seg1 < segment_limit; seg1++ )\n    {\n      seg2 = seg1->link;\n\n      if ( seg2 )\n      {\n        if ( seg2->link != seg1 )\n        {\n          seg1->link  = 0;\n          seg1->serif = seg2->link;\n        }\n      }\n    }\n  }\n\n\n  /* Link segments to edges, using feature analysis for selection. */\n\n  FT_LOCAL_DEF( FT_Error )\n  af_latin_hints_compute_edges( AF_GlyphHints  hints,\n                                AF_Dimension   dim )\n  {\n    AF_AxisHints  axis   = &hints->axis[dim];\n    FT_Error      error  = FT_Err_Ok;\n    FT_Memory     memory = hints->memory;\n    AF_LatinAxis  laxis  = &((AF_LatinMetrics)hints->metrics)->axis[dim];\n\n    AF_Segment    segments      = axis->segments;\n    AF_Segment    segment_limit = segments + axis->num_segments;\n    AF_Segment    seg;\n\n#if 0\n    AF_Direction  up_dir;\n#endif\n    FT_Fixed      scale;\n    FT_Pos        edge_distance_threshold;\n    FT_Pos        segment_length_threshold;\n\n\n    axis->num_edges = 0;\n\n    scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale\n                                         : hints->y_scale;\n\n#if 0\n    up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP\n                                          : AF_DIR_RIGHT;\n#endif\n\n    /*\n     *  We ignore all segments that are less than 1 pixel in length\n     *  to avoid many problems with serif fonts.  We compute the\n     *  corresponding threshold in font units.\n     */\n    if ( dim == AF_DIMENSION_HORZ )\n        segment_length_threshold = FT_DivFix( 64, hints->y_scale );\n    else\n        segment_length_threshold = 0;\n\n    /*********************************************************************/\n    /*                                                                   */\n    /* We begin by generating a sorted table of edges for the current    */\n    /* direction.  To do so, we simply scan each segment and try to find */\n    /* an edge in our table that corresponds to its position.            */\n    /*                                                                   */\n    /* If no edge is found, we create and insert a new edge in the       */\n    /* sorted table.  Otherwise, we simply add the segment to the edge's */\n    /* list which gets processed in the second step to compute the       */\n    /* edge's properties.                                                */\n    /*                                                                   */\n    /* Note that the table of edges is sorted along the segment/edge     */\n    /* position.                                                         */\n    /*                                                                   */\n    /*********************************************************************/\n\n    /* assure that edge distance threshold is at most 0.25px */\n    edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold,\n                                         scale );\n    if ( edge_distance_threshold > 64 / 4 )\n      edge_distance_threshold = 64 / 4;\n\n    edge_distance_threshold = FT_DivFix( edge_distance_threshold,\n                                         scale );\n\n    for ( seg = segments; seg < segment_limit; seg++ )\n    {\n      AF_Edge  found = NULL;\n      FT_Int   ee;\n\n\n      if ( seg->height < segment_length_threshold )\n        continue;\n\n      /* A special case for serif edges: If they are smaller than */\n      /* 1.5 pixels we ignore them.                               */\n      if ( seg->serif                                     &&\n           2 * seg->height < 3 * segment_length_threshold )\n        continue;\n\n      /* look for an edge corresponding to the segment */\n      for ( ee = 0; ee < axis->num_edges; ee++ )\n      {\n        AF_Edge  edge = axis->edges + ee;\n        FT_Pos   dist;\n\n\n        dist = seg->pos - edge->fpos;\n        if ( dist < 0 )\n          dist = -dist;\n\n        if ( dist < edge_distance_threshold && edge->dir == seg->dir )\n        {\n          found = edge;\n          break;\n        }\n      }\n\n      if ( !found )\n      {\n        AF_Edge  edge;\n\n\n        /* insert a new edge in the list and */\n        /* sort according to the position    */\n        error = af_axis_hints_new_edge( axis, seg->pos,\n                                        (AF_Direction)seg->dir,\n                                        memory, &edge );\n        if ( error )\n          goto Exit;\n\n        /* add the segment to the new edge's list */\n        FT_ZERO( edge );\n\n        edge->first    = seg;\n        edge->last     = seg;\n        edge->dir      = seg->dir;\n        edge->fpos     = seg->pos;\n        edge->opos     = FT_MulFix( seg->pos, scale );\n        edge->pos      = edge->opos;\n        seg->edge_next = seg;\n      }\n      else\n      {\n        /* if an edge was found, simply add the segment to the edge's */\n        /* list                                                       */\n        seg->edge_next         = found->first;\n        found->last->edge_next = seg;\n        found->last            = seg;\n      }\n    }\n\n\n    /******************************************************************/\n    /*                                                                */\n    /* Good, we now compute each edge's properties according to the   */\n    /* segments found on its position.  Basically, these are          */\n    /*                                                                */\n    /*  - the edge's main direction                                   */\n    /*  - stem edge, serif edge or both (which defaults to stem then) */\n    /*  - rounded edge, straight or both (which defaults to straight) */\n    /*  - link for edge                                               */\n    /*                                                                */\n    /******************************************************************/\n\n    /* first of all, set the `edge' field in each segment -- this is */\n    /* required in order to compute edge links                       */\n\n    /*\n     * Note that removing this loop and setting the `edge' field of each\n     * segment directly in the code above slows down execution speed for\n     * some reasons on platforms like the Sun.\n     */\n    {\n      AF_Edge  edges      = axis->edges;\n      AF_Edge  edge_limit = edges + axis->num_edges;\n      AF_Edge  edge;\n\n\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        seg = edge->first;\n        if ( seg )\n          do\n          {\n            seg->edge = edge;\n            seg       = seg->edge_next;\n\n          } while ( seg != edge->first );\n      }\n\n      /* now compute each edge properties */\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        FT_Int  is_round    = 0;  /* does it contain round segments?    */\n        FT_Int  is_straight = 0;  /* does it contain straight segments? */\n#if 0\n        FT_Pos  ups         = 0;  /* number of upwards segments         */\n        FT_Pos  downs       = 0;  /* number of downwards segments       */\n#endif\n\n\n        seg = edge->first;\n\n        do\n        {\n          FT_Bool  is_serif;\n\n\n          /* check for roundness of segment */\n          if ( seg->flags & AF_EDGE_ROUND )\n            is_round++;\n          else\n            is_straight++;\n\n#if 0\n          /* check for segment direction */\n          if ( seg->dir == up_dir )\n            ups   += seg->max_coord - seg->min_coord;\n          else\n            downs += seg->max_coord - seg->min_coord;\n#endif\n\n          /* check for links -- if seg->serif is set, then seg->link must */\n          /* be ignored                                                   */\n          is_serif = (FT_Bool)( seg->serif               &&\n                                seg->serif->edge         &&\n                                seg->serif->edge != edge );\n\n          if ( ( seg->link && seg->link->edge != NULL ) || is_serif )\n          {\n            AF_Edge     edge2;\n            AF_Segment  seg2;\n\n\n            edge2 = edge->link;\n            seg2  = seg->link;\n\n            if ( is_serif )\n            {\n              seg2  = seg->serif;\n              edge2 = edge->serif;\n            }\n\n            if ( edge2 )\n            {\n              FT_Pos  edge_delta;\n              FT_Pos  seg_delta;\n\n\n              edge_delta = edge->fpos - edge2->fpos;\n              if ( edge_delta < 0 )\n                edge_delta = -edge_delta;\n\n              seg_delta = seg->pos - seg2->pos;\n              if ( seg_delta < 0 )\n                seg_delta = -seg_delta;\n\n              if ( seg_delta < edge_delta )\n                edge2 = seg2->edge;\n            }\n            else\n              edge2 = seg2->edge;\n\n            if ( is_serif )\n            {\n              edge->serif   = edge2;\n              edge2->flags |= AF_EDGE_SERIF;\n            }\n            else\n              edge->link  = edge2;\n          }\n\n          seg = seg->edge_next;\n\n        } while ( seg != edge->first );\n\n        /* set the round/straight flags */\n        edge->flags = AF_EDGE_NORMAL;\n\n        if ( is_round > 0 && is_round >= is_straight )\n          edge->flags |= AF_EDGE_ROUND;\n\n#if 0\n        /* set the edge's main direction */\n        edge->dir = AF_DIR_NONE;\n\n        if ( ups > downs )\n          edge->dir = (FT_Char)up_dir;\n\n        else if ( ups < downs )\n          edge->dir = (FT_Char)-up_dir;\n\n        else if ( ups == downs )\n          edge->dir = 0;  /* both up and down! */\n#endif\n\n        /* get rid of serifs if link is set                 */\n        /* XXX: This gets rid of many unpleasant artefacts! */\n        /*      Example: the `c' in cour.pfa at size 13     */\n\n        if ( edge->serif && edge->link )\n          edge->serif = 0;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* Detect segments and edges for given dimension. */\n\n  FT_LOCAL_DEF( FT_Error )\n  af_latin_hints_detect_features( AF_GlyphHints  hints,\n                                  AF_Dimension   dim )\n  {\n    FT_Error  error;\n\n\n    error = af_latin_hints_compute_segments( hints, dim );\n    if ( !error )\n    {\n      af_latin_hints_link_segments( hints, dim );\n\n      error = af_latin_hints_compute_edges( hints, dim );\n    }\n\n    return error;\n  }\n\n\n  /* Compute all edges which lie within blue zones. */\n\n  FT_LOCAL_DEF( void )\n  af_latin_hints_compute_blue_edges( AF_GlyphHints    hints,\n                                     AF_LatinMetrics  metrics )\n  {\n    AF_AxisHints  axis       = &hints->axis[AF_DIMENSION_VERT];\n    AF_Edge       edge       = axis->edges;\n    AF_Edge       edge_limit = edge + axis->num_edges;\n    AF_LatinAxis  latin      = &metrics->axis[AF_DIMENSION_VERT];\n    FT_Fixed      scale      = latin->scale;\n\n\n    /* compute which blue zones are active, i.e. have their scaled */\n    /* size < 3/4 pixels                                           */\n\n    /* for each horizontal edge search the blue zone which is closest */\n    for ( ; edge < edge_limit; edge++ )\n    {\n      FT_UInt   bb;\n      AF_Width  best_blue = NULL;\n      FT_Pos    best_dist;  /* initial threshold */\n\n\n      /* compute the initial threshold as a fraction of the EM size */\n      /* (the value 40 is heuristic)                                */\n      best_dist = FT_MulFix( metrics->units_per_em / 40, scale );\n\n      /* assure a minimum distance of 0.5px */\n      if ( best_dist > 64 / 2 )\n        best_dist = 64 / 2;\n\n      for ( bb = 0; bb < latin->blue_count; bb++ )\n      {\n        AF_LatinBlue  blue = latin->blues + bb;\n        FT_Bool       is_top_blue, is_major_dir;\n\n\n        /* skip inactive blue zones (i.e., those that are too large) */\n        if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) )\n          continue;\n\n        /* if it is a top zone, check for right edges -- if it is a bottom */\n        /* zone, check for left edges                                      */\n        /*                                                                 */\n        /* of course, that's for TrueType                                  */\n        is_top_blue  = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 );\n        is_major_dir = FT_BOOL( edge->dir == axis->major_dir );\n\n        /* if it is a top zone, the edge must be against the major    */\n        /* direction; if it is a bottom zone, it must be in the major */\n        /* direction                                                  */\n        if ( is_top_blue ^ is_major_dir )\n        {\n          FT_Pos  dist;\n\n\n          /* first of all, compare it to the reference position */\n          dist = edge->fpos - blue->ref.org;\n          if ( dist < 0 )\n            dist = -dist;\n\n          dist = FT_MulFix( dist, scale );\n          if ( dist < best_dist )\n          {\n            best_dist = dist;\n            best_blue = &blue->ref;\n          }\n\n          /* now compare it to the overshoot position and check whether */\n          /* the edge is rounded, and whether the edge is over the      */\n          /* reference position of a top zone, or under the reference   */\n          /* position of a bottom zone                                  */\n          if ( edge->flags & AF_EDGE_ROUND && dist != 0 )\n          {\n            FT_Bool  is_under_ref = FT_BOOL( edge->fpos < blue->ref.org );\n\n\n            if ( is_top_blue ^ is_under_ref )\n            {\n              dist = edge->fpos - blue->shoot.org;\n              if ( dist < 0 )\n                dist = -dist;\n\n              dist = FT_MulFix( dist, scale );\n              if ( dist < best_dist )\n              {\n                best_dist = dist;\n                best_blue = &blue->shoot;\n              }\n            }\n          }\n        }\n      }\n\n      if ( best_blue )\n        edge->blue_edge = best_blue;\n    }\n  }\n\n\n  /* Initalize hinting engine. */\n\n  static FT_Error\n  af_latin_hints_init( AF_GlyphHints    hints,\n                       AF_LatinMetrics  metrics )\n  {\n    FT_Render_Mode  mode;\n    FT_UInt32       scaler_flags, other_flags;\n    FT_Face         face = metrics->root.scaler.face;\n\n\n    af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics );\n\n    /*\n     *  correct x_scale and y_scale if needed, since they may have\n     *  been modified by `af_latin_metrics_scale_dim' above\n     */\n    hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale;\n    hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta;\n    hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale;\n    hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta;\n\n    /* compute flags depending on render mode, etc. */\n    mode = metrics->root.scaler.render_mode;\n\n#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */\n    if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V )\n      metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL;\n#endif\n\n    scaler_flags = hints->scaler_flags;\n    other_flags  = 0;\n\n    /*\n     *  We snap the width of vertical stems for the monochrome and\n     *  horizontal LCD rendering targets only.\n     */\n    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD )\n      other_flags |= AF_LATIN_HINTS_HORZ_SNAP;\n\n    /*\n     *  We snap the width of horizontal stems for the monochrome and\n     *  vertical LCD rendering targets only.\n     */\n    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V )\n      other_flags |= AF_LATIN_HINTS_VERT_SNAP;\n\n    /*\n     *  We adjust stems to full pixels only if we don't use the `light' mode.\n     */\n    if ( mode != FT_RENDER_MODE_LIGHT )\n      other_flags |= AF_LATIN_HINTS_STEM_ADJUST;\n\n    if ( mode == FT_RENDER_MODE_MONO )\n      other_flags |= AF_LATIN_HINTS_MONO;\n\n    /*\n     *  In `light' hinting mode we disable horizontal hinting completely.\n     *  We also do it if the face is italic.\n     */\n    if ( mode == FT_RENDER_MODE_LIGHT                      ||\n         ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 )\n      scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL;\n\n    hints->scaler_flags = scaler_flags;\n    hints->other_flags  = other_flags;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****        L A T I N   G L Y P H   G R I D - F I T T I N G        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* Snap a given width in scaled coordinates to one of the */\n  /* current standard widths.                               */\n\n  static FT_Pos\n  af_latin_snap_width( AF_Width  widths,\n                       FT_Int    count,\n                       FT_Pos    width )\n  {\n    int     n;\n    FT_Pos  best      = 64 + 32 + 2;\n    FT_Pos  reference = width;\n    FT_Pos  scaled;\n\n\n    for ( n = 0; n < count; n++ )\n    {\n      FT_Pos  w;\n      FT_Pos  dist;\n\n\n      w = widths[n].cur;\n      dist = width - w;\n      if ( dist < 0 )\n        dist = -dist;\n      if ( dist < best )\n      {\n        best      = dist;\n        reference = w;\n      }\n    }\n\n    scaled = FT_PIX_ROUND( reference );\n\n    if ( width >= reference )\n    {\n      if ( width < scaled + 48 )\n        width = reference;\n    }\n    else\n    {\n      if ( width > scaled - 48 )\n        width = reference;\n    }\n\n    return width;\n  }\n\n\n  /* Compute the snapped width of a given stem, ignoring very thin ones. */\n  /* There is a lot of voodoo in this function; changing the hard-coded  */\n  /* parameters influence the whole hinting process.                     */\n\n  static FT_Pos\n  af_latin_compute_stem_width( AF_GlyphHints  hints,\n                               AF_Dimension   dim,\n                               FT_Pos         width,\n                               AF_Edge_Flags  base_flags,\n                               AF_Edge_Flags  stem_flags )\n  {\n    AF_LatinMetrics  metrics  = (AF_LatinMetrics) hints->metrics;\n    AF_LatinAxis     axis     = & metrics->axis[dim];\n    FT_Pos           dist     = width;\n    FT_Int           sign     = 0;\n    FT_Int           vertical = ( dim == AF_DIMENSION_VERT );\n\n\n    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ||\n         axis->extra_light                       )\n      return width;\n\n    if ( dist < 0 )\n    {\n      dist = -width;\n      sign = 1;\n    }\n\n    if ( (  vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||\n         ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )\n    {\n      /* smooth hinting process: very lightly quantize the stem width */\n\n      /* leave the widths of serifs alone */\n      if ( ( stem_flags & AF_EDGE_SERIF ) &&\n           vertical                       &&\n           ( dist < 3 * 64 )              )\n        goto Done_Width;\n\n      else if ( base_flags & AF_EDGE_ROUND )\n      {\n        if ( dist < 80 )\n          dist = 64;\n      }\n      else if ( dist < 56 )\n        dist = 56;\n\n      if ( axis->width_count > 0 )\n      {\n        FT_Pos  delta;\n\n\n        /* compare to standard width */\n        delta = dist - axis->widths[0].cur;\n\n        if ( delta < 0 )\n          delta = -delta;\n\n        if ( delta < 40 )\n        {\n          dist = axis->widths[0].cur;\n          if ( dist < 48 )\n            dist = 48;\n\n          goto Done_Width;\n        }\n\n        if ( dist < 3 * 64 )\n        {\n          delta  = dist & 63;\n          dist  &= -64;\n\n          if ( delta < 10 )\n            dist += delta;\n\n          else if ( delta < 32 )\n            dist += 10;\n\n          else if ( delta < 54 )\n            dist += 54;\n\n          else\n            dist += delta;\n        }\n        else\n          dist = ( dist + 32 ) & ~63;\n      }\n    }\n    else\n    {\n      /* strong hinting process: snap the stem width to integer pixels */\n\n      FT_Pos  org_dist = dist;\n\n\n      dist = af_latin_snap_width( axis->widths, axis->width_count, dist );\n\n      if ( vertical )\n      {\n        /* in the case of vertical hinting, always round */\n        /* the stem heights to integer pixels            */\n\n        if ( dist >= 64 )\n          dist = ( dist + 16 ) & ~63;\n        else\n          dist = 64;\n      }\n      else\n      {\n        if ( AF_LATIN_HINTS_DO_MONO( hints ) )\n        {\n          /* monochrome horizontal hinting: snap widths to integer pixels */\n          /* with a different threshold                                   */\n\n          if ( dist < 64 )\n            dist = 64;\n          else\n            dist = ( dist + 32 ) & ~63;\n        }\n        else\n        {\n          /* for horizontal anti-aliased hinting, we adopt a more subtle */\n          /* approach: we strengthen small stems, round stems whose size */\n          /* is between 1 and 2 pixels to an integer, otherwise nothing  */\n\n          if ( dist < 48 )\n            dist = ( dist + 64 ) >> 1;\n\n          else if ( dist < 128 )\n          {\n            /* We only round to an integer width if the corresponding */\n            /* distortion is less than 1/4 pixel.  Otherwise this     */\n            /* makes everything worse since the diagonals, which are  */\n            /* not hinted, appear a lot bolder or thinner than the    */\n            /* vertical stems.                                        */\n\n            FT_Pos  delta;\n\n\n            dist = ( dist + 22 ) & ~63;\n            delta = dist - org_dist;\n            if ( delta < 0 )\n              delta = -delta;\n\n            if ( delta >= 16 )\n            {\n              dist = org_dist;\n              if ( dist < 48 )\n                dist = ( dist + 64 ) >> 1;\n            }\n          }\n          else\n            /* round otherwise to prevent color fringes in LCD mode */\n            dist = ( dist + 32 ) & ~63;\n        }\n      }\n    }\n\n  Done_Width:\n    if ( sign )\n      dist = -dist;\n\n    return dist;\n  }\n\n\n  /* Align one stem edge relative to the previous stem edge. */\n\n  static void\n  af_latin_align_linked_edge( AF_GlyphHints  hints,\n                              AF_Dimension   dim,\n                              AF_Edge        base_edge,\n                              AF_Edge        stem_edge )\n  {\n    FT_Pos  dist = stem_edge->opos - base_edge->opos;\n\n    FT_Pos  fitted_width = af_latin_compute_stem_width(\n                             hints, dim, dist,\n                             (AF_Edge_Flags)base_edge->flags,\n                             (AF_Edge_Flags)stem_edge->flags );\n\n\n    stem_edge->pos = base_edge->pos + fitted_width;\n\n    FT_TRACE5(( \"  LINK: edge %d (opos=%.2f) linked to %.2f,\"\n                \" dist was %.2f, now %.2f\\n\",\n                stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0,\n                stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 ));\n  }\n\n\n  /* Shift the coordinates of the `serif' edge by the same amount */\n  /* as the corresponding `base' edge has been moved already.     */\n\n  static void\n  af_latin_align_serif_edge( AF_GlyphHints  hints,\n                             AF_Edge        base,\n                             AF_Edge        serif )\n  {\n    FT_UNUSED( hints );\n\n    serif->pos = base->pos + ( serif->opos - base->opos );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                    E D G E   H I N T I N G                      ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* The main grid-fitting routine. */\n\n  FT_LOCAL_DEF( void )\n  af_latin_hint_edges( AF_GlyphHints  hints,\n                       AF_Dimension   dim )\n  {\n    AF_AxisHints  axis       = &hints->axis[dim];\n    AF_Edge       edges      = axis->edges;\n    AF_Edge       edge_limit = edges + axis->num_edges;\n    FT_PtrDist    n_edges;\n    AF_Edge       edge;\n    AF_Edge       anchor     = NULL;\n    FT_Int        has_serifs = 0;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    FT_UInt       num_actions = 0;\n#endif\n\n\n    FT_TRACE5(( \"%s edge hinting\\n\",\n                dim == AF_DIMENSION_VERT ? \"horizontal\" : \"vertical\" ));\n\n    /* we begin by aligning all stems relative to the blue zone */\n    /* if needed -- that's only for horizontal edges            */\n\n    if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) )\n    {\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        AF_Width  blue;\n        AF_Edge   edge1, edge2; /* these edges form the stem to check */\n\n\n        if ( edge->flags & AF_EDGE_DONE )\n          continue;\n\n        blue  = edge->blue_edge;\n        edge1 = NULL;\n        edge2 = edge->link;\n\n        if ( blue )\n          edge1 = edge;\n\n        /* flip edges if the other stem is aligned to a blue zone */\n        else if ( edge2 && edge2->blue_edge )\n        {\n          blue  = edge2->blue_edge;\n          edge1 = edge2;\n          edge2 = edge;\n        }\n\n        if ( !edge1 )\n          continue;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        if ( !anchor )\n          FT_TRACE5(( \"  BLUE_ANCHOR: edge %d (opos=%.2f) snapped to %.2f,\"\n                      \" was %.2f (anchor=edge %d)\\n\",\n                      edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0,\n                      edge1->pos / 64.0, edge - edges ));\n        else\n          FT_TRACE5(( \"  BLUE: edge %d (opos=%.2f) snapped to %.2f,\"\n                      \" was %.2f\\n\",\n                      edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0,\n                      edge1->pos / 64.0 ));\n\n        num_actions++;\n#endif\n\n        edge1->pos    = blue->fit;\n        edge1->flags |= AF_EDGE_DONE;\n\n        if ( edge2 && !edge2->blue_edge )\n        {\n          af_latin_align_linked_edge( hints, dim, edge1, edge2 );\n          edge2->flags |= AF_EDGE_DONE;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n          num_actions++;\n#endif\n        }\n\n        if ( !anchor )\n          anchor = edge;\n      }\n    }\n\n    /* now we align all other stem edges, trying to maintain the */\n    /* relative order of stems in the glyph                      */\n    for ( edge = edges; edge < edge_limit; edge++ )\n    {\n      AF_Edge  edge2;\n\n\n      if ( edge->flags & AF_EDGE_DONE )\n        continue;\n\n      /* skip all non-stem edges */\n      edge2 = edge->link;\n      if ( !edge2 )\n      {\n        has_serifs++;\n        continue;\n      }\n\n      /* now align the stem */\n\n      /* this should not happen, but it's better to be safe */\n      if ( edge2->blue_edge )\n      {\n        FT_TRACE5(( \"  ASSERTION FAILED for edge %d\\n\", edge2-edges ));\n\n        af_latin_align_linked_edge( hints, dim, edge2, edge );\n        edge->flags |= AF_EDGE_DONE;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        num_actions++;\n#endif\n        continue;\n      }\n\n      if ( !anchor )\n      {\n        /* if we reach this if clause, no stem has been aligned yet */\n\n        FT_Pos  org_len, org_center, cur_len;\n        FT_Pos  cur_pos1, error1, error2, u_off, d_off;\n\n\n        org_len = edge2->opos - edge->opos;\n        cur_len = af_latin_compute_stem_width(\n                    hints, dim, org_len,\n                    (AF_Edge_Flags)edge->flags,\n                    (AF_Edge_Flags)edge2->flags );\n\n        /* some voodoo to specially round edges for small stem widths; */\n        /* the idea is to align the center of a stem, then shifting    */\n        /* the stem edges to suitable positions                        */\n        if ( cur_len <= 64 )\n        {\n          /* width <= 1px */\n          u_off = 32;\n          d_off = 32;\n        }\n        else\n        {\n          /* 1px < width < 1.5px */\n          u_off = 38;\n          d_off = 26;\n        }\n\n        if ( cur_len < 96 )\n        {\n          org_center = edge->opos + ( org_len >> 1 );\n          cur_pos1   = FT_PIX_ROUND( org_center );\n\n          error1 = org_center - ( cur_pos1 - u_off );\n          if ( error1 < 0 )\n            error1 = -error1;\n\n          error2 = org_center - ( cur_pos1 + d_off );\n          if ( error2 < 0 )\n            error2 = -error2;\n\n          if ( error1 < error2 )\n            cur_pos1 -= u_off;\n          else\n            cur_pos1 += d_off;\n\n          edge->pos  = cur_pos1 - cur_len / 2;\n          edge2->pos = edge->pos + cur_len;\n        }\n        else\n          edge->pos = FT_PIX_ROUND( edge->opos );\n\n        anchor       = edge;\n        edge->flags |= AF_EDGE_DONE;\n\n        FT_TRACE5(( \"  ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)\"\n                    \" snapped to %.2f and %.2f\\n\",\n                    edge - edges, edge->opos / 64.0,\n                    edge2 - edges, edge2->opos / 64.0,\n                    edge->pos / 64.0, edge2->pos / 64.0 ));\n\n        af_latin_align_linked_edge( hints, dim, edge, edge2 );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        num_actions += 2;\n#endif\n      }\n      else\n      {\n        FT_Pos  org_pos, org_len, org_center, cur_len;\n        FT_Pos  cur_pos1, cur_pos2, delta1, delta2;\n\n\n        org_pos    = anchor->pos + ( edge->opos - anchor->opos );\n        org_len    = edge2->opos - edge->opos;\n        org_center = org_pos + ( org_len >> 1 );\n\n        cur_len = af_latin_compute_stem_width(\n                    hints, dim, org_len,\n                    (AF_Edge_Flags)edge->flags,\n                    (AF_Edge_Flags)edge2->flags );\n\n        if ( edge2->flags & AF_EDGE_DONE )\n        {\n          FT_TRACE5(( \"  ADJUST: edge %d (pos=%.2f) moved to %.2f\\n\",\n                      edge - edges, edge->pos / 64.0,\n                      ( edge2->pos - cur_len ) / 64.0 ));\n\n          edge->pos = edge2->pos - cur_len;\n        }\n\n        else if ( cur_len < 96 )\n        {\n          FT_Pos  u_off, d_off;\n\n\n          cur_pos1 = FT_PIX_ROUND( org_center );\n\n          if ( cur_len <= 64 )\n          {\n            u_off = 32;\n            d_off = 32;\n          }\n          else\n          {\n            u_off = 38;\n            d_off = 26;\n          }\n\n          delta1 = org_center - ( cur_pos1 - u_off );\n          if ( delta1 < 0 )\n            delta1 = -delta1;\n\n          delta2 = org_center - ( cur_pos1 + d_off );\n          if ( delta2 < 0 )\n            delta2 = -delta2;\n\n          if ( delta1 < delta2 )\n            cur_pos1 -= u_off;\n          else\n            cur_pos1 += d_off;\n\n          edge->pos  = cur_pos1 - cur_len / 2;\n          edge2->pos = cur_pos1 + cur_len / 2;\n\n          FT_TRACE5(( \"  STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)\"\n                      \" snapped to %.2f and %.2f\\n\",\n                      edge - edges, edge->opos / 64.0,\n                      edge2 - edges, edge2->opos / 64.0,\n                      edge->pos / 64.0, edge2->pos / 64.0 ));\n        }\n\n        else\n        {\n          org_pos    = anchor->pos + ( edge->opos - anchor->opos );\n          org_len    = edge2->opos - edge->opos;\n          org_center = org_pos + ( org_len >> 1 );\n\n          cur_len    = af_latin_compute_stem_width(\n                         hints, dim, org_len,\n                         (AF_Edge_Flags)edge->flags,\n                         (AF_Edge_Flags)edge2->flags );\n\n          cur_pos1 = FT_PIX_ROUND( org_pos );\n          delta1   = cur_pos1 + ( cur_len >> 1 ) - org_center;\n          if ( delta1 < 0 )\n            delta1 = -delta1;\n\n          cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len;\n          delta2   = cur_pos2 + ( cur_len >> 1 ) - org_center;\n          if ( delta2 < 0 )\n            delta2 = -delta2;\n\n          edge->pos  = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2;\n          edge2->pos = edge->pos + cur_len;\n\n          FT_TRACE5(( \"  STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)\"\n                      \" snapped to %.2f and %.2f\\n\",\n                      edge - edges, edge->opos / 64.0,\n                      edge2 - edges, edge2->opos / 64.0,\n                      edge->pos / 64.0, edge2->pos / 64.0 ));\n        }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        num_actions++;\n#endif\n\n        edge->flags  |= AF_EDGE_DONE;\n        edge2->flags |= AF_EDGE_DONE;\n\n        if ( edge > edges && edge->pos < edge[-1].pos )\n        {\n#ifdef FT_DEBUG_LEVEL_TRACE\n          FT_TRACE5(( \"  BOUND: edge %d (pos=%.2f) moved to %.2f\\n\",\n                      edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));\n\n          num_actions++;\n#endif\n\n          edge->pos = edge[-1].pos;\n        }\n      }\n    }\n\n    /* make sure that lowercase m's maintain their symmetry */\n\n    /* In general, lowercase m's have six vertical edges if they are sans */\n    /* serif, or twelve if they are with serifs.  This implementation is  */\n    /* based on that assumption, and seems to work very well with most    */\n    /* faces.  However, if for a certain face this assumption is not      */\n    /* true, the m is just rendered like before.  In addition, any stem   */\n    /* correction will only be applied to symmetrical glyphs (even if the */\n    /* glyph is not an m), so the potential for unwanted distortion is    */\n    /* relatively low.                                                    */\n\n    /* We don't handle horizontal edges since we can't easily assure that */\n    /* the third (lowest) stem aligns with the base line; it might end up */\n    /* one pixel higher or lower.                                         */\n\n    n_edges = edge_limit - edges;\n    if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) )\n    {\n      AF_Edge  edge1, edge2, edge3;\n      FT_Pos   dist1, dist2, span, delta;\n\n\n      if ( n_edges == 6 )\n      {\n        edge1 = edges;\n        edge2 = edges + 2;\n        edge3 = edges + 4;\n      }\n      else\n      {\n        edge1 = edges + 1;\n        edge2 = edges + 5;\n        edge3 = edges + 9;\n      }\n\n      dist1 = edge2->opos - edge1->opos;\n      dist2 = edge3->opos - edge2->opos;\n\n      span = dist1 - dist2;\n      if ( span < 0 )\n        span = -span;\n\n      if ( span < 8 )\n      {\n        delta = edge3->pos - ( 2 * edge2->pos - edge1->pos );\n        edge3->pos -= delta;\n        if ( edge3->link )\n          edge3->link->pos -= delta;\n\n        /* move the serifs along with the stem */\n        if ( n_edges == 12 )\n        {\n          ( edges + 8 )->pos -= delta;\n          ( edges + 11 )->pos -= delta;\n        }\n\n        edge3->flags |= AF_EDGE_DONE;\n        if ( edge3->link )\n          edge3->link->flags |= AF_EDGE_DONE;\n      }\n    }\n\n    if ( has_serifs || !anchor )\n    {\n      /*\n       *  now hint the remaining edges (serifs and single) in order\n       *  to complete our processing\n       */\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        FT_Pos  delta;\n\n\n        if ( edge->flags & AF_EDGE_DONE )\n          continue;\n\n        delta = 1000;\n\n        if ( edge->serif )\n        {\n          delta = edge->serif->opos - edge->opos;\n          if ( delta < 0 )\n            delta = -delta;\n        }\n\n        if ( delta < 64 + 16 )\n        {\n          af_latin_align_serif_edge( hints, edge->serif, edge );\n          FT_TRACE5(( \"  SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)\"\n                      \" aligned to %.2f\\n\",\n                      edge - edges, edge->opos / 64.0,\n                      edge->serif - edges, edge->serif->opos / 64.0,\n                      edge->pos / 64.0 ));\n        }\n        else if ( !anchor )\n        {\n          edge->pos = FT_PIX_ROUND( edge->opos );\n          anchor    = edge;\n          FT_TRACE5(( \"  SERIF_ANCHOR: edge %d (opos=%.2f)\"\n                      \" snapped to %.2f\\n\",\n                      edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));\n        }\n        else\n        {\n          AF_Edge  before, after;\n\n\n          for ( before = edge - 1; before >= edges; before-- )\n            if ( before->flags & AF_EDGE_DONE )\n              break;\n\n          for ( after = edge + 1; after < edge_limit; after++ )\n            if ( after->flags & AF_EDGE_DONE )\n              break;\n\n          if ( before >= edges && before < edge   &&\n               after < edge_limit && after > edge )\n          {\n            if ( after->opos == before->opos )\n              edge->pos = before->pos;\n            else\n              edge->pos = before->pos +\n                          FT_MulDiv( edge->opos - before->opos,\n                                     after->pos - before->pos,\n                                     after->opos - before->opos );\n\n            FT_TRACE5(( \"  SERIF_LINK1: edge %d (opos=%.2f) snapped to %.2f\"\n                        \" from %d (opos=%.2f)\\n\",\n                        edge - edges, edge->opos / 64.0,\n                        edge->pos / 64.0,\n                        before - edges, before->opos / 64.0 ));\n          }\n          else\n          {\n            edge->pos = anchor->pos +\n                        ( ( edge->opos - anchor->opos + 16 ) & ~31 );\n            FT_TRACE5(( \"  SERIF_LINK2: edge %d (opos=%.2f)\"\n                        \" snapped to %.2f\\n\",\n                        edge - edges, edge->opos / 64.0, edge->pos / 64.0 ));\n          }\n        }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        num_actions++;\n#endif\n        edge->flags |= AF_EDGE_DONE;\n\n        if ( edge > edges && edge->pos < edge[-1].pos )\n        {\n#ifdef FT_DEBUG_LEVEL_TRACE\n          FT_TRACE5(( \"  BOUND: edge %d (pos=%.2f) moved to %.2f\\n\",\n                      edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));\n\n          num_actions++;\n#endif\n          edge->pos = edge[-1].pos;\n        }\n\n        if ( edge + 1 < edge_limit        &&\n             edge[1].flags & AF_EDGE_DONE &&\n             edge->pos > edge[1].pos      )\n        {\n#ifdef FT_DEBUG_LEVEL_TRACE\n          FT_TRACE5(( \"  BOUND: edge %d (pos=%.2f) moved to %.2f\\n\",\n                      edge - edges, edge->pos / 64.0, edge[1].pos / 64.0 ));\n\n          num_actions++;\n#endif\n\n          edge->pos = edge[1].pos;\n        }\n      }\n    }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    if ( !num_actions )\n      FT_TRACE5(( \"  (none)\\n\" ));\n    FT_TRACE5(( \"\\n\" ));\n#endif\n  }\n\n\n  /* Apply the complete hinting algorithm to a latin glyph. */\n\n  static FT_Error\n  af_latin_hints_apply( AF_GlyphHints    hints,\n                        FT_Outline*      outline,\n                        AF_LatinMetrics  metrics )\n  {\n    FT_Error  error;\n    int       dim;\n\n\n    error = af_glyph_hints_reload( hints, outline );\n    if ( error )\n      goto Exit;\n\n    /* analyze glyph outline */\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n    if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ||\n         AF_HINTS_DO_HORIZONTAL( hints )                          )\n#else\n    if ( AF_HINTS_DO_HORIZONTAL( hints ) )\n#endif\n    {\n      error = af_latin_hints_detect_features( hints, AF_DIMENSION_HORZ );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( AF_HINTS_DO_VERTICAL( hints ) )\n    {\n      error = af_latin_hints_detect_features( hints, AF_DIMENSION_VERT );\n      if ( error )\n        goto Exit;\n\n      af_latin_hints_compute_blue_edges( hints, metrics );\n    }\n\n    /* grid-fit the outline */\n    for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n    {\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n      if ( dim == AF_DIMENSION_HORZ                                 &&\n           metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT )\n      {\n        AF_WarperRec  warper;\n        FT_Fixed      scale;\n        FT_Pos        delta;\n\n\n        af_warper_compute( &warper, hints, (AF_Dimension)dim,\n                           &scale, &delta );\n        af_glyph_hints_scale_dim( hints, (AF_Dimension)dim,\n                                  scale, delta );\n        continue;\n      }\n#endif\n\n      if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) ||\n           ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) )   )\n      {\n        af_latin_hint_edges( hints, (AF_Dimension)dim );\n        af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim );\n        af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim );\n        af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim );\n      }\n    }\n    af_glyph_hints_save( hints, outline );\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****              L A T I N   S C R I P T   C L A S S              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* XXX: this should probably fine tuned to differentiate better between */\n  /*      scripts...                                                      */\n\n  static const AF_Script_UniRangeRec  af_latin_uniranges[] =\n  {\n    AF_UNIRANGE_REC(  0x0020UL,  0x007FUL ),  /* Basic Latin (no control chars) */\n    AF_UNIRANGE_REC(  0x00A0UL,  0x00FFUL ),  /* Latin-1 Supplement (no control chars) */\n    AF_UNIRANGE_REC(  0x0100UL,  0x017FUL ),  /* Latin Extended-A */\n    AF_UNIRANGE_REC(  0x0180UL,  0x024FUL ),  /* Latin Extended-B */\n    AF_UNIRANGE_REC(  0x0250UL,  0x02AFUL ),  /* IPA Extensions */\n    AF_UNIRANGE_REC(  0x02B0UL,  0x02FFUL ),  /* Spacing Modifier Letters */\n    AF_UNIRANGE_REC(  0x0300UL,  0x036FUL ),  /* Combining Diacritical Marks */\n    AF_UNIRANGE_REC(  0x0370UL,  0x03FFUL ),  /* Greek and Coptic */\n    AF_UNIRANGE_REC(  0x0400UL,  0x04FFUL ),  /* Cyrillic */\n    AF_UNIRANGE_REC(  0x0500UL,  0x052FUL ),  /* Cyrillic Supplement */\n    AF_UNIRANGE_REC(  0x1D00UL,  0x1D7FUL ),  /* Phonetic Extensions */\n    AF_UNIRANGE_REC(  0x1D80UL,  0x1DBFUL ),  /* Phonetic Extensions Supplement */\n    AF_UNIRANGE_REC(  0x1DC0UL,  0x1DFFUL ),  /* Combining Diacritical Marks Supplement */\n    AF_UNIRANGE_REC(  0x1E00UL,  0x1EFFUL ),  /* Latin Extended Additional */\n    AF_UNIRANGE_REC(  0x1F00UL,  0x1FFFUL ),  /* Greek Extended */\n    AF_UNIRANGE_REC(  0x2000UL,  0x206FUL ),  /* General Punctuation */\n    AF_UNIRANGE_REC(  0x2070UL,  0x209FUL ),  /* Superscripts and Subscripts */\n    AF_UNIRANGE_REC(  0x20A0UL,  0x20CFUL ),  /* Currency Symbols */\n    AF_UNIRANGE_REC(  0x2150UL,  0x218FUL ),  /* Number Forms */\n    AF_UNIRANGE_REC(  0x2460UL,  0x24FFUL ),  /* Enclosed Alphanumerics */\n    AF_UNIRANGE_REC(  0x2C60UL,  0x2C7FUL ),  /* Latin Extended-C */\n    AF_UNIRANGE_REC(  0x2DE0UL,  0x2DFFUL ),  /* Cyrillic Extended-A */\n    AF_UNIRANGE_REC(  0x2E00UL,  0x2E7FUL ),  /* Supplemental Punctuation */\n    AF_UNIRANGE_REC(  0xA640UL,  0xA69FUL ),  /* Cyrillic Extended-B */\n    AF_UNIRANGE_REC(  0xA720UL,  0xA7FFUL ),  /* Latin Extended-D */\n    AF_UNIRANGE_REC(  0xFB00UL,  0xFB06UL ),  /* Alphab. Present. Forms (Latin Ligs) */\n    AF_UNIRANGE_REC( 0x1D400UL, 0x1D7FFUL ),  /* Mathematical Alphanumeric Symbols */\n    AF_UNIRANGE_REC( 0x1F100UL, 0x1F1FFUL ),  /* Enclosed Alphanumeric Supplement */\n    AF_UNIRANGE_REC(       0UL,       0UL )\n  };\n\n\n  AF_DEFINE_SCRIPT_CLASS( af_latin_script_class,\n    AF_SCRIPT_LATIN,\n    af_latin_uniranges,\n    'o',\n\n    sizeof ( AF_LatinMetricsRec ),\n\n    (AF_Script_InitMetricsFunc) af_latin_metrics_init,\n    (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale,\n    (AF_Script_DoneMetricsFunc) NULL,\n\n    (AF_Script_InitHintsFunc)   af_latin_hints_init,\n    (AF_Script_ApplyHintsFunc)  af_latin_hints_apply\n  )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/aflatin.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  aflatin.h                                                              */\n/*                                                                         */\n/*    Auto-fitter hinting routines for latin script (specification).       */\n/*                                                                         */\n/*  Copyright 2003-2007, 2009, 2011-2012 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFLATIN_H__\n#define __AFLATIN_H__\n\n#include \"afhints.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* the latin-specific script class */\n\n  AF_DECLARE_SCRIPT_CLASS( af_latin_script_class )\n\n\n  /* constants are given with units_per_em == 2048 in mind */\n#define AF_LATIN_CONSTANT( metrics, c )                                      \\\n  ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****            L A T I N   G L O B A L   M E T R I C S            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*\n   *  The following declarations could be embedded in the file `aflatin.c';\n   *  they have been made semi-public to allow alternate script hinters to\n   *  re-use some of them.\n   */\n\n\n  /* Latin (global) metrics management */\n\n  enum\n  {\n    AF_LATIN_BLUE_CAPITAL_TOP,\n    AF_LATIN_BLUE_CAPITAL_BOTTOM,\n    AF_LATIN_BLUE_SMALL_F_TOP,\n    AF_LATIN_BLUE_SMALL_TOP,\n    AF_LATIN_BLUE_SMALL_BOTTOM,\n    AF_LATIN_BLUE_SMALL_MINOR,\n\n    AF_LATIN_BLUE_MAX\n  };\n\n\n#define AF_LATIN_IS_TOP_BLUE( b )  ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \\\n                                     (b) == AF_LATIN_BLUE_SMALL_F_TOP || \\\n                                     (b) == AF_LATIN_BLUE_SMALL_TOP   )\n\n#define AF_LATIN_MAX_WIDTHS  16\n#define AF_LATIN_MAX_BLUES   AF_LATIN_BLUE_MAX\n\n\n  enum\n  {\n    AF_LATIN_BLUE_ACTIVE     = 1 << 0,  /* set if zone height is <= 3/4px */\n    AF_LATIN_BLUE_TOP        = 1 << 1,  /* result of AF_LATIN_IS_TOP_BLUE */\n    AF_LATIN_BLUE_ADJUSTMENT = 1 << 2,  /* used for scale adjustment      */\n                                        /* optimization                   */\n    AF_LATIN_BLUE_FLAG_MAX\n  };\n\n\n  typedef struct  AF_LatinBlueRec_\n  {\n    AF_WidthRec  ref;\n    AF_WidthRec  shoot;\n    FT_UInt      flags;\n\n  } AF_LatinBlueRec, *AF_LatinBlue;\n\n\n  typedef struct  AF_LatinAxisRec_\n  {\n    FT_Fixed         scale;\n    FT_Pos           delta;\n\n    FT_UInt          width_count;                 /* number of used widths */\n    AF_WidthRec      widths[AF_LATIN_MAX_WIDTHS]; /* widths array          */\n    FT_Pos           edge_distance_threshold;   /* used for creating edges */\n    FT_Pos           standard_width;         /* the default stem thickness */\n    FT_Bool          extra_light;         /* is standard width very light? */\n\n    /* ignored for horizontal metrics */\n    FT_UInt          blue_count;\n    AF_LatinBlueRec  blues[AF_LATIN_BLUE_MAX];\n\n    FT_Fixed         org_scale;\n    FT_Pos           org_delta;\n\n  } AF_LatinAxisRec, *AF_LatinAxis;\n\n\n  typedef struct  AF_LatinMetricsRec_\n  {\n    AF_ScriptMetricsRec  root;\n    FT_UInt              units_per_em;\n    AF_LatinAxisRec      axis[AF_DIMENSION_MAX];\n\n  } AF_LatinMetricsRec, *AF_LatinMetrics;\n\n\n  FT_LOCAL( FT_Error )\n  af_latin_metrics_init( AF_LatinMetrics  metrics,\n                         FT_Face          face );\n\n  FT_LOCAL( void )\n  af_latin_metrics_scale( AF_LatinMetrics  metrics,\n                          AF_Scaler        scaler );\n\n  FT_LOCAL( void )\n  af_latin_metrics_init_widths( AF_LatinMetrics  metrics,\n                                FT_Face          face );\n\n  FT_LOCAL( void )\n  af_latin_metrics_check_digits( AF_LatinMetrics  metrics,\n                                 FT_Face          face );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  enum\n  {\n    AF_LATIN_HINTS_HORZ_SNAP   = 1 << 0, /* enable stem width snapping  */\n    AF_LATIN_HINTS_VERT_SNAP   = 1 << 1, /* enable stem height snapping */\n    AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height    */\n                                         /* adjustment                  */\n    AF_LATIN_HINTS_MONO        = 1 << 3  /* indicate monochrome         */\n                                         /* rendering                   */\n  };\n\n\n#define AF_LATIN_HINTS_DO_HORZ_SNAP( h )             \\\n  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP )\n\n#define AF_LATIN_HINTS_DO_VERT_SNAP( h )             \\\n  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP )\n\n#define AF_LATIN_HINTS_DO_STEM_ADJUST( h )             \\\n  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST )\n\n#define AF_LATIN_HINTS_DO_MONO( h )             \\\n  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO )\n\n\n  /*\n   *  The next functions shouldn't normally be exported.  However, other\n   *  scripts might like to use these functions as-is.\n   */\n  FT_LOCAL( FT_Error )\n  af_latin_hints_compute_segments( AF_GlyphHints  hints,\n                                   AF_Dimension   dim );\n\n  FT_LOCAL( void )\n  af_latin_hints_link_segments( AF_GlyphHints  hints,\n                                AF_Dimension   dim );\n\n  FT_LOCAL( FT_Error )\n  af_latin_hints_compute_edges( AF_GlyphHints  hints,\n                                AF_Dimension   dim );\n\n  FT_LOCAL( FT_Error )\n  af_latin_hints_detect_features( AF_GlyphHints  hints,\n                                  AF_Dimension   dim );\n\n/* */\n\nFT_END_HEADER\n\n#endif /* __AFLATIN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/aflatin2.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  aflatin2.c                                                             */\n/*                                                                         */\n/*    Auto-fitter hinting routines for latin script (body).                */\n/*                                                                         */\n/*  Copyright 2003-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include FT_ADVANCES_H\n\n#include \"afglobal.h\"\n#include \"aflatin.h\"\n#include \"aflatin2.h\"\n#include \"aferrors.h\"\n\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n#include \"afwarp.h\"\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_aflatin2\n\n\n  FT_LOCAL_DEF( FT_Error )\n  af_latin2_hints_compute_segments( AF_GlyphHints  hints,\n                                    AF_Dimension   dim );\n\n  FT_LOCAL_DEF( void )\n  af_latin2_hints_link_segments( AF_GlyphHints  hints,\n                                 AF_Dimension   dim );\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****            L A T I N   G L O B A L   M E T R I C S            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  af_latin2_metrics_init_widths( AF_LatinMetrics  metrics,\n                                 FT_Face          face )\n  {\n    /* scan the array of segments in each direction */\n    AF_GlyphHintsRec  hints[1];\n\n\n    af_glyph_hints_init( hints, face->memory );\n\n    metrics->axis[AF_DIMENSION_HORZ].width_count = 0;\n    metrics->axis[AF_DIMENSION_VERT].width_count = 0;\n\n    {\n      FT_Error             error;\n      FT_UInt              glyph_index;\n      int                  dim;\n      AF_LatinMetricsRec   dummy[1];\n      AF_Scaler            scaler = &dummy->root.scaler;\n\n\n      glyph_index = FT_Get_Char_Index( face,\n                                       metrics->root.clazz->standard_char );\n      if ( glyph_index == 0 )\n        goto Exit;\n\n      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );\n      if ( error || face->glyph->outline.n_points <= 0 )\n        goto Exit;\n\n      FT_ZERO( dummy );\n\n      dummy->units_per_em = metrics->units_per_em;\n      scaler->x_scale     = scaler->y_scale = 0x10000L;\n      scaler->x_delta     = scaler->y_delta = 0;\n      scaler->face        = face;\n      scaler->render_mode = FT_RENDER_MODE_NORMAL;\n      scaler->flags       = 0;\n\n      af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy );\n\n      error = af_glyph_hints_reload( hints, &face->glyph->outline );\n      if ( error )\n        goto Exit;\n\n      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n      {\n        AF_LatinAxis  axis    = &metrics->axis[dim];\n        AF_AxisHints  axhints = &hints->axis[dim];\n        AF_Segment    seg, limit, link;\n        FT_UInt       num_widths = 0;\n\n\n        error = af_latin2_hints_compute_segments( hints,\n                                                 (AF_Dimension)dim );\n        if ( error )\n          goto Exit;\n\n        af_latin2_hints_link_segments( hints,\n                                      (AF_Dimension)dim );\n\n        seg   = axhints->segments;\n        limit = seg + axhints->num_segments;\n\n        for ( ; seg < limit; seg++ )\n        {\n          link = seg->link;\n\n          /* we only consider stem segments there! */\n          if ( link && link->link == seg && link > seg )\n          {\n            FT_Pos  dist;\n\n\n            dist = seg->pos - link->pos;\n            if ( dist < 0 )\n              dist = -dist;\n\n            if ( num_widths < AF_LATIN_MAX_WIDTHS )\n              axis->widths[num_widths++].org = dist;\n          }\n        }\n\n        af_sort_widths( num_widths, axis->widths );\n        axis->width_count = num_widths;\n      }\n\n  Exit:\n      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n      {\n        AF_LatinAxis  axis = &metrics->axis[dim];\n        FT_Pos        stdw;\n\n\n        stdw = ( axis->width_count > 0 )\n                 ? axis->widths[0].org\n                 : AF_LATIN_CONSTANT( metrics, 50 );\n\n        /* let's try 20% of the smallest width */\n        axis->edge_distance_threshold = stdw / 5;\n        axis->standard_width          = stdw;\n        axis->extra_light             = 0;\n      }\n    }\n\n    af_glyph_hints_done( hints );\n  }\n\n\n\n#define AF_LATIN_MAX_TEST_CHARACTERS  12\n\n\n  static const char af_latin2_blue_chars[AF_LATIN_MAX_BLUES]\n                                        [AF_LATIN_MAX_TEST_CHARACTERS+1] =\n  {\n    \"THEZOCQS\",\n    \"HEZLOCUS\",\n    \"fijkdbh\",\n    \"xzroesc\",\n    \"xzroesc\",\n    \"pqgjy\"\n  };\n\n\n  static void\n  af_latin2_metrics_init_blues( AF_LatinMetrics  metrics,\n                                FT_Face          face )\n  {\n    FT_Pos        flats [AF_LATIN_MAX_TEST_CHARACTERS];\n    FT_Pos        rounds[AF_LATIN_MAX_TEST_CHARACTERS];\n    FT_Int        num_flats;\n    FT_Int        num_rounds;\n    FT_Int        bb;\n    AF_LatinBlue  blue;\n    FT_Error      error;\n    AF_LatinAxis  axis  = &metrics->axis[AF_DIMENSION_VERT];\n    FT_GlyphSlot  glyph = face->glyph;\n\n\n    /* we compute the blues simply by loading each character from the     */\n    /* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */\n    /* bottom-most points (depending on `AF_IS_TOP_BLUE')                 */\n\n    FT_TRACE5(( \"blue zones computation\\n\"\n                \"======================\\n\\n\" ));\n\n    for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )\n    {\n      const char*  p     = af_latin2_blue_chars[bb];\n      const char*  limit = p + AF_LATIN_MAX_TEST_CHARACTERS;\n      FT_Pos*      blue_ref;\n      FT_Pos*      blue_shoot;\n\n\n      FT_TRACE5(( \"blue zone %d:\\n\", bb ));\n\n      num_flats  = 0;\n      num_rounds = 0;\n\n      for ( ; p < limit && *p; p++ )\n      {\n        FT_UInt     glyph_index;\n        FT_Int      best_point, best_y, best_first, best_last;\n        FT_Vector*  points;\n        FT_Bool     round;\n\n\n        /* load the character in the face -- skip unknown or empty ones */\n        glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p );\n        if ( glyph_index == 0 )\n          continue;\n\n        error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );\n        if ( error || glyph->outline.n_points <= 0 )\n          continue;\n\n        /* now compute min or max point indices and coordinates */\n        points      = glyph->outline.points;\n        best_point  = -1;\n        best_y      = 0;  /* make compiler happy */\n        best_first  = 0;  /* ditto */\n        best_last   = 0;  /* ditto */\n\n        {\n          FT_Int  nn;\n          FT_Int  first = 0;\n          FT_Int  last  = -1;\n\n\n          for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ )\n          {\n            FT_Int  old_best_point = best_point;\n            FT_Int  pp;\n\n\n            last = glyph->outline.contours[nn];\n\n            /* Avoid single-point contours since they are never rasterized. */\n            /* In some fonts, they correspond to mark attachment points     */\n            /* which are way outside of the glyph's real outline.           */\n            if ( last == first )\n                continue;\n\n            if ( AF_LATIN_IS_TOP_BLUE( bb ) )\n            {\n              for ( pp = first; pp <= last; pp++ )\n                if ( best_point < 0 || points[pp].y > best_y )\n                {\n                  best_point = pp;\n                  best_y     = points[pp].y;\n                }\n            }\n            else\n            {\n              for ( pp = first; pp <= last; pp++ )\n                if ( best_point < 0 || points[pp].y < best_y )\n                {\n                  best_point = pp;\n                  best_y     = points[pp].y;\n                }\n            }\n\n            if ( best_point != old_best_point )\n            {\n              best_first = first;\n              best_last  = last;\n            }\n          }\n          FT_TRACE5(( \"  %c  %d\", *p, best_y ));\n        }\n\n        /* now check whether the point belongs to a straight or round   */\n        /* segment; we first need to find in which contour the extremum */\n        /* lies, then inspect its previous and next points              */\n        {\n          FT_Pos  best_x = points[best_point].x;\n          FT_Int  start, end, prev, next;\n          FT_Pos  dist;\n\n\n          /* now look for the previous and next points that are not on the */\n          /* same Y coordinate.  Threshold the `closeness'...              */\n          start = end = best_point;\n\n          do\n          {\n            prev = start - 1;\n            if ( prev < best_first )\n              prev = best_last;\n\n            dist = FT_ABS( points[prev].y - best_y );\n            /* accept a small distance or a small angle (both values are */\n            /* heuristic; value 20 corresponds to approx. 2.9 degrees)   */\n            if ( dist > 5 )\n              if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist )\n                break;\n\n            start = prev;\n\n          } while ( start != best_point );\n\n          do\n          {\n            next = end + 1;\n            if ( next > best_last )\n              next = best_first;\n\n            dist = FT_ABS( points[next].y - best_y );\n            if ( dist > 5 )\n              if ( FT_ABS( points[next].x - best_x ) <= 20 * dist )\n                break;\n\n            end = next;\n\n          } while ( end != best_point );\n\n          /* now, set the `round' flag depending on the segment's kind */\n          round = FT_BOOL(\n            FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON ||\n            FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON );\n\n          FT_TRACE5(( \" (%s)\\n\", round ? \"round\" : \"flat\" ));\n        }\n\n        if ( round )\n          rounds[num_rounds++] = best_y;\n        else\n          flats[num_flats++]   = best_y;\n      }\n\n      if ( num_flats == 0 && num_rounds == 0 )\n      {\n        /*\n         *  we couldn't find a single glyph to compute this blue zone,\n         *  we will simply ignore it then\n         */\n        FT_TRACE5(( \"  empty\\n\" ));\n        continue;\n      }\n\n      /* we have computed the contents of the `rounds' and `flats' tables, */\n      /* now determine the reference and overshoot position of the blue -- */\n      /* we simply take the median value after a simple sort               */\n      af_sort_pos( num_rounds, rounds );\n      af_sort_pos( num_flats,  flats );\n\n      blue       = & axis->blues[axis->blue_count];\n      blue_ref   = & blue->ref.org;\n      blue_shoot = & blue->shoot.org;\n\n      axis->blue_count++;\n\n      if ( num_flats == 0 )\n      {\n        *blue_ref   =\n        *blue_shoot = rounds[num_rounds / 2];\n      }\n      else if ( num_rounds == 0 )\n      {\n        *blue_ref   =\n        *blue_shoot = flats[num_flats / 2];\n      }\n      else\n      {\n        *blue_ref   = flats[num_flats / 2];\n        *blue_shoot = rounds[num_rounds / 2];\n      }\n\n      /* there are sometimes problems: if the overshoot position of top     */\n      /* zones is under its reference position, or the opposite for bottom  */\n      /* zones.  We must thus check everything there and correct the errors */\n      if ( *blue_shoot != *blue_ref )\n      {\n        FT_Pos   ref      = *blue_ref;\n        FT_Pos   shoot    = *blue_shoot;\n        FT_Bool  over_ref = FT_BOOL( shoot > ref );\n\n\n        if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref )\n        {\n          *blue_ref   =\n          *blue_shoot = ( shoot + ref ) / 2;\n\n          FT_TRACE5(( \"  [overshoot smaller than reference,\"\n                      \" taking mean value]\\n\" ));\n        }\n      }\n\n      blue->flags = 0;\n      if ( AF_LATIN_IS_TOP_BLUE( bb ) )\n        blue->flags |= AF_LATIN_BLUE_TOP;\n\n      /*\n       * The following flags is used later to adjust the y and x scales\n       * in order to optimize the pixel grid alignment of the top of small\n       * letters.\n       */\n      if ( bb == AF_LATIN_BLUE_SMALL_TOP )\n        blue->flags |= AF_LATIN_BLUE_ADJUSTMENT;\n\n      FT_TRACE5(( \"    -> reference = %ld\\n\"\n                  \"       overshoot = %ld\\n\",\n                  *blue_ref, *blue_shoot ));\n    }\n\n    return;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_latin2_metrics_check_digits( AF_LatinMetrics  metrics,\n                                  FT_Face          face )\n  {\n    FT_UInt   i;\n    FT_Bool   started = 0, same_width = 1;\n    FT_Fixed  advance, old_advance = 0;\n\n\n    /* check whether all ASCII digits have the same advance width; */\n    /* digit `0' is 0x30 in all supported charmaps                 */\n    for ( i = 0x30; i <= 0x39; i++ )\n    {\n      FT_UInt  glyph_index;\n\n\n      glyph_index = FT_Get_Char_Index( face, i );\n      if ( glyph_index == 0 )\n        continue;\n\n      if ( FT_Get_Advance( face, glyph_index,\n                           FT_LOAD_NO_SCALE         |\n                           FT_LOAD_NO_HINTING       |\n                           FT_LOAD_IGNORE_TRANSFORM,\n                           &advance ) )\n        continue;\n\n      if ( started )\n      {\n        if ( advance != old_advance )\n        {\n          same_width = 0;\n          break;\n        }\n      }\n      else\n      {\n        old_advance = advance;\n        started     = 1;\n      }\n    }\n\n    metrics->root.digits_have_same_width = same_width;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  af_latin2_metrics_init( AF_LatinMetrics  metrics,\n                          FT_Face          face )\n  {\n    FT_Error    error  = FT_Err_Ok;\n    FT_CharMap  oldmap = face->charmap;\n    FT_UInt     ee;\n\n    static const FT_Encoding  latin_encodings[] =\n    {\n      FT_ENCODING_UNICODE,\n      FT_ENCODING_APPLE_ROMAN,\n      FT_ENCODING_ADOBE_STANDARD,\n      FT_ENCODING_ADOBE_LATIN_1,\n      FT_ENCODING_NONE  /* end of list */\n    };\n\n\n    metrics->units_per_em = face->units_per_EM;\n\n    /* do we have a latin charmap in there? */\n    for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ )\n    {\n      error = FT_Select_Charmap( face, latin_encodings[ee] );\n      if ( !error )\n        break;\n    }\n\n    if ( !error )\n    {\n      af_latin2_metrics_init_widths( metrics, face );\n      af_latin2_metrics_init_blues( metrics, face );\n      af_latin2_metrics_check_digits( metrics, face );\n    }\n\n    FT_Set_Charmap( face, oldmap );\n    return FT_Err_Ok;\n  }\n\n\n  static void\n  af_latin2_metrics_scale_dim( AF_LatinMetrics  metrics,\n                               AF_Scaler        scaler,\n                               AF_Dimension     dim )\n  {\n    FT_Fixed      scale;\n    FT_Pos        delta;\n    AF_LatinAxis  axis;\n    FT_UInt       nn;\n\n\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      scale = scaler->x_scale;\n      delta = scaler->x_delta;\n    }\n    else\n    {\n      scale = scaler->y_scale;\n      delta = scaler->y_delta;\n    }\n\n    axis = &metrics->axis[dim];\n\n    if ( axis->org_scale == scale && axis->org_delta == delta )\n      return;\n\n    axis->org_scale = scale;\n    axis->org_delta = delta;\n\n    /*\n     * correct Y scale to optimize the alignment of the top of small\n     * letters to the pixel grid\n     */\n    if ( dim == AF_DIMENSION_VERT )\n    {\n      AF_LatinAxis  vaxis = &metrics->axis[AF_DIMENSION_VERT];\n      AF_LatinBlue  blue = NULL;\n\n\n      for ( nn = 0; nn < vaxis->blue_count; nn++ )\n      {\n        if ( vaxis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT )\n        {\n          blue = &vaxis->blues[nn];\n          break;\n        }\n      }\n\n      if ( blue )\n      {\n        FT_Pos   scaled;\n        FT_Pos   threshold;\n        FT_Pos   fitted;\n        FT_UInt  limit;\n        FT_UInt  ppem;\n\n\n        scaled    = FT_MulFix( blue->shoot.org, scaler->y_scale );\n        ppem      = metrics->root.scaler.face->size->metrics.x_ppem;\n        limit     = metrics->root.globals->increase_x_height;\n        threshold = 40;\n\n        /* if the `increase-x-height' property is active, */\n        /* we round up much more often                    */\n        if ( limit                                 &&\n             ppem <= limit                         &&\n             ppem >= AF_PROP_INCREASE_X_HEIGHT_MIN )\n          threshold = 52;\n\n        fitted = ( scaled + threshold ) & ~63;\n\n#if 1\n        if ( scaled != fitted )\n        {\n          scale = FT_MulDiv( scale, fitted, scaled );\n          FT_TRACE5(( \"== scaled x-top = %.2g\"\n                      \"  fitted = %.2g, scaling = %.4g\\n\",\n                      scaled / 64.0, fitted / 64.0,\n                      ( fitted * 1.0 ) / scaled ));\n        }\n#endif\n      }\n    }\n\n    axis->scale = scale;\n    axis->delta = delta;\n\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      metrics->root.scaler.x_scale = scale;\n      metrics->root.scaler.x_delta = delta;\n    }\n    else\n    {\n      metrics->root.scaler.y_scale = scale;\n      metrics->root.scaler.y_delta = delta;\n    }\n\n    /* scale the standard widths */\n    for ( nn = 0; nn < axis->width_count; nn++ )\n    {\n      AF_Width  width = axis->widths + nn;\n\n\n      width->cur = FT_MulFix( width->org, scale );\n      width->fit = width->cur;\n    }\n\n    /* an extra-light axis corresponds to a standard width that is */\n    /* smaller than 5/8 pixels                                     */\n    axis->extra_light =\n      (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 );\n\n    if ( dim == AF_DIMENSION_VERT )\n    {\n      /* scale the blue zones */\n      for ( nn = 0; nn < axis->blue_count; nn++ )\n      {\n        AF_LatinBlue  blue = &axis->blues[nn];\n        FT_Pos        dist;\n\n\n        blue->ref.cur   = FT_MulFix( blue->ref.org, scale ) + delta;\n        blue->ref.fit   = blue->ref.cur;\n        blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta;\n        blue->shoot.fit = blue->shoot.cur;\n        blue->flags    &= ~AF_LATIN_BLUE_ACTIVE;\n\n        /* a blue zone is only active if it is less than 3/4 pixels tall */\n        dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale );\n        if ( dist <= 48 && dist >= -48 )\n        {\n          FT_Pos  delta1, delta2;\n\n          delta1 = blue->shoot.org - blue->ref.org;\n          delta2 = delta1;\n          if ( delta1 < 0 )\n            delta2 = -delta2;\n\n          delta2 = FT_MulFix( delta2, scale );\n\n          if ( delta2 < 32 )\n            delta2 = 0;\n          else if ( delta2 < 64 )\n            delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );\n          else\n            delta2 = FT_PIX_ROUND( delta2 );\n\n          if ( delta1 < 0 )\n            delta2 = -delta2;\n\n          blue->ref.fit   = FT_PIX_ROUND( blue->ref.cur );\n          blue->shoot.fit = blue->ref.fit + delta2;\n\n          FT_TRACE5(( \">> activating blue zone %d:\"\n                      \"  ref.cur=%.2g ref.fit=%.2g\"\n                      \"  shoot.cur=%.2g shoot.fit=%.2g\\n\",\n                      nn, blue->ref.cur / 64.0, blue->ref.fit / 64.0,\n                      blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 ));\n\n          blue->flags |= AF_LATIN_BLUE_ACTIVE;\n        }\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_latin2_metrics_scale( AF_LatinMetrics  metrics,\n                           AF_Scaler        scaler )\n  {\n    metrics->root.scaler.render_mode = scaler->render_mode;\n    metrics->root.scaler.face        = scaler->face;\n    metrics->root.scaler.flags       = scaler->flags;\n\n    af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ );\n    af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define  SORT_SEGMENTS\n\n  FT_LOCAL_DEF( FT_Error )\n  af_latin2_hints_compute_segments( AF_GlyphHints  hints,\n                                    AF_Dimension   dim )\n  {\n    AF_AxisHints  axis          = &hints->axis[dim];\n    FT_Memory     memory        = hints->memory;\n    FT_Error      error         = FT_Err_Ok;\n    AF_Segment    segment       = NULL;\n    AF_SegmentRec seg0;\n    AF_Point*     contour       = hints->contours;\n    AF_Point*     contour_limit = contour + hints->num_contours;\n    AF_Direction  major_dir, segment_dir;\n\n\n    FT_ZERO( &seg0 );\n    seg0.score = 32000;\n    seg0.flags = AF_EDGE_NORMAL;\n\n    major_dir   = (AF_Direction)FT_ABS( axis->major_dir );\n    segment_dir = major_dir;\n\n    axis->num_segments = 0;\n\n    /* set up (u,v) in each point */\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      AF_Point  point = hints->points;\n      AF_Point  limit = point + hints->num_points;\n\n\n      for ( ; point < limit; point++ )\n      {\n        point->u = point->fx;\n        point->v = point->fy;\n      }\n    }\n    else\n    {\n      AF_Point  point = hints->points;\n      AF_Point  limit = point + hints->num_points;\n\n\n      for ( ; point < limit; point++ )\n      {\n        point->u = point->fy;\n        point->v = point->fx;\n      }\n    }\n\n    /* do each contour separately */\n    for ( ; contour < contour_limit; contour++ )\n    {\n      AF_Point  point   =  contour[0];\n      AF_Point  start   =  point;\n      AF_Point  last    =  point->prev;\n\n\n      if ( point == last )  /* skip singletons -- just in case */\n        continue;\n\n      /* already on an edge ?, backtrack to find its start */\n      if ( FT_ABS( point->in_dir ) == major_dir )\n      {\n        point = point->prev;\n\n        while ( point->in_dir == start->in_dir )\n          point = point->prev;\n      }\n      else  /* otherwise, find first segment start, if any */\n      {\n        while ( FT_ABS( point->out_dir ) != major_dir )\n        {\n          point = point->next;\n\n          if ( point == start )\n            goto NextContour;\n        }\n      }\n\n      start = point;\n\n      for  (;;)\n      {\n        AF_Point  first;\n        FT_Pos    min_u, min_v, max_u, max_v;\n\n        /* we're at the start of a new segment */\n        FT_ASSERT( FT_ABS( point->out_dir ) == major_dir &&\n                           point->in_dir != point->out_dir );\n        first = point;\n\n        min_u = max_u = point->u;\n        min_v = max_v = point->v;\n\n        point = point->next;\n\n        while ( point->out_dir == first->out_dir )\n        {\n          point = point->next;\n\n          if ( point->u < min_u )\n            min_u = point->u;\n\n          if ( point->u > max_u )\n            max_u = point->u;\n        }\n\n        if ( point->v < min_v )\n          min_v = point->v;\n\n        if ( point->v > max_v )\n          max_v = point->v;\n\n        /* record new segment */\n        error = af_axis_hints_new_segment( axis, memory, &segment );\n        if ( error )\n          goto Exit;\n\n        segment[0]         = seg0;\n        segment->dir       = first->out_dir;\n        segment->first     = first;\n        segment->last      = point;\n        segment->pos       = (FT_Short)( ( min_u + max_u ) >> 1 );\n        segment->min_coord = (FT_Short) min_v;\n        segment->max_coord = (FT_Short) max_v;\n        segment->height    = (FT_Short)( max_v - min_v );\n\n        /* a segment is round if it doesn't have successive */\n        /* on-curve points.                                 */\n        {\n          AF_Point  pt   = first;\n          AF_Point  last = point;\n          AF_Flags  f0   = (AF_Flags)( pt->flags & AF_FLAG_CONTROL );\n          AF_Flags  f1;\n\n\n          segment->flags &= ~AF_EDGE_ROUND;\n\n          for ( ; pt != last; f0 = f1 )\n          {\n            pt = pt->next;\n            f1 = (AF_Flags)( pt->flags & AF_FLAG_CONTROL );\n\n            if ( !f0 && !f1 )\n              break;\n\n            if ( pt == last )\n              segment->flags |= AF_EDGE_ROUND;\n          }\n        }\n\n       /* this can happen in the case of a degenerate contour\n        * e.g. a 2-point vertical contour\n        */\n        if ( point == start )\n          break;\n\n        /* jump to the start of the next segment, if any */\n        while ( FT_ABS( point->out_dir ) != major_dir )\n        {\n          point = point->next;\n\n          if ( point == start )\n            goto NextContour;\n        }\n      }\n\n    NextContour:\n      ;\n    } /* contours */\n\n    /* now slightly increase the height of segments when this makes */\n    /* sense -- this is used to better detect and ignore serifs     */\n    {\n      AF_Segment  segments     = axis->segments;\n      AF_Segment  segments_end = segments + axis->num_segments;\n\n\n      for ( segment = segments; segment < segments_end; segment++ )\n      {\n        AF_Point  first   = segment->first;\n        AF_Point  last    = segment->last;\n        AF_Point  p;\n        FT_Pos    first_v = first->v;\n        FT_Pos    last_v  = last->v;\n\n\n        if ( first == last )\n          continue;\n\n        if ( first_v < last_v )\n        {\n          p = first->prev;\n          if ( p->v < first_v )\n            segment->height = (FT_Short)( segment->height +\n                                          ( ( first_v - p->v ) >> 1 ) );\n\n          p = last->next;\n          if ( p->v > last_v )\n            segment->height = (FT_Short)( segment->height +\n                                          ( ( p->v - last_v ) >> 1 ) );\n        }\n        else\n        {\n          p = first->prev;\n          if ( p->v > first_v )\n            segment->height = (FT_Short)( segment->height +\n                                          ( ( p->v - first_v ) >> 1 ) );\n\n          p = last->next;\n          if ( p->v < last_v )\n            segment->height = (FT_Short)( segment->height +\n                                          ( ( last_v - p->v ) >> 1 ) );\n        }\n      }\n    }\n\n#ifdef AF_SORT_SEGMENTS\n   /* place all segments with a negative direction to the start\n    * of the array, used to speed up segment linking later...\n    */\n    {\n      AF_Segment  segments = axis->segments;\n      FT_UInt     count    = axis->num_segments;\n      FT_UInt     ii, jj;\n\n      for ( ii = 0; ii < count; ii++ )\n      {\n        if ( segments[ii].dir > 0 )\n        {\n          for ( jj = ii + 1; jj < count; jj++ )\n          {\n            if ( segments[jj].dir < 0 )\n            {\n              AF_SegmentRec  tmp;\n\n\n              tmp          = segments[ii];\n              segments[ii] = segments[jj];\n              segments[jj] = tmp;\n\n              break;\n            }\n          }\n\n          if ( jj == count )\n            break;\n        }\n      }\n      axis->mid_segments = ii;\n    }\n#endif\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_latin2_hints_link_segments( AF_GlyphHints  hints,\n                                 AF_Dimension   dim )\n  {\n    AF_AxisHints  axis          = &hints->axis[dim];\n    AF_Segment    segments      = axis->segments;\n    AF_Segment    segment_limit = segments + axis->num_segments;\n#ifdef AF_SORT_SEGMENTS\n    AF_Segment    segment_mid   = segments + axis->mid_segments;\n#endif\n    FT_Pos        len_threshold, len_score;\n    AF_Segment    seg1, seg2;\n\n\n    len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 );\n    if ( len_threshold == 0 )\n      len_threshold = 1;\n\n    len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 );\n\n#ifdef AF_SORT_SEGMENTS\n    for ( seg1 = segments; seg1 < segment_mid; seg1++ )\n    {\n      if ( seg1->dir != axis->major_dir || seg1->first == seg1->last )\n        continue;\n\n      for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ )\n#else\n    /* now compare each segment to the others */\n    for ( seg1 = segments; seg1 < segment_limit; seg1++ )\n    {\n      /* the fake segments are introduced to hint the metrics -- */\n      /* we must never link them to anything                     */\n      if ( seg1->dir != axis->major_dir || seg1->first == seg1->last )\n        continue;\n\n      for ( seg2 = segments; seg2 < segment_limit; seg2++ )\n        if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos )\n#endif\n        {\n          FT_Pos  pos1 = seg1->pos;\n          FT_Pos  pos2 = seg2->pos;\n          FT_Pos  dist = pos2 - pos1;\n\n\n          if ( dist < 0 )\n            continue;\n\n          {\n            FT_Pos  min = seg1->min_coord;\n            FT_Pos  max = seg1->max_coord;\n            FT_Pos  len, score;\n\n\n            if ( min < seg2->min_coord )\n              min = seg2->min_coord;\n\n            if ( max > seg2->max_coord )\n              max = seg2->max_coord;\n\n            len = max - min;\n            if ( len >= len_threshold )\n            {\n              score = dist + len_score / len;\n              if ( score < seg1->score )\n              {\n                seg1->score = score;\n                seg1->link  = seg2;\n              }\n\n              if ( score < seg2->score )\n              {\n                seg2->score = score;\n                seg2->link  = seg1;\n              }\n            }\n          }\n        }\n    }\n#if 0\n    }\n#endif\n\n    /* now, compute the `serif' segments */\n    for ( seg1 = segments; seg1 < segment_limit; seg1++ )\n    {\n      seg2 = seg1->link;\n\n      if ( seg2 )\n      {\n        if ( seg2->link != seg1 )\n        {\n          seg1->link  = 0;\n          seg1->serif = seg2->link;\n        }\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  af_latin2_hints_compute_edges( AF_GlyphHints  hints,\n                                 AF_Dimension   dim )\n  {\n    AF_AxisHints  axis   = &hints->axis[dim];\n    FT_Error      error  = FT_Err_Ok;\n    FT_Memory     memory = hints->memory;\n    AF_LatinAxis  laxis  = &((AF_LatinMetrics)hints->metrics)->axis[dim];\n\n    AF_Segment    segments      = axis->segments;\n    AF_Segment    segment_limit = segments + axis->num_segments;\n    AF_Segment    seg;\n\n    AF_Direction  up_dir;\n    FT_Fixed      scale;\n    FT_Pos        edge_distance_threshold;\n    FT_Pos        segment_length_threshold;\n\n\n    axis->num_edges = 0;\n\n    scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale\n                                         : hints->y_scale;\n\n    up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP\n                                          : AF_DIR_RIGHT;\n\n    /*\n     *  We want to ignore very small (mostly serif) segments, we do that\n     *  by ignoring those that whose length is less than a given fraction\n     *  of the standard width. If there is no standard width, we ignore\n     *  those that are less than a given size in pixels\n     *\n     *  also, unlink serif segments that are linked to segments farther\n     *  than 50% of the standard width\n     */\n    if ( dim == AF_DIMENSION_HORZ )\n    {\n      if ( laxis->width_count > 0 )\n        segment_length_threshold = ( laxis->standard_width * 10 ) >> 4;\n      else\n        segment_length_threshold = FT_DivFix( 64, hints->y_scale );\n    }\n    else\n      segment_length_threshold = 0;\n\n    /*********************************************************************/\n    /*                                                                   */\n    /* We will begin by generating a sorted table of edges for the       */\n    /* current direction.  To do so, we simply scan each segment and try */\n    /* to find an edge in our table that corresponds to its position.    */\n    /*                                                                   */\n    /* If no edge is found, we create and insert a new edge in the       */\n    /* sorted table.  Otherwise, we simply add the segment to the edge's */\n    /* list which will be processed in the second step to compute the    */\n    /* edge's properties.                                                */\n    /*                                                                   */\n    /* Note that the edges table is sorted along the segment/edge        */\n    /* position.                                                         */\n    /*                                                                   */\n    /*********************************************************************/\n\n    edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold,\n                                         scale );\n    if ( edge_distance_threshold > 64 / 4 )\n      edge_distance_threshold = 64 / 4;\n\n    edge_distance_threshold = FT_DivFix( edge_distance_threshold,\n                                         scale );\n\n    for ( seg = segments; seg < segment_limit; seg++ )\n    {\n      AF_Edge  found = 0;\n      FT_Int   ee;\n\n\n      if ( seg->height < segment_length_threshold )\n        continue;\n\n      /* A special case for serif edges: If they are smaller than */\n      /* 1.5 pixels we ignore them.                               */\n      if ( seg->serif )\n      {\n        FT_Pos  dist = seg->serif->pos - seg->pos;\n\n\n        if ( dist < 0 )\n          dist = -dist;\n\n        if ( dist >= laxis->standard_width >> 1 )\n        {\n          /* unlink this serif, it is too distant from its reference stem */\n          seg->serif = NULL;\n        }\n        else if ( 2*seg->height < 3 * segment_length_threshold )\n          continue;\n      }\n\n      /* look for an edge corresponding to the segment */\n      for ( ee = 0; ee < axis->num_edges; ee++ )\n      {\n        AF_Edge  edge = axis->edges + ee;\n        FT_Pos   dist;\n\n\n        dist = seg->pos - edge->fpos;\n        if ( dist < 0 )\n          dist = -dist;\n\n        if ( dist < edge_distance_threshold && edge->dir == seg->dir )\n        {\n          found = edge;\n          break;\n        }\n      }\n\n      if ( !found )\n      {\n        AF_Edge   edge;\n\n\n        /* insert a new edge in the list and */\n        /* sort according to the position    */\n        error = af_axis_hints_new_edge( axis, seg->pos, seg->dir,\n                                        memory, &edge );\n        if ( error )\n          goto Exit;\n\n        /* add the segment to the new edge's list */\n        FT_ZERO( edge );\n\n        edge->first    = seg;\n        edge->last     = seg;\n        edge->fpos     = seg->pos;\n        edge->dir      = seg->dir;\n        edge->opos     = edge->pos = FT_MulFix( seg->pos, scale );\n        seg->edge_next = seg;\n      }\n      else\n      {\n        /* if an edge was found, simply add the segment to the edge's */\n        /* list                                                       */\n        seg->edge_next         = found->first;\n        found->last->edge_next = seg;\n        found->last            = seg;\n      }\n    }\n\n\n    /*********************************************************************/\n    /*                                                                   */\n    /* Good, we will now compute each edge's properties according to     */\n    /* segments found on its position.  Basically, these are:            */\n    /*                                                                   */\n    /*  - edge's main direction                                          */\n    /*  - stem edge, serif edge or both (which defaults to stem then)    */\n    /*  - rounded edge, straight or both (which defaults to straight)    */\n    /*  - link for edge                                                  */\n    /*                                                                   */\n    /*********************************************************************/\n\n    /* first of all, set the `edge' field in each segment -- this is */\n    /* required in order to compute edge links                       */\n\n    /*\n     * Note that removing this loop and setting the `edge' field of each\n     * segment directly in the code above slows down execution speed for\n     * some reasons on platforms like the Sun.\n     */\n    {\n      AF_Edge  edges      = axis->edges;\n      AF_Edge  edge_limit = edges + axis->num_edges;\n      AF_Edge  edge;\n\n\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        seg = edge->first;\n        if ( seg )\n          do\n          {\n            seg->edge = edge;\n            seg       = seg->edge_next;\n\n          } while ( seg != edge->first );\n      }\n\n      /* now, compute each edge properties */\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        FT_Int  is_round    = 0;  /* does it contain round segments?    */\n        FT_Int  is_straight = 0;  /* does it contain straight segments? */\n#if 0\n        FT_Pos  ups         = 0;  /* number of upwards segments         */\n        FT_Pos  downs       = 0;  /* number of downwards segments       */\n#endif\n\n\n        seg = edge->first;\n\n        do\n        {\n          FT_Bool  is_serif;\n\n\n          /* check for roundness of segment */\n          if ( seg->flags & AF_EDGE_ROUND )\n            is_round++;\n          else\n            is_straight++;\n\n#if 0\n          /* check for segment direction */\n          if ( seg->dir == up_dir )\n            ups   += seg->max_coord-seg->min_coord;\n          else\n            downs += seg->max_coord-seg->min_coord;\n#endif\n\n          /* check for links -- if seg->serif is set, then seg->link must */\n          /* be ignored                                                   */\n          is_serif = (FT_Bool)( seg->serif               &&\n                                seg->serif->edge         &&\n                                seg->serif->edge != edge );\n\n          if ( ( seg->link && seg->link->edge != NULL ) || is_serif )\n          {\n            AF_Edge     edge2;\n            AF_Segment  seg2;\n\n\n            edge2 = edge->link;\n            seg2  = seg->link;\n\n            if ( is_serif )\n            {\n              seg2  = seg->serif;\n              edge2 = edge->serif;\n            }\n\n            if ( edge2 )\n            {\n              FT_Pos  edge_delta;\n              FT_Pos  seg_delta;\n\n\n              edge_delta = edge->fpos - edge2->fpos;\n              if ( edge_delta < 0 )\n                edge_delta = -edge_delta;\n\n              seg_delta = seg->pos - seg2->pos;\n              if ( seg_delta < 0 )\n                seg_delta = -seg_delta;\n\n              if ( seg_delta < edge_delta )\n                edge2 = seg2->edge;\n            }\n            else\n              edge2 = seg2->edge;\n\n            if ( is_serif )\n            {\n              edge->serif   = edge2;\n              edge2->flags |= AF_EDGE_SERIF;\n            }\n            else\n              edge->link  = edge2;\n          }\n\n          seg = seg->edge_next;\n\n        } while ( seg != edge->first );\n\n        /* set the round/straight flags */\n        edge->flags = AF_EDGE_NORMAL;\n\n        if ( is_round > 0 && is_round >= is_straight )\n          edge->flags |= AF_EDGE_ROUND;\n\n#if 0\n        /* set the edge's main direction */\n        edge->dir = AF_DIR_NONE;\n\n        if ( ups > downs )\n          edge->dir = (FT_Char)up_dir;\n\n        else if ( ups < downs )\n          edge->dir = (FT_Char)-up_dir;\n\n        else if ( ups == downs )\n          edge->dir = 0;  /* both up and down! */\n#endif\n\n        /* gets rid of serifs if link is set                */\n        /* XXX: This gets rid of many unpleasant artefacts! */\n        /*      Example: the `c' in cour.pfa at size 13     */\n\n        if ( edge->serif && edge->link )\n          edge->serif = 0;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  af_latin2_hints_detect_features( AF_GlyphHints  hints,\n                                   AF_Dimension   dim )\n  {\n    FT_Error  error;\n\n\n    error = af_latin2_hints_compute_segments( hints, dim );\n    if ( !error )\n    {\n      af_latin2_hints_link_segments( hints, dim );\n\n      error = af_latin2_hints_compute_edges( hints, dim );\n    }\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  af_latin2_hints_compute_blue_edges( AF_GlyphHints    hints,\n                                      AF_LatinMetrics  metrics )\n  {\n    AF_AxisHints  axis       = &hints->axis[AF_DIMENSION_VERT];\n    AF_Edge       edge       = axis->edges;\n    AF_Edge       edge_limit = edge + axis->num_edges;\n    AF_LatinAxis  latin      = &metrics->axis[AF_DIMENSION_VERT];\n    FT_Fixed      scale      = latin->scale;\n    FT_Pos        best_dist0;  /* initial threshold */\n\n\n    /* compute the initial threshold as a fraction of the EM size */\n    best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale );\n\n    if ( best_dist0 > 64 / 2 )\n      best_dist0 = 64 / 2;\n\n    /* compute which blue zones are active, i.e. have their scaled */\n    /* size < 3/4 pixels                                           */\n\n    /* for each horizontal edge search the blue zone which is closest */\n    for ( ; edge < edge_limit; edge++ )\n    {\n      FT_Int    bb;\n      AF_Width  best_blue = NULL;\n      FT_Pos    best_dist = best_dist0;\n\n      for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )\n      {\n        AF_LatinBlue  blue = latin->blues + bb;\n        FT_Bool       is_top_blue, is_major_dir;\n\n\n        /* skip inactive blue zones (i.e., those that are too small) */\n        if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) )\n          continue;\n\n        /* if it is a top zone, check for right edges -- if it is a bottom */\n        /* zone, check for left edges                                      */\n        /*                                                                 */\n        /* of course, that's for TrueType                                  */\n        is_top_blue  = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 );\n        is_major_dir = FT_BOOL( edge->dir == axis->major_dir );\n\n        /* if it is a top zone, the edge must be against the major    */\n        /* direction; if it is a bottom zone, it must be in the major */\n        /* direction                                                  */\n        if ( is_top_blue ^ is_major_dir )\n        {\n          FT_Pos     dist;\n          AF_Width   compare;\n\n\n          /* if it's a rounded edge, compare it to the overshoot position */\n          /* if it's a flat edge, compare it to the reference position    */\n          if ( edge->flags & AF_EDGE_ROUND )\n            compare = &blue->shoot;\n          else\n            compare = &blue->ref;\n\n          dist = edge->fpos - compare->org;\n          if ( dist < 0 )\n            dist = -dist;\n\n          dist = FT_MulFix( dist, scale );\n          if ( dist < best_dist )\n          {\n            best_dist = dist;\n            best_blue = compare;\n          }\n\n#if 0\n          /* now, compare it to the overshoot position if the edge is     */\n          /* rounded, and if the edge is over the reference position of a */\n          /* top zone, or under the reference position of a bottom zone   */\n          if ( edge->flags & AF_EDGE_ROUND && dist != 0 )\n          {\n            FT_Bool  is_under_ref = FT_BOOL( edge->fpos < blue->ref.org );\n\n\n            if ( is_top_blue ^ is_under_ref )\n            {\n              blue = latin->blues + bb;\n              dist = edge->fpos - blue->shoot.org;\n              if ( dist < 0 )\n                dist = -dist;\n\n              dist = FT_MulFix( dist, scale );\n              if ( dist < best_dist )\n              {\n                best_dist = dist;\n                best_blue = & blue->shoot;\n              }\n            }\n          }\n#endif\n        }\n      }\n\n      if ( best_blue )\n        edge->blue_edge = best_blue;\n    }\n  }\n\n\n  static FT_Error\n  af_latin2_hints_init( AF_GlyphHints    hints,\n                        AF_LatinMetrics  metrics )\n  {\n    FT_Render_Mode  mode;\n    FT_UInt32       scaler_flags, other_flags;\n    FT_Face         face = metrics->root.scaler.face;\n\n\n    af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics );\n\n    /*\n     *  correct x_scale and y_scale if needed, since they may have\n     *  been modified `af_latin2_metrics_scale_dim' above\n     */\n    hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale;\n    hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta;\n    hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale;\n    hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta;\n\n    /* compute flags depending on render mode, etc. */\n    mode = metrics->root.scaler.render_mode;\n\n#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */\n    if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V )\n    {\n      metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL;\n    }\n#endif\n\n    scaler_flags = hints->scaler_flags;\n    other_flags  = 0;\n\n    /*\n     *  We snap the width of vertical stems for the monochrome and\n     *  horizontal LCD rendering targets only.\n     */\n    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD )\n      other_flags |= AF_LATIN_HINTS_HORZ_SNAP;\n\n    /*\n     *  We snap the width of horizontal stems for the monochrome and\n     *  vertical LCD rendering targets only.\n     */\n    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V )\n      other_flags |= AF_LATIN_HINTS_VERT_SNAP;\n\n    /*\n     *  We adjust stems to full pixels only if we don't use the `light' mode.\n     */\n    if ( mode != FT_RENDER_MODE_LIGHT )\n      other_flags |= AF_LATIN_HINTS_STEM_ADJUST;\n\n    if ( mode == FT_RENDER_MODE_MONO )\n      other_flags |= AF_LATIN_HINTS_MONO;\n\n    /*\n     *  In `light' hinting mode we disable horizontal hinting completely.\n     *  We also do it if the face is italic.\n     */\n    if ( mode == FT_RENDER_MODE_LIGHT                      ||\n         ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 )\n      scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL;\n\n    hints->scaler_flags = scaler_flags;\n    hints->other_flags  = other_flags;\n\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****        L A T I N   G L Y P H   G R I D - F I T T I N G        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* snap a given width in scaled coordinates to one of the */\n  /* current standard widths                                */\n\n  static FT_Pos\n  af_latin2_snap_width( AF_Width  widths,\n                        FT_Int    count,\n                        FT_Pos    width )\n  {\n    int     n;\n    FT_Pos  best      = 64 + 32 + 2;\n    FT_Pos  reference = width;\n    FT_Pos  scaled;\n\n\n    for ( n = 0; n < count; n++ )\n    {\n      FT_Pos  w;\n      FT_Pos  dist;\n\n\n      w = widths[n].cur;\n      dist = width - w;\n      if ( dist < 0 )\n        dist = -dist;\n      if ( dist < best )\n      {\n        best      = dist;\n        reference = w;\n      }\n    }\n\n    scaled = FT_PIX_ROUND( reference );\n\n    if ( width >= reference )\n    {\n      if ( width < scaled + 48 )\n        width = reference;\n    }\n    else\n    {\n      if ( width > scaled - 48 )\n        width = reference;\n    }\n\n    return width;\n  }\n\n\n  /* compute the snapped width of a given stem */\n\n  static FT_Pos\n  af_latin2_compute_stem_width( AF_GlyphHints  hints,\n                                AF_Dimension   dim,\n                                FT_Pos         width,\n                                AF_Edge_Flags  base_flags,\n                                AF_Edge_Flags  stem_flags )\n  {\n    AF_LatinMetrics  metrics  = (AF_LatinMetrics) hints->metrics;\n    AF_LatinAxis     axis     = & metrics->axis[dim];\n    FT_Pos           dist     = width;\n    FT_Int           sign     = 0;\n    FT_Int           vertical = ( dim == AF_DIMENSION_VERT );\n\n    FT_UNUSED( base_flags );\n\n\n    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ||\n          axis->extra_light                      )\n      return width;\n\n    if ( dist < 0 )\n    {\n      dist = -width;\n      sign = 1;\n    }\n\n    if ( (  vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||\n         ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )\n    {\n      /* smooth hinting process: very lightly quantize the stem width */\n\n      /* leave the widths of serifs alone */\n\n      if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) )\n        goto Done_Width;\n\n#if 0\n      else if ( ( base_flags & AF_EDGE_ROUND ) )\n      {\n        if ( dist < 80 )\n          dist = 64;\n      }\n      else if ( dist < 56 )\n        dist = 56;\n#endif\n      if ( axis->width_count > 0 )\n      {\n        FT_Pos  delta;\n\n\n        /* compare to standard width */\n        if ( axis->width_count > 0 )\n        {\n          delta = dist - axis->widths[0].cur;\n\n          if ( delta < 0 )\n            delta = -delta;\n\n          if ( delta < 40 )\n          {\n            dist = axis->widths[0].cur;\n            if ( dist < 48 )\n              dist = 48;\n\n            goto Done_Width;\n          }\n        }\n\n        if ( dist < 3 * 64 )\n        {\n          delta  = dist & 63;\n          dist  &= -64;\n\n          if ( delta < 10 )\n            dist += delta;\n\n          else if ( delta < 32 )\n            dist += 10;\n\n          else if ( delta < 54 )\n            dist += 54;\n\n          else\n            dist += delta;\n        }\n        else\n          dist = ( dist + 32 ) & ~63;\n      }\n    }\n    else\n    {\n      /* strong hinting process: snap the stem width to integer pixels */\n      FT_Pos  org_dist = dist;\n\n\n      dist = af_latin2_snap_width( axis->widths, axis->width_count, dist );\n\n      if ( vertical )\n      {\n        /* in the case of vertical hinting, always round */\n        /* the stem heights to integer pixels            */\n\n        if ( dist >= 64 )\n          dist = ( dist + 16 ) & ~63;\n        else\n          dist = 64;\n      }\n      else\n      {\n        if ( AF_LATIN_HINTS_DO_MONO( hints ) )\n        {\n          /* monochrome horizontal hinting: snap widths to integer pixels */\n          /* with a different threshold                                   */\n\n          if ( dist < 64 )\n            dist = 64;\n          else\n            dist = ( dist + 32 ) & ~63;\n        }\n        else\n        {\n          /* for horizontal anti-aliased hinting, we adopt a more subtle */\n          /* approach: we strengthen small stems, round stems whose size */\n          /* is between 1 and 2 pixels to an integer, otherwise nothing  */\n\n          if ( dist < 48 )\n            dist = ( dist + 64 ) >> 1;\n\n          else if ( dist < 128 )\n          {\n            /* We only round to an integer width if the corresponding */\n            /* distortion is less than 1/4 pixel.  Otherwise this     */\n            /* makes everything worse since the diagonals, which are  */\n            /* not hinted, appear a lot bolder or thinner than the    */\n            /* vertical stems.                                        */\n\n            FT_Int  delta;\n\n\n            dist = ( dist + 22 ) & ~63;\n            delta = dist - org_dist;\n            if ( delta < 0 )\n              delta = -delta;\n\n            if ( delta >= 16 )\n            {\n              dist = org_dist;\n              if ( dist < 48 )\n                dist = ( dist + 64 ) >> 1;\n            }\n          }\n          else\n            /* round otherwise to prevent color fringes in LCD mode */\n            dist = ( dist + 32 ) & ~63;\n        }\n      }\n    }\n\n  Done_Width:\n    if ( sign )\n      dist = -dist;\n\n    return dist;\n  }\n\n\n  /* align one stem edge relative to the previous stem edge */\n\n  static void\n  af_latin2_align_linked_edge( AF_GlyphHints  hints,\n                               AF_Dimension   dim,\n                               AF_Edge        base_edge,\n                               AF_Edge        stem_edge )\n  {\n    FT_Pos  dist = stem_edge->opos - base_edge->opos;\n\n    FT_Pos  fitted_width = af_latin2_compute_stem_width(\n                             hints, dim, dist,\n                             (AF_Edge_Flags)base_edge->flags,\n                             (AF_Edge_Flags)stem_edge->flags );\n\n\n    stem_edge->pos = base_edge->pos + fitted_width;\n\n    FT_TRACE5(( \"LINK: edge %d (opos=%.2f) linked to (%.2f), \"\n                \"dist was %.2f, now %.2f\\n\",\n                stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0,\n                stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 ));\n  }\n\n\n  static void\n  af_latin2_align_serif_edge( AF_GlyphHints  hints,\n                              AF_Edge        base,\n                              AF_Edge        serif )\n  {\n    FT_UNUSED( hints );\n\n    serif->pos = base->pos + ( serif->opos - base->opos );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                    E D G E   H I N T I N G                      ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( void )\n  af_latin2_hint_edges( AF_GlyphHints  hints,\n                        AF_Dimension   dim )\n  {\n    AF_AxisHints  axis       = &hints->axis[dim];\n    AF_Edge       edges      = axis->edges;\n    AF_Edge       edge_limit = edges + axis->num_edges;\n    AF_Edge       edge;\n    AF_Edge       anchor     = 0;\n    FT_Int        has_serifs = 0;\n    FT_Pos        anchor_drift = 0;\n\n\n\n    FT_TRACE5(( \"==== hinting %s edges =====\\n\",\n                dim == AF_DIMENSION_HORZ ? \"vertical\" : \"horizontal\" ));\n\n    /* we begin by aligning all stems relative to the blue zone */\n    /* if needed -- that's only for horizontal edges            */\n\n    if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) )\n    {\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        AF_Width  blue;\n        AF_Edge   edge1, edge2;\n\n\n        if ( edge->flags & AF_EDGE_DONE )\n          continue;\n\n        blue  = edge->blue_edge;\n        edge1 = NULL;\n        edge2 = edge->link;\n\n        if ( blue )\n        {\n          edge1 = edge;\n        }\n        else if ( edge2 && edge2->blue_edge )\n        {\n          blue  = edge2->blue_edge;\n          edge1 = edge2;\n          edge2 = edge;\n        }\n\n        if ( !edge1 )\n          continue;\n\n        FT_TRACE5(( \"BLUE: edge %d (opos=%.2f) snapped to (%.2f), \"\n                    \"was (%.2f)\\n\",\n                    edge1-edges, edge1->opos / 64.0, blue->fit / 64.0,\n                    edge1->pos / 64.0 ));\n\n        edge1->pos    = blue->fit;\n        edge1->flags |= AF_EDGE_DONE;\n\n        if ( edge2 && !edge2->blue_edge )\n        {\n          af_latin2_align_linked_edge( hints, dim, edge1, edge2 );\n          edge2->flags |= AF_EDGE_DONE;\n        }\n\n        if ( !anchor )\n        {\n          anchor = edge;\n\n          anchor_drift = ( anchor->pos - anchor->opos );\n          if ( edge2 )\n            anchor_drift = ( anchor_drift +\n                             ( edge2->pos - edge2->opos ) ) >> 1;\n        }\n      }\n    }\n\n    /* now we will align all stem edges, trying to maintain the */\n    /* relative order of stems in the glyph                     */\n    for ( edge = edges; edge < edge_limit; edge++ )\n    {\n      AF_Edge  edge2;\n\n\n      if ( edge->flags & AF_EDGE_DONE )\n        continue;\n\n      /* skip all non-stem edges */\n      edge2 = edge->link;\n      if ( !edge2 )\n      {\n        has_serifs++;\n        continue;\n      }\n\n      /* now align the stem */\n\n      /* this should not happen, but it's better to be safe */\n      if ( edge2->blue_edge )\n      {\n        FT_TRACE5(( \"ASSERTION FAILED for edge %d\\n\", edge2-edges ));\n\n        af_latin2_align_linked_edge( hints, dim, edge2, edge );\n        edge->flags |= AF_EDGE_DONE;\n        continue;\n      }\n\n      if ( !anchor )\n      {\n        FT_Pos  org_len, org_center, cur_len;\n        FT_Pos  cur_pos1, error1, error2, u_off, d_off;\n\n\n        org_len = edge2->opos - edge->opos;\n        cur_len = af_latin2_compute_stem_width(\n                    hints, dim, org_len,\n                    (AF_Edge_Flags)edge->flags,\n                    (AF_Edge_Flags)edge2->flags );\n        if ( cur_len <= 64 )\n          u_off = d_off = 32;\n        else\n        {\n          u_off = 38;\n          d_off = 26;\n        }\n\n        if ( cur_len < 96 )\n        {\n          org_center = edge->opos + ( org_len >> 1 );\n\n          cur_pos1   = FT_PIX_ROUND( org_center );\n\n          error1 = org_center - ( cur_pos1 - u_off );\n          if ( error1 < 0 )\n            error1 = -error1;\n\n          error2 = org_center - ( cur_pos1 + d_off );\n          if ( error2 < 0 )\n            error2 = -error2;\n\n          if ( error1 < error2 )\n            cur_pos1 -= u_off;\n          else\n            cur_pos1 += d_off;\n\n          edge->pos  = cur_pos1 - cur_len / 2;\n          edge2->pos = edge->pos + cur_len;\n        }\n        else\n          edge->pos = FT_PIX_ROUND( edge->opos );\n\n        FT_TRACE5(( \"ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)\"\n                    \" snapped to (%.2f) (%.2f)\\n\",\n                    edge-edges, edge->opos / 64.0,\n                    edge2-edges, edge2->opos / 64.0,\n                    edge->pos / 64.0, edge2->pos / 64.0 ));\n        anchor = edge;\n\n        edge->flags |= AF_EDGE_DONE;\n\n        af_latin2_align_linked_edge( hints, dim, edge, edge2 );\n\n        edge2->flags |= AF_EDGE_DONE;\n\n        anchor_drift = ( ( anchor->pos - anchor->opos ) +\n                         ( edge2->pos - edge2->opos ) ) >> 1;\n\n        FT_TRACE5(( \"DRIFT: %.2f\\n\", anchor_drift/64.0 ));\n      }\n      else\n      {\n        FT_Pos   org_pos, org_len, org_center, cur_center, cur_len;\n        FT_Pos   org_left, org_right;\n\n\n        org_pos    = edge->opos + anchor_drift;\n        org_len    = edge2->opos - edge->opos;\n        org_center = org_pos + ( org_len >> 1 );\n\n        cur_len = af_latin2_compute_stem_width(\n                   hints, dim, org_len,\n                   (AF_Edge_Flags)edge->flags,\n                   (AF_Edge_Flags)edge2->flags );\n\n        org_left  = org_pos + ( ( org_len - cur_len ) >> 1 );\n        org_right = org_pos + ( ( org_len + cur_len ) >> 1 );\n\n        FT_TRACE5(( \"ALIGN: left=%.2f right=%.2f \",\n                    org_left / 64.0, org_right / 64.0 ));\n        cur_center = org_center;\n\n        if ( edge2->flags & AF_EDGE_DONE )\n        {\n          FT_TRACE5(( \"\\n\" ));\n          edge->pos = edge2->pos - cur_len;\n        }\n        else\n        {\n         /* we want to compare several displacement, and choose\n          * the one that increases fitness while minimizing\n          * distortion as well\n          */\n          FT_Pos   displacements[6], scores[6], org, fit, delta;\n          FT_UInt  count = 0;\n\n          /* note: don't even try to fit tiny stems */\n          if ( cur_len < 32 )\n          {\n            FT_TRACE5(( \"tiny stem\\n\" ));\n            goto AlignStem;\n          }\n\n          /* if the span is within a single pixel, don't touch it */\n          if ( FT_PIX_FLOOR( org_left ) == FT_PIX_CEIL( org_right ) )\n          {\n            FT_TRACE5(( \"single pixel stem\\n\" ));\n            goto AlignStem;\n          }\n\n          if ( cur_len <= 96 )\n          {\n           /* we want to avoid the absolute worst case which is\n            * when the left and right edges of the span each represent\n            * about 50% of the gray. we'd better want to change this\n            * to 25/75%, since this is much more pleasant to the eye with\n            * very acceptable distortion\n            */\n            FT_Pos  frac_left  = org_left  & 63;\n            FT_Pos  frac_right = org_right & 63;\n\n            if ( frac_left  >= 22 && frac_left  <= 42 &&\n                 frac_right >= 22 && frac_right <= 42 )\n            {\n              org = frac_left;\n              fit = ( org <= 32 ) ? 16 : 48;\n              delta = FT_ABS( fit - org );\n              displacements[count] = fit - org;\n              scores[count++]      = delta;\n              FT_TRACE5(( \"dispA=%.2f (%d) \", ( fit - org ) / 64.0, delta ));\n\n              org = frac_right;\n              fit = ( org <= 32 ) ? 16 : 48;\n              delta = FT_ABS( fit - org );\n              displacements[count] = fit - org;\n              scores[count++]     = delta;\n              FT_TRACE5(( \"dispB=%.2f (%d) \", ( fit - org ) / 64.0, delta ));\n            }\n          }\n\n          /* snapping the left edge to the grid */\n          org   = org_left;\n          fit   = FT_PIX_ROUND( org );\n          delta = FT_ABS( fit - org );\n          displacements[count] = fit - org;\n          scores[count++]      = delta;\n          FT_TRACE5(( \"dispC=%.2f (%d) \", ( fit - org ) / 64.0, delta ));\n\n          /* snapping the right edge to the grid */\n          org   = org_right;\n          fit   = FT_PIX_ROUND( org );\n          delta = FT_ABS( fit - org );\n          displacements[count] = fit - org;\n          scores[count++]      = delta;\n          FT_TRACE5(( \"dispD=%.2f (%d) \", ( fit - org ) / 64.0, delta ));\n\n          /* now find the best displacement */\n          {\n            FT_Pos  best_score = scores[0];\n            FT_Pos  best_disp  = displacements[0];\n            FT_UInt nn;\n\n            for ( nn = 1; nn < count; nn++ )\n            {\n              if ( scores[nn] < best_score )\n              {\n                best_score = scores[nn];\n                best_disp  = displacements[nn];\n              }\n            }\n\n            cur_center = org_center + best_disp;\n          }\n          FT_TRACE5(( \"\\n\" ));\n        }\n\n      AlignStem:\n        edge->pos  = cur_center - ( cur_len >> 1 );\n        edge2->pos = edge->pos + cur_len;\n\n        FT_TRACE5(( \"STEM1: %d (opos=%.2f) to %d (opos=%.2f)\"\n                    \" snapped to (%.2f) and (%.2f),\"\n                    \" org_len=%.2f cur_len=%.2f\\n\",\n                    edge-edges, edge->opos / 64.0,\n                    edge2-edges, edge2->opos / 64.0,\n                    edge->pos / 64.0, edge2->pos / 64.0,\n                    org_len / 64.0, cur_len / 64.0 ));\n\n        edge->flags  |= AF_EDGE_DONE;\n        edge2->flags |= AF_EDGE_DONE;\n\n        if ( edge > edges && edge->pos < edge[-1].pos )\n        {\n          FT_TRACE5(( \"BOUND: %d (pos=%.2f) to (%.2f)\\n\",\n                      edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));\n          edge->pos = edge[-1].pos;\n        }\n      }\n    }\n\n    /* make sure that lowercase m's maintain their symmetry */\n\n    /* In general, lowercase m's have six vertical edges if they are sans */\n    /* serif, or twelve if they are with serifs.  This implementation is  */\n    /* based on that assumption, and seems to work very well with most    */\n    /* faces.  However, if for a certain face this assumption is not      */\n    /* true, the m is just rendered like before.  In addition, any stem   */\n    /* correction will only be applied to symmetrical glyphs (even if the */\n    /* glyph is not an m), so the potential for unwanted distortion is    */\n    /* relatively low.                                                    */\n\n    /* We don't handle horizontal edges since we can't easily assure that */\n    /* the third (lowest) stem aligns with the base line; it might end up */\n    /* one pixel higher or lower.                                         */\n\n#if 0\n    {\n      FT_Int  n_edges = edge_limit - edges;\n\n\n      if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) )\n      {\n        AF_Edge  edge1, edge2, edge3;\n        FT_Pos   dist1, dist2, span, delta;\n\n\n        if ( n_edges == 6 )\n        {\n          edge1 = edges;\n          edge2 = edges + 2;\n          edge3 = edges + 4;\n        }\n        else\n        {\n          edge1 = edges + 1;\n          edge2 = edges + 5;\n          edge3 = edges + 9;\n        }\n\n        dist1 = edge2->opos - edge1->opos;\n        dist2 = edge3->opos - edge2->opos;\n\n        span = dist1 - dist2;\n        if ( span < 0 )\n          span = -span;\n\n        if ( span < 8 )\n        {\n          delta = edge3->pos - ( 2 * edge2->pos - edge1->pos );\n          edge3->pos -= delta;\n          if ( edge3->link )\n            edge3->link->pos -= delta;\n\n          /* move the serifs along with the stem */\n          if ( n_edges == 12 )\n          {\n            ( edges + 8 )->pos -= delta;\n            ( edges + 11 )->pos -= delta;\n          }\n\n          edge3->flags |= AF_EDGE_DONE;\n          if ( edge3->link )\n            edge3->link->flags |= AF_EDGE_DONE;\n        }\n      }\n    }\n#endif\n\n    if ( has_serifs || !anchor )\n    {\n      /*\n       *  now hint the remaining edges (serifs and single) in order\n       *  to complete our processing\n       */\n      for ( edge = edges; edge < edge_limit; edge++ )\n      {\n        FT_Pos  delta;\n\n\n        if ( edge->flags & AF_EDGE_DONE )\n          continue;\n\n        delta = 1000;\n\n        if ( edge->serif )\n        {\n          delta = edge->serif->opos - edge->opos;\n          if ( delta < 0 )\n            delta = -delta;\n        }\n\n        if ( delta < 64 + 16 )\n        {\n          af_latin2_align_serif_edge( hints, edge->serif, edge );\n          FT_TRACE5(( \"SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)\"\n                      \" aligned to (%.2f)\\n\",\n                      edge-edges, edge->opos / 64.0,\n                      edge->serif - edges, edge->serif->opos / 64.0,\n                      edge->pos / 64.0 ));\n        }\n        else if ( !anchor )\n        {\n          FT_TRACE5(( \"SERIF_ANCHOR: edge %d (opos=%.2f)\"\n                      \" snapped to (%.2f)\\n\",\n                      edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));\n          edge->pos = FT_PIX_ROUND( edge->opos );\n          anchor    = edge;\n        }\n        else\n        {\n          AF_Edge  before, after;\n\n\n          for ( before = edge - 1; before >= edges; before-- )\n            if ( before->flags & AF_EDGE_DONE )\n              break;\n\n          for ( after = edge + 1; after < edge_limit; after++ )\n            if ( after->flags & AF_EDGE_DONE )\n              break;\n\n          if ( before >= edges && before < edge   &&\n               after < edge_limit && after > edge )\n          {\n            if ( after->opos == before->opos )\n              edge->pos = before->pos;\n            else\n              edge->pos = before->pos +\n                          FT_MulDiv( edge->opos - before->opos,\n                                     after->pos - before->pos,\n                                     after->opos - before->opos );\n            FT_TRACE5(( \"SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)\"\n                        \" from %d (opos=%.2f)\\n\",\n                        edge-edges, edge->opos / 64.0, edge->pos / 64.0,\n                        before - edges, before->opos / 64.0 ));\n          }\n          else\n          {\n            edge->pos = anchor->pos +\n                        ( ( edge->opos - anchor->opos + 16 ) & ~31 );\n\n            FT_TRACE5(( \"SERIF_LINK2: edge %d (opos=%.2f)\"\n                        \" snapped to (%.2f)\\n\",\n                        edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));\n          }\n        }\n\n        edge->flags |= AF_EDGE_DONE;\n\n        if ( edge > edges && edge->pos < edge[-1].pos )\n          edge->pos = edge[-1].pos;\n\n        if ( edge + 1 < edge_limit        &&\n             edge[1].flags & AF_EDGE_DONE &&\n             edge->pos > edge[1].pos      )\n          edge->pos = edge[1].pos;\n      }\n    }\n  }\n\n\n  static FT_Error\n  af_latin2_hints_apply( AF_GlyphHints    hints,\n                         FT_Outline*      outline,\n                         AF_LatinMetrics  metrics )\n  {\n    FT_Error  error;\n    int       dim;\n\n\n    error = af_glyph_hints_reload( hints, outline );\n    if ( error )\n      goto Exit;\n\n    /* analyze glyph outline */\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n    if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ||\n         AF_HINTS_DO_HORIZONTAL( hints ) )\n#else\n    if ( AF_HINTS_DO_HORIZONTAL( hints ) )\n#endif\n    {\n      error = af_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( AF_HINTS_DO_VERTICAL( hints ) )\n    {\n      error = af_latin2_hints_detect_features( hints, AF_DIMENSION_VERT );\n      if ( error )\n        goto Exit;\n\n      af_latin2_hints_compute_blue_edges( hints, metrics );\n    }\n\n    /* grid-fit the outline */\n    for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )\n    {\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n      if ( ( dim == AF_DIMENSION_HORZ &&\n             metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) )\n      {\n        AF_WarperRec  warper;\n        FT_Fixed      scale;\n        FT_Pos        delta;\n\n\n        af_warper_compute( &warper, hints, dim, &scale, &delta );\n        af_glyph_hints_scale_dim( hints, dim, scale, delta );\n        continue;\n      }\n#endif\n\n      if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) ||\n           ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) )   )\n      {\n        af_latin2_hint_edges( hints, (AF_Dimension)dim );\n        af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim );\n        af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim );\n        af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim );\n      }\n    }\n    af_glyph_hints_save( hints, outline );\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****              L A T I N   S C R I P T   C L A S S              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  static const AF_Script_UniRangeRec  af_latin2_uniranges[] =\n  {\n    AF_UNIRANGE_REC( 32UL,  127UL ),    /* TODO: Add new Unicode ranges here! */\n    AF_UNIRANGE_REC( 160UL, 255UL ),\n    AF_UNIRANGE_REC( 0UL,   0UL )\n  };\n\n\n  AF_DEFINE_SCRIPT_CLASS( af_latin2_script_class,\n    AF_SCRIPT_LATIN2,\n    af_latin2_uniranges,\n    'o',\n\n    sizeof ( AF_LatinMetricsRec ),\n\n    (AF_Script_InitMetricsFunc) af_latin2_metrics_init,\n    (AF_Script_ScaleMetricsFunc)af_latin2_metrics_scale,\n    (AF_Script_DoneMetricsFunc) NULL,\n\n    (AF_Script_InitHintsFunc)   af_latin2_hints_init,\n    (AF_Script_ApplyHintsFunc)  af_latin2_hints_apply\n  )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/aflatin2.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  aflatin2.h                                                             */\n/*                                                                         */\n/*    Auto-fitter hinting routines for latin script (specification).       */\n/*                                                                         */\n/*  Copyright 2003-2007, 2012 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFLATIN2_H__\n#define __AFLATIN2_H__\n\n#include \"afhints.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* the latin-specific script class */\n\n  AF_DECLARE_SCRIPT_CLASS( af_latin2_script_class )\n\n/* */\n\nFT_END_HEADER\n\n#endif /* __AFLATIN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afloader.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afloader.c                                                             */\n/*                                                                         */\n/*    Auto-fitter glyph loading routines (body).                           */\n/*                                                                         */\n/*  Copyright 2003-2009, 2011-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"afglobal.h\"\n#include \"afloader.h\"\n#include \"afhints.h\"\n#include \"aferrors.h\"\n#include \"afmodule.h\"\n\n\n  /* Initialize glyph loader. */\n\n  FT_LOCAL_DEF( FT_Error )\n  af_loader_init( AF_Module  module )\n  {\n    AF_Loader  loader = module->loader;\n    FT_Memory  memory = module->root.library->memory;\n\n\n    FT_ZERO( loader );\n\n    af_glyph_hints_init( &loader->hints, memory );\n#ifdef FT_DEBUG_AUTOFIT\n    _af_debug_hints = &loader->hints;\n#endif\n    return FT_GlyphLoader_New( memory, &loader->gloader );\n  }\n\n\n  /* Reset glyph loader and compute globals if necessary. */\n\n  FT_LOCAL_DEF( FT_Error )\n  af_loader_reset( AF_Module  module,\n                   FT_Face    face )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    AF_Loader  loader = module->loader;\n\n\n    loader->face    = face;\n    loader->globals = (AF_FaceGlobals)face->autohint.data;\n\n    FT_GlyphLoader_Rewind( loader->gloader );\n\n    if ( loader->globals == NULL )\n    {\n      error = af_face_globals_new( face, &loader->globals, module );\n      if ( !error )\n      {\n        face->autohint.data =\n          (FT_Pointer)loader->globals;\n        face->autohint.finalizer =\n          (FT_Generic_Finalizer)af_face_globals_free;\n      }\n    }\n\n    return error;\n  }\n\n\n  /* Finalize glyph loader. */\n\n  FT_LOCAL_DEF( void )\n  af_loader_done( AF_Module  module )\n  {\n    AF_Loader  loader = module->loader;\n\n\n    af_glyph_hints_done( &loader->hints );\n\n    loader->face    = NULL;\n    loader->globals = NULL;\n\n#ifdef FT_DEBUG_AUTOFIT\n    _af_debug_hints = NULL;\n#endif\n    FT_GlyphLoader_Done( loader->gloader );\n    loader->gloader = NULL;\n  }\n\n\n  /* Load a single glyph component.  This routine calls itself */\n  /* recursively, if necessary, and does the main work of      */\n  /* `af_loader_load_glyph.'                                   */\n\n  static FT_Error\n  af_loader_load_g( AF_Loader  loader,\n                    AF_Scaler  scaler,\n                    FT_UInt    glyph_index,\n                    FT_Int32   load_flags,\n                    FT_UInt    depth )\n  {\n    FT_Error          error;\n    FT_Face           face     = loader->face;\n    FT_GlyphLoader    gloader  = loader->gloader;\n    AF_ScriptMetrics  metrics  = loader->metrics;\n    AF_GlyphHints     hints    = &loader->hints;\n    FT_GlyphSlot      slot     = face->glyph;\n    FT_Slot_Internal  internal = slot->internal;\n    FT_Int32          flags;\n\n\n    flags = load_flags | FT_LOAD_LINEAR_DESIGN;\n    error = FT_Load_Glyph( face, glyph_index, flags );\n    if ( error )\n      goto Exit;\n\n    loader->transformed = internal->glyph_transformed;\n    if ( loader->transformed )\n    {\n      FT_Matrix  inverse;\n\n\n      loader->trans_matrix = internal->glyph_matrix;\n      loader->trans_delta  = internal->glyph_delta;\n\n      inverse = loader->trans_matrix;\n      FT_Matrix_Invert( &inverse );\n      FT_Vector_Transform( &loader->trans_delta, &inverse );\n    }\n\n    switch ( slot->format )\n    {\n    case FT_GLYPH_FORMAT_OUTLINE:\n      /* translate the loaded glyph when an internal transform is needed */\n      if ( loader->transformed )\n        FT_Outline_Translate( &slot->outline,\n                              loader->trans_delta.x,\n                              loader->trans_delta.y );\n\n      /* copy the outline points in the loader's current                */\n      /* extra points which are used to keep original glyph coordinates */\n      error = FT_GLYPHLOADER_CHECK_POINTS( gloader,\n                                           slot->outline.n_points + 4,\n                                           slot->outline.n_contours );\n      if ( error )\n        goto Exit;\n\n      FT_ARRAY_COPY( gloader->current.outline.points,\n                     slot->outline.points,\n                     slot->outline.n_points );\n\n      FT_ARRAY_COPY( gloader->current.outline.contours,\n                     slot->outline.contours,\n                     slot->outline.n_contours );\n\n      FT_ARRAY_COPY( gloader->current.outline.tags,\n                     slot->outline.tags,\n                     slot->outline.n_points );\n\n      gloader->current.outline.n_points   = slot->outline.n_points;\n      gloader->current.outline.n_contours = slot->outline.n_contours;\n\n      /* compute original horizontal phantom points (and ignore */\n      /* vertical ones)                                         */\n      loader->pp1.x = hints->x_delta;\n      loader->pp1.y = hints->y_delta;\n      loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance,\n                                 hints->x_scale ) + hints->x_delta;\n      loader->pp2.y = hints->y_delta;\n\n      /* be sure to check for spacing glyphs */\n      if ( slot->outline.n_points == 0 )\n        goto Hint_Metrics;\n\n      /* now load the slot image into the auto-outline and run the */\n      /* automatic hinting process                                 */\n      if ( metrics->clazz->script_hints_apply )\n        metrics->clazz->script_hints_apply( hints,\n                                            &gloader->current.outline,\n                                            metrics );\n\n      /* we now need to adjust the metrics according to the change in */\n      /* width/positioning that occurred during the hinting process   */\n      if ( scaler->render_mode != FT_RENDER_MODE_LIGHT )\n      {\n        FT_Pos        old_rsb, old_lsb, new_lsb;\n        FT_Pos        pp1x_uh, pp2x_uh;\n        AF_AxisHints  axis  = &hints->axis[AF_DIMENSION_HORZ];\n        AF_Edge       edge1 = axis->edges;         /* leftmost edge  */\n        AF_Edge       edge2 = edge1 +\n                              axis->num_edges - 1; /* rightmost edge */\n\n\n        if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) )\n        {\n          old_rsb = loader->pp2.x - edge2->opos;\n          old_lsb = edge1->opos;\n          new_lsb = edge1->pos;\n\n          /* remember unhinted values to later account */\n          /* for rounding errors                       */\n\n          pp1x_uh = new_lsb    - old_lsb;\n          pp2x_uh = edge2->pos + old_rsb;\n\n          /* prefer too much space over too little space */\n          /* for very small sizes                        */\n\n          if ( old_lsb < 24 )\n            pp1x_uh -= 8;\n\n          if ( old_rsb < 24 )\n            pp2x_uh += 8;\n\n          loader->pp1.x = FT_PIX_ROUND( pp1x_uh );\n          loader->pp2.x = FT_PIX_ROUND( pp2x_uh );\n\n          if ( loader->pp1.x >= new_lsb && old_lsb > 0 )\n            loader->pp1.x -= 64;\n\n          if ( loader->pp2.x <= edge2->pos && old_rsb > 0 )\n            loader->pp2.x += 64;\n\n          slot->lsb_delta = loader->pp1.x - pp1x_uh;\n          slot->rsb_delta = loader->pp2.x - pp2x_uh;\n        }\n        else\n        {\n          FT_Pos  pp1x = loader->pp1.x;\n          FT_Pos  pp2x = loader->pp2.x;\n\n\n          loader->pp1.x = FT_PIX_ROUND( pp1x );\n          loader->pp2.x = FT_PIX_ROUND( pp2x );\n\n          slot->lsb_delta = loader->pp1.x - pp1x;\n          slot->rsb_delta = loader->pp2.x - pp2x;\n        }\n      }\n      else\n      {\n        FT_Pos  pp1x = loader->pp1.x;\n        FT_Pos  pp2x = loader->pp2.x;\n\n\n        loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta );\n        loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta );\n\n        slot->lsb_delta = loader->pp1.x - pp1x;\n        slot->rsb_delta = loader->pp2.x - pp2x;\n      }\n\n      /* good, we simply add the glyph to our loader's base */\n      FT_GlyphLoader_Add( gloader );\n      break;\n\n    case FT_GLYPH_FORMAT_COMPOSITE:\n      {\n        FT_UInt      nn, num_subglyphs = slot->num_subglyphs;\n        FT_UInt      num_base_subgs, start_point;\n        FT_SubGlyph  subglyph;\n\n\n        start_point = gloader->base.outline.n_points;\n\n        /* first of all, copy the subglyph descriptors in the glyph loader */\n        error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs );\n        if ( error )\n          goto Exit;\n\n        FT_ARRAY_COPY( gloader->current.subglyphs,\n                       slot->subglyphs,\n                       num_subglyphs );\n\n        gloader->current.num_subglyphs = num_subglyphs;\n        num_base_subgs                 = gloader->base.num_subglyphs;\n\n        /* now read each subglyph independently */\n        for ( nn = 0; nn < num_subglyphs; nn++ )\n        {\n          FT_Vector  pp1, pp2;\n          FT_Pos     x, y;\n          FT_UInt    num_points, num_new_points, num_base_points;\n\n\n          /* gloader.current.subglyphs can change during glyph loading due */\n          /* to re-allocation -- we must recompute the current subglyph on */\n          /* each iteration                                                */\n          subglyph = gloader->base.subglyphs + num_base_subgs + nn;\n\n          pp1 = loader->pp1;\n          pp2 = loader->pp2;\n\n          num_base_points = gloader->base.outline.n_points;\n\n          error = af_loader_load_g( loader, scaler, subglyph->index,\n                                    load_flags, depth + 1 );\n          if ( error )\n            goto Exit;\n\n          /* recompute subglyph pointer */\n          subglyph = gloader->base.subglyphs + num_base_subgs + nn;\n\n          if ( subglyph->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS )\n          {\n            pp1 = loader->pp1;\n            pp2 = loader->pp2;\n          }\n          else\n          {\n            loader->pp1 = pp1;\n            loader->pp2 = pp2;\n          }\n\n          num_points     = gloader->base.outline.n_points;\n          num_new_points = num_points - num_base_points;\n\n          /* now perform the transformation required for this subglyph */\n\n          if ( subglyph->flags & ( FT_SUBGLYPH_FLAG_SCALE    |\n                                   FT_SUBGLYPH_FLAG_XY_SCALE |\n                                   FT_SUBGLYPH_FLAG_2X2      ) )\n          {\n            FT_Vector*  cur   = gloader->base.outline.points +\n                                num_base_points;\n            FT_Vector*  limit = cur + num_new_points;\n\n\n            for ( ; cur < limit; cur++ )\n              FT_Vector_Transform( cur, &subglyph->transform );\n          }\n\n          /* apply offset */\n\n          if ( !( subglyph->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) )\n          {\n            FT_Int      k = subglyph->arg1;\n            FT_UInt     l = subglyph->arg2;\n            FT_Vector*  p1;\n            FT_Vector*  p2;\n\n\n            if ( start_point + k >= num_base_points         ||\n                               l >= (FT_UInt)num_new_points )\n            {\n              error = FT_THROW( Invalid_Composite );\n              goto Exit;\n            }\n\n            l += num_base_points;\n\n            /* for now, only use the current point coordinates; */\n            /* we eventually may consider another approach      */\n            p1 = gloader->base.outline.points + start_point + k;\n            p2 = gloader->base.outline.points + start_point + l;\n\n            x = p1->x - p2->x;\n            y = p1->y - p2->y;\n          }\n          else\n          {\n            x = FT_MulFix( subglyph->arg1, hints->x_scale ) + hints->x_delta;\n            y = FT_MulFix( subglyph->arg2, hints->y_scale ) + hints->y_delta;\n\n            x = FT_PIX_ROUND( x );\n            y = FT_PIX_ROUND( y );\n          }\n\n          {\n            FT_Outline  dummy = gloader->base.outline;\n\n\n            dummy.points  += num_base_points;\n            dummy.n_points = (short)num_new_points;\n\n            FT_Outline_Translate( &dummy, x, y );\n          }\n        }\n      }\n      break;\n\n    default:\n      /* we don't support other formats (yet?) */\n      error = FT_THROW( Unimplemented_Feature );\n    }\n\n  Hint_Metrics:\n    if ( depth == 0 )\n    {\n      FT_BBox    bbox;\n      FT_Vector  vvector;\n\n\n      vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX;\n      vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY;\n      vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale );\n      vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale );\n\n      /* transform the hinted outline if needed */\n      if ( loader->transformed )\n      {\n        FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix );\n        FT_Vector_Transform( &vvector, &loader->trans_matrix );\n      }\n#if 1\n      /* we must translate our final outline by -pp1.x and compute */\n      /* the new metrics                                           */\n      if ( loader->pp1.x )\n        FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 );\n#endif\n      FT_Outline_Get_CBox( &gloader->base.outline, &bbox );\n\n      bbox.xMin = FT_PIX_FLOOR( bbox.xMin );\n      bbox.yMin = FT_PIX_FLOOR( bbox.yMin );\n      bbox.xMax = FT_PIX_CEIL(  bbox.xMax );\n      bbox.yMax = FT_PIX_CEIL(  bbox.yMax );\n\n      slot->metrics.width        = bbox.xMax - bbox.xMin;\n      slot->metrics.height       = bbox.yMax - bbox.yMin;\n      slot->metrics.horiBearingX = bbox.xMin;\n      slot->metrics.horiBearingY = bbox.yMax;\n\n      slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x );\n      slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y );\n\n      /* for mono-width fonts (like Andale, Courier, etc.) we need */\n      /* to keep the original rounded advance width; ditto for     */\n      /* digits if all have the same advance width                 */\n#if 0\n      if ( !FT_IS_FIXED_WIDTH( slot->face ) )\n        slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;\n      else\n        slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance,\n                                               x_scale );\n#else\n      if ( scaler->render_mode != FT_RENDER_MODE_LIGHT                      &&\n           ( FT_IS_FIXED_WIDTH( slot->face )                              ||\n             ( af_face_globals_is_digit( loader->globals, glyph_index ) &&\n               metrics->digits_have_same_width                          ) ) )\n      {\n        slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance,\n                                               metrics->scaler.x_scale );\n\n        /* Set delta values to 0.  Otherwise code that uses them is */\n        /* going to ruin the fixed advance width.                   */\n        slot->lsb_delta = 0;\n        slot->rsb_delta = 0;\n      }\n      else\n      {\n        /* non-spacing glyphs must stay as-is */\n        if ( slot->metrics.horiAdvance )\n          slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;\n      }\n#endif\n\n      slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance,\n                                             metrics->scaler.y_scale );\n\n      slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance );\n      slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance );\n\n      /* now copy outline into glyph slot */\n      FT_GlyphLoader_Rewind( internal->loader );\n      error = FT_GlyphLoader_CopyPoints( internal->loader, gloader );\n      if ( error )\n        goto Exit;\n\n      /* reassign all outline fields except flags to protect them */\n      slot->outline.n_contours = internal->loader->base.outline.n_contours;\n      slot->outline.n_points   = internal->loader->base.outline.n_points;\n      slot->outline.points     = internal->loader->base.outline.points;\n      slot->outline.tags       = internal->loader->base.outline.tags;\n      slot->outline.contours   = internal->loader->base.outline.contours;\n\n      slot->format  = FT_GLYPH_FORMAT_OUTLINE;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* Load a glyph. */\n\n  FT_LOCAL_DEF( FT_Error )\n  af_loader_load_glyph( AF_Module  module,\n                        FT_Face    face,\n                        FT_UInt    gindex,\n                        FT_Int32   load_flags )\n  {\n    FT_Error      error;\n    FT_Size       size   = face->size;\n    AF_Loader     loader = module->loader;\n    AF_ScalerRec  scaler;\n\n\n    if ( !size )\n      return FT_THROW( Invalid_Argument );\n\n    FT_ZERO( &scaler );\n\n    scaler.face    = face;\n    scaler.x_scale = size->metrics.x_scale;\n    scaler.x_delta = 0;  /* XXX: TODO: add support for sub-pixel hinting */\n    scaler.y_scale = size->metrics.y_scale;\n    scaler.y_delta = 0;  /* XXX: TODO: add support for sub-pixel hinting */\n\n    scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags );\n    scaler.flags       = 0;  /* XXX: fix this */\n\n    error = af_loader_reset( module, face );\n    if ( !error )\n    {\n      AF_ScriptMetrics  metrics;\n      FT_UInt           options = 0;\n\n\n#ifdef FT_OPTION_AUTOFIT2\n      /* XXX: undocumented hook to activate the latin2 hinter */\n      if ( load_flags & ( 1UL << 20 ) )\n        options = 2;\n#endif\n\n      error = af_face_globals_get_metrics( loader->globals, gindex,\n                                           options, &metrics );\n      if ( !error )\n      {\n        loader->metrics = metrics;\n\n        if ( metrics->clazz->script_metrics_scale )\n          metrics->clazz->script_metrics_scale( metrics, &scaler );\n        else\n          metrics->scaler = scaler;\n\n        load_flags |=  FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM;\n        load_flags &= ~FT_LOAD_RENDER;\n\n        if ( metrics->clazz->script_hints_init )\n        {\n          error = metrics->clazz->script_hints_init( &loader->hints,\n                                                     metrics );\n          if ( error )\n            goto Exit;\n        }\n\n        error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 );\n      }\n    }\n  Exit:\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afloader.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afloader.h                                                             */\n/*                                                                         */\n/*    Auto-fitter glyph loading routines (specification).                  */\n/*                                                                         */\n/*  Copyright 2003-2005, 2011-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFLOADER_H__\n#define __AFLOADER_H__\n\n#include \"afhints.h\"\n#include \"afglobal.h\"\n\n\nFT_BEGIN_HEADER\n\n  typedef struct AF_ModuleRec_*  AF_Module;\n\n  /*\n   *  The autofitter module's (global) data structure to communicate with\n   *  actual fonts.  If necessary, `local' data like the current face, the\n   *  current face's auto-hint data, or the current glyph's parameters\n   *  relevant to auto-hinting are `swapped in'.  Cf. functions like\n   *  `af_loader_reset' and `af_loader_load_g'.\n   */\n\n  typedef struct  AF_LoaderRec_\n  {\n    /* current face data */\n    FT_Face           face;\n    AF_FaceGlobals    globals;\n\n    /* current glyph data */\n    FT_GlyphLoader    gloader;\n    AF_GlyphHintsRec  hints;\n    AF_ScriptMetrics  metrics;\n    FT_Bool           transformed;\n    FT_Matrix         trans_matrix;\n    FT_Vector         trans_delta;\n    FT_Vector         pp1;\n    FT_Vector         pp2;\n    /* we don't handle vertical phantom points */\n\n  } AF_LoaderRec, *AF_Loader;\n\n\n  FT_LOCAL( FT_Error )\n  af_loader_init( AF_Module  module );\n\n\n  FT_LOCAL( FT_Error )\n  af_loader_reset( AF_Module  module,\n                   FT_Face    face );\n\n\n  FT_LOCAL( void )\n  af_loader_done( AF_Module  module );\n\n\n  FT_LOCAL( FT_Error )\n  af_loader_load_glyph( AF_Module  module,\n                        FT_Face    face,\n                        FT_UInt    gindex,\n                        FT_Int32   load_flags );\n\n/* */\n\n\nFT_END_HEADER\n\n#endif /* __AFLOADER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afmodule.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afmodule.c                                                             */\n/*                                                                         */\n/*    Auto-fitter module implementation (body).                            */\n/*                                                                         */\n/*  Copyright 2003-2006, 2009, 2011-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"afglobal.h\"\n#include \"afmodule.h\"\n#include \"afloader.h\"\n#include \"aferrors.h\"\n#include \"afpic.h\"\n\n#ifdef FT_DEBUG_AUTOFIT\n  int    _af_debug_disable_horz_hints;\n  int    _af_debug_disable_vert_hints;\n  int    _af_debug_disable_blue_hints;\n  void*  _af_debug_hints;\n#endif\n\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_AUTOHINTER_H\n#include FT_SERVICE_PROPERTIES_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_afmodule\n\n\n  FT_Error\n  af_property_get_face_globals( FT_Face          face,\n                                AF_FaceGlobals*  aglobals,\n                                AF_Module        module )\n  {\n    FT_Error        error = FT_Err_Ok;\n    AF_FaceGlobals  globals;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Argument );\n\n    globals = (AF_FaceGlobals)face->autohint.data;\n    if ( !globals )\n    {\n      /* trigger computation of the global script data */\n      /* in case it hasn't been done yet               */\n      error = af_face_globals_new( face, &globals, module );\n      if ( !error )\n      {\n        face->autohint.data =\n          (FT_Pointer)globals;\n        face->autohint.finalizer =\n          (FT_Generic_Finalizer)af_face_globals_free;\n      }\n    }\n\n    if ( !error )\n      *aglobals = globals;\n\n    return error;\n  }\n\n\n  FT_Error\n  af_property_set( FT_Module    ft_module,\n                   const char*  property_name,\n                   const void*  value )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    AF_Module  module = (AF_Module)ft_module;\n\n\n    if ( !ft_strcmp( property_name, \"fallback-script\" ) )\n    {\n      FT_UInt*  fallback_script = (FT_UInt*)value;\n\n\n      module->fallback_script = *fallback_script;\n\n      return error;\n    }\n    else if ( !ft_strcmp( property_name, \"increase-x-height\" ) )\n    {\n      FT_Prop_IncreaseXHeight*  prop = (FT_Prop_IncreaseXHeight*)value;\n      AF_FaceGlobals            globals;\n\n\n      error = af_property_get_face_globals( prop->face, &globals, module );\n      if ( !error )\n        globals->increase_x_height = prop->limit;\n\n      return error;\n    }\n\n    FT_TRACE0(( \"af_property_set: missing property `%s'\\n\",\n                property_name ));\n    return FT_THROW( Missing_Property );\n  }\n\n\n  FT_Error\n  af_property_get( FT_Module    ft_module,\n                   const char*  property_name,\n                   void*        value )\n  {\n    FT_Error   error           = FT_Err_Ok;\n    AF_Module  module          = (AF_Module)ft_module;\n    FT_UInt    fallback_script = module->fallback_script;\n\n\n    if ( !ft_strcmp( property_name, \"glyph-to-script-map\" ) )\n    {\n      FT_Prop_GlyphToScriptMap*  prop = (FT_Prop_GlyphToScriptMap*)value;\n      AF_FaceGlobals             globals;\n\n\n      error = af_property_get_face_globals( prop->face, &globals, module );\n      if ( !error )\n        prop->map = globals->glyph_scripts;\n\n      return error;\n    }\n    else if ( !ft_strcmp( property_name, \"fallback-script\" ) )\n    {\n      FT_UInt*  val = (FT_UInt*)value;\n\n\n      *val = fallback_script;\n\n      return error;\n    }\n    else if ( !ft_strcmp( property_name, \"increase-x-height\" ) )\n    {\n      FT_Prop_IncreaseXHeight*  prop = (FT_Prop_IncreaseXHeight*)value;\n      AF_FaceGlobals            globals;\n\n\n      error = af_property_get_face_globals( prop->face, &globals, module );\n      if ( !error )\n        prop->limit = globals->increase_x_height;\n\n      return error;\n    }\n\n\n    FT_TRACE0(( \"af_property_get: missing property `%s'\\n\",\n                property_name ));\n    return FT_THROW( Missing_Property );\n  }\n\n\n  FT_DEFINE_SERVICE_PROPERTIESREC(\n    af_service_properties,\n    (FT_Properties_SetFunc)af_property_set,\n    (FT_Properties_GetFunc)af_property_get )\n\n\n  FT_DEFINE_SERVICEDESCREC1(\n    af_services,\n    FT_SERVICE_ID_PROPERTIES, &AF_SERVICE_PROPERTIES_GET )\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  af_get_interface( FT_Module    module,\n                    const char*  module_interface )\n  {\n    /* AF_SERVICES_GET derefers `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    FT_Library  library;\n\n\n    if ( !module )\n      return NULL;\n    library = module->library;\n    if ( !library )\n      return NULL;\n#else\n    FT_UNUSED( module );\n#endif\n\n    return ft_service_list_lookup( AF_SERVICES_GET, module_interface );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  af_autofitter_init( FT_Module  ft_module )      /* AF_Module */\n  {\n    AF_Module  module = (AF_Module)ft_module;\n\n\n    module->fallback_script = AF_SCRIPT_FALLBACK;\n\n    return af_loader_init( module );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  af_autofitter_done( FT_Module  ft_module )      /* AF_Module */\n  {\n    AF_Module  module = (AF_Module)ft_module;\n\n\n    af_loader_done( module );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  af_autofitter_load_glyph( AF_Module     module,\n                            FT_GlyphSlot  slot,\n                            FT_Size       size,\n                            FT_UInt       glyph_index,\n                            FT_Int32      load_flags )\n  {\n    FT_UNUSED( size );\n\n    return af_loader_load_glyph( module, slot->face,\n                                 glyph_index, load_flags );\n  }\n\n\n  FT_DEFINE_AUTOHINTER_INTERFACE(\n    af_autofitter_interface,\n    NULL,                                                    /* reset_face */\n    NULL,                                              /* get_global_hints */\n    NULL,                                             /* done_global_hints */\n    (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph )  /* load_glyph */\n\n\n  FT_DEFINE_MODULE(\n    autofit_module_class,\n\n    FT_MODULE_HINTER,\n    sizeof ( AF_ModuleRec ),\n\n    \"autofitter\",\n    0x10000L,   /* version 1.0 of the autofitter  */\n    0x20000L,   /* requires FreeType 2.0 or above */\n\n    (const void*)&AF_INTERFACE_GET,\n\n    (FT_Module_Constructor)af_autofitter_init,\n    (FT_Module_Destructor) af_autofitter_done,\n    (FT_Module_Requester)  af_get_interface )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afmodule.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afmodule.h                                                             */\n/*                                                                         */\n/*    Auto-fitter module implementation (specification).                   */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2005 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFMODULE_H__\n#define __AFMODULE_H__\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_MODULE_H\n\n#include \"afloader.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   *  This is the `extended' FT_Module structure which holds the\n   *  autofitter's global data.  Right before hinting a glyph, the data\n   *  specific to the glyph's face (blue zones, stem widths, etc.) are\n   *  loaded into `loader' (see function `af_loader_reset').\n   */\n\n  typedef struct  AF_ModuleRec_\n  {\n    FT_ModuleRec  root;\n\n    FT_UInt       fallback_script;\n\n    AF_LoaderRec  loader[1];\n\n  } AF_ModuleRec;\n\n\nFT_DECLARE_MODULE(autofit_module_class)\n\n\nFT_END_HEADER\n\n#endif /* __AFMODULE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afpic.c                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for autofit module.  */\n/*                                                                         */\n/*  Copyright 2009-2013 by                                                 */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"afpic.h\"\n#include \"aferrors.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from afmodule.c */\n  FT_Error\n  FT_Create_Class_af_services( FT_Library           library,\n                               FT_ServiceDescRec**  output_class );\n\n  void\n  FT_Destroy_Class_af_services( FT_Library          library,\n                                FT_ServiceDescRec*  clazz );\n\n  void\n  FT_Init_Class_af_service_properties( FT_Service_PropertiesRec*  clazz );\n\n  void FT_Init_Class_af_autofitter_interface(\n    FT_Library                   library,\n    FT_AutoHinter_InterfaceRec*  clazz );\n\n\n  /* forward declaration of PIC init functions from script classes */\n#include \"aflatin.h\"\n#ifdef FT_OPTION_AUTOFIT2\n#include \"aflatin2.h\"\n#endif\n#include \"afcjk.h\"\n#include \"afdummy.h\"\n#include \"afindic.h\"\n\n\n  void\n  autofit_module_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->autofit )\n    {\n      AFModulePIC*  container = (AFModulePIC*)pic_container->autofit;\n\n\n      if ( container->af_services )\n        FT_Destroy_Class_af_services( library,\n                                      container->af_services );\n      container->af_services = NULL;\n\n      FT_FREE( container );\n      pic_container->autofit = NULL;\n    }\n  }\n\n\n  FT_Error\n  autofit_module_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_UInt            ss;\n    FT_Error           error         = FT_Err_Ok;\n    AFModulePIC*       container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC ( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->autofit = container;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    error = FT_Create_Class_af_services( library,\n                                         &container->af_services );\n    if ( error )\n      goto Exit;\n\n    FT_Init_Class_af_service_properties( &container->af_service_properties );\n\n    for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ )\n    {\n      container->af_script_classes[ss] =\n        &container->af_script_classes_rec[ss];\n    }\n    container->af_script_classes[AF_SCRIPT_CLASSES_COUNT - 1] = NULL;\n\n    /* add call to initialization function when you add new scripts */\n    ss = 0;\n    FT_Init_Class_af_dummy_script_class(\n      &container->af_script_classes_rec[ss++] );\n#ifdef FT_OPTION_AUTOFIT2\n    FT_Init_Class_af_latin2_script_class(\n      &container->af_script_classes_rec[ss++] );\n#endif\n    FT_Init_Class_af_latin_script_class(\n      &container->af_script_classes_rec[ss++] );\n    FT_Init_Class_af_cjk_script_class(\n      &container->af_script_classes_rec[ss++] );\n    FT_Init_Class_af_indic_script_class(\n      &container->af_script_classes_rec[ss++] );\n\n    FT_Init_Class_af_autofitter_interface(\n      library, &container->af_autofitter_interface );\n\n  Exit:\n    if ( error )\n      autofit_module_class_pic_free( library );\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afpic.h                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for autofit module.  */\n/*                                                                         */\n/*  Copyright 2009, 2011-2012 by                                           */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFPIC_H__\n#define __AFPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include FT_INTERNAL_PIC_H\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define AF_SERVICES_GET            af_services\n#define AF_SERVICE_PROPERTIES_GET  af_service_properties\n\n#define AF_SCRIPT_CLASSES_GET      af_script_classes\n#define AF_INTERFACE_GET           af_autofitter_interface\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  /* some include files required for members of AFModulePIC */\n#include FT_SERVICE_PROPERTIES_H\n\n#include \"aftypes.h\"\n\n  /* increase these when you add new scripts, */\n  /* and update autofit_module_class_pic_init */\n#ifdef FT_OPTION_AUTOFIT2\n#define AF_SCRIPT_CLASSES_COUNT  6\n#else\n#define AF_SCRIPT_CLASSES_COUNT  5\n#endif\n\n#define AF_SCRIPT_CLASSES_REC_COUNT  ( AF_SCRIPT_CLASSES_COUNT - 1 )\n\n\n  typedef struct  AFModulePIC_\n  {\n    FT_ServiceDescRec*          af_services;\n    FT_Service_PropertiesRec    af_service_properties;\n\n    AF_ScriptClass              af_script_classes[AF_SCRIPT_CLASSES_COUNT];\n    AF_ScriptClassRec           af_script_classes_rec[AF_SCRIPT_CLASSES_REC_COUNT];\n    FT_AutoHinter_InterfaceRec  af_autofitter_interface;\n\n  } AFModulePIC;\n\n\n#define GET_PIC( lib )  \\\n          ( (AFModulePIC*)((lib)->pic_container.autofit) )\n\n#define AF_SERVICES_GET  \\\n          ( GET_PIC( library )->af_services )\n#define AF_SERVICE_PROPERTIES_GET  \\\n          ( GET_PIC( library )->af_service_properties )\n\n#define AF_SCRIPT_CLASSES_GET  \\\n          ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_script_classes )\n#define AF_INTERFACE_GET  \\\n          ( GET_PIC( library )->af_autofitter_interface )\n\n\n  /* see afpic.c for the implementation */\n  void\n  autofit_module_class_pic_free( FT_Library  library );\n\n  FT_Error\n  autofit_module_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __AFPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/aftypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  aftypes.h                                                              */\n/*                                                                         */\n/*    Auto-fitter types (specification only).                              */\n/*                                                                         */\n/*  Copyright 2003-2009, 2011-2012 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************\n   *\n   *  The auto-fitter is a complete rewrite of the old auto-hinter.\n   *  Its main feature is the ability to differentiate between different\n   *  scripts in order to apply language-specific rules.\n   *\n   *  The code has also been compartmentized into several entities that\n   *  should make algorithmic experimentation easier than with the old\n   *  code.\n   *\n   *  Finally, we get rid of the Catharon license, since this code is\n   *  released under the FreeType one.\n   *\n   *************************************************************************/\n\n\n#ifndef __AFTYPES_H__\n#define __AFTYPES_H__\n\n#include <ft2build.h>\n\n#include FT_FREETYPE_H\n#include FT_OUTLINE_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    D E B U G G I N G                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#ifdef FT_DEBUG_AUTOFIT\n\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\nextern int    _af_debug_disable_horz_hints;\nextern int    _af_debug_disable_vert_hints;\nextern int    _af_debug_disable_blue_hints;\nextern void*  _af_debug_hints;\n\n#endif /* FT_DEBUG_AUTOFIT */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                 U T I L I T Y   S T U F F                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  AF_WidthRec_\n  {\n    FT_Pos  org;  /* original position/width in font units              */\n    FT_Pos  cur;  /* current/scaled position/width in device sub-pixels */\n    FT_Pos  fit;  /* current/fitted position/width in device sub-pixels */\n\n  } AF_WidthRec, *AF_Width;\n\n\n  FT_LOCAL( void )\n  af_sort_pos( FT_UInt  count,\n               FT_Pos*  table );\n\n  FT_LOCAL( void )\n  af_sort_and_quantize_widths( FT_UInt*  count,\n                               AF_Width  widths,\n                               FT_Pos    threshold );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                   A N G L E   T Y P E S                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   *  The auto-fitter doesn't need a very high angular accuracy;\n   *  this allows us to speed up some computations considerably with a\n   *  light Cordic algorithm (see afangles.c).\n   */\n\n  typedef FT_Int  AF_Angle;\n\n\n#define AF_ANGLE_PI   256\n#define AF_ANGLE_2PI  ( AF_ANGLE_PI * 2 )\n#define AF_ANGLE_PI2  ( AF_ANGLE_PI / 2 )\n#define AF_ANGLE_PI4  ( AF_ANGLE_PI / 4 )\n\n\n#if 0\n  /*\n   *  compute the angle of a given 2-D vector\n   */\n  FT_LOCAL( AF_Angle )\n  af_angle_atan( FT_Pos  dx,\n                 FT_Pos  dy );\n\n\n  /*\n   *  compute `angle2 - angle1'; the result is always within\n   *  the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]\n   */\n  FT_LOCAL( AF_Angle )\n  af_angle_diff( AF_Angle  angle1,\n                 AF_Angle  angle2 );\n#endif /* 0 */\n\n\n#define AF_ANGLE_DIFF( result, angle1, angle2 ) \\\n  FT_BEGIN_STMNT                                \\\n    AF_Angle  _delta = (angle2) - (angle1);     \\\n                                                \\\n                                                \\\n    _delta %= AF_ANGLE_2PI;                     \\\n    if ( _delta < 0 )                           \\\n      _delta += AF_ANGLE_2PI;                   \\\n                                                \\\n    if ( _delta > AF_ANGLE_PI )                 \\\n      _delta -= AF_ANGLE_2PI;                   \\\n                                                \\\n    result = _delta;                            \\\n  FT_END_STMNT\n\n\n  /*  opaque handle to glyph-specific hints -- see `afhints.h' for more\n   *  details\n   */\n  typedef struct AF_GlyphHintsRec_*  AF_GlyphHints;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       S C A L E R S                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   *  A scaler models the target pixel device that will receive the\n   *  auto-hinted glyph image.\n   */\n\n  typedef enum  AF_ScalerFlags_\n  {\n    AF_SCALER_FLAG_NO_HORIZONTAL = 1,  /* disable horizontal hinting */\n    AF_SCALER_FLAG_NO_VERTICAL   = 2,  /* disable vertical hinting   */\n    AF_SCALER_FLAG_NO_ADVANCE    = 4   /* disable advance hinting    */\n\n  } AF_ScalerFlags;\n\n\n  typedef struct  AF_ScalerRec_\n  {\n    FT_Face         face;        /* source font face                        */\n    FT_Fixed        x_scale;     /* from font units to 1/64th device pixels */\n    FT_Fixed        y_scale;     /* from font units to 1/64th device pixels */\n    FT_Pos          x_delta;     /* in 1/64th device pixels                 */\n    FT_Pos          y_delta;     /* in 1/64th device pixels                 */\n    FT_Render_Mode  render_mode; /* monochrome, anti-aliased, LCD, etc.     */\n    FT_UInt32       flags;       /* additional control flags, see above     */\n\n  } AF_ScalerRec, *AF_Scaler;\n\n\n#define AF_SCALER_EQUAL_SCALES( a, b )      \\\n          ( (a)->x_scale == (b)->x_scale && \\\n            (a)->y_scale == (b)->y_scale && \\\n            (a)->x_delta == (b)->x_delta && \\\n            (a)->y_delta == (b)->y_delta )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       S C R I P T S                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n   *  The list of known scripts.  Each different script corresponds to the\n   *  following information:\n   *\n   *   - A set of Unicode ranges to test whether the face supports the\n   *     script.\n   *\n   *   - A specific global analyzer that will compute global metrics\n   *     specific to the script.\n   *\n   *   - A specific glyph analyzer that will compute segments and\n   *     edges for each glyph covered by the script.\n   *\n   *   - A specific grid-fitting algorithm that will distort the\n   *     scaled glyph outline according to the results of the glyph\n   *     analyzer.\n   *\n   *  Note that a given analyzer and/or grid-fitting algorithm can be\n   *  used by more than one script.\n   */\n\n  typedef enum  AF_Script_\n  {\n    AF_SCRIPT_DUMMY = 0,\n    AF_SCRIPT_LATIN = 1,\n    AF_SCRIPT_CJK   = 2,\n    AF_SCRIPT_INDIC = 3,\n#ifdef FT_OPTION_AUTOFIT2\n    AF_SCRIPT_LATIN2 = 4,\n#endif\n\n    /* add new scripts here.  Don't forget to update the list in */\n    /* `afglobal.c'.                                             */\n\n    AF_SCRIPT_MAX   /* do not remove */\n\n  } AF_Script;\n\n\n  typedef struct AF_ScriptClassRec_ const*  AF_ScriptClass;\n  typedef struct AF_FaceGlobalsRec_*        AF_FaceGlobals;\n\n  typedef struct  AF_ScriptMetricsRec_\n  {\n    AF_ScriptClass  clazz;\n    AF_ScalerRec    scaler;\n    FT_Bool         digits_have_same_width;\n\n    AF_FaceGlobals  globals;    /* to access properties */\n\n  } AF_ScriptMetricsRec, *AF_ScriptMetrics;\n\n\n  /*  This function parses an FT_Face to compute global metrics for\n   *  a specific script.\n   */\n  typedef FT_Error\n  (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics  metrics,\n                                FT_Face           face );\n\n  typedef void\n  (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics  metrics,\n                                 AF_Scaler         scaler );\n\n  typedef void\n  (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics  metrics );\n\n\n  typedef FT_Error\n  (*AF_Script_InitHintsFunc)( AF_GlyphHints     hints,\n                              AF_ScriptMetrics  metrics );\n\n  typedef void\n  (*AF_Script_ApplyHintsFunc)( AF_GlyphHints     hints,\n                               FT_Outline*       outline,\n                               AF_ScriptMetrics  metrics );\n\n\n  typedef struct  AF_Script_UniRangeRec_\n  {\n    FT_UInt32  first;\n    FT_UInt32  last;\n\n  } AF_Script_UniRangeRec;\n\n#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }\n\n  typedef const AF_Script_UniRangeRec  *AF_Script_UniRange;\n\n\n  typedef struct  AF_ScriptClassRec_\n  {\n    AF_Script           script;\n    AF_Script_UniRange  script_uni_ranges; /* last must be { 0, 0 }        */\n    FT_UInt32           standard_char;     /* for default width and height */\n\n    FT_Offset                   script_metrics_size;\n    AF_Script_InitMetricsFunc   script_metrics_init;\n    AF_Script_ScaleMetricsFunc  script_metrics_scale;\n    AF_Script_DoneMetricsFunc   script_metrics_done;\n\n    AF_Script_InitHintsFunc     script_hints_init;\n    AF_Script_ApplyHintsFunc    script_hints_apply;\n\n  } AF_ScriptClassRec;\n\n\n  /* Declare and define vtables for classes */\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define AF_DECLARE_SCRIPT_CLASS( script_class ) \\\n  FT_CALLBACK_TABLE const AF_ScriptClassRec     \\\n  script_class;\n\n#define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char,   \\\n                                m_size,                                    \\\n                                m_init, m_scale, m_done, h_init, h_apply ) \\\n  FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec  script_class =            \\\n  {                                                                        \\\n    script_,                                                               \\\n    ranges,                                                                \\\n    def_char,                                                              \\\n                                                                           \\\n    m_size,                                                                \\\n                                                                           \\\n    m_init,                                                                \\\n    m_scale,                                                               \\\n    m_done,                                                                \\\n                                                                           \\\n    h_init,                                                                \\\n    h_apply                                                                \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define AF_DECLARE_SCRIPT_CLASS( script_class )             \\\n  FT_LOCAL( void )                                          \\\n  FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac );\n\n#define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char,   \\\n                                m_size,                                    \\\n                                m_init, m_scale, m_done, h_init, h_apply ) \\\n  FT_LOCAL_DEF( void )                                                     \\\n  FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac )                 \\\n  {                                                                        \\\n    ac->script               = script_;                                    \\\n    ac->script_uni_ranges    = ranges;                                     \\\n    ac->default_char         = def_char;                                   \\\n                                                                           \\\n    ac->script_metrics_size  = m_size;                                     \\\n                                                                           \\\n    ac->script_metrics_init  = m_init;                                     \\\n    ac->script_metrics_scale = m_scale;                                    \\\n    ac->script_metrics_done  = m_done;                                     \\\n                                                                           \\\n    ac->script_hints_init    = h_init;                                     \\\n    ac->script_hints_apply   = h_apply;                                    \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* */\n\nFT_END_HEADER\n\n#endif /* __AFTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afwarp.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afwarp.c                                                               */\n/*                                                                         */\n/*    Auto-fitter warping algorithm (body).                                */\n/*                                                                         */\n/*  Copyright 2006, 2007, 2011 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*\n   *  The idea of the warping code is to slightly scale and shift a glyph\n   *  within a single dimension so that as much of its segments are aligned\n   *  (more or less) on the grid.  To find out the optimal scaling and\n   *  shifting value, various parameter combinations are tried and scored.\n   */\n\n#include \"afwarp.h\"\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_afwarp\n\n\n  /* The weights cover the range 0/64 - 63/64 of a pixel.  Obviously, */\n  /* values around a half pixel (which means exactly between two grid */\n  /* lines) gets the worst weight.                                    */\n#if 1\n  static const AF_WarpScore\n  af_warper_weights[64] =\n  {\n    35, 32, 30, 25, 20, 15, 12, 10,  5,  1,  0,  0,  0,  0,  0,  0,\n     0,  0,  0,  0,  0,  0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30,\n\n   -30,-30,-20,-20,-10,-10, -8, -5, -2, -1,  0,  0,  0,  0,  0,  0,\n     0,  0,  0,  0,  0,  0,  0,  1,  5, 10, 12, 15, 20, 25, 30, 32,\n  };\n#else\n  static const AF_WarpScore\n  af_warper_weights[64] =\n  {\n    30, 20, 10,  5,  4,  4,  3,  2,  1,  0,  0,  0,  0,  0,  0,  0,\n     0,  0,  0,  0,  0,  0,  0, -1, -2, -2, -5, -5,-10,-10,-15,-20,\n\n   -20,-15,-15,-10,-10, -5, -5, -2, -2, -1,  0,  0,  0,  0,  0,  0,\n     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  4,  5, 10, 20,\n  };\n#endif\n\n\n  /* Score segments for a given `scale' and `delta' in the range */\n  /* `xx1' to `xx2', and store the best result in `warper'.  If  */\n  /* the new best score is equal to the old one, prefer the      */\n  /* value with a smaller distortion (around `base_distort').    */\n\n  static void\n  af_warper_compute_line_best( AF_Warper     warper,\n                               FT_Fixed      scale,\n                               FT_Pos        delta,\n                               FT_Pos        xx1,\n                               FT_Pos        xx2,\n                               AF_WarpScore  base_distort,\n                               AF_Segment    segments,\n                               FT_UInt       num_segments )\n  {\n    FT_Int        idx_min, idx_max, idx0;\n    FT_UInt       nn;\n    AF_WarpScore  scores[65];\n\n\n    for ( nn = 0; nn < 65; nn++ )\n      scores[nn] = 0;\n\n    idx0 = xx1 - warper->t1;\n\n    /* compute minimum and maximum indices */\n    {\n      FT_Pos  xx1min = warper->x1min;\n      FT_Pos  xx1max = warper->x1max;\n      FT_Pos  w      = xx2 - xx1;\n\n\n      if ( xx1min + w < warper->x2min )\n        xx1min = warper->x2min - w;\n\n      xx1max = warper->x1max;\n      if ( xx1max + w > warper->x2max )\n        xx1max = warper->x2max - w;\n\n      idx_min = xx1min - warper->t1;\n      idx_max = xx1max - warper->t1;\n\n      if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 )\n      {\n        FT_TRACE5(( \"invalid indices:\\n\"\n                    \"  min=%d max=%d, xx1=%ld xx2=%ld,\\n\"\n                    \"  x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\\n\",\n                    idx_min, idx_max, xx1, xx2,\n                    warper->x1min, warper->x1max,\n                    warper->x2min, warper->x2max ));\n        return;\n      }\n    }\n\n    for ( nn = 0; nn < num_segments; nn++ )\n    {\n      FT_Pos  len = segments[nn].max_coord - segments[nn].min_coord;\n      FT_Pos  y0  = FT_MulFix( segments[nn].pos, scale ) + delta;\n      FT_Pos  y   = y0 + ( idx_min - idx0 );\n      FT_Int  idx;\n\n\n      /* score the length of the segments for the given range */\n      for ( idx = idx_min; idx <= idx_max; idx++, y++ )\n        scores[idx] += af_warper_weights[y & 63] * len;\n    }\n\n    /* find best score */\n    {\n      FT_Int  idx;\n\n\n      for ( idx = idx_min; idx <= idx_max; idx++ )\n      {\n        AF_WarpScore  score = scores[idx];\n        AF_WarpScore  distort = base_distort + ( idx - idx0 );\n\n\n        if ( score > warper->best_score         ||\n             ( score == warper->best_score    &&\n               distort < warper->best_distort ) )\n        {\n          warper->best_score   = score;\n          warper->best_distort = distort;\n          warper->best_scale   = scale;\n          warper->best_delta   = delta + ( idx - idx0 );\n        }\n      }\n    }\n  }\n\n\n  /* Compute optimal scaling and delta values for a given glyph and */\n  /* dimension.                                                     */\n\n  FT_LOCAL_DEF( void )\n  af_warper_compute( AF_Warper      warper,\n                     AF_GlyphHints  hints,\n                     AF_Dimension   dim,\n                     FT_Fixed      *a_scale,\n                     FT_Pos        *a_delta )\n  {\n    AF_AxisHints  axis;\n    AF_Point      points;\n\n    FT_Fixed      org_scale;\n    FT_Pos        org_delta;\n\n    FT_UInt       nn, num_points, num_segments;\n    FT_Int        X1, X2;\n    FT_Int        w;\n\n    AF_WarpScore  base_distort;\n    AF_Segment    segments;\n\n\n    /* get original scaling transformation */\n    if ( dim == AF_DIMENSION_VERT )\n    {\n      org_scale = hints->y_scale;\n      org_delta = hints->y_delta;\n    }\n    else\n    {\n      org_scale = hints->x_scale;\n      org_delta = hints->x_delta;\n    }\n\n    warper->best_scale   = org_scale;\n    warper->best_delta   = org_delta;\n    warper->best_score   = INT_MIN;\n    warper->best_distort = 0;\n\n    axis         = &hints->axis[dim];\n    segments     = axis->segments;\n    num_segments = axis->num_segments;\n    points       = hints->points;\n    num_points   = hints->num_points;\n\n    *a_scale = org_scale;\n    *a_delta = org_delta;\n\n    /* get X1 and X2, minimum and maximum in original coordinates */\n    if ( num_segments < 1 )\n      return;\n\n#if 1\n    X1 = X2 = points[0].fx;\n    for ( nn = 1; nn < num_points; nn++ )\n    {\n      FT_Int  X = points[nn].fx;\n\n\n      if ( X < X1 )\n        X1 = X;\n      if ( X > X2 )\n        X2 = X;\n    }\n#else\n    X1 = X2 = segments[0].pos;\n    for ( nn = 1; nn < num_segments; nn++ )\n    {\n      FT_Int  X = segments[nn].pos;\n\n\n      if ( X < X1 )\n        X1 = X;\n      if ( X > X2 )\n        X2 = X;\n    }\n#endif\n\n    if ( X1 >= X2 )\n      return;\n\n    warper->x1 = FT_MulFix( X1, org_scale ) + org_delta;\n    warper->x2 = FT_MulFix( X2, org_scale ) + org_delta;\n\n    warper->t1 = AF_WARPER_FLOOR( warper->x1 );\n    warper->t2 = AF_WARPER_CEIL( warper->x2 );\n\n    /* examine a half pixel wide range around the maximum coordinates */\n    warper->x1min = warper->x1 & ~31;\n    warper->x1max = warper->x1min + 32;\n    warper->x2min = warper->x2 & ~31;\n    warper->x2max = warper->x2min + 32;\n\n    if ( warper->x1max > warper->x2 )\n      warper->x1max = warper->x2;\n\n    if ( warper->x2min < warper->x1 )\n      warper->x2min = warper->x1;\n\n    warper->w0 = warper->x2 - warper->x1;\n\n    if ( warper->w0 <= 64 )\n    {\n      warper->x1max = warper->x1;\n      warper->x2min = warper->x2;\n    }\n\n    /* examine (at most) a pixel wide range around the natural width */\n    warper->wmin = warper->x2min - warper->x1max;\n    warper->wmax = warper->x2max - warper->x1min;\n\n#if 1\n    /* some heuristics to reduce the number of widths to be examined */\n    {\n      int  margin = 16;\n\n\n      if ( warper->w0 <= 128 )\n      {\n         margin = 8;\n         if ( warper->w0 <= 96 )\n           margin = 4;\n      }\n\n      if ( warper->wmin < warper->w0 - margin )\n        warper->wmin = warper->w0 - margin;\n\n      if ( warper->wmax > warper->w0 + margin )\n        warper->wmax = warper->w0 + margin;\n    }\n\n    if ( warper->wmin < warper->w0 * 3 / 4 )\n      warper->wmin = warper->w0 * 3 / 4;\n\n    if ( warper->wmax > warper->w0 * 5 / 4 )\n      warper->wmax = warper->w0 * 5 / 4;\n#else\n    /* no scaling, just translation */\n    warper->wmin = warper->wmax = warper->w0;\n#endif\n\n    for ( w = warper->wmin; w <= warper->wmax; w++ )\n    {\n      FT_Fixed  new_scale;\n      FT_Pos    new_delta;\n      FT_Pos    xx1, xx2;\n\n\n      /* compute min and max positions for given width,       */\n      /* assuring that they stay within the coordinate ranges */\n      xx1 = warper->x1;\n      xx2 = warper->x2;\n      if ( w >= warper->w0 )\n      {\n        xx1 -= w - warper->w0;\n        if ( xx1 < warper->x1min )\n        {\n          xx2 += warper->x1min - xx1;\n          xx1  = warper->x1min;\n        }\n      }\n      else\n      {\n        xx1 -= w - warper->w0;\n        if ( xx1 > warper->x1max )\n        {\n          xx2 -= xx1 - warper->x1max;\n          xx1  = warper->x1max;\n        }\n      }\n\n      if ( xx1 < warper->x1 )\n        base_distort = warper->x1 - xx1;\n      else\n        base_distort = xx1 - warper->x1;\n\n      if ( xx2 < warper->x2 )\n        base_distort += warper->x2 - xx2;\n      else\n        base_distort += xx2 - warper->x2;\n\n      /* give base distortion a greater weight while scoring */\n      base_distort *= 10;\n\n      new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 );\n      new_delta = xx1 - FT_MulFix( X1, new_scale );\n\n      af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2,\n                                   base_distort,\n                                   segments, num_segments );\n    }\n\n    {\n      FT_Fixed  best_scale = warper->best_scale;\n      FT_Pos    best_delta = warper->best_delta;\n\n\n      hints->xmin_delta = FT_MulFix( X1, best_scale - org_scale )\n                          + best_delta;\n      hints->xmax_delta = FT_MulFix( X2, best_scale - org_scale )\n                          + best_delta;\n\n      *a_scale = best_scale;\n      *a_delta = best_delta;\n    }\n  }\n\n#else /* !AF_CONFIG_OPTION_USE_WARPER */\n\n  /* ANSI C doesn't like empty source files */\n  typedef int  _af_warp_dummy;\n\n#endif /* !AF_CONFIG_OPTION_USE_WARPER */\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/afwarp.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afwarp.h                                                               */\n/*                                                                         */\n/*    Auto-fitter warping algorithm (specification).                       */\n/*                                                                         */\n/*  Copyright 2006, 2007 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFWARP_H__\n#define __AFWARP_H__\n\n#include \"afhints.h\"\n\nFT_BEGIN_HEADER\n\n#define AF_WARPER_SCALE\n\n#define AF_WARPER_FLOOR( x )  ( (x) & ~63 )\n#define AF_WARPER_CEIL( x )   AF_WARPER_FLOOR( (x) + 63 )\n\n\n  typedef FT_Int32  AF_WarpScore;\n\n  typedef struct  AF_WarperRec_\n  {\n    FT_Pos        x1, x2;\n    FT_Pos        t1, t2;\n    FT_Pos        x1min, x1max;\n    FT_Pos        x2min, x2max;\n    FT_Pos        w0, wmin, wmax;\n\n    FT_Fixed      best_scale;\n    FT_Pos        best_delta;\n    AF_WarpScore  best_score;\n    AF_WarpScore  best_distort;\n\n  } AF_WarperRec, *AF_Warper;\n\n\n  FT_LOCAL( void )\n  af_warper_compute( AF_Warper      warper,\n                     AF_GlyphHints  hints,\n                     AF_Dimension   dim,\n                     FT_Fixed      *a_scale,\n                     FT_Fixed      *a_delta );\n\n\nFT_END_HEADER\n\n\n#endif /* __AFWARP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/autofit.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  autofit.c                                                              */\n/*                                                                         */\n/*    Auto-fitter module (body).                                           */\n/*                                                                         */\n/*  Copyright 2003-2007, 2011 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n#include <ft2build.h>\n#include \"afpic.c\"\n#include \"afangles.c\"\n#include \"afglobal.c\"\n#include \"afhints.c\"\n\n#include \"afdummy.c\"\n#include \"aflatin.c\"\n#ifdef FT_OPTION_AUTOFIT2\n#include \"aflatin2.c\"\n#endif\n#include \"afcjk.c\"\n#include \"afindic.c\"\n\n#include \"afloader.c\"\n#include \"afmodule.c\"\n\n#ifdef AF_CONFIG_OPTION_USE_WARPER\n#include \"afwarp.c\"\n#endif\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/autofit/module.mk",
    "content": "#\n# FreeType 2 auto-fitter module definition\n#\n\n\n# Copyright 2003, 2004, 2005, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += AUTOFIT_MODULE\n\ndefine AUTOFIT_MODULE\n$(OPEN_DRIVER) FT_Module_Class, autofit_module_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)autofit   $(ECHO_DRIVER_DESC)automatic hinting module$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/autofit/rules.mk",
    "content": "#\n# FreeType 2 auto-fitter module configuration rules\n#\n\n\n# Copyright 2003, 2004, 2005, 2006, 2007, 2011 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# AUTOF driver directory\n#\nAUTOF_DIR := $(SRC_DIR)/autofit\n\n\n# compilation flags for the driver\n#\nAUTOF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(AUTOF_DIR))\n\n\n# AUTOF driver sources (i.e., C files)\n#\nAUTOF_DRV_SRC := $(AUTOF_DIR)/afangles.c \\\n                 $(AUTOF_DIR)/afcjk.c    \\\n                 $(AUTOF_DIR)/afdummy.c  \\\n                 $(AUTOF_DIR)/afglobal.c \\\n                 $(AUTOF_DIR)/afhints.c  \\\n                 $(AUTOF_DIR)/afindic.c  \\\n                 $(AUTOF_DIR)/aflatin.c  \\\n                 $(AUTOF_DIR)/afloader.c \\\n                 $(AUTOF_DIR)/afmodule.c \\\n                 $(AUTOF_DIR)/afpic.c    \\\n                 $(AUTOF_DIR)/afwarp.c\n\n# AUTOF driver headers\n#\nAUTOF_DRV_H := $(AUTOF_DRV_SRC:%c=%h)  \\\n               $(AUTOF_DIR)/aferrors.h \\\n               $(AUTOF_DIR)/aftypes.h\n\n\n# AUTOF driver object(s)\n#\n#   AUTOF_DRV_OBJ_M is used during `multi' builds.\n#   AUTOF_DRV_OBJ_S is used during `single' builds.\n#\nAUTOF_DRV_OBJ_M := $(AUTOF_DRV_SRC:$(AUTOF_DIR)/%.c=$(OBJ_DIR)/%.$O)\nAUTOF_DRV_OBJ_S := $(OBJ_DIR)/autofit.$O\n\n# AUTOF driver source file for single build\n#\nAUTOF_DRV_SRC_S := $(AUTOF_DIR)/autofit.c\n\n\n# AUTOF driver - single object\n#\n$(AUTOF_DRV_OBJ_S): $(AUTOF_DRV_SRC_S) $(AUTOF_DRV_SRC) \\\n                   $(FREETYPE_H) $(AUTOF_DRV_H)\n\t$(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(AUTOF_DRV_SRC_S))\n\n\n# AUTOF driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(AUTOF_DIR)/%.c $(FREETYPE_H) $(AUTOF_DRV_H)\n\t$(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(AUTOF_DRV_OBJ_S)\nDRV_OBJS_M += $(AUTOF_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/base/Jamfile",
    "content": "# FreeType 2 src/base Jamfile\n#\n# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) base ;\n\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = ftadvanc ftcalc   ftdbgmem ftgloadr\n               ftobjs   ftoutln  ftrfork  ftsnames\n               ftstream fttrigon ftutil\n               basepic  ftpic\n               ;\n  }\n  else\n  {\n    _sources = ftbase ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# Add the optional/replaceable files.\n#\n{\n  local  _sources = bbox   bdf    bitmap debug  gasp\n                    glyph  gxval  init   lcdfil mm\n                    otval  pfr    stroke synth  system\n                    type1  winfnt xf86   patent\n                    ;\n\n  Library  $(FT2_LIB) : ft$(_sources).c ;\n}\n\n# Add Macintosh-specific file to the library when necessary.\n#\nif $(MAC)\n{\n  Library  $(FT2_LIB) : ftmac.c ;\n}\nelse if $(OS) = MACOSX\n{\n  if $(FT2_MULTI)\n  {\n    Library  $(FT2_LIB) : ftmac.c ;\n  }\n}\n\n# end of src/base Jamfile\n"
  },
  {
    "path": "libs/freetype/src/base/basepic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  basepic.c                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for base.            */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"basepic.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from ftglyph.c */\n  void\n  FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class*  clazz );\n\n  void\n  FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class*  clazz );\n\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n  /* forward declaration of PIC init function from ftrfork.c */\n  /* (not modularized)                                       */\n  void\n  FT_Init_Table_raccess_guess_table( ft_raccess_guess_rec*  record );\n#endif\n\n  /* forward declaration of PIC init functions from ftinit.c */\n  FT_Error\n  ft_create_default_module_classes( FT_Library  library );\n\n  void\n  ft_destroy_default_module_classes( FT_Library  library );\n\n\n  void\n  ft_base_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->base )\n    {\n      /* destroy default module classes            */\n      /* (in case FT_Add_Default_Modules was used) */\n      ft_destroy_default_module_classes( library );\n\n      FT_FREE( pic_container->base );\n      pic_container->base = NULL;\n    }\n  }\n\n\n  FT_Error\n  ft_base_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    BasePIC*           container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->base = container;\n\n    /* initialize default modules list and pointers */\n    error = ft_create_default_module_classes( library );\n    if ( error )\n      goto Exit;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    FT_Init_Class_ft_outline_glyph_class(\n      &container->ft_outline_glyph_class );\n    FT_Init_Class_ft_bitmap_glyph_class(\n      &container->ft_bitmap_glyph_class );\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n    FT_Init_Table_raccess_guess_table(\n      (ft_raccess_guess_rec*)&container->ft_raccess_guess_table );\n#endif\n\n  Exit:\n    if ( error )\n      ft_base_pic_free( library );\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/basepic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  basepic.h                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for base.            */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __BASEPIC_H__\n#define __BASEPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include FT_INTERNAL_PIC_H\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_OUTLINE_GLYPH_CLASS_GET  &ft_outline_glyph_class\n#define FT_BITMAP_GLYPH_CLASS_GET   &ft_bitmap_glyph_class\n#define FT_DEFAULT_MODULES_GET      ft_default_modules\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#define FT_RACCESS_GUESS_TABLE_GET  ft_raccess_guess_table\n#endif\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include FT_GLYPH_H\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#include FT_INTERNAL_RFORK_H\n#endif\n\n\n  typedef struct  BasePIC_\n  {\n    FT_Module_Class**  default_module_classes;\n    FT_Glyph_Class     ft_outline_glyph_class;\n    FT_Glyph_Class     ft_bitmap_glyph_class;\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n    ft_raccess_guess_rec  ft_raccess_guess_table[FT_RACCESS_N_RULES];\n#endif\n\n  } BasePIC;\n\n\n#define GET_PIC( lib )  ( (BasePIC*)( (lib)->pic_container.base ) )\n\n#define FT_OUTLINE_GLYPH_CLASS_GET                      \\\n          ( &GET_PIC( library )->ft_outline_glyph_class )\n#define FT_BITMAP_GLYPH_CLASS_GET                        \\\n          ( &GET_PIC( library )->ft_bitmap_glyph_class )\n#define FT_DEFAULT_MODULES_GET                           \\\n          ( GET_PIC( library )->default_module_classes )\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#define FT_RACCESS_GUESS_TABLE_GET                       \\\n          ( GET_PIC( library )->ft_raccess_guess_table )\n#endif\n\n\n  /* see basepic.c for the implementation */\n  void\n  ft_base_pic_free( FT_Library  library );\n\n  FT_Error\n  ft_base_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __BASEPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftadvanc.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftadvanc.c                                                             */\n/*                                                                         */\n/*    Quick computation of advance widths (body).                          */\n/*                                                                         */\n/*  Copyright 2008, 2009, 2011, 2013 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_ADVANCES_H\n#include FT_INTERNAL_OBJECTS_H\n\n\n  static FT_Error\n  _ft_face_scale_advances( FT_Face    face,\n                           FT_Fixed*  advances,\n                           FT_UInt    count,\n                           FT_Int32   flags )\n  {\n    FT_Fixed  scale;\n    FT_UInt   nn;\n\n\n    if ( flags & FT_LOAD_NO_SCALE )\n      return FT_Err_Ok;\n\n    if ( face->size == NULL )\n      return FT_THROW( Invalid_Size_Handle );\n\n    if ( flags & FT_LOAD_VERTICAL_LAYOUT )\n      scale = face->size->metrics.y_scale;\n    else\n      scale = face->size->metrics.x_scale;\n\n    /* this must be the same scaling as to get linear{Hori,Vert}Advance */\n    /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c)        */\n\n    for ( nn = 0; nn < count; nn++ )\n      advances[nn] = FT_MulDiv( advances[nn], scale, 64 );\n\n    return FT_Err_Ok;\n  }\n\n\n   /* at the moment, we can perform fast advance retrieval only in */\n   /* the following cases:                                         */\n   /*                                                              */\n   /*  - unscaled load                                             */\n   /*  - unhinted load                                             */\n   /*  - light-hinted load                                         */\n\n#define LOAD_ADVANCE_FAST_CHECK( flags )                            \\\n          ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING )    || \\\n            FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )\n\n\n  /* documentation is in ftadvanc.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Advance( FT_Face    face,\n                  FT_UInt    gindex,\n                  FT_Int32   flags,\n                  FT_Fixed  *padvance )\n  {\n    FT_Face_GetAdvancesFunc  func;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( gindex >= (FT_UInt)face->num_glyphs )\n      return FT_THROW( Invalid_Glyph_Index );\n\n    func = face->driver->clazz->get_advances;\n    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )\n    {\n      FT_Error  error;\n\n\n      error = func( face, gindex, 1, flags, padvance );\n      if ( !error )\n        return _ft_face_scale_advances( face, padvance, 1, flags );\n\n      if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )\n        return error;\n    }\n\n    return FT_Get_Advances( face, gindex, 1, flags, padvance );\n  }\n\n\n  /* documentation is in ftadvanc.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Advances( FT_Face    face,\n                   FT_UInt    start,\n                   FT_UInt    count,\n                   FT_Int32   flags,\n                   FT_Fixed  *padvances )\n  {\n    FT_Face_GetAdvancesFunc  func;\n    FT_UInt                  num, end, nn;\n    FT_Error                 error = FT_Err_Ok;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    num = (FT_UInt)face->num_glyphs;\n    end = start + count;\n    if ( start >= num || end < start || end > num )\n      return FT_THROW( Invalid_Glyph_Index );\n\n    if ( count == 0 )\n      return FT_Err_Ok;\n\n    func = face->driver->clazz->get_advances;\n    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )\n    {\n      error = func( face, start, count, flags, padvances );\n      if ( !error )\n        return _ft_face_scale_advances( face, padvances, count, flags );\n\n      if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )\n        return error;\n    }\n\n    error = FT_Err_Ok;\n\n    if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )\n      return FT_THROW( Unimplemented_Feature );\n\n    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;\n    for ( nn = 0; nn < count; nn++ )\n    {\n      error = FT_Load_Glyph( face, start + nn, flags );\n      if ( error )\n        break;\n\n      /* scale from 26.6 to 16.16 */\n      padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )\n                      ? face->glyph->advance.y << 10\n                      : face->glyph->advance.x << 10;\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftapi.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftapi.c                                                                */\n/*                                                                         */\n/*    The FreeType compatibility functions (body).                         */\n/*                                                                         */\n/*  Copyright 2002 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_LIST_H\n#include FT_OUTLINE_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TABLES_H\n#include FT_OUTLINE_H\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                 C O M P A T I B I L I T Y                       ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* backwards compatibility API */\n\n  FT_BASE_DEF( void )\n  FT_New_Memory_Stream( FT_Library  library,\n                        FT_Byte*    base,\n                        FT_ULong    size,\n                        FT_Stream   stream )\n  {\n    FT_UNUSED( library );\n\n    FT_Stream_OpenMemory( stream, base, size );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Seek_Stream( FT_Stream  stream,\n                  FT_ULong   pos )\n  {\n    return FT_Stream_Seek( stream, pos );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Skip_Stream( FT_Stream  stream,\n                  FT_Long    distance )\n  {\n    return FT_Stream_Skip( stream, distance );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Read_Stream( FT_Stream  stream,\n                  FT_Byte*   buffer,\n                  FT_ULong   count )\n  {\n    return FT_Stream_Read( stream, buffer, count );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Read_Stream_At( FT_Stream  stream,\n                     FT_ULong   pos,\n                     FT_Byte*   buffer,\n                     FT_ULong   count )\n  {\n    return FT_Stream_ReadAt( stream, pos, buffer, count );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Extract_Frame( FT_Stream  stream,\n                    FT_ULong   count,\n                    FT_Byte**  pbytes )\n  {\n    return FT_Stream_ExtractFrame( stream, count, pbytes );\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Release_Frame( FT_Stream  stream,\n                    FT_Byte**  pbytes )\n  {\n    FT_Stream_ReleaseFrame( stream, pbytes );\n  }\n\n  FT_BASE_DEF( FT_Error )\n  FT_Access_Frame( FT_Stream  stream,\n                   FT_ULong   count )\n  {\n    return FT_Stream_EnterFrame( stream, count );\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Forget_Frame( FT_Stream  stream )\n  {\n    FT_Stream_ExitFrame( stream );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftbase.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbase.c                                                               */\n/*                                                                         */\n/*    Single object library component (body only).                         */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n\n#define  FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include \"ftpic.c\"\n#include \"basepic.c\"\n#include \"ftadvanc.c\"\n#include \"ftcalc.c\"\n#include \"ftdbgmem.c\"\n#include \"ftgloadr.c\"\n#include \"ftobjs.c\"\n#include \"ftoutln.c\"\n#include \"ftrfork.c\"\n#include \"ftsnames.c\"\n#include \"ftstream.c\"\n#include \"fttrigon.c\"\n#include \"ftutil.c\"\n\n#ifdef FT_MACINTOSH\n#include \"ftmac.c\"\n#endif\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftbase.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbase.h                                                               */\n/*                                                                         */\n/*    The FreeType private functions used in base module (specification).  */\n/*                                                                         */\n/*  Copyright 2008, 2010 by                                                */\n/*  David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTBASE_H__\n#define __FTBASE_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n\n\nFT_BEGIN_HEADER\n\n\n  /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */\n  /* font, and try to load a face specified by the face_index.            */\n  FT_LOCAL( FT_Error )\n  open_face_PS_from_sfnt_stream( FT_Library     library,\n                                 FT_Stream      stream,\n                                 FT_Long        face_index,\n                                 FT_Int         num_params,\n                                 FT_Parameter  *params,\n                                 FT_Face       *aface );\n\n\n  /* Create a new FT_Face given a buffer and a driver name. */\n  /* From ftmac.c.                                          */\n  FT_LOCAL( FT_Error )\n  open_face_from_buffer( FT_Library   library,\n                         FT_Byte*     base,\n                         FT_ULong     size,\n                         FT_Long      face_index,\n                         const char*  driver_name,\n                         FT_Face     *aface );\n\n\n#if  defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \\\n    !defined( FT_MACINTOSH )\n  /* Mac OS X/Darwin kernel often changes recommended method to access */\n  /* the resource fork and older methods makes the kernel issue the    */\n  /* warning of deprecated method.  To calm it down, the methods based */\n  /* on Darwin VFS should be grouped and skip the rest methods after   */\n  /* the case the resource is opened but found to lack a font in it.   */\n  FT_LOCAL( FT_Bool )\n  ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt  rule_index );\n#endif\n\n\nFT_END_HEADER\n\n#endif /* __FTBASE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftbbox.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbbox.c                                                               */\n/*                                                                         */\n/*    FreeType bbox computation (body).                                    */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004, 2006, 2010, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This component has a _single_ role: to compute exact outline bounding */\n  /* boxes.                                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_BBOX_H\n#include FT_IMAGE_H\n#include FT_OUTLINE_H\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_OBJECTS_H\n\n\n  typedef struct  TBBox_Rec_\n  {\n    FT_Vector  last;\n    FT_BBox    bbox;\n\n  } TBBox_Rec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Move_To                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used as a `move_to' and `line_to' emitter during  */\n  /*    FT_Outline_Decompose().  It simply records the destination point   */\n  /*    in `user->last'; no further computations are necessary since we    */\n  /*    use the cbox as the starting bbox which must be refined.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    to   :: A pointer to the destination vector.                       */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user :: A pointer to the current walk context.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Always 0.  Needed for the interface only.                          */\n  /*                                                                       */\n  static int\n  BBox_Move_To( FT_Vector*  to,\n                TBBox_Rec*  user )\n  {\n    user->last = *to;\n\n    return 0;\n  }\n\n\n#define CHECK_X( p, bbox )  \\\n          ( p->x < bbox.xMin || p->x > bbox.xMax )\n\n#define CHECK_Y( p, bbox )  \\\n          ( p->y < bbox.yMin || p->y > bbox.yMax )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Conic_Check                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finds the extrema of a 1-dimensional conic Bezier curve and update */\n  /*    a bounding range.  This version uses direct computation, as it     */\n  /*    doesn't need square roots.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    y1  :: The start coordinate.                                       */\n  /*                                                                       */\n  /*    y2  :: The coordinate of the control point.                        */\n  /*                                                                       */\n  /*    y3  :: The end coordinate.                                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    min :: The address of the current minimum.                         */\n  /*                                                                       */\n  /*    max :: The address of the current maximum.                         */\n  /*                                                                       */\n  static void\n  BBox_Conic_Check( FT_Pos   y1,\n                    FT_Pos   y2,\n                    FT_Pos   y3,\n                    FT_Pos*  min,\n                    FT_Pos*  max )\n  {\n    if ( y1 <= y3 && y2 == y1 )     /* flat arc */\n      goto Suite;\n\n    if ( y1 < y3 )\n    {\n      if ( y2 >= y1 && y2 <= y3 )   /* ascending arc */\n        goto Suite;\n    }\n    else\n    {\n      if ( y2 >= y3 && y2 <= y1 )   /* descending arc */\n      {\n        y2 = y1;\n        y1 = y3;\n        y3 = y2;\n        goto Suite;\n      }\n    }\n\n    y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 );\n\n  Suite:\n    if ( y1 < *min ) *min = y1;\n    if ( y3 > *max ) *max = y3;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Conic_To                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used as a `conic_to' emitter during               */\n  /*    FT_Outline_Decompose().  It checks a conic Bezier curve with the   */\n  /*    current bounding box, and computes its extrema if necessary to     */\n  /*    update it.                                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control :: A pointer to a control point.                           */\n  /*                                                                       */\n  /*    to      :: A pointer to the destination vector.                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user    :: The address of the current walk context.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Always 0.  Needed for the interface only.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In the case of a non-monotonous arc, we compute directly the       */\n  /*    extremum coordinates, as it is sufficiently fast.                  */\n  /*                                                                       */\n  static int\n  BBox_Conic_To( FT_Vector*  control,\n                 FT_Vector*  to,\n                 TBBox_Rec*  user )\n  {\n    /* we don't need to check `to' since it is always an `on' point, thus */\n    /* within the bbox                                                    */\n\n    if ( CHECK_X( control, user->bbox ) )\n      BBox_Conic_Check( user->last.x,\n                        control->x,\n                        to->x,\n                        &user->bbox.xMin,\n                        &user->bbox.xMax );\n\n    if ( CHECK_Y( control, user->bbox ) )\n      BBox_Conic_Check( user->last.y,\n                        control->y,\n                        to->y,\n                        &user->bbox.yMin,\n                        &user->bbox.yMax );\n\n    user->last = *to;\n\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Cubic_Check                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finds the extrema of a 1-dimensional cubic Bezier curve and        */\n  /*    updates a bounding range.  This version uses splitting because we  */\n  /*    don't want to use square roots and extra accuracy.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    p1  :: The start coordinate.                                       */\n  /*                                                                       */\n  /*    p2  :: The coordinate of the first control point.                  */\n  /*                                                                       */\n  /*    p3  :: The coordinate of the second control point.                 */\n  /*                                                                       */\n  /*    p4  :: The end coordinate.                                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    min :: The address of the current minimum.                         */\n  /*                                                                       */\n  /*    max :: The address of the current maximum.                         */\n  /*                                                                       */\n\n#if 0\n\n  static void\n  BBox_Cubic_Check( FT_Pos   p1,\n                    FT_Pos   p2,\n                    FT_Pos   p3,\n                    FT_Pos   p4,\n                    FT_Pos*  min,\n                    FT_Pos*  max )\n  {\n    FT_Pos  q1, q2, q3, q4;\n\n\n    q1 = p1;\n    q2 = p2;\n    q3 = p3;\n    q4 = p4;\n\n    /* for a conic segment to possibly reach new maximum     */\n    /* one of its off-points must be above the current value */\n    while ( q2 > *max || q3 > *max )\n    {\n      /* determine which half contains the maximum and split */\n      if ( q1 + q2 > q3 + q4 ) /* first half */\n      {\n        q4 = q4 + q3;\n        q3 = q3 + q2;\n        q2 = q2 + q1;\n        q4 = q4 + q3;\n        q3 = q3 + q2;\n        q4 = ( q4 + q3 ) / 8;\n        q3 = q3 / 4;\n        q2 = q2 / 2;\n      }\n      else                     /* second half */\n      {\n        q1 = q1 + q2;\n        q2 = q2 + q3;\n        q3 = q3 + q4;\n        q1 = q1 + q2;\n        q2 = q2 + q3;\n        q1 = ( q1 + q2 ) / 8;\n        q2 = q2 / 4;\n        q3 = q3 / 2;\n      }\n\n      /* check if either end reached the maximum */\n      if ( q1 == q2 && q1 >= q3 )\n      {\n        *max = q1;\n        break;\n      }\n      if ( q3 == q4 && q2 <= q4 )\n      {\n        *max = q4;\n        break;\n      }\n    }\n\n    q1 = p1;\n    q2 = p2;\n    q3 = p3;\n    q4 = p4;\n\n    /* for a conic segment to possibly reach new minimum     */\n    /* one of its off-points must be below the current value */\n    while ( q2 < *min || q3 < *min )\n    {\n      /* determine which half contains the minimum and split */\n      if ( q1 + q2 < q3 + q4 ) /* first half */\n      {\n        q4 = q4 + q3;\n        q3 = q3 + q2;\n        q2 = q2 + q1;\n        q4 = q4 + q3;\n        q3 = q3 + q2;\n        q4 = ( q4 + q3 ) / 8;\n        q3 = q3 / 4;\n        q2 = q2 / 2;\n      }\n      else                     /* second half */\n      {\n        q1 = q1 + q2;\n        q2 = q2 + q3;\n        q3 = q3 + q4;\n        q1 = q1 + q2;\n        q2 = q2 + q3;\n        q1 = ( q1 + q2 ) / 8;\n        q2 = q2 / 4;\n        q3 = q3 / 2;\n      }\n\n      /* check if either end reached the minimum */\n      if ( q1 == q2 && q1 <= q3 )\n      {\n        *min = q1;\n        break;\n      }\n      if ( q3 == q4 && q2 >= q4 )\n      {\n        *min = q4;\n        break;\n      }\n    }\n  }\n\n#else\n\n  static void\n  test_cubic_extrema( FT_Pos    y1,\n                      FT_Pos    y2,\n                      FT_Pos    y3,\n                      FT_Pos    y4,\n                      FT_Fixed  u,\n                      FT_Pos*   min,\n                      FT_Pos*   max )\n  {\n /* FT_Pos    a = y4 - 3*y3 + 3*y2 - y1; */\n    FT_Pos    b = y3 - 2*y2 + y1;\n    FT_Pos    c = y2 - y1;\n    FT_Pos    d = y1;\n    FT_Pos    y;\n    FT_Fixed  uu;\n\n    FT_UNUSED ( y4 );\n\n\n    /* The polynomial is                      */\n    /*                                        */\n    /*    P(x) = a*x^3 + 3b*x^2 + 3c*x + d  , */\n    /*                                        */\n    /*   dP/dx = 3a*x^2 + 6b*x + 3c         . */\n    /*                                        */\n    /* However, we also have                  */\n    /*                                        */\n    /*   dP/dx(u) = 0                       , */\n    /*                                        */\n    /* which implies by subtraction that      */\n    /*                                        */\n    /*   P(u) = b*u^2 + 2c*u + d            . */\n\n    if ( u > 0 && u < 0x10000L )\n    {\n      uu = FT_MulFix( u, u );\n      y  = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu );\n\n      if ( y < *min ) *min = y;\n      if ( y > *max ) *max = y;\n    }\n  }\n\n\n  static void\n  BBox_Cubic_Check( FT_Pos   y1,\n                    FT_Pos   y2,\n                    FT_Pos   y3,\n                    FT_Pos   y4,\n                    FT_Pos*  min,\n                    FT_Pos*  max )\n  {\n    /* always compare first and last points */\n    if      ( y1 < *min )  *min = y1;\n    else if ( y1 > *max )  *max = y1;\n\n    if      ( y4 < *min )  *min = y4;\n    else if ( y4 > *max )  *max = y4;\n\n    /* now, try to see if there are split points here */\n    if ( y1 <= y4 )\n    {\n      /* flat or ascending arc test */\n      if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 )\n        return;\n    }\n    else /* y1 > y4 */\n    {\n      /* descending arc test */\n      if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 )\n        return;\n    }\n\n    /* There are some split points.  Find them.                        */\n    /* We already made sure that a, b, and c below cannot be all zero. */\n    {\n      FT_Pos    a = y4 - 3*y3 + 3*y2 - y1;\n      FT_Pos    b = y3 - 2*y2 + y1;\n      FT_Pos    c = y2 - y1;\n      FT_Pos    d;\n      FT_Fixed  t;\n      FT_Int    shift;\n\n\n      /* We need to solve `ax^2+2bx+c' here, without floating points!      */\n      /* The trick is to normalize to a different representation in order  */\n      /* to use our 16.16 fixed-point routines.                            */\n      /*                                                                   */\n      /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */\n      /* These values must fit into a single 16.16 value.                  */\n      /*                                                                   */\n      /* We normalize a, b, and c to `8.16' fixed-point values to ensure   */\n      /* that their product is held in a `16.16' value including the sign. */\n      /* Necessarily, we need to shift `a', `b', and `c' so that the most  */\n      /* significant bit of their absolute values is at position 22.       */\n      /*                                                                   */\n      /* This also means that we are using 23 bits of precision to compute */\n      /* the zeros, independently of the range of the original polynomial  */\n      /* coefficients.                                                     */\n      /*                                                                   */\n      /* This algorithm should ensure reasonably accurate values for the   */\n      /* zeros.  Note that they are only expressed with 16 bits when       */\n      /* computing the extrema (the zeros need to be in 0..1 exclusive     */\n      /* to be considered part of the arc).                                */\n\n      shift = FT_MSB( FT_ABS( a ) | FT_ABS( b ) | FT_ABS( c ) );\n\n      if ( shift > 22 )\n      {\n        shift -= 22;\n\n        /* this loses some bits of precision, but we use 23 of them */\n        /* for the computation anyway                               */\n        a >>= shift;\n        b >>= shift;\n        c >>= shift;\n      }\n      else\n      {\n        shift = 22 - shift;\n\n        a <<= shift;\n        b <<= shift;\n        c <<= shift;\n      }\n\n      /* handle a == 0 */\n      if ( a == 0 )\n      {\n        if ( b != 0 )\n        {\n          t = - FT_DivFix( c, b ) / 2;\n          test_cubic_extrema( y1, y2, y3, y4, t, min, max );\n        }\n      }\n      else\n      {\n        /* solve the equation now */\n        d = FT_MulFix( b, b ) - FT_MulFix( a, c );\n        if ( d < 0 )\n          return;\n\n        if ( d == 0 )\n        {\n          /* there is a single split point at -b/a */\n          t = - FT_DivFix( b, a );\n          test_cubic_extrema( y1, y2, y3, y4, t, min, max );\n        }\n        else\n        {\n          /* there are two solutions; we need to filter them */\n          d = FT_SqrtFixed( (FT_Int32)d );\n          t = - FT_DivFix( b - d, a );\n          test_cubic_extrema( y1, y2, y3, y4, t, min, max );\n\n          t = - FT_DivFix( b + d, a );\n          test_cubic_extrema( y1, y2, y3, y4, t, min, max );\n        }\n      }\n    }\n  }\n\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    BBox_Cubic_To                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used as a `cubic_to' emitter during               */\n  /*    FT_Outline_Decompose().  It checks a cubic Bezier curve with the   */\n  /*    current bounding box, and computes its extrema if necessary to     */\n  /*    update it.                                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    control1 :: A pointer to the first control point.                  */\n  /*                                                                       */\n  /*    control2 :: A pointer to the second control point.                 */\n  /*                                                                       */\n  /*    to       :: A pointer to the destination vector.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user     :: The address of the current walk context.               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Always 0.  Needed for the interface only.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In the case of a non-monotonous arc, we don't compute directly     */\n  /*    extremum coordinates, we subdivide instead.                        */\n  /*                                                                       */\n  static int\n  BBox_Cubic_To( FT_Vector*  control1,\n                 FT_Vector*  control2,\n                 FT_Vector*  to,\n                 TBBox_Rec*  user )\n  {\n    /* we don't need to check `to' since it is always an `on' point, thus */\n    /* within the bbox                                                    */\n\n    if ( CHECK_X( control1, user->bbox ) ||\n         CHECK_X( control2, user->bbox ) )\n      BBox_Cubic_Check( user->last.x,\n                        control1->x,\n                        control2->x,\n                        to->x,\n                        &user->bbox.xMin,\n                        &user->bbox.xMax );\n\n    if ( CHECK_Y( control1, user->bbox ) ||\n         CHECK_Y( control2, user->bbox ) )\n      BBox_Cubic_Check( user->last.y,\n                        control1->y,\n                        control2->y,\n                        to->y,\n                        &user->bbox.yMin,\n                        &user->bbox.yMax );\n\n    user->last = *to;\n\n    return 0;\n  }\n\nFT_DEFINE_OUTLINE_FUNCS(bbox_interface,\n    (FT_Outline_MoveTo_Func) BBox_Move_To,\n    (FT_Outline_LineTo_Func) BBox_Move_To,\n    (FT_Outline_ConicTo_Func)BBox_Conic_To,\n    (FT_Outline_CubicTo_Func)BBox_Cubic_To,\n    0, 0\n  )\n\n  /* documentation is in ftbbox.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Get_BBox( FT_Outline*  outline,\n                       FT_BBox     *abbox )\n  {\n    FT_BBox     cbox;\n    FT_BBox     bbox;\n    FT_Vector*  vec;\n    FT_UShort   n;\n\n\n    if ( !abbox )\n      return FT_THROW( Invalid_Argument );\n\n    if ( !outline )\n      return FT_THROW( Invalid_Outline );\n\n    /* if outline is empty, return (0,0,0,0) */\n    if ( outline->n_points == 0 || outline->n_contours <= 0 )\n    {\n      abbox->xMin = abbox->xMax = 0;\n      abbox->yMin = abbox->yMax = 0;\n      return 0;\n    }\n\n    /* We compute the control box as well as the bounding box of  */\n    /* all `on' points in the outline.  Then, if the two boxes    */\n    /* coincide, we exit immediately.                             */\n\n    vec = outline->points;\n    bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x;\n    bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y;\n    vec++;\n\n    for ( n = 1; n < outline->n_points; n++ )\n    {\n      FT_Pos  x = vec->x;\n      FT_Pos  y = vec->y;\n\n\n      /* update control box */\n      if ( x < cbox.xMin ) cbox.xMin = x;\n      if ( x > cbox.xMax ) cbox.xMax = x;\n\n      if ( y < cbox.yMin ) cbox.yMin = y;\n      if ( y > cbox.yMax ) cbox.yMax = y;\n\n      if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON )\n      {\n        /* update bbox for `on' points only */\n        if ( x < bbox.xMin ) bbox.xMin = x;\n        if ( x > bbox.xMax ) bbox.xMax = x;\n\n        if ( y < bbox.yMin ) bbox.yMin = y;\n        if ( y > bbox.yMax ) bbox.yMax = y;\n      }\n\n      vec++;\n    }\n\n    /* test two boxes for equality */\n    if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax ||\n         cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax )\n    {\n      /* the two boxes are different, now walk over the outline to */\n      /* get the Bezier arc extrema.                               */\n\n      FT_Error   error;\n      TBBox_Rec  user;\n\n#ifdef FT_CONFIG_OPTION_PIC\n      FT_Outline_Funcs bbox_interface;\n      Init_Class_bbox_interface(&bbox_interface);\n#endif\n\n      user.bbox = bbox;\n\n      error = FT_Outline_Decompose( outline, &bbox_interface, &user );\n      if ( error )\n        return error;\n\n      *abbox = user.bbox;\n    }\n    else\n      *abbox = bbox;\n\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftbdf.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbdf.c                                                                */\n/*                                                                         */\n/*    FreeType API for accessing BDF-specific strings (body).              */\n/*                                                                         */\n/*  Copyright 2002-2004, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_BDF_H\n\n\n  /* documentation is in ftbdf.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_BDF_Charset_ID( FT_Face       face,\n                         const char*  *acharset_encoding,\n                         const char*  *acharset_registry )\n  {\n    FT_Error     error;\n    const char*  encoding = NULL;\n    const char*  registry = NULL;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( face )\n    {\n      FT_Service_BDF  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, BDF );\n\n      if ( service && service->get_charset_id )\n        error = service->get_charset_id( face, &encoding, &registry );\n    }\n\n    if ( acharset_encoding )\n      *acharset_encoding = encoding;\n\n    if ( acharset_registry )\n      *acharset_registry = registry;\n\n    return error;\n  }\n\n\n  /* documentation is in ftbdf.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_BDF_Property( FT_Face           face,\n                       const char*       prop_name,\n                       BDF_PropertyRec  *aproperty )\n  {\n    FT_Error  error;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    aproperty->type = BDF_PROPERTY_TYPE_NONE;\n\n    if ( face )\n    {\n      FT_Service_BDF  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, BDF );\n\n      if ( service && service->get_property )\n        error = service->get_property( face, prop_name, aproperty );\n    }\n\n    return  error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftbitmap.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbitmap.c                                                             */\n/*                                                                         */\n/*    FreeType utility functions for bitmaps (body).                       */\n/*                                                                         */\n/*  Copyright 2004-2009, 2011, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_BITMAP_H\n#include FT_IMAGE_H\n#include FT_INTERNAL_OBJECTS_H\n\n\n  static\n  const FT_Bitmap  null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 };\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Bitmap_New( FT_Bitmap  *abitmap )\n  {\n    *abitmap = null_bitmap;\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Bitmap_Copy( FT_Library        library,\n                  const FT_Bitmap  *source,\n                  FT_Bitmap        *target)\n  {\n    FT_Memory  memory = library->memory;\n    FT_Error   error  = FT_Err_Ok;\n    FT_Int     pitch  = source->pitch;\n    FT_ULong   size;\n\n\n    if ( source == target )\n      return FT_Err_Ok;\n\n    if ( source->buffer == NULL )\n    {\n      *target = *source;\n\n      return FT_Err_Ok;\n    }\n\n    if ( pitch < 0 )\n      pitch = -pitch;\n    size = (FT_ULong)( pitch * source->rows );\n\n    if ( target->buffer )\n    {\n      FT_Int    target_pitch = target->pitch;\n      FT_ULong  target_size;\n\n\n      if ( target_pitch < 0  )\n        target_pitch = -target_pitch;\n      target_size = (FT_ULong)( target_pitch * target->rows );\n\n      if ( target_size != size )\n        (void)FT_QREALLOC( target->buffer, target_size, size );\n    }\n    else\n      (void)FT_QALLOC( target->buffer, size );\n\n    if ( !error )\n    {\n      unsigned char *p;\n\n\n      p = target->buffer;\n      *target = *source;\n      target->buffer = p;\n\n      FT_MEM_COPY( target->buffer, source->buffer, size );\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  ft_bitmap_assure_buffer( FT_Memory   memory,\n                           FT_Bitmap*  bitmap,\n                           FT_UInt     xpixels,\n                           FT_UInt     ypixels )\n  {\n    FT_Error        error;\n    int             pitch;\n    int             new_pitch;\n    FT_UInt         bpp;\n    FT_Int          i, width, height;\n    unsigned char*  buffer = NULL;\n\n\n    width  = bitmap->width;\n    height = bitmap->rows;\n    pitch  = bitmap->pitch;\n    if ( pitch < 0 )\n      pitch = -pitch;\n\n    switch ( bitmap->pixel_mode )\n    {\n    case FT_PIXEL_MODE_MONO:\n      bpp       = 1;\n      new_pitch = ( width + xpixels + 7 ) >> 3;\n      break;\n    case FT_PIXEL_MODE_GRAY2:\n      bpp       = 2;\n      new_pitch = ( width + xpixels + 3 ) >> 2;\n      break;\n    case FT_PIXEL_MODE_GRAY4:\n      bpp       = 4;\n      new_pitch = ( width + xpixels + 1 ) >> 1;\n      break;\n    case FT_PIXEL_MODE_GRAY:\n    case FT_PIXEL_MODE_LCD:\n    case FT_PIXEL_MODE_LCD_V:\n      bpp       = 8;\n      new_pitch = ( width + xpixels );\n      break;\n    default:\n      return FT_THROW( Invalid_Glyph_Format );\n    }\n\n    /* if no need to allocate memory */\n    if ( ypixels == 0 && new_pitch <= pitch )\n    {\n      /* zero the padding */\n      FT_Int  bit_width = pitch * 8;\n      FT_Int  bit_last  = ( width + xpixels ) * bpp;\n\n\n      if ( bit_last < bit_width )\n      {\n        FT_Byte*  line  = bitmap->buffer + ( bit_last >> 3 );\n        FT_Byte*  end   = bitmap->buffer + pitch;\n        FT_Int    shift = bit_last & 7;\n        FT_UInt   mask  = 0xFF00U >> shift;\n        FT_Int    count = height;\n\n\n        for ( ; count > 0; count--, line += pitch, end += pitch )\n        {\n          FT_Byte*  write = line;\n\n\n          if ( shift > 0 )\n          {\n            write[0] = (FT_Byte)( write[0] & mask );\n            write++;\n          }\n          if ( write < end )\n            FT_MEM_ZERO( write, end-write );\n        }\n      }\n\n      return FT_Err_Ok;\n    }\n\n    if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) )\n      return error;\n\n    if ( bitmap->pitch > 0 )\n    {\n      FT_Int  len = ( width * bpp + 7 ) >> 3;\n\n\n      for ( i = 0; i < bitmap->rows; i++ )\n        FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ),\n                     bitmap->buffer + pitch * i, len );\n    }\n    else\n    {\n      FT_Int  len = ( width * bpp + 7 ) >> 3;\n\n\n      for ( i = 0; i < bitmap->rows; i++ )\n        FT_MEM_COPY( buffer + new_pitch * i,\n                     bitmap->buffer + pitch * i, len );\n    }\n\n    FT_FREE( bitmap->buffer );\n    bitmap->buffer = buffer;\n\n    if ( bitmap->pitch < 0 )\n      new_pitch = -new_pitch;\n\n    /* set pitch only, width and height are left untouched */\n    bitmap->pitch = new_pitch;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Bitmap_Embolden( FT_Library  library,\n                      FT_Bitmap*  bitmap,\n                      FT_Pos      xStrength,\n                      FT_Pos      yStrength )\n  {\n    FT_Error        error;\n    unsigned char*  p;\n    FT_Int          i, x, y, pitch;\n    FT_Int          xstr, ystr;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !bitmap || !bitmap->buffer )\n      return FT_THROW( Invalid_Argument );\n\n    if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) ||\n         ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) )\n      return FT_THROW( Invalid_Argument );\n\n    xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6;\n    ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6;\n\n    if ( xstr == 0 && ystr == 0 )\n      return FT_Err_Ok;\n    else if ( xstr < 0 || ystr < 0 )\n      return FT_THROW( Invalid_Argument );\n\n    switch ( bitmap->pixel_mode )\n    {\n    case FT_PIXEL_MODE_GRAY2:\n    case FT_PIXEL_MODE_GRAY4:\n      {\n        FT_Bitmap  tmp;\n        FT_Int     align;\n\n\n        if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 )\n          align = ( bitmap->width + xstr + 3 ) / 4;\n        else\n          align = ( bitmap->width + xstr + 1 ) / 2;\n\n        FT_Bitmap_New( &tmp );\n\n        error = FT_Bitmap_Convert( library, bitmap, &tmp, align );\n        if ( error )\n          return error;\n\n        FT_Bitmap_Done( library, bitmap );\n        *bitmap = tmp;\n      }\n      break;\n\n    case FT_PIXEL_MODE_MONO:\n      if ( xstr > 8 )\n        xstr = 8;\n      break;\n\n    case FT_PIXEL_MODE_LCD:\n      xstr *= 3;\n      break;\n\n    case FT_PIXEL_MODE_LCD_V:\n      ystr *= 3;\n      break;\n    }\n\n    error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr );\n    if ( error )\n      return error;\n\n    pitch = bitmap->pitch;\n    if ( pitch > 0 )\n      p = bitmap->buffer + pitch * ystr;\n    else\n    {\n      pitch = -pitch;\n      p = bitmap->buffer + pitch * ( bitmap->rows - 1 );\n    }\n\n    /* for each row */\n    for ( y = 0; y < bitmap->rows ; y++ )\n    {\n      /*\n       * Horizontally:\n       *\n       * From the last pixel on, make each pixel or'ed with the\n       * `xstr' pixels before it.\n       */\n      for ( x = pitch - 1; x >= 0; x-- )\n      {\n        unsigned char tmp;\n\n\n        tmp = p[x];\n        for ( i = 1; i <= xstr; i++ )\n        {\n          if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO )\n          {\n            p[x] |= tmp >> i;\n\n            /* the maximum value of 8 for `xstr' comes from here */\n            if ( x > 0 )\n              p[x] |= p[x - 1] << ( 8 - i );\n\n#if 0\n            if ( p[x] == 0xff )\n              break;\n#endif\n          }\n          else\n          {\n            if ( x - i >= 0 )\n            {\n              if ( p[x] + p[x - i] > bitmap->num_grays - 1 )\n              {\n                p[x] = (unsigned char)(bitmap->num_grays - 1);\n                break;\n              }\n              else\n              {\n                p[x] = (unsigned char)(p[x] + p[x-i]);\n                if ( p[x] == bitmap->num_grays - 1 )\n                  break;\n              }\n            }\n            else\n              break;\n          }\n        }\n      }\n\n      /*\n       * Vertically:\n       *\n       * Make the above `ystr' rows or'ed with it.\n       */\n      for ( x = 1; x <= ystr; x++ )\n      {\n        unsigned char*  q;\n\n\n        q = p - bitmap->pitch * x;\n        for ( i = 0; i < pitch; i++ )\n          q[i] |= p[i];\n      }\n\n      p += bitmap->pitch;\n    }\n\n    bitmap->width += xstr;\n    bitmap->rows += ystr;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Bitmap_Convert( FT_Library        library,\n                     const FT_Bitmap  *source,\n                     FT_Bitmap        *target,\n                     FT_Int            alignment )\n  {\n    FT_Error   error = FT_Err_Ok;\n    FT_Memory  memory;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    memory = library->memory;\n\n    switch ( source->pixel_mode )\n    {\n    case FT_PIXEL_MODE_MONO:\n    case FT_PIXEL_MODE_GRAY:\n    case FT_PIXEL_MODE_GRAY2:\n    case FT_PIXEL_MODE_GRAY4:\n    case FT_PIXEL_MODE_LCD:\n    case FT_PIXEL_MODE_LCD_V:\n      {\n        FT_Int   pad;\n        FT_Long  old_size;\n\n\n        old_size = target->rows * target->pitch;\n        if ( old_size < 0 )\n          old_size = -old_size;\n\n        target->pixel_mode = FT_PIXEL_MODE_GRAY;\n        target->rows       = source->rows;\n        target->width      = source->width;\n\n        pad = 0;\n        if ( alignment > 0 )\n        {\n          pad = source->width % alignment;\n          if ( pad != 0 )\n            pad = alignment - pad;\n        }\n\n        target->pitch = source->width + pad;\n\n        if ( target->pitch > 0                                     &&\n             (FT_ULong)target->rows > FT_ULONG_MAX / target->pitch )\n          return FT_THROW( Invalid_Argument );\n\n        if ( target->rows * target->pitch > old_size             &&\n             FT_QREALLOC( target->buffer,\n                          old_size, target->rows * target->pitch ) )\n          return error;\n      }\n      break;\n\n    default:\n      error = FT_THROW( Invalid_Argument );\n    }\n\n    switch ( source->pixel_mode )\n    {\n    case FT_PIXEL_MODE_MONO:\n      {\n        FT_Byte*  s = source->buffer;\n        FT_Byte*  t = target->buffer;\n        FT_Int    i;\n\n\n        target->num_grays = 2;\n\n        for ( i = source->rows; i > 0; i-- )\n        {\n          FT_Byte*  ss = s;\n          FT_Byte*  tt = t;\n          FT_Int    j;\n\n\n          /* get the full bytes */\n          for ( j = source->width >> 3; j > 0; j-- )\n          {\n            FT_Int  val = ss[0]; /* avoid a byte->int cast on each line */\n\n\n            tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 );\n            tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 );\n            tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 );\n            tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 );\n            tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 );\n            tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 );\n            tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 );\n            tt[7] = (FT_Byte)(   val & 0x01 );\n\n            tt += 8;\n            ss += 1;\n          }\n\n          /* get remaining pixels (if any) */\n          j = source->width & 7;\n          if ( j > 0 )\n          {\n            FT_Int  val = *ss;\n\n\n            for ( ; j > 0; j-- )\n            {\n              tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7);\n              val <<= 1;\n              tt   += 1;\n            }\n          }\n\n          s += source->pitch;\n          t += target->pitch;\n        }\n      }\n      break;\n\n\n    case FT_PIXEL_MODE_GRAY:\n    case FT_PIXEL_MODE_LCD:\n    case FT_PIXEL_MODE_LCD_V:\n      {\n        FT_Int    width   = source->width;\n        FT_Byte*  s       = source->buffer;\n        FT_Byte*  t       = target->buffer;\n        FT_Int    s_pitch = source->pitch;\n        FT_Int    t_pitch = target->pitch;\n        FT_Int    i;\n\n\n        target->num_grays = 256;\n\n        for ( i = source->rows; i > 0; i-- )\n        {\n          FT_ARRAY_COPY( t, s, width );\n\n          s += s_pitch;\n          t += t_pitch;\n        }\n      }\n      break;\n\n\n    case FT_PIXEL_MODE_GRAY2:\n      {\n        FT_Byte*  s = source->buffer;\n        FT_Byte*  t = target->buffer;\n        FT_Int    i;\n\n\n        target->num_grays = 4;\n\n        for ( i = source->rows; i > 0; i-- )\n        {\n          FT_Byte*  ss = s;\n          FT_Byte*  tt = t;\n          FT_Int    j;\n\n\n          /* get the full bytes */\n          for ( j = source->width >> 2; j > 0; j-- )\n          {\n            FT_Int  val = ss[0];\n\n\n            tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );\n            tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 );\n            tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 );\n            tt[3] = (FT_Byte)( ( val & 0x03 ) );\n\n            ss += 1;\n            tt += 4;\n          }\n\n          j = source->width & 3;\n          if ( j > 0 )\n          {\n            FT_Int  val = ss[0];\n\n\n            for ( ; j > 0; j-- )\n            {\n              tt[0]  = (FT_Byte)( ( val & 0xC0 ) >> 6 );\n              val  <<= 2;\n              tt    += 1;\n            }\n          }\n\n          s += source->pitch;\n          t += target->pitch;\n        }\n      }\n      break;\n\n\n    case FT_PIXEL_MODE_GRAY4:\n      {\n        FT_Byte*  s = source->buffer;\n        FT_Byte*  t = target->buffer;\n        FT_Int    i;\n\n\n        target->num_grays = 16;\n\n        for ( i = source->rows; i > 0; i-- )\n        {\n          FT_Byte*  ss = s;\n          FT_Byte*  tt = t;\n          FT_Int    j;\n\n\n          /* get the full bytes */\n          for ( j = source->width >> 1; j > 0; j-- )\n          {\n            FT_Int  val = ss[0];\n\n\n            tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 );\n            tt[1] = (FT_Byte)( ( val & 0x0F ) );\n\n            ss += 1;\n            tt += 2;\n          }\n\n          if ( source->width & 1 )\n            tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 );\n\n          s += source->pitch;\n          t += target->pitch;\n        }\n      }\n      break;\n\n\n    default:\n      ;\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot )\n  {\n    if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP   &&\n         !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )\n    {\n      FT_Bitmap  bitmap;\n      FT_Error   error;\n\n\n      FT_Bitmap_New( &bitmap );\n      error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap );\n      if ( error )\n        return error;\n\n      slot->bitmap = bitmap;\n      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftbitmap.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Bitmap_Done( FT_Library  library,\n                  FT_Bitmap  *bitmap )\n  {\n    FT_Memory  memory;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !bitmap )\n      return FT_THROW( Invalid_Argument );\n\n    memory = library->memory;\n\n    FT_FREE( bitmap->buffer );\n    *bitmap = null_bitmap;\n\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftcalc.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcalc.c                                                               */\n/*                                                                         */\n/*    Arithmetic computations (body).                                      */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2012-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Support for 1-complement arithmetic has been totally dropped in this  */\n  /* release.  You can still write your own code if you need it.           */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Implementing basic computation routines.                              */\n  /*                                                                       */\n  /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(),   */\n  /* and FT_FloorFix() are declared in freetype.h.                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_GLYPH_H\n#include FT_TRIGONOMETRY_H\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_OBJECTS_H\n\n#ifdef FT_MULFIX_INLINED\n#undef FT_MulFix\n#endif\n\n/* we need to emulate a 64-bit data type if a real one isn't available */\n\n#ifndef FT_LONG64\n\n  typedef struct  FT_Int64_\n  {\n    FT_UInt32  lo;\n    FT_UInt32  hi;\n\n  } FT_Int64;\n\n#endif /* !FT_LONG64 */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_calc\n\n\n  /* The following three functions are available regardless of whether */\n  /* FT_LONG64 is defined.                                             */\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_RoundFix( FT_Fixed  a )\n  {\n    return ( a >= 0 ) ?   ( a + 0x8000L ) & ~0xFFFFL\n                      : -((-a + 0x8000L ) & ~0xFFFFL );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_CeilFix( FT_Fixed  a )\n  {\n    return ( a >= 0 ) ?   ( a + 0xFFFFL ) & ~0xFFFFL\n                      : -((-a + 0xFFFFL ) & ~0xFFFFL );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_FloorFix( FT_Fixed  a )\n  {\n    return ( a >= 0 ) ?   a & ~0xFFFFL\n                      : -((-a) & ~0xFFFFL );\n  }\n\n\n  FT_BASE_DEF ( FT_Int )\n  FT_MSB( FT_UInt32 z )\n  {\n    FT_Int shift = 0;\n\n    /* determine msb bit index in `shift' */\n    if ( z >= ( 1L << 16 ) )\n    {\n      z     >>= 16;\n      shift  += 16;\n    }\n    if ( z >= ( 1L << 8 ) )\n    {\n      z     >>= 8;\n      shift  += 8;\n    }\n    if ( z >= ( 1L << 4 ) )\n    {\n      z     >>= 4;\n      shift  += 4;\n    }\n    if ( z >= ( 1L << 2 ) )\n    {\n      z     >>= 2;\n      shift  += 2;\n    }\n    if ( z >= ( 1L << 1 ) )\n    {\n      z     >>= 1;\n      shift  += 1;\n    }\n\n    return shift;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Fixed )\n  FT_Hypot( FT_Fixed  x,\n            FT_Fixed  y )\n  {\n    FT_Vector  v;\n\n\n    v.x = x;\n    v.y = y;\n\n    return FT_Vector_Length( &v );\n  }\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /* documentation is in ftcalc.h */\n\n  FT_EXPORT_DEF( FT_Int32 )\n  FT_Sqrt32( FT_Int32  x )\n  {\n    FT_UInt32  val, root, newroot, mask;\n\n\n    root = 0;\n    mask = (FT_UInt32)0x40000000UL;\n    val  = (FT_UInt32)x;\n\n    do\n    {\n      newroot = root + mask;\n      if ( newroot <= val )\n      {\n        val -= newroot;\n        root = newroot + mask;\n      }\n\n      root >>= 1;\n      mask >>= 2;\n\n    } while ( mask != 0 );\n\n    return root;\n  }\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n#ifdef FT_LONG64\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_MulDiv( FT_Long  a,\n             FT_Long  b,\n             FT_Long  c )\n  {\n    FT_Int   s;\n    FT_Long  d;\n\n\n    s = 1;\n    if ( a < 0 ) { a = -a; s = -1; }\n    if ( b < 0 ) { b = -b; s = -s; }\n    if ( c < 0 ) { c = -c; s = -s; }\n\n    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c\n                         : 0x7FFFFFFFL );\n\n    return ( s > 0 ) ? d : -d;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Long )\n  FT_MulDiv_No_Round( FT_Long  a,\n                      FT_Long  b,\n                      FT_Long  c )\n  {\n    FT_Int   s;\n    FT_Long  d;\n\n\n    s = 1;\n    if ( a < 0 ) { a = -a; s = -1; }\n    if ( b < 0 ) { b = -b; s = -s; }\n    if ( c < 0 ) { c = -c; s = -s; }\n\n    d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c\n                         : 0x7FFFFFFFL );\n\n    return ( s > 0 ) ? d : -d;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b )\n  {\n#ifdef FT_MULFIX_ASSEMBLER\n\n    return FT_MULFIX_ASSEMBLER( a, b );\n\n#else\n\n    FT_Int   s = 1;\n    FT_Long  c;\n\n\n    if ( a < 0 )\n    {\n      a = -a;\n      s = -1;\n    }\n\n    if ( b < 0 )\n    {\n      b = -b;\n      s = -s;\n    }\n\n    c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );\n\n    return ( s > 0 ) ? c : -c;\n\n#endif /* FT_MULFIX_ASSEMBLER */\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_DivFix( FT_Long  a,\n             FT_Long  b )\n  {\n    FT_Int32   s;\n    FT_UInt32  q;\n\n\n    s = 1;\n    if ( a < 0 )\n    {\n      a = -a;\n      s = -1;\n    }\n    if ( b < 0 )\n    {\n      b = -b;\n      s = -s;\n    }\n\n    if ( b == 0 )\n      /* check for division by 0 */\n      q = 0x7FFFFFFFL;\n    else\n      /* compute result directly */\n      q = (FT_UInt32)( ( ( (FT_ULong)a << 16 ) + ( b >> 1 ) ) / b );\n\n    return ( s < 0 ? -(FT_Long)q : (FT_Long)q );\n  }\n\n\n#else /* !FT_LONG64 */\n\n\n  static void\n  ft_multo64( FT_UInt32  x,\n              FT_UInt32  y,\n              FT_Int64  *z )\n  {\n    FT_UInt32  lo1, hi1, lo2, hi2, lo, hi, i1, i2;\n\n\n    lo1 = x & 0x0000FFFFU;  hi1 = x >> 16;\n    lo2 = y & 0x0000FFFFU;  hi2 = y >> 16;\n\n    lo = lo1 * lo2;\n    i1 = lo1 * hi2;\n    i2 = lo2 * hi1;\n    hi = hi1 * hi2;\n\n    /* Check carry overflow of i1 + i2 */\n    i1 += i2;\n    hi += (FT_UInt32)( i1 < i2 ) << 16;\n\n    hi += i1 >> 16;\n    i1  = i1 << 16;\n\n    /* Check carry overflow of i1 + lo */\n    lo += i1;\n    hi += ( lo < i1 );\n\n    z->lo = lo;\n    z->hi = hi;\n  }\n\n\n  static FT_UInt32\n  ft_div64by32( FT_UInt32  hi,\n                FT_UInt32  lo,\n                FT_UInt32  y )\n  {\n    FT_UInt32  r, q;\n    FT_Int     i;\n\n\n    q = 0;\n    r = hi;\n\n    if ( r >= y )\n      return (FT_UInt32)0x7FFFFFFFL;\n\n    i = 32;\n    do\n    {\n      r <<= 1;\n      q <<= 1;\n      r  |= lo >> 31;\n\n      if ( r >= y )\n      {\n        r -= y;\n        q |= 1;\n      }\n      lo <<= 1;\n    } while ( --i );\n\n    return q;\n  }\n\n\n  static void\n  FT_Add64( FT_Int64*  x,\n            FT_Int64*  y,\n            FT_Int64  *z )\n  {\n    register FT_UInt32  lo, hi;\n\n\n    lo = x->lo + y->lo;\n    hi = x->hi + y->hi + ( lo < x->lo );\n\n    z->lo = lo;\n    z->hi = hi;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  /* The FT_MulDiv function has been optimized thanks to ideas from      */\n  /* Graham Asher.  The trick is to optimize computation when everything */\n  /* fits within 32-bits (a rather common case).                         */\n  /*                                                                     */\n  /*  we compute 'a*b+c/2', then divide it by 'c'. (positive values)     */\n  /*                                                                     */\n  /*  46340 is FLOOR(SQRT(2^31-1)).                                      */\n  /*                                                                     */\n  /*  if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 )         */\n  /*                                                                     */\n  /*  0x7FFFFFFF - 0x7FFEA810 = 0x157F0                                  */\n  /*                                                                     */\n  /*  if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF )                */\n  /*                                                                     */\n  /*  and 2*0x157F0 = 176096                                             */\n  /*                                                                     */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_MulDiv( FT_Long  a,\n             FT_Long  b,\n             FT_Long  c )\n  {\n    long  s;\n\n\n    /* XXX: this function does not allow 64-bit arguments */\n    if ( a == 0 || b == c )\n      return a;\n\n    s  = a; a = FT_ABS( a );\n    s ^= b; b = FT_ABS( b );\n    s ^= c; c = FT_ABS( c );\n\n    if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 )\n      a = ( a * b + ( c >> 1 ) ) / c;\n\n    else if ( (FT_Int32)c > 0 )\n    {\n      FT_Int64  temp, temp2;\n\n\n      ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );\n\n      temp2.hi = 0;\n      temp2.lo = (FT_UInt32)(c >> 1);\n      FT_Add64( &temp, &temp2, &temp );\n      a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );\n    }\n    else\n      a = 0x7FFFFFFFL;\n\n    return ( s < 0 ? -a : a );\n  }\n\n\n  FT_BASE_DEF( FT_Long )\n  FT_MulDiv_No_Round( FT_Long  a,\n                      FT_Long  b,\n                      FT_Long  c )\n  {\n    long  s;\n\n\n    if ( a == 0 || b == c )\n      return a;\n\n    s  = a; a = FT_ABS( a );\n    s ^= b; b = FT_ABS( b );\n    s ^= c; c = FT_ABS( c );\n\n    if ( a <= 46340L && b <= 46340L && c > 0 )\n      a = a * b / c;\n\n    else if ( (FT_Int32)c > 0 )\n    {\n      FT_Int64  temp;\n\n\n      ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );\n      a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );\n    }\n    else\n      a = 0x7FFFFFFFL;\n\n    return ( s < 0 ? -a : a );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_MulFix( FT_Long  a,\n             FT_Long  b )\n  {\n#ifdef FT_MULFIX_ASSEMBLER\n\n    return FT_MULFIX_ASSEMBLER( a, b );\n\n#elif 0\n\n    /*\n     *  This code is nonportable.  See comment below.\n     *\n     *  However, on a platform where right-shift of a signed quantity fills\n     *  the leftmost bits by copying the sign bit, it might be faster.\n     */\n\n    FT_Long   sa, sb;\n    FT_ULong  ua, ub;\n\n\n    if ( a == 0 || b == 0x10000L )\n      return a;\n\n    /*\n     *  This is a clever way of converting a signed number `a' into its\n     *  absolute value (stored back into `a') and its sign.  The sign is\n     *  stored in `sa'; 0 means `a' was positive or zero, and -1 means `a'\n     *  was negative.  (Similarly for `b' and `sb').\n     *\n     *  Unfortunately, it doesn't work (at least not portably).\n     *\n     *  It makes the assumption that right-shift on a negative signed value\n     *  fills the leftmost bits by copying the sign bit.  This is wrong.\n     *  According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206,\n     *  the result of right-shift of a negative signed value is\n     *  implementation-defined.  At least one implementation fills the\n     *  leftmost bits with 0s (i.e., it is exactly the same as an unsigned\n     *  right shift).  This means that when `a' is negative, `sa' ends up\n     *  with the value 1 rather than -1.  After that, everything else goes\n     *  wrong.\n     */\n    sa = ( a >> ( sizeof ( a ) * 8 - 1 ) );\n    a  = ( a ^ sa ) - sa;\n    sb = ( b >> ( sizeof ( b ) * 8 - 1 ) );\n    b  = ( b ^ sb ) - sb;\n\n    ua = (FT_ULong)a;\n    ub = (FT_ULong)b;\n\n    if ( ua <= 2048 && ub <= 1048576L )\n      ua = ( ua * ub + 0x8000U ) >> 16;\n    else\n    {\n      FT_ULong  al = ua & 0xFFFFU;\n\n\n      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +\n           ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 );\n    }\n\n    sa ^= sb,\n    ua  = (FT_ULong)(( ua ^ sa ) - sa);\n\n    return (FT_Long)ua;\n\n#else /* 0 */\n\n    FT_Long   s;\n    FT_ULong  ua, ub;\n\n\n    if ( a == 0 || b == 0x10000L )\n      return a;\n\n    s  = a; a = FT_ABS( a );\n    s ^= b; b = FT_ABS( b );\n\n    ua = (FT_ULong)a;\n    ub = (FT_ULong)b;\n\n    if ( ua <= 2048 && ub <= 1048576L )\n      ua = ( ua * ub + 0x8000UL ) >> 16;\n    else\n    {\n      FT_ULong  al = ua & 0xFFFFUL;\n\n\n      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +\n           ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 );\n    }\n\n    return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua );\n\n#endif /* 0 */\n\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_DivFix( FT_Long  a,\n             FT_Long  b )\n  {\n    FT_Int32   s;\n    FT_UInt32  q;\n\n\n    /* XXX: this function does not allow 64-bit arguments */\n    s  = (FT_Int32)a; a = FT_ABS( a );\n    s ^= (FT_Int32)b; b = FT_ABS( b );\n\n    if ( (FT_UInt32)b == 0 )\n    {\n      /* check for division by 0 */\n      q = (FT_UInt32)0x7FFFFFFFL;\n    }\n    else if ( ( a >> 16 ) == 0 )\n    {\n      /* compute result directly */\n      q = (FT_UInt32)( ( (FT_ULong)a << 16 ) + ( b >> 1 ) ) / (FT_UInt32)b;\n    }\n    else\n    {\n      /* we need more bits; we have to do it by hand */\n      FT_Int64  temp, temp2;\n\n\n      temp.hi  = (FT_Int32)( a >> 16 );\n      temp.lo  = (FT_UInt32)a << 16;\n      temp2.hi = 0;\n      temp2.lo = (FT_UInt32)( b >> 1 );\n      FT_Add64( &temp, &temp2, &temp );\n      q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b );\n    }\n\n    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n  }\n\n\n#if 0\n\n  /* documentation is in ftcalc.h */\n\n  FT_EXPORT_DEF( void )\n  FT_MulTo64( FT_Int32   x,\n              FT_Int32   y,\n              FT_Int64  *z )\n  {\n    FT_Int32  s;\n\n\n    s  = x; x = FT_ABS( x );\n    s ^= y; y = FT_ABS( y );\n\n    ft_multo64( x, y, z );\n\n    if ( s < 0 )\n    {\n      z->lo = (FT_UInt32)-(FT_Int32)z->lo;\n      z->hi = ~z->hi + !( z->lo );\n    }\n  }\n\n\n  /* apparently, the second version of this code is not compiled correctly */\n  /* on Mac machines with the MPW C compiler..  tsk, tsk, tsk...           */\n\n#if 1\n\n  FT_EXPORT_DEF( FT_Int32 )\n  FT_Div64by32( FT_Int64*  x,\n                FT_Int32   y )\n  {\n    FT_Int32   s;\n    FT_UInt32  q, r, i, lo;\n\n\n    s  = x->hi;\n    if ( s < 0 )\n    {\n      x->lo = (FT_UInt32)-(FT_Int32)x->lo;\n      x->hi = ~x->hi + !x->lo;\n    }\n    s ^= y;  y = FT_ABS( y );\n\n    /* Shortcut */\n    if ( x->hi == 0 )\n    {\n      if ( y > 0 )\n        q = x->lo / y;\n      else\n        q = 0x7FFFFFFFL;\n\n      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n    }\n\n    r  = x->hi;\n    lo = x->lo;\n\n    if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */\n      return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL );\n                             /* Return Max/Min Int32 if division overflow. */\n                             /* This includes division by zero!            */\n    q = 0;\n    for ( i = 0; i < 32; i++ )\n    {\n      r <<= 1;\n      q <<= 1;\n      r  |= lo >> 31;\n\n      if ( r >= (FT_UInt32)y )\n      {\n        r -= y;\n        q |= 1;\n      }\n      lo <<= 1;\n    }\n\n    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n  }\n\n#else /* 0 */\n\n  FT_EXPORT_DEF( FT_Int32 )\n  FT_Div64by32( FT_Int64*  x,\n                FT_Int32   y )\n  {\n    FT_Int32   s;\n    FT_UInt32  q;\n\n\n    s  = x->hi;\n    if ( s < 0 )\n    {\n      x->lo = (FT_UInt32)-(FT_Int32)x->lo;\n      x->hi = ~x->hi + !x->lo;\n    }\n    s ^= y;  y = FT_ABS( y );\n\n    /* Shortcut */\n    if ( x->hi == 0 )\n    {\n      if ( y > 0 )\n        q = ( x->lo + ( y >> 1 ) ) / y;\n      else\n        q = 0x7FFFFFFFL;\n\n      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n    }\n\n    q = ft_div64by32( x->hi, x->lo, y );\n\n    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );\n  }\n\n#endif /* 0 */\n\n#endif /* 0 */\n\n\n#endif /* FT_LONG64 */\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Matrix_Multiply( const FT_Matrix*  a,\n                      FT_Matrix        *b )\n  {\n    FT_Fixed  xx, xy, yx, yy;\n\n\n    if ( !a || !b )\n      return;\n\n    xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx );\n    xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy );\n    yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx );\n    yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy );\n\n    b->xx = xx;  b->xy = xy;\n    b->yx = yx;  b->yy = yy;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Matrix_Invert( FT_Matrix*  matrix )\n  {\n    FT_Pos  delta, xx, yy;\n\n\n    if ( !matrix )\n      return FT_THROW( Invalid_Argument );\n\n    /* compute discriminant */\n    delta = FT_MulFix( matrix->xx, matrix->yy ) -\n            FT_MulFix( matrix->xy, matrix->yx );\n\n    if ( !delta )\n      return FT_THROW( Invalid_Argument );  /* matrix can't be inverted */\n\n    matrix->xy = - FT_DivFix( matrix->xy, delta );\n    matrix->yx = - FT_DivFix( matrix->yx, delta );\n\n    xx = matrix->xx;\n    yy = matrix->yy;\n\n    matrix->xx = FT_DivFix( yy, delta );\n    matrix->yy = FT_DivFix( xx, delta );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( void )\n  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,\n                             FT_Matrix        *b,\n                             FT_Long           scaling )\n  {\n    FT_Fixed  xx, xy, yx, yy;\n\n    FT_Long   val = 0x10000L * scaling;\n\n\n    if ( !a || !b )\n      return;\n\n    xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val );\n    xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val );\n    yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val );\n    yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val );\n\n    b->xx = xx;  b->xy = xy;\n    b->yx = yx;  b->yy = yy;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( void )\n  FT_Vector_Transform_Scaled( FT_Vector*        vector,\n                              const FT_Matrix*  matrix,\n                              FT_Long           scaling )\n  {\n    FT_Pos   xz, yz;\n\n    FT_Long  val = 0x10000L * scaling;\n\n\n    if ( !vector || !matrix )\n      return;\n\n    xz = FT_MulDiv( vector->x, matrix->xx, val ) +\n         FT_MulDiv( vector->y, matrix->xy, val );\n\n    yz = FT_MulDiv( vector->x, matrix->yx, val ) +\n         FT_MulDiv( vector->y, matrix->yy, val );\n\n    vector->x = xz;\n    vector->y = yz;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Int32 )\n  FT_SqrtFixed( FT_Int32  x )\n  {\n    FT_UInt32  root, rem_hi, rem_lo, test_div;\n    FT_Int     count;\n\n\n    root = 0;\n\n    if ( x > 0 )\n    {\n      rem_hi = 0;\n      rem_lo = x;\n      count  = 24;\n      do\n      {\n        rem_hi   = ( rem_hi << 2 ) | ( rem_lo >> 30 );\n        rem_lo <<= 2;\n        root   <<= 1;\n        test_div = ( root << 1 ) + 1;\n\n        if ( rem_hi >= test_div )\n        {\n          rem_hi -= test_div;\n          root   += 1;\n        }\n      } while ( --count );\n    }\n\n    return (FT_Int32)root;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Int )\n  ft_corner_orientation( FT_Pos  in_x,\n                         FT_Pos  in_y,\n                         FT_Pos  out_x,\n                         FT_Pos  out_y )\n  {\n    FT_Long  result; /* avoid overflow on 16-bit system */\n\n\n    /* deal with the trivial cases quickly */\n    if ( in_y == 0 )\n    {\n      if ( in_x >= 0 )\n        result = out_y;\n      else\n        result = -out_y;\n    }\n    else if ( in_x == 0 )\n    {\n      if ( in_y >= 0 )\n        result = -out_x;\n      else\n        result = out_x;\n    }\n    else if ( out_y == 0 )\n    {\n      if ( out_x >= 0 )\n        result = in_y;\n      else\n        result = -in_y;\n    }\n    else if ( out_x == 0 )\n    {\n      if ( out_y >= 0 )\n        result = -in_x;\n      else\n        result =  in_x;\n    }\n    else /* general case */\n    {\n#ifdef FT_LONG64\n\n      FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;\n\n\n      if ( delta == 0 )\n        result = 0;\n      else\n        result = 1 - 2 * ( delta < 0 );\n\n#else\n\n      FT_Int64  z1, z2;\n\n\n      /* XXX: this function does not allow 64-bit arguments */\n      ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 );\n      ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 );\n\n      if ( z1.hi > z2.hi )\n        result = +1;\n      else if ( z1.hi < z2.hi )\n        result = -1;\n      else if ( z1.lo > z2.lo )\n        result = +1;\n      else if ( z1.lo < z2.lo )\n        result = -1;\n      else\n        result = 0;\n\n#endif\n    }\n\n    /* XXX: only the sign of return value, +1/0/-1 must be used */\n    return (FT_Int)result;\n  }\n\n\n  /* documentation is in ftcalc.h */\n\n  FT_BASE_DEF( FT_Int )\n  ft_corner_is_flat( FT_Pos  in_x,\n                     FT_Pos  in_y,\n                     FT_Pos  out_x,\n                     FT_Pos  out_y )\n  {\n    FT_Pos  ax = in_x;\n    FT_Pos  ay = in_y;\n\n    FT_Pos  d_in, d_out, d_corner;\n\n\n    if ( ax < 0 )\n      ax = -ax;\n    if ( ay < 0 )\n      ay = -ay;\n    d_in = ax + ay;\n\n    ax = out_x;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = out_y;\n    if ( ay < 0 )\n      ay = -ay;\n    d_out = ax + ay;\n\n    ax = out_x + in_x;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = out_y + in_y;\n    if ( ay < 0 )\n      ay = -ay;\n    d_corner = ax + ay;\n\n    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftcid.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcid.c                                                                */\n/*                                                                         */\n/*    FreeType API for accessing CID font information.                     */\n/*                                                                         */\n/*  Copyright 2007, 2009, 2013 by Derek Clegg, Michael Toftdal.            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_CID_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_CID_H\n\n\n  /* documentation is in ftcid.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,\n                                           const char*  *registry,\n                                           const char*  *ordering,\n                                           FT_Int       *supplement)\n  {\n    FT_Error     error;\n    const char*  r = NULL;\n    const char*  o = NULL;\n    FT_Int       s = 0;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( face )\n    {\n      FT_Service_CID  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, CID );\n\n      if ( service && service->get_ros )\n        error = service->get_ros( face, &r, &o, &s );\n    }\n\n    if ( registry )\n      *registry = r;\n\n    if ( ordering )\n      *ordering = o;\n\n    if ( supplement )\n      *supplement = s;\n\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,\n                                      FT_Bool  *is_cid )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n    FT_Bool   ic = 0;\n\n\n    if ( face )\n    {\n      FT_Service_CID  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, CID );\n\n      if ( service && service->get_is_cid )\n        error = service->get_is_cid( face, &ic);\n    }\n\n    if ( is_cid )\n      *is_cid = ic;\n\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_CID_From_Glyph_Index( FT_Face   face,\n                               FT_UInt   glyph_index,\n                               FT_UInt  *cid )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n    FT_UInt   c = 0;\n\n\n    if ( face )\n    {\n      FT_Service_CID  service;\n\n\n      FT_FACE_FIND_SERVICE( face, service, CID );\n\n      if ( service && service->get_cid_from_glyph_index )\n        error = service->get_cid_from_glyph_index( face, glyph_index, &c);\n    }\n\n    if ( cid )\n      *cid = c;\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftdbgmem.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdbgmem.c                                                             */\n/*                                                                         */\n/*    Memory debugger (body).                                              */\n/*                                                                         */\n/*  Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2009 by                  */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_MEMORY_H\n#include FT_SYSTEM_H\n#include FT_ERRORS_H\n#include FT_TYPES_H\n\n\n#ifdef FT_DEBUG_MEMORY\n\n#define  KEEPALIVE /* `Keep alive' means that freed blocks aren't released\n                    * to the heap.  This is useful to detect double-frees\n                    * or weird heap corruption, but it uses large amounts of\n                    * memory, however.\n                    */\n\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\n  FT_BASE_DEF( const char* )  _ft_debug_file   = 0;\n  FT_BASE_DEF( long )         _ft_debug_lineno = 0;\n\n  extern void\n  FT_DumpMemory( FT_Memory  memory );\n\n\n  typedef struct FT_MemSourceRec_*  FT_MemSource;\n  typedef struct FT_MemNodeRec_*    FT_MemNode;\n  typedef struct FT_MemTableRec_*   FT_MemTable;\n\n\n#define FT_MEM_VAL( addr )  ((FT_PtrDist)(FT_Pointer)( addr ))\n\n  /*\n   *  This structure holds statistics for a single allocation/release\n   *  site.  This is useful to know where memory operations happen the\n   *  most.\n   */\n  typedef struct  FT_MemSourceRec_\n  {\n    const char*   file_name;\n    long          line_no;\n\n    FT_Long       cur_blocks;   /* current number of allocated blocks */\n    FT_Long       max_blocks;   /* max. number of allocated blocks    */\n    FT_Long       all_blocks;   /* total number of blocks allocated   */\n\n    FT_Long       cur_size;     /* current cumulative allocated size */\n    FT_Long       max_size;     /* maximum cumulative allocated size */\n    FT_Long       all_size;     /* total cumulative allocated size   */\n\n    FT_Long       cur_max;      /* current maximum allocated size */\n\n    FT_UInt32     hash;\n    FT_MemSource  link;\n\n  } FT_MemSourceRec;\n\n\n  /*\n   *  We don't need a resizable array for the memory sources, because\n   *  their number is pretty limited within FreeType.\n   */\n#define FT_MEM_SOURCE_BUCKETS  128\n\n  /*\n   *  This structure holds information related to a single allocated\n   *  memory block.  If KEEPALIVE is defined, blocks that are freed by\n   *  FreeType are never released to the system.  Instead, their `size'\n   *  field is set to -size.  This is mainly useful to detect double frees,\n   *  at the price of large memory footprint during execution.\n   */\n  typedef struct  FT_MemNodeRec_\n  {\n    FT_Byte*      address;\n    FT_Long       size;     /* < 0 if the block was freed */\n\n    FT_MemSource  source;\n\n#ifdef KEEPALIVE\n    const char*   free_file_name;\n    FT_Long       free_line_no;\n#endif\n\n    FT_MemNode    link;\n\n  } FT_MemNodeRec;\n\n\n  /*\n   *  The global structure, containing compound statistics and all hash\n   *  tables.\n   */\n  typedef struct  FT_MemTableRec_\n  {\n    FT_ULong         size;\n    FT_ULong         nodes;\n    FT_MemNode*      buckets;\n\n    FT_ULong         alloc_total;\n    FT_ULong         alloc_current;\n    FT_ULong         alloc_max;\n    FT_ULong         alloc_count;\n\n    FT_Bool          bound_total;\n    FT_ULong         alloc_total_max;\n\n    FT_Bool          bound_count;\n    FT_ULong         alloc_count_max;\n\n    FT_MemSource     sources[FT_MEM_SOURCE_BUCKETS];\n\n    FT_Bool          keep_alive;\n\n    FT_Memory        memory;\n    FT_Pointer       memory_user;\n    FT_Alloc_Func    alloc;\n    FT_Free_Func     free;\n    FT_Realloc_Func  realloc;\n\n  } FT_MemTableRec;\n\n\n#define FT_MEM_SIZE_MIN  7\n#define FT_MEM_SIZE_MAX  13845163\n\n#define FT_FILENAME( x )  ((x) ? (x) : \"unknown file\")\n\n\n  /*\n   *  Prime numbers are ugly to handle.  It would be better to implement\n   *  L-Hashing, which is 10% faster and doesn't require divisions.\n   */\n  static const FT_UInt  ft_mem_primes[] =\n  {\n    7,\n    11,\n    19,\n    37,\n    73,\n    109,\n    163,\n    251,\n    367,\n    557,\n    823,\n    1237,\n    1861,\n    2777,\n    4177,\n    6247,\n    9371,\n    14057,\n    21089,\n    31627,\n    47431,\n    71143,\n    106721,\n    160073,\n    240101,\n    360163,\n    540217,\n    810343,\n    1215497,\n    1823231,\n    2734867,\n    4102283,\n    6153409,\n    9230113,\n    13845163,\n  };\n\n\n  static FT_ULong\n  ft_mem_closest_prime( FT_ULong  num )\n  {\n    FT_UInt  i;\n\n\n    for ( i = 0;\n          i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ )\n      if ( ft_mem_primes[i] > num )\n        return ft_mem_primes[i];\n\n    return FT_MEM_SIZE_MAX;\n  }\n\n\n  extern void\n  ft_mem_debug_panic( const char*  fmt,\n                      ... )\n  {\n    va_list  ap;\n\n\n    printf( \"FreeType.Debug: \" );\n\n    va_start( ap, fmt );\n    vprintf( fmt, ap );\n    va_end( ap );\n\n    printf( \"\\n\" );\n    exit( EXIT_FAILURE );\n  }\n\n\n  static FT_Pointer\n  ft_mem_table_alloc( FT_MemTable  table,\n                      FT_Long      size )\n  {\n    FT_Memory   memory = table->memory;\n    FT_Pointer  block;\n\n\n    memory->user = table->memory_user;\n    block = table->alloc( memory, size );\n    memory->user = table;\n\n    return block;\n  }\n\n\n  static void\n  ft_mem_table_free( FT_MemTable  table,\n                     FT_Pointer   block )\n  {\n    FT_Memory  memory = table->memory;\n\n\n    memory->user = table->memory_user;\n    table->free( memory, block );\n    memory->user = table;\n  }\n\n\n  static void\n  ft_mem_table_resize( FT_MemTable  table )\n  {\n    FT_ULong  new_size;\n\n\n    new_size = ft_mem_closest_prime( table->nodes );\n    if ( new_size != table->size )\n    {\n      FT_MemNode*  new_buckets;\n      FT_ULong     i;\n\n\n      new_buckets = (FT_MemNode *)\n                      ft_mem_table_alloc( table,\n                                          new_size * sizeof ( FT_MemNode ) );\n      if ( new_buckets == NULL )\n        return;\n\n      FT_ARRAY_ZERO( new_buckets, new_size );\n\n      for ( i = 0; i < table->size; i++ )\n      {\n        FT_MemNode  node, next, *pnode;\n        FT_PtrDist  hash;\n\n\n        node = table->buckets[i];\n        while ( node )\n        {\n          next  = node->link;\n          hash  = FT_MEM_VAL( node->address ) % new_size;\n          pnode = new_buckets + hash;\n\n          node->link = pnode[0];\n          pnode[0]   = node;\n\n          node = next;\n        }\n      }\n\n      if ( table->buckets )\n        ft_mem_table_free( table, table->buckets );\n\n      table->buckets = new_buckets;\n      table->size    = new_size;\n    }\n  }\n\n\n  static FT_MemTable\n  ft_mem_table_new( FT_Memory  memory )\n  {\n    FT_MemTable  table;\n\n\n    table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) );\n    if ( table == NULL )\n      goto Exit;\n\n    FT_ZERO( table );\n\n    table->size  = FT_MEM_SIZE_MIN;\n    table->nodes = 0;\n\n    table->memory = memory;\n\n    table->memory_user = memory->user;\n\n    table->alloc   = memory->alloc;\n    table->realloc = memory->realloc;\n    table->free    = memory->free;\n\n    table->buckets = (FT_MemNode *)\n                       memory->alloc( memory,\n                                      table->size * sizeof ( FT_MemNode ) );\n    if ( table->buckets )\n      FT_ARRAY_ZERO( table->buckets, table->size );\n    else\n    {\n      memory->free( memory, table );\n      table = NULL;\n    }\n\n  Exit:\n    return table;\n  }\n\n\n  static void\n  ft_mem_table_destroy( FT_MemTable  table )\n  {\n    FT_ULong  i;\n\n\n    FT_DumpMemory( table->memory );\n\n    if ( table )\n    {\n      FT_Long   leak_count = 0;\n      FT_ULong  leaks      = 0;\n\n\n      /* remove all blocks from the table, revealing leaked ones */\n      for ( i = 0; i < table->size; i++ )\n      {\n        FT_MemNode  *pnode = table->buckets + i, next, node = *pnode;\n\n\n        while ( node )\n        {\n          next       = node->link;\n          node->link = 0;\n\n          if ( node->size > 0 )\n          {\n            printf(\n              \"leaked memory block at address %p, size %8ld in (%s:%ld)\\n\",\n              node->address, node->size,\n              FT_FILENAME( node->source->file_name ),\n              node->source->line_no );\n\n            leak_count++;\n            leaks += node->size;\n\n            ft_mem_table_free( table, node->address );\n          }\n\n          node->address = NULL;\n          node->size    = 0;\n\n          ft_mem_table_free( table, node );\n          node = next;\n        }\n        table->buckets[i] = 0;\n      }\n\n      ft_mem_table_free( table, table->buckets );\n      table->buckets = NULL;\n\n      table->size  = 0;\n      table->nodes = 0;\n\n      /* remove all sources */\n      for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ )\n      {\n        FT_MemSource  source, next;\n\n\n        for ( source = table->sources[i]; source != NULL; source = next )\n        {\n          next = source->link;\n          ft_mem_table_free( table, source );\n        }\n\n        table->sources[i] = NULL;\n      }\n\n      printf(\n        \"FreeType: total memory allocations = %ld\\n\", table->alloc_total );\n      printf(\n        \"FreeType: maximum memory footprint = %ld\\n\", table->alloc_max );\n\n      ft_mem_table_free( table, table );\n\n      if ( leak_count > 0 )\n        ft_mem_debug_panic(\n          \"FreeType: %ld bytes of memory leaked in %ld blocks\\n\",\n          leaks, leak_count );\n\n      printf( \"FreeType: no memory leaks detected\\n\" );\n    }\n  }\n\n\n  static FT_MemNode*\n  ft_mem_table_get_nodep( FT_MemTable  table,\n                          FT_Byte*     address )\n  {\n    FT_PtrDist   hash;\n    FT_MemNode  *pnode, node;\n\n\n    hash  = FT_MEM_VAL( address );\n    pnode = table->buckets + ( hash % table->size );\n\n    for (;;)\n    {\n      node = pnode[0];\n      if ( !node )\n        break;\n\n      if ( node->address == address )\n        break;\n\n      pnode = &node->link;\n    }\n    return pnode;\n  }\n\n\n  static FT_MemSource\n  ft_mem_table_get_source( FT_MemTable  table )\n  {\n    FT_UInt32     hash;\n    FT_MemSource  node, *pnode;\n\n\n    /* cast to FT_PtrDist first since void* can be larger */\n    /* than FT_UInt32 and GCC 4.1.1 emits a warning       */\n    hash  = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file +\n              (FT_UInt32)( 5 * _ft_debug_lineno );\n    pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS];\n\n    for ( ;; )\n    {\n      node = *pnode;\n      if ( node == NULL )\n        break;\n\n      if ( node->file_name == _ft_debug_file &&\n           node->line_no   == _ft_debug_lineno   )\n        goto Exit;\n\n      pnode = &node->link;\n    }\n\n    node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) );\n    if ( node == NULL )\n      ft_mem_debug_panic(\n        \"not enough memory to perform memory debugging\\n\" );\n\n    node->file_name = _ft_debug_file;\n    node->line_no   = _ft_debug_lineno;\n\n    node->cur_blocks = 0;\n    node->max_blocks = 0;\n    node->all_blocks = 0;\n\n    node->cur_size   = 0;\n    node->max_size   = 0;\n    node->all_size   = 0;\n\n    node->cur_max    = 0;\n\n    node->link = NULL;\n    node->hash = hash;\n    *pnode     = node;\n\n  Exit:\n    return node;\n  }\n\n\n  static void\n  ft_mem_table_set( FT_MemTable  table,\n                    FT_Byte*     address,\n                    FT_ULong     size,\n                    FT_Long      delta )\n  {\n    FT_MemNode  *pnode, node;\n\n\n    if ( table )\n    {\n      FT_MemSource  source;\n\n\n      pnode = ft_mem_table_get_nodep( table, address );\n      node  = *pnode;\n      if ( node )\n      {\n        if ( node->size < 0 )\n        {\n          /* This block was already freed.  Our memory is now completely */\n          /* corrupted!                                                  */\n          /* This can only happen in keep-alive mode.                    */\n          ft_mem_debug_panic(\n            \"memory heap corrupted (allocating freed block)\" );\n        }\n        else\n        {\n          /* This block was already allocated.  This means that our memory */\n          /* is also corrupted!                                            */\n          ft_mem_debug_panic(\n            \"memory heap corrupted (re-allocating allocated block at\"\n            \" %p, of size %ld)\\n\"\n            \"org=%s:%d new=%s:%d\\n\",\n            node->address, node->size,\n            FT_FILENAME( node->source->file_name ), node->source->line_no,\n            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );\n        }\n      }\n\n      /* we need to create a new node in this table */\n      node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) );\n      if ( node == NULL )\n        ft_mem_debug_panic( \"not enough memory to run memory tests\" );\n\n      node->address = address;\n      node->size    = size;\n      node->source  = source = ft_mem_table_get_source( table );\n\n      if ( delta == 0 )\n      {\n        /* this is an allocation */\n        source->all_blocks++;\n        source->cur_blocks++;\n        if ( source->cur_blocks > source->max_blocks )\n          source->max_blocks = source->cur_blocks;\n      }\n\n      if ( size > (FT_ULong)source->cur_max )\n        source->cur_max = size;\n\n      if ( delta != 0 )\n      {\n        /* we are growing or shrinking a reallocated block */\n        source->cur_size     += delta;\n        table->alloc_current += delta;\n      }\n      else\n      {\n        /* we are allocating a new block */\n        source->cur_size     += size;\n        table->alloc_current += size;\n      }\n\n      source->all_size += size;\n\n      if ( source->cur_size > source->max_size )\n        source->max_size = source->cur_size;\n\n      node->free_file_name = NULL;\n      node->free_line_no   = 0;\n\n      node->link = pnode[0];\n\n      pnode[0] = node;\n      table->nodes++;\n\n      table->alloc_total += size;\n\n      if ( table->alloc_current > table->alloc_max )\n        table->alloc_max = table->alloc_current;\n\n      if ( table->nodes * 3 < table->size  ||\n           table->size  * 3 < table->nodes )\n        ft_mem_table_resize( table );\n    }\n  }\n\n\n  static void\n  ft_mem_table_remove( FT_MemTable  table,\n                       FT_Byte*     address,\n                       FT_Long      delta )\n  {\n    if ( table )\n    {\n      FT_MemNode  *pnode, node;\n\n\n      pnode = ft_mem_table_get_nodep( table, address );\n      node  = *pnode;\n      if ( node )\n      {\n        FT_MemSource  source;\n\n\n        if ( node->size < 0 )\n          ft_mem_debug_panic(\n            \"freeing memory block at %p more than once at (%s:%ld)\\n\"\n            \"block allocated at (%s:%ld) and released at (%s:%ld)\",\n            address,\n            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno,\n            FT_FILENAME( node->source->file_name ), node->source->line_no,\n            FT_FILENAME( node->free_file_name ), node->free_line_no );\n\n        /* scramble the node's content for additional safety */\n        FT_MEM_SET( address, 0xF3, node->size );\n\n        if ( delta == 0 )\n        {\n          source = node->source;\n\n          source->cur_blocks--;\n          source->cur_size -= node->size;\n\n          table->alloc_current -= node->size;\n        }\n\n        if ( table->keep_alive )\n        {\n          /* we simply invert the node's size to indicate that the node */\n          /* was freed.                                                 */\n          node->size           = -node->size;\n          node->free_file_name = _ft_debug_file;\n          node->free_line_no   = _ft_debug_lineno;\n        }\n        else\n        {\n          table->nodes--;\n\n          *pnode = node->link;\n\n          node->size   = 0;\n          node->source = NULL;\n\n          ft_mem_table_free( table, node );\n\n          if ( table->nodes * 3 < table->size  ||\n               table->size  * 3 < table->nodes )\n            ft_mem_table_resize( table );\n        }\n      }\n      else\n        ft_mem_debug_panic(\n          \"trying to free unknown block at %p in (%s:%ld)\\n\",\n          address,\n          FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );\n    }\n  }\n\n\n  extern FT_Pointer\n  ft_mem_debug_alloc( FT_Memory  memory,\n                      FT_Long    size )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n    FT_Byte*     block;\n\n\n    if ( size <= 0 )\n      ft_mem_debug_panic( \"negative block size allocation (%ld)\", size );\n\n    /* return NULL if the maximum number of allocations was reached */\n    if ( table->bound_count                           &&\n         table->alloc_count >= table->alloc_count_max )\n      return NULL;\n\n    /* return NULL if this allocation would overflow the maximum heap size */\n    if ( table->bound_total                                             &&\n         table->alloc_total_max - table->alloc_current > (FT_ULong)size )\n      return NULL;\n\n    block = (FT_Byte *)ft_mem_table_alloc( table, size );\n    if ( block )\n    {\n      ft_mem_table_set( table, block, (FT_ULong)size, 0 );\n\n      table->alloc_count++;\n    }\n\n    _ft_debug_file   = \"<unknown>\";\n    _ft_debug_lineno = 0;\n\n    return (FT_Pointer)block;\n  }\n\n\n  extern void\n  ft_mem_debug_free( FT_Memory   memory,\n                     FT_Pointer  block )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n\n\n    if ( block == NULL )\n      ft_mem_debug_panic( \"trying to free NULL in (%s:%ld)\",\n                          FT_FILENAME( _ft_debug_file ),\n                          _ft_debug_lineno );\n\n    ft_mem_table_remove( table, (FT_Byte*)block, 0 );\n\n    if ( !table->keep_alive )\n      ft_mem_table_free( table, block );\n\n    table->alloc_count--;\n\n    _ft_debug_file   = \"<unknown>\";\n    _ft_debug_lineno = 0;\n  }\n\n\n  extern FT_Pointer\n  ft_mem_debug_realloc( FT_Memory   memory,\n                        FT_Long     cur_size,\n                        FT_Long     new_size,\n                        FT_Pointer  block )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n    FT_MemNode   node, *pnode;\n    FT_Pointer   new_block;\n    FT_Long      delta;\n\n    const char*  file_name = FT_FILENAME( _ft_debug_file );\n    FT_Long      line_no   = _ft_debug_lineno;\n\n\n    /* unlikely, but possible */\n    if ( new_size == cur_size )\n      return block;\n\n    /* the following is valid according to ANSI C */\n#if 0\n    if ( block == NULL || cur_size == 0 )\n      ft_mem_debug_panic( \"trying to reallocate NULL in (%s:%ld)\",\n                          file_name, line_no );\n#endif\n\n    /* while the following is allowed in ANSI C also, we abort since */\n    /* such case should be handled by FreeType.                      */\n    if ( new_size <= 0 )\n      ft_mem_debug_panic(\n        \"trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)\",\n        block, cur_size, file_name, line_no );\n\n    /* check `cur_size' value */\n    pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block );\n    node  = *pnode;\n    if ( !node )\n      ft_mem_debug_panic(\n        \"trying to reallocate unknown block at %p in (%s:%ld)\",\n        block, file_name, line_no );\n\n    if ( node->size <= 0 )\n      ft_mem_debug_panic(\n        \"trying to reallocate freed block at %p in (%s:%ld)\",\n        block, file_name, line_no );\n\n    if ( node->size != cur_size )\n      ft_mem_debug_panic( \"invalid ft_realloc request for %p. cur_size is \"\n                          \"%ld instead of %ld in (%s:%ld)\",\n                          block, cur_size, node->size, file_name, line_no );\n\n    /* return NULL if the maximum number of allocations was reached */\n    if ( table->bound_count                           &&\n         table->alloc_count >= table->alloc_count_max )\n      return NULL;\n\n    delta = (FT_Long)( new_size - cur_size );\n\n    /* return NULL if this allocation would overflow the maximum heap size */\n    if ( delta > 0                                                       &&\n         table->bound_total                                              &&\n         table->alloc_current + (FT_ULong)delta > table->alloc_total_max )\n      return NULL;\n\n    new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size );\n    if ( new_block == NULL )\n      return NULL;\n\n    ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta );\n\n    ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size );\n\n    ft_mem_table_remove( table, (FT_Byte*)block, delta );\n\n    _ft_debug_file   = \"<unknown>\";\n    _ft_debug_lineno = 0;\n\n    if ( !table->keep_alive )\n      ft_mem_table_free( table, block );\n\n    return new_block;\n  }\n\n\n  extern FT_Int\n  ft_mem_debug_init( FT_Memory  memory )\n  {\n    FT_MemTable  table;\n    FT_Int       result = 0;\n\n\n    if ( getenv( \"FT2_DEBUG_MEMORY\" ) )\n    {\n      table = ft_mem_table_new( memory );\n      if ( table )\n      {\n        const char*  p;\n\n\n        memory->user    = table;\n        memory->alloc   = ft_mem_debug_alloc;\n        memory->realloc = ft_mem_debug_realloc;\n        memory->free    = ft_mem_debug_free;\n\n        p = getenv( \"FT2_ALLOC_TOTAL_MAX\" );\n        if ( p != NULL )\n        {\n          FT_Long   total_max = ft_atol( p );\n\n\n          if ( total_max > 0 )\n          {\n            table->bound_total     = 1;\n            table->alloc_total_max = (FT_ULong)total_max;\n          }\n        }\n\n        p = getenv( \"FT2_ALLOC_COUNT_MAX\" );\n        if ( p != NULL )\n        {\n          FT_Long  total_count = ft_atol( p );\n\n\n          if ( total_count > 0 )\n          {\n            table->bound_count     = 1;\n            table->alloc_count_max = (FT_ULong)total_count;\n          }\n        }\n\n        p = getenv( \"FT2_KEEP_ALIVE\" );\n        if ( p != NULL )\n        {\n          FT_Long  keep_alive = ft_atol( p );\n\n\n          if ( keep_alive > 0 )\n            table->keep_alive = 1;\n        }\n\n        result = 1;\n      }\n    }\n    return result;\n  }\n\n\n  extern void\n  ft_mem_debug_done( FT_Memory  memory )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n\n\n    if ( table )\n    {\n      memory->free    = table->free;\n      memory->realloc = table->realloc;\n      memory->alloc   = table->alloc;\n\n      ft_mem_table_destroy( table );\n      memory->user = NULL;\n    }\n  }\n\n\n\n  static int\n  ft_mem_source_compare( const void*  p1,\n                         const void*  p2 )\n  {\n    FT_MemSource  s1 = *(FT_MemSource*)p1;\n    FT_MemSource  s2 = *(FT_MemSource*)p2;\n\n\n    if ( s2->max_size > s1->max_size )\n      return 1;\n    else if ( s2->max_size < s1->max_size )\n      return -1;\n    else\n      return 0;\n  }\n\n\n  extern void\n  FT_DumpMemory( FT_Memory  memory )\n  {\n    FT_MemTable  table = (FT_MemTable)memory->user;\n\n\n    if ( table )\n    {\n      FT_MemSource*  bucket = table->sources;\n      FT_MemSource*  limit  = bucket + FT_MEM_SOURCE_BUCKETS;\n      FT_MemSource*  sources;\n      FT_UInt        nn, count;\n      const char*    fmt;\n\n\n      count = 0;\n      for ( ; bucket < limit; bucket++ )\n      {\n        FT_MemSource  source = *bucket;\n\n\n        for ( ; source; source = source->link )\n          count++;\n      }\n\n      sources = (FT_MemSource*)ft_mem_table_alloc(\n                                 table, sizeof ( *sources ) * count );\n\n      count = 0;\n      for ( bucket = table->sources; bucket < limit; bucket++ )\n      {\n        FT_MemSource  source = *bucket;\n\n\n        for ( ; source; source = source->link )\n          sources[count++] = source;\n      }\n\n      ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare );\n\n      printf( \"FreeType Memory Dump: \"\n              \"current=%ld max=%ld total=%ld count=%ld\\n\",\n              table->alloc_current, table->alloc_max,\n              table->alloc_total, table->alloc_count );\n      printf( \" block  block    sizes    sizes    sizes   source\\n\" );\n      printf( \" count   high      sum  highsum      max   location\\n\" );\n      printf( \"-------------------------------------------------\\n\" );\n\n      fmt = \"%6ld %6ld %8ld %8ld %8ld %s:%d\\n\";\n\n      for ( nn = 0; nn < count; nn++ )\n      {\n        FT_MemSource  source = sources[nn];\n\n\n        printf( fmt,\n                source->cur_blocks, source->max_blocks,\n                source->cur_size, source->max_size, source->cur_max,\n                FT_FILENAME( source->file_name ),\n                source->line_no );\n      }\n      printf( \"------------------------------------------------\\n\" );\n\n      ft_mem_table_free( table, sources );\n    }\n  }\n\n#else  /* !FT_DEBUG_MEMORY */\n\n  /* ANSI C doesn't like empty source files */\n  typedef int  _debug_mem_dummy;\n\n#endif /* !FT_DEBUG_MEMORY */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftdebug.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftdebug.c                                                              */\n/*                                                                         */\n/*    Debugging and logging component (body).                              */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2004, 2008, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This component contains various macros and functions used to ease the */\n  /* debugging of the FreeType engine.  Its main purpose is in assertion   */\n  /* checking, tracing, and error detection.                               */\n  /*                                                                       */\n  /* There are now three debugging modes:                                  */\n  /*                                                                       */\n  /* - trace mode                                                          */\n  /*                                                                       */\n  /*   Error and trace messages are sent to the log file (which can be the */\n  /*   standard error output).                                             */\n  /*                                                                       */\n  /* - error mode                                                          */\n  /*                                                                       */\n  /*   Only error messages are generated.                                  */\n  /*                                                                       */\n  /* - release mode:                                                       */\n  /*                                                                       */\n  /*   No error message is sent or generated.  The code is free from any   */\n  /*   debugging parts.                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_DEBUG_H\n\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( void )\n  FT_Message( const char*  fmt,\n              ... )\n  {\n    va_list  ap;\n\n\n    va_start( ap, fmt );\n    vfprintf( stderr, fmt, ap );\n    va_end( ap );\n  }\n\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( void )\n  FT_Panic( const char*  fmt,\n            ... )\n  {\n    va_list  ap;\n\n\n    va_start( ap, fmt );\n    vfprintf( stderr, fmt, ap );\n    va_end( ap );\n\n    exit( EXIT_FAILURE );\n  }\n\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( int )\n  FT_Throw( FT_Error     error,\n            int          line,\n            const char*  file )\n  {\n    FT_UNUSED( error );\n    FT_UNUSED( line );\n    FT_UNUSED( file );\n\n    return 0;\n  }\n\n#endif /* FT_DEBUG_LEVEL_ERROR */\n\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n  /* array of trace levels, initialized to 0 */\n  int  ft_trace_levels[trace_count];\n\n\n  /* define array of trace toggle names */\n#define FT_TRACE_DEF( x )  #x ,\n\n  static const char*  ft_trace_toggles[trace_count + 1] =\n  {\n#include FT_INTERNAL_TRACE_H\n    NULL\n  };\n\n#undef FT_TRACE_DEF\n\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( FT_Int )\n  FT_Trace_Get_Count( void )\n  {\n    return trace_count;\n  }\n\n\n  /* documentation is in ftdebug.h */\n\n  FT_BASE_DEF( const char * )\n  FT_Trace_Get_Name( FT_Int  idx )\n  {\n    int  max = FT_Trace_Get_Count();\n\n\n    if ( idx < max )\n      return ft_trace_toggles[idx];\n    else\n      return NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Initialize the tracing sub-system.  This is done by retrieving the    */\n  /* value of the `FT2_DEBUG' environment variable.  It must be a list of  */\n  /* toggles, separated by spaces, `;', or `,'.  Example:                  */\n  /*                                                                       */\n  /*    export FT2_DEBUG=\"any:3 memory:7 stream:5\"                         */\n  /*                                                                       */\n  /* This requests that all levels be set to 3, except the trace level for */\n  /* the memory and stream components which are set to 7 and 5,            */\n  /* respectively.                                                         */\n  /*                                                                       */\n  /* See the file <include/freetype/internal/fttrace.h> for details of the */\n  /* available toggle names.                                               */\n  /*                                                                       */\n  /* The level must be between 0 and 7; 0 means quiet (except for serious  */\n  /* runtime errors), and 7 means _very_ verbose.                          */\n  /*                                                                       */\n  FT_BASE_DEF( void )\n  ft_debug_init( void )\n  {\n    const char*  ft2_debug = getenv( \"FT2_DEBUG\" );\n\n\n    if ( ft2_debug )\n    {\n      const char*  p = ft2_debug;\n      const char*  q;\n\n\n      for ( ; *p; p++ )\n      {\n        /* skip leading whitespace and separators */\n        if ( *p == ' ' || *p == '\\t' || *p == ',' || *p == ';' || *p == '=' )\n          continue;\n\n        /* read toggle name, followed by ':' */\n        q = p;\n        while ( *p && *p != ':' )\n          p++;\n\n        if ( *p == ':' && p > q )\n        {\n          FT_Int  n, i, len = (FT_Int)( p - q );\n          FT_Int  level = -1, found = -1;\n\n\n          for ( n = 0; n < trace_count; n++ )\n          {\n            const char*  toggle = ft_trace_toggles[n];\n\n\n            for ( i = 0; i < len; i++ )\n            {\n              if ( toggle[i] != q[i] )\n                break;\n            }\n\n            if ( i == len && toggle[i] == 0 )\n            {\n              found = n;\n              break;\n            }\n          }\n\n          /* read level */\n          p++;\n          if ( *p )\n          {\n            level = *p++ - '0';\n            if ( level < 0 || level > 7 )\n              level = -1;\n          }\n\n          if ( found >= 0 && level >= 0 )\n          {\n            if ( found == trace_any )\n            {\n              /* special case for `any' */\n              for ( n = 0; n < trace_count; n++ )\n                ft_trace_levels[n] = level;\n            }\n            else\n              ft_trace_levels[found] = level;\n          }\n        }\n      }\n    }\n  }\n\n\n#else  /* !FT_DEBUG_LEVEL_TRACE */\n\n\n  FT_BASE_DEF( void )\n  ft_debug_init( void )\n  {\n    /* nothing */\n  }\n\n\n  FT_BASE_DEF( FT_Int )\n  FT_Trace_Get_Count( void )\n  {\n    return 0;\n  }\n\n\n  FT_BASE_DEF( const char * )\n  FT_Trace_Get_Name( FT_Int  idx )\n  {\n    FT_UNUSED( idx );\n\n    return NULL;\n  }\n\n\n#endif /* !FT_DEBUG_LEVEL_TRACE */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftfstype.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftfstype.c                                                             */\n/*                                                                         */\n/*    FreeType utility file to access FSType data (body).                  */\n/*                                                                         */\n/*  Copyright 2008, 2009 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include <ft2build.h>\n#include FT_TYPE1_TABLES_H\n#include FT_TRUETYPE_TABLES_H\n#include FT_INTERNAL_SERVICE_H\n#include FT_SERVICE_POSTSCRIPT_INFO_H\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UShort )\n  FT_Get_FSType_Flags( FT_Face  face )\n  {\n    TT_OS2*  os2;\n\n\n    /* first, try to get the fs_type directly from the font */\n    if ( face )\n    {\n      FT_Service_PsInfo  service = NULL;\n\n\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_get_font_extra )\n      {\n        PS_FontExtraRec  extra;\n\n\n        if ( !service->ps_get_font_extra( face, &extra ) &&\n             extra.fs_type != 0                          )\n          return extra.fs_type;\n      }\n    }\n\n    /* look at FSType before fsType for Type42 */\n\n    if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, ft_sfnt_os2 ) ) != NULL &&\n         os2->version != 0xFFFFU                                           )\n      return os2->fsType;\n\n    return 0;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftgasp.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgasp.c                                                               */\n/*                                                                         */\n/*    Access of TrueType's `gasp' table (body).                            */\n/*                                                                         */\n/*  Copyright 2007 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_GASP_H\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n\n\n  FT_EXPORT_DEF( FT_Int )\n  FT_Get_Gasp( FT_Face  face,\n               FT_UInt  ppem )\n  {\n    FT_Int  result = FT_GASP_NO_TABLE;\n\n\n    if ( face && FT_IS_SFNT( face ) )\n    {\n      TT_Face  ttface = (TT_Face)face;\n\n\n      if ( ttface->gasp.numRanges > 0 )\n      {\n        TT_GaspRange  range     = ttface->gasp.gaspRanges;\n        TT_GaspRange  range_end = range + ttface->gasp.numRanges;\n\n\n        while ( ppem > range->maxPPEM )\n        {\n          range++;\n          if ( range >= range_end )\n            goto Exit;\n        }\n\n        result = range->gaspFlag;\n\n        /* ensure that we don't have spurious bits */\n        if ( ttface->gasp.version == 0 )\n          result &= 3;\n      }\n    }\n  Exit:\n    return result;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftgloadr.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgloadr.c                                                             */\n/*                                                                         */\n/*    The FreeType glyph loader (body).                                    */\n/*                                                                         */\n/*  Copyright 2002-2006, 2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_GLYPH_LOADER_H\n#include FT_INTERNAL_MEMORY_H\n#include FT_INTERNAL_OBJECTS_H\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gloader\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*****                    G L Y P H   L O A D E R                    *****/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The glyph loader is a simple object which is used to load a set of    */\n  /* glyphs easily.  It is critical for the correct loading of composites. */\n  /*                                                                       */\n  /* Ideally, one can see it as a stack of abstract `glyph' objects.       */\n  /*                                                                       */\n  /*   loader.base     Is really the bottom of the stack.  It describes a  */\n  /*                   single glyph image made of the juxtaposition of     */\n  /*                   several glyphs (those `in the stack').              */\n  /*                                                                       */\n  /*   loader.current  Describes the top of the stack, on which a new      */\n  /*                   glyph can be loaded.                                */\n  /*                                                                       */\n  /*   Rewind          Clears the stack.                                   */\n  /*   Prepare         Set up `loader.current' for addition of a new glyph */\n  /*                   image.                                              */\n  /*   Add             Add the `current' glyph image to the `base' one,    */\n  /*                   and prepare for another one.                        */\n  /*                                                                       */\n  /* The glyph loader is now a base object.  Each driver used to           */\n  /* re-implement it in one way or the other, which wasted code and        */\n  /* energy.                                                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* create a new glyph loader */\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_New( FT_Memory        memory,\n                      FT_GlyphLoader  *aloader )\n  {\n    FT_GlyphLoader  loader = NULL;\n    FT_Error        error;\n\n\n    if ( !FT_NEW( loader ) )\n    {\n      loader->memory = memory;\n      *aloader       = loader;\n    }\n    return error;\n  }\n\n\n  /* rewind the glyph loader - reset counters to 0 */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader )\n  {\n    FT_GlyphLoad  base    = &loader->base;\n    FT_GlyphLoad  current = &loader->current;\n\n\n    base->outline.n_points   = 0;\n    base->outline.n_contours = 0;\n    base->num_subglyphs      = 0;\n\n    *current = *base;\n  }\n\n\n  /* reset the glyph loader, frees all allocated tables */\n  /* and starts from zero                               */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Reset( FT_GlyphLoader  loader )\n  {\n    FT_Memory memory = loader->memory;\n\n\n    FT_FREE( loader->base.outline.points );\n    FT_FREE( loader->base.outline.tags );\n    FT_FREE( loader->base.outline.contours );\n    FT_FREE( loader->base.extra_points );\n    FT_FREE( loader->base.subglyphs );\n\n    loader->base.extra_points2 = NULL;\n\n    loader->max_points    = 0;\n    loader->max_contours  = 0;\n    loader->max_subglyphs = 0;\n\n    FT_GlyphLoader_Rewind( loader );\n  }\n\n\n  /* delete a glyph loader */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Done( FT_GlyphLoader  loader )\n  {\n    if ( loader )\n    {\n      FT_Memory memory = loader->memory;\n\n\n      FT_GlyphLoader_Reset( loader );\n      FT_FREE( loader );\n    }\n  }\n\n\n  /* re-adjust the `current' outline fields */\n  static void\n  FT_GlyphLoader_Adjust_Points( FT_GlyphLoader  loader )\n  {\n    FT_Outline*  base    = &loader->base.outline;\n    FT_Outline*  current = &loader->current.outline;\n\n\n    current->points   = base->points   + base->n_points;\n    current->tags     = base->tags     + base->n_points;\n    current->contours = base->contours + base->n_contours;\n\n    /* handle extra points table - if any */\n    if ( loader->use_extra )\n    {\n      loader->current.extra_points  = loader->base.extra_points +\n                                      base->n_points;\n\n      loader->current.extra_points2 = loader->base.extra_points2 +\n                                      base->n_points;\n    }\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader )\n  {\n    FT_Error   error;\n    FT_Memory  memory = loader->memory;\n\n\n    if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) )\n    {\n      loader->use_extra          = 1;\n      loader->base.extra_points2 = loader->base.extra_points +\n                                   loader->max_points;\n\n      FT_GlyphLoader_Adjust_Points( loader );\n    }\n    return error;\n  }\n\n\n  /* re-adjust the `current' subglyphs field */\n  static void\n  FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader  loader )\n  {\n    FT_GlyphLoad  base    = &loader->base;\n    FT_GlyphLoad  current = &loader->current;\n\n\n    current->subglyphs = base->subglyphs + base->num_subglyphs;\n  }\n\n\n  /* Ensure that we can add `n_points' and `n_contours' to our glyph.      */\n  /* This function reallocates its outline tables if necessary.  Note that */\n  /* it DOESN'T change the number of points within the loader!             */\n  /*                                                                       */\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,\n                              FT_UInt         n_points,\n                              FT_UInt         n_contours )\n  {\n    FT_Memory    memory  = loader->memory;\n    FT_Error     error   = FT_Err_Ok;\n    FT_Outline*  base    = &loader->base.outline;\n    FT_Outline*  current = &loader->current.outline;\n    FT_Bool      adjust  = 0;\n\n    FT_UInt      new_max, old_max;\n\n\n    /* check points & tags */\n    new_max = base->n_points + current->n_points + n_points;\n    old_max = loader->max_points;\n\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 8 );\n\n      if ( new_max > FT_OUTLINE_POINTS_MAX )\n        return FT_THROW( Array_Too_Large );\n\n      if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||\n           FT_RENEW_ARRAY( base->tags,   old_max, new_max ) )\n        goto Exit;\n\n      if ( loader->use_extra )\n      {\n        if ( FT_RENEW_ARRAY( loader->base.extra_points,\n                             old_max * 2, new_max * 2 ) )\n          goto Exit;\n\n        FT_ARRAY_MOVE( loader->base.extra_points + new_max,\n                       loader->base.extra_points + old_max,\n                       old_max );\n\n        loader->base.extra_points2 = loader->base.extra_points + new_max;\n      }\n\n      adjust = 1;\n      loader->max_points = new_max;\n    }\n\n    /* check contours */\n    old_max = loader->max_contours;\n    new_max = base->n_contours + current->n_contours +\n              n_contours;\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 4 );\n\n      if ( new_max > FT_OUTLINE_CONTOURS_MAX )\n        return FT_THROW( Array_Too_Large );\n\n      if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )\n        goto Exit;\n\n      adjust = 1;\n      loader->max_contours = new_max;\n    }\n\n    if ( adjust )\n      FT_GlyphLoader_Adjust_Points( loader );\n\n  Exit:\n    return error;\n  }\n\n\n  /* Ensure that we can add `n_subglyphs' to our glyph. this function */\n  /* reallocates its subglyphs table if necessary.  Note that it DOES */\n  /* NOT change the number of subglyphs within the loader!            */\n  /*                                                                  */\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,\n                                 FT_UInt         n_subs )\n  {\n    FT_Memory     memory = loader->memory;\n    FT_Error      error  = FT_Err_Ok;\n    FT_UInt       new_max, old_max;\n\n    FT_GlyphLoad  base    = &loader->base;\n    FT_GlyphLoad  current = &loader->current;\n\n\n    new_max = base->num_subglyphs + current->num_subglyphs + n_subs;\n    old_max = loader->max_subglyphs;\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 2 );\n      if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) )\n        goto Exit;\n\n      loader->max_subglyphs = new_max;\n\n      FT_GlyphLoader_Adjust_Subglyphs( loader );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* prepare loader for the addition of a new glyph on top of the base one */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader )\n  {\n    FT_GlyphLoad  current = &loader->current;\n\n\n    current->outline.n_points   = 0;\n    current->outline.n_contours = 0;\n    current->num_subglyphs      = 0;\n\n    FT_GlyphLoader_Adjust_Points   ( loader );\n    FT_GlyphLoader_Adjust_Subglyphs( loader );\n  }\n\n\n  /* add current glyph to the base image -- and prepare for another */\n  FT_BASE_DEF( void )\n  FT_GlyphLoader_Add( FT_GlyphLoader  loader )\n  {\n    FT_GlyphLoad  base;\n    FT_GlyphLoad  current;\n\n    FT_UInt       n_curr_contours;\n    FT_UInt       n_base_points;\n    FT_UInt       n;\n\n\n    if ( !loader )\n      return;\n\n    base    = &loader->base;\n    current = &loader->current;\n\n    n_curr_contours = current->outline.n_contours;\n    n_base_points   = base->outline.n_points;\n\n    base->outline.n_points =\n      (short)( base->outline.n_points + current->outline.n_points );\n    base->outline.n_contours =\n      (short)( base->outline.n_contours + current->outline.n_contours );\n\n    base->num_subglyphs += current->num_subglyphs;\n\n    /* adjust contours count in newest outline */\n    for ( n = 0; n < n_curr_contours; n++ )\n      current->outline.contours[n] =\n        (short)( current->outline.contours[n] + n_base_points );\n\n    /* prepare for another new glyph image */\n    FT_GlyphLoader_Prepare( loader );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,\n                             FT_GlyphLoader  source )\n  {\n    FT_Error  error;\n    FT_UInt   num_points   = source->base.outline.n_points;\n    FT_UInt   num_contours = source->base.outline.n_contours;\n\n\n    error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours );\n    if ( !error )\n    {\n      FT_Outline*  out = &target->base.outline;\n      FT_Outline*  in  = &source->base.outline;\n\n\n      FT_ARRAY_COPY( out->points, in->points,\n                     num_points );\n      FT_ARRAY_COPY( out->tags, in->tags,\n                     num_points );\n      FT_ARRAY_COPY( out->contours, in->contours,\n                     num_contours );\n\n      /* do we need to copy the extra points? */\n      if ( target->use_extra && source->use_extra )\n      {\n        FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points,\n                       num_points );\n        FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2,\n                       num_points );\n      }\n\n      out->n_points   = (short)num_points;\n      out->n_contours = (short)num_contours;\n\n      FT_GlyphLoader_Adjust_Points( target );\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftglyph.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftglyph.c                                                              */\n/*                                                                         */\n/*    FreeType convenience functions to handle glyphs (body).              */\n/*                                                                         */\n/*  Copyright 1996-2005, 2007, 2008, 2010, 2012, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  This file contains the definition of several convenience functions   */\n  /*  that can be used by client applications to easily retrieve glyph     */\n  /*  bitmaps and outlines from a given face.                              */\n  /*                                                                       */\n  /*  These functions should be optional if you are writing a font server  */\n  /*  or text layout engine on top of FreeType.  However, they are pretty  */\n  /*  handy for many other simple uses of the library.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_GLYPH_H\n#include FT_OUTLINE_H\n#include FT_BITMAP_H\n#include FT_INTERNAL_OBJECTS_H\n\n#include \"basepic.h\"\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_glyph\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   FT_BitmapGlyph support                                        ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_bitmap_glyph_init( FT_Glyph      bitmap_glyph,\n                        FT_GlyphSlot  slot )\n  {\n    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;\n    FT_Error        error   = FT_Err_Ok;\n    FT_Library      library = FT_GLYPH( glyph )->library;\n\n\n    if ( slot->format != FT_GLYPH_FORMAT_BITMAP )\n    {\n      error = FT_THROW( Invalid_Glyph_Format );\n      goto Exit;\n    }\n\n    glyph->left = slot->bitmap_left;\n    glyph->top  = slot->bitmap_top;\n\n    /* do lazy copying whenever possible */\n    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )\n    {\n      glyph->bitmap = slot->bitmap;\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n    else\n    {\n      FT_Bitmap_New( &glyph->bitmap );\n      error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_bitmap_glyph_copy( FT_Glyph  bitmap_source,\n                        FT_Glyph  bitmap_target )\n  {\n    FT_Library      library = bitmap_source->library;\n    FT_BitmapGlyph  source  = (FT_BitmapGlyph)bitmap_source;\n    FT_BitmapGlyph  target  = (FT_BitmapGlyph)bitmap_target;\n\n\n    target->left = source->left;\n    target->top  = source->top;\n\n    return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_bitmap_glyph_done( FT_Glyph  bitmap_glyph )\n  {\n    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;\n    FT_Library      library = FT_GLYPH( glyph )->library;\n\n\n    FT_Bitmap_Done( library, &glyph->bitmap );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_bitmap_glyph_bbox( FT_Glyph  bitmap_glyph,\n                        FT_BBox*  cbox )\n  {\n    FT_BitmapGlyph  glyph = (FT_BitmapGlyph)bitmap_glyph;\n\n\n    cbox->xMin = glyph->left << 6;\n    cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 );\n    cbox->yMax = glyph->top << 6;\n    cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 );\n  }\n\n\n  FT_DEFINE_GLYPH(ft_bitmap_glyph_class,\n    sizeof ( FT_BitmapGlyphRec ),\n    FT_GLYPH_FORMAT_BITMAP,\n\n    ft_bitmap_glyph_init,\n    ft_bitmap_glyph_done,\n    ft_bitmap_glyph_copy,\n    0,                          /* FT_Glyph_TransformFunc */\n    ft_bitmap_glyph_bbox,\n    0                           /* FT_Glyph_PrepareFunc   */\n  )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   FT_OutlineGlyph support                                       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_outline_glyph_init( FT_Glyph      outline_glyph,\n                         FT_GlyphSlot  slot )\n  {\n    FT_OutlineGlyph  glyph   = (FT_OutlineGlyph)outline_glyph;\n    FT_Error         error   = FT_Err_Ok;\n    FT_Library       library = FT_GLYPH( glyph )->library;\n    FT_Outline*      source  = &slot->outline;\n    FT_Outline*      target  = &glyph->outline;\n\n\n    /* check format in glyph slot */\n    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )\n    {\n      error = FT_THROW( Invalid_Glyph_Format );\n      goto Exit;\n    }\n\n    /* allocate new outline */\n    error = FT_Outline_New( library, source->n_points, source->n_contours,\n                            &glyph->outline );\n    if ( error )\n      goto Exit;\n\n    FT_Outline_Copy( source, target );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_outline_glyph_done( FT_Glyph  outline_glyph )\n  {\n    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;\n\n\n    FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_outline_glyph_copy( FT_Glyph  outline_source,\n                         FT_Glyph  outline_target )\n  {\n    FT_OutlineGlyph  source  = (FT_OutlineGlyph)outline_source;\n    FT_OutlineGlyph  target  = (FT_OutlineGlyph)outline_target;\n    FT_Error         error;\n    FT_Library       library = FT_GLYPH( source )->library;\n\n\n    error = FT_Outline_New( library, source->outline.n_points,\n                            source->outline.n_contours, &target->outline );\n    if ( !error )\n      FT_Outline_Copy( &source->outline, &target->outline );\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_outline_glyph_transform( FT_Glyph          outline_glyph,\n                              const FT_Matrix*  matrix,\n                              const FT_Vector*  delta )\n  {\n    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;\n\n\n    if ( matrix )\n      FT_Outline_Transform( &glyph->outline, matrix );\n\n    if ( delta )\n      FT_Outline_Translate( &glyph->outline, delta->x, delta->y );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ft_outline_glyph_bbox( FT_Glyph  outline_glyph,\n                         FT_BBox*  bbox )\n  {\n    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;\n\n\n    FT_Outline_Get_CBox( &glyph->outline, bbox );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ft_outline_glyph_prepare( FT_Glyph      outline_glyph,\n                            FT_GlyphSlot  slot )\n  {\n    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;\n\n\n    slot->format         = FT_GLYPH_FORMAT_OUTLINE;\n    slot->outline        = glyph->outline;\n    slot->outline.flags &= ~FT_OUTLINE_OWNER;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_GLYPH( ft_outline_glyph_class,\n    sizeof ( FT_OutlineGlyphRec ),\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    ft_outline_glyph_init,\n    ft_outline_glyph_done,\n    ft_outline_glyph_copy,\n    ft_outline_glyph_transform,\n    ft_outline_glyph_bbox,\n    ft_outline_glyph_prepare\n  )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   FT_Glyph class and API                                        ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n   static FT_Error\n   ft_new_glyph( FT_Library             library,\n                 const FT_Glyph_Class*  clazz,\n                 FT_Glyph*              aglyph )\n   {\n     FT_Memory  memory = library->memory;\n     FT_Error   error;\n     FT_Glyph   glyph  = NULL;\n\n\n     *aglyph = 0;\n\n     if ( !FT_ALLOC( glyph, clazz->glyph_size ) )\n     {\n       glyph->library = library;\n       glyph->clazz   = clazz;\n       glyph->format  = clazz->glyph_format;\n\n       *aglyph = glyph;\n     }\n\n     return error;\n   }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_Copy( FT_Glyph   source,\n                 FT_Glyph  *target )\n  {\n    FT_Glyph               copy;\n    FT_Error               error;\n    const FT_Glyph_Class*  clazz;\n\n\n    /* check arguments */\n    if ( !target )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    *target = 0;\n\n    if ( !source || !source->clazz )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    clazz = source->clazz;\n    error = ft_new_glyph( source->library, clazz, &copy );\n    if ( error )\n      goto Exit;\n\n    copy->advance = source->advance;\n    copy->format  = source->format;\n\n    if ( clazz->glyph_copy )\n      error = clazz->glyph_copy( source, copy );\n\n    if ( error )\n      FT_Done_Glyph( copy );\n    else\n      *target = copy;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Glyph( FT_GlyphSlot  slot,\n                FT_Glyph     *aglyph )\n  {\n    FT_Library  library;\n    FT_Error    error;\n    FT_Glyph    glyph;\n\n    const FT_Glyph_Class*  clazz = 0;\n\n\n    if ( !slot )\n      return FT_THROW( Invalid_Slot_Handle );\n\n    library = slot->library;\n\n    if ( !aglyph )\n      return FT_THROW( Invalid_Argument );\n\n    /* if it is a bitmap, that's easy :-) */\n    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )\n      clazz = FT_BITMAP_GLYPH_CLASS_GET;\n\n    /* if it is an outline */\n    else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n      clazz = FT_OUTLINE_GLYPH_CLASS_GET;\n\n    else\n    {\n      /* try to find a renderer that supports the glyph image format */\n      FT_Renderer  render = FT_Lookup_Renderer( library, slot->format, 0 );\n\n\n      if ( render )\n        clazz = &render->glyph_class;\n    }\n\n    if ( !clazz )\n    {\n      error = FT_THROW( Invalid_Glyph_Format );\n      goto Exit;\n    }\n\n    /* create FT_Glyph object */\n    error = ft_new_glyph( library, clazz, &glyph );\n    if ( error )\n      goto Exit;\n\n    /* copy advance while converting it to 16.16 format */\n    glyph->advance.x = slot->advance.x << 10;\n    glyph->advance.y = slot->advance.y << 10;\n\n    /* now import the image from the glyph slot */\n    error = clazz->glyph_init( glyph, slot );\n\n    /* if an error occurred, destroy the glyph */\n    if ( error )\n      FT_Done_Glyph( glyph );\n    else\n      *aglyph = glyph;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_Transform( FT_Glyph    glyph,\n                      FT_Matrix*  matrix,\n                      FT_Vector*  delta )\n  {\n    const FT_Glyph_Class*  clazz;\n    FT_Error               error = FT_Err_Ok;\n\n\n    if ( !glyph || !glyph->clazz )\n      error = FT_THROW( Invalid_Argument );\n    else\n    {\n      clazz = glyph->clazz;\n      if ( clazz->glyph_transform )\n      {\n        /* transform glyph image */\n        clazz->glyph_transform( glyph, matrix, delta );\n\n        /* transform advance vector */\n        if ( matrix )\n          FT_Vector_Transform( &glyph->advance, matrix );\n      }\n      else\n        error = FT_THROW( Invalid_Glyph_Format );\n    }\n    return error;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Glyph_Get_CBox( FT_Glyph  glyph,\n                     FT_UInt   bbox_mode,\n                     FT_BBox  *acbox )\n  {\n    const FT_Glyph_Class*  clazz;\n\n\n    if ( !acbox )\n      return;\n\n    acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0;\n\n    if ( !glyph || !glyph->clazz )\n      return;\n    else\n    {\n      clazz = glyph->clazz;\n      if ( !clazz->glyph_bbox )\n        return;\n      else\n      {\n        /* retrieve bbox in 26.6 coordinates */\n        clazz->glyph_bbox( glyph, acbox );\n\n        /* perform grid fitting if needed */\n        if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT ||\n             bbox_mode == FT_GLYPH_BBOX_PIXELS  )\n        {\n          acbox->xMin = FT_PIX_FLOOR( acbox->xMin );\n          acbox->yMin = FT_PIX_FLOOR( acbox->yMin );\n          acbox->xMax = FT_PIX_CEIL( acbox->xMax );\n          acbox->yMax = FT_PIX_CEIL( acbox->yMax );\n        }\n\n        /* convert to integer pixels if needed */\n        if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE ||\n             bbox_mode == FT_GLYPH_BBOX_PIXELS   )\n        {\n          acbox->xMin >>= 6;\n          acbox->yMin >>= 6;\n          acbox->xMax >>= 6;\n          acbox->yMax >>= 6;\n        }\n      }\n    }\n    return;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,\n                      FT_Render_Mode  render_mode,\n                      FT_Vector*      origin,\n                      FT_Bool         destroy )\n  {\n    FT_GlyphSlotRec           dummy;\n    FT_GlyphSlot_InternalRec  dummy_internal;\n    FT_Error                  error = FT_Err_Ok;\n    FT_Glyph                  b, glyph;\n    FT_BitmapGlyph            bitmap = NULL;\n    const FT_Glyph_Class*     clazz;\n\n    /* FT_BITMAP_GLYPH_CLASS_GET derefers `library' in PIC mode */\n    FT_Library                library;\n\n\n    /* check argument */\n    if ( !the_glyph )\n      goto Bad;\n    glyph = *the_glyph;\n    if ( !glyph )\n      goto Bad;\n\n    clazz   = glyph->clazz;\n    library = glyph->library;\n    if ( !library || !clazz )\n      goto Bad;\n\n    /* when called with a bitmap glyph, do nothing and return successfully */\n    if ( clazz == FT_BITMAP_GLYPH_CLASS_GET )\n      goto Exit;\n\n    if ( !clazz->glyph_prepare )\n      goto Bad;\n\n    /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */\n    /* then calling FT_Render_Glyph_Internal()                            */\n\n    FT_MEM_ZERO( &dummy, sizeof ( dummy ) );\n    FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) );\n    dummy.internal = &dummy_internal;\n    dummy.library  = library;\n    dummy.format   = clazz->glyph_format;\n\n    /* create result bitmap glyph */\n    error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, &b );\n    if ( error )\n      goto Exit;\n    bitmap = (FT_BitmapGlyph)b;\n\n#if 1\n    /* if `origin' is set, translate the glyph image */\n    if ( origin )\n      FT_Glyph_Transform( glyph, 0, origin );\n#else\n    FT_UNUSED( origin );\n#endif\n\n    /* prepare dummy slot for rendering */\n    error = clazz->glyph_prepare( glyph, &dummy );\n    if ( !error )\n      error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode );\n\n#if 1\n    if ( !destroy && origin )\n    {\n      FT_Vector  v;\n\n\n      v.x = -origin->x;\n      v.y = -origin->y;\n      FT_Glyph_Transform( glyph, 0, &v );\n    }\n#endif\n\n    if ( error )\n      goto Exit;\n\n    /* in case of success, copy the bitmap to the glyph bitmap */\n    error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy );\n    if ( error )\n      goto Exit;\n\n    /* copy advance */\n    bitmap->root.advance = glyph->advance;\n\n    if ( destroy )\n      FT_Done_Glyph( glyph );\n\n    *the_glyph = FT_GLYPH( bitmap );\n\n  Exit:\n    if ( error && bitmap )\n      FT_Done_Glyph( FT_GLYPH( bitmap ) );\n\n    return error;\n\n  Bad:\n    error = FT_THROW( Invalid_Argument );\n    goto Exit;\n  }\n\n\n  /* documentation is in ftglyph.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Done_Glyph( FT_Glyph  glyph )\n  {\n    if ( glyph )\n    {\n      FT_Memory              memory = glyph->library->memory;\n      const FT_Glyph_Class*  clazz  = glyph->clazz;\n\n\n      if ( clazz->glyph_done )\n        clazz->glyph_done( glyph );\n\n      FT_FREE( glyph );\n    }\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftgxval.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgxval.c                                                              */\n/*                                                                         */\n/*    FreeType API for validating TrueTyepGX/AAT tables (body).            */\n/*                                                                         */\n/*  Copyright 2004-2006, 2010, 2013 by                                     */\n/*  Masatake YAMATO, Redhat K.K,                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_GX_VALIDATE_H\n\n\n  /* documentation is in ftgxval.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_TrueTypeGX_Validate( FT_Face   face,\n                          FT_UInt   validation_flags,\n                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],\n                          FT_UInt   table_length )\n  {\n    FT_Service_GXvalidate  service;\n    FT_Error               error;\n\n\n    if ( !face )\n    {\n      error = FT_THROW( Invalid_Face_Handle );\n      goto Exit;\n    }\n\n    if ( tables == NULL )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE );\n\n    if ( service )\n      error = service->validate( face,\n                                 validation_flags,\n                                 tables,\n                                 table_length );\n    else\n      error = FT_THROW( Unimplemented_Feature );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( void )\n  FT_TrueTypeGX_Free( FT_Face   face,\n                      FT_Bytes  table )\n  {\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = FT_FACE_MEMORY( face );\n\n    FT_FREE( table );\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_ClassicKern_Validate( FT_Face    face,\n                           FT_UInt    validation_flags,\n                           FT_Bytes  *ckern_table )\n  {\n    FT_Service_CKERNvalidate  service;\n    FT_Error                  error;\n\n\n    if ( !face )\n    {\n      error = FT_THROW( Invalid_Face_Handle );\n      goto Exit;\n    }\n\n    if ( ckern_table == NULL )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE );\n\n    if ( service )\n      error = service->validate( face,\n                                 validation_flags,\n                                 ckern_table );\n    else\n      error = FT_THROW( Unimplemented_Feature );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( void )\n  FT_ClassicKern_Free( FT_Face   face,\n                       FT_Bytes  table )\n  {\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = FT_FACE_MEMORY( face );\n\n\n    FT_FREE( table );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftinit.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftinit.c                                                               */\n/*                                                                         */\n/*    FreeType initialization layer (body).                                */\n/*                                                                         */\n/*  Copyright 1996-2002, 2005, 2007, 2009, 2012, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  The purpose of this file is to implement the following two           */\n  /*  functions:                                                           */\n  /*                                                                       */\n  /*  FT_Add_Default_Modules():                                            */\n  /*     This function is used to add the set of default modules to a      */\n  /*     fresh new library object.  The set is taken from the header file  */\n  /*     `freetype/config/ftmodule.h'.  See the document `FreeType 2.0     */\n  /*     Build System' for more information.                               */\n  /*                                                                       */\n  /*  FT_Init_FreeType():                                                  */\n  /*     This function creates a system object for the current platform,   */\n  /*     builds a library out of it, then calls FT_Default_Drivers().      */\n  /*                                                                       */\n  /*  Note that even if FT_Init_FreeType() uses the implementation of the  */\n  /*  system object defined at build time, client applications are still   */\n  /*  able to provide their own `ftsystem.c'.                              */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_MODULE_H\n#include \"basepic.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_init\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n\n#undef  FT_USE_MODULE\n#ifdef __cplusplus\n#define FT_USE_MODULE( type, x )  extern \"C\" const type  x;\n#else\n#define FT_USE_MODULE( type, x )  extern const type  x;\n#endif\n\n#include FT_CONFIG_MODULES_H\n\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )  (const FT_Module_Class*)&(x),\n\n  static\n  const FT_Module_Class*  const ft_default_modules[] =\n  {\n#include FT_CONFIG_MODULES_H\n    0\n  };\n\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n\n#ifdef __cplusplus\n#define FT_EXTERNC  extern \"C\"\n#else\n#define FT_EXTERNC  extern\n#endif\n\n  /* declare the module's class creation/destruction functions */\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )                            \\\n  FT_EXTERNC FT_Error                                       \\\n  FT_Create_Class_ ## x( FT_Library         library,        \\\n                         FT_Module_Class*  *output_class ); \\\n  FT_EXTERNC void                                           \\\n  FT_Destroy_Class_ ## x( FT_Library        library,        \\\n                          FT_Module_Class*  clazz );\n\n#include FT_CONFIG_MODULES_H\n\n  /* count all module classes */\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )  MODULE_CLASS_ ## x,\n\n  enum\n  {\n#include FT_CONFIG_MODULES_H\n    FT_NUM_MODULE_CLASSES\n  };\n\n  /* destroy all module classes */\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )                   \\\n  if ( classes[i] )                                \\\n  {                                                \\\n    FT_Destroy_Class_ ## x( library, classes[i] ); \\\n  }                                                \\\n  i++;\n\n\n  FT_BASE_DEF( void )\n  ft_destroy_default_module_classes( FT_Library  library )\n  {\n    FT_Module_Class*  *classes;\n    FT_Memory          memory;\n    FT_UInt            i;\n    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;\n\n\n    if ( !pic_container->default_module_classes )\n      return;\n\n    memory  = library->memory;\n    classes = pic_container->default_module_classes;\n    i       = 0;\n\n#include FT_CONFIG_MODULES_H\n\n    FT_FREE( classes );\n    pic_container->default_module_classes = 0;\n  }\n\n\n  /* initialize all module classes and the pointer table */\n#undef  FT_USE_MODULE\n#define FT_USE_MODULE( type, x )                     \\\n  error = FT_Create_Class_ ## x( library, &clazz );  \\\n  if ( error )                                       \\\n    goto Exit;                                       \\\n  classes[i++] = clazz;\n\n\n  FT_BASE_DEF( FT_Error )\n  ft_create_default_module_classes( FT_Library  library )\n  {\n    FT_Error           error;\n    FT_Memory          memory;\n    FT_Module_Class*  *classes = NULL;\n    FT_Module_Class*   clazz;\n    FT_UInt            i;\n    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;\n\n\n    memory = library->memory;\n\n    pic_container->default_module_classes = 0;\n\n    if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) *\n                              ( FT_NUM_MODULE_CLASSES + 1 ) ) )\n      return error;\n\n    /* initialize all pointers to 0, especially the last one */\n    for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ )\n      classes[i] = 0;\n    classes[FT_NUM_MODULE_CLASSES] = 0;\n\n    i = 0;\n\n#include FT_CONFIG_MODULES_H\n\n  Exit:\n    if ( error )\n      ft_destroy_default_module_classes( library );\n    else\n      pic_container->default_module_classes = classes;\n\n    return error;\n  }\n\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Add_Default_Modules( FT_Library  library )\n  {\n    FT_Error                       error;\n    const FT_Module_Class* const*  cur;\n\n\n    /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    if ( !library )\n      return;\n#endif\n\n    /* GCC 4.6 warns the type difference:\n     *   FT_Module_Class** != const FT_Module_Class* const*\n     */\n    cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;\n\n    /* test for valid `library' delayed to FT_Add_Module() */\n    while ( *cur )\n    {\n      error = FT_Add_Module( library, *cur );\n      /* notify errors, but don't stop */\n      if ( error )\n        FT_TRACE0(( \"FT_Add_Default_Module:\"\n                    \" Cannot install `%s', error = 0x%x\\n\",\n                    (*cur)->module_name, error ));\n      cur++;\n    }\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Init_FreeType( FT_Library  *alibrary )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n\n\n    /* First of all, allocate a new system object -- this function is part */\n    /* of the system-specific component, i.e. `ftsystem.c'.                */\n\n    memory = FT_New_Memory();\n    if ( !memory )\n    {\n      FT_ERROR(( \"FT_Init_FreeType: cannot find memory manager\\n\" ));\n      return FT_THROW( Unimplemented_Feature );\n    }\n\n    /* build a library out of it, then fill it with the set of */\n    /* default drivers.                                        */\n\n    error = FT_New_Library( memory, alibrary );\n    if ( error )\n      FT_Done_Memory( memory );\n    else\n      FT_Add_Default_Modules( *alibrary );\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Done_FreeType( FT_Library  library )\n  {\n    if ( library )\n    {\n      FT_Memory  memory = library->memory;\n\n\n      /* Discard the library object */\n      FT_Done_Library( library );\n\n      /* discard memory manager */\n      FT_Done_Memory( memory );\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftlcdfil.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlcdfil.c                                                             */\n/*                                                                         */\n/*    FreeType API for color filtering of subpixel bitmap glyphs (body).   */\n/*                                                                         */\n/*  Copyright 2006, 2008-2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_LCD_FILTER_H\n#include FT_IMAGE_H\n#include FT_INTERNAL_OBJECTS_H\n\n\n#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n\n/* define USE_LEGACY to implement the legacy filter */\n#define  USE_LEGACY\n\n  /* FIR filter used by the default and light filters */\n  static void\n  _ft_lcd_filter_fir( FT_Bitmap*      bitmap,\n                      FT_Render_Mode  mode,\n                      FT_Library      library )\n  {\n    FT_Byte*  weights = library->lcd_weights;\n    FT_UInt   width   = (FT_UInt)bitmap->width;\n    FT_UInt   height  = (FT_UInt)bitmap->rows;\n\n\n    /* horizontal in-place FIR filter */\n    if ( mode == FT_RENDER_MODE_LCD && width >= 4 )\n    {\n      FT_Byte*  line = bitmap->buffer;\n\n\n      for ( ; height > 0; height--, line += bitmap->pitch )\n      {\n        FT_UInt  fir[5];\n        FT_UInt  val1, xx;\n\n\n        val1   = line[0];\n        fir[0] = weights[2] * val1;\n        fir[1] = weights[3] * val1;\n        fir[2] = weights[4] * val1;\n        fir[3] = 0;\n        fir[4] = 0;\n\n        val1    = line[1];\n        fir[0] += weights[1] * val1;\n        fir[1] += weights[2] * val1;\n        fir[2] += weights[3] * val1;\n        fir[3] += weights[4] * val1;\n\n        for ( xx = 2; xx < width; xx++ )\n        {\n          FT_UInt  val, pix;\n\n\n          val    = line[xx];\n          pix    = fir[0] + weights[0] * val;\n          fir[0] = fir[1] + weights[1] * val;\n          fir[1] = fir[2] + weights[2] * val;\n          fir[2] = fir[3] + weights[3] * val;\n          fir[3] =          weights[4] * val;\n\n          pix        >>= 8;\n          pix         |= -( pix >> 8 );\n          line[xx - 2] = (FT_Byte)pix;\n        }\n\n        {\n          FT_UInt  pix;\n\n\n          pix          = fir[0] >> 8;\n          pix         |= -( pix >> 8 );\n          line[xx - 2] = (FT_Byte)pix;\n\n          pix          = fir[1] >> 8;\n          pix         |= -( pix >> 8 );\n          line[xx - 1] = (FT_Byte)pix;\n        }\n      }\n    }\n\n    /* vertical in-place FIR filter */\n    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 )\n    {\n      FT_Byte*  column = bitmap->buffer;\n      FT_Int    pitch  = bitmap->pitch;\n\n\n      for ( ; width > 0; width--, column++ )\n      {\n        FT_Byte*  col = column;\n        FT_UInt   fir[5];\n        FT_UInt   val1, yy;\n\n\n        val1   = col[0];\n        fir[0] = weights[2] * val1;\n        fir[1] = weights[3] * val1;\n        fir[2] = weights[4] * val1;\n        fir[3] = 0;\n        fir[4] = 0;\n        col   += pitch;\n\n        val1    = col[0];\n        fir[0] += weights[1] * val1;\n        fir[1] += weights[2] * val1;\n        fir[2] += weights[3] * val1;\n        fir[3] += weights[4] * val1;\n        col    += pitch;\n\n        for ( yy = 2; yy < height; yy++ )\n        {\n          FT_UInt  val, pix;\n\n\n          val    = col[0];\n          pix    = fir[0] + weights[0] * val;\n          fir[0] = fir[1] + weights[1] * val;\n          fir[1] = fir[2] + weights[2] * val;\n          fir[2] = fir[3] + weights[3] * val;\n          fir[3] =          weights[4] * val;\n\n          pix           >>= 8;\n          pix            |= -( pix >> 8 );\n          col[-2 * pitch] = (FT_Byte)pix;\n          col            += pitch;\n        }\n\n        {\n          FT_UInt  pix;\n\n\n          pix             = fir[0] >> 8;\n          pix            |= -( pix >> 8 );\n          col[-2 * pitch] = (FT_Byte)pix;\n\n          pix         = fir[1] >> 8;\n          pix        |= -( pix >> 8 );\n          col[-pitch] = (FT_Byte)pix;\n        }\n      }\n    }\n  }\n\n\n#ifdef USE_LEGACY\n\n  /* intra-pixel filter used by the legacy filter */\n  static void\n  _ft_lcd_filter_legacy( FT_Bitmap*      bitmap,\n                         FT_Render_Mode  mode,\n                         FT_Library      library )\n  {\n    FT_UInt  width  = (FT_UInt)bitmap->width;\n    FT_UInt  height = (FT_UInt)bitmap->rows;\n    FT_Int   pitch  = bitmap->pitch;\n\n    static const int  filters[3][3] =\n    {\n      { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },\n      { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },\n      { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }\n    };\n\n    FT_UNUSED( library );\n\n\n    /* horizontal in-place intra-pixel filter */\n    if ( mode == FT_RENDER_MODE_LCD && width >= 3 )\n    {\n      FT_Byte*  line = bitmap->buffer;\n\n\n      for ( ; height > 0; height--, line += pitch )\n      {\n        FT_UInt  xx;\n\n\n        for ( xx = 0; xx < width; xx += 3 )\n        {\n          FT_UInt  r = 0;\n          FT_UInt  g = 0;\n          FT_UInt  b = 0;\n          FT_UInt  p;\n\n\n          p  = line[xx];\n          r += filters[0][0] * p;\n          g += filters[0][1] * p;\n          b += filters[0][2] * p;\n\n          p  = line[xx + 1];\n          r += filters[1][0] * p;\n          g += filters[1][1] * p;\n          b += filters[1][2] * p;\n\n          p  = line[xx + 2];\n          r += filters[2][0] * p;\n          g += filters[2][1] * p;\n          b += filters[2][2] * p;\n\n          line[xx]     = (FT_Byte)( r / 65536 );\n          line[xx + 1] = (FT_Byte)( g / 65536 );\n          line[xx + 2] = (FT_Byte)( b / 65536 );\n        }\n      }\n    }\n    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )\n    {\n      FT_Byte*  column = bitmap->buffer;\n\n\n      for ( ; width > 0; width--, column++ )\n      {\n        FT_Byte*  col     = column;\n        FT_Byte*  col_end = col + height * pitch;\n\n\n        for ( ; col < col_end; col += 3 * pitch )\n        {\n          FT_UInt  r = 0;\n          FT_UInt  g = 0;\n          FT_UInt  b = 0;\n          FT_UInt  p;\n\n\n          p  = col[0];\n          r += filters[0][0] * p;\n          g += filters[0][1] * p;\n          b += filters[0][2] * p;\n\n          p  = col[pitch];\n          r += filters[1][0] * p;\n          g += filters[1][1] * p;\n          b += filters[1][2] * p;\n\n          p  = col[pitch * 2];\n          r += filters[2][0] * p;\n          g += filters[2][1] * p;\n          b += filters[2][2] * p;\n\n          col[0]         = (FT_Byte)( r / 65536 );\n          col[pitch]     = (FT_Byte)( g / 65536 );\n          col[2 * pitch] = (FT_Byte)( b / 65536 );\n        }\n      }\n    }\n  }\n\n#endif /* USE_LEGACY */\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Library_SetLcdFilterWeights( FT_Library      library,\n                                  unsigned char  *weights )\n  {\n    if ( !library || !weights )\n      return FT_THROW( Invalid_Argument );\n\n    ft_memcpy( library->lcd_weights, weights, 5 );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Library_SetLcdFilter( FT_Library    library,\n                           FT_LcdFilter  filter )\n  {\n    static const FT_Byte  light_filter[5] =\n                            { 0x00, 0x55, 0x56, 0x55, 0x00 };\n    /* the values here sum up to a value larger than 256, */\n    /* providing a cheap gamma correction                 */\n    static const FT_Byte  default_filter[5] =\n                            { 0x10, 0x40, 0x70, 0x40, 0x10 };\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Argument );\n\n    switch ( filter )\n    {\n    case FT_LCD_FILTER_NONE:\n      library->lcd_filter_func = NULL;\n      library->lcd_extra       = 0;\n      break;\n\n    case FT_LCD_FILTER_DEFAULT:\n#if defined( FT_FORCE_LEGACY_LCD_FILTER )\n\n      library->lcd_filter_func = _ft_lcd_filter_legacy;\n      library->lcd_extra       = 0;\n\n#elif defined( FT_FORCE_LIGHT_LCD_FILTER )\n\n      ft_memcpy( library->lcd_weights, light_filter, 5 );\n      library->lcd_filter_func = _ft_lcd_filter_fir;\n      library->lcd_extra       = 2;\n\n#else\n\n      ft_memcpy( library->lcd_weights, default_filter, 5 );\n      library->lcd_filter_func = _ft_lcd_filter_fir;\n      library->lcd_extra       = 2;\n\n#endif\n\n      break;\n\n    case FT_LCD_FILTER_LIGHT:\n      ft_memcpy( library->lcd_weights, light_filter, 5 );\n      library->lcd_filter_func = _ft_lcd_filter_fir;\n      library->lcd_extra       = 2;\n      break;\n\n#ifdef USE_LEGACY\n\n    case FT_LCD_FILTER_LEGACY:\n      library->lcd_filter_func = _ft_lcd_filter_legacy;\n      library->lcd_extra       = 0;\n      break;\n\n#endif\n\n    default:\n      return FT_THROW( Invalid_Argument );\n    }\n\n    library->lcd_filter = filter;\n\n    return FT_Err_Ok;\n  }\n\n#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Library_SetLcdFilterWeights( FT_Library      library,\n                                  unsigned char  *weights )\n  {\n    FT_UNUSED( library );\n    FT_UNUSED( weights );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Library_SetLcdFilter( FT_Library    library,\n                           FT_LcdFilter  filter )\n  {\n    FT_UNUSED( library );\n    FT_UNUSED( filter );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftmac.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmac.c                                                                */\n/*                                                                         */\n/*    Mac FOND support.  Written by just@letterror.com.                    */\n/*  Heavily modified by mpsuzuki, George Williams, and Sean McBride.       */\n/*                                                                         */\n/*  This file is for Mac OS X only; see builds/mac/ftoldmac.c for          */\n/*  classic platforms built by MPW.                                        */\n/*                                                                         */\n/*  Copyright 1996-2009, 2013 by                                           */\n/*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*\n    Notes\n\n    Mac suitcase files can (and often do!) contain multiple fonts.  To\n    support this I use the face_index argument of FT_(Open|New)_Face()\n    functions, and pretend the suitcase file is a collection.\n\n    Warning: fbit and NFNT bitmap resources are not supported yet.  In old\n    sfnt fonts, bitmap glyph data for each size is stored in each `NFNT'\n    resources instead of the `bdat' table in the sfnt resource.  Therefore,\n    face->num_fixed_sizes is set to 0, because bitmap data in `NFNT'\n    resource is unavailable at present.\n\n    The Mac FOND support works roughly like this:\n\n    - Check whether the offered stream points to a Mac suitcase file.  This\n      is done by checking the file type: it has to be 'FFIL' or 'tfil'.  The\n      stream that gets passed to our init_face() routine is a stdio stream,\n      which isn't usable for us, since the FOND resources live in the\n      resource fork.  So we just grab the stream->pathname field.\n\n    - Read the FOND resource into memory, then check whether there is a\n      TrueType font and/or(!) a Type 1 font available.\n\n    - If there is a Type 1 font available (as a separate `LWFN' file), read\n      its data into memory, massage it slightly so it becomes PFB data, wrap\n      it into a memory stream, load the Type 1 driver and delegate the rest\n      of the work to it by calling FT_Open_Face().  (XXX TODO: after this\n      has been done, the kerning data from the FOND resource should be\n      appended to the face: On the Mac there are usually no AFM files\n      available.  However, this is tricky since we need to map Mac char\n      codes to ps glyph names to glyph ID's...)\n\n    - If there is a TrueType font (an `sfnt' resource), read it into memory,\n      wrap it into a memory stream, load the TrueType driver and delegate\n      the rest of the work to it, by calling FT_Open_Face().\n\n    - Some suitcase fonts (notably Onyx) might point the `LWFN' file to\n      itself, even though it doesn't contains `POST' resources.  To handle\n      this special case without opening the file an extra time, we just\n      ignore errors from the `LWFN' and fallback to the `sfnt' if both are\n      available.\n  */\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_INTERNAL_STREAM_H\n#include \"ftbase.h\"\n\n  /* This is for Mac OS X.  Without redefinition, OS_INLINE */\n  /* expands to `static inline' which doesn't survive the   */\n  /* -ansi compilation flag of GCC.                         */\n#if !HAVE_ANSI_OS_INLINE\n#undef  OS_INLINE\n#define OS_INLINE  static __inline__\n#endif\n\n  /* `configure' checks the availability of `ResourceIndex' strictly */\n  /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always.  If it is      */\n  /* not set (e.g., a build without `configure'), the availability   */\n  /* is guessed from the SDK version.                                */\n#ifndef HAVE_TYPE_RESOURCE_INDEX\n#if !defined( MAC_OS_X_VERSION_10_5 ) || \\\n    ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 )\n#define HAVE_TYPE_RESOURCE_INDEX 0\n#else\n#define HAVE_TYPE_RESOURCE_INDEX 1\n#endif\n#endif /* !HAVE_TYPE_RESOURCE_INDEX */\n\n#if ( HAVE_TYPE_RESOURCE_INDEX == 0 )\n  typedef short  ResourceIndex;\n#endif\n\n#include <CoreServices/CoreServices.h>\n#include <ApplicationServices/ApplicationServices.h>\n#include <sys/syslimits.h> /* PATH_MAX */\n\n  /* Don't want warnings about our own use of deprecated functions. */\n#define FT_DEPRECATED_ATTRIBUTE\n\n#include FT_MAC_H\n\n#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */\n#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault\n#endif\n\n\n  /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over\n     TrueType in case *both* are available (this is not common,\n     but it *is* possible). */\n#ifndef PREFER_LWFN\n#define PREFER_LWFN  1\n#endif\n\n\n#ifdef FT_MACINTOSH\n\n  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */\n  FT_EXPORT_DEF( FT_Error )\n  FT_GetFile_From_Mac_Name( const char*  fontName,\n                            FSSpec*      pathSpec,\n                            FT_Long*     face_index )\n  {\n    FT_UNUSED( fontName );\n    FT_UNUSED( pathSpec );\n    FT_UNUSED( face_index );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n  /* Private function.                                         */\n  /* The FSSpec type has been discouraged for a long time,     */\n  /* unfortunately an FSRef replacement API for                */\n  /* ATSFontGetFileSpecification() is only available in        */\n  /* Mac OS X 10.5 and later.                                  */\n  static OSStatus\n  FT_ATSFontGetFileReference( ATSFontRef  ats_font_id,\n                              FSRef*      ats_font_ref )\n  {\n#if defined( MAC_OS_X_VERSION_10_5 ) && \\\n    ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 )\n\n    OSStatus  err;\n\n    err = ATSFontGetFileReference( ats_font_id, ats_font_ref );\n\n    return err;\n#elif __LP64__ /* No 64bit Carbon API on legacy platforms */\n    FT_UNUSED( ats_font_id );\n    FT_UNUSED( ats_font_ref );\n\n\n    return fnfErr;\n#else /* 32bit Carbon API on legacy platforms */\n    OSStatus  err;\n    FSSpec    spec;\n\n\n    err = ATSFontGetFileSpecification( ats_font_id, &spec );\n    if ( noErr == err )\n      err = FSpMakeFSRef( &spec, ats_font_ref );\n\n    return err;\n#endif\n  }\n\n\n  static FT_Error\n  FT_GetFileRef_From_Mac_ATS_Name( const char*  fontName,\n                                   FSRef*       ats_font_ref,\n                                   FT_Long*     face_index )\n  {\n    CFStringRef  cf_fontName;\n    ATSFontRef   ats_font_id;\n\n\n    *face_index = 0;\n\n    cf_fontName = CFStringCreateWithCString( NULL, fontName,\n                                             kCFStringEncodingMacRoman );\n    ats_font_id = ATSFontFindFromName( cf_fontName,\n                                       kATSOptionFlagsUnRestrictedScope );\n    CFRelease( cf_fontName );\n\n    if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL )\n      return FT_THROW( Unknown_File_Format );\n\n    if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) )\n      return FT_THROW( Unknown_File_Format );\n\n    /* face_index calculation by searching preceding fontIDs */\n    /* with same FSRef                                       */\n    {\n      ATSFontRef  id2 = ats_font_id - 1;\n      FSRef       ref2;\n\n\n      while ( id2 > 0 )\n      {\n        if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) )\n          break;\n        if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) )\n          break;\n\n        id2 --;\n      }\n      *face_index = ats_font_id - ( id2 + 1 );\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,\n                                    UInt8*       path,\n                                    UInt32       maxPathSize,\n                                    FT_Long*     face_index )\n  {\n    FSRef     ref;\n    FT_Error  err;\n\n\n    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );\n    if ( err )\n      return err;\n\n    if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) )\n      return FT_THROW( Unknown_File_Format );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */\n  FT_EXPORT_DEF( FT_Error )\n  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,\n                                FSSpec*      pathSpec,\n                                FT_Long*     face_index )\n  {\n#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \\\n      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )\n    FT_UNUSED( fontName );\n    FT_UNUSED( pathSpec );\n    FT_UNUSED( face_index );\n\n    return FT_THROW( Unimplemented_Feature );\n#else\n    FSRef     ref;\n    FT_Error  err;\n\n\n    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );\n    if ( err )\n      return err;\n\n    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL,\n                                    pathSpec, NULL ) )\n      return FT_THROW( Unknown_File_Format );\n\n    return FT_Err_Ok;\n#endif\n  }\n\n\n  static OSErr\n  FT_FSPathMakeRes( const UInt8*    pathname,\n                    ResFileRefNum*  res )\n  {\n    OSErr  err;\n    FSRef  ref;\n\n\n    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    /* at present, no support for dfont format */\n    err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res );\n    if ( noErr == err )\n      return err;\n\n    /* fallback to original resource-fork font */\n    *res = FSOpenResFile( &ref, fsRdPerm );\n    err  = ResError();\n\n    return err;\n  }\n\n\n  /* Return the file type for given pathname */\n  static OSType\n  get_file_type_from_path( const UInt8*  pathname )\n  {\n    FSRef          ref;\n    FSCatalogInfo  info;\n\n\n    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )\n      return ( OSType ) 0;\n\n    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info,\n                                    NULL, NULL, NULL ) )\n      return ( OSType ) 0;\n\n    return ((FInfo *)(info.finderInfo))->fdType;\n  }\n\n\n  /* Given a PostScript font name, create the Macintosh LWFN file name. */\n  static void\n  create_lwfn_name( char*   ps_name,\n                    Str255  lwfn_file_name )\n  {\n    int       max = 5, count = 0;\n    FT_Byte*  p = lwfn_file_name;\n    FT_Byte*  q = (FT_Byte*)ps_name;\n\n\n    lwfn_file_name[0] = 0;\n\n    while ( *q )\n    {\n      if ( ft_isupper( *q ) )\n      {\n        if ( count )\n          max = 3;\n        count = 0;\n      }\n      if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) )\n      {\n        *++p = *q;\n        lwfn_file_name[0]++;\n        count++;\n      }\n      q++;\n    }\n  }\n\n\n  static short\n  count_faces_sfnt( char*  fond_data )\n  {\n    /* The count is 1 greater than the value in the FOND.  */\n    /* Isn't that cute? :-)                                */\n\n    return EndianS16_BtoN( *( (short*)( fond_data +\n                                        sizeof ( FamRec ) ) ) ) + 1;\n  }\n\n\n  static short\n  count_faces_scalable( char*  fond_data )\n  {\n    AsscEntry*  assoc;\n    FamRec*     fond;\n    short       i, face, face_all;\n\n\n    fond     = (FamRec*)fond_data;\n    face_all = EndianS16_BtoN( *( (short *)( fond_data +\n                                             sizeof ( FamRec ) ) ) ) + 1;\n    assoc    = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );\n    face     = 0;\n\n    for ( i = 0; i < face_all; i++ )\n    {\n      if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) )\n        face++;\n    }\n    return face;\n  }\n\n\n  /* Look inside the FOND data, answer whether there should be an SFNT\n     resource, and answer the name of a possible LWFN Type 1 file.\n\n     Thanks to Paul Miller (paulm@profoundeffects.com) for the fix\n     to load a face OTHER than the first one in the FOND!\n  */\n\n\n  static void\n  parse_fond( char*   fond_data,\n              short*  have_sfnt,\n              ResID*  sfnt_id,\n              Str255  lwfn_file_name,\n              short   face_index )\n  {\n    AsscEntry*  assoc;\n    AsscEntry*  base_assoc;\n    FamRec*     fond;\n\n\n    *sfnt_id          = 0;\n    *have_sfnt        = 0;\n    lwfn_file_name[0] = 0;\n\n    fond       = (FamRec*)fond_data;\n    assoc      = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );\n    base_assoc = assoc;\n\n    /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */\n    if ( 47 < face_index )\n      return;\n\n    /* Let's do a little range checking before we get too excited here */\n    if ( face_index < count_faces_sfnt( fond_data ) )\n    {\n      assoc += face_index;        /* add on the face_index! */\n\n      /* if the face at this index is not scalable,\n         fall back to the first one (old behavior) */\n      if ( EndianS16_BtoN( assoc->fontSize ) == 0 )\n      {\n        *have_sfnt = 1;\n        *sfnt_id   = EndianS16_BtoN( assoc->fontID );\n      }\n      else if ( base_assoc->fontSize == 0 )\n      {\n        *have_sfnt = 1;\n        *sfnt_id   = EndianS16_BtoN( base_assoc->fontID );\n      }\n    }\n\n    if ( EndianS32_BtoN( fond->ffStylOff ) )\n    {\n      unsigned char*  p = (unsigned char*)fond_data;\n      StyleTable*     style;\n      unsigned short  string_count;\n      char            ps_name[256];\n      unsigned char*  names[64];\n      int             i;\n\n\n      p += EndianS32_BtoN( fond->ffStylOff );\n      style = (StyleTable*)p;\n      p += sizeof ( StyleTable );\n      string_count = EndianS16_BtoN( *(short*)(p) );\n      p += sizeof ( short );\n\n      for ( i = 0; i < string_count && i < 64; i++ )\n      {\n        names[i] = p;\n        p       += names[i][0];\n        p++;\n      }\n\n      {\n        size_t  ps_name_len = (size_t)names[0][0];\n\n\n        if ( ps_name_len != 0 )\n        {\n          ft_memcpy(ps_name, names[0] + 1, ps_name_len);\n          ps_name[ps_name_len] = 0;\n        }\n        if ( style->indexes[face_index] > 1 &&\n             style->indexes[face_index] <= FT_MIN( string_count, 64 ) )\n        {\n          unsigned char*  suffixes = names[style->indexes[face_index] - 1];\n\n\n          for ( i = 1; i <= suffixes[0]; i++ )\n          {\n            unsigned char*  s;\n            size_t          j = suffixes[i] - 1;\n\n\n            if ( j < string_count && ( s = names[j] ) != NULL )\n            {\n              size_t  s_len = (size_t)s[0];\n\n\n              if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )\n              {\n                ft_memcpy( ps_name + ps_name_len, s + 1, s_len );\n                ps_name_len += s_len;\n                ps_name[ps_name_len] = 0;\n              }\n            }\n          }\n        }\n      }\n\n      create_lwfn_name( ps_name, lwfn_file_name );\n    }\n  }\n\n\n  static  FT_Error\n  lookup_lwfn_by_fond( const UInt8*      path_fond,\n                       ConstStr255Param  base_lwfn,\n                       UInt8*            path_lwfn,\n                       size_t            path_size )\n  {\n    FSRef   ref, par_ref;\n    size_t  dirname_len;\n\n\n    /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */\n    /* We should not extract parent directory by string manipulation.      */\n\n    if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) )\n      return FT_THROW( Invalid_Argument );\n\n    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,\n                                    NULL, NULL, NULL, &par_ref ) )\n      return FT_THROW( Invalid_Argument );\n\n    if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) )\n      return FT_THROW( Invalid_Argument );\n\n    if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size )\n      return FT_THROW( Invalid_Argument );\n\n    /* now we have absolute dirname in path_lwfn */\n    ft_strcat( (char *)path_lwfn, \"/\" );\n    dirname_len = ft_strlen( (char *)path_lwfn );\n    ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 );\n    path_lwfn[dirname_len + base_lwfn[0]] = '\\0';\n\n    if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,\n                                    NULL, NULL, NULL, NULL ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    return FT_Err_Ok;\n  }\n\n\n  static short\n  count_faces( Handle        fond,\n               const UInt8*  pathname )\n  {\n    ResID     sfnt_id;\n    short     have_sfnt, have_lwfn;\n    Str255    lwfn_file_name;\n    UInt8     buff[PATH_MAX];\n    FT_Error  err;\n    short     num_faces;\n\n\n    have_sfnt = have_lwfn = 0;\n\n    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 );\n\n    if ( lwfn_file_name[0] )\n    {\n      err = lookup_lwfn_by_fond( pathname, lwfn_file_name,\n                                 buff, sizeof ( buff )  );\n      if ( !err )\n        have_lwfn = 1;\n    }\n\n    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )\n      num_faces = 1;\n    else\n      num_faces = count_faces_scalable( *fond );\n\n    return num_faces;\n  }\n\n\n  /* Read Type 1 data from the POST resources inside the LWFN file,\n     return a PFB buffer.  This is somewhat convoluted because the FT2\n     PFB parser wants the ASCII header as one chunk, and the LWFN\n     chunks are often not organized that way, so we glue chunks\n     of the same type together. */\n  static FT_Error\n  read_lwfn( FT_Memory      memory,\n             ResFileRefNum  res,\n             FT_Byte**      pfb_data,\n             FT_ULong*      size )\n  {\n    FT_Error       error = FT_Err_Ok;\n    ResID          res_id;\n    unsigned char  *buffer, *p, *size_p = NULL;\n    FT_ULong       total_size = 0;\n    FT_ULong       old_total_size = 0;\n    FT_ULong       post_size, pfb_chunk_size;\n    Handle         post_data;\n    char           code, last_code;\n\n\n    UseResFile( res );\n\n    /* First pass: load all POST resources, and determine the size of */\n    /* the output buffer.                                             */\n    res_id    = 501;\n    last_code = -1;\n\n    for (;;)\n    {\n      post_data = Get1Resource( TTAG_POST, res_id++ );\n      if ( post_data == NULL )\n        break;  /* we are done */\n\n      code = (*post_data)[0];\n\n      if ( code != last_code )\n      {\n        if ( code == 5 )\n          total_size += 2; /* just the end code */\n        else\n          total_size += 6; /* code + 4 bytes chunk length */\n      }\n\n      total_size += GetHandleSize( post_data ) - 2;\n      last_code = code;\n\n      /* detect integer overflows */\n      if ( total_size < old_total_size )\n      {\n        error = FT_THROW( Array_Too_Large );\n        goto Error;\n      }\n\n      old_total_size = total_size;\n    }\n\n    if ( FT_ALLOC( buffer, (FT_Long)total_size ) )\n      goto Error;\n\n    /* Second pass: append all POST data to the buffer, add PFB fields. */\n    /* Glue all consecutive chunks of the same type together.           */\n    p              = buffer;\n    res_id         = 501;\n    last_code      = -1;\n    pfb_chunk_size = 0;\n\n    for (;;)\n    {\n      post_data = Get1Resource( TTAG_POST, res_id++ );\n      if ( post_data == NULL )\n        break;  /* we are done */\n\n      post_size = (FT_ULong)GetHandleSize( post_data ) - 2;\n      code = (*post_data)[0];\n\n      if ( code != last_code )\n      {\n        if ( last_code != -1 )\n        {\n          /* we are done adding a chunk, fill in the size field */\n          if ( size_p != NULL )\n          {\n            *size_p++ = (FT_Byte)(   pfb_chunk_size         & 0xFF );\n            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8  ) & 0xFF );\n            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );\n            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );\n          }\n          pfb_chunk_size = 0;\n        }\n\n        *p++ = 0x80;\n        if ( code == 5 )\n          *p++ = 0x03;  /* the end */\n        else if ( code == 2 )\n          *p++ = 0x02;  /* binary segment */\n        else\n          *p++ = 0x01;  /* ASCII segment */\n\n        if ( code != 5 )\n        {\n          size_p = p;   /* save for later */\n          p += 4;       /* make space for size field */\n        }\n      }\n\n      ft_memcpy( p, *post_data + 2, post_size );\n      pfb_chunk_size += post_size;\n      p += post_size;\n      last_code = code;\n    }\n\n    *pfb_data = buffer;\n    *size = total_size;\n\n  Error:\n    CloseResFile( res );\n    return error;\n  }\n\n\n  /* Create a new FT_Face from a file path to an LWFN file. */\n  static FT_Error\n  FT_New_Face_From_LWFN( FT_Library    library,\n                         const UInt8*  pathname,\n                         FT_Long       face_index,\n                         FT_Face*      aface )\n  {\n    FT_Byte*       pfb_data;\n    FT_ULong       pfb_size;\n    FT_Error       error;\n    ResFileRefNum  res;\n\n\n    if ( noErr != FT_FSPathMakeRes( pathname, &res ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    pfb_data = NULL;\n    pfb_size = 0;\n    error = read_lwfn( library->memory, res, &pfb_data, &pfb_size );\n    CloseResFile( res ); /* PFB is already loaded, useless anymore */\n    if ( error )\n      return error;\n\n    return open_face_from_buffer( library,\n                                  pfb_data,\n                                  pfb_size,\n                                  face_index,\n                                  \"type1\",\n                                  aface );\n  }\n\n\n  /* Create a new FT_Face from an SFNT resource, specified by res ID. */\n  static FT_Error\n  FT_New_Face_From_SFNT( FT_Library  library,\n                         ResID       sfnt_id,\n                         FT_Long     face_index,\n                         FT_Face*    aface )\n  {\n    Handle     sfnt = NULL;\n    FT_Byte*   sfnt_data;\n    size_t     sfnt_size;\n    FT_Error   error  = FT_Err_Ok;\n    FT_Memory  memory = library->memory;\n    int        is_cff, is_sfnt_ps;\n\n\n    sfnt = GetResource( TTAG_sfnt, sfnt_id );\n    if ( sfnt == NULL )\n      return FT_THROW( Invalid_Handle );\n\n    sfnt_size = (FT_ULong)GetHandleSize( sfnt );\n    if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) )\n    {\n      ReleaseResource( sfnt );\n      return error;\n    }\n\n    ft_memcpy( sfnt_data, *sfnt, sfnt_size );\n    ReleaseResource( sfnt );\n\n    is_cff     = sfnt_size > 4 && !ft_memcmp( sfnt_data, \"OTTO\", 4 );\n    is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, \"typ1\", 4 );\n\n    if ( is_sfnt_ps )\n    {\n      FT_Stream  stream;\n\n\n      if ( FT_NEW( stream ) )\n        goto Try_OpenType;\n\n      FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size );\n      if ( !open_face_PS_from_sfnt_stream( library,\n                                           stream,\n                                           face_index,\n                                           0, NULL,\n                                           aface ) )\n      {\n        FT_Stream_Close( stream );\n        FT_FREE( stream );\n        FT_FREE( sfnt_data );\n        goto Exit;\n      }\n\n      FT_FREE( stream );\n    }\n  Try_OpenType:\n    error = open_face_from_buffer( library,\n                                   sfnt_data,\n                                   sfnt_size,\n                                   face_index,\n                                   is_cff ? \"cff\" : \"truetype\",\n                                   aface );\n  Exit:\n    return error;\n  }\n\n\n  /* Create a new FT_Face from a file path to a suitcase file. */\n  static FT_Error\n  FT_New_Face_From_Suitcase( FT_Library    library,\n                             const UInt8*  pathname,\n                             FT_Long       face_index,\n                             FT_Face*      aface )\n  {\n    FT_Error       error = FT_ERR( Cannot_Open_Resource );\n    ResFileRefNum  res_ref;\n    ResourceIndex  res_index;\n    Handle         fond;\n    short          num_faces_in_res, num_faces_in_fond;\n\n\n    if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    UseResFile( res_ref );\n    if ( ResError() )\n      return FT_THROW( Cannot_Open_Resource );\n\n    num_faces_in_res = 0;\n    for ( res_index = 1; ; ++res_index )\n    {\n      fond = Get1IndResource( TTAG_FOND, res_index );\n      if ( ResError() )\n        break;\n\n      num_faces_in_fond  = count_faces( fond, pathname );\n      num_faces_in_res  += num_faces_in_fond;\n\n      if ( 0 <= face_index && face_index < num_faces_in_fond && error )\n        error = FT_New_Face_From_FOND( library, fond, face_index, aface );\n\n      face_index -= num_faces_in_fond;\n    }\n\n    CloseResFile( res_ref );\n    if ( !error && aface && *aface )\n      (*aface)->num_faces = num_faces_in_res;\n    return error;\n  }\n\n\n  /* documentation is in ftmac.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face_From_FOND( FT_Library  library,\n                         Handle      fond,\n                         FT_Long     face_index,\n                         FT_Face*    aface )\n  {\n    short     have_sfnt, have_lwfn = 0;\n    ResID     sfnt_id, fond_id;\n    OSType    fond_type;\n    Str255    fond_name;\n    Str255    lwfn_file_name;\n    UInt8     path_lwfn[PATH_MAX];\n    OSErr     err;\n    FT_Error  error = FT_Err_Ok;\n\n\n    GetResInfo( fond, &fond_id, &fond_type, fond_name );\n    if ( ResError() != noErr || fond_type != TTAG_FOND )\n      return FT_THROW( Invalid_File_Format );\n\n    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index );\n\n    if ( lwfn_file_name[0] )\n    {\n      ResFileRefNum  res;\n\n\n      res = HomeResFile( fond );\n      if ( noErr != ResError() )\n        goto found_no_lwfn_file;\n\n      {\n        UInt8  path_fond[PATH_MAX];\n        FSRef  ref;\n\n\n        err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum,\n                               NULL, NULL, NULL, &ref, NULL );\n        if ( noErr != err )\n          goto found_no_lwfn_file;\n\n        err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) );\n        if ( noErr != err )\n          goto found_no_lwfn_file;\n\n        error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,\n                                     path_lwfn, sizeof ( path_lwfn ) );\n        if ( !error )\n          have_lwfn = 1;\n      }\n    }\n\n    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )\n      error = FT_New_Face_From_LWFN( library,\n                                     path_lwfn,\n                                     face_index,\n                                     aface );\n    else\n      error = FT_THROW( Unknown_File_Format );\n\n  found_no_lwfn_file:\n    if ( have_sfnt && error )\n      error = FT_New_Face_From_SFNT( library,\n                                     sfnt_id,\n                                     face_index,\n                                     aface );\n\n    return error;\n  }\n\n\n  /* Common function to load a new FT_Face from a resource file. */\n  static FT_Error\n  FT_New_Face_From_Resource( FT_Library    library,\n                             const UInt8*  pathname,\n                             FT_Long       face_index,\n                             FT_Face*      aface )\n  {\n    OSType    file_type;\n    FT_Error  error;\n\n\n    /* LWFN is a (very) specific file format, check for it explicitly */\n    file_type = get_file_type_from_path( pathname );\n    if ( file_type == TTAG_LWFN )\n      return FT_New_Face_From_LWFN( library, pathname, face_index, aface );\n\n    /* Otherwise the file type doesn't matter (there are more than  */\n    /* `FFIL' and `tfil').  Just try opening it as a font suitcase; */\n    /* if it works, fine.                                           */\n\n    error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );\n    if ( error == 0 )\n      return error;\n\n    /* let it fall through to normal loader (.ttf, .otf, etc.); */\n    /* we signal this by returning no error and no FT_Face      */\n    *aface = NULL;\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is the Mac-specific implementation of FT_New_Face.  In        */\n  /*    addition to the standard FT_New_Face() functionality, it also      */\n  /*    accepts pathnames to Mac suitcase files.  For further              */\n  /*    documentation see the original FT_New_Face() in freetype.h.        */\n  /*                                                                       */\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face( FT_Library   library,\n               const char*  pathname,\n               FT_Long      face_index,\n               FT_Face*     aface )\n  {\n    FT_Open_Args  args;\n    FT_Error      error;\n\n\n    /* test for valid `library' and `aface' delayed to FT_Open_Face() */\n    if ( !pathname )\n      return FT_THROW( Invalid_Argument );\n\n    error  = FT_Err_Ok;\n    *aface = NULL;\n\n    /* try resourcefork based font: LWFN, FFIL */\n    error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,\n                                       face_index, aface );\n    if ( error != 0 || *aface != NULL )\n      return error;\n\n    /* let it fall through to normal loader (.ttf, .otf, etc.) */\n    args.flags    = FT_OPEN_PATHNAME;\n    args.pathname = (char*)pathname;\n    return FT_Open_Face( library, &args, face_index, aface );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSRef                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FT_New_Face_From_FSRef is identical to FT_New_Face except it       */\n  /*    accepts an FSRef instead of a path.                                */\n  /*                                                                       */\n  /* This function is deprecated because Carbon data types (FSRef)         */\n  /* are not cross-platform, and thus not suitable for the freetype API.   */\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face_From_FSRef( FT_Library    library,\n                          const FSRef*  ref,\n                          FT_Long       face_index,\n                          FT_Face*      aface )\n  {\n    FT_Error      error;\n    FT_Open_Args  args;\n    OSErr   err;\n    UInt8   pathname[PATH_MAX];\n\n\n    if ( !ref )\n      return FT_THROW( Invalid_Argument );\n\n    err = FSRefMakePath( ref, pathname, sizeof ( pathname ) );\n    if ( err )\n      error = FT_THROW( Cannot_Open_Resource );\n\n    error = FT_New_Face_From_Resource( library, pathname, face_index, aface );\n    if ( error != 0 || *aface != NULL )\n      return error;\n\n    /* fallback to datafork font */\n    args.flags    = FT_OPEN_PATHNAME;\n    args.pathname = (char*)pathname;\n    return FT_Open_Face( library, &args, face_index, aface );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_New_Face_From_FSSpec                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    FT_New_Face_From_FSSpec is identical to FT_New_Face except it      */\n  /*    accepts an FSSpec instead of a path.                               */\n  /*                                                                       */\n  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face_From_FSSpec( FT_Library     library,\n                           const FSSpec*  spec,\n                           FT_Long        face_index,\n                           FT_Face*       aface )\n  {\n#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \\\n      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )\n    FT_UNUSED( library );\n    FT_UNUSED( spec );\n    FT_UNUSED( face_index );\n    FT_UNUSED( aface );\n\n    return FT_THROW( Unimplemented_Feature );\n#else\n    FSRef  ref;\n\n\n    if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr )\n      return FT_THROW( Invalid_Argument );\n    else\n      return FT_New_Face_From_FSRef( library, &ref, face_index, aface );\n#endif\n  }\n\n#endif /* FT_MACINTOSH */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftmm.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmm.c                                                                 */\n/*                                                                         */\n/*    Multiple Master font support (body).                                 */\n/*                                                                         */\n/*  Copyright 1996-2001, 2003, 2004, 2009, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_MULTIPLE_MASTERS_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_MULTIPLE_MASTERS_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_mm\n\n\n  static FT_Error\n  ft_face_get_mm_service( FT_Face                   face,\n                          FT_Service_MultiMasters  *aservice )\n  {\n    FT_Error  error;\n\n\n    *aservice = NULL;\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( FT_HAS_MULTIPLE_MASTERS( face ) )\n    {\n      FT_FACE_LOOKUP_SERVICE( face,\n                              *aservice,\n                              MULTI_MASTERS );\n\n      if ( *aservice )\n        error = FT_Err_Ok;\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Multi_Master( FT_Face           face,\n                       FT_Multi_Master  *amaster )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->get_mm )\n        error = service->get_mm( face, amaster );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_MM_Var( FT_Face      face,\n                 FT_MM_Var*  *amaster )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->get_mm_var )\n        error = service->get_mm_var( face, amaster );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_MM_Design_Coordinates( FT_Face   face,\n                                FT_UInt   num_coords,\n                                FT_Long*  coords )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->set_mm_design )\n        error = service->set_mm_design( face, num_coords, coords );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Var_Design_Coordinates( FT_Face    face,\n                                 FT_UInt    num_coords,\n                                 FT_Fixed*  coords )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->set_var_design )\n        error = service->set_var_design( face, num_coords, coords );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_MM_Blend_Coordinates( FT_Face    face,\n                               FT_UInt    num_coords,\n                               FT_Fixed*  coords )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->set_mm_blend )\n         error = service->set_mm_blend( face, num_coords, coords );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftmm.h */\n\n  /* This is exactly the same as the previous function.  It exists for */\n  /* orthogonality.                                                    */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Var_Blend_Coordinates( FT_Face    face,\n                                FT_UInt    num_coords,\n                                FT_Fixed*  coords )\n  {\n    FT_Error                 error;\n    FT_Service_MultiMasters  service;\n\n\n    error = ft_face_get_mm_service( face, &service );\n    if ( !error )\n    {\n      error = FT_ERR( Invalid_Argument );\n      if ( service->set_mm_blend )\n         error = service->set_mm_blend( face, num_coords, coords );\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftobjs.c                                                               */\n/*                                                                         */\n/*    The FreeType private base classes (body).                            */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_LIST_H\n#include FT_OUTLINE_H\n#include FT_INTERNAL_VALIDATE_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_RFORK_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_SFNT_H    /* for SFNT_Load_Table_Func */\n#include FT_TRUETYPE_TABLES_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_TRUETYPE_IDS_H\n\n#include FT_SERVICE_PROPERTIES_H\n#include FT_SERVICE_SFNT_H\n#include FT_SERVICE_POSTSCRIPT_NAME_H\n#include FT_SERVICE_GLYPH_DICT_H\n#include FT_SERVICE_TT_CMAP_H\n#include FT_SERVICE_KERNING_H\n#include FT_SERVICE_TRUETYPE_ENGINE_H\n\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n#include \"ftbase.h\"\n#endif\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n#include FT_BITMAP_H\n#define free md5_free /* suppress a shadow warning */\n  /* it's easiest to include `md5.c' directly */\n#include \"md5.c\"\n#undef free\n#endif\n\n\n#define GRID_FIT_METRICS\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,\n                          const char*     service_id )\n  {\n    FT_Pointer      result = NULL;\n    FT_ServiceDesc  desc   = service_descriptors;\n\n\n    if ( desc && service_id )\n    {\n      for ( ; desc->serv_id != NULL; desc++ )\n      {\n        if ( ft_strcmp( desc->serv_id, service_id ) == 0 )\n        {\n          result = (FT_Pointer)desc->serv_data;\n          break;\n        }\n      }\n    }\n\n    return result;\n  }\n\n\n  FT_BASE_DEF( void )\n  ft_validator_init( FT_Validator        valid,\n                     const FT_Byte*      base,\n                     const FT_Byte*      limit,\n                     FT_ValidationLevel  level )\n  {\n    valid->base  = base;\n    valid->limit = limit;\n    valid->level = level;\n    valid->error = FT_Err_Ok;\n  }\n\n\n  FT_BASE_DEF( FT_Int )\n  ft_validator_run( FT_Validator  valid )\n  {\n    /* This function doesn't work!  None should call it. */\n    FT_UNUSED( valid );\n\n    return -1;\n  }\n\n\n  FT_BASE_DEF( void )\n  ft_validator_error( FT_Validator  valid,\n                      FT_Error      error )\n  {\n    /* since the cast below also disables the compiler's */\n    /* type check, we introduce a dummy variable, which  */\n    /* will be optimized away                            */\n    volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer;\n\n\n    valid->error = error;\n\n    /* throw away volatileness; use `jump_buffer' or the  */\n    /* compiler may warn about an unused local variable   */\n    ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                           S T R E A M                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* create a new input stream from an FT_Open_Args structure */\n  /*                                                          */\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_New( FT_Library           library,\n                 const FT_Open_Args*  args,\n                 FT_Stream           *astream )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n    FT_Stream  stream = NULL;\n\n\n    *astream = 0;\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !args )\n      return FT_THROW( Invalid_Argument );\n\n    memory = library->memory;\n\n    if ( FT_NEW( stream ) )\n      goto Exit;\n\n    stream->memory = memory;\n\n    if ( args->flags & FT_OPEN_MEMORY )\n    {\n      /* create a memory-based stream */\n      FT_Stream_OpenMemory( stream,\n                            (const FT_Byte*)args->memory_base,\n                            args->memory_size );\n    }\n\n#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT\n\n    else if ( args->flags & FT_OPEN_PATHNAME )\n    {\n      /* create a normal system stream */\n      error = FT_Stream_Open( stream, args->pathname );\n      stream->pathname.pointer = args->pathname;\n    }\n    else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream )\n    {\n      /* use an existing, user-provided stream */\n\n      /* in this case, we do not need to allocate a new stream object */\n      /* since the caller is responsible for closing it himself       */\n      FT_FREE( stream );\n      stream = args->stream;\n    }\n\n#endif\n\n    else\n      error = FT_THROW( Invalid_Argument );\n\n    if ( error )\n      FT_FREE( stream );\n    else\n      stream->memory = memory;  /* just to be certain */\n\n    *astream = stream;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_Free( FT_Stream  stream,\n                  FT_Int     external )\n  {\n    if ( stream )\n    {\n      FT_Memory  memory = stream->memory;\n\n\n      FT_Stream_Close( stream );\n\n      if ( !external )\n        FT_FREE( stream );\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_objs\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****               FACE, SIZE & GLYPH SLOT OBJECTS                   ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  static FT_Error\n  ft_glyphslot_init( FT_GlyphSlot  slot )\n  {\n    FT_Driver         driver   = slot->face->driver;\n    FT_Driver_Class   clazz    = driver->clazz;\n    FT_Memory         memory   = driver->root.memory;\n    FT_Error          error    = FT_Err_Ok;\n    FT_Slot_Internal  internal = NULL;\n\n\n    slot->library = driver->root.library;\n\n    if ( FT_NEW( internal ) )\n      goto Exit;\n\n    slot->internal = internal;\n\n    if ( FT_DRIVER_USES_OUTLINES( driver ) )\n      error = FT_GlyphLoader_New( memory, &internal->loader );\n\n    if ( !error && clazz->init_slot )\n      error = clazz->init_slot( slot );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_BASE_DEF( void )\n  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot )\n  {\n    if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )\n    {\n      FT_Memory  memory = FT_FACE_MEMORY( slot->face );\n\n\n      FT_FREE( slot->bitmap.buffer );\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n    else\n    {\n      /* assume that the bitmap buffer was stolen or not */\n      /* allocated from the heap                         */\n      slot->bitmap.buffer = NULL;\n    }\n  }\n\n\n  FT_BASE_DEF( void )\n  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,\n                           FT_Byte*      buffer )\n  {\n    ft_glyphslot_free_bitmap( slot );\n\n    slot->bitmap.buffer = buffer;\n\n    FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,\n                             FT_ULong      size )\n  {\n    FT_Memory  memory = FT_FACE_MEMORY( slot->face );\n    FT_Error   error;\n\n\n    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )\n      FT_FREE( slot->bitmap.buffer );\n    else\n      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;\n\n    (void)FT_ALLOC( slot->bitmap.buffer, size );\n    return error;\n  }\n\n\n  static void\n  ft_glyphslot_clear( FT_GlyphSlot  slot )\n  {\n    /* free bitmap if needed */\n    ft_glyphslot_free_bitmap( slot );\n\n    /* clear all public fields in the glyph slot */\n    FT_ZERO( &slot->metrics );\n    FT_ZERO( &slot->outline );\n\n    slot->bitmap.width      = 0;\n    slot->bitmap.rows       = 0;\n    slot->bitmap.pitch      = 0;\n    slot->bitmap.pixel_mode = 0;\n    /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */\n\n    slot->bitmap_left   = 0;\n    slot->bitmap_top    = 0;\n    slot->num_subglyphs = 0;\n    slot->subglyphs     = 0;\n    slot->control_data  = 0;\n    slot->control_len   = 0;\n    slot->other         = 0;\n    slot->format        = FT_GLYPH_FORMAT_NONE;\n\n    slot->linearHoriAdvance = 0;\n    slot->linearVertAdvance = 0;\n    slot->lsb_delta         = 0;\n    slot->rsb_delta         = 0;\n  }\n\n\n  static void\n  ft_glyphslot_done( FT_GlyphSlot  slot )\n  {\n    FT_Driver        driver = slot->face->driver;\n    FT_Driver_Class  clazz  = driver->clazz;\n    FT_Memory        memory = driver->root.memory;\n\n\n    if ( clazz->done_slot )\n      clazz->done_slot( slot );\n\n    /* free bitmap buffer if needed */\n    ft_glyphslot_free_bitmap( slot );\n\n    /* slot->internal might be NULL in out-of-memory situations */\n    if ( slot->internal )\n    {\n      /* free glyph loader */\n      if ( FT_DRIVER_USES_OUTLINES( driver ) )\n      {\n        FT_GlyphLoader_Done( slot->internal->loader );\n        slot->internal->loader = 0;\n      }\n\n      FT_FREE( slot->internal );\n    }\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( FT_Error )\n  FT_New_GlyphSlot( FT_Face        face,\n                    FT_GlyphSlot  *aslot )\n  {\n    FT_Error         error;\n    FT_Driver        driver;\n    FT_Driver_Class  clazz;\n    FT_Memory        memory;\n    FT_GlyphSlot     slot = NULL;\n\n\n    if ( !face || !face->driver )\n      return FT_THROW( Invalid_Argument );\n\n    driver = face->driver;\n    clazz  = driver->clazz;\n    memory = driver->root.memory;\n\n    FT_TRACE4(( \"FT_New_GlyphSlot: Creating new slot object\\n\" ));\n    if ( !FT_ALLOC( slot, clazz->slot_object_size ) )\n    {\n      slot->face = face;\n\n      error = ft_glyphslot_init( slot );\n      if ( error )\n      {\n        ft_glyphslot_done( slot );\n        FT_FREE( slot );\n        goto Exit;\n      }\n\n      slot->next  = face->glyph;\n      face->glyph = slot;\n\n      if ( aslot )\n        *aslot = slot;\n    }\n    else if ( aslot )\n      *aslot = 0;\n\n\n  Exit:\n    FT_TRACE4(( \"FT_New_GlyphSlot: Return %d\\n\", error ));\n    return error;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( void )\n  FT_Done_GlyphSlot( FT_GlyphSlot  slot )\n  {\n    if ( slot )\n    {\n      FT_Driver     driver = slot->face->driver;\n      FT_Memory     memory = driver->root.memory;\n      FT_GlyphSlot  prev;\n      FT_GlyphSlot  cur;\n\n\n      /* Remove slot from its parent face's list */\n      prev = NULL;\n      cur  = slot->face->glyph;\n\n      while ( cur )\n      {\n        if ( cur == slot )\n        {\n          if ( !prev )\n            slot->face->glyph = cur->next;\n          else\n            prev->next = cur->next;\n\n          /* finalize client-specific data */\n          if ( slot->generic.finalizer )\n            slot->generic.finalizer( slot );\n\n          ft_glyphslot_done( slot );\n          FT_FREE( slot );\n          break;\n        }\n        prev = cur;\n        cur  = cur->next;\n      }\n    }\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Set_Transform( FT_Face     face,\n                    FT_Matrix*  matrix,\n                    FT_Vector*  delta )\n  {\n    FT_Face_Internal  internal;\n\n\n    if ( !face )\n      return;\n\n    internal = face->internal;\n\n    internal->transform_flags = 0;\n\n    if ( !matrix )\n    {\n      internal->transform_matrix.xx = 0x10000L;\n      internal->transform_matrix.xy = 0;\n      internal->transform_matrix.yx = 0;\n      internal->transform_matrix.yy = 0x10000L;\n      matrix = &internal->transform_matrix;\n    }\n    else\n      internal->transform_matrix = *matrix;\n\n    /* set transform_flags bit flag 0 if `matrix' isn't the identity */\n    if ( ( matrix->xy | matrix->yx ) ||\n         matrix->xx != 0x10000L      ||\n         matrix->yy != 0x10000L      )\n      internal->transform_flags |= 1;\n\n    if ( !delta )\n    {\n      internal->transform_delta.x = 0;\n      internal->transform_delta.y = 0;\n      delta = &internal->transform_delta;\n    }\n    else\n      internal->transform_delta = *delta;\n\n    /* set transform_flags bit flag 1 if `delta' isn't the null vector */\n    if ( delta->x | delta->y )\n      internal->transform_flags |= 2;\n  }\n\n\n  static FT_Renderer\n  ft_lookup_glyph_renderer( FT_GlyphSlot  slot );\n\n\n#ifdef GRID_FIT_METRICS\n  static void\n  ft_glyphslot_grid_fit_metrics( FT_GlyphSlot  slot,\n                                 FT_Bool       vertical )\n  {\n    FT_Glyph_Metrics*  metrics = &slot->metrics;\n    FT_Pos             right, bottom;\n\n\n    if ( vertical )\n    {\n      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );\n      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );\n\n      right  = FT_PIX_CEIL( metrics->vertBearingX + metrics->width );\n      bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height );\n\n      metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );\n      metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );\n\n      metrics->width  = right - metrics->vertBearingX;\n      metrics->height = bottom - metrics->vertBearingY;\n    }\n    else\n    {\n      metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );\n      metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );\n\n      right  = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width );\n      bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height );\n\n      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );\n      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );\n\n      metrics->width  = right - metrics->horiBearingX;\n      metrics->height = metrics->horiBearingY - bottom;\n    }\n\n    metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );\n    metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );\n  }\n#endif /* GRID_FIT_METRICS */\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Load_Glyph( FT_Face   face,\n                 FT_UInt   glyph_index,\n                 FT_Int32  load_flags )\n  {\n    FT_Error      error;\n    FT_Driver     driver;\n    FT_GlyphSlot  slot;\n    FT_Library    library;\n    FT_Bool       autohint = FALSE;\n    FT_Module     hinter;\n    TT_Face       ttface = (TT_Face)face;\n\n\n    if ( !face || !face->size || !face->glyph )\n      return FT_THROW( Invalid_Face_Handle );\n\n    /* The validity test for `glyph_index' is performed by the */\n    /* font drivers.                                           */\n\n    slot = face->glyph;\n    ft_glyphslot_clear( slot );\n\n    driver  = face->driver;\n    library = driver->root.library;\n    hinter  = library->auto_hinter;\n\n    /* resolve load flags dependencies */\n\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n      load_flags |= FT_LOAD_NO_SCALE         |\n                    FT_LOAD_IGNORE_TRANSFORM;\n\n    if ( load_flags & FT_LOAD_NO_SCALE )\n    {\n      load_flags |= FT_LOAD_NO_HINTING |\n                    FT_LOAD_NO_BITMAP;\n\n      load_flags &= ~FT_LOAD_RENDER;\n    }\n\n    /*\n     * Determine whether we need to auto-hint or not.\n     * The general rules are:\n     *\n     * - Do only auto-hinting if we have a hinter module, a scalable font\n     *   format dealing with outlines, and no transforms except simple\n     *   slants and/or rotations by integer multiples of 90 degrees.\n     *\n     * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't\n     *   have a native font hinter.\n     *\n     * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't\n     *   any hinting bytecode in the TrueType/OpenType font.\n     *\n     * - Exception: The font is `tricky' and requires the native hinter to\n     *   load properly.\n     */\n\n    if ( hinter                                           &&\n         !( load_flags & FT_LOAD_NO_HINTING )             &&\n         !( load_flags & FT_LOAD_NO_AUTOHINT )            &&\n         FT_DRIVER_IS_SCALABLE( driver )                  &&\n         FT_DRIVER_USES_OUTLINES( driver )                &&\n         !FT_IS_TRICKY( face )                            &&\n         ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM )    ||\n           ( face->internal->transform_matrix.yx == 0 &&\n             face->internal->transform_matrix.xx != 0 ) ||\n           ( face->internal->transform_matrix.xx == 0 &&\n             face->internal->transform_matrix.yx != 0 ) ) )\n    {\n      if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) ||\n           !FT_DRIVER_HAS_HINTER( driver )         )\n        autohint = TRUE;\n      else\n      {\n        FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );\n\n\n        /* the check for `num_locations' assures that we actually    */\n        /* test for instructions in a TTF and not in a CFF-based OTF */\n        if ( mode == FT_RENDER_MODE_LIGHT                       ||\n             face->internal->ignore_unpatented_hinter           ||\n             ( FT_IS_SFNT( face )                             &&\n               ttface->num_locations                          &&\n               ttface->max_profile.maxSizeOfInstructions == 0 ) )\n          autohint = TRUE;\n      }\n    }\n\n    if ( autohint )\n    {\n      FT_AutoHinter_Interface  hinting;\n\n\n      /* try to load embedded bitmaps first if available            */\n      /*                                                            */\n      /* XXX: This is really a temporary hack that should disappear */\n      /*      promptly with FreeType 2.1!                           */\n      /*                                                            */\n      if ( FT_HAS_FIXED_SIZES( face )             &&\n          ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )\n      {\n        error = driver->clazz->load_glyph( slot, face->size,\n                                           glyph_index,\n                                           load_flags | FT_LOAD_SBITS_ONLY );\n\n        if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP )\n          goto Load_Ok;\n      }\n\n      {\n        FT_Face_Internal  internal        = face->internal;\n        FT_Int            transform_flags = internal->transform_flags;\n\n\n        /* since the auto-hinter calls FT_Load_Glyph by itself, */\n        /* make sure that glyphs aren't transformed             */\n        internal->transform_flags = 0;\n\n        /* load auto-hinted outline */\n        hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface;\n\n        error   = hinting->load_glyph( (FT_AutoHinter)hinter,\n                                       slot, face->size,\n                                       glyph_index, load_flags );\n\n        internal->transform_flags = transform_flags;\n      }\n    }\n    else\n    {\n      error = driver->clazz->load_glyph( slot,\n                                         face->size,\n                                         glyph_index,\n                                         load_flags );\n      if ( error )\n        goto Exit;\n\n      if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n      {\n        /* check that the loaded outline is correct */\n        error = FT_Outline_Check( &slot->outline );\n        if ( error )\n          goto Exit;\n\n#ifdef GRID_FIT_METRICS\n        if ( !( load_flags & FT_LOAD_NO_HINTING ) )\n          ft_glyphslot_grid_fit_metrics( slot,\n              FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) );\n#endif\n      }\n    }\n\n  Load_Ok:\n    /* compute the advance */\n    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n    {\n      slot->advance.x = 0;\n      slot->advance.y = slot->metrics.vertAdvance;\n    }\n    else\n    {\n      slot->advance.x = slot->metrics.horiAdvance;\n      slot->advance.y = 0;\n    }\n\n    /* compute the linear advance in 16.16 pixels */\n    if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&\n         ( FT_IS_SCALABLE( face ) )                  )\n    {\n      FT_Size_Metrics*  metrics = &face->size->metrics;\n\n\n      /* it's tricky! */\n      slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance,\n                                           metrics->x_scale, 64 );\n\n      slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance,\n                                           metrics->y_scale, 64 );\n    }\n\n    if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )\n    {\n      FT_Face_Internal  internal = face->internal;\n\n\n      /* now, transform the glyph image if needed */\n      if ( internal->transform_flags )\n      {\n        /* get renderer */\n        FT_Renderer  renderer = ft_lookup_glyph_renderer( slot );\n\n\n        if ( renderer )\n          error = renderer->clazz->transform_glyph(\n                                     renderer, slot,\n                                     &internal->transform_matrix,\n                                     &internal->transform_delta );\n        else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n        {\n          /* apply `standard' transformation if no renderer is available */\n          if ( internal->transform_flags & 1 )\n            FT_Outline_Transform( &slot->outline,\n                                  &internal->transform_matrix );\n\n          if ( internal->transform_flags & 2 )\n            FT_Outline_Translate( &slot->outline,\n                                  internal->transform_delta.x,\n                                  internal->transform_delta.y );\n        }\n\n        /* transform advance */\n        FT_Vector_Transform( &slot->advance, &internal->transform_matrix );\n      }\n    }\n\n    FT_TRACE5(( \"  x advance: %d\\n\" , slot->advance.x ));\n    FT_TRACE5(( \"  y advance: %d\\n\" , slot->advance.y ));\n\n    FT_TRACE5(( \"  linear x advance: %d\\n\" , slot->linearHoriAdvance ));\n    FT_TRACE5(( \"  linear y advance: %d\\n\" , slot->linearVertAdvance ));\n\n    /* do we need to render the image now? */\n    if ( !error                                    &&\n         slot->format != FT_GLYPH_FORMAT_BITMAP    &&\n         slot->format != FT_GLYPH_FORMAT_COMPOSITE &&\n         load_flags & FT_LOAD_RENDER )\n    {\n      FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );\n\n\n      if ( mode == FT_RENDER_MODE_NORMAL      &&\n           (load_flags & FT_LOAD_MONOCHROME ) )\n        mode = FT_RENDER_MODE_MONO;\n\n      error = FT_Render_Glyph( slot, mode );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Load_Char( FT_Face   face,\n                FT_ULong  char_code,\n                FT_Int32  load_flags )\n  {\n    FT_UInt  glyph_index;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    glyph_index = (FT_UInt)char_code;\n    if ( face->charmap )\n      glyph_index = FT_Get_Char_Index( face, char_code );\n\n    return FT_Load_Glyph( face, glyph_index, load_flags );\n  }\n\n\n  /* destructor for sizes list */\n  static void\n  destroy_size( FT_Memory  memory,\n                FT_Size    size,\n                FT_Driver  driver )\n  {\n    /* finalize client-specific data */\n    if ( size->generic.finalizer )\n      size->generic.finalizer( size );\n\n    /* finalize format-specific stuff */\n    if ( driver->clazz->done_size )\n      driver->clazz->done_size( size );\n\n    FT_FREE( size->internal );\n    FT_FREE( size );\n  }\n\n\n  static void\n  ft_cmap_done_internal( FT_CMap  cmap );\n\n\n  static void\n  destroy_charmaps( FT_Face    face,\n                    FT_Memory  memory )\n  {\n    FT_Int  n;\n\n\n    if ( !face )\n      return;\n\n    for ( n = 0; n < face->num_charmaps; n++ )\n    {\n      FT_CMap  cmap = FT_CMAP( face->charmaps[n] );\n\n\n      ft_cmap_done_internal( cmap );\n\n      face->charmaps[n] = NULL;\n    }\n\n    FT_FREE( face->charmaps );\n    face->num_charmaps = 0;\n  }\n\n\n  /* destructor for faces list */\n  static void\n  destroy_face( FT_Memory  memory,\n                FT_Face    face,\n                FT_Driver  driver )\n  {\n    FT_Driver_Class  clazz = driver->clazz;\n\n\n    /* discard auto-hinting data */\n    if ( face->autohint.finalizer )\n      face->autohint.finalizer( face->autohint.data );\n\n    /* Discard glyph slots for this face.                           */\n    /* Beware!  FT_Done_GlyphSlot() changes the field `face->glyph' */\n    while ( face->glyph )\n      FT_Done_GlyphSlot( face->glyph );\n\n    /* discard all sizes for this face */\n    FT_List_Finalize( &face->sizes_list,\n                      (FT_List_Destructor)destroy_size,\n                      memory,\n                      driver );\n    face->size = 0;\n\n    /* now discard client data */\n    if ( face->generic.finalizer )\n      face->generic.finalizer( face );\n\n    /* discard charmaps */\n    destroy_charmaps( face, memory );\n\n    /* finalize format-specific stuff */\n    if ( clazz->done_face )\n      clazz->done_face( face );\n\n    /* close the stream for this face if needed */\n    FT_Stream_Free(\n      face->stream,\n      ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 );\n\n    face->stream = 0;\n\n    /* get rid of it */\n    if ( face->internal )\n    {\n      FT_FREE( face->internal );\n    }\n    FT_FREE( face );\n  }\n\n\n  static void\n  Destroy_Driver( FT_Driver  driver )\n  {\n    FT_List_Finalize( &driver->faces_list,\n                      (FT_List_Destructor)destroy_face,\n                      driver->root.memory,\n                      driver );\n\n    /* check whether we need to drop the driver's glyph loader */\n    if ( FT_DRIVER_USES_OUTLINES( driver ) )\n      FT_GlyphLoader_Done( driver->glyph_loader );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    find_unicode_charmap                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function finds a Unicode charmap, if there is one.            */\n  /*    And if there is more than one, it tries to favour the more         */\n  /*    extensive one, i.e., one that supports UCS-4 against those which   */\n  /*    are limited to the BMP (said UCS-2 encoding.)                      */\n  /*                                                                       */\n  /*    This function is called from open_face() (just below), and also    */\n  /*    from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ).                */\n  /*                                                                       */\n  static FT_Error\n  find_unicode_charmap( FT_Face  face )\n  {\n    FT_CharMap*  first;\n    FT_CharMap*  cur;\n\n\n    /* caller should have already checked that `face' is valid */\n    FT_ASSERT( face );\n\n    first = face->charmaps;\n\n    if ( !first )\n      return FT_THROW( Invalid_CharMap_Handle );\n\n    /*\n     *  The original TrueType specification(s) only specified charmap\n     *  formats that are capable of mapping 8 or 16 bit character codes to\n     *  glyph indices.\n     *\n     *  However, recent updates to the Apple and OpenType specifications\n     *  introduced new formats that are capable of mapping 32-bit character\n     *  codes as well.  And these are already used on some fonts, mainly to\n     *  map non-BMP Asian ideographs as defined in Unicode.\n     *\n     *  For compatibility purposes, these fonts generally come with\n     *  *several* Unicode charmaps:\n     *\n     *   - One of them in the \"old\" 16-bit format, that cannot access\n     *     all glyphs in the font.\n     *\n     *   - Another one in the \"new\" 32-bit format, that can access all\n     *     the glyphs.\n     *\n     *  This function has been written to always favor a 32-bit charmap\n     *  when found.  Otherwise, a 16-bit one is returned when found.\n     */\n\n    /* Since the `interesting' table, with IDs (3,10), is normally the */\n    /* last one, we loop backwards.  This loses with type1 fonts with  */\n    /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP  */\n    /* chars (.01% ?), and this is the same about 99.99% of the time!  */\n\n    cur = first + face->num_charmaps;  /* points after the last one */\n\n    for ( ; --cur >= first; )\n    {\n      if ( cur[0]->encoding == FT_ENCODING_UNICODE )\n      {\n        /* XXX If some new encodings to represent UCS-4 are added, */\n        /*     they should be added here.                          */\n        if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT &&\n               cur[0]->encoding_id == TT_MS_ID_UCS_4        )     ||\n             ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&\n               cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32    ) )\n        {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n          if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )\n          {\n            FT_ERROR(( \"find_unicode_charmap: UCS-4 cmap is found \"\n                       \"at too late position (%d)\\n\", cur - first ));\n            continue;\n          }\n#endif\n          face->charmap = cur[0];\n          return FT_Err_Ok;\n        }\n      }\n    }\n\n    /* We do not have any UCS-4 charmap.                */\n    /* Do the loop again and search for UCS-2 charmaps. */\n    cur = first + face->num_charmaps;\n\n    for ( ; --cur >= first; )\n    {\n      if ( cur[0]->encoding == FT_ENCODING_UNICODE )\n      {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"find_unicode_charmap: UCS-2 cmap is found \"\n                     \"at too late position (%d)\\n\", cur - first ));\n          continue;\n        }\n#endif\n        face->charmap = cur[0];\n        return FT_Err_Ok;\n      }\n    }\n\n    return FT_THROW( Invalid_CharMap_Handle );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    find_variant_selector_charmap                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function finds the variant selector charmap, if there is one. */\n  /*    There can only be one (platform=0, specific=5, format=14).         */\n  /*                                                                       */\n  static FT_CharMap\n  find_variant_selector_charmap( FT_Face  face )\n  {\n    FT_CharMap*  first;\n    FT_CharMap*  end;\n    FT_CharMap*  cur;\n\n\n    /* caller should have already checked that `face' is valid */\n    FT_ASSERT( face );\n\n    first = face->charmaps;\n\n    if ( !first )\n      return NULL;\n\n    end = first + face->num_charmaps;  /* points after the last one */\n\n    for ( cur = first; cur < end; ++cur )\n    {\n      if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE    &&\n           cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR &&\n           FT_Get_CMap_Format( cur[0] ) == 14                  )\n      {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"find_unicode_charmap: UVS cmap is found \"\n                     \"at too late position (%d)\\n\", cur - first ));\n          continue;\n        }\n#endif\n        return cur[0];\n      }\n    }\n\n    return NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    open_face                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function does some work for FT_Open_Face().                   */\n  /*                                                                       */\n  static FT_Error\n  open_face( FT_Driver      driver,\n             FT_Stream      stream,\n             FT_Long        face_index,\n             FT_Int         num_params,\n             FT_Parameter*  params,\n             FT_Face       *aface )\n  {\n    FT_Memory         memory;\n    FT_Driver_Class   clazz;\n    FT_Face           face = 0;\n    FT_Error          error, error2;\n    FT_Face_Internal  internal = NULL;\n\n\n    clazz  = driver->clazz;\n    memory = driver->root.memory;\n\n    /* allocate the face object and perform basic initialization */\n    if ( FT_ALLOC( face, clazz->face_object_size ) )\n      goto Fail;\n\n    if ( FT_NEW( internal ) )\n      goto Fail;\n\n    face->internal = internal;\n\n    face->driver   = driver;\n    face->memory   = memory;\n    face->stream   = stream;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    {\n      int  i;\n\n\n      face->internal->incremental_interface = 0;\n      for ( i = 0; i < num_params && !face->internal->incremental_interface;\n            i++ )\n        if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL )\n          face->internal->incremental_interface =\n            (FT_Incremental_Interface)params[i].data;\n    }\n#endif\n\n    if ( clazz->init_face )\n      error = clazz->init_face( stream,\n                                face,\n                                (FT_Int)face_index,\n                                num_params,\n                                params );\n    if ( error )\n      goto Fail;\n\n    /* select Unicode charmap by default */\n    error2 = find_unicode_charmap( face );\n\n    /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */\n    /* is returned.                                                      */\n\n    /* no error should happen, but we want to play safe */\n    if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) )\n    {\n      error = error2;\n      goto Fail;\n    }\n\n    *aface = face;\n\n  Fail:\n    if ( error )\n    {\n      destroy_charmaps( face, memory );\n      if ( clazz->done_face )\n        clazz->done_face( face );\n      FT_FREE( internal );\n      FT_FREE( face );\n      *aface = 0;\n    }\n\n    return error;\n  }\n\n\n  /* there's a Mac-specific extended implementation of FT_New_Face() */\n  /* in src/base/ftmac.c                                             */\n\n#ifndef FT_MACINTOSH\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Face( FT_Library   library,\n               const char*  pathname,\n               FT_Long      face_index,\n               FT_Face     *aface )\n  {\n    FT_Open_Args  args;\n\n\n    /* test for valid `library' and `aface' delayed to FT_Open_Face() */\n    if ( !pathname )\n      return FT_THROW( Invalid_Argument );\n\n    args.flags    = FT_OPEN_PATHNAME;\n    args.pathname = (char*)pathname;\n    args.stream   = NULL;\n\n    return FT_Open_Face( library, &args, face_index, aface );\n  }\n\n#endif\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Memory_Face( FT_Library      library,\n                      const FT_Byte*  file_base,\n                      FT_Long         file_size,\n                      FT_Long         face_index,\n                      FT_Face        *aface )\n  {\n    FT_Open_Args  args;\n\n\n    /* test for valid `library' and `face' delayed to FT_Open_Face() */\n    if ( !file_base )\n      return FT_THROW( Invalid_Argument );\n\n    args.flags       = FT_OPEN_MEMORY;\n    args.memory_base = file_base;\n    args.memory_size = file_size;\n    args.stream      = NULL;\n\n    return FT_Open_Face( library, &args, face_index, aface );\n  }\n\n\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n\n  /* The behavior here is very similar to that in base/ftmac.c, but it     */\n  /* is designed to work on non-mac systems, so no mac specific calls.     */\n  /*                                                                       */\n  /* We look at the file and determine if it is a mac dfont file or a mac  */\n  /* resource file, or a macbinary file containing a mac resource file.    */\n  /*                                                                       */\n  /* Unlike ftmac I'm not going to look at a `FOND'.  I don't really see   */\n  /* the point, especially since there may be multiple `FOND' resources.   */\n  /* Instead I'll just look for `sfnt' and `POST' resources, ordered as    */\n  /* they occur in the file.                                               */\n  /*                                                                       */\n  /* Note that multiple `POST' resources do not mean multiple postscript   */\n  /* fonts; they all get jammed together to make what is essentially a     */\n  /* pfb file.                                                             */\n  /*                                                                       */\n  /* We aren't interested in `NFNT' or `FONT' bitmap resources.            */\n  /*                                                                       */\n  /* As soon as we get an `sfnt' load it into memory and pass it off to    */\n  /* FT_Open_Face.                                                         */\n  /*                                                                       */\n  /* If we have a (set of) `POST' resources, massage them into a (memory)  */\n  /* pfb file and pass that to FT_Open_Face.  (As with ftmac.c I'm not     */\n  /* going to try to save the kerning info.  After all that lives in the   */\n  /* `FOND' which isn't in the file containing the `POST' resources so     */\n  /* we don't really have access to it.                                    */\n\n\n  /* Finalizer for a memory stream; gets called by FT_Done_Face(). */\n  /* It frees the memory it uses.                                  */\n  /* From ftmac.c.                                                 */\n  static void\n  memory_stream_close( FT_Stream  stream )\n  {\n    FT_Memory  memory = stream->memory;\n\n\n    FT_FREE( stream->base );\n\n    stream->size  = 0;\n    stream->base  = 0;\n    stream->close = 0;\n  }\n\n\n  /* Create a new memory stream from a buffer and a size. */\n  /* From ftmac.c.                                        */\n  static FT_Error\n  new_memory_stream( FT_Library           library,\n                     FT_Byte*             base,\n                     FT_ULong             size,\n                     FT_Stream_CloseFunc  close,\n                     FT_Stream           *astream )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n    FT_Stream  stream = NULL;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !base )\n      return FT_THROW( Invalid_Argument );\n\n    *astream = 0;\n    memory = library->memory;\n    if ( FT_NEW( stream ) )\n      goto Exit;\n\n    FT_Stream_OpenMemory( stream, base, size );\n\n    stream->close = close;\n\n    *astream = stream;\n\n  Exit:\n    return error;\n  }\n\n\n  /* Create a new FT_Face given a buffer and a driver name. */\n  /* from ftmac.c */\n  FT_LOCAL_DEF( FT_Error )\n  open_face_from_buffer( FT_Library   library,\n                         FT_Byte*     base,\n                         FT_ULong     size,\n                         FT_Long      face_index,\n                         const char*  driver_name,\n                         FT_Face     *aface )\n  {\n    FT_Open_Args  args;\n    FT_Error      error;\n    FT_Stream     stream = NULL;\n    FT_Memory     memory = library->memory;\n\n\n    error = new_memory_stream( library,\n                               base,\n                               size,\n                               memory_stream_close,\n                               &stream );\n    if ( error )\n    {\n      FT_FREE( base );\n      return error;\n    }\n\n    args.flags = FT_OPEN_STREAM;\n    args.stream = stream;\n    if ( driver_name )\n    {\n      args.flags = args.flags | FT_OPEN_DRIVER;\n      args.driver = FT_Get_Module( library, driver_name );\n    }\n\n#ifdef FT_MACINTOSH\n    /* At this point, face_index has served its purpose;      */\n    /* whoever calls this function has already used it to     */\n    /* locate the correct font data.  We should not propagate */\n    /* this index to FT_Open_Face() (unless it is negative).  */\n\n    if ( face_index > 0 )\n      face_index = 0;\n#endif\n\n    error = FT_Open_Face( library, &args, face_index, aface );\n\n    if ( error == FT_Err_Ok )\n      (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;\n    else\n#ifdef FT_MACINTOSH\n      FT_Stream_Free( stream, 0 );\n#else\n    {\n      FT_Stream_Close( stream );\n      FT_FREE( stream );\n    }\n#endif\n\n    return error;\n  }\n\n\n  /* Look up `TYP1' or `CID ' table from sfnt table directory.       */\n  /* `offset' and `length' must exclude the binary header in tables. */\n\n  /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */\n  /* format too.  Here, since we can't expect that the TrueType font */\n  /* driver is loaded unconditially, we must parse the font by       */\n  /* ourselves.  We are only interested in the name of the table and */\n  /* the offset.                                                     */\n\n  static FT_Error\n  ft_lookup_PS_in_sfnt_stream( FT_Stream  stream,\n                               FT_Long    face_index,\n                               FT_ULong*  offset,\n                               FT_ULong*  length,\n                               FT_Bool*   is_sfnt_cid )\n  {\n    FT_Error   error;\n    FT_UShort  numTables;\n    FT_Long    pstable_index;\n    FT_ULong   tag;\n    int        i;\n\n\n    *offset = 0;\n    *length = 0;\n    *is_sfnt_cid = FALSE;\n\n    /* TODO: support for sfnt-wrapped PS/CID in TTC format */\n\n    /* version check for 'typ1' (should be ignored?) */\n    if ( FT_READ_ULONG( tag ) )\n      return error;\n    if ( tag != TTAG_typ1 )\n      return FT_THROW( Unknown_File_Format );\n\n    if ( FT_READ_USHORT( numTables ) )\n      return error;\n    if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */\n      return error;\n\n    pstable_index = -1;\n    *is_sfnt_cid  = FALSE;\n\n    for ( i = 0; i < numTables; i++ )\n    {\n      if ( FT_READ_ULONG( tag )     || FT_STREAM_SKIP( 4 )      ||\n           FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) )\n        return error;\n\n      if ( tag == TTAG_CID )\n      {\n        pstable_index++;\n        *offset += 22;\n        *length -= 22;\n        *is_sfnt_cid = TRUE;\n        if ( face_index < 0 )\n          return FT_Err_Ok;\n      }\n      else if ( tag == TTAG_TYP1 )\n      {\n        pstable_index++;\n        *offset += 24;\n        *length -= 24;\n        *is_sfnt_cid = FALSE;\n        if ( face_index < 0 )\n          return FT_Err_Ok;\n      }\n      if ( face_index >= 0 && pstable_index == face_index )\n        return FT_Err_Ok;\n    }\n    return FT_THROW( Table_Missing );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  open_face_PS_from_sfnt_stream( FT_Library     library,\n                                 FT_Stream      stream,\n                                 FT_Long        face_index,\n                                 FT_Int         num_params,\n                                 FT_Parameter  *params,\n                                 FT_Face       *aface )\n  {\n    FT_Error   error;\n    FT_Memory  memory = library->memory;\n    FT_ULong   offset, length;\n    FT_Long    pos;\n    FT_Bool    is_sfnt_cid;\n    FT_Byte*   sfnt_ps = NULL;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n\n\n    pos = FT_Stream_Pos( stream );\n\n    error = ft_lookup_PS_in_sfnt_stream( stream,\n                                         face_index,\n                                         &offset,\n                                         &length,\n                                         &is_sfnt_cid );\n    if ( error )\n      goto Exit;\n\n    if ( FT_Stream_Seek( stream, pos + offset ) )\n      goto Exit;\n\n    if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) )\n      goto Exit;\n\n    error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length );\n    if ( error )\n      goto Exit;\n\n    error = open_face_from_buffer( library,\n                                   sfnt_ps,\n                                   length,\n                                   FT_MIN( face_index, 0 ),\n                                   is_sfnt_cid ? \"cid\" : \"type1\",\n                                   aface );\n  Exit:\n    {\n      FT_Error  error1;\n\n\n      if ( FT_ERR_EQ( error, Unknown_File_Format ) )\n      {\n        error1 = FT_Stream_Seek( stream, pos );\n        if ( error1 )\n          return error1;\n      }\n\n      return error;\n    }\n  }\n\n\n#ifndef FT_MACINTOSH\n\n  /* The resource header says we've got resource_cnt `POST' (type1) */\n  /* resources in this file.  They all need to be coalesced into    */\n  /* one lump which gets passed on to the type1 driver.             */\n  /* Here can be only one PostScript font in a file so face_index   */\n  /* must be 0 (or -1).                                             */\n  /*                                                                */\n  static FT_Error\n  Mac_Read_POST_Resource( FT_Library  library,\n                          FT_Stream   stream,\n                          FT_Long    *offsets,\n                          FT_Long     resource_cnt,\n                          FT_Long     face_index,\n                          FT_Face    *aface )\n  {\n    FT_Error   error  = FT_ERR( Cannot_Open_Resource );\n    FT_Memory  memory = library->memory;\n    FT_Byte*   pfb_data = NULL;\n    int        i, type, flags;\n    FT_Long    len;\n    FT_Long    pfb_len, pfb_pos, pfb_lenpos;\n    FT_Long    rlen, temp;\n\n\n    if ( face_index == -1 )\n      face_index = 0;\n    if ( face_index != 0 )\n      return error;\n\n    /* Find the length of all the POST resources, concatenated.  Assume */\n    /* worst case (each resource in its own section).                   */\n    pfb_len = 0;\n    for ( i = 0; i < resource_cnt; ++i )\n    {\n      error = FT_Stream_Seek( stream, offsets[i] );\n      if ( error )\n        goto Exit;\n      if ( FT_READ_LONG( temp ) )\n        goto Exit;\n      pfb_len += temp + 6;\n    }\n\n    if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) )\n      goto Exit;\n\n    pfb_data[0] = 0x80;\n    pfb_data[1] = 1;            /* Ascii section */\n    pfb_data[2] = 0;            /* 4-byte length, fill in later */\n    pfb_data[3] = 0;\n    pfb_data[4] = 0;\n    pfb_data[5] = 0;\n    pfb_pos     = 6;\n    pfb_lenpos  = 2;\n\n    len = 0;\n    type = 1;\n    for ( i = 0; i < resource_cnt; ++i )\n    {\n      error = FT_Stream_Seek( stream, offsets[i] );\n      if ( error )\n        goto Exit2;\n      if ( FT_READ_LONG( rlen ) )\n        goto Exit;\n      if ( FT_READ_USHORT( flags ) )\n        goto Exit;\n      FT_TRACE3(( \"POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\\n\",\n                   i, offsets[i], rlen, flags ));\n\n      /* postpone the check of rlen longer than buffer until FT_Stream_Read() */\n      if ( ( flags >> 8 ) == 0 )        /* Comment, should not be loaded */\n        continue;\n\n      /* the flags are part of the resource, so rlen >= 2.  */\n      /* but some fonts declare rlen = 0 for empty fragment */\n      if ( rlen > 2 )\n        rlen -= 2;\n      else\n        rlen = 0;\n\n      if ( ( flags >> 8 ) == type )\n        len += rlen;\n      else\n      {\n        if ( pfb_lenpos + 3 > pfb_len + 2 )\n          goto Exit2;\n        pfb_data[pfb_lenpos    ] = (FT_Byte)( len );\n        pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );\n        pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );\n        pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );\n\n        if ( ( flags >> 8 ) == 5 )      /* End of font mark */\n          break;\n\n        if ( pfb_pos + 6 > pfb_len + 2 )\n          goto Exit2;\n        pfb_data[pfb_pos++] = 0x80;\n\n        type = flags >> 8;\n        len = rlen;\n\n        pfb_data[pfb_pos++] = (FT_Byte)type;\n        pfb_lenpos          = pfb_pos;\n        pfb_data[pfb_pos++] = 0;        /* 4-byte length, fill in later */\n        pfb_data[pfb_pos++] = 0;\n        pfb_data[pfb_pos++] = 0;\n        pfb_data[pfb_pos++] = 0;\n      }\n\n      error = FT_ERR( Cannot_Open_Resource );\n      if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )\n        goto Exit2;\n\n      error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen );\n      if ( error )\n        goto Exit2;\n      pfb_pos += rlen;\n    }\n\n    if ( pfb_pos + 2 > pfb_len + 2 )\n      goto Exit2;\n    pfb_data[pfb_pos++] = 0x80;\n    pfb_data[pfb_pos++] = 3;\n\n    if ( pfb_lenpos + 3 > pfb_len + 2 )\n      goto Exit2;\n    pfb_data[pfb_lenpos    ] = (FT_Byte)( len );\n    pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );\n    pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );\n    pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );\n\n    return open_face_from_buffer( library,\n                                  pfb_data,\n                                  pfb_pos,\n                                  face_index,\n                                  \"type1\",\n                                  aface );\n\n  Exit2:\n    FT_FREE( pfb_data );\n\n  Exit:\n    return error;\n  }\n\n\n  /* The resource header says we've got resource_cnt `sfnt'      */\n  /* (TrueType/OpenType) resources in this file.  Look through   */\n  /* them for the one indicated by face_index, load it into mem, */\n  /* pass it on the the truetype driver and return it.           */\n  /*                                                             */\n  static FT_Error\n  Mac_Read_sfnt_Resource( FT_Library  library,\n                          FT_Stream   stream,\n                          FT_Long    *offsets,\n                          FT_Long     resource_cnt,\n                          FT_Long     face_index,\n                          FT_Face    *aface )\n  {\n    FT_Memory  memory = library->memory;\n    FT_Byte*   sfnt_data = NULL;\n    FT_Error   error;\n    FT_Long    flag_offset;\n    FT_Long    rlen;\n    int        is_cff;\n    FT_Long    face_index_in_resource = 0;\n\n\n    if ( face_index == -1 )\n      face_index = 0;\n    if ( face_index >= resource_cnt )\n      return FT_THROW( Cannot_Open_Resource );\n\n    flag_offset = offsets[face_index];\n    error = FT_Stream_Seek( stream, flag_offset );\n    if ( error )\n      goto Exit;\n\n    if ( FT_READ_LONG( rlen ) )\n      goto Exit;\n    if ( rlen == -1 )\n      return FT_THROW( Cannot_Open_Resource );\n\n    error = open_face_PS_from_sfnt_stream( library,\n                                           stream,\n                                           face_index,\n                                           0, NULL,\n                                           aface );\n    if ( !error )\n      goto Exit;\n\n    /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */\n    if ( FT_Stream_Seek( stream, flag_offset + 4 ) )\n      goto Exit;\n\n    if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) )\n      return error;\n    error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen );\n    if ( error )\n      goto Exit;\n\n    is_cff = rlen > 4 && !ft_memcmp( sfnt_data, \"OTTO\", 4 );\n    error = open_face_from_buffer( library,\n                                   sfnt_data,\n                                   rlen,\n                                   face_index_in_resource,\n                                   is_cff ? \"cff\" : \"truetype\",\n                                   aface );\n\n  Exit:\n    return error;\n  }\n\n\n  /* Check for a valid resource fork header, or a valid dfont    */\n  /* header.  In a resource fork the first 16 bytes are repeated */\n  /* at the location specified by bytes 4-7.  In a dfont bytes   */\n  /* 4-7 point to 16 bytes of zeroes instead.                    */\n  /*                                                             */\n  static FT_Error\n  IsMacResource( FT_Library  library,\n                 FT_Stream   stream,\n                 FT_Long     resource_offset,\n                 FT_Long     face_index,\n                 FT_Face    *aface )\n  {\n    FT_Memory  memory = library->memory;\n    FT_Error   error;\n    FT_Long    map_offset, rdara_pos;\n    FT_Long    *data_offsets;\n    FT_Long    count;\n\n\n    error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset,\n                                       &map_offset, &rdara_pos );\n    if ( error )\n      return error;\n\n    error = FT_Raccess_Get_DataOffsets( library, stream,\n                                        map_offset, rdara_pos,\n                                        TTAG_POST,\n                                        &data_offsets, &count );\n    if ( !error )\n    {\n      error = Mac_Read_POST_Resource( library, stream, data_offsets, count,\n                                      face_index, aface );\n      FT_FREE( data_offsets );\n      /* POST exists in an LWFN providing a single face */\n      if ( !error )\n        (*aface)->num_faces = 1;\n      return error;\n    }\n\n    error = FT_Raccess_Get_DataOffsets( library, stream,\n                                        map_offset, rdara_pos,\n                                        TTAG_sfnt,\n                                        &data_offsets, &count );\n    if ( !error )\n    {\n      FT_Long  face_index_internal = face_index % count;\n\n\n      error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count,\n                                      face_index_internal, aface );\n      FT_FREE( data_offsets );\n      if ( !error )\n        (*aface)->num_faces = count;\n    }\n\n    return error;\n  }\n\n\n  /* Check for a valid macbinary header, and if we find one   */\n  /* check that the (flattened) resource fork in it is valid. */\n  /*                                                          */\n  static FT_Error\n  IsMacBinary( FT_Library  library,\n               FT_Stream   stream,\n               FT_Long     face_index,\n               FT_Face    *aface )\n  {\n    unsigned char  header[128];\n    FT_Error       error;\n    FT_Long        dlen, offset;\n\n\n    if ( NULL == stream )\n      return FT_THROW( Invalid_Stream_Operation );\n\n    error = FT_Stream_Seek( stream, 0 );\n    if ( error )\n      goto Exit;\n\n    error = FT_Stream_Read( stream, (FT_Byte*)header, 128 );\n    if ( error )\n      goto Exit;\n\n    if (            header[ 0] !=  0 ||\n                    header[74] !=  0 ||\n                    header[82] !=  0 ||\n                    header[ 1] ==  0 ||\n                    header[ 1] >  33 ||\n                    header[63] !=  0 ||\n         header[2 + header[1]] !=  0 )\n      return FT_THROW( Unknown_File_Format );\n\n    dlen = ( header[0x53] << 24 ) |\n           ( header[0x54] << 16 ) |\n           ( header[0x55] <<  8 ) |\n             header[0x56];\n#if 0\n    rlen = ( header[0x57] << 24 ) |\n           ( header[0x58] << 16 ) |\n           ( header[0x59] <<  8 ) |\n             header[0x5a];\n#endif /* 0 */\n    offset = 128 + ( ( dlen + 127 ) & ~127 );\n\n    return IsMacResource( library, stream, offset, face_index, aface );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  load_face_in_embedded_rfork( FT_Library           library,\n                               FT_Stream            stream,\n                               FT_Long              face_index,\n                               FT_Face             *aface,\n                               const FT_Open_Args  *args )\n  {\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_raccess\n\n    FT_Memory  memory = library->memory;\n    FT_Error   error  = FT_ERR( Unknown_File_Format );\n    int        i;\n\n    char *     file_names[FT_RACCESS_N_RULES];\n    FT_Long    offsets[FT_RACCESS_N_RULES];\n    FT_Error   errors[FT_RACCESS_N_RULES];\n    FT_Bool    is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */\n\n    FT_Open_Args  args2;\n    FT_Stream     stream2 = 0;\n\n\n    FT_Raccess_Guess( library, stream,\n                      args->pathname, file_names, offsets, errors );\n\n    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )\n    {\n      is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i );\n      if ( is_darwin_vfs && vfs_rfork_has_no_font )\n      {\n        FT_TRACE3(( \"Skip rule %d: darwin vfs resource fork\"\n                    \" is already checked and\"\n                    \" no font is found\\n\", i ));\n        continue;\n      }\n\n      if ( errors[i] )\n      {\n        FT_TRACE3(( \"Error[%d] has occurred in rule %d\\n\", errors[i], i ));\n        continue;\n      }\n\n      args2.flags    = FT_OPEN_PATHNAME;\n      args2.pathname = file_names[i] ? file_names[i] : args->pathname;\n\n      FT_TRACE3(( \"Try rule %d: %s (offset=%d) ...\",\n                  i, args2.pathname, offsets[i] ));\n\n      error = FT_Stream_New( library, &args2, &stream2 );\n      if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) )\n        vfs_rfork_has_no_font = TRUE;\n\n      if ( error )\n      {\n        FT_TRACE3(( \"failed\\n\" ));\n        continue;\n      }\n\n      error = IsMacResource( library, stream2, offsets[i],\n                             face_index, aface );\n      FT_Stream_Free( stream2, 0 );\n\n      FT_TRACE3(( \"%s\\n\", error ? \"failed\": \"successful\" ));\n\n      if ( !error )\n          break;\n      else if ( is_darwin_vfs )\n          vfs_rfork_has_no_font = TRUE;\n    }\n\n    for (i = 0; i < FT_RACCESS_N_RULES; i++)\n    {\n      if ( file_names[i] )\n        FT_FREE( file_names[i] );\n    }\n\n    /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */\n    if ( error )\n      error = FT_ERR( Unknown_File_Format );\n\n    return error;\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_objs\n\n  }\n\n\n  /* Check for some macintosh formats without Carbon framework.    */\n  /* Is this a macbinary file?  If so look at the resource fork.   */\n  /* Is this a mac dfont file?                                     */\n  /* Is this an old style resource fork? (in data)                 */\n  /* Else call load_face_in_embedded_rfork to try extra rules      */\n  /* (defined in `ftrfork.c').                                     */\n  /*                                                               */\n  static FT_Error\n  load_mac_face( FT_Library           library,\n                 FT_Stream            stream,\n                 FT_Long              face_index,\n                 FT_Face             *aface,\n                 const FT_Open_Args  *args )\n  {\n    FT_Error error;\n    FT_UNUSED( args );\n\n\n    error = IsMacBinary( library, stream, face_index, aface );\n    if ( FT_ERR_EQ( error, Unknown_File_Format ) )\n    {\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_raccess\n\n      FT_TRACE3(( \"Try as dfont: %s ...\", args->pathname ));\n\n      error = IsMacResource( library, stream, 0, face_index, aface );\n\n      FT_TRACE3(( \"%s\\n\", error ? \"failed\" : \"successful\" ));\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_objs\n\n    }\n\n    if ( ( FT_ERR_EQ( error, Unknown_File_Format )      ||\n           FT_ERR_EQ( error, Invalid_Stream_Operation ) ) &&\n         ( args->flags & FT_OPEN_PATHNAME )               )\n      error = load_face_in_embedded_rfork( library, stream,\n                                           face_index, aface, args );\n    return error;\n  }\n#endif\n\n#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Open_Face( FT_Library           library,\n                const FT_Open_Args*  args,\n                FT_Long              face_index,\n                FT_Face             *aface )\n  {\n    FT_Error     error;\n    FT_Driver    driver;\n    FT_Memory    memory;\n    FT_Stream    stream = NULL;\n    FT_Face      face   = NULL;\n    FT_ListNode  node   = NULL;\n    FT_Bool      external_stream;\n    FT_Module*   cur;\n    FT_Module*   limit;\n\n\n    /* test for valid `library' delayed to */\n    /* FT_Stream_New()                     */\n\n    if ( ( !aface && face_index >= 0 ) || !args )\n      return FT_THROW( Invalid_Argument );\n\n    external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) &&\n                               args->stream                     );\n\n    /* create input stream */\n    error = FT_Stream_New( library, args, &stream );\n    if ( error )\n      goto Fail3;\n\n    memory = library->memory;\n\n    /* If the font driver is specified in the `args' structure, use */\n    /* it.  Otherwise, we scan the list of registered drivers.      */\n    if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver )\n    {\n      driver = FT_DRIVER( args->driver );\n\n      /* not all modules are drivers, so check... */\n      if ( FT_MODULE_IS_DRIVER( driver ) )\n      {\n        FT_Int         num_params = 0;\n        FT_Parameter*  params     = 0;\n\n\n        if ( args->flags & FT_OPEN_PARAMS )\n        {\n          num_params = args->num_params;\n          params     = args->params;\n        }\n\n        error = open_face( driver, stream, face_index,\n                           num_params, params, &face );\n        if ( !error )\n          goto Success;\n      }\n      else\n        error = FT_THROW( Invalid_Handle );\n\n      FT_Stream_Free( stream, external_stream );\n      goto Fail;\n    }\n    else\n    {\n      error = FT_ERR( Missing_Module );\n\n      /* check each font driver for an appropriate format */\n      cur   = library->modules;\n      limit = cur + library->num_modules;\n\n      for ( ; cur < limit; cur++ )\n      {\n        /* not all modules are font drivers, so check... */\n        if ( FT_MODULE_IS_DRIVER( cur[0] ) )\n        {\n          FT_Int         num_params = 0;\n          FT_Parameter*  params     = 0;\n\n\n          driver = FT_DRIVER( cur[0] );\n\n          if ( args->flags & FT_OPEN_PARAMS )\n          {\n            num_params = args->num_params;\n            params     = args->params;\n          }\n\n          error = open_face( driver, stream, face_index,\n                             num_params, params, &face );\n          if ( !error )\n            goto Success;\n\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n          if ( ft_strcmp( cur[0]->clazz->module_name, \"truetype\" ) == 0 &&\n               FT_ERR_EQ( error, Table_Missing )                        )\n          {\n            /* TrueType but essential tables are missing */\n            if ( FT_Stream_Seek( stream, 0 ) )\n              break;\n\n            error = open_face_PS_from_sfnt_stream( library,\n                                                   stream,\n                                                   face_index,\n                                                   num_params,\n                                                   params,\n                                                   aface );\n            if ( !error )\n            {\n              FT_Stream_Free( stream, external_stream );\n              return error;\n            }\n          }\n#endif\n\n          if ( FT_ERR_NEQ( error, Unknown_File_Format ) )\n            goto Fail3;\n        }\n      }\n\n    Fail3:\n      /* If we are on the mac, and we get an                          */\n      /* FT_Err_Invalid_Stream_Operation it may be because we have an */\n      /* empty data fork, so we need to check the resource fork.      */\n      if ( FT_ERR_NEQ( error, Cannot_Open_Stream )       &&\n           FT_ERR_NEQ( error, Unknown_File_Format )      &&\n           FT_ERR_NEQ( error, Invalid_Stream_Operation ) )\n        goto Fail2;\n\n#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS )\n      error = load_mac_face( library, stream, face_index, aface, args );\n      if ( !error )\n      {\n        /* We don't want to go to Success here.  We've already done that. */\n        /* On the other hand, if we succeeded we still need to close this */\n        /* stream (we opened a different stream which extracted the       */\n        /* interesting information out of this stream here.  That stream  */\n        /* will still be open and the face will point to it).             */\n        FT_Stream_Free( stream, external_stream );\n        return error;\n      }\n\n      if ( FT_ERR_NEQ( error, Unknown_File_Format ) )\n        goto Fail2;\n#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */\n\n      /* no driver is able to handle this format */\n      error = FT_THROW( Unknown_File_Format );\n\n  Fail2:\n      FT_Stream_Free( stream, external_stream );\n      goto Fail;\n    }\n\n  Success:\n    FT_TRACE4(( \"FT_Open_Face: New face object, adding to list\\n\" ));\n\n    /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */\n    if ( external_stream )\n      face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;\n\n    /* add the face object to its driver's list */\n    if ( FT_NEW( node ) )\n      goto Fail;\n\n    node->data = face;\n    /* don't assume driver is the same as face->driver, so use */\n    /* face->driver instead.                                   */\n    FT_List_Add( &face->driver->faces_list, node );\n\n    /* now allocate a glyph slot object for the face */\n    FT_TRACE4(( \"FT_Open_Face: Creating glyph slot\\n\" ));\n\n    if ( face_index >= 0 )\n    {\n      error = FT_New_GlyphSlot( face, NULL );\n      if ( error )\n        goto Fail;\n\n      /* finally, allocate a size object for the face */\n      {\n        FT_Size  size;\n\n\n        FT_TRACE4(( \"FT_Open_Face: Creating size object\\n\" ));\n\n        error = FT_New_Size( face, &size );\n        if ( error )\n          goto Fail;\n\n        face->size = size;\n      }\n    }\n\n    /* some checks */\n\n    if ( FT_IS_SCALABLE( face ) )\n    {\n      if ( face->height < 0 )\n        face->height = (FT_Short)-face->height;\n\n      if ( !FT_HAS_VERTICAL( face ) )\n        face->max_advance_height = (FT_Short)face->height;\n    }\n\n    if ( FT_HAS_FIXED_SIZES( face ) )\n    {\n      FT_Int  i;\n\n\n      for ( i = 0; i < face->num_fixed_sizes; i++ )\n      {\n        FT_Bitmap_Size*  bsize = face->available_sizes + i;\n\n\n        if ( bsize->height < 0 )\n          bsize->height = (FT_Short)-bsize->height;\n        if ( bsize->x_ppem < 0 )\n          bsize->x_ppem = (FT_Short)-bsize->x_ppem;\n        if ( bsize->y_ppem < 0 )\n          bsize->y_ppem = -bsize->y_ppem;\n      }\n    }\n\n    /* initialize internal face data */\n    {\n      FT_Face_Internal  internal = face->internal;\n\n\n      internal->transform_matrix.xx = 0x10000L;\n      internal->transform_matrix.xy = 0;\n      internal->transform_matrix.yx = 0;\n      internal->transform_matrix.yy = 0x10000L;\n\n      internal->transform_delta.x = 0;\n      internal->transform_delta.y = 0;\n\n      internal->refcount = 1;\n    }\n\n    if ( aface )\n      *aface = face;\n    else\n      FT_Done_Face( face );\n\n    goto Exit;\n\n  Fail:\n    FT_Done_Face( face );\n\n  Exit:\n    FT_TRACE4(( \"FT_Open_Face: Return %d\\n\", error ));\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Attach_File( FT_Face      face,\n                  const char*  filepathname )\n  {\n    FT_Open_Args  open;\n\n\n    /* test for valid `face' delayed to FT_Attach_Stream() */\n\n    if ( !filepathname )\n      return FT_THROW( Invalid_Argument );\n\n    open.stream   = NULL;\n    open.flags    = FT_OPEN_PATHNAME;\n    open.pathname = (char*)filepathname;\n\n    return FT_Attach_Stream( face, &open );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Attach_Stream( FT_Face        face,\n                    FT_Open_Args*  parameters )\n  {\n    FT_Stream  stream;\n    FT_Error   error;\n    FT_Driver  driver;\n\n    FT_Driver_Class  clazz;\n\n\n    /* test for valid `parameters' delayed to FT_Stream_New() */\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    driver = face->driver;\n    if ( !driver )\n      return FT_THROW( Invalid_Driver_Handle );\n\n    error = FT_Stream_New( driver->root.library, parameters, &stream );\n    if ( error )\n      goto Exit;\n\n    /* we implement FT_Attach_Stream in each driver through the */\n    /* `attach_file' interface                                  */\n\n    error = FT_ERR( Unimplemented_Feature );\n    clazz = driver->clazz;\n    if ( clazz->attach_file )\n      error = clazz->attach_file( face, stream );\n\n    /* close the attached stream */\n    FT_Stream_Free( stream,\n                    (FT_Bool)( parameters->stream &&\n                               ( parameters->flags & FT_OPEN_STREAM ) ) );\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Reference_Face( FT_Face  face )\n  {\n    face->internal->refcount++;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Done_Face( FT_Face  face )\n  {\n    FT_Error     error;\n    FT_Driver    driver;\n    FT_Memory    memory;\n    FT_ListNode  node;\n\n\n    error = FT_ERR( Invalid_Face_Handle );\n    if ( face && face->driver )\n    {\n      face->internal->refcount--;\n      if ( face->internal->refcount > 0 )\n        error = FT_Err_Ok;\n      else\n      {\n        driver = face->driver;\n        memory = driver->root.memory;\n\n        /* find face in driver's list */\n        node = FT_List_Find( &driver->faces_list, face );\n        if ( node )\n        {\n          /* remove face object from the driver's list */\n          FT_List_Remove( &driver->faces_list, node );\n          FT_FREE( node );\n\n          /* now destroy the object proper */\n          destroy_face( memory, face, driver );\n          error = FT_Err_Ok;\n        }\n      }\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Size( FT_Face   face,\n               FT_Size  *asize )\n  {\n    FT_Error         error;\n    FT_Memory        memory;\n    FT_Driver        driver;\n    FT_Driver_Class  clazz;\n\n    FT_Size          size = 0;\n    FT_ListNode      node = 0;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( !asize )\n      return FT_THROW( Invalid_Size_Handle );\n\n    if ( !face->driver )\n      return FT_THROW( Invalid_Driver_Handle );\n\n    *asize = 0;\n\n    driver = face->driver;\n    clazz  = driver->clazz;\n    memory = face->memory;\n\n    /* Allocate new size object and perform basic initialisation */\n    if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) )\n      goto Exit;\n\n    size->face = face;\n\n    /* for now, do not use any internal fields in size objects */\n    size->internal = 0;\n\n    if ( clazz->init_size )\n      error = clazz->init_size( size );\n\n    /* in case of success, add to the face's list */\n    if ( !error )\n    {\n      *asize     = size;\n      node->data = size;\n      FT_List_Add( &face->sizes_list, node );\n    }\n\n  Exit:\n    if ( error )\n    {\n      FT_FREE( node );\n      FT_FREE( size );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Done_Size( FT_Size  size )\n  {\n    FT_Error     error;\n    FT_Driver    driver;\n    FT_Memory    memory;\n    FT_Face      face;\n    FT_ListNode  node;\n\n\n    if ( !size )\n      return FT_THROW( Invalid_Size_Handle );\n\n    face = size->face;\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    driver = face->driver;\n    if ( !driver )\n      return FT_THROW( Invalid_Driver_Handle );\n\n    memory = driver->root.memory;\n\n    error = FT_Err_Ok;\n    node  = FT_List_Find( &face->sizes_list, size );\n    if ( node )\n    {\n      FT_List_Remove( &face->sizes_list, node );\n      FT_FREE( node );\n\n      if ( face->size == size )\n      {\n        face->size = 0;\n        if ( face->sizes_list.head )\n          face->size = (FT_Size)(face->sizes_list.head->data);\n      }\n\n      destroy_size( memory, size, driver );\n    }\n    else\n      error = FT_THROW( Invalid_Size_Handle );\n\n    return error;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( FT_Error )\n  FT_Match_Size( FT_Face          face,\n                 FT_Size_Request  req,\n                 FT_Bool          ignore_width,\n                 FT_ULong*        size_index )\n  {\n    FT_Int   i;\n    FT_Long  w, h;\n\n\n    if ( !FT_HAS_FIXED_SIZES( face ) )\n      return FT_THROW( Invalid_Face_Handle );\n\n    /* FT_Bitmap_Size doesn't provide enough info... */\n    if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )\n      return FT_THROW( Unimplemented_Feature );\n\n    w = FT_REQUEST_WIDTH ( req );\n    h = FT_REQUEST_HEIGHT( req );\n\n    if ( req->width && !req->height )\n      h = w;\n    else if ( !req->width && req->height )\n      w = h;\n\n    w = FT_PIX_ROUND( w );\n    h = FT_PIX_ROUND( h );\n\n    for ( i = 0; i < face->num_fixed_sizes; i++ )\n    {\n      FT_Bitmap_Size*  bsize = face->available_sizes + i;\n\n\n      if ( h != FT_PIX_ROUND( bsize->y_ppem ) )\n        continue;\n\n      if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width )\n      {\n        if ( size_index )\n          *size_index = (FT_ULong)i;\n\n        return FT_Err_Ok;\n      }\n    }\n\n    return FT_THROW( Invalid_Pixel_Size );\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( void )\n  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,\n                                  FT_Pos             advance )\n  {\n    FT_Pos  height = metrics->height;\n\n\n    /* compensate for glyph with bbox above/below the baseline */\n    if ( metrics->horiBearingY < 0 )\n    {\n      if ( height < metrics->horiBearingY )\n        height = metrics->horiBearingY;\n    }\n    else if ( metrics->horiBearingY > 0 )\n      height -= metrics->horiBearingY;\n\n    /* the factor 1.2 is a heuristical value */\n    if ( !advance )\n      advance = height * 12 / 10;\n\n    metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2;\n    metrics->vertBearingY = ( advance - height ) / 2;\n    metrics->vertAdvance  = advance;\n  }\n\n\n  static void\n  ft_recompute_scaled_metrics( FT_Face           face,\n                               FT_Size_Metrics*  metrics )\n  {\n    /* Compute root ascender, descender, test height, and max_advance */\n\n#ifdef GRID_FIT_METRICS\n    metrics->ascender    = FT_PIX_CEIL( FT_MulFix( face->ascender,\n                                                   metrics->y_scale ) );\n\n    metrics->descender   = FT_PIX_FLOOR( FT_MulFix( face->descender,\n                                                    metrics->y_scale ) );\n\n    metrics->height      = FT_PIX_ROUND( FT_MulFix( face->height,\n                                                    metrics->y_scale ) );\n\n    metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width,\n                                                    metrics->x_scale ) );\n#else /* !GRID_FIT_METRICS */\n    metrics->ascender    = FT_MulFix( face->ascender,\n                                      metrics->y_scale );\n\n    metrics->descender   = FT_MulFix( face->descender,\n                                      metrics->y_scale );\n\n    metrics->height      = FT_MulFix( face->height,\n                                      metrics->y_scale );\n\n    metrics->max_advance = FT_MulFix( face->max_advance_width,\n                                      metrics->x_scale );\n#endif /* !GRID_FIT_METRICS */\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Select_Metrics( FT_Face   face,\n                     FT_ULong  strike_index )\n  {\n    FT_Size_Metrics*  metrics;\n    FT_Bitmap_Size*   bsize;\n\n\n    metrics = &face->size->metrics;\n    bsize   = face->available_sizes + strike_index;\n\n    metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 );\n    metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 );\n\n    if ( FT_IS_SCALABLE( face ) )\n    {\n      metrics->x_scale = FT_DivFix( bsize->x_ppem,\n                                    face->units_per_EM );\n      metrics->y_scale = FT_DivFix( bsize->y_ppem,\n                                    face->units_per_EM );\n\n      ft_recompute_scaled_metrics( face, metrics );\n    }\n    else\n    {\n      metrics->x_scale     = 1L << 16;\n      metrics->y_scale     = 1L << 16;\n      metrics->ascender    = bsize->y_ppem;\n      metrics->descender   = 0;\n      metrics->height      = bsize->height << 6;\n      metrics->max_advance = bsize->x_ppem;\n    }\n\n    FT_TRACE5(( \"FT_Select_Metrics:\\n\" ));\n    FT_TRACE5(( \"  x scale: %d (%f)\\n\",\n                metrics->x_scale, metrics->x_scale / 65536.0 ));\n    FT_TRACE5(( \"  y scale: %d (%f)\\n\",\n                metrics->y_scale, metrics->y_scale / 65536.0 ));\n    FT_TRACE5(( \"  ascender: %f\\n\",    metrics->ascender / 64.0 ));\n    FT_TRACE5(( \"  descender: %f\\n\",   metrics->descender / 64.0 ));\n    FT_TRACE5(( \"  height: %f\\n\",      metrics->height / 64.0 ));\n    FT_TRACE5(( \"  max advance: %f\\n\", metrics->max_advance / 64.0 ));\n    FT_TRACE5(( \"  x ppem: %d\\n\",      metrics->x_ppem ));\n    FT_TRACE5(( \"  y ppem: %d\\n\",      metrics->y_ppem ));\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Request_Metrics( FT_Face          face,\n                      FT_Size_Request  req )\n  {\n    FT_Size_Metrics*  metrics;\n\n\n    metrics = &face->size->metrics;\n\n    if ( FT_IS_SCALABLE( face ) )\n    {\n      FT_Long  w = 0, h = 0, scaled_w = 0, scaled_h = 0;\n\n\n      switch ( req->type )\n      {\n      case FT_SIZE_REQUEST_TYPE_NOMINAL:\n        w = h = face->units_per_EM;\n        break;\n\n      case FT_SIZE_REQUEST_TYPE_REAL_DIM:\n        w = h = face->ascender - face->descender;\n        break;\n\n      case FT_SIZE_REQUEST_TYPE_BBOX:\n        w = face->bbox.xMax - face->bbox.xMin;\n        h = face->bbox.yMax - face->bbox.yMin;\n        break;\n\n      case FT_SIZE_REQUEST_TYPE_CELL:\n        w = face->max_advance_width;\n        h = face->ascender - face->descender;\n        break;\n\n      case FT_SIZE_REQUEST_TYPE_SCALES:\n        metrics->x_scale = (FT_Fixed)req->width;\n        metrics->y_scale = (FT_Fixed)req->height;\n        if ( !metrics->x_scale )\n          metrics->x_scale = metrics->y_scale;\n        else if ( !metrics->y_scale )\n          metrics->y_scale = metrics->x_scale;\n        goto Calculate_Ppem;\n\n      case FT_SIZE_REQUEST_TYPE_MAX:\n        break;\n      }\n\n      /* to be on the safe side */\n      if ( w < 0 )\n        w = -w;\n\n      if ( h < 0 )\n        h = -h;\n\n      scaled_w = FT_REQUEST_WIDTH ( req );\n      scaled_h = FT_REQUEST_HEIGHT( req );\n\n      /* determine scales */\n      if ( req->width )\n      {\n        metrics->x_scale = FT_DivFix( scaled_w, w );\n\n        if ( req->height )\n        {\n          metrics->y_scale = FT_DivFix( scaled_h, h );\n\n          if ( req->type == FT_SIZE_REQUEST_TYPE_CELL )\n          {\n            if ( metrics->y_scale > metrics->x_scale )\n              metrics->y_scale = metrics->x_scale;\n            else\n              metrics->x_scale = metrics->y_scale;\n          }\n        }\n        else\n        {\n          metrics->y_scale = metrics->x_scale;\n          scaled_h = FT_MulDiv( scaled_w, h, w );\n        }\n      }\n      else\n      {\n        metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h );\n        scaled_w = FT_MulDiv( scaled_h, w, h );\n      }\n\n  Calculate_Ppem:\n      /* calculate the ppems */\n      if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )\n      {\n        scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale );\n        scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale );\n      }\n\n      metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 );\n      metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 );\n\n      ft_recompute_scaled_metrics( face, metrics );\n    }\n    else\n    {\n      FT_ZERO( metrics );\n      metrics->x_scale = 1L << 16;\n      metrics->y_scale = 1L << 16;\n    }\n\n    FT_TRACE5(( \"FT_Request_Metrics:\\n\" ));\n    FT_TRACE5(( \"  x scale: %d (%f)\\n\",\n                metrics->x_scale, metrics->x_scale / 65536.0 ));\n    FT_TRACE5(( \"  y scale: %d (%f)\\n\",\n                metrics->y_scale, metrics->y_scale / 65536.0 ));\n    FT_TRACE5(( \"  ascender: %f\\n\",    metrics->ascender / 64.0 ));\n    FT_TRACE5(( \"  descender: %f\\n\",   metrics->descender / 64.0 ));\n    FT_TRACE5(( \"  height: %f\\n\",      metrics->height / 64.0 ));\n    FT_TRACE5(( \"  max advance: %f\\n\", metrics->max_advance / 64.0 ));\n    FT_TRACE5(( \"  x ppem: %d\\n\",      metrics->x_ppem ));\n    FT_TRACE5(( \"  y ppem: %d\\n\",      metrics->y_ppem ));\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Select_Size( FT_Face  face,\n                  FT_Int   strike_index )\n  {\n    FT_Driver_Class  clazz;\n\n\n    if ( !face || !FT_HAS_FIXED_SIZES( face ) )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( strike_index < 0 || strike_index >= face->num_fixed_sizes )\n      return FT_THROW( Invalid_Argument );\n\n    clazz = face->driver->clazz;\n\n    if ( clazz->select_size )\n    {\n      FT_Error  error;\n\n\n      error = clazz->select_size( face->size, (FT_ULong)strike_index );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n      {\n        FT_Size_Metrics*  metrics = &face->size->metrics;\n\n\n        FT_TRACE5(( \"FT_Select_Size (font driver's `select_size'):\\n\" ));\n        FT_TRACE5(( \"  x scale: %d (%f)\\n\",\n                    metrics->x_scale, metrics->x_scale / 65536.0 ));\n        FT_TRACE5(( \"  y scale: %d (%f)\\n\",\n                    metrics->y_scale, metrics->y_scale / 65536.0 ));\n        FT_TRACE5(( \"  ascender: %f\\n\",    metrics->ascender / 64.0 ));\n        FT_TRACE5(( \"  descender: %f\\n\",   metrics->descender / 64.0 ));\n        FT_TRACE5(( \"  height: %f\\n\",      metrics->height / 64.0 ));\n        FT_TRACE5(( \"  max advance: %f\\n\", metrics->max_advance / 64.0 ));\n        FT_TRACE5(( \"  x ppem: %d\\n\",      metrics->x_ppem ));\n        FT_TRACE5(( \"  y ppem: %d\\n\",      metrics->y_ppem ));\n      }\n#endif\n\n      return error;\n    }\n\n    FT_Select_Metrics( face, (FT_ULong)strike_index );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Request_Size( FT_Face          face,\n                   FT_Size_Request  req )\n  {\n    FT_Driver_Class  clazz;\n    FT_ULong         strike_index;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( !req || req->width < 0 || req->height < 0 ||\n         req->type >= FT_SIZE_REQUEST_TYPE_MAX )\n      return FT_THROW( Invalid_Argument );\n\n    clazz = face->driver->clazz;\n\n    if ( clazz->request_size )\n    {\n      FT_Error  error;\n\n\n      error = clazz->request_size( face->size, req );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n      {\n        FT_Size_Metrics*  metrics = &face->size->metrics;\n\n\n        FT_TRACE5(( \"FT_Request_Size (font driver's `request_size'):\\n\" ));\n        FT_TRACE5(( \"  x scale: %d (%f)\\n\",\n                    metrics->x_scale, metrics->x_scale / 65536.0 ));\n        FT_TRACE5(( \"  y scale: %d (%f)\\n\",\n                    metrics->y_scale, metrics->y_scale / 65536.0 ));\n        FT_TRACE5(( \"  ascender: %f\\n\",    metrics->ascender / 64.0 ));\n        FT_TRACE5(( \"  descender: %f\\n\",   metrics->descender / 64.0 ));\n        FT_TRACE5(( \"  height: %f\\n\",      metrics->height / 64.0 ));\n        FT_TRACE5(( \"  max advance: %f\\n\", metrics->max_advance / 64.0 ));\n        FT_TRACE5(( \"  x ppem: %d\\n\",      metrics->x_ppem ));\n        FT_TRACE5(( \"  y ppem: %d\\n\",      metrics->y_ppem ));\n      }\n#endif\n\n      return error;\n    }\n\n    /*\n     * The reason that a driver doesn't have `request_size' defined is\n     * either that the scaling here suffices or that the supported formats\n     * are bitmap-only and size matching is not implemented.\n     *\n     * In the latter case, a simple size matching is done.\n     */\n    if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) )\n    {\n      FT_Error  error;\n\n\n      error = FT_Match_Size( face, req, 0, &strike_index );\n      if ( error )\n        return error;\n\n      FT_TRACE3(( \"FT_Request_Size: bitmap strike %lu matched\\n\",\n                  strike_index ));\n\n      return FT_Select_Size( face, (FT_Int)strike_index );\n    }\n\n    FT_Request_Metrics( face, req );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Char_Size( FT_Face     face,\n                    FT_F26Dot6  char_width,\n                    FT_F26Dot6  char_height,\n                    FT_UInt     horz_resolution,\n                    FT_UInt     vert_resolution )\n  {\n    FT_Size_RequestRec  req;\n\n\n    if ( !char_width )\n      char_width = char_height;\n    else if ( !char_height )\n      char_height = char_width;\n\n    if ( !horz_resolution )\n      horz_resolution = vert_resolution;\n    else if ( !vert_resolution )\n      vert_resolution = horz_resolution;\n\n    if ( char_width  < 1 * 64 )\n      char_width  = 1 * 64;\n    if ( char_height < 1 * 64 )\n      char_height = 1 * 64;\n\n    if ( !horz_resolution )\n      horz_resolution = vert_resolution = 72;\n\n    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;\n    req.width          = char_width;\n    req.height         = char_height;\n    req.horiResolution = horz_resolution;\n    req.vertResolution = vert_resolution;\n\n    return FT_Request_Size( face, &req );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Pixel_Sizes( FT_Face  face,\n                      FT_UInt  pixel_width,\n                      FT_UInt  pixel_height )\n  {\n    FT_Size_RequestRec  req;\n\n\n    if ( pixel_width == 0 )\n      pixel_width = pixel_height;\n    else if ( pixel_height == 0 )\n      pixel_height = pixel_width;\n\n    if ( pixel_width  < 1 )\n      pixel_width  = 1;\n    if ( pixel_height < 1 )\n      pixel_height = 1;\n\n    /* use `>=' to avoid potential compiler warning on 16bit platforms */\n    if ( pixel_width  >= 0xFFFFU )\n      pixel_width  = 0xFFFFU;\n    if ( pixel_height >= 0xFFFFU )\n      pixel_height = 0xFFFFU;\n\n    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;\n    req.width          = pixel_width << 6;\n    req.height         = pixel_height << 6;\n    req.horiResolution = 0;\n    req.vertResolution = 0;\n\n    return FT_Request_Size( face, &req );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Kerning( FT_Face     face,\n                  FT_UInt     left_glyph,\n                  FT_UInt     right_glyph,\n                  FT_UInt     kern_mode,\n                  FT_Vector  *akerning )\n  {\n    FT_Error   error = FT_Err_Ok;\n    FT_Driver  driver;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( !akerning )\n      return FT_THROW( Invalid_Argument );\n\n    driver = face->driver;\n\n    akerning->x = 0;\n    akerning->y = 0;\n\n    if ( driver->clazz->get_kerning )\n    {\n      error = driver->clazz->get_kerning( face,\n                                          left_glyph,\n                                          right_glyph,\n                                          akerning );\n      if ( !error )\n      {\n        if ( kern_mode != FT_KERNING_UNSCALED )\n        {\n          akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale );\n          akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale );\n\n          if ( kern_mode != FT_KERNING_UNFITTED )\n          {\n            /* we scale down kerning values for small ppem values */\n            /* to avoid that rounding makes them too big.         */\n            /* `25' has been determined heuristically.            */\n            if ( face->size->metrics.x_ppem < 25 )\n              akerning->x = FT_MulDiv( akerning->x,\n                                       face->size->metrics.x_ppem, 25 );\n            if ( face->size->metrics.y_ppem < 25 )\n              akerning->y = FT_MulDiv( akerning->y,\n                                       face->size->metrics.y_ppem, 25 );\n\n            akerning->x = FT_PIX_ROUND( akerning->x );\n            akerning->y = FT_PIX_ROUND( akerning->y );\n          }\n        }\n      }\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Track_Kerning( FT_Face    face,\n                        FT_Fixed   point_size,\n                        FT_Int     degree,\n                        FT_Fixed*  akerning )\n  {\n    FT_Service_Kerning  service;\n    FT_Error            error = FT_Err_Ok;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( !akerning )\n      return FT_THROW( Invalid_Argument );\n\n    FT_FACE_FIND_SERVICE( face, service, KERNING );\n    if ( !service )\n      return FT_THROW( Unimplemented_Feature );\n\n    error = service->get_track( face,\n                                point_size,\n                                degree,\n                                akerning );\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Select_Charmap( FT_Face      face,\n                     FT_Encoding  encoding )\n  {\n    FT_CharMap*  cur;\n    FT_CharMap*  limit;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( encoding == FT_ENCODING_NONE )\n      return FT_THROW( Invalid_Argument );\n\n    /* FT_ENCODING_UNICODE is special.  We try to find the `best' Unicode */\n    /* charmap available, i.e., one with UCS-4 characters, if possible.   */\n    /*                                                                    */\n    /* This is done by find_unicode_charmap() above, to share code.       */\n    if ( encoding == FT_ENCODING_UNICODE )\n      return find_unicode_charmap( face );\n\n    cur = face->charmaps;\n    if ( !cur )\n      return FT_THROW( Invalid_CharMap_Handle );\n\n    limit = cur + face->num_charmaps;\n\n    for ( ; cur < limit; cur++ )\n    {\n      if ( cur[0]->encoding == encoding )\n      {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"FT_Select_Charmap: requested charmap is found (%d), \"\n                     \"but in too late position to cache\\n\",\n                     cur - face->charmaps ));\n          continue;\n        }\n#endif\n        face->charmap = cur[0];\n        return 0;\n      }\n    }\n\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Charmap( FT_Face     face,\n                  FT_CharMap  charmap )\n  {\n    FT_CharMap*  cur;\n    FT_CharMap*  limit;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    cur = face->charmaps;\n    if ( !cur )\n      return FT_THROW( Invalid_CharMap_Handle );\n    if ( FT_Get_CMap_Format( charmap ) == 14 )\n      return FT_THROW( Invalid_Argument );\n\n    limit = cur + face->num_charmaps;\n\n    for ( ; cur < limit; cur++ )\n    {\n      if ( cur[0] == charmap )\n      {\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"FT_Set_Charmap: requested charmap is found (%d), \"\n                     \"but in too late position to cache\\n\",\n                     cur - face->charmaps ));\n          continue;\n        }\n#endif\n        face->charmap = cur[0];\n        return 0;\n      }\n    }\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Int )\n  FT_Get_Charmap_Index( FT_CharMap  charmap )\n  {\n    FT_Int  i;\n\n\n    if ( !charmap || !charmap->face )\n      return -1;\n\n    for ( i = 0; i < charmap->face->num_charmaps; i++ )\n      if ( charmap->face->charmaps[i] == charmap )\n        break;\n\n    FT_ASSERT( i < charmap->face->num_charmaps );\n\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n    if ( i > FT_MAX_CHARMAP_CACHEABLE )\n    {\n      FT_ERROR(( \"FT_Get_Charmap_Index: requested charmap is found (%d), \"\n                 \"but in too late position to cache\\n\",\n                 i ));\n      return -i;\n    }\n#endif\n    return i;\n  }\n\n\n  static void\n  ft_cmap_done_internal( FT_CMap  cmap )\n  {\n    FT_CMap_Class  clazz  = cmap->clazz;\n    FT_Face        face   = cmap->charmap.face;\n    FT_Memory      memory = FT_FACE_MEMORY(face);\n\n\n    if ( clazz->done )\n      clazz->done( cmap );\n\n    FT_FREE( cmap );\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_CMap_Done( FT_CMap  cmap )\n  {\n    if ( cmap )\n    {\n      FT_Face    face   = cmap->charmap.face;\n      FT_Memory  memory = FT_FACE_MEMORY( face );\n      FT_Error   error;\n      FT_Int     i, j;\n\n\n      for ( i = 0; i < face->num_charmaps; i++ )\n      {\n        if ( (FT_CMap)face->charmaps[i] == cmap )\n        {\n          FT_CharMap  last_charmap = face->charmaps[face->num_charmaps - 1];\n\n\n          if ( FT_RENEW_ARRAY( face->charmaps,\n                               face->num_charmaps,\n                               face->num_charmaps - 1 ) )\n            return;\n\n          /* remove it from our list of charmaps */\n          for ( j = i + 1; j < face->num_charmaps; j++ )\n          {\n            if ( j == face->num_charmaps - 1 )\n              face->charmaps[j - 1] = last_charmap;\n            else\n              face->charmaps[j - 1] = face->charmaps[j];\n          }\n\n          face->num_charmaps--;\n\n          if ( (FT_CMap)face->charmap == cmap )\n            face->charmap = NULL;\n\n          ft_cmap_done_internal( cmap );\n\n          break;\n        }\n      }\n    }\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_CMap_New( FT_CMap_Class  clazz,\n               FT_Pointer     init_data,\n               FT_CharMap     charmap,\n               FT_CMap       *acmap )\n  {\n    FT_Error   error = FT_Err_Ok;\n    FT_Face    face;\n    FT_Memory  memory;\n    FT_CMap    cmap = NULL;\n\n\n    if ( clazz == NULL || charmap == NULL || charmap->face == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    face   = charmap->face;\n    memory = FT_FACE_MEMORY( face );\n\n    if ( !FT_ALLOC( cmap, clazz->size ) )\n    {\n      cmap->charmap = *charmap;\n      cmap->clazz   = clazz;\n\n      if ( clazz->init )\n      {\n        error = clazz->init( cmap, init_data );\n        if ( error )\n          goto Fail;\n      }\n\n      /* add it to our list of charmaps */\n      if ( FT_RENEW_ARRAY( face->charmaps,\n                           face->num_charmaps,\n                           face->num_charmaps + 1 ) )\n        goto Fail;\n\n      face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap;\n    }\n\n  Exit:\n    if ( acmap )\n      *acmap = cmap;\n\n    return error;\n\n  Fail:\n    ft_cmap_done_internal( cmap );\n    cmap = NULL;\n    goto Exit;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt )\n  FT_Get_Char_Index( FT_Face   face,\n                     FT_ULong  charcode )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( face && face->charmap )\n    {\n      FT_CMap  cmap = FT_CMAP( face->charmap );\n\n\n      if ( charcode > 0xFFFFFFFFUL )\n      {\n        FT_TRACE1(( \"FT_Get_Char_Index: too large charcode\" ));\n        FT_TRACE1(( \" 0x%x is truncated\\n\", charcode ));\n      }\n      result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode );\n    }\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_ULong )\n  FT_Get_First_Char( FT_Face   face,\n                     FT_UInt  *agindex )\n  {\n    FT_ULong  result = 0;\n    FT_UInt   gindex = 0;\n\n\n    if ( face && face->charmap && face->num_glyphs )\n    {\n      gindex = FT_Get_Char_Index( face, 0 );\n      if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs )\n        result = FT_Get_Next_Char( face, 0, &gindex );\n    }\n\n    if ( agindex )\n      *agindex = gindex;\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_ULong )\n  FT_Get_Next_Char( FT_Face   face,\n                    FT_ULong  charcode,\n                    FT_UInt  *agindex )\n  {\n    FT_ULong  result = 0;\n    FT_UInt   gindex = 0;\n\n\n    if ( face && face->charmap && face->num_glyphs )\n    {\n      FT_UInt32  code = (FT_UInt32)charcode;\n      FT_CMap    cmap = FT_CMAP( face->charmap );\n\n\n      do {\n        gindex = cmap->clazz->char_next( cmap, &code );\n      } while ( gindex >= (FT_UInt)face->num_glyphs );\n\n      result = ( gindex == 0 ) ? 0 : code;\n    }\n\n    if ( agindex )\n      *agindex = gindex;\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt )\n  FT_Face_GetCharVariantIndex( FT_Face   face,\n                               FT_ULong  charcode,\n                               FT_ULong  variantSelector )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( face && face->charmap &&\n        face->charmap->encoding == FT_ENCODING_UNICODE )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n      FT_CMap     ucmap = FT_CMAP( face->charmap );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap  vcmap = FT_CMAP( charmap );\n\n\n        if ( charcode > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large charcode\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", charcode ));\n        }\n        if ( variantSelector > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large variantSelector\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", variantSelector ));\n        }\n\n        result = vcmap->clazz->char_var_index( vcmap, ucmap,\n                                               (FT_UInt32)charcode,\n                                               (FT_UInt32)variantSelector );\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Int )\n  FT_Face_GetCharVariantIsDefault( FT_Face   face,\n                                   FT_ULong  charcode,\n                                   FT_ULong  variantSelector )\n  {\n    FT_Int  result = -1;\n\n\n    if ( face )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap  vcmap = FT_CMAP( charmap );\n\n\n        if ( charcode > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large charcode\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", charcode ));\n        }\n        if ( variantSelector > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large variantSelector\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", variantSelector ));\n        }\n\n        result = vcmap->clazz->char_var_default( vcmap,\n                                                 (FT_UInt32)charcode,\n                                                 (FT_UInt32)variantSelector );\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt32* )\n  FT_Face_GetVariantSelectors( FT_Face  face )\n  {\n    FT_UInt32  *result = NULL;\n\n\n    if ( face )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap    vcmap  = FT_CMAP( charmap );\n        FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n        result = vcmap->clazz->variant_list( vcmap, memory );\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt32* )\n  FT_Face_GetVariantsOfChar( FT_Face   face,\n                             FT_ULong  charcode )\n  {\n    FT_UInt32  *result = NULL;\n\n\n    if ( face )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap    vcmap  = FT_CMAP( charmap );\n        FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n        if ( charcode > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large charcode\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", charcode ));\n        }\n\n        result = vcmap->clazz->charvariant_list( vcmap, memory,\n                                                 (FT_UInt32)charcode );\n      }\n    }\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt32* )\n  FT_Face_GetCharsOfVariant( FT_Face   face,\n                             FT_ULong  variantSelector )\n  {\n    FT_UInt32  *result = NULL;\n\n\n    if ( face )\n    {\n      FT_CharMap  charmap = find_variant_selector_charmap( face );\n\n\n      if ( charmap != NULL )\n      {\n        FT_CMap    vcmap  = FT_CMAP( charmap );\n        FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n        if ( variantSelector > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"FT_Get_Char_Index: too large variantSelector\" ));\n          FT_TRACE1(( \" 0x%x is truncated\\n\", variantSelector ));\n        }\n\n        result = vcmap->clazz->variantchar_list( vcmap, memory,\n                                                 (FT_UInt32)variantSelector );\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_UInt )\n  FT_Get_Name_Index( FT_Face     face,\n                     FT_String*  glyph_name )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( face && FT_HAS_GLYPH_NAMES( face ) )\n    {\n      FT_Service_GlyphDict  service;\n\n\n      FT_FACE_LOOKUP_SERVICE( face,\n                              service,\n                              GLYPH_DICT );\n\n      if ( service && service->name_index )\n        result = service->name_index( face, glyph_name );\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Glyph_Name( FT_Face     face,\n                     FT_UInt     glyph_index,\n                     FT_Pointer  buffer,\n                     FT_UInt     buffer_max )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    /* clean up buffer */\n    if ( buffer && buffer_max > 0 )\n      ((FT_Byte*)buffer)[0] = 0;\n\n    if ( face                                     &&\n         (FT_Long)glyph_index <= face->num_glyphs &&\n         FT_HAS_GLYPH_NAMES( face )               )\n    {\n      FT_Service_GlyphDict  service;\n\n\n      FT_FACE_LOOKUP_SERVICE( face,\n                              service,\n                              GLYPH_DICT );\n\n      if ( service && service->get_name )\n        error = service->get_name( face, glyph_index, buffer, buffer_max );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( const char* )\n  FT_Get_Postscript_Name( FT_Face  face )\n  {\n    const char*  result = NULL;\n\n\n    if ( !face )\n      goto Exit;\n\n    if ( !result )\n    {\n      FT_Service_PsFontName  service;\n\n\n      FT_FACE_LOOKUP_SERVICE( face,\n                              service,\n                              POSTSCRIPT_FONT_NAME );\n\n      if ( service && service->get_ps_font_name )\n        result = service->get_ps_font_name( face );\n    }\n\n  Exit:\n    return result;\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( void* )\n  FT_Get_Sfnt_Table( FT_Face      face,\n                     FT_Sfnt_Tag  tag )\n  {\n    void*                  table = 0;\n    FT_Service_SFNT_Table  service;\n\n\n    if ( face && FT_IS_SFNT( face ) )\n    {\n      FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );\n      if ( service != NULL )\n        table = service->get_table( face, tag );\n    }\n\n    return table;\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Load_Sfnt_Table( FT_Face    face,\n                      FT_ULong   tag,\n                      FT_Long    offset,\n                      FT_Byte*   buffer,\n                      FT_ULong*  length )\n  {\n    FT_Service_SFNT_Table  service;\n\n\n    if ( !face || !FT_IS_SFNT( face ) )\n      return FT_THROW( Invalid_Face_Handle );\n\n    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );\n    if ( service == NULL )\n      return FT_THROW( Unimplemented_Feature );\n\n    return service->load_table( face, tag, offset, buffer, length );\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Sfnt_Table_Info( FT_Face    face,\n                      FT_UInt    table_index,\n                      FT_ULong  *tag,\n                      FT_ULong  *length )\n  {\n    FT_Service_SFNT_Table  service;\n    FT_ULong               offset;\n\n\n    if ( !face || !FT_IS_SFNT( face ) )\n      return FT_THROW( Invalid_Face_Handle );\n\n    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );\n    if ( service == NULL )\n      return FT_THROW( Unimplemented_Feature );\n\n    return service->table_info( face, table_index, tag, &offset, length );\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( FT_ULong )\n  FT_Get_CMap_Language_ID( FT_CharMap  charmap )\n  {\n    FT_Service_TTCMaps  service;\n    FT_Face             face;\n    TT_CMapInfo         cmap_info;\n\n\n    if ( !charmap || !charmap->face )\n      return 0;\n\n    face = charmap->face;\n    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );\n    if ( service == NULL )\n      return 0;\n    if ( service->get_cmap_info( charmap, &cmap_info ))\n      return 0;\n\n    return cmap_info.language;\n  }\n\n\n  /* documentation is in tttables.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_Get_CMap_Format( FT_CharMap  charmap )\n  {\n    FT_Service_TTCMaps  service;\n    FT_Face             face;\n    TT_CMapInfo         cmap_info;\n\n\n    if ( !charmap || !charmap->face )\n      return -1;\n\n    face = charmap->face;\n    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );\n    if ( service == NULL )\n      return -1;\n    if ( service->get_cmap_info( charmap, &cmap_info ))\n      return -1;\n\n    return cmap_info.format;\n  }\n\n\n  /* documentation is in ftsizes.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Activate_Size( FT_Size  size )\n  {\n    FT_Face  face;\n\n\n    if ( size == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    face = size->face;\n    if ( face == NULL || face->driver == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    /* we don't need anything more complex than that; all size objects */\n    /* are already listed by the face                                  */\n    face->size = size;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                        R E N D E R E R S                        ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* lookup a renderer by glyph format in the library's list */\n  FT_BASE_DEF( FT_Renderer )\n  FT_Lookup_Renderer( FT_Library       library,\n                      FT_Glyph_Format  format,\n                      FT_ListNode*     node )\n  {\n    FT_ListNode  cur;\n    FT_Renderer  result = 0;\n\n\n    if ( !library )\n      goto Exit;\n\n    cur = library->renderers.head;\n\n    if ( node )\n    {\n      if ( *node )\n        cur = (*node)->next;\n      *node = 0;\n    }\n\n    while ( cur )\n    {\n      FT_Renderer  renderer = FT_RENDERER( cur->data );\n\n\n      if ( renderer->glyph_format == format )\n      {\n        if ( node )\n          *node = cur;\n\n        result = renderer;\n        break;\n      }\n      cur = cur->next;\n    }\n\n  Exit:\n    return result;\n  }\n\n\n  static FT_Renderer\n  ft_lookup_glyph_renderer( FT_GlyphSlot  slot )\n  {\n    FT_Face      face    = slot->face;\n    FT_Library   library = FT_FACE_LIBRARY( face );\n    FT_Renderer  result  = library->cur_renderer;\n\n\n    if ( !result || result->glyph_format != slot->format )\n      result = FT_Lookup_Renderer( library, slot->format, 0 );\n\n    return result;\n  }\n\n\n  static void\n  ft_set_current_renderer( FT_Library  library )\n  {\n    FT_Renderer  renderer;\n\n\n    renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 );\n    library->cur_renderer = renderer;\n  }\n\n\n  static FT_Error\n  ft_add_renderer( FT_Module  module )\n  {\n    FT_Library   library = module->library;\n    FT_Memory    memory  = library->memory;\n    FT_Error     error;\n    FT_ListNode  node    = NULL;\n\n\n    if ( FT_NEW( node ) )\n      goto Exit;\n\n    {\n      FT_Renderer         render = FT_RENDERER( module );\n      FT_Renderer_Class*  clazz  = (FT_Renderer_Class*)module->clazz;\n\n\n      render->clazz        = clazz;\n      render->glyph_format = clazz->glyph_format;\n\n      /* allocate raster object if needed */\n      if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&\n           clazz->raster_class->raster_new                )\n      {\n        error = clazz->raster_class->raster_new( memory, &render->raster );\n        if ( error )\n          goto Fail;\n\n        render->raster_render = clazz->raster_class->raster_render;\n        render->render        = clazz->render_glyph;\n      }\n\n      /* add to list */\n      node->data = module;\n      FT_List_Add( &library->renderers, node );\n\n      ft_set_current_renderer( library );\n    }\n\n  Fail:\n    if ( error )\n      FT_FREE( node );\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  ft_remove_renderer( FT_Module  module )\n  {\n    FT_Library   library = module->library;\n    FT_Memory    memory  = library->memory;\n    FT_ListNode  node;\n\n\n    node = FT_List_Find( &library->renderers, module );\n    if ( node )\n    {\n      FT_Renderer  render = FT_RENDERER( module );\n\n\n      /* release raster object, if any */\n      if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&\n           render->raster                                         )\n        render->clazz->raster_class->raster_done( render->raster );\n\n      /* remove from list */\n      FT_List_Remove( &library->renderers, node );\n      FT_FREE( node );\n\n      ft_set_current_renderer( library );\n    }\n  }\n\n\n  /* documentation is in ftrender.h */\n\n  FT_EXPORT_DEF( FT_Renderer )\n  FT_Get_Renderer( FT_Library       library,\n                   FT_Glyph_Format  format )\n  {\n    /* test for valid `library' delayed to FT_Lookup_Renderer() */\n\n    return FT_Lookup_Renderer( library, format, 0 );\n  }\n\n\n  /* documentation is in ftrender.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Set_Renderer( FT_Library     library,\n                   FT_Renderer    renderer,\n                   FT_UInt        num_params,\n                   FT_Parameter*  parameters )\n  {\n    FT_ListNode  node;\n    FT_Error     error = FT_Err_Ok;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !renderer )\n      return FT_THROW( Invalid_Argument );\n\n    node = FT_List_Find( &library->renderers, renderer );\n    if ( !node )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_List_Up( &library->renderers, node );\n\n    if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE )\n      library->cur_renderer = renderer;\n\n    if ( num_params > 0 )\n    {\n      FT_Renderer_SetModeFunc  set_mode = renderer->clazz->set_mode;\n\n\n      for ( ; num_params > 0; num_params-- )\n      {\n        error = set_mode( renderer, parameters->tag, parameters->data );\n        if ( error )\n          break;\n        parameters++;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Render_Glyph_Internal( FT_Library      library,\n                            FT_GlyphSlot    slot,\n                            FT_Render_Mode  render_mode )\n  {\n    FT_Error     error = FT_Err_Ok;\n    FT_Renderer  renderer;\n\n\n    /* if it is already a bitmap, no need to do anything */\n    switch ( slot->format )\n    {\n    case FT_GLYPH_FORMAT_BITMAP:   /* already a bitmap, don't do anything */\n      break;\n\n    default:\n      {\n        FT_ListNode  node   = 0;\n        FT_Bool      update = 0;\n\n\n        /* small shortcut for the very common case */\n        if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n        {\n          renderer = library->cur_renderer;\n          node     = library->renderers.head;\n        }\n        else\n          renderer = FT_Lookup_Renderer( library, slot->format, &node );\n\n        error = FT_ERR( Unimplemented_Feature );\n        while ( renderer )\n        {\n          error = renderer->render( renderer, slot, render_mode, NULL );\n          if ( !error                                   ||\n               FT_ERR_NEQ( error, Cannot_Render_Glyph ) )\n            break;\n\n          /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */\n          /* is unsupported by the current renderer for this glyph image */\n          /* format.                                                     */\n\n          /* now, look for another renderer that supports the same */\n          /* format.                                               */\n          renderer = FT_Lookup_Renderer( library, slot->format, &node );\n          update   = 1;\n        }\n\n        /* if we changed the current renderer for the glyph image format */\n        /* we need to select it as the next current one                  */\n        if ( !error && update && renderer )\n          FT_Set_Renderer( library, renderer, 0, 0 );\n      }\n    }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_bitmap\n\n    /* we convert to a single bitmap format for computing the checksum */\n    {\n      FT_Bitmap  bitmap;\n      FT_Error   err;\n\n\n      FT_Bitmap_New( &bitmap );\n\n      err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 );\n      if ( !err )\n      {\n        MD5_CTX        ctx;\n        unsigned char  md5[16];\n        int            i;\n\n\n        MD5_Init( &ctx);\n        MD5_Update( &ctx, bitmap.buffer, bitmap.rows * bitmap.pitch );\n        MD5_Final( md5, &ctx );\n\n        FT_TRACE3(( \"MD5 checksum for %dx%d bitmap:\\n\"\n                    \"  \",\n                    bitmap.rows, bitmap.pitch ));\n        for ( i = 0; i < 16; i++ )\n          FT_TRACE3(( \"%02X\", md5[i] ));\n        FT_TRACE3(( \"\\n\" ));\n      }\n\n      FT_Bitmap_Done( library, &bitmap );\n    }\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_objs\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Render_Glyph( FT_GlyphSlot    slot,\n                   FT_Render_Mode  render_mode )\n  {\n    FT_Library  library;\n\n\n    if ( !slot || !slot->face )\n      return FT_THROW( Invalid_Argument );\n\n    library = FT_FACE_LIBRARY( slot->face );\n\n    return FT_Render_Glyph_Internal( library, slot, render_mode );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                         M O D U L E S                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Destroy_Module                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroys a given module object.  For drivers, this also destroys   */\n  /*    all child faces.                                                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    module :: A handle to the target driver object.                    */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The driver _must_ be LOCKED!                                       */\n  /*                                                                       */\n  static void\n  Destroy_Module( FT_Module  module )\n  {\n    FT_Memory         memory  = module->memory;\n    FT_Module_Class*  clazz   = module->clazz;\n    FT_Library        library = module->library;\n\n\n    if ( library && library->auto_hinter == module )\n      library->auto_hinter = 0;\n\n    /* if the module is a renderer */\n    if ( FT_MODULE_IS_RENDERER( module ) )\n      ft_remove_renderer( module );\n\n    /* if the module is a font driver, add some steps */\n    if ( FT_MODULE_IS_DRIVER( module ) )\n      Destroy_Driver( FT_DRIVER( module ) );\n\n    /* finalize the module object */\n    if ( clazz->module_done )\n      clazz->module_done( module );\n\n    /* discard it */\n    FT_FREE( module );\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Add_Module( FT_Library              library,\n                 const FT_Module_Class*  clazz )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n    FT_Module  module;\n    FT_UInt    nn;\n\n\n#define FREETYPE_VER_FIXED  ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \\\n                                FREETYPE_MINOR                  )\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !clazz )\n      return FT_THROW( Invalid_Argument );\n\n    /* check freetype version */\n    if ( clazz->module_requires > FREETYPE_VER_FIXED )\n      return FT_THROW( Invalid_Version );\n\n    /* look for a module with the same name in the library's table */\n    for ( nn = 0; nn < library->num_modules; nn++ )\n    {\n      module = library->modules[nn];\n      if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 )\n      {\n        /* this installed module has the same name, compare their versions */\n        if ( clazz->module_version <= module->clazz->module_version )\n          return FT_THROW( Lower_Module_Version );\n\n        /* remove the module from our list, then exit the loop to replace */\n        /* it by our new version..                                        */\n        FT_Remove_Module( library, module );\n        break;\n      }\n    }\n\n    memory = library->memory;\n    error  = FT_Err_Ok;\n\n    if ( library->num_modules >= FT_MAX_MODULES )\n    {\n      error = FT_THROW( Too_Many_Drivers );\n      goto Exit;\n    }\n\n    /* allocate module object */\n    if ( FT_ALLOC( module, clazz->module_size ) )\n      goto Exit;\n\n    /* base initialization */\n    module->library = library;\n    module->memory  = memory;\n    module->clazz   = (FT_Module_Class*)clazz;\n\n    /* check whether the module is a renderer - this must be performed */\n    /* before the normal module initialization                         */\n    if ( FT_MODULE_IS_RENDERER( module ) )\n    {\n      /* add to the renderers list */\n      error = ft_add_renderer( module );\n      if ( error )\n        goto Fail;\n    }\n\n    /* is the module a auto-hinter? */\n    if ( FT_MODULE_IS_HINTER( module ) )\n      library->auto_hinter = module;\n\n    /* if the module is a font driver */\n    if ( FT_MODULE_IS_DRIVER( module ) )\n    {\n      /* allocate glyph loader if needed */\n      FT_Driver  driver = FT_DRIVER( module );\n\n\n      driver->clazz = (FT_Driver_Class)module->clazz;\n      if ( FT_DRIVER_USES_OUTLINES( driver ) )\n      {\n        error = FT_GlyphLoader_New( memory, &driver->glyph_loader );\n        if ( error )\n          goto Fail;\n      }\n    }\n\n    if ( clazz->module_init )\n    {\n      error = clazz->module_init( module );\n      if ( error )\n        goto Fail;\n    }\n\n    /* add module to the library's table */\n    library->modules[library->num_modules++] = module;\n\n  Exit:\n    return error;\n\n  Fail:\n    if ( FT_MODULE_IS_DRIVER( module ) )\n    {\n      FT_Driver  driver = FT_DRIVER( module );\n\n\n      if ( FT_DRIVER_USES_OUTLINES( driver ) )\n        FT_GlyphLoader_Done( driver->glyph_loader );\n    }\n\n    if ( FT_MODULE_IS_RENDERER( module ) )\n    {\n      FT_Renderer  renderer = FT_RENDERER( module );\n\n\n      if ( renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&\n           renderer->raster                                         )\n        renderer->clazz->raster_class->raster_done( renderer->raster );\n    }\n\n    FT_FREE( module );\n    goto Exit;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Module )\n  FT_Get_Module( FT_Library   library,\n                 const char*  module_name )\n  {\n    FT_Module   result = 0;\n    FT_Module*  cur;\n    FT_Module*  limit;\n\n\n    if ( !library || !module_name )\n      return result;\n\n    cur   = library->modules;\n    limit = cur + library->num_modules;\n\n    for ( ; cur < limit; cur++ )\n      if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 )\n      {\n        result = cur[0];\n        break;\n      }\n\n    return result;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( const void* )\n  FT_Get_Module_Interface( FT_Library   library,\n                           const char*  mod_name )\n  {\n    FT_Module  module;\n\n\n    /* test for valid `library' delayed to FT_Get_Module() */\n\n    module = FT_Get_Module( library, mod_name );\n\n    return module ? module->clazz->module_interface : 0;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_module_get_service( FT_Module    module,\n                         const char*  service_id )\n  {\n    FT_Pointer  result = NULL;\n\n\n    if ( module )\n    {\n      FT_ASSERT( module->clazz && module->clazz->get_interface );\n\n      /* first, look for the service in the module */\n      if ( module->clazz->get_interface )\n        result = module->clazz->get_interface( module, service_id );\n\n      if ( result == NULL )\n      {\n        /* we didn't find it, look in all other modules then */\n        FT_Library  library = module->library;\n        FT_Module*  cur     = library->modules;\n        FT_Module*  limit   = cur + library->num_modules;\n\n\n        for ( ; cur < limit; cur++ )\n        {\n          if ( cur[0] != module )\n          {\n            FT_ASSERT( cur[0]->clazz );\n\n            if ( cur[0]->clazz->get_interface )\n            {\n              result = cur[0]->clazz->get_interface( cur[0], service_id );\n              if ( result != NULL )\n                break;\n            }\n          }\n        }\n      }\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Remove_Module( FT_Library  library,\n                    FT_Module   module )\n  {\n    /* try to find the module from the table, then remove it from there */\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( module )\n    {\n      FT_Module*  cur   = library->modules;\n      FT_Module*  limit = cur + library->num_modules;\n\n\n      for ( ; cur < limit; cur++ )\n      {\n        if ( cur[0] == module )\n        {\n          /* remove it from the table */\n          library->num_modules--;\n          limit--;\n          while ( cur < limit )\n          {\n            cur[0] = cur[1];\n            cur++;\n          }\n          limit[0] = 0;\n\n          /* destroy the module */\n          Destroy_Module( module );\n\n          return FT_Err_Ok;\n        }\n      }\n    }\n    return FT_THROW( Invalid_Driver_Handle );\n  }\n\n\n  FT_Error\n  ft_property_do( FT_Library        library,\n                  const FT_String*  module_name,\n                  const FT_String*  property_name,\n                  void*             value,\n                  FT_Bool           set )\n  {\n    FT_Module*           cur;\n    FT_Module*           limit;\n    FT_Module_Interface  interface;\n\n    FT_Service_Properties  service;\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n    const FT_String*  set_name  = \"FT_Property_Set\";\n    const FT_String*  get_name  = \"FT_Property_Get\";\n    const FT_String*  func_name = set ? set_name : get_name;\n#endif\n\n    FT_Bool  missing_func;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !module_name || !property_name || !value )\n      return FT_THROW( Invalid_Argument );\n\n    cur   = library->modules;\n    limit = cur + library->num_modules;\n\n    /* search module */\n    for ( ; cur < limit; cur++ )\n      if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) )\n        break;\n\n    if ( cur == limit )\n    {\n      FT_ERROR(( \"%s: can't find module `%s'\\n\",\n                 func_name, module_name ));\n      return FT_THROW( Missing_Module );\n    }\n\n    /* check whether we have a service interface */\n    if ( !cur[0]->clazz->get_interface )\n    {\n      FT_ERROR(( \"%s: module `%s' doesn't support properties\\n\",\n                 func_name, module_name ));\n      return FT_THROW( Unimplemented_Feature );\n    }\n\n    /* search property service */\n    interface = cur[0]->clazz->get_interface( cur[0],\n                                              FT_SERVICE_ID_PROPERTIES );\n    if ( !interface )\n    {\n      FT_ERROR(( \"%s: module `%s' doesn't support properties\\n\",\n                 func_name, module_name ));\n      return FT_THROW( Unimplemented_Feature );\n    }\n\n    service = (FT_Service_Properties)interface;\n\n    if ( set )\n      missing_func = !service->set_property;\n    else\n      missing_func = !service->get_property;\n\n    if ( missing_func )\n    {\n      FT_ERROR(( \"%s: property service of module `%s' is broken\\n\",\n                 func_name, module_name ));\n      return FT_THROW( Unimplemented_Feature );\n    }\n\n    return set ? service->set_property( cur[0], property_name, value )\n               : service->get_property( cur[0], property_name, value );\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_Error\n  FT_Property_Set( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   const void*       value )\n  {\n    return ft_property_do( library,\n                           module_name,\n                           property_name,\n                           (void*)value,\n                           TRUE );\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_Error\n  FT_Property_Get( FT_Library        library,\n                   const FT_String*  module_name,\n                   const FT_String*  property_name,\n                   void*             value )\n  {\n    return ft_property_do( library,\n                           module_name,\n                           property_name,\n                           value,\n                           FALSE );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                         L I B R A R Y                           ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Reference_Library( FT_Library  library )\n  {\n    library->refcount++;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_New_Library( FT_Memory    memory,\n                  FT_Library  *alibrary )\n  {\n    FT_Library  library = NULL;\n    FT_Error    error;\n\n\n    if ( !memory )\n      return FT_THROW( Invalid_Argument );\n\n#ifdef FT_DEBUG_LEVEL_ERROR\n    /* init debugging support */\n    ft_debug_init();\n#endif\n\n    /* first of all, allocate the library object */\n    if ( FT_NEW( library ) )\n      return error;\n\n    library->memory = memory;\n\n#ifdef FT_CONFIG_OPTION_PIC\n    /* initialize position independent code containers */\n    error = ft_pic_container_init( library );\n    if ( error )\n      goto Fail;\n#endif\n\n    /* allocate the render pool */\n    library->raster_pool_size = FT_RENDER_POOL_SIZE;\n#if FT_RENDER_POOL_SIZE > 0\n    if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) )\n      goto Fail;\n#endif\n\n    library->version_major = FREETYPE_MAJOR;\n    library->version_minor = FREETYPE_MINOR;\n    library->version_patch = FREETYPE_PATCH;\n\n    library->refcount = 1;\n\n    /* That's ok now */\n    *alibrary = library;\n\n    return FT_Err_Ok;\n\n  Fail:\n#ifdef FT_CONFIG_OPTION_PIC\n    ft_pic_container_destroy( library );\n#endif\n    FT_FREE( library );\n    return error;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Library_Version( FT_Library   library,\n                      FT_Int      *amajor,\n                      FT_Int      *aminor,\n                      FT_Int      *apatch )\n  {\n    FT_Int  major = 0;\n    FT_Int  minor = 0;\n    FT_Int  patch = 0;\n\n\n    if ( library )\n    {\n      major = library->version_major;\n      minor = library->version_minor;\n      patch = library->version_patch;\n    }\n\n    if ( amajor )\n      *amajor = major;\n\n    if ( aminor )\n      *aminor = minor;\n\n    if ( apatch )\n      *apatch = patch;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Done_Library( FT_Library  library )\n  {\n    FT_Memory  memory;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    library->refcount--;\n    if ( library->refcount > 0 )\n      goto Exit;\n\n    memory = library->memory;\n\n    /*\n     * Close all faces in the library.  If we don't do this, we can have\n     * some subtle memory leaks.\n     *\n     * Example:\n     *\n     *  - the cff font driver uses the pshinter module in cff_size_done\n     *  - if the pshinter module is destroyed before the cff font driver,\n     *    opened FT_Face objects managed by the driver are not properly\n     *    destroyed, resulting in a memory leak\n     *\n     * Some faces are dependent on other faces, like Type42 faces that\n     * depend on TrueType faces synthesized internally.\n     *\n     * The order of drivers should be specified in driver_name[].\n     */\n    {\n      FT_UInt      m, n;\n      const char*  driver_name[] = { \"type42\", NULL };\n\n\n      for ( m = 0;\n            m < sizeof ( driver_name ) / sizeof ( driver_name[0] );\n            m++ )\n      {\n        for ( n = 0; n < library->num_modules; n++ )\n        {\n          FT_Module    module      = library->modules[n];\n          const char*  module_name = module->clazz->module_name;\n          FT_List      faces;\n\n\n          if ( driver_name[m]                                &&\n               ft_strcmp( module_name, driver_name[m] ) != 0 )\n            continue;\n\n          if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 )\n            continue;\n\n          FT_TRACE7(( \"FT_Done_Library: close faces for %s\\n\", module_name ));\n\n          faces = &FT_DRIVER( module )->faces_list;\n          while ( faces->head )\n          {\n            FT_Done_Face( FT_FACE( faces->head->data ) );\n            if ( faces->head )\n              FT_TRACE0(( \"FT_Done_Library: failed to free some faces\\n\" ));\n          }\n        }\n      }\n    }\n\n    /* Close all other modules in the library */\n#if 1\n    /* XXX Modules are removed in the reversed order so that  */\n    /* type42 module is removed before truetype module.  This */\n    /* avoids double free in some occasions.  It is a hack.   */\n    while ( library->num_modules > 0 )\n      FT_Remove_Module( library,\n                        library->modules[library->num_modules - 1] );\n#else\n    {\n      FT_UInt  n;\n\n\n      for ( n = 0; n < library->num_modules; n++ )\n      {\n        FT_Module  module = library->modules[n];\n\n\n        if ( module )\n        {\n          Destroy_Module( module );\n          library->modules[n] = 0;\n        }\n      }\n    }\n#endif\n\n    /* Destroy raster objects */\n    FT_FREE( library->raster_pool );\n    library->raster_pool_size = 0;\n\n#ifdef FT_CONFIG_OPTION_PIC\n    /* Destroy pic container contents */\n    ft_pic_container_destroy( library );\n#endif\n\n    FT_FREE( library );\n\n  Exit:\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Set_Debug_Hook( FT_Library         library,\n                     FT_UInt            hook_index,\n                     FT_DebugHook_Func  debug_hook )\n  {\n    if ( library && debug_hook &&\n         hook_index <\n           ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) )\n      library->debug_hooks[hook_index] = debug_hook;\n  }\n\n\n  /* documentation is in ftmodapi.h */\n\n  FT_EXPORT_DEF( FT_TrueTypeEngineType )\n  FT_Get_TrueType_Engine_Type( FT_Library  library )\n  {\n    FT_TrueTypeEngineType  result = FT_TRUETYPE_ENGINE_TYPE_NONE;\n\n\n    if ( library )\n    {\n      FT_Module  module = FT_Get_Module( library, \"truetype\" );\n\n\n      if ( module )\n      {\n        FT_Service_TrueTypeEngine  service;\n\n\n        service = (FT_Service_TrueTypeEngine)\n                    ft_module_get_service( module,\n                                           FT_SERVICE_ID_TRUETYPE_ENGINE );\n        if ( service )\n          result = service->engine_type;\n      }\n    }\n\n    return result;\n  }\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  FT_BASE_DEF( FT_Error )\n  ft_stub_set_char_sizes( FT_Size     size,\n                          FT_F26Dot6  width,\n                          FT_F26Dot6  height,\n                          FT_UInt     horz_res,\n                          FT_UInt     vert_res )\n  {\n    FT_Size_RequestRec  req;\n    FT_Driver           driver = size->face->driver;\n\n\n    if ( driver->clazz->request_size )\n    {\n      req.type   = FT_SIZE_REQUEST_TYPE_NOMINAL;\n      req.width  = width;\n      req.height = height;\n\n      if ( horz_res == 0 )\n        horz_res = vert_res;\n\n      if ( vert_res == 0 )\n        vert_res = horz_res;\n\n      if ( horz_res == 0 )\n        horz_res = vert_res = 72;\n\n      req.horiResolution = horz_res;\n      req.vertResolution = vert_res;\n\n      return driver->clazz->request_size( size, &req );\n    }\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  ft_stub_set_pixel_sizes( FT_Size  size,\n                           FT_UInt  width,\n                           FT_UInt  height )\n  {\n    FT_Size_RequestRec  req;\n    FT_Driver           driver = size->face->driver;\n\n\n    if ( driver->clazz->request_size )\n    {\n      req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;\n      req.width          = width  << 6;\n      req.height         = height << 6;\n      req.horiResolution = 0;\n      req.vertResolution = 0;\n\n      return driver->clazz->request_size( size, &req );\n    }\n\n    return 0;\n  }\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,\n                        FT_UInt       sub_index,\n                        FT_Int       *p_index,\n                        FT_UInt      *p_flags,\n                        FT_Int       *p_arg1,\n                        FT_Int       *p_arg2,\n                        FT_Matrix    *p_transform )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    if ( glyph                                      &&\n         glyph->subglyphs                           &&\n         glyph->format == FT_GLYPH_FORMAT_COMPOSITE &&\n         sub_index < glyph->num_subglyphs           )\n    {\n      FT_SubGlyph  subg = glyph->subglyphs + sub_index;\n\n\n      *p_index     = subg->index;\n      *p_flags     = subg->flags;\n      *p_arg1      = subg->arg1;\n      *p_arg2      = subg->arg2;\n      *p_transform = subg->transform;\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftotval.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftotval.c                                                              */\n/*                                                                         */\n/*    FreeType API for validating OpenType tables (body).                  */\n/*                                                                         */\n/*  Copyright 2004, 2006, 2008, 2010, 2013 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_OPENTYPE_VALIDATE_H\n#include FT_OPENTYPE_VALIDATE_H\n\n\n  /* documentation is in ftotval.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_OpenType_Validate( FT_Face    face,\n                        FT_UInt    validation_flags,\n                        FT_Bytes  *BASE_table,\n                        FT_Bytes  *GDEF_table,\n                        FT_Bytes  *GPOS_table,\n                        FT_Bytes  *GSUB_table,\n                        FT_Bytes  *JSTF_table )\n  {\n    FT_Service_OTvalidate  service;\n    FT_Error               error;\n\n\n    if ( !face )\n    {\n      error = FT_THROW( Invalid_Face_Handle );\n      goto Exit;\n    }\n\n    if ( !( BASE_table &&\n            GDEF_table &&\n            GPOS_table &&\n            GSUB_table &&\n            JSTF_table ) )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE );\n\n    if ( service )\n      error = service->validate( face,\n                                 validation_flags,\n                                 BASE_table,\n                                 GDEF_table,\n                                 GPOS_table,\n                                 GSUB_table,\n                                 JSTF_table );\n    else\n      error = FT_THROW( Unimplemented_Feature );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_EXPORT_DEF( void )\n  FT_OpenType_Free( FT_Face   face,\n                    FT_Bytes  table )\n  {\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = FT_FACE_MEMORY( face );\n\n    FT_FREE( table );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftoutln.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftoutln.c                                                              */\n/*                                                                         */\n/*    FreeType outline management (body).                                  */\n/*                                                                         */\n/*  Copyright 1996-2008, 2010, 2012-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* All functions are declared in freetype.h.                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_OUTLINE_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_TRIGONOMETRY_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_outline\n\n\n  static\n  const FT_Outline  null_outline = { 0, 0, 0, 0, 0, 0 };\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Decompose( FT_Outline*              outline,\n                        const FT_Outline_Funcs*  func_interface,\n                        void*                    user )\n  {\n#undef SCALED\n#define SCALED( x )  ( ( (x) << shift ) - delta )\n\n    FT_Vector   v_last;\n    FT_Vector   v_control;\n    FT_Vector   v_start;\n\n    FT_Vector*  point;\n    FT_Vector*  limit;\n    char*       tags;\n\n    FT_Error    error;\n\n    FT_Int   n;         /* index of contour in outline     */\n    FT_UInt  first;     /* index of first point in contour */\n    FT_Int   tag;       /* current point's state           */\n\n    FT_Int   shift;\n    FT_Pos   delta;\n\n\n    if ( !outline || !func_interface )\n      return FT_THROW( Invalid_Argument );\n\n    shift = func_interface->shift;\n    delta = func_interface->delta;\n    first = 0;\n\n    for ( n = 0; n < outline->n_contours; n++ )\n    {\n      FT_Int  last;  /* index of last point in contour */\n\n\n      FT_TRACE5(( \"FT_Outline_Decompose: Outline %d\\n\", n ));\n\n      last = outline->contours[n];\n      if ( last < 0 )\n        goto Invalid_Outline;\n      limit = outline->points + last;\n\n      v_start   = outline->points[first];\n      v_start.x = SCALED( v_start.x );\n      v_start.y = SCALED( v_start.y );\n\n      v_last   = outline->points[last];\n      v_last.x = SCALED( v_last.x );\n      v_last.y = SCALED( v_last.y );\n\n      v_control = v_start;\n\n      point = outline->points + first;\n      tags  = outline->tags   + first;\n      tag   = FT_CURVE_TAG( tags[0] );\n\n      /* A contour cannot start with a cubic control point! */\n      if ( tag == FT_CURVE_TAG_CUBIC )\n        goto Invalid_Outline;\n\n      /* check first point to determine origin */\n      if ( tag == FT_CURVE_TAG_CONIC )\n      {\n        /* first point is conic control.  Yes, this happens. */\n        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )\n        {\n          /* start at last point if it is on the curve */\n          v_start = v_last;\n          limit--;\n        }\n        else\n        {\n          /* if both first and last points are conic,         */\n          /* start at their middle and record its position    */\n          /* for closure                                      */\n          v_start.x = ( v_start.x + v_last.x ) / 2;\n          v_start.y = ( v_start.y + v_last.y ) / 2;\n\n          v_last = v_start;\n        }\n        point--;\n        tags--;\n      }\n\n      FT_TRACE5(( \"  move to (%.2f, %.2f)\\n\",\n                  v_start.x / 64.0, v_start.y / 64.0 ));\n      error = func_interface->move_to( &v_start, user );\n      if ( error )\n        goto Exit;\n\n      while ( point < limit )\n      {\n        point++;\n        tags++;\n\n        tag = FT_CURVE_TAG( tags[0] );\n        switch ( tag )\n        {\n        case FT_CURVE_TAG_ON:  /* emit a single line_to */\n          {\n            FT_Vector  vec;\n\n\n            vec.x = SCALED( point->x );\n            vec.y = SCALED( point->y );\n\n            FT_TRACE5(( \"  line to (%.2f, %.2f)\\n\",\n                        vec.x / 64.0, vec.y / 64.0 ));\n            error = func_interface->line_to( &vec, user );\n            if ( error )\n              goto Exit;\n            continue;\n          }\n\n        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */\n          v_control.x = SCALED( point->x );\n          v_control.y = SCALED( point->y );\n\n        Do_Conic:\n          if ( point < limit )\n          {\n            FT_Vector  vec;\n            FT_Vector  v_middle;\n\n\n            point++;\n            tags++;\n            tag = FT_CURVE_TAG( tags[0] );\n\n            vec.x = SCALED( point->x );\n            vec.y = SCALED( point->y );\n\n            if ( tag == FT_CURVE_TAG_ON )\n            {\n              FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                          \" with control (%.2f, %.2f)\\n\",\n                          vec.x / 64.0, vec.y / 64.0,\n                          v_control.x / 64.0, v_control.y / 64.0 ));\n              error = func_interface->conic_to( &v_control, &vec, user );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            if ( tag != FT_CURVE_TAG_CONIC )\n              goto Invalid_Outline;\n\n            v_middle.x = ( v_control.x + vec.x ) / 2;\n            v_middle.y = ( v_control.y + vec.y ) / 2;\n\n            FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                        \" with control (%.2f, %.2f)\\n\",\n                        v_middle.x / 64.0, v_middle.y / 64.0,\n                        v_control.x / 64.0, v_control.y / 64.0 ));\n            error = func_interface->conic_to( &v_control, &v_middle, user );\n            if ( error )\n              goto Exit;\n\n            v_control = vec;\n            goto Do_Conic;\n          }\n\n          FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                      \" with control (%.2f, %.2f)\\n\",\n                      v_start.x / 64.0, v_start.y / 64.0,\n                      v_control.x / 64.0, v_control.y / 64.0 ));\n          error = func_interface->conic_to( &v_control, &v_start, user );\n          goto Close;\n\n        default:  /* FT_CURVE_TAG_CUBIC */\n          {\n            FT_Vector  vec1, vec2;\n\n\n            if ( point + 1 > limit                             ||\n                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )\n              goto Invalid_Outline;\n\n            point += 2;\n            tags  += 2;\n\n            vec1.x = SCALED( point[-2].x );\n            vec1.y = SCALED( point[-2].y );\n\n            vec2.x = SCALED( point[-1].x );\n            vec2.y = SCALED( point[-1].y );\n\n            if ( point <= limit )\n            {\n              FT_Vector  vec;\n\n\n              vec.x = SCALED( point->x );\n              vec.y = SCALED( point->y );\n\n              FT_TRACE5(( \"  cubic to (%.2f, %.2f)\"\n                          \" with controls (%.2f, %.2f) and (%.2f, %.2f)\\n\",\n                          vec.x / 64.0, vec.y / 64.0,\n                          vec1.x / 64.0, vec1.y / 64.0,\n                          vec2.x / 64.0, vec2.y / 64.0 ));\n              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            FT_TRACE5(( \"  cubic to (%.2f, %.2f)\"\n                        \" with controls (%.2f, %.2f) and (%.2f, %.2f)\\n\",\n                        v_start.x / 64.0, v_start.y / 64.0,\n                        vec1.x / 64.0, vec1.y / 64.0,\n                        vec2.x / 64.0, vec2.y / 64.0 ));\n            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );\n            goto Close;\n          }\n        }\n      }\n\n      /* close the contour with a line segment */\n      FT_TRACE5(( \"  line to (%.2f, %.2f)\\n\",\n                  v_start.x / 64.0, v_start.y / 64.0 ));\n      error = func_interface->line_to( &v_start, user );\n\n    Close:\n      if ( error )\n        goto Exit;\n\n      first = last + 1;\n    }\n\n    FT_TRACE5(( \"FT_Outline_Decompose: Done\\n\", n ));\n    return FT_Err_Ok;\n\n  Exit:\n    FT_TRACE5(( \"FT_Outline_Decompose: Error %d\\n\", error ));\n    return error;\n\n  Invalid_Outline:\n    return FT_THROW( Invalid_Outline );\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_New_Internal( FT_Memory    memory,\n                           FT_UInt      numPoints,\n                           FT_Int       numContours,\n                           FT_Outline  *anoutline )\n  {\n    FT_Error  error;\n\n\n    if ( !anoutline || !memory )\n      return FT_THROW( Invalid_Argument );\n\n    *anoutline = null_outline;\n\n    if ( numContours < 0                  ||\n         (FT_UInt)numContours > numPoints )\n      return FT_THROW( Invalid_Argument );\n\n    if ( numPoints > FT_OUTLINE_POINTS_MAX )\n      return FT_THROW( Array_Too_Large );\n\n    if ( FT_NEW_ARRAY( anoutline->points,   numPoints   ) ||\n         FT_NEW_ARRAY( anoutline->tags,     numPoints   ) ||\n         FT_NEW_ARRAY( anoutline->contours, numContours ) )\n      goto Fail;\n\n    anoutline->n_points    = (FT_UShort)numPoints;\n    anoutline->n_contours  = (FT_Short)numContours;\n    anoutline->flags      |= FT_OUTLINE_OWNER;\n\n    return FT_Err_Ok;\n\n  Fail:\n    anoutline->flags |= FT_OUTLINE_OWNER;\n    FT_Outline_Done_Internal( memory, anoutline );\n\n    return error;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_New( FT_Library   library,\n                  FT_UInt      numPoints,\n                  FT_Int       numContours,\n                  FT_Outline  *anoutline )\n  {\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    return FT_Outline_New_Internal( library->memory, numPoints,\n                                    numContours, anoutline );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Check( FT_Outline*  outline )\n  {\n    if ( outline )\n    {\n      FT_Int  n_points   = outline->n_points;\n      FT_Int  n_contours = outline->n_contours;\n      FT_Int  end0, end;\n      FT_Int  n;\n\n\n      /* empty glyph? */\n      if ( n_points == 0 && n_contours == 0 )\n        return 0;\n\n      /* check point and contour counts */\n      if ( n_points <= 0 || n_contours <= 0 )\n        goto Bad;\n\n      end0 = end = -1;\n      for ( n = 0; n < n_contours; n++ )\n      {\n        end = outline->contours[n];\n\n        /* note that we don't accept empty contours */\n        if ( end <= end0 || end >= n_points )\n          goto Bad;\n\n        end0 = end;\n      }\n\n      if ( end != n_points - 1 )\n        goto Bad;\n\n      /* XXX: check the tags array */\n      return 0;\n    }\n\n  Bad:\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Copy( const FT_Outline*  source,\n                   FT_Outline        *target )\n  {\n    FT_Int  is_owner;\n\n\n    if ( !source            || !target            ||\n         source->n_points   != target->n_points   ||\n         source->n_contours != target->n_contours )\n      return FT_THROW( Invalid_Argument );\n\n    if ( source == target )\n      return FT_Err_Ok;\n\n    FT_ARRAY_COPY( target->points, source->points, source->n_points );\n\n    FT_ARRAY_COPY( target->tags, source->tags, source->n_points );\n\n    FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );\n\n    /* copy all flags, except the `FT_OUTLINE_OWNER' one */\n    is_owner      = target->flags & FT_OUTLINE_OWNER;\n    target->flags = source->flags;\n\n    target->flags &= ~FT_OUTLINE_OWNER;\n    target->flags |= is_owner;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Done_Internal( FT_Memory    memory,\n                            FT_Outline*  outline )\n  {\n    if ( memory && outline )\n    {\n      if ( outline->flags & FT_OUTLINE_OWNER )\n      {\n        FT_FREE( outline->points   );\n        FT_FREE( outline->tags     );\n        FT_FREE( outline->contours );\n      }\n      *outline = null_outline;\n\n      return FT_Err_Ok;\n    }\n    else\n      return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Done( FT_Library   library,\n                   FT_Outline*  outline )\n  {\n    /* check for valid `outline' in FT_Outline_Done_Internal() */\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    return FT_Outline_Done_Internal( library->memory, outline );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Outline_Get_CBox( const FT_Outline*  outline,\n                       FT_BBox           *acbox )\n  {\n    FT_Pos  xMin, yMin, xMax, yMax;\n\n\n    if ( outline && acbox )\n    {\n      if ( outline->n_points == 0 )\n      {\n        xMin = 0;\n        yMin = 0;\n        xMax = 0;\n        yMax = 0;\n      }\n      else\n      {\n        FT_Vector*  vec   = outline->points;\n        FT_Vector*  limit = vec + outline->n_points;\n\n\n        xMin = xMax = vec->x;\n        yMin = yMax = vec->y;\n        vec++;\n\n        for ( ; vec < limit; vec++ )\n        {\n          FT_Pos  x, y;\n\n\n          x = vec->x;\n          if ( x < xMin ) xMin = x;\n          if ( x > xMax ) xMax = x;\n\n          y = vec->y;\n          if ( y < yMin ) yMin = y;\n          if ( y > yMax ) yMax = y;\n        }\n      }\n      acbox->xMin = xMin;\n      acbox->xMax = xMax;\n      acbox->yMin = yMin;\n      acbox->yMax = yMax;\n    }\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Outline_Translate( const FT_Outline*  outline,\n                        FT_Pos             xOffset,\n                        FT_Pos             yOffset )\n  {\n    FT_UShort   n;\n    FT_Vector*  vec;\n\n\n    if ( !outline )\n      return;\n\n    vec = outline->points;\n\n    for ( n = 0; n < outline->n_points; n++ )\n    {\n      vec->x += xOffset;\n      vec->y += yOffset;\n      vec++;\n    }\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Outline_Reverse( FT_Outline*  outline )\n  {\n    FT_UShort  n;\n    FT_Int     first, last;\n\n\n    if ( !outline )\n      return;\n\n    first = 0;\n\n    for ( n = 0; n < outline->n_contours; n++ )\n    {\n      last  = outline->contours[n];\n\n      /* reverse point table */\n      {\n        FT_Vector*  p = outline->points + first;\n        FT_Vector*  q = outline->points + last;\n        FT_Vector   swap;\n\n\n        while ( p < q )\n        {\n          swap = *p;\n          *p   = *q;\n          *q   = swap;\n          p++;\n          q--;\n        }\n      }\n\n      /* reverse tags table */\n      {\n        char*  p = outline->tags + first;\n        char*  q = outline->tags + last;\n        char   swap;\n\n\n        while ( p < q )\n        {\n          swap = *p;\n          *p   = *q;\n          *q   = swap;\n          p++;\n          q--;\n        }\n      }\n\n      first = last + 1;\n    }\n\n    outline->flags ^= FT_OUTLINE_REVERSE_FILL;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Render( FT_Library         library,\n                     FT_Outline*        outline,\n                     FT_Raster_Params*  params )\n  {\n    FT_Error     error;\n    FT_Bool      update = FALSE;\n    FT_Renderer  renderer;\n    FT_ListNode  node;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    if ( !outline || !params )\n      return FT_THROW( Invalid_Argument );\n\n    renderer = library->cur_renderer;\n    node     = library->renderers.head;\n\n    params->source = (void*)outline;\n\n    error = FT_ERR( Cannot_Render_Glyph );\n    while ( renderer )\n    {\n      error = renderer->raster_render( renderer->raster, params );\n      if ( !error || FT_ERR_NEQ( error, Cannot_Render_Glyph ) )\n        break;\n\n      /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */\n      /* is unsupported by the current renderer for this glyph image */\n      /* format                                                      */\n\n      /* now, look for another renderer that supports the same */\n      /* format                                                */\n      renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,\n                                     &node );\n      update   = TRUE;\n    }\n\n    /* if we changed the current renderer for the glyph image format */\n    /* we need to select it as the next current one                  */\n    if ( !error && update && renderer )\n      FT_Set_Renderer( library, renderer, 0, 0 );\n\n    return error;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Get_Bitmap( FT_Library        library,\n                         FT_Outline*       outline,\n                         const FT_Bitmap  *abitmap )\n  {\n    FT_Raster_Params  params;\n\n\n    if ( !abitmap )\n      return FT_THROW( Invalid_Argument );\n\n    /* other checks are delayed to FT_Outline_Render() */\n\n    params.target = abitmap;\n    params.flags  = 0;\n\n    if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY  ||\n         abitmap->pixel_mode == FT_PIXEL_MODE_LCD   ||\n         abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )\n      params.flags |= FT_RASTER_FLAG_AA;\n\n    return FT_Outline_Render( library, outline, &params );\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_Transform( FT_Vector*        vector,\n                       const FT_Matrix*  matrix )\n  {\n    FT_Pos  xz, yz;\n\n\n    if ( !vector || !matrix )\n      return;\n\n    xz = FT_MulFix( vector->x, matrix->xx ) +\n         FT_MulFix( vector->y, matrix->xy );\n\n    yz = FT_MulFix( vector->x, matrix->yx ) +\n         FT_MulFix( vector->y, matrix->yy );\n\n    vector->x = xz;\n    vector->y = yz;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Outline_Transform( const FT_Outline*  outline,\n                        const FT_Matrix*   matrix )\n  {\n    FT_Vector*  vec;\n    FT_Vector*  limit;\n\n\n    if ( !outline || !matrix )\n      return;\n\n    vec   = outline->points;\n    limit = vec + outline->n_points;\n\n    for ( ; vec < limit; vec++ )\n      FT_Vector_Transform( vec, matrix );\n  }\n\n\n#if 0\n\n#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last )  \\\n  do {                                                     \\\n    (first) = ( c > 0 ) ? (outline)->points +              \\\n                            (outline)->contours[c - 1] + 1 \\\n                        : (outline)->points;               \\\n    (last) = (outline)->points + (outline)->contours[c];   \\\n  } while ( 0 )\n\n\n  /* Is a point in some contour?                     */\n  /*                                                 */\n  /* We treat every point of the contour as if it    */\n  /* it were ON.  That is, we allow false positives, */\n  /* but disallow false negatives.  (XXX really?)    */\n  static FT_Bool\n  ft_contour_has( FT_Outline*  outline,\n                  FT_Short     c,\n                  FT_Vector*   point )\n  {\n    FT_Vector*  first;\n    FT_Vector*  last;\n    FT_Vector*  a;\n    FT_Vector*  b;\n    FT_UInt     n = 0;\n\n\n    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );\n\n    for ( a = first; a <= last; a++ )\n    {\n      FT_Pos  x;\n      FT_Int  intersect;\n\n\n      b = ( a == last ) ? first : a + 1;\n\n      intersect = ( a->y - point->y ) ^ ( b->y - point->y );\n\n      /* a and b are on the same side */\n      if ( intersect >= 0 )\n      {\n        if ( intersect == 0 && a->y == point->y )\n        {\n          if ( ( a->x <= point->x && b->x >= point->x ) ||\n               ( a->x >= point->x && b->x <= point->x ) )\n            return 1;\n        }\n\n        continue;\n      }\n\n      x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y );\n\n      if ( x < point->x )\n        n++;\n      else if ( x == point->x )\n        return 1;\n    }\n\n    return n & 1;\n  }\n\n\n  static FT_Bool\n  ft_contour_enclosed( FT_Outline*  outline,\n                       FT_UShort    c )\n  {\n    FT_Vector*  first;\n    FT_Vector*  last;\n    FT_Short    i;\n\n\n    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );\n\n    for ( i = 0; i < outline->n_contours; i++ )\n    {\n      if ( i != c && ft_contour_has( outline, i, first ) )\n      {\n        FT_Vector*  pt;\n\n\n        for ( pt = first + 1; pt <= last; pt++ )\n          if ( !ft_contour_has( outline, i, pt ) )\n            return 0;\n\n        return 1;\n      }\n    }\n\n    return 0;\n  }\n\n\n  /* This version differs from the public one in that each */\n  /* part (contour not enclosed in another contour) of the */\n  /* outline is checked for orientation.  This is          */\n  /* necessary for some buggy CJK fonts.                   */\n  static FT_Orientation\n  ft_outline_get_orientation( FT_Outline*  outline )\n  {\n    FT_Short        i;\n    FT_Vector*      first;\n    FT_Vector*      last;\n    FT_Orientation  orient = FT_ORIENTATION_NONE;\n\n\n    first = outline->points;\n    for ( i = 0; i < outline->n_contours; i++, first = last + 1 )\n    {\n      FT_Vector*  point;\n      FT_Vector*  xmin_point;\n      FT_Pos      xmin;\n\n\n      last = outline->points + outline->contours[i];\n\n      /* skip degenerate contours */\n      if ( last < first + 2 )\n        continue;\n\n      if ( ft_contour_enclosed( outline, i ) )\n        continue;\n\n      xmin       = first->x;\n      xmin_point = first;\n\n      for ( point = first + 1; point <= last; point++ )\n      {\n        if ( point->x < xmin )\n        {\n          xmin       = point->x;\n          xmin_point = point;\n        }\n      }\n\n      /* check the orientation of the contour */\n      {\n        FT_Vector*      prev;\n        FT_Vector*      next;\n        FT_Orientation  o;\n\n\n        prev = ( xmin_point == first ) ? last : xmin_point - 1;\n        next = ( xmin_point == last ) ? first : xmin_point + 1;\n\n        if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >\n             FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )\n          o = FT_ORIENTATION_POSTSCRIPT;\n        else\n          o = FT_ORIENTATION_TRUETYPE;\n\n        if ( orient == FT_ORIENTATION_NONE )\n          orient = o;\n        else if ( orient != o )\n          return FT_ORIENTATION_NONE;\n      }\n    }\n\n    return orient;\n  }\n\n#endif /* 0 */\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_Embolden( FT_Outline*  outline,\n                       FT_Pos       strength )\n  {\n    return FT_Outline_EmboldenXY( outline, strength, strength );\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Outline_EmboldenXY( FT_Outline*  outline,\n                         FT_Pos       xstrength,\n                         FT_Pos       ystrength )\n  {\n    FT_Vector*  points;\n    FT_Vector   v_prev, v_first, v_next, v_cur;\n    FT_Int      c, n, first;\n    FT_Int      orientation;\n\n\n    if ( !outline )\n      return FT_THROW( Invalid_Argument );\n\n    xstrength /= 2;\n    ystrength /= 2;\n    if ( xstrength == 0 && ystrength == 0 )\n      return FT_Err_Ok;\n\n    orientation = FT_Outline_Get_Orientation( outline );\n    if ( orientation == FT_ORIENTATION_NONE )\n    {\n      if ( outline->n_contours )\n        return FT_THROW( Invalid_Argument );\n      else\n        return FT_Err_Ok;\n    }\n\n    points = outline->points;\n\n    first = 0;\n    for ( c = 0; c < outline->n_contours; c++ )\n    {\n      FT_Vector  in, out, shift;\n      FT_Fixed   l_in, l_out, l, q, d;\n      int        last = outline->contours[c];\n\n\n      v_first = points[first];\n      v_prev  = points[last];\n      v_cur   = v_first;\n\n      /* compute incoming normalized vector */\n      in.x = v_cur.x - v_prev.x;\n      in.y = v_cur.y - v_prev.y;\n      l_in = FT_Vector_Length( &in );\n      if ( l_in )\n      {\n        in.x = FT_DivFix( in.x, l_in );\n        in.y = FT_DivFix( in.y, l_in );\n      }\n\n      for ( n = first; n <= last; n++ )\n      {\n        if ( n < last )\n          v_next = points[n + 1];\n        else\n          v_next = v_first;\n\n        /* compute outgoing normalized vector */\n        out.x = v_next.x - v_cur.x;\n        out.y = v_next.y - v_cur.y;\n        l_out = FT_Vector_Length( &out );\n        if ( l_out )\n        {\n          out.x = FT_DivFix( out.x, l_out );\n          out.y = FT_DivFix( out.y, l_out );\n        }\n\n        d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );\n\n        /* shift only if turn is less than ~160 degrees */\n        if ( d > -0xF000L )\n        {\n          d = d + 0x10000L;\n\n          /* shift components are aligned along lateral bisector */\n          /* and directed according to the outline orientation.  */\n          shift.x = in.y + out.y;\n          shift.y = in.x + out.x;\n\n          if ( orientation == FT_ORIENTATION_TRUETYPE )\n            shift.x = -shift.x;\n          else\n            shift.y = -shift.y;\n\n          /* restrict shift magnitude to better handle collapsing segments */\n          q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );\n          if ( orientation == FT_ORIENTATION_TRUETYPE )\n            q = -q;\n\n          l = FT_MIN( l_in, l_out );\n\n          /* non-strict inequalities avoid divide-by-zero when q == l == 0 */\n          if ( FT_MulFix( xstrength, q ) <= FT_MulFix( d, l ) )\n            shift.x = FT_MulDiv( shift.x, xstrength, d );\n          else\n            shift.x = FT_MulDiv( shift.x, l, q );\n\n\n          if ( FT_MulFix( ystrength, q ) <= FT_MulFix( d, l ) )\n            shift.y = FT_MulDiv( shift.y, ystrength, d );\n          else\n            shift.y = FT_MulDiv( shift.y, l, q );\n        }\n        else\n          shift.x = shift.y = 0;\n\n        outline->points[n].x = v_cur.x + xstrength + shift.x;\n        outline->points[n].y = v_cur.y + ystrength + shift.y;\n\n        in    = out;\n        l_in  = l_out;\n        v_cur = v_next;\n      }\n\n      first = last + 1;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* documentation is in ftoutln.h */\n\n  FT_EXPORT_DEF( FT_Orientation )\n  FT_Outline_Get_Orientation( FT_Outline*  outline )\n  {\n    FT_BBox     cbox;\n    FT_Int      xshift, yshift;\n    FT_Vector*  points;\n    FT_Vector   v_prev, v_cur;\n    FT_Int      c, n, first;\n    FT_Pos      area = 0;\n\n\n    if ( !outline || outline->n_points <= 0 )\n      return FT_ORIENTATION_TRUETYPE;\n\n    /* We use the nonzero winding rule to find the orientation.       */\n    /* Since glyph outlines behave much more `regular' than arbitrary */\n    /* cubic or quadratic curves, this test deals with the polygon    */\n    /* only which is spanned up by the control points.                */\n\n    FT_Outline_Get_CBox( outline, &cbox );\n\n    xshift = FT_MSB( FT_ABS( cbox.xMax ) | FT_ABS( cbox.xMin ) ) - 14;\n    xshift = FT_MAX( xshift, 0 );\n\n    yshift = FT_MSB( cbox.yMax - cbox.yMin ) - 14;\n    yshift = FT_MAX( yshift, 0 );\n\n    points = outline->points;\n\n    first = 0;\n    for ( c = 0; c < outline->n_contours; c++ )\n    {\n      FT_Int  last = outline->contours[c];\n\n\n      v_prev = points[last];\n\n      for ( n = first; n <= last; n++ )\n      {\n        v_cur = points[n];\n        area += ( ( v_cur.y - v_prev.y ) >> yshift ) *\n                ( ( v_cur.x + v_prev.x ) >> xshift );\n        v_prev = v_cur;\n      }\n\n      first = last + 1;\n    }\n\n    if ( area > 0 )\n      return FT_ORIENTATION_POSTSCRIPT;\n    else if ( area < 0 )\n      return FT_ORIENTATION_TRUETYPE;\n    else\n      return FT_ORIENTATION_NONE;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftpatent.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpatent.c                                                             */\n/*                                                                         */\n/*    FreeType API for checking patented TrueType bytecode instructions    */\n/*    (body).                                                              */\n/*                                                                         */\n/*  Copyright 2007, 2008, 2010 by David Turner.                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_STREAM_H\n#include FT_SERVICE_SFNT_H\n#include FT_SERVICE_TRUETYPE_GLYF_H\n\n\n  static FT_Bool\n  _tt_check_patents_in_range( FT_Stream  stream,\n                              FT_ULong   size )\n  {\n    FT_Bool   result = FALSE;\n    FT_Error  error;\n    FT_Bytes  p, end;\n\n\n    if ( FT_FRAME_ENTER( size ) )\n      return 0;\n\n    p   = stream->cursor;\n    end = p + size;\n\n    while ( p < end )\n    {\n      switch (p[0])\n      {\n      case 0x06:  /* SPvTL // */\n      case 0x07:  /* SPvTL +  */\n      case 0x08:  /* SFvTL // */\n      case 0x09:  /* SFvTL +  */\n      case 0x0A:  /* SPvFS    */\n      case 0x0B:  /* SFvFS    */\n        result = TRUE;\n        goto Exit;\n\n      case 0x40:\n        if ( p + 1 >= end )\n          goto Exit;\n\n        p += p[1] + 2;\n        break;\n\n      case 0x41:\n        if ( p + 1 >= end )\n          goto Exit;\n\n        p += p[1] * 2 + 2;\n        break;\n\n      case 0x71:  /* DELTAP2 */\n      case 0x72:  /* DELTAP3 */\n      case 0x73:  /* DELTAC0 */\n      case 0x74:  /* DELTAC1 */\n      case 0x75:  /* DELTAC2 */\n        result = TRUE;\n        goto Exit;\n\n      case 0xB0:\n      case 0xB1:\n      case 0xB2:\n      case 0xB3:\n      case 0xB4:\n      case 0xB5:\n      case 0xB6:\n      case 0xB7:\n        p += ( p[0] - 0xB0 ) + 2;\n        break;\n\n      case 0xB8:\n      case 0xB9:\n      case 0xBA:\n      case 0xBB:\n      case 0xBC:\n      case 0xBD:\n      case 0xBE:\n      case 0xBF:\n        p += ( p[0] - 0xB8 ) * 2 + 3;\n        break;\n\n      default:\n        p += 1;\n        break;\n      }\n    }\n\n  Exit:\n    FT_UNUSED( error );\n    FT_FRAME_EXIT();\n    return result;\n  }\n\n\n  static FT_Bool\n  _tt_check_patents_in_table( FT_Face   face,\n                              FT_ULong  tag )\n  {\n    FT_Stream              stream = face->stream;\n    FT_Error               error  = FT_Err_Ok;\n    FT_Service_SFNT_Table  service;\n    FT_Bool                result = FALSE;\n\n\n    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );\n\n    if ( service )\n    {\n      FT_UInt   i = 0;\n      FT_ULong  tag_i = 0, offset_i = 0, length_i = 0;\n\n\n      for ( i = 0; !error && tag_i != tag ; i++ )\n        error = service->table_info( face, i,\n                                     &tag_i, &offset_i, &length_i );\n\n      if ( error                      ||\n           FT_STREAM_SEEK( offset_i ) )\n        goto Exit;\n\n      result = _tt_check_patents_in_range( stream, length_i );\n    }\n\n  Exit:\n    return result;\n  }\n\n\n  static FT_Bool\n  _tt_face_check_patents( FT_Face  face )\n  {\n    FT_Stream  stream = face->stream;\n    FT_UInt    gindex;\n    FT_Error   error;\n    FT_Bool    result;\n\n    FT_Service_TTGlyf  service;\n\n\n    result = _tt_check_patents_in_table( face, TTAG_fpgm );\n    if ( result )\n      goto Exit;\n\n    result = _tt_check_patents_in_table( face, TTAG_prep );\n    if ( result )\n      goto Exit;\n\n    FT_FACE_FIND_SERVICE( face, service, TT_GLYF );\n    if ( service == NULL )\n      goto Exit;\n\n    for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )\n    {\n      FT_ULong  offset, num_ins, size;\n      FT_Int    num_contours;\n\n\n      offset = service->get_location( face, gindex, &size );\n      if ( size == 0 )\n        continue;\n\n      if ( FT_STREAM_SEEK( offset )      ||\n           FT_READ_SHORT( num_contours ) )\n        continue;\n\n      if ( num_contours >= 0 )  /* simple glyph */\n      {\n        if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )\n          continue;\n      }\n      else  /* compound glyph */\n      {\n        FT_Bool  has_instr = 0;\n\n\n        if ( FT_STREAM_SKIP( 8 ) )\n          continue;\n\n        /* now read each component */\n        for (;;)\n        {\n          FT_UInt  flags, toskip;\n\n\n          if( FT_READ_USHORT( flags ) )\n            break;\n\n          toskip = 2 + 1 + 1;\n\n          if ( ( flags & ( 1 << 0 ) ) != 0 )       /* ARGS_ARE_WORDS */\n            toskip += 2;\n\n          if ( ( flags & ( 1 << 3 ) ) != 0 )       /* WE_HAVE_A_SCALE */\n            toskip += 2;\n          else if ( ( flags & ( 1 << 6 ) ) != 0 )  /* WE_HAVE_X_Y_SCALE */\n            toskip += 4;\n          else if ( ( flags & ( 1 << 7 ) ) != 0 )  /* WE_HAVE_A_2x2 */\n            toskip += 8;\n\n          if ( ( flags & ( 1 << 8 ) ) != 0 )       /* WE_HAVE_INSTRUCTIONS */\n            has_instr = 1;\n\n          if ( FT_STREAM_SKIP( toskip ) )\n            goto NextGlyph;\n\n          if ( ( flags & ( 1 << 5 ) ) == 0 )       /* MORE_COMPONENTS */\n            break;\n        }\n\n        if ( !has_instr )\n          goto NextGlyph;\n      }\n\n      if ( FT_READ_USHORT( num_ins ) )\n        continue;\n\n      result = _tt_check_patents_in_range( stream, num_ins );\n      if ( result )\n        goto Exit;\n\n    NextGlyph:\n      ;\n    }\n\n  Exit:\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Bool )\n  FT_Face_CheckTrueTypePatents( FT_Face  face )\n  {\n    FT_Bool  result = FALSE;\n\n\n    if ( face && FT_IS_SFNT( face ) )\n      result = _tt_face_check_patents( face );\n\n    return result;\n  }\n\n\n  /* documentation is in freetype.h */\n\n  FT_EXPORT_DEF( FT_Bool )\n  FT_Face_SetUnpatentedHinting( FT_Face  face,\n                                FT_Bool  value )\n  {\n    FT_Bool  result = FALSE;\n\n\n#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \\\n    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )\n    if ( face && FT_IS_SFNT( face ) )\n    {\n      result = !face->internal->ignore_unpatented_hinter;\n      face->internal->ignore_unpatented_hinter = !value;\n    }\n#else\n    FT_UNUSED( face );\n    FT_UNUSED( value );\n#endif\n\n    return result;\n  }\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftpfr.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpfr.c                                                                */\n/*                                                                         */\n/*    FreeType API for accessing PFR-specific data (body).                 */\n/*                                                                         */\n/*  Copyright 2002-2004, 2008, 2010, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_PFR_H\n\n\n  /* check the format */\n  static FT_Service_PfrMetrics\n  ft_pfr_check( FT_Face  face )\n  {\n    FT_Service_PfrMetrics  service = NULL;\n\n\n    if ( face )\n      FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS );\n\n    return service;\n  }\n\n\n  /* documentation is in ftpfr.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PFR_Metrics( FT_Face    face,\n                      FT_UInt   *aoutline_resolution,\n                      FT_UInt   *ametrics_resolution,\n                      FT_Fixed  *ametrics_x_scale,\n                      FT_Fixed  *ametrics_y_scale )\n  {\n    FT_Error               error = FT_Err_Ok;\n    FT_Service_PfrMetrics  service;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Argument );\n\n    service = ft_pfr_check( face );\n    if ( service )\n    {\n      error = service->get_metrics( face,\n                                    aoutline_resolution,\n                                    ametrics_resolution,\n                                    ametrics_x_scale,\n                                    ametrics_y_scale );\n    }\n    else\n    {\n      FT_Fixed  x_scale, y_scale;\n\n\n      /* this is not a PFR font */\n      if ( aoutline_resolution )\n        *aoutline_resolution = face->units_per_EM;\n\n      if ( ametrics_resolution )\n        *ametrics_resolution = face->units_per_EM;\n\n      x_scale = y_scale = 0x10000L;\n      if ( face->size )\n      {\n        x_scale = face->size->metrics.x_scale;\n        y_scale = face->size->metrics.y_scale;\n      }\n\n      if ( ametrics_x_scale )\n        *ametrics_x_scale = x_scale;\n\n      if ( ametrics_y_scale )\n        *ametrics_y_scale = y_scale;\n\n      error = FT_THROW( Unknown_File_Format );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftpfr.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PFR_Kerning( FT_Face     face,\n                      FT_UInt     left,\n                      FT_UInt     right,\n                      FT_Vector  *avector )\n  {\n    FT_Error               error;\n    FT_Service_PfrMetrics  service;\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Argument );\n\n    service = ft_pfr_check( face );\n    if ( service )\n      error = service->get_kerning( face, left, right, avector );\n    else\n      error = FT_Get_Kerning( face, left, right,\n                              FT_KERNING_UNSCALED, avector );\n\n    return error;\n  }\n\n\n  /* documentation is in ftpfr.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PFR_Advance( FT_Face   face,\n                      FT_UInt   gindex,\n                      FT_Pos   *aadvance )\n  {\n    FT_Error               error;\n    FT_Service_PfrMetrics  service;\n\n\n    service = ft_pfr_check( face );\n    if ( service )\n    {\n      error = service->get_advance( face, gindex, aadvance );\n    }\n    else\n      /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */\n      error = FT_THROW( Invalid_Argument );\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftpic.c                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services (body).              */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"basepic.h\"\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* documentation is in ftpic.h */\n\n  FT_BASE_DEF( FT_Error )\n  ft_pic_container_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n\n\n    FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) );\n\n    error = ft_base_pic_init( library );\n    if ( error )\n      return error;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* Destroy the contents of the container. */\n  FT_BASE_DEF( void )\n  ft_pic_container_destroy( FT_Library  library )\n  {\n    ft_base_pic_free( library );\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftrfork.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrfork.c                                                              */\n/*                                                                         */\n/*    Embedded resource forks accessor (body).                             */\n/*                                                                         */\n/*  Copyright 2004-2010, 2013 by                                           */\n/*  Masatake YAMATO and Redhat K.K.                                        */\n/*                                                                         */\n/*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */\n/*  derived from ftobjs.c.                                                 */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/* Development of the code in this file is support of                      */\n/* Information-technology Promotion Agency, Japan.                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_RFORK_H\n#include \"basepic.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_raccess\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****               Resource fork directory access                    ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_BASE_DEF( FT_Error )\n  FT_Raccess_Get_HeaderInfo( FT_Library  library,\n                             FT_Stream   stream,\n                             FT_Long     rfork_offset,\n                             FT_Long    *map_offset,\n                             FT_Long    *rdata_pos )\n  {\n    FT_Error       error;\n    unsigned char  head[16], head2[16];\n    FT_Long        map_pos, rdata_len;\n    int            allzeros, allmatch, i;\n    FT_Long        type_list;\n\n    FT_UNUSED( library );\n\n\n    error = FT_Stream_Seek( stream, rfork_offset );\n    if ( error )\n      return error;\n\n    error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );\n    if ( error )\n      return error;\n\n    *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |\n                                  ( head[1] << 16 ) |\n                                  ( head[2] <<  8 ) |\n                                    head[3]         );\n    map_pos    = rfork_offset + ( ( head[4] << 24 ) |\n                                  ( head[5] << 16 ) |\n                                  ( head[6] <<  8 ) |\n                                    head[7]         );\n    rdata_len = ( head[ 8] << 24 ) |\n                ( head[ 9] << 16 ) |\n                ( head[10] <<  8 ) |\n                  head[11];\n\n    /* map_len = head[12] .. head[15] */\n\n    if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )\n      return FT_THROW( Unknown_File_Format );\n\n    error = FT_Stream_Seek( stream, map_pos );\n    if ( error )\n      return error;\n\n    head2[15] = (FT_Byte)( head[15] + 1 );       /* make it be different */\n\n    error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );\n    if ( error )\n      return error;\n\n    allzeros = 1;\n    allmatch = 1;\n    for ( i = 0; i < 16; ++i )\n    {\n      if ( head2[i] != 0 )\n        allzeros = 0;\n      if ( head2[i] != head[i] )\n        allmatch = 0;\n    }\n    if ( !allzeros && !allmatch )\n      return FT_THROW( Unknown_File_Format );\n\n    /* If we have reached this point then it is probably a mac resource */\n    /* file.  Now, does it contain any interesting resources?           */\n    /* Skip handle to next resource map, the file resource number, and  */\n    /* attributes.                                                      */\n    (void)FT_STREAM_SKIP( 4        /* skip handle to next resource map */\n                          + 2      /* skip file resource number */\n                          + 2 );   /* skip attributes */\n\n    if ( FT_READ_USHORT( type_list ) )\n      return error;\n    if ( type_list == -1 )\n      return FT_THROW( Unknown_File_Format );\n\n    error = FT_Stream_Seek( stream, map_pos + type_list );\n    if ( error )\n      return error;\n\n    *map_offset = map_pos + type_list;\n    return FT_Err_Ok;\n  }\n\n\n  static int\n  ft_raccess_sort_ref_by_id( FT_RFork_Ref*  a,\n                             FT_RFork_Ref*  b )\n  {\n    if ( a->res_id < b->res_id )\n      return -1;\n    else if ( a->res_id > b->res_id )\n      return 1;\n    else\n      return 0;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Raccess_Get_DataOffsets( FT_Library  library,\n                              FT_Stream   stream,\n                              FT_Long     map_offset,\n                              FT_Long     rdata_pos,\n                              FT_Long     tag,\n                              FT_Long   **offsets,\n                              FT_Long    *count )\n  {\n    FT_Error      error;\n    int           i, j, cnt, subcnt;\n    FT_Long       tag_internal, rpos;\n    FT_Memory     memory = library->memory;\n    FT_Long       temp;\n    FT_Long       *offsets_internal = NULL;\n    FT_RFork_Ref  *ref = NULL;\n\n\n    error = FT_Stream_Seek( stream, map_offset );\n    if ( error )\n      return error;\n\n    if ( FT_READ_USHORT( cnt ) )\n      return error;\n    cnt++;\n\n    for ( i = 0; i < cnt; ++i )\n    {\n      if ( FT_READ_LONG( tag_internal ) ||\n           FT_READ_USHORT( subcnt )     ||\n           FT_READ_USHORT( rpos )       )\n        return error;\n\n      FT_TRACE2(( \"Resource tags: %c%c%c%c\\n\",\n                  (char)( 0xff & ( tag_internal >> 24 ) ),\n                  (char)( 0xff & ( tag_internal >> 16 ) ),\n                  (char)( 0xff & ( tag_internal >>  8 ) ),\n                  (char)( 0xff & ( tag_internal >>  0 ) ) ));\n\n      if ( tag_internal == tag )\n      {\n        *count = subcnt + 1;\n        rpos  += map_offset;\n\n        error = FT_Stream_Seek( stream, rpos );\n        if ( error )\n          return error;\n\n        if ( FT_NEW_ARRAY( ref, *count ) )\n          return error;\n\n        for ( j = 0; j < *count; ++j )\n        {\n          if ( FT_READ_USHORT( ref[j].res_id ) )\n            goto Exit;\n          if ( FT_STREAM_SKIP( 2 ) ) /* resource name */\n            goto Exit;\n          if ( FT_READ_LONG( temp ) )\n            goto Exit;\n          if ( FT_STREAM_SKIP( 4 ) ) /* mbz */\n            goto Exit;\n\n          ref[j].offset = temp & 0xFFFFFFL;\n        }\n\n        ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ),\n                  ( int(*)(const void*, const void*) )\n                  ft_raccess_sort_ref_by_id );\n\n        if ( FT_NEW_ARRAY( offsets_internal, *count ) )\n          goto Exit;\n\n        /* XXX: duplicated reference ID,\n         *      gap between reference IDs are acceptable?\n         *      further investigation on Apple implementation is needed.\n         */\n        for ( j = 0; j < *count; ++j )\n          offsets_internal[j] = rdata_pos + ref[j].offset;\n\n        *offsets = offsets_internal;\n        error    = FT_Err_Ok;\n\n      Exit:\n        FT_FREE( ref );\n        return error;\n      }\n    }\n\n    return FT_THROW( Cannot_Open_Resource );\n  }\n\n\n#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                     Guessing functions                          ****/\n  /****                                                                 ****/\n  /****            When you add a new guessing function,                ****/\n  /****           update FT_RACCESS_N_RULES in ftrfork.h.               ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_Error\n  raccess_guess_apple_double( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_apple_single( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_darwin_ufs_export( FT_Library  library,\n                                   FT_Stream   stream,\n                                   char       *base_file_name,\n                                   char      **result_file_name,\n                                   FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_darwin_newvfs( FT_Library  library,\n                               FT_Stream   stream,\n                               char       *base_file_name,\n                               char      **result_file_name,\n                               FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_darwin_hfsplus( FT_Library  library,\n                                FT_Stream   stream,\n                                char       *base_file_name,\n                                char      **result_file_name,\n                                FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_vfat( FT_Library  library,\n                      FT_Stream   stream,\n                      char       *base_file_name,\n                      char      **result_file_name,\n                      FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_linux_cap( FT_Library  library,\n                           FT_Stream   stream,\n                           char       *base_file_name,\n                           char      **result_file_name,\n                           FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_linux_double( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_linux_netatalk( FT_Library  library,\n                                FT_Stream   stream,\n                                char       *base_file_name,\n                                char      **result_file_name,\n                                FT_Long    *result_offset );\n\n\n  CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,\n                                  ft_raccess_guess_rec)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double,      apple_double)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single,      apple_single)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs,     darwin_newvfs)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus,    darwin_hfsplus)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat,              vfat)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap,         linux_cap)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double,      linux_double)\n  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk,    linux_netatalk)\n  CONST_FT_RFORK_RULE_ARRAY_END\n\n\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                       Helper functions                          ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n\n  static FT_Error\n  raccess_guess_apple_generic( FT_Library  library,\n                               FT_Stream   stream,\n                               char       *base_file_name,\n                               FT_Int32    magic,\n                               FT_Long    *result_offset );\n\n  static FT_Error\n  raccess_guess_linux_double_from_file_name( FT_Library  library,\n                                             char *      file_name,\n                                             FT_Long    *result_offset );\n\n  static char *\n  raccess_make_file_name( FT_Memory    memory,\n                          const char  *original_name,\n                          const char  *insertion );\n\n  FT_BASE_DEF( void )\n  FT_Raccess_Guess( FT_Library  library,\n                    FT_Stream   stream,\n                    char*       base_name,\n                    char      **new_names,\n                    FT_Long    *offsets,\n                    FT_Error   *errors )\n  {\n    FT_Int  i;\n\n\n    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )\n    {\n      new_names[i] = NULL;\n      if ( NULL != stream )\n        errors[i] = FT_Stream_Seek( stream, 0 );\n      else\n        errors[i] = FT_Err_Ok;\n\n      if ( errors[i] )\n        continue ;\n\n      errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library,\n                                                 stream, base_name,\n                                                 &(new_names[i]),\n                                                 &(offsets[i]) );\n    }\n\n    return;\n  }\n\n\n#ifndef FT_MACINTOSH\n  static FT_RFork_Rule\n  raccess_get_rule_type_from_rule_index( FT_Library  library,\n                                         FT_UInt     rule_index )\n  {\n    FT_UNUSED( library );\n\n    if ( rule_index >= FT_RACCESS_N_RULES )\n      return FT_RFork_Rule_invalid;\n\n    return FT_RACCESS_GUESS_TABLE_GET[rule_index].type;\n  }\n\n\n  /*\n   * For this function, refer ftbase.h.\n   */\n  FT_LOCAL_DEF( FT_Bool )\n  ft_raccess_rule_by_darwin_vfs( FT_Library  library,\n                                 FT_UInt     rule_index )\n  {\n    switch( raccess_get_rule_type_from_rule_index( library, rule_index ) )\n    {\n      case FT_RFork_Rule_darwin_newvfs:\n      case FT_RFork_Rule_darwin_hfsplus:\n        return TRUE;\n\n      default:\n        return FALSE;\n    }\n  }\n#endif\n\n\n  static FT_Error\n  raccess_guess_apple_double( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset )\n  {\n    FT_Int32  magic = ( 0x00 << 24 ) |\n                      ( 0x05 << 16 ) |\n                      ( 0x16 <<  8 ) |\n                        0x07;\n\n\n    *result_file_name = NULL;\n    if ( NULL == stream )\n      return FT_THROW( Cannot_Open_Stream );\n\n    return raccess_guess_apple_generic( library, stream, base_file_name,\n                                        magic, result_offset );\n  }\n\n\n  static FT_Error\n  raccess_guess_apple_single( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset )\n  {\n    FT_Int32  magic = ( 0x00 << 24 ) |\n                      ( 0x05 << 16 ) |\n                      ( 0x16 <<  8 ) |\n                        0x00;\n\n\n    *result_file_name = NULL;\n    if ( NULL == stream )\n      return FT_THROW( Cannot_Open_Stream );\n\n    return raccess_guess_apple_generic( library, stream, base_file_name,\n                                        magic, result_offset );\n  }\n\n\n  static FT_Error\n  raccess_guess_darwin_ufs_export( FT_Library  library,\n                                   FT_Stream   stream,\n                                   char       *base_file_name,\n                                   char      **result_file_name,\n                                   FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Error   error;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory  = library->memory;\n    newpath = raccess_make_file_name( memory, base_file_name, \"._\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    error = raccess_guess_linux_double_from_file_name( library, newpath,\n                                                       result_offset );\n    if ( !error )\n      *result_file_name = newpath;\n    else\n      FT_FREE( newpath );\n\n    return error;\n  }\n\n\n  static FT_Error\n  raccess_guess_darwin_hfsplus( FT_Library  library,\n                                FT_Stream   stream,\n                                char       *base_file_name,\n                                char      **result_file_name,\n                                FT_Long    *result_offset )\n  {\n    /*\n      Only meaningful on systems with hfs+ drivers (or Macs).\n     */\n    FT_Error   error;\n    char*      newpath = NULL;\n    FT_Memory  memory;\n    FT_Long    base_file_len = ft_strlen( base_file_name );\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    if ( base_file_len + 6 > FT_INT_MAX )\n      return FT_THROW( Array_Too_Large );\n\n    if ( FT_ALLOC( newpath, base_file_len + 6 ) )\n      return error;\n\n    FT_MEM_COPY( newpath, base_file_name, base_file_len );\n    FT_MEM_COPY( newpath + base_file_len, \"/rsrc\", 6 );\n\n    *result_file_name = newpath;\n    *result_offset    = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  raccess_guess_darwin_newvfs( FT_Library  library,\n                               FT_Stream   stream,\n                               char       *base_file_name,\n                               char      **result_file_name,\n                               FT_Long    *result_offset )\n  {\n    /*\n      Only meaningful on systems with Mac OS X (> 10.1).\n     */\n    FT_Error   error;\n    char*      newpath = NULL;\n    FT_Memory  memory;\n    FT_Long    base_file_len = ft_strlen( base_file_name );\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    if ( base_file_len + 18 > FT_INT_MAX )\n      return FT_THROW( Array_Too_Large );\n\n    if ( FT_ALLOC( newpath, base_file_len + 18 ) )\n      return error;\n\n    FT_MEM_COPY( newpath, base_file_name, base_file_len );\n    FT_MEM_COPY( newpath + base_file_len, \"/..namedfork/rsrc\", 18 );\n\n    *result_file_name = newpath;\n    *result_offset    = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  raccess_guess_vfat( FT_Library  library,\n                      FT_Stream   stream,\n                      char       *base_file_name,\n                      char      **result_file_name,\n                      FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    newpath = raccess_make_file_name( memory, base_file_name,\n                                      \"resource.frk/\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    *result_file_name = newpath;\n    *result_offset    = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  raccess_guess_linux_cap( FT_Library  library,\n                           FT_Stream   stream,\n                           char       *base_file_name,\n                           char      **result_file_name,\n                           FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    newpath = raccess_make_file_name( memory, base_file_name, \".resource/\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    *result_file_name = newpath;\n    *result_offset    = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  raccess_guess_linux_double( FT_Library  library,\n                              FT_Stream   stream,\n                              char       *base_file_name,\n                              char      **result_file_name,\n                              FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Error   error;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    newpath = raccess_make_file_name( memory, base_file_name, \"%\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    error = raccess_guess_linux_double_from_file_name( library, newpath,\n                                                       result_offset );\n    if ( !error )\n      *result_file_name = newpath;\n    else\n      FT_FREE( newpath );\n\n    return error;\n  }\n\n\n  static FT_Error\n  raccess_guess_linux_netatalk( FT_Library  library,\n                                FT_Stream   stream,\n                                char       *base_file_name,\n                                char      **result_file_name,\n                                FT_Long    *result_offset )\n  {\n    char*      newpath;\n    FT_Error   error;\n    FT_Memory  memory;\n\n    FT_UNUSED( stream );\n\n\n    memory = library->memory;\n\n    newpath = raccess_make_file_name( memory, base_file_name,\n                                      \".AppleDouble/\" );\n    if ( !newpath )\n      return FT_THROW( Out_Of_Memory );\n\n    error = raccess_guess_linux_double_from_file_name( library, newpath,\n                                                       result_offset );\n    if ( !error )\n      *result_file_name = newpath;\n    else\n      FT_FREE( newpath );\n\n    return error;\n  }\n\n\n  static FT_Error\n  raccess_guess_apple_generic( FT_Library  library,\n                               FT_Stream   stream,\n                               char       *base_file_name,\n                               FT_Int32    magic,\n                               FT_Long    *result_offset )\n  {\n    FT_Int32   magic_from_stream;\n    FT_Error   error;\n    FT_Int32   version_number = 0;\n    FT_UShort  n_of_entries;\n\n    int        i;\n    FT_UInt32  entry_id, entry_offset, entry_length = 0;\n\n    const FT_UInt32  resource_fork_entry_id = 0x2;\n\n    FT_UNUSED( library );\n    FT_UNUSED( base_file_name );\n    FT_UNUSED( version_number );\n    FT_UNUSED( entry_length   );\n\n\n    if ( FT_READ_LONG( magic_from_stream ) )\n      return error;\n    if ( magic_from_stream != magic )\n      return FT_THROW( Unknown_File_Format );\n\n    if ( FT_READ_LONG( version_number ) )\n      return error;\n\n    /* filler */\n    error = FT_Stream_Skip( stream, 16 );\n    if ( error )\n      return error;\n\n    if ( FT_READ_USHORT( n_of_entries ) )\n      return error;\n    if ( n_of_entries == 0 )\n      return FT_THROW( Unknown_File_Format );\n\n    for ( i = 0; i < n_of_entries; i++ )\n    {\n      if ( FT_READ_LONG( entry_id ) )\n        return error;\n      if ( entry_id == resource_fork_entry_id )\n      {\n        if ( FT_READ_LONG( entry_offset ) ||\n             FT_READ_LONG( entry_length ) )\n          continue;\n        *result_offset = entry_offset;\n\n        return FT_Err_Ok;\n      }\n      else\n      {\n        error = FT_Stream_Skip( stream, 4 + 4 );    /* offset + length */\n        if ( error )\n          return error;\n      }\n    }\n\n    return FT_THROW( Unknown_File_Format );\n  }\n\n\n  static FT_Error\n  raccess_guess_linux_double_from_file_name( FT_Library  library,\n                                             char       *file_name,\n                                             FT_Long    *result_offset )\n  {\n    FT_Open_Args  args2;\n    FT_Stream     stream2;\n    char *        nouse = NULL;\n    FT_Error      error;\n\n\n    args2.flags    = FT_OPEN_PATHNAME;\n    args2.pathname = file_name;\n    error = FT_Stream_New( library, &args2, &stream2 );\n    if ( error )\n      return error;\n\n    error = raccess_guess_apple_double( library, stream2, file_name,\n                                        &nouse, result_offset );\n\n    FT_Stream_Free( stream2, 0 );\n\n    return error;\n  }\n\n\n  static char*\n  raccess_make_file_name( FT_Memory    memory,\n                          const char  *original_name,\n                          const char  *insertion )\n  {\n    char*        new_name = NULL;\n    const char*  tmp;\n    const char*  slash;\n    size_t       new_length;\n    FT_Error     error = FT_Err_Ok;\n\n    FT_UNUSED( error );\n\n\n    new_length = ft_strlen( original_name ) + ft_strlen( insertion );\n    if ( FT_ALLOC( new_name, new_length + 1 ) )\n      return NULL;\n\n    tmp = ft_strrchr( original_name, '/' );\n    if ( tmp )\n    {\n      ft_strncpy( new_name, original_name, tmp - original_name + 1 );\n      new_name[tmp - original_name + 1] = '\\0';\n      slash = tmp + 1;\n    }\n    else\n    {\n      slash       = original_name;\n      new_name[0] = '\\0';\n    }\n\n    ft_strcat( new_name, insertion );\n    ft_strcat( new_name, slash );\n\n    return new_name;\n  }\n\n\n#else   /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */\n\n\n  /*************************************************************************/\n  /*                  Dummy function; just sets errors                     */\n  /*************************************************************************/\n\n  FT_BASE_DEF( void )\n  FT_Raccess_Guess( FT_Library  library,\n                    FT_Stream   stream,\n                    char       *base_name,\n                    char      **new_names,\n                    FT_Long    *offsets,\n                    FT_Error   *errors )\n  {\n    FT_Int  i;\n\n    FT_UNUSED( library );\n    FT_UNUSED( stream );\n    FT_UNUSED( base_name );\n\n\n    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )\n    {\n      new_names[i] = NULL;\n      offsets[i]   = 0;\n      errors[i]    = FT_ERR( Unimplemented_Feature );\n    }\n  }\n\n\n#endif  /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftsnames.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsnames.c                                                             */\n/*                                                                         */\n/*    Simple interface to access SFNT name tables (which are used          */\n/*    to hold font names, copyright info, notices, etc.) (body).           */\n/*                                                                         */\n/*    This is _not_ used to retrieve glyph names!                          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2009 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_SFNT_NAMES_H\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n#include FT_INTERNAL_STREAM_H\n\n\n#ifdef TT_CONFIG_OPTION_SFNT_NAMES\n\n\n  /* documentation is in ftsnames.h */\n\n  FT_EXPORT_DEF( FT_UInt )\n  FT_Get_Sfnt_Name_Count( FT_Face  face )\n  {\n    return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0;\n  }\n\n\n  /* documentation is in ftsnames.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_Sfnt_Name( FT_Face       face,\n                    FT_UInt       idx,\n                    FT_SfntName  *aname )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    if ( aname && face && FT_IS_SFNT( face ) )\n    {\n      TT_Face  ttface = (TT_Face)face;\n\n\n      if ( idx < (FT_UInt)ttface->num_names )\n      {\n        TT_NameEntryRec*  entry = ttface->name_table.names + idx;\n\n\n        /* load name on demand */\n        if ( entry->stringLength > 0 && entry->string == NULL )\n        {\n          FT_Memory  memory = face->memory;\n          FT_Stream  stream = face->stream;\n\n\n          if ( FT_NEW_ARRAY  ( entry->string, entry->stringLength ) ||\n               FT_STREAM_SEEK( entry->stringOffset )                ||\n               FT_STREAM_READ( entry->string, entry->stringLength ) )\n          {\n            FT_FREE( entry->string );\n            entry->stringLength = 0;\n          }\n        }\n\n        aname->platform_id = entry->platformID;\n        aname->encoding_id = entry->encodingID;\n        aname->language_id = entry->languageID;\n        aname->name_id     = entry->nameID;\n        aname->string      = (FT_Byte*)entry->string;\n        aname->string_len  = entry->stringLength;\n\n        error = FT_Err_Ok;\n      }\n    }\n\n    return error;\n  }\n\n\n#endif /* TT_CONFIG_OPTION_SFNT_NAMES */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftstream.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstream.c                                                             */\n/*                                                                         */\n/*    I/O stream support (body).                                           */\n/*                                                                         */\n/*  Copyright 2000-2002, 2004-2006, 2008-2011, 2013 by                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_DEBUG_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_stream\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_OpenMemory( FT_Stream       stream,\n                        const FT_Byte*  base,\n                        FT_ULong        size )\n  {\n    stream->base   = (FT_Byte*) base;\n    stream->size   = size;\n    stream->pos    = 0;\n    stream->cursor = 0;\n    stream->read   = 0;\n    stream->close  = 0;\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_Close( FT_Stream  stream )\n  {\n    if ( stream && stream->close )\n      stream->close( stream );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_Seek( FT_Stream  stream,\n                  FT_ULong   pos )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( stream->read )\n    {\n      if ( stream->read( stream, pos, 0, 0 ) )\n      {\n        FT_ERROR(( \"FT_Stream_Seek:\"\n                   \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n                   pos, stream->size ));\n\n        error = FT_THROW( Invalid_Stream_Operation );\n      }\n    }\n    /* note that seeking to the first position after the file is valid */\n    else if ( pos > stream->size )\n    {\n      FT_ERROR(( \"FT_Stream_Seek:\"\n                 \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n                 pos, stream->size ));\n\n      error = FT_THROW( Invalid_Stream_Operation );\n    }\n\n    if ( !error )\n      stream->pos = pos;\n\n    return error;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_Skip( FT_Stream  stream,\n                  FT_Long    distance )\n  {\n    if ( distance < 0 )\n      return FT_THROW( Invalid_Stream_Operation );\n\n    return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) );\n  }\n\n\n  FT_BASE_DEF( FT_Long )\n  FT_Stream_Pos( FT_Stream  stream )\n  {\n    return stream->pos;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_Read( FT_Stream  stream,\n                  FT_Byte*   buffer,\n                  FT_ULong   count )\n  {\n    return FT_Stream_ReadAt( stream, stream->pos, buffer, count );\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_ReadAt( FT_Stream  stream,\n                    FT_ULong   pos,\n                    FT_Byte*   buffer,\n                    FT_ULong   count )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_ULong  read_bytes;\n\n\n    if ( pos >= stream->size )\n    {\n      FT_ERROR(( \"FT_Stream_ReadAt:\"\n                 \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n                 pos, stream->size ));\n\n      return FT_THROW( Invalid_Stream_Operation );\n    }\n\n    if ( stream->read )\n      read_bytes = stream->read( stream, pos, buffer, count );\n    else\n    {\n      read_bytes = stream->size - pos;\n      if ( read_bytes > count )\n        read_bytes = count;\n\n      FT_MEM_COPY( buffer, stream->base + pos, read_bytes );\n    }\n\n    stream->pos = pos + read_bytes;\n\n    if ( read_bytes < count )\n    {\n      FT_ERROR(( \"FT_Stream_ReadAt:\"\n                 \" invalid read; expected %lu bytes, got %lu\\n\",\n                 count, read_bytes ));\n\n      error = FT_THROW( Invalid_Stream_Operation );\n    }\n\n    return error;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_TryRead( FT_Stream  stream,\n                     FT_Byte*   buffer,\n                     FT_ULong   count )\n  {\n    FT_ULong  read_bytes = 0;\n\n\n    if ( stream->pos >= stream->size )\n      goto Exit;\n\n    if ( stream->read )\n      read_bytes = stream->read( stream, stream->pos, buffer, count );\n    else\n    {\n      read_bytes = stream->size - stream->pos;\n      if ( read_bytes > count )\n        read_bytes = count;\n\n      FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );\n    }\n\n    stream->pos += read_bytes;\n\n  Exit:\n    return read_bytes;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_ExtractFrame( FT_Stream  stream,\n                          FT_ULong   count,\n                          FT_Byte**  pbytes )\n  {\n    FT_Error  error;\n\n\n    error = FT_Stream_EnterFrame( stream, count );\n    if ( !error )\n    {\n      *pbytes = (FT_Byte*)stream->cursor;\n\n      /* equivalent to FT_Stream_ExitFrame(), with no memory block release */\n      stream->cursor = 0;\n      stream->limit  = 0;\n    }\n\n    return error;\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_ReleaseFrame( FT_Stream  stream,\n                          FT_Byte**  pbytes )\n  {\n    if ( stream && stream->read )\n    {\n      FT_Memory  memory = stream->memory;\n\n#ifdef FT_DEBUG_MEMORY\n      ft_mem_free( memory, *pbytes );\n      *pbytes = NULL;\n#else\n      FT_FREE( *pbytes );\n#endif\n    }\n    *pbytes = 0;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_EnterFrame( FT_Stream  stream,\n                        FT_ULong   count )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_ULong  read_bytes;\n\n\n    /* check for nested frame access */\n    FT_ASSERT( stream && stream->cursor == 0 );\n\n    if ( stream->read )\n    {\n      /* allocate the frame in memory */\n      FT_Memory  memory = stream->memory;\n\n\n      /* simple sanity check */\n      if ( count > stream->size )\n      {\n        FT_ERROR(( \"FT_Stream_EnterFrame:\"\n                   \" frame size (%lu) larger than stream size (%lu)\\n\",\n                   count, stream->size ));\n\n        error = FT_THROW( Invalid_Stream_Operation );\n        goto Exit;\n      }\n\n#ifdef FT_DEBUG_MEMORY\n      /* assume _ft_debug_file and _ft_debug_lineno are already set */\n      stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error );\n      if ( error )\n        goto Exit;\n#else\n      if ( FT_QALLOC( stream->base, count ) )\n        goto Exit;\n#endif\n      /* read it */\n      read_bytes = stream->read( stream, stream->pos,\n                                 stream->base, count );\n      if ( read_bytes < count )\n      {\n        FT_ERROR(( \"FT_Stream_EnterFrame:\"\n                   \" invalid read; expected %lu bytes, got %lu\\n\",\n                   count, read_bytes ));\n\n        FT_FREE( stream->base );\n        error = FT_THROW( Invalid_Stream_Operation );\n      }\n      stream->cursor = stream->base;\n      stream->limit  = stream->cursor + count;\n      stream->pos   += read_bytes;\n    }\n    else\n    {\n      /* check current and new position */\n      if ( stream->pos >= stream->size        ||\n           stream->size - stream->pos < count )\n      {\n        FT_ERROR(( \"FT_Stream_EnterFrame:\"\n                   \" invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\\n\",\n                   stream->pos, count, stream->size ));\n\n        error = FT_THROW( Invalid_Stream_Operation );\n        goto Exit;\n      }\n\n      /* set cursor */\n      stream->cursor = stream->base + stream->pos;\n      stream->limit  = stream->cursor + count;\n      stream->pos   += count;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Stream_ExitFrame( FT_Stream  stream )\n  {\n    /* IMPORTANT: The assertion stream->cursor != 0 was removed, given    */\n    /*            that it is possible to access a frame of length 0 in    */\n    /*            some weird fonts (usually, when accessing an array of   */\n    /*            0 records, like in some strange kern tables).           */\n    /*                                                                    */\n    /*  In this case, the loader code handles the 0-length table          */\n    /*  gracefully; however, stream.cursor is really set to 0 by the      */\n    /*  FT_Stream_EnterFrame() call, and this is not an error.            */\n    /*                                                                    */\n    FT_ASSERT( stream );\n\n    if ( stream->read )\n    {\n      FT_Memory  memory = stream->memory;\n\n#ifdef FT_DEBUG_MEMORY\n      ft_mem_free( memory, stream->base );\n      stream->base = NULL;\n#else\n      FT_FREE( stream->base );\n#endif\n    }\n    stream->cursor = 0;\n    stream->limit  = 0;\n  }\n\n\n  FT_BASE_DEF( FT_Char )\n  FT_Stream_GetChar( FT_Stream  stream )\n  {\n    FT_Char  result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result = 0;\n    if ( stream->cursor < stream->limit )\n      result = *stream->cursor++;\n\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_UShort )\n  FT_Stream_GetUShort( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Short  result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 1 < stream->limit )\n      result       = FT_NEXT_USHORT( p );\n    stream->cursor = p;\n\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_UShort )\n  FT_Stream_GetUShortLE( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Short  result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 1 < stream->limit )\n      result       = FT_NEXT_USHORT_LE( p );\n    stream->cursor = p;\n\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_GetUOffset( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Long   result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 2 < stream->limit )\n      result       = FT_NEXT_UOFF3( p );\n    stream->cursor = p;\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_GetULong( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Long   result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 3 < stream->limit )\n      result       = FT_NEXT_ULONG( p );\n    stream->cursor = p;\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_GetULongLE( FT_Stream  stream )\n  {\n    FT_Byte*  p;\n    FT_Long   result;\n\n\n    FT_ASSERT( stream && stream->cursor );\n\n    result         = 0;\n    p              = stream->cursor;\n    if ( p + 3 < stream->limit )\n      result       = FT_NEXT_ULONG_LE( p );\n    stream->cursor = p;\n    return result;\n  }\n\n\n  FT_BASE_DEF( FT_Char )\n  FT_Stream_ReadChar( FT_Stream  stream,\n                      FT_Error*  error )\n  {\n    FT_Byte  result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->read )\n    {\n      if ( stream->read( stream, stream->pos, &result, 1L ) != 1L )\n        goto Fail;\n    }\n    else\n    {\n      if ( stream->pos < stream->size )\n        result = stream->base[stream->pos];\n      else\n        goto Fail;\n    }\n    stream->pos++;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadChar:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_UShort )\n  FT_Stream_ReadUShort( FT_Stream  stream,\n                       FT_Error*  error )\n  {\n    FT_Byte   reads[2];\n    FT_Byte*  p = 0;\n    FT_Short  result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 1 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_USHORT( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 2;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadUShort:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_UShort )\n  FT_Stream_ReadUShortLE( FT_Stream  stream,\n                         FT_Error*  error )\n  {\n    FT_Byte   reads[2];\n    FT_Byte*  p = 0;\n    FT_Short  result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 1 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_USHORT_LE( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 2;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadUShortLE:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_ReadUOffset( FT_Stream  stream,\n                        FT_Error*  error )\n  {\n    FT_Byte   reads[3];\n    FT_Byte*  p = 0;\n    FT_Long   result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 2 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if (stream->read( stream, stream->pos, reads, 3L ) != 3L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_UOFF3( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 3;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadUOffset:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_ReadULong( FT_Stream  stream,\n                      FT_Error*  error )\n  {\n    FT_Byte   reads[4];\n    FT_Byte*  p = 0;\n    FT_Long   result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 3 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_ULONG( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 4;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadULong:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_ULong )\n  FT_Stream_ReadULongLE( FT_Stream  stream,\n                        FT_Error*  error )\n  {\n    FT_Byte   reads[4];\n    FT_Byte*  p = 0;\n    FT_Long   result = 0;\n\n\n    FT_ASSERT( stream );\n\n    *error = FT_Err_Ok;\n\n    if ( stream->pos + 3 < stream->size )\n    {\n      if ( stream->read )\n      {\n        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )\n          goto Fail;\n\n        p = reads;\n      }\n      else\n      {\n        p = stream->base + stream->pos;\n      }\n\n      if ( p )\n        result = FT_NEXT_ULONG_LE( p );\n    }\n    else\n      goto Fail;\n\n    stream->pos += 4;\n\n    return result;\n\n  Fail:\n    *error = FT_THROW( Invalid_Stream_Operation );\n    FT_ERROR(( \"FT_Stream_ReadULongLE:\"\n               \" invalid i/o; pos = 0x%lx, size = 0x%lx\\n\",\n               stream->pos, stream->size ));\n\n    return 0;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_ReadFields( FT_Stream              stream,\n                        const FT_Frame_Field*  fields,\n                        void*                  structure )\n  {\n    FT_Error  error;\n    FT_Bool   frame_accessed = 0;\n    FT_Byte*  cursor;\n\n\n    if ( !fields || !stream )\n      return FT_THROW( Invalid_Argument );\n\n    cursor = stream->cursor;\n\n    error = FT_Err_Ok;\n    do\n    {\n      FT_ULong  value;\n      FT_Int    sign_shift;\n      FT_Byte*  p;\n\n\n      switch ( fields->value )\n      {\n      case ft_frame_start:  /* access a new frame */\n        error = FT_Stream_EnterFrame( stream, fields->offset );\n        if ( error )\n          goto Exit;\n\n        frame_accessed = 1;\n        cursor         = stream->cursor;\n        fields++;\n        continue;  /* loop! */\n\n      case ft_frame_bytes:  /* read a byte sequence */\n      case ft_frame_skip:   /* skip some bytes      */\n        {\n          FT_UInt  len = fields->size;\n\n\n          if ( cursor + len > stream->limit )\n          {\n            error = FT_THROW( Invalid_Stream_Operation );\n            goto Exit;\n          }\n\n          if ( fields->value == ft_frame_bytes )\n          {\n            p = (FT_Byte*)structure + fields->offset;\n            FT_MEM_COPY( p, cursor, len );\n          }\n          cursor += len;\n          fields++;\n          continue;\n        }\n\n      case ft_frame_byte:\n      case ft_frame_schar:  /* read a single byte */\n        value = FT_NEXT_BYTE( cursor );\n        sign_shift = 24;\n        break;\n\n      case ft_frame_short_be:\n      case ft_frame_ushort_be:  /* read a 2-byte big-endian short */\n        value = FT_NEXT_USHORT( cursor) ;\n        sign_shift = 16;\n        break;\n\n      case ft_frame_short_le:\n      case ft_frame_ushort_le:  /* read a 2-byte little-endian short */\n        value = FT_NEXT_USHORT_LE( cursor );\n        sign_shift = 16;\n        break;\n\n      case ft_frame_long_be:\n      case ft_frame_ulong_be:  /* read a 4-byte big-endian long */\n        value = FT_NEXT_ULONG( cursor );\n        sign_shift = 0;\n        break;\n\n      case ft_frame_long_le:\n      case ft_frame_ulong_le:  /* read a 4-byte little-endian long */\n        value = FT_NEXT_ULONG_LE( cursor );\n        sign_shift = 0;\n        break;\n\n      case ft_frame_off3_be:\n      case ft_frame_uoff3_be:  /* read a 3-byte big-endian long */\n        value = FT_NEXT_UOFF3( cursor );\n        sign_shift = 8;\n        break;\n\n      case ft_frame_off3_le:\n      case ft_frame_uoff3_le:  /* read a 3-byte little-endian long */\n        value = FT_NEXT_UOFF3_LE( cursor );\n        sign_shift = 8;\n        break;\n\n      default:\n        /* otherwise, exit the loop */\n        stream->cursor = cursor;\n        goto Exit;\n      }\n\n      /* now, compute the signed value is necessary */\n      if ( fields->value & FT_FRAME_OP_SIGNED )\n        value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift );\n\n      /* finally, store the value in the object */\n\n      p = (FT_Byte*)structure + fields->offset;\n      switch ( fields->size )\n      {\n      case ( 8 / FT_CHAR_BIT ):\n        *(FT_Byte*)p = (FT_Byte)value;\n        break;\n\n      case ( 16 / FT_CHAR_BIT ):\n        *(FT_UShort*)p = (FT_UShort)value;\n        break;\n\n      case ( 32 / FT_CHAR_BIT ):\n        *(FT_UInt32*)p = (FT_UInt32)value;\n        break;\n\n      default:  /* for 64-bit systems */\n        *(FT_ULong*)p = (FT_ULong)value;\n      }\n\n      /* go to next field */\n      fields++;\n    }\n    while ( 1 );\n\n  Exit:\n    /* close the frame if it was opened by this read */\n    if ( frame_accessed )\n      FT_Stream_ExitFrame( stream );\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftstroke.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftstroke.c                                                             */\n/*                                                                         */\n/*    FreeType path stroker (body).                                        */\n/*                                                                         */\n/*  Copyright 2002-2006, 2008-2011, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_STROKER_H\n#include FT_TRIGONOMETRY_H\n#include FT_OUTLINE_H\n#include FT_INTERNAL_MEMORY_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_OBJECTS_H\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_StrokerBorder )\n  FT_Outline_GetInsideBorder( FT_Outline*  outline )\n  {\n    FT_Orientation  o = FT_Outline_Get_Orientation( outline );\n\n\n    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT\n                                        : FT_STROKER_BORDER_LEFT;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_StrokerBorder )\n  FT_Outline_GetOutsideBorder( FT_Outline*  outline )\n  {\n    FT_Orientation  o = FT_Outline_Get_Orientation( outline );\n\n\n    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT\n                                        : FT_STROKER_BORDER_RIGHT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      BEZIER COMPUTATIONS                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define FT_SMALL_CONIC_THRESHOLD  ( FT_ANGLE_PI / 6 )\n#define FT_SMALL_CUBIC_THRESHOLD  ( FT_ANGLE_PI / 8 )\n\n#define FT_EPSILON  2\n\n#define FT_IS_SMALL( x )  ( (x) > -FT_EPSILON && (x) < FT_EPSILON )\n\n\n  static FT_Pos\n  ft_pos_abs( FT_Pos  x )\n  {\n    return x >= 0 ? x : -x;\n  }\n\n\n  static void\n  ft_conic_split( FT_Vector*  base )\n  {\n    FT_Pos  a, b;\n\n\n    base[4].x = base[2].x;\n    b = base[1].x;\n    a = base[3].x = ( base[2].x + b ) / 2;\n    b = base[1].x = ( base[0].x + b ) / 2;\n    base[2].x = ( a + b ) / 2;\n\n    base[4].y = base[2].y;\n    b = base[1].y;\n    a = base[3].y = ( base[2].y + b ) / 2;\n    b = base[1].y = ( base[0].y + b ) / 2;\n    base[2].y = ( a + b ) / 2;\n  }\n\n\n  static FT_Bool\n  ft_conic_is_small_enough( FT_Vector*  base,\n                            FT_Angle   *angle_in,\n                            FT_Angle   *angle_out )\n  {\n    FT_Vector  d1, d2;\n    FT_Angle   theta;\n    FT_Int     close1, close2;\n\n\n    d1.x = base[1].x - base[2].x;\n    d1.y = base[1].y - base[2].y;\n    d2.x = base[0].x - base[1].x;\n    d2.y = base[0].y - base[1].y;\n\n    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );\n    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );\n\n    if ( close1 )\n    {\n      if ( close2 )\n      {\n        /* basically a point;                      */\n        /* do nothing to retain original direction */\n      }\n      else\n      {\n        *angle_in  =\n        *angle_out = FT_Atan2( d2.x, d2.y );\n      }\n    }\n    else /* !close1 */\n    {\n      if ( close2 )\n      {\n        *angle_in  =\n        *angle_out = FT_Atan2( d1.x, d1.y );\n      }\n      else\n      {\n        *angle_in  = FT_Atan2( d1.x, d1.y );\n        *angle_out = FT_Atan2( d2.x, d2.y );\n      }\n    }\n\n    theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) );\n\n    return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD );\n  }\n\n\n  static void\n  ft_cubic_split( FT_Vector*  base )\n  {\n    FT_Pos  a, b, c, d;\n\n\n    base[6].x = base[3].x;\n    c = base[1].x;\n    d = base[2].x;\n    base[1].x = a = ( base[0].x + c ) / 2;\n    base[5].x = b = ( base[3].x + d ) / 2;\n    c = ( c + d ) / 2;\n    base[2].x = a = ( a + c ) / 2;\n    base[4].x = b = ( b + c ) / 2;\n    base[3].x = ( a + b ) / 2;\n\n    base[6].y = base[3].y;\n    c = base[1].y;\n    d = base[2].y;\n    base[1].y = a = ( base[0].y + c ) / 2;\n    base[5].y = b = ( base[3].y + d ) / 2;\n    c = ( c + d ) / 2;\n    base[2].y = a = ( a + c ) / 2;\n    base[4].y = b = ( b + c ) / 2;\n    base[3].y = ( a + b ) / 2;\n  }\n\n\n  /* Return the average of `angle1' and `angle2'.            */\n  /* This gives correct result even if `angle1' and `angle2' */\n  /* have opposite signs.                                    */\n  static FT_Angle\n  ft_angle_mean( FT_Angle  angle1,\n                 FT_Angle  angle2 )\n  {\n    return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2;\n  }\n\n\n  static FT_Bool\n  ft_cubic_is_small_enough( FT_Vector*  base,\n                            FT_Angle   *angle_in,\n                            FT_Angle   *angle_mid,\n                            FT_Angle   *angle_out )\n  {\n    FT_Vector  d1, d2, d3;\n    FT_Angle   theta1, theta2;\n    FT_Int     close1, close2, close3;\n\n\n    d1.x = base[2].x - base[3].x;\n    d1.y = base[2].y - base[3].y;\n    d2.x = base[1].x - base[2].x;\n    d2.y = base[1].y - base[2].y;\n    d3.x = base[0].x - base[1].x;\n    d3.y = base[0].y - base[1].y;\n\n    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );\n    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );\n    close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y );\n\n    if ( close1 )\n    {\n      if ( close2 )\n      {\n        if ( close3 )\n        {\n          /* basically a point;                      */\n          /* do nothing to retain original direction */\n        }\n        else /* !close3 */\n        {\n          *angle_in  =\n          *angle_mid =\n          *angle_out = FT_Atan2( d3.x, d3.y );\n        }\n      }\n      else /* !close2 */\n      {\n        if ( close3 )\n        {\n          *angle_in  =\n          *angle_mid =\n          *angle_out = FT_Atan2( d2.x, d2.y );\n        }\n        else /* !close3 */\n        {\n          *angle_in  =\n          *angle_mid = FT_Atan2( d2.x, d2.y );\n          *angle_out = FT_Atan2( d3.x, d3.y );\n        }\n      }\n    }\n    else /* !close1 */\n    {\n      if ( close2 )\n      {\n        if ( close3 )\n        {\n          *angle_in  =\n          *angle_mid =\n          *angle_out = FT_Atan2( d1.x, d1.y );\n        }\n        else /* !close3 */\n        {\n          *angle_in  = FT_Atan2( d1.x, d1.y );\n          *angle_out = FT_Atan2( d3.x, d3.y );\n          *angle_mid = ft_angle_mean( *angle_in, *angle_out );\n        }\n      }\n      else /* !close2 */\n      {\n        if ( close3 )\n        {\n          *angle_in  = FT_Atan2( d1.x, d1.y );\n          *angle_mid =\n          *angle_out = FT_Atan2( d2.x, d2.y );\n        }\n        else /* !close3 */\n        {\n          *angle_in  = FT_Atan2( d1.x, d1.y );\n          *angle_mid = FT_Atan2( d2.x, d2.y );\n          *angle_out = FT_Atan2( d3.x, d3.y );\n        }\n      }\n    }\n\n    theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in,  *angle_mid ) );\n    theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) );\n\n    return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD &&\n                    theta2 < FT_SMALL_CUBIC_THRESHOLD );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       STROKE BORDERS                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef enum  FT_StrokeTags_\n  {\n    FT_STROKE_TAG_ON    = 1,   /* on-curve point  */\n    FT_STROKE_TAG_CUBIC = 2,   /* cubic off-point */\n    FT_STROKE_TAG_BEGIN = 4,   /* sub-path start  */\n    FT_STROKE_TAG_END   = 8    /* sub-path end    */\n\n  } FT_StrokeTags;\n\n#define  FT_STROKE_TAG_BEGIN_END  ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END )\n\n  typedef struct  FT_StrokeBorderRec_\n  {\n    FT_UInt     num_points;\n    FT_UInt     max_points;\n    FT_Vector*  points;\n    FT_Byte*    tags;\n    FT_Bool     movable;  /* TRUE for ends of lineto borders */\n    FT_Int      start;    /* index of current sub-path start point */\n    FT_Memory   memory;\n    FT_Bool     valid;\n\n  } FT_StrokeBorderRec, *FT_StrokeBorder;\n\n\n  static FT_Error\n  ft_stroke_border_grow( FT_StrokeBorder  border,\n                         FT_UInt          new_points )\n  {\n    FT_UInt   old_max = border->max_points;\n    FT_UInt   new_max = border->num_points + new_points;\n    FT_Error  error   = FT_Err_Ok;\n\n\n    if ( new_max > old_max )\n    {\n      FT_UInt    cur_max = old_max;\n      FT_Memory  memory  = border->memory;\n\n\n      while ( cur_max < new_max )\n        cur_max += ( cur_max >> 1 ) + 16;\n\n      if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) ||\n           FT_RENEW_ARRAY( border->tags,   old_max, cur_max ) )\n        goto Exit;\n\n      border->max_points = cur_max;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  ft_stroke_border_close( FT_StrokeBorder  border,\n                          FT_Bool          reverse )\n  {\n    FT_UInt  start = border->start;\n    FT_UInt  count = border->num_points;\n\n\n    FT_ASSERT( border->start >= 0 );\n\n    /* don't record empty paths! */\n    if ( count <= start + 1U )\n      border->num_points = start;\n    else\n    {\n      /* copy the last point to the start of this sub-path, since */\n      /* it contains the `adjusted' starting coordinates          */\n      border->num_points    = --count;\n      border->points[start] = border->points[count];\n\n      if ( reverse )\n      {\n        /* reverse the points */\n        {\n          FT_Vector*  vec1 = border->points + start + 1;\n          FT_Vector*  vec2 = border->points + count - 1;\n\n\n          for ( ; vec1 < vec2; vec1++, vec2-- )\n          {\n            FT_Vector  tmp;\n\n\n            tmp   = *vec1;\n            *vec1 = *vec2;\n            *vec2 = tmp;\n          }\n        }\n\n        /* then the tags */\n        {\n          FT_Byte*  tag1 = border->tags + start + 1;\n          FT_Byte*  tag2 = border->tags + count - 1;\n\n\n          for ( ; tag1 < tag2; tag1++, tag2-- )\n          {\n            FT_Byte  tmp;\n\n\n            tmp   = *tag1;\n            *tag1 = *tag2;\n            *tag2 = tmp;\n          }\n        }\n      }\n\n      border->tags[start    ] |= FT_STROKE_TAG_BEGIN;\n      border->tags[count - 1] |= FT_STROKE_TAG_END;\n    }\n\n    border->start   = -1;\n    border->movable = FALSE;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_lineto( FT_StrokeBorder  border,\n                           FT_Vector*       to,\n                           FT_Bool          movable )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    FT_ASSERT( border->start >= 0 );\n\n    if ( border->movable )\n    {\n      /* move last point */\n      border->points[border->num_points - 1] = *to;\n    }\n    else\n    {\n      /* don't add zero-length lineto */\n      if ( border->num_points > 0                                          &&\n           FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) &&\n           FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) )\n        return error;\n\n      /* add one point */\n      error = ft_stroke_border_grow( border, 1 );\n      if ( !error )\n      {\n        FT_Vector*  vec = border->points + border->num_points;\n        FT_Byte*    tag = border->tags   + border->num_points;\n\n\n        vec[0] = *to;\n        tag[0] = FT_STROKE_TAG_ON;\n\n        border->num_points += 1;\n      }\n    }\n    border->movable = movable;\n    return error;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_conicto( FT_StrokeBorder  border,\n                            FT_Vector*       control,\n                            FT_Vector*       to )\n  {\n    FT_Error  error;\n\n\n    FT_ASSERT( border->start >= 0 );\n\n    error = ft_stroke_border_grow( border, 2 );\n    if ( !error )\n    {\n      FT_Vector*  vec = border->points + border->num_points;\n      FT_Byte*    tag = border->tags   + border->num_points;\n\n\n      vec[0] = *control;\n      vec[1] = *to;\n\n      tag[0] = 0;\n      tag[1] = FT_STROKE_TAG_ON;\n\n      border->num_points += 2;\n    }\n\n    border->movable = FALSE;\n\n    return error;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_cubicto( FT_StrokeBorder  border,\n                            FT_Vector*       control1,\n                            FT_Vector*       control2,\n                            FT_Vector*       to )\n  {\n    FT_Error  error;\n\n\n    FT_ASSERT( border->start >= 0 );\n\n    error = ft_stroke_border_grow( border, 3 );\n    if ( !error )\n    {\n      FT_Vector*  vec = border->points + border->num_points;\n      FT_Byte*    tag = border->tags   + border->num_points;\n\n\n      vec[0] = *control1;\n      vec[1] = *control2;\n      vec[2] = *to;\n\n      tag[0] = FT_STROKE_TAG_CUBIC;\n      tag[1] = FT_STROKE_TAG_CUBIC;\n      tag[2] = FT_STROKE_TAG_ON;\n\n      border->num_points += 3;\n    }\n\n    border->movable = FALSE;\n\n    return error;\n  }\n\n\n#define FT_ARC_CUBIC_ANGLE  ( FT_ANGLE_PI / 2 )\n\n\n  static FT_Error\n  ft_stroke_border_arcto( FT_StrokeBorder  border,\n                          FT_Vector*       center,\n                          FT_Fixed         radius,\n                          FT_Angle         angle_start,\n                          FT_Angle         angle_diff )\n  {\n    FT_Angle   total, angle, step, rotate, next, theta;\n    FT_Vector  a, b, a2, b2;\n    FT_Fixed   length;\n    FT_Error   error = FT_Err_Ok;\n\n\n    /* compute start point */\n    FT_Vector_From_Polar( &a, radius, angle_start );\n    a.x += center->x;\n    a.y += center->y;\n\n    total  = angle_diff;\n    angle  = angle_start;\n    rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2;\n\n    while ( total != 0 )\n    {\n      step = total;\n      if ( step > FT_ARC_CUBIC_ANGLE )\n        step = FT_ARC_CUBIC_ANGLE;\n\n      else if ( step < -FT_ARC_CUBIC_ANGLE )\n        step = -FT_ARC_CUBIC_ANGLE;\n\n      next  = angle + step;\n      theta = step;\n      if ( theta < 0 )\n        theta = -theta;\n\n      theta >>= 1;\n\n      /* compute end point */\n      FT_Vector_From_Polar( &b, radius, next );\n      b.x += center->x;\n      b.y += center->y;\n\n      /* compute first and second control points */\n      length = FT_MulDiv( radius, FT_Sin( theta ) * 4,\n                          ( 0x10000L + FT_Cos( theta ) ) * 3 );\n\n      FT_Vector_From_Polar( &a2, length, angle + rotate );\n      a2.x += a.x;\n      a2.y += a.y;\n\n      FT_Vector_From_Polar( &b2, length, next - rotate );\n      b2.x += b.x;\n      b2.y += b.y;\n\n      /* add cubic arc */\n      error = ft_stroke_border_cubicto( border, &a2, &b2, &b );\n      if ( error )\n        break;\n\n      /* process the rest of the arc ?? */\n      a      = b;\n      total -= step;\n      angle  = next;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_moveto( FT_StrokeBorder  border,\n                           FT_Vector*       to )\n  {\n    /* close current open path if any ? */\n    if ( border->start >= 0 )\n      ft_stroke_border_close( border, FALSE );\n\n    border->start = border->num_points;\n    border->movable = FALSE;\n\n    return ft_stroke_border_lineto( border, to, FALSE );\n  }\n\n\n  static void\n  ft_stroke_border_init( FT_StrokeBorder  border,\n                         FT_Memory        memory )\n  {\n    border->memory = memory;\n    border->points = NULL;\n    border->tags   = NULL;\n\n    border->num_points = 0;\n    border->max_points = 0;\n    border->start      = -1;\n    border->valid      = FALSE;\n  }\n\n\n  static void\n  ft_stroke_border_reset( FT_StrokeBorder  border )\n  {\n    border->num_points = 0;\n    border->start      = -1;\n    border->valid      = FALSE;\n  }\n\n\n  static void\n  ft_stroke_border_done( FT_StrokeBorder  border )\n  {\n    FT_Memory  memory = border->memory;\n\n\n    FT_FREE( border->points );\n    FT_FREE( border->tags );\n\n    border->num_points = 0;\n    border->max_points = 0;\n    border->start      = -1;\n    border->valid      = FALSE;\n  }\n\n\n  static FT_Error\n  ft_stroke_border_get_counts( FT_StrokeBorder  border,\n                               FT_UInt         *anum_points,\n                               FT_UInt         *anum_contours )\n  {\n    FT_Error  error        = FT_Err_Ok;\n    FT_UInt   num_points   = 0;\n    FT_UInt   num_contours = 0;\n\n    FT_UInt     count      = border->num_points;\n    FT_Vector*  point      = border->points;\n    FT_Byte*    tags       = border->tags;\n    FT_Int      in_contour = 0;\n\n\n    for ( ; count > 0; count--, num_points++, point++, tags++ )\n    {\n      if ( tags[0] & FT_STROKE_TAG_BEGIN )\n      {\n        if ( in_contour != 0 )\n          goto Fail;\n\n        in_contour = 1;\n      }\n      else if ( in_contour == 0 )\n        goto Fail;\n\n      if ( tags[0] & FT_STROKE_TAG_END )\n      {\n        in_contour = 0;\n        num_contours++;\n      }\n    }\n\n    if ( in_contour != 0 )\n      goto Fail;\n\n    border->valid = TRUE;\n\n  Exit:\n    *anum_points   = num_points;\n    *anum_contours = num_contours;\n    return error;\n\n  Fail:\n    num_points   = 0;\n    num_contours = 0;\n    goto Exit;\n  }\n\n\n  static void\n  ft_stroke_border_export( FT_StrokeBorder  border,\n                           FT_Outline*      outline )\n  {\n    /* copy point locations */\n    FT_ARRAY_COPY( outline->points + outline->n_points,\n                   border->points,\n                   border->num_points );\n\n    /* copy tags */\n    {\n      FT_UInt   count = border->num_points;\n      FT_Byte*  read  = border->tags;\n      FT_Byte*  write = (FT_Byte*)outline->tags + outline->n_points;\n\n\n      for ( ; count > 0; count--, read++, write++ )\n      {\n        if ( *read & FT_STROKE_TAG_ON )\n          *write = FT_CURVE_TAG_ON;\n        else if ( *read & FT_STROKE_TAG_CUBIC )\n          *write = FT_CURVE_TAG_CUBIC;\n        else\n          *write = FT_CURVE_TAG_CONIC;\n      }\n    }\n\n    /* copy contours */\n    {\n      FT_UInt    count = border->num_points;\n      FT_Byte*   tags  = border->tags;\n      FT_Short*  write = outline->contours + outline->n_contours;\n      FT_Short   idx   = (FT_Short)outline->n_points;\n\n\n      for ( ; count > 0; count--, tags++, idx++ )\n      {\n        if ( *tags & FT_STROKE_TAG_END )\n        {\n          *write++ = idx;\n          outline->n_contours++;\n        }\n      }\n    }\n\n    outline->n_points = (short)( outline->n_points + border->num_points );\n\n    FT_ASSERT( FT_Outline_Check( outline ) == 0 );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           STROKER                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define FT_SIDE_TO_ROTATE( s )   ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI )\n\n  typedef struct  FT_StrokerRec_\n  {\n    FT_Angle             angle_in;             /* direction into curr join */\n    FT_Angle             angle_out;            /* direction out of join  */\n    FT_Vector            center;               /* current position */\n    FT_Fixed             line_length;          /* length of last lineto */\n    FT_Bool              first_point;          /* is this the start? */\n    FT_Bool              subpath_open;         /* is the subpath open? */\n    FT_Angle             subpath_angle;        /* subpath start direction */\n    FT_Vector            subpath_start;        /* subpath start position */\n    FT_Fixed             subpath_line_length;  /* subpath start lineto len */\n    FT_Bool              handle_wide_strokes;  /* use wide strokes logic? */\n\n    FT_Stroker_LineCap   line_cap;\n    FT_Stroker_LineJoin  line_join;\n    FT_Stroker_LineJoin  line_join_saved;\n    FT_Fixed             miter_limit;\n    FT_Fixed             radius;\n\n    FT_StrokeBorderRec   borders[2];\n    FT_Library           library;\n\n  } FT_StrokerRec;\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_New( FT_Library   library,\n                  FT_Stroker  *astroker )\n  {\n    FT_Error    error;           /* assigned in FT_NEW */\n    FT_Memory   memory;\n    FT_Stroker  stroker = NULL;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Argument );\n\n    memory = library->memory;\n\n    if ( !FT_NEW( stroker ) )\n    {\n      stroker->library = library;\n\n      ft_stroke_border_init( &stroker->borders[0], memory );\n      ft_stroke_border_init( &stroker->borders[1], memory );\n    }\n\n    *astroker = stroker;\n\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_Set( FT_Stroker           stroker,\n                  FT_Fixed             radius,\n                  FT_Stroker_LineCap   line_cap,\n                  FT_Stroker_LineJoin  line_join,\n                  FT_Fixed             miter_limit )\n  {\n    stroker->radius      = radius;\n    stroker->line_cap    = line_cap;\n    stroker->line_join   = line_join;\n    stroker->miter_limit = miter_limit;\n\n    /* ensure miter limit has sensible value */\n    if ( stroker->miter_limit < 0x10000 )\n      stroker->miter_limit = 0x10000;\n\n    /* save line join style:                                           */\n    /* line join style can be temporarily changed when stroking curves */\n    stroker->line_join_saved = line_join;\n\n    FT_Stroker_Rewind( stroker );\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_Rewind( FT_Stroker  stroker )\n  {\n    if ( stroker )\n    {\n      ft_stroke_border_reset( &stroker->borders[0] );\n      ft_stroke_border_reset( &stroker->borders[1] );\n    }\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_Done( FT_Stroker  stroker )\n  {\n    if ( stroker )\n    {\n      FT_Memory  memory = stroker->library->memory;\n\n\n      ft_stroke_border_done( &stroker->borders[0] );\n      ft_stroke_border_done( &stroker->borders[1] );\n\n      stroker->library = NULL;\n      FT_FREE( stroker );\n    }\n  }\n\n\n  /* create a circular arc at a corner or cap */\n  static FT_Error\n  ft_stroker_arcto( FT_Stroker  stroker,\n                    FT_Int      side )\n  {\n    FT_Angle         total, rotate;\n    FT_Fixed         radius = stroker->radius;\n    FT_Error         error  = FT_Err_Ok;\n    FT_StrokeBorder  border = stroker->borders + side;\n\n\n    rotate = FT_SIDE_TO_ROTATE( side );\n\n    total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );\n    if ( total == FT_ANGLE_PI )\n      total = -rotate * 2;\n\n    error = ft_stroke_border_arcto( border,\n                                    &stroker->center,\n                                    radius,\n                                    stroker->angle_in + rotate,\n                                    total );\n    border->movable = FALSE;\n    return error;\n  }\n\n\n  /* add a cap at the end of an opened path */\n  static FT_Error\n  ft_stroker_cap( FT_Stroker  stroker,\n                  FT_Angle    angle,\n                  FT_Int      side )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND )\n    {\n      /* add a round cap */\n      stroker->angle_in  = angle;\n      stroker->angle_out = angle + FT_ANGLE_PI;\n\n      error = ft_stroker_arcto( stroker, side );\n    }\n    else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE )\n    {\n      /* add a square cap */\n      FT_Vector        delta, delta2;\n      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );\n      FT_Fixed         radius = stroker->radius;\n      FT_StrokeBorder  border = stroker->borders + side;\n\n\n      FT_Vector_From_Polar( &delta2, radius, angle + rotate );\n      FT_Vector_From_Polar( &delta,  radius, angle );\n\n      delta.x += stroker->center.x + delta2.x;\n      delta.y += stroker->center.y + delta2.y;\n\n      error = ft_stroke_border_lineto( border, &delta, FALSE );\n      if ( error )\n        goto Exit;\n\n      FT_Vector_From_Polar( &delta2, radius, angle - rotate );\n      FT_Vector_From_Polar( &delta,  radius, angle );\n\n      delta.x += delta2.x + stroker->center.x;\n      delta.y += delta2.y + stroker->center.y;\n\n      error = ft_stroke_border_lineto( border, &delta, FALSE );\n    }\n    else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT )\n    {\n      /* add a butt ending */\n      FT_Vector        delta;\n      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );\n      FT_Fixed         radius = stroker->radius;\n      FT_StrokeBorder  border = stroker->borders + side;\n\n\n      FT_Vector_From_Polar( &delta, radius, angle + rotate );\n\n      delta.x += stroker->center.x;\n      delta.y += stroker->center.y;\n\n      error = ft_stroke_border_lineto( border, &delta, FALSE );\n      if ( error )\n        goto Exit;\n\n      FT_Vector_From_Polar( &delta, radius, angle - rotate );\n\n      delta.x += stroker->center.x;\n      delta.y += stroker->center.y;\n\n      error = ft_stroke_border_lineto( border, &delta, FALSE );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* process an inside corner, i.e. compute intersection */\n  static FT_Error\n  ft_stroker_inside( FT_Stroker  stroker,\n                     FT_Int      side,\n                     FT_Fixed    line_length )\n  {\n    FT_StrokeBorder  border = stroker->borders + side;\n    FT_Angle         phi, theta, rotate;\n    FT_Fixed         length, thcos;\n    FT_Vector        delta;\n    FT_Error         error = FT_Err_Ok;\n    FT_Bool          intersect;          /* use intersection of lines? */\n\n\n    rotate = FT_SIDE_TO_ROTATE( side );\n\n    theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2;\n\n    /* Only intersect borders if between two lineto's and both */\n    /* lines are long enough (line_length is zero for curves). */\n    if ( !border->movable || line_length == 0 )\n      intersect = FALSE;\n    else\n    {\n      /* compute minimum required length of lines */\n      FT_Fixed  min_length = ft_pos_abs( FT_MulFix( stroker->radius,\n                                                    FT_Tan( theta ) ) );\n\n\n      intersect = FT_BOOL( stroker->line_length >= min_length &&\n                           line_length          >= min_length );\n    }\n\n    if ( !intersect )\n    {\n      FT_Vector_From_Polar( &delta, stroker->radius,\n                            stroker->angle_out + rotate );\n      delta.x += stroker->center.x;\n      delta.y += stroker->center.y;\n\n      border->movable = FALSE;\n    }\n    else\n    {\n      /* compute median angle */\n      phi = stroker->angle_in + theta;\n\n      thcos = FT_Cos( theta );\n\n      length = FT_DivFix( stroker->radius, thcos );\n\n      FT_Vector_From_Polar( &delta, length, phi + rotate );\n      delta.x += stroker->center.x;\n      delta.y += stroker->center.y;\n    }\n\n    error = ft_stroke_border_lineto( border, &delta, FALSE );\n\n    return error;\n  }\n\n\n  /* process an outside corner, i.e. compute bevel/miter/round */\n  static FT_Error\n  ft_stroker_outside( FT_Stroker  stroker,\n                      FT_Int      side,\n                      FT_Fixed    line_length )\n  {\n    FT_StrokeBorder  border = stroker->borders + side;\n    FT_Error         error;\n    FT_Angle         rotate;\n\n\n    if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND )\n      error = ft_stroker_arcto( stroker, side );\n    else\n    {\n      /* this is a mitered (pointed) or beveled (truncated) corner */\n      FT_Fixed  sigma = 0, radius = stroker->radius;\n      FT_Angle  theta = 0, phi = 0;\n      FT_Fixed  thcos = 0;\n      FT_Bool   bevel, fixed_bevel;\n\n\n      rotate = FT_SIDE_TO_ROTATE( side );\n\n      bevel =\n        FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL );\n\n      fixed_bevel =\n        FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE );\n\n      if ( !bevel )\n      {\n        theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );\n\n        if ( theta == FT_ANGLE_PI )\n        {\n          theta = rotate;\n          phi   = stroker->angle_in;\n        }\n        else\n        {\n          theta /= 2;\n          phi    = stroker->angle_in + theta + rotate;\n        }\n\n        thcos = FT_Cos( theta );\n        sigma = FT_MulFix( stroker->miter_limit, thcos );\n\n        /* is miter limit exceeded? */\n        if ( sigma < 0x10000L )\n        {\n          /* don't create variable bevels for very small deviations; */\n          /* FT_Sin(x) = 0 for x <= 57                               */\n          if ( fixed_bevel || ft_pos_abs( theta ) > 57 )\n            bevel = TRUE;\n        }\n      }\n\n      if ( bevel )  /* this is a bevel (broken angle) */\n      {\n        if ( fixed_bevel )\n        {\n          /* the outer corners are simply joined together */\n          FT_Vector  delta;\n\n\n          /* add bevel */\n          FT_Vector_From_Polar( &delta,\n                                radius,\n                                stroker->angle_out + rotate );\n          delta.x += stroker->center.x;\n          delta.y += stroker->center.y;\n\n          border->movable = FALSE;\n          error = ft_stroke_border_lineto( border, &delta, FALSE );\n        }\n        else /* variable bevel */\n        {\n          /* the miter is truncated */\n          FT_Vector  middle, delta;\n          FT_Fixed   length;\n\n\n          /* compute middle point */\n          FT_Vector_From_Polar( &middle,\n                                FT_MulFix( radius, stroker->miter_limit ),\n                                phi );\n          middle.x += stroker->center.x;\n          middle.y += stroker->center.y;\n\n          /* compute first angle point */\n          length = FT_MulDiv( radius, 0x10000L - sigma,\n                              ft_pos_abs( FT_Sin( theta ) ) );\n\n          FT_Vector_From_Polar( &delta, length, phi + rotate );\n          delta.x += middle.x;\n          delta.y += middle.y;\n\n          error = ft_stroke_border_lineto( border, &delta, FALSE );\n          if ( error )\n            goto Exit;\n\n          /* compute second angle point */\n          FT_Vector_From_Polar( &delta, length, phi - rotate );\n          delta.x += middle.x;\n          delta.y += middle.y;\n\n          error = ft_stroke_border_lineto( border, &delta, FALSE );\n          if ( error )\n            goto Exit;\n\n          /* finally, add an end point; only needed if not lineto */\n          /* (line_length is zero for curves)                     */\n          if ( line_length == 0 )\n          {\n            FT_Vector_From_Polar( &delta,\n                                  radius,\n                                  stroker->angle_out + rotate );\n\n            delta.x += stroker->center.x;\n            delta.y += stroker->center.y;\n\n            error = ft_stroke_border_lineto( border, &delta, FALSE );\n          }\n        }\n      }\n      else /* this is a miter (intersection) */\n      {\n        FT_Fixed   length;\n        FT_Vector  delta;\n\n\n        length = FT_DivFix( stroker->radius, thcos );\n\n        FT_Vector_From_Polar( &delta, length, phi );\n        delta.x += stroker->center.x;\n        delta.y += stroker->center.y;\n\n        error = ft_stroke_border_lineto( border, &delta, FALSE );\n        if ( error )\n          goto Exit;\n\n        /* now add an end point; only needed if not lineto */\n        /* (line_length is zero for curves)                */\n        if ( line_length == 0 )\n        {\n          FT_Vector_From_Polar( &delta,\n                                stroker->radius,\n                                stroker->angle_out + rotate );\n          delta.x += stroker->center.x;\n          delta.y += stroker->center.y;\n\n          error = ft_stroke_border_lineto( border, &delta, FALSE );\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  ft_stroker_process_corner( FT_Stroker  stroker,\n                             FT_Fixed    line_length )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Angle  turn;\n    FT_Int    inside_side;\n\n\n    turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );\n\n    /* no specific corner processing is required if the turn is 0 */\n    if ( turn == 0 )\n      goto Exit;\n\n    /* when we turn to the right, the inside side is 0 */\n    inside_side = 0;\n\n    /* otherwise, the inside side is 1 */\n    if ( turn < 0 )\n      inside_side = 1;\n\n    /* process the inside side */\n    error = ft_stroker_inside( stroker, inside_side, line_length );\n    if ( error )\n      goto Exit;\n\n    /* process the outside side */\n    error = ft_stroker_outside( stroker, 1 - inside_side, line_length );\n\n  Exit:\n    return error;\n  }\n\n\n  /* add two points to the left and right borders corresponding to the */\n  /* start of the subpath                                              */\n  static FT_Error\n  ft_stroker_subpath_start( FT_Stroker  stroker,\n                            FT_Angle    start_angle,\n                            FT_Fixed    line_length )\n  {\n    FT_Vector        delta;\n    FT_Vector        point;\n    FT_Error         error;\n    FT_StrokeBorder  border;\n\n\n    FT_Vector_From_Polar( &delta, stroker->radius,\n                          start_angle + FT_ANGLE_PI2 );\n\n    point.x = stroker->center.x + delta.x;\n    point.y = stroker->center.y + delta.y;\n\n    border = stroker->borders;\n    error = ft_stroke_border_moveto( border, &point );\n    if ( error )\n      goto Exit;\n\n    point.x = stroker->center.x - delta.x;\n    point.y = stroker->center.y - delta.y;\n\n    border++;\n    error = ft_stroke_border_moveto( border, &point );\n\n    /* save angle, position, and line length for last join */\n    /* (line_length is zero for curves)                    */\n    stroker->subpath_angle       = start_angle;\n    stroker->first_point         = FALSE;\n    stroker->subpath_line_length = line_length;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_LineTo( FT_Stroker  stroker,\n                     FT_Vector*  to )\n  {\n    FT_Error         error = FT_Err_Ok;\n    FT_StrokeBorder  border;\n    FT_Vector        delta;\n    FT_Angle         angle;\n    FT_Int           side;\n    FT_Fixed         line_length;\n\n\n    delta.x = to->x - stroker->center.x;\n    delta.y = to->y - stroker->center.y;\n\n    /* a zero-length lineto is a no-op; avoid creating a spurious corner */\n    if ( delta.x == 0 && delta.y == 0 )\n       goto Exit;\n\n    /* compute length of line */\n    line_length = FT_Vector_Length( &delta );\n\n    angle = FT_Atan2( delta.x, delta.y );\n    FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 );\n\n    /* process corner if necessary */\n    if ( stroker->first_point )\n    {\n      /* This is the first segment of a subpath.  We need to     */\n      /* add a point to each border at their respective starting */\n      /* point locations.                                        */\n      error = ft_stroker_subpath_start( stroker, angle, line_length );\n      if ( error )\n        goto Exit;\n    }\n    else\n    {\n      /* process the current corner */\n      stroker->angle_out = angle;\n      error = ft_stroker_process_corner( stroker, line_length );\n      if ( error )\n        goto Exit;\n    }\n\n    /* now add a line segment to both the `inside' and `outside' paths */\n    for ( border = stroker->borders, side = 1; side >= 0; side--, border++ )\n    {\n      FT_Vector  point;\n\n\n      point.x = to->x + delta.x;\n      point.y = to->y + delta.y;\n\n      /* the ends of lineto borders are movable */\n      error = ft_stroke_border_lineto( border, &point, TRUE );\n      if ( error )\n        goto Exit;\n\n      delta.x = -delta.x;\n      delta.y = -delta.y;\n    }\n\n    stroker->angle_in    = angle;\n    stroker->center      = *to;\n    stroker->line_length = line_length;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_ConicTo( FT_Stroker  stroker,\n                      FT_Vector*  control,\n                      FT_Vector*  to )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Vector   bez_stack[34];\n    FT_Vector*  arc;\n    FT_Vector*  limit = bez_stack + 30;\n    FT_Bool     first_arc = TRUE;\n\n\n    /* if all control points are coincident, this is a no-op; */\n    /* avoid creating a spurious corner                       */\n    if ( FT_IS_SMALL( stroker->center.x - control->x ) &&\n         FT_IS_SMALL( stroker->center.y - control->y ) &&\n         FT_IS_SMALL( control->x        - to->x      ) &&\n         FT_IS_SMALL( control->y        - to->y      ) )\n    {\n       stroker->center = *to;\n       goto Exit;\n    }\n\n    arc    = bez_stack;\n    arc[0] = *to;\n    arc[1] = *control;\n    arc[2] = stroker->center;\n\n    while ( arc >= bez_stack )\n    {\n      FT_Angle  angle_in, angle_out;\n\n\n      /* initialize with current direction */\n      angle_in = angle_out = stroker->angle_in;\n\n      if ( arc < limit                                             &&\n           !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) )\n      {\n        if ( stroker->first_point )\n          stroker->angle_in = angle_in;\n\n        ft_conic_split( arc );\n        arc += 2;\n        continue;\n      }\n\n      if ( first_arc )\n      {\n        first_arc = FALSE;\n\n        /* process corner if necessary */\n        if ( stroker->first_point )\n          error = ft_stroker_subpath_start( stroker, angle_in, 0 );\n        else\n        {\n          stroker->angle_out = angle_in;\n          error = ft_stroker_process_corner( stroker, 0 );\n        }\n      }\n      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >\n                  FT_SMALL_CONIC_THRESHOLD / 4                             )\n      {\n        /* if the deviation from one arc to the next is too great, */\n        /* add a round corner                                      */\n        stroker->center    = arc[2];\n        stroker->angle_out = angle_in;\n        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;\n\n        error = ft_stroker_process_corner( stroker, 0 );\n\n        /* reinstate line join style */\n        stroker->line_join = stroker->line_join_saved;\n      }\n\n      if ( error )\n        goto Exit;\n\n      /* the arc's angle is small enough; we can add it directly to each */\n      /* border                                                          */\n      {\n        FT_Vector        ctrl, end;\n        FT_Angle         theta, phi, rotate, alpha0 = 0;\n        FT_Fixed         length;\n        FT_StrokeBorder  border;\n        FT_Int           side;\n\n\n        theta  = FT_Angle_Diff( angle_in, angle_out ) / 2;\n        phi    = angle_in + theta;\n        length = FT_DivFix( stroker->radius, FT_Cos( theta ) );\n\n        /* compute direction of original arc */\n        if ( stroker->handle_wide_strokes )\n          alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y );\n\n        for ( border = stroker->borders, side = 0;\n              side <= 1;\n              side++, border++ )\n        {\n          rotate = FT_SIDE_TO_ROTATE( side );\n\n          /* compute control point */\n          FT_Vector_From_Polar( &ctrl, length, phi + rotate );\n          ctrl.x += arc[1].x;\n          ctrl.y += arc[1].y;\n\n          /* compute end point */\n          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );\n          end.x += arc[0].x;\n          end.y += arc[0].y;\n\n          if ( stroker->handle_wide_strokes )\n          {\n            FT_Vector  start;\n            FT_Angle   alpha1;\n\n\n            /* determine whether the border radius is greater than the */\n            /* radius of curvature of the original arc                 */\n            start = border->points[border->num_points - 1];\n\n            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );\n\n            /* is the direction of the border arc opposite to */\n            /* that of the original arc? */\n            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >\n                   FT_ANGLE_PI / 2                             )\n            {\n              FT_Angle   beta, gamma;\n              FT_Vector  bvec, delta;\n              FT_Fixed   blen, sinA, sinB, alen;\n\n\n              /* use the sine rule to find the intersection point */\n              beta  = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y );\n              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );\n\n              bvec.x = end.x - start.x;\n              bvec.y = end.y - start.y;\n\n              blen = FT_Vector_Length( &bvec );\n\n              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );\n              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );\n\n              alen = FT_MulDiv( blen, sinA, sinB );\n\n              FT_Vector_From_Polar( &delta, alen, beta );\n              delta.x += start.x;\n              delta.y += start.y;\n\n              /* circumnavigate the negative sector backwards */\n              border->movable = FALSE;\n              error = ft_stroke_border_lineto( border, &delta, FALSE );\n              if ( error )\n                goto Exit;\n              error = ft_stroke_border_lineto( border, &end, FALSE );\n              if ( error )\n                goto Exit;\n              error = ft_stroke_border_conicto( border, &ctrl, &start );\n              if ( error )\n                goto Exit;\n              /* and then move to the endpoint */\n              error = ft_stroke_border_lineto( border, &end, FALSE );\n              if ( error )\n                goto Exit;\n\n              continue;\n            }\n\n            /* else fall through */\n          }\n\n          /* simply add an arc */\n          error = ft_stroke_border_conicto( border, &ctrl, &end );\n          if ( error )\n            goto Exit;\n        }\n      }\n\n      arc -= 2;\n\n      stroker->angle_in = angle_out;\n    }\n\n    stroker->center = *to;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_CubicTo( FT_Stroker  stroker,\n                      FT_Vector*  control1,\n                      FT_Vector*  control2,\n                      FT_Vector*  to )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Vector   bez_stack[37];\n    FT_Vector*  arc;\n    FT_Vector*  limit = bez_stack + 32;\n    FT_Bool     first_arc = TRUE;\n\n\n    /* if all control points are coincident, this is a no-op; */\n    /* avoid creating a spurious corner */\n    if ( FT_IS_SMALL( stroker->center.x - control1->x ) &&\n         FT_IS_SMALL( stroker->center.y - control1->y ) &&\n         FT_IS_SMALL( control1->x       - control2->x ) &&\n         FT_IS_SMALL( control1->y       - control2->y ) &&\n         FT_IS_SMALL( control2->x       - to->x       ) &&\n         FT_IS_SMALL( control2->y       - to->y       ) )\n    {\n       stroker->center = *to;\n       goto Exit;\n    }\n\n    arc    = bez_stack;\n    arc[0] = *to;\n    arc[1] = *control2;\n    arc[2] = *control1;\n    arc[3] = stroker->center;\n\n    while ( arc >= bez_stack )\n    {\n      FT_Angle  angle_in, angle_mid, angle_out;\n\n\n      /* initialize with current direction */\n      angle_in = angle_out = angle_mid = stroker->angle_in;\n\n      if ( arc < limit                                         &&\n           !ft_cubic_is_small_enough( arc, &angle_in,\n                                      &angle_mid, &angle_out ) )\n      {\n        if ( stroker->first_point )\n          stroker->angle_in = angle_in;\n\n        ft_cubic_split( arc );\n        arc += 3;\n        continue;\n      }\n\n      if ( first_arc )\n      {\n        first_arc = FALSE;\n\n        /* process corner if necessary */\n        if ( stroker->first_point )\n          error = ft_stroker_subpath_start( stroker, angle_in, 0 );\n        else\n        {\n          stroker->angle_out = angle_in;\n          error = ft_stroker_process_corner( stroker, 0 );\n        }\n      }\n      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >\n                  FT_SMALL_CUBIC_THRESHOLD / 4                             )\n      {\n        /* if the deviation from one arc to the next is too great, */\n        /* add a round corner                                      */\n        stroker->center    = arc[3];\n        stroker->angle_out = angle_in;\n        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;\n\n        error = ft_stroker_process_corner( stroker, 0 );\n\n        /* reinstate line join style */\n        stroker->line_join = stroker->line_join_saved;\n      }\n\n      if ( error )\n        goto Exit;\n\n      /* the arc's angle is small enough; we can add it directly to each */\n      /* border                                                          */\n      {\n        FT_Vector        ctrl1, ctrl2, end;\n        FT_Angle         theta1, phi1, theta2, phi2, rotate, alpha0 = 0;\n        FT_Fixed         length1, length2;\n        FT_StrokeBorder  border;\n        FT_Int           side;\n\n\n        theta1  = FT_Angle_Diff( angle_in,  angle_mid ) / 2;\n        theta2  = FT_Angle_Diff( angle_mid, angle_out ) / 2;\n        phi1    = ft_angle_mean( angle_in,  angle_mid );\n        phi2    = ft_angle_mean( angle_mid, angle_out );\n        length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) );\n        length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) );\n\n        /* compute direction of original arc */\n        if ( stroker->handle_wide_strokes )\n          alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y );\n\n        for ( border = stroker->borders, side = 0;\n              side <= 1;\n              side++, border++ )\n        {\n          rotate = FT_SIDE_TO_ROTATE( side );\n\n          /* compute control points */\n          FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate );\n          ctrl1.x += arc[2].x;\n          ctrl1.y += arc[2].y;\n\n          FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate );\n          ctrl2.x += arc[1].x;\n          ctrl2.y += arc[1].y;\n\n          /* compute end point */\n          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );\n          end.x += arc[0].x;\n          end.y += arc[0].y;\n\n          if ( stroker->handle_wide_strokes )\n          {\n            FT_Vector  start;\n            FT_Angle   alpha1;\n\n\n            /* determine whether the border radius is greater than the */\n            /* radius of curvature of the original arc                 */\n            start = border->points[border->num_points - 1];\n\n            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );\n\n            /* is the direction of the border arc opposite to */\n            /* that of the original arc? */\n            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >\n                   FT_ANGLE_PI / 2                             )\n            {\n              FT_Angle   beta, gamma;\n              FT_Vector  bvec, delta;\n              FT_Fixed   blen, sinA, sinB, alen;\n\n\n              /* use the sine rule to find the intersection point */\n              beta  = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y );\n              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );\n\n              bvec.x = end.x - start.x;\n              bvec.y = end.y - start.y;\n\n              blen = FT_Vector_Length( &bvec );\n\n              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );\n              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );\n\n              alen = FT_MulDiv( blen, sinA, sinB );\n\n              FT_Vector_From_Polar( &delta, alen, beta );\n              delta.x += start.x;\n              delta.y += start.y;\n\n              /* circumnavigate the negative sector backwards */\n              border->movable = FALSE;\n              error = ft_stroke_border_lineto( border, &delta, FALSE );\n              if ( error )\n                goto Exit;\n              error = ft_stroke_border_lineto( border, &end, FALSE );\n              if ( error )\n                goto Exit;\n              error = ft_stroke_border_cubicto( border,\n                                                &ctrl2,\n                                                &ctrl1,\n                                                &start );\n              if ( error )\n                goto Exit;\n              /* and then move to the endpoint */\n              error = ft_stroke_border_lineto( border, &end, FALSE );\n              if ( error )\n                goto Exit;\n\n              continue;\n            }\n\n            /* else fall through */\n          }\n\n          /* simply add an arc */\n          error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end );\n          if ( error )\n            goto Exit;\n        }\n      }\n\n      arc -= 3;\n\n      stroker->angle_in = angle_out;\n    }\n\n    stroker->center = *to;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_BeginSubPath( FT_Stroker  stroker,\n                           FT_Vector*  to,\n                           FT_Bool     open )\n  {\n    /* We cannot process the first point, because there is not enough      */\n    /* information regarding its corner/cap.  The latter will be processed */\n    /* in the `FT_Stroker_EndSubPath' routine.                             */\n    /*                                                                     */\n    stroker->first_point  = TRUE;\n    stroker->center       = *to;\n    stroker->subpath_open = open;\n\n    /* Determine if we need to check whether the border radius is greater */\n    /* than the radius of curvature of a curve, to handle this case       */\n    /* specially.  This is only required if bevel joins or butt caps may  */\n    /* be created, because round & miter joins and round & square caps    */\n    /* cover the negative sector created with wide strokes.               */\n    stroker->handle_wide_strokes =\n      FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND  ||\n               ( stroker->subpath_open                        &&\n                 stroker->line_cap == FT_STROKER_LINECAP_BUTT ) );\n\n    /* record the subpath start point for each border */\n    stroker->subpath_start = *to;\n\n    stroker->angle_in = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  ft_stroker_add_reverse_left( FT_Stroker  stroker,\n                               FT_Bool     open )\n  {\n    FT_StrokeBorder  right = stroker->borders + 0;\n    FT_StrokeBorder  left  = stroker->borders + 1;\n    FT_Int           new_points;\n    FT_Error         error = FT_Err_Ok;\n\n\n    FT_ASSERT( left->start >= 0 );\n\n    new_points = left->num_points - left->start;\n    if ( new_points > 0 )\n    {\n      error = ft_stroke_border_grow( right, (FT_UInt)new_points );\n      if ( error )\n        goto Exit;\n\n      {\n        FT_Vector*  dst_point = right->points + right->num_points;\n        FT_Byte*    dst_tag   = right->tags   + right->num_points;\n        FT_Vector*  src_point = left->points  + left->num_points - 1;\n        FT_Byte*    src_tag   = left->tags    + left->num_points - 1;\n\n\n        while ( src_point >= left->points + left->start )\n        {\n          *dst_point = *src_point;\n          *dst_tag   = *src_tag;\n\n          if ( open )\n            dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END;\n          else\n          {\n            FT_Byte  ttag =\n                       (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END );\n\n\n            /* switch begin/end tags if necessary */\n            if ( ttag == FT_STROKE_TAG_BEGIN ||\n                 ttag == FT_STROKE_TAG_END   )\n              dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END;\n          }\n\n          src_point--;\n          src_tag--;\n          dst_point++;\n          dst_tag++;\n        }\n      }\n\n      left->num_points   = left->start;\n      right->num_points += new_points;\n\n      right->movable = FALSE;\n      left->movable  = FALSE;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  /* there's a lot of magic in this function! */\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_EndSubPath( FT_Stroker  stroker )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( stroker->subpath_open )\n    {\n      FT_StrokeBorder  right = stroker->borders;\n\n\n      /* All right, this is an opened path, we need to add a cap between */\n      /* right & left, add the reverse of left, then add a final cap     */\n      /* between left & right.                                           */\n      error = ft_stroker_cap( stroker, stroker->angle_in, 0 );\n      if ( error )\n        goto Exit;\n\n      /* add reversed points from `left' to `right' */\n      error = ft_stroker_add_reverse_left( stroker, TRUE );\n      if ( error )\n        goto Exit;\n\n      /* now add the final cap */\n      stroker->center = stroker->subpath_start;\n      error = ft_stroker_cap( stroker,\n                              stroker->subpath_angle + FT_ANGLE_PI, 0 );\n      if ( error )\n        goto Exit;\n\n      /* Now end the right subpath accordingly.  The left one is */\n      /* rewind and doesn't need further processing.             */\n      ft_stroke_border_close( right, FALSE );\n    }\n    else\n    {\n      FT_Angle  turn;\n      FT_Int    inside_side;\n\n\n      /* close the path if needed */\n      if ( stroker->center.x != stroker->subpath_start.x ||\n           stroker->center.y != stroker->subpath_start.y )\n      {\n         error = FT_Stroker_LineTo( stroker, &stroker->subpath_start );\n         if ( error )\n           goto Exit;\n      }\n\n      /* process the corner */\n      stroker->angle_out = stroker->subpath_angle;\n      turn               = FT_Angle_Diff( stroker->angle_in,\n                                          stroker->angle_out );\n\n      /* no specific corner processing is required if the turn is 0 */\n      if ( turn != 0 )\n      {\n        /* when we turn to the right, the inside side is 0 */\n        inside_side = 0;\n\n        /* otherwise, the inside side is 1 */\n        if ( turn < 0 )\n          inside_side = 1;\n\n        error = ft_stroker_inside( stroker,\n                                   inside_side,\n                                   stroker->subpath_line_length );\n        if ( error )\n          goto Exit;\n\n        /* process the outside side */\n        error = ft_stroker_outside( stroker,\n                                    1 - inside_side,\n                                    stroker->subpath_line_length );\n        if ( error )\n          goto Exit;\n      }\n\n      /* then end our two subpaths */\n      ft_stroke_border_close( stroker->borders + 0, FALSE );\n      ft_stroke_border_close( stroker->borders + 1, TRUE );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,\n                              FT_StrokerBorder  border,\n                              FT_UInt          *anum_points,\n                              FT_UInt          *anum_contours )\n  {\n    FT_UInt   num_points = 0, num_contours = 0;\n    FT_Error  error;\n\n\n    if ( !stroker || border > 1 )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    error = ft_stroke_border_get_counts( stroker->borders + border,\n                                         &num_points, &num_contours );\n  Exit:\n    if ( anum_points )\n      *anum_points = num_points;\n\n    if ( anum_contours )\n      *anum_contours = num_contours;\n\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_GetCounts( FT_Stroker  stroker,\n                        FT_UInt    *anum_points,\n                        FT_UInt    *anum_contours )\n  {\n    FT_UInt   count1, count2, num_points   = 0;\n    FT_UInt   count3, count4, num_contours = 0;\n    FT_Error  error;\n\n\n    error = ft_stroke_border_get_counts( stroker->borders + 0,\n                                         &count1, &count2 );\n    if ( error )\n      goto Exit;\n\n    error = ft_stroke_border_get_counts( stroker->borders + 1,\n                                         &count3, &count4 );\n    if ( error )\n      goto Exit;\n\n    num_points   = count1 + count3;\n    num_contours = count2 + count4;\n\n  Exit:\n    *anum_points   = num_points;\n    *anum_contours = num_contours;\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_ExportBorder( FT_Stroker        stroker,\n                           FT_StrokerBorder  border,\n                           FT_Outline*       outline )\n  {\n    if ( border == FT_STROKER_BORDER_LEFT  ||\n         border == FT_STROKER_BORDER_RIGHT )\n    {\n      FT_StrokeBorder  sborder = & stroker->borders[border];\n\n\n      if ( sborder->valid )\n        ft_stroke_border_export( sborder, outline );\n    }\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Stroker_Export( FT_Stroker   stroker,\n                     FT_Outline*  outline )\n  {\n    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline );\n    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline );\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  /*\n   *  The following is very similar to FT_Outline_Decompose, except\n   *  that we do support opened paths, and do not scale the outline.\n   */\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stroker_ParseOutline( FT_Stroker   stroker,\n                           FT_Outline*  outline,\n                           FT_Bool      opened )\n  {\n    FT_Vector   v_last;\n    FT_Vector   v_control;\n    FT_Vector   v_start;\n\n    FT_Vector*  point;\n    FT_Vector*  limit;\n    char*       tags;\n\n    FT_Error    error;\n\n    FT_Int      n;         /* index of contour in outline     */\n    FT_UInt     first;     /* index of first point in contour */\n    FT_Int      tag;       /* current point's state           */\n\n\n    if ( !outline || !stroker )\n      return FT_THROW( Invalid_Argument );\n\n    FT_Stroker_Rewind( stroker );\n\n    first = 0;\n\n    for ( n = 0; n < outline->n_contours; n++ )\n    {\n      FT_UInt  last;  /* index of last point in contour */\n\n\n      last  = outline->contours[n];\n      limit = outline->points + last;\n\n      /* skip empty points; we don't stroke these */\n      if ( last <= first )\n      {\n        first = last + 1;\n        continue;\n      }\n\n      v_start = outline->points[first];\n      v_last  = outline->points[last];\n\n      v_control = v_start;\n\n      point = outline->points + first;\n      tags  = outline->tags   + first;\n      tag   = FT_CURVE_TAG( tags[0] );\n\n      /* A contour cannot start with a cubic control point! */\n      if ( tag == FT_CURVE_TAG_CUBIC )\n        goto Invalid_Outline;\n\n      /* check first point to determine origin */\n      if ( tag == FT_CURVE_TAG_CONIC )\n      {\n        /* First point is conic control.  Yes, this happens. */\n        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )\n        {\n          /* start at last point if it is on the curve */\n          v_start = v_last;\n          limit--;\n        }\n        else\n        {\n          /* if both first and last points are conic, */\n          /* start at their middle                    */\n          v_start.x = ( v_start.x + v_last.x ) / 2;\n          v_start.y = ( v_start.y + v_last.y ) / 2;\n        }\n        point--;\n        tags--;\n      }\n\n      error = FT_Stroker_BeginSubPath( stroker, &v_start, opened );\n      if ( error )\n        goto Exit;\n\n      while ( point < limit )\n      {\n        point++;\n        tags++;\n\n        tag = FT_CURVE_TAG( tags[0] );\n        switch ( tag )\n        {\n        case FT_CURVE_TAG_ON:  /* emit a single line_to */\n          {\n            FT_Vector  vec;\n\n\n            vec.x = point->x;\n            vec.y = point->y;\n\n            error = FT_Stroker_LineTo( stroker, &vec );\n            if ( error )\n              goto Exit;\n            continue;\n          }\n\n        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */\n          v_control.x = point->x;\n          v_control.y = point->y;\n\n        Do_Conic:\n          if ( point < limit )\n          {\n            FT_Vector  vec;\n            FT_Vector  v_middle;\n\n\n            point++;\n            tags++;\n            tag = FT_CURVE_TAG( tags[0] );\n\n            vec = point[0];\n\n            if ( tag == FT_CURVE_TAG_ON )\n            {\n              error = FT_Stroker_ConicTo( stroker, &v_control, &vec );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            if ( tag != FT_CURVE_TAG_CONIC )\n              goto Invalid_Outline;\n\n            v_middle.x = ( v_control.x + vec.x ) / 2;\n            v_middle.y = ( v_control.y + vec.y ) / 2;\n\n            error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle );\n            if ( error )\n              goto Exit;\n\n            v_control = vec;\n            goto Do_Conic;\n          }\n\n          error = FT_Stroker_ConicTo( stroker, &v_control, &v_start );\n          goto Close;\n\n        default:  /* FT_CURVE_TAG_CUBIC */\n          {\n            FT_Vector  vec1, vec2;\n\n\n            if ( point + 1 > limit                             ||\n                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )\n              goto Invalid_Outline;\n\n            point += 2;\n            tags  += 2;\n\n            vec1 = point[-2];\n            vec2 = point[-1];\n\n            if ( point <= limit )\n            {\n              FT_Vector  vec;\n\n\n              vec = point[0];\n\n              error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start );\n            goto Close;\n          }\n        }\n      }\n\n    Close:\n      if ( error )\n        goto Exit;\n\n      /* don't try to end the path if no segments have been generated */\n      if ( !stroker->first_point )\n      {\n        error = FT_Stroker_EndSubPath( stroker );\n        if ( error )\n          goto Exit;\n      }\n\n      first = last + 1;\n    }\n\n    return FT_Err_Ok;\n\n  Exit:\n    return error;\n\n  Invalid_Outline:\n    return FT_THROW( Invalid_Outline );\n  }\n\n\n  /* declare an extern to access `ft_outline_glyph_class' globally     */\n  /* allocated  in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */\n  /* macro to access it when FT_CONFIG_OPTION_PIC is defined           */\n#ifndef FT_CONFIG_OPTION_PIC\n  extern const FT_Glyph_Class  ft_outline_glyph_class;\n#endif\n#include \"basepic.h\"\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_Stroke( FT_Glyph    *pglyph,\n                   FT_Stroker   stroker,\n                   FT_Bool      destroy )\n  {\n    FT_Error    error   = FT_ERR( Invalid_Argument );\n    FT_Glyph    glyph   = NULL;\n    FT_Library  library = stroker->library;\n\n    FT_UNUSED( library );\n\n\n    if ( pglyph == NULL )\n      goto Exit;\n\n    glyph = *pglyph;\n    if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )\n      goto Exit;\n\n    {\n      FT_Glyph  copy;\n\n\n      error = FT_Glyph_Copy( glyph, &copy );\n      if ( error )\n        goto Exit;\n\n      glyph = copy;\n    }\n\n    {\n      FT_OutlineGlyph  oglyph  = (FT_OutlineGlyph)glyph;\n      FT_Outline*      outline = &oglyph->outline;\n      FT_UInt          num_points, num_contours;\n\n\n      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );\n      if ( error )\n        goto Fail;\n\n      (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours );\n\n      FT_Outline_Done( glyph->library, outline );\n\n      error = FT_Outline_New( glyph->library,\n                              num_points, num_contours, outline );\n      if ( error )\n        goto Fail;\n\n      outline->n_points   = 0;\n      outline->n_contours = 0;\n\n      FT_Stroker_Export( stroker, outline );\n    }\n\n    if ( destroy )\n      FT_Done_Glyph( *pglyph );\n\n    *pglyph = glyph;\n    goto Exit;\n\n  Fail:\n    FT_Done_Glyph( glyph );\n    glyph = NULL;\n\n    if ( !destroy )\n      *pglyph = NULL;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftstroke.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,\n                         FT_Stroker   stroker,\n                         FT_Bool      inside,\n                         FT_Bool      destroy )\n  {\n    FT_Error    error   = FT_ERR( Invalid_Argument );\n    FT_Glyph    glyph   = NULL;\n    FT_Library  library = stroker->library;\n\n    FT_UNUSED( library );\n\n\n    if ( pglyph == NULL )\n      goto Exit;\n\n    glyph = *pglyph;\n    if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )\n      goto Exit;\n\n    {\n      FT_Glyph  copy;\n\n\n      error = FT_Glyph_Copy( glyph, &copy );\n      if ( error )\n        goto Exit;\n\n      glyph = copy;\n    }\n\n    {\n      FT_OutlineGlyph   oglyph  = (FT_OutlineGlyph)glyph;\n      FT_StrokerBorder  border;\n      FT_Outline*       outline = &oglyph->outline;\n      FT_UInt           num_points, num_contours;\n\n\n      border = FT_Outline_GetOutsideBorder( outline );\n      if ( inside )\n      {\n        if ( border == FT_STROKER_BORDER_LEFT )\n          border = FT_STROKER_BORDER_RIGHT;\n        else\n          border = FT_STROKER_BORDER_LEFT;\n      }\n\n      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );\n      if ( error )\n        goto Fail;\n\n      (void)FT_Stroker_GetBorderCounts( stroker, border,\n                                        &num_points, &num_contours );\n\n      FT_Outline_Done( glyph->library, outline );\n\n      error = FT_Outline_New( glyph->library,\n                              num_points,\n                              num_contours,\n                              outline );\n      if ( error )\n        goto Fail;\n\n      outline->n_points   = 0;\n      outline->n_contours = 0;\n\n      FT_Stroker_ExportBorder( stroker, border, outline );\n    }\n\n    if ( destroy )\n      FT_Done_Glyph( *pglyph );\n\n    *pglyph = glyph;\n    goto Exit;\n\n  Fail:\n    FT_Done_Glyph( glyph );\n    glyph = NULL;\n\n    if ( !destroy )\n      *pglyph = NULL;\n\n  Exit:\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftsynth.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsynth.c                                                              */\n/*                                                                         */\n/*    FreeType synthesizing code for emboldening and slanting (body).      */\n/*                                                                         */\n/*  Copyright 2000-2006, 2010, 2012 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_SYNTHESIS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_OUTLINE_H\n#include FT_BITMAP_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_synth\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   EXPERIMENTAL OBLIQUING SUPPORT                                ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* documentation is in ftsynth.h */\n\n  FT_EXPORT_DEF( void )\n  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot )\n  {\n    FT_Matrix    transform;\n    FT_Outline*  outline = &slot->outline;\n\n\n    /* only oblique outline glyphs */\n    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )\n      return;\n\n    /* we don't touch the advance width */\n\n    /* For italic, simply apply a shear transform, with an angle */\n    /* of about 12 degrees.                                      */\n\n    transform.xx = 0x10000L;\n    transform.yx = 0x00000L;\n\n    transform.xy = 0x0366AL;\n    transform.yy = 0x10000L;\n\n    FT_Outline_Transform( outline, &transform );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****   EXPERIMENTAL EMBOLDENING SUPPORT                              ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* documentation is in ftsynth.h */\n\n  FT_EXPORT_DEF( void )\n  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot )\n  {\n    FT_Library  library = slot->library;\n    FT_Face     face    = slot->face;\n    FT_Error    error;\n    FT_Pos      xstr, ystr;\n\n\n    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&\n         slot->format != FT_GLYPH_FORMAT_BITMAP  )\n      return;\n\n    /* some reasonable strength */\n    xstr = FT_MulFix( face->units_per_EM,\n                      face->size->metrics.y_scale ) / 24;\n    ystr = xstr;\n\n    if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )\n    {\n      /* ignore error */\n      (void)FT_Outline_EmboldenXY( &slot->outline, xstr, ystr );\n    }\n    else /* slot->format == FT_GLYPH_FORMAT_BITMAP */\n    {\n      /* round to full pixels */\n      xstr &= ~63;\n      if ( xstr == 0 )\n        xstr = 1 << 6;\n      ystr &= ~63;\n\n      /*\n       * XXX: overflow check for 16-bit system, for compatibility\n       *      with FT_GlyphSlot_Embolden() since freetype-2.1.10.\n       *      unfortunately, this function return no informations\n       *      about the cause of error.\n       */\n      if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )\n      {\n        FT_TRACE1(( \"FT_GlyphSlot_Embolden:\" ));\n        FT_TRACE1(( \"too strong embolding parameter ystr=%d\\n\", ystr ));\n        return;\n      }\n      error = FT_GlyphSlot_Own_Bitmap( slot );\n      if ( error )\n        return;\n\n      error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );\n      if ( error )\n        return;\n    }\n\n    if ( slot->advance.x )\n      slot->advance.x += xstr;\n\n    if ( slot->advance.y )\n      slot->advance.y += ystr;\n\n    slot->metrics.width       += xstr;\n    slot->metrics.height      += ystr;\n    slot->metrics.horiAdvance += xstr;\n    slot->metrics.vertAdvance += ystr;\n\n    /* XXX: 16-bit overflow case must be excluded before here */\n    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )\n      slot->bitmap_top += (FT_Int)( ystr >> 6 );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftsystem.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsystem.c                                                             */\n/*                                                                         */\n/*    ANSI-specific FreeType low-level system interface (body).            */\n/*                                                                         */\n/*  Copyright 1996-2002, 2006, 2008-2011, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file contains the default interface used by FreeType to access   */\n  /* low-level, i.e. memory management, i/o access as well as thread       */\n  /* synchronisation.  It can be replaced by user-specific routines if     */\n  /* necessary.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_SYSTEM_H\n#include FT_ERRORS_H\n#include FT_TYPES_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                       MEMORY MANAGEMENT INTERFACE                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* It is not necessary to do any error checking for the                  */\n  /* allocation-related functions.  This will be done by the higher level  */\n  /* routines like ft_mem_alloc() or ft_mem_realloc().                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_alloc                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The memory allocation function.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A pointer to the memory object.                          */\n  /*                                                                       */\n  /*    size   :: The requested size in bytes.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The address of newly allocated block.                              */\n  /*                                                                       */\n  FT_CALLBACK_DEF( void* )\n  ft_alloc( FT_Memory  memory,\n            long       size )\n  {\n    FT_UNUSED( memory );\n\n    return ft_smalloc( size );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_realloc                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The memory reallocation function.                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory   :: A pointer to the memory object.                        */\n  /*                                                                       */\n  /*    cur_size :: The current size of the allocated memory block.        */\n  /*                                                                       */\n  /*    new_size :: The newly requested size in bytes.                     */\n  /*                                                                       */\n  /*    block    :: The current address of the block in memory.            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The address of the reallocated memory block.                       */\n  /*                                                                       */\n  FT_CALLBACK_DEF( void* )\n  ft_realloc( FT_Memory  memory,\n              long       cur_size,\n              long       new_size,\n              void*      block )\n  {\n    FT_UNUSED( memory );\n    FT_UNUSED( cur_size );\n\n    return ft_srealloc( block, new_size );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_free                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The memory release function.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory  :: A pointer to the memory object.                         */\n  /*                                                                       */\n  /*    block   :: The address of block in memory to be freed.             */\n  /*                                                                       */\n  FT_CALLBACK_DEF( void )\n  ft_free( FT_Memory  memory,\n           void*      block )\n  {\n    FT_UNUSED( memory );\n\n    ft_sfree( block );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                     RESOURCE MANAGEMENT INTERFACE                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_io\n\n  /* We use the macro STREAM_FILE for convenience to extract the       */\n  /* system-specific stream handle from a given FreeType stream object */\n#define STREAM_FILE( stream )  ( (FT_FILE*)stream->descriptor.pointer )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_ansi_stream_close                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The function to close a stream.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A pointer to the stream object.                          */\n  /*                                                                       */\n  FT_CALLBACK_DEF( void )\n  ft_ansi_stream_close( FT_Stream  stream )\n  {\n    ft_fclose( STREAM_FILE( stream ) );\n\n    stream->descriptor.pointer = NULL;\n    stream->size               = 0;\n    stream->base               = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_ansi_stream_io                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The function to open a stream.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A pointer to the stream object.                          */\n  /*                                                                       */\n  /*    offset :: The position in the data stream to start reading.        */\n  /*                                                                       */\n  /*    buffer :: The address of buffer to store the read data.            */\n  /*                                                                       */\n  /*    count  :: The number of bytes to read from the stream.             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The number of bytes actually read.  If `count' is zero (this is,   */\n  /*    the function is used for seeking), a non-zero return value         */\n  /*    indicates an error.                                                */\n  /*                                                                       */\n  FT_CALLBACK_DEF( unsigned long )\n  ft_ansi_stream_io( FT_Stream       stream,\n                     unsigned long   offset,\n                     unsigned char*  buffer,\n                     unsigned long   count )\n  {\n    FT_FILE*  file;\n\n\n    if ( !count && offset > stream->size )\n      return 1;\n\n    file = STREAM_FILE( stream );\n\n    if ( stream->pos != offset )\n      ft_fseek( file, offset, SEEK_SET );\n\n    return (unsigned long)ft_fread( buffer, 1, count, file );\n  }\n\n\n  /* documentation is in ftstream.h */\n\n  FT_BASE_DEF( FT_Error )\n  FT_Stream_Open( FT_Stream    stream,\n                  const char*  filepathname )\n  {\n    FT_FILE*  file;\n\n\n    if ( !stream )\n      return FT_THROW( Invalid_Stream_Handle );\n\n    stream->descriptor.pointer = NULL;\n    stream->pathname.pointer   = (char*)filepathname;\n    stream->base               = 0;\n    stream->pos                = 0;\n    stream->read               = NULL;\n    stream->close              = NULL;\n\n    file = ft_fopen( filepathname, \"rb\" );\n    if ( !file )\n    {\n      FT_ERROR(( \"FT_Stream_Open:\"\n                 \" could not open `%s'\\n\", filepathname ));\n\n      return FT_THROW( Cannot_Open_Resource );\n    }\n\n    ft_fseek( file, 0, SEEK_END );\n    stream->size = ft_ftell( file );\n    if ( !stream->size )\n    {\n      FT_ERROR(( \"FT_Stream_Open:\" ));\n      FT_ERROR(( \" opened `%s' but zero-sized\\n\", filepathname ));\n      ft_fclose( file );\n      return FT_THROW( Cannot_Open_Stream );\n    }\n    ft_fseek( file, 0, SEEK_SET );\n\n    stream->descriptor.pointer = file;\n    stream->read  = ft_ansi_stream_io;\n    stream->close = ft_ansi_stream_close;\n\n    FT_TRACE1(( \"FT_Stream_Open:\" ));\n    FT_TRACE1(( \" opened `%s' (%d bytes) successfully\\n\",\n                filepathname, stream->size ));\n\n    return FT_Err_Ok;\n  }\n\n#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */\n\n#ifdef FT_DEBUG_MEMORY\n\n  extern FT_Int\n  ft_mem_debug_init( FT_Memory  memory );\n\n  extern void\n  ft_mem_debug_done( FT_Memory  memory );\n\n#endif\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( FT_Memory )\n  FT_New_Memory( void )\n  {\n    FT_Memory  memory;\n\n\n    memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) );\n    if ( memory )\n    {\n      memory->user    = 0;\n      memory->alloc   = ft_alloc;\n      memory->realloc = ft_realloc;\n      memory->free    = ft_free;\n#ifdef FT_DEBUG_MEMORY\n      ft_mem_debug_init( memory );\n#endif\n    }\n\n    return memory;\n  }\n\n\n  /* documentation is in ftobjs.h */\n\n  FT_BASE_DEF( void )\n  FT_Done_Memory( FT_Memory  memory )\n  {\n#ifdef FT_DEBUG_MEMORY\n    ft_mem_debug_done( memory );\n#endif\n    ft_sfree( memory );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/fttrigon.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttrigon.c                                                             */\n/*                                                                         */\n/*    FreeType trigonometric functions (body).                             */\n/*                                                                         */\n/*  Copyright 2001-2005, 2012-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This is a fixed-point CORDIC implementation of trigonometric          */\n  /* functions as well as transformations between Cartesian and polar      */\n  /* coordinates.  The angles are represented as 16.16 fixed-point values  */\n  /* in degrees, i.e., the angular resolution is 2^-16 degrees.  Note that */\n  /* only vectors longer than 2^16*180/pi (or at least 22 bits) on a       */\n  /* discrete Cartesian grid can have the same or better angular           */\n  /* resolution.  Therefore, to maintain this precision, some functions    */\n  /* require an interim upscaling of the vectors, whereas others operate   */\n  /* with 24-bit long vectors directly.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_CALC_H\n#include FT_TRIGONOMETRY_H\n\n\n  /* the Cordic shrink factor 0.858785336480436 * 2^32 */\n#define FT_TRIG_SCALE      0xDBD95B16UL\n\n  /* the highest bit in overflow-safe vector components, */\n  /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30         */\n#define FT_TRIG_SAFE_MSB   29\n\n  /* this table was generated for FT_PI = 180L << 16, i.e. degrees */\n#define FT_TRIG_MAX_ITERS  23\n\n  static const FT_Fixed\n  ft_trig_arctan_table[] =\n  {\n    1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L,\n    14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L,\n    57L, 29L, 14L, 7L, 4L, 2L, 1L\n  };\n\n\n#ifdef FT_LONG64\n\n  /* multiply a given value by the CORDIC shrink factor */\n  static FT_Fixed\n  ft_trig_downscale( FT_Fixed  val )\n  {\n    FT_Fixed  s;\n    FT_Int64  v;\n\n\n    s   = val;\n    val = FT_ABS( val );\n\n    v   = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL;\n    val = (FT_Fixed)( v >> 32 );\n\n    return ( s >= 0 ) ? val : -val;\n  }\n\n#else /* !FT_LONG64 */\n\n  /* multiply a given value by the CORDIC shrink factor */\n  static FT_Fixed\n  ft_trig_downscale( FT_Fixed  val )\n  {\n    FT_Fixed   s;\n    FT_UInt32  v1, v2, k1, k2, hi, lo1, lo2, lo3;\n\n\n    s   = val;\n    val = FT_ABS( val );\n\n    v1 = (FT_UInt32)val >> 16;\n    v2 = (FT_UInt32)( val & 0xFFFFL );\n\n    k1 = (FT_UInt32)FT_TRIG_SCALE >> 16;           /* constant */\n    k2 = (FT_UInt32)( FT_TRIG_SCALE & 0xFFFFL );   /* constant */\n\n    hi   = k1 * v1;\n    lo1  = k1 * v2 + k2 * v1;       /* can't overflow */\n\n    lo2  = ( k2 * v2 ) >> 16;\n    lo3  = FT_MAX( lo1, lo2 );\n    lo1 += lo2;\n\n    hi  += lo1 >> 16;\n    if ( lo1 < lo3 )\n      hi += (FT_UInt32)0x10000UL;\n\n    val  = (FT_Fixed)hi;\n\n    return ( s >= 0 ) ? val : -val;\n  }\n\n#endif /* !FT_LONG64 */\n\n\n  static FT_Int\n  ft_trig_prenorm( FT_Vector*  vec )\n  {\n    FT_Pos  x, y;\n    FT_Int  shift;\n\n\n    x = vec->x;\n    y = vec->y;\n\n    shift = FT_MSB( FT_ABS( x ) | FT_ABS( y ) );\n\n    if ( shift <= FT_TRIG_SAFE_MSB )\n    {\n      shift  = FT_TRIG_SAFE_MSB - shift;\n      vec->x = (FT_Pos)( (FT_ULong)x << shift );\n      vec->y = (FT_Pos)( (FT_ULong)y << shift );\n    }\n    else\n    {\n      shift -= FT_TRIG_SAFE_MSB;\n      vec->x = x >> shift;\n      vec->y = y >> shift;\n      shift  = -shift;\n    }\n\n    return shift;\n  }\n\n\n  static void\n  ft_trig_pseudo_rotate( FT_Vector*  vec,\n                         FT_Angle    theta )\n  {\n    FT_Int           i;\n    FT_Fixed         x, y, xtemp, b;\n    const FT_Fixed  *arctanptr;\n\n\n    x = vec->x;\n    y = vec->y;\n\n    /* Rotate inside [-PI/4,PI/4] sector */\n    while ( theta < -FT_ANGLE_PI4 )\n    {\n      xtemp  =  y;\n      y      = -x;\n      x      =  xtemp;\n      theta +=  FT_ANGLE_PI2;\n    }\n\n    while ( theta > FT_ANGLE_PI4 )\n    {\n      xtemp  = -y;\n      y      =  x;\n      x      =  xtemp;\n      theta -=  FT_ANGLE_PI2;\n    }\n\n    arctanptr = ft_trig_arctan_table;\n\n    /* Pseudorotations, with right shifts */\n    for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )\n    {\n      if ( theta < 0 )\n      {\n        xtemp  = x + ( ( y + b ) >> i );\n        y      = y - ( ( x + b ) >> i );\n        x      = xtemp;\n        theta += *arctanptr++;\n      }\n      else\n      {\n        xtemp  = x - ( ( y + b ) >> i );\n        y      = y + ( ( x + b ) >> i );\n        x      = xtemp;\n        theta -= *arctanptr++;\n      }\n    }\n\n    vec->x = x;\n    vec->y = y;\n  }\n\n\n  static void\n  ft_trig_pseudo_polarize( FT_Vector*  vec )\n  {\n    FT_Angle         theta;\n    FT_Int           i;\n    FT_Fixed         x, y, xtemp, b;\n    const FT_Fixed  *arctanptr;\n\n\n    x = vec->x;\n    y = vec->y;\n\n    /* Get the vector into [-PI/4,PI/4] sector */\n    if ( y > x )\n    {\n      if ( y > -x )\n      {\n        theta =  FT_ANGLE_PI2;\n        xtemp =  y;\n        y     = -x;\n        x     =  xtemp;\n      }\n      else\n      {\n        theta =  y > 0 ? FT_ANGLE_PI : -FT_ANGLE_PI;\n        x     = -x;\n        y     = -y;\n      }\n    }\n    else\n    {\n      if ( y < -x )\n      {\n        theta = -FT_ANGLE_PI2;\n        xtemp = -y;\n        y     =  x;\n        x     =  xtemp;\n      }\n      else\n      {\n        theta = 0;\n      }\n    }\n\n    arctanptr = ft_trig_arctan_table;\n\n    /* Pseudorotations, with right shifts */\n    for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )\n    {\n      if ( y > 0 )\n      {\n        xtemp  = x + ( ( y + b ) >> i );\n        y      = y - ( ( x + b ) >> i );\n        x      = xtemp;\n        theta += *arctanptr++;\n      }\n      else\n      {\n        xtemp  = x - ( ( y + b ) >> i );\n        y      = y + ( ( x + b ) >> i );\n        x      = xtemp;\n        theta -= *arctanptr++;\n      }\n    }\n\n    /* round theta */\n    if ( theta >= 0 )\n      theta = FT_PAD_ROUND( theta, 32 );\n    else\n      theta = -FT_PAD_ROUND( -theta, 32 );\n\n    vec->x = x;\n    vec->y = theta;\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_Cos( FT_Angle  angle )\n  {\n    FT_Vector  v;\n\n\n    v.x = FT_TRIG_SCALE >> 8;\n    v.y = 0;\n    ft_trig_pseudo_rotate( &v, angle );\n\n    return ( v.x + 0x80L ) >> 8;\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_Sin( FT_Angle  angle )\n  {\n    return FT_Cos( FT_ANGLE_PI2 - angle );\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_Tan( FT_Angle  angle )\n  {\n    FT_Vector  v;\n\n\n    v.x = FT_TRIG_SCALE >> 8;\n    v.y = 0;\n    ft_trig_pseudo_rotate( &v, angle );\n\n    return FT_DivFix( v.y, v.x );\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Angle )\n  FT_Atan2( FT_Fixed  dx,\n            FT_Fixed  dy )\n  {\n    FT_Vector  v;\n\n\n    if ( dx == 0 && dy == 0 )\n      return 0;\n\n    v.x = dx;\n    v.y = dy;\n    ft_trig_prenorm( &v );\n    ft_trig_pseudo_polarize( &v );\n\n    return v.y;\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_Unit( FT_Vector*  vec,\n                  FT_Angle    angle )\n  {\n    vec->x = FT_TRIG_SCALE >> 8;\n    vec->y = 0;\n    ft_trig_pseudo_rotate( vec, angle );\n    vec->x = ( vec->x + 0x80L ) >> 8;\n    vec->y = ( vec->y + 0x80L ) >> 8;\n  }\n\n\n  /* these macros return 0 for positive numbers,\n     and -1 for negative ones */\n#define FT_SIGN_LONG( x )   ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) )\n#define FT_SIGN_INT( x )    ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) )\n#define FT_SIGN_INT32( x )  ( (x) >> 31 )\n#define FT_SIGN_INT16( x )  ( (x) >> 15 )\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_Rotate( FT_Vector*  vec,\n                    FT_Angle    angle )\n  {\n    FT_Int     shift;\n    FT_Vector  v;\n\n\n    v.x   = vec->x;\n    v.y   = vec->y;\n\n    if ( angle && ( v.x != 0 || v.y != 0 ) )\n    {\n      shift = ft_trig_prenorm( &v );\n      ft_trig_pseudo_rotate( &v, angle );\n      v.x = ft_trig_downscale( v.x );\n      v.y = ft_trig_downscale( v.y );\n\n      if ( shift > 0 )\n      {\n        FT_Int32  half = (FT_Int32)1L << ( shift - 1 );\n\n\n        vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift;\n        vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift;\n      }\n      else\n      {\n        shift  = -shift;\n        vec->x = (FT_Pos)( (FT_ULong)v.x << shift );\n        vec->y = (FT_Pos)( (FT_ULong)v.y << shift );\n      }\n    }\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Fixed )\n  FT_Vector_Length( FT_Vector*  vec )\n  {\n    FT_Int     shift;\n    FT_Vector  v;\n\n\n    v = *vec;\n\n    /* handle trivial cases */\n    if ( v.x == 0 )\n    {\n      return FT_ABS( v.y );\n    }\n    else if ( v.y == 0 )\n    {\n      return FT_ABS( v.x );\n    }\n\n    /* general case */\n    shift = ft_trig_prenorm( &v );\n    ft_trig_pseudo_polarize( &v );\n\n    v.x = ft_trig_downscale( v.x );\n\n    if ( shift > 0 )\n      return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift;\n\n    return (FT_Fixed)( (FT_UInt32)v.x << -shift );\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_Polarize( FT_Vector*  vec,\n                      FT_Fixed   *length,\n                      FT_Angle   *angle )\n  {\n    FT_Int     shift;\n    FT_Vector  v;\n\n\n    v = *vec;\n\n    if ( v.x == 0 && v.y == 0 )\n      return;\n\n    shift = ft_trig_prenorm( &v );\n    ft_trig_pseudo_polarize( &v );\n\n    v.x = ft_trig_downscale( v.x );\n\n    *length = ( shift >= 0 ) ?                      ( v.x >>  shift )\n                             : (FT_Fixed)( (FT_UInt32)v.x << -shift );\n    *angle  = v.y;\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( void )\n  FT_Vector_From_Polar( FT_Vector*  vec,\n                        FT_Fixed    length,\n                        FT_Angle    angle )\n  {\n    vec->x = length;\n    vec->y = 0;\n\n    FT_Vector_Rotate( vec, angle );\n  }\n\n\n  /* documentation is in fttrigon.h */\n\n  FT_EXPORT_DEF( FT_Angle )\n  FT_Angle_Diff( FT_Angle  angle1,\n                 FT_Angle  angle2 )\n  {\n    FT_Angle  delta = angle2 - angle1;\n\n\n    delta %= FT_ANGLE_2PI;\n    if ( delta < 0 )\n      delta += FT_ANGLE_2PI;\n\n    if ( delta > FT_ANGLE_PI )\n      delta -= FT_ANGLE_2PI;\n\n    return delta;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/fttype1.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fttype1.c                                                              */\n/*                                                                         */\n/*    FreeType utility file for PS names support (body).                   */\n/*                                                                         */\n/*  Copyright 2002-2004, 2011 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_SERVICE_H\n#include FT_SERVICE_POSTSCRIPT_INFO_H\n\n\n  /* documentation is in t1tables.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PS_Font_Info( FT_Face          face,\n                       PS_FontInfoRec*  afont_info )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    if ( face )\n    {\n      FT_Service_PsInfo  service = NULL;\n\n\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_get_font_info )\n        error = service->ps_get_font_info( face, afont_info );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in t1tables.h */\n\n  FT_EXPORT_DEF( FT_Int )\n  FT_Has_PS_Glyph_Names( FT_Face  face )\n  {\n    FT_Int             result  = 0;\n    FT_Service_PsInfo  service = NULL;\n\n\n    if ( face )\n    {\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_has_glyph_names )\n        result = service->ps_has_glyph_names( face );\n    }\n\n    return result;\n  }\n\n\n  /* documentation is in t1tables.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_PS_Font_Private( FT_Face         face,\n                          PS_PrivateRec*  afont_private )\n  {\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    if ( face )\n    {\n      FT_Service_PsInfo  service = NULL;\n\n\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_get_font_private )\n        error = service->ps_get_font_private( face, afont_private );\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in t1tables.h */\n\n  FT_EXPORT_DEF( FT_Long )\n  FT_Get_PS_Font_Value( FT_Face       face,\n                        PS_Dict_Keys  key,\n                        FT_UInt       idx,\n                        void         *value,\n                        FT_Long       value_len )\n  {\n    FT_Int             result  = 0;\n    FT_Service_PsInfo  service = NULL;\n\n\n    if ( face )\n    {\n      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );\n\n      if ( service && service->ps_get_font_value )\n        result = service->ps_get_font_value( face, key, idx,\n                                             value, value_len );\n    }\n\n    return result;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftutil.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftutil.c                                                               */\n/*                                                                         */\n/*    FreeType utility file for memory and list management (body).         */\n/*                                                                         */\n/*  Copyright 2002, 2004-2007, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_MEMORY_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_LIST_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_memory\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*****               M E M O R Y   M A N A G E M E N T               *****/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_alloc( FT_Memory  memory,\n                FT_Long    size,\n                FT_Error  *p_error )\n  {\n    FT_Error    error;\n    FT_Pointer  block = ft_mem_qalloc( memory, size, &error );\n\n    if ( !error && size > 0 )\n      FT_MEM_ZERO( block, size );\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_qalloc( FT_Memory  memory,\n                 FT_Long    size,\n                 FT_Error  *p_error )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Pointer  block = NULL;\n\n\n    if ( size > 0 )\n    {\n      block = memory->alloc( memory, size );\n      if ( block == NULL )\n        error = FT_THROW( Out_Of_Memory );\n    }\n    else if ( size < 0 )\n    {\n      /* may help catch/prevent security issues */\n      error = FT_THROW( Invalid_Argument );\n    }\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_realloc( FT_Memory  memory,\n                  FT_Long    item_size,\n                  FT_Long    cur_count,\n                  FT_Long    new_count,\n                  void*      block,\n                  FT_Error  *p_error )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    block = ft_mem_qrealloc( memory, item_size,\n                             cur_count, new_count, block, &error );\n    if ( !error && new_count > cur_count )\n      FT_MEM_ZERO( (char*)block + cur_count * item_size,\n                   ( new_count - cur_count ) * item_size );\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_qrealloc( FT_Memory  memory,\n                   FT_Long    item_size,\n                   FT_Long    cur_count,\n                   FT_Long    new_count,\n                   void*      block,\n                   FT_Error  *p_error )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* Note that we now accept `item_size == 0' as a valid parameter, in\n     * order to cover very weird cases where an ALLOC_MULT macro would be\n     * called.\n     */\n    if ( cur_count < 0 || new_count < 0 || item_size < 0 )\n    {\n      /* may help catch/prevent nasty security issues */\n      error = FT_THROW( Invalid_Argument );\n    }\n    else if ( new_count == 0 || item_size == 0 )\n    {\n      ft_mem_free( memory, block );\n      block = NULL;\n    }\n    else if ( new_count > FT_INT_MAX/item_size )\n    {\n      error = FT_THROW( Array_Too_Large );\n    }\n    else if ( cur_count == 0 )\n    {\n      FT_ASSERT( block == NULL );\n\n      block = ft_mem_alloc( memory, new_count*item_size, &error );\n    }\n    else\n    {\n      FT_Pointer  block2;\n      FT_Long     cur_size = cur_count*item_size;\n      FT_Long     new_size = new_count*item_size;\n\n\n      block2 = memory->realloc( memory, cur_size, new_size, block );\n      if ( block2 == NULL )\n        error = FT_THROW( Out_Of_Memory );\n      else\n        block = block2;\n    }\n\n    *p_error = error;\n    return block;\n  }\n\n\n  FT_BASE_DEF( void )\n  ft_mem_free( FT_Memory   memory,\n               const void *P )\n  {\n    if ( P )\n      memory->free( memory, (void*)P );\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_dup( FT_Memory    memory,\n              const void*  address,\n              FT_ULong     size,\n              FT_Error    *p_error )\n  {\n    FT_Error    error;\n    FT_Pointer  p = ft_mem_qalloc( memory, size, &error );\n\n\n    if ( !error && address )\n      ft_memcpy( p, address, size );\n\n    *p_error = error;\n    return p;\n  }\n\n\n  FT_BASE_DEF( FT_Pointer )\n  ft_mem_strdup( FT_Memory    memory,\n                 const char*  str,\n                 FT_Error    *p_error )\n  {\n    FT_ULong  len = str ? (FT_ULong)ft_strlen( str ) + 1\n                        : 0;\n\n\n    return ft_mem_dup( memory, str, len, p_error );\n  }\n\n\n  FT_BASE_DEF( FT_Int )\n  ft_mem_strcpyn( char*        dst,\n                  const char*  src,\n                  FT_ULong     size )\n  {\n    while ( size > 1 && *src != 0 )\n    {\n      *dst++ = *src++;\n      size--;\n    }\n\n    *dst = 0;  /* always zero-terminate */\n\n    return *src != 0;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*****            D O U B L Y   L I N K E D   L I S T S              *****/\n  /*****                                                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_list\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( FT_ListNode )\n  FT_List_Find( FT_List  list,\n                void*    data )\n  {\n    FT_ListNode  cur;\n\n\n    cur = list->head;\n    while ( cur )\n    {\n      if ( cur->data == data )\n        return cur;\n\n      cur = cur->next;\n    }\n\n    return (FT_ListNode)0;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Add( FT_List      list,\n               FT_ListNode  node )\n  {\n    FT_ListNode  before = list->tail;\n\n\n    node->next = 0;\n    node->prev = before;\n\n    if ( before )\n      before->next = node;\n    else\n      list->head = node;\n\n    list->tail = node;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Insert( FT_List      list,\n                  FT_ListNode  node )\n  {\n    FT_ListNode  after = list->head;\n\n\n    node->next = after;\n    node->prev = 0;\n\n    if ( !after )\n      list->tail = node;\n    else\n      after->prev = node;\n\n    list->head = node;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Remove( FT_List      list,\n                  FT_ListNode  node )\n  {\n    FT_ListNode  before, after;\n\n\n    before = node->prev;\n    after  = node->next;\n\n    if ( before )\n      before->next = after;\n    else\n      list->head = after;\n\n    if ( after )\n      after->prev = before;\n    else\n      list->tail = before;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Up( FT_List      list,\n              FT_ListNode  node )\n  {\n    FT_ListNode  before, after;\n\n\n    before = node->prev;\n    after  = node->next;\n\n    /* check whether we are already on top of the list */\n    if ( !before )\n      return;\n\n    before->next = after;\n\n    if ( after )\n      after->prev = before;\n    else\n      list->tail = before;\n\n    node->prev       = 0;\n    node->next       = list->head;\n    list->head->prev = node;\n    list->head       = node;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_List_Iterate( FT_List            list,\n                   FT_List_Iterator   iterator,\n                   void*              user )\n  {\n    FT_ListNode  cur   = list->head;\n    FT_Error     error = FT_Err_Ok;\n\n\n    while ( cur )\n    {\n      FT_ListNode  next = cur->next;\n\n\n      error = iterator( cur, user );\n      if ( error )\n        break;\n\n      cur = next;\n    }\n\n    return error;\n  }\n\n\n  /* documentation is in ftlist.h */\n\n  FT_EXPORT_DEF( void )\n  FT_List_Finalize( FT_List             list,\n                    FT_List_Destructor  destroy,\n                    FT_Memory           memory,\n                    void*               user )\n  {\n    FT_ListNode  cur;\n\n\n    cur = list->head;\n    while ( cur )\n    {\n      FT_ListNode  next = cur->next;\n      void*        data = cur->data;\n\n\n      if ( destroy )\n        destroy( memory, data, user );\n\n      FT_FREE( cur );\n      cur = next;\n    }\n\n    list->head = 0;\n    list->tail = 0;\n  }\n\n\n  FT_BASE_DEF( FT_UInt32 )\n  ft_highpow2( FT_UInt32  value )\n  {\n    FT_UInt32  value2;\n\n\n    /*\n     *  We simply clear the lowest bit in each iteration.  When\n     *  we reach 0, we know that the previous value was our result.\n     */\n    for ( ;; )\n    {\n      value2 = value & (value - 1);  /* clear lowest bit */\n      if ( value2 == 0 )\n        break;\n\n      value = value2;\n    }\n    return value;\n  }\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  FT_BASE_DEF( FT_Error )\n  FT_Alloc( FT_Memory  memory,\n            FT_Long    size,\n            void*     *P )\n  {\n    FT_Error  error;\n\n\n    (void)FT_ALLOC( *P, size );\n    return error;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_QAlloc( FT_Memory  memory,\n             FT_Long    size,\n             void*     *p )\n  {\n    FT_Error  error;\n\n\n    (void)FT_QALLOC( *p, size );\n    return error;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_Realloc( FT_Memory  memory,\n              FT_Long    current,\n              FT_Long    size,\n              void*     *P )\n  {\n    FT_Error  error;\n\n\n    (void)FT_REALLOC( *P, current, size );\n    return error;\n  }\n\n\n  FT_BASE_DEF( FT_Error )\n  FT_QRealloc( FT_Memory  memory,\n               FT_Long    current,\n               FT_Long    size,\n               void*     *p )\n  {\n    FT_Error  error;\n\n\n    (void)FT_QREALLOC( *p, current, size );\n    return error;\n  }\n\n\n  FT_BASE_DEF( void )\n  FT_Free( FT_Memory  memory,\n           void*     *P )\n  {\n    if ( *P )\n      FT_MEM_FREE( *P );\n  }\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftwinfnt.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftwinfnt.c                                                             */\n/*                                                                         */\n/*    FreeType API for accessing Windows FNT specific info (body).         */\n/*                                                                         */\n/*  Copyright 2003, 2004 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_WINFONTS_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_WINFNT_H\n\n\n  /* documentation is in ftwinfnt.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Get_WinFNT_Header( FT_Face               face,\n                        FT_WinFNT_HeaderRec  *header )\n  {\n    FT_Service_WinFnt  service;\n    FT_Error           error;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( face != NULL )\n    {\n      FT_FACE_LOOKUP_SERVICE( face, service, WINFNT );\n\n      if ( service != NULL )\n      {\n        error = service->get_header( face, header );\n      }\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/ftxf86.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftxf86.c                                                               */\n/*                                                                         */\n/*    FreeType utility file for X11 support (body).                        */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_XFREE86_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_XFREE86_NAME_H\n\n\n  /* documentation is in ftxf86.h */\n\n  FT_EXPORT_DEF( const char* )\n  FT_Get_X11_Font_Format( FT_Face  face )\n  {\n    const char*  result = NULL;\n\n\n    if ( face )\n      FT_FACE_FIND_SERVICE( face, result, XF86_NAME );\n\n    return result;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/base/md5.c",
    "content": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD5 Message-Digest Algorithm (RFC 1321).\n *\n * Homepage:\n * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5\n *\n * Author:\n * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>\n *\n * This software was written by Alexander Peslyak in 2001.  No copyright is\n * claimed, and the software is hereby placed in the public domain.\n * In case this attempt to disclaim copyright and place the software in the\n * public domain is deemed null and void, then the software is\n * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n *\n * (This is a heavily cut-down \"BSD license\".)\n *\n * This differs from Colin Plumb's older public domain implementation in that\n * no exactly 32-bit integer data type is required (any 32-bit or wider\n * unsigned integer data type will do), there's no compile-time endianness\n * configuration, and the function prototypes match OpenSSL's.  No code from\n * Colin Plumb's implementation has been reused; this comment merely compares\n * the properties of the two independent implementations.\n *\n * The primary goals of this implementation are portability and ease of use.\n * It is meant to be fast, but not as fast as possible.  Some known\n * optimizations are not included to reduce source code size and avoid\n * compile-time configuration.\n */\n\n#ifndef HAVE_OPENSSL\n\n#include <string.h>\n\n#include \"md5.h\"\n\n/*\n * The basic MD5 functions.\n *\n * F and G are optimized compared to their RFC 1321 definitions for\n * architectures that lack an AND-NOT instruction, just like in Colin Plumb's\n * implementation.\n */\n#define F(x, y, z)\t\t\t((z) ^ ((x) & ((y) ^ (z))))\n#define G(x, y, z)\t\t\t((y) ^ ((z) & ((x) ^ (y))))\n#define H(x, y, z)\t\t\t((x) ^ (y) ^ (z))\n#define I(x, y, z)\t\t\t((y) ^ ((x) | ~(z)))\n\n/*\n * The MD5 transformation for all four rounds.\n */\n#define STEP(f, a, b, c, d, x, t, s) \\\n\t(a) += f((b), (c), (d)) + (x) + (t); \\\n\t(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \\\n\t(a) += (b);\n\n/*\n * SET reads 4 input bytes in little-endian byte order and stores them\n * in a properly aligned word in host byte order.\n *\n * The check for little-endian architectures that tolerate unaligned\n * memory accesses is just an optimization.  Nothing will break if it\n * doesn't work.\n */\n#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)\n#define SET(n) \\\n\t(*(MD5_u32plus *)&ptr[(n) * 4])\n#define GET(n) \\\n\tSET(n)\n#else\n#define SET(n) \\\n\t(ctx->block[(n)] = \\\n\t(MD5_u32plus)ptr[(n) * 4] | \\\n\t((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \\\n\t((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \\\n\t((MD5_u32plus)ptr[(n) * 4 + 3] << 24))\n#define GET(n) \\\n\t(ctx->block[(n)])\n#endif\n\n/*\n * This processes one or more 64-byte data blocks, but does NOT update\n * the bit counters.  There are no alignment requirements.\n */\nstatic void *body(MD5_CTX *ctx, void *data, unsigned long size)\n{\n\tunsigned char *ptr;\n\tMD5_u32plus a, b, c, d;\n\tMD5_u32plus saved_a, saved_b, saved_c, saved_d;\n\n\tptr = (unsigned char *)data;\n\n\ta = ctx->a;\n\tb = ctx->b;\n\tc = ctx->c;\n\td = ctx->d;\n\n\tdo {\n\t\tsaved_a = a;\n\t\tsaved_b = b;\n\t\tsaved_c = c;\n\t\tsaved_d = d;\n\n/* Round 1 */\n\t\tSTEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)\n\t\tSTEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)\n\t\tSTEP(F, c, d, a, b, SET(2), 0x242070db, 17)\n\t\tSTEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)\n\t\tSTEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)\n\t\tSTEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)\n\t\tSTEP(F, c, d, a, b, SET(6), 0xa8304613, 17)\n\t\tSTEP(F, b, c, d, a, SET(7), 0xfd469501, 22)\n\t\tSTEP(F, a, b, c, d, SET(8), 0x698098d8, 7)\n\t\tSTEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)\n\t\tSTEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)\n\t\tSTEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)\n\t\tSTEP(F, a, b, c, d, SET(12), 0x6b901122, 7)\n\t\tSTEP(F, d, a, b, c, SET(13), 0xfd987193, 12)\n\t\tSTEP(F, c, d, a, b, SET(14), 0xa679438e, 17)\n\t\tSTEP(F, b, c, d, a, SET(15), 0x49b40821, 22)\n\n/* Round 2 */\n\t\tSTEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)\n\t\tSTEP(G, d, a, b, c, GET(6), 0xc040b340, 9)\n\t\tSTEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)\n\t\tSTEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)\n\t\tSTEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)\n\t\tSTEP(G, d, a, b, c, GET(10), 0x02441453, 9)\n\t\tSTEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)\n\t\tSTEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)\n\t\tSTEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)\n\t\tSTEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)\n\t\tSTEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)\n\t\tSTEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)\n\t\tSTEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)\n\t\tSTEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)\n\t\tSTEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)\n\t\tSTEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)\n\n/* Round 3 */\n\t\tSTEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)\n\t\tSTEP(H, d, a, b, c, GET(8), 0x8771f681, 11)\n\t\tSTEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)\n\t\tSTEP(H, b, c, d, a, GET(14), 0xfde5380c, 23)\n\t\tSTEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)\n\t\tSTEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11)\n\t\tSTEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)\n\t\tSTEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23)\n\t\tSTEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)\n\t\tSTEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11)\n\t\tSTEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)\n\t\tSTEP(H, b, c, d, a, GET(6), 0x04881d05, 23)\n\t\tSTEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)\n\t\tSTEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11)\n\t\tSTEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)\n\t\tSTEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23)\n\n/* Round 4 */\n\t\tSTEP(I, a, b, c, d, GET(0), 0xf4292244, 6)\n\t\tSTEP(I, d, a, b, c, GET(7), 0x432aff97, 10)\n\t\tSTEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)\n\t\tSTEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)\n\t\tSTEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)\n\t\tSTEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)\n\t\tSTEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)\n\t\tSTEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)\n\t\tSTEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)\n\t\tSTEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)\n\t\tSTEP(I, c, d, a, b, GET(6), 0xa3014314, 15)\n\t\tSTEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)\n\t\tSTEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)\n\t\tSTEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)\n\t\tSTEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)\n\t\tSTEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)\n\n\t\ta += saved_a;\n\t\tb += saved_b;\n\t\tc += saved_c;\n\t\td += saved_d;\n\n\t\tptr += 64;\n\t} while (size -= 64);\n\n\tctx->a = a;\n\tctx->b = b;\n\tctx->c = c;\n\tctx->d = d;\n\n\treturn ptr;\n}\n\nvoid MD5_Init(MD5_CTX *ctx)\n{\n\tctx->a = 0x67452301;\n\tctx->b = 0xefcdab89;\n\tctx->c = 0x98badcfe;\n\tctx->d = 0x10325476;\n\n\tctx->lo = 0;\n\tctx->hi = 0;\n}\n\nvoid MD5_Update(MD5_CTX *ctx, void *data, unsigned long size)\n{\n\tMD5_u32plus saved_lo;\n\tunsigned long used, free;\n\n\tsaved_lo = ctx->lo;\n\tif ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)\n\t\tctx->hi++;\n\tctx->hi += size >> 29;\n\n\tused = saved_lo & 0x3f;\n\n\tif (used) {\n\t\tfree = 64 - used;\n\n\t\tif (size < free) {\n\t\t\tmemcpy(&ctx->buffer[used], data, size);\n\t\t\treturn;\n\t\t}\n\n\t\tmemcpy(&ctx->buffer[used], data, free);\n\t\tdata = (unsigned char *)data + free;\n\t\tsize -= free;\n\t\tbody(ctx, ctx->buffer, 64);\n\t}\n\n\tif (size >= 64) {\n\t\tdata = body(ctx, data, size & ~(unsigned long)0x3f);\n\t\tsize &= 0x3f;\n\t}\n\n\tmemcpy(ctx->buffer, data, size);\n}\n\nvoid MD5_Final(unsigned char *result, MD5_CTX *ctx)\n{\n\tunsigned long used, free;\n\n\tused = ctx->lo & 0x3f;\n\n\tctx->buffer[used++] = 0x80;\n\n\tfree = 64 - used;\n\n\tif (free < 8) {\n\t\tmemset(&ctx->buffer[used], 0, free);\n\t\tbody(ctx, ctx->buffer, 64);\n\t\tused = 0;\n\t\tfree = 64;\n\t}\n\n\tmemset(&ctx->buffer[used], 0, free - 8);\n\n\tctx->lo <<= 3;\n\tctx->buffer[56] = ctx->lo;\n\tctx->buffer[57] = ctx->lo >> 8;\n\tctx->buffer[58] = ctx->lo >> 16;\n\tctx->buffer[59] = ctx->lo >> 24;\n\tctx->buffer[60] = ctx->hi;\n\tctx->buffer[61] = ctx->hi >> 8;\n\tctx->buffer[62] = ctx->hi >> 16;\n\tctx->buffer[63] = ctx->hi >> 24;\n\n\tbody(ctx, ctx->buffer, 64);\n\n\tresult[0] = ctx->a;\n\tresult[1] = ctx->a >> 8;\n\tresult[2] = ctx->a >> 16;\n\tresult[3] = ctx->a >> 24;\n\tresult[4] = ctx->b;\n\tresult[5] = ctx->b >> 8;\n\tresult[6] = ctx->b >> 16;\n\tresult[7] = ctx->b >> 24;\n\tresult[8] = ctx->c;\n\tresult[9] = ctx->c >> 8;\n\tresult[10] = ctx->c >> 16;\n\tresult[11] = ctx->c >> 24;\n\tresult[12] = ctx->d;\n\tresult[13] = ctx->d >> 8;\n\tresult[14] = ctx->d >> 16;\n\tresult[15] = ctx->d >> 24;\n\n\tmemset(ctx, 0, sizeof(*ctx));\n}\n\n#endif\n"
  },
  {
    "path": "libs/freetype/src/base/md5.h",
    "content": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD5 Message-Digest Algorithm (RFC 1321).\n *\n * Homepage:\n * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5\n *\n * Author:\n * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>\n *\n * This software was written by Alexander Peslyak in 2001.  No copyright is\n * claimed, and the software is hereby placed in the public domain.\n * In case this attempt to disclaim copyright and place the software in the\n * public domain is deemed null and void, then the software is\n * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n *\n * See md5.c for more information.\n */\n\n#ifdef HAVE_OPENSSL\n#include <openssl/md5.h>\n#elif !defined(_MD5_H)\n#define _MD5_H\n\n/* Any 32-bit or wider unsigned integer data type will do */\ntypedef unsigned int MD5_u32plus;\n\ntypedef struct {\n\tMD5_u32plus lo, hi;\n\tMD5_u32plus a, b, c, d;\n\tunsigned char buffer[64];\n\tMD5_u32plus block[16];\n} MD5_CTX;\n\nextern void MD5_Init(MD5_CTX *ctx);\nextern void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size);\nextern void MD5_Final(unsigned char *result, MD5_CTX *ctx);\n\n#endif\n"
  },
  {
    "path": "libs/freetype/src/base/rules.mk",
    "content": "#\n# FreeType 2 base layer configuration rules\n#\n\n\n# Copyright 1996-2000, 2002-2009, 2013 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# It sets the following variables which are used by the master Makefile\n# after the call:\n#\n#   BASE_OBJ_S:   The single-object base layer.\n#   BASE_OBJ_M:   A list of all objects for a multiple-objects build.\n#   BASE_EXT_OBJ: A list of base layer extensions, i.e., components found\n#                 in `freetype/src/base' which are not compiled within the\n#                 base layer proper.\n\n\nBASE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SRC_DIR)/base)\n\n\n# Base layer sources\n#\n#   ftsystem, ftinit, and ftdebug are handled by freetype.mk\n#\n# All files listed here should be included in `ftbase.c' (for a `single'\n# build).\n#\nBASE_SRC := $(BASE_DIR)/ftadvanc.c \\\n            $(BASE_DIR)/ftcalc.c   \\\n            $(BASE_DIR)/ftdbgmem.c \\\n            $(BASE_DIR)/ftgloadr.c \\\n            $(BASE_DIR)/ftobjs.c   \\\n            $(BASE_DIR)/ftoutln.c  \\\n            $(BASE_DIR)/ftrfork.c  \\\n            $(BASE_DIR)/ftsnames.c \\\n            $(BASE_DIR)/ftstream.c \\\n            $(BASE_DIR)/fttrigon.c \\\n            $(BASE_DIR)/ftutil.c\n\n\nifneq ($(ftmac_c),)\n  BASE_SRC += $(BASE_DIR)/$(ftmac_c)\nendif\n\n# for simplicity, we also handle `md5.c' (which gets included by `ftobjs.h')\nBASE_H := $(BASE_DIR)/ftbase.h \\\n          $(BASE_DIR)/md5.c    \\\n          $(BASE_DIR)/md5.h\n\n# Base layer `extensions' sources\n#\n# An extension is added to the library file as a separate object.  It is\n# then linked to the final executable only if one of its symbols is used by\n# the application.\n#\nBASE_EXT_SRC := $(patsubst %,$(BASE_DIR)/%,$(BASE_EXTENSIONS))\n\n# Default extensions objects\n#\nBASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)\n\n\n# Base layer object(s)\n#\n#   BASE_OBJ_M is used during `multi' builds (each base source file compiles\n#   to a single object file).\n#\n#   BASE_OBJ_S is used during `single' builds (the whole base layer is\n#   compiled as a single object file using ftbase.c).\n#\nBASE_OBJ_M := $(BASE_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)\nBASE_OBJ_S := $(OBJ_DIR)/ftbase.$O\n\n# Base layer root source file for single build\n#\nBASE_SRC_S := $(BASE_DIR)/ftbase.c\n\n\n# Base layer - single object build\n#\n$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) $(BASE_H)\n\t$(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S))\n\n\n# Multiple objects build + extensions\n#\n$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) $(BASE_H)\n\t$(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/bdf/Jamfile",
    "content": "# FreeType 2 src/bdf Jamfile\n#\n# Copyright 2002 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) bdf ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = bdfdrivr bdflib ;\n  }\n  else\n  {\n    _sources = bdf ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/bdf Jamfile\n"
  },
  {
    "path": "libs/freetype/src/bdf/README",
    "content": "                  FreeType font driver for BDF fonts\n\n                       Francesco Zappa Nardelli\n                  <francesco.zappa.nardelli@ens.fr>\n\n\nIntroduction\n************\n\nBDF (Bitmap Distribution Format) is a bitmap font format defined by Adobe,\nwhich is intended to be easily understood by both humans and computers.\nThis code implements a BDF driver for the FreeType library, following the\nAdobe Specification V 2.2.  The specification of the BDF font format is\navailable from Adobe's web site:\n\n  http://partners.adobe.com/public/developer/en/font/5005.BDF_Spec.pdf\n\nMany good bitmap fonts in bdf format come with XFree86 (www.XFree86.org).\nThey do not define vertical metrics, because the X Consortium BDF\nspecification has removed them.\n\n\nEncodings\n*********\n\nThe variety of encodings that accompanies bdf fonts appears to encompass the\nsmall set defined in freetype.h.  On the other hand, two properties that\nspecify encoding and registry are usually defined in bdf fonts.\n\nI decided to make these two properties directly accessible, leaving to the\nclient application the work of interpreting them.  For instance:\n\n\n  #include FT_INTERNAL_BDF_TYPES_H\n\n  FT_Face          face;\n  BDF_Public_Face  bdfface;\n\n\n  FT_New_Face( library, ..., &face );\n\n  bdfface = (BDF_Public_Face)face;\n\n  if ( ( bdfface->charset_registry == \"ISO10646\" ) &&\n       ( bdfface->charset_encoding == \"1\" )        )\n    [..]\n\n\nThus the driver always exports `ft_encoding_none' as face->charmap.encoding.\nFT_Get_Char_Index's behavior is unmodified, that is, it converts the ULong\nvalue given as argument into the corresponding glyph number.\n\nIf the two properties are not available, Adobe Standard Encoding should be\nassumed.\n\n\nAnti-Aliased Bitmaps\n********************\n\nThe driver supports an extension to the BDF format as used in Mark Leisher's\nxmbdfed bitmap font editor.  Microsoft's SBIT tool expects bitmap fonts in\nthat format for adding anti-aliased them to TrueType fonts.  It introduces a\nfourth field to the `SIZE' keyword which gives the bpp value (bits per\npixel) of the glyph data in the font.  Possible values are 1 (the default),\n2 (four gray levels), 4 (16 gray levels), and 8 (256 gray levels).  The\ndriver returns either a bitmap with 1 bit per pixel or a pixmap with 8bits\nper pixel (using 4, 16, and 256 gray levels, respectively).\n\n\nKnown problems\n**************\n\n- A font is entirely loaded into memory.  Obviously, this is not the Right\n  Thing(TM).  If you have big fonts I suggest you convert them into PCF\n  format (using the bdftopcf utility): the PCF font drive of FreeType can\n  perform incremental glyph loading.\n\nWhen I have some time, I will implement on-demand glyph parsing.\n\n- Except for encodings properties, client applications have no visibility of\n  the PCF_Face object.  This means that applications cannot directly access\n  font tables and must trust FreeType.\n\n- Currently, glyph names are ignored.\n\n  I plan to give full visibility of the BDF_Face object in an upcoming\n  revision of the driver, thus implementing also glyph names.\n\n- As I have never seen a BDF font that defines vertical metrics, vertical\n  metrics are (parsed and) discarded.  If you own a BDF font that defines\n  vertical metrics, please let me know (I will implement them in 5-10\n  minutes).\n\n\nLicense\n*******\n\nCopyright (C) 2001-2002 by Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*** Portions of the driver (that is, bdflib.c and bdf.h):\n\nCopyright 2000 Computing Research Labs, New Mexico State University\nCopyright 2001-2002, 2011 Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the \"Software\"),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\nTHE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\nOR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR\nTHE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\nCredits\n*******\n\nThis driver is based on excellent Mark Leisher's bdf library.  If you\nfind something good in this driver you should probably thank him, not\nme.\n"
  },
  {
    "path": "libs/freetype/src/bdf/bdf.c",
    "content": "/*  bdf.c\n\n    FreeType font driver for bdf files\n\n    Copyright (C) 2001, 2002 by\n    Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"bdflib.c\"\n#include \"bdfdrivr.c\"\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/bdf/bdf.h",
    "content": "/*\n * Copyright 2000 Computing Research Labs, New Mexico State University\n * Copyright 2001-2004, 2011 Francesco Zappa Nardelli\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\n * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR\n * THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n\n#ifndef __BDF_H__\n#define __BDF_H__\n\n\n/*\n * Based on bdf.h,v 1.16 2000/03/16 20:08:51 mleisher\n */\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_STREAM_H\n\n\nFT_BEGIN_HEADER\n\n\n/* Imported from bdfP.h */\n\n#define _bdf_glyph_modified( map, e )                 \\\n          ( (map)[(e) >> 5] & ( 1 << ( (e) & 31 ) ) )\n#define _bdf_set_glyph_modified( map, e )              \\\n          ( (map)[(e) >> 5] |= ( 1 << ( (e) & 31 ) ) )\n#define _bdf_clear_glyph_modified( map, e )             \\\n          ( (map)[(e) >> 5] &= ~( 1 << ( (e) & 31 ) ) )\n\n/* end of bdfP.h */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* BDF font options macros and types.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define BDF_CORRECT_METRICS  0x01 /* Correct invalid metrics when loading. */\n#define BDF_KEEP_COMMENTS    0x02 /* Preserve the font comments.           */\n#define BDF_KEEP_UNENCODED   0x04 /* Keep the unencoded glyphs.            */\n#define BDF_PROPORTIONAL     0x08 /* Font has proportional spacing.        */\n#define BDF_MONOWIDTH        0x10 /* Font has mono width.                  */\n#define BDF_CHARCELL         0x20 /* Font has charcell spacing.            */\n\n#define BDF_ALL_SPACING  ( BDF_PROPORTIONAL | \\\n                           BDF_MONOWIDTH    | \\\n                           BDF_CHARCELL     )\n\n#define BDF_DEFAULT_LOAD_OPTIONS  ( BDF_CORRECT_METRICS | \\\n                                    BDF_KEEP_COMMENTS   | \\\n                                    BDF_KEEP_UNENCODED  | \\\n                                    BDF_PROPORTIONAL    )\n\n\n  typedef struct  bdf_options_t_\n  {\n    int            correct_metrics;\n    int            keep_unencoded;\n    int            keep_comments;\n    int            font_spacing;\n\n  } bdf_options_t;\n\n\n  /* Callback function type for unknown configuration options. */\n  typedef int\n  (*bdf_options_callback_t)( bdf_options_t*  opts,\n                             char**          params,\n                             unsigned long   nparams,\n                             void*           client_data );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* BDF font property macros and types.                                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define BDF_ATOM      1\n#define BDF_INTEGER   2\n#define BDF_CARDINAL  3\n\n\n  /* This structure represents a particular property of a font. */\n  /* There are a set of defaults and each font has their own.   */\n  typedef struct  bdf_property_t_\n  {\n    char*  name;         /* Name of the property.   */\n    int    format;       /* Format of the property. */\n    int    builtin;      /* A builtin property.     */\n    union\n    {\n      char*          atom;\n      long           l;\n      unsigned long  ul;\n\n    } value;             /* Value of the property.  */\n\n  } bdf_property_t;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* BDF font metric and glyph types.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  typedef struct  bdf_bbx_t_\n  {\n    unsigned short  width;\n    unsigned short  height;\n\n    short           x_offset;\n    short           y_offset;\n\n    short           ascent;\n    short           descent;\n\n  } bdf_bbx_t;\n\n\n  typedef struct  bdf_glyph_t_\n  {\n    char*           name;        /* Glyph name.                          */\n    long            encoding;    /* Glyph encoding.                      */\n    unsigned short  swidth;      /* Scalable width.                      */\n    unsigned short  dwidth;      /* Device width.                        */\n    bdf_bbx_t       bbx;         /* Glyph bounding box.                  */\n    unsigned char*  bitmap;      /* Glyph bitmap.                        */\n    unsigned long   bpr;         /* Number of bytes used per row.        */\n    unsigned short  bytes;       /* Number of bytes used for the bitmap. */\n\n  } bdf_glyph_t;\n\n\n  typedef struct  _hashnode_\n  {\n    const char*  key;\n    size_t       data;\n\n  } _hashnode, *hashnode;\n\n\n  typedef struct  hashtable_\n  {\n    int        limit;\n    int        size;\n    int        used;\n    hashnode*  table;\n\n  } hashtable;\n\n\n  typedef struct  bdf_glyphlist_t_\n  {\n    unsigned short  pad;          /* Pad to 4-byte boundary.              */\n    unsigned short  bpp;          /* Bits per pixel.                      */\n    long            start;        /* Beginning encoding value of glyphs.  */\n    long            end;          /* Ending encoding value of glyphs.     */\n    bdf_glyph_t*    glyphs;       /* Glyphs themselves.                   */\n    unsigned long   glyphs_size;  /* Glyph structures allocated.          */\n    unsigned long   glyphs_used;  /* Glyph structures used.               */\n    bdf_bbx_t       bbx;          /* Overall bounding box of glyphs.      */\n\n  } bdf_glyphlist_t;\n\n\n  typedef struct  bdf_font_t_\n  {\n    char*            name;           /* Name of the font.                   */\n    bdf_bbx_t        bbx;            /* Font bounding box.                  */\n\n    long             point_size;     /* Point size of the font.             */\n    unsigned long    resolution_x;   /* Font horizontal resolution.         */\n    unsigned long    resolution_y;   /* Font vertical resolution.           */\n\n    int              spacing;        /* Font spacing value.                 */\n\n    unsigned short   monowidth;      /* Logical width for monowidth font.   */\n\n    long             default_char;   /* Encoding of the default glyph.      */\n\n    long             font_ascent;    /* Font ascent.                        */\n    long             font_descent;   /* Font descent.                       */\n\n    unsigned long    glyphs_size;    /* Glyph structures allocated.         */\n    unsigned long    glyphs_used;    /* Glyph structures used.              */\n    bdf_glyph_t*     glyphs;         /* Glyphs themselves.                  */\n\n    unsigned long    unencoded_size; /* Unencoded glyph struct. allocated.  */\n    unsigned long    unencoded_used; /* Unencoded glyph struct. used.       */\n    bdf_glyph_t*     unencoded;      /* Unencoded glyphs themselves.        */\n\n    unsigned long    props_size;     /* Font properties allocated.          */\n    unsigned long    props_used;     /* Font properties used.               */\n    bdf_property_t*  props;          /* Font properties themselves.         */\n\n    char*            comments;       /* Font comments.                      */\n    unsigned long    comments_len;   /* Length of comment string.           */\n\n    bdf_glyphlist_t  overflow;       /* Storage used for glyph insertion.   */\n\n    void*            internal;       /* Internal data for the font.         */\n\n    /* The size of the next two arrays must be in sync with the */\n    /* size of the `have' array in the `bdf_parse_t' structure. */\n    unsigned long    nmod[34816];    /* Bitmap indicating modified glyphs.  */\n    unsigned long    umod[34816];    /* Bitmap indicating modified          */\n                                     /* unencoded glyphs.                   */\n    unsigned short   modified;       /* Boolean indicating font modified.   */\n    unsigned short   bpp;            /* Bits per pixel.                     */\n\n    FT_Memory        memory;\n\n    bdf_property_t*  user_props;\n    unsigned long    nuser_props;\n    hashtable        proptbl;\n\n  } bdf_font_t;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Types for load/save callbacks.                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* Error codes. */\n#define BDF_MISSING_START       -1\n#define BDF_MISSING_FONTNAME    -2\n#define BDF_MISSING_SIZE        -3\n#define BDF_MISSING_CHARS       -4\n#define BDF_MISSING_STARTCHAR   -5\n#define BDF_MISSING_ENCODING    -6\n#define BDF_MISSING_BBX         -7\n\n#define BDF_OUT_OF_MEMORY      -20\n\n#define BDF_INVALID_LINE      -100\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* BDF font API.                                                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n  FT_LOCAL( FT_Error )\n  bdf_load_font( FT_Stream       stream,\n                 FT_Memory       memory,\n                 bdf_options_t*  opts,\n                 bdf_font_t*    *font );\n\n  FT_LOCAL( void )\n  bdf_free_font( bdf_font_t*  font );\n\n  FT_LOCAL( bdf_property_t * )\n  bdf_get_property( char*        name,\n                    bdf_font_t*  font );\n\n  FT_LOCAL( bdf_property_t * )\n  bdf_get_font_property( bdf_font_t*  font,\n                         const char*  name );\n\n\nFT_END_HEADER\n\n\n#endif /* __BDF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/bdf/bdfdrivr.c",
    "content": "/*  bdfdrivr.c\n\n    FreeType font driver for bdf files\n\n    Copyright (C) 2001-2008, 2011, 2013 by\n    Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n#include <ft2build.h>\n\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_BDF_H\n#include FT_TRUETYPE_IDS_H\n\n#include FT_SERVICE_BDF_H\n#include FT_SERVICE_XFREE86_NAME_H\n\n#include \"bdf.h\"\n#include \"bdfdrivr.h\"\n\n#include \"bdferror.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_bdfdriver\n\n\n  typedef struct  BDF_CMapRec_\n  {\n    FT_CMapRec        cmap;\n    FT_ULong          num_encodings; /* ftobjs.h: FT_CMap->clazz->size */\n    BDF_encoding_el*  encodings;\n\n  } BDF_CMapRec, *BDF_CMap;\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  bdf_cmap_init( FT_CMap     bdfcmap,\n                 FT_Pointer  init_data )\n  {\n    BDF_CMap  cmap = (BDF_CMap)bdfcmap;\n    BDF_Face  face = (BDF_Face)FT_CMAP_FACE( cmap );\n    FT_UNUSED( init_data );\n\n\n    cmap->num_encodings = face->bdffont->glyphs_used;\n    cmap->encodings     = face->en_table;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  bdf_cmap_done( FT_CMap  bdfcmap )\n  {\n    BDF_CMap  cmap = (BDF_CMap)bdfcmap;\n\n\n    cmap->encodings     = NULL;\n    cmap->num_encodings = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  bdf_cmap_char_index( FT_CMap    bdfcmap,\n                       FT_UInt32  charcode )\n  {\n    BDF_CMap          cmap      = (BDF_CMap)bdfcmap;\n    BDF_encoding_el*  encodings = cmap->encodings;\n    FT_ULong          min, max, mid; /* num_encodings */\n    FT_UShort         result    = 0; /* encodings->glyph */\n\n\n    min = 0;\n    max = cmap->num_encodings;\n\n    while ( min < max )\n    {\n      FT_ULong  code;\n\n\n      mid  = ( min + max ) >> 1;\n      code = encodings[mid].enc;\n\n      if ( charcode == code )\n      {\n        /* increase glyph index by 1 --              */\n        /* we reserve slot 0 for the undefined glyph */\n        result = encodings[mid].glyph + 1;\n        break;\n      }\n\n      if ( charcode < code )\n        max = mid;\n      else\n        min = mid + 1;\n    }\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  bdf_cmap_char_next( FT_CMap     bdfcmap,\n                      FT_UInt32  *acharcode )\n  {\n    BDF_CMap          cmap      = (BDF_CMap)bdfcmap;\n    BDF_encoding_el*  encodings = cmap->encodings;\n    FT_ULong          min, max, mid; /* num_encodings */\n    FT_UShort         result   = 0;  /* encodings->glyph */\n    FT_ULong          charcode = *acharcode + 1;\n\n\n    min = 0;\n    max = cmap->num_encodings;\n\n    while ( min < max )\n    {\n      FT_ULong  code; /* same as BDF_encoding_el.enc */\n\n\n      mid  = ( min + max ) >> 1;\n      code = encodings[mid].enc;\n\n      if ( charcode == code )\n      {\n        /* increase glyph index by 1 --              */\n        /* we reserve slot 0 for the undefined glyph */\n        result = encodings[mid].glyph + 1;\n        goto Exit;\n      }\n\n      if ( charcode < code )\n        max = mid;\n      else\n        min = mid + 1;\n    }\n\n    charcode = 0;\n    if ( min < cmap->num_encodings )\n    {\n      charcode = encodings[min].enc;\n      result   = encodings[min].glyph + 1;\n    }\n\n  Exit:\n    if ( charcode > 0xFFFFFFFFUL )\n    {\n      FT_TRACE1(( \"bdf_cmap_char_next: charcode 0x%x > 32bit API\" ));\n      *acharcode = 0;\n      /* XXX: result should be changed to indicate an overflow error */\n    }\n    else\n      *acharcode = (FT_UInt32)charcode;\n    return result;\n  }\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_CMap_ClassRec  bdf_cmap_class =\n  {\n    sizeof ( BDF_CMapRec ),\n    bdf_cmap_init,\n    bdf_cmap_done,\n    bdf_cmap_char_index,\n    bdf_cmap_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n  static FT_Error\n  bdf_interpret_style( BDF_Face  bdf )\n  {\n    FT_Error         error  = FT_Err_Ok;\n    FT_Face          face   = FT_FACE( bdf );\n    FT_Memory        memory = face->memory;\n    bdf_font_t*      font   = bdf->bdffont;\n    bdf_property_t*  prop;\n\n    char*   strings[4] = { NULL, NULL, NULL, NULL };\n    size_t  nn, len, lengths[4];\n\n\n    face->style_flags = 0;\n\n    prop = bdf_get_font_property( font, (char *)\"SLANT\" );\n    if ( prop && prop->format == BDF_ATOM                             &&\n         prop->value.atom                                             &&\n         ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ||\n           *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) )\n    {\n      face->style_flags |= FT_STYLE_FLAG_ITALIC;\n      strings[2] = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' )\n                   ? (char *)\"Oblique\"\n                   : (char *)\"Italic\";\n    }\n\n    prop = bdf_get_font_property( font, (char *)\"WEIGHT_NAME\" );\n    if ( prop && prop->format == BDF_ATOM                             &&\n         prop->value.atom                                             &&\n         ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) )\n    {\n      face->style_flags |= FT_STYLE_FLAG_BOLD;\n      strings[1] = (char *)\"Bold\";\n    }\n\n    prop = bdf_get_font_property( font, (char *)\"SETWIDTH_NAME\" );\n    if ( prop && prop->format == BDF_ATOM                              &&\n         prop->value.atom && *(prop->value.atom)                       &&\n         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )\n      strings[3] = (char *)(prop->value.atom);\n\n    prop = bdf_get_font_property( font, (char *)\"ADD_STYLE_NAME\" );\n    if ( prop && prop->format == BDF_ATOM                              &&\n         prop->value.atom && *(prop->value.atom)                       &&\n         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )\n      strings[0] = (char *)(prop->value.atom);\n\n    len = 0;\n\n    for ( len = 0, nn = 0; nn < 4; nn++ )\n    {\n      lengths[nn] = 0;\n      if ( strings[nn] )\n      {\n        lengths[nn] = ft_strlen( strings[nn] );\n        len        += lengths[nn] + 1;\n      }\n    }\n\n    if ( len == 0 )\n    {\n      strings[0] = (char *)\"Regular\";\n      lengths[0] = ft_strlen( strings[0] );\n      len        = lengths[0] + 1;\n    }\n\n    {\n      char*  s;\n\n\n      if ( FT_ALLOC( face->style_name, len ) )\n        return error;\n\n      s = face->style_name;\n\n      for ( nn = 0; nn < 4; nn++ )\n      {\n        char*  src = strings[nn];\n\n\n        len = lengths[nn];\n\n        if ( src == NULL )\n          continue;\n\n        /* separate elements with a space */\n        if ( s != face->style_name )\n          *s++ = ' ';\n\n        ft_memcpy( s, src, len );\n\n        /* need to convert spaces to dashes for */\n        /* add_style_name and setwidth_name     */\n        if ( nn == 0 || nn == 3 )\n        {\n          size_t  mm;\n\n\n          for ( mm = 0; mm < len; mm++ )\n            if ( s[mm] == ' ' )\n              s[mm] = '-';\n        }\n\n        s += len;\n      }\n      *s = 0;\n    }\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  BDF_Face_Done( FT_Face  bdfface )         /* BDF_Face */\n  {\n    BDF_Face   face = (BDF_Face)bdfface;\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = FT_FACE_MEMORY( face );\n\n    bdf_free_font( face->bdffont );\n\n    FT_FREE( face->en_table );\n\n    FT_FREE( face->charset_encoding );\n    FT_FREE( face->charset_registry );\n    FT_FREE( bdfface->family_name );\n    FT_FREE( bdfface->style_name );\n\n    FT_FREE( bdfface->available_sizes );\n\n    FT_FREE( face->bdffont );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  BDF_Face_Init( FT_Stream      stream,\n                 FT_Face        bdfface,        /* BDF_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params )\n  {\n    FT_Error       error  = FT_Err_Ok;\n    BDF_Face       face   = (BDF_Face)bdfface;\n    FT_Memory      memory = FT_FACE_MEMORY( face );\n\n    bdf_font_t*    font = NULL;\n    bdf_options_t  options;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n    FT_UNUSED( face_index );\n\n\n    FT_TRACE2(( \"BDF driver\\n\" ));\n\n    if ( FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    options.correct_metrics = 1;   /* FZ XXX: options semantics */\n    options.keep_unencoded  = 1;\n    options.keep_comments   = 0;\n    options.font_spacing    = BDF_PROPORTIONAL;\n\n    error = bdf_load_font( stream, memory, &options, &font );\n    if ( FT_ERR_EQ( error, Missing_Startfont_Field ) )\n    {\n      FT_TRACE2(( \"  not a BDF file\\n\" ));\n      goto Fail;\n    }\n    else if ( error )\n      goto Exit;\n\n    /* we have a bdf font: let's construct the face object */\n    face->bdffont = font;\n    {\n      bdf_property_t*  prop = NULL;\n\n\n      FT_TRACE4(( \"  number of glyphs: allocated %d (used %d)\\n\",\n                  font->glyphs_size,\n                  font->glyphs_used ));\n      FT_TRACE4(( \"  number of unencoded glyphs: allocated %d (used %d)\\n\",\n                  font->unencoded_size,\n                  font->unencoded_used ));\n\n      bdfface->num_faces  = 1;\n      bdfface->face_index = 0;\n      bdfface->face_flags = FT_FACE_FLAG_FIXED_SIZES |\n                            FT_FACE_FLAG_HORIZONTAL  |\n                            FT_FACE_FLAG_FAST_GLYPHS;\n\n      prop = bdf_get_font_property( font, \"SPACING\" );\n      if ( prop && prop->format == BDF_ATOM                             &&\n           prop->value.atom                                             &&\n           ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' ||\n             *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) )\n        bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL   */\n      /* FZ XXX: I need a font to implement this */\n\n      prop = bdf_get_font_property( font, \"FAMILY_NAME\" );\n      if ( prop && prop->value.atom )\n      {\n        if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) )\n          goto Exit;\n      }\n      else\n        bdfface->family_name = 0;\n\n      if ( ( error = bdf_interpret_style( face ) ) != 0 )\n        goto Exit;\n\n      /* the number of glyphs (with one slot for the undefined glyph */\n      /* at position 0 and all unencoded glyphs)                     */\n      bdfface->num_glyphs = font->glyphs_size + 1;\n\n      bdfface->num_fixed_sizes = 1;\n      if ( FT_NEW_ARRAY( bdfface->available_sizes, 1 ) )\n        goto Exit;\n\n      {\n        FT_Bitmap_Size*  bsize = bdfface->available_sizes;\n        FT_Short         resolution_x = 0, resolution_y = 0;\n\n\n        FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) );\n\n        bsize->height = (FT_Short)( font->font_ascent + font->font_descent );\n\n        prop = bdf_get_font_property( font, \"AVERAGE_WIDTH\" );\n        if ( prop )\n          bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 );\n        else\n          bsize->width = (FT_Short)( bsize->height * 2/3 );\n\n        prop = bdf_get_font_property( font, \"POINT_SIZE\" );\n        if ( prop )\n          /* convert from 722.7 decipoints to 72 points per inch */\n          bsize->size =\n            (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L );\n        else\n          bsize->size = bsize->width << 6;\n\n        prop = bdf_get_font_property( font, \"PIXEL_SIZE\" );\n        if ( prop )\n          bsize->y_ppem = (FT_Short)prop->value.l << 6;\n\n        prop = bdf_get_font_property( font, \"RESOLUTION_X\" );\n        if ( prop )\n          resolution_x = (FT_Short)prop->value.l;\n\n        prop = bdf_get_font_property( font, \"RESOLUTION_Y\" );\n        if ( prop )\n          resolution_y = (FT_Short)prop->value.l;\n\n        if ( bsize->y_ppem == 0 )\n        {\n          bsize->y_ppem = bsize->size;\n          if ( resolution_y )\n            bsize->y_ppem = bsize->y_ppem * resolution_y / 72;\n        }\n        if ( resolution_x && resolution_y )\n          bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y;\n        else\n          bsize->x_ppem = bsize->y_ppem;\n      }\n\n      /* encoding table */\n      {\n        bdf_glyph_t*   cur = font->glyphs;\n        unsigned long  n;\n\n\n        if ( FT_NEW_ARRAY( face->en_table, font->glyphs_size ) )\n          goto Exit;\n\n        face->default_glyph = 0;\n        for ( n = 0; n < font->glyphs_size; n++ )\n        {\n          (face->en_table[n]).enc = cur[n].encoding;\n          FT_TRACE4(( \"  idx %d, val 0x%lX\\n\", n, cur[n].encoding ));\n          (face->en_table[n]).glyph = (FT_Short)n;\n\n          if ( cur[n].encoding == font->default_char )\n          {\n            if ( n < FT_UINT_MAX )\n              face->default_glyph = (FT_UInt)n;\n            else\n              FT_TRACE1(( \"BDF_Face_Init:\"\n                          \" idx %d is too large for this system\\n\", n ));\n          }\n        }\n      }\n\n      /* charmaps */\n      {\n        bdf_property_t  *charset_registry = 0, *charset_encoding = 0;\n        FT_Bool          unicode_charmap  = 0;\n\n\n        charset_registry =\n          bdf_get_font_property( font, \"CHARSET_REGISTRY\" );\n        charset_encoding =\n          bdf_get_font_property( font, \"CHARSET_ENCODING\" );\n        if ( charset_registry && charset_encoding )\n        {\n          if ( charset_registry->format == BDF_ATOM &&\n               charset_encoding->format == BDF_ATOM &&\n               charset_registry->value.atom         &&\n               charset_encoding->value.atom         )\n          {\n            const char*  s;\n\n\n            if ( FT_STRDUP( face->charset_encoding,\n                            charset_encoding->value.atom ) ||\n                 FT_STRDUP( face->charset_registry,\n                            charset_registry->value.atom ) )\n              goto Exit;\n\n            /* Uh, oh, compare first letters manually to avoid dependency */\n            /* on locales.                                                */\n            s = face->charset_registry;\n            if ( ( s[0] == 'i' || s[0] == 'I' ) &&\n                 ( s[1] == 's' || s[1] == 'S' ) &&\n                 ( s[2] == 'o' || s[2] == 'O' ) )\n            {\n              s += 3;\n              if ( !ft_strcmp( s, \"10646\" )                      ||\n                   ( !ft_strcmp( s, \"8859\" ) &&\n                     !ft_strcmp( face->charset_encoding, \"1\" ) ) )\n              unicode_charmap = 1;\n            }\n\n            {\n              FT_CharMapRec  charmap;\n\n\n              charmap.face        = FT_FACE( face );\n              charmap.encoding    = FT_ENCODING_NONE;\n              /* initial platform/encoding should indicate unset status? */\n              charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;\n              charmap.encoding_id = TT_APPLE_ID_DEFAULT;\n\n              if ( unicode_charmap )\n              {\n                charmap.encoding    = FT_ENCODING_UNICODE;\n                charmap.platform_id = TT_PLATFORM_MICROSOFT;\n                charmap.encoding_id = TT_MS_ID_UNICODE_CS;\n              }\n\n              error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL );\n\n#if 0\n              /* Select default charmap */\n              if ( bdfface->num_charmaps )\n                bdfface->charmap = bdfface->charmaps[0];\n#endif\n            }\n\n            goto Exit;\n          }\n        }\n\n        /* otherwise assume Adobe standard encoding */\n\n        {\n          FT_CharMapRec  charmap;\n\n\n          charmap.face        = FT_FACE( face );\n          charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;\n          charmap.platform_id = TT_PLATFORM_ADOBE;\n          charmap.encoding_id = TT_ADOBE_ID_STANDARD;\n\n          error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL );\n\n          /* Select default charmap */\n          if ( bdfface->num_charmaps )\n            bdfface->charmap = bdfface->charmaps[0];\n        }\n      }\n    }\n\n  Exit:\n    return error;\n\n  Fail:\n    BDF_Face_Done( bdfface );\n    return FT_THROW( Unknown_File_Format );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  BDF_Size_Select( FT_Size   size,\n                   FT_ULong  strike_index )\n  {\n    bdf_font_t*  bdffont = ( (BDF_Face)size->face )->bdffont;\n\n\n    FT_Select_Metrics( size->face, strike_index );\n\n    size->metrics.ascender    = bdffont->font_ascent << 6;\n    size->metrics.descender   = -bdffont->font_descent << 6;\n    size->metrics.max_advance = bdffont->bbx.width << 6;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  BDF_Size_Request( FT_Size          size,\n                    FT_Size_Request  req )\n  {\n    FT_Face          face    = size->face;\n    FT_Bitmap_Size*  bsize   = face->available_sizes;\n    bdf_font_t*      bdffont = ( (BDF_Face)face )->bdffont;\n    FT_Error         error   = FT_ERR( Invalid_Pixel_Size );\n    FT_Long          height;\n\n\n    height = FT_REQUEST_HEIGHT( req );\n    height = ( height + 32 ) >> 6;\n\n    switch ( req->type )\n    {\n    case FT_SIZE_REQUEST_TYPE_NOMINAL:\n      if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) )\n        error = FT_Err_Ok;\n      break;\n\n    case FT_SIZE_REQUEST_TYPE_REAL_DIM:\n      if ( height == ( bdffont->font_ascent +\n                       bdffont->font_descent ) )\n        error = FT_Err_Ok;\n      break;\n\n    default:\n      error = FT_THROW( Unimplemented_Feature );\n      break;\n    }\n\n    if ( error )\n      return error;\n    else\n      return BDF_Size_Select( size, 0 );\n  }\n\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  BDF_Glyph_Load( FT_GlyphSlot  slot,\n                  FT_Size       size,\n                  FT_UInt       glyph_index,\n                  FT_Int32      load_flags )\n  {\n    BDF_Face     bdf    = (BDF_Face)FT_SIZE_FACE( size );\n    FT_Face      face   = FT_FACE( bdf );\n    FT_Error     error  = FT_Err_Ok;\n    FT_Bitmap*   bitmap = &slot->bitmap;\n    bdf_glyph_t  glyph;\n    int          bpp    = bdf->bdffont->bpp;\n\n    FT_UNUSED( load_flags );\n\n\n    if ( !face || glyph_index >= (FT_UInt)face->num_glyphs )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* index 0 is the undefined glyph */\n    if ( glyph_index == 0 )\n      glyph_index = bdf->default_glyph;\n    else\n      glyph_index--;\n\n    /* slot, bitmap => freetype, glyph => bdflib */\n    glyph = bdf->bdffont->glyphs[glyph_index];\n\n    bitmap->rows  = glyph.bbx.height;\n    bitmap->width = glyph.bbx.width;\n    if ( glyph.bpr > INT_MAX )\n      FT_TRACE1(( \"BDF_Glyph_Load: too large pitch %d is truncated\\n\",\n                   glyph.bpr ));\n    bitmap->pitch = (int)glyph.bpr; /* same as FT_Bitmap.pitch */\n\n    /* note: we don't allocate a new array to hold the bitmap; */\n    /*       we can simply point to it                         */\n    ft_glyphslot_set_bitmap( slot, glyph.bitmap );\n\n    switch ( bpp )\n    {\n    case 1:\n      bitmap->pixel_mode = FT_PIXEL_MODE_MONO;\n      break;\n    case 2:\n      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY2;\n      break;\n    case 4:\n      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY4;\n      break;\n    case 8:\n      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;\n      bitmap->num_grays  = 256;\n      break;\n    }\n\n    slot->format      = FT_GLYPH_FORMAT_BITMAP;\n    slot->bitmap_left = glyph.bbx.x_offset;\n    slot->bitmap_top  = glyph.bbx.ascent;\n\n    slot->metrics.horiAdvance  = glyph.dwidth << 6;\n    slot->metrics.horiBearingX = glyph.bbx.x_offset << 6;\n    slot->metrics.horiBearingY = glyph.bbx.ascent << 6;\n    slot->metrics.width        = bitmap->width << 6;\n    slot->metrics.height       = bitmap->rows << 6;\n\n    /*\n     * XXX DWIDTH1 and VVECTOR should be parsed and\n     * used here, provided such fonts do exist.\n     */\n    ft_synthesize_vertical_metrics( &slot->metrics,\n                                    bdf->bdffont->bbx.height << 6 );\n\n  Exit:\n    return error;\n  }\n\n\n /*\n  *\n  *  BDF SERVICE\n  *\n  */\n\n  static FT_Error\n  bdf_get_bdf_property( BDF_Face          face,\n                        const char*       prop_name,\n                        BDF_PropertyRec  *aproperty )\n  {\n    bdf_property_t*  prop;\n\n\n    FT_ASSERT( face && face->bdffont );\n\n    prop = bdf_get_font_property( face->bdffont, prop_name );\n    if ( prop )\n    {\n      switch ( prop->format )\n      {\n      case BDF_ATOM:\n        aproperty->type   = BDF_PROPERTY_TYPE_ATOM;\n        aproperty->u.atom = prop->value.atom;\n        break;\n\n      case BDF_INTEGER:\n        if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) )\n        {\n          FT_TRACE1(( \"bdf_get_bdf_property:\"\n                      \" too large integer 0x%x is truncated\\n\" ));\n        }\n        aproperty->type      = BDF_PROPERTY_TYPE_INTEGER;\n        aproperty->u.integer = (FT_Int32)prop->value.l;\n        break;\n\n      case BDF_CARDINAL:\n        if ( prop->value.ul > 0xFFFFFFFFUL )\n        {\n          FT_TRACE1(( \"bdf_get_bdf_property:\"\n                      \" too large cardinal 0x%x is truncated\\n\" ));\n        }\n        aproperty->type       = BDF_PROPERTY_TYPE_CARDINAL;\n        aproperty->u.cardinal = (FT_UInt32)prop->value.ul;\n        break;\n\n      default:\n        goto Fail;\n      }\n      return 0;\n    }\n\n  Fail:\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  static FT_Error\n  bdf_get_charset_id( BDF_Face      face,\n                      const char*  *acharset_encoding,\n                      const char*  *acharset_registry )\n  {\n    *acharset_encoding = face->charset_encoding;\n    *acharset_registry = face->charset_registry;\n\n    return 0;\n  }\n\n\n  static const FT_Service_BDFRec  bdf_service_bdf =\n  {\n    (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id,\n    (FT_BDF_GetPropertyFunc) bdf_get_bdf_property\n  };\n\n\n /*\n  *\n  *  SERVICES LIST\n  *\n  */\n\n  static const FT_ServiceDescRec  bdf_services[] =\n  {\n    { FT_SERVICE_ID_BDF,       &bdf_service_bdf },\n    { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_BDF },\n    { NULL, NULL }\n  };\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  bdf_driver_requester( FT_Module    module,\n                        const char*  name )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( bdf_services, name );\n  }\n\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Driver_ClassRec  bdf_driver_class =\n  {\n    {\n      FT_MODULE_FONT_DRIVER         |\n      FT_MODULE_DRIVER_NO_OUTLINES,\n      sizeof ( FT_DriverRec ),\n\n      \"bdf\",\n      0x10000L,\n      0x20000L,\n\n      0,\n\n      0,                        /* FT_Module_Constructor */\n      0,                        /* FT_Module_Destructor  */\n      bdf_driver_requester\n    },\n\n    sizeof ( BDF_FaceRec ),\n    sizeof ( FT_SizeRec ),\n    sizeof ( FT_GlyphSlotRec ),\n\n    BDF_Face_Init,\n    BDF_Face_Done,\n    0,                          /* FT_Size_InitFunc */\n    0,                          /* FT_Size_DoneFunc */\n    0,                          /* FT_Slot_InitFunc */\n    0,                          /* FT_Slot_DoneFunc */\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    ft_stub_set_char_sizes,\n    ft_stub_set_pixel_sizes,\n#endif\n    BDF_Glyph_Load,\n\n    0,                          /* FT_Face_GetKerningFunc  */\n    0,                          /* FT_Face_AttachFunc      */\n    0,                          /* FT_Face_GetAdvancesFunc */\n\n    BDF_Size_Request,\n    BDF_Size_Select\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/bdf/bdfdrivr.h",
    "content": "/*  bdfdrivr.h\n\n    FreeType font driver for bdf fonts\n\n  Copyright (C) 2001, 2002, 2003, 2004 by\n  Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n\n#ifndef __BDFDRIVR_H__\n#define __BDFDRIVR_H__\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n\n#include \"bdf.h\"\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  typedef struct  BDF_encoding_el_\n  {\n    FT_ULong   enc;\n    FT_UShort  glyph;\n\n  } BDF_encoding_el;\n\n\n  typedef struct  BDF_FaceRec_\n  {\n    FT_FaceRec        root;\n\n    char*             charset_encoding;\n    char*             charset_registry;\n\n    bdf_font_t*       bdffont;\n\n    BDF_encoding_el*  en_table;\n\n    FT_CharMap        charmap_handle;\n    FT_CharMapRec     charmap;  /* a single charmap per face */\n\n    FT_UInt           default_glyph;\n\n  } BDF_FaceRec, *BDF_Face;\n\n\n  FT_EXPORT_VAR( const FT_Driver_ClassRec )  bdf_driver_class;\n\n\nFT_END_HEADER\n\n\n#endif /* __BDFDRIVR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/bdf/bdferror.h",
    "content": "/*\n * Copyright 2001, 2002, 2012 Francesco Zappa Nardelli\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\n * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR\n * THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the BDF error enumeration constants.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __BDFERROR_H__\n#define __BDFERROR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  BDF_Err_\n#define FT_ERR_BASE    FT_Mod_Err_BDF\n\n#include FT_ERRORS_H\n\n#endif /* __BDFERROR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/bdf/bdflib.c",
    "content": "/*\n * Copyright 2000 Computing Research Labs, New Mexico State University\n * Copyright 2001-2013\n *   Francesco Zappa Nardelli\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\n * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR\n * THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  This file is based on bdf.c,v 1.22 2000/03/16 20:08:50               */\n  /*                                                                       */\n  /*  taken from Mark Leisher's xmbdfed package                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n\n#include FT_FREETYPE_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_OBJECTS_H\n\n#include \"bdf.h\"\n#include \"bdferror.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_bdflib\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Default BDF font options.                                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static const bdf_options_t  _bdf_opts =\n  {\n    1,                /* Correct metrics.               */\n    1,                /* Preserve unencoded glyphs.     */\n    0,                /* Preserve comments.             */\n    BDF_PROPORTIONAL  /* Default spacing.               */\n  };\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Builtin BDF font properties.                                          */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /* List of most properties that might appear in a font.  Doesn't include */\n  /* the RAW_* and AXIS_* properties in X11R6 polymorphic fonts.           */\n\n  static const bdf_property_t  _bdf_properties[] =\n  {\n    { (char *)\"ADD_STYLE_NAME\",          BDF_ATOM,     1, { 0 } },\n    { (char *)\"AVERAGE_WIDTH\",           BDF_INTEGER,  1, { 0 } },\n    { (char *)\"AVG_CAPITAL_WIDTH\",       BDF_INTEGER,  1, { 0 } },\n    { (char *)\"AVG_LOWERCASE_WIDTH\",     BDF_INTEGER,  1, { 0 } },\n    { (char *)\"CAP_HEIGHT\",              BDF_INTEGER,  1, { 0 } },\n    { (char *)\"CHARSET_COLLECTIONS\",     BDF_ATOM,     1, { 0 } },\n    { (char *)\"CHARSET_ENCODING\",        BDF_ATOM,     1, { 0 } },\n    { (char *)\"CHARSET_REGISTRY\",        BDF_ATOM,     1, { 0 } },\n    { (char *)\"COMMENT\",                 BDF_ATOM,     1, { 0 } },\n    { (char *)\"COPYRIGHT\",               BDF_ATOM,     1, { 0 } },\n    { (char *)\"DEFAULT_CHAR\",            BDF_CARDINAL, 1, { 0 } },\n    { (char *)\"DESTINATION\",             BDF_CARDINAL, 1, { 0 } },\n    { (char *)\"DEVICE_FONT_NAME\",        BDF_ATOM,     1, { 0 } },\n    { (char *)\"END_SPACE\",               BDF_INTEGER,  1, { 0 } },\n    { (char *)\"FACE_NAME\",               BDF_ATOM,     1, { 0 } },\n    { (char *)\"FAMILY_NAME\",             BDF_ATOM,     1, { 0 } },\n    { (char *)\"FIGURE_WIDTH\",            BDF_INTEGER,  1, { 0 } },\n    { (char *)\"FONT\",                    BDF_ATOM,     1, { 0 } },\n    { (char *)\"FONTNAME_REGISTRY\",       BDF_ATOM,     1, { 0 } },\n    { (char *)\"FONT_ASCENT\",             BDF_INTEGER,  1, { 0 } },\n    { (char *)\"FONT_DESCENT\",            BDF_INTEGER,  1, { 0 } },\n    { (char *)\"FOUNDRY\",                 BDF_ATOM,     1, { 0 } },\n    { (char *)\"FULL_NAME\",               BDF_ATOM,     1, { 0 } },\n    { (char *)\"ITALIC_ANGLE\",            BDF_INTEGER,  1, { 0 } },\n    { (char *)\"MAX_SPACE\",               BDF_INTEGER,  1, { 0 } },\n    { (char *)\"MIN_SPACE\",               BDF_INTEGER,  1, { 0 } },\n    { (char *)\"NORM_SPACE\",              BDF_INTEGER,  1, { 0 } },\n    { (char *)\"NOTICE\",                  BDF_ATOM,     1, { 0 } },\n    { (char *)\"PIXEL_SIZE\",              BDF_INTEGER,  1, { 0 } },\n    { (char *)\"POINT_SIZE\",              BDF_INTEGER,  1, { 0 } },\n    { (char *)\"QUAD_WIDTH\",              BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_ASCENT\",              BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_AVERAGE_WIDTH\",       BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_AVG_CAPITAL_WIDTH\",   BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_AVG_LOWERCASE_WIDTH\", BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_CAP_HEIGHT\",          BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_DESCENT\",             BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_END_SPACE\",           BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_FIGURE_WIDTH\",        BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_MAX_SPACE\",           BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_MIN_SPACE\",           BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_NORM_SPACE\",          BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_PIXEL_SIZE\",          BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_POINT_SIZE\",          BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_PIXELSIZE\",           BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_POINTSIZE\",           BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_QUAD_WIDTH\",          BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_SMALL_CAP_SIZE\",      BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_STRIKEOUT_ASCENT\",    BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_STRIKEOUT_DESCENT\",   BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_SUBSCRIPT_SIZE\",      BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_SUBSCRIPT_X\",         BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_SUBSCRIPT_Y\",         BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_SUPERSCRIPT_SIZE\",    BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_SUPERSCRIPT_X\",       BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_SUPERSCRIPT_Y\",       BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_UNDERLINE_POSITION\",  BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_UNDERLINE_THICKNESS\", BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RAW_X_HEIGHT\",            BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RELATIVE_SETWIDTH\",       BDF_CARDINAL, 1, { 0 } },\n    { (char *)\"RELATIVE_WEIGHT\",         BDF_CARDINAL, 1, { 0 } },\n    { (char *)\"RESOLUTION\",              BDF_INTEGER,  1, { 0 } },\n    { (char *)\"RESOLUTION_X\",            BDF_CARDINAL, 1, { 0 } },\n    { (char *)\"RESOLUTION_Y\",            BDF_CARDINAL, 1, { 0 } },\n    { (char *)\"SETWIDTH_NAME\",           BDF_ATOM,     1, { 0 } },\n    { (char *)\"SLANT\",                   BDF_ATOM,     1, { 0 } },\n    { (char *)\"SMALL_CAP_SIZE\",          BDF_INTEGER,  1, { 0 } },\n    { (char *)\"SPACING\",                 BDF_ATOM,     1, { 0 } },\n    { (char *)\"STRIKEOUT_ASCENT\",        BDF_INTEGER,  1, { 0 } },\n    { (char *)\"STRIKEOUT_DESCENT\",       BDF_INTEGER,  1, { 0 } },\n    { (char *)\"SUBSCRIPT_SIZE\",          BDF_INTEGER,  1, { 0 } },\n    { (char *)\"SUBSCRIPT_X\",             BDF_INTEGER,  1, { 0 } },\n    { (char *)\"SUBSCRIPT_Y\",             BDF_INTEGER,  1, { 0 } },\n    { (char *)\"SUPERSCRIPT_SIZE\",        BDF_INTEGER,  1, { 0 } },\n    { (char *)\"SUPERSCRIPT_X\",           BDF_INTEGER,  1, { 0 } },\n    { (char *)\"SUPERSCRIPT_Y\",           BDF_INTEGER,  1, { 0 } },\n    { (char *)\"UNDERLINE_POSITION\",      BDF_INTEGER,  1, { 0 } },\n    { (char *)\"UNDERLINE_THICKNESS\",     BDF_INTEGER,  1, { 0 } },\n    { (char *)\"WEIGHT\",                  BDF_CARDINAL, 1, { 0 } },\n    { (char *)\"WEIGHT_NAME\",             BDF_ATOM,     1, { 0 } },\n    { (char *)\"X_HEIGHT\",                BDF_INTEGER,  1, { 0 } },\n    { (char *)\"_MULE_BASELINE_OFFSET\",   BDF_INTEGER,  1, { 0 } },\n    { (char *)\"_MULE_RELATIVE_COMPOSE\",  BDF_INTEGER,  1, { 0 } },\n  };\n\n  static const unsigned long\n  _num_bdf_properties = sizeof ( _bdf_properties ) /\n                        sizeof ( _bdf_properties[0] );\n\n\n  /* Auto correction messages. */\n#define ACMSG1   \"FONT_ASCENT property missing.  \" \\\n                 \"Added `FONT_ASCENT %hd'.\\n\"\n#define ACMSG2   \"FONT_DESCENT property missing.  \" \\\n                 \"Added `FONT_DESCENT %hd'.\\n\"\n#define ACMSG3   \"Font width != actual width.  Old: %hd New: %hd.\\n\"\n#define ACMSG4   \"Font left bearing != actual left bearing.  \" \\\n                 \"Old: %hd New: %hd.\\n\"\n#define ACMSG5   \"Font ascent != actual ascent.  Old: %hd New: %hd.\\n\"\n#define ACMSG6   \"Font descent != actual descent.  Old: %hd New: %hd.\\n\"\n#define ACMSG7   \"Font height != actual height. Old: %hd New: %hd.\\n\"\n#define ACMSG8   \"Glyph scalable width (SWIDTH) adjustments made.\\n\"\n#define ACMSG9   \"SWIDTH field missing at line %ld.  Set automatically.\\n\"\n#define ACMSG10  \"DWIDTH field missing at line %ld.  Set to glyph width.\\n\"\n#define ACMSG11  \"SIZE bits per pixel field adjusted to %hd.\\n\"\n#define ACMSG12  \"Duplicate encoding %ld (%s) changed to unencoded.\\n\"\n#define ACMSG13  \"Glyph %ld extra rows removed.\\n\"\n#define ACMSG14  \"Glyph %ld extra columns removed.\\n\"\n#define ACMSG15  \"Incorrect glyph count: %ld indicated but %ld found.\\n\"\n#define ACMSG16  \"Glyph %ld missing columns padded with zero bits.\\n\"\n\n  /* Error messages. */\n#define ERRMSG1  \"[line %ld] Missing `%s' line.\\n\"\n#define ERRMSG2  \"[line %ld] Font header corrupted or missing fields.\\n\"\n#define ERRMSG3  \"[line %ld] Font glyphs corrupted or missing fields.\\n\"\n#define ERRMSG4  \"[line %ld] BBX too big.\\n\"\n#define ERRMSG5  \"[line %ld] `%s' value too big.\\n\"\n#define ERRMSG6  \"[line %ld] Input line too long.\\n\"\n#define ERRMSG7  \"[line %ld] Font name too long.\\n\"\n#define ERRMSG8  \"[line %ld] Invalid `%s' value.\\n\"\n#define ERRMSG9  \"[line %ld] Invalid keyword.\\n\"\n\n  /* Debug messages. */\n#define DBGMSG1  \"  [%6ld] %s\" /* no \\n */\n#define DBGMSG2  \" (0x%lX)\\n\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Hash table utilities for the properties.                              */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /* XXX: Replace this with FreeType's hash functions */\n\n\n#define INITIAL_HT_SIZE  241\n\n  typedef void\n  (*hash_free_func)( hashnode  node );\n\n  static hashnode*\n  hash_bucket( const char*  key,\n               hashtable*   ht )\n  {\n    const char*    kp  = key;\n    unsigned long  res = 0;\n    hashnode*      bp  = ht->table, *ndp;\n\n\n    /* Mocklisp hash function. */\n    while ( *kp )\n      res = ( res << 5 ) - res + *kp++;\n\n    ndp = bp + ( res % ht->size );\n    while ( *ndp )\n    {\n      kp = (*ndp)->key;\n      if ( kp[0] == key[0] && ft_strcmp( kp, key ) == 0 )\n        break;\n      ndp--;\n      if ( ndp < bp )\n        ndp = bp + ( ht->size - 1 );\n    }\n\n    return ndp;\n  }\n\n\n  static FT_Error\n  hash_rehash( hashtable*  ht,\n               FT_Memory   memory )\n  {\n    hashnode*  obp = ht->table, *bp, *nbp;\n    int        i, sz = ht->size;\n    FT_Error   error = FT_Err_Ok;\n\n\n    ht->size <<= 1;\n    ht->limit  = ht->size / 3;\n\n    if ( FT_NEW_ARRAY( ht->table, ht->size ) )\n      goto Exit;\n\n    for ( i = 0, bp = obp; i < sz; i++, bp++ )\n    {\n      if ( *bp )\n      {\n        nbp = hash_bucket( (*bp)->key, ht );\n        *nbp = *bp;\n      }\n    }\n    FT_FREE( obp );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  hash_init( hashtable*  ht,\n             FT_Memory   memory )\n  {\n    int       sz    = INITIAL_HT_SIZE;\n    FT_Error  error = FT_Err_Ok;\n\n\n    ht->size  = sz;\n    ht->limit = sz / 3;\n    ht->used  = 0;\n\n    if ( FT_NEW_ARRAY( ht->table, sz ) )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  hash_free( hashtable*  ht,\n             FT_Memory   memory )\n  {\n    if ( ht != 0 )\n    {\n      int        i, sz = ht->size;\n      hashnode*  bp = ht->table;\n\n\n      for ( i = 0; i < sz; i++, bp++ )\n        FT_FREE( *bp );\n\n      FT_FREE( ht->table );\n    }\n  }\n\n\n  static FT_Error\n  hash_insert( char*       key,\n               size_t      data,\n               hashtable*  ht,\n               FT_Memory   memory )\n  {\n    hashnode   nn;\n    hashnode*  bp      = hash_bucket( key, ht );\n    FT_Error   error   = FT_Err_Ok;\n\n\n    nn = *bp;\n    if ( !nn )\n    {\n      if ( FT_NEW( nn ) )\n        goto Exit;\n      *bp = nn;\n\n      nn->key  = key;\n      nn->data = data;\n\n      if ( ht->used >= ht->limit )\n      {\n        error = hash_rehash( ht, memory );\n        if ( error )\n          goto Exit;\n      }\n      ht->used++;\n    }\n    else\n      nn->data = data;\n\n  Exit:\n    return error;\n  }\n\n\n  static hashnode\n  hash_lookup( const char* key,\n               hashtable*  ht )\n  {\n    hashnode *np = hash_bucket( key, ht );\n\n\n    return *np;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Utility types and functions.                                          */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* Function type for parsing lines of a BDF font. */\n\n  typedef FT_Error\n  (*_bdf_line_func_t)( char*          line,\n                       unsigned long  linelen,\n                       unsigned long  lineno,\n                       void*          call_data,\n                       void*          client_data );\n\n\n  /* List structure for splitting lines into fields. */\n\n  typedef struct  _bdf_list_t_\n  {\n    char**         field;\n    unsigned long  size;\n    unsigned long  used;\n    FT_Memory      memory;\n\n  } _bdf_list_t;\n\n\n  /* Structure used while loading BDF fonts. */\n\n  typedef struct  _bdf_parse_t_\n  {\n    unsigned long   flags;\n    unsigned long   cnt;\n    unsigned long   row;\n\n    short           minlb;\n    short           maxlb;\n    short           maxrb;\n    short           maxas;\n    short           maxds;\n\n    short           rbearing;\n\n    char*           glyph_name;\n    long            glyph_enc;\n\n    bdf_font_t*     font;\n    bdf_options_t*  opts;\n\n    unsigned long   have[34816]; /* must be in sync with `nmod' and `umod' */\n                                 /* arrays from `bdf_font_t' structure     */\n    _bdf_list_t     list;\n\n    FT_Memory       memory;\n\n  } _bdf_parse_t;\n\n\n#define setsbit( m, cc ) \\\n          ( m[(FT_Byte)(cc) >> 3] |= (FT_Byte)( 1 << ( (cc) & 7 ) ) )\n#define sbitset( m, cc ) \\\n          ( m[(FT_Byte)(cc) >> 3]  & ( 1 << ( (cc) & 7 ) ) )\n\n\n  static void\n  _bdf_list_init( _bdf_list_t*  list,\n                  FT_Memory     memory )\n  {\n    FT_ZERO( list );\n    list->memory = memory;\n  }\n\n\n  static void\n  _bdf_list_done( _bdf_list_t*  list )\n  {\n    FT_Memory  memory = list->memory;\n\n\n    if ( memory )\n    {\n      FT_FREE( list->field );\n      FT_ZERO( list );\n    }\n  }\n\n\n  static FT_Error\n  _bdf_list_ensure( _bdf_list_t*   list,\n                    unsigned long  num_items ) /* same as _bdf_list_t.used */\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( num_items > list->size )\n    {\n      unsigned long  oldsize = list->size; /* same as _bdf_list_t.size */\n      unsigned long  newsize = oldsize + ( oldsize >> 1 ) + 5;\n      unsigned long  bigsize = (unsigned long)( FT_INT_MAX / sizeof ( char* ) );\n      FT_Memory      memory  = list->memory;\n\n\n      if ( oldsize == bigsize )\n      {\n        error = FT_THROW( Out_Of_Memory );\n        goto Exit;\n      }\n      else if ( newsize < oldsize || newsize > bigsize )\n        newsize = bigsize;\n\n      if ( FT_RENEW_ARRAY( list->field, oldsize, newsize ) )\n        goto Exit;\n\n      list->size = newsize;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  _bdf_list_shift( _bdf_list_t*   list,\n                   unsigned long  n )\n  {\n    unsigned long  i, u;\n\n\n    if ( list == 0 || list->used == 0 || n == 0 )\n      return;\n\n    if ( n >= list->used )\n    {\n      list->used = 0;\n      return;\n    }\n\n    for ( u = n, i = 0; u < list->used; i++, u++ )\n      list->field[i] = list->field[u];\n    list->used -= n;\n  }\n\n\n  /* An empty string for empty fields. */\n\n  static const char  empty[1] = { 0 };      /* XXX eliminate this */\n\n\n  static char *\n  _bdf_list_join( _bdf_list_t*    list,\n                  int             c,\n                  unsigned long  *alen )\n  {\n    unsigned long  i, j;\n    char           *fp, *dp;\n\n\n    *alen = 0;\n\n    if ( list == 0 || list->used == 0 )\n      return 0;\n\n    dp = list->field[0];\n    for ( i = j = 0; i < list->used; i++ )\n    {\n      fp = list->field[i];\n      while ( *fp )\n        dp[j++] = *fp++;\n\n      if ( i + 1 < list->used )\n        dp[j++] = (char)c;\n    }\n    if ( dp != empty )\n      dp[j] = 0;\n\n    *alen = j;\n    return dp;\n  }\n\n\n  /* The code below ensures that we have at least 4 + 1 `field' */\n  /* elements in `list' (which are possibly NULL) so that we    */\n  /* don't have to check the number of fields in most cases.    */\n\n  static FT_Error\n  _bdf_list_split( _bdf_list_t*   list,\n                   char*          separators,\n                   char*          line,\n                   unsigned long  linelen )\n  {\n    int       mult, final_empty;\n    char      *sp, *ep, *end;\n    char      seps[32];\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* Initialize the list. */\n    list->used = 0;\n    if ( list->size )\n    {\n      list->field[0] = (char*)empty;\n      list->field[1] = (char*)empty;\n      list->field[2] = (char*)empty;\n      list->field[3] = (char*)empty;\n      list->field[4] = (char*)empty;\n    }\n\n    /* If the line is empty, then simply return. */\n    if ( linelen == 0 || line[0] == 0 )\n      goto Exit;\n\n    /* In the original code, if the `separators' parameter is NULL or */\n    /* empty, the list is split into individual bytes.  We don't need */\n    /* this, so an error is signaled.                                 */\n    if ( separators == 0 || *separators == 0 )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* Prepare the separator bitmap. */\n    FT_MEM_ZERO( seps, 32 );\n\n    /* If the very last character of the separator string is a plus, then */\n    /* set the `mult' flag to indicate that multiple separators should be */\n    /* collapsed into one.                                                */\n    for ( mult = 0, sp = separators; sp && *sp; sp++ )\n    {\n      if ( *sp == '+' && *( sp + 1 ) == 0 )\n        mult = 1;\n      else\n        setsbit( seps, *sp );\n    }\n\n    /* Break the line up into fields. */\n    for ( final_empty = 0, sp = ep = line, end = sp + linelen;\n          sp < end && *sp; )\n    {\n      /* Collect everything that is not a separator. */\n      for ( ; *ep && !sbitset( seps, *ep ); ep++ )\n        ;\n\n      /* Resize the list if necessary. */\n      if ( list->used == list->size )\n      {\n        error = _bdf_list_ensure( list, list->used + 1 );\n        if ( error )\n          goto Exit;\n      }\n\n      /* Assign the field appropriately. */\n      list->field[list->used++] = ( ep > sp ) ? sp : (char*)empty;\n\n      sp = ep;\n\n      if ( mult )\n      {\n        /* If multiple separators should be collapsed, do it now by */\n        /* setting all the separator characters to 0.               */\n        for ( ; *ep && sbitset( seps, *ep ); ep++ )\n          *ep = 0;\n      }\n      else if ( *ep != 0 )\n        /* Don't collapse multiple separators by making them 0, so just */\n        /* make the one encountered 0.                                  */\n        *ep++ = 0;\n\n      final_empty = ( ep > sp && *ep == 0 );\n      sp = ep;\n    }\n\n    /* Finally, NULL-terminate the list. */\n    if ( list->used + final_empty >= list->size )\n    {\n      error = _bdf_list_ensure( list, list->used + final_empty + 1 );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( final_empty )\n      list->field[list->used++] = (char*)empty;\n\n    list->field[list->used] = 0;\n\n  Exit:\n    return error;\n  }\n\n\n#define NO_SKIP  256  /* this value cannot be stored in a 'char' */\n\n\n  static FT_Error\n  _bdf_readstream( FT_Stream         stream,\n                   _bdf_line_func_t  callback,\n                   void*             client_data,\n                   unsigned long    *lno )\n  {\n    _bdf_line_func_t  cb;\n    unsigned long     lineno, buf_size;\n    int               refill, hold, to_skip;\n    ptrdiff_t         bytes, start, end, cursor, avail;\n    char*             buf    = 0;\n    FT_Memory         memory = stream->memory;\n    FT_Error          error  = FT_Err_Ok;\n\n\n    if ( callback == 0 )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* initial size and allocation of the input buffer */\n    buf_size = 1024;\n\n    if ( FT_NEW_ARRAY( buf, buf_size ) )\n      goto Exit;\n\n    cb      = callback;\n    lineno  = 1;\n    buf[0]  = 0;\n    start   = 0;\n    end     = 0;\n    avail   = 0;\n    cursor  = 0;\n    refill  = 1;\n    to_skip = NO_SKIP;\n    bytes   = 0;        /* make compiler happy */\n\n    for (;;)\n    {\n      if ( refill )\n      {\n        bytes  = (ptrdiff_t)FT_Stream_TryRead(\n                   stream, (FT_Byte*)buf + cursor,\n                   (FT_ULong)( buf_size - cursor ) );\n        avail  = cursor + bytes;\n        cursor = 0;\n        refill = 0;\n      }\n\n      end = start;\n\n      /* should we skip an optional character like \\n or \\r? */\n      if ( start < avail && buf[start] == to_skip )\n      {\n        start  += 1;\n        to_skip = NO_SKIP;\n        continue;\n      }\n\n      /* try to find the end of the line */\n      while ( end < avail && buf[end] != '\\n' && buf[end] != '\\r' )\n        end++;\n\n      /* if we hit the end of the buffer, try shifting its content */\n      /* or even resizing it                                       */\n      if ( end >= avail )\n      {\n        if ( bytes == 0 )  /* last line in file doesn't end in \\r or \\n */\n          break;           /* ignore it then exit                       */\n\n        if ( start == 0 )\n        {\n          /* this line is definitely too long; try resizing the input */\n          /* buffer a bit to handle it.                               */\n          FT_ULong  new_size;\n\n\n          if ( buf_size >= 65536UL )  /* limit ourselves to 64KByte */\n          {\n            FT_ERROR(( \"_bdf_readstream: \" ERRMSG6, lineno ));\n            error = FT_THROW( Invalid_Argument );\n            goto Exit;\n          }\n\n          new_size = buf_size * 2;\n          if ( FT_RENEW_ARRAY( buf, buf_size, new_size ) )\n            goto Exit;\n\n          cursor   = buf_size;\n          buf_size = new_size;\n        }\n        else\n        {\n          bytes = avail - start;\n\n          FT_MEM_MOVE( buf, buf + start, bytes );\n\n          cursor = bytes;\n          avail -= bytes;\n          start  = 0;\n        }\n        refill = 1;\n        continue;\n      }\n\n      /* Temporarily NUL-terminate the line. */\n      hold     = buf[end];\n      buf[end] = 0;\n\n      /* XXX: Use encoding independent value for 0x1a */\n      if ( buf[start] != '#' && buf[start] != 0x1a && end > start )\n      {\n        error = (*cb)( buf + start, (unsigned long)( end - start ), lineno,\n                       (void*)&cb, client_data );\n        /* Redo if we have encountered CHARS without properties. */\n        if ( error == -1 )\n          error = (*cb)( buf + start, (unsigned long)( end - start ), lineno,\n                         (void*)&cb, client_data );\n        if ( error )\n          break;\n      }\n\n      lineno  += 1;\n      buf[end] = (char)hold;\n      start    = end + 1;\n\n      if ( hold == '\\n' )\n        to_skip = '\\r';\n      else if ( hold == '\\r' )\n        to_skip = '\\n';\n      else\n        to_skip = NO_SKIP;\n    }\n\n    *lno = lineno;\n\n  Exit:\n    FT_FREE( buf );\n    return error;\n  }\n\n\n  /* XXX: make this work with EBCDIC also */\n\n  static const unsigned char  a2i[128] =\n  {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n  };\n\n  static const unsigned char  odigits[32] =\n  {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  };\n\n  static const unsigned char  ddigits[32] =\n  {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  };\n\n  static const unsigned char  hdigits[32] =\n  {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,\n    0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  };\n\n\n  /* Routine to convert an ASCII string into an unsigned long integer. */\n  static unsigned long\n  _bdf_atoul( char*   s,\n              char**  end,\n              int     base )\n  {\n    unsigned long         v;\n    const unsigned char*  dmap;\n\n\n    if ( s == 0 || *s == 0 )\n      return 0;\n\n    /* Make sure the radix is something recognizable.  Default to 10. */\n    switch ( base )\n    {\n    case 8:\n      dmap = odigits;\n      break;\n    case 16:\n      dmap = hdigits;\n      break;\n    default:\n      base = 10;\n      dmap = ddigits;\n      break;\n    }\n\n    /* Check for the special hex prefix. */\n    if ( *s == '0'                                  &&\n         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )\n    {\n      base = 16;\n      dmap = hdigits;\n      s   += 2;\n    }\n\n    for ( v = 0; sbitset( dmap, *s ); s++ )\n      v = v * base + a2i[(int)*s];\n\n    if ( end != 0 )\n      *end = s;\n\n    return v;\n  }\n\n\n  /* Routine to convert an ASCII string into an signed long integer. */\n  static long\n  _bdf_atol( char*   s,\n             char**  end,\n             int     base )\n  {\n    long                  v, neg;\n    const unsigned char*  dmap;\n\n\n    if ( s == 0 || *s == 0 )\n      return 0;\n\n    /* Make sure the radix is something recognizable.  Default to 10. */\n    switch ( base )\n    {\n    case 8:\n      dmap = odigits;\n      break;\n    case 16:\n      dmap = hdigits;\n      break;\n    default:\n      base = 10;\n      dmap = ddigits;\n      break;\n    }\n\n    /* Check for a minus sign. */\n    neg = 0;\n    if ( *s == '-' )\n    {\n      s++;\n      neg = 1;\n    }\n\n    /* Check for the special hex prefix. */\n    if ( *s == '0'                                  &&\n         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )\n    {\n      base = 16;\n      dmap = hdigits;\n      s   += 2;\n    }\n\n    for ( v = 0; sbitset( dmap, *s ); s++ )\n      v = v * base + a2i[(int)*s];\n\n    if ( end != 0 )\n      *end = s;\n\n    return ( !neg ) ? v : -v;\n  }\n\n\n  /* Routine to convert an ASCII string into an signed short integer. */\n  static short\n  _bdf_atos( char*   s,\n             char**  end,\n             int     base )\n  {\n    short                 v, neg;\n    const unsigned char*  dmap;\n\n\n    if ( s == 0 || *s == 0 )\n      return 0;\n\n    /* Make sure the radix is something recognizable.  Default to 10. */\n    switch ( base )\n    {\n    case 8:\n      dmap = odigits;\n      break;\n    case 16:\n      dmap = hdigits;\n      break;\n    default:\n      base = 10;\n      dmap = ddigits;\n      break;\n    }\n\n    /* Check for a minus. */\n    neg = 0;\n    if ( *s == '-' )\n    {\n      s++;\n      neg = 1;\n    }\n\n    /* Check for the special hex prefix. */\n    if ( *s == '0'                                  &&\n         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )\n    {\n      base = 16;\n      dmap = hdigits;\n      s   += 2;\n    }\n\n    for ( v = 0; sbitset( dmap, *s ); s++ )\n      v = (short)( v * base + a2i[(int)*s] );\n\n    if ( end != 0 )\n      *end = s;\n\n    return (short)( ( !neg ) ? v : -v );\n  }\n\n\n  /* Routine to compare two glyphs by encoding so they can be sorted. */\n  static int\n  by_encoding( const void*  a,\n               const void*  b )\n  {\n    bdf_glyph_t  *c1, *c2;\n\n\n    c1 = (bdf_glyph_t *)a;\n    c2 = (bdf_glyph_t *)b;\n\n    if ( c1->encoding < c2->encoding )\n      return -1;\n\n    if ( c1->encoding > c2->encoding )\n      return 1;\n\n    return 0;\n  }\n\n\n  static FT_Error\n  bdf_create_property( char*        name,\n                       int          format,\n                       bdf_font_t*  font )\n  {\n    size_t           n;\n    bdf_property_t*  p;\n    FT_Memory        memory = font->memory;\n    FT_Error         error  = FT_Err_Ok;\n\n\n    /* First check whether the property has        */\n    /* already been added or not.  If it has, then */\n    /* simply ignore it.                           */\n    if ( hash_lookup( name, &(font->proptbl) ) )\n      goto Exit;\n\n    if ( FT_RENEW_ARRAY( font->user_props,\n                         font->nuser_props,\n                         font->nuser_props + 1 ) )\n      goto Exit;\n\n    p = font->user_props + font->nuser_props;\n    FT_ZERO( p );\n\n    n = ft_strlen( name ) + 1;\n    if ( n > FT_ULONG_MAX )\n      return FT_THROW( Invalid_Argument );\n\n    if ( FT_NEW_ARRAY( p->name, n ) )\n      goto Exit;\n\n    FT_MEM_COPY( (char *)p->name, name, n );\n\n    p->format  = format;\n    p->builtin = 0;\n\n    n = _num_bdf_properties + font->nuser_props;\n\n    error = hash_insert( p->name, n, &(font->proptbl), memory );\n    if ( error )\n      goto Exit;\n\n    font->nuser_props++;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( bdf_property_t * )\n  bdf_get_property( char*        name,\n                    bdf_font_t*  font )\n  {\n    hashnode  hn;\n    size_t    propid;\n\n\n    if ( name == 0 || *name == 0 )\n      return 0;\n\n    if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 )\n      return 0;\n\n    propid = hn->data;\n    if ( propid >= _num_bdf_properties )\n      return font->user_props + ( propid - _num_bdf_properties );\n\n    return (bdf_property_t*)_bdf_properties + propid;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* BDF font file parsing flags and functions.                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* Parse flags. */\n\n#define _BDF_START      0x0001\n#define _BDF_FONT_NAME  0x0002\n#define _BDF_SIZE       0x0004\n#define _BDF_FONT_BBX   0x0008\n#define _BDF_PROPS      0x0010\n#define _BDF_GLYPHS     0x0020\n#define _BDF_GLYPH      0x0040\n#define _BDF_ENCODING   0x0080\n#define _BDF_SWIDTH     0x0100\n#define _BDF_DWIDTH     0x0200\n#define _BDF_BBX        0x0400\n#define _BDF_BITMAP     0x0800\n\n#define _BDF_SWIDTH_ADJ  0x1000\n\n#define _BDF_GLYPH_BITS ( _BDF_GLYPH    | \\\n                          _BDF_ENCODING | \\\n                          _BDF_SWIDTH   | \\\n                          _BDF_DWIDTH   | \\\n                          _BDF_BBX      | \\\n                          _BDF_BITMAP   )\n\n#define _BDF_GLYPH_WIDTH_CHECK   0x40000000UL\n#define _BDF_GLYPH_HEIGHT_CHECK  0x80000000UL\n\n\n  static FT_Error\n  _bdf_add_comment( bdf_font_t*    font,\n                    char*          comment,\n                    unsigned long  len )\n  {\n    char*      cp;\n    FT_Memory  memory = font->memory;\n    FT_Error   error  = FT_Err_Ok;\n\n\n    if ( FT_RENEW_ARRAY( font->comments,\n                         font->comments_len,\n                         font->comments_len + len + 1 ) )\n      goto Exit;\n\n    cp = font->comments + font->comments_len;\n\n    FT_MEM_COPY( cp, comment, len );\n    cp[len] = '\\n';\n\n    font->comments_len += len + 1;\n\n  Exit:\n    return error;\n  }\n\n\n  /* Set the spacing from the font name if it exists, or set it to the */\n  /* default specified in the options.                                 */\n  static FT_Error\n  _bdf_set_default_spacing( bdf_font_t*     font,\n                            bdf_options_t*  opts,\n                            unsigned long   lineno )\n  {\n    size_t       len;\n    char         name[256];\n    _bdf_list_t  list;\n    FT_Memory    memory;\n    FT_Error     error = FT_Err_Ok;\n\n\n    if ( font == 0 || font->name == 0 || font->name[0] == 0 )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    memory = font->memory;\n\n    _bdf_list_init( &list, memory );\n\n    font->spacing = opts->font_spacing;\n\n    len = ft_strlen( font->name ) + 1;\n    /* Limit ourselves to 256 characters in the font name. */\n    if ( len >= 256 )\n    {\n      FT_ERROR(( \"_bdf_set_default_spacing: \" ERRMSG7, lineno ));\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_MEM_COPY( name, font->name, len );\n\n    error = _bdf_list_split( &list, (char *)\"-\", name, len );\n    if ( error )\n      goto Fail;\n\n    if ( list.used == 15 )\n    {\n      switch ( list.field[11][0] )\n      {\n      case 'C':\n      case 'c':\n        font->spacing = BDF_CHARCELL;\n        break;\n      case 'M':\n      case 'm':\n        font->spacing = BDF_MONOWIDTH;\n        break;\n      case 'P':\n      case 'p':\n        font->spacing = BDF_PROPORTIONAL;\n        break;\n      }\n    }\n\n  Fail:\n    _bdf_list_done( &list );\n\n  Exit:\n    return error;\n  }\n\n\n  /* Determine whether the property is an atom or not.  If it is, then */\n  /* clean it up so the double quotes are removed if they exist.       */\n  static int\n  _bdf_is_atom( char*          line,\n                unsigned long  linelen,\n                char**         name,\n                char**         value,\n                bdf_font_t*    font )\n  {\n    int              hold;\n    char             *sp, *ep;\n    bdf_property_t*  p;\n\n\n    *name = sp = ep = line;\n\n    while ( *ep && *ep != ' ' && *ep != '\\t' )\n      ep++;\n\n    hold = -1;\n    if ( *ep )\n    {\n      hold = *ep;\n      *ep  = 0;\n    }\n\n    p = bdf_get_property( sp, font );\n\n    /* Restore the character that was saved before any return can happen. */\n    if ( hold != -1 )\n      *ep = (char)hold;\n\n    /* If the property exists and is not an atom, just return here. */\n    if ( p && p->format != BDF_ATOM )\n      return 0;\n\n    /* The property is an atom.  Trim all leading and trailing whitespace */\n    /* and double quotes for the atom value.                              */\n    sp = ep;\n    ep = line + linelen;\n\n    /* Trim the leading whitespace if it exists. */\n    if ( *sp )\n      *sp++ = 0;\n    while ( *sp                           &&\n            ( *sp == ' ' || *sp == '\\t' ) )\n      sp++;\n\n    /* Trim the leading double quote if it exists. */\n    if ( *sp == '\"' )\n      sp++;\n    *value = sp;\n\n    /* Trim the trailing whitespace if it exists. */\n    while ( ep > sp                                       &&\n            ( *( ep - 1 ) == ' ' || *( ep - 1 ) == '\\t' ) )\n      *--ep = 0;\n\n    /* Trim the trailing double quote if it exists. */\n    if ( ep > sp && *( ep - 1 ) == '\"' )\n      *--ep = 0;\n\n    return 1;\n  }\n\n\n  static FT_Error\n  _bdf_add_property( bdf_font_t*    font,\n                     char*          name,\n                     char*          value,\n                     unsigned long  lineno )\n  {\n    size_t          propid;\n    hashnode        hn;\n    bdf_property_t  *prop, *fp;\n    FT_Memory       memory = font->memory;\n    FT_Error        error  = FT_Err_Ok;\n\n\n    /* First, check whether the property already exists in the font. */\n    if ( ( hn = hash_lookup( name, (hashtable *)font->internal ) ) != 0 )\n    {\n      /* The property already exists in the font, so simply replace */\n      /* the value of the property with the current value.          */\n      fp = font->props + hn->data;\n\n      switch ( fp->format )\n      {\n      case BDF_ATOM:\n        /* Delete the current atom if it exists. */\n        FT_FREE( fp->value.atom );\n\n        if ( value && value[0] != 0 )\n        {\n          if ( FT_STRDUP( fp->value.atom, value ) )\n            goto Exit;\n        }\n        break;\n\n      case BDF_INTEGER:\n        fp->value.l = _bdf_atol( value, 0, 10 );\n        break;\n\n      case BDF_CARDINAL:\n        fp->value.ul = _bdf_atoul( value, 0, 10 );\n        break;\n\n      default:\n        ;\n      }\n\n      goto Exit;\n    }\n\n    /* See whether this property type exists yet or not. */\n    /* If not, create it.                                */\n    hn = hash_lookup( name, &(font->proptbl) );\n    if ( hn == 0 )\n    {\n      error = bdf_create_property( name, BDF_ATOM, font );\n      if ( error )\n        goto Exit;\n      hn = hash_lookup( name, &(font->proptbl) );\n    }\n\n    /* Allocate another property if this is overflow. */\n    if ( font->props_used == font->props_size )\n    {\n      if ( font->props_size == 0 )\n      {\n        if ( FT_NEW_ARRAY( font->props, 1 ) )\n          goto Exit;\n      }\n      else\n      {\n        if ( FT_RENEW_ARRAY( font->props,\n                             font->props_size,\n                             font->props_size + 1 ) )\n          goto Exit;\n      }\n\n      fp = font->props + font->props_size;\n      FT_MEM_ZERO( fp, sizeof ( bdf_property_t ) );\n      font->props_size++;\n    }\n\n    propid = hn->data;\n    if ( propid >= _num_bdf_properties )\n      prop = font->user_props + ( propid - _num_bdf_properties );\n    else\n      prop = (bdf_property_t*)_bdf_properties + propid;\n\n    fp = font->props + font->props_used;\n\n    fp->name    = prop->name;\n    fp->format  = prop->format;\n    fp->builtin = prop->builtin;\n\n    switch ( prop->format )\n    {\n    case BDF_ATOM:\n      fp->value.atom = 0;\n      if ( value != 0 && value[0] )\n      {\n        if ( FT_STRDUP( fp->value.atom, value ) )\n          goto Exit;\n      }\n      break;\n\n    case BDF_INTEGER:\n      fp->value.l = _bdf_atol( value, 0, 10 );\n      break;\n\n    case BDF_CARDINAL:\n      fp->value.ul = _bdf_atoul( value, 0, 10 );\n      break;\n    }\n\n    /* If the property happens to be a comment, then it doesn't need */\n    /* to be added to the internal hash table.                       */\n    if ( ft_memcmp( name, \"COMMENT\", 7 ) != 0 )\n    {\n      /* Add the property to the font property table. */\n      error = hash_insert( fp->name,\n                           font->props_used,\n                           (hashtable *)font->internal,\n                           memory );\n      if ( error )\n        goto Exit;\n    }\n\n    font->props_used++;\n\n    /* Some special cases need to be handled here.  The DEFAULT_CHAR       */\n    /* property needs to be located if it exists in the property list, the */\n    /* FONT_ASCENT and FONT_DESCENT need to be assigned if they are        */\n    /* present, and the SPACING property should override the default       */\n    /* spacing.                                                            */\n    if ( ft_memcmp( name, \"DEFAULT_CHAR\", 12 ) == 0 )\n      font->default_char = fp->value.l;\n    else if ( ft_memcmp( name, \"FONT_ASCENT\", 11 ) == 0 )\n      font->font_ascent = fp->value.l;\n    else if ( ft_memcmp( name, \"FONT_DESCENT\", 12 ) == 0 )\n      font->font_descent = fp->value.l;\n    else if ( ft_memcmp( name, \"SPACING\", 7 ) == 0 )\n    {\n      if ( !fp->value.atom )\n      {\n        FT_ERROR(( \"_bdf_add_property: \" ERRMSG8, lineno, \"SPACING\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      if ( fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P' )\n        font->spacing = BDF_PROPORTIONAL;\n      else if ( fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M' )\n        font->spacing = BDF_MONOWIDTH;\n      else if ( fp->value.atom[0] == 'c' || fp->value.atom[0] == 'C' )\n        font->spacing = BDF_CHARCELL;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static const unsigned char nibble_mask[8] =\n  {\n    0xFF, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE\n  };\n\n\n  /* Actually parse the glyph info and bitmaps. */\n  static FT_Error\n  _bdf_parse_glyphs( char*          line,\n                     unsigned long  linelen,\n                     unsigned long  lineno,\n                     void*          call_data,\n                     void*          client_data )\n  {\n    int                c, mask_index;\n    char*              s;\n    unsigned char*     bp;\n    unsigned long      i, slen, nibbles;\n\n    _bdf_parse_t*      p;\n    bdf_glyph_t*       glyph;\n    bdf_font_t*        font;\n\n    FT_Memory          memory;\n    FT_Error           error = FT_Err_Ok;\n\n    FT_UNUSED( call_data );\n    FT_UNUSED( lineno );        /* only used in debug mode */\n\n\n    p = (_bdf_parse_t *)client_data;\n\n    font   = p->font;\n    memory = font->memory;\n\n    /* Check for a comment. */\n    if ( ft_memcmp( line, \"COMMENT\", 7 ) == 0 )\n    {\n      linelen -= 7;\n\n      s = line + 7;\n      if ( *s != 0 )\n      {\n        s++;\n        linelen--;\n      }\n      error = _bdf_add_comment( p->font, s, linelen );\n      goto Exit;\n    }\n\n    /* The very first thing expected is the number of glyphs. */\n    if ( !( p->flags & _BDF_GLYPHS ) )\n    {\n      if ( ft_memcmp( line, \"CHARS\", 5 ) != 0 )\n      {\n        FT_ERROR(( \"_bdf_parse_glyphs: \" ERRMSG1, lineno, \"CHARS\" ));\n        error = FT_THROW( Missing_Chars_Field );\n        goto Exit;\n      }\n\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n      p->cnt = font->glyphs_size = _bdf_atoul( p->list.field[1], 0, 10 );\n\n      /* Make sure the number of glyphs is non-zero. */\n      if ( p->cnt == 0 )\n        font->glyphs_size = 64;\n\n      /* Limit ourselves to 1,114,112 glyphs in the font (this is the */\n      /* number of code points available in Unicode).                 */\n      if ( p->cnt >= 0x110000UL )\n      {\n        FT_ERROR(( \"_bdf_parse_glyphs: \" ERRMSG5, lineno, \"CHARS\" ));\n        error = FT_THROW( Invalid_Argument );\n        goto Exit;\n      }\n\n      if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) )\n        goto Exit;\n\n      p->flags |= _BDF_GLYPHS;\n\n      goto Exit;\n    }\n\n    /* Check for the ENDFONT field. */\n    if ( ft_memcmp( line, \"ENDFONT\", 7 ) == 0 )\n    {\n      /* Sort the glyphs by encoding. */\n      ft_qsort( (char *)font->glyphs,\n                font->glyphs_used,\n                sizeof ( bdf_glyph_t ),\n                by_encoding );\n\n      p->flags &= ~_BDF_START;\n\n      goto Exit;\n    }\n\n    /* Check for the ENDCHAR field. */\n    if ( ft_memcmp( line, \"ENDCHAR\", 7 ) == 0 )\n    {\n      p->glyph_enc = 0;\n      p->flags    &= ~_BDF_GLYPH_BITS;\n\n      goto Exit;\n    }\n\n    /* Check whether a glyph is being scanned but should be */\n    /* ignored because it is an unencoded glyph.            */\n    if ( ( p->flags & _BDF_GLYPH )     &&\n         p->glyph_enc            == -1 &&\n         p->opts->keep_unencoded == 0  )\n      goto Exit;\n\n    /* Check for the STARTCHAR field. */\n    if ( ft_memcmp( line, \"STARTCHAR\", 9 ) == 0 )\n    {\n      /* Set the character name in the parse info first until the */\n      /* encoding can be checked for an unencoded character.      */\n      FT_FREE( p->glyph_name );\n\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n\n      _bdf_list_shift( &p->list, 1 );\n\n      s = _bdf_list_join( &p->list, ' ', &slen );\n\n      if ( !s )\n      {\n        FT_ERROR(( \"_bdf_parse_glyphs: \" ERRMSG8, lineno, \"STARTCHAR\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      if ( FT_NEW_ARRAY( p->glyph_name, slen + 1 ) )\n        goto Exit;\n\n      FT_MEM_COPY( p->glyph_name, s, slen + 1 );\n\n      p->flags |= _BDF_GLYPH;\n\n      FT_TRACE4(( DBGMSG1, lineno, s ));\n\n      goto Exit;\n    }\n\n    /* Check for the ENCODING field. */\n    if ( ft_memcmp( line, \"ENCODING\", 8 ) == 0 )\n    {\n      if ( !( p->flags & _BDF_GLYPH ) )\n      {\n        /* Missing STARTCHAR field. */\n        FT_ERROR(( \"_bdf_parse_glyphs: \" ERRMSG1, lineno, \"STARTCHAR\" ));\n        error = FT_THROW( Missing_Startchar_Field );\n        goto Exit;\n      }\n\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n\n      p->glyph_enc = _bdf_atol( p->list.field[1], 0, 10 );\n\n      /* Normalize negative encoding values.  The specification only */\n      /* allows -1, but we can be more generous here.                */\n      if ( p->glyph_enc < -1 )\n        p->glyph_enc = -1;\n\n      /* Check for alternative encoding format. */\n      if ( p->glyph_enc == -1 && p->list.used > 2 )\n        p->glyph_enc = _bdf_atol( p->list.field[2], 0, 10 );\n\n      if ( p->glyph_enc < -1 )\n        p->glyph_enc = -1;\n\n      FT_TRACE4(( DBGMSG2, p->glyph_enc ));\n\n      /* Check that the encoding is in the Unicode range because  */\n      /* otherwise p->have (a bitmap with static size) overflows. */\n      if ( p->glyph_enc > 0                                      &&\n           (size_t)p->glyph_enc >= sizeof ( p->have ) /\n                                   sizeof ( unsigned long ) * 32 )\n      {\n        FT_ERROR(( \"_bdf_parse_glyphs: \" ERRMSG5, lineno, \"ENCODING\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      /* Check whether this encoding has already been encountered. */\n      /* If it has then change it to unencoded so it gets added if */\n      /* indicated.                                                */\n      if ( p->glyph_enc >= 0 )\n      {\n        if ( _bdf_glyph_modified( p->have, p->glyph_enc ) )\n        {\n          /* Emit a message saying a glyph has been moved to the */\n          /* unencoded area.                                     */\n          FT_TRACE2(( \"_bdf_parse_glyphs: \" ACMSG12,\n                      p->glyph_enc, p->glyph_name ));\n          p->glyph_enc = -1;\n          font->modified = 1;\n        }\n        else\n          _bdf_set_glyph_modified( p->have, p->glyph_enc );\n      }\n\n      if ( p->glyph_enc >= 0 )\n      {\n        /* Make sure there are enough glyphs allocated in case the */\n        /* number of characters happen to be wrong.                */\n        if ( font->glyphs_used == font->glyphs_size )\n        {\n          if ( FT_RENEW_ARRAY( font->glyphs,\n                               font->glyphs_size,\n                               font->glyphs_size + 64 ) )\n            goto Exit;\n\n          font->glyphs_size += 64;\n        }\n\n        glyph           = font->glyphs + font->glyphs_used++;\n        glyph->name     = p->glyph_name;\n        glyph->encoding = p->glyph_enc;\n\n        /* Reset the initial glyph info. */\n        p->glyph_name = 0;\n      }\n      else\n      {\n        /* Unencoded glyph.  Check whether it should */\n        /* be added or not.                          */\n        if ( p->opts->keep_unencoded != 0 )\n        {\n          /* Allocate the next unencoded glyph. */\n          if ( font->unencoded_used == font->unencoded_size )\n          {\n            if ( FT_RENEW_ARRAY( font->unencoded ,\n                                 font->unencoded_size,\n                                 font->unencoded_size + 4 ) )\n              goto Exit;\n\n            font->unencoded_size += 4;\n          }\n\n          glyph           = font->unencoded + font->unencoded_used;\n          glyph->name     = p->glyph_name;\n          glyph->encoding = font->unencoded_used++;\n        }\n        else\n          /* Free up the glyph name if the unencoded shouldn't be */\n          /* kept.                                                */\n          FT_FREE( p->glyph_name );\n\n        p->glyph_name = 0;\n      }\n\n      /* Clear the flags that might be added when width and height are */\n      /* checked for consistency.                                      */\n      p->flags &= ~( _BDF_GLYPH_WIDTH_CHECK | _BDF_GLYPH_HEIGHT_CHECK );\n\n      p->flags |= _BDF_ENCODING;\n\n      goto Exit;\n    }\n\n    /* Point at the glyph being constructed. */\n    if ( p->glyph_enc == -1 )\n      glyph = font->unencoded + ( font->unencoded_used - 1 );\n    else\n      glyph = font->glyphs + ( font->glyphs_used - 1 );\n\n    /* Check whether a bitmap is being constructed. */\n    if ( p->flags & _BDF_BITMAP )\n    {\n      /* If there are more rows than are specified in the glyph metrics, */\n      /* ignore the remaining lines.                                     */\n      if ( p->row >= (unsigned long)glyph->bbx.height )\n      {\n        if ( !( p->flags & _BDF_GLYPH_HEIGHT_CHECK ) )\n        {\n          FT_TRACE2(( \"_bdf_parse_glyphs: \" ACMSG13, glyph->encoding ));\n          p->flags |= _BDF_GLYPH_HEIGHT_CHECK;\n          font->modified = 1;\n        }\n\n        goto Exit;\n      }\n\n      /* Only collect the number of nibbles indicated by the glyph     */\n      /* metrics.  If there are more columns, they are simply ignored. */\n      nibbles = glyph->bpr << 1;\n      bp      = glyph->bitmap + p->row * glyph->bpr;\n\n      for ( i = 0; i < nibbles; i++ )\n      {\n        c = line[i];\n        if ( !sbitset( hdigits, c ) )\n          break;\n        *bp = (FT_Byte)( ( *bp << 4 ) + a2i[c] );\n        if ( i + 1 < nibbles && ( i & 1 ) )\n          *++bp = 0;\n      }\n\n      /* If any line has not enough columns,            */\n      /* indicate they have been padded with zero bits. */\n      if ( i < nibbles                            &&\n           !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) )\n      {\n        FT_TRACE2(( \"_bdf_parse_glyphs: \" ACMSG16, glyph->encoding ));\n        p->flags       |= _BDF_GLYPH_WIDTH_CHECK;\n        font->modified  = 1;\n      }\n\n      /* Remove possible garbage at the right. */\n      mask_index = ( glyph->bbx.width * p->font->bpp ) & 7;\n      if ( glyph->bbx.width )\n        *bp &= nibble_mask[mask_index];\n\n      /* If any line has extra columns, indicate they have been removed. */\n      if ( i == nibbles                           &&\n           sbitset( hdigits, line[nibbles] )      &&\n           !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) )\n      {\n        FT_TRACE2(( \"_bdf_parse_glyphs: \" ACMSG14, glyph->encoding ));\n        p->flags       |= _BDF_GLYPH_WIDTH_CHECK;\n        font->modified  = 1;\n      }\n\n      p->row++;\n      goto Exit;\n    }\n\n    /* Expect the SWIDTH (scalable width) field next. */\n    if ( ft_memcmp( line, \"SWIDTH\", 6 ) == 0 )\n    {\n      if ( !( p->flags & _BDF_ENCODING ) )\n        goto Missing_Encoding;\n\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n\n      glyph->swidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 );\n      p->flags |= _BDF_SWIDTH;\n\n      goto Exit;\n    }\n\n    /* Expect the DWIDTH (scalable width) field next. */\n    if ( ft_memcmp( line, \"DWIDTH\", 6 ) == 0 )\n    {\n      if ( !( p->flags & _BDF_ENCODING ) )\n        goto Missing_Encoding;\n\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n\n      glyph->dwidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 );\n\n      if ( !( p->flags & _BDF_SWIDTH ) )\n      {\n        /* Missing SWIDTH field.  Emit an auto correction message and set */\n        /* the scalable width from the device width.                      */\n        FT_TRACE2(( \"_bdf_parse_glyphs: \" ACMSG9, lineno ));\n\n        glyph->swidth = (unsigned short)FT_MulDiv(\n                          glyph->dwidth, 72000L,\n                          (FT_Long)( font->point_size *\n                                     font->resolution_x ) );\n      }\n\n      p->flags |= _BDF_DWIDTH;\n      goto Exit;\n    }\n\n    /* Expect the BBX field next. */\n    if ( ft_memcmp( line, \"BBX\", 3 ) == 0 )\n    {\n      if ( !( p->flags & _BDF_ENCODING ) )\n        goto Missing_Encoding;\n\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n\n      glyph->bbx.width    = _bdf_atos( p->list.field[1], 0, 10 );\n      glyph->bbx.height   = _bdf_atos( p->list.field[2], 0, 10 );\n      glyph->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 );\n      glyph->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 );\n\n      /* Generate the ascent and descent of the character. */\n      glyph->bbx.ascent  = (short)( glyph->bbx.height + glyph->bbx.y_offset );\n      glyph->bbx.descent = (short)( -glyph->bbx.y_offset );\n\n      /* Determine the overall font bounding box as the characters are */\n      /* loaded so corrections can be done later if indicated.         */\n      p->maxas    = (short)FT_MAX( glyph->bbx.ascent, p->maxas );\n      p->maxds    = (short)FT_MAX( glyph->bbx.descent, p->maxds );\n\n      p->rbearing = (short)( glyph->bbx.width + glyph->bbx.x_offset );\n\n      p->maxrb    = (short)FT_MAX( p->rbearing, p->maxrb );\n      p->minlb    = (short)FT_MIN( glyph->bbx.x_offset, p->minlb );\n      p->maxlb    = (short)FT_MAX( glyph->bbx.x_offset, p->maxlb );\n\n      if ( !( p->flags & _BDF_DWIDTH ) )\n      {\n        /* Missing DWIDTH field.  Emit an auto correction message and set */\n        /* the device width to the glyph width.                           */\n        FT_TRACE2(( \"_bdf_parse_glyphs: \" ACMSG10, lineno ));\n        glyph->dwidth = glyph->bbx.width;\n      }\n\n      /* If the BDF_CORRECT_METRICS flag is set, then adjust the SWIDTH */\n      /* value if necessary.                                            */\n      if ( p->opts->correct_metrics != 0 )\n      {\n        /* Determine the point size of the glyph. */\n        unsigned short  sw = (unsigned short)FT_MulDiv(\n                               glyph->dwidth, 72000L,\n                               (FT_Long)( font->point_size *\n                                          font->resolution_x ) );\n\n\n        if ( sw != glyph->swidth )\n        {\n          glyph->swidth = sw;\n\n          if ( p->glyph_enc == -1 )\n            _bdf_set_glyph_modified( font->umod,\n                                     font->unencoded_used - 1 );\n          else\n            _bdf_set_glyph_modified( font->nmod, glyph->encoding );\n\n          p->flags       |= _BDF_SWIDTH_ADJ;\n          font->modified  = 1;\n        }\n      }\n\n      p->flags |= _BDF_BBX;\n      goto Exit;\n    }\n\n    /* And finally, gather up the bitmap. */\n    if ( ft_memcmp( line, \"BITMAP\", 6 ) == 0 )\n    {\n      unsigned long  bitmap_size;\n\n\n      if ( !( p->flags & _BDF_BBX ) )\n      {\n        /* Missing BBX field. */\n        FT_ERROR(( \"_bdf_parse_glyphs: \" ERRMSG1, lineno, \"BBX\" ));\n        error = FT_THROW( Missing_Bbx_Field );\n        goto Exit;\n      }\n\n      /* Allocate enough space for the bitmap. */\n      glyph->bpr = ( glyph->bbx.width * p->font->bpp + 7 ) >> 3;\n\n      bitmap_size = glyph->bpr * glyph->bbx.height;\n      if ( glyph->bpr > 0xFFFFU || bitmap_size > 0xFFFFU )\n      {\n        FT_ERROR(( \"_bdf_parse_glyphs: \" ERRMSG4, lineno ));\n        error = FT_THROW( Bbx_Too_Big );\n        goto Exit;\n      }\n      else\n        glyph->bytes = (unsigned short)bitmap_size;\n\n      if ( FT_NEW_ARRAY( glyph->bitmap, glyph->bytes ) )\n        goto Exit;\n\n      p->row    = 0;\n      p->flags |= _BDF_BITMAP;\n\n      goto Exit;\n    }\n\n    FT_ERROR(( \"_bdf_parse_glyphs: \" ERRMSG9, lineno ));\n    error = FT_THROW( Invalid_File_Format );\n    goto Exit;\n\n  Missing_Encoding:\n    /* Missing ENCODING field. */\n    FT_ERROR(( \"_bdf_parse_glyphs: \" ERRMSG1, lineno, \"ENCODING\" ));\n    error = FT_THROW( Missing_Encoding_Field );\n\n  Exit:\n    if ( error && ( p->flags & _BDF_GLYPH ) )\n      FT_FREE( p->glyph_name );\n\n    return error;\n  }\n\n\n  /* Load the font properties. */\n  static FT_Error\n  _bdf_parse_properties( char*          line,\n                         unsigned long  linelen,\n                         unsigned long  lineno,\n                         void*          call_data,\n                         void*          client_data )\n  {\n    unsigned long      vlen;\n    _bdf_line_func_t*  next;\n    _bdf_parse_t*      p;\n    char*              name;\n    char*              value;\n    char               nbuf[128];\n    FT_Error           error = FT_Err_Ok;\n\n    FT_UNUSED( lineno );\n\n\n    next = (_bdf_line_func_t *)call_data;\n    p    = (_bdf_parse_t *)    client_data;\n\n    /* Check for the end of the properties. */\n    if ( ft_memcmp( line, \"ENDPROPERTIES\", 13 ) == 0 )\n    {\n      /* If the FONT_ASCENT or FONT_DESCENT properties have not been      */\n      /* encountered yet, then make sure they are added as properties and */\n      /* make sure they are set from the font bounding box info.          */\n      /*                                                                  */\n      /* This is *always* done regardless of the options, because X11     */\n      /* requires these two fields to compile fonts.                      */\n      if ( bdf_get_font_property( p->font, \"FONT_ASCENT\" ) == 0 )\n      {\n        p->font->font_ascent = p->font->bbx.ascent;\n        ft_sprintf( nbuf, \"%hd\", p->font->bbx.ascent );\n        error = _bdf_add_property( p->font, (char *)\"FONT_ASCENT\",\n                                   nbuf, lineno );\n        if ( error )\n          goto Exit;\n\n        FT_TRACE2(( \"_bdf_parse_properties: \" ACMSG1, p->font->bbx.ascent ));\n        p->font->modified = 1;\n      }\n\n      if ( bdf_get_font_property( p->font, \"FONT_DESCENT\" ) == 0 )\n      {\n        p->font->font_descent = p->font->bbx.descent;\n        ft_sprintf( nbuf, \"%hd\", p->font->bbx.descent );\n        error = _bdf_add_property( p->font, (char *)\"FONT_DESCENT\",\n                                   nbuf, lineno );\n        if ( error )\n          goto Exit;\n\n        FT_TRACE2(( \"_bdf_parse_properties: \" ACMSG2, p->font->bbx.descent ));\n        p->font->modified = 1;\n      }\n\n      p->flags &= ~_BDF_PROPS;\n      *next     = _bdf_parse_glyphs;\n\n      goto Exit;\n    }\n\n    /* Ignore the _XFREE86_GLYPH_RANGES properties. */\n    if ( ft_memcmp( line, \"_XFREE86_GLYPH_RANGES\", 21 ) == 0 )\n      goto Exit;\n\n    /* Handle COMMENT fields and properties in a special way to preserve */\n    /* the spacing.                                                      */\n    if ( ft_memcmp( line, \"COMMENT\", 7 ) == 0 )\n    {\n      name = value = line;\n      value += 7;\n      if ( *value )\n        *value++ = 0;\n      error = _bdf_add_property( p->font, name, value, lineno );\n      if ( error )\n        goto Exit;\n    }\n    else if ( _bdf_is_atom( line, linelen, &name, &value, p->font ) )\n    {\n      error = _bdf_add_property( p->font, name, value, lineno );\n      if ( error )\n        goto Exit;\n    }\n    else\n    {\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n      name = p->list.field[0];\n\n      _bdf_list_shift( &p->list, 1 );\n      value = _bdf_list_join( &p->list, ' ', &vlen );\n\n      error = _bdf_add_property( p->font, name, value, lineno );\n      if ( error )\n        goto Exit;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* Load the font header. */\n  static FT_Error\n  _bdf_parse_start( char*          line,\n                    unsigned long  linelen,\n                    unsigned long  lineno,\n                    void*          call_data,\n                    void*          client_data )\n  {\n    unsigned long      slen;\n    _bdf_line_func_t*  next;\n    _bdf_parse_t*      p;\n    bdf_font_t*        font;\n    char               *s;\n\n    FT_Memory          memory = NULL;\n    FT_Error           error  = FT_Err_Ok;\n\n    FT_UNUSED( lineno );            /* only used in debug mode */\n\n\n    next = (_bdf_line_func_t *)call_data;\n    p    = (_bdf_parse_t *)    client_data;\n\n    if ( p->font )\n      memory = p->font->memory;\n\n    /* Check for a comment.  This is done to handle those fonts that have */\n    /* comments before the STARTFONT line for some reason.                */\n    if ( ft_memcmp( line, \"COMMENT\", 7 ) == 0 )\n    {\n      if ( p->opts->keep_comments != 0 && p->font != 0 )\n      {\n        linelen -= 7;\n\n        s = line + 7;\n        if ( *s != 0 )\n        {\n          s++;\n          linelen--;\n        }\n\n        error = _bdf_add_comment( p->font, s, linelen );\n        if ( error )\n          goto Exit;\n        /* here font is not defined! */\n      }\n\n      goto Exit;\n    }\n\n    if ( !( p->flags & _BDF_START ) )\n    {\n      memory = p->memory;\n\n      if ( ft_memcmp( line, \"STARTFONT\", 9 ) != 0 )\n      {\n        /* we don't emit an error message since this code gets */\n        /* explicitly caught one level higher                  */\n        error = FT_THROW( Missing_Startfont_Field );\n        goto Exit;\n      }\n\n      p->flags = _BDF_START;\n      font = p->font = 0;\n\n      if ( FT_NEW( font ) )\n        goto Exit;\n      p->font = font;\n\n      font->memory = p->memory;\n      p->memory    = 0;\n\n      { /* setup */\n        size_t           i;\n        bdf_property_t*  prop;\n\n\n        error = hash_init( &(font->proptbl), memory );\n        if ( error )\n          goto Exit;\n        for ( i = 0, prop = (bdf_property_t*)_bdf_properties;\n              i < _num_bdf_properties; i++, prop++ )\n        {\n          error = hash_insert( prop->name, i,\n                               &(font->proptbl), memory );\n          if ( error )\n            goto Exit;\n        }\n      }\n\n      if ( FT_ALLOC( p->font->internal, sizeof ( hashtable ) ) )\n        goto Exit;\n      error = hash_init( (hashtable *)p->font->internal,memory );\n      if ( error )\n        goto Exit;\n      p->font->spacing      = p->opts->font_spacing;\n      p->font->default_char = -1;\n\n      goto Exit;\n    }\n\n    /* Check for the start of the properties. */\n    if ( ft_memcmp( line, \"STARTPROPERTIES\", 15 ) == 0 )\n    {\n      if ( !( p->flags & _BDF_FONT_BBX ) )\n      {\n        /* Missing the FONTBOUNDINGBOX field. */\n        FT_ERROR(( \"_bdf_parse_start: \" ERRMSG1, lineno, \"FONTBOUNDINGBOX\" ));\n        error = FT_THROW( Missing_Fontboundingbox_Field );\n        goto Exit;\n      }\n\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n      /* at this point, `p->font' can't be NULL */\n      p->cnt = p->font->props_size = _bdf_atoul( p->list.field[1], 0, 10 );\n\n      if ( FT_NEW_ARRAY( p->font->props, p->cnt ) )\n      {\n        p->font->props_size = 0;\n        goto Exit;\n      }\n\n      p->flags |= _BDF_PROPS;\n      *next     = _bdf_parse_properties;\n\n      goto Exit;\n    }\n\n    /* Check for the FONTBOUNDINGBOX field. */\n    if ( ft_memcmp( line, \"FONTBOUNDINGBOX\", 15 ) == 0 )\n    {\n      if ( !( p->flags & _BDF_SIZE ) )\n      {\n        /* Missing the SIZE field. */\n        FT_ERROR(( \"_bdf_parse_start: \" ERRMSG1, lineno, \"SIZE\" ));\n        error = FT_THROW( Missing_Size_Field );\n        goto Exit;\n      }\n\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n\n      p->font->bbx.width  = _bdf_atos( p->list.field[1], 0, 10 );\n      p->font->bbx.height = _bdf_atos( p->list.field[2], 0, 10 );\n\n      p->font->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 );\n      p->font->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 );\n\n      p->font->bbx.ascent  = (short)( p->font->bbx.height +\n                                      p->font->bbx.y_offset );\n\n      p->font->bbx.descent = (short)( -p->font->bbx.y_offset );\n\n      p->flags |= _BDF_FONT_BBX;\n\n      goto Exit;\n    }\n\n    /* The next thing to check for is the FONT field. */\n    if ( ft_memcmp( line, \"FONT\", 4 ) == 0 )\n    {\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n      _bdf_list_shift( &p->list, 1 );\n\n      s = _bdf_list_join( &p->list, ' ', &slen );\n\n      if ( !s )\n      {\n        FT_ERROR(( \"_bdf_parse_start: \" ERRMSG8, lineno, \"FONT\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      /* Allowing multiple `FONT' lines (which is invalid) doesn't hurt... */\n      FT_FREE( p->font->name );\n\n      if ( FT_NEW_ARRAY( p->font->name, slen + 1 ) )\n        goto Exit;\n      FT_MEM_COPY( p->font->name, s, slen + 1 );\n\n      /* If the font name is an XLFD name, set the spacing to the one in  */\n      /* the font name.  If there is no spacing fall back on the default. */\n      error = _bdf_set_default_spacing( p->font, p->opts, lineno );\n      if ( error )\n        goto Exit;\n\n      p->flags |= _BDF_FONT_NAME;\n\n      goto Exit;\n    }\n\n    /* Check for the SIZE field. */\n    if ( ft_memcmp( line, \"SIZE\", 4 ) == 0 )\n    {\n      if ( !( p->flags & _BDF_FONT_NAME ) )\n      {\n        /* Missing the FONT field. */\n        FT_ERROR(( \"_bdf_parse_start: \" ERRMSG1, lineno, \"FONT\" ));\n        error = FT_THROW( Missing_Font_Field );\n        goto Exit;\n      }\n\n      error = _bdf_list_split( &p->list, (char *)\" +\", line, linelen );\n      if ( error )\n        goto Exit;\n\n      p->font->point_size   = _bdf_atoul( p->list.field[1], 0, 10 );\n      p->font->resolution_x = _bdf_atoul( p->list.field[2], 0, 10 );\n      p->font->resolution_y = _bdf_atoul( p->list.field[3], 0, 10 );\n\n      /* Check for the bits per pixel field. */\n      if ( p->list.used == 5 )\n      {\n        unsigned short bitcount, i, shift;\n\n\n        p->font->bpp = (unsigned short)_bdf_atos( p->list.field[4], 0, 10 );\n\n        /* Only values 1, 2, 4, 8 are allowed. */\n        shift = p->font->bpp;\n        bitcount = 0;\n        for ( i = 0; shift > 0; i++ )\n        {\n          if ( shift & 1 )\n            bitcount = i;\n          shift >>= 1;\n        }\n\n        shift = (short)( ( bitcount > 3 ) ? 8 : ( 1 << bitcount ) );\n\n        if ( p->font->bpp > shift || p->font->bpp != shift )\n        {\n          /* select next higher value */\n          p->font->bpp = (unsigned short)( shift << 1 );\n          FT_TRACE2(( \"_bdf_parse_start: \" ACMSG11, p->font->bpp ));\n        }\n      }\n      else\n        p->font->bpp = 1;\n\n      p->flags |= _BDF_SIZE;\n\n      goto Exit;\n    }\n\n    /* Check for the CHARS field -- font properties are optional */\n    if ( ft_memcmp( line, \"CHARS\", 5 ) == 0 )\n    {\n      char  nbuf[128];\n\n\n      if ( !( p->flags & _BDF_FONT_BBX ) )\n      {\n        /* Missing the FONTBOUNDINGBOX field. */\n        FT_ERROR(( \"_bdf_parse_start: \" ERRMSG1, lineno, \"FONTBOUNDINGBOX\" ));\n        error = FT_THROW( Missing_Fontboundingbox_Field );\n        goto Exit;\n      }\n\n      /* Add the two standard X11 properties which are required */\n      /* for compiling fonts.                                   */\n      p->font->font_ascent = p->font->bbx.ascent;\n      ft_sprintf( nbuf, \"%hd\", p->font->bbx.ascent );\n      error = _bdf_add_property( p->font, (char *)\"FONT_ASCENT\",\n                                 nbuf, lineno );\n      if ( error )\n        goto Exit;\n      FT_TRACE2(( \"_bdf_parse_properties: \" ACMSG1, p->font->bbx.ascent ));\n\n      p->font->font_descent = p->font->bbx.descent;\n      ft_sprintf( nbuf, \"%hd\", p->font->bbx.descent );\n      error = _bdf_add_property( p->font, (char *)\"FONT_DESCENT\",\n                                 nbuf, lineno );\n      if ( error )\n        goto Exit;\n      FT_TRACE2(( \"_bdf_parse_properties: \" ACMSG2, p->font->bbx.descent ));\n\n      p->font->modified = 1;\n\n      *next = _bdf_parse_glyphs;\n\n      /* A special return value. */\n      error = -1;\n      goto Exit;\n    }\n\n    FT_ERROR(( \"_bdf_parse_start: \" ERRMSG9, lineno ));\n    error = FT_THROW( Invalid_File_Format );\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* API.                                                                  */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  bdf_load_font( FT_Stream       stream,\n                 FT_Memory       extmemory,\n                 bdf_options_t*  opts,\n                 bdf_font_t*    *font )\n  {\n    unsigned long  lineno = 0; /* make compiler happy */\n    _bdf_parse_t   *p     = NULL;\n\n    FT_Memory      memory = extmemory;\n    FT_Error       error  = FT_Err_Ok;\n\n\n    if ( FT_NEW( p ) )\n      goto Exit;\n\n    memory    = NULL;\n    p->opts   = (bdf_options_t*)( ( opts != 0 ) ? opts : &_bdf_opts );\n    p->minlb  = 32767;\n    p->memory = extmemory;  /* only during font creation */\n\n    _bdf_list_init( &p->list, extmemory );\n\n    error = _bdf_readstream( stream, _bdf_parse_start,\n                             (void *)p, &lineno );\n    if ( error )\n      goto Fail;\n\n    if ( p->font != 0 )\n    {\n      /* If the font is not proportional, set the font's monowidth */\n      /* field to the width of the font bounding box.              */\n      memory = p->font->memory;\n\n      if ( p->font->spacing != BDF_PROPORTIONAL )\n        p->font->monowidth = p->font->bbx.width;\n\n      /* If the number of glyphs loaded is not that of the original count, */\n      /* indicate the difference.                                          */\n      if ( p->cnt != p->font->glyphs_used + p->font->unencoded_used )\n      {\n        FT_TRACE2(( \"bdf_load_font: \" ACMSG15, p->cnt,\n                    p->font->glyphs_used + p->font->unencoded_used ));\n        p->font->modified = 1;\n      }\n\n      /* Once the font has been loaded, adjust the overall font metrics if */\n      /* necessary.                                                        */\n      if ( p->opts->correct_metrics != 0 &&\n           ( p->font->glyphs_used > 0 || p->font->unencoded_used > 0 ) )\n      {\n        if ( p->maxrb - p->minlb != p->font->bbx.width )\n        {\n          FT_TRACE2(( \"bdf_load_font: \" ACMSG3,\n                      p->font->bbx.width, p->maxrb - p->minlb ));\n          p->font->bbx.width = (unsigned short)( p->maxrb - p->minlb );\n          p->font->modified  = 1;\n        }\n\n        if ( p->font->bbx.x_offset != p->minlb )\n        {\n          FT_TRACE2(( \"bdf_load_font: \" ACMSG4,\n                      p->font->bbx.x_offset, p->minlb ));\n          p->font->bbx.x_offset = p->minlb;\n          p->font->modified     = 1;\n        }\n\n        if ( p->font->bbx.ascent != p->maxas )\n        {\n          FT_TRACE2(( \"bdf_load_font: \" ACMSG5,\n                      p->font->bbx.ascent, p->maxas ));\n          p->font->bbx.ascent = p->maxas;\n          p->font->modified   = 1;\n        }\n\n        if ( p->font->bbx.descent != p->maxds )\n        {\n          FT_TRACE2(( \"bdf_load_font: \" ACMSG6,\n                      p->font->bbx.descent, p->maxds ));\n          p->font->bbx.descent  = p->maxds;\n          p->font->bbx.y_offset = (short)( -p->maxds );\n          p->font->modified     = 1;\n        }\n\n        if ( p->maxas + p->maxds != p->font->bbx.height )\n        {\n          FT_TRACE2(( \"bdf_load_font: \" ACMSG7,\n                      p->font->bbx.height, p->maxas + p->maxds ));\n          p->font->bbx.height = (unsigned short)( p->maxas + p->maxds );\n        }\n\n        if ( p->flags & _BDF_SWIDTH_ADJ )\n          FT_TRACE2(( \"bdf_load_font: \" ACMSG8 ));\n      }\n    }\n\n    if ( p->flags & _BDF_START )\n    {\n      /* The ENDFONT field was never reached or did not exist. */\n      if ( !( p->flags & _BDF_GLYPHS ) )\n      {\n        /* Error happened while parsing header. */\n        FT_ERROR(( \"bdf_load_font: \" ERRMSG2, lineno ));\n        error = FT_THROW( Corrupted_Font_Header );\n        goto Exit;\n      }\n      else\n      {\n        /* Error happened when parsing glyphs. */\n        FT_ERROR(( \"bdf_load_font: \" ERRMSG3, lineno ));\n        error = FT_THROW( Corrupted_Font_Glyphs );\n        goto Exit;\n      }\n    }\n\n    if ( p->font != 0 )\n    {\n      /* Make sure the comments are NULL terminated if they exist. */\n      memory = p->font->memory;\n\n      if ( p->font->comments_len > 0 )\n      {\n        if ( FT_RENEW_ARRAY( p->font->comments,\n                             p->font->comments_len,\n                             p->font->comments_len + 1 ) )\n          goto Fail;\n\n        p->font->comments[p->font->comments_len] = 0;\n      }\n    }\n    else if ( error == FT_Err_Ok )\n      error = FT_THROW( Invalid_File_Format );\n\n    *font = p->font;\n\n  Exit:\n    if ( p )\n    {\n      _bdf_list_done( &p->list );\n\n      memory = extmemory;\n\n      FT_FREE( p );\n    }\n\n    return error;\n\n  Fail:\n    bdf_free_font( p->font );\n\n    memory = extmemory;\n\n    FT_FREE( p->font );\n\n    goto Exit;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  bdf_free_font( bdf_font_t*  font )\n  {\n    bdf_property_t*  prop;\n    unsigned long    i;\n    bdf_glyph_t*     glyphs;\n    FT_Memory        memory;\n\n\n    if ( font == 0 )\n      return;\n\n    memory = font->memory;\n\n    FT_FREE( font->name );\n\n    /* Free up the internal hash table of property names. */\n    if ( font->internal )\n    {\n      hash_free( (hashtable *)font->internal, memory );\n      FT_FREE( font->internal );\n    }\n\n    /* Free up the comment info. */\n    FT_FREE( font->comments );\n\n    /* Free up the properties. */\n    for ( i = 0; i < font->props_size; i++ )\n    {\n      if ( font->props[i].format == BDF_ATOM )\n        FT_FREE( font->props[i].value.atom );\n    }\n\n    FT_FREE( font->props );\n\n    /* Free up the character info. */\n    for ( i = 0, glyphs = font->glyphs;\n          i < font->glyphs_used; i++, glyphs++ )\n    {\n      FT_FREE( glyphs->name );\n      FT_FREE( glyphs->bitmap );\n    }\n\n    for ( i = 0, glyphs = font->unencoded; i < font->unencoded_used;\n          i++, glyphs++ )\n    {\n      FT_FREE( glyphs->name );\n      FT_FREE( glyphs->bitmap );\n    }\n\n    FT_FREE( font->glyphs );\n    FT_FREE( font->unencoded );\n\n    /* Free up the overflow storage if it was used. */\n    for ( i = 0, glyphs = font->overflow.glyphs;\n          i < font->overflow.glyphs_used; i++, glyphs++ )\n    {\n      FT_FREE( glyphs->name );\n      FT_FREE( glyphs->bitmap );\n    }\n\n    FT_FREE( font->overflow.glyphs );\n\n    /* bdf_cleanup */\n    hash_free( &(font->proptbl), memory );\n\n    /* Free up the user defined properties. */\n    for ( prop = font->user_props, i = 0;\n          i < font->nuser_props; i++, prop++ )\n    {\n      FT_FREE( prop->name );\n      if ( prop->format == BDF_ATOM )\n        FT_FREE( prop->value.atom );\n    }\n\n    FT_FREE( font->user_props );\n\n    /* FREE( font ); */ /* XXX Fixme */\n  }\n\n\n  FT_LOCAL_DEF( bdf_property_t * )\n  bdf_get_font_property( bdf_font_t*  font,\n                         const char*  name )\n  {\n    hashnode  hn;\n\n\n    if ( font == 0 || font->props_size == 0 || name == 0 || *name == 0 )\n      return 0;\n\n    hn = hash_lookup( name, (hashtable *)font->internal );\n\n    return hn ? ( font->props + hn->data ) : 0;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/bdf/module.mk",
    "content": "#\n# FreeType 2 BDF module definition\n#\n\n# Copyright 2001, 2002, 2006 by\n# Francesco Zappa Nardelli\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n\n\nFTMODULE_H_COMMANDS += BDF_DRIVER\n\ndefine BDF_DRIVER\n$(OPEN_DRIVER) FT_Driver_ClassRec, bdf_driver_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)bdf       $(ECHO_DRIVER_DESC)bdf bitmap fonts$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/bdf/rules.mk",
    "content": "#\n# FreeType 2 bdf driver configuration rules\n#\n\n\n# Copyright (C) 2001, 2002, 2003, 2008 by\n# Francesco Zappa Nardelli\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n\n\n\n\n# bdf driver directory\n#\nBDF_DIR := $(SRC_DIR)/bdf\n\n\nBDF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(BDF_DIR))\n\n\n# bdf driver sources (i.e., C files)\n#\nBDF_DRV_SRC := $(BDF_DIR)/bdflib.c \\\n               $(BDF_DIR)/bdfdrivr.c\n\n\n# bdf driver headers\n#\nBDF_DRV_H := $(BDF_DIR)/bdf.h \\\n             $(BDF_DIR)/bdfdrivr.h \\\n             $(BDF_DIR)/bdferror.h\n\n# bdf driver object(s)\n#\n#   BDF_DRV_OBJ_M is used during `multi' builds\n#   BDF_DRV_OBJ_S is used during `single' builds\n#\nBDF_DRV_OBJ_M := $(BDF_DRV_SRC:$(BDF_DIR)/%.c=$(OBJ_DIR)/%.$O)\nBDF_DRV_OBJ_S := $(OBJ_DIR)/bdf.$O\n\n# bdf driver source file for single build\n#\nBDF_DRV_SRC_S := $(BDF_DIR)/bdf.c\n\n\n# bdf driver - single object\n#\n$(BDF_DRV_OBJ_S): $(BDF_DRV_SRC_S) $(BDF_DRV_SRC) $(FREETYPE_H) $(BDF_DRV_H)\n\t$(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BDF_DRV_SRC_S))\n\n\n# bdf driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(BDF_DIR)/%.c $(FREETYPE_H) $(BDF_DRV_H)\n\t$(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(BDF_DRV_OBJ_S)\nDRV_OBJS_M += $(BDF_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/bzip2/Jamfile",
    "content": "# FreeType 2 src/bzip2 Jamfile\n#\n# Copyright 2010 by\n# Joel Klinghed\n#\n# Based on src/lzw/Jamfile, Copyright 2004, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) bzip2 ;\n\nLibrary  $(FT2_LIB) : ftbzip2.c ;\n\n# end of src/bzip2 Jamfile\n"
  },
  {
    "path": "libs/freetype/src/bzip2/ftbzip2.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftbzip2.c                                                              */\n/*                                                                         */\n/*    FreeType support for .bz2 compressed files.                          */\n/*                                                                         */\n/*  This optional component relies on libbz2.  It should mainly be used to */\n/*  parse compressed PCF fonts, as found with many X11 server              */\n/*  distributions.                                                         */\n/*                                                                         */\n/*  Copyright 2010, 2012, 2013 by                                          */\n/*  Joel Klinghed.                                                         */\n/*                                                                         */\n/*  Based on src/gzip/ftgzip.c, Copyright 2002 - 2010 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_MEMORY_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_BZIP2_H\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  Bzip2_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Bzip2\n\n#include FT_ERRORS_H\n\n\n#ifdef FT_CONFIG_OPTION_USE_BZIP2\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"bzip2 code does not support PIC yet\"\n#endif\n\n#define BZ_NO_STDIO /* Do not need FILE */\n#include <bzlib.h>\n\n\n/***************************************************************************/\n/***************************************************************************/\n/*****                                                                 *****/\n/*****           B Z I P 2   M E M O R Y   M A N A G E M E N T         *****/\n/*****                                                                 *****/\n/***************************************************************************/\n/***************************************************************************/\n\n  /* it is better to use FreeType memory routines instead of raw\n     'malloc/free' */\n\n  typedef void *(* alloc_func)(void*, int, int);\n  typedef void (* free_func)(void*, void*);\n\n  static void*\n  ft_bzip2_alloc( FT_Memory  memory,\n                  int        items,\n                  int        size )\n  {\n    FT_ULong    sz = (FT_ULong)size * items;\n    FT_Error    error;\n    FT_Pointer  p  = NULL;\n\n\n    (void)FT_ALLOC( p, sz );\n    return p;\n  }\n\n\n  static void\n  ft_bzip2_free( FT_Memory  memory,\n                 void*      address )\n  {\n    FT_MEM_FREE( address );\n  }\n\n\n/***************************************************************************/\n/***************************************************************************/\n/*****                                                                 *****/\n/*****              B Z I P 2   F I L E   D E S C R I P T O R          *****/\n/*****                                                                 *****/\n/***************************************************************************/\n/***************************************************************************/\n\n#define FT_BZIP2_BUFFER_SIZE  4096\n\n  typedef struct  FT_BZip2FileRec_\n  {\n    FT_Stream  source;         /* parent/source stream        */\n    FT_Stream  stream;         /* embedding stream            */\n    FT_Memory  memory;         /* memory allocator            */\n    bz_stream  bzstream;       /* bzlib input stream          */\n\n    FT_Byte    input[FT_BZIP2_BUFFER_SIZE];  /* input read buffer  */\n\n    FT_Byte    buffer[FT_BZIP2_BUFFER_SIZE]; /* output buffer      */\n    FT_ULong   pos;                          /* position in output */\n    FT_Byte*   cursor;\n    FT_Byte*   limit;\n\n  } FT_BZip2FileRec, *FT_BZip2File;\n\n\n  /* check and skip .bz2 header - we don't support `transparent' compression */\n  static FT_Error\n  ft_bzip2_check_header( FT_Stream  stream )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Byte   head[4];\n\n\n    if ( FT_STREAM_SEEK( 0 )       ||\n         FT_STREAM_READ( head, 4 ) )\n      goto Exit;\n\n    /* head[0] && head[1] are the magic numbers;    */\n    /* head[2] is the version, and head[3] the blocksize */\n    if ( head[0] != 0x42  ||\n         head[1] != 0x5a  ||\n         head[2] != 0x68  )  /* only support bzip2 (huffman) */\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  ft_bzip2_file_init( FT_BZip2File  zip,\n                      FT_Stream     stream,\n                      FT_Stream     source )\n  {\n    bz_stream*  bzstream = &zip->bzstream;\n    FT_Error    error    = FT_Err_Ok;\n\n\n    zip->stream = stream;\n    zip->source = source;\n    zip->memory = stream->memory;\n\n    zip->limit  = zip->buffer + FT_BZIP2_BUFFER_SIZE;\n    zip->cursor = zip->limit;\n    zip->pos    = 0;\n\n    /* check .bz2 header */\n    {\n      stream = source;\n\n      error = ft_bzip2_check_header( stream );\n      if ( error )\n        goto Exit;\n\n      if ( FT_STREAM_SEEK( 0 ) )\n        goto Exit;\n    }\n\n    /* initialize bzlib */\n    bzstream->bzalloc = (alloc_func)ft_bzip2_alloc;\n    bzstream->bzfree  = (free_func) ft_bzip2_free;\n    bzstream->opaque  = zip->memory;\n\n    bzstream->avail_in = 0;\n    bzstream->next_in  = (char*)zip->buffer;\n\n    if ( BZ2_bzDecompressInit( bzstream, 0, 0 ) != BZ_OK ||\n         bzstream->next_in == NULL                       )\n      error = FT_THROW( Invalid_File_Format );\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  ft_bzip2_file_done( FT_BZip2File  zip )\n  {\n    bz_stream*  bzstream = &zip->bzstream;\n\n\n    BZ2_bzDecompressEnd( bzstream );\n\n    /* clear the rest */\n    bzstream->bzalloc   = NULL;\n    bzstream->bzfree    = NULL;\n    bzstream->opaque    = NULL;\n    bzstream->next_in   = NULL;\n    bzstream->next_out  = NULL;\n    bzstream->avail_in  = 0;\n    bzstream->avail_out = 0;\n\n    zip->memory = NULL;\n    zip->source = NULL;\n    zip->stream = NULL;\n  }\n\n\n  static FT_Error\n  ft_bzip2_file_reset( FT_BZip2File  zip )\n  {\n    FT_Stream  stream = zip->source;\n    FT_Error   error;\n\n\n    if ( !FT_STREAM_SEEK( 0 ) )\n    {\n      bz_stream*  bzstream = &zip->bzstream;\n\n\n      BZ2_bzDecompressEnd( bzstream );\n\n      bzstream->avail_in  = 0;\n      bzstream->next_in   = (char*)zip->input;\n      bzstream->avail_out = 0;\n      bzstream->next_out  = (char*)zip->buffer;\n\n      zip->limit  = zip->buffer + FT_BZIP2_BUFFER_SIZE;\n      zip->cursor = zip->limit;\n      zip->pos    = 0;\n\n      BZ2_bzDecompressInit( bzstream, 0, 0 );\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  ft_bzip2_file_fill_input( FT_BZip2File  zip )\n  {\n    bz_stream*  bzstream = &zip->bzstream;\n    FT_Stream   stream    = zip->source;\n    FT_ULong    size;\n\n\n    if ( stream->read )\n    {\n      size = stream->read( stream, stream->pos, zip->input,\n                           FT_BZIP2_BUFFER_SIZE );\n      if ( size == 0 )\n        return FT_THROW( Invalid_Stream_Operation );\n    }\n    else\n    {\n      size = stream->size - stream->pos;\n      if ( size > FT_BZIP2_BUFFER_SIZE )\n        size = FT_BZIP2_BUFFER_SIZE;\n\n      if ( size == 0 )\n        return FT_THROW( Invalid_Stream_Operation );\n\n      FT_MEM_COPY( zip->input, stream->base + stream->pos, size );\n    }\n    stream->pos += size;\n\n    bzstream->next_in  = (char*)zip->input;\n    bzstream->avail_in = size;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  ft_bzip2_file_fill_output( FT_BZip2File  zip )\n  {\n    bz_stream*  bzstream = &zip->bzstream;\n    FT_Error    error    = FT_Err_Ok;\n\n\n    zip->cursor         = zip->buffer;\n    bzstream->next_out  = (char*)zip->cursor;\n    bzstream->avail_out = FT_BZIP2_BUFFER_SIZE;\n\n    while ( bzstream->avail_out > 0 )\n    {\n      int  err;\n\n\n      if ( bzstream->avail_in == 0 )\n      {\n        error = ft_bzip2_file_fill_input( zip );\n        if ( error )\n          break;\n      }\n\n      err = BZ2_bzDecompress( bzstream );\n\n      if ( err == BZ_STREAM_END )\n      {\n        zip->limit = (FT_Byte*)bzstream->next_out;\n        if ( zip->limit == zip->cursor )\n          error = FT_THROW( Invalid_Stream_Operation );\n        break;\n      }\n      else if ( err != BZ_OK )\n      {\n        error = FT_THROW( Invalid_Stream_Operation );\n        break;\n      }\n    }\n\n    return error;\n  }\n\n\n  /* fill output buffer; `count' must be <= FT_BZIP2_BUFFER_SIZE */\n  static FT_Error\n  ft_bzip2_file_skip_output( FT_BZip2File  zip,\n                             FT_ULong      count )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_ULong  delta;\n\n\n    for (;;)\n    {\n      delta = (FT_ULong)( zip->limit - zip->cursor );\n      if ( delta >= count )\n        delta = count;\n\n      zip->cursor += delta;\n      zip->pos    += delta;\n\n      count -= delta;\n      if ( count == 0 )\n        break;\n\n      error = ft_bzip2_file_fill_output( zip );\n      if ( error )\n        break;\n    }\n\n    return error;\n  }\n\n\n  static FT_ULong\n  ft_bzip2_file_io( FT_BZip2File  zip,\n                    FT_ULong      pos,\n                    FT_Byte*      buffer,\n                    FT_ULong      count )\n  {\n    FT_ULong  result = 0;\n    FT_Error  error;\n\n\n    /* Reset inflate stream if we're seeking backwards.        */\n    /* Yes, that is not too efficient, but it saves memory :-) */\n    if ( pos < zip->pos )\n    {\n      error = ft_bzip2_file_reset( zip );\n      if ( error )\n        goto Exit;\n    }\n\n    /* skip unwanted bytes */\n    if ( pos > zip->pos )\n    {\n      error = ft_bzip2_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( count == 0 )\n      goto Exit;\n\n    /* now read the data */\n    for (;;)\n    {\n      FT_ULong  delta;\n\n\n      delta = (FT_ULong)( zip->limit - zip->cursor );\n      if ( delta >= count )\n        delta = count;\n\n      FT_MEM_COPY( buffer, zip->cursor, delta );\n      buffer      += delta;\n      result      += delta;\n      zip->cursor += delta;\n      zip->pos    += delta;\n\n      count -= delta;\n      if ( count == 0 )\n        break;\n\n      error = ft_bzip2_file_fill_output( zip );\n      if ( error )\n        break;\n    }\n\n  Exit:\n    return result;\n  }\n\n\n/***************************************************************************/\n/***************************************************************************/\n/*****                                                                 *****/\n/*****               B Z   E M B E D D I N G   S T R E A M             *****/\n/*****                                                                 *****/\n/***************************************************************************/\n/***************************************************************************/\n\n  static void\n  ft_bzip2_stream_close( FT_Stream  stream )\n  {\n    FT_BZip2File  zip    = (FT_BZip2File)stream->descriptor.pointer;\n    FT_Memory     memory = stream->memory;\n\n\n    if ( zip )\n    {\n      /* finalize bzip file descriptor */\n      ft_bzip2_file_done( zip );\n\n      FT_FREE( zip );\n\n      stream->descriptor.pointer = NULL;\n    }\n  }\n\n\n  static FT_ULong\n  ft_bzip2_stream_io( FT_Stream  stream,\n                      FT_ULong   pos,\n                      FT_Byte*   buffer,\n                      FT_ULong   count )\n  {\n    FT_BZip2File  zip = (FT_BZip2File)stream->descriptor.pointer;\n\n\n    return ft_bzip2_file_io( zip, pos, buffer, count );\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stream_OpenBzip2( FT_Stream  stream,\n                       FT_Stream  source )\n  {\n    FT_Error      error;\n    FT_Memory     memory = source->memory;\n    FT_BZip2File  zip = NULL;\n\n\n    /*\n     *  check the header right now; this prevents allocating unnecessary\n     *  objects when we don't need them\n     */\n    error = ft_bzip2_check_header( source );\n    if ( error )\n      goto Exit;\n\n    FT_ZERO( stream );\n    stream->memory = memory;\n\n    if ( !FT_QNEW( zip ) )\n    {\n      error = ft_bzip2_file_init( zip, stream, source );\n      if ( error )\n      {\n        FT_FREE( zip );\n        goto Exit;\n      }\n\n      stream->descriptor.pointer = zip;\n    }\n\n    stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */\n    stream->pos   = 0;\n    stream->base  = 0;\n    stream->read  = ft_bzip2_stream_io;\n    stream->close = ft_bzip2_stream_close;\n\n  Exit:\n    return error;\n  }\n\n#else  /* !FT_CONFIG_OPTION_USE_BZIP2 */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stream_OpenBzip2( FT_Stream  stream,\n                       FT_Stream  source )\n  {\n    FT_UNUSED( stream );\n    FT_UNUSED( source );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n#endif /* !FT_CONFIG_OPTION_USE_BZIP2 */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/bzip2/rules.mk",
    "content": "#\n# FreeType 2 BZIP2 support configuration rules\n#\n\n# Copyright 2010 by\n# Joel Klinghed.\n#\n# Based on src/lzw/rules.mk, Copyright 2004-2006 by\n# Albert Chin-A-Young.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# BZIP2 driver directory\n#\nBZIP2_DIR := $(SRC_DIR)/bzip2\n\n\n# compilation flags for the driver\n#\nBZIP2_COMPILE := $(FT_COMPILE)\n\n\n# BZIP2 support sources (i.e., C files)\n#\nBZIP2_DRV_SRC := $(BZIP2_DIR)/ftbzip2.c\n\n# BZIP2 driver object(s)\n#\n#   BZIP2_DRV_OBJ_M is used during `multi' builds\n#   BZIP2_DRV_OBJ_S is used during `single' builds\n#\nBZIP2_DRV_OBJ_M := $(OBJ_DIR)/ftbzip2.$O\nBZIP2_DRV_OBJ_S := $(OBJ_DIR)/ftbzip2.$O\n\n# BZIP2 support source file for single build\n#\nBZIP2_DRV_SRC_S := $(BZIP2_DIR)/ftbzip2.c\n\n\n# BZIP2 support - single object\n#\n$(BZIP2_DRV_OBJ_S): $(BZIP2_DRV_SRC_S) $(BZIP2_DRV_SRC) $(FREETYPE_H) $(BZIP2_DRV_H)\n\t$(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BZIP2_DRV_SRC_S))\n\n\n# BZIP2 support - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(BZIP2_DIR)/%.c $(FREETYPE_H) $(BZIP2_DRV_H)\n\t$(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(BZIP2_DRV_OBJ_S)\nDRV_OBJS_M += $(BZIP2_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/cache/Jamfile",
    "content": "# FreeType 2 src/cache Jamfile\n#\n# Copyright 2001, 2003, 2004 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) cache ;\n\n# The file <freetype/ftcache.h> contains some macro definitions that are\n# later used in #include statements related to the cache sub-system.  It\n# needs to be parsed through a HDRMACRO rule for macro definitions.\n#\nHDRMACRO  [ FT2_SubDir  include ftcache.h ] ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = ftcmru\n               ftcmanag\n               ftccache\n               ftcglyph\n               ftcsbits\n               ftcimage\n               ftcbasic\n               ftccmap\n               ;\n  }\n  else\n  {\n    _sources = ftcache ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/cache Jamfile\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcache.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcache.c                                                              */\n/*                                                                         */\n/*    The FreeType Caching sub-system (body only).                         */\n/*                                                                         */\n/*  Copyright 2000-2001, 2003 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"ftcmru.c\"\n#include \"ftcmanag.c\"\n#include \"ftccache.c\"\n#include \"ftccmap.c\"\n#include \"ftcglyph.c\"\n#include \"ftcimage.c\"\n#include \"ftcsbits.c\"\n#include \"ftcbasic.c\"\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcbasic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcbasic.c                                                             */\n/*                                                                         */\n/*    The FreeType basic cache interface (body).                           */\n/*                                                                         */\n/*  Copyright 2003-2007, 2009-2011, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_CACHE_H\n#include \"ftcglyph.h\"\n#include \"ftcimage.h\"\n#include \"ftcsbits.h\"\n\n#include \"ftccback.h\"\n#include \"ftcerror.h\"\n\n#define FT_COMPONENT  trace_cache\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /*\n   *  These structures correspond to the FTC_Font and FTC_ImageDesc types\n   *  that were defined in version 2.1.7.\n   */\n  typedef struct  FTC_OldFontRec_\n  {\n    FTC_FaceID  face_id;\n    FT_UShort   pix_width;\n    FT_UShort   pix_height;\n\n  } FTC_OldFontRec, *FTC_OldFont;\n\n\n  typedef struct  FTC_OldImageDescRec_\n  {\n    FTC_OldFontRec  font;\n    FT_UInt32       flags;\n\n  } FTC_OldImageDescRec, *FTC_OldImageDesc;\n\n\n  /*\n   *  Notice that FTC_OldImageDescRec and FTC_ImageTypeRec are nearly\n   *  identical, bit-wise.  The only difference is that the `width' and\n   *  `height' fields are expressed as 16-bit integers in the old structure,\n   *  and as normal `int' in the new one.\n   *\n   *  We are going to perform a weird hack to detect which structure is\n   *  being passed to the image and sbit caches.  If the new structure's\n   *  `width' is larger than 0x10000, we assume that we are really receiving\n   *  an FTC_OldImageDesc.\n   */\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*\n   *  Basic Families\n   *\n   */\n  typedef struct  FTC_BasicAttrRec_\n  {\n    FTC_ScalerRec  scaler;\n    FT_UInt        load_flags;\n\n  } FTC_BasicAttrRec, *FTC_BasicAttrs;\n\n#define FTC_BASIC_ATTR_COMPARE( a, b )                                 \\\n          FT_BOOL( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \\\n                   (a)->load_flags == (b)->load_flags               )\n\n#define FTC_BASIC_ATTR_HASH( a )                                   \\\n          ( FTC_SCALER_HASH( &(a)->scaler ) + 31*(a)->load_flags )\n\n\n  typedef struct  FTC_BasicQueryRec_\n  {\n    FTC_GQueryRec     gquery;\n    FTC_BasicAttrRec  attrs;\n\n  } FTC_BasicQueryRec, *FTC_BasicQuery;\n\n\n  typedef struct  FTC_BasicFamilyRec_\n  {\n    FTC_FamilyRec     family;\n    FTC_BasicAttrRec  attrs;\n\n  } FTC_BasicFamilyRec, *FTC_BasicFamily;\n\n\n  FT_CALLBACK_DEF( FT_Bool )\n  ftc_basic_family_compare( FTC_MruNode  ftcfamily,\n                            FT_Pointer   ftcquery )\n  {\n    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;\n    FTC_BasicQuery   query  = (FTC_BasicQuery)ftcquery;\n\n\n    return FTC_BASIC_ATTR_COMPARE( &family->attrs, &query->attrs );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ftc_basic_family_init( FTC_MruNode  ftcfamily,\n                         FT_Pointer   ftcquery,\n                         FT_Pointer   ftccache )\n  {\n    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;\n    FTC_BasicQuery   query  = (FTC_BasicQuery)ftcquery;\n    FTC_Cache        cache  = (FTC_Cache)ftccache;\n\n\n    FTC_Family_Init( FTC_FAMILY( family ), cache );\n    family->attrs = query->attrs;\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  ftc_basic_family_get_count( FTC_Family   ftcfamily,\n                              FTC_Manager  manager )\n  {\n    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;\n    FT_Error         error;\n    FT_Face          face;\n    FT_UInt          result = 0;\n\n\n    error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id,\n                                    &face );\n\n    if ( error || !face )\n      return result;\n\n    if ( (FT_ULong)face->num_glyphs > FT_UINT_MAX || 0 > face->num_glyphs )\n    {\n      FT_TRACE1(( \"ftc_basic_family_get_count: too large number of glyphs \" ));\n      FT_TRACE1(( \"in this face, truncated\\n\", face->num_glyphs ));\n    }\n\n    if ( !error )\n      result = (FT_UInt)face->num_glyphs;\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ftc_basic_family_load_bitmap( FTC_Family   ftcfamily,\n                                FT_UInt      gindex,\n                                FTC_Manager  manager,\n                                FT_Face     *aface )\n  {\n    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;\n    FT_Error         error;\n    FT_Size          size;\n\n\n    error = FTC_Manager_LookupSize( manager, &family->attrs.scaler, &size );\n    if ( !error )\n    {\n      FT_Face  face = size->face;\n\n\n      error = FT_Load_Glyph( face, gindex,\n                             family->attrs.load_flags | FT_LOAD_RENDER );\n      if ( !error )\n        *aface = face;\n    }\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ftc_basic_family_load_glyph( FTC_Family  ftcfamily,\n                               FT_UInt     gindex,\n                               FTC_Cache   cache,\n                               FT_Glyph   *aglyph )\n  {\n    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;\n    FT_Error         error;\n    FTC_Scaler       scaler = &family->attrs.scaler;\n    FT_Face          face;\n    FT_Size          size;\n\n\n    /* we will now load the glyph image */\n    error = FTC_Manager_LookupSize( cache->manager,\n                                    scaler,\n                                    &size );\n    if ( !error )\n    {\n      face = size->face;\n\n      error = FT_Load_Glyph( face, gindex, family->attrs.load_flags );\n      if ( !error )\n      {\n        if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP  ||\n             face->glyph->format == FT_GLYPH_FORMAT_OUTLINE )\n        {\n          /* ok, copy it */\n          FT_Glyph  glyph;\n\n\n          error = FT_Get_Glyph( face->glyph, &glyph );\n          if ( !error )\n          {\n            *aglyph = glyph;\n            goto Exit;\n          }\n        }\n        else\n          error = FT_THROW( Invalid_Argument );\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Bool )\n  ftc_basic_gnode_compare_faceid( FTC_Node    ftcgnode,\n                                  FT_Pointer  ftcface_id,\n                                  FTC_Cache   cache,\n                                  FT_Bool*    list_changed )\n  {\n    FTC_GNode        gnode   = (FTC_GNode)ftcgnode;\n    FTC_FaceID       face_id = (FTC_FaceID)ftcface_id;\n    FTC_BasicFamily  family  = (FTC_BasicFamily)gnode->family;\n    FT_Bool          result;\n\n\n    if ( list_changed )\n      *list_changed = FALSE;\n    result = FT_BOOL( family->attrs.scaler.face_id == face_id );\n    if ( result )\n    {\n      /* we must call this function to avoid this node from appearing\n       * in later lookups with the same face_id!\n       */\n      FTC_GNode_UnselectFamily( gnode, cache );\n    }\n    return result;\n  }\n\n\n /*\n  *\n  * basic image cache\n  *\n  */\n\n  FT_CALLBACK_TABLE_DEF\n  const FTC_IFamilyClassRec  ftc_basic_image_family_class =\n  {\n    {\n      sizeof ( FTC_BasicFamilyRec ),\n      ftc_basic_family_compare,\n      ftc_basic_family_init,\n      0,                        /* FTC_MruNode_ResetFunc */\n      0                         /* FTC_MruNode_DoneFunc  */\n    },\n    ftc_basic_family_load_glyph\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FTC_GCacheClassRec  ftc_basic_image_cache_class =\n  {\n    {\n      ftc_inode_new,\n      ftc_inode_weight,\n      ftc_gnode_compare,\n      ftc_basic_gnode_compare_faceid,\n      ftc_inode_free,\n\n      sizeof ( FTC_GCacheRec ),\n      ftc_gcache_init,\n      ftc_gcache_done\n    },\n    (FTC_MruListClass)&ftc_basic_image_family_class\n  };\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_ImageCache_New( FTC_Manager      manager,\n                      FTC_ImageCache  *acache )\n  {\n    return FTC_GCache_New( manager, &ftc_basic_image_cache_class,\n                           (FTC_GCache*)acache );\n  }\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_ImageCache_Lookup( FTC_ImageCache  cache,\n                         FTC_ImageType   type,\n                         FT_UInt         gindex,\n                         FT_Glyph       *aglyph,\n                         FTC_Node       *anode )\n  {\n    FTC_BasicQueryRec  query;\n    FTC_Node           node = 0; /* make compiler happy */\n    FT_Error           error;\n    FT_PtrDist         hash;\n\n\n    /* some argument checks are delayed to FTC_Cache_Lookup */\n    if ( !aglyph )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    *aglyph = NULL;\n    if ( anode )\n      *anode  = NULL;\n\n#if defined( FT_CONFIG_OPTION_OLD_INTERNALS ) && ( FT_INT_MAX > 0xFFFFU )\n\n    /*\n     *  This one is a major hack used to detect whether we are passed a\n     *  regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one.\n     */\n    if ( (FT_ULong)type->width >= 0x10000L )\n    {\n      FTC_OldImageDesc  desc = (FTC_OldImageDesc)type;\n\n\n      query.attrs.scaler.face_id = desc->font.face_id;\n      query.attrs.scaler.width   = desc->font.pix_width;\n      query.attrs.scaler.height  = desc->font.pix_height;\n      query.attrs.load_flags     = desc->flags;\n    }\n    else\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    {\n      if ( (FT_ULong)(type->flags - FT_INT_MIN) > FT_UINT_MAX )\n      {\n        FT_TRACE1(( \"FTC_ImageCache_Lookup: higher bits in load_flags\" ));\n        FT_TRACE1(( \"0x%x are dropped\\n\", (type->flags & ~((FT_ULong)FT_UINT_MAX)) ));\n      }\n\n      query.attrs.scaler.face_id = type->face_id;\n      query.attrs.scaler.width   = type->width;\n      query.attrs.scaler.height  = type->height;\n      query.attrs.load_flags     = (FT_UInt)type->flags;\n    }\n\n    query.attrs.scaler.pixel = 1;\n    query.attrs.scaler.x_res = 0;  /* make compilers happy */\n    query.attrs.scaler.y_res = 0;\n\n    hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex;\n\n#if 1  /* inlining is about 50% faster! */\n    FTC_GCACHE_LOOKUP_CMP( cache,\n                           ftc_basic_family_compare,\n                           FTC_GNode_Compare,\n                           hash, gindex,\n                           &query,\n                           node,\n                           error );\n#else\n    error = FTC_GCache_Lookup( FTC_GCACHE( cache ),\n                               hash, gindex,\n                               FTC_GQUERY( &query ),\n                               &node );\n#endif\n    if ( !error )\n    {\n      *aglyph = FTC_INODE( node )->glyph;\n\n      if ( anode )\n      {\n        *anode = node;\n        node->ref_count++;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,\n                               FTC_Scaler      scaler,\n                               FT_ULong        load_flags,\n                               FT_UInt         gindex,\n                               FT_Glyph       *aglyph,\n                               FTC_Node       *anode )\n  {\n    FTC_BasicQueryRec  query;\n    FTC_Node           node = 0; /* make compiler happy */\n    FT_Error           error;\n    FT_PtrDist         hash;\n\n\n    /* some argument checks are delayed to FTC_Cache_Lookup */\n    if ( !aglyph || !scaler )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    *aglyph = NULL;\n    if ( anode )\n      *anode  = NULL;\n\n    /* FT_Load_Glyph(), FT_Load_Char() take FT_UInt flags */\n    if ( load_flags > FT_UINT_MAX )\n    {\n      FT_TRACE1(( \"FTC_ImageCache_LookupScaler: higher bits in load_flags\" ));\n      FT_TRACE1(( \"0x%x are dropped\\n\", (load_flags & ~((FT_ULong)FT_UINT_MAX)) ));\n    }\n\n    query.attrs.scaler     = scaler[0];\n    query.attrs.load_flags = (FT_UInt)load_flags;\n\n    hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex;\n\n    FTC_GCACHE_LOOKUP_CMP( cache,\n                           ftc_basic_family_compare,\n                           FTC_GNode_Compare,\n                           hash, gindex,\n                           &query,\n                           node,\n                           error );\n    if ( !error )\n    {\n      *aglyph = FTC_INODE( node )->glyph;\n\n      if ( anode )\n      {\n        *anode = node;\n        node->ref_count++;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /* yet another backwards-legacy structure */\n  typedef struct  FTC_OldImage_Desc_\n  {\n    FTC_FontRec  font;\n    FT_UInt      image_type;\n\n  } FTC_OldImage_Desc;\n\n\n#define FTC_OLD_IMAGE_FORMAT( x )  ( (x) & 7 )\n\n\n#define ftc_old_image_format_bitmap    0x0000\n#define ftc_old_image_format_outline   0x0001\n\n#define ftc_old_image_format_mask      0x000F\n\n#define ftc_old_image_flag_monochrome  0x0010\n#define ftc_old_image_flag_unhinted    0x0020\n#define ftc_old_image_flag_autohinted  0x0040\n#define ftc_old_image_flag_unscaled    0x0080\n#define ftc_old_image_flag_no_sbits    0x0100\n\n  /* monochrome bitmap */\n#define ftc_old_image_mono             ftc_old_image_format_bitmap   | \\\n                                       ftc_old_image_flag_monochrome\n\n  /* anti-aliased bitmap */\n#define ftc_old_image_grays            ftc_old_image_format_bitmap\n\n  /* scaled outline */\n#define ftc_old_image_outline          ftc_old_image_format_outline\n\n\n  static void\n  ftc_image_type_from_old_desc( FTC_ImageType       typ,\n                                FTC_OldImage_Desc*  desc )\n  {\n    typ->face_id = desc->font.face_id;\n    typ->width   = desc->font.pix_width;\n    typ->height  = desc->font.pix_height;\n\n    /* convert image type flags to load flags */\n    {\n      FT_UInt  load_flags = FT_LOAD_DEFAULT;\n      FT_UInt  type       = desc->image_type;\n\n\n      /* determine load flags, depending on the font description's */\n      /* image type                                                */\n\n      if ( FTC_OLD_IMAGE_FORMAT( type ) == ftc_old_image_format_bitmap )\n      {\n        if ( type & ftc_old_image_flag_monochrome )\n          load_flags |= FT_LOAD_MONOCHROME;\n\n        /* disable embedded bitmaps loading if necessary */\n        if ( type & ftc_old_image_flag_no_sbits )\n          load_flags |= FT_LOAD_NO_BITMAP;\n      }\n      else\n      {\n        /* we want an outline, don't load embedded bitmaps */\n        load_flags |= FT_LOAD_NO_BITMAP;\n\n        if ( type & ftc_old_image_flag_unscaled )\n          load_flags |= FT_LOAD_NO_SCALE;\n      }\n\n      /* always render glyphs to bitmaps */\n      load_flags |= FT_LOAD_RENDER;\n\n      if ( type & ftc_old_image_flag_unhinted )\n        load_flags |= FT_LOAD_NO_HINTING;\n\n      if ( type & ftc_old_image_flag_autohinted )\n        load_flags |= FT_LOAD_FORCE_AUTOHINT;\n\n      typ->flags = load_flags;\n    }\n  }\n\n\n  FT_EXPORT( FT_Error )\n  FTC_Image_Cache_New( FTC_Manager      manager,\n                       FTC_ImageCache  *acache );\n\n  FT_EXPORT( FT_Error )\n  FTC_Image_Cache_Lookup( FTC_ImageCache      icache,\n                          FTC_OldImage_Desc*  desc,\n                          FT_UInt             gindex,\n                          FT_Glyph           *aglyph );\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_Image_Cache_New( FTC_Manager      manager,\n                       FTC_ImageCache  *acache )\n  {\n    return FTC_ImageCache_New( manager, (FTC_ImageCache*)acache );\n  }\n\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_Image_Cache_Lookup( FTC_ImageCache      icache,\n                          FTC_OldImage_Desc*  desc,\n                          FT_UInt             gindex,\n                          FT_Glyph           *aglyph )\n  {\n    FTC_ImageTypeRec  type0;\n\n\n    if ( !desc )\n      return FT_THROW( Invalid_Argument );\n\n    ftc_image_type_from_old_desc( &type0, desc );\n\n    return FTC_ImageCache_Lookup( (FTC_ImageCache)icache,\n                                   &type0,\n                                   gindex,\n                                   aglyph,\n                                   NULL );\n  }\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n /*\n  *\n  * basic small bitmap cache\n  *\n  */\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FTC_SFamilyClassRec  ftc_basic_sbit_family_class =\n  {\n    {\n      sizeof ( FTC_BasicFamilyRec ),\n      ftc_basic_family_compare,\n      ftc_basic_family_init,\n      0,                            /* FTC_MruNode_ResetFunc */\n      0                             /* FTC_MruNode_DoneFunc  */\n    },\n    ftc_basic_family_get_count,\n    ftc_basic_family_load_bitmap\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FTC_GCacheClassRec  ftc_basic_sbit_cache_class =\n  {\n    {\n      ftc_snode_new,\n      ftc_snode_weight,\n      ftc_snode_compare,\n      ftc_basic_gnode_compare_faceid,\n      ftc_snode_free,\n\n      sizeof ( FTC_GCacheRec ),\n      ftc_gcache_init,\n      ftc_gcache_done\n    },\n    (FTC_MruListClass)&ftc_basic_sbit_family_class\n  };\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_SBitCache_New( FTC_Manager     manager,\n                     FTC_SBitCache  *acache )\n  {\n    return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class,\n                           (FTC_GCache*)acache );\n  }\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_SBitCache_Lookup( FTC_SBitCache  cache,\n                        FTC_ImageType  type,\n                        FT_UInt        gindex,\n                        FTC_SBit      *ansbit,\n                        FTC_Node      *anode )\n  {\n    FT_Error           error;\n    FTC_BasicQueryRec  query;\n    FTC_Node           node = 0; /* make compiler happy */\n    FT_PtrDist         hash;\n\n\n    if ( anode )\n      *anode = NULL;\n\n    /* other argument checks delayed to FTC_Cache_Lookup */\n    if ( !ansbit )\n      return FT_THROW( Invalid_Argument );\n\n    *ansbit = NULL;\n\n#if defined( FT_CONFIG_OPTION_OLD_INTERNALS ) && ( FT_INT_MAX > 0xFFFFU )\n\n    /*  This one is a major hack used to detect whether we are passed a\n     *  regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one.\n     */\n    if ( (FT_ULong)type->width >= 0x10000L )\n    {\n      FTC_OldImageDesc  desc = (FTC_OldImageDesc)type;\n\n\n      query.attrs.scaler.face_id = desc->font.face_id;\n      query.attrs.scaler.width   = desc->font.pix_width;\n      query.attrs.scaler.height  = desc->font.pix_height;\n      query.attrs.load_flags     = desc->flags;\n    }\n    else\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    {\n      if ( (FT_ULong)(type->flags - FT_INT_MIN) > FT_UINT_MAX )\n      {\n        FT_TRACE1(( \"FTC_ImageCache_Lookup: higher bits in load_flags\" ));\n        FT_TRACE1(( \"0x%x are dropped\\n\", (type->flags & ~((FT_ULong)FT_UINT_MAX)) ));\n      }\n\n      query.attrs.scaler.face_id = type->face_id;\n      query.attrs.scaler.width   = type->width;\n      query.attrs.scaler.height  = type->height;\n      query.attrs.load_flags     = (FT_UInt)type->flags;\n    }\n\n    query.attrs.scaler.pixel = 1;\n    query.attrs.scaler.x_res = 0;  /* make compilers happy */\n    query.attrs.scaler.y_res = 0;\n\n    /* beware, the hash must be the same for all glyph ranges! */\n    hash = FTC_BASIC_ATTR_HASH( &query.attrs ) +\n           gindex / FTC_SBIT_ITEMS_PER_NODE;\n\n#if 1  /* inlining is about 50% faster! */\n    FTC_GCACHE_LOOKUP_CMP( cache,\n                           ftc_basic_family_compare,\n                           FTC_SNode_Compare,\n                           hash, gindex,\n                           &query,\n                           node,\n                           error );\n#else\n    error = FTC_GCache_Lookup( FTC_GCACHE( cache ),\n                               hash,\n                               gindex,\n                               FTC_GQUERY( &query ),\n                               &node );\n#endif\n    if ( error )\n      goto Exit;\n\n    *ansbit = FTC_SNODE( node )->sbits +\n              ( gindex - FTC_GNODE( node )->gindex );\n\n    if ( anode )\n    {\n      *anode = node;\n      node->ref_count++;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,\n                              FTC_Scaler     scaler,\n                              FT_ULong       load_flags,\n                              FT_UInt        gindex,\n                              FTC_SBit      *ansbit,\n                              FTC_Node      *anode )\n  {\n    FT_Error           error;\n    FTC_BasicQueryRec  query;\n    FTC_Node           node = 0; /* make compiler happy */\n    FT_PtrDist         hash;\n\n\n    if ( anode )\n        *anode = NULL;\n\n    /* other argument checks delayed to FTC_Cache_Lookup */\n    if ( !ansbit || !scaler )\n        return FT_THROW( Invalid_Argument );\n\n    *ansbit = NULL;\n\n    /* FT_Load_Glyph(), FT_Load_Char() take FT_UInt flags */\n    if ( load_flags > FT_UINT_MAX )\n    {\n      FT_TRACE1(( \"FTC_ImageCache_LookupScaler: higher bits in load_flags\" ));\n      FT_TRACE1(( \"0x%x are dropped\\n\", (load_flags & ~((FT_ULong)FT_UINT_MAX)) ));\n    }\n\n    query.attrs.scaler     = scaler[0];\n    query.attrs.load_flags = (FT_UInt)load_flags;\n\n    /* beware, the hash must be the same for all glyph ranges! */\n    hash = FTC_BASIC_ATTR_HASH( &query.attrs ) +\n             gindex / FTC_SBIT_ITEMS_PER_NODE;\n\n    FTC_GCACHE_LOOKUP_CMP( cache,\n                           ftc_basic_family_compare,\n                           FTC_SNode_Compare,\n                           hash, gindex,\n                           &query,\n                           node,\n                           error );\n    if ( error )\n      goto Exit;\n\n    *ansbit = FTC_SNODE( node )->sbits +\n              ( gindex - FTC_GNODE( node )->gindex );\n\n    if ( anode )\n    {\n      *anode = node;\n      node->ref_count++;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  FT_EXPORT( FT_Error )\n  FTC_SBit_Cache_New( FTC_Manager     manager,\n                      FTC_SBitCache  *acache );\n\n  FT_EXPORT( FT_Error )\n  FTC_SBit_Cache_Lookup( FTC_SBitCache       cache,\n                         FTC_OldImage_Desc*  desc,\n                         FT_UInt             gindex,\n                         FTC_SBit           *ansbit );\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_SBit_Cache_New( FTC_Manager     manager,\n                      FTC_SBitCache  *acache )\n  {\n    return FTC_SBitCache_New( manager, (FTC_SBitCache*)acache );\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_SBit_Cache_Lookup( FTC_SBitCache       cache,\n                         FTC_OldImage_Desc*  desc,\n                         FT_UInt             gindex,\n                         FTC_SBit           *ansbit )\n  {\n    FTC_ImageTypeRec  type0;\n\n\n    if ( !desc )\n      return FT_THROW( Invalid_Argument );\n\n    ftc_image_type_from_old_desc( &type0, desc );\n\n    return FTC_SBitCache_Lookup( (FTC_SBitCache)cache,\n                                  &type0,\n                                  gindex,\n                                  ansbit,\n                                  NULL );\n  }\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftccache.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftccache.c                                                             */\n/*                                                                         */\n/*    The FreeType internal cache interface (body).                        */\n/*                                                                         */\n/*  Copyright 2000-2007, 2009-2011, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include \"ftcmanag.h\"\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n\n#include \"ftccback.h\"\n#include \"ftcerror.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cache\n\n\n#define FTC_HASH_MAX_LOAD  2\n#define FTC_HASH_MIN_LOAD  1\n#define FTC_HASH_SUB_LOAD  ( FTC_HASH_MAX_LOAD - FTC_HASH_MIN_LOAD )\n\n  /* this one _must_ be a power of 2! */\n#define FTC_HASH_INITIAL_SIZE  8\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                   CACHE NODE DEFINITIONS                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* add a new node to the head of the manager's circular MRU list */\n  static void\n  ftc_node_mru_link( FTC_Node     node,\n                     FTC_Manager  manager )\n  {\n    void  *nl = &manager->nodes_list;\n\n\n    FTC_MruNode_Prepend( (FTC_MruNode*)nl,\n                         (FTC_MruNode)node );\n    manager->num_nodes++;\n  }\n\n\n  /* remove a node from the manager's MRU list */\n  static void\n  ftc_node_mru_unlink( FTC_Node     node,\n                       FTC_Manager  manager )\n  {\n    void  *nl = &manager->nodes_list;\n\n\n    FTC_MruNode_Remove( (FTC_MruNode*)nl,\n                        (FTC_MruNode)node );\n    manager->num_nodes--;\n  }\n\n\n#ifndef FTC_INLINE\n\n  /* move a node to the head of the manager's MRU list */\n  static void\n  ftc_node_mru_up( FTC_Node     node,\n                   FTC_Manager  manager )\n  {\n    FTC_MruNode_Up( (FTC_MruNode*)&manager->nodes_list,\n                    (FTC_MruNode)node );\n  }\n\n\n  /* get a top bucket for specified hash from cache,\n   * body for FTC_NODE__TOP_FOR_HASH( cache, hash )\n   */\n  FT_LOCAL_DEF( FTC_Node* )\n  ftc_get_top_node_for_hash( FTC_Cache   cache,\n                             FT_PtrDist  hash )\n  {\n    FTC_Node*  pnode;\n    FT_UInt    idx;\n\n\n    idx = (FT_UInt)( hash & cache->mask );\n    if ( idx < cache->p )\n      idx = (FT_UInt)( hash & ( 2 * cache->mask + 1 ) );\n    pnode = cache->buckets + idx;\n    return pnode;\n  }\n\n#endif /* !FTC_INLINE */\n\n\n  /* Note that this function cannot fail.  If we cannot re-size the\n   * buckets array appropriately, we simply degrade the hash table's\n   * performance!\n   */\n  static void\n  ftc_cache_resize( FTC_Cache  cache )\n  {\n    for (;;)\n    {\n      FTC_Node  node, *pnode;\n      FT_UFast  p     = cache->p;\n      FT_UFast  mask  = cache->mask;\n      FT_UFast  count = mask + p + 1;    /* number of buckets */\n\n\n      /* do we need to shrink the buckets array? */\n      if ( cache->slack < 0 )\n      {\n        FTC_Node  new_list = NULL;\n\n\n        /* try to expand the buckets array _before_ splitting\n         * the bucket lists\n         */\n        if ( p >= mask )\n        {\n          FT_Memory  memory = cache->memory;\n          FT_Error   error;\n\n\n          /* if we can't expand the array, leave immediately */\n          if ( FT_RENEW_ARRAY( cache->buckets,\n                               ( mask + 1 ) * 2, ( mask + 1 ) * 4 ) )\n            break;\n        }\n\n        /* split a single bucket */\n        pnode = cache->buckets + p;\n\n        for (;;)\n        {\n          node = *pnode;\n          if ( node == NULL )\n            break;\n\n          if ( node->hash & ( mask + 1 ) )\n          {\n            *pnode     = node->link;\n            node->link = new_list;\n            new_list   = node;\n          }\n          else\n            pnode = &node->link;\n        }\n\n        cache->buckets[p + mask + 1] = new_list;\n\n        cache->slack += FTC_HASH_MAX_LOAD;\n\n        if ( p >= mask )\n        {\n          cache->mask = 2 * mask + 1;\n          cache->p    = 0;\n        }\n        else\n          cache->p = p + 1;\n      }\n\n      /* do we need to expand the buckets array? */\n      else if ( cache->slack > (FT_Long)count * FTC_HASH_SUB_LOAD )\n      {\n        FT_UFast   old_index = p + mask;\n        FTC_Node*  pold;\n\n\n        if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE )\n          break;\n\n        if ( p == 0 )\n        {\n          FT_Memory  memory = cache->memory;\n          FT_Error   error;\n\n\n          /* if we can't shrink the array, leave immediately */\n          if ( FT_RENEW_ARRAY( cache->buckets,\n                               ( mask + 1 ) * 2, mask + 1 ) )\n            break;\n\n          cache->mask >>= 1;\n          p             = cache->mask;\n        }\n        else\n          p--;\n\n        pnode = cache->buckets + p;\n        while ( *pnode )\n          pnode = &(*pnode)->link;\n\n        pold   = cache->buckets + old_index;\n        *pnode = *pold;\n        *pold  = NULL;\n\n        cache->slack -= FTC_HASH_MAX_LOAD;\n        cache->p      = p;\n      }\n\n      /* otherwise, the hash table is balanced */\n      else\n        break;\n    }\n  }\n\n\n  /* remove a node from its cache's hash table */\n  static void\n  ftc_node_hash_unlink( FTC_Node   node0,\n                        FTC_Cache  cache )\n  {\n    FTC_Node  *pnode = FTC_NODE__TOP_FOR_HASH( cache, node0->hash );\n\n\n    for (;;)\n    {\n      FTC_Node  node = *pnode;\n\n\n      if ( node == NULL )\n      {\n        FT_TRACE0(( \"ftc_node_hash_unlink: unknown node\\n\" ));\n        return;\n      }\n\n      if ( node == node0 )\n        break;\n\n      pnode = &(*pnode)->link;\n    }\n\n    *pnode      = node0->link;\n    node0->link = NULL;\n\n    cache->slack++;\n    ftc_cache_resize( cache );\n  }\n\n\n  /* add a node to the `top' of its cache's hash table */\n  static void\n  ftc_node_hash_link( FTC_Node   node,\n                      FTC_Cache  cache )\n  {\n    FTC_Node  *pnode = FTC_NODE__TOP_FOR_HASH( cache, node->hash );\n\n\n    node->link = *pnode;\n    *pnode     = node;\n\n    cache->slack--;\n    ftc_cache_resize( cache );\n  }\n\n\n  /* remove a node from the cache manager */\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n  FT_BASE_DEF( void )\n#else\n  FT_LOCAL_DEF( void )\n#endif\n  ftc_node_destroy( FTC_Node     node,\n                    FTC_Manager  manager )\n  {\n    FTC_Cache  cache;\n\n\n#ifdef FT_DEBUG_ERROR\n    /* find node's cache */\n    if ( node->cache_index >= manager->num_caches )\n    {\n      FT_TRACE0(( \"ftc_node_destroy: invalid node handle\\n\" ));\n      return;\n    }\n#endif\n\n    cache = manager->caches[node->cache_index];\n\n#ifdef FT_DEBUG_ERROR\n    if ( cache == NULL )\n    {\n      FT_TRACE0(( \"ftc_node_destroy: invalid node handle\\n\" ));\n      return;\n    }\n#endif\n\n    manager->cur_weight -= cache->clazz.node_weight( node, cache );\n\n    /* remove node from mru list */\n    ftc_node_mru_unlink( node, manager );\n\n    /* remove node from cache's hash table */\n    ftc_node_hash_unlink( node, cache );\n\n    /* now finalize it */\n    cache->clazz.node_free( node, cache );\n\n#if 0\n    /* check, just in case of general corruption :-) */\n    if ( manager->num_nodes == 0 )\n      FT_TRACE0(( \"ftc_node_destroy: invalid cache node count (%d)\\n\",\n                  manager->num_nodes ));\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    ABSTRACT CACHE CLASS                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  FTC_Cache_Init( FTC_Cache  cache )\n  {\n    return ftc_cache_init( cache );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  ftc_cache_init( FTC_Cache  cache )\n  {\n    FT_Memory  memory = cache->memory;\n    FT_Error   error;\n\n\n    cache->p     = 0;\n    cache->mask  = FTC_HASH_INITIAL_SIZE - 1;\n    cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD;\n\n    (void)FT_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 );\n    return error;\n  }\n\n\n  static void\n  FTC_Cache_Clear( FTC_Cache  cache )\n  {\n    if ( cache && cache->buckets )\n    {\n      FTC_Manager  manager = cache->manager;\n      FT_UFast     i;\n      FT_UFast     count;\n\n\n      count = cache->p + cache->mask + 1;\n\n      for ( i = 0; i < count; i++ )\n      {\n        FTC_Node  *pnode = cache->buckets + i, next, node = *pnode;\n\n\n        while ( node )\n        {\n          next        = node->link;\n          node->link  = NULL;\n\n          /* remove node from mru list */\n          ftc_node_mru_unlink( node, manager );\n\n          /* now finalize it */\n          manager->cur_weight -= cache->clazz.node_weight( node, cache );\n\n          cache->clazz.node_free( node, cache );\n          node = next;\n        }\n        cache->buckets[i] = NULL;\n      }\n      ftc_cache_resize( cache );\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ftc_cache_done( FTC_Cache  cache )\n  {\n    if ( cache->memory )\n    {\n      FT_Memory  memory = cache->memory;\n\n\n      FTC_Cache_Clear( cache );\n\n      FT_FREE( cache->buckets );\n      cache->mask  = 0;\n      cache->p     = 0;\n      cache->slack = 0;\n\n      cache->memory = NULL;\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_Cache_Done( FTC_Cache  cache )\n  {\n    ftc_cache_done( cache );\n  }\n\n\n  static void\n  ftc_cache_add( FTC_Cache  cache,\n                 FT_PtrDist hash,\n                 FTC_Node   node )\n  {\n    node->hash        = hash;\n    node->cache_index = (FT_UInt16)cache->index;\n    node->ref_count   = 0;\n\n    ftc_node_hash_link( node, cache );\n    ftc_node_mru_link( node, cache->manager );\n\n    {\n      FTC_Manager  manager = cache->manager;\n\n\n      manager->cur_weight += cache->clazz.node_weight( node, cache );\n\n      if ( manager->cur_weight >= manager->max_weight )\n      {\n        node->ref_count++;\n        FTC_Manager_Compress( manager );\n        node->ref_count--;\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  FTC_Cache_NewNode( FTC_Cache   cache,\n                     FT_PtrDist  hash,\n                     FT_Pointer  query,\n                     FTC_Node   *anode )\n  {\n    FT_Error  error;\n    FTC_Node  node;\n\n\n    /*\n     * We use the FTC_CACHE_TRYLOOP macros to support out-of-memory\n     * errors (OOM) correctly, i.e., by flushing the cache progressively\n     * in order to make more room.\n     */\n\n    FTC_CACHE_TRYLOOP( cache )\n    {\n      error = cache->clazz.node_new( &node, query, cache );\n    }\n    FTC_CACHE_TRYLOOP_END( NULL );\n\n    if ( error )\n      node = NULL;\n    else\n    {\n     /* don't assume that the cache has the same number of buckets, since\n      * our allocation request might have triggered global cache flushing\n      */\n      ftc_cache_add( cache, hash, node );\n    }\n\n    *anode = node;\n    return error;\n  }\n\n\n#ifndef FTC_INLINE\n\n  FT_LOCAL_DEF( FT_Error )\n  FTC_Cache_Lookup( FTC_Cache   cache,\n                    FT_PtrDist  hash,\n                    FT_Pointer  query,\n                    FTC_Node   *anode )\n  {\n    FTC_Node*  bucket;\n    FTC_Node*  pnode;\n    FTC_Node   node;\n    FT_Error   error        = FT_Err_Ok;\n    FT_Bool    list_changed = FALSE;\n\n    FTC_Node_CompareFunc  compare = cache->clazz.node_compare;\n\n\n    if ( cache == NULL || anode == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    /* Go to the `top' node of the list sharing same masked hash */\n    bucket = pnode = FTC_NODE__TOP_FOR_HASH( cache, hash );\n\n    /* Lookup a node with exactly same hash and queried properties.  */\n    /* NOTE: _nodcomp() may change the linked list to reduce memory. */\n    for (;;)\n    {\n      node = *pnode;\n      if ( node == NULL )\n        goto NewNode;\n\n      if ( node->hash == hash                           &&\n           compare( node, query, cache, &list_changed ) )\n        break;\n\n      pnode = &node->link;\n    }\n\n    if ( list_changed )\n    {\n      /* Update bucket by modified linked list */\n      bucket = pnode = FTC_NODE__TOP_FOR_HASH( cache, hash );\n\n      /* Update pnode by modified linked list */\n      while ( *pnode != node )\n      {\n        if ( *pnode == NULL )\n        {\n          FT_ERROR(( \"FTC_Cache_Lookup: oops!!!  node missing\\n\" ));\n          goto NewNode;\n        }\n        else\n          pnode = &((*pnode)->link);\n      }\n    }\n\n    /* Reorder the list to move the found node to the `top' */\n    if ( node != *bucket )\n    {\n      *pnode     = node->link;\n      node->link = *bucket;\n      *bucket    = node;\n    }\n\n    /* move to head of MRU list */\n    {\n      FTC_Manager  manager = cache->manager;\n\n\n      if ( node != manager->nodes_list )\n        ftc_node_mru_up( node, manager );\n    }\n    *anode = node;\n\n    return error;\n\n  NewNode:\n    return FTC_Cache_NewNode( cache, hash, query, anode );\n  }\n\n#endif /* !FTC_INLINE */\n\n\n  FT_LOCAL_DEF( void )\n  FTC_Cache_RemoveFaceID( FTC_Cache   cache,\n                          FTC_FaceID  face_id )\n  {\n    FT_UFast     i, count;\n    FTC_Manager  manager = cache->manager;\n    FTC_Node     frees   = NULL;\n\n\n    count = cache->p + cache->mask + 1;\n    for ( i = 0; i < count; i++ )\n    {\n      FTC_Node*  bucket = cache->buckets + i;\n      FTC_Node*  pnode  = bucket;\n\n\n      for ( ;; )\n      {\n        FTC_Node  node = *pnode;\n        FT_Bool   list_changed = FALSE;\n\n\n        if ( node == NULL )\n          break;\n\n        if ( cache->clazz.node_remove_faceid( node, face_id,\n                                              cache, &list_changed ) )\n        {\n          *pnode     = node->link;\n          node->link = frees;\n          frees      = node;\n        }\n        else\n          pnode = &node->link;\n      }\n    }\n\n    /* remove all nodes in the free list */\n    while ( frees )\n    {\n      FTC_Node  node;\n\n\n      node  = frees;\n      frees = node->link;\n\n      manager->cur_weight -= cache->clazz.node_weight( node, cache );\n      ftc_node_mru_unlink( node, manager );\n\n      cache->clazz.node_free( node, cache );\n\n      cache->slack++;\n    }\n\n    ftc_cache_resize( cache );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftccache.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftccache.h                                                             */\n/*                                                                         */\n/*    FreeType internal cache interface (specification).                   */\n/*                                                                         */\n/*  Copyright 2000-2007, 2009-2011, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCCACHE_H__\n#define __FTCCACHE_H__\n\n\n#include \"ftcmru.h\"\n\nFT_BEGIN_HEADER\n\n#define _FTC_FACE_ID_HASH( i )                                                \\\n          ((FT_PtrDist)(( (FT_PtrDist)(i) >> 3 ) ^ ( (FT_PtrDist)(i) << 7 )))\n\n  /* handle to cache object */\n  typedef struct FTC_CacheRec_*  FTC_Cache;\n\n  /* handle to cache class */\n  typedef const struct FTC_CacheClassRec_*  FTC_CacheClass;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                   CACHE NODE DEFINITIONS                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Each cache controls one or more cache nodes.  Each node is part of    */\n  /* the global_lru list of the manager.  Its `data' field however is used */\n  /* as a reference count for now.                                         */\n  /*                                                                       */\n  /* A node can be anything, depending on the type of information held by  */\n  /* the cache.  It can be an individual glyph image, a set of bitmaps     */\n  /* glyphs for a given size, some metrics, etc.                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /* structure size should be 20 bytes on 32-bits machines */\n  typedef struct  FTC_NodeRec_\n  {\n    FTC_MruNodeRec  mru;          /* circular mru list pointer           */\n    FTC_Node        link;         /* used for hashing                    */\n    FT_PtrDist      hash;         /* used for hashing too                */\n    FT_UShort       cache_index;  /* index of cache the node belongs to  */\n    FT_Short        ref_count;    /* reference count for this node       */\n\n  } FTC_NodeRec;\n\n\n#define FTC_NODE( x )    ( (FTC_Node)(x) )\n#define FTC_NODE_P( x )  ( (FTC_Node*)(x) )\n\n#define FTC_NODE__NEXT( x )  FTC_NODE( (x)->mru.next )\n#define FTC_NODE__PREV( x )  FTC_NODE( (x)->mru.prev )\n\n#ifdef FTC_INLINE\n#define FTC_NODE__TOP_FOR_HASH( cache, hash )                     \\\n        ( ( cache )->buckets +                                    \\\n            ( ( ( ( hash ) &   ( cache )->mask ) < ( cache )->p ) \\\n              ? ( ( hash ) & ( ( cache )->mask * 2 + 1 ) )        \\\n              : ( ( hash ) &   ( cache )->mask ) ) )\n#else\n  FT_LOCAL( FTC_Node* )\n  ftc_get_top_node_for_hash( FTC_Cache   cache,\n                             FT_PtrDist  hash );\n#define FTC_NODE__TOP_FOR_HASH( cache, hash )            \\\n        ftc_get_top_node_for_hash( ( cache ), ( hash ) )\n#endif\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n  FT_BASE( void )\n  ftc_node_destroy( FTC_Node     node,\n                    FTC_Manager  manager );\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       CACHE DEFINITIONS                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* initialize a new cache node */\n  typedef FT_Error\n  (*FTC_Node_NewFunc)( FTC_Node    *pnode,\n                       FT_Pointer   query,\n                       FTC_Cache    cache );\n\n  typedef FT_Offset\n  (*FTC_Node_WeightFunc)( FTC_Node   node,\n                          FTC_Cache  cache );\n\n  /* compare a node to a given key pair */\n  typedef FT_Bool\n  (*FTC_Node_CompareFunc)( FTC_Node    node,\n                           FT_Pointer  key,\n                           FTC_Cache   cache,\n                           FT_Bool*    list_changed );\n\n\n  typedef void\n  (*FTC_Node_FreeFunc)( FTC_Node   node,\n                        FTC_Cache  cache );\n\n  typedef FT_Error\n  (*FTC_Cache_InitFunc)( FTC_Cache  cache );\n\n  typedef void\n  (*FTC_Cache_DoneFunc)( FTC_Cache  cache );\n\n\n  typedef struct  FTC_CacheClassRec_\n  {\n    FTC_Node_NewFunc      node_new;\n    FTC_Node_WeightFunc   node_weight;\n    FTC_Node_CompareFunc  node_compare;\n    FTC_Node_CompareFunc  node_remove_faceid;\n    FTC_Node_FreeFunc     node_free;\n\n    FT_Offset             cache_size;\n    FTC_Cache_InitFunc    cache_init;\n    FTC_Cache_DoneFunc    cache_done;\n\n  } FTC_CacheClassRec;\n\n\n  /* each cache really implements a dynamic hash table to manage its nodes */\n  typedef struct  FTC_CacheRec_\n  {\n    FT_UFast           p;\n    FT_UFast           mask;\n    FT_Long            slack;\n    FTC_Node*          buckets;\n\n    FTC_CacheClassRec  clazz;       /* local copy, for speed  */\n\n    FTC_Manager        manager;\n    FT_Memory          memory;\n    FT_UInt            index;       /* in manager's table     */\n\n    FTC_CacheClass     org_class;   /* original class pointer */\n\n  } FTC_CacheRec;\n\n\n#define FTC_CACHE( x )    ( (FTC_Cache)(x) )\n#define FTC_CACHE_P( x )  ( (FTC_Cache*)(x) )\n\n\n  /* default cache initialize */\n  FT_LOCAL( FT_Error )\n  FTC_Cache_Init( FTC_Cache  cache );\n\n  /* default cache finalizer */\n  FT_LOCAL( void )\n  FTC_Cache_Done( FTC_Cache  cache );\n\n  /* Call this function to look up the cache.  If no corresponding\n   * node is found, a new one is automatically created.  This function\n   * is capable of flushing the cache adequately to make room for the\n   * new cache object.\n   */\n\n#ifndef FTC_INLINE\n  FT_LOCAL( FT_Error )\n  FTC_Cache_Lookup( FTC_Cache   cache,\n                    FT_PtrDist  hash,\n                    FT_Pointer  query,\n                    FTC_Node   *anode );\n#endif\n\n  FT_LOCAL( FT_Error )\n  FTC_Cache_NewNode( FTC_Cache   cache,\n                     FT_PtrDist  hash,\n                     FT_Pointer  query,\n                     FTC_Node   *anode );\n\n  /* Remove all nodes that relate to a given face_id.  This is useful\n   * when un-installing fonts.  Note that if a cache node relates to\n   * the face_id but is locked (i.e., has `ref_count > 0'), the node\n   * will _not_ be destroyed, but its internal face_id reference will\n   * be modified.\n   *\n   * The final result will be that the node will never come back\n   * in further lookup requests, and will be flushed on demand from\n   * the cache normally when its reference count reaches 0.\n   */\n  FT_LOCAL( void )\n  FTC_Cache_RemoveFaceID( FTC_Cache   cache,\n                          FTC_FaceID  face_id );\n\n\n#ifdef FTC_INLINE\n\n#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \\\n  FT_BEGIN_STMNT                                                         \\\n    FTC_Node             *_bucket, *_pnode, _node;                       \\\n    FTC_Cache             _cache   = FTC_CACHE(cache);                   \\\n    FT_PtrDist            _hash    = (FT_PtrDist)(hash);                 \\\n    FTC_Node_CompareFunc  _nodcomp = (FTC_Node_CompareFunc)(nodecmp);    \\\n    FT_Bool               _list_changed = FALSE;                         \\\n                                                                         \\\n                                                                         \\\n    error = FT_Err_Ok;                                                   \\\n    node  = NULL;                                                        \\\n                                                                         \\\n    /* Go to the `top' node of the list sharing same masked hash */      \\\n    _bucket = _pnode = FTC_NODE__TOP_FOR_HASH( _cache, _hash );          \\\n                                                                         \\\n    /* Look up a node with identical hash and queried properties.    */  \\\n    /* NOTE: _nodcomp() may change the linked list to reduce memory. */  \\\n    for (;;)                                                             \\\n    {                                                                    \\\n      _node = *_pnode;                                                   \\\n      if ( _node == NULL )                                               \\\n        goto _NewNode;                                                   \\\n                                                                         \\\n      if ( _node->hash == _hash                             &&           \\\n           _nodcomp( _node, query, _cache, &_list_changed ) )            \\\n        break;                                                           \\\n                                                                         \\\n      _pnode = &_node->link;                                             \\\n    }                                                                    \\\n                                                                         \\\n    if ( _list_changed )                                                 \\\n    {                                                                    \\\n      /* Update _bucket by possibly modified linked list */              \\\n      _bucket = _pnode = FTC_NODE__TOP_FOR_HASH( _cache, _hash );        \\\n                                                                         \\\n      /* Update _pnode by possibly modified linked list */               \\\n      while ( *_pnode != _node )                                         \\\n      {                                                                  \\\n        if ( *_pnode == NULL )                                           \\\n        {                                                                \\\n          FT_ERROR(( \"FTC_CACHE_LOOKUP_CMP: oops!!! node missing\\n\" ));  \\\n          goto _NewNode;                                                 \\\n        }                                                                \\\n        else                                                             \\\n          _pnode = &((*_pnode)->link);                                   \\\n      }                                                                  \\\n    }                                                                    \\\n                                                                         \\\n    /* Reorder the list to move the found node to the `top' */           \\\n    if ( _node != *_bucket )                                             \\\n    {                                                                    \\\n      *_pnode     = _node->link;                                         \\\n      _node->link = *_bucket;                                            \\\n      *_bucket    = _node;                                               \\\n    }                                                                    \\\n                                                                         \\\n    /* Update MRU list */                                                \\\n    {                                                                    \\\n      FTC_Manager  _manager = _cache->manager;                           \\\n      void*        _nl      = &_manager->nodes_list;                     \\\n                                                                         \\\n                                                                         \\\n      if ( _node != _manager->nodes_list )                               \\\n        FTC_MruNode_Up( (FTC_MruNode*)_nl,                               \\\n                        (FTC_MruNode)_node );                            \\\n    }                                                                    \\\n    goto _Ok;                                                            \\\n                                                                         \\\n  _NewNode:                                                              \\\n    error = FTC_Cache_NewNode( _cache, _hash, query, &_node );           \\\n                                                                         \\\n  _Ok:                                                                   \\\n    node = _node;                                                        \\\n  FT_END_STMNT\n\n#else /* !FTC_INLINE */\n\n#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \\\n  FT_BEGIN_STMNT                                                         \\\n    error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query,           \\\n                              (FTC_Node*)&(node) );                      \\\n  FT_END_STMNT\n\n#endif /* !FTC_INLINE */\n\n\n  /*\n   * This macro, together with FTC_CACHE_TRYLOOP_END, defines a retry\n   * loop to flush the cache repeatedly in case of memory overflows.\n   *\n   * It is used when creating a new cache node, or within a lookup\n   * that needs to allocate data (e.g. the sbit cache lookup).\n   *\n   * Example:\n   *\n   *   {\n   *     FTC_CACHE_TRYLOOP( cache )\n   *       error = load_data( ... );\n   *     FTC_CACHE_TRYLOOP_END()\n   *   }\n   *\n   */\n#define FTC_CACHE_TRYLOOP( cache )                           \\\n  {                                                          \\\n    FTC_Manager  _try_manager = FTC_CACHE( cache )->manager; \\\n    FT_UInt      _try_count   = 4;                           \\\n                                                             \\\n                                                             \\\n    for (;;)                                                 \\\n    {                                                        \\\n      FT_UInt  _try_done;\n\n\n#define FTC_CACHE_TRYLOOP_END( list_changed )                     \\\n      if ( !error || FT_ERR_NEQ( error, Out_Of_Memory ) )         \\\n        break;                                                    \\\n                                                                  \\\n      _try_done = FTC_Manager_FlushN( _try_manager, _try_count ); \\\n      if ( _try_done > 0 && ( list_changed ) )                    \\\n        *(FT_Bool*)( list_changed ) = TRUE;                       \\\n                                                                  \\\n      if ( _try_done == 0 )                                       \\\n        break;                                                    \\\n                                                                  \\\n      if ( _try_done == _try_count )                              \\\n      {                                                           \\\n        _try_count *= 2;                                          \\\n        if ( _try_count < _try_done              ||               \\\n            _try_count > _try_manager->num_nodes )                \\\n          _try_count = _try_manager->num_nodes;                   \\\n      }                                                           \\\n    }                                                             \\\n  }\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __FTCCACHE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftccback.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftccback.h                                                             */\n/*                                                                         */\n/*    Callback functions of the caching sub-system (specification only).   */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006, 2011 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#ifndef __FTCCBACK_H__\n#define __FTCCBACK_H__\n\n#include <ft2build.h>\n#include FT_CACHE_H\n#include \"ftcmru.h\"\n#include \"ftcimage.h\"\n#include \"ftcmanag.h\"\n#include \"ftcglyph.h\"\n#include \"ftcsbits.h\"\n\n\n  FT_LOCAL( void )\n  ftc_inode_free( FTC_Node   inode,\n                  FTC_Cache  cache );\n\n  FT_LOCAL( FT_Error )\n  ftc_inode_new( FTC_Node   *pinode,\n                 FT_Pointer  gquery,\n                 FTC_Cache   cache );\n\n  FT_LOCAL( FT_Offset )\n  ftc_inode_weight( FTC_Node   inode,\n                    FTC_Cache  cache );\n\n\n  FT_LOCAL( void )\n  ftc_snode_free( FTC_Node   snode,\n                  FTC_Cache  cache );\n\n  FT_LOCAL( FT_Error )\n  ftc_snode_new( FTC_Node   *psnode,\n                 FT_Pointer  gquery,\n                 FTC_Cache   cache );\n\n  FT_LOCAL( FT_Offset )\n  ftc_snode_weight( FTC_Node   snode,\n                    FTC_Cache  cache );\n\n  FT_LOCAL( FT_Bool )\n  ftc_snode_compare( FTC_Node    snode,\n                     FT_Pointer  gquery,\n                     FTC_Cache   cache,\n                     FT_Bool*    list_changed );\n\n\n  FT_LOCAL( FT_Bool )\n  ftc_gnode_compare( FTC_Node    gnode,\n                     FT_Pointer  gquery,\n                     FTC_Cache   cache,\n                     FT_Bool*    list_changed );\n\n\n  FT_LOCAL( FT_Error )\n  ftc_gcache_init( FTC_Cache  cache );\n\n  FT_LOCAL( void )\n  ftc_gcache_done( FTC_Cache  cache );\n\n\n  FT_LOCAL( FT_Error )\n  ftc_cache_init( FTC_Cache  cache );\n\n  FT_LOCAL( void )\n  ftc_cache_done( FTC_Cache  cache );\n\n#ifndef FT_CONFIG_OPTION_OLD_INTERNALS\n  FT_LOCAL( void )\n  ftc_node_destroy( FTC_Node     node,\n                    FTC_Manager  manager );\n#endif\n\n#endif /* __FTCCBACK_H__ */\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftccmap.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftccmap.c                                                              */\n/*                                                                         */\n/*    FreeType CharMap cache (body)                                        */\n/*                                                                         */\n/*  Copyright 2000-2012 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_CACHE_H\n#include \"ftcmanag.h\"\n#include FT_INTERNAL_MEMORY_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n\n#include \"ftccback.h\"\n#include \"ftcerror.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cache\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  typedef enum  FTC_OldCMapType_\n  {\n    FTC_OLD_CMAP_BY_INDEX    = 0,\n    FTC_OLD_CMAP_BY_ENCODING = 1,\n    FTC_OLD_CMAP_BY_ID       = 2\n\n  } FTC_OldCMapType;\n\n\n  typedef struct  FTC_OldCMapIdRec_\n  {\n    FT_UInt  platform;\n    FT_UInt  encoding;\n\n  } FTC_OldCMapIdRec, *FTC_OldCMapId;\n\n\n  typedef struct  FTC_OldCMapDescRec_\n  {\n    FTC_FaceID       face_id;\n    FTC_OldCMapType  type;\n\n    union\n    {\n      FT_UInt           index;\n      FT_Encoding       encoding;\n      FTC_OldCMapIdRec  id;\n\n    } u;\n\n  } FTC_OldCMapDescRec, *FTC_OldCMapDesc;\n\n#endif /* FT_CONFIG_OLD_INTERNALS */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Each FTC_CMapNode contains a simple array to map a range of character */\n  /* codes to equivalent glyph indices.                                    */\n  /*                                                                       */\n  /* For now, the implementation is very basic: Each node maps a range of  */\n  /* 128 consecutive character codes to their corresponding glyph indices. */\n  /*                                                                       */\n  /* We could do more complex things, but I don't think it is really very  */\n  /* useful.                                                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* number of glyph indices / character code per node */\n#define FTC_CMAP_INDICES_MAX  128\n\n  /* compute a query/node hash */\n#define FTC_CMAP_HASH( faceid, index, charcode )         \\\n          ( _FTC_FACE_ID_HASH( faceid ) + 211 * (index) + \\\n            ( (charcode) / FTC_CMAP_INDICES_MAX )      )\n\n  /* the charmap query */\n  typedef struct  FTC_CMapQueryRec_\n  {\n    FTC_FaceID  face_id;\n    FT_UInt     cmap_index;\n    FT_UInt32   char_code;\n\n  } FTC_CMapQueryRec, *FTC_CMapQuery;\n\n#define FTC_CMAP_QUERY( x )  ((FTC_CMapQuery)(x))\n#define FTC_CMAP_QUERY_HASH( x )                                         \\\n          FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->char_code )\n\n  /* the cmap cache node */\n  typedef struct  FTC_CMapNodeRec_\n  {\n    FTC_NodeRec  node;\n    FTC_FaceID   face_id;\n    FT_UInt      cmap_index;\n    FT_UInt32    first;                         /* first character in node */\n    FT_UInt16    indices[FTC_CMAP_INDICES_MAX]; /* array of glyph indices  */\n\n  } FTC_CMapNodeRec, *FTC_CMapNode;\n\n#define FTC_CMAP_NODE( x ) ( (FTC_CMapNode)( x ) )\n#define FTC_CMAP_NODE_HASH( x )                                      \\\n          FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->first )\n\n  /* if (indices[n] == FTC_CMAP_UNKNOWN), we assume that the corresponding */\n  /* glyph indices haven't been queried through FT_Get_Glyph_Index() yet   */\n#define FTC_CMAP_UNKNOWN  (FT_UInt16)~0\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        CHARMAP NODES                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_CALLBACK_DEF( void )\n  ftc_cmap_node_free( FTC_Node   ftcnode,\n                      FTC_Cache  cache )\n  {\n    FTC_CMapNode  node   = (FTC_CMapNode)ftcnode;\n    FT_Memory     memory = cache->memory;\n\n\n    FT_FREE( node );\n  }\n\n\n  /* initialize a new cmap node */\n  FT_CALLBACK_DEF( FT_Error )\n  ftc_cmap_node_new( FTC_Node   *ftcanode,\n                     FT_Pointer  ftcquery,\n                     FTC_Cache   cache )\n  {\n    FTC_CMapNode  *anode  = (FTC_CMapNode*)ftcanode;\n    FTC_CMapQuery  query  = (FTC_CMapQuery)ftcquery;\n    FT_Error       error;\n    FT_Memory      memory = cache->memory;\n    FTC_CMapNode   node   = NULL;\n    FT_UInt        nn;\n\n\n    if ( !FT_NEW( node ) )\n    {\n      node->face_id    = query->face_id;\n      node->cmap_index = query->cmap_index;\n      node->first      = (query->char_code / FTC_CMAP_INDICES_MAX) *\n                         FTC_CMAP_INDICES_MAX;\n\n      for ( nn = 0; nn < FTC_CMAP_INDICES_MAX; nn++ )\n        node->indices[nn] = FTC_CMAP_UNKNOWN;\n    }\n\n    *anode = node;\n    return error;\n  }\n\n\n  /* compute the weight of a given cmap node */\n  FT_CALLBACK_DEF( FT_Offset )\n  ftc_cmap_node_weight( FTC_Node   cnode,\n                        FTC_Cache  cache )\n  {\n    FT_UNUSED( cnode );\n    FT_UNUSED( cache );\n\n    return sizeof ( *cnode );\n  }\n\n\n  /* compare a cmap node to a given query */\n  FT_CALLBACK_DEF( FT_Bool )\n  ftc_cmap_node_compare( FTC_Node    ftcnode,\n                         FT_Pointer  ftcquery,\n                         FTC_Cache   cache,\n                         FT_Bool*    list_changed )\n  {\n    FTC_CMapNode   node  = (FTC_CMapNode)ftcnode;\n    FTC_CMapQuery  query = (FTC_CMapQuery)ftcquery;\n    FT_UNUSED( cache );\n\n\n    if ( list_changed )\n      *list_changed = FALSE;\n    if ( node->face_id    == query->face_id    &&\n         node->cmap_index == query->cmap_index )\n    {\n      FT_UInt32  offset = (FT_UInt32)( query->char_code - node->first );\n\n\n      return FT_BOOL( offset < FTC_CMAP_INDICES_MAX );\n    }\n\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Bool )\n  ftc_cmap_node_remove_faceid( FTC_Node    ftcnode,\n                               FT_Pointer  ftcface_id,\n                               FTC_Cache   cache,\n                               FT_Bool*    list_changed )\n  {\n    FTC_CMapNode  node    = (FTC_CMapNode)ftcnode;\n    FTC_FaceID    face_id = (FTC_FaceID)ftcface_id;\n    FT_UNUSED( cache );\n\n\n    if ( list_changed )\n      *list_changed = FALSE;\n    return FT_BOOL( node->face_id == face_id );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    GLYPH IMAGE CACHE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FTC_CacheClassRec  ftc_cmap_cache_class =\n  {\n    ftc_cmap_node_new,\n    ftc_cmap_node_weight,\n    ftc_cmap_node_compare,\n    ftc_cmap_node_remove_faceid,\n    ftc_cmap_node_free,\n\n    sizeof ( FTC_CacheRec ),\n    ftc_cache_init,\n    ftc_cache_done,\n  };\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_CMapCache_New( FTC_Manager     manager,\n                     FTC_CMapCache  *acache )\n  {\n    return FTC_Manager_RegisterCache( manager,\n                                      &ftc_cmap_cache_class,\n                                      FTC_CACHE_P( acache ) );\n  }\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  /*\n   *  Unfortunately, it is not possible to support binary backwards\n   *  compatibility in the cmap cache.  The FTC_CMapCache_Lookup signature\n   *  changes were too deep, and there is no clever hackish way to detect\n   *  what kind of structure we are being passed.\n   *\n   *  On the other hand it seems that no production code is using this\n   *  function on Unix distributions.\n   */\n\n#endif\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_UInt )\n  FTC_CMapCache_Lookup( FTC_CMapCache  cmap_cache,\n                        FTC_FaceID     face_id,\n                        FT_Int         cmap_index,\n                        FT_UInt32      char_code )\n  {\n    FTC_Cache         cache = FTC_CACHE( cmap_cache );\n    FTC_CMapQueryRec  query;\n    FTC_Node          node;\n    FT_Error          error;\n    FT_UInt           gindex = 0;\n    FT_PtrDist        hash;\n    FT_Int            no_cmap_change = 0;\n\n\n    if ( cmap_index < 0 )\n    {\n      /* Treat a negative cmap index as a special value, meaning that you */\n      /* don't want to change the FT_Face's character map through this    */\n      /* call.  This can be useful if the face requester callback already */\n      /* sets the face's charmap to the appropriate value.                */\n\n      no_cmap_change = 1;\n      cmap_index     = 0;\n    }\n\n    if ( !cache )\n    {\n      FT_TRACE0(( \"FTC_CMapCache_Lookup: bad arguments, returning 0\\n\" ));\n      return 0;\n    }\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n    /*\n     * If cmap_index is greater than the maximum number of cachable\n     * charmaps, we assume the request is from a legacy rogue client\n     * using old internal header. See include/config/ftoption.h.\n     */\n    if ( cmap_index > FT_MAX_CHARMAP_CACHEABLE && !no_cmap_change )\n    {\n      FTC_OldCMapDesc  desc = (FTC_OldCMapDesc) face_id;\n\n\n      char_code     = (FT_UInt32)cmap_index;\n      query.face_id = desc->face_id;\n\n\n      switch ( desc->type )\n      {\n      case FTC_OLD_CMAP_BY_INDEX:\n        query.cmap_index = desc->u.index;\n        query.char_code  = (FT_UInt32)cmap_index;\n        break;\n\n      case FTC_OLD_CMAP_BY_ENCODING:\n        {\n          FT_Face  face;\n\n\n          error = FTC_Manager_LookupFace( cache->manager, desc->face_id,\n                                          &face );\n          if ( error )\n            return 0;\n\n          FT_Select_Charmap( face, desc->u.encoding );\n\n          return FT_Get_Char_Index( face, char_code );\n        }\n\n      default:\n        return 0;\n      }\n    }\n    else\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    {\n      query.face_id    = face_id;\n      query.cmap_index = (FT_UInt)cmap_index;\n      query.char_code  = char_code;\n    }\n\n    hash = FTC_CMAP_HASH( face_id, cmap_index, char_code );\n\n#if 1\n    FTC_CACHE_LOOKUP_CMP( cache, ftc_cmap_node_compare, hash, &query,\n                          node, error );\n#else\n    error = FTC_Cache_Lookup( cache, hash, &query, &node );\n#endif\n    if ( error )\n      goto Exit;\n\n    FT_ASSERT( (FT_UInt)( char_code - FTC_CMAP_NODE( node )->first ) <\n                FTC_CMAP_INDICES_MAX );\n\n    /* something rotten can happen with rogue clients */\n    if ( (FT_UInt)( char_code - FTC_CMAP_NODE( node )->first >=\n                    FTC_CMAP_INDICES_MAX ) )\n      return 0; /* XXX: should return appropriate error */\n\n    gindex = FTC_CMAP_NODE( node )->indices[char_code -\n                                            FTC_CMAP_NODE( node )->first];\n    if ( gindex == FTC_CMAP_UNKNOWN )\n    {\n      FT_Face  face;\n\n\n      gindex = 0;\n\n      error = FTC_Manager_LookupFace( cache->manager,\n                                      FTC_CMAP_NODE( node )->face_id,\n                                      &face );\n      if ( error )\n        goto Exit;\n\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n      /* something rotten can happen with rogue clients */\n      if ( cmap_index > FT_MAX_CHARMAP_CACHEABLE )\n        return 0; /* XXX: should return appropriate error */\n#endif\n\n      if ( (FT_UInt)cmap_index < (FT_UInt)face->num_charmaps )\n      {\n        FT_CharMap  old, cmap  = NULL;\n\n\n        old  = face->charmap;\n        cmap = face->charmaps[cmap_index];\n\n        if ( old != cmap && !no_cmap_change )\n          FT_Set_Charmap( face, cmap );\n\n        gindex = FT_Get_Char_Index( face, char_code );\n\n        if ( old != cmap && !no_cmap_change )\n          FT_Set_Charmap( face, old );\n      }\n\n      FTC_CMAP_NODE( node )->indices[char_code -\n                                     FTC_CMAP_NODE( node )->first]\n        = (FT_UShort)gindex;\n    }\n\n  Exit:\n    return gindex;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcerror.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcerror.h                                                             */\n/*                                                                         */\n/*    Caching sub-system error codes (specification only).                 */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the caching sub-system error enumeration  */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __FTCERROR_H__\n#define __FTCERROR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  FTC_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Cache\n\n#include FT_ERRORS_H\n\n#endif /* __FTCERROR_H__ */\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcglyph.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcglyph.c                                                             */\n/*                                                                         */\n/*    FreeType Glyph Image (FT_Glyph) cache (body).                        */\n/*                                                                         */\n/*  Copyright 2000-2001, 2003, 2004, 2006, 2009, 2011 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_CACHE_H\n#include \"ftcglyph.h\"\n#include FT_ERRORS_H\n\n#include \"ftccback.h\"\n#include \"ftcerror.h\"\n\n\n  /* create a new chunk node, setting its cache index and ref count */\n  FT_LOCAL_DEF( void )\n  FTC_GNode_Init( FTC_GNode   gnode,\n                  FT_UInt     gindex,\n                  FTC_Family  family )\n  {\n    gnode->family = family;\n    gnode->gindex = gindex;\n    family->num_nodes++;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_GNode_UnselectFamily( FTC_GNode  gnode,\n                            FTC_Cache  cache )\n  {\n    FTC_Family  family = gnode->family;\n\n\n    gnode->family = NULL;\n    if ( family && --family->num_nodes == 0 )\n      FTC_FAMILY_FREE( family, cache );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_GNode_Done( FTC_GNode  gnode,\n                  FTC_Cache  cache )\n  {\n    /* finalize the node */\n    gnode->gindex = 0;\n\n    FTC_GNode_UnselectFamily( gnode, cache );\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  ftc_gnode_compare( FTC_Node    ftcgnode,\n                     FT_Pointer  ftcgquery,\n                     FTC_Cache   cache,\n                     FT_Bool*    list_changed )\n  {\n    FTC_GNode   gnode  = (FTC_GNode)ftcgnode;\n    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;\n    FT_UNUSED( cache );\n\n\n    if ( list_changed )\n      *list_changed = FALSE;\n    return FT_BOOL( gnode->family == gquery->family &&\n                    gnode->gindex == gquery->gindex );\n  }\n\n\n#ifdef FTC_INLINE\n\n  FT_LOCAL_DEF( FT_Bool )\n  FTC_GNode_Compare( FTC_GNode   gnode,\n                     FTC_GQuery  gquery,\n                     FTC_Cache   cache,\n                     FT_Bool*    list_changed )\n  {\n    return ftc_gnode_compare( FTC_NODE( gnode ), gquery,\n                              cache, list_changed );\n  }\n\n#endif\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      CHUNK SETS                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  FTC_Family_Init( FTC_Family  family,\n                   FTC_Cache   cache )\n  {\n    FTC_GCacheClass  clazz = FTC_CACHE__GCACHE_CLASS( cache );\n\n\n    family->clazz     = clazz->family_class;\n    family->num_nodes = 0;\n    family->cache     = cache;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  ftc_gcache_init( FTC_Cache  ftccache )\n  {\n    FTC_GCache  cache = (FTC_GCache)ftccache;\n    FT_Error    error;\n\n\n    error = FTC_Cache_Init( FTC_CACHE( cache ) );\n    if ( !error )\n    {\n      FTC_GCacheClass   clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class;\n\n      FTC_MruList_Init( &cache->families,\n                        clazz->family_class,\n                        0,  /* no maximum here! */\n                        cache,\n                        FTC_CACHE( cache )->memory );\n    }\n\n    return error;\n  }\n\n\n#if 0\n\n  FT_LOCAL_DEF( FT_Error )\n  FTC_GCache_Init( FTC_GCache  cache )\n  {\n    return ftc_gcache_init( FTC_CACHE( cache ) );\n  }\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( void )\n  ftc_gcache_done( FTC_Cache  ftccache )\n  {\n    FTC_GCache  cache = (FTC_GCache)ftccache;\n\n\n    FTC_Cache_Done( (FTC_Cache)cache );\n    FTC_MruList_Done( &cache->families );\n  }\n\n\n#if 0\n\n  FT_LOCAL_DEF( void )\n  FTC_GCache_Done( FTC_GCache  cache )\n  {\n    ftc_gcache_done( FTC_CACHE( cache ) );\n  }\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  FTC_GCache_New( FTC_Manager       manager,\n                  FTC_GCacheClass   clazz,\n                  FTC_GCache       *acache )\n  {\n    return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz,\n                                      (FTC_Cache*)acache );\n  }\n\n\n#ifndef FTC_INLINE\n\n  FT_LOCAL_DEF( FT_Error )\n  FTC_GCache_Lookup( FTC_GCache   cache,\n                     FT_PtrDist   hash,\n                     FT_UInt      gindex,\n                     FTC_GQuery   query,\n                     FTC_Node    *anode )\n  {\n    FT_Error  error;\n\n\n    query->gindex = gindex;\n\n    FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error );\n    if ( !error )\n    {\n      FTC_Family  family = query->family;\n\n\n      /* prevent the family from being destroyed too early when an        */\n      /* out-of-memory condition occurs during glyph node initialization. */\n      family->num_nodes++;\n\n      error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode );\n\n      if ( --family->num_nodes == 0 )\n        FTC_FAMILY_FREE( family, cache );\n    }\n    return error;\n  }\n\n#endif /* !FTC_INLINE */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcglyph.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcglyph.h                                                             */\n/*                                                                         */\n/*    FreeType abstract glyph cache (specification).                       */\n/*                                                                         */\n/*  Copyright 2000-2001, 2003, 2004, 2006, 2007, 2011 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*\n   *\n   *  FTC_GCache is an _abstract_ cache object optimized to store glyph\n   *  data.  It works as follows:\n   *\n   *   - It manages FTC_GNode objects. Each one of them can hold one or more\n   *     glyph `items'.  Item types are not specified in the FTC_GCache but\n   *     in classes that extend it.\n   *\n   *   - Glyph attributes, like face ID, character size, render mode, etc.,\n   *     can be grouped into abstract `glyph families'.  This avoids storing\n   *     the attributes within the FTC_GCache, since it is likely that many\n   *     FTC_GNodes will belong to the same family in typical uses.\n   *\n   *   - Each FTC_GNode is thus an FTC_Node with two additional fields:\n   *\n   *       * gindex: A glyph index, or the first index in a glyph range.\n   *       * family: A pointer to a glyph `family'.\n   *\n   *   - Family types are not fully specific in the FTC_Family type, but\n   *     by classes that extend it.\n   *\n   *  Note that both FTC_ImageCache and FTC_SBitCache extend FTC_GCache.\n   *  They share an FTC_Family sub-class called FTC_BasicFamily which is\n   *  used to store the following data: face ID, pixel/point sizes, load\n   *  flags.  For more details see the file `src/cache/ftcbasic.c'.\n   *\n   *  Client applications can extend FTC_GNode with their own FTC_GNode\n   *  and FTC_Family sub-classes to implement more complex caches (e.g.,\n   *  handling automatic synthesis, like obliquing & emboldening, colored\n   *  glyphs, etc.).\n   *\n   *  See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and\n   *  `ftcsbits.h', which both extend FTC_GCache with additional\n   *  optimizations.\n   *\n   *  A typical FTC_GCache implementation must provide at least the\n   *  following:\n   *\n   *  - FTC_GNode sub-class, e.g. MyNode, with relevant methods:\n   *        my_node_new            (must call FTC_GNode_Init)\n   *        my_node_free           (must call FTC_GNode_Done)\n   *        my_node_compare        (must call FTC_GNode_Compare)\n   *        my_node_remove_faceid  (must call ftc_gnode_unselect in case\n   *                                of match)\n   *\n   *  - FTC_Family sub-class, e.g. MyFamily, with relevant methods:\n   *        my_family_compare\n   *        my_family_init\n   *        my_family_reset (optional)\n   *        my_family_done\n   *\n   *  - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query\n   *    data.\n   *\n   *  - Constant structures for a FTC_GNodeClass.\n   *\n   *  - MyCacheNew() can be implemented easily as a call to the convenience\n   *    function FTC_GCache_New.\n   *\n   *  - MyCacheLookup with a call to FTC_GCache_Lookup.  This function will\n   *    automatically:\n   *\n   *    - Search for the corresponding family in the cache, or create\n   *      a new one if necessary.  Put it in FTC_GQUERY(myquery).family\n   *\n   *    - Call FTC_Cache_Lookup.\n   *\n   *    If it returns NULL, you should create a new node, then call\n   *    ftc_cache_add as usual.\n   */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Important: The functions defined in this file are only used to        */\n  /*            implement an abstract glyph cache class.  You need to      */\n  /*            provide additional logic to implement a complete cache.    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*********                                                       *********/\n  /*********             WARNING, THIS IS BETA CODE.               *********/\n  /*********                                                       *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#ifndef __FTCGLYPH_H__\n#define __FTCGLYPH_H__\n\n\n#include <ft2build.h>\n#include \"ftcmanag.h\"\n\n\nFT_BEGIN_HEADER\n\n\n /*\n  *  We can group glyphs into `families'.  Each family correspond to a\n  *  given face ID, character size, transform, etc.\n  *\n  *  Families are implemented as MRU list nodes.  They are\n  *  reference-counted.\n  */\n\n  typedef struct  FTC_FamilyRec_\n  {\n    FTC_MruNodeRec    mrunode;\n    FT_UInt           num_nodes; /* current number of nodes in this family */\n    FTC_Cache         cache;\n    FTC_MruListClass  clazz;\n\n  } FTC_FamilyRec, *FTC_Family;\n\n#define  FTC_FAMILY(x)    ( (FTC_Family)(x) )\n#define  FTC_FAMILY_P(x)  ( (FTC_Family*)(x) )\n\n\n  typedef struct  FTC_GNodeRec_\n  {\n    FTC_NodeRec      node;\n    FTC_Family       family;\n    FT_UInt          gindex;\n\n  } FTC_GNodeRec, *FTC_GNode;\n\n#define FTC_GNODE( x )    ( (FTC_GNode)(x) )\n#define FTC_GNODE_P( x )  ( (FTC_GNode*)(x) )\n\n\n  typedef struct  FTC_GQueryRec_\n  {\n    FT_UInt      gindex;\n    FTC_Family   family;\n\n  } FTC_GQueryRec, *FTC_GQuery;\n\n#define FTC_GQUERY( x )  ( (FTC_GQuery)(x) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* These functions are exported so that they can be called from          */\n  /* user-provided cache classes; otherwise, they are really part of the   */\n  /* cache sub-system internals.                                           */\n  /*                                                                       */\n\n  /* must be called by derived FTC_Node_InitFunc routines */\n  FT_LOCAL( void )\n  FTC_GNode_Init( FTC_GNode   node,\n                  FT_UInt     gindex,  /* glyph index for node */\n                  FTC_Family  family );\n\n#ifdef FTC_INLINE\n\n  /* returns TRUE iff the query's glyph index correspond to the node;  */\n  /* this assumes that the `family' and `hash' fields of the query are */\n  /* already correctly set                                             */\n  FT_LOCAL( FT_Bool )\n  FTC_GNode_Compare( FTC_GNode   gnode,\n                     FTC_GQuery  gquery,\n                     FTC_Cache   cache,\n                     FT_Bool*    list_changed );\n\n#endif\n\n  /* call this function to clear a node's family -- this is necessary */\n  /* to implement the `node_remove_faceid' cache method correctly     */\n  FT_LOCAL( void )\n  FTC_GNode_UnselectFamily( FTC_GNode  gnode,\n                            FTC_Cache  cache );\n\n  /* must be called by derived FTC_Node_DoneFunc routines */\n  FT_LOCAL( void )\n  FTC_GNode_Done( FTC_GNode  node,\n                  FTC_Cache  cache );\n\n\n  FT_LOCAL( void )\n  FTC_Family_Init( FTC_Family  family,\n                   FTC_Cache   cache );\n\n  typedef struct FTC_GCacheRec_\n  {\n    FTC_CacheRec    cache;\n    FTC_MruListRec  families;\n\n  } FTC_GCacheRec, *FTC_GCache;\n\n#define FTC_GCACHE( x )  ((FTC_GCache)(x))\n\n\n#if 0\n  /* can be used as @FTC_Cache_InitFunc */\n  FT_LOCAL( FT_Error )\n  FTC_GCache_Init( FTC_GCache  cache );\n#endif\n\n\n#if 0\n  /* can be used as @FTC_Cache_DoneFunc */\n  FT_LOCAL( void )\n  FTC_GCache_Done( FTC_GCache  cache );\n#endif\n\n\n  /* the glyph cache class adds fields for the family implementation */\n  typedef struct  FTC_GCacheClassRec_\n  {\n    FTC_CacheClassRec  clazz;\n    FTC_MruListClass   family_class;\n\n  } FTC_GCacheClassRec;\n\n  typedef const FTC_GCacheClassRec*   FTC_GCacheClass;\n\n#define FTC_GCACHE_CLASS( x )  ((FTC_GCacheClass)(x))\n\n#define FTC_CACHE__GCACHE_CLASS( x ) \\\n          FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class )\n#define FTC_CACHE__FAMILY_CLASS( x ) \\\n          ( (FTC_MruListClass)FTC_CACHE__GCACHE_CLASS( x )->family_class )\n\n\n  /* convenience function; use it instead of FTC_Manager_Register_Cache */\n  FT_LOCAL( FT_Error )\n  FTC_GCache_New( FTC_Manager       manager,\n                  FTC_GCacheClass   clazz,\n                  FTC_GCache       *acache );\n\n#ifndef FTC_INLINE\n  FT_LOCAL( FT_Error )\n  FTC_GCache_Lookup( FTC_GCache   cache,\n                     FT_PtrDist   hash,\n                     FT_UInt      gindex,\n                     FTC_GQuery   query,\n                     FTC_Node    *anode );\n#endif\n\n\n  /* */\n\n\n#define FTC_FAMILY_FREE( family, cache )                      \\\n          FTC_MruList_Remove( &FTC_GCACHE((cache))->families, \\\n                              (FTC_MruNode)(family) )\n\n\n#ifdef FTC_INLINE\n\n#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash,                \\\n                               gindex, query, node, error )                 \\\n  FT_BEGIN_STMNT                                                            \\\n    FTC_GCache               _gcache   = FTC_GCACHE( cache );               \\\n    FTC_GQuery               _gquery   = (FTC_GQuery)( query );             \\\n    FTC_MruNode_CompareFunc  _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \\\n    FTC_MruNode              _mrunode;                                      \\\n                                                                            \\\n                                                                            \\\n    _gquery->gindex = (gindex);                                             \\\n                                                                            \\\n    FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare,         \\\n                            _mrunode, error );                              \\\n    _gquery->family = FTC_FAMILY( _mrunode );                               \\\n    if ( !error )                                                           \\\n    {                                                                       \\\n      FTC_Family  _gqfamily = _gquery->family;                              \\\n                                                                            \\\n                                                                            \\\n      _gqfamily->num_nodes++;                                               \\\n                                                                            \\\n      FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error );     \\\n                                                                            \\\n      if ( --_gqfamily->num_nodes == 0 )                                    \\\n        FTC_FAMILY_FREE( _gqfamily, _gcache );                              \\\n    }                                                                       \\\n  FT_END_STMNT\n  /* */\n\n#else /* !FTC_INLINE */\n\n#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash,          \\\n                               gindex, query, node, error )           \\\n   FT_BEGIN_STMNT                                                     \\\n                                                                      \\\n     error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex,    \\\n                                FTC_GQUERY( query ), &node );         \\\n                                                                      \\\n   FT_END_STMNT\n\n#endif /* !FTC_INLINE */\n\n\nFT_END_HEADER\n\n\n#endif /* __FTCGLYPH_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcimage.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcimage.c                                                             */\n/*                                                                         */\n/*    FreeType Image cache (body).                                         */\n/*                                                                         */\n/*  Copyright 2000-2001, 2003, 2004, 2006, 2010 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_CACHE_H\n#include \"ftcimage.h\"\n#include FT_INTERNAL_MEMORY_H\n\n#include \"ftccback.h\"\n#include \"ftcerror.h\"\n\n\n  /* finalize a given glyph image node */\n  FT_LOCAL_DEF( void )\n  ftc_inode_free( FTC_Node   ftcinode,\n                  FTC_Cache  cache )\n  {\n    FTC_INode  inode = (FTC_INode)ftcinode;\n    FT_Memory  memory = cache->memory;\n\n\n    if ( inode->glyph )\n    {\n      FT_Done_Glyph( inode->glyph );\n      inode->glyph = NULL;\n    }\n\n    FTC_GNode_Done( FTC_GNODE( inode ), cache );\n    FT_FREE( inode );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_INode_Free( FTC_INode  inode,\n                  FTC_Cache  cache )\n  {\n    ftc_inode_free( FTC_NODE( inode ), cache );\n  }\n\n\n  /* initialize a new glyph image node */\n  FT_LOCAL_DEF( FT_Error )\n  FTC_INode_New( FTC_INode   *pinode,\n                 FTC_GQuery   gquery,\n                 FTC_Cache    cache )\n  {\n    FT_Memory  memory = cache->memory;\n    FT_Error   error;\n    FTC_INode  inode  = NULL;\n\n\n    if ( !FT_NEW( inode ) )\n    {\n      FTC_GNode         gnode  = FTC_GNODE( inode );\n      FTC_Family        family = gquery->family;\n      FT_UInt           gindex = gquery->gindex;\n      FTC_IFamilyClass  clazz  = FTC_CACHE__IFAMILY_CLASS( cache );\n\n\n      /* initialize its inner fields */\n      FTC_GNode_Init( gnode, gindex, family );\n\n      /* we will now load the glyph image */\n      error = clazz->family_load_glyph( family, gindex, cache,\n                                        &inode->glyph );\n      if ( error )\n      {\n        FTC_INode_Free( inode, cache );\n        inode = NULL;\n      }\n    }\n\n    *pinode = inode;\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  ftc_inode_new( FTC_Node   *ftcpinode,\n                 FT_Pointer  ftcgquery,\n                 FTC_Cache   cache )\n  {\n    FTC_INode  *pinode = (FTC_INode*)ftcpinode;\n    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;\n\n\n    return FTC_INode_New( pinode, gquery, cache );\n  }\n\n\n  FT_LOCAL_DEF( FT_Offset )\n  ftc_inode_weight( FTC_Node   ftcinode,\n                    FTC_Cache  ftccache )\n  {\n    FTC_INode  inode = (FTC_INode)ftcinode;\n    FT_Offset  size  = 0;\n    FT_Glyph   glyph = inode->glyph;\n\n    FT_UNUSED( ftccache );\n\n\n    switch ( glyph->format )\n    {\n    case FT_GLYPH_FORMAT_BITMAP:\n      {\n        FT_BitmapGlyph  bitg;\n\n\n        bitg = (FT_BitmapGlyph)glyph;\n        size = bitg->bitmap.rows * ft_labs( bitg->bitmap.pitch ) +\n               sizeof ( *bitg );\n      }\n      break;\n\n    case FT_GLYPH_FORMAT_OUTLINE:\n      {\n        FT_OutlineGlyph  outg;\n\n\n        outg = (FT_OutlineGlyph)glyph;\n        size = outg->outline.n_points *\n                 ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) +\n               outg->outline.n_contours * sizeof ( FT_Short ) +\n               sizeof ( *outg );\n      }\n      break;\n\n    default:\n      ;\n    }\n\n    size += sizeof ( *inode );\n    return size;\n  }\n\n\n#if 0\n\n  FT_LOCAL_DEF( FT_Offset )\n  FTC_INode_Weight( FTC_INode  inode )\n  {\n    return ftc_inode_weight( FTC_NODE( inode ), NULL );\n  }\n\n#endif /* 0 */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcimage.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcimage.h                                                             */\n/*                                                                         */\n/*    FreeType Generic Image cache (specification)                         */\n/*                                                                         */\n/*  Copyright 2000-2001, 2002, 2003, 2006 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n /*\n  *  FTC_ICache is an _abstract_ cache used to store a single FT_Glyph\n  *  image per cache node.\n  *\n  *  FTC_ICache extends FTC_GCache.  For an implementation example,\n  *  see FTC_ImageCache in `src/cache/ftbasic.c'.\n  */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Each image cache really manages FT_Glyph objects.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTCIMAGE_H__\n#define __FTCIMAGE_H__\n\n\n#include <ft2build.h>\n#include FT_CACHE_H\n#include \"ftcglyph.h\"\n\nFT_BEGIN_HEADER\n\n\n  /* the FT_Glyph image node type - we store only 1 glyph per node */\n  typedef struct  FTC_INodeRec_\n  {\n    FTC_GNodeRec  gnode;\n    FT_Glyph      glyph;\n\n  } FTC_INodeRec, *FTC_INode;\n\n#define FTC_INODE( x )         ( (FTC_INode)( x ) )\n#define FTC_INODE_GINDEX( x )  FTC_GNODE(x)->gindex\n#define FTC_INODE_FAMILY( x )  FTC_GNODE(x)->family\n\n  typedef FT_Error\n  (*FTC_IFamily_LoadGlyphFunc)( FTC_Family  family,\n                                FT_UInt     gindex,\n                                FTC_Cache   cache,\n                                FT_Glyph   *aglyph );\n\n  typedef struct  FTC_IFamilyClassRec_\n  {\n    FTC_MruListClassRec        clazz;\n    FTC_IFamily_LoadGlyphFunc  family_load_glyph;\n\n  } FTC_IFamilyClassRec;\n\n  typedef const FTC_IFamilyClassRec*  FTC_IFamilyClass;\n\n#define FTC_IFAMILY_CLASS( x )  ((FTC_IFamilyClass)(x))\n\n#define FTC_CACHE__IFAMILY_CLASS( x ) \\\n          FTC_IFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS(x)->family_class )\n\n\n  /* can be used as a @FTC_Node_FreeFunc */\n  FT_LOCAL( void )\n  FTC_INode_Free( FTC_INode  inode,\n                  FTC_Cache  cache );\n\n  /* Can be used as @FTC_Node_NewFunc.  `gquery.index' and `gquery.family'\n   * must be set correctly.  This function will call the `family_load_glyph'\n   * method to load the FT_Glyph into the cache node.\n   */\n  FT_LOCAL( FT_Error )\n  FTC_INode_New( FTC_INode   *pinode,\n                 FTC_GQuery   gquery,\n                 FTC_Cache    cache );\n\n#if 0\n  /* can be used as @FTC_Node_WeightFunc */\n  FT_LOCAL( FT_ULong )\n  FTC_INode_Weight( FTC_INode  inode );\n#endif\n\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTCIMAGE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcmanag.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcmanag.c                                                             */\n/*                                                                         */\n/*    FreeType Cache Manager (body).                                       */\n/*                                                                         */\n/*  Copyright 2000-2006, 2008-2010, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_CACHE_H\n#include \"ftcmanag.h\"\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_SIZES_H\n\n#include \"ftccback.h\"\n#include \"ftcerror.h\"\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"cache system does not support PIC yet\"\n#endif\n\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cache\n\n#define FTC_LRU_GET_MANAGER( lru )  ( (FTC_Manager)(lru)->user_data )\n\n\n  static FT_Error\n  ftc_scaler_lookup_size( FTC_Manager  manager,\n                          FTC_Scaler   scaler,\n                          FT_Size     *asize )\n  {\n    FT_Face   face;\n    FT_Size   size = NULL;\n    FT_Error  error;\n\n\n    error = FTC_Manager_LookupFace( manager, scaler->face_id, &face );\n    if ( error )\n      goto Exit;\n\n    error = FT_New_Size( face, &size );\n    if ( error )\n      goto Exit;\n\n    FT_Activate_Size( size );\n\n    if ( scaler->pixel )\n      error = FT_Set_Pixel_Sizes( face, scaler->width, scaler->height );\n    else\n      error = FT_Set_Char_Size( face, scaler->width, scaler->height,\n                                scaler->x_res, scaler->y_res );\n    if ( error )\n    {\n      FT_Done_Size( size );\n      size = NULL;\n    }\n\n  Exit:\n    *asize = size;\n    return error;\n  }\n\n\n  typedef struct  FTC_SizeNodeRec_\n  {\n    FTC_MruNodeRec  node;\n    FT_Size         size;\n    FTC_ScalerRec   scaler;\n\n  } FTC_SizeNodeRec, *FTC_SizeNode;\n\n#define FTC_SIZE_NODE( x ) ( (FTC_SizeNode)( x ) )\n\n\n  FT_CALLBACK_DEF( void )\n  ftc_size_node_done( FTC_MruNode  ftcnode,\n                      FT_Pointer   data )\n  {\n    FTC_SizeNode  node = (FTC_SizeNode)ftcnode;\n    FT_Size       size = node->size;\n    FT_UNUSED( data );\n\n\n    if ( size )\n      FT_Done_Size( size );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Bool )\n  ftc_size_node_compare( FTC_MruNode  ftcnode,\n                         FT_Pointer   ftcscaler )\n  {\n    FTC_SizeNode  node    = (FTC_SizeNode)ftcnode;\n    FTC_Scaler    scaler  = (FTC_Scaler)ftcscaler;\n    FTC_Scaler    scaler0 = &node->scaler;\n\n\n    if ( FTC_SCALER_COMPARE( scaler0, scaler ) )\n    {\n      FT_Activate_Size( node->size );\n      return 1;\n    }\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ftc_size_node_init( FTC_MruNode  ftcnode,\n                      FT_Pointer   ftcscaler,\n                      FT_Pointer   ftcmanager )\n  {\n    FTC_SizeNode  node    = (FTC_SizeNode)ftcnode;\n    FTC_Scaler    scaler  = (FTC_Scaler)ftcscaler;\n    FTC_Manager   manager = (FTC_Manager)ftcmanager;\n\n\n    node->scaler = scaler[0];\n\n    return ftc_scaler_lookup_size( manager, scaler, &node->size );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ftc_size_node_reset( FTC_MruNode  ftcnode,\n                       FT_Pointer   ftcscaler,\n                       FT_Pointer   ftcmanager )\n  {\n    FTC_SizeNode  node    = (FTC_SizeNode)ftcnode;\n    FTC_Scaler    scaler  = (FTC_Scaler)ftcscaler;\n    FTC_Manager   manager = (FTC_Manager)ftcmanager;\n\n\n    FT_Done_Size( node->size );\n\n    node->scaler = scaler[0];\n\n    return ftc_scaler_lookup_size( manager, scaler, &node->size );\n  }\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FTC_MruListClassRec  ftc_size_list_class =\n  {\n    sizeof ( FTC_SizeNodeRec ),\n    ftc_size_node_compare,\n    ftc_size_node_init,\n    ftc_size_node_reset,\n    ftc_size_node_done\n  };\n\n\n  /* helper function used by ftc_face_node_done */\n  static FT_Bool\n  ftc_size_node_compare_faceid( FTC_MruNode  ftcnode,\n                                FT_Pointer   ftcface_id )\n  {\n    FTC_SizeNode  node    = (FTC_SizeNode)ftcnode;\n    FTC_FaceID    face_id = (FTC_FaceID)ftcface_id;\n\n\n    return FT_BOOL( node->scaler.face_id == face_id );\n  }\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_Manager_LookupSize( FTC_Manager  manager,\n                          FTC_Scaler   scaler,\n                          FT_Size     *asize )\n  {\n    FT_Error     error;\n    FTC_MruNode  mrunode;\n\n\n    if ( asize == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    *asize = NULL;\n\n    if ( !manager )\n      return FT_THROW( Invalid_Cache_Handle );\n\n#ifdef FTC_INLINE\n\n    FTC_MRULIST_LOOKUP_CMP( &manager->sizes, scaler, ftc_size_node_compare,\n                            mrunode, error );\n\n#else\n    error = FTC_MruList_Lookup( &manager->sizes, scaler, &mrunode );\n#endif\n\n    if ( !error )\n      *asize = FTC_SIZE_NODE( mrunode )->size;\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    FACE MRU IMPLEMENTATION                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  FTC_FaceNodeRec_\n  {\n    FTC_MruNodeRec  node;\n    FTC_FaceID      face_id;\n    FT_Face         face;\n\n  } FTC_FaceNodeRec, *FTC_FaceNode;\n\n#define FTC_FACE_NODE( x ) ( ( FTC_FaceNode )( x ) )\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  ftc_face_node_init( FTC_MruNode  ftcnode,\n                      FT_Pointer   ftcface_id,\n                      FT_Pointer   ftcmanager )\n  {\n    FTC_FaceNode  node    = (FTC_FaceNode)ftcnode;\n    FTC_FaceID    face_id = (FTC_FaceID)ftcface_id;\n    FTC_Manager   manager = (FTC_Manager)ftcmanager;\n    FT_Error      error;\n\n\n    node->face_id = face_id;\n\n    error = manager->request_face( face_id,\n                                   manager->library,\n                                   manager->request_data,\n                                   &node->face );\n    if ( !error )\n    {\n      /* destroy initial size object; it will be re-created later */\n      if ( node->face->size )\n        FT_Done_Size( node->face->size );\n    }\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  ftc_face_node_done( FTC_MruNode  ftcnode,\n                      FT_Pointer   ftcmanager )\n  {\n    FTC_FaceNode  node    = (FTC_FaceNode)ftcnode;\n    FTC_Manager   manager = (FTC_Manager)ftcmanager;\n\n\n    /* we must begin by removing all scalers for the target face */\n    /* from the manager's list                                   */\n    FTC_MruList_RemoveSelection( &manager->sizes,\n                                 ftc_size_node_compare_faceid,\n                                 node->face_id );\n\n    /* all right, we can discard the face now */\n    FT_Done_Face( node->face );\n    node->face    = NULL;\n    node->face_id = NULL;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Bool )\n  ftc_face_node_compare( FTC_MruNode  ftcnode,\n                         FT_Pointer   ftcface_id )\n  {\n    FTC_FaceNode  node    = (FTC_FaceNode)ftcnode;\n    FTC_FaceID    face_id = (FTC_FaceID)ftcface_id;\n\n\n    return FT_BOOL( node->face_id == face_id );\n  }\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FTC_MruListClassRec  ftc_face_list_class =\n  {\n    sizeof ( FTC_FaceNodeRec),\n\n    ftc_face_node_compare,\n    ftc_face_node_init,\n    0,                          /* FTC_MruNode_ResetFunc */\n    ftc_face_node_done\n  };\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_Manager_LookupFace( FTC_Manager  manager,\n                          FTC_FaceID   face_id,\n                          FT_Face     *aface )\n  {\n    FT_Error     error;\n    FTC_MruNode  mrunode;\n\n\n    if ( aface == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    *aface = NULL;\n\n    if ( !manager )\n      return FT_THROW( Invalid_Cache_Handle );\n\n    /* we break encapsulation for the sake of speed */\n#ifdef FTC_INLINE\n\n    FTC_MRULIST_LOOKUP_CMP( &manager->faces, face_id, ftc_face_node_compare,\n                            mrunode, error );\n\n#else\n    error = FTC_MruList_Lookup( &manager->faces, face_id, &mrunode );\n#endif\n\n    if ( !error )\n      *aface = FTC_FACE_NODE( mrunode )->face;\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    CACHE MANAGER ROUTINES                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_Manager_New( FT_Library          library,\n                   FT_UInt             max_faces,\n                   FT_UInt             max_sizes,\n                   FT_ULong            max_bytes,\n                   FTC_Face_Requester  requester,\n                   FT_Pointer          req_data,\n                   FTC_Manager        *amanager )\n  {\n    FT_Error     error;\n    FT_Memory    memory;\n    FTC_Manager  manager = 0;\n\n\n    if ( !library )\n      return FT_THROW( Invalid_Library_Handle );\n\n    memory = library->memory;\n\n    if ( FT_NEW( manager ) )\n      goto Exit;\n\n    if ( max_faces == 0 )\n      max_faces = FTC_MAX_FACES_DEFAULT;\n\n    if ( max_sizes == 0 )\n      max_sizes = FTC_MAX_SIZES_DEFAULT;\n\n    if ( max_bytes == 0 )\n      max_bytes = FTC_MAX_BYTES_DEFAULT;\n\n    manager->library      = library;\n    manager->memory       = memory;\n    manager->max_weight   = max_bytes;\n\n    manager->request_face = requester;\n    manager->request_data = req_data;\n\n    FTC_MruList_Init( &manager->faces,\n                      &ftc_face_list_class,\n                      max_faces,\n                      manager,\n                      memory );\n\n    FTC_MruList_Init( &manager->sizes,\n                      &ftc_size_list_class,\n                      max_sizes,\n                      manager,\n                      memory );\n\n    *amanager = manager;\n\n  Exit:\n    return error;\n  }\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( void )\n  FTC_Manager_Done( FTC_Manager  manager )\n  {\n    FT_Memory  memory;\n    FT_UInt    idx;\n\n\n    if ( !manager || !manager->library )\n      return;\n\n    memory = manager->memory;\n\n    /* now discard all caches */\n    for (idx = manager->num_caches; idx-- > 0; )\n    {\n      FTC_Cache  cache = manager->caches[idx];\n\n\n      if ( cache )\n      {\n        cache->clazz.cache_done( cache );\n        FT_FREE( cache );\n        manager->caches[idx] = NULL;\n      }\n    }\n    manager->num_caches = 0;\n\n    /* discard faces and sizes */\n    FTC_MruList_Done( &manager->sizes );\n    FTC_MruList_Done( &manager->faces );\n\n    manager->library = NULL;\n    manager->memory  = NULL;\n\n    FT_FREE( manager );\n  }\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( void )\n  FTC_Manager_Reset( FTC_Manager  manager )\n  {\n    if ( manager )\n    {\n      FTC_MruList_Reset( &manager->sizes );\n      FTC_MruList_Reset( &manager->faces );\n    }\n    /* XXX: FIXME: flush the caches? */\n  }\n\n\n#ifdef FT_DEBUG_ERROR\n\n  static void\n  FTC_Manager_Check( FTC_Manager  manager )\n  {\n    FTC_Node  node, first;\n\n\n    first = manager->nodes_list;\n\n    /* check node weights */\n    if ( first )\n    {\n      FT_ULong  weight = 0;\n\n\n      node = first;\n\n      do\n      {\n        FTC_Cache  cache = manager->caches[node->cache_index];\n\n\n        if ( (FT_UInt)node->cache_index >= manager->num_caches )\n          FT_TRACE0(( \"FTC_Manager_Check: invalid node (cache index = %ld\\n\",\n                      node->cache_index ));\n        else\n          weight += cache->clazz.node_weight( node, cache );\n\n        node = FTC_NODE__NEXT( node );\n\n      } while ( node != first );\n\n      if ( weight != manager->cur_weight )\n        FT_TRACE0(( \"FTC_Manager_Check: invalid weight %ld instead of %ld\\n\",\n                    manager->cur_weight, weight ));\n    }\n\n    /* check circular list */\n    if ( first )\n    {\n      FT_UFast  count = 0;\n\n\n      node = first;\n      do\n      {\n        count++;\n        node = FTC_NODE__NEXT( node );\n\n      } while ( node != first );\n\n      if ( count != manager->num_nodes )\n        FT_TRACE0(( \"FTC_Manager_Check:\"\n                    \" invalid cache node count %d instead of %d\\n\",\n                    manager->num_nodes, count ));\n    }\n  }\n\n#endif /* FT_DEBUG_ERROR */\n\n\n  /* `Compress' the manager's data, i.e., get rid of old cache nodes */\n  /* that are not referenced anymore in order to limit the total     */\n  /* memory used by the cache.                                       */\n\n  /* documentation is in ftcmanag.h */\n\n  FT_LOCAL_DEF( void )\n  FTC_Manager_Compress( FTC_Manager  manager )\n  {\n    FTC_Node   node, first;\n\n\n    if ( !manager )\n      return;\n\n    first = manager->nodes_list;\n\n#ifdef FT_DEBUG_ERROR\n    FTC_Manager_Check( manager );\n\n    FT_TRACE0(( \"compressing, weight = %ld, max = %ld, nodes = %d\\n\",\n                manager->cur_weight, manager->max_weight,\n                manager->num_nodes ));\n#endif\n\n    if ( manager->cur_weight < manager->max_weight || first == NULL )\n      return;\n\n    /* go to last node -- it's a circular list */\n    node = FTC_NODE__PREV( first );\n    do\n    {\n      FTC_Node  prev;\n\n\n      prev = ( node == first ) ? NULL : FTC_NODE__PREV( node );\n\n      if ( node->ref_count <= 0 )\n        ftc_node_destroy( node, manager );\n\n      node = prev;\n\n    } while ( node && manager->cur_weight > manager->max_weight );\n  }\n\n\n  /* documentation is in ftcmanag.h */\n\n  FT_LOCAL_DEF( FT_Error )\n  FTC_Manager_RegisterCache( FTC_Manager      manager,\n                             FTC_CacheClass   clazz,\n                             FTC_Cache       *acache )\n  {\n    FT_Error   error = FT_ERR( Invalid_Argument );\n    FTC_Cache  cache = NULL;\n\n\n    if ( manager && clazz && acache )\n    {\n      FT_Memory  memory = manager->memory;\n\n\n      if ( manager->num_caches >= FTC_MAX_CACHES )\n      {\n        error = FT_THROW( Too_Many_Caches );\n        FT_ERROR(( \"FTC_Manager_RegisterCache:\"\n                   \" too many registered caches\\n\" ));\n        goto Exit;\n      }\n\n      if ( !FT_ALLOC( cache, clazz->cache_size ) )\n      {\n        cache->manager   = manager;\n        cache->memory    = memory;\n        cache->clazz     = clazz[0];\n        cache->org_class = clazz;\n\n        /* THIS IS VERY IMPORTANT!  IT WILL WRETCH THE MANAGER */\n        /* IF IT IS NOT SET CORRECTLY                          */\n        cache->index = manager->num_caches;\n\n        error = clazz->cache_init( cache );\n        if ( error )\n        {\n          clazz->cache_done( cache );\n          FT_FREE( cache );\n          goto Exit;\n        }\n\n        manager->caches[manager->num_caches++] = cache;\n      }\n    }\n\n  Exit:\n    if ( acache )\n      *acache = cache;\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  FTC_Manager_FlushN( FTC_Manager  manager,\n                      FT_UInt      count )\n  {\n    FTC_Node  first = manager->nodes_list;\n    FTC_Node  node;\n    FT_UInt   result;\n\n\n    /* try to remove `count' nodes from the list */\n    if ( first == NULL )  /* empty list! */\n      return 0;\n\n    /* go to last node - it's a circular list */\n    node = FTC_NODE__PREV(first);\n    for ( result = 0; result < count; )\n    {\n      FTC_Node  prev = FTC_NODE__PREV( node );\n\n\n      /* don't touch locked nodes */\n      if ( node->ref_count <= 0 )\n      {\n        ftc_node_destroy( node, manager );\n        result++;\n      }\n\n      if ( node == first )\n        break;\n\n      node = prev;\n    }\n    return  result;\n  }\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( void )\n  FTC_Manager_RemoveFaceID( FTC_Manager  manager,\n                            FTC_FaceID   face_id )\n  {\n    FT_UInt  nn;\n\n    /* this will remove all FTC_SizeNode that correspond to\n     * the face_id as well\n     */\n    FTC_MruList_RemoveSelection( &manager->faces,\n                                 ftc_face_node_compare,\n                                 face_id );\n\n    for ( nn = 0; nn < manager->num_caches; nn++ )\n      FTC_Cache_RemoveFaceID( manager->caches[nn], face_id );\n  }\n\n\n  /* documentation is in ftcache.h */\n\n  FT_EXPORT_DEF( void )\n  FTC_Node_Unref( FTC_Node     node,\n                  FTC_Manager  manager )\n  {\n    if ( node && (FT_UInt)node->cache_index < manager->num_caches )\n      node->ref_count--;\n  }\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  FT_EXPORT_DEF( FT_Error )\n  FTC_Manager_Lookup_Face( FTC_Manager  manager,\n                           FTC_FaceID   face_id,\n                           FT_Face     *aface )\n  {\n    return FTC_Manager_LookupFace( manager, face_id, aface );\n  }\n\n\n  FT_EXPORT( FT_Error )\n  FTC_Manager_Lookup_Size( FTC_Manager  manager,\n                           FTC_Font     font,\n                           FT_Face     *aface,\n                           FT_Size     *asize )\n  {\n    FTC_ScalerRec  scaler;\n    FT_Error       error;\n    FT_Size        size;\n    FT_Face        face;\n\n\n    scaler.face_id = font->face_id;\n    scaler.width   = font->pix_width;\n    scaler.height  = font->pix_height;\n    scaler.pixel   = TRUE;\n    scaler.x_res   = 0;\n    scaler.y_res   = 0;\n\n    error = FTC_Manager_LookupSize( manager, &scaler, &size );\n    if ( error )\n    {\n      face = NULL;\n      size = NULL;\n    }\n    else\n      face = size->face;\n\n    if ( aface )\n      *aface = face;\n\n    if ( asize )\n      *asize = size;\n\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcmanag.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcmanag.h                                                             */\n/*                                                                         */\n/*    FreeType Cache Manager (specification).                              */\n/*                                                                         */\n/*  Copyright 2000-2001, 2003, 2004, 2006, 2010 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A cache manager is in charge of the following:                        */\n  /*                                                                       */\n  /*  - Maintain a mapping between generic FTC_FaceIDs and live FT_Face    */\n  /*    objects.  The mapping itself is performed through a user-provided  */\n  /*    callback.  However, the manager maintains a small cache of FT_Face */\n  /*    and FT_Size objects in order to speed up things considerably.      */\n  /*                                                                       */\n  /*  - Manage one or more cache objects.  Each cache is in charge of      */\n  /*    holding a varying number of `cache nodes'.  Each cache node        */\n  /*    represents a minimal amount of individually accessible cached      */\n  /*    data.  For example, a cache node can be an FT_Glyph image          */\n  /*    containing a vector outline, or some glyph metrics, or anything    */\n  /*    else.                                                              */\n  /*                                                                       */\n  /*    Each cache node has a certain size in bytes that is added to the   */\n  /*    total amount of `cache memory' within the manager.                 */\n  /*                                                                       */\n  /*    All cache nodes are located in a global LRU list, where the oldest */\n  /*    node is at the tail of the list.                                   */\n  /*                                                                       */\n  /*    Each node belongs to a single cache, and includes a reference      */\n  /*    count to avoid destroying it (due to caching).                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*********                                                       *********/\n  /*********             WARNING, THIS IS BETA CODE.               *********/\n  /*********                                                       *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#ifndef __FTCMANAG_H__\n#define __FTCMANAG_H__\n\n\n#include <ft2build.h>\n#include FT_CACHE_H\n#include \"ftcmru.h\"\n#include \"ftccache.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Section>                                                             */\n  /*    cache_subsystem                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define FTC_MAX_FACES_DEFAULT  2\n#define FTC_MAX_SIZES_DEFAULT  4\n#define FTC_MAX_BYTES_DEFAULT  200000L  /* ~200kByte by default */\n\n  /* maximum number of caches registered in a single manager */\n#define FTC_MAX_CACHES         16\n\n\n  typedef struct  FTC_ManagerRec_\n  {\n    FT_Library          library;\n    FT_Memory           memory;\n\n    FTC_Node            nodes_list;\n    FT_ULong            max_weight;\n    FT_ULong            cur_weight;\n    FT_UInt             num_nodes;\n\n    FTC_Cache           caches[FTC_MAX_CACHES];\n    FT_UInt             num_caches;\n\n    FTC_MruListRec      faces;\n    FTC_MruListRec      sizes;\n\n    FT_Pointer          request_data;\n    FTC_Face_Requester  request_face;\n\n  } FTC_ManagerRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FTC_Manager_Compress                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This function is used to check the state of the cache manager if   */\n  /*    its `num_bytes' field is greater than its `max_bytes' field.  It   */\n  /*    will flush as many old cache nodes as possible (ignoring cache     */\n  /*    nodes with a non-zero reference count).                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    manager :: A handle to the cache manager.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Client applications should not call this function directly.  It is */\n  /*    normally invoked by specific cache implementations.                */\n  /*                                                                       */\n  /*    The reason this function is exported is to allow client-specific   */\n  /*    cache classes.                                                     */\n  /*                                                                       */\n  FT_LOCAL( void )\n  FTC_Manager_Compress( FTC_Manager  manager );\n\n\n  /* try to flush `count' old nodes from the cache; return the number\n   * of really flushed nodes\n   */\n  FT_LOCAL( FT_UInt )\n  FTC_Manager_FlushN( FTC_Manager  manager,\n                      FT_UInt      count );\n\n\n  /* this must be used internally for the moment */\n  FT_LOCAL( FT_Error )\n  FTC_Manager_RegisterCache( FTC_Manager      manager,\n                             FTC_CacheClass   clazz,\n                             FTC_Cache       *acache );\n\n /* */\n\n#define FTC_SCALER_COMPARE( a, b )                \\\n    ( (a)->face_id      == (b)->face_id      &&   \\\n      (a)->width        == (b)->width        &&   \\\n      (a)->height       == (b)->height       &&   \\\n      ((a)->pixel != 0) == ((b)->pixel != 0) &&   \\\n      ( (a)->pixel ||                             \\\n        ( (a)->x_res == (b)->x_res &&             \\\n          (a)->y_res == (b)->y_res ) ) )\n\n#define FTC_SCALER_HASH( q )                                 \\\n    ( _FTC_FACE_ID_HASH( (q)->face_id ) +                     \\\n      (q)->width + (q)->height*7 +                           \\\n      ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) )\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTCMANAG_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcmru.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcmru.c                                                               */\n/*                                                                         */\n/*    FreeType MRU support (body).                                         */\n/*                                                                         */\n/*  Copyright 2003, 2004, 2006, 2009 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_CACHE_H\n#include \"ftcmru.h\"\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n\n#include \"ftcerror.h\"\n\n\n  FT_LOCAL_DEF( void )\n  FTC_MruNode_Prepend( FTC_MruNode  *plist,\n                       FTC_MruNode   node )\n  {\n    FTC_MruNode  first = *plist;\n\n\n    if ( first )\n    {\n      FTC_MruNode  last = first->prev;\n\n\n#ifdef FT_DEBUG_ERROR\n      {\n        FTC_MruNode  cnode = first;\n\n\n        do\n        {\n          if ( cnode == node )\n          {\n            fprintf( stderr, \"FTC_MruNode_Prepend: invalid action\\n\" );\n            exit( 2 );\n          }\n          cnode = cnode->next;\n\n        } while ( cnode != first );\n      }\n#endif\n\n      first->prev = node;\n      last->next  = node;\n      node->next  = first;\n      node->prev  = last;\n    }\n    else\n    {\n      node->next = node;\n      node->prev = node;\n    }\n    *plist = node;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_MruNode_Up( FTC_MruNode  *plist,\n                  FTC_MruNode   node )\n  {\n    FTC_MruNode  first = *plist;\n\n\n    FT_ASSERT( first != NULL );\n\n    if ( first != node )\n    {\n      FTC_MruNode  prev, next, last;\n\n\n#ifdef FT_DEBUG_ERROR\n      {\n        FTC_MruNode  cnode = first;\n        do\n        {\n          if ( cnode == node )\n            goto Ok;\n          cnode = cnode->next;\n\n        } while ( cnode != first );\n\n        fprintf( stderr, \"FTC_MruNode_Up: invalid action\\n\" );\n        exit( 2 );\n      Ok:\n      }\n#endif\n      prev = node->prev;\n      next = node->next;\n\n      prev->next = next;\n      next->prev = prev;\n\n      last = first->prev;\n\n      last->next  = node;\n      first->prev = node;\n\n      node->next = first;\n      node->prev = last;\n\n      *plist = node;\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_MruNode_Remove( FTC_MruNode  *plist,\n                      FTC_MruNode   node )\n  {\n    FTC_MruNode  first = *plist;\n    FTC_MruNode  prev, next;\n\n\n    FT_ASSERT( first != NULL );\n\n#ifdef FT_DEBUG_ERROR\n      {\n        FTC_MruNode  cnode = first;\n\n\n        do\n        {\n          if ( cnode == node )\n            goto Ok;\n          cnode = cnode->next;\n\n        } while ( cnode != first );\n\n        fprintf( stderr, \"FTC_MruNode_Remove: invalid action\\n\" );\n        exit( 2 );\n      Ok:\n      }\n#endif\n\n    prev = node->prev;\n    next = node->next;\n\n    prev->next = next;\n    next->prev = prev;\n\n    if ( node == next )\n    {\n      FT_ASSERT( first == node );\n      FT_ASSERT( prev  == node );\n\n      *plist = NULL;\n    }\n    else if ( node == first )\n      *plist = next;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_MruList_Init( FTC_MruList       list,\n                    FTC_MruListClass  clazz,\n                    FT_UInt           max_nodes,\n                    FT_Pointer        data,\n                    FT_Memory         memory )\n  {\n    list->num_nodes = 0;\n    list->max_nodes = max_nodes;\n    list->nodes     = NULL;\n    list->clazz     = *clazz;\n    list->data      = data;\n    list->memory    = memory;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_MruList_Reset( FTC_MruList  list )\n  {\n    while ( list->nodes )\n      FTC_MruList_Remove( list, list->nodes );\n\n    FT_ASSERT( list->num_nodes == 0 );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_MruList_Done( FTC_MruList  list )\n  {\n    FTC_MruList_Reset( list );\n  }\n\n\n#ifndef FTC_INLINE\n  FT_LOCAL_DEF( FTC_MruNode )\n  FTC_MruList_Find( FTC_MruList  list,\n                    FT_Pointer   key )\n  {\n    FTC_MruNode_CompareFunc  compare = list->clazz.node_compare;\n    FTC_MruNode              first, node;\n\n\n    first = list->nodes;\n    node  = NULL;\n\n    if ( first )\n    {\n      node = first;\n      do\n      {\n        if ( compare( node, key ) )\n        {\n          if ( node != first )\n            FTC_MruNode_Up( &list->nodes, node );\n\n          return node;\n        }\n\n        node = node->next;\n\n      } while ( node != first);\n    }\n\n    return NULL;\n  }\n#endif\n\n  FT_LOCAL_DEF( FT_Error )\n  FTC_MruList_New( FTC_MruList   list,\n                   FT_Pointer    key,\n                   FTC_MruNode  *anode )\n  {\n    FT_Error     error;\n    FTC_MruNode  node = NULL;\n    FT_Memory    memory = list->memory;\n\n\n    if ( list->num_nodes >= list->max_nodes && list->max_nodes > 0 )\n    {\n      node = list->nodes->prev;\n\n      FT_ASSERT( node );\n\n      if ( list->clazz.node_reset )\n      {\n        FTC_MruNode_Up( &list->nodes, node );\n\n        error = list->clazz.node_reset( node, key, list->data );\n        if ( !error )\n          goto Exit;\n      }\n\n      FTC_MruNode_Remove( &list->nodes, node );\n      list->num_nodes--;\n\n      if ( list->clazz.node_done )\n        list->clazz.node_done( node, list->data );\n    }\n    else if ( FT_ALLOC( node, list->clazz.node_size ) )\n      goto Exit;\n\n    error = list->clazz.node_init( node, key, list->data );\n    if ( error )\n      goto Fail;\n\n    FTC_MruNode_Prepend( &list->nodes, node );\n    list->num_nodes++;\n\n  Exit:\n    *anode = node;\n    return error;\n\n  Fail:\n    if ( list->clazz.node_done )\n      list->clazz.node_done( node, list->data );\n\n    FT_FREE( node );\n    goto Exit;\n  }\n\n\n#ifndef FTC_INLINE\n  FT_LOCAL_DEF( FT_Error )\n  FTC_MruList_Lookup( FTC_MruList   list,\n                      FT_Pointer    key,\n                      FTC_MruNode  *anode )\n  {\n    FTC_MruNode  node;\n\n\n    node = FTC_MruList_Find( list, key );\n    if ( node == NULL )\n      return FTC_MruList_New( list, key, anode );\n\n    *anode = node;\n    return 0;\n  }\n#endif /* FTC_INLINE */\n\n  FT_LOCAL_DEF( void )\n  FTC_MruList_Remove( FTC_MruList  list,\n                      FTC_MruNode  node )\n  {\n    FTC_MruNode_Remove( &list->nodes, node );\n    list->num_nodes--;\n\n    {\n      FT_Memory  memory = list->memory;\n\n\n      if ( list->clazz.node_done )\n        list->clazz.node_done( node, list->data );\n\n      FT_FREE( node );\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_MruList_RemoveSelection( FTC_MruList              list,\n                               FTC_MruNode_CompareFunc  selection,\n                               FT_Pointer               key )\n  {\n    FTC_MruNode  first, node, next;\n\n\n    first = list->nodes;\n    while ( first && ( selection == NULL || selection( first, key ) ) )\n    {\n      FTC_MruList_Remove( list, first );\n      first = list->nodes;\n    }\n\n    if ( first )\n    {\n      node = first->next;\n      while ( node != first )\n      {\n        next = node->next;\n\n        if ( selection( node, key ) )\n          FTC_MruList_Remove( list, node );\n\n        node = next;\n      }\n    }\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcmru.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcmru.h                                                               */\n/*                                                                         */\n/*    Simple MRU list-cache (specification).                               */\n/*                                                                         */\n/*  Copyright 2000-2001, 2003-2006, 2010, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* An MRU is a list that cannot hold more than a certain number of       */\n  /* elements (`max_elements').  All elements in the list are sorted in    */\n  /* least-recently-used order, i.e., the `oldest' element is at the tail  */\n  /* of the list.                                                          */\n  /*                                                                       */\n  /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'),   */\n  /* the list is searched for an element with the corresponding key.  If   */\n  /* it is found, the element is moved to the head of the list and is      */\n  /* returned.                                                             */\n  /*                                                                       */\n  /* If no corresponding element is found, the lookup routine will try to  */\n  /* obtain a new element with the relevant key.  If the list is already   */\n  /* full, the oldest element from the list is discarded and replaced by a */\n  /* new one; a new element is added to the list otherwise.                */\n  /*                                                                       */\n  /* Note that it is possible to pre-allocate the element list nodes.      */\n  /* This is handy if `max_elements' is sufficiently small, as it saves    */\n  /* allocations/releases during the lookup process.                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef __FTCMRU_H__\n#define __FTCMRU_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#ifdef FREETYPE_H\n#error \"freetype.h of FreeType 1 has been loaded!\"\n#error \"Please fix the directory search order for header files\"\n#error \"so that freetype.h of FreeType 2 is found first.\"\n#endif\n\n#define  xxFT_DEBUG_ERROR\n#define  FTC_INLINE\n\nFT_BEGIN_HEADER\n\n  typedef struct FTC_MruNodeRec_*  FTC_MruNode;\n\n  typedef struct  FTC_MruNodeRec_\n  {\n    FTC_MruNode  next;\n    FTC_MruNode  prev;\n\n  } FTC_MruNodeRec;\n\n\n  FT_LOCAL( void )\n  FTC_MruNode_Prepend( FTC_MruNode  *plist,\n                       FTC_MruNode   node );\n\n  FT_LOCAL( void )\n  FTC_MruNode_Up( FTC_MruNode  *plist,\n                  FTC_MruNode   node );\n\n  FT_LOCAL( void )\n  FTC_MruNode_Remove( FTC_MruNode  *plist,\n                      FTC_MruNode   node );\n\n\n  typedef struct FTC_MruListRec_*              FTC_MruList;\n\n  typedef struct FTC_MruListClassRec_ const *  FTC_MruListClass;\n\n\n  typedef FT_Bool\n  (*FTC_MruNode_CompareFunc)( FTC_MruNode  node,\n                              FT_Pointer   key );\n\n  typedef FT_Error\n  (*FTC_MruNode_InitFunc)( FTC_MruNode  node,\n                           FT_Pointer   key,\n                           FT_Pointer   data );\n\n  typedef FT_Error\n  (*FTC_MruNode_ResetFunc)( FTC_MruNode  node,\n                            FT_Pointer   key,\n                            FT_Pointer   data );\n\n  typedef void\n  (*FTC_MruNode_DoneFunc)( FTC_MruNode  node,\n                           FT_Pointer   data );\n\n\n  typedef struct  FTC_MruListClassRec_\n  {\n    FT_Offset                node_size;\n    FTC_MruNode_CompareFunc  node_compare;\n    FTC_MruNode_InitFunc     node_init;\n    FTC_MruNode_ResetFunc    node_reset;\n    FTC_MruNode_DoneFunc     node_done;\n\n  } FTC_MruListClassRec;\n\n  typedef struct  FTC_MruListRec_\n  {\n    FT_UInt              num_nodes;\n    FT_UInt              max_nodes;\n    FTC_MruNode          nodes;\n    FT_Pointer           data;\n    FTC_MruListClassRec  clazz;\n    FT_Memory            memory;\n\n  } FTC_MruListRec;\n\n\n  FT_LOCAL( void )\n  FTC_MruList_Init( FTC_MruList       list,\n                    FTC_MruListClass  clazz,\n                    FT_UInt           max_nodes,\n                    FT_Pointer        data,\n                    FT_Memory         memory );\n\n  FT_LOCAL( void )\n  FTC_MruList_Reset( FTC_MruList  list );\n\n\n  FT_LOCAL( void )\n  FTC_MruList_Done( FTC_MruList  list );\n\n\n  FT_LOCAL( FT_Error )\n  FTC_MruList_New( FTC_MruList   list,\n                   FT_Pointer    key,\n                   FTC_MruNode  *anode );\n\n  FT_LOCAL( void )\n  FTC_MruList_Remove( FTC_MruList  list,\n                      FTC_MruNode  node );\n\n  FT_LOCAL( void )\n  FTC_MruList_RemoveSelection( FTC_MruList              list,\n                               FTC_MruNode_CompareFunc  selection,\n                               FT_Pointer               key );\n\n\n#ifdef FTC_INLINE\n\n#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error )           \\\n  FT_BEGIN_STMNT                                                            \\\n    FTC_MruNode*             _pfirst  = &(list)->nodes;                     \\\n    FTC_MruNode_CompareFunc  _compare = (FTC_MruNode_CompareFunc)(compare); \\\n    FTC_MruNode              _first, _node;                                 \\\n                                                                            \\\n                                                                            \\\n    error  = FT_Err_Ok;                                                     \\\n    _first = *(_pfirst);                                                    \\\n    _node  = NULL;                                                          \\\n                                                                            \\\n    if ( _first )                                                           \\\n    {                                                                       \\\n      _node = _first;                                                       \\\n      do                                                                    \\\n      {                                                                     \\\n        if ( _compare( _node, (key) ) )                                     \\\n        {                                                                   \\\n          if ( _node != _first )                                            \\\n            FTC_MruNode_Up( _pfirst, _node );                               \\\n                                                                            \\\n          node = _node;                                                     \\\n          goto _MruOk;                                                      \\\n        }                                                                   \\\n        _node = _node->next;                                                \\\n                                                                            \\\n      } while ( _node != _first) ;                                          \\\n    }                                                                       \\\n                                                                            \\\n    error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \\\n  _MruOk:                                                                   \\\n    ;                                                                       \\\n  FT_END_STMNT\n\n#define FTC_MRULIST_LOOKUP( list, key, node, error ) \\\n  FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error )\n\n#else  /* !FTC_INLINE */\n\n  FT_LOCAL( FTC_MruNode )\n  FTC_MruList_Find( FTC_MruList  list,\n                    FT_Pointer   key );\n\n  FT_LOCAL( FT_Error )\n  FTC_MruList_Lookup( FTC_MruList   list,\n                      FT_Pointer    key,\n                      FTC_MruNode  *pnode );\n\n#define FTC_MRULIST_LOOKUP( list, key, node, error ) \\\n  error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) )\n\n#endif /* !FTC_INLINE */\n\n\n#define FTC_MRULIST_LOOP( list, node )        \\\n  FT_BEGIN_STMNT                              \\\n    FTC_MruNode  _first = (list)->nodes;      \\\n                                              \\\n                                              \\\n    if ( _first )                             \\\n    {                                         \\\n      FTC_MruNode  _node = _first;            \\\n                                              \\\n                                              \\\n      do                                      \\\n      {                                       \\\n        *(FTC_MruNode*)&(node) = _node;\n\n\n#define FTC_MRULIST_LOOP_END()               \\\n        _node = _node->next;                 \\\n                                             \\\n      } while ( _node != _first );           \\\n    }                                        \\\n  FT_END_STMNT\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __FTCMRU_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcsbits.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcsbits.c                                                             */\n/*                                                                         */\n/*    FreeType sbits manager (body).                                       */\n/*                                                                         */\n/*  Copyright 2000-2006, 2009-2011, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_CACHE_H\n#include \"ftcsbits.h\"\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_ERRORS_H\n\n#include \"ftccback.h\"\n#include \"ftcerror.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cache\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     SBIT CACHE NODES                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  static FT_Error\n  ftc_sbit_copy_bitmap( FTC_SBit    sbit,\n                        FT_Bitmap*  bitmap,\n                        FT_Memory   memory )\n  {\n    FT_Error  error;\n    FT_Int    pitch = bitmap->pitch;\n    FT_ULong  size;\n\n\n    if ( pitch < 0 )\n      pitch = -pitch;\n\n    size = (FT_ULong)( pitch * bitmap->rows );\n\n    if ( !FT_ALLOC( sbit->buffer, size ) )\n      FT_MEM_COPY( sbit->buffer, bitmap->buffer, size );\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ftc_snode_free( FTC_Node   ftcsnode,\n                  FTC_Cache  cache )\n  {\n    FTC_SNode  snode  = (FTC_SNode)ftcsnode;\n    FTC_SBit   sbit   = snode->sbits;\n    FT_UInt    count  = snode->count;\n    FT_Memory  memory = cache->memory;\n\n\n    for ( ; count > 0; sbit++, count-- )\n      FT_FREE( sbit->buffer );\n\n    FTC_GNode_Done( FTC_GNODE( snode ), cache );\n\n    FT_FREE( snode );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  FTC_SNode_Free( FTC_SNode  snode,\n                  FTC_Cache  cache )\n  {\n    ftc_snode_free( FTC_NODE( snode ), cache );\n  }\n\n\n  /*\n   *  This function tries to load a small bitmap within a given FTC_SNode.\n   *  Note that it returns a non-zero error code _only_ in the case of\n   *  out-of-memory condition.  For all other errors (e.g., corresponding\n   *  to a bad font file), this function will mark the sbit as `unavailable'\n   *  and return a value of 0.\n   *\n   *  You should also read the comment within the @ftc_snode_compare\n   *  function below to see how out-of-memory is handled during a lookup.\n   */\n  static FT_Error\n  ftc_snode_load( FTC_SNode    snode,\n                  FTC_Manager  manager,\n                  FT_UInt      gindex,\n                  FT_ULong    *asize )\n  {\n    FT_Error          error;\n    FTC_GNode         gnode  = FTC_GNODE( snode );\n    FTC_Family        family = gnode->family;\n    FT_Memory         memory = manager->memory;\n    FT_Face           face;\n    FTC_SBit          sbit;\n    FTC_SFamilyClass  clazz;\n\n\n    if ( (FT_UInt)(gindex - gnode->gindex) >= snode->count )\n    {\n      FT_ERROR(( \"ftc_snode_load: invalid glyph index\" ));\n      return FT_THROW( Invalid_Argument );\n    }\n\n    sbit  = snode->sbits + ( gindex - gnode->gindex );\n    clazz = (FTC_SFamilyClass)family->clazz;\n\n    sbit->buffer = 0;\n\n    error = clazz->family_load_glyph( family, gindex, manager, &face );\n    if ( error )\n      goto BadGlyph;\n\n    {\n      FT_Int        temp;\n      FT_GlyphSlot  slot   = face->glyph;\n      FT_Bitmap*    bitmap = &slot->bitmap;\n      FT_Pos        xadvance, yadvance; /* FT_GlyphSlot->advance.{x|y} */\n\n\n      if ( slot->format != FT_GLYPH_FORMAT_BITMAP )\n      {\n        FT_TRACE0(( \"ftc_snode_load:\"\n                    \" glyph loaded didn't return a bitmap\\n\" ));\n        goto BadGlyph;\n      }\n\n      /* Check that our values fit into 8-bit containers!       */\n      /* If this is not the case, our bitmap is too large       */\n      /* and we will leave it as `missing' with sbit.buffer = 0 */\n\n#define CHECK_CHAR( d )  ( temp = (FT_Char)d, temp == d )\n#define CHECK_BYTE( d )  ( temp = (FT_Byte)d, temp == d )\n\n      /* horizontal advance in pixels */\n      xadvance = ( slot->advance.x + 32 ) >> 6;\n      yadvance = ( slot->advance.y + 32 ) >> 6;\n\n      if ( !CHECK_BYTE( bitmap->rows  )     ||\n           !CHECK_BYTE( bitmap->width )     ||\n           !CHECK_CHAR( bitmap->pitch )     ||\n           !CHECK_CHAR( slot->bitmap_left ) ||\n           !CHECK_CHAR( slot->bitmap_top  ) ||\n           !CHECK_CHAR( xadvance )          ||\n           !CHECK_CHAR( yadvance )          )\n      {\n        FT_TRACE2(( \"ftc_snode_load:\"\n                    \" glyph too large for small bitmap cache\\n\"));\n        goto BadGlyph;\n      }\n\n      sbit->width     = (FT_Byte)bitmap->width;\n      sbit->height    = (FT_Byte)bitmap->rows;\n      sbit->pitch     = (FT_Char)bitmap->pitch;\n      sbit->left      = (FT_Char)slot->bitmap_left;\n      sbit->top       = (FT_Char)slot->bitmap_top;\n      sbit->xadvance  = (FT_Char)xadvance;\n      sbit->yadvance  = (FT_Char)yadvance;\n      sbit->format    = (FT_Byte)bitmap->pixel_mode;\n      sbit->max_grays = (FT_Byte)(bitmap->num_grays - 1);\n\n      /* copy the bitmap into a new buffer -- ignore error */\n      error = ftc_sbit_copy_bitmap( sbit, bitmap, memory );\n\n      /* now, compute size */\n      if ( asize )\n        *asize = FT_ABS( sbit->pitch ) * sbit->height;\n\n    } /* glyph loading successful */\n\n    /* ignore the errors that might have occurred --   */\n    /* we mark unloaded glyphs with `sbit.buffer == 0' */\n    /* and `width == 255', `height == 0'               */\n    /*                                                 */\n    if ( error && FT_ERR_NEQ( error, Out_Of_Memory ) )\n    {\n    BadGlyph:\n      sbit->width  = 255;\n      sbit->height = 0;\n      sbit->buffer = NULL;\n      error        = FT_Err_Ok;\n      if ( asize )\n        *asize = 0;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  FTC_SNode_New( FTC_SNode  *psnode,\n                 FTC_GQuery  gquery,\n                 FTC_Cache   cache )\n  {\n    FT_Memory   memory = cache->memory;\n    FT_Error    error;\n    FTC_SNode   snode  = NULL;\n    FT_UInt     gindex = gquery->gindex;\n    FTC_Family  family = gquery->family;\n\n    FTC_SFamilyClass  clazz = FTC_CACHE__SFAMILY_CLASS( cache );\n    FT_UInt           total;\n    FT_UInt           node_count;\n\n\n    total = clazz->family_get_count( family, cache->manager );\n    if ( total == 0 || gindex >= total )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( !FT_NEW( snode ) )\n    {\n      FT_UInt  count, start;\n\n\n      start = gindex - ( gindex % FTC_SBIT_ITEMS_PER_NODE );\n      count = total - start;\n      if ( count > FTC_SBIT_ITEMS_PER_NODE )\n        count = FTC_SBIT_ITEMS_PER_NODE;\n\n      FTC_GNode_Init( FTC_GNODE( snode ), start, family );\n\n      snode->count = count;\n      for ( node_count = 0; node_count < count; node_count++ )\n      {\n        snode->sbits[node_count].width = 255;\n      }\n\n      error = ftc_snode_load( snode,\n                              cache->manager,\n                              gindex,\n                              NULL );\n      if ( error )\n      {\n        FTC_SNode_Free( snode, cache );\n        snode = NULL;\n      }\n    }\n\n  Exit:\n    *psnode = snode;\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  ftc_snode_new( FTC_Node   *ftcpsnode,\n                 FT_Pointer  ftcgquery,\n                 FTC_Cache   cache )\n  {\n    FTC_SNode  *psnode = (FTC_SNode*)ftcpsnode;\n    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;\n\n\n    return FTC_SNode_New( psnode, gquery, cache );\n  }\n\n\n  FT_LOCAL_DEF( FT_Offset )\n  ftc_snode_weight( FTC_Node   ftcsnode,\n                    FTC_Cache  cache )\n  {\n    FTC_SNode  snode = (FTC_SNode)ftcsnode;\n    FT_UInt    count = snode->count;\n    FTC_SBit   sbit  = snode->sbits;\n    FT_Int     pitch;\n    FT_Offset  size;\n\n    FT_UNUSED( cache );\n\n\n    FT_ASSERT( snode->count <= FTC_SBIT_ITEMS_PER_NODE );\n\n    /* the node itself */\n    size = sizeof ( *snode );\n\n    for ( ; count > 0; count--, sbit++ )\n    {\n      if ( sbit->buffer )\n      {\n        pitch = sbit->pitch;\n        if ( pitch < 0 )\n          pitch = -pitch;\n\n        /* add the size of a given glyph image */\n        size += pitch * sbit->height;\n      }\n    }\n\n    return size;\n  }\n\n\n#if 0\n\n  FT_LOCAL_DEF( FT_Offset )\n  FTC_SNode_Weight( FTC_SNode  snode )\n  {\n    return ftc_snode_weight( FTC_NODE( snode ), NULL );\n  }\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  ftc_snode_compare( FTC_Node    ftcsnode,\n                     FT_Pointer  ftcgquery,\n                     FTC_Cache   cache,\n                     FT_Bool*    list_changed )\n  {\n    FTC_SNode   snode  = (FTC_SNode)ftcsnode;\n    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;\n    FTC_GNode   gnode  = FTC_GNODE( snode );\n    FT_UInt     gindex = gquery->gindex;\n    FT_Bool     result;\n\n\n    if (list_changed)\n      *list_changed = FALSE;\n    result = FT_BOOL( gnode->family == gquery->family                    &&\n                      (FT_UInt)( gindex - gnode->gindex ) < snode->count );\n    if ( result )\n    {\n      /* check if we need to load the glyph bitmap now */\n      FTC_SBit  sbit = snode->sbits + ( gindex - gnode->gindex );\n\n\n      /*\n       *  The following code illustrates what to do when you want to\n       *  perform operations that may fail within a lookup function.\n       *\n       *  Here, we want to load a small bitmap on-demand; we thus\n       *  need to call the `ftc_snode_load' function which may return\n       *  a non-zero error code only when we are out of memory (OOM).\n       *\n       *  The correct thing to do is to use @FTC_CACHE_TRYLOOP and\n       *  @FTC_CACHE_TRYLOOP_END in order to implement a retry loop\n       *  that is capable of flushing the cache incrementally when\n       *  an OOM errors occur.\n       *\n       *  However, we need to `lock' the node before this operation to\n       *  prevent it from being flushed within the loop.\n       *\n       *  When we exit the loop, we unlock the node, then check the `error'\n       *  variable.  If it is non-zero, this means that the cache was\n       *  completely flushed and that no usable memory was found to load\n       *  the bitmap.\n       *\n       *  We then prefer to return a value of 0 (i.e., NO MATCH).  This\n       *  ensures that the caller will try to allocate a new node.\n       *  This operation consequently _fail_ and the lookup function\n       *  returns the appropriate OOM error code.\n       *\n       *  Note that `buffer == NULL && width == 255' is a hack used to\n       *  tag `unavailable' bitmaps in the array.  We should never try\n       *  to load these.\n       *\n       */\n\n      if ( sbit->buffer == NULL && sbit->width == 255 )\n      {\n        FT_ULong  size;\n        FT_Error  error;\n\n\n        ftcsnode->ref_count++;  /* lock node to prevent flushing */\n                                /* in retry loop                 */\n\n        FTC_CACHE_TRYLOOP( cache )\n        {\n          error = ftc_snode_load( snode, cache->manager, gindex, &size );\n        }\n        FTC_CACHE_TRYLOOP_END( list_changed );\n\n        ftcsnode->ref_count--;  /* unlock the node */\n\n        if ( error )\n          result = 0;\n        else\n          cache->manager->cur_weight += size;\n      }\n    }\n\n    return result;\n  }\n\n\n#ifdef FTC_INLINE\n\n  FT_LOCAL_DEF( FT_Bool )\n  FTC_SNode_Compare( FTC_SNode   snode,\n                     FTC_GQuery  gquery,\n                     FTC_Cache   cache,\n                     FT_Bool*    list_changed )\n  {\n    return ftc_snode_compare( FTC_NODE( snode ), gquery,\n                              cache, list_changed );\n  }\n\n#endif\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/ftcsbits.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftcsbits.h                                                             */\n/*                                                                         */\n/*    A small-bitmap cache (specification).                                */\n/*                                                                         */\n/*  Copyright 2000-2001, 2002, 2003, 2006, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTCSBITS_H__\n#define __FTCSBITS_H__\n\n\n#include <ft2build.h>\n#include FT_CACHE_H\n#include \"ftcglyph.h\"\n\n\nFT_BEGIN_HEADER\n\n#define FTC_SBIT_ITEMS_PER_NODE  16\n\n  typedef struct  FTC_SNodeRec_\n  {\n    FTC_GNodeRec  gnode;\n    FT_UInt       count;\n    FTC_SBitRec   sbits[FTC_SBIT_ITEMS_PER_NODE];\n\n  } FTC_SNodeRec, *FTC_SNode;\n\n\n#define FTC_SNODE( x )         ( (FTC_SNode)( x ) )\n#define FTC_SNODE_GINDEX( x )  FTC_GNODE( x )->gindex\n#define FTC_SNODE_FAMILY( x )  FTC_GNODE( x )->family\n\n  typedef FT_UInt\n  (*FTC_SFamily_GetCountFunc)( FTC_Family   family,\n                               FTC_Manager  manager );\n\n  typedef FT_Error\n  (*FTC_SFamily_LoadGlyphFunc)( FTC_Family   family,\n                                FT_UInt      gindex,\n                                FTC_Manager  manager,\n                                FT_Face     *aface );\n\n  typedef struct  FTC_SFamilyClassRec_\n  {\n    FTC_MruListClassRec        clazz;\n    FTC_SFamily_GetCountFunc   family_get_count;\n    FTC_SFamily_LoadGlyphFunc  family_load_glyph;\n\n  } FTC_SFamilyClassRec;\n\n  typedef const FTC_SFamilyClassRec*  FTC_SFamilyClass;\n\n#define FTC_SFAMILY_CLASS( x )  ((FTC_SFamilyClass)(x))\n\n#define FTC_CACHE__SFAMILY_CLASS( x )  \\\n          FTC_SFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS( x )->family_class )\n\n\n  FT_LOCAL( void )\n  FTC_SNode_Free( FTC_SNode  snode,\n                  FTC_Cache  cache );\n\n  FT_LOCAL( FT_Error )\n  FTC_SNode_New( FTC_SNode   *psnode,\n                 FTC_GQuery   gquery,\n                 FTC_Cache    cache );\n\n#if 0\n  FT_LOCAL( FT_ULong )\n  FTC_SNode_Weight( FTC_SNode  inode );\n#endif\n\n\n#ifdef FTC_INLINE\n\n  FT_LOCAL( FT_Bool )\n  FTC_SNode_Compare( FTC_SNode   snode,\n                     FTC_GQuery  gquery,\n                     FTC_Cache   cache,\n                     FT_Bool*    list_changed);\n\n#endif\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __FTCSBITS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cache/rules.mk",
    "content": "#\n# FreeType 2 Cache configuration rules\n#\n\n\n# Copyright 2000, 2001, 2003, 2004, 2006, 2008 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# Cache driver directory\n#\nCACHE_DIR   := $(SRC_DIR)/cache\n\n# compilation flags for the driver\n#\nCACHE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CACHE_DIR))\n\n\n# Cache driver sources (i.e., C files)\n#\nCACHE_DRV_SRC := $(CACHE_DIR)/ftcbasic.c \\\n                 $(CACHE_DIR)/ftccache.c \\\n                 $(CACHE_DIR)/ftccmap.c  \\\n                 $(CACHE_DIR)/ftcglyph.c \\\n                 $(CACHE_DIR)/ftcimage.c \\\n                 $(CACHE_DIR)/ftcmanag.c \\\n                 $(CACHE_DIR)/ftcmru.c   \\\n                 $(CACHE_DIR)/ftcsbits.c\n\n# Cache driver headers\n#\nCACHE_DRV_H := $(CACHE_DIR)/ftccache.h \\\n               $(CACHE_DIR)/ftccback.h \\\n               $(CACHE_DIR)/ftcerror.h \\\n               $(CACHE_DIR)/ftcglyph.h \\\n               $(CACHE_DIR)/ftcimage.h \\\n               $(CACHE_DIR)/ftcmanag.h \\\n               $(CACHE_DIR)/ftcmru.h   \\\n               $(CACHE_DIR)/ftcsbits.h\n\n\n# Cache driver object(s)\n#\n#   CACHE_DRV_OBJ_M is used during `multi' builds.\n#   CACHE_DRV_OBJ_S is used during `single' builds.\n#\nCACHE_DRV_OBJ_M := $(CACHE_DRV_SRC:$(CACHE_DIR)/%.c=$(OBJ_DIR)/%.$O)\nCACHE_DRV_OBJ_S := $(OBJ_DIR)/ftcache.$O\n\n# Cache driver source file for single build\n#\nCACHE_DRV_SRC_S := $(CACHE_DIR)/ftcache.c\n\n\n# Cache driver - single object\n#\n$(CACHE_DRV_OBJ_S): $(CACHE_DRV_SRC_S) $(CACHE_DRV_SRC) \\\n                   $(FREETYPE_H) $(CACHE_DRV_H)\n\t$(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CACHE_DRV_SRC_S))\n\n\n# Cache driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(CACHE_DIR)/%.c $(FREETYPE_H) $(CACHE_DRV_H)\n\t$(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(CACHE_DRV_OBJ_S)\nDRV_OBJS_M += $(CACHE_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/cff/Jamfile",
    "content": "# FreeType 2 src/cff Jamfile\n#\n# Copyright 2001, 2002 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) cff ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap cffpic ;\n  }\n  else\n  {\n    _sources = cff ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/cff Jamfile\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2arrst.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2arrst.c                                                             */\n/*                                                                         */\n/*    Adobe's code for Array Stacks (body).                                */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include FT_INTERNAL_DEBUG_H\n\n#include \"cf2glue.h\"\n#include \"cf2arrst.h\"\n\n#include \"cf2error.h\"\n\n\n  /*\n   * CF2_ArrStack uses an error pointer, to enable shared errors.\n   * Shared errors are necessary when multiple objects allow the program\n   * to continue after detecting errors.  Only the first error should be\n   * recorded.\n   */\n\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_init( CF2_ArrStack  arrstack,\n                     FT_Memory     memory,\n                     FT_Error*     error,\n                     size_t        sizeItem )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    /* initialize the structure */\n    arrstack->memory    = memory;\n    arrstack->error     = error;\n    arrstack->sizeItem  = sizeItem;\n    arrstack->allocated = 0;\n    arrstack->chunk     = 10;    /* chunks of 10 items */\n    arrstack->count     = 0;\n    arrstack->totalSize = 0;\n    arrstack->ptr       = NULL;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_finalize( CF2_ArrStack  arrstack )\n  {\n    FT_Memory  memory = arrstack->memory;     /* for FT_FREE */\n\n\n    FT_ASSERT( arrstack != NULL );\n\n    arrstack->allocated = 0;\n    arrstack->count     = 0;\n    arrstack->totalSize = 0;\n\n    /* free the data buffer */\n    FT_FREE( arrstack->ptr );\n  }\n\n\n  /* allocate or reallocate the buffer size; */\n  /* return false on memory error */\n  static FT_Bool\n  cf2_arrstack_setNumElements( CF2_ArrStack  arrstack,\n                               size_t        numElements )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    {\n      FT_Error   error  = FT_Err_Ok;        /* for FT_REALLOC */\n      FT_Memory  memory = arrstack->memory; /* for FT_REALLOC */\n\n      FT_Long  newSize = numElements * arrstack->sizeItem;\n\n\n      if ( numElements > LONG_MAX / arrstack->sizeItem )\n        goto exit;\n\n\n      FT_ASSERT( newSize > 0 );   /* avoid realloc with zero size */\n\n      if ( !FT_REALLOC( arrstack->ptr, arrstack->totalSize, newSize ) )\n      {\n        arrstack->allocated = numElements;\n        arrstack->totalSize = newSize;\n\n        if ( arrstack->count > numElements )\n        {\n          /* we truncated the list! */\n          CF2_SET_ERROR( arrstack->error, Stack_Overflow );\n          arrstack->count = numElements;\n          return FALSE;\n        }\n\n        return TRUE;     /* success */\n      }\n    }\n\n  exit:\n    /* if there's not already an error, store this one */\n    CF2_SET_ERROR( arrstack->error, Out_Of_Memory );\n\n    return FALSE;\n  }\n\n\n  /* set the count, ensuring allocation is sufficient */\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_setCount( CF2_ArrStack  arrstack,\n                         size_t        numElements )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    if ( numElements > arrstack->allocated )\n    {\n      /* expand the allocation first */\n      if ( !cf2_arrstack_setNumElements( arrstack, numElements ) )\n        return;\n    }\n\n    arrstack->count = numElements;\n  }\n\n\n  /* clear the count */\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_clear( CF2_ArrStack  arrstack )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    arrstack->count = 0;\n  }\n\n\n  /* current number of items */\n  FT_LOCAL_DEF( size_t )\n  cf2_arrstack_size( const CF2_ArrStack  arrstack )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    return arrstack->count;\n  }\n\n\n  FT_LOCAL_DEF( void* )\n  cf2_arrstack_getBuffer( const CF2_ArrStack  arrstack )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    return arrstack->ptr;\n  }\n\n\n  /* return pointer to the given element */\n  FT_LOCAL_DEF( void* )\n  cf2_arrstack_getPointer( const CF2_ArrStack  arrstack,\n                           size_t              idx )\n  {\n    void*  newPtr;\n\n\n    FT_ASSERT( arrstack != NULL );\n\n    if ( idx >= arrstack->count )\n    {\n      /* overflow */\n      CF2_SET_ERROR( arrstack->error, Stack_Overflow );\n      idx = 0;    /* choose safe default */\n    }\n\n    newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem;\n\n    return newPtr;\n  }\n\n\n  /* push (append) an element at the end of the list;         */\n  /* return false on memory error                             */\n  /* TODO: should there be a length param for extra checking? */\n  FT_LOCAL_DEF( void )\n  cf2_arrstack_push( CF2_ArrStack  arrstack,\n                     const void*   ptr )\n  {\n    FT_ASSERT( arrstack != NULL );\n\n    if ( arrstack->count == arrstack->allocated )\n    {\n      /* grow the buffer by one chunk */\n      if ( !cf2_arrstack_setNumElements(\n             arrstack, arrstack->allocated + arrstack->chunk ) )\n      {\n        /* on error, ignore the push */\n        return;\n      }\n    }\n\n    FT_ASSERT( ptr != NULL );\n\n    {\n      size_t  offset = arrstack->count * arrstack->sizeItem;\n      void*   newPtr = (FT_Byte*)arrstack->ptr + offset;\n\n\n      FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem );\n      arrstack->count += 1;\n    }\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2arrst.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2arrst.h                                                             */\n/*                                                                         */\n/*    Adobe's code for Array Stacks (specification).                       */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2ARRST_H__\n#define __CF2ARRST_H__\n\n\n#include \"cf2error.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* need to define the struct here (not opaque) so it can be allocated by */\n  /* clients                                                               */\n  typedef struct  CF2_ArrStackRec_\n  {\n    FT_Memory  memory;\n    FT_Error*  error;\n\n    size_t  sizeItem;       /* bytes per element             */\n    size_t  allocated;      /* items allocated               */\n    size_t  chunk;          /* allocation increment in items */\n    size_t  count;          /* number of elements allocated  */\n    size_t  totalSize;      /* total bytes allocated         */\n\n    void*  ptr;             /* ptr to data                   */\n\n  } CF2_ArrStackRec, *CF2_ArrStack;\n\n\n  FT_LOCAL( void )\n  cf2_arrstack_init( CF2_ArrStack  arrstack,\n                     FT_Memory     memory,\n                     FT_Error*     error,\n                     size_t        sizeItem );\n  FT_LOCAL( void )\n  cf2_arrstack_finalize( CF2_ArrStack  arrstack );\n\n  FT_LOCAL( void )\n  cf2_arrstack_setCount( CF2_ArrStack  arrstack,\n                         size_t        numElements );\n  FT_LOCAL( void )\n  cf2_arrstack_clear( CF2_ArrStack  arrstack );\n  FT_LOCAL( size_t )\n  cf2_arrstack_size( const CF2_ArrStack  arrstack );\n\n  FT_LOCAL( void* )\n  cf2_arrstack_getBuffer( const CF2_ArrStack  arrstack );\n  FT_LOCAL( void* )\n  cf2_arrstack_getPointer( const CF2_ArrStack  arrstack,\n                           size_t              idx );\n\n  FT_LOCAL( void )\n  cf2_arrstack_push( CF2_ArrStack  arrstack,\n                     const void*   ptr );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2ARRST_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2blues.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2blues.c                                                             */\n/*                                                                         */\n/*    Adobe's code for handling Blue Zones (body).                         */\n/*                                                                         */\n/*  Copyright 2009-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include FT_INTERNAL_DEBUG_H\n\n#include \"cf2blues.h\"\n#include \"cf2hints.h\"\n#include \"cf2font.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cf2blues\n\n\n  /*\n   * For blue values, the FreeType parser produces an array of integers,\n   * while the Adobe CFF engine produces an array of fixed.\n   * Define a macro to convert FreeType to fixed.\n   */\n#define cf2_blueToFixed( x )  cf2_intToFixed( x )\n\n\n  FT_LOCAL_DEF( void )\n  cf2_blues_init( CF2_Blues  blues,\n                  CF2_Font   font )\n  {\n    /* pointer to parsed font object */\n    CFF_Decoder*  decoder = font->decoder;\n\n    CF2_Fixed  zoneHeight;\n    CF2_Fixed  maxZoneHeight = 0;\n    CF2_Fixed  csUnitsPerPixel;\n\n    size_t  numBlueValues;\n    size_t  numOtherBlues;\n    size_t  numFamilyBlues;\n    size_t  numFamilyOtherBlues;\n\n    FT_Pos*  blueValues;\n    FT_Pos*  otherBlues;\n    FT_Pos*  familyBlues;\n    FT_Pos*  familyOtherBlues;\n\n    size_t     i;\n    CF2_Fixed  emBoxBottom, emBoxTop;\n\n    CF2_Int  unitsPerEm = font->unitsPerEm;\n\n\n    if ( unitsPerEm == 0 )\n      unitsPerEm = 1000;\n\n    FT_ZERO( blues );\n    blues->scale = font->innerTransform.d;\n\n    cf2_getBlueMetrics( decoder,\n                        &blues->blueScale,\n                        &blues->blueShift,\n                        &blues->blueFuzz );\n\n    cf2_getBlueValues( decoder, &numBlueValues, &blueValues );\n    cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues );\n    cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues );\n    cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues );\n\n    /*\n     * synthetic em box hint heuristic\n     *\n     * Apply this when ideographic dictionary (LanguageGroup 1) has no\n     * real alignment zones.  Adobe tools generate dummy zones at -250 and\n     * 1100 for a 1000 unit em.  Fonts with ICF-based alignment zones\n     * should not enable the heuristic.  When the heuristic is enabled,\n     * the font's blue zones are ignored.\n     *\n     */\n\n    /* get em box from OS/2 typoAscender/Descender                      */\n    /* TODO: FreeType does not parse these metrics.  Skip them for now. */\n#if 0\n    FCM_getHorizontalLineMetrics( &e,\n                                  font->font,\n                                  &ascender,\n                                  &descender,\n                                  &linegap );\n    if ( ascender - descender == unitsPerEm )\n    {\n      emBoxBottom = cf2_intToFixed( descender );\n      emBoxTop    = cf2_intToFixed( ascender );\n    }\n    else\n#endif\n    {\n      emBoxBottom = CF2_ICF_Bottom;\n      emBoxTop    = CF2_ICF_Top;\n    }\n\n    if ( cf2_getLanguageGroup( decoder ) == 1                   &&\n         ( numBlueValues == 0                                 ||\n           ( numBlueValues == 4                             &&\n             cf2_blueToFixed( blueValues[0] ) < emBoxBottom &&\n             cf2_blueToFixed( blueValues[1] ) < emBoxBottom &&\n             cf2_blueToFixed( blueValues[2] ) > emBoxTop    &&\n             cf2_blueToFixed( blueValues[3] ) > emBoxTop    ) ) )\n    {\n      /*\n       * Construct hint edges suitable for synthetic ghost hints at top\n       * and bottom of em box.  +-CF2_MIN_COUNTER allows for unhinted\n       * features above or below the last hinted edge.  This also gives a\n       * net 1 pixel boost to the height of ideographic glyphs.\n       *\n       * Note: Adjust synthetic hints outward by epsilon (0x.0001) to\n       *       avoid interference.  E.g., some fonts have real hints at\n       *       880 and -120.\n       */\n\n      blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON;\n      blues->emBoxBottomEdge.dsCoord = cf2_fixedRound(\n                                         FT_MulFix(\n                                           blues->emBoxBottomEdge.csCoord,\n                                           blues->scale ) ) -\n                                       CF2_MIN_COUNTER;\n      blues->emBoxBottomEdge.scale   = blues->scale;\n      blues->emBoxBottomEdge.flags   = CF2_GhostBottom |\n                                       CF2_Locked |\n                                       CF2_Synthetic;\n\n      blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON +\n                                    2 * font->darkenY;\n      blues->emBoxTopEdge.dsCoord = cf2_fixedRound(\n                                      FT_MulFix(\n                                        blues->emBoxTopEdge.csCoord,\n                                        blues->scale ) ) +\n                                    CF2_MIN_COUNTER;\n      blues->emBoxTopEdge.scale   = blues->scale;\n      blues->emBoxTopEdge.flags   = CF2_GhostTop |\n                                    CF2_Locked |\n                                    CF2_Synthetic;\n\n      blues->doEmBoxHints = TRUE;    /* enable the heuristic */\n\n      return;\n    }\n\n    /* copy `BlueValues' and `OtherBlues' to a combined array of top and */\n    /* bottom zones                                                      */\n    for ( i = 0; i < numBlueValues; i += 2 )\n    {\n      blues->zone[blues->count].csBottomEdge =\n        cf2_blueToFixed( blueValues[i] );\n      blues->zone[blues->count].csTopEdge =\n        cf2_blueToFixed( blueValues[i + 1] );\n\n      zoneHeight = blues->zone[blues->count].csTopEdge -\n                   blues->zone[blues->count].csBottomEdge;\n\n      if ( zoneHeight < 0 )\n      {\n        FT_TRACE4(( \"cf2_blues_init: ignoring negative zone height\\n\" ));\n        continue;   /* reject this zone */\n      }\n\n      if ( zoneHeight > maxZoneHeight )\n      {\n        /* take maximum before darkening adjustment      */\n        /* so overshoot suppression point doesn't change */\n        maxZoneHeight = zoneHeight;\n      }\n\n      /* adjust both edges of top zone upward by twice darkening amount */\n      if ( i != 0 )\n      {\n        blues->zone[blues->count].csTopEdge    += 2 * font->darkenY;\n        blues->zone[blues->count].csBottomEdge += 2 * font->darkenY;\n      }\n\n      /* first `BlueValue' is bottom zone; others are top */\n      if ( i == 0 )\n      {\n        blues->zone[blues->count].bottomZone =\n          TRUE;\n        blues->zone[blues->count].csFlatEdge =\n          blues->zone[blues->count].csTopEdge;\n      }\n      else\n      {\n        blues->zone[blues->count].bottomZone =\n          FALSE;\n        blues->zone[blues->count].csFlatEdge =\n          blues->zone[blues->count].csBottomEdge;\n      }\n\n      blues->count += 1;\n    }\n\n    for ( i = 0; i < numOtherBlues; i += 2 )\n    {\n      blues->zone[blues->count].csBottomEdge =\n        cf2_blueToFixed( otherBlues[i] );\n      blues->zone[blues->count].csTopEdge =\n        cf2_blueToFixed( otherBlues[i + 1] );\n\n      zoneHeight = blues->zone[blues->count].csTopEdge -\n                   blues->zone[blues->count].csBottomEdge;\n\n      if ( zoneHeight < 0 )\n      {\n        FT_TRACE4(( \"cf2_blues_init: ignoring negative zone height\\n\" ));\n        continue;   /* reject this zone */\n      }\n\n      if ( zoneHeight > maxZoneHeight )\n      {\n        /* take maximum before darkening adjustment      */\n        /* so overshoot suppression point doesn't change */\n        maxZoneHeight = zoneHeight;\n      }\n\n      /* Note: bottom zones are not adjusted for darkening amount */\n\n      /* all OtherBlues are bottom zone */\n      blues->zone[blues->count].bottomZone =\n        TRUE;\n      blues->zone[blues->count].csFlatEdge =\n        blues->zone[blues->count].csTopEdge;\n\n      blues->count += 1;\n    }\n\n    /* Adjust for FamilyBlues */\n\n    /* Search for the nearest flat edge in `FamilyBlues' or                */\n    /* `FamilyOtherBlues'.  According to the Black Book, any matching edge */\n    /* must be within one device pixel                                     */\n\n    csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale );\n\n    /* loop on all zones in this font */\n    for ( i = 0; i < blues->count; i++ )\n    {\n      size_t     j;\n      CF2_Fixed  minDiff;\n      CF2_Fixed  flatFamilyEdge, diff;\n      /* value for this font */\n      CF2_Fixed  flatEdge = blues->zone[i].csFlatEdge;\n\n\n      if ( blues->zone[i].bottomZone )\n      {\n        /* In a bottom zone, the top edge is the flat edge.             */\n        /* Search `FamilyOtherBlues' for bottom zones; look for closest */\n        /* Family edge that is within the one pixel threshold.          */\n\n        minDiff = CF2_FIXED_MAX;\n\n        for ( j = 0; j < numFamilyOtherBlues; j += 2 )\n        {\n          /* top edge */\n          flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] );\n\n          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );\n\n          if ( diff < minDiff && diff < csUnitsPerPixel )\n          {\n            blues->zone[i].csFlatEdge = flatFamilyEdge;\n            minDiff                   = diff;\n\n            if ( diff == 0 )\n              break;\n          }\n        }\n\n        /* check the first member of FamilyBlues, which is a bottom zone */\n        if ( numFamilyBlues >= 2 )\n        {\n          /* top edge */\n          flatFamilyEdge = cf2_blueToFixed( familyBlues[1] );\n\n          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );\n\n          if ( diff < minDiff && diff < csUnitsPerPixel )\n            blues->zone[i].csFlatEdge = flatFamilyEdge;\n        }\n      }\n      else\n      {\n        /* In a top zone, the bottom edge is the flat edge.                */\n        /* Search `FamilyBlues' for top zones; skip first zone, which is a */\n        /* bottom zone; look for closest Family edge that is within the    */\n        /* one pixel threshold                                             */\n\n        minDiff = CF2_FIXED_MAX;\n\n        for ( j = 2; j < numFamilyBlues; j += 2 )\n        {\n          /* bottom edge */\n          flatFamilyEdge = cf2_blueToFixed( familyBlues[j] );\n\n          /* adjust edges of top zone upward by twice darkening amount */\n          flatFamilyEdge += 2 * font->darkenY;      /* bottom edge */\n\n          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );\n\n          if ( diff < minDiff && diff < csUnitsPerPixel )\n          {\n            blues->zone[i].csFlatEdge = flatFamilyEdge;\n            minDiff                   = diff;\n\n            if ( diff == 0 )\n              break;\n          }\n        }\n      }\n    }\n\n    /* TODO: enforce separation of zones, including BlueFuzz */\n\n    /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */\n    /* `bcsetup.c'.                                               */\n\n    if ( maxZoneHeight > 0 )\n    {\n      if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ),\n                                         maxZoneHeight ) )\n      {\n        /* clamp at maximum scale */\n        blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ),\n                                      maxZoneHeight );\n      }\n\n      /*\n       * TODO: Revisit the bug fix for 613448.  The minimum scale\n       *       requirement catches a number of library fonts.  For\n       *       example, with default BlueScale (.039625) and 0.4 minimum,\n       *       the test below catches any font with maxZoneHeight < 10.1.\n       *       There are library fonts ranging from 2 to 10 that get\n       *       caught, including e.g., Eurostile LT Std Medium with\n       *       maxZoneHeight of 6.\n       *\n       */\n#if 0\n      if ( blueScale < .4 / maxZoneHeight )\n      {\n        tetraphilia_assert( 0 );\n        /* clamp at minimum scale, per bug 0613448 fix */\n        blueScale = .4 / maxZoneHeight;\n      }\n#endif\n\n    }\n\n    /*\n     * Suppress overshoot and boost blue zones at small sizes.  Boost\n     * amount varies linearly from 0.5 pixel near 0 to 0 pixel at\n     * blueScale cutoff.\n     * Note: This boost amount is different from the coretype heuristic.\n     *\n     */\n\n    if ( blues->scale < blues->blueScale )\n    {\n      blues->suppressOvershoot = TRUE;\n\n      /* Change rounding threshold for `dsFlatEdge'.                    */\n      /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */\n      /*       10ppem Arial                                             */\n\n      blues->boost = FT_MulFix(\n                       cf2_floatToFixed( .6 ),\n                       ( cf2_intToFixed( 1 ) -\n                         FT_DivFix( blues->scale,\n                                    blues->blueScale ) ) );\n      if ( blues->boost > 0x7FFF )\n      {\n        /* boost must remain less than 0.5, or baseline could go negative */\n        blues->boost = 0x7FFF;\n      }\n    }\n\n    /* boost and darkening have similar effects; don't do both */\n    if ( font->stemDarkened )\n      blues->boost = 0;\n\n    /* set device space alignment for each zone;    */\n    /* apply boost amount before rounding flat edge */\n\n    for ( i = 0; i < blues->count; i++ )\n    {\n      if ( blues->zone[i].bottomZone )\n        blues->zone[i].dsFlatEdge = cf2_fixedRound(\n                                      FT_MulFix(\n                                        blues->zone[i].csFlatEdge,\n                                        blues->scale ) -\n                                      blues->boost );\n      else\n        blues->zone[i].dsFlatEdge = cf2_fixedRound(\n                                      FT_MulFix(\n                                        blues->zone[i].csFlatEdge,\n                                        blues->scale ) +\n                                      blues->boost );\n    }\n  }\n\n\n  /*\n   * Check whether `stemHint' is captured by one of the blue zones.\n   *\n   * Zero, one or both edges may be valid; only valid edges can be\n   * captured.  For compatibility with CoolType, search top and bottom\n   * zones in the same pass (see `BlueLock').  If a hint is captured,\n   * return true and position the edge(s) in one of 3 ways:\n   *\n   *  1) If `BlueScale' suppresses overshoot, position the captured edge\n   *     at the flat edge of the zone.\n   *  2) If overshoot is not suppressed and `BlueShift' requires\n   *     overshoot, position the captured edge a minimum of 1 device pixel\n   *     from the flat edge.\n   *  3) If overshoot is not suppressed or required, position the captured\n   *     edge at the nearest device pixel.\n   *\n   */\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_blues_capture( const CF2_Blues  blues,\n                     CF2_Hint         bottomHintEdge,\n                     CF2_Hint         topHintEdge )\n  {\n    /* TODO: validate? */\n    CF2_Fixed  csFuzz = blues->blueFuzz;\n\n    /* new position of captured edge */\n    CF2_Fixed  dsNew;\n\n    /* amount that hint is moved when positioned */\n    CF2_Fixed  dsMove = 0;\n\n    FT_Bool   captured = FALSE;\n    CF2_UInt  i;\n\n\n    /* assert edge flags are consistent */\n    FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) &&\n               !cf2_hint_isBottom( topHintEdge ) );\n\n    /* TODO: search once without blue fuzz for compatibility with coretype? */\n    for ( i = 0; i < blues->count; i++ )\n    {\n      if ( blues->zone[i].bottomZone           &&\n           cf2_hint_isBottom( bottomHintEdge ) )\n      {\n        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=\n               bottomHintEdge->csCoord                   &&\n             bottomHintEdge->csCoord <=\n               ( blues->zone[i].csTopEdge + csFuzz )     )\n        {\n          /* bottom edge captured by bottom zone */\n\n          if ( blues->suppressOvershoot )\n            dsNew = blues->zone[i].dsFlatEdge;\n\n          else if ( ( blues->zone[i].csTopEdge - bottomHintEdge->csCoord ) >=\n                      blues->blueShift )\n          {\n            /* guarantee minimum of 1 pixel overshoot */\n            dsNew = FT_MIN(\n                      cf2_fixedRound( bottomHintEdge->dsCoord ),\n                      blues->zone[i].dsFlatEdge - cf2_intToFixed( 1 ) );\n          }\n\n          else\n          {\n            /* simply round captured edge */\n            dsNew = cf2_fixedRound( bottomHintEdge->dsCoord );\n          }\n\n          dsMove   = dsNew - bottomHintEdge->dsCoord;\n          captured = TRUE;\n\n          break;\n        }\n      }\n\n      if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) )\n      {\n        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=\n               topHintEdge->csCoord                      &&\n             topHintEdge->csCoord <=\n               ( blues->zone[i].csTopEdge + csFuzz )     )\n        {\n          /* top edge captured by top zone */\n\n          if ( blues->suppressOvershoot )\n            dsNew = blues->zone[i].dsFlatEdge;\n\n          else if ( ( topHintEdge->csCoord - blues->zone[i].csBottomEdge ) >=\n                      blues->blueShift )\n          {\n            /* guarantee minimum of 1 pixel overshoot */\n            dsNew = FT_MAX(\n                      cf2_fixedRound( topHintEdge->dsCoord ),\n                      blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) );\n          }\n\n          else\n          {\n            /* simply round captured edge */\n            dsNew = cf2_fixedRound( topHintEdge->dsCoord );\n          }\n\n          dsMove   = dsNew - topHintEdge->dsCoord;\n          captured = TRUE;\n\n          break;\n        }\n      }\n    }\n\n    if ( captured )\n    {\n      /* move both edges and flag them `locked' */\n      if ( cf2_hint_isValid( bottomHintEdge ) )\n      {\n        bottomHintEdge->dsCoord += dsMove;\n        cf2_hint_lock( bottomHintEdge );\n      }\n\n      if ( cf2_hint_isValid( topHintEdge ) )\n      {\n        topHintEdge->dsCoord += dsMove;\n        cf2_hint_lock( topHintEdge );\n      }\n    }\n\n    return captured;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2blues.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2blues.h                                                             */\n/*                                                                         */\n/*    Adobe's code for handling Blue Zones (specification).                */\n/*                                                                         */\n/*  Copyright 2009-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*\n   * A `CF2_Blues' object stores the blue zones (horizontal alignment\n   * zones) of a font.  These are specified in the CFF private dictionary\n   * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'.\n   * Each zone is defined by a top and bottom edge in character space.\n   * Further, each zone is either a top zone or a bottom zone, as recorded\n   * by `bottomZone'.\n   *\n   * The maximum number of `BlueValues' and `FamilyBlues' is 7 each.\n   * However, these are combined to produce a total of 7 zones.\n   * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues'\n   * is 5 and these are combined to produce an additional 5 zones.\n   *\n   * Blue zones are used to `capture' hints and force them to a common\n   * alignment point.  This alignment is recorded in device space in\n   * `dsFlatEdge'.  Except for this value, a `CF2_Blues' object could be\n   * constructed independently of scaling.  Construction may occur once\n   * the matrix is known.  Other features implemented in the Capture\n   * method are overshoot suppression, overshoot enforcement, and Blue\n   * Boost.\n   *\n   * Capture is determined by `BlueValues' and `OtherBlues', but the\n   * alignment point may be adjusted to the scaled flat edge of\n   * `FamilyBlues' or `FamilyOtherBlues'.  No alignment is done to the\n   * curved edge of a zone.\n   *\n   */\n\n\n#ifndef __CF2BLUES_H__\n#define __CF2BLUES_H__\n\n\n#include \"cf2glue.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   * `CF2_Hint' is shared by `cf2hints.h' and\n   * `cf2blues.h', but `cf2blues.h' depends on\n   * `cf2hints.h', so define it here.  Note: The typedef is in\n   * `cf2glue.h'.\n   *\n   */\n  enum\n  {\n    CF2_GhostBottom = 0x1,  /* a single bottom edge           */\n    CF2_GhostTop    = 0x2,  /* a single top edge              */\n    CF2_PairBottom  = 0x4,  /* the bottom edge of a stem hint */\n    CF2_PairTop     = 0x8,  /* the top edge of a stem hint    */\n    CF2_Locked      = 0x10, /* this edge has been aligned     */\n                            /* by a blue zone                 */\n    CF2_Synthetic   = 0x20  /* this edge was synthesized      */\n  };\n\n\n  /*\n   * Default value for OS/2 typoAscender/Descender when their difference\n   * is not equal to `unitsPerEm'.  The default is based on -250 and 1100\n   * in `CF2_Blues', assuming 1000 units per em here.\n   *\n   */\n  enum\n  {\n    CF2_ICF_Top    = cf2_intToFixed(  880 ),\n    CF2_ICF_Bottom = cf2_intToFixed( -120 )\n  };\n\n\n  /*\n   * Constant used for hint adjustment and for synthetic em box hint\n   * placement.\n   */\n#define CF2_MIN_COUNTER  cf2_floatToFixed( 0.5 )\n\n\n  /* shared typedef is in cf2glue.h */\n  struct  CF2_HintRec_\n  {\n    CF2_UInt  flags;  /* attributes of the edge            */\n    size_t    index;  /* index in original stem hint array */\n                      /* (if not synthetic)                */\n    CF2_Fixed  csCoord;\n    CF2_Fixed  dsCoord;\n    CF2_Fixed  scale;\n  };\n\n\n  typedef struct  CF2_BlueRec_\n  {\n    CF2_Fixed  csBottomEdge;\n    CF2_Fixed  csTopEdge;\n    CF2_Fixed  csFlatEdge; /* may be from either local or Family zones */\n    CF2_Fixed  dsFlatEdge; /* top edge of bottom zone or bottom edge   */\n                           /* of top zone (rounded)                    */\n    FT_Bool  bottomZone;\n\n  } CF2_BlueRec;\n\n\n  /* max total blue zones is 12 */\n  enum\n  {\n    CF2_MAX_BLUES      = 7,\n    CF2_MAX_OTHERBLUES = 5\n  };\n\n\n  typedef struct  CF2_BluesRec_\n  {\n    CF2_Fixed  scale;\n    CF2_UInt   count;\n    FT_Bool    suppressOvershoot;\n    FT_Bool    doEmBoxHints;\n\n    CF2_Fixed  blueScale;\n    CF2_Fixed  blueShift;\n    CF2_Fixed  blueFuzz;\n\n    CF2_Fixed  boost;\n\n    CF2_HintRec  emBoxTopEdge;\n    CF2_HintRec  emBoxBottomEdge;\n\n    CF2_BlueRec  zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES];\n\n  } CF2_BluesRec, *CF2_Blues;\n\n\n  FT_LOCAL( void )\n  cf2_blues_init( CF2_Blues  blues,\n                  CF2_Font   font );\n  FT_LOCAL( FT_Bool )\n  cf2_blues_capture( const CF2_Blues  blues,\n                     CF2_Hint         bottomHintEdge,\n                     CF2_Hint         topHintEdge );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2BLUES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2error.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2error.c                                                             */\n/*                                                                         */\n/*    Adobe's code for error handling (body).                              */\n/*                                                                         */\n/*  Copyright 2006-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include \"cf2error.h\"\n\n\n  FT_LOCAL_DEF( void )\n  cf2_setError( FT_Error*  error,\n                FT_Error   value )\n  {\n    if ( error && *error == 0 )\n      *error = value;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2error.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2error.h                                                             */\n/*                                                                         */\n/*    Adobe's code for error handling (specification).                     */\n/*                                                                         */\n/*  Copyright 2006-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2ERROR_H__\n#define __CF2ERROR_H__\n\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  CF2_Err_\n#define FT_ERR_BASE    FT_Mod_Err_CF2\n\n\n#include FT_ERRORS_H\n#include \"cf2ft.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   * A poor-man error facility.\n   *\n   * This code being written in vanilla C, doesn't have the luxury of a\n   * language-supported exception mechanism such as the one available in\n   * Java.  Instead, we are stuck with using error codes that must be\n   * carefully managed and preserved.  However, it is convenient for us to\n   * model our error mechanism on a Java-like exception mechanism.\n   * When we assign an error code we are thus `throwing' an error.\n   *\n   * The perservation of an error code is done by coding convention.\n   * Upon a function call if the error code is anything other than\n   * `FT_Err_Ok', which is guaranteed to be zero, we\n   * will return without altering that error.  This will allow the\n   * error to propogate and be handled at the appropriate location in\n   * the code.\n   *\n   * This allows a style of code where the error code is initialized\n   * up front and a block of calls are made with the error code only\n   * being checked after the block.  If a new error occurs, the original\n   * error will be preserved and a functional no-op should result in any\n   * subsequent function that has an initial error code not equal to\n   * `FT_Err_Ok'.\n   *\n   * Errors are encoded by calling the `FT_THROW' macro.  For example,\n   *\n   * {\n   *   FT_Error  e;\n   *\n   *\n   *   ...\n   *   e = FT_THROW( Out_Of_Memory );\n   * }\n   *\n   */\n\n\n  /* Set error code to a particular value. */\n  FT_LOCAL( void )\n  cf2_setError( FT_Error*  error,\n                FT_Error   value );\n\n\n  /*\n   * A macro that conditionally sets an error code.\n   *\n   * This macro will first check whether `error' is set;\n   * if not, it will set it to `e'.\n   *\n  */\n#define CF2_SET_ERROR( error, e )              \\\n          cf2_setError( error, FT_THROW( e ) )\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2ERROR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2fixed.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2fixed.h                                                             */\n/*                                                                         */\n/*    Adobe's code for Fixed Point Mathematics (specification only).       */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2FIXED_H__\n#define __CF2FIXED_H__\n\n\nFT_BEGIN_HEADER\n\n\n  /* rasterizer integer and fixed point arithmetic must be 32-bit */\n\n#define   CF2_Fixed  CF2_F16Dot16\n  typedef FT_Int32   CF2_Frac;   /* 2.30 fixed point */\n\n\n#define CF2_FIXED_MAX      ( (CF2_Fixed)0x7FFFFFFFL )\n#define CF2_FIXED_MIN      ( (CF2_Fixed)0x80000000L )\n#define CF2_FIXED_ONE      0x10000L\n#define CF2_FIXED_EPSILON  0x0001\n\n  /* in C 89, left and right shift of negative numbers is  */\n  /* implementation specific behaviour in the general case */\n\n#define cf2_intToFixed( i )                                    \\\n          ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) )\n#define cf2_fixedToInt( x )                                    \\\n          ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )\n#define cf2_fixedRound( x )                                    \\\n          ( (CF2_Fixed)( ( (x) + 0x8000 ) & 0xFFFF0000L ) )\n#define cf2_floatToFixed( f )                                  \\\n          ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) )\n#define cf2_fixedAbs( x )                                      \\\n          ( (x) < 0 ? -(x) : (x) )\n#define cf2_fixedFloor( x )                                    \\\n          ( (CF2_Fixed)( (x) & 0xFFFF0000L ) )\n#define cf2_fixedFraction( x )                                 \\\n          ( (x) - cf2_fixedFloor( x ) )\n#define cf2_fracToFixed( x )                                   \\\n          ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 )             \\\n                    :  ( (  (x) + 0x2000 ) >> 14 ) )\n\n\n  /* signed numeric types */\n  typedef enum  CF2_NumberType_\n  {\n    CF2_NumberFixed,    /* 16.16 */\n    CF2_NumberFrac,     /*  2.30 */\n    CF2_NumberInt       /* 32.0  */\n\n  } CF2_NumberType;\n\n\nFT_END_HEADER\n\n\n#endif /*  __CF2FIXED_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2font.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2font.c                                                              */\n/*                                                                         */\n/*    Adobe's code for font instances (body).                              */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n\n#include \"cf2glue.h\"\n#include \"cf2font.h\"\n#include \"cf2error.h\"\n#include \"cf2intrp.h\"\n\n\n  /* Compute a stem darkening amount in character space. */\n  static void\n  cf2_computeDarkening( CF2_Fixed   emRatio,\n                        CF2_Fixed   ppem,\n                        CF2_Fixed   stemWidth,\n                        CF2_Fixed*  darkenAmount,\n                        CF2_Fixed   boldenAmount,\n                        FT_Bool     stemDarkened )\n  {\n    /* Internal calculations are done in units per thousand for */\n    /* convenience.                                             */\n    CF2_Fixed  stemWidthPer1000, scaledStem;\n\n\n    *darkenAmount = 0;\n\n    if ( boldenAmount == 0 && !stemDarkened )\n      return;\n\n    /* protect against range problems and divide by zero */\n    if ( emRatio < cf2_floatToFixed( .01 ) )\n      return;\n\n    if ( stemDarkened )\n    {\n      /* convert from true character space to 1000 unit character space; */\n      /* add synthetic emboldening effect                                */\n\n      /* we have to assure that the computation of `scaledStem' */\n      /* and `stemWidthPer1000' don't overflow                  */\n\n      stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio );\n\n      if ( emRatio > CF2_FIXED_ONE                          &&\n           stemWidthPer1000 <= ( stemWidth + boldenAmount ) )\n      {\n        stemWidthPer1000 = 0;                      /* to pacify compiler */\n        scaledStem       = cf2_intToFixed( 2333 );\n      }\n      else\n      {\n        scaledStem = FT_MulFix( stemWidthPer1000, ppem );\n\n        if ( ppem > CF2_FIXED_ONE           &&\n             scaledStem <= stemWidthPer1000 )\n          scaledStem = cf2_intToFixed( 2333 );\n      }\n\n      /*\n       * Total darkening amount is computed in 1000 unit character space\n       * using the modified 5 part curve as Avalon rasterizer.\n       * The darkening amount is smaller for thicker stems.\n       * It becomes zero when the stem is thicker than 2.333 pixels.\n       *\n       * In Avalon rasterizer,\n       *\n       *   darkenAmount = 0.5 pixels   if scaledStem <= 0.5 pixels,\n       *   darkenAmount = 0.333 pixels if 1 <= scaledStem <= 1.667 pixels,\n       *   darkenAmount = 0 pixel      if scaledStem >= 2.333 pixels,\n       *\n       * and piecewise linear in-between.\n       *\n       */\n      if ( scaledStem < cf2_intToFixed( 500 ) )\n        *darkenAmount = FT_DivFix( cf2_intToFixed( 400 ), ppem );\n\n      else if ( scaledStem < cf2_intToFixed( 1000 ) )\n        *darkenAmount = FT_DivFix( cf2_intToFixed( 525 ), ppem ) -\n                          FT_MulFix( stemWidthPer1000,\n                                     cf2_floatToFixed( .25 ) );\n\n      else if ( scaledStem < cf2_intToFixed( 1667 ) )\n        *darkenAmount = FT_DivFix( cf2_intToFixed( 275 ), ppem );\n\n      else if ( scaledStem < cf2_intToFixed( 2333 ) )\n        *darkenAmount = FT_DivFix( cf2_intToFixed( 963 ), ppem ) -\n                          FT_MulFix( stemWidthPer1000,\n                                     cf2_floatToFixed( .413 ) );\n\n      /* use half the amount on each side and convert back to true */\n      /* character space                                           */\n      *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio );\n    }\n\n    /* add synthetic emboldening effect in character space */\n    *darkenAmount += boldenAmount / 2;\n  }\n\n\n  /* set up values for the current FontDict and matrix */\n\n  /* caller's transform is adjusted for subpixel positioning */\n  static void\n  cf2_font_setup( CF2_Font           font,\n                  const CF2_Matrix*  transform )\n  {\n    /* pointer to parsed font object */\n    CFF_Decoder*  decoder = font->decoder;\n\n    FT_Bool  needExtraSetup = FALSE;\n\n    /* character space units */\n    CF2_Fixed  boldenX = font->syntheticEmboldeningAmountX;\n    CF2_Fixed  boldenY = font->syntheticEmboldeningAmountY;\n\n    CF2_Fixed  ppem;\n\n\n    /* clear previous error */\n    font->error = FT_Err_Ok;\n\n    /* if a CID fontDict has changed, we need to recompute some cached */\n    /* data                                                            */\n    needExtraSetup = font->lastSubfont != cf2_getSubfont( decoder );\n\n    /* if ppem has changed, we need to recompute some cached data         */\n    /* note: because of CID font matrix concatenation, ppem and transform */\n    /*       do not necessarily track.                                    */\n    ppem = cf2_getPpemY( decoder );\n    if ( font->ppem != ppem )\n    {\n      font->ppem     = ppem;\n      needExtraSetup = TRUE;\n    }\n\n    /* copy hinted flag on each call */\n    font->hinted = font->renderingFlags & CF2_FlagsHinted;\n\n    /* determine if transform has changed;       */\n    /* include Fontmatrix but ignore translation */\n    if ( ft_memcmp( transform,\n                    &font->currentTransform,\n                    4 * sizeof ( CF2_Fixed ) ) != 0 )\n    {\n      /* save `key' information for `cache of one' matrix data; */\n      /* save client transform, without the translation         */\n      font->currentTransform    = *transform;\n      font->currentTransform.tx =\n      font->currentTransform.ty = cf2_intToFixed( 0 );\n\n      /* TODO: FreeType transform is simple scalar; for now, use identity */\n      /*       for outer                                                  */\n      font->innerTransform   = *transform;\n      font->outerTransform.a =\n      font->outerTransform.d = cf2_intToFixed( 1 );\n      font->outerTransform.b =\n      font->outerTransform.c = cf2_intToFixed( 0 );\n\n      needExtraSetup = TRUE;\n    }\n\n    /*\n     * font->darkened is set to true if there is a stem darkening request or\n     * the font is synthetic emboldened.\n     * font->darkened controls whether to adjust blue zones, winding order,\n     * and hinting.\n     *\n     */\n    if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) )\n    {\n      font->stemDarkened = font->renderingFlags & CF2_FlagsDarkened;\n\n      /* blue zones depend on darkened flag */\n      needExtraSetup = TRUE;\n    }\n\n    /* recompute variables that are dependent on transform or FontDict or */\n    /* darken flag                                                        */\n    if ( needExtraSetup )\n    {\n      /* StdVW is found in the private dictionary;                       */\n      /* recompute darkening amounts whenever private dictionary or      */\n      /* transform change                                                */\n      /* Note: a rendering flag turns darkening on or off, so we want to */\n      /*       store the `on' amounts;                                   */\n      /*       darkening amount is computed in character space           */\n      /* TODO: testing size-dependent darkening here;                    */\n      /*       what to do for rotations?                                 */\n\n      CF2_Fixed  emRatio;\n      CF2_Fixed  stdHW;\n      CF2_Int    unitsPerEm = font->unitsPerEm;\n\n\n      if ( unitsPerEm == 0 )\n        unitsPerEm = 1000;\n\n      ppem = FT_MAX( cf2_intToFixed( 4 ),\n                     font->ppem ); /* use minimum ppem of 4 */\n\n#if 0\n      /* since vstem is measured in the x-direction, we use the `a' member */\n      /* of the fontMatrix                                                 */\n      emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a );\n#endif\n\n      /* Freetype does not preserve the fontMatrix when parsing; use */\n      /* unitsPerEm instead.                                         */\n      /* TODO: check precision of this                               */\n      emRatio     = cf2_intToFixed( 1000 ) / unitsPerEm;\n      font->stdVW = cf2_getStdVW( decoder );\n\n      if ( font->stdVW <= 0 )\n        font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );\n\n      if ( boldenX > 0 )\n      {\n        /* Ensure that boldenX is at least 1 pixel for synthetic bold font */\n        /* (similar to what Avalon does)                                   */\n        boldenX = FT_MAX( boldenX,\n                          FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) );\n\n        /* Synthetic emboldening adds at least 1 pixel to darkenX, while */\n        /* stem darkening adds at most half pixel.  Since the purpose of */\n        /* stem darkening (readability at small sizes) is met with       */\n        /* synthetic emboldening, no need to add stem darkening for a    */\n        /* synthetic bold font.                                          */\n        cf2_computeDarkening( emRatio,\n                              ppem,\n                              font->stdVW,\n                              &font->darkenX,\n                              boldenX,\n                              FALSE );\n      }\n      else\n        cf2_computeDarkening( emRatio,\n                              ppem,\n                              font->stdVW,\n                              &font->darkenX,\n                              0,\n                              font->stemDarkened );\n\n#if 0\n      /* since hstem is measured in the y-direction, we use the `d' member */\n      /* of the fontMatrix                                                 */\n      /* TODO: use the same units per em as above; check this              */\n      emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d );\n#endif\n\n      /* set the default stem width, because it must be the same for all */\n      /* family members;                                                 */\n      /* choose a constant for StdHW that depends on font contrast       */\n      stdHW = cf2_getStdHW( decoder );\n\n      if ( stdHW > 0 && font->stdVW > 2 * stdHW )\n        font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );\n      else\n      {\n        /* low contrast font gets less hstem darkening */\n        font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio );\n      }\n\n      cf2_computeDarkening( emRatio,\n                            ppem,\n                            font->stdHW,\n                            &font->darkenY,\n                            boldenY,\n                            font->stemDarkened );\n\n      if ( font->darkenX != 0 || font->darkenY != 0 )\n        font->darkened = TRUE;\n      else\n        font->darkened = FALSE;\n\n      font->reverseWinding = FALSE; /* initial expectation is CCW */\n\n      /* compute blue zones for this instance */\n      cf2_blues_init( &font->blues, font );\n    }\n  }\n\n\n  /* equivalent to AdobeGetOutline */\n  FT_LOCAL_DEF( FT_Error )\n  cf2_getGlyphWidth( CF2_Font           font,\n                     CF2_Buffer         charstring,\n                     const CF2_Matrix*  transform,\n                     CF2_F16Dot16*      glyphWidth )\n  {\n    FT_Error  lastError = FT_Err_Ok;\n\n    FT_Vector  translation;\n\n#if 0\n    FT_Vector  advancePoint;\n#endif\n\n    CF2_Fixed  advWidth;\n    FT_Bool    needWinding;\n\n\n    /* Note: use both integer and fraction for outlines.  This allows bbox */\n    /*       to come out directly.                                         */\n\n    translation.x = transform->tx;\n    translation.y = transform->ty;\n\n    /* set up values based on transform */\n    cf2_font_setup( font, transform );\n    if ( font->error )\n      goto exit;                      /* setup encountered an error */\n\n    /* reset darken direction */\n    font->reverseWinding = FALSE;\n\n    /* winding order only affects darkening */\n    needWinding = font->darkened;\n\n    while ( 1 )\n    {\n      /* reset output buffer */\n      cf2_outline_reset( &font->outline );\n\n      /* build the outline, passing the full translation */\n      cf2_interpT2CharString( font,\n                              charstring,\n                              (CF2_OutlineCallbacks)&font->outline,\n                              &translation,\n                              FALSE,\n                              0,\n                              0,\n                              &advWidth );\n\n      if ( font->error )\n        goto exit;\n\n      if ( !needWinding )\n        break;\n\n      /* check winding order */\n      if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */\n        break;\n\n      /* invert darkening and render again                            */\n      /* TODO: this should be a parameter to getOutline-computeOffset */\n      font->reverseWinding = TRUE;\n\n      needWinding = FALSE;    /* exit after next iteration */\n    }\n\n    /* finish storing client outline */\n    cf2_outline_close( &font->outline );\n\n    /* FreeType just wants the advance width; there is no translation */\n    *glyphWidth = advWidth;\n\n    /* free resources and collect errors from objects we've used */\n  exit:\n    cf2_setError( &font->error, lastError );\n\n    return font->error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2font.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2font.h                                                              */\n/*                                                                         */\n/*    Adobe's code for font instances (specification).                     */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2FONT_H__\n#define __CF2FONT_H__\n\n\n#include \"cf2ft.h\"\n#include \"cf2blues.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define CF2_OPERAND_STACK_SIZE  48\n#define CF2_MAX_SUBR            10 /* maximum subroutine nesting */\n\n\n  /* typedef is in `cf2glue.h' */\n  struct  CF2_FontRec_\n  {\n    FT_Memory  memory;\n    FT_Error   error;     /* shared error for this instance */\n\n    CF2_RenderingFlags  renderingFlags;\n\n    /* variables that depend on Transform:  */\n    /* the following have zero translation; */\n    /* inner * outer = font * original      */\n\n    CF2_Matrix  currentTransform;  /* original client matrix           */\n    CF2_Matrix  innerTransform;    /* for hinting; erect, scaled       */\n    CF2_Matrix  outerTransform;    /* post hinting; includes rotations */\n    CF2_Fixed   ppem;              /* transform-dependent              */\n\n    CF2_Int  unitsPerEm;\n\n    CF2_Fixed  syntheticEmboldeningAmountX;   /* character space units */\n    CF2_Fixed  syntheticEmboldeningAmountY;   /* character space units */\n\n    /* FreeType related members */\n    CF2_OutlineRec  outline;       /* freetype glyph outline functions */\n    CFF_Decoder*    decoder;\n    CFF_SubFont     lastSubfont;              /* FreeType parsed data; */\n                                              /* top font or subfont   */\n\n    /* these flags can vary from one call to the next */\n    FT_Bool  hinted;\n    FT_Bool  darkened;       /* true if stemDarkened or synthetic bold */\n                             /* i.e. darkenX != 0 || darkenY != 0      */\n    FT_Bool  stemDarkened;\n\n    /* variables that depend on both FontDict and Transform */\n    CF2_Fixed  stdVW;     /* in character space; depends on dict entry */\n    CF2_Fixed  stdHW;     /* in character space; depends on dict entry */\n    CF2_Fixed  darkenX;                    /* character space units    */\n    CF2_Fixed  darkenY;                    /* depends on transform     */\n                                           /* and private dict (StdVW) */\n    FT_Bool  reverseWinding;               /* darken assuming          */\n                                           /* counterclockwise winding */\n\n    CF2_BluesRec  blues;                         /* computed zone data */\n  };\n\n\n  FT_LOCAL( FT_Error )\n  cf2_getGlyphWidth( CF2_Font           font,\n                     CF2_Buffer         charstring,\n                     const CF2_Matrix*  transform,\n                     CF2_F16Dot16*      glyphWidth );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2FONT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2ft.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2ft.c                                                                */\n/*                                                                         */\n/*    FreeType Glue Component to Adobe's Interpreter (body).               */\n/*                                                                         */\n/*  Copyright 2013 Adobe Systems Incorporated.                             */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include FT_INTERNAL_DEBUG_H\n\n#include \"cf2font.h\"\n#include \"cf2error.h\"\n\n\n#define CF2_MAX_SIZE  cf2_intToFixed( 2000 )    /* max ppem */\n\n\n  /*\n   * This check should avoid most internal overflow cases.  Clients should\n   * generally respond to `Glyph_Too_Big' by getting a glyph outline\n   * at EM size, scaling it and filling it as a graphics operation.\n   *\n   */\n  static FT_Error\n  cf2_checkTransform( const CF2_Matrix*  transform,\n                      CF2_Int            unitsPerEm )\n  {\n    CF2_Fixed  maxScale;\n\n\n    FT_ASSERT( unitsPerEm > 0 );\n\n    FT_ASSERT( transform->a > 0 && transform->d > 0 );\n    FT_ASSERT( transform->b == 0 && transform->c == 0 );\n    FT_ASSERT( transform->tx == 0 && transform->ty == 0 );\n\n    if ( unitsPerEm > 0x7FFF )\n      return FT_THROW( Glyph_Too_Big );\n\n    maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) );\n\n    if ( transform->a > maxScale || transform->d > maxScale )\n      return FT_THROW( Glyph_Too_Big );\n\n    return FT_Err_Ok;\n  }\n\n\n  static void\n  cf2_setGlyphWidth( CF2_Outline  outline,\n                     CF2_Fixed    width )\n  {\n    CFF_Decoder*  decoder = outline->decoder;\n\n\n    FT_ASSERT( decoder );\n\n    decoder->glyph_width = cf2_fixedToInt( width );\n  }\n\n\n  /* Clean up font instance. */\n  static void\n  cf2_free_instance( void*  ptr )\n  {\n    CF2_Font  font = (CF2_Font)ptr;\n\n\n    if ( font )\n    {\n      FT_Memory  memory = font->memory;\n\n\n      (void)memory;\n    }\n  }\n\n\n  /********************************************/\n  /*                                          */\n  /* functions for handling client outline;   */\n  /* FreeType uses coordinates in 26.6 format */\n  /*                                          */\n  /********************************************/\n\n  static void\n  cf2_builder_moveTo( CF2_OutlineCallbacks      callbacks,\n                      const CF2_CallbackParams  params )\n  {\n    /* downcast the object pointer */\n    CF2_Outline   outline = (CF2_Outline)callbacks;\n    CFF_Builder*  builder;\n\n\n    FT_ASSERT( outline && outline->decoder );\n    FT_ASSERT( params->op == CF2_PathOpMoveTo );\n\n    builder = &outline->decoder->builder;\n\n    /* note: two successive moves simply close the contour twice */\n    cff_builder_close_contour( builder );\n    builder->path_begun = 0;\n  }\n\n\n  static void\n  cf2_builder_lineTo( CF2_OutlineCallbacks      callbacks,\n                      const CF2_CallbackParams  params )\n  {\n    /* downcast the object pointer */\n    CF2_Outline   outline = (CF2_Outline)callbacks;\n    CFF_Builder*  builder;\n\n\n    FT_ASSERT( outline && outline->decoder );\n    FT_ASSERT( params->op == CF2_PathOpLineTo );\n\n    builder = &outline->decoder->builder;\n\n    if ( !builder->path_begun )\n    {\n      /* record the move before the line; also check points and set */\n      /* `path_begun'                                               */\n      cff_builder_start_point( builder,\n                               params->pt0.x,\n                               params->pt0.y );\n    }\n\n    /* `cff_builder_add_point1' includes a check_points call for one point */\n    cff_builder_add_point1( builder,\n                            params->pt1.x,\n                            params->pt1.y );\n  }\n\n\n  static void\n  cf2_builder_cubeTo( CF2_OutlineCallbacks      callbacks,\n                      const CF2_CallbackParams  params )\n  {\n    /* downcast the object pointer */\n    CF2_Outline   outline = (CF2_Outline)callbacks;\n    CFF_Builder*  builder;\n\n\n    FT_ASSERT( outline && outline->decoder );\n    FT_ASSERT( params->op == CF2_PathOpCubeTo );\n\n    builder = &outline->decoder->builder;\n\n    if ( !builder->path_begun )\n    {\n      /* record the move before the line; also check points and set */\n      /* `path_begun'                                               */\n      cff_builder_start_point( builder,\n                               params->pt0.x,\n                               params->pt0.y );\n    }\n\n    /* prepare room for 3 points: 2 off-curve, 1 on-curve */\n    cff_check_points( builder, 3 );\n\n    cff_builder_add_point( builder,\n                           params->pt1.x,\n                           params->pt1.y, 0 );\n    cff_builder_add_point( builder,\n                           params->pt2.x,\n                           params->pt2.y, 0 );\n    cff_builder_add_point( builder,\n                           params->pt3.x,\n                           params->pt3.y, 1 );\n  }\n\n\n  static void\n  cf2_outline_init( CF2_Outline  outline,\n                    FT_Memory    memory,\n                    FT_Error*    error )\n  {\n    FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) );\n\n    outline->root.memory = memory;\n    outline->root.error  = error;\n\n    outline->root.moveTo = cf2_builder_moveTo;\n    outline->root.lineTo = cf2_builder_lineTo;\n    outline->root.cubeTo = cf2_builder_cubeTo;\n  }\n\n\n  /* get scaling and hint flag from GlyphSlot */\n  static void\n  cf2_getScaleAndHintFlag( CFF_Decoder*  decoder,\n                           CF2_Fixed*    x_scale,\n                           CF2_Fixed*    y_scale,\n                           FT_Bool*      hinted,\n                           FT_Bool*      scaled )\n  {\n    FT_ASSERT( decoder && decoder->builder.glyph );\n\n    /* note: FreeType scale includes a factor of 64 */\n    *hinted = decoder->builder.glyph->hint;\n    *scaled = decoder->builder.glyph->scaled;\n\n    if ( *hinted )\n    {\n      *x_scale = FT_DivFix( decoder->builder.glyph->x_scale,\n                            cf2_intToFixed( 64 ) );\n      *y_scale = FT_DivFix( decoder->builder.glyph->y_scale,\n                            cf2_intToFixed( 64 ) );\n    }\n    else\n    {\n      /* for unhinted outlines, `cff_slot_load' does the scaling, */\n      /* thus render at `unity' scale                             */\n\n      *x_scale = 0x0400;   /* 1/64 as 16.16 */\n      *y_scale = 0x0400;\n    }\n  }\n\n\n  /* get units per em from `FT_Face' */\n  /* TODO: should handle font matrix concatenation? */\n  static FT_UShort\n  cf2_getUnitsPerEm( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->builder.face );\n    FT_ASSERT( decoder->builder.face->root.units_per_EM );\n\n    return decoder->builder.face->root.units_per_EM;\n  }\n\n\n  /* Main entry point: Render one glyph. */\n  FT_LOCAL_DEF( FT_Error )\n  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,\n                                 FT_Byte*      charstring_base,\n                                 FT_ULong      charstring_len )\n  {\n    FT_Memory  memory;\n    FT_Error   error = FT_Err_Ok;\n    CF2_Font   font;\n\n\n    FT_ASSERT( decoder && decoder->cff );\n\n    memory = decoder->builder.memory;\n\n    /* CF2 data is saved here across glyphs */\n    font = (CF2_Font)decoder->cff->cf2_instance.data;\n\n    /* on first glyph, allocate instance structure */\n    if ( decoder->cff->cf2_instance.data == NULL )\n    {\n      decoder->cff->cf2_instance.finalizer =\n        (FT_Generic_Finalizer)cf2_free_instance;\n\n      if ( FT_ALLOC( decoder->cff->cf2_instance.data,\n                     sizeof ( CF2_FontRec ) ) )\n        return FT_THROW( Out_Of_Memory );\n\n      font = (CF2_Font)decoder->cff->cf2_instance.data;\n\n      font->memory = memory;\n\n      /* initialize a client outline, to be shared by each glyph rendered */\n      cf2_outline_init( &font->outline, font->memory, &font->error );\n    }\n\n    /* save decoder; it is a stack variable and will be different on each */\n    /* call                                                               */\n    font->decoder         = decoder;\n    font->outline.decoder = decoder;\n\n    {\n      /* build parameters for Adobe engine */\n\n      CFF_Builder*  builder = &decoder->builder;\n      CFF_Driver    driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );\n\n      /* local error */\n      FT_Error       error2 = FT_Err_Ok;\n      CF2_BufferRec  buf;\n      CF2_Matrix     transform;\n      CF2_F16Dot16   glyphWidth;\n\n      FT_Bool  hinted;\n      FT_Bool  scaled;\n\n\n      /* FreeType has already looked up the GID; convert to         */\n      /* `RegionBuffer', assuming that the input has been validated */\n      FT_ASSERT( charstring_base + charstring_len >= charstring_base );\n\n      FT_ZERO( &buf );\n      buf.start =\n      buf.ptr   = charstring_base;\n      buf.end   = charstring_base + charstring_len;\n\n      FT_ZERO( &transform );\n\n      cf2_getScaleAndHintFlag( decoder,\n                               &transform.a,\n                               &transform.d,\n                               &hinted,\n                               &scaled );\n\n      font->renderingFlags = 0;\n      if ( hinted )\n        font->renderingFlags |= CF2_FlagsHinted;\n      if ( scaled && !driver->no_stem_darkening )\n        font->renderingFlags |= CF2_FlagsDarkened;\n\n      /* now get an outline for this glyph;      */\n      /* also get units per em to validate scale */\n      font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder );\n\n      error2 = cf2_checkTransform( &transform, font->unitsPerEm );\n      if ( error2 )\n        return error2;\n\n      error2 = cf2_getGlyphWidth( font, &buf, &transform, &glyphWidth );\n      if ( error2 )\n        return FT_ERR( Invalid_File_Format );\n\n      cf2_setGlyphWidth( &font->outline, glyphWidth );\n\n      return FT_Err_Ok;\n    }\n  }\n\n\n  /* get pointer to current FreeType subfont (based on current glyphID) */\n  FT_LOCAL_DEF( CFF_SubFont )\n  cf2_getSubfont( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return decoder->current_subfont;\n  }\n\n\n  /* get `y_ppem' from `CFF_Size' */\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getPpemY( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder                          &&\n               decoder->builder.face            &&\n               decoder->builder.face->root.size );\n    FT_ASSERT( decoder->builder.face->root.size->metrics.y_ppem );\n\n    return cf2_intToFixed(\n             decoder->builder.face->root.size->metrics.y_ppem );\n  }\n\n\n  /* get standard stem widths for the current subfont; */\n  /* FreeType stores these as integer font units       */\n  /* (note: variable names seem swapped)               */\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getStdVW( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return cf2_intToFixed(\n             decoder->current_subfont->private_dict.standard_height );\n  }\n\n\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getStdHW( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return cf2_intToFixed(\n             decoder->current_subfont->private_dict.standard_width );\n  }\n\n\n  /* note: FreeType stores 1000 times the actual value for `BlueScale' */\n  FT_LOCAL_DEF( void )\n  cf2_getBlueMetrics( CFF_Decoder*  decoder,\n                      CF2_Fixed*    blueScale,\n                      CF2_Fixed*    blueShift,\n                      CF2_Fixed*    blueFuzz )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *blueScale = FT_DivFix(\n                   decoder->current_subfont->private_dict.blue_scale,\n                   cf2_intToFixed( 1000 ) );\n    *blueShift = cf2_intToFixed(\n                   decoder->current_subfont->private_dict.blue_shift );\n    *blueFuzz  = cf2_intToFixed(\n                   decoder->current_subfont->private_dict.blue_fuzz );\n  }\n\n\n  /* get blue values counts and arrays; the FreeType parser has validated */\n  /* the counts and verified that each is an even number                  */\n  FT_LOCAL_DEF( void )\n  cf2_getBlueValues( CFF_Decoder*  decoder,\n                     size_t*       count,\n                     FT_Pos*      *data )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *count = decoder->current_subfont->private_dict.num_blue_values;\n    *data  = (FT_Pos*)\n               &decoder->current_subfont->private_dict.blue_values;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_getOtherBlues( CFF_Decoder*  decoder,\n                     size_t*       count,\n                     FT_Pos*      *data )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *count = decoder->current_subfont->private_dict.num_other_blues;\n    *data  = (FT_Pos*)\n               &decoder->current_subfont->private_dict.other_blues;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_getFamilyBlues( CFF_Decoder*  decoder,\n                      size_t*       count,\n                      FT_Pos*      *data )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *count = decoder->current_subfont->private_dict.num_family_blues;\n    *data  = (FT_Pos*)\n               &decoder->current_subfont->private_dict.family_blues;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,\n                           size_t*       count,\n                           FT_Pos*      *data )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    *count = decoder->current_subfont->private_dict.num_family_other_blues;\n    *data  = (FT_Pos*)\n               &decoder->current_subfont->private_dict.family_other_blues;\n  }\n\n\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_getLanguageGroup( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return decoder->current_subfont->private_dict.language_group;\n  }\n\n\n  /* convert unbiased subroutine index to `CF2_Buffer' and */\n  /* return 0 on success                                   */\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,\n                              CF2_UInt      idx,\n                              CF2_Buffer    buf )\n  {\n    FT_ASSERT( decoder && decoder->globals );\n\n    FT_ZERO( buf );\n\n    idx += decoder->globals_bias;\n    if ( idx >= decoder->num_globals )\n      return TRUE;     /* error */\n\n    buf->start =\n    buf->ptr   = decoder->globals[idx];\n    buf->end   = decoder->globals[idx + 1];\n\n    return FALSE;      /* success */\n  }\n\n\n  /* convert AdobeStandardEncoding code to CF2_Buffer; */\n  /* used for seac component                           */\n  FT_LOCAL_DEF( FT_Error )\n  cf2_getSeacComponent( CFF_Decoder*  decoder,\n                        CF2_UInt      code,\n                        CF2_Buffer    buf )\n  {\n    CF2_Int   gid;\n    FT_Byte*  charstring;\n    FT_ULong  len;\n    FT_Error  error;\n\n\n    FT_ASSERT( decoder );\n\n    FT_ZERO( buf );\n\n    gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code );\n    if ( gid < 0 )\n      return FT_THROW( Invalid_Glyph_Format );\n\n    error = cff_get_glyph_data( decoder->builder.face,\n                                gid,\n                                &charstring,\n                                &len );\n    /* TODO: for now, just pass the FreeType error through */\n    if ( error )\n      return error;\n\n    /* assume input has been validated */\n    FT_ASSERT( charstring + len >= charstring );\n\n    buf->start = charstring;\n    buf->end   = charstring + len;\n    buf->ptr   = buf->start;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_freeSeacComponent( CFF_Decoder*  decoder,\n                         CF2_Buffer    buf )\n  {\n    FT_ASSERT( decoder );\n\n    cff_free_glyph_data( decoder->builder.face,\n                         (FT_Byte**)&buf->start,\n                         buf->end - buf->start );\n  }\n\n\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,\n                             CF2_UInt      idx,\n                             CF2_Buffer    buf )\n  {\n    FT_ASSERT( decoder && decoder->locals );\n\n    FT_ZERO( buf );\n\n    idx += decoder->locals_bias;\n    if ( idx >= decoder->num_locals )\n      return TRUE;     /* error */\n\n    buf->start =\n    buf->ptr   = decoder->locals[idx];\n    buf->end   = decoder->locals[idx + 1];\n\n    return FALSE;      /* success */\n  }\n\n\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getDefaultWidthX( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return cf2_intToFixed(\n             decoder->current_subfont->private_dict.default_width );\n  }\n\n\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_getNominalWidthX( CFF_Decoder*  decoder )\n  {\n    FT_ASSERT( decoder && decoder->current_subfont );\n\n    return cf2_intToFixed(\n             decoder->current_subfont->private_dict.nominal_width );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_outline_reset( CF2_Outline  outline )\n  {\n    CFF_Decoder*  decoder = outline->decoder;\n\n\n    FT_ASSERT( decoder );\n\n    outline->root.windingMomentum = 0;\n\n    FT_GlyphLoader_Rewind( decoder->builder.loader );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_outline_close( CF2_Outline  outline )\n  {\n    CFF_Decoder*  decoder = outline->decoder;\n\n\n    FT_ASSERT( decoder );\n\n    cff_builder_close_contour( &decoder->builder );\n\n    FT_GlyphLoader_Add( decoder->builder.loader );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2ft.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2ft.h                                                                */\n/*                                                                         */\n/*    FreeType Glue Component to Adobe's Interpreter (specification).      */\n/*                                                                         */\n/*  Copyright 2013 Adobe Systems Incorporated.                             */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2FT_H__\n#define __CF2FT_H__\n\n\n#include \"cf2types.h\"\n\n\n  /* TODO: disable asserts for now */\n#define CF2_NDEBUG\n\n\n#include FT_SYSTEM_H\n\n#include \"cf2glue.h\"\n#include \"cffgload.h\"    /* for CFF_Decoder */\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,\n                                 FT_Byte*      charstring_base,\n                                 FT_ULong      charstring_len );\n\n  FT_LOCAL( CFF_SubFont )\n  cf2_getSubfont( CFF_Decoder*  decoder );\n\n\n  FT_LOCAL( CF2_Fixed )\n  cf2_getPpemY( CFF_Decoder*  decoder );\n  FT_LOCAL( CF2_Fixed )\n  cf2_getStdVW( CFF_Decoder*  decoder );\n  FT_LOCAL( CF2_Fixed )\n  cf2_getStdHW( CFF_Decoder*  decoder );\n\n  FT_LOCAL( void )\n  cf2_getBlueMetrics( CFF_Decoder*  decoder,\n                      CF2_Fixed*    blueScale,\n                      CF2_Fixed*    blueShift,\n                      CF2_Fixed*    blueFuzz );\n  FT_LOCAL( void )\n  cf2_getBlueValues( CFF_Decoder*  decoder,\n                     size_t*       count,\n                     FT_Pos*      *data );\n  FT_LOCAL( void )\n  cf2_getOtherBlues( CFF_Decoder*  decoder,\n                     size_t*       count,\n                     FT_Pos*      *data );\n  FT_LOCAL( void )\n  cf2_getFamilyBlues( CFF_Decoder*  decoder,\n                      size_t*       count,\n                      FT_Pos*      *data );\n  FT_LOCAL( void )\n  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,\n                           size_t*       count,\n                           FT_Pos*      *data );\n\n  FT_LOCAL( CF2_Int )\n  cf2_getLanguageGroup( CFF_Decoder*  decoder );\n\n  FT_LOCAL( CF2_Int )\n  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,\n                              CF2_UInt      idx,\n                              CF2_Buffer    buf );\n  FT_LOCAL( FT_Error )\n  cf2_getSeacComponent( CFF_Decoder*  decoder,\n                        CF2_UInt      code,\n                        CF2_Buffer    buf );\n  FT_LOCAL( void )\n  cf2_freeSeacComponent( CFF_Decoder*  decoder,\n                         CF2_Buffer    buf );\n  FT_LOCAL( CF2_Int )\n  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,\n                             CF2_UInt      idx,\n                             CF2_Buffer    buf );\n\n  FT_LOCAL( CF2_Fixed )\n  cf2_getDefaultWidthX( CFF_Decoder*  decoder );\n  FT_LOCAL( CF2_Fixed )\n  cf2_getNominalWidthX( CFF_Decoder*  decoder );\n\n\n  /*\n   * FreeType client outline\n   *\n   * process output from the charstring interpreter\n   */\n  typedef struct  CF2_OutlineRec_\n  {\n    CF2_OutlineCallbacksRec  root;        /* base class must be first */\n    CFF_Decoder*             decoder;\n\n  } CF2_OutlineRec, *CF2_Outline;\n\n\n  FT_LOCAL( void )\n  cf2_outline_reset( CF2_Outline  outline );\n  FT_LOCAL( void )\n  cf2_outline_close( CF2_Outline  outline );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2FT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2glue.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2glue.h                                                              */\n/*                                                                         */\n/*    Adobe's code for shared stuff (specification only).                  */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2GLUE_H__\n#define __CF2GLUE_H__\n\n\n/* common includes for other modules */\n#include \"cf2error.h\"\n#include \"cf2fixed.h\"\n#include \"cf2arrst.h\"\n#include \"cf2read.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* rendering parameters */\n\n  /* apply hints to rendered glyphs */\n#define CF2_FlagsHinted    1\n  /* for testing */\n#define CF2_FlagsDarkened  2\n\n  /* type for holding the flags */\n  typedef CF2_Int  CF2_RenderingFlags;\n\n\n  /* elements of a glyph outline */\n  typedef enum  CF2_PathOp_\n  {\n    CF2_PathOpMoveTo = 1,     /* change the current point */\n    CF2_PathOpLineTo = 2,     /* line                     */\n    CF2_PathOpQuadTo = 3,     /* quadratic curve          */\n    CF2_PathOpCubeTo = 4      /* cubic curve              */\n\n  } CF2_PathOp;\n\n\n  /* a matrix of fixed point values */\n  typedef struct  CF2_Matrix_\n  {\n    CF2_F16Dot16  a;\n    CF2_F16Dot16  b;\n    CF2_F16Dot16  c;\n    CF2_F16Dot16  d;\n    CF2_F16Dot16  tx;\n    CF2_F16Dot16  ty;\n\n  } CF2_Matrix;\n\n\n  /* these typedefs are needed by more than one header file */\n  /* and gcc compiler doesn't allow redefinition            */\n  typedef struct CF2_FontRec_  CF2_FontRec, *CF2_Font;\n  typedef struct CF2_HintRec_  CF2_HintRec, *CF2_Hint;\n\n\n  /* A common structure for all callback parameters.                       */\n  /*                                                                       */\n  /* Some members may be unused.  For example, `pt0' is not used for       */\n  /* `moveTo' and `pt3' is not used for `quadTo'.  The initial point `pt0' */\n  /* is included for each path element for generality; curve conversions   */\n  /* need it.  The `op' parameter allows one function to handle multiple   */\n  /* element types.                                                        */\n\n  typedef struct  CF2_CallbackParamsRec_\n  {\n    FT_Vector  pt0;\n    FT_Vector  pt1;\n    FT_Vector  pt2;\n    FT_Vector  pt3;\n\n    CF2_Int  op;\n\n  } CF2_CallbackParamsRec, *CF2_CallbackParams;\n\n\n  /* forward reference */\n  typedef struct CF2_OutlineCallbacksRec_  CF2_OutlineCallbacksRec,\n                                           *CF2_OutlineCallbacks;\n\n  /* callback function pointers */\n  typedef void\n  (*CF2_Callback_Type)( CF2_OutlineCallbacks      callbacks,\n                        const CF2_CallbackParams  params );\n\n\n  struct  CF2_OutlineCallbacksRec_\n  {\n    CF2_Callback_Type  moveTo;\n    CF2_Callback_Type  lineTo;\n    CF2_Callback_Type  quadTo;\n    CF2_Callback_Type  cubeTo;\n\n    CF2_Int  windingMomentum;    /* for winding order detection */\n\n    FT_Memory  memory;\n    FT_Error*  error;\n  };\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2GLUE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2hints.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2hints.c                                                             */\n/*                                                                         */\n/*    Adobe's code for handling CFF hints (body).                          */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include FT_INTERNAL_DEBUG_H\n\n#include \"cf2glue.h\"\n#include \"cf2font.h\"\n#include \"cf2hints.h\"\n#include \"cf2intrp.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cf2hints\n\n\n  typedef struct  CF2_HintMoveRec_\n  {\n    size_t     j;          /* index of upper hint map edge   */\n    CF2_Fixed  moveUp;     /* adjustment to optimum position */\n\n  } CF2_HintMoveRec, *CF2_HintMove;\n\n\n  /* Compute angular momentum for winding order detection.  It is called */\n  /* for all lines and curves, but not necessarily in element order.     */\n  static CF2_Int\n  cf2_getWindingMomentum( CF2_Fixed  x1,\n                          CF2_Fixed  y1,\n                          CF2_Fixed  x2,\n                          CF2_Fixed  y2 )\n  {\n    /* cross product of pt1 position from origin with pt2 position from  */\n    /* pt1; we reduce the precision so that the result fits into 32 bits */\n\n    return ( x1 >> 16 ) * ( ( y2 - y1 ) >> 16 ) -\n           ( y1 >> 16 ) * ( ( x2 - x1 ) >> 16 );\n  }\n\n\n  /*\n   * Construct from a StemHint; this is used as a parameter to\n   * `cf2_blues_capture'.\n   * `hintOrigin' is the character space displacement of a seac accent.\n   * Adjust stem hint for darkening here.\n   *\n   */\n  static void\n  cf2_hint_init( CF2_Hint            hint,\n                 const CF2_ArrStack  stemHintArray,\n                 size_t              indexStemHint,\n                 const CF2_Font      font,\n                 CF2_Fixed           hintOrigin,\n                 CF2_Fixed           scale,\n                 FT_Bool             bottom )\n  {\n    CF2_Fixed               width;\n    const CF2_StemHintRec*  stemHint;\n\n\n    FT_ZERO( hint );\n\n    stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer(\n                                         stemHintArray,\n                                         indexStemHint );\n\n    width = stemHint->max - stemHint->min;\n\n    if ( width == cf2_intToFixed( -21 ) )\n    {\n      /* ghost bottom */\n\n      if ( bottom )\n      {\n        hint->csCoord = stemHint->max;\n        hint->flags   = CF2_GhostBottom;\n      }\n      else\n        hint->flags = 0;\n    }\n\n    else if ( width == cf2_intToFixed( -20 ) )\n    {\n      /* ghost top */\n\n      if ( bottom )\n        hint->flags = 0;\n      else\n      {\n        hint->csCoord = stemHint->min;\n        hint->flags   = CF2_GhostTop;\n      }\n    }\n\n    else if ( width < 0 )\n    {\n      /* inverted pair */\n\n      /*\n       * Hints with negative widths were produced by an early version of a\n       * non-Adobe font tool.  The Type 2 spec allows edge (ghost) hints\n       * with negative widths, but says\n       *\n       *   All other negative widths have undefined meaning.\n       *\n       * CoolType has a silent workaround that negates the hint width; for\n       * permissive mode, we do the same here.\n       *\n       * Note: Such fonts cannot use ghost hints, but should otherwise work.\n       * Note: Some poor hints in our faux fonts can produce negative\n       *       widths at some blends.  For example, see a light weight of\n       *       `u' in ASerifMM.\n       *\n       */\n      if ( bottom )\n      {\n        hint->csCoord = stemHint->max;\n        hint->flags   = CF2_PairBottom;\n      }\n      else\n      {\n        hint->csCoord = stemHint->min;\n        hint->flags   = CF2_PairTop;\n      }\n    }\n\n    else\n    {\n      /* normal pair */\n\n      if ( bottom )\n      {\n        hint->csCoord = stemHint->min;\n        hint->flags   = CF2_PairBottom;\n      }\n      else\n      {\n        hint->csCoord = stemHint->max;\n        hint->flags   = CF2_PairTop;\n      }\n    }\n\n    /* Now that ghost hints have been detected, adjust this edge for      */\n    /* darkening.  Bottoms are not changed; tops are incremented by twice */\n    /* `darkenY'.                                                         */\n    if ( cf2_hint_isTop( hint ) )\n      hint->csCoord += 2 * font->darkenY;\n\n    hint->csCoord += hintOrigin;\n    hint->scale    = scale;\n    hint->index    = indexStemHint;   /* index in original stem hint array */\n\n    /* if original stem hint has been used, use the same position */\n    if ( hint->flags != 0 && stemHint->used )\n    {\n      if ( cf2_hint_isTop( hint ) )\n        hint->dsCoord = stemHint->maxDS;\n      else\n        hint->dsCoord = stemHint->minDS;\n\n      cf2_hint_lock( hint );\n    }\n    else\n      hint->dsCoord = FT_MulFix( hint->csCoord, scale );\n  }\n\n\n  /* initialize an invalid hint map element */\n  static void\n  cf2_hint_initZero( CF2_Hint  hint )\n  {\n    FT_ZERO( hint );\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hint_isValid( const CF2_Hint  hint )\n  {\n    return hint->flags != 0;\n  }\n\n\n  static FT_Bool\n  cf2_hint_isPair( const CF2_Hint  hint )\n  {\n    return ( hint->flags                      &\n             ( CF2_PairBottom | CF2_PairTop ) ) != 0;\n  }\n\n\n  static FT_Bool\n  cf2_hint_isPairTop( const CF2_Hint  hint )\n  {\n    return ( hint->flags & CF2_PairTop ) != 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hint_isTop( const CF2_Hint  hint )\n  {\n    return ( hint->flags                    &\n             ( CF2_PairTop | CF2_GhostTop ) ) != 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hint_isBottom( const CF2_Hint  hint )\n  {\n    return ( hint->flags                          &\n             ( CF2_PairBottom | CF2_GhostBottom ) ) != 0;\n  }\n\n\n  static FT_Bool\n  cf2_hint_isLocked( const CF2_Hint  hint )\n  {\n    return ( hint->flags & CF2_Locked ) != 0;\n  }\n\n\n  static FT_Bool\n  cf2_hint_isSynthetic( const CF2_Hint  hint )\n  {\n    return ( hint->flags & CF2_Synthetic ) != 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hint_lock( CF2_Hint  hint )\n  {\n    hint->flags |= CF2_Locked;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hintmap_init( CF2_HintMap   hintmap,\n                    CF2_Font      font,\n                    CF2_HintMap   initialMap,\n                    CF2_ArrStack  hintMoves,\n                    CF2_Fixed     scale )\n  {\n    FT_ZERO( hintmap );\n\n    /* copy parameters from font instance */\n    hintmap->hinted         = font->hinted;\n    hintmap->scale          = scale;\n    hintmap->font           = font;\n    hintmap->initialHintMap = initialMap;\n    /* will clear in `cf2_hintmap_adjustHints' */\n    hintmap->hintMoves      = hintMoves;\n  }\n\n\n  static FT_Bool\n  cf2_hintmap_isValid( const CF2_HintMap  hintmap )\n  {\n    return hintmap->isValid;\n  }\n\n\n  /* transform character space coordinate to device space using hint map */\n  static CF2_Fixed\n  cf2_hintmap_map( CF2_HintMap  hintmap,\n                   CF2_Fixed    csCoord )\n  {\n    FT_ASSERT( hintmap->isValid );  /* must call Build before Map */\n    FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES );\n\n    if ( hintmap->count == 0 || ! hintmap->hinted )\n    {\n      /* there are no hints; use uniform scale and zero offset */\n      return FT_MulFix( csCoord, hintmap->scale );\n    }\n    else\n    {\n      /* start linear search from last hit */\n      CF2_UInt  i = hintmap->lastIndex;\n\n\n      /* search up */\n      while ( i < hintmap->count - 1                  &&\n              csCoord >= hintmap->edge[i + 1].csCoord )\n        i += 1;\n\n      /* search down */\n      while ( i > 0 && csCoord < hintmap->edge[i].csCoord )\n        i -= 1;\n\n      hintmap->lastIndex = i;\n\n      if ( i == 0 && csCoord < hintmap->edge[0].csCoord )\n      {\n        /* special case for points below first edge: use uniform scale */\n        return FT_MulFix( csCoord - hintmap->edge[0].csCoord,\n                          hintmap->scale ) +\n                 hintmap->edge[0].dsCoord;\n      }\n      else\n      {\n        /*\n         * Note: entries with duplicate csCoord are allowed.\n         * Use edge[i], the highest entry where csCoord >= entry[i].csCoord\n         */\n        return FT_MulFix( csCoord - hintmap->edge[i].csCoord,\n                          hintmap->edge[i].scale ) +\n                 hintmap->edge[i].dsCoord;\n      }\n    }\n  }\n\n\n  /*\n   * This hinting policy moves a hint pair in device space so that one of\n   * its two edges is on a device pixel boundary (its fractional part is\n   * zero).  `cf2_hintmap_insertHint' guarantees no overlap in CS\n   * space.  Ensure here that there is no overlap in DS.\n   *\n   * In the first pass, edges are adjusted relative to adjacent hints.\n   * Those that are below have already been adjusted.  Those that are\n   * above have not yet been adjusted.  If a hint above blocks an\n   * adjustment to an optimal position, we will try again in a second\n   * pass.  The second pass is top-down.\n   *\n   */\n\n  static void\n  cf2_hintmap_adjustHints( CF2_HintMap  hintmap )\n  {\n    size_t  i, j;\n\n\n    cf2_arrstack_clear( hintmap->hintMoves );      /* working storage */\n\n    /*\n     * First pass is bottom-up (font hint order) without look-ahead.\n     * Locked edges are already adjusted.\n     * Unlocked edges begin with dsCoord from `initialHintMap'.\n     * Save edges that are not optimally adjusted in `hintMoves' array,\n     * and process them in second pass.\n     */\n\n    for ( i = 0; i < hintmap->count; i++ )\n    {\n      FT_Bool  isPair = cf2_hint_isPair( &hintmap->edge[i] );\n\n\n      /* index of upper edge (same value for ghost hint) */\n      j = isPair ? i + 1 : i;\n\n      FT_ASSERT( j < hintmap->count );\n      FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) );\n      FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) );\n      FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) ==\n                   cf2_hint_isLocked( &hintmap->edge[j] ) );\n\n      if ( !cf2_hint_isLocked( &hintmap->edge[i] ) )\n      {\n        /* hint edge is not locked, we can adjust it */\n        CF2_Fixed  fracDown = cf2_fixedFraction( hintmap->edge[i].dsCoord );\n        CF2_Fixed  fracUp   = cf2_fixedFraction( hintmap->edge[j].dsCoord );\n\n        /* calculate all four possibilities; moves down are negative */\n        CF2_Fixed  downMoveDown = 0 - fracDown;\n        CF2_Fixed  upMoveDown   = 0 - fracUp;\n        CF2_Fixed  downMoveUp   = fracDown == 0\n                                    ? 0\n                                    : cf2_intToFixed( 1 ) - fracDown;\n        CF2_Fixed  upMoveUp     = fracUp == 0\n                                    ? 0\n                                    : cf2_intToFixed( 1 ) - fracUp;\n\n        /* smallest move up */\n        CF2_Fixed  moveUp   = FT_MIN( downMoveUp, upMoveUp );\n        /* smallest move down */\n        CF2_Fixed  moveDown = FT_MAX( downMoveDown, upMoveDown );\n\n        /* final amount to move edge or edge pair */\n        CF2_Fixed  move;\n\n        CF2_Fixed  downMinCounter = CF2_MIN_COUNTER;\n        CF2_Fixed  upMinCounter   = CF2_MIN_COUNTER;\n        FT_Bool    saveEdge       = FALSE;\n\n\n        /* minimum counter constraint doesn't apply when adjacent edges */\n        /* are synthetic                                                */\n        /* TODO: doesn't seem a big effect; for now, reduce the code    */\n#if 0\n        if ( i == 0                                        ||\n             cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) )\n          downMinCounter = 0;\n\n        if ( j >= hintmap->count - 1                       ||\n             cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) )\n          upMinCounter = 0;\n#endif\n\n        /* is there room to move up?                                    */\n        /* there is if we are at top of array or the next edge is at or */\n        /* beyond proposed move up?                                     */\n        if ( j >= hintmap->count - 1                            ||\n             hintmap->edge[j + 1].dsCoord >=\n               hintmap->edge[j].dsCoord + moveUp + upMinCounter )\n        {\n          /* there is room to move up; is there also room to move down? */\n          if ( i == 0                                                 ||\n               hintmap->edge[i - 1].dsCoord <=\n                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )\n          {\n            /* move smaller absolute amount */\n            move = ( -moveDown < moveUp ) ? moveDown : moveUp;  /* optimum */\n          }\n          else\n            move = moveUp;\n        }\n        else\n        {\n          /* is there room to move down? */\n          if ( i == 0                                                 ||\n               hintmap->edge[i - 1].dsCoord <=\n                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )\n          {\n            move     = moveDown;\n            saveEdge = moveUp < -moveDown;  /* true if non-optimum move */\n          }\n          else\n          {\n            /* no room to move either way without overlapping or reducing */\n            /* the counter too much                                       */\n            move     = 0;\n            saveEdge = TRUE;\n          }\n        }\n\n        /* Identify non-moves and moves down that aren't optimal, and save */\n        /* them for second pass.                                           */\n        /* Do this only if there is an unlocked edge above (which could    */\n        /* possibly move).                                                 */\n        if ( saveEdge                                    &&\n             j < hintmap->count - 1                      &&\n             !cf2_hint_isLocked( &hintmap->edge[j + 1] ) )\n        {\n          CF2_HintMoveRec  savedMove;\n\n\n          savedMove.j      = j;\n          /* desired adjustment in second pass */\n          savedMove.moveUp = moveUp - move;\n\n          cf2_arrstack_push( hintmap->hintMoves, &savedMove );\n        }\n\n        /* move the edge(s) */\n        hintmap->edge[i].dsCoord += move;\n        if ( isPair )\n          hintmap->edge[j].dsCoord += move;\n      }\n\n      /* assert there are no overlaps in device space */\n      FT_ASSERT( i == 0                                                   ||\n                 hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord );\n      FT_ASSERT( i < j                                                ||\n                 hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord );\n\n      /* adjust the scales, avoiding divide by zero */\n      if ( i > 0 )\n      {\n        if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord )\n          hintmap->edge[i - 1].scale =\n            FT_DivFix(\n              hintmap->edge[i].dsCoord - hintmap->edge[i - 1].dsCoord,\n              hintmap->edge[i].csCoord - hintmap->edge[i - 1].csCoord );\n      }\n\n      if ( isPair )\n      {\n        if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord )\n          hintmap->edge[j - 1].scale =\n            FT_DivFix(\n              hintmap->edge[j].dsCoord - hintmap->edge[j - 1].dsCoord,\n              hintmap->edge[j].csCoord - hintmap->edge[j - 1].csCoord );\n\n        i += 1;     /* skip upper edge on next loop */\n      }\n    }\n\n    /* second pass tries to move non-optimal hints up, in case there is */\n    /* room now                                                         */\n    for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- )\n    {\n      CF2_HintMove  hintMove = (CF2_HintMove)\n                      cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 );\n\n\n      j = hintMove->j;\n\n      /* this was tested before the push, above */\n      FT_ASSERT( j < hintmap->count - 1 );\n\n      /* is there room to move up? */\n      if ( hintmap->edge[j + 1].dsCoord >=\n             hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER )\n      {\n        /* there is more room now, move edge up */\n        hintmap->edge[j].dsCoord += hintMove->moveUp;\n\n        if ( cf2_hint_isPair( &hintmap->edge[j] ) )\n        {\n          FT_ASSERT( j > 0 );\n          hintmap->edge[j - 1].dsCoord += hintMove->moveUp;\n        }\n      }\n    }\n  }\n\n\n  /* insert hint edges into map, sorted by csCoord */\n  static void\n  cf2_hintmap_insertHint( CF2_HintMap  hintmap,\n                          CF2_Hint     bottomHintEdge,\n                          CF2_Hint     topHintEdge )\n  {\n    CF2_UInt  indexInsert;\n\n    /* set default values, then check for edge hints */\n    FT_Bool   isPair         = TRUE;\n    CF2_Hint  firstHintEdge  = bottomHintEdge;\n    CF2_Hint  secondHintEdge = topHintEdge;\n\n\n    /* one or none of the input params may be invalid when dealing with */\n    /* edge hints; at least one edge must be valid                      */\n    FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) ||\n               cf2_hint_isValid( topHintEdge )    );\n\n    /* determine how many and which edges to insert */\n    if ( !cf2_hint_isValid( bottomHintEdge ) )\n    {\n      /* insert only the top edge */\n      firstHintEdge = topHintEdge;\n      isPair        = FALSE;\n    }\n    else if ( !cf2_hint_isValid( topHintEdge ) )\n    {\n      /* insert only the bottom edge */\n      isPair = FALSE;\n    }\n\n    /* paired edges must be in proper order */\n    FT_ASSERT( !isPair                                         ||\n               topHintEdge->csCoord >= bottomHintEdge->csCoord );\n\n    /* linear search to find index value of insertion point */\n    indexInsert = 0;\n    for ( ; indexInsert < hintmap->count; indexInsert++ )\n    {\n      if ( hintmap->edge[indexInsert].csCoord > firstHintEdge->csCoord )\n        break;\n    }\n\n    /*\n     * Discard any hints that overlap in character space.  Most often,\n     * this is while building the initial map, but in theory, it can also\n     * occur because of darkening.\n     *\n     */\n    if ( indexInsert < hintmap->count )\n    {\n      /* we are inserting before an existing edge:              */\n      /* verify that a new pair does not straddle the next edge */\n      if ( isPair                                                       &&\n           hintmap->edge[indexInsert].csCoord < secondHintEdge->csCoord )\n        return; /* ignore overlapping stem hint */\n\n      /* verify that we are not inserting between paired edges */\n      if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) )\n        return; /* ignore overlapping stem hint */\n    }\n\n    /* recompute device space locations using initial hint map */\n    if ( cf2_hintmap_isValid( hintmap->initialHintMap ) &&\n         !cf2_hint_isLocked( firstHintEdge )            )\n    {\n      if ( isPair )\n      {\n        /* Use hint map to position the center of stem, and nominal scale */\n        /* to position the two edges.  This preserves the stem width.     */\n        CF2_Fixed  midpoint  = cf2_hintmap_map(\n                                 hintmap->initialHintMap,\n                                 ( secondHintEdge->csCoord +\n                                   firstHintEdge->csCoord ) / 2 );\n        CF2_Fixed  halfWidth = FT_MulFix(\n                                 ( secondHintEdge->csCoord -\n                                   firstHintEdge->csCoord ) / 2,\n                                 hintmap->scale );\n\n\n        firstHintEdge->dsCoord  = midpoint - halfWidth;\n        secondHintEdge->dsCoord = midpoint + halfWidth;\n      }\n      else\n        firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap,\n                                                  firstHintEdge->csCoord );\n    }\n\n    /* discard any hints that overlap in device space; this can occur */\n    /* because locked hints have been moved to align with blue zones  */\n    if ( indexInsert > 0 )\n    {\n      /* we are inserting after an existing edge */\n      if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord )\n        return;\n    }\n\n    if ( indexInsert < hintmap->count )\n    {\n      /* we are inserting before an existing edge */\n      if ( isPair )\n      {\n        if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )\n          return;\n      }\n      else\n      {\n        if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )\n          return;\n      }\n    }\n\n    /* make room to insert */\n    {\n      CF2_Int  iSrc = hintmap->count - 1;\n      CF2_Int  iDst = isPair ? hintmap->count + 1 : hintmap->count;\n\n      CF2_Int  count = hintmap->count - indexInsert;\n\n\n      if ( iDst >= CF2_MAX_HINT_EDGES )\n      {\n        FT_TRACE4(( \"cf2_hintmap_insertHint: too many hintmaps\\n\" ));\n        return;\n      }\n\n      while ( count-- )\n        hintmap->edge[iDst--] = hintmap->edge[iSrc--];\n\n      /* insert first edge */\n      hintmap->edge[indexInsert] = *firstHintEdge;         /* copy struct */\n      hintmap->count += 1;\n\n      if ( isPair )\n      {\n        /* insert second edge */\n        hintmap->edge[indexInsert + 1] = *secondHintEdge;  /* copy struct */\n        hintmap->count                += 1;\n      }\n    }\n\n    return;\n  }\n\n\n  /*\n   * Build a map from hints and mask.\n   *\n   * This function may recur one level if `hintmap->initialHintMap' is not yet\n   * valid.\n   * If `initialMap' is true, simply build initial map.\n   *\n   * Synthetic hints are used in two ways.  A hint at zero is inserted, if\n   * needed, in the initial hint map, to prevent translations from\n   * propagating across the origin.  If synthetic em box hints are enabled\n   * for ideographic dictionaries, then they are inserted in all hint\n   * maps, including the initial one.\n   *\n   */\n  FT_LOCAL_DEF( void )\n  cf2_hintmap_build( CF2_HintMap   hintmap,\n                     CF2_ArrStack  hStemHintArray,\n                     CF2_ArrStack  vStemHintArray,\n                     CF2_HintMask  hintMask,\n                     CF2_Fixed     hintOrigin,\n                     FT_Bool       initialMap )\n  {\n    FT_Byte*  maskPtr;\n\n    CF2_Font         font = hintmap->font;\n    CF2_HintMaskRec  tempHintMask;\n\n    size_t   bitCount, i;\n    FT_Byte  maskByte;\n\n\n    /* check whether initial map is constructed */\n    if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) )\n    {\n      /* make recursive call with initialHintMap and temporary mask; */\n      /* temporary mask will get all bits set, below */\n      cf2_hintmask_init( &tempHintMask, hintMask->error );\n      cf2_hintmap_build( hintmap->initialHintMap,\n                         hStemHintArray,\n                         vStemHintArray,\n                         &tempHintMask,\n                         hintOrigin,\n                         TRUE );\n    }\n\n    if ( !cf2_hintmask_isValid( hintMask ) )\n    {\n      /* without a hint mask, assume all hints are active */\n      cf2_hintmask_setAll( hintMask,\n                           cf2_arrstack_size( hStemHintArray ) +\n                             cf2_arrstack_size( vStemHintArray ) );\n    }\n\n    /* begin by clearing the map */\n    hintmap->count     = 0;\n    hintmap->lastIndex = 0;\n\n    /* make a copy of the hint mask so we can modify it */\n    tempHintMask = *hintMask;\n    maskPtr      = cf2_hintmask_getMaskPtr( &tempHintMask );\n\n    /* use the hStem hints only, which are first in the mask */\n    /* TODO: compare this to cffhintmaskGetBitCount */\n    bitCount = cf2_arrstack_size( hStemHintArray );\n\n    /* synthetic embox hints get highest priority */\n    if ( font->blues.doEmBoxHints )\n    {\n      CF2_HintRec  dummy;\n\n\n      cf2_hint_initZero( &dummy );   /* invalid hint map element */\n\n      /* ghost bottom */\n      cf2_hintmap_insertHint( hintmap,\n                              &font->blues.emBoxBottomEdge,\n                              &dummy );\n      /* ghost top */\n      cf2_hintmap_insertHint( hintmap,\n                              &dummy,\n                              &font->blues.emBoxTopEdge );\n    }\n\n    /* insert hints captured by a blue zone or already locked (higher */\n    /* priority)                                                      */\n    for ( i = 0, maskByte = 0x80; i < bitCount; i++ )\n    {\n      if ( maskByte & *maskPtr )\n      {\n        /* expand StemHint into two `CF2_Hint' elements */\n        CF2_HintRec  bottomHintEdge, topHintEdge;\n\n\n        cf2_hint_init( &bottomHintEdge,\n                       hStemHintArray,\n                       i,\n                       font,\n                       hintOrigin,\n                       hintmap->scale,\n                       TRUE /* bottom */ );\n        cf2_hint_init( &topHintEdge,\n                       hStemHintArray,\n                       i,\n                       font,\n                       hintOrigin,\n                       hintmap->scale,\n                       FALSE /* top */ );\n\n        if ( cf2_hint_isLocked( &bottomHintEdge ) ||\n             cf2_hint_isLocked( &topHintEdge )    ||\n             cf2_blues_capture( &font->blues,\n                                &bottomHintEdge,\n                                &topHintEdge )   )\n        {\n          /* insert captured hint into map */\n          cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );\n\n          *maskPtr &= ~maskByte;      /* turn off the bit for this hint */\n        }\n      }\n\n      if ( ( i & 7 ) == 7 )\n      {\n        /* move to next mask byte */\n        maskPtr++;\n        maskByte = 0x80;\n      }\n      else\n        maskByte >>= 1;\n    }\n\n    /* initial hint map includes only captured hints plus maybe one at 0 */\n\n    /*\n     * TODO: There is a problem here because we are trying to build a\n     *       single hint map containing all captured hints.  It is\n     *       possible for there to be conflicts between captured hints,\n     *       either because of darkening or because the hints are in\n     *       separate hint zones (we are ignoring hint zones for the\n     *       initial map).  An example of the latter is MinionPro-Regular\n     *       v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem.\n     *       A stem hint for the psili conflicts with the top edge hint\n     *       for the base character.  The stem hint gets priority because\n     *       of its sort order.  In glyph 884 (Greek Capital Alpha with\n     *       Psili and Oxia), the top of the base character gets a stem\n     *       hint, and the psili does not.  This creates different initial\n     *       maps for the two glyphs resulting in different renderings of\n     *       the base character.  Will probably defer this either as not\n     *       worth the cost or as a font bug.  I don't think there is any\n     *       good reason for an accent to be captured by an alignment\n     *       zone.  -darnold 2/12/10\n     */\n\n    if ( initialMap )\n    {\n      /* Apply a heuristic that inserts a point for (0,0), unless it's     */\n      /* already covered by a mapping.  This locks the baseline for glyphs */\n      /* that have no baseline hints.                                      */\n\n      if ( hintmap->count == 0                           ||\n           hintmap->edge[0].csCoord > 0                  ||\n           hintmap->edge[hintmap->count - 1].csCoord < 0 )\n      {\n        /* all edges are above 0 or all edges are below 0; */\n        /* construct a locked edge hint at 0               */\n\n        CF2_HintRec  edge, invalid;\n\n\n        cf2_hint_initZero( &edge );\n\n        edge.flags = CF2_GhostBottom |\n                     CF2_Locked      |\n                     CF2_Synthetic;\n        edge.scale = hintmap->scale;\n\n        cf2_hint_initZero( &invalid );\n        cf2_hintmap_insertHint( hintmap, &edge, &invalid );\n      }\n    }\n    else\n    {\n      /* insert remaining hints */\n\n      maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask );\n\n      for ( i = 0, maskByte = 0x80; i < bitCount; i++ )\n      {\n        if ( maskByte & *maskPtr )\n        {\n          CF2_HintRec  bottomHintEdge, topHintEdge;\n\n\n          cf2_hint_init( &bottomHintEdge,\n                         hStemHintArray,\n                         i,\n                         font,\n                         hintOrigin,\n                         hintmap->scale,\n                         TRUE /* bottom */ );\n          cf2_hint_init( &topHintEdge,\n                         hStemHintArray,\n                         i,\n                         font,\n                         hintOrigin,\n                         hintmap->scale,\n                         FALSE /* top */ );\n\n          cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );\n        }\n\n        if ( ( i & 7 ) == 7 )\n        {\n          /* move to next mask byte */\n          maskPtr++;\n          maskByte = 0x80;\n        }\n        else\n          maskByte >>= 1;\n      }\n    }\n\n    /*\n     * Note: The following line is a convenient place to break when\n     *       debugging hinting.  Examine `hintmap->edge' for the list of\n     *       enabled hints, then step over the call to see the effect of\n     *       adjustment.  We stop here first on the recursive call that\n     *       creates the initial map, and then on each counter group and\n     *       hint zone.\n     */\n\n    /* adjust positions of hint edges that are not locked to blue zones */\n    cf2_hintmap_adjustHints( hintmap );\n\n    /* save the position of all hints that were used in this hint map; */\n    /* if we use them again, we'll locate them in the same position    */\n    if ( !initialMap )\n    {\n      for ( i = 0; i < hintmap->count; i++ )\n      {\n        if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) )\n        {\n          /* Note: include both valid and invalid edges            */\n          /* Note: top and bottom edges are copied back separately */\n          CF2_StemHint  stemhint = (CF2_StemHint)\n                          cf2_arrstack_getPointer( hStemHintArray,\n                                                   hintmap->edge[i].index );\n\n\n          if ( cf2_hint_isTop( &hintmap->edge[i] ) )\n            stemhint->maxDS = hintmap->edge[i].dsCoord;\n          else\n            stemhint->minDS = hintmap->edge[i].dsCoord;\n\n          stemhint->used = TRUE;\n        }\n      }\n    }\n\n    /* hint map is ready to use */\n    hintmap->isValid = TRUE;\n\n    /* remember this mask has been used */\n    cf2_hintmask_setNew( hintMask, FALSE );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_init( CF2_GlyphPath         glyphpath,\n                      CF2_Font              font,\n                      CF2_OutlineCallbacks  callbacks,\n                      CF2_Fixed             scaleY,\n                      /* CF2_Fixed  hShift, */\n                      CF2_ArrStack          hStemHintArray,\n                      CF2_ArrStack          vStemHintArray,\n                      CF2_HintMask          hintMask,\n                      CF2_Fixed             hintOriginY,\n                      const CF2_Blues       blues,\n                      const FT_Vector*      fractionalTranslation )\n  {\n    FT_ZERO( glyphpath );\n\n    glyphpath->font      = font;\n    glyphpath->callbacks = callbacks;\n\n    cf2_arrstack_init( &glyphpath->hintMoves,\n                       font->memory,\n                       &font->error,\n                       sizeof ( CF2_HintMoveRec ) );\n\n    cf2_hintmap_init( &glyphpath->initialHintMap,\n                      font,\n                      &glyphpath->initialHintMap,\n                      &glyphpath->hintMoves,\n                      scaleY );\n    cf2_hintmap_init( &glyphpath->firstHintMap,\n                      font,\n                      &glyphpath->initialHintMap,\n                      &glyphpath->hintMoves,\n                      scaleY );\n    cf2_hintmap_init( &glyphpath->hintMap,\n                      font,\n                      &glyphpath->initialHintMap,\n                      &glyphpath->hintMoves,\n                      scaleY );\n\n    glyphpath->scaleX = font->innerTransform.a;\n    glyphpath->scaleC = font->innerTransform.c;\n    glyphpath->scaleY = font->innerTransform.d;\n\n    glyphpath->fractionalTranslation = *fractionalTranslation;\n\n#if 0\n    glyphpath->hShift = hShift;       /* for fauxing */\n#endif\n\n    glyphpath->hStemHintArray = hStemHintArray;\n    glyphpath->vStemHintArray = vStemHintArray;\n    glyphpath->hintMask       = hintMask;      /* ptr to current mask */\n    glyphpath->hintOriginY    = hintOriginY;\n    glyphpath->blues          = blues;\n    glyphpath->darken         = font->darkened; /* TODO: should we make copies? */\n    glyphpath->xOffset        = font->darkenX;\n    glyphpath->yOffset        = font->darkenY;\n    glyphpath->miterLimit     = 2 * FT_MAX(\n                                     cf2_fixedAbs( glyphpath->xOffset ),\n                                     cf2_fixedAbs( glyphpath->yOffset ) );\n\n    /* .1 character space unit */\n    glyphpath->snapThreshold = cf2_floatToFixed( 0.1f );\n\n    glyphpath->moveIsPending = TRUE;\n    glyphpath->pathIsOpen    = FALSE;\n    glyphpath->elemIsQueued  = FALSE;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_finalize( CF2_GlyphPath  glyphpath )\n  {\n    cf2_arrstack_finalize( &glyphpath->hintMoves );\n  }\n\n\n  /*\n   * Hint point in y-direction and apply outerTransform.\n   * Input `current' hint map (which is actually delayed by one element).\n   * Input x,y point in Character Space.\n   * Output x,y point in Device Space, including translation.\n   */\n  static void\n  cf2_glyphpath_hintPoint( CF2_GlyphPath  glyphpath,\n                           CF2_HintMap    hintmap,\n                           FT_Vector*     ppt,\n                           CF2_Fixed      x,\n                           CF2_Fixed      y )\n  {\n    FT_Vector  pt;   /* hinted point in upright DS */\n\n\n    pt.x = FT_MulFix( glyphpath->scaleX, x ) +\n             FT_MulFix( glyphpath->scaleC, y );\n    pt.y = cf2_hintmap_map( hintmap, y );\n\n    ppt->x = FT_MulFix( glyphpath->font->outerTransform.a, pt.x )   +\n               FT_MulFix( glyphpath->font->outerTransform.c, pt.y ) +\n               glyphpath->fractionalTranslation.x;\n    ppt->y = FT_MulFix( glyphpath->font->outerTransform.b, pt.x )   +\n               FT_MulFix( glyphpath->font->outerTransform.d, pt.y ) +\n               glyphpath->fractionalTranslation.y;\n  }\n\n\n  /*\n   * From two line segments, (u1,u2) and (v1,v2), compute a point of\n   * intersection on the corresponding lines.\n   * Return false if no intersection is found, or if the intersection is\n   * too far away from the ends of the line segments, u2 and v1.\n   *\n   */\n  static FT_Bool\n  cf2_glyphpath_computeIntersection( CF2_GlyphPath     glyphpath,\n                                     const FT_Vector*  u1,\n                                     const FT_Vector*  u2,\n                                     const FT_Vector*  v1,\n                                     const FT_Vector*  v2,\n                                     FT_Vector*        intersection )\n  {\n    /*\n     * Let `u' be a zero-based vector from the first segment, `v' from the\n     * second segment.\n     * Let `w 'be the zero-based vector from `u1' to `v1'.\n     * `perp' is the `perpendicular dot product'; see\n     * http://mathworld.wolfram.com/PerpDotProduct.html.\n     * `s' is the parameter for the parametric line for the first segment\n     * (`u').\n     *\n     * See notation in\n     * http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm.\n     * Calculations are done in 16.16, but must handle the squaring of\n     * line lengths in character space.  We scale all vectors by 1/32 to\n     * avoid overflow.  This allows values up to 4095 to be squared.  The\n     * scale factor cancels in the divide.\n     *\n     * TODO: the scale factor could be computed from UnitsPerEm.\n     *\n     */\n\n#define cf2_perp( a, b )                                    \\\n          ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) )\n\n  /* round and divide by 32 */\n#define CF2_CS_SCALE( x )         \\\n          ( ( (x) + 0x10 ) >> 5 )\n\n    FT_Vector  u, v, w;      /* scaled vectors */\n    CF2_Fixed  denominator, s;\n\n\n    u.x = CF2_CS_SCALE( u2->x - u1->x );\n    u.y = CF2_CS_SCALE( u2->y - u1->y );\n    v.x = CF2_CS_SCALE( v2->x - v1->x );\n    v.y = CF2_CS_SCALE( v2->y - v1->y );\n    w.x = CF2_CS_SCALE( v1->x - u1->x );\n    w.y = CF2_CS_SCALE( v1->y - u1->y );\n\n    denominator = cf2_perp( u, v );\n\n    if ( denominator == 0 )\n      return FALSE;           /* parallel or coincident lines */\n\n    s = FT_DivFix( cf2_perp( w, v ), denominator );\n\n    intersection->x = u1->x + FT_MulFix( s, u2->x - u1->x );\n    intersection->y = u1->y + FT_MulFix( s, u2->y - u1->y );\n\n    /*\n     * Special case snapping for horizontal and vertical lines.\n     * This cleans up intersections and reduces problems with winding\n     * order detection.\n     * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685.\n     * Note: these calculations are in character space.\n     *\n     */\n\n    if ( u1->x == u2->x                                                     &&\n         cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold )\n      intersection->x = u1->x;\n    if ( u1->y == u2->y                                                     &&\n         cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold )\n      intersection->y = u1->y;\n\n    if ( v1->x == v2->x                                                     &&\n         cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold )\n      intersection->x = v1->x;\n    if ( v1->y == v2->y                                                     &&\n         cf2_fixedAbs( intersection->y - v1->y ) < glyphpath->snapThreshold )\n      intersection->y = v1->y;\n\n    /* limit the intersection distance from midpoint of u2 and v1 */\n    if ( cf2_fixedAbs( intersection->x - ( u2->x + v1->x ) / 2 ) >\n           glyphpath->miterLimit                                   ||\n         cf2_fixedAbs( intersection->y - ( u2->y + v1->y ) / 2 ) >\n           glyphpath->miterLimit                                   )\n      return FALSE;\n\n    return TRUE;\n  }\n\n\n  /*\n   * Push the cached element (glyphpath->prevElem*) to the outline\n   * consumer.  When a darkening offset is used, the end point of the\n   * cached element may be adjusted to an intersection point or it may be\n   * connected by a line to the current element.  This calculation must\n   * use a HintMap that was valid at the time the element was saved.  For\n   * the first point in a subpath, that is a saved HintMap.  For most\n   * elements, it just means the caller has delayed building a HintMap\n   * from the current HintMask.\n   *\n   * Transform each point with outerTransform and call the outline\n   * callbacks.  This is a general 3x3 transform:\n   *\n   *   x' = a*x + c*y + tx, y' = b*x + d*y + ty\n   *\n   * but it uses 4 elements from CF2_Font and the translation part\n   * from CF2_GlyphPath.\n   *\n   */\n  static void\n  cf2_glyphpath_pushPrevElem( CF2_GlyphPath  glyphpath,\n                              CF2_HintMap    hintmap,\n                              FT_Vector*     nextP0,\n                              FT_Vector      nextP1,\n                              FT_Bool        close )\n  {\n    CF2_CallbackParamsRec  params;\n\n    FT_Vector*  prevP0;\n    FT_Vector*  prevP1;\n\n    FT_Vector  intersection    = { 0, 0 };\n    FT_Bool    useIntersection = FALSE;\n\n\n    FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo ||\n               glyphpath->prevElemOp == CF2_PathOpCubeTo );\n\n    if ( glyphpath->prevElemOp == CF2_PathOpLineTo )\n    {\n      prevP0 = &glyphpath->prevElemP0;\n      prevP1 = &glyphpath->prevElemP1;\n    }\n    else\n    {\n      prevP0 = &glyphpath->prevElemP2;\n      prevP1 = &glyphpath->prevElemP3;\n    }\n\n    /* optimization: if previous and next elements are offset by the same */\n    /* amount, then there will be no gap, and no need to compute an       */\n    /* intersection.                                                      */\n    if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y )\n    {\n      /* previous element does not join next element:             */\n      /* adjust end point of previous element to the intersection */\n      useIntersection = cf2_glyphpath_computeIntersection( glyphpath,\n                                                           prevP0,\n                                                           prevP1,\n                                                           nextP0,\n                                                           &nextP1,\n                                                           &intersection );\n      if ( useIntersection )\n      {\n        /* modify the last point of the cached element (either line or */\n        /* curve)                                                      */\n        *prevP1 = intersection;\n      }\n    }\n\n    params.pt0 = glyphpath->currentDS;\n\n    switch( glyphpath->prevElemOp )\n    {\n    case CF2_PathOpLineTo:\n      params.op = CF2_PathOpLineTo;\n\n      /* note: pt2 and pt3 are unused */\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt1,\n                               glyphpath->prevElemP1.x,\n                               glyphpath->prevElemP1.y );\n\n      glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );\n\n      glyphpath->currentDS = params.pt1;\n\n      break;\n\n    case CF2_PathOpCubeTo:\n      params.op = CF2_PathOpCubeTo;\n\n      /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt1,\n                               glyphpath->prevElemP1.x,\n                               glyphpath->prevElemP1.y );\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt2,\n                               glyphpath->prevElemP2.x,\n                               glyphpath->prevElemP2.y );\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt3,\n                               glyphpath->prevElemP3.x,\n                               glyphpath->prevElemP3.y );\n\n      glyphpath->callbacks->cubeTo( glyphpath->callbacks, &params );\n\n      glyphpath->currentDS = params.pt3;\n\n      break;\n    }\n\n    if ( !useIntersection || close )\n    {\n      /* insert connecting line between end of previous element and start */\n      /* of current one                                                   */\n      /* note: at the end of a subpath, we might do both, so use `nextP0' */\n      /* before we change it, below                                       */\n\n      cf2_glyphpath_hintPoint( glyphpath,\n                               hintmap,\n                               &params.pt1,\n                               nextP0->x,\n                               nextP0->y );\n\n      if ( params.pt1.x != glyphpath->currentDS.x ||\n           params.pt1.y != glyphpath->currentDS.y )\n      {\n        /* length is nonzero */\n        params.op  = CF2_PathOpLineTo;\n        params.pt0 = glyphpath->currentDS;\n\n        /* note: pt2 and pt3 are unused */\n        glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );\n\n        glyphpath->currentDS = params.pt1;\n      }\n    }\n\n    if ( useIntersection )\n    {\n      /* return intersection point to caller */\n      *nextP0 = intersection;\n    }\n  }\n\n\n  /* push a MoveTo element based on current point and offset of current */\n  /* element                                                            */\n  static void\n  cf2_glyphpath_pushMove( CF2_GlyphPath  glyphpath,\n                          FT_Vector      start )\n  {\n    CF2_CallbackParamsRec  params;\n\n\n    params.op  = CF2_PathOpMoveTo;\n    params.pt0 = glyphpath->currentDS;\n\n    /* Test if move has really happened yet; it would have called */\n    /* `cf2_hintmap_build' to set `isValid'.                   */\n    if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) )\n    {\n      /* we are here iff first subpath is missing a moveto operator: */\n      /* synthesize first moveTo to finish initialization of hintMap */\n      cf2_glyphpath_moveTo( glyphpath,\n                            glyphpath->start.x,\n                            glyphpath->start.y );\n    }\n\n    cf2_glyphpath_hintPoint( glyphpath,\n                             &glyphpath->hintMap,\n                             &params.pt1,\n                             start.x,\n                             start.y );\n\n    /* note: pt2 and pt3 are unused */\n    glyphpath->callbacks->moveTo( glyphpath->callbacks, &params );\n\n    glyphpath->currentDS    = params.pt1;\n    glyphpath->offsetStart0 = start;\n  }\n\n\n  /*\n   * All coordinates are in character space.\n   * On input, (x1, y1) and (x2, y2) give line segment.\n   * On output, (x, y) give offset vector.\n   * We use a piecewise approximation to trig functions.\n   *\n   * TODO: Offset true perpendicular and proper length\n   *       supply the y-translation for hinting here, too,\n   *       that adds yOffset unconditionally to *y.\n   */\n  static void\n  cf2_glyphpath_computeOffset( CF2_GlyphPath  glyphpath,\n                               CF2_Fixed      x1,\n                               CF2_Fixed      y1,\n                               CF2_Fixed      x2,\n                               CF2_Fixed      y2,\n                               CF2_Fixed*     x,\n                               CF2_Fixed*     y )\n  {\n    CF2_Fixed  dx = x2 - x1;\n    CF2_Fixed  dy = y2 - y1;\n\n\n    /* note: negative offsets don't work here; negate deltas to change */\n    /* quadrants, below                                                */\n    if ( glyphpath->font->reverseWinding )\n    {\n      dx = -dx;\n      dy = -dy;\n    }\n\n    *x = *y = 0;\n\n    if ( !glyphpath->darken )\n        return;\n\n    /* add momentum for this path element */\n    glyphpath->callbacks->windingMomentum +=\n      cf2_getWindingMomentum( x1, y1, x2, y2 );\n\n    /* note: allow mixed integer and fixed multiplication here */\n    if ( dx >= 0 )\n    {\n      if ( dy >= 0 )\n      {\n        /* first quadrant, +x +y */\n\n        if ( dx > 2 * dy )\n        {\n          /* +x */\n          *x = 0;\n          *y = 0;\n        }\n        else if ( dy > 2 * dx )\n        {\n          /* +y */\n          *x = glyphpath->xOffset;\n          *y = glyphpath->yOffset;\n        }\n        else\n        {\n          /* +x +y */\n          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),\n                          glyphpath->xOffset );\n          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),\n                          glyphpath->yOffset );\n        }\n      }\n      else\n      {\n        /* fourth quadrant, +x -y */\n\n        if ( dx > -2 * dy )\n        {\n          /* +x */\n          *x = 0;\n          *y = 0;\n        }\n        else if ( -dy > 2 * dx )\n        {\n          /* -y */\n          *x = -glyphpath->xOffset;\n          *y = glyphpath->yOffset;\n        }\n        else\n        {\n          /* +x -y */\n          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),\n                          glyphpath->xOffset );\n          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),\n                          glyphpath->yOffset );\n        }\n      }\n    }\n    else\n    {\n      if ( dy >= 0 )\n      {\n        /* second quadrant, -x +y */\n\n        if ( -dx > 2 * dy )\n        {\n          /* -x */\n          *x = 0;\n          *y = 2 * glyphpath->yOffset;\n        }\n        else if ( dy > -2 * dx )\n        {\n          /* +y */\n          *x = glyphpath->xOffset;\n          *y = glyphpath->yOffset;\n        }\n        else\n        {\n          /* -x +y */\n          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),\n                          glyphpath->xOffset );\n          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),\n                          glyphpath->yOffset );\n        }\n      }\n      else\n      {\n        /* third quadrant, -x -y */\n\n        if ( -dx > -2 * dy )\n        {\n          /* -x */\n          *x = 0;\n          *y = 2 * glyphpath->yOffset;\n        }\n        else if ( -dy > -2 * dx )\n        {\n          /* -y */\n          *x = -glyphpath->xOffset;\n          *y = glyphpath->xOffset;\n        }\n        else\n        {\n          /* -x -y */\n          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),\n                          glyphpath->xOffset );\n          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),\n                          glyphpath->yOffset );\n        }\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_moveTo( CF2_GlyphPath  glyphpath,\n                        CF2_Fixed      x,\n                        CF2_Fixed      y )\n  {\n    cf2_glyphpath_closeOpenPath( glyphpath );\n\n    /* save the parameters of the move for later, when we'll know how to */\n    /* offset it;                                                        */\n    /* also save last move point */\n    glyphpath->currentCS.x = glyphpath->start.x = x;\n    glyphpath->currentCS.y = glyphpath->start.y = y;\n\n    glyphpath->moveIsPending = TRUE;\n\n    /* ensure we have a valid map with current mask */\n    if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ||\n         cf2_hintmask_isNew( glyphpath->hintMask )   )\n      cf2_hintmap_build( &glyphpath->hintMap,\n                         glyphpath->hStemHintArray,\n                         glyphpath->vStemHintArray,\n                         glyphpath->hintMask,\n                         glyphpath->hintOriginY,\n                         FALSE );\n\n    /* save a copy of current HintMap to use when drawing initial point */\n    glyphpath->firstHintMap = glyphpath->hintMap;     /* structure copy */\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_lineTo( CF2_GlyphPath  glyphpath,\n                        CF2_Fixed      x,\n                        CF2_Fixed      y )\n  {\n    CF2_Fixed  xOffset, yOffset;\n    FT_Vector  P0, P1;\n\n\n    /* can't compute offset of zero length line, so ignore them */\n    if ( glyphpath->currentCS.x == x && glyphpath->currentCS.y == y )\n      return;\n\n    cf2_glyphpath_computeOffset( glyphpath,\n                                 glyphpath->currentCS.x,\n                                 glyphpath->currentCS.y,\n                                 x,\n                                 y,\n                                 &xOffset,\n                                 &yOffset );\n\n    /* construct offset points */\n    P0.x = glyphpath->currentCS.x + xOffset;\n    P0.y = glyphpath->currentCS.y + yOffset;\n    P1.x = x + xOffset;\n    P1.y = y + yOffset;\n\n    if ( glyphpath->moveIsPending )\n    {\n      /* emit offset 1st point as MoveTo */\n      cf2_glyphpath_pushMove( glyphpath, P0 );\n\n      glyphpath->moveIsPending = FALSE;  /* adjust state machine */\n      glyphpath->pathIsOpen    = TRUE;\n\n      glyphpath->offsetStart1 = P1;              /* record second point */\n    }\n\n    if ( glyphpath->elemIsQueued )\n    {\n      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );\n\n      cf2_glyphpath_pushPrevElem( glyphpath,\n                                  &glyphpath->hintMap,\n                                  &P0,\n                                  P1,\n                                  FALSE );\n    }\n\n    /* queue the current element with offset points */\n    glyphpath->elemIsQueued = TRUE;\n    glyphpath->prevElemOp   = CF2_PathOpLineTo;\n    glyphpath->prevElemP0   = P0;\n    glyphpath->prevElemP1   = P1;\n\n    /* update current map */\n    if ( cf2_hintmask_isNew( glyphpath->hintMask ) )\n      cf2_hintmap_build( &glyphpath->hintMap,\n                         glyphpath->hStemHintArray,\n                         glyphpath->vStemHintArray,\n                         glyphpath->hintMask,\n                         glyphpath->hintOriginY,\n                         FALSE );\n\n    glyphpath->currentCS.x = x;     /* pre-offset current point */\n    glyphpath->currentCS.y = y;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_curveTo( CF2_GlyphPath  glyphpath,\n                         CF2_Fixed      x1,\n                         CF2_Fixed      y1,\n                         CF2_Fixed      x2,\n                         CF2_Fixed      y2,\n                         CF2_Fixed      x3,\n                         CF2_Fixed      y3 )\n  {\n    CF2_Fixed  xOffset1, yOffset1, xOffset3, yOffset3;\n    FT_Vector  P0, P1, P2, P3;\n\n\n    /* TODO: ignore zero length portions of curve?? */\n    cf2_glyphpath_computeOffset( glyphpath,\n                                 glyphpath->currentCS.x,\n                                 glyphpath->currentCS.y,\n                                 x1,\n                                 y1,\n                                 &xOffset1,\n                                 &yOffset1 );\n    cf2_glyphpath_computeOffset( glyphpath,\n                                 x2,\n                                 y2,\n                                 x3,\n                                 y3,\n                                 &xOffset3,\n                                 &yOffset3 );\n\n    /* add momentum from the middle segment */\n    glyphpath->callbacks->windingMomentum +=\n      cf2_getWindingMomentum( x1, y1, x2, y2 );\n\n    /* construct offset points */\n    P0.x = glyphpath->currentCS.x + xOffset1;\n    P0.y = glyphpath->currentCS.y + yOffset1;\n    P1.x = x1 + xOffset1;\n    P1.y = y1 + yOffset1;\n    /* note: preserve angle of final segment by using offset3 at both ends */\n    P2.x = x2 + xOffset3;\n    P2.y = y2 + yOffset3;\n    P3.x = x3 + xOffset3;\n    P3.y = y3 + yOffset3;\n\n    if ( glyphpath->moveIsPending )\n    {\n      /* emit offset 1st point as MoveTo */\n      cf2_glyphpath_pushMove( glyphpath, P0 );\n\n      glyphpath->moveIsPending = FALSE;\n      glyphpath->pathIsOpen    = TRUE;\n\n      glyphpath->offsetStart1 = P1;              /* record second point */\n    }\n\n    if ( glyphpath->elemIsQueued )\n    {\n      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );\n\n      cf2_glyphpath_pushPrevElem( glyphpath,\n                                  &glyphpath->hintMap,\n                                  &P0,\n                                  P1,\n                                  FALSE );\n    }\n\n    /* queue the current element with offset points */\n    glyphpath->elemIsQueued = TRUE;\n    glyphpath->prevElemOp   = CF2_PathOpCubeTo;\n    glyphpath->prevElemP0   = P0;\n    glyphpath->prevElemP1   = P1;\n    glyphpath->prevElemP2   = P2;\n    glyphpath->prevElemP3   = P3;\n\n    /* update current map */\n    if ( cf2_hintmask_isNew( glyphpath->hintMask ) )\n      cf2_hintmap_build( &glyphpath->hintMap,\n                         glyphpath->hStemHintArray,\n                         glyphpath->vStemHintArray,\n                         glyphpath->hintMask,\n                         glyphpath->hintOriginY,\n                         FALSE );\n\n    glyphpath->currentCS.x = x3;       /* pre-offset current point */\n    glyphpath->currentCS.y = y3;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_glyphpath_closeOpenPath( CF2_GlyphPath  glyphpath )\n  {\n    if ( glyphpath->pathIsOpen )\n    {\n      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->firstHintMap ) );\n\n      /* since we need to apply an offset to the implicit lineto, we make */\n      /* it explicit here                                                 */\n      cf2_glyphpath_lineTo( glyphpath,\n                            glyphpath->start.x,\n                            glyphpath->start.y );\n\n      /* Draw previous element (the explicit LineTo we just created,      */\n      /* above) and connect it to the start point, but with the offset we */\n      /* saved from the first element.                                    */\n      /* Use the saved HintMap, too. */\n      FT_ASSERT( glyphpath->elemIsQueued );\n\n      cf2_glyphpath_pushPrevElem( glyphpath,\n                                  &glyphpath->firstHintMap,\n                                  &glyphpath->offsetStart0,\n                                  glyphpath->offsetStart1,\n                                  TRUE );\n\n      /* reset state machine */\n      glyphpath->moveIsPending = TRUE;\n      glyphpath->pathIsOpen    = FALSE;\n      glyphpath->elemIsQueued  = FALSE;\n    }\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2hints.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2hints.h                                                             */\n/*                                                                         */\n/*    Adobe's code for handling CFF hints (body).                          */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2HINTS_H__\n#define __CF2HINTS_H__\n\n\nFT_BEGIN_HEADER\n\n\n  enum\n  {\n    CF2_MAX_HINTS = 96    /* maximum # of hints */\n  };\n\n\n  /*\n   * A HintMask object stores a bit mask that specifies which hints in the\n   * charstring are active at a given time.  Hints in CFF must be declared\n   * at the start, before any drawing operators, with horizontal hints\n   * preceding vertical hints.  The HintMask is ordered the same way, with\n   * horizontal hints immediately followed by vertical hints.  Clients are\n   * responsible for knowing how many of each type are present.\n   *\n   * The maximum total number of hints is 96, as specified by the CFF\n   * specification.\n   *\n   * A HintMask is built 0 or more times while interpreting a charstring, by\n   * the HintMask operator.  There is only one HintMask, but it is built or\n   * rebuilt each time there is a hint substitution (HintMask operator) in\n   * the charstring.  A default HintMask with all bits set is built if there\n   * has been no HintMask operator prior to the first drawing operator.\n   *\n   */\n\n  typedef struct  CF2_HintMaskRec_\n  {\n    FT_Error*  error;\n\n    FT_Bool  isValid;\n    FT_Bool  isNew;\n\n    size_t  bitCount;\n    size_t  byteCount;\n\n    FT_Byte  mask[( CF2_MAX_HINTS + 7 ) / 8];\n\n  } CF2_HintMaskRec, *CF2_HintMask;\n\n\n  typedef struct  CF2_StemHintRec_\n  {\n    FT_Bool  used;     /* DS positions are valid         */\n\n    CF2_Fixed  min;    /* original character space value */\n    CF2_Fixed  max;\n\n    CF2_Fixed  minDS;  /* DS position after first use    */\n    CF2_Fixed  maxDS;\n\n  } CF2_StemHintRec, *CF2_StemHint;\n\n\n  /*\n   * A HintMap object stores a piecewise linear function for mapping\n   * y-coordinates from character space to device space, providing\n   * appropriate pixel alignment to stem edges.\n   *\n   * The map is implemented as an array of `CF2_Hint' elements, each\n   * representing an edge.  When edges are paired, as from stem hints, the\n   * bottom edge must immediately precede the top edge in the array.\n   * Element character space AND device space positions must both increase\n   * monotonically in the array.  `CF2_Hint' elements are also used as\n   * parameters to `cf2_blues_capture'.\n   *\n   * The `cf2_hintmap_build' method must be called before any drawing\n   * operation (beginning with a Move operator) and at each hint\n   * substitution (HintMask operator).\n   *\n   * The `cf2_hintmap_map' method is called to transform y-coordinates at\n   * each drawing operation (move, line, curve).\n   *\n   */\n\n  /* TODO: make this a CF2_ArrStack and add a deep copy method */\n  enum\n  {\n    CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2\n  };\n\n\n  typedef struct  CF2_HintMapRec_\n  {\n    CF2_Font  font;\n\n    /* initial map based on blue zones */\n    struct CF2_HintMapRec_*  initialHintMap;\n\n    /* working storage for 2nd pass adjustHints */\n    CF2_ArrStack  hintMoves;\n\n    FT_Bool  isValid;\n    FT_Bool  hinted;\n\n    CF2_Fixed  scale;\n    CF2_UInt   count;\n\n    /* start search from this index */\n    CF2_UInt  lastIndex;\n\n    CF2_HintRec  edge[CF2_MAX_HINT_EDGES]; /* 192 */\n\n  } CF2_HintMapRec, *CF2_HintMap;\n\n\n  FT_LOCAL( FT_Bool )\n  cf2_hint_isValid( const CF2_Hint  hint );\n  FT_LOCAL( FT_Bool )\n  cf2_hint_isTop( const CF2_Hint  hint );\n  FT_LOCAL( FT_Bool )\n  cf2_hint_isBottom( const CF2_Hint  hint );\n  FT_LOCAL( void )\n  cf2_hint_lock( CF2_Hint  hint );\n\n\n  FT_LOCAL( void )\n  cf2_hintmap_init( CF2_HintMap   hintmap,\n                    CF2_Font      font,\n                    CF2_HintMap   initialMap,\n                    CF2_ArrStack  hintMoves,\n                    CF2_Fixed     scale );\n  FT_LOCAL( void )\n  cf2_hintmap_build( CF2_HintMap   hintmap,\n                     CF2_ArrStack  hStemHintArray,\n                     CF2_ArrStack  vStemHintArray,\n                     CF2_HintMask  hintMask,\n                     CF2_Fixed     hintOrigin,\n                     FT_Bool       initialMap );\n\n\n  /*\n   * GlyphPath is a wrapper for drawing operations that scales the\n   * coordinates according to the render matrix and HintMap.  It also tracks\n   * open paths to control ClosePath and to insert MoveTo for broken fonts.\n   *\n   */\n  typedef struct  CF2_GlyphPathRec_\n  {\n    /* TODO: gather some of these into a hinting context */\n\n    CF2_Font              font;           /* font instance    */\n    CF2_OutlineCallbacks  callbacks;      /* outline consumer */\n\n\n    CF2_HintMapRec  hintMap;        /* current hint map            */\n    CF2_HintMapRec  firstHintMap;   /* saved copy                  */\n    CF2_HintMapRec  initialHintMap; /* based on all captured hints */\n\n    CF2_ArrStackRec  hintMoves;  /* list of hint moves for 2nd pass */\n\n    CF2_Fixed  scaleX;         /* matrix a */\n    CF2_Fixed  scaleC;         /* matrix c */\n    CF2_Fixed  scaleY;         /* matrix d */\n\n    FT_Vector  fractionalTranslation;  /* including deviceXScale */\n#if 0\n    CF2_Fixed  hShift;    /* character space horizontal shift */\n                          /* (for fauxing)                    */\n#endif\n\n    FT_Bool  pathIsOpen;     /* true after MoveTo                     */\n    FT_Bool  darken;         /* true if stem darkening                */\n    FT_Bool  moveIsPending;  /* true between MoveTo and offset MoveTo */\n\n    /* references used to call `cf2_hintmap_build', if necessary */\n    CF2_ArrStack         hStemHintArray;\n    CF2_ArrStack         vStemHintArray;\n    CF2_HintMask         hintMask;     /* ptr to the current mask */\n    CF2_Fixed            hintOriginY;  /* copy of current origin  */\n    const CF2_BluesRec*  blues;\n\n    CF2_Fixed  xOffset;        /* character space offsets */\n    CF2_Fixed  yOffset;\n\n    /* character space miter limit threshold */\n    CF2_Fixed  miterLimit;\n    /* vertical/horzizontal snap distance in character space */\n    CF2_Fixed  snapThreshold;\n\n    FT_Vector  offsetStart0;  /* first and second points of first */\n    FT_Vector  offsetStart1;  /* element with offset applied      */\n\n    /* current point, character space, before offset */\n    FT_Vector  currentCS;\n    /* current point, device space */\n    FT_Vector  currentDS;\n    FT_Vector  start;         /* start point of subpath */\n\n    /* the following members constitute the `queue' of one element */\n    FT_Bool  elemIsQueued;\n    CF2_Int  prevElemOp;\n\n    FT_Vector  prevElemP0;\n    FT_Vector  prevElemP1;\n    FT_Vector  prevElemP2;\n    FT_Vector  prevElemP3;\n\n  } CF2_GlyphPathRec, *CF2_GlyphPath;\n\n\n  FT_LOCAL( void )\n  cf2_glyphpath_init( CF2_GlyphPath         glyphpath,\n                      CF2_Font              font,\n                      CF2_OutlineCallbacks  callbacks,\n                      CF2_Fixed             scaleY,\n                      /* CF2_Fixed hShift, */\n                      CF2_ArrStack          hStemHintArray,\n                      CF2_ArrStack          vStemHintArray,\n                      CF2_HintMask          hintMask,\n                      CF2_Fixed             hintOrigin,\n                      const CF2_Blues       blues,\n                      const FT_Vector*      fractionalTranslation );\n  FT_LOCAL( void )\n  cf2_glyphpath_finalize( CF2_GlyphPath  glyphpath );\n\n  FT_LOCAL( void )\n  cf2_glyphpath_moveTo( CF2_GlyphPath  glyphpath,\n                        CF2_Fixed      x,\n                        CF2_Fixed      y );\n  FT_LOCAL( void )\n  cf2_glyphpath_lineTo( CF2_GlyphPath  glyphpath,\n                        CF2_Fixed      x,\n                        CF2_Fixed      y );\n  FT_LOCAL( void )\n  cf2_glyphpath_curveTo( CF2_GlyphPath  glyphpath,\n                         CF2_Fixed      x1,\n                         CF2_Fixed      y1,\n                         CF2_Fixed      x2,\n                         CF2_Fixed      y2,\n                         CF2_Fixed      x3,\n                         CF2_Fixed      y3 );\n  FT_LOCAL( void )\n  cf2_glyphpath_closeOpenPath( CF2_GlyphPath  glyphpath );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2HINTS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2intrp.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2intrp.c                                                             */\n/*                                                                         */\n/*    Adobe's CFF Interpreter (body).                                      */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include FT_INTERNAL_DEBUG_H\n\n#include \"cf2glue.h\"\n#include \"cf2font.h\"\n#include \"cf2stack.h\"\n#include \"cf2hints.h\"\n\n#include \"cf2error.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cf2interp\n\n\n  /* some operators are not implemented yet */\n#define CF2_FIXME  FT_TRACE4(( \"cf2_interpT2CharString:\"            \\\n                               \" operator not implemented yet\\n\" ))\n\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hintmask_init( CF2_HintMask  hintmask,\n                     FT_Error*     error )\n  {\n    FT_ZERO( hintmask );\n\n    hintmask->error = error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hintmask_isValid( const CF2_HintMask  hintmask )\n  {\n    return hintmask->isValid;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_hintmask_isNew( const CF2_HintMask  hintmask )\n  {\n    return hintmask->isNew;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hintmask_setNew( CF2_HintMask  hintmask,\n                       FT_Bool       val )\n  {\n    hintmask->isNew = val;\n  }\n\n\n  /* clients call `getMaskPtr' in order to iterate */\n  /* through hint mask                             */\n\n  FT_LOCAL_DEF( FT_Byte* )\n  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask )\n  {\n    return hintmask->mask;\n  }\n\n\n  static size_t\n  cf2_hintmask_setCounts( CF2_HintMask  hintmask,\n                          size_t        bitCount )\n  {\n    if ( bitCount > CF2_MAX_HINTS )\n    {\n      /* total of h and v stems must be <= 96 */\n      CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format );\n      return 0;\n    }\n\n    hintmask->bitCount  = bitCount;\n    hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8;\n\n    hintmask->isValid = TRUE;\n    hintmask->isNew   = TRUE;\n\n    return bitCount;\n  }\n\n\n  /* consume the hintmask bytes from the charstring, advancing the src */\n  /* pointer                                                           */\n  static void\n  cf2_hintmask_read( CF2_HintMask  hintmask,\n                     CF2_Buffer    charstring,\n                     size_t        bitCount )\n  {\n    size_t  i;\n\n#ifndef CF2_NDEBUG\n    /* these are the bits in the final mask byte that should be zero  */\n    /* Note: this variable is only used in an assert expression below */\n    /* and then only if CF2_NDEBUG is not defined                     */\n    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;\n#endif\n\n\n    /* initialize counts and isValid */\n    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )\n      return;\n\n    FT_ASSERT( hintmask->byteCount > 0 );\n\n    FT_TRACE4(( \" (maskbytes:\" ));\n\n    /* set mask and advance interpreter's charstring pointer */\n    for ( i = 0; i < hintmask->byteCount; i++ )\n    {\n      hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring );\n      FT_TRACE4(( \" 0x%02X\", hintmask->mask[i] ));\n    }\n\n    FT_TRACE4(( \")\\n\" ));\n\n    /* assert any unused bits in last byte are zero unless there's a prior */\n    /* error                                                               */\n    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1      */\n#ifndef CF2_NDEBUG\n    FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 ||\n               *hintmask->error                                        );\n#endif\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_hintmask_setAll( CF2_HintMask  hintmask,\n                       size_t        bitCount )\n  {\n    size_t    i;\n    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;\n\n\n    /* initialize counts and isValid */\n    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )\n      return;\n\n    FT_ASSERT( hintmask->byteCount > 0 );\n    FT_ASSERT( hintmask->byteCount <\n                 sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) );\n\n    /* set mask to all ones */\n    for ( i = 0; i < hintmask->byteCount; i++ )\n      hintmask->mask[i] = 0xFF;\n\n    /* clear unused bits                                              */\n    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */\n    hintmask->mask[hintmask->byteCount - 1] &= ~mask;\n  }\n\n\n  /* Type2 charstring opcodes */\n  enum\n  {\n    cf2_cmdRESERVED_0,   /* 0 */\n    cf2_cmdHSTEM,        /* 1 */\n    cf2_cmdRESERVED_2,   /* 2 */\n    cf2_cmdVSTEM,        /* 3 */\n    cf2_cmdVMOVETO,      /* 4 */\n    cf2_cmdRLINETO,      /* 5 */\n    cf2_cmdHLINETO,      /* 6 */\n    cf2_cmdVLINETO,      /* 7 */\n    cf2_cmdRRCURVETO,    /* 8 */\n    cf2_cmdRESERVED_9,   /* 9 */\n    cf2_cmdCALLSUBR,     /* 10 */\n    cf2_cmdRETURN,       /* 11 */\n    cf2_cmdESC,          /* 12 */\n    cf2_cmdRESERVED_13,  /* 13 */\n    cf2_cmdENDCHAR,      /* 14 */\n    cf2_cmdRESERVED_15,  /* 15 */\n    cf2_cmdRESERVED_16,  /* 16 */\n    cf2_cmdRESERVED_17,  /* 17 */\n    cf2_cmdHSTEMHM,      /* 18 */\n    cf2_cmdHINTMASK,     /* 19 */\n    cf2_cmdCNTRMASK,     /* 20 */\n    cf2_cmdRMOVETO,      /* 21 */\n    cf2_cmdHMOVETO,      /* 22 */\n    cf2_cmdVSTEMHM,      /* 23 */\n    cf2_cmdRCURVELINE,   /* 24 */\n    cf2_cmdRLINECURVE,   /* 25 */\n    cf2_cmdVVCURVETO,    /* 26 */\n    cf2_cmdHHCURVETO,    /* 27 */\n    cf2_cmdEXTENDEDNMBR, /* 28 */\n    cf2_cmdCALLGSUBR,    /* 29 */\n    cf2_cmdVHCURVETO,    /* 30 */\n    cf2_cmdHVCURVETO     /* 31 */\n  };\n\n  enum\n  {\n    cf2_escDOTSECTION,   /* 0 */\n    cf2_escRESERVED_1,   /* 1 */\n    cf2_escRESERVED_2,   /* 2 */\n    cf2_escAND,          /* 3 */\n    cf2_escOR,           /* 4 */\n    cf2_escNOT,          /* 5 */\n    cf2_escRESERVED_6,   /* 6 */\n    cf2_escRESERVED_7,   /* 7 */\n    cf2_escRESERVED_8,   /* 8 */\n    cf2_escABS,          /* 9 */\n    cf2_escADD,          /* 10     like otherADD */\n    cf2_escSUB,          /* 11     like otherSUB */\n    cf2_escDIV,          /* 12 */\n    cf2_escRESERVED_13,  /* 13 */\n    cf2_escNEG,          /* 14 */\n    cf2_escEQ,           /* 15 */\n    cf2_escRESERVED_16,  /* 16 */\n    cf2_escRESERVED_17,  /* 17 */\n    cf2_escDROP,         /* 18 */\n    cf2_escRESERVED_19,  /* 19 */\n    cf2_escPUT,          /* 20     like otherPUT    */\n    cf2_escGET,          /* 21     like otherGET    */\n    cf2_escIFELSE,       /* 22     like otherIFELSE */\n    cf2_escRANDOM,       /* 23     like otherRANDOM */\n    cf2_escMUL,          /* 24     like otherMUL    */\n    cf2_escRESERVED_25,  /* 25 */\n    cf2_escSQRT,         /* 26 */\n    cf2_escDUP,          /* 27     like otherDUP    */\n    cf2_escEXCH,         /* 28     like otherEXCH   */\n    cf2_escINDEX,        /* 29 */\n    cf2_escROLL,         /* 30 */\n    cf2_escRESERVED_31,  /* 31 */\n    cf2_escRESERVED_32,  /* 32 */\n    cf2_escRESERVED_33,  /* 33 */\n    cf2_escHFLEX,        /* 34 */\n    cf2_escFLEX,         /* 35 */\n    cf2_escHFLEX1,       /* 36 */\n    cf2_escFLEX1         /* 37 */\n  };\n\n\n  /* `stemHintArray' does not change once we start drawing the outline. */\n  static void\n  cf2_doStems( const CF2_Font  font,\n               CF2_Stack       opStack,\n               CF2_ArrStack    stemHintArray,\n               CF2_Fixed*      width,\n               FT_Bool*        haveWidth,\n               CF2_Fixed       hintOffset )\n  {\n    CF2_UInt  i;\n    CF2_UInt  count       = cf2_stack_count( opStack );\n    FT_Bool   hasWidthArg = count & 1;\n\n    /* variable accumulates delta values from operand stack */\n    CF2_Fixed  position = hintOffset;\n\n\n    for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 )\n    {\n      /* construct a CF2_StemHint and push it onto the list */\n      CF2_StemHintRec  stemhint;\n\n\n      stemhint.min  =\n      position     += cf2_stack_getReal( opStack, i );\n      stemhint.max  =\n      position     += cf2_stack_getReal( opStack, i + 1 );\n\n      stemhint.used  = FALSE;\n      stemhint.maxDS =\n      stemhint.minDS = 0;\n\n      cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */\n    }\n\n    if ( hasWidthArg && ! *haveWidth )\n      *width = cf2_stack_getReal( opStack, 0 ) +\n                 cf2_getNominalWidthX( font->decoder );\n\n    *haveWidth = TRUE;\n\n    cf2_stack_clear( opStack );\n  }\n\n\n  static void\n  cf2_doFlex( CF2_Stack       opStack,\n              CF2_Fixed*      curX,\n              CF2_Fixed*      curY,\n              CF2_GlyphPath   glyphPath,\n              const FT_Bool*  readFromStack,\n              FT_Bool         doConditionalLastRead )\n  {\n    CF2_Fixed  vals[14];\n    CF2_UInt   index;\n    FT_Bool    isHFlex;\n    CF2_Int    top, i, j;\n\n\n    vals[0] = *curX;\n    vals[1] = *curY;\n    index   = 0;\n    isHFlex = readFromStack[9] == FALSE;\n    top     = isHFlex ? 9 : 10;\n\n    for ( i = 0; i < top; i++ )\n    {\n      vals[i + 2] = vals[i];\n      if ( readFromStack[i] )\n        vals[i + 2] += cf2_stack_getReal( opStack, index++ );\n    }\n\n    if ( isHFlex )\n      vals[9 + 2] = *curY;\n\n    if ( doConditionalLastRead )\n    {\n      FT_Bool    lastIsX = cf2_fixedAbs( vals[10] - *curX ) >\n                             cf2_fixedAbs( vals[11] - *curY );\n      CF2_Fixed  lastVal = cf2_stack_getReal( opStack, index );\n\n\n      if ( lastIsX )\n      {\n        vals[12] = vals[10] + lastVal;\n        vals[13] = *curY;\n      }\n      else\n      {\n        vals[12] = *curX;\n        vals[13] = vals[11] + lastVal;\n      }\n    }\n    else\n    {\n      if ( readFromStack[10] )\n        vals[12] = vals[10] + cf2_stack_getReal( opStack, index++ );\n      else\n        vals[12] = *curX;\n\n      if ( readFromStack[11] )\n        vals[13] = vals[11] + cf2_stack_getReal( opStack, index );\n      else\n        vals[13] = *curY;\n    }\n\n    for ( j = 0; j < 2; j++ )\n      cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2],\n                                        vals[j * 6 + 3],\n                                        vals[j * 6 + 4],\n                                        vals[j * 6 + 5],\n                                        vals[j * 6 + 6],\n                                        vals[j * 6 + 7] );\n\n    cf2_stack_clear( opStack );\n\n    *curX = vals[12];\n    *curY = vals[13];\n  }\n\n\n  /*\n   * `error' is a shared error code used by many objects in this\n   * routine.  Before the code continues from an error, it must check and\n   * record the error in `*error'.  The idea is that this shared\n   * error code will record the first error encountered.  If testing\n   * for an error anyway, the cost of `goto exit' is small, so we do it,\n   * even if continuing would be safe.  In this case, `lastError' is\n   * set, so the testing and storing can be done in one place, at `exit'.\n   *\n   * Continuing after an error is intended for objects which do their own\n   * testing of `*error', e.g., array stack functions.  This allows us to\n   * avoid an extra test after the call.\n   *\n   * Unimplemented opcodes are ignored.\n   *\n   */\n  FT_LOCAL_DEF( void )\n  cf2_interpT2CharString( CF2_Font              font,\n                          CF2_Buffer            buf,\n                          CF2_OutlineCallbacks  callbacks,\n                          const FT_Vector*      translation,\n                          FT_Bool               doingSeac,\n                          CF2_Fixed             curX,\n                          CF2_Fixed             curY,\n                          CF2_Fixed*            width )\n  {\n    /* lastError is used for errors that are immediately tested */\n    FT_Error  lastError = FT_Err_Ok;\n\n    /* pointer to parsed font object */\n    CFF_Decoder*  decoder = font->decoder;\n\n    FT_Error*  error  = &font->error;\n    FT_Memory  memory = font->memory;\n\n    CF2_Fixed  scaleY        = font->innerTransform.d;\n    CF2_Fixed  nominalWidthX = cf2_getNominalWidthX( decoder );\n\n    /* save this for hinting seac accents */\n    CF2_Fixed  hintOriginY = curY;\n\n    CF2_Stack  opStack = NULL;\n    FT_Byte    op1;                       /* first opcode byte */\n\n    /* instruction limit; 20,000,000 matches Avalon */\n    FT_UInt32  instructionLimit = 20000000UL;\n\n    CF2_ArrStackRec  subrStack;\n\n    FT_Bool     haveWidth;\n    CF2_Buffer  charstring = NULL;\n\n    CF2_Int  charstringIndex = -1;       /* initialize to empty */\n\n    /* TODO: placeholders for hint structures */\n\n    /* objects used for hinting */\n    CF2_ArrStackRec  hStemHintArray;\n    CF2_ArrStackRec  vStemHintArray;\n\n    CF2_HintMaskRec   hintMask;\n    CF2_GlyphPathRec  glyphPath;\n\n\n    /* initialize the remaining objects */\n    cf2_arrstack_init( &subrStack,\n                       memory,\n                       error,\n                       sizeof ( CF2_BufferRec ) );\n    cf2_arrstack_init( &hStemHintArray,\n                       memory,\n                       error,\n                       sizeof ( CF2_StemHintRec ) );\n    cf2_arrstack_init( &vStemHintArray,\n                       memory,\n                       error,\n                       sizeof ( CF2_StemHintRec ) );\n\n    /* initialize CF2_StemHint arrays */\n    cf2_hintmask_init( &hintMask, error );\n\n    /* initialize path map to manage drawing operations */\n\n    /* Note: last 4 params are used to handle `MoveToPermissive', which */\n    /*       may need to call `hintMap.Build'                           */\n    /* TODO: MoveToPermissive is gone; are these still needed?          */\n    cf2_glyphpath_init( &glyphPath,\n                        font,\n                        callbacks,\n                        scaleY,\n                        /* hShift, */\n                        &hStemHintArray,\n                        &vStemHintArray,\n                        &hintMask,\n                        hintOriginY,\n                        &font->blues,\n                        translation );\n\n    /*\n     * Initialize state for width parsing.  From the CFF Spec:\n     *\n     *   The first stack-clearing operator, which must be one of hstem,\n     *   hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto,\n     *   rmoveto, or endchar, takes an additional argument - the width (as\n     *   described earlier), which may be expressed as zero or one numeric\n     *   argument.\n     *\n     * What we implement here uses the first validly specified width, but\n     * does not detect errors for specifying more than one width.\n     *\n     */\n    haveWidth = FALSE;\n    *width    = cf2_getDefaultWidthX( decoder );\n\n    /*\n     * Note: at this point, all pointers to resources must be NULL\n     * and all local objects must be initialized.\n     * There must be no branches to exit: above this point.\n     *\n     */\n\n    /* allocate an operand stack */\n    opStack = cf2_stack_init( memory, error );\n    if ( !opStack )\n    {\n      lastError = FT_THROW( Out_Of_Memory );\n      goto exit;\n    }\n\n    /* initialize subroutine stack by placing top level charstring as */\n    /* first element (max depth plus one for the charstring)          */\n    /* Note: Caller owns and must finalize the first charstring.      */\n    /*       Our copy of it does not change that requirement.         */\n    cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );\n\n    charstring  = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );\n    *charstring = *buf;    /* structure copy */\n\n    charstringIndex = 0;       /* entry is valid now */\n\n    /* catch errors so far */\n    if ( *error )\n      goto exit;\n\n    /* main interpreter loop */\n    while ( 1 )\n    {\n      if ( cf2_buf_isEnd( charstring ) )\n      {\n        /* If we've reached the end of the charstring, simulate a */\n        /* cf2_cmdRETURN or cf2_cmdENDCHAR.                       */\n        if ( charstringIndex )\n          op1 = cf2_cmdRETURN;  /* end of buffer for subroutine */\n        else\n          op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */\n      }\n      else\n        op1 = (FT_Byte)cf2_buf_readByte( charstring );\n\n      /* check for errors once per loop */\n      if ( *error )\n        goto exit;\n\n      instructionLimit--;\n      if ( instructionLimit == 0 )\n      {\n        lastError = FT_THROW( Invalid_Glyph_Format );\n        goto exit;\n      }\n\n      switch( op1 )\n      {\n      case cf2_cmdRESERVED_0:\n      case cf2_cmdRESERVED_2:\n      case cf2_cmdRESERVED_9:\n      case cf2_cmdRESERVED_13:\n      case cf2_cmdRESERVED_15:\n      case cf2_cmdRESERVED_16:\n      case cf2_cmdRESERVED_17:\n        /* we may get here if we have a prior error */\n        FT_TRACE4(( \" unknown op (%d)\\n\", op1 ));\n        break;\n\n      case cf2_cmdHSTEMHM:\n      case cf2_cmdHSTEM:\n        FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? \" hstemhm\\n\" : \" hstem\\n\" ));\n\n        /* never add hints after the mask is computed */\n        if ( cf2_hintmask_isValid( &hintMask ) )\n          FT_TRACE4(( \"cf2_interpT2CharString:\"\n                      \" invalid horizontal hint mask\\n\" ));\n\n        cf2_doStems( font,\n                     opStack,\n                     &hStemHintArray,\n                     width,\n                     &haveWidth,\n                     0 );\n        break;\n\n      case cf2_cmdVSTEMHM:\n      case cf2_cmdVSTEM:\n        FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? \" vstemhm\\n\" : \" vstem\\n\" ));\n\n        /* never add hints after the mask is computed */\n        if ( cf2_hintmask_isValid( &hintMask ) )\n          FT_TRACE4(( \"cf2_interpT2CharString:\"\n                      \" invalid vertical hint mask\\n\" ));\n\n        cf2_doStems( font,\n                     opStack,\n                     &vStemHintArray,\n                     width,\n                     &haveWidth,\n                     0 );\n        break;\n\n      case cf2_cmdVMOVETO:\n        FT_TRACE4(( \" vmoveto\\n\" ));\n\n        curY += cf2_stack_popFixed( opStack );\n\n        cf2_glyphpath_moveTo( &glyphPath, curX, curY );\n\n        if ( cf2_stack_count( opStack ) > 0 && !haveWidth )\n          *width = cf2_stack_popFixed( opStack ) + nominalWidthX;\n\n        haveWidth = TRUE;\n        break;\n\n      case cf2_cmdRLINETO:\n        {\n          CF2_UInt  index;\n          CF2_UInt  count = cf2_stack_count( opStack );\n\n\n          FT_TRACE4(( \" rlineto\\n\" ));\n\n          for ( index = 0; index < count; index += 2 )\n          {\n            curX += cf2_stack_getReal( opStack, index + 0 );\n            curY += cf2_stack_getReal( opStack, index + 1 );\n\n            cf2_glyphpath_lineTo( &glyphPath, curX, curY );\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdHLINETO:\n      case cf2_cmdVLINETO:\n        {\n          CF2_UInt  index;\n          CF2_UInt  count = cf2_stack_count( opStack );\n\n          FT_Bool  isX = op1 == cf2_cmdHLINETO;\n\n\n          FT_TRACE4(( isX ? \" hlineto\\n\" : \" vlineto\\n\" ));\n\n          for ( index = 0; index < count; index++ )\n          {\n            CF2_Fixed  v = cf2_stack_getReal( opStack, index );\n\n\n            if ( isX )\n              curX += v;\n            else\n              curY += v;\n\n            isX = !isX;\n\n            cf2_glyphpath_lineTo( &glyphPath, curX, curY );\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue;\n\n      case cf2_cmdRCURVELINE:\n      case cf2_cmdRRCURVETO:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n\n          FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? \" rcurveline\\n\"\n                                               : \" rrcurveto\\n\" ));\n\n          while ( index + 6 <= count )\n          {\n            CF2_Fixed  x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;\n            CF2_Fixed  y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;\n            CF2_Fixed  x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;\n            CF2_Fixed  y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;\n            CF2_Fixed  x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;\n            CF2_Fixed  y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;\n\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\n            curX   = x3;\n            curY   = y3;\n            index += 6;\n          }\n\n          if ( op1 == cf2_cmdRCURVELINE )\n          {\n            curX += cf2_stack_getReal( opStack, index + 0 );\n            curY += cf2_stack_getReal( opStack, index + 1 );\n\n            cf2_glyphpath_lineTo( &glyphPath, curX, curY );\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdCALLGSUBR:\n      case cf2_cmdCALLSUBR:\n        {\n          CF2_UInt  subrIndex;\n\n\n          FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? \" callgsubr\"\n                                              : \" callsubr\" ));\n\n          if ( charstringIndex > CF2_MAX_SUBR )\n          {\n            /* max subr plus one for charstring */\n            lastError = FT_THROW( Invalid_Glyph_Format );\n            goto exit;                      /* overflow of stack */\n          }\n\n          /* push our current CFF charstring region on subrStack */\n          charstring = (CF2_Buffer)\n                         cf2_arrstack_getPointer( &subrStack,\n                                                  charstringIndex + 1 );\n\n          /* set up the new CFF region and pointer */\n          subrIndex = cf2_stack_popInt( opStack );\n\n          switch ( op1 )\n          {\n          case cf2_cmdCALLGSUBR:\n            FT_TRACE4(( \"(%d)\\n\", subrIndex + decoder->globals_bias ));\n\n            if ( cf2_initGlobalRegionBuffer( decoder,\n                                             subrIndex,\n                                             charstring ) )\n            {\n              lastError = FT_THROW( Invalid_Glyph_Format );\n              goto exit;  /* subroutine lookup or stream error */\n            }\n            break;\n\n          default:\n            /* cf2_cmdCALLSUBR */\n            FT_TRACE4(( \"(%d)\\n\", subrIndex + decoder->locals_bias ));\n\n            if ( cf2_initLocalRegionBuffer( decoder,\n                                            subrIndex,\n                                            charstring ) )\n            {\n              lastError = FT_THROW( Invalid_Glyph_Format );\n              goto exit;  /* subroutine lookup or stream error */\n            }\n          }\n\n          charstringIndex += 1;       /* entry is valid now */\n        }\n        continue; /* do not clear the stack */\n\n      case cf2_cmdRETURN:\n        FT_TRACE4(( \" return\\n\" ));\n\n        if ( charstringIndex < 1 )\n        {\n          /* Note: cannot return from top charstring */\n          lastError = FT_THROW( Invalid_Glyph_Format );\n          goto exit;                      /* underflow of stack */\n        }\n\n        /* restore position in previous charstring */\n        charstring = (CF2_Buffer)\n                       cf2_arrstack_getPointer( &subrStack,\n                                                --charstringIndex );\n        continue;     /* do not clear the stack */\n\n      case cf2_cmdESC:\n        {\n          FT_Byte  op2 = cf2_buf_readByte( charstring );\n\n\n          switch ( op2 )\n          {\n          case cf2_escDOTSECTION:\n            /* something about `flip type of locking' -- ignore it */\n            FT_TRACE4(( \" dotsection\\n\" ));\n\n            break;\n\n          /* TODO: should these operators be supported? */\n          case cf2_escAND: /* in spec */\n            FT_TRACE4(( \" and\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escOR: /* in spec */\n            FT_TRACE4(( \" or\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escNOT: /* in spec */\n            FT_TRACE4(( \" not\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escABS: /* in spec */\n            FT_TRACE4(( \" abs\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escADD: /* in spec */\n            FT_TRACE4(( \" add\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escSUB: /* in spec */\n            FT_TRACE4(( \" sub\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escDIV: /* in spec */\n            FT_TRACE4(( \" div\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escNEG: /* in spec */\n            FT_TRACE4(( \" neg\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escEQ: /* in spec */\n            FT_TRACE4(( \" eq\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escDROP: /* in spec */\n            FT_TRACE4(( \" drop\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escPUT: /* in spec */\n            FT_TRACE4(( \" put\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escGET: /* in spec */\n            FT_TRACE4(( \" get\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escIFELSE: /* in spec */\n            FT_TRACE4(( \" ifelse\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escRANDOM: /* in spec */\n            FT_TRACE4(( \" random\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escMUL: /* in spec */\n            FT_TRACE4(( \" mul\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escSQRT: /* in spec */\n            FT_TRACE4(( \" sqrt\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escDUP: /* in spec */\n            FT_TRACE4(( \" dup\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escEXCH: /* in spec */\n            FT_TRACE4(( \" exch\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escINDEX: /* in spec */\n            FT_TRACE4(( \" index\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escROLL: /* in spec */\n            FT_TRACE4(( \" roll\\n\" ));\n\n            CF2_FIXME;\n            break;\n\n          case cf2_escHFLEX:\n            {\n              static const FT_Bool  readFromStack[12] =\n              {\n                TRUE /* dx1 */, FALSE /* dy1 */,\n                TRUE /* dx2 */, TRUE  /* dy2 */,\n                TRUE /* dx3 */, FALSE /* dy3 */,\n                TRUE /* dx4 */, FALSE /* dy4 */,\n                TRUE /* dx5 */, FALSE /* dy5 */,\n                TRUE /* dx6 */, FALSE /* dy6 */\n              };\n\n\n              FT_TRACE4(( \" hflex\\n\" ));\n\n              cf2_doFlex( opStack,\n                          &curX,\n                          &curY,\n                          &glyphPath,\n                          readFromStack,\n                          FALSE /* doConditionalLastRead */ );\n            }\n            continue;\n\n          case cf2_escFLEX:\n            {\n              static const FT_Bool  readFromStack[12] =\n              {\n                TRUE /* dx1 */, TRUE /* dy1 */,\n                TRUE /* dx2 */, TRUE /* dy2 */,\n                TRUE /* dx3 */, TRUE /* dy3 */,\n                TRUE /* dx4 */, TRUE /* dy4 */,\n                TRUE /* dx5 */, TRUE /* dy5 */,\n                TRUE /* dx6 */, TRUE /* dy6 */\n              };\n\n\n              FT_TRACE4(( \" flex\\n\" ));\n\n              cf2_doFlex( opStack,\n                          &curX,\n                          &curY,\n                          &glyphPath,\n                          readFromStack,\n                          FALSE /* doConditionalLastRead */ );\n            }\n            break;      /* TODO: why is this not a continue? */\n\n          case cf2_escHFLEX1:\n            {\n              static const FT_Bool  readFromStack[12] =\n              {\n                TRUE /* dx1 */, TRUE  /* dy1 */,\n                TRUE /* dx2 */, TRUE  /* dy2 */,\n                TRUE /* dx3 */, FALSE /* dy3 */,\n                TRUE /* dx4 */, FALSE /* dy4 */,\n                TRUE /* dx5 */, TRUE  /* dy5 */,\n                TRUE /* dx6 */, FALSE /* dy6 */\n              };\n\n\n              FT_TRACE4(( \" hflex1\\n\" ));\n\n              cf2_doFlex( opStack,\n                          &curX,\n                          &curY,\n                          &glyphPath,\n                          readFromStack,\n                          FALSE /* doConditionalLastRead */ );\n            }\n            continue;\n\n          case cf2_escFLEX1:\n            {\n              static const FT_Bool  readFromStack[12] =\n              {\n                TRUE  /* dx1 */, TRUE  /* dy1 */,\n                TRUE  /* dx2 */, TRUE  /* dy2 */,\n                TRUE  /* dx3 */, TRUE  /* dy3 */,\n                TRUE  /* dx4 */, TRUE  /* dy4 */,\n                TRUE  /* dx5 */, TRUE  /* dy5 */,\n                FALSE /* dx6 */, FALSE /* dy6 */\n              };\n\n\n              FT_TRACE4(( \" flex1\\n\" ));\n\n              cf2_doFlex( opStack,\n                          &curX,\n                          &curY,\n                          &glyphPath,\n                          readFromStack,\n                          TRUE /* doConditionalLastRead */ );\n            }\n            continue;\n\n          case cf2_escRESERVED_1:\n          case cf2_escRESERVED_2:\n          case cf2_escRESERVED_6:\n          case cf2_escRESERVED_7:\n          case cf2_escRESERVED_8:\n          case cf2_escRESERVED_13:\n          case cf2_escRESERVED_16:\n          case cf2_escRESERVED_17:\n          case cf2_escRESERVED_19:\n          case cf2_escRESERVED_25:\n          case cf2_escRESERVED_31:\n          case cf2_escRESERVED_32:\n          case cf2_escRESERVED_33:\n          default:\n            FT_TRACE4(( \" unknown op (12, %d)\\n\", op2 ));\n\n          }; /* end of switch statement checking `op2' */\n\n        } /* case cf2_cmdESC */\n        break;\n\n      case cf2_cmdENDCHAR:\n        FT_TRACE4(( \" endchar\\n\" ));\n\n        if ( cf2_stack_count( opStack ) == 1 ||\n             cf2_stack_count( opStack ) == 5 )\n        {\n          if ( !haveWidth )\n            *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;\n        }\n\n        haveWidth = TRUE;\n\n        /* close path if still open */\n        cf2_glyphpath_closeOpenPath( &glyphPath );\n\n        if ( cf2_stack_count( opStack ) > 1 )\n        {\n          /* must be either 4 or 5 --                       */\n          /* this is a (deprecated) implied `seac' operator */\n\n          CF2_UInt       achar;\n          CF2_UInt       bchar;\n          CF2_BufferRec  component;\n          CF2_Fixed      dummyWidth;   /* ignore component width */\n          FT_Error       error2;\n\n\n          if ( doingSeac )\n          {\n            lastError = FT_THROW( Invalid_Glyph_Format );\n            goto exit;      /* nested seac */\n          }\n\n          achar = cf2_stack_popInt( opStack );\n          bchar = cf2_stack_popInt( opStack );\n\n          curY = cf2_stack_popFixed( opStack );\n          curX = cf2_stack_popFixed( opStack );\n\n          error2 = cf2_getSeacComponent( decoder, achar, &component );\n          if ( error2 )\n          {\n             lastError = error2;      /* pass FreeType error through */\n             goto exit;\n          }\n          cf2_interpT2CharString( font,\n                                  &component,\n                                  callbacks,\n                                  translation,\n                                  TRUE,\n                                  curX,\n                                  curY,\n                                  &dummyWidth );\n          cf2_freeSeacComponent( decoder, &component );\n\n          error2 = cf2_getSeacComponent( decoder, bchar, &component );\n          if ( error2 )\n          {\n            lastError = error2;      /* pass FreeType error through */\n            goto exit;\n          }\n          cf2_interpT2CharString( font,\n                                  &component,\n                                  callbacks,\n                                  translation,\n                                  TRUE,\n                                  0,\n                                  0,\n                                  &dummyWidth );\n          cf2_freeSeacComponent( decoder, &component );\n        }\n        goto exit;\n\n      case cf2_cmdCNTRMASK:\n      case cf2_cmdHINTMASK:\n        /* the final \\n in the tracing message gets added in      */\n        /* `cf2_hintmask_read' (which also traces the mask bytes) */\n        FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? \" cntrmask\" : \" hintmask\" ));\n\n        /* if there are arguments on the stack, there this is an */\n        /* implied cf2_cmdVSTEMHM                                */\n        if ( cf2_stack_count( opStack ) != 0 )\n        {\n          /* never add hints after the mask is computed */\n          if ( cf2_hintmask_isValid( &hintMask ) )\n            FT_TRACE4(( \"cf2_interpT2CharString: invalid hint mask\\n\" ));\n        }\n\n        cf2_doStems( font,\n                     opStack,\n                     &vStemHintArray,\n                     width,\n                     &haveWidth,\n                     0 );\n\n        if ( op1 == cf2_cmdHINTMASK )\n        {\n          /* consume the hint mask bytes which follow the operator */\n          cf2_hintmask_read( &hintMask,\n                             charstring,\n                             cf2_arrstack_size( &hStemHintArray ) +\n                               cf2_arrstack_size( &vStemHintArray ) );\n        }\n        else\n        {\n          /*\n           * Consume the counter mask bytes which follow the operator:\n           * Build a temporary hint map, just to place and lock those\n           * stems participating in the counter mask.  These are most\n           * likely the dominant hstems, and are grouped together in a\n           * few counter groups, not necessarily in correspondence\n           * with the hint groups.  This reduces the chances of\n           * conflicts between hstems that are initially placed in\n           * separate hint groups and then brought together.  The\n           * positions are copied back to `hStemHintArray', so we can\n           * discard `counterMask' and `counterHintMap'.\n           *\n           */\n          CF2_HintMapRec   counterHintMap;\n          CF2_HintMaskRec  counterMask;\n\n\n          cf2_hintmap_init( &counterHintMap,\n                            font,\n                            &glyphPath.initialHintMap,\n                            &glyphPath.hintMoves,\n                            scaleY );\n          cf2_hintmask_init( &counterMask, error );\n\n          cf2_hintmask_read( &counterMask,\n                             charstring,\n                             cf2_arrstack_size( &hStemHintArray ) +\n                               cf2_arrstack_size( &vStemHintArray ) );\n          cf2_hintmap_build( &counterHintMap,\n                             &hStemHintArray,\n                             &vStemHintArray,\n                             &counterMask,\n                             0,\n                             FALSE );\n        }\n        break;\n\n      case cf2_cmdRMOVETO:\n        FT_TRACE4(( \" rmoveto\\n\" ));\n\n        curY += cf2_stack_popFixed( opStack );\n        curX += cf2_stack_popFixed( opStack );\n\n        cf2_glyphpath_moveTo( &glyphPath, curX, curY );\n\n        if ( cf2_stack_count( opStack ) > 0 && !haveWidth )\n          *width = cf2_stack_popFixed( opStack ) + nominalWidthX;\n\n        haveWidth = TRUE;\n        break;\n\n      case cf2_cmdHMOVETO:\n        FT_TRACE4(( \" hmoveto\\n\" ));\n\n        curX += cf2_stack_popFixed( opStack );\n\n        cf2_glyphpath_moveTo( &glyphPath, curX, curY );\n\n        if ( cf2_stack_count( opStack ) > 0 && !haveWidth )\n          *width = cf2_stack_popFixed( opStack ) + nominalWidthX;\n\n        haveWidth = TRUE;\n        break;\n\n      case cf2_cmdRLINECURVE:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n\n          FT_TRACE4(( \" rlinecurve\\n\" ));\n\n          while ( index + 6 < count )\n          {\n            curX += cf2_stack_getReal( opStack, index + 0 );\n            curY += cf2_stack_getReal( opStack, index + 1 );\n\n            cf2_glyphpath_lineTo( &glyphPath, curX, curY );\n            index += 2;\n          }\n\n          while ( index < count )\n          {\n            CF2_Fixed  x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;\n            CF2_Fixed  y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;\n            CF2_Fixed  x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;\n            CF2_Fixed  y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;\n            CF2_Fixed  x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;\n            CF2_Fixed  y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;\n\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\n            curX   = x3;\n            curY   = y3;\n            index += 6;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdVVCURVETO:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n\n          FT_TRACE4(( \" vvcurveto\\n\" ));\n\n          while ( index < count )\n          {\n            CF2_Fixed  x1, y1, x2, y2, x3, y3;\n\n\n            if ( ( count - index ) & 1 )\n            {\n              x1 = cf2_stack_getReal( opStack, index ) + curX;\n\n              ++index;\n            }\n            else\n              x1 = curX;\n\n            y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;\n            x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;\n            y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;\n            x3 = x2;\n            y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\n            curX   = x3;\n            curY   = y3;\n            index += 4;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdHHCURVETO:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n\n          FT_TRACE4(( \" hhcurveto\\n\" ));\n\n          while ( index < count )\n          {\n            CF2_Fixed  x1, y1, x2, y2, x3, y3;\n\n\n            if ( ( count - index ) & 1 )\n            {\n              y1 = cf2_stack_getReal( opStack, index ) + curY;\n\n              ++index;\n            }\n            else\n              y1 = curY;\n\n            x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;\n            x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;\n            y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;\n            x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;\n            y3 = y2;\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\n            curX   = x3;\n            curY   = y3;\n            index += 4;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue; /* no need to clear stack again */\n\n      case cf2_cmdVHCURVETO:\n      case cf2_cmdHVCURVETO:\n        {\n          CF2_UInt  count = cf2_stack_count( opStack );\n          CF2_UInt  index = 0;\n\n          FT_Bool  alternate = op1 == cf2_cmdHVCURVETO;\n\n\n          FT_TRACE4(( alternate ? \" hvcurveto\\n\" : \" vhcurveto\\n\" ));\n\n          while ( index < count )\n          {\n            CF2_Fixed x1, x2, x3, y1, y2, y3;\n\n\n            if ( alternate )\n            {\n              x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;\n              y1 = curY;\n              x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;\n              y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;\n              y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;\n\n              if ( count - index == 5 )\n              {\n                x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;\n\n                ++index;\n              }\n              else\n                x3 = x2;\n\n              alternate = FALSE;\n            }\n            else\n            {\n              x1 = curX;\n              y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;\n              x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;\n              y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;\n              x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;\n\n              if ( count - index == 5 )\n              {\n                y3 = cf2_stack_getReal( opStack, index + 4 ) + y2;\n\n                ++index;\n              }\n              else\n                y3 = y2;\n\n              alternate = TRUE;\n            }\n\n            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );\n\n            curX   = x3;\n            curY   = y3;\n            index += 4;\n          }\n\n          cf2_stack_clear( opStack );\n        }\n        continue;     /* no need to clear stack again */\n\n      case cf2_cmdEXTENDEDNMBR:\n        {\n          CF2_Int  v;\n\n\n          v = (FT_Short)( ( cf2_buf_readByte( charstring ) << 8 ) |\n                            cf2_buf_readByte( charstring )        );\n\n          FT_TRACE4(( \" %d\", v ));\n\n          cf2_stack_pushInt( opStack, v );\n        }\n        continue;\n\n      default:\n        /* numbers */\n        {\n          if ( /* op1 >= 32 && */ op1 <= 246 )\n          {\n            CF2_Int  v;\n\n\n            v = op1 - 139;\n\n            FT_TRACE4(( \" %d\", v ));\n\n            /* -107 .. 107 */\n            cf2_stack_pushInt( opStack, v );\n          }\n\n          else if ( /* op1 >= 247 && */ op1 <= 250 )\n          {\n            CF2_Int  v;\n\n\n            v  = op1;\n            v -= 247;\n            v *= 256;\n            v += cf2_buf_readByte( charstring );\n            v += 108;\n\n            FT_TRACE4(( \" %d\", v ));\n\n            /* 108 .. 1131 */\n            cf2_stack_pushInt( opStack, v );\n          }\n\n          else if ( /* op1 >= 251 && */ op1 <= 254 )\n          {\n            CF2_Int  v;\n\n\n            v  = op1;\n            v -= 251;\n            v *= 256;\n            v += cf2_buf_readByte( charstring );\n            v  = -v - 108;\n\n            FT_TRACE4(( \" %d\", v ));\n\n            /* -1131 .. -108 */\n            cf2_stack_pushInt( opStack, v );\n          }\n\n          else /* op1 == 255 */\n          {\n            CF2_Fixed  v;\n\n\n            v = (CF2_Fixed)\n                  ( ( (FT_UInt32)cf2_buf_readByte( charstring ) << 24 ) |\n                    ( (FT_UInt32)cf2_buf_readByte( charstring ) << 16 ) |\n                    ( (FT_UInt32)cf2_buf_readByte( charstring ) <<  8 ) |\n                      (FT_UInt32)cf2_buf_readByte( charstring )         );\n\n            FT_TRACE4(( \" %.2f\", v / 65536.0 ));\n\n            cf2_stack_pushFixed( opStack, v );\n          }\n        }\n        continue;   /* don't clear stack */\n\n      } /* end of switch statement checking `op1' */\n\n      cf2_stack_clear( opStack );\n\n    } /* end of main interpreter loop */\n\n    /* we get here if the charstring ends without cf2_cmdENDCHAR */\n    FT_TRACE4(( \"cf2_interpT2CharString:\"\n                \"  charstring ends without ENDCHAR\\n\" ));\n\n  exit:\n    /* check whether last error seen is also the first one */\n    cf2_setError( error, lastError );\n\n    /* free resources from objects we've used */\n    cf2_glyphpath_finalize( &glyphPath );\n    cf2_arrstack_finalize( &vStemHintArray );\n    cf2_arrstack_finalize( &hStemHintArray );\n    cf2_arrstack_finalize( &subrStack );\n    cf2_stack_free( opStack );\n\n    FT_TRACE4(( \"\\n\" ));\n\n    return;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2intrp.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2font.h                                                              */\n/*                                                                         */\n/*    Adobe's CFF Interpreter (specification).                             */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2INTRP_H__\n#define __CF2INTRP_H__\n\n\n#include \"cf2ft.h\"\n#include \"cf2hints.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  cf2_hintmask_init( CF2_HintMask  hintmask,\n                     FT_Error*     error );\n  FT_LOCAL( FT_Bool )\n  cf2_hintmask_isValid( const CF2_HintMask  hintmask );\n  FT_LOCAL( FT_Bool )\n  cf2_hintmask_isNew( const CF2_HintMask  hintmask );\n  FT_LOCAL( void )\n  cf2_hintmask_setNew( CF2_HintMask  hintmask,\n                       FT_Bool       val );\n  FT_LOCAL( FT_Byte* )\n  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask );\n  FT_LOCAL( void )\n  cf2_hintmask_setAll( CF2_HintMask  hintmask,\n                       size_t        bitCount );\n\n  FT_LOCAL( void )\n  cf2_interpT2CharString( CF2_Font              font,\n                          CF2_Buffer            charstring,\n                          CF2_OutlineCallbacks  callbacks,\n                          const FT_Vector*      translation,\n                          FT_Bool               doingSeac,\n                          CF2_Fixed             curX,\n                          CF2_Fixed             curY,\n                          CF2_Fixed*            width );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2INTRP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2read.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2read.c                                                              */\n/*                                                                         */\n/*    Adobe's code for stream handling (body).                             */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include FT_INTERNAL_DEBUG_H\n\n#include \"cf2glue.h\"\n\n#include \"cf2error.h\"\n\n\n  /* Define CF2_IO_FAIL as 1 to enable random errors and random */\n  /* value errors in I/O.                                       */\n#define CF2_IO_FAIL  0\n\n\n#if CF2_IO_FAIL\n\n  /* set the .00 value to a nonzero probability */\n  static int\n  randomError2( void )\n  {\n    /* for region buffer ReadByte (interp) function */\n    return (double)rand() / RAND_MAX < .00;\n  }\n\n  /* set the .00 value to a nonzero probability */\n  static CF2_Int\n  randomValue()\n  {\n    return (double)rand() / RAND_MAX < .00 ? rand() : 0;\n  }\n\n#endif /* CF2_IO_FAIL */\n\n\n  /* Region Buffer                                      */\n  /*                                                    */\n  /* Can be constructed from a copied buffer managed by */\n  /* `FCM_getDatablock'.                                */\n  /* Reads bytes with check for end of buffer.          */\n\n  /* reading past the end of the buffer sets error and returns zero */\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_buf_readByte( CF2_Buffer  buf )\n  {\n    if ( buf->ptr < buf->end )\n    {\n#if CF2_IO_FAIL\n      if ( randomError2() )\n      {\n        CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );\n        return 0;\n      }\n\n      return *(buf->ptr)++ + randomValue();\n#else\n      return *(buf->ptr)++;\n#endif\n    }\n    else\n    {\n      CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );\n      return 0;\n    }\n  }\n\n\n  /* note: end condition can occur without error */\n  FT_LOCAL_DEF( FT_Bool )\n  cf2_buf_isEnd( CF2_Buffer  buf )\n  {\n    return buf->ptr >= buf->end;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2read.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2read.h                                                              */\n/*                                                                         */\n/*    Adobe's code for stream handling (specification).                    */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2READ_H__\n#define __CF2READ_H__\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct  CF2_BufferRec_\n  {\n    FT_Error*       error;\n    const FT_Byte*  start;\n    const FT_Byte*  end;\n    const FT_Byte*  ptr;\n\n  } CF2_BufferRec, *CF2_Buffer;\n\n\n  FT_LOCAL( CF2_Int )\n  cf2_buf_readByte( CF2_Buffer  buf );\n  FT_LOCAL( FT_Bool )\n  cf2_buf_isEnd( CF2_Buffer  buf );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2READ_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2stack.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2stack.c                                                             */\n/*                                                                         */\n/*    Adobe's code for emulating a CFF stack (body).                       */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"cf2ft.h\"\n#include FT_INTERNAL_DEBUG_H\n\n#include \"cf2glue.h\"\n#include \"cf2font.h\"\n#include \"cf2stack.h\"\n\n#include \"cf2error.h\"\n\n\n  /* Allocate and initialize an instance of CF2_Stack.       */\n  /* Note: This function returns NULL on error (does not set */\n  /* `error').                                               */\n  FT_LOCAL_DEF( CF2_Stack )\n  cf2_stack_init( FT_Memory  memory,\n                  FT_Error*  e )\n  {\n    FT_Error  error = FT_Err_Ok;     /* for FT_QNEW */\n\n    CF2_Stack  stack = NULL;\n\n\n    if ( !FT_QNEW( stack ) )\n    {\n      /* initialize the structure; FT_QNEW zeroes it */\n      stack->memory = memory;\n      stack->error  = e;\n      stack->top    = &stack->buffer[0]; /* empty stack */\n    }\n\n    return stack;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_stack_free( CF2_Stack  stack )\n  {\n    if ( stack )\n    {\n      FT_Memory  memory = stack->memory;\n\n\n      /* free the main structure */\n      FT_FREE( stack );\n    }\n  }\n\n\n  FT_LOCAL_DEF( CF2_UInt )\n  cf2_stack_count( CF2_Stack  stack )\n  {\n    return (CF2_UInt)( stack->top - &stack->buffer[0] );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_stack_pushInt( CF2_Stack  stack,\n                     CF2_Int    val )\n  {\n    if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Overflow );\n      return;     /* stack overflow */\n    }\n\n    stack->top->u.i  = val;\n    stack->top->type = CF2_NumberInt;\n    ++stack->top;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_stack_pushFixed( CF2_Stack  stack,\n                       CF2_Fixed  val )\n  {\n    if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Overflow );\n      return;     /* stack overflow */\n    }\n\n    stack->top->u.r  = val;\n    stack->top->type = CF2_NumberFixed;\n    ++stack->top;\n  }\n\n\n  /* this function is only allowed to pop an integer type */\n  FT_LOCAL_DEF( CF2_Int )\n  cf2_stack_popInt( CF2_Stack  stack )\n  {\n    if ( stack->top == &stack->buffer[0] )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Underflow );\n      return 0;   /* underflow */\n    }\n    if ( stack->top[-1].type != CF2_NumberInt )\n    {\n      CF2_SET_ERROR( stack->error, Syntax_Error );\n      return 0;   /* type mismatch */\n    }\n\n    --stack->top;\n\n    return stack->top->u.i;\n  }\n\n\n  /* Note: type mismatch is silently cast */\n  /* TODO: check this */\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_stack_popFixed( CF2_Stack  stack )\n  {\n    if ( stack->top == &stack->buffer[0] )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Underflow );\n      return cf2_intToFixed( 0 );    /* underflow */\n    }\n\n    --stack->top;\n\n    switch ( stack->top->type )\n    {\n    case CF2_NumberInt:\n      return cf2_intToFixed( stack->top->u.i );\n    case CF2_NumberFrac:\n      return cf2_fracToFixed( stack->top->u.f );\n    default:\n      return stack->top->u.r;\n    }\n  }\n\n\n  /* Note: type mismatch is silently cast */\n  /* TODO: check this */\n  FT_LOCAL_DEF( CF2_Fixed )\n  cf2_stack_getReal( CF2_Stack  stack,\n                     CF2_UInt   idx )\n  {\n    FT_ASSERT( cf2_stack_count( stack ) <= CF2_OPERAND_STACK_SIZE );\n\n    if ( idx >= cf2_stack_count( stack ) )\n    {\n      CF2_SET_ERROR( stack->error, Stack_Overflow );\n      return cf2_intToFixed( 0 );    /* bounds error */\n    }\n\n    switch ( stack->buffer[idx].type )\n    {\n    case CF2_NumberInt:\n      return cf2_intToFixed( stack->buffer[idx].u.i );\n    case CF2_NumberFrac:\n      return cf2_fracToFixed( stack->buffer[idx].u.f );\n    default:\n      return stack->buffer[idx].u.r;\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cf2_stack_clear( CF2_Stack  stack )\n  {\n    stack->top = &stack->buffer[0];\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2stack.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2stack.h                                                             */\n/*                                                                         */\n/*    Adobe's code for emulating a CFF stack (specification).              */\n/*                                                                         */\n/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2STACK_H__\n#define __CF2STACK_H__\n\n\nFT_BEGIN_HEADER\n\n\n  /* CFF operand stack; specified maximum of 48 or 192 values */\n  typedef struct  CF2_StackNumber_\n  {\n    union\n    {\n      CF2_Fixed  r;      /* 16.16 fixed point */\n      CF2_Frac   f;      /* 2.30 fixed point (for font matrix) */\n      CF2_Int    i;\n    } u;\n\n    CF2_NumberType  type;\n\n  } CF2_StackNumber;\n\n\n  typedef struct  CF2_StackRec_\n  {\n    FT_Memory         memory;\n    FT_Error*         error;\n    CF2_StackNumber   buffer[CF2_OPERAND_STACK_SIZE];\n    CF2_StackNumber*  top;\n\n  } CF2_StackRec, *CF2_Stack;\n\n\n  FT_LOCAL( CF2_Stack )\n  cf2_stack_init( FT_Memory  memory,\n                  FT_Error*  error );\n  FT_LOCAL( void )\n  cf2_stack_free( CF2_Stack  stack );\n\n  FT_LOCAL( CF2_UInt )\n  cf2_stack_count( CF2_Stack  stack );\n\n  FT_LOCAL( void )\n  cf2_stack_pushInt( CF2_Stack  stack,\n                     CF2_Int    val );\n  FT_LOCAL( void )\n  cf2_stack_pushFixed( CF2_Stack  stack,\n                       CF2_Fixed  val );\n\n  FT_LOCAL( CF2_Int )\n  cf2_stack_popInt( CF2_Stack  stack );\n  FT_LOCAL( CF2_Fixed )\n  cf2_stack_popFixed( CF2_Stack  stack );\n\n  FT_LOCAL( CF2_Fixed )\n  cf2_stack_getReal( CF2_Stack  stack,\n                     CF2_UInt   idx );\n\n  FT_LOCAL( void )\n  cf2_stack_clear( CF2_Stack  stack );\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2STACK_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cf2types.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cf2types.h                                                             */\n/*                                                                         */\n/*    Adobe's code for defining data types (specification only).           */\n/*                                                                         */\n/*  Copyright 2011-2013 Adobe Systems Incorporated.                        */\n/*                                                                         */\n/*  This software, and all works of authorship, whether in source or       */\n/*  object code form as indicated by the copyright notice(s) included      */\n/*  herein (collectively, the \"Work\") is made available, and may only be   */\n/*  used, modified, and distributed under the FreeType Project License,    */\n/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */\n/*  FreeType Project License, each contributor to the Work hereby grants   */\n/*  to any individual or legal entity exercising permissions granted by    */\n/*  the FreeType Project License and this section (hereafter, \"You\" or     */\n/*  \"Your\") a perpetual, worldwide, non-exclusive, no-charge,              */\n/*  royalty-free, irrevocable (except as stated in this section) patent    */\n/*  license to make, have made, use, offer to sell, sell, import, and      */\n/*  otherwise transfer the Work, where such license applies only to those  */\n/*  patent claims licensable by such contributor that are necessarily      */\n/*  infringed by their contribution(s) alone or by combination of their    */\n/*  contribution(s) with the Work to which such contribution(s) was        */\n/*  submitted.  If You institute patent litigation against any entity      */\n/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */\n/*  the Work or a contribution incorporated within the Work constitutes    */\n/*  direct or contributory patent infringement, then any patent licenses   */\n/*  granted to You under this License for that Work shall terminate as of  */\n/*  the date such litigation is filed.                                     */\n/*                                                                         */\n/*  By using, modifying, or distributing the Work you indicate that you    */\n/*  have read and understood the terms and conditions of the               */\n/*  FreeType Project License as well as those provided in this section,    */\n/*  and you accept them fully.                                             */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CF2TYPES_H__\n#define __CF2TYPES_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*\n   * The data models that we expect to support are as follows:\n   *\n   *   name  char short int long long-long pointer example\n   *  -----------------------------------------------------\n   *   ILP32  8    16    32  32     64*      32    32-bit MacOS, x86\n   *   LLP64  8    16    32  32     64       64    x64\n   *   LP64   8    16    32  64     64       64    64-bit MacOS\n   *\n   *    *) type may be supported by emulation on a 32-bit architecture\n   *\n   */\n\n\n  /* integers at least 32 bits wide */\n#define CF2_UInt  FT_UFast\n#define CF2_Int   FT_Fast\n\n\n  /* fixed-float numbers */\n  typedef FT_Int32  CF2_F16Dot16;\n\n\nFT_END_HEADER\n\n\n#endif /* __CF2TYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cff.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cff.c                                                                  */\n/*                                                                         */\n/*    FreeType OpenType driver component (body only).                      */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n\n#include \"cffpic.c\"\n#include \"cffdrivr.c\"\n#include \"cffparse.c\"\n#include \"cffload.c\"\n#include \"cffobjs.c\"\n#include \"cffgload.c\"\n#include \"cffcmap.c\"\n\n#include \"cf2arrst.c\"\n#include \"cf2blues.c\"\n#include \"cf2error.c\"\n#include \"cf2font.c\"\n#include \"cf2ft.c\"\n#include \"cf2hints.c\"\n#include \"cf2intrp.c\"\n#include \"cf2read.c\"\n#include \"cf2stack.c\"\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffcmap.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffcmap.c                                                              */\n/*                                                                         */\n/*    CFF character mapping table (cmap) support (body).                   */\n/*                                                                         */\n/*  Copyright 2002-2007, 2010, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include \"cffcmap.h\"\n#include \"cffload.h\"\n\n#include \"cfferrs.h\"\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****           CFF STANDARD (AND EXPERT) ENCODING CMAPS            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( FT_Error )\n  cff_cmap_encoding_init( CFF_CMapStd  cmap )\n  {\n    TT_Face       face     = (TT_Face)FT_CMAP_FACE( cmap );\n    CFF_Font      cff      = (CFF_Font)face->extra.data;\n    CFF_Encoding  encoding = &cff->encoding;\n\n\n    cmap->gids  = encoding->codes;\n\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  cff_cmap_encoding_done( CFF_CMapStd  cmap )\n  {\n    cmap->gids  = NULL;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  cff_cmap_encoding_char_index( CFF_CMapStd  cmap,\n                                FT_UInt32    char_code )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( char_code < 256 )\n      result = cmap->gids[char_code];\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  cff_cmap_encoding_char_next( CFF_CMapStd   cmap,\n                               FT_UInt32    *pchar_code )\n  {\n    FT_UInt    result    = 0;\n    FT_UInt32  char_code = *pchar_code;\n\n\n    *pchar_code = 0;\n\n    if ( char_code < 255 )\n    {\n      FT_UInt  code = (FT_UInt)(char_code + 1);\n\n\n      for (;;)\n      {\n        if ( code >= 256 )\n          break;\n\n        result = cmap->gids[code];\n        if ( result != 0 )\n        {\n          *pchar_code = code;\n          break;\n        }\n\n        code++;\n      }\n    }\n    return result;\n  }\n\n\n  FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,\n    sizeof ( CFF_CMapStdRec ),\n\n    (FT_CMap_InitFunc)     cff_cmap_encoding_init,\n    (FT_CMap_DoneFunc)     cff_cmap_encoding_done,\n    (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,\n    (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****              CFF SYNTHETIC UNICODE ENCODING CMAP              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( const char* )\n  cff_sid_to_glyph_name( TT_Face  face,\n                         FT_UInt  idx )\n  {\n    CFF_Font     cff     = (CFF_Font)face->extra.data;\n    CFF_Charset  charset = &cff->charset;\n    FT_UInt      sid     = charset->sids[idx];\n\n\n    return cff_index_get_sid_string( cff, sid );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  cff_cmap_unicode_init( PS_Unicodes  unicodes )\n  {\n    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );\n    FT_Memory           memory  = FT_FACE_MEMORY( face );\n    CFF_Font            cff     = (CFF_Font)face->extra.data;\n    CFF_Charset         charset = &cff->charset;\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;\n\n\n    /* can't build Unicode map for CID-keyed font */\n    /* because we don't know glyph names.         */\n    if ( !charset->sids )\n      return FT_THROW( No_Unicode_Glyph_Name );\n\n    return psnames->unicodes_init( memory,\n                                   unicodes,\n                                   cff->num_glyphs,\n                                   (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,\n                                   (PS_FreeGlyphNameFunc)NULL,\n                                   (FT_Pointer)face );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  cff_cmap_unicode_done( PS_Unicodes  unicodes )\n  {\n    FT_Face    face   = FT_CMAP_FACE( unicodes );\n    FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n    FT_FREE( unicodes->maps );\n    unicodes->num_maps = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  cff_cmap_unicode_char_index( PS_Unicodes  unicodes,\n                               FT_UInt32    char_code )\n  {\n    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );\n    CFF_Font            cff     = (CFF_Font)face->extra.data;\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;\n\n\n    return psnames->unicodes_char_index( unicodes, char_code );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  cff_cmap_unicode_char_next( PS_Unicodes  unicodes,\n                              FT_UInt32   *pchar_code )\n  {\n    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );\n    CFF_Font            cff     = (CFF_Font)face->extra.data;\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;\n\n\n    return psnames->unicodes_char_next( unicodes, pchar_code );\n  }\n\n\n  FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,\n    sizeof ( PS_UnicodesRec ),\n\n    (FT_CMap_InitFunc)     cff_cmap_unicode_init,\n    (FT_CMap_DoneFunc)     cff_cmap_unicode_done,\n    (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,\n    (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  )\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffcmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffcmap.h                                                              */\n/*                                                                         */\n/*    CFF character mapping table (cmap) support (specification).          */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFCMAP_H__\n#define __CFFCMAP_H__\n\n#include \"cffobjs.h\"\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* standard (and expert) encoding cmaps */\n  typedef struct CFF_CMapStdRec_*  CFF_CMapStd;\n\n  typedef struct  CFF_CMapStdRec_\n  {\n    FT_CMapRec  cmap;\n    FT_UShort*  gids;   /* up to 256 elements */\n\n  } CFF_CMapStdRec;\n\n\n  FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec)\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               CFF SYNTHETIC UNICODE ENCODING CMAP             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* unicode (synthetic) cmaps */\n\n  FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec)\n\n\nFT_END_HEADER\n\n#endif /* __CFFCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffdrivr.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffdrivr.c                                                             */\n/*                                                                         */\n/*    OpenType font driver implementation (body).                          */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_SFNT_H\n#include FT_SERVICE_CID_H\n#include FT_SERVICE_POSTSCRIPT_INFO_H\n#include FT_SERVICE_POSTSCRIPT_NAME_H\n#include FT_SERVICE_TT_CMAP_H\n\n#include \"cffdrivr.h\"\n#include \"cffgload.h\"\n#include \"cffload.h\"\n#include \"cffcmap.h\"\n#include \"cffparse.h\"\n\n#include \"cfferrs.h\"\n#include \"cffpic.h\"\n\n#include FT_SERVICE_XFREE86_NAME_H\n#include FT_SERVICE_GLYPH_DICT_H\n#include FT_SERVICE_PROPERTIES_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffdriver\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                          F A C E S                              ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#undef  PAIR_TAG\n#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \\\n                                     (FT_ULong)right        )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_get_kerning                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to return the kerning vector between two      */\n  /*    glyphs of the same face.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the source face object.                 */\n  /*                                                                       */\n  /*    left_glyph  :: The index of the left glyph in the kern pair.       */\n  /*                                                                       */\n  /*    right_glyph :: The index of the right glyph in the kern pair.      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    kerning     :: The kerning vector.  This is in font units for      */\n  /*                   scalable formats, and in pixels for fixed-sizes     */\n  /*                   formats.                                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only horizontal layouts (left-to-right & right-to-left) are        */\n  /*    supported by this function.  Other layouts, or more sophisticated  */\n  /*    kernings, are out of scope of this method (the basic driver        */\n  /*    interface is meant to be simple).                                  */\n  /*                                                                       */\n  /*    They can be implemented by format-specific interfaces.             */\n  /*                                                                       */\n  FT_CALLBACK_DEF( FT_Error )\n  cff_get_kerning( FT_Face     ttface,          /* TT_Face */\n                   FT_UInt     left_glyph,\n                   FT_UInt     right_glyph,\n                   FT_Vector*  kerning )\n  {\n    TT_Face       face = (TT_Face)ttface;\n    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;\n\n\n    kerning->x = 0;\n    kerning->y = 0;\n\n    if ( sfnt )\n      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );\n\n    return FT_Err_Ok;\n  }\n\n\n#undef PAIR_TAG\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_glyph_load                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to load a glyph within a given glyph slot.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot        :: A handle to the target slot object where the glyph  */\n  /*                   will be loaded.                                     */\n  /*                                                                       */\n  /*    size        :: A handle to the source face size at which the glyph */\n  /*                   must be scaled, loaded, etc.                        */\n  /*                                                                       */\n  /*    glyph_index :: The index of the glyph in the font file.            */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   FT_LOAD_??? constants can be used to control the    */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_CALLBACK_DEF( FT_Error )\n  cff_glyph_load( FT_GlyphSlot  cffslot,      /* CFF_GlyphSlot */\n                  FT_Size       cffsize,      /* CFF_Size      */\n                  FT_UInt       glyph_index,\n                  FT_Int32      load_flags )\n  {\n    FT_Error       error;\n    CFF_GlyphSlot  slot = (CFF_GlyphSlot)cffslot;\n    CFF_Size       size = (CFF_Size)cffsize;\n\n\n    if ( !slot )\n      return FT_THROW( Invalid_Slot_Handle );\n\n    /* check whether we want a scaled outline or bitmap */\n    if ( !size )\n      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;\n\n    /* reset the size object if necessary */\n    if ( load_flags & FT_LOAD_NO_SCALE )\n      size = NULL;\n\n    if ( size )\n    {\n      /* these two objects must have the same parent */\n      if ( cffsize->face != cffslot->face )\n        return FT_THROW( Invalid_Face_Handle );\n    }\n\n    /* now load the glyph outline if necessary */\n    error = cff_slot_load( slot, size, glyph_index, load_flags );\n\n    /* force drop-out mode to 2 - irrelevant now */\n    /* slot->outline.dropout_mode = 2; */\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  cff_get_advances( FT_Face    face,\n                    FT_UInt    start,\n                    FT_UInt    count,\n                    FT_Int32   flags,\n                    FT_Fixed*  advances )\n  {\n    FT_UInt       nn;\n    FT_Error      error = FT_Err_Ok;\n    FT_GlyphSlot  slot  = face->glyph;\n\n\n    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;\n\n    for ( nn = 0; nn < count; nn++ )\n    {\n      error = cff_glyph_load( slot, face->size, start + nn, flags );\n      if ( error )\n        break;\n\n      advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )\n                     ? slot->linearVertAdvance\n                     : slot->linearHoriAdvance;\n    }\n\n    return error;\n  }\n\n\n  /*\n   *  GLYPH DICT SERVICE\n   *\n   */\n\n  static FT_Error\n  cff_get_glyph_name( CFF_Face    face,\n                      FT_UInt     glyph_index,\n                      FT_Pointer  buffer,\n                      FT_UInt     buffer_max )\n  {\n    CFF_Font    font   = (CFF_Font)face->extra.data;\n    FT_String*  gname;\n    FT_UShort   sid;\n    FT_Error    error;\n\n\n    if ( !font->psnames )\n    {\n      FT_ERROR(( \"cff_get_glyph_name:\"\n                 \" cannot get glyph name from CFF & CEF fonts\\n\"\n                 \"                   \"\n                 \" without the `PSNames' module\\n\" ));\n      error = FT_THROW( Missing_Module );\n      goto Exit;\n    }\n\n    /* first, locate the sid in the charset table */\n    sid = font->charset.sids[glyph_index];\n\n    /* now, lookup the name itself */\n    gname = cff_index_get_sid_string( font, sid );\n\n    if ( gname )\n      FT_STRCPYN( buffer, gname, buffer_max );\n\n    error = FT_Err_Ok;\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_UInt\n  cff_get_name_index( CFF_Face    face,\n                      FT_String*  glyph_name )\n  {\n    CFF_Font            cff;\n    CFF_Charset         charset;\n    FT_Service_PsCMaps  psnames;\n    FT_String*          name;\n    FT_UShort           sid;\n    FT_UInt             i;\n\n\n    cff     = (CFF_FontRec *)face->extra.data;\n    charset = &cff->charset;\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );\n    if ( !psnames )\n      return 0;\n\n    for ( i = 0; i < cff->num_glyphs; i++ )\n    {\n      sid = charset->sids[i];\n\n      if ( sid > 390 )\n        name = cff_index_get_string( cff, sid - 391 );\n      else\n        name = (FT_String *)psnames->adobe_std_strings( sid );\n\n      if ( !name )\n        continue;\n\n      if ( !ft_strcmp( glyph_name, name ) )\n        return i;\n    }\n\n    return 0;\n  }\n\n\n  FT_DEFINE_SERVICE_GLYPHDICTREC(\n    cff_service_glyph_dict,\n    (FT_GlyphDict_GetNameFunc)  cff_get_glyph_name,\n    (FT_GlyphDict_NameIndexFunc)cff_get_name_index\n  )\n\n\n  /*\n   *  POSTSCRIPT INFO SERVICE\n   *\n   */\n\n  static FT_Int\n  cff_ps_has_glyph_names( FT_Face  face )\n  {\n    return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;\n  }\n\n\n  static FT_Error\n  cff_ps_get_font_info( CFF_Face         face,\n                        PS_FontInfoRec*  afont_info )\n  {\n    CFF_Font  cff   = (CFF_Font)face->extra.data;\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( cff && cff->font_info == NULL )\n    {\n      CFF_FontRecDict  dict   = &cff->top_font.font_dict;\n      PS_FontInfoRec  *font_info = NULL;\n      FT_Memory        memory = face->root.memory;\n\n\n      if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) )\n        goto Fail;\n\n      font_info->version     = cff_index_get_sid_string( cff,\n                                                         dict->version );\n      font_info->notice      = cff_index_get_sid_string( cff,\n                                                         dict->notice );\n      font_info->full_name   = cff_index_get_sid_string( cff,\n                                                         dict->full_name );\n      font_info->family_name = cff_index_get_sid_string( cff,\n                                                         dict->family_name );\n      font_info->weight      = cff_index_get_sid_string( cff,\n                                                         dict->weight );\n      font_info->italic_angle        = dict->italic_angle;\n      font_info->is_fixed_pitch      = dict->is_fixed_pitch;\n      font_info->underline_position  = (FT_Short)dict->underline_position;\n      font_info->underline_thickness = (FT_Short)dict->underline_thickness;\n\n      cff->font_info = font_info;\n    }\n\n    if ( cff )\n      *afont_info = *cff->font_info;\n\n  Fail:\n    return error;\n  }\n\n\n  FT_DEFINE_SERVICE_PSINFOREC(\n    cff_service_ps_info,\n    (PS_GetFontInfoFunc)   cff_ps_get_font_info,\n    (PS_GetFontExtraFunc)  NULL,\n    (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,\n    (PS_GetFontPrivateFunc)NULL,        /* unsupported with CFF fonts */\n    (PS_GetFontValueFunc)  NULL         /* not implemented            */\n  )\n\n\n  /*\n   *  POSTSCRIPT NAME SERVICE\n   *\n   */\n\n  static const char*\n  cff_get_ps_name( CFF_Face  face )\n  {\n    CFF_Font  cff = (CFF_Font)face->extra.data;\n\n\n    return (const char*)cff->font_name;\n  }\n\n\n  FT_DEFINE_SERVICE_PSFONTNAMEREC(\n    cff_service_ps_name,\n    (FT_PsName_GetFunc)cff_get_ps_name\n  )\n\n\n  /*\n   * TT CMAP INFO\n   *\n   * If the charmap is a synthetic Unicode encoding cmap or\n   * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO\n   * service defined in SFNT module.\n   *\n   * Otherwise call the service function in the sfnt module.\n   *\n   */\n  static FT_Error\n  cff_get_cmap_info( FT_CharMap    charmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_CMap   cmap  = FT_CMAP( charmap );\n    FT_Error  error = FT_Err_Ok;\n\n    FT_Face     face    = FT_CMAP_FACE( cmap );\n    FT_Library  library = FT_FACE_LIBRARY( face );\n\n\n    cmap_info->language = 0;\n    cmap_info->format   = 0;\n\n    if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET &&\n         cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET  )\n    {\n      FT_Module           sfnt    = FT_Get_Module( library, \"sfnt\" );\n      FT_Service_TTCMaps  service =\n        (FT_Service_TTCMaps)ft_module_get_service( sfnt,\n                                                   FT_SERVICE_ID_TT_CMAP );\n\n\n      if ( service && service->get_cmap_info )\n        error = service->get_cmap_info( charmap, cmap_info );\n    }\n\n    return error;\n  }\n\n\n  FT_DEFINE_SERVICE_TTCMAPSREC(\n    cff_service_get_cmap_info,\n    (TT_CMap_Info_GetFunc)cff_get_cmap_info\n  )\n\n\n  /*\n   *  CID INFO SERVICE\n   *\n   */\n  static FT_Error\n  cff_get_ros( CFF_Face      face,\n               const char*  *registry,\n               const char*  *ordering,\n               FT_Int       *supplement )\n  {\n    FT_Error  error = FT_Err_Ok;\n    CFF_Font  cff   = (CFF_Font)face->extra.data;\n\n\n    if ( cff )\n    {\n      CFF_FontRecDict  dict = &cff->top_font.font_dict;\n\n\n      if ( dict->cid_registry == 0xFFFFU )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n\n      if ( registry )\n      {\n        if ( cff->registry == NULL )\n          cff->registry = cff_index_get_sid_string( cff,\n                                                    dict->cid_registry );\n        *registry = cff->registry;\n      }\n\n      if ( ordering )\n      {\n        if ( cff->ordering == NULL )\n          cff->ordering = cff_index_get_sid_string( cff,\n                                                    dict->cid_ordering );\n        *ordering = cff->ordering;\n      }\n\n      /*\n       * XXX: According to Adobe TechNote #5176, the supplement in CFF\n       *      can be a real number. We truncate it to fit public API\n       *      since freetype-2.3.6.\n       */\n      if ( supplement )\n      {\n        if ( dict->cid_supplement < FT_INT_MIN ||\n             dict->cid_supplement > FT_INT_MAX )\n          FT_TRACE1(( \"cff_get_ros: too large supplement %d is truncated\\n\",\n                      dict->cid_supplement ));\n        *supplement = (FT_Int)dict->cid_supplement;\n      }\n    }\n\n  Fail:\n    return error;\n  }\n\n\n  static FT_Error\n  cff_get_is_cid( CFF_Face  face,\n                  FT_Bool  *is_cid )\n  {\n    FT_Error  error = FT_Err_Ok;\n    CFF_Font  cff   = (CFF_Font)face->extra.data;\n\n\n    *is_cid = 0;\n\n    if ( cff )\n    {\n      CFF_FontRecDict  dict = &cff->top_font.font_dict;\n\n\n      if ( dict->cid_registry != 0xFFFFU )\n        *is_cid = 1;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  cff_get_cid_from_glyph_index( CFF_Face  face,\n                                FT_UInt   glyph_index,\n                                FT_UInt  *cid )\n  {\n    FT_Error  error = FT_Err_Ok;\n    CFF_Font  cff;\n\n\n    cff = (CFF_Font)face->extra.data;\n\n    if ( cff )\n    {\n      FT_UInt          c;\n      CFF_FontRecDict  dict = &cff->top_font.font_dict;\n\n\n      if ( dict->cid_registry == 0xFFFFU )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n\n      if ( glyph_index > cff->num_glyphs )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n\n      c = cff->charset.sids[glyph_index];\n\n      if ( cid )\n        *cid = c;\n    }\n\n  Fail:\n    return error;\n  }\n\n\n  FT_DEFINE_SERVICE_CIDREC(\n    cff_service_cid_info,\n    (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros,\n    (FT_CID_GetIsInternallyCIDKeyedFunc)      cff_get_is_cid,\n    (FT_CID_GetCIDFromGlyphIndexFunc)         cff_get_cid_from_glyph_index\n  )\n\n\n  /*\n   *  PROPERTY SERVICE\n   *\n   */\n  static FT_Error\n  cff_property_set( FT_Module    module,         /* CFF_Driver */\n                    const char*  property_name,\n                    const void*  value )\n  {\n    FT_Error    error  = FT_Err_Ok;\n    CFF_Driver  driver = (CFF_Driver)module;\n\n\n    if ( !ft_strcmp( property_name, \"hinting-engine\" ) )\n    {\n      FT_UInt*  hinting_engine = (FT_UInt*)value;\n\n\n      driver->hinting_engine = *hinting_engine;\n\n      return error;\n    }\n    else if ( !ft_strcmp( property_name, \"no-stem-darkening\" ) )\n    {\n      FT_Bool*  no_stem_darkening = (FT_Bool*)value;\n\n\n      driver->no_stem_darkening = *no_stem_darkening;\n\n      return error;\n    }\n\n    FT_TRACE0(( \"cff_property_set: missing property `%s'\\n\",\n                property_name ));\n    return FT_THROW( Missing_Property );\n  }\n\n\n  static FT_Error\n  cff_property_get( FT_Module    module,         /* CFF_Driver */\n                    const char*  property_name,\n                    const void*  value )\n  {\n    FT_Error    error  = FT_Err_Ok;\n    CFF_Driver  driver = (CFF_Driver)module;\n\n    FT_UInt  hinting_engine    = driver->hinting_engine;\n    FT_Bool  no_stem_darkening = driver->no_stem_darkening;\n\n\n    if ( !ft_strcmp( property_name, \"hinting-engine\" ) )\n    {\n      FT_UInt*  val = (FT_UInt*)value;\n\n\n      *val = hinting_engine;\n\n      return error;\n    }\n    else if ( !ft_strcmp( property_name, \"no-stem-darkening\" ) )\n    {\n      FT_Bool*  val = (FT_Bool*)value;\n\n\n      *val = no_stem_darkening;\n\n      return error;\n    }\n\n    FT_TRACE0(( \"cff_property_get: missing property `%s'\\n\",\n                property_name ));\n    return FT_THROW( Missing_Property );\n  }\n\n\n  FT_DEFINE_SERVICE_PROPERTIESREC(\n    cff_service_properties,\n    (FT_Properties_SetFunc)cff_property_set,\n    (FT_Properties_GetFunc)cff_property_get )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                D R I V E R  I N T E R F A C E                   ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES\n  FT_DEFINE_SERVICEDESCREC7(\n    cff_services,\n    FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CFF,\n    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_GLYPH_DICT,           &CFF_SERVICE_GLYPH_DICT_GET,\n    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,\n    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,\n    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET\n  )\n#else\n  FT_DEFINE_SERVICEDESCREC6(\n    cff_services,\n    FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CFF,\n    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,\n    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,\n    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET\n  )\n#endif\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  cff_get_interface( FT_Module    driver,       /* CFF_Driver */\n                     const char*  module_interface )\n  {\n    FT_Library           library;\n    FT_Module            sfnt;\n    FT_Module_Interface  result;\n\n\n    /* CFF_SERVICES_GET derefers `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    if ( !driver )\n      return NULL;\n    library = driver->library;\n    if ( !library )\n      return NULL;\n#endif\n\n    result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface );\n    if ( result != NULL )\n      return result;\n\n    /* `driver' is not yet evaluated in non-PIC mode */\n#ifndef FT_CONFIG_OPTION_PIC\n    if ( !driver )\n      return NULL;\n    library = driver->library;\n    if ( !library )\n      return NULL;\n#endif\n\n    /* we pass our request to the `sfnt' module */\n    sfnt = FT_Get_Module( library, \"sfnt\" );\n\n    return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;\n  }\n\n\n  /* The FT_DriverInterface structure is defined in ftdriver.h. */\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#define CFF_SIZE_SELECT cff_size_select\n#else\n#define CFF_SIZE_SELECT 0\n#endif\n\n  FT_DEFINE_DRIVER(\n    cff_driver_class,\n\n      FT_MODULE_FONT_DRIVER       |\n      FT_MODULE_DRIVER_SCALABLE   |\n      FT_MODULE_DRIVER_HAS_HINTER,\n\n      sizeof ( CFF_DriverRec ),\n      \"cff\",\n      0x10000L,\n      0x20000L,\n\n      0,   /* module-specific interface */\n\n      cff_driver_init,\n      cff_driver_done,\n      cff_get_interface,\n\n    /* now the specific driver fields */\n    sizeof ( TT_FaceRec ),\n    sizeof ( CFF_SizeRec ),\n    sizeof ( CFF_GlyphSlotRec ),\n\n    cff_face_init,\n    cff_face_done,\n    cff_size_init,\n    cff_size_done,\n    cff_slot_init,\n    cff_slot_done,\n\n    ft_stub_set_char_sizes,  /* FT_CONFIG_OPTION_OLD_INTERNALS */\n    ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    cff_glyph_load,\n\n    cff_get_kerning,\n    0,                       /* FT_Face_AttachFunc */\n    cff_get_advances,\n\n    cff_size_request,\n\n    CFF_SIZE_SELECT\n  )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffdrivr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffdrivr.h                                                             */\n/*                                                                         */\n/*    High-level OpenType driver interface (specification).                */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFDRIVER_H__\n#define __CFFDRIVER_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_DRIVER( cff_driver_class )\n\n\nFT_END_HEADER\n\n#endif /* __CFFDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cfferrs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cfferrs.h                                                              */\n/*                                                                         */\n/*    CFF error codes (specification only).                                */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the CFF error enumeration constants.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __CFFERRS_H__\n#define __CFFERRS_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  CFF_Err_\n#define FT_ERR_BASE    FT_Mod_Err_CFF\n\n\n#include FT_ERRORS_H\n\n#endif /* __CFFERRS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffgload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffgload.c                                                             */\n/*                                                                         */\n/*    OpenType Glyph Loader (body).                                        */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_SFNT_H\n#include FT_OUTLINE_H\n#include FT_CFF_DRIVER_H\n\n#include \"cffobjs.h\"\n#include \"cffload.h\"\n#include \"cffgload.h\"\n#include \"cf2ft.h\"      /* for cf2_decoder_parse_charstrings */\n\n#include \"cfferrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffgload\n\n\n  typedef enum  CFF_Operator_\n  {\n    cff_op_unknown = 0,\n\n    cff_op_rmoveto,\n    cff_op_hmoveto,\n    cff_op_vmoveto,\n\n    cff_op_rlineto,\n    cff_op_hlineto,\n    cff_op_vlineto,\n\n    cff_op_rrcurveto,\n    cff_op_hhcurveto,\n    cff_op_hvcurveto,\n    cff_op_rcurveline,\n    cff_op_rlinecurve,\n    cff_op_vhcurveto,\n    cff_op_vvcurveto,\n\n    cff_op_flex,\n    cff_op_hflex,\n    cff_op_hflex1,\n    cff_op_flex1,\n\n    cff_op_endchar,\n\n    cff_op_hstem,\n    cff_op_vstem,\n    cff_op_hstemhm,\n    cff_op_vstemhm,\n\n    cff_op_hintmask,\n    cff_op_cntrmask,\n    cff_op_dotsection,  /* deprecated, acts as no-op */\n\n    cff_op_abs,\n    cff_op_add,\n    cff_op_sub,\n    cff_op_div,\n    cff_op_neg,\n    cff_op_random,\n    cff_op_mul,\n    cff_op_sqrt,\n\n    cff_op_blend,\n\n    cff_op_drop,\n    cff_op_exch,\n    cff_op_index,\n    cff_op_roll,\n    cff_op_dup,\n\n    cff_op_put,\n    cff_op_get,\n    cff_op_store,\n    cff_op_load,\n\n    cff_op_and,\n    cff_op_or,\n    cff_op_not,\n    cff_op_eq,\n    cff_op_ifelse,\n\n    cff_op_callsubr,\n    cff_op_callgsubr,\n    cff_op_return,\n\n    /* Type 1 opcodes: invalid but seen in real life */\n    cff_op_hsbw,\n    cff_op_closepath,\n    cff_op_callothersubr,\n    cff_op_pop,\n    cff_op_seac,\n    cff_op_sbw,\n    cff_op_setcurrentpoint,\n\n    /* do not remove */\n    cff_op_max\n\n  } CFF_Operator;\n\n\n#define CFF_COUNT_CHECK_WIDTH  0x80\n#define CFF_COUNT_EXACT        0x40\n#define CFF_COUNT_CLEAR_STACK  0x20\n\n  /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are  */\n  /* used for checking the width and requested numbers of arguments    */\n  /* only; they are set to zero afterwards                             */\n\n  /* the other two flags are informative only and unused currently     */\n\n  static const FT_Byte  cff_argument_counts[] =\n  {\n    0,  /* unknown */\n\n    2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */\n    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,\n    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,\n\n    0 | CFF_COUNT_CLEAR_STACK, /* rlineto */\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n\n    0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n    0 | CFF_COUNT_CLEAR_STACK,\n\n    13, /* flex */\n    7,\n    9,\n    11,\n\n    0 | CFF_COUNT_CHECK_WIDTH, /* endchar */\n\n    2 | CFF_COUNT_CHECK_WIDTH, /* hstem */\n    2 | CFF_COUNT_CHECK_WIDTH,\n    2 | CFF_COUNT_CHECK_WIDTH,\n    2 | CFF_COUNT_CHECK_WIDTH,\n\n    0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */\n    0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */\n    0, /* dotsection */\n\n    1, /* abs */\n    2,\n    2,\n    2,\n    1,\n    0,\n    2,\n    1,\n\n    1, /* blend */\n\n    1, /* drop */\n    2,\n    1,\n    2,\n    1,\n\n    2, /* put */\n    1,\n    4,\n    3,\n\n    2, /* and */\n    2,\n    1,\n    2,\n    4,\n\n    1, /* callsubr */\n    1,\n    0,\n\n    2, /* hsbw */\n    0,\n    0,\n    0,\n    5, /* seac */\n    4, /* sbw */\n    2  /* setcurrentpoint */\n  };\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /**********                                                      *********/\n  /**********                                                      *********/\n  /**********             GENERIC CHARSTRING PARSING               *********/\n  /**********                                                      *********/\n  /**********                                                      *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_builder_init                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given glyph builder.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    builder :: A pointer to the glyph builder to initialize.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: The current face object.                                */\n  /*                                                                       */\n  /*    size    :: The current size object.                                */\n  /*                                                                       */\n  /*    glyph   :: The current glyph object.                               */\n  /*                                                                       */\n  /*    hinting :: Whether hinting is active.                              */\n  /*                                                                       */\n  static void\n  cff_builder_init( CFF_Builder*   builder,\n                    TT_Face        face,\n                    CFF_Size       size,\n                    CFF_GlyphSlot  glyph,\n                    FT_Bool        hinting )\n  {\n    builder->path_begun  = 0;\n    builder->load_points = 1;\n\n    builder->face   = face;\n    builder->glyph  = glyph;\n    builder->memory = face->root.memory;\n\n    if ( glyph )\n    {\n      FT_GlyphLoader  loader = glyph->root.internal->loader;\n\n\n      builder->loader  = loader;\n      builder->base    = &loader->base.outline;\n      builder->current = &loader->current.outline;\n      FT_GlyphLoader_Rewind( loader );\n\n      builder->hints_globals = 0;\n      builder->hints_funcs   = 0;\n\n      if ( hinting && size )\n      {\n        CFF_Internal  internal = (CFF_Internal)size->root.internal;\n\n\n        builder->hints_globals = (void *)internal->topfont;\n        builder->hints_funcs   = glyph->root.internal->glyph_hints;\n      }\n    }\n\n    builder->pos_x = 0;\n    builder->pos_y = 0;\n\n    builder->left_bearing.x = 0;\n    builder->left_bearing.y = 0;\n    builder->advance.x      = 0;\n    builder->advance.y      = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_builder_done                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given glyph builder.  Its contents can still be used   */\n  /*    after the call, but the function saves important information       */\n  /*    within the corresponding glyph slot.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    builder :: A pointer to the glyph builder to finalize.             */\n  /*                                                                       */\n  static void\n  cff_builder_done( CFF_Builder*  builder )\n  {\n    CFF_GlyphSlot  glyph = builder->glyph;\n\n\n    if ( glyph )\n      glyph->root.outline = *builder->base;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_compute_bias                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the bias value in dependence of the number of glyph       */\n  /*    subroutines.                                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    in_charstring_type :: The `CharstringType' value of the top DICT   */\n  /*                          dictionary.                                  */\n  /*                                                                       */\n  /*    num_subrs          :: The number of glyph subroutines.             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The bias value.                                                    */\n  static FT_Int\n  cff_compute_bias( FT_Int   in_charstring_type,\n                    FT_UInt  num_subrs )\n  {\n    FT_Int  result;\n\n\n    if ( in_charstring_type == 1 )\n      result = 0;\n    else if ( num_subrs < 1240 )\n      result = 107;\n    else if ( num_subrs < 33900U )\n      result = 1131;\n    else\n      result = 32768U;\n\n    return result;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_decoder_init                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given glyph decoder.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    decoder :: A pointer to the glyph builder to initialize.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face      :: The current face object.                              */\n  /*                                                                       */\n  /*    size      :: The current size object.                              */\n  /*                                                                       */\n  /*    slot      :: The current glyph object.                             */\n  /*                                                                       */\n  /*    hinting   :: Whether hinting is active.                            */\n  /*                                                                       */\n  /*    hint_mode :: The hinting mode.                                     */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  cff_decoder_init( CFF_Decoder*    decoder,\n                    TT_Face         face,\n                    CFF_Size        size,\n                    CFF_GlyphSlot   slot,\n                    FT_Bool         hinting,\n                    FT_Render_Mode  hint_mode )\n  {\n    CFF_Font  cff = (CFF_Font)face->extra.data;\n\n\n    /* clear everything */\n    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );\n\n    /* initialize builder */\n    cff_builder_init( &decoder->builder, face, size, slot, hinting );\n\n    /* initialize Type2 decoder */\n    decoder->cff          = cff;\n    decoder->num_globals  = cff->global_subrs_index.count;\n    decoder->globals      = cff->global_subrs;\n    decoder->globals_bias = cff_compute_bias(\n                              cff->top_font.font_dict.charstring_type,\n                              decoder->num_globals );\n\n    decoder->hint_mode    = hint_mode;\n  }\n\n\n  /* this function is used to select the subfont */\n  /* and the locals subrs array                  */\n  FT_LOCAL_DEF( FT_Error )\n  cff_decoder_prepare( CFF_Decoder*  decoder,\n                       CFF_Size      size,\n                       FT_UInt       glyph_index )\n  {\n    CFF_Builder  *builder = &decoder->builder;\n    CFF_Font      cff     = (CFF_Font)builder->face->extra.data;\n    CFF_SubFont   sub     = &cff->top_font;\n    FT_Error      error   = FT_Err_Ok;\n\n\n    /* manage CID fonts */\n    if ( cff->num_subfonts )\n    {\n      FT_Byte  fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );\n\n\n      if ( fd_index >= cff->num_subfonts )\n      {\n        FT_TRACE4(( \"cff_decoder_prepare: invalid CID subfont index\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      FT_TRACE3(( \"glyph index %d (subfont %d):\\n\", glyph_index, fd_index ));\n\n      sub = cff->subfonts[fd_index];\n\n      if ( builder->hints_funcs && size )\n      {\n        CFF_Internal  internal = (CFF_Internal)size->root.internal;\n\n\n        /* for CFFs without subfonts, this value has already been set */\n        builder->hints_globals = (void *)internal->subfonts[fd_index];\n      }\n    }\n#ifdef FT_DEBUG_LEVEL_TRACE\n    else\n      FT_TRACE3(( \"glyph index %d:\\n\", glyph_index ));\n#endif\n\n    decoder->num_locals    = sub->local_subrs_index.count;\n    decoder->locals        = sub->local_subrs;\n    decoder->locals_bias   = cff_compute_bias(\n                               decoder->cff->top_font.font_dict.charstring_type,\n                               decoder->num_locals );\n\n    decoder->glyph_width   = sub->private_dict.default_width;\n    decoder->nominal_width = sub->private_dict.nominal_width;\n\n    decoder->current_subfont = sub;     /* for Adobe's CFF handler */\n\n  Exit:\n    return error;\n  }\n\n\n  /* check that there is enough space for `count' more points */\n  FT_LOCAL_DEF( FT_Error )\n  cff_check_points( CFF_Builder*  builder,\n                    FT_Int        count )\n  {\n    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );\n  }\n\n\n  /* add a new point, do not check space */\n  FT_LOCAL_DEF( void )\n  cff_builder_add_point( CFF_Builder*  builder,\n                         FT_Pos        x,\n                         FT_Pos        y,\n                         FT_Byte       flag )\n  {\n    FT_Outline*  outline = builder->current;\n\n\n    if ( builder->load_points )\n    {\n      CFF_Driver  driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );\n\n      FT_Vector*  point   = outline->points + outline->n_points;\n      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;\n\n\n      if ( driver->hinting_engine == FT_CFF_HINTING_ADOBE )\n      {\n        /* cf2_decoder_parse_charstrings uses 16.16 coordinates */\n        point->x = x >> 10;\n        point->y = y >> 10;\n      }\n      else\n      {\n        point->x = x >> 16;\n        point->y = y >> 16;\n      }\n      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );\n    }\n\n    outline->n_points++;\n  }\n\n\n  /* check space for a new on-curve point, then add it */\n  FT_LOCAL_DEF( FT_Error )\n  cff_builder_add_point1( CFF_Builder*  builder,\n                          FT_Pos        x,\n                          FT_Pos        y )\n  {\n    FT_Error  error;\n\n\n    error = cff_check_points( builder, 1 );\n    if ( !error )\n      cff_builder_add_point( builder, x, y, 1 );\n\n    return error;\n  }\n\n\n  /* check space for a new contour, then add it */\n  static FT_Error\n  cff_builder_add_contour( CFF_Builder*  builder )\n  {\n    FT_Outline*  outline = builder->current;\n    FT_Error     error;\n\n\n    if ( !builder->load_points )\n    {\n      outline->n_contours++;\n      return FT_Err_Ok;\n    }\n\n    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );\n    if ( !error )\n    {\n      if ( outline->n_contours > 0 )\n        outline->contours[outline->n_contours - 1] =\n          (short)( outline->n_points - 1 );\n\n      outline->n_contours++;\n    }\n\n    return error;\n  }\n\n\n  /* if a path was begun, add its first on-curve point */\n  FT_LOCAL_DEF( FT_Error )\n  cff_builder_start_point( CFF_Builder*  builder,\n                           FT_Pos        x,\n                           FT_Pos        y )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* test whether we are building a new contour */\n    if ( !builder->path_begun )\n    {\n      builder->path_begun = 1;\n      error = cff_builder_add_contour( builder );\n      if ( !error )\n        error = cff_builder_add_point1( builder, x, y );\n    }\n\n    return error;\n  }\n\n\n  /* close the current contour */\n  FT_LOCAL_DEF( void )\n  cff_builder_close_contour( CFF_Builder*  builder )\n  {\n    FT_Outline*  outline = builder->current;\n    FT_Int       first;\n\n\n    if ( !outline )\n      return;\n\n    first = outline->n_contours <= 1\n            ? 0 : outline->contours[outline->n_contours - 2] + 1;\n\n    /* We must not include the last point in the path if it */\n    /* is located on the first point.                       */\n    if ( outline->n_points > 1 )\n    {\n      FT_Vector*  p1      = outline->points + first;\n      FT_Vector*  p2      = outline->points + outline->n_points - 1;\n      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;\n\n\n      /* `delete' last point only if it coincides with the first    */\n      /* point and if it is not a control point (which can happen). */\n      if ( p1->x == p2->x && p1->y == p2->y )\n        if ( *control == FT_CURVE_TAG_ON )\n          outline->n_points--;\n    }\n\n    if ( outline->n_contours > 0 )\n    {\n      /* Don't add contours only consisting of one point, i.e., */\n      /* check whether begin point and last point are the same. */\n      if ( first == outline->n_points - 1 )\n      {\n        outline->n_contours--;\n        outline->n_points--;\n      }\n      else\n        outline->contours[outline->n_contours - 1] =\n          (short)( outline->n_points - 1 );\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Int )\n  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,\n                                   FT_Int    charcode )\n  {\n    FT_UInt    n;\n    FT_UShort  glyph_sid;\n\n\n    /* CID-keyed fonts don't have glyph names */\n    if ( !cff->charset.sids )\n      return -1;\n\n    /* check range of standard char code */\n    if ( charcode < 0 || charcode > 255 )\n      return -1;\n\n    /* Get code to SID mapping from `cff_standard_encoding'. */\n    glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );\n\n    for ( n = 0; n < cff->num_glyphs; n++ )\n    {\n      if ( cff->charset.sids[n] == glyph_sid )\n        return n;\n    }\n\n    return -1;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_get_glyph_data( TT_Face    face,\n                      FT_UInt    glyph_index,\n                      FT_Byte**  pointer,\n                      FT_ULong*  length )\n  {\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    /* For incremental fonts get the character data using the */\n    /* callback function.                                     */\n    if ( face->root.internal->incremental_interface )\n    {\n      FT_Data   data;\n      FT_Error  error =\n                  face->root.internal->incremental_interface->funcs->get_glyph_data(\n                    face->root.internal->incremental_interface->object,\n                    glyph_index, &data );\n\n\n      *pointer = (FT_Byte*)data.pointer;\n      *length = data.length;\n\n      return error;\n    }\n    else\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    {\n      CFF_Font  cff  = (CFF_Font)(face->extra.data);\n\n\n      return cff_index_access_element( &cff->charstrings_index, glyph_index,\n                                       pointer, length );\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_free_glyph_data( TT_Face    face,\n                       FT_Byte**  pointer,\n                       FT_ULong   length )\n  {\n#ifndef FT_CONFIG_OPTION_INCREMENTAL\n    FT_UNUSED( length );\n#endif\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    /* For incremental fonts get the character data using the */\n    /* callback function.                                     */\n    if ( face->root.internal->incremental_interface )\n    {\n      FT_Data data;\n\n\n      data.pointer = *pointer;\n      data.length  = length;\n\n      face->root.internal->incremental_interface->funcs->free_glyph_data(\n        face->root.internal->incremental_interface->object, &data );\n    }\n    else\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    {\n      CFF_Font  cff = (CFF_Font)(face->extra.data);\n\n\n      cff_index_forget_element( &cff->charstrings_index, pointer );\n    }\n  }\n\n\n  static FT_Error\n  cff_operator_seac( CFF_Decoder*  decoder,\n                     FT_Pos        asb,\n                     FT_Pos        adx,\n                     FT_Pos        ady,\n                     FT_Int        bchar,\n                     FT_Int        achar )\n  {\n    FT_Error      error;\n    CFF_Builder*  builder = &decoder->builder;\n    FT_Int        bchar_index, achar_index;\n    TT_Face       face = decoder->builder.face;\n    FT_Vector     left_bearing, advance;\n    FT_Byte*      charstring;\n    FT_ULong      charstring_len;\n    FT_Pos        glyph_width;\n\n\n    if ( decoder->seac )\n    {\n      FT_ERROR(( \"cff_operator_seac: invalid nested seac\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    adx += decoder->builder.left_bearing.x;\n    ady += decoder->builder.left_bearing.y;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    /* Incremental fonts don't necessarily have valid charsets.        */\n    /* They use the character code, not the glyph index, in this case. */\n    if ( face->root.internal->incremental_interface )\n    {\n      bchar_index = bchar;\n      achar_index = achar;\n    }\n    else\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n    {\n      CFF_Font cff = (CFF_Font)(face->extra.data);\n\n\n      bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );\n      achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );\n    }\n\n    if ( bchar_index < 0 || achar_index < 0 )\n    {\n      FT_ERROR(( \"cff_operator_seac:\"\n                 \" invalid seac character code arguments\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    /* If we are trying to load a composite glyph, do not load the */\n    /* accent character and return the array of subglyphs.         */\n    if ( builder->no_recurse )\n    {\n      FT_GlyphSlot    glyph  = (FT_GlyphSlot)builder->glyph;\n      FT_GlyphLoader  loader = glyph->internal->loader;\n      FT_SubGlyph     subg;\n\n\n      /* reallocate subglyph array if necessary */\n      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );\n      if ( error )\n        goto Exit;\n\n      subg = loader->current.subglyphs;\n\n      /* subglyph 0 = base character */\n      subg->index = bchar_index;\n      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |\n                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;\n      subg->arg1  = 0;\n      subg->arg2  = 0;\n      subg++;\n\n      /* subglyph 1 = accent character */\n      subg->index = achar_index;\n      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;\n      subg->arg1  = (FT_Int)( adx >> 16 );\n      subg->arg2  = (FT_Int)( ady >> 16 );\n\n      /* set up remaining glyph fields */\n      glyph->num_subglyphs = 2;\n      glyph->subglyphs     = loader->base.subglyphs;\n      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;\n\n      loader->current.num_subglyphs = 2;\n    }\n\n    FT_GlyphLoader_Prepare( builder->loader );\n\n    /* First load `bchar' in builder */\n    error = cff_get_glyph_data( face, bchar_index,\n                                &charstring, &charstring_len );\n    if ( !error )\n    {\n      /* the seac operator must not be nested */\n      decoder->seac = TRUE;\n      error = cff_decoder_parse_charstrings( decoder, charstring,\n                                             charstring_len );\n      decoder->seac = FALSE;\n\n      cff_free_glyph_data( face, &charstring, charstring_len );\n\n      if ( error )\n        goto Exit;\n    }\n\n    /* Save the left bearing, advance and glyph width of the base */\n    /* character as they will be erased by the next load.         */\n\n    left_bearing = builder->left_bearing;\n    advance      = builder->advance;\n    glyph_width  = decoder->glyph_width;\n\n    builder->left_bearing.x = 0;\n    builder->left_bearing.y = 0;\n\n    builder->pos_x = adx - asb;\n    builder->pos_y = ady;\n\n    /* Now load `achar' on top of the base outline. */\n    error = cff_get_glyph_data( face, achar_index,\n                                &charstring, &charstring_len );\n    if ( !error )\n    {\n      /* the seac operator must not be nested */\n      decoder->seac = TRUE;\n      error = cff_decoder_parse_charstrings( decoder, charstring,\n                                             charstring_len );\n      decoder->seac = FALSE;\n\n      cff_free_glyph_data( face, &charstring, charstring_len );\n\n      if ( error )\n        goto Exit;\n    }\n\n    /* Restore the left side bearing, advance and glyph width */\n    /* of the base character.                                 */\n    builder->left_bearing = left_bearing;\n    builder->advance      = advance;\n    decoder->glyph_width  = glyph_width;\n\n    builder->pos_x = 0;\n    builder->pos_y = 0;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cff_decoder_parse_charstrings                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parses a given Type 2 charstrings program.                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    decoder         :: The current Type 1 decoder.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    charstring_base :: The base of the charstring stream.              */\n  /*                                                                       */\n  /*    charstring_len  :: The length in bytes of the charstring stream.   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,\n                                 FT_Byte*      charstring_base,\n                                 FT_ULong      charstring_len )\n  {\n    FT_Error           error;\n    CFF_Decoder_Zone*  zone;\n    FT_Byte*           ip;\n    FT_Byte*           limit;\n    CFF_Builder*       builder = &decoder->builder;\n    FT_Pos             x, y;\n    FT_Fixed           seed;\n    FT_Fixed*          stack;\n    FT_Int             charstring_type =\n                         decoder->cff->top_font.font_dict.charstring_type;\n\n    T2_Hints_Funcs     hinter;\n\n\n    /* set default width */\n    decoder->num_hints  = 0;\n    decoder->read_width = 1;\n\n    /* compute random seed from stack address of parameter */\n    seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed              ^\n                         (FT_PtrDist)(char*)&decoder           ^\n                         (FT_PtrDist)(char*)&charstring_base ) &\n                         FT_ULONG_MAX ) ;\n    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;\n    if ( seed == 0 )\n      seed = 0x7384;\n\n    /* initialize the decoder */\n    decoder->top  = decoder->stack;\n    decoder->zone = decoder->zones;\n    zone          = decoder->zones;\n    stack         = decoder->top;\n\n    hinter = (T2_Hints_Funcs)builder->hints_funcs;\n\n    builder->path_begun = 0;\n\n    zone->base           = charstring_base;\n    limit = zone->limit  = charstring_base + charstring_len;\n    ip    = zone->cursor = zone->base;\n\n    error = FT_Err_Ok;\n\n    x = builder->pos_x;\n    y = builder->pos_y;\n\n    /* begin hints recording session, if any */\n    if ( hinter )\n      hinter->open( hinter->hints );\n\n    /* now execute loop */\n    while ( ip < limit )\n    {\n      CFF_Operator  op;\n      FT_Byte       v;\n\n\n      /********************************************************************/\n      /*                                                                  */\n      /* Decode operator or operand                                       */\n      /*                                                                  */\n      v = *ip++;\n      if ( v >= 32 || v == 28 )\n      {\n        FT_Int    shift = 16;\n        FT_Int32  val;\n\n\n        /* this is an operand, push it on the stack */\n\n        /* if we use shifts, all computations are done with unsigned */\n        /* values; the conversion to a signed value is the last step */\n        if ( v == 28 )\n        {\n          if ( ip + 1 >= limit )\n            goto Syntax_Error;\n          val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] );\n          ip += 2;\n        }\n        else if ( v < 247 )\n          val = (FT_Int32)v - 139;\n        else if ( v < 251 )\n        {\n          if ( ip >= limit )\n            goto Syntax_Error;\n          val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;\n        }\n        else if ( v < 255 )\n        {\n          if ( ip >= limit )\n            goto Syntax_Error;\n          val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;\n        }\n        else\n        {\n          if ( ip + 3 >= limit )\n            goto Syntax_Error;\n          val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |\n                            ( (FT_UInt32)ip[1] << 16 ) |\n                            ( (FT_UInt32)ip[2] <<  8 ) |\n                              (FT_UInt32)ip[3]         );\n          ip    += 4;\n          if ( charstring_type == 2 )\n            shift = 0;\n        }\n        if ( decoder->top - stack >= CFF_MAX_OPERANDS )\n          goto Stack_Overflow;\n\n        val             = (FT_Int32)( (FT_UInt32)val << shift );\n        *decoder->top++ = val;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        if ( !( val & 0xFFFFL ) )\n          FT_TRACE4(( \" %hd\", (FT_Short)( (FT_UInt32)val >> 16 ) ));\n        else\n          FT_TRACE4(( \" %.2f\", val / 65536.0 ));\n#endif\n\n      }\n      else\n      {\n        /* The specification says that normally arguments are to be taken */\n        /* from the bottom of the stack.  However, this seems not to be   */\n        /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */\n        /* arguments similar to a PS interpreter.                         */\n\n        FT_Fixed*  args     = decoder->top;\n        FT_Int     num_args = (FT_Int)( args - decoder->stack );\n        FT_Int     req_args;\n\n\n        /* find operator */\n        op = cff_op_unknown;\n\n        switch ( v )\n        {\n        case 1:\n          op = cff_op_hstem;\n          break;\n        case 3:\n          op = cff_op_vstem;\n          break;\n        case 4:\n          op = cff_op_vmoveto;\n          break;\n        case 5:\n          op = cff_op_rlineto;\n          break;\n        case 6:\n          op = cff_op_hlineto;\n          break;\n        case 7:\n          op = cff_op_vlineto;\n          break;\n        case 8:\n          op = cff_op_rrcurveto;\n          break;\n        case 9:\n          op = cff_op_closepath;\n          break;\n        case 10:\n          op = cff_op_callsubr;\n          break;\n        case 11:\n          op = cff_op_return;\n          break;\n        case 12:\n          {\n            if ( ip >= limit )\n              goto Syntax_Error;\n            v = *ip++;\n\n            switch ( v )\n            {\n            case 0:\n              op = cff_op_dotsection;\n              break;\n            case 1: /* this is actually the Type1 vstem3 operator */\n              op = cff_op_vstem;\n              break;\n            case 2: /* this is actually the Type1 hstem3 operator */\n              op = cff_op_hstem;\n              break;\n            case 3:\n              op = cff_op_and;\n              break;\n            case 4:\n              op = cff_op_or;\n              break;\n            case 5:\n              op = cff_op_not;\n              break;\n            case 6:\n              op = cff_op_seac;\n              break;\n            case 7:\n              op = cff_op_sbw;\n              break;\n            case 8:\n              op = cff_op_store;\n              break;\n            case 9:\n              op = cff_op_abs;\n              break;\n            case 10:\n              op = cff_op_add;\n              break;\n            case 11:\n              op = cff_op_sub;\n              break;\n            case 12:\n              op = cff_op_div;\n              break;\n            case 13:\n              op = cff_op_load;\n              break;\n            case 14:\n              op = cff_op_neg;\n              break;\n            case 15:\n              op = cff_op_eq;\n              break;\n            case 16:\n              op = cff_op_callothersubr;\n              break;\n            case 17:\n              op = cff_op_pop;\n              break;\n            case 18:\n              op = cff_op_drop;\n              break;\n            case 20:\n              op = cff_op_put;\n              break;\n            case 21:\n              op = cff_op_get;\n              break;\n            case 22:\n              op = cff_op_ifelse;\n              break;\n            case 23:\n              op = cff_op_random;\n              break;\n            case 24:\n              op = cff_op_mul;\n              break;\n            case 26:\n              op = cff_op_sqrt;\n              break;\n            case 27:\n              op = cff_op_dup;\n              break;\n            case 28:\n              op = cff_op_exch;\n              break;\n            case 29:\n              op = cff_op_index;\n              break;\n            case 30:\n              op = cff_op_roll;\n              break;\n            case 33:\n              op = cff_op_setcurrentpoint;\n              break;\n            case 34:\n              op = cff_op_hflex;\n              break;\n            case 35:\n              op = cff_op_flex;\n              break;\n            case 36:\n              op = cff_op_hflex1;\n              break;\n            case 37:\n              op = cff_op_flex1;\n              break;\n            default:\n              FT_TRACE4(( \" unknown op (12, %d)\\n\", v ));\n              break;\n            }\n          }\n          break;\n        case 13:\n          op = cff_op_hsbw;\n          break;\n        case 14:\n          op = cff_op_endchar;\n          break;\n        case 16:\n          op = cff_op_blend;\n          break;\n        case 18:\n          op = cff_op_hstemhm;\n          break;\n        case 19:\n          op = cff_op_hintmask;\n          break;\n        case 20:\n          op = cff_op_cntrmask;\n          break;\n        case 21:\n          op = cff_op_rmoveto;\n          break;\n        case 22:\n          op = cff_op_hmoveto;\n          break;\n        case 23:\n          op = cff_op_vstemhm;\n          break;\n        case 24:\n          op = cff_op_rcurveline;\n          break;\n        case 25:\n          op = cff_op_rlinecurve;\n          break;\n        case 26:\n          op = cff_op_vvcurveto;\n          break;\n        case 27:\n          op = cff_op_hhcurveto;\n          break;\n        case 29:\n          op = cff_op_callgsubr;\n          break;\n        case 30:\n          op = cff_op_vhcurveto;\n          break;\n        case 31:\n          op = cff_op_hvcurveto;\n          break;\n        default:\n          FT_TRACE4(( \" unknown op (%d)\\n\", v ));\n          break;\n        }\n\n        if ( op == cff_op_unknown )\n          continue;\n\n        /* check arguments */\n        req_args = cff_argument_counts[op];\n        if ( req_args & CFF_COUNT_CHECK_WIDTH )\n        {\n          if ( num_args > 0 && decoder->read_width )\n          {\n            /* If `nominal_width' is non-zero, the number is really a      */\n            /* difference against `nominal_width'.  Else, the number here  */\n            /* is truly a width, not a difference against `nominal_width'. */\n            /* If the font does not set `nominal_width', then              */\n            /* `nominal_width' defaults to zero, and so we can set         */\n            /* `glyph_width' to `nominal_width' plus number on the stack   */\n            /* -- for either case.                                         */\n\n            FT_Int  set_width_ok;\n\n\n            switch ( op )\n            {\n            case cff_op_hmoveto:\n            case cff_op_vmoveto:\n              set_width_ok = num_args & 2;\n              break;\n\n            case cff_op_hstem:\n            case cff_op_vstem:\n            case cff_op_hstemhm:\n            case cff_op_vstemhm:\n            case cff_op_rmoveto:\n            case cff_op_hintmask:\n            case cff_op_cntrmask:\n              set_width_ok = num_args & 1;\n              break;\n\n            case cff_op_endchar:\n              /* If there is a width specified for endchar, we either have */\n              /* 1 argument or 5 arguments.  We like to argue.             */\n              set_width_ok = ( num_args == 5 ) || ( num_args == 1 );\n              break;\n\n            default:\n              set_width_ok = 0;\n              break;\n            }\n\n            if ( set_width_ok )\n            {\n              decoder->glyph_width = decoder->nominal_width +\n                                       ( stack[0] >> 16 );\n\n              if ( decoder->width_only )\n              {\n                /* we only want the advance width; stop here */\n                break;\n              }\n\n              /* Consumed an argument. */\n              num_args--;\n            }\n          }\n\n          decoder->read_width = 0;\n          req_args            = 0;\n        }\n\n        req_args &= 0x000F;\n        if ( num_args < req_args )\n          goto Stack_Underflow;\n        args     -= req_args;\n        num_args -= req_args;\n\n        /* At this point, `args' points to the first argument of the  */\n        /* operand in case `req_args' isn't zero.  Otherwise, we have */\n        /* to adjust `args' manually.                                 */\n\n        /* Note that we only pop arguments from the stack which we    */\n        /* really need and can digest so that we can continue in case */\n        /* of superfluous stack elements.                             */\n\n        switch ( op )\n        {\n        case cff_op_hstem:\n        case cff_op_vstem:\n        case cff_op_hstemhm:\n        case cff_op_vstemhm:\n          /* the number of arguments is always even here */\n          FT_TRACE4((\n              op == cff_op_hstem   ? \" hstem\\n\"   :\n            ( op == cff_op_vstem   ? \" vstem\\n\"   :\n            ( op == cff_op_hstemhm ? \" hstemhm\\n\" : \" vstemhm\\n\" ) ) ));\n\n          if ( hinter )\n            hinter->stems( hinter->hints,\n                           ( op == cff_op_hstem || op == cff_op_hstemhm ),\n                           num_args / 2,\n                           args - ( num_args & ~1 ) );\n\n          decoder->num_hints += num_args / 2;\n          args = stack;\n          break;\n\n        case cff_op_hintmask:\n        case cff_op_cntrmask:\n          FT_TRACE4(( op == cff_op_hintmask ? \" hintmask\" : \" cntrmask\" ));\n\n          /* implement vstem when needed --                        */\n          /* the specification doesn't say it, but this also works */\n          /* with the 'cntrmask' operator                          */\n          /*                                                       */\n          if ( num_args > 0 )\n          {\n            if ( hinter )\n              hinter->stems( hinter->hints,\n                             0,\n                             num_args / 2,\n                             args - ( num_args & ~1 ) );\n\n            decoder->num_hints += num_args / 2;\n          }\n\n          /* In a valid charstring there must be at least one byte */\n          /* after `hintmask' or `cntrmask' (e.g., for a `return'  */\n          /* instruction).  Additionally, there must be space for  */\n          /* `num_hints' bits.                                     */\n\n          if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )\n            goto Syntax_Error;\n\n          if ( hinter )\n          {\n            if ( op == cff_op_hintmask )\n              hinter->hintmask( hinter->hints,\n                                builder->current->n_points,\n                                decoder->num_hints,\n                                ip );\n            else\n              hinter->counter( hinter->hints,\n                               decoder->num_hints,\n                               ip );\n          }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n          {\n            FT_UInt maskbyte;\n\n\n            FT_TRACE4(( \" (maskbytes:\" ));\n\n            for ( maskbyte = 0;\n                  maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );\n                  maskbyte++, ip++ )\n              FT_TRACE4(( \" 0x%02X\", *ip ));\n\n            FT_TRACE4(( \")\\n\" ));\n          }\n#else\n          ip += ( decoder->num_hints + 7 ) >> 3;\n#endif\n          args = stack;\n          break;\n\n        case cff_op_rmoveto:\n          FT_TRACE4(( \" rmoveto\\n\" ));\n\n          cff_builder_close_contour( builder );\n          builder->path_begun = 0;\n          x   += args[-2];\n          y   += args[-1];\n          args = stack;\n          break;\n\n        case cff_op_vmoveto:\n          FT_TRACE4(( \" vmoveto\\n\" ));\n\n          cff_builder_close_contour( builder );\n          builder->path_begun = 0;\n          y   += args[-1];\n          args = stack;\n          break;\n\n        case cff_op_hmoveto:\n          FT_TRACE4(( \" hmoveto\\n\" ));\n\n          cff_builder_close_contour( builder );\n          builder->path_begun = 0;\n          x   += args[-1];\n          args = stack;\n          break;\n\n        case cff_op_rlineto:\n          FT_TRACE4(( \" rlineto\\n\" ));\n\n          if ( cff_builder_start_point( builder, x, y )  ||\n               cff_check_points( builder, num_args / 2 ) )\n            goto Fail;\n\n          if ( num_args < 2 )\n            goto Stack_Underflow;\n\n          args -= num_args & ~1;\n          while ( args < decoder->top )\n          {\n            x += args[0];\n            y += args[1];\n            cff_builder_add_point( builder, x, y, 1 );\n            args += 2;\n          }\n          args = stack;\n          break;\n\n        case cff_op_hlineto:\n        case cff_op_vlineto:\n          {\n            FT_Int  phase = ( op == cff_op_hlineto );\n\n\n            FT_TRACE4(( op == cff_op_hlineto ? \" hlineto\\n\"\n                                             : \" vlineto\\n\" ));\n\n            if ( num_args < 0 )\n              goto Stack_Underflow;\n\n            /* there exist subsetted fonts (found in PDFs) */\n            /* which call `hlineto' without arguments      */\n            if ( num_args == 0 )\n              break;\n\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, num_args )    )\n              goto Fail;\n\n            args = stack;\n            while ( args < decoder->top )\n            {\n              if ( phase )\n                x += args[0];\n              else\n                y += args[0];\n\n              if ( cff_builder_add_point1( builder, x, y ) )\n                goto Fail;\n\n              args++;\n              phase ^= 1;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_rrcurveto:\n          {\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" rrcurveto\\n\" ));\n\n            if ( num_args < 6 )\n              goto Stack_Underflow;\n\n            nargs = num_args - num_args % 6;\n\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, nargs / 2 )   )\n              goto Fail;\n\n            args -= nargs;\n            while ( args < decoder->top )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[2];\n              y += args[3];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[4];\n              y += args[5];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 6;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_vvcurveto:\n          {\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" vvcurveto\\n\" ));\n\n            if ( num_args < 4 )\n              goto Stack_Underflow;\n\n            /* if num_args isn't of the form 4n or 4n+1, */\n            /* we enforce it by clearing the second bit  */\n\n            nargs = num_args & ~2;\n\n            if ( cff_builder_start_point( builder, x, y ) )\n              goto Fail;\n\n            args -= nargs;\n\n            if ( nargs & 1 )\n            {\n              x += args[0];\n              args++;\n              nargs--;\n            }\n\n            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )\n              goto Fail;\n\n            while ( args < decoder->top )\n            {\n              y += args[0];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[1];\n              y += args[2];\n              cff_builder_add_point( builder, x, y, 0 );\n              y += args[3];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 4;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_hhcurveto:\n          {\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" hhcurveto\\n\" ));\n\n            if ( num_args < 4 )\n              goto Stack_Underflow;\n\n            /* if num_args isn't of the form 4n or 4n+1, */\n            /* we enforce it by clearing the second bit  */\n\n            nargs = num_args & ~2;\n\n            if ( cff_builder_start_point( builder, x, y ) )\n              goto Fail;\n\n            args -= nargs;\n            if ( nargs & 1 )\n            {\n              y += args[0];\n              args++;\n              nargs--;\n            }\n\n            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )\n              goto Fail;\n\n            while ( args < decoder->top )\n            {\n              x += args[0];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[1];\n              y += args[2];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[3];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 4;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_vhcurveto:\n        case cff_op_hvcurveto:\n          {\n            FT_Int  phase;\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( op == cff_op_vhcurveto ? \" vhcurveto\\n\"\n                                               : \" hvcurveto\\n\" ));\n\n            if ( cff_builder_start_point( builder, x, y ) )\n              goto Fail;\n\n            if ( num_args < 4 )\n              goto Stack_Underflow;\n\n            /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */\n            /* we enforce it by clearing the second bit               */\n\n            nargs = num_args & ~2;\n\n            args -= nargs;\n            if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) )\n              goto Stack_Underflow;\n\n            phase = ( op == cff_op_hvcurveto );\n\n            while ( nargs >= 4 )\n            {\n              nargs -= 4;\n              if ( phase )\n              {\n                x += args[0];\n                cff_builder_add_point( builder, x, y, 0 );\n                x += args[1];\n                y += args[2];\n                cff_builder_add_point( builder, x, y, 0 );\n                y += args[3];\n                if ( nargs == 1 )\n                  x += args[4];\n                cff_builder_add_point( builder, x, y, 1 );\n              }\n              else\n              {\n                y += args[0];\n                cff_builder_add_point( builder, x, y, 0 );\n                x += args[1];\n                y += args[2];\n                cff_builder_add_point( builder, x, y, 0 );\n                x += args[3];\n                if ( nargs == 1 )\n                  y += args[4];\n                cff_builder_add_point( builder, x, y, 1 );\n              }\n              args  += 4;\n              phase ^= 1;\n            }\n            args = stack;\n          }\n          break;\n\n        case cff_op_rlinecurve:\n          {\n            FT_Int  num_lines;\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" rlinecurve\\n\" ));\n\n            if ( num_args < 8 )\n              goto Stack_Underflow;\n\n            nargs     = num_args & ~1;\n            num_lines = ( nargs - 6 ) / 2;\n\n            if ( cff_builder_start_point( builder, x, y )   ||\n                 cff_check_points( builder, num_lines + 3 ) )\n              goto Fail;\n\n            args -= nargs;\n\n            /* first, add the line segments */\n            while ( num_lines > 0 )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 2;\n              num_lines--;\n            }\n\n            /* then the curve */\n            x += args[0];\n            y += args[1];\n            cff_builder_add_point( builder, x, y, 0 );\n            x += args[2];\n            y += args[3];\n            cff_builder_add_point( builder, x, y, 0 );\n            x += args[4];\n            y += args[5];\n            cff_builder_add_point( builder, x, y, 1 );\n            args = stack;\n          }\n          break;\n\n        case cff_op_rcurveline:\n          {\n            FT_Int  num_curves;\n            FT_Int  nargs;\n\n\n            FT_TRACE4(( \" rcurveline\\n\" ));\n\n            if ( num_args < 8 )\n              goto Stack_Underflow;\n\n            nargs      = num_args - 2;\n            nargs      = nargs - nargs % 6 + 2;\n            num_curves = ( nargs - 2 ) / 6;\n\n            if ( cff_builder_start_point( builder, x, y )        ||\n                 cff_check_points( builder, num_curves * 3 + 2 ) )\n              goto Fail;\n\n            args -= nargs;\n\n            /* first, add the curves */\n            while ( num_curves > 0 )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[2];\n              y += args[3];\n              cff_builder_add_point( builder, x, y, 0 );\n              x += args[4];\n              y += args[5];\n              cff_builder_add_point( builder, x, y, 1 );\n              args += 6;\n              num_curves--;\n            }\n\n            /* then the final line */\n            x += args[0];\n            y += args[1];\n            cff_builder_add_point( builder, x, y, 1 );\n            args = stack;\n          }\n          break;\n\n        case cff_op_hflex1:\n          {\n            FT_Pos start_y;\n\n\n            FT_TRACE4(( \" hflex1\\n\" ));\n\n            /* adding five more points: 4 control points, 1 on-curve point */\n            /* -- make sure we have enough space for the start point if it */\n            /* needs to be added                                           */\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, 6 )           )\n              goto Fail;\n\n            /* record the starting point's y position for later use */\n            start_y = y;\n\n            /* first control point */\n            x += args[0];\n            y += args[1];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* second control point */\n            x += args[2];\n            y += args[3];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* join point; on curve, with y-value the same as the last */\n            /* control point's y-value                                 */\n            x += args[4];\n            cff_builder_add_point( builder, x, y, 1 );\n\n            /* third control point, with y-value the same as the join */\n            /* point's y-value                                        */\n            x += args[5];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* fourth control point */\n            x += args[6];\n            y += args[7];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* ending point, with y-value the same as the start   */\n            x += args[8];\n            y  = start_y;\n            cff_builder_add_point( builder, x, y, 1 );\n\n            args = stack;\n            break;\n          }\n\n        case cff_op_hflex:\n          {\n            FT_Pos start_y;\n\n\n            FT_TRACE4(( \" hflex\\n\" ));\n\n            /* adding six more points; 4 control points, 2 on-curve points */\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, 6 )           )\n              goto Fail;\n\n            /* record the starting point's y-position for later use */\n            start_y = y;\n\n            /* first control point */\n            x += args[0];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* second control point */\n            x += args[1];\n            y += args[2];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* join point; on curve, with y-value the same as the last */\n            /* control point's y-value                                 */\n            x += args[3];\n            cff_builder_add_point( builder, x, y, 1 );\n\n            /* third control point, with y-value the same as the join */\n            /* point's y-value                                        */\n            x += args[4];\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* fourth control point */\n            x += args[5];\n            y  = start_y;\n            cff_builder_add_point( builder, x, y, 0 );\n\n            /* ending point, with y-value the same as the start point's */\n            /* y-value -- we don't add this point, though               */\n            x += args[6];\n            cff_builder_add_point( builder, x, y, 1 );\n\n            args = stack;\n            break;\n          }\n\n        case cff_op_flex1:\n          {\n            FT_Pos     start_x, start_y; /* record start x, y values for */\n                                         /* alter use                    */\n            FT_Fixed   dx = 0, dy = 0;   /* used in horizontal/vertical  */\n                                         /* algorithm below              */\n            FT_Int     horizontal, count;\n            FT_Fixed*  temp;\n\n\n            FT_TRACE4(( \" flex1\\n\" ));\n\n            /* adding six more points; 4 control points, 2 on-curve points */\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, 6 )           )\n              goto Fail;\n\n            /* record the starting point's x, y position for later use */\n            start_x = x;\n            start_y = y;\n\n            /* XXX: figure out whether this is supposed to be a horizontal */\n            /*      or vertical flex; the Type 2 specification is vague... */\n\n            temp = args;\n\n            /* grab up to the last argument */\n            for ( count = 5; count > 0; count-- )\n            {\n              dx += temp[0];\n              dy += temp[1];\n              temp += 2;\n            }\n\n            if ( dx < 0 )\n              dx = -dx;\n            if ( dy < 0 )\n              dy = -dy;\n\n            /* strange test, but here it is... */\n            horizontal = ( dx > dy );\n\n            for ( count = 5; count > 0; count-- )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y,\n                                     (FT_Bool)( count == 3 ) );\n              args += 2;\n            }\n\n            /* is last operand an x- or y-delta? */\n            if ( horizontal )\n            {\n              x += args[0];\n              y  = start_y;\n            }\n            else\n            {\n              x  = start_x;\n              y += args[0];\n            }\n\n            cff_builder_add_point( builder, x, y, 1 );\n\n            args = stack;\n            break;\n           }\n\n        case cff_op_flex:\n          {\n            FT_UInt  count;\n\n\n            FT_TRACE4(( \" flex\\n\" ));\n\n            if ( cff_builder_start_point( builder, x, y ) ||\n                 cff_check_points( builder, 6 )           )\n              goto Fail;\n\n            for ( count = 6; count > 0; count-- )\n            {\n              x += args[0];\n              y += args[1];\n              cff_builder_add_point( builder, x, y,\n                                     (FT_Bool)( count == 4 || count == 1 ) );\n              args += 2;\n            }\n\n            args = stack;\n          }\n          break;\n\n        case cff_op_seac:\n            FT_TRACE4(( \" seac\\n\" ));\n\n            error = cff_operator_seac( decoder,\n                                       args[0], args[1], args[2],\n                                       (FT_Int)( args[3] >> 16 ),\n                                       (FT_Int)( args[4] >> 16 ) );\n\n            /* add current outline to the glyph slot */\n            FT_GlyphLoader_Add( builder->loader );\n\n            /* return now! */\n            FT_TRACE4(( \"\\n\" ));\n            return error;\n\n        case cff_op_endchar:\n          FT_TRACE4(( \" endchar\\n\" ));\n\n          /* We are going to emulate the seac operator. */\n          if ( num_args >= 4 )\n          {\n            /* Save glyph width so that the subglyphs don't overwrite it. */\n            FT_Pos  glyph_width = decoder->glyph_width;\n\n\n            error = cff_operator_seac( decoder,\n                                       0L, args[-4], args[-3],\n                                       (FT_Int)( args[-2] >> 16 ),\n                                       (FT_Int)( args[-1] >> 16 ) );\n\n            decoder->glyph_width = glyph_width;\n          }\n          else\n          {\n            if ( !error )\n              error = FT_Err_Ok;\n\n            cff_builder_close_contour( builder );\n\n            /* close hints recording session */\n            if ( hinter )\n            {\n              if ( hinter->close( hinter->hints,\n                                  builder->current->n_points ) )\n                goto Syntax_Error;\n\n              /* apply hints to the loaded glyph outline now */\n              hinter->apply( hinter->hints,\n                             builder->current,\n                             (PSH_Globals)builder->hints_globals,\n                             decoder->hint_mode );\n            }\n\n            /* add current outline to the glyph slot */\n            FT_GlyphLoader_Add( builder->loader );\n          }\n\n          /* return now! */\n          FT_TRACE4(( \"\\n\" ));\n          return error;\n\n        case cff_op_abs:\n          FT_TRACE4(( \" abs\\n\" ));\n\n          if ( args[0] < 0 )\n            args[0] = -args[0];\n          args++;\n          break;\n\n        case cff_op_add:\n          FT_TRACE4(( \" add\\n\" ));\n\n          args[0] += args[1];\n          args++;\n          break;\n\n        case cff_op_sub:\n          FT_TRACE4(( \" sub\\n\" ));\n\n          args[0] -= args[1];\n          args++;\n          break;\n\n        case cff_op_div:\n          FT_TRACE4(( \" div\\n\" ));\n\n          args[0] = FT_DivFix( args[0], args[1] );\n          args++;\n          break;\n\n        case cff_op_neg:\n          FT_TRACE4(( \" neg\\n\" ));\n\n          args[0] = -args[0];\n          args++;\n          break;\n\n        case cff_op_random:\n          {\n            FT_Fixed  Rand;\n\n\n            FT_TRACE4(( \" rand\\n\" ));\n\n            Rand = seed;\n            if ( Rand >= 0x8000L )\n              Rand++;\n\n            args[0] = Rand;\n            seed    = FT_MulFix( seed, 0x10000L - seed );\n            if ( seed == 0 )\n              seed += 0x2873;\n            args++;\n          }\n          break;\n\n        case cff_op_mul:\n          FT_TRACE4(( \" mul\\n\" ));\n\n          args[0] = FT_MulFix( args[0], args[1] );\n          args++;\n          break;\n\n        case cff_op_sqrt:\n          FT_TRACE4(( \" sqrt\\n\" ));\n\n          if ( args[0] > 0 )\n          {\n            FT_Int    count = 9;\n            FT_Fixed  root  = args[0];\n            FT_Fixed  new_root;\n\n\n            for (;;)\n            {\n              new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;\n              if ( new_root == root || count <= 0 )\n                break;\n              root = new_root;\n            }\n            args[0] = new_root;\n          }\n          else\n            args[0] = 0;\n          args++;\n          break;\n\n        case cff_op_drop:\n          /* nothing */\n          FT_TRACE4(( \" drop\\n\" ));\n\n          break;\n\n        case cff_op_exch:\n          {\n            FT_Fixed  tmp;\n\n\n            FT_TRACE4(( \" exch\\n\" ));\n\n            tmp     = args[0];\n            args[0] = args[1];\n            args[1] = tmp;\n            args   += 2;\n          }\n          break;\n\n        case cff_op_index:\n          {\n            FT_Int  idx = (FT_Int)( args[0] >> 16 );\n\n\n            FT_TRACE4(( \" index\\n\" ));\n\n            if ( idx < 0 )\n              idx = 0;\n            else if ( idx > num_args - 2 )\n              idx = num_args - 2;\n            args[0] = args[-( idx + 1 )];\n            args++;\n          }\n          break;\n\n        case cff_op_roll:\n          {\n            FT_Int  count = (FT_Int)( args[0] >> 16 );\n            FT_Int  idx   = (FT_Int)( args[1] >> 16 );\n\n\n            FT_TRACE4(( \" roll\\n\" ));\n\n            if ( count <= 0 )\n              count = 1;\n\n            args -= count;\n            if ( args < stack )\n              goto Stack_Underflow;\n\n            if ( idx >= 0 )\n            {\n              while ( idx > 0 )\n              {\n                FT_Fixed  tmp = args[count - 1];\n                FT_Int    i;\n\n\n                for ( i = count - 2; i >= 0; i-- )\n                  args[i + 1] = args[i];\n                args[0] = tmp;\n                idx--;\n              }\n            }\n            else\n            {\n              while ( idx < 0 )\n              {\n                FT_Fixed  tmp = args[0];\n                FT_Int    i;\n\n\n                for ( i = 0; i < count - 1; i++ )\n                  args[i] = args[i + 1];\n                args[count - 1] = tmp;\n                idx++;\n              }\n            }\n            args += count;\n          }\n          break;\n\n        case cff_op_dup:\n          FT_TRACE4(( \" dup\\n\" ));\n\n          args[1] = args[0];\n          args += 2;\n          break;\n\n        case cff_op_put:\n          {\n            FT_Fixed  val = args[0];\n            FT_Int    idx = (FT_Int)( args[1] >> 16 );\n\n\n            FT_TRACE4(( \" put\\n\" ));\n\n            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )\n              decoder->buildchar[idx] = val;\n          }\n          break;\n\n        case cff_op_get:\n          {\n            FT_Int    idx = (FT_Int)( args[0] >> 16 );\n            FT_Fixed  val = 0;\n\n\n            FT_TRACE4(( \" get\\n\" ));\n\n            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )\n              val = decoder->buildchar[idx];\n\n            args[0] = val;\n            args++;\n          }\n          break;\n\n        case cff_op_store:\n          FT_TRACE4(( \" store\\n\"));\n\n          goto Unimplemented;\n\n        case cff_op_load:\n          FT_TRACE4(( \" load\\n\" ));\n\n          goto Unimplemented;\n\n        case cff_op_dotsection:\n          /* this operator is deprecated and ignored by the parser */\n          FT_TRACE4(( \" dotsection\\n\" ));\n          break;\n\n        case cff_op_closepath:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" closepath (invalid op)\\n\" ));\n\n          args = stack;\n          break;\n\n        case cff_op_hsbw:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" hsbw (invalid op)\\n\" ));\n\n          decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 );\n\n          decoder->builder.left_bearing.x = args[0];\n          decoder->builder.left_bearing.y = 0;\n\n          x    = decoder->builder.pos_x + args[0];\n          y    = decoder->builder.pos_y;\n          args = stack;\n          break;\n\n        case cff_op_sbw:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" sbw (invalid op)\\n\" ));\n\n          decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 );\n\n          decoder->builder.left_bearing.x = args[0];\n          decoder->builder.left_bearing.y = args[1];\n\n          x    = decoder->builder.pos_x + args[0];\n          y    = decoder->builder.pos_y + args[1];\n          args = stack;\n          break;\n\n        case cff_op_setcurrentpoint:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" setcurrentpoint (invalid op)\\n\" ));\n\n          x    = decoder->builder.pos_x + args[0];\n          y    = decoder->builder.pos_y + args[1];\n          args = stack;\n          break;\n\n        case cff_op_callothersubr:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" callothersubr (invalid op)\\n\" ));\n\n          /* subsequent `pop' operands should add the arguments,       */\n          /* this is the implementation described for `unknown' other  */\n          /* subroutines in the Type1 spec.                            */\n          /*                                                           */\n          /* XXX Fix return arguments (see discussion below).          */\n          args -= 2 + ( args[-2] >> 16 );\n          if ( args < stack )\n            goto Stack_Underflow;\n          break;\n\n        case cff_op_pop:\n          /* this is an invalid Type 2 operator; however, there        */\n          /* exist fonts which are incorrectly converted from probably */\n          /* Type 1 to CFF, and some parsers seem to accept it         */\n\n          FT_TRACE4(( \" pop (invalid op)\\n\" ));\n\n          /* XXX Increasing `args' is wrong: After a certain number of */\n          /* `pop's we get a stack overflow.  Reason for doing it is   */\n          /* code like this (actually found in a CFF font):            */\n          /*                                                           */\n          /*   17 1 3 callothersubr                                    */\n          /*   pop                                                     */\n          /*   callsubr                                                */\n          /*                                                           */\n          /* Since we handle `callothersubr' as a no-op, and           */\n          /* `callsubr' needs at least one argument, `pop' can't be a  */\n          /* no-op too as it basically should be.                      */\n          /*                                                           */\n          /* The right solution would be to provide real support for   */\n          /* `callothersubr' as done in `t1decode.c', however, given   */\n          /* the fact that CFF fonts with `pop' are invalid, it is     */\n          /* questionable whether it is worth the time.                */\n          args++;\n          break;\n\n        case cff_op_and:\n          {\n            FT_Fixed  cond = args[0] && args[1];\n\n\n            FT_TRACE4(( \" and\\n\" ));\n\n            args[0] = cond ? 0x10000L : 0;\n            args++;\n          }\n          break;\n\n        case cff_op_or:\n          {\n            FT_Fixed  cond = args[0] || args[1];\n\n\n            FT_TRACE4(( \" or\\n\" ));\n\n            args[0] = cond ? 0x10000L : 0;\n            args++;\n          }\n          break;\n\n        case cff_op_eq:\n          {\n            FT_Fixed  cond = !args[0];\n\n\n            FT_TRACE4(( \" eq\\n\" ));\n\n            args[0] = cond ? 0x10000L : 0;\n            args++;\n          }\n          break;\n\n        case cff_op_ifelse:\n          {\n            FT_Fixed  cond = ( args[2] <= args[3] );\n\n\n            FT_TRACE4(( \" ifelse\\n\" ));\n\n            if ( !cond )\n              args[0] = args[1];\n            args++;\n          }\n          break;\n\n        case cff_op_callsubr:\n          {\n            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +\n                                      decoder->locals_bias );\n\n\n            FT_TRACE4(( \" callsubr(%d)\\n\", idx ));\n\n            if ( idx >= decoder->num_locals )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" invalid local subr index\\n\" ));\n              goto Syntax_Error;\n            }\n\n            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" too many nested subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            zone->cursor = ip;  /* save current instruction pointer */\n\n            zone++;\n            zone->base   = decoder->locals[idx];\n            zone->limit  = decoder->locals[idx + 1];\n            zone->cursor = zone->base;\n\n            if ( !zone->base || zone->limit == zone->base )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" invoking empty subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            decoder->zone = zone;\n            ip            = zone->base;\n            limit         = zone->limit;\n          }\n          break;\n\n        case cff_op_callgsubr:\n          {\n            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +\n                                      decoder->globals_bias );\n\n\n            FT_TRACE4(( \" callgsubr(%d)\\n\", idx ));\n\n            if ( idx >= decoder->num_globals )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" invalid global subr index\\n\" ));\n              goto Syntax_Error;\n            }\n\n            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" too many nested subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            zone->cursor = ip;  /* save current instruction pointer */\n\n            zone++;\n            zone->base   = decoder->globals[idx];\n            zone->limit  = decoder->globals[idx + 1];\n            zone->cursor = zone->base;\n\n            if ( !zone->base || zone->limit == zone->base )\n            {\n              FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                         \" invoking empty subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            decoder->zone = zone;\n            ip            = zone->base;\n            limit         = zone->limit;\n          }\n          break;\n\n        case cff_op_return:\n          FT_TRACE4(( \" return\\n\" ));\n\n          if ( decoder->zone <= decoder->zones )\n          {\n            FT_ERROR(( \"cff_decoder_parse_charstrings:\"\n                       \" unexpected return\\n\" ));\n            goto Syntax_Error;\n          }\n\n          decoder->zone--;\n          zone  = decoder->zone;\n          ip    = zone->cursor;\n          limit = zone->limit;\n          break;\n\n        default:\n        Unimplemented:\n          FT_ERROR(( \"Unimplemented opcode: %d\", ip[-1] ));\n\n          if ( ip[-1] == 12 )\n            FT_ERROR(( \" %d\", ip[0] ));\n          FT_ERROR(( \"\\n\" ));\n\n          return FT_THROW( Unimplemented_Feature );\n        }\n\n        decoder->top = args;\n\n        if ( decoder->top - stack >= CFF_MAX_OPERANDS )\n          goto Stack_Overflow;\n\n      } /* general operator processing */\n\n    } /* while ip < limit */\n\n    FT_TRACE4(( \"..end..\\n\\n\" ));\n\n  Fail:\n    return error;\n\n  Syntax_Error:\n    FT_TRACE4(( \"cff_decoder_parse_charstrings: syntax error\\n\" ));\n    return FT_THROW( Invalid_File_Format );\n\n  Stack_Underflow:\n    FT_TRACE4(( \"cff_decoder_parse_charstrings: stack underflow\\n\" ));\n    return FT_THROW( Too_Few_Arguments );\n\n  Stack_Overflow:\n    FT_TRACE4(( \"cff_decoder_parse_charstrings: stack overflow\\n\" ));\n    return FT_THROW( Stack_Overflow );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /**********                                                      *********/\n  /**********                                                      *********/\n  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/\n  /**********                                                      *********/\n  /**********    The following code is in charge of computing      *********/\n  /**********    the maximum advance width of the font.  It        *********/\n  /**********    quickly processes each glyph charstring to        *********/\n  /**********    extract the value from either a `sbw' or `seac'   *********/\n  /**********    operator.                                         *********/\n  /**********                                                      *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#if 0 /* unused until we support pure CFF fonts */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_compute_max_advance( TT_Face  face,\n                           FT_Int*  max_advance )\n  {\n    FT_Error     error = FT_Err_Ok;\n    CFF_Decoder  decoder;\n    FT_Int       glyph_index;\n    CFF_Font     cff = (CFF_Font)face->other;\n\n\n    *max_advance = 0;\n\n    /* Initialize load decoder */\n    cff_decoder_init( &decoder, face, 0, 0, 0, 0 );\n\n    decoder.builder.metrics_only = 1;\n    decoder.builder.load_points  = 0;\n\n    /* For each glyph, parse the glyph charstring and extract */\n    /* the advance width.                                     */\n    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;\n          glyph_index++ )\n    {\n      FT_Byte*  charstring;\n      FT_ULong  charstring_len;\n\n\n      /* now get load the unscaled outline */\n      error = cff_get_glyph_data( face, glyph_index,\n                                  &charstring, &charstring_len );\n      if ( !error )\n      {\n        error = cff_decoder_prepare( &decoder, size, glyph_index );\n        if ( !error )\n          error = cff_decoder_parse_charstrings( &decoder,\n                                                 charstring,\n                                                 charstring_len );\n\n        cff_free_glyph_data( face, &charstring, &charstring_len );\n      }\n\n      /* ignore the error if one has occurred -- skip to next glyph */\n      error = FT_Err_Ok;\n    }\n\n    *max_advance = decoder.builder.advance.x;\n\n    return FT_Err_Ok;\n  }\n\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_slot_load( CFF_GlyphSlot  glyph,\n                 CFF_Size       size,\n                 FT_UInt        glyph_index,\n                 FT_Int32       load_flags )\n  {\n    FT_Error     error;\n    CFF_Decoder  decoder;\n    TT_Face      face = (TT_Face)glyph->root.face;\n    FT_Bool      hinting, scaled, force_scaling;\n    CFF_Font     cff  = (CFF_Font)face->extra.data;\n\n    FT_Matrix    font_matrix;\n    FT_Vector    font_offset;\n\n\n    force_scaling = FALSE;\n\n    /* in a CID-keyed font, consider `glyph_index' as a CID and map */\n    /* it immediately to the real glyph_index -- if it isn't a      */\n    /* subsetted font, glyph_indices and CIDs are identical, though */\n    if ( cff->top_font.font_dict.cid_registry != 0xFFFFU &&\n         cff->charset.cids                               )\n    {\n      /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */\n      if ( glyph_index != 0 )\n      {\n        glyph_index = cff_charset_cid_to_gindex( &cff->charset,\n                                                 glyph_index );\n        if ( glyph_index == 0 )\n          return FT_THROW( Invalid_Argument );\n      }\n    }\n    else if ( glyph_index >= cff->num_glyphs )\n      return FT_THROW( Invalid_Argument );\n\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;\n\n    glyph->x_scale = 0x10000L;\n    glyph->y_scale = 0x10000L;\n    if ( size )\n    {\n      glyph->x_scale = size->root.metrics.x_scale;\n      glyph->y_scale = size->root.metrics.y_scale;\n    }\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n    /* try to load embedded bitmap if any              */\n    /*                                                 */\n    /* XXX: The convention should be emphasized in     */\n    /*      the documents because it can be confusing. */\n    if ( size )\n    {\n      CFF_Face      cff_face = (CFF_Face)size->root.face;\n      SFNT_Service  sfnt     = (SFNT_Service)cff_face->sfnt;\n      FT_Stream     stream   = cff_face->root.stream;\n\n\n      if ( size->strike_index != 0xFFFFFFFFUL      &&\n           sfnt->load_eblc                         &&\n           ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )\n      {\n        TT_SBit_MetricsRec  metrics;\n\n\n        error = sfnt->load_sbit_image( face,\n                                       size->strike_index,\n                                       glyph_index,\n                                       (FT_Int)load_flags,\n                                       stream,\n                                       &glyph->root.bitmap,\n                                       &metrics );\n\n        if ( !error )\n        {\n          FT_Bool    has_vertical_info;\n          FT_UShort  advance;\n          FT_Short   dummy;\n\n\n          glyph->root.outline.n_points   = 0;\n          glyph->root.outline.n_contours = 0;\n\n          glyph->root.metrics.width  = (FT_Pos)metrics.width  << 6;\n          glyph->root.metrics.height = (FT_Pos)metrics.height << 6;\n\n          glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;\n          glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;\n          glyph->root.metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;\n\n          glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;\n          glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;\n          glyph->root.metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;\n\n          glyph->root.format = FT_GLYPH_FORMAT_BITMAP;\n\n          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n          {\n            glyph->root.bitmap_left = metrics.vertBearingX;\n            glyph->root.bitmap_top  = metrics.vertBearingY;\n          }\n          else\n          {\n            glyph->root.bitmap_left = metrics.horiBearingX;\n            glyph->root.bitmap_top  = metrics.horiBearingY;\n          }\n\n          /* compute linear advance widths */\n\n          ( (SFNT_Service)face->sfnt )->get_metrics( face, 0,\n                                                     glyph_index,\n                                                     &dummy,\n                                                     &advance );\n          glyph->root.linearHoriAdvance = advance;\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n          has_vertical_info = FT_BOOL(\n                                face->vertical_info                   &&\n                                face->vertical.number_Of_VMetrics > 0 &&\n                                face->vertical.long_metrics           );\n#else\n          has_vertical_info = FT_BOOL(\n                                face->vertical_info                   &&\n                                face->vertical.number_Of_VMetrics > 0 );\n#endif\n\n          /* get the vertical metrics from the vtmx table if we have one */\n          if ( has_vertical_info )\n          {\n            ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,\n                                                       glyph_index,\n                                                       &dummy,\n                                                       &advance );\n            glyph->root.linearVertAdvance = advance;\n          }\n          else\n          {\n            /* make up vertical ones */\n            if ( face->os2.version != 0xFFFFU )\n              glyph->root.linearVertAdvance = (FT_Pos)\n                ( face->os2.sTypoAscender - face->os2.sTypoDescender );\n            else\n              glyph->root.linearVertAdvance = (FT_Pos)\n                ( face->horizontal.Ascender - face->horizontal.Descender );\n          }\n\n          return error;\n        }\n      }\n    }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n    /* return immediately if we only want the embedded bitmaps */\n    if ( load_flags & FT_LOAD_SBITS_ONLY )\n      return FT_THROW( Invalid_Argument );\n\n    /* if we have a CID subfont, use its matrix (which has already */\n    /* been multiplied with the root matrix)                       */\n\n    /* this scaling is only relevant if the PS hinter isn't active */\n    if ( cff->num_subfonts )\n    {\n      FT_ULong  top_upm, sub_upm;\n      FT_Byte   fd_index = cff_fd_select_get( &cff->fd_select,\n                                              glyph_index );\n\n\n      if ( fd_index >= cff->num_subfonts )\n        fd_index = (FT_Byte)( cff->num_subfonts - 1 );\n\n      top_upm = cff->top_font.font_dict.units_per_em;\n      sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em;\n\n\n      font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix;\n      font_offset = cff->subfonts[fd_index]->font_dict.font_offset;\n\n      if ( top_upm != sub_upm )\n      {\n        glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm );\n        glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm );\n\n        force_scaling = TRUE;\n      }\n    }\n    else\n    {\n      font_matrix = cff->top_font.font_dict.font_matrix;\n      font_offset = cff->top_font.font_dict.font_offset;\n    }\n\n    glyph->root.outline.n_points   = 0;\n    glyph->root.outline.n_contours = 0;\n\n    /* top-level code ensures that FT_LOAD_NO_HINTING is set */\n    /* if FT_LOAD_NO_SCALE is active                         */\n    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );\n    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );\n\n    glyph->hint        = hinting;\n    glyph->scaled      = scaled;\n    glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;  /* by default */\n\n    {\n      CFF_Driver  driver = (CFF_Driver)FT_FACE_DRIVER( face );\n\n      FT_Byte*  charstring;\n      FT_ULong  charstring_len;\n\n\n      cff_decoder_init( &decoder, face, size, glyph, hinting,\n                        FT_LOAD_TARGET_MODE( load_flags ) );\n\n      if ( load_flags & FT_LOAD_ADVANCE_ONLY )\n        decoder.width_only = TRUE;\n\n      decoder.builder.no_recurse =\n        (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );\n\n      /* now load the unscaled outline */\n      error = cff_get_glyph_data( face, glyph_index,\n                                  &charstring, &charstring_len );\n      if ( error )\n        goto Glyph_Build_Finished;\n\n      error = cff_decoder_prepare( &decoder, size, glyph_index );\n      if ( error )\n        goto Glyph_Build_Finished;\n\n      /* choose which CFF renderer to use */\n      if ( driver->hinting_engine == FT_CFF_HINTING_ADOBE )\n        error = cf2_decoder_parse_charstrings( &decoder,\n                                               charstring,\n                                               charstring_len );\n\n      /* Adobe's engine uses 16.16 numbers everywhere;              */\n      /* as a consequence, glyphs larger than 2000ppem get rejected */\n      if ( FT_ERR_EQ( error, Glyph_Too_Big )                 ||\n           driver->hinting_engine == FT_CFF_HINTING_FREETYPE )\n        error = cff_decoder_parse_charstrings( &decoder,\n                                               charstring,\n                                               charstring_len );\n\n      cff_free_glyph_data( face, &charstring, charstring_len );\n\n      if ( error )\n        goto Glyph_Build_Finished;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n      /* Control data and length may not be available for incremental */\n      /* fonts.                                                       */\n      if ( face->root.internal->incremental_interface )\n      {\n        glyph->root.control_data = 0;\n        glyph->root.control_len = 0;\n      }\n      else\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n      /* We set control_data and control_len if charstrings is loaded. */\n      /* See how charstring loads at cff_index_access_element() in     */\n      /* cffload.c.                                                    */\n      {\n        CFF_Index  csindex = &cff->charstrings_index;\n\n\n        if ( csindex->offsets )\n        {\n          glyph->root.control_data = csindex->bytes +\n                                     csindex->offsets[glyph_index] - 1;\n          glyph->root.control_len  = charstring_len;\n        }\n      }\n\n  Glyph_Build_Finished:\n      /* save new glyph tables, if no error */\n      if ( !error )\n        cff_builder_done( &decoder.builder );\n      /* XXX: anything to do for broken glyph entry? */\n    }\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* Incremental fonts can optionally override the metrics. */\n    if ( !error                                                               &&\n         face->root.internal->incremental_interface                           &&\n         face->root.internal->incremental_interface->funcs->get_glyph_metrics )\n    {\n      FT_Incremental_MetricsRec  metrics;\n\n\n      metrics.bearing_x = decoder.builder.left_bearing.x;\n      metrics.bearing_y = 0;\n      metrics.advance   = decoder.builder.advance.x;\n      metrics.advance_v = decoder.builder.advance.y;\n\n      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(\n                face->root.internal->incremental_interface->object,\n                glyph_index, FALSE, &metrics );\n\n      decoder.builder.left_bearing.x = metrics.bearing_x;\n      decoder.builder.advance.x      = metrics.advance;\n      decoder.builder.advance.y      = metrics.advance_v;\n    }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    if ( !error )\n    {\n      /* Now, set the metrics -- this is rather simple, as   */\n      /* the left side bearing is the xMin, and the top side */\n      /* bearing the yMax.                                   */\n\n      /* For composite glyphs, return only left side bearing and */\n      /* advance width.                                          */\n      if ( load_flags & FT_LOAD_NO_RECURSE )\n      {\n        FT_Slot_Internal  internal = glyph->root.internal;\n\n\n        glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;\n        glyph->root.metrics.horiAdvance  = decoder.glyph_width;\n        internal->glyph_matrix           = font_matrix;\n        internal->glyph_delta            = font_offset;\n        internal->glyph_transformed      = 1;\n      }\n      else\n      {\n        FT_BBox            cbox;\n        FT_Glyph_Metrics*  metrics = &glyph->root.metrics;\n        FT_Vector          advance;\n        FT_Bool            has_vertical_info;\n\n\n        /* copy the _unscaled_ advance width */\n        metrics->horiAdvance                    = decoder.glyph_width;\n        glyph->root.linearHoriAdvance           = decoder.glyph_width;\n        glyph->root.internal->glyph_transformed = 0;\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n        has_vertical_info = FT_BOOL( face->vertical_info                   &&\n                                     face->vertical.number_Of_VMetrics > 0 &&\n                                     face->vertical.long_metrics           );\n#else\n        has_vertical_info = FT_BOOL( face->vertical_info                   &&\n                                     face->vertical.number_Of_VMetrics > 0 );\n#endif\n\n        /* get the vertical metrics from the vtmx table if we have one */\n        if ( has_vertical_info )\n        {\n          FT_Short   vertBearingY = 0;\n          FT_UShort  vertAdvance  = 0;\n\n\n          ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,\n                                                     glyph_index,\n                                                     &vertBearingY,\n                                                     &vertAdvance );\n          metrics->vertBearingY = vertBearingY;\n          metrics->vertAdvance  = vertAdvance;\n        }\n        else\n        {\n          /* make up vertical ones */\n          if ( face->os2.version != 0xFFFFU )\n            metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender -\n                                             face->os2.sTypoDescender );\n          else\n            metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender -\n                                             face->horizontal.Descender );\n        }\n\n        glyph->root.linearVertAdvance = metrics->vertAdvance;\n\n        glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;\n\n        glyph->root.outline.flags = 0;\n        if ( size && size->root.metrics.y_ppem < 24 )\n          glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;\n\n        glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;\n\n        if ( !( font_matrix.xx == 0x10000L &&\n                font_matrix.yy == 0x10000L &&\n                font_matrix.xy == 0        &&\n                font_matrix.yx == 0        ) )\n          FT_Outline_Transform( &glyph->root.outline, &font_matrix );\n\n        if ( !( font_offset.x == 0 &&\n                font_offset.y == 0 ) )\n          FT_Outline_Translate( &glyph->root.outline,\n                                font_offset.x, font_offset.y );\n\n        advance.x = metrics->horiAdvance;\n        advance.y = 0;\n        FT_Vector_Transform( &advance, &font_matrix );\n        metrics->horiAdvance = advance.x + font_offset.x;\n\n        advance.x = 0;\n        advance.y = metrics->vertAdvance;\n        FT_Vector_Transform( &advance, &font_matrix );\n        metrics->vertAdvance = advance.y + font_offset.y;\n\n        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )\n        {\n          /* scale the outline and the metrics */\n          FT_Int       n;\n          FT_Outline*  cur     = &glyph->root.outline;\n          FT_Vector*   vec     = cur->points;\n          FT_Fixed     x_scale = glyph->x_scale;\n          FT_Fixed     y_scale = glyph->y_scale;\n\n\n          /* First of all, scale the points */\n          if ( !hinting || !decoder.builder.hints_funcs )\n            for ( n = cur->n_points; n > 0; n--, vec++ )\n            {\n              vec->x = FT_MulFix( vec->x, x_scale );\n              vec->y = FT_MulFix( vec->y, y_scale );\n            }\n\n          /* Then scale the metrics */\n          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );\n          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );\n        }\n\n        /* compute the other metrics */\n        FT_Outline_Get_CBox( &glyph->root.outline, &cbox );\n\n        metrics->width  = cbox.xMax - cbox.xMin;\n        metrics->height = cbox.yMax - cbox.yMin;\n\n        metrics->horiBearingX = cbox.xMin;\n        metrics->horiBearingY = cbox.yMax;\n\n        if ( has_vertical_info )\n          metrics->vertBearingX = metrics->horiBearingX -\n                                    metrics->horiAdvance / 2;\n        else\n        {\n          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n            ft_synthesize_vertical_metrics( metrics,\n                                            metrics->vertAdvance );\n        }\n      }\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffgload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffgload.h                                                             */\n/*                                                                         */\n/*    OpenType Glyph Loader (specification).                               */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2009, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFGLOAD_H__\n#define __CFFGLOAD_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include \"cffobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#define CFF_MAX_OPERANDS        48\n#define CFF_MAX_SUBRS_CALLS     32\n#define CFF_MAX_TRANS_ELEMENTS  32\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Structure>                                                           */\n  /*    CFF_Builder                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*     A structure used during glyph loading to store its outline.       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    memory        :: The current memory object.                        */\n  /*                                                                       */\n  /*    face          :: The current face object.                          */\n  /*                                                                       */\n  /*    glyph         :: The current glyph slot.                           */\n  /*                                                                       */\n  /*    loader        :: The current glyph loader.                         */\n  /*                                                                       */\n  /*    base          :: The base glyph outline.                           */\n  /*                                                                       */\n  /*    current       :: The current glyph outline.                        */\n  /*                                                                       */\n  /*    pos_x         :: The horizontal translation (if composite glyph).  */\n  /*                                                                       */\n  /*    pos_y         :: The vertical translation (if composite glyph).    */\n  /*                                                                       */\n  /*    left_bearing  :: The left side bearing point.                      */\n  /*                                                                       */\n  /*    advance       :: The horizontal advance vector.                    */\n  /*                                                                       */\n  /*    bbox          :: Unused.                                           */\n  /*                                                                       */\n  /*    path_begun    :: A flag which indicates that a new path has begun. */\n  /*                                                                       */\n  /*    load_points   :: If this flag is not set, no points are loaded.    */\n  /*                                                                       */\n  /*    no_recurse    :: Set but not used.                                 */\n  /*                                                                       */\n  /*    metrics_only  :: A boolean indicating that we only want to compute */\n  /*                     the metrics of a given glyph, not load all of its */\n  /*                     points.                                           */\n  /*                                                                       */\n  /*    hints_funcs   :: Auxiliary pointer for hinting.                    */\n  /*                                                                       */\n  /*    hints_globals :: Auxiliary pointer for hinting.                    */\n  /*                                                                       */\n  typedef struct  CFF_Builder_\n  {\n    FT_Memory       memory;\n    TT_Face         face;\n    CFF_GlyphSlot   glyph;\n    FT_GlyphLoader  loader;\n    FT_Outline*     base;\n    FT_Outline*     current;\n\n    FT_Pos          pos_x;\n    FT_Pos          pos_y;\n\n    FT_Vector       left_bearing;\n    FT_Vector       advance;\n\n    FT_BBox         bbox;          /* bounding box */\n    FT_Bool         path_begun;\n    FT_Bool         load_points;\n    FT_Bool         no_recurse;\n\n    FT_Bool         metrics_only;\n\n    void*           hints_funcs;    /* hinter-specific */\n    void*           hints_globals;  /* hinter-specific */\n\n  } CFF_Builder;\n\n\n  FT_LOCAL( FT_Error )\n  cff_check_points( CFF_Builder*  builder,\n                    FT_Int        count );\n\n  FT_LOCAL( void )\n  cff_builder_add_point( CFF_Builder*  builder,\n                         FT_Pos        x,\n                         FT_Pos        y,\n                         FT_Byte       flag );\n  FT_LOCAL( FT_Error )\n  cff_builder_add_point1( CFF_Builder*  builder,\n                          FT_Pos        x,\n                          FT_Pos        y );\n  FT_LOCAL( FT_Error )\n  cff_builder_start_point( CFF_Builder*  builder,\n                           FT_Pos        x,\n                           FT_Pos        y );\n  FT_LOCAL( void )\n  cff_builder_close_contour( CFF_Builder*  builder );\n\n\n  FT_LOCAL( FT_Int )\n  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,\n                                   FT_Int    charcode );\n  FT_LOCAL( FT_Error )\n  cff_get_glyph_data( TT_Face    face,\n                      FT_UInt    glyph_index,\n                      FT_Byte**  pointer,\n                      FT_ULong*  length );\n  FT_LOCAL( void )\n  cff_free_glyph_data( TT_Face    face,\n                       FT_Byte**  pointer,\n                       FT_ULong   length );\n\n\n  /* execution context charstring zone */\n\n  typedef struct  CFF_Decoder_Zone_\n  {\n    FT_Byte*  base;\n    FT_Byte*  limit;\n    FT_Byte*  cursor;\n\n  } CFF_Decoder_Zone;\n\n\n  typedef struct  CFF_Decoder_\n  {\n    CFF_Builder        builder;\n    CFF_Font           cff;\n\n    FT_Fixed           stack[CFF_MAX_OPERANDS + 1];\n    FT_Fixed*          top;\n\n    CFF_Decoder_Zone   zones[CFF_MAX_SUBRS_CALLS + 1];\n    CFF_Decoder_Zone*  zone;\n\n    FT_Int             flex_state;\n    FT_Int             num_flex_vectors;\n    FT_Vector          flex_vectors[7];\n\n    FT_Pos             glyph_width;\n    FT_Pos             nominal_width;\n\n    FT_Bool            read_width;\n    FT_Bool            width_only;\n    FT_Int             num_hints;\n    FT_Fixed           buildchar[CFF_MAX_TRANS_ELEMENTS];\n\n    FT_UInt            num_locals;\n    FT_UInt            num_globals;\n\n    FT_Int             locals_bias;\n    FT_Int             globals_bias;\n\n    FT_Byte**          locals;\n    FT_Byte**          globals;\n\n    FT_Byte**          glyph_names;   /* for pure CFF fonts only  */\n    FT_UInt            num_glyphs;    /* number of glyphs in font */\n\n    FT_Render_Mode     hint_mode;\n\n    FT_Bool            seac;\n\n    CFF_SubFont        current_subfont; /* for current glyph_index */\n\n  } CFF_Decoder;\n\n\n  FT_LOCAL( void )\n  cff_decoder_init( CFF_Decoder*    decoder,\n                    TT_Face         face,\n                    CFF_Size        size,\n                    CFF_GlyphSlot   slot,\n                    FT_Bool         hinting,\n                    FT_Render_Mode  hint_mode );\n\n  FT_LOCAL( FT_Error )\n  cff_decoder_prepare( CFF_Decoder*  decoder,\n                       CFF_Size      size,\n                       FT_UInt       glyph_index );\n\n#if 0  /* unused until we support pure CFF fonts */\n\n  /* Compute the maximum advance width of a font through quick parsing */\n  FT_LOCAL( FT_Error )\n  cff_compute_max_advance( TT_Face  face,\n                           FT_Int*  max_advance );\n\n#endif /* 0 */\n\n  FT_LOCAL( FT_Error )\n  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,\n                                 FT_Byte*      charstring_base,\n                                 FT_ULong      charstring_len );\n\n  FT_LOCAL( FT_Error )\n  cff_slot_load( CFF_GlyphSlot  glyph,\n                 CFF_Size       size,\n                 FT_UInt        glyph_index,\n                 FT_Int32       load_flags );\n\n\nFT_END_HEADER\n\n#endif /* __CFFGLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffload.c                                                              */\n/*                                                                         */\n/*    OpenType and CFF data/program tables loader (body).                  */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_TYPE1_TABLES_H\n\n#include \"cffload.h\"\n#include \"cffparse.h\"\n\n#include \"cfferrs.h\"\n\n\n#if 1\n\n  static const FT_UShort  cff_isoadobe_charset[229] =\n  {\n      0,   1,   2,   3,   4,   5,   6,   7,\n      8,   9,  10,  11,  12,  13,  14,  15,\n     16,  17,  18,  19,  20,  21,  22,  23,\n     24,  25,  26,  27,  28,  29,  30,  31,\n     32,  33,  34,  35,  36,  37,  38,  39,\n     40,  41,  42,  43,  44,  45,  46,  47,\n     48,  49,  50,  51,  52,  53,  54,  55,\n     56,  57,  58,  59,  60,  61,  62,  63,\n     64,  65,  66,  67,  68,  69,  70,  71,\n     72,  73,  74,  75,  76,  77,  78,  79,\n     80,  81,  82,  83,  84,  85,  86,  87,\n     88,  89,  90,  91,  92,  93,  94,  95,\n     96,  97,  98,  99, 100, 101, 102, 103,\n    104, 105, 106, 107, 108, 109, 110, 111,\n    112, 113, 114, 115, 116, 117, 118, 119,\n    120, 121, 122, 123, 124, 125, 126, 127,\n    128, 129, 130, 131, 132, 133, 134, 135,\n    136, 137, 138, 139, 140, 141, 142, 143,\n    144, 145, 146, 147, 148, 149, 150, 151,\n    152, 153, 154, 155, 156, 157, 158, 159,\n    160, 161, 162, 163, 164, 165, 166, 167,\n    168, 169, 170, 171, 172, 173, 174, 175,\n    176, 177, 178, 179, 180, 181, 182, 183,\n    184, 185, 186, 187, 188, 189, 190, 191,\n    192, 193, 194, 195, 196, 197, 198, 199,\n    200, 201, 202, 203, 204, 205, 206, 207,\n    208, 209, 210, 211, 212, 213, 214, 215,\n    216, 217, 218, 219, 220, 221, 222, 223,\n    224, 225, 226, 227, 228\n  };\n\n  static const FT_UShort  cff_expert_charset[166] =\n  {\n      0,   1, 229, 230, 231, 232, 233, 234,\n    235, 236, 237, 238,  13,  14,  15,  99,\n    239, 240, 241, 242, 243, 244, 245, 246,\n    247, 248,  27,  28, 249, 250, 251, 252,\n    253, 254, 255, 256, 257, 258, 259, 260,\n    261, 262, 263, 264, 265, 266, 109, 110,\n    267, 268, 269, 270, 271, 272, 273, 274,\n    275, 276, 277, 278, 279, 280, 281, 282,\n    283, 284, 285, 286, 287, 288, 289, 290,\n    291, 292, 293, 294, 295, 296, 297, 298,\n    299, 300, 301, 302, 303, 304, 305, 306,\n    307, 308, 309, 310, 311, 312, 313, 314,\n    315, 316, 317, 318, 158, 155, 163, 319,\n    320, 321, 322, 323, 324, 325, 326, 150,\n    164, 169, 327, 328, 329, 330, 331, 332,\n    333, 334, 335, 336, 337, 338, 339, 340,\n    341, 342, 343, 344, 345, 346, 347, 348,\n    349, 350, 351, 352, 353, 354, 355, 356,\n    357, 358, 359, 360, 361, 362, 363, 364,\n    365, 366, 367, 368, 369, 370, 371, 372,\n    373, 374, 375, 376, 377, 378\n  };\n\n  static const FT_UShort  cff_expertsubset_charset[87] =\n  {\n      0,   1, 231, 232, 235, 236, 237, 238,\n     13,  14,  15,  99, 239, 240, 241, 242,\n    243, 244, 245, 246, 247, 248,  27,  28,\n    249, 250, 251, 253, 254, 255, 256, 257,\n    258, 259, 260, 261, 262, 263, 264, 265,\n    266, 109, 110, 267, 268, 269, 270, 272,\n    300, 301, 302, 305, 314, 315, 158, 155,\n    163, 320, 321, 322, 323, 324, 325, 326,\n    150, 164, 169, 327, 328, 329, 330, 331,\n    332, 333, 334, 335, 336, 337, 338, 339,\n    340, 341, 342, 343, 344, 345, 346\n  };\n\n  static const FT_UShort  cff_standard_encoding[256] =\n  {\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      1,   2,   3,   4,   5,   6,   7,   8,\n      9,  10,  11,  12,  13,  14,  15,  16,\n     17,  18,  19,  20,  21,  22,  23,  24,\n     25,  26,  27,  28,  29,  30,  31,  32,\n     33,  34,  35,  36,  37,  38,  39,  40,\n     41,  42,  43,  44,  45,  46,  47,  48,\n     49,  50,  51,  52,  53,  54,  55,  56,\n     57,  58,  59,  60,  61,  62,  63,  64,\n     65,  66,  67,  68,  69,  70,  71,  72,\n     73,  74,  75,  76,  77,  78,  79,  80,\n     81,  82,  83,  84,  85,  86,  87,  88,\n     89,  90,  91,  92,  93,  94,  95,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,  96,  97,  98,  99, 100, 101, 102,\n    103, 104, 105, 106, 107, 108, 109, 110,\n      0, 111, 112, 113, 114,   0, 115, 116,\n    117, 118, 119, 120, 121, 122,   0, 123,\n      0, 124, 125, 126, 127, 128, 129, 130,\n    131,   0, 132, 133,   0, 134, 135, 136,\n    137,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0, 138,   0, 139,   0,   0,   0,   0,\n    140, 141, 142, 143,   0,   0,   0,   0,\n      0, 144,   0,   0,   0, 145,   0,   0,\n    146, 147, 148, 149,   0,   0,   0,   0\n  };\n\n  static const FT_UShort  cff_expert_encoding[256] =\n  {\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      1, 229, 230,   0, 231, 232, 233, 234,\n    235, 236, 237, 238,  13,  14,  15,  99,\n    239, 240, 241, 242, 243, 244, 245, 246,\n    247, 248,  27,  28, 249, 250, 251, 252,\n      0, 253, 254, 255, 256, 257,   0,   0,\n      0, 258,   0,   0, 259, 260, 261, 262,\n      0,   0, 263, 264, 265,   0, 266, 109,\n    110, 267, 268, 269,   0, 270, 271, 272,\n    273, 274, 275, 276, 277, 278, 279, 280,\n    281, 282, 283, 284, 285, 286, 287, 288,\n    289, 290, 291, 292, 293, 294, 295, 296,\n    297, 298, 299, 300, 301, 302, 303,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0,   0,   0,   0,   0,   0,   0,   0,\n      0, 304, 305, 306,   0,   0, 307, 308,\n    309, 310, 311,   0, 312,   0,   0, 312,\n      0,   0, 314, 315,   0,   0, 316, 317,\n    318,   0,   0,   0, 158, 155, 163, 319,\n    320, 321, 322, 323, 324, 325,   0,   0,\n    326, 150, 164, 169, 327, 328, 329, 330,\n    331, 332, 333, 334, 335, 336, 337, 338,\n    339, 340, 341, 342, 343, 344, 345, 346,\n    347, 348, 349, 350, 351, 352, 353, 354,\n    355, 356, 357, 358, 359, 360, 361, 362,\n    363, 364, 365, 366, 367, 368, 369, 370,\n    371, 372, 373, 374, 375, 376, 377, 378\n  };\n\n#endif /* 1 */\n\n\n  FT_LOCAL_DEF( FT_UShort )\n  cff_get_standard_encoding( FT_UInt  charcode )\n  {\n    return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode]\n                                       : 0 );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffload\n\n\n  /* read an offset from the index's stream current position */\n  static FT_ULong\n  cff_index_read_offset( CFF_Index  idx,\n                         FT_Error  *errorp )\n  {\n    FT_Error   error;\n    FT_Stream  stream = idx->stream;\n    FT_Byte    tmp[4];\n    FT_ULong   result = 0;\n\n\n    if ( !FT_STREAM_READ( tmp, idx->off_size ) )\n    {\n      FT_Int  nn;\n\n\n      for ( nn = 0; nn < idx->off_size; nn++ )\n        result = ( result << 8 ) | tmp[nn];\n    }\n\n    *errorp = error;\n    return result;\n  }\n\n\n  static FT_Error\n  cff_index_init( CFF_Index  idx,\n                  FT_Stream  stream,\n                  FT_Bool    load )\n  {\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n    FT_UShort  count;\n\n\n    FT_MEM_ZERO( idx, sizeof ( *idx ) );\n\n    idx->stream = stream;\n    idx->start  = FT_STREAM_POS();\n    if ( !FT_READ_USHORT( count ) &&\n         count > 0                )\n    {\n      FT_Byte   offsize;\n      FT_ULong  size;\n\n\n      /* there is at least one element; read the offset size,           */\n      /* then access the offset table to compute the index's total size */\n      if ( FT_READ_BYTE( offsize ) )\n        goto Exit;\n\n      if ( offsize < 1 || offsize > 4 )\n      {\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n\n      idx->count    = count;\n      idx->off_size = offsize;\n      size          = (FT_ULong)( count + 1 ) * offsize;\n\n      idx->data_offset = idx->start + 3 + size;\n\n      if ( FT_STREAM_SKIP( size - offsize ) )\n        goto Exit;\n\n      size = cff_index_read_offset( idx, &error );\n      if ( error )\n        goto Exit;\n\n      if ( size == 0 )\n      {\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n\n      idx->data_size = --size;\n\n      if ( load )\n      {\n        /* load the data */\n        if ( FT_FRAME_EXTRACT( size, idx->bytes ) )\n          goto Exit;\n      }\n      else\n      {\n        /* skip the data */\n        if ( FT_STREAM_SKIP( size ) )\n          goto Exit;\n      }\n    }\n\n  Exit:\n    if ( error )\n      FT_FREE( idx->offsets );\n\n    return error;\n  }\n\n\n  static void\n  cff_index_done( CFF_Index  idx )\n  {\n    if ( idx->stream )\n    {\n      FT_Stream  stream = idx->stream;\n      FT_Memory  memory = stream->memory;\n\n\n      if ( idx->bytes )\n        FT_FRAME_RELEASE( idx->bytes );\n\n      FT_FREE( idx->offsets );\n      FT_MEM_ZERO( idx, sizeof ( *idx ) );\n    }\n  }\n\n\n  static FT_Error\n  cff_index_load_offsets( CFF_Index  idx )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    FT_Stream  stream = idx->stream;\n    FT_Memory  memory = stream->memory;\n\n\n    if ( idx->count > 0 && idx->offsets == NULL )\n    {\n      FT_Byte    offsize = idx->off_size;\n      FT_ULong   data_size;\n      FT_Byte*   p;\n      FT_Byte*   p_end;\n      FT_ULong*  poff;\n\n\n      data_size = (FT_ULong)( idx->count + 1 ) * offsize;\n\n      if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) ||\n           FT_STREAM_SEEK( idx->start + 3 )             ||\n           FT_FRAME_ENTER( data_size )                  )\n        goto Exit;\n\n      poff   = idx->offsets;\n      p      = (FT_Byte*)stream->cursor;\n      p_end  = p + data_size;\n\n      switch ( offsize )\n      {\n      case 1:\n        for ( ; p < p_end; p++, poff++ )\n          poff[0] = p[0];\n        break;\n\n      case 2:\n        for ( ; p < p_end; p += 2, poff++ )\n          poff[0] = FT_PEEK_USHORT( p );\n        break;\n\n      case 3:\n        for ( ; p < p_end; p += 3, poff++ )\n          poff[0] = FT_PEEK_OFF3( p );\n        break;\n\n      default:\n        for ( ; p < p_end; p += 4, poff++ )\n          poff[0] = FT_PEEK_ULONG( p );\n      }\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    if ( error )\n      FT_FREE( idx->offsets );\n\n    return error;\n  }\n\n\n  /* Allocate a table containing pointers to an index's elements. */\n  /* The `pool' argument makes this function convert the index    */\n  /* entries to C-style strings (this is, NULL-terminated).       */\n  static FT_Error\n  cff_index_get_pointers( CFF_Index   idx,\n                          FT_Byte***  table,\n                          FT_Byte**   pool )\n  {\n    FT_Error   error     = FT_Err_Ok;\n    FT_Memory  memory    = idx->stream->memory;\n\n    FT_Byte**  t         = NULL;\n    FT_Byte*   new_bytes = NULL;\n\n\n    *table = NULL;\n\n    if ( idx->offsets == NULL )\n    {\n      error = cff_index_load_offsets( idx );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( idx->count > 0                                        &&\n         !FT_NEW_ARRAY( t, idx->count + 1 )                    &&\n         ( !pool || !FT_ALLOC( new_bytes,\n                               idx->data_size + idx->count ) ) )\n    {\n      FT_ULong  n, cur_offset;\n      FT_ULong  extra = 0;\n      FT_Byte*  org_bytes = idx->bytes;\n\n\n      /* at this point, `idx->offsets' can't be NULL */\n      cur_offset = idx->offsets[0] - 1;\n\n      /* sanity check */\n      if ( cur_offset >= idx->data_size )\n      {\n        FT_TRACE0(( \"cff_index_get_pointers:\"\n                    \" invalid first offset value %d set to zero\\n\",\n                    cur_offset ));\n        cur_offset = 0;\n      }\n\n      if ( !pool )\n        t[0] = org_bytes + cur_offset;\n      else\n        t[0] = new_bytes + cur_offset;\n\n      for ( n = 1; n <= idx->count; n++ )\n      {\n        FT_ULong  next_offset = idx->offsets[n] - 1;\n\n\n        /* empty slot + two sanity checks for invalid offset tables */\n        if ( next_offset == 0                                    ||\n             next_offset < cur_offset                            ||\n             ( next_offset >= idx->data_size && n < idx->count ) )\n          next_offset = cur_offset;\n\n        if ( !pool )\n          t[n] = org_bytes + next_offset;\n        else\n        {\n          t[n] = new_bytes + next_offset + extra;\n\n          if ( next_offset != cur_offset )\n          {\n            FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] );\n            t[n][0] = '\\0';\n            t[n]   += 1;\n            extra++;\n          }\n        }\n\n        cur_offset = next_offset;\n      }\n      *table = t;\n\n      if ( pool )\n        *pool = new_bytes;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_index_access_element( CFF_Index  idx,\n                            FT_UInt    element,\n                            FT_Byte**  pbytes,\n                            FT_ULong*  pbyte_len )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( idx && idx->count > element )\n    {\n      /* compute start and end offsets */\n      FT_Stream  stream = idx->stream;\n      FT_ULong   off1, off2 = 0;\n\n\n      /* load offsets from file or the offset table */\n      if ( !idx->offsets )\n      {\n        FT_ULong  pos = element * idx->off_size;\n\n\n        if ( FT_STREAM_SEEK( idx->start + 3 + pos ) )\n          goto Exit;\n\n        off1 = cff_index_read_offset( idx, &error );\n        if ( error )\n          goto Exit;\n\n        if ( off1 != 0 )\n        {\n          do\n          {\n            element++;\n            off2 = cff_index_read_offset( idx, &error );\n          }\n          while ( off2 == 0 && element < idx->count );\n        }\n      }\n      else   /* use offsets table */\n      {\n        off1 = idx->offsets[element];\n        if ( off1 )\n        {\n          do\n          {\n            element++;\n            off2 = idx->offsets[element];\n\n          } while ( off2 == 0 && element < idx->count );\n        }\n      }\n\n      /* XXX: should check off2 does not exceed the end of this entry; */\n      /*      at present, only truncate off2 at the end of this stream */\n      if ( off2 > stream->size + 1                    ||\n           idx->data_offset > stream->size - off2 + 1 )\n      {\n        FT_ERROR(( \"cff_index_access_element:\"\n                   \" offset to next entry (%d)\"\n                   \" exceeds the end of stream (%d)\\n\",\n                   off2, stream->size - idx->data_offset + 1 ));\n        off2 = stream->size - idx->data_offset + 1;\n      }\n\n      /* access element */\n      if ( off1 && off2 > off1 )\n      {\n        *pbyte_len = off2 - off1;\n\n        if ( idx->bytes )\n        {\n          /* this index was completely loaded in memory, that's easy */\n          *pbytes = idx->bytes + off1 - 1;\n        }\n        else\n        {\n          /* this index is still on disk/file, access it through a frame */\n          if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) ||\n               FT_FRAME_EXTRACT( off2 - off1, *pbytes )      )\n            goto Exit;\n        }\n      }\n      else\n      {\n        /* empty index element */\n        *pbytes    = 0;\n        *pbyte_len = 0;\n      }\n    }\n    else\n      error = FT_THROW( Invalid_Argument );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_index_forget_element( CFF_Index  idx,\n                            FT_Byte**  pbytes )\n  {\n    if ( idx->bytes == 0 )\n    {\n      FT_Stream  stream = idx->stream;\n\n\n      FT_FRAME_RELEASE( *pbytes );\n    }\n  }\n\n\n  /* get an entry from Name INDEX */\n  FT_LOCAL_DEF( FT_String* )\n  cff_index_get_name( CFF_Font  font,\n                      FT_UInt   element )\n  {\n    CFF_Index   idx = &font->name_index;\n    FT_Memory   memory = idx->stream->memory;\n    FT_Byte*    bytes;\n    FT_ULong    byte_len;\n    FT_Error    error;\n    FT_String*  name = 0;\n\n\n    error = cff_index_access_element( idx, element, &bytes, &byte_len );\n    if ( error )\n      goto Exit;\n\n    if ( !FT_ALLOC( name, byte_len + 1 ) )\n    {\n      FT_MEM_COPY( name, bytes, byte_len );\n      name[byte_len] = 0;\n    }\n    cff_index_forget_element( idx, &bytes );\n\n  Exit:\n    return name;\n  }\n\n\n  /* get an entry from String INDEX */\n  FT_LOCAL_DEF( FT_String* )\n  cff_index_get_string( CFF_Font  font,\n                        FT_UInt   element )\n  {\n    return ( element < font->num_strings )\n             ? (FT_String*)font->strings[element]\n             : NULL;\n  }\n\n\n  FT_LOCAL_DEF( FT_String* )\n  cff_index_get_sid_string( CFF_Font  font,\n                            FT_UInt   sid )\n  {\n    /* value 0xFFFFU indicates a missing dictionary entry */\n    if ( sid == 0xFFFFU )\n      return NULL;\n\n    /* if it is not a standard string, return it */\n    if ( sid > 390 )\n      return cff_index_get_string( font, sid - 391 );\n\n    /* CID-keyed CFF fonts don't have glyph names */\n    if ( !font->psnames )\n      return NULL;\n\n    /* this is a standard string */\n    return (FT_String *)font->psnames->adobe_std_strings( sid );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***   FD Select table support                                         ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  static void\n  CFF_Done_FD_Select( CFF_FDSelect  fdselect,\n                      FT_Stream     stream )\n  {\n    if ( fdselect->data )\n      FT_FRAME_RELEASE( fdselect->data );\n\n    fdselect->data_size   = 0;\n    fdselect->format      = 0;\n    fdselect->range_count = 0;\n  }\n\n\n  static FT_Error\n  CFF_Load_FD_Select( CFF_FDSelect  fdselect,\n                      FT_UInt       num_glyphs,\n                      FT_Stream     stream,\n                      FT_ULong      offset )\n  {\n    FT_Error  error;\n    FT_Byte   format;\n    FT_UInt   num_ranges;\n\n\n    /* read format */\n    if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) )\n      goto Exit;\n\n    fdselect->format      = format;\n    fdselect->cache_count = 0;   /* clear cache */\n\n    switch ( format )\n    {\n    case 0:     /* format 0, that's simple */\n      fdselect->data_size = num_glyphs;\n      goto Load_Data;\n\n    case 3:     /* format 3, a tad more complex */\n      if ( FT_READ_USHORT( num_ranges ) )\n        goto Exit;\n\n      fdselect->data_size = num_ranges * 3 + 2;\n\n    Load_Data:\n      if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) )\n        goto Exit;\n      break;\n\n    default:    /* hmm... that's wrong */\n      error = FT_THROW( Invalid_File_Format );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Byte )\n  cff_fd_select_get( CFF_FDSelect  fdselect,\n                     FT_UInt       glyph_index )\n  {\n    FT_Byte  fd = 0;\n\n\n    switch ( fdselect->format )\n    {\n    case 0:\n      fd = fdselect->data[glyph_index];\n      break;\n\n    case 3:\n      /* first, compare to cache */\n      if ( (FT_UInt)( glyph_index - fdselect->cache_first ) <\n                        fdselect->cache_count )\n      {\n        fd = fdselect->cache_fd;\n        break;\n      }\n\n      /* then, lookup the ranges array */\n      {\n        FT_Byte*  p       = fdselect->data;\n        FT_Byte*  p_limit = p + fdselect->data_size;\n        FT_Byte   fd2;\n        FT_UInt   first, limit;\n\n\n        first = FT_NEXT_USHORT( p );\n        do\n        {\n          if ( glyph_index < first )\n            break;\n\n          fd2   = *p++;\n          limit = FT_NEXT_USHORT( p );\n\n          if ( glyph_index < limit )\n          {\n            fd = fd2;\n\n            /* update cache */\n            fdselect->cache_first = first;\n            fdselect->cache_count = limit-first;\n            fdselect->cache_fd    = fd2;\n            break;\n          }\n          first = limit;\n\n        } while ( p < p_limit );\n      }\n      break;\n\n    default:\n      ;\n    }\n\n    return fd;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /***                                                                   ***/\n  /***   CFF font support                                                ***/\n  /***                                                                   ***/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_Error\n  cff_charset_compute_cids( CFF_Charset  charset,\n                            FT_UInt      num_glyphs,\n                            FT_Memory    memory )\n  {\n    FT_Error   error   = FT_Err_Ok;\n    FT_UInt    i;\n    FT_Long    j;\n    FT_UShort  max_cid = 0;\n\n\n    if ( charset->max_cid > 0 )\n      goto Exit;\n\n    for ( i = 0; i < num_glyphs; i++ )\n    {\n      if ( charset->sids[i] > max_cid )\n        max_cid = charset->sids[i];\n    }\n\n    if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) )\n      goto Exit;\n\n    /* When multiple GIDs map to the same CID, we choose the lowest */\n    /* GID.  This is not described in any spec, but it matches the  */\n    /* behaviour of recent Acroread versions.                       */\n    for ( j = num_glyphs - 1; j >= 0 ; j-- )\n      charset->cids[charset->sids[j]] = (FT_UShort)j;\n\n    charset->max_cid    = max_cid;\n    charset->num_glyphs = num_glyphs;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  cff_charset_cid_to_gindex( CFF_Charset  charset,\n                             FT_UInt      cid )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( cid <= charset->max_cid )\n      result = charset->cids[cid];\n\n    return result;\n  }\n\n\n  static void\n  cff_charset_free_cids( CFF_Charset  charset,\n                         FT_Memory    memory )\n  {\n    FT_FREE( charset->cids );\n    charset->max_cid = 0;\n  }\n\n\n  static void\n  cff_charset_done( CFF_Charset  charset,\n                    FT_Stream    stream )\n  {\n    FT_Memory  memory = stream->memory;\n\n\n    cff_charset_free_cids( charset, memory );\n\n    FT_FREE( charset->sids );\n    charset->format = 0;\n    charset->offset = 0;\n  }\n\n\n  static FT_Error\n  cff_charset_load( CFF_Charset  charset,\n                    FT_UInt      num_glyphs,\n                    FT_Stream    stream,\n                    FT_ULong     base_offset,\n                    FT_ULong     offset,\n                    FT_Bool      invert )\n  {\n    FT_Memory  memory = stream->memory;\n    FT_Error   error  = FT_Err_Ok;\n    FT_UShort  glyph_sid;\n\n\n    /* If the the offset is greater than 2, we have to parse the */\n    /* charset table.                                            */\n    if ( offset > 2 )\n    {\n      FT_UInt  j;\n\n\n      charset->offset = base_offset + offset;\n\n      /* Get the format of the table. */\n      if ( FT_STREAM_SEEK( charset->offset ) ||\n           FT_READ_BYTE( charset->format )   )\n        goto Exit;\n\n      /* Allocate memory for sids. */\n      if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )\n        goto Exit;\n\n      /* assign the .notdef glyph */\n      charset->sids[0] = 0;\n\n      switch ( charset->format )\n      {\n      case 0:\n        if ( num_glyphs > 0 )\n        {\n          if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) )\n            goto Exit;\n\n          for ( j = 1; j < num_glyphs; j++ )\n            charset->sids[j] = FT_GET_USHORT();\n\n          FT_FRAME_EXIT();\n        }\n        break;\n\n      case 1:\n      case 2:\n        {\n          FT_UInt  nleft;\n          FT_UInt  i;\n\n\n          j = 1;\n\n          while ( j < num_glyphs )\n          {\n            /* Read the first glyph sid of the range. */\n            if ( FT_READ_USHORT( glyph_sid ) )\n              goto Exit;\n\n            /* Read the number of glyphs in the range.  */\n            if ( charset->format == 2 )\n            {\n              if ( FT_READ_USHORT( nleft ) )\n                goto Exit;\n            }\n            else\n            {\n              if ( FT_READ_BYTE( nleft ) )\n                goto Exit;\n            }\n\n            /* try to rescue some of the SIDs if `nleft' is too large */\n            if ( glyph_sid > 0xFFFFL - nleft )\n            {\n              FT_ERROR(( \"cff_charset_load: invalid SID range trimmed\"\n                         \" nleft=%d -> %d\\n\", nleft, 0xFFFFL - glyph_sid ));\n              nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );\n            }\n\n            /* Fill in the range of sids -- `nleft + 1' glyphs. */\n            for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )\n              charset->sids[j] = glyph_sid;\n          }\n        }\n        break;\n\n      default:\n        FT_ERROR(( \"cff_charset_load: invalid table format\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n    }\n    else\n    {\n      /* Parse default tables corresponding to offset == 0, 1, or 2.  */\n      /* CFF specification intimates the following:                   */\n      /*                                                              */\n      /* In order to use a predefined charset, the following must be  */\n      /* true: The charset constructed for the glyphs in the font's   */\n      /* charstrings dictionary must match the predefined charset in  */\n      /* the first num_glyphs.                                        */\n\n      charset->offset = offset;  /* record charset type */\n\n      switch ( (FT_UInt)offset )\n      {\n      case 0:\n        if ( num_glyphs > 229 )\n        {\n          FT_ERROR(( \"cff_charset_load: implicit charset larger than\\n\"\n                     \"predefined charset (Adobe ISO-Latin)\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        /* Allocate memory for sids. */\n        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )\n          goto Exit;\n\n        /* Copy the predefined charset into the allocated memory. */\n        FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs );\n\n        break;\n\n      case 1:\n        if ( num_glyphs > 166 )\n        {\n          FT_ERROR(( \"cff_charset_load: implicit charset larger than\\n\"\n                     \"predefined charset (Adobe Expert)\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        /* Allocate memory for sids. */\n        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )\n          goto Exit;\n\n        /* Copy the predefined charset into the allocated memory.     */\n        FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs );\n\n        break;\n\n      case 2:\n        if ( num_glyphs > 87 )\n        {\n          FT_ERROR(( \"cff_charset_load: implicit charset larger than\\n\"\n                     \"predefined charset (Adobe Expert Subset)\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        /* Allocate memory for sids. */\n        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )\n          goto Exit;\n\n        /* Copy the predefined charset into the allocated memory.     */\n        FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs );\n\n        break;\n\n      default:\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n    }\n\n    /* we have to invert the `sids' array for subsetted CID-keyed fonts */\n    if ( invert )\n      error = cff_charset_compute_cids( charset, num_glyphs, memory );\n\n  Exit:\n    /* Clean up if there was an error. */\n    if ( error )\n    {\n      FT_FREE( charset->sids );\n      FT_FREE( charset->cids );\n      charset->format = 0;\n      charset->offset = 0;\n      charset->sids   = 0;\n    }\n\n    return error;\n  }\n\n\n  static void\n  cff_encoding_done( CFF_Encoding  encoding )\n  {\n    encoding->format = 0;\n    encoding->offset = 0;\n    encoding->count  = 0;\n  }\n\n\n  static FT_Error\n  cff_encoding_load( CFF_Encoding  encoding,\n                     CFF_Charset   charset,\n                     FT_UInt       num_glyphs,\n                     FT_Stream     stream,\n                     FT_ULong      base_offset,\n                     FT_ULong      offset )\n  {\n    FT_Error   error = FT_Err_Ok;\n    FT_UInt    count;\n    FT_UInt    j;\n    FT_UShort  glyph_sid;\n    FT_UInt    glyph_code;\n\n\n    /* Check for charset->sids.  If we do not have this, we fail. */\n    if ( !charset->sids )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* Zero out the code to gid/sid mappings. */\n    for ( j = 0; j < 256; j++ )\n    {\n      encoding->sids [j] = 0;\n      encoding->codes[j] = 0;\n    }\n\n    /* Note: The encoding table in a CFF font is indexed by glyph index;  */\n    /* the first encoded glyph index is 1.  Hence, we read the character  */\n    /* code (`glyph_code') at index j and make the assignment:            */\n    /*                                                                    */\n    /*    encoding->codes[glyph_code] = j + 1                             */\n    /*                                                                    */\n    /* We also make the assignment:                                       */\n    /*                                                                    */\n    /*    encoding->sids[glyph_code] = charset->sids[j + 1]               */\n    /*                                                                    */\n    /* This gives us both a code to GID and a code to SID mapping.        */\n\n    if ( offset > 1 )\n    {\n      encoding->offset = base_offset + offset;\n\n      /* we need to parse the table to determine its size */\n      if ( FT_STREAM_SEEK( encoding->offset ) ||\n           FT_READ_BYTE( encoding->format )   ||\n           FT_READ_BYTE( count )              )\n        goto Exit;\n\n      switch ( encoding->format & 0x7F )\n      {\n      case 0:\n        {\n          FT_Byte*  p;\n\n\n          /* By convention, GID 0 is always \".notdef\" and is never */\n          /* coded in the font.  Hence, the number of codes found  */\n          /* in the table is `count+1'.                            */\n          /*                                                       */\n          encoding->count = count + 1;\n\n          if ( FT_FRAME_ENTER( count ) )\n            goto Exit;\n\n          p = (FT_Byte*)stream->cursor;\n\n          for ( j = 1; j <= count; j++ )\n          {\n            glyph_code = *p++;\n\n            /* Make sure j is not too big. */\n            if ( j < num_glyphs )\n            {\n              /* Assign code to GID mapping. */\n              encoding->codes[glyph_code] = (FT_UShort)j;\n\n              /* Assign code to SID mapping. */\n              encoding->sids[glyph_code] = charset->sids[j];\n            }\n          }\n\n          FT_FRAME_EXIT();\n        }\n        break;\n\n      case 1:\n        {\n          FT_UInt  nleft;\n          FT_UInt  i = 1;\n          FT_UInt  k;\n\n\n          encoding->count = 0;\n\n          /* Parse the Format1 ranges. */\n          for ( j = 0;  j < count; j++, i += nleft )\n          {\n            /* Read the first glyph code of the range. */\n            if ( FT_READ_BYTE( glyph_code ) )\n              goto Exit;\n\n            /* Read the number of codes in the range. */\n            if ( FT_READ_BYTE( nleft ) )\n              goto Exit;\n\n            /* Increment nleft, so we read `nleft + 1' codes/sids. */\n            nleft++;\n\n            /* compute max number of character codes */\n            if ( (FT_UInt)nleft > encoding->count )\n              encoding->count = nleft;\n\n            /* Fill in the range of codes/sids. */\n            for ( k = i; k < nleft + i; k++, glyph_code++ )\n            {\n              /* Make sure k is not too big. */\n              if ( k < num_glyphs && glyph_code < 256 )\n              {\n                /* Assign code to GID mapping. */\n                encoding->codes[glyph_code] = (FT_UShort)k;\n\n                /* Assign code to SID mapping. */\n                encoding->sids[glyph_code] = charset->sids[k];\n              }\n            }\n          }\n\n          /* simple check; one never knows what can be found in a font */\n          if ( encoding->count > 256 )\n            encoding->count = 256;\n        }\n        break;\n\n      default:\n        FT_ERROR(( \"cff_encoding_load: invalid table format\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      /* Parse supplemental encodings, if any. */\n      if ( encoding->format & 0x80 )\n      {\n        FT_UInt  gindex;\n\n\n        /* count supplements */\n        if ( FT_READ_BYTE( count ) )\n          goto Exit;\n\n        for ( j = 0; j < count; j++ )\n        {\n          /* Read supplemental glyph code. */\n          if ( FT_READ_BYTE( glyph_code ) )\n            goto Exit;\n\n          /* Read the SID associated with this glyph code. */\n          if ( FT_READ_USHORT( glyph_sid ) )\n            goto Exit;\n\n          /* Assign code to SID mapping. */\n          encoding->sids[glyph_code] = glyph_sid;\n\n          /* First, look up GID which has been assigned to */\n          /* SID glyph_sid.                                */\n          for ( gindex = 0; gindex < num_glyphs; gindex++ )\n          {\n            if ( charset->sids[gindex] == glyph_sid )\n            {\n              encoding->codes[glyph_code] = (FT_UShort)gindex;\n              break;\n            }\n          }\n        }\n      }\n    }\n    else\n    {\n      /* We take into account the fact a CFF font can use a predefined */\n      /* encoding without containing all of the glyphs encoded by this */\n      /* encoding (see the note at the end of section 12 in the CFF    */\n      /* specification).                                               */\n\n      switch ( (FT_UInt)offset )\n      {\n      case 0:\n        /* First, copy the code to SID mapping. */\n        FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 );\n        goto Populate;\n\n      case 1:\n        /* First, copy the code to SID mapping. */\n        FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 );\n\n      Populate:\n        /* Construct code to GID mapping from code to SID mapping */\n        /* and charset.                                           */\n\n        encoding->count = 0;\n\n        error = cff_charset_compute_cids( charset, num_glyphs,\n                                          stream->memory );\n        if ( error )\n          goto Exit;\n\n        for ( j = 0; j < 256; j++ )\n        {\n          FT_UInt  sid = encoding->sids[j];\n          FT_UInt  gid = 0;\n\n\n          if ( sid )\n            gid = cff_charset_cid_to_gindex( charset, sid );\n\n          if ( gid != 0 )\n          {\n            encoding->codes[j] = (FT_UShort)gid;\n            encoding->count    = j + 1;\n          }\n          else\n          {\n            encoding->codes[j] = 0;\n            encoding->sids [j] = 0;\n          }\n        }\n        break;\n\n      default:\n        FT_ERROR(( \"cff_encoding_load: invalid table format\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n    }\n\n  Exit:\n\n    /* Clean up if there was an error. */\n    return error;\n  }\n\n\n  static FT_Error\n  cff_subfont_load( CFF_SubFont  font,\n                    CFF_Index    idx,\n                    FT_UInt      font_index,\n                    FT_Stream    stream,\n                    FT_ULong     base_offset,\n                    FT_Library   library )\n  {\n    FT_Error         error;\n    CFF_ParserRec    parser;\n    FT_Byte*         dict = NULL;\n    FT_ULong         dict_len;\n    CFF_FontRecDict  top  = &font->font_dict;\n    CFF_Private      priv = &font->private_dict;\n\n\n    cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library );\n\n    /* set defaults */\n    FT_MEM_ZERO( top, sizeof ( *top ) );\n\n    top->underline_position  = -( 100L << 16 );\n    top->underline_thickness = 50L << 16;\n    top->charstring_type     = 2;\n    top->font_matrix.xx      = 0x10000L;\n    top->font_matrix.yy      = 0x10000L;\n    top->cid_count           = 8720;\n\n    /* we use the implementation specific SID value 0xFFFF to indicate */\n    /* missing entries                                                 */\n    top->version             = 0xFFFFU;\n    top->notice              = 0xFFFFU;\n    top->copyright           = 0xFFFFU;\n    top->full_name           = 0xFFFFU;\n    top->family_name         = 0xFFFFU;\n    top->weight              = 0xFFFFU;\n    top->embedded_postscript = 0xFFFFU;\n\n    top->cid_registry        = 0xFFFFU;\n    top->cid_ordering        = 0xFFFFU;\n    top->cid_font_name       = 0xFFFFU;\n\n    error = cff_index_access_element( idx, font_index, &dict, &dict_len );\n    if ( !error )\n    {\n      FT_TRACE4(( \" top dictionary:\\n\" ));\n      error = cff_parser_run( &parser, dict, dict + dict_len );\n    }\n\n    cff_index_forget_element( idx, &dict );\n\n    if ( error )\n      goto Exit;\n\n    /* if it is a CID font, we stop there */\n    if ( top->cid_registry != 0xFFFFU )\n      goto Exit;\n\n    /* parse the private dictionary, if any */\n    if ( top->private_offset && top->private_size )\n    {\n      /* set defaults */\n      FT_MEM_ZERO( priv, sizeof ( *priv ) );\n\n      priv->blue_shift       = 7;\n      priv->blue_fuzz        = 1;\n      priv->lenIV            = -1;\n      priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );\n      priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );\n\n      cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library );\n\n      if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) ||\n           FT_FRAME_ENTER( font->font_dict.private_size )                 )\n        goto Exit;\n\n      FT_TRACE4(( \" private dictionary:\\n\" ));\n      error = cff_parser_run( &parser,\n                              (FT_Byte*)stream->cursor,\n                              (FT_Byte*)stream->limit );\n      FT_FRAME_EXIT();\n      if ( error )\n        goto Exit;\n\n      /* ensure that `num_blue_values' is even */\n      priv->num_blue_values &= ~1;\n    }\n\n    /* read the local subrs, if any */\n    if ( priv->local_subrs_offset )\n    {\n      if ( FT_STREAM_SEEK( base_offset + top->private_offset +\n                           priv->local_subrs_offset ) )\n        goto Exit;\n\n      error = cff_index_init( &font->local_subrs_index, stream, 1 );\n      if ( error )\n        goto Exit;\n\n      error = cff_index_get_pointers( &font->local_subrs_index,\n                                      &font->local_subrs, NULL );\n      if ( error )\n        goto Exit;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  cff_subfont_done( FT_Memory    memory,\n                    CFF_SubFont  subfont )\n  {\n    if ( subfont )\n    {\n      cff_index_done( &subfont->local_subrs_index );\n      FT_FREE( subfont->local_subrs );\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_font_load( FT_Library library,\n                 FT_Stream  stream,\n                 FT_Int     face_index,\n                 CFF_Font   font,\n                 FT_Bool    pure_cff )\n  {\n    static const FT_Frame_Field  cff_header_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CFF_FontRec\n\n      FT_FRAME_START( 4 ),\n        FT_FRAME_BYTE( version_major ),\n        FT_FRAME_BYTE( version_minor ),\n        FT_FRAME_BYTE( header_size ),\n        FT_FRAME_BYTE( absolute_offsize ),\n      FT_FRAME_END\n    };\n\n    FT_Error         error;\n    FT_Memory        memory = stream->memory;\n    FT_ULong         base_offset;\n    CFF_FontRecDict  dict;\n    CFF_IndexRec     string_index;\n    FT_Int           subfont_index;\n\n\n    FT_ZERO( font );\n    FT_ZERO( &string_index );\n\n    font->stream = stream;\n    font->memory = memory;\n    dict         = &font->top_font.font_dict;\n    base_offset  = FT_STREAM_POS();\n\n    /* read CFF font header */\n    if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) )\n      goto Exit;\n\n    /* check format */\n    if ( font->version_major   != 1 ||\n         font->header_size      < 4 ||\n         font->absolute_offsize > 4 )\n    {\n      FT_TRACE2(( \"  not a CFF font header\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* skip the rest of the header */\n    if ( FT_STREAM_SKIP( font->header_size - 4 ) )\n      goto Exit;\n\n    /* read the name, top dict, string and global subrs index */\n    if ( FT_SET_ERROR( cff_index_init( &font->name_index,\n                                       stream, 0 ) )                  ||\n         FT_SET_ERROR( cff_index_init( &font->font_dict_index,\n                                       stream, 0 ) )                  ||\n         FT_SET_ERROR( cff_index_init( &string_index,\n                                       stream, 1 ) )                  ||\n         FT_SET_ERROR( cff_index_init( &font->global_subrs_index,\n                                       stream, 1 ) )                  ||\n         FT_SET_ERROR( cff_index_get_pointers( &string_index,\n                                               &font->strings,\n                                               &font->string_pool ) ) )\n      goto Exit;\n\n    font->num_strings = string_index.count;\n\n    if ( pure_cff )\n    {\n      /* well, we don't really forget the `disabled' fonts... */\n      subfont_index = face_index;\n\n      if ( subfont_index >= (FT_Int)font->name_index.count )\n      {\n        FT_ERROR(( \"cff_font_load:\"\n                   \" invalid subfont index for pure CFF font (%d)\\n\",\n                   subfont_index ));\n        error = FT_THROW( Invalid_Argument );\n        goto Exit;\n      }\n\n      font->num_faces = font->name_index.count;\n    }\n    else\n    {\n      subfont_index = 0;\n\n      if ( font->name_index.count > 1 )\n      {\n        FT_ERROR(( \"cff_font_load:\"\n                   \" invalid CFF font with multiple subfonts\\n\"\n                   \"              \"\n                   \" in SFNT wrapper\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n    }\n\n    /* in case of a font format check, simply exit now */\n    if ( face_index < 0 )\n      goto Exit;\n\n    /* now, parse the top-level font dictionary */\n    FT_TRACE4(( \"parsing top-level\\n\" ));\n    error = cff_subfont_load( &font->top_font,\n                              &font->font_dict_index,\n                              subfont_index,\n                              stream,\n                              base_offset,\n                              library );\n    if ( error )\n      goto Exit;\n\n    if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )\n      goto Exit;\n\n    error = cff_index_init( &font->charstrings_index, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    /* now, check for a CID font */\n    if ( dict->cid_registry != 0xFFFFU )\n    {\n      CFF_IndexRec  fd_index;\n      CFF_SubFont   sub = NULL;\n      FT_UInt       idx;\n\n\n      /* this is a CID-keyed font, we must now allocate a table of */\n      /* sub-fonts, then load each of them separately              */\n      if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) )\n        goto Exit;\n\n      error = cff_index_init( &fd_index, stream, 0 );\n      if ( error )\n        goto Exit;\n\n      if ( fd_index.count > CFF_MAX_CID_FONTS )\n      {\n        FT_TRACE0(( \"cff_font_load: FD array too large in CID font\\n\" ));\n        goto Fail_CID;\n      }\n\n      /* allocate & read each font dict independently */\n      font->num_subfonts = fd_index.count;\n      if ( FT_NEW_ARRAY( sub, fd_index.count ) )\n        goto Fail_CID;\n\n      /* set up pointer table */\n      for ( idx = 0; idx < fd_index.count; idx++ )\n        font->subfonts[idx] = sub + idx;\n\n      /* now load each subfont independently */\n      for ( idx = 0; idx < fd_index.count; idx++ )\n      {\n        sub = font->subfonts[idx];\n        FT_TRACE4(( \"parsing subfont %u\\n\", idx ));\n        error = cff_subfont_load( sub, &fd_index, idx,\n                                  stream, base_offset, library );\n        if ( error )\n          goto Fail_CID;\n      }\n\n      /* now load the FD Select array */\n      error = CFF_Load_FD_Select( &font->fd_select,\n                                  font->charstrings_index.count,\n                                  stream,\n                                  base_offset + dict->cid_fd_select_offset );\n\n    Fail_CID:\n      cff_index_done( &fd_index );\n\n      if ( error )\n        goto Exit;\n    }\n    else\n      font->num_subfonts = 0;\n\n    /* read the charstrings index now */\n    if ( dict->charstrings_offset == 0 )\n    {\n      FT_ERROR(( \"cff_font_load: no charstrings offset\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    font->num_glyphs = font->charstrings_index.count;\n\n    error = cff_index_get_pointers( &font->global_subrs_index,\n                                    &font->global_subrs, NULL );\n\n    if ( error )\n      goto Exit;\n\n    /* read the Charset and Encoding tables if available */\n    if ( font->num_glyphs > 0 )\n    {\n      FT_Bool  invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff );\n\n\n      error = cff_charset_load( &font->charset, font->num_glyphs, stream,\n                                base_offset, dict->charset_offset, invert );\n      if ( error )\n        goto Exit;\n\n      /* CID-keyed CFFs don't have an encoding */\n      if ( dict->cid_registry == 0xFFFFU )\n      {\n        error = cff_encoding_load( &font->encoding,\n                                   &font->charset,\n                                   font->num_glyphs,\n                                   stream,\n                                   base_offset,\n                                   dict->encoding_offset );\n        if ( error )\n          goto Exit;\n      }\n    }\n\n    /* get the font name (/CIDFontName for CID-keyed fonts, */\n    /* /FontName otherwise)                                 */\n    font->font_name = cff_index_get_name( font, subfont_index );\n\n  Exit:\n    cff_index_done( &string_index );\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_font_done( CFF_Font  font )\n  {\n    FT_Memory  memory = font->memory;\n    FT_UInt    idx;\n\n\n    cff_index_done( &font->global_subrs_index );\n    cff_index_done( &font->font_dict_index );\n    cff_index_done( &font->name_index );\n    cff_index_done( &font->charstrings_index );\n\n    /* release font dictionaries, but only if working with */\n    /* a CID keyed CFF font                                */\n    if ( font->num_subfonts > 0 )\n    {\n      for ( idx = 0; idx < font->num_subfonts; idx++ )\n        cff_subfont_done( memory, font->subfonts[idx] );\n\n      /* the subfonts array has been allocated as a single block */\n      FT_FREE( font->subfonts[0] );\n    }\n\n    cff_encoding_done( &font->encoding );\n    cff_charset_done( &font->charset, font->stream );\n\n    cff_subfont_done( memory, &font->top_font );\n\n    CFF_Done_FD_Select( &font->fd_select, font->stream );\n\n    FT_FREE( font->font_info );\n\n    FT_FREE( font->font_name );\n    FT_FREE( font->global_subrs );\n    FT_FREE( font->strings );\n    FT_FREE( font->string_pool );\n\n    if ( font->cf2_instance.finalizer )\n    {\n      font->cf2_instance.finalizer( font->cf2_instance.data );\n      FT_FREE( font->cf2_instance.data );\n    }\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffload.h                                                              */\n/*                                                                         */\n/*    OpenType & CFF data/program tables loader (specification).           */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2007, 2008, 2010 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFLOAD_H__\n#define __CFFLOAD_H__\n\n\n#include <ft2build.h>\n#include \"cfftypes.h\"\n\n\nFT_BEGIN_HEADER\n\n  FT_LOCAL( FT_UShort )\n  cff_get_standard_encoding( FT_UInt  charcode );\n\n\n  FT_LOCAL( FT_String* )\n  cff_index_get_string( CFF_Font  font,\n                        FT_UInt   element );\n\n  FT_LOCAL( FT_String* )\n  cff_index_get_sid_string( CFF_Font  font,\n                            FT_UInt   sid );\n\n\n  FT_LOCAL( FT_Error )\n  cff_index_access_element( CFF_Index  idx,\n                            FT_UInt    element,\n                            FT_Byte**  pbytes,\n                            FT_ULong*  pbyte_len );\n\n  FT_LOCAL( void )\n  cff_index_forget_element( CFF_Index  idx,\n                            FT_Byte**  pbytes );\n\n  FT_LOCAL( FT_String* )\n  cff_index_get_name( CFF_Font  font,\n                      FT_UInt   element );\n\n\n  FT_LOCAL( FT_UInt )\n  cff_charset_cid_to_gindex( CFF_Charset  charset,\n                             FT_UInt      cid );\n\n\n  FT_LOCAL( FT_Error )\n  cff_font_load( FT_Library library,\n                 FT_Stream  stream,\n                 FT_Int     face_index,\n                 CFF_Font   font,\n                 FT_Bool    pure_cff );\n\n  FT_LOCAL( void )\n  cff_font_done( CFF_Font  font );\n\n\n  FT_LOCAL( FT_Byte )\n  cff_fd_select_get( CFF_FDSelect  fdselect,\n                     FT_UInt       glyph_index );\n\n\nFT_END_HEADER\n\n#endif /* __CFFLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffobjs.c                                                              */\n/*                                                                         */\n/*    OpenType objects manager (body).                                     */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_STREAM_H\n#include FT_ERRORS_H\n#include FT_TRUETYPE_IDS_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_INTERNAL_SFNT_H\n#include FT_CFF_DRIVER_H\n\n#include \"cffobjs.h\"\n#include \"cffload.h\"\n#include \"cffcmap.h\"\n#include \"cffpic.h\"\n\n#include \"cfferrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffobjs\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SIZE FUNCTIONS                             */\n  /*                                                                       */\n  /*  Note that we store the global hints in the size's `internal' root    */\n  /*  field.                                                               */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static PSH_Globals_Funcs\n  cff_size_get_globals_funcs( CFF_Size  size )\n  {\n    CFF_Face          face     = (CFF_Face)size->root.face;\n    CFF_Font          font     = (CFF_Font)face->extra.data;\n    PSHinter_Service  pshinter = font->pshinter;\n    FT_Module         module;\n\n\n    module = FT_Get_Module( size->root.face->driver->root.library,\n                            \"pshinter\" );\n    return ( module && pshinter && pshinter->get_globals_funcs )\n           ? pshinter->get_globals_funcs( module )\n           : 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_size_done( FT_Size  cffsize )        /* CFF_Size */\n  {\n    CFF_Size      size     = (CFF_Size)cffsize;\n    CFF_Face      face     = (CFF_Face)size->root.face;\n    CFF_Font      font     = (CFF_Font)face->extra.data;\n    CFF_Internal  internal = (CFF_Internal)cffsize->internal;\n\n\n    if ( internal )\n    {\n      PSH_Globals_Funcs  funcs;\n\n\n      funcs = cff_size_get_globals_funcs( size );\n      if ( funcs )\n      {\n        FT_UInt  i;\n\n\n        funcs->destroy( internal->topfont );\n\n        for ( i = font->num_subfonts; i > 0; i-- )\n          funcs->destroy( internal->subfonts[i - 1] );\n      }\n\n      /* `internal' is freed by destroy_size (in ftobjs.c) */\n    }\n  }\n\n\n  /* CFF and Type 1 private dictionaries have slightly different      */\n  /* structures; we need to synthesize a Type 1 dictionary on the fly */\n\n  static void\n  cff_make_private_dict( CFF_SubFont  subfont,\n                         PS_Private   priv )\n  {\n    CFF_Private  cpriv = &subfont->private_dict;\n    FT_UInt      n, count;\n\n\n    FT_MEM_ZERO( priv, sizeof ( *priv ) );\n\n    count = priv->num_blue_values = cpriv->num_blue_values;\n    for ( n = 0; n < count; n++ )\n      priv->blue_values[n] = (FT_Short)cpriv->blue_values[n];\n\n    count = priv->num_other_blues = cpriv->num_other_blues;\n    for ( n = 0; n < count; n++ )\n      priv->other_blues[n] = (FT_Short)cpriv->other_blues[n];\n\n    count = priv->num_family_blues = cpriv->num_family_blues;\n    for ( n = 0; n < count; n++ )\n      priv->family_blues[n] = (FT_Short)cpriv->family_blues[n];\n\n    count = priv->num_family_other_blues = cpriv->num_family_other_blues;\n    for ( n = 0; n < count; n++ )\n      priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n];\n\n    priv->blue_scale = cpriv->blue_scale;\n    priv->blue_shift = (FT_Int)cpriv->blue_shift;\n    priv->blue_fuzz  = (FT_Int)cpriv->blue_fuzz;\n\n    priv->standard_width[0]  = (FT_UShort)cpriv->standard_width;\n    priv->standard_height[0] = (FT_UShort)cpriv->standard_height;\n\n    count = priv->num_snap_widths = cpriv->num_snap_widths;\n    for ( n = 0; n < count; n++ )\n      priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n];\n\n    count = priv->num_snap_heights = cpriv->num_snap_heights;\n    for ( n = 0; n < count; n++ )\n      priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n];\n\n    priv->force_bold     = cpriv->force_bold;\n    priv->language_group = cpriv->language_group;\n    priv->lenIV          = cpriv->lenIV;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_size_init( FT_Size  cffsize )         /* CFF_Size */\n  {\n    CFF_Size           size  = (CFF_Size)cffsize;\n    FT_Error           error = FT_Err_Ok;\n    PSH_Globals_Funcs  funcs = cff_size_get_globals_funcs( size );\n\n\n    if ( funcs )\n    {\n      CFF_Face      face     = (CFF_Face)cffsize->face;\n      CFF_Font      font     = (CFF_Font)face->extra.data;\n      CFF_Internal  internal = NULL;\n\n      PS_PrivateRec  priv;\n      FT_Memory      memory = cffsize->face->memory;\n\n      FT_UInt  i;\n\n\n      if ( FT_NEW( internal ) )\n        goto Exit;\n\n      cff_make_private_dict( &font->top_font, &priv );\n      error = funcs->create( cffsize->face->memory, &priv,\n                             &internal->topfont );\n      if ( error )\n        goto Exit;\n\n      for ( i = font->num_subfonts; i > 0; i-- )\n      {\n        CFF_SubFont  sub = font->subfonts[i - 1];\n\n\n        cff_make_private_dict( sub, &priv );\n        error = funcs->create( cffsize->face->memory, &priv,\n                               &internal->subfonts[i - 1] );\n        if ( error )\n          goto Exit;\n      }\n\n      cffsize->internal = (FT_Size_Internal)(void*)internal;\n    }\n\n    size->strike_index = 0xFFFFFFFFUL;\n\n  Exit:\n    return error;\n  }\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_size_select( FT_Size   size,\n                   FT_ULong  strike_index )\n  {\n    CFF_Size           cffsize = (CFF_Size)size;\n    PSH_Globals_Funcs  funcs;\n\n\n    cffsize->strike_index = strike_index;\n\n    FT_Select_Metrics( size->face, strike_index );\n\n    funcs = cff_size_get_globals_funcs( cffsize );\n\n    if ( funcs )\n    {\n      CFF_Face      face     = (CFF_Face)size->face;\n      CFF_Font      font     = (CFF_Font)face->extra.data;\n      CFF_Internal  internal = (CFF_Internal)size->internal;\n\n      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;\n      FT_UInt   i;\n\n\n      funcs->set_scale( internal->topfont,\n                        size->metrics.x_scale, size->metrics.y_scale,\n                        0, 0 );\n\n      for ( i = font->num_subfonts; i > 0; i-- )\n      {\n        CFF_SubFont  sub     = font->subfonts[i - 1];\n        FT_ULong     sub_upm = sub->font_dict.units_per_em;\n        FT_Pos       x_scale, y_scale;\n\n\n        if ( top_upm != sub_upm )\n        {\n          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );\n          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );\n        }\n        else\n        {\n          x_scale = size->metrics.x_scale;\n          y_scale = size->metrics.y_scale;\n        }\n\n        funcs->set_scale( internal->subfonts[i - 1],\n                          x_scale, y_scale, 0, 0 );\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_size_request( FT_Size          size,\n                    FT_Size_Request  req )\n  {\n    CFF_Size           cffsize = (CFF_Size)size;\n    PSH_Globals_Funcs  funcs;\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n    if ( FT_HAS_FIXED_SIZES( size->face ) )\n    {\n      CFF_Face      cffface = (CFF_Face)size->face;\n      SFNT_Service  sfnt    = (SFNT_Service)cffface->sfnt;\n      FT_ULong      strike_index;\n\n\n      if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) )\n        cffsize->strike_index = 0xFFFFFFFFUL;\n      else\n        return cff_size_select( size, strike_index );\n    }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n    FT_Request_Metrics( size->face, req );\n\n    funcs = cff_size_get_globals_funcs( cffsize );\n\n    if ( funcs )\n    {\n      CFF_Face      cffface  = (CFF_Face)size->face;\n      CFF_Font      font     = (CFF_Font)cffface->extra.data;\n      CFF_Internal  internal = (CFF_Internal)size->internal;\n\n      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;\n      FT_UInt   i;\n\n\n      funcs->set_scale( internal->topfont,\n                        size->metrics.x_scale, size->metrics.y_scale,\n                        0, 0 );\n\n      for ( i = font->num_subfonts; i > 0; i-- )\n      {\n        CFF_SubFont  sub     = font->subfonts[i - 1];\n        FT_ULong     sub_upm = sub->font_dict.units_per_em;\n        FT_Pos       x_scale, y_scale;\n\n\n        if ( top_upm != sub_upm )\n        {\n          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );\n          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );\n        }\n        else\n        {\n          x_scale = size->metrics.x_scale;\n          y_scale = size->metrics.y_scale;\n        }\n\n        funcs->set_scale( internal->subfonts[i - 1],\n                          x_scale, y_scale, 0, 0 );\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SLOT  FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  cff_slot_done( FT_GlyphSlot  slot )\n  {\n    slot->internal->glyph_hints = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_slot_init( FT_GlyphSlot  slot )\n  {\n    CFF_Face          face     = (CFF_Face)slot->face;\n    CFF_Font          font     = (CFF_Font)face->extra.data;\n    PSHinter_Service  pshinter = font->pshinter;\n\n\n    if ( pshinter )\n    {\n      FT_Module  module;\n\n\n      module = FT_Get_Module( slot->face->driver->root.library,\n                              \"pshinter\" );\n      if ( module )\n      {\n        T2_Hints_Funcs  funcs;\n\n\n        funcs = pshinter->get_t2_funcs( module );\n        slot->internal->glyph_hints = (void*)funcs;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                           FACE  FUNCTIONS                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n  static FT_String*\n  cff_strcpy( FT_Memory         memory,\n              const FT_String*  source )\n  {\n    FT_Error    error;\n    FT_String*  result;\n\n\n    (void)FT_STRDUP( result, source );\n\n    FT_UNUSED( error );\n\n    return result;\n  }\n\n\n  /* Strip all subset prefixes of the form `ABCDEF+'.  Usually, there */\n  /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold'   */\n  /* have been seen in the wild.                                      */\n\n  static void\n  remove_subset_prefix( FT_String*  name )\n  {\n    FT_Int32  idx             = 0;\n    FT_Int32  length          = strlen( name ) + 1;\n    FT_Bool   continue_search = 1;\n\n\n    while ( continue_search )\n    {\n      if ( length >= 7 && name[6] == '+' )\n      {\n        for ( idx = 0; idx < 6; idx++ )\n        {\n          /* ASCII uppercase letters */\n          if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )\n            continue_search = 0;\n        }\n\n        if ( continue_search )\n        {\n          for ( idx = 7; idx < length; idx++ )\n            name[idx - 7] = name[idx];\n          length -= 7;\n        }\n      }\n      else\n        continue_search = 0;\n    }\n  }\n\n\n  /* Remove the style part from the family name (if present). */\n\n  static void\n  remove_style( FT_String*        family_name,\n                const FT_String*  style_name )\n  {\n    FT_Int32  family_name_length, style_name_length;\n\n\n    family_name_length = strlen( family_name );\n    style_name_length  = strlen( style_name );\n\n    if ( family_name_length > style_name_length )\n    {\n      FT_Int  idx;\n\n\n      for ( idx = 1; idx <= style_name_length; ++idx )\n      {\n        if ( family_name[family_name_length - idx] !=\n             style_name[style_name_length - idx] )\n          break;\n      }\n\n      if ( idx > style_name_length )\n      {\n        /* family_name ends with style_name; remove it */\n        idx = family_name_length - style_name_length - 1;\n\n        /* also remove special characters     */\n        /* between real family name and style */\n        while ( idx > 0                     &&\n                ( family_name[idx] == '-' ||\n                  family_name[idx] == ' ' ||\n                  family_name[idx] == '_' ||\n                  family_name[idx] == '+' ) )\n          --idx;\n\n        if ( idx > 0 )\n          family_name[idx + 1] = '\\0';\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_face_init( FT_Stream      stream,\n                 FT_Face        cffface,        /* CFF_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params )\n  {\n    CFF_Face            face        = (CFF_Face)cffface;\n    FT_Error            error;\n    SFNT_Service        sfnt;\n    FT_Service_PsCMaps  psnames;\n    PSHinter_Service    pshinter;\n    FT_Bool             pure_cff    = 1;\n    FT_Bool             sfnt_format = 0;\n    FT_Library          library     = cffface->driver->root.library;\n\n\n    sfnt = (SFNT_Service)FT_Get_Module_Interface(\n             library, \"sfnt\" );\n    if ( !sfnt )\n    {\n      FT_ERROR(( \"cff_face_init: cannot access `sfnt' module\\n\" ));\n      error = FT_THROW( Missing_Module );\n      goto Exit;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );\n\n    pshinter = (PSHinter_Service)FT_Get_Module_Interface(\n                 library, \"pshinter\" );\n\n    FT_TRACE2(( \"CFF driver\\n\" ));\n\n    /* create input stream from resource */\n    if ( FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    /* check whether we have a valid OpenType file */\n    error = sfnt->init_face( stream, face, face_index, num_params, params );\n    if ( !error )\n    {\n      if ( face->format_tag != TTAG_OTTO )  /* `OTTO'; OpenType/CFF font */\n      {\n        FT_TRACE2(( \"  not an OpenType/CFF font\\n\" ));\n        error = FT_THROW( Unknown_File_Format );\n        goto Exit;\n      }\n\n      /* if we are performing a simple font format check, exit immediately */\n      if ( face_index < 0 )\n        return FT_Err_Ok;\n\n      sfnt_format = 1;\n\n      /* now, the font can be either an OpenType/CFF font, or an SVG CEF */\n      /* font; in the latter case it doesn't have a `head' table         */\n      error = face->goto_table( face, TTAG_head, stream, 0 );\n      if ( !error )\n      {\n        pure_cff = 0;\n\n        /* load font directory */\n        error = sfnt->load_face( stream, face, face_index,\n                                 num_params, params );\n        if ( error )\n          goto Exit;\n      }\n      else\n      {\n        /* load the `cmap' table explicitly */\n        error = sfnt->load_cmap( face, stream );\n        if ( error )\n          goto Exit;\n      }\n\n      /* now load the CFF part of the file */\n      error = face->goto_table( face, TTAG_CFF, stream, 0 );\n      if ( error )\n        goto Exit;\n    }\n    else\n    {\n      /* rewind to start of file; we are going to load a pure-CFF font */\n      if ( FT_STREAM_SEEK( 0 ) )\n        goto Exit;\n      error = FT_Err_Ok;\n    }\n\n    /* now load and parse the CFF table in the file */\n    {\n      CFF_Font         cff = NULL;\n      CFF_FontRecDict  dict;\n      FT_Memory        memory = cffface->memory;\n      FT_Int32         flags;\n      FT_UInt          i;\n\n\n      if ( FT_NEW( cff ) )\n        goto Exit;\n\n      face->extra.data = cff;\n      error = cff_font_load( library, stream, face_index, cff, pure_cff );\n      if ( error )\n        goto Exit;\n\n      cff->pshinter = pshinter;\n      cff->psnames  = psnames;\n\n      cffface->face_index = face_index;\n\n      /* Complement the root flags with some interesting information. */\n      /* Note that this is only necessary for pure CFF and CEF fonts; */\n      /* SFNT based fonts use the `name' table instead.               */\n\n      cffface->num_glyphs = cff->num_glyphs;\n\n      dict = &cff->top_font.font_dict;\n\n      /* we need the `PSNames' module for CFF and CEF formats */\n      /* which aren't CID-keyed                               */\n      if ( dict->cid_registry == 0xFFFFU && !psnames )\n      {\n        FT_ERROR(( \"cff_face_init:\"\n                   \" cannot open CFF & CEF fonts\\n\"\n                   \"              \"\n                   \" without the `PSNames' module\\n\" ));\n        error = FT_THROW( Missing_Module );\n        goto Exit;\n      }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n      {\n        FT_UInt     idx;\n        FT_String*  s;\n\n\n        FT_TRACE4(( \"SIDs\\n\" ));\n\n        /* dump string index, including default strings for convenience */\n        for ( idx = 0; idx < cff->num_strings + 390; idx++ )\n        {\n          s = cff_index_get_sid_string( cff, idx );\n          if ( s )\n            FT_TRACE4((\"  %5d %s\\n\", idx, s ));\n        }\n      }\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n      if ( !dict->has_font_matrix )\n        dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;\n\n      /* Normalize the font matrix so that `matrix->xx' is 1; the */\n      /* scaling is done with `units_per_em' then (at this point, */\n      /* it already contains the scaling factor, but without      */\n      /* normalization of the matrix).                            */\n      /*                                                          */\n      /* Note that the offsets must be expressed in integer font  */\n      /* units.                                                   */\n\n      {\n        FT_Matrix*  matrix = &dict->font_matrix;\n        FT_Vector*  offset = &dict->font_offset;\n        FT_ULong*   upm    = &dict->units_per_em;\n        FT_Fixed    temp   = FT_ABS( matrix->yy );\n\n\n        if ( temp != 0x10000L )\n        {\n          *upm = FT_DivFix( *upm, temp );\n\n          matrix->xx = FT_DivFix( matrix->xx, temp );\n          matrix->yx = FT_DivFix( matrix->yx, temp );\n          matrix->xy = FT_DivFix( matrix->xy, temp );\n          matrix->yy = FT_DivFix( matrix->yy, temp );\n          offset->x  = FT_DivFix( offset->x,  temp );\n          offset->y  = FT_DivFix( offset->y,  temp );\n        }\n\n        offset->x >>= 16;\n        offset->y >>= 16;\n      }\n\n      for ( i = cff->num_subfonts; i > 0; i-- )\n      {\n        CFF_FontRecDict  sub = &cff->subfonts[i - 1]->font_dict;\n        CFF_FontRecDict  top = &cff->top_font.font_dict;\n\n        FT_Matrix*  matrix;\n        FT_Vector*  offset;\n        FT_ULong*   upm;\n        FT_Fixed    temp;\n\n\n        if ( sub->has_font_matrix )\n        {\n          FT_Long  scaling;\n\n\n          /* if we have a top-level matrix, */\n          /* concatenate the subfont matrix */\n\n          if ( top->has_font_matrix )\n          {\n            if ( top->units_per_em > 1 && sub->units_per_em > 1 )\n              scaling = FT_MIN( top->units_per_em, sub->units_per_em );\n            else\n              scaling = 1;\n\n            FT_Matrix_Multiply_Scaled( &top->font_matrix,\n                                       &sub->font_matrix,\n                                       scaling );\n            FT_Vector_Transform_Scaled( &sub->font_offset,\n                                        &top->font_matrix,\n                                        scaling );\n\n            sub->units_per_em = FT_MulDiv( sub->units_per_em,\n                                           top->units_per_em,\n                                           scaling );\n          }\n        }\n        else\n        {\n          sub->font_matrix = top->font_matrix;\n          sub->font_offset = top->font_offset;\n\n          sub->units_per_em = top->units_per_em;\n        }\n\n        matrix = &sub->font_matrix;\n        offset = &sub->font_offset;\n        upm    = &sub->units_per_em;\n        temp   = FT_ABS( matrix->yy );\n\n        if ( temp != 0x10000L )\n        {\n          *upm = FT_DivFix( *upm, temp );\n\n          matrix->xx = FT_DivFix( matrix->xx, temp );\n          matrix->yx = FT_DivFix( matrix->yx, temp );\n          matrix->xy = FT_DivFix( matrix->xy, temp );\n          matrix->yy = FT_DivFix( matrix->yy, temp );\n          offset->x  = FT_DivFix( offset->x,  temp );\n          offset->y  = FT_DivFix( offset->y,  temp );\n        }\n\n        offset->x >>= 16;\n        offset->y >>= 16;\n      }\n\n      if ( pure_cff )\n      {\n        char*  style_name = NULL;\n\n\n        /* set up num_faces */\n        cffface->num_faces = cff->num_faces;\n\n        /* compute number of glyphs */\n        if ( dict->cid_registry != 0xFFFFU )\n          cffface->num_glyphs = cff->charset.max_cid + 1;\n        else\n          cffface->num_glyphs = cff->charstrings_index.count;\n\n        /* set global bbox, as well as EM size */\n        cffface->bbox.xMin =   dict->font_bbox.xMin            >> 16;\n        cffface->bbox.yMin =   dict->font_bbox.yMin            >> 16;\n        /* no `U' suffix here to 0xFFFF! */\n        cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16;\n        cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16;\n\n        cffface->units_per_EM = (FT_UShort)( dict->units_per_em );\n\n        cffface->ascender  = (FT_Short)( cffface->bbox.yMax );\n        cffface->descender = (FT_Short)( cffface->bbox.yMin );\n\n        cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 );\n        if ( cffface->height < cffface->ascender - cffface->descender )\n          cffface->height = (FT_Short)( cffface->ascender - cffface->descender );\n\n        cffface->underline_position  =\n          (FT_Short)( dict->underline_position >> 16 );\n        cffface->underline_thickness =\n          (FT_Short)( dict->underline_thickness >> 16 );\n\n        /* retrieve font family & style name */\n        cffface->family_name = cff_index_get_name( cff, face_index );\n        if ( cffface->family_name )\n        {\n          char*  full   = cff_index_get_sid_string( cff,\n                                                    dict->full_name );\n          char*  fullp  = full;\n          char*  family = cffface->family_name;\n          char*  family_name = NULL;\n\n\n          remove_subset_prefix( cffface->family_name );\n\n          if ( dict->family_name )\n          {\n            family_name = cff_index_get_sid_string( cff,\n                                                    dict->family_name );\n            if ( family_name )\n              family = family_name;\n          }\n\n          /* We try to extract the style name from the full name.   */\n          /* We need to ignore spaces and dashes during the search. */\n          if ( full && family )\n          {\n            while ( *fullp )\n            {\n              /* skip common characters at the start of both strings */\n              if ( *fullp == *family )\n              {\n                family++;\n                fullp++;\n                continue;\n              }\n\n              /* ignore spaces and dashes in full name during comparison */\n              if ( *fullp == ' ' || *fullp == '-' )\n              {\n                fullp++;\n                continue;\n              }\n\n              /* ignore spaces and dashes in family name during comparison */\n              if ( *family == ' ' || *family == '-' )\n              {\n                family++;\n                continue;\n              }\n\n              if ( !*family && *fullp )\n              {\n                /* The full name begins with the same characters as the  */\n                /* family name, with spaces and dashes removed.  In this */\n                /* case, the remaining string in `fullp' will be used as */\n                /* the style name.                                       */\n                style_name = cff_strcpy( memory, fullp );\n\n                /* remove the style part from the family name (if present) */\n                remove_style( cffface->family_name, style_name );\n              }\n              break;\n            }\n          }\n        }\n        else\n        {\n          char  *cid_font_name =\n                   cff_index_get_sid_string( cff,\n                                             dict->cid_font_name );\n\n\n          /* do we have a `/FontName' for a CID-keyed font? */\n          if ( cid_font_name )\n            cffface->family_name = cff_strcpy( memory, cid_font_name );\n        }\n\n        if ( style_name )\n          cffface->style_name = style_name;\n        else\n          /* assume \"Regular\" style if we don't know better */\n          cffface->style_name = cff_strcpy( memory, (char *)\"Regular\" );\n\n        /*******************************************************************/\n        /*                                                                 */\n        /* Compute face flags.                                             */\n        /*                                                                 */\n        flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */\n                FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */\n                FT_FACE_FLAG_HINTER;      /* has native hinter */\n\n        if ( sfnt_format )\n          flags |= FT_FACE_FLAG_SFNT;\n\n        /* fixed width font? */\n        if ( dict->is_fixed_pitch )\n          flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n  /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */\n#if 0\n        /* kerning available? */\n        if ( face->kern_pairs )\n          flags |= FT_FACE_FLAG_KERNING;\n#endif\n\n        cffface->face_flags = flags;\n\n        /*******************************************************************/\n        /*                                                                 */\n        /* Compute style flags.                                            */\n        /*                                                                 */\n        flags = 0;\n\n        if ( dict->italic_angle )\n          flags |= FT_STYLE_FLAG_ITALIC;\n\n        {\n          char  *weight = cff_index_get_sid_string( cff,\n                                                    dict->weight );\n\n\n          if ( weight )\n            if ( !ft_strcmp( weight, \"Bold\"  ) ||\n                 !ft_strcmp( weight, \"Black\" ) )\n              flags |= FT_STYLE_FLAG_BOLD;\n        }\n\n        /* double check */\n        if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name )\n          if ( !ft_strncmp( cffface->style_name, \"Bold\", 4 )  ||\n               !ft_strncmp( cffface->style_name, \"Black\", 5 ) )\n            flags |= FT_STYLE_FLAG_BOLD;\n\n        cffface->style_flags = flags;\n      }\n\n\n#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES\n      /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */\n      /* has unset this flag because of the 3.0 `post' table.          */\n      if ( dict->cid_registry == 0xFFFFU )\n        cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;\n#endif\n\n      if ( dict->cid_registry != 0xFFFFU && pure_cff )\n        cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;\n\n\n      /*******************************************************************/\n      /*                                                                 */\n      /* Compute char maps.                                              */\n      /*                                                                 */\n\n      /* Try to synthesize a Unicode charmap if there is none available */\n      /* already.  If an OpenType font contains a Unicode \"cmap\", we    */\n      /* will use it, whatever be in the CFF part of the file.          */\n      {\n        FT_CharMapRec  cmaprec;\n        FT_CharMap     cmap;\n        FT_UInt        nn;\n        CFF_Encoding   encoding = &cff->encoding;\n\n\n        for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ )\n        {\n          cmap = cffface->charmaps[nn];\n\n          /* Windows Unicode? */\n          if ( cmap->platform_id == TT_PLATFORM_MICROSOFT &&\n               cmap->encoding_id == TT_MS_ID_UNICODE_CS   )\n            goto Skip_Unicode;\n\n          /* Apple Unicode platform id? */\n          if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE )\n            goto Skip_Unicode; /* Apple Unicode */\n        }\n\n        /* since CID-keyed fonts don't contain glyph names, we can't */\n        /* construct a cmap                                          */\n        if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU )\n          goto Exit;\n\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"cff_face_init: no Unicode cmap is found, \"\n                     \"and too many subtables (%d) to add synthesized cmap\\n\",\n                     nn ));\n          goto Exit;\n        }\n#endif\n\n        /* we didn't find a Unicode charmap -- synthesize one */\n        cmaprec.face        = cffface;\n        cmaprec.platform_id = TT_PLATFORM_MICROSOFT;\n        cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;\n        cmaprec.encoding    = FT_ENCODING_UNICODE;\n\n        nn = (FT_UInt)cffface->num_charmaps;\n\n        error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL,\n                             &cmaprec, NULL );\n        if ( error                                      &&\n             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )\n          goto Exit;\n        error = FT_Err_Ok;\n\n        /* if no Unicode charmap was previously selected, select this one */\n        if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps )\n          cffface->charmap = cffface->charmaps[nn];\n\n      Skip_Unicode:\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n        if ( nn > FT_MAX_CHARMAP_CACHEABLE )\n        {\n          FT_ERROR(( \"cff_face_init: Unicode cmap is found, \"\n                     \"but too many preceding subtables (%d) to access\\n\",\n                     nn - 1 ));\n          goto Exit;\n        }\n#endif\n        if ( encoding->count > 0 )\n        {\n          FT_CMap_Class  clazz;\n\n\n          cmaprec.face        = cffface;\n          cmaprec.platform_id = TT_PLATFORM_ADOBE;  /* Adobe platform id */\n\n          if ( encoding->offset == 0 )\n          {\n            cmaprec.encoding_id = TT_ADOBE_ID_STANDARD;\n            cmaprec.encoding    = FT_ENCODING_ADOBE_STANDARD;\n            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;\n          }\n          else if ( encoding->offset == 1 )\n          {\n            cmaprec.encoding_id = TT_ADOBE_ID_EXPERT;\n            cmaprec.encoding    = FT_ENCODING_ADOBE_EXPERT;\n            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;\n          }\n          else\n          {\n            cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM;\n            cmaprec.encoding    = FT_ENCODING_ADOBE_CUSTOM;\n            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;\n          }\n\n          error = FT_CMap_New( clazz, NULL, &cmaprec, NULL );\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_face_done( FT_Face  cffface )         /* CFF_Face */\n  {\n    CFF_Face      face = (CFF_Face)cffface;\n    FT_Memory     memory;\n    SFNT_Service  sfnt;\n\n\n    if ( !face )\n      return;\n\n    memory = cffface->memory;\n    sfnt   = (SFNT_Service)face->sfnt;\n\n    if ( sfnt )\n      sfnt->done_face( face );\n\n    {\n      CFF_Font  cff = (CFF_Font)face->extra.data;\n\n\n      if ( cff )\n      {\n        cff_font_done( cff );\n        FT_FREE( face->extra.data );\n      }\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_driver_init( FT_Module  module )        /* CFF_Driver */\n  {\n    CFF_Driver  driver = (CFF_Driver)module;\n\n\n    /* set default property values */\n    driver->hinting_engine    = FT_CFF_HINTING_FREETYPE;\n    driver->no_stem_darkening = FALSE;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cff_driver_done( FT_Module  module )        /* CFF_Driver */\n  {\n    FT_UNUSED( module );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffobjs.h                                                              */\n/*                                                                         */\n/*    OpenType objects manager (specification).                            */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2008, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFOBJS_H__\n#define __CFFOBJS_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include \"cfftypes.h\"\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CFF_Driver                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an OpenType driver object.                             */\n  /*                                                                       */\n  typedef struct CFF_DriverRec_*  CFF_Driver;\n\n  typedef TT_Face  CFF_Face;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CFF_Size                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an OpenType size object.                               */\n  /*                                                                       */\n  typedef struct  CFF_SizeRec_\n  {\n    FT_SizeRec  root;\n    FT_ULong    strike_index;    /* 0xFFFFFFFF to indicate invalid */\n\n  } CFF_SizeRec, *CFF_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CFF_GlyphSlot                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to an OpenType glyph slot object.                         */\n  /*                                                                       */\n  typedef struct  CFF_GlyphSlotRec_\n  {\n    FT_GlyphSlotRec  root;\n\n    FT_Bool          hint;\n    FT_Bool          scaled;\n\n    FT_Fixed         x_scale;\n    FT_Fixed         y_scale;\n\n  } CFF_GlyphSlotRec, *CFF_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CFF_Internal                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The interface to the `internal' field of `FT_Size'.                */\n  /*                                                                       */\n  typedef struct  CFF_InternalRec_\n  {\n    PSH_Globals  topfont;\n    PSH_Globals  subfonts[CFF_MAX_CID_FONTS];\n\n  } CFF_InternalRec, *CFF_Internal;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Subglyph transformation record.                                       */\n  /*                                                                       */\n  typedef struct  CFF_Transform_\n  {\n    FT_Fixed    xx, xy;     /* transformation matrix coefficients */\n    FT_Fixed    yx, yy;\n    FT_F26Dot6  ox, oy;     /* offsets        */\n\n  } CFF_Transform;\n\n\n  /***********************************************************************/\n  /*                                                                     */\n  /* CFF driver class.                                                   */\n  /*                                                                     */\n  typedef struct  CFF_DriverRec_\n  {\n    FT_DriverRec  root;\n\n    FT_UInt  hinting_engine;\n    FT_Bool  no_stem_darkening;\n\n  } CFF_DriverRec;\n\n\n  FT_LOCAL( FT_Error )\n  cff_size_init( FT_Size  size );           /* CFF_Size */\n\n  FT_LOCAL( void )\n  cff_size_done( FT_Size  size );           /* CFF_Size */\n\n  FT_LOCAL( FT_Error )\n  cff_size_request( FT_Size          size,\n                    FT_Size_Request  req );\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  FT_LOCAL( FT_Error )\n  cff_size_select( FT_Size   size,\n                   FT_ULong  strike_index );\n\n#endif\n\n  FT_LOCAL( void )\n  cff_slot_done( FT_GlyphSlot  slot );\n\n  FT_LOCAL( FT_Error )\n  cff_slot_init( FT_GlyphSlot  slot );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Face functions                                                        */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  cff_face_init( FT_Stream      stream,\n                 FT_Face        face,           /* CFF_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  cff_face_done( FT_Face  face );               /* CFF_Face */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Driver functions                                                      */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  cff_driver_init( FT_Module  module );         /* CFF_Driver */\n\n  FT_LOCAL( void )\n  cff_driver_done( FT_Module  module );         /* CFF_Driver */\n\n\nFT_END_HEADER\n\n#endif /* __CFFOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffparse.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffparse.c                                                             */\n/*                                                                         */\n/*    CFF token stream parser (body)                                       */\n/*                                                                         */\n/*  Copyright 1996-2004, 2007-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include \"cffparse.h\"\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_DEBUG_H\n\n#include \"cfferrs.h\"\n#include \"cffpic.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cffparse\n\n\n  FT_LOCAL_DEF( void )\n  cff_parser_init( CFF_Parser  parser,\n                   FT_UInt     code,\n                   void*       object,\n                   FT_Library  library)\n  {\n    FT_MEM_ZERO( parser, sizeof ( *parser ) );\n\n    parser->top         = parser->stack;\n    parser->object_code = code;\n    parser->object      = object;\n    parser->library     = library;\n  }\n\n\n  /* read an integer */\n  static FT_Long\n  cff_parse_integer( FT_Byte*  start,\n                     FT_Byte*  limit )\n  {\n    FT_Byte*  p   = start;\n    FT_Int    v   = *p++;\n    FT_Long   val = 0;\n\n\n    if ( v == 28 )\n    {\n      if ( p + 2 > limit )\n        goto Bad;\n\n      val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );\n      p  += 2;\n    }\n    else if ( v == 29 )\n    {\n      if ( p + 4 > limit )\n        goto Bad;\n\n      val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |\n                       ( (FT_ULong)p[1] << 16 ) |\n                       ( (FT_ULong)p[2] <<  8 ) |\n                         (FT_ULong)p[3]         );\n      p += 4;\n    }\n    else if ( v < 247 )\n    {\n      val = v - 139;\n    }\n    else if ( v < 251 )\n    {\n      if ( p + 1 > limit )\n        goto Bad;\n\n      val = ( v - 247 ) * 256 + p[0] + 108;\n      p++;\n    }\n    else\n    {\n      if ( p + 1 > limit )\n        goto Bad;\n\n      val = -( v - 251 ) * 256 - p[0] - 108;\n      p++;\n    }\n\n  Exit:\n    return val;\n\n  Bad:\n    val = 0;\n    FT_TRACE4(( \"!!!END OF DATA:!!!\" ));\n    goto Exit;\n  }\n\n\n  static const FT_Long power_tens[] =\n  {\n    1L,\n    10L,\n    100L,\n    1000L,\n    10000L,\n    100000L,\n    1000000L,\n    10000000L,\n    100000000L,\n    1000000000L\n  };\n\n\n  /* read a real */\n  static FT_Fixed\n  cff_parse_real( FT_Byte*  start,\n                  FT_Byte*  limit,\n                  FT_Long   power_ten,\n                  FT_Long*  scaling )\n  {\n    FT_Byte*  p = start;\n    FT_UInt   nib;\n    FT_UInt   phase;\n\n    FT_Long   result, number, exponent;\n    FT_Int    sign = 0, exponent_sign = 0, have_overflow = 0;\n    FT_Long   exponent_add, integer_length, fraction_length;\n\n\n    if ( scaling )\n      *scaling = 0;\n\n    result = 0;\n\n    number   = 0;\n    exponent = 0;\n\n    exponent_add    = 0;\n    integer_length  = 0;\n    fraction_length = 0;\n\n    /* First of all, read the integer part. */\n    phase = 4;\n\n    for (;;)\n    {\n      /* If we entered this iteration with phase == 4, we need to */\n      /* read a new byte.  This also skips past the initial 0x1E. */\n      if ( phase )\n      {\n        p++;\n\n        /* Make sure we don't read past the end. */\n        if ( p >= limit )\n          goto Bad;\n      }\n\n      /* Get the nibble. */\n      nib   = ( p[0] >> phase ) & 0xF;\n      phase = 4 - phase;\n\n      if ( nib == 0xE )\n        sign = 1;\n      else if ( nib > 9 )\n        break;\n      else\n      {\n        /* Increase exponent if we can't add the digit. */\n        if ( number >= 0xCCCCCCCL )\n          exponent_add++;\n        /* Skip leading zeros. */\n        else if ( nib || number )\n        {\n          integer_length++;\n          number = number * 10 + nib;\n        }\n      }\n    }\n\n    /* Read fraction part, if any. */\n    if ( nib == 0xa )\n      for (;;)\n      {\n        /* If we entered this iteration with phase == 4, we need */\n        /* to read a new byte.                                   */\n        if ( phase )\n        {\n          p++;\n\n          /* Make sure we don't read past the end. */\n          if ( p >= limit )\n            goto Bad;\n        }\n\n        /* Get the nibble. */\n        nib   = ( p[0] >> phase ) & 0xF;\n        phase = 4 - phase;\n        if ( nib >= 10 )\n          break;\n\n        /* Skip leading zeros if possible. */\n        if ( !nib && !number )\n          exponent_add--;\n        /* Only add digit if we don't overflow. */\n        else if ( number < 0xCCCCCCCL && fraction_length < 9 )\n        {\n          fraction_length++;\n          number = number * 10 + nib;\n        }\n      }\n\n    /* Read exponent, if any. */\n    if ( nib == 12 )\n    {\n      exponent_sign = 1;\n      nib           = 11;\n    }\n\n    if ( nib == 11 )\n    {\n      for (;;)\n      {\n        /* If we entered this iteration with phase == 4, */\n        /* we need to read a new byte.                   */\n        if ( phase )\n        {\n          p++;\n\n          /* Make sure we don't read past the end. */\n          if ( p >= limit )\n            goto Bad;\n        }\n\n        /* Get the nibble. */\n        nib   = ( p[0] >> phase ) & 0xF;\n        phase = 4 - phase;\n        if ( nib >= 10 )\n          break;\n\n        /* Arbitrarily limit exponent. */\n        if ( exponent > 1000 )\n          have_overflow = 1;\n        else\n          exponent = exponent * 10 + nib;\n      }\n\n      if ( exponent_sign )\n        exponent = -exponent;\n    }\n\n    if ( !number )\n      goto Exit;\n\n    if ( have_overflow )\n    {\n      if ( exponent_sign )\n        goto Underflow;\n      else\n        goto Overflow;\n    }\n\n    /* We don't check `power_ten' and `exponent_add'. */\n    exponent += power_ten + exponent_add;\n\n    if ( scaling )\n    {\n      /* Only use `fraction_length'. */\n      fraction_length += integer_length;\n      exponent        += integer_length;\n\n      if ( fraction_length <= 5 )\n      {\n        if ( number > 0x7FFFL )\n        {\n          result   = FT_DivFix( number, 10 );\n          *scaling = exponent - fraction_length + 1;\n        }\n        else\n        {\n          if ( exponent > 0 )\n          {\n            FT_Long  new_fraction_length, shift;\n\n\n            /* Make `scaling' as small as possible. */\n            new_fraction_length = FT_MIN( exponent, 5 );\n            shift               = new_fraction_length - fraction_length;\n\n            if ( shift > 0 )\n            {\n              exponent -= new_fraction_length;\n              number   *= power_tens[shift];\n              if ( number > 0x7FFFL )\n              {\n                number   /= 10;\n                exponent += 1;\n              }\n            }\n            else\n              exponent -= fraction_length;\n          }\n          else\n            exponent -= fraction_length;\n\n          result   = (FT_Long)( (FT_ULong)number << 16 );\n          *scaling = exponent;\n        }\n      }\n      else\n      {\n        if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )\n        {\n          result   = FT_DivFix( number, power_tens[fraction_length - 4] );\n          *scaling = exponent - 4;\n        }\n        else\n        {\n          result   = FT_DivFix( number, power_tens[fraction_length - 5] );\n          *scaling = exponent - 5;\n        }\n      }\n    }\n    else\n    {\n      integer_length  += exponent;\n      fraction_length -= exponent;\n\n      if ( integer_length > 5 )\n        goto Overflow;\n      if ( integer_length < -5 )\n        goto Underflow;\n\n      /* Remove non-significant digits. */\n      if ( integer_length < 0 )\n      {\n        number          /= power_tens[-integer_length];\n        fraction_length += integer_length;\n      }\n\n      /* this can only happen if exponent was non-zero */\n      if ( fraction_length == 10 )\n      {\n        number          /= 10;\n        fraction_length -= 1;\n      }\n\n      /* Convert into 16.16 format. */\n      if ( fraction_length > 0 )\n      {\n        if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )\n          goto Exit;\n\n        result = FT_DivFix( number, power_tens[fraction_length] );\n      }\n      else\n      {\n        number *= power_tens[-fraction_length];\n\n        if ( number > 0x7FFFL )\n          goto Overflow;\n\n        result = (FT_Long)( (FT_ULong)number << 16 );\n      }\n    }\n\n  Exit:\n    if ( sign )\n      result = -result;\n\n    return result;\n\n  Overflow:\n    result = 0x7FFFFFFFL;\n    FT_TRACE4(( \"!!!OVERFLOW:!!!\" ));\n    goto Exit;\n\n  Underflow:\n    result = 0;\n    FT_TRACE4(( \"!!!UNDERFLOW:!!!\" ));\n    goto Exit;\n\n  Bad:\n    result = 0;\n    FT_TRACE4(( \"!!!END OF DATA:!!!\" ));\n    goto Exit;\n  }\n\n\n  /* read a number, either integer or real */\n  static FT_Long\n  cff_parse_num( FT_Byte**  d )\n  {\n    return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )\n                     :   cff_parse_integer( d[0], d[1] );\n  }\n\n\n  /* read a floating point number, either integer or real */\n  static FT_Fixed\n  do_fixed( FT_Byte**  d,\n            FT_Long    scaling )\n  {\n    if ( **d == 30 )\n      return cff_parse_real( d[0], d[1], scaling, NULL );\n    else\n    {\n      FT_Long  val = cff_parse_integer( d[0], d[1] );\n\n\n      if ( scaling )\n        val *= power_tens[scaling];\n\n      if ( val > 0x7FFF )\n      {\n        val = 0x7FFFFFFFL;\n        goto Overflow;\n      }\n      else if ( val < -0x7FFF )\n      {\n        val = -0x7FFFFFFFL;\n        goto Overflow;\n      }\n\n      return (FT_Long)( (FT_ULong)val << 16 );\n\n    Overflow:\n      FT_TRACE4(( \"!!!OVERFLOW:!!!\" ));\n      return val;\n    }\n  }\n\n\n  /* read a floating point number, either integer or real */\n  static FT_Fixed\n  cff_parse_fixed( FT_Byte**  d )\n  {\n    return do_fixed( d, 0 );\n  }\n\n\n  /* read a floating point number, either integer or real, */\n  /* but return `10^scaling' times the number read in      */\n  static FT_Fixed\n  cff_parse_fixed_scaled( FT_Byte**  d,\n                          FT_Long    scaling )\n  {\n    return do_fixed( d, scaling );\n  }\n\n\n  /* read a floating point number, either integer or real,     */\n  /* and return it as precise as possible -- `scaling' returns */\n  /* the scaling factor (as a power of 10)                     */\n  static FT_Fixed\n  cff_parse_fixed_dynamic( FT_Byte**  d,\n                           FT_Long*   scaling )\n  {\n    FT_ASSERT( scaling );\n\n    if ( **d == 30 )\n      return cff_parse_real( d[0], d[1], 0, scaling );\n    else\n    {\n      FT_Long  number;\n      FT_Int   integer_length;\n\n\n      number = cff_parse_integer( d[0], d[1] );\n\n      if ( number > 0x7FFFL )\n      {\n        for ( integer_length = 5; integer_length < 10; integer_length++ )\n          if ( number < power_tens[integer_length] )\n            break;\n\n        if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )\n        {\n          *scaling = integer_length - 4;\n          return FT_DivFix( number, power_tens[integer_length - 4] );\n        }\n        else\n        {\n          *scaling = integer_length - 5;\n          return FT_DivFix( number, power_tens[integer_length - 5] );\n        }\n      }\n      else\n      {\n        *scaling = 0;\n        return (FT_Long)( (FT_ULong)number << 16 );\n      }\n    }\n  }\n\n\n  static FT_Error\n  cff_parse_font_matrix( CFF_Parser  parser )\n  {\n    CFF_FontRecDict  dict   = (CFF_FontRecDict)parser->object;\n    FT_Matrix*       matrix = &dict->font_matrix;\n    FT_Vector*       offset = &dict->font_offset;\n    FT_ULong*        upm    = &dict->units_per_em;\n    FT_Byte**        data   = parser->stack;\n    FT_Error         error  = FT_ERR( Stack_Underflow );\n\n\n    if ( parser->top >= parser->stack + 6 )\n    {\n      FT_Long  scaling;\n\n\n      error = FT_Err_Ok;\n\n      dict->has_font_matrix = TRUE;\n\n      /* We expect a well-formed font matrix, this is, the matrix elements */\n      /* `xx' and `yy' are of approximately the same magnitude.  To avoid  */\n      /* loss of precision, we use the magnitude of element `xx' to scale  */\n      /* all other elements.  The scaling factor is then contained in the  */\n      /* `units_per_em' value.                                             */\n\n      matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );\n\n      scaling = -scaling;\n\n      if ( scaling < 0 || scaling > 9 )\n      {\n        /* Return default matrix in case of unlikely values. */\n\n        FT_TRACE1(( \"cff_parse_font_matrix:\"\n                    \" strange scaling value for xx element (%d),\\n\"\n                    \"                      \"\n                    \" using default matrix\\n\", scaling ));\n\n        matrix->xx = 0x10000L;\n        matrix->yx = 0;\n        matrix->xy = 0;\n        matrix->yy = 0x10000L;\n        offset->x  = 0;\n        offset->y  = 0;\n        *upm       = 1;\n\n        goto Exit;\n      }\n\n      matrix->yx = cff_parse_fixed_scaled( data++, scaling );\n      matrix->xy = cff_parse_fixed_scaled( data++, scaling );\n      matrix->yy = cff_parse_fixed_scaled( data++, scaling );\n      offset->x  = cff_parse_fixed_scaled( data++, scaling );\n      offset->y  = cff_parse_fixed_scaled( data,   scaling );\n\n      *upm = power_tens[scaling];\n\n      FT_TRACE4(( \" [%f %f %f %f %f %f]\\n\",\n                  (double)matrix->xx / *upm / 65536,\n                  (double)matrix->xy / *upm / 65536,\n                  (double)matrix->yx / *upm / 65536,\n                  (double)matrix->yy / *upm / 65536,\n                  (double)offset->x  / *upm / 65536,\n                  (double)offset->y  / *upm / 65536 ));\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  cff_parse_font_bbox( CFF_Parser  parser )\n  {\n    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;\n    FT_BBox*         bbox = &dict->font_bbox;\n    FT_Byte**        data = parser->stack;\n    FT_Error         error;\n\n\n    error = FT_ERR( Stack_Underflow );\n\n    if ( parser->top >= parser->stack + 4 )\n    {\n      bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );\n      bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );\n      bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );\n      bbox->yMax = FT_RoundFix( cff_parse_fixed( data   ) );\n      error = FT_Err_Ok;\n\n      FT_TRACE4(( \" [%d %d %d %d]\\n\",\n                  bbox->xMin / 65536,\n                  bbox->yMin / 65536,\n                  bbox->xMax / 65536,\n                  bbox->yMax / 65536 ));\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  cff_parse_private_dict( CFF_Parser  parser )\n  {\n    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;\n    FT_Byte**        data = parser->stack;\n    FT_Error         error;\n\n\n    error = FT_ERR( Stack_Underflow );\n\n    if ( parser->top >= parser->stack + 2 )\n    {\n      dict->private_size   = cff_parse_num( data++ );\n      dict->private_offset = cff_parse_num( data   );\n      FT_TRACE4(( \" %lu %lu\\n\",\n                  dict->private_size, dict->private_offset ));\n\n      error = FT_Err_Ok;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  cff_parse_cid_ros( CFF_Parser  parser )\n  {\n    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;\n    FT_Byte**        data = parser->stack;\n    FT_Error         error;\n\n\n    error = FT_ERR( Stack_Underflow );\n\n    if ( parser->top >= parser->stack + 3 )\n    {\n      dict->cid_registry = (FT_UInt)cff_parse_num( data++ );\n      dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );\n      if ( **data == 30 )\n        FT_TRACE1(( \"cff_parse_cid_ros: real supplement is rounded\\n\" ));\n      dict->cid_supplement = cff_parse_num( data );\n      if ( dict->cid_supplement < 0 )\n        FT_TRACE1(( \"cff_parse_cid_ros: negative supplement %d is found\\n\",\n                   dict->cid_supplement ));\n      error = FT_Err_Ok;\n\n      FT_TRACE4(( \" %d %d %d\\n\",\n                  dict->cid_registry,\n                  dict->cid_ordering,\n                  dict->cid_supplement ));\n    }\n\n    return error;\n  }\n\n\n#define CFF_FIELD_NUM( code, name, id )             \\\n          CFF_FIELD( code, name, id, cff_kind_num )\n#define CFF_FIELD_FIXED( code, name, id )             \\\n          CFF_FIELD( code, name, id, cff_kind_fixed )\n#define CFF_FIELD_FIXED_1000( code, name, id )                 \\\n          CFF_FIELD( code, name, id, cff_kind_fixed_thousand )\n#define CFF_FIELD_STRING( code, name, id )             \\\n          CFF_FIELD( code, name, id, cff_kind_string )\n#define CFF_FIELD_BOOL( code, name, id )             \\\n          CFF_FIELD( code, name, id, cff_kind_bool )\n\n#define CFFCODE_TOPDICT  0x1000\n#define CFFCODE_PRIVATE  0x2000\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n\n#undef  CFF_FIELD\n#undef  CFF_FIELD_DELTA\n\n\n#ifndef FT_DEBUG_LEVEL_TRACE\n\n\n#define CFF_FIELD_CALLBACK( code, name, id ) \\\n          {                                  \\\n            cff_kind_callback,               \\\n            code | CFFCODE,                  \\\n            0, 0,                            \\\n            cff_parse_ ## name,              \\\n            0, 0                             \\\n          },\n\n#define CFF_FIELD( code, name, id, kind ) \\\n          {                               \\\n            kind,                         \\\n            code | CFFCODE,               \\\n            FT_FIELD_OFFSET( name ),      \\\n            FT_FIELD_SIZE( name ),        \\\n            0, 0, 0                       \\\n          },\n\n#define CFF_FIELD_DELTA( code, name, max, id ) \\\n          {                                    \\\n            cff_kind_delta,                    \\\n            code | CFFCODE,                    \\\n            FT_FIELD_OFFSET( name ),           \\\n            FT_FIELD_SIZE_DELTA( name ),       \\\n            0,                                 \\\n            max,                               \\\n            FT_FIELD_OFFSET( num_ ## name )    \\\n          },\n\n  static const CFF_Field_Handler  cff_field_handlers[] =\n  {\n\n#include \"cfftoken.h\"\n\n    { 0, 0, 0, 0, 0, 0, 0 }\n  };\n\n\n#else /* FT_DEBUG_LEVEL_TRACE */\n\n\n\n#define CFF_FIELD_CALLBACK( code, name, id ) \\\n          {                                  \\\n            cff_kind_callback,               \\\n            code | CFFCODE,                  \\\n            0, 0,                            \\\n            cff_parse_ ## name,              \\\n            0, 0,                            \\\n            id                               \\\n          },\n\n#define CFF_FIELD( code, name, id, kind ) \\\n          {                               \\\n            kind,                         \\\n            code | CFFCODE,               \\\n            FT_FIELD_OFFSET( name ),      \\\n            FT_FIELD_SIZE( name ),        \\\n            0, 0, 0,                      \\\n            id                            \\\n          },\n\n#define CFF_FIELD_DELTA( code, name, max, id ) \\\n          {                                    \\\n            cff_kind_delta,                    \\\n            code | CFFCODE,                    \\\n            FT_FIELD_OFFSET( name ),           \\\n            FT_FIELD_SIZE_DELTA( name ),       \\\n            0,                                 \\\n            max,                               \\\n            FT_FIELD_OFFSET( num_ ## name ),   \\\n            id                                 \\\n          },\n\n  static const CFF_Field_Handler  cff_field_handlers[] =\n  {\n\n#include \"cfftoken.h\"\n\n    { 0, 0, 0, 0, 0, 0, 0, 0 }\n  };\n\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n\n  void\n  FT_Destroy_Class_cff_field_handlers( FT_Library          library,\n                                       CFF_Field_Handler*  clazz )\n  {\n    FT_Memory  memory = library->memory;\n\n\n    if ( clazz )\n      FT_FREE( clazz );\n  }\n\n\n  FT_Error\n  FT_Create_Class_cff_field_handlers( FT_Library           library,\n                                      CFF_Field_Handler**  output_class )\n  {\n    CFF_Field_Handler*  clazz  = NULL;\n    FT_Error            error;\n    FT_Memory           memory = library->memory;\n\n    int  i = 0;\n\n\n#undef CFF_FIELD\n#define CFF_FIELD( code, name, id, kind ) i++;\n#undef CFF_FIELD_DELTA\n#define CFF_FIELD_DELTA( code, name, max, id ) i++;\n#undef CFF_FIELD_CALLBACK\n#define CFF_FIELD_CALLBACK( code, name, id ) i++;\n\n#include \"cfftoken.h\"\n\n    i++; /* { 0, 0, 0, 0, 0, 0, 0 } */\n\n    if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )\n      return error;\n\n    i = 0;\n\n\n#ifndef FT_DEBUG_LEVEL_TRACE\n\n\n#undef CFF_FIELD_CALLBACK\n#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \\\n          clazz[i].kind         = cff_kind_callback;   \\\n          clazz[i].code         = code_ | CFFCODE;     \\\n          clazz[i].offset       = 0;                   \\\n          clazz[i].size         = 0;                   \\\n          clazz[i].reader       = cff_parse_ ## name_; \\\n          clazz[i].array_max    = 0;                   \\\n          clazz[i].count_offset = 0;                   \\\n          i++;\n\n#undef  CFF_FIELD\n#define CFF_FIELD( code_, name_, id_, kind_ )               \\\n          clazz[i].kind         = kind_;                    \\\n          clazz[i].code         = code_ | CFFCODE;          \\\n          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \\\n          clazz[i].size         = FT_FIELD_SIZE( name_ );   \\\n          clazz[i].reader       = 0;                        \\\n          clazz[i].array_max    = 0;                        \\\n          clazz[i].count_offset = 0;                        \\\n          i++;                                              \\\n\n#undef  CFF_FIELD_DELTA\n#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \\\n          clazz[i].kind         = cff_kind_delta;                   \\\n          clazz[i].code         = code_ | CFFCODE;                  \\\n          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \\\n          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \\\n          clazz[i].reader       = 0;                                \\\n          clazz[i].array_max    = max_;                             \\\n          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \\\n          i++;\n\n#include \"cfftoken.h\"\n\n    clazz[i].kind         = 0;\n    clazz[i].code         = 0;\n    clazz[i].offset       = 0;\n    clazz[i].size         = 0;\n    clazz[i].reader       = 0;\n    clazz[i].array_max    = 0;\n    clazz[i].count_offset = 0;\n\n\n#else /* FT_DEBUG_LEVEL_TRACE */\n\n\n#undef CFF_FIELD_CALLBACK\n#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \\\n          clazz[i].kind         = cff_kind_callback;   \\\n          clazz[i].code         = code_ | CFFCODE;     \\\n          clazz[i].offset       = 0;                   \\\n          clazz[i].size         = 0;                   \\\n          clazz[i].reader       = cff_parse_ ## name_; \\\n          clazz[i].array_max    = 0;                   \\\n          clazz[i].count_offset = 0;                   \\\n          clazz[i].id           = id_;                 \\\n          i++;\n\n#undef  CFF_FIELD\n#define CFF_FIELD( code_, name_, id_, kind_ )               \\\n          clazz[i].kind         = kind_;                    \\\n          clazz[i].code         = code_ | CFFCODE;          \\\n          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \\\n          clazz[i].size         = FT_FIELD_SIZE( name_ );   \\\n          clazz[i].reader       = 0;                        \\\n          clazz[i].array_max    = 0;                        \\\n          clazz[i].count_offset = 0;                        \\\n          clazz[i].id           = id_;                      \\\n          i++;                                              \\\n\n#undef  CFF_FIELD_DELTA\n#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \\\n          clazz[i].kind         = cff_kind_delta;                   \\\n          clazz[i].code         = code_ | CFFCODE;                  \\\n          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \\\n          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \\\n          clazz[i].reader       = 0;                                \\\n          clazz[i].array_max    = max_;                             \\\n          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \\\n          clazz[i].id           = id_;                              \\\n          i++;\n\n#include \"cfftoken.h\"\n\n    clazz[i].kind         = 0;\n    clazz[i].code         = 0;\n    clazz[i].offset       = 0;\n    clazz[i].size         = 0;\n    clazz[i].reader       = 0;\n    clazz[i].array_max    = 0;\n    clazz[i].count_offset = 0;\n    clazz[i].id           = 0;\n\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n    *output_class = clazz;\n\n    return FT_Err_Ok;\n  }\n\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cff_parser_run( CFF_Parser  parser,\n                  FT_Byte*    start,\n                  FT_Byte*    limit )\n  {\n    FT_Byte*    p       = start;\n    FT_Error    error   = FT_Err_Ok;\n    FT_Library  library = parser->library;\n    FT_UNUSED( library );\n\n\n    parser->top    = parser->stack;\n    parser->start  = start;\n    parser->limit  = limit;\n    parser->cursor = start;\n\n    while ( p < limit )\n    {\n      FT_UInt  v = *p;\n\n\n      if ( v >= 27 && v != 31 )\n      {\n        /* it's a number; we will push its position on the stack */\n        if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )\n          goto Stack_Overflow;\n\n        *parser->top ++ = p;\n\n        /* now, skip it */\n        if ( v == 30 )\n        {\n          /* skip real number */\n          p++;\n          for (;;)\n          {\n            /* An unterminated floating point number at the */\n            /* end of a dictionary is invalid but harmless. */\n            if ( p >= limit )\n              goto Exit;\n            v = p[0] >> 4;\n            if ( v == 15 )\n              break;\n            v = p[0] & 0xF;\n            if ( v == 15 )\n              break;\n            p++;\n          }\n        }\n        else if ( v == 28 )\n          p += 2;\n        else if ( v == 29 )\n          p += 4;\n        else if ( v > 246 )\n          p += 1;\n      }\n      else\n      {\n        /* This is not a number, hence it's an operator.  Compute its code */\n        /* and look for it in our current list.                            */\n\n        FT_UInt                   code;\n        FT_UInt                   num_args = (FT_UInt)\n                                             ( parser->top - parser->stack );\n        const CFF_Field_Handler*  field;\n\n\n        *parser->top = p;\n        code = v;\n        if ( v == 12 )\n        {\n          /* two byte operator */\n          p++;\n          if ( p >= limit )\n            goto Syntax_Error;\n\n          code = 0x100 | p[0];\n        }\n        code = code | parser->object_code;\n\n        for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ )\n        {\n          if ( field->code == (FT_Int)code )\n          {\n            /* we found our field's handler; read it */\n            FT_Long   val;\n            FT_Byte*  q = (FT_Byte*)parser->object + field->offset;\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n            FT_TRACE4(( \"  %s\", field->id ));\n#endif\n\n            /* check that we have enough arguments -- except for */\n            /* delta encoded arrays, which can be empty          */\n            if ( field->kind != cff_kind_delta && num_args < 1 )\n              goto Stack_Underflow;\n\n            switch ( field->kind )\n            {\n            case cff_kind_bool:\n            case cff_kind_string:\n            case cff_kind_num:\n              val = cff_parse_num( parser->stack );\n              goto Store_Number;\n\n            case cff_kind_fixed:\n              val = cff_parse_fixed( parser->stack );\n              goto Store_Number;\n\n            case cff_kind_fixed_thousand:\n              val = cff_parse_fixed_scaled( parser->stack, 3 );\n\n            Store_Number:\n              switch ( field->size )\n              {\n              case (8 / FT_CHAR_BIT):\n                *(FT_Byte*)q = (FT_Byte)val;\n                break;\n\n              case (16 / FT_CHAR_BIT):\n                *(FT_Short*)q = (FT_Short)val;\n                break;\n\n              case (32 / FT_CHAR_BIT):\n                *(FT_Int32*)q = (FT_Int)val;\n                break;\n\n              default:  /* for 64-bit systems */\n                *(FT_Long*)q = val;\n              }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n              switch ( field->kind )\n              {\n              case cff_kind_bool:\n                FT_TRACE4(( \" %s\\n\", val ? \"true\" : \"false\" ));\n                break;\n\n              case cff_kind_string:\n                FT_TRACE4(( \" %ld (SID)\\n\", val ));\n                break;\n\n              case cff_kind_num:\n                FT_TRACE4(( \" %ld\\n\", val ));\n                break;\n\n              case cff_kind_fixed:\n                FT_TRACE4(( \" %f\\n\", (double)val / 65536 ));\n                break;\n\n              case cff_kind_fixed_thousand:\n                FT_TRACE4(( \" %f\\n\", (double)val / 65536 / 1000 ));\n\n              default:\n                ; /* never reached */\n              }\n#endif\n\n              break;\n\n            case cff_kind_delta:\n              {\n                FT_Byte*   qcount = (FT_Byte*)parser->object +\n                                      field->count_offset;\n\n                FT_Byte**  data = parser->stack;\n\n\n                if ( num_args > field->array_max )\n                  num_args = field->array_max;\n\n                FT_TRACE4(( \" [\" ));\n\n                /* store count */\n                *qcount = (FT_Byte)num_args;\n\n                val = 0;\n                while ( num_args > 0 )\n                {\n                  val += cff_parse_num( data++ );\n                  switch ( field->size )\n                  {\n                  case (8 / FT_CHAR_BIT):\n                    *(FT_Byte*)q = (FT_Byte)val;\n                    break;\n\n                  case (16 / FT_CHAR_BIT):\n                    *(FT_Short*)q = (FT_Short)val;\n                    break;\n\n                  case (32 / FT_CHAR_BIT):\n                    *(FT_Int32*)q = (FT_Int)val;\n                    break;\n\n                  default:  /* for 64-bit systems */\n                    *(FT_Long*)q = val;\n                  }\n\n                  FT_TRACE4(( \" %ld\", val ));\n\n                  q += field->size;\n                  num_args--;\n                }\n\n                FT_TRACE4(( \"]\\n\" ));\n              }\n              break;\n\n            default:  /* callback */\n              error = field->reader( parser );\n              if ( error )\n                goto Exit;\n            }\n            goto Found;\n          }\n        }\n\n        /* this is an unknown operator, or it is unsupported; */\n        /* we will ignore it for now.                         */\n\n      Found:\n        /* clear stack */\n        parser->top = parser->stack;\n      }\n      p++;\n    }\n\n  Exit:\n    return error;\n\n  Stack_Overflow:\n    error = FT_THROW( Invalid_Argument );\n    goto Exit;\n\n  Stack_Underflow:\n    error = FT_THROW( Invalid_Argument );\n    goto Exit;\n\n  Syntax_Error:\n    error = FT_THROW( Invalid_Argument );\n    goto Exit;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffparse.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffparse.h                                                             */\n/*                                                                         */\n/*    CFF token stream parser (specification)                              */\n/*                                                                         */\n/*  Copyright 1996-2003, 2011 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFF_PARSE_H__\n#define __CFF_PARSE_H__\n\n\n#include <ft2build.h>\n#include \"cfftypes.h\"\n#include FT_INTERNAL_OBJECTS_H\n\n\nFT_BEGIN_HEADER\n\n\n#define CFF_MAX_STACK_DEPTH  96\n\n#define CFF_CODE_TOPDICT  0x1000\n#define CFF_CODE_PRIVATE  0x2000\n\n\n  typedef struct  CFF_ParserRec_\n  {\n    FT_Library library;\n    FT_Byte*   start;\n    FT_Byte*   limit;\n    FT_Byte*   cursor;\n\n    FT_Byte*   stack[CFF_MAX_STACK_DEPTH + 1];\n    FT_Byte**  top;\n\n    FT_UInt    object_code;\n    void*      object;\n\n  } CFF_ParserRec, *CFF_Parser;\n\n\n  FT_LOCAL( void )\n  cff_parser_init( CFF_Parser  parser,\n                   FT_UInt     code,\n                   void*       object,\n                   FT_Library  library);\n\n  FT_LOCAL( FT_Error )\n  cff_parser_run( CFF_Parser  parser,\n                  FT_Byte*    start,\n                  FT_Byte*    limit );\n\n\n  enum\n  {\n    cff_kind_none = 0,\n    cff_kind_num,\n    cff_kind_fixed,\n    cff_kind_fixed_thousand,\n    cff_kind_string,\n    cff_kind_bool,\n    cff_kind_delta,\n    cff_kind_callback,\n\n    cff_kind_max  /* do not remove */\n  };\n\n\n  /* now generate handlers for the most simple fields */\n  typedef FT_Error  (*CFF_Field_Reader)( CFF_Parser  parser );\n\n  typedef struct  CFF_Field_Handler_\n  {\n    int               kind;\n    int               code;\n    FT_UInt           offset;\n    FT_Byte           size;\n    CFF_Field_Reader  reader;\n    FT_UInt           array_max;\n    FT_UInt           count_offset;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    const char*       id;\n#endif\n\n  } CFF_Field_Handler;\n\n\nFT_END_HEADER\n\n\n#endif /* __CFF_PARSE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffpic.c                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for cff module.      */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"cffcmap.h\"\n#include \"cffpic.h\"\n#include \"cfferrs.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from cffdrivr.c */\n  FT_Error\n  FT_Create_Class_cff_services( FT_Library           library,\n                                FT_ServiceDescRec**  output_class );\n  void\n  FT_Destroy_Class_cff_services( FT_Library          library,\n                                 FT_ServiceDescRec*  clazz );\n  void\n  FT_Init_Class_cff_service_ps_info( FT_Library             library,\n                                     FT_Service_PsInfoRec*  clazz );\n  void\n  FT_Init_Class_cff_service_glyph_dict( FT_Library                library,\n                                        FT_Service_GlyphDictRec*  clazz );\n  void\n  FT_Init_Class_cff_service_ps_name( FT_Library                 library,\n                                     FT_Service_PsFontNameRec*  clazz );\n  void\n  FT_Init_Class_cff_service_get_cmap_info( FT_Library              library,\n                                           FT_Service_TTCMapsRec*  clazz );\n  void\n  FT_Init_Class_cff_service_cid_info( FT_Library          library,\n                                      FT_Service_CIDRec*  clazz );\n\n  /* forward declaration of PIC init functions from cffparse.c */\n  FT_Error\n  FT_Create_Class_cff_field_handlers( FT_Library           library,\n                                      CFF_Field_Handler**  output_class );\n  void\n  FT_Destroy_Class_cff_field_handlers( FT_Library          library,\n                                       CFF_Field_Handler*  clazz );\n\n\n  void\n  cff_driver_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->cff )\n    {\n      CffModulePIC*  container = (CffModulePIC*)pic_container->cff;\n\n\n      if ( container->cff_services )\n        FT_Destroy_Class_cff_services( library,\n                                       container->cff_services );\n      container->cff_services = NULL;\n      if ( container->cff_field_handlers )\n        FT_Destroy_Class_cff_field_handlers(\n          library, container->cff_field_handlers );\n      container->cff_field_handlers = NULL;\n      FT_FREE( container );\n      pic_container->cff = NULL;\n    }\n  }\n\n\n  FT_Error\n  cff_driver_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    CffModulePIC*      container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC ( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->cff = container;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    error = FT_Create_Class_cff_services( library,\n                                          &container->cff_services );\n    if ( error )\n      goto Exit;\n\n    error = FT_Create_Class_cff_field_handlers(\n              library, &container->cff_field_handlers );\n    if ( error )\n      goto Exit;\n\n    FT_Init_Class_cff_service_ps_info(\n      library, &container->cff_service_ps_info );\n    FT_Init_Class_cff_service_glyph_dict(\n      library, &container->cff_service_glyph_dict );\n    FT_Init_Class_cff_service_ps_name(\n      library, &container->cff_service_ps_name );\n    FT_Init_Class_cff_service_get_cmap_info(\n      library, &container->cff_service_get_cmap_info );\n    FT_Init_Class_cff_service_cid_info(\n      library, &container->cff_service_cid_info );\n    FT_Init_Class_cff_cmap_encoding_class_rec(\n      library, &container->cff_cmap_encoding_class_rec );\n    FT_Init_Class_cff_cmap_unicode_class_rec(\n      library, &container->cff_cmap_unicode_class_rec );\n\n  Exit:\n    if ( error )\n      cff_driver_class_pic_free( library );\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cffpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cffpic.h                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for cff module.      */\n/*                                                                         */\n/*  Copyright 2009, 2012, 2013 by                                          */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFPIC_H__\n#define __CFFPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include FT_INTERNAL_PIC_H\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define CFF_SERVICE_PS_INFO_GET          cff_service_ps_info\n#define CFF_SERVICE_GLYPH_DICT_GET       cff_service_glyph_dict\n#define CFF_SERVICE_PS_NAME_GET          cff_service_ps_name\n#define CFF_SERVICE_GET_CMAP_INFO_GET    cff_service_get_cmap_info\n#define CFF_SERVICE_CID_INFO_GET         cff_service_cid_info\n#define CFF_SERVICE_PROPERTIES_GET       cff_service_properties\n#define CFF_SERVICES_GET                 cff_services\n#define CFF_CMAP_ENCODING_CLASS_REC_GET  cff_cmap_encoding_class_rec\n#define CFF_CMAP_UNICODE_CLASS_REC_GET   cff_cmap_unicode_class_rec\n#define CFF_FIELD_HANDLERS_GET           cff_field_handlers\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include FT_SERVICE_GLYPH_DICT_H\n#include \"cffparse.h\"\n#include FT_SERVICE_POSTSCRIPT_INFO_H\n#include FT_SERVICE_POSTSCRIPT_NAME_H\n#include FT_SERVICE_TT_CMAP_H\n#include FT_SERVICE_CID_H\n#include FT_SERVICE_PROPERTIES_H\n\n\n  typedef struct  CffModulePIC_\n  {\n    FT_ServiceDescRec*        cff_services;\n    CFF_Field_Handler*        cff_field_handlers;\n    FT_Service_PsInfoRec      cff_service_ps_info;\n    FT_Service_GlyphDictRec   cff_service_glyph_dict;\n    FT_Service_PsFontNameRec  cff_service_ps_name;\n    FT_Service_TTCMapsRec     cff_service_get_cmap_info;\n    FT_Service_CIDRec         cff_service_cid_info;\n    FT_Service_PropertiesRec  cff_service_properties;\n    FT_CMap_ClassRec          cff_cmap_encoding_class_rec;\n    FT_CMap_ClassRec          cff_cmap_unicode_class_rec;\n\n  } CffModulePIC;\n\n\n#define GET_PIC( lib )                                    \\\n          ( (CffModulePIC*)( (lib)->pic_container.cff ) )\n\n#define CFF_SERVICE_PS_INFO_GET                       \\\n          ( GET_PIC( library )->cff_service_ps_info )\n#define CFF_SERVICE_GLYPH_DICT_GET                       \\\n          ( GET_PIC( library )->cff_service_glyph_dict )\n#define CFF_SERVICE_PS_NAME_GET                       \\\n          ( GET_PIC( library )->cff_service_ps_name )\n#define CFF_SERVICE_GET_CMAP_INFO_GET                       \\\n          ( GET_PIC( library )->cff_service_get_cmap_info )\n#define CFF_SERVICE_CID_INFO_GET                       \\\n          ( GET_PIC( library )->cff_service_cid_info )\n#define CFF_SERVICE_PROPERTIES_GET                       \\\n          ( GET_PIC( library )->cff_service_properties )\n#define CFF_SERVICES_GET                       \\\n          ( GET_PIC( library )->cff_services )\n#define CFF_CMAP_ENCODING_CLASS_REC_GET                       \\\n          ( GET_PIC( library )->cff_cmap_encoding_class_rec )\n#define CFF_CMAP_UNICODE_CLASS_REC_GET                       \\\n          ( GET_PIC( library )->cff_cmap_unicode_class_rec )\n#define CFF_FIELD_HANDLERS_GET                       \\\n          ( GET_PIC( library )->cff_field_handlers )\n\n  /* see cffpic.c for the implementation */\n  void\n  cff_driver_class_pic_free( FT_Library  library );\n\n  FT_Error\n  cff_driver_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __CFFPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cfftoken.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cfftoken.h                                                             */\n/*                                                                         */\n/*    CFF token definitions (specification only).                          */\n/*                                                                         */\n/*  Copyright 1996-2003, 2011 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CFF_FontRecDictRec\n\n#undef  CFFCODE\n#define CFFCODE       CFFCODE_TOPDICT\n\n  CFF_FIELD_STRING  ( 0,     version,             \"Version\" )\n  CFF_FIELD_STRING  ( 1,     notice,              \"Notice\" )\n  CFF_FIELD_STRING  ( 0x100, copyright,           \"Copyright\" )\n  CFF_FIELD_STRING  ( 2,     full_name,           \"FullName\" )\n  CFF_FIELD_STRING  ( 3,     family_name,         \"FamilyName\" )\n  CFF_FIELD_STRING  ( 4,     weight,              \"Weight\" )\n  CFF_FIELD_BOOL    ( 0x101, is_fixed_pitch,      \"isFixedPitch\" )\n  CFF_FIELD_FIXED   ( 0x102, italic_angle,        \"ItalicAngle\" )\n  CFF_FIELD_FIXED   ( 0x103, underline_position,  \"UnderlinePosition\" )\n  CFF_FIELD_FIXED   ( 0x104, underline_thickness, \"UnderlineThickness\" )\n  CFF_FIELD_NUM     ( 0x105, paint_type,          \"PaintType\" )\n  CFF_FIELD_NUM     ( 0x106, charstring_type,     \"CharstringType\" )\n  CFF_FIELD_CALLBACK( 0x107, font_matrix,         \"FontMatrix\" )\n  CFF_FIELD_NUM     ( 13,    unique_id,           \"UniqueID\" )\n  CFF_FIELD_CALLBACK( 5,     font_bbox,           \"FontBBox\" )\n  CFF_FIELD_NUM     ( 0x108, stroke_width,        \"StrokeWidth\" )\n  CFF_FIELD_NUM     ( 15,    charset_offset,      \"charset\" )\n  CFF_FIELD_NUM     ( 16,    encoding_offset,     \"Encoding\" )\n  CFF_FIELD_NUM     ( 17,    charstrings_offset,  \"CharStrings\" )\n  CFF_FIELD_CALLBACK( 18,    private_dict,        \"Private\" )\n  CFF_FIELD_NUM     ( 0x114, synthetic_base,      \"SyntheticBase\" )\n  CFF_FIELD_STRING  ( 0x115, embedded_postscript, \"PostScript\" )\n\n#if 0\n  CFF_FIELD_STRING  ( 0x116, base_font_name,      \"BaseFontName\" )\n  CFF_FIELD_DELTA   ( 0x117, base_font_blend, 16, \"BaseFontBlend\" )\n  CFF_FIELD_CALLBACK( 0x118, multiple_master,     \"MultipleMaster\" )\n  CFF_FIELD_CALLBACK( 0x119, blend_axis_types,    \"BlendAxisTypes\" )\n#endif\n\n  CFF_FIELD_CALLBACK( 0x11E, cid_ros,              \"ROS\" )\n  CFF_FIELD_NUM     ( 0x11F, cid_font_version,     \"CIDFontVersion\" )\n  CFF_FIELD_NUM     ( 0x120, cid_font_revision,    \"CIDFontRevision\" )\n  CFF_FIELD_NUM     ( 0x121, cid_font_type,        \"CIDFontType\" )\n  CFF_FIELD_NUM     ( 0x122, cid_count,            \"CIDCount\" )\n  CFF_FIELD_NUM     ( 0x123, cid_uid_base,         \"UIDBase\" )\n  CFF_FIELD_NUM     ( 0x124, cid_fd_array_offset,  \"FDArray\" )\n  CFF_FIELD_NUM     ( 0x125, cid_fd_select_offset, \"FDSelect\" )\n  CFF_FIELD_STRING  ( 0x126, cid_font_name,        \"FontName\" )\n\n#if 0\n  CFF_FIELD_NUM     ( 0x127, chameleon, \"Chameleon\" )\n#endif\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CFF_PrivateRec\n#undef  CFFCODE\n#define CFFCODE       CFFCODE_PRIVATE\n\n  CFF_FIELD_DELTA     ( 6,     blue_values, 14,        \"BlueValues\" )\n  CFF_FIELD_DELTA     ( 7,     other_blues, 10,        \"OtherBlues\" )\n  CFF_FIELD_DELTA     ( 8,     family_blues, 14,       \"FamilyBlues\" )\n  CFF_FIELD_DELTA     ( 9,     family_other_blues, 10, \"FamilyOtherBlues\" )\n  CFF_FIELD_FIXED_1000( 0x109, blue_scale,             \"BlueScale\" )\n  CFF_FIELD_NUM       ( 0x10A, blue_shift,             \"BlueShift\" )\n  CFF_FIELD_NUM       ( 0x10B, blue_fuzz,              \"BlueFuzz\" )\n  CFF_FIELD_NUM       ( 10,    standard_width,         \"StdHW\" )\n  CFF_FIELD_NUM       ( 11,    standard_height,        \"StdVW\" )\n  CFF_FIELD_DELTA     ( 0x10C, snap_widths, 13,        \"StemSnapH\" )\n  CFF_FIELD_DELTA     ( 0x10D, snap_heights, 13,       \"StemSnapV\" )\n  CFF_FIELD_BOOL      ( 0x10E, force_bold,             \"ForceBold\" )\n  CFF_FIELD_FIXED     ( 0x10F, force_bold_threshold,   \"ForceBoldThreshold\" )\n  CFF_FIELD_NUM       ( 0x110, lenIV,                  \"lenIV\" )\n  CFF_FIELD_NUM       ( 0x111, language_group,         \"LanguageGroup\" )\n  CFF_FIELD_FIXED     ( 0x112, expansion_factor,       \"ExpansionFactor\" )\n  CFF_FIELD_NUM       ( 0x113, initial_random_seed,    \"initialRandomSeed\" )\n  CFF_FIELD_NUM       ( 19,    local_subrs_offset,     \"Subrs\" )\n  CFF_FIELD_NUM       ( 20,    default_width,          \"defaultWidthX\" )\n  CFF_FIELD_NUM       ( 21,    nominal_width,          \"nominalWidthX\" )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/cfftypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cfftypes.h                                                             */\n/*                                                                         */\n/*    Basic OpenType/CFF type definitions and interface (specification     */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006-2008, 2010-2011, 2013 by                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CFFTYPES_H__\n#define __CFFTYPES_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_TYPE1_TABLES_H\n#include FT_INTERNAL_SERVICE_H\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CFF_IndexRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A structure used to model a CFF Index table.                       */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    stream      :: The source input stream.                            */\n  /*                                                                       */\n  /*    start       :: The position of the first index byte in the         */\n  /*                   input stream.                                       */\n  /*                                                                       */\n  /*    count       :: The number of elements in the index.                */\n  /*                                                                       */\n  /*    off_size    :: The size in bytes of object offsets in index.       */\n  /*                                                                       */\n  /*    data_offset :: The position of first data byte in the index's      */\n  /*                   bytes.                                              */\n  /*                                                                       */\n  /*    data_size   :: The size of the data table in this index.           */\n  /*                                                                       */\n  /*    offsets     :: A table of element offsets in the index.  Must be   */\n  /*                   loaded explicitly.                                  */\n  /*                                                                       */\n  /*    bytes       :: If the index is loaded in memory, its bytes.        */\n  /*                                                                       */\n  typedef struct  CFF_IndexRec_\n  {\n    FT_Stream  stream;\n    FT_ULong   start;\n    FT_UInt    count;\n    FT_Byte    off_size;\n    FT_ULong   data_offset;\n    FT_ULong   data_size;\n\n    FT_ULong*  offsets;\n    FT_Byte*   bytes;\n\n  } CFF_IndexRec, *CFF_Index;\n\n\n  typedef struct  CFF_EncodingRec_\n  {\n    FT_UInt     format;\n    FT_ULong    offset;\n\n    FT_UInt     count;\n    FT_UShort   sids [256];  /* avoid dynamic allocations */\n    FT_UShort   codes[256];\n\n  } CFF_EncodingRec, *CFF_Encoding;\n\n\n  typedef struct  CFF_CharsetRec_\n  {\n\n    FT_UInt     format;\n    FT_ULong    offset;\n\n    FT_UShort*  sids;\n    FT_UShort*  cids;       /* the inverse mapping of `sids'; only needed */\n                            /* for CID-keyed fonts                        */\n    FT_UInt     max_cid;\n    FT_UInt     num_glyphs;\n\n  } CFF_CharsetRec, *CFF_Charset;\n\n\n  typedef struct  CFF_FontRecDictRec_\n  {\n    FT_UInt    version;\n    FT_UInt    notice;\n    FT_UInt    copyright;\n    FT_UInt    full_name;\n    FT_UInt    family_name;\n    FT_UInt    weight;\n    FT_Bool    is_fixed_pitch;\n    FT_Fixed   italic_angle;\n    FT_Fixed   underline_position;\n    FT_Fixed   underline_thickness;\n    FT_Int     paint_type;\n    FT_Int     charstring_type;\n    FT_Matrix  font_matrix;\n    FT_Bool    has_font_matrix;\n    FT_ULong   units_per_em;  /* temporarily used as scaling value also */\n    FT_Vector  font_offset;\n    FT_ULong   unique_id;\n    FT_BBox    font_bbox;\n    FT_Pos     stroke_width;\n    FT_ULong   charset_offset;\n    FT_ULong   encoding_offset;\n    FT_ULong   charstrings_offset;\n    FT_ULong   private_offset;\n    FT_ULong   private_size;\n    FT_Long    synthetic_base;\n    FT_UInt    embedded_postscript;\n\n    /* these should only be used for the top-level font dictionary */\n    FT_UInt    cid_registry;\n    FT_UInt    cid_ordering;\n    FT_Long    cid_supplement;\n\n    FT_Long    cid_font_version;\n    FT_Long    cid_font_revision;\n    FT_Long    cid_font_type;\n    FT_ULong   cid_count;\n    FT_ULong   cid_uid_base;\n    FT_ULong   cid_fd_array_offset;\n    FT_ULong   cid_fd_select_offset;\n    FT_UInt    cid_font_name;\n\n  } CFF_FontRecDictRec, *CFF_FontRecDict;\n\n\n  typedef struct  CFF_PrivateRec_\n  {\n    FT_Byte   num_blue_values;\n    FT_Byte   num_other_blues;\n    FT_Byte   num_family_blues;\n    FT_Byte   num_family_other_blues;\n\n    FT_Pos    blue_values[14];\n    FT_Pos    other_blues[10];\n    FT_Pos    family_blues[14];\n    FT_Pos    family_other_blues[10];\n\n    FT_Fixed  blue_scale;\n    FT_Pos    blue_shift;\n    FT_Pos    blue_fuzz;\n    FT_Pos    standard_width;\n    FT_Pos    standard_height;\n\n    FT_Byte   num_snap_widths;\n    FT_Byte   num_snap_heights;\n    FT_Pos    snap_widths[13];\n    FT_Pos    snap_heights[13];\n    FT_Bool   force_bold;\n    FT_Fixed  force_bold_threshold;\n    FT_Int    lenIV;\n    FT_Int    language_group;\n    FT_Fixed  expansion_factor;\n    FT_Long   initial_random_seed;\n    FT_ULong  local_subrs_offset;\n    FT_Pos    default_width;\n    FT_Pos    nominal_width;\n\n  } CFF_PrivateRec, *CFF_Private;\n\n\n  typedef struct  CFF_FDSelectRec_\n  {\n    FT_Byte   format;\n    FT_UInt   range_count;\n\n    /* that's the table, taken from the file `as is' */\n    FT_Byte*  data;\n    FT_UInt   data_size;\n\n    /* small cache for format 3 only */\n    FT_UInt   cache_first;\n    FT_UInt   cache_count;\n    FT_Byte   cache_fd;\n\n  } CFF_FDSelectRec, *CFF_FDSelect;\n\n\n  /* A SubFont packs a font dict and a private dict together.  They are */\n  /* needed to support CID-keyed CFF fonts.                             */\n  typedef struct  CFF_SubFontRec_\n  {\n    CFF_FontRecDictRec  font_dict;\n    CFF_PrivateRec      private_dict;\n\n    CFF_IndexRec        local_subrs_index;\n    FT_Byte**           local_subrs; /* array of pointers into Local Subrs INDEX data */\n\n  } CFF_SubFontRec, *CFF_SubFont;\n\n\n#define CFF_MAX_CID_FONTS  256\n\n\n  typedef struct  CFF_FontRec_\n  {\n    FT_Stream        stream;\n    FT_Memory        memory;\n    FT_UInt          num_faces;\n    FT_UInt          num_glyphs;\n\n    FT_Byte          version_major;\n    FT_Byte          version_minor;\n    FT_Byte          header_size;\n    FT_Byte          absolute_offsize;\n\n\n    CFF_IndexRec     name_index;\n    CFF_IndexRec     top_dict_index;\n    CFF_IndexRec     global_subrs_index;\n\n    CFF_EncodingRec  encoding;\n    CFF_CharsetRec   charset;\n\n    CFF_IndexRec     charstrings_index;\n    CFF_IndexRec     font_dict_index;\n    CFF_IndexRec     private_index;\n    CFF_IndexRec     local_subrs_index;\n\n    FT_String*       font_name;\n\n    /* array of pointers into Global Subrs INDEX data */\n    FT_Byte**        global_subrs;\n\n    /* array of pointers into String INDEX data stored at string_pool */\n    FT_UInt          num_strings;\n    FT_Byte**        strings;\n    FT_Byte*         string_pool;\n\n    CFF_SubFontRec   top_font;\n    FT_UInt          num_subfonts;\n    CFF_SubFont      subfonts[CFF_MAX_CID_FONTS];\n\n    CFF_FDSelectRec  fd_select;\n\n    /* interface to PostScript hinter */\n    PSHinter_Service  pshinter;\n\n    /* interface to Postscript Names service */\n    FT_Service_PsCMaps  psnames;\n\n    /* since version 2.3.0 */\n    PS_FontInfoRec*  font_info;   /* font info dictionary */\n\n    /* since version 2.3.6 */\n    FT_String*       registry;\n    FT_String*       ordering;\n\n    /* since version 2.4.12 */\n    FT_Generic       cf2_instance;\n\n  } CFF_FontRec, *CFF_Font;\n\n\nFT_END_HEADER\n\n#endif /* __CFFTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cff/module.mk",
    "content": "#\n# FreeType 2 CFF module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += CFF_DRIVER\n\ndefine CFF_DRIVER\n$(OPEN_DRIVER) FT_Driver_ClassRec, cff_driver_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)cff       $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/cff/rules.mk",
    "content": "#\n# FreeType 2 OpenType/CFF driver configuration rules\n#\n\n\n# Copyright 1996-2001, 2003, 2011, 2013 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# OpenType driver directory\n#\nCFF_DIR := $(SRC_DIR)/cff\n\n\nCFF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CFF_DIR))\n\n\n# CFF driver sources (i.e., C files)\n#\nCFF_DRV_SRC := $(CFF_DIR)/cffcmap.c  \\\n               $(CFF_DIR)/cffdrivr.c \\\n               $(CFF_DIR)/cffgload.c \\\n               $(CFF_DIR)/cffload.c  \\\n               $(CFF_DIR)/cffobjs.c  \\\n               $(CFF_DIR)/cffparse.c \\\n               $(CFF_DIR)/cffpic.c   \\\n               $(CFF_DIR)/cf2arrst.c \\\n               $(CFF_DIR)/cf2blues.c \\\n               $(CFF_DIR)/cf2error.c \\\n               $(CFF_DIR)/cf2font.c  \\\n               $(CFF_DIR)/cf2ft.c    \\\n               $(CFF_DIR)/cf2hints.c \\\n               $(CFF_DIR)/cf2intrp.c \\\n               $(CFF_DIR)/cf2read.c  \\\n               $(CFF_DIR)/cf2stack.c\n\n\n# CFF driver headers\n#\nCFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \\\n             $(CFF_DIR)/cfferrs.h   \\\n             $(CFF_DIR)/cfftoken.h  \\\n             $(CFF_DIR)/cfftypes.h  \\\n             $(CFF_DIR)/cf2fixed.h  \\\n             $(CFF_DIR)/cf2glue.h   \\\n             $(CFF_DIR)/cf2types.h\n\n\n# CFF driver object(s)\n#\n#   CFF_DRV_OBJ_M is used during `multi' builds\n#   CFF_DRV_OBJ_S is used during `single' builds\n#\nCFF_DRV_OBJ_M := $(CFF_DRV_SRC:$(CFF_DIR)/%.c=$(OBJ_DIR)/%.$O)\nCFF_DRV_OBJ_S := $(OBJ_DIR)/cff.$O\n\n# CFF driver source file for single build\n#\nCFF_DRV_SRC_S := $(CFF_DIR)/cff.c\n\n\n# CFF driver - single object\n#\n$(CFF_DRV_OBJ_S): $(CFF_DRV_SRC_S) $(CFF_DRV_SRC) $(FREETYPE_H) $(CFF_DRV_H)\n\t$(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CFF_DRV_SRC_S))\n\n\n# CFF driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(CFF_DIR)/%.c $(FREETYPE_H) $(CFF_DRV_H)\n\t$(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(CFF_DRV_OBJ_S)\nDRV_OBJS_M += $(CFF_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/cid/Jamfile",
    "content": "# FreeType 2 src/cid Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) cid ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = cidobjs cidload cidgload cidriver cidparse ;\n  }\n  else\n  {\n    _sources = type1cid ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/cid Jamfile\n"
  },
  {
    "path": "libs/freetype/src/cid/ciderrs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ciderrs.h                                                              */\n/*                                                                         */\n/*    CID error codes (specification only).                                */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the CID error enumeration constants.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __CIDERRS_H__\n#define __CIDERRS_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  CID_Err_\n#define FT_ERR_BASE    FT_Mod_Err_CID\n\n#include FT_ERRORS_H\n\n#endif /* __CIDERRS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidgload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidgload.c                                                             */\n/*                                                                         */\n/*    CID-keyed Type1 Glyph Loader (body).                                 */\n/*                                                                         */\n/*  Copyright 1996-2007, 2009, 2010, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include \"cidload.h\"\n#include \"cidgload.h\"\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_OUTLINE_H\n#include FT_INTERNAL_CALC_H\n\n#include \"ciderrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cidgload\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  cid_load_glyph( T1_Decoder  decoder,\n                  FT_UInt     glyph_index )\n  {\n    CID_Face       face = (CID_Face)decoder->builder.face;\n    CID_FaceInfo   cid  = &face->cid;\n    FT_Byte*       p;\n    FT_UInt        fd_select;\n    FT_Stream      stream       = face->cid_stream;\n    FT_Error       error        = FT_Err_Ok;\n    FT_Byte*       charstring   = 0;\n    FT_Memory      memory       = face->root.memory;\n    FT_ULong       glyph_length = 0;\n    PSAux_Service  psaux        = (PSAux_Service)face->psaux;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_Incremental_InterfaceRec *inc =\n                                  face->root.internal->incremental_interface;\n#endif\n\n\n    FT_TRACE4(( \"cid_load_glyph: glyph index %d\\n\", glyph_index ));\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* For incremental fonts get the character data using */\n    /* the callback function.                             */\n    if ( inc )\n    {\n      FT_Data  glyph_data;\n\n\n      error = inc->funcs->get_glyph_data( inc->object,\n                                          glyph_index, &glyph_data );\n      if ( error )\n        goto Exit;\n\n      p         = (FT_Byte*)glyph_data.pointer;\n      fd_select = (FT_UInt)cid_get_offset( &p, (FT_Byte)cid->fd_bytes );\n\n      if ( glyph_data.length != 0 )\n      {\n        glyph_length = glyph_data.length - cid->fd_bytes;\n        (void)FT_ALLOC( charstring, glyph_length );\n        if ( !error )\n          ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes,\n                     glyph_length );\n      }\n\n      inc->funcs->free_glyph_data( inc->object, &glyph_data );\n\n      if ( error )\n        goto Exit;\n    }\n\n    else\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    /* For ordinary fonts read the CID font dictionary index */\n    /* and charstring offset from the CIDMap.                */\n    {\n      FT_UInt   entry_len = cid->fd_bytes + cid->gd_bytes;\n      FT_ULong  off1;\n\n\n      if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset +\n                           glyph_index * entry_len )               ||\n           FT_FRAME_ENTER( 2 * entry_len )                         )\n        goto Exit;\n\n      p            = (FT_Byte*)stream->cursor;\n      fd_select    = (FT_UInt) cid_get_offset( &p, (FT_Byte)cid->fd_bytes );\n      off1         = (FT_ULong)cid_get_offset( &p, (FT_Byte)cid->gd_bytes );\n      p           += cid->fd_bytes;\n      glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1;\n      FT_FRAME_EXIT();\n\n      if ( fd_select >= (FT_UInt)cid->num_dicts )\n      {\n        error = FT_THROW( Invalid_Offset );\n        goto Exit;\n      }\n      if ( glyph_length == 0 )\n        goto Exit;\n      if ( FT_ALLOC( charstring, glyph_length ) )\n        goto Exit;\n      if ( FT_STREAM_READ_AT( cid->data_offset + off1,\n                              charstring, glyph_length ) )\n        goto Exit;\n    }\n\n    /* Now set up the subrs array and parse the charstrings. */\n    {\n      CID_FaceDict  dict;\n      CID_Subrs     cid_subrs = face->subrs + fd_select;\n      FT_Int        cs_offset;\n\n\n      /* Set up subrs */\n      decoder->num_subrs = cid_subrs->num_subrs;\n      decoder->subrs     = cid_subrs->code;\n      decoder->subrs_len = 0;\n\n      /* Set up font matrix */\n      dict                 = cid->font_dicts + fd_select;\n\n      decoder->font_matrix = dict->font_matrix;\n      decoder->font_offset = dict->font_offset;\n      decoder->lenIV       = dict->private_dict.lenIV;\n\n      /* Decode the charstring. */\n\n      /* Adjustment for seed bytes. */\n      cs_offset = ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );\n\n      /* Decrypt only if lenIV >= 0. */\n      if ( decoder->lenIV >= 0 )\n        psaux->t1_decrypt( charstring, glyph_length, 4330 );\n\n      error = decoder->funcs.parse_charstrings(\n                decoder, charstring + cs_offset,\n                (FT_Int)glyph_length - cs_offset );\n    }\n\n    FT_FREE( charstring );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* Incremental fonts can optionally override the metrics. */\n    if ( !error && inc && inc->funcs->get_glyph_metrics )\n    {\n      FT_Incremental_MetricsRec  metrics;\n\n\n      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );\n      metrics.bearing_y = 0;\n      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );\n      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );\n\n      error = inc->funcs->get_glyph_metrics( inc->object,\n                                             glyph_index, FALSE, &metrics );\n\n      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );\n      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );\n      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );\n    }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n  Exit:\n    return error;\n  }\n\n\n#if 0\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /**********                                                      *********/\n  /**********                                                      *********/\n  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/\n  /**********                                                      *********/\n  /**********    The following code is in charge of computing      *********/\n  /**********    the maximum advance width of the font.  It        *********/\n  /**********    quickly processes each glyph charstring to        *********/\n  /**********    extract the value from either a `sbw' or `seac'   *********/\n  /**********    operator.                                         *********/\n  /**********                                                      *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_face_compute_max_advance( CID_Face  face,\n                                FT_Int*   max_advance )\n  {\n    FT_Error       error;\n    T1_DecoderRec  decoder;\n    FT_Int         glyph_index;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    *max_advance = 0;\n\n    /* Initialize load decoder */\n    error = psaux->t1_decoder_funcs->init( &decoder,\n                                           (FT_Face)face,\n                                           0, /* size       */\n                                           0, /* glyph slot */\n                                           0, /* glyph names! XXX */\n                                           0, /* blend == 0 */\n                                           0, /* hinting == 0 */\n                                           cid_load_glyph );\n    if ( error )\n      return error;\n\n    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */\n    /*       if we ever support CID-keyed multiple master fonts     */\n\n    decoder.builder.metrics_only = 1;\n    decoder.builder.load_points  = 0;\n\n    /* for each glyph, parse the glyph charstring and extract */\n    /* the advance width                                      */\n    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;\n          glyph_index++ )\n    {\n      /* now get load the unscaled outline */\n      error = cid_load_glyph( &decoder, glyph_index );\n      /* ignore the error if one occurred - skip to next glyph */\n    }\n\n    *max_advance = FIXED_TO_INT( decoder.builder.advance.x );\n\n    psaux->t1_decoder_funcs->done( &decoder );\n\n    return FT_Err_Ok;\n  }\n\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_slot_load_glyph( FT_GlyphSlot  cidglyph,      /* CID_GlyphSlot */\n                       FT_Size       cidsize,       /* CID_Size      */\n                       FT_UInt       glyph_index,\n                       FT_Int32      load_flags )\n  {\n    CID_GlyphSlot  glyph = (CID_GlyphSlot)cidglyph;\n    FT_Error       error;\n    T1_DecoderRec  decoder;\n    CID_Face       face = (CID_Face)cidglyph->face;\n    FT_Bool        hinting;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n    FT_Matrix      font_matrix;\n    FT_Vector      font_offset;\n\n\n    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;\n\n    glyph->x_scale = cidsize->metrics.x_scale;\n    glyph->y_scale = cidsize->metrics.y_scale;\n\n    cidglyph->outline.n_points   = 0;\n    cidglyph->outline.n_contours = 0;\n\n    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&\n                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );\n\n    cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;\n\n    error = psaux->t1_decoder_funcs->init( &decoder,\n                                           cidglyph->face,\n                                           cidsize,\n                                           cidglyph,\n                                           0, /* glyph names -- XXX */\n                                           0, /* blend == 0 */\n                                           hinting,\n                                           FT_LOAD_TARGET_MODE( load_flags ),\n                                           cid_load_glyph );\n    if ( error )\n      goto Exit;\n\n    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */\n    /*       if we ever support CID-keyed multiple master fonts     */\n\n    /* set up the decoder */\n    decoder.builder.no_recurse = FT_BOOL(\n      ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );\n\n    error = cid_load_glyph( &decoder, glyph_index );\n    if ( error )\n      goto Exit;\n\n    font_matrix = decoder.font_matrix;\n    font_offset = decoder.font_offset;\n\n    /* save new glyph tables */\n    psaux->t1_decoder_funcs->done( &decoder );\n\n    /* now set the metrics -- this is rather simple, as    */\n    /* the left side bearing is the xMin, and the top side */\n    /* bearing the yMax                                    */\n    cidglyph->outline.flags &= FT_OUTLINE_OWNER;\n    cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;\n\n    /* for composite glyphs, return only left side bearing and */\n    /* advance width                                           */\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n    {\n      FT_Slot_Internal  internal = cidglyph->internal;\n\n\n      cidglyph->metrics.horiBearingX =\n        FIXED_TO_INT( decoder.builder.left_bearing.x );\n      cidglyph->metrics.horiAdvance =\n        FIXED_TO_INT( decoder.builder.advance.x );\n\n      internal->glyph_matrix      = font_matrix;\n      internal->glyph_delta       = font_offset;\n      internal->glyph_transformed = 1;\n    }\n    else\n    {\n      FT_BBox            cbox;\n      FT_Glyph_Metrics*  metrics = &cidglyph->metrics;\n      FT_Vector          advance;\n\n\n      /* copy the _unscaled_ advance width */\n      metrics->horiAdvance =\n        FIXED_TO_INT( decoder.builder.advance.x );\n      cidglyph->linearHoriAdvance =\n        FIXED_TO_INT( decoder.builder.advance.x );\n      cidglyph->internal->glyph_transformed = 0;\n\n      /* make up vertical ones */\n      metrics->vertAdvance        = ( face->cid.font_bbox.yMax -\n                                      face->cid.font_bbox.yMin ) >> 16;\n      cidglyph->linearVertAdvance = metrics->vertAdvance;\n\n      cidglyph->format            = FT_GLYPH_FORMAT_OUTLINE;\n\n      if ( cidsize->metrics.y_ppem < 24 )\n        cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;\n\n      /* apply the font matrix */\n      FT_Outline_Transform( &cidglyph->outline, &font_matrix );\n\n      FT_Outline_Translate( &cidglyph->outline,\n                            font_offset.x,\n                            font_offset.y );\n\n      advance.x = metrics->horiAdvance;\n      advance.y = 0;\n      FT_Vector_Transform( &advance, &font_matrix );\n      metrics->horiAdvance = advance.x + font_offset.x;\n\n      advance.x = 0;\n      advance.y = metrics->vertAdvance;\n      FT_Vector_Transform( &advance, &font_matrix );\n      metrics->vertAdvance = advance.y + font_offset.y;\n\n      if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )\n      {\n        /* scale the outline and the metrics */\n        FT_Int       n;\n        FT_Outline*  cur = decoder.builder.base;\n        FT_Vector*   vec = cur->points;\n        FT_Fixed     x_scale = glyph->x_scale;\n        FT_Fixed     y_scale = glyph->y_scale;\n\n\n        /* First of all, scale the points */\n        if ( !hinting || !decoder.builder.hints_funcs )\n          for ( n = cur->n_points; n > 0; n--, vec++ )\n          {\n            vec->x = FT_MulFix( vec->x, x_scale );\n            vec->y = FT_MulFix( vec->y, y_scale );\n          }\n\n        /* Then scale the metrics */\n        metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );\n        metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );\n      }\n\n      /* compute the other metrics */\n      FT_Outline_Get_CBox( &cidglyph->outline, &cbox );\n\n      metrics->width  = cbox.xMax - cbox.xMin;\n      metrics->height = cbox.yMax - cbox.yMin;\n\n      metrics->horiBearingX = cbox.xMin;\n      metrics->horiBearingY = cbox.yMax;\n\n      if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n      {\n        /* make up vertical ones */\n        ft_synthesize_vertical_metrics( metrics,\n                                        metrics->vertAdvance );\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidgload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidgload.h                                                             */\n/*                                                                         */\n/*    OpenType Glyph Loader (specification).                               */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2004 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDGLOAD_H__\n#define __CIDGLOAD_H__\n\n\n#include <ft2build.h>\n#include \"cidobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#if 0\n\n  /* Compute the maximum advance width of a font through quick parsing */\n  FT_LOCAL( FT_Error )\n  cid_face_compute_max_advance( CID_Face  face,\n                                FT_Int*   max_advance );\n\n#endif /* 0 */\n\n  FT_LOCAL( FT_Error )\n  cid_slot_load_glyph( FT_GlyphSlot  glyph,         /* CID_Glyph_Slot */\n                       FT_Size       size,          /* CID_Size       */\n                       FT_UInt       glyph_index,\n                       FT_Int32      load_flags );\n\n\nFT_END_HEADER\n\n#endif /* __CIDGLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidload.c                                                              */\n/*                                                                         */\n/*    CID-keyed Type1 font loader (body).                                  */\n/*                                                                         */\n/*  Copyright 1996-2006, 2009, 2011-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_CONFIG_CONFIG_H\n#include FT_MULTIPLE_MASTERS_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n\n#include \"cidload.h\"\n\n#include \"ciderrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cidload\n\n\n  /* read a single offset */\n  FT_LOCAL_DEF( FT_Long )\n  cid_get_offset( FT_Byte*  *start,\n                  FT_Byte    offsize )\n  {\n    FT_ULong  result;\n    FT_Byte*  p = *start;\n\n\n    for ( result = 0; offsize > 0; offsize-- )\n    {\n      result <<= 8;\n      result  |= *p++;\n    }\n\n    *start = p;\n    return (FT_Long)result;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    TYPE 1 SYMBOL PARSING                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  static FT_Error\n  cid_load_keyword( CID_Face        face,\n                    CID_Loader*     loader,\n                    const T1_Field  keyword )\n  {\n    FT_Error      error;\n    CID_Parser*   parser = &loader->parser;\n    FT_Byte*      object;\n    void*         dummy_object;\n    CID_FaceInfo  cid = &face->cid;\n\n\n    /* if the keyword has a dedicated callback, call it */\n    if ( keyword->type == T1_FIELD_TYPE_CALLBACK )\n    {\n      keyword->reader( (FT_Face)face, parser );\n      error = parser->root.error;\n      goto Exit;\n    }\n\n    /* we must now compute the address of our target object */\n    switch ( keyword->location )\n    {\n    case T1_FIELD_LOCATION_CID_INFO:\n      object = (FT_Byte*)cid;\n      break;\n\n    case T1_FIELD_LOCATION_FONT_INFO:\n      object = (FT_Byte*)&cid->font_info;\n      break;\n\n    case T1_FIELD_LOCATION_FONT_EXTRA:\n      object = (FT_Byte*)&face->font_extra;\n      break;\n\n    case T1_FIELD_LOCATION_BBOX:\n      object = (FT_Byte*)&cid->font_bbox;\n      break;\n\n    default:\n      {\n        CID_FaceDict  dict;\n\n\n        if ( parser->num_dict < 0 || parser->num_dict >= cid->num_dicts )\n        {\n          FT_ERROR(( \"cid_load_keyword: invalid use of `%s'\\n\",\n                     keyword->ident ));\n          error = FT_THROW( Syntax_Error );\n          goto Exit;\n        }\n\n        dict = cid->font_dicts + parser->num_dict;\n        switch ( keyword->location )\n        {\n        case T1_FIELD_LOCATION_PRIVATE:\n          object = (FT_Byte*)&dict->private_dict;\n          break;\n\n        default:\n          object = (FT_Byte*)dict;\n        }\n      }\n    }\n\n    dummy_object = object;\n\n    /* now, load the keyword data in the object's field(s) */\n    if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY ||\n         keyword->type == T1_FIELD_TYPE_FIXED_ARRAY   )\n      error = cid_parser_load_field_table( &loader->parser, keyword,\n                                           &dummy_object );\n    else\n      error = cid_parser_load_field( &loader->parser,\n                                     keyword, &dummy_object );\n  Exit:\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  cid_parse_font_matrix( CID_Face     face,\n                         CID_Parser*  parser )\n  {\n    FT_Matrix*    matrix;\n    FT_Vector*    offset;\n    CID_FaceDict  dict;\n    FT_Face       root = (FT_Face)&face->root;\n    FT_Fixed      temp[6];\n    FT_Fixed      temp_scale;\n\n\n    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )\n    {\n      dict   = face->cid.font_dicts + parser->num_dict;\n      matrix = &dict->font_matrix;\n      offset = &dict->font_offset;\n\n      (void)cid_parser_to_fixed_array( parser, 6, temp, 3 );\n\n      temp_scale = FT_ABS( temp[3] );\n\n      /* Set Units per EM based on FontMatrix values.  We set the value to */\n      /* 1000 / temp_scale, because temp_scale was already multiplied by   */\n      /* 1000 (in t1_tofixed, from psobjs.c).                              */\n\n      root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );\n\n      /* we need to scale the values by 1.0/temp[3] */\n      if ( temp_scale != 0x10000L )\n      {\n        temp[0] = FT_DivFix( temp[0], temp_scale );\n        temp[1] = FT_DivFix( temp[1], temp_scale );\n        temp[2] = FT_DivFix( temp[2], temp_scale );\n        temp[4] = FT_DivFix( temp[4], temp_scale );\n        temp[5] = FT_DivFix( temp[5], temp_scale );\n        temp[3] = 0x10000L;\n      }\n\n      matrix->xx = temp[0];\n      matrix->yx = temp[1];\n      matrix->xy = temp[2];\n      matrix->yy = temp[3];\n\n      /* note that the font offsets are expressed in integer font units */\n      offset->x  = temp[4] >> 16;\n      offset->y  = temp[5] >> 16;\n    }\n\n    return FT_Err_Ok;      /* this is a callback function; */\n                            /* we must return an error code */\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  parse_fd_array( CID_Face     face,\n                  CID_Parser*  parser )\n  {\n    CID_FaceInfo  cid    = &face->cid;\n    FT_Memory     memory = face->root.memory;\n    FT_Error      error  = FT_Err_Ok;\n    FT_Long       num_dicts;\n\n\n    num_dicts = cid_parser_to_int( parser );\n\n    if ( !cid->font_dicts )\n    {\n      FT_Int  n;\n\n\n      if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) )\n        goto Exit;\n\n      cid->num_dicts = (FT_UInt)num_dicts;\n\n      /* don't forget to set a few defaults */\n      for ( n = 0; n < cid->num_dicts; n++ )\n      {\n        CID_FaceDict  dict = cid->font_dicts + n;\n\n\n        /* default value for lenIV */\n        dict->private_dict.lenIV = 4;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* by mistake, `expansion_factor' appears both in PS_PrivateRec */\n  /* and CID_FaceDictRec (both are public header files and can't  */\n  /* changed); we simply copy the value                           */\n\n  FT_CALLBACK_DEF( FT_Error )\n  parse_expansion_factor( CID_Face     face,\n                          CID_Parser*  parser )\n  {\n    CID_FaceDict  dict;\n\n\n    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )\n    {\n      dict = face->cid.font_dicts + parser->num_dict;\n\n      dict->expansion_factor              = cid_parser_to_fixed( parser, 0 );\n      dict->private_dict.expansion_factor = dict->expansion_factor;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  static\n  const T1_FieldRec  cid_field_records[] =\n  {\n\n#include \"cidtoken.h\"\n\n    T1_FIELD_CALLBACK( \"FDArray\",         parse_fd_array, 0 )\n    T1_FIELD_CALLBACK( \"FontMatrix\",      cid_parse_font_matrix, 0 )\n    T1_FIELD_CALLBACK( \"ExpansionFactor\", parse_expansion_factor, 0 )\n\n    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }\n  };\n\n\n  static FT_Error\n  cid_parse_dict( CID_Face     face,\n                  CID_Loader*  loader,\n                  FT_Byte*     base,\n                  FT_Long      size )\n  {\n    CID_Parser*  parser = &loader->parser;\n\n\n    parser->root.cursor = base;\n    parser->root.limit  = base + size;\n    parser->root.error  = FT_Err_Ok;\n\n    {\n      FT_Byte*  cur   = base;\n      FT_Byte*  limit = cur + size;\n\n\n      for (;;)\n      {\n        FT_Byte*  newlimit;\n\n\n        parser->root.cursor = cur;\n        cid_parser_skip_spaces( parser );\n\n        if ( parser->root.cursor >= limit )\n          newlimit = limit - 1 - 17;\n        else\n          newlimit = parser->root.cursor - 17;\n\n        /* look for `%ADOBeginFontDict' */\n        for ( ; cur < newlimit; cur++ )\n        {\n          if ( *cur == '%'                                            &&\n               ft_strncmp( (char*)cur, \"%ADOBeginFontDict\", 17 ) == 0 )\n          {\n            /* if /FDArray was found, then cid->num_dicts is > 0, and */\n            /* we can start increasing parser->num_dict               */\n            if ( face->cid.num_dicts > 0 )\n              parser->num_dict++;\n          }\n        }\n\n        cur = parser->root.cursor;\n        /* no error can occur in cid_parser_skip_spaces */\n        if ( cur >= limit )\n          break;\n\n        cid_parser_skip_PS_token( parser );\n        if ( parser->root.cursor >= limit || parser->root.error )\n          break;\n\n        /* look for immediates */\n        if ( *cur == '/' && cur + 2 < limit )\n        {\n          FT_PtrDist  len;\n\n\n          cur++;\n          len = parser->root.cursor - cur;\n\n          if ( len > 0 && len < 22 )\n          {\n            /* now compare the immediate name to the keyword table */\n            T1_Field  keyword = (T1_Field)cid_field_records;\n\n\n            for (;;)\n            {\n              FT_Byte*  name;\n\n\n              name = (FT_Byte*)keyword->ident;\n              if ( !name )\n                break;\n\n              if ( cur[0] == name[0]                                 &&\n                   len == (FT_PtrDist)ft_strlen( (const char*)name ) )\n              {\n                FT_PtrDist  n;\n\n\n                for ( n = 1; n < len; n++ )\n                  if ( cur[n] != name[n] )\n                    break;\n\n                if ( n >= len )\n                {\n                  /* we found it - run the parsing callback */\n                  parser->root.error = cid_load_keyword( face,\n                                                         loader,\n                                                         keyword );\n                  if ( parser->root.error )\n                    return parser->root.error;\n                  break;\n                }\n              }\n              keyword++;\n            }\n          }\n        }\n\n        cur = parser->root.cursor;\n      }\n    }\n    return parser->root.error;\n  }\n\n\n  /* read the subrmap and the subrs of each font dict */\n  static FT_Error\n  cid_read_subrs( CID_Face  face )\n  {\n    CID_FaceInfo   cid    = &face->cid;\n    FT_Memory      memory = face->root.memory;\n    FT_Stream      stream = face->cid_stream;\n    FT_Error       error;\n    FT_Int         n;\n    CID_Subrs      subr;\n    FT_UInt        max_offsets = 0;\n    FT_ULong*      offsets = 0;\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) )\n      goto Exit;\n\n    subr = face->subrs;\n    for ( n = 0; n < cid->num_dicts; n++, subr++ )\n    {\n      CID_FaceDict  dict  = cid->font_dicts + n;\n      FT_Int        lenIV = dict->private_dict.lenIV;\n      FT_UInt       count, num_subrs = dict->num_subrs;\n      FT_ULong      data_len;\n      FT_Byte*      p;\n\n\n      /* Check for possible overflow. */\n      if ( num_subrs == FT_UINT_MAX )\n      {\n        error = FT_THROW( Syntax_Error );\n        goto Fail;\n      }\n\n      /* reallocate offsets array if needed */\n      if ( num_subrs + 1 > max_offsets )\n      {\n        FT_UInt  new_max = FT_PAD_CEIL( num_subrs + 1, 4 );\n\n\n        if ( new_max <= max_offsets )\n        {\n          error = FT_THROW( Syntax_Error );\n          goto Fail;\n        }\n\n        if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) )\n          goto Fail;\n\n        max_offsets = new_max;\n      }\n\n      /* read the subrmap's offsets */\n      if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) ||\n           FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes )      )\n        goto Fail;\n\n      p = (FT_Byte*)stream->cursor;\n      for ( count = 0; count <= num_subrs; count++ )\n        offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes );\n\n      FT_FRAME_EXIT();\n\n      /* offsets must be ordered */\n      for ( count = 1; count <= num_subrs; count++ )\n        if ( offsets[count - 1] > offsets[count] )\n          goto Fail;\n\n      /* now, compute the size of subrs charstrings, */\n      /* allocate, and read them                     */\n      data_len = offsets[num_subrs] - offsets[0];\n\n      if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) ||\n               FT_ALLOC( subr->code[0], data_len )   )\n        goto Fail;\n\n      if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) ||\n           FT_STREAM_READ( subr->code[0], data_len )  )\n        goto Fail;\n\n      /* set up pointers */\n      for ( count = 1; count <= num_subrs; count++ )\n      {\n        FT_ULong  len;\n\n\n        len               = offsets[count] - offsets[count - 1];\n        subr->code[count] = subr->code[count - 1] + len;\n      }\n\n      /* decrypt subroutines, but only if lenIV >= 0 */\n      if ( lenIV >= 0 )\n      {\n        for ( count = 0; count < num_subrs; count++ )\n        {\n          FT_ULong  len;\n\n\n          len = offsets[count + 1] - offsets[count];\n          psaux->t1_decrypt( subr->code[count], len, 4330 );\n        }\n      }\n\n      subr->num_subrs = num_subrs;\n    }\n\n  Exit:\n    FT_FREE( offsets );\n    return error;\n\n  Fail:\n    if ( face->subrs )\n    {\n      for ( n = 0; n < cid->num_dicts; n++ )\n      {\n        if ( face->subrs[n].code )\n          FT_FREE( face->subrs[n].code[0] );\n\n        FT_FREE( face->subrs[n].code );\n      }\n      FT_FREE( face->subrs );\n    }\n    goto Exit;\n  }\n\n\n  static void\n  cid_init_loader( CID_Loader*  loader,\n                   CID_Face     face )\n  {\n    FT_UNUSED( face );\n\n    FT_MEM_ZERO( loader, sizeof ( *loader ) );\n  }\n\n\n  static  void\n  cid_done_loader( CID_Loader*  loader )\n  {\n    CID_Parser*  parser = &loader->parser;\n\n\n    /* finalize parser */\n    cid_parser_done( parser );\n  }\n\n\n  static FT_Error\n  cid_hex_to_binary( FT_Byte*  data,\n                     FT_Long   data_len,\n                     FT_ULong  offset,\n                     CID_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n    FT_Error   error;\n\n    FT_Byte    buffer[256];\n    FT_Byte   *p, *plimit;\n    FT_Byte   *d, *dlimit;\n    FT_Byte    val;\n\n    FT_Bool    upper_nibble, done;\n\n\n    if ( FT_STREAM_SEEK( offset ) )\n      goto Exit;\n\n    d      = data;\n    dlimit = d + data_len;\n    p      = buffer;\n    plimit = p;\n\n    upper_nibble = 1;\n    done         = 0;\n\n    while ( d < dlimit )\n    {\n      if ( p >= plimit )\n      {\n        FT_ULong  oldpos = FT_STREAM_POS();\n        FT_ULong  size   = stream->size - oldpos;\n\n\n        if ( size == 0 )\n        {\n          error = FT_THROW( Syntax_Error );\n          goto Exit;\n        }\n\n        if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) )\n          goto Exit;\n        p      = buffer;\n        plimit = p + FT_STREAM_POS() - oldpos;\n      }\n\n      if ( ft_isdigit( *p ) )\n        val = (FT_Byte)( *p - '0' );\n      else if ( *p >= 'a' && *p <= 'f' )\n        val = (FT_Byte)( *p - 'a' );\n      else if ( *p >= 'A' && *p <= 'F' )\n        val = (FT_Byte)( *p - 'A' + 10 );\n      else if ( *p == ' '  ||\n                *p == '\\t' ||\n                *p == '\\r' ||\n                *p == '\\n' ||\n                *p == '\\f' ||\n                *p == '\\0' )\n      {\n        p++;\n        continue;\n      }\n      else if ( *p == '>' )\n      {\n        val  = 0;\n        done = 1;\n      }\n      else\n      {\n        error = FT_THROW( Syntax_Error );\n        goto Exit;\n      }\n\n      if ( upper_nibble )\n        *d = (FT_Byte)( val << 4 );\n      else\n      {\n        *d = (FT_Byte)( *d + val );\n        d++;\n      }\n\n      upper_nibble = (FT_Byte)( 1 - upper_nibble );\n\n      if ( done )\n        break;\n\n      p++;\n    }\n\n    error = FT_Err_Ok;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_face_open( CID_Face  face,\n                 FT_Int    face_index )\n  {\n    CID_Loader   loader;\n    CID_Parser*  parser;\n    FT_Memory    memory = face->root.memory;\n    FT_Error     error;\n\n\n    cid_init_loader( &loader, face );\n\n    parser = &loader.parser;\n    error = cid_parser_new( parser, face->root.stream, face->root.memory,\n                            (PSAux_Service)face->psaux );\n    if ( error )\n      goto Exit;\n\n    error = cid_parse_dict( face, &loader,\n                            parser->postscript,\n                            parser->postscript_len );\n    if ( error )\n      goto Exit;\n\n    if ( face_index < 0 )\n      goto Exit;\n\n    if ( FT_NEW( face->cid_stream ) )\n      goto Exit;\n\n    if ( parser->binary_length )\n    {\n      /* we must convert the data section from hexadecimal to binary */\n      if ( FT_ALLOC( face->binary_data, parser->binary_length )         ||\n           cid_hex_to_binary( face->binary_data, parser->binary_length,\n                              parser->data_offset, face )               )\n        goto Exit;\n\n      FT_Stream_OpenMemory( face->cid_stream,\n                            face->binary_data, parser->binary_length );\n      face->cid.data_offset = 0;\n    }\n    else\n    {\n      *face->cid_stream     = *face->root.stream;\n      face->cid.data_offset = loader.parser.data_offset;\n    }\n\n    error = cid_read_subrs( face );\n\n  Exit:\n    cid_done_loader( &loader );\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidload.h                                                              */\n/*                                                                         */\n/*    CID-keyed Type1 font loader (specification).                         */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDLOAD_H__\n#define __CIDLOAD_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_STREAM_H\n#include \"cidparse.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct  CID_Loader_\n  {\n    CID_Parser  parser;          /* parser used to read the stream */\n    FT_Int      num_chars;       /* number of characters in encoding */\n\n  } CID_Loader;\n\n\n  FT_LOCAL( FT_Long )\n  cid_get_offset( FT_Byte**  start,\n                  FT_Byte    offsize );\n\n  FT_LOCAL( FT_Error )\n  cid_face_open( CID_Face  face,\n                 FT_Int    face_index );\n\n\nFT_END_HEADER\n\n#endif /* __CIDLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidobjs.c                                                              */\n/*                                                                         */\n/*    CID objects manager (body).                                          */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2010-2011, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n\n#include \"cidgload.h\"\n#include \"cidload.h\"\n\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n\n#include \"ciderrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cidobjs\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SLOT  FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  cid_slot_done( FT_GlyphSlot  slot )\n  {\n    slot->internal->glyph_hints = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_slot_init( FT_GlyphSlot  slot )\n  {\n    CID_Face          face;\n    PSHinter_Service  pshinter;\n\n\n    face     = (CID_Face)slot->face;\n    pshinter = (PSHinter_Service)face->pshinter;\n\n    if ( pshinter )\n    {\n      FT_Module  module;\n\n\n      module = FT_Get_Module( slot->face->driver->root.library,\n                              \"pshinter\" );\n      if ( module )\n      {\n        T1_Hints_Funcs  funcs;\n\n\n        funcs = pshinter->get_t1_funcs( module );\n        slot->internal->glyph_hints = (void*)funcs;\n      }\n    }\n\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                           SIZE  FUNCTIONS                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static PSH_Globals_Funcs\n  cid_size_get_globals_funcs( CID_Size  size )\n  {\n    CID_Face          face     = (CID_Face)size->root.face;\n    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;\n    FT_Module         module;\n\n\n    module = FT_Get_Module( size->root.face->driver->root.library,\n                            \"pshinter\" );\n    return ( module && pshinter && pshinter->get_globals_funcs )\n           ? pshinter->get_globals_funcs( module )\n           : 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cid_size_done( FT_Size  cidsize )         /* CID_Size */\n  {\n    CID_Size  size = (CID_Size)cidsize;\n\n\n    if ( cidsize->internal )\n    {\n      PSH_Globals_Funcs  funcs;\n\n\n      funcs = cid_size_get_globals_funcs( size );\n      if ( funcs )\n        funcs->destroy( (PSH_Globals)cidsize->internal );\n\n      cidsize->internal = 0;\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_size_init( FT_Size  cidsize )     /* CID_Size */\n  {\n    CID_Size           size  = (CID_Size)cidsize;\n    FT_Error           error = FT_Err_Ok;\n    PSH_Globals_Funcs  funcs = cid_size_get_globals_funcs( size );\n\n\n    if ( funcs )\n    {\n      PSH_Globals   globals;\n      CID_Face      face = (CID_Face)cidsize->face;\n      CID_FaceDict  dict = face->cid.font_dicts + face->root.face_index;\n      PS_Private    priv = &dict->private_dict;\n\n\n      error = funcs->create( cidsize->face->memory, priv, &globals );\n      if ( !error )\n        cidsize->internal = (FT_Size_Internal)(void*)globals;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL( FT_Error )\n  cid_size_request( FT_Size          size,\n                    FT_Size_Request  req )\n  {\n    PSH_Globals_Funcs  funcs;\n\n\n    FT_Request_Metrics( size->face, req );\n\n    funcs = cid_size_get_globals_funcs( (CID_Size)size );\n\n    if ( funcs )\n      funcs->set_scale( (PSH_Globals)size->internal,\n                        size->metrics.x_scale,\n                        size->metrics.y_scale,\n                        0, 0 );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                           FACE  FUNCTIONS                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cid_face_done                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given face object.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A pointer to the face object to destroy.                   */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  cid_face_done( FT_Face  cidface )         /* CID_Face */\n  {\n    CID_Face      face = (CID_Face)cidface;\n    FT_Memory     memory;\n    CID_FaceInfo  cid;\n    PS_FontInfo   info;\n\n\n    if ( !face )\n      return;\n\n    cid    = &face->cid;\n    info   = &cid->font_info;\n    memory = cidface->memory;\n\n    /* release subrs */\n    if ( face->subrs )\n    {\n      FT_Int  n;\n\n\n      for ( n = 0; n < cid->num_dicts; n++ )\n      {\n        CID_Subrs  subr = face->subrs + n;\n\n\n        if ( subr->code )\n        {\n          FT_FREE( subr->code[0] );\n          FT_FREE( subr->code );\n        }\n      }\n\n      FT_FREE( face->subrs );\n    }\n\n    /* release FontInfo strings */\n    FT_FREE( info->version );\n    FT_FREE( info->notice );\n    FT_FREE( info->full_name );\n    FT_FREE( info->family_name );\n    FT_FREE( info->weight );\n\n    /* release font dictionaries */\n    FT_FREE( cid->font_dicts );\n    cid->num_dicts = 0;\n\n    /* release other strings */\n    FT_FREE( cid->cid_font_name );\n    FT_FREE( cid->registry );\n    FT_FREE( cid->ordering );\n\n    cidface->family_name = 0;\n    cidface->style_name  = 0;\n\n    FT_FREE( face->binary_data );\n    FT_FREE( face->cid_stream );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cid_face_init                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given CID face object.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The source font stream.                              */\n  /*                                                                       */\n  /*    face_index :: The index of the font face in the resource.          */\n  /*                                                                       */\n  /*    num_params :: Number of additional generic parameters.  Ignored.   */\n  /*                                                                       */\n  /*    params     :: Additional generic parameters.  Ignored.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The newly built face object.                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  cid_face_init( FT_Stream      stream,\n                 FT_Face        cidface,        /* CID_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params )\n  {\n    CID_Face          face = (CID_Face)cidface;\n    FT_Error          error;\n    PSAux_Service     psaux;\n    PSHinter_Service  pshinter;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n    FT_UNUSED( stream );\n\n\n    cidface->num_faces = 1;\n\n    psaux = (PSAux_Service)face->psaux;\n    if ( !psaux )\n    {\n      psaux = (PSAux_Service)FT_Get_Module_Interface(\n                FT_FACE_LIBRARY( face ), \"psaux\" );\n\n      if ( !psaux )\n      {\n        FT_ERROR(( \"cid_face_init: cannot access `psaux' module\\n\" ));\n        error = FT_THROW( Missing_Module );\n        goto Exit;\n      }\n\n      face->psaux = psaux;\n    }\n\n    pshinter = (PSHinter_Service)face->pshinter;\n    if ( !pshinter )\n    {\n      pshinter = (PSHinter_Service)FT_Get_Module_Interface(\n                   FT_FACE_LIBRARY( face ), \"pshinter\" );\n\n      face->pshinter = pshinter;\n    }\n\n    FT_TRACE2(( \"CID driver\\n\" ));\n\n    /* open the tokenizer; this will also check the font format */\n    if ( FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    error = cid_face_open( face, face_index );\n    if ( error )\n      goto Exit;\n\n    /* if we just wanted to check the format, leave successfully now */\n    if ( face_index < 0 )\n      goto Exit;\n\n    /* check the face index */\n    /* XXX: handle CID fonts with more than a single face */\n    if ( face_index != 0 )\n    {\n      FT_ERROR(( \"cid_face_init: invalid face index\\n\" ));\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* now load the font program into the face object */\n\n    /* initialize the face object fields */\n\n    /* set up root face fields */\n    {\n      CID_FaceInfo  cid  = &face->cid;\n      PS_FontInfo   info = &cid->font_info;\n\n\n      cidface->num_glyphs   = cid->cid_count;\n      cidface->num_charmaps = 0;\n\n      cidface->face_index = face_index;\n      cidface->face_flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */\n                            FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */\n                            FT_FACE_FLAG_HINTER;      /* has native hinter */\n\n      if ( info->is_fixed_pitch )\n        cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      /* XXX: TODO: add kerning with .afm support */\n\n      /* get style name -- be careful, some broken fonts only */\n      /* have a /FontName dictionary entry!                   */\n      cidface->family_name = info->family_name;\n      /* assume \"Regular\" style if we don't know better */\n      cidface->style_name = (char *)\"Regular\";\n      if ( cidface->family_name )\n      {\n        char*  full   = info->full_name;\n        char*  family = cidface->family_name;\n\n\n        if ( full )\n        {\n          while ( *full )\n          {\n            if ( *full == *family )\n            {\n              family++;\n              full++;\n            }\n            else\n            {\n              if ( *full == ' ' || *full == '-' )\n                full++;\n              else if ( *family == ' ' || *family == '-' )\n                family++;\n              else\n              {\n                if ( !*family )\n                  cidface->style_name = full;\n                break;\n              }\n            }\n          }\n        }\n      }\n      else\n      {\n        /* do we have a `/FontName'? */\n        if ( cid->cid_font_name )\n          cidface->family_name = cid->cid_font_name;\n      }\n\n      /* compute style flags */\n      cidface->style_flags = 0;\n      if ( info->italic_angle )\n        cidface->style_flags |= FT_STYLE_FLAG_ITALIC;\n      if ( info->weight )\n      {\n        if ( !ft_strcmp( info->weight, \"Bold\"  ) ||\n             !ft_strcmp( info->weight, \"Black\" ) )\n          cidface->style_flags |= FT_STYLE_FLAG_BOLD;\n      }\n\n      /* no embedded bitmap support */\n      cidface->num_fixed_sizes = 0;\n      cidface->available_sizes = 0;\n\n      cidface->bbox.xMin =   cid->font_bbox.xMin            >> 16;\n      cidface->bbox.yMin =   cid->font_bbox.yMin            >> 16;\n      /* no `U' suffix here to 0xFFFF! */\n      cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16;\n      cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16;\n\n      if ( !cidface->units_per_EM )\n        cidface->units_per_EM = 1000;\n\n      cidface->ascender  = (FT_Short)( cidface->bbox.yMax );\n      cidface->descender = (FT_Short)( cidface->bbox.yMin );\n\n      cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );\n      if ( cidface->height < cidface->ascender - cidface->descender )\n        cidface->height = (FT_Short)( cidface->ascender - cidface->descender );\n\n      cidface->underline_position  = (FT_Short)info->underline_position;\n      cidface->underline_thickness = (FT_Short)info->underline_thickness;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cid_driver_init                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given CID driver object.                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target driver object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  cid_driver_init( FT_Module  driver )\n  {\n    FT_UNUSED( driver );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    cid_driver_done                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given CID driver.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target CID driver.                       */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  cid_driver_done( FT_Module  driver )\n  {\n    FT_UNUSED( driver );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidobjs.h                                                              */\n/*                                                                         */\n/*    CID objects manager (specification).                                 */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2004, 2006 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDOBJS_H__\n#define __CIDOBJS_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_CONFIG_CONFIG_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  /* The following structures must be defined by the hinter */\n  typedef struct CID_Size_Hints_   CID_Size_Hints;\n  typedef struct CID_Glyph_Hints_  CID_Glyph_Hints;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CID_Driver                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 driver object.                                */\n  /*                                                                       */\n  typedef struct CID_DriverRec_*  CID_Driver;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CID_Size                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 size object.                                  */\n  /*                                                                       */\n  typedef struct CID_SizeRec_*  CID_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CID_GlyphSlot                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 glyph slot object.                            */\n  /*                                                                       */\n  typedef struct CID_GlyphSlotRec_*  CID_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    CID_CharMap                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 character mapping object.                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The Type 1 format doesn't use a charmap but an encoding table.     */\n  /*    The driver is responsible for making up charmap objects            */\n  /*    corresponding to these tables.                                     */\n  /*                                                                       */\n  typedef struct CID_CharMapRec_*  CID_CharMap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  typedef struct  CID_SizeRec_\n  {\n    FT_SizeRec  root;\n    FT_Bool     valid;\n\n  } CID_SizeRec;\n\n\n  typedef struct  CID_GlyphSlotRec_\n  {\n    FT_GlyphSlotRec  root;\n\n    FT_Bool          hint;\n    FT_Bool          scaled;\n\n    FT_Fixed         x_scale;\n    FT_Fixed         y_scale;\n\n  } CID_GlyphSlotRec;\n\n\n  FT_LOCAL( void )\n  cid_slot_done( FT_GlyphSlot  slot );\n\n  FT_LOCAL( FT_Error )\n  cid_slot_init( FT_GlyphSlot  slot );\n\n\n  FT_LOCAL( void )\n  cid_size_done( FT_Size  size );       /* CID_Size */\n\n  FT_LOCAL( FT_Error )\n  cid_size_init( FT_Size  size );       /* CID_Size */\n\n  FT_LOCAL( FT_Error )\n  cid_size_request( FT_Size          size,      /* CID_Size */\n                    FT_Size_Request  req );\n\n  FT_LOCAL( FT_Error )\n  cid_face_init( FT_Stream      stream,\n                 FT_Face        face,           /* CID_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  cid_face_done( FT_Face  face );               /* CID_Face */\n\n\n  FT_LOCAL( FT_Error )\n  cid_driver_init( FT_Module  driver );\n\n  FT_LOCAL( void )\n  cid_driver_done( FT_Module  driver );\n\n\nFT_END_HEADER\n\n#endif /* __CIDOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidparse.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidparse.c                                                             */\n/*                                                                         */\n/*    CID-keyed Type1 parser (body).                                       */\n/*                                                                         */\n/*  Copyright 1996-2007, 2009, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_STREAM_H\n\n#include \"cidparse.h\"\n\n#include \"ciderrs.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_cidparse\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    INPUT STREAM PARSER                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  cid_parser_new( CID_Parser*    parser,\n                  FT_Stream      stream,\n                  FT_Memory      memory,\n                  PSAux_Service  psaux )\n  {\n    FT_Error  error;\n    FT_ULong  base_offset, offset, ps_len;\n    FT_Byte   *cur, *limit;\n    FT_Byte   *arg1, *arg2;\n\n\n    FT_MEM_ZERO( parser, sizeof ( *parser ) );\n    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );\n\n    parser->stream = stream;\n\n    base_offset = FT_STREAM_POS();\n\n    /* first of all, check the font format in the header */\n    if ( FT_FRAME_ENTER( 31 ) )\n      goto Exit;\n\n    if ( ft_strncmp( (char *)stream->cursor,\n                     \"%!PS-Adobe-3.0 Resource-CIDFont\", 31 ) )\n    {\n      FT_TRACE2(( \"  not a CID-keyed font\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n    }\n\n    FT_FRAME_EXIT();\n    if ( error )\n      goto Exit;\n\n  Again:\n    /* now, read the rest of the file until we find */\n    /* `StartData' or `/sfnts'                      */\n    {\n      FT_Byte   buffer[256 + 10];\n      FT_Long   read_len = 256 + 10; /* same as signed FT_Stream->size */\n      FT_Byte*  p        = buffer;\n\n\n      for ( offset = FT_STREAM_POS(); ; offset += 256 )\n      {\n        FT_Long  stream_len; /* same as signed FT_Stream->size */\n\n\n        stream_len = stream->size - FT_STREAM_POS();\n        if ( stream_len == 0 )\n        {\n          FT_TRACE2(( \"cid_parser_new: no `StartData' keyword found\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        read_len = FT_MIN( read_len, stream_len );\n        if ( FT_STREAM_READ( p, read_len ) )\n          goto Exit;\n\n        if ( read_len < 256 )\n          p[read_len]  = '\\0';\n\n        limit = p + read_len - 10;\n\n        for ( p = buffer; p < limit; p++ )\n        {\n          if ( p[0] == 'S' && ft_strncmp( (char*)p, \"StartData\", 9 ) == 0 )\n          {\n            /* save offset of binary data after `StartData' */\n            offset += p - buffer + 10;\n            goto Found;\n          }\n          else if ( p[1] == 's' && ft_strncmp( (char*)p, \"/sfnts\", 6 ) == 0 )\n          {\n            offset += p - buffer + 7;\n            goto Found;\n          }\n        }\n\n        FT_MEM_MOVE( buffer, p, 10 );\n        read_len = 256;\n        p = buffer + 10;\n      }\n    }\n\n  Found:\n    /* We have found the start of the binary data or the `/sfnts' token. */\n    /* Now rewind and extract the frame corresponding to this PostScript */\n    /* section.                                                          */\n\n    ps_len = offset - base_offset;\n    if ( FT_STREAM_SEEK( base_offset )                  ||\n         FT_FRAME_EXTRACT( ps_len, parser->postscript ) )\n      goto Exit;\n\n    parser->data_offset    = offset;\n    parser->postscript_len = ps_len;\n    parser->root.base      = parser->postscript;\n    parser->root.cursor    = parser->postscript;\n    parser->root.limit     = parser->root.cursor + ps_len;\n    parser->num_dict       = -1;\n\n    /* Finally, we check whether `StartData' or `/sfnts' was real --  */\n    /* it could be in a comment or string.  We also get the arguments */\n    /* of `StartData' to find out whether the data is represented in  */\n    /* binary or hex format.                                          */\n\n    arg1 = parser->root.cursor;\n    cid_parser_skip_PS_token( parser );\n    cid_parser_skip_spaces  ( parser );\n    arg2 = parser->root.cursor;\n    cid_parser_skip_PS_token( parser );\n    cid_parser_skip_spaces  ( parser );\n\n    limit = parser->root.limit;\n    cur   = parser->root.cursor;\n\n    while ( cur < limit )\n    {\n      if ( parser->root.error )\n      {\n        error = parser->root.error;\n        goto Exit;\n      }\n\n      if ( cur[0] == 'S' && ft_strncmp( (char*)cur, \"StartData\", 9 ) == 0 )\n      {\n        if ( ft_strncmp( (char*)arg1, \"(Hex)\", 5 ) == 0 )\n          parser->binary_length = ft_atol( (const char *)arg2 );\n\n        limit = parser->root.limit;\n        cur   = parser->root.cursor;\n        goto Exit;\n      }\n      else if ( cur[1] == 's' && ft_strncmp( (char*)cur, \"/sfnts\", 6 ) == 0 )\n      {\n        FT_TRACE2(( \"cid_parser_new: cannot handle Type 11 fonts\\n\" ));\n        error = FT_THROW( Unknown_File_Format );\n        goto Exit;\n      }\n\n      cid_parser_skip_PS_token( parser );\n      cid_parser_skip_spaces  ( parser );\n      arg1 = arg2;\n      arg2 = cur;\n      cur  = parser->root.cursor;\n    }\n\n    /* we haven't found the correct `StartData'; go back and continue */\n    /* searching                                                      */\n    FT_FRAME_RELEASE( parser->postscript );\n    if ( !FT_STREAM_SEEK( offset ) )\n      goto Again;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  cid_parser_done( CID_Parser*  parser )\n  {\n    /* always free the private dictionary */\n    if ( parser->postscript )\n    {\n      FT_Stream  stream = parser->stream;\n\n\n      FT_FRAME_RELEASE( parser->postscript );\n    }\n    parser->root.funcs.done( &parser->root );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidparse.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidparse.h                                                             */\n/*                                                                         */\n/*    CID-keyed Type1 parser (specification).                              */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDPARSE_H__\n#define __CIDPARSE_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_TYPE1_TYPES_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    CID_Parser                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A CID_Parser is an object used to parse a Type 1 fonts very        */\n  /*    quickly.                                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root           :: The root PS_ParserRec fields.                    */\n  /*                                                                       */\n  /*    stream         :: The current input stream.                        */\n  /*                                                                       */\n  /*    postscript     :: A pointer to the data to be parsed.              */\n  /*                                                                       */\n  /*    postscript_len :: The length of the data to be parsed.             */\n  /*                                                                       */\n  /*    data_offset    :: The start position of the binary data (i.e., the */\n  /*                      end of the data to be parsed.                    */\n  /*                                                                       */\n  /*    binary_length  :: The length of the data after the `StartData'     */\n  /*                      command if the data format is hexadecimal.       */\n  /*                                                                       */\n  /*    cid            :: A structure which holds the information about    */\n  /*                      the current font.                                */\n  /*                                                                       */\n  /*    num_dict       :: The number of font dictionaries.                 */\n  /*                                                                       */\n  typedef struct  CID_Parser_\n  {\n    PS_ParserRec  root;\n    FT_Stream     stream;\n\n    FT_Byte*      postscript;\n    FT_Long       postscript_len;\n\n    FT_ULong      data_offset;\n\n    FT_Long       binary_length;\n\n    CID_FaceInfo  cid;\n    FT_Int        num_dict;\n\n  } CID_Parser;\n\n\n  FT_LOCAL( FT_Error )\n  cid_parser_new( CID_Parser*    parser,\n                  FT_Stream      stream,\n                  FT_Memory      memory,\n                  PSAux_Service  psaux );\n\n  FT_LOCAL( void )\n  cid_parser_done( CID_Parser*  parser );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            PARSING ROUTINES                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n#define cid_parser_skip_spaces( p ) \\\n          (p)->root.funcs.skip_spaces( &(p)->root )\n#define cid_parser_skip_PS_token( p ) \\\n          (p)->root.funcs.skip_PS_token( &(p)->root )\n\n#define cid_parser_to_int( p )        (p)->root.funcs.to_int( &(p)->root )\n#define cid_parser_to_fixed( p, t )   (p)->root.funcs.to_fixed( &(p)->root, t )\n\n#define cid_parser_to_coord_array( p, m, c )                          \\\n          (p)->root.funcs.to_coord_array( &(p)->root, m, c )\n#define cid_parser_to_fixed_array( p, m, f, t )                          \\\n          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )\n#define cid_parser_to_token( p, t )                         \\\n          (p)->root.funcs.to_token( &(p)->root, t )\n#define cid_parser_to_token_array( p, t, m, c )                          \\\n          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )\n\n#define cid_parser_load_field( p, f, o )                              \\\n          (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 )\n#define cid_parser_load_field_table( p, f, o )                              \\\n          (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 )\n\n\nFT_END_HEADER\n\n#endif /* __CIDPARSE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidriver.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidriver.c                                                             */\n/*                                                                         */\n/*    CID driver interface (body).                                         */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include \"cidriver.h\"\n#include \"cidgload.h\"\n#include FT_INTERNAL_DEBUG_H\n\n#include \"ciderrs.h\"\n\n#include FT_SERVICE_POSTSCRIPT_NAME_H\n#include FT_SERVICE_XFREE86_NAME_H\n#include FT_SERVICE_POSTSCRIPT_INFO_H\n#include FT_SERVICE_CID_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ciddriver\n\n\n  /*\n   *  POSTSCRIPT NAME SERVICE\n   *\n   */\n\n  static const char*\n  cid_get_postscript_name( CID_Face  face )\n  {\n    const char*  result = face->cid.cid_font_name;\n\n\n    if ( result && result[0] == '/' )\n      result++;\n\n    return result;\n  }\n\n\n  static const FT_Service_PsFontNameRec  cid_service_ps_name =\n  {\n    (FT_PsName_GetFunc) cid_get_postscript_name\n  };\n\n\n  /*\n   *  POSTSCRIPT INFO SERVICE\n   *\n   */\n\n  static FT_Error\n  cid_ps_get_font_info( FT_Face          face,\n                        PS_FontInfoRec*  afont_info )\n  {\n    *afont_info = ((CID_Face)face)->cid.font_info;\n\n    return FT_Err_Ok;\n  }\n\n  static FT_Error\n  cid_ps_get_font_extra( FT_Face          face,\n                        PS_FontExtraRec*  afont_extra )\n  {\n    *afont_extra = ((CID_Face)face)->font_extra;\n\n    return FT_Err_Ok;\n  }\n\n  static const FT_Service_PsInfoRec  cid_service_ps_info =\n  {\n    (PS_GetFontInfoFunc)   cid_ps_get_font_info,\n    (PS_GetFontExtraFunc)  cid_ps_get_font_extra,\n    (PS_HasGlyphNamesFunc) NULL,        /* unsupported with CID fonts */\n    (PS_GetFontPrivateFunc)NULL,        /* unsupported                */\n    (PS_GetFontValueFunc)  NULL         /* not implemented            */\n  };\n\n\n  /*\n   *  CID INFO SERVICE\n   *\n   */\n  static FT_Error\n  cid_get_ros( CID_Face      face,\n               const char*  *registry,\n               const char*  *ordering,\n               FT_Int       *supplement )\n  {\n    CID_FaceInfo  cid = &face->cid;\n\n\n    if ( registry )\n      *registry = cid->registry;\n\n    if ( ordering )\n      *ordering = cid->ordering;\n\n    if ( supplement )\n      *supplement = cid->supplement;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  cid_get_is_cid( CID_Face  face,\n                  FT_Bool  *is_cid )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UNUSED( face );\n\n\n    if ( is_cid )\n      *is_cid = 1; /* cid driver is only used for CID keyed fonts */\n\n    return error;\n  }\n\n\n  static FT_Error\n  cid_get_cid_from_glyph_index( CID_Face  face,\n                                FT_UInt   glyph_index,\n                                FT_UInt  *cid )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UNUSED( face );\n\n\n    if ( cid )\n      *cid = glyph_index; /* identity mapping */\n\n    return error;\n  }\n\n\n  static const FT_Service_CIDRec  cid_service_cid_info =\n  {\n     (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros,\n     (FT_CID_GetIsInternallyCIDKeyedFunc)      cid_get_is_cid,\n     (FT_CID_GetCIDFromGlyphIndexFunc)         cid_get_cid_from_glyph_index\n  };\n\n\n  /*\n   *  SERVICE LIST\n   *\n   */\n\n  static const FT_ServiceDescRec  cid_services[] =\n  {\n    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CID },\n    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name },\n    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &cid_service_ps_info },\n    { FT_SERVICE_ID_CID,                  &cid_service_cid_info },\n    { NULL, NULL }\n  };\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  cid_get_interface( FT_Module    module,\n                     const char*  cid_interface )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( cid_services, cid_interface );\n  }\n\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Driver_ClassRec  t1cid_driver_class =\n  {\n    /* first of all, the FT_Module_Class fields */\n    {\n      FT_MODULE_FONT_DRIVER       |\n      FT_MODULE_DRIVER_SCALABLE   |\n      FT_MODULE_DRIVER_HAS_HINTER,\n\n      sizeof ( FT_DriverRec ),\n      \"t1cid\",   /* module name           */\n      0x10000L,  /* version 1.0 of driver */\n      0x20000L,  /* requires FreeType 2.0 */\n\n      0,\n\n      cid_driver_init,\n      cid_driver_done,\n      cid_get_interface\n    },\n\n    /* then the other font drivers fields */\n    sizeof ( CID_FaceRec ),\n    sizeof ( CID_SizeRec ),\n    sizeof ( CID_GlyphSlotRec ),\n\n    cid_face_init,\n    cid_face_done,\n\n    cid_size_init,\n    cid_size_done,\n    cid_slot_init,\n    cid_slot_done,\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    ft_stub_set_char_sizes,\n    ft_stub_set_pixel_sizes,\n#endif\n\n    cid_slot_load_glyph,\n\n    0,                      /* FT_Face_GetKerningFunc  */\n    0,                      /* FT_Face_AttachFunc      */\n\n    0,                      /* FT_Face_GetAdvancesFunc */\n\n    cid_size_request,\n    0                       /* FT_Size_SelectFunc      */\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidriver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidriver.h                                                             */\n/*                                                                         */\n/*    High-level CID driver interface (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __CIDRIVER_H__\n#define __CIDRIVER_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_CALLBACK_TABLE\n  const FT_Driver_ClassRec  t1cid_driver_class;\n\n\nFT_END_HEADER\n\n#endif /* __CIDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/cidtoken.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  cidtoken.h                                                             */\n/*                                                                         */\n/*    CID token definitions (specification only).                          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CID_FaceInfoRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_CID_INFO\n\n  T1_FIELD_KEY   ( \"CIDFontName\",    cid_font_name, 0 )\n  T1_FIELD_FIXED ( \"CIDFontVersion\", cid_version,   0 )\n  T1_FIELD_NUM   ( \"CIDFontType\",    cid_font_type, 0 )\n  T1_FIELD_STRING( \"Registry\",       registry,      0 )\n  T1_FIELD_STRING( \"Ordering\",       ordering,      0 )\n  T1_FIELD_NUM   ( \"Supplement\",     supplement,    0 )\n  T1_FIELD_NUM   ( \"UIDBase\",        uid_base,      0 )\n  T1_FIELD_NUM   ( \"CIDMapOffset\",   cidmap_offset, 0 )\n  T1_FIELD_NUM   ( \"FDBytes\",        fd_bytes,      0 )\n  T1_FIELD_NUM   ( \"GDBytes\",        gd_bytes,      0 )\n  T1_FIELD_NUM   ( \"CIDCount\",       cid_count,     0 )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_FontInfoRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_INFO\n\n  T1_FIELD_STRING( \"version\",            version,             0 )\n  T1_FIELD_STRING( \"Notice\",             notice,              0 )\n  T1_FIELD_STRING( \"FullName\",           full_name,           0 )\n  T1_FIELD_STRING( \"FamilyName\",         family_name,         0 )\n  T1_FIELD_STRING( \"Weight\",             weight,              0 )\n  T1_FIELD_NUM   ( \"ItalicAngle\",        italic_angle,        0 )\n  T1_FIELD_BOOL  ( \"isFixedPitch\",       is_fixed_pitch,      0 )\n  T1_FIELD_NUM   ( \"UnderlinePosition\",  underline_position,  0 )\n  T1_FIELD_NUM   ( \"UnderlineThickness\", underline_thickness, 0 )\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_FontExtraRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA\n\n  T1_FIELD_NUM   ( \"FSType\",             fs_type,             0 )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  CID_FaceDictRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_DICT\n\n  T1_FIELD_NUM  ( \"PaintType\",          paint_type,          0 )\n  T1_FIELD_NUM  ( \"FontType\",           font_type,           0 )\n  T1_FIELD_NUM  ( \"SubrMapOffset\",      subrmap_offset,      0 )\n  T1_FIELD_NUM  ( \"SDBytes\",            sd_bytes,            0 )\n  T1_FIELD_NUM  ( \"SubrCount\",          num_subrs,           0 )\n  T1_FIELD_NUM  ( \"lenBuildCharArray\",  len_buildchar,       0 )\n  T1_FIELD_FIXED( \"ForceBoldThreshold\", forcebold_threshold, 0 )\n  T1_FIELD_FIXED( \"StrokeWidth\",        stroke_width,        0 )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_PrivateRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_PRIVATE\n\n  T1_FIELD_NUM       ( \"UniqueID\",         unique_id,      0 )\n  T1_FIELD_NUM       ( \"lenIV\",            lenIV,          0 )\n  T1_FIELD_NUM       ( \"LanguageGroup\",    language_group, 0 )\n  T1_FIELD_NUM       ( \"password\",         password,       0 )\n\n  T1_FIELD_FIXED_1000( \"BlueScale\",        blue_scale,     0 )\n  T1_FIELD_NUM       ( \"BlueShift\",        blue_shift,     0 )\n  T1_FIELD_NUM       ( \"BlueFuzz\",         blue_fuzz,      0 )\n\n  T1_FIELD_NUM_TABLE ( \"BlueValues\",       blue_values,        14, 0 )\n  T1_FIELD_NUM_TABLE ( \"OtherBlues\",       other_blues,        10, 0 )\n  T1_FIELD_NUM_TABLE ( \"FamilyBlues\",      family_blues,       14, 0 )\n  T1_FIELD_NUM_TABLE ( \"FamilyOtherBlues\", family_other_blues, 10, 0 )\n\n  T1_FIELD_NUM_TABLE2( \"StdHW\",            standard_width,      1, 0 )\n  T1_FIELD_NUM_TABLE2( \"StdVW\",            standard_height,     1, 0 )\n  T1_FIELD_NUM_TABLE2( \"MinFeature\",       min_feature,         2, 0 )\n\n  T1_FIELD_NUM_TABLE ( \"StemSnapH\",        snap_widths,        12, 0 )\n  T1_FIELD_NUM_TABLE ( \"StemSnapV\",        snap_heights,       12, 0 )\n\n  T1_FIELD_BOOL      ( \"ForceBold\",        force_bold,          0 )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  FT_BBox\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_BBOX\n\n  T1_FIELD_BBOX( \"FontBBox\", xMin, 0 )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/cid/module.mk",
    "content": "#\n# FreeType 2 CID module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += TYPE1CID_DRIVER\n\ndefine TYPE1CID_DRIVER\n$(OPEN_DRIVER) FT_Driver_ClassRec, t1cid_driver_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)cid       $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/cid/rules.mk",
    "content": "#\n# FreeType 2 CID driver configuration rules\n#\n\n\n# Copyright 1996-2000, 2001, 2003 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# CID driver directory\n#\nCID_DIR := $(SRC_DIR)/cid\n\n\nCID_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CID_DIR))\n\n\n# CID driver sources (i.e., C files)\n#\nCID_DRV_SRC := $(CID_DIR)/cidparse.c \\\n               $(CID_DIR)/cidload.c  \\\n               $(CID_DIR)/cidriver.c \\\n               $(CID_DIR)/cidgload.c \\\n               $(CID_DIR)/cidobjs.c\n\n# CID driver headers\n#\nCID_DRV_H := $(CID_DRV_SRC:%.c=%.h) \\\n             $(CID_DIR)/cidtoken.h  \\\n             $(CID_DIR)/ciderrs.h\n\n\n# CID driver object(s)\n#\n#   CID_DRV_OBJ_M is used during `multi' builds\n#   CID_DRV_OBJ_S is used during `single' builds\n#\nCID_DRV_OBJ_M := $(CID_DRV_SRC:$(CID_DIR)/%.c=$(OBJ_DIR)/%.$O)\nCID_DRV_OBJ_S := $(OBJ_DIR)/type1cid.$O\n\n# CID driver source file for single build\n#\nCID_DRV_SRC_S := $(CID_DIR)/type1cid.c\n\n\n# CID driver - single object\n#\n$(CID_DRV_OBJ_S): $(CID_DRV_SRC_S) $(CID_DRV_SRC) $(FREETYPE_H) $(CID_DRV_H)\n\t$(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CID_DRV_SRC_S))\n\n\n# CID driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(CID_DIR)/%.c $(FREETYPE_H) $(CID_DRV_H)\n\t$(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(CID_DRV_OBJ_S)\nDRV_OBJS_M += $(CID_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/cid/type1cid.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  type1cid.c                                                             */\n/*                                                                         */\n/*    FreeType OpenType driver component (body only).                      */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"cidparse.c\"\n#include \"cidload.c\"\n#include \"cidobjs.c\"\n#include \"cidriver.c\"\n#include \"cidgload.c\"\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/Jamfile",
    "content": "# FreeType 2 src/gxvalid Jamfile\n#\n# Copyright 2005 by\n# suzuki toshiya, Masatake YAMATO and Red Hat K.K.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) gxvalid ;\n\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = gxvcommn gxvfeat  gxvbsln  gxvtrak  gxvopbd  gxvprop\n               gxvmort  gxvmort0 gxvmort1 gxvmort2 gxvmort4 gxvmort5\n               gxvmorx  gxvmorx0 gxvmorx1 gxvmorx2 gxvmorx4 gxvmorx5\n               gxvlcar  gxvkern  gxvmod   gxvjust  ;\n  }\n  else\n  {\n    _sources = gxvalid ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/gxvalid Jamfile\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/README",
    "content": "gxvalid: TrueType GX validator\n==============================\n\n\n1. What is this\n---------------\n\n  `gxvalid' is a module to  validate TrueType GX tables: a collection of\n  additional tables  in TrueType  font which are  used by  `QuickDraw GX\n  Text',  Apple Advanced  Typography  (AAT).  In  addition, gxvalid  can\n  validates `kern'  tables which have  been extended for AAT.   Like the\n  otvalid  module,   gxvalid  uses  Freetype   2's  validator  framework\n  (ftvalid).\n\n  You can link gxvalid with your program; before running your own layout\n  engine, gxvalid validates a font  file.  As the result, you can remove\n  error-checking code  from the layout  engine.  It is also  possible to\n  use  gxvalid  as a  stand-alone  font  validator;  the `ftvalid'  test\n  program  included  in the  ft2demo  bundle  calls gxvalid  internally.\n  A stand-alone font validator may be useful for font developers.\n\n  This documents documents the following issues.\n\n  - supported TrueType GX tables\n  - fundamental validation limitations\n  - permissive error handling of broken GX tables\n  - `kern' table issue.\n\n\n2. Supported tables\n-------------------\n\n  The following GX tables are currently supported.\n\n    bsln\n    feat\n    just\n    kern(*)\n    lcar\n    mort\n    morx\n    opbd\n    prop\n    trak\n\n  The following GX tables are currently unsupported.\n\n    cvar\n    fdsc\n    fmtx\n    fvar\n    gvar\n    Zapf\n\n  The following GX tables won't be supported.\n\n    acnt(**)\n    hsty(***)\n\n  The following undocumented tables in TrueType fonts designed for Apple\n  platform aren't handled either.\n\n    addg\n    CVTM\n    TPNM\n    umif\n\n\n  *)   The `kern'  validator handles both  the classic and the  new kern\n       formats;  the former  is supported  on both  Microsoft  and Apple\n       platforms, while the latter is supported on Apple platforms.\n\n  **)  `acnt' tables are not supported by currently available Apple font\n       tools.\n\n  ***) There  is  one more  Apple  extension,  `hsty',  but  it  is  for\n       Newton-OS, not GX  (Newton-OS is a platform by  Apple, but it can\n       use  sfnt- housed bitmap  fonts only).   Therefore, it  should be\n       excluded  from  `Apple  platform'  in the  context  of  TrueType.\n       gxvalid ignores it as Apple font tools do so.\n\n\n  We have  checked 183  fonts bundled with  MacOS 9.1, MacOS  9.2, MacOS\n  10.0, MacOS X 10.1, MSIE  for MacOS, and AppleWorks 6.0.  In addition,\n  we have  checked 67 Dynalab fonts  (designed for MacOS)  and 189 Ricoh\n  fonts (designed for Windows and  MacOS dual platforms).  The number of\n  fonts including TrueType GX tables are as follows.\n\n    bsln:  76\n    feat: 191\n    just:  84\n    kern:  59\n    lcar:   4\n    mort: 326\n    morx:  19\n    opbd:   4\n    prop: 114\n    trak:  16\n\n  Dynalab  and Ricoh fonts  don't have  GX tables  except of  `feat' and\n  `mort'.\n\n\n3. Fundamental validation limitations\n-------------------------------------\n\n  TrueType  GX  provides  layout   information  to  libraries  for  font\n  rasterizers  and text layout.   gxvalid can  check whether  the layout\n  data in  a font is conformant  to the TrueType GX  format specified by\n  Apple.  But gxvalid cannot check  a how QuickDraw GX/AAT renderer uses\n  the stored information.\n\n  3-1. Validation of State Machine activity\n  -----------------------------------------\n\n    QuickDraw GX/AAT uses a `State Machine' to provide `stateful' layout\n    features,  and TrueType GX  stores the  state transition  diagram of\n    this `State  Machine' in a  `StateTable' data structure.   While the\n    State  Machine receives  a series  of glyph  IDs, the  State Machine\n    starts with `start  of text' state, walks around  various states and\n    generates various  layout information  to the  renderer, and finally\n    reaches the `end of text' state.\n\n    gxvalid can check essential errors like:\n\n      - possibility of state transitions to undefined states\n      - existence of glyph  IDs that the State Machine  doesn't know how\n        to handle\n      - the  State Machine  cannot compute  the layout  information from\n        given diagram\n\n    These errors  can be  checked within finite  steps, and  without the\n    State Machine itself, because these are `expression' errors of state\n    transition diagram.\n\n    There  is no  limitation  about  how long  the  State Machine  walks\n    around,  so validation  of  the algorithm  in  the state  transition\n    diagram requires infinite  steps, even if we had  a State Machine in\n    gxvalid.   Therefore, the  following errors  and problems  cannot be\n    checked.\n\n      - existence of states which the State Machine never transits to\n      - the  possibility that the  State Machine  never reaches  `end of\n        text'\n      - the possibility of stack underflow/overflow in the State Machine\n        (in  ligature  and  contextual  glyph substitutions,  the  State\n        Machine can store 16 glyphs onto its stack)\n\n    In addition, gxvalid doesn't check `temporary glyph IDs' used in the\n    chained State Machines  (in `mort' and `morx' tables).   If a layout\n    feature  is  implemented by  a  single  State  Machine, a  glyph  ID\n    converted by the State Machine is passed to the glyph renderer, thus\n    it  should not  point to  an undefined  glyph ID.   But if  a layout\n    feature is implemented by  chained State Machines, a component State\n    Machine  (if it  is  not the  final  one) is  permitted to  generate\n    undefined glyph IDs for temporary use, because it is handled by next\n    component State Machine and not  by the glyph renderer.  To validate\n    such temporary glyph IDs, gxvalid must stack all undefined glyph IDs\n    which  can occur in  the output  of the  previous State  Machine and\n    search  them in  the  `ClassTable' structure  of  the current  State\n    Machine.  It is too complex to  list all possible glyph IDs from the\n    StateTable, especially from a ligature substitution table.\n\n  3-2. Validation of relationship between multiple layout features\n  ----------------------------------------------------------------\n\n    gxvalid does  not validate the relationship  between multiple layout\n    features at all.\n\n    If  multiple layout  features  are defined  in  TrueType GX  tables,\n    possible  interactions,  overrides,  and  conflicts  between  layout\n    features are implicitly  given in the font too.   For example, there\n    are several predefined spacing control features:\n\n      - Text Spacing          (Proportional/Monospace/Half-width/Normal)\n      - Number Spacing        (Monospaced-numbers/Proportional-numbers)\n      - Kana Spacing          (Full-width/Proportional)\n      - Ideographic Spacing   (Full-width/Proportional)\n      - CJK Roman Spacing     (Half-width/Proportional/Default-roman\n                               /Full-width-roman/Proportional)\n\n    If all  layout features are  independently managed, we  can activate\n    inconsistent  typographic rules  like  `Text Spacing=Monospace'  and\n    `Ideographic Spacing=Proportional' at the same time.\n\n    The combinations  of layout features  is managed by a  32bit integer\n    (one bit each for selector  setting), so we can define relationships\n    between  up  to 32  features,  theoretically.   But  if one  feature\n    setting  affects  another   feature  setting,  we  need  typographic\n    priority  rules to  validate the  relationship.   Unfortunately, the\n    TrueType GX format specification does not give such information even\n    for predefined features.\n\n\n4. Permissive error handling of broken GX tables\n------------------------------------------------\n\n  When  Apple's font  rendering system  finds an  inconsistency,  like a\n  specification  violation or  an  unspecified value  in  a TrueType  GX\n  table, it does not always  return error.  In most cases, the rendering\n  engine silently  ignores such wrong  values or even whole  tables.  In\n  fact, MacOS is shipped with  fonts including broken GX/AAT tables, but\n  no harmful  effects due to  `officially broken' fonts are  observed by\n  end-users.\n\n  gxvalid  is designed  to continue  the validation  process as  long as\n  possible.  When gxvalid find wrong  values, gxvalid warns it at least,\n  and takes  a fallback procedure  if possible.  The  fallback procedure\n  depends on the debug level.\n\n  We used the following three tools to investigate Apple's error handling.\n\n    - FontValidator  (for MacOS 8.5 - 9.2)  resource fork font\n    - ftxvalidator   (for MacOS X 10.1 -)   dfont or naked-sfnt\n    - ftxdumperfuser (for MacOS X 10.1 -)   dfont or naked-sfnt\n\n  However, all tests were done on a PowerPC based Macintosh; at present,\n  we have not checked those tools on a m68k-based Macintosh.\n\n  In total, we checked 183 fonts  bundled to MacOS 9.1, MacOS 9.2, MacOS\n  10.0, MacOS X  10.1, MSIE for MacOS, and  AppleWorks 6.0.  These fonts\n  are distributed  officially, but many broken GX/AAT  tables were found\n  by Apple's font tools.  In the following, we list typical violation of\n  the GX specification, in fonts officially distributed with those Apple\n  systems.\n\n  4-1. broken BinSrchHeader (19/183)\n  ----------------------------------\n\n    `BinSrchHeader' is  a header of a  data array for  m68k platforms to\n    access memory efficiently.  Although  there are only two independent\n    parameters  for real  (`unitSize' and  `nUnits'),  BinSrchHeader has\n    three additional parameters which  can be calculated from `unitSize'\n    and  `nUnits',  for  fast  setup.   Apple  font  tools  ignore  them\n    silently, so gxvalid warns if it finds and inconsistency, and always\n    continues  validation.    The  additional  parameters   are  ignored\n    regardless of the consistency.\n\n      19  fonts include  such  inconsistencies; all  breaks  are in  the\n      BinSrchHeader structure of the `kern' table.\n\n  4-2. too-short LookupTable (5/183)\n  ----------------------------------\n\n    LookupTable format 0  is a simple array to get a  value from a given\n    GID (glyph  ID); the index of  this array is a  GID too.  Therefore,\n    the length  of the array is expected  to be same as  the maximum GID\n    value defined  in the `maxp' table,  but there are  some fonts whose\n    LookupTable format 0 is too  short to cover all GIDs.  FontValidator\n    ignores  this error silently,  ftxvalidator and  ftxdumperfuser both\n    warn and continue.  Similar problems are found in format 3 subtables\n    of `kern'.  gxvalid  warns always and abort if  the validation level\n    is set to FT_VALIDATE_PARANOID.\n\n      5 fonts include too-short kern format 0 subtables.\n      1 font includes too-short kern format 3 subtable.\n\n  4-3. broken LookupTable format 2 (1/183)\n  ----------------------------------------\n\n    LookupTable  format  2,  subformat  4  covers the  GID  space  by  a\n    collection  of  segments which  are  specified  by `firstGlyph'  and\n    `lastGlyph'.   Some  fonts  store  `firstGlyph' and  `lastGlyph'  in\n    reverse order,  so the segment specification is  broken.  Apple font\n    tools ignore this error silently;  a broken segment is ignored as if\n    it  did not  exist.   gxvalid  warns and  normalize  the segment  at\n    FT_VALIDATE_DEFAULT, or ignore  the segment at FT_VALIDATE_TIGHT, or\n    abort at FT_VALIDATE_PARANOID.\n\n      1 font includes broken LookupTable format 2, in the `just' table.\n\n    *) It seems  that all fonts manufactured by  ITC for AppleWorks have\n       this error.\n\n  4-4. bad bracketing in glyph property (14/183)\n  ----------------------------------------------\n\n    GX/AAT defines a  `bracketing' property of the glyphs  in the `prop'\n    table,  to control layout  features of  strings enclosed  inside and\n    outside  of   brackets.   Some  fonts   give  inappropriate  bracket\n    properties  to glyphs.   Apple  font tools  warn  about this  error;\n    gxvalid warns too and aborts at FT_VALIDATE_PARANOID.\n\n      14 fonts include wrong bracket properties.\n\n\n  4-5. invalid feature number (117/183)\n  -------------------------------------\n\n    The GX/AAT extension can  include 255 different layout features, but\n    popular      layout      features      are      predefined      (see\n    http://developer.apple.com/fonts/Registry/index.html).   Some  fonts\n    include feature  numbers which are incompatible  with the predefined\n    feature registry.\n\n    In our survey, there are 140 fonts including `feat' table.\n\n    a) 67 fonts use a feature number which should not be used.\n    b) 117 fonts set the wrong feature range (nSetting).  This is mostly\n       found in the `mort' and `morx' tables.\n\n    Apple  font tools give  no warning,  although they  cannot recognize\n    what  the feature  is.   At FT_VALIDATE_DEFAULT,  gxvalid warns  but\n    continues in both cases (a, b).  At FT_VALIDATE_TIGHT, gxvalid warns\n    and aborts for (a), but continues for (b).  At FT_VALIDATE_PARANOID,\n    gxvalid warns and aborts in both cases (a, b).\n\n  4-6. invalid prop version (10/183)\n  ----------------------------------\n\n    As most TrueType GX tables, the `prop' table must start with a 32bit\n    version identifier: 0x00010000,  0x00020000 or 0x00030000.  But some\n    fonts  store nonsense binary  data instead.   When Apple  font tools\n    find them, they abort the processing immediately, and the data which\n    follows is unhandled.  gxvalid does the same.\n\n      10 fonts include broken `prop' version.\n\n    All  of these  fonts are  classic  TrueType fonts  for the  Japanese\n    script, manufactured by Apple.\n\n  4-7. unknown resource name (2/183)\n  ------------------------------------\n\n    NOTE: THIS IS NOT A TRUETYPE GX ERROR.\n\n    If  a TrueType  font is  stored  in the  resource fork  or in  dfont\n    format, the data must be tagged as `sfnt' in the resource fork index\n    to invoke TrueType font handler for the data.  But the TrueType font\n    data  in   `Keyboard.dfont'  is  tagged   as  `kbd',  and   that  in\n    `LastResort.dfont' is tagged as  `lst'.  Apple font tools can detect\n    that the data is in  TrueType format and successfully validate them.\n    Maybe  this is possible  because they  are known  to be  dfont.  The\n    current  implementation  of the  resource  fork  driver of  FreeType\n    cannot do that, thus gxvalid cannot validate them.\n\n      2 fonts use an unknown tag for the TrueType font resource.\n\n5. `kern' table issues\n----------------------\n\n  In common terminology of TrueType, `kern' is classified as a basic and\n  platform-independent table.  But there are Apple extensions of `kern',\n  and  there is  an  extension which  requires  a GX  state machine  for\n  contextual kerning.   Therefore, gxvalid includes  a special validator\n  for  `kern' tables.   Unfortunately, there  is no  exact  algorithm to\n  check Apple's extension, so  gxvalid includes a heuristic algorithm to\n  find  the proper validation  routines for  all possible  data formats,\n  including    the   data    format   for    Microsoft.     By   calling\n  classic_kern_validate() instead of gxv_validate(), you can specify the\n  `kern' format  explicitly.  However, current  FreeType2 uses Microsoft\n  `kern' format  only, others  are ignored (and  should be handled  in a\n  library one level higher than FreeType).\n\n  5-1. History\n  ------------\n\n    The original  16bit version of `kern'  was designed by  Apple in the\n    pre-GX  era, and  it was  also approved  by  Microsoft.  Afterwards,\n    Apple designed a  new 32bit version of the  `kern' table.  According\n    to  the documentation, the  difference between  the 16bit  and 32bit\n    version is only the size of  variables in the `kern' header.  In the\n    following,  we call  the original  16bit version  as  `classic', and\n    32bit version as `new'.\n\n  5-2. Versions and dialects which should be differentiated\n  ---------------------------------------------------------\n\n    The `kern' table  consists of a table header  and several subtables.\n    The version number  which identifies a `classic' or  a `new' version\n    is  explicitly   written  in  the   table  header,  but   there  are\n    undocumented  differences between  Microsoft's and  Apple's formats.\n    It is  called a `dialect' in  the following.  There  are three cases\n    which  should  be  handled:   the  new  Apple-dialect,  the  classic\n    Apple-dialect,  and the classic  Microsoft-dialect.  An  analysis of\n    the formats and the auto detection algorithm of gxvalid is described\n    in the following.\n\n    5-2-1. Version detection: classic and new kern\n    ----------------------------------------------\n\n      According  to Apple  TrueType  specification, there  are only  two\n      differences between the classic and the new:\n\n        - The `kern' table header starts with the version number.\n          The classic version starts with 0x0000 (16bit),\n          the new version starts with 0x00010000 (32bit).\n\n        - In the  `kern' table header,  the number of  subtables follows\n          the version number.\n          In the classic version, it is stored as a 16bit value.\n          In the new version, it is stored as a 32bit value.\n\n      From Apple font tool's output (DumpKERN is also tested in addition\n      to  the  three  Apple  font  tools in  above),  there  is  another\n      undocumented difference.  In the  new version, the subtable header\n      includes a 16bit variable  named `tupleIndex' which does not exist\n      in the classic version.\n\n      The new version  can store all subtable formats (0,  1, 2, and 3),\n      but the Apple TrueType specification does not mention the subtable\n      formats available in the classic version.\n\n    5-2-2. Available subtable formats in classic version\n    ----------------------------------------------------\n\n      Although the  Apple TrueType  specification recommends to  use the\n      classic version in  the case if the font is  designed for both the\n      Apple and Microsoft platforms,  it does not document the available\n      subtable formats in the classic version.\n\n      According  to the Microsoft  TrueType specification,  the subtable\n      format  assured for  Windows  and OS/2  support  is only  subtable\n      format  0.  The  Microsoft TrueType  specification  also describes\n      subtable format  2, but does  not mention which  platforms support\n      it.  Aubtable formats 1, 3,  and higher are documented as reserved\n      for future use.  Therefore, the classic version can store subtable\n      formats 0 and 2, at least.  `ttfdump.exe', a font tool provided by\n      Microsoft,  ignores the  subtable format  written in  the subtable\n      header, and parses the table as if all subtables are in format 0.\n\n      `kern'  subtable format  1  uses  a StateTable,  so  it cannot  be\n      utilized without a GX  State Machine.  Therefore, it is reasonable\n      to assume  that format 1 (and  3) were introduced  after Apple had\n      introduced GX and moved to the new 32bit version.\n\n    5-2-3. Apple and Microsoft dialects\n    -----------------------------------\n\n      The  `kern' subtable  has  a 16bit  `coverage'  field to  describe\n      kerning attributes, but bit interpretations by Apple and Microsoft\n      are different:  For example, Apple  uses bits 0-7 to  identify the\n      subtable, while Microsoft uses bits 8-15.\n\n      In  addition, due  to the  output of  DumpKERN  and FontValidator,\n      Apple's bit interpretations of coverage in classic and new version\n      are  incompatible also.   In  summary, there  are three  dialects:\n      classic Apple  dialect, classic  Microsoft dialect, and  new Apple\n      dialect.  The classic Microsoft  dialect and the new Apple dialect\n      are documented  by each vendors' TrueType  font specification, but\n      the documentation for classic Apple dialect is not available.\n\n      For example,  in the  new Apple dialect,  bit 15 is  documented as\n      `set to  1 if  the kerning  is vertical'.  On  the other  hand, in\n      classic Microsoft dialect, bit 1 is documented as `set to 1 if the\n      kerning  is  horizontal'.   From   the  outputs  of  DumpKERN  and\n      FontValidator, classic  Apple dialect recognizes  15 as `set  to 1\n      when  the kerning  is horizontal'.   From the  results  of similar\n      experiments, classic Apple dialect  seems to be the Endian reverse\n      of the classic Microsoft dialect.\n\n      As a  conclusion it must be  noted that no font  tool can identify\n      classic Apple dialect or classic Microsoft dialect automatically.\n\n    5-2-4. gxvalid auto dialect detection algorithm\n    -----------------------------------------------\n\n      The first 16  bits of the `kern' table are  enough to identify the\n      version:\n\n        - if  the first  16  bits are  0x0000,  the `kern'  table is  in\n          classic Apple dialect or classic Microsoft dialect\n        - if the first 16 bits are  0x0001, and next 16 bits are 0x0000,\n          the kern table is in new Apple dialect.\n\n      If the `kern'  table is a classic one,  the 16bit `coverage' field\n      is checked next.   Firstly, the coverage bits are  decoded for the\n      classic Apple dialect using the following bit masks (this is based\n      on DumpKERN output):\n\n        0x8000: 1=horizontal, 0=vertical\n        0x4000: not used\n        0x2000: 1=cross-stream, 0=normal\n        0x1FF0: reserved\n        0x000F: subtable format\n\n      If  any  of  reserved  bits  are  set  or  the  subtable  bits  is\n      interpreted as format 1 or 3, we take it as `impossible in classic\n      Apple dialect' and retry, using the classic Microsoft dialect.\n\n        The most popular coverage in new Apple-dialect:         0x8000,\n        The most popular coverage in classic Apple-dialect:     0x0000,\n        The most popular coverage in classic Microsoft dialect: 0x0001.\n\n  5-3. Tested fonts\n  -----------------\n\n    We checked  59 fonts  bundled with MacOS  and 38 fonts  bundled with\n    Windows, where all font include a `kern' table.\n\n      - fonts bundled with MacOS\n        * new Apple dialect\n          format 0: 18\n          format 2:  1\n          format 3:  1\n        * classic Apple dialect\n          format 0: 14\n        * classic Microsoft dialect\n          format 0: 15\n\n      - fonts bundled with Windows\n        * classic Microsoft dialect\n          format 0: 38\n\n    It looks strange that classic Microsoft-dialect fonts are bundled to\n    MacOS: they come from MSIE for MacOS, except of MarkerFelt.dfont.\n\n\n  ACKNOWLEDGEMENT\n  ---------------\n\n  Some parts of gxvalid are  derived from both the `gxlayout' module and\n  the `otvalid'  module.  Development of  gxlayout was supported  by the\n  Information-technology Promotion Agency(IPA), Japan.\n\n  The detailed analysis of undefined  glyph ID utilization in `mort' and\n  `morx' tables is provided by George Williams.\n\n------------------------------------------------------------------------\n\nCopyright 2004, 2005, 2007 by\nsuzuki toshiya, Masatake YAMATO, Red hat K.K.,\nDavid Turner, Robert Wilhelm, and Werner Lemberg.\n\nThis  file is  part  of the  FreeType  project, and  may  only be  used,\nmodified,  and  distributed under  the  terms  of  the FreeType  project\nlicense, LICENSE.TXT.  By continuing  to use, modify, or distribute this\nfile  you indicate that  you have  read the  license and  understand and\naccept it fully.\n\n\n--- end of README ---\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvalid.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvalid.c                                                              */\n/*                                                                         */\n/*    FreeType validator for TrueTypeGX/AAT tables (body only).            */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n\n#include \"gxvfeat.c\"\n#include \"gxvcommn.c\"\n#include \"gxvbsln.c\"\n#include \"gxvtrak.c\"\n#include \"gxvjust.c\"\n#include \"gxvmort.c\"\n#include \"gxvmort0.c\"\n#include \"gxvmort1.c\"\n#include \"gxvmort2.c\"\n#include \"gxvmort4.c\"\n#include \"gxvmort5.c\"\n#include \"gxvmorx.c\"\n#include \"gxvmorx0.c\"\n#include \"gxvmorx1.c\"\n#include \"gxvmorx2.c\"\n#include \"gxvmorx4.c\"\n#include \"gxvmorx5.c\"\n#include \"gxvkern.c\"\n#include \"gxvopbd.c\"\n#include \"gxvprop.c\"\n#include \"gxvlcar.c\"\n#include \"gxvmod.c\"\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvalid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvalid.h                                                              */\n/*                                                                         */\n/*    TrueTyeeGX/AAT table validation (specification only).                */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __GXVALID_H__\n#define __GXVALID_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#include \"gxverror.h\"          /* must come before FT_INTERNAL_VALIDATE_H */\n\n#include FT_INTERNAL_VALIDATE_H\n#include FT_INTERNAL_STREAM_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  gxv_feat_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n\n  FT_LOCAL( void )\n  gxv_bsln_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n\n  FT_LOCAL( void )\n  gxv_trak_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_just_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_mort_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_morx_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_kern_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_kern_validate_classic( FT_Bytes      table,\n                             FT_Face       face,\n                             FT_Int        dialect_flags,\n                             FT_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_opbd_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_prop_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_lcar_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  valid );\n\n\nFT_END_HEADER\n\n\n#endif /* __GXVALID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvbsln.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvbsln.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT bsln table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvbsln\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      Data and Types                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define GXV_BSLN_VALUE_COUNT  32\n#define GXV_BSLN_VALUE_EMPTY  0xFFFFU\n\n\n  typedef struct  GXV_bsln_DataRec_\n  {\n    FT_Bytes   ctlPoints_p;\n    FT_UShort  defaultBaseline;\n\n  } GXV_bsln_DataRec, *GXV_bsln_Data;\n\n\n#define GXV_BSLN_DATA( field )  GXV_TABLE_DATA( bsln, field )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  gxv_bsln_LookupValue_validate( FT_UShort            glyph,\n                                 GXV_LookupValueCPtr  value_p,\n                                 GXV_Validator        valid )\n  {\n    FT_UShort   v = value_p->u;\n    FT_UShort*  ctlPoints;\n\n    FT_UNUSED( glyph );\n\n\n    GXV_NAME_ENTER( \"lookup value\" );\n\n    if ( v >= GXV_BSLN_VALUE_COUNT )\n      FT_INVALID_DATA;\n\n    ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p );\n    if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY )\n      FT_INVALID_DATA;\n\n    GXV_EXIT;\n  }\n\n\n  /*\n    +===============+ --------+\n    | lookup header |         |\n    +===============+         |\n    | BinSrchHeader |         |\n    +===============+         |\n    | lastGlyph[0]  |         |\n    +---------------+         |\n    | firstGlyph[0] |         |    head of lookup table\n    +---------------+         |             +\n    | offset[0]     |    ->   |          offset            [byte]\n    +===============+         |             +\n    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]\n    +---------------+         |\n    | firstGlyph[1] |         |\n    +---------------+         |\n    | offset[1]     |         |\n    +===============+         |\n                              |\n    ...                       |\n                              |\n    16bit value array         |\n    +===============+         |\n    |     value     | <-------+\n    ...\n  */\n\n  static GXV_LookupValueDesc\n  gxv_bsln_LookupFmt4_transit( FT_UShort            relative_gindex,\n                               GXV_LookupValueCPtr  base_value_p,\n                               FT_Bytes             lookuptbl_limit,\n                               GXV_Validator        valid )\n  {\n    FT_Bytes             p;\n    FT_Bytes             limit;\n    FT_UShort            offset;\n    GXV_LookupValueDesc  value;\n\n    /* XXX: check range ? */\n    offset = (FT_UShort)( base_value_p->u +\n                          ( relative_gindex * sizeof ( FT_UShort ) ) );\n\n    p     = valid->lookuptbl_head + offset;\n    limit = lookuptbl_limit;\n    GXV_LIMIT_CHECK( 2 );\n\n    value.u = FT_NEXT_USHORT( p );\n\n    return value;\n  }\n\n\n  static void\n  gxv_bsln_parts_fmt0_validate( FT_Bytes       tables,\n                                FT_Bytes       limit,\n                                GXV_Validator  valid )\n  {\n    FT_Bytes  p = tables;\n\n\n    GXV_NAME_ENTER( \"parts format 0\" );\n\n    /* deltas */\n    GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT );\n\n    valid->table_data = NULL;      /* No ctlPoints here. */\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_bsln_parts_fmt1_validate( FT_Bytes       tables,\n                                FT_Bytes       limit,\n                                GXV_Validator  valid )\n  {\n    FT_Bytes  p = tables;\n\n\n    GXV_NAME_ENTER( \"parts format 1\" );\n\n    /* deltas */\n    gxv_bsln_parts_fmt0_validate( p, limit, valid );\n\n    /* mappingData */\n    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;\n    valid->lookupval_func   = gxv_bsln_LookupValue_validate;\n    valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;\n    gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT,\n                              limit,\n                              valid );\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_bsln_parts_fmt2_validate( FT_Bytes       tables,\n                                FT_Bytes       limit,\n                                GXV_Validator  valid )\n  {\n    FT_Bytes   p = tables;\n\n    FT_UShort  stdGlyph;\n    FT_UShort  ctlPoint;\n    FT_Int     i;\n\n    FT_UShort  defaultBaseline = GXV_BSLN_DATA( defaultBaseline );\n\n\n    GXV_NAME_ENTER( \"parts format 2\" );\n\n    GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) );\n\n    /* stdGlyph */\n    stdGlyph = FT_NEXT_USHORT( p );\n    GXV_TRACE(( \" (stdGlyph = %u)\\n\", stdGlyph ));\n\n    gxv_glyphid_validate( stdGlyph, valid );\n\n    /* Record the position of ctlPoints */\n    GXV_BSLN_DATA( ctlPoints_p ) = p;\n\n    /* ctlPoints */\n    for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ )\n    {\n      ctlPoint = FT_NEXT_USHORT( p );\n      if ( ctlPoint == GXV_BSLN_VALUE_EMPTY )\n      {\n        if ( i == defaultBaseline )\n          FT_INVALID_DATA;\n      }\n      else\n        gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, valid );\n    }\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_bsln_parts_fmt3_validate( FT_Bytes       tables,\n                                FT_Bytes       limit,\n                                GXV_Validator  valid)\n  {\n    FT_Bytes  p = tables;\n\n\n    GXV_NAME_ENTER( \"parts format 3\" );\n\n    /* stdGlyph + ctlPoints */\n    gxv_bsln_parts_fmt2_validate( p, limit, valid );\n\n    /* mappingData */\n    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;\n    valid->lookupval_func   = gxv_bsln_LookupValue_validate;\n    valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;\n    gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ),\n                              limit,\n                              valid );\n\n    GXV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         bsln TABLE                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  gxv_bsln_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    GXV_ValidatorRec  validrec;\n    GXV_Validator     valid = &validrec;\n\n    GXV_bsln_DataRec  bslnrec;\n    GXV_bsln_Data     bsln = &bslnrec;\n\n    FT_Bytes  p     = table;\n    FT_Bytes  limit = 0;\n\n    FT_ULong   version;\n    FT_UShort  format;\n    FT_UShort  defaultBaseline;\n\n    GXV_Validate_Func  fmt_funcs_table [] =\n    {\n      gxv_bsln_parts_fmt0_validate,\n      gxv_bsln_parts_fmt1_validate,\n      gxv_bsln_parts_fmt2_validate,\n      gxv_bsln_parts_fmt3_validate,\n    };\n\n\n    valid->root       = ftvalid;\n    valid->table_data = bsln;\n    valid->face       = face;\n\n    FT_TRACE3(( \"validating `bsln' table\\n\" ));\n    GXV_INIT;\n\n\n    GXV_LIMIT_CHECK( 4 + 2 + 2 );\n    version         = FT_NEXT_ULONG( p );\n    format          = FT_NEXT_USHORT( p );\n    defaultBaseline = FT_NEXT_USHORT( p );\n\n    /* only version 1.0 is defined (1996) */\n    if ( version != 0x00010000UL )\n      FT_INVALID_FORMAT;\n\n    /* only format 1, 2, 3 are defined (1996) */\n    GXV_TRACE(( \" (format = %d)\\n\", format ));\n    if ( format > 3 )\n      FT_INVALID_FORMAT;\n\n    if ( defaultBaseline > 31 )\n      FT_INVALID_FORMAT;\n\n    bsln->defaultBaseline = defaultBaseline;\n\n    fmt_funcs_table[format]( p, limit, valid );\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* arch-tag: ebe81143-fdaa-4c68-a4d1-b57227daa3bc\n   (do not change this comment) */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvcommn.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvcommn.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT common tables validation (body).                      */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2009, 2010, 2013                                 */\n/*  by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvcommon\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       16bit offset sorter                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static int\n  gxv_compare_ushort_offset( FT_UShort*  a,\n                             FT_UShort*  b )\n  {\n    if ( *a < *b )\n      return -1;\n    else if ( *a > *b )\n      return 1;\n    else\n      return 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_set_length_by_ushort_offset( FT_UShort*     offset,\n                                   FT_UShort**    length,\n                                   FT_UShort*     buff,\n                                   FT_UInt        nmemb,\n                                   FT_UShort      limit,\n                                   GXV_Validator  valid )\n  {\n    FT_UInt  i;\n\n\n    for ( i = 0; i < nmemb; i++ )\n      *(length[i]) = 0;\n\n    for ( i = 0; i < nmemb; i++ )\n      buff[i] = offset[i];\n    buff[nmemb] = limit;\n\n    ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_UShort ),\n              ( int(*)(const void*, const void*) )gxv_compare_ushort_offset );\n\n    if ( buff[nmemb] > limit )\n      FT_INVALID_OFFSET;\n\n    for ( i = 0; i < nmemb; i++ )\n    {\n      FT_UInt  j;\n\n\n      for ( j = 0; j < nmemb; j++ )\n        if ( buff[j] == offset[i] )\n          break;\n\n      if ( j == nmemb )\n        FT_INVALID_OFFSET;\n\n      *(length[i]) = (FT_UShort)( buff[j + 1] - buff[j] );\n\n      if ( 0 != offset[i] && 0 == *(length[i]) )\n        FT_INVALID_OFFSET;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       32bit offset sorter                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static int\n  gxv_compare_ulong_offset( FT_ULong*  a,\n                            FT_ULong*  b )\n  {\n    if ( *a < *b )\n      return -1;\n    else if ( *a > *b )\n      return 1;\n    else\n      return 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_set_length_by_ulong_offset( FT_ULong*      offset,\n                                  FT_ULong**     length,\n                                  FT_ULong*      buff,\n                                  FT_UInt        nmemb,\n                                  FT_ULong       limit,\n                                  GXV_Validator  valid)\n  {\n    FT_UInt  i;\n\n\n    for ( i = 0; i < nmemb; i++ )\n      *(length[i]) = 0;\n\n    for ( i = 0; i < nmemb; i++ )\n      buff[i] = offset[i];\n    buff[nmemb] = limit;\n\n    ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_ULong ),\n              ( int(*)(const void*, const void*) )gxv_compare_ulong_offset );\n\n    if ( buff[nmemb] > limit )\n      FT_INVALID_OFFSET;\n\n    for ( i = 0; i < nmemb; i++ )\n    {\n      FT_UInt  j;\n\n\n      for ( j = 0; j < nmemb; j++ )\n        if ( buff[j] == offset[i] )\n          break;\n\n      if ( j == nmemb )\n        FT_INVALID_OFFSET;\n\n      *(length[i]) = buff[j + 1] - buff[j];\n\n      if ( 0 != offset[i] && 0 == *(length[i]) )\n        FT_INVALID_OFFSET;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               scan value array and get min & max              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( void )\n  gxv_array_getlimits_byte( FT_Bytes       table,\n                            FT_Bytes       limit,\n                            FT_Byte*       min,\n                            FT_Byte*       max,\n                            GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n\n    *min = 0xFF;\n    *max = 0x00;\n\n    while ( p < limit )\n    {\n      FT_Byte  val;\n\n\n      GXV_LIMIT_CHECK( 1 );\n      val = FT_NEXT_BYTE( p );\n\n      *min = (FT_Byte)FT_MIN( *min, val );\n      *max = (FT_Byte)FT_MAX( *max, val );\n    }\n\n    valid->subtable_length = p - table;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_array_getlimits_ushort( FT_Bytes       table,\n                              FT_Bytes       limit,\n                              FT_UShort*     min,\n                              FT_UShort*     max,\n                              GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n\n    *min = 0xFFFFU;\n    *max = 0x0000;\n\n    while ( p < limit )\n    {\n      FT_UShort  val;\n\n\n      GXV_LIMIT_CHECK( 2 );\n      val = FT_NEXT_USHORT( p );\n\n      *min = (FT_Byte)FT_MIN( *min, val );\n      *max = (FT_Byte)FT_MAX( *max, val );\n    }\n\n    valid->subtable_length = p - table;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       BINSEARCHHEADER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  GXV_BinSrchHeader_\n  {\n    FT_UShort  unitSize;\n    FT_UShort  nUnits;\n    FT_UShort  searchRange;\n    FT_UShort  entrySelector;\n    FT_UShort  rangeShift;\n\n  } GXV_BinSrchHeader;\n\n\n  static void\n  gxv_BinSrchHeader_check_consistency( GXV_BinSrchHeader*  binSrchHeader,\n                                       GXV_Validator       valid )\n  {\n    FT_UShort  searchRange;\n    FT_UShort  entrySelector;\n    FT_UShort  rangeShift;\n\n\n    if ( binSrchHeader->unitSize == 0 )\n      FT_INVALID_DATA;\n\n    if ( binSrchHeader->nUnits == 0 )\n    {\n      if ( binSrchHeader->searchRange   == 0 &&\n           binSrchHeader->entrySelector == 0 &&\n           binSrchHeader->rangeShift    == 0 )\n        return;\n      else\n        FT_INVALID_DATA;\n    }\n\n    for ( searchRange = 1, entrySelector = 1;\n          ( searchRange * 2 ) <= binSrchHeader->nUnits &&\n            searchRange < 0x8000U;\n          searchRange *= 2, entrySelector++ )\n      ;\n\n    entrySelector--;\n    searchRange = (FT_UShort)( searchRange * binSrchHeader->unitSize );\n    rangeShift  = (FT_UShort)( binSrchHeader->nUnits * binSrchHeader->unitSize\n                               - searchRange );\n\n    if ( searchRange   != binSrchHeader->searchRange   ||\n         entrySelector != binSrchHeader->entrySelector ||\n         rangeShift    != binSrchHeader->rangeShift    )\n    {\n      GXV_TRACE(( \"Inconsistency found in BinSrchHeader\\n\" ));\n      GXV_TRACE(( \"originally: unitSize=%d, nUnits=%d, \"\n                  \"searchRange=%d, entrySelector=%d, \"\n                  \"rangeShift=%d\\n\",\n                  binSrchHeader->unitSize, binSrchHeader->nUnits,\n                  binSrchHeader->searchRange, binSrchHeader->entrySelector,\n                  binSrchHeader->rangeShift ));\n      GXV_TRACE(( \"calculated: unitSize=%d, nUnits=%d, \"\n                  \"searchRange=%d, entrySelector=%d, \"\n                  \"rangeShift=%d\\n\",\n                  binSrchHeader->unitSize, binSrchHeader->nUnits,\n                  searchRange, entrySelector, rangeShift ));\n\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n  }\n\n\n  /*\n   * parser & validator of BinSrchHeader\n   * which is used in LookupTable format 2, 4, 6.\n   *\n   * Essential parameters (unitSize, nUnits) are returned by\n   * given pointer, others (searchRange, entrySelector, rangeShift)\n   * can be calculated by essential parameters, so they are just\n   * validated and discarded.\n   *\n   * However, wrong values in searchRange, entrySelector, rangeShift\n   * won't cause fatal errors, because these parameters might be\n   * only used in old m68k font driver in MacOS.\n   *   -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>\n   */\n\n  FT_LOCAL_DEF( void )\n  gxv_BinSrchHeader_validate( FT_Bytes       table,\n                              FT_Bytes       limit,\n                              FT_UShort*     unitSize_p,\n                              FT_UShort*     nUnits_p,\n                              GXV_Validator  valid )\n  {\n    FT_Bytes           p = table;\n    GXV_BinSrchHeader  binSrchHeader;\n\n\n    GXV_NAME_ENTER( \"BinSrchHeader validate\" );\n\n    if ( *unitSize_p == 0 )\n    {\n      GXV_LIMIT_CHECK( 2 );\n      binSrchHeader.unitSize =  FT_NEXT_USHORT( p );\n    }\n    else\n      binSrchHeader.unitSize = *unitSize_p;\n\n    if ( *nUnits_p == 0 )\n    {\n      GXV_LIMIT_CHECK( 2 );\n      binSrchHeader.nUnits = FT_NEXT_USHORT( p );\n    }\n    else\n      binSrchHeader.nUnits = *nUnits_p;\n\n    GXV_LIMIT_CHECK( 2 + 2 + 2 );\n    binSrchHeader.searchRange   = FT_NEXT_USHORT( p );\n    binSrchHeader.entrySelector = FT_NEXT_USHORT( p );\n    binSrchHeader.rangeShift    = FT_NEXT_USHORT( p );\n    GXV_TRACE(( \"nUnits %d\\n\", binSrchHeader.nUnits ));\n\n    gxv_BinSrchHeader_check_consistency( &binSrchHeader, valid );\n\n    if ( *unitSize_p == 0 )\n      *unitSize_p = binSrchHeader.unitSize;\n\n    if ( *nUnits_p == 0 )\n      *nUnits_p = binSrchHeader.nUnits;\n\n    valid->subtable_length = p - table;\n    GXV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         LOOKUP TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define GXV_LOOKUP_VALUE_LOAD( P, SIGNSPEC )                   \\\n          ( P += 2, gxv_lookup_value_load( P - 2, SIGNSPEC ) )\n\n  static GXV_LookupValueDesc\n  gxv_lookup_value_load( FT_Bytes  p,\n                         int       signspec )\n  {\n    GXV_LookupValueDesc  v;\n\n\n    if ( signspec == GXV_LOOKUPVALUE_UNSIGNED )\n      v.u = FT_NEXT_USHORT( p );\n    else\n      v.s = FT_NEXT_SHORT( p );\n\n    return v;\n  }\n\n\n#define GXV_UNITSIZE_VALIDATE( FORMAT, UNITSIZE, NUNITS, CORRECTSIZE ) \\\n          FT_BEGIN_STMNT                                               \\\n            if ( UNITSIZE != CORRECTSIZE )                             \\\n            {                                                          \\\n              FT_ERROR(( \"unitSize=%d differs from\"                    \\\n                         \" expected unitSize=%d\"                       \\\n                         \" in LookupTable %s\\n\",                       \\\n                          UNITSIZE, CORRECTSIZE, FORMAT ));            \\\n              if ( UNITSIZE != 0 && NUNITS != 0 )                      \\\n              {                                                        \\\n                FT_ERROR(( \" cannot validate anymore\\n\" ));            \\\n                FT_INVALID_FORMAT;                                     \\\n              }                                                        \\\n              else                                                     \\\n                FT_ERROR(( \" forcibly continues\\n\" ));                 \\\n            }                                                          \\\n          FT_END_STMNT\n\n\n  /* ================= Simple Array Format 0 Lookup Table ================ */\n  static void\n  gxv_LookupTable_fmt0_validate( FT_Bytes       table,\n                                 FT_Bytes       limit,\n                                 GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  i;\n\n    GXV_LookupValueDesc  value;\n\n\n    GXV_NAME_ENTER( \"LookupTable format 0\" );\n\n    GXV_LIMIT_CHECK( 2 * valid->face->num_glyphs );\n\n    for ( i = 0; i < valid->face->num_glyphs; i++ )\n    {\n      GXV_LIMIT_CHECK( 2 );\n      if ( p + 2 >= limit )     /* some fonts have too-short fmt0 array */\n      {\n        GXV_TRACE(( \"too short, glyphs %d - %d are missing\\n\",\n                    i, valid->face->num_glyphs ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n        break;\n      }\n\n      value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );\n      valid->lookupval_func( i, &value, valid );\n    }\n\n    valid->subtable_length = p - table;\n    GXV_EXIT;\n  }\n\n\n  /* ================= Segment Single Format 2 Loolup Table ============== */\n  /*\n   * Apple spec says:\n   *\n   *   To guarantee that a binary search terminates, you must include one or\n   *   more special `end of search table' values at the end of the data to\n   *   be searched.  The number of termination values that need to be\n   *   included is table-specific.  The value that indicates binary search\n   *   termination is 0xFFFF.\n   *\n   * The problem is that nUnits does not include this end-marker.  It's\n   * quite difficult to discriminate whether the following 0xFFFF comes from\n   * the end-marker or some next data.\n   *\n   *   -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>\n   */\n  static void\n  gxv_LookupTable_fmt2_skip_endmarkers( FT_Bytes       table,\n                                        FT_UShort      unitSize,\n                                        GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n\n    while ( ( p + 4 ) < valid->root->limit )\n    {\n      if ( p[0] != 0xFF || p[1] != 0xFF || /* lastGlyph */\n           p[2] != 0xFF || p[3] != 0xFF )  /* firstGlyph */\n        break;\n      p += unitSize;\n    }\n\n    valid->subtable_length = p - table;\n  }\n\n\n  static void\n  gxv_LookupTable_fmt2_validate( FT_Bytes       table,\n                                 FT_Bytes       limit,\n                                 GXV_Validator  valid )\n  {\n    FT_Bytes             p = table;\n    FT_UShort            gid;\n\n    FT_UShort            unitSize;\n    FT_UShort            nUnits;\n    FT_UShort            unit;\n    FT_UShort            lastGlyph;\n    FT_UShort            firstGlyph;\n    GXV_LookupValueDesc  value;\n\n\n    GXV_NAME_ENTER( \"LookupTable format 2\" );\n\n    unitSize = nUnits = 0;\n    gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid );\n    p += valid->subtable_length;\n\n    GXV_UNITSIZE_VALIDATE( \"format2\", unitSize, nUnits, 6 );\n\n    for ( unit = 0, gid = 0; unit < nUnits; unit++ )\n    {\n      GXV_LIMIT_CHECK( 2 + 2 + 2 );\n      lastGlyph  = FT_NEXT_USHORT( p );\n      firstGlyph = FT_NEXT_USHORT( p );\n      value      = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );\n\n      gxv_glyphid_validate( firstGlyph, valid );\n      gxv_glyphid_validate( lastGlyph, valid );\n\n      if ( lastGlyph < gid )\n      {\n        GXV_TRACE(( \"reverse ordered segment specification:\"\n                    \" lastGlyph[%d]=%d < lastGlyph[%d]=%d\\n\",\n                    unit, lastGlyph, unit - 1 , gid ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n      }\n\n      if ( lastGlyph < firstGlyph )\n      {\n        GXV_TRACE(( \"reverse ordered range specification at unit %d:\",\n                    \" lastGlyph %d < firstGlyph %d \",\n                    unit, lastGlyph, firstGlyph ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n\n        if ( valid->root->level == FT_VALIDATE_TIGHT )\n          continue;     /* ftxvalidator silently skips such an entry */\n\n        FT_TRACE4(( \"continuing with exchanged values\\n\" ));\n        gid        = firstGlyph;\n        firstGlyph = lastGlyph;\n        lastGlyph  = gid;\n      }\n\n      for ( gid = firstGlyph; gid <= lastGlyph; gid++ )\n        valid->lookupval_func( gid, &value, valid );\n    }\n\n    gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid );\n    p += valid->subtable_length;\n\n    valid->subtable_length = p - table;\n    GXV_EXIT;\n  }\n\n\n  /* ================= Segment Array Format 4 Lookup Table =============== */\n  static void\n  gxv_LookupTable_fmt4_validate( FT_Bytes       table,\n                                 FT_Bytes       limit,\n                                 GXV_Validator  valid )\n  {\n    FT_Bytes             p = table;\n    FT_UShort            unit;\n    FT_UShort            gid;\n\n    FT_UShort            unitSize;\n    FT_UShort            nUnits;\n    FT_UShort            lastGlyph;\n    FT_UShort            firstGlyph;\n    GXV_LookupValueDesc  base_value;\n    GXV_LookupValueDesc  value;\n\n\n    GXV_NAME_ENTER( \"LookupTable format 4\" );\n\n    unitSize = nUnits = 0;\n    gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid );\n    p += valid->subtable_length;\n\n    GXV_UNITSIZE_VALIDATE( \"format4\", unitSize, nUnits, 6 );\n\n    for ( unit = 0, gid = 0; unit < nUnits; unit++ )\n    {\n      GXV_LIMIT_CHECK( 2 + 2 );\n      lastGlyph  = FT_NEXT_USHORT( p );\n      firstGlyph = FT_NEXT_USHORT( p );\n\n      gxv_glyphid_validate( firstGlyph, valid );\n      gxv_glyphid_validate( lastGlyph, valid );\n\n      if ( lastGlyph < gid )\n      {\n        GXV_TRACE(( \"reverse ordered segment specification:\"\n                    \" lastGlyph[%d]=%d < lastGlyph[%d]=%d\\n\",\n                    unit, lastGlyph, unit - 1 , gid ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n      }\n\n      if ( lastGlyph < firstGlyph )\n      {\n        GXV_TRACE(( \"reverse ordered range specification at unit %d:\",\n                    \" lastGlyph %d < firstGlyph %d \",\n                    unit, lastGlyph, firstGlyph ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n\n        if ( valid->root->level == FT_VALIDATE_TIGHT )\n          continue; /* ftxvalidator silently skips such an entry */\n\n        FT_TRACE4(( \"continuing with exchanged values\\n\" ));\n        gid        = firstGlyph;\n        firstGlyph = lastGlyph;\n        lastGlyph  = gid;\n      }\n\n      GXV_LIMIT_CHECK( 2 );\n      base_value = GXV_LOOKUP_VALUE_LOAD( p, GXV_LOOKUPVALUE_UNSIGNED );\n\n      for ( gid = firstGlyph; gid <= lastGlyph; gid++ )\n      {\n        value = valid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ),\n                                         &base_value,\n                                         limit,\n                                         valid );\n\n        valid->lookupval_func( gid, &value, valid );\n      }\n    }\n\n    gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid );\n    p += valid->subtable_length;\n\n    valid->subtable_length = p - table;\n    GXV_EXIT;\n  }\n\n\n  /* ================= Segment Table Format 6 Lookup Table =============== */\n  static void\n  gxv_LookupTable_fmt6_skip_endmarkers( FT_Bytes       table,\n                                        FT_UShort      unitSize,\n                                        GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n\n    while ( p < valid->root->limit )\n    {\n      if ( p[0] != 0xFF || p[1] != 0xFF )\n        break;\n      p += unitSize;\n    }\n\n    valid->subtable_length = p - table;\n  }\n\n\n  static void\n  gxv_LookupTable_fmt6_validate( FT_Bytes       table,\n                                 FT_Bytes       limit,\n                                 GXV_Validator  valid )\n  {\n    FT_Bytes             p = table;\n    FT_UShort            unit;\n    FT_UShort            prev_glyph;\n\n    FT_UShort            unitSize;\n    FT_UShort            nUnits;\n    FT_UShort            glyph;\n    GXV_LookupValueDesc  value;\n\n\n    GXV_NAME_ENTER( \"LookupTable format 6\" );\n\n    unitSize = nUnits = 0;\n    gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid );\n    p += valid->subtable_length;\n\n    GXV_UNITSIZE_VALIDATE( \"format6\", unitSize, nUnits, 4 );\n\n    for ( unit = 0, prev_glyph = 0; unit < nUnits; unit++ )\n    {\n      GXV_LIMIT_CHECK( 2 + 2 );\n      glyph = FT_NEXT_USHORT( p );\n      value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );\n\n      if ( gxv_glyphid_validate( glyph, valid ) )\n        GXV_TRACE(( \" endmarker found within defined range\"\n                    \" (entry %d < nUnits=%d)\\n\",\n                    unit, nUnits ));\n\n      if ( prev_glyph > glyph )\n      {\n        GXV_TRACE(( \"current gid 0x%04x < previous gid 0x%04x\\n\",\n                    glyph, prev_glyph ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n      }\n      prev_glyph = glyph;\n\n      valid->lookupval_func( glyph, &value, valid );\n    }\n\n    gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, valid );\n    p += valid->subtable_length;\n\n    valid->subtable_length = p - table;\n    GXV_EXIT;\n  }\n\n\n  /* ================= Trimmed Array Format 8 Lookup Table =============== */\n  static void\n  gxv_LookupTable_fmt8_validate( FT_Bytes       table,\n                                 FT_Bytes       limit,\n                                 GXV_Validator  valid )\n  {\n    FT_Bytes              p = table;\n    FT_UShort             i;\n\n    GXV_LookupValueDesc   value;\n    FT_UShort             firstGlyph;\n    FT_UShort             glyphCount;\n\n\n    GXV_NAME_ENTER( \"LookupTable format 8\" );\n\n    /* firstGlyph + glyphCount */\n    GXV_LIMIT_CHECK( 2 + 2 );\n    firstGlyph = FT_NEXT_USHORT( p );\n    glyphCount = FT_NEXT_USHORT( p );\n\n    gxv_glyphid_validate( firstGlyph, valid );\n    gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), valid );\n\n    /* valueArray */\n    for ( i = 0; i < glyphCount; i++ )\n    {\n      GXV_LIMIT_CHECK( 2 );\n      value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );\n      valid->lookupval_func( (FT_UShort)( firstGlyph + i ), &value, valid );\n    }\n\n    valid->subtable_length = p - table;\n    GXV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_LookupTable_validate( FT_Bytes       table,\n                            FT_Bytes       limit,\n                            GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  format;\n\n    GXV_Validate_Func  fmt_funcs_table[] =\n    {\n      gxv_LookupTable_fmt0_validate, /* 0 */\n      NULL,                          /* 1 */\n      gxv_LookupTable_fmt2_validate, /* 2 */\n      NULL,                          /* 3 */\n      gxv_LookupTable_fmt4_validate, /* 4 */\n      NULL,                          /* 5 */\n      gxv_LookupTable_fmt6_validate, /* 6 */\n      NULL,                          /* 7 */\n      gxv_LookupTable_fmt8_validate, /* 8 */\n    };\n\n    GXV_Validate_Func  func;\n\n\n    GXV_NAME_ENTER( \"LookupTable\" );\n\n    /* lookuptbl_head may be used in fmt4 transit function. */\n    valid->lookuptbl_head = table;\n\n    /* format */\n    GXV_LIMIT_CHECK( 2 );\n    format = FT_NEXT_USHORT( p );\n    GXV_TRACE(( \" (format %d)\\n\", format ));\n\n    if ( format > 8 )\n      FT_INVALID_FORMAT;\n\n    func = fmt_funcs_table[format];\n    if ( func == NULL )\n      FT_INVALID_FORMAT;\n\n    func( p, limit, valid );\n    p += valid->subtable_length;\n\n    valid->subtable_length = p - table;\n\n    GXV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          Glyph ID                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( FT_Int )\n  gxv_glyphid_validate( FT_UShort      gid,\n                        GXV_Validator  valid )\n  {\n    FT_Face  face;\n\n\n    if ( gid == 0xFFFFU )\n    {\n      GXV_EXIT;\n      return 1;\n    }\n\n    face = valid->face;\n    if ( face->num_glyphs < gid )\n    {\n      GXV_TRACE(( \" gxv_glyphid_check() gid overflow: num_glyphs %d < %d\\n\",\n                  face->num_glyphs, gid ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n    }\n\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        CONTROL POINT                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  gxv_ctlPoint_validate( FT_UShort      gid,\n                         FT_Short       ctl_point,\n                         GXV_Validator  valid )\n  {\n    FT_Face       face;\n    FT_Error      error;\n\n    FT_GlyphSlot  glyph;\n    FT_Outline    outline;\n    short         n_points;\n\n\n    face = valid->face;\n\n    error = FT_Load_Glyph( face,\n                           gid,\n                           FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM );\n    if ( error )\n      FT_INVALID_GLYPH_ID;\n\n    glyph    = face->glyph;\n    outline  = glyph->outline;\n    n_points = outline.n_points;\n\n\n    if ( !( ctl_point < n_points ) )\n      FT_INVALID_DATA;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          SFNT NAME                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  gxv_sfntName_validate( FT_UShort      name_index,\n                         FT_UShort      min_index,\n                         FT_UShort      max_index,\n                         GXV_Validator  valid )\n  {\n    FT_SfntName  name;\n    FT_UInt      i;\n    FT_UInt      nnames;\n\n\n    GXV_NAME_ENTER( \"sfntName\" );\n\n    if ( name_index < min_index || max_index < name_index )\n      FT_INVALID_FORMAT;\n\n    nnames = FT_Get_Sfnt_Name_Count( valid->face );\n    for ( i = 0; i < nnames; i++ )\n    {\n      if ( FT_Get_Sfnt_Name( valid->face, i, &name ) != FT_Err_Ok )\n        continue ;\n\n      if ( name.name_id == name_index )\n        goto Out;\n    }\n\n    GXV_TRACE(( \"  nameIndex = %d (UNTITLED)\\n\", name_index ));\n    FT_INVALID_DATA;\n    goto Exit;  /* make compiler happy */\n\n  Out:\n    FT_TRACE1(( \"  nameIndex = %d (\", name_index ));\n    GXV_TRACE_HEXDUMP_SFNTNAME( name );\n    FT_TRACE1(( \")\\n\" ));\n\n  Exit:\n    GXV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          STATE TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* -------------------------- Class Table --------------------------- */\n\n  /*\n   * highestClass specifies how many classes are defined in this\n   * Class Subtable.  Apple spec does not mention whether undefined\n   * holes in the class (e.g.: 0-3 are predefined, 4 is unused, 5 is used)\n   * are permitted.  At present, holes in a defined class are not checked.\n   *   -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>\n   */\n\n  static void\n  gxv_ClassTable_validate( FT_Bytes       table,\n                           FT_UShort*     length_p,\n                           FT_UShort      stateSize,\n                           FT_Byte*       maxClassID_p,\n                           GXV_Validator  valid )\n  {\n    FT_Bytes   p     = table;\n    FT_Bytes   limit = table + *length_p;\n    FT_UShort  firstGlyph;\n    FT_UShort  nGlyphs;\n\n\n    GXV_NAME_ENTER( \"ClassTable\" );\n\n    *maxClassID_p = 3;  /* Classes 0, 2, and 3 are predefined */\n\n    GXV_LIMIT_CHECK( 2 + 2 );\n    firstGlyph = FT_NEXT_USHORT( p );\n    nGlyphs    = FT_NEXT_USHORT( p );\n\n    GXV_TRACE(( \" (firstGlyph = %d, nGlyphs = %d)\\n\", firstGlyph, nGlyphs ));\n\n    if ( !nGlyphs )\n      goto Out;\n\n    gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), valid );\n\n    {\n      FT_Byte    nGlyphInClass[256];\n      FT_Byte    classID;\n      FT_UShort  i;\n\n\n      ft_memset( nGlyphInClass, 0, 256 );\n\n\n      for ( i = 0; i < nGlyphs; i++ )\n      {\n        GXV_LIMIT_CHECK( 1 );\n        classID = FT_NEXT_BYTE( p );\n        switch ( classID )\n        {\n          /* following classes should not appear in class array */\n        case 0:             /* end of text */\n        case 2:             /* out of bounds */\n        case 3:             /* end of line */\n          FT_INVALID_DATA;\n          break;\n\n        case 1:             /* out of bounds */\n        default:            /* user-defined: 4 - ( stateSize - 1 ) */\n          if ( classID >= stateSize )\n            FT_INVALID_DATA;   /* assign glyph to undefined state */\n\n          nGlyphInClass[classID]++;\n          break;\n        }\n      }\n      *length_p = (FT_UShort)( p - table );\n\n      /* scan max ClassID in use */\n      for ( i = 0; i < stateSize; i++ )\n        if ( ( 3 < i ) && ( nGlyphInClass[i] > 0 ) )\n          *maxClassID_p = (FT_Byte)i;  /* XXX: Check Range? */\n    }\n\n  Out:\n    GXV_TRACE(( \"Declared stateSize=0x%02x, Used maxClassID=0x%02x\\n\",\n                stateSize, *maxClassID_p ));\n    GXV_EXIT;\n  }\n\n\n  /* --------------------------- State Array ----------------------------- */\n\n  static void\n  gxv_StateArray_validate( FT_Bytes       table,\n                           FT_UShort*     length_p,\n                           FT_Byte        maxClassID,\n                           FT_UShort      stateSize,\n                           FT_Byte*       maxState_p,\n                           FT_Byte*       maxEntry_p,\n                           GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_Bytes  limit = table + *length_p;\n    FT_Byte   clazz;\n    FT_Byte   entry;\n\n    FT_UNUSED( stateSize ); /* for the non-debugging case */\n\n\n    GXV_NAME_ENTER( \"StateArray\" );\n\n    GXV_TRACE(( \"parse %d bytes by stateSize=%d maxClassID=%d\\n\",\n                (int)(*length_p), stateSize, (int)(maxClassID) ));\n\n    /*\n     * 2 states are predefined and must be described in StateArray:\n     * state 0 (start of text), 1 (start of line)\n     */\n    GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 );\n\n    *maxState_p = 0;\n    *maxEntry_p = 0;\n\n    /* read if enough to read another state */\n    while ( p + ( 1 + maxClassID ) <= limit )\n    {\n      (*maxState_p)++;\n      for ( clazz = 0; clazz <= maxClassID; clazz++ )\n      {\n        entry = FT_NEXT_BYTE( p );\n        *maxEntry_p = (FT_Byte)FT_MAX( *maxEntry_p, entry );\n      }\n    }\n    GXV_TRACE(( \"parsed: maxState=%d, maxEntry=%d\\n\",\n                *maxState_p, *maxEntry_p ));\n\n    *length_p = (FT_UShort)( p - table );\n\n    GXV_EXIT;\n  }\n\n\n  /* --------------------------- Entry Table ----------------------------- */\n\n  static void\n  gxv_EntryTable_validate( FT_Bytes       table,\n                           FT_UShort*     length_p,\n                           FT_Byte        maxEntry,\n                           FT_UShort      stateArray,\n                           FT_UShort      stateArray_length,\n                           FT_Byte        maxClassID,\n                           FT_Bytes       statetable_table,\n                           FT_Bytes       statetable_limit,\n                           GXV_Validator  valid )\n  {\n    FT_Bytes  p     = table;\n    FT_Bytes  limit = table + *length_p;\n    FT_Byte   entry;\n    FT_Byte   state;\n    FT_Int    entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( statetable );\n\n    GXV_XStateTable_GlyphOffsetDesc  glyphOffset;\n\n\n    GXV_NAME_ENTER( \"EntryTable\" );\n\n    GXV_TRACE(( \"maxEntry=%d entrySize=%d\\n\", maxEntry, entrySize ));\n\n    if ( ( maxEntry + 1 ) * entrySize > *length_p )\n    {\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_TOO_SHORT );\n\n      /* ftxvalidator and FontValidator both warn and continue */\n      maxEntry = (FT_Byte)( *length_p / entrySize - 1 );\n      GXV_TRACE(( \"too large maxEntry, shrinking to %d fit EntryTable length\\n\",\n                  maxEntry ));\n    }\n\n    for ( entry = 0; entry <= maxEntry; entry++ )\n    {\n      FT_UShort  newState;\n      FT_UShort  flags;\n\n\n      GXV_LIMIT_CHECK( 2 + 2 );\n      newState = FT_NEXT_USHORT( p );\n      flags    = FT_NEXT_USHORT( p );\n\n\n      if ( newState < stateArray                     ||\n           stateArray + stateArray_length < newState )\n      {\n        GXV_TRACE(( \" newState offset 0x%04x is out of stateArray\\n\",\n                    newState ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n        continue;\n      }\n\n      if ( 0 != ( ( newState - stateArray ) % ( 1 + maxClassID ) ) )\n      {\n        GXV_TRACE(( \" newState offset 0x%04x is not aligned to %d-classes\\n\",\n                    newState,  1 + maxClassID ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n        continue;\n      }\n\n      state = (FT_Byte)( ( newState - stateArray ) / ( 1 + maxClassID ) );\n\n      switch ( GXV_GLYPHOFFSET_FMT( statetable ) )\n      {\n      case GXV_GLYPHOFFSET_NONE:\n        glyphOffset.uc = 0;  /* make compiler happy */\n        break;\n\n      case GXV_GLYPHOFFSET_UCHAR:\n        glyphOffset.uc = FT_NEXT_BYTE( p );\n        break;\n\n      case GXV_GLYPHOFFSET_CHAR:\n        glyphOffset.c = FT_NEXT_CHAR( p );\n        break;\n\n      case GXV_GLYPHOFFSET_USHORT:\n        glyphOffset.u = FT_NEXT_USHORT( p );\n        break;\n\n      case GXV_GLYPHOFFSET_SHORT:\n        glyphOffset.s = FT_NEXT_SHORT( p );\n        break;\n\n      case GXV_GLYPHOFFSET_ULONG:\n        glyphOffset.ul = FT_NEXT_ULONG( p );\n        break;\n\n      case GXV_GLYPHOFFSET_LONG:\n        glyphOffset.l = FT_NEXT_LONG( p );\n        break;\n\n      default:\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );\n        goto Exit;\n      }\n\n      if ( NULL != valid->statetable.entry_validate_func )\n        valid->statetable.entry_validate_func( state,\n                                               flags,\n                                               &glyphOffset,\n                                               statetable_table,\n                                               statetable_limit,\n                                               valid );\n    }\n\n  Exit:\n    *length_p = (FT_UShort)( p - table );\n\n    GXV_EXIT;\n  }\n\n\n  /* =========================== State Table ============================= */\n\n  FT_LOCAL_DEF( void )\n  gxv_StateTable_subtable_setup( FT_UShort      table_size,\n                                 FT_UShort      classTable,\n                                 FT_UShort      stateArray,\n                                 FT_UShort      entryTable,\n                                 FT_UShort*     classTable_length_p,\n                                 FT_UShort*     stateArray_length_p,\n                                 FT_UShort*     entryTable_length_p,\n                                 GXV_Validator  valid )\n  {\n    FT_UShort   o[3];\n    FT_UShort*  l[3];\n    FT_UShort   buff[4];\n\n\n    o[0] = classTable;\n    o[1] = stateArray;\n    o[2] = entryTable;\n    l[0] = classTable_length_p;\n    l[1] = stateArray_length_p;\n    l[2] = entryTable_length_p;\n\n    gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, valid );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_StateTable_validate( FT_Bytes       table,\n                           FT_Bytes       limit,\n                           GXV_Validator  valid )\n  {\n    FT_UShort   stateSize;\n    FT_UShort   classTable;     /* offset to Class(Sub)Table */\n    FT_UShort   stateArray;     /* offset to StateArray */\n    FT_UShort   entryTable;     /* offset to EntryTable */\n\n    FT_UShort   classTable_length;\n    FT_UShort   stateArray_length;\n    FT_UShort   entryTable_length;\n    FT_Byte     maxClassID;\n    FT_Byte     maxState;\n    FT_Byte     maxEntry;\n\n    GXV_StateTable_Subtable_Setup_Func  setup_func;\n\n    FT_Bytes    p = table;\n\n\n    GXV_NAME_ENTER( \"StateTable\" );\n\n    GXV_TRACE(( \"StateTable header\\n\" ));\n\n    GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 );\n    stateSize  = FT_NEXT_USHORT( p );\n    classTable = FT_NEXT_USHORT( p );\n    stateArray = FT_NEXT_USHORT( p );\n    entryTable = FT_NEXT_USHORT( p );\n\n    GXV_TRACE(( \"stateSize=0x%04x\\n\", stateSize ));\n    GXV_TRACE(( \"offset to classTable=0x%04x\\n\", classTable ));\n    GXV_TRACE(( \"offset to stateArray=0x%04x\\n\", stateArray ));\n    GXV_TRACE(( \"offset to entryTable=0x%04x\\n\", entryTable ));\n\n    if ( stateSize > 0xFF )\n      FT_INVALID_DATA;\n\n    if ( valid->statetable.optdata_load_func != NULL )\n      valid->statetable.optdata_load_func( p, limit, valid );\n\n    if ( valid->statetable.subtable_setup_func != NULL)\n      setup_func = valid->statetable.subtable_setup_func;\n    else\n      setup_func = gxv_StateTable_subtable_setup;\n\n    setup_func( (FT_UShort)( limit - table ),\n                classTable,\n                stateArray,\n                entryTable,\n                &classTable_length,\n                &stateArray_length,\n                &entryTable_length,\n                valid );\n\n    GXV_TRACE(( \"StateTable Subtables\\n\" ));\n\n    if ( classTable != 0 )\n      gxv_ClassTable_validate( table + classTable,\n                               &classTable_length,\n                               stateSize,\n                               &maxClassID,\n                               valid );\n    else\n      maxClassID = (FT_Byte)( stateSize - 1 );\n\n    if ( stateArray != 0 )\n      gxv_StateArray_validate( table + stateArray,\n                               &stateArray_length,\n                               maxClassID,\n                               stateSize,\n                               &maxState,\n                               &maxEntry,\n                               valid );\n    else\n    {\n      maxState = 1;     /* 0:start of text, 1:start of line are predefined */\n      maxEntry = 0;\n    }\n\n    if ( maxEntry > 0 && entryTable == 0 )\n      FT_INVALID_OFFSET;\n\n    if ( entryTable != 0 )\n      gxv_EntryTable_validate( table + entryTable,\n                               &entryTable_length,\n                               maxEntry,\n                               stateArray,\n                               stateArray_length,\n                               maxClassID,\n                               table,\n                               limit,\n                               valid );\n\n    GXV_EXIT;\n  }\n\n\n  /* ================= eXtended State Table (for morx) =================== */\n\n  FT_LOCAL_DEF( void )\n  gxv_XStateTable_subtable_setup( FT_ULong       table_size,\n                                  FT_ULong       classTable,\n                                  FT_ULong       stateArray,\n                                  FT_ULong       entryTable,\n                                  FT_ULong*      classTable_length_p,\n                                  FT_ULong*      stateArray_length_p,\n                                  FT_ULong*      entryTable_length_p,\n                                  GXV_Validator  valid )\n  {\n    FT_ULong   o[3];\n    FT_ULong*  l[3];\n    FT_ULong   buff[4];\n\n\n    o[0] = classTable;\n    o[1] = stateArray;\n    o[2] = entryTable;\n    l[0] = classTable_length_p;\n    l[1] = stateArray_length_p;\n    l[2] = entryTable_length_p;\n\n    gxv_set_length_by_ulong_offset( o, l, buff, 3, table_size, valid );\n  }\n\n\n  static void\n  gxv_XClassTable_lookupval_validate( FT_UShort            glyph,\n                                      GXV_LookupValueCPtr  value_p,\n                                      GXV_Validator        valid )\n  {\n    FT_UNUSED( glyph );\n\n    if ( value_p->u >= valid->xstatetable.nClasses )\n      FT_INVALID_DATA;\n    if ( value_p->u > valid->xstatetable.maxClassID )\n      valid->xstatetable.maxClassID = value_p->u;\n  }\n\n\n  /*\n    +===============+ --------+\n    | lookup header |         |\n    +===============+         |\n    | BinSrchHeader |         |\n    +===============+         |\n    | lastGlyph[0]  |         |\n    +---------------+         |\n    | firstGlyph[0] |         |    head of lookup table\n    +---------------+         |             +\n    | offset[0]     |    ->   |          offset            [byte]\n    +===============+         |             +\n    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]\n    +---------------+         |\n    | firstGlyph[1] |         |\n    +---------------+         |\n    | offset[1]     |         |\n    +===============+         |\n                              |\n     ....                     |\n                              |\n    16bit value array         |\n    +===============+         |\n    |     value     | <-------+\n     ....\n  */\n  static GXV_LookupValueDesc\n  gxv_XClassTable_lookupfmt4_transit( FT_UShort            relative_gindex,\n                                      GXV_LookupValueCPtr  base_value_p,\n                                      FT_Bytes             lookuptbl_limit,\n                                      GXV_Validator        valid )\n  {\n    FT_Bytes             p;\n    FT_Bytes             limit;\n    FT_UShort            offset;\n    GXV_LookupValueDesc  value;\n\n    /* XXX: check range? */\n    offset = (FT_UShort)( base_value_p->u +\n                          relative_gindex * sizeof ( FT_UShort ) );\n\n    p     = valid->lookuptbl_head + offset;\n    limit = lookuptbl_limit;\n\n    GXV_LIMIT_CHECK ( 2 );\n    value.u = FT_NEXT_USHORT( p );\n\n    return value;\n  }\n\n\n  static void\n  gxv_XStateArray_validate( FT_Bytes       table,\n                            FT_ULong*      length_p,\n                            FT_UShort      maxClassID,\n                            FT_ULong       stateSize,\n                            FT_UShort*     maxState_p,\n                            FT_UShort*     maxEntry_p,\n                            GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_Bytes   limit = table + *length_p;\n    FT_UShort  clazz;\n    FT_UShort  entry;\n\n    FT_UNUSED( stateSize ); /* for the non-debugging case */\n\n\n    GXV_NAME_ENTER( \"XStateArray\" );\n\n    GXV_TRACE(( \"parse % 3d bytes by stateSize=% 3d maxClassID=% 3d\\n\",\n                (int)(*length_p), stateSize, (int)(maxClassID) ));\n\n    /*\n     * 2 states are predefined and must be described:\n     * state 0 (start of text), 1 (start of line)\n     */\n    GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 * 2 );\n\n    *maxState_p = 0;\n    *maxEntry_p = 0;\n\n    /* read if enough to read another state */\n    while ( p + ( ( 1 + maxClassID ) * 2 ) <= limit )\n    {\n      (*maxState_p)++;\n      for ( clazz = 0; clazz <= maxClassID; clazz++ )\n      {\n        entry = FT_NEXT_USHORT( p );\n        *maxEntry_p = (FT_UShort)FT_MAX( *maxEntry_p, entry );\n      }\n    }\n    GXV_TRACE(( \"parsed: maxState=%d, maxEntry=%d\\n\",\n                *maxState_p, *maxEntry_p ));\n\n    *length_p = p - table;\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_XEntryTable_validate( FT_Bytes       table,\n                            FT_ULong*      length_p,\n                            FT_UShort      maxEntry,\n                            FT_ULong       stateArray_length,\n                            FT_UShort      maxClassID,\n                            FT_Bytes       xstatetable_table,\n                            FT_Bytes       xstatetable_limit,\n                            GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_Bytes   limit = table + *length_p;\n    FT_UShort  entry;\n    FT_UShort  state;\n    FT_Int     entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( xstatetable );\n\n\n    GXV_NAME_ENTER( \"XEntryTable\" );\n    GXV_TRACE(( \"maxEntry=%d entrySize=%d\\n\", maxEntry, entrySize ));\n\n    if ( ( p + ( maxEntry + 1 ) * entrySize ) > limit )\n      FT_INVALID_TOO_SHORT;\n\n    for (entry = 0; entry <= maxEntry ; entry++ )\n    {\n      FT_UShort                        newState_idx;\n      FT_UShort                        flags;\n      GXV_XStateTable_GlyphOffsetDesc  glyphOffset;\n\n\n      GXV_LIMIT_CHECK( 2 + 2 );\n      newState_idx = FT_NEXT_USHORT( p );\n      flags        = FT_NEXT_USHORT( p );\n\n      if ( stateArray_length < (FT_ULong)( newState_idx * 2 ) )\n      {\n        GXV_TRACE(( \"  newState index 0x%04x points out of stateArray\\n\",\n                    newState_idx ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n      }\n\n      state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) );\n      if ( 0 != ( newState_idx % ( 1 + maxClassID ) ) )\n      {\n        FT_TRACE4(( \"-> new state = %d (supposed)\\n\"\n                    \"but newState index 0x%04x is not aligned to %d-classes\\n\",\n                    state, newState_idx,  1 + maxClassID ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n      }\n\n      switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) )\n      {\n      case GXV_GLYPHOFFSET_NONE:\n        glyphOffset.uc = 0; /* make compiler happy */\n        break;\n\n      case GXV_GLYPHOFFSET_UCHAR:\n        glyphOffset.uc = FT_NEXT_BYTE( p );\n        break;\n\n      case GXV_GLYPHOFFSET_CHAR:\n        glyphOffset.c = FT_NEXT_CHAR( p );\n        break;\n\n      case GXV_GLYPHOFFSET_USHORT:\n        glyphOffset.u = FT_NEXT_USHORT( p );\n        break;\n\n      case GXV_GLYPHOFFSET_SHORT:\n        glyphOffset.s = FT_NEXT_SHORT( p );\n        break;\n\n      case GXV_GLYPHOFFSET_ULONG:\n        glyphOffset.ul = FT_NEXT_ULONG( p );\n        break;\n\n      case GXV_GLYPHOFFSET_LONG:\n        glyphOffset.l = FT_NEXT_LONG( p );\n        break;\n\n      default:\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );\n        goto Exit;\n      }\n\n      if ( NULL != valid->xstatetable.entry_validate_func )\n        valid->xstatetable.entry_validate_func( state,\n                                                flags,\n                                                &glyphOffset,\n                                                xstatetable_table,\n                                                xstatetable_limit,\n                                                valid );\n    }\n\n  Exit:\n    *length_p = p - table;\n\n    GXV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_XStateTable_validate( FT_Bytes       table,\n                            FT_Bytes       limit,\n                            GXV_Validator  valid )\n  {\n    /* StateHeader members */\n    FT_ULong   classTable;      /* offset to Class(Sub)Table */\n    FT_ULong   stateArray;      /* offset to StateArray */\n    FT_ULong   entryTable;      /* offset to EntryTable */\n\n    FT_ULong   classTable_length;\n    FT_ULong   stateArray_length;\n    FT_ULong   entryTable_length;\n    FT_UShort  maxState;\n    FT_UShort  maxEntry;\n\n    GXV_XStateTable_Subtable_Setup_Func  setup_func;\n\n    FT_Bytes   p = table;\n\n\n    GXV_NAME_ENTER( \"XStateTable\" );\n\n    GXV_TRACE(( \"XStateTable header\\n\" ));\n\n    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );\n    valid->xstatetable.nClasses = FT_NEXT_ULONG( p );\n    classTable = FT_NEXT_ULONG( p );\n    stateArray = FT_NEXT_ULONG( p );\n    entryTable = FT_NEXT_ULONG( p );\n\n    GXV_TRACE(( \"nClasses =0x%08x\\n\", valid->xstatetable.nClasses ));\n    GXV_TRACE(( \"offset to classTable=0x%08x\\n\", classTable ));\n    GXV_TRACE(( \"offset to stateArray=0x%08x\\n\", stateArray ));\n    GXV_TRACE(( \"offset to entryTable=0x%08x\\n\", entryTable ));\n\n    if ( valid->xstatetable.nClasses > 0xFFFFU )\n      FT_INVALID_DATA;\n\n    GXV_TRACE(( \"StateTable Subtables\\n\" ));\n\n    if ( valid->xstatetable.optdata_load_func != NULL )\n      valid->xstatetable.optdata_load_func( p, limit, valid );\n\n    if ( valid->xstatetable.subtable_setup_func != NULL )\n      setup_func = valid->xstatetable.subtable_setup_func;\n    else\n      setup_func = gxv_XStateTable_subtable_setup;\n\n    setup_func( limit - table,\n                classTable,\n                stateArray,\n                entryTable,\n                &classTable_length,\n                &stateArray_length,\n                &entryTable_length,\n                valid );\n\n    if ( classTable != 0 )\n    {\n      valid->xstatetable.maxClassID = 0;\n      valid->lookupval_sign         = GXV_LOOKUPVALUE_UNSIGNED;\n      valid->lookupval_func         = gxv_XClassTable_lookupval_validate;\n      valid->lookupfmt4_trans       = gxv_XClassTable_lookupfmt4_transit;\n      gxv_LookupTable_validate( table + classTable,\n                                table + classTable + classTable_length,\n                                valid );\n      if ( valid->subtable_length < classTable_length )\n        classTable_length = valid->subtable_length;\n    }\n    else\n    {\n      /* XXX: check range? */\n      valid->xstatetable.maxClassID =\n        (FT_UShort)( valid->xstatetable.nClasses - 1 );\n    }\n\n    if ( stateArray != 0 )\n      gxv_XStateArray_validate( table + stateArray,\n                                &stateArray_length,\n                                valid->xstatetable.maxClassID,\n                                valid->xstatetable.nClasses,\n                                &maxState,\n                                &maxEntry,\n                                valid );\n    else\n    {\n      maxState = 1; /* 0:start of text, 1:start of line are predefined */\n      maxEntry = 0;\n    }\n\n    if ( maxEntry > 0 && entryTable == 0 )\n      FT_INVALID_OFFSET;\n\n    if ( entryTable != 0 )\n      gxv_XEntryTable_validate( table + entryTable,\n                                &entryTable_length,\n                                maxEntry,\n                                stateArray_length,\n                                valid->xstatetable.maxClassID,\n                                table,\n                                limit,\n                                valid );\n\n    GXV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        Table overlapping                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static int\n  gxv_compare_ranges( FT_Bytes  table1_start,\n                      FT_ULong  table1_length,\n                      FT_Bytes  table2_start,\n                      FT_ULong  table2_length )\n  {\n    if ( table1_start == table2_start )\n    {\n      if ( ( table1_length == 0 || table2_length == 0 ) )\n        goto Out;\n    }\n    else if ( table1_start < table2_start )\n    {\n      if ( ( table1_start + table1_length ) <= table2_start )\n        goto Out;\n    }\n    else if ( table1_start > table2_start )\n    {\n      if ( ( table1_start >= table2_start + table2_length ) )\n        goto Out;\n    }\n    return 1;\n\n  Out:\n    return 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_odtect_add_range( FT_Bytes          start,\n                        FT_ULong          length,\n                        const FT_String*  name,\n                        GXV_odtect_Range  odtect )\n  {\n    odtect->range[odtect->nRanges].start  = start;\n    odtect->range[odtect->nRanges].length = length;\n    odtect->range[odtect->nRanges].name   = (FT_String*)name;\n    odtect->nRanges++;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_odtect_validate( GXV_odtect_Range  odtect,\n                       GXV_Validator     valid )\n  {\n    FT_UInt  i, j;\n\n\n    GXV_NAME_ENTER( \"check overlap among multi ranges\" );\n\n    for ( i = 0; i < odtect->nRanges; i++ )\n      for ( j = 0; j < i; j++ )\n        if ( 0 != gxv_compare_ranges( odtect->range[i].start,\n                                      odtect->range[i].length,\n                                      odtect->range[j].start,\n                                      odtect->range[j].length ) )\n        {\n          if ( odtect->range[i].name || odtect->range[j].name )\n            GXV_TRACE(( \"found overlap between range %d and range %d\\n\",\n                        i, j ));\n          else\n            GXV_TRACE(( \"found overlap between `%s' and `%s\\'\\n\",\n                        odtect->range[i].name,\n                        odtect->range[j].name ));\n          FT_INVALID_OFFSET;\n        }\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvcommn.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvcommn.h                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT common tables validation (specification).             */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2012                                             */\n/*  by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*\n   * keywords in variable naming\n   * ---------------------------\n   *  table: Of type FT_Bytes, pointing to the start of this table/subtable.\n   *  limit: Of type FT_Bytes, pointing to the end of this table/subtable,\n   *         including padding for alignment.\n   *  offset: Of type FT_UInt, the number of octets from the start to target.\n   *  length: Of type FT_UInt, the number of octets from the start to the\n   *          end in this table/subtable, including padding for alignment.\n   *\n   *  _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc.\n   */\n\n\n#ifndef __GXVCOMMN_H__\n#define __GXVCOMMN_H__\n\n\n#include <ft2build.h>\n#include \"gxvalid.h\"\n#include FT_INTERNAL_DEBUG_H\n#include FT_SFNT_NAMES_H\n\n\nFT_BEGIN_HEADER\n\n\n  /* some variables are not evaluated or only used in trace */\n\n#ifdef  FT_DEBUG_LEVEL_TRACE\n#define GXV_LOAD_TRACE_VARS\n#else\n#undef  GXV_LOAD_TRACE_VARS\n#endif\n\n#undef GXV_LOAD_UNUSED_VARS /* debug purpose */\n\n#define IS_PARANOID_VALIDATION          ( valid->root->level >= FT_VALIDATE_PARANOID )\n#define GXV_SET_ERR_IF_PARANOID( err )  { if ( IS_PARANOID_VALIDATION ) ( err ); }\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         VALIDATION                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct GXV_ValidatorRec_*  GXV_Validator;\n\n\n#define DUMMY_LIMIT 0\n\n  typedef void\n  (*GXV_Validate_Func)( FT_Bytes       table,\n                        FT_Bytes       limit,\n                        GXV_Validator  valid );\n\n\n  /* ====================== LookupTable Validator ======================== */\n\n  typedef union  GXV_LookupValueDesc_\n  {\n    FT_UShort u;\n    FT_Short  s;\n\n  } GXV_LookupValueDesc;\n\n  typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;\n\n  typedef enum  GXV_LookupValue_SignSpec_\n  {\n    GXV_LOOKUPVALUE_UNSIGNED = 0,\n    GXV_LOOKUPVALUE_SIGNED\n\n  } GXV_LookupValue_SignSpec;\n\n\n  typedef void\n  (*GXV_Lookup_Value_Validate_Func)( FT_UShort            glyph,\n                                     GXV_LookupValueCPtr  value_p,\n                                     GXV_Validator        valid );\n\n  typedef GXV_LookupValueDesc\n  (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort            relative_gindex,\n                                   GXV_LookupValueCPtr  base_value_p,\n                                   FT_Bytes             lookuptbl_limit,\n                                   GXV_Validator        valid );\n\n\n  /* ====================== StateTable Validator ========================= */\n\n  typedef enum  GXV_GlyphOffset_Format_\n  {\n    GXV_GLYPHOFFSET_NONE   = -1,\n    GXV_GLYPHOFFSET_UCHAR  = 2,\n    GXV_GLYPHOFFSET_CHAR,\n    GXV_GLYPHOFFSET_USHORT = 4,\n    GXV_GLYPHOFFSET_SHORT,\n    GXV_GLYPHOFFSET_ULONG  = 8,\n    GXV_GLYPHOFFSET_LONG\n\n  } GXV_GlyphOffset_Format;\n\n\n#define GXV_GLYPHOFFSET_FMT( table )           \\\n        ( valid->table.entry_glyphoffset_fmt )\n\n#define GXV_GLYPHOFFSET_SIZE( table )              \\\n        ( valid->table.entry_glyphoffset_fmt / 2 )\n\n\n  /* ----------------------- 16bit StateTable ---------------------------- */\n\n  typedef union  GXV_StateTable_GlyphOffsetDesc_\n  {\n    FT_Byte    uc;\n    FT_UShort  u;       /* same as GXV_LookupValueDesc */\n    FT_ULong   ul;\n    FT_Char    c;\n    FT_Short   s;       /* same as GXV_LookupValueDesc */\n    FT_Long    l;\n\n  } GXV_StateTable_GlyphOffsetDesc;\n\n  typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;\n\n  typedef void\n  (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort      table_size,\n                                         FT_UShort      classTable,\n                                         FT_UShort      stateArray,\n                                         FT_UShort      entryTable,\n                                         FT_UShort*     classTable_length_p,\n                                         FT_UShort*     stateArray_length_p,\n                                         FT_UShort*     entryTable_length_p,\n                                         GXV_Validator  valid );\n\n  typedef void\n  (*GXV_StateTable_Entry_Validate_Func)(\n     FT_Byte                         state,\n     FT_UShort                       flags,\n     GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n     FT_Bytes                        statetable_table,\n     FT_Bytes                        statetable_limit,\n     GXV_Validator                   valid );\n\n  typedef void\n  (*GXV_StateTable_OptData_Load_Func)( FT_Bytes       table,\n                                       FT_Bytes       limit,\n                                       GXV_Validator  valid );\n\n  typedef struct  GXV_StateTable_ValidatorRec_\n  {\n    GXV_GlyphOffset_Format              entry_glyphoffset_fmt;\n    void*                               optdata;\n\n    GXV_StateTable_Subtable_Setup_Func  subtable_setup_func;\n    GXV_StateTable_Entry_Validate_Func  entry_validate_func;\n    GXV_StateTable_OptData_Load_Func    optdata_load_func;\n\n  } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;\n\n\n  /* ---------------------- 32bit XStateTable ---------------------------- */\n\n  typedef GXV_StateTable_GlyphOffsetDesc  GXV_XStateTable_GlyphOffsetDesc;\n\n  typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;\n\n  typedef void\n  (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong       table_size,\n                                          FT_ULong       classTable,\n                                          FT_ULong       stateArray,\n                                          FT_ULong       entryTable,\n                                          FT_ULong*      classTable_length_p,\n                                          FT_ULong*      stateArray_length_p,\n                                          FT_ULong*      entryTable_length_p,\n                                          GXV_Validator  valid );\n\n  typedef void\n  (*GXV_XStateTable_Entry_Validate_Func)(\n     FT_UShort                       state,\n     FT_UShort                       flags,\n     GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n     FT_Bytes                        xstatetable_table,\n     FT_Bytes                        xstatetable_limit,\n     GXV_Validator                   valid );\n\n\n  typedef GXV_StateTable_OptData_Load_Func  GXV_XStateTable_OptData_Load_Func;\n\n\n  typedef struct  GXV_XStateTable_ValidatorRec_\n  {\n    int                                  entry_glyphoffset_fmt;\n    void*                                optdata;\n\n    GXV_XStateTable_Subtable_Setup_Func  subtable_setup_func;\n    GXV_XStateTable_Entry_Validate_Func  entry_validate_func;\n    GXV_XStateTable_OptData_Load_Func    optdata_load_func;\n\n    FT_ULong                             nClasses;\n    FT_UShort                            maxClassID;\n\n  } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;\n\n\n  /* ===================================================================== */\n\n  typedef struct  GXV_ValidatorRec_\n  {\n    FT_Validator  root;\n\n    FT_Face       face;\n    void*         table_data;\n\n    FT_ULong      subtable_length;\n\n    GXV_LookupValue_SignSpec        lookupval_sign;\n    GXV_Lookup_Value_Validate_Func  lookupval_func;\n    GXV_Lookup_Fmt4_Transit_Func    lookupfmt4_trans;\n    FT_Bytes                        lookuptbl_head;\n\n    FT_UShort  min_gid;\n    FT_UShort  max_gid;\n\n    GXV_StateTable_ValidatorRec     statetable;\n    GXV_XStateTable_ValidatorRec    xstatetable;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    FT_UInt             debug_indent;\n    const FT_String*    debug_function_name[3];\n#endif\n\n  } GXV_ValidatorRec;\n\n\n#define GXV_TABLE_DATA( tag, field )                           \\\n        ( ( (GXV_ ## tag ## _Data)valid->table_data )->field )\n\n#undef  FT_INVALID_\n#define FT_INVALID_( _prefix, _error )                         \\\n          ft_validator_error( valid->root, _prefix ## _error )\n\n#define GXV_LIMIT_CHECK( _count )                                     \\\n          FT_BEGIN_STMNT                                              \\\n            if ( p + _count > ( limit? limit : valid->root->limit ) ) \\\n              FT_INVALID_TOO_SHORT;                                   \\\n          FT_END_STMNT\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#define GXV_INIT  valid->debug_indent = 0\n\n#define GXV_NAME_ENTER( name )                             \\\n          FT_BEGIN_STMNT                                   \\\n            valid->debug_indent += 2;                      \\\n            FT_TRACE4(( \"%*.s\", valid->debug_indent, 0 )); \\\n            FT_TRACE4(( \"%s table\\n\", name ));             \\\n          FT_END_STMNT\n\n#define GXV_EXIT  valid->debug_indent -= 2\n\n#define GXV_TRACE( s )                                     \\\n          FT_BEGIN_STMNT                                   \\\n            FT_TRACE4(( \"%*.s\", valid->debug_indent, 0 )); \\\n            FT_TRACE4( s );                                \\\n          FT_END_STMNT\n\n#else /* !FT_DEBUG_LEVEL_TRACE */\n\n#define GXV_INIT                do { } while ( 0 )\n#define GXV_NAME_ENTER( name )  do { } while ( 0 )\n#define GXV_EXIT                do { } while ( 0 )\n\n#define GXV_TRACE( s )          do { } while ( 0 )\n\n#endif  /* !FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    32bit alignment checking                   *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \\\n          FT_BEGIN_STMNT                  \\\n            {                             \\\n              if ( (a) & 3 )              \\\n                FT_INVALID_OFFSET ;       \\\n            }                             \\\n          FT_END_STMNT\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    Dumping Binary Data                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define GXV_TRACE_HEXDUMP( p, len )                     \\\n          FT_BEGIN_STMNT                                \\\n            {                                           \\\n              FT_Bytes  b;                              \\\n                                                        \\\n                                                        \\\n              for ( b = p; b < (FT_Bytes)p + len; b++ ) \\\n                FT_TRACE1((\"\\\\x%02x\", *b)) ;            \\\n            }                                           \\\n          FT_END_STMNT\n\n#define GXV_TRACE_HEXDUMP_C( p, len )                   \\\n          FT_BEGIN_STMNT                                \\\n            {                                           \\\n              FT_Bytes  b;                              \\\n                                                        \\\n                                                        \\\n              for ( b = p; b < (FT_Bytes)p + len; b++ ) \\\n                if ( 0x40 < *b && *b < 0x7e )           \\\n                  FT_TRACE1((\"%c\", *b)) ;               \\\n                else                                    \\\n                  FT_TRACE1((\"\\\\x%02x\", *b)) ;          \\\n            }                                           \\\n          FT_END_STMNT\n\n#define GXV_TRACE_HEXDUMP_SFNTNAME( n )               \\\n          GXV_TRACE_HEXDUMP( n.string, n.string_len )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         LOOKUP TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  gxv_BinSrchHeader_validate( FT_Bytes       p,\n                              FT_Bytes       limit,\n                              FT_UShort*     unitSize_p,\n                              FT_UShort*     nUnits_p,\n                              GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_LookupTable_validate( FT_Bytes       table,\n                            FT_Bytes       limit,\n                            GXV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          Glyph ID                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( FT_Int )\n  gxv_glyphid_validate( FT_UShort      gid,\n                        GXV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        CONTROL POINT                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  gxv_ctlPoint_validate( FT_UShort      gid,\n                         FT_Short       ctl_point,\n                         GXV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          SFNT NAME                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  gxv_sfntName_validate( FT_UShort      name_index,\n                         FT_UShort      min_index,\n                         FT_UShort      max_index,\n                         GXV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          STATE TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  gxv_StateTable_subtable_setup( FT_UShort      table_size,\n                                 FT_UShort      classTable,\n                                 FT_UShort      stateArray,\n                                 FT_UShort      entryTable,\n                                 FT_UShort*     classTable_length_p,\n                                 FT_UShort*     stateArray_length_p,\n                                 FT_UShort*     entryTable_length_p,\n                                 GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_XStateTable_subtable_setup( FT_ULong       table_size,\n                                  FT_ULong       classTable,\n                                  FT_ULong       stateArray,\n                                  FT_ULong       entryTable,\n                                  FT_ULong*      classTable_length_p,\n                                  FT_ULong*      stateArray_length_p,\n                                  FT_ULong*      entryTable_length_p,\n                                  GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_StateTable_validate( FT_Bytes       table,\n                           FT_Bytes       limit,\n                           GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_XStateTable_validate( FT_Bytes       table,\n                            FT_Bytes       limit,\n                            GXV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                 UTILITY MACROS AND FUNCTIONS                  *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  gxv_array_getlimits_byte( FT_Bytes       table,\n                            FT_Bytes       limit,\n                            FT_Byte*       min,\n                            FT_Byte*       max,\n                            GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_array_getlimits_ushort( FT_Bytes       table,\n                              FT_Bytes       limit,\n                              FT_UShort*     min,\n                              FT_UShort*     max,\n                              GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_set_length_by_ushort_offset( FT_UShort*     offset,\n                                   FT_UShort**    length,\n                                   FT_UShort*     buff,\n                                   FT_UInt        nmemb,\n                                   FT_UShort      limit,\n                                   GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_set_length_by_ulong_offset( FT_ULong*      offset,\n                                  FT_ULong**     length,\n                                  FT_ULong*      buff,\n                                  FT_UInt        nmemb,\n                                  FT_ULong       limit,\n                                  GXV_Validator  valid);\n\n\n#define GXV_SUBTABLE_OFFSET_CHECK( _offset )          \\\n          FT_BEGIN_STMNT                              \\\n            if ( (_offset) > valid->subtable_length ) \\\n              FT_INVALID_OFFSET;                      \\\n          FT_END_STMNT\n\n#define GXV_SUBTABLE_LIMIT_CHECK( _count )                  \\\n          FT_BEGIN_STMNT                                    \\\n            if ( ( p + (_count) - valid->subtable_start ) > \\\n                   valid->subtable_length )                 \\\n              FT_INVALID_TOO_SHORT;                         \\\n          FT_END_STMNT\n\n#define GXV_USHORT_TO_SHORT( _us )                                    \\\n          ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) )\n\n#define GXV_STATETABLE_HEADER_SIZE  ( 2 + 2 + 2 + 2 )\n#define GXV_STATEHEADER_SIZE        GXV_STATETABLE_HEADER_SIZE\n\n#define GXV_XSTATETABLE_HEADER_SIZE  ( 4 + 4 + 4 + 4 )\n#define GXV_XSTATEHEADER_SIZE        GXV_XSTATETABLE_HEADER_SIZE\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        Table overlapping                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  GXV_odtect_DataRec_\n  {\n    FT_Bytes    start;\n    FT_ULong    length;\n    FT_String*  name;\n\n  } GXV_odtect_DataRec,  *GXV_odtect_Data;\n\n  typedef struct  GXV_odtect_RangeRec_\n  {\n    FT_UInt          nRanges;\n    GXV_odtect_Data  range;\n\n  } GXV_odtect_RangeRec, *GXV_odtect_Range;\n\n\n  FT_LOCAL( void )\n  gxv_odtect_add_range( FT_Bytes          start,\n                        FT_ULong          length,\n                        const FT_String*  name,\n                        GXV_odtect_Range  odtect );\n\n  FT_LOCAL( void )\n  gxv_odtect_validate( GXV_odtect_Range  odtect,\n                       GXV_Validator     valid );\n\n\n#define GXV_ODTECT( n, odtect )                              \\\n          GXV_odtect_DataRec   odtect ## _range[n];          \\\n          GXV_odtect_RangeRec  odtect ## _rec = { 0, NULL }; \\\n          GXV_odtect_Range     odtect = NULL\n\n#define GXV_ODTECT_INIT( odtect )                      \\\n          FT_BEGIN_STMNT                               \\\n            odtect ## _rec.nRanges = 0;                \\\n            odtect ## _rec.range   = odtect ## _range; \\\n            odtect                 = & odtect ## _rec; \\\n          FT_END_STMNT\n\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __GXVCOMMN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxverror.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxverror.h                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT validation module error codes (specification only).   */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2012-2013                                        */\n/*    by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the OpenType validation module error      */\n  /* enumeration constants.                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __GXVERROR_H__\n#define __GXVERROR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  GXV_Err_\n#define FT_ERR_BASE    FT_Mod_Err_GXvalid\n\n#include FT_ERRORS_H\n\n#endif /* __GXVERROR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvfeat.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvfeat.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT feat table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2008, 2012 by                                    */\n/*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n#include \"gxvfeat.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvfeat\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      Data and Types                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  GXV_feat_DataRec_\n  {\n    FT_UInt    reserved_size;\n    FT_UShort  feature;\n    FT_UShort  setting;\n\n  } GXV_feat_DataRec, *GXV_feat_Data;\n\n\n#define GXV_FEAT_DATA( field )  GXV_TABLE_DATA( feat, field )\n\n\n  typedef enum  GXV_FeatureFlagsMask_\n  {\n    GXV_FEAT_MASK_EXCLUSIVE_SETTINGS = 0x8000U,\n    GXV_FEAT_MASK_DYNAMIC_DEFAULT    = 0x4000,\n    GXV_FEAT_MASK_UNUSED             = 0x3F00,\n    GXV_FEAT_MASK_DEFAULT_SETTING    = 0x00FF\n\n  } GXV_FeatureFlagsMask;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  gxv_feat_registry_validate( FT_UShort      feature,\n                              FT_UShort      nSettings,\n                              FT_Bool        exclusive,\n                              GXV_Validator  valid )\n  {\n    GXV_NAME_ENTER( \"feature in registry\" );\n\n    GXV_TRACE(( \" (feature = %u)\\n\", feature ));\n\n    if ( feature >= gxv_feat_registry_length )\n    {\n      GXV_TRACE(( \"feature number %d is out of range %d\\n\",\n                  feature, gxv_feat_registry_length ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n      goto Exit;\n    }\n\n    if ( gxv_feat_registry[feature].existence == 0 )\n    {\n      GXV_TRACE(( \"feature number %d is in defined range but doesn't exist\\n\",\n                  feature ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n      goto Exit;\n    }\n\n    if ( gxv_feat_registry[feature].apple_reserved )\n    {\n      /* Don't use here. Apple is reserved. */\n      GXV_TRACE(( \"feature number %d is reserved by Apple\\n\", feature ));\n      if ( valid->root->level >= FT_VALIDATE_TIGHT )\n        FT_INVALID_DATA;\n    }\n\n    if ( nSettings != gxv_feat_registry[feature].nSettings )\n    {\n      GXV_TRACE(( \"feature %d: nSettings %d != defined nSettings %d\\n\",\n                  feature, nSettings,\n                  gxv_feat_registry[feature].nSettings ));\n      if ( valid->root->level >= FT_VALIDATE_TIGHT )\n        FT_INVALID_DATA;\n    }\n\n    if ( exclusive != gxv_feat_registry[feature].exclusive )\n    {\n      GXV_TRACE(( \"exclusive flag %d differs from predefined value\\n\",\n                  exclusive ));\n      if ( valid->root->level >= FT_VALIDATE_TIGHT )\n        FT_INVALID_DATA;\n    }\n\n  Exit:\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_feat_name_index_validate( FT_Bytes       table,\n                                FT_Bytes       limit,\n                                GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    FT_Short  nameIndex;\n\n\n    GXV_NAME_ENTER( \"nameIndex\" );\n\n    GXV_LIMIT_CHECK( 2 );\n    nameIndex = FT_NEXT_SHORT ( p );\n    GXV_TRACE(( \" (nameIndex = %d)\\n\", nameIndex ));\n\n    gxv_sfntName_validate( (FT_UShort)nameIndex,\n                           255,\n                           32768U,\n                           valid );\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_feat_setting_validate( FT_Bytes       table,\n                             FT_Bytes       limit,\n                             FT_Bool        exclusive,\n                             GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  setting;\n\n\n    GXV_NAME_ENTER( \"setting\" );\n\n    GXV_LIMIT_CHECK( 2 );\n\n    setting = FT_NEXT_USHORT( p );\n\n    /* If we have exclusive setting, the setting should be odd. */\n    if ( exclusive && ( setting & 1 ) == 0 )\n      FT_INVALID_DATA;\n\n    gxv_feat_name_index_validate( p, limit, valid );\n\n    GXV_FEAT_DATA( setting ) = setting;\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_feat_name_validate( FT_Bytes       table,\n                          FT_Bytes       limit,\n                          GXV_Validator  valid )\n  {\n    FT_Bytes   p             = table;\n    FT_UInt    reserved_size = GXV_FEAT_DATA( reserved_size );\n\n    FT_UShort  feature;\n    FT_UShort  nSettings;\n    FT_ULong   settingTable;\n    FT_UShort  featureFlags;\n\n    FT_Bool    exclusive;\n    FT_Int     last_setting;\n    FT_UInt    i;\n\n\n    GXV_NAME_ENTER( \"name\" );\n\n    /* feature + nSettings + settingTable + featureFlags */\n    GXV_LIMIT_CHECK( 2 + 2 + 4 + 2 );\n\n    feature = FT_NEXT_USHORT( p );\n    GXV_FEAT_DATA( feature ) = feature;\n\n    nSettings    = FT_NEXT_USHORT( p );\n    settingTable = FT_NEXT_ULONG ( p );\n    featureFlags = FT_NEXT_USHORT( p );\n\n    if ( settingTable < reserved_size )\n      FT_INVALID_OFFSET;\n\n    if ( ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 )\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n\n    exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS );\n    if ( exclusive )\n    {\n      FT_Byte  dynamic_default;\n\n\n      if ( featureFlags & GXV_FEAT_MASK_DYNAMIC_DEFAULT )\n        dynamic_default = (FT_Byte)( featureFlags &\n                                     GXV_FEAT_MASK_DEFAULT_SETTING );\n      else\n        dynamic_default = 0;\n\n      /* If exclusive, check whether default setting is in the range. */\n      if ( !( dynamic_default < nSettings ) )\n        FT_INVALID_FORMAT;\n    }\n\n    gxv_feat_registry_validate( feature, nSettings, exclusive, valid );\n\n    gxv_feat_name_index_validate( p, limit, valid );\n\n    p = valid->root->base + settingTable;\n    for ( last_setting = -1, i = 0; i < nSettings; i++ )\n    {\n      gxv_feat_setting_validate( p, limit, exclusive, valid );\n\n      if ( (FT_Int)GXV_FEAT_DATA( setting ) <= last_setting )\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );\n\n      last_setting = (FT_Int)GXV_FEAT_DATA( setting );\n      /* setting + nameIndex */\n      p += ( 2 + 2 );\n    }\n\n    GXV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         feat TABLE                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  gxv_feat_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    GXV_ValidatorRec  validrec;\n    GXV_Validator     valid = &validrec;\n\n    GXV_feat_DataRec  featrec;\n    GXV_feat_Data     feat = &featrec;\n\n    FT_Bytes          p     = table;\n    FT_Bytes          limit = 0;\n\n    FT_UInt           featureNameCount;\n\n    FT_UInt           i;\n    FT_Int            last_feature;\n\n\n    valid->root       = ftvalid;\n    valid->table_data = feat;\n    valid->face       = face;\n\n    FT_TRACE3(( \"validating `feat' table\\n\" ));\n    GXV_INIT;\n\n    feat->reserved_size = 0;\n\n    /* version + featureNameCount + none_0 + none_1  */\n    GXV_LIMIT_CHECK( 4 + 2 + 2 + 4 );\n    feat->reserved_size += 4 + 2 + 2 + 4;\n\n    if ( FT_NEXT_ULONG( p ) != 0x00010000UL ) /* Version */\n      FT_INVALID_FORMAT;\n\n    featureNameCount = FT_NEXT_USHORT( p );\n    GXV_TRACE(( \" (featureNameCount = %d)\\n\", featureNameCount ));\n\n    if ( !( IS_PARANOID_VALIDATION ) )\n      p += 6; /* skip (none) and (none) */\n    else\n    {\n      if ( FT_NEXT_USHORT( p ) != 0 )\n        FT_INVALID_DATA;\n\n      if ( FT_NEXT_ULONG( p )  != 0 )\n        FT_INVALID_DATA;\n    }\n\n    feat->reserved_size += featureNameCount * ( 2 + 2 + 4 + 2 + 2 );\n\n    for ( last_feature = -1, i = 0; i < featureNameCount; i++ )\n    {\n      gxv_feat_name_validate( p, limit, valid );\n\n      if ( (FT_Int)GXV_FEAT_DATA( feature ) <= last_feature )\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );\n\n      last_feature = GXV_FEAT_DATA( feature );\n      p += 2 + 2 + 4 + 2 + 2;\n    }\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvfeat.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvfeat.h                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT feat table validation (specification).                */\n/*                                                                         */\n/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __GXVFEAT_H__\n#define __GXVFEAT_H__\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                Registry predefined by Apple                   *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* TODO: More compact format */\n  typedef struct  GXV_Feature_RegistryRec_\n  {\n    FT_Bool  existence;\n    FT_Bool  apple_reserved;\n    FT_Bool  exclusive;\n    FT_Byte  nSettings;\n\n  } GX_Feature_RegistryRec;\n\n\n#define gxv_feat_registry_length                  \\\n          ( sizeof ( gxv_feat_registry ) /        \\\n              sizeof ( GX_Feature_RegistryRec ) )\n\n\n  static GX_Feature_RegistryRec  gxv_feat_registry[] =\n  {\n    /* Generated from gxvfgen.c */\n    {1, 0, 0,  1},   /* All Typographic Features */\n    {1, 0, 0,  8},   /* Ligatures */\n    {1, 0, 1,  3},   /* Cursive Connection */\n    {1, 0, 1,  6},   /* Letter Case */\n    {1, 0, 0,  1},   /* Vertical Substitution */\n    {1, 0, 0,  1},   /* Linguistic Rearrangement */\n    {1, 0, 1,  2},   /* Number Spacing */\n    {1, 1, 0,  0},   /* Apple Reserved 1 */\n    {1, 0, 0,  5},   /* Smart Swashes */\n    {1, 0, 1,  3},   /* Diacritics */\n    {1, 0, 1,  4},   /* Vertical Position */\n    {1, 0, 1,  3},   /* Fractions */\n    {1, 1, 0,  0},   /* Apple Reserved 2 */\n    {1, 0, 0,  1},   /* Overlapping Characters */\n    {1, 0, 0,  6},   /* Typographic Extras */\n    {1, 0, 0,  5},   /* Mathematical Extras */\n    {1, 0, 1,  7},   /* Ornament Sets */\n    {1, 0, 1,  1},   /* Character Alternatives */\n    {1, 0, 1,  5},   /* Design Complexity */\n    {1, 0, 1,  6},   /* Style Options */\n    {1, 0, 1, 11},   /* Character Shape */\n    {1, 0, 1,  2},   /* Number Case */\n    {1, 0, 1,  4},   /* Text Spacing */\n    {1, 0, 1, 10},   /* Transliteration */\n    {1, 0, 1,  9},   /* Annotation */\n    {1, 0, 1,  2},   /* Kana Spacing */\n    {1, 0, 1,  2},   /* Ideographic Spacing */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {0, 0, 0,  0},   /* __EMPTY__ */\n    {1, 0, 1,  4},   /* Text Spacing */\n    {1, 0, 1,  2},   /* Kana Spacing */\n    {1, 0, 1,  2},   /* Ideographic Spacing */\n    {1, 0, 1,  4},   /* CJK Roman Spacing */\n  };\n\n\n#endif /* __GXVFEAT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvfgen.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxfgen.c                                                               */\n/*                                                                         */\n/*    Generate feature registry data for gxv `feat' validator.             */\n/*    This program is derived from gxfeatreg.c in gxlayout.                */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006 by Masatake YAMATO and Redhat K.K.          */\n/*                                                                         */\n/*  This file may only be used,                                            */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/*  gxfeatreg.c                                                            */\n/*                                                                         */\n/*    Database of font features pre-defined by Apple Computer, Inc.        */\n/*    http://developer.apple.com/fonts/Registry/                           */\n/*    (body).                                                              */\n/*                                                                         */\n/*  Copyright 2003 by                                                      */\n/*  Masatake YAMATO and Redhat K.K.                                        */\n/*                                                                         */\n/*  This file may only be used,                                            */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* Development of gxfeatreg.c is supported by                              */\n/* Information-technology Promotion Agency, Japan.                         */\n/*                                                                         */\n/***************************************************************************/\n\n\n/***************************************************************************/\n/*                                                                         */\n/* This file is compiled as a stand-alone executable.                      */\n/* This file is never compiled into `libfreetype2'.                        */\n/* The output of this file is used in `gxvfeat.c'.                         */\n/* ----------------------------------------------------------------------- */\n/* Compile: gcc `pkg-config --cflags freetype2` gxvfgen.c -o gxvfgen       */\n/* Run: ./gxvfgen > tmp.c                                                  */\n/*                                                                         */\n/***************************************************************************/\n\n  /*******************************************************************/\n  /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */\n  /*******************************************************************/\n\n  /*\n   * If you add a new setting to a feature, check the number of settings\n   * in the feature.  If the number is greater than the value defined as\n   * FEATREG_MAX_SETTING, update the value.\n   */\n#define FEATREG_MAX_SETTING  12\n\n  /*******************************************************************/\n  /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */\n  /*******************************************************************/\n\n\n#include <stdio.h>\n#include <string.h>\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      Data and Types                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define APPLE_RESERVED         \"Apple Reserved\"\n#define APPLE_RESERVED_LENGTH  14\n\n  typedef struct  GX_Feature_RegistryRec_\n  {\n    const char*  feat_name;\n    char         exclusive;\n    char*        setting_name[FEATREG_MAX_SETTING];\n\n  } GX_Feature_RegistryRec;\n\n\n#define EMPTYFEAT {0, 0, {NULL}}\n\n\n  static GX_Feature_RegistryRec featreg_table[] = {\n    {                                       /* 0 */\n      \"All Typographic Features\",\n      0,\n      {\n        \"All Type Features\",\n        NULL\n      }\n    }, {                                    /* 1 */\n      \"Ligatures\",\n      0,\n      {\n        \"Required Ligatures\",\n        \"Common Ligatures\",\n        \"Rare Ligatures\",\n        \"Logos\",\n        \"Rebus Pictures\",\n        \"Diphthong Ligatures\",\n        \"Squared Ligatures\",\n        \"Squared Ligatures, Abbreviated\",\n        NULL\n      }\n    }, {                                    /* 2 */\n      \"Cursive Connection\",\n      1,\n      {\n        \"Unconnected\",\n        \"Partially Connected\",\n        \"Cursive\",\n        NULL\n      }\n    }, {                                    /* 3 */\n      \"Letter Case\",\n      1,\n      {\n        \"Upper & Lower Case\",\n        \"All Caps\",\n        \"All Lower Case\",\n        \"Small Caps\",\n        \"Initial Caps\",\n        \"Initial Caps & Small Caps\",\n        NULL\n      }\n    }, {                                    /* 4 */\n      \"Vertical Substitution\",\n      0,\n      {\n        /* \"Substitute Vertical Forms\", */\n        \"Turns on the feature\",\n        NULL\n      }\n    }, {                                    /* 5 */\n      \"Linguistic Rearrangement\",\n      0,\n      {\n        /* \"Linguistic Rearrangement\", */\n        \"Turns on the feature\",\n        NULL\n      }\n    }, {                                    /* 6 */\n      \"Number Spacing\",\n      1,\n      {\n        \"Monospaced Numbers\",\n        \"Proportional Numbers\",\n        NULL\n      }\n    }, {                                    /* 7 */\n      APPLE_RESERVED \" 1\",\n      0,\n      {NULL}\n    }, {                                    /* 8 */\n      \"Smart Swashes\",\n      0,\n      {\n        \"Word Initial Swashes\",\n        \"Word Final Swashes\",\n        \"Line Initial Swashes\",\n        \"Line Final Swashes\",\n        \"Non-Final Swashes\",\n        NULL\n      }\n    }, {                                    /* 9 */\n      \"Diacritics\",\n      1,\n      {\n        \"Show Diacritics\",\n        \"Hide Diacritics\",\n        \"Decompose Diacritics\",\n        NULL\n      }\n    }, {                                    /* 10 */\n      \"Vertical Position\",\n      1,\n      {\n        /* \"Normal Position\", */\n        \"No Vertical Position\",\n        \"Superiors\",\n        \"Inferiors\",\n        \"Ordinals\",\n        NULL\n      }\n    }, {                                    /* 11 */\n      \"Fractions\",\n      1,\n      {\n        \"No Fractions\",\n        \"Vertical Fractions\",\n        \"Diagonal Fractions\",\n        NULL\n      }\n    }, {                                    /* 12 */\n      APPLE_RESERVED \" 2\",\n      0,\n      {NULL}\n    }, {                                    /* 13 */\n      \"Overlapping Characters\",\n      0,\n      {\n        /* \"Prevent Overlap\", */\n        \"Turns on the feature\",\n        NULL\n      }\n    }, {                                    /* 14 */\n      \"Typographic Extras\",\n      0,\n      {\n        \"Hyphens to Em Dash\",\n        \"Hyphens to En Dash\",\n        \"Unslashed Zero\",\n        \"Form Interrobang\",\n        \"Smart Quotes\",\n        \"Periods to Ellipsis\",\n        NULL\n      }\n    }, {                                    /* 15 */\n      \"Mathematical Extras\",\n      0,\n      {\n        \"Hyphens to Minus\",\n        \"Asterisk to Multiply\",\n        \"Slash to Divide\",\n        \"Inequality Ligatures\",\n        \"Exponents\",\n        NULL\n      }\n    }, {                                    /* 16 */\n      \"Ornament Sets\",\n      1,\n      {\n        \"No Ornaments\",\n        \"Dingbats\",\n        \"Pi Characters\",\n        \"Fleurons\",\n        \"Decorative Borders\",\n        \"International Symbols\",\n        \"Math Symbols\",\n        NULL\n      }\n    }, {                                    /* 17 */\n      \"Character Alternatives\",\n      1,\n      {\n        \"No Alternates\",\n        /* TODO */\n        NULL\n      }\n    }, {                                    /* 18 */\n      \"Design Complexity\",\n      1,\n      {\n        \"Design Level 1\",\n        \"Design Level 2\",\n        \"Design Level 3\",\n        \"Design Level 4\",\n        \"Design Level 5\",\n        /* TODO */\n        NULL\n      }\n    }, {                                    /* 19 */\n      \"Style Options\",\n      1,\n      {\n        \"No Style Options\",\n        \"Display Text\",\n        \"Engraved Text\",\n        \"Illuminated Caps\",\n        \"Tilling Caps\",\n        \"Tall Caps\",\n        NULL\n      }\n    }, {                                    /* 20 */\n      \"Character Shape\",\n      1,\n      {\n        \"Traditional Characters\",\n        \"Simplified Characters\",\n        \"JIS 1978 Characters\",\n        \"JIS 1983 Characters\",\n        \"JIS 1990 Characters\",\n        \"Traditional Characters, Alternative Set 1\",\n        \"Traditional Characters, Alternative Set 2\",\n        \"Traditional Characters, Alternative Set 3\",\n        \"Traditional Characters, Alternative Set 4\",\n        \"Traditional Characters, Alternative Set 5\",\n        \"Expert Characters\",\n        NULL                           /* count => 12 */\n      }\n    }, {                                    /* 21 */\n      \"Number Case\",\n      1,\n      {\n        \"Lower Case Numbers\",\n        \"Upper Case Numbers\",\n        NULL\n      }\n    }, {                                    /* 22 */\n      \"Text Spacing\",\n      1,\n      {\n        \"Proportional\",\n        \"Monospaced\",\n        \"Half-width\",\n        \"Normal\",\n        NULL\n      }\n    }, /* Here after Newer */  { /* 23 */\n      \"Transliteration\",\n      1,\n      {\n        \"No Transliteration\",\n        \"Hanja To Hangul\",\n        \"Hiragana to Katakana\",\n        \"Katakana to Hiragana\",\n        \"Kana to Romanization\",\n        \"Romanization to Hiragana\",\n        \"Romanization to Katakana\",\n        \"Hanja to Hangul, Alternative Set 1\",\n        \"Hanja to Hangul, Alternative Set 2\",\n        \"Hanja to Hangul, Alternative Set 3\",\n        NULL\n      }\n    }, {                                    /* 24 */\n      \"Annotation\",\n      1,\n      {\n        \"No Annotation\",\n        \"Box Annotation\",\n        \"Rounded Box Annotation\",\n        \"Circle Annotation\",\n        \"Inverted Circle Annotation\",\n        \"Parenthesis Annotation\",\n        \"Period Annotation\",\n        \"Roman Numeral Annotation\",\n        \"Diamond Annotation\",\n        NULL\n      }\n    }, {                                    /* 25 */\n      \"Kana Spacing\",\n      1,\n      {\n        \"Full Width\",\n        \"Proportional\",\n        NULL\n      }\n    }, {                                    /* 26 */\n      \"Ideographic Spacing\",\n      1,\n      {\n        \"Full Width\",\n        \"Proportional\",\n        NULL\n      }\n    }, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT,         /* 27-30 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 31-35 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 36-40 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 40-45 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 46-50 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 51-55 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 56-60 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 61-65 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 66-70 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 71-75 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 76-80 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 81-85 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 86-90 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 91-95 */\n    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT,                       /* 96-98 */\n    EMPTYFEAT, /* 99 */ {                   /* 100 => 22 */\n      \"Text Spacing\",\n      1,\n      {\n        \"Proportional\",\n        \"Monospaced\",\n        \"Half-width\",\n        \"Normal\",\n        NULL\n      }\n    }, {                                    /* 101 => 25 */\n      \"Kana Spacing\",\n      1,\n      {\n        \"Full Width\",\n        \"Proportional\",\n        NULL\n      }\n    }, {                                    /* 102 => 26 */\n      \"Ideographic Spacing\",\n      1,\n      {\n        \"Full Width\",\n        \"Proportional\",\n        NULL\n      }\n    }, {                                    /* 103 */\n      \"CJK Roman Spacing\",\n      1,\n      {\n        \"Half-width\",\n        \"Proportional\",\n        \"Default Roman\",\n        \"Full-width Roman\",\n        NULL\n      }\n    }, {                                    /* 104 => 1 */\n      \"All Typographic Features\",\n      0,\n      {\n        \"All Type Features\",\n        NULL\n      }\n    }\n  };\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         Generator                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  int\n  main( void )\n  {\n    int  i;\n\n\n    printf( \"  {\\n\" );\n    printf( \"   /* Generated from %s */\\n\", __FILE__ );\n\n    for ( i = 0;\n          i < sizeof ( featreg_table ) / sizeof ( GX_Feature_RegistryRec );\n          i++ )\n    {\n      const char*  feat_name;\n      int          nSettings;\n\n\n      feat_name = featreg_table[i].feat_name;\n      for ( nSettings = 0;\n            featreg_table[i].setting_name[nSettings];\n            nSettings++)\n        ;                                   /* Do nothing */\n\n      printf( \"    {%1d, %1d, %1d, %2d},   /* %s */\\n\",\n              feat_name ? 1 : 0,\n              ( feat_name                                                  &&\n                ( ft_strncmp( feat_name,\n                              APPLE_RESERVED, APPLE_RESERVED_LENGTH ) == 0 )\n              ) ? 1 : 0,\n              featreg_table[i].exclusive ? 1 : 0,\n              nSettings,\n              feat_name ? feat_name : \"__EMPTY__\" );\n    }\n\n    printf( \"  };\\n\" );\n\n    return 0;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvjust.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvjust.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT just table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n#include FT_SFNT_NAMES_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvjust\n\n  /*\n   * referred `just' table format specification:\n   * http://developer.apple.com/fonts/TTRefMan/RM06/Chap6just.html\n   * last updated 2000.\n   * ----------------------------------------------\n   * [JUST HEADER]: GXV_JUST_HEADER_SIZE\n   * version     (fixed:  32bit) = 0x00010000\n   * format      (uint16: 16bit) = 0 is only defined (2000)\n   * horizOffset (uint16: 16bit)\n   * vertOffset  (uint16: 16bit)\n   * ----------------------------------------------\n   */\n\n  typedef struct  GXV_just_DataRec_\n  {\n    FT_UShort  wdc_offset_max;\n    FT_UShort  wdc_offset_min;\n    FT_UShort  pc_offset_max;\n    FT_UShort  pc_offset_min;\n\n  } GXV_just_DataRec, *GXV_just_Data;\n\n\n#define  GXV_JUST_DATA( a )  GXV_TABLE_DATA( just, a )\n\n\n  /* GX just table does not define their subset of GID */\n  static void\n  gxv_just_check_max_gid( FT_UShort         gid,\n                          const FT_String*  msg_tag,\n                          GXV_Validator     valid )\n  {\n    if ( gid < valid->face->num_glyphs )\n      return;\n\n    GXV_TRACE(( \"just table includes too large %s\"\n                \" GID=%d > %d (in maxp)\\n\",\n                msg_tag, gid, valid->face->num_glyphs ));\n    GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n  }\n\n\n  static void\n  gxv_just_wdp_entry_validate( FT_Bytes       table,\n                               FT_Bytes       limit,\n                               GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_ULong   justClass;\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_Fixed   beforeGrowLimit;\n    FT_Fixed   beforeShrinkGrowLimit;\n    FT_Fixed   afterGrowLimit;\n    FT_Fixed   afterShrinkGrowLimit;\n    FT_UShort  growFlags;\n    FT_UShort  shrinkFlags;\n#endif\n\n\n    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 + 4 + 2 + 2 );\n    justClass             = FT_NEXT_ULONG( p );\n#ifndef GXV_LOAD_UNUSED_VARS\n    p += 4 + 4 + 4 + 4 + 2 + 2;\n#else\n    beforeGrowLimit       = FT_NEXT_ULONG( p );\n    beforeShrinkGrowLimit = FT_NEXT_ULONG( p );\n    afterGrowLimit        = FT_NEXT_ULONG( p );\n    afterShrinkGrowLimit  = FT_NEXT_ULONG( p );\n    growFlags             = FT_NEXT_USHORT( p );\n    shrinkFlags           = FT_NEXT_USHORT( p );\n#endif\n\n    /* According to Apple spec, only 7bits in justClass is used */\n    if ( ( justClass & 0xFFFFFF80 ) != 0 )\n    {\n      GXV_TRACE(( \"just table includes non-zero value\"\n                  \" in unused justClass higher bits\"\n                  \" of WidthDeltaPair\" ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n\n    valid->subtable_length = p - table;\n  }\n\n\n  static void\n  gxv_just_wdc_entry_validate( FT_Bytes       table,\n                               FT_Bytes       limit,\n                               GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_ULong  count, i;\n\n\n    GXV_LIMIT_CHECK( 4 );\n    count = FT_NEXT_ULONG( p );\n    for ( i = 0; i < count; i++ )\n    {\n      GXV_TRACE(( \"validating wdc pair %d/%d\\n\", i + 1, count ));\n      gxv_just_wdp_entry_validate( p, limit, valid );\n      p += valid->subtable_length;\n    }\n\n    valid->subtable_length = p - table;\n  }\n\n\n  static void\n  gxv_just_widthDeltaClusters_validate( FT_Bytes       table,\n                                        FT_Bytes       limit,\n                                        GXV_Validator  valid )\n  {\n    FT_Bytes  p         = table ;\n    FT_Bytes  wdc_end   = table + GXV_JUST_DATA( wdc_offset_max );\n    FT_UInt   i;\n\n\n    GXV_NAME_ENTER( \"just justDeltaClusters\" );\n\n    if ( limit <= wdc_end )\n      FT_INVALID_OFFSET;\n\n    for ( i = 0; p <= wdc_end; i++ )\n    {\n      gxv_just_wdc_entry_validate( p, limit, valid );\n      p += valid->subtable_length;\n    }\n\n    valid->subtable_length = p - table;\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_just_actSubrecord_type0_validate( FT_Bytes       table,\n                                        FT_Bytes       limit,\n                                        GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n\n    FT_Fixed   lowerLimit;\n    FT_Fixed   upperLimit;\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_UShort  order;\n#endif\n    FT_UShort  decomposedCount;\n\n    FT_UInt    i;\n\n\n    GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 );\n    lowerLimit      = FT_NEXT_ULONG( p );\n    upperLimit      = FT_NEXT_ULONG( p );\n#ifdef GXV_LOAD_UNUSED_VARS\n    order           = FT_NEXT_USHORT( p );\n#else\n    p += 2;\n#endif\n    decomposedCount = FT_NEXT_USHORT( p );\n\n    if ( lowerLimit >= upperLimit )\n    {\n      GXV_TRACE(( \"just table includes invalid range spec:\"\n                  \" lowerLimit(%d) > upperLimit(%d)\\n\"     ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n\n    for ( i = 0; i < decomposedCount; i++ )\n    {\n      FT_UShort glyphs;\n\n\n      GXV_LIMIT_CHECK( 2 );\n      glyphs = FT_NEXT_USHORT( p );\n      gxv_just_check_max_gid( glyphs, \"type0:glyphs\", valid );\n    }\n\n    valid->subtable_length = p - table;\n  }\n\n\n  static void\n  gxv_just_actSubrecord_type1_validate( FT_Bytes       table,\n                                        FT_Bytes       limit,\n                                        GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  addGlyph;\n\n\n    GXV_LIMIT_CHECK( 2 );\n    addGlyph = FT_NEXT_USHORT( p );\n\n    gxv_just_check_max_gid( addGlyph, \"type1:addGlyph\", valid );\n\n    valid->subtable_length = p - table;\n  }\n\n\n  static void\n  gxv_just_actSubrecord_type2_validate( FT_Bytes       table,\n                                        FT_Bytes       limit,\n                                        GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_Fixed   substThreshhold; /* Apple misspelled \"Threshhold\" */\n#endif\n    FT_UShort  addGlyph;\n    FT_UShort  substGlyph;\n\n\n    GXV_LIMIT_CHECK( 4 + 2 + 2 );\n#ifdef GXV_LOAD_UNUSED_VARS\n    substThreshhold = FT_NEXT_ULONG( p );\n#else\n    p += 4;\n#endif\n    addGlyph        = FT_NEXT_USHORT( p );\n    substGlyph      = FT_NEXT_USHORT( p );\n\n    if ( addGlyph != 0xFFFF )\n      gxv_just_check_max_gid( addGlyph, \"type2:addGlyph\", valid );\n\n    gxv_just_check_max_gid( substGlyph, \"type2:substGlyph\", valid );\n\n    valid->subtable_length = p - table;\n  }\n\n\n  static void\n  gxv_just_actSubrecord_type4_validate( FT_Bytes       table,\n                                        FT_Bytes       limit,\n                                        GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_ULong  variantsAxis;\n    FT_Fixed  minimumLimit;\n    FT_Fixed  noStretchValue;\n    FT_Fixed  maximumLimit;\n\n\n    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );\n    variantsAxis   = FT_NEXT_ULONG( p );\n    minimumLimit   = FT_NEXT_ULONG( p );\n    noStretchValue = FT_NEXT_ULONG( p );\n    maximumLimit   = FT_NEXT_ULONG( p );\n\n    valid->subtable_length = p - table;\n\n    if ( variantsAxis != 0x64756374 ) /* 'duct' */\n      GXV_TRACE(( \"variantsAxis 0x%08x is non default value\",\n                   variantsAxis ));\n\n    if ( minimumLimit > noStretchValue )\n      GXV_TRACE(( \"type4:minimumLimit 0x%08x > noStretchValue 0x%08x\\n\",\n                  minimumLimit, noStretchValue ));\n    else if ( noStretchValue > maximumLimit )\n      GXV_TRACE(( \"type4:noStretchValue 0x%08x > maximumLimit 0x%08x\\n\",\n                  noStretchValue, maximumLimit ));\n    else if ( !IS_PARANOID_VALIDATION )\n      return;\n\n    FT_INVALID_DATA;\n  }\n\n\n  static void\n  gxv_just_actSubrecord_type5_validate( FT_Bytes       table,\n                                        FT_Bytes       limit,\n                                        GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  flags;\n    FT_UShort  glyph;\n\n\n    GXV_LIMIT_CHECK( 2 + 2 );\n    flags = FT_NEXT_USHORT( p );\n    glyph = FT_NEXT_USHORT( p );\n\n    if ( flags )\n      GXV_TRACE(( \"type5: nonzero value 0x%04x in unused flags\\n\",\n                   flags ));\n    gxv_just_check_max_gid( glyph, \"type5:glyph\", valid );\n\n    valid->subtable_length = p - table;\n  }\n\n\n  /* parse single actSubrecord */\n  static void\n  gxv_just_actSubrecord_validate( FT_Bytes       table,\n                                  FT_Bytes       limit,\n                                  GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  actionClass;\n    FT_UShort  actionType;\n    FT_ULong   actionLength;\n\n\n    GXV_NAME_ENTER( \"just actSubrecord\" );\n\n    GXV_LIMIT_CHECK( 2 + 2 + 4 );\n    actionClass  = FT_NEXT_USHORT( p );\n    actionType   = FT_NEXT_USHORT( p );\n    actionLength = FT_NEXT_ULONG( p );\n\n    /* actionClass is related with justClass using 7bit only */\n    if ( ( actionClass & 0xFF80 ) != 0 )\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n\n    if ( actionType == 0 )\n      gxv_just_actSubrecord_type0_validate( p, limit, valid );\n    else if ( actionType == 1 )\n      gxv_just_actSubrecord_type1_validate( p, limit, valid );\n    else if ( actionType == 2 )\n      gxv_just_actSubrecord_type2_validate( p, limit, valid );\n    else if ( actionType == 3 )\n      ;                         /* Stretch glyph action: no actionData */\n    else if ( actionType == 4 )\n      gxv_just_actSubrecord_type4_validate( p, limit, valid );\n    else if ( actionType == 5 )\n      gxv_just_actSubrecord_type5_validate( p, limit, valid );\n    else\n      FT_INVALID_DATA;\n\n    valid->subtable_length = actionLength;\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_just_pcActionRecord_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_ULong  actionCount;\n    FT_ULong  i;\n\n\n    GXV_LIMIT_CHECK( 4 );\n    actionCount = FT_NEXT_ULONG( p );\n    GXV_TRACE(( \"actionCount = %d\\n\", actionCount ));\n\n    for ( i = 0; i < actionCount; i++ )\n    {\n      gxv_just_actSubrecord_validate( p, limit, valid );\n      p += valid->subtable_length;\n    }\n\n    valid->subtable_length = p - table;\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_just_pcTable_LookupValue_entry_validate( FT_UShort            glyph,\n                                               GXV_LookupValueCPtr  value_p,\n                                               GXV_Validator        valid )\n  {\n    FT_UNUSED( glyph );\n\n    if ( value_p->u > GXV_JUST_DATA( pc_offset_max ) )\n      GXV_JUST_DATA( pc_offset_max ) = value_p->u;\n    if ( value_p->u < GXV_JUST_DATA( pc_offset_max ) )\n      GXV_JUST_DATA( pc_offset_min ) = value_p->u;\n  }\n\n\n  static void\n  gxv_just_pcLookupTable_validate( FT_Bytes       table,\n                                   FT_Bytes       limit,\n                                   GXV_Validator  valid )\n  {\n    FT_Bytes p = table;\n\n\n    GXV_NAME_ENTER( \"just pcLookupTable\" );\n    GXV_JUST_DATA( pc_offset_max ) = 0x0000;\n    GXV_JUST_DATA( pc_offset_min ) = 0xFFFFU;\n\n    valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;\n    valid->lookupval_func = gxv_just_pcTable_LookupValue_entry_validate;\n\n    gxv_LookupTable_validate( p, limit, valid );\n\n    /* subtable_length is set by gxv_LookupTable_validate() */\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_just_postcompTable_validate( FT_Bytes       table,\n                                   FT_Bytes       limit,\n                                   GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n\n    GXV_NAME_ENTER( \"just postcompTable\" );\n\n    gxv_just_pcLookupTable_validate( p, limit, valid );\n    p += valid->subtable_length;\n\n    gxv_just_pcActionRecord_validate( p, limit, valid );\n    p += valid->subtable_length;\n\n    valid->subtable_length = p - table;\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_just_classTable_entry_validate(\n    FT_Byte                         state,\n    FT_UShort                       flags,\n    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n    FT_Bytes                        table,\n    FT_Bytes                        limit,\n    GXV_Validator                   valid )\n  {\n#ifdef GXV_LOAD_UNUSED_VARS\n    /* TODO: validate markClass & currentClass */\n    FT_UShort  setMark;\n    FT_UShort  dontAdvance;\n    FT_UShort  markClass;\n    FT_UShort  currentClass;\n#endif\n\n    FT_UNUSED( state );\n    FT_UNUSED( glyphOffset_p );\n    FT_UNUSED( table );\n    FT_UNUSED( limit );\n    FT_UNUSED( valid );\n\n#ifndef GXV_LOAD_UNUSED_VARS\n    FT_UNUSED( flags );\n#else\n    setMark      = (FT_UShort)( ( flags >> 15 ) & 1    );\n    dontAdvance  = (FT_UShort)( ( flags >> 14 ) & 1    );\n    markClass    = (FT_UShort)( ( flags >> 7  ) & 0x7F );\n    currentClass = (FT_UShort)(   flags         & 0x7F );\n#endif\n  }\n\n\n  static void\n  gxv_just_justClassTable_validate ( FT_Bytes       table,\n                                     FT_Bytes       limit,\n                                     GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  length;\n    FT_UShort  coverage;\n    FT_ULong   subFeatureFlags;\n\n\n    GXV_NAME_ENTER( \"just justClassTable\" );\n\n    GXV_LIMIT_CHECK( 2 + 2 + 4 );\n    length          = FT_NEXT_USHORT( p );\n    coverage        = FT_NEXT_USHORT( p );\n    subFeatureFlags = FT_NEXT_ULONG( p );\n\n    GXV_TRACE(( \"  justClassTable: coverage = 0x%04x (%s) \", coverage ));\n    if ( ( coverage & 0x4000 ) == 0  )\n      GXV_TRACE(( \"ascending\\n\" ));\n    else\n      GXV_TRACE(( \"descending\\n\" ));\n\n    if ( subFeatureFlags )\n      GXV_TRACE(( \"  justClassTable: nonzero value (0x%08x)\"\n                  \" in unused subFeatureFlags\\n\", subFeatureFlags ));\n\n    valid->statetable.optdata               = NULL;\n    valid->statetable.optdata_load_func     = NULL;\n    valid->statetable.subtable_setup_func   = NULL;\n    valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;\n    valid->statetable.entry_validate_func   =\n      gxv_just_classTable_entry_validate;\n\n    gxv_StateTable_validate( p, table + length, valid );\n\n    /* subtable_length is set by gxv_LookupTable_validate() */\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_just_wdcTable_LookupValue_validate( FT_UShort            glyph,\n                                          GXV_LookupValueCPtr  value_p,\n                                          GXV_Validator        valid )\n  {\n    FT_UNUSED( glyph );\n\n    if ( value_p->u > GXV_JUST_DATA( wdc_offset_max ) )\n      GXV_JUST_DATA( wdc_offset_max ) = value_p->u;\n    if ( value_p->u < GXV_JUST_DATA( wdc_offset_min ) )\n      GXV_JUST_DATA( wdc_offset_min ) = value_p->u;\n  }\n\n\n  static void\n  gxv_just_justData_lookuptable_validate( FT_Bytes       table,\n                                          FT_Bytes       limit,\n                                          GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n\n    GXV_JUST_DATA( wdc_offset_max ) = 0x0000;\n    GXV_JUST_DATA( wdc_offset_min ) = 0xFFFFU;\n\n    valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;\n    valid->lookupval_func = gxv_just_wdcTable_LookupValue_validate;\n\n    gxv_LookupTable_validate( p, limit, valid );\n\n    /* subtable_length is set by gxv_LookupTable_validate() */\n\n    GXV_EXIT;\n  }\n\n\n  /*\n   * gxv_just_justData_validate() parses and validates horizData, vertData.\n   */\n  static void\n  gxv_just_justData_validate( FT_Bytes       table,\n                              FT_Bytes       limit,\n                              GXV_Validator  valid )\n  {\n    /*\n     * following 3 offsets are measured from the start of `just'\n     * (which table points to), not justData\n     */\n    FT_UShort  justClassTableOffset;\n    FT_UShort  wdcTableOffset;\n    FT_UShort  pcTableOffset;\n    FT_Bytes   p = table;\n\n    GXV_ODTECT( 4, odtect );\n\n\n    GXV_NAME_ENTER( \"just justData\" );\n\n    GXV_ODTECT_INIT( odtect );\n    GXV_LIMIT_CHECK( 2 + 2 + 2 );\n    justClassTableOffset = FT_NEXT_USHORT( p );\n    wdcTableOffset       = FT_NEXT_USHORT( p );\n    pcTableOffset        = FT_NEXT_USHORT( p );\n\n    GXV_TRACE(( \" (justClassTableOffset = 0x%04x)\\n\", justClassTableOffset ));\n    GXV_TRACE(( \" (wdcTableOffset = 0x%04x)\\n\", wdcTableOffset ));\n    GXV_TRACE(( \" (pcTableOffset = 0x%04x)\\n\", pcTableOffset ));\n\n    gxv_just_justData_lookuptable_validate( p, limit, valid );\n    gxv_odtect_add_range( p, valid->subtable_length,\n                          \"just_LookupTable\", odtect );\n\n    if ( wdcTableOffset )\n    {\n      gxv_just_widthDeltaClusters_validate(\n        valid->root->base + wdcTableOffset, limit, valid );\n      gxv_odtect_add_range( valid->root->base + wdcTableOffset,\n                            valid->subtable_length, \"just_wdcTable\", odtect );\n    }\n\n    if ( pcTableOffset )\n    {\n      gxv_just_postcompTable_validate( valid->root->base + pcTableOffset,\n                                       limit, valid );\n      gxv_odtect_add_range( valid->root->base + pcTableOffset,\n                            valid->subtable_length, \"just_pcTable\", odtect );\n    }\n\n    if ( justClassTableOffset )\n    {\n      gxv_just_justClassTable_validate(\n        valid->root->base + justClassTableOffset, limit, valid );\n      gxv_odtect_add_range( valid->root->base + justClassTableOffset,\n                            valid->subtable_length, \"just_justClassTable\",\n                            odtect );\n    }\n\n    gxv_odtect_validate( odtect, valid );\n\n    GXV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_just_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    FT_Bytes           p     = table;\n    FT_Bytes           limit = 0;\n\n    GXV_ValidatorRec   validrec;\n    GXV_Validator      valid = &validrec;\n    GXV_just_DataRec   justrec;\n    GXV_just_Data      just = &justrec;\n\n    FT_ULong           version;\n    FT_UShort          format;\n    FT_UShort          horizOffset;\n    FT_UShort          vertOffset;\n\n    GXV_ODTECT( 3, odtect );\n\n\n    GXV_ODTECT_INIT( odtect );\n\n    valid->root       = ftvalid;\n    valid->table_data = just;\n    valid->face       = face;\n\n    FT_TRACE3(( \"validating `just' table\\n\" ));\n    GXV_INIT;\n\n    limit      = valid->root->limit;\n\n    GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 );\n    version     = FT_NEXT_ULONG( p );\n    format      = FT_NEXT_USHORT( p );\n    horizOffset = FT_NEXT_USHORT( p );\n    vertOffset  = FT_NEXT_USHORT( p );\n    gxv_odtect_add_range( table, p - table, \"just header\", odtect );\n\n\n    /* Version 1.0 (always:2000) */\n    GXV_TRACE(( \" (version = 0x%08x)\\n\", version ));\n    if ( version != 0x00010000UL )\n      FT_INVALID_FORMAT;\n\n    /* format 0 (always:2000) */\n    GXV_TRACE(( \" (format = 0x%04x)\\n\", format ));\n    if ( format != 0x0000 )\n        FT_INVALID_FORMAT;\n\n    GXV_TRACE(( \" (horizOffset = %d)\\n\", horizOffset  ));\n    GXV_TRACE(( \" (vertOffset = %d)\\n\", vertOffset  ));\n\n\n    /* validate justData */\n    if ( 0 < horizOffset )\n    {\n      gxv_just_justData_validate( table + horizOffset, limit, valid );\n      gxv_odtect_add_range( table + horizOffset, valid->subtable_length,\n                            \"horizJustData\", odtect );\n    }\n\n    if ( 0 < vertOffset )\n    {\n      gxv_just_justData_validate( table + vertOffset, limit, valid );\n      gxv_odtect_add_range( table + vertOffset, valid->subtable_length,\n                            \"vertJustData\", odtect );\n    }\n\n    gxv_odtect_validate( odtect, valid );\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvkern.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvkern.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT kern table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006, 2007                                       */\n/*  by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n#include FT_SFNT_NAMES_H\n#include FT_SERVICE_GX_VALIDATE_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvkern\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      Data and Types                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef enum  GXV_kern_Version_\n  {\n    KERN_VERSION_CLASSIC = 0x0000,\n    KERN_VERSION_NEW     = 0x0001\n\n  } GXV_kern_Version;\n\n\n  typedef enum GXV_kern_Dialect_\n  {\n    KERN_DIALECT_UNKNOWN = 0,\n    KERN_DIALECT_MS      = FT_VALIDATE_MS,\n    KERN_DIALECT_APPLE   = FT_VALIDATE_APPLE,\n    KERN_DIALECT_ANY     = FT_VALIDATE_CKERN\n\n  } GXV_kern_Dialect;\n\n\n  typedef struct  GXV_kern_DataRec_\n  {\n    GXV_kern_Version  version;\n    void             *subtable_data;\n    GXV_kern_Dialect  dialect_request;\n\n  } GXV_kern_DataRec, *GXV_kern_Data;\n\n\n#define GXV_KERN_DATA( field )  GXV_TABLE_DATA( kern, field )\n\n#define KERN_IS_CLASSIC( valid )                               \\\n          ( KERN_VERSION_CLASSIC == GXV_KERN_DATA( version ) )\n#define KERN_IS_NEW( valid )                                   \\\n          ( KERN_VERSION_NEW     == GXV_KERN_DATA( version ) )\n\n#define KERN_DIALECT( valid )              \\\n          GXV_KERN_DATA( dialect_request )\n#define KERN_ALLOWS_MS( valid )                       \\\n          ( KERN_DIALECT( valid ) & KERN_DIALECT_MS )\n#define KERN_ALLOWS_APPLE( valid )                       \\\n          ( KERN_DIALECT( valid ) & KERN_DIALECT_APPLE )\n\n#define GXV_KERN_HEADER_SIZE           ( KERN_IS_NEW( valid ) ? 8 : 4 )\n#define GXV_KERN_SUBTABLE_HEADER_SIZE  ( KERN_IS_NEW( valid ) ? 8 : 6 )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      SUBTABLE VALIDATORS                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* ============================= format 0 ============================== */\n\n  static void\n  gxv_kern_subtable_fmt0_pairs_validate( FT_Bytes       table,\n                                         FT_Bytes       limit,\n                                         FT_UShort      nPairs,\n                                         GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  i;\n\n    FT_UShort  last_gid_left  = 0;\n    FT_UShort  last_gid_right = 0;\n\n    FT_UNUSED( limit );\n\n\n    GXV_NAME_ENTER( \"kern format 0 pairs\" );\n\n    for ( i = 0; i < nPairs; i++ )\n    {\n      FT_UShort  gid_left;\n      FT_UShort  gid_right;\n#ifdef GXV_LOAD_UNUSED_VARS\n      FT_Short   kernValue;\n#endif\n\n\n      /* left */\n      gid_left  = FT_NEXT_USHORT( p );\n      gxv_glyphid_validate( gid_left, valid );\n\n      /* right */\n      gid_right = FT_NEXT_USHORT( p );\n      gxv_glyphid_validate( gid_right, valid );\n\n      /* Pairs of left and right GIDs must be unique and sorted. */\n      GXV_TRACE(( \"left gid = %u, right gid = %u\\n\", gid_left, gid_right ));\n      if ( gid_left == last_gid_left )\n      {\n        if ( last_gid_right < gid_right )\n          last_gid_right = gid_right;\n        else\n          FT_INVALID_DATA;\n      }\n      else if ( last_gid_left < gid_left )\n      {\n        last_gid_left  = gid_left;\n        last_gid_right = gid_right;\n      }\n      else\n        FT_INVALID_DATA;\n\n      /* skip the kern value */\n#ifdef GXV_LOAD_UNUSED_VARS\n      kernValue = FT_NEXT_SHORT( p );\n#else\n      p += 2;\n#endif\n    }\n\n    GXV_EXIT;\n  }\n\n  static void\n  gxv_kern_subtable_fmt0_validate( FT_Bytes       table,\n                                   FT_Bytes       limit,\n                                   GXV_Validator  valid )\n  {\n    FT_Bytes   p = table + GXV_KERN_SUBTABLE_HEADER_SIZE;\n\n    FT_UShort  nPairs;\n    FT_UShort  unitSize;\n\n\n    GXV_NAME_ENTER( \"kern subtable format 0\" );\n\n    unitSize = 2 + 2 + 2;\n    nPairs   = 0;\n\n    /* nPairs, searchRange, entrySelector, rangeShift */\n    GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 );\n    gxv_BinSrchHeader_validate( p, limit, &unitSize, &nPairs, valid );\n    p += 2 + 2 + 2 + 2;\n\n    gxv_kern_subtable_fmt0_pairs_validate( p, limit, nPairs, valid );\n\n    GXV_EXIT;\n  }\n\n\n  /* ============================= format 1 ============================== */\n\n\n  typedef struct  GXV_kern_fmt1_StateOptRec_\n  {\n    FT_UShort  valueTable;\n    FT_UShort  valueTable_length;\n\n  } GXV_kern_fmt1_StateOptRec, *GXV_kern_fmt1_StateOptRecData;\n\n\n  static void\n  gxv_kern_subtable_fmt1_valueTable_load( FT_Bytes       table,\n                                          FT_Bytes       limit,\n                                          GXV_Validator  valid )\n  {\n    FT_Bytes                       p = table;\n    GXV_kern_fmt1_StateOptRecData  optdata =\n      (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata;\n\n\n    GXV_LIMIT_CHECK( 2 );\n    optdata->valueTable = FT_NEXT_USHORT( p );\n  }\n\n\n  /*\n   * passed tables_size covers whole StateTable, including kern fmt1 header\n   */\n  static void\n  gxv_kern_subtable_fmt1_subtable_setup( FT_UShort      table_size,\n                                         FT_UShort      classTable,\n                                         FT_UShort      stateArray,\n                                         FT_UShort      entryTable,\n                                         FT_UShort*     classTable_length_p,\n                                         FT_UShort*     stateArray_length_p,\n                                         FT_UShort*     entryTable_length_p,\n                                         GXV_Validator  valid )\n  {\n    FT_UShort  o[4];\n    FT_UShort  *l[4];\n    FT_UShort  buff[5];\n\n    GXV_kern_fmt1_StateOptRecData  optdata =\n      (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata;\n\n\n    o[0] = classTable;\n    o[1] = stateArray;\n    o[2] = entryTable;\n    o[3] = optdata->valueTable;\n    l[0] = classTable_length_p;\n    l[1] = stateArray_length_p;\n    l[2] = entryTable_length_p;\n    l[3] = &(optdata->valueTable_length);\n\n    gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid );\n  }\n\n\n  /*\n   * passed table & limit are of whole StateTable, not including subtables\n   */\n  static void\n  gxv_kern_subtable_fmt1_entry_validate(\n    FT_Byte                         state,\n    FT_UShort                       flags,\n    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n    FT_Bytes                        table,\n    FT_Bytes                        limit,\n    GXV_Validator                   valid )\n  {\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_UShort  push;\n    FT_UShort  dontAdvance;\n#endif\n    FT_UShort  valueOffset;\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_UShort  kernAction;\n    FT_UShort  kernValue;\n#endif\n\n    FT_UNUSED( state );\n    FT_UNUSED( glyphOffset_p );\n\n\n#ifdef GXV_LOAD_UNUSED_VARS\n    push        = (FT_UShort)( ( flags >> 15 ) & 1      );\n    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1      );\n#endif\n    valueOffset = (FT_UShort)(   flags         & 0x3FFF );\n\n    {\n      GXV_kern_fmt1_StateOptRecData  vt_rec =\n        (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata;\n      FT_Bytes  p;\n\n\n      if ( valueOffset < vt_rec->valueTable )\n        FT_INVALID_OFFSET;\n\n      p     = table + valueOffset;\n      limit = table + vt_rec->valueTable + vt_rec->valueTable_length;\n\n      GXV_LIMIT_CHECK( 2 + 2 );\n#ifdef GXV_LOAD_UNUSED_VARS\n      kernAction = FT_NEXT_USHORT( p );\n      kernValue  = FT_NEXT_USHORT( p );\n#else\n      p += 4;\n#endif\n    }\n  }\n\n\n  static void\n  gxv_kern_subtable_fmt1_validate( FT_Bytes       table,\n                                   FT_Bytes       limit,\n                                   GXV_Validator  valid )\n  {\n    FT_Bytes                   p = table;\n    GXV_kern_fmt1_StateOptRec  vt_rec;\n\n\n    GXV_NAME_ENTER( \"kern subtable format 1\" );\n\n    valid->statetable.optdata =\n      &vt_rec;\n    valid->statetable.optdata_load_func =\n      gxv_kern_subtable_fmt1_valueTable_load;\n    valid->statetable.subtable_setup_func =\n      gxv_kern_subtable_fmt1_subtable_setup;\n    valid->statetable.entry_glyphoffset_fmt =\n      GXV_GLYPHOFFSET_NONE;\n    valid->statetable.entry_validate_func =\n      gxv_kern_subtable_fmt1_entry_validate;\n\n    gxv_StateTable_validate( p, limit, valid );\n\n    GXV_EXIT;\n  }\n\n\n  /* ================ Data for Class-Based Subtables 2, 3 ================ */\n\n  typedef enum  GXV_kern_ClassSpec_\n  {\n    GXV_KERN_CLS_L = 0,\n    GXV_KERN_CLS_R\n\n  } GXV_kern_ClassSpec;\n\n\n  /* ============================= format 2 ============================== */\n\n  /* ---------------------- format 2 specific data ----------------------- */\n\n  typedef struct  GXV_kern_subtable_fmt2_DataRec_\n  {\n    FT_UShort         rowWidth;\n    FT_UShort         array;\n    FT_UShort         offset_min[2];\n    FT_UShort         offset_max[2];\n    const FT_String*  class_tag[2];\n    GXV_odtect_Range  odtect;\n\n  } GXV_kern_subtable_fmt2_DataRec, *GXV_kern_subtable_fmt2_Data;\n\n\n#define GXV_KERN_FMT2_DATA( field )                         \\\n        ( ( (GXV_kern_subtable_fmt2_DataRec *)              \\\n              ( GXV_KERN_DATA( subtable_data ) ) )->field )\n\n\n  /* -------------------------- utility functions ----------------------- */\n\n  static void\n  gxv_kern_subtable_fmt2_clstbl_validate( FT_Bytes            table,\n                                          FT_Bytes            limit,\n                                          GXV_kern_ClassSpec  spec,\n                                          GXV_Validator       valid )\n  {\n    const FT_String*  tag    = GXV_KERN_FMT2_DATA( class_tag[spec] );\n    GXV_odtect_Range  odtect = GXV_KERN_FMT2_DATA( odtect );\n\n    FT_Bytes   p = table;\n    FT_UShort  firstGlyph;\n    FT_UShort  nGlyphs;\n\n\n    GXV_NAME_ENTER( \"kern format 2 classTable\" );\n\n    GXV_LIMIT_CHECK( 2 + 2 );\n    firstGlyph = FT_NEXT_USHORT( p );\n    nGlyphs    = FT_NEXT_USHORT( p );\n    GXV_TRACE(( \" %s firstGlyph=%d, nGlyphs=%d\\n\",\n                tag, firstGlyph, nGlyphs ));\n\n    gxv_glyphid_validate( firstGlyph, valid );\n    gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), valid );\n\n    gxv_array_getlimits_ushort( p, p + ( 2 * nGlyphs ),\n                                &( GXV_KERN_FMT2_DATA( offset_min[spec] ) ),\n                                &( GXV_KERN_FMT2_DATA( offset_max[spec] ) ),\n                                valid );\n\n    gxv_odtect_add_range( table, 2 * nGlyphs, tag, odtect );\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_kern_subtable_fmt2_validate( FT_Bytes       table,\n                                   FT_Bytes       limit,\n                                   GXV_Validator  valid )\n  {\n    GXV_ODTECT( 3, odtect );\n    GXV_kern_subtable_fmt2_DataRec  fmt2_rec =\n      { 0, 0, { 0, 0 }, { 0, 0 }, { \"leftClass\", \"rightClass\" }, NULL };\n\n    FT_Bytes   p = table + GXV_KERN_SUBTABLE_HEADER_SIZE;\n    FT_UShort  leftOffsetTable;\n    FT_UShort  rightOffsetTable;\n\n\n    GXV_NAME_ENTER( \"kern subtable format 2\" );\n\n    GXV_ODTECT_INIT( odtect );\n    fmt2_rec.odtect = odtect;\n    GXV_KERN_DATA( subtable_data ) = &fmt2_rec;\n\n    GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 );\n    GXV_KERN_FMT2_DATA( rowWidth ) = FT_NEXT_USHORT( p );\n    leftOffsetTable                = FT_NEXT_USHORT( p );\n    rightOffsetTable               = FT_NEXT_USHORT( p );\n    GXV_KERN_FMT2_DATA( array )    = FT_NEXT_USHORT( p );\n\n    GXV_TRACE(( \"rowWidth = %d\\n\", GXV_KERN_FMT2_DATA( rowWidth ) ));\n\n\n    GXV_LIMIT_CHECK( leftOffsetTable );\n    GXV_LIMIT_CHECK( rightOffsetTable );\n    GXV_LIMIT_CHECK( GXV_KERN_FMT2_DATA( array ) );\n\n    gxv_kern_subtable_fmt2_clstbl_validate( table + leftOffsetTable, limit,\n                                            GXV_KERN_CLS_L, valid );\n\n    gxv_kern_subtable_fmt2_clstbl_validate( table + rightOffsetTable, limit,\n                                            GXV_KERN_CLS_R, valid );\n\n    if ( GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_L] ) +\n           GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_R] )\n         < GXV_KERN_FMT2_DATA( array )                      )\n      FT_INVALID_OFFSET;\n\n    gxv_odtect_add_range( table + GXV_KERN_FMT2_DATA( array ),\n                          GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_L] )\n                            + GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_R] )\n                            - GXV_KERN_FMT2_DATA( array ),\n                          \"array\", odtect );\n\n    gxv_odtect_validate( odtect, valid );\n\n    GXV_EXIT;\n  }\n\n\n  /* ============================= format 3 ============================== */\n\n  static void\n  gxv_kern_subtable_fmt3_validate( FT_Bytes       table,\n                                   FT_Bytes       limit,\n                                   GXV_Validator  valid )\n  {\n    FT_Bytes   p = table + GXV_KERN_SUBTABLE_HEADER_SIZE;\n    FT_UShort  glyphCount;\n    FT_Byte    kernValueCount;\n    FT_Byte    leftClassCount;\n    FT_Byte    rightClassCount;\n    FT_Byte    flags;\n\n\n    GXV_NAME_ENTER( \"kern subtable format 3\" );\n\n    GXV_LIMIT_CHECK( 2 + 1 + 1 + 1 + 1 );\n    glyphCount      = FT_NEXT_USHORT( p );\n    kernValueCount  = FT_NEXT_BYTE( p );\n    leftClassCount  = FT_NEXT_BYTE( p );\n    rightClassCount = FT_NEXT_BYTE( p );\n    flags           = FT_NEXT_BYTE( p );\n\n    if ( valid->face->num_glyphs != glyphCount )\n    {\n      GXV_TRACE(( \"maxGID=%d, but glyphCount=%d\\n\",\n                  valid->face->num_glyphs, glyphCount ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n    }\n\n    if ( flags != 0 )\n      GXV_TRACE(( \"kern subtable fmt3 has nonzero value\"\n                  \" (%d) in unused flag\\n\", flags ));\n    /*\n     * just skip kernValue[kernValueCount]\n     */\n    GXV_LIMIT_CHECK( 2 * kernValueCount );\n    p += 2 * kernValueCount;\n\n    /*\n     * check leftClass[gid] < leftClassCount\n     */\n    {\n      FT_Byte  min, max;\n\n\n      GXV_LIMIT_CHECK( glyphCount );\n      gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid );\n      p += valid->subtable_length;\n\n      if ( leftClassCount < max )\n        FT_INVALID_DATA;\n    }\n\n    /*\n     * check rightClass[gid] < rightClassCount\n     */\n    {\n      FT_Byte  min, max;\n\n\n      GXV_LIMIT_CHECK( glyphCount );\n      gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid );\n      p += valid->subtable_length;\n\n      if ( rightClassCount < max )\n        FT_INVALID_DATA;\n    }\n\n    /*\n     * check kernIndex[i, j] < kernValueCount\n     */\n    {\n      FT_UShort  i, j;\n\n\n      for ( i = 0; i < leftClassCount; i++ )\n      {\n        for ( j = 0; j < rightClassCount; j++ )\n        {\n          GXV_LIMIT_CHECK( 1 );\n          if ( kernValueCount < FT_NEXT_BYTE( p ) )\n            FT_INVALID_OFFSET;\n        }\n      }\n    }\n\n    valid->subtable_length = p - table;\n\n    GXV_EXIT;\n  }\n\n\n  static FT_Bool\n  gxv_kern_coverage_new_apple_validate( FT_UShort      coverage,\n                                        FT_UShort*     format,\n                                        GXV_Validator  valid )\n  {\n    /* new Apple-dialect */\n#ifdef GXV_LOAD_TRACE_VARS\n    FT_Bool  kernVertical;\n    FT_Bool  kernCrossStream;\n    FT_Bool  kernVariation;\n#endif\n\n    FT_UNUSED( valid );\n\n\n    /* reserved bits = 0 */\n    if ( coverage & 0x1FFC )\n      return FALSE;\n\n#ifdef GXV_LOAD_TRACE_VARS\n    kernVertical    = FT_BOOL( ( coverage >> 15 ) & 1 );\n    kernCrossStream = FT_BOOL( ( coverage >> 14 ) & 1 );\n    kernVariation   = FT_BOOL( ( coverage >> 13 ) & 1 );\n#endif\n\n    *format = (FT_UShort)( coverage & 0x0003 );\n\n    GXV_TRACE(( \"new Apple-dialect: \"\n                \"horizontal=%d, cross-stream=%d, variation=%d, format=%d\\n\",\n                 !kernVertical, kernCrossStream, kernVariation, *format ));\n\n    GXV_TRACE(( \"kerning values in Apple format subtable are ignored\\n\" ));\n\n    return TRUE;\n  }\n\n\n  static FT_Bool\n  gxv_kern_coverage_classic_apple_validate( FT_UShort      coverage,\n                                            FT_UShort*     format,\n                                            GXV_Validator  valid )\n  {\n    /* classic Apple-dialect */\n#ifdef GXV_LOAD_TRACE_VARS\n    FT_Bool  horizontal;\n    FT_Bool  cross_stream;\n#endif\n\n\n    /* check expected flags, but don't check if MS-dialect is impossible */\n    if ( !( coverage & 0xFD00 ) && KERN_ALLOWS_MS( valid ) )\n      return FALSE;\n\n    /* reserved bits = 0 */\n    if ( coverage & 0x02FC )\n      return FALSE;\n\n#ifdef GXV_LOAD_TRACE_VARS\n    horizontal   = FT_BOOL( ( coverage >> 15 ) & 1 );\n    cross_stream = FT_BOOL( ( coverage >> 13 ) & 1 );\n#endif\n\n    *format = (FT_UShort)( coverage & 0x0003 );\n\n    GXV_TRACE(( \"classic Apple-dialect: \"\n                \"horizontal=%d, cross-stream=%d, format=%d\\n\",\n                 horizontal, cross_stream, *format ));\n\n    /* format 1 requires GX State Machine, too new for classic */\n    if ( *format == 1 )\n      return FALSE;\n\n    GXV_TRACE(( \"kerning values in Apple format subtable are ignored\\n\" ));\n\n    return TRUE;\n  }\n\n\n  static FT_Bool\n  gxv_kern_coverage_classic_microsoft_validate( FT_UShort      coverage,\n                                                FT_UShort*     format,\n                                                GXV_Validator  valid )\n  {\n    /* classic Microsoft-dialect */\n#ifdef GXV_LOAD_TRACE_VARS\n    FT_Bool  horizontal;\n    FT_Bool  minimum;\n    FT_Bool  cross_stream;\n    FT_Bool  override;\n#endif\n\n    FT_UNUSED( valid );\n\n\n    /* reserved bits = 0 */\n    if ( coverage & 0xFDF0 )\n      return FALSE;\n\n#ifdef GXV_LOAD_TRACE_VARS\n    horizontal   = FT_BOOL(   coverage        & 1 );\n    minimum      = FT_BOOL( ( coverage >> 1 ) & 1 );\n    cross_stream = FT_BOOL( ( coverage >> 2 ) & 1 );\n    override     = FT_BOOL( ( coverage >> 3 ) & 1 );\n#endif\n\n    *format = (FT_UShort)( ( coverage >> 8 ) & 0x0003 );\n\n    GXV_TRACE(( \"classic Microsoft-dialect: \"\n                \"horizontal=%d, minimum=%d, cross-stream=%d, \"\n                \"override=%d, format=%d\\n\",\n                horizontal, minimum, cross_stream, override, *format ));\n\n    if ( *format == 2 )\n      GXV_TRACE((\n        \"kerning values in Microsoft format 2 subtable are ignored\\n\" ));\n\n    return TRUE;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            MAIN                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static GXV_kern_Dialect\n  gxv_kern_coverage_validate( FT_UShort      coverage,\n                              FT_UShort*     format,\n                              GXV_Validator  valid )\n  {\n    GXV_kern_Dialect  result = KERN_DIALECT_UNKNOWN;\n\n\n    GXV_NAME_ENTER( \"validating coverage\" );\n\n    GXV_TRACE(( \"interprete coverage 0x%04x by Apple style\\n\", coverage ));\n\n    if ( KERN_IS_NEW( valid ) )\n    {\n      if ( gxv_kern_coverage_new_apple_validate( coverage,\n                                                 format,\n                                                 valid ) )\n      {\n        result = KERN_DIALECT_APPLE;\n        goto Exit;\n      }\n    }\n\n    if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_APPLE( valid ) )\n    {\n      if ( gxv_kern_coverage_classic_apple_validate( coverage,\n                                                     format,\n                                                     valid ) )\n      {\n        result = KERN_DIALECT_APPLE;\n        goto Exit;\n      }\n    }\n\n    if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_MS( valid ) )\n    {\n      if ( gxv_kern_coverage_classic_microsoft_validate( coverage,\n                                                         format,\n                                                         valid ) )\n      {\n        result = KERN_DIALECT_MS;\n        goto Exit;\n      }\n    }\n\n    GXV_TRACE(( \"cannot interprete coverage, broken kern subtable\\n\" ));\n\n  Exit:\n    GXV_EXIT;\n    return result;\n  }\n\n\n  static void\n  gxv_kern_subtable_validate( FT_Bytes       table,\n                              FT_Bytes       limit,\n                              GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n#ifdef GXV_LOAD_TRACE_VARS\n    FT_UShort  version = 0;    /* MS only: subtable version, unused */\n#endif\n    FT_ULong   length;         /* MS: 16bit, Apple: 32bit*/\n    FT_UShort  coverage;\n#ifdef GXV_LOAD_TRACE_VARS\n    FT_UShort  tupleIndex = 0; /* Apple only */\n#endif\n    FT_UShort  u16[2];\n    FT_UShort  format = 255;   /* subtable format */\n\n\n    GXV_NAME_ENTER( \"kern subtable\" );\n\n    GXV_LIMIT_CHECK( 2 + 2 + 2 );\n    u16[0]   = FT_NEXT_USHORT( p ); /* Apple: length_hi MS: version */\n    u16[1]   = FT_NEXT_USHORT( p ); /* Apple: length_lo MS: length */\n    coverage = FT_NEXT_USHORT( p );\n\n    switch ( gxv_kern_coverage_validate( coverage, &format, valid ) )\n    {\n    case KERN_DIALECT_MS:\n#ifdef GXV_LOAD_TRACE_VARS\n      version    = u16[0];\n#endif\n      length     = u16[1];\n#ifdef GXV_LOAD_TRACE_VARS\n      tupleIndex = 0;\n#endif\n      GXV_TRACE(( \"Subtable version = %d\\n\", version ));\n      GXV_TRACE(( \"Subtable length = %d\\n\", length ));\n      break;\n\n    case KERN_DIALECT_APPLE:\n#ifdef GXV_LOAD_TRACE_VARS\n      version    = 0;\n#endif\n      length     = ( u16[0] << 16 ) + u16[1];\n#ifdef GXV_LOAD_TRACE_VARS\n      tupleIndex = 0;\n#endif\n      GXV_TRACE(( \"Subtable length = %d\\n\", length ));\n\n      if ( KERN_IS_NEW( valid ) )\n      {\n        GXV_LIMIT_CHECK( 2 );\n#ifdef GXV_LOAD_TRACE_VARS\n        tupleIndex = FT_NEXT_USHORT( p );\n#else\n        p += 2;\n#endif\n        GXV_TRACE(( \"Subtable tupleIndex = %d\\n\", tupleIndex ));\n      }\n      break;\n\n    default:\n      length = u16[1];\n      GXV_TRACE(( \"cannot detect subtable dialect, \"\n                  \"just skip %d byte\\n\", length ));\n      goto Exit;\n    }\n\n    /* formats 1, 2, 3 require the position of the start of this subtable */\n    if ( format == 0 )\n      gxv_kern_subtable_fmt0_validate( table, table + length, valid );\n    else if ( format == 1 )\n      gxv_kern_subtable_fmt1_validate( table, table + length, valid );\n    else if ( format == 2 )\n      gxv_kern_subtable_fmt2_validate( table, table + length, valid );\n    else if ( format == 3 )\n      gxv_kern_subtable_fmt3_validate( table, table + length, valid );\n    else\n      FT_INVALID_DATA;\n\n  Exit:\n    valid->subtable_length = length;\n    GXV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         kern TABLE                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  gxv_kern_validate_generic( FT_Bytes          table,\n                             FT_Face           face,\n                             FT_Bool           classic_only,\n                             GXV_kern_Dialect  dialect_request,\n                             FT_Validator      ftvalid )\n  {\n    GXV_ValidatorRec   validrec;\n    GXV_Validator      valid = &validrec;\n\n    GXV_kern_DataRec   kernrec;\n    GXV_kern_Data      kern = &kernrec;\n\n    FT_Bytes           p     = table;\n    FT_Bytes           limit = 0;\n\n    FT_ULong           nTables = 0;\n    FT_UInt            i;\n\n\n    valid->root       = ftvalid;\n    valid->table_data = kern;\n    valid->face       = face;\n\n    FT_TRACE3(( \"validating `kern' table\\n\" ));\n    GXV_INIT;\n    KERN_DIALECT( valid ) = dialect_request;\n\n    GXV_LIMIT_CHECK( 2 );\n    GXV_KERN_DATA( version ) = (GXV_kern_Version)FT_NEXT_USHORT( p );\n    GXV_TRACE(( \"version 0x%04x (higher 16bit)\\n\",\n                GXV_KERN_DATA( version ) ));\n\n    if ( 0x0001 < GXV_KERN_DATA( version ) )\n      FT_INVALID_FORMAT;\n    else if ( KERN_IS_CLASSIC( valid ) )\n    {\n      GXV_LIMIT_CHECK( 2 );\n      nTables = FT_NEXT_USHORT( p );\n    }\n    else if ( KERN_IS_NEW( valid ) )\n    {\n      if ( classic_only )\n        FT_INVALID_FORMAT;\n\n      if ( 0x0000 != FT_NEXT_USHORT( p ) )\n        FT_INVALID_FORMAT;\n\n      GXV_LIMIT_CHECK( 4 );\n      nTables = FT_NEXT_ULONG( p );\n    }\n\n    for ( i = 0; i < nTables; i++ )\n    {\n      GXV_TRACE(( \"validating subtable %d/%d\\n\", i, nTables ));\n      /* p should be 32bit-aligned? */\n      gxv_kern_subtable_validate( p, 0, valid );\n      p += valid->subtable_length;\n    }\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_kern_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    gxv_kern_validate_generic( table, face, 0, KERN_DIALECT_ANY, ftvalid );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_kern_validate_classic( FT_Bytes      table,\n                             FT_Face       face,\n                             FT_Int        dialect_flags,\n                             FT_Validator  ftvalid )\n  {\n    GXV_kern_Dialect  dialect_request;\n\n\n    dialect_request = (GXV_kern_Dialect)dialect_flags;\n    gxv_kern_validate_generic( table, face, 1, dialect_request, ftvalid );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvlcar.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvlcar.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT lcar table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvlcar\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      Data and Types                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  GXV_lcar_DataRec_\n  {\n    FT_UShort  format;\n\n  } GXV_lcar_DataRec, *GXV_lcar_Data;\n\n\n#define GXV_LCAR_DATA( FIELD )  GXV_TABLE_DATA( lcar, FIELD )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  gxv_lcar_partial_validate( FT_UShort      partial,\n                             FT_UShort      glyph,\n                             GXV_Validator  valid )\n  {\n    GXV_NAME_ENTER( \"partial\" );\n\n    if ( GXV_LCAR_DATA( format ) != 1 )\n      goto Exit;\n\n    gxv_ctlPoint_validate( glyph, partial, valid );\n\n  Exit:\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_lcar_LookupValue_validate( FT_UShort            glyph,\n                                 GXV_LookupValueCPtr  value_p,\n                                 GXV_Validator        valid )\n  {\n    FT_Bytes   p     = valid->root->base + value_p->u;\n    FT_Bytes   limit = valid->root->limit;\n    FT_UShort  count;\n    FT_Short   partial;\n    FT_UShort  i;\n\n\n    GXV_NAME_ENTER( \"element in lookupTable\" );\n\n    GXV_LIMIT_CHECK( 2 );\n    count = FT_NEXT_USHORT( p );\n\n    GXV_LIMIT_CHECK( 2 * count );\n    for ( i = 0; i < count; i++ )\n    {\n      partial = FT_NEXT_SHORT( p );\n      gxv_lcar_partial_validate( partial, glyph, valid );\n    }\n\n    GXV_EXIT;\n  }\n\n\n  /*\n    +------ lcar --------------------+\n    |                                |\n    |      +===============+         |\n    |      | looup header  |         |\n    |      +===============+         |\n    |      | BinSrchHeader |         |\n    |      +===============+         |\n    |      | lastGlyph[0]  |         |\n    |      +---------------+         |\n    |      | firstGlyph[0] |         |  head of lcar sfnt table\n    |      +---------------+         |             +\n    |      | offset[0]     |    ->   |          offset            [byte]\n    |      +===============+         |             +\n    |      | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]\n    |      +---------------+         |\n    |      | firstGlyph[1] |         |\n    |      +---------------+         |\n    |      | offset[1]     |         |\n    |      +===============+         |\n    |                                |\n    |       ....                     |\n    |                                |\n    |      16bit value array         |\n    |      +===============+         |\n    +------|     value     | <-------+\n    |       ....\n    |\n    |\n    |\n    |\n    |\n    +---->  lcar values...handled by lcar callback function\n  */\n\n  static GXV_LookupValueDesc\n  gxv_lcar_LookupFmt4_transit( FT_UShort            relative_gindex,\n                               GXV_LookupValueCPtr  base_value_p,\n                               FT_Bytes             lookuptbl_limit,\n                               GXV_Validator        valid )\n  {\n    FT_Bytes             p;\n    FT_Bytes             limit;\n    FT_UShort            offset;\n    GXV_LookupValueDesc  value;\n\n    FT_UNUSED( lookuptbl_limit );\n\n    /* XXX: check range? */\n    offset = (FT_UShort)( base_value_p->u +\n                          relative_gindex * sizeof ( FT_UShort ) );\n    p      = valid->root->base + offset;\n    limit  = valid->root->limit;\n\n    GXV_LIMIT_CHECK ( 2 );\n    value.u = FT_NEXT_USHORT( p );\n\n    return value;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          lcar TABLE                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  gxv_lcar_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    FT_Bytes          p     = table;\n    FT_Bytes          limit = 0;\n    GXV_ValidatorRec  validrec;\n    GXV_Validator     valid = &validrec;\n\n    GXV_lcar_DataRec  lcarrec;\n    GXV_lcar_Data     lcar = &lcarrec;\n\n    FT_Fixed          version;\n\n\n    valid->root       = ftvalid;\n    valid->table_data = lcar;\n    valid->face       = face;\n\n    FT_TRACE3(( \"validating `lcar' table\\n\" ));\n    GXV_INIT;\n\n    GXV_LIMIT_CHECK( 4 + 2 );\n    version = FT_NEXT_ULONG( p );\n    GXV_LCAR_DATA( format ) = FT_NEXT_USHORT( p );\n\n    if ( version != 0x00010000UL)\n      FT_INVALID_FORMAT;\n\n    if ( GXV_LCAR_DATA( format ) > 1 )\n      FT_INVALID_FORMAT;\n\n    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;\n    valid->lookupval_func   = gxv_lcar_LookupValue_validate;\n    valid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit;\n    gxv_LookupTable_validate( p, limit, valid );\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmod.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmod.c                                                               */\n/*                                                                         */\n/*    FreeType's TrueTypeGX/AAT validation module implementation (body).   */\n/*                                                                         */\n/*  Copyright 2004-2006, 2013                                              */\n/*  by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_TRUETYPE_TABLES_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_GX_VALIDATE_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_GX_VALIDATE_H\n\n#include \"gxvmod.h\"\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmodule\n\n\n  static FT_Error\n  gxv_load_table( FT_Face             face,\n                  FT_Tag              tag,\n                  FT_Byte* volatile*  table,\n                  FT_ULong*           table_len )\n  {\n    FT_Error   error;\n    FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n    error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len );\n    if ( FT_ERR_EQ( error, Table_Missing ) )\n      return FT_Err_Ok;\n    if ( error )\n      goto Exit;\n\n    if ( FT_ALLOC( *table, *table_len ) )\n      goto Exit;\n\n    error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len );\n\n  Exit:\n    return error;\n  }\n\n\n#define GXV_TABLE_DECL( _sfnt )                     \\\n          FT_Byte* volatile  _sfnt          = NULL; \\\n          FT_ULong            len_ ## _sfnt = 0\n\n#define GXV_TABLE_LOAD( _sfnt )                                     \\\n          if ( ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) && \\\n               ( gx_flags & FT_VALIDATE_ ## _sfnt )            )    \\\n          {                                                         \\\n            error = gxv_load_table( face, TTAG_ ## _sfnt,           \\\n                                    &_sfnt, &len_ ## _sfnt );       \\\n            if ( error )                                            \\\n              goto Exit;                                            \\\n          }\n\n#define GXV_TABLE_VALIDATE( _sfnt )                                  \\\n          if ( _sfnt )                                               \\\n          {                                                          \\\n            ft_validator_init( &valid, _sfnt, _sfnt + len_ ## _sfnt, \\\n                               FT_VALIDATE_DEFAULT );                \\\n            if ( ft_setjmp( valid.jump_buffer ) == 0 )               \\\n              gxv_ ## _sfnt ## _validate( _sfnt, face, &valid );     \\\n            error = valid.error;                                     \\\n            if ( error )                                             \\\n              goto Exit;                                             \\\n          }\n\n#define GXV_TABLE_SET( _sfnt )                                        \\\n          if ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count )        \\\n            tables[FT_VALIDATE_ ## _sfnt ## _INDEX] = (FT_Bytes)_sfnt\n\n\n  static FT_Error\n  gxv_validate( FT_Face   face,\n                FT_UInt   gx_flags,\n                FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],\n                FT_UInt   table_count )\n  {\n    FT_Memory volatile        memory = FT_FACE_MEMORY( face );\n\n    FT_Error                  error = FT_Err_Ok;\n    FT_ValidatorRec volatile  valid;\n\n    FT_UInt  i;\n\n\n    GXV_TABLE_DECL( feat );\n    GXV_TABLE_DECL( bsln );\n    GXV_TABLE_DECL( trak );\n    GXV_TABLE_DECL( just );\n    GXV_TABLE_DECL( mort );\n    GXV_TABLE_DECL( morx );\n    GXV_TABLE_DECL( kern );\n    GXV_TABLE_DECL( opbd );\n    GXV_TABLE_DECL( prop );\n    GXV_TABLE_DECL( lcar );\n\n    for ( i = 0; i < table_count; i++ )\n      tables[i] = 0;\n\n    /* load tables */\n    GXV_TABLE_LOAD( feat );\n    GXV_TABLE_LOAD( bsln );\n    GXV_TABLE_LOAD( trak );\n    GXV_TABLE_LOAD( just );\n    GXV_TABLE_LOAD( mort );\n    GXV_TABLE_LOAD( morx );\n    GXV_TABLE_LOAD( kern );\n    GXV_TABLE_LOAD( opbd );\n    GXV_TABLE_LOAD( prop );\n    GXV_TABLE_LOAD( lcar );\n\n    /* validate tables */\n    GXV_TABLE_VALIDATE( feat );\n    GXV_TABLE_VALIDATE( bsln );\n    GXV_TABLE_VALIDATE( trak );\n    GXV_TABLE_VALIDATE( just );\n    GXV_TABLE_VALIDATE( mort );\n    GXV_TABLE_VALIDATE( morx );\n    GXV_TABLE_VALIDATE( kern );\n    GXV_TABLE_VALIDATE( opbd );\n    GXV_TABLE_VALIDATE( prop );\n    GXV_TABLE_VALIDATE( lcar );\n\n    /* Set results */\n    GXV_TABLE_SET( feat );\n    GXV_TABLE_SET( mort );\n    GXV_TABLE_SET( morx );\n    GXV_TABLE_SET( bsln );\n    GXV_TABLE_SET( just );\n    GXV_TABLE_SET( kern );\n    GXV_TABLE_SET( opbd );\n    GXV_TABLE_SET( trak );\n    GXV_TABLE_SET( prop );\n    GXV_TABLE_SET( lcar );\n\n  Exit:\n    if ( error )\n    {\n      FT_FREE( feat );\n      FT_FREE( bsln );\n      FT_FREE( trak );\n      FT_FREE( just );\n      FT_FREE( mort );\n      FT_FREE( morx );\n      FT_FREE( kern );\n      FT_FREE( opbd );\n      FT_FREE( prop );\n      FT_FREE( lcar );\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  classic_kern_validate( FT_Face    face,\n                         FT_UInt    ckern_flags,\n                         FT_Bytes*  ckern_table )\n  {\n    FT_Memory volatile        memory = FT_FACE_MEMORY( face );\n\n    FT_Byte* volatile         ckern     = NULL;\n    FT_ULong                  len_ckern = 0;\n\n    /* without volatile on `error' GCC 4.1.1. emits:                         */\n    /*  warning: variable 'error' might be clobbered by 'longjmp' or 'vfork' */\n    /* this warning seems spurious but ---                                   */\n    FT_Error volatile         error = FT_Err_Ok;\n    FT_ValidatorRec volatile  valid;\n\n\n    *ckern_table = NULL;\n\n    error = gxv_load_table( face, TTAG_kern, &ckern, &len_ckern );\n    if ( error )\n      goto Exit;\n\n    if ( ckern )\n    {\n      ft_validator_init( &valid, ckern, ckern + len_ckern,\n                         FT_VALIDATE_DEFAULT );\n      if ( ft_setjmp( valid.jump_buffer ) == 0 )\n        gxv_kern_validate_classic( ckern, face,\n                                   ckern_flags & FT_VALIDATE_CKERN, &valid );\n      error = valid.error;\n      if ( error )\n        goto Exit;\n    }\n\n    *ckern_table = ckern;\n\n  Exit:\n    if ( error )\n      FT_FREE( ckern );\n\n    return error;\n  }\n\n\n  static\n  const FT_Service_GXvalidateRec  gxvalid_interface =\n  {\n    gxv_validate\n  };\n\n\n  static\n  const FT_Service_CKERNvalidateRec  ckernvalid_interface =\n  {\n    classic_kern_validate\n  };\n\n\n  static\n  const FT_ServiceDescRec  gxvalid_services[] =\n  {\n    { FT_SERVICE_ID_GX_VALIDATE,          &gxvalid_interface },\n    { FT_SERVICE_ID_CLASSICKERN_VALIDATE, &ckernvalid_interface },\n    { NULL, NULL }\n  };\n\n\n  static FT_Pointer\n  gxvalid_get_service( FT_Module    module,\n                       const char*  service_id )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( gxvalid_services, service_id );\n  }\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Module_Class  gxv_module_class =\n  {\n    0,\n    sizeof ( FT_ModuleRec ),\n    \"gxvalid\",\n    0x10000L,\n    0x20000L,\n\n    0,              /* module-specific interface */\n\n    (FT_Module_Constructor)0,\n    (FT_Module_Destructor) 0,\n    (FT_Module_Requester)  gxvalid_get_service\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmod.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmod.h                                                               */\n/*                                                                         */\n/*    FreeType's TrueTypeGX/AAT validation module implementation           */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __GXVMOD_H__\n#define __GXVMOD_H__\n\n#include <ft2build.h>\n#include FT_MODULE_H\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_EXPORT_VAR( const FT_Module_Class )  gxv_module_class;\n\n\nFT_END_HEADER\n\n#endif /* __GXVMOD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmort.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmort.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT mort table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmort.h\"\n#include \"gxvfeat.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmort\n\n\n  static void\n  gxv_mort_feature_validate( GXV_mort_feature  f,\n                             GXV_Validator     valid )\n  {\n    if ( f->featureType >= gxv_feat_registry_length )\n    {\n      GXV_TRACE(( \"featureType %d is out of registered range, \"\n                  \"setting %d is unchecked\\n\",\n                  f->featureType, f->featureSetting ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n    else if ( !gxv_feat_registry[f->featureType].existence )\n    {\n      GXV_TRACE(( \"featureType %d is within registered area \"\n                  \"but undefined, setting %d is unchecked\\n\",\n                  f->featureType, f->featureSetting ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n    else\n    {\n      FT_Byte  nSettings_max;\n\n\n      /* nSettings in gxvfeat.c is halved for exclusive on/off settings */\n      nSettings_max = gxv_feat_registry[f->featureType].nSettings;\n      if ( gxv_feat_registry[f->featureType].exclusive )\n        nSettings_max = (FT_Byte)( 2 * nSettings_max );\n\n      GXV_TRACE(( \"featureType %d is registered\", f->featureType ));\n      GXV_TRACE(( \"setting %d\", f->featureSetting ));\n\n      if ( f->featureSetting > nSettings_max )\n      {\n        GXV_TRACE(( \"out of defined range %d\", nSettings_max ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n      }\n      GXV_TRACE(( \"\\n\" ));\n    }\n\n    /* TODO: enableFlags must be unique value in specified chain?  */\n  }\n\n\n  /*\n   * nFeatureFlags is typed to FT_ULong to accept that in\n   * mort (typed FT_UShort) and morx (typed FT_ULong).\n   */\n  FT_LOCAL_DEF( void )\n  gxv_mort_featurearray_validate( FT_Bytes       table,\n                                  FT_Bytes       limit,\n                                  FT_ULong       nFeatureFlags,\n                                  GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_ULong  i;\n\n    GXV_mort_featureRec  f = GXV_MORT_FEATURE_OFF;\n\n\n    GXV_NAME_ENTER( \"mort feature list\" );\n    for ( i = 0; i < nFeatureFlags; i++ )\n    {\n      GXV_LIMIT_CHECK( 2 + 2 + 4 + 4 );\n      f.featureType    = FT_NEXT_USHORT( p );\n      f.featureSetting = FT_NEXT_USHORT( p );\n      f.enableFlags    = FT_NEXT_ULONG( p );\n      f.disableFlags   = FT_NEXT_ULONG( p );\n\n      gxv_mort_feature_validate( &f, valid );\n    }\n\n    if ( !IS_GXV_MORT_FEATURE_OFF( f ) )\n      FT_INVALID_DATA;\n\n    valid->subtable_length = p - table;\n    GXV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_mort_coverage_validate( FT_UShort      coverage,\n                              GXV_Validator  valid )\n  {\n    FT_UNUSED( valid );\n\n    if ( coverage & 0x8000U )\n      GXV_TRACE(( \" this subtable is for vertical text only\\n\" ));\n    else\n      GXV_TRACE(( \" this subtable is for horizontal text only\\n\" ));\n\n    if ( coverage & 0x4000 )\n      GXV_TRACE(( \" this subtable is applied to glyph array \"\n                  \"in descending order\\n\" ));\n    else\n      GXV_TRACE(( \" this subtable is applied to glyph array \"\n                  \"in ascending order\\n\" ));\n\n    if ( coverage & 0x2000 )\n      GXV_TRACE(( \" this subtable is forcibly applied to \"\n                  \"vertical/horizontal text\\n\" ));\n\n    if ( coverage & 0x1FF8 )\n      GXV_TRACE(( \" coverage has non-zero bits in reserved area\\n\" ));\n  }\n\n\n  static void\n  gxv_mort_subtables_validate( FT_Bytes       table,\n                               FT_Bytes       limit,\n                               FT_UShort      nSubtables,\n                               GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_Validate_Func fmt_funcs_table[] =\n    {\n      gxv_mort_subtable_type0_validate, /* 0 */\n      gxv_mort_subtable_type1_validate, /* 1 */\n      gxv_mort_subtable_type2_validate, /* 2 */\n      NULL,                             /* 3 */\n      gxv_mort_subtable_type4_validate, /* 4 */\n      gxv_mort_subtable_type5_validate, /* 5 */\n\n    };\n\n    GXV_Validate_Func  func;\n    FT_UShort          i;\n\n\n    GXV_NAME_ENTER( \"subtables in a chain\" );\n\n    for ( i = 0; i < nSubtables; i++ )\n    {\n      FT_UShort  length;\n      FT_UShort  coverage;\n#ifdef GXV_LOAD_UNUSED_VARS\n      FT_ULong   subFeatureFlags;\n#endif\n      FT_UInt    type;\n      FT_UInt    rest;\n\n\n      GXV_LIMIT_CHECK( 2 + 2 + 4 );\n      length          = FT_NEXT_USHORT( p );\n      coverage        = FT_NEXT_USHORT( p );\n#ifdef GXV_LOAD_UNUSED_VARS\n      subFeatureFlags = FT_NEXT_ULONG( p );\n#else\n      p += 4;\n#endif\n\n      GXV_TRACE(( \"validating chain subtable %d/%d (%d bytes)\\n\",\n                  i + 1, nSubtables, length ));\n      type = coverage & 0x0007;\n      rest = length - ( 2 + 2 + 4 );\n\n      GXV_LIMIT_CHECK( rest );\n      gxv_mort_coverage_validate( coverage, valid );\n\n      if ( type > 5 )\n        FT_INVALID_FORMAT;\n\n      func = fmt_funcs_table[type];\n      if ( func == NULL )\n        GXV_TRACE(( \"morx type %d is reserved\\n\", type ));\n\n      func( p, p + rest, valid );\n\n      p += rest;\n      /* TODO: validate subFeatureFlags */\n    }\n\n    valid->subtable_length = p - table;\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_mort_chain_validate( FT_Bytes       table,\n                           FT_Bytes       limit,\n                           GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_ULong   defaultFlags;\n#endif\n    FT_ULong   chainLength;\n    FT_UShort  nFeatureFlags;\n    FT_UShort  nSubtables;\n\n\n    GXV_NAME_ENTER( \"mort chain header\" );\n\n    GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 );\n#ifdef GXV_LOAD_UNUSED_VARS\n    defaultFlags  = FT_NEXT_ULONG( p );\n#else\n    p += 4;\n#endif\n    chainLength   = FT_NEXT_ULONG( p );\n    nFeatureFlags = FT_NEXT_USHORT( p );\n    nSubtables    = FT_NEXT_USHORT( p );\n\n    gxv_mort_featurearray_validate( p, table + chainLength,\n                                    nFeatureFlags, valid );\n    p += valid->subtable_length;\n    gxv_mort_subtables_validate( p, table + chainLength, nSubtables, valid );\n    valid->subtable_length = chainLength;\n\n    /* TODO: validate defaultFlags */\n    GXV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_mort_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    GXV_ValidatorRec  validrec;\n    GXV_Validator     valid = &validrec;\n    FT_Bytes          p     = table;\n    FT_Bytes          limit = 0;\n    FT_ULong          version;\n    FT_ULong          nChains;\n    FT_ULong          i;\n\n\n    valid->root = ftvalid;\n    valid->face = face;\n    limit       = valid->root->limit;\n\n    FT_TRACE3(( \"validating `mort' table\\n\" ));\n    GXV_INIT;\n\n    GXV_LIMIT_CHECK( 4 + 4 );\n    version = FT_NEXT_ULONG( p );\n    nChains = FT_NEXT_ULONG( p );\n\n    if (version != 0x00010000UL)\n      FT_INVALID_FORMAT;\n\n    for ( i = 0; i < nChains; i++ )\n    {\n      GXV_TRACE(( \"validating chain %d/%d\\n\", i + 1, nChains ));\n      GXV_32BIT_ALIGNMENT_VALIDATE( p - table );\n      gxv_mort_chain_validate( p, limit, valid );\n      p += valid->subtable_length;\n    }\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmort.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmort.h                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT common definition for mort table (specification).     */\n/*                                                                         */\n/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __GXVMORT_H__\n#define __GXVMORT_H__\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n#include FT_SFNT_NAMES_H\n\n\n  typedef struct  GXV_mort_featureRec_\n  {\n    FT_UShort  featureType;\n    FT_UShort  featureSetting;\n    FT_ULong   enableFlags;\n    FT_ULong   disableFlags;\n\n  } GXV_mort_featureRec, *GXV_mort_feature;\n\n#define GXV_MORT_FEATURE_OFF  {0, 1, 0x00000000UL, 0x00000000UL}\n\n#define IS_GXV_MORT_FEATURE_OFF( f )              \\\n          ( (f).featureType    == 0            || \\\n            (f).featureSetting == 1            || \\\n            (f).enableFlags    == 0x00000000UL || \\\n            (f).disableFlags   == 0x00000000UL )\n\n\n  FT_LOCAL( void )\n  gxv_mort_featurearray_validate( FT_Bytes       table,\n                                  FT_Bytes       limit,\n                                  FT_ULong       nFeatureFlags,\n                                  GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_mort_coverage_validate( FT_UShort      coverage,\n                              GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_mort_subtable_type0_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_mort_subtable_type1_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_mort_subtable_type2_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_mort_subtable_type4_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_mort_subtable_type5_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n\n#endif /* __GXVMORT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmort0.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmort0.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT mort table validation                                 */\n/*    body for type0 (Indic Script Rearrangement) subtable.                */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmort.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmort\n\n\n  static const char* GXV_Mort_IndicScript_Msg[] =\n  {\n    \"no change\",\n    \"Ax => xA\",\n    \"xD => Dx\",\n    \"AxD => DxA\",\n    \"ABx => xAB\",\n    \"ABx => xBA\",\n    \"xCD => CDx\",\n    \"xCD => DCx\",\n    \"AxCD => CDxA\",\n    \"AxCD => DCxA\",\n    \"ABxD => DxAB\",\n    \"ABxD => DxBA\",\n    \"ABxCD => CDxAB\",\n    \"ABxCD => CDxBA\",\n    \"ABxCD => DCxAB\",\n    \"ABxCD => DCxBA\",\n\n  };\n\n\n  static void\n  gxv_mort_subtable_type0_entry_validate(\n    FT_Byte                         state,\n    FT_UShort                       flags,\n    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n    FT_Bytes                        table,\n    FT_Bytes                        limit,\n    GXV_Validator                   valid )\n  {\n    FT_UShort  markFirst;\n    FT_UShort  dontAdvance;\n    FT_UShort  markLast;\n    FT_UShort  reserved;\n    FT_UShort  verb = 0;\n\n    FT_UNUSED( state );\n    FT_UNUSED( table );\n    FT_UNUSED( limit );\n\n    FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); /* for the non-debugging */\n    FT_UNUSED( glyphOffset_p );                  /* case                  */\n\n\n    markFirst   = (FT_UShort)( ( flags >> 15 ) & 1 );\n    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );\n    markLast    = (FT_UShort)( ( flags >> 13 ) & 1 );\n\n    reserved = (FT_UShort)( flags & 0x1FF0 );\n    verb     = (FT_UShort)( flags & 0x000F );\n\n    GXV_TRACE(( \"  IndicScript MorphRule for glyphOffset 0x%04x\",\n                glyphOffset_p->u ));\n    GXV_TRACE(( \" markFirst=%01d\", markFirst ));\n    GXV_TRACE(( \" dontAdvance=%01d\", dontAdvance ));\n    GXV_TRACE(( \" markLast=%01d\", markLast ));\n    GXV_TRACE(( \" %02d\", verb ));\n    GXV_TRACE(( \" %s\\n\", GXV_Mort_IndicScript_Msg[verb] ));\n\n    if ( markFirst > 0 && markLast > 0 )\n    {\n      GXV_TRACE(( \"  [odd] a glyph is marked as the first and last\"\n                  \"  in Indic rearrangement\\n\" ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n\n    if ( markFirst > 0 && dontAdvance > 0 )\n    {\n      GXV_TRACE(( \"  [odd] the first glyph is marked as dontAdvance\"\n                  \" in Indic rearrangement\\n\" ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n\n    if ( 0 < reserved )\n    {\n      GXV_TRACE(( \" non-zero bits found in reserved range\\n\" ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n    else\n      GXV_TRACE(( \"\\n\" ));\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_mort_subtable_type0_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n\n    GXV_NAME_ENTER(\n      \"mort chain subtable type0 (Indic-Script Rearrangement)\" );\n\n    GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE );\n\n    valid->statetable.optdata               = NULL;\n    valid->statetable.optdata_load_func     = NULL;\n    valid->statetable.subtable_setup_func   = NULL;\n    valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;\n    valid->statetable.entry_validate_func =\n      gxv_mort_subtable_type0_entry_validate;\n\n    gxv_StateTable_validate( p, limit, valid );\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmort1.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmort1.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT mort table validation                                 */\n/*    body for type1 (Contextual Substitution) subtable.                   */\n/*                                                                         */\n/*  Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmort.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmort\n\n\n  typedef struct  GXV_mort_subtable_type1_StateOptRec_\n  {\n    FT_UShort  substitutionTable;\n    FT_UShort  substitutionTable_length;\n\n  }  GXV_mort_subtable_type1_StateOptRec,\n    *GXV_mort_subtable_type1_StateOptRecData;\n\n#define GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE \\\n          ( GXV_STATETABLE_HEADER_SIZE + 2 )\n\n\n  static void\n  gxv_mort_subtable_type1_substitutionTable_load( FT_Bytes       table,\n                                                  FT_Bytes       limit,\n                                                  GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_mort_subtable_type1_StateOptRecData  optdata =\n      (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata;\n\n\n    GXV_LIMIT_CHECK( 2 );\n    optdata->substitutionTable = FT_NEXT_USHORT( p );\n  }\n\n\n  static void\n  gxv_mort_subtable_type1_subtable_setup( FT_UShort      table_size,\n                                          FT_UShort      classTable,\n                                          FT_UShort      stateArray,\n                                          FT_UShort      entryTable,\n                                          FT_UShort*     classTable_length_p,\n                                          FT_UShort*     stateArray_length_p,\n                                          FT_UShort*     entryTable_length_p,\n                                          GXV_Validator  valid )\n  {\n    FT_UShort  o[4];\n    FT_UShort  *l[4];\n    FT_UShort  buff[5];\n\n    GXV_mort_subtable_type1_StateOptRecData  optdata =\n      (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata;\n\n\n    o[0] = classTable;\n    o[1] = stateArray;\n    o[2] = entryTable;\n    o[3] = optdata->substitutionTable;\n    l[0] = classTable_length_p;\n    l[1] = stateArray_length_p;\n    l[2] = entryTable_length_p;\n    l[3] = &( optdata->substitutionTable_length );\n\n    gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid );\n  }\n\n\n  static void\n  gxv_mort_subtable_type1_offset_to_subst_validate(\n    FT_Short          wordOffset,\n    const FT_String*  tag,\n    FT_Byte           state,\n    GXV_Validator     valid )\n  {\n    FT_UShort  substTable;\n    FT_UShort  substTable_limit;\n\n    FT_UNUSED( tag );\n    FT_UNUSED( state );\n\n\n    substTable =\n      ((GXV_mort_subtable_type1_StateOptRec *)\n       (valid->statetable.optdata))->substitutionTable;\n    substTable_limit =\n      (FT_UShort)( substTable +\n                   ((GXV_mort_subtable_type1_StateOptRec *)\n                    (valid->statetable.optdata))->substitutionTable_length );\n\n    valid->min_gid = (FT_UShort)( ( substTable       - wordOffset * 2 ) / 2 );\n    valid->max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 );\n    valid->max_gid = (FT_UShort)( FT_MAX( valid->max_gid,\n                                          valid->face->num_glyphs ) );\n\n    /* XXX: check range? */\n\n    /* TODO: min_gid & max_gid comparison with ClassTable contents */\n  }\n\n\n  static void\n  gxv_mort_subtable_type1_entry_validate(\n    FT_Byte                         state,\n    FT_UShort                       flags,\n    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n    FT_Bytes                        table,\n    FT_Bytes                        limit,\n    GXV_Validator                   valid )\n  {\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_UShort  setMark;\n    FT_UShort  dontAdvance;\n#endif\n    FT_UShort  reserved;\n    FT_Short   markOffset;\n    FT_Short   currentOffset;\n\n    FT_UNUSED( table );\n    FT_UNUSED( limit );\n\n\n#ifdef GXV_LOAD_UNUSED_VARS\n    setMark       = (FT_UShort)(   flags >> 15            );\n    dontAdvance   = (FT_UShort)( ( flags >> 14 ) & 1      );\n#endif\n    reserved      = (FT_Short)(    flags         & 0x3FFF );\n\n    markOffset    = (FT_Short)( glyphOffset_p->ul >> 16 );\n    currentOffset = (FT_Short)( glyphOffset_p->ul       );\n\n    if ( 0 < reserved )\n    {\n      GXV_TRACE(( \" non-zero bits found in reserved range\\n\" ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n\n    gxv_mort_subtable_type1_offset_to_subst_validate( markOffset,\n                                                      \"markOffset\",\n                                                      state,\n                                                      valid );\n\n    gxv_mort_subtable_type1_offset_to_subst_validate( currentOffset,\n                                                      \"currentOffset\",\n                                                      state,\n                                                      valid );\n  }\n\n\n  static void\n  gxv_mort_subtable_type1_substTable_validate( FT_Bytes       table,\n                                               FT_Bytes       limit,\n                                               GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  num_gids = (FT_UShort)(\n                 ((GXV_mort_subtable_type1_StateOptRec *)\n                  (valid->statetable.optdata))->substitutionTable_length / 2 );\n    FT_UShort  i;\n\n\n    GXV_NAME_ENTER( \"validating contents of substitutionTable\" );\n    for ( i = 0; i < num_gids ; i ++ )\n    {\n      FT_UShort  dst_gid;\n\n\n      GXV_LIMIT_CHECK( 2 );\n      dst_gid = FT_NEXT_USHORT( p );\n\n      if ( dst_gid >= 0xFFFFU )\n        continue;\n\n      if ( dst_gid < valid->min_gid || valid->max_gid < dst_gid )\n      {\n        GXV_TRACE(( \"substTable include a strange gid[%d]=%d >\"\n                    \" out of define range (%d..%d)\\n\",\n                    i, dst_gid, valid->min_gid, valid->max_gid ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n      }\n    }\n\n    GXV_EXIT;\n  }\n\n\n  /*\n   * subtable for Contextual glyph substitution is a modified StateTable.\n   * In addition to classTable, stateArray, and entryTable, the field\n   * `substitutionTable' is added.\n   */\n  FT_LOCAL_DEF( void )\n  gxv_mort_subtable_type1_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_mort_subtable_type1_StateOptRec  st_rec;\n\n\n    GXV_NAME_ENTER( \"mort chain subtable type1 (Contextual Glyph Subst)\" );\n\n    GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE );\n\n    valid->statetable.optdata =\n      &st_rec;\n    valid->statetable.optdata_load_func =\n      gxv_mort_subtable_type1_substitutionTable_load;\n    valid->statetable.subtable_setup_func =\n      gxv_mort_subtable_type1_subtable_setup;\n    valid->statetable.entry_glyphoffset_fmt =\n      GXV_GLYPHOFFSET_ULONG;\n    valid->statetable.entry_validate_func =\n\n      gxv_mort_subtable_type1_entry_validate;\n    gxv_StateTable_validate( p, limit, valid );\n\n    gxv_mort_subtable_type1_substTable_validate(\n      table + st_rec.substitutionTable,\n      table + st_rec.substitutionTable + st_rec.substitutionTable_length,\n      valid );\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmort2.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmort2.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT mort table validation                                 */\n/*    body for type2 (Ligature Substitution) subtable.                     */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmort.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmort\n\n\n  typedef struct  GXV_mort_subtable_type2_StateOptRec_\n  {\n    FT_UShort  ligActionTable;\n    FT_UShort  componentTable;\n    FT_UShort  ligatureTable;\n    FT_UShort  ligActionTable_length;\n    FT_UShort  componentTable_length;\n    FT_UShort  ligatureTable_length;\n\n  }  GXV_mort_subtable_type2_StateOptRec,\n    *GXV_mort_subtable_type2_StateOptRecData;\n\n#define GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE \\\n          ( GXV_STATETABLE_HEADER_SIZE + 2 + 2 + 2 )\n\n\n  static void\n  gxv_mort_subtable_type2_opttable_load( FT_Bytes       table,\n                                         FT_Bytes       limit,\n                                         GXV_Validator  valid )\n  {\n    FT_Bytes p = table;\n    GXV_mort_subtable_type2_StateOptRecData  optdata =\n      (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;\n\n\n    GXV_LIMIT_CHECK( 2 + 2 + 2 );\n    optdata->ligActionTable = FT_NEXT_USHORT( p );\n    optdata->componentTable = FT_NEXT_USHORT( p );\n    optdata->ligatureTable  = FT_NEXT_USHORT( p );\n\n    GXV_TRACE(( \"offset to ligActionTable=0x%04x\\n\",\n                optdata->ligActionTable ));\n    GXV_TRACE(( \"offset to componentTable=0x%04x\\n\",\n                optdata->componentTable ));\n    GXV_TRACE(( \"offset to ligatureTable=0x%04x\\n\",\n                optdata->ligatureTable ));\n  }\n\n\n  static void\n  gxv_mort_subtable_type2_subtable_setup( FT_UShort      table_size,\n                                          FT_UShort      classTable,\n                                          FT_UShort      stateArray,\n                                          FT_UShort      entryTable,\n                                          FT_UShort      *classTable_length_p,\n                                          FT_UShort      *stateArray_length_p,\n                                          FT_UShort      *entryTable_length_p,\n                                          GXV_Validator  valid )\n  {\n    FT_UShort  o[6];\n    FT_UShort  *l[6];\n    FT_UShort  buff[7];\n\n    GXV_mort_subtable_type2_StateOptRecData  optdata =\n      (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;\n\n\n    GXV_NAME_ENTER( \"subtable boundaries setup\" );\n\n    o[0] = classTable;\n    o[1] = stateArray;\n    o[2] = entryTable;\n    o[3] = optdata->ligActionTable;\n    o[4] = optdata->componentTable;\n    o[5] = optdata->ligatureTable;\n    l[0] = classTable_length_p;\n    l[1] = stateArray_length_p;\n    l[2] = entryTable_length_p;\n    l[3] = &(optdata->ligActionTable_length);\n    l[4] = &(optdata->componentTable_length);\n    l[5] = &(optdata->ligatureTable_length);\n\n    gxv_set_length_by_ushort_offset( o, l, buff, 6, table_size, valid );\n\n    GXV_TRACE(( \"classTable: offset=0x%04x length=0x%04x\\n\",\n                classTable, *classTable_length_p ));\n    GXV_TRACE(( \"stateArray: offset=0x%04x length=0x%04x\\n\",\n                stateArray, *stateArray_length_p ));\n    GXV_TRACE(( \"entryTable: offset=0x%04x length=0x%04x\\n\",\n                entryTable, *entryTable_length_p ));\n    GXV_TRACE(( \"ligActionTable: offset=0x%04x length=0x%04x\\n\",\n                optdata->ligActionTable,\n                optdata->ligActionTable_length ));\n    GXV_TRACE(( \"componentTable: offset=0x%04x length=0x%04x\\n\",\n                optdata->componentTable,\n                optdata->componentTable_length ));\n    GXV_TRACE(( \"ligatureTable:  offset=0x%04x length=0x%04x\\n\",\n                optdata->ligatureTable,\n                optdata->ligatureTable_length ));\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_mort_subtable_type2_ligActionOffset_validate(\n    FT_Bytes       table,\n    FT_UShort      ligActionOffset,\n    GXV_Validator  valid )\n  {\n    /* access ligActionTable */\n    GXV_mort_subtable_type2_StateOptRecData  optdata =\n      (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;\n\n    FT_Bytes lat_base  = table + optdata->ligActionTable;\n    FT_Bytes p         = table + ligActionOffset;\n    FT_Bytes lat_limit = lat_base + optdata->ligActionTable;\n\n\n    GXV_32BIT_ALIGNMENT_VALIDATE( ligActionOffset );\n    if ( p < lat_base )\n    {\n      GXV_TRACE(( \"too short offset 0x%04x: p < lat_base (%d byte rewind)\\n\",\n                  ligActionOffset, lat_base - p ));\n\n      /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n    }\n    else if ( lat_limit < p )\n    {\n      GXV_TRACE(( \"too large offset 0x%04x: lat_limit < p (%d byte overrun)\\n\",\n                  ligActionOffset, p - lat_limit ));\n\n      /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n    }\n    else\n    {\n      /* validate entry in ligActionTable */\n      FT_ULong   lig_action;\n#ifdef GXV_LOAD_UNUSED_VARS\n      FT_UShort  last;\n      FT_UShort  store;\n#endif\n      FT_ULong   offset;\n\n\n      lig_action = FT_NEXT_ULONG( p );\n#ifdef GXV_LOAD_UNUSED_VARS\n      last   = (FT_UShort)( ( lig_action >> 31 ) & 1 );\n      store  = (FT_UShort)( ( lig_action >> 30 ) & 1 );\n#endif\n\n      /* Apple spec defines this offset as a word offset */\n      offset = lig_action & 0x3FFFFFFFUL;\n      if ( offset * 2 < optdata->ligatureTable )\n      {\n        GXV_TRACE(( \"too short offset 0x%08x:\"\n                    \" 2 x offset < ligatureTable (%d byte rewind)\\n\",\n                     offset, optdata->ligatureTable - offset * 2 ));\n\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n      } else if ( offset * 2 >\n                  optdata->ligatureTable + optdata->ligatureTable_length )\n      {\n        GXV_TRACE(( \"too long offset 0x%08x:\"\n                    \" 2 x offset > ligatureTable + ligatureTable_length\"\n                    \" (%d byte overrun)\\n\",\n                     offset,\n                     optdata->ligatureTable + optdata->ligatureTable_length\n                     - offset * 2 ));\n\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n      }\n    }\n  }\n\n\n  static void\n  gxv_mort_subtable_type2_entry_validate(\n    FT_Byte                         state,\n    FT_UShort                       flags,\n    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n    FT_Bytes                        table,\n    FT_Bytes                        limit,\n    GXV_Validator                   valid )\n  {\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_UShort setComponent;\n    FT_UShort dontAdvance;\n#endif\n    FT_UShort offset;\n\n    FT_UNUSED( state );\n    FT_UNUSED( glyphOffset_p );\n    FT_UNUSED( limit );\n\n\n#ifdef GXV_LOAD_UNUSED_VARS\n    setComponent = (FT_UShort)( ( flags >> 15 ) & 1 );\n    dontAdvance  = (FT_UShort)( ( flags >> 14 ) & 1 );\n#endif\n\n    offset = (FT_UShort)( flags & 0x3FFFU );\n\n    if ( 0 < offset )\n      gxv_mort_subtable_type2_ligActionOffset_validate( table, offset,\n                                                        valid );\n  }\n\n\n  static void\n  gxv_mort_subtable_type2_ligatureTable_validate( FT_Bytes       table,\n                                                  GXV_Validator  valid )\n  {\n    GXV_mort_subtable_type2_StateOptRecData  optdata =\n      (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;\n\n    FT_Bytes p     = table + optdata->ligatureTable;\n    FT_Bytes limit = table + optdata->ligatureTable\n                           + optdata->ligatureTable_length;\n\n\n    GXV_NAME_ENTER( \"mort chain subtable type2 - substitutionTable\" );\n    if ( 0 != optdata->ligatureTable )\n    {\n      /* Apple does not give specification of ligatureTable format */\n      while ( p < limit )\n      {\n        FT_UShort  lig_gid;\n\n\n        GXV_LIMIT_CHECK( 2 );\n        lig_gid = FT_NEXT_USHORT( p );\n\n        if ( valid->face->num_glyphs < lig_gid )\n          GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n      }\n    }\n    GXV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_mort_subtable_type2_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_mort_subtable_type2_StateOptRec  lig_rec;\n\n\n    GXV_NAME_ENTER( \"mort chain subtable type2 (Ligature Substitution)\" );\n\n    GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE );\n\n    valid->statetable.optdata =\n      &lig_rec;\n    valid->statetable.optdata_load_func =\n      gxv_mort_subtable_type2_opttable_load;\n    valid->statetable.subtable_setup_func =\n      gxv_mort_subtable_type2_subtable_setup;\n    valid->statetable.entry_glyphoffset_fmt =\n      GXV_GLYPHOFFSET_NONE;\n    valid->statetable.entry_validate_func =\n      gxv_mort_subtable_type2_entry_validate;\n\n    gxv_StateTable_validate( p, limit, valid );\n\n    p += valid->subtable_length;\n    gxv_mort_subtable_type2_ligatureTable_validate( table, valid );\n\n    valid->subtable_length = p - table;\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmort4.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmort4.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT mort table validation                                 */\n/*    body for type4 (Non-Contextual Glyph Substitution) subtable.         */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmort.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmort\n\n\n  static void\n  gxv_mort_subtable_type4_lookupval_validate( FT_UShort            glyph,\n                                              GXV_LookupValueCPtr  value_p,\n                                              GXV_Validator        valid )\n  {\n    FT_UNUSED( glyph );\n\n    gxv_glyphid_validate( value_p->u, valid );\n  }\n\n  /*\n    +===============+ --------+\n    | lookup header |         |\n    +===============+         |\n    | BinSrchHeader |         |\n    +===============+         |\n    | lastGlyph[0]  |         |\n    +---------------+         |\n    | firstGlyph[0] |         |    head of lookup table\n    +---------------+         |             +\n    | offset[0]     |    ->   |          offset            [byte]\n    +===============+         |             +\n    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]\n    +---------------+         |\n    | firstGlyph[1] |         |\n    +---------------+         |\n    | offset[1]     |         |\n    +===============+         |\n                              |\n     ....                     |\n                              |\n    16bit value array         |\n    +===============+         |\n    |     value     | <-------+\n     ....\n  */\n\n  static GXV_LookupValueDesc\n  gxv_mort_subtable_type4_lookupfmt4_transit(\n    FT_UShort            relative_gindex,\n    GXV_LookupValueCPtr  base_value_p,\n    FT_Bytes             lookuptbl_limit,\n    GXV_Validator        valid )\n  {\n    FT_Bytes             p;\n    FT_Bytes             limit;\n    FT_UShort            offset;\n    GXV_LookupValueDesc  value;\n\n    /* XXX: check range? */\n    offset = (FT_UShort)( base_value_p->u +\n                          relative_gindex * sizeof ( FT_UShort ) );\n\n    p     = valid->lookuptbl_head + offset;\n    limit = lookuptbl_limit;\n\n    GXV_LIMIT_CHECK( 2 );\n    value.u = FT_NEXT_USHORT( p );\n\n    return value;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_mort_subtable_type4_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n\n    GXV_NAME_ENTER( \"mort chain subtable type4 \"\n                    \"(Non-Contextual Glyph Substitution)\" );\n\n    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;\n    valid->lookupval_func   = gxv_mort_subtable_type4_lookupval_validate;\n    valid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit;\n\n    gxv_LookupTable_validate( p, limit, valid );\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmort5.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmort5.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT mort table validation                                 */\n/*    body for type5 (Contextual Glyph Insertion) subtable.                */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmort.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmort\n\n\n  /*\n   * mort subtable type5 (Contextual Glyph Insertion)\n   * has the format of StateTable with insertion-glyph-list,\n   * but without name.  The offset is given by glyphOffset in\n   * entryTable.  There is no table location declaration\n   * like xxxTable.\n   */\n\n  typedef struct  GXV_mort_subtable_type5_StateOptRec_\n  {\n    FT_UShort   classTable;\n    FT_UShort   stateArray;\n    FT_UShort   entryTable;\n\n#define GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE  GXV_STATETABLE_HEADER_SIZE\n\n    FT_UShort*  classTable_length_p;\n    FT_UShort*  stateArray_length_p;\n    FT_UShort*  entryTable_length_p;\n\n  }  GXV_mort_subtable_type5_StateOptRec,\n    *GXV_mort_subtable_type5_StateOptRecData;\n\n\n  FT_LOCAL_DEF( void )\n  gxv_mort_subtable_type5_subtable_setup( FT_UShort      table_size,\n                                          FT_UShort      classTable,\n                                          FT_UShort      stateArray,\n                                          FT_UShort      entryTable,\n                                          FT_UShort*     classTable_length_p,\n                                          FT_UShort*     stateArray_length_p,\n                                          FT_UShort*     entryTable_length_p,\n                                          GXV_Validator  valid )\n  {\n    GXV_mort_subtable_type5_StateOptRecData  optdata =\n      (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata;\n\n\n    gxv_StateTable_subtable_setup( table_size,\n                                   classTable,\n                                   stateArray,\n                                   entryTable,\n                                   classTable_length_p,\n                                   stateArray_length_p,\n                                   entryTable_length_p,\n                                   valid );\n\n    optdata->classTable = classTable;\n    optdata->stateArray = stateArray;\n    optdata->entryTable = entryTable;\n\n    optdata->classTable_length_p = classTable_length_p;\n    optdata->stateArray_length_p = stateArray_length_p;\n    optdata->entryTable_length_p = entryTable_length_p;\n  }\n\n\n  static void\n  gxv_mort_subtable_type5_InsertList_validate( FT_UShort      offset,\n                                               FT_UShort      count,\n                                               FT_Bytes       table,\n                                               FT_Bytes       limit,\n                                               GXV_Validator  valid )\n  {\n    /*\n     * We don't know the range of insertion-glyph-list.\n     * Set range by whole of state table.\n     */\n    FT_Bytes  p = table + offset;\n\n    GXV_mort_subtable_type5_StateOptRecData  optdata =\n      (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata;\n\n    if ( optdata->classTable < offset                                   &&\n         offset < optdata->classTable + *(optdata->classTable_length_p) )\n      GXV_TRACE(( \" offset runs into ClassTable\" ));\n    if ( optdata->stateArray < offset                                   &&\n         offset < optdata->stateArray + *(optdata->stateArray_length_p) )\n      GXV_TRACE(( \" offset runs into StateArray\" ));\n    if ( optdata->entryTable < offset                                   &&\n         offset < optdata->entryTable + *(optdata->entryTable_length_p) )\n      GXV_TRACE(( \" offset runs into EntryTable\" ));\n\n#ifndef GXV_LOAD_TRACE_VARS\n    GXV_LIMIT_CHECK( count * 2 );\n#else\n    while ( p < table + offset + ( count * 2 ) )\n    {\n      FT_UShort insert_glyphID;\n\n\n      GXV_LIMIT_CHECK( 2 );\n      insert_glyphID = FT_NEXT_USHORT( p );\n      GXV_TRACE(( \" 0x%04x\", insert_glyphID ));\n    }\n    GXV_TRACE(( \"\\n\" ));\n#endif\n  }\n\n\n  static void\n  gxv_mort_subtable_type5_entry_validate(\n    FT_Byte                         state,\n    FT_UShort                       flags,\n    GXV_StateTable_GlyphOffsetCPtr  glyphOffset,\n    FT_Bytes                        table,\n    FT_Bytes                        limit,\n    GXV_Validator                   valid )\n  {\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_Bool    setMark;\n    FT_Bool    dontAdvance;\n    FT_Bool    currentIsKashidaLike;\n    FT_Bool    markedIsKashidaLike;\n    FT_Bool    currentInsertBefore;\n    FT_Bool    markedInsertBefore;\n#endif\n    FT_Byte    currentInsertCount;\n    FT_Byte    markedInsertCount;\n    FT_UShort  currentInsertList;\n    FT_UShort  markedInsertList;\n\n    FT_UNUSED( state );\n\n\n#ifdef GXV_LOAD_UNUSED_VARS\n    setMark              = FT_BOOL( ( flags >> 15 ) & 1 );\n    dontAdvance          = FT_BOOL( ( flags >> 14 ) & 1 );\n    currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 );\n    markedIsKashidaLike  = FT_BOOL( ( flags >> 12 ) & 1 );\n    currentInsertBefore  = FT_BOOL( ( flags >> 11 ) & 1 );\n    markedInsertBefore   = FT_BOOL( ( flags >> 10 ) & 1 );\n#endif\n\n    currentInsertCount   = (FT_Byte)( ( flags >> 5 ) & 0x1F   );\n    markedInsertCount    = (FT_Byte)(   flags        & 0x001F );\n\n    currentInsertList    = (FT_UShort)( glyphOffset->ul >> 16 );\n    markedInsertList     = (FT_UShort)( glyphOffset->ul       );\n\n    if ( 0 != currentInsertList && 0 != currentInsertCount )\n    {\n      gxv_mort_subtable_type5_InsertList_validate( currentInsertList,\n                                                   currentInsertCount,\n                                                   table,\n                                                   limit,\n                                                   valid );\n    }\n\n    if ( 0 != markedInsertList && 0 != markedInsertCount )\n    {\n      gxv_mort_subtable_type5_InsertList_validate( markedInsertList,\n                                                   markedInsertCount,\n                                                   table,\n                                                   limit,\n                                                   valid );\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_mort_subtable_type5_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_mort_subtable_type5_StateOptRec      et_rec;\n    GXV_mort_subtable_type5_StateOptRecData  et = &et_rec;\n\n\n    GXV_NAME_ENTER( \"mort chain subtable type5 (Glyph Insertion)\" );\n\n    GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE );\n\n    valid->statetable.optdata =\n      et;\n    valid->statetable.optdata_load_func =\n      NULL;\n    valid->statetable.subtable_setup_func =\n      gxv_mort_subtable_type5_subtable_setup;\n    valid->statetable.entry_glyphoffset_fmt =\n      GXV_GLYPHOFFSET_ULONG;\n    valid->statetable.entry_validate_func =\n      gxv_mort_subtable_type5_entry_validate;\n\n    gxv_StateTable_validate( p, limit, valid );\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmorx.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmorx.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT morx table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2005, 2008 by                                                */\n/*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmorx.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmorx\n\n\n  static void\n  gxv_morx_subtables_validate( FT_Bytes       table,\n                               FT_Bytes       limit,\n                               FT_UShort      nSubtables,\n                               GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_Validate_Func fmt_funcs_table[] =\n    {\n      gxv_morx_subtable_type0_validate, /* 0 */\n      gxv_morx_subtable_type1_validate, /* 1 */\n      gxv_morx_subtable_type2_validate, /* 2 */\n      NULL,                             /* 3 */\n      gxv_morx_subtable_type4_validate, /* 4 */\n      gxv_morx_subtable_type5_validate, /* 5 */\n\n    };\n\n    GXV_Validate_Func  func;\n\n    FT_UShort  i;\n\n\n    GXV_NAME_ENTER( \"subtables in a chain\" );\n\n    for ( i = 0; i < nSubtables; i++ )\n    {\n      FT_ULong  length;\n      FT_ULong  coverage;\n#ifdef GXV_LOAD_UNUSED_VARS\n      FT_ULong  subFeatureFlags;\n#endif\n      FT_ULong  type;\n      FT_ULong  rest;\n\n\n      GXV_LIMIT_CHECK( 4 + 4 + 4 );\n      length          = FT_NEXT_ULONG( p );\n      coverage        = FT_NEXT_ULONG( p );\n#ifdef GXV_LOAD_UNUSED_VARS\n      subFeatureFlags = FT_NEXT_ULONG( p );\n#else\n      p += 4;\n#endif\n\n      GXV_TRACE(( \"validating chain subtable %d/%d (%d bytes)\\n\",\n                  i + 1, nSubtables, length ));\n\n      type = coverage & 0x0007;\n      rest = length - ( 4 + 4 + 4 );\n      GXV_LIMIT_CHECK( rest );\n\n      /* morx coverage consists of mort_coverage & 16bit padding */\n      gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ),\n                                  valid );\n      if ( type > 5 )\n        FT_INVALID_FORMAT;\n\n      func = fmt_funcs_table[type];\n      if ( func == NULL )\n        GXV_TRACE(( \"morx type %d is reserved\\n\", type ));\n\n      func( p, p + rest, valid );\n\n      /* TODO: subFeatureFlags should be unique in a table? */\n      p += rest;\n    }\n\n    valid->subtable_length = p - table;\n\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_morx_chain_validate( FT_Bytes       table,\n                           FT_Bytes       limit,\n                           GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_ULong  defaultFlags;\n#endif\n    FT_ULong  chainLength;\n    FT_ULong  nFeatureFlags;\n    FT_ULong  nSubtables;\n\n\n    GXV_NAME_ENTER( \"morx chain header\" );\n\n    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );\n#ifdef GXV_LOAD_UNUSED_VARS\n    defaultFlags  = FT_NEXT_ULONG( p );\n#else\n    p += 4;\n#endif\n    chainLength   = FT_NEXT_ULONG( p );\n    nFeatureFlags = FT_NEXT_ULONG( p );\n    nSubtables    = FT_NEXT_ULONG( p );\n\n    /* feature-array of morx is same with that of mort */\n    gxv_mort_featurearray_validate( p, limit, nFeatureFlags, valid );\n    p += valid->subtable_length;\n\n    if ( nSubtables >= 0x10000L )\n      FT_INVALID_DATA;\n\n    gxv_morx_subtables_validate( p, table + chainLength,\n                                 (FT_UShort)nSubtables, valid );\n\n    valid->subtable_length = chainLength;\n\n    /* TODO: defaultFlags should be compared with the flags in tables */\n\n    GXV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_morx_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    GXV_ValidatorRec  validrec;\n    GXV_Validator     valid = &validrec;\n    FT_Bytes          p     = table;\n    FT_Bytes          limit = 0;\n    FT_ULong          version;\n    FT_ULong          nChains;\n    FT_ULong          i;\n\n\n    valid->root = ftvalid;\n    valid->face = face;\n\n    FT_TRACE3(( \"validating `morx' table\\n\" ));\n    GXV_INIT;\n\n    GXV_LIMIT_CHECK( 4 + 4 );\n    version = FT_NEXT_ULONG( p );\n    nChains = FT_NEXT_ULONG( p );\n\n    if ( version != 0x00020000UL )\n      FT_INVALID_FORMAT;\n\n    for ( i = 0; i < nChains; i++ )\n    {\n      GXV_TRACE(( \"validating chain %d/%d\\n\", i + 1, nChains ));\n      GXV_32BIT_ALIGNMENT_VALIDATE( p - table );\n      gxv_morx_chain_validate( p, limit, valid );\n      p += valid->subtable_length;\n    }\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmorx.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmorx.h                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT common definition for morx table (specification).     */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __GXVMORX_H__\n#define __GXVMORX_H__\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n#include \"gxvmort.h\"\n\n#include FT_SFNT_NAMES_H\n\n\n  FT_LOCAL( void )\n  gxv_morx_subtable_type0_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_morx_subtable_type1_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_morx_subtable_type2_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_morx_subtable_type4_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n  FT_LOCAL( void )\n  gxv_morx_subtable_type5_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid );\n\n\n#endif /* __GXVMORX_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmorx0.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmorx0.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT morx table validation                                 */\n/*    body for type0 (Indic Script Rearrangement) subtable.                */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmorx.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmorx\n\n\n  static void\n  gxv_morx_subtable_type0_entry_validate(\n    FT_UShort                        state,\n    FT_UShort                        flags,\n    GXV_XStateTable_GlyphOffsetCPtr  glyphOffset_p,\n    FT_Bytes                         table,\n    FT_Bytes                         limit,\n    GXV_Validator                    valid )\n  {\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_UShort  markFirst;\n    FT_UShort  dontAdvance;\n    FT_UShort  markLast;\n#endif\n    FT_UShort  reserved;\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_UShort  verb;\n#endif\n\n    FT_UNUSED( state );\n    FT_UNUSED( glyphOffset_p );\n    FT_UNUSED( table );\n    FT_UNUSED( limit );\n\n\n#ifdef GXV_LOAD_UNUSED_VARS\n    markFirst   = (FT_UShort)( ( flags >> 15 ) & 1 );\n    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );\n    markLast    = (FT_UShort)( ( flags >> 13 ) & 1 );\n#endif\n\n    reserved = (FT_UShort)( flags & 0x1FF0 );\n#ifdef GXV_LOAD_UNUSED_VARS\n    verb     = (FT_UShort)( flags & 0x000F );\n#endif\n\n    if ( 0 < reserved )\n    {\n      GXV_TRACE(( \" non-zero bits found in reserved range\\n\" ));\n      FT_INVALID_DATA;\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_morx_subtable_type0_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n\n    GXV_NAME_ENTER(\n      \"morx chain subtable type0 (Indic-Script Rearrangement)\" );\n\n    GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE );\n\n    valid->xstatetable.optdata               = NULL;\n    valid->xstatetable.optdata_load_func     = NULL;\n    valid->xstatetable.subtable_setup_func   = NULL;\n    valid->xstatetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;\n    valid->xstatetable.entry_validate_func =\n      gxv_morx_subtable_type0_entry_validate;\n\n    gxv_XStateTable_validate( p, limit, valid );\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmorx1.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmorx1.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT morx table validation                                 */\n/*    body for type1 (Contextual Substitution) subtable.                   */\n/*                                                                         */\n/*  Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmorx.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmorx\n\n\n  typedef struct  GXV_morx_subtable_type1_StateOptRec_\n  {\n    FT_ULong   substitutionTable;\n    FT_ULong   substitutionTable_length;\n    FT_UShort  substitutionTable_num_lookupTables;\n\n  }  GXV_morx_subtable_type1_StateOptRec,\n    *GXV_morx_subtable_type1_StateOptRecData;\n\n\n#define GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE \\\n          ( GXV_STATETABLE_HEADER_SIZE + 2 )\n\n\n  static void\n  gxv_morx_subtable_type1_substitutionTable_load( FT_Bytes       table,\n                                                  FT_Bytes       limit,\n                                                  GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_morx_subtable_type1_StateOptRecData  optdata =\n      (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;\n\n\n    GXV_LIMIT_CHECK( 2 );\n    optdata->substitutionTable = FT_NEXT_USHORT( p );\n  }\n\n\n  static void\n  gxv_morx_subtable_type1_subtable_setup( FT_ULong       table_size,\n                                          FT_ULong       classTable,\n                                          FT_ULong       stateArray,\n                                          FT_ULong       entryTable,\n                                          FT_ULong*      classTable_length_p,\n                                          FT_ULong*      stateArray_length_p,\n                                          FT_ULong*      entryTable_length_p,\n                                          GXV_Validator  valid )\n  {\n    FT_ULong  o[4];\n    FT_ULong  *l[4];\n    FT_ULong  buff[5];\n\n    GXV_morx_subtable_type1_StateOptRecData  optdata =\n      (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;\n\n\n    o[0] = classTable;\n    o[1] = stateArray;\n    o[2] = entryTable;\n    o[3] = optdata->substitutionTable;\n    l[0] = classTable_length_p;\n    l[1] = stateArray_length_p;\n    l[2] = entryTable_length_p;\n    l[3] = &(optdata->substitutionTable_length);\n\n    gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid );\n  }\n\n\n  static void\n  gxv_morx_subtable_type1_entry_validate(\n    FT_UShort                       state,\n    FT_UShort                       flags,\n    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n    FT_Bytes                        table,\n    FT_Bytes                        limit,\n    GXV_Validator                   valid )\n  {\n#ifdef GXV_LOAD_TRACE_VARS\n    FT_UShort  setMark;\n    FT_UShort  dontAdvance;\n#endif\n    FT_UShort  reserved;\n    FT_Short   markIndex;\n    FT_Short   currentIndex;\n\n    GXV_morx_subtable_type1_StateOptRecData  optdata =\n      (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;\n\n    FT_UNUSED( state );\n    FT_UNUSED( table );\n    FT_UNUSED( limit );\n\n\n#ifdef GXV_LOAD_TRACE_VARS\n    setMark      = (FT_UShort)( ( flags >> 15 ) & 1 );\n    dontAdvance  = (FT_UShort)( ( flags >> 14 ) & 1 );\n#endif\n\n    reserved = (FT_UShort)( flags & 0x3FFF );\n\n    markIndex    = (FT_Short)( glyphOffset_p->ul >> 16 );\n    currentIndex = (FT_Short)( glyphOffset_p->ul       );\n\n    GXV_TRACE(( \" setMark=%01d dontAdvance=%01d\\n\",\n                setMark, dontAdvance ));\n\n    if ( 0 < reserved )\n    {\n      GXV_TRACE(( \" non-zero bits found in reserved range\\n\" ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );\n    }\n\n    GXV_TRACE(( \"markIndex = %d, currentIndex = %d\\n\",\n                markIndex, currentIndex ));\n\n    if ( optdata->substitutionTable_num_lookupTables < markIndex + 1 )\n      optdata->substitutionTable_num_lookupTables =\n        (FT_Short)( markIndex + 1 );\n\n    if ( optdata->substitutionTable_num_lookupTables < currentIndex + 1 )\n      optdata->substitutionTable_num_lookupTables =\n        (FT_Short)( currentIndex + 1 );\n  }\n\n\n  static void\n  gxv_morx_subtable_type1_LookupValue_validate( FT_UShort            glyph,\n                                                GXV_LookupValueCPtr  value_p,\n                                                GXV_Validator        valid )\n  {\n    FT_UNUSED( glyph ); /* for the non-debugging case */\n\n    GXV_TRACE(( \"morx subtable type1 subst.: %d -> %d\\n\", glyph, value_p->u ));\n\n    if ( value_p->u > valid->face->num_glyphs )\n      FT_INVALID_GLYPH_ID;\n  }\n\n\n  static GXV_LookupValueDesc\n  gxv_morx_subtable_type1_LookupFmt4_transit(\n    FT_UShort            relative_gindex,\n    GXV_LookupValueCPtr  base_value_p,\n    FT_Bytes             lookuptbl_limit,\n    GXV_Validator        valid )\n  {\n    FT_Bytes             p;\n    FT_Bytes             limit;\n    FT_UShort            offset;\n    GXV_LookupValueDesc  value;\n\n    /* XXX: check range? */\n    offset = (FT_UShort)( base_value_p->u +\n                          relative_gindex * sizeof ( FT_UShort ) );\n\n    p     = valid->lookuptbl_head + offset;\n    limit = lookuptbl_limit;\n\n    GXV_LIMIT_CHECK ( 2 );\n    value.u = FT_NEXT_USHORT( p );\n\n    return value;\n  }\n\n\n  /*\n   * TODO: length should be limit?\n   **/\n  static void\n  gxv_morx_subtable_type1_substitutionTable_validate( FT_Bytes       table,\n                                                      FT_Bytes       limit,\n                                                      GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  i;\n\n    GXV_morx_subtable_type1_StateOptRecData  optdata =\n      (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;\n\n\n    /* TODO: calculate offset/length for each lookupTables */\n    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;\n    valid->lookupval_func   = gxv_morx_subtable_type1_LookupValue_validate;\n    valid->lookupfmt4_trans = gxv_morx_subtable_type1_LookupFmt4_transit;\n\n    for ( i = 0; i < optdata->substitutionTable_num_lookupTables; i++ )\n    {\n      FT_ULong  offset;\n\n\n      GXV_LIMIT_CHECK( 4 );\n      offset = FT_NEXT_ULONG( p );\n\n      gxv_LookupTable_validate( table + offset, limit, valid );\n    }\n\n    /* TODO: overlapping of lookupTables in substitutionTable */\n  }\n\n\n  /*\n   * subtable for Contextual glyph substitution is a modified StateTable.\n   * In addition to classTable, stateArray, entryTable, the field\n   * `substitutionTable' is added.\n   */\n  FT_LOCAL_DEF( void )\n  gxv_morx_subtable_type1_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_morx_subtable_type1_StateOptRec  st_rec;\n\n\n    GXV_NAME_ENTER( \"morx chain subtable type1 (Contextual Glyph Subst)\" );\n\n    GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE );\n\n    st_rec.substitutionTable_num_lookupTables = 0;\n\n    valid->xstatetable.optdata =\n      &st_rec;\n    valid->xstatetable.optdata_load_func =\n      gxv_morx_subtable_type1_substitutionTable_load;\n    valid->xstatetable.subtable_setup_func =\n      gxv_morx_subtable_type1_subtable_setup;\n    valid->xstatetable.entry_glyphoffset_fmt =\n      GXV_GLYPHOFFSET_ULONG;\n    valid->xstatetable.entry_validate_func =\n      gxv_morx_subtable_type1_entry_validate;\n\n    gxv_XStateTable_validate( p, limit, valid );\n\n    gxv_morx_subtable_type1_substitutionTable_validate(\n      table + st_rec.substitutionTable,\n      table + st_rec.substitutionTable + st_rec.substitutionTable_length,\n      valid );\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmorx2.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmorx2.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT morx table validation                                 */\n/*    body for type2 (Ligature Substitution) subtable.                     */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmorx.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmorx\n\n\n  typedef struct  GXV_morx_subtable_type2_StateOptRec_\n  {\n    FT_ULong  ligActionTable;\n    FT_ULong  componentTable;\n    FT_ULong  ligatureTable;\n    FT_ULong  ligActionTable_length;\n    FT_ULong  componentTable_length;\n    FT_ULong  ligatureTable_length;\n\n  }  GXV_morx_subtable_type2_StateOptRec,\n    *GXV_morx_subtable_type2_StateOptRecData;\n\n\n#define GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE \\\n          ( GXV_XSTATETABLE_HEADER_SIZE + 4 + 4 + 4 )\n\n\n  static void\n  gxv_morx_subtable_type2_opttable_load( FT_Bytes       table,\n                                         FT_Bytes       limit,\n                                         GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_morx_subtable_type2_StateOptRecData  optdata =\n      (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;\n\n\n    GXV_LIMIT_CHECK( 4 + 4 + 4 );\n    optdata->ligActionTable = FT_NEXT_ULONG( p );\n    optdata->componentTable = FT_NEXT_ULONG( p );\n    optdata->ligatureTable  = FT_NEXT_ULONG( p );\n\n    GXV_TRACE(( \"offset to ligActionTable=0x%08x\\n\",\n                optdata->ligActionTable ));\n    GXV_TRACE(( \"offset to componentTable=0x%08x\\n\",\n                optdata->componentTable ));\n    GXV_TRACE(( \"offset to ligatureTable=0x%08x\\n\",\n                optdata->ligatureTable ));\n  }\n\n\n  static void\n  gxv_morx_subtable_type2_subtable_setup( FT_ULong       table_size,\n                                          FT_ULong       classTable,\n                                          FT_ULong       stateArray,\n                                          FT_ULong       entryTable,\n                                          FT_ULong*      classTable_length_p,\n                                          FT_ULong*      stateArray_length_p,\n                                          FT_ULong*      entryTable_length_p,\n                                          GXV_Validator  valid )\n  {\n    FT_ULong   o[6];\n    FT_ULong*  l[6];\n    FT_ULong   buff[7];\n\n    GXV_morx_subtable_type2_StateOptRecData  optdata =\n      (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;\n\n\n    GXV_NAME_ENTER( \"subtable boundaries setup\" );\n\n    o[0] = classTable;\n    o[1] = stateArray;\n    o[2] = entryTable;\n    o[3] = optdata->ligActionTable;\n    o[4] = optdata->componentTable;\n    o[5] = optdata->ligatureTable;\n    l[0] = classTable_length_p;\n    l[1] = stateArray_length_p;\n    l[2] = entryTable_length_p;\n    l[3] = &(optdata->ligActionTable_length);\n    l[4] = &(optdata->componentTable_length);\n    l[5] = &(optdata->ligatureTable_length);\n\n    gxv_set_length_by_ulong_offset( o, l, buff, 6, table_size, valid );\n\n    GXV_TRACE(( \"classTable: offset=0x%08x length=0x%08x\\n\",\n                classTable, *classTable_length_p ));\n    GXV_TRACE(( \"stateArray: offset=0x%08x length=0x%08x\\n\",\n                stateArray, *stateArray_length_p ));\n    GXV_TRACE(( \"entryTable: offset=0x%08x length=0x%08x\\n\",\n                entryTable, *entryTable_length_p ));\n    GXV_TRACE(( \"ligActionTable: offset=0x%08x length=0x%08x\\n\",\n                optdata->ligActionTable,\n                optdata->ligActionTable_length ));\n    GXV_TRACE(( \"componentTable: offset=0x%08x length=0x%08x\\n\",\n                optdata->componentTable,\n                optdata->componentTable_length ));\n    GXV_TRACE(( \"ligatureTable:  offset=0x%08x length=0x%08x\\n\",\n                optdata->ligatureTable,\n                optdata->ligatureTable_length ));\n\n    GXV_EXIT;\n  }\n\n\n#define GXV_MORX_LIGACTION_ENTRY_SIZE  4\n\n\n  static void\n  gxv_morx_subtable_type2_ligActionIndex_validate(\n    FT_Bytes       table,\n    FT_UShort      ligActionIndex,\n    GXV_Validator  valid )\n  {\n    /* access ligActionTable */\n    GXV_morx_subtable_type2_StateOptRecData optdata =\n      (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;\n\n    FT_Bytes lat_base  = table + optdata->ligActionTable;\n    FT_Bytes p         = lat_base +\n                         ligActionIndex * GXV_MORX_LIGACTION_ENTRY_SIZE;\n    FT_Bytes lat_limit = lat_base + optdata->ligActionTable;\n\n\n    if ( p < lat_base )\n    {\n      GXV_TRACE(( \"p < lat_base (%d byte rewind)\\n\", lat_base - p ));\n      FT_INVALID_OFFSET;\n    }\n    else if ( lat_limit < p )\n    {\n      GXV_TRACE(( \"lat_limit < p (%d byte overrun)\\n\", p - lat_limit ));\n      FT_INVALID_OFFSET;\n    }\n\n    {\n      /* validate entry in ligActionTable */\n      FT_ULong   lig_action;\n#ifdef GXV_LOAD_UNUSED_VARS\n      FT_UShort  last;\n      FT_UShort  store;\n#endif\n      FT_ULong   offset;\n      FT_Long    gid_limit;\n\n\n      lig_action = FT_NEXT_ULONG( p );\n#ifdef GXV_LOAD_UNUSED_VARS\n      last       = (FT_UShort)( ( lig_action >> 31 ) & 1 );\n      store      = (FT_UShort)( ( lig_action >> 30 ) & 1 );\n#endif\n\n      offset = lig_action & 0x3FFFFFFFUL;\n\n      /* this offset is 30-bit signed value to add to GID */\n      /* it is different from the location offset in mort */\n      if ( ( offset & 0x3FFF0000UL ) == 0x3FFF0000UL )\n      { /* negative offset */\n        gid_limit = valid->face->num_glyphs - ( offset & 0x0000FFFFUL );\n        if ( gid_limit > 0 )\n          return;\n\n        GXV_TRACE(( \"ligature action table includes\"\n                    \" too negative offset moving all GID\"\n                    \" below defined range: 0x%04x\\n\",\n                    offset & 0xFFFFU ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n      }\n      else if ( ( offset & 0x3FFF0000UL ) == 0x0000000UL )\n      { /* positive offset */\n        if ( (FT_Long)offset < valid->face->num_glyphs )\n          return;\n\n        GXV_TRACE(( \"ligature action table includes\"\n                    \" too large offset moving all GID\"\n                    \" over defined range: 0x%04x\\n\",\n                    offset & 0xFFFFU ));\n        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n      }\n\n      GXV_TRACE(( \"ligature action table includes\"\n                  \" invalid offset to add to 16-bit GID:\"\n                  \" 0x%08x\\n\", offset ));\n      GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );\n    }\n  }\n\n\n  static void\n  gxv_morx_subtable_type2_entry_validate(\n    FT_UShort                       state,\n    FT_UShort                       flags,\n    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n    FT_Bytes                        table,\n    FT_Bytes                        limit,\n    GXV_Validator                   valid )\n  {\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_UShort  setComponent;\n    FT_UShort  dontAdvance;\n    FT_UShort  performAction;\n#endif\n    FT_UShort  reserved;\n    FT_UShort  ligActionIndex;\n\n    FT_UNUSED( state );\n    FT_UNUSED( limit );\n\n\n#ifdef GXV_LOAD_UNUSED_VARS\n    setComponent   = (FT_UShort)( ( flags >> 15 ) & 1 );\n    dontAdvance    = (FT_UShort)( ( flags >> 14 ) & 1 );\n    performAction  = (FT_UShort)( ( flags >> 13 ) & 1 );\n#endif\n\n    reserved       = (FT_UShort)( flags & 0x1FFF );\n    ligActionIndex = glyphOffset_p->u;\n\n    if ( reserved > 0 )\n      GXV_TRACE(( \"  reserved 14bit is non-zero\\n\" ));\n\n    if ( 0 < ligActionIndex )\n      gxv_morx_subtable_type2_ligActionIndex_validate(\n        table, ligActionIndex, valid );\n  }\n\n\n  static void\n  gxv_morx_subtable_type2_ligatureTable_validate( FT_Bytes       table,\n                                                  GXV_Validator  valid )\n  {\n    GXV_morx_subtable_type2_StateOptRecData  optdata =\n      (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;\n\n    FT_Bytes p     = table + optdata->ligatureTable;\n    FT_Bytes limit = table + optdata->ligatureTable\n                           + optdata->ligatureTable_length;\n\n\n    GXV_NAME_ENTER( \"morx chain subtable type2 - substitutionTable\" );\n\n    if ( 0 != optdata->ligatureTable )\n    {\n      /* Apple does not give specification of ligatureTable format */\n      while ( p < limit )\n      {\n        FT_UShort  lig_gid;\n\n\n        GXV_LIMIT_CHECK( 2 );\n        lig_gid = FT_NEXT_USHORT( p );\n        if ( lig_gid < valid->face->num_glyphs )\n          GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );\n      }\n    }\n\n    GXV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_morx_subtable_type2_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_morx_subtable_type2_StateOptRec  lig_rec;\n\n\n    GXV_NAME_ENTER( \"morx chain subtable type2 (Ligature Substitution)\" );\n\n    GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE );\n\n    valid->xstatetable.optdata =\n      &lig_rec;\n    valid->xstatetable.optdata_load_func =\n      gxv_morx_subtable_type2_opttable_load;\n    valid->xstatetable.subtable_setup_func =\n      gxv_morx_subtable_type2_subtable_setup;\n    valid->xstatetable.entry_glyphoffset_fmt =\n      GXV_GLYPHOFFSET_USHORT;\n    valid->xstatetable.entry_validate_func =\n      gxv_morx_subtable_type2_entry_validate;\n\n    gxv_XStateTable_validate( p, limit, valid );\n\n    p += valid->subtable_length;\n    gxv_morx_subtable_type2_ligatureTable_validate( table, valid );\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmorx4.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmorx4.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT morx table validation                                 */\n/*    body for \"morx\" type4 (Non-Contextual Glyph Substitution) subtable.  */\n/*                                                                         */\n/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmorx.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmorx\n\n\n  FT_LOCAL_DEF( void )\n  gxv_morx_subtable_type4_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    GXV_NAME_ENTER( \"morx chain subtable type4 \"\n                    \"(Non-Contextual Glyph Substitution)\" );\n\n    gxv_mort_subtable_type4_validate( table, limit, valid );\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvmorx5.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvmorx5.c                                                             */\n/*                                                                         */\n/*    TrueTypeGX/AAT morx table validation                                 */\n/*    body for type5 (Contextual Glyph Insertion) subtable.                */\n/*                                                                         */\n/*  Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvmorx.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvmorx\n\n\n  /*\n   * `morx' subtable type5 (Contextual Glyph Insertion)\n   * has format of a StateTable with insertion-glyph-list\n   * without name.  However, the 32bit offset from the head\n   * of subtable to the i-g-l is given after `entryTable',\n   * without variable name specification (the existence of\n   * this offset to the table is different from mort type5).\n   */\n\n\n  typedef struct  GXV_morx_subtable_type5_StateOptRec_\n  {\n    FT_ULong  insertionGlyphList;\n    FT_ULong  insertionGlyphList_length;\n\n  }  GXV_morx_subtable_type5_StateOptRec,\n    *GXV_morx_subtable_type5_StateOptRecData;\n\n\n#define GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE \\\n          ( GXV_STATETABLE_HEADER_SIZE + 4 )\n\n\n  static void\n  gxv_morx_subtable_type5_insertionGlyphList_load( FT_Bytes       table,\n                                                   FT_Bytes       limit,\n                                                   GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_morx_subtable_type5_StateOptRecData  optdata =\n      (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata;\n\n\n    GXV_LIMIT_CHECK( 4 );\n    optdata->insertionGlyphList = FT_NEXT_ULONG( p );\n  }\n\n\n  static void\n  gxv_morx_subtable_type5_subtable_setup( FT_ULong       table_size,\n                                          FT_ULong       classTable,\n                                          FT_ULong       stateArray,\n                                          FT_ULong       entryTable,\n                                          FT_ULong*      classTable_length_p,\n                                          FT_ULong*      stateArray_length_p,\n                                          FT_ULong*      entryTable_length_p,\n                                          GXV_Validator  valid )\n  {\n    FT_ULong   o[4];\n    FT_ULong*  l[4];\n    FT_ULong   buff[5];\n\n    GXV_morx_subtable_type5_StateOptRecData  optdata =\n      (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata;\n\n\n    o[0] = classTable;\n    o[1] = stateArray;\n    o[2] = entryTable;\n    o[3] = optdata->insertionGlyphList;\n    l[0] = classTable_length_p;\n    l[1] = stateArray_length_p;\n    l[2] = entryTable_length_p;\n    l[3] = &(optdata->insertionGlyphList_length);\n\n    gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid );\n  }\n\n\n  static void\n  gxv_morx_subtable_type5_InsertList_validate( FT_UShort      table_index,\n                                               FT_UShort      count,\n                                               FT_Bytes       table,\n                                               FT_Bytes       limit,\n                                               GXV_Validator  valid )\n  {\n    FT_Bytes p = table + table_index * 2;\n\n\n#ifndef GXV_LOAD_TRACE_VARS\n    GXV_LIMIT_CHECK( count * 2 );\n#else\n    while ( p < table + count * 2 + table_index * 2 )\n    {\n      FT_UShort  insert_glyphID;\n\n\n      GXV_LIMIT_CHECK( 2 );\n      insert_glyphID = FT_NEXT_USHORT( p );\n      GXV_TRACE(( \" 0x%04x\", insert_glyphID ));\n    }\n\n    GXV_TRACE(( \"\\n\" ));\n#endif\n  }\n\n\n  static void\n  gxv_morx_subtable_type5_entry_validate(\n    FT_UShort                       state,\n    FT_UShort                       flags,\n    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,\n    FT_Bytes                        table,\n    FT_Bytes                        limit,\n    GXV_Validator                   valid )\n  {\n#ifdef GXV_LOAD_UNUSED_VARS\n    FT_Bool    setMark;\n    FT_Bool    dontAdvance;\n    FT_Bool    currentIsKashidaLike;\n    FT_Bool    markedIsKashidaLike;\n    FT_Bool    currentInsertBefore;\n    FT_Bool    markedInsertBefore;\n#endif\n    FT_Byte    currentInsertCount;\n    FT_Byte    markedInsertCount;\n    FT_Byte    currentInsertList;\n    FT_UShort  markedInsertList;\n\n    FT_UNUSED( state );\n\n\n#ifdef GXV_LOAD_UNUSED_VARS\n    setMark              = FT_BOOL( ( flags >> 15 ) & 1 );\n    dontAdvance          = FT_BOOL( ( flags >> 14 ) & 1 );\n    currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 );\n    markedIsKashidaLike  = FT_BOOL( ( flags >> 12 ) & 1 );\n    currentInsertBefore  = FT_BOOL( ( flags >> 11 ) & 1 );\n    markedInsertBefore   = FT_BOOL( ( flags >> 10 ) & 1 );\n#endif\n\n    currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F   );\n    markedInsertCount  = (FT_Byte)(   flags        & 0x001F );\n\n    currentInsertList = (FT_Byte)  ( glyphOffset_p->ul >> 16 );\n    markedInsertList  = (FT_UShort)( glyphOffset_p->ul       );\n\n    if ( currentInsertList && 0 != currentInsertCount )\n      gxv_morx_subtable_type5_InsertList_validate( currentInsertList,\n                                                   currentInsertCount,\n                                                   table, limit,\n                                                   valid );\n\n    if ( markedInsertList && 0 != markedInsertCount )\n      gxv_morx_subtable_type5_InsertList_validate( markedInsertList,\n                                                   markedInsertCount,\n                                                   table, limit,\n                                                   valid );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  gxv_morx_subtable_type5_validate( FT_Bytes       table,\n                                    FT_Bytes       limit,\n                                    GXV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n\n    GXV_morx_subtable_type5_StateOptRec      et_rec;\n    GXV_morx_subtable_type5_StateOptRecData  et = &et_rec;\n\n\n    GXV_NAME_ENTER( \"morx chain subtable type5 (Glyph Insertion)\" );\n\n    GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE );\n\n    valid->xstatetable.optdata =\n      et;\n    valid->xstatetable.optdata_load_func =\n      gxv_morx_subtable_type5_insertionGlyphList_load;\n    valid->xstatetable.subtable_setup_func =\n      gxv_morx_subtable_type5_subtable_setup;\n    valid->xstatetable.entry_glyphoffset_fmt =\n      GXV_GLYPHOFFSET_ULONG;\n    valid->xstatetable.entry_validate_func =\n      gxv_morx_subtable_type5_entry_validate;\n\n    gxv_XStateTable_validate( p, limit, valid );\n\n    GXV_EXIT;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvopbd.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvopbd.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT opbd table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvopbd\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      Data and Types                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  GXV_opbd_DataRec_\n  {\n    FT_UShort  format;\n    FT_UShort  valueOffset_min;\n\n  } GXV_opbd_DataRec, *GXV_opbd_Data;\n\n\n#define GXV_OPBD_DATA( FIELD )  GXV_TABLE_DATA( opbd, FIELD )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  gxv_opbd_LookupValue_validate( FT_UShort            glyph,\n                                 GXV_LookupValueCPtr  value_p,\n                                 GXV_Validator        valid )\n  {\n    /* offset in LookupTable is measured from the head of opbd table */\n    FT_Bytes   p     = valid->root->base + value_p->u;\n    FT_Bytes   limit = valid->root->limit;\n    FT_Short   delta_value;\n    int        i;\n\n\n    if ( value_p->u < GXV_OPBD_DATA( valueOffset_min ) )\n      GXV_OPBD_DATA( valueOffset_min ) = value_p->u;\n\n    for ( i = 0; i < 4; i++ )\n    {\n      GXV_LIMIT_CHECK( 2 );\n      delta_value = FT_NEXT_SHORT( p );\n\n      if ( GXV_OPBD_DATA( format ) )    /* format 1, value is ctrl pt. */\n      {\n        if ( delta_value == -1 )\n          continue;\n\n        gxv_ctlPoint_validate( glyph, delta_value, valid );\n      }\n      else                              /* format 0, value is distance */\n        continue;\n    }\n  }\n\n\n  /*\n    opbd ---------------------+\n                              |\n    +===============+         |\n    | lookup header |         |\n    +===============+         |\n    | BinSrchHeader |         |\n    +===============+         |\n    | lastGlyph[0]  |         |\n    +---------------+         |\n    | firstGlyph[0] |         |  head of opbd sfnt table\n    +---------------+         |             +\n    | offset[0]     |    ->   |          offset            [byte]\n    +===============+         |             +\n    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte]\n    +---------------+         |\n    | firstGlyph[1] |         |\n    +---------------+         |\n    | offset[1]     |         |\n    +===============+         |\n                              |\n     ....                     |\n                              |\n    48bit value array         |\n    +===============+         |\n    |     value     | <-------+\n    |               |\n    |               |\n    |               |\n    +---------------+\n    .... */\n\n  static GXV_LookupValueDesc\n  gxv_opbd_LookupFmt4_transit( FT_UShort            relative_gindex,\n                               GXV_LookupValueCPtr  base_value_p,\n                               FT_Bytes             lookuptbl_limit,\n                               GXV_Validator        valid )\n  {\n    GXV_LookupValueDesc  value;\n\n    FT_UNUSED( lookuptbl_limit );\n    FT_UNUSED( valid );\n\n    /* XXX: check range? */\n    value.u = (FT_UShort)( base_value_p->u +\n                           relative_gindex * 4 * sizeof ( FT_Short ) );\n\n    return value;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         opbd TABLE                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  gxv_opbd_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    GXV_ValidatorRec  validrec;\n    GXV_Validator     valid = &validrec;\n    GXV_opbd_DataRec  opbdrec;\n    GXV_opbd_Data     opbd  = &opbdrec;\n    FT_Bytes          p     = table;\n    FT_Bytes          limit = 0;\n\n    FT_ULong  version;\n\n\n    valid->root       = ftvalid;\n    valid->table_data = opbd;\n    valid->face       = face;\n\n    FT_TRACE3(( \"validating `opbd' table\\n\" ));\n    GXV_INIT;\n    GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU;\n\n\n    GXV_LIMIT_CHECK( 4 + 2 );\n    version                 = FT_NEXT_ULONG( p );\n    GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p );\n\n\n    /* only 0x00010000 is defined (1996) */\n    GXV_TRACE(( \"(version=0x%08x)\\n\", version ));\n    if ( 0x00010000UL != version )\n      FT_INVALID_FORMAT;\n\n    /* only values 0 and 1 are defined (1996) */\n    GXV_TRACE(( \"(format=0x%04x)\\n\", GXV_OPBD_DATA( format ) ));\n    if ( 0x0001 < GXV_OPBD_DATA( format ) )\n      FT_INVALID_FORMAT;\n\n    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;\n    valid->lookupval_func   = gxv_opbd_LookupValue_validate;\n    valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit;\n\n    gxv_LookupTable_validate( p, limit, valid );\n    p += valid->subtable_length;\n\n    if ( p > table + GXV_OPBD_DATA( valueOffset_min ) )\n    {\n      GXV_TRACE((\n        \"found overlap between LookupTable and opbd_value array\\n\" ));\n      FT_INVALID_OFFSET;\n    }\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvprop.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvprop.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT prop table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvprop\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      Data and Types                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define GXV_PROP_HEADER_SIZE  ( 4 + 2 + 2 )\n#define GXV_PROP_SIZE_MIN     GXV_PROP_HEADER_SIZE\n\n  typedef struct  GXV_prop_DataRec_\n  {\n    FT_Fixed  version;\n\n  } GXV_prop_DataRec, *GXV_prop_Data;\n\n#define GXV_PROP_DATA( field )  GXV_TABLE_DATA( prop, field )\n\n#define GXV_PROP_FLOATER                      0x8000U\n#define GXV_PROP_USE_COMPLEMENTARY_BRACKET    0x1000U\n#define GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET 0x0F00U\n#define GXV_PROP_ATTACHING_TO_RIGHT           0x0080U\n#define GXV_PROP_RESERVED                     0x0060U\n#define GXV_PROP_DIRECTIONALITY_CLASS         0x001FU\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  gxv_prop_zero_advance_validate( FT_UShort      gid,\n                                  GXV_Validator  valid )\n  {\n    FT_Face       face;\n    FT_Error      error;\n    FT_GlyphSlot  glyph;\n\n\n    GXV_NAME_ENTER( \"zero advance\" );\n\n    face = valid->face;\n\n    error = FT_Load_Glyph( face,\n                           gid,\n                           FT_LOAD_IGNORE_TRANSFORM );\n    if ( error )\n      FT_INVALID_GLYPH_ID;\n\n    glyph = face->glyph;\n\n    if ( glyph->advance.x != (FT_Pos)0 ||\n         glyph->advance.y != (FT_Pos)0 )\n    {\n      GXV_TRACE(( \"  found non-zero advance in zero-advance glyph\\n\" ));\n      FT_INVALID_DATA;\n    }\n\n    GXV_EXIT;\n  }\n\n\n  /* Pass 0 as GLYPH to check the default property */\n  static void\n  gxv_prop_property_validate( FT_UShort      property,\n                              FT_UShort      glyph,\n                              GXV_Validator  valid )\n  {\n    if ( glyph != 0 && ( property & GXV_PROP_FLOATER ) )\n      gxv_prop_zero_advance_validate( glyph, valid );\n\n    if ( property & GXV_PROP_USE_COMPLEMENTARY_BRACKET )\n    {\n      FT_UShort  offset;\n      char       complement;\n\n\n      offset = (FT_UShort)( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET );\n      if ( offset == 0 )\n      {\n        GXV_TRACE(( \"  found zero offset to property\\n\" ));\n        FT_INVALID_OFFSET;\n      }\n\n      complement = (char)( offset >> 8 );\n      if ( complement & 0x08 )\n      {\n        /* Top bit is set: negative */\n\n        /* Calculate the absolute offset */\n        complement = (char)( ( complement & 0x07 ) + 1 );\n\n        /* The gid for complement must be greater than 0 */\n        if ( glyph <= complement )\n        {\n          GXV_TRACE(( \"  found non-positive glyph complement\\n\" ));\n          FT_INVALID_DATA;\n        }\n      }\n      else\n      {\n        /* The gid for complement must be the face. */\n        gxv_glyphid_validate( (FT_UShort)( glyph + complement ), valid );\n      }\n    }\n    else\n    {\n      if ( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET )\n        GXV_TRACE(( \"glyph %d cannot have complementary bracketing\\n\",\n                    glyph ));\n    }\n\n    /* this is introduced in version 2.0 */\n    if ( property & GXV_PROP_ATTACHING_TO_RIGHT )\n    {\n      if ( GXV_PROP_DATA( version ) == 0x00010000UL )\n      {\n        GXV_TRACE(( \"  found older version (1.0) in new version table\\n\" ));\n        FT_INVALID_DATA;\n      }\n    }\n\n    if ( property & GXV_PROP_RESERVED )\n    {\n      GXV_TRACE(( \"  found non-zero bits in reserved bits\\n\" ));\n      FT_INVALID_DATA;\n    }\n\n    if ( ( property & GXV_PROP_DIRECTIONALITY_CLASS ) > 11 )\n    {\n      /* TODO: Too restricted. Use the validation level. */\n      if ( GXV_PROP_DATA( version ) == 0x00010000UL ||\n           GXV_PROP_DATA( version ) == 0x00020000UL )\n      {\n        GXV_TRACE(( \"  found too old version in directionality class\\n\" ));\n        FT_INVALID_DATA;\n      }\n    }\n  }\n\n\n  static void\n  gxv_prop_LookupValue_validate( FT_UShort            glyph,\n                                 GXV_LookupValueCPtr  value_p,\n                                 GXV_Validator        valid )\n  {\n    gxv_prop_property_validate( value_p->u, glyph, valid );\n  }\n\n\n  /*\n    +===============+ --------+\n    | lookup header |         |\n    +===============+         |\n    | BinSrchHeader |         |\n    +===============+         |\n    | lastGlyph[0]  |         |\n    +---------------+         |\n    | firstGlyph[0] |         |    head of lookup table\n    +---------------+         |             +\n    | offset[0]     |    ->   |          offset            [byte]\n    +===============+         |             +\n    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]\n    +---------------+         |\n    | firstGlyph[1] |         |\n    +---------------+         |\n    | offset[1]     |         |\n    +===============+         |\n                              |\n     ...                      |\n                              |\n    16bit value array         |\n    +===============+         |\n    |     value     | <-------+\n    ...\n  */\n\n  static GXV_LookupValueDesc\n  gxv_prop_LookupFmt4_transit( FT_UShort            relative_gindex,\n                               GXV_LookupValueCPtr  base_value_p,\n                               FT_Bytes             lookuptbl_limit,\n                               GXV_Validator        valid )\n  {\n    FT_Bytes             p;\n    FT_Bytes             limit;\n    FT_UShort            offset;\n    GXV_LookupValueDesc  value;\n\n    /* XXX: check range? */\n    offset = (FT_UShort)( base_value_p->u +\n                          relative_gindex * sizeof ( FT_UShort ) );\n    p      = valid->lookuptbl_head + offset;\n    limit  = lookuptbl_limit;\n\n    GXV_LIMIT_CHECK ( 2 );\n    value.u = FT_NEXT_USHORT( p );\n\n    return value;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         prop TABLE                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  gxv_prop_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    FT_Bytes          p     = table;\n    FT_Bytes          limit = 0;\n    GXV_ValidatorRec  validrec;\n    GXV_Validator     valid = &validrec;\n\n    GXV_prop_DataRec  proprec;\n    GXV_prop_Data     prop = &proprec;\n\n    FT_Fixed          version;\n    FT_UShort         format;\n    FT_UShort         defaultProp;\n\n\n    valid->root       = ftvalid;\n    valid->table_data = prop;\n    valid->face       = face;\n\n    FT_TRACE3(( \"validating `prop' table\\n\" ));\n    GXV_INIT;\n\n    GXV_LIMIT_CHECK( 4 + 2 + 2 );\n    version     = FT_NEXT_ULONG( p );\n    format      = FT_NEXT_USHORT( p );\n    defaultProp = FT_NEXT_USHORT( p );\n\n    GXV_TRACE(( \"  version 0x%08x\\n\", version ));\n    GXV_TRACE(( \"  format  0x%04x\\n\", format ));\n    GXV_TRACE(( \"  defaultProp  0x%04x\\n\", defaultProp ));\n\n    /* only versions 1.0, 2.0, 3.0 are defined (1996) */\n    if ( version != 0x00010000UL &&\n         version != 0x00020000UL &&\n         version != 0x00030000UL )\n    {\n      GXV_TRACE(( \"  found unknown version\\n\" ));\n      FT_INVALID_FORMAT;\n    }\n\n\n    /* only formats 0x0000, 0x0001 are defined (1996) */\n    if ( format > 1 )\n    {\n      GXV_TRACE(( \"  found unknown format\\n\" ));\n      FT_INVALID_FORMAT;\n    }\n\n    gxv_prop_property_validate( defaultProp, 0, valid );\n\n    if ( format == 0 )\n    {\n      FT_TRACE3(( \"(format 0, no per-glyph properties, \"\n                  \"remaining %d bytes are skipped)\", limit - p ));\n      goto Exit;\n    }\n\n    /* format == 1 */\n    GXV_PROP_DATA( version ) = version;\n\n    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;\n    valid->lookupval_func   = gxv_prop_LookupValue_validate;\n    valid->lookupfmt4_trans = gxv_prop_LookupFmt4_transit;\n\n    gxv_LookupTable_validate( p, limit, valid );\n\n  Exit:\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/gxvtrak.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  gxvtrak.c                                                              */\n/*                                                                         */\n/*    TrueTypeGX/AAT trak table validation (body).                         */\n/*                                                                         */\n/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n/***************************************************************************/\n/*                                                                         */\n/* gxvalid is derived from both gxlayout module and otvalid module.        */\n/* Development of gxlayout is supported by the Information-technology      */\n/* Promotion Agency(IPA), Japan.                                           */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"gxvalid.h\"\n#include \"gxvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_gxvtrak\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      Data and Types                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n    /*\n     * referred track table format specification:\n     * http://developer.apple.com/fonts/TTRefMan/RM06/Chap6trak.html\n     * last update was 1996.\n     * ----------------------------------------------\n     * [MINIMUM HEADER]: GXV_TRAK_SIZE_MIN\n     * version          (fixed:  32bit) = 0x00010000\n     * format           (uint16: 16bit) = 0 is only defined (1996)\n     * horizOffset      (uint16: 16bit)\n     * vertOffset       (uint16: 16bit)\n     * reserved         (uint16: 16bit) = 0\n     * ----------------------------------------------\n     * [VARIABLE BODY]:\n     * horizData\n     *   header         ( 2 + 2 + 4\n     *   trackTable       + nTracks * ( 4 + 2 + 2 )\n     *   sizeTable        + nSizes * 4 )\n     * ----------------------------------------------\n     * vertData\n     *   header         ( 2 + 2 + 4\n     *   trackTable       + nTracks * ( 4 + 2 + 2 )\n     *   sizeTable        + nSizes * 4 )\n     * ----------------------------------------------\n     */\n  typedef struct  GXV_trak_DataRec_\n  {\n    FT_UShort  trackValueOffset_min;\n    FT_UShort  trackValueOffset_max;\n\n  } GXV_trak_DataRec, *GXV_trak_Data;\n\n\n#define GXV_TRAK_DATA( FIELD )  GXV_TABLE_DATA( trak, FIELD )\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  gxv_trak_trackTable_validate( FT_Bytes       table,\n                                FT_Bytes       limit,\n                                FT_UShort      nTracks,\n                                GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n\n    FT_Fixed   track, t;\n    FT_UShort  nameIndex;\n    FT_UShort  offset;\n    FT_UShort  i, j;\n\n\n    GXV_NAME_ENTER( \"trackTable\" );\n\n    GXV_TRAK_DATA( trackValueOffset_min ) = 0xFFFFU;\n    GXV_TRAK_DATA( trackValueOffset_max ) = 0x0000;\n\n    GXV_LIMIT_CHECK( nTracks * ( 4 + 2 + 2 ) );\n\n    for ( i = 0; i < nTracks; i ++ )\n    {\n      p = table + i * ( 4 + 2 + 2 );\n      track     = FT_NEXT_LONG( p );\n      nameIndex = FT_NEXT_USHORT( p );\n      offset    = FT_NEXT_USHORT( p );\n\n      if ( offset < GXV_TRAK_DATA( trackValueOffset_min ) )\n        GXV_TRAK_DATA( trackValueOffset_min ) = offset;\n      if ( offset > GXV_TRAK_DATA( trackValueOffset_max ) )\n        GXV_TRAK_DATA( trackValueOffset_max ) = offset;\n\n      gxv_sfntName_validate( nameIndex, 256, 32767, valid );\n\n      for ( j = i; j < nTracks; j ++ )\n      {\n         p = table + j * ( 4 + 2 + 2 );\n         t = FT_NEXT_LONG( p );\n         if ( t == track )\n           GXV_TRACE(( \"duplicated entries found for track value 0x%x\\n\",\n                        track ));\n      }\n    }\n\n    valid->subtable_length = p - table;\n    GXV_EXIT;\n  }\n\n\n  static void\n  gxv_trak_trackData_validate( FT_Bytes       table,\n                               FT_Bytes       limit,\n                               GXV_Validator  valid )\n  {\n    FT_Bytes   p = table;\n    FT_UShort  nTracks;\n    FT_UShort  nSizes;\n    FT_ULong   sizeTableOffset;\n\n    GXV_ODTECT( 4, odtect );\n\n\n    GXV_ODTECT_INIT( odtect );\n    GXV_NAME_ENTER( \"trackData\" );\n\n    /* read the header of trackData */\n    GXV_LIMIT_CHECK( 2 + 2 + 4 );\n    nTracks         = FT_NEXT_USHORT( p );\n    nSizes          = FT_NEXT_USHORT( p );\n    sizeTableOffset = FT_NEXT_ULONG( p );\n\n    gxv_odtect_add_range( table, p - table, \"trackData header\", odtect );\n\n    /* validate trackTable */\n    gxv_trak_trackTable_validate( p, limit, nTracks, valid );\n    gxv_odtect_add_range( p, valid->subtable_length,\n                          \"trackTable\", odtect );\n\n    /* sizeTable is array of FT_Fixed, don't check contents */\n    p = valid->root->base + sizeTableOffset;\n    GXV_LIMIT_CHECK( nSizes * 4 );\n    gxv_odtect_add_range( p, nSizes * 4, \"sizeTable\", odtect );\n\n    /* validate trackValueOffet */\n    p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_min );\n    if ( limit - p < nTracks * nSizes * 2 )\n      GXV_TRACE(( \"too short trackValue array\\n\" ));\n\n    p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_max );\n    GXV_LIMIT_CHECK( nSizes * 2 );\n\n    gxv_odtect_add_range( valid->root->base\n                            + GXV_TRAK_DATA( trackValueOffset_min ),\n                          GXV_TRAK_DATA( trackValueOffset_max )\n                            - GXV_TRAK_DATA( trackValueOffset_min )\n                            + nSizes * 2,\n                          \"trackValue array\", odtect );\n\n    gxv_odtect_validate( odtect, valid );\n\n    GXV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          trak TABLE                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  gxv_trak_validate( FT_Bytes      table,\n                     FT_Face       face,\n                     FT_Validator  ftvalid )\n  {\n    FT_Bytes          p = table;\n    FT_Bytes          limit = 0;\n\n    GXV_ValidatorRec  validrec;\n    GXV_Validator     valid = &validrec;\n    GXV_trak_DataRec  trakrec;\n    GXV_trak_Data     trak = &trakrec;\n\n    FT_ULong   version;\n    FT_UShort  format;\n    FT_UShort  horizOffset;\n    FT_UShort  vertOffset;\n    FT_UShort  reserved;\n\n\n    GXV_ODTECT( 3, odtect );\n\n    GXV_ODTECT_INIT( odtect );\n    valid->root       = ftvalid;\n    valid->table_data = trak;\n    valid->face       = face;\n\n    limit      = valid->root->limit;\n\n    FT_TRACE3(( \"validating `trak' table\\n\" ));\n    GXV_INIT;\n\n    GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 + 2 );\n    version     = FT_NEXT_ULONG( p );\n    format      = FT_NEXT_USHORT( p );\n    horizOffset = FT_NEXT_USHORT( p );\n    vertOffset  = FT_NEXT_USHORT( p );\n    reserved    = FT_NEXT_USHORT( p );\n\n    GXV_TRACE(( \" (version = 0x%08x)\\n\", version ));\n    GXV_TRACE(( \" (format = 0x%04x)\\n\", format ));\n    GXV_TRACE(( \" (horizOffset = 0x%04x)\\n\", horizOffset ));\n    GXV_TRACE(( \" (vertOffset = 0x%04x)\\n\", vertOffset ));\n    GXV_TRACE(( \" (reserved = 0x%04x)\\n\", reserved ));\n\n    /* Version 1.0 (always:1996) */\n    if ( version != 0x00010000UL )\n      FT_INVALID_FORMAT;\n\n    /* format 0 (always:1996) */\n    if ( format != 0x0000 )\n      FT_INVALID_FORMAT;\n\n    GXV_32BIT_ALIGNMENT_VALIDATE( horizOffset );\n    GXV_32BIT_ALIGNMENT_VALIDATE( vertOffset );\n\n    /* Reserved Fixed Value (always) */\n    if ( reserved != 0x0000 )\n      FT_INVALID_DATA;\n\n    /* validate trackData */\n    if ( 0 < horizOffset )\n    {\n      gxv_trak_trackData_validate( table + horizOffset, limit, valid );\n      gxv_odtect_add_range( table + horizOffset, valid->subtable_length,\n                            \"horizJustData\", odtect );\n    }\n\n    if ( 0 < vertOffset )\n    {\n      gxv_trak_trackData_validate( table + vertOffset, limit, valid );\n      gxv_odtect_add_range( table + vertOffset, valid->subtable_length,\n                            \"vertJustData\", odtect );\n    }\n\n    gxv_odtect_validate( odtect, valid );\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/module.mk",
    "content": "#\n# FreeType 2 gxvalid module definition\n#\n\n# Copyright 2004, 2005, 2006\n#   by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,\n#   David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += GXVALID_MODULE\n\ndefine GXVALID_MODULE\n$(OPEN_DRIVER) FT_Module_Class, gxv_module_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)gxvalid   $(ECHO_DRIVER_DESC)TrueTypeGX/AAT validation module$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/gxvalid/rules.mk",
    "content": "#\n# FreeType 2 TrueTypeGX/AAT validation driver configuration rules\n#\n\n\n# Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# GXV driver directory\n#\nGXV_DIR := $(SRC_DIR)/gxvalid\n\n\n# compilation flags for the driver\n#\nGXV_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(GXV_DIR))\n\n\n# GXV driver sources (i.e., C files)\n#\nGXV_DRV_SRC := $(GXV_DIR)/gxvcommn.c \\\n               $(GXV_DIR)/gxvfeat.c  \\\n               $(GXV_DIR)/gxvbsln.c  \\\n               $(GXV_DIR)/gxvtrak.c  \\\n               $(GXV_DIR)/gxvopbd.c  \\\n               $(GXV_DIR)/gxvprop.c  \\\n               $(GXV_DIR)/gxvjust.c  \\\n               $(GXV_DIR)/gxvmort.c  \\\n               $(GXV_DIR)/gxvmort0.c \\\n               $(GXV_DIR)/gxvmort1.c \\\n               $(GXV_DIR)/gxvmort2.c \\\n               $(GXV_DIR)/gxvmort4.c \\\n               $(GXV_DIR)/gxvmort5.c \\\n               $(GXV_DIR)/gxvmorx.c  \\\n               $(GXV_DIR)/gxvmorx0.c \\\n               $(GXV_DIR)/gxvmorx1.c \\\n               $(GXV_DIR)/gxvmorx2.c \\\n               $(GXV_DIR)/gxvmorx4.c \\\n               $(GXV_DIR)/gxvmorx5.c \\\n               $(GXV_DIR)/gxvlcar.c  \\\n               $(GXV_DIR)/gxvkern.c  \\\n               $(GXV_DIR)/gxvmod.c\n\n# GXV driver headers\n#\nGXV_DRV_H := $(GXV_DIR)/gxvalid.h  \\\n             $(GXV_DIR)/gxverror.h \\\n             $(GXV_DIR)/gxvcommn.h \\\n             $(GXV_DIR)/gxvfeat.h  \\\n             $(GXV_DIR)/gxvmod.h   \\\n             $(GXV_DIR)/gxvmort.h  \\\n             $(GXV_DIR)/gxvmorx.h\n\n\n# GXV driver object(s)\n#\n#   GXV_DRV_OBJ_M is used during `multi' builds.\n#   GXV_DRV_OBJ_S is used during `single' builds.\n#\nGXV_DRV_OBJ_M := $(GXV_DRV_SRC:$(GXV_DIR)/%.c=$(OBJ_DIR)/%.$O)\nGXV_DRV_OBJ_S := $(OBJ_DIR)/gxvalid.$O\n\n# GXV driver source file for single build\n#\nGXV_DRV_SRC_S := $(GXV_DIR)/gxvalid.c\n\n\n# GXV driver - single object\n#\n$(GXV_DRV_OBJ_S): $(GXV_DRV_SRC_S) $(GXV_DRV_SRC) \\\n                   $(FREETYPE_H) $(GXV_DRV_H)\n\t$(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GXV_DRV_SRC_S))\n\n\n# GXV driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(GXV_DIR)/%.c $(FREETYPE_H) $(GXV_DRV_H)\n\t$(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(GXV_DRV_OBJ_S)\nDRV_OBJS_M += $(GXV_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/gzip/Jamfile",
    "content": "# FreeType 2 src/gzip Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) gzip ;\n\nLibrary  $(FT2_LIB) : ftgzip.c ;\n\n# end of src/pcf Jamfile\n"
  },
  {
    "path": "libs/freetype/src/gzip/adler32.c",
    "content": "/* adler32.c -- compute the Adler-32 checksum of a data stream\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#include \"zlib.h\"\n\n#define BASE 65521L /* largest prime smaller than 65536 */\n#define NMAX 5552\n/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */\n\n#define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}\n#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);\n#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);\n#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);\n#define DO16(buf)   DO8(buf,0); DO8(buf,8);\n\n/* ========================================================================= */\nZEXPORT(uLong) adler32( /* adler, buf, len) */\n    uLong adler,\n    const Bytef *buf,\n    uInt len )\n{\n    unsigned long s1 = adler & 0xffff;\n    unsigned long s2 = (adler >> 16) & 0xffff;\n    int k;\n\n    if (buf == Z_NULL) return 1L;\n\n    while (len > 0) {\n        k = len < NMAX ? len : NMAX;\n        len -= k;\n        while (k >= 16) {\n            DO16(buf);\n            buf += 16;\n            k -= 16;\n        }\n        if (k != 0) do {\n            s1 += *buf++;\n            s2 += s1;\n        } while (--k);\n        s1 %= BASE;\n        s2 %= BASE;\n    }\n    return (s2 << 16) | s1;\n}\n"
  },
  {
    "path": "libs/freetype/src/gzip/ftgzip.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgzip.c                                                               */\n/*                                                                         */\n/*    FreeType support for .gz compressed files.                           */\n/*                                                                         */\n/*  This optional component relies on zlib.  It should mainly be used to   */\n/*  parse compressed PCF fonts, as found with many X11 server              */\n/*  distributions.                                                         */\n/*                                                                         */\n/*  Copyright 2002-2006, 2009-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_MEMORY_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_GZIP_H\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  Gzip_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Gzip\n\n#include FT_ERRORS_H\n\n\n#ifdef FT_CONFIG_OPTION_USE_ZLIB\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"gzip code does not support PIC yet\"\n#endif\n\n#ifdef FT_CONFIG_OPTION_SYSTEM_ZLIB\n\n#include <zlib.h>\n\n#else /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */\n\n /* In this case, we include our own modified sources of the ZLib    */\n /* within the \"ftgzip\" component.  The modifications were necessary */\n /* to #include all files without conflicts, as well as preventing   */\n /* the definition of \"extern\" functions that may cause linking      */\n /* conflicts when a program is linked with both FreeType and the    */\n /* original ZLib.                                                   */\n\n#define NO_DUMMY_DECL\n#ifndef USE_ZLIB_ZCALLOC\n#define MY_ZCALLOC /* prevent all zcalloc() & zfree() in zutils.c */\n#endif\n\n#include \"zlib.h\"\n\n#undef  SLOW\n#define SLOW  1  /* we can't use asm-optimized sources here! */\n\n  /* Urgh.  `inflate_mask' must not be declared twice -- C++ doesn't like\n     this.  We temporarily disable it and load all necessary header files. */\n#define NO_INFLATE_MASK\n#include \"zutil.h\"\n#include \"inftrees.h\"\n#include \"infblock.h\"\n#include \"infcodes.h\"\n#include \"infutil.h\"\n#undef  NO_INFLATE_MASK\n\n  /* infutil.c must be included before infcodes.c */\n#include \"zutil.c\"\n#include \"inftrees.c\"\n#include \"infutil.c\"\n#include \"infcodes.c\"\n#include \"infblock.c\"\n#include \"inflate.c\"\n#include \"adler32.c\"\n\n#endif /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */\n\n\n/***************************************************************************/\n/***************************************************************************/\n/*****                                                                 *****/\n/*****            Z L I B   M E M O R Y   M A N A G E M E N T          *****/\n/*****                                                                 *****/\n/***************************************************************************/\n/***************************************************************************/\n\n  /* it is better to use FreeType memory routines instead of raw\n     'malloc/free' */\n\n  static voidpf\n  ft_gzip_alloc( FT_Memory  memory,\n                 uInt       items,\n                 uInt       size )\n  {\n    FT_ULong    sz = (FT_ULong)size * items;\n    FT_Error    error;\n    FT_Pointer  p  = NULL;\n\n\n    (void)FT_ALLOC( p, sz );\n    return p;\n  }\n\n\n  static void\n  ft_gzip_free( FT_Memory  memory,\n                voidpf     address )\n  {\n    FT_MEM_FREE( address );\n  }\n\n\n#if !defined( FT_CONFIG_OPTION_SYSTEM_ZLIB ) && !defined( USE_ZLIB_ZCALLOC )\n\n  local voidpf\n  zcalloc ( voidpf    opaque,\n            unsigned  items,\n            unsigned  size )\n  {\n    return ft_gzip_alloc( (FT_Memory)opaque, items, size );\n  }\n\n  local void\n  zcfree( voidpf  opaque,\n          voidpf  ptr )\n  {\n    ft_gzip_free( (FT_Memory)opaque, ptr );\n  }\n\n#endif /* !SYSTEM_ZLIB && !USE_ZLIB_ZCALLOC */\n\n\n/***************************************************************************/\n/***************************************************************************/\n/*****                                                                 *****/\n/*****               Z L I B   F I L E   D E S C R I P T O R           *****/\n/*****                                                                 *****/\n/***************************************************************************/\n/***************************************************************************/\n\n#define FT_GZIP_BUFFER_SIZE  4096\n\n  typedef struct  FT_GZipFileRec_\n  {\n    FT_Stream  source;         /* parent/source stream        */\n    FT_Stream  stream;         /* embedding stream            */\n    FT_Memory  memory;         /* memory allocator            */\n    z_stream   zstream;        /* zlib input stream           */\n\n    FT_ULong   start;          /* starting position, after .gz header */\n    FT_Byte    input[FT_GZIP_BUFFER_SIZE];   /* input read buffer  */\n\n    FT_Byte    buffer[FT_GZIP_BUFFER_SIZE];  /* output buffer      */\n    FT_ULong   pos;                          /* position in output */\n    FT_Byte*   cursor;\n    FT_Byte*   limit;\n\n  } FT_GZipFileRec, *FT_GZipFile;\n\n\n  /* gzip flag byte */\n#define FT_GZIP_ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */\n#define FT_GZIP_HEAD_CRC     0x02 /* bit 1 set: header CRC present */\n#define FT_GZIP_EXTRA_FIELD  0x04 /* bit 2 set: extra field present */\n#define FT_GZIP_ORIG_NAME    0x08 /* bit 3 set: original file name present */\n#define FT_GZIP_COMMENT      0x10 /* bit 4 set: file comment present */\n#define FT_GZIP_RESERVED     0xE0 /* bits 5..7: reserved */\n\n\n  /* check and skip .gz header - we don't support `transparent' compression */\n  static FT_Error\n  ft_gzip_check_header( FT_Stream  stream )\n  {\n    FT_Error  error;\n    FT_Byte   head[4];\n\n\n    if ( FT_STREAM_SEEK( 0 )       ||\n         FT_STREAM_READ( head, 4 ) )\n      goto Exit;\n\n    /* head[0] && head[1] are the magic numbers;    */\n    /* head[2] is the method, and head[3] the flags */\n    if ( head[0] != 0x1f              ||\n         head[1] != 0x8b              ||\n         head[2] != Z_DEFLATED        ||\n        (head[3] & FT_GZIP_RESERVED)  )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* skip time, xflags and os code */\n    (void)FT_STREAM_SKIP( 6 );\n\n    /* skip the extra field */\n    if ( head[3] & FT_GZIP_EXTRA_FIELD )\n    {\n      FT_UInt  len;\n\n\n      if ( FT_READ_USHORT_LE( len ) ||\n           FT_STREAM_SKIP( len )    )\n        goto Exit;\n    }\n\n    /* skip original file name */\n    if ( head[3] & FT_GZIP_ORIG_NAME )\n      for (;;)\n      {\n        FT_UInt  c;\n\n\n        if ( FT_READ_BYTE( c ) )\n          goto Exit;\n\n        if ( c == 0 )\n          break;\n      }\n\n    /* skip .gz comment */\n    if ( head[3] & FT_GZIP_COMMENT )\n      for (;;)\n      {\n        FT_UInt  c;\n\n\n        if ( FT_READ_BYTE( c ) )\n          goto Exit;\n\n        if ( c == 0 )\n          break;\n      }\n\n    /* skip CRC */\n    if ( head[3] & FT_GZIP_HEAD_CRC )\n      if ( FT_STREAM_SKIP( 2 ) )\n        goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  ft_gzip_file_init( FT_GZipFile  zip,\n                     FT_Stream    stream,\n                     FT_Stream    source )\n  {\n    z_stream*  zstream = &zip->zstream;\n    FT_Error   error   = FT_Err_Ok;\n\n\n    zip->stream = stream;\n    zip->source = source;\n    zip->memory = stream->memory;\n\n    zip->limit  = zip->buffer + FT_GZIP_BUFFER_SIZE;\n    zip->cursor = zip->limit;\n    zip->pos    = 0;\n\n    /* check and skip .gz header */\n    {\n      stream = source;\n\n      error = ft_gzip_check_header( stream );\n      if ( error )\n        goto Exit;\n\n      zip->start = FT_STREAM_POS();\n    }\n\n    /* initialize zlib -- there is no zlib header in the compressed stream */\n    zstream->zalloc = (alloc_func)ft_gzip_alloc;\n    zstream->zfree  = (free_func) ft_gzip_free;\n    zstream->opaque = stream->memory;\n\n    zstream->avail_in = 0;\n    zstream->next_in  = zip->buffer;\n\n    if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK ||\n         zstream->next_in == NULL                     )\n      error = FT_THROW( Invalid_File_Format );\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  ft_gzip_file_done( FT_GZipFile  zip )\n  {\n    z_stream*  zstream = &zip->zstream;\n\n\n    inflateEnd( zstream );\n\n    /* clear the rest */\n    zstream->zalloc    = NULL;\n    zstream->zfree     = NULL;\n    zstream->opaque    = NULL;\n    zstream->next_in   = NULL;\n    zstream->next_out  = NULL;\n    zstream->avail_in  = 0;\n    zstream->avail_out = 0;\n\n    zip->memory = NULL;\n    zip->source = NULL;\n    zip->stream = NULL;\n  }\n\n\n  static FT_Error\n  ft_gzip_file_reset( FT_GZipFile  zip )\n  {\n    FT_Stream  stream = zip->source;\n    FT_Error   error;\n\n\n    if ( !FT_STREAM_SEEK( zip->start ) )\n    {\n      z_stream*  zstream = &zip->zstream;\n\n\n      inflateReset( zstream );\n\n      zstream->avail_in  = 0;\n      zstream->next_in   = zip->input;\n      zstream->avail_out = 0;\n      zstream->next_out  = zip->buffer;\n\n      zip->limit  = zip->buffer + FT_GZIP_BUFFER_SIZE;\n      zip->cursor = zip->limit;\n      zip->pos    = 0;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  ft_gzip_file_fill_input( FT_GZipFile  zip )\n  {\n    z_stream*  zstream = &zip->zstream;\n    FT_Stream  stream  = zip->source;\n    FT_ULong   size;\n\n\n    if ( stream->read )\n    {\n      size = stream->read( stream, stream->pos, zip->input,\n                           FT_GZIP_BUFFER_SIZE );\n      if ( size == 0 )\n        return FT_THROW( Invalid_Stream_Operation );\n    }\n    else\n    {\n      size = stream->size - stream->pos;\n      if ( size > FT_GZIP_BUFFER_SIZE )\n        size = FT_GZIP_BUFFER_SIZE;\n\n      if ( size == 0 )\n        return FT_THROW( Invalid_Stream_Operation );\n\n      FT_MEM_COPY( zip->input, stream->base + stream->pos, size );\n    }\n    stream->pos += size;\n\n    zstream->next_in  = zip->input;\n    zstream->avail_in = size;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  ft_gzip_file_fill_output( FT_GZipFile  zip )\n  {\n    z_stream*  zstream = &zip->zstream;\n    FT_Error   error   = FT_Err_Ok;\n\n\n    zip->cursor        = zip->buffer;\n    zstream->next_out  = zip->cursor;\n    zstream->avail_out = FT_GZIP_BUFFER_SIZE;\n\n    while ( zstream->avail_out > 0 )\n    {\n      int  err;\n\n\n      if ( zstream->avail_in == 0 )\n      {\n        error = ft_gzip_file_fill_input( zip );\n        if ( error )\n          break;\n      }\n\n      err = inflate( zstream, Z_NO_FLUSH );\n\n      if ( err == Z_STREAM_END )\n      {\n        zip->limit = zstream->next_out;\n        if ( zip->limit == zip->cursor )\n          error = FT_THROW( Invalid_Stream_Operation );\n        break;\n      }\n      else if ( err != Z_OK )\n      {\n        error = FT_THROW( Invalid_Stream_Operation );\n        break;\n      }\n    }\n\n    return error;\n  }\n\n\n  /* fill output buffer; `count' must be <= FT_GZIP_BUFFER_SIZE */\n  static FT_Error\n  ft_gzip_file_skip_output( FT_GZipFile  zip,\n                            FT_ULong     count )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_ULong  delta;\n\n\n    for (;;)\n    {\n      delta = (FT_ULong)( zip->limit - zip->cursor );\n      if ( delta >= count )\n        delta = count;\n\n      zip->cursor += delta;\n      zip->pos    += delta;\n\n      count -= delta;\n      if ( count == 0 )\n        break;\n\n      error = ft_gzip_file_fill_output( zip );\n      if ( error )\n        break;\n    }\n\n    return error;\n  }\n\n\n  static FT_ULong\n  ft_gzip_file_io( FT_GZipFile  zip,\n                   FT_ULong     pos,\n                   FT_Byte*     buffer,\n                   FT_ULong     count )\n  {\n    FT_ULong  result = 0;\n    FT_Error  error;\n\n\n    /* Reset inflate stream if we're seeking backwards.        */\n    /* Yes, that is not too efficient, but it saves memory :-) */\n    if ( pos < zip->pos )\n    {\n      error = ft_gzip_file_reset( zip );\n      if ( error )\n        goto Exit;\n    }\n\n    /* skip unwanted bytes */\n    if ( pos > zip->pos )\n    {\n      error = ft_gzip_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( count == 0 )\n      goto Exit;\n\n    /* now read the data */\n    for (;;)\n    {\n      FT_ULong  delta;\n\n\n      delta = (FT_ULong)( zip->limit - zip->cursor );\n      if ( delta >= count )\n        delta = count;\n\n      FT_MEM_COPY( buffer, zip->cursor, delta );\n      buffer      += delta;\n      result      += delta;\n      zip->cursor += delta;\n      zip->pos    += delta;\n\n      count -= delta;\n      if ( count == 0 )\n        break;\n\n      error = ft_gzip_file_fill_output( zip );\n      if ( error )\n        break;\n    }\n\n  Exit:\n    return result;\n  }\n\n\n/***************************************************************************/\n/***************************************************************************/\n/*****                                                                 *****/\n/*****               G Z   E M B E D D I N G   S T R E A M             *****/\n/*****                                                                 *****/\n/***************************************************************************/\n/***************************************************************************/\n\n  static void\n  ft_gzip_stream_close( FT_Stream  stream )\n  {\n    FT_GZipFile  zip    = (FT_GZipFile)stream->descriptor.pointer;\n    FT_Memory    memory = stream->memory;\n\n\n    if ( zip )\n    {\n      /* finalize gzip file descriptor */\n      ft_gzip_file_done( zip );\n\n      FT_FREE( zip );\n\n      stream->descriptor.pointer = NULL;\n    }\n  }\n\n\n  static FT_ULong\n  ft_gzip_stream_io( FT_Stream  stream,\n                     FT_ULong   pos,\n                     FT_Byte*   buffer,\n                     FT_ULong   count )\n  {\n    FT_GZipFile  zip = (FT_GZipFile)stream->descriptor.pointer;\n\n\n    return ft_gzip_file_io( zip, pos, buffer, count );\n  }\n\n\n  static FT_ULong\n  ft_gzip_get_uncompressed_size( FT_Stream  stream )\n  {\n    FT_Error  error;\n    FT_ULong  old_pos;\n    FT_ULong  result = 0;\n\n\n    old_pos = stream->pos;\n    if ( !FT_Stream_Seek( stream, stream->size - 4 ) )\n    {\n      result = FT_Stream_ReadULong( stream, &error );\n      if ( error )\n        result = 0;\n\n      (void)FT_Stream_Seek( stream, old_pos );\n    }\n\n    return result;\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stream_OpenGzip( FT_Stream  stream,\n                      FT_Stream  source )\n  {\n    FT_Error     error;\n    FT_Memory    memory = source->memory;\n    FT_GZipFile  zip = NULL;\n\n\n    /*\n     *  check the header right now; this prevents allocating un-necessary\n     *  objects when we don't need them\n     */\n    error = ft_gzip_check_header( source );\n    if ( error )\n      goto Exit;\n\n    FT_ZERO( stream );\n    stream->memory = memory;\n\n    if ( !FT_QNEW( zip ) )\n    {\n      error = ft_gzip_file_init( zip, stream, source );\n      if ( error )\n      {\n        FT_FREE( zip );\n        goto Exit;\n      }\n\n      stream->descriptor.pointer = zip;\n    }\n\n    /*\n     *  We use the following trick to try to dramatically improve the\n     *  performance while dealing with small files.  If the original stream\n     *  size is less than a certain threshold, we try to load the whole font\n     *  file into memory.  This saves us from using the 32KB buffer needed\n     *  to inflate the file, plus the two 4KB intermediate input/output\n     *  buffers used in the `FT_GZipFile' structure.\n     */\n    {\n      FT_ULong  zip_size = ft_gzip_get_uncompressed_size( source );\n\n\n      if ( zip_size != 0 && zip_size < 40 * 1024 )\n      {\n        FT_Byte*  zip_buff = NULL;\n\n\n        if ( !FT_ALLOC( zip_buff, zip_size ) )\n        {\n          FT_ULong  count;\n\n\n          count = ft_gzip_file_io( zip, 0, zip_buff, zip_size );\n          if ( count == zip_size )\n          {\n            ft_gzip_file_done( zip );\n            FT_FREE( zip );\n\n            stream->descriptor.pointer = NULL;\n\n            stream->size  = zip_size;\n            stream->pos   = 0;\n            stream->base  = zip_buff;\n            stream->read  = NULL;\n            stream->close = ft_gzip_stream_close;\n\n            goto Exit;\n          }\n\n          ft_gzip_file_io( zip, 0, NULL, 0 );\n          FT_FREE( zip_buff );\n        }\n        error = FT_Err_Ok;\n      }\n    }\n\n    stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */\n    stream->pos   = 0;\n    stream->base  = 0;\n    stream->read  = ft_gzip_stream_io;\n    stream->close = ft_gzip_stream_close;\n\n  Exit:\n    return error;\n  }\n\n#else  /* !FT_CONFIG_OPTION_USE_ZLIB */\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stream_OpenGzip( FT_Stream  stream,\n                      FT_Stream  source )\n  {\n    FT_UNUSED( stream );\n    FT_UNUSED( source );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n#endif /* !FT_CONFIG_OPTION_USE_ZLIB */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/gzip/infblock.c",
    "content": "/* infblock.c -- interpret and process block types to last block\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"zutil.h\"\n#include \"infblock.h\"\n#include \"inftrees.h\"\n#include \"infcodes.h\"\n#include \"infutil.h\"\n\n\n/* simplify the use of the inflate_huft type with some defines */\n#define exop word.what.Exop\n#define bits word.what.Bits\n\n/* Table for deflate from PKZIP's appnote.txt. */\nlocal const uInt border[] = { /* Order of the bit length code lengths */\n        16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\n\n/*\n   Notes beyond the 1.93a appnote.txt:\n\n   1. Distance pointers never point before the beginning of the output\n      stream.\n   2. Distance pointers can point back across blocks, up to 32k away.\n   3. There is an implied maximum of 7 bits for the bit length table and\n      15 bits for the actual data.\n   4. If only one code exists, then it is encoded using one bit.  (Zero\n      would be more efficient, but perhaps a little confusing.)  If two\n      codes exist, they are coded using one bit each (0 and 1).\n   5. There is no way of sending zero distance codes--a dummy must be\n      sent if there are none.  (History: a pre 2.0 version of PKZIP would\n      store blocks with no distance codes, but this was discovered to be\n      too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow\n      zero distance codes, which is sent as one code of zero bits in\n      length.\n   6. There are up to 286 literal/length codes.  Code 256 represents the\n      end-of-block.  Note however that the static length tree defines\n      288 codes just to fill out the Huffman codes.  Codes 286 and 287\n      cannot be used though, since there is no length base or extra bits\n      defined for them.  Similarily, there are up to 30 distance codes.\n      However, static trees define 32 codes (all 5 bits) to fill out the\n      Huffman codes, but the last two had better not show up in the data.\n   7. Unzip can check dynamic Huffman blocks for complete code sets.\n      The exception is that a single code would not be complete (see #4).\n   8. The five bits following the block type is really the number of\n      literal codes sent minus 257.\n   9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits\n      (1+6+6).  Therefore, to output three times the length, you output\n      three codes (1+1+1), whereas to output four times the same length,\n      you only need two codes (1+3).  Hmm.\n  10. In the tree reconstruction algorithm, Code = Code + Increment\n      only if BitLength(i) is not zero.  (Pretty obvious.)\n  11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)\n  12. Note: length code 284 can represent 227-258, but length code 285\n      really is 258.  The last length deserves its own, short code\n      since it gets used a lot in very redundant files.  The length\n      258 is special since 258 - 3 (the min match length) is 255.\n  13. The literal/length and distance code bit lengths are read as a\n      single stream of lengths.  It is possible (and advantageous) for\n      a repeat code (16, 17, or 18) to go across the boundary between\n      the two sets of lengths.\n */\n\n\nlocal void inflate_blocks_reset( /* s, z, c) */\ninflate_blocks_statef *s,\nz_streamp z,\nuLongf *c )\n{\n  if (c != Z_NULL)\n    *c = s->check;\n  if (s->mode == BTREE || s->mode == DTREE)\n    ZFREE(z, s->sub.trees.blens);\n  if (s->mode == CODES)\n    inflate_codes_free(s->sub.decode.codes, z);\n  s->mode = TYPE;\n  s->bitk = 0;\n  s->bitb = 0;\n  s->read = s->write = s->window;\n  if (s->checkfn != Z_NULL)\n    z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);\n  Tracev((stderr, \"inflate:   blocks reset\\n\"));\n}\n\n\nlocal inflate_blocks_statef *inflate_blocks_new( /* z, c, w) */\nz_streamp z,\ncheck_func c,\nuInt w )\n{\n  inflate_blocks_statef *s;\n\n  if ((s = (inflate_blocks_statef *)ZALLOC\n       (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)\n    return s;\n  if ((s->hufts =\n       (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)\n  {\n    ZFREE(z, s);\n    return Z_NULL;\n  }\n  if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)\n  {\n    ZFREE(z, s->hufts);\n    ZFREE(z, s);\n    return Z_NULL;\n  }\n  s->end = s->window + w;\n  s->checkfn = c;\n  s->mode = TYPE;\n  Tracev((stderr, \"inflate:   blocks allocated\\n\"));\n  inflate_blocks_reset(s, z, Z_NULL);\n  return s;\n}\n\n\nlocal int inflate_blocks( /* s, z, r) */\ninflate_blocks_statef *s,\nz_streamp z,\nint r )\n{\n  uInt t;               /* temporary storage */\n  uLong b;              /* bit buffer */\n  uInt k;               /* bits in bit buffer */\n  Bytef *p;             /* input data pointer */\n  uInt n;               /* bytes available there */\n  Bytef *q;             /* output window write pointer */\n  uInt m;               /* bytes to end of window or read pointer */\n\n  /* copy input/output information to locals (UPDATE macro restores) */\n  LOAD\n\n  /* process input based on current state */\n  while (1) switch (s->mode)\n  {\n    case TYPE:\n      NEEDBITS(3)\n      t = (uInt)b & 7;\n      s->last = t & 1;\n      switch (t >> 1)\n      {\n        case 0:                         /* stored */\n          Tracev((stderr, \"inflate:     stored block%s\\n\",\n                 s->last ? \" (last)\" : \"\"));\n          DUMPBITS(3)\n          t = k & 7;                    /* go to byte boundary */\n          DUMPBITS(t)\n          s->mode = LENS;               /* get length of stored block */\n          break;\n        case 1:                         /* fixed */\n          Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n                 s->last ? \" (last)\" : \"\"));\n          {\n            uInt bl, bd;\n            inflate_huft *tl, *td;\n\n            inflate_trees_fixed(&bl, &bd, (const inflate_huft**)&tl,\n                                          (const inflate_huft**)&td, z);\n            s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);\n            if (s->sub.decode.codes == Z_NULL)\n            {\n              r = Z_MEM_ERROR;\n              LEAVE\n            }\n          }\n          DUMPBITS(3)\n          s->mode = CODES;\n          break;\n        case 2:                         /* dynamic */\n          Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n                 s->last ? \" (last)\" : \"\"));\n          DUMPBITS(3)\n          s->mode = TABLE;\n          break;\n        case 3:                         /* illegal */\n          DUMPBITS(3)\n          s->mode = BAD;\n          z->msg = (char*)\"invalid block type\";\n          r = Z_DATA_ERROR;\n          LEAVE\n      }\n      break;\n    case LENS:\n      NEEDBITS(32)\n      if ((((~b) >> 16) & 0xffff) != (b & 0xffff))\n      {\n        s->mode = BAD;\n        z->msg = (char*)\"invalid stored block lengths\";\n        r = Z_DATA_ERROR;\n        LEAVE\n      }\n      s->sub.left = (uInt)b & 0xffff;\n      b = k = 0;                      /* dump bits */\n      Tracev((stderr, \"inflate:       stored length %u\\n\", s->sub.left));\n      s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);\n      break;\n    case STORED:\n      if (n == 0)\n        LEAVE\n      NEEDOUT\n      t = s->sub.left;\n      if (t > n) t = n;\n      if (t > m) t = m;\n      zmemcpy(q, p, t);\n      p += t;  n -= t;\n      q += t;  m -= t;\n      if ((s->sub.left -= t) != 0)\n        break;\n      Tracev((stderr, \"inflate:       stored end, %lu total out\\n\",\n              z->total_out + (q >= s->read ? q - s->read :\n              (s->end - s->read) + (q - s->window))));\n      s->mode = s->last ? DRY : TYPE;\n      break;\n    case TABLE:\n      NEEDBITS(14)\n      s->sub.trees.table = t = (uInt)b & 0x3fff;\n#ifndef PKZIP_BUG_WORKAROUND\n      if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)\n      {\n        s->mode = BAD;\n        z->msg = (char*)\"too many length or distance symbols\";\n        r = Z_DATA_ERROR;\n        LEAVE\n      }\n#endif\n      t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);\n      if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)\n      {\n        r = Z_MEM_ERROR;\n        LEAVE\n      }\n      DUMPBITS(14)\n      s->sub.trees.index = 0;\n      Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n      s->mode = BTREE;\n    case BTREE:\n      while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))\n      {\n        NEEDBITS(3)\n        s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;\n        DUMPBITS(3)\n      }\n      while (s->sub.trees.index < 19)\n        s->sub.trees.blens[border[s->sub.trees.index++]] = 0;\n      s->sub.trees.bb = 7;\n      t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,\n                             &s->sub.trees.tb, s->hufts, z);\n      if (t != Z_OK)\n      {\n        r = t;\n        if (r == Z_DATA_ERROR)\n        {\n          ZFREE(z, s->sub.trees.blens);\n          s->mode = BAD;\n        }\n        LEAVE\n      }\n      s->sub.trees.index = 0;\n      Tracev((stderr, \"inflate:       bits tree ok\\n\"));\n      s->mode = DTREE;\n    case DTREE:\n      while (t = s->sub.trees.table,\n             s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))\n      {\n        inflate_huft *h;\n        uInt i, j, c;\n\n        t = s->sub.trees.bb;\n        NEEDBITS(t)\n        h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);\n        t = h->bits;\n        c = h->base;\n        if (c < 16)\n        {\n          DUMPBITS(t)\n          s->sub.trees.blens[s->sub.trees.index++] = c;\n        }\n        else /* c == 16..18 */\n        {\n          i = c == 18 ? 7 : c - 14;\n          j = c == 18 ? 11 : 3;\n          NEEDBITS(t + i)\n          DUMPBITS(t)\n          j += (uInt)b & inflate_mask[i];\n          DUMPBITS(i)\n          i = s->sub.trees.index;\n          t = s->sub.trees.table;\n          if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||\n              (c == 16 && i < 1))\n          {\n            ZFREE(z, s->sub.trees.blens);\n            s->mode = BAD;\n            z->msg = (char*)\"invalid bit length repeat\";\n            r = Z_DATA_ERROR;\n            LEAVE\n          }\n          c = c == 16 ? s->sub.trees.blens[i - 1] : 0;\n          do {\n            s->sub.trees.blens[i++] = c;\n          } while (--j);\n          s->sub.trees.index = i;\n        }\n      }\n      s->sub.trees.tb = Z_NULL;\n      {\n        uInt bl, bd;\n        inflate_huft *tl, *td;\n        inflate_codes_statef *c;\n\n        bl = 9;         /* must be <= 9 for lookahead assumptions */\n        bd = 6;         /* must be <= 9 for lookahead assumptions */\n        t = s->sub.trees.table;\n        t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),\n                                  s->sub.trees.blens, &bl, &bd, &tl, &td,\n                                  s->hufts, z);\n        if (t != Z_OK)\n        {\n          if (t == (uInt)Z_DATA_ERROR)\n          {\n            ZFREE(z, s->sub.trees.blens);\n            s->mode = BAD;\n          }\n          r = t;\n          LEAVE\n        }\n        Tracev((stderr, \"inflate:       trees ok\\n\"));\n        if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)\n        {\n          r = Z_MEM_ERROR;\n          LEAVE\n        }\n        s->sub.decode.codes = c;\n      }\n      ZFREE(z, s->sub.trees.blens);\n      s->mode = CODES;\n    case CODES:\n      UPDATE\n      if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)\n        return inflate_flush(s, z, r);\n      r = Z_OK;\n      inflate_codes_free(s->sub.decode.codes, z);\n      LOAD\n      Tracev((stderr, \"inflate:       codes end, %lu total out\\n\",\n              z->total_out + (q >= s->read ? q - s->read :\n              (s->end - s->read) + (q - s->window))));\n      if (!s->last)\n      {\n        s->mode = TYPE;\n        break;\n      }\n      s->mode = DRY;\n    case DRY:\n      FLUSH\n      if (s->read != s->write)\n        LEAVE\n      s->mode = DONE;\n    case DONE:\n      r = Z_STREAM_END;\n      LEAVE\n    case BAD:\n      r = Z_DATA_ERROR;\n      LEAVE\n    default:\n      r = Z_STREAM_ERROR;\n      LEAVE\n  }\n#ifdef NEED_DUMMY_RETURN\n  return 0;\n#endif\n}\n\n\nlocal int inflate_blocks_free( /* s, z) */\ninflate_blocks_statef *s,\nz_streamp z )\n{\n  inflate_blocks_reset(s, z, Z_NULL);\n  ZFREE(z, s->window);\n  ZFREE(z, s->hufts);\n  ZFREE(z, s);\n  Tracev((stderr, \"inflate:   blocks freed\\n\"));\n  return Z_OK;\n}\n\n\n"
  },
  {
    "path": "libs/freetype/src/gzip/infblock.h",
    "content": "/* infblock.h -- header to use infblock.c\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n#ifndef _INFBLOCK_H\n#define _INFBLOCK_H\n\nstruct inflate_blocks_state;\ntypedef struct inflate_blocks_state FAR inflate_blocks_statef;\n\nlocal  inflate_blocks_statef * inflate_blocks_new OF((\n    z_streamp z,\n    check_func c,               /* check function */\n    uInt w));                   /* window size */\n\nlocal  int inflate_blocks OF((\n    inflate_blocks_statef *,\n    z_streamp ,\n    int));                      /* initial return code */\n\nlocal  void inflate_blocks_reset OF((\n    inflate_blocks_statef *,\n    z_streamp ,\n    uLongf *));                  /* check value on output */\n\nlocal  int inflate_blocks_free OF((\n    inflate_blocks_statef *,\n    z_streamp));\n\n#endif /* _INFBLOCK_H */\n"
  },
  {
    "path": "libs/freetype/src/gzip/infcodes.c",
    "content": "/* infcodes.c -- process literals and length/distance pairs\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n#include \"infblock.h\"\n#include \"infcodes.h\"\n#include \"infutil.h\"\n\n/* simplify the use of the inflate_huft type with some defines */\n#define exop word.what.Exop\n#define bits word.what.Bits\n\ntypedef enum {        /* waiting for \"i:\"=input, \"o:\"=output, \"x:\"=nothing */\n      START,    /* x: set up for LEN */\n      LEN,      /* i: get length/literal/eob next */\n      LENEXT,   /* i: getting length extra (have base) */\n      DIST,     /* i: get distance next */\n      DISTEXT,  /* i: getting distance extra */\n      COPY,     /* o: copying bytes in window, waiting for space */\n      LIT,      /* o: got literal, waiting for output space */\n      WASH,     /* o: got eob, possibly still output waiting */\n      END,      /* x: got eob and all data flushed */\n      BADCODE}  /* x: got error */\ninflate_codes_mode;\n\n/* inflate codes private state */\nstruct inflate_codes_state {\n\n  /* mode */\n  inflate_codes_mode mode;      /* current inflate_codes mode */\n\n  /* mode dependent information */\n  uInt len;\n  union {\n    struct {\n      inflate_huft *tree;       /* pointer into tree */\n      uInt need;                /* bits needed */\n    } code;             /* if LEN or DIST, where in tree */\n    uInt lit;           /* if LIT, literal */\n    struct {\n      uInt get;                 /* bits to get for extra */\n      uInt dist;                /* distance back to copy from */\n    } copy;             /* if EXT or COPY, where and how much */\n  } sub;                /* submode */\n\n  /* mode independent information */\n  Byte lbits;           /* ltree bits decoded per branch */\n  Byte dbits;           /* dtree bits decoder per branch */\n  inflate_huft *ltree;          /* literal/length/eob tree */\n  inflate_huft *dtree;          /* distance tree */\n\n};\n\n\nlocal inflate_codes_statef *inflate_codes_new( /* bl, bd, tl, td, z) */\nuInt bl, uInt bd,\ninflate_huft *tl,\ninflate_huft *td, /* need separate declaration for Borland C++ */\nz_streamp z )\n{\n  inflate_codes_statef *c;\n\n  if ((c = (inflate_codes_statef *)\n       ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)\n  {\n    c->mode = START;\n    c->lbits = (Byte)bl;\n    c->dbits = (Byte)bd;\n    c->ltree = tl;\n    c->dtree = td;\n    Tracev((stderr, \"inflate:       codes new\\n\"));\n  }\n  return c;\n}\n\n\nlocal int inflate_codes( /* s, z, r) */\ninflate_blocks_statef *s,\nz_streamp z,\nint r )\n{\n  uInt j;               /* temporary storage */\n  inflate_huft *t;      /* temporary pointer */\n  uInt e;               /* extra bits or operation */\n  uLong b;              /* bit buffer */\n  uInt k;               /* bits in bit buffer */\n  Bytef *p;             /* input data pointer */\n  uInt n;               /* bytes available there */\n  Bytef *q;             /* output window write pointer */\n  uInt m;               /* bytes to end of window or read pointer */\n  Bytef *f;             /* pointer to copy strings from */\n  inflate_codes_statef *c = s->sub.decode.codes;  /* codes state */\n\n  /* copy input/output information to locals (UPDATE macro restores) */\n  LOAD\n\n  /* process input and output based on current state */\n  while (1) switch (c->mode)\n  {             /* waiting for \"i:\"=input, \"o:\"=output, \"x:\"=nothing */\n    case START:         /* x: set up for LEN */\n#ifndef SLOW\n      if (m >= 258 && n >= 10)\n      {\n        UPDATE\n        r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);\n        LOAD\n        if (r != Z_OK)\n        {\n          c->mode = r == Z_STREAM_END ? WASH : BADCODE;\n          break;\n        }\n      }\n#endif /* !SLOW */\n      c->sub.code.need = c->lbits;\n      c->sub.code.tree = c->ltree;\n      c->mode = LEN;\n    case LEN:           /* i: get length/literal/eob next */\n      j = c->sub.code.need;\n      NEEDBITS(j)\n      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);\n      DUMPBITS(t->bits)\n      e = (uInt)(t->exop);\n      if (e == 0)               /* literal */\n      {\n        c->sub.lit = t->base;\n        Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?\n                 \"inflate:         literal '%c'\\n\" :\n                 \"inflate:         literal 0x%02x\\n\", t->base));\n        c->mode = LIT;\n        break;\n      }\n      if (e & 16)               /* length */\n      {\n        c->sub.copy.get = e & 15;\n        c->len = t->base;\n        c->mode = LENEXT;\n        break;\n      }\n      if ((e & 64) == 0)        /* next table */\n      {\n        c->sub.code.need = e;\n        c->sub.code.tree = t + t->base;\n        break;\n      }\n      if (e & 32)               /* end of block */\n      {\n        Tracevv((stderr, \"inflate:         end of block\\n\"));\n        c->mode = WASH;\n        break;\n      }\n      c->mode = BADCODE;        /* invalid code */\n      z->msg = (char*)\"invalid literal/length code\";\n      r = Z_DATA_ERROR;\n      LEAVE\n    case LENEXT:        /* i: getting length extra (have base) */\n      j = c->sub.copy.get;\n      NEEDBITS(j)\n      c->len += (uInt)b & inflate_mask[j];\n      DUMPBITS(j)\n      c->sub.code.need = c->dbits;\n      c->sub.code.tree = c->dtree;\n      Tracevv((stderr, \"inflate:         length %u\\n\", c->len));\n      c->mode = DIST;\n    case DIST:          /* i: get distance next */\n      j = c->sub.code.need;\n      NEEDBITS(j)\n      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);\n      DUMPBITS(t->bits)\n      e = (uInt)(t->exop);\n      if (e & 16)               /* distance */\n      {\n        c->sub.copy.get = e & 15;\n        c->sub.copy.dist = t->base;\n        c->mode = DISTEXT;\n        break;\n      }\n      if ((e & 64) == 0)        /* next table */\n      {\n        c->sub.code.need = e;\n        c->sub.code.tree = t + t->base;\n        break;\n      }\n      c->mode = BADCODE;        /* invalid code */\n      z->msg = (char*)\"invalid distance code\";\n      r = Z_DATA_ERROR;\n      LEAVE\n    case DISTEXT:       /* i: getting distance extra */\n      j = c->sub.copy.get;\n      NEEDBITS(j)\n      c->sub.copy.dist += (uInt)b & inflate_mask[j];\n      DUMPBITS(j)\n      Tracevv((stderr, \"inflate:         distance %u\\n\", c->sub.copy.dist));\n      c->mode = COPY;\n    case COPY:          /* o: copying bytes in window, waiting for space */\n      f = q - c->sub.copy.dist;\n      while (f < s->window)             /* modulo window size-\"while\" instead */\n        f += s->end - s->window;        /* of \"if\" handles invalid distances */\n      while (c->len)\n      {\n        NEEDOUT\n        OUTBYTE(*f++)\n        if (f == s->end)\n          f = s->window;\n        c->len--;\n      }\n      c->mode = START;\n      break;\n    case LIT:           /* o: got literal, waiting for output space */\n      NEEDOUT\n      OUTBYTE(c->sub.lit)\n      c->mode = START;\n      break;\n    case WASH:          /* o: got eob, possibly more output */\n      if (k > 7)        /* return unused byte, if any */\n      {\n        Assert(k < 16, \"inflate_codes grabbed too many bytes\")\n        k -= 8;\n        n++;\n        p--;            /* can always return one */\n      }\n      FLUSH\n      if (s->read != s->write)\n        LEAVE\n      c->mode = END;\n    case END:\n      r = Z_STREAM_END;\n      LEAVE\n    case BADCODE:       /* x: got error */\n      r = Z_DATA_ERROR;\n      LEAVE\n    default:\n      r = Z_STREAM_ERROR;\n      LEAVE\n  }\n#ifdef NEED_DUMMY_RETURN\n  return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */\n#endif\n}\n\n\nlocal void inflate_codes_free( /* c, z) */\ninflate_codes_statef *c,\nz_streamp z )\n{\n  ZFREE(z, c);\n  Tracev((stderr, \"inflate:       codes free\\n\"));\n}\n"
  },
  {
    "path": "libs/freetype/src/gzip/infcodes.h",
    "content": "/* infcodes.h -- header to use infcodes.c\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n#ifndef _INFCODES_H\n#define _INFCODES_H\n\nstruct inflate_codes_state;\ntypedef struct inflate_codes_state FAR inflate_codes_statef;\n\nlocal inflate_codes_statef *inflate_codes_new OF((\n    uInt, uInt,\n    inflate_huft *, inflate_huft *,\n    z_streamp ));\n\nlocal int inflate_codes OF((\n    inflate_blocks_statef *,\n    z_streamp ,\n    int));\n\nlocal void inflate_codes_free OF((\n    inflate_codes_statef *,\n    z_streamp ));\n\n#endif /* _INFCODES_H */\n"
  },
  {
    "path": "libs/freetype/src/gzip/inffixed.h",
    "content": "/* inffixed.h -- table for decoding fixed codes\n * Generated automatically by the maketree.c program\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\nlocal const uInt fixed_bl = 9;\nlocal const uInt fixed_bd = 5;\nlocal const inflate_huft fixed_tl[] = {\n    {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},\n    {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192},\n    {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160},\n    {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224},\n    {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144},\n    {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208},\n    {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176},\n    {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240},\n    {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},\n    {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200},\n    {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168},\n    {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232},\n    {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152},\n    {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216},\n    {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184},\n    {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248},\n    {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},\n    {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196},\n    {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164},\n    {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228},\n    {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148},\n    {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212},\n    {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180},\n    {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244},\n    {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},\n    {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204},\n    {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172},\n    {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236},\n    {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156},\n    {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220},\n    {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188},\n    {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252},\n    {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},\n    {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194},\n    {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162},\n    {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226},\n    {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146},\n    {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210},\n    {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178},\n    {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242},\n    {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},\n    {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202},\n    {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170},\n    {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234},\n    {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154},\n    {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218},\n    {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186},\n    {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250},\n    {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},\n    {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198},\n    {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166},\n    {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230},\n    {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150},\n    {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214},\n    {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182},\n    {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246},\n    {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},\n    {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206},\n    {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174},\n    {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238},\n    {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158},\n    {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222},\n    {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190},\n    {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254},\n    {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},\n    {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193},\n    {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161},\n    {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225},\n    {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145},\n    {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209},\n    {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177},\n    {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241},\n    {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},\n    {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201},\n    {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169},\n    {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233},\n    {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153},\n    {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217},\n    {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185},\n    {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249},\n    {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},\n    {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197},\n    {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165},\n    {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229},\n    {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149},\n    {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213},\n    {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181},\n    {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245},\n    {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},\n    {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205},\n    {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173},\n    {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237},\n    {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157},\n    {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221},\n    {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189},\n    {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253},\n    {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},\n    {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195},\n    {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163},\n    {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227},\n    {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147},\n    {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211},\n    {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179},\n    {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243},\n    {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},\n    {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203},\n    {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171},\n    {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235},\n    {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155},\n    {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219},\n    {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187},\n    {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251},\n    {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},\n    {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199},\n    {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167},\n    {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231},\n    {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151},\n    {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215},\n    {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183},\n    {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247},\n    {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},\n    {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207},\n    {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175},\n    {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239},\n    {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159},\n    {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223},\n    {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191},\n    {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255}\n  };\nlocal const inflate_huft fixed_td[] = {\n    {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097},\n    {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385},\n    {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193},\n    {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577},\n    {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145},\n    {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577},\n    {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289},\n    {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577}\n  };\n"
  },
  {
    "path": "libs/freetype/src/gzip/inflate.c",
    "content": "/* inflate.c -- zlib interface to inflate modules\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"zutil.h\"\n#include \"infblock.h\"\n\n#define  DONE  INFLATE_DONE\n#define  BAD   INFLATE_BAD\n\ntypedef enum {\n      METHOD,   /* waiting for method byte */\n      FLAG,     /* waiting for flag byte */\n      DICT4,    /* four dictionary check bytes to go */\n      DICT3,    /* three dictionary check bytes to go */\n      DICT2,    /* two dictionary check bytes to go */\n      DICT1,    /* one dictionary check byte to go */\n      DICT0,    /* waiting for inflateSetDictionary */\n      BLOCKS,   /* decompressing blocks */\n      CHECK4,   /* four check bytes to go */\n      CHECK3,   /* three check bytes to go */\n      CHECK2,   /* two check bytes to go */\n      CHECK1,   /* one check byte to go */\n      DONE,     /* finished check, done */\n      BAD}      /* got an error--stay here */\ninflate_mode;\n\n/* inflate private state */\nstruct internal_state {\n\n  /* mode */\n  inflate_mode  mode;   /* current inflate mode */\n\n  /* mode dependent information */\n  union {\n    uInt method;        /* if FLAGS, method byte */\n    struct {\n      uLong was;                /* computed check value */\n      uLong need;               /* stream check value */\n    } check;            /* if CHECK, check values to compare */\n    uInt marker;        /* if BAD, inflateSync's marker bytes count */\n  } sub;        /* submode */\n\n  /* mode independent information */\n  int  nowrap;          /* flag for no wrapper */\n  uInt wbits;           /* log2(window size)  (8..15, defaults to 15) */\n  inflate_blocks_statef\n    *blocks;            /* current inflate_blocks state */\n\n};\n\n\nZEXPORT(int) inflateReset( /* z) */\nz_streamp z )\n{\n  if (z == Z_NULL || z->state == Z_NULL)\n    return Z_STREAM_ERROR;\n  z->total_in = z->total_out = 0;\n  z->msg = Z_NULL;\n  z->state->mode = z->state->nowrap ? BLOCKS : METHOD;\n  inflate_blocks_reset(z->state->blocks, z, Z_NULL);\n  Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK;\n}\n\n\nZEXPORT(int) inflateEnd( /* z) */\nz_streamp z )\n{\n  if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)\n    return Z_STREAM_ERROR;\n  if (z->state->blocks != Z_NULL)\n    inflate_blocks_free(z->state->blocks, z);\n  ZFREE(z, z->state);\n  z->state = Z_NULL;\n  Tracev((stderr, \"inflate: end\\n\"));\n  return Z_OK;\n}\n\n\nZEXPORT(int) inflateInit2_( /* z, w, version, stream_size) */\nz_streamp z,\nint w,\nconst char *version,\nint stream_size )\n{\n  if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||\n      stream_size != sizeof(z_stream))\n      return Z_VERSION_ERROR;\n\n  /* initialize state */\n  if (z == Z_NULL)\n    return Z_STREAM_ERROR;\n  z->msg = Z_NULL;\n  if (z->zalloc == Z_NULL)\n  {\n    z->zalloc = zcalloc;\n    z->opaque = (voidpf)0;\n  }\n  if (z->zfree == Z_NULL) z->zfree = zcfree;\n  if ((z->state = (struct internal_state FAR *)\n       ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)\n    return Z_MEM_ERROR;\n  z->state->blocks = Z_NULL;\n\n  /* handle undocumented nowrap option (no zlib header or check) */\n  z->state->nowrap = 0;\n  if (w < 0)\n  {\n    w = - w;\n    z->state->nowrap = 1;\n  }\n\n  /* set window size */\n  if (w < 8 || w > 15)\n  {\n    inflateEnd(z);\n    return Z_STREAM_ERROR;\n  }\n  z->state->wbits = (uInt)w;\n\n  /* create inflate_blocks state */\n  if ((z->state->blocks =\n      inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w))\n      == Z_NULL)\n  {\n    inflateEnd(z);\n    return Z_MEM_ERROR;\n  }\n  Tracev((stderr, \"inflate: allocated\\n\"));\n\n  /* reset state */\n  inflateReset(z);\n  return Z_OK;\n}\n\n\n\n#undef  NEEDBYTE\n#define NEEDBYTE {if(z->avail_in==0)return r;r=f;}\n\n#undef  NEXTBYTE\n#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)\n\n\nZEXPORT(int) inflate( /* z, f) */\nz_streamp z,\nint f )\n{\n  int r;\n  uInt b;\n\n  if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL)\n    return Z_STREAM_ERROR;\n  f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;\n  r = Z_BUF_ERROR;\n  while (1) switch (z->state->mode)\n  {\n    case METHOD:\n      NEEDBYTE\n      if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED)\n      {\n        z->state->mode = BAD;\n        z->msg = (char*)\"unknown compression method\";\n        z->state->sub.marker = 5;       /* can't try inflateSync */\n        break;\n      }\n      if ((z->state->sub.method >> 4) + 8 > z->state->wbits)\n      {\n        z->state->mode = BAD;\n        z->msg = (char*)\"invalid window size\";\n        z->state->sub.marker = 5;       /* can't try inflateSync */\n        break;\n      }\n      z->state->mode = FLAG;\n    case FLAG:\n      NEEDBYTE\n      b = NEXTBYTE;\n      if (((z->state->sub.method << 8) + b) % 31)\n      {\n        z->state->mode = BAD;\n        z->msg = (char*)\"incorrect header check\";\n        z->state->sub.marker = 5;       /* can't try inflateSync */\n        break;\n      }\n      Tracev((stderr, \"inflate: zlib header ok\\n\"));\n      if (!(b & PRESET_DICT))\n      {\n        z->state->mode = BLOCKS;\n        break;\n      }\n      z->state->mode = DICT4;\n    case DICT4:\n      NEEDBYTE\n      z->state->sub.check.need = (uLong)NEXTBYTE << 24;\n      z->state->mode = DICT3;\n    case DICT3:\n      NEEDBYTE\n      z->state->sub.check.need += (uLong)NEXTBYTE << 16;\n      z->state->mode = DICT2;\n    case DICT2:\n      NEEDBYTE\n      z->state->sub.check.need += (uLong)NEXTBYTE << 8;\n      z->state->mode = DICT1;\n    case DICT1:\n      NEEDBYTE\n      z->state->sub.check.need += (uLong)NEXTBYTE;\n      z->adler = z->state->sub.check.need;\n      z->state->mode = DICT0;\n      return Z_NEED_DICT;\n    case DICT0:\n      z->state->mode = BAD;\n      z->msg = (char*)\"need dictionary\";\n      z->state->sub.marker = 0;       /* can try inflateSync */\n      return Z_STREAM_ERROR;\n    case BLOCKS:\n      r = inflate_blocks(z->state->blocks, z, r);\n      if (r == Z_DATA_ERROR)\n      {\n        z->state->mode = BAD;\n        z->state->sub.marker = 0;       /* can try inflateSync */\n        break;\n      }\n      if (r == Z_OK)\n        r = f;\n      if (r != Z_STREAM_END)\n        return r;\n      r = f;\n      inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);\n      if (z->state->nowrap)\n      {\n        z->state->mode = DONE;\n        break;\n      }\n      z->state->mode = CHECK4;\n    case CHECK4:\n      NEEDBYTE\n      z->state->sub.check.need = (uLong)NEXTBYTE << 24;\n      z->state->mode = CHECK3;\n    case CHECK3:\n      NEEDBYTE\n      z->state->sub.check.need += (uLong)NEXTBYTE << 16;\n      z->state->mode = CHECK2;\n    case CHECK2:\n      NEEDBYTE\n      z->state->sub.check.need += (uLong)NEXTBYTE << 8;\n      z->state->mode = CHECK1;\n    case CHECK1:\n      NEEDBYTE\n      z->state->sub.check.need += (uLong)NEXTBYTE;\n\n      if (z->state->sub.check.was != z->state->sub.check.need)\n      {\n        z->state->mode = BAD;\n        z->msg = (char*)\"incorrect data check\";\n        z->state->sub.marker = 5;       /* can't try inflateSync */\n        break;\n      }\n      Tracev((stderr, \"inflate: zlib check ok\\n\"));\n      z->state->mode = DONE;\n    case DONE:\n      return Z_STREAM_END;\n    case BAD:\n      return Z_DATA_ERROR;\n    default:\n      return Z_STREAM_ERROR;\n  }\n#ifdef NEED_DUMMY_RETURN\n  return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */\n#endif\n}\n\n"
  },
  {
    "path": "libs/freetype/src/gzip/inftrees.c",
    "content": "/* inftrees.c -- generate Huffman trees for efficient decoding\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"zutil.h\"\n#include \"inftrees.h\"\n\n#if !defined(BUILDFIXED) && !defined(STDC)\n#  define BUILDFIXED   /* non ANSI compilers may not accept inffixed.h */\n#endif\n\n\n#if 0\nlocal const char inflate_copyright[] =\n   \" inflate 1.1.4 Copyright 1995-2002 Mark Adler \";\n#endif\n/*\n  If you use the zlib library in a product, an acknowledgment is welcome\n  in the documentation of your product. If for some reason you cannot\n  include such an acknowledgment, I would appreciate that you keep this\n  copyright string in the executable of your product.\n */\n\n/* simplify the use of the inflate_huft type with some defines */\n#define exop word.what.Exop\n#define bits word.what.Bits\n\n\nlocal int huft_build OF((\n    uIntf *,            /* code lengths in bits */\n    uInt,               /* number of codes */\n    uInt,               /* number of \"simple\" codes */\n    const uIntf *,      /* list of base values for non-simple codes */\n    const uIntf *,      /* list of extra bits for non-simple codes */\n    inflate_huft * FAR*,/* result: starting table */\n    uIntf *,            /* maximum lookup bits (returns actual) */\n    inflate_huft *,     /* space for trees */\n    uInt *,             /* hufts used in space */\n    uIntf * ));         /* space for values */\n\n/* Tables for deflate from PKZIP's appnote.txt. */\nlocal const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */\n        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};\n        /* see note #13 above about 258 */\nlocal const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */\n        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,\n        3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */\nlocal const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */\n        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n        8193, 12289, 16385, 24577};\nlocal const uInt cpdext[30] = { /* Extra bits for distance codes */\n        0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,\n        7, 7, 8, 8, 9, 9, 10, 10, 11, 11,\n        12, 12, 13, 13};\n\n/*\n   Huffman code decoding is performed using a multi-level table lookup.\n   The fastest way to decode is to simply build a lookup table whose\n   size is determined by the longest code.  However, the time it takes\n   to build this table can also be a factor if the data being decoded\n   is not very long.  The most common codes are necessarily the\n   shortest codes, so those codes dominate the decoding time, and hence\n   the speed.  The idea is you can have a shorter table that decodes the\n   shorter, more probable codes, and then point to subsidiary tables for\n   the longer codes.  The time it costs to decode the longer codes is\n   then traded against the time it takes to make longer tables.\n\n   This results of this trade are in the variables lbits and dbits\n   below.  lbits is the number of bits the first level table for literal/\n   length codes can decode in one step, and dbits is the same thing for\n   the distance codes.  Subsequent tables are also less than or equal to\n   those sizes.  These values may be adjusted either when all of the\n   codes are shorter than that, in which case the longest code length in\n   bits is used, or when the shortest code is *longer* than the requested\n   table size, in which case the length of the shortest code in bits is\n   used.\n\n   There are two different values for the two tables, since they code a\n   different number of possibilities each.  The literal/length table\n   codes 286 possible values, or in a flat code, a little over eight\n   bits.  The distance table codes 30 possible values, or a little less\n   than five bits, flat.  The optimum values for speed end up being\n   about one bit more than those, so lbits is 8+1 and dbits is 5+1.\n   The optimum values may differ though from machine to machine, and\n   possibly even between compilers.  Your mileage may vary.\n */\n\n\n/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */\n#define BMAX 15         /* maximum bit length of any code */\n\nlocal int huft_build( /* b, n, s, d, e, t, m, hp, hn, v) */\nuIntf *b,               /* code lengths in bits (all assumed <= BMAX) */\nuInt n,                 /* number of codes (assumed <= 288) */\nuInt s,                 /* number of simple-valued codes (0..s-1) */\nconst uIntf *d,         /* list of base values for non-simple codes */\nconst uIntf *e,         /* list of extra bits for non-simple codes */\ninflate_huft * FAR *t,  /* result: starting table */\nuIntf *m,               /* maximum lookup bits, returns actual */\ninflate_huft *hp,       /* space for trees */\nuInt *hn,               /* hufts used in space */\nuIntf *v                /* working area: values in order of bit length */\n/* Given a list of code lengths and a maximum table size, make a set of\n   tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR\n   if the given code set is incomplete (the tables are still built in this\n   case), or Z_DATA_ERROR if the input is invalid. */\n)\n{\n\n  uInt a;                       /* counter for codes of length k */\n  uInt c[BMAX+1];               /* bit length count table */\n  uInt f;                       /* i repeats in table every f entries */\n  int g;                        /* maximum code length */\n  int h;                        /* table level */\n  register uInt i;              /* counter, current code */\n  register uInt j;              /* counter */\n  register int k;               /* number of bits in current code */\n  int l;                        /* bits per table (returned in m) */\n  uInt mask;                    /* (1 << w) - 1, to avoid cc -O bug on HP */\n  register uIntf *p;            /* pointer into c[], b[], or v[] */\n  inflate_huft *q;              /* points to current table */\n  struct inflate_huft_s r;      /* table entry for structure assignment */\n  inflate_huft *u[BMAX];        /* table stack */\n  register int w;               /* bits before this table == (l * h) */\n  uInt x[BMAX+1];               /* bit offsets, then code stack */\n  uIntf *xp;                    /* pointer into x */\n  int y;                        /* number of dummy codes added */\n  uInt z;                       /* number of entries in current table */\n\n\n  /* Make compiler happy */\n  r.base = 0;\n\n  /* Generate counts for each bit length */\n  p = c;\n#define C0 *p++ = 0;\n#define C2 C0 C0 C0 C0\n#define C4 C2 C2 C2 C2\n  C4                            /* clear c[]--assume BMAX+1 is 16 */\n  p = b;  i = n;\n  do {\n    c[*p++]++;                  /* assume all entries <= BMAX */\n  } while (--i);\n  if (c[0] == n)                /* null input--all zero length codes */\n  {\n    *t = (inflate_huft *)Z_NULL;\n    *m = 0;\n    return Z_OK;\n  }\n\n\n  /* Find minimum and maximum length, bound *m by those */\n  l = *m;\n  for (j = 1; j <= BMAX; j++)\n    if (c[j])\n      break;\n  k = j;                        /* minimum code length */\n  if ((uInt)l < j)\n    l = j;\n  for (i = BMAX; i; i--)\n    if (c[i])\n      break;\n  g = i;                        /* maximum code length */\n  if ((uInt)l > i)\n    l = i;\n  *m = l;\n\n\n  /* Adjust last length count to fill out codes, if needed */\n  for (y = 1 << j; j < i; j++, y <<= 1)\n    if ((y -= c[j]) < 0)\n      return Z_DATA_ERROR;\n  if ((y -= c[i]) < 0)\n    return Z_DATA_ERROR;\n  c[i] += y;\n\n\n  /* Generate starting offsets into the value table for each length */\n  x[1] = j = 0;\n  p = c + 1;  xp = x + 2;\n  while (--i) {                 /* note that i == g from above */\n    *xp++ = (j += *p++);\n  }\n\n\n  /* Make a table of values in order of bit lengths */\n  p = b;  i = 0;\n  do {\n    if ((j = *p++) != 0)\n      v[x[j]++] = i;\n  } while (++i < n);\n  n = x[g];                     /* set n to length of v */\n\n\n  /* Generate the Huffman codes and for each, make the table entries */\n  x[0] = i = 0;                 /* first Huffman code is zero */\n  p = v;                        /* grab values in bit order */\n  h = -1;                       /* no tables yet--level -1 */\n  w = -l;                       /* bits decoded == (l * h) */\n  u[0] = (inflate_huft *)Z_NULL;        /* just to keep compilers happy */\n  q = (inflate_huft *)Z_NULL;   /* ditto */\n  z = 0;                        /* ditto */\n\n  /* go through the bit lengths (k already is bits in shortest code) */\n  for (; k <= g; k++)\n  {\n    a = c[k];\n    while (a--)\n    {\n      /* here i is the Huffman code of length k bits for value *p */\n      /* make tables up to required level */\n      while (k > w + l)\n      {\n        h++;\n        w += l;                 /* previous table always l bits */\n\n        /* compute minimum size table less than or equal to l bits */\n        z = g - w;\n        z = z > (uInt)l ? (uInt)l : z;        /* table size upper limit */\n        if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */\n        {                       /* too few codes for k-w bit table */\n          f -= a + 1;           /* deduct codes from patterns left */\n          xp = c + k;\n          if (j < z)\n            while (++j < z)     /* try smaller tables up to z bits */\n            {\n              if ((f <<= 1) <= *++xp)\n                break;          /* enough codes to use up j bits */\n              f -= *xp;         /* else deduct codes from patterns */\n            }\n        }\n        z = 1 << j;             /* table entries for j-bit table */\n\n        /* allocate new table */\n        if (*hn + z > MANY)     /* (note: doesn't matter for fixed) */\n          return Z_DATA_ERROR;  /* overflow of MANY */\n        u[h] = q = hp + *hn;\n        *hn += z;\n\n        /* connect to last table, if there is one */\n        if (h)\n        {\n          x[h] = i;             /* save pattern for backing up */\n          r.bits = (Byte)l;     /* bits to dump before this table */\n          r.exop = (Byte)j;     /* bits in this table */\n          j = i >> (w - l);\n          r.base = (uInt)(q - u[h-1] - j);   /* offset to this table */\n          u[h-1][j] = r;        /* connect to last table */\n        }\n        else\n          *t = q;               /* first table is returned result */\n      }\n\n      /* set up table entry in r */\n      r.bits = (Byte)(k - w);\n      if (p >= v + n)\n        r.exop = 128 + 64;      /* out of values--invalid code */\n      else if (*p < s)\n      {\n        r.exop = (Byte)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */\n        r.base = *p++;          /* simple code is just the value */\n      }\n      else\n      {\n        r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */\n        r.base = d[*p++ - s];\n      }\n\n      /* fill code-like entries with r */\n      f = 1 << (k - w);\n      for (j = i >> w; j < z; j += f)\n        q[j] = r;\n\n      /* backwards increment the k-bit code i */\n      for (j = 1 << (k - 1); i & j; j >>= 1)\n        i ^= j;\n      i ^= j;\n\n      /* backup over finished tables */\n      mask = (1 << w) - 1;      /* needed on HP, cc -O bug */\n      while ((i & mask) != x[h])\n      {\n        h--;                    /* don't need to update q */\n        w -= l;\n        mask = (1 << w) - 1;\n      }\n    }\n  }\n\n\n  /* Return Z_BUF_ERROR if we were given an incomplete table */\n  return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;\n}\n\n\nlocal int inflate_trees_bits( /* c, bb, tb, hp, z) */\nuIntf *c,               /* 19 code lengths */\nuIntf *bb,              /* bits tree desired/actual depth */\ninflate_huft * FAR *tb, /* bits tree result */\ninflate_huft *hp,       /* space for trees */\nz_streamp z             /* for messages */\n)\n{\n  int r;\n  uInt hn = 0;          /* hufts used in space */\n  uIntf *v;             /* work area for huft_build */\n\n  if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL)\n    return Z_MEM_ERROR;\n  r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL,\n                 tb, bb, hp, &hn, v);\n  if (r == Z_DATA_ERROR)\n    z->msg = (char*)\"oversubscribed dynamic bit lengths tree\";\n  else if (r == Z_BUF_ERROR || *bb == 0)\n  {\n    z->msg = (char*)\"incomplete dynamic bit lengths tree\";\n    r = Z_DATA_ERROR;\n  }\n  ZFREE(z, v);\n  return r;\n}\n\n\nlocal int inflate_trees_dynamic( /* nl, nd, c, bl, bd, tl, td, hp, z) */\nuInt nl,                /* number of literal/length codes */\nuInt nd,                /* number of distance codes */\nuIntf *c,               /* that many (total) code lengths */\nuIntf *bl,              /* literal desired/actual bit depth */\nuIntf *bd,              /* distance desired/actual bit depth */\ninflate_huft * FAR *tl, /* literal/length tree result */\ninflate_huft * FAR *td, /* distance tree result */\ninflate_huft *hp,       /* space for trees */\nz_streamp z             /* for messages */\n)\n{\n  int r;\n  uInt hn = 0;          /* hufts used in space */\n  uIntf *v;             /* work area for huft_build */\n\n  /* allocate work area */\n  if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)\n    return Z_MEM_ERROR;\n\n  /* build literal/length tree */\n  r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v);\n  if (r != Z_OK || *bl == 0)\n  {\n    if (r == Z_DATA_ERROR)\n      z->msg = (char*)\"oversubscribed literal/length tree\";\n    else if (r != Z_MEM_ERROR)\n    {\n      z->msg = (char*)\"incomplete literal/length tree\";\n      r = Z_DATA_ERROR;\n    }\n    ZFREE(z, v);\n    return r;\n  }\n\n  /* build distance tree */\n  r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v);\n  if (r != Z_OK || (*bd == 0 && nl > 257))\n  {\n    if (r == Z_DATA_ERROR)\n      z->msg = (char*)\"oversubscribed distance tree\";\n    else if (r == Z_BUF_ERROR) {\n#if 0\n    {\n#endif\n#ifdef PKZIP_BUG_WORKAROUND\n      r = Z_OK;\n    }\n#else\n      z->msg = (char*)\"incomplete distance tree\";\n      r = Z_DATA_ERROR;\n    }\n    else if (r != Z_MEM_ERROR)\n    {\n      z->msg = (char*)\"empty distance tree with lengths\";\n      r = Z_DATA_ERROR;\n    }\n    ZFREE(z, v);\n    return r;\n#endif\n  }\n\n  /* done */\n  ZFREE(z, v);\n  return Z_OK;\n}\n\n\n/* build fixed tables only once--keep them here */\n#ifdef BUILDFIXED\nlocal int fixed_built = 0;\n#define FIXEDH 544      /* number of hufts used by fixed tables */\nlocal inflate_huft fixed_mem[FIXEDH];\nlocal uInt fixed_bl;\nlocal uInt fixed_bd;\nlocal inflate_huft *fixed_tl;\nlocal inflate_huft *fixed_td;\n#else\n#include \"inffixed.h\"\n#endif\n\n\nlocal int inflate_trees_fixed( /* bl, bd, tl, td, z) */\nuIntf *bl,                      /* literal desired/actual bit depth */\nuIntf *bd,                      /* distance desired/actual bit depth */\nconst inflate_huft * FAR *tl,   /* literal/length tree result */\nconst inflate_huft * FAR *td,   /* distance tree result */\nz_streamp z                     /* for memory allocation */\n)\n{\n#ifdef BUILDFIXED\n  /* build fixed tables if not already */\n  if (!fixed_built)\n  {\n    int k;              /* temporary variable */\n    uInt f = 0;         /* number of hufts used in fixed_mem */\n    uIntf *c;           /* length list for huft_build */\n    uIntf *v;           /* work area for huft_build */\n\n    /* allocate memory */\n    if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)\n      return Z_MEM_ERROR;\n    if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)\n    {\n      ZFREE(z, c);\n      return Z_MEM_ERROR;\n    }\n\n    /* literal table */\n    for (k = 0; k < 144; k++)\n      c[k] = 8;\n    for (; k < 256; k++)\n      c[k] = 9;\n    for (; k < 280; k++)\n      c[k] = 7;\n    for (; k < 288; k++)\n      c[k] = 8;\n    fixed_bl = 9;\n    huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl,\n               fixed_mem, &f, v);\n\n    /* distance table */\n    for (k = 0; k < 30; k++)\n      c[k] = 5;\n    fixed_bd = 5;\n    huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd,\n               fixed_mem, &f, v);\n\n    /* done */\n    ZFREE(z, v);\n    ZFREE(z, c);\n    fixed_built = 1;\n  }\n#else\n  FT_UNUSED(z);\n#endif\n  *bl = fixed_bl;\n  *bd = fixed_bd;\n  *tl = fixed_tl;\n  *td = fixed_td;\n  return Z_OK;\n}\n"
  },
  {
    "path": "libs/freetype/src/gzip/inftrees.h",
    "content": "/* inftrees.h -- header to use inftrees.c\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* Huffman code lookup table entry--this entry is four bytes for machines\n   that have 16-bit pointers (e.g. PC's in the small or medium model). */\n\n#ifndef _INFTREES_H\n#define _INFTREES_H\n\ntypedef struct inflate_huft_s FAR inflate_huft;\n\nstruct inflate_huft_s {\n  union {\n    struct {\n      Byte Exop;        /* number of extra bits or operation */\n      Byte Bits;        /* number of bits in this code or subcode */\n    } what;\n    uInt pad;           /* pad structure to a power of 2 (4 bytes for */\n  } word;               /*  16-bit, 8 bytes for 32-bit int's) */\n  uInt base;            /* literal, length base, distance base,\n                           or table offset */\n};\n\n/* Maximum size of dynamic tree.  The maximum found in a long but non-\n   exhaustive search was 1004 huft structures (850 for length/literals\n   and 154 for distances, the latter actually the result of an\n   exhaustive search).  The actual maximum is not known, but the\n   value below is more than safe. */\n#define MANY 1440\n\nlocal  int inflate_trees_bits OF((\n    uIntf *,                    /* 19 code lengths */\n    uIntf *,                    /* bits tree desired/actual depth */\n    inflate_huft * FAR *,       /* bits tree result */\n    inflate_huft *,             /* space for trees */\n    z_streamp));                /* for messages */\n\nlocal  int inflate_trees_dynamic OF((\n    uInt,                       /* number of literal/length codes */\n    uInt,                       /* number of distance codes */\n    uIntf *,                    /* that many (total) code lengths */\n    uIntf *,                    /* literal desired/actual bit depth */\n    uIntf *,                    /* distance desired/actual bit depth */\n    inflate_huft * FAR *,       /* literal/length tree result */\n    inflate_huft * FAR *,       /* distance tree result */\n    inflate_huft *,             /* space for trees */\n    z_streamp));                /* for messages */\n\nlocal  int inflate_trees_fixed OF((\n    uIntf *,                    /* literal desired/actual bit depth */\n    uIntf *,                    /* distance desired/actual bit depth */\n    const inflate_huft * FAR *, /* literal/length tree result */\n    const inflate_huft * FAR *, /* distance tree result */\n    z_streamp));                /* for memory allocation */\n\n#endif /* _INFTREES_H */\n"
  },
  {
    "path": "libs/freetype/src/gzip/infutil.c",
    "content": "/* inflate_util.c -- data and routines common to blocks and codes\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n#include \"zutil.h\"\n#include \"infblock.h\"\n#include \"inftrees.h\"\n#include \"infcodes.h\"\n#include \"infutil.h\"\n\n\n/* And'ing with mask[n] masks the lower n bits */\nlocal const uInt inflate_mask[17] = {\n    0x0000,\n    0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,\n    0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff\n};\n\n\n/* copy as much as possible from the sliding window to the output area */\nlocal int inflate_flush( /* s, z, r) */\ninflate_blocks_statef *s,\nz_streamp z,\nint r )\n{\n  uInt n;\n  Bytef *p;\n  Bytef *q;\n\n  /* local copies of source and destination pointers */\n  p = z->next_out;\n  q = s->read;\n\n  /* compute number of bytes to copy as far as end of window */\n  n = (uInt)((q <= s->write ? s->write : s->end) - q);\n  if (n > z->avail_out) n = z->avail_out;\n  if (n && r == Z_BUF_ERROR) r = Z_OK;\n\n  /* update counters */\n  z->avail_out -= n;\n  z->total_out += n;\n\n  /* update check information */\n  if (s->checkfn != Z_NULL)\n    z->adler = s->check = (*s->checkfn)(s->check, q, n);\n\n  /* copy as far as end of window */\n  zmemcpy(p, q, n);\n  p += n;\n  q += n;\n\n  /* see if more to copy at beginning of window */\n  if (q == s->end)\n  {\n    /* wrap pointers */\n    q = s->window;\n    if (s->write == s->end)\n      s->write = s->window;\n\n    /* compute bytes to copy */\n    n = (uInt)(s->write - q);\n    if (n > z->avail_out) n = z->avail_out;\n    if (n && r == Z_BUF_ERROR) r = Z_OK;\n\n    /* update counters */\n    z->avail_out -= n;\n    z->total_out += n;\n\n    /* update check information */\n    if (s->checkfn != Z_NULL)\n      z->adler = s->check = (*s->checkfn)(s->check, q, n);\n\n    /* copy */\n    zmemcpy(p, q, n);\n    p += n;\n    q += n;\n  }\n\n  /* update pointers */\n  z->next_out = p;\n  s->read = q;\n\n  /* done */\n  return r;\n}\n"
  },
  {
    "path": "libs/freetype/src/gzip/infutil.h",
    "content": "/* infutil.h -- types and macros common to blocks and codes\n * Copyright (C) 1995-2002 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n#ifndef _INFUTIL_H\n#define _INFUTIL_H\n\ntypedef enum {\n      TYPE,     /* get type bits (3, including end bit) */\n      LENS,     /* get lengths for stored */\n      STORED,   /* processing stored block */\n      TABLE,    /* get table lengths */\n      BTREE,    /* get bit lengths tree for a dynamic block */\n      DTREE,    /* get length, distance trees for a dynamic block */\n      CODES,    /* processing fixed or dynamic block */\n      DRY,      /* output remaining window bytes */\n      DONE,     /* finished last block, done */\n      BAD}      /* got a data error--stuck here */\ninflate_block_mode;\n\n/* inflate blocks semi-private state */\nstruct inflate_blocks_state {\n\n  /* mode */\n  inflate_block_mode  mode;     /* current inflate_block mode */\n\n  /* mode dependent information */\n  union {\n    uInt left;          /* if STORED, bytes left to copy */\n    struct {\n      uInt table;               /* table lengths (14 bits) */\n      uInt index;               /* index into blens (or border) */\n      uIntf *blens;             /* bit lengths of codes */\n      uInt bb;                  /* bit length tree depth */\n      inflate_huft *tb;         /* bit length decoding tree */\n    } trees;            /* if DTREE, decoding info for trees */\n    struct {\n      inflate_codes_statef\n         *codes;\n    } decode;           /* if CODES, current state */\n  } sub;                /* submode */\n  uInt last;            /* true if this block is the last block */\n\n  /* mode independent information */\n  uInt bitk;            /* bits in bit buffer */\n  uLong bitb;           /* bit buffer */\n  inflate_huft *hufts;  /* single malloc for tree space */\n  Bytef *window;        /* sliding window */\n  Bytef *end;           /* one byte after sliding window */\n  Bytef *read;          /* window read pointer */\n  Bytef *write;         /* window write pointer */\n  check_func checkfn;   /* check function */\n  uLong check;          /* check on output */\n\n};\n\n\n/* defines for inflate input/output */\n/*   update pointers and return */\n#define UPDBITS {s->bitb=b;s->bitk=k;}\n#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}\n#define UPDOUT {s->write=q;}\n#define UPDATE {UPDBITS UPDIN UPDOUT}\n#define LEAVE {UPDATE return inflate_flush(s,z,r);}\n/*   get bytes and bits */\n#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}\n#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}\n#define NEXTBYTE (n--,*p++)\n#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}\n#define DUMPBITS(j) {b>>=(j);k-=(j);}\n/*   output bytes */\n#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q)\n#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}\n#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}\n#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}\n#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}\n#define OUTBYTE(a) {*q++=(Byte)(a);m--;}\n/*   load local pointers */\n#define LOAD {LOADIN LOADOUT}\n\n/* masks for lower bits (size given to avoid silly warnings with Visual C++) */\n#ifndef NO_INFLATE_MASK\nlocal uInt inflate_mask[17];\n#endif\n\n/* copy as much as possible from the sliding window to the output area */\nlocal int inflate_flush OF((\n    inflate_blocks_statef *,\n    z_streamp ,\n    int));\n\n#endif\n"
  },
  {
    "path": "libs/freetype/src/gzip/rules.mk",
    "content": "#\n# FreeType 2 GZip support configuration rules\n#\n\n\n# Copyright 2002, 2003 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# gzip driver directory\n#\nGZIP_DIR := $(SRC_DIR)/gzip\n\n\n# compilation flags for the driver\n#\nifeq ($(SYSTEM_ZLIB),)\n  GZIP_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(GZIP_DIR))\nelse\n  GZIP_COMPILE := $(FT_COMPILE)\nendif\n\n\n# gzip support sources (i.e., C files)\n#\nGZIP_DRV_SRC := $(GZIP_DIR)/ftgzip.c\n\n# gzip support headers\n#\nGZIP_DRV_H :=\n\n\n# gzip driver object(s)\n#\n#   GZIP_DRV_OBJ_M is used during `multi' builds\n#   GZIP_DRV_OBJ_S is used during `single' builds\n#\nifeq ($(SYSTEM_ZLIB),)\n  GZIP_DRV_OBJ_M := $(GZIP_DRV_SRC:$(GZIP_DIR)/%.c=$(OBJ_DIR)/%.$O)\nelse\n  GZIP_DRV_OBJ_M := $(OBJ_DIR)/ftgzip.$O\nendif\nGZIP_DRV_OBJ_S := $(OBJ_DIR)/ftgzip.$O\n\n# gzip support source file for single build\n#\nGZIP_DRV_SRC_S := $(GZIP_DIR)/ftgzip.c\n\n\n# gzip support - single object\n#\n$(GZIP_DRV_OBJ_S): $(GZIP_DRV_SRC_S) $(GZIP_DRV_SRC) $(FREETYPE_H) \\\n                   $(GZIP_DRV_H)\n\t$(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GZIP_DRV_SRC_S))\n\n\n# gzip support - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(GZIP_DIR)/%.c $(FREETYPE_H) $(GZIP_DRV_H)\n\t$(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(GZIP_DRV_OBJ_S)\nDRV_OBJS_M += $(GZIP_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/gzip/zconf.h",
    "content": "/* zconf.h -- configuration of the zlib compression library\n * Copyright (C) 1995-2002 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#ifndef _ZCONF_H\n#define _ZCONF_H\n\n/*\n * If you *really* need a unique prefix for all types and library functions,\n * compile with -DZ_PREFIX. The \"standard\" zlib should be compiled without it.\n */\n#ifdef Z_PREFIX\n#  define deflateInit_         z_deflateInit_\n#  define deflate              z_deflate\n#  define deflateEnd           z_deflateEnd\n#  define inflateInit_         z_inflateInit_\n#  define inflate              z_inflate\n#  define inflateEnd           z_inflateEnd\n#  define deflateInit2_        z_deflateInit2_\n#  define deflateSetDictionary z_deflateSetDictionary\n#  define deflateCopy          z_deflateCopy\n#  define deflateReset         z_deflateReset\n#  define deflateParams        z_deflateParams\n#  define inflateInit2_        z_inflateInit2_\n#  define inflateSetDictionary z_inflateSetDictionary\n#  define inflateSync          z_inflateSync\n#  define inflateSyncPoint     z_inflateSyncPoint\n#  define inflateReset         z_inflateReset\n#  define compress             z_compress\n#  define compress2            z_compress2\n#  define uncompress           z_uncompress\n#  define adler32              z_adler32\n#  define crc32                z_crc32\n#  define get_crc_table        z_get_crc_table\n\n#  define Byte   z_Byte\n#  define uInt   z_uInt\n#  define uLong  z_uLong\n#  define Bytef  z_Bytef\n#  define charf  z_charf\n#  define intf   z_intf\n#  define uIntf  z_uIntf\n#  define uLongf z_uLongf\n#  define voidpf z_voidpf\n#  define voidp  z_voidp\n#endif\n\n#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)\n#  define WIN32\n#endif\n#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)\n#  ifndef __32BIT__\n#    define __32BIT__\n#  endif\n#endif\n#if defined(__MSDOS__) && !defined(MSDOS)\n#  define MSDOS\n#endif\n\n/* WinCE doesn't have errno.h */\n#ifdef _WIN32_WCE\n#  define NO_ERRNO_H\n#endif\n\n\n/*\n * Compile with -DMAXSEG_64K if the alloc function cannot allocate more\n * than 64k bytes at a time (needed on systems with 16-bit int).\n */\n#if defined(MSDOS) && !defined(__32BIT__)\n#  define MAXSEG_64K\n#endif\n#ifdef MSDOS\n#  define UNALIGNED_OK\n#endif\n\n#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32))  && !defined(STDC)\n#  define STDC\n#endif\n#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)\n#  ifndef STDC\n#    define STDC\n#  endif\n#endif\n\n#ifndef STDC\n#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */\n#    define const\n#  endif\n#endif\n\n/* Some Mac compilers merge all .h files incorrectly: */\n#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)\n#  define NO_DUMMY_DECL\n#endif\n\n/* Old Borland C and LCC incorrectly complains about missing returns: */\n#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)\n#  define NEED_DUMMY_RETURN\n#endif\n\n#if defined(__LCC__)\n#  define  NEED_DUMMY_RETURN\n#endif\n\n/* Maximum value for memLevel in deflateInit2 */\n#ifndef MAX_MEM_LEVEL\n#  ifdef MAXSEG_64K\n#    define MAX_MEM_LEVEL 8\n#  else\n#    define MAX_MEM_LEVEL 9\n#  endif\n#endif\n\n/* Maximum value for windowBits in deflateInit2 and inflateInit2.\n * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files\n * created by gzip. (Files created by minigzip can still be extracted by\n * gzip.)\n */\n#ifndef MAX_WBITS\n#  define MAX_WBITS   15 /* 32K LZ77 window */\n#endif\n\n/* The memory requirements for deflate are (in bytes):\n            (1 << (windowBits+2)) +  (1 << (memLevel+9))\n that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)\n plus a few kilobytes for small objects. For example, if you want to reduce\n the default memory requirements from 256K to 128K, compile with\n     make CFLAGS=\"-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7\"\n Of course this will generally degrade compression (there's no free lunch).\n\n   The memory requirements for inflate are (in bytes) 1 << windowBits\n that is, 32K for windowBits=15 (default value) plus a few kilobytes\n for small objects.\n*/\n\n                        /* Type declarations */\n\n#ifndef OF /* function prototypes */\n#  ifdef STDC\n#    define OF(args)  args\n#  else\n#    define OF(args)  ()\n#  endif\n#endif\n\n/* The following definitions for FAR are needed only for MSDOS mixed\n * model programming (small or medium model with some far allocations).\n * This was tested only with MSC; for other MSDOS compilers you may have\n * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,\n * just define FAR to be empty.\n */\n#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)\n   /* MSC small or medium model */\n#  define SMALL_MEDIUM\n#  ifdef _MSC_VER\n#    define FAR _far\n#  else\n#    define FAR far\n#  endif\n#endif\n#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))\n#  ifndef __32BIT__\n#    define SMALL_MEDIUM\n#    define FAR _far\n#  endif\n#endif\n\n/* Compile with -DZLIB_DLL for Windows DLL support */\n#if defined(ZLIB_DLL)\n#  if defined(_WINDOWS) || defined(WINDOWS)\n#    ifdef FAR\n#      undef FAR\n#    endif\n#    include <windows.h>\n#    define ZEXPORT(x)  x WINAPI\n#    ifdef WIN32\n#      define ZEXPORTVA(x)  x WINAPIV\n#    else\n#      define ZEXPORTVA(x)  x FAR _cdecl _export\n#    endif\n#  endif\n#  if defined (__BORLANDC__)\n#    if (__BORLANDC__ >= 0x0500) && defined (WIN32)\n#      include <windows.h>\n#      define ZEXPORT(x) x __declspec(dllexport) WINAPI\n#      define ZEXPORTRVA(x)  x __declspec(dllexport) WINAPIV\n#    else\n#      if defined (_Windows) && defined (__DLL__)\n#        define ZEXPORT(x) x _export\n#        define ZEXPORTVA(x) x _export\n#      endif\n#    endif\n#  endif\n#endif\n\n\n#ifndef ZEXPORT\n#  define ZEXPORT(x)   static x\n#endif\n#ifndef ZEXPORTVA\n#  define ZEXPORTVA(x)   static x\n#endif\n#ifndef ZEXTERN\n#  define ZEXTERN(x) static x\n#endif\n#ifndef ZEXTERNDEF\n#  define ZEXTERNDEF(x)  static x\n#endif\n\n#ifndef FAR\n#   define FAR\n#endif\n\n#if !defined(MACOS) && !defined(TARGET_OS_MAC)\ntypedef unsigned char  Byte;  /* 8 bits */\n#endif\ntypedef unsigned int   uInt;  /* 16 bits or more */\ntypedef unsigned long  uLong; /* 32 bits or more */\n\n#ifdef SMALL_MEDIUM\n   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */\n#  define Bytef Byte FAR\n#else\n   typedef Byte  FAR Bytef;\n#endif\ntypedef char  FAR charf;\ntypedef int   FAR intf;\ntypedef uInt  FAR uIntf;\ntypedef uLong FAR uLongf;\n\n#ifdef STDC\n   typedef void FAR *voidpf;\n   typedef void     *voidp;\n#else\n   typedef Byte FAR *voidpf;\n   typedef Byte     *voidp;\n#endif\n\n#ifdef HAVE_UNISTD_H\n#  include <sys/types.h> /* for off_t */\n#  include <unistd.h>    /* for SEEK_* and off_t */\n#  define z_off_t  off_t\n#endif\n#ifndef SEEK_SET\n#  define SEEK_SET        0       /* Seek from beginning of file.  */\n#  define SEEK_CUR        1       /* Seek from current position.  */\n#  define SEEK_END        2       /* Set file pointer to EOF plus \"offset\" */\n#endif\n#ifndef z_off_t\n#  define  z_off_t long\n#endif\n\n/* MVS linker does not support external names larger than 8 bytes */\n#if defined(__MVS__)\n#   pragma map(deflateInit_,\"DEIN\")\n#   pragma map(deflateInit2_,\"DEIN2\")\n#   pragma map(deflateEnd,\"DEEND\")\n#   pragma map(inflateInit_,\"ININ\")\n#   pragma map(inflateInit2_,\"ININ2\")\n#   pragma map(inflateEnd,\"INEND\")\n#   pragma map(inflateSync,\"INSY\")\n#   pragma map(inflateSetDictionary,\"INSEDI\")\n#   pragma map(inflate_blocks,\"INBL\")\n#   pragma map(inflate_blocks_new,\"INBLNE\")\n#   pragma map(inflate_blocks_free,\"INBLFR\")\n#   pragma map(inflate_blocks_reset,\"INBLRE\")\n#   pragma map(inflate_codes_free,\"INCOFR\")\n#   pragma map(inflate_codes,\"INCO\")\n#   pragma map(inflate_fast,\"INFA\")\n#   pragma map(inflate_flush,\"INFLU\")\n#   pragma map(inflate_mask,\"INMA\")\n#   pragma map(inflate_set_dictionary,\"INSEDI2\")\n#   pragma map(inflate_copyright,\"INCOPY\")\n#   pragma map(inflate_trees_bits,\"INTRBI\")\n#   pragma map(inflate_trees_dynamic,\"INTRDY\")\n#   pragma map(inflate_trees_fixed,\"INTRFI\")\n#   pragma map(inflate_trees_free,\"INTRFR\")\n#endif\n\n#endif /* _ZCONF_H */\n"
  },
  {
    "path": "libs/freetype/src/gzip/zlib.h",
    "content": "/* zlib.h -- interface of the 'zlib' general purpose compression library\n  version 1.1.4, March 11th, 2002\n\n  Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n\n  Jean-loup Gailly        Mark Adler\n  jloup@gzip.org          madler@alumni.caltech.edu\n\n\n  The data format used by the zlib library is described by RFCs (Request for\n  Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt\n  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).\n*/\n\n#ifndef _ZLIB_H\n#define _ZLIB_H\n\n#include \"zconf.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define ZLIB_VERSION \"1.1.4\"\n\n/*\n     The 'zlib' compression library provides in-memory compression and\n  decompression functions, including integrity checks of the uncompressed\n  data.  This version of the library supports only one compression method\n  (deflation) but other algorithms will be added later and will have the same\n  stream interface.\n\n     Compression can be done in a single step if the buffers are large\n  enough (for example if an input file is mmap'ed), or can be done by\n  repeated calls of the compression function.  In the latter case, the\n  application must provide more input and/or consume the output\n  (providing more output space) before each call.\n\n     The library also supports reading and writing files in gzip (.gz) format\n  with an interface similar to that of stdio.\n\n     The library does not install any signal handler. The decoder checks\n  the consistency of the compressed data, so the library should never\n  crash even in case of corrupted input.\n*/\n\ntypedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));\ntypedef void   (*free_func)  OF((voidpf opaque, voidpf address));\n\nstruct internal_state;\n\ntypedef struct z_stream_s {\n    Bytef    *next_in;  /* next input byte */\n    uInt     avail_in;  /* number of bytes available at next_in */\n    uLong    total_in;  /* total nb of input bytes read so far */\n\n    Bytef    *next_out; /* next output byte should be put there */\n    uInt     avail_out; /* remaining free space at next_out */\n    uLong    total_out; /* total nb of bytes output so far */\n\n    char     *msg;      /* last error message, NULL if no error */\n    struct internal_state FAR *state; /* not visible by applications */\n\n    alloc_func zalloc;  /* used to allocate the internal state */\n    free_func  zfree;   /* used to free the internal state */\n    voidpf     opaque;  /* private data object passed to zalloc and zfree */\n\n    int     data_type;  /* best guess about the data type: ascii or binary */\n    uLong   adler;      /* adler32 value of the uncompressed data */\n    uLong   reserved;   /* reserved for future use */\n} z_stream;\n\ntypedef z_stream FAR *z_streamp;\n\n/*\n   The application must update next_in and avail_in when avail_in has\n   dropped to zero. It must update next_out and avail_out when avail_out\n   has dropped to zero. The application must initialize zalloc, zfree and\n   opaque before calling the init function. All other fields are set by the\n   compression library and must not be updated by the application.\n\n   The opaque value provided by the application will be passed as the first\n   parameter for calls of zalloc and zfree. This can be useful for custom\n   memory management. The compression library attaches no meaning to the\n   opaque value.\n\n   zalloc must return Z_NULL if there is not enough memory for the object.\n   If zlib is used in a multi-threaded application, zalloc and zfree must be\n   thread safe.\n\n   On 16-bit systems, the functions zalloc and zfree must be able to allocate\n   exactly 65536 bytes, but will not be required to allocate more than this\n   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,\n   pointers returned by zalloc for objects of exactly 65536 bytes *must*\n   have their offset normalized to zero. The default allocation function\n   provided by this library ensures this (see zutil.c). To reduce memory\n   requirements and avoid any allocation of 64K objects, at the expense of\n   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).\n\n   The fields total_in and total_out can be used for statistics or\n   progress reports. After compression, total_in holds the total size of\n   the uncompressed data and may be saved for use in the decompressor\n   (particularly if the decompressor wants to decompress everything in\n   a single step).\n*/\n\n                        /* constants */\n\n#define Z_NO_FLUSH      0\n#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */\n#define Z_SYNC_FLUSH    2\n#define Z_FULL_FLUSH    3\n#define Z_FINISH        4\n/* Allowed flush values; see deflate() below for details */\n\n#define Z_OK            0\n#define Z_STREAM_END    1\n#define Z_NEED_DICT     2\n#define Z_ERRNO        (-1)\n#define Z_STREAM_ERROR (-2)\n#define Z_DATA_ERROR   (-3)\n#define Z_MEM_ERROR    (-4)\n#define Z_BUF_ERROR    (-5)\n#define Z_VERSION_ERROR (-6)\n/* Return codes for the compression/decompression functions. Negative\n * values are errors, positive values are used for special but normal events.\n */\n\n#define Z_NO_COMPRESSION         0\n#define Z_BEST_SPEED             1\n#define Z_BEST_COMPRESSION       9\n#define Z_DEFAULT_COMPRESSION  (-1)\n/* compression levels */\n\n#define Z_FILTERED            1\n#define Z_HUFFMAN_ONLY        2\n#define Z_DEFAULT_STRATEGY    0\n/* compression strategy; see deflateInit2() below for details */\n\n#define Z_BINARY   0\n#define Z_ASCII    1\n#define Z_UNKNOWN  2\n/* Possible values of the data_type field */\n\n#define Z_DEFLATED   8\n/* The deflate compression method (the only one supported in this version) */\n\n#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */\n\n\n                        /* basic functions */\n\n/* The application can compare zlibVersion and ZLIB_VERSION for consistency.\n   If the first character differs, the library code actually used is\n   not compatible with the zlib.h header file used by the application.\n   This check is automatically made by deflateInit and inflateInit.\n */\n\n/*\nZEXTERN(int)  deflateInit OF((z_streamp strm, int level));\n\n     Initializes the internal stream state for compression. The fields\n   zalloc, zfree and opaque must be initialized before by the caller.\n   If zalloc and zfree are set to Z_NULL, deflateInit updates them to\n   use default allocation functions.\n\n     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:\n   1 gives best speed, 9 gives best compression, 0 gives no compression at\n   all (the input data is simply copied a block at a time).\n   Z_DEFAULT_COMPRESSION requests a default compromise between speed and\n   compression (currently equivalent to level 6).\n\n     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_STREAM_ERROR if level is not a valid compression level,\n   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible\n   with the version assumed by the caller (ZLIB_VERSION).\n   msg is set to null if there is no error message.  deflateInit does not\n   perform any compression: this will be done by deflate().\n*/\n\n\n/*\n    deflate compresses as much data as possible, and stops when the input\n  buffer becomes empty or the output buffer becomes full. It may introduce some\n  output latency (reading input without producing any output) except when\n  forced to flush.\n\n    The detailed semantics are as follows. deflate performs one or both of the\n  following actions:\n\n  - Compress more input starting at next_in and update next_in and avail_in\n    accordingly. If not all input can be processed (because there is not\n    enough room in the output buffer), next_in and avail_in are updated and\n    processing will resume at this point for the next call of deflate().\n\n  - Provide more output starting at next_out and update next_out and avail_out\n    accordingly. This action is forced if the parameter flush is non zero.\n    Forcing flush frequently degrades the compression ratio, so this parameter\n    should be set only when necessary (in interactive applications).\n    Some output may be provided even if flush is not set.\n\n  Before the call of deflate(), the application should ensure that at least\n  one of the actions is possible, by providing more input and/or consuming\n  more output, and updating avail_in or avail_out accordingly; avail_out\n  should never be zero before the call. The application can consume the\n  compressed output when it wants, for example when the output buffer is full\n  (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK\n  and with zero avail_out, it must be called again after making room in the\n  output buffer because there might be more output pending.\n\n    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is\n  flushed to the output buffer and the output is aligned on a byte boundary, so\n  that the decompressor can get all input data available so far. (In particular\n  avail_in is zero after the call if enough output space has been provided\n  before the call.)  Flushing may degrade compression for some compression\n  algorithms and so it should be used only when necessary.\n\n    If flush is set to Z_FULL_FLUSH, all output is flushed as with\n  Z_SYNC_FLUSH, and the compression state is reset so that decompression can\n  restart from this point if previous compressed data has been damaged or if\n  random access is desired. Using Z_FULL_FLUSH too often can seriously degrade\n  the compression.\n\n    If deflate returns with avail_out == 0, this function must be called again\n  with the same value of the flush parameter and more output space (updated\n  avail_out), until the flush is complete (deflate returns with non-zero\n  avail_out).\n\n    If the parameter flush is set to Z_FINISH, pending input is processed,\n  pending output is flushed and deflate returns with Z_STREAM_END if there\n  was enough output space; if deflate returns with Z_OK, this function must be\n  called again with Z_FINISH and more output space (updated avail_out) but no\n  more input data, until it returns with Z_STREAM_END or an error. After\n  deflate has returned Z_STREAM_END, the only possible operations on the\n  stream are deflateReset or deflateEnd.\n\n    Z_FINISH can be used immediately after deflateInit if all the compression\n  is to be done in a single step. In this case, avail_out must be at least\n  0.1% larger than avail_in plus 12 bytes.  If deflate does not return\n  Z_STREAM_END, then it must be called again as described above.\n\n    deflate() sets strm->adler to the adler32 checksum of all input read\n  so far (that is, total_in bytes).\n\n    deflate() may update data_type if it can make a good guess about\n  the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered\n  binary. This field is only for information purposes and does not affect\n  the compression algorithm in any manner.\n\n    deflate() returns Z_OK if some progress has been made (more input\n  processed or more output produced), Z_STREAM_END if all input has been\n  consumed and all output has been produced (only when flush is set to\n  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example\n  if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible\n  (for example avail_in or avail_out was zero).\n*/\n\n\n/*\n     All dynamically allocated data structures for this stream are freed.\n   This function discards any unprocessed input and does not flush any\n   pending output.\n\n     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the\n   stream state was inconsistent, Z_DATA_ERROR if the stream was freed\n   prematurely (some input or output was discarded). In the error case,\n   msg may be set but then points to a static string (which must not be\n   deallocated).\n*/\n\n\n/*\nZEXTERN(int)  inflateInit OF((z_streamp strm));\n\n     Initializes the internal stream state for decompression. The fields\n   next_in, avail_in, zalloc, zfree and opaque must be initialized before by\n   the caller. If next_in is not Z_NULL and avail_in is large enough (the exact\n   value depends on the compression method), inflateInit determines the\n   compression method from the zlib header and allocates all data structures\n   accordingly; otherwise the allocation will be deferred to the first call of\n   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to\n   use default allocation functions.\n\n     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the\n   version assumed by the caller.  msg is set to null if there is no error\n   message. inflateInit does not perform any decompression apart from reading\n   the zlib header if present: this will be done by inflate().  (So next_in and\n   avail_in may be modified, but next_out and avail_out are unchanged.)\n*/\n\n\nZEXTERN(int) inflate OF((z_streamp strm, int flush));\n/*\n    inflate decompresses as much data as possible, and stops when the input\n  buffer becomes empty or the output buffer becomes full. It may some\n  introduce some output latency (reading input without producing any output)\n  except when forced to flush.\n\n  The detailed semantics are as follows. inflate performs one or both of the\n  following actions:\n\n  - Decompress more input starting at next_in and update next_in and avail_in\n    accordingly. If not all input can be processed (because there is not\n    enough room in the output buffer), next_in is updated and processing\n    will resume at this point for the next call of inflate().\n\n  - Provide more output starting at next_out and update next_out and avail_out\n    accordingly.  inflate() provides as much output as possible, until there\n    is no more input data or no more space in the output buffer (see below\n    about the flush parameter).\n\n  Before the call of inflate(), the application should ensure that at least\n  one of the actions is possible, by providing more input and/or consuming\n  more output, and updating the next_* and avail_* values accordingly.\n  The application can consume the uncompressed output when it wants, for\n  example when the output buffer is full (avail_out == 0), or after each\n  call of inflate(). If inflate returns Z_OK and with zero avail_out, it\n  must be called again after making room in the output buffer because there\n  might be more output pending.\n\n    If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much\n  output as possible to the output buffer. The flushing behavior of inflate is\n  not specified for values of the flush parameter other than Z_SYNC_FLUSH\n  and Z_FINISH, but the current implementation actually flushes as much output\n  as possible anyway.\n\n    inflate() should normally be called until it returns Z_STREAM_END or an\n  error. However if all decompression is to be performed in a single step\n  (a single call of inflate), the parameter flush should be set to\n  Z_FINISH. In this case all pending input is processed and all pending\n  output is flushed; avail_out must be large enough to hold all the\n  uncompressed data. (The size of the uncompressed data may have been saved\n  by the compressor for this purpose.) The next operation on this stream must\n  be inflateEnd to deallocate the decompression state. The use of Z_FINISH\n  is never required, but can be used to inform inflate that a faster routine\n  may be used for the single inflate() call.\n\n     If a preset dictionary is needed at this point (see inflateSetDictionary\n  below), inflate sets strm-adler to the adler32 checksum of the\n  dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise\n  it sets strm->adler to the adler32 checksum of all output produced\n  so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or\n  an error code as described below. At the end of the stream, inflate()\n  checks that its computed adler32 checksum is equal to that saved by the\n  compressor and returns Z_STREAM_END only if the checksum is correct.\n\n    inflate() returns Z_OK if some progress has been made (more input processed\n  or more output produced), Z_STREAM_END if the end of the compressed data has\n  been reached and all uncompressed output has been produced, Z_NEED_DICT if a\n  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was\n  corrupted (input stream not conforming to the zlib format or incorrect\n  adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent\n  (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not\n  enough memory, Z_BUF_ERROR if no progress is possible or if there was not\n  enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR\n  case, the application may then call inflateSync to look for a good\n  compression block.\n*/\n\n\nZEXTERN(int)  inflateEnd OF((z_streamp strm));\n/*\n     All dynamically allocated data structures for this stream are freed.\n   This function discards any unprocessed input and does not flush any\n   pending output.\n\n     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state\n   was inconsistent. In the error case, msg may be set but then points to a\n   static string (which must not be deallocated).\n*/\n\n                        /* Advanced functions */\n\n/*\n    The following functions are needed only in some special applications.\n*/\n\n/*\nZEXTERN(int)  deflateInit2 OF((z_streamp strm,\n                                     int  level,\n                                     int  method,\n                                     int  windowBits,\n                                     int  memLevel,\n                                     int  strategy));\n\n     This is another version of deflateInit with more compression options. The\n   fields next_in, zalloc, zfree and opaque must be initialized before by\n   the caller.\n\n     The method parameter is the compression method. It must be Z_DEFLATED in\n   this version of the library.\n\n     The windowBits parameter is the base two logarithm of the window size\n   (the size of the history buffer).  It should be in the range 8..15 for this\n   version of the library. Larger values of this parameter result in better\n   compression at the expense of memory usage. The default value is 15 if\n   deflateInit is used instead.\n\n     The memLevel parameter specifies how much memory should be allocated\n   for the internal compression state. memLevel=1 uses minimum memory but\n   is slow and reduces compression ratio; memLevel=9 uses maximum memory\n   for optimal speed. The default value is 8. See zconf.h for total memory\n   usage as a function of windowBits and memLevel.\n\n     The strategy parameter is used to tune the compression algorithm. Use the\n   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a\n   filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no\n   string match).  Filtered data consists mostly of small values with a\n   somewhat random distribution. In this case, the compression algorithm is\n   tuned to compress them better. The effect of Z_FILTERED is to force more\n   Huffman coding and less string matching; it is somewhat intermediate\n   between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects\n   the compression ratio but not the correctness of the compressed output even\n   if it is not set appropriately.\n\n      deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid\n   method). msg is set to null if there is no error message.  deflateInit2 does\n   not perform any compression: this will be done by deflate().\n*/\n\n/*\n     Initializes the compression dictionary from the given byte sequence\n   without producing any compressed output. This function must be called\n   immediately after deflateInit, deflateInit2 or deflateReset, before any\n   call of deflate. The compressor and decompressor must use exactly the same\n   dictionary (see inflateSetDictionary).\n\n     The dictionary should consist of strings (byte sequences) that are likely\n   to be encountered later in the data to be compressed, with the most commonly\n   used strings preferably put towards the end of the dictionary. Using a\n   dictionary is most useful when the data to be compressed is short and can be\n   predicted with good accuracy; the data can then be compressed better than\n   with the default empty dictionary.\n\n     Depending on the size of the compression data structures selected by\n   deflateInit or deflateInit2, a part of the dictionary may in effect be\n   discarded, for example if the dictionary is larger than the window size in\n   deflate or deflate2. Thus the strings most likely to be useful should be\n   put at the end of the dictionary, not at the front.\n\n     Upon return of this function, strm->adler is set to the Adler32 value\n   of the dictionary; the decompressor may later use this value to determine\n   which dictionary has been used by the compressor. (The Adler32 value\n   applies to the whole dictionary even if only a subset of the dictionary is\n   actually used by the compressor.)\n\n     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a\n   parameter is invalid (such as NULL dictionary) or the stream state is\n   inconsistent (for example if deflate has already been called for this stream\n   or if the compression method is bsort). deflateSetDictionary does not\n   perform any compression: this will be done by deflate().\n*/\n\n/*\n     Sets the destination stream as a complete copy of the source stream.\n\n     This function can be useful when several compression strategies will be\n   tried, for example when there are several ways of pre-processing the input\n   data with a filter. The streams that will be discarded should then be freed\n   by calling deflateEnd.  Note that deflateCopy duplicates the internal\n   compression state which can be quite large, so this strategy is slow and\n   can consume lots of memory.\n\n     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent\n   (such as zalloc being NULL). msg is left unchanged in both source and\n   destination.\n*/\n\n/*\n     This function is equivalent to deflateEnd followed by deflateInit,\n   but does not free and reallocate all the internal compression state.\n   The stream will keep the same compression level and any other attributes\n   that may have been set by deflateInit2.\n\n      deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being NULL).\n*/\n\n/*\n     Dynamically update the compression level and compression strategy.  The\n   interpretation of level and strategy is as in deflateInit2.  This can be\n   used to switch between compression and straight copy of the input data, or\n   to switch to a different kind of input data requiring a different\n   strategy. If the compression level is changed, the input available so far\n   is compressed with the old level (and may be flushed); the new level will\n   take effect only at the next call of deflate().\n\n     Before the call of deflateParams, the stream state must be set as for\n   a call of deflate(), since the currently available input may have to\n   be compressed and flushed. In particular, strm->avail_out must be non-zero.\n\n     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source\n   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR\n   if strm->avail_out was zero.\n*/\n\n/*\nZEXTERN(int)  inflateInit2 OF((z_streamp strm,\n                                     int  windowBits));\n\n     This is another version of inflateInit with an extra parameter. The\n   fields next_in, avail_in, zalloc, zfree and opaque must be initialized\n   before by the caller.\n\n     The windowBits parameter is the base two logarithm of the maximum window\n   size (the size of the history buffer).  It should be in the range 8..15 for\n   this version of the library. The default value is 15 if inflateInit is used\n   instead. If a compressed stream with a larger window size is given as\n   input, inflate() will return with the error code Z_DATA_ERROR instead of\n   trying to allocate a larger window.\n\n      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative\n   memLevel). msg is set to null if there is no error message.  inflateInit2\n   does not perform any decompression apart from reading the zlib header if\n   present: this will be done by inflate(). (So next_in and avail_in may be\n   modified, but next_out and avail_out are unchanged.)\n*/\n\n/*\n     Initializes the decompression dictionary from the given uncompressed byte\n   sequence. This function must be called immediately after a call of inflate\n   if this call returned Z_NEED_DICT. The dictionary chosen by the compressor\n   can be determined from the Adler32 value returned by this call of\n   inflate. The compressor and decompressor must use exactly the same\n   dictionary (see deflateSetDictionary).\n\n     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a\n   parameter is invalid (such as NULL dictionary) or the stream state is\n   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the\n   expected one (incorrect Adler32 value). inflateSetDictionary does not\n   perform any decompression: this will be done by subsequent calls of\n   inflate().\n*/\n\n/*\n    Skips invalid compressed data until a full flush point (see above the\n  description of deflate with Z_FULL_FLUSH) can be found, or until all\n  available input is skipped. No output is provided.\n\n    inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR\n  if no more input was provided, Z_DATA_ERROR if no flush point has been found,\n  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success\n  case, the application may save the current current value of total_in which\n  indicates where valid compressed data was found. In the error case, the\n  application may repeatedly call inflateSync, providing more input each time,\n  until success or end of the input data.\n*/\n\nZEXTERN(int)  inflateReset OF((z_streamp strm));\n/*\n     This function is equivalent to inflateEnd followed by inflateInit,\n   but does not free and reallocate all the internal decompression state.\n   The stream will keep attributes that may have been set by inflateInit2.\n\n      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\n   stream state was inconsistent (such as zalloc or state being NULL).\n*/\n\n\n                        /* utility functions */\n\n/*\n     The following utility functions are implemented on top of the\n   basic stream-oriented functions. To simplify the interface, some\n   default options are assumed (compression level and memory usage,\n   standard memory allocation functions). The source code of these\n   utility functions can easily be modified if you need special options.\n*/\n\n/*\n     Compresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer. Upon entry, destLen is the total\n   size of the destination buffer, which must be at least 0.1% larger than\n   sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the\n   compressed buffer.\n     This function can be used to compress a whole file at once if the\n   input file is mmap'ed.\n     compress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer.\n*/\n\n/*\n     Compresses the source buffer into the destination buffer. The level\n   parameter has the same meaning as in deflateInit.  sourceLen is the byte\n   length of the source buffer. Upon entry, destLen is the total size of the\n   destination buffer, which must be at least 0.1% larger than sourceLen plus\n   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.\n\n     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\n   memory, Z_BUF_ERROR if there was not enough room in the output buffer,\n   Z_STREAM_ERROR if the level parameter is invalid.\n*/\n\n/*\n     Decompresses the source buffer into the destination buffer.  sourceLen is\n   the byte length of the source buffer. Upon entry, destLen is the total\n   size of the destination buffer, which must be large enough to hold the\n   entire uncompressed data. (The size of the uncompressed data must have\n   been saved previously by the compressor and transmitted to the decompressor\n   by some mechanism outside the scope of this compression library.)\n   Upon exit, destLen is the actual size of the compressed buffer.\n     This function can be used to decompress a whole file at once if the\n   input file is mmap'ed.\n\n     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not\n   enough memory, Z_BUF_ERROR if there was not enough room in the output\n   buffer, or Z_DATA_ERROR if the input data was corrupted.\n*/\n\n\n/*\n     Opens a gzip (.gz) file for reading or writing. The mode parameter\n   is as in fopen (\"rb\" or \"wb\") but can also include a compression level\n   (\"wb9\") or a strategy: 'f' for filtered data as in \"wb6f\", 'h' for\n   Huffman only compression as in \"wb1h\". (See the description\n   of deflateInit2 for more information about the strategy parameter.)\n\n     gzopen can be used to read a file which is not in gzip format; in this\n   case gzread will directly read from the file without decompression.\n\n     gzopen returns NULL if the file could not be opened or if there was\n   insufficient memory to allocate the (de)compression state; errno\n   can be checked to distinguish the two cases (if errno is zero, the\n   zlib error is Z_MEM_ERROR).  */\n\n/*\n     gzdopen() associates a gzFile with the file descriptor fd.  File\n   descriptors are obtained from calls like open, dup, creat, pipe or\n   fileno (in the file has been previously opened with fopen).\n   The mode parameter is as in gzopen.\n     The next call of gzclose on the returned gzFile will also close the\n   file descriptor fd, just like fclose(fdopen(fd), mode) closes the file\n   descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).\n     gzdopen returns NULL if there was insufficient memory to allocate\n   the (de)compression state.\n*/\n\n/*\n     Dynamically update the compression level or strategy. See the description\n   of deflateInit2 for the meaning of these parameters.\n     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not\n   opened for writing.\n*/\n\n/*\n     Reads the given number of uncompressed bytes from the compressed file.\n   If the input file was not in gzip format, gzread copies the given number\n   of bytes into the buffer.\n     gzread returns the number of uncompressed bytes actually read (0 for\n   end of file, -1 for error). */\n\n/*\n     Writes the given number of uncompressed bytes into the compressed file.\n   gzwrite returns the number of uncompressed bytes actually written\n   (0 in case of error).\n*/\n\n/*\n     Converts, formats, and writes the args to the compressed file under\n   control of the format string, as in fprintf. gzprintf returns the number of\n   uncompressed bytes actually written (0 in case of error).\n*/\n\n/*\n      Writes the given null-terminated string to the compressed file, excluding\n   the terminating null character.\n      gzputs returns the number of characters written, or -1 in case of error.\n*/\n\n/*\n      Reads bytes from the compressed file until len-1 characters are read, or\n   a newline character is read and transferred to buf, or an end-of-file\n   condition is encountered.  The string is then terminated with a null\n   character.\n      gzgets returns buf, or Z_NULL in case of error.\n*/\n\n/*\n      Writes c, converted to an unsigned char, into the compressed file.\n   gzputc returns the value that was written, or -1 in case of error.\n*/\n\n/*\n      Reads one byte from the compressed file. gzgetc returns this byte\n   or -1 in case of end of file or error.\n*/\n\n/*\n     Flushes all pending output into the compressed file. The parameter\n   flush is as in the deflate() function. The return value is the zlib\n   error number (see function gzerror below). gzflush returns Z_OK if\n   the flush parameter is Z_FINISH and all output could be flushed.\n     gzflush should be called only when strictly necessary because it can\n   degrade compression.\n*/\n\n/*\n      Sets the starting position for the next gzread or gzwrite on the\n   given compressed file. The offset represents a number of bytes in the\n   uncompressed data stream. The whence parameter is defined as in lseek(2);\n   the value SEEK_END is not supported.\n     If the file is opened for reading, this function is emulated but can be\n   extremely slow. If the file is opened for writing, only forward seeks are\n   supported; gzseek then compresses a sequence of zeroes up to the new\n   starting position.\n\n      gzseek returns the resulting offset location as measured in bytes from\n   the beginning of the uncompressed stream, or -1 in case of error, in\n   particular if the file is opened for writing and the new starting position\n   would be before the current position.\n*/\n\n/*\n     Rewinds the given file. This function is supported only for reading.\n\n   gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)\n*/\n\n/*\n     Returns the starting position for the next gzread or gzwrite on the\n   given compressed file. This position represents a number of bytes in the\n   uncompressed data stream.\n\n   gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)\n*/\n\n/*\n     Returns 1 when EOF has previously been detected reading the given\n   input stream, otherwise zero.\n*/\n\n/*\n     Flushes all pending output if necessary, closes the compressed file\n   and deallocates all the (de)compression state. The return value is the zlib\n   error number (see function gzerror below).\n*/\n\n/*\n     Returns the error message for the last error which occurred on the\n   given compressed file. errnum is set to zlib error number. If an\n   error occurred in the file system and not in the compression library,\n   errnum is set to Z_ERRNO and the application may consult errno\n   to get the exact error code.\n*/\n\n                        /* checksum functions */\n\n/*\n     These functions are not related to compression but are exported\n   anyway because they might be useful in applications using the\n   compression library.\n*/\n\nZEXTERN(uLong)  adler32 OF((uLong adler, const Bytef *buf, uInt len));\n\n/*\n     Update a running Adler-32 checksum with the bytes buf[0..len-1] and\n   return the updated checksum. If buf is NULL, this function returns\n   the required initial value for the checksum.\n   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed\n   much faster. Usage example:\n\n     uLong adler = adler32(0L, Z_NULL, 0);\n\n     while (read_buffer(buffer, length) != EOF) {\n       adler = adler32(adler, buffer, length);\n     }\n     if (adler != original_adler) error();\n*/\n\n/*\n     Update a running crc with the bytes buf[0..len-1] and return the updated\n   crc. If buf is NULL, this function returns the required initial value\n   for the crc. Pre- and post-conditioning (one's complement) is performed\n   within this function so it shouldn't be done by the application.\n   Usage example:\n\n     uLong crc = crc32(0L, Z_NULL, 0);\n\n     while (read_buffer(buffer, length) != EOF) {\n       crc = crc32(crc, buffer, length);\n     }\n     if (crc != original_crc) error();\n*/\n\n\n                        /* various hacks, don't look :) */\n\n/* deflateInit and inflateInit are macros to allow checking the zlib version\n * and the compiler's view of z_stream:\n */\nZEXTERN(int)  inflateInit2_ OF((z_streamp strm, int  windowBits,\n                                      const char *version, int stream_size));\n#define deflateInit(strm, level) \\\n        deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream))\n#define inflateInit(strm) \\\n        inflateInit_((strm),                ZLIB_VERSION, sizeof(z_stream))\n#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \\\n        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\\\n                      (strategy),           ZLIB_VERSION, sizeof(z_stream))\n#define inflateInit2(strm, windowBits) \\\n        inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _ZLIB_H */\n"
  },
  {
    "path": "libs/freetype/src/gzip/zutil.c",
    "content": "/* zutil.c -- target dependent utility functions for the compression library\n * Copyright (C) 1995-2002 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* @(#) $Id$ */\n\n#include \"zutil.h\"\n\n#ifndef STDC\nextern void exit OF((int));\n#endif\n\n\n#ifndef HAVE_MEMCPY\n\nvoid zmemcpy(dest, source, len)\n    Bytef* dest;\n    const Bytef* source;\n    uInt  len;\n{\n    if (len == 0) return;\n    do {\n        *dest++ = *source++; /* ??? to be unrolled */\n    } while (--len != 0);\n}\n\nint zmemcmp(s1, s2, len)\n    const Bytef* s1;\n    const Bytef* s2;\n    uInt  len;\n{\n    uInt j;\n\n    for (j = 0; j < len; j++) {\n        if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;\n    }\n    return 0;\n}\n\nvoid zmemzero(dest, len)\n    Bytef* dest;\n    uInt  len;\n{\n    if (len == 0) return;\n    do {\n        *dest++ = 0;  /* ??? to be unrolled */\n    } while (--len != 0);\n}\n#endif\n\n#if defined( MSDOS ) && defined( __TURBOC__ ) && !defined( MY_ZCALLOC )\n#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__)\n/* Small and medium model in Turbo C are for now limited to near allocation\n * with reduced MAX_WBITS and MAX_MEM_LEVEL\n */\n#  define MY_ZCALLOC\n\n/* Turbo C malloc() does not allow dynamic allocation of 64K bytes\n * and farmalloc(64K) returns a pointer with an offset of 8, so we\n * must fix the pointer. Warning: the pointer must be put back to its\n * original form in order to free it, use zcfree().\n */\n\n#define MAX_PTR 10\n/* 10*64K = 640K */\n\nlocal int next_ptr = 0;\n\ntypedef struct ptr_table_s {\n    voidpf org_ptr;\n    voidpf new_ptr;\n} ptr_table;\n\nlocal ptr_table table[MAX_PTR];\n/* This table is used to remember the original form of pointers\n * to large buffers (64K). Such pointers are normalized with a zero offset.\n * Since MSDOS is not a preemptive multitasking OS, this table is not\n * protected from concurrent access. This hack doesn't work anyway on\n * a protected system like OS/2. Use Microsoft C instead.\n */\n\nvoidpf zcalloc (voidpf opaque, unsigned items, unsigned size)\n{\n    voidpf buf = opaque; /* just to make some compilers happy */\n    ulg bsize = (ulg)items*size;\n\n    /* If we allocate less than 65520 bytes, we assume that farmalloc\n     * will return a usable pointer which doesn't have to be normalized.\n     */\n    if (bsize < 65520L) {\n        buf = farmalloc(bsize);\n        if (*(ush*)&buf != 0) return buf;\n    } else {\n        buf = farmalloc(bsize + 16L);\n    }\n    if (buf == NULL || next_ptr >= MAX_PTR) return NULL;\n    table[next_ptr].org_ptr = buf;\n\n    /* Normalize the pointer to seg:0 */\n    *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;\n    *(ush*)&buf = 0;\n    table[next_ptr++].new_ptr = buf;\n    return buf;\n}\n\nvoid  zcfree (voidpf opaque, voidpf ptr)\n{\n    int n;\n    if (*(ush*)&ptr != 0) { /* object < 64K */\n        farfree(ptr);\n        return;\n    }\n    /* Find the original pointer */\n    for (n = 0; n < next_ptr; n++) {\n        if (ptr != table[n].new_ptr) continue;\n\n        farfree(table[n].org_ptr);\n        while (++n < next_ptr) {\n            table[n-1] = table[n];\n        }\n        next_ptr--;\n        return;\n    }\n    ptr = opaque; /* just to make some compilers happy */\n    Assert(0, \"zcfree: ptr not found\");\n}\n#endif\n#endif /* MSDOS && __TURBOC__ */\n\n\n#if defined(M_I86) && !defined(__32BIT__) && !defined( MY_ZCALLOC )\n/* Microsoft C in 16-bit mode */\n\n#  define MY_ZCALLOC\n\n#if (!defined(_MSC_VER) || (_MSC_VER <= 600))\n#  define _halloc  halloc\n#  define _hfree   hfree\n#endif\n\nvoidpf zcalloc (voidpf opaque, unsigned items, unsigned size)\n{\n    if (opaque) opaque = 0; /* to make compiler happy */\n    return _halloc((long)items, size);\n}\n\nvoid  zcfree (voidpf opaque, voidpf ptr)\n{\n    if (opaque) opaque = 0; /* to make compiler happy */\n    _hfree(ptr);\n}\n\n#endif /* MSC */\n\n\n#ifndef MY_ZCALLOC /* Any system without a special alloc function */\n\n#ifndef STDC\nextern voidp  ft_scalloc OF((uInt items, uInt size));\nextern void   ft_sfree   OF((voidpf ptr));\n#endif\n\nvoidpf zcalloc (opaque, items, size)\n    voidpf opaque;\n    unsigned items;\n    unsigned size;\n{\n    if (opaque) items += size - size; /* make compiler happy */\n    return (voidpf)ft_scalloc(items, size);\n}\n\nvoid  zcfree (opaque, ptr)\n    voidpf opaque;\n    voidpf ptr;\n{\n    ft_sfree(ptr);\n    if (opaque) return; /* make compiler happy */\n}\n\n#endif /* MY_ZCALLOC */\n"
  },
  {
    "path": "libs/freetype/src/gzip/zutil.h",
    "content": "/* zutil.h -- internal interface and configuration of the compression library\n * Copyright (C) 1995-2002 Jean-loup Gailly.\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n\n/* WARNING: this file should *not* be used by applications. It is\n   part of the implementation of the compression library and is\n   subject to change. Applications should only use zlib.h.\n */\n\n/* @(#) $Id$ */\n\n#ifndef _Z_UTIL_H\n#define _Z_UTIL_H\n\n#include \"zlib.h\"\n\n#ifdef STDC\n#  include <stddef.h>\n#  include <string.h>\n#  include <stdlib.h>\n#endif\n#ifdef NO_ERRNO_H\n    extern int errno;\n#else\n#   include <errno.h>\n#endif\n\n#ifndef local\n#  define local static\n#endif\n/* compile with -Dlocal if your debugger can't find static symbols */\n\ntypedef unsigned char  uch;\ntypedef uch FAR uchf;\ntypedef unsigned short ush;\ntypedef ush FAR ushf;\ntypedef unsigned long  ulg;\n\n\n#define ERR_RETURN(strm,err) \\\n  return (strm->msg = (char*)ERR_MSG(err), (err))\n/* To be used only when the state is known to be valid */\n\n        /* common constants */\n\n#ifndef DEF_WBITS\n#  define DEF_WBITS MAX_WBITS\n#endif\n/* default windowBits for decompression. MAX_WBITS is for compression only */\n\n#if MAX_MEM_LEVEL >= 8\n#  define DEF_MEM_LEVEL 8\n#else\n#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL\n#endif\n/* default memLevel */\n\n#define STORED_BLOCK 0\n#define STATIC_TREES 1\n#define DYN_TREES    2\n/* The three kinds of block type */\n\n#define MIN_MATCH  3\n#define MAX_MATCH  258\n/* The minimum and maximum match lengths */\n\n#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */\n\n        /* target dependencies */\n\n#ifdef MSDOS\n#  define OS_CODE  0x00\n#  if defined(__TURBOC__) || defined(__BORLANDC__)\n#    if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))\n       /* Allow compilation with ANSI keywords only enabled */\n       void _Cdecl farfree( void *block );\n       void *_Cdecl farmalloc( unsigned long nbytes );\n#    else\n#     include <alloc.h>\n#    endif\n#  else /* MSC or DJGPP */\n#  endif\n#endif\n\n#ifdef OS2\n#  define OS_CODE  0x06\n#endif\n\n#ifdef WIN32 /* Window 95 & Windows NT */\n#  define OS_CODE  0x0b\n#endif\n\n#if defined(VAXC) || defined(VMS)\n#  define OS_CODE  0x02\n#  define F_OPEN(name, mode) \\\n     ft_fopen((name), (mode), \"mbc=60\", \"ctx=stm\", \"rfm=fix\", \"mrs=512\")\n#endif\n\n#ifdef AMIGA\n#  define OS_CODE  0x01\n#endif\n\n#if defined(ATARI) || defined(atarist)\n#  define OS_CODE  0x05\n#endif\n\n#if defined(MACOS) || defined(TARGET_OS_MAC)\n#  define OS_CODE  0x07\n#  if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os\n#    include <unix.h> /* for fdopen */\n#  else\n#    ifndef fdopen\n#      define fdopen(fd,mode) NULL /* No fdopen() */\n#    endif\n#  endif\n#endif\n\n#ifdef __50SERIES /* Prime/PRIMOS */\n#  define OS_CODE  0x0F\n#endif\n\n#ifdef TOPS20\n#  define OS_CODE  0x0a\n#endif\n\n#if defined(_BEOS_) || defined(RISCOS)\n#  define fdopen(fd,mode) NULL /* No fdopen() */\n#endif\n\n#if (defined(_MSC_VER) && (_MSC_VER > 600))\n#  define fdopen(fd,type)  _fdopen(fd,type)\n#endif\n\n\n        /* Common defaults */\n\n#ifndef OS_CODE\n#  define OS_CODE  0x03  /* assume Unix */\n#endif\n\n#ifndef F_OPEN\n#  define F_OPEN(name, mode) ft_fopen((name), (mode))\n#endif\n\n         /* functions */\n\n#ifdef HAVE_STRERROR\n   extern char *strerror OF((int));\n#  define zstrerror(errnum) strerror(errnum)\n#else\n#  define zstrerror(errnum) \"\"\n#endif\n\n#if defined(pyr)\n#  define NO_MEMCPY\n#endif\n#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)\n /* Use our own functions for small and medium model with MSC <= 5.0.\n  * You may have to use the same strategy for Borland C (untested).\n  * The __SC__ check is for Symantec.\n  */\n#  define NO_MEMCPY\n#endif\n#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)\n#  define HAVE_MEMCPY\n#endif\n#ifdef HAVE_MEMCPY\n#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */\n#    define zmemcpy _fmemcpy\n#    define zmemcmp _fmemcmp\n#    define zmemzero(dest, len) _fmemset(dest, 0, len)\n#  else\n#    define zmemcpy ft_memcpy\n#    define zmemcmp ft_memcmp\n#    define zmemzero(dest, len) ft_memset(dest, 0, len)\n#  endif\n#else\n   extern void zmemcpy  OF((Bytef* dest, const Bytef* source, uInt len));\n   extern int  zmemcmp  OF((const Bytef* s1, const Bytef* s2, uInt len));\n   extern void zmemzero OF((Bytef* dest, uInt len));\n#endif\n\n/* Diagnostic functions */\n#ifdef DEBUG\n#  include <stdio.h>\n   extern int z_verbose;\n   extern void z_error    OF((char *m));\n#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}\n#  define Trace(x) {if (z_verbose>=0) fprintf x ;}\n#  define Tracev(x) {if (z_verbose>0) fprintf x ;}\n#  define Tracevv(x) {if (z_verbose>1) fprintf x ;}\n#  define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}\n#  define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}\n#else\n#  define Assert(cond,msg)\n#  define Trace(x)\n#  define Tracev(x)\n#  define Tracevv(x)\n#  define Tracec(c,x)\n#  define Tracecv(c,x)\n#endif\n\n\ntypedef uLong (*check_func) OF((uLong check, const Bytef *buf,\n                                uInt len));\nlocal voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));\nlocal void   zcfree  OF((voidpf opaque, voidpf ptr));\n\n#define ZALLOC(strm, items, size) \\\n           (*((strm)->zalloc))((strm)->opaque, (items), (size))\n#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))\n#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}\n\n#endif /* _Z_UTIL_H */\n"
  },
  {
    "path": "libs/freetype/src/lzw/Jamfile",
    "content": "# FreeType 2 src/lzw Jamfile\n#\n# Copyright 2004, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) lzw ;\n\nLibrary  $(FT2_LIB) : ftlzw.c ;\n\n# end of src/lzw Jamfile\n"
  },
  {
    "path": "libs/freetype/src/lzw/ftlzw.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftlzw.c                                                                */\n/*                                                                         */\n/*    FreeType support for .Z compressed files.                            */\n/*                                                                         */\n/*  This optional component relies on NetBSD's zopen().  It should mainly  */\n/*  be used to parse compressed PCF fonts, as found with many X11 server   */\n/*  distributions.                                                         */\n/*                                                                         */\n/*  Copyright 2004-2006, 2009, 2010, 2012, 2013 by                         */\n/*  Albert Chin-A-Young.                                                   */\n/*                                                                         */\n/*  Based on code in src/gzip/ftgzip.c, Copyright 2004 by                  */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include <ft2build.h>\n#include FT_INTERNAL_MEMORY_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_LZW_H\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  LZW_Err_\n#define FT_ERR_BASE    FT_Mod_Err_LZW\n\n#include FT_ERRORS_H\n\n\n#ifdef FT_CONFIG_OPTION_USE_LZW\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"lzw code does not support PIC yet\"\n#endif\n\n#include \"ftzopen.h\"\n\n\n/***************************************************************************/\n/***************************************************************************/\n/*****                                                                 *****/\n/*****                  M E M O R Y   M A N A G E M E N T              *****/\n/*****                                                                 *****/\n/***************************************************************************/\n/***************************************************************************/\n\n/***************************************************************************/\n/***************************************************************************/\n/*****                                                                 *****/\n/*****                   F I L E   D E S C R I P T O R                 *****/\n/*****                                                                 *****/\n/***************************************************************************/\n/***************************************************************************/\n\n#define FT_LZW_BUFFER_SIZE  4096\n\n  typedef struct  FT_LZWFileRec_\n  {\n    FT_Stream       source;         /* parent/source stream        */\n    FT_Stream       stream;         /* embedding stream            */\n    FT_Memory       memory;         /* memory allocator            */\n    FT_LzwStateRec  lzw;            /* lzw decompressor state      */\n\n    FT_Byte         buffer[FT_LZW_BUFFER_SIZE]; /* output buffer      */\n    FT_ULong        pos;                        /* position in output */\n    FT_Byte*        cursor;\n    FT_Byte*        limit;\n\n  } FT_LZWFileRec, *FT_LZWFile;\n\n\n  /* check and skip .Z header */\n  static FT_Error\n  ft_lzw_check_header( FT_Stream  stream )\n  {\n    FT_Error  error;\n    FT_Byte   head[2];\n\n\n    if ( FT_STREAM_SEEK( 0 )       ||\n         FT_STREAM_READ( head, 2 ) )\n      goto Exit;\n\n    /* head[0] && head[1] are the magic numbers */\n    if ( head[0] != 0x1f ||\n         head[1] != 0x9d )\n      error = FT_THROW( Invalid_File_Format );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  ft_lzw_file_init( FT_LZWFile  zip,\n                    FT_Stream   stream,\n                    FT_Stream   source )\n  {\n    FT_LzwState  lzw   = &zip->lzw;\n    FT_Error     error = FT_Err_Ok;\n\n\n    zip->stream = stream;\n    zip->source = source;\n    zip->memory = stream->memory;\n\n    zip->limit  = zip->buffer + FT_LZW_BUFFER_SIZE;\n    zip->cursor = zip->limit;\n    zip->pos    = 0;\n\n    /* check and skip .Z header */\n    error = ft_lzw_check_header( source );\n    if ( error )\n      goto Exit;\n\n    /* initialize internal lzw variable */\n    ft_lzwstate_init( lzw, source );\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  ft_lzw_file_done( FT_LZWFile  zip )\n  {\n    /* clear the rest */\n    ft_lzwstate_done( &zip->lzw );\n\n    zip->memory = NULL;\n    zip->source = NULL;\n    zip->stream = NULL;\n  }\n\n\n  static FT_Error\n  ft_lzw_file_reset( FT_LZWFile  zip )\n  {\n    FT_Stream  stream = zip->source;\n    FT_Error   error;\n\n\n    if ( !FT_STREAM_SEEK( 0 ) )\n    {\n      ft_lzwstate_reset( &zip->lzw );\n\n      zip->limit  = zip->buffer + FT_LZW_BUFFER_SIZE;\n      zip->cursor = zip->limit;\n      zip->pos    = 0;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  ft_lzw_file_fill_output( FT_LZWFile  zip )\n  {\n    FT_LzwState  lzw = &zip->lzw;\n    FT_ULong     count;\n    FT_Error     error = FT_Err_Ok;\n\n\n    zip->cursor = zip->buffer;\n\n    count = ft_lzwstate_io( lzw, zip->buffer, FT_LZW_BUFFER_SIZE );\n\n    zip->limit = zip->cursor + count;\n\n    if ( count == 0 )\n      error = FT_THROW( Invalid_Stream_Operation );\n\n    return error;\n  }\n\n\n  /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */\n  static FT_Error\n  ft_lzw_file_skip_output( FT_LZWFile  zip,\n                           FT_ULong    count )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* first, we skip what we can from the output buffer */\n    {\n      FT_ULong  delta = (FT_ULong)( zip->limit - zip->cursor );\n\n\n      if ( delta >= count )\n        delta = count;\n\n      zip->cursor += delta;\n      zip->pos    += delta;\n\n      count -= delta;\n    }\n\n    /* next, we skip as many bytes remaining as possible */\n    while ( count > 0 )\n    {\n      FT_ULong  delta = FT_LZW_BUFFER_SIZE;\n      FT_ULong  numread;\n\n\n      if ( delta > count )\n        delta = count;\n\n      numread = ft_lzwstate_io( &zip->lzw, NULL, delta );\n      if ( numread < delta )\n      {\n        /* not enough bytes */\n        error = FT_THROW( Invalid_Stream_Operation );\n        break;\n      }\n\n      zip->pos += delta;\n      count    -= delta;\n    }\n\n    return error;\n  }\n\n\n  static FT_ULong\n  ft_lzw_file_io( FT_LZWFile  zip,\n                  FT_ULong    pos,\n                  FT_Byte*    buffer,\n                  FT_ULong    count )\n  {\n    FT_ULong  result = 0;\n    FT_Error  error;\n\n\n    /* seeking backwards. */\n    if ( pos < zip->pos )\n    {\n      /* If the new position is within the output buffer, simply       */\n      /* decrement pointers, otherwise we reset the stream completely! */\n      if ( ( zip->pos - pos ) <= (FT_ULong)( zip->cursor - zip->buffer ) )\n      {\n        zip->cursor -= zip->pos - pos;\n        zip->pos     = pos;\n      }\n      else\n      {\n        error = ft_lzw_file_reset( zip );\n        if ( error )\n          goto Exit;\n      }\n    }\n\n    /* skip unwanted bytes */\n    if ( pos > zip->pos )\n    {\n      error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( count == 0 )\n      goto Exit;\n\n    /* now read the data */\n    for (;;)\n    {\n      FT_ULong  delta;\n\n\n      delta = (FT_ULong)( zip->limit - zip->cursor );\n      if ( delta >= count )\n        delta = count;\n\n      FT_MEM_COPY( buffer + result, zip->cursor, delta );\n      result      += delta;\n      zip->cursor += delta;\n      zip->pos    += delta;\n\n      count -= delta;\n      if ( count == 0 )\n        break;\n\n      error = ft_lzw_file_fill_output( zip );\n      if ( error )\n        break;\n    }\n\n  Exit:\n    return result;\n  }\n\n\n/***************************************************************************/\n/***************************************************************************/\n/*****                                                                 *****/\n/*****            L Z W   E M B E D D I N G   S T R E A M              *****/\n/*****                                                                 *****/\n/***************************************************************************/\n/***************************************************************************/\n\n  static void\n  ft_lzw_stream_close( FT_Stream  stream )\n  {\n    FT_LZWFile  zip    = (FT_LZWFile)stream->descriptor.pointer;\n    FT_Memory   memory = stream->memory;\n\n\n    if ( zip )\n    {\n      /* finalize lzw file descriptor */\n      ft_lzw_file_done( zip );\n\n      FT_FREE( zip );\n\n      stream->descriptor.pointer = NULL;\n    }\n  }\n\n\n  static FT_ULong\n  ft_lzw_stream_io( FT_Stream  stream,\n                    FT_ULong   pos,\n                    FT_Byte*   buffer,\n                    FT_ULong   count )\n  {\n    FT_LZWFile  zip = (FT_LZWFile)stream->descriptor.pointer;\n\n\n    return ft_lzw_file_io( zip, pos, buffer, count );\n  }\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stream_OpenLZW( FT_Stream  stream,\n                     FT_Stream  source )\n  {\n    FT_Error    error;\n    FT_Memory   memory = source->memory;\n    FT_LZWFile  zip = NULL;\n\n\n    /*\n     *  Check the header right now; this prevents allocation of a huge\n     *  LZWFile object (400 KByte of heap memory) if not necessary.\n     *\n     *  Did I mention that you should never use .Z compressed font\n     *  files?\n     */\n    error = ft_lzw_check_header( source );\n    if ( error )\n      goto Exit;\n\n    FT_ZERO( stream );\n    stream->memory = memory;\n\n    if ( !FT_NEW( zip ) )\n    {\n      error = ft_lzw_file_init( zip, stream, source );\n      if ( error )\n      {\n        FT_FREE( zip );\n        goto Exit;\n      }\n\n      stream->descriptor.pointer = zip;\n    }\n\n    stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */\n    stream->pos   = 0;\n    stream->base  = 0;\n    stream->read  = ft_lzw_stream_io;\n    stream->close = ft_lzw_stream_close;\n\n  Exit:\n    return error;\n  }\n\n\n#include \"ftzopen.c\"\n\n\n#else  /* !FT_CONFIG_OPTION_USE_LZW */\n\n\n  FT_EXPORT_DEF( FT_Error )\n  FT_Stream_OpenLZW( FT_Stream  stream,\n                     FT_Stream  source )\n  {\n    FT_UNUSED( stream );\n    FT_UNUSED( source );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n#endif /* !FT_CONFIG_OPTION_USE_LZW */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/lzw/ftzopen.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftzopen.c                                                              */\n/*                                                                         */\n/*    FreeType support for .Z compressed files.                            */\n/*                                                                         */\n/*  This optional component relies on NetBSD's zopen().  It should mainly  */\n/*  be used to parse compressed PCF fonts, as found with many X11 server   */\n/*  distributions.                                                         */\n/*                                                                         */\n/*  Copyright 2005-2007, 2009, 2011 by David Turner.                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include \"ftzopen.h\"\n#include FT_INTERNAL_MEMORY_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_DEBUG_H\n\n\n  static int\n  ft_lzwstate_refill( FT_LzwState  state )\n  {\n    FT_ULong  count;\n\n\n    if ( state->in_eof )\n      return -1;\n\n    count = FT_Stream_TryRead( state->source,\n                               state->buf_tab,\n                               state->num_bits );  /* WHY? */\n\n    state->buf_size   = (FT_UInt)count;\n    state->buf_total += count;\n    state->in_eof     = FT_BOOL( count < state->num_bits );\n    state->buf_offset = 0;\n    state->buf_size   = ( state->buf_size << 3 ) - ( state->num_bits - 1 );\n\n    if ( count == 0 )  /* end of file */\n      return -1;\n\n    return 0;\n  }\n\n\n  static FT_Int32\n  ft_lzwstate_get_code( FT_LzwState  state )\n  {\n    FT_UInt   num_bits = state->num_bits;\n    FT_Int    offset   = state->buf_offset;\n    FT_Byte*  p;\n    FT_Int    result;\n\n\n    if ( state->buf_clear                    ||\n         offset >= state->buf_size           ||\n         state->free_ent >= state->free_bits )\n    {\n      if ( state->free_ent >= state->free_bits )\n      {\n        state->num_bits  = ++num_bits;\n        state->free_bits = state->num_bits < state->max_bits\n                           ? (FT_UInt)( ( 1UL << num_bits ) - 256 )\n                           : state->max_free + 1;\n      }\n\n      if ( state->buf_clear )\n      {\n        state->num_bits  = num_bits = LZW_INIT_BITS;\n        state->free_bits = (FT_UInt)( ( 1UL << num_bits ) - 256 );\n        state->buf_clear = 0;\n      }\n\n      if ( ft_lzwstate_refill( state ) < 0 )\n        return -1;\n\n      offset = 0;\n    }\n\n    state->buf_offset = offset + num_bits;\n\n    p         = &state->buf_tab[offset >> 3];\n    offset   &= 7;\n    result    = *p++ >> offset;\n    offset    = 8 - offset;\n    num_bits -= offset;\n\n    if ( num_bits >= 8 )\n    {\n      result   |= *p++ << offset;\n      offset   += 8;\n      num_bits -= 8;\n    }\n    if ( num_bits > 0 )\n      result |= ( *p & LZW_MASK( num_bits ) ) << offset;\n\n    return result;\n  }\n\n\n  /* grow the character stack */\n  static int\n  ft_lzwstate_stack_grow( FT_LzwState  state )\n  {\n    if ( state->stack_top >= state->stack_size )\n    {\n      FT_Memory  memory = state->memory;\n      FT_Error   error;\n      FT_Offset  old_size = state->stack_size;\n      FT_Offset  new_size = old_size;\n\n      new_size = new_size + ( new_size >> 1 ) + 4;\n\n      if ( state->stack == state->stack_0 )\n      {\n        state->stack = NULL;\n        old_size     = 0;\n      }\n\n      /* requirement of the character stack larger than 1<<LZW_MAX_BITS */\n      /* implies bug in the decompression code                          */\n      if ( new_size > ( 1 << LZW_MAX_BITS ) )\n      {\n        new_size = 1 << LZW_MAX_BITS;\n        if ( new_size == old_size )\n          return -1;\n      }\n\n      if ( FT_RENEW_ARRAY( state->stack, old_size, new_size ) )\n        return -1;\n\n      state->stack_size = new_size;\n    }\n    return 0;\n  }\n\n\n  /* grow the prefix/suffix arrays */\n  static int\n  ft_lzwstate_prefix_grow( FT_LzwState  state )\n  {\n    FT_UInt    old_size = state->prefix_size;\n    FT_UInt    new_size = old_size;\n    FT_Memory  memory   = state->memory;\n    FT_Error   error;\n\n\n    if ( new_size == 0 )  /* first allocation -> 9 bits */\n      new_size = 512;\n    else\n      new_size += new_size >> 2;  /* don't grow too fast */\n\n    /*\n     *  Note that the `suffix' array is located in the same memory block\n     *  pointed to by `prefix'.\n     *\n     *  I know that sizeof(FT_Byte) == 1 by definition, but it is clearer\n     *  to write it literally.\n     *\n     */\n    if ( FT_REALLOC_MULT( state->prefix, old_size, new_size,\n                          sizeof ( FT_UShort ) + sizeof ( FT_Byte ) ) )\n      return -1;\n\n    /* now adjust `suffix' and move the data accordingly */\n    state->suffix = (FT_Byte*)( state->prefix + new_size );\n\n    FT_MEM_MOVE( state->suffix,\n                 state->prefix + old_size,\n                 old_size * sizeof ( FT_Byte ) );\n\n    state->prefix_size = new_size;\n    return 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ft_lzwstate_reset( FT_LzwState  state )\n  {\n    state->in_eof     = 0;\n    state->buf_offset = 0;\n    state->buf_size   = 0;\n    state->buf_clear  = 0;\n    state->buf_total  = 0;\n    state->stack_top  = 0;\n    state->num_bits   = LZW_INIT_BITS;\n    state->phase      = FT_LZW_PHASE_START;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ft_lzwstate_init( FT_LzwState  state,\n                    FT_Stream    source )\n  {\n    FT_ZERO( state );\n\n    state->source = source;\n    state->memory = source->memory;\n\n    state->prefix      = NULL;\n    state->suffix      = NULL;\n    state->prefix_size = 0;\n\n    state->stack      = state->stack_0;\n    state->stack_size = sizeof ( state->stack_0 );\n\n    ft_lzwstate_reset( state );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ft_lzwstate_done( FT_LzwState  state )\n  {\n    FT_Memory  memory = state->memory;\n\n\n    ft_lzwstate_reset( state );\n\n    if ( state->stack != state->stack_0 )\n      FT_FREE( state->stack );\n\n    FT_FREE( state->prefix );\n    state->suffix = NULL;\n\n    FT_ZERO( state );\n  }\n\n\n#define FTLZW_STACK_PUSH( c )                        \\\n  FT_BEGIN_STMNT                                     \\\n    if ( state->stack_top >= state->stack_size &&    \\\n         ft_lzwstate_stack_grow( state ) < 0   )     \\\n      goto Eof;                                      \\\n                                                     \\\n    state->stack[state->stack_top++] = (FT_Byte)(c); \\\n  FT_END_STMNT\n\n\n  FT_LOCAL_DEF( FT_ULong )\n  ft_lzwstate_io( FT_LzwState  state,\n                  FT_Byte*     buffer,\n                  FT_ULong     out_size )\n  {\n    FT_ULong  result = 0;\n\n    FT_UInt  old_char = state->old_char;\n    FT_UInt  old_code = state->old_code;\n    FT_UInt  in_code  = state->in_code;\n\n\n    if ( out_size == 0 )\n      goto Exit;\n\n    switch ( state->phase )\n    {\n    case FT_LZW_PHASE_START:\n      {\n        FT_Byte   max_bits;\n        FT_Int32  c;\n\n\n        /* skip magic bytes, and read max_bits + block_flag */\n        if ( FT_Stream_Seek( state->source, 2 ) != 0               ||\n             FT_Stream_TryRead( state->source, &max_bits, 1 ) != 1 )\n          goto Eof;\n\n        state->max_bits   = max_bits & LZW_BIT_MASK;\n        state->block_mode = max_bits & LZW_BLOCK_MASK;\n        state->max_free   = (FT_UInt)( ( 1UL << state->max_bits ) - 256 );\n\n        if ( state->max_bits > LZW_MAX_BITS )\n          goto Eof;\n\n        state->num_bits = LZW_INIT_BITS;\n        state->free_ent = ( state->block_mode ? LZW_FIRST\n                                              : LZW_CLEAR ) - 256;\n        in_code  = 0;\n\n        state->free_bits = state->num_bits < state->max_bits\n                           ? (FT_UInt)( ( 1UL << state->num_bits ) - 256 )\n                           : state->max_free + 1;\n\n        c = ft_lzwstate_get_code( state );\n        if ( c < 0 || c > 255 )\n          goto Eof;\n\n        old_code = old_char = (FT_UInt)c;\n\n        if ( buffer )\n          buffer[result] = (FT_Byte)old_char;\n\n        if ( ++result >= out_size )\n          goto Exit;\n\n        state->phase = FT_LZW_PHASE_CODE;\n      }\n      /* fall-through */\n\n    case FT_LZW_PHASE_CODE:\n      {\n        FT_Int32  c;\n        FT_UInt   code;\n\n\n      NextCode:\n        c = ft_lzwstate_get_code( state );\n        if ( c < 0 )\n          goto Eof;\n\n        code = (FT_UInt)c;\n\n        if ( code == LZW_CLEAR && state->block_mode )\n        {\n          /* why not LZW_FIRST-256 ? */\n          state->free_ent  = ( LZW_FIRST - 1 ) - 256;\n          state->buf_clear = 1;\n\n          /* not quite right, but at least more predictable */\n          old_code = 0;\n          old_char = 0;\n\n          goto NextCode;\n        }\n\n        in_code = code; /* save code for later */\n\n        if ( code >= 256U )\n        {\n          /* special case for KwKwKwK */\n          if ( code - 256U >= state->free_ent )\n          {\n            /* corrupted LZW stream */\n            if ( code - 256U > state->free_ent )\n              goto Eof;\n\n            FTLZW_STACK_PUSH( old_char );\n            code = old_code;\n          }\n\n          while ( code >= 256U )\n          {\n            if ( !state->prefix )\n              goto Eof;\n\n            FTLZW_STACK_PUSH( state->suffix[code - 256] );\n            code = state->prefix[code - 256];\n          }\n        }\n\n        old_char = code;\n        FTLZW_STACK_PUSH( old_char );\n\n        state->phase = FT_LZW_PHASE_STACK;\n      }\n      /* fall-through */\n\n    case FT_LZW_PHASE_STACK:\n      {\n        while ( state->stack_top > 0 )\n        {\n          --state->stack_top;\n\n          if ( buffer )\n            buffer[result] = state->stack[state->stack_top];\n\n          if ( ++result == out_size )\n            goto Exit;\n        }\n\n        /* now create new entry */\n        if ( state->free_ent < state->max_free )\n        {\n          if ( state->free_ent >= state->prefix_size &&\n               ft_lzwstate_prefix_grow( state ) < 0  )\n            goto Eof;\n\n          FT_ASSERT( state->free_ent < state->prefix_size );\n\n          state->prefix[state->free_ent] = (FT_UShort)old_code;\n          state->suffix[state->free_ent] = (FT_Byte)  old_char;\n\n          state->free_ent += 1;\n        }\n\n        old_code = in_code;\n\n        state->phase = FT_LZW_PHASE_CODE;\n        goto NextCode;\n      }\n\n    default:  /* state == EOF */\n      ;\n    }\n\n  Exit:\n    state->old_code = old_code;\n    state->old_char = old_char;\n    state->in_code  = in_code;\n\n    return result;\n\n  Eof:\n    state->phase = FT_LZW_PHASE_EOF;\n    goto Exit;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/lzw/ftzopen.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftzopen.h                                                              */\n/*                                                                         */\n/*    FreeType support for .Z compressed files.                            */\n/*                                                                         */\n/*  This optional component relies on NetBSD's zopen().  It should mainly  */\n/*  be used to parse compressed PCF fonts, as found with many X11 server   */\n/*  distributions.                                                         */\n/*                                                                         */\n/*  Copyright 2005, 2006, 2007, 2008 by David Turner.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#ifndef __FT_ZOPEN_H__\n#define __FT_ZOPEN_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n\n  /*\n   *  This is a complete re-implementation of the LZW file reader,\n   *  since the old one was incredibly badly written, using\n   *  400 KByte of heap memory before decompressing anything.\n   *\n   */\n\n#define FT_LZW_IN_BUFF_SIZE        64\n#define FT_LZW_DEFAULT_STACK_SIZE  64\n\n#define LZW_INIT_BITS     9\n#define LZW_MAX_BITS      16\n\n#define LZW_CLEAR         256\n#define LZW_FIRST         257\n\n#define LZW_BIT_MASK      0x1f\n#define LZW_BLOCK_MASK    0x80\n#define LZW_MASK( n )     ( ( 1U << (n) ) - 1U )\n\n\n  typedef enum  FT_LzwPhase_\n  {\n    FT_LZW_PHASE_START = 0,\n    FT_LZW_PHASE_CODE,\n    FT_LZW_PHASE_STACK,\n    FT_LZW_PHASE_EOF\n\n  } FT_LzwPhase;\n\n\n  /*\n   *  state of LZW decompressor\n   *\n   *  small technical note\n   *  --------------------\n   *\n   *  We use a few tricks in this implementation that are explained here to\n   *  ease debugging and maintenance.\n   *\n   *  - First of all, the `prefix' and `suffix' arrays contain the suffix\n   *    and prefix for codes over 256; this means that\n   *\n   *      prefix_of(code) == state->prefix[code-256]\n   *      suffix_of(code) == state->suffix[code-256]\n   *\n   *    Each prefix is a 16-bit code, and each suffix an 8-bit byte.\n   *\n   *    Both arrays are stored in a single memory block, pointed to by\n   *    `state->prefix'.  This means that the following equality is always\n   *    true:\n   *\n   *      state->suffix == (FT_Byte*)(state->prefix + state->prefix_size)\n   *\n   *    Of course, state->prefix_size is the number of prefix/suffix slots\n   *    in the arrays, corresponding to codes 256..255+prefix_size.\n   *\n   *  - `free_ent' is the index of the next free entry in the `prefix'\n   *    and `suffix' arrays.  This means that the corresponding `next free\n   *    code' is really `256+free_ent'.\n   *\n   *    Moreover, `max_free' is the maximum value that `free_ent' can reach.\n   *\n   *    `max_free' corresponds to `(1 << max_bits) - 256'.  Note that this\n   *    value is always <= 0xFF00, which means that both `free_ent' and\n   *    `max_free' can be stored in an FT_UInt variable, even on 16-bit\n   *    machines.\n   *\n   *    If `free_ent == max_free', you cannot add new codes to the\n   *    prefix/suffix table.\n   *\n   *  - `num_bits' is the current number of code bits, starting at 9 and\n   *    growing each time `free_ent' reaches the value of `free_bits'.  The\n   *    latter is computed as follows\n   *\n   *      if num_bits < max_bits:\n   *         free_bits = (1 << num_bits)-256\n   *      else:\n   *         free_bits = max_free + 1\n   *\n   *    Since the value of `max_free + 1' can never be reached by\n   *    `free_ent', `num_bits' cannot grow larger than `max_bits'.\n   */\n\n  typedef struct  FT_LzwStateRec_\n  {\n    FT_LzwPhase  phase;\n    FT_Int       in_eof;\n\n    FT_Byte      buf_tab[16];\n    FT_Int       buf_offset;\n    FT_Int       buf_size;\n    FT_Bool      buf_clear;\n    FT_Offset    buf_total;\n\n    FT_UInt      max_bits;    /* max code bits, from file header   */\n    FT_Int       block_mode;  /* block mode flag, from file header */\n    FT_UInt      max_free;    /* (1 << max_bits) - 256             */\n\n    FT_UInt      num_bits;    /* current code bit number */\n    FT_UInt      free_ent;    /* index of next free entry */\n    FT_UInt      free_bits;   /* if reached by free_ent, increment num_bits */\n    FT_UInt      old_code;\n    FT_UInt      old_char;\n    FT_UInt      in_code;\n\n    FT_UShort*   prefix;      /* always dynamically allocated / reallocated */\n    FT_Byte*     suffix;      /* suffix = (FT_Byte*)(prefix + prefix_size)  */\n    FT_UInt      prefix_size; /* number of slots in `prefix' or `suffix'    */\n\n    FT_Byte*     stack;       /* character stack */\n    FT_UInt      stack_top;\n    FT_Offset    stack_size;\n    FT_Byte      stack_0[FT_LZW_DEFAULT_STACK_SIZE]; /* minimize heap alloc */\n\n    FT_Stream    source;      /* source stream */\n    FT_Memory    memory;\n\n  } FT_LzwStateRec, *FT_LzwState;\n\n\n  FT_LOCAL( void )\n  ft_lzwstate_init( FT_LzwState  state,\n                    FT_Stream    source );\n\n  FT_LOCAL( void )\n  ft_lzwstate_done( FT_LzwState  state );\n\n\n  FT_LOCAL( void )\n  ft_lzwstate_reset( FT_LzwState  state );\n\n\n  FT_LOCAL( FT_ULong )\n  ft_lzwstate_io( FT_LzwState  state,\n                  FT_Byte*     buffer,\n                  FT_ULong     out_size );\n\n/* */\n\n#endif /* __FT_ZOPEN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/lzw/rules.mk",
    "content": "#\n# FreeType 2 LZW support configuration rules\n#\n\n\n# Copyright 2004, 2005, 2006 by\n# Albert Chin-A-Young.\n#\n# Based on src/lzw/rules.mk, Copyright 2002 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# LZW driver directory\n#\nLZW_DIR := $(SRC_DIR)/lzw\n\n\n# compilation flags for the driver\n#\nLZW_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(LZW_DIR))\n\n\n# LZW support sources (i.e., C files)\n#\nLZW_DRV_SRC := $(LZW_DIR)/ftlzw.c\n\n# LZW support headers\n#\nLZW_DRV_H := $(LZW_DIR)/ftzopen.h \\\n             $(LZW_DIR)/ftzopen.c\n\n\n# LZW driver object(s)\n#\n#   LZW_DRV_OBJ_M is used during `multi' builds\n#   LZW_DRV_OBJ_S is used during `single' builds\n#\nLZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw.$O\nLZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw.$O\n\n# LZW support source file for single build\n#\nLZW_DRV_SRC_S := $(LZW_DIR)/ftlzw.c\n\n\n# LZW support - single object\n#\n$(LZW_DRV_OBJ_S): $(LZW_DRV_SRC_S) $(LZW_DRV_SRC) $(FREETYPE_H) $(LZW_DRV_H)\n\t$(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(LZW_DRV_SRC_S))\n\n\n# LZW support - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(LZW_DIR)/%.c $(FREETYPE_H) $(LZW_DRV_H)\n\t$(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(LZW_DRV_OBJ_S)\nDRV_OBJS_M += $(LZW_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/otvalid/Jamfile",
    "content": "# FreeType 2 src/otvalid Jamfile\n#\n# Copyright 2004 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) otvalid ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = otvbase otvcommn otvgdef otvgpos otvgsub otvjstf otvmod otvmath ;\n  }\n  else\n  {\n    _sources = otvalid ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/otvalid Jamfile\n"
  },
  {
    "path": "libs/freetype/src/otvalid/module.mk",
    "content": "#\n# FreeType 2 otvalid module definition\n#\n\n\n# Copyright 2004, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += OTVALID_MODULE\n\ndefine OTVALID_MODULE\n$(OPEN_DRIVER) FT_Module_Class, otv_module_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)otvalid   $(ECHO_DRIVER_DESC)OpenType validation module$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvalid.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvalid.c                                                              */\n/*                                                                         */\n/*    FreeType validator for OpenType tables (body only).                  */\n/*                                                                         */\n/*  Copyright 2004, 2007 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n\n#include \"otvbase.c\"\n#include \"otvcommn.c\"\n#include \"otvgdef.c\"\n#include \"otvgpos.c\"\n#include \"otvgsub.c\"\n#include \"otvjstf.c\"\n#include \"otvmath.c\"\n#include \"otvmod.c\"\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvalid.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvalid.h                                                              */\n/*                                                                         */\n/*    OpenType table validation (specification only).                      */\n/*                                                                         */\n/*  Copyright 2004, 2008 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __OTVALID_H__\n#define __OTVALID_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n\n#include \"otverror.h\"           /* must come before FT_INTERNAL_VALIDATE_H */\n\n#include FT_INTERNAL_VALIDATE_H\n#include FT_INTERNAL_STREAM_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  otv_BASE_validate( FT_Bytes      table,\n                     FT_Validator  valid );\n\n  /* GSUB and GPOS tables should already be validated; */\n  /* if missing, set corresponding argument to 0       */\n  FT_LOCAL( void )\n  otv_GDEF_validate( FT_Bytes      table,\n                     FT_Bytes      gsub,\n                     FT_Bytes      gpos,\n                     FT_UInt       glyph_count,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  otv_GPOS_validate( FT_Bytes      table,\n                     FT_UInt       glyph_count,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  otv_GSUB_validate( FT_Bytes      table,\n                     FT_UInt       glyph_count,\n                     FT_Validator  valid );\n\n  /* GSUB and GPOS tables should already be validated; */\n  /* if missing, set corresponding argument to 0       */\n  FT_LOCAL( void )\n  otv_JSTF_validate( FT_Bytes      table,\n                     FT_Bytes      gsub,\n                     FT_Bytes      gpos,\n                     FT_UInt       glyph_count,\n                     FT_Validator  valid );\n\n  FT_LOCAL( void )\n  otv_MATH_validate( FT_Bytes      table,\n                     FT_UInt       glyph_count,\n                     FT_Validator  ftvalid );\n\n\nFT_END_HEADER\n\n#endif /* __OTVALID_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvbase.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvbase.c                                                              */\n/*                                                                         */\n/*    OpenType BASE table validation (body).                               */\n/*                                                                         */\n/*  Copyright 2004, 2007 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"otvalid.h\"\n#include \"otvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_otvbase\n\n\n  static void\n  otv_BaseCoord_validate( FT_Bytes       table,\n                          OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   BaseCoordFormat;\n\n\n    OTV_NAME_ENTER( \"BaseCoord\" );\n\n    OTV_LIMIT_CHECK( 4 );\n    BaseCoordFormat = FT_NEXT_USHORT( p );\n    p += 2;     /* skip Coordinate */\n\n    OTV_TRACE(( \" (format %d)\\n\", BaseCoordFormat ));\n\n    switch ( BaseCoordFormat )\n    {\n    case 1:     /* BaseCoordFormat1 */\n      break;\n\n    case 2:     /* BaseCoordFormat2 */\n      OTV_LIMIT_CHECK( 4 );   /* ReferenceGlyph, BaseCoordPoint */\n      break;\n\n    case 3:     /* BaseCoordFormat3 */\n      OTV_LIMIT_CHECK( 2 );\n      /* DeviceTable */\n      otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  static void\n  otv_BaseTagList_validate( FT_Bytes       table,\n                            OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   BaseTagCount;\n\n\n    OTV_NAME_ENTER( \"BaseTagList\" );\n\n    OTV_LIMIT_CHECK( 2 );\n\n    BaseTagCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (BaseTagCount = %d)\\n\", BaseTagCount ));\n\n    OTV_LIMIT_CHECK( BaseTagCount * 4 );          /* BaselineTag */\n\n    OTV_EXIT;\n  }\n\n\n  static void\n  otv_BaseValues_validate( FT_Bytes       table,\n                           OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   BaseCoordCount;\n\n\n    OTV_NAME_ENTER( \"BaseValues\" );\n\n    OTV_LIMIT_CHECK( 4 );\n\n    p             += 2;                     /* skip DefaultIndex */\n    BaseCoordCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (BaseCoordCount = %d)\\n\", BaseCoordCount ));\n\n    OTV_LIMIT_CHECK( BaseCoordCount * 2 );\n\n    /* BaseCoord */\n    for ( ; BaseCoordCount > 0; BaseCoordCount-- )\n      otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), valid );\n\n    OTV_EXIT;\n  }\n\n\n  static void\n  otv_MinMax_validate( FT_Bytes       table,\n                       OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   table_size;\n    FT_UInt   FeatMinMaxCount;\n\n    OTV_OPTIONAL_TABLE( MinCoord );\n    OTV_OPTIONAL_TABLE( MaxCoord );\n\n\n    OTV_NAME_ENTER( \"MinMax\" );\n\n    OTV_LIMIT_CHECK( 6 );\n\n    OTV_OPTIONAL_OFFSET( MinCoord );\n    OTV_OPTIONAL_OFFSET( MaxCoord );\n    FeatMinMaxCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (FeatMinMaxCount = %d)\\n\", FeatMinMaxCount ));\n\n    table_size = FeatMinMaxCount * 8 + 6;\n\n    OTV_SIZE_CHECK( MinCoord );\n    if ( MinCoord )\n      otv_BaseCoord_validate( table + MinCoord, valid );\n\n    OTV_SIZE_CHECK( MaxCoord );\n    if ( MaxCoord )\n      otv_BaseCoord_validate( table + MaxCoord, valid );\n\n    OTV_LIMIT_CHECK( FeatMinMaxCount * 8 );\n\n    /* FeatMinMaxRecord */\n    for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- )\n    {\n      p += 4;                           /* skip FeatureTableTag */\n\n      OTV_OPTIONAL_OFFSET( MinCoord );\n      OTV_OPTIONAL_OFFSET( MaxCoord );\n\n      OTV_SIZE_CHECK( MinCoord );\n      if ( MinCoord )\n        otv_BaseCoord_validate( table + MinCoord, valid );\n\n      OTV_SIZE_CHECK( MaxCoord );\n      if ( MaxCoord )\n        otv_BaseCoord_validate( table + MaxCoord, valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  static void\n  otv_BaseScript_validate( FT_Bytes       table,\n                           OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   table_size;\n    FT_UInt   BaseLangSysCount;\n\n    OTV_OPTIONAL_TABLE( BaseValues    );\n    OTV_OPTIONAL_TABLE( DefaultMinMax );\n\n\n    OTV_NAME_ENTER( \"BaseScript\" );\n\n    OTV_LIMIT_CHECK( 6 );\n    OTV_OPTIONAL_OFFSET( BaseValues    );\n    OTV_OPTIONAL_OFFSET( DefaultMinMax );\n    BaseLangSysCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (BaseLangSysCount = %d)\\n\", BaseLangSysCount ));\n\n    table_size = BaseLangSysCount * 6 + 6;\n\n    OTV_SIZE_CHECK( BaseValues );\n    if ( BaseValues )\n      otv_BaseValues_validate( table + BaseValues, valid );\n\n    OTV_SIZE_CHECK( DefaultMinMax );\n    if ( DefaultMinMax )\n      otv_MinMax_validate( table + DefaultMinMax, valid );\n\n    OTV_LIMIT_CHECK( BaseLangSysCount * 6 );\n\n    /* BaseLangSysRecord */\n    for ( ; BaseLangSysCount > 0; BaseLangSysCount-- )\n    {\n      p += 4;       /* skip BaseLangSysTag */\n\n      otv_MinMax_validate( table + FT_NEXT_USHORT( p ), valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  static void\n  otv_BaseScriptList_validate( FT_Bytes       table,\n                               OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   BaseScriptCount;\n\n\n    OTV_NAME_ENTER( \"BaseScriptList\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    BaseScriptCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (BaseScriptCount = %d)\\n\", BaseScriptCount ));\n\n    OTV_LIMIT_CHECK( BaseScriptCount * 6 );\n\n    /* BaseScriptRecord */\n    for ( ; BaseScriptCount > 0; BaseScriptCount-- )\n    {\n      p += 4;       /* skip BaseScriptTag */\n\n      /* BaseScript */\n      otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  static void\n  otv_Axis_validate( FT_Bytes       table,\n                     OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   table_size;\n\n    OTV_OPTIONAL_TABLE( BaseTagList );\n\n\n    OTV_NAME_ENTER( \"Axis\" );\n\n    OTV_LIMIT_CHECK( 4 );\n    OTV_OPTIONAL_OFFSET( BaseTagList );\n\n    table_size = 4;\n\n    OTV_SIZE_CHECK( BaseTagList );\n    if ( BaseTagList )\n      otv_BaseTagList_validate( table + BaseTagList, valid );\n\n    /* BaseScriptList */\n    otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), valid );\n\n    OTV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  otv_BASE_validate( FT_Bytes      table,\n                     FT_Validator  ftvalid )\n  {\n    OTV_ValidatorRec  validrec;\n    OTV_Validator     valid = &validrec;\n    FT_Bytes          p     = table;\n    FT_UInt           table_size;\n\n    OTV_OPTIONAL_TABLE( HorizAxis );\n    OTV_OPTIONAL_TABLE( VertAxis  );\n\n\n    valid->root = ftvalid;\n\n    FT_TRACE3(( \"validating BASE table\\n\" ));\n    OTV_INIT;\n\n    OTV_LIMIT_CHECK( 6 );\n\n    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */\n      FT_INVALID_FORMAT;\n\n    table_size = 6;\n\n    OTV_OPTIONAL_OFFSET( HorizAxis );\n    OTV_SIZE_CHECK( HorizAxis );\n    if ( HorizAxis )\n      otv_Axis_validate( table + HorizAxis, valid );\n\n    OTV_OPTIONAL_OFFSET( VertAxis );\n    OTV_SIZE_CHECK( VertAxis );\n    if ( VertAxis )\n      otv_Axis_validate( table + VertAxis, valid );\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvcommn.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvcommn.c                                                             */\n/*                                                                         */\n/*    OpenType common tables validation (body).                            */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2006, 2007 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"otvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_otvcommon\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       COVERAGE TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  otv_Coverage_validate( FT_Bytes       table,\n                         OTV_Validator  valid,\n                         FT_Int         expected_count )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   CoverageFormat;\n    FT_UInt   total = 0;\n\n\n    OTV_NAME_ENTER( \"Coverage\" );\n\n    OTV_LIMIT_CHECK( 4 );\n    CoverageFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", CoverageFormat ));\n\n    switch ( CoverageFormat )\n    {\n    case 1:     /* CoverageFormat1 */\n      {\n        FT_UInt  GlyphCount;\n        FT_UInt  i;\n\n\n        GlyphCount = FT_NEXT_USHORT( p );\n\n        OTV_TRACE(( \" (GlyphCount = %d)\\n\", GlyphCount ));\n\n        OTV_LIMIT_CHECK( GlyphCount * 2 );        /* GlyphArray */\n\n        for ( i = 0; i < GlyphCount; ++i )\n        {\n          FT_UInt  gid;\n\n\n          gid = FT_NEXT_USHORT( p );\n          if ( gid >= valid->glyph_count )\n            FT_INVALID_GLYPH_ID;\n        }\n\n        total = GlyphCount;\n      }\n      break;\n\n    case 2:     /* CoverageFormat2 */\n      {\n        FT_UInt  n, RangeCount;\n        FT_UInt  Start, End, StartCoverageIndex, last = 0;\n\n\n        RangeCount = FT_NEXT_USHORT( p );\n\n        OTV_TRACE(( \" (RangeCount = %d)\\n\", RangeCount ));\n\n        OTV_LIMIT_CHECK( RangeCount * 6 );\n\n        /* RangeRecord */\n        for ( n = 0; n < RangeCount; n++ )\n        {\n          Start              = FT_NEXT_USHORT( p );\n          End                = FT_NEXT_USHORT( p );\n          StartCoverageIndex = FT_NEXT_USHORT( p );\n\n          if ( Start > End || StartCoverageIndex != total )\n            FT_INVALID_DATA;\n\n          if ( End >= valid->glyph_count )\n            FT_INVALID_GLYPH_ID;\n\n          if ( n > 0 && Start <= last )\n            FT_INVALID_DATA;\n\n          total += End - Start + 1;\n          last   = End;\n        }\n      }\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    /* Generally, a coverage table offset has an associated count field.  */\n    /* The number of glyphs in the table should match this field.  If     */\n    /* there is no associated count, a value of -1 tells us not to check. */\n    if ( expected_count != -1 && (FT_UInt)expected_count != total )\n      FT_INVALID_DATA;\n\n    OTV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  otv_Coverage_get_first( FT_Bytes  table )\n  {\n    FT_Bytes  p = table;\n\n\n    p += 4;     /* skip CoverageFormat and Glyph/RangeCount */\n\n    return FT_NEXT_USHORT( p );\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  otv_Coverage_get_last( FT_Bytes  table )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   CoverageFormat = FT_NEXT_USHORT( p );\n    FT_UInt   count          = FT_NEXT_USHORT( p );     /* Glyph/RangeCount */\n    FT_UInt   result = 0;\n\n\n    switch ( CoverageFormat )\n    {\n    case 1:\n      p += ( count - 1 ) * 2;\n      result = FT_NEXT_USHORT( p );\n      break;\n\n    case 2:\n      p += ( count - 1 ) * 6 + 2;\n      result = FT_NEXT_USHORT( p );\n      break;\n\n    default:\n      ;\n    }\n\n    return result;\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  otv_Coverage_get_count( FT_Bytes  table )\n  {\n    FT_Bytes  p              = table;\n    FT_UInt   CoverageFormat = FT_NEXT_USHORT( p );\n    FT_UInt   count          = FT_NEXT_USHORT( p );     /* Glyph/RangeCount */\n    FT_UInt   result         = 0;\n\n\n    switch ( CoverageFormat )\n    {\n    case 1:\n      return count;\n\n    case 2:\n      {\n        FT_UInt  Start, End;\n\n\n        for ( ; count > 0; count-- )\n        {\n          Start = FT_NEXT_USHORT( p );\n          End   = FT_NEXT_USHORT( p );\n          p    += 2;                    /* skip StartCoverageIndex */\n\n          result += End - Start + 1;\n        }\n      }\n      break;\n\n    default:\n      ;\n    }\n\n    return result;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                   CLASS DEFINITION TABLE                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  otv_ClassDef_validate( FT_Bytes       table,\n                         OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   ClassFormat;\n\n\n    OTV_NAME_ENTER( \"ClassDef\" );\n\n    OTV_LIMIT_CHECK( 4 );\n    ClassFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", ClassFormat ));\n\n    switch ( ClassFormat )\n    {\n    case 1:     /* ClassDefFormat1 */\n      {\n        FT_UInt  StartGlyph;\n        FT_UInt  GlyphCount;\n\n\n        OTV_LIMIT_CHECK( 4 );\n\n        StartGlyph = FT_NEXT_USHORT( p );\n        GlyphCount = FT_NEXT_USHORT( p );\n\n        OTV_TRACE(( \" (GlyphCount = %d)\\n\", GlyphCount ));\n\n        OTV_LIMIT_CHECK( GlyphCount * 2 );    /* ClassValueArray */\n\n        if ( StartGlyph + GlyphCount - 1 >= valid->glyph_count )\n          FT_INVALID_GLYPH_ID;\n      }\n      break;\n\n    case 2:     /* ClassDefFormat2 */\n      {\n        FT_UInt  n, ClassRangeCount;\n        FT_UInt  Start, End, last = 0;\n\n\n        ClassRangeCount = FT_NEXT_USHORT( p );\n\n        OTV_TRACE(( \" (ClassRangeCount = %d)\\n\", ClassRangeCount ));\n\n        OTV_LIMIT_CHECK( ClassRangeCount * 6 );\n\n        /* ClassRangeRecord */\n        for ( n = 0; n < ClassRangeCount; n++ )\n        {\n          Start = FT_NEXT_USHORT( p );\n          End   = FT_NEXT_USHORT( p );\n          p    += 2;                        /* skip Class */\n\n          if ( Start > End || ( n > 0 && Start <= last ) )\n            FT_INVALID_DATA;\n\n          if ( End >= valid->glyph_count )\n            FT_INVALID_GLYPH_ID;\n\n          last = End;\n        }\n      }\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    /* no need to check glyph indices used as input to class definition   */\n    /* tables since even invalid glyph indices return a meaningful result */\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      DEVICE TABLE                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  otv_Device_validate( FT_Bytes       table,\n                       OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   StartSize, EndSize, DeltaFormat, count;\n\n\n    OTV_NAME_ENTER( \"Device\" );\n\n    OTV_LIMIT_CHECK( 8 );\n    StartSize   = FT_NEXT_USHORT( p );\n    EndSize     = FT_NEXT_USHORT( p );\n    DeltaFormat = FT_NEXT_USHORT( p );\n\n    if ( DeltaFormat < 1 || DeltaFormat > 3 )\n      FT_INVALID_FORMAT;\n\n    if ( EndSize < StartSize )\n      FT_INVALID_DATA;\n\n    count = EndSize - StartSize + 1;\n    OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 );  /* DeltaValue */\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         LOOKUPS                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* uses valid->type_count */\n  /* uses valid->type_funcs */\n\n  FT_LOCAL_DEF( void )\n  otv_Lookup_validate( FT_Bytes       table,\n                       OTV_Validator  valid )\n  {\n    FT_Bytes           p = table;\n    FT_UInt            LookupType, SubTableCount;\n    OTV_Validate_Func  validate;\n\n\n    OTV_NAME_ENTER( \"Lookup\" );\n\n    OTV_LIMIT_CHECK( 6 );\n    LookupType    = FT_NEXT_USHORT( p );\n    p            += 2;                      /* skip LookupFlag */\n    SubTableCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (type %d)\\n\", LookupType ));\n\n    if ( LookupType == 0 || LookupType > valid->type_count )\n      FT_INVALID_DATA;\n\n    validate = valid->type_funcs[LookupType - 1];\n\n    OTV_TRACE(( \" (SubTableCount = %d)\\n\", SubTableCount ));\n\n    OTV_LIMIT_CHECK( SubTableCount * 2 );\n\n    /* SubTable */\n    for ( ; SubTableCount > 0; SubTableCount-- )\n      validate( table + FT_NEXT_USHORT( p ), valid );\n\n    OTV_EXIT;\n  }\n\n\n  /* uses valid->lookup_count */\n\n  FT_LOCAL_DEF( void )\n  otv_LookupList_validate( FT_Bytes       table,\n                           OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   LookupCount;\n\n\n    OTV_NAME_ENTER( \"LookupList\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    LookupCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (LookupCount = %d)\\n\", LookupCount ));\n\n    OTV_LIMIT_CHECK( LookupCount * 2 );\n\n    valid->lookup_count = LookupCount;\n\n    /* Lookup */\n    for ( ; LookupCount > 0; LookupCount-- )\n      otv_Lookup_validate( table + FT_NEXT_USHORT( p ), valid );\n\n    OTV_EXIT;\n  }\n\n\n  static FT_UInt\n  otv_LookupList_get_count( FT_Bytes  table )\n  {\n    return FT_NEXT_USHORT( table );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        FEATURES                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* uses valid->lookup_count */\n\n  FT_LOCAL_DEF( void )\n  otv_Feature_validate( FT_Bytes       table,\n                        OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   LookupCount;\n\n\n    OTV_NAME_ENTER( \"Feature\" );\n\n    OTV_LIMIT_CHECK( 4 );\n    p           += 2;                   /* skip FeatureParams (unused) */\n    LookupCount  = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (LookupCount = %d)\\n\", LookupCount ));\n\n    OTV_LIMIT_CHECK( LookupCount * 2 );\n\n    /* LookupListIndex */\n    for ( ; LookupCount > 0; LookupCount-- )\n      if ( FT_NEXT_USHORT( p ) >= valid->lookup_count )\n        FT_INVALID_DATA;\n\n    OTV_EXIT;\n  }\n\n\n  static FT_UInt\n  otv_Feature_get_count( FT_Bytes  table )\n  {\n    return FT_NEXT_USHORT( table );\n  }\n\n\n  /* sets valid->lookup_count */\n\n  FT_LOCAL_DEF( void )\n  otv_FeatureList_validate( FT_Bytes       table,\n                            FT_Bytes       lookups,\n                            OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   FeatureCount;\n\n\n    OTV_NAME_ENTER( \"FeatureList\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    FeatureCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (FeatureCount = %d)\\n\", FeatureCount ));\n\n    OTV_LIMIT_CHECK( FeatureCount * 2 );\n\n    valid->lookup_count = otv_LookupList_get_count( lookups );\n\n    /* FeatureRecord */\n    for ( ; FeatureCount > 0; FeatureCount-- )\n    {\n      p += 4;       /* skip FeatureTag */\n\n      /* Feature */\n      otv_Feature_validate( table + FT_NEXT_USHORT( p ), valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       LANGUAGE SYSTEM                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* uses valid->extra1 (number of features) */\n\n  FT_LOCAL_DEF( void )\n  otv_LangSys_validate( FT_Bytes       table,\n                        OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   ReqFeatureIndex;\n    FT_UInt   FeatureCount;\n\n\n    OTV_NAME_ENTER( \"LangSys\" );\n\n    OTV_LIMIT_CHECK( 6 );\n    p              += 2;                    /* skip LookupOrder (unused) */\n    ReqFeatureIndex = FT_NEXT_USHORT( p );\n    FeatureCount    = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (ReqFeatureIndex = %d)\\n\", ReqFeatureIndex ));\n    OTV_TRACE(( \" (FeatureCount = %d)\\n\",    FeatureCount    ));\n\n    if ( ReqFeatureIndex != 0xFFFFU && ReqFeatureIndex >= valid->extra1 )\n      FT_INVALID_DATA;\n\n    OTV_LIMIT_CHECK( FeatureCount * 2 );\n\n    /* FeatureIndex */\n    for ( ; FeatureCount > 0; FeatureCount-- )\n      if ( FT_NEXT_USHORT( p ) >= valid->extra1 )\n        FT_INVALID_DATA;\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           SCRIPTS                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  otv_Script_validate( FT_Bytes       table,\n                       OTV_Validator  valid )\n  {\n    FT_UInt   DefaultLangSys, LangSysCount;\n    FT_Bytes  p = table;\n\n\n    OTV_NAME_ENTER( \"Script\" );\n\n    OTV_LIMIT_CHECK( 4 );\n    DefaultLangSys = FT_NEXT_USHORT( p );\n    LangSysCount   = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (LangSysCount = %d)\\n\", LangSysCount ));\n\n    if ( DefaultLangSys != 0 )\n      otv_LangSys_validate( table + DefaultLangSys, valid );\n\n    OTV_LIMIT_CHECK( LangSysCount * 6 );\n\n    /* LangSysRecord */\n    for ( ; LangSysCount > 0; LangSysCount-- )\n    {\n      p += 4;       /* skip LangSysTag */\n\n      /* LangSys */\n      otv_LangSys_validate( table + FT_NEXT_USHORT( p ), valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /* sets valid->extra1 (number of features) */\n\n  FT_LOCAL_DEF( void )\n  otv_ScriptList_validate( FT_Bytes       table,\n                           FT_Bytes       features,\n                           OTV_Validator  valid )\n  {\n    FT_UInt   ScriptCount;\n    FT_Bytes  p = table;\n\n\n    OTV_NAME_ENTER( \"ScriptList\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    ScriptCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (ScriptCount = %d)\\n\", ScriptCount ));\n\n    OTV_LIMIT_CHECK( ScriptCount * 6 );\n\n    valid->extra1 = otv_Feature_get_count( features );\n\n    /* ScriptRecord */\n    for ( ; ScriptCount > 0; ScriptCount-- )\n    {\n      p += 4;       /* skip ScriptTag */\n\n      otv_Script_validate( table + FT_NEXT_USHORT( p ), valid ); /* Script */\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*\n     u:   uint16\n     ux:  unit16 [x]\n\n     s:   struct\n     sx:  struct [x]\n     sxy: struct [x], using external y count\n\n     x:   uint16 x\n\n     C:   Coverage\n\n     O:   Offset\n     On:  Offset (NULL)\n     Ox:  Offset [x]\n     Onx: Offset (NULL) [x]\n  */\n\n  FT_LOCAL_DEF( void )\n  otv_x_Ox( FT_Bytes       table,\n            OTV_Validator  valid )\n  {\n    FT_Bytes           p = table;\n    FT_UInt            Count;\n    OTV_Validate_Func  func;\n\n\n    OTV_ENTER;\n\n    OTV_LIMIT_CHECK( 2 );\n    Count = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (Count = %d)\\n\", Count ));\n\n    OTV_LIMIT_CHECK( Count * 2 );\n\n    valid->nesting_level++;\n    func = valid->func[valid->nesting_level];\n\n    for ( ; Count > 0; Count-- )\n      func( table + FT_NEXT_USHORT( p ), valid );\n\n    valid->nesting_level--;\n\n    OTV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  otv_u_C_x_Ox( FT_Bytes       table,\n                OTV_Validator  valid )\n  {\n    FT_Bytes           p = table;\n    FT_UInt            Count, Coverage;\n    OTV_Validate_Func  func;\n\n\n    OTV_ENTER;\n\n    p += 2;     /* skip Format */\n\n    OTV_LIMIT_CHECK( 4 );\n    Coverage = FT_NEXT_USHORT( p );\n    Count    = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (Count = %d)\\n\", Count ));\n\n    otv_Coverage_validate( table + Coverage, valid, Count );\n\n    OTV_LIMIT_CHECK( Count * 2 );\n\n    valid->nesting_level++;\n    func = valid->func[valid->nesting_level];\n\n    for ( ; Count > 0; Count-- )\n      func( table + FT_NEXT_USHORT( p ), valid );\n\n    valid->nesting_level--;\n\n    OTV_EXIT;\n  }\n\n\n  /* uses valid->extra1 (if > 0: array value limit) */\n\n  FT_LOCAL_DEF( void )\n  otv_x_ux( FT_Bytes       table,\n            OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   Count;\n\n\n    OTV_ENTER;\n\n    OTV_LIMIT_CHECK( 2 );\n    Count = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (Count = %d)\\n\", Count ));\n\n    OTV_LIMIT_CHECK( Count * 2 );\n\n    if ( valid->extra1 )\n    {\n      for ( ; Count > 0; Count-- )\n        if ( FT_NEXT_USHORT( p ) >= valid->extra1 )\n          FT_INVALID_DATA;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /* `ux' in the function's name is not really correct since only x-1 */\n  /* elements are tested                                              */\n\n  /* uses valid->extra1 (array value limit) */\n\n  FT_LOCAL_DEF( void )\n  otv_x_y_ux_sy( FT_Bytes       table,\n                 OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   Count1, Count2;\n\n\n    OTV_ENTER;\n\n    OTV_LIMIT_CHECK( 4 );\n    Count1 = FT_NEXT_USHORT( p );\n    Count2 = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (Count1 = %d)\\n\", Count1 ));\n    OTV_TRACE(( \" (Count2 = %d)\\n\", Count2 ));\n\n    if ( Count1 == 0 )\n      FT_INVALID_DATA;\n\n    OTV_LIMIT_CHECK( ( Count1 - 1 ) * 2 + Count2 * 4 );\n    p += ( Count1 - 1 ) * 2;\n\n    for ( ; Count2 > 0; Count2-- )\n    {\n      if ( FT_NEXT_USHORT( p ) >= Count1 )\n        FT_INVALID_DATA;\n\n      if ( FT_NEXT_USHORT( p ) >= valid->extra1 )\n        FT_INVALID_DATA;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /* `uy' in the function's name is not really correct since only y-1 */\n  /* elements are tested                                              */\n\n  /* uses valid->extra1 (array value limit) */\n\n  FT_LOCAL_DEF( void )\n  otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes       table,\n                           OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   BacktrackCount, InputCount, LookaheadCount;\n    FT_UInt   Count;\n\n\n    OTV_ENTER;\n\n    OTV_LIMIT_CHECK( 2 );\n    BacktrackCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (BacktrackCount = %d)\\n\", BacktrackCount ));\n\n    OTV_LIMIT_CHECK( BacktrackCount * 2 + 2 );\n    p += BacktrackCount * 2;\n\n    InputCount = FT_NEXT_USHORT( p );\n    if ( InputCount == 0 )\n      FT_INVALID_DATA;\n\n    OTV_TRACE(( \" (InputCount = %d)\\n\", InputCount ));\n\n    OTV_LIMIT_CHECK( InputCount * 2 );\n    p += ( InputCount - 1 ) * 2;\n\n    LookaheadCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (LookaheadCount = %d)\\n\", LookaheadCount ));\n\n    OTV_LIMIT_CHECK( LookaheadCount * 2 + 2 );\n    p += LookaheadCount * 2;\n\n    Count = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (Count = %d)\\n\", Count ));\n\n    OTV_LIMIT_CHECK( Count * 4 );\n\n    for ( ; Count > 0; Count-- )\n    {\n      if ( FT_NEXT_USHORT( p ) >= InputCount )\n        FT_INVALID_DATA;\n\n      if ( FT_NEXT_USHORT( p ) >= valid->extra1 )\n        FT_INVALID_DATA;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /* sets valid->extra1 (valid->lookup_count) */\n\n  FT_LOCAL_DEF( void )\n  otv_u_O_O_x_Onx( FT_Bytes       table,\n                   OTV_Validator  valid )\n  {\n    FT_Bytes           p = table;\n    FT_UInt            Coverage, ClassDef, ClassSetCount;\n    OTV_Validate_Func  func;\n\n\n    OTV_ENTER;\n\n    p += 2;     /* skip Format */\n\n    OTV_LIMIT_CHECK( 6 );\n    Coverage      = FT_NEXT_USHORT( p );\n    ClassDef      = FT_NEXT_USHORT( p );\n    ClassSetCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (ClassSetCount = %d)\\n\", ClassSetCount ));\n\n    otv_Coverage_validate( table + Coverage, valid, -1 );\n    otv_ClassDef_validate( table + ClassDef, valid );\n\n    OTV_LIMIT_CHECK( ClassSetCount * 2 );\n\n    valid->nesting_level++;\n    func          = valid->func[valid->nesting_level];\n    valid->extra1 = valid->lookup_count;\n\n    for ( ; ClassSetCount > 0; ClassSetCount-- )\n    {\n      FT_UInt  offset = FT_NEXT_USHORT( p );\n\n\n      if ( offset )\n        func( table + offset, valid );\n    }\n\n    valid->nesting_level--;\n\n    OTV_EXIT;\n  }\n\n\n  /* uses valid->lookup_count */\n\n  FT_LOCAL_DEF( void )\n  otv_u_x_y_Ox_sy( FT_Bytes       table,\n                   OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   GlyphCount, Count, count1;\n\n\n    OTV_ENTER;\n\n    p += 2;     /* skip Format */\n\n    OTV_LIMIT_CHECK( 4 );\n    GlyphCount = FT_NEXT_USHORT( p );\n    Count      = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (GlyphCount = %d)\\n\", GlyphCount ));\n    OTV_TRACE(( \" (Count = %d)\\n\",      Count      ));\n\n    OTV_LIMIT_CHECK( GlyphCount * 2 + Count * 4 );\n\n    for ( count1 = GlyphCount; count1 > 0; count1-- )\n      otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );\n\n    for ( ; Count > 0; Count-- )\n    {\n      if ( FT_NEXT_USHORT( p ) >= GlyphCount )\n        FT_INVALID_DATA;\n\n      if ( FT_NEXT_USHORT( p ) >= valid->lookup_count )\n        FT_INVALID_DATA;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /* sets valid->extra1 (valid->lookup_count)    */\n\n  FT_LOCAL_DEF( void )\n  otv_u_O_O_O_O_x_Onx( FT_Bytes       table,\n                       OTV_Validator  valid )\n  {\n    FT_Bytes           p = table;\n    FT_UInt            Coverage;\n    FT_UInt            BacktrackClassDef, InputClassDef, LookaheadClassDef;\n    FT_UInt            ChainClassSetCount;\n    OTV_Validate_Func  func;\n\n\n    OTV_ENTER;\n\n    p += 2;     /* skip Format */\n\n    OTV_LIMIT_CHECK( 10 );\n    Coverage           = FT_NEXT_USHORT( p );\n    BacktrackClassDef  = FT_NEXT_USHORT( p );\n    InputClassDef      = FT_NEXT_USHORT( p );\n    LookaheadClassDef  = FT_NEXT_USHORT( p );\n    ChainClassSetCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (ChainClassSetCount = %d)\\n\", ChainClassSetCount ));\n\n    otv_Coverage_validate( table + Coverage, valid, -1 );\n\n    otv_ClassDef_validate( table + BacktrackClassDef,  valid );\n    otv_ClassDef_validate( table + InputClassDef, valid );\n    otv_ClassDef_validate( table + LookaheadClassDef, valid );\n\n    OTV_LIMIT_CHECK( ChainClassSetCount * 2 );\n\n    valid->nesting_level++;\n    func          = valid->func[valid->nesting_level];\n    valid->extra1 = valid->lookup_count;\n\n    for ( ; ChainClassSetCount > 0; ChainClassSetCount-- )\n    {\n      FT_UInt  offset = FT_NEXT_USHORT( p );\n\n\n      if ( offset )\n        func( table + offset, valid );\n    }\n\n    valid->nesting_level--;\n\n    OTV_EXIT;\n  }\n\n\n  /* uses valid->lookup_count */\n\n  FT_LOCAL_DEF( void )\n  otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes       table,\n                             OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   BacktrackGlyphCount, InputGlyphCount, LookaheadGlyphCount;\n    FT_UInt   count1, count2;\n\n\n    OTV_ENTER;\n\n    p += 2;     /* skip Format */\n\n    OTV_LIMIT_CHECK( 2 );\n    BacktrackGlyphCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (BacktrackGlyphCount = %d)\\n\", BacktrackGlyphCount ));\n\n    OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 );\n\n    for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- )\n      otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );\n\n    InputGlyphCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (InputGlyphCount = %d)\\n\", InputGlyphCount ));\n\n    OTV_LIMIT_CHECK( InputGlyphCount * 2 + 2 );\n\n    for ( count1 = InputGlyphCount; count1 > 0; count1-- )\n      otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );\n\n    LookaheadGlyphCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (LookaheadGlyphCount = %d)\\n\", LookaheadGlyphCount ));\n\n    OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 );\n\n    for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- )\n      otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );\n\n    count2 = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (Count = %d)\\n\", count2 ));\n\n    OTV_LIMIT_CHECK( count2 * 4 );\n\n    for ( ; count2 > 0; count2-- )\n    {\n      if ( FT_NEXT_USHORT( p ) >= InputGlyphCount )\n        FT_INVALID_DATA;\n\n      if ( FT_NEXT_USHORT( p ) >= valid->lookup_count )\n        FT_INVALID_DATA;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  otv_GSUBGPOS_get_Lookup_count( FT_Bytes  table )\n  {\n    FT_Bytes  p = table + 8;\n\n\n    return otv_LookupList_get_count( table + FT_NEXT_USHORT( p ) );\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes  table )\n  {\n    FT_Bytes  p, lookup;\n    FT_UInt   count;\n\n\n    if ( !table )\n      return 0;\n\n    /* LookupList */\n    p      = table + 8;\n    table += FT_NEXT_USHORT( p );\n\n    /* LookupCount */\n    p     = table;\n    count = FT_NEXT_USHORT( p );\n\n    for ( ; count > 0; count-- )\n    {\n      FT_Bytes  oldp;\n\n\n      /* Lookup */\n      lookup = table + FT_NEXT_USHORT( p );\n\n      oldp = p;\n\n      /* LookupFlag */\n      p = lookup + 2;\n      if ( FT_NEXT_USHORT( p ) & 0xFF00U )\n        return 1;\n\n      p = oldp;\n    }\n\n    return 0;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvcommn.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvcommn.h                                                             */\n/*                                                                         */\n/*    OpenType common tables validation (specification).                   */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2007, 2009 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __OTVCOMMN_H__\n#define __OTVCOMMN_H__\n\n\n#include <ft2build.h>\n#include \"otvalid.h\"\n#include FT_INTERNAL_DEBUG_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         VALIDATION                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct OTV_ValidatorRec_*  OTV_Validator;\n\n  typedef void  (*OTV_Validate_Func)( FT_Bytes       table,\n                                      OTV_Validator  valid );\n\n  typedef struct  OTV_ValidatorRec_\n  {\n    FT_Validator        root;\n    FT_UInt             type_count;\n    OTV_Validate_Func*  type_funcs;\n\n    FT_UInt             lookup_count;\n    FT_UInt             glyph_count;\n\n    FT_UInt             nesting_level;\n\n    OTV_Validate_Func   func[3];\n\n    FT_UInt             extra1;     /* for passing parameters */\n    FT_UInt             extra2;\n    FT_Bytes            extra3;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    FT_UInt             debug_indent;\n    const FT_String*    debug_function_name[3];\n#endif\n\n  } OTV_ValidatorRec;\n\n\n#undef  FT_INVALID_\n#define FT_INVALID_( _prefix, _error )                         \\\n          ft_validator_error( valid->root, _prefix ## _error )\n\n#define OTV_OPTIONAL_TABLE( _table )  FT_UShort  _table;      \\\n                                      FT_Bytes   _table ## _p\n\n#define OTV_OPTIONAL_OFFSET( _offset )           \\\n          FT_BEGIN_STMNT                         \\\n            _offset ## _p = p;                   \\\n            _offset       = FT_NEXT_USHORT( p ); \\\n          FT_END_STMNT\n\n#define OTV_LIMIT_CHECK( _count )                    \\\n          FT_BEGIN_STMNT                             \\\n            if ( p + (_count) > valid->root->limit ) \\\n              FT_INVALID_TOO_SHORT;                  \\\n          FT_END_STMNT\n\n#define OTV_SIZE_CHECK( _size )                                     \\\n          FT_BEGIN_STMNT                                            \\\n            if ( _size > 0 && _size < table_size )                  \\\n            {                                                       \\\n              if ( valid->root->level == FT_VALIDATE_PARANOID )     \\\n                FT_INVALID_OFFSET;                                  \\\n              else                                                  \\\n              {                                                     \\\n                /* strip off `const' */                             \\\n                FT_Byte*  pp = (FT_Byte*)_size ## _p;               \\\n                                                                    \\\n                                                                    \\\n                FT_TRACE3(( \"\\n\"                                    \\\n                            \"Invalid offset to optional table `%s'\" \\\n                            \" set to zero.\\n\"                       \\\n                            \"\\n\", #_size ));                        \\\n                                                                    \\\n                /* always assume 16bit entities */                  \\\n                _size = pp[0] = pp[1] = 0;                          \\\n              }                                                     \\\n            }                                                       \\\n          FT_END_STMNT\n\n\n#define  OTV_NAME_(x)  #x\n#define  OTV_NAME(x)   OTV_NAME_(x)\n\n#define  OTV_FUNC_(x)  x##Func\n#define  OTV_FUNC(x)   OTV_FUNC_(x)\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n#define OTV_NEST1( x )                                     \\\n          FT_BEGIN_STMNT                                   \\\n            valid->nesting_level          = 0;             \\\n            valid->func[0]                = OTV_FUNC( x ); \\\n            valid->debug_function_name[0] = OTV_NAME( x ); \\\n          FT_END_STMNT\n\n#define OTV_NEST2( x, y )                                  \\\n          FT_BEGIN_STMNT                                   \\\n            valid->nesting_level          = 0;             \\\n            valid->func[0]                = OTV_FUNC( x ); \\\n            valid->func[1]                = OTV_FUNC( y ); \\\n            valid->debug_function_name[0] = OTV_NAME( x ); \\\n            valid->debug_function_name[1] = OTV_NAME( y ); \\\n          FT_END_STMNT\n\n#define OTV_NEST3( x, y, z )                               \\\n          FT_BEGIN_STMNT                                   \\\n            valid->nesting_level          = 0;             \\\n            valid->func[0]                = OTV_FUNC( x ); \\\n            valid->func[1]                = OTV_FUNC( y ); \\\n            valid->func[2]                = OTV_FUNC( z ); \\\n            valid->debug_function_name[0] = OTV_NAME( x ); \\\n            valid->debug_function_name[1] = OTV_NAME( y ); \\\n            valid->debug_function_name[2] = OTV_NAME( z ); \\\n          FT_END_STMNT\n\n#define OTV_INIT  valid->debug_indent = 0\n\n#define OTV_ENTER                                                            \\\n          FT_BEGIN_STMNT                                                     \\\n            valid->debug_indent += 2;                                        \\\n            FT_TRACE4(( \"%*.s\", valid->debug_indent, 0 ));                   \\\n            FT_TRACE4(( \"%s table\\n\",                                        \\\n                        valid->debug_function_name[valid->nesting_level] )); \\\n          FT_END_STMNT\n\n#define OTV_NAME_ENTER( name )                             \\\n          FT_BEGIN_STMNT                                   \\\n            valid->debug_indent += 2;                      \\\n            FT_TRACE4(( \"%*.s\", valid->debug_indent, 0 )); \\\n            FT_TRACE4(( \"%s table\\n\", name ));             \\\n          FT_END_STMNT\n\n#define OTV_EXIT  valid->debug_indent -= 2\n\n#define OTV_TRACE( s )                                     \\\n          FT_BEGIN_STMNT                                   \\\n            FT_TRACE4(( \"%*.s\", valid->debug_indent, 0 )); \\\n            FT_TRACE4( s );                                \\\n          FT_END_STMNT\n\n#else   /* !FT_DEBUG_LEVEL_TRACE */\n\n#define OTV_NEST1( x )                            \\\n          FT_BEGIN_STMNT                          \\\n            valid->nesting_level = 0;             \\\n            valid->func[0]       = OTV_FUNC( x ); \\\n          FT_END_STMNT\n\n#define OTV_NEST2( x, y )                         \\\n          FT_BEGIN_STMNT                          \\\n            valid->nesting_level = 0;             \\\n            valid->func[0]       = OTV_FUNC( x ); \\\n            valid->func[1]       = OTV_FUNC( y ); \\\n          FT_END_STMNT\n\n#define OTV_NEST3( x, y, z )                      \\\n          FT_BEGIN_STMNT                          \\\n            valid->nesting_level = 0;             \\\n            valid->func[0]       = OTV_FUNC( x ); \\\n            valid->func[1]       = OTV_FUNC( y ); \\\n            valid->func[2]       = OTV_FUNC( z ); \\\n          FT_END_STMNT\n\n#define OTV_INIT                do { } while ( 0 )\n#define OTV_ENTER               do { } while ( 0 )\n#define OTV_NAME_ENTER( name )  do { } while ( 0 )\n#define OTV_EXIT                do { } while ( 0 )\n\n#define OTV_TRACE( s )          do { } while ( 0 )\n\n#endif  /* !FT_DEBUG_LEVEL_TRACE */\n\n\n#define OTV_RUN  valid->func[0]\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       COVERAGE TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  otv_Coverage_validate( FT_Bytes       table,\n                         OTV_Validator  valid,\n                         FT_Int         expected_count );\n\n  /* return first covered glyph */\n  FT_LOCAL( FT_UInt )\n  otv_Coverage_get_first( FT_Bytes  table );\n\n  /* return last covered glyph */\n  FT_LOCAL( FT_UInt )\n  otv_Coverage_get_last( FT_Bytes  table );\n\n  /* return number of covered glyphs */\n  FT_LOCAL( FT_UInt )\n  otv_Coverage_get_count( FT_Bytes  table );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  CLASS DEFINITION TABLE                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  otv_ClassDef_validate( FT_Bytes       table,\n                         OTV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      DEVICE TABLE                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  otv_Device_validate( FT_Bytes       table,\n                       OTV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           LOOKUPS                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  otv_Lookup_validate( FT_Bytes       table,\n                       OTV_Validator  valid );\n\n  FT_LOCAL( void )\n  otv_LookupList_validate( FT_Bytes       table,\n                           OTV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        FEATURES                               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  otv_Feature_validate( FT_Bytes       table,\n                        OTV_Validator  valid );\n\n  /* lookups must already be validated */\n  FT_LOCAL( void )\n  otv_FeatureList_validate( FT_Bytes       table,\n                            FT_Bytes       lookups,\n                            OTV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       LANGUAGE SYSTEM                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  otv_LangSys_validate( FT_Bytes       table,\n                        OTV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           SCRIPTS                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  otv_Script_validate( FT_Bytes       table,\n                       OTV_Validator  valid );\n\n  /* features must already be validated */\n  FT_LOCAL( void )\n  otv_ScriptList_validate( FT_Bytes       table,\n                           FT_Bytes       features,\n                           OTV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define ChainPosClassSetFunc  otv_x_Ox\n#define ChainPosRuleSetFunc   otv_x_Ox\n#define ChainSubClassSetFunc  otv_x_Ox\n#define ChainSubRuleSetFunc   otv_x_Ox\n#define JstfLangSysFunc       otv_x_Ox\n#define JstfMaxFunc           otv_x_Ox\n#define LigGlyphFunc          otv_x_Ox\n#define LigatureArrayFunc     otv_x_Ox\n#define LigatureSetFunc       otv_x_Ox\n#define PosClassSetFunc       otv_x_Ox\n#define PosRuleSetFunc        otv_x_Ox\n#define SubClassSetFunc       otv_x_Ox\n#define SubRuleSetFunc        otv_x_Ox\n\n  FT_LOCAL( void )\n  otv_x_Ox ( FT_Bytes       table,\n             OTV_Validator  valid );\n\n#define AlternateSubstFormat1Func     otv_u_C_x_Ox\n#define ChainContextPosFormat1Func    otv_u_C_x_Ox\n#define ChainContextSubstFormat1Func  otv_u_C_x_Ox\n#define ContextPosFormat1Func         otv_u_C_x_Ox\n#define ContextSubstFormat1Func       otv_u_C_x_Ox\n#define LigatureSubstFormat1Func      otv_u_C_x_Ox\n#define MultipleSubstFormat1Func      otv_u_C_x_Ox\n\n  FT_LOCAL( void )\n  otv_u_C_x_Ox( FT_Bytes       table,\n                OTV_Validator  valid );\n\n#define AlternateSetFunc     otv_x_ux\n#define AttachPointFunc      otv_x_ux\n#define ExtenderGlyphFunc    otv_x_ux\n#define JstfGPOSModListFunc  otv_x_ux\n#define JstfGSUBModListFunc  otv_x_ux\n#define SequenceFunc         otv_x_ux\n\n  FT_LOCAL( void )\n  otv_x_ux( FT_Bytes       table,\n            OTV_Validator  valid );\n\n#define PosClassRuleFunc  otv_x_y_ux_sy\n#define PosRuleFunc       otv_x_y_ux_sy\n#define SubClassRuleFunc  otv_x_y_ux_sy\n#define SubRuleFunc       otv_x_y_ux_sy\n\n  FT_LOCAL( void )\n  otv_x_y_ux_sy( FT_Bytes       table,\n                 OTV_Validator  valid );\n\n#define ChainPosClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp\n#define ChainPosRuleFunc       otv_x_ux_y_uy_z_uz_p_sp\n#define ChainSubClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp\n#define ChainSubRuleFunc       otv_x_ux_y_uy_z_uz_p_sp\n\n  FT_LOCAL( void )\n  otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes       table,\n                           OTV_Validator  valid );\n\n#define ContextPosFormat2Func    otv_u_O_O_x_Onx\n#define ContextSubstFormat2Func  otv_u_O_O_x_Onx\n\n  FT_LOCAL( void )\n  otv_u_O_O_x_Onx( FT_Bytes       table,\n                   OTV_Validator  valid );\n\n#define ContextPosFormat3Func    otv_u_x_y_Ox_sy\n#define ContextSubstFormat3Func  otv_u_x_y_Ox_sy\n\n  FT_LOCAL( void )\n  otv_u_x_y_Ox_sy( FT_Bytes       table,\n                   OTV_Validator  valid );\n\n#define ChainContextPosFormat2Func    otv_u_O_O_O_O_x_Onx\n#define ChainContextSubstFormat2Func  otv_u_O_O_O_O_x_Onx\n\n  FT_LOCAL( void )\n  otv_u_O_O_O_O_x_Onx( FT_Bytes       table,\n                       OTV_Validator  valid );\n\n#define ChainContextPosFormat3Func    otv_u_x_Ox_y_Oy_z_Oz_p_sp\n#define ChainContextSubstFormat3Func  otv_u_x_Ox_y_Oy_z_Oz_p_sp\n\n  FT_LOCAL( void )\n  otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes       table,\n                             OTV_Validator  valid );\n\n\n  FT_LOCAL( FT_UInt )\n  otv_GSUBGPOS_get_Lookup_count( FT_Bytes  table );\n\n  FT_LOCAL( FT_UInt )\n  otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes  table );\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __OTVCOMMN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otverror.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otverror.h                                                             */\n/*                                                                         */\n/*    OpenType validation module error codes (specification only).         */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2012, 2013 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the OpenType validation module error      */\n  /* enumeration constants.                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __OTVERROR_H__\n#define __OTVERROR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  OTV_Err_\n#define FT_ERR_BASE    FT_Mod_Err_OTvalid\n\n#include FT_ERRORS_H\n\n#endif /* __OTVERROR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvgdef.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvgdef.c                                                              */\n/*                                                                         */\n/*    OpenType GDEF table validation (body).                               */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2007 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"otvalid.h\"\n#include \"otvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_otvgdef\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define AttachListFunc    otv_O_x_Ox\n#define LigCaretListFunc  otv_O_x_Ox\n\n  /* sets valid->extra1 (0)           */\n\n  static void\n  otv_O_x_Ox( FT_Bytes       table,\n              OTV_Validator  valid )\n  {\n    FT_Bytes           p = table;\n    FT_Bytes           Coverage;\n    FT_UInt            GlyphCount;\n    OTV_Validate_Func  func;\n\n\n    OTV_ENTER;\n\n    OTV_LIMIT_CHECK( 4 );\n    Coverage   = table + FT_NEXT_USHORT( p );\n    GlyphCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (GlyphCount = %d)\\n\", GlyphCount ));\n\n    otv_Coverage_validate( Coverage, valid, GlyphCount );\n    if ( GlyphCount != otv_Coverage_get_count( Coverage ) )\n      FT_INVALID_DATA;\n\n    OTV_LIMIT_CHECK( GlyphCount * 2 );\n\n    valid->nesting_level++;\n    func          = valid->func[valid->nesting_level];\n    valid->extra1 = 0;\n\n    for ( ; GlyphCount > 0; GlyphCount-- )\n      func( table + FT_NEXT_USHORT( p ), valid );\n\n    valid->nesting_level--;\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       LIGATURE CARETS                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define CaretValueFunc  otv_CaretValue_validate\n\n  static void\n  otv_CaretValue_validate( FT_Bytes       table,\n                           OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   CaretValueFormat;\n\n\n    OTV_ENTER;\n\n    OTV_LIMIT_CHECK( 4 );\n\n    CaretValueFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format = %d)\\n\", CaretValueFormat ));\n\n    switch ( CaretValueFormat )\n    {\n    case 1:     /* CaretValueFormat1 */\n      /* skip Coordinate, no test */\n      break;\n\n    case 2:     /* CaretValueFormat2 */\n      /* skip CaretValuePoint, no test */\n      break;\n\n    case 3:     /* CaretValueFormat3 */\n      p += 2;   /* skip Coordinate */\n\n      OTV_LIMIT_CHECK( 2 );\n\n      /* DeviceTable */\n      otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         GDEF TABLE                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->glyph_count */\n\n  FT_LOCAL_DEF( void )\n  otv_GDEF_validate( FT_Bytes      table,\n                     FT_Bytes      gsub,\n                     FT_Bytes      gpos,\n                     FT_UInt       glyph_count,\n                     FT_Validator  ftvalid )\n  {\n    OTV_ValidatorRec  validrec;\n    OTV_Validator     valid = &validrec;\n    FT_Bytes          p     = table;\n    FT_UInt           table_size;\n    FT_Bool           need_MarkAttachClassDef;\n\n    OTV_OPTIONAL_TABLE( GlyphClassDef );\n    OTV_OPTIONAL_TABLE( AttachListOffset );\n    OTV_OPTIONAL_TABLE( LigCaretListOffset );\n    OTV_OPTIONAL_TABLE( MarkAttachClassDef );\n\n\n    valid->root = ftvalid;\n\n    FT_TRACE3(( \"validating GDEF table\\n\" ));\n    OTV_INIT;\n\n    OTV_LIMIT_CHECK( 12 );\n\n    if ( FT_NEXT_ULONG( p ) != 0x10000UL )          /* Version */\n      FT_INVALID_FORMAT;\n\n    /* MarkAttachClassDef has been added to the OpenType */\n    /* specification without increasing GDEF's version,  */\n    /* so we use this ugly hack to find out whether the  */\n    /* table is needed actually.                         */\n\n    need_MarkAttachClassDef = FT_BOOL(\n      otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||\n      otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );\n\n    if ( need_MarkAttachClassDef )\n      table_size = 12;              /* OpenType >= 1.2 */\n    else\n      table_size = 10;              /* OpenType < 1.2  */\n\n    valid->glyph_count = glyph_count;\n\n    OTV_OPTIONAL_OFFSET( GlyphClassDef );\n    OTV_SIZE_CHECK( GlyphClassDef );\n    if ( GlyphClassDef )\n      otv_ClassDef_validate( table + GlyphClassDef, valid );\n\n    OTV_OPTIONAL_OFFSET( AttachListOffset );\n    OTV_SIZE_CHECK( AttachListOffset );\n    if ( AttachListOffset )\n    {\n      OTV_NEST2( AttachList, AttachPoint );\n      OTV_RUN( table + AttachListOffset, valid );\n    }\n\n    OTV_OPTIONAL_OFFSET( LigCaretListOffset );\n    OTV_SIZE_CHECK( LigCaretListOffset );\n    if ( LigCaretListOffset )\n    {\n      OTV_NEST3( LigCaretList, LigGlyph, CaretValue );\n      OTV_RUN( table + LigCaretListOffset, valid );\n    }\n\n    if ( need_MarkAttachClassDef )\n    {\n      OTV_OPTIONAL_OFFSET( MarkAttachClassDef );\n      OTV_SIZE_CHECK( MarkAttachClassDef );\n      if ( MarkAttachClassDef )\n        otv_ClassDef_validate( table + MarkAttachClassDef, valid );\n    }\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvgpos.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvgpos.c                                                              */\n/*                                                                         */\n/*    OpenType GPOS table validation (body).                               */\n/*                                                                         */\n/*  Copyright 2002, 2004, 2005, 2006, 2007, 2008 by                        */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"otvalid.h\"\n#include \"otvcommn.h\"\n#include \"otvgpos.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_otvgpos\n\n\n  static void\n  otv_Anchor_validate( FT_Bytes       table,\n                       OTV_Validator  valid );\n\n  static void\n  otv_MarkArray_validate( FT_Bytes       table,\n                          OTV_Validator  valid );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      UTILITY FUNCTIONS                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define BaseArrayFunc       otv_x_sxy\n#define LigatureAttachFunc  otv_x_sxy\n#define Mark2ArrayFunc      otv_x_sxy\n\n  /* uses valid->extra1 (counter)                             */\n  /* uses valid->extra2 (boolean to handle NULL anchor field) */\n\n  static void\n  otv_x_sxy( FT_Bytes       table,\n             OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   Count, count1, table_size;\n\n\n    OTV_ENTER;\n\n    OTV_LIMIT_CHECK( 2 );\n\n    Count = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (Count = %d)\\n\", Count ));\n\n    OTV_LIMIT_CHECK( Count * valid->extra1 * 2 );\n\n    table_size = Count * valid->extra1 * 2 + 2;\n\n    for ( ; Count > 0; Count-- )\n      for ( count1 = valid->extra1; count1 > 0; count1-- )\n      {\n        OTV_OPTIONAL_TABLE( anchor_offset );\n\n\n        OTV_OPTIONAL_OFFSET( anchor_offset );\n\n        if ( valid->extra2 )\n        {\n          OTV_SIZE_CHECK( anchor_offset );\n          if ( anchor_offset )\n            otv_Anchor_validate( table + anchor_offset, valid );\n        }\n        else\n          otv_Anchor_validate( table + anchor_offset, valid );\n      }\n\n    OTV_EXIT;\n  }\n\n\n#define MarkBasePosFormat1Func  otv_u_O_O_u_O_O\n#define MarkLigPosFormat1Func   otv_u_O_O_u_O_O\n#define MarkMarkPosFormat1Func  otv_u_O_O_u_O_O\n\n  /* sets valid->extra1 (class count) */\n\n  static void\n  otv_u_O_O_u_O_O( FT_Bytes       table,\n                   OTV_Validator  valid )\n  {\n    FT_Bytes           p = table;\n    FT_UInt            Coverage1, Coverage2, ClassCount;\n    FT_UInt            Array1, Array2;\n    OTV_Validate_Func  func;\n\n\n    OTV_ENTER;\n\n    p += 2;     /* skip PosFormat */\n\n    OTV_LIMIT_CHECK( 10 );\n    Coverage1  = FT_NEXT_USHORT( p );\n    Coverage2  = FT_NEXT_USHORT( p );\n    ClassCount = FT_NEXT_USHORT( p );\n    Array1     = FT_NEXT_USHORT( p );\n    Array2     = FT_NEXT_USHORT( p );\n\n    otv_Coverage_validate( table + Coverage1, valid, -1 );\n    otv_Coverage_validate( table + Coverage2, valid, -1 );\n\n    otv_MarkArray_validate( table + Array1, valid );\n\n    valid->nesting_level++;\n    func          = valid->func[valid->nesting_level];\n    valid->extra1 = ClassCount;\n\n    func( table + Array2, valid );\n\n    valid->nesting_level--;\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        VALUE RECORDS                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_UInt\n  otv_value_length( FT_UInt  format )\n  {\n    FT_UInt  count;\n\n\n    count = ( ( format & 0xAA ) >> 1 ) + ( format & 0x55 );\n    count = ( ( count  & 0xCC ) >> 2 ) + ( count  & 0x33 );\n    count = ( ( count  & 0xF0 ) >> 4 ) + ( count  & 0x0F );\n\n    return count * 2;\n  }\n\n\n  /* uses valid->extra3 (pointer to base table) */\n\n  static void\n  otv_ValueRecord_validate( FT_Bytes       table,\n                            FT_UInt        format,\n                            OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   count;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    FT_Int    loop;\n    FT_ULong  res = 0;\n\n\n    OTV_NAME_ENTER( \"ValueRecord\" );\n\n    /* display `format' in dual representation */\n    for ( loop = 7; loop >= 0; loop-- )\n    {\n      res <<= 4;\n      res  += ( format >> loop ) & 1;\n    }\n\n    OTV_TRACE(( \" (format 0b%08lx)\\n\", res ));\n#endif\n\n    if ( format >= 0x100 )\n      FT_INVALID_FORMAT;\n\n    for ( count = 4; count > 0; count-- )\n    {\n      if ( format & 1 )\n      {\n        /* XPlacement, YPlacement, XAdvance, YAdvance */\n        OTV_LIMIT_CHECK( 2 );\n        p += 2;\n      }\n\n      format >>= 1;\n    }\n\n    for ( count = 4; count > 0; count-- )\n    {\n      if ( format & 1 )\n      {\n        FT_PtrDist  table_size;\n\n        OTV_OPTIONAL_TABLE( device );\n\n\n        /* XPlaDevice, YPlaDevice, XAdvDevice, YAdvDevice */\n        OTV_LIMIT_CHECK( 2 );\n        OTV_OPTIONAL_OFFSET( device );\n\n        /* XXX: this value is usually too small, especially if the current */\n        /* ValueRecord is part of an array -- getting the correct table    */\n        /* size is probably not worth the trouble                          */\n\n        table_size = p - valid->extra3;\n\n        OTV_SIZE_CHECK( device );\n        if ( device )\n          otv_Device_validate( valid->extra3 + device, valid );\n      }\n      format >>= 1;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           ANCHORS                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  otv_Anchor_validate( FT_Bytes       table,\n                       OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   AnchorFormat;\n\n\n    OTV_NAME_ENTER( \"Anchor\");\n\n    OTV_LIMIT_CHECK( 6 );\n    AnchorFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", AnchorFormat ));\n\n    p += 4;     /* skip XCoordinate and YCoordinate */\n\n    switch ( AnchorFormat )\n    {\n    case 1:\n      break;\n\n    case 2:\n      OTV_LIMIT_CHECK( 2 );  /* AnchorPoint */\n      break;\n\n    case 3:\n      {\n        FT_UInt   table_size;\n\n        OTV_OPTIONAL_TABLE( XDeviceTable );\n        OTV_OPTIONAL_TABLE( YDeviceTable );\n\n\n        OTV_LIMIT_CHECK( 4 );\n        OTV_OPTIONAL_OFFSET( XDeviceTable );\n        OTV_OPTIONAL_OFFSET( YDeviceTable );\n\n        table_size = 6 + 4;\n\n        OTV_SIZE_CHECK( XDeviceTable );\n        if ( XDeviceTable )\n          otv_Device_validate( table + XDeviceTable, valid );\n\n        OTV_SIZE_CHECK( YDeviceTable );\n        if ( YDeviceTable )\n          otv_Device_validate( table + YDeviceTable, valid );\n      }\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         MARK ARRAYS                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  otv_MarkArray_validate( FT_Bytes       table,\n                          OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   MarkCount;\n\n\n    OTV_NAME_ENTER( \"MarkArray\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    MarkCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (MarkCount = %d)\\n\", MarkCount ));\n\n    OTV_LIMIT_CHECK( MarkCount * 4 );\n\n    /* MarkRecord */\n    for ( ; MarkCount > 0; MarkCount-- )\n    {\n      p += 2;   /* skip Class */\n      /* MarkAnchor */\n      otv_Anchor_validate( table + FT_NEXT_USHORT( p ), valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GPOS LOOKUP TYPE 1                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->extra3 (pointer to base table) */\n\n  static void\n  otv_SinglePos_validate( FT_Bytes       table,\n                          OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   PosFormat;\n\n\n    OTV_NAME_ENTER( \"SinglePos\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PosFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", PosFormat ));\n\n    valid->extra3 = table;\n\n    switch ( PosFormat )\n    {\n    case 1:     /* SinglePosFormat1 */\n      {\n        FT_UInt  Coverage, ValueFormat;\n\n\n        OTV_LIMIT_CHECK( 4 );\n        Coverage    = FT_NEXT_USHORT( p );\n        ValueFormat = FT_NEXT_USHORT( p );\n\n        otv_Coverage_validate( table + Coverage, valid, -1 );\n        otv_ValueRecord_validate( p, ValueFormat, valid ); /* Value */\n      }\n      break;\n\n    case 2:     /* SinglePosFormat2 */\n      {\n        FT_UInt  Coverage, ValueFormat, ValueCount, len_value;\n\n\n        OTV_LIMIT_CHECK( 6 );\n        Coverage    = FT_NEXT_USHORT( p );\n        ValueFormat = FT_NEXT_USHORT( p );\n        ValueCount  = FT_NEXT_USHORT( p );\n\n        OTV_TRACE(( \" (ValueCount = %d)\\n\", ValueCount ));\n\n        len_value = otv_value_length( ValueFormat );\n\n        otv_Coverage_validate( table + Coverage, valid, ValueCount );\n\n        OTV_LIMIT_CHECK( ValueCount * len_value );\n\n        /* Value */\n        for ( ; ValueCount > 0; ValueCount-- )\n        {\n          otv_ValueRecord_validate( p, ValueFormat, valid );\n          p += len_value;\n        }\n      }\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GPOS LOOKUP TYPE 2                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  otv_PairSet_validate( FT_Bytes       table,\n                        FT_UInt        format1,\n                        FT_UInt        format2,\n                        OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   value_len1, value_len2, PairValueCount;\n\n\n    OTV_NAME_ENTER( \"PairSet\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PairValueCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (PairValueCount = %d)\\n\", PairValueCount ));\n\n    value_len1 = otv_value_length( format1 );\n    value_len2 = otv_value_length( format2 );\n\n    OTV_LIMIT_CHECK( PairValueCount * ( value_len1 + value_len2 + 2 ) );\n\n    /* PairValueRecord */\n    for ( ; PairValueCount > 0; PairValueCount-- )\n    {\n      p += 2;       /* skip SecondGlyph */\n\n      if ( format1 )\n        otv_ValueRecord_validate( p, format1, valid ); /* Value1 */\n      p += value_len1;\n\n      if ( format2 )\n        otv_ValueRecord_validate( p, format2, valid ); /* Value2 */\n      p += value_len2;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /* sets valid->extra3 (pointer to base table) */\n\n  static void\n  otv_PairPos_validate( FT_Bytes       table,\n                        OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   PosFormat;\n\n\n    OTV_NAME_ENTER( \"PairPos\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PosFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", PosFormat ));\n\n    valid->extra3 = table;\n\n    switch ( PosFormat )\n    {\n    case 1:     /* PairPosFormat1 */\n      {\n        FT_UInt  Coverage, ValueFormat1, ValueFormat2, PairSetCount;\n\n\n        OTV_LIMIT_CHECK( 8 );\n        Coverage     = FT_NEXT_USHORT( p );\n        ValueFormat1 = FT_NEXT_USHORT( p );\n        ValueFormat2 = FT_NEXT_USHORT( p );\n        PairSetCount = FT_NEXT_USHORT( p );\n\n        OTV_TRACE(( \" (PairSetCount = %d)\\n\", PairSetCount ));\n\n        otv_Coverage_validate( table + Coverage, valid, -1 );\n\n        OTV_LIMIT_CHECK( PairSetCount * 2 );\n\n        /* PairSetOffset */\n        for ( ; PairSetCount > 0; PairSetCount-- )\n          otv_PairSet_validate( table + FT_NEXT_USHORT( p ),\n                                ValueFormat1, ValueFormat2, valid );\n      }\n      break;\n\n    case 2:     /* PairPosFormat2 */\n      {\n        FT_UInt  Coverage, ValueFormat1, ValueFormat2, ClassDef1, ClassDef2;\n        FT_UInt  ClassCount1, ClassCount2, len_value1, len_value2, count;\n\n\n        OTV_LIMIT_CHECK( 14 );\n        Coverage     = FT_NEXT_USHORT( p );\n        ValueFormat1 = FT_NEXT_USHORT( p );\n        ValueFormat2 = FT_NEXT_USHORT( p );\n        ClassDef1    = FT_NEXT_USHORT( p );\n        ClassDef2    = FT_NEXT_USHORT( p );\n        ClassCount1  = FT_NEXT_USHORT( p );\n        ClassCount2  = FT_NEXT_USHORT( p );\n\n        OTV_TRACE(( \" (ClassCount1 = %d)\\n\", ClassCount1 ));\n        OTV_TRACE(( \" (ClassCount2 = %d)\\n\", ClassCount2 ));\n\n        len_value1 = otv_value_length( ValueFormat1 );\n        len_value2 = otv_value_length( ValueFormat2 );\n\n        otv_Coverage_validate( table + Coverage, valid, -1 );\n        otv_ClassDef_validate( table + ClassDef1, valid );\n        otv_ClassDef_validate( table + ClassDef2, valid );\n\n        OTV_LIMIT_CHECK( ClassCount1 * ClassCount2 *\n                     ( len_value1 + len_value2 ) );\n\n        /* Class1Record */\n        for ( ; ClassCount1 > 0; ClassCount1-- )\n        {\n          /* Class2Record */\n          for ( count = ClassCount2; count > 0; count-- )\n          {\n            if ( ValueFormat1 )\n              /* Value1 */\n              otv_ValueRecord_validate( p, ValueFormat1, valid );\n            p += len_value1;\n\n            if ( ValueFormat2 )\n              /* Value2 */\n              otv_ValueRecord_validate( p, ValueFormat2, valid );\n            p += len_value2;\n          }\n        }\n      }\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GPOS LOOKUP TYPE 3                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  otv_CursivePos_validate( FT_Bytes       table,\n                           OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   PosFormat;\n\n\n    OTV_NAME_ENTER( \"CursivePos\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PosFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", PosFormat ));\n\n    switch ( PosFormat )\n    {\n    case 1:     /* CursivePosFormat1 */\n      {\n        FT_UInt   table_size;\n        FT_UInt   Coverage, EntryExitCount;\n\n        OTV_OPTIONAL_TABLE( EntryAnchor );\n        OTV_OPTIONAL_TABLE( ExitAnchor  );\n\n\n        OTV_LIMIT_CHECK( 4 );\n        Coverage       = FT_NEXT_USHORT( p );\n        EntryExitCount = FT_NEXT_USHORT( p );\n\n        OTV_TRACE(( \" (EntryExitCount = %d)\\n\", EntryExitCount ));\n\n        otv_Coverage_validate( table + Coverage, valid, EntryExitCount );\n\n        OTV_LIMIT_CHECK( EntryExitCount * 4 );\n\n        table_size = EntryExitCount * 4 + 4;\n\n        /* EntryExitRecord */\n        for ( ; EntryExitCount > 0; EntryExitCount-- )\n        {\n          OTV_OPTIONAL_OFFSET( EntryAnchor );\n          OTV_OPTIONAL_OFFSET( ExitAnchor  );\n\n          OTV_SIZE_CHECK( EntryAnchor );\n          if ( EntryAnchor )\n            otv_Anchor_validate( table + EntryAnchor, valid );\n\n          OTV_SIZE_CHECK( ExitAnchor );\n          if ( ExitAnchor )\n            otv_Anchor_validate( table + ExitAnchor, valid );\n        }\n      }\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GPOS LOOKUP TYPE 4                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* UNDOCUMENTED (in OpenType 1.5):              */\n  /* BaseRecord tables can contain NULL pointers. */\n\n  /* sets valid->extra2 (1) */\n\n  static void\n  otv_MarkBasePos_validate( FT_Bytes       table,\n                            OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   PosFormat;\n\n\n    OTV_NAME_ENTER( \"MarkBasePos\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PosFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", PosFormat ));\n\n    switch ( PosFormat )\n    {\n    case 1:\n      valid->extra2 = 1;\n      OTV_NEST2( MarkBasePosFormat1, BaseArray );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GPOS LOOKUP TYPE 5                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->extra2 (1) */\n\n  static void\n  otv_MarkLigPos_validate( FT_Bytes       table,\n                           OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   PosFormat;\n\n\n    OTV_NAME_ENTER( \"MarkLigPos\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PosFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", PosFormat ));\n\n    switch ( PosFormat )\n    {\n    case 1:\n      valid->extra2 = 1;\n      OTV_NEST3( MarkLigPosFormat1, LigatureArray, LigatureAttach );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GPOS LOOKUP TYPE 6                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->extra2 (0) */\n\n  static void\n  otv_MarkMarkPos_validate( FT_Bytes       table,\n                            OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   PosFormat;\n\n\n    OTV_NAME_ENTER( \"MarkMarkPos\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PosFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", PosFormat ));\n\n    switch ( PosFormat )\n    {\n    case 1:\n      valid->extra2 = 0;\n      OTV_NEST2( MarkMarkPosFormat1, Mark2Array );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GPOS LOOKUP TYPE 7                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->extra1 (lookup count) */\n\n  static void\n  otv_ContextPos_validate( FT_Bytes       table,\n                           OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   PosFormat;\n\n\n    OTV_NAME_ENTER( \"ContextPos\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PosFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", PosFormat ));\n\n    switch ( PosFormat )\n    {\n    case 1:\n      /* no need to check glyph indices/classes used as input for these */\n      /* context rules since even invalid glyph indices/classes return  */\n      /* meaningful results                                             */\n\n      valid->extra1 = valid->lookup_count;\n      OTV_NEST3( ContextPosFormat1, PosRuleSet, PosRule );\n      OTV_RUN( table, valid );\n      break;\n\n    case 2:\n      /* no need to check glyph indices/classes used as input for these */\n      /* context rules since even invalid glyph indices/classes return  */\n      /* meaningful results                                             */\n\n      OTV_NEST3( ContextPosFormat2, PosClassSet, PosClassRule );\n      OTV_RUN( table, valid );\n      break;\n\n    case 3:\n      OTV_NEST1( ContextPosFormat3 );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GPOS LOOKUP TYPE 8                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->extra1 (lookup count) */\n\n  static void\n  otv_ChainContextPos_validate( FT_Bytes       table,\n                                OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   PosFormat;\n\n\n    OTV_NAME_ENTER( \"ChainContextPos\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PosFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", PosFormat ));\n\n    switch ( PosFormat )\n    {\n    case 1:\n      /* no need to check glyph indices/classes used as input for these */\n      /* context rules since even invalid glyph indices/classes return  */\n      /* meaningful results                                             */\n\n      valid->extra1 = valid->lookup_count;\n      OTV_NEST3( ChainContextPosFormat1,\n                 ChainPosRuleSet, ChainPosRule );\n      OTV_RUN( table, valid );\n      break;\n\n    case 2:\n      /* no need to check glyph indices/classes used as input for these */\n      /* context rules since even invalid glyph indices/classes return  */\n      /* meaningful results                                             */\n\n      OTV_NEST3( ChainContextPosFormat2,\n                 ChainPosClassSet, ChainPosClassRule );\n      OTV_RUN( table, valid );\n      break;\n\n    case 3:\n      OTV_NEST1( ChainContextPosFormat3 );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GPOS LOOKUP TYPE 9                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* uses valid->type_funcs */\n\n  static void\n  otv_ExtensionPos_validate( FT_Bytes       table,\n                             OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   PosFormat;\n\n\n    OTV_NAME_ENTER( \"ExtensionPos\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    PosFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", PosFormat ));\n\n    switch ( PosFormat )\n    {\n    case 1:     /* ExtensionPosFormat1 */\n      {\n        FT_UInt            ExtensionLookupType;\n        FT_ULong           ExtensionOffset;\n        OTV_Validate_Func  validate;\n\n\n        OTV_LIMIT_CHECK( 6 );\n        ExtensionLookupType = FT_NEXT_USHORT( p );\n        ExtensionOffset     = FT_NEXT_ULONG( p );\n\n        if ( ExtensionLookupType == 0 || ExtensionLookupType >= 9 )\n          FT_INVALID_DATA;\n\n        validate = valid->type_funcs[ExtensionLookupType - 1];\n        validate( table + ExtensionOffset, valid );\n      }\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  static const OTV_Validate_Func  otv_gpos_validate_funcs[9] =\n  {\n    otv_SinglePos_validate,\n    otv_PairPos_validate,\n    otv_CursivePos_validate,\n    otv_MarkBasePos_validate,\n    otv_MarkLigPos_validate,\n    otv_MarkMarkPos_validate,\n    otv_ContextPos_validate,\n    otv_ChainContextPos_validate,\n    otv_ExtensionPos_validate\n  };\n\n\n  /* sets valid->type_count */\n  /* sets valid->type_funcs */\n\n  FT_LOCAL_DEF( void )\n  otv_GPOS_subtable_validate( FT_Bytes       table,\n                              OTV_Validator  valid )\n  {\n    valid->type_count = 9;\n    valid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs;\n\n    otv_Lookup_validate( table, valid );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          GPOS TABLE                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->glyph_count */\n\n  FT_LOCAL_DEF( void )\n  otv_GPOS_validate( FT_Bytes      table,\n                     FT_UInt       glyph_count,\n                     FT_Validator  ftvalid )\n  {\n    OTV_ValidatorRec  validrec;\n    OTV_Validator     valid = &validrec;\n    FT_Bytes          p     = table;\n    FT_UInt           ScriptList, FeatureList, LookupList;\n\n\n    valid->root = ftvalid;\n\n    FT_TRACE3(( \"validating GPOS table\\n\" ));\n    OTV_INIT;\n\n    OTV_LIMIT_CHECK( 10 );\n\n    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */\n      FT_INVALID_FORMAT;\n\n    ScriptList  = FT_NEXT_USHORT( p );\n    FeatureList = FT_NEXT_USHORT( p );\n    LookupList  = FT_NEXT_USHORT( p );\n\n    valid->type_count  = 9;\n    valid->type_funcs  = (OTV_Validate_Func*)otv_gpos_validate_funcs;\n    valid->glyph_count = glyph_count;\n\n    otv_LookupList_validate( table + LookupList,\n                             valid );\n    otv_FeatureList_validate( table + FeatureList, table + LookupList,\n                              valid );\n    otv_ScriptList_validate( table + ScriptList, table + FeatureList,\n                             valid );\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvgpos.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvgpos.h                                                              */\n/*                                                                         */\n/*    OpenType GPOS table validator (specification).                       */\n/*                                                                         */\n/*  Copyright 2004 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __OTVGPOS_H__\n#define __OTVGPOS_H__\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  otv_GPOS_subtable_validate( FT_Bytes       table,\n                              OTV_Validator  valid );\n\n\nFT_END_HEADER\n\n#endif /* __OTVGPOS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvgsub.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvgsub.c                                                              */\n/*                                                                         */\n/*    OpenType GSUB table validation (body).                               */\n/*                                                                         */\n/*  Copyright 2004, 2005, 2007 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"otvalid.h\"\n#include \"otvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_otvgsub\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  GSUB LOOKUP TYPE 1                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* uses valid->glyph_count */\n\n  static void\n  otv_SingleSubst_validate( FT_Bytes       table,\n                            OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   SubstFormat;\n\n\n    OTV_NAME_ENTER( \"SingleSubst\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    SubstFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", SubstFormat ));\n\n    switch ( SubstFormat )\n    {\n    case 1:     /* SingleSubstFormat1 */\n      {\n        FT_Bytes  Coverage;\n        FT_Int    DeltaGlyphID;\n        FT_Long   idx;\n\n\n        OTV_LIMIT_CHECK( 4 );\n        Coverage     = table + FT_NEXT_USHORT( p );\n        DeltaGlyphID = FT_NEXT_SHORT( p );\n\n        otv_Coverage_validate( Coverage, valid, -1 );\n\n        idx = otv_Coverage_get_first( Coverage ) + DeltaGlyphID;\n        if ( idx < 0 )\n          FT_INVALID_DATA;\n\n        idx = otv_Coverage_get_last( Coverage ) + DeltaGlyphID;\n        if ( (FT_UInt)idx >= valid->glyph_count )\n          FT_INVALID_DATA;\n      }\n      break;\n\n    case 2:     /* SingleSubstFormat2 */\n      {\n        FT_UInt  Coverage, GlyphCount;\n\n\n        OTV_LIMIT_CHECK( 4 );\n        Coverage   = FT_NEXT_USHORT( p );\n        GlyphCount = FT_NEXT_USHORT( p );\n\n        OTV_TRACE(( \" (GlyphCount = %d)\\n\", GlyphCount ));\n\n        otv_Coverage_validate( table + Coverage, valid, GlyphCount );\n\n        OTV_LIMIT_CHECK( GlyphCount * 2 );\n\n        /* Substitute */\n        for ( ; GlyphCount > 0; GlyphCount-- )\n          if ( FT_NEXT_USHORT( p ) >= valid->glyph_count )\n            FT_INVALID_GLYPH_ID;\n      }\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  GSUB LOOKUP TYPE 2                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->extra1 (glyph count) */\n\n  static void\n  otv_MultipleSubst_validate( FT_Bytes       table,\n                              OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   SubstFormat;\n\n\n    OTV_NAME_ENTER( \"MultipleSubst\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    SubstFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", SubstFormat ));\n\n    switch ( SubstFormat )\n    {\n    case 1:\n      valid->extra1 = valid->glyph_count;\n      OTV_NEST2( MultipleSubstFormat1, Sequence );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    GSUB LOOKUP TYPE 3                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->extra1 (glyph count) */\n\n  static void\n  otv_AlternateSubst_validate( FT_Bytes       table,\n                               OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   SubstFormat;\n\n\n    OTV_NAME_ENTER( \"AlternateSubst\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    SubstFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", SubstFormat ));\n\n    switch ( SubstFormat )\n    {\n    case 1:\n      valid->extra1 = valid->glyph_count;\n      OTV_NEST2( AlternateSubstFormat1, AlternateSet );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    GSUB LOOKUP TYPE 4                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define LigatureFunc  otv_Ligature_validate\n\n  /* uses valid->glyph_count */\n\n  static void\n  otv_Ligature_validate( FT_Bytes       table,\n                         OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   LigatureGlyph, CompCount;\n\n\n    OTV_ENTER;\n\n    OTV_LIMIT_CHECK( 4 );\n    LigatureGlyph = FT_NEXT_USHORT( p );\n    if ( LigatureGlyph >= valid->glyph_count )\n      FT_INVALID_DATA;\n\n    CompCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (CompCount = %d)\\n\", CompCount ));\n\n    if ( CompCount == 0 )\n      FT_INVALID_DATA;\n\n    CompCount--;\n\n    OTV_LIMIT_CHECK( CompCount * 2 );     /* Component */\n\n    /* no need to check the Component glyph indices */\n\n    OTV_EXIT;\n  }\n\n\n  static void\n  otv_LigatureSubst_validate( FT_Bytes       table,\n                              OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   SubstFormat;\n\n\n    OTV_NAME_ENTER( \"LigatureSubst\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    SubstFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", SubstFormat ));\n\n    switch ( SubstFormat )\n    {\n    case 1:\n      OTV_NEST3( LigatureSubstFormat1, LigatureSet, Ligature );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  GSUB LOOKUP TYPE 5                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->extra1 (lookup count) */\n\n  static void\n  otv_ContextSubst_validate( FT_Bytes       table,\n                             OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   SubstFormat;\n\n\n    OTV_NAME_ENTER( \"ContextSubst\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    SubstFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", SubstFormat ));\n\n    switch ( SubstFormat )\n    {\n    case 1:\n      /* no need to check glyph indices/classes used as input for these */\n      /* context rules since even invalid glyph indices/classes return  */\n      /* meaningful results                                             */\n\n      valid->extra1 = valid->lookup_count;\n      OTV_NEST3( ContextSubstFormat1, SubRuleSet, SubRule );\n      OTV_RUN( table, valid );\n      break;\n\n    case 2:\n      /* no need to check glyph indices/classes used as input for these */\n      /* context rules since even invalid glyph indices/classes return  */\n      /* meaningful results                                             */\n\n      OTV_NEST3( ContextSubstFormat2, SubClassSet, SubClassRule );\n      OTV_RUN( table, valid );\n      break;\n\n    case 3:\n      OTV_NEST1( ContextSubstFormat3 );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    GSUB LOOKUP TYPE 6                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->extra1 (lookup count)            */\n\n  static void\n  otv_ChainContextSubst_validate( FT_Bytes       table,\n                                  OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   SubstFormat;\n\n\n    OTV_NAME_ENTER( \"ChainContextSubst\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    SubstFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", SubstFormat ));\n\n    switch ( SubstFormat )\n    {\n    case 1:\n      /* no need to check glyph indices/classes used as input for these */\n      /* context rules since even invalid glyph indices/classes return  */\n      /* meaningful results                                             */\n\n      valid->extra1 = valid->lookup_count;\n      OTV_NEST3( ChainContextSubstFormat1,\n                 ChainSubRuleSet, ChainSubRule );\n      OTV_RUN( table, valid );\n      break;\n\n    case 2:\n      /* no need to check glyph indices/classes used as input for these */\n      /* context rules since even invalid glyph indices/classes return  */\n      /* meaningful results                                             */\n\n      OTV_NEST3( ChainContextSubstFormat2,\n                 ChainSubClassSet, ChainSubClassRule );\n      OTV_RUN( table, valid );\n      break;\n\n    case 3:\n      OTV_NEST1( ChainContextSubstFormat3 );\n      OTV_RUN( table, valid );\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    GSUB LOOKUP TYPE 7                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* uses valid->type_funcs */\n\n  static void\n  otv_ExtensionSubst_validate( FT_Bytes       table,\n                               OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   SubstFormat;\n\n\n    OTV_NAME_ENTER( \"ExtensionSubst\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    SubstFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", SubstFormat ));\n\n    switch ( SubstFormat )\n    {\n    case 1:     /* ExtensionSubstFormat1 */\n      {\n        FT_UInt            ExtensionLookupType;\n        FT_ULong           ExtensionOffset;\n        OTV_Validate_Func  validate;\n\n\n        OTV_LIMIT_CHECK( 6 );\n        ExtensionLookupType = FT_NEXT_USHORT( p );\n        ExtensionOffset     = FT_NEXT_ULONG( p );\n\n        if ( ExtensionLookupType == 0 ||\n             ExtensionLookupType == 7 ||\n             ExtensionLookupType > 8  )\n          FT_INVALID_DATA;\n\n        validate = valid->type_funcs[ExtensionLookupType - 1];\n        validate( table + ExtensionOffset, valid );\n      }\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    GSUB LOOKUP TYPE 8                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* uses valid->glyph_count */\n\n  static void\n  otv_ReverseChainSingleSubst_validate( FT_Bytes       table,\n                                        OTV_Validator  valid )\n  {\n    FT_Bytes  p = table, Coverage;\n    FT_UInt   SubstFormat;\n    FT_UInt   BacktrackGlyphCount, LookaheadGlyphCount, GlyphCount;\n\n\n    OTV_NAME_ENTER( \"ReverseChainSingleSubst\" );\n\n    OTV_LIMIT_CHECK( 2 );\n    SubstFormat = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (format %d)\\n\", SubstFormat ));\n\n    switch ( SubstFormat )\n    {\n    case 1:     /* ReverseChainSingleSubstFormat1 */\n      OTV_LIMIT_CHECK( 4 );\n      Coverage            = table + FT_NEXT_USHORT( p );\n      BacktrackGlyphCount = FT_NEXT_USHORT( p );\n\n      OTV_TRACE(( \" (BacktrackGlyphCount = %d)\\n\", BacktrackGlyphCount ));\n\n      otv_Coverage_validate( Coverage, valid, -1 );\n\n      OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 );\n\n      for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- )\n        otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );\n\n      LookaheadGlyphCount = FT_NEXT_USHORT( p );\n\n      OTV_TRACE(( \" (LookaheadGlyphCount = %d)\\n\", LookaheadGlyphCount ));\n\n      OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 );\n\n      for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- )\n        otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );\n\n      GlyphCount = FT_NEXT_USHORT( p );\n\n      OTV_TRACE(( \" (GlyphCount = %d)\\n\", GlyphCount ));\n\n      if ( GlyphCount != otv_Coverage_get_count( Coverage ) )\n        FT_INVALID_DATA;\n\n      OTV_LIMIT_CHECK( GlyphCount * 2 );\n\n      /* Substitute */\n      for ( ; GlyphCount > 0; GlyphCount-- )\n        if ( FT_NEXT_USHORT( p ) >= valid->glyph_count )\n          FT_INVALID_DATA;\n\n      break;\n\n    default:\n      FT_INVALID_FORMAT;\n    }\n\n    OTV_EXIT;\n  }\n\n\n  static const OTV_Validate_Func  otv_gsub_validate_funcs[8] =\n  {\n    otv_SingleSubst_validate,\n    otv_MultipleSubst_validate,\n    otv_AlternateSubst_validate,\n    otv_LigatureSubst_validate,\n    otv_ContextSubst_validate,\n    otv_ChainContextSubst_validate,\n    otv_ExtensionSubst_validate,\n    otv_ReverseChainSingleSubst_validate\n  };\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          GSUB TABLE                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->type_count  */\n  /* sets valid->type_funcs  */\n  /* sets valid->glyph_count */\n\n  FT_LOCAL_DEF( void )\n  otv_GSUB_validate( FT_Bytes      table,\n                     FT_UInt       glyph_count,\n                     FT_Validator  ftvalid )\n  {\n    OTV_ValidatorRec  validrec;\n    OTV_Validator     valid = &validrec;\n    FT_Bytes          p     = table;\n    FT_UInt           ScriptList, FeatureList, LookupList;\n\n\n    valid->root = ftvalid;\n\n    FT_TRACE3(( \"validating GSUB table\\n\" ));\n    OTV_INIT;\n\n    OTV_LIMIT_CHECK( 10 );\n\n    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */\n      FT_INVALID_FORMAT;\n\n    ScriptList  = FT_NEXT_USHORT( p );\n    FeatureList = FT_NEXT_USHORT( p );\n    LookupList  = FT_NEXT_USHORT( p );\n\n    valid->type_count  = 8;\n    valid->type_funcs  = (OTV_Validate_Func*)otv_gsub_validate_funcs;\n    valid->glyph_count = glyph_count;\n\n    otv_LookupList_validate( table + LookupList,\n                             valid );\n    otv_FeatureList_validate( table + FeatureList, table + LookupList,\n                              valid );\n    otv_ScriptList_validate( table + ScriptList, table + FeatureList,\n                             valid );\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvjstf.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvjstf.c                                                              */\n/*                                                                         */\n/*    OpenType JSTF table validation (body).                               */\n/*                                                                         */\n/*  Copyright 2004, 2007 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"otvalid.h\"\n#include \"otvcommn.h\"\n#include \"otvgpos.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_otvjstf\n\n\n#define JstfPriorityFunc  otv_JstfPriority_validate\n#define JstfLookupFunc    otv_GPOS_subtable_validate\n\n  /* uses valid->extra1 (GSUB lookup count) */\n  /* uses valid->extra2 (GPOS lookup count) */\n  /* sets valid->extra1 (counter)           */\n\n  static void\n  otv_JstfPriority_validate( FT_Bytes       table,\n                             OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   table_size;\n    FT_UInt   gsub_lookup_count, gpos_lookup_count;\n\n    OTV_OPTIONAL_TABLE( ShrinkageEnableGSUB  );\n    OTV_OPTIONAL_TABLE( ShrinkageDisableGSUB );\n    OTV_OPTIONAL_TABLE( ShrinkageEnableGPOS  );\n    OTV_OPTIONAL_TABLE( ShrinkageDisableGPOS );\n    OTV_OPTIONAL_TABLE( ExtensionEnableGSUB  );\n    OTV_OPTIONAL_TABLE( ExtensionDisableGSUB );\n    OTV_OPTIONAL_TABLE( ExtensionEnableGPOS  );\n    OTV_OPTIONAL_TABLE( ExtensionDisableGPOS );\n    OTV_OPTIONAL_TABLE( ShrinkageJstfMax );\n    OTV_OPTIONAL_TABLE( ExtensionJstfMax );\n\n\n    OTV_ENTER;\n    OTV_TRACE(( \"JstfPriority table\\n\" ));\n\n    OTV_LIMIT_CHECK( 20 );\n\n    gsub_lookup_count = valid->extra1;\n    gpos_lookup_count = valid->extra2;\n\n    table_size = 20;\n\n    valid->extra1 = gsub_lookup_count;\n\n    OTV_OPTIONAL_OFFSET( ShrinkageEnableGSUB );\n    OTV_SIZE_CHECK( ShrinkageEnableGSUB );\n    if ( ShrinkageEnableGSUB )\n      otv_x_ux( table + ShrinkageEnableGSUB, valid );\n\n    OTV_OPTIONAL_OFFSET( ShrinkageDisableGSUB );\n    OTV_SIZE_CHECK( ShrinkageDisableGSUB );\n    if ( ShrinkageDisableGSUB )\n      otv_x_ux( table + ShrinkageDisableGSUB, valid );\n\n    valid->extra1 = gpos_lookup_count;\n\n    OTV_OPTIONAL_OFFSET( ShrinkageEnableGPOS );\n    OTV_SIZE_CHECK( ShrinkageEnableGPOS );\n    if ( ShrinkageEnableGPOS )\n      otv_x_ux( table + ShrinkageEnableGPOS, valid );\n\n    OTV_OPTIONAL_OFFSET( ShrinkageDisableGPOS );\n    OTV_SIZE_CHECK( ShrinkageDisableGPOS );\n    if ( ShrinkageDisableGPOS )\n      otv_x_ux( table + ShrinkageDisableGPOS, valid );\n\n    OTV_OPTIONAL_OFFSET( ShrinkageJstfMax );\n    OTV_SIZE_CHECK( ShrinkageJstfMax );\n    if ( ShrinkageJstfMax )\n    {\n      /* XXX: check lookup types? */\n      OTV_NEST2( JstfMax, JstfLookup );\n      OTV_RUN( table + ShrinkageJstfMax, valid );\n    }\n\n    valid->extra1 = gsub_lookup_count;\n\n    OTV_OPTIONAL_OFFSET( ExtensionEnableGSUB );\n    OTV_SIZE_CHECK( ExtensionEnableGSUB );\n    if ( ExtensionEnableGSUB )\n      otv_x_ux( table + ExtensionEnableGSUB, valid );\n\n    OTV_OPTIONAL_OFFSET( ExtensionDisableGSUB );\n    OTV_SIZE_CHECK( ExtensionDisableGSUB );\n    if ( ExtensionDisableGSUB )\n      otv_x_ux( table + ExtensionDisableGSUB, valid );\n\n    valid->extra1 = gpos_lookup_count;\n\n    OTV_OPTIONAL_OFFSET( ExtensionEnableGPOS );\n    OTV_SIZE_CHECK( ExtensionEnableGPOS );\n    if ( ExtensionEnableGPOS )\n      otv_x_ux( table + ExtensionEnableGPOS, valid );\n\n    OTV_OPTIONAL_OFFSET( ExtensionDisableGPOS );\n    OTV_SIZE_CHECK( ExtensionDisableGPOS );\n    if ( ExtensionDisableGPOS )\n      otv_x_ux( table + ExtensionDisableGPOS, valid );\n\n    OTV_OPTIONAL_OFFSET( ExtensionJstfMax );\n    OTV_SIZE_CHECK( ExtensionJstfMax );\n    if ( ExtensionJstfMax )\n    {\n      /* XXX: check lookup types? */\n      OTV_NEST2( JstfMax, JstfLookup );\n      OTV_RUN( table + ExtensionJstfMax, valid );\n    }\n\n    valid->extra1 = gsub_lookup_count;\n    valid->extra2 = gpos_lookup_count;\n\n    OTV_EXIT;\n  }\n\n\n  /* sets valid->extra (glyph count)               */\n  /* sets valid->func1 (otv_JstfPriority_validate) */\n\n  static void\n  otv_JstfScript_validate( FT_Bytes       table,\n                           OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   table_size;\n    FT_UInt   JstfLangSysCount;\n\n    OTV_OPTIONAL_TABLE( ExtGlyph );\n    OTV_OPTIONAL_TABLE( DefJstfLangSys );\n\n\n    OTV_NAME_ENTER( \"JstfScript\" );\n\n    OTV_LIMIT_CHECK( 6 );\n    OTV_OPTIONAL_OFFSET( ExtGlyph );\n    OTV_OPTIONAL_OFFSET( DefJstfLangSys );\n    JstfLangSysCount = FT_NEXT_USHORT( p );\n\n    OTV_TRACE(( \" (JstfLangSysCount = %d)\\n\", JstfLangSysCount ));\n\n    table_size = JstfLangSysCount * 6 + 6;\n\n    OTV_SIZE_CHECK( ExtGlyph );\n    if ( ExtGlyph )\n    {\n      valid->extra1 = valid->glyph_count;\n      OTV_NEST1( ExtenderGlyph );\n      OTV_RUN( table + ExtGlyph, valid );\n    }\n\n    OTV_SIZE_CHECK( DefJstfLangSys );\n    if ( DefJstfLangSys )\n    {\n      OTV_NEST2( JstfLangSys, JstfPriority );\n      OTV_RUN( table + DefJstfLangSys, valid );\n    }\n\n    OTV_LIMIT_CHECK( 6 * JstfLangSysCount );\n\n    /* JstfLangSysRecord */\n    OTV_NEST2( JstfLangSys, JstfPriority );\n    for ( ; JstfLangSysCount > 0; JstfLangSysCount-- )\n    {\n      p += 4;       /* skip JstfLangSysTag */\n\n      OTV_RUN( table + FT_NEXT_USHORT( p ), valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /* sets valid->extra1 (GSUB lookup count) */\n  /* sets valid->extra2 (GPOS lookup count) */\n  /* sets valid->glyph_count                */\n\n  FT_LOCAL_DEF( void )\n  otv_JSTF_validate( FT_Bytes      table,\n                     FT_Bytes      gsub,\n                     FT_Bytes      gpos,\n                     FT_UInt       glyph_count,\n                     FT_Validator  ftvalid )\n  {\n    OTV_ValidatorRec  validrec;\n    OTV_Validator     valid = &validrec;\n    FT_Bytes          p     = table;\n    FT_UInt           JstfScriptCount;\n\n\n    valid->root = ftvalid;\n\n    FT_TRACE3(( \"validating JSTF table\\n\" ));\n    OTV_INIT;\n\n    OTV_LIMIT_CHECK( 6 );\n\n    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */\n      FT_INVALID_FORMAT;\n\n    JstfScriptCount = FT_NEXT_USHORT( p );\n\n    FT_TRACE3(( \" (JstfScriptCount = %d)\\n\", JstfScriptCount ));\n\n    OTV_LIMIT_CHECK( JstfScriptCount * 6 );\n\n    if ( gsub )\n      valid->extra1 = otv_GSUBGPOS_get_Lookup_count( gsub );\n    else\n      valid->extra1 = 0;\n\n    if ( gpos )\n      valid->extra2 = otv_GSUBGPOS_get_Lookup_count( gpos );\n    else\n      valid->extra2 = 0;\n\n    valid->glyph_count = glyph_count;\n\n    /* JstfScriptRecord */\n    for ( ; JstfScriptCount > 0; JstfScriptCount-- )\n    {\n      p += 4;       /* skip JstfScriptTag */\n\n      /* JstfScript */\n      otv_JstfScript_validate( table + FT_NEXT_USHORT( p ), valid );\n    }\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvmath.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvmath.c                                                              */\n/*                                                                         */\n/*    OpenType MATH table validation (body).                               */\n/*                                                                         */\n/*  Copyright 2007, 2008 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  Written by George Williams.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"otvalid.h\"\n#include \"otvcommn.h\"\n#include \"otvgpos.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_otvmath\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  MATH TYPOGRAPHIC CONSTANTS                   *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  otv_MathConstants_validate( FT_Bytes       table,\n                              OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   i;\n    FT_UInt   table_size;\n\n    OTV_OPTIONAL_TABLE( DeviceTableOffset );\n\n\n    OTV_NAME_ENTER( \"MathConstants\" );\n\n    /* 56 constants, 51 have device tables */\n    OTV_LIMIT_CHECK( 2 * ( 56 + 51 ) );\n    table_size = 2 * ( 56 + 51 );\n\n    p += 4 * 2;                 /* First 4 constants have no device tables */\n    for ( i = 0; i < 51; ++i )\n    {\n      p += 2;                                            /* skip the value */\n      OTV_OPTIONAL_OFFSET( DeviceTableOffset );\n      OTV_SIZE_CHECK( DeviceTableOffset );\n      if ( DeviceTableOffset )\n        otv_Device_validate( table + DeviceTableOffset, valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                   MATH ITALICS CORRECTION                     *****/\n  /*****                 MATH TOP ACCENT ATTACHMENT                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  otv_MathItalicsCorrectionInfo_validate( FT_Bytes       table,\n                                          OTV_Validator  valid,\n                                          FT_Int         isItalic )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   i, cnt, table_size ;\n\n    OTV_OPTIONAL_TABLE( Coverage );\n    OTV_OPTIONAL_TABLE( DeviceTableOffset );\n\n    FT_UNUSED( isItalic );  /* only used if tracing is active */\n\n\n    OTV_NAME_ENTER( isItalic ? \"MathItalicsCorrectionInfo\"\n                             : \"MathTopAccentAttachment\" );\n\n    OTV_LIMIT_CHECK( 4 );\n\n    OTV_OPTIONAL_OFFSET( Coverage );\n    cnt = FT_NEXT_USHORT( p );\n\n    OTV_LIMIT_CHECK( 4 * cnt );\n    table_size = 4 + 4 * cnt;\n\n    OTV_SIZE_CHECK( Coverage );\n    otv_Coverage_validate( table + Coverage, valid, cnt );\n\n    for ( i = 0; i < cnt; ++i )\n    {\n      p += 2;                                            /* Skip the value */\n      OTV_OPTIONAL_OFFSET( DeviceTableOffset );\n      OTV_SIZE_CHECK( DeviceTableOffset );\n      if ( DeviceTableOffset )\n        otv_Device_validate( table + DeviceTableOffset, valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           MATH KERNING                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  otv_MathKern_validate( FT_Bytes       table,\n                         OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   i, cnt, table_size;\n\n    OTV_OPTIONAL_TABLE( DeviceTableOffset );\n\n\n    /* OTV_NAME_ENTER( \"MathKern\" );*/\n\n    OTV_LIMIT_CHECK( 2 );\n\n    cnt = FT_NEXT_USHORT( p );\n\n    OTV_LIMIT_CHECK( 4 * cnt + 2 );\n    table_size = 4 + 4 * cnt;\n\n    /* Heights */\n    for ( i = 0; i < cnt; ++i )\n    {\n      p += 2;                                            /* Skip the value */\n      OTV_OPTIONAL_OFFSET( DeviceTableOffset );\n      OTV_SIZE_CHECK( DeviceTableOffset );\n      if ( DeviceTableOffset )\n        otv_Device_validate( table + DeviceTableOffset, valid );\n    }\n\n    /* One more Kerning value */\n    for ( i = 0; i < cnt + 1; ++i )\n    {\n      p += 2;                                            /* Skip the value */\n      OTV_OPTIONAL_OFFSET( DeviceTableOffset );\n      OTV_SIZE_CHECK( DeviceTableOffset );\n      if ( DeviceTableOffset )\n        otv_Device_validate( table + DeviceTableOffset, valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  static void\n  otv_MathKernInfo_validate( FT_Bytes       table,\n                             OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   i, j, cnt, table_size;\n\n    OTV_OPTIONAL_TABLE( Coverage );\n    OTV_OPTIONAL_TABLE( MKRecordOffset );\n\n\n    OTV_NAME_ENTER( \"MathKernInfo\" );\n\n    OTV_LIMIT_CHECK( 4 );\n\n    OTV_OPTIONAL_OFFSET( Coverage );\n    cnt = FT_NEXT_USHORT( p );\n\n    OTV_LIMIT_CHECK( 8 * cnt );\n    table_size = 4 + 8 * cnt;\n\n    OTV_SIZE_CHECK( Coverage );\n    otv_Coverage_validate( table + Coverage, valid, cnt );\n\n    for ( i = 0; i < cnt; ++i )\n    {\n      for ( j = 0; j < 4; ++j )\n      {\n        OTV_OPTIONAL_OFFSET( MKRecordOffset );\n        OTV_SIZE_CHECK( MKRecordOffset );\n        if ( MKRecordOffset )\n          otv_MathKern_validate( table + MKRecordOffset, valid );\n      }\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                         MATH GLYPH INFO                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  otv_MathGlyphInfo_validate( FT_Bytes       table,\n                              OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   MathItalicsCorrectionInfo, MathTopAccentAttachment;\n    FT_UInt   ExtendedShapeCoverage, MathKernInfo;\n\n\n    OTV_NAME_ENTER( \"MathGlyphInfo\" );\n\n    OTV_LIMIT_CHECK( 8 );\n\n    MathItalicsCorrectionInfo = FT_NEXT_USHORT( p );\n    MathTopAccentAttachment   = FT_NEXT_USHORT( p );\n    ExtendedShapeCoverage     = FT_NEXT_USHORT( p );\n    MathKernInfo              = FT_NEXT_USHORT( p );\n\n    if ( MathItalicsCorrectionInfo )\n      otv_MathItalicsCorrectionInfo_validate(\n        table + MathItalicsCorrectionInfo, valid, TRUE );\n\n    /* Italic correction and Top Accent Attachment have the same format */\n    if ( MathTopAccentAttachment )\n      otv_MathItalicsCorrectionInfo_validate(\n        table + MathTopAccentAttachment, valid, FALSE );\n\n    if ( ExtendedShapeCoverage )\n    {\n      OTV_NAME_ENTER( \"ExtendedShapeCoverage\" );\n      otv_Coverage_validate( table + ExtendedShapeCoverage, valid, -1 );\n      OTV_EXIT;\n    }\n\n    if ( MathKernInfo )\n      otv_MathKernInfo_validate( table + MathKernInfo, valid );\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    MATH GLYPH CONSTRUCTION                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  otv_GlyphAssembly_validate( FT_Bytes       table,\n                              OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   pcnt, table_size;\n    FT_UInt   i;\n\n    OTV_OPTIONAL_TABLE( DeviceTableOffset );\n\n\n    /* OTV_NAME_ENTER( \"GlyphAssembly\" ); */\n\n    OTV_LIMIT_CHECK( 6 );\n\n    p += 2;                           /* Skip the Italics Correction value */\n    OTV_OPTIONAL_OFFSET( DeviceTableOffset );\n    pcnt = FT_NEXT_USHORT( p );\n\n    OTV_LIMIT_CHECK( 8 * pcnt );\n    table_size = 6 + 8 * pcnt;\n\n    OTV_SIZE_CHECK( DeviceTableOffset );\n    if ( DeviceTableOffset )\n      otv_Device_validate( table + DeviceTableOffset, valid );\n\n    for ( i = 0; i < pcnt; ++i )\n    {\n      FT_UInt  gid;\n\n\n      gid = FT_NEXT_USHORT( p );\n      if ( gid >= valid->glyph_count )\n        FT_INVALID_GLYPH_ID;\n      p += 2*4;             /* skip the Start, End, Full, and Flags fields */\n    }\n\n    /* OTV_EXIT; */\n  }\n\n\n  static void\n  otv_MathGlyphConstruction_validate( FT_Bytes       table,\n                                      OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   vcnt, table_size;\n    FT_UInt   i;\n\n    OTV_OPTIONAL_TABLE( GlyphAssembly );\n\n\n    /* OTV_NAME_ENTER( \"MathGlyphConstruction\" ); */\n\n    OTV_LIMIT_CHECK( 4 );\n\n    OTV_OPTIONAL_OFFSET( GlyphAssembly );\n    vcnt = FT_NEXT_USHORT( p );\n\n    OTV_LIMIT_CHECK( 4 * vcnt );\n    table_size = 4 + 4 * vcnt;\n\n    for ( i = 0; i < vcnt; ++i )\n    {\n      FT_UInt  gid;\n\n\n      gid = FT_NEXT_USHORT( p );\n      if ( gid >= valid->glyph_count )\n        FT_INVALID_GLYPH_ID;\n      p += 2;                          /* skip the size */\n    }\n\n    OTV_SIZE_CHECK( GlyphAssembly );\n    if ( GlyphAssembly )\n      otv_GlyphAssembly_validate( table+GlyphAssembly, valid );\n\n    /* OTV_EXIT; */\n  }\n\n\n  static void\n  otv_MathVariants_validate( FT_Bytes       table,\n                             OTV_Validator  valid )\n  {\n    FT_Bytes  p = table;\n    FT_UInt   vcnt, hcnt, i, table_size;\n\n    OTV_OPTIONAL_TABLE( VCoverage );\n    OTV_OPTIONAL_TABLE( HCoverage );\n    OTV_OPTIONAL_TABLE( Offset );\n\n\n    OTV_NAME_ENTER( \"MathVariants\" );\n\n    OTV_LIMIT_CHECK( 10 );\n\n    p += 2;                       /* Skip the MinConnectorOverlap constant */\n    OTV_OPTIONAL_OFFSET( VCoverage );\n    OTV_OPTIONAL_OFFSET( HCoverage );\n    vcnt = FT_NEXT_USHORT( p );\n    hcnt = FT_NEXT_USHORT( p );\n\n    OTV_LIMIT_CHECK( 2 * vcnt + 2 * hcnt );\n    table_size = 10 + 2 * vcnt + 2 * hcnt;\n\n    OTV_SIZE_CHECK( VCoverage );\n    if ( VCoverage )\n      otv_Coverage_validate( table + VCoverage, valid, vcnt );\n\n    OTV_SIZE_CHECK( HCoverage );\n    if ( HCoverage )\n      otv_Coverage_validate( table + HCoverage, valid, hcnt );\n\n    for ( i = 0; i < vcnt; ++i )\n    {\n      OTV_OPTIONAL_OFFSET( Offset );\n      OTV_SIZE_CHECK( Offset );\n      otv_MathGlyphConstruction_validate( table + Offset, valid );\n    }\n\n    for ( i = 0; i < hcnt; ++i )\n    {\n      OTV_OPTIONAL_OFFSET( Offset );\n      OTV_SIZE_CHECK( Offset );\n      otv_MathGlyphConstruction_validate( table + Offset, valid );\n    }\n\n    OTV_EXIT;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          MATH TABLE                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* sets valid->glyph_count */\n\n  FT_LOCAL_DEF( void )\n  otv_MATH_validate( FT_Bytes      table,\n                     FT_UInt       glyph_count,\n                     FT_Validator  ftvalid )\n  {\n    OTV_ValidatorRec  validrec;\n    OTV_Validator     valid = &validrec;\n    FT_Bytes          p     = table;\n    FT_UInt           MathConstants, MathGlyphInfo, MathVariants;\n\n\n    valid->root = ftvalid;\n\n    FT_TRACE3(( \"validating MATH table\\n\" ));\n    OTV_INIT;\n\n    OTV_LIMIT_CHECK( 10 );\n\n    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */\n      FT_INVALID_FORMAT;\n\n    MathConstants = FT_NEXT_USHORT( p );\n    MathGlyphInfo = FT_NEXT_USHORT( p );\n    MathVariants  = FT_NEXT_USHORT( p );\n\n    valid->glyph_count = glyph_count;\n\n    otv_MathConstants_validate( table + MathConstants,\n                                valid );\n    otv_MathGlyphInfo_validate( table + MathGlyphInfo,\n                                valid );\n    otv_MathVariants_validate ( table + MathVariants,\n                                valid );\n\n    FT_TRACE4(( \"\\n\" ));\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvmod.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvmod.c                                                               */\n/*                                                                         */\n/*    FreeType's OpenType validation module implementation (body).         */\n/*                                                                         */\n/*  Copyright 2004-2008, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_TRUETYPE_TABLES_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_OPENTYPE_VALIDATE_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_OPENTYPE_VALIDATE_H\n\n#include \"otvmod.h\"\n#include \"otvalid.h\"\n#include \"otvcommn.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_otvmodule\n\n\n  static FT_Error\n  otv_load_table( FT_Face             face,\n                  FT_Tag              tag,\n                  FT_Byte* volatile*  table,\n                  FT_ULong*           table_len )\n  {\n    FT_Error   error;\n    FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n    error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len );\n    if ( FT_ERR_EQ( error, Table_Missing ) )\n      return FT_Err_Ok;\n    if ( error )\n      goto Exit;\n\n    if ( FT_ALLOC( *table, *table_len ) )\n      goto Exit;\n\n    error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  otv_validate( FT_Face volatile   face,\n                FT_UInt            ot_flags,\n                FT_Bytes          *ot_base,\n                FT_Bytes          *ot_gdef,\n                FT_Bytes          *ot_gpos,\n                FT_Bytes          *ot_gsub,\n                FT_Bytes          *ot_jstf )\n  {\n    FT_Error                  error = FT_Err_Ok;\n    FT_Byte* volatile         base;\n    FT_Byte* volatile         gdef;\n    FT_Byte* volatile         gpos;\n    FT_Byte* volatile         gsub;\n    FT_Byte* volatile         jstf;\n    FT_Byte* volatile         math;\n    FT_ULong                  len_base, len_gdef, len_gpos, len_gsub, len_jstf;\n    FT_ULong                  len_math;\n    FT_UInt                   num_glyphs = (FT_UInt)face->num_glyphs;\n    FT_ValidatorRec volatile  valid;\n\n\n    base     = gdef     = gpos     = gsub     = jstf     = math     = NULL;\n    len_base = len_gdef = len_gpos = len_gsub = len_jstf = len_math = 0;\n\n    /*\n     * XXX: OpenType tables cannot handle 32-bit glyph index,\n     *      although broken TrueType can have 32-bit glyph index.\n     */\n    if ( face->num_glyphs > 0xFFFFL )\n    {\n      FT_TRACE1(( \"otv_validate: Invalid glyphs index (0x0000FFFF - 0x%08x) \",\n                  face->num_glyphs ));\n      FT_TRACE1(( \"are not handled by OpenType tables\\n\" ));\n      num_glyphs = 0xFFFF;\n    }\n\n    /* load tables */\n\n    if ( ot_flags & FT_VALIDATE_BASE )\n    {\n      error = otv_load_table( face, TTAG_BASE, &base, &len_base );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( ot_flags & FT_VALIDATE_GDEF )\n    {\n      error = otv_load_table( face, TTAG_GDEF, &gdef, &len_gdef );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( ot_flags & FT_VALIDATE_GPOS )\n    {\n      error = otv_load_table( face, TTAG_GPOS, &gpos, &len_gpos );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( ot_flags & FT_VALIDATE_GSUB )\n    {\n      error = otv_load_table( face, TTAG_GSUB, &gsub, &len_gsub );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( ot_flags & FT_VALIDATE_JSTF )\n    {\n      error = otv_load_table( face, TTAG_JSTF, &jstf, &len_jstf );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( ot_flags & FT_VALIDATE_MATH )\n    {\n      error = otv_load_table( face, TTAG_MATH, &math, &len_math );\n      if ( error )\n        goto Exit;\n    }\n\n    /* validate tables */\n\n    if ( base )\n    {\n      ft_validator_init( &valid, base, base + len_base, FT_VALIDATE_DEFAULT );\n      if ( ft_setjmp( valid.jump_buffer ) == 0 )\n        otv_BASE_validate( base, &valid );\n      error = valid.error;\n      if ( error )\n        goto Exit;\n    }\n\n    if ( gpos )\n    {\n      ft_validator_init( &valid, gpos, gpos + len_gpos, FT_VALIDATE_DEFAULT );\n      if ( ft_setjmp( valid.jump_buffer ) == 0 )\n        otv_GPOS_validate( gpos, num_glyphs, &valid );\n      error = valid.error;\n      if ( error )\n        goto Exit;\n    }\n\n    if ( gsub )\n    {\n      ft_validator_init( &valid, gsub, gsub + len_gsub, FT_VALIDATE_DEFAULT );\n      if ( ft_setjmp( valid.jump_buffer ) == 0 )\n        otv_GSUB_validate( gsub, num_glyphs, &valid );\n      error = valid.error;\n      if ( error )\n        goto Exit;\n    }\n\n    if ( gdef )\n    {\n      ft_validator_init( &valid, gdef, gdef + len_gdef, FT_VALIDATE_DEFAULT );\n      if ( ft_setjmp( valid.jump_buffer ) == 0 )\n        otv_GDEF_validate( gdef, gsub, gpos, num_glyphs, &valid );\n      error = valid.error;\n      if ( error )\n        goto Exit;\n    }\n\n    if ( jstf )\n    {\n      ft_validator_init( &valid, jstf, jstf + len_jstf, FT_VALIDATE_DEFAULT );\n      if ( ft_setjmp( valid.jump_buffer ) == 0 )\n        otv_JSTF_validate( jstf, gsub, gpos, num_glyphs, &valid );\n      error = valid.error;\n      if ( error )\n        goto Exit;\n    }\n\n    if ( math )\n    {\n      ft_validator_init( &valid, math, math + len_math, FT_VALIDATE_DEFAULT );\n      if ( ft_setjmp( valid.jump_buffer ) == 0 )\n        otv_MATH_validate( math, num_glyphs, &valid );\n      error = valid.error;\n      if ( error )\n        goto Exit;\n    }\n\n    *ot_base = (FT_Bytes)base;\n    *ot_gdef = (FT_Bytes)gdef;\n    *ot_gpos = (FT_Bytes)gpos;\n    *ot_gsub = (FT_Bytes)gsub;\n    *ot_jstf = (FT_Bytes)jstf;\n\n  Exit:\n    if ( error )\n    {\n      FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n      FT_FREE( base );\n      FT_FREE( gdef );\n      FT_FREE( gpos );\n      FT_FREE( gsub );\n      FT_FREE( jstf );\n    }\n\n    {\n      FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n      FT_FREE( math );                 /* Can't return this as API is frozen */\n    }\n\n    return error;\n  }\n\n\n  static\n  const FT_Service_OTvalidateRec  otvalid_interface =\n  {\n    otv_validate\n  };\n\n\n  static\n  const FT_ServiceDescRec  otvalid_services[] =\n  {\n    { FT_SERVICE_ID_OPENTYPE_VALIDATE, &otvalid_interface },\n    { NULL, NULL }\n  };\n\n\n  static FT_Pointer\n  otvalid_get_service( FT_Module    module,\n                       const char*  service_id )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( otvalid_services, service_id );\n  }\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Module_Class  otv_module_class =\n  {\n    0,\n    sizeof ( FT_ModuleRec ),\n    \"otvalid\",\n    0x10000L,\n    0x20000L,\n\n    0,              /* module-specific interface */\n\n    (FT_Module_Constructor)0,\n    (FT_Module_Destructor) 0,\n    (FT_Module_Requester)  otvalid_get_service\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/otvmod.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  otvmod.h                                                               */\n/*                                                                         */\n/*    FreeType's OpenType validation module implementation                 */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 2004 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __OTVMOD_H__\n#define __OTVMOD_H__\n\n\n#include <ft2build.h>\n#include FT_MODULE_H\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_EXPORT_VAR( const FT_Module_Class )  otv_module_class;\n\n\nFT_END_HEADER\n\n#endif /* __OTVMOD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/otvalid/rules.mk",
    "content": "#\n# FreeType 2 OpenType validation driver configuration rules\n#\n\n\n# Copyright 2004, 2007 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# OTV driver directory\n#\nOTV_DIR := $(SRC_DIR)/otvalid\n\n\n# compilation flags for the driver\n#\nOTV_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(OTV_DIR))\n\n\n# OTV driver sources (i.e., C files)\n#\nOTV_DRV_SRC := $(OTV_DIR)/otvbase.c  \\\n               $(OTV_DIR)/otvcommn.c \\\n               $(OTV_DIR)/otvgdef.c  \\\n               $(OTV_DIR)/otvgpos.c  \\\n               $(OTV_DIR)/otvgsub.c  \\\n               $(OTV_DIR)/otvjstf.c  \\\n               $(OTV_DIR)/otvmath.c  \\\n               $(OTV_DIR)/otvmod.c\n\n# OTV driver headers\n#\nOTV_DRV_H := $(OTV_DIR)/otvalid.h  \\\n             $(OTV_DIR)/otvcommn.h \\\n             $(OTV_DIR)/otverror.h \\\n             $(OTV_DIR)/otvgpos.h  \\\n             $(OTV_DIR)/otvmod.h\n\n\n# OTV driver object(s)\n#\n#   OTV_DRV_OBJ_M is used during `multi' builds.\n#   OTV_DRV_OBJ_S is used during `single' builds.\n#\nOTV_DRV_OBJ_M := $(OTV_DRV_SRC:$(OTV_DIR)/%.c=$(OBJ_DIR)/%.$O)\nOTV_DRV_OBJ_S := $(OBJ_DIR)/otvalid.$O\n\n# OTV driver source file for single build\n#\nOTV_DRV_SRC_S := $(OTV_DIR)/otvalid.c\n\n\n# OTV driver - single object\n#\n$(OTV_DRV_OBJ_S): $(OTV_DRV_SRC_S) $(OTV_DRV_SRC) \\\n                   $(FREETYPE_H) $(OTV_DRV_H)\n\t$(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(OTV_DRV_SRC_S))\n\n\n# OTV driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(OTV_DIR)/%.c $(FREETYPE_H) $(OTV_DRV_H)\n\t$(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(OTV_DRV_OBJ_S)\nDRV_OBJS_M += $(OTV_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/pcf/Jamfile",
    "content": "# FreeType 2 src/pcf Jamfile\n#\n# Copyright 2001, 2003 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) pcf ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = pcfdrivr pcfread pcfutil ;\n  }\n  else\n  {\n    _sources = pcf ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/pcf Jamfile\n"
  },
  {
    "path": "libs/freetype/src/pcf/README",
    "content": "                  FreeType font driver for PCF fonts\n\n                       Francesco Zappa Nardelli\n                  <francesco.zappa.nardelli@ens.fr>\n\n\nIntroduction\n************\n\nPCF (Portable Compiled Format) is a binary bitmap font format, largely used\nin X world. This code implements a PCF driver for the FreeType library.\nGlyph images are loaded into memory only on demand, thus leading to a small\nmemory footprint.\n\nInformation on the PCF font format can only be worked out from\n`pcfread.c', and `pcfwrite.c', to be found, for instance, in the XFree86\n(www.xfree86.org) source tree (xc/lib/font/bitmap/).\n\nMany good bitmap fonts in bdf format come with XFree86: they can be\ncompiled into the pcf format using the `bdftopcf' utility.\n\n\nSupported hardware\n******************\n\nThe driver has been tested on linux/x86 and sunos5.5/sparc.  In both\ncases the compiler was gcc.  When back in Paris, I will test it also\non linux/alpha.\n\n\nEncodings\n*********\n\nUse `FT_Get_BDF_Charset_ID' to access the encoding and registry.\n\nThe driver always exports `ft_encoding_none' as face->charmap.encoding.\nFT_Get_Char_Index() behavior is unmodified, that is, it converts the ULong\nvalue given as argument into the corresponding glyph number.\n\n\nKnown problems\n**************\n\n- dealing explicitly with encodings breaks the uniformity of freetype2\n  api.\n\n- except for encodings properties, client applications have no\n  visibility of the PCF_Face object.  This means that applications\n  cannot directly access font tables and are obliged to trust\n  FreeType.\n\n- currently, glyph names and ink_metrics are ignored.\n\nI plan to give full visibility of the PCF_Face object in the next\nrelease of the driver, thus implementing also glyph names and\nink_metrics.\n\n- height is defined as (ascent - descent).  Is this correct?\n\n- if unable to read size information from the font, PCF_Init_Face\n  sets available_size->width and available_size->height to 12.\n\n- too many english grammar errors in the readme file :-(\n\n\nLicense\n*******\n\nCopyright (C) 2000 by Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\nCredits\n*******\n\nKeith Packard wrote the pcf driver found in XFree86.  His work is at\nthe same time the specification and the sample implementation of the\nPCF format.  Undoubtedly, this driver is inspired from his work.\n"
  },
  {
    "path": "libs/freetype/src/pcf/module.mk",
    "content": "#\n# FreeType 2 PCF module definition\n#\n\n# Copyright 2000, 2006 by\n# Francesco Zappa Nardelli\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n\n\nFTMODULE_H_COMMANDS += PCF_DRIVER\n\ndefine PCF_DRIVER\n$(OPEN_DRIVER) FT_Driver_ClassRec, pcf_driver_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)pcf       $(ECHO_DRIVER_DESC)pcf bitmap fonts$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/pcf/pcf.c",
    "content": "/*  pcf.c\n\n    FreeType font driver for pcf fonts\n\n  Copyright 2000-2001, 2003 by\n  Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n\n#include <ft2build.h>\n#include \"pcfutil.c\"\n#include \"pcfread.c\"\n#include \"pcfdrivr.c\"\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pcf/pcf.h",
    "content": "/*  pcf.h\n\n  FreeType font driver for pcf fonts\n\n  Copyright (C) 2000, 2001, 2002, 2003, 2006, 2010 by\n  Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n\n#ifndef __PCF_H__\n#define __PCF_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n#include FT_INTERNAL_STREAM_H\n\n\nFT_BEGIN_HEADER\n\n  typedef struct  PCF_TableRec_\n  {\n    FT_ULong  type;\n    FT_ULong  format;\n    FT_ULong  size;\n    FT_ULong  offset;\n\n  } PCF_TableRec, *PCF_Table;\n\n\n  typedef struct  PCF_TocRec_\n  {\n    FT_ULong   version;\n    FT_ULong   count;\n    PCF_Table  tables;\n\n  } PCF_TocRec, *PCF_Toc;\n\n\n  typedef struct  PCF_ParsePropertyRec_\n  {\n    FT_Long  name;\n    FT_Byte  isString;\n    FT_Long  value;\n\n  } PCF_ParsePropertyRec, *PCF_ParseProperty;\n\n\n  typedef struct  PCF_PropertyRec_\n  {\n    FT_String*  name;\n    FT_Byte     isString;\n\n    union\n    {\n      FT_String*  atom;\n      FT_Long     l;\n      FT_ULong    ul;\n\n    } value;\n\n  } PCF_PropertyRec, *PCF_Property;\n\n\n  typedef struct  PCF_Compressed_MetricRec_\n  {\n    FT_Byte  leftSideBearing;\n    FT_Byte  rightSideBearing;\n    FT_Byte  characterWidth;\n    FT_Byte  ascent;\n    FT_Byte  descent;\n\n  } PCF_Compressed_MetricRec, *PCF_Compressed_Metric;\n\n\n  typedef struct  PCF_MetricRec_\n  {\n    FT_Short  leftSideBearing;\n    FT_Short  rightSideBearing;\n    FT_Short  characterWidth;\n    FT_Short  ascent;\n    FT_Short  descent;\n    FT_Short  attributes;\n    FT_ULong  bits;\n\n  } PCF_MetricRec, *PCF_Metric;\n\n\n  typedef struct  PCF_AccelRec_\n  {\n    FT_Byte        noOverlap;\n    FT_Byte        constantMetrics;\n    FT_Byte        terminalFont;\n    FT_Byte        constantWidth;\n    FT_Byte        inkInside;\n    FT_Byte        inkMetrics;\n    FT_Byte        drawDirection;\n    FT_Long        fontAscent;\n    FT_Long        fontDescent;\n    FT_Long        maxOverlap;\n    PCF_MetricRec  minbounds;\n    PCF_MetricRec  maxbounds;\n    PCF_MetricRec  ink_minbounds;\n    PCF_MetricRec  ink_maxbounds;\n\n  } PCF_AccelRec, *PCF_Accel;\n\n\n  typedef struct  PCF_EncodingRec_\n  {\n    FT_Long    enc;\n    FT_UShort  glyph;\n\n  } PCF_EncodingRec, *PCF_Encoding;\n\n\n  typedef struct  PCF_FaceRec_\n  {\n    FT_FaceRec     root;\n\n    FT_StreamRec   comp_stream;\n    FT_Stream      comp_source;\n\n    char*          charset_encoding;\n    char*          charset_registry;\n\n    PCF_TocRec     toc;\n    PCF_AccelRec   accel;\n\n    int            nprops;\n    PCF_Property   properties;\n\n    FT_Long        nmetrics;\n    PCF_Metric     metrics;\n    FT_Long        nencodings;\n    PCF_Encoding   encodings;\n\n    FT_Short       defaultChar;\n\n    FT_ULong       bitmapsFormat;\n\n    FT_CharMap     charmap_handle;\n    FT_CharMapRec  charmap;  /* a single charmap per face */\n\n  } PCF_FaceRec, *PCF_Face;\n\n\n  /* macros for pcf font format */\n\n#define LSBFirst  0\n#define MSBFirst  1\n\n#define PCF_FILE_VERSION        ( ( 'p' << 24 ) | \\\n                                  ( 'c' << 16 ) | \\\n                                  ( 'f' <<  8 ) | 1 )\n#define PCF_FORMAT_MASK         0xFFFFFF00UL\n\n#define PCF_DEFAULT_FORMAT      0x00000000UL\n#define PCF_INKBOUNDS           0x00000200UL\n#define PCF_ACCEL_W_INKBOUNDS   0x00000100UL\n#define PCF_COMPRESSED_METRICS  0x00000100UL\n\n#define PCF_FORMAT_MATCH( a, b ) \\\n          ( ( (a) & PCF_FORMAT_MASK ) == ( (b) & PCF_FORMAT_MASK ) )\n\n#define PCF_GLYPH_PAD_MASK  ( 3 << 0 )\n#define PCF_BYTE_MASK       ( 1 << 2 )\n#define PCF_BIT_MASK        ( 1 << 3 )\n#define PCF_SCAN_UNIT_MASK  ( 3 << 4 )\n\n#define PCF_BYTE_ORDER( f ) \\\n          ( ( (f) & PCF_BYTE_MASK ) ? MSBFirst : LSBFirst )\n#define PCF_BIT_ORDER( f ) \\\n          ( ( (f) & PCF_BIT_MASK ) ? MSBFirst : LSBFirst )\n#define PCF_GLYPH_PAD_INDEX( f ) \\\n          ( (f) & PCF_GLYPH_PAD_MASK )\n#define PCF_GLYPH_PAD( f ) \\\n          ( 1 << PCF_GLYPH_PAD_INDEX( f ) )\n#define PCF_SCAN_UNIT_INDEX( f ) \\\n          ( ( (f) & PCF_SCAN_UNIT_MASK ) >> 4 )\n#define PCF_SCAN_UNIT( f ) \\\n          ( 1 << PCF_SCAN_UNIT_INDEX( f ) )\n#define PCF_FORMAT_BITS( f )             \\\n          ( (f) & ( PCF_GLYPH_PAD_MASK | \\\n                    PCF_BYTE_MASK      | \\\n                    PCF_BIT_MASK       | \\\n                    PCF_SCAN_UNIT_MASK ) )\n\n#define PCF_SIZE_TO_INDEX( s )  ( (s) == 4 ? 2 : (s) == 2 ? 1 : 0 )\n#define PCF_INDEX_TO_SIZE( b )  ( 1 << b )\n\n#define PCF_FORMAT( bit, byte, glyph, scan )          \\\n          ( ( PCF_SIZE_TO_INDEX( scan )      << 4 ) | \\\n            ( ( (bit)  == MSBFirst ? 1 : 0 ) << 3 ) | \\\n            ( ( (byte) == MSBFirst ? 1 : 0 ) << 2 ) | \\\n            ( PCF_SIZE_TO_INDEX( glyph )     << 0 ) )\n\n#define PCF_PROPERTIES        ( 1 << 0 )\n#define PCF_ACCELERATORS      ( 1 << 1 )\n#define PCF_METRICS           ( 1 << 2 )\n#define PCF_BITMAPS           ( 1 << 3 )\n#define PCF_INK_METRICS       ( 1 << 4 )\n#define PCF_BDF_ENCODINGS     ( 1 << 5 )\n#define PCF_SWIDTHS           ( 1 << 6 )\n#define PCF_GLYPH_NAMES       ( 1 << 7 )\n#define PCF_BDF_ACCELERATORS  ( 1 << 8 )\n\n#define GLYPHPADOPTIONS  4 /* I'm not sure about this */\n\n  FT_LOCAL( FT_Error )\n  pcf_load_font( FT_Stream,\n                 PCF_Face );\n\nFT_END_HEADER\n\n#endif /* __PCF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pcf/pcfdrivr.c",
    "content": "/*  pcfdrivr.c\n\n    FreeType font driver for pcf files\n\n    Copyright (C) 2000-2004, 2006-2011, 2013 by\n    Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n\n#include <ft2build.h>\n\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_GZIP_H\n#include FT_LZW_H\n#include FT_BZIP2_H\n#include FT_ERRORS_H\n#include FT_BDF_H\n#include FT_TRUETYPE_IDS_H\n\n#include \"pcf.h\"\n#include \"pcfdrivr.h\"\n#include \"pcfread.h\"\n\n#include \"pcferror.h\"\n#include \"pcfutil.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pcfread\n\n#include FT_SERVICE_BDF_H\n#include FT_SERVICE_XFREE86_NAME_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pcfdriver\n\n\n  typedef struct  PCF_CMapRec_\n  {\n    FT_CMapRec    root;\n    FT_UInt       num_encodings;\n    PCF_Encoding  encodings;\n\n  } PCF_CMapRec, *PCF_CMap;\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  pcf_cmap_init( FT_CMap     pcfcmap,   /* PCF_CMap */\n                 FT_Pointer  init_data )\n  {\n    PCF_CMap  cmap = (PCF_CMap)pcfcmap;\n    PCF_Face  face = (PCF_Face)FT_CMAP_FACE( pcfcmap );\n\n    FT_UNUSED( init_data );\n\n\n    cmap->num_encodings = (FT_UInt)face->nencodings;\n    cmap->encodings     = face->encodings;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  pcf_cmap_done( FT_CMap  pcfcmap )         /* PCF_CMap */\n  {\n    PCF_CMap  cmap = (PCF_CMap)pcfcmap;\n\n\n    cmap->encodings     = NULL;\n    cmap->num_encodings = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  pcf_cmap_char_index( FT_CMap    pcfcmap,  /* PCF_CMap */\n                       FT_UInt32  charcode )\n  {\n    PCF_CMap      cmap      = (PCF_CMap)pcfcmap;\n    PCF_Encoding  encodings = cmap->encodings;\n    FT_UInt       min, max, mid;\n    FT_UInt       result    = 0;\n\n\n    min = 0;\n    max = cmap->num_encodings;\n\n    while ( min < max )\n    {\n      FT_ULong  code;\n\n\n      mid  = ( min + max ) >> 1;\n      code = encodings[mid].enc;\n\n      if ( charcode == code )\n      {\n        result = encodings[mid].glyph + 1;\n        break;\n      }\n\n      if ( charcode < code )\n        max = mid;\n      else\n        min = mid + 1;\n    }\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  pcf_cmap_char_next( FT_CMap    pcfcmap,   /* PCF_CMap */\n                      FT_UInt32  *acharcode )\n  {\n    PCF_CMap      cmap      = (PCF_CMap)pcfcmap;\n    PCF_Encoding  encodings = cmap->encodings;\n    FT_UInt       min, max, mid;\n    FT_ULong      charcode  = *acharcode + 1;\n    FT_UInt       result    = 0;\n\n\n    min = 0;\n    max = cmap->num_encodings;\n\n    while ( min < max )\n    {\n      FT_ULong  code;\n\n\n      mid  = ( min + max ) >> 1;\n      code = encodings[mid].enc;\n\n      if ( charcode == code )\n      {\n        result = encodings[mid].glyph + 1;\n        goto Exit;\n      }\n\n      if ( charcode < code )\n        max = mid;\n      else\n        min = mid + 1;\n    }\n\n    charcode = 0;\n    if ( min < cmap->num_encodings )\n    {\n      charcode = encodings[min].enc;\n      result   = encodings[min].glyph + 1;\n    }\n\n  Exit:\n    if ( charcode > 0xFFFFFFFFUL )\n    {\n      FT_TRACE1(( \"pcf_cmap_char_next: charcode 0x%x > 32bit API\" ));\n      *acharcode = 0;\n      /* XXX: result should be changed to indicate an overflow error */\n    }\n    else\n      *acharcode = (FT_UInt32)charcode;\n    return result;\n  }\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_CMap_ClassRec  pcf_cmap_class =\n  {\n    sizeof ( PCF_CMapRec ),\n    pcf_cmap_init,\n    pcf_cmap_done,\n    pcf_cmap_char_index,\n    pcf_cmap_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n  FT_CALLBACK_DEF( void )\n  PCF_Face_Done( FT_Face  pcfface )         /* PCF_Face */\n  {\n    PCF_Face   face = (PCF_Face)pcfface;\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = FT_FACE_MEMORY( face );\n\n    FT_FREE( face->encodings );\n    FT_FREE( face->metrics );\n\n    /* free properties */\n    {\n      PCF_Property  prop;\n      FT_Int        i;\n\n\n      if ( face->properties )\n      {\n        for ( i = 0; i < face->nprops; i++ )\n        {\n          prop = &face->properties[i];\n\n          if ( prop )\n          {\n            FT_FREE( prop->name );\n            if ( prop->isString )\n              FT_FREE( prop->value.atom );\n          }\n        }\n      }\n      FT_FREE( face->properties );\n    }\n\n    FT_FREE( face->toc.tables );\n    FT_FREE( pcfface->family_name );\n    FT_FREE( pcfface->style_name );\n    FT_FREE( pcfface->available_sizes );\n    FT_FREE( face->charset_encoding );\n    FT_FREE( face->charset_registry );\n\n    /* close compressed stream if any */\n    if ( pcfface->stream == &face->comp_stream )\n    {\n      FT_Stream_Close( &face->comp_stream );\n      pcfface->stream = face->comp_source;\n    }\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  PCF_Face_Init( FT_Stream      stream,\n                 FT_Face        pcfface,        /* PCF_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params )\n  {\n    PCF_Face  face  = (PCF_Face)pcfface;\n    FT_Error  error = FT_Err_Ok;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n    FT_UNUSED( face_index );\n\n\n    FT_TRACE2(( \"PCF driver\\n\" ));\n\n    error = pcf_load_font( stream, face );\n    if ( error )\n    {\n      PCF_Face_Done( pcfface );\n\n#if defined( FT_CONFIG_OPTION_USE_ZLIB )  || \\\n    defined( FT_CONFIG_OPTION_USE_LZW )   || \\\n    defined( FT_CONFIG_OPTION_USE_BZIP2 )\n\n#ifdef FT_CONFIG_OPTION_USE_ZLIB\n      {\n        FT_Error  error2;\n\n\n        /* this didn't work, try gzip support! */\n        error2 = FT_Stream_OpenGzip( &face->comp_stream, stream );\n        if ( FT_ERR_EQ( error2, Unimplemented_Feature ) )\n          goto Fail;\n\n        error = error2;\n      }\n#endif /* FT_CONFIG_OPTION_USE_ZLIB */\n\n#ifdef FT_CONFIG_OPTION_USE_LZW\n      if ( error )\n      {\n        FT_Error  error3;\n\n\n        /* this didn't work, try LZW support! */\n        error3 = FT_Stream_OpenLZW( &face->comp_stream, stream );\n        if ( FT_ERR_EQ( error3, Unimplemented_Feature ) )\n          goto Fail;\n\n        error = error3;\n      }\n#endif /* FT_CONFIG_OPTION_USE_LZW */\n\n#ifdef FT_CONFIG_OPTION_USE_BZIP2\n      if ( error )\n      {\n        FT_Error  error4;\n\n\n        /* this didn't work, try Bzip2 support! */\n        error4 = FT_Stream_OpenBzip2( &face->comp_stream, stream );\n        if ( FT_ERR_EQ( error4, Unimplemented_Feature ) )\n          goto Fail;\n\n        error = error4;\n      }\n#endif /* FT_CONFIG_OPTION_USE_BZIP2 */\n\n      if ( error )\n        goto Fail;\n\n      face->comp_source = stream;\n      pcfface->stream   = &face->comp_stream;\n\n      stream = pcfface->stream;\n\n      error = pcf_load_font( stream, face );\n      if ( error )\n        goto Fail;\n\n#else /* !(FT_CONFIG_OPTION_USE_ZLIB ||\n           FT_CONFIG_OPTION_USE_LZW ||\n           FT_CONFIG_OPTION_USE_BZIP2) */\n\n      goto Fail;\n\n#endif\n    }\n\n    /* set up charmap */\n    {\n      FT_String  *charset_registry = face->charset_registry;\n      FT_String  *charset_encoding = face->charset_encoding;\n      FT_Bool     unicode_charmap  = 0;\n\n\n      if ( charset_registry && charset_encoding )\n      {\n        char*  s = charset_registry;\n\n\n        /* Uh, oh, compare first letters manually to avoid dependency\n           on locales. */\n        if ( ( s[0] == 'i' || s[0] == 'I' ) &&\n             ( s[1] == 's' || s[1] == 'S' ) &&\n             ( s[2] == 'o' || s[2] == 'O' ) )\n        {\n          s += 3;\n          if ( !ft_strcmp( s, \"10646\" )                      ||\n               ( !ft_strcmp( s, \"8859\" ) &&\n                 !ft_strcmp( face->charset_encoding, \"1\" ) ) )\n          unicode_charmap = 1;\n        }\n      }\n\n      {\n        FT_CharMapRec  charmap;\n\n\n        charmap.face        = FT_FACE( face );\n        charmap.encoding    = FT_ENCODING_NONE;\n        /* initial platform/encoding should indicate unset status? */\n        charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;\n        charmap.encoding_id = TT_APPLE_ID_DEFAULT;\n\n        if ( unicode_charmap )\n        {\n          charmap.encoding    = FT_ENCODING_UNICODE;\n          charmap.platform_id = TT_PLATFORM_MICROSOFT;\n          charmap.encoding_id = TT_MS_ID_UNICODE_CS;\n        }\n\n        error = FT_CMap_New( &pcf_cmap_class, NULL, &charmap, NULL );\n\n#if 0\n        /* Select default charmap */\n        if ( pcfface->num_charmaps )\n          pcfface->charmap = pcfface->charmaps[0];\n#endif\n      }\n    }\n\n  Exit:\n    return error;\n\n  Fail:\n    FT_TRACE2(( \"  not a PCF file\\n\" ));\n    PCF_Face_Done( pcfface );\n    error = FT_THROW( Unknown_File_Format );  /* error */\n    goto Exit;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  PCF_Size_Select( FT_Size   size,\n                   FT_ULong  strike_index )\n  {\n    PCF_Accel  accel = &( (PCF_Face)size->face )->accel;\n\n\n    FT_Select_Metrics( size->face, strike_index );\n\n    size->metrics.ascender    =  accel->fontAscent << 6;\n    size->metrics.descender   = -accel->fontDescent << 6;\n    size->metrics.max_advance =  accel->maxbounds.characterWidth << 6;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  PCF_Size_Request( FT_Size          size,\n                    FT_Size_Request  req )\n  {\n    PCF_Face         face  = (PCF_Face)size->face;\n    FT_Bitmap_Size*  bsize = size->face->available_sizes;\n    FT_Error         error = FT_ERR( Invalid_Pixel_Size );\n    FT_Long          height;\n\n\n    height = FT_REQUEST_HEIGHT( req );\n    height = ( height + 32 ) >> 6;\n\n    switch ( req->type )\n    {\n    case FT_SIZE_REQUEST_TYPE_NOMINAL:\n      if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) )\n        error = FT_Err_Ok;\n      break;\n\n    case FT_SIZE_REQUEST_TYPE_REAL_DIM:\n      if ( height == ( face->accel.fontAscent +\n                       face->accel.fontDescent ) )\n        error = FT_Err_Ok;\n      break;\n\n    default:\n      error = FT_THROW( Unimplemented_Feature );\n      break;\n    }\n\n    if ( error )\n      return error;\n    else\n      return PCF_Size_Select( size, 0 );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  PCF_Glyph_Load( FT_GlyphSlot  slot,\n                  FT_Size       size,\n                  FT_UInt       glyph_index,\n                  FT_Int32      load_flags )\n  {\n    PCF_Face    face   = (PCF_Face)FT_SIZE_FACE( size );\n    FT_Stream   stream;\n    FT_Error    error  = FT_Err_Ok;\n    FT_Bitmap*  bitmap = &slot->bitmap;\n    PCF_Metric  metric;\n    FT_Offset   bytes;\n\n    FT_UNUSED( load_flags );\n\n\n    FT_TRACE4(( \"load_glyph %d ---\", glyph_index ));\n\n    if ( !face || glyph_index >= (FT_UInt)face->root.num_glyphs )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    stream = face->root.stream;\n\n    if ( glyph_index > 0 )\n      glyph_index--;\n\n    metric = face->metrics + glyph_index;\n\n    bitmap->rows       = metric->ascent + metric->descent;\n    bitmap->width      = metric->rightSideBearing - metric->leftSideBearing;\n    bitmap->num_grays  = 1;\n    bitmap->pixel_mode = FT_PIXEL_MODE_MONO;\n\n    FT_TRACE6(( \"BIT_ORDER %d ; BYTE_ORDER %d ; GLYPH_PAD %d\\n\",\n                  PCF_BIT_ORDER( face->bitmapsFormat ),\n                  PCF_BYTE_ORDER( face->bitmapsFormat ),\n                  PCF_GLYPH_PAD( face->bitmapsFormat ) ));\n\n    switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) )\n    {\n    case 1:\n      bitmap->pitch = ( bitmap->width + 7 ) >> 3;\n      break;\n\n    case 2:\n      bitmap->pitch = ( ( bitmap->width + 15 ) >> 4 ) << 1;\n      break;\n\n    case 4:\n      bitmap->pitch = ( ( bitmap->width + 31 ) >> 5 ) << 2;\n      break;\n\n    case 8:\n      bitmap->pitch = ( ( bitmap->width + 63 ) >> 6 ) << 3;\n      break;\n\n    default:\n      return FT_THROW( Invalid_File_Format );\n    }\n\n    /* XXX: to do: are there cases that need repadding the bitmap? */\n    bytes = bitmap->pitch * bitmap->rows;\n\n    error = ft_glyphslot_alloc_bitmap( slot, bytes );\n    if ( error )\n      goto Exit;\n\n    if ( FT_STREAM_SEEK( metric->bits )          ||\n         FT_STREAM_READ( bitmap->buffer, bytes ) )\n      goto Exit;\n\n    if ( PCF_BIT_ORDER( face->bitmapsFormat ) != MSBFirst )\n      BitOrderInvert( bitmap->buffer, bytes );\n\n    if ( ( PCF_BYTE_ORDER( face->bitmapsFormat ) !=\n           PCF_BIT_ORDER( face->bitmapsFormat )  ) )\n    {\n      switch ( PCF_SCAN_UNIT( face->bitmapsFormat ) )\n      {\n      case 1:\n        break;\n\n      case 2:\n        TwoByteSwap( bitmap->buffer, bytes );\n        break;\n\n      case 4:\n        FourByteSwap( bitmap->buffer, bytes );\n        break;\n      }\n    }\n\n    slot->format      = FT_GLYPH_FORMAT_BITMAP;\n    slot->bitmap_left = metric->leftSideBearing;\n    slot->bitmap_top  = metric->ascent;\n\n    slot->metrics.horiAdvance  = metric->characterWidth << 6;\n    slot->metrics.horiBearingX = metric->leftSideBearing << 6;\n    slot->metrics.horiBearingY = metric->ascent << 6;\n    slot->metrics.width        = ( metric->rightSideBearing -\n                                   metric->leftSideBearing ) << 6;\n    slot->metrics.height       = bitmap->rows << 6;\n\n    ft_synthesize_vertical_metrics( &slot->metrics,\n                                    ( face->accel.fontAscent +\n                                      face->accel.fontDescent ) << 6 );\n\n    FT_TRACE4(( \" --- ok\\n\" ));\n\n  Exit:\n    return error;\n  }\n\n\n /*\n  *\n  *  BDF SERVICE\n  *\n  */\n\n  static FT_Error\n  pcf_get_bdf_property( PCF_Face          face,\n                        const char*       prop_name,\n                        BDF_PropertyRec  *aproperty )\n  {\n    PCF_Property  prop;\n\n\n    prop = pcf_find_property( face, prop_name );\n    if ( prop != NULL )\n    {\n      if ( prop->isString )\n      {\n        aproperty->type   = BDF_PROPERTY_TYPE_ATOM;\n        aproperty->u.atom = prop->value.atom;\n      }\n      else\n      {\n        if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) )\n        {\n          FT_TRACE1(( \"pcf_get_bdf_property: \" ));\n          FT_TRACE1(( \"too large integer 0x%x is truncated\\n\" ));\n        }\n        /* Apparently, the PCF driver loads all properties as signed integers!\n         * This really doesn't seem to be a problem, because this is\n         * sufficient for any meaningful values.\n         */\n        aproperty->type      = BDF_PROPERTY_TYPE_INTEGER;\n        aproperty->u.integer = (FT_Int32)prop->value.l;\n      }\n      return 0;\n    }\n\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  static FT_Error\n  pcf_get_charset_id( PCF_Face      face,\n                      const char*  *acharset_encoding,\n                      const char*  *acharset_registry )\n  {\n    *acharset_encoding = face->charset_encoding;\n    *acharset_registry = face->charset_registry;\n\n    return 0;\n  }\n\n\n  static const FT_Service_BDFRec  pcf_service_bdf =\n  {\n    (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id,\n    (FT_BDF_GetPropertyFunc) pcf_get_bdf_property\n  };\n\n\n /*\n  *\n  *  SERVICE LIST\n  *\n  */\n\n  static const FT_ServiceDescRec  pcf_services[] =\n  {\n    { FT_SERVICE_ID_BDF,       &pcf_service_bdf },\n    { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PCF },\n    { NULL, NULL }\n  };\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  pcf_driver_requester( FT_Module    module,\n                        const char*  name )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( pcf_services, name );\n  }\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Driver_ClassRec  pcf_driver_class =\n  {\n    {\n      FT_MODULE_FONT_DRIVER        |\n      FT_MODULE_DRIVER_NO_OUTLINES,\n      sizeof ( FT_DriverRec ),\n\n      \"pcf\",\n      0x10000L,\n      0x20000L,\n\n      0,\n\n      0,                    /* FT_Module_Constructor */\n      0,                    /* FT_Module_Destructor  */\n      pcf_driver_requester\n    },\n\n    sizeof ( PCF_FaceRec ),\n    sizeof ( FT_SizeRec ),\n    sizeof ( FT_GlyphSlotRec ),\n\n    PCF_Face_Init,\n    PCF_Face_Done,\n    0,                      /* FT_Size_InitFunc */\n    0,                      /* FT_Size_DoneFunc */\n    0,                      /* FT_Slot_InitFunc */\n    0,                      /* FT_Slot_DoneFunc */\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    ft_stub_set_char_sizes,\n    ft_stub_set_pixel_sizes,\n#endif\n    PCF_Glyph_Load,\n\n    0,                      /* FT_Face_GetKerningFunc  */\n    0,                      /* FT_Face_AttachFunc      */\n    0,                      /* FT_Face_GetAdvancesFunc */\n\n    PCF_Size_Request,\n    PCF_Size_Select\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pcf/pcfdrivr.h",
    "content": "/*  pcfdrivr.h\n\n    FreeType font driver for pcf fonts\n\n  Copyright 2000-2001, 2002 by\n  Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n\n#ifndef __PCFDRIVR_H__\n#define __PCFDRIVR_H__\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n  FT_EXPORT_VAR( const FT_Driver_ClassRec )  pcf_driver_class;\n\nFT_END_HEADER\n\n\n#endif /* __PCFDRIVR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pcf/pcferror.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pcferror.h                                                             */\n/*                                                                         */\n/*    PCF error codes (specification only).                                */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the PCF error enumeration constants.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __PCFERROR_H__\n#define __PCFERROR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  PCF_Err_\n#define FT_ERR_BASE    FT_Mod_Err_PCF\n\n#include FT_ERRORS_H\n\n#endif /* __PCFERROR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pcf/pcfread.c",
    "content": "/*  pcfread.c\n\n    FreeType font driver for pcf fonts\n\n  Copyright 2000-2010, 2012, 2013 by\n  Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n\n#include <ft2build.h>\n\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_OBJECTS_H\n\n#include \"pcf.h\"\n#include \"pcfread.h\"\n\n#include \"pcferror.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pcfread\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n  static const char* const  tableNames[] =\n  {\n    \"prop\", \"accl\", \"mtrcs\", \"bmps\", \"imtrcs\",\n    \"enc\", \"swidth\", \"names\", \"accel\"\n  };\n#endif\n\n\n  static\n  const FT_Frame_Field  pcf_toc_header[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PCF_TocRec\n\n    FT_FRAME_START( 8 ),\n      FT_FRAME_ULONG_LE( version ),\n      FT_FRAME_ULONG_LE( count ),\n    FT_FRAME_END\n  };\n\n\n  static\n  const FT_Frame_Field  pcf_table_header[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PCF_TableRec\n\n    FT_FRAME_START( 16  ),\n      FT_FRAME_ULONG_LE( type ),\n      FT_FRAME_ULONG_LE( format ),\n      FT_FRAME_ULONG_LE( size ),\n      FT_FRAME_ULONG_LE( offset ),\n    FT_FRAME_END\n  };\n\n\n  static FT_Error\n  pcf_read_TOC( FT_Stream  stream,\n                PCF_Face   face )\n  {\n    FT_Error   error;\n    PCF_Toc    toc = &face->toc;\n    PCF_Table  tables;\n\n    FT_Memory  memory = FT_FACE(face)->memory;\n    FT_UInt    n;\n\n\n    if ( FT_STREAM_SEEK ( 0 )                          ||\n         FT_STREAM_READ_FIELDS ( pcf_toc_header, toc ) )\n      return FT_THROW( Cannot_Open_Resource );\n\n    if ( toc->version != PCF_FILE_VERSION                 ||\n         toc->count   >  FT_ARRAY_MAX( face->toc.tables ) ||\n         toc->count   == 0                                )\n      return FT_THROW( Invalid_File_Format );\n\n    if ( FT_NEW_ARRAY( face->toc.tables, toc->count ) )\n      return FT_THROW( Out_Of_Memory );\n\n    tables = face->toc.tables;\n    for ( n = 0; n < toc->count; n++ )\n    {\n      if ( FT_STREAM_READ_FIELDS( pcf_table_header, tables ) )\n        goto Exit;\n      tables++;\n    }\n\n    /* Sort tables and check for overlaps.  Because they are almost      */\n    /* always ordered already, an in-place bubble sort with simultaneous */\n    /* boundary checking seems appropriate.                              */\n    tables = face->toc.tables;\n\n    for ( n = 0; n < toc->count - 1; n++ )\n    {\n      FT_UInt  i, have_change;\n\n\n      have_change = 0;\n\n      for ( i = 0; i < toc->count - 1 - n; i++ )\n      {\n        PCF_TableRec  tmp;\n\n\n        if ( tables[i].offset > tables[i + 1].offset )\n        {\n          tmp           = tables[i];\n          tables[i]     = tables[i + 1];\n          tables[i + 1] = tmp;\n\n          have_change = 1;\n        }\n\n        if ( ( tables[i].size   > tables[i + 1].offset )                  ||\n             ( tables[i].offset > tables[i + 1].offset - tables[i].size ) )\n          return FT_THROW( Invalid_Offset );\n      }\n\n      if ( !have_change )\n        break;\n    }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n    {\n      FT_UInt      i, j;\n      const char*  name = \"?\";\n\n\n      FT_TRACE4(( \"pcf_read_TOC:\\n\" ));\n\n      FT_TRACE4(( \"  number of tables: %ld\\n\", face->toc.count ));\n\n      tables = face->toc.tables;\n      for ( i = 0; i < toc->count; i++ )\n      {\n        for ( j = 0; j < sizeof ( tableNames ) / sizeof ( tableNames[0] );\n              j++ )\n          if ( tables[i].type == (FT_UInt)( 1 << j ) )\n            name = tableNames[j];\n\n        FT_TRACE4(( \"  %d: type=%s, format=0x%X, \"\n                    \"size=%ld (0x%lX), offset=%ld (0x%lX)\\n\",\n                    i, name,\n                    tables[i].format,\n                    tables[i].size, tables[i].size,\n                    tables[i].offset, tables[i].offset ));\n      }\n    }\n\n#endif\n\n    return FT_Err_Ok;\n\n  Exit:\n    FT_FREE( face->toc.tables );\n    return error;\n  }\n\n\n#define PCF_METRIC_SIZE  12\n\n  static\n  const FT_Frame_Field  pcf_metric_header[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PCF_MetricRec\n\n    FT_FRAME_START( PCF_METRIC_SIZE ),\n      FT_FRAME_SHORT_LE( leftSideBearing ),\n      FT_FRAME_SHORT_LE( rightSideBearing ),\n      FT_FRAME_SHORT_LE( characterWidth ),\n      FT_FRAME_SHORT_LE( ascent ),\n      FT_FRAME_SHORT_LE( descent ),\n      FT_FRAME_SHORT_LE( attributes ),\n    FT_FRAME_END\n  };\n\n\n  static\n  const FT_Frame_Field  pcf_metric_msb_header[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PCF_MetricRec\n\n    FT_FRAME_START( PCF_METRIC_SIZE ),\n      FT_FRAME_SHORT( leftSideBearing ),\n      FT_FRAME_SHORT( rightSideBearing ),\n      FT_FRAME_SHORT( characterWidth ),\n      FT_FRAME_SHORT( ascent ),\n      FT_FRAME_SHORT( descent ),\n      FT_FRAME_SHORT( attributes ),\n    FT_FRAME_END\n  };\n\n\n#define PCF_COMPRESSED_METRIC_SIZE  5\n\n  static\n  const FT_Frame_Field  pcf_compressed_metric_header[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PCF_Compressed_MetricRec\n\n    FT_FRAME_START( PCF_COMPRESSED_METRIC_SIZE ),\n      FT_FRAME_BYTE( leftSideBearing ),\n      FT_FRAME_BYTE( rightSideBearing ),\n      FT_FRAME_BYTE( characterWidth ),\n      FT_FRAME_BYTE( ascent ),\n      FT_FRAME_BYTE( descent ),\n    FT_FRAME_END\n  };\n\n\n  static FT_Error\n  pcf_get_metric( FT_Stream   stream,\n                  FT_ULong    format,\n                  PCF_Metric  metric )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )\n    {\n      const FT_Frame_Field*  fields;\n\n\n      /* parsing normal metrics */\n      fields = PCF_BYTE_ORDER( format ) == MSBFirst\n               ? pcf_metric_msb_header\n               : pcf_metric_header;\n\n      /* the following sets `error' but doesn't return in case of failure */\n      (void)FT_STREAM_READ_FIELDS( fields, metric );\n    }\n    else\n    {\n      PCF_Compressed_MetricRec  compr;\n\n\n      /* parsing compressed metrics */\n      if ( FT_STREAM_READ_FIELDS( pcf_compressed_metric_header, &compr ) )\n        goto Exit;\n\n      metric->leftSideBearing  = (FT_Short)( compr.leftSideBearing  - 0x80 );\n      metric->rightSideBearing = (FT_Short)( compr.rightSideBearing - 0x80 );\n      metric->characterWidth   = (FT_Short)( compr.characterWidth   - 0x80 );\n      metric->ascent           = (FT_Short)( compr.ascent           - 0x80 );\n      metric->descent          = (FT_Short)( compr.descent          - 0x80 );\n      metric->attributes       = 0;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  pcf_seek_to_table_type( FT_Stream  stream,\n                          PCF_Table  tables,\n                          FT_ULong   ntables, /* same as PCF_Toc->count */\n                          FT_ULong   type,\n                          FT_ULong  *aformat,\n                          FT_ULong  *asize )\n  {\n    FT_Error  error = FT_ERR( Invalid_File_Format );\n    FT_ULong  i;\n\n\n    for ( i = 0; i < ntables; i++ )\n      if ( tables[i].type == type )\n      {\n        if ( stream->pos > tables[i].offset )\n        {\n          error = FT_THROW( Invalid_Stream_Skip );\n          goto Fail;\n        }\n\n        if ( FT_STREAM_SKIP( tables[i].offset - stream->pos ) )\n        {\n          error = FT_THROW( Invalid_Stream_Skip );\n          goto Fail;\n        }\n\n        *asize   = tables[i].size;\n        *aformat = tables[i].format;\n\n        return FT_Err_Ok;\n      }\n\n  Fail:\n    *asize = 0;\n    return error;\n  }\n\n\n  static FT_Bool\n  pcf_has_table_type( PCF_Table  tables,\n                      FT_ULong   ntables, /* same as PCF_Toc->count */\n                      FT_ULong   type )\n  {\n    FT_ULong  i;\n\n\n    for ( i = 0; i < ntables; i++ )\n      if ( tables[i].type == type )\n        return TRUE;\n\n    return FALSE;\n  }\n\n\n#define PCF_PROPERTY_SIZE  9\n\n  static\n  const FT_Frame_Field  pcf_property_header[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PCF_ParsePropertyRec\n\n    FT_FRAME_START( PCF_PROPERTY_SIZE ),\n      FT_FRAME_LONG_LE( name ),\n      FT_FRAME_BYTE   ( isString ),\n      FT_FRAME_LONG_LE( value ),\n    FT_FRAME_END\n  };\n\n\n  static\n  const FT_Frame_Field  pcf_property_msb_header[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PCF_ParsePropertyRec\n\n    FT_FRAME_START( PCF_PROPERTY_SIZE ),\n      FT_FRAME_LONG( name ),\n      FT_FRAME_BYTE( isString ),\n      FT_FRAME_LONG( value ),\n    FT_FRAME_END\n  };\n\n\n  FT_LOCAL_DEF( PCF_Property )\n  pcf_find_property( PCF_Face          face,\n                     const FT_String*  prop )\n  {\n    PCF_Property  properties = face->properties;\n    FT_Bool       found      = 0;\n    int           i;\n\n\n    for ( i = 0 ; i < face->nprops && !found; i++ )\n    {\n      if ( !ft_strcmp( properties[i].name, prop ) )\n        found = 1;\n    }\n\n    if ( found )\n      return properties + i - 1;\n    else\n      return NULL;\n  }\n\n\n  static FT_Error\n  pcf_get_properties( FT_Stream  stream,\n                      PCF_Face   face )\n  {\n    PCF_ParseProperty  props      = 0;\n    PCF_Property       properties = NULL;\n    FT_ULong           nprops, i;\n    FT_ULong           format, size;\n    FT_Error           error;\n    FT_Memory          memory     = FT_FACE(face)->memory;\n    FT_ULong           string_size;\n    FT_String*         strings    = 0;\n\n\n    error = pcf_seek_to_table_type( stream,\n                                    face->toc.tables,\n                                    face->toc.count,\n                                    PCF_PROPERTIES,\n                                    &format,\n                                    &size );\n    if ( error )\n      goto Bail;\n\n    if ( FT_READ_ULONG_LE( format ) )\n      goto Bail;\n\n    FT_TRACE4(( \"pcf_get_properties:\\n\" ));\n\n    FT_TRACE4(( \"  format = %ld\\n\", format ));\n\n    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )\n      goto Bail;\n\n    if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n      (void)FT_READ_ULONG( nprops );\n    else\n      (void)FT_READ_ULONG_LE( nprops );\n    if ( error )\n      goto Bail;\n\n    FT_TRACE4(( \"  nprop = %d (truncate %d props)\\n\",\n                (int)nprops, nprops - (int)nprops ));\n\n    nprops = (int)nprops;\n\n    /* rough estimate */\n    if ( nprops > size / PCF_PROPERTY_SIZE )\n    {\n      error = FT_THROW( Invalid_Table );\n      goto Bail;\n    }\n\n    face->nprops = (int)nprops;\n\n    if ( FT_NEW_ARRAY( props, nprops ) )\n      goto Bail;\n\n    for ( i = 0; i < nprops; i++ )\n    {\n      if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n      {\n        if ( FT_STREAM_READ_FIELDS( pcf_property_msb_header, props + i ) )\n          goto Bail;\n      }\n      else\n      {\n        if ( FT_STREAM_READ_FIELDS( pcf_property_header, props + i ) )\n          goto Bail;\n      }\n    }\n\n    /* pad the property array                                            */\n    /*                                                                   */\n    /* clever here - nprops is the same as the number of odd-units read, */\n    /* as only isStringProp are odd length   (Keith Packard)             */\n    /*                                                                   */\n    if ( nprops & 3 )\n    {\n      i = 4 - ( nprops & 3 );\n      if ( FT_STREAM_SKIP( i ) )\n      {\n        error = FT_THROW( Invalid_Stream_Skip );\n        goto Bail;\n      }\n    }\n\n    if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n      (void)FT_READ_ULONG( string_size );\n    else\n      (void)FT_READ_ULONG_LE( string_size );\n    if ( error )\n      goto Bail;\n\n    FT_TRACE4(( \"  string_size = %ld\\n\", string_size ));\n\n    /* rough estimate */\n    if ( string_size > size - nprops * PCF_PROPERTY_SIZE )\n    {\n      error = FT_THROW( Invalid_Table );\n      goto Bail;\n    }\n\n    /* allocate one more byte so that we have a final null byte */\n    if ( FT_NEW_ARRAY( strings, string_size + 1 ) )\n      goto Bail;\n\n    error = FT_Stream_Read( stream, (FT_Byte*)strings, string_size );\n    if ( error )\n      goto Bail;\n\n    if ( FT_NEW_ARRAY( properties, nprops ) )\n      goto Bail;\n\n    face->properties = properties;\n\n    for ( i = 0; i < nprops; i++ )\n    {\n      FT_Long  name_offset = props[i].name;\n\n\n      if ( ( name_offset < 0 )                     ||\n           ( (FT_ULong)name_offset > string_size ) )\n      {\n        error = FT_THROW( Invalid_Offset );\n        goto Bail;\n      }\n\n      if ( FT_STRDUP( properties[i].name, strings + name_offset ) )\n        goto Bail;\n\n      FT_TRACE4(( \"  %s:\", properties[i].name ));\n\n      properties[i].isString = props[i].isString;\n\n      if ( props[i].isString )\n      {\n        FT_Long  value_offset = props[i].value;\n\n\n        if ( ( value_offset < 0 )                     ||\n             ( (FT_ULong)value_offset > string_size ) )\n        {\n          error = FT_THROW( Invalid_Offset );\n          goto Bail;\n        }\n\n        if ( FT_STRDUP( properties[i].value.atom, strings + value_offset ) )\n          goto Bail;\n\n        FT_TRACE4(( \" `%s'\\n\", properties[i].value.atom ));\n      }\n      else\n      {\n        properties[i].value.l = props[i].value;\n\n        FT_TRACE4(( \" %d\\n\", properties[i].value.l ));\n      }\n    }\n\n    error = FT_Err_Ok;\n\n  Bail:\n    FT_FREE( props );\n    FT_FREE( strings );\n\n    return error;\n  }\n\n\n  static FT_Error\n  pcf_get_metrics( FT_Stream  stream,\n                   PCF_Face   face )\n  {\n    FT_Error    error    = FT_Err_Ok;\n    FT_Memory   memory   = FT_FACE(face)->memory;\n    FT_ULong    format, size;\n    PCF_Metric  metrics  = 0;\n    FT_ULong    nmetrics, i;\n\n\n    error = pcf_seek_to_table_type( stream,\n                                    face->toc.tables,\n                                    face->toc.count,\n                                    PCF_METRICS,\n                                    &format,\n                                    &size );\n    if ( error )\n      return error;\n\n    if ( FT_READ_ULONG_LE( format ) )\n      goto Bail;\n\n    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT )     &&\n         !PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) )\n      return FT_THROW( Invalid_File_Format );\n\n    if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )\n    {\n      if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n        (void)FT_READ_ULONG( nmetrics );\n      else\n        (void)FT_READ_ULONG_LE( nmetrics );\n    }\n    else\n    {\n      if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n        (void)FT_READ_USHORT( nmetrics );\n      else\n        (void)FT_READ_USHORT_LE( nmetrics );\n    }\n    if ( error )\n      return FT_THROW( Invalid_File_Format );\n\n    face->nmetrics = nmetrics;\n\n    if ( !nmetrics )\n      return FT_THROW( Invalid_Table );\n\n    FT_TRACE4(( \"pcf_get_metrics:\\n\" ));\n\n    FT_TRACE4(( \"  number of metrics: %d\\n\", nmetrics ));\n\n    /* rough estimate */\n    if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )\n    {\n      if ( nmetrics > size / PCF_METRIC_SIZE )\n        return FT_THROW( Invalid_Table );\n    }\n    else\n    {\n      if ( nmetrics > size / PCF_COMPRESSED_METRIC_SIZE )\n        return FT_THROW( Invalid_Table );\n    }\n\n    if ( FT_NEW_ARRAY( face->metrics, nmetrics ) )\n      return FT_THROW( Out_Of_Memory );\n\n    metrics = face->metrics;\n    for ( i = 0; i < nmetrics; i++ )\n    {\n      error = pcf_get_metric( stream, format, metrics + i );\n\n      metrics[i].bits = 0;\n\n      FT_TRACE5(( \"  idx %d: width=%d, \"\n                  \"lsb=%d, rsb=%d, ascent=%d, descent=%d, swidth=%d\\n\",\n                  i,\n                  ( metrics + i )->characterWidth,\n                  ( metrics + i )->leftSideBearing,\n                  ( metrics + i )->rightSideBearing,\n                  ( metrics + i )->ascent,\n                  ( metrics + i )->descent,\n                  ( metrics + i )->attributes ));\n\n      if ( error )\n        break;\n    }\n\n    if ( error )\n      FT_FREE( face->metrics );\n\n  Bail:\n    return error;\n  }\n\n\n  static FT_Error\n  pcf_get_bitmaps( FT_Stream  stream,\n                   PCF_Face   face )\n  {\n    FT_Error   error   = FT_Err_Ok;\n    FT_Memory  memory  = FT_FACE(face)->memory;\n    FT_Long*   offsets = NULL;\n    FT_Long    bitmapSizes[GLYPHPADOPTIONS];\n    FT_ULong   format, size;\n    FT_ULong   nbitmaps, i, sizebitmaps = 0;\n\n\n    error = pcf_seek_to_table_type( stream,\n                                    face->toc.tables,\n                                    face->toc.count,\n                                    PCF_BITMAPS,\n                                    &format,\n                                    &size );\n    if ( error )\n      return error;\n\n    error = FT_Stream_EnterFrame( stream, 8 );\n    if ( error )\n      return error;\n\n    format = FT_GET_ULONG_LE();\n    if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n      nbitmaps  = FT_GET_ULONG();\n    else\n      nbitmaps  = FT_GET_ULONG_LE();\n\n    FT_Stream_ExitFrame( stream );\n\n    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )\n      return FT_THROW( Invalid_File_Format );\n\n    FT_TRACE4(( \"pcf_get_bitmaps:\\n\" ));\n\n    FT_TRACE4(( \"  number of bitmaps: %d\\n\", nbitmaps ));\n\n    /* XXX: PCF_Face->nmetrics is singed FT_Long, see pcf.h */\n    if ( face->nmetrics < 0 || nbitmaps != ( FT_ULong )face->nmetrics )\n      return FT_THROW( Invalid_File_Format );\n\n    if ( FT_NEW_ARRAY( offsets, nbitmaps ) )\n      return error;\n\n    for ( i = 0; i < nbitmaps; i++ )\n    {\n      if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n        (void)FT_READ_LONG( offsets[i] );\n      else\n        (void)FT_READ_LONG_LE( offsets[i] );\n\n      FT_TRACE5(( \"  bitmap %d: offset %ld (0x%lX)\\n\",\n                  i, offsets[i], offsets[i] ));\n    }\n    if ( error )\n      goto Bail;\n\n    for ( i = 0; i < GLYPHPADOPTIONS; i++ )\n    {\n      if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n        (void)FT_READ_LONG( bitmapSizes[i] );\n      else\n        (void)FT_READ_LONG_LE( bitmapSizes[i] );\n      if ( error )\n        goto Bail;\n\n      sizebitmaps = bitmapSizes[PCF_GLYPH_PAD_INDEX( format )];\n\n      FT_TRACE4(( \"  padding %d implies a size of %ld\\n\", i, bitmapSizes[i] ));\n    }\n\n    FT_TRACE4(( \"  %d bitmaps, padding index %ld\\n\",\n                nbitmaps,\n                PCF_GLYPH_PAD_INDEX( format ) ));\n    FT_TRACE4(( \"  bitmap size = %d\\n\", sizebitmaps ));\n\n    FT_UNUSED( sizebitmaps );       /* only used for debugging */\n\n    for ( i = 0; i < nbitmaps; i++ )\n    {\n      /* rough estimate */\n      if ( ( offsets[i] < 0 )              ||\n           ( (FT_ULong)offsets[i] > size ) )\n      {\n        FT_TRACE0(( \"pcf_get_bitmaps:\"\n                    \" invalid offset to bitmap data of glyph %d\\n\", i ));\n      }\n      else\n        face->metrics[i].bits = stream->pos + offsets[i];\n    }\n\n    face->bitmapsFormat = format;\n\n  Bail:\n    FT_FREE( offsets );\n    return error;\n  }\n\n\n  static FT_Error\n  pcf_get_encodings( FT_Stream  stream,\n                     PCF_Face   face )\n  {\n    FT_Error      error  = FT_Err_Ok;\n    FT_Memory     memory = FT_FACE(face)->memory;\n    FT_ULong      format, size;\n    int           firstCol, lastCol;\n    int           firstRow, lastRow;\n    int           nencoding, encodingOffset;\n    int           i, j, k;\n    PCF_Encoding  encoding = NULL;\n\n\n    error = pcf_seek_to_table_type( stream,\n                                    face->toc.tables,\n                                    face->toc.count,\n                                    PCF_BDF_ENCODINGS,\n                                    &format,\n                                    &size );\n    if ( error )\n      return error;\n\n    error = FT_Stream_EnterFrame( stream, 14 );\n    if ( error )\n      return error;\n\n    format = FT_GET_ULONG_LE();\n\n    if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n    {\n      firstCol          = FT_GET_SHORT();\n      lastCol           = FT_GET_SHORT();\n      firstRow          = FT_GET_SHORT();\n      lastRow           = FT_GET_SHORT();\n      face->defaultChar = FT_GET_SHORT();\n    }\n    else\n    {\n      firstCol          = FT_GET_SHORT_LE();\n      lastCol           = FT_GET_SHORT_LE();\n      firstRow          = FT_GET_SHORT_LE();\n      lastRow           = FT_GET_SHORT_LE();\n      face->defaultChar = FT_GET_SHORT_LE();\n    }\n\n    FT_Stream_ExitFrame( stream );\n\n    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )\n      return FT_THROW( Invalid_File_Format );\n\n    FT_TRACE4(( \"pdf_get_encodings:\\n\" ));\n\n    FT_TRACE4(( \"  firstCol %d, lastCol %d, firstRow %d, lastRow %d\\n\",\n                firstCol, lastCol, firstRow, lastRow ));\n\n    nencoding = ( lastCol - firstCol + 1 ) * ( lastRow - firstRow + 1 );\n\n    if ( FT_NEW_ARRAY( encoding, nencoding ) )\n      return FT_THROW( Out_Of_Memory );\n\n    error = FT_Stream_EnterFrame( stream, 2 * nencoding );\n    if ( error )\n      goto Bail;\n\n    k = 0;\n    for ( i = firstRow; i <= lastRow; i++ )\n    {\n      for ( j = firstCol; j <= lastCol; j++ )\n      {\n        if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n          encodingOffset = FT_GET_SHORT();\n        else\n          encodingOffset = FT_GET_SHORT_LE();\n\n        if ( encodingOffset != -1 )\n        {\n          encoding[k].enc   = i * 256 + j;\n          encoding[k].glyph = (FT_Short)encodingOffset;\n\n          FT_TRACE5(( \"  code %d (0x%04X): idx %d\\n\",\n                      encoding[k].enc, encoding[k].enc, encoding[k].glyph ));\n\n          k++;\n        }\n      }\n    }\n    FT_Stream_ExitFrame( stream );\n\n    if ( FT_RENEW_ARRAY( encoding, nencoding, k ) )\n      goto Bail;\n\n    face->nencodings = k;\n    face->encodings  = encoding;\n\n    return error;\n\n  Bail:\n    FT_FREE( encoding );\n    return error;\n  }\n\n\n  static\n  const FT_Frame_Field  pcf_accel_header[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PCF_AccelRec\n\n    FT_FRAME_START( 20 ),\n      FT_FRAME_BYTE      ( noOverlap ),\n      FT_FRAME_BYTE      ( constantMetrics ),\n      FT_FRAME_BYTE      ( terminalFont ),\n      FT_FRAME_BYTE      ( constantWidth ),\n      FT_FRAME_BYTE      ( inkInside ),\n      FT_FRAME_BYTE      ( inkMetrics ),\n      FT_FRAME_BYTE      ( drawDirection ),\n      FT_FRAME_SKIP_BYTES( 1 ),\n      FT_FRAME_LONG_LE   ( fontAscent ),\n      FT_FRAME_LONG_LE   ( fontDescent ),\n      FT_FRAME_LONG_LE   ( maxOverlap ),\n    FT_FRAME_END\n  };\n\n\n  static\n  const FT_Frame_Field  pcf_accel_msb_header[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PCF_AccelRec\n\n    FT_FRAME_START( 20 ),\n      FT_FRAME_BYTE      ( noOverlap ),\n      FT_FRAME_BYTE      ( constantMetrics ),\n      FT_FRAME_BYTE      ( terminalFont ),\n      FT_FRAME_BYTE      ( constantWidth ),\n      FT_FRAME_BYTE      ( inkInside ),\n      FT_FRAME_BYTE      ( inkMetrics ),\n      FT_FRAME_BYTE      ( drawDirection ),\n      FT_FRAME_SKIP_BYTES( 1 ),\n      FT_FRAME_LONG      ( fontAscent ),\n      FT_FRAME_LONG      ( fontDescent ),\n      FT_FRAME_LONG      ( maxOverlap ),\n    FT_FRAME_END\n  };\n\n\n  static FT_Error\n  pcf_get_accel( FT_Stream  stream,\n                 PCF_Face   face,\n                 FT_ULong   type )\n  {\n    FT_ULong   format, size;\n    FT_Error   error = FT_Err_Ok;\n    PCF_Accel  accel = &face->accel;\n\n\n    error = pcf_seek_to_table_type( stream,\n                                    face->toc.tables,\n                                    face->toc.count,\n                                    type,\n                                    &format,\n                                    &size );\n    if ( error )\n      goto Bail;\n\n    if ( FT_READ_ULONG_LE( format ) )\n      goto Bail;\n\n    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT )    &&\n         !PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) )\n      goto Bail;\n\n    if ( PCF_BYTE_ORDER( format ) == MSBFirst )\n    {\n      if ( FT_STREAM_READ_FIELDS( pcf_accel_msb_header, accel ) )\n        goto Bail;\n    }\n    else\n    {\n      if ( FT_STREAM_READ_FIELDS( pcf_accel_header, accel ) )\n        goto Bail;\n    }\n\n    error = pcf_get_metric( stream,\n                            format & ( ~PCF_FORMAT_MASK ),\n                            &(accel->minbounds) );\n    if ( error )\n      goto Bail;\n\n    error = pcf_get_metric( stream,\n                            format & ( ~PCF_FORMAT_MASK ),\n                            &(accel->maxbounds) );\n    if ( error )\n      goto Bail;\n\n    if ( PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) )\n    {\n      error = pcf_get_metric( stream,\n                              format & ( ~PCF_FORMAT_MASK ),\n                              &(accel->ink_minbounds) );\n      if ( error )\n        goto Bail;\n\n      error = pcf_get_metric( stream,\n                              format & ( ~PCF_FORMAT_MASK ),\n                              &(accel->ink_maxbounds) );\n      if ( error )\n        goto Bail;\n    }\n    else\n    {\n      accel->ink_minbounds = accel->minbounds; /* I'm not sure about this */\n      accel->ink_maxbounds = accel->maxbounds;\n    }\n\n  Bail:\n    return error;\n  }\n\n\n  static FT_Error\n  pcf_interpret_style( PCF_Face  pcf )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    FT_Face    face   = FT_FACE( pcf );\n    FT_Memory  memory = face->memory;\n\n    PCF_Property  prop;\n\n    size_t  nn, len;\n    char*   strings[4] = { NULL, NULL, NULL, NULL };\n    size_t  lengths[4];\n\n\n    face->style_flags = 0;\n\n    prop = pcf_find_property( pcf, \"SLANT\" );\n    if ( prop && prop->isString                                       &&\n         ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ||\n           *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) )\n    {\n      face->style_flags |= FT_STYLE_FLAG_ITALIC;\n      strings[2] = ( *(prop->value.atom) == 'O' ||\n                     *(prop->value.atom) == 'o' ) ? (char *)\"Oblique\"\n                                                  : (char *)\"Italic\";\n    }\n\n    prop = pcf_find_property( pcf, \"WEIGHT_NAME\" );\n    if ( prop && prop->isString                                       &&\n         ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) )\n    {\n      face->style_flags |= FT_STYLE_FLAG_BOLD;\n      strings[1] = (char *)\"Bold\";\n    }\n\n    prop = pcf_find_property( pcf, \"SETWIDTH_NAME\" );\n    if ( prop && prop->isString                                        &&\n         *(prop->value.atom)                                           &&\n         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )\n      strings[3] = (char *)(prop->value.atom);\n\n    prop = pcf_find_property( pcf, \"ADD_STYLE_NAME\" );\n    if ( prop && prop->isString                                        &&\n         *(prop->value.atom)                                           &&\n         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )\n      strings[0] = (char *)(prop->value.atom);\n\n    for ( len = 0, nn = 0; nn < 4; nn++ )\n    {\n      lengths[nn] = 0;\n      if ( strings[nn] )\n      {\n        lengths[nn] = ft_strlen( strings[nn] );\n        len        += lengths[nn] + 1;\n      }\n    }\n\n    if ( len == 0 )\n    {\n      strings[0] = (char *)\"Regular\";\n      lengths[0] = ft_strlen( strings[0] );\n      len        = lengths[0] + 1;\n    }\n\n    {\n      char*  s;\n\n\n      if ( FT_ALLOC( face->style_name, len ) )\n        return error;\n\n      s = face->style_name;\n\n      for ( nn = 0; nn < 4; nn++ )\n      {\n        char*  src = strings[nn];\n\n\n        len = lengths[nn];\n\n        if ( src == NULL )\n          continue;\n\n        /* separate elements with a space */\n        if ( s != face->style_name )\n          *s++ = ' ';\n\n        ft_memcpy( s, src, len );\n\n        /* need to convert spaces to dashes for */\n        /* add_style_name and setwidth_name     */\n        if ( nn == 0 || nn == 3 )\n        {\n          size_t  mm;\n\n\n          for ( mm = 0; mm < len; mm++ )\n            if (s[mm] == ' ')\n              s[mm] = '-';\n        }\n\n        s += len;\n      }\n      *s = 0;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pcf_load_font( FT_Stream  stream,\n                 PCF_Face   face )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    FT_Memory  memory = FT_FACE(face)->memory;\n    FT_Bool    hasBDFAccelerators;\n\n\n    error = pcf_read_TOC( stream, face );\n    if ( error )\n      goto Exit;\n\n    error = pcf_get_properties( stream, face );\n    if ( error )\n      goto Exit;\n\n    /* Use the old accelerators if no BDF accelerators are in the file. */\n    hasBDFAccelerators = pcf_has_table_type( face->toc.tables,\n                                             face->toc.count,\n                                             PCF_BDF_ACCELERATORS );\n    if ( !hasBDFAccelerators )\n    {\n      error = pcf_get_accel( stream, face, PCF_ACCELERATORS );\n      if ( error )\n        goto Exit;\n    }\n\n    /* metrics */\n    error = pcf_get_metrics( stream, face );\n    if ( error )\n      goto Exit;\n\n    /* bitmaps */\n    error = pcf_get_bitmaps( stream, face );\n    if ( error )\n      goto Exit;\n\n    /* encodings */\n    error = pcf_get_encodings( stream, face );\n    if ( error )\n      goto Exit;\n\n    /* BDF style accelerators (i.e. bounds based on encoded glyphs) */\n    if ( hasBDFAccelerators )\n    {\n      error = pcf_get_accel( stream, face, PCF_BDF_ACCELERATORS );\n      if ( error )\n        goto Exit;\n    }\n\n    /* XXX: TO DO: inkmetrics and glyph_names are missing */\n\n    /* now construct the face object */\n    {\n      FT_Face       root = FT_FACE( face );\n      PCF_Property  prop;\n\n\n      root->num_faces  = 1;\n      root->face_index = 0;\n      root->face_flags = FT_FACE_FLAG_FIXED_SIZES |\n                         FT_FACE_FLAG_HORIZONTAL  |\n                         FT_FACE_FLAG_FAST_GLYPHS;\n\n      if ( face->accel.constantWidth )\n        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      if ( ( error = pcf_interpret_style( face ) ) != 0 )\n         goto Exit;\n\n      prop = pcf_find_property( face, \"FAMILY_NAME\" );\n      if ( prop && prop->isString )\n      {\n        if ( FT_STRDUP( root->family_name, prop->value.atom ) )\n          goto Exit;\n      }\n      else\n        root->family_name = NULL;\n\n      /*\n       * Note: We shift all glyph indices by +1 since we must\n       * respect the convention that glyph 0 always corresponds\n       * to the `missing glyph'.\n       *\n       * This implies bumping the number of `available' glyphs by 1.\n       */\n      root->num_glyphs = face->nmetrics + 1;\n\n      root->num_fixed_sizes = 1;\n      if ( FT_NEW_ARRAY( root->available_sizes, 1 ) )\n        goto Exit;\n\n      {\n        FT_Bitmap_Size*  bsize = root->available_sizes;\n        FT_Short         resolution_x = 0, resolution_y = 0;\n\n\n        FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) );\n\n#if 0\n        bsize->height = face->accel.maxbounds.ascent << 6;\n#endif\n        bsize->height = (FT_Short)( face->accel.fontAscent +\n                                    face->accel.fontDescent );\n\n        prop = pcf_find_property( face, \"AVERAGE_WIDTH\" );\n        if ( prop )\n          bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 );\n        else\n          bsize->width = (FT_Short)( bsize->height * 2/3 );\n\n        prop = pcf_find_property( face, \"POINT_SIZE\" );\n        if ( prop )\n          /* convert from 722.7 decipoints to 72 points per inch */\n          bsize->size =\n            (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L );\n\n        prop = pcf_find_property( face, \"PIXEL_SIZE\" );\n        if ( prop )\n          bsize->y_ppem = (FT_Short)prop->value.l << 6;\n\n        prop = pcf_find_property( face, \"RESOLUTION_X\" );\n        if ( prop )\n          resolution_x = (FT_Short)prop->value.l;\n\n        prop = pcf_find_property( face, \"RESOLUTION_Y\" );\n        if ( prop )\n          resolution_y = (FT_Short)prop->value.l;\n\n        if ( bsize->y_ppem == 0 )\n        {\n          bsize->y_ppem = bsize->size;\n          if ( resolution_y )\n            bsize->y_ppem = bsize->y_ppem * resolution_y / 72;\n        }\n        if ( resolution_x && resolution_y )\n          bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y;\n        else\n          bsize->x_ppem = bsize->y_ppem;\n      }\n\n      /* set up charset */\n      {\n        PCF_Property  charset_registry = 0, charset_encoding = 0;\n\n\n        charset_registry = pcf_find_property( face, \"CHARSET_REGISTRY\" );\n        charset_encoding = pcf_find_property( face, \"CHARSET_ENCODING\" );\n\n        if ( charset_registry && charset_registry->isString &&\n             charset_encoding && charset_encoding->isString )\n        {\n          if ( FT_STRDUP( face->charset_encoding,\n                          charset_encoding->value.atom ) ||\n               FT_STRDUP( face->charset_registry,\n                          charset_registry->value.atom ) )\n            goto Exit;\n        }\n      }\n    }\n\n  Exit:\n    if ( error )\n    {\n      /* This is done to respect the behaviour of the original */\n      /* PCF font driver.                                      */\n      error = FT_THROW( Invalid_File_Format );\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pcf/pcfread.h",
    "content": "/*  pcfread.h\n\n    FreeType font driver for pcf fonts\n\n  Copyright 2003 by\n  Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n\n#ifndef __PCFREAD_H__\n#define __PCFREAD_H__\n\n\n#include <ft2build.h>\n\nFT_BEGIN_HEADER\n\n  FT_LOCAL( PCF_Property )\n  pcf_find_property( PCF_Face          face,\n                     const FT_String*  prop );\n\nFT_END_HEADER\n\n#endif /* __PCFREAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pcf/pcfutil.c",
    "content": "/*\n\nCopyright 1990, 1994, 1998  The Open Group\n\nPermission to use, copy, modify, distribute, and sell this software and its\ndocumentation for any purpose is hereby granted without fee, provided that\nthe above copyright notice appear in all copies and that both that\ncopyright notice and this permission notice appear in supporting\ndocumentation.\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\nAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nExcept as contained in this notice, the name of The Open Group shall not be\nused in advertising or otherwise to promote the sale, use or other dealings\nin this Software without prior written authorization from The Open Group.\n\n*/\n/* $XFree86: xc/lib/font/util/utilbitmap.c,v 1.3 1999/08/22 08:58:58 dawes Exp $ */\n\n/*\n * Author:  Keith Packard, MIT X Consortium\n */\n\n/* Modified for use with FreeType */\n\n\n#include <ft2build.h>\n#include \"pcfutil.h\"\n\n\n  /*\n   *  Invert bit order within each BYTE of an array.\n   */\n\n  FT_LOCAL_DEF( void )\n  BitOrderInvert( unsigned char*  buf,\n                  size_t          nbytes )\n  {\n    for ( ; nbytes > 0; nbytes--, buf++ )\n    {\n      unsigned int  val = *buf;\n\n\n      val = ( ( val >> 1 ) & 0x55 ) | ( ( val << 1 ) & 0xAA );\n      val = ( ( val >> 2 ) & 0x33 ) | ( ( val << 2 ) & 0xCC );\n      val = ( ( val >> 4 ) & 0x0F ) | ( ( val << 4 ) & 0xF0 );\n\n      *buf = (unsigned char)val;\n    }\n  }\n\n\n  /*\n   *  Invert byte order within each 16-bits of an array.\n   */\n\n  FT_LOCAL_DEF( void )\n  TwoByteSwap( unsigned char*  buf,\n               size_t          nbytes )\n  {\n    unsigned char  c;\n\n\n    for ( ; nbytes >= 2; nbytes -= 2, buf += 2 )\n    {\n      c      = buf[0];\n      buf[0] = buf[1];\n      buf[1] = c;\n    }\n  }\n\n  /*\n   *  Invert byte order within each 32-bits of an array.\n   */\n\n  FT_LOCAL_DEF( void )\n  FourByteSwap( unsigned char*  buf,\n                size_t          nbytes )\n  {\n    unsigned char  c;\n\n\n    for ( ; nbytes >= 4; nbytes -= 4, buf += 4 )\n    {\n      c      = buf[0];\n      buf[0] = buf[3];\n      buf[3] = c;\n\n      c      = buf[1];\n      buf[1] = buf[2];\n      buf[2] = c;\n    }\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pcf/pcfutil.h",
    "content": "/*  pcfutil.h\n\n    FreeType font driver for pcf fonts\n\n  Copyright 2000, 2001, 2004 by\n  Francesco Zappa Nardelli\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n\n#ifndef __PCFUTIL_H__\n#define __PCFUTIL_H__\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n\n\nFT_BEGIN_HEADER\n\n  FT_LOCAL( void )\n  BitOrderInvert( unsigned char*  buf,\n                  size_t          nbytes );\n\n  FT_LOCAL( void )\n  TwoByteSwap( unsigned char*  buf,\n               size_t          nbytes );\n\n  FT_LOCAL( void )\n  FourByteSwap( unsigned char*  buf,\n                size_t          nbytes );\n\nFT_END_HEADER\n\n#endif /* __PCFUTIL_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pcf/rules.mk",
    "content": "#\n# FreeType 2 pcf driver configuration rules\n#\n\n\n# Copyright (C) 2000, 2001, 2003, 2008 by\n# Francesco Zappa Nardelli\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n\n\n# pcf driver directory\n#\nPCF_DIR := $(SRC_DIR)/pcf\n\n\nPCF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PCF_DIR))\n\n\n# pcf driver sources (i.e., C files)\n#\nPCF_DRV_SRC := $(PCF_DIR)/pcfdrivr.c \\\n               $(PCF_DIR)/pcfread.c  \\\n               $(PCF_DIR)/pcfutil.c\n\n# pcf driver headers\n#\nPCF_DRV_H := $(PCF_DRV_SRC:%.c=%.h) \\\n             $(PCF_DIR)/pcf.h       \\\n             $(PCF_DIR)/pcferror.h\n\n# pcf driver object(s)\n#\n#   PCF_DRV_OBJ_M is used during `multi' builds\n#   PCF_DRV_OBJ_S is used during `single' builds\n#\nPCF_DRV_OBJ_M := $(PCF_DRV_SRC:$(PCF_DIR)/%.c=$(OBJ_DIR)/%.$O)\nPCF_DRV_OBJ_S := $(OBJ_DIR)/pcf.$O\n\n# pcf driver source file for single build\n#\nPCF_DRV_SRC_S := $(PCF_DIR)/pcf.c\n\n\n# pcf driver - single object\n#\n$(PCF_DRV_OBJ_S): $(PCF_DRV_SRC_S) $(PCF_DRV_SRC) $(FREETYPE_H) $(PCF_DRV_H)\n\t$(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PCF_DRV_SRC_S))\n\n\n# pcf driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(PCF_DIR)/%.c $(FREETYPE_H) $(PCF_DRV_H)\n\t$(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(PCF_DRV_OBJ_S)\nDRV_OBJS_M += $(PCF_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/pfr/Jamfile",
    "content": "# FreeType 2 src/pfr Jamfile\n#\n# Copyright 2002 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) pfr ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = pfrdrivr pfrgload pfrload pfrobjs pfrcmap pfrsbit ;\n  }\n  else\n  {\n    _sources = pfr ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/pfr Jamfile\n"
  },
  {
    "path": "libs/freetype/src/pfr/module.mk",
    "content": "#\n# FreeType 2 PFR module definition\n#\n\n\n# Copyright 2002, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += PFR_DRIVER\n\ndefine PFR_DRIVER\n$(OPEN_DRIVER) FT_Driver_ClassRec, pfr_driver_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)pfr       $(ECHO_DRIVER_DESC)PFR/TrueDoc font files with extension *.pfr$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfr.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfr.c                                                                  */\n/*                                                                         */\n/*    FreeType PFR driver component.                                       */\n/*                                                                         */\n/*  Copyright 2002 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n\n#include \"pfrload.c\"\n#include \"pfrgload.c\"\n#include \"pfrcmap.c\"\n#include \"pfrobjs.c\"\n#include \"pfrdrivr.c\"\n#include \"pfrsbit.c\"\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrcmap.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrcmap.c                                                              */\n/*                                                                         */\n/*    FreeType PFR cmap handling (body).                                   */\n/*                                                                         */\n/*  Copyright 2002, 2007, 2009, 2013 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include \"pfrcmap.h\"\n#include \"pfrobjs.h\"\n\n#include \"pfrerror.h\"\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  pfr_cmap_init( PFR_CMap  cmap )\n  {\n    FT_Error  error = FT_Err_Ok;\n    PFR_Face  face  = (PFR_Face)FT_CMAP_FACE( cmap );\n\n\n    cmap->num_chars = face->phy_font.num_chars;\n    cmap->chars     = face->phy_font.chars;\n\n    /* just for safety, check that the character entries are correctly */\n    /* sorted in increasing character code order                       */\n    {\n      FT_UInt  n;\n\n\n      for ( n = 1; n < cmap->num_chars; n++ )\n      {\n        if ( cmap->chars[n - 1].char_code >= cmap->chars[n].char_code )\n        {\n          error = FT_THROW( Invalid_Table );\n          goto Exit;\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  pfr_cmap_done( PFR_CMap  cmap )\n  {\n    cmap->chars     = NULL;\n    cmap->num_chars = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  pfr_cmap_char_index( PFR_CMap   cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_UInt   min = 0;\n    FT_UInt   max = cmap->num_chars;\n    FT_UInt   mid;\n    PFR_Char  gchar;\n\n\n    while ( min < max )\n    {\n      mid   = min + ( max - min ) / 2;\n      gchar = cmap->chars + mid;\n\n      if ( gchar->char_code == char_code )\n        return mid + 1;\n\n      if ( gchar->char_code < char_code )\n        min = mid + 1;\n      else\n        max = mid;\n    }\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  pfr_cmap_char_next( PFR_CMap    cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_UInt    result    = 0;\n    FT_UInt32  char_code = *pchar_code + 1;\n\n\n  Restart:\n    {\n      FT_UInt   min = 0;\n      FT_UInt   max = cmap->num_chars;\n      FT_UInt   mid;\n      PFR_Char  gchar;\n\n\n      while ( min < max )\n      {\n        mid   = min + ( ( max - min ) >> 1 );\n        gchar = cmap->chars + mid;\n\n        if ( gchar->char_code == char_code )\n        {\n          result = mid;\n          if ( result != 0 )\n          {\n            result++;\n            goto Exit;\n          }\n\n          char_code++;\n          goto Restart;\n        }\n\n        if ( gchar->char_code < char_code )\n          min = mid+1;\n        else\n          max = mid;\n      }\n\n      /* we didn't find it, but we have a pair just above it */\n      char_code = 0;\n\n      if ( min < cmap->num_chars )\n      {\n        gchar  = cmap->chars + min;\n        result = min;\n        if ( result != 0 )\n        {\n          result++;\n          char_code = gchar->char_code;\n        }\n      }\n    }\n\n  Exit:\n    *pchar_code = char_code;\n    return result;\n  }\n\n\n  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec\n  pfr_cmap_class_rec =\n  {\n    sizeof ( PFR_CMapRec ),\n\n    (FT_CMap_InitFunc)     pfr_cmap_init,\n    (FT_CMap_DoneFunc)     pfr_cmap_done,\n    (FT_CMap_CharIndexFunc)pfr_cmap_char_index,\n    (FT_CMap_CharNextFunc) pfr_cmap_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrcmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrcmap.h                                                              */\n/*                                                                         */\n/*    FreeType PFR cmap handling (specification).                          */\n/*                                                                         */\n/*  Copyright 2002 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PFRCMAP_H__\n#define __PFRCMAP_H__\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include \"pfrtypes.h\"\n\n\nFT_BEGIN_HEADER\n\n  typedef struct  PFR_CMapRec_\n  {\n    FT_CMapRec  cmap;\n    FT_UInt     num_chars;\n    PFR_Char    chars;\n\n  } PFR_CMapRec, *PFR_CMap;\n\n\n  FT_CALLBACK_TABLE const FT_CMap_ClassRec  pfr_cmap_class_rec;\n\nFT_END_HEADER\n\n\n#endif /* __PFRCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrdrivr.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrdrivr.c                                                             */\n/*                                                                         */\n/*    FreeType PFR driver interface (body).                                */\n/*                                                                         */\n/*  Copyright 2002-2004, 2006, 2008, 2010, 2011, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_SERVICE_PFR_H\n#include FT_SERVICE_XFREE86_NAME_H\n#include \"pfrdrivr.h\"\n#include \"pfrobjs.h\"\n\n#include \"pfrerror.h\"\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  pfr_get_kerning( FT_Face     pfrface,     /* PFR_Face */\n                   FT_UInt     left,\n                   FT_UInt     right,\n                   FT_Vector  *avector )\n  {\n    PFR_Face     face = (PFR_Face)pfrface;\n    PFR_PhyFont  phys = &face->phy_font;\n\n\n    pfr_face_get_kerning( pfrface, left, right, avector );\n\n    /* convert from metrics to outline units when necessary */\n    if ( phys->outline_resolution != phys->metrics_resolution )\n    {\n      if ( avector->x != 0 )\n        avector->x = FT_MulDiv( avector->x, phys->outline_resolution,\n                                            phys->metrics_resolution );\n\n      if ( avector->y != 0 )\n        avector->y = FT_MulDiv( avector->x, phys->outline_resolution,\n                                            phys->metrics_resolution );\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n /*\n  *  PFR METRICS SERVICE\n  *\n  */\n\n  FT_CALLBACK_DEF( FT_Error )\n  pfr_get_advance( FT_Face   pfrface,       /* PFR_Face */\n                   FT_UInt   gindex,\n                   FT_Pos   *anadvance )\n  {\n    PFR_Face  face  = (PFR_Face)pfrface;\n    FT_Error  error = FT_ERR( Invalid_Argument );\n\n\n    *anadvance = 0;\n\n    if ( !gindex )\n      goto Exit;\n\n    gindex--;\n\n    if ( face )\n    {\n      PFR_PhyFont  phys = &face->phy_font;\n\n\n      if ( gindex < phys->num_chars )\n      {\n        *anadvance = phys->chars[gindex].advance;\n        error      = FT_Err_Ok;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  pfr_get_metrics( FT_Face    pfrface,      /* PFR_Face */\n                   FT_UInt   *anoutline_resolution,\n                   FT_UInt   *ametrics_resolution,\n                   FT_Fixed  *ametrics_x_scale,\n                   FT_Fixed  *ametrics_y_scale )\n  {\n    PFR_Face     face = (PFR_Face)pfrface;\n    PFR_PhyFont  phys = &face->phy_font;\n    FT_Fixed     x_scale, y_scale;\n    FT_Size      size = face->root.size;\n\n\n    if ( anoutline_resolution )\n      *anoutline_resolution = phys->outline_resolution;\n\n    if ( ametrics_resolution )\n      *ametrics_resolution = phys->metrics_resolution;\n\n    x_scale = 0x10000L;\n    y_scale = 0x10000L;\n\n    if ( size )\n    {\n      x_scale = FT_DivFix( size->metrics.x_ppem << 6,\n                           phys->metrics_resolution );\n\n      y_scale = FT_DivFix( size->metrics.y_ppem << 6,\n                           phys->metrics_resolution );\n    }\n\n    if ( ametrics_x_scale )\n      *ametrics_x_scale = x_scale;\n\n    if ( ametrics_y_scale )\n      *ametrics_y_scale = y_scale;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Service_PfrMetricsRec  pfr_metrics_service_rec =\n  {\n    pfr_get_metrics,\n    pfr_face_get_kerning,\n    pfr_get_advance\n  };\n\n\n /*\n  *  SERVICE LIST\n  *\n  */\n\n  static const FT_ServiceDescRec  pfr_services[] =\n  {\n    { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec },\n    { FT_SERVICE_ID_XF86_NAME,   FT_XF86_FORMAT_PFR },\n    { NULL, NULL }\n  };\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  pfr_get_service( FT_Module         module,\n                   const FT_String*  service_id )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( pfr_services, service_id );\n  }\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Driver_ClassRec  pfr_driver_class =\n  {\n    {\n      FT_MODULE_FONT_DRIVER     |\n      FT_MODULE_DRIVER_SCALABLE,\n\n      sizeof ( FT_DriverRec ),\n\n      \"pfr\",\n      0x10000L,\n      0x20000L,\n\n      NULL,\n\n      0,                /* FT_Module_Constructor */\n      0,                /* FT_Module_Destructor  */\n      pfr_get_service\n    },\n\n    sizeof ( PFR_FaceRec ),\n    sizeof ( PFR_SizeRec ),\n    sizeof ( PFR_SlotRec ),\n\n    pfr_face_init,\n    pfr_face_done,\n    0,                  /* FT_Size_InitFunc */\n    0,                  /* FT_Size_DoneFunc */\n    pfr_slot_init,\n    pfr_slot_done,\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    ft_stub_set_char_sizes,\n    ft_stub_set_pixel_sizes,\n#endif\n    pfr_slot_load,\n\n    pfr_get_kerning,\n    0,                  /* FT_Face_AttachFunc      */\n    0,                  /* FT_Face_GetAdvancesFunc */\n    0,                  /* FT_Size_RequestFunc     */\n    0,                  /* FT_Size_SelectFunc      */\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrdrivr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrdrivr.h                                                             */\n/*                                                                         */\n/*    High-level Type PFR driver interface (specification).                */\n/*                                                                         */\n/*  Copyright 2002 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PFRDRIVR_H__\n#define __PFRDRIVR_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_EXPORT_VAR( const FT_Driver_ClassRec )  pfr_driver_class;\n\n\nFT_END_HEADER\n\n\n#endif /* __PFRDRIVR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrerror.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrerror.h                                                             */\n/*                                                                         */\n/*    PFR error codes (specification only).                                */\n/*                                                                         */\n/*  Copyright 2002, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the PFR error enumeration constants.      */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __PFRERROR_H__\n#define __PFRERROR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  PFR_Err_\n#define FT_ERR_BASE    FT_Mod_Err_PFR\n\n#include FT_ERRORS_H\n\n#endif /* __PFRERROR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrgload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrgload.c                                                             */\n/*                                                                         */\n/*    FreeType PFR glyph loader (body).                                    */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2005, 2007, 2010, 2013 by                        */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"pfrgload.h\"\n#include \"pfrsbit.h\"\n#include \"pfrload.h\"            /* for macro definitions */\n#include FT_INTERNAL_DEBUG_H\n\n#include \"pfrerror.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pfr\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      PFR GLYPH BUILDER                        *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( void )\n  pfr_glyph_init( PFR_Glyph       glyph,\n                  FT_GlyphLoader  loader )\n  {\n    FT_ZERO( glyph );\n\n    glyph->loader     = loader;\n    glyph->path_begun = 0;\n\n    FT_GlyphLoader_Rewind( loader );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  pfr_glyph_done( PFR_Glyph  glyph )\n  {\n    FT_Memory  memory = glyph->loader->memory;\n\n\n    FT_FREE( glyph->x_control );\n    glyph->y_control = NULL;\n\n    glyph->max_xy_control = 0;\n#if 0\n    glyph->num_x_control  = 0;\n    glyph->num_y_control  = 0;\n#endif\n\n    FT_FREE( glyph->subs );\n\n    glyph->max_subs = 0;\n    glyph->num_subs = 0;\n\n    glyph->loader     = NULL;\n    glyph->path_begun = 0;\n  }\n\n\n  /* close current contour, if any */\n  static void\n  pfr_glyph_close_contour( PFR_Glyph  glyph )\n  {\n    FT_GlyphLoader  loader  = glyph->loader;\n    FT_Outline*     outline = &loader->current.outline;\n    FT_Int          last, first;\n\n\n    if ( !glyph->path_begun )\n      return;\n\n    /* compute first and last point indices in current glyph outline */\n    last  = outline->n_points - 1;\n    first = 0;\n    if ( outline->n_contours > 0 )\n      first = outline->contours[outline->n_contours - 1];\n\n    /* if the last point falls on the same location than the first one */\n    /* we need to delete it                                            */\n    if ( last > first )\n    {\n      FT_Vector*  p1 = outline->points + first;\n      FT_Vector*  p2 = outline->points + last;\n\n\n      if ( p1->x == p2->x && p1->y == p2->y )\n      {\n        outline->n_points--;\n        last--;\n      }\n    }\n\n    /* don't add empty contours */\n    if ( last >= first )\n      outline->contours[outline->n_contours++] = (short)last;\n\n    glyph->path_begun = 0;\n  }\n\n\n  /* reset glyph to start the loading of a new glyph */\n  static void\n  pfr_glyph_start( PFR_Glyph  glyph )\n  {\n    glyph->path_begun = 0;\n  }\n\n\n  static FT_Error\n  pfr_glyph_line_to( PFR_Glyph   glyph,\n                     FT_Vector*  to )\n  {\n    FT_GlyphLoader  loader  = glyph->loader;\n    FT_Outline*     outline = &loader->current.outline;\n    FT_Error        error;\n\n\n    /* check that we have begun a new path */\n    if ( !glyph->path_begun )\n    {\n      error = FT_THROW( Invalid_Table );\n      FT_ERROR(( \"pfr_glyph_line_to: invalid glyph data\\n\" ));\n      goto Exit;\n    }\n\n    error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 0 );\n    if ( !error )\n    {\n      FT_UInt  n = outline->n_points;\n\n\n      outline->points[n] = *to;\n      outline->tags  [n] = FT_CURVE_TAG_ON;\n\n      outline->n_points++;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  pfr_glyph_curve_to( PFR_Glyph   glyph,\n                      FT_Vector*  control1,\n                      FT_Vector*  control2,\n                      FT_Vector*  to )\n  {\n    FT_GlyphLoader  loader  = glyph->loader;\n    FT_Outline*     outline = &loader->current.outline;\n    FT_Error        error;\n\n\n    /* check that we have begun a new path */\n    if ( !glyph->path_begun )\n    {\n      error = FT_THROW( Invalid_Table );\n      FT_ERROR(( \"pfr_glyph_line_to: invalid glyph data\\n\" ));\n      goto Exit;\n    }\n\n    error = FT_GLYPHLOADER_CHECK_POINTS( loader, 3, 0 );\n    if ( !error )\n    {\n      FT_Vector*  vec = outline->points         + outline->n_points;\n      FT_Byte*    tag = (FT_Byte*)outline->tags + outline->n_points;\n\n\n      vec[0] = *control1;\n      vec[1] = *control2;\n      vec[2] = *to;\n      tag[0] = FT_CURVE_TAG_CUBIC;\n      tag[1] = FT_CURVE_TAG_CUBIC;\n      tag[2] = FT_CURVE_TAG_ON;\n\n      outline->n_points = (FT_Short)( outline->n_points + 3 );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  pfr_glyph_move_to( PFR_Glyph   glyph,\n                     FT_Vector*  to )\n  {\n    FT_GlyphLoader  loader  = glyph->loader;\n    FT_Error        error;\n\n\n    /* close current contour if any */\n    pfr_glyph_close_contour( glyph );\n\n    /* indicate that a new contour has started */\n    glyph->path_begun = 1;\n\n    /* check that there is space for a new contour and a new point */\n    error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 1 );\n    if ( !error )\n      /* add new start point */\n      error = pfr_glyph_line_to( glyph, to );\n\n    return error;\n  }\n\n\n  static void\n  pfr_glyph_end( PFR_Glyph  glyph )\n  {\n    /* close current contour if any */\n    pfr_glyph_close_contour( glyph );\n\n    /* merge the current glyph into the stack */\n    FT_GlyphLoader_Add( glyph->loader );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      PFR GLYPH LOADER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* load a simple glyph */\n  static FT_Error\n  pfr_glyph_load_simple( PFR_Glyph  glyph,\n                         FT_Byte*   p,\n                         FT_Byte*   limit )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    FT_Memory  memory = glyph->loader->memory;\n    FT_UInt    flags, x_count, y_count, i, count, mask;\n    FT_Int     x;\n\n\n    PFR_CHECK( 1 );\n    flags = PFR_NEXT_BYTE( p );\n\n    /* test for composite glyphs */\n    if ( flags & PFR_GLYPH_IS_COMPOUND )\n      goto Failure;\n\n    x_count = 0;\n    y_count = 0;\n\n    if ( flags & PFR_GLYPH_1BYTE_XYCOUNT )\n    {\n      PFR_CHECK( 1 );\n      count   = PFR_NEXT_BYTE( p );\n      x_count = count & 15;\n      y_count = count >> 4;\n    }\n    else\n    {\n      if ( flags & PFR_GLYPH_XCOUNT )\n      {\n        PFR_CHECK( 1 );\n        x_count = PFR_NEXT_BYTE( p );\n      }\n\n      if ( flags & PFR_GLYPH_YCOUNT )\n      {\n        PFR_CHECK( 1 );\n        y_count = PFR_NEXT_BYTE( p );\n      }\n    }\n\n    count = x_count + y_count;\n\n    /* re-allocate array when necessary */\n    if ( count > glyph->max_xy_control )\n    {\n      FT_UInt  new_max = FT_PAD_CEIL( count, 8 );\n\n\n      if ( FT_RENEW_ARRAY( glyph->x_control,\n                           glyph->max_xy_control,\n                           new_max ) )\n        goto Exit;\n\n      glyph->max_xy_control = new_max;\n    }\n\n    glyph->y_control = glyph->x_control + x_count;\n\n    mask  = 0;\n    x     = 0;\n\n    for ( i = 0; i < count; i++ )\n    {\n      if ( ( i & 7 ) == 0 )\n      {\n        PFR_CHECK( 1 );\n        mask = PFR_NEXT_BYTE( p );\n      }\n\n      if ( mask & 1 )\n      {\n        PFR_CHECK( 2 );\n        x = PFR_NEXT_SHORT( p );\n      }\n      else\n      {\n        PFR_CHECK( 1 );\n        x += PFR_NEXT_BYTE( p );\n      }\n\n      glyph->x_control[i] = x;\n\n      mask >>= 1;\n    }\n\n    /* XXX: for now we ignore the secondary stroke and edge definitions */\n    /*      since we don't want to support native PFR hinting           */\n    /*                                                                  */\n    if ( flags & PFR_GLYPH_EXTRA_ITEMS )\n    {\n      error = pfr_extra_items_skip( &p, limit );\n      if ( error )\n        goto Exit;\n    }\n\n    pfr_glyph_start( glyph );\n\n    /* now load a simple glyph */\n    {\n      FT_Vector   pos[4];\n      FT_Vector*  cur;\n\n\n      pos[0].x = pos[0].y = 0;\n      pos[3]   = pos[0];\n\n      for (;;)\n      {\n        FT_UInt  format, format_low, args_format = 0, args_count, n;\n\n\n        /***************************************************************/\n        /*  read instruction                                           */\n        /*                                                             */\n        PFR_CHECK( 1 );\n        format     = PFR_NEXT_BYTE( p );\n        format_low = format & 15;\n\n        switch ( format >> 4 )\n        {\n        case 0:                             /* end glyph */\n          FT_TRACE6(( \"- end glyph\" ));\n          args_count = 0;\n          break;\n\n        case 1:                             /* general line operation */\n          FT_TRACE6(( \"- general line\" ));\n          goto Line1;\n\n        case 4:                             /* move to inside contour  */\n          FT_TRACE6(( \"- move to inside\" ));\n          goto Line1;\n\n        case 5:                             /* move to outside contour */\n          FT_TRACE6(( \"- move to outside\" ));\n        Line1:\n          args_format = format_low;\n          args_count  = 1;\n          break;\n\n        case 2:                             /* horizontal line to */\n          FT_TRACE6(( \"- horizontal line to cx.%d\", format_low ));\n          if ( format_low >= x_count )\n            goto Failure;\n          pos[0].x   = glyph->x_control[format_low];\n          pos[0].y   = pos[3].y;\n          pos[3]     = pos[0];\n          args_count = 0;\n          break;\n\n        case 3:                             /* vertical line to */\n          FT_TRACE6(( \"- vertical line to cy.%d\", format_low ));\n          if ( format_low >= y_count )\n            goto Failure;\n          pos[0].x   = pos[3].x;\n          pos[0].y   = glyph->y_control[format_low];\n          pos[3]     = pos[0];\n          args_count = 0;\n          break;\n\n        case 6:                             /* horizontal to vertical curve */\n          FT_TRACE6(( \"- hv curve \" ));\n          args_format = 0xB8E;\n          args_count  = 3;\n          break;\n\n        case 7:                             /* vertical to horizontal curve */\n          FT_TRACE6(( \"- vh curve\" ));\n          args_format = 0xE2B;\n          args_count  = 3;\n          break;\n\n        default:                            /* general curve to */\n          FT_TRACE6(( \"- general curve\" ));\n          args_count  = 4;\n          args_format = format_low;\n        }\n\n        /***********************************************************/\n        /*  now read arguments                                     */\n        /*                                                         */\n        cur = pos;\n        for ( n = 0; n < args_count; n++ )\n        {\n          FT_UInt  idx;\n          FT_Int   delta;\n\n\n          /* read the X argument */\n          switch ( args_format & 3 )\n          {\n          case 0:                           /* 8-bit index */\n            PFR_CHECK( 1 );\n            idx  = PFR_NEXT_BYTE( p );\n            if ( idx >= x_count )\n              goto Failure;\n            cur->x = glyph->x_control[idx];\n            FT_TRACE7(( \" cx#%d\", idx ));\n            break;\n\n          case 1:                           /* 16-bit value */\n            PFR_CHECK( 2 );\n            cur->x = PFR_NEXT_SHORT( p );\n            FT_TRACE7(( \" x.%d\", cur->x ));\n            break;\n\n          case 2:                           /* 8-bit delta */\n            PFR_CHECK( 1 );\n            delta  = PFR_NEXT_INT8( p );\n            cur->x = pos[3].x + delta;\n            FT_TRACE7(( \" dx.%d\", delta ));\n            break;\n\n          default:\n            FT_TRACE7(( \" |\" ));\n            cur->x = pos[3].x;\n          }\n\n          /* read the Y argument */\n          switch ( ( args_format >> 2 ) & 3 )\n          {\n          case 0:                           /* 8-bit index */\n            PFR_CHECK( 1 );\n            idx  = PFR_NEXT_BYTE( p );\n            if ( idx >= y_count )\n              goto Failure;\n            cur->y = glyph->y_control[idx];\n            FT_TRACE7(( \" cy#%d\", idx ));\n            break;\n\n          case 1:                           /* 16-bit absolute value */\n            PFR_CHECK( 2 );\n            cur->y = PFR_NEXT_SHORT( p );\n            FT_TRACE7(( \" y.%d\", cur->y ));\n            break;\n\n          case 2:                           /* 8-bit delta */\n            PFR_CHECK( 1 );\n            delta  = PFR_NEXT_INT8( p );\n            cur->y = pos[3].y + delta;\n            FT_TRACE7(( \" dy.%d\", delta ));\n            break;\n\n          default:\n            FT_TRACE7(( \" -\" ));\n            cur->y = pos[3].y;\n          }\n\n          /* read the additional format flag for the general curve */\n          if ( n == 0 && args_count == 4 )\n          {\n            PFR_CHECK( 1 );\n            args_format = PFR_NEXT_BYTE( p );\n            args_count--;\n          }\n          else\n            args_format >>= 4;\n\n          /* save the previous point */\n          pos[3] = cur[0];\n          cur++;\n        }\n\n        FT_TRACE7(( \"\\n\" ));\n\n        /***********************************************************/\n        /*  finally, execute instruction                           */\n        /*                                                         */\n        switch ( format >> 4 )\n        {\n        case 0:                             /* end glyph => EXIT */\n          pfr_glyph_end( glyph );\n          goto Exit;\n\n        case 1:                             /* line operations */\n        case 2:\n        case 3:\n          error = pfr_glyph_line_to( glyph, pos );\n          goto Test_Error;\n\n        case 4:                             /* move to inside contour  */\n        case 5:                             /* move to outside contour */\n          error = pfr_glyph_move_to( glyph, pos );\n          goto Test_Error;\n\n        default:                            /* curve operations */\n          error = pfr_glyph_curve_to( glyph, pos, pos + 1, pos + 2 );\n\n        Test_Error:  /* test error condition */\n          if ( error )\n            goto Exit;\n        }\n      } /* for (;;) */\n    }\n\n  Exit:\n    return error;\n\n  Failure:\n  Too_Short:\n    error = FT_THROW( Invalid_Table );\n    FT_ERROR(( \"pfr_glyph_load_simple: invalid glyph data\\n\" ));\n    goto Exit;\n  }\n\n\n  /* load a composite/compound glyph */\n  static FT_Error\n  pfr_glyph_load_compound( PFR_Glyph  glyph,\n                           FT_Byte*   p,\n                           FT_Byte*   limit )\n  {\n    FT_Error        error  = FT_Err_Ok;\n    FT_GlyphLoader  loader = glyph->loader;\n    FT_Memory       memory = loader->memory;\n    PFR_SubGlyph    subglyph;\n    FT_UInt         flags, i, count, org_count;\n    FT_Int          x_pos, y_pos;\n\n\n    PFR_CHECK( 1 );\n    flags = PFR_NEXT_BYTE( p );\n\n    /* test for composite glyphs */\n    if ( !( flags & PFR_GLYPH_IS_COMPOUND ) )\n      goto Failure;\n\n    count = flags & 0x3F;\n\n    /* ignore extra items when present */\n    /*                                 */\n    if ( flags & PFR_GLYPH_EXTRA_ITEMS )\n    {\n      error = pfr_extra_items_skip( &p, limit );\n      if (error) goto Exit;\n    }\n\n    /* we can't rely on the FT_GlyphLoader to load sub-glyphs, because   */\n    /* the PFR format is dumb, using direct file offsets to point to the */\n    /* sub-glyphs (instead of glyph indices).  Sigh.                     */\n    /*                                                                   */\n    /* For now, we load the list of sub-glyphs into a different array    */\n    /* but this will prevent us from using the auto-hinter at its best   */\n    /* quality.                                                          */\n    /*                                                                   */\n    org_count = glyph->num_subs;\n\n    if ( org_count + count > glyph->max_subs )\n    {\n      FT_UInt  new_max = ( org_count + count + 3 ) & (FT_UInt)-4;\n\n\n      /* we arbitrarily limit the number of subglyphs */\n      /* to avoid endless recursion                   */\n      if ( new_max > 64 )\n      {\n        error = FT_THROW( Invalid_Table );\n        FT_ERROR(( \"pfr_glyph_load_compound:\"\n                   \" too many compound glyphs components\\n\" ));\n        goto Exit;\n      }\n\n      if ( FT_RENEW_ARRAY( glyph->subs, glyph->max_subs, new_max ) )\n        goto Exit;\n\n      glyph->max_subs = new_max;\n    }\n\n    subglyph = glyph->subs + org_count;\n\n    for ( i = 0; i < count; i++, subglyph++ )\n    {\n      FT_UInt  format;\n\n\n      x_pos = 0;\n      y_pos = 0;\n\n      PFR_CHECK( 1 );\n      format = PFR_NEXT_BYTE( p );\n\n      /* read scale when available */\n      subglyph->x_scale = 0x10000L;\n      if ( format & PFR_SUBGLYPH_XSCALE )\n      {\n        PFR_CHECK( 2 );\n        subglyph->x_scale = PFR_NEXT_SHORT( p ) << 4;\n      }\n\n      subglyph->y_scale = 0x10000L;\n      if ( format & PFR_SUBGLYPH_YSCALE )\n      {\n        PFR_CHECK( 2 );\n        subglyph->y_scale = PFR_NEXT_SHORT( p ) << 4;\n      }\n\n      /* read offset */\n      switch ( format & 3 )\n      {\n      case 1:\n        PFR_CHECK( 2 );\n        x_pos = PFR_NEXT_SHORT( p );\n        break;\n\n      case 2:\n        PFR_CHECK( 1 );\n        x_pos += PFR_NEXT_INT8( p );\n        break;\n\n      default:\n        ;\n      }\n\n      switch ( ( format >> 2 ) & 3 )\n      {\n      case 1:\n        PFR_CHECK( 2 );\n        y_pos = PFR_NEXT_SHORT( p );\n        break;\n\n      case 2:\n        PFR_CHECK( 1 );\n        y_pos += PFR_NEXT_INT8( p );\n        break;\n\n      default:\n        ;\n      }\n\n      subglyph->x_delta = x_pos;\n      subglyph->y_delta = y_pos;\n\n      /* read glyph position and size now */\n      if ( format & PFR_SUBGLYPH_2BYTE_SIZE )\n      {\n        PFR_CHECK( 2 );\n        subglyph->gps_size = PFR_NEXT_USHORT( p );\n      }\n      else\n      {\n        PFR_CHECK( 1 );\n        subglyph->gps_size = PFR_NEXT_BYTE( p );\n      }\n\n      if ( format & PFR_SUBGLYPH_3BYTE_OFFSET )\n      {\n        PFR_CHECK( 3 );\n        subglyph->gps_offset = PFR_NEXT_LONG( p );\n      }\n      else\n      {\n        PFR_CHECK( 2 );\n        subglyph->gps_offset = PFR_NEXT_USHORT( p );\n      }\n\n      glyph->num_subs++;\n    }\n\n  Exit:\n    return error;\n\n  Failure:\n  Too_Short:\n    error = FT_THROW( Invalid_Table );\n    FT_ERROR(( \"pfr_glyph_load_compound: invalid glyph data\\n\" ));\n    goto Exit;\n  }\n\n\n  static FT_Error\n  pfr_glyph_load_rec( PFR_Glyph  glyph,\n                      FT_Stream  stream,\n                      FT_ULong   gps_offset,\n                      FT_ULong   offset,\n                      FT_ULong   size )\n  {\n    FT_Error  error;\n    FT_Byte*  p;\n    FT_Byte*  limit;\n\n\n    if ( FT_STREAM_SEEK( gps_offset + offset ) ||\n         FT_FRAME_ENTER( size )                )\n      goto Exit;\n\n    p     = (FT_Byte*)stream->cursor;\n    limit = p + size;\n\n    if ( size > 0 && *p & PFR_GLYPH_IS_COMPOUND )\n    {\n      FT_Int          n, old_count, count;\n      FT_GlyphLoader  loader = glyph->loader;\n      FT_Outline*     base   = &loader->base.outline;\n\n\n      old_count = glyph->num_subs;\n\n      /* this is a compound glyph - load it */\n      error = pfr_glyph_load_compound( glyph, p, limit );\n\n      FT_FRAME_EXIT();\n\n      if ( error )\n        goto Exit;\n\n      count = glyph->num_subs - old_count;\n\n      FT_TRACE4(( \"compound glyph with %d elements (offset %lu):\\n\",\n                  count, offset ));\n\n      /* now, load each individual glyph */\n      for ( n = 0; n < count; n++ )\n      {\n        FT_Int        i, old_points, num_points;\n        PFR_SubGlyph  subglyph;\n\n\n        FT_TRACE4(( \"subglyph %d:\\n\", n ));\n\n        subglyph   = glyph->subs + old_count + n;\n        old_points = base->n_points;\n\n        error = pfr_glyph_load_rec( glyph, stream, gps_offset,\n                                    subglyph->gps_offset,\n                                    subglyph->gps_size );\n        if ( error )\n          break;\n\n        /* note that `glyph->subs' might have been re-allocated */\n        subglyph   = glyph->subs + old_count + n;\n        num_points = base->n_points - old_points;\n\n        /* translate and eventually scale the new glyph points */\n        if ( subglyph->x_scale != 0x10000L || subglyph->y_scale != 0x10000L )\n        {\n          FT_Vector*  vec = base->points + old_points;\n\n\n          for ( i = 0; i < num_points; i++, vec++ )\n          {\n            vec->x = FT_MulFix( vec->x, subglyph->x_scale ) +\n                       subglyph->x_delta;\n            vec->y = FT_MulFix( vec->y, subglyph->y_scale ) +\n                       subglyph->y_delta;\n          }\n        }\n        else\n        {\n          FT_Vector*  vec = loader->base.outline.points + old_points;\n\n\n          for ( i = 0; i < num_points; i++, vec++ )\n          {\n            vec->x += subglyph->x_delta;\n            vec->y += subglyph->y_delta;\n          }\n        }\n\n        /* proceed to next sub-glyph */\n      }\n\n      FT_TRACE4(( \"end compound glyph with %d elements\\n\", count ));\n    }\n    else\n    {\n      FT_TRACE4(( \"simple glyph (offset %lu)\\n\", offset ));\n\n      /* load a simple glyph */\n      error = pfr_glyph_load_simple( glyph, p, limit );\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_glyph_load( PFR_Glyph  glyph,\n                  FT_Stream  stream,\n                  FT_ULong   gps_offset,\n                  FT_ULong   offset,\n                  FT_ULong   size )\n  {\n    /* initialize glyph loader */\n    FT_GlyphLoader_Rewind( glyph->loader );\n\n    glyph->num_subs = 0;\n\n    /* load the glyph, recursively when needed */\n    return pfr_glyph_load_rec( glyph, stream, gps_offset, offset, size );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrgload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrgload.h                                                             */\n/*                                                                         */\n/*    FreeType PFR glyph loader (specification).                           */\n/*                                                                         */\n/*  Copyright 2002 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PFRGLOAD_H__\n#define __PFRGLOAD_H__\n\n#include \"pfrtypes.h\"\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  pfr_glyph_init( PFR_Glyph       glyph,\n                  FT_GlyphLoader  loader );\n\n  FT_LOCAL( void )\n  pfr_glyph_done( PFR_Glyph  glyph );\n\n\n  FT_LOCAL( FT_Error )\n  pfr_glyph_load( PFR_Glyph  glyph,\n                  FT_Stream  stream,\n                  FT_ULong   gps_offset,\n                  FT_ULong   offset,\n                  FT_ULong   size );\n\n\nFT_END_HEADER\n\n\n#endif /* __PFRGLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrload.c                                                              */\n/*                                                                         */\n/*    FreeType PFR loader (body).                                          */\n/*                                                                         */\n/*  Copyright 2002-2005, 2007, 2009, 2010, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"pfrload.h\"\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n\n#include \"pfrerror.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pfr\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          EXTRA ITEMS                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_extra_items_skip( FT_Byte*  *pp,\n                        FT_Byte*   limit )\n  {\n    return pfr_extra_items_parse( pp, limit, NULL, NULL );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_extra_items_parse( FT_Byte*       *pp,\n                         FT_Byte*        limit,\n                         PFR_ExtraItem   item_list,\n                         FT_Pointer      item_data )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Byte*  p     = *pp;\n    FT_UInt   num_items, item_type, item_size;\n\n\n    PFR_CHECK( 1 );\n    num_items = PFR_NEXT_BYTE( p );\n\n    for ( ; num_items > 0; num_items-- )\n    {\n      PFR_CHECK( 2 );\n      item_size = PFR_NEXT_BYTE( p );\n      item_type = PFR_NEXT_BYTE( p );\n\n      PFR_CHECK( item_size );\n\n      if ( item_list )\n      {\n        PFR_ExtraItem  extra = item_list;\n\n\n        for ( extra = item_list; extra->parser != NULL; extra++ )\n        {\n          if ( extra->type == item_type )\n          {\n            error = extra->parser( p, p + item_size, item_data );\n            if ( error ) goto Exit;\n\n            break;\n          }\n        }\n      }\n\n      p += item_size;\n    }\n\n  Exit:\n    *pp = p;\n    return error;\n\n  Too_Short:\n    FT_ERROR(( \"pfr_extra_items_parse: invalid extra items table\\n\" ));\n    error = FT_THROW( Invalid_Table );\n    goto Exit;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          PFR HEADER                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n   static const FT_Frame_Field  pfr_header_fields[] =\n   {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PFR_HeaderRec\n\n     FT_FRAME_START( 58 ),\n       FT_FRAME_ULONG ( signature ),\n       FT_FRAME_USHORT( version ),\n       FT_FRAME_USHORT( signature2 ),\n       FT_FRAME_USHORT( header_size ),\n\n       FT_FRAME_USHORT( log_dir_size ),\n       FT_FRAME_USHORT( log_dir_offset ),\n\n       FT_FRAME_USHORT( log_font_max_size ),\n       FT_FRAME_UOFF3 ( log_font_section_size ),\n       FT_FRAME_UOFF3 ( log_font_section_offset ),\n\n       FT_FRAME_USHORT( phy_font_max_size ),\n       FT_FRAME_UOFF3 ( phy_font_section_size ),\n       FT_FRAME_UOFF3 ( phy_font_section_offset ),\n\n       FT_FRAME_USHORT( gps_max_size ),\n       FT_FRAME_UOFF3 ( gps_section_size ),\n       FT_FRAME_UOFF3 ( gps_section_offset ),\n\n       FT_FRAME_BYTE  ( max_blue_values ),\n       FT_FRAME_BYTE  ( max_x_orus ),\n       FT_FRAME_BYTE  ( max_y_orus ),\n\n       FT_FRAME_BYTE  ( phy_font_max_size_high ),\n       FT_FRAME_BYTE  ( color_flags ),\n\n       FT_FRAME_UOFF3 ( bct_max_size ),\n       FT_FRAME_UOFF3 ( bct_set_max_size ),\n       FT_FRAME_UOFF3 ( phy_bct_set_max_size ),\n\n       FT_FRAME_USHORT( num_phy_fonts ),\n       FT_FRAME_BYTE  ( max_vert_stem_snap ),\n       FT_FRAME_BYTE  ( max_horz_stem_snap ),\n       FT_FRAME_USHORT( max_chars ),\n     FT_FRAME_END\n   };\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_header_load( PFR_Header  header,\n                   FT_Stream   stream )\n  {\n    FT_Error  error;\n\n\n    /* read header directly */\n    if ( !FT_STREAM_SEEK( 0 )                                &&\n         !FT_STREAM_READ_FIELDS( pfr_header_fields, header ) )\n    {\n      /* make a few adjustments to the header */\n      header->phy_font_max_size +=\n        (FT_UInt32)header->phy_font_max_size_high << 16;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  pfr_header_check( PFR_Header  header )\n  {\n    FT_Bool  result = 1;\n\n\n    /* check signature and header size */\n    if ( header->signature  != 0x50465230L ||   /* \"PFR0\" */\n         header->version     > 4           ||\n         header->header_size < 58          ||\n         header->signature2 != 0x0d0a      )    /* CR/LF  */\n    {\n      result = 0;\n    }\n    return  result;\n  }\n\n\n  /***********************************************************************/\n  /***********************************************************************/\n  /*****                                                             *****/\n  /*****                    PFR LOGICAL FONTS                        *****/\n  /*****                                                             *****/\n  /***********************************************************************/\n  /***********************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_log_font_count( FT_Stream  stream,\n                      FT_UInt32  section_offset,\n                      FT_UInt   *acount )\n  {\n    FT_Error  error;\n    FT_UInt   count;\n    FT_UInt   result = 0;\n\n\n    if ( FT_STREAM_SEEK( section_offset ) || FT_READ_USHORT( count ) )\n      goto Exit;\n\n    result = count;\n\n  Exit:\n    *acount = result;\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_log_font_load( PFR_LogFont  log_font,\n                     FT_Stream    stream,\n                     FT_UInt      idx,\n                     FT_UInt32    section_offset,\n                     FT_Bool      size_increment )\n  {\n    FT_UInt    num_log_fonts;\n    FT_UInt    flags;\n    FT_UInt32  offset;\n    FT_UInt32  size;\n    FT_Error   error;\n\n\n    if ( FT_STREAM_SEEK( section_offset ) ||\n         FT_READ_USHORT( num_log_fonts )  )\n      goto Exit;\n\n    if ( idx >= num_log_fonts )\n      return FT_THROW( Invalid_Argument );\n\n    if ( FT_STREAM_SKIP( idx * 5 ) ||\n         FT_READ_USHORT( size )    ||\n         FT_READ_UOFF3 ( offset )  )\n      goto Exit;\n\n    /* save logical font size and offset */\n    log_font->size   = size;\n    log_font->offset = offset;\n\n    /* now, check the rest of the table before loading it */\n    {\n      FT_Byte*  p;\n      FT_Byte*  limit;\n      FT_UInt   local;\n\n\n      if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) )\n        goto Exit;\n\n      p     = stream->cursor;\n      limit = p + size;\n\n      PFR_CHECK(13);\n\n      log_font->matrix[0] = PFR_NEXT_LONG( p );\n      log_font->matrix[1] = PFR_NEXT_LONG( p );\n      log_font->matrix[2] = PFR_NEXT_LONG( p );\n      log_font->matrix[3] = PFR_NEXT_LONG( p );\n\n      flags = PFR_NEXT_BYTE( p );\n\n      local = 0;\n      if ( flags & PFR_LOG_STROKE )\n      {\n        local++;\n        if ( flags & PFR_LOG_2BYTE_STROKE )\n          local++;\n\n        if ( (flags & PFR_LINE_JOIN_MASK) == PFR_LINE_JOIN_MITER )\n          local += 3;\n      }\n      if ( flags & PFR_LOG_BOLD )\n      {\n        local++;\n        if ( flags & PFR_LOG_2BYTE_BOLD )\n          local++;\n      }\n\n      PFR_CHECK( local );\n\n      if ( flags & PFR_LOG_STROKE )\n      {\n        log_font->stroke_thickness = ( flags & PFR_LOG_2BYTE_STROKE )\n                                     ? PFR_NEXT_SHORT( p )\n                                     : PFR_NEXT_BYTE( p );\n\n        if ( ( flags & PFR_LINE_JOIN_MASK ) == PFR_LINE_JOIN_MITER )\n          log_font->miter_limit = PFR_NEXT_LONG( p );\n      }\n\n      if ( flags & PFR_LOG_BOLD )\n      {\n        log_font->bold_thickness = ( flags & PFR_LOG_2BYTE_BOLD )\n                                   ? PFR_NEXT_SHORT( p )\n                                   : PFR_NEXT_BYTE( p );\n      }\n\n      if ( flags & PFR_LOG_EXTRA_ITEMS )\n      {\n        error = pfr_extra_items_skip( &p, limit );\n        if (error) goto Fail;\n      }\n\n      PFR_CHECK(5);\n      log_font->phys_size   = PFR_NEXT_USHORT( p );\n      log_font->phys_offset = PFR_NEXT_ULONG( p );\n      if ( size_increment )\n      {\n        PFR_CHECK( 1 );\n        log_font->phys_size += (FT_UInt32)PFR_NEXT_BYTE( p ) << 16;\n      }\n    }\n\n  Fail:\n    FT_FRAME_EXIT();\n\n  Exit:\n    return error;\n\n  Too_Short:\n    FT_ERROR(( \"pfr_log_font_load: invalid logical font table\\n\" ));\n    error = FT_THROW( Invalid_Table );\n    goto Fail;\n  }\n\n\n  /***********************************************************************/\n  /***********************************************************************/\n  /*****                                                             *****/\n  /*****                    PFR PHYSICAL FONTS                       *****/\n  /*****                                                             *****/\n  /***********************************************************************/\n  /***********************************************************************/\n\n\n  /* load bitmap strikes lists */\n  FT_CALLBACK_DEF( FT_Error )\n  pfr_extra_item_load_bitmap_info( FT_Byte*     p,\n                                   FT_Byte*     limit,\n                                   PFR_PhyFont  phy_font )\n  {\n    FT_Memory   memory = phy_font->memory;\n    PFR_Strike  strike;\n    FT_UInt     flags0;\n    FT_UInt     n, count, size1;\n    FT_Error    error = FT_Err_Ok;\n\n\n    PFR_CHECK( 5 );\n\n    p += 3;  /* skip bctSize */\n    flags0 = PFR_NEXT_BYTE( p );\n    count  = PFR_NEXT_BYTE( p );\n\n    /* re-allocate when needed */\n    if ( phy_font->num_strikes + count > phy_font->max_strikes )\n    {\n      FT_UInt  new_max = FT_PAD_CEIL( phy_font->num_strikes + count, 4 );\n\n\n      if ( FT_RENEW_ARRAY( phy_font->strikes,\n                           phy_font->num_strikes,\n                           new_max ) )\n        goto Exit;\n\n      phy_font->max_strikes = new_max;\n    }\n\n    size1 = 1 + 1 + 1 + 2 + 2 + 1;\n    if ( flags0 & PFR_STRIKE_2BYTE_XPPM )\n      size1++;\n\n    if ( flags0 & PFR_STRIKE_2BYTE_YPPM )\n      size1++;\n\n    if ( flags0 & PFR_STRIKE_3BYTE_SIZE )\n      size1++;\n\n    if ( flags0 & PFR_STRIKE_3BYTE_OFFSET )\n      size1++;\n\n    if ( flags0 & PFR_STRIKE_2BYTE_COUNT )\n      size1++;\n\n    strike = phy_font->strikes + phy_font->num_strikes;\n\n    PFR_CHECK( count * size1 );\n\n    for ( n = 0; n < count; n++, strike++ )\n    {\n      strike->x_ppm       = ( flags0 & PFR_STRIKE_2BYTE_XPPM )\n                            ? PFR_NEXT_USHORT( p )\n                            : PFR_NEXT_BYTE( p );\n\n      strike->y_ppm       = ( flags0 & PFR_STRIKE_2BYTE_YPPM )\n                            ? PFR_NEXT_USHORT( p )\n                            : PFR_NEXT_BYTE( p );\n\n      strike->flags       = PFR_NEXT_BYTE( p );\n\n      strike->bct_size    = ( flags0 & PFR_STRIKE_3BYTE_SIZE )\n                            ? PFR_NEXT_ULONG( p )\n                            : PFR_NEXT_USHORT( p );\n\n      strike->bct_offset  = ( flags0 & PFR_STRIKE_3BYTE_OFFSET )\n                            ? PFR_NEXT_ULONG( p )\n                            : PFR_NEXT_USHORT( p );\n\n      strike->num_bitmaps = ( flags0 & PFR_STRIKE_2BYTE_COUNT )\n                            ? PFR_NEXT_USHORT( p )\n                            : PFR_NEXT_BYTE( p );\n    }\n\n    phy_font->num_strikes += count;\n\n  Exit:\n    return error;\n\n  Too_Short:\n    error = FT_THROW( Invalid_Table );\n    FT_ERROR(( \"pfr_extra_item_load_bitmap_info:\"\n               \" invalid bitmap info table\\n\" ));\n    goto Exit;\n  }\n\n\n  /* Load font ID.  This is a so-called \"unique\" name that is rather\n   * long and descriptive (like \"Tiresias ScreenFont v7.51\").\n   *\n   * Note that a PFR font's family name is contained in an *undocumented*\n   * string of the \"auxiliary data\" portion of a physical font record.  This\n   * may also contain the \"real\" style name!\n   *\n   * If no family name is present, the font ID is used instead for the\n   * family.\n   */\n  FT_CALLBACK_DEF( FT_Error )\n  pfr_extra_item_load_font_id( FT_Byte*     p,\n                               FT_Byte*     limit,\n                               PFR_PhyFont  phy_font )\n  {\n    FT_Error    error  = FT_Err_Ok;\n    FT_Memory   memory = phy_font->memory;\n    FT_PtrDist  len    = limit - p;\n\n\n    if ( phy_font->font_id != NULL )\n      goto Exit;\n\n    if ( FT_ALLOC( phy_font->font_id, len + 1 ) )\n      goto Exit;\n\n    /* copy font ID name, and terminate it for safety */\n    FT_MEM_COPY( phy_font->font_id, p, len );\n    phy_font->font_id[len] = 0;\n\n  Exit:\n    return error;\n  }\n\n\n  /* load stem snap tables */\n  FT_CALLBACK_DEF( FT_Error )\n  pfr_extra_item_load_stem_snaps( FT_Byte*     p,\n                                  FT_Byte*     limit,\n                                  PFR_PhyFont  phy_font )\n  {\n    FT_UInt    count, num_vert, num_horz;\n    FT_Int*    snaps  = NULL;\n    FT_Error   error  = FT_Err_Ok;\n    FT_Memory  memory = phy_font->memory;\n\n\n    if ( phy_font->vertical.stem_snaps != NULL )\n      goto Exit;\n\n    PFR_CHECK( 1 );\n    count = PFR_NEXT_BYTE( p );\n\n    num_vert = count & 15;\n    num_horz = count >> 4;\n    count    = num_vert + num_horz;\n\n    PFR_CHECK( count * 2 );\n\n    if ( FT_NEW_ARRAY( snaps, count ) )\n      goto Exit;\n\n    phy_font->vertical.stem_snaps = snaps;\n    phy_font->horizontal.stem_snaps = snaps + num_vert;\n\n    for ( ; count > 0; count--, snaps++ )\n      *snaps = FT_NEXT_SHORT( p );\n\n  Exit:\n    return error;\n\n  Too_Short:\n    error = FT_THROW( Invalid_Table );\n    FT_ERROR(( \"pfr_exta_item_load_stem_snaps:\"\n               \" invalid stem snaps table\\n\" ));\n    goto Exit;\n  }\n\n\n\n  /* load kerning pair data */\n  FT_CALLBACK_DEF( FT_Error )\n  pfr_extra_item_load_kerning_pairs( FT_Byte*     p,\n                                     FT_Byte*     limit,\n                                     PFR_PhyFont  phy_font )\n  {\n    PFR_KernItem  item   = NULL;\n    FT_Error      error  = FT_Err_Ok;\n    FT_Memory     memory = phy_font->memory;\n\n\n    FT_TRACE2(( \"pfr_extra_item_load_kerning_pairs()\\n\" ));\n\n    if ( FT_NEW( item ) )\n      goto Exit;\n\n    PFR_CHECK( 4 );\n\n    item->pair_count = PFR_NEXT_BYTE( p );\n    item->base_adj   = PFR_NEXT_SHORT( p );\n    item->flags      = PFR_NEXT_BYTE( p );\n    item->offset     = phy_font->offset + ( p - phy_font->cursor );\n\n#ifndef PFR_CONFIG_NO_CHECKS\n    item->pair_size = 3;\n\n    if ( item->flags & PFR_KERN_2BYTE_CHAR )\n      item->pair_size += 2;\n\n    if ( item->flags & PFR_KERN_2BYTE_ADJ )\n      item->pair_size += 1;\n\n    PFR_CHECK( item->pair_count * item->pair_size );\n#endif\n\n    /* load first and last pairs into the item to speed up */\n    /* lookup later...                                     */\n    if ( item->pair_count > 0 )\n    {\n      FT_UInt   char1, char2;\n      FT_Byte*  q;\n\n\n      if ( item->flags & PFR_KERN_2BYTE_CHAR )\n      {\n        q     = p;\n        char1 = PFR_NEXT_USHORT( q );\n        char2 = PFR_NEXT_USHORT( q );\n\n        item->pair1 = PFR_KERN_INDEX( char1, char2 );\n\n        q = p + item->pair_size * ( item->pair_count - 1 );\n        char1 = PFR_NEXT_USHORT( q );\n        char2 = PFR_NEXT_USHORT( q );\n\n        item->pair2 = PFR_KERN_INDEX( char1, char2 );\n      }\n      else\n      {\n        q     = p;\n        char1 = PFR_NEXT_BYTE( q );\n        char2 = PFR_NEXT_BYTE( q );\n\n        item->pair1 = PFR_KERN_INDEX( char1, char2 );\n\n        q = p + item->pair_size * ( item->pair_count - 1 );\n        char1 = PFR_NEXT_BYTE( q );\n        char2 = PFR_NEXT_BYTE( q );\n\n        item->pair2 = PFR_KERN_INDEX( char1, char2 );\n      }\n\n      /* add new item to the current list */\n      item->next                 = NULL;\n      *phy_font->kern_items_tail = item;\n      phy_font->kern_items_tail  = &item->next;\n      phy_font->num_kern_pairs  += item->pair_count;\n    }\n    else\n    {\n      /* empty item! */\n      FT_FREE( item );\n    }\n\n  Exit:\n    return error;\n\n  Too_Short:\n    FT_FREE( item );\n\n    error = FT_THROW( Invalid_Table );\n    FT_ERROR(( \"pfr_extra_item_load_kerning_pairs:\"\n               \" invalid kerning pairs table\\n\" ));\n    goto Exit;\n  }\n\n\n\n  static const PFR_ExtraItemRec  pfr_phy_font_extra_items[] =\n  {\n    { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info },\n    { 2, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_font_id },\n    { 3, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_stem_snaps },\n    { 4, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_kerning_pairs },\n    { 0, NULL }\n  };\n\n\n  /* Loads a name from the auxiliary data.  Since this extracts undocumented\n   * strings from the font file, we need to be careful here.\n   */\n  static FT_Error\n  pfr_aux_name_load( FT_Byte*     p,\n                     FT_UInt      len,\n                     FT_Memory    memory,\n                     FT_String*  *astring )\n  {\n    FT_Error    error  = FT_Err_Ok;\n    FT_String*  result = NULL;\n    FT_UInt     n, ok;\n\n\n    if ( len > 0 && p[len - 1] == 0 )\n      len--;\n\n    /* check that each character is ASCII for making sure not to\n       load garbage\n     */\n    ok = ( len > 0 );\n    for ( n = 0; n < len; n++ )\n      if ( p[n] < 32 || p[n] > 127 )\n      {\n        ok = 0;\n        break;\n      }\n\n    if ( ok )\n    {\n      if ( FT_ALLOC( result, len + 1 ) )\n        goto Exit;\n\n      FT_MEM_COPY( result, p, len );\n      result[len] = 0;\n    }\n  Exit:\n    *astring = result;\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  pfr_phy_font_done( PFR_PhyFont  phy_font,\n                     FT_Memory    memory )\n  {\n    FT_FREE( phy_font->font_id );\n    FT_FREE( phy_font->family_name );\n    FT_FREE( phy_font->style_name );\n\n    FT_FREE( phy_font->vertical.stem_snaps );\n    phy_font->vertical.num_stem_snaps = 0;\n\n    phy_font->horizontal.stem_snaps     = NULL;\n    phy_font->horizontal.num_stem_snaps = 0;\n\n    FT_FREE( phy_font->strikes );\n    phy_font->num_strikes = 0;\n    phy_font->max_strikes = 0;\n\n    FT_FREE( phy_font->chars );\n    phy_font->num_chars    = 0;\n    phy_font->chars_offset = 0;\n\n    FT_FREE( phy_font->blue_values );\n    phy_font->num_blue_values = 0;\n\n    {\n      PFR_KernItem  item, next;\n\n\n      item = phy_font->kern_items;\n      while ( item )\n      {\n        next = item->next;\n        FT_FREE( item );\n        item = next;\n      }\n      phy_font->kern_items      = NULL;\n      phy_font->kern_items_tail = NULL;\n    }\n\n    phy_font->num_kern_pairs = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_phy_font_load( PFR_PhyFont  phy_font,\n                     FT_Stream    stream,\n                     FT_UInt32    offset,\n                     FT_UInt32    size )\n  {\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n    FT_UInt    flags;\n    FT_ULong   num_aux;\n    FT_Byte*   p;\n    FT_Byte*   limit;\n\n\n    phy_font->memory = memory;\n    phy_font->offset = offset;\n\n    phy_font->kern_items      = NULL;\n    phy_font->kern_items_tail = &phy_font->kern_items;\n\n    if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) )\n      goto Exit;\n\n    phy_font->cursor = stream->cursor;\n\n    p     = stream->cursor;\n    limit = p + size;\n\n    PFR_CHECK( 15 );\n    phy_font->font_ref_number    = PFR_NEXT_USHORT( p );\n    phy_font->outline_resolution = PFR_NEXT_USHORT( p );\n    phy_font->metrics_resolution = PFR_NEXT_USHORT( p );\n    phy_font->bbox.xMin          = PFR_NEXT_SHORT( p );\n    phy_font->bbox.yMin          = PFR_NEXT_SHORT( p );\n    phy_font->bbox.xMax          = PFR_NEXT_SHORT( p );\n    phy_font->bbox.yMax          = PFR_NEXT_SHORT( p );\n    phy_font->flags      = flags = PFR_NEXT_BYTE( p );\n\n    /* get the standard advance for non-proportional fonts */\n    if ( !(flags & PFR_PHY_PROPORTIONAL) )\n    {\n      PFR_CHECK( 2 );\n      phy_font->standard_advance = PFR_NEXT_SHORT( p );\n    }\n\n    /* load the extra items when present */\n    if ( flags & PFR_PHY_EXTRA_ITEMS )\n    {\n      error =  pfr_extra_items_parse( &p, limit,\n                                      pfr_phy_font_extra_items, phy_font );\n\n      if ( error )\n        goto Fail;\n    }\n\n    /* In certain fonts, the auxiliary bytes contain interesting  */\n    /* information. These are not in the specification but can be */\n    /* guessed by looking at the content of a few PFR0 fonts.     */\n    PFR_CHECK( 3 );\n    num_aux = PFR_NEXT_ULONG( p );\n\n    if ( num_aux > 0 )\n    {\n      FT_Byte*  q = p;\n      FT_Byte*  q2;\n\n\n      PFR_CHECK( num_aux );\n      p += num_aux;\n\n      while ( num_aux > 0 )\n      {\n        FT_UInt  length, type;\n\n\n        if ( q + 4 > p )\n          break;\n\n        length = PFR_NEXT_USHORT( q );\n        if ( length < 4 || length > num_aux )\n          break;\n\n        q2   = q + length - 2;\n        type = PFR_NEXT_USHORT( q );\n\n        switch ( type )\n        {\n        case 1:\n          /* this seems to correspond to the font's family name,\n           * padded to 16-bits with one zero when necessary\n           */\n          error = pfr_aux_name_load( q, length - 4U, memory,\n                                     &phy_font->family_name );\n          if ( error )\n            goto Exit;\n          break;\n\n        case 2:\n          if ( q + 32 > q2 )\n            break;\n\n          q += 10;\n          phy_font->ascent  = PFR_NEXT_SHORT( q );\n          phy_font->descent = PFR_NEXT_SHORT( q );\n          phy_font->leading = PFR_NEXT_SHORT( q );\n          q += 16;\n          break;\n\n        case 3:\n          /* this seems to correspond to the font's style name,\n           * padded to 16-bits with one zero when necessary\n           */\n          error = pfr_aux_name_load( q, length - 4U, memory,\n                                     &phy_font->style_name );\n          if ( error )\n            goto Exit;\n          break;\n\n        default:\n          ;\n        }\n\n        q        = q2;\n        num_aux -= length;\n      }\n    }\n\n    /* read the blue values */\n    {\n      FT_UInt  n, count;\n\n\n      PFR_CHECK( 1 );\n      phy_font->num_blue_values = count = PFR_NEXT_BYTE( p );\n\n      PFR_CHECK( count * 2 );\n\n      if ( FT_NEW_ARRAY( phy_font->blue_values, count ) )\n        goto Fail;\n\n      for ( n = 0; n < count; n++ )\n        phy_font->blue_values[n] = PFR_NEXT_SHORT( p );\n    }\n\n    PFR_CHECK( 8 );\n    phy_font->blue_fuzz  = PFR_NEXT_BYTE( p );\n    phy_font->blue_scale = PFR_NEXT_BYTE( p );\n\n    phy_font->vertical.standard   = PFR_NEXT_USHORT( p );\n    phy_font->horizontal.standard = PFR_NEXT_USHORT( p );\n\n    /* read the character descriptors */\n    {\n      FT_UInt  n, count, Size;\n\n\n      phy_font->num_chars    = count = PFR_NEXT_USHORT( p );\n      phy_font->chars_offset = offset + ( p - stream->cursor );\n\n      if ( FT_NEW_ARRAY( phy_font->chars, count ) )\n        goto Fail;\n\n      Size = 1 + 1 + 2;\n      if ( flags & PFR_PHY_2BYTE_CHARCODE )\n        Size += 1;\n\n      if ( flags & PFR_PHY_PROPORTIONAL )\n        Size += 2;\n\n      if ( flags & PFR_PHY_ASCII_CODE )\n        Size += 1;\n\n      if ( flags & PFR_PHY_2BYTE_GPS_SIZE )\n        Size += 1;\n\n      if ( flags & PFR_PHY_3BYTE_GPS_OFFSET )\n        Size += 1;\n\n      PFR_CHECK( count * Size );\n\n      for ( n = 0; n < count; n++ )\n      {\n        PFR_Char  cur = &phy_font->chars[n];\n\n\n        cur->char_code = ( flags & PFR_PHY_2BYTE_CHARCODE )\n                         ? PFR_NEXT_USHORT( p )\n                         : PFR_NEXT_BYTE( p );\n\n        cur->advance   = ( flags & PFR_PHY_PROPORTIONAL )\n                         ? PFR_NEXT_SHORT( p )\n                         : (FT_Int) phy_font->standard_advance;\n\n#if 0\n        cur->ascii     = ( flags & PFR_PHY_ASCII_CODE )\n                         ? PFR_NEXT_BYTE( p )\n                         : 0;\n#else\n        if ( flags & PFR_PHY_ASCII_CODE )\n          p += 1;\n#endif\n        cur->gps_size  = ( flags & PFR_PHY_2BYTE_GPS_SIZE )\n                         ? PFR_NEXT_USHORT( p )\n                         : PFR_NEXT_BYTE( p );\n\n        cur->gps_offset = ( flags & PFR_PHY_3BYTE_GPS_OFFSET )\n                          ? PFR_NEXT_ULONG( p )\n                          : PFR_NEXT_USHORT( p );\n      }\n    }\n\n    /* that's it! */\n\n  Fail:\n    FT_FRAME_EXIT();\n\n    /* save position of bitmap info */\n    phy_font->bct_offset = FT_STREAM_POS();\n    phy_font->cursor     = NULL;\n\n  Exit:\n    return error;\n\n  Too_Short:\n    error = FT_THROW( Invalid_Table );\n    FT_ERROR(( \"pfr_phy_font_load: invalid physical font table\\n\" ));\n    goto Fail;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrload.h                                                              */\n/*                                                                         */\n/*    FreeType PFR loader (specification).                                 */\n/*                                                                         */\n/*  Copyright 2002 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PFRLOAD_H__\n#define __PFRLOAD_H__\n\n#include \"pfrobjs.h\"\n#include FT_INTERNAL_STREAM_H\n\n\nFT_BEGIN_HEADER\n\n#ifdef PFR_CONFIG_NO_CHECKS\n#define PFR_CHECK( x )  do { } while ( 0 )\n#else\n#define PFR_CHECK( x )  do                       \\\n                        {                        \\\n                          if ( p + (x) > limit ) \\\n                            goto Too_Short;      \\\n                        } while ( 0 )\n#endif\n\n#define PFR_NEXT_BYTE( p )    FT_NEXT_BYTE( p )\n#define PFR_NEXT_INT8( p )    FT_NEXT_CHAR( p )\n#define PFR_NEXT_SHORT( p )   FT_NEXT_SHORT( p )\n#define PFR_NEXT_USHORT( p )  FT_NEXT_USHORT( p )\n#define PFR_NEXT_LONG( p )    FT_NEXT_OFF3( p )\n#define PFR_NEXT_ULONG( p )   FT_NEXT_UOFF3( p )\n\n\n /* handling extra items */\n\n  typedef FT_Error\n  (*PFR_ExtraItem_ParseFunc)( FT_Byte*    p,\n                              FT_Byte*    limit,\n                              FT_Pointer  data );\n\n  typedef struct  PFR_ExtraItemRec_\n  {\n    FT_UInt                  type;\n    PFR_ExtraItem_ParseFunc  parser;\n\n  } PFR_ExtraItemRec;\n\n  typedef const struct PFR_ExtraItemRec_*  PFR_ExtraItem;\n\n\n  FT_LOCAL( FT_Error )\n  pfr_extra_items_skip( FT_Byte*  *pp,\n                        FT_Byte*  limit );\n\n  FT_LOCAL( FT_Error )\n  pfr_extra_items_parse( FT_Byte*      *pp,\n                         FT_Byte*       limit,\n                         PFR_ExtraItem  item_list,\n                         FT_Pointer     item_data );\n\n\n  /* load a PFR header */\n  FT_LOCAL( FT_Error )\n  pfr_header_load( PFR_Header  header,\n                   FT_Stream   stream );\n\n  /* check a PFR header */\n  FT_LOCAL( FT_Bool )\n  pfr_header_check( PFR_Header  header );\n\n\n  /* return number of logical fonts in this file */\n  FT_LOCAL( FT_Error )\n  pfr_log_font_count( FT_Stream   stream,\n                      FT_UInt32   log_section_offset,\n                      FT_UInt    *acount );\n\n  /* load a pfr logical font entry */\n  FT_LOCAL( FT_Error )\n  pfr_log_font_load( PFR_LogFont  log_font,\n                     FT_Stream    stream,\n                     FT_UInt      face_index,\n                     FT_UInt32    section_offset,\n                     FT_Bool      size_increment );\n\n\n  /* load a physical font entry */\n  FT_LOCAL( FT_Error )\n  pfr_phy_font_load( PFR_PhyFont  phy_font,\n                     FT_Stream    stream,\n                     FT_UInt32    offset,\n                     FT_UInt32    size );\n\n  /* finalize a physical font */\n  FT_LOCAL( void )\n  pfr_phy_font_done( PFR_PhyFont  phy_font,\n                     FT_Memory    memory );\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __PFRLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrobjs.c                                                              */\n/*                                                                         */\n/*    FreeType PFR object methods (body).                                  */\n/*                                                                         */\n/*  Copyright 2002-2008, 2010-2011, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"pfrobjs.h\"\n#include \"pfrload.h\"\n#include \"pfrgload.h\"\n#include \"pfrcmap.h\"\n#include \"pfrsbit.h\"\n#include FT_OUTLINE_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_TRUETYPE_IDS_H\n\n#include \"pfrerror.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pfr\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     FACE OBJECT METHODS                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  pfr_face_done( FT_Face  pfrface )     /* PFR_Face */\n  {\n    PFR_Face   face = (PFR_Face)pfrface;\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = pfrface->driver->root.memory;\n\n    /* we don't want dangling pointers */\n    pfrface->family_name = NULL;\n    pfrface->style_name  = NULL;\n\n    /* finalize the physical font record */\n    pfr_phy_font_done( &face->phy_font, FT_FACE_MEMORY( face ) );\n\n    /* no need to finalize the logical font or the header */\n    FT_FREE( pfrface->available_sizes );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_face_init( FT_Stream      stream,\n                 FT_Face        pfrface,\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params )\n  {\n    PFR_Face  face = (PFR_Face)pfrface;\n    FT_Error  error;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n\n\n    FT_TRACE2(( \"PFR driver\\n\" ));\n\n    /* load the header and check it */\n    error = pfr_header_load( &face->header, stream );\n    if ( error )\n      goto Exit;\n\n    if ( !pfr_header_check( &face->header ) )\n    {\n      FT_TRACE2(( \"  not a PFR font\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* check face index */\n    {\n      FT_UInt  num_faces;\n\n\n      error = pfr_log_font_count( stream,\n                                  face->header.log_dir_offset,\n                                  &num_faces );\n      if ( error )\n        goto Exit;\n\n      pfrface->num_faces = num_faces;\n    }\n\n    if ( face_index < 0 )\n      goto Exit;\n\n    if ( face_index >= pfrface->num_faces )\n    {\n      FT_ERROR(( \"pfr_face_init: invalid face index\\n\" ));\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* load the face */\n    error = pfr_log_font_load(\n               &face->log_font, stream, face_index,\n               face->header.log_dir_offset,\n               FT_BOOL( face->header.phy_font_max_size_high != 0 ) );\n    if ( error )\n      goto Exit;\n\n    /* now load the physical font descriptor */\n    error = pfr_phy_font_load( &face->phy_font, stream,\n                               face->log_font.phys_offset,\n                               face->log_font.phys_size );\n    if ( error )\n      goto Exit;\n\n    /* now set up all root face fields */\n    {\n      PFR_PhyFont  phy_font = &face->phy_font;\n\n\n      pfrface->face_index = face_index;\n      pfrface->num_glyphs = phy_font->num_chars + 1;\n      pfrface->face_flags = FT_FACE_FLAG_SCALABLE;\n\n      /* if all characters point to the same gps_offset 0, we */\n      /* assume that the font only contains bitmaps           */\n      {\n        FT_UInt  nn;\n\n\n        for ( nn = 0; nn < phy_font->num_chars; nn++ )\n          if ( phy_font->chars[nn].gps_offset != 0 )\n            break;\n\n        if ( nn == phy_font->num_chars )\n        {\n          if ( phy_font->num_strikes > 0 )\n            pfrface->face_flags = 0;        /* not scalable */\n          else\n          {\n            FT_ERROR(( \"pfr_face_init: font doesn't contain glyphs\\n\" ));\n            error = FT_THROW( Invalid_File_Format );\n            goto Exit;\n          }\n        }\n      }\n\n      if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 )\n        pfrface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      if ( phy_font->flags & PFR_PHY_VERTICAL )\n        pfrface->face_flags |= FT_FACE_FLAG_VERTICAL;\n      else\n        pfrface->face_flags |= FT_FACE_FLAG_HORIZONTAL;\n\n      if ( phy_font->num_strikes > 0 )\n        pfrface->face_flags |= FT_FACE_FLAG_FIXED_SIZES;\n\n      if ( phy_font->num_kern_pairs > 0 )\n        pfrface->face_flags |= FT_FACE_FLAG_KERNING;\n\n      /* If no family name was found in the \"undocumented\" auxiliary\n       * data, use the font ID instead.  This sucks but is better than\n       * nothing.\n       */\n      pfrface->family_name = phy_font->family_name;\n      if ( pfrface->family_name == NULL )\n        pfrface->family_name = phy_font->font_id;\n\n      /* note that the style name can be NULL in certain PFR fonts,\n       * probably meaning \"Regular\"\n       */\n      pfrface->style_name = phy_font->style_name;\n\n      pfrface->num_fixed_sizes = 0;\n      pfrface->available_sizes = 0;\n\n      pfrface->bbox         = phy_font->bbox;\n      pfrface->units_per_EM = (FT_UShort)phy_font->outline_resolution;\n      pfrface->ascender     = (FT_Short) phy_font->bbox.yMax;\n      pfrface->descender    = (FT_Short) phy_font->bbox.yMin;\n\n      pfrface->height = (FT_Short)( ( pfrface->units_per_EM * 12 ) / 10 );\n      if ( pfrface->height < pfrface->ascender - pfrface->descender )\n        pfrface->height = (FT_Short)(pfrface->ascender - pfrface->descender);\n\n      if ( phy_font->num_strikes > 0 )\n      {\n        FT_UInt          n, count = phy_font->num_strikes;\n        FT_Bitmap_Size*  size;\n        PFR_Strike       strike;\n        FT_Memory        memory = pfrface->stream->memory;\n\n\n        if ( FT_NEW_ARRAY( pfrface->available_sizes, count ) )\n          goto Exit;\n\n        size   = pfrface->available_sizes;\n        strike = phy_font->strikes;\n        for ( n = 0; n < count; n++, size++, strike++ )\n        {\n          size->height = (FT_UShort)strike->y_ppm;\n          size->width  = (FT_UShort)strike->x_ppm;\n          size->size   = strike->y_ppm << 6;\n          size->x_ppem = strike->x_ppm << 6;\n          size->y_ppem = strike->y_ppm << 6;\n        }\n        pfrface->num_fixed_sizes = count;\n      }\n\n      /* now compute maximum advance width */\n      if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 )\n        pfrface->max_advance_width = (FT_Short)phy_font->standard_advance;\n      else\n      {\n        FT_Int    max = 0;\n        FT_UInt   count = phy_font->num_chars;\n        PFR_Char  gchar = phy_font->chars;\n\n\n        for ( ; count > 0; count--, gchar++ )\n        {\n          if ( max < gchar->advance )\n            max = gchar->advance;\n        }\n\n        pfrface->max_advance_width = (FT_Short)max;\n      }\n\n      pfrface->max_advance_height = pfrface->height;\n\n      pfrface->underline_position  = (FT_Short)( -pfrface->units_per_EM / 10 );\n      pfrface->underline_thickness = (FT_Short)(  pfrface->units_per_EM / 30 );\n\n      /* create charmap */\n      {\n        FT_CharMapRec  charmap;\n\n\n        charmap.face        = pfrface;\n        charmap.platform_id = TT_PLATFORM_MICROSOFT;\n        charmap.encoding_id = TT_MS_ID_UNICODE_CS;\n        charmap.encoding    = FT_ENCODING_UNICODE;\n\n        error = FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL );\n\n#if 0\n        /* Select default charmap */\n        if ( pfrface->num_charmaps )\n          pfrface->charmap = pfrface->charmaps[0];\n#endif\n      }\n\n      /* check whether we've loaded any kerning pairs */\n      if ( phy_font->num_kern_pairs )\n        pfrface->face_flags |= FT_FACE_FLAG_KERNING;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    SLOT OBJECT METHOD                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_slot_init( FT_GlyphSlot  pfrslot )        /* PFR_Slot */\n  {\n    PFR_Slot        slot   = (PFR_Slot)pfrslot;\n    FT_GlyphLoader  loader = pfrslot->internal->loader;\n\n\n    pfr_glyph_init( &slot->glyph, loader );\n\n    return 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  pfr_slot_done( FT_GlyphSlot  pfrslot )        /* PFR_Slot */\n  {\n    PFR_Slot  slot = (PFR_Slot)pfrslot;\n\n\n    pfr_glyph_done( &slot->glyph );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_slot_load( FT_GlyphSlot  pfrslot,         /* PFR_Slot */\n                 FT_Size       pfrsize,         /* PFR_Size */\n                 FT_UInt       gindex,\n                 FT_Int32      load_flags )\n  {\n    PFR_Slot     slot    = (PFR_Slot)pfrslot;\n    PFR_Size     size    = (PFR_Size)pfrsize;\n    FT_Error     error;\n    PFR_Face     face    = (PFR_Face)pfrslot->face;\n    PFR_Char     gchar;\n    FT_Outline*  outline = &pfrslot->outline;\n    FT_ULong     gps_offset;\n\n\n    if ( gindex > 0 )\n      gindex--;\n\n    if ( !face || gindex >= face->phy_font.num_chars )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* try to load an embedded bitmap */\n    if ( ( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP ) ) == 0 )\n    {\n      error = pfr_slot_load_bitmap( slot, size, gindex );\n      if ( error == 0 )\n        goto Exit;\n    }\n\n    if ( load_flags & FT_LOAD_SBITS_ONLY )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    gchar               = face->phy_font.chars + gindex;\n    pfrslot->format     = FT_GLYPH_FORMAT_OUTLINE;\n    outline->n_points   = 0;\n    outline->n_contours = 0;\n    gps_offset          = face->header.gps_section_offset;\n\n    /* load the glyph outline (FT_LOAD_NO_RECURSE isn't supported) */\n    error = pfr_glyph_load( &slot->glyph, face->root.stream,\n                            gps_offset, gchar->gps_offset, gchar->gps_size );\n\n    if ( !error )\n    {\n      FT_BBox            cbox;\n      FT_Glyph_Metrics*  metrics = &pfrslot->metrics;\n      FT_Pos             advance;\n      FT_Int             em_metrics, em_outline;\n      FT_Bool            scaling;\n\n\n      scaling = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 );\n\n      /* copy outline data */\n      *outline = slot->glyph.loader->base.outline;\n\n      outline->flags &= ~FT_OUTLINE_OWNER;\n      outline->flags |= FT_OUTLINE_REVERSE_FILL;\n\n      if ( size && pfrsize->metrics.y_ppem < 24 )\n        outline->flags |= FT_OUTLINE_HIGH_PRECISION;\n\n      /* compute the advance vector */\n      metrics->horiAdvance = 0;\n      metrics->vertAdvance = 0;\n\n      advance    = gchar->advance;\n      em_metrics = face->phy_font.metrics_resolution;\n      em_outline = face->phy_font.outline_resolution;\n\n      if ( em_metrics != em_outline )\n        advance = FT_MulDiv( advance, em_outline, em_metrics );\n\n      if ( face->phy_font.flags & PFR_PHY_VERTICAL )\n        metrics->vertAdvance = advance;\n      else\n        metrics->horiAdvance = advance;\n\n      pfrslot->linearHoriAdvance = metrics->horiAdvance;\n      pfrslot->linearVertAdvance = metrics->vertAdvance;\n\n      /* make-up vertical metrics(?) */\n      metrics->vertBearingX = 0;\n      metrics->vertBearingY = 0;\n\n#if 0 /* some fonts seem to be broken here! */\n\n      /* Apply the font matrix, if any.                 */\n      /* TODO: Test existing fonts with unusual matrix  */\n      /* whether we have to adjust Units per EM.        */\n      {\n        FT_Matrix font_matrix;\n\n\n        font_matrix.xx = face->log_font.matrix[0] << 8;\n        font_matrix.yx = face->log_font.matrix[1] << 8;\n        font_matrix.xy = face->log_font.matrix[2] << 8;\n        font_matrix.yy = face->log_font.matrix[3] << 8;\n\n        FT_Outline_Transform( outline, &font_matrix );\n      }\n#endif\n\n      /* scale when needed */\n      if ( scaling )\n      {\n        FT_Int      n;\n        FT_Fixed    x_scale = pfrsize->metrics.x_scale;\n        FT_Fixed    y_scale = pfrsize->metrics.y_scale;\n        FT_Vector*  vec     = outline->points;\n\n\n        /* scale outline points */\n        for ( n = 0; n < outline->n_points; n++, vec++ )\n        {\n          vec->x = FT_MulFix( vec->x, x_scale );\n          vec->y = FT_MulFix( vec->y, y_scale );\n        }\n\n        /* scale the advance */\n        metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );\n        metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );\n      }\n\n      /* compute the rest of the metrics */\n      FT_Outline_Get_CBox( outline, &cbox );\n\n      metrics->width        = cbox.xMax - cbox.xMin;\n      metrics->height       = cbox.yMax - cbox.yMin;\n      metrics->horiBearingX = cbox.xMin;\n      metrics->horiBearingY = cbox.yMax - metrics->height;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      KERNING METHOD                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( FT_Error )\n  pfr_face_get_kerning( FT_Face     pfrface,        /* PFR_Face */\n                        FT_UInt     glyph1,\n                        FT_UInt     glyph2,\n                        FT_Vector*  kerning )\n  {\n    PFR_Face     face     = (PFR_Face)pfrface;\n    FT_Error     error    = FT_Err_Ok;\n    PFR_PhyFont  phy_font = &face->phy_font;\n    FT_UInt32    code1, code2, pair;\n\n\n    kerning->x = 0;\n    kerning->y = 0;\n\n    if ( glyph1 > 0 )\n      glyph1--;\n\n    if ( glyph2 > 0 )\n      glyph2--;\n\n    /* convert glyph indices to character codes */\n    if ( glyph1 > phy_font->num_chars ||\n         glyph2 > phy_font->num_chars )\n      goto Exit;\n\n    code1 = phy_font->chars[glyph1].char_code;\n    code2 = phy_font->chars[glyph2].char_code;\n    pair  = PFR_KERN_INDEX( code1, code2 );\n\n    /* now search the list of kerning items */\n    {\n      PFR_KernItem  item   = phy_font->kern_items;\n      FT_Stream     stream = pfrface->stream;\n\n\n      for ( ; item; item = item->next )\n      {\n        if ( pair >= item->pair1 && pair <= item->pair2 )\n          goto FoundPair;\n      }\n      goto Exit;\n\n    FoundPair: /* we found an item, now parse it and find the value if any */\n      if ( FT_STREAM_SEEK( item->offset )                       ||\n           FT_FRAME_ENTER( item->pair_count * item->pair_size ) )\n        goto Exit;\n\n      {\n        FT_UInt    count       = item->pair_count;\n        FT_UInt    size        = item->pair_size;\n        FT_UInt    power       = (FT_UInt)ft_highpow2( (FT_UInt32)count );\n        FT_UInt    probe       = power * size;\n        FT_UInt    extra       = count - power;\n        FT_Byte*   base        = stream->cursor;\n        FT_Bool    twobytes    = FT_BOOL( item->flags & 1 );\n        FT_Bool    twobyte_adj = FT_BOOL( item->flags & 2 );\n        FT_Byte*   p;\n        FT_UInt32  cpair;\n\n\n        if ( extra > 0 )\n        {\n          p = base + extra * size;\n\n          if ( twobytes )\n            cpair = FT_NEXT_ULONG( p );\n          else\n            cpair = PFR_NEXT_KPAIR( p );\n\n          if ( cpair == pair )\n            goto Found;\n\n          if ( cpair < pair )\n          {\n            if ( twobyte_adj )\n              p += 2;\n            else\n              p++;\n            base = p;\n          }\n        }\n\n        while ( probe > size )\n        {\n          probe >>= 1;\n          p       = base + probe;\n\n          if ( twobytes )\n            cpair = FT_NEXT_ULONG( p );\n          else\n            cpair = PFR_NEXT_KPAIR( p );\n\n          if ( cpair == pair )\n            goto Found;\n\n          if ( cpair < pair )\n            base += probe;\n        }\n\n        p = base;\n\n        if ( twobytes )\n          cpair = FT_NEXT_ULONG( p );\n        else\n          cpair = PFR_NEXT_KPAIR( p );\n\n        if ( cpair == pair )\n        {\n          FT_Int  value;\n\n\n        Found:\n          if ( twobyte_adj )\n            value = FT_PEEK_SHORT( p );\n          else\n            value = p[0];\n\n          kerning->x = item->base_adj + value;\n        }\n      }\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    return error;\n  }\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrobjs.h                                                              */\n/*                                                                         */\n/*    FreeType PFR object methods (specification).                         */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2004 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PFROBJS_H__\n#define __PFROBJS_H__\n\n#include \"pfrtypes.h\"\n\n\nFT_BEGIN_HEADER\n\n  typedef struct PFR_FaceRec_*  PFR_Face;\n\n  typedef struct PFR_SizeRec_*  PFR_Size;\n\n  typedef struct PFR_SlotRec_*  PFR_Slot;\n\n\n  typedef struct  PFR_FaceRec_\n  {\n    FT_FaceRec      root;\n    PFR_HeaderRec   header;\n    PFR_LogFontRec  log_font;\n    PFR_PhyFontRec  phy_font;\n\n  } PFR_FaceRec;\n\n\n  typedef struct  PFR_SizeRec_\n  {\n    FT_SizeRec  root;\n\n  } PFR_SizeRec;\n\n\n  typedef struct  PFR_SlotRec_\n  {\n    FT_GlyphSlotRec  root;\n    PFR_GlyphRec     glyph;\n\n  } PFR_SlotRec;\n\n\n  FT_LOCAL( FT_Error )\n  pfr_face_init( FT_Stream      stream,\n                 FT_Face        face,           /* PFR_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  pfr_face_done( FT_Face  face );               /* PFR_Face */\n\n\n  FT_LOCAL( FT_Error )\n  pfr_face_get_kerning( FT_Face     face,       /* PFR_Face */\n                        FT_UInt     glyph1,\n                        FT_UInt     glyph2,\n                        FT_Vector*  kerning );\n\n\n  FT_LOCAL( FT_Error )\n  pfr_slot_init( FT_GlyphSlot  slot );          /* PFR_Slot */\n\n  FT_LOCAL( void )\n  pfr_slot_done( FT_GlyphSlot  slot );          /* PFR_Slot */\n\n\n  FT_LOCAL( FT_Error )\n  pfr_slot_load( FT_GlyphSlot  slot,            /* PFR_Slot */\n                 FT_Size       size,            /* PFR_Size */\n                 FT_UInt       gindex,\n                 FT_Int32      load_flags );\n\n\nFT_END_HEADER\n\n#endif /* __PFROBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrsbit.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrsbit.c                                                              */\n/*                                                                         */\n/*    FreeType PFR bitmap loader (body).                                   */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006, 2009, 2010, 2013 by                        */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"pfrsbit.h\"\n#include \"pfrload.h\"\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n\n#include \"pfrerror.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pfr\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      PFR BIT WRITER                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct  PFR_BitWriter_\n  {\n    FT_Byte*  line;      /* current line start                    */\n    FT_Int    pitch;     /* line size in bytes                    */\n    FT_Int    width;     /* width in pixels/bits                  */\n    FT_Int    rows;      /* number of remaining rows to scan      */\n    FT_Int    total;     /* total number of bits to draw          */\n\n  } PFR_BitWriterRec, *PFR_BitWriter;\n\n\n  static void\n  pfr_bitwriter_init( PFR_BitWriter  writer,\n                      FT_Bitmap*     target,\n                      FT_Bool        decreasing )\n  {\n    writer->line   = target->buffer;\n    writer->pitch  = target->pitch;\n    writer->width  = target->width;\n    writer->rows   = target->rows;\n    writer->total  = writer->width * writer->rows;\n\n    if ( !decreasing )\n    {\n      writer->line += writer->pitch * ( target->rows-1 );\n      writer->pitch = -writer->pitch;\n    }\n  }\n\n\n  static void\n  pfr_bitwriter_decode_bytes( PFR_BitWriter  writer,\n                              FT_Byte*       p,\n                              FT_Byte*       limit )\n  {\n    FT_Int    n, reload;\n    FT_Int    left = writer->width;\n    FT_Byte*  cur  = writer->line;\n    FT_UInt   mask = 0x80;\n    FT_UInt   val  = 0;\n    FT_UInt   c    = 0;\n\n\n    n = (FT_Int)( limit - p ) * 8;\n    if ( n > writer->total )\n      n = writer->total;\n\n    reload = n & 7;\n\n    for ( ; n > 0; n-- )\n    {\n      if ( ( n & 7 ) == reload )\n        val = *p++;\n\n      if ( val & 0x80 )\n        c |= mask;\n\n      val  <<= 1;\n      mask >>= 1;\n\n      if ( --left <= 0 )\n      {\n        cur[0] = (FT_Byte)c;\n        left   = writer->width;\n        mask   = 0x80;\n\n        writer->line += writer->pitch;\n        cur           = writer->line;\n        c             = 0;\n      }\n      else if ( mask == 0 )\n      {\n        cur[0] = (FT_Byte)c;\n        mask   = 0x80;\n        c      = 0;\n        cur ++;\n      }\n    }\n\n    if ( mask != 0x80 )\n      cur[0] = (FT_Byte)c;\n  }\n\n\n  static void\n  pfr_bitwriter_decode_rle1( PFR_BitWriter  writer,\n                             FT_Byte*       p,\n                             FT_Byte*       limit )\n  {\n    FT_Int    n, phase, count, counts[2], reload;\n    FT_Int    left = writer->width;\n    FT_Byte*  cur  = writer->line;\n    FT_UInt   mask = 0x80;\n    FT_UInt   c    = 0;\n\n\n    n = writer->total;\n\n    phase     = 1;\n    counts[0] = 0;\n    counts[1] = 0;\n    count     = 0;\n    reload    = 1;\n\n    for ( ; n > 0; n-- )\n    {\n      if ( reload )\n      {\n        do\n        {\n          if ( phase )\n          {\n            FT_Int  v;\n\n\n            if ( p >= limit )\n              break;\n\n            v         = *p++;\n            counts[0] = v >> 4;\n            counts[1] = v & 15;\n            phase     = 0;\n            count     = counts[0];\n          }\n          else\n          {\n            phase = 1;\n            count = counts[1];\n          }\n\n        } while ( count == 0 );\n      }\n\n      if ( phase )\n        c |= mask;\n\n      mask >>= 1;\n\n      if ( --left <= 0 )\n      {\n        cur[0] = (FT_Byte) c;\n        left   = writer->width;\n        mask   = 0x80;\n\n        writer->line += writer->pitch;\n        cur           = writer->line;\n        c             = 0;\n      }\n      else if ( mask == 0 )\n      {\n        cur[0] = (FT_Byte)c;\n        mask   = 0x80;\n        c      = 0;\n        cur ++;\n      }\n\n      reload = ( --count <= 0 );\n    }\n\n    if ( mask != 0x80 )\n      cur[0] = (FT_Byte) c;\n  }\n\n\n  static void\n  pfr_bitwriter_decode_rle2( PFR_BitWriter  writer,\n                             FT_Byte*       p,\n                             FT_Byte*       limit )\n  {\n    FT_Int    n, phase, count, reload;\n    FT_Int    left = writer->width;\n    FT_Byte*  cur  = writer->line;\n    FT_UInt   mask = 0x80;\n    FT_UInt   c    = 0;\n\n\n    n = writer->total;\n\n    phase  = 1;\n    count  = 0;\n    reload = 1;\n\n    for ( ; n > 0; n-- )\n    {\n      if ( reload )\n      {\n        do\n        {\n          if ( p >= limit )\n            break;\n\n          count = *p++;\n          phase = phase ^ 1;\n\n        } while ( count == 0 );\n      }\n\n      if ( phase )\n        c |= mask;\n\n      mask >>= 1;\n\n      if ( --left <= 0 )\n      {\n        cur[0] = (FT_Byte) c;\n        c      = 0;\n        mask   = 0x80;\n        left   = writer->width;\n\n        writer->line += writer->pitch;\n        cur           = writer->line;\n      }\n      else if ( mask == 0 )\n      {\n        cur[0] = (FT_Byte)c;\n        c      = 0;\n        mask   = 0x80;\n        cur ++;\n      }\n\n      reload = ( --count <= 0 );\n    }\n\n    if ( mask != 0x80 )\n      cur[0] = (FT_Byte) c;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  BITMAP DATA DECODING                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  pfr_lookup_bitmap_data( FT_Byte*   base,\n                          FT_Byte*   limit,\n                          FT_UInt    count,\n                          FT_UInt    flags,\n                          FT_UInt    char_code,\n                          FT_ULong*  found_offset,\n                          FT_ULong*  found_size )\n  {\n    FT_UInt   left, right, char_len;\n    FT_Bool   two = FT_BOOL( flags & 1 );\n    FT_Byte*  buff;\n\n\n    char_len = 4;\n    if ( two )       char_len += 1;\n    if ( flags & 2 ) char_len += 1;\n    if ( flags & 4 ) char_len += 1;\n\n    left  = 0;\n    right = count;\n\n    while ( left < right )\n    {\n      FT_UInt  middle, code;\n\n\n      middle = ( left + right ) >> 1;\n      buff   = base + middle * char_len;\n\n      /* check that we are not outside of the table -- */\n      /* this is possible with broken fonts...         */\n      if ( buff + char_len > limit )\n        goto Fail;\n\n      if ( two )\n        code = PFR_NEXT_USHORT( buff );\n      else\n        code = PFR_NEXT_BYTE( buff );\n\n      if ( code == char_code )\n        goto Found_It;\n\n      if ( code < char_code )\n        left = middle;\n      else\n        right = middle;\n    }\n\n  Fail:\n    /* Not found */\n    *found_size   = 0;\n    *found_offset = 0;\n    return;\n\n  Found_It:\n    if ( flags & 2 )\n      *found_size = PFR_NEXT_USHORT( buff );\n    else\n      *found_size = PFR_NEXT_BYTE( buff );\n\n    if ( flags & 4 )\n      *found_offset = PFR_NEXT_ULONG( buff );\n    else\n      *found_offset = PFR_NEXT_USHORT( buff );\n  }\n\n\n  /* load bitmap metrics.  \"*padvance\" must be set to the default value */\n  /* before calling this function...                                    */\n  /*                                                                    */\n  static FT_Error\n  pfr_load_bitmap_metrics( FT_Byte**  pdata,\n                           FT_Byte*   limit,\n                           FT_Long    scaled_advance,\n                           FT_Long   *axpos,\n                           FT_Long   *aypos,\n                           FT_UInt   *axsize,\n                           FT_UInt   *aysize,\n                           FT_Long   *aadvance,\n                           FT_UInt   *aformat )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Byte   flags;\n    FT_Char   b;\n    FT_Byte*  p = *pdata;\n    FT_Long   xpos, ypos, advance;\n    FT_UInt   xsize, ysize;\n\n\n    PFR_CHECK( 1 );\n    flags = PFR_NEXT_BYTE( p );\n\n    xpos    = 0;\n    ypos    = 0;\n    xsize   = 0;\n    ysize   = 0;\n    advance = 0;\n\n    switch ( flags & 3 )\n    {\n    case 0:\n      PFR_CHECK( 1 );\n      b    = PFR_NEXT_INT8( p );\n      xpos = b >> 4;\n      ypos = ( (FT_Char)( b << 4 ) ) >> 4;\n      break;\n\n    case 1:\n      PFR_CHECK( 2 );\n      xpos = PFR_NEXT_INT8( p );\n      ypos = PFR_NEXT_INT8( p );\n      break;\n\n    case 2:\n      PFR_CHECK( 4 );\n      xpos = PFR_NEXT_SHORT( p );\n      ypos = PFR_NEXT_SHORT( p );\n      break;\n\n    case 3:\n      PFR_CHECK( 6 );\n      xpos = PFR_NEXT_LONG( p );\n      ypos = PFR_NEXT_LONG( p );\n      break;\n\n    default:\n      ;\n    }\n\n    flags >>= 2;\n    switch ( flags & 3 )\n    {\n    case 0:\n      /* blank image */\n      xsize = 0;\n      ysize = 0;\n      break;\n\n    case 1:\n      PFR_CHECK( 1 );\n      b     = PFR_NEXT_BYTE( p );\n      xsize = ( b >> 4 ) & 0xF;\n      ysize = b & 0xF;\n      break;\n\n    case 2:\n      PFR_CHECK( 2 );\n      xsize = PFR_NEXT_BYTE( p );\n      ysize = PFR_NEXT_BYTE( p );\n      break;\n\n    case 3:\n      PFR_CHECK( 4 );\n      xsize = PFR_NEXT_USHORT( p );\n      ysize = PFR_NEXT_USHORT( p );\n      break;\n\n    default:\n      ;\n    }\n\n    flags >>= 2;\n    switch ( flags & 3 )\n    {\n    case 0:\n      advance = scaled_advance;\n      break;\n\n    case 1:\n      PFR_CHECK( 1 );\n      advance = PFR_NEXT_INT8( p ) << 8;\n      break;\n\n    case 2:\n      PFR_CHECK( 2 );\n      advance = PFR_NEXT_SHORT( p );\n      break;\n\n    case 3:\n      PFR_CHECK( 3 );\n      advance = PFR_NEXT_LONG( p );\n      break;\n\n    default:\n      ;\n    }\n\n    *axpos    = xpos;\n    *aypos    = ypos;\n    *axsize   = xsize;\n    *aysize   = ysize;\n    *aadvance = advance;\n    *aformat  = flags >> 2;\n    *pdata    = p;\n\n  Exit:\n    return error;\n\n  Too_Short:\n    error = FT_THROW( Invalid_Table );\n    FT_ERROR(( \"pfr_load_bitmap_metrics: invalid glyph data\\n\" ));\n    goto Exit;\n  }\n\n\n  static FT_Error\n  pfr_load_bitmap_bits( FT_Byte*    p,\n                        FT_Byte*    limit,\n                        FT_UInt     format,\n                        FT_Bool     decreasing,\n                        FT_Bitmap*  target )\n  {\n    FT_Error          error = FT_Err_Ok;\n    PFR_BitWriterRec  writer;\n\n\n    if ( target->rows > 0 && target->width > 0 )\n    {\n      pfr_bitwriter_init( &writer, target, decreasing );\n\n      switch ( format )\n      {\n      case 0: /* packed bits */\n        pfr_bitwriter_decode_bytes( &writer, p, limit );\n        break;\n\n      case 1: /* RLE1 */\n        pfr_bitwriter_decode_rle1( &writer, p, limit );\n        break;\n\n      case 2: /* RLE2 */\n        pfr_bitwriter_decode_rle2( &writer, p, limit );\n        break;\n\n      default:\n        FT_ERROR(( \"pfr_read_bitmap_data: invalid image type\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n      }\n    }\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     BITMAP LOADING                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( FT_Error )\n  pfr_slot_load_bitmap( PFR_Slot  glyph,\n                        PFR_Size  size,\n                        FT_UInt   glyph_index )\n  {\n    FT_Error     error;\n    PFR_Face     face   = (PFR_Face) glyph->root.face;\n    FT_Stream    stream = face->root.stream;\n    PFR_PhyFont  phys   = &face->phy_font;\n    FT_ULong     gps_offset;\n    FT_ULong     gps_size;\n    PFR_Char     character;\n    PFR_Strike   strike;\n\n\n    character = &phys->chars[glyph_index];\n\n    /* Look-up a bitmap strike corresponding to the current */\n    /* character dimensions                                 */\n    {\n      FT_UInt  n;\n\n\n      strike = phys->strikes;\n      for ( n = 0; n < phys->num_strikes; n++ )\n      {\n        if ( strike->x_ppm == (FT_UInt)size->root.metrics.x_ppem &&\n             strike->y_ppm == (FT_UInt)size->root.metrics.y_ppem )\n        {\n          goto Found_Strike;\n        }\n\n        strike++;\n      }\n\n      /* couldn't find it */\n      return FT_THROW( Invalid_Argument );\n    }\n\n  Found_Strike:\n\n    /* Now lookup the glyph's position within the file */\n    {\n      FT_UInt  char_len;\n\n\n      char_len = 4;\n      if ( strike->flags & 1 ) char_len += 1;\n      if ( strike->flags & 2 ) char_len += 1;\n      if ( strike->flags & 4 ) char_len += 1;\n\n      /* Access data directly in the frame to speed lookups */\n      if ( FT_STREAM_SEEK( phys->bct_offset + strike->bct_offset ) ||\n           FT_FRAME_ENTER( char_len * strike->num_bitmaps )        )\n        goto Exit;\n\n      pfr_lookup_bitmap_data( stream->cursor,\n                              stream->limit,\n                              strike->num_bitmaps,\n                              strike->flags,\n                              character->char_code,\n                              &gps_offset,\n                              &gps_size );\n\n      FT_FRAME_EXIT();\n\n      if ( gps_size == 0 )\n      {\n        /* Could not find a bitmap program string for this glyph */\n        error = FT_THROW( Invalid_Argument );\n        goto Exit;\n      }\n    }\n\n    /* get the bitmap metrics */\n    {\n      FT_Long   xpos = 0, ypos = 0, advance = 0;\n      FT_UInt   xsize = 0, ysize = 0, format = 0;\n      FT_Byte*  p;\n\n\n      /* compute linear advance */\n      advance = character->advance;\n      if ( phys->metrics_resolution != phys->outline_resolution )\n        advance = FT_MulDiv( advance,\n                             phys->outline_resolution,\n                             phys->metrics_resolution );\n\n      glyph->root.linearHoriAdvance = advance;\n\n      /* compute default advance, i.e., scaled advance.  This can be */\n      /* overridden in the bitmap header of certain glyphs.          */\n      advance = FT_MulDiv( (FT_Fixed)size->root.metrics.x_ppem << 8,\n                           character->advance,\n                           phys->metrics_resolution );\n\n      if ( FT_STREAM_SEEK( face->header.gps_section_offset + gps_offset ) ||\n           FT_FRAME_ENTER( gps_size )                                     )\n        goto Exit;\n\n      p     = stream->cursor;\n      error = pfr_load_bitmap_metrics( &p, stream->limit,\n                                       advance,\n                                       &xpos, &ypos,\n                                       &xsize, &ysize,\n                                       &advance, &format );\n\n      /*\n       * XXX: on 16bit system, we return an error for huge bitmap\n       *      which causes a size truncation, because truncated\n       *      size properties makes bitmap glyph broken.\n       */\n      if ( xpos > FT_INT_MAX || ( ypos + ysize ) > FT_INT_MAX )\n      {\n        FT_TRACE1(( \"pfr_slot_load_bitmap:\" ));\n        FT_TRACE1(( \"huge bitmap glyph %dx%d over FT_GlyphSlot\\n\",\n                     xpos, ypos ));\n        error = FT_THROW( Invalid_Pixel_Size );\n      }\n\n      if ( !error )\n      {\n        glyph->root.format = FT_GLYPH_FORMAT_BITMAP;\n\n        /* Set up glyph bitmap and metrics */\n\n        /* XXX: needs casts to fit FT_Bitmap.{width|rows|pitch} */\n        glyph->root.bitmap.width      = (FT_Int)xsize;\n        glyph->root.bitmap.rows       = (FT_Int)ysize;\n        glyph->root.bitmap.pitch      = (FT_Int)( xsize + 7 ) >> 3;\n        glyph->root.bitmap.pixel_mode = FT_PIXEL_MODE_MONO;\n\n        /* XXX: needs casts to fit FT_Glyph_Metrics.{width|height} */\n        glyph->root.metrics.width        = (FT_Pos)xsize << 6;\n        glyph->root.metrics.height       = (FT_Pos)ysize << 6;\n        glyph->root.metrics.horiBearingX = xpos << 6;\n        glyph->root.metrics.horiBearingY = ypos << 6;\n        glyph->root.metrics.horiAdvance  = FT_PIX_ROUND( ( advance >> 2 ) );\n        glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1;\n        glyph->root.metrics.vertBearingY = 0;\n        glyph->root.metrics.vertAdvance  = size->root.metrics.height;\n\n        /* XXX: needs casts fit FT_GlyphSlotRec.bitmap_{left|top} */\n        glyph->root.bitmap_left = (FT_Int)xpos;\n        glyph->root.bitmap_top  = (FT_Int)(ypos + ysize);\n\n        /* Allocate and read bitmap data */\n        {\n          FT_ULong  len = glyph->root.bitmap.pitch * ysize;\n\n\n          error = ft_glyphslot_alloc_bitmap( &glyph->root, len );\n          if ( !error )\n          {\n            error = pfr_load_bitmap_bits(\n                      p,\n                      stream->limit,\n                      format,\n                      FT_BOOL(face->header.color_flags & 2),\n                      &glyph->root.bitmap );\n          }\n        }\n      }\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    return error;\n  }\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrsbit.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrsbit.h                                                              */\n/*                                                                         */\n/*    FreeType PFR bitmap loader (specification).                          */\n/*                                                                         */\n/*  Copyright 2002 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PFRSBIT_H__\n#define __PFRSBIT_H__\n\n#include \"pfrobjs.h\"\n\nFT_BEGIN_HEADER\n\n  FT_LOCAL( FT_Error )\n  pfr_slot_load_bitmap( PFR_Slot  glyph,\n                        PFR_Size  size,\n                        FT_UInt   glyph_index );\n\nFT_END_HEADER\n\n#endif /* __PFR_SBIT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/pfrtypes.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pfrtypes.h                                                             */\n/*                                                                         */\n/*    FreeType PFR data structures (specification only).                   */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2005, 2007 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PFRTYPES_H__\n#define __PFRTYPES_H__\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n\nFT_BEGIN_HEADER\n\n  /************************************************************************/\n\n  /* the PFR Header structure */\n  typedef struct  PFR_HeaderRec_\n  {\n    FT_UInt32  signature;\n    FT_UInt    version;\n    FT_UInt    signature2;\n    FT_UInt    header_size;\n\n    FT_UInt    log_dir_size;\n    FT_UInt    log_dir_offset;\n\n    FT_UInt    log_font_max_size;\n    FT_UInt32  log_font_section_size;\n    FT_UInt32  log_font_section_offset;\n\n    FT_UInt32  phy_font_max_size;\n    FT_UInt32  phy_font_section_size;\n    FT_UInt32  phy_font_section_offset;\n\n    FT_UInt    gps_max_size;\n    FT_UInt32  gps_section_size;\n    FT_UInt32  gps_section_offset;\n\n    FT_UInt    max_blue_values;\n    FT_UInt    max_x_orus;\n    FT_UInt    max_y_orus;\n\n    FT_UInt    phy_font_max_size_high;\n    FT_UInt    color_flags;\n\n    FT_UInt32  bct_max_size;\n    FT_UInt32  bct_set_max_size;\n    FT_UInt32  phy_bct_set_max_size;\n\n    FT_UInt    num_phy_fonts;\n    FT_UInt    max_vert_stem_snap;\n    FT_UInt    max_horz_stem_snap;\n    FT_UInt    max_chars;\n\n  } PFR_HeaderRec, *PFR_Header;\n\n\n  /* used in `color_flags' field of the PFR_Header */\n  typedef enum  PFR_HeaderFlags_\n  {\n    PFR_FLAG_BLACK_PIXEL   = 1,\n    PFR_FLAG_INVERT_BITMAP = 2\n\n  } PFR_HeaderFlags;\n\n\n  /************************************************************************/\n\n  typedef struct  PFR_LogFontRec_\n  {\n    FT_UInt32  size;\n    FT_UInt32  offset;\n\n    FT_Int32   matrix[4];\n    FT_UInt    stroke_flags;\n    FT_Int     stroke_thickness;\n    FT_Int     bold_thickness;\n    FT_Int32   miter_limit;\n\n    FT_UInt32  phys_size;\n    FT_UInt32  phys_offset;\n\n  } PFR_LogFontRec, *PFR_LogFont;\n\n\n  typedef enum  PFR_LogFlags_\n  {\n    PFR_LOG_EXTRA_ITEMS  = 0x40,\n    PFR_LOG_2BYTE_BOLD   = 0x20,\n    PFR_LOG_BOLD         = 0x10,\n    PFR_LOG_2BYTE_STROKE = 8,\n    PFR_LOG_STROKE       = 4,\n    PFR_LINE_JOIN_MASK   = 3\n\n  } PFR_LogFlags;\n\n\n  typedef enum  PFR_LineJoinFlags_\n  {\n    PFR_LINE_JOIN_MITER = 0,\n    PFR_LINE_JOIN_ROUND = 1,\n    PFR_LINE_JOIN_BEVEL = 2\n\n  } PFR_LineJoinFlags;\n\n\n  /************************************************************************/\n\n  typedef enum  PFR_BitmapFlags_\n  {\n    PFR_BITMAP_3BYTE_OFFSET   = 4,\n    PFR_BITMAP_2BYTE_SIZE     = 2,\n    PFR_BITMAP_2BYTE_CHARCODE = 1\n\n  } PFR_BitmapFlags;\n\n\n  typedef struct  PFR_BitmapCharRec_\n  {\n    FT_UInt    char_code;\n    FT_UInt    gps_size;\n    FT_UInt32  gps_offset;\n\n  } PFR_BitmapCharRec, *PFR_BitmapChar;\n\n\n  typedef enum  PFR_StrikeFlags_\n  {\n    PFR_STRIKE_2BYTE_COUNT  = 0x10,\n    PFR_STRIKE_3BYTE_OFFSET = 0x08,\n    PFR_STRIKE_3BYTE_SIZE   = 0x04,\n    PFR_STRIKE_2BYTE_YPPM   = 0x02,\n    PFR_STRIKE_2BYTE_XPPM   = 0x01\n\n  } PFR_StrikeFlags;\n\n\n  typedef struct  PFR_StrikeRec_\n  {\n    FT_UInt         x_ppm;\n    FT_UInt         y_ppm;\n    FT_UInt         flags;\n\n    FT_UInt32       gps_size;\n    FT_UInt32       gps_offset;\n\n    FT_UInt32       bct_size;\n    FT_UInt32       bct_offset;\n\n    /* optional */\n    FT_UInt         num_bitmaps;\n    PFR_BitmapChar  bitmaps;\n\n  } PFR_StrikeRec, *PFR_Strike;\n\n\n  /************************************************************************/\n\n  typedef struct  PFR_CharRec_\n  {\n    FT_UInt    char_code;\n    FT_Int     advance;\n    FT_UInt    gps_size;\n    FT_UInt32  gps_offset;\n\n  } PFR_CharRec, *PFR_Char;\n\n\n  /************************************************************************/\n\n  typedef struct  PFR_DimensionRec_\n  {\n    FT_UInt  standard;\n    FT_UInt  num_stem_snaps;\n    FT_Int*  stem_snaps;\n\n  } PFR_DimensionRec, *PFR_Dimension;\n\n  /************************************************************************/\n\n  typedef struct PFR_KernItemRec_*  PFR_KernItem;\n\n  typedef struct  PFR_KernItemRec_\n  {\n    PFR_KernItem  next;\n    FT_Byte       pair_count;\n    FT_Byte       flags;\n    FT_Short      base_adj;\n    FT_UInt       pair_size;\n    FT_Offset     offset;\n    FT_UInt32     pair1;\n    FT_UInt32     pair2;\n\n  } PFR_KernItemRec;\n\n\n#define PFR_KERN_INDEX( g1, g2 )                          \\\n          ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) )\n\n#define PFR_KERN_PAIR_INDEX( pair )                        \\\n          PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 )\n\n#define PFR_NEXT_KPAIR( p )  ( p += 2,                              \\\n                               ( (FT_UInt32)p[-2] << 16 ) | p[-1] )\n\n\n  /************************************************************************/\n\n  typedef struct  PFR_PhyFontRec_\n  {\n    FT_Memory          memory;\n    FT_UInt32          offset;\n\n    FT_UInt            font_ref_number;\n    FT_UInt            outline_resolution;\n    FT_UInt            metrics_resolution;\n    FT_BBox            bbox;\n    FT_UInt            flags;\n    FT_UInt            standard_advance;\n\n    FT_Int             ascent;   /* optional, bbox.yMax if not present */\n    FT_Int             descent;  /* optional, bbox.yMin if not present */\n    FT_Int             leading;  /* optional, 0 if not present         */\n\n    PFR_DimensionRec   horizontal;\n    PFR_DimensionRec   vertical;\n\n    FT_String*         font_id;\n    FT_String*         family_name;\n    FT_String*         style_name;\n\n    FT_UInt            num_strikes;\n    FT_UInt            max_strikes;\n    PFR_StrikeRec*     strikes;\n\n    FT_UInt            num_blue_values;\n    FT_Int            *blue_values;\n    FT_UInt            blue_fuzz;\n    FT_UInt            blue_scale;\n\n    FT_UInt            num_chars;\n    FT_Offset          chars_offset;\n    PFR_Char           chars;\n\n    FT_UInt            num_kern_pairs;\n    PFR_KernItem       kern_items;\n    PFR_KernItem*      kern_items_tail;\n\n    /* not part of the spec, but used during load */\n    FT_Long            bct_offset;\n    FT_Byte*           cursor;\n\n  } PFR_PhyFontRec, *PFR_PhyFont;\n\n\n  typedef enum  PFR_PhyFlags_\n  {\n    PFR_PHY_EXTRA_ITEMS      = 0x80,\n    PFR_PHY_3BYTE_GPS_OFFSET = 0x20,\n    PFR_PHY_2BYTE_GPS_SIZE   = 0x10,\n    PFR_PHY_ASCII_CODE       = 0x08,\n    PFR_PHY_PROPORTIONAL     = 0x04,\n    PFR_PHY_2BYTE_CHARCODE   = 0x02,\n    PFR_PHY_VERTICAL         = 0x01\n\n  } PFR_PhyFlags;\n\n\n  typedef enum PFR_KernFlags_\n  {\n    PFR_KERN_2BYTE_CHAR  = 0x01,\n    PFR_KERN_2BYTE_ADJ   = 0x02\n\n  } PFR_KernFlags;\n\n\n  /************************************************************************/\n\n  typedef enum  PFR_GlyphFlags_\n  {\n    PFR_GLYPH_IS_COMPOUND   = 0x80,\n    PFR_GLYPH_EXTRA_ITEMS   = 0x08,\n    PFR_GLYPH_1BYTE_XYCOUNT = 0x04,\n    PFR_GLYPH_XCOUNT        = 0x02,\n    PFR_GLYPH_YCOUNT        = 0x01\n\n  } PFR_GlyphFlags;\n\n\n  /* controlled coordinate */\n  typedef struct  PFR_CoordRec_\n  {\n    FT_UInt  org;\n    FT_UInt  cur;\n\n  } PFR_CoordRec, *PFR_Coord;\n\n\n  typedef struct  PFR_SubGlyphRec_\n  {\n    FT_Fixed   x_scale;\n    FT_Fixed   y_scale;\n    FT_Int     x_delta;\n    FT_Int     y_delta;\n    FT_UInt32  gps_offset;\n    FT_UInt    gps_size;\n\n  } PFR_SubGlyphRec, *PFR_SubGlyph;\n\n\n  typedef enum  PFR_SubgGlyphFlags_\n  {\n    PFR_SUBGLYPH_3BYTE_OFFSET = 0x80,\n    PFR_SUBGLYPH_2BYTE_SIZE   = 0x40,\n    PFR_SUBGLYPH_YSCALE       = 0x20,\n    PFR_SUBGLYPH_XSCALE       = 0x10\n\n  } PFR_SubGlyphFlags;\n\n\n  typedef struct  PFR_GlyphRec_\n  {\n    FT_Byte           format;\n\n#if 0\n    FT_UInt           num_x_control;\n    FT_UInt           num_y_control;\n#endif\n    FT_UInt           max_xy_control;\n    FT_Pos*           x_control;\n    FT_Pos*           y_control;\n\n\n    FT_UInt           num_subs;\n    FT_UInt           max_subs;\n    PFR_SubGlyphRec*  subs;\n\n    FT_GlyphLoader    loader;\n    FT_Bool           path_begun;\n\n  } PFR_GlyphRec, *PFR_Glyph;\n\n\nFT_END_HEADER\n\n#endif /* __PFRTYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pfr/rules.mk",
    "content": "#\n# FreeType 2 PFR driver configuration rules\n#\n\n\n# Copyright 2002, 2003 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# pfr driver directory\n#\nPFR_DIR := $(SRC_DIR)/pfr\n\n\n# compilation flags for the driver\n#\nPFR_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PFR_DIR))\n\n\n# pfr driver sources (i.e., C files)\n#\nPFR_DRV_SRC := $(PFR_DIR)/pfrload.c  \\\n               $(PFR_DIR)/pfrgload.c \\\n               $(PFR_DIR)/pfrcmap.c  \\\n               $(PFR_DIR)/pfrdrivr.c \\\n               $(PFR_DIR)/pfrsbit.c  \\\n               $(PFR_DIR)/pfrobjs.c\n\n# pfr driver headers\n#\nPFR_DRV_H := $(PFR_DRV_SRC:%.c=%.h) \\\n             $(PFR_DIR)/pfrerror.h  \\\n             $(PFR_DIR)/pfrtypes.h\n\n\n# Pfr driver object(s)\n#\n#   PFR_DRV_OBJ_M is used during `multi' builds\n#   PFR_DRV_OBJ_S is used during `single' builds\n#\nPFR_DRV_OBJ_M := $(PFR_DRV_SRC:$(PFR_DIR)/%.c=$(OBJ_DIR)/%.$O)\nPFR_DRV_OBJ_S := $(OBJ_DIR)/pfr.$O\n\n# pfr driver source file for single build\n#\nPFR_DRV_SRC_S := $(PFR_DIR)/pfr.c\n\n\n# pfr driver - single object\n#\n$(PFR_DRV_OBJ_S): $(PFR_DRV_SRC_S) $(PFR_DRV_SRC) $(FREETYPE_H) $(PFR_DRV_H)\n\t$(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PFR_DRV_SRC_S))\n\n\n# pfr driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(PFR_DIR)/%.c $(FREETYPE_H) $(PFR_DRV_H)\n\t$(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(PFR_DRV_OBJ_S)\nDRV_OBJS_M += $(PFR_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/psaux/Jamfile",
    "content": "# FreeType 2 src/psaux Jamfile\n#\n# Copyright 2001, 2002 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) psaux ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = psauxmod psobjs   t1decode t1cmap\n               psconv   afmparse\n               ;\n  }\n  else\n  {\n    _sources = psaux ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/psaux Jamfile\n"
  },
  {
    "path": "libs/freetype/src/psaux/afmparse.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afmparse.c                                                             */\n/*                                                                         */\n/*    AFM parser (body).                                                   */\n/*                                                                         */\n/*  Copyright 2006-2010, 2012, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n#include \"afmparse.h\"\n#include \"psconv.h\"\n\n#include \"psauxerr.h\"\n\n\n/***************************************************************************/\n/*                                                                         */\n/*    AFM_Stream                                                           */\n/*                                                                         */\n/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib.  */\n/*                                                                         */\n/*                                                                         */\n\n  enum\n  {\n    AFM_STREAM_STATUS_NORMAL,\n    AFM_STREAM_STATUS_EOC,\n    AFM_STREAM_STATUS_EOL,\n    AFM_STREAM_STATUS_EOF\n  };\n\n\n  typedef struct  AFM_StreamRec_\n  {\n    FT_Byte*  cursor;\n    FT_Byte*  base;\n    FT_Byte*  limit;\n\n    FT_Int    status;\n\n  } AFM_StreamRec;\n\n\n#ifndef EOF\n#define EOF -1\n#endif\n\n\n  /* this works because empty lines are ignored */\n#define AFM_IS_NEWLINE( ch )  ( (ch) == '\\r' || (ch) == '\\n' )\n\n#define AFM_IS_EOF( ch )      ( (ch) == EOF  || (ch) == '\\x1a' )\n#define AFM_IS_SPACE( ch )    ( (ch) == ' '  || (ch) == '\\t' )\n\n  /* column separator; there is no `column' in the spec actually */\n#define AFM_IS_SEP( ch )      ( (ch) == ';' )\n\n#define AFM_GETC()                                                       \\\n          ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \\\n                                                   : EOF )\n\n#define AFM_STREAM_KEY_BEGIN( stream )    \\\n          (char*)( (stream)->cursor - 1 )\n\n#define AFM_STREAM_KEY_LEN( stream, key )       \\\n          ( (char*)(stream)->cursor - key - 1 )\n\n#define AFM_STATUS_EOC( stream ) \\\n          ( (stream)->status >= AFM_STREAM_STATUS_EOC )\n\n#define AFM_STATUS_EOL( stream ) \\\n          ( (stream)->status >= AFM_STREAM_STATUS_EOL )\n\n#define AFM_STATUS_EOF( stream ) \\\n          ( (stream)->status >= AFM_STREAM_STATUS_EOF )\n\n\n  static int\n  afm_stream_skip_spaces( AFM_Stream  stream )\n  {\n    int  ch = 0;  /* make stupid compiler happy */\n\n\n    if ( AFM_STATUS_EOC( stream ) )\n      return ';';\n\n    while ( 1 )\n    {\n      ch = AFM_GETC();\n      if ( !AFM_IS_SPACE( ch ) )\n        break;\n    }\n\n    if ( AFM_IS_NEWLINE( ch ) )\n      stream->status = AFM_STREAM_STATUS_EOL;\n    else if ( AFM_IS_SEP( ch ) )\n      stream->status = AFM_STREAM_STATUS_EOC;\n    else if ( AFM_IS_EOF( ch ) )\n      stream->status = AFM_STREAM_STATUS_EOF;\n\n    return ch;\n  }\n\n\n  /* read a key or value in current column */\n  static char*\n  afm_stream_read_one( AFM_Stream  stream )\n  {\n    char*  str;\n    int    ch;\n\n\n    afm_stream_skip_spaces( stream );\n    if ( AFM_STATUS_EOC( stream ) )\n      return NULL;\n\n    str = AFM_STREAM_KEY_BEGIN( stream );\n\n    while ( 1 )\n    {\n      ch = AFM_GETC();\n      if ( AFM_IS_SPACE( ch ) )\n        break;\n      else if ( AFM_IS_NEWLINE( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOL;\n        break;\n      }\n      else if ( AFM_IS_SEP( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOC;\n        break;\n      }\n      else if ( AFM_IS_EOF( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOF;\n        break;\n      }\n    }\n\n    return str;\n  }\n\n\n  /* read a string (i.e., read to EOL) */\n  static char*\n  afm_stream_read_string( AFM_Stream  stream )\n  {\n    char*  str;\n    int    ch;\n\n\n    afm_stream_skip_spaces( stream );\n    if ( AFM_STATUS_EOL( stream ) )\n      return NULL;\n\n    str = AFM_STREAM_KEY_BEGIN( stream );\n\n    /* scan to eol */\n    while ( 1 )\n    {\n      ch = AFM_GETC();\n      if ( AFM_IS_NEWLINE( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOL;\n        break;\n      }\n      else if ( AFM_IS_EOF( ch ) )\n      {\n        stream->status = AFM_STREAM_STATUS_EOF;\n        break;\n      }\n    }\n\n    return str;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*    AFM_Parser                                                         */\n  /*                                                                       */\n  /*                                                                       */\n\n  /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */\n  typedef enum  AFM_Token_\n  {\n    AFM_TOKEN_ASCENDER,\n    AFM_TOKEN_AXISLABEL,\n    AFM_TOKEN_AXISTYPE,\n    AFM_TOKEN_B,\n    AFM_TOKEN_BLENDAXISTYPES,\n    AFM_TOKEN_BLENDDESIGNMAP,\n    AFM_TOKEN_BLENDDESIGNPOSITIONS,\n    AFM_TOKEN_C,\n    AFM_TOKEN_CC,\n    AFM_TOKEN_CH,\n    AFM_TOKEN_CAPHEIGHT,\n    AFM_TOKEN_CHARWIDTH,\n    AFM_TOKEN_CHARACTERSET,\n    AFM_TOKEN_CHARACTERS,\n    AFM_TOKEN_DESCENDER,\n    AFM_TOKEN_ENCODINGSCHEME,\n    AFM_TOKEN_ENDAXIS,\n    AFM_TOKEN_ENDCHARMETRICS,\n    AFM_TOKEN_ENDCOMPOSITES,\n    AFM_TOKEN_ENDDIRECTION,\n    AFM_TOKEN_ENDFONTMETRICS,\n    AFM_TOKEN_ENDKERNDATA,\n    AFM_TOKEN_ENDKERNPAIRS,\n    AFM_TOKEN_ENDTRACKKERN,\n    AFM_TOKEN_ESCCHAR,\n    AFM_TOKEN_FAMILYNAME,\n    AFM_TOKEN_FONTBBOX,\n    AFM_TOKEN_FONTNAME,\n    AFM_TOKEN_FULLNAME,\n    AFM_TOKEN_ISBASEFONT,\n    AFM_TOKEN_ISCIDFONT,\n    AFM_TOKEN_ISFIXEDPITCH,\n    AFM_TOKEN_ISFIXEDV,\n    AFM_TOKEN_ITALICANGLE,\n    AFM_TOKEN_KP,\n    AFM_TOKEN_KPH,\n    AFM_TOKEN_KPX,\n    AFM_TOKEN_KPY,\n    AFM_TOKEN_L,\n    AFM_TOKEN_MAPPINGSCHEME,\n    AFM_TOKEN_METRICSSETS,\n    AFM_TOKEN_N,\n    AFM_TOKEN_NOTICE,\n    AFM_TOKEN_PCC,\n    AFM_TOKEN_STARTAXIS,\n    AFM_TOKEN_STARTCHARMETRICS,\n    AFM_TOKEN_STARTCOMPOSITES,\n    AFM_TOKEN_STARTDIRECTION,\n    AFM_TOKEN_STARTFONTMETRICS,\n    AFM_TOKEN_STARTKERNDATA,\n    AFM_TOKEN_STARTKERNPAIRS,\n    AFM_TOKEN_STARTKERNPAIRS0,\n    AFM_TOKEN_STARTKERNPAIRS1,\n    AFM_TOKEN_STARTTRACKKERN,\n    AFM_TOKEN_STDHW,\n    AFM_TOKEN_STDVW,\n    AFM_TOKEN_TRACKKERN,\n    AFM_TOKEN_UNDERLINEPOSITION,\n    AFM_TOKEN_UNDERLINETHICKNESS,\n    AFM_TOKEN_VV,\n    AFM_TOKEN_VVECTOR,\n    AFM_TOKEN_VERSION,\n    AFM_TOKEN_W,\n    AFM_TOKEN_W0,\n    AFM_TOKEN_W0X,\n    AFM_TOKEN_W0Y,\n    AFM_TOKEN_W1,\n    AFM_TOKEN_W1X,\n    AFM_TOKEN_W1Y,\n    AFM_TOKEN_WX,\n    AFM_TOKEN_WY,\n    AFM_TOKEN_WEIGHT,\n    AFM_TOKEN_WEIGHTVECTOR,\n    AFM_TOKEN_XHEIGHT,\n    N_AFM_TOKENS,\n    AFM_TOKEN_UNKNOWN\n\n  } AFM_Token;\n\n\n  static const char*  const afm_key_table[N_AFM_TOKENS] =\n  {\n    \"Ascender\",\n    \"AxisLabel\",\n    \"AxisType\",\n    \"B\",\n    \"BlendAxisTypes\",\n    \"BlendDesignMap\",\n    \"BlendDesignPositions\",\n    \"C\",\n    \"CC\",\n    \"CH\",\n    \"CapHeight\",\n    \"CharWidth\",\n    \"CharacterSet\",\n    \"Characters\",\n    \"Descender\",\n    \"EncodingScheme\",\n    \"EndAxis\",\n    \"EndCharMetrics\",\n    \"EndComposites\",\n    \"EndDirection\",\n    \"EndFontMetrics\",\n    \"EndKernData\",\n    \"EndKernPairs\",\n    \"EndTrackKern\",\n    \"EscChar\",\n    \"FamilyName\",\n    \"FontBBox\",\n    \"FontName\",\n    \"FullName\",\n    \"IsBaseFont\",\n    \"IsCIDFont\",\n    \"IsFixedPitch\",\n    \"IsFixedV\",\n    \"ItalicAngle\",\n    \"KP\",\n    \"KPH\",\n    \"KPX\",\n    \"KPY\",\n    \"L\",\n    \"MappingScheme\",\n    \"MetricsSets\",\n    \"N\",\n    \"Notice\",\n    \"PCC\",\n    \"StartAxis\",\n    \"StartCharMetrics\",\n    \"StartComposites\",\n    \"StartDirection\",\n    \"StartFontMetrics\",\n    \"StartKernData\",\n    \"StartKernPairs\",\n    \"StartKernPairs0\",\n    \"StartKernPairs1\",\n    \"StartTrackKern\",\n    \"StdHW\",\n    \"StdVW\",\n    \"TrackKern\",\n    \"UnderlinePosition\",\n    \"UnderlineThickness\",\n    \"VV\",\n    \"VVector\",\n    \"Version\",\n    \"W\",\n    \"W0\",\n    \"W0X\",\n    \"W0Y\",\n    \"W1\",\n    \"W1X\",\n    \"W1Y\",\n    \"WX\",\n    \"WY\",\n    \"Weight\",\n    \"WeightVector\",\n    \"XHeight\"\n  };\n\n\n  /*\n   * `afm_parser_read_vals' and `afm_parser_next_key' provide\n   * high-level operations to an AFM_Stream.  The rest of the\n   * parser functions should use them without accessing the\n   * AFM_Stream directly.\n   */\n\n  FT_LOCAL_DEF( FT_Int )\n  afm_parser_read_vals( AFM_Parser  parser,\n                        AFM_Value   vals,\n                        FT_UInt     n )\n  {\n    AFM_Stream  stream = parser->stream;\n    char*       str;\n    FT_UInt     i;\n\n\n    if ( n > AFM_MAX_ARGUMENTS )\n      return 0;\n\n    for ( i = 0; i < n; i++ )\n    {\n      FT_Offset  len;\n      AFM_Value  val = vals + i;\n\n\n      if ( val->type == AFM_VALUE_TYPE_STRING )\n        str = afm_stream_read_string( stream );\n      else\n        str = afm_stream_read_one( stream );\n\n      if ( !str )\n        break;\n\n      len = AFM_STREAM_KEY_LEN( stream, str );\n\n      switch ( val->type )\n      {\n      case AFM_VALUE_TYPE_STRING:\n      case AFM_VALUE_TYPE_NAME:\n        {\n          FT_Memory  memory = parser->memory;\n          FT_Error   error;\n\n\n          if ( !FT_QALLOC( val->u.s, len + 1 ) )\n          {\n            ft_memcpy( val->u.s, str, len );\n            val->u.s[len] = '\\0';\n          }\n        }\n        break;\n\n      case AFM_VALUE_TYPE_FIXED:\n        val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str,\n                                    (FT_Byte*)str + len, 0 );\n        break;\n\n      case AFM_VALUE_TYPE_INTEGER:\n        val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str,\n                                  (FT_Byte*)str + len );\n        break;\n\n      case AFM_VALUE_TYPE_BOOL:\n        val->u.b = FT_BOOL( len == 4                      &&\n                            !ft_strncmp( str, \"true\", 4 ) );\n        break;\n\n      case AFM_VALUE_TYPE_INDEX:\n        if ( parser->get_index )\n          val->u.i = parser->get_index( str, len, parser->user_data );\n        else\n          val->u.i = 0;\n        break;\n      }\n    }\n\n    return i;\n  }\n\n\n  FT_LOCAL_DEF( char* )\n  afm_parser_next_key( AFM_Parser  parser,\n                       FT_Bool     line,\n                       FT_Offset*  len )\n  {\n    AFM_Stream  stream = parser->stream;\n    char*       key    = 0;  /* make stupid compiler happy */\n\n\n    if ( line )\n    {\n      while ( 1 )\n      {\n        /* skip current line */\n        if ( !AFM_STATUS_EOL( stream ) )\n          afm_stream_read_string( stream );\n\n        stream->status = AFM_STREAM_STATUS_NORMAL;\n        key = afm_stream_read_one( stream );\n\n        /* skip empty line */\n        if ( !key                      &&\n             !AFM_STATUS_EOF( stream ) &&\n             AFM_STATUS_EOL( stream )  )\n          continue;\n\n        break;\n      }\n    }\n    else\n    {\n      while ( 1 )\n      {\n        /* skip current column */\n        while ( !AFM_STATUS_EOC( stream ) )\n          afm_stream_read_one( stream );\n\n        stream->status = AFM_STREAM_STATUS_NORMAL;\n        key = afm_stream_read_one( stream );\n\n        /* skip empty column */\n        if ( !key                      &&\n             !AFM_STATUS_EOF( stream ) &&\n             AFM_STATUS_EOC( stream )  )\n          continue;\n\n        break;\n      }\n    }\n\n    if ( len )\n      *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key )\n                     : 0;\n\n    return key;\n  }\n\n\n  static AFM_Token\n  afm_tokenize( const char*  key,\n                FT_Offset    len )\n  {\n    int  n;\n\n\n    for ( n = 0; n < N_AFM_TOKENS; n++ )\n    {\n      if ( *( afm_key_table[n] ) == *key )\n      {\n        for ( ; n < N_AFM_TOKENS; n++ )\n        {\n          if ( *( afm_key_table[n] ) != *key )\n            return AFM_TOKEN_UNKNOWN;\n\n          if ( ft_strncmp( afm_key_table[n], key, len ) == 0 )\n            return (AFM_Token) n;\n        }\n      }\n    }\n\n    return AFM_TOKEN_UNKNOWN;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  afm_parser_init( AFM_Parser  parser,\n                   FT_Memory   memory,\n                   FT_Byte*    base,\n                   FT_Byte*    limit )\n  {\n    AFM_Stream  stream = NULL;\n    FT_Error    error;\n\n\n    if ( FT_NEW( stream ) )\n      return error;\n\n    stream->cursor = stream->base = base;\n    stream->limit  = limit;\n\n    /* don't skip the first line during the first call */\n    stream->status = AFM_STREAM_STATUS_EOL;\n\n    parser->memory    = memory;\n    parser->stream    = stream;\n    parser->FontInfo  = NULL;\n    parser->get_index = NULL;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL( void )\n  afm_parser_done( AFM_Parser  parser )\n  {\n    FT_Memory  memory = parser->memory;\n\n\n    FT_FREE( parser->stream );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  afm_parser_read_int( AFM_Parser  parser,\n                       FT_Int*     aint )\n  {\n    AFM_ValueRec  val;\n\n\n    val.type = AFM_VALUE_TYPE_INTEGER;\n\n    if ( afm_parser_read_vals( parser, &val, 1 ) == 1 )\n    {\n      *aint = val.u.i;\n\n      return FT_Err_Ok;\n    }\n    else\n      return FT_THROW( Syntax_Error );\n  }\n\n\n  static FT_Error\n  afm_parse_track_kern( AFM_Parser  parser )\n  {\n    AFM_FontInfo   fi = parser->FontInfo;\n    AFM_TrackKern  tk;\n    char*          key;\n    FT_Offset      len;\n    int            n = -1;\n\n\n    if ( afm_parser_read_int( parser, &fi->NumTrackKern ) )\n        goto Fail;\n\n    if ( fi->NumTrackKern )\n    {\n      FT_Memory  memory = parser->memory;\n      FT_Error   error;\n\n\n      if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) )\n        return error;\n    }\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      AFM_ValueRec  shared_vals[5];\n\n\n      switch ( afm_tokenize( key, len ) )\n      {\n      case AFM_TOKEN_TRACKKERN:\n        n++;\n\n        if ( n >= fi->NumTrackKern )\n          goto Fail;\n\n        tk = fi->TrackKerns + n;\n\n        shared_vals[0].type = AFM_VALUE_TYPE_INTEGER;\n        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[4].type = AFM_VALUE_TYPE_FIXED;\n        if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 )\n          goto Fail;\n\n        tk->degree     = shared_vals[0].u.i;\n        tk->min_ptsize = shared_vals[1].u.f;\n        tk->min_kern   = shared_vals[2].u.f;\n        tk->max_ptsize = shared_vals[3].u.f;\n        tk->max_kern   = shared_vals[4].u.f;\n\n        break;\n\n      case AFM_TOKEN_ENDTRACKKERN:\n      case AFM_TOKEN_ENDKERNDATA:\n      case AFM_TOKEN_ENDFONTMETRICS:\n        fi->NumTrackKern = n + 1;\n        return FT_Err_Ok;\n\n      case AFM_TOKEN_UNKNOWN:\n        break;\n\n      default:\n        goto Fail;\n      }\n    }\n\n  Fail:\n    return FT_THROW( Syntax_Error );\n  }\n\n\n#undef  KERN_INDEX\n#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)g1 << 16 ) | g2 )\n\n\n  /* compare two kerning pairs */\n  FT_CALLBACK_DEF( int )\n  afm_compare_kern_pairs( const void*  a,\n                          const void*  b )\n  {\n    AFM_KernPair  kp1 = (AFM_KernPair)a;\n    AFM_KernPair  kp2 = (AFM_KernPair)b;\n\n    FT_ULong  index1 = KERN_INDEX( kp1->index1, kp1->index2 );\n    FT_ULong  index2 = KERN_INDEX( kp2->index1, kp2->index2 );\n\n\n    if ( index1 > index2 )\n      return 1;\n    else if ( index1 < index2 )\n      return -1;\n    else\n      return 0;\n  }\n\n\n  static FT_Error\n  afm_parse_kern_pairs( AFM_Parser  parser )\n  {\n    AFM_FontInfo  fi = parser->FontInfo;\n    AFM_KernPair  kp;\n    char*         key;\n    FT_Offset     len;\n    int           n = -1;\n\n\n    if ( afm_parser_read_int( parser, &fi->NumKernPair ) )\n      goto Fail;\n\n    if ( fi->NumKernPair )\n    {\n      FT_Memory  memory = parser->memory;\n      FT_Error   error;\n\n\n      if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )\n        return error;\n    }\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      AFM_Token  token = afm_tokenize( key, len );\n\n\n      switch ( token )\n      {\n      case AFM_TOKEN_KP:\n      case AFM_TOKEN_KPX:\n      case AFM_TOKEN_KPY:\n        {\n          FT_Int        r;\n          AFM_ValueRec  shared_vals[4];\n\n\n          n++;\n\n          if ( n >= fi->NumKernPair )\n            goto Fail;\n\n          kp = fi->KernPairs + n;\n\n          shared_vals[0].type = AFM_VALUE_TYPE_INDEX;\n          shared_vals[1].type = AFM_VALUE_TYPE_INDEX;\n          shared_vals[2].type = AFM_VALUE_TYPE_INTEGER;\n          shared_vals[3].type = AFM_VALUE_TYPE_INTEGER;\n          r = afm_parser_read_vals( parser, shared_vals, 4 );\n          if ( r < 3 )\n            goto Fail;\n\n          kp->index1 = shared_vals[0].u.i;\n          kp->index2 = shared_vals[1].u.i;\n          if ( token == AFM_TOKEN_KPY )\n          {\n            kp->x = 0;\n            kp->y = shared_vals[2].u.i;\n          }\n          else\n          {\n            kp->x = shared_vals[2].u.i;\n            kp->y = ( token == AFM_TOKEN_KP && r == 4 )\n                      ? shared_vals[3].u.i : 0;\n          }\n        }\n        break;\n\n      case AFM_TOKEN_ENDKERNPAIRS:\n      case AFM_TOKEN_ENDKERNDATA:\n      case AFM_TOKEN_ENDFONTMETRICS:\n        fi->NumKernPair = n + 1;\n        ft_qsort( fi->KernPairs, fi->NumKernPair,\n                  sizeof ( AFM_KernPairRec ),\n                  afm_compare_kern_pairs );\n        return FT_Err_Ok;\n\n      case AFM_TOKEN_UNKNOWN:\n        break;\n\n      default:\n        goto Fail;\n      }\n    }\n\n  Fail:\n    return FT_THROW( Syntax_Error );\n  }\n\n\n  static FT_Error\n  afm_parse_kern_data( AFM_Parser  parser )\n  {\n    FT_Error   error;\n    char*      key;\n    FT_Offset  len;\n\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      switch ( afm_tokenize( key, len ) )\n      {\n      case AFM_TOKEN_STARTTRACKKERN:\n        error = afm_parse_track_kern( parser );\n        if ( error )\n          return error;\n        break;\n\n      case AFM_TOKEN_STARTKERNPAIRS:\n      case AFM_TOKEN_STARTKERNPAIRS0:\n        error = afm_parse_kern_pairs( parser );\n        if ( error )\n          return error;\n        break;\n\n      case AFM_TOKEN_ENDKERNDATA:\n      case AFM_TOKEN_ENDFONTMETRICS:\n        return FT_Err_Ok;\n\n      case AFM_TOKEN_UNKNOWN:\n        break;\n\n      default:\n        goto Fail;\n      }\n    }\n\n  Fail:\n    return FT_THROW( Syntax_Error );\n  }\n\n\n  static FT_Error\n  afm_parser_skip_section( AFM_Parser  parser,\n                           FT_UInt     n,\n                           AFM_Token   end_section )\n  {\n    char*      key;\n    FT_Offset  len;\n\n\n    while ( n-- > 0 )\n    {\n      key = afm_parser_next_key( parser, 1, NULL );\n      if ( !key )\n        goto Fail;\n    }\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      AFM_Token  token = afm_tokenize( key, len );\n\n\n      if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS )\n        return FT_Err_Ok;\n    }\n\n  Fail:\n    return FT_THROW( Syntax_Error );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  afm_parser_parse( AFM_Parser  parser )\n  {\n    FT_Memory     memory = parser->memory;\n    AFM_FontInfo  fi     = parser->FontInfo;\n    FT_Error      error  = FT_ERR( Syntax_Error );\n    char*         key;\n    FT_Offset     len;\n    FT_Int        metrics_sets = 0;\n\n\n    if ( !fi )\n      return FT_THROW( Invalid_Argument );\n\n    key = afm_parser_next_key( parser, 1, &len );\n    if ( !key || len != 16                              ||\n         ft_strncmp( key, \"StartFontMetrics\", 16 ) != 0 )\n      return FT_THROW( Unknown_File_Format );\n\n    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )\n    {\n      AFM_ValueRec  shared_vals[4];\n\n\n      switch ( afm_tokenize( key, len ) )\n      {\n      case AFM_TOKEN_METRICSSETS:\n        if ( afm_parser_read_int( parser, &metrics_sets ) )\n          goto Fail;\n\n        if ( metrics_sets != 0 && metrics_sets != 2 )\n        {\n          error = FT_THROW( Unimplemented_Feature );\n\n          goto Fail;\n        }\n        break;\n\n      case AFM_TOKEN_ISCIDFONT:\n        shared_vals[0].type = AFM_VALUE_TYPE_BOOL;\n        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )\n          goto Fail;\n\n        fi->IsCIDFont = shared_vals[0].u.b;\n        break;\n\n      case AFM_TOKEN_FONTBBOX:\n        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;\n        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;\n        if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 )\n          goto Fail;\n\n        fi->FontBBox.xMin = shared_vals[0].u.f;\n        fi->FontBBox.yMin = shared_vals[1].u.f;\n        fi->FontBBox.xMax = shared_vals[2].u.f;\n        fi->FontBBox.yMax = shared_vals[3].u.f;\n        break;\n\n      case AFM_TOKEN_ASCENDER:\n        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;\n        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )\n          goto Fail;\n\n        fi->Ascender = shared_vals[0].u.f;\n        break;\n\n      case AFM_TOKEN_DESCENDER:\n        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;\n        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )\n          goto Fail;\n\n        fi->Descender = shared_vals[0].u.f;\n        break;\n\n      case AFM_TOKEN_STARTCHARMETRICS:\n        {\n          FT_Int  n = 0;\n\n\n          if ( afm_parser_read_int( parser, &n ) )\n            goto Fail;\n\n          error = afm_parser_skip_section( parser, n,\n                                           AFM_TOKEN_ENDCHARMETRICS );\n          if ( error )\n            return error;\n        }\n        break;\n\n      case AFM_TOKEN_STARTKERNDATA:\n        error = afm_parse_kern_data( parser );\n        if ( error )\n          goto Fail;\n        /* fall through since we only support kern data */\n\n      case AFM_TOKEN_ENDFONTMETRICS:\n        return FT_Err_Ok;\n\n      default:\n        break;\n      }\n    }\n\n  Fail:\n    FT_FREE( fi->TrackKerns );\n    fi->NumTrackKern = 0;\n\n    FT_FREE( fi->KernPairs );\n    fi->NumKernPair = 0;\n\n    fi->IsCIDFont = 0;\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/afmparse.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  afmparse.h                                                             */\n/*                                                                         */\n/*    AFM parser (specification).                                          */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __AFMPARSE_H__\n#define __AFMPARSE_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  afm_parser_init( AFM_Parser  parser,\n                   FT_Memory   memory,\n                   FT_Byte*    base,\n                   FT_Byte*    limit );\n\n\n  FT_LOCAL( void )\n  afm_parser_done( AFM_Parser  parser );\n\n\n  FT_LOCAL( FT_Error )\n  afm_parser_parse( AFM_Parser  parser );\n\n\n  enum  AFM_ValueType_\n  {\n    AFM_VALUE_TYPE_STRING,\n    AFM_VALUE_TYPE_NAME,\n    AFM_VALUE_TYPE_FIXED,   /* real number */\n    AFM_VALUE_TYPE_INTEGER,\n    AFM_VALUE_TYPE_BOOL,\n    AFM_VALUE_TYPE_INDEX    /* glyph index */\n  };\n\n\n  typedef struct  AFM_ValueRec_\n  {\n    enum AFM_ValueType_  type;\n    union\n    {\n      char*     s;\n      FT_Fixed  f;\n      FT_Int    i;\n      FT_Bool   b;\n\n    } u;\n\n  } AFM_ValueRec, *AFM_Value;\n\n#define  AFM_MAX_ARGUMENTS  5\n\n  FT_LOCAL( FT_Int )\n  afm_parser_read_vals( AFM_Parser  parser,\n                        AFM_Value   vals,\n                        FT_UInt     n );\n\n  /* read the next key from the next line or column */\n  FT_LOCAL( char* )\n  afm_parser_next_key( AFM_Parser  parser,\n                       FT_Bool     line,\n                       FT_Offset*  len );\n\nFT_END_HEADER\n\n#endif /* __AFMPARSE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/module.mk",
    "content": "#\n# FreeType 2 PSaux module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += PSAUX_MODULE\n\ndefine PSAUX_MODULE\n$(OPEN_DRIVER) FT_Module_Class, psaux_module_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)psaux     $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/psaux/psaux.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psaux.c                                                                */\n/*                                                                         */\n/*    FreeType auxiliary PostScript driver component (body only).          */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2006 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"psobjs.c\"\n#include \"psauxmod.c\"\n#include \"t1decode.c\"\n#include \"t1cmap.c\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"afmparse.c\"\n#endif\n\n#include \"psconv.c\"\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/psauxerr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psauxerr.h                                                             */\n/*                                                                         */\n/*    PS auxiliary module error codes (specification only).                */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the PS auxiliary module error enumeration */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __PSAUXERR_H__\n#define __PSAUXERR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  PSaux_Err_\n#define FT_ERR_BASE    FT_Mod_Err_PSaux\n\n#include FT_ERRORS_H\n\n#endif /* __PSAUXERR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/psauxmod.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psauxmod.c                                                             */\n/*                                                                         */\n/*    FreeType auxiliary PostScript module implementation (body).          */\n/*                                                                         */\n/*  Copyright 2000-2001, 2002, 2003, 2006 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include \"psauxmod.h\"\n#include \"psobjs.h\"\n#include \"t1decode.h\"\n#include \"t1cmap.h\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"afmparse.h\"\n#endif\n\n\n  FT_CALLBACK_TABLE_DEF\n  const PS_Table_FuncsRec  ps_table_funcs =\n  {\n    ps_table_new,\n    ps_table_done,\n    ps_table_add,\n    ps_table_release\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const PS_Parser_FuncsRec  ps_parser_funcs =\n  {\n    ps_parser_init,\n    ps_parser_done,\n    ps_parser_skip_spaces,\n    ps_parser_skip_PS_token,\n    ps_parser_to_int,\n    ps_parser_to_fixed,\n    ps_parser_to_bytes,\n    ps_parser_to_coord_array,\n    ps_parser_to_fixed_array,\n    ps_parser_to_token,\n    ps_parser_to_token_array,\n    ps_parser_load_field,\n    ps_parser_load_field_table\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const T1_Builder_FuncsRec  t1_builder_funcs =\n  {\n    t1_builder_init,\n    t1_builder_done,\n    t1_builder_check_points,\n    t1_builder_add_point,\n    t1_builder_add_point1,\n    t1_builder_add_contour,\n    t1_builder_start_point,\n    t1_builder_close_contour\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const T1_Decoder_FuncsRec  t1_decoder_funcs =\n  {\n    t1_decoder_init,\n    t1_decoder_done,\n    t1_decoder_parse_charstrings\n  };\n\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n  FT_CALLBACK_TABLE_DEF\n  const AFM_Parser_FuncsRec  afm_parser_funcs =\n  {\n    afm_parser_init,\n    afm_parser_done,\n    afm_parser_parse\n  };\n#endif\n\n\n  FT_CALLBACK_TABLE_DEF\n  const T1_CMap_ClassesRec  t1_cmap_classes =\n  {\n    &t1_cmap_standard_class_rec,\n    &t1_cmap_expert_class_rec,\n    &t1_cmap_custom_class_rec,\n    &t1_cmap_unicode_class_rec\n  };\n\n\n  static\n  const PSAux_Interface  psaux_interface =\n  {\n    &ps_table_funcs,\n    &ps_parser_funcs,\n    &t1_builder_funcs,\n    &t1_decoder_funcs,\n    t1_decrypt,\n\n    (const T1_CMap_ClassesRec*) &t1_cmap_classes,\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n    &afm_parser_funcs,\n#else\n    0,\n#endif\n  };\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Module_Class  psaux_module_class =\n  {\n    0,\n    sizeof ( FT_ModuleRec ),\n    \"psaux\",\n    0x20000L,\n    0x20000L,\n\n    &psaux_interface,  /* module-specific interface */\n\n    (FT_Module_Constructor)0,\n    (FT_Module_Destructor) 0,\n    (FT_Module_Requester)  0\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/psauxmod.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psauxmod.h                                                             */\n/*                                                                         */\n/*    FreeType auxiliary PostScript module implementation (specification). */\n/*                                                                         */\n/*  Copyright 2000-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSAUXMOD_H__\n#define __PSAUXMOD_H__\n\n\n#include <ft2build.h>\n#include FT_MODULE_H\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_EXPORT_VAR( const FT_Module_Class )  psaux_driver_class;\n\n\nFT_END_HEADER\n\n#endif /* __PSAUXMOD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/psconv.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psconv.c                                                               */\n/*                                                                         */\n/*    Some convenience conversions (body).                                 */\n/*                                                                         */\n/*  Copyright 2006, 2008, 2009, 2012-2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n#include FT_INTERNAL_DEBUG_H\n\n#include \"psconv.h\"\n#include \"psauxerr.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_psconv\n\n\n  /* The following array is used by various functions to quickly convert */\n  /* digits (both decimal and non-decimal) into numbers.                 */\n\n#if 'A' == 65\n  /* ASCII */\n\n  static const FT_Char  ft_char_table[128] =\n  {\n    /* 0x00 */\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,\n    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,\n    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,\n  };\n\n  /* no character >= 0x80 can represent a valid number */\n#define OP  >=\n\n#endif /* 'A' == 65 */\n\n#if 'A' == 193\n  /* EBCDIC */\n\n  static const FT_Char  ft_char_table[128] =\n  {\n    /* 0x80 */\n    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,\n    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,\n    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,\n    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,\n    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,\n     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,\n  };\n\n  /* no character < 0x80 can represent a valid number */\n#define OP  <\n\n#endif /* 'A' == 193 */\n\n\n  FT_LOCAL_DEF( FT_Long )\n  PS_Conv_Strtol( FT_Byte**  cursor,\n                  FT_Byte*   limit,\n                  FT_Long    base )\n  {\n    FT_Byte*  p = *cursor;\n\n    FT_Long   num           = 0;\n    FT_Bool   sign          = 0;\n    FT_Bool   have_overflow = 0;\n\n    FT_Long   num_limit;\n    FT_Char   c_limit;\n\n\n    if ( p >= limit )\n      goto Bad;\n\n    if ( base < 2 || base > 36 )\n    {\n      FT_TRACE4(( \"!!!INVALID BASE:!!!\" ));\n      return 0;\n    }\n\n    if ( *p == '-' || *p == '+' )\n    {\n      sign = FT_BOOL( *p == '-' );\n\n      p++;\n      if ( p == limit )\n        goto Bad;\n    }\n\n    num_limit = 0x7FFFFFFFL / base;\n    c_limit   = (FT_Char)( 0x7FFFFFFFL % base );\n\n    for ( ; p < limit; p++ )\n    {\n      FT_Char  c;\n\n\n      if ( IS_PS_SPACE( *p ) || *p OP 0x80 )\n        break;\n\n      c = ft_char_table[*p & 0x7f];\n\n      if ( c < 0 || c >= base )\n        break;\n\n      if ( num > num_limit || ( num == num_limit && c > c_limit ) )\n        have_overflow = 1;\n      else\n        num = num * base + c;\n    }\n\n    *cursor = p;\n\n    if ( have_overflow )\n    {\n      num = 0x7FFFFFFFL;\n      FT_TRACE4(( \"!!!OVERFLOW:!!!\" ));\n    }\n\n    if ( sign )\n      num = -num;\n\n    return num;\n\n  Bad:\n    FT_TRACE4(( \"!!!END OF DATA:!!!\" ));\n    return 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Long )\n  PS_Conv_ToInt( FT_Byte**  cursor,\n                 FT_Byte*   limit )\n\n  {\n    FT_Byte*  p = *cursor;\n    FT_Byte*  curp;\n\n    FT_Long   num;\n\n\n    curp = p;\n    num  = PS_Conv_Strtol( &p, limit, 10 );\n\n    if ( p == curp )\n      return 0;\n\n    if ( p < limit && *p == '#' )\n    {\n      p++;\n\n      curp = p;\n      num  = PS_Conv_Strtol( &p, limit, num );\n\n      if ( p == curp )\n        return 0;\n    }\n\n    *cursor = p;\n\n    return num;\n  }\n\n\n  FT_LOCAL_DEF( FT_Fixed )\n  PS_Conv_ToFixed( FT_Byte**  cursor,\n                   FT_Byte*   limit,\n                   FT_Long    power_ten )\n  {\n    FT_Byte*  p = *cursor;\n    FT_Byte*  curp;\n\n    FT_Fixed  integral = 0;\n    FT_Long   decimal  = 0;\n    FT_Long   divider  = 1;\n\n    FT_Bool   sign           = 0;\n    FT_Bool   have_overflow  = 0;\n    FT_Bool   have_underflow = 0;\n\n\n    if ( p >= limit )\n      goto Bad;\n\n    if ( *p == '-' || *p == '+' )\n    {\n      sign = FT_BOOL( *p == '-' );\n\n      p++;\n      if ( p == limit )\n        goto Bad;\n    }\n\n    /* read the integer part */\n    if ( *p != '.' )\n    {\n      curp     = p;\n      integral = PS_Conv_ToInt( &p, limit );\n\n      if ( p == curp )\n        return 0;\n\n      if ( integral > 0x7FFF )\n        have_overflow = 1;\n      else\n        integral = (FT_Fixed)( (FT_UInt32)integral << 16 );\n    }\n\n    /* read the decimal part */\n    if ( p < limit && *p == '.' )\n    {\n      p++;\n\n      for ( ; p < limit; p++ )\n      {\n        FT_Char  c;\n\n\n        if ( IS_PS_SPACE( *p ) || *p OP 0x80 )\n          break;\n\n        c = ft_char_table[*p & 0x7f];\n\n        if ( c < 0 || c >= 10 )\n          break;\n\n        if ( decimal < 0xCCCCCCCL )\n        {\n          decimal = decimal * 10 + c;\n\n          if ( !integral && power_ten > 0 )\n            power_ten--;\n          else\n            divider *= 10;\n        }\n      }\n    }\n\n    /* read exponent, if any */\n    if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) )\n    {\n      FT_Long  exponent;\n\n\n      p++;\n\n      curp     = p;\n      exponent = PS_Conv_ToInt( &p, limit );\n\n      if ( curp == p )\n        return 0;\n\n      /* arbitrarily limit exponent */\n      if ( exponent > 1000 )\n        have_overflow = 1;\n      else if ( exponent < -1000 )\n        have_underflow = 1;\n      else\n        power_ten += exponent;\n    }\n\n    *cursor = p;\n\n    if ( !integral && !decimal )\n      return 0;\n\n    if ( have_overflow )\n      goto Overflow;\n    if ( have_underflow )\n      goto Underflow;\n\n    while ( power_ten > 0 )\n    {\n      if ( integral >= 0xCCCCCCCL )\n        goto Overflow;\n      integral *= 10;\n\n      if ( decimal >= 0xCCCCCCCL )\n      {\n        if ( divider == 1 )\n          goto Overflow;\n        divider /= 10;\n      }\n      else\n        decimal *= 10;\n\n      power_ten--;\n    }\n\n    while ( power_ten < 0 )\n    {\n      integral /= 10;\n      if ( divider < 0xCCCCCCCL )\n        divider *= 10;\n      else\n        decimal /= 10;\n\n      if ( !integral && !decimal )\n        goto Underflow;\n\n      power_ten++;\n    }\n\n    if ( decimal )\n    {\n      decimal = FT_DivFix( decimal, divider );\n      /* it's not necessary to check this addition for overflow */\n      /* due to the structure of the real number representation */\n      integral += decimal;\n    }\n\n  Exit:\n    if ( sign )\n      integral = -integral;\n\n    return integral;\n\n  Bad:\n    FT_TRACE4(( \"!!!END OF DATA:!!!\" ));\n    return 0;\n\n  Overflow:\n    integral = 0x7FFFFFFFL;\n    FT_TRACE4(( \"!!!OVERFLOW:!!!\" ));\n    goto Exit;\n\n  Underflow:\n    FT_TRACE4(( \"!!!UNDERFLOW:!!!\" ));\n    return 0;\n  }\n\n\n#if 0\n  FT_LOCAL_DEF( FT_UInt )\n  PS_Conv_StringDecode( FT_Byte**  cursor,\n                        FT_Byte*   limit,\n                        FT_Byte*   buffer,\n                        FT_Offset  n )\n  {\n    FT_Byte*  p;\n    FT_UInt   r = 0;\n\n\n    for ( p = *cursor; r < n && p < limit; p++ )\n    {\n      FT_Byte  b;\n\n\n      if ( *p != '\\\\' )\n      {\n        buffer[r++] = *p;\n\n        continue;\n      }\n\n      p++;\n\n      switch ( *p )\n      {\n      case 'n':\n        b = '\\n';\n        break;\n      case 'r':\n        b = '\\r';\n        break;\n      case 't':\n        b = '\\t';\n        break;\n      case 'b':\n        b = '\\b';\n        break;\n      case 'f':\n        b = '\\f';\n        break;\n      case '\\r':\n        p++;\n        if ( *p != '\\n' )\n        {\n          b = *p;\n\n          break;\n        }\n        /* no break */\n      case '\\n':\n        continue;\n        break;\n      default:\n        if ( IS_PS_DIGIT( *p ) )\n        {\n          b = *p - '0';\n\n          p++;\n\n          if ( IS_PS_DIGIT( *p ) )\n          {\n            b = b * 8 + *p - '0';\n\n            p++;\n\n            if ( IS_PS_DIGIT( *p ) )\n              b = b * 8 + *p - '0';\n            else\n            {\n              buffer[r++] = b;\n              b = *p;\n            }\n          }\n          else\n          {\n            buffer[r++] = b;\n            b = *p;\n          }\n        }\n        else\n          b = *p;\n        break;\n      }\n\n      buffer[r++] = b;\n    }\n\n    *cursor = p;\n\n    return r;\n  }\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,\n                          FT_Byte*   limit,\n                          FT_Byte*   buffer,\n                          FT_Offset  n )\n  {\n    FT_Byte*  p;\n    FT_UInt   r   = 0;\n    FT_UInt   w   = 0;\n    FT_UInt   pad = 0x01;\n\n\n    n *= 2;\n\n#if 1\n\n    p = *cursor;\n\n    if ( p >= limit )\n      return 0;\n\n    if ( n > (FT_UInt)( limit - p ) )\n      n = (FT_UInt)( limit - p );\n\n    /* we try to process two nibbles at a time to be as fast as possible */\n    for ( ; r < n; r++ )\n    {\n      FT_UInt  c = p[r];\n\n\n      if ( IS_PS_SPACE( c ) )\n        continue;\n\n      if ( c OP 0x80 )\n        break;\n\n      c = ft_char_table[c & 0x7F];\n      if ( (unsigned)c >= 16 )\n        break;\n\n      pad = ( pad << 4 ) | c;\n      if ( pad & 0x100 )\n      {\n        buffer[w++] = (FT_Byte)pad;\n        pad         = 0x01;\n      }\n    }\n\n    if ( pad != 0x01 )\n      buffer[w++] = (FT_Byte)( pad << 4 );\n\n    *cursor = p + r;\n\n    return w;\n\n#else /* 0 */\n\n    for ( r = 0; r < n; r++ )\n    {\n      FT_Char  c;\n\n\n      if ( IS_PS_SPACE( *p ) )\n        continue;\n\n      if ( *p OP 0x80 )\n        break;\n\n      c = ft_char_table[*p & 0x7f];\n\n      if ( (unsigned)c >= 16 )\n        break;\n\n      if ( r & 1 )\n      {\n        *buffer = (FT_Byte)(*buffer + c);\n        buffer++;\n      }\n      else\n        *buffer = (FT_Byte)(c << 4);\n\n      r++;\n    }\n\n    *cursor = p;\n\n    return ( r + 1 ) / 2;\n\n#endif /* 0 */\n\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  PS_Conv_EexecDecode( FT_Byte**   cursor,\n                       FT_Byte*    limit,\n                       FT_Byte*    buffer,\n                       FT_Offset   n,\n                       FT_UShort*  seed )\n  {\n    FT_Byte*  p;\n    FT_UInt   r;\n    FT_UInt   s = *seed;\n\n\n#if 1\n\n    p = *cursor;\n\n    if ( p >= limit )\n      return 0;\n\n    if ( n > (FT_UInt)(limit - p) )\n      n = (FT_UInt)(limit - p);\n\n    for ( r = 0; r < n; r++ )\n    {\n      FT_UInt  val = p[r];\n      FT_UInt  b   = ( val ^ ( s >> 8 ) );\n\n\n      s         = ( (val + s)*52845U + 22719 ) & 0xFFFFU;\n      buffer[r] = (FT_Byte) b;\n    }\n\n    *cursor = p + n;\n    *seed   = (FT_UShort)s;\n\n#else /* 0 */\n\n    for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ )\n    {\n      FT_Byte  b = (FT_Byte)( *p ^ ( s >> 8 ) );\n\n\n      s = (FT_UShort)( ( *p + s ) * 52845U + 22719 );\n      *buffer++ = b;\n    }\n    *cursor = p;\n    *seed   = s;\n\n#endif /* 0 */\n\n    return r;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/psconv.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psconv.h                                                               */\n/*                                                                         */\n/*    Some convenience conversions (specification).                        */\n/*                                                                         */\n/*  Copyright 2006, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSCONV_H__\n#define __PSCONV_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Long )\n  PS_Conv_Strtol( FT_Byte**  cursor,\n                  FT_Byte*   limit,\n                  FT_Long    base );\n\n\n  FT_LOCAL( FT_Long )\n  PS_Conv_ToInt( FT_Byte**  cursor,\n                 FT_Byte*   limit );\n\n  FT_LOCAL( FT_Fixed )\n  PS_Conv_ToFixed( FT_Byte**  cursor,\n                   FT_Byte*   limit,\n                   FT_Long    power_ten );\n\n#if 0\n  FT_LOCAL( FT_UInt )\n  PS_Conv_StringDecode( FT_Byte**  cursor,\n                        FT_Byte*   limit,\n                        FT_Byte*   buffer,\n                        FT_Offset  n );\n#endif\n\n  FT_LOCAL( FT_UInt )\n  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,\n                          FT_Byte*   limit,\n                          FT_Byte*   buffer,\n                          FT_Offset  n );\n\n  FT_LOCAL( FT_UInt )\n  PS_Conv_EexecDecode( FT_Byte**   cursor,\n                       FT_Byte*    limit,\n                       FT_Byte*    buffer,\n                       FT_Offset   n,\n                       FT_UShort*  seed );\n\n\nFT_END_HEADER\n\n#endif /* __PSCONV_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/psobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psobjs.c                                                               */\n/*                                                                         */\n/*    Auxiliary functions for PostScript fonts (body).                     */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_CALC_H\n\n#include \"psobjs.h\"\n#include \"psconv.h\"\n\n#include \"psauxerr.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_psobjs\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                             PS_TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ps_table_new                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a PS_Table.                                            */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    table  :: The address of the target table.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    count  :: The table size = the maximum number of elements.         */\n  /*                                                                       */\n  /*    memory :: The memory object to use for all subsequent              */\n  /*              reallocations.                                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  ps_table_new( PS_Table   table,\n                FT_Int     count,\n                FT_Memory  memory )\n  {\n    FT_Error  error;\n\n\n    table->memory = memory;\n    if ( FT_NEW_ARRAY( table->elements, count ) ||\n         FT_NEW_ARRAY( table->lengths,  count ) )\n      goto Exit;\n\n    table->max_elems = count;\n    table->init      = 0xDEADBEEFUL;\n    table->num_elems = 0;\n    table->block     = 0;\n    table->capacity  = 0;\n    table->cursor    = 0;\n\n    *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs;\n\n  Exit:\n    if ( error )\n      FT_FREE( table->elements );\n\n    return error;\n  }\n\n\n  static void\n  shift_elements( PS_Table  table,\n                  FT_Byte*  old_base )\n  {\n    FT_PtrDist  delta  = table->block - old_base;\n    FT_Byte**   offset = table->elements;\n    FT_Byte**   limit  = offset + table->max_elems;\n\n\n    for ( ; offset < limit; offset++ )\n    {\n      if ( offset[0] )\n        offset[0] += delta;\n    }\n  }\n\n\n  static FT_Error\n  reallocate_t1_table( PS_Table  table,\n                       FT_Long   new_size )\n  {\n    FT_Memory  memory   = table->memory;\n    FT_Byte*   old_base = table->block;\n    FT_Error   error;\n\n\n    /* allocate new base block */\n    if ( FT_ALLOC( table->block, new_size ) )\n    {\n      table->block = old_base;\n      return error;\n    }\n\n    /* copy elements and shift offsets */\n    if ( old_base )\n    {\n      FT_MEM_COPY( table->block, old_base, table->capacity );\n      shift_elements( table, old_base );\n      FT_FREE( old_base );\n    }\n\n    table->capacity = new_size;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ps_table_add                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Adds an object to a PS_Table, possibly growing its memory block.   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    table  :: The target table.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    idx    :: The index of the object in the table.                    */\n  /*                                                                       */\n  /*    object :: The address of the object to copy in memory.             */\n  /*                                                                       */\n  /*    length :: The length in bytes of the source object.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  An error is returned if a  */\n  /*    reallocation fails.                                                */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  ps_table_add( PS_Table    table,\n                FT_Int      idx,\n                void*       object,\n                FT_PtrDist  length )\n  {\n    if ( idx < 0 || idx >= table->max_elems )\n    {\n      FT_ERROR(( \"ps_table_add: invalid index\\n\" ));\n      return FT_THROW( Invalid_Argument );\n    }\n\n    if ( length < 0 )\n    {\n      FT_ERROR(( \"ps_table_add: invalid length\\n\" ));\n      return FT_THROW( Invalid_Argument );\n    }\n\n    /* grow the base block if needed */\n    if ( table->cursor + length > table->capacity )\n    {\n      FT_Error    error;\n      FT_Offset   new_size = table->capacity;\n      FT_PtrDist  in_offset;\n\n\n      in_offset = (FT_Byte*)object - table->block;\n      if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity )\n        in_offset = -1;\n\n      while ( new_size < table->cursor + length )\n      {\n        /* increase size by 25% and round up to the nearest multiple\n           of 1024 */\n        new_size += ( new_size >> 2 ) + 1;\n        new_size  = FT_PAD_CEIL( new_size, 1024 );\n      }\n\n      error = reallocate_t1_table( table, new_size );\n      if ( error )\n        return error;\n\n      if ( in_offset >= 0 )\n        object = table->block + in_offset;\n    }\n\n    /* add the object to the base block and adjust offset */\n    table->elements[idx] = table->block + table->cursor;\n    table->lengths [idx] = length;\n    FT_MEM_COPY( table->block + table->cursor, object, length );\n\n    table->cursor += length;\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ps_table_done                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a PS_TableRec (i.e., reallocate it to its current        */\n  /*    cursor).                                                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    table :: The target table.                                         */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This function does NOT release the heap's memory block.  It is up  */\n  /*    to the caller to clean it, or reference it in its own structures.  */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  ps_table_done( PS_Table  table )\n  {\n    FT_Memory  memory = table->memory;\n    FT_Error   error;\n    FT_Byte*   old_base = table->block;\n\n\n    /* should never fail, because rec.cursor <= rec.size */\n    if ( !old_base )\n      return;\n\n    if ( FT_ALLOC( table->block, table->cursor ) )\n      return;\n    FT_MEM_COPY( table->block, old_base, table->cursor );\n    shift_elements( table, old_base );\n\n    table->capacity = table->cursor;\n    FT_FREE( old_base );\n\n    FT_UNUSED( error );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ps_table_release( PS_Table  table )\n  {\n    FT_Memory  memory = table->memory;\n\n\n    if ( (FT_ULong)table->init == 0xDEADBEEFUL )\n    {\n      FT_FREE( table->block );\n      FT_FREE( table->elements );\n      FT_FREE( table->lengths );\n      table->init = 0;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 PARSER                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* first character must be already part of the comment */\n\n  static void\n  skip_comment( FT_Byte*  *acur,\n                FT_Byte*   limit )\n  {\n    FT_Byte*  cur = *acur;\n\n\n    while ( cur < limit )\n    {\n      if ( IS_PS_NEWLINE( *cur ) )\n        break;\n      cur++;\n    }\n\n    *acur = cur;\n  }\n\n\n  static void\n  skip_spaces( FT_Byte*  *acur,\n               FT_Byte*   limit )\n  {\n    FT_Byte*  cur = *acur;\n\n\n    while ( cur < limit )\n    {\n      if ( !IS_PS_SPACE( *cur ) )\n      {\n        if ( *cur == '%' )\n          /* According to the PLRM, a comment is equal to a space. */\n          skip_comment( &cur, limit );\n        else\n          break;\n      }\n      cur++;\n    }\n\n    *acur = cur;\n  }\n\n\n#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' )\n\n\n  /* first character must be `(';                               */\n  /* *acur is positioned at the character after the closing `)' */\n\n  static FT_Error\n  skip_literal_string( FT_Byte*  *acur,\n                       FT_Byte*   limit )\n  {\n    FT_Byte*      cur   = *acur;\n    FT_Int        embed = 0;\n    FT_Error      error = FT_ERR( Invalid_File_Format );\n    unsigned int  i;\n\n\n    while ( cur < limit )\n    {\n      FT_Byte  c = *cur;\n\n\n      ++cur;\n\n      if ( c == '\\\\' )\n      {\n        /* Red Book 3rd ed., section `Literal Text Strings', p. 29:     */\n        /* A backslash can introduce three different types              */\n        /* of escape sequences:                                         */\n        /*   - a special escaped char like \\r, \\n, etc.                 */\n        /*   - a one-, two-, or three-digit octal number                */\n        /*   - none of the above in which case the backslash is ignored */\n\n        if ( cur == limit )\n          /* error (or to be ignored?) */\n          break;\n\n        switch ( *cur )\n        {\n          /* skip `special' escape */\n        case 'n':\n        case 'r':\n        case 't':\n        case 'b':\n        case 'f':\n        case '\\\\':\n        case '(':\n        case ')':\n          ++cur;\n          break;\n\n        default:\n          /* skip octal escape or ignore backslash */\n          for ( i = 0; i < 3 && cur < limit; ++i )\n          {\n            if ( !IS_OCTAL_DIGIT( *cur ) )\n              break;\n\n            ++cur;\n          }\n        }\n      }\n      else if ( c == '(' )\n        embed++;\n      else if ( c == ')' )\n      {\n        embed--;\n        if ( embed == 0 )\n        {\n          error = FT_Err_Ok;\n          break;\n        }\n      }\n    }\n\n    *acur = cur;\n\n    return error;\n  }\n\n\n  /* first character must be `<' */\n\n  static FT_Error\n  skip_string( FT_Byte*  *acur,\n               FT_Byte*   limit )\n  {\n    FT_Byte*  cur = *acur;\n    FT_Error  err =  FT_Err_Ok;\n\n\n    while ( ++cur < limit )\n    {\n      /* All whitespace characters are ignored. */\n      skip_spaces( &cur, limit );\n      if ( cur >= limit )\n        break;\n\n      if ( !IS_PS_XDIGIT( *cur ) )\n        break;\n    }\n\n    if ( cur < limit && *cur != '>' )\n    {\n      FT_ERROR(( \"skip_string: missing closing delimiter `>'\\n\" ));\n      err = FT_THROW( Invalid_File_Format );\n    }\n    else\n      cur++;\n\n    *acur = cur;\n    return err;\n  }\n\n\n  /* first character must be the opening brace that */\n  /* starts the procedure                           */\n\n  /* NB: [ and ] need not match:                    */\n  /* `/foo {[} def' is a valid PostScript fragment, */\n  /* even within a Type1 font                       */\n\n  static FT_Error\n  skip_procedure( FT_Byte*  *acur,\n                  FT_Byte*   limit )\n  {\n    FT_Byte*  cur;\n    FT_Int    embed = 0;\n    FT_Error  error = FT_Err_Ok;\n\n\n    FT_ASSERT( **acur == '{' );\n\n    for ( cur = *acur; cur < limit && error == FT_Err_Ok; ++cur )\n    {\n      switch ( *cur )\n      {\n      case '{':\n        ++embed;\n        break;\n\n      case '}':\n        --embed;\n        if ( embed == 0 )\n        {\n          ++cur;\n          goto end;\n        }\n        break;\n\n      case '(':\n        error = skip_literal_string( &cur, limit );\n        break;\n\n      case '<':\n        error = skip_string( &cur, limit );\n        break;\n\n      case '%':\n        skip_comment( &cur, limit );\n        break;\n      }\n    }\n\n  end:\n    if ( embed != 0 )\n      error = FT_THROW( Invalid_File_Format );\n\n    *acur = cur;\n\n    return error;\n  }\n\n\n  /***********************************************************************/\n  /*                                                                     */\n  /* All exported parsing routines handle leading whitespace and stop at */\n  /* the first character which isn't part of the just handled token.     */\n  /*                                                                     */\n  /***********************************************************************/\n\n\n  FT_LOCAL_DEF( void )\n  ps_parser_skip_PS_token( PS_Parser  parser )\n  {\n    /* Note: PostScript allows any non-delimiting, non-whitespace        */\n    /*       character in a name (PS Ref Manual, 3rd ed, p31).           */\n    /*       PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */\n\n    FT_Byte*  cur   = parser->cursor;\n    FT_Byte*  limit = parser->limit;\n    FT_Error  error = FT_Err_Ok;\n\n\n    skip_spaces( &cur, limit );             /* this also skips comments */\n    if ( cur >= limit )\n      goto Exit;\n\n    /* self-delimiting, single-character tokens */\n    if ( *cur == '[' || *cur == ']' )\n    {\n      cur++;\n      goto Exit;\n    }\n\n    /* skip balanced expressions (procedures and strings) */\n\n    if ( *cur == '{' )                              /* {...} */\n    {\n      error = skip_procedure( &cur, limit );\n      goto Exit;\n    }\n\n    if ( *cur == '(' )                              /* (...) */\n    {\n      error = skip_literal_string( &cur, limit );\n      goto Exit;\n    }\n\n    if ( *cur == '<' )                              /* <...> */\n    {\n      if ( cur + 1 < limit && *(cur + 1) == '<' )   /* << */\n      {\n        cur++;\n        cur++;\n      }\n      else\n        error = skip_string( &cur, limit );\n\n      goto Exit;\n    }\n\n    if ( *cur == '>' )\n    {\n      cur++;\n      if ( cur >= limit || *cur != '>' )             /* >> */\n      {\n        FT_ERROR(( \"ps_parser_skip_PS_token:\"\n                   \" unexpected closing delimiter `>'\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n      cur++;\n      goto Exit;\n    }\n\n    if ( *cur == '/' )\n      cur++;\n\n    /* anything else */\n    while ( cur < limit )\n    {\n      /* *cur might be invalid (e.g., ')' or '}'), but this   */\n      /* is handled by the test `cur == parser->cursor' below */\n      if ( IS_PS_DELIM( *cur ) )\n        break;\n\n      cur++;\n    }\n\n  Exit:\n    if ( cur < limit && cur == parser->cursor )\n    {\n      FT_ERROR(( \"ps_parser_skip_PS_token:\"\n                 \" current token is `%c' which is self-delimiting\\n\"\n                 \"                        \"\n                 \" but invalid at this point\\n\",\n                 *cur ));\n\n      error = FT_THROW( Invalid_File_Format );\n    }\n\n    parser->error  = error;\n    parser->cursor = cur;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ps_parser_skip_spaces( PS_Parser  parser )\n  {\n    skip_spaces( &parser->cursor, parser->limit );\n  }\n\n\n  /* `token' here means either something between balanced delimiters */\n  /* or the next token; the delimiters are not removed.              */\n\n  FT_LOCAL_DEF( void )\n  ps_parser_to_token( PS_Parser  parser,\n                      T1_Token   token )\n  {\n    FT_Byte*  cur;\n    FT_Byte*  limit;\n    FT_Int    embed;\n\n\n    token->type  = T1_TOKEN_TYPE_NONE;\n    token->start = 0;\n    token->limit = 0;\n\n    /* first of all, skip leading whitespace */\n    ps_parser_skip_spaces( parser );\n\n    cur   = parser->cursor;\n    limit = parser->limit;\n\n    if ( cur >= limit )\n      return;\n\n    switch ( *cur )\n    {\n      /************* check for literal string *****************/\n    case '(':\n      token->type  = T1_TOKEN_TYPE_STRING;\n      token->start = cur;\n\n      if ( skip_literal_string( &cur, limit ) == FT_Err_Ok )\n        token->limit = cur;\n      break;\n\n      /************* check for programs/array *****************/\n    case '{':\n      token->type  = T1_TOKEN_TYPE_ARRAY;\n      token->start = cur;\n\n      if ( skip_procedure( &cur, limit ) == FT_Err_Ok )\n        token->limit = cur;\n      break;\n\n      /************* check for table/array ********************/\n      /* XXX: in theory we should also look for \"<<\"          */\n      /*      since this is semantically equivalent to \"[\";   */\n      /*      in practice it doesn't matter (?)               */\n    case '[':\n      token->type  = T1_TOKEN_TYPE_ARRAY;\n      embed        = 1;\n      token->start = cur++;\n\n      /* we need this to catch `[ ]' */\n      parser->cursor = cur;\n      ps_parser_skip_spaces( parser );\n      cur = parser->cursor;\n\n      while ( cur < limit && !parser->error )\n      {\n        /* XXX: this is wrong because it does not      */\n        /*      skip comments, procedures, and strings */\n        if ( *cur == '[' )\n          embed++;\n        else if ( *cur == ']' )\n        {\n          embed--;\n          if ( embed <= 0 )\n          {\n            token->limit = ++cur;\n            break;\n          }\n        }\n\n        parser->cursor = cur;\n        ps_parser_skip_PS_token( parser );\n        /* we need this to catch `[XXX ]' */\n        ps_parser_skip_spaces  ( parser );\n        cur = parser->cursor;\n      }\n      break;\n\n      /* ************ otherwise, it is any token **************/\n    default:\n      token->start = cur;\n      token->type  = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY );\n      ps_parser_skip_PS_token( parser );\n      cur = parser->cursor;\n      if ( !parser->error )\n        token->limit = cur;\n    }\n\n    if ( !token->limit )\n    {\n      token->start = 0;\n      token->type  = T1_TOKEN_TYPE_NONE;\n    }\n\n    parser->cursor = cur;\n  }\n\n\n  /* NB: `tokens' can be NULL if we only want to count */\n  /* the number of array elements                      */\n\n  FT_LOCAL_DEF( void )\n  ps_parser_to_token_array( PS_Parser  parser,\n                            T1_Token   tokens,\n                            FT_UInt    max_tokens,\n                            FT_Int*    pnum_tokens )\n  {\n    T1_TokenRec  master;\n\n\n    *pnum_tokens = -1;\n\n    /* this also handles leading whitespace */\n    ps_parser_to_token( parser, &master );\n\n    if ( master.type == T1_TOKEN_TYPE_ARRAY )\n    {\n      FT_Byte*  old_cursor = parser->cursor;\n      FT_Byte*  old_limit  = parser->limit;\n      T1_Token  cur        = tokens;\n      T1_Token  limit      = cur + max_tokens;\n\n\n      /* don't include outermost delimiters */\n      parser->cursor = master.start + 1;\n      parser->limit  = master.limit - 1;\n\n      while ( parser->cursor < parser->limit )\n      {\n        T1_TokenRec  token;\n\n\n        ps_parser_to_token( parser, &token );\n        if ( !token.type )\n          break;\n\n        if ( tokens != NULL && cur < limit )\n          *cur = token;\n\n        cur++;\n      }\n\n      *pnum_tokens = (FT_Int)( cur - tokens );\n\n      parser->cursor = old_cursor;\n      parser->limit  = old_limit;\n    }\n  }\n\n\n  /* first character must be a delimiter or a part of a number */\n  /* NB: `coords' can be NULL if we just want to skip the      */\n  /*     array; in this case we ignore `max_coords'            */\n\n  static FT_Int\n  ps_tocoordarray( FT_Byte*  *acur,\n                   FT_Byte*   limit,\n                   FT_Int     max_coords,\n                   FT_Short*  coords )\n  {\n    FT_Byte*  cur   = *acur;\n    FT_Int    count = 0;\n    FT_Byte   c, ender;\n\n\n    if ( cur >= limit )\n      goto Exit;\n\n    /* check for the beginning of an array; otherwise, only one number */\n    /* will be read                                                    */\n    c     = *cur;\n    ender = 0;\n\n    if ( c == '[' )\n      ender = ']';\n    else if ( c == '{' )\n      ender = '}';\n\n    if ( ender )\n      cur++;\n\n    /* now, read the coordinates */\n    while ( cur < limit )\n    {\n      FT_Short  dummy;\n      FT_Byte*  old_cur;\n\n\n      /* skip whitespace in front of data */\n      skip_spaces( &cur, limit );\n      if ( cur >= limit )\n        goto Exit;\n\n      if ( *cur == ender )\n      {\n        cur++;\n        break;\n      }\n\n      old_cur = cur;\n\n      if ( coords != NULL && count >= max_coords )\n        break;\n\n      /* call PS_Conv_ToFixed() even if coords == NULL */\n      /* to properly parse number at `cur'             */\n      *( coords != NULL ? &coords[count] : &dummy ) =\n        (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 );\n\n      if ( old_cur == cur )\n      {\n        count = -1;\n        goto Exit;\n      }\n      else\n        count++;\n\n      if ( !ender )\n        break;\n    }\n\n  Exit:\n    *acur = cur;\n    return count;\n  }\n\n\n  /* first character must be a delimiter or a part of a number */\n  /* NB: `values' can be NULL if we just want to skip the      */\n  /*     array; in this case we ignore `max_values'            */\n\n  static FT_Int\n  ps_tofixedarray( FT_Byte*  *acur,\n                   FT_Byte*   limit,\n                   FT_Int     max_values,\n                   FT_Fixed*  values,\n                   FT_Int     power_ten )\n  {\n    FT_Byte*  cur   = *acur;\n    FT_Int    count = 0;\n    FT_Byte   c, ender;\n\n\n    if ( cur >= limit )\n      goto Exit;\n\n    /* Check for the beginning of an array.  Otherwise, only one number */\n    /* will be read.                                                    */\n    c     = *cur;\n    ender = 0;\n\n    if ( c == '[' )\n      ender = ']';\n    else if ( c == '{' )\n      ender = '}';\n\n    if ( ender )\n      cur++;\n\n    /* now, read the values */\n    while ( cur < limit )\n    {\n      FT_Fixed  dummy;\n      FT_Byte*  old_cur;\n\n\n      /* skip whitespace in front of data */\n      skip_spaces( &cur, limit );\n      if ( cur >= limit )\n        goto Exit;\n\n      if ( *cur == ender )\n      {\n        cur++;\n        break;\n      }\n\n      old_cur = cur;\n\n      if ( values != NULL && count >= max_values )\n        break;\n\n      /* call PS_Conv_ToFixed() even if coords == NULL */\n      /* to properly parse number at `cur'             */\n      *( values != NULL ? &values[count] : &dummy ) =\n        PS_Conv_ToFixed( &cur, limit, power_ten );\n\n      if ( old_cur == cur )\n      {\n        count = -1;\n        goto Exit;\n      }\n      else\n        count++;\n\n      if ( !ender )\n        break;\n    }\n\n  Exit:\n    *acur = cur;\n    return count;\n  }\n\n\n#if 0\n\n  static FT_String*\n  ps_tostring( FT_Byte**  cursor,\n               FT_Byte*   limit,\n               FT_Memory  memory )\n  {\n    FT_Byte*    cur = *cursor;\n    FT_PtrDist  len = 0;\n    FT_Int      count;\n    FT_String*  result;\n    FT_Error    error;\n\n\n    /* XXX: some stupid fonts have a `Notice' or `Copyright' string     */\n    /*      that simply doesn't begin with an opening parenthesis, even */\n    /*      though they have a closing one!  E.g. \"amuncial.pfb\"        */\n    /*                                                                  */\n    /*      We must deal with these ill-fated cases there.  Note that   */\n    /*      these fonts didn't work with the old Type 1 driver as the   */\n    /*      notice/copyright was not recognized as a valid string token */\n    /*      and made the old token parser commit errors.                */\n\n    while ( cur < limit && ( *cur == ' ' || *cur == '\\t' ) )\n      cur++;\n    if ( cur + 1 >= limit )\n      return 0;\n\n    if ( *cur == '(' )\n      cur++;  /* skip the opening parenthesis, if there is one */\n\n    *cursor = cur;\n    count   = 0;\n\n    /* then, count its length */\n    for ( ; cur < limit; cur++ )\n    {\n      if ( *cur == '(' )\n        count++;\n\n      else if ( *cur == ')' )\n      {\n        count--;\n        if ( count < 0 )\n          break;\n      }\n    }\n\n    len = cur - *cursor;\n    if ( cur >= limit || FT_ALLOC( result, len + 1 ) )\n      return 0;\n\n    /* now copy the string */\n    FT_MEM_COPY( result, *cursor, len );\n    result[len] = '\\0';\n    *cursor = cur;\n    return result;\n  }\n\n#endif /* 0 */\n\n\n  static int\n  ps_tobool( FT_Byte*  *acur,\n             FT_Byte*   limit )\n  {\n    FT_Byte*  cur    = *acur;\n    FT_Bool   result = 0;\n\n\n    /* return 1 if we find `true', 0 otherwise */\n    if ( cur + 3 < limit &&\n         cur[0] == 't'   &&\n         cur[1] == 'r'   &&\n         cur[2] == 'u'   &&\n         cur[3] == 'e'   )\n    {\n      result = 1;\n      cur   += 5;\n    }\n    else if ( cur + 4 < limit &&\n              cur[0] == 'f'   &&\n              cur[1] == 'a'   &&\n              cur[2] == 'l'   &&\n              cur[3] == 's'   &&\n              cur[4] == 'e'   )\n    {\n      result = 0;\n      cur   += 6;\n    }\n\n    *acur = cur;\n    return result;\n  }\n\n\n  /* load a simple field (i.e. non-table) into the current list of objects */\n\n  FT_LOCAL_DEF( FT_Error )\n  ps_parser_load_field( PS_Parser       parser,\n                        const T1_Field  field,\n                        void**          objects,\n                        FT_UInt         max_objects,\n                        FT_ULong*       pflags )\n  {\n    T1_TokenRec   token;\n    FT_Byte*      cur;\n    FT_Byte*      limit;\n    FT_UInt       count;\n    FT_UInt       idx;\n    FT_Error      error;\n    T1_FieldType  type;\n\n\n    /* this also skips leading whitespace */\n    ps_parser_to_token( parser, &token );\n    if ( !token.type )\n      goto Fail;\n\n    count = 1;\n    idx   = 0;\n    cur   = token.start;\n    limit = token.limit;\n\n    type = field->type;\n\n    /* we must detect arrays in /FontBBox */\n    if ( type == T1_FIELD_TYPE_BBOX )\n    {\n      T1_TokenRec  token2;\n      FT_Byte*     old_cur   = parser->cursor;\n      FT_Byte*     old_limit = parser->limit;\n\n\n      /* don't include delimiters */\n      parser->cursor = token.start + 1;\n      parser->limit  = token.limit - 1;\n\n      ps_parser_to_token( parser, &token2 );\n      parser->cursor = old_cur;\n      parser->limit  = old_limit;\n\n      if ( token2.type == T1_TOKEN_TYPE_ARRAY )\n      {\n        type = T1_FIELD_TYPE_MM_BBOX;\n        goto FieldArray;\n      }\n    }\n    else if ( token.type == T1_TOKEN_TYPE_ARRAY )\n    {\n      count = max_objects;\n\n    FieldArray:\n      /* if this is an array and we have no blend, an error occurs */\n      if ( max_objects == 0 )\n        goto Fail;\n\n      idx = 1;\n\n      /* don't include delimiters */\n      cur++;\n      limit--;\n    }\n\n    for ( ; count > 0; count--, idx++ )\n    {\n      FT_Byte*    q = (FT_Byte*)objects[idx] + field->offset;\n      FT_Long     val;\n      FT_String*  string;\n\n\n      skip_spaces( &cur, limit );\n\n      switch ( type )\n      {\n      case T1_FIELD_TYPE_BOOL:\n        val = ps_tobool( &cur, limit );\n        goto Store_Integer;\n\n      case T1_FIELD_TYPE_FIXED:\n        val = PS_Conv_ToFixed( &cur, limit, 0 );\n        goto Store_Integer;\n\n      case T1_FIELD_TYPE_FIXED_1000:\n        val = PS_Conv_ToFixed( &cur, limit, 3 );\n        goto Store_Integer;\n\n      case T1_FIELD_TYPE_INTEGER:\n        val = PS_Conv_ToInt( &cur, limit );\n        /* fall through */\n\n      Store_Integer:\n        switch ( field->size )\n        {\n        case (8 / FT_CHAR_BIT):\n          *(FT_Byte*)q = (FT_Byte)val;\n          break;\n\n        case (16 / FT_CHAR_BIT):\n          *(FT_UShort*)q = (FT_UShort)val;\n          break;\n\n        case (32 / FT_CHAR_BIT):\n          *(FT_UInt32*)q = (FT_UInt32)val;\n          break;\n\n        default:                /* for 64-bit systems */\n          *(FT_Long*)q = val;\n        }\n        break;\n\n      case T1_FIELD_TYPE_STRING:\n      case T1_FIELD_TYPE_KEY:\n        {\n          FT_Memory  memory = parser->memory;\n          FT_UInt    len    = (FT_UInt)( limit - cur );\n\n\n          if ( cur >= limit )\n            break;\n\n          /* we allow both a string or a name   */\n          /* for cases like /FontName (foo) def */\n          if ( token.type == T1_TOKEN_TYPE_KEY )\n          {\n            /* don't include leading `/' */\n            len--;\n            cur++;\n          }\n          else if ( token.type == T1_TOKEN_TYPE_STRING )\n          {\n            /* don't include delimiting parentheses    */\n            /* XXX we don't handle <<...>> here        */\n            /* XXX should we convert octal escapes?    */\n            /*     if so, what encoding should we use? */\n            cur++;\n            len -= 2;\n          }\n          else\n          {\n            FT_ERROR(( \"ps_parser_load_field:\"\n                       \" expected a name or string\\n\"\n                       \"                     \"\n                       \" but found token of type %d instead\\n\",\n                       token.type ));\n            error = FT_THROW( Invalid_File_Format );\n            goto Exit;\n          }\n\n          /* for this to work (FT_String**)q must have been */\n          /* initialized to NULL                            */\n          if ( *(FT_String**)q != NULL )\n          {\n            FT_TRACE0(( \"ps_parser_load_field: overwriting field %s\\n\",\n                        field->ident ));\n            FT_FREE( *(FT_String**)q );\n            *(FT_String**)q = NULL;\n          }\n\n          if ( FT_ALLOC( string, len + 1 ) )\n            goto Exit;\n\n          FT_MEM_COPY( string, cur, len );\n          string[len] = 0;\n\n          *(FT_String**)q = string;\n        }\n        break;\n\n      case T1_FIELD_TYPE_BBOX:\n        {\n          FT_Fixed  temp[4];\n          FT_BBox*  bbox = (FT_BBox*)q;\n          FT_Int    result;\n\n\n          result = ps_tofixedarray( &cur, limit, 4, temp, 0 );\n\n          if ( result < 0 )\n          {\n            FT_ERROR(( \"ps_parser_load_field:\"\n                       \" expected four integers in bounding box\\n\" ));\n            error = FT_THROW( Invalid_File_Format );\n            goto Exit;\n          }\n\n          bbox->xMin = FT_RoundFix( temp[0] );\n          bbox->yMin = FT_RoundFix( temp[1] );\n          bbox->xMax = FT_RoundFix( temp[2] );\n          bbox->yMax = FT_RoundFix( temp[3] );\n        }\n        break;\n\n      case T1_FIELD_TYPE_MM_BBOX:\n        {\n          FT_Memory  memory = parser->memory;\n          FT_Fixed*  temp;\n          FT_Int     result;\n          FT_UInt    i;\n\n\n          if ( FT_NEW_ARRAY( temp, max_objects * 4 ) )\n            goto Exit;\n\n          for ( i = 0; i < 4; i++ )\n          {\n            result = ps_tofixedarray( &cur, limit, max_objects,\n                                      temp + i * max_objects, 0 );\n            if ( result < 0 )\n            {\n              FT_ERROR(( \"ps_parser_load_field:\"\n                         \" expected %d integers in the %s subarray\\n\"\n                         \"                     \"\n                         \" of /FontBBox in the /Blend dictionary\\n\",\n                         max_objects,\n                         i == 0 ? \"first\"\n                                : ( i == 1 ? \"second\"\n                                           : ( i == 2 ? \"third\"\n                                                      : \"fourth\" ) ) ));\n              error = FT_THROW( Invalid_File_Format );\n              goto Exit;\n            }\n\n            skip_spaces( &cur, limit );\n          }\n\n          for ( i = 0; i < max_objects; i++ )\n          {\n            FT_BBox*  bbox = (FT_BBox*)objects[i];\n\n\n            bbox->xMin = FT_RoundFix( temp[i                  ] );\n            bbox->yMin = FT_RoundFix( temp[i +     max_objects] );\n            bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] );\n            bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] );\n          }\n\n          FT_FREE( temp );\n        }\n        break;\n\n      default:\n        /* an error occurred */\n        goto Fail;\n      }\n    }\n\n#if 0  /* obsolete -- keep for reference */\n    if ( pflags )\n      *pflags |= 1L << field->flag_bit;\n#else\n    FT_UNUSED( pflags );\n#endif\n\n    error = FT_Err_Ok;\n\n  Exit:\n    return error;\n\n  Fail:\n    error = FT_THROW( Invalid_File_Format );\n    goto Exit;\n  }\n\n\n#define T1_MAX_TABLE_ELEMENTS  32\n\n\n  FT_LOCAL_DEF( FT_Error )\n  ps_parser_load_field_table( PS_Parser       parser,\n                              const T1_Field  field,\n                              void**          objects,\n                              FT_UInt         max_objects,\n                              FT_ULong*       pflags )\n  {\n    T1_TokenRec  elements[T1_MAX_TABLE_ELEMENTS];\n    T1_Token     token;\n    FT_Int       num_elements;\n    FT_Error     error = FT_Err_Ok;\n    FT_Byte*     old_cursor;\n    FT_Byte*     old_limit;\n    T1_FieldRec  fieldrec = *(T1_Field)field;\n\n\n    fieldrec.type = T1_FIELD_TYPE_INTEGER;\n    if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY ||\n         field->type == T1_FIELD_TYPE_BBOX        )\n      fieldrec.type = T1_FIELD_TYPE_FIXED;\n\n    ps_parser_to_token_array( parser, elements,\n                              T1_MAX_TABLE_ELEMENTS, &num_elements );\n    if ( num_elements < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( (FT_UInt)num_elements > field->array_max )\n      num_elements = field->array_max;\n\n    old_cursor = parser->cursor;\n    old_limit  = parser->limit;\n\n    /* we store the elements count if necessary;           */\n    /* we further assume that `count_offset' can't be zero */\n    if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 )\n      *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) =\n        (FT_Byte)num_elements;\n\n    /* we now load each element, adjusting the field.offset on each one */\n    token = elements;\n    for ( ; num_elements > 0; num_elements--, token++ )\n    {\n      parser->cursor = token->start;\n      parser->limit  = token->limit;\n      ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 );\n      fieldrec.offset += fieldrec.size;\n    }\n\n#if 0  /* obsolete -- keep for reference */\n    if ( pflags )\n      *pflags |= 1L << field->flag_bit;\n#else\n    FT_UNUSED( pflags );\n#endif\n\n    parser->cursor = old_cursor;\n    parser->limit  = old_limit;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Long )\n  ps_parser_to_int( PS_Parser  parser )\n  {\n    ps_parser_skip_spaces( parser );\n    return PS_Conv_ToInt( &parser->cursor, parser->limit );\n  }\n\n\n  /* first character must be `<' if `delimiters' is non-zero */\n\n  FT_LOCAL_DEF( FT_Error )\n  ps_parser_to_bytes( PS_Parser  parser,\n                      FT_Byte*   bytes,\n                      FT_Offset  max_bytes,\n                      FT_Long*   pnum_bytes,\n                      FT_Bool    delimiters )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Byte*  cur;\n\n\n    ps_parser_skip_spaces( parser );\n    cur = parser->cursor;\n\n    if ( cur >= parser->limit )\n      goto Exit;\n\n    if ( delimiters )\n    {\n      if ( *cur != '<' )\n      {\n        FT_ERROR(( \"ps_parser_to_bytes: Missing starting delimiter `<'\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      cur++;\n    }\n\n    *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,\n                                          parser->limit,\n                                          bytes,\n                                          max_bytes );\n\n    if ( delimiters )\n    {\n      if ( cur < parser->limit && *cur != '>' )\n      {\n        FT_ERROR(( \"ps_parser_to_bytes: Missing closing delimiter `>'\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      cur++;\n    }\n\n    parser->cursor = cur;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Fixed )\n  ps_parser_to_fixed( PS_Parser  parser,\n                      FT_Int     power_ten )\n  {\n    ps_parser_skip_spaces( parser );\n    return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten );\n  }\n\n\n  FT_LOCAL_DEF( FT_Int )\n  ps_parser_to_coord_array( PS_Parser  parser,\n                            FT_Int     max_coords,\n                            FT_Short*  coords )\n  {\n    ps_parser_skip_spaces( parser );\n    return ps_tocoordarray( &parser->cursor, parser->limit,\n                            max_coords, coords );\n  }\n\n\n  FT_LOCAL_DEF( FT_Int )\n  ps_parser_to_fixed_array( PS_Parser  parser,\n                            FT_Int     max_values,\n                            FT_Fixed*  values,\n                            FT_Int     power_ten )\n  {\n    ps_parser_skip_spaces( parser );\n    return ps_tofixedarray( &parser->cursor, parser->limit,\n                            max_values, values, power_ten );\n  }\n\n\n#if 0\n\n  FT_LOCAL_DEF( FT_String* )\n  T1_ToString( PS_Parser  parser )\n  {\n    return ps_tostring( &parser->cursor, parser->limit, parser->memory );\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  T1_ToBool( PS_Parser  parser )\n  {\n    return ps_tobool( &parser->cursor, parser->limit );\n  }\n\n#endif /* 0 */\n\n\n  FT_LOCAL_DEF( void )\n  ps_parser_init( PS_Parser  parser,\n                  FT_Byte*   base,\n                  FT_Byte*   limit,\n                  FT_Memory  memory )\n  {\n    parser->error  = FT_Err_Ok;\n    parser->base   = base;\n    parser->limit  = limit;\n    parser->cursor = base;\n    parser->memory = memory;\n    parser->funcs  = ps_parser_funcs;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  ps_parser_done( PS_Parser  parser )\n  {\n    FT_UNUSED( parser );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 BUILDER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1_builder_init                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given glyph builder.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    builder :: A pointer to the glyph builder to initialize.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face    :: The current face object.                                */\n  /*                                                                       */\n  /*    size    :: The current size object.                                */\n  /*                                                                       */\n  /*    glyph   :: The current glyph object.                               */\n  /*                                                                       */\n  /*    hinting :: Whether hinting should be applied.                      */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  t1_builder_init( T1_Builder    builder,\n                   FT_Face       face,\n                   FT_Size       size,\n                   FT_GlyphSlot  glyph,\n                   FT_Bool       hinting )\n  {\n    builder->parse_state = T1_Parse_Start;\n    builder->load_points = 1;\n\n    builder->face   = face;\n    builder->glyph  = glyph;\n    builder->memory = face->memory;\n\n    if ( glyph )\n    {\n      FT_GlyphLoader  loader = glyph->internal->loader;\n\n\n      builder->loader  = loader;\n      builder->base    = &loader->base.outline;\n      builder->current = &loader->current.outline;\n      FT_GlyphLoader_Rewind( loader );\n\n      builder->hints_globals = size->internal;\n      builder->hints_funcs   = 0;\n\n      if ( hinting )\n        builder->hints_funcs = glyph->internal->glyph_hints;\n    }\n\n    builder->pos_x = 0;\n    builder->pos_y = 0;\n\n    builder->left_bearing.x = 0;\n    builder->left_bearing.y = 0;\n    builder->advance.x      = 0;\n    builder->advance.y      = 0;\n\n    builder->funcs = t1_builder_funcs;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1_builder_done                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given glyph builder.  Its contents can still be used   */\n  /*    after the call, but the function saves important information       */\n  /*    within the corresponding glyph slot.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    builder :: A pointer to the glyph builder to finalize.             */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  t1_builder_done( T1_Builder  builder )\n  {\n    FT_GlyphSlot  glyph = builder->glyph;\n\n\n    if ( glyph )\n      glyph->outline = *builder->base;\n  }\n\n\n  /* check that there is enough space for `count' more points */\n  FT_LOCAL_DEF( FT_Error )\n  t1_builder_check_points( T1_Builder  builder,\n                           FT_Int      count )\n  {\n    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );\n  }\n\n\n  /* add a new point, do not check space */\n  FT_LOCAL_DEF( void )\n  t1_builder_add_point( T1_Builder  builder,\n                        FT_Pos      x,\n                        FT_Pos      y,\n                        FT_Byte     flag )\n  {\n    FT_Outline*  outline = builder->current;\n\n\n    if ( builder->load_points )\n    {\n      FT_Vector*  point   = outline->points + outline->n_points;\n      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;\n\n\n      point->x = FIXED_TO_INT( x );\n      point->y = FIXED_TO_INT( y );\n      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );\n    }\n    outline->n_points++;\n  }\n\n\n  /* check space for a new on-curve point, then add it */\n  FT_LOCAL_DEF( FT_Error )\n  t1_builder_add_point1( T1_Builder  builder,\n                         FT_Pos      x,\n                         FT_Pos      y )\n  {\n    FT_Error  error;\n\n\n    error = t1_builder_check_points( builder, 1 );\n    if ( !error )\n      t1_builder_add_point( builder, x, y, 1 );\n\n    return error;\n  }\n\n\n  /* check space for a new contour, then add it */\n  FT_LOCAL_DEF( FT_Error )\n  t1_builder_add_contour( T1_Builder  builder )\n  {\n    FT_Outline*  outline = builder->current;\n    FT_Error     error;\n\n\n    /* this might happen in invalid fonts */\n    if ( !outline )\n    {\n      FT_ERROR(( \"t1_builder_add_contour: no outline to add points to\\n\" ));\n      return FT_THROW( Invalid_File_Format );\n    }\n\n    if ( !builder->load_points )\n    {\n      outline->n_contours++;\n      return FT_Err_Ok;\n    }\n\n    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );\n    if ( !error )\n    {\n      if ( outline->n_contours > 0 )\n        outline->contours[outline->n_contours - 1] =\n          (short)( outline->n_points - 1 );\n\n      outline->n_contours++;\n    }\n\n    return error;\n  }\n\n\n  /* if a path was begun, add its first on-curve point */\n  FT_LOCAL_DEF( FT_Error )\n  t1_builder_start_point( T1_Builder  builder,\n                          FT_Pos      x,\n                          FT_Pos      y )\n  {\n    FT_Error  error = FT_ERR( Invalid_File_Format );\n\n\n    /* test whether we are building a new contour */\n\n    if ( builder->parse_state == T1_Parse_Have_Path )\n      error = FT_Err_Ok;\n    else\n    {\n      builder->parse_state = T1_Parse_Have_Path;\n      error = t1_builder_add_contour( builder );\n      if ( !error )\n        error = t1_builder_add_point1( builder, x, y );\n    }\n\n    return error;\n  }\n\n\n  /* close the current contour */\n  FT_LOCAL_DEF( void )\n  t1_builder_close_contour( T1_Builder  builder )\n  {\n    FT_Outline*  outline = builder->current;\n    FT_Int       first;\n\n\n    if ( !outline )\n      return;\n\n    first = outline->n_contours <= 1\n            ? 0 : outline->contours[outline->n_contours - 2] + 1;\n\n    /* We must not include the last point in the path if it */\n    /* is located on the first point.                       */\n    if ( outline->n_points > 1 )\n    {\n      FT_Vector*  p1      = outline->points + first;\n      FT_Vector*  p2      = outline->points + outline->n_points - 1;\n      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;\n\n\n      /* `delete' last point only if it coincides with the first */\n      /* point and it is not a control point (which can happen). */\n      if ( p1->x == p2->x && p1->y == p2->y )\n        if ( *control == FT_CURVE_TAG_ON )\n          outline->n_points--;\n    }\n\n    if ( outline->n_contours > 0 )\n    {\n      /* Don't add contours only consisting of one point, i.e.,  */\n      /* check whether the first and the last point is the same. */\n      if ( first == outline->n_points - 1 )\n      {\n        outline->n_contours--;\n        outline->n_points--;\n      }\n      else\n        outline->contours[outline->n_contours - 1] =\n          (short)( outline->n_points - 1 );\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            OTHER                              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  t1_decrypt( FT_Byte*   buffer,\n              FT_Offset  length,\n              FT_UShort  seed )\n  {\n    PS_Conv_EexecDecode( &buffer,\n                         buffer + length,\n                         buffer,\n                         length,\n                         &seed );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/psobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psobjs.h                                                               */\n/*                                                                         */\n/*    Auxiliary functions for PostScript fonts (specification).            */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSOBJS_H__\n#define __PSOBJS_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                             T1_TABLE                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_CALLBACK_TABLE\n  const PS_Table_FuncsRec    ps_table_funcs;\n\n  FT_CALLBACK_TABLE\n  const PS_Parser_FuncsRec   ps_parser_funcs;\n\n  FT_CALLBACK_TABLE\n  const T1_Builder_FuncsRec  t1_builder_funcs;\n\n\n  FT_LOCAL( FT_Error )\n  ps_table_new( PS_Table   table,\n                FT_Int     count,\n                FT_Memory  memory );\n\n  FT_LOCAL( FT_Error )\n  ps_table_add( PS_Table    table,\n                FT_Int      idx,\n                void*       object,\n                FT_PtrDist  length );\n\n  FT_LOCAL( void )\n  ps_table_done( PS_Table  table );\n\n\n  FT_LOCAL( void )\n  ps_table_release( PS_Table  table );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 PARSER                          *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL( void )\n  ps_parser_skip_spaces( PS_Parser  parser );\n\n  FT_LOCAL( void )\n  ps_parser_skip_PS_token( PS_Parser  parser );\n\n  FT_LOCAL( void )\n  ps_parser_to_token( PS_Parser  parser,\n                      T1_Token   token );\n\n  FT_LOCAL( void )\n  ps_parser_to_token_array( PS_Parser  parser,\n                            T1_Token   tokens,\n                            FT_UInt    max_tokens,\n                            FT_Int*    pnum_tokens );\n\n  FT_LOCAL( FT_Error )\n  ps_parser_load_field( PS_Parser       parser,\n                        const T1_Field  field,\n                        void**          objects,\n                        FT_UInt         max_objects,\n                        FT_ULong*       pflags );\n\n  FT_LOCAL( FT_Error )\n  ps_parser_load_field_table( PS_Parser       parser,\n                              const T1_Field  field,\n                              void**          objects,\n                              FT_UInt         max_objects,\n                              FT_ULong*       pflags );\n\n  FT_LOCAL( FT_Long )\n  ps_parser_to_int( PS_Parser  parser );\n\n\n  FT_LOCAL( FT_Error )\n  ps_parser_to_bytes( PS_Parser  parser,\n                      FT_Byte*   bytes,\n                      FT_Offset  max_bytes,\n                      FT_Long*   pnum_bytes,\n                      FT_Bool    delimiters );\n\n\n  FT_LOCAL( FT_Fixed )\n  ps_parser_to_fixed( PS_Parser  parser,\n                      FT_Int     power_ten );\n\n\n  FT_LOCAL( FT_Int )\n  ps_parser_to_coord_array( PS_Parser  parser,\n                            FT_Int     max_coords,\n                            FT_Short*  coords );\n\n  FT_LOCAL( FT_Int )\n  ps_parser_to_fixed_array( PS_Parser  parser,\n                            FT_Int     max_values,\n                            FT_Fixed*  values,\n                            FT_Int     power_ten );\n\n\n  FT_LOCAL( void )\n  ps_parser_init( PS_Parser  parser,\n                  FT_Byte*   base,\n                  FT_Byte*   limit,\n                  FT_Memory  memory );\n\n  FT_LOCAL( void )\n  ps_parser_done( PS_Parser  parser );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            T1 BUILDER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  t1_builder_init( T1_Builder    builder,\n                   FT_Face       face,\n                   FT_Size       size,\n                   FT_GlyphSlot  glyph,\n                   FT_Bool       hinting );\n\n  FT_LOCAL( void )\n  t1_builder_done( T1_Builder  builder );\n\n  FT_LOCAL( FT_Error )\n  t1_builder_check_points( T1_Builder  builder,\n                           FT_Int      count );\n\n  FT_LOCAL( void )\n  t1_builder_add_point( T1_Builder  builder,\n                        FT_Pos      x,\n                        FT_Pos      y,\n                        FT_Byte     flag );\n\n  FT_LOCAL( FT_Error )\n  t1_builder_add_point1( T1_Builder  builder,\n                         FT_Pos      x,\n                         FT_Pos      y );\n\n  FT_LOCAL( FT_Error )\n  t1_builder_add_contour( T1_Builder  builder );\n\n\n  FT_LOCAL( FT_Error )\n  t1_builder_start_point( T1_Builder  builder,\n                          FT_Pos      x,\n                          FT_Pos      y );\n\n\n  FT_LOCAL( void )\n  t1_builder_close_contour( T1_Builder  builder );\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                            OTHER                              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_LOCAL( void )\n  t1_decrypt( FT_Byte*   buffer,\n              FT_Offset  length,\n              FT_UShort  seed );\n\n\nFT_END_HEADER\n\n#endif /* __PSOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/rules.mk",
    "content": "#\n# FreeType 2 PSaux driver configuration rules\n#\n\n\n# Copyright 1996-2000, 2002, 2003, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# PSAUX driver directory\n#\nPSAUX_DIR := $(SRC_DIR)/psaux\n\n\n# compilation flags for the driver\n#\nPSAUX_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSAUX_DIR))\n\n\n# PSAUX driver sources (i.e., C files)\n#\nPSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c   \\\n                 $(PSAUX_DIR)/t1decode.c \\\n                 $(PSAUX_DIR)/t1cmap.c   \\\n                 $(PSAUX_DIR)/afmparse.c \\\n                 $(PSAUX_DIR)/psconv.c   \\\n                 $(PSAUX_DIR)/psauxmod.c\n\n# PSAUX driver headers\n#\nPSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h)  \\\n               $(PSAUX_DIR)/psauxerr.h\n\n\n# PSAUX driver object(s)\n#\n#   PSAUX_DRV_OBJ_M is used during `multi' builds.\n#   PSAUX_DRV_OBJ_S is used during `single' builds.\n#\nPSAUX_DRV_OBJ_M := $(PSAUX_DRV_SRC:$(PSAUX_DIR)/%.c=$(OBJ_DIR)/%.$O)\nPSAUX_DRV_OBJ_S := $(OBJ_DIR)/psaux.$O\n\n# PSAUX driver source file for single build\n#\nPSAUX_DRV_SRC_S := $(PSAUX_DIR)/psaux.c\n\n\n# PSAUX driver - single object\n#\n$(PSAUX_DRV_OBJ_S): $(PSAUX_DRV_SRC_S) $(PSAUX_DRV_SRC) \\\n                   $(FREETYPE_H) $(PSAUX_DRV_H)\n\t$(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSAUX_DRV_SRC_S))\n\n\n# PSAUX driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(PSAUX_DIR)/%.c $(FREETYPE_H) $(PSAUX_DRV_H)\n\t$(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(PSAUX_DRV_OBJ_S)\nDRV_OBJS_M += $(PSAUX_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/psaux/t1cmap.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1cmap.c                                                               */\n/*                                                                         */\n/*    Type 1 character map support (body).                                 */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006, 2007, 2012 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"t1cmap.h\"\n\n#include FT_INTERNAL_DEBUG_H\n\n#include \"psauxerr.h\"\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  t1_cmap_std_init( T1_CMapStd  cmap,\n                    FT_Int      is_expert )\n  {\n    T1_Face             face    = (T1_Face)FT_CMAP_FACE( cmap );\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;\n\n\n    cmap->num_glyphs    = face->type1.num_glyphs;\n    cmap->glyph_names   = (const char* const*)face->type1.glyph_names;\n    cmap->sid_to_string = psnames->adobe_std_strings;\n    cmap->code_to_sid   = is_expert ? psnames->adobe_expert_encoding\n                                    : psnames->adobe_std_encoding;\n\n    FT_ASSERT( cmap->code_to_sid != NULL );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  t1_cmap_std_done( T1_CMapStd  cmap )\n  {\n    cmap->num_glyphs    = 0;\n    cmap->glyph_names   = NULL;\n    cmap->sid_to_string = NULL;\n    cmap->code_to_sid   = NULL;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  t1_cmap_std_char_index( T1_CMapStd  cmap,\n                          FT_UInt32   char_code )\n  {\n    FT_UInt  result = 0;\n\n\n    if ( char_code < 256 )\n    {\n      FT_UInt      code, n;\n      const char*  glyph_name;\n\n\n      /* convert character code to Adobe SID string */\n      code       = cmap->code_to_sid[char_code];\n      glyph_name = cmap->sid_to_string( code );\n\n      /* look for the corresponding glyph name */\n      for ( n = 0; n < cmap->num_glyphs; n++ )\n      {\n        const char* gname = cmap->glyph_names[n];\n\n\n        if ( gname && gname[0] == glyph_name[0]  &&\n             ft_strcmp( gname, glyph_name ) == 0 )\n        {\n          result = n;\n          break;\n        }\n      }\n    }\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  t1_cmap_std_char_next( T1_CMapStd   cmap,\n                         FT_UInt32   *pchar_code )\n  {\n    FT_UInt    result    = 0;\n    FT_UInt32  char_code = *pchar_code + 1;\n\n\n    while ( char_code < 256 )\n    {\n      result = t1_cmap_std_char_index( cmap, char_code );\n      if ( result != 0 )\n        goto Exit;\n\n      char_code++;\n    }\n    char_code = 0;\n\n  Exit:\n    *pchar_code = char_code;\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  t1_cmap_standard_init( T1_CMapStd  cmap )\n  {\n    t1_cmap_std_init( cmap, 0 );\n    return 0;\n  }\n\n\n  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec\n  t1_cmap_standard_class_rec =\n  {\n    sizeof ( T1_CMapStdRec ),\n\n    (FT_CMap_InitFunc)     t1_cmap_standard_init,\n    (FT_CMap_DoneFunc)     t1_cmap_std_done,\n    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,\n    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  t1_cmap_expert_init( T1_CMapStd  cmap )\n  {\n    t1_cmap_std_init( cmap, 1 );\n    return 0;\n  }\n\n  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec\n  t1_cmap_expert_class_rec =\n  {\n    sizeof ( T1_CMapStdRec ),\n\n    (FT_CMap_InitFunc)     t1_cmap_expert_init,\n    (FT_CMap_DoneFunc)     t1_cmap_std_done,\n    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,\n    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    TYPE1 CUSTOM ENCODING CMAP                 *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  t1_cmap_custom_init( T1_CMapCustom  cmap )\n  {\n    T1_Face      face     = (T1_Face)FT_CMAP_FACE( cmap );\n    T1_Encoding  encoding = &face->type1.encoding;\n\n\n    cmap->first   = encoding->code_first;\n    cmap->count   = (FT_UInt)( encoding->code_last - cmap->first );\n    cmap->indices = encoding->char_index;\n\n    FT_ASSERT( cmap->indices != NULL );\n    FT_ASSERT( encoding->code_first <= encoding->code_last );\n\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  t1_cmap_custom_done( T1_CMapCustom  cmap )\n  {\n    cmap->indices = NULL;\n    cmap->first   = 0;\n    cmap->count   = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  t1_cmap_custom_char_index( T1_CMapCustom  cmap,\n                             FT_UInt32      char_code )\n  {\n    FT_UInt    result = 0;\n\n\n    if ( ( char_code >= cmap->first )                  &&\n         ( char_code < ( cmap->first + cmap->count ) ) )\n      result = cmap->indices[char_code];\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  t1_cmap_custom_char_next( T1_CMapCustom  cmap,\n                            FT_UInt32     *pchar_code )\n  {\n    FT_UInt    result = 0;\n    FT_UInt32  char_code = *pchar_code;\n\n\n    ++char_code;\n\n    if ( char_code < cmap->first )\n      char_code = cmap->first;\n\n    for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )\n    {\n      result = cmap->indices[char_code];\n      if ( result != 0 )\n        goto Exit;\n    }\n\n    char_code = 0;\n\n  Exit:\n    *pchar_code = char_code;\n    return result;\n  }\n\n\n  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec\n  t1_cmap_custom_class_rec =\n  {\n    sizeof ( T1_CMapCustomRec ),\n\n    (FT_CMap_InitFunc)     t1_cmap_custom_init,\n    (FT_CMap_DoneFunc)     t1_cmap_custom_done,\n    (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,\n    (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****            TYPE1 SYNTHETIC UNICODE ENCODING CMAP              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( const char * )\n  psaux_get_glyph_name( T1_Face  face,\n                        FT_UInt  idx )\n  {\n    return face->type1.glyph_names[idx];\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  t1_cmap_unicode_init( PS_Unicodes  unicodes )\n  {\n    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );\n    FT_Memory           memory  = FT_FACE_MEMORY( face );\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;\n\n\n    return psnames->unicodes_init( memory,\n                                   unicodes,\n                                   face->type1.num_glyphs,\n                                   (PS_GetGlyphNameFunc)&psaux_get_glyph_name,\n                                   (PS_FreeGlyphNameFunc)NULL,\n                                   (FT_Pointer)face );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  t1_cmap_unicode_done( PS_Unicodes  unicodes )\n  {\n    FT_Face    face   = FT_CMAP_FACE( unicodes );\n    FT_Memory  memory = FT_FACE_MEMORY( face );\n\n\n    FT_FREE( unicodes->maps );\n    unicodes->num_maps = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  t1_cmap_unicode_char_index( PS_Unicodes  unicodes,\n                              FT_UInt32    char_code )\n  {\n    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;\n\n\n    return psnames->unicodes_char_index( unicodes, char_code );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  t1_cmap_unicode_char_next( PS_Unicodes  unicodes,\n                             FT_UInt32   *pchar_code )\n  {\n    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );\n    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;\n\n\n    return psnames->unicodes_char_next( unicodes, pchar_code );\n  }\n\n\n  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec\n  t1_cmap_unicode_class_rec =\n  {\n    sizeof ( PS_UnicodesRec ),\n\n    (FT_CMap_InitFunc)     t1_cmap_unicode_init,\n    (FT_CMap_DoneFunc)     t1_cmap_unicode_done,\n    (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,\n    (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/t1cmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1cmap.h                                                               */\n/*                                                                         */\n/*    Type 1 character map support (specification).                        */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1CMAP_H__\n#define __T1CMAP_H__\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* standard (and expert) encoding cmaps */\n  typedef struct T1_CMapStdRec_*  T1_CMapStd;\n\n  typedef struct  T1_CMapStdRec_\n  {\n    FT_CMapRec                cmap;\n\n    const FT_UShort*          code_to_sid;\n    PS_Adobe_Std_StringsFunc  sid_to_string;\n\n    FT_UInt                   num_glyphs;\n    const char* const*        glyph_names;\n\n  } T1_CMapStdRec;\n\n\n  FT_CALLBACK_TABLE const FT_CMap_ClassRec\n  t1_cmap_standard_class_rec;\n\n  FT_CALLBACK_TABLE const FT_CMap_ClassRec\n  t1_cmap_expert_class_rec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  TYPE1 CUSTOM ENCODING CMAP                   *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef struct T1_CMapCustomRec_*  T1_CMapCustom;\n\n  typedef struct  T1_CMapCustomRec_\n  {\n    FT_CMapRec  cmap;\n    FT_UInt     first;\n    FT_UInt     count;\n    FT_UShort*  indices;\n\n  } T1_CMapCustomRec;\n\n\n  FT_CALLBACK_TABLE const FT_CMap_ClassRec\n  t1_cmap_custom_class_rec;\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****             TYPE1 SYNTHETIC UNICODE ENCODING CMAP             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* unicode (synthetic) cmaps */\n\n  FT_CALLBACK_TABLE const FT_CMap_ClassRec\n  t1_cmap_unicode_class_rec;\n\n /* */\n\n\nFT_END_HEADER\n\n#endif /* __T1CMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/t1decode.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1decode.c                                                             */\n/*                                                                         */\n/*    PostScript Type 1 decoding routines (body).                          */\n/*                                                                         */\n/*  Copyright 2000-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n#include FT_OUTLINE_H\n\n#include \"t1decode.h\"\n#include \"psobjs.h\"\n\n#include \"psauxerr.h\"\n\n/* ensure proper sign extension */\n#define Fix2Int( f )  ( (FT_Int)(FT_Short)( (f) >> 16 ) )\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1decode\n\n\n  typedef enum  T1_Operator_\n  {\n    op_none = 0,\n    op_endchar,\n    op_hsbw,\n    op_seac,\n    op_sbw,\n    op_closepath,\n    op_hlineto,\n    op_hmoveto,\n    op_hvcurveto,\n    op_rlineto,\n    op_rmoveto,\n    op_rrcurveto,\n    op_vhcurveto,\n    op_vlineto,\n    op_vmoveto,\n    op_dotsection,\n    op_hstem,\n    op_hstem3,\n    op_vstem,\n    op_vstem3,\n    op_div,\n    op_callothersubr,\n    op_callsubr,\n    op_pop,\n    op_return,\n    op_setcurrentpoint,\n    op_unknown15,\n\n    op_max    /* never remove this one */\n\n  } T1_Operator;\n\n\n  static\n  const FT_Int  t1_args_count[op_max] =\n  {\n    0, /* none */\n    0, /* endchar */\n    2, /* hsbw */\n    5, /* seac */\n    4, /* sbw */\n    0, /* closepath */\n    1, /* hlineto */\n    1, /* hmoveto */\n    4, /* hvcurveto */\n    2, /* rlineto */\n    2, /* rmoveto */\n    6, /* rrcurveto */\n    4, /* vhcurveto */\n    1, /* vlineto */\n    1, /* vmoveto */\n    0, /* dotsection */\n    2, /* hstem */\n    6, /* hstem3 */\n    2, /* vstem */\n    6, /* vstem3 */\n    2, /* div */\n   -1, /* callothersubr */\n    1, /* callsubr */\n    0, /* pop */\n    0, /* return */\n    2, /* setcurrentpoint */\n    2  /* opcode 15 (undocumented and obsolete) */\n  };\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1_lookup_glyph_by_stdcharcode                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Looks up a given glyph by its StandardEncoding charcode.  Used to  */\n  /*    implement the SEAC Type 1 operator.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: The current face object.                               */\n  /*                                                                       */\n  /*    charcode :: The character code to look for.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A glyph index in the font face.  Returns -1 if the corresponding   */\n  /*    glyph wasn't found.                                                */\n  /*                                                                       */\n  static FT_Int\n  t1_lookup_glyph_by_stdcharcode( T1_Decoder  decoder,\n                                  FT_Int      charcode )\n  {\n    FT_UInt             n;\n    const FT_String*    glyph_name;\n    FT_Service_PsCMaps  psnames = decoder->psnames;\n\n\n    /* check range of standard char code */\n    if ( charcode < 0 || charcode > 255 )\n      return -1;\n\n    glyph_name = psnames->adobe_std_strings(\n                   psnames->adobe_std_encoding[charcode]);\n\n    for ( n = 0; n < decoder->num_glyphs; n++ )\n    {\n      FT_String*  name = (FT_String*)decoder->glyph_names[n];\n\n\n      if ( name                               &&\n           name[0] == glyph_name[0]           &&\n           ft_strcmp( name, glyph_name ) == 0 )\n        return n;\n    }\n\n    return -1;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1operator_seac                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Implements the `seac' Type 1 operator for a Type 1 decoder.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    decoder :: The current CID decoder.                                */\n  /*                                                                       */\n  /*    asb     :: The accent's side bearing.                              */\n  /*                                                                       */\n  /*    adx     :: The horizontal offset of the accent.                    */\n  /*                                                                       */\n  /*    ady     :: The vertical offset of the accent.                      */\n  /*                                                                       */\n  /*    bchar   :: The base character's StandardEncoding charcode.         */\n  /*                                                                       */\n  /*    achar   :: The accent character's StandardEncoding charcode.       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  t1operator_seac( T1_Decoder  decoder,\n                   FT_Pos      asb,\n                   FT_Pos      adx,\n                   FT_Pos      ady,\n                   FT_Int      bchar,\n                   FT_Int      achar )\n  {\n    FT_Error     error;\n    FT_Int       bchar_index, achar_index;\n#if 0\n    FT_Int       n_base_points;\n    FT_Outline*  base = decoder->builder.base;\n#endif\n    FT_Vector    left_bearing, advance;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    T1_Face      face  = (T1_Face)decoder->builder.face;\n#endif\n\n\n    if ( decoder->seac )\n    {\n      FT_ERROR(( \"t1operator_seac: invalid nested seac\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    if ( decoder->builder.metrics_only )\n    {\n      FT_ERROR(( \"t1operator_seac: unexpected seac\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    /* seac weirdness */\n    adx += decoder->builder.left_bearing.x;\n\n    /* `glyph_names' is set to 0 for CID fonts which do not */\n    /* include an encoding.  How can we deal with these?    */\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( decoder->glyph_names == 0                   &&\n         !face->root.internal->incremental_interface )\n#else\n    if ( decoder->glyph_names == 0 )\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n    {\n      FT_ERROR(( \"t1operator_seac:\"\n                 \" glyph names table not available in this font\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( face->root.internal->incremental_interface )\n    {\n      /* the caller must handle the font encoding also */\n      bchar_index = bchar;\n      achar_index = achar;\n    }\n    else\n#endif\n    {\n      bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar );\n      achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar );\n    }\n\n    if ( bchar_index < 0 || achar_index < 0 )\n    {\n      FT_ERROR(( \"t1operator_seac:\"\n                 \" invalid seac character code arguments\\n\" ));\n      return FT_THROW( Syntax_Error );\n    }\n\n    /* if we are trying to load a composite glyph, do not load the */\n    /* accent character and return the array of subglyphs.         */\n    if ( decoder->builder.no_recurse )\n    {\n      FT_GlyphSlot    glyph  = (FT_GlyphSlot)decoder->builder.glyph;\n      FT_GlyphLoader  loader = glyph->internal->loader;\n      FT_SubGlyph     subg;\n\n\n      /* reallocate subglyph array if necessary */\n      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );\n      if ( error )\n        goto Exit;\n\n      subg = loader->current.subglyphs;\n\n      /* subglyph 0 = base character */\n      subg->index = bchar_index;\n      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |\n                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;\n      subg->arg1  = 0;\n      subg->arg2  = 0;\n      subg++;\n\n      /* subglyph 1 = accent character */\n      subg->index = achar_index;\n      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;\n      subg->arg1  = (FT_Int)FIXED_TO_INT( adx - asb );\n      subg->arg2  = (FT_Int)FIXED_TO_INT( ady );\n\n      /* set up remaining glyph fields */\n      glyph->num_subglyphs = 2;\n      glyph->subglyphs     = loader->base.subglyphs;\n      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;\n\n      loader->current.num_subglyphs = 2;\n      goto Exit;\n    }\n\n    /* First load `bchar' in builder */\n    /* now load the unscaled outline */\n\n    FT_GlyphLoader_Prepare( decoder->builder.loader );  /* prepare loader */\n\n    /* the seac operator must not be nested */\n    decoder->seac = TRUE;\n    error = t1_decoder_parse_glyph( decoder, bchar_index );\n    decoder->seac = FALSE;\n    if ( error )\n      goto Exit;\n\n    /* save the left bearing and width of the base character */\n    /* as they will be erased by the next load.              */\n\n    left_bearing = decoder->builder.left_bearing;\n    advance      = decoder->builder.advance;\n\n    decoder->builder.left_bearing.x = 0;\n    decoder->builder.left_bearing.y = 0;\n\n    decoder->builder.pos_x = adx - asb;\n    decoder->builder.pos_y = ady;\n\n    /* Now load `achar' on top of */\n    /* the base outline           */\n\n    /* the seac operator must not be nested */\n    decoder->seac = TRUE;\n    error = t1_decoder_parse_glyph( decoder, achar_index );\n    decoder->seac = FALSE;\n    if ( error )\n      goto Exit;\n\n    /* restore the left side bearing and   */\n    /* advance width of the base character */\n\n    decoder->builder.left_bearing = left_bearing;\n    decoder->builder.advance      = advance;\n\n    decoder->builder.pos_x = 0;\n    decoder->builder.pos_y = 0;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    t1_decoder_parse_charstrings                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parses a given Type 1 charstrings program.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    decoder         :: The current Type 1 decoder.                     */\n  /*                                                                       */\n  /*    charstring_base :: The base address of the charstring stream.      */\n  /*                                                                       */\n  /*    charstring_len  :: The length in bytes of the charstring stream.   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  t1_decoder_parse_charstrings( T1_Decoder  decoder,\n                                FT_Byte*    charstring_base,\n                                FT_UInt     charstring_len )\n  {\n    FT_Error         error;\n    T1_Decoder_Zone  zone;\n    FT_Byte*         ip;\n    FT_Byte*         limit;\n    T1_Builder       builder = &decoder->builder;\n    FT_Pos           x, y, orig_x, orig_y;\n    FT_Int           known_othersubr_result_cnt   = 0;\n    FT_Int           unknown_othersubr_result_cnt = 0;\n    FT_Bool          large_int;\n    FT_Fixed         seed;\n\n    T1_Hints_Funcs   hinter;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    FT_Bool          bol = TRUE;\n#endif\n\n\n    /* compute random seed from stack address of parameter */\n    seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed              ^\n                         (FT_PtrDist)(char*)&decoder           ^\n                         (FT_PtrDist)(char*)&charstring_base ) &\n                         FT_ULONG_MAX ) ;\n    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;\n    if ( seed == 0 )\n      seed = 0x7384;\n\n    /* First of all, initialize the decoder */\n    decoder->top  = decoder->stack;\n    decoder->zone = decoder->zones;\n    zone          = decoder->zones;\n\n    builder->parse_state = T1_Parse_Start;\n\n    hinter = (T1_Hints_Funcs)builder->hints_funcs;\n\n    /* a font that reads BuildCharArray without setting */\n    /* its values first is buggy, but ...               */\n    FT_ASSERT( ( decoder->len_buildchar == 0 ) ==\n               ( decoder->buildchar == NULL )  );\n\n    if ( decoder->buildchar && decoder->len_buildchar > 0 )\n      ft_memset( &decoder->buildchar[0],\n                 0,\n                 sizeof ( decoder->buildchar[0] ) * decoder->len_buildchar );\n\n    FT_TRACE4(( \"\\n\"\n                \"Start charstring\\n\" ));\n\n    zone->base           = charstring_base;\n    limit = zone->limit  = charstring_base + charstring_len;\n    ip    = zone->cursor = zone->base;\n\n    error = FT_Err_Ok;\n\n    x = orig_x = builder->pos_x;\n    y = orig_y = builder->pos_y;\n\n    /* begin hints recording session, if any */\n    if ( hinter )\n      hinter->open( hinter->hints );\n\n    large_int = FALSE;\n\n    /* now, execute loop */\n    while ( ip < limit )\n    {\n      FT_Long*     top   = decoder->top;\n      T1_Operator  op    = op_none;\n      FT_Int32     value = 0;\n\n\n      FT_ASSERT( known_othersubr_result_cnt == 0   ||\n                 unknown_othersubr_result_cnt == 0 );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n      if ( bol )\n      {\n        FT_TRACE5(( \" (%d)\", decoder->top - decoder->stack ));\n        bol = FALSE;\n      }\n#endif\n\n      /*********************************************************************/\n      /*                                                                   */\n      /* Decode operator or operand                                        */\n      /*                                                                   */\n      /*                                                                   */\n\n      /* first of all, decompress operator or value */\n      switch ( *ip++ )\n      {\n      case 1:\n        op = op_hstem;\n        break;\n\n      case 3:\n        op = op_vstem;\n        break;\n      case 4:\n        op = op_vmoveto;\n        break;\n      case 5:\n        op = op_rlineto;\n        break;\n      case 6:\n        op = op_hlineto;\n        break;\n      case 7:\n        op = op_vlineto;\n        break;\n      case 8:\n        op = op_rrcurveto;\n        break;\n      case 9:\n        op = op_closepath;\n        break;\n      case 10:\n        op = op_callsubr;\n        break;\n      case 11:\n        op = op_return;\n        break;\n\n      case 13:\n        op = op_hsbw;\n        break;\n      case 14:\n        op = op_endchar;\n        break;\n\n      case 15:          /* undocumented, obsolete operator */\n        op = op_unknown15;\n        break;\n\n      case 21:\n        op = op_rmoveto;\n        break;\n      case 22:\n        op = op_hmoveto;\n        break;\n\n      case 30:\n        op = op_vhcurveto;\n        break;\n      case 31:\n        op = op_hvcurveto;\n        break;\n\n      case 12:\n        if ( ip > limit )\n        {\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" invalid escape (12+EOF)\\n\" ));\n          goto Syntax_Error;\n        }\n\n        switch ( *ip++ )\n        {\n        case 0:\n          op = op_dotsection;\n          break;\n        case 1:\n          op = op_vstem3;\n          break;\n        case 2:\n          op = op_hstem3;\n          break;\n        case 6:\n          op = op_seac;\n          break;\n        case 7:\n          op = op_sbw;\n          break;\n        case 12:\n          op = op_div;\n          break;\n        case 16:\n          op = op_callothersubr;\n          break;\n        case 17:\n          op = op_pop;\n          break;\n        case 33:\n          op = op_setcurrentpoint;\n          break;\n\n        default:\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" invalid escape (12+%d)\\n\",\n                     ip[-1] ));\n          goto Syntax_Error;\n        }\n        break;\n\n      case 255:    /* four bytes integer */\n        if ( ip + 4 > limit )\n        {\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" unexpected EOF in integer\\n\" ));\n          goto Syntax_Error;\n        }\n\n        value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |\n                            ( (FT_UInt32)ip[1] << 16 ) |\n                            ( (FT_UInt32)ip[2] << 8  ) |\n                              (FT_UInt32)ip[3]         );\n        ip += 4;\n\n        /* According to the specification, values > 32000 or < -32000 must */\n        /* be followed by a `div' operator to make the result be in the    */\n        /* range [-32000;32000].  We expect that the second argument of    */\n        /* `div' is not a large number.  Additionally, we don't handle     */\n        /* stuff like `<large1> <large2> <num> div <num> div' or           */\n        /* <large1> <large2> <num> div div'.  This is probably not allowed */\n        /* anyway.                                                         */\n        if ( value > 32000 || value < -32000 )\n        {\n          if ( large_int )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" no `div' after large integer\\n\" ));\n          }\n          else\n            large_int = TRUE;\n        }\n        else\n        {\n          if ( !large_int )\n            value = (FT_Int32)( (FT_UInt32)value << 16 );\n        }\n\n        break;\n\n      default:\n        if ( ip[-1] >= 32 )\n        {\n          if ( ip[-1] < 247 )\n            value = (FT_Int32)ip[-1] - 139;\n          else\n          {\n            if ( ++ip > limit )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" unexpected EOF in integer\\n\" ));\n              goto Syntax_Error;\n            }\n\n            if ( ip[-2] < 251 )\n              value =    ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108;\n            else\n              value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 );\n          }\n\n          if ( !large_int )\n            value = (FT_Int32)( (FT_UInt32)value << 16 );\n        }\n        else\n        {\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" invalid byte (%d)\\n\", ip[-1] ));\n          goto Syntax_Error;\n        }\n      }\n\n      if ( unknown_othersubr_result_cnt > 0 )\n      {\n        switch ( op )\n        {\n        case op_callsubr:\n        case op_return:\n        case op_none:\n        case op_pop:\n          break;\n\n        default:\n          /* all operands have been transferred by previous pops */\n          unknown_othersubr_result_cnt = 0;\n          break;\n        }\n      }\n\n      if ( large_int && !( op == op_none || op == op_div ) )\n      {\n        FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                   \" no `div' after large integer\\n\" ));\n\n        large_int = FALSE;\n      }\n\n      /*********************************************************************/\n      /*                                                                   */\n      /*  Push value on stack, or process operator                         */\n      /*                                                                   */\n      /*                                                                   */\n      if ( op == op_none )\n      {\n        if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS )\n        {\n          FT_ERROR(( \"t1_decoder_parse_charstrings: stack overflow\\n\" ));\n          goto Syntax_Error;\n        }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        if ( large_int )\n          FT_TRACE4(( \" %ld\", value ));\n        else\n          FT_TRACE4(( \" %ld\", Fix2Int( value ) ));\n#endif\n\n        *top++       = value;\n        decoder->top = top;\n      }\n      else if ( op == op_callothersubr )  /* callothersubr */\n      {\n        FT_Int  subr_no;\n        FT_Int  arg_cnt;\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        FT_TRACE4(( \" callothersubr\\n\" ));\n        bol = TRUE;\n#endif\n\n        if ( top - decoder->stack < 2 )\n          goto Stack_Underflow;\n\n        top -= 2;\n\n        subr_no = Fix2Int( top[1] );\n        arg_cnt = Fix2Int( top[0] );\n\n        /***********************************************************/\n        /*                                                         */\n        /* remove all operands to callothersubr from the stack     */\n        /*                                                         */\n        /* for handled othersubrs, where we know the number of     */\n        /* arguments, we increase the stack by the value of        */\n        /* known_othersubr_result_cnt                              */\n        /*                                                         */\n        /* for unhandled othersubrs the following pops adjust the  */\n        /* stack pointer as necessary                              */\n\n        if ( arg_cnt > top - decoder->stack )\n          goto Stack_Underflow;\n\n        top -= arg_cnt;\n\n        known_othersubr_result_cnt   = 0;\n        unknown_othersubr_result_cnt = 0;\n\n        /* XXX TODO: The checks to `arg_count == <whatever>'       */\n        /* might not be correct; an othersubr expects a certain    */\n        /* number of operands on the PostScript stack (as opposed  */\n        /* to the T1 stack) but it doesn't have to put them there  */\n        /* by itself; previous othersubrs might have left the      */\n        /* operands there if they were not followed by an          */\n        /* appropriate number of pops                              */\n        /*                                                         */\n        /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */\n        /* accept a font that contains charstrings like            */\n        /*                                                         */\n        /*     100 200 2 20 callothersubr                          */\n        /*     300 1 20 callothersubr pop                          */\n        /*                                                         */\n        /* Perhaps this is the reason why BuildCharArray exists.   */\n\n        switch ( subr_no )\n        {\n        case 0:                     /* end flex feature */\n          if ( arg_cnt != 3 )\n            goto Unexpected_OtherSubr;\n\n          if ( decoder->flex_state       == 0 ||\n               decoder->num_flex_vectors != 7 )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" unexpected flex end\\n\" ));\n            goto Syntax_Error;\n          }\n\n          /* the two `results' are popped by the following setcurrentpoint */\n          top[0] = x;\n          top[1] = y;\n          known_othersubr_result_cnt = 2;\n          break;\n\n        case 1:                     /* start flex feature */\n          if ( arg_cnt != 0 )\n            goto Unexpected_OtherSubr;\n\n          decoder->flex_state        = 1;\n          decoder->num_flex_vectors  = 0;\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok                                   ||\n               ( error = t1_builder_check_points( builder, 6 ) )\n                 != FT_Err_Ok                                   )\n            goto Fail;\n          break;\n\n        case 2:                     /* add flex vectors */\n          {\n            FT_Int  idx;\n\n\n            if ( arg_cnt != 0 )\n              goto Unexpected_OtherSubr;\n\n            if ( decoder->flex_state == 0 )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" missing flex start\\n\" ));\n              goto Syntax_Error;\n            }\n\n            /* note that we should not add a point for index 0; */\n            /* this will move our current position to the flex  */\n            /* point without adding any point to the outline    */\n            idx = decoder->num_flex_vectors++;\n            if ( idx > 0 && idx < 7 )\n              t1_builder_add_point( builder,\n                                    x,\n                                    y,\n                                    (FT_Byte)( idx == 3 || idx == 6 ) );\n          }\n          break;\n\n        case 3:                     /* change hints */\n          if ( arg_cnt != 1 )\n            goto Unexpected_OtherSubr;\n\n          known_othersubr_result_cnt = 1;\n\n          if ( hinter )\n            hinter->reset( hinter->hints, builder->current->n_points );\n          break;\n\n        case 12:\n        case 13:\n          /* counter control hints, clear stack */\n          top = decoder->stack;\n          break;\n\n        case 14:\n        case 15:\n        case 16:\n        case 17:\n        case 18:                    /* multiple masters */\n          {\n            PS_Blend  blend = decoder->blend;\n            FT_UInt   num_points, nn, mm;\n            FT_Long*  delta;\n            FT_Long*  values;\n\n\n            if ( !blend )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" unexpected multiple masters operator\\n\" ));\n              goto Syntax_Error;\n            }\n\n            num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 );\n            if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" incorrect number of multiple masters arguments\\n\" ));\n              goto Syntax_Error;\n            }\n\n            /* We want to compute                                    */\n            /*                                                       */\n            /*   a0*w0 + a1*w1 + ... + ak*wk                         */\n            /*                                                       */\n            /* but we only have a0, a1-a0, a2-a0, ..., ak-a0.        */\n            /*                                                       */\n            /* However, given that w0 + w1 + ... + wk == 1, we can   */\n            /* rewrite it easily as                                  */\n            /*                                                       */\n            /*   a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk     */\n            /*                                                       */\n            /* where k == num_designs-1.                             */\n            /*                                                       */\n            /* I guess that's why it's written in this `compact'     */\n            /* form.                                                 */\n            /*                                                       */\n            delta  = top + num_points;\n            values = top;\n            for ( nn = 0; nn < num_points; nn++ )\n            {\n              FT_Long  tmp = values[0];\n\n\n              for ( mm = 1; mm < blend->num_designs; mm++ )\n                tmp += FT_MulFix( *delta++, blend->weight_vector[mm] );\n\n              *values++ = tmp;\n            }\n\n            known_othersubr_result_cnt = num_points;\n            break;\n          }\n\n        case 19:\n          /* <idx> 1 19 callothersubr                             */\n          /* => replace elements starting from index cvi( <idx> ) */\n          /*    of BuildCharArray with WeightVector               */\n          {\n            FT_Int    idx;\n            PS_Blend  blend = decoder->blend;\n\n\n            if ( arg_cnt != 1 || blend == NULL )\n              goto Unexpected_OtherSubr;\n\n            idx = Fix2Int( top[0] );\n\n            if ( idx < 0                                           ||\n                 idx + blend->num_designs > decoder->len_buildchar )\n              goto Unexpected_OtherSubr;\n\n            ft_memcpy( &decoder->buildchar[idx],\n                       blend->weight_vector,\n                       blend->num_designs *\n                         sizeof ( blend->weight_vector[0] ) );\n          }\n          break;\n\n        case 20:\n          /* <arg1> <arg2> 2 20 callothersubr pop   */\n          /* ==> push <arg1> + <arg2> onto T1 stack */\n          if ( arg_cnt != 2 )\n            goto Unexpected_OtherSubr;\n\n          top[0] += top[1]; /* XXX (over|under)flow */\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 21:\n          /* <arg1> <arg2> 2 21 callothersubr pop   */\n          /* ==> push <arg1> - <arg2> onto T1 stack */\n          if ( arg_cnt != 2 )\n            goto Unexpected_OtherSubr;\n\n          top[0] -= top[1]; /* XXX (over|under)flow */\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 22:\n          /* <arg1> <arg2> 2 22 callothersubr pop   */\n          /* ==> push <arg1> * <arg2> onto T1 stack */\n          if ( arg_cnt != 2 )\n            goto Unexpected_OtherSubr;\n\n          top[0] = FT_MulFix( top[0], top[1] );\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 23:\n          /* <arg1> <arg2> 2 23 callothersubr pop   */\n          /* ==> push <arg1> / <arg2> onto T1 stack */\n          if ( arg_cnt != 2 || top[1] == 0 )\n            goto Unexpected_OtherSubr;\n\n          top[0] = FT_DivFix( top[0], top[1] );\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 24:\n          /* <val> <idx> 2 24 callothersubr               */\n          /* ==> set BuildCharArray[cvi( <idx> )] = <val> */\n          {\n            FT_Int    idx;\n            PS_Blend  blend = decoder->blend;\n\n\n            if ( arg_cnt != 2 || blend == NULL )\n              goto Unexpected_OtherSubr;\n\n            idx = Fix2Int( top[1] );\n\n            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )\n              goto Unexpected_OtherSubr;\n\n            decoder->buildchar[idx] = top[0];\n          }\n          break;\n\n        case 25:\n          /* <idx> 1 25 callothersubr pop        */\n          /* ==> push BuildCharArray[cvi( idx )] */\n          /*     onto T1 stack                   */\n          {\n            FT_Int    idx;\n            PS_Blend  blend = decoder->blend;\n\n\n            if ( arg_cnt != 1 || blend == NULL )\n              goto Unexpected_OtherSubr;\n\n            idx = Fix2Int( top[0] );\n\n            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )\n              goto Unexpected_OtherSubr;\n\n            top[0] = decoder->buildchar[idx];\n          }\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n#if 0\n        case 26:\n          /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */\n          /*                      leave mark on T1 stack                    */\n          /* <val> <idx>      ==> set BuildCharArray[cvi( <idx> )] = <val>  */\n          XXX which routine has left its mark on the (PostScript) stack?;\n          break;\n#endif\n\n        case 27:\n          /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */\n          /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */\n          /*     otherwise push <res2>                          */\n          if ( arg_cnt != 4 )\n            goto Unexpected_OtherSubr;\n\n          if ( top[2] > top[3] )\n            top[0] = top[1];\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        case 28:\n          /* 0 28 callothersubr pop                               */\n          /* => push random value from interval [0, 1) onto stack */\n          if ( arg_cnt != 0 )\n            goto Unexpected_OtherSubr;\n\n          {\n            FT_Fixed  Rand;\n\n\n            Rand = seed;\n            if ( Rand >= 0x8000L )\n              Rand++;\n\n            top[0] = Rand;\n\n            seed = FT_MulFix( seed, 0x10000L - seed );\n            if ( seed == 0 )\n              seed += 0x2873;\n          }\n\n          known_othersubr_result_cnt = 1;\n          break;\n\n        default:\n          if ( arg_cnt >= 0 && subr_no >= 0 )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" unknown othersubr [%d %d], wish me luck\\n\",\n                       arg_cnt, subr_no ));\n            unknown_othersubr_result_cnt = arg_cnt;\n            break;\n          }\n          /* fall through */\n\n        Unexpected_OtherSubr:\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" invalid othersubr [%d %d]\\n\", arg_cnt, subr_no ));\n          goto Syntax_Error;\n        }\n\n        top += known_othersubr_result_cnt;\n\n        decoder->top = top;\n      }\n      else  /* general operator */\n      {\n        FT_Int  num_args = t1_args_count[op];\n\n\n        FT_ASSERT( num_args >= 0 );\n\n        if ( top - decoder->stack < num_args )\n          goto Stack_Underflow;\n\n        /* XXX Operators usually take their operands from the        */\n        /*     bottom of the stack, i.e., the operands are           */\n        /*     decoder->stack[0], ..., decoder->stack[num_args - 1]; */\n        /*     only div, callsubr, and callothersubr are different.  */\n        /*     In practice it doesn't matter (?).                    */\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n        switch ( op )\n        {\n        case op_callsubr:\n        case op_div:\n        case op_callothersubr:\n        case op_pop:\n        case op_return:\n          break;\n\n        default:\n          if ( top - decoder->stack != num_args )\n            FT_TRACE0(( \"t1_decoder_parse_charstrings:\"\n                        \" too much operands on the stack\"\n                        \" (seen %d, expected %d)\\n\",\n                        top - decoder->stack, num_args ));\n            break;\n        }\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n        top -= num_args;\n\n        switch ( op )\n        {\n        case op_endchar:\n          FT_TRACE4(( \" endchar\\n\" ));\n\n          t1_builder_close_contour( builder );\n\n          /* close hints recording session */\n          if ( hinter )\n          {\n            if ( hinter->close( hinter->hints, builder->current->n_points ) )\n              goto Syntax_Error;\n\n            /* apply hints to the loaded glyph outline now */\n            hinter->apply( hinter->hints,\n                           builder->current,\n                           (PSH_Globals)builder->hints_globals,\n                           decoder->hint_mode );\n          }\n\n          /* add current outline to the glyph slot */\n          FT_GlyphLoader_Add( builder->loader );\n\n          /* the compiler should optimize away this empty loop but ... */\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n          if ( decoder->len_buildchar > 0 )\n          {\n            FT_UInt  i;\n\n\n            FT_TRACE4(( \"BuildCharArray = [ \" ));\n\n            for ( i = 0; i < decoder->len_buildchar; ++i )\n              FT_TRACE4(( \"%d \", decoder->buildchar[i] ));\n\n            FT_TRACE4(( \"]\\n\" ));\n          }\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n          FT_TRACE4(( \"\\n\" ));\n\n          /* return now! */\n          return FT_Err_Ok;\n\n        case op_hsbw:\n          FT_TRACE4(( \" hsbw\" ));\n\n          builder->parse_state = T1_Parse_Have_Width;\n\n          builder->left_bearing.x += top[0];\n          builder->advance.x       = top[1];\n          builder->advance.y       = 0;\n\n          orig_x = x = builder->pos_x + top[0];\n          orig_y = y = builder->pos_y;\n\n          FT_UNUSED( orig_y );\n\n          /* the `metrics_only' indicates that we only want to compute */\n          /* the glyph's metrics (lsb + advance width), not load the   */\n          /* rest of it; so exit immediately                           */\n          if ( builder->metrics_only )\n            return FT_Err_Ok;\n\n          break;\n\n        case op_seac:\n          return t1operator_seac( decoder,\n                                  top[0],\n                                  top[1],\n                                  top[2],\n                                  Fix2Int( top[3] ),\n                                  Fix2Int( top[4] ) );\n\n        case op_sbw:\n          FT_TRACE4(( \" sbw\" ));\n\n          builder->parse_state = T1_Parse_Have_Width;\n\n          builder->left_bearing.x += top[0];\n          builder->left_bearing.y += top[1];\n          builder->advance.x       = top[2];\n          builder->advance.y       = top[3];\n\n          x = builder->pos_x + top[0];\n          y = builder->pos_y + top[1];\n\n          /* the `metrics_only' indicates that we only want to compute */\n          /* the glyph's metrics (lsb + advance width), not load the   */\n          /* rest of it; so exit immediately                           */\n          if ( builder->metrics_only )\n            return FT_Err_Ok;\n\n          break;\n\n        case op_closepath:\n          FT_TRACE4(( \" closepath\" ));\n\n          /* if there is no path, `closepath' is a no-op */\n          if ( builder->parse_state == T1_Parse_Have_Path   ||\n               builder->parse_state == T1_Parse_Have_Moveto )\n            t1_builder_close_contour( builder );\n\n          builder->parse_state = T1_Parse_Have_Width;\n          break;\n\n        case op_hlineto:\n          FT_TRACE4(( \" hlineto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok )\n            goto Fail;\n\n          x += top[0];\n          goto Add_Line;\n\n        case op_hmoveto:\n          FT_TRACE4(( \" hmoveto\" ));\n\n          x += top[0];\n          if ( !decoder->flex_state )\n          {\n            if ( builder->parse_state == T1_Parse_Start )\n              goto Syntax_Error;\n            builder->parse_state = T1_Parse_Have_Moveto;\n          }\n          break;\n\n        case op_hvcurveto:\n          FT_TRACE4(( \" hvcurveto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok                                   ||\n               ( error = t1_builder_check_points( builder, 3 ) )\n                 != FT_Err_Ok                                   )\n            goto Fail;\n\n          x += top[0];\n          t1_builder_add_point( builder, x, y, 0 );\n          x += top[1];\n          y += top[2];\n          t1_builder_add_point( builder, x, y, 0 );\n          y += top[3];\n          t1_builder_add_point( builder, x, y, 1 );\n          break;\n\n        case op_rlineto:\n          FT_TRACE4(( \" rlineto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok )\n            goto Fail;\n\n          x += top[0];\n          y += top[1];\n\n        Add_Line:\n          if ( ( error = t1_builder_add_point1( builder, x, y ) )\n                 != FT_Err_Ok )\n            goto Fail;\n          break;\n\n        case op_rmoveto:\n          FT_TRACE4(( \" rmoveto\" ));\n\n          x += top[0];\n          y += top[1];\n          if ( !decoder->flex_state )\n          {\n            if ( builder->parse_state == T1_Parse_Start )\n              goto Syntax_Error;\n            builder->parse_state = T1_Parse_Have_Moveto;\n          }\n          break;\n\n        case op_rrcurveto:\n          FT_TRACE4(( \" rrcurveto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok                                   ||\n               ( error = t1_builder_check_points( builder, 3 ) )\n                 != FT_Err_Ok                                   )\n            goto Fail;\n\n          x += top[0];\n          y += top[1];\n          t1_builder_add_point( builder, x, y, 0 );\n\n          x += top[2];\n          y += top[3];\n          t1_builder_add_point( builder, x, y, 0 );\n\n          x += top[4];\n          y += top[5];\n          t1_builder_add_point( builder, x, y, 1 );\n          break;\n\n        case op_vhcurveto:\n          FT_TRACE4(( \" vhcurveto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok                                   ||\n               ( error = t1_builder_check_points( builder, 3 ) )\n                 != FT_Err_Ok                                   )\n            goto Fail;\n\n          y += top[0];\n          t1_builder_add_point( builder, x, y, 0 );\n          x += top[1];\n          y += top[2];\n          t1_builder_add_point( builder, x, y, 0 );\n          x += top[3];\n          t1_builder_add_point( builder, x, y, 1 );\n          break;\n\n        case op_vlineto:\n          FT_TRACE4(( \" vlineto\" ));\n\n          if ( ( error = t1_builder_start_point( builder, x, y ) )\n                 != FT_Err_Ok )\n            goto Fail;\n\n          y += top[0];\n          goto Add_Line;\n\n        case op_vmoveto:\n          FT_TRACE4(( \" vmoveto\" ));\n\n          y += top[0];\n          if ( !decoder->flex_state )\n          {\n            if ( builder->parse_state == T1_Parse_Start )\n              goto Syntax_Error;\n            builder->parse_state = T1_Parse_Have_Moveto;\n          }\n          break;\n\n        case op_div:\n          FT_TRACE4(( \" div\" ));\n\n          /* if `large_int' is set, we divide unscaled numbers; */\n          /* otherwise, we divide numbers in 16.16 format --    */\n          /* in both cases, it is the same operation            */\n          *top = FT_DivFix( top[0], top[1] );\n          ++top;\n\n          large_int = FALSE;\n          break;\n\n        case op_callsubr:\n          {\n            FT_Int  idx;\n\n\n            FT_TRACE4(( \" callsubr\" ));\n\n            idx = Fix2Int( top[0] );\n            if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" invalid subrs index\\n\" ));\n              goto Syntax_Error;\n            }\n\n            if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" too many nested subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            zone->cursor = ip;  /* save current instruction pointer */\n\n            zone++;\n\n            /* The Type 1 driver stores subroutines without the seed bytes. */\n            /* The CID driver stores subroutines with seed bytes.  This     */\n            /* case is taken care of when decoder->subrs_len == 0.          */\n            zone->base = decoder->subrs[idx];\n\n            if ( decoder->subrs_len )\n              zone->limit = zone->base + decoder->subrs_len[idx];\n            else\n            {\n              /* We are using subroutines from a CID font.  We must adjust */\n              /* for the seed bytes.                                       */\n              zone->base  += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );\n              zone->limit  = decoder->subrs[idx + 1];\n            }\n\n            zone->cursor = zone->base;\n\n            if ( !zone->base )\n            {\n              FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                         \" invoking empty subrs\\n\" ));\n              goto Syntax_Error;\n            }\n\n            decoder->zone = zone;\n            ip            = zone->base;\n            limit         = zone->limit;\n            break;\n          }\n\n        case op_pop:\n          FT_TRACE4(( \" pop\" ));\n\n          if ( known_othersubr_result_cnt > 0 )\n          {\n            known_othersubr_result_cnt--;\n            /* ignore, we pushed the operands ourselves */\n            break;\n          }\n\n          if ( unknown_othersubr_result_cnt == 0 )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" no more operands for othersubr\\n\" ));\n            goto Syntax_Error;\n          }\n\n          unknown_othersubr_result_cnt--;\n          top++;   /* `push' the operand to callothersubr onto the stack */\n          break;\n\n        case op_return:\n          FT_TRACE4(( \" return\" ));\n\n          if ( zone <= decoder->zones )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" unexpected return\\n\" ));\n            goto Syntax_Error;\n          }\n\n          zone--;\n          ip            = zone->cursor;\n          limit         = zone->limit;\n          decoder->zone = zone;\n          break;\n\n        case op_dotsection:\n          FT_TRACE4(( \" dotsection\" ));\n\n          break;\n\n        case op_hstem:\n          FT_TRACE4(( \" hstem\" ));\n\n          /* record horizontal hint */\n          if ( hinter )\n          {\n            /* top[0] += builder->left_bearing.y; */\n            hinter->stem( hinter->hints, 1, top );\n          }\n          break;\n\n        case op_hstem3:\n          FT_TRACE4(( \" hstem3\" ));\n\n          /* record horizontal counter-controlled hints */\n          if ( hinter )\n            hinter->stem3( hinter->hints, 1, top );\n          break;\n\n        case op_vstem:\n          FT_TRACE4(( \" vstem\" ));\n\n          /* record vertical hint */\n          if ( hinter )\n          {\n            top[0] += orig_x;\n            hinter->stem( hinter->hints, 0, top );\n          }\n          break;\n\n        case op_vstem3:\n          FT_TRACE4(( \" vstem3\" ));\n\n          /* record vertical counter-controlled hints */\n          if ( hinter )\n          {\n            FT_Pos  dx = orig_x;\n\n\n            top[0] += dx;\n            top[2] += dx;\n            top[4] += dx;\n            hinter->stem3( hinter->hints, 0, top );\n          }\n          break;\n\n        case op_setcurrentpoint:\n          FT_TRACE4(( \" setcurrentpoint\" ));\n\n          /* From the T1 specification, section 6.4:                */\n          /*                                                        */\n          /*   The setcurrentpoint command is used only in          */\n          /*   conjunction with results from OtherSubrs procedures. */\n\n          /* known_othersubr_result_cnt != 0 is already handled     */\n          /* above.                                                 */\n\n          /* Note, however, that both Ghostscript and Adobe         */\n          /* Distiller handle this situation by silently ignoring   */\n          /* the inappropriate `setcurrentpoint' instruction.  So   */\n          /* we do the same.                                        */\n#if 0\n\n          if ( decoder->flex_state != 1 )\n          {\n            FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                       \" unexpected `setcurrentpoint'\\n\" ));\n            goto Syntax_Error;\n          }\n          else\n            ...\n#endif\n\n          x = top[0];\n          y = top[1];\n          decoder->flex_state = 0;\n          break;\n\n        case op_unknown15:\n          FT_TRACE4(( \" opcode_15\" ));\n          /* nothing to do except to pop the two arguments */\n          break;\n\n        default:\n          FT_ERROR(( \"t1_decoder_parse_charstrings:\"\n                     \" unhandled opcode %d\\n\", op ));\n          goto Syntax_Error;\n        }\n\n        /* XXX Operators usually clear the operand stack;  */\n        /*     only div, callsubr, callothersubr, pop, and */\n        /*     return are different.                       */\n        /*     In practice it doesn't matter (?).          */\n\n        decoder->top = top;\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n        FT_TRACE4(( \"\\n\" ));\n        bol = TRUE;\n#endif\n\n      } /* general operator processing */\n\n    } /* while ip < limit */\n\n    FT_TRACE4(( \"..end..\\n\\n\" ));\n\n  Fail:\n    return error;\n\n  Syntax_Error:\n    return FT_THROW( Syntax_Error );\n\n  Stack_Underflow:\n    return FT_THROW( Stack_Underflow );\n  }\n\n\n  /* parse a single Type 1 glyph */\n  FT_LOCAL_DEF( FT_Error )\n  t1_decoder_parse_glyph( T1_Decoder  decoder,\n                          FT_UInt     glyph )\n  {\n    return decoder->parse_callback( decoder, glyph );\n  }\n\n\n  /* initialize T1 decoder */\n  FT_LOCAL_DEF( FT_Error )\n  t1_decoder_init( T1_Decoder           decoder,\n                   FT_Face              face,\n                   FT_Size              size,\n                   FT_GlyphSlot         slot,\n                   FT_Byte**            glyph_names,\n                   PS_Blend             blend,\n                   FT_Bool              hinting,\n                   FT_Render_Mode       hint_mode,\n                   T1_Decoder_Callback  parse_callback )\n  {\n    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );\n\n    /* retrieve PSNames interface from list of current modules */\n    {\n      FT_Service_PsCMaps  psnames = 0;\n\n\n      FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );\n      if ( !psnames )\n      {\n        FT_ERROR(( \"t1_decoder_init:\"\n                   \" the `psnames' module is not available\\n\" ));\n        return FT_THROW( Unimplemented_Feature );\n      }\n\n      decoder->psnames = psnames;\n    }\n\n    t1_builder_init( &decoder->builder, face, size, slot, hinting );\n\n    /* decoder->buildchar and decoder->len_buildchar have to be  */\n    /* initialized by the caller since we cannot know the length */\n    /* of the BuildCharArray                                     */\n\n    decoder->num_glyphs     = (FT_UInt)face->num_glyphs;\n    decoder->glyph_names    = glyph_names;\n    decoder->hint_mode      = hint_mode;\n    decoder->blend          = blend;\n    decoder->parse_callback = parse_callback;\n\n    decoder->funcs          = t1_decoder_funcs;\n\n    return FT_Err_Ok;\n  }\n\n\n  /* finalize T1 decoder */\n  FT_LOCAL_DEF( void )\n  t1_decoder_done( T1_Decoder  decoder )\n  {\n    t1_builder_done( &decoder->builder );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psaux/t1decode.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1decode.h                                                             */\n/*                                                                         */\n/*    PostScript Type 1 decoding routines (specification).                 */\n/*                                                                         */\n/*  Copyright 2000-2001, 2002, 2003 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1DECODE_H__\n#define __T1DECODE_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_CALLBACK_TABLE\n  const T1_Decoder_FuncsRec  t1_decoder_funcs;\n\n\n  FT_LOCAL( FT_Error )\n  t1_decoder_parse_glyph( T1_Decoder  decoder,\n                          FT_UInt     glyph_index );\n\n  FT_LOCAL( FT_Error )\n  t1_decoder_parse_charstrings( T1_Decoder  decoder,\n                                FT_Byte*    base,\n                                FT_UInt     len );\n\n  FT_LOCAL( FT_Error )\n  t1_decoder_init( T1_Decoder           decoder,\n                   FT_Face              face,\n                   FT_Size              size,\n                   FT_GlyphSlot         slot,\n                   FT_Byte**            glyph_names,\n                   PS_Blend             blend,\n                   FT_Bool              hinting,\n                   FT_Render_Mode       hint_mode,\n                   T1_Decoder_Callback  parse_glyph );\n\n  FT_LOCAL( void )\n  t1_decoder_done( T1_Decoder  decoder );\n\n\nFT_END_HEADER\n\n#endif /* __T1DECODE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/Jamfile",
    "content": "# FreeType 2 src/pshinter Jamfile\n#\n# Copyright 2001, 2003 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) pshinter ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = pshrec pshglob pshalgo pshmod pshpic ;\n  }\n  else\n  {\n    _sources = pshinter ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/pshinter Jamfile\n"
  },
  {
    "path": "libs/freetype/src/pshinter/module.mk",
    "content": "#\n# FreeType 2 PSHinter module definition\n#\n\n\n# Copyright 1996-2001, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += PSHINTER_MODULE\n\ndefine PSHINTER_MODULE\n$(OPEN_DRIVER) FT_Module_Class, pshinter_module_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)pshinter  $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshalgo.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshalgo.c                                                              */\n/*                                                                         */\n/*    PostScript hinting algorithm (body).                                 */\n/*                                                                         */\n/*  Copyright 2001-2010, 2012, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_CALC_H\n#include \"pshalgo.h\"\n\n#include \"pshnterr.h\"\n\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pshalgo2\n\n\n#ifdef DEBUG_HINTER\n  PSH_Hint_Table  ps_debug_hint_table = 0;\n  PSH_HintFunc    ps_debug_hint_func  = 0;\n  PSH_Glyph       ps_debug_glyph      = 0;\n#endif\n\n\n#define  COMPUTE_INFLEXS  /* compute inflection points to optimize `S' */\n                          /* and similar glyphs                        */\n#define  STRONGER         /* slightly increase the contrast of smooth  */\n                          /* hinting                                   */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                  BASIC HINTS RECORDINGS                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* return true if two stem hints overlap */\n  static FT_Int\n  psh_hint_overlap( PSH_Hint  hint1,\n                    PSH_Hint  hint2 )\n  {\n    return hint1->org_pos + hint1->org_len >= hint2->org_pos &&\n           hint2->org_pos + hint2->org_len >= hint1->org_pos;\n  }\n\n\n  /* destroy hints table */\n  static void\n  psh_hint_table_done( PSH_Hint_Table  table,\n                       FT_Memory       memory )\n  {\n    FT_FREE( table->zones );\n    table->num_zones = 0;\n    table->zone      = 0;\n\n    FT_FREE( table->sort );\n    FT_FREE( table->hints );\n    table->num_hints   = 0;\n    table->max_hints   = 0;\n    table->sort_global = 0;\n  }\n\n\n  /* deactivate all hints in a table */\n  static void\n  psh_hint_table_deactivate( PSH_Hint_Table  table )\n  {\n    FT_UInt   count = table->max_hints;\n    PSH_Hint  hint  = table->hints;\n\n\n    for ( ; count > 0; count--, hint++ )\n    {\n      psh_hint_deactivate( hint );\n      hint->order = -1;\n    }\n  }\n\n\n  /* internal function to record a new hint */\n  static void\n  psh_hint_table_record( PSH_Hint_Table  table,\n                         FT_UInt         idx )\n  {\n    PSH_Hint  hint = table->hints + idx;\n\n\n    if ( idx >= table->max_hints )\n    {\n      FT_TRACE0(( \"psh_hint_table_record: invalid hint index %d\\n\", idx ));\n      return;\n    }\n\n    /* ignore active hints */\n    if ( psh_hint_is_active( hint ) )\n      return;\n\n    psh_hint_activate( hint );\n\n    /* now scan the current active hint set to check */\n    /* whether `hint' overlaps with another hint     */\n    {\n      PSH_Hint*  sorted = table->sort_global;\n      FT_UInt    count  = table->num_hints;\n      PSH_Hint   hint2;\n\n\n      hint->parent = 0;\n      for ( ; count > 0; count--, sorted++ )\n      {\n        hint2 = sorted[0];\n\n        if ( psh_hint_overlap( hint, hint2 ) )\n        {\n          hint->parent = hint2;\n          break;\n        }\n      }\n    }\n\n    if ( table->num_hints < table->max_hints )\n      table->sort_global[table->num_hints++] = hint;\n    else\n      FT_TRACE0(( \"psh_hint_table_record: too many sorted hints!  BUG!\\n\" ));\n  }\n\n\n  static void\n  psh_hint_table_record_mask( PSH_Hint_Table  table,\n                              PS_Mask         hint_mask )\n  {\n    FT_Int    mask = 0, val = 0;\n    FT_Byte*  cursor = hint_mask->bytes;\n    FT_UInt   idx, limit;\n\n\n    limit = hint_mask->num_bits;\n\n    for ( idx = 0; idx < limit; idx++ )\n    {\n      if ( mask == 0 )\n      {\n        val  = *cursor++;\n        mask = 0x80;\n      }\n\n      if ( val & mask )\n        psh_hint_table_record( table, idx );\n\n      mask >>= 1;\n    }\n  }\n\n\n  /* create hints table */\n  static FT_Error\n  psh_hint_table_init( PSH_Hint_Table  table,\n                       PS_Hint_Table   hints,\n                       PS_Mask_Table   hint_masks,\n                       PS_Mask_Table   counter_masks,\n                       FT_Memory       memory )\n  {\n    FT_UInt   count;\n    FT_Error  error;\n\n    FT_UNUSED( counter_masks );\n\n\n    count = hints->num_hints;\n\n    /* allocate our tables */\n    if ( FT_NEW_ARRAY( table->sort,  2 * count     ) ||\n         FT_NEW_ARRAY( table->hints,     count     ) ||\n         FT_NEW_ARRAY( table->zones, 2 * count + 1 ) )\n      goto Exit;\n\n    table->max_hints   = count;\n    table->sort_global = table->sort + count;\n    table->num_hints   = 0;\n    table->num_zones   = 0;\n    table->zone        = 0;\n\n    /* initialize the `table->hints' array */\n    {\n      PSH_Hint  write = table->hints;\n      PS_Hint   read  = hints->hints;\n\n\n      for ( ; count > 0; count--, write++, read++ )\n      {\n        write->org_pos = read->pos;\n        write->org_len = read->len;\n        write->flags   = read->flags;\n      }\n    }\n\n    /* we now need to determine the initial `parent' stems; first  */\n    /* activate the hints that are given by the initial hint masks */\n    if ( hint_masks )\n    {\n      PS_Mask  mask = hint_masks->masks;\n\n\n      count             = hint_masks->num_masks;\n      table->hint_masks = hint_masks;\n\n      for ( ; count > 0; count--, mask++ )\n        psh_hint_table_record_mask( table, mask );\n    }\n\n    /* finally, do a linear parse in case some hints were left alone */\n    if ( table->num_hints != table->max_hints )\n    {\n      FT_UInt  idx;\n\n\n      FT_TRACE0(( \"psh_hint_table_init: missing/incorrect hint masks\\n\" ));\n\n      count = table->max_hints;\n      for ( idx = 0; idx < count; idx++ )\n        psh_hint_table_record( table, idx );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  psh_hint_table_activate_mask( PSH_Hint_Table  table,\n                                PS_Mask         hint_mask )\n  {\n    FT_Int    mask = 0, val = 0;\n    FT_Byte*  cursor = hint_mask->bytes;\n    FT_UInt   idx, limit, count;\n\n\n    limit = hint_mask->num_bits;\n    count = 0;\n\n    psh_hint_table_deactivate( table );\n\n    for ( idx = 0; idx < limit; idx++ )\n    {\n      if ( mask == 0 )\n      {\n        val  = *cursor++;\n        mask = 0x80;\n      }\n\n      if ( val & mask )\n      {\n        PSH_Hint  hint = &table->hints[idx];\n\n\n        if ( !psh_hint_is_active( hint ) )\n        {\n          FT_UInt     count2;\n\n#if 0\n          PSH_Hint*  sort = table->sort;\n          PSH_Hint   hint2;\n\n\n          for ( count2 = count; count2 > 0; count2--, sort++ )\n          {\n            hint2 = sort[0];\n            if ( psh_hint_overlap( hint, hint2 ) )\n              FT_TRACE0(( \"psh_hint_table_activate_mask:\"\n                          \" found overlapping hints\\n\" ))\n          }\n#else\n          count2 = 0;\n#endif\n\n          if ( count2 == 0 )\n          {\n            psh_hint_activate( hint );\n            if ( count < table->max_hints )\n              table->sort[count++] = hint;\n            else\n              FT_TRACE0(( \"psh_hint_tableactivate_mask:\"\n                          \" too many active hints\\n\" ));\n          }\n        }\n      }\n\n      mask >>= 1;\n    }\n    table->num_hints = count;\n\n    /* now, sort the hints; they are guaranteed to not overlap */\n    /* so we can compare their \"org_pos\" field directly        */\n    {\n      FT_Int     i1, i2;\n      PSH_Hint   hint1, hint2;\n      PSH_Hint*  sort = table->sort;\n\n\n      /* a simple bubble sort will do, since in 99% of cases, the hints */\n      /* will be already sorted -- and the sort will be linear          */\n      for ( i1 = 1; i1 < (FT_Int)count; i1++ )\n      {\n        hint1 = sort[i1];\n        for ( i2 = i1 - 1; i2 >= 0; i2-- )\n        {\n          hint2 = sort[i2];\n\n          if ( hint2->org_pos < hint1->org_pos )\n            break;\n\n          sort[i2 + 1] = hint2;\n          sort[i2]     = hint1;\n        }\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               HINTS GRID-FITTING AND OPTIMIZATION             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#if 1\n  static FT_Pos\n  psh_dimension_quantize_len( PSH_Dimension  dim,\n                              FT_Pos         len,\n                              FT_Bool        do_snapping )\n  {\n    if ( len <= 64 )\n      len = 64;\n    else\n    {\n      FT_Pos  delta = len - dim->stdw.widths[0].cur;\n\n\n      if ( delta < 0 )\n        delta = -delta;\n\n      if ( delta < 40 )\n      {\n        len = dim->stdw.widths[0].cur;\n        if ( len < 48 )\n          len = 48;\n      }\n\n      if ( len < 3 * 64 )\n      {\n        delta = ( len & 63 );\n        len  &= -64;\n\n        if ( delta < 10 )\n          len += delta;\n\n        else if ( delta < 32 )\n          len += 10;\n\n        else if ( delta < 54 )\n          len += 54;\n\n        else\n          len += delta;\n      }\n      else\n        len = FT_PIX_ROUND( len );\n    }\n\n    if ( do_snapping )\n      len = FT_PIX_ROUND( len );\n\n    return  len;\n  }\n#endif /* 0 */\n\n\n#ifdef DEBUG_HINTER\n\n  static void\n  ps_simple_scale( PSH_Hint_Table  table,\n                   FT_Fixed        scale,\n                   FT_Fixed        delta,\n                   FT_Int          dimension )\n  {\n    PSH_Hint  hint;\n    FT_UInt   count;\n\n\n    for ( count = 0; count < table->max_hints; count++ )\n    {\n      hint = table->hints + count;\n\n      hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta;\n      hint->cur_len = FT_MulFix( hint->org_len, scale );\n\n      if ( ps_debug_hint_func )\n        ps_debug_hint_func( hint, dimension );\n    }\n  }\n\n#endif /* DEBUG_HINTER */\n\n\n  static FT_Fixed\n  psh_hint_snap_stem_side_delta( FT_Fixed  pos,\n                                 FT_Fixed  len )\n  {\n    FT_Fixed  delta1 = FT_PIX_ROUND( pos ) - pos;\n    FT_Fixed  delta2 = FT_PIX_ROUND( pos + len ) - pos - len;\n\n\n    if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) )\n      return delta1;\n    else\n      return delta2;\n  }\n\n\n  static void\n  psh_hint_align( PSH_Hint     hint,\n                  PSH_Globals  globals,\n                  FT_Int       dimension,\n                  PSH_Glyph    glyph )\n  {\n    PSH_Dimension  dim   = &globals->dimension[dimension];\n    FT_Fixed       scale = dim->scale_mult;\n    FT_Fixed       delta = dim->scale_delta;\n\n\n    if ( !psh_hint_is_fitted( hint ) )\n    {\n      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;\n      FT_Pos  len = FT_MulFix( hint->org_len, scale );\n\n      FT_Int            do_snapping;\n      FT_Pos            fit_len;\n      PSH_AlignmentRec  align;\n\n\n      /* ignore stem alignments when requested through the hint flags */\n      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||\n           ( dimension == 1 && !glyph->do_vert_hints ) )\n      {\n        hint->cur_pos = pos;\n        hint->cur_len = len;\n\n        psh_hint_set_fitted( hint );\n        return;\n      }\n\n      /* perform stem snapping when requested - this is necessary\n       * for monochrome and LCD hinting modes only\n       */\n      do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) ||\n                    ( dimension == 1 && glyph->do_vert_snapping );\n\n      hint->cur_len = fit_len = len;\n\n      /* check blue zones for horizontal stems */\n      align.align     = PSH_BLUE_ALIGN_NONE;\n      align.align_bot = align.align_top = 0;\n\n      if ( dimension == 1 )\n        psh_blues_snap_stem( &globals->blues,\n                             hint->org_pos + hint->org_len,\n                             hint->org_pos,\n                             &align );\n\n      switch ( align.align )\n      {\n      case PSH_BLUE_ALIGN_TOP:\n        /* the top of the stem is aligned against a blue zone */\n        hint->cur_pos = align.align_top - fit_len;\n        break;\n\n      case PSH_BLUE_ALIGN_BOT:\n        /* the bottom of the stem is aligned against a blue zone */\n        hint->cur_pos = align.align_bot;\n        break;\n\n      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:\n        /* both edges of the stem are aligned against blue zones */\n        hint->cur_pos = align.align_bot;\n        hint->cur_len = align.align_top - align.align_bot;\n        break;\n\n      default:\n        {\n          PSH_Hint  parent = hint->parent;\n\n\n          if ( parent )\n          {\n            FT_Pos  par_org_center, par_cur_center;\n            FT_Pos  cur_org_center, cur_delta;\n\n\n            /* ensure that parent is already fitted */\n            if ( !psh_hint_is_fitted( parent ) )\n              psh_hint_align( parent, globals, dimension, glyph );\n\n            /* keep original relation between hints, this is, use the */\n            /* scaled distance between the centers of the hints to    */\n            /* compute the new position                               */\n            par_org_center = parent->org_pos + ( parent->org_len >> 1 );\n            par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 );\n            cur_org_center = hint->org_pos   + ( hint->org_len   >> 1 );\n\n            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );\n            pos       = par_cur_center + cur_delta - ( len >> 1 );\n          }\n\n          hint->cur_pos = pos;\n          hint->cur_len = fit_len;\n\n          /* Stem adjustment tries to snap stem widths to standard\n           * ones.  This is important to prevent unpleasant rounding\n           * artefacts.\n           */\n          if ( glyph->do_stem_adjust )\n          {\n            if ( len <= 64 )\n            {\n              /* the stem is less than one pixel; we will center it\n               * around the nearest pixel center\n               */\n              if ( len >= 32 )\n              {\n                /* This is a special case where we also widen the stem\n                 * and align it to the pixel grid.\n                 *\n                 *   stem_center          = pos + (len/2)\n                 *   nearest_pixel_center = FT_ROUND(stem_center-32)+32\n                 *   new_pos              = nearest_pixel_center-32\n                 *                        = FT_ROUND(stem_center-32)\n                 *                        = FT_FLOOR(stem_center-32+32)\n                 *                        = FT_FLOOR(stem_center)\n                 *   new_len              = 64\n                 */\n                pos = FT_PIX_FLOOR( pos + ( len >> 1 ) );\n                len = 64;\n              }\n              else if ( len > 0 )\n              {\n                /* This is a very small stem; we simply align it to the\n                 * pixel grid, trying to find the minimum displacement.\n                 *\n                 * left               = pos\n                 * right              = pos + len\n                 * left_nearest_edge  = ROUND(pos)\n                 * right_nearest_edge = ROUND(right)\n                 *\n                 * if ( ABS(left_nearest_edge - left) <=\n                 *      ABS(right_nearest_edge - right) )\n                 *    new_pos = left\n                 * else\n                 *    new_pos = right\n                 */\n                FT_Pos  left_nearest  = FT_PIX_ROUND( pos );\n                FT_Pos  right_nearest = FT_PIX_ROUND( pos + len );\n                FT_Pos  left_disp     = left_nearest - pos;\n                FT_Pos  right_disp    = right_nearest - ( pos + len );\n\n\n                if ( left_disp < 0 )\n                  left_disp = -left_disp;\n                if ( right_disp < 0 )\n                  right_disp = -right_disp;\n                if ( left_disp <= right_disp )\n                  pos = left_nearest;\n                else\n                  pos = right_nearest;\n              }\n              else\n              {\n                /* this is a ghost stem; we simply round it */\n                pos = FT_PIX_ROUND( pos );\n              }\n            }\n            else\n            {\n              len = psh_dimension_quantize_len( dim, len, 0 );\n            }\n          }\n\n          /* now that we have a good hinted stem width, try to position */\n          /* the stem along a pixel grid integer coordinate             */\n          hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len );\n          hint->cur_len = len;\n        }\n      }\n\n      if ( do_snapping )\n      {\n        pos = hint->cur_pos;\n        len = hint->cur_len;\n\n        if ( len < 64 )\n          len = 64;\n        else\n          len = FT_PIX_ROUND( len );\n\n        switch ( align.align )\n        {\n          case PSH_BLUE_ALIGN_TOP:\n            hint->cur_pos = align.align_top - len;\n            hint->cur_len = len;\n            break;\n\n          case PSH_BLUE_ALIGN_BOT:\n            hint->cur_len = len;\n            break;\n\n          case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP:\n            /* don't touch */\n            break;\n\n\n          default:\n            hint->cur_len = len;\n            if ( len & 64 )\n              pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32;\n            else\n              pos = FT_PIX_ROUND( pos + ( len >> 1 ) );\n\n            hint->cur_pos = pos - ( len >> 1 );\n            hint->cur_len = len;\n        }\n      }\n\n      psh_hint_set_fitted( hint );\n\n#ifdef DEBUG_HINTER\n      if ( ps_debug_hint_func )\n        ps_debug_hint_func( hint, dimension );\n#endif\n    }\n  }\n\n\n#if 0  /* not used for now, experimental */\n\n /*\n  *  A variant to perform \"light\" hinting (i.e. FT_RENDER_MODE_LIGHT)\n  *  of stems\n  */\n  static void\n  psh_hint_align_light( PSH_Hint     hint,\n                        PSH_Globals  globals,\n                        FT_Int       dimension,\n                        PSH_Glyph    glyph )\n  {\n    PSH_Dimension  dim   = &globals->dimension[dimension];\n    FT_Fixed       scale = dim->scale_mult;\n    FT_Fixed       delta = dim->scale_delta;\n\n\n    if ( !psh_hint_is_fitted( hint ) )\n    {\n      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;\n      FT_Pos  len = FT_MulFix( hint->org_len, scale );\n\n      FT_Pos  fit_len;\n\n      PSH_AlignmentRec  align;\n\n\n      /* ignore stem alignments when requested through the hint flags */\n      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||\n           ( dimension == 1 && !glyph->do_vert_hints ) )\n      {\n        hint->cur_pos = pos;\n        hint->cur_len = len;\n\n        psh_hint_set_fitted( hint );\n        return;\n      }\n\n      fit_len = len;\n\n      hint->cur_len = fit_len;\n\n      /* check blue zones for horizontal stems */\n      align.align = PSH_BLUE_ALIGN_NONE;\n      align.align_bot = align.align_top = 0;\n\n      if ( dimension == 1 )\n        psh_blues_snap_stem( &globals->blues,\n                             hint->org_pos + hint->org_len,\n                             hint->org_pos,\n                             &align );\n\n      switch ( align.align )\n      {\n      case PSH_BLUE_ALIGN_TOP:\n        /* the top of the stem is aligned against a blue zone */\n        hint->cur_pos = align.align_top - fit_len;\n        break;\n\n      case PSH_BLUE_ALIGN_BOT:\n        /* the bottom of the stem is aligned against a blue zone */\n        hint->cur_pos = align.align_bot;\n        break;\n\n      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:\n        /* both edges of the stem are aligned against blue zones */\n        hint->cur_pos = align.align_bot;\n        hint->cur_len = align.align_top - align.align_bot;\n        break;\n\n      default:\n        {\n          PSH_Hint  parent = hint->parent;\n\n\n          if ( parent )\n          {\n            FT_Pos  par_org_center, par_cur_center;\n            FT_Pos  cur_org_center, cur_delta;\n\n\n            /* ensure that parent is already fitted */\n            if ( !psh_hint_is_fitted( parent ) )\n              psh_hint_align_light( parent, globals, dimension, glyph );\n\n            par_org_center = parent->org_pos + ( parent->org_len / 2 );\n            par_cur_center = parent->cur_pos + ( parent->cur_len / 2 );\n            cur_org_center = hint->org_pos   + ( hint->org_len   / 2 );\n\n            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );\n            pos       = par_cur_center + cur_delta - ( len >> 1 );\n          }\n\n          /* Stems less than one pixel wide are easy -- we want to\n           * make them as dark as possible, so they must fall within\n           * one pixel.  If the stem is split between two pixels\n           * then snap the edge that is nearer to the pixel boundary\n           * to the pixel boundary.\n           */\n          if ( len <= 64 )\n          {\n            if ( ( pos + len + 63 ) / 64  != pos / 64 + 1 )\n              pos += psh_hint_snap_stem_side_delta ( pos, len );\n          }\n\n          /* Position stems other to minimize the amount of mid-grays.\n           * There are, in general, two positions that do this,\n           * illustrated as A) and B) below.\n           *\n           *   +                   +                   +                   +\n           *\n           * A)             |--------------------------------|\n           * B)   |--------------------------------|\n           * C)       |--------------------------------|\n           *\n           * Position A) (split the excess stem equally) should be better\n           * for stems of width N + f where f < 0.5.\n           *\n           * Position B) (split the deficiency equally) should be better\n           * for stems of width N + f where f > 0.5.\n           *\n           * It turns out though that minimizing the total number of lit\n           * pixels is also important, so position C), with one edge\n           * aligned with a pixel boundary is actually preferable\n           * to A).  There are also more possibile positions for C) than\n           * for A) or B), so it involves less distortion of the overall\n           * character shape.\n           */\n          else /* len > 64 */\n          {\n            FT_Fixed  frac_len = len & 63;\n            FT_Fixed  center = pos + ( len >> 1 );\n            FT_Fixed  delta_a, delta_b;\n\n\n            if ( ( len / 64 ) & 1 )\n            {\n              delta_a = FT_PIX_FLOOR( center ) + 32 - center;\n              delta_b = FT_PIX_ROUND( center ) - center;\n            }\n            else\n            {\n              delta_a = FT_PIX_ROUND( center ) - center;\n              delta_b = FT_PIX_FLOOR( center ) + 32 - center;\n            }\n\n            /* We choose between B) and C) above based on the amount\n             * of fractinal stem width; for small amounts, choose\n             * C) always, for large amounts, B) always, and inbetween,\n             * pick whichever one involves less stem movement.\n             */\n            if ( frac_len < 32 )\n            {\n              pos += psh_hint_snap_stem_side_delta ( pos, len );\n            }\n            else if ( frac_len < 48 )\n            {\n              FT_Fixed  side_delta = psh_hint_snap_stem_side_delta ( pos,\n                                                                     len );\n\n              if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) )\n                pos += side_delta;\n              else\n                pos += delta_b;\n            }\n            else\n            {\n              pos += delta_b;\n            }\n          }\n\n          hint->cur_pos = pos;\n        }\n      }  /* switch */\n\n      psh_hint_set_fitted( hint );\n\n#ifdef DEBUG_HINTER\n      if ( ps_debug_hint_func )\n        ps_debug_hint_func( hint, dimension );\n#endif\n    }\n  }\n\n#endif /* 0 */\n\n\n  static void\n  psh_hint_table_align_hints( PSH_Hint_Table  table,\n                              PSH_Globals     globals,\n                              FT_Int          dimension,\n                              PSH_Glyph       glyph )\n  {\n    PSH_Hint       hint;\n    FT_UInt        count;\n\n#ifdef DEBUG_HINTER\n\n    PSH_Dimension  dim   = &globals->dimension[dimension];\n    FT_Fixed       scale = dim->scale_mult;\n    FT_Fixed       delta = dim->scale_delta;\n\n\n    if ( ps_debug_no_vert_hints && dimension == 0 )\n    {\n      ps_simple_scale( table, scale, delta, dimension );\n      return;\n    }\n\n    if ( ps_debug_no_horz_hints && dimension == 1 )\n    {\n      ps_simple_scale( table, scale, delta, dimension );\n      return;\n    }\n\n#endif /* DEBUG_HINTER*/\n\n    hint  = table->hints;\n    count = table->max_hints;\n\n    for ( ; count > 0; count--, hint++ )\n      psh_hint_align( hint, globals, dimension, glyph );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                POINTS INTERPOLATION ROUTINES                  *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#define PSH_ZONE_MIN  -3200000L\n#define PSH_ZONE_MAX  +3200000L\n\n#define xxDEBUG_ZONES\n\n\n#ifdef DEBUG_ZONES\n\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\n  static void\n  psh_print_zone( PSH_Zone  zone )\n  {\n    printf( \"zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\\n\",\n             zone->scale / 65536.0,\n             zone->delta / 64.0,\n             zone->min,\n             zone->max );\n  }\n\n#else\n\n#define psh_print_zone( x )  do { } while ( 0 )\n\n#endif /* DEBUG_ZONES */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    HINTER GLYPH MANAGEMENT                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#if 1\n\n#define  psh_corner_is_flat      ft_corner_is_flat\n#define  psh_corner_orientation  ft_corner_orientation\n\n#else\n\n  FT_LOCAL_DEF( FT_Int )\n  psh_corner_is_flat( FT_Pos  x_in,\n                      FT_Pos  y_in,\n                      FT_Pos  x_out,\n                      FT_Pos  y_out )\n  {\n    FT_Pos  ax = x_in;\n    FT_Pos  ay = y_in;\n\n    FT_Pos  d_in, d_out, d_corner;\n\n\n    if ( ax < 0 )\n      ax = -ax;\n    if ( ay < 0 )\n      ay = -ay;\n    d_in = ax + ay;\n\n    ax = x_out;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = y_out;\n    if ( ay < 0 )\n      ay = -ay;\n    d_out = ax + ay;\n\n    ax = x_out + x_in;\n    if ( ax < 0 )\n      ax = -ax;\n    ay = y_out + y_in;\n    if ( ay < 0 )\n      ay = -ay;\n    d_corner = ax + ay;\n\n    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );\n  }\n\n  static FT_Int\n  psh_corner_orientation( FT_Pos  in_x,\n                          FT_Pos  in_y,\n                          FT_Pos  out_x,\n                          FT_Pos  out_y )\n  {\n    FT_Int  result;\n\n\n    /* deal with the trivial cases quickly */\n    if ( in_y == 0 )\n    {\n      if ( in_x >= 0 )\n        result = out_y;\n      else\n        result = -out_y;\n    }\n    else if ( in_x == 0 )\n    {\n      if ( in_y >= 0 )\n        result = -out_x;\n      else\n        result = out_x;\n    }\n    else if ( out_y == 0 )\n    {\n      if ( out_x >= 0 )\n        result = in_y;\n      else\n        result = -in_y;\n    }\n    else if ( out_x == 0 )\n    {\n      if ( out_y >= 0 )\n        result = -in_x;\n      else\n        result =  in_x;\n    }\n    else /* general case */\n    {\n      long long  delta = (long long)in_x * out_y - (long long)in_y * out_x;\n\n      if ( delta == 0 )\n        result = 0;\n      else\n        result = 1 - 2 * ( delta < 0 );\n    }\n\n    return result;\n  }\n\n#endif /* !1 */\n\n\n#ifdef COMPUTE_INFLEXS\n\n  /* compute all inflex points in a given glyph */\n  static void\n  psh_glyph_compute_inflections( PSH_Glyph  glyph )\n  {\n    FT_UInt  n;\n\n\n    for ( n = 0; n < glyph->num_contours; n++ )\n    {\n      PSH_Point  first, start, end, before, after;\n      FT_Pos     in_x, in_y, out_x, out_y;\n      FT_Int     orient_prev, orient_cur;\n      FT_Int     finished = 0;\n\n\n      /* we need at least 4 points to create an inflection point */\n      if ( glyph->contours[n].count < 4 )\n        continue;\n\n      /* compute first segment in contour */\n      first = glyph->contours[n].start;\n\n      start = end = first;\n      do\n      {\n        end = end->next;\n        if ( end == first )\n          goto Skip;\n\n        in_x = end->org_u - start->org_u;\n        in_y = end->org_v - start->org_v;\n\n      } while ( in_x == 0 && in_y == 0 );\n\n      /* extend the segment start whenever possible */\n      before = start;\n      do\n      {\n        do\n        {\n          start  = before;\n          before = before->prev;\n          if ( before == first )\n            goto Skip;\n\n          out_x = start->org_u - before->org_u;\n          out_y = start->org_v - before->org_v;\n\n        } while ( out_x == 0 && out_y == 0 );\n\n        orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y );\n\n      } while ( orient_prev == 0 );\n\n      first = start;\n      in_x  = out_x;\n      in_y  = out_y;\n\n      /* now, process all segments in the contour */\n      do\n      {\n        /* first, extend current segment's end whenever possible */\n        after = end;\n        do\n        {\n          do\n          {\n            end   = after;\n            after = after->next;\n            if ( after == first )\n              finished = 1;\n\n            out_x = after->org_u - end->org_u;\n            out_y = after->org_v - end->org_v;\n\n          } while ( out_x == 0 && out_y == 0 );\n\n          orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y );\n\n        } while ( orient_cur == 0 );\n\n        if ( ( orient_cur ^ orient_prev ) < 0 )\n        {\n          do\n          {\n            psh_point_set_inflex( start );\n            start = start->next;\n          }\n          while ( start != end );\n\n          psh_point_set_inflex( start );\n        }\n\n        start       = end;\n        end         = after;\n        orient_prev = orient_cur;\n        in_x        = out_x;\n        in_y        = out_y;\n\n      } while ( !finished );\n\n    Skip:\n      ;\n    }\n  }\n\n#endif /* COMPUTE_INFLEXS */\n\n\n  static void\n  psh_glyph_done( PSH_Glyph  glyph )\n  {\n    FT_Memory  memory = glyph->memory;\n\n\n    psh_hint_table_done( &glyph->hint_tables[1], memory );\n    psh_hint_table_done( &glyph->hint_tables[0], memory );\n\n    FT_FREE( glyph->points );\n    FT_FREE( glyph->contours );\n\n    glyph->num_points   = 0;\n    glyph->num_contours = 0;\n\n    glyph->memory = 0;\n  }\n\n\n  static int\n  psh_compute_dir( FT_Pos  dx,\n                   FT_Pos  dy )\n  {\n    FT_Pos  ax, ay;\n    int     result = PSH_DIR_NONE;\n\n\n    ax = FT_ABS( dx );\n    ay = FT_ABS( dy );\n\n    if ( ay * 12 < ax )\n    {\n      /* |dy| <<< |dx|  means a near-horizontal segment */\n      result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT;\n    }\n    else if ( ax * 12 < ay )\n    {\n      /* |dx| <<< |dy|  means a near-vertical segment */\n      result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN;\n    }\n\n    return result;\n  }\n\n\n  /* load outline point coordinates into hinter glyph */\n  static void\n  psh_glyph_load_points( PSH_Glyph  glyph,\n                         FT_Int     dimension )\n  {\n    FT_Vector*  vec   = glyph->outline->points;\n    PSH_Point   point = glyph->points;\n    FT_UInt     count = glyph->num_points;\n\n\n    for ( ; count > 0; count--, point++, vec++ )\n    {\n      point->flags2 = 0;\n      point->hint   = NULL;\n      if ( dimension == 0 )\n      {\n        point->org_u = vec->x;\n        point->org_v = vec->y;\n      }\n      else\n      {\n        point->org_u = vec->y;\n        point->org_v = vec->x;\n      }\n\n#ifdef DEBUG_HINTER\n      point->org_x = vec->x;\n      point->org_y = vec->y;\n#endif\n\n    }\n  }\n\n\n  /* save hinted point coordinates back to outline */\n  static void\n  psh_glyph_save_points( PSH_Glyph  glyph,\n                         FT_Int     dimension )\n  {\n    FT_UInt     n;\n    PSH_Point   point = glyph->points;\n    FT_Vector*  vec   = glyph->outline->points;\n    char*       tags  = glyph->outline->tags;\n\n\n    for ( n = 0; n < glyph->num_points; n++ )\n    {\n      if ( dimension == 0 )\n        vec[n].x = point->cur_u;\n      else\n        vec[n].y = point->cur_u;\n\n      if ( psh_point_is_strong( point ) )\n        tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 );\n\n#ifdef DEBUG_HINTER\n\n      if ( dimension == 0 )\n      {\n        point->cur_x   = point->cur_u;\n        point->flags_x = point->flags2 | point->flags;\n      }\n      else\n      {\n        point->cur_y   = point->cur_u;\n        point->flags_y = point->flags2 | point->flags;\n      }\n\n#endif\n\n      point++;\n    }\n  }\n\n\n  static FT_Error\n  psh_glyph_init( PSH_Glyph    glyph,\n                  FT_Outline*  outline,\n                  PS_Hints     ps_hints,\n                  PSH_Globals  globals )\n  {\n    FT_Error   error;\n    FT_Memory  memory;\n\n\n    /* clear all fields */\n    FT_MEM_ZERO( glyph, sizeof ( *glyph ) );\n\n    memory = glyph->memory = globals->memory;\n\n    /* allocate and setup points + contours arrays */\n    if ( FT_NEW_ARRAY( glyph->points,   outline->n_points   ) ||\n         FT_NEW_ARRAY( glyph->contours, outline->n_contours ) )\n      goto Exit;\n\n    glyph->num_points   = outline->n_points;\n    glyph->num_contours = outline->n_contours;\n\n    {\n      FT_UInt      first = 0, next, n;\n      PSH_Point    points  = glyph->points;\n      PSH_Contour  contour = glyph->contours;\n\n\n      for ( n = 0; n < glyph->num_contours; n++ )\n      {\n        FT_Int     count;\n        PSH_Point  point;\n\n\n        next  = outline->contours[n] + 1;\n        count = next - first;\n\n        contour->start = points + first;\n        contour->count = (FT_UInt)count;\n\n        if ( count > 0 )\n        {\n          point = points + first;\n\n          point->prev    = points + next - 1;\n          point->contour = contour;\n\n          for ( ; count > 1; count-- )\n          {\n            point[0].next = point + 1;\n            point[1].prev = point;\n            point++;\n            point->contour = contour;\n          }\n          point->next = points + first;\n        }\n\n        contour++;\n        first = next;\n      }\n    }\n\n    {\n      PSH_Point   points = glyph->points;\n      PSH_Point   point  = points;\n      FT_Vector*  vec    = outline->points;\n      FT_UInt     n;\n\n\n      for ( n = 0; n < glyph->num_points; n++, point++ )\n      {\n        FT_Int  n_prev = (FT_Int)( point->prev - points );\n        FT_Int  n_next = (FT_Int)( point->next - points );\n        FT_Pos  dxi, dyi, dxo, dyo;\n\n\n        if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) )\n          point->flags = PSH_POINT_OFF;\n\n        dxi = vec[n].x - vec[n_prev].x;\n        dyi = vec[n].y - vec[n_prev].y;\n\n        point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi );\n\n        dxo = vec[n_next].x - vec[n].x;\n        dyo = vec[n_next].y - vec[n].y;\n\n        point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo );\n\n        /* detect smooth points */\n        if ( point->flags & PSH_POINT_OFF )\n          point->flags |= PSH_POINT_SMOOTH;\n\n        else if ( point->dir_in == point->dir_out )\n        {\n          if ( point->dir_out != PSH_DIR_NONE           ||\n               psh_corner_is_flat( dxi, dyi, dxo, dyo ) )\n            point->flags |= PSH_POINT_SMOOTH;\n        }\n      }\n    }\n\n    glyph->outline = outline;\n    glyph->globals = globals;\n\n#ifdef COMPUTE_INFLEXS\n    psh_glyph_load_points( glyph, 0 );\n    psh_glyph_compute_inflections( glyph );\n#endif /* COMPUTE_INFLEXS */\n\n    /* now deal with hints tables */\n    error = psh_hint_table_init( &glyph->hint_tables [0],\n                                 &ps_hints->dimension[0].hints,\n                                 &ps_hints->dimension[0].masks,\n                                 &ps_hints->dimension[0].counters,\n                                 memory );\n    if ( error )\n      goto Exit;\n\n    error = psh_hint_table_init( &glyph->hint_tables [1],\n                                 &ps_hints->dimension[1].hints,\n                                 &ps_hints->dimension[1].masks,\n                                 &ps_hints->dimension[1].counters,\n                                 memory );\n    if ( error )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  /* compute all extrema in a glyph for a given dimension */\n  static void\n  psh_glyph_compute_extrema( PSH_Glyph  glyph )\n  {\n    FT_UInt  n;\n\n\n    /* first of all, compute all local extrema */\n    for ( n = 0; n < glyph->num_contours; n++ )\n    {\n      PSH_Point  first = glyph->contours[n].start;\n      PSH_Point  point, before, after;\n\n\n      if ( glyph->contours[n].count == 0 )\n        continue;\n\n      point  = first;\n      before = point;\n      after  = point;\n\n      do\n      {\n        before = before->prev;\n        if ( before == first )\n          goto Skip;\n\n      } while ( before->org_u == point->org_u );\n\n      first = point = before->next;\n\n      for (;;)\n      {\n        after = point;\n        do\n        {\n          after = after->next;\n          if ( after == first )\n            goto Next;\n\n        } while ( after->org_u == point->org_u );\n\n        if ( before->org_u < point->org_u )\n        {\n          if ( after->org_u < point->org_u )\n          {\n            /* local maximum */\n            goto Extremum;\n          }\n        }\n        else /* before->org_u > point->org_u */\n        {\n          if ( after->org_u > point->org_u )\n          {\n            /* local minimum */\n          Extremum:\n            do\n            {\n              psh_point_set_extremum( point );\n              point = point->next;\n\n            } while ( point != after );\n          }\n        }\n\n        before = after->prev;\n        point  = after;\n\n      } /* for  */\n\n    Next:\n      ;\n    }\n\n    /* for each extremum, determine its direction along the */\n    /* orthogonal axis                                      */\n    for ( n = 0; n < glyph->num_points; n++ )\n    {\n      PSH_Point  point, before, after;\n\n\n      point  = &glyph->points[n];\n      before = point;\n      after  = point;\n\n      if ( psh_point_is_extremum( point ) )\n      {\n        do\n        {\n          before = before->prev;\n          if ( before == point )\n            goto Skip;\n\n        } while ( before->org_v == point->org_v );\n\n        do\n        {\n          after = after->next;\n          if ( after == point )\n            goto Skip;\n\n        } while ( after->org_v == point->org_v );\n      }\n\n      if ( before->org_v < point->org_v &&\n           after->org_v  > point->org_v )\n      {\n        psh_point_set_positive( point );\n      }\n      else if ( before->org_v > point->org_v &&\n                after->org_v  < point->org_v )\n      {\n        psh_point_set_negative( point );\n      }\n\n    Skip:\n      ;\n    }\n  }\n\n\n  /* major_dir is the direction for points on the bottom/left of the stem; */\n  /* Points on the top/right of the stem will have a direction of          */\n  /* -major_dir.                                                           */\n\n  static void\n  psh_hint_table_find_strong_points( PSH_Hint_Table  table,\n                                     PSH_Point       point,\n                                     FT_UInt         count,\n                                     FT_Int          threshold,\n                                     FT_Int          major_dir )\n  {\n    PSH_Hint*  sort      = table->sort;\n    FT_UInt    num_hints = table->num_hints;\n\n\n    for ( ; count > 0; count--, point++ )\n    {\n      FT_Int  point_dir = 0;\n      FT_Pos  org_u     = point->org_u;\n\n\n      if ( psh_point_is_strong( point ) )\n        continue;\n\n      if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) )\n        point_dir = point->dir_in;\n\n      else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) )\n        point_dir = point->dir_out;\n\n      if ( point_dir )\n      {\n        if ( point_dir == major_dir )\n        {\n          FT_UInt  nn;\n\n\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n            FT_Pos    d    = org_u - hint->org_pos;\n\n\n            if ( d < threshold && -d < threshold )\n            {\n              psh_point_set_strong( point );\n              point->flags2 |= PSH_POINT_EDGE_MIN;\n              point->hint    = hint;\n              break;\n            }\n          }\n        }\n        else if ( point_dir == -major_dir )\n        {\n          FT_UInt  nn;\n\n\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;\n\n\n            if ( d < threshold && -d < threshold )\n            {\n              psh_point_set_strong( point );\n              point->flags2 |= PSH_POINT_EDGE_MAX;\n              point->hint    = hint;\n              break;\n            }\n          }\n        }\n      }\n\n#if 1\n      else if ( psh_point_is_extremum( point ) )\n      {\n        /* treat extrema as special cases for stem edge alignment */\n        FT_UInt  nn, min_flag, max_flag;\n\n\n        if ( major_dir == PSH_DIR_HORIZONTAL )\n        {\n          min_flag = PSH_POINT_POSITIVE;\n          max_flag = PSH_POINT_NEGATIVE;\n        }\n        else\n        {\n          min_flag = PSH_POINT_NEGATIVE;\n          max_flag = PSH_POINT_POSITIVE;\n        }\n\n        if ( point->flags2 & min_flag )\n        {\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n            FT_Pos    d    = org_u - hint->org_pos;\n\n\n            if ( d < threshold && -d < threshold )\n            {\n              point->flags2 |= PSH_POINT_EDGE_MIN;\n              point->hint    = hint;\n              psh_point_set_strong( point );\n              break;\n            }\n          }\n        }\n        else if ( point->flags2 & max_flag )\n        {\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;\n\n\n            if ( d < threshold && -d < threshold )\n            {\n              point->flags2 |= PSH_POINT_EDGE_MAX;\n              point->hint    = hint;\n              psh_point_set_strong( point );\n              break;\n            }\n          }\n        }\n\n        if ( point->hint == NULL )\n        {\n          for ( nn = 0; nn < num_hints; nn++ )\n          {\n            PSH_Hint  hint = sort[nn];\n\n\n            if ( org_u >= hint->org_pos                 &&\n                org_u <= hint->org_pos + hint->org_len )\n            {\n              point->hint = hint;\n              break;\n            }\n          }\n        }\n      }\n\n#endif /* 1 */\n    }\n  }\n\n\n  /* the accepted shift for strong points in fractional pixels */\n#define PSH_STRONG_THRESHOLD  32\n\n  /* the maximum shift value in font units */\n#define PSH_STRONG_THRESHOLD_MAXIMUM  30\n\n\n  /* find strong points in a glyph */\n  static void\n  psh_glyph_find_strong_points( PSH_Glyph  glyph,\n                                FT_Int     dimension )\n  {\n    /* a point is `strong' if it is located on a stem edge and       */\n    /* has an `in' or `out' tangent parallel to the hint's direction */\n\n    PSH_Hint_Table  table     = &glyph->hint_tables[dimension];\n    PS_Mask         mask      = table->hint_masks->masks;\n    FT_UInt         num_masks = table->hint_masks->num_masks;\n    FT_UInt         first     = 0;\n    FT_Int          major_dir = dimension == 0 ? PSH_DIR_VERTICAL\n                                               : PSH_DIR_HORIZONTAL;\n    PSH_Dimension   dim       = &glyph->globals->dimension[dimension];\n    FT_Fixed        scale     = dim->scale_mult;\n    FT_Int          threshold;\n\n\n    threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale );\n    if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM )\n      threshold = PSH_STRONG_THRESHOLD_MAXIMUM;\n\n    /* process secondary hints to `selected' points */\n    if ( num_masks > 1 && glyph->num_points > 0 )\n    {\n      /* the `endchar' op can reduce the number of points */\n      first = mask->end_point > glyph->num_points\n                ? glyph->num_points\n                : mask->end_point;\n      mask++;\n      for ( ; num_masks > 1; num_masks--, mask++ )\n      {\n        FT_UInt  next;\n        FT_Int   count;\n\n\n        next  = mask->end_point > glyph->num_points\n                  ? glyph->num_points\n                  : mask->end_point;\n        count = next - first;\n        if ( count > 0 )\n        {\n          PSH_Point  point = glyph->points + first;\n\n\n          psh_hint_table_activate_mask( table, mask );\n\n          psh_hint_table_find_strong_points( table, point, count,\n                                             threshold, major_dir );\n        }\n        first = next;\n      }\n    }\n\n    /* process primary hints for all points */\n    if ( num_masks == 1 )\n    {\n      FT_UInt    count = glyph->num_points;\n      PSH_Point  point = glyph->points;\n\n\n      psh_hint_table_activate_mask( table, table->hint_masks->masks );\n\n      psh_hint_table_find_strong_points( table, point, count,\n                                         threshold, major_dir );\n    }\n\n    /* now, certain points may have been attached to a hint and */\n    /* not marked as strong; update their flags then            */\n    {\n      FT_UInt    count = glyph->num_points;\n      PSH_Point  point = glyph->points;\n\n\n      for ( ; count > 0; count--, point++ )\n        if ( point->hint && !psh_point_is_strong( point ) )\n          psh_point_set_strong( point );\n    }\n  }\n\n\n  /* find points in a glyph which are in a blue zone and have `in' or */\n  /* `out' tangents parallel to the horizontal axis                   */\n  static void\n  psh_glyph_find_blue_points( PSH_Blues  blues,\n                              PSH_Glyph  glyph )\n  {\n    PSH_Blue_Table  table;\n    PSH_Blue_Zone   zone;\n    FT_UInt         glyph_count = glyph->num_points;\n    FT_UInt         blue_count;\n    PSH_Point       point = glyph->points;\n\n\n    for ( ; glyph_count > 0; glyph_count--, point++ )\n    {\n      FT_Pos  y;\n\n\n      /* check tangents */\n      if ( !PSH_DIR_COMPARE( point->dir_in,  PSH_DIR_HORIZONTAL ) &&\n           !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) )\n        continue;\n\n      /* skip strong points */\n      if ( psh_point_is_strong( point ) )\n        continue;\n\n      y = point->org_u;\n\n      /* look up top zones */\n      table      = &blues->normal_top;\n      blue_count = table->count;\n      zone       = table->zones;\n\n      for ( ; blue_count > 0; blue_count--, zone++ )\n      {\n        FT_Pos  delta = y - zone->org_bottom;\n\n\n        if ( delta < -blues->blue_fuzz )\n          break;\n\n        if ( y <= zone->org_top + blues->blue_fuzz )\n          if ( blues->no_overshoots || delta <= blues->blue_threshold )\n          {\n            point->cur_u = zone->cur_bottom;\n            psh_point_set_strong( point );\n            psh_point_set_fitted( point );\n          }\n      }\n\n      /* look up bottom zones */\n      table      = &blues->normal_bottom;\n      blue_count = table->count;\n      zone       = table->zones + blue_count - 1;\n\n      for ( ; blue_count > 0; blue_count--, zone-- )\n      {\n        FT_Pos  delta = zone->org_top - y;\n\n\n        if ( delta < -blues->blue_fuzz )\n          break;\n\n        if ( y >= zone->org_bottom - blues->blue_fuzz )\n          if ( blues->no_overshoots || delta < blues->blue_threshold )\n          {\n            point->cur_u = zone->cur_top;\n            psh_point_set_strong( point );\n            psh_point_set_fitted( point );\n          }\n      }\n    }\n  }\n\n\n  /* interpolate strong points with the help of hinted coordinates */\n  static void\n  psh_glyph_interpolate_strong_points( PSH_Glyph  glyph,\n                                       FT_Int     dimension )\n  {\n    PSH_Dimension  dim   = &glyph->globals->dimension[dimension];\n    FT_Fixed       scale = dim->scale_mult;\n\n    FT_UInt        count = glyph->num_points;\n    PSH_Point      point = glyph->points;\n\n\n    for ( ; count > 0; count--, point++ )\n    {\n      PSH_Hint  hint = point->hint;\n\n\n      if ( hint )\n      {\n        FT_Pos  delta;\n\n\n        if ( psh_point_is_edge_min( point ) )\n          point->cur_u = hint->cur_pos;\n\n        else if ( psh_point_is_edge_max( point ) )\n          point->cur_u = hint->cur_pos + hint->cur_len;\n\n        else\n        {\n          delta = point->org_u - hint->org_pos;\n\n          if ( delta <= 0 )\n            point->cur_u = hint->cur_pos + FT_MulFix( delta, scale );\n\n          else if ( delta >= hint->org_len )\n            point->cur_u = hint->cur_pos + hint->cur_len +\n                             FT_MulFix( delta - hint->org_len, scale );\n\n          else /* hint->org_len > 0 */\n            point->cur_u = hint->cur_pos +\n                             FT_MulDiv( delta, hint->cur_len,\n                                        hint->org_len );\n        }\n        psh_point_set_fitted( point );\n      }\n    }\n  }\n\n\n#define  PSH_MAX_STRONG_INTERNAL  16\n\n  static void\n  psh_glyph_interpolate_normal_points( PSH_Glyph  glyph,\n                                       FT_Int     dimension )\n  {\n\n#if 1\n    /* first technique: a point is strong if it is a local extremum */\n\n    PSH_Dimension  dim    = &glyph->globals->dimension[dimension];\n    FT_Fixed       scale  = dim->scale_mult;\n    FT_Memory      memory = glyph->memory;\n\n    PSH_Point*     strongs     = NULL;\n    PSH_Point      strongs_0[PSH_MAX_STRONG_INTERNAL];\n    FT_UInt        num_strongs = 0;\n\n    PSH_Point      points = glyph->points;\n    PSH_Point      points_end = points + glyph->num_points;\n    PSH_Point      point;\n\n\n    /* first count the number of strong points */\n    for ( point = points; point < points_end; point++ )\n    {\n      if ( psh_point_is_strong( point ) )\n        num_strongs++;\n    }\n\n    if ( num_strongs == 0 )  /* nothing to do here */\n      return;\n\n    /* allocate an array to store a list of points, */\n    /* stored in increasing org_u order             */\n    if ( num_strongs <= PSH_MAX_STRONG_INTERNAL )\n      strongs = strongs_0;\n    else\n    {\n      FT_Error  error;\n\n\n      if ( FT_NEW_ARRAY( strongs, num_strongs ) )\n        return;\n    }\n\n    num_strongs = 0;\n    for ( point = points; point < points_end; point++ )\n    {\n      PSH_Point*  insert;\n\n\n      if ( !psh_point_is_strong( point ) )\n        continue;\n\n      for ( insert = strongs + num_strongs; insert > strongs; insert-- )\n      {\n        if ( insert[-1]->org_u <= point->org_u )\n          break;\n\n        insert[0] = insert[-1];\n      }\n      insert[0] = point;\n      num_strongs++;\n    }\n\n    /* now try to interpolate all normal points */\n    for ( point = points; point < points_end; point++ )\n    {\n      if ( psh_point_is_strong( point ) )\n        continue;\n\n      /* sometimes, some local extrema are smooth points */\n      if ( psh_point_is_smooth( point ) )\n      {\n        if ( point->dir_in == PSH_DIR_NONE   ||\n             point->dir_in != point->dir_out )\n          continue;\n\n        if ( !psh_point_is_extremum( point ) &&\n             !psh_point_is_inflex( point )   )\n          continue;\n\n        point->flags &= ~PSH_POINT_SMOOTH;\n      }\n\n      /* find best enclosing point coordinates then interpolate */\n      {\n        PSH_Point   before, after;\n        FT_UInt     nn;\n\n\n        for ( nn = 0; nn < num_strongs; nn++ )\n          if ( strongs[nn]->org_u > point->org_u )\n            break;\n\n        if ( nn == 0 )  /* point before the first strong point */\n        {\n          after = strongs[0];\n\n          point->cur_u = after->cur_u +\n                           FT_MulFix( point->org_u - after->org_u,\n                                      scale );\n        }\n        else\n        {\n          before = strongs[nn - 1];\n\n          for ( nn = num_strongs; nn > 0; nn-- )\n            if ( strongs[nn - 1]->org_u < point->org_u )\n              break;\n\n          if ( nn == num_strongs )  /* point is after last strong point */\n          {\n            before = strongs[nn - 1];\n\n            point->cur_u = before->cur_u +\n                             FT_MulFix( point->org_u - before->org_u,\n                                        scale );\n          }\n          else\n          {\n            FT_Pos  u;\n\n\n            after = strongs[nn];\n\n            /* now interpolate point between before and after */\n            u = point->org_u;\n\n            if ( u == before->org_u )\n              point->cur_u = before->cur_u;\n\n            else if ( u == after->org_u )\n              point->cur_u = after->cur_u;\n\n            else\n              point->cur_u = before->cur_u +\n                               FT_MulDiv( u - before->org_u,\n                                          after->cur_u - before->cur_u,\n                                          after->org_u - before->org_u );\n          }\n        }\n        psh_point_set_fitted( point );\n      }\n    }\n\n    if ( strongs != strongs_0 )\n      FT_FREE( strongs );\n\n#endif /* 1 */\n\n  }\n\n\n  /* interpolate other points */\n  static void\n  psh_glyph_interpolate_other_points( PSH_Glyph  glyph,\n                                      FT_Int     dimension )\n  {\n    PSH_Dimension  dim          = &glyph->globals->dimension[dimension];\n    FT_Fixed       scale        = dim->scale_mult;\n    FT_Fixed       delta        = dim->scale_delta;\n    PSH_Contour    contour      = glyph->contours;\n    FT_UInt        num_contours = glyph->num_contours;\n\n\n    for ( ; num_contours > 0; num_contours--, contour++ )\n    {\n      PSH_Point  start = contour->start;\n      PSH_Point  first, next, point;\n      FT_UInt    fit_count;\n\n\n      /* count the number of strong points in this contour */\n      next      = start + contour->count;\n      fit_count = 0;\n      first     = 0;\n\n      for ( point = start; point < next; point++ )\n        if ( psh_point_is_fitted( point ) )\n        {\n          if ( !first )\n            first = point;\n\n          fit_count++;\n        }\n\n      /* if there are less than 2 fitted points in the contour, we */\n      /* simply scale and eventually translate the contour points  */\n      if ( fit_count < 2 )\n      {\n        if ( fit_count == 1 )\n          delta = first->cur_u - FT_MulFix( first->org_u, scale );\n\n        for ( point = start; point < next; point++ )\n          if ( point != first )\n            point->cur_u = FT_MulFix( point->org_u, scale ) + delta;\n\n        goto Next_Contour;\n      }\n\n      /* there are more than 2 strong points in this contour; we */\n      /* need to interpolate weak points between them            */\n      start = first;\n      do\n      {\n        point = first;\n\n        /* skip consecutive fitted points */\n        for (;;)\n        {\n          next = first->next;\n          if ( next == start )\n            goto Next_Contour;\n\n          if ( !psh_point_is_fitted( next ) )\n            break;\n\n          first = next;\n        }\n\n        /* find next fitted point after unfitted one */\n        for (;;)\n        {\n          next = next->next;\n          if ( psh_point_is_fitted( next ) )\n            break;\n        }\n\n        /* now interpolate between them */\n        {\n          FT_Pos    org_a, org_ab, cur_a, cur_ab;\n          FT_Pos    org_c, org_ac, cur_c;\n          FT_Fixed  scale_ab;\n\n\n          if ( first->org_u <= next->org_u )\n          {\n            org_a  = first->org_u;\n            cur_a  = first->cur_u;\n            org_ab = next->org_u - org_a;\n            cur_ab = next->cur_u - cur_a;\n          }\n          else\n          {\n            org_a  = next->org_u;\n            cur_a  = next->cur_u;\n            org_ab = first->org_u - org_a;\n            cur_ab = first->cur_u - cur_a;\n          }\n\n          scale_ab = 0x10000L;\n          if ( org_ab > 0 )\n            scale_ab = FT_DivFix( cur_ab, org_ab );\n\n          point = first->next;\n          do\n          {\n            org_c  = point->org_u;\n            org_ac = org_c - org_a;\n\n            if ( org_ac <= 0 )\n            {\n              /* on the left of the interpolation zone */\n              cur_c = cur_a + FT_MulFix( org_ac, scale );\n            }\n            else if ( org_ac >= org_ab )\n            {\n              /* on the right on the interpolation zone */\n              cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale );\n            }\n            else\n            {\n              /* within the interpolation zone */\n              cur_c = cur_a + FT_MulFix( org_ac, scale_ab );\n            }\n\n            point->cur_u = cur_c;\n\n            point = point->next;\n\n          } while ( point != next );\n        }\n\n        /* keep going until all points in the contours have been processed */\n        first = next;\n\n      } while ( first != start );\n\n    Next_Contour:\n      ;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     HIGH-LEVEL INTERFACE                      *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  FT_Error\n  ps_hints_apply( PS_Hints        ps_hints,\n                  FT_Outline*     outline,\n                  PSH_Globals     globals,\n                  FT_Render_Mode  hint_mode )\n  {\n    PSH_GlyphRec  glyphrec;\n    PSH_Glyph     glyph = &glyphrec;\n    FT_Error      error;\n#ifdef DEBUG_HINTER\n    FT_Memory     memory;\n#endif\n    FT_Int        dimension;\n\n\n    /* something to do? */\n    if ( outline->n_points == 0 || outline->n_contours == 0 )\n      return FT_Err_Ok;\n\n#ifdef DEBUG_HINTER\n\n    memory = globals->memory;\n\n    if ( ps_debug_glyph )\n    {\n      psh_glyph_done( ps_debug_glyph );\n      FT_FREE( ps_debug_glyph );\n    }\n\n    if ( FT_NEW( glyph ) )\n      return error;\n\n    ps_debug_glyph = glyph;\n\n#endif /* DEBUG_HINTER */\n\n    error = psh_glyph_init( glyph, outline, ps_hints, globals );\n    if ( error )\n      goto Exit;\n\n    /* try to optimize the y_scale so that the top of non-capital letters\n     * is aligned on a pixel boundary whenever possible\n     */\n    {\n      PSH_Dimension  dim_x = &glyph->globals->dimension[0];\n      PSH_Dimension  dim_y = &glyph->globals->dimension[1];\n\n      FT_Fixed  x_scale = dim_x->scale_mult;\n      FT_Fixed  y_scale = dim_y->scale_mult;\n\n      FT_Fixed  old_x_scale = x_scale;\n      FT_Fixed  old_y_scale = y_scale;\n\n      FT_Fixed  scaled;\n      FT_Fixed  fitted;\n\n      FT_Bool  rescale = FALSE;\n\n\n      scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale );\n      fitted = FT_PIX_ROUND( scaled );\n\n      if ( fitted != 0 && scaled != fitted )\n      {\n        rescale = TRUE;\n\n        y_scale = FT_MulDiv( y_scale, fitted, scaled );\n\n        if ( fitted < scaled )\n          x_scale -= x_scale / 50;\n\n        psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 );\n      }\n\n      glyph->do_horz_hints = 1;\n      glyph->do_vert_hints = 1;\n\n      glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO ||\n                                         hint_mode == FT_RENDER_MODE_LCD  );\n\n      glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO  ||\n                                         hint_mode == FT_RENDER_MODE_LCD_V );\n\n      glyph->do_stem_adjust   = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT );\n\n      for ( dimension = 0; dimension < 2; dimension++ )\n      {\n        /* load outline coordinates into glyph */\n        psh_glyph_load_points( glyph, dimension );\n\n        /* compute local extrema */\n        psh_glyph_compute_extrema( glyph );\n\n        /* compute aligned stem/hints positions */\n        psh_hint_table_align_hints( &glyph->hint_tables[dimension],\n                                    glyph->globals,\n                                    dimension,\n                                    glyph );\n\n        /* find strong points, align them, then interpolate others */\n        psh_glyph_find_strong_points( glyph, dimension );\n        if ( dimension == 1 )\n          psh_glyph_find_blue_points( &globals->blues, glyph );\n        psh_glyph_interpolate_strong_points( glyph, dimension );\n        psh_glyph_interpolate_normal_points( glyph, dimension );\n        psh_glyph_interpolate_other_points( glyph, dimension );\n\n        /* save hinted coordinates back to outline */\n        psh_glyph_save_points( glyph, dimension );\n\n        if ( rescale )\n          psh_globals_set_scale( glyph->globals,\n                                 old_x_scale, old_y_scale, 0, 0 );\n      }\n    }\n\n  Exit:\n\n#ifndef DEBUG_HINTER\n    psh_glyph_done( glyph );\n#endif\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshalgo.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshalgo.h                                                              */\n/*                                                                         */\n/*    PostScript hinting algorithm (specification).                        */\n/*                                                                         */\n/*  Copyright 2001-2003, 2008, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHALGO_H__\n#define __PSHALGO_H__\n\n\n#include \"pshrec.h\"\n#include \"pshglob.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /* handle to Hint structure */\n  typedef struct PSH_HintRec_*  PSH_Hint;\n\n  /* hint bit-flags */\n  typedef enum  PSH_Hint_Flags_\n  {\n    PSH_HINT_GHOST  = PS_HINT_FLAG_GHOST,\n    PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,\n    PSH_HINT_ACTIVE = 4,\n    PSH_HINT_FITTED = 8\n\n  } PSH_Hint_Flags;\n\n\n#define psh_hint_is_active( x )  ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )\n#define psh_hint_is_ghost( x )   ( ( (x)->flags & PSH_HINT_GHOST  ) != 0 )\n#define psh_hint_is_fitted( x )  ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )\n\n#define psh_hint_activate( x )    (x)->flags |=  PSH_HINT_ACTIVE\n#define psh_hint_deactivate( x )  (x)->flags &= ~PSH_HINT_ACTIVE\n#define psh_hint_set_fitted( x )  (x)->flags |=  PSH_HINT_FITTED\n\n  /* hint structure */\n  typedef struct  PSH_HintRec_\n  {\n    FT_Int    org_pos;\n    FT_Int    org_len;\n    FT_Pos    cur_pos;\n    FT_Pos    cur_len;\n    FT_UInt   flags;\n    PSH_Hint  parent;\n    FT_Int    order;\n\n  } PSH_HintRec;\n\n\n  /* this is an interpolation zone used for strong points;  */\n  /* weak points are interpolated according to their strong */\n  /* neighbours                                             */\n  typedef struct  PSH_ZoneRec_\n  {\n    FT_Fixed  scale;\n    FT_Fixed  delta;\n    FT_Pos    min;\n    FT_Pos    max;\n\n  } PSH_ZoneRec, *PSH_Zone;\n\n\n  typedef struct  PSH_Hint_TableRec_\n  {\n    FT_UInt        max_hints;\n    FT_UInt        num_hints;\n    PSH_Hint       hints;\n    PSH_Hint*      sort;\n    PSH_Hint*      sort_global;\n    FT_UInt        num_zones;\n    PSH_ZoneRec*   zones;\n    PSH_Zone       zone;\n    PS_Mask_Table  hint_masks;\n    PS_Mask_Table  counter_masks;\n\n  } PSH_Hint_TableRec, *PSH_Hint_Table;\n\n\n  typedef struct PSH_PointRec_*    PSH_Point;\n  typedef struct PSH_ContourRec_*  PSH_Contour;\n\n  enum\n  {\n    PSH_DIR_NONE  =  4,\n    PSH_DIR_UP    = -1,\n    PSH_DIR_DOWN  =  1,\n    PSH_DIR_LEFT  = -2,\n    PSH_DIR_RIGHT =  2\n  };\n\n#define PSH_DIR_HORIZONTAL  2\n#define PSH_DIR_VERTICAL    1\n\n#define PSH_DIR_COMPARE( d1, d2 )   ( (d1) == (d2) || (d1) == -(d2) )\n#define PSH_DIR_IS_HORIZONTAL( d )  PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )\n#define PSH_DIR_IS_VERTICAL( d )    PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )\n\n\n /* the following bit-flags are computed once by the glyph */\n /* analyzer, for both dimensions                          */\n  enum\n  {\n    PSH_POINT_OFF    = 1,   /* point is off the curve */\n    PSH_POINT_SMOOTH = 2,   /* point is smooth        */\n    PSH_POINT_INFLEX = 4    /* point is inflection    */\n  };\n\n#define psh_point_is_smooth( p )  ( (p)->flags & PSH_POINT_SMOOTH )\n#define psh_point_is_off( p )     ( (p)->flags & PSH_POINT_OFF    )\n#define psh_point_is_inflex( p )  ( (p)->flags & PSH_POINT_INFLEX )\n\n#define psh_point_set_smooth( p )  (p)->flags |= PSH_POINT_SMOOTH\n#define psh_point_set_off( p )     (p)->flags |= PSH_POINT_OFF\n#define psh_point_set_inflex( p )  (p)->flags |= PSH_POINT_INFLEX\n\n  /* the following bit-flags are re-computed for each dimension */\n  enum\n  {\n    PSH_POINT_STRONG   = 16,   /* point is strong                           */\n    PSH_POINT_FITTED   = 32,   /* point is already fitted                   */\n    PSH_POINT_EXTREMUM = 64,   /* point is local extremum                   */\n    PSH_POINT_POSITIVE = 128,  /* extremum has positive contour flow        */\n    PSH_POINT_NEGATIVE = 256,  /* extremum has negative contour flow        */\n    PSH_POINT_EDGE_MIN = 512,  /* point is aligned to left/bottom stem edge */\n    PSH_POINT_EDGE_MAX = 1024  /* point is aligned to top/right stem edge   */\n  };\n\n#define psh_point_is_strong( p )    ( (p)->flags2 & PSH_POINT_STRONG )\n#define psh_point_is_fitted( p )    ( (p)->flags2 & PSH_POINT_FITTED )\n#define psh_point_is_extremum( p )  ( (p)->flags2 & PSH_POINT_EXTREMUM )\n#define psh_point_is_positive( p )  ( (p)->flags2 & PSH_POINT_POSITIVE )\n#define psh_point_is_negative( p )  ( (p)->flags2 & PSH_POINT_NEGATIVE )\n#define psh_point_is_edge_min( p )  ( (p)->flags2 & PSH_POINT_EDGE_MIN )\n#define psh_point_is_edge_max( p )  ( (p)->flags2 & PSH_POINT_EDGE_MAX )\n\n#define psh_point_set_strong( p )    (p)->flags2 |= PSH_POINT_STRONG\n#define psh_point_set_fitted( p )    (p)->flags2 |= PSH_POINT_FITTED\n#define psh_point_set_extremum( p )  (p)->flags2 |= PSH_POINT_EXTREMUM\n#define psh_point_set_positive( p )  (p)->flags2 |= PSH_POINT_POSITIVE\n#define psh_point_set_negative( p )  (p)->flags2 |= PSH_POINT_NEGATIVE\n#define psh_point_set_edge_min( p )  (p)->flags2 |= PSH_POINT_EDGE_MIN\n#define psh_point_set_edge_max( p )  (p)->flags2 |= PSH_POINT_EDGE_MAX\n\n\n  typedef struct  PSH_PointRec_\n  {\n    PSH_Point    prev;\n    PSH_Point    next;\n    PSH_Contour  contour;\n    FT_UInt      flags;\n    FT_UInt      flags2;\n    FT_Char      dir_in;\n    FT_Char      dir_out;\n    PSH_Hint     hint;\n    FT_Pos       org_u;\n    FT_Pos       org_v;\n    FT_Pos       cur_u;\n#ifdef DEBUG_HINTER\n    FT_Pos       org_x;\n    FT_Pos       cur_x;\n    FT_Pos       org_y;\n    FT_Pos       cur_y;\n    FT_UInt      flags_x;\n    FT_UInt      flags_y;\n#endif\n\n  } PSH_PointRec;\n\n\n  typedef struct  PSH_ContourRec_\n  {\n    PSH_Point  start;\n    FT_UInt    count;\n\n  } PSH_ContourRec;\n\n\n  typedef struct  PSH_GlyphRec_\n  {\n    FT_UInt            num_points;\n    FT_UInt            num_contours;\n\n    PSH_Point          points;\n    PSH_Contour        contours;\n\n    FT_Memory          memory;\n    FT_Outline*        outline;\n    PSH_Globals        globals;\n    PSH_Hint_TableRec  hint_tables[2];\n\n    FT_Bool            vertical;\n    FT_Int             major_dir;\n    FT_Int             minor_dir;\n\n    FT_Bool            do_horz_hints;\n    FT_Bool            do_vert_hints;\n    FT_Bool            do_horz_snapping;\n    FT_Bool            do_vert_snapping;\n    FT_Bool            do_stem_adjust;\n\n  } PSH_GlyphRec, *PSH_Glyph;\n\n\n#ifdef DEBUG_HINTER\n  extern PSH_Hint_Table  ps_debug_hint_table;\n\n  typedef void\n  (*PSH_HintFunc)( PSH_Hint  hint,\n                   FT_Bool   vertical );\n\n  extern PSH_HintFunc    ps_debug_hint_func;\n\n  extern PSH_Glyph       ps_debug_glyph;\n#endif\n\n\n  extern FT_Error\n  ps_hints_apply( PS_Hints        ps_hints,\n                  FT_Outline*     outline,\n                  PSH_Globals     globals,\n                  FT_Render_Mode  hint_mode );\n\n\nFT_END_HEADER\n\n\n#endif /* __PSHALGO_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshglob.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshglob.c                                                              */\n/*                                                                         */\n/*    PostScript hinter global hinting management (body).                  */\n/*    Inspired by the new auto-hinter module.                              */\n/*                                                                         */\n/*  Copyright 2001-2004, 2006, 2010, 2012 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"pshglob.h\"\n\n#ifdef DEBUG_HINTER\n  PSH_Globals  ps_debug_globals = 0;\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       STANDARD WIDTHS                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* scale the widths/heights table */\n  static void\n  psh_globals_scale_widths( PSH_Globals  globals,\n                            FT_UInt      direction )\n  {\n    PSH_Dimension  dim   = &globals->dimension[direction];\n    PSH_Widths     stdw  = &dim->stdw;\n    FT_UInt        count = stdw->count;\n    PSH_Width      width = stdw->widths;\n    PSH_Width      stand = width;               /* standard width/height */\n    FT_Fixed       scale = dim->scale_mult;\n\n\n    if ( count > 0 )\n    {\n      width->cur = FT_MulFix( width->org, scale );\n      width->fit = FT_PIX_ROUND( width->cur );\n\n      width++;\n      count--;\n\n      for ( ; count > 0; count--, width++ )\n      {\n        FT_Pos  w, dist;\n\n\n        w    = FT_MulFix( width->org, scale );\n        dist = w - stand->cur;\n\n        if ( dist < 0 )\n          dist = -dist;\n\n        if ( dist < 128 )\n          w = stand->cur;\n\n        width->cur = w;\n        width->fit = FT_PIX_ROUND( w );\n      }\n    }\n  }\n\n\n#if 0\n\n  /* org_width is is font units, result in device pixels, 26.6 format */\n  FT_LOCAL_DEF( FT_Pos )\n  psh_dimension_snap_width( PSH_Dimension  dimension,\n                            FT_Int         org_width )\n  {\n    FT_UInt  n;\n    FT_Pos   width     = FT_MulFix( org_width, dimension->scale_mult );\n    FT_Pos   best      = 64 + 32 + 2;\n    FT_Pos   reference = width;\n\n\n    for ( n = 0; n < dimension->stdw.count; n++ )\n    {\n      FT_Pos  w;\n      FT_Pos  dist;\n\n\n      w = dimension->stdw.widths[n].cur;\n      dist = width - w;\n      if ( dist < 0 )\n        dist = -dist;\n      if ( dist < best )\n      {\n        best      = dist;\n        reference = w;\n      }\n    }\n\n    if ( width >= reference )\n    {\n      width -= 0x21;\n      if ( width < reference )\n        width = reference;\n    }\n    else\n    {\n      width += 0x21;\n      if ( width > reference )\n        width = reference;\n    }\n\n    return width;\n  }\n\n#endif /* 0 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       BLUE ZONES                              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  psh_blues_set_zones_0( PSH_Blues       target,\n                         FT_Bool         is_others,\n                         FT_UInt         read_count,\n                         FT_Short*       read,\n                         PSH_Blue_Table  top_table,\n                         PSH_Blue_Table  bot_table )\n  {\n    FT_UInt  count_top = top_table->count;\n    FT_UInt  count_bot = bot_table->count;\n    FT_Bool  first     = 1;\n\n    FT_UNUSED( target );\n\n\n    for ( ; read_count > 1; read_count -= 2 )\n    {\n      FT_Int         reference, delta;\n      FT_UInt        count;\n      PSH_Blue_Zone  zones, zone;\n      FT_Bool        top;\n\n\n      /* read blue zone entry, and select target top/bottom zone */\n      top = 0;\n      if ( first || is_others )\n      {\n        reference = read[1];\n        delta     = read[0] - reference;\n\n        zones = bot_table->zones;\n        count = count_bot;\n        first = 0;\n      }\n      else\n      {\n        reference = read[0];\n        delta     = read[1] - reference;\n\n        zones = top_table->zones;\n        count = count_top;\n        top   = 1;\n      }\n\n      /* insert into sorted table */\n      zone = zones;\n      for ( ; count > 0; count--, zone++ )\n      {\n        if ( reference < zone->org_ref )\n          break;\n\n        if ( reference == zone->org_ref )\n        {\n          FT_Int  delta0 = zone->org_delta;\n\n\n          /* we have two zones on the same reference position -- */\n          /* only keep the largest one                           */\n          if ( delta < 0 )\n          {\n            if ( delta < delta0 )\n              zone->org_delta = delta;\n          }\n          else\n          {\n            if ( delta > delta0 )\n              zone->org_delta = delta;\n          }\n          goto Skip;\n        }\n      }\n\n      for ( ; count > 0; count-- )\n        zone[count] = zone[count-1];\n\n      zone->org_ref   = reference;\n      zone->org_delta = delta;\n\n      if ( top )\n        count_top++;\n      else\n        count_bot++;\n\n    Skip:\n      read += 2;\n    }\n\n    top_table->count = count_top;\n    bot_table->count = count_bot;\n  }\n\n\n  /* Re-read blue zones from the original fonts and store them into out */\n  /* private structure.  This function re-orders, sanitizes and         */\n  /* fuzz-expands the zones as well.                                    */\n  static void\n  psh_blues_set_zones( PSH_Blues  target,\n                       FT_UInt    count,\n                       FT_Short*  blues,\n                       FT_UInt    count_others,\n                       FT_Short*  other_blues,\n                       FT_Int     fuzz,\n                       FT_Int     family )\n  {\n    PSH_Blue_Table  top_table, bot_table;\n    FT_Int          count_top, count_bot;\n\n\n    if ( family )\n    {\n      top_table = &target->family_top;\n      bot_table = &target->family_bottom;\n    }\n    else\n    {\n      top_table = &target->normal_top;\n      bot_table = &target->normal_bottom;\n    }\n\n    /* read the input blue zones, and build two sorted tables  */\n    /* (one for the top zones, the other for the bottom zones) */\n    top_table->count = 0;\n    bot_table->count = 0;\n\n    /* first, the blues */\n    psh_blues_set_zones_0( target, 0,\n                           count, blues, top_table, bot_table );\n    psh_blues_set_zones_0( target, 1,\n                           count_others, other_blues, top_table, bot_table );\n\n    count_top = top_table->count;\n    count_bot = bot_table->count;\n\n    /* sanitize top table */\n    if ( count_top > 0 )\n    {\n      PSH_Blue_Zone  zone = top_table->zones;\n\n\n      for ( count = count_top; count > 0; count--, zone++ )\n      {\n        FT_Int  delta;\n\n\n        if ( count > 1 )\n        {\n          delta = zone[1].org_ref - zone[0].org_ref;\n          if ( zone->org_delta > delta )\n            zone->org_delta = delta;\n        }\n\n        zone->org_bottom = zone->org_ref;\n        zone->org_top    = zone->org_delta + zone->org_ref;\n      }\n    }\n\n    /* sanitize bottom table */\n    if ( count_bot > 0 )\n    {\n      PSH_Blue_Zone  zone = bot_table->zones;\n\n\n      for ( count = count_bot; count > 0; count--, zone++ )\n      {\n        FT_Int  delta;\n\n\n        if ( count > 1 )\n        {\n          delta = zone[0].org_ref - zone[1].org_ref;\n          if ( zone->org_delta < delta )\n            zone->org_delta = delta;\n        }\n\n        zone->org_top    = zone->org_ref;\n        zone->org_bottom = zone->org_delta + zone->org_ref;\n      }\n    }\n\n    /* expand top and bottom tables with blue fuzz */\n    {\n      FT_Int         dim, top, bot, delta;\n      PSH_Blue_Zone  zone;\n\n\n      zone  = top_table->zones;\n      count = count_top;\n\n      for ( dim = 1; dim >= 0; dim-- )\n      {\n        if ( count > 0 )\n        {\n          /* expand the bottom of the lowest zone normally */\n          zone->org_bottom -= fuzz;\n\n          /* expand the top and bottom of intermediate zones;    */\n          /* checking that the interval is smaller than the fuzz */\n          top = zone->org_top;\n\n          for ( count--; count > 0; count-- )\n          {\n            bot   = zone[1].org_bottom;\n            delta = bot - top;\n\n            if ( delta < 2 * fuzz )\n              zone[0].org_top = zone[1].org_bottom = top + delta / 2;\n            else\n            {\n              zone[0].org_top    = top + fuzz;\n              zone[1].org_bottom = bot - fuzz;\n            }\n\n            zone++;\n            top = zone->org_top;\n          }\n\n          /* expand the top of the highest zone normally */\n          zone->org_top = top + fuzz;\n        }\n        zone  = bot_table->zones;\n        count = count_bot;\n      }\n    }\n  }\n\n\n  /* reset the blues table when the device transform changes */\n  static void\n  psh_blues_scale_zones( PSH_Blues  blues,\n                         FT_Fixed   scale,\n                         FT_Pos     delta )\n  {\n    FT_UInt         count;\n    FT_UInt         num;\n    PSH_Blue_Table  table = 0;\n\n    /*                                                        */\n    /* Determine whether we need to suppress overshoots or    */\n    /* not.  We simply need to compare the vertical scale     */\n    /* parameter to the raw bluescale value.  Here is why:    */\n    /*                                                        */\n    /*   We need to suppress overshoots for all pointsizes.   */\n    /*   At 300dpi that satisfies:                            */\n    /*                                                        */\n    /*      pointsize < 240*bluescale + 0.49                  */\n    /*                                                        */\n    /*   This corresponds to:                                 */\n    /*                                                        */\n    /*      pixelsize < 1000*bluescale + 49/24                */\n    /*                                                        */\n    /*      scale*EM_Size < 1000*bluescale + 49/24            */\n    /*                                                        */\n    /*   However, for normal Type 1 fonts, EM_Size is 1000!   */\n    /*   We thus only check:                                  */\n    /*                                                        */\n    /*      scale < bluescale + 49/24000                      */\n    /*                                                        */\n    /*   which we shorten to                                  */\n    /*                                                        */\n    /*      \"scale < bluescale\"                               */\n    /*                                                        */\n    /* Note that `blue_scale' is stored 1000 times its real   */\n    /* value, and that `scale' converts from font units to    */\n    /* fractional pixels.                                     */\n    /*                                                        */\n\n    /* 1000 / 64 = 125 / 8 */\n    if ( scale >= 0x20C49BAL )\n      blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 );\n    else\n      blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 );\n\n    /*                                                        */\n    /*  The blue threshold is the font units distance under   */\n    /*  which overshoots are suppressed due to the BlueShift  */\n    /*  even if the scale is greater than BlueScale.          */\n    /*                                                        */\n    /*  It is the smallest distance such that                 */\n    /*                                                        */\n    /*    dist <= BlueShift && dist*scale <= 0.5 pixels       */\n    /*                                                        */\n    {\n      FT_Int  threshold = blues->blue_shift;\n\n\n      while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )\n        threshold--;\n\n      blues->blue_threshold = threshold;\n    }\n\n    for ( num = 0; num < 4; num++ )\n    {\n      PSH_Blue_Zone  zone;\n\n\n      switch ( num )\n      {\n      case 0:\n        table = &blues->normal_top;\n        break;\n      case 1:\n        table = &blues->normal_bottom;\n        break;\n      case 2:\n        table = &blues->family_top;\n        break;\n      default:\n        table = &blues->family_bottom;\n        break;\n      }\n\n      zone  = table->zones;\n      count = table->count;\n      for ( ; count > 0; count--, zone++ )\n      {\n        zone->cur_top    = FT_MulFix( zone->org_top,    scale ) + delta;\n        zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta;\n        zone->cur_ref    = FT_MulFix( zone->org_ref,    scale ) + delta;\n        zone->cur_delta  = FT_MulFix( zone->org_delta,  scale );\n\n        /* round scaled reference position */\n        zone->cur_ref = FT_PIX_ROUND( zone->cur_ref );\n\n#if 0\n        if ( zone->cur_ref > zone->cur_top )\n          zone->cur_ref -= 64;\n        else if ( zone->cur_ref < zone->cur_bottom )\n          zone->cur_ref += 64;\n#endif\n      }\n    }\n\n    /* process the families now */\n\n    for ( num = 0; num < 2; num++ )\n    {\n      PSH_Blue_Zone   zone1, zone2;\n      FT_UInt         count1, count2;\n      PSH_Blue_Table  normal, family;\n\n\n      switch ( num )\n      {\n      case 0:\n        normal = &blues->normal_top;\n        family = &blues->family_top;\n        break;\n\n      default:\n        normal = &blues->normal_bottom;\n        family = &blues->family_bottom;\n      }\n\n      zone1  = normal->zones;\n      count1 = normal->count;\n\n      for ( ; count1 > 0; count1--, zone1++ )\n      {\n        /* try to find a family zone whose reference position is less */\n        /* than 1 pixel far from the current zone                     */\n        zone2  = family->zones;\n        count2 = family->count;\n\n        for ( ; count2 > 0; count2--, zone2++ )\n        {\n          FT_Pos  Delta;\n\n\n          Delta = zone1->org_ref - zone2->org_ref;\n          if ( Delta < 0 )\n            Delta = -Delta;\n\n          if ( FT_MulFix( Delta, scale ) < 64 )\n          {\n            zone1->cur_top    = zone2->cur_top;\n            zone1->cur_bottom = zone2->cur_bottom;\n            zone1->cur_ref    = zone2->cur_ref;\n            zone1->cur_delta  = zone2->cur_delta;\n            break;\n          }\n        }\n      }\n    }\n  }\n\n\n  /* calculate the maximum height of given blue zones */\n  static FT_Short\n  psh_calc_max_height( FT_UInt          num,\n                       const FT_Short*  values,\n                       FT_Short         cur_max )\n  {\n    FT_UInt  count;\n\n\n    for ( count = 0; count < num; count += 2 )\n    {\n      FT_Short  cur_height = values[count + 1] - values[count];\n\n\n      if ( cur_height > cur_max )\n        cur_max = cur_height;\n    }\n\n    return cur_max;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  psh_blues_snap_stem( PSH_Blues      blues,\n                       FT_Int         stem_top,\n                       FT_Int         stem_bot,\n                       PSH_Alignment  alignment )\n  {\n    PSH_Blue_Table  table;\n    FT_UInt         count;\n    FT_Pos          delta;\n    PSH_Blue_Zone   zone;\n    FT_Int          no_shoots;\n\n\n    alignment->align = PSH_BLUE_ALIGN_NONE;\n\n    no_shoots = blues->no_overshoots;\n\n    /* look up stem top in top zones table */\n    table = &blues->normal_top;\n    count = table->count;\n    zone  = table->zones;\n\n    for ( ; count > 0; count--, zone++ )\n    {\n      delta = stem_top - zone->org_bottom;\n      if ( delta < -blues->blue_fuzz )\n        break;\n\n      if ( stem_top <= zone->org_top + blues->blue_fuzz )\n      {\n        if ( no_shoots || delta <= blues->blue_threshold )\n        {\n          alignment->align    |= PSH_BLUE_ALIGN_TOP;\n          alignment->align_top = zone->cur_ref;\n        }\n        break;\n      }\n    }\n\n    /* look up stem bottom in bottom zones table */\n    table = &blues->normal_bottom;\n    count = table->count;\n    zone  = table->zones + count-1;\n\n    for ( ; count > 0; count--, zone-- )\n    {\n      delta = zone->org_top - stem_bot;\n      if ( delta < -blues->blue_fuzz )\n        break;\n\n      if ( stem_bot >= zone->org_bottom - blues->blue_fuzz )\n      {\n        if ( no_shoots || delta < blues->blue_threshold )\n        {\n          alignment->align    |= PSH_BLUE_ALIGN_BOT;\n          alignment->align_bot = zone->cur_ref;\n        }\n        break;\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                        GLOBAL HINTS                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  psh_globals_destroy( PSH_Globals  globals )\n  {\n    if ( globals )\n    {\n      FT_Memory  memory;\n\n\n      memory = globals->memory;\n      globals->dimension[0].stdw.count = 0;\n      globals->dimension[1].stdw.count = 0;\n\n      globals->blues.normal_top.count    = 0;\n      globals->blues.normal_bottom.count = 0;\n      globals->blues.family_top.count    = 0;\n      globals->blues.family_bottom.count = 0;\n\n      FT_FREE( globals );\n\n#ifdef DEBUG_HINTER\n      ps_debug_globals = 0;\n#endif\n    }\n  }\n\n\n  static FT_Error\n  psh_globals_new( FT_Memory     memory,\n                   T1_Private*   priv,\n                   PSH_Globals  *aglobals )\n  {\n    PSH_Globals  globals = NULL;\n    FT_Error     error;\n\n\n    if ( !FT_NEW( globals ) )\n    {\n      FT_UInt    count;\n      FT_Short*  read;\n\n\n      globals->memory = memory;\n\n      /* copy standard widths */\n      {\n        PSH_Dimension  dim   = &globals->dimension[1];\n        PSH_Width      write = dim->stdw.widths;\n\n\n        write->org = priv->standard_width[0];\n        write++;\n\n        read = priv->snap_widths;\n        for ( count = priv->num_snap_widths; count > 0; count-- )\n        {\n          write->org = *read;\n          write++;\n          read++;\n        }\n\n        dim->stdw.count = priv->num_snap_widths + 1;\n      }\n\n      /* copy standard heights */\n      {\n        PSH_Dimension  dim = &globals->dimension[0];\n        PSH_Width      write = dim->stdw.widths;\n\n\n        write->org = priv->standard_height[0];\n        write++;\n        read = priv->snap_heights;\n        for ( count = priv->num_snap_heights; count > 0; count-- )\n        {\n          write->org = *read;\n          write++;\n          read++;\n        }\n\n        dim->stdw.count = priv->num_snap_heights + 1;\n      }\n\n      /* copy blue zones */\n      psh_blues_set_zones( &globals->blues, priv->num_blue_values,\n                           priv->blue_values, priv->num_other_blues,\n                           priv->other_blues, priv->blue_fuzz, 0 );\n\n      psh_blues_set_zones( &globals->blues, priv->num_family_blues,\n                           priv->family_blues, priv->num_family_other_blues,\n                           priv->family_other_blues, priv->blue_fuzz, 1 );\n\n      /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */\n      {\n        FT_Fixed  max_scale;\n        FT_Short  max_height = 1;\n\n\n        max_height = psh_calc_max_height( priv->num_blue_values,\n                                          priv->blue_values,\n                                          max_height );\n        max_height = psh_calc_max_height( priv->num_other_blues,\n                                          priv->other_blues,\n                                          max_height );\n        max_height = psh_calc_max_height( priv->num_family_blues,\n                                          priv->family_blues,\n                                          max_height );\n        max_height = psh_calc_max_height( priv->num_family_other_blues,\n                                          priv->family_other_blues,\n                                          max_height );\n\n        /* BlueScale is scaled 1000 times */\n        max_scale = FT_DivFix( 1000, max_height );\n        globals->blues.blue_scale = priv->blue_scale < max_scale\n                                      ? priv->blue_scale\n                                      : max_scale;\n      }\n\n      globals->blues.blue_shift = priv->blue_shift;\n      globals->blues.blue_fuzz  = priv->blue_fuzz;\n\n      globals->dimension[0].scale_mult  = 0;\n      globals->dimension[0].scale_delta = 0;\n      globals->dimension[1].scale_mult  = 0;\n      globals->dimension[1].scale_delta = 0;\n\n#ifdef DEBUG_HINTER\n      ps_debug_globals = globals;\n#endif\n    }\n\n    *aglobals = globals;\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  psh_globals_set_scale( PSH_Globals  globals,\n                         FT_Fixed     x_scale,\n                         FT_Fixed     y_scale,\n                         FT_Fixed     x_delta,\n                         FT_Fixed     y_delta )\n  {\n    PSH_Dimension  dim = &globals->dimension[0];\n\n\n    dim = &globals->dimension[0];\n    if ( x_scale != dim->scale_mult  ||\n         x_delta != dim->scale_delta )\n    {\n      dim->scale_mult  = x_scale;\n      dim->scale_delta = x_delta;\n\n      psh_globals_scale_widths( globals, 0 );\n    }\n\n    dim = &globals->dimension[1];\n    if ( y_scale != dim->scale_mult  ||\n         y_delta != dim->scale_delta )\n    {\n      dim->scale_mult  = y_scale;\n      dim->scale_delta = y_delta;\n\n      psh_globals_scale_widths( globals, 1 );\n      psh_blues_scale_zones( &globals->blues, y_scale, y_delta );\n    }\n\n    return 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs )\n  {\n    funcs->create    = psh_globals_new;\n    funcs->set_scale = psh_globals_set_scale;\n    funcs->destroy   = psh_globals_destroy;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshglob.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshglob.h                                                              */\n/*                                                                         */\n/*    PostScript hinter global hinting management.                         */\n/*                                                                         */\n/*  Copyright 2001, 2002, 2003 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHGLOB_H__\n#define __PSHGLOB_H__\n\n\n#include FT_FREETYPE_H\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    GLOBAL HINTS INTERNALS                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* @constant:                                                            */\n  /*    PS_GLOBALS_MAX_BLUE_ZONES                                          */\n  /*                                                                       */\n  /* @description:                                                         */\n  /*    The maximum number of blue zones in a font global hints structure. */\n  /*    See @PS_Globals_BluesRec.                                          */\n  /*                                                                       */\n#define PS_GLOBALS_MAX_BLUE_ZONES  16\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* @constant:                                                            */\n  /*    PS_GLOBALS_MAX_STD_WIDTHS                                          */\n  /*                                                                       */\n  /* @description:                                                         */\n  /*    The maximum number of standard and snap widths in either the       */\n  /*    horizontal or vertical direction.  See @PS_Globals_WidthsRec.      */\n  /*                                                                       */\n#define PS_GLOBALS_MAX_STD_WIDTHS  16\n\n\n  /* standard and snap width */\n  typedef struct  PSH_WidthRec_\n  {\n    FT_Int  org;\n    FT_Pos  cur;\n    FT_Pos  fit;\n\n  } PSH_WidthRec, *PSH_Width;\n\n\n  /* standard and snap widths table */\n  typedef struct  PSH_WidthsRec_\n  {\n    FT_UInt       count;\n    PSH_WidthRec  widths[PS_GLOBALS_MAX_STD_WIDTHS];\n\n  } PSH_WidthsRec, *PSH_Widths;\n\n\n  typedef struct  PSH_DimensionRec_\n  {\n    PSH_WidthsRec  stdw;\n    FT_Fixed       scale_mult;\n    FT_Fixed       scale_delta;\n\n  } PSH_DimensionRec, *PSH_Dimension;\n\n\n  /* blue zone descriptor */\n  typedef struct  PSH_Blue_ZoneRec_\n  {\n    FT_Int  org_ref;\n    FT_Int  org_delta;\n    FT_Int  org_top;\n    FT_Int  org_bottom;\n\n    FT_Pos  cur_ref;\n    FT_Pos  cur_delta;\n    FT_Pos  cur_bottom;\n    FT_Pos  cur_top;\n\n  } PSH_Blue_ZoneRec, *PSH_Blue_Zone;\n\n\n  typedef struct  PSH_Blue_TableRec_\n  {\n    FT_UInt           count;\n    PSH_Blue_ZoneRec  zones[PS_GLOBALS_MAX_BLUE_ZONES];\n\n  } PSH_Blue_TableRec, *PSH_Blue_Table;\n\n\n  /* blue zones table */\n  typedef struct  PSH_BluesRec_\n  {\n    PSH_Blue_TableRec  normal_top;\n    PSH_Blue_TableRec  normal_bottom;\n    PSH_Blue_TableRec  family_top;\n    PSH_Blue_TableRec  family_bottom;\n\n    FT_Fixed           blue_scale;\n    FT_Int             blue_shift;\n    FT_Int             blue_threshold;\n    FT_Int             blue_fuzz;\n    FT_Bool            no_overshoots;\n\n  } PSH_BluesRec, *PSH_Blues;\n\n\n  /* font globals.                                         */\n  /* dimension 0 => X coordinates + vertical hints/stems   */\n  /* dimension 1 => Y coordinates + horizontal hints/stems */\n  typedef struct  PSH_GlobalsRec_\n  {\n    FT_Memory         memory;\n    PSH_DimensionRec  dimension[2];\n    PSH_BluesRec      blues;\n\n  } PSH_GlobalsRec;\n\n\n#define PSH_BLUE_ALIGN_NONE  0\n#define PSH_BLUE_ALIGN_TOP   1\n#define PSH_BLUE_ALIGN_BOT   2\n\n\n  typedef struct  PSH_AlignmentRec_\n  {\n    int     align;\n    FT_Pos  align_top;\n    FT_Pos  align_bot;\n\n  } PSH_AlignmentRec, *PSH_Alignment;\n\n\n  FT_LOCAL( void )\n  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs );\n\n\n#if 0\n  /* snap a stem width to fitter coordinates.  `org_width' is in font */\n  /* units.  The result is in device pixels (26.6 format).            */\n  FT_LOCAL( FT_Pos )\n  psh_dimension_snap_width( PSH_Dimension  dimension,\n                            FT_Int         org_width );\n#endif\n\n  FT_LOCAL( FT_Error )\n  psh_globals_set_scale( PSH_Globals  globals,\n                         FT_Fixed     x_scale,\n                         FT_Fixed     y_scale,\n                         FT_Fixed     x_delta,\n                         FT_Fixed     y_delta );\n\n  /* snap a stem to one or two blue zones */\n  FT_LOCAL( void )\n  psh_blues_snap_stem( PSH_Blues      blues,\n                       FT_Int         stem_top,\n                       FT_Int         stem_bot,\n                       PSH_Alignment  alignment );\n  /* */\n\n#ifdef DEBUG_HINTER\n  extern PSH_Globals  ps_debug_globals;\n#endif\n\n\nFT_END_HEADER\n\n\n#endif /* __PSHGLOB_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshinter.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshinter.c                                                             */\n/*                                                                         */\n/*    FreeType PostScript Hinting module                                   */\n/*                                                                         */\n/*  Copyright 2001, 2003 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"pshpic.c\"\n#include \"pshrec.c\"\n#include \"pshglob.c\"\n#include \"pshalgo.c\"\n#include \"pshmod.c\"\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshmod.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshmod.c                                                               */\n/*                                                                         */\n/*    FreeType PostScript hinter module implementation (body).             */\n/*                                                                         */\n/*  Copyright 2001, 2002, 2007, 2009, 2012 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include \"pshrec.h\"\n#include \"pshalgo.h\"\n#include \"pshpic.h\"\n\n\n  /* the Postscript Hinter module structure */\n  typedef struct  PS_Hinter_Module_Rec_\n  {\n    FT_ModuleRec          root;\n    PS_HintsRec           ps_hints;\n\n    PSH_Globals_FuncsRec  globals_funcs;\n    T1_Hints_FuncsRec     t1_funcs;\n    T2_Hints_FuncsRec     t2_funcs;\n\n  } PS_Hinter_ModuleRec, *PS_Hinter_Module;\n\n\n  /* finalize module */\n  FT_CALLBACK_DEF( void )\n  ps_hinter_done( PS_Hinter_Module  module )\n  {\n    module->t1_funcs.hints = NULL;\n    module->t2_funcs.hints = NULL;\n\n    ps_hints_done( &module->ps_hints );\n  }\n\n\n  /* initialize module, create hints recorder and the interface */\n  FT_CALLBACK_DEF( FT_Error )\n  ps_hinter_init( PS_Hinter_Module  module )\n  {\n    FT_Memory  memory = module->root.memory;\n    void*      ph     = &module->ps_hints;\n\n\n    ps_hints_init( &module->ps_hints, memory );\n\n    psh_globals_funcs_init( &module->globals_funcs );\n\n    t1_hints_funcs_init( &module->t1_funcs );\n    module->t1_funcs.hints = (T1_Hints)ph;\n\n    t2_hints_funcs_init( &module->t2_funcs );\n    module->t2_funcs.hints = (T2_Hints)ph;\n\n    return 0;\n  }\n\n\n  /* returns global hints interface */\n  FT_CALLBACK_DEF( PSH_Globals_Funcs )\n  pshinter_get_globals_funcs( FT_Module  module )\n  {\n    return &((PS_Hinter_Module)module)->globals_funcs;\n  }\n\n\n  /* return Type 1 hints interface */\n  FT_CALLBACK_DEF( T1_Hints_Funcs )\n  pshinter_get_t1_funcs( FT_Module  module )\n  {\n    return &((PS_Hinter_Module)module)->t1_funcs;\n  }\n\n\n  /* return Type 2 hints interface */\n  FT_CALLBACK_DEF( T2_Hints_Funcs )\n  pshinter_get_t2_funcs( FT_Module  module )\n  {\n    return &((PS_Hinter_Module)module)->t2_funcs;\n  }\n\n\n  FT_DEFINE_PSHINTER_INTERFACE(\n    pshinter_interface,\n    pshinter_get_globals_funcs,\n    pshinter_get_t1_funcs,\n    pshinter_get_t2_funcs )\n\n\n  FT_DEFINE_MODULE(\n    pshinter_module_class,\n\n    0,\n    sizeof ( PS_Hinter_ModuleRec ),\n    \"pshinter\",\n    0x10000L,\n    0x20000L,\n\n    &PSHINTER_INTERFACE_GET,              /* module-specific interface */\n\n    (FT_Module_Constructor)ps_hinter_init,\n    (FT_Module_Destructor) ps_hinter_done,\n    (FT_Module_Requester)  NULL )   /* no additional interface for now */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshmod.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshmod.h                                                               */\n/*                                                                         */\n/*    PostScript hinter module interface (specification).                  */\n/*                                                                         */\n/*  Copyright 2001 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHMOD_H__\n#define __PSHMOD_H__\n\n\n#include <ft2build.h>\n#include FT_MODULE_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_MODULE( pshinter_module_class )\n\n\nFT_END_HEADER\n\n\n#endif /* __PSHMOD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshnterr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshnterr.h                                                             */\n/*                                                                         */\n/*    PS Hinter error codes (specification only).                          */\n/*                                                                         */\n/*  Copyright 2003, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the PSHinter error enumeration constants. */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __PSHNTERR_H__\n#define __PSHNTERR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  PSH_Err_\n#define FT_ERR_BASE    FT_Mod_Err_PShinter\n\n#include FT_ERRORS_H\n\n#endif /* __PSHNTERR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshpic.c                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for pshinter module. */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"pshpic.h\"\n#include \"pshnterr.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from pshmod.c */\n  void\n  FT_Init_Class_pshinter_interface( FT_Library           library,\n                                    PSHinter_Interface*  clazz );\n\n  void\n  pshinter_module_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->pshinter )\n    {\n      FT_FREE( pic_container->pshinter );\n      pic_container->pshinter = NULL;\n    }\n  }\n\n\n  FT_Error\n  pshinter_module_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    PSHinterPIC*       container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->pshinter = container;\n\n    /* add call to initialization function when you add new scripts */\n    FT_Init_Class_pshinter_interface(\n      library, &container->pshinter_interface );\n\n    if ( error )\n      pshinter_module_class_pic_free( library );\n\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshpic.h                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for pshinter module. */\n/*                                                                         */\n/*  Copyright 2009, 2012, 2013 by                                          */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSHPIC_H__\n#define __PSHPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include FT_INTERNAL_PIC_H\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define PSHINTER_INTERFACE_GET  pshinter_interface\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n\n  typedef struct  PSHinterPIC_\n  {\n    PSHinter_Interface  pshinter_interface;\n\n  } PSHinterPIC;\n\n\n#define GET_PIC( lib )  ( (PSHinterPIC*)( (lib)->pic_container.pshinter ) )\n\n#define PSHINTER_INTERFACE_GET  ( GET_PIC( library )->pshinter_interface )\n\n  /* see pshpic.c for the implementation */\n  void\n  pshinter_module_class_pic_free( FT_Library  library );\n\n  FT_Error\n  pshinter_module_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __PSHPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshrec.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshrec.c                                                               */\n/*                                                                         */\n/*    FreeType PostScript hints recorder (body).                           */\n/*                                                                         */\n/*  Copyright 2001-2004, 2007, 2009, 2013 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_CALC_H\n\n#include \"pshrec.h\"\n#include \"pshalgo.h\"\n\n#include \"pshnterr.h\"\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_pshrec\n\n#ifdef DEBUG_HINTER\n  PS_Hints  ps_debug_hints         = 0;\n  int       ps_debug_no_horz_hints = 0;\n  int       ps_debug_no_vert_hints = 0;\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      PS_HINT MANAGEMENT                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* destroy hints table */\n  static void\n  ps_hint_table_done( PS_Hint_Table  table,\n                      FT_Memory      memory )\n  {\n    FT_FREE( table->hints );\n    table->num_hints = 0;\n    table->max_hints = 0;\n  }\n\n\n  /* ensure that a table can contain \"count\" elements */\n  static FT_Error\n  ps_hint_table_ensure( PS_Hint_Table  table,\n                        FT_UInt        count,\n                        FT_Memory      memory )\n  {\n    FT_UInt   old_max = table->max_hints;\n    FT_UInt   new_max = count;\n    FT_Error  error   = FT_Err_Ok;\n\n\n    if ( new_max > old_max )\n    {\n      /* try to grow the table */\n      new_max = FT_PAD_CEIL( new_max, 8 );\n      if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) )\n        table->max_hints = new_max;\n    }\n    return error;\n  }\n\n\n  static FT_Error\n  ps_hint_table_alloc( PS_Hint_Table  table,\n                       FT_Memory      memory,\n                       PS_Hint       *ahint )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UInt   count;\n    PS_Hint   hint = 0;\n\n\n    count = table->num_hints;\n    count++;\n\n    if ( count >= table->max_hints )\n    {\n      error = ps_hint_table_ensure( table, count, memory );\n      if ( error )\n        goto Exit;\n    }\n\n    hint        = table->hints + count - 1;\n    hint->pos   = 0;\n    hint->len   = 0;\n    hint->flags = 0;\n\n    table->num_hints = count;\n\n  Exit:\n    *ahint = hint;\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      PS_MASK MANAGEMENT                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* destroy mask */\n  static void\n  ps_mask_done( PS_Mask    mask,\n                FT_Memory  memory )\n  {\n    FT_FREE( mask->bytes );\n    mask->num_bits  = 0;\n    mask->max_bits  = 0;\n    mask->end_point = 0;\n  }\n\n\n  /* ensure that a mask can contain \"count\" bits */\n  static FT_Error\n  ps_mask_ensure( PS_Mask    mask,\n                  FT_UInt    count,\n                  FT_Memory  memory )\n  {\n    FT_UInt   old_max = ( mask->max_bits + 7 ) >> 3;\n    FT_UInt   new_max = ( count          + 7 ) >> 3;\n    FT_Error  error   = FT_Err_Ok;\n\n\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 8 );\n      if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) )\n        mask->max_bits = new_max * 8;\n    }\n    return error;\n  }\n\n\n  /* test a bit value in a given mask */\n  static FT_Int\n  ps_mask_test_bit( PS_Mask  mask,\n                    FT_Int   idx )\n  {\n    if ( (FT_UInt)idx >= mask->num_bits )\n      return 0;\n\n    return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) );\n  }\n\n\n  /* clear a given bit */\n  static void\n  ps_mask_clear_bit( PS_Mask  mask,\n                     FT_Int   idx )\n  {\n    FT_Byte*  p;\n\n\n    if ( (FT_UInt)idx >= mask->num_bits )\n      return;\n\n    p    = mask->bytes + ( idx >> 3 );\n    p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) );\n  }\n\n\n  /* set a given bit, possibly grow the mask */\n  static FT_Error\n  ps_mask_set_bit( PS_Mask    mask,\n                   FT_Int     idx,\n                   FT_Memory  memory )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Byte*  p;\n\n\n    if ( idx < 0 )\n      goto Exit;\n\n    if ( (FT_UInt)idx >= mask->num_bits )\n    {\n      error = ps_mask_ensure( mask, idx + 1, memory );\n      if ( error )\n        goto Exit;\n\n      mask->num_bits = idx + 1;\n    }\n\n    p    = mask->bytes + ( idx >> 3 );\n    p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) );\n\n  Exit:\n    return error;\n  }\n\n\n  /* destroy mask table */\n  static void\n  ps_mask_table_done( PS_Mask_Table  table,\n                      FT_Memory      memory )\n  {\n    FT_UInt  count = table->max_masks;\n    PS_Mask  mask  = table->masks;\n\n\n    for ( ; count > 0; count--, mask++ )\n      ps_mask_done( mask, memory );\n\n    FT_FREE( table->masks );\n    table->num_masks = 0;\n    table->max_masks = 0;\n  }\n\n\n  /* ensure that a mask table can contain \"count\" masks */\n  static FT_Error\n  ps_mask_table_ensure( PS_Mask_Table  table,\n                        FT_UInt        count,\n                        FT_Memory      memory )\n  {\n    FT_UInt   old_max = table->max_masks;\n    FT_UInt   new_max = count;\n    FT_Error  error   = FT_Err_Ok;\n\n\n    if ( new_max > old_max )\n    {\n      new_max = FT_PAD_CEIL( new_max, 8 );\n      if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) )\n        table->max_masks = new_max;\n    }\n    return error;\n  }\n\n\n  /* allocate a new mask in a table */\n  static FT_Error\n  ps_mask_table_alloc( PS_Mask_Table  table,\n                       FT_Memory      memory,\n                       PS_Mask       *amask )\n  {\n    FT_UInt   count;\n    FT_Error  error = FT_Err_Ok;\n    PS_Mask   mask  = 0;\n\n\n    count = table->num_masks;\n    count++;\n\n    if ( count > table->max_masks )\n    {\n      error = ps_mask_table_ensure( table, count, memory );\n      if ( error )\n        goto Exit;\n    }\n\n    mask             = table->masks + count - 1;\n    mask->num_bits   = 0;\n    mask->end_point  = 0;\n    table->num_masks = count;\n\n  Exit:\n    *amask = mask;\n    return error;\n  }\n\n\n  /* return last hint mask in a table, create one if the table is empty */\n  static FT_Error\n  ps_mask_table_last( PS_Mask_Table  table,\n                      FT_Memory      memory,\n                      PS_Mask       *amask )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UInt   count;\n    PS_Mask   mask;\n\n\n    count = table->num_masks;\n    if ( count == 0 )\n    {\n      error = ps_mask_table_alloc( table, memory, &mask );\n      if ( error )\n        goto Exit;\n    }\n    else\n      mask = table->masks + count - 1;\n\n  Exit:\n    *amask = mask;\n    return error;\n  }\n\n\n  /* set a new mask to a given bit range */\n  static FT_Error\n  ps_mask_table_set_bits( PS_Mask_Table   table,\n                          const FT_Byte*  source,\n                          FT_UInt         bit_pos,\n                          FT_UInt         bit_count,\n                          FT_Memory       memory )\n  {\n    FT_Error  error = FT_Err_Ok;\n    PS_Mask   mask;\n\n\n    error = ps_mask_table_last( table, memory, &mask );\n    if ( error )\n      goto Exit;\n\n    error = ps_mask_ensure( mask, bit_count, memory );\n    if ( error )\n      goto Exit;\n\n    mask->num_bits = bit_count;\n\n    /* now, copy bits */\n    {\n      FT_Byte*  read  = (FT_Byte*)source + ( bit_pos >> 3 );\n      FT_Int    rmask = 0x80 >> ( bit_pos & 7 );\n      FT_Byte*  write = mask->bytes;\n      FT_Int    wmask = 0x80;\n      FT_Int    val;\n\n\n      for ( ; bit_count > 0; bit_count-- )\n      {\n        val = write[0] & ~wmask;\n\n        if ( read[0] & rmask )\n          val |= wmask;\n\n        write[0] = (FT_Byte)val;\n\n        rmask >>= 1;\n        if ( rmask == 0 )\n        {\n          read++;\n          rmask = 0x80;\n        }\n\n        wmask >>= 1;\n        if ( wmask == 0 )\n        {\n          write++;\n          wmask = 0x80;\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* test whether two masks in a table intersect */\n  static FT_Int\n  ps_mask_table_test_intersect( PS_Mask_Table  table,\n                                FT_Int         index1,\n                                FT_Int         index2 )\n  {\n    PS_Mask   mask1  = table->masks + index1;\n    PS_Mask   mask2  = table->masks + index2;\n    FT_Byte*  p1     = mask1->bytes;\n    FT_Byte*  p2     = mask2->bytes;\n    FT_UInt   count1 = mask1->num_bits;\n    FT_UInt   count2 = mask2->num_bits;\n    FT_UInt   count;\n\n\n    count = FT_MIN( count1, count2 );\n    for ( ; count >= 8; count -= 8 )\n    {\n      if ( p1[0] & p2[0] )\n        return 1;\n\n      p1++;\n      p2++;\n    }\n\n    if ( count == 0 )\n      return 0;\n\n    return ( p1[0] & p2[0] ) & ~( 0xFF >> count );\n  }\n\n\n  /* merge two masks, used by ps_mask_table_merge_all */\n  static FT_Error\n  ps_mask_table_merge( PS_Mask_Table  table,\n                       FT_Int         index1,\n                       FT_Int         index2,\n                       FT_Memory      memory )\n  {\n    FT_UInt   temp;\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* swap index1 and index2 so that index1 < index2 */\n    if ( index1 > index2 )\n    {\n      temp   = index1;\n      index1 = index2;\n      index2 = temp;\n    }\n\n    if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks )\n    {\n      /* we need to merge the bitsets of index1 and index2 with a */\n      /* simple union                                             */\n      PS_Mask  mask1  = table->masks + index1;\n      PS_Mask  mask2  = table->masks + index2;\n      FT_UInt  count1 = mask1->num_bits;\n      FT_UInt  count2 = mask2->num_bits;\n      FT_Int   delta;\n\n\n      if ( count2 > 0 )\n      {\n        FT_UInt   pos;\n        FT_Byte*  read;\n        FT_Byte*  write;\n\n\n        /* if \"count2\" is greater than \"count1\", we need to grow the */\n        /* first bitset, and clear the highest bits                  */\n        if ( count2 > count1 )\n        {\n          error = ps_mask_ensure( mask1, count2, memory );\n          if ( error )\n            goto Exit;\n\n          for ( pos = count1; pos < count2; pos++ )\n            ps_mask_clear_bit( mask1, pos );\n        }\n\n        /* merge (unite) the bitsets */\n        read  = mask2->bytes;\n        write = mask1->bytes;\n        pos   = (FT_UInt)( ( count2 + 7 ) >> 3 );\n\n        for ( ; pos > 0; pos-- )\n        {\n          write[0] = (FT_Byte)( write[0] | read[0] );\n          write++;\n          read++;\n        }\n      }\n\n      /* Now, remove \"mask2\" from the list.  We need to keep the masks */\n      /* sorted in order of importance, so move table elements.        */\n      mask2->num_bits  = 0;\n      mask2->end_point = 0;\n\n      delta = table->num_masks - 1 - index2; /* number of masks to move */\n      if ( delta > 0 )\n      {\n        /* move to end of table for reuse */\n        PS_MaskRec  dummy = *mask2;\n\n\n        ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) );\n\n        mask2[delta] = dummy;\n      }\n\n      table->num_masks--;\n    }\n    else\n      FT_TRACE0(( \"ps_mask_table_merge: ignoring invalid indices (%d,%d)\\n\",\n                  index1, index2 ));\n\n  Exit:\n    return error;\n  }\n\n\n  /* Try to merge all masks in a given table.  This is used to merge */\n  /* all counter masks into independent counter \"paths\".             */\n  /*                                                                 */\n  static FT_Error\n  ps_mask_table_merge_all( PS_Mask_Table  table,\n                           FT_Memory      memory )\n  {\n    FT_Int    index1, index2;\n    FT_Error  error = FT_Err_Ok;\n\n\n    for ( index1 = table->num_masks - 1; index1 > 0; index1-- )\n    {\n      for ( index2 = index1 - 1; index2 >= 0; index2-- )\n      {\n        if ( ps_mask_table_test_intersect( table, index1, index2 ) )\n        {\n          error = ps_mask_table_merge( table, index2, index1, memory );\n          if ( error )\n            goto Exit;\n\n          break;\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    PS_DIMENSION MANAGEMENT                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* finalize a given dimension */\n  static void\n  ps_dimension_done( PS_Dimension  dimension,\n                     FT_Memory     memory )\n  {\n    ps_mask_table_done( &dimension->counters, memory );\n    ps_mask_table_done( &dimension->masks,    memory );\n    ps_hint_table_done( &dimension->hints,    memory );\n  }\n\n\n  /* initialize a given dimension */\n  static void\n  ps_dimension_init( PS_Dimension  dimension )\n  {\n    dimension->hints.num_hints    = 0;\n    dimension->masks.num_masks    = 0;\n    dimension->counters.num_masks = 0;\n  }\n\n\n#if 0\n\n  /* set a bit at a given index in the current hint mask */\n  static FT_Error\n  ps_dimension_set_mask_bit( PS_Dimension  dim,\n                             FT_UInt       idx,\n                             FT_Memory     memory )\n  {\n    PS_Mask   mask;\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* get last hint mask */\n    error = ps_mask_table_last( &dim->masks, memory, &mask );\n    if ( error )\n      goto Exit;\n\n    error = ps_mask_set_bit( mask, idx, memory );\n\n  Exit:\n    return error;\n  }\n\n#endif\n\n  /* set the end point in a mask, called from \"End\" & \"Reset\" methods */\n  static void\n  ps_dimension_end_mask( PS_Dimension  dim,\n                         FT_UInt       end_point )\n  {\n    FT_UInt  count = dim->masks.num_masks;\n    PS_Mask  mask;\n\n\n    if ( count > 0 )\n    {\n      mask            = dim->masks.masks + count - 1;\n      mask->end_point = end_point;\n    }\n  }\n\n\n  /* set the end point in the current mask, then create a new empty one */\n  /* (called by \"Reset\" method)                                         */\n  static FT_Error\n  ps_dimension_reset_mask( PS_Dimension  dim,\n                           FT_UInt       end_point,\n                           FT_Memory     memory )\n  {\n    PS_Mask  mask;\n\n\n    /* end current mask */\n    ps_dimension_end_mask( dim, end_point );\n\n    /* allocate new one */\n    return ps_mask_table_alloc( &dim->masks, memory, &mask );\n  }\n\n\n  /* set a new mask, called from the \"T2Stem\" method */\n  static FT_Error\n  ps_dimension_set_mask_bits( PS_Dimension    dim,\n                              const FT_Byte*  source,\n                              FT_UInt         source_pos,\n                              FT_UInt         source_bits,\n                              FT_UInt         end_point,\n                              FT_Memory       memory )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    /* reset current mask, if any */\n    error = ps_dimension_reset_mask( dim, end_point, memory );\n    if ( error )\n      goto Exit;\n\n    /* set bits in new mask */\n    error = ps_mask_table_set_bits( &dim->masks, source,\n                                    source_pos, source_bits, memory );\n\n  Exit:\n    return error;\n  }\n\n\n  /* add a new single stem (called from \"T1Stem\" method) */\n  static FT_Error\n  ps_dimension_add_t1stem( PS_Dimension  dim,\n                           FT_Int        pos,\n                           FT_Int        len,\n                           FT_Memory     memory,\n                           FT_Int       *aindex )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UInt   flags = 0;\n\n\n    /* detect ghost stem */\n    if ( len < 0 )\n    {\n      flags |= PS_HINT_FLAG_GHOST;\n      if ( len == -21 )\n      {\n        flags |= PS_HINT_FLAG_BOTTOM;\n        pos   += len;\n      }\n      len = 0;\n    }\n\n    if ( aindex )\n      *aindex = -1;\n\n    /* now, lookup stem in the current hints table */\n    {\n      PS_Mask  mask;\n      FT_UInt  idx;\n      FT_UInt  max   = dim->hints.num_hints;\n      PS_Hint  hint  = dim->hints.hints;\n\n\n      for ( idx = 0; idx < max; idx++, hint++ )\n      {\n        if ( hint->pos == pos && hint->len == len )\n          break;\n      }\n\n      /* we need to create a new hint in the table */\n      if ( idx >= max )\n      {\n        error = ps_hint_table_alloc( &dim->hints, memory, &hint );\n        if ( error )\n          goto Exit;\n\n        hint->pos   = pos;\n        hint->len   = len;\n        hint->flags = flags;\n      }\n\n      /* now, store the hint in the current mask */\n      error = ps_mask_table_last( &dim->masks, memory, &mask );\n      if ( error )\n        goto Exit;\n\n      error = ps_mask_set_bit( mask, idx, memory );\n      if ( error )\n        goto Exit;\n\n      if ( aindex )\n        *aindex = (FT_Int)idx;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /* add a \"hstem3/vstem3\" counter to our dimension table */\n  static FT_Error\n  ps_dimension_add_counter( PS_Dimension  dim,\n                            FT_Int        hint1,\n                            FT_Int        hint2,\n                            FT_Int        hint3,\n                            FT_Memory     memory )\n  {\n    FT_Error  error   = FT_Err_Ok;\n    FT_UInt   count   = dim->counters.num_masks;\n    PS_Mask   counter = dim->counters.masks;\n\n\n    /* try to find an existing counter mask that already uses */\n    /* one of these stems here                                */\n    for ( ; count > 0; count--, counter++ )\n    {\n      if ( ps_mask_test_bit( counter, hint1 ) ||\n           ps_mask_test_bit( counter, hint2 ) ||\n           ps_mask_test_bit( counter, hint3 ) )\n        break;\n    }\n\n    /* create a new counter when needed */\n    if ( count == 0 )\n    {\n      error = ps_mask_table_alloc( &dim->counters, memory, &counter );\n      if ( error )\n        goto Exit;\n    }\n\n    /* now, set the bits for our hints in the counter mask */\n    error = ps_mask_set_bit( counter, hint1, memory );\n    if ( error )\n      goto Exit;\n\n    error = ps_mask_set_bit( counter, hint2, memory );\n    if ( error )\n      goto Exit;\n\n    error = ps_mask_set_bit( counter, hint3, memory );\n    if ( error )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  /* end of recording session for a given dimension */\n  static FT_Error\n  ps_dimension_end( PS_Dimension  dim,\n                    FT_UInt       end_point,\n                    FT_Memory     memory )\n  {\n    /* end hint mask table */\n    ps_dimension_end_mask( dim, end_point );\n\n    /* merge all counter masks into independent \"paths\" */\n    return ps_mask_table_merge_all( &dim->counters, memory );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    PS_RECORDER MANAGEMENT                     *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* destroy hints */\n  FT_LOCAL( void )\n  ps_hints_done( PS_Hints  hints )\n  {\n    FT_Memory  memory = hints->memory;\n\n\n    ps_dimension_done( &hints->dimension[0], memory );\n    ps_dimension_done( &hints->dimension[1], memory );\n\n    hints->error  = FT_Err_Ok;\n    hints->memory = 0;\n  }\n\n\n  FT_LOCAL( FT_Error )\n  ps_hints_init( PS_Hints   hints,\n                 FT_Memory  memory )\n  {\n    FT_MEM_ZERO( hints, sizeof ( *hints ) );\n    hints->memory = memory;\n    return FT_Err_Ok;\n  }\n\n\n  /* initialize a hints for a new session */\n  static void\n  ps_hints_open( PS_Hints      hints,\n                 PS_Hint_Type  hint_type )\n  {\n    switch ( hint_type )\n    {\n    case PS_HINT_TYPE_1:\n    case PS_HINT_TYPE_2:\n      hints->error     = FT_Err_Ok;\n      hints->hint_type = hint_type;\n\n      ps_dimension_init( &hints->dimension[0] );\n      ps_dimension_init( &hints->dimension[1] );\n      break;\n\n    default:\n      hints->error     = FT_THROW( Invalid_Argument );\n      hints->hint_type = hint_type;\n\n      FT_TRACE0(( \"ps_hints_open: invalid charstring type\\n\" ));\n      break;\n    }\n  }\n\n\n  /* add one or more stems to the current hints table */\n  static void\n  ps_hints_stem( PS_Hints  hints,\n                 FT_Int    dimension,\n                 FT_UInt   count,\n                 FT_Long*  stems )\n  {\n    if ( !hints->error )\n    {\n      /* limit \"dimension\" to 0..1 */\n      if ( dimension < 0 || dimension > 1 )\n      {\n        FT_TRACE0(( \"ps_hints_stem: invalid dimension (%d) used\\n\",\n                    dimension ));\n        dimension = ( dimension != 0 );\n      }\n\n      /* record the stems in the current hints/masks table */\n      switch ( hints->hint_type )\n      {\n      case PS_HINT_TYPE_1:  /* Type 1 \"hstem\" or \"vstem\" operator */\n      case PS_HINT_TYPE_2:  /* Type 2 \"hstem\" or \"vstem\" operator */\n        {\n          PS_Dimension  dim = &hints->dimension[dimension];\n\n\n          for ( ; count > 0; count--, stems += 2 )\n          {\n            FT_Error   error;\n            FT_Memory  memory = hints->memory;\n\n\n            error = ps_dimension_add_t1stem(\n                      dim, (FT_Int)stems[0], (FT_Int)stems[1],\n                      memory, NULL );\n            if ( error )\n            {\n              FT_ERROR(( \"ps_hints_stem: could not add stem\"\n                         \" (%d,%d) to hints table\\n\", stems[0], stems[1] ));\n\n              hints->error = error;\n              return;\n            }\n          }\n          break;\n        }\n\n      default:\n        FT_TRACE0(( \"ps_hints_stem: called with invalid hint type (%d)\\n\",\n                    hints->hint_type ));\n        break;\n      }\n    }\n  }\n\n\n  /* add one Type1 counter stem to the current hints table */\n  static void\n  ps_hints_t1stem3( PS_Hints   hints,\n                    FT_Int     dimension,\n                    FT_Fixed*  stems )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( !hints->error )\n    {\n      PS_Dimension  dim;\n      FT_Memory     memory = hints->memory;\n      FT_Int        count;\n      FT_Int        idx[3];\n\n\n      /* limit \"dimension\" to 0..1 */\n      if ( dimension < 0 || dimension > 1 )\n      {\n        FT_TRACE0(( \"ps_hints_t1stem3: invalid dimension (%d) used\\n\",\n                    dimension ));\n        dimension = ( dimension != 0 );\n      }\n\n      dim = &hints->dimension[dimension];\n\n      /* there must be 6 elements in the 'stem' array */\n      if ( hints->hint_type == PS_HINT_TYPE_1 )\n      {\n        /* add the three stems to our hints/masks table */\n        for ( count = 0; count < 3; count++, stems += 2 )\n        {\n          error = ps_dimension_add_t1stem( dim,\n                                           (FT_Int)FIXED_TO_INT( stems[0] ),\n                                           (FT_Int)FIXED_TO_INT( stems[1] ),\n                                           memory, &idx[count] );\n          if ( error )\n            goto Fail;\n        }\n\n        /* now, add the hints to the counters table */\n        error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2],\n                                          memory );\n        if ( error )\n          goto Fail;\n      }\n      else\n      {\n        FT_ERROR(( \"ps_hints_t1stem3: called with invalid hint type\\n\" ));\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n    }\n\n    return;\n\n  Fail:\n    FT_ERROR(( \"ps_hints_t1stem3: could not add counter stems to table\\n\" ));\n    hints->error = error;\n  }\n\n\n  /* reset hints (only with Type 1 hints) */\n  static void\n  ps_hints_t1reset( PS_Hints  hints,\n                    FT_UInt   end_point )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( !hints->error )\n    {\n      FT_Memory  memory = hints->memory;\n\n\n      if ( hints->hint_type == PS_HINT_TYPE_1 )\n      {\n        error = ps_dimension_reset_mask( &hints->dimension[0],\n                                         end_point, memory );\n        if ( error )\n          goto Fail;\n\n        error = ps_dimension_reset_mask( &hints->dimension[1],\n                                         end_point, memory );\n        if ( error )\n          goto Fail;\n      }\n      else\n      {\n        /* invalid hint type */\n        error = FT_THROW( Invalid_Argument );\n        goto Fail;\n      }\n    }\n    return;\n\n  Fail:\n    hints->error = error;\n  }\n\n\n  /* Type2 \"hintmask\" operator, add a new hintmask to each direction */\n  static void\n  ps_hints_t2mask( PS_Hints        hints,\n                   FT_UInt         end_point,\n                   FT_UInt         bit_count,\n                   const FT_Byte*  bytes )\n  {\n    FT_Error  error;\n\n\n    if ( !hints->error )\n    {\n      PS_Dimension  dim    = hints->dimension;\n      FT_Memory     memory = hints->memory;\n      FT_UInt       count1 = dim[0].hints.num_hints;\n      FT_UInt       count2 = dim[1].hints.num_hints;\n\n\n      /* check bit count; must be equal to current total hint count */\n      if ( bit_count !=  count1 + count2 )\n      {\n        FT_TRACE0(( \"ps_hints_t2mask:\"\n                    \" called with invalid bitcount %d (instead of %d)\\n\",\n                   bit_count, count1 + count2 ));\n\n        /* simply ignore the operator */\n        return;\n      }\n\n      /* set-up new horizontal and vertical hint mask now */\n      error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1,\n                                          end_point, memory );\n      if ( error )\n        goto Fail;\n\n      error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2,\n                                          end_point, memory );\n      if ( error )\n        goto Fail;\n    }\n    return;\n\n  Fail:\n    hints->error = error;\n  }\n\n\n  static void\n  ps_hints_t2counter( PS_Hints        hints,\n                      FT_UInt         bit_count,\n                      const FT_Byte*  bytes )\n  {\n    FT_Error  error;\n\n\n    if ( !hints->error )\n    {\n      PS_Dimension  dim    = hints->dimension;\n      FT_Memory     memory = hints->memory;\n      FT_UInt       count1 = dim[0].hints.num_hints;\n      FT_UInt       count2 = dim[1].hints.num_hints;\n\n\n      /* check bit count, must be equal to current total hint count */\n      if ( bit_count !=  count1 + count2 )\n      {\n        FT_TRACE0(( \"ps_hints_t2counter:\"\n                    \" called with invalid bitcount %d (instead of %d)\\n\",\n                   bit_count, count1 + count2 ));\n\n        /* simply ignore the operator */\n        return;\n      }\n\n      /* set-up new horizontal and vertical hint mask now */\n      error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1,\n                                          0, memory );\n      if ( error )\n        goto Fail;\n\n      error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2,\n                                          0, memory );\n      if ( error )\n        goto Fail;\n    }\n    return;\n\n  Fail:\n    hints->error = error;\n  }\n\n\n  /* end recording session */\n  static FT_Error\n  ps_hints_close( PS_Hints  hints,\n                  FT_UInt   end_point )\n  {\n    FT_Error  error;\n\n\n    error = hints->error;\n    if ( !error )\n    {\n      FT_Memory     memory = hints->memory;\n      PS_Dimension  dim    = hints->dimension;\n\n\n      error = ps_dimension_end( &dim[0], end_point, memory );\n      if ( !error )\n      {\n        error = ps_dimension_end( &dim[1], end_point, memory );\n      }\n    }\n\n#ifdef DEBUG_HINTER\n    if ( !error )\n      ps_debug_hints = hints;\n#endif\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                TYPE 1 HINTS RECORDING INTERFACE               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  t1_hints_open( T1_Hints  hints )\n  {\n    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 );\n  }\n\n  static void\n  t1_hints_stem( T1_Hints   hints,\n                 FT_Int     dimension,\n                 FT_Fixed*  coords )\n  {\n    FT_Pos  stems[2];\n\n\n    stems[0] = FIXED_TO_INT( coords[0] );\n    stems[1] = FIXED_TO_INT( coords[1] );\n\n    ps_hints_stem( (PS_Hints)hints, dimension, 1, stems );\n  }\n\n\n  FT_LOCAL_DEF( void )\n  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs )\n  {\n    FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) );\n\n    funcs->open  = (T1_Hints_OpenFunc)    t1_hints_open;\n    funcs->close = (T1_Hints_CloseFunc)   ps_hints_close;\n    funcs->stem  = (T1_Hints_SetStemFunc) t1_hints_stem;\n    funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3;\n    funcs->reset = (T1_Hints_ResetFunc)   ps_hints_t1reset;\n    funcs->apply = (T1_Hints_ApplyFunc)   ps_hints_apply;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                TYPE 2 HINTS RECORDING INTERFACE               *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static void\n  t2_hints_open( T2_Hints  hints )\n  {\n    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 );\n  }\n\n\n  static void\n  t2_hints_stems( T2_Hints   hints,\n                  FT_Int     dimension,\n                  FT_Int     count,\n                  FT_Fixed*  coords )\n  {\n    FT_Pos  stems[32], y, n;\n    FT_Int  total = count;\n\n\n    y = 0;\n    while ( total > 0 )\n    {\n      /* determine number of stems to write */\n      count = total;\n      if ( count > 16 )\n        count = 16;\n\n      /* compute integer stem positions in font units */\n      for ( n = 0; n < count * 2; n++ )\n      {\n        y       += coords[n];\n        stems[n] = FIXED_TO_INT( y );\n      }\n\n      /* compute lengths */\n      for ( n = 0; n < count * 2; n += 2 )\n        stems[n + 1] = stems[n + 1] - stems[n];\n\n      /* add them to the current dimension */\n      ps_hints_stem( (PS_Hints)hints, dimension, count, stems );\n\n      total -= count;\n    }\n  }\n\n\n  FT_LOCAL_DEF( void )\n  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs )\n  {\n    FT_MEM_ZERO( funcs, sizeof ( *funcs ) );\n\n    funcs->open    = (T2_Hints_OpenFunc)   t2_hints_open;\n    funcs->close   = (T2_Hints_CloseFunc)  ps_hints_close;\n    funcs->stems   = (T2_Hints_StemsFunc)  t2_hints_stems;\n    funcs->hintmask= (T2_Hints_MaskFunc)   ps_hints_t2mask;\n    funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter;\n    funcs->apply   = (T2_Hints_ApplyFunc)  ps_hints_apply;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/pshrec.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pshrec.h                                                               */\n/*                                                                         */\n/*    Postscript (Type1/Type2) hints recorder (specification).             */\n/*                                                                         */\n/*  Copyright 2001, 2002, 2003, 2006, 2008 by                              */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /**************************************************************************/\n  /*                                                                        */\n  /*  The functions defined here are called from the Type 1, CID and CFF    */\n  /*  font drivers to record the hints of a given character/glyph.          */\n  /*                                                                        */\n  /*  The hints are recorded in a unified format, and are later processed   */\n  /*  by the `optimizer' and `fitter' to adjust the outlines to the pixel   */\n  /*  grid.                                                                 */\n  /*                                                                        */\n  /**************************************************************************/\n\n\n#ifndef __PSHREC_H__\n#define __PSHREC_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n#include \"pshglob.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                 GLYPH HINTS RECORDER INTERNALS                *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* handle to hint record */\n  typedef struct PS_HintRec_*  PS_Hint;\n\n  /* hint types */\n  typedef enum  PS_Hint_Type_\n  {\n    PS_HINT_TYPE_1 = 1,\n    PS_HINT_TYPE_2 = 2\n\n  } PS_Hint_Type;\n\n\n  /* hint flags */\n  typedef enum  PS_Hint_Flags_\n  {\n    PS_HINT_FLAG_GHOST  = 1,\n    PS_HINT_FLAG_BOTTOM = 2\n\n  } PS_Hint_Flags;\n\n\n  /* hint descriptor */\n  typedef struct  PS_HintRec_\n  {\n    FT_Int   pos;\n    FT_Int   len;\n    FT_UInt  flags;\n\n  } PS_HintRec;\n\n\n#define ps_hint_is_active( x )  ( (x)->flags & PS_HINT_FLAG_ACTIVE )\n#define ps_hint_is_ghost( x )   ( (x)->flags & PS_HINT_FLAG_GHOST  )\n#define ps_hint_is_bottom( x )  ( (x)->flags & PS_HINT_FLAG_BOTTOM )\n\n\n  /* hints table descriptor */\n  typedef struct  PS_Hint_TableRec_\n  {\n    FT_UInt  num_hints;\n    FT_UInt  max_hints;\n    PS_Hint  hints;\n\n  } PS_Hint_TableRec, *PS_Hint_Table;\n\n\n  /* hint and counter mask descriptor */\n  typedef struct  PS_MaskRec_\n  {\n    FT_UInt   num_bits;\n    FT_UInt   max_bits;\n    FT_Byte*  bytes;\n    FT_UInt   end_point;\n\n  } PS_MaskRec, *PS_Mask;\n\n\n  /* masks and counters table descriptor */\n  typedef struct  PS_Mask_TableRec_\n  {\n    FT_UInt  num_masks;\n    FT_UInt  max_masks;\n    PS_Mask  masks;\n\n  } PS_Mask_TableRec, *PS_Mask_Table;\n\n\n /* dimension-specific hints descriptor */\n  typedef struct  PS_DimensionRec_\n  {\n    PS_Hint_TableRec  hints;\n    PS_Mask_TableRec  masks;\n    PS_Mask_TableRec  counters;\n\n  } PS_DimensionRec, *PS_Dimension;\n\n\n  /* glyph hints descriptor                                */\n  /* dimension 0 => X coordinates + vertical hints/stems   */\n  /* dimension 1 => Y coordinates + horizontal hints/stems */\n  typedef struct  PS_HintsRec_\n  {\n    FT_Memory        memory;\n    FT_Error         error;\n    FT_UInt32        magic;\n    PS_Hint_Type     hint_type;\n    PS_DimensionRec  dimension[2];\n\n  } PS_HintsRec, *PS_Hints;\n\n  /* */\n\n  /* initialize hints recorder */\n  FT_LOCAL( FT_Error )\n  ps_hints_init( PS_Hints   hints,\n                 FT_Memory  memory );\n\n  /* finalize hints recorder */\n  FT_LOCAL( void )\n  ps_hints_done( PS_Hints  hints );\n\n  /* initialize Type1 hints recorder interface */\n  FT_LOCAL( void )\n  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs );\n\n  /* initialize Type2 hints recorder interface */\n  FT_LOCAL( void )\n  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs );\n\n\n#ifdef DEBUG_HINTER\n  extern PS_Hints  ps_debug_hints;\n  extern  int      ps_debug_no_horz_hints;\n  extern  int      ps_debug_no_vert_hints;\n#endif\n\n /* */\n\n\nFT_END_HEADER\n\n\n#endif /* __PS_HINTER_RECORD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/pshinter/rules.mk",
    "content": "#\n# FreeType 2 PSHinter driver configuration rules\n#\n\n\n# Copyright 2001, 2003, 2011 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# PSHINTER driver directory\n#\nPSHINTER_DIR := $(SRC_DIR)/pshinter\n\n\n# compilation flags for the driver\n#\nPSHINTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSHINTER_DIR))\n\n\n# PSHINTER driver sources (i.e., C files)\n#\nPSHINTER_DRV_SRC := $(PSHINTER_DIR)/pshalgo.c \\\n                    $(PSHINTER_DIR)/pshglob.c \\\n                    $(PSHINTER_DIR)/pshmod.c  \\\n                    $(PSHINTER_DIR)/pshpic.c  \\\n                    $(PSHINTER_DIR)/pshrec.c\n\n\n# PSHINTER driver headers\n#\nPSHINTER_DRV_H := $(PSHINTER_DRV_SRC:%c=%h) \\\n                  $(PSHINTER_DIR)/pshnterr.h\n\n\n# PSHINTER driver object(s)\n#\n#   PSHINTER_DRV_OBJ_M is used during `multi' builds.\n#   PSHINTER_DRV_OBJ_S is used during `single' builds.\n#\nPSHINTER_DRV_OBJ_M := $(PSHINTER_DRV_SRC:$(PSHINTER_DIR)/%.c=$(OBJ_DIR)/%.$O)\nPSHINTER_DRV_OBJ_S := $(OBJ_DIR)/pshinter.$O\n\n# PSHINTER driver source file for single build\n#\nPSHINTER_DRV_SRC_S := $(PSHINTER_DIR)/pshinter.c\n\n\n# PSHINTER driver - single object\n#\n$(PSHINTER_DRV_OBJ_S): $(PSHINTER_DRV_SRC_S) $(PSHINTER_DRV_SRC) \\\n                       $(FREETYPE_H) $(PSHINTER_DRV_H)\n\t$(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSHINTER_DRV_SRC_S))\n\n\n# PSHINTER driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(PSHINTER_DIR)/%.c $(FREETYPE_H) $(PSHINTER_DRV_H)\n\t$(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(PSHINTER_DRV_OBJ_S)\nDRV_OBJS_M += $(PSHINTER_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/psnames/Jamfile",
    "content": "# FreeType 2 src/psnames Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) psnames ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = psmodule pspic ;\n  }\n  else\n  {\n    _sources = psnames ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/psnames Jamfile\n"
  },
  {
    "path": "libs/freetype/src/psnames/module.mk",
    "content": "#\n# FreeType 2 PSnames module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += PSNAMES_MODULE\n\ndefine PSNAMES_MODULE\n$(OPEN_DRIVER) FT_Module_Class, psnames_module_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)psnames   $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/psnames/psmodule.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psmodule.c                                                             */\n/*                                                                         */\n/*    PSNames module implementation (body).                                */\n/*                                                                         */\n/*  Copyright 1996-2003, 2005-2008, 2012, 2013 by                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n\n#include \"psmodule.h\"\n#include \"pstables.h\"\n\n#include \"psnamerr.h\"\n#include \"pspic.h\"\n\n\n#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n\n#define VARIANT_BIT         0x80000000UL\n#define BASE_GLYPH( code )  ( (FT_UInt32)( (code) & ~VARIANT_BIT ) )\n\n\n  /* Return the Unicode value corresponding to a given glyph.  Note that */\n  /* we do deal with glyph variants by detecting a non-initial dot in    */\n  /* the name, as in `A.swash' or `e.final'; in this case, the           */\n  /* VARIANT_BIT is set in the return value.                             */\n  /*                                                                     */\n  static FT_UInt32\n  ps_unicode_value( const char*  glyph_name )\n  {\n    /* If the name begins with `uni', then the glyph name may be a */\n    /* hard-coded unicode character code.                          */\n    if ( glyph_name[0] == 'u' &&\n         glyph_name[1] == 'n' &&\n         glyph_name[2] == 'i' )\n    {\n      /* determine whether the next four characters following are */\n      /* hexadecimal.                                             */\n\n      /* XXX: Add code to deal with ligatures, i.e. glyph names like */\n      /*      `uniXXXXYYYYZZZZ'...                                   */\n\n      FT_Int       count;\n      FT_UInt32    value = 0;\n      const char*  p     = glyph_name + 3;\n\n\n      for ( count = 4; count > 0; count--, p++ )\n      {\n        char          c = *p;\n        unsigned int  d;\n\n\n        d = (unsigned char)c - '0';\n        if ( d >= 10 )\n        {\n          d = (unsigned char)c - 'A';\n          if ( d >= 6 )\n            d = 16;\n          else\n            d += 10;\n        }\n\n        /* Exit if a non-uppercase hexadecimal character was found   */\n        /* -- this also catches character codes below `0' since such */\n        /* negative numbers cast to `unsigned int' are far too big.  */\n        if ( d >= 16 )\n          break;\n\n        value = ( value << 4 ) + d;\n      }\n\n      /* there must be exactly four hex digits */\n      if ( count == 0 )\n      {\n        if ( *p == '\\0' )\n          return value;\n        if ( *p == '.' )\n          return (FT_UInt32)( value | VARIANT_BIT );\n      }\n    }\n\n    /* If the name begins with `u', followed by four to six uppercase */\n    /* hexadecimal digits, it is a hard-coded unicode character code. */\n    if ( glyph_name[0] == 'u' )\n    {\n      FT_Int       count;\n      FT_UInt32    value = 0;\n      const char*  p     = glyph_name + 1;\n\n\n      for ( count = 6; count > 0; count--, p++ )\n      {\n        char          c = *p;\n        unsigned int  d;\n\n\n        d = (unsigned char)c - '0';\n        if ( d >= 10 )\n        {\n          d = (unsigned char)c - 'A';\n          if ( d >= 6 )\n            d = 16;\n          else\n            d += 10;\n        }\n\n        if ( d >= 16 )\n          break;\n\n        value = ( value << 4 ) + d;\n      }\n\n      if ( count <= 2 )\n      {\n        if ( *p == '\\0' )\n          return value;\n        if ( *p == '.' )\n          return (FT_UInt32)( value | VARIANT_BIT );\n      }\n    }\n\n    /* Look for a non-initial dot in the glyph name in order to */\n    /* find variants like `A.swash', `e.final', etc.            */\n    {\n      const char*  p   = glyph_name;\n      const char*  dot = NULL;\n\n\n      for ( ; *p; p++ )\n      {\n        if ( *p == '.' && p > glyph_name )\n        {\n          dot = p;\n          break;\n        }\n      }\n\n      /* now look up the glyph in the Adobe Glyph List */\n      if ( !dot )\n        return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p );\n      else\n        return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) |\n                            VARIANT_BIT );\n    }\n  }\n\n\n  /* ft_qsort callback to sort the unicode map */\n  FT_CALLBACK_DEF( int )\n  compare_uni_maps( const void*  a,\n                    const void*  b )\n  {\n    PS_UniMap*  map1 = (PS_UniMap*)a;\n    PS_UniMap*  map2 = (PS_UniMap*)b;\n    FT_UInt32   unicode1 = BASE_GLYPH( map1->unicode );\n    FT_UInt32   unicode2 = BASE_GLYPH( map2->unicode );\n\n\n    /* sort base glyphs before glyph variants */\n    if ( unicode1 == unicode2 )\n    {\n      if ( map1->unicode > map2->unicode )\n        return 1;\n      else if ( map1->unicode < map2->unicode )\n        return -1;\n      else\n        return 0;\n    }\n    else\n    {\n      if ( unicode1 > unicode2 )\n        return 1;\n      else if ( unicode1 < unicode2 )\n        return -1;\n      else\n        return 0;\n    }\n  }\n\n\n  /* support for extra glyphs not handled (well) in AGL; */\n  /* we add extra mappings for them if necessary         */\n\n#define EXTRA_GLYPH_LIST_SIZE  10\n\n  static const FT_UInt32  ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] =\n  {\n    /* WGL 4 */\n    0x0394,\n    0x03A9,\n    0x2215,\n    0x00AD,\n    0x02C9,\n    0x03BC,\n    0x2219,\n    0x00A0,\n    /* Romanian */\n    0x021A,\n    0x021B\n  };\n\n  static const char  ft_extra_glyph_names[] =\n  {\n    'D','e','l','t','a',0,\n    'O','m','e','g','a',0,\n    'f','r','a','c','t','i','o','n',0,\n    'h','y','p','h','e','n',0,\n    'm','a','c','r','o','n',0,\n    'm','u',0,\n    'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,\n    's','p','a','c','e',0,\n    'T','c','o','m','m','a','a','c','c','e','n','t',0,\n    't','c','o','m','m','a','a','c','c','e','n','t',0\n  };\n\n  static const FT_Int\n  ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] =\n  {\n     0,\n     6,\n    12,\n    21,\n    28,\n    35,\n    38,\n    53,\n    59,\n    72\n  };\n\n\n  static void\n  ps_check_extra_glyph_name( const char*  gname,\n                             FT_UInt      glyph,\n                             FT_UInt*     extra_glyphs,\n                             FT_UInt     *states )\n  {\n    FT_UInt  n;\n\n\n    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )\n    {\n      if ( ft_strcmp( ft_extra_glyph_names +\n                        ft_extra_glyph_name_offsets[n], gname ) == 0 )\n      {\n        if ( states[n] == 0 )\n        {\n          /* mark this extra glyph as a candidate for the cmap */\n          states[n]     = 1;\n          extra_glyphs[n] = glyph;\n        }\n\n        return;\n      }\n    }\n  }\n\n\n  static void\n  ps_check_extra_glyph_unicode( FT_UInt32  uni_char,\n                                FT_UInt   *states )\n  {\n    FT_UInt  n;\n\n\n    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )\n    {\n      if ( uni_char == ft_extra_glyph_unicodes[n] )\n      {\n        /* disable this extra glyph from being added to the cmap */\n        states[n] = 2;\n\n        return;\n      }\n    }\n  }\n\n\n  /* Build a table that maps Unicode values to glyph indices. */\n  static FT_Error\n  ps_unicodes_init( FT_Memory             memory,\n                    PS_Unicodes           table,\n                    FT_UInt               num_glyphs,\n                    PS_GetGlyphNameFunc   get_glyph_name,\n                    PS_FreeGlyphNameFunc  free_glyph_name,\n                    FT_Pointer            glyph_data )\n  {\n    FT_Error  error;\n\n    FT_UInt  extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\n    FT_UInt  extra_glyphs[EXTRA_GLYPH_LIST_SIZE];\n\n\n    /* we first allocate the table */\n    table->num_maps = 0;\n    table->maps     = 0;\n\n    if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) )\n    {\n      FT_UInt     n;\n      FT_UInt     count;\n      PS_UniMap*  map;\n      FT_UInt32   uni_char;\n\n\n      map = table->maps;\n\n      for ( n = 0; n < num_glyphs; n++ )\n      {\n        const char*  gname = get_glyph_name( glyph_data, n );\n\n\n        if ( gname )\n        {\n          ps_check_extra_glyph_name( gname, n,\n                                     extra_glyphs, extra_glyph_list_states );\n          uni_char = ps_unicode_value( gname );\n\n          if ( BASE_GLYPH( uni_char ) != 0 )\n          {\n            ps_check_extra_glyph_unicode( uni_char,\n                                          extra_glyph_list_states );\n            map->unicode     = uni_char;\n            map->glyph_index = n;\n            map++;\n          }\n\n          if ( free_glyph_name )\n            free_glyph_name( glyph_data, gname );\n        }\n      }\n\n      for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )\n      {\n        if ( extra_glyph_list_states[n] == 1 )\n        {\n          /* This glyph name has an additional representation. */\n          /* Add it to the cmap.                               */\n\n          map->unicode     = ft_extra_glyph_unicodes[n];\n          map->glyph_index = extra_glyphs[n];\n          map++;\n        }\n      }\n\n      /* now compress the table a bit */\n      count = (FT_UInt)( map - table->maps );\n\n      if ( count == 0 )\n      {\n        /* No unicode chars here! */\n        FT_FREE( table->maps );\n        if ( !error )\n          error = FT_THROW( No_Unicode_Glyph_Name );\n      }\n      else\n      {\n        /* Reallocate if the number of used entries is much smaller. */\n        if ( count < num_glyphs / 2 )\n        {\n          (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count );\n          error = FT_Err_Ok;\n        }\n\n        /* Sort the table in increasing order of unicode values, */\n        /* taking care of glyph variants.                        */\n        ft_qsort( table->maps, count, sizeof ( PS_UniMap ),\n                  compare_uni_maps );\n      }\n\n      table->num_maps = count;\n    }\n\n    return error;\n  }\n\n\n  static FT_UInt\n  ps_unicodes_char_index( PS_Unicodes  table,\n                          FT_UInt32    unicode )\n  {\n    PS_UniMap  *min, *max, *mid, *result = NULL;\n\n\n    /* Perform a binary search on the table. */\n\n    min = table->maps;\n    max = min + table->num_maps - 1;\n\n    while ( min <= max )\n    {\n      FT_UInt32  base_glyph;\n\n\n      mid = min + ( ( max - min ) >> 1 );\n\n      if ( mid->unicode == unicode )\n      {\n        result = mid;\n        break;\n      }\n\n      base_glyph = BASE_GLYPH( mid->unicode );\n\n      if ( base_glyph == unicode )\n        result = mid; /* remember match but continue search for base glyph */\n\n      if ( min == max )\n        break;\n\n      if ( base_glyph < unicode )\n        min = mid + 1;\n      else\n        max = mid - 1;\n    }\n\n    if ( result )\n      return result->glyph_index;\n    else\n      return 0;\n  }\n\n\n  static FT_UInt32\n  ps_unicodes_char_next( PS_Unicodes  table,\n                         FT_UInt32   *unicode )\n  {\n    FT_UInt    result    = 0;\n    FT_UInt32  char_code = *unicode + 1;\n\n\n    {\n      FT_UInt     min = 0;\n      FT_UInt     max = table->num_maps;\n      FT_UInt     mid;\n      PS_UniMap*  map;\n      FT_UInt32   base_glyph;\n\n\n      while ( min < max )\n      {\n        mid = min + ( ( max - min ) >> 1 );\n        map = table->maps + mid;\n\n        if ( map->unicode == char_code )\n        {\n          result = map->glyph_index;\n          goto Exit;\n        }\n\n        base_glyph = BASE_GLYPH( map->unicode );\n\n        if ( base_glyph == char_code )\n          result = map->glyph_index;\n\n        if ( base_glyph < char_code )\n          min = mid + 1;\n        else\n          max = mid;\n      }\n\n      if ( result )\n        goto Exit;               /* we have a variant glyph */\n\n      /* we didn't find it; check whether we have a map just above it */\n      char_code = 0;\n\n      if ( min < table->num_maps )\n      {\n        map       = table->maps + min;\n        result    = map->glyph_index;\n        char_code = BASE_GLYPH( map->unicode );\n      }\n    }\n\n  Exit:\n    *unicode = char_code;\n    return result;\n  }\n\n\n#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */\n\n\n  static const char*\n  ps_get_macintosh_name( FT_UInt  name_index )\n  {\n    if ( name_index >= FT_NUM_MAC_NAMES )\n      name_index = 0;\n\n    return ft_standard_glyph_names + ft_mac_names[name_index];\n  }\n\n\n  static const char*\n  ps_get_standard_strings( FT_UInt  sid )\n  {\n    if ( sid >= FT_NUM_SID_NAMES )\n      return 0;\n\n    return ft_standard_glyph_names + ft_sid_names[sid];\n  }\n\n\n#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n  FT_DEFINE_SERVICE_PSCMAPSREC(\n    pscmaps_interface,\n    (PS_Unicode_ValueFunc)     ps_unicode_value,\n    (PS_Unicodes_InitFunc)     ps_unicodes_init,\n    (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index,\n    (PS_Unicodes_CharNextFunc) ps_unicodes_char_next,\n\n    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,\n    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,\n\n    t1_standard_encoding,\n    t1_expert_encoding )\n\n#else\n\n  FT_DEFINE_SERVICE_PSCMAPSREC(\n    pscmaps_interface,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,\n    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,\n\n    t1_standard_encoding,\n    t1_expert_encoding )\n\n#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */\n\n\n  FT_DEFINE_SERVICEDESCREC1(\n    pscmaps_services,\n    FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET )\n\n\n  static FT_Pointer\n  psnames_get_service( FT_Module    module,\n                       const char*  service_id )\n  {\n    /* PSCMAPS_SERVICES_GET derefers `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    FT_Library  library;\n\n\n    if ( !module )\n      return NULL;\n    library = module->library;\n    if ( !library )\n      return NULL;\n#else\n    FT_UNUSED( module );\n#endif\n\n    return ft_service_list_lookup( PSCMAPS_SERVICES_GET, service_id );\n  }\n\n#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */\n\n\n#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n#define PUT_PS_NAMES_SERVICE( a )  NULL\n#else\n#define PUT_PS_NAMES_SERVICE( a )  a\n#endif\n\n  FT_DEFINE_MODULE(\n    psnames_module_class,\n\n    0,  /* this is not a font driver, nor a renderer */\n    sizeof ( FT_ModuleRec ),\n\n    \"psnames\",  /* driver name                         */\n    0x10000L,   /* driver version                      */\n    0x20000L,   /* driver requires FreeType 2 or above */\n\n    PUT_PS_NAMES_SERVICE(\n      (void*)&PSCMAPS_INTERFACE_GET ),   /* module specific interface */\n    (FT_Module_Constructor)NULL,\n    (FT_Module_Destructor) NULL,\n    (FT_Module_Requester)  PUT_PS_NAMES_SERVICE( psnames_get_service ) )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psnames/psmodule.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psmodule.h                                                             */\n/*                                                                         */\n/*    High-level PSNames module interface (specification).                 */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSMODULE_H__\n#define __PSMODULE_H__\n\n\n#include <ft2build.h>\n#include FT_MODULE_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_MODULE( psnames_module_class )\n\n\nFT_END_HEADER\n\n#endif /* __PSMODULE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psnames/psnamerr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psnamerr.h                                                             */\n/*                                                                         */\n/*    PS names module error codes (specification only).                    */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the PS names module error enumeration     */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __PSNAMERR_H__\n#define __PSNAMERR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  PSnames_Err_\n#define FT_ERR_BASE    FT_Mod_Err_PSnames\n\n#include FT_ERRORS_H\n\n#endif /* __PSNAMERR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psnames/psnames.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  psnames.c                                                              */\n/*                                                                         */\n/*    FreeType PSNames module component (body only).                       */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"pspic.c\"\n#include \"psmodule.c\"\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psnames/pspic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pspic.c                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for psnames module.  */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"pspic.h\"\n#include \"psnamerr.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from psmodule.c */\n  FT_Error\n  FT_Create_Class_pscmaps_services( FT_Library           library,\n                                    FT_ServiceDescRec**  output_class );\n  void\n  FT_Destroy_Class_pscmaps_services( FT_Library          library,\n                                     FT_ServiceDescRec*  clazz );\n\n  void\n  FT_Init_Class_pscmaps_interface( FT_Library              library,\n                                   FT_Service_PsCMapsRec*  clazz );\n\n\n  void\n  psnames_module_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->psnames )\n    {\n      PSModulePIC*  container = (PSModulePIC*)pic_container->psnames;\n\n\n      if ( container->pscmaps_services )\n        FT_Destroy_Class_pscmaps_services( library,\n                                           container->pscmaps_services );\n      container->pscmaps_services = NULL;\n      FT_FREE( container );\n      pic_container->psnames = NULL;\n    }\n  }\n\n\n  FT_Error\n  psnames_module_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    PSModulePIC*       container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->psnames = container;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    error = FT_Create_Class_pscmaps_services(\n              library, &container->pscmaps_services );\n    if ( error )\n      goto Exit;\n    FT_Init_Class_pscmaps_interface( library,\n                                     &container->pscmaps_interface );\n\n  Exit:\n    if ( error )\n      psnames_module_class_pic_free( library );\n    return error;\n  }\n\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psnames/pspic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pspic.h                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for psnames module.  */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __PSPIC_H__\n#define __PSPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include FT_INTERNAL_PIC_H\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define PSCMAPS_SERVICES_GET   pscmaps_services\n#define PSCMAPS_INTERFACE_GET  pscmaps_interface\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n\n  typedef struct  PSModulePIC_\n  {\n    FT_ServiceDescRec*     pscmaps_services;\n    FT_Service_PsCMapsRec  pscmaps_interface;\n\n  } PSModulePIC;\n\n\n#define GET_PIC( lib )                                     \\\n          ( (PSModulePIC*)((lib)->pic_container.psnames) )\n#define PSCMAPS_SERVICES_GET   ( GET_PIC( library )->pscmaps_services )\n#define PSCMAPS_INTERFACE_GET  ( GET_PIC( library )->pscmaps_interface )\n\n\n  /* see pspic.c for the implementation */\n  void\n  psnames_module_class_pic_free( FT_Library  library );\n\n  FT_Error\n  psnames_module_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __PSPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psnames/pstables.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  pstables.h                                                             */\n/*                                                                         */\n/*    PostScript glyph names.                                              */\n/*                                                                         */\n/*  Copyright 2005, 2008, 2011 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /* This file has been generated automatically -- do not edit! */\n\n\n  static const char  ft_standard_glyph_names[3696] =\n  {\n    '.','n','u','l','l', 0,\n    'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0,\n    'n','o','t','e','q','u','a','l', 0,\n    'i','n','f','i','n','i','t','y', 0,\n    'l','e','s','s','e','q','u','a','l', 0,\n    'g','r','e','a','t','e','r','e','q','u','a','l', 0,\n    'p','a','r','t','i','a','l','d','i','f','f', 0,\n    's','u','m','m','a','t','i','o','n', 0,\n    'p','r','o','d','u','c','t', 0,\n    'p','i', 0,\n    'i','n','t','e','g','r','a','l', 0,\n    'O','m','e','g','a', 0,\n    'r','a','d','i','c','a','l', 0,\n    'a','p','p','r','o','x','e','q','u','a','l', 0,\n    'D','e','l','t','a', 0,\n    'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0,\n    'l','o','z','e','n','g','e', 0,\n    'a','p','p','l','e', 0,\n    'f','r','a','n','c', 0,\n    'G','b','r','e','v','e', 0,\n    'g','b','r','e','v','e', 0,\n    'I','d','o','t','a','c','c','e','n','t', 0,\n    'S','c','e','d','i','l','l','a', 0,\n    's','c','e','d','i','l','l','a', 0,\n    'C','a','c','u','t','e', 0,\n    'c','a','c','u','t','e', 0,\n    'C','c','a','r','o','n', 0,\n    'c','c','a','r','o','n', 0,\n    'd','c','r','o','a','t', 0,\n    '.','n','o','t','d','e','f', 0,\n    's','p','a','c','e', 0,\n    'e','x','c','l','a','m', 0,\n    'q','u','o','t','e','d','b','l', 0,\n    'n','u','m','b','e','r','s','i','g','n', 0,\n    'd','o','l','l','a','r', 0,\n    'p','e','r','c','e','n','t', 0,\n    'a','m','p','e','r','s','a','n','d', 0,\n    'q','u','o','t','e','r','i','g','h','t', 0,\n    'p','a','r','e','n','l','e','f','t', 0,\n    'p','a','r','e','n','r','i','g','h','t', 0,\n    'a','s','t','e','r','i','s','k', 0,\n    'p','l','u','s', 0,\n    'c','o','m','m','a', 0,\n    'h','y','p','h','e','n', 0,\n    'p','e','r','i','o','d', 0,\n    's','l','a','s','h', 0,\n    'z','e','r','o', 0,\n    'o','n','e', 0,\n    't','w','o', 0,\n    't','h','r','e','e', 0,\n    'f','o','u','r', 0,\n    'f','i','v','e', 0,\n    's','i','x', 0,\n    's','e','v','e','n', 0,\n    'e','i','g','h','t', 0,\n    'n','i','n','e', 0,\n    'c','o','l','o','n', 0,\n    's','e','m','i','c','o','l','o','n', 0,\n    'l','e','s','s', 0,\n    'e','q','u','a','l', 0,\n    'g','r','e','a','t','e','r', 0,\n    'q','u','e','s','t','i','o','n', 0,\n    'a','t', 0,\n    'A', 0,\n    'B', 0,\n    'C', 0,\n    'D', 0,\n    'E', 0,\n    'F', 0,\n    'G', 0,\n    'H', 0,\n    'I', 0,\n    'J', 0,\n    'K', 0,\n    'L', 0,\n    'M', 0,\n    'N', 0,\n    'O', 0,\n    'P', 0,\n    'Q', 0,\n    'R', 0,\n    'S', 0,\n    'T', 0,\n    'U', 0,\n    'V', 0,\n    'W', 0,\n    'X', 0,\n    'Y', 0,\n    'Z', 0,\n    'b','r','a','c','k','e','t','l','e','f','t', 0,\n    'b','a','c','k','s','l','a','s','h', 0,\n    'b','r','a','c','k','e','t','r','i','g','h','t', 0,\n    'a','s','c','i','i','c','i','r','c','u','m', 0,\n    'u','n','d','e','r','s','c','o','r','e', 0,\n    'q','u','o','t','e','l','e','f','t', 0,\n    'a', 0,\n    'b', 0,\n    'c', 0,\n    'd', 0,\n    'e', 0,\n    'f', 0,\n    'g', 0,\n    'h', 0,\n    'i', 0,\n    'j', 0,\n    'k', 0,\n    'l', 0,\n    'm', 0,\n    'n', 0,\n    'o', 0,\n    'p', 0,\n    'q', 0,\n    'r', 0,\n    's', 0,\n    't', 0,\n    'u', 0,\n    'v', 0,\n    'w', 0,\n    'x', 0,\n    'y', 0,\n    'z', 0,\n    'b','r','a','c','e','l','e','f','t', 0,\n    'b','a','r', 0,\n    'b','r','a','c','e','r','i','g','h','t', 0,\n    'a','s','c','i','i','t','i','l','d','e', 0,\n    'e','x','c','l','a','m','d','o','w','n', 0,\n    'c','e','n','t', 0,\n    's','t','e','r','l','i','n','g', 0,\n    'f','r','a','c','t','i','o','n', 0,\n    'y','e','n', 0,\n    'f','l','o','r','i','n', 0,\n    's','e','c','t','i','o','n', 0,\n    'c','u','r','r','e','n','c','y', 0,\n    'q','u','o','t','e','s','i','n','g','l','e', 0,\n    'q','u','o','t','e','d','b','l','l','e','f','t', 0,\n    'g','u','i','l','l','e','m','o','t','l','e','f','t', 0,\n    'g','u','i','l','s','i','n','g','l','l','e','f','t', 0,\n    'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0,\n    'f','i', 0,\n    'f','l', 0,\n    'e','n','d','a','s','h', 0,\n    'd','a','g','g','e','r', 0,\n    'd','a','g','g','e','r','d','b','l', 0,\n    'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0,\n    'p','a','r','a','g','r','a','p','h', 0,\n    'b','u','l','l','e','t', 0,\n    'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0,\n    'q','u','o','t','e','d','b','l','b','a','s','e', 0,\n    'q','u','o','t','e','d','b','l','r','i','g','h','t', 0,\n    'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0,\n    'e','l','l','i','p','s','i','s', 0,\n    'p','e','r','t','h','o','u','s','a','n','d', 0,\n    'q','u','e','s','t','i','o','n','d','o','w','n', 0,\n    'g','r','a','v','e', 0,\n    'a','c','u','t','e', 0,\n    'c','i','r','c','u','m','f','l','e','x', 0,\n    't','i','l','d','e', 0,\n    'm','a','c','r','o','n', 0,\n    'b','r','e','v','e', 0,\n    'd','o','t','a','c','c','e','n','t', 0,\n    'd','i','e','r','e','s','i','s', 0,\n    'r','i','n','g', 0,\n    'c','e','d','i','l','l','a', 0,\n    'h','u','n','g','a','r','u','m','l','a','u','t', 0,\n    'o','g','o','n','e','k', 0,\n    'c','a','r','o','n', 0,\n    'e','m','d','a','s','h', 0,\n    'A','E', 0,\n    'o','r','d','f','e','m','i','n','i','n','e', 0,\n    'L','s','l','a','s','h', 0,\n    'O','s','l','a','s','h', 0,\n    'O','E', 0,\n    'o','r','d','m','a','s','c','u','l','i','n','e', 0,\n    'a','e', 0,\n    'd','o','t','l','e','s','s','i', 0,\n    'l','s','l','a','s','h', 0,\n    'o','s','l','a','s','h', 0,\n    'o','e', 0,\n    'g','e','r','m','a','n','d','b','l','s', 0,\n    'o','n','e','s','u','p','e','r','i','o','r', 0,\n    'l','o','g','i','c','a','l','n','o','t', 0,\n    'm','u', 0,\n    't','r','a','d','e','m','a','r','k', 0,\n    'E','t','h', 0,\n    'o','n','e','h','a','l','f', 0,\n    'p','l','u','s','m','i','n','u','s', 0,\n    'T','h','o','r','n', 0,\n    'o','n','e','q','u','a','r','t','e','r', 0,\n    'd','i','v','i','d','e', 0,\n    'b','r','o','k','e','n','b','a','r', 0,\n    'd','e','g','r','e','e', 0,\n    't','h','o','r','n', 0,\n    't','h','r','e','e','q','u','a','r','t','e','r','s', 0,\n    't','w','o','s','u','p','e','r','i','o','r', 0,\n    'r','e','g','i','s','t','e','r','e','d', 0,\n    'm','i','n','u','s', 0,\n    'e','t','h', 0,\n    'm','u','l','t','i','p','l','y', 0,\n    't','h','r','e','e','s','u','p','e','r','i','o','r', 0,\n    'c','o','p','y','r','i','g','h','t', 0,\n    'A','a','c','u','t','e', 0,\n    'A','c','i','r','c','u','m','f','l','e','x', 0,\n    'A','d','i','e','r','e','s','i','s', 0,\n    'A','g','r','a','v','e', 0,\n    'A','r','i','n','g', 0,\n    'A','t','i','l','d','e', 0,\n    'C','c','e','d','i','l','l','a', 0,\n    'E','a','c','u','t','e', 0,\n    'E','c','i','r','c','u','m','f','l','e','x', 0,\n    'E','d','i','e','r','e','s','i','s', 0,\n    'E','g','r','a','v','e', 0,\n    'I','a','c','u','t','e', 0,\n    'I','c','i','r','c','u','m','f','l','e','x', 0,\n    'I','d','i','e','r','e','s','i','s', 0,\n    'I','g','r','a','v','e', 0,\n    'N','t','i','l','d','e', 0,\n    'O','a','c','u','t','e', 0,\n    'O','c','i','r','c','u','m','f','l','e','x', 0,\n    'O','d','i','e','r','e','s','i','s', 0,\n    'O','g','r','a','v','e', 0,\n    'O','t','i','l','d','e', 0,\n    'S','c','a','r','o','n', 0,\n    'U','a','c','u','t','e', 0,\n    'U','c','i','r','c','u','m','f','l','e','x', 0,\n    'U','d','i','e','r','e','s','i','s', 0,\n    'U','g','r','a','v','e', 0,\n    'Y','a','c','u','t','e', 0,\n    'Y','d','i','e','r','e','s','i','s', 0,\n    'Z','c','a','r','o','n', 0,\n    'a','a','c','u','t','e', 0,\n    'a','c','i','r','c','u','m','f','l','e','x', 0,\n    'a','d','i','e','r','e','s','i','s', 0,\n    'a','g','r','a','v','e', 0,\n    'a','r','i','n','g', 0,\n    'a','t','i','l','d','e', 0,\n    'c','c','e','d','i','l','l','a', 0,\n    'e','a','c','u','t','e', 0,\n    'e','c','i','r','c','u','m','f','l','e','x', 0,\n    'e','d','i','e','r','e','s','i','s', 0,\n    'e','g','r','a','v','e', 0,\n    'i','a','c','u','t','e', 0,\n    'i','c','i','r','c','u','m','f','l','e','x', 0,\n    'i','d','i','e','r','e','s','i','s', 0,\n    'i','g','r','a','v','e', 0,\n    'n','t','i','l','d','e', 0,\n    'o','a','c','u','t','e', 0,\n    'o','c','i','r','c','u','m','f','l','e','x', 0,\n    'o','d','i','e','r','e','s','i','s', 0,\n    'o','g','r','a','v','e', 0,\n    'o','t','i','l','d','e', 0,\n    's','c','a','r','o','n', 0,\n    'u','a','c','u','t','e', 0,\n    'u','c','i','r','c','u','m','f','l','e','x', 0,\n    'u','d','i','e','r','e','s','i','s', 0,\n    'u','g','r','a','v','e', 0,\n    'y','a','c','u','t','e', 0,\n    'y','d','i','e','r','e','s','i','s', 0,\n    'z','c','a','r','o','n', 0,\n    'e','x','c','l','a','m','s','m','a','l','l', 0,\n    'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0,\n    'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0,\n    'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0,\n    'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0,\n    'A','c','u','t','e','s','m','a','l','l', 0,\n    'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0,\n    'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0,\n    't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0,\n    'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0,\n    'z','e','r','o','o','l','d','s','t','y','l','e', 0,\n    'o','n','e','o','l','d','s','t','y','l','e', 0,\n    't','w','o','o','l','d','s','t','y','l','e', 0,\n    't','h','r','e','e','o','l','d','s','t','y','l','e', 0,\n    'f','o','u','r','o','l','d','s','t','y','l','e', 0,\n    'f','i','v','e','o','l','d','s','t','y','l','e', 0,\n    's','i','x','o','l','d','s','t','y','l','e', 0,\n    's','e','v','e','n','o','l','d','s','t','y','l','e', 0,\n    'e','i','g','h','t','o','l','d','s','t','y','l','e', 0,\n    'n','i','n','e','o','l','d','s','t','y','l','e', 0,\n    'c','o','m','m','a','s','u','p','e','r','i','o','r', 0,\n    't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0,\n    'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0,\n    'q','u','e','s','t','i','o','n','s','m','a','l','l', 0,\n    'a','s','u','p','e','r','i','o','r', 0,\n    'b','s','u','p','e','r','i','o','r', 0,\n    'c','e','n','t','s','u','p','e','r','i','o','r', 0,\n    'd','s','u','p','e','r','i','o','r', 0,\n    'e','s','u','p','e','r','i','o','r', 0,\n    'i','s','u','p','e','r','i','o','r', 0,\n    'l','s','u','p','e','r','i','o','r', 0,\n    'm','s','u','p','e','r','i','o','r', 0,\n    'n','s','u','p','e','r','i','o','r', 0,\n    'o','s','u','p','e','r','i','o','r', 0,\n    'r','s','u','p','e','r','i','o','r', 0,\n    's','s','u','p','e','r','i','o','r', 0,\n    't','s','u','p','e','r','i','o','r', 0,\n    'f','f', 0,\n    'f','f','i', 0,\n    'f','f','l', 0,\n    'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0,\n    'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0,\n    'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0,\n    'G','r','a','v','e','s','m','a','l','l', 0,\n    'A','s','m','a','l','l', 0,\n    'B','s','m','a','l','l', 0,\n    'C','s','m','a','l','l', 0,\n    'D','s','m','a','l','l', 0,\n    'E','s','m','a','l','l', 0,\n    'F','s','m','a','l','l', 0,\n    'G','s','m','a','l','l', 0,\n    'H','s','m','a','l','l', 0,\n    'I','s','m','a','l','l', 0,\n    'J','s','m','a','l','l', 0,\n    'K','s','m','a','l','l', 0,\n    'L','s','m','a','l','l', 0,\n    'M','s','m','a','l','l', 0,\n    'N','s','m','a','l','l', 0,\n    'O','s','m','a','l','l', 0,\n    'P','s','m','a','l','l', 0,\n    'Q','s','m','a','l','l', 0,\n    'R','s','m','a','l','l', 0,\n    'S','s','m','a','l','l', 0,\n    'T','s','m','a','l','l', 0,\n    'U','s','m','a','l','l', 0,\n    'V','s','m','a','l','l', 0,\n    'W','s','m','a','l','l', 0,\n    'X','s','m','a','l','l', 0,\n    'Y','s','m','a','l','l', 0,\n    'Z','s','m','a','l','l', 0,\n    'c','o','l','o','n','m','o','n','e','t','a','r','y', 0,\n    'o','n','e','f','i','t','t','e','d', 0,\n    'r','u','p','i','a','h', 0,\n    'T','i','l','d','e','s','m','a','l','l', 0,\n    'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0,\n    'c','e','n','t','o','l','d','s','t','y','l','e', 0,\n    'L','s','l','a','s','h','s','m','a','l','l', 0,\n    'S','c','a','r','o','n','s','m','a','l','l', 0,\n    'Z','c','a','r','o','n','s','m','a','l','l', 0,\n    'D','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'B','r','e','v','e','s','m','a','l','l', 0,\n    'C','a','r','o','n','s','m','a','l','l', 0,\n    'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0,\n    'M','a','c','r','o','n','s','m','a','l','l', 0,\n    'f','i','g','u','r','e','d','a','s','h', 0,\n    'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0,\n    'O','g','o','n','e','k','s','m','a','l','l', 0,\n    'R','i','n','g','s','m','a','l','l', 0,\n    'C','e','d','i','l','l','a','s','m','a','l','l', 0,\n    'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0,\n    'o','n','e','e','i','g','h','t','h', 0,\n    't','h','r','e','e','e','i','g','h','t','h','s', 0,\n    'f','i','v','e','e','i','g','h','t','h','s', 0,\n    's','e','v','e','n','e','i','g','h','t','h','s', 0,\n    'o','n','e','t','h','i','r','d', 0,\n    't','w','o','t','h','i','r','d','s', 0,\n    'z','e','r','o','s','u','p','e','r','i','o','r', 0,\n    'f','o','u','r','s','u','p','e','r','i','o','r', 0,\n    'f','i','v','e','s','u','p','e','r','i','o','r', 0,\n    's','i','x','s','u','p','e','r','i','o','r', 0,\n    's','e','v','e','n','s','u','p','e','r','i','o','r', 0,\n    'e','i','g','h','t','s','u','p','e','r','i','o','r', 0,\n    'n','i','n','e','s','u','p','e','r','i','o','r', 0,\n    'z','e','r','o','i','n','f','e','r','i','o','r', 0,\n    'o','n','e','i','n','f','e','r','i','o','r', 0,\n    't','w','o','i','n','f','e','r','i','o','r', 0,\n    't','h','r','e','e','i','n','f','e','r','i','o','r', 0,\n    'f','o','u','r','i','n','f','e','r','i','o','r', 0,\n    'f','i','v','e','i','n','f','e','r','i','o','r', 0,\n    's','i','x','i','n','f','e','r','i','o','r', 0,\n    's','e','v','e','n','i','n','f','e','r','i','o','r', 0,\n    'e','i','g','h','t','i','n','f','e','r','i','o','r', 0,\n    'n','i','n','e','i','n','f','e','r','i','o','r', 0,\n    'c','e','n','t','i','n','f','e','r','i','o','r', 0,\n    'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0,\n    'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0,\n    'c','o','m','m','a','i','n','f','e','r','i','o','r', 0,\n    'A','g','r','a','v','e','s','m','a','l','l', 0,\n    'A','a','c','u','t','e','s','m','a','l','l', 0,\n    'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'A','t','i','l','d','e','s','m','a','l','l', 0,\n    'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'A','r','i','n','g','s','m','a','l','l', 0,\n    'A','E','s','m','a','l','l', 0,\n    'C','c','e','d','i','l','l','a','s','m','a','l','l', 0,\n    'E','g','r','a','v','e','s','m','a','l','l', 0,\n    'E','a','c','u','t','e','s','m','a','l','l', 0,\n    'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'I','g','r','a','v','e','s','m','a','l','l', 0,\n    'I','a','c','u','t','e','s','m','a','l','l', 0,\n    'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'E','t','h','s','m','a','l','l', 0,\n    'N','t','i','l','d','e','s','m','a','l','l', 0,\n    'O','g','r','a','v','e','s','m','a','l','l', 0,\n    'O','a','c','u','t','e','s','m','a','l','l', 0,\n    'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'O','t','i','l','d','e','s','m','a','l','l', 0,\n    'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'O','E','s','m','a','l','l', 0,\n    'O','s','l','a','s','h','s','m','a','l','l', 0,\n    'U','g','r','a','v','e','s','m','a','l','l', 0,\n    'U','a','c','u','t','e','s','m','a','l','l', 0,\n    'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,\n    'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    'Y','a','c','u','t','e','s','m','a','l','l', 0,\n    'T','h','o','r','n','s','m','a','l','l', 0,\n    'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,\n    '0','0','1','.','0','0','0', 0,\n    '0','0','1','.','0','0','1', 0,\n    '0','0','1','.','0','0','2', 0,\n    '0','0','1','.','0','0','3', 0,\n    'B','l','a','c','k', 0,\n    'B','o','l','d', 0,\n    'B','o','o','k', 0,\n    'L','i','g','h','t', 0,\n    'M','e','d','i','u','m', 0,\n    'R','e','g','u','l','a','r', 0,\n    'R','o','m','a','n', 0,\n    'S','e','m','i','b','o','l','d', 0,\n  };\n\n\n#define FT_NUM_MAC_NAMES  258\n\n  /* Values are offsets into the `ft_standard_glyph_names' table */\n\n  static const short  ft_mac_names[FT_NUM_MAC_NAMES] =\n  {\n     253,   0,   6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351,\n     360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430,\n     436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498,\n     500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526,\n     528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610,\n     612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638,\n     640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685,\n    1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652,\n    1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776,\n    1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346,\n    1197, 985,1031,  23,1086,1108,  32,1219,  41,  51, 730,1194,  64,  76,\n      86,  94,  97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120,\n     132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916,\n     598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856,\n     888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500,\n     163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053,\n    1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229,\n    1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200,\n     209, 218, 225, 232, 239, 246\n  };\n\n\n#define FT_NUM_SID_NAMES  391\n\n  /* Values are offsets into the `ft_standard_glyph_names' table */\n\n  static const short  ft_sid_names[FT_NUM_SID_NAMES] =\n  {\n     253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365,\n     371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441,\n     447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502,\n     504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530,\n     532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614,\n     616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642,\n     644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707,\n     712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832,\n     839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985,\n     991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089,\n    1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197,\n    1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319,\n    1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443,\n    1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562,\n    1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680,\n    1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797,\n    1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973,\n    1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167,\n    2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319,\n    2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454,\n    2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552,\n    2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684,\n    2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860,\n    2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034,\n    3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220,\n    3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409,\n    3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586,\n    3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687\n  };\n\n\n  /* the following are indices into the SID name table */\n  static const unsigned short  t1_standard_encoding[256] =\n  {\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,\n     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,\n     33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,\n     49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,\n     65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,\n     81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,\n      0,111,112,113,114,  0,115,116,117,118,119,120,121,122,  0,123,\n      0,124,125,126,127,128,129,130,131,  0,132,133,  0,134,135,136,\n    137,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,138,  0,139,  0,  0,  0,  0,140,141,142,143,  0,  0,  0,  0,\n      0,144,  0,  0,  0,145,  0,  0,146,147,148,149,  0,  0,  0,  0\n  };\n\n\n  /* the following are indices into the SID name table */\n  static const unsigned short  t1_expert_encoding[256] =\n  {\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      1,229,230,  0,231,232,233,234,235,236,237,238, 13, 14, 15, 99,\n    239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252,\n      0,253,254,255,256,257,  0,  0,  0,258,  0,  0,259,260,261,262,\n      0,  0,263,264,265,  0,266,109,110,267,268,269,  0,270,271,272,\n    273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,\n    289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n      0,304,305,306,  0,  0,307,308,309,310,311,  0,312,  0,  0,313,\n      0,  0,314,315,  0,  0,316,317,318,  0,  0,  0,158,155,163,319,\n    320,321,322,323,324,325,  0,  0,326,150,164,169,327,328,329,330,\n    331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,\n    347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,\n    363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378\n  };\n\n\n  /*\n   *  This table is a compressed version of the Adobe Glyph List (AGL),\n   *  optimized for efficient searching.  It has been generated by the\n   *  `glnames.py' python script located in the `src/tools' directory.\n   *\n   *  The lookup function to get the Unicode value for a given string\n   *  is defined below the table.\n   */\n\n#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n  static const unsigned char  ft_adobe_glyph_list[55997L] =\n  {\n      0, 52,  0,106,  2,167,  3, 63,  4,220,  6,125,  9,143, 10, 23,\n     11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88,\n     22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107,\n     32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109,\n     88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255,\n    135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199,\n    202, 25,204,166,208,209,209, 81,215, 26, 65,143,  0, 65,  0,140,\n      0,175,  0,193,  1, 15,  1,147,  1,233,  1,251,  2,  7,  2, 40,\n      2, 57,  2, 82,  2, 91,  2,128,  2,136,  2,154, 69,131,  0,198,\n      0,150,  0,158,  0,167,225,227,245,244,101,128,  1,252,237,225,\n    227,242,239,110,128,  1,226,243,237,225,236,108,128,247,230,225,\n    227,245,244,101,129,  0,193,  0,185,243,237,225,236,108,128,247,\n    225,226,242,229,246,101,134,  1,  2,  0,213,  0,221,  0,232,  0,\n    243,  0,251,  1,  7,225,227,245,244,101,128, 30,174,227,249,242,\n    233,236,236,233, 99,128,  4,208,228,239,244,226,229,236,239,119,\n    128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225,\n    226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99,\n      4,  1, 25,  1, 32,  1,121,  1,137,225,242,239,110,128,  1,205,\n    233,242, 99,  2,  1, 40,  1, 45,236,101,128, 36,182,245,237,230,\n    236,229,120,134,  0,194,  1, 66,  1, 74,  1, 85,  1, 93,  1,105,\n      1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236,\n    239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239,\n    235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247,\n    226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201,  1,\n    129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99,\n    128,  4, 16,100,  3,  1,155,  1,165,  1,209,226,236,231,242,225,\n    246,101,128,  2,  0,233,229,242,229,243,233,115,131,  0,196,  1,\n    181,  1,192,  1,201,227,249,242,233,236,236,233, 99,128,  4,210,\n    237,225,227,242,239,110,128,  1,222,243,237,225,236,108,128,247,\n    228,239,116,  2,  1,216,  1,224,226,229,236,239,119,128, 30,160,\n    237,225,227,242,239,110,128,  1,224,231,242,225,246,101,129,  0,\n    192,  1,243,243,237,225,236,108,128,247,224,232,239,239,235,225,\n    226,239,246,101,128, 30,162,105,  2,  2, 13,  2, 25,229,227,249,\n    242,233,236,236,233, 99,128,  4,212,238,246,229,242,244,229,228,\n    226,242,229,246,101,128,  2,  2,236,240,232, 97,129,  3,145,  2,\n     49,244,239,238,239,115,128,  3,134,109,  2,  2, 63,  2, 71,225,\n    227,242,239,110,128,  1,  0,239,238,239,243,240,225,227,101,128,\n    255, 33,239,231,239,238,229,107,128,  1,  4,242,233,238,103,131,\n      0,197,  2,104,  2,112,  2,120,225,227,245,244,101,128,  1,250,\n    226,229,236,239,119,128, 30,  0,243,237,225,236,108,128,247,229,\n    243,237,225,236,108,128,247, 97,244,233,236,228,101,129,  0,195,\n      2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229,\n    238,233,225,110,128,  5, 49, 66,137,  0, 66,  2,189,  2,198,  2,\n    223,  3,  3,  3, 10,  3, 22,  3, 34,  3, 46,  3, 54,227,233,242,\n    227,236,101,128, 36,183,228,239,116,  2,  2,206,  2,215,225,227,\n    227,229,238,116,128, 30,  2,226,229,236,239,119,128, 30,  4,101,\n      3,  2,231,  2,242,  2,254,227,249,242,233,236,236,233, 99,128,\n      4, 17,238,225,242,237,229,238,233,225,110,128,  5, 50,244, 97,\n    128,  3,146,232,239,239,107,128,  1,129,236,233,238,229,226,229,\n    236,239,119,128, 30,  6,237,239,238,239,243,240,225,227,101,128,\n    255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237,\n    225,236,108,128,247, 98,244,239,240,226,225,114,128,  1,130, 67,\n    137,  0, 67,  3, 85,  3,127,  3,193,  3,210,  3,224,  4,171,  4,\n    188,  4,200,  4,212, 97,  3,  3, 93,  3,104,  3,111,225,242,237,\n    229,238,233,225,110,128,  5, 62,227,245,244,101,128,  1,  6,242,\n    239,110,129,246,202,  3,119,243,237,225,236,108,128,246,245, 99,\n      3,  3,135,  3,142,  3,171,225,242,239,110,128,  1, 12,229,228,\n    233,236,236, 97,130,  0,199,  3,155,  3,163,225,227,245,244,101,\n    128, 30,  8,243,237,225,236,108,128,247,231,233,242, 99,  2,  3,\n    179,  3,184,236,101,128, 36,184,245,237,230,236,229,120,128,  1,\n      8,228,239,116,129,  1, 10,  3,201,225,227,227,229,238,116,128,\n      1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184,\n    104,  4,  3,234,  3,246,  4,161,  4,165,225,225,242,237,229,238,\n    233,225,110,128,  5, 73,101,  6,  4,  4,  4, 24,  4, 35,  4,103,\n      4,115,  4,136,225,226,235,232,225,243,233,225,238,227,249,242,\n    233,236,236,233, 99,128,  4,188,227,249,242,233,236,236,233, 99,\n    128,  4, 39,100,  2,  4, 41,  4, 85,229,243,227,229,238,228,229,\n    114,  2,  4, 54,  4, 74,225,226,235,232,225,243,233,225,238,227,\n    249,242,233,236,236,233, 99,128,  4,190,227,249,242,233,236,236,\n    233, 99,128,  4,182,233,229,242,229,243,233,243,227,249,242,233,\n    236,236,233, 99,128,  4,244,232,225,242,237,229,238,233,225,110,\n    128,  5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242,\n    233,236,236,233, 99,128,  4,203,246,229,242,244,233,227,225,236,\n    243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,\n    184,105,128,  3,167,239,239,107,128,  1,135,233,242,227,245,237,\n    230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239,\n    243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225,\n    110,128,  5, 81,243,237,225,236,108,128,247, 99, 68,142,  0, 68,\n      4,252,  5, 10,  5, 36,  5, 96,  5,121,  5,166,  5,173,  5,231,\n      5,244,  6,  0,  6, 12,  6, 28,  6, 48,  6, 57, 90,129,  1,241,\n      5,  2,227,225,242,239,110,128,  1,196, 97,  2,  5, 16,  5, 27,\n    225,242,237,229,238,233,225,110,128,  5, 52,230,242,233,227,225,\n    110,128,  1,137, 99,  4,  5, 46,  5, 53,  5, 62,  5, 89,225,242,\n    239,110,128,  1, 14,229,228,233,236,236, 97,128, 30, 16,233,242,\n     99,  2,  5, 70,  5, 75,236,101,128, 36,185,245,237,230,236,229,\n    248,226,229,236,239,119,128, 30, 18,242,239,225,116,128,  1, 16,\n    228,239,116,  2,  5,104,  5,113,225,227,227,229,238,116,128, 30,\n     10,226,229,236,239,119,128, 30, 12,101,  3,  5,129,  5,140,  5,\n    150,227,249,242,233,236,236,233, 99,128,  4, 20,233,227,239,240,\n    244,233, 99,128,  3,238,236,244, 97,129, 34,  6,  5,158,231,242,\n    229,229,107,128,  3,148,232,239,239,107,128,  1,138,105,  2,  5,\n    179,  5,218,229,242,229,243,233,115,131,246,203,  5,194,  5,202,\n      5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128,\n    246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231,\n    242,229,229,107,128,  3,220,234,229,227,249,242,233,236,236,233,\n     99,128,  4,  2,236,233,238,229,226,229,236,239,119,128, 30, 14,\n    237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227,\n    227,229,238,244,243,237,225,236,108,128,246,247,115,  2,  6, 34,\n      6, 41,236,225,243,104,128,  1, 16,237,225,236,108,128,247,100,\n    244,239,240,226,225,114,128,  1,139,122,131,  1,242,  6, 67,  6,\n     75,  6,112,227,225,242,239,110,128,  1,197,101,  2,  6, 81,  6,\n    101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,\n    233, 99,128,  4,224,227,249,242,233,236,236,233, 99,128,  4,  5,\n    232,229,227,249,242,233,236,236,233, 99,128,  4, 15, 69,146,  0,\n     69,  6,165,  6,183,  6,191,  7, 89,  7,153,  7,165,  7,183,  7,\n    211,  8,  7,  8, 36,  8, 94,  8,169,  8,189,  8,208,  8,248,  9,\n     44,  9,109,  9,115,225,227,245,244,101,129,  0,201,  6,175,243,\n    237,225,236,108,128,247,233,226,242,229,246,101,128,  1, 20, 99,\n      5,  6,203,  6,210,  6,224,  6,236,  7, 79,225,242,239,110,128,\n      1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28,\n    232,225,242,237,229,238,233,225,110,128,  5, 53,233,242, 99,  2,\n      6,244,  6,249,236,101,128, 36,186,245,237,230,236,229,120,135,\n      0,202,  7, 16,  7, 24,  7, 32,  7, 43,  7, 51,  7, 63,  7, 71,\n    225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24,\n    228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101,\n    128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243,\n    237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249,\n    242,233,236,236,233, 99,128,  4,  4,100,  3,  7, 97,  7,107,  7,\n    127,226,236,231,242,225,246,101,128,  2,  4,233,229,242,229,243,\n    233,115,129,  0,203,  7,119,243,237,225,236,108,128,247,235,239,\n    116,130,  1, 22,  7,136,  7,145,225,227,227,229,238,116,128,  1,\n     22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236,\n    233, 99,128,  4, 36,231,242,225,246,101,129,  0,200,  7,175,243,\n    237,225,236,108,128,247,232,104,  2,  7,189,  7,200,225,242,237,\n    229,238,233,225,110,128,  5, 55,239,239,235,225,226,239,246,101,\n    128, 30,186,105,  3,  7,219,  7,230,  7,245,231,232,244,242,239,\n    237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229,\n    246,101,128,  2,  6,239,244,233,230,233,229,228,227,249,242,233,\n    236,236,233, 99,128,  4,100,108,  2,  8, 13,  8, 24,227,249,242,\n    233,236,236,233, 99,128,  4, 27,229,246,229,238,242,239,237,225,\n    110,128, 33,106,109,  3,  8, 44,  8, 72,  8, 83,225,227,242,239,\n    110,130,  1, 18,  8, 56,  8, 64,225,227,245,244,101,128, 30, 22,\n    231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99,\n    128,  4, 28,239,238,239,243,240,225,227,101,128,255, 37,110,  4,\n      8,104,  8,115,  8,135,  8,154,227,249,242,233,236,236,233, 99,\n    128,  4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233,\n    236,236,233, 99,128,  4,162,103,129,  1, 74,  8,141,232,229,227,\n    249,242,233,236,236,233, 99,128,  4,164,232,239,239,235,227,249,\n    242,233,236,236,233, 99,128,  4,199,111,  2,  8,175,  8,183,231,\n    239,238,229,107,128,  1, 24,240,229,110,128,  1,144,240,243,233,\n    236,239,110,129,  3,149,  8,200,244,239,238,239,115,128,  3,136,\n    114,  2,  8,214,  8,225,227,249,242,233,236,236,233, 99,128,  4,\n     32,229,246,229,242,243,229,100,129,  1,142,  8,237,227,249,242,\n    233,236,236,233, 99,128,  4, 45,115,  4,  9,  2,  9, 13,  9, 33,\n      9, 37,227,249,242,233,236,236,233, 99,128,  4, 33,228,229,243,\n    227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,\n    170,104,128,  1,169,237,225,236,108,128,247,101,116,  3,  9, 52,\n      9, 78,  9, 92, 97,130,  3,151,  9, 60,  9, 70,242,237,229,238,\n    233,225,110,128,  5, 56,244,239,238,239,115,128,  3,137,104,129,\n      0,208,  9, 84,243,237,225,236,108,128,247,240,233,236,228,101,\n    129, 30,188,  9,101,226,229,236,239,119,128, 30, 26,245,242,111,\n    128, 32,172,250,104,130,  1,183,  9,124,  9,132,227,225,242,239,\n    110,128,  1,238,242,229,246,229,242,243,229,100,128,  1,184, 70,\n    136,  0, 70,  9,163,  9,172,  9,184,  9,212,  9,219,  9,248, 10,\n      4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225,\n    227,227,229,238,116,128, 30, 30,101,  2,  9,190,  9,202,232,225,\n    242,237,229,238,233,225,110,128,  5, 86,233,227,239,240,244,233,\n     99,128,  3,228,232,239,239,107,128,  1,145,105,  2,  9,225,  9,\n    238,244,225,227,249,242,233,236,236,233, 99,128,  4,114,246,229,\n    242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227,\n    101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243,\n    237,225,236,108,128,247,102, 71,140,  0, 71, 10, 51, 10, 61, 10,\n    107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11,\n     90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97,  3, 10,\n     69, 10, 76, 10, 94,227,245,244,101,128,  1,244,237,237, 97,129,\n      3,147, 10, 84,225,230,242,233,227,225,110,128,  1,148,238,231,\n    233,225,227,239,240,244,233, 99,128,  3,234,226,242,229,246,101,\n    128,  1, 30, 99,  4, 10,125, 10,132, 10,141, 10,163,225,242,239,\n    110,128,  1,230,229,228,233,236,236, 97,128,  1, 34,233,242, 99,\n      2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120,\n    128,  1, 28,239,237,237,225,225,227,227,229,238,116,128,  1, 34,\n    228,239,116,129,  1, 32, 10,184,225,227,227,229,238,116,128,  1,\n     32,229,227,249,242,233,236,236,233, 99,128,  4, 19,104,  3, 10,\n    213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128,\n      5, 66,101,  3, 10,234, 10,255, 11, 16,237,233,228,228,236,229,\n    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,148,243,\n    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,146,\n    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,\n    144,239,239,107,128,  1,147,233,237,225,242,237,229,238,233,225,\n    110,128,  5, 51,234,229,227,249,242,233,236,236,233, 99,128,  4,\n      3,109,  2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239,\n    238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246,\n    206, 11, 99,243,237,225,236,108,128,247, 96,115,  2, 11,113, 11,\n    129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128,  2,\n    155,244,242,239,235,101,128,  1,228, 72,140,  0, 72, 11,165, 11,\n    190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12,\n    157, 12,165, 12,189,177,184, 53,  3, 11,175, 11,180, 11,185,179,\n     51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178,\n    176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203,\n     97,  3, 11,216, 11,236, 12,  0,225,226,235,232,225,243,233,225,\n    238,227,249,242,233,236,236,233, 99,128,  4,168,228,229,243,227,\n    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,178,\n    242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,  4,\n     42, 98,  2, 12, 23, 12, 28,225,114,128,  1, 38,242,229,246,229,\n    226,229,236,239,119,128, 30, 42, 99,  2, 12, 46, 12, 55,229,228,\n    233,236,236, 97,128, 30, 40,233,242, 99,  2, 12, 63, 12, 68,236,\n    101,128, 36,189,245,237,230,236,229,120,128,  1, 36,100,  2, 12,\n     83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116,  2,\n     12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236,\n    239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255,\n     40,111,  2, 12,135, 12,146,225,242,237,229,238,233,225,110,128,\n      5, 64,242,233,227,239,240,244,233, 99,128,  3,232,243,237,225,\n    236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116,\n    129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241,\n    245,225,242,101,128, 51,144, 73,146,  0, 73, 12,239, 12,251, 12,\n    255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13,\n    242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193,\n    227,249,242,233,236,236,233, 99,128,  4, 47, 74,128,  1, 50,213,\n    227,249,242,233,236,236,233, 99,128,  4, 46,225,227,245,244,101,\n    129,  0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229,\n    246,101,128,  1, 44, 99,  3, 13, 45, 13, 52, 13, 84,225,242,239,\n    110,128,  1,207,233,242, 99,  2, 13, 60, 13, 65,236,101,128, 36,\n    190,245,237,230,236,229,120,129,  0,206, 13, 76,243,237,225,236,\n    108,128,247,238,249,242,233,236,236,233, 99,128,  4,  6,100,  3,\n     13,102, 13,112, 13,155,226,236,231,242,225,246,101,128,  2,  8,\n    233,229,242,229,243,233,115,131,  0,207, 13,128, 13,136, 13,147,\n    225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99,\n    128,  4,228,243,237,225,236,108,128,247,239,239,116,130,  1, 48,\n     13,164, 13,173,225,227,227,229,238,116,128,  1, 48,226,229,236,\n    239,119,128, 30,202,101,  2, 13,187, 13,203,226,242,229,246,229,\n    227,249,242,233,236,236,233, 99,128,  4,214,227,249,242,233,236,\n    236,233, 99,128,  4, 21,230,242,225,235,244,245,114,128, 33, 17,\n    231,242,225,246,101,129,  0,204, 13,234,243,237,225,236,108,128,\n    247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105,  3,\n     14,  6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128,  4,\n     24,238,246,229,242,244,229,228,226,242,229,246,101,128,  2, 10,\n    243,232,239,242,244,227,249,242,233,236,236,233, 99,128,  4, 25,\n    109,  2, 14, 54, 14, 75,225,227,242,239,110,129,  1, 42, 14, 64,\n    227,249,242,233,236,236,233, 99,128,  4,226,239,238,239,243,240,\n    225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110,\n    128,  5, 59,111,  3, 14,107, 14,118, 14,126,227,249,242,233,236,\n    236,233, 99,128,  4,  1,231,239,238,229,107,128,  1, 46,244, 97,\n    131,  3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110,\n    128,  1,150,228,233,229,242,229,243,233,115,128,  3,170,244,239,\n    238,239,115,128,  3,138,115,  2, 14,172, 14,179,237,225,236,108,\n    128,247,105,244,242,239,235,101,128,  1,151,244,233,236,228,101,\n    129,  1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233,\n    244,243, 97,  2, 14,216, 14,227,227,249,242,233,236,236,233, 99,\n    128,  4,116,228,226,236,231,242,225,246,229,227,249,242,233,236,\n    236,233, 99,128,  4,118, 74,134,  0, 74, 15,  6, 15, 18, 15, 41,\n     15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128,\n      5, 65,227,233,242, 99,  2, 15, 27, 15, 32,236,101,128, 36,191,\n    245,237,230,236,229,120,128,  1, 52,229,227,249,242,233,236,236,\n    233, 99,128,  4,  8,232,229,232,225,242,237,229,238,233,225,110,\n    128,  5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243,\n    237,225,236,108,128,247,106, 75,140,  0, 75, 15,115, 15,125, 15,\n    135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16,\n    180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241,\n    245,225,242,101,128, 51,205, 97,  7, 15,151, 15,169, 15,191, 15,\n    211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249,\n    242,233,236,236,233, 99,128,  4,160, 99,  2, 15,175, 15,181,245,\n    244,101,128, 30, 48,249,242,233,236,236,233, 99,128,  4, 26,228,\n    229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,\n    128,  4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128,\n      4,195,240,240, 97,128,  3,154,243,244,242,239,235,229,227,249,\n    242,233,236,236,233, 99,128,  4,158,246,229,242,244,233,227,225,\n    236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,\n      4,156, 99,  4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110,\n    128,  1,232,229,228,233,236,236, 97,128,  1, 54,233,242,227,236,\n    101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128,  1,\n     54,228,239,244,226,229,236,239,119,128, 30, 50,101,  2, 16, 82,\n     16, 94,232,225,242,237,229,238,233,225,110,128,  5, 84,238,225,\n    242,237,229,238,233,225,110,128,  5, 63,104,  3, 16,114, 16,126,\n     16,137,225,227,249,242,233,236,236,233, 99,128,  4, 37,229,233,\n    227,239,240,244,233, 99,128,  3,230,239,239,107,128,  1,152,234,\n    229,227,249,242,233,236,236,233, 99,128,  4, 12,236,233,238,229,\n    226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227,\n    101,128,255, 43,239,240,240, 97,  2, 16,189, 16,200,227,249,242,\n    233,236,236,233, 99,128,  4,128,231,242,229,229,107,128,  3,222,\n    115,  2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128,\n      4,110,237,225,236,108,128,247,107, 76,138,  0, 76, 17,  1, 17,\n      5, 17,  9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17,\n    189, 74,128,  1,199, 76,128,246,191, 97,  2, 17, 15, 17, 22,227,\n    245,244,101,128,  1, 57,237,226,228, 97,128,  3,155, 99,  4, 17,\n     39, 17, 46, 17, 55, 17, 82,225,242,239,110,128,  1, 61,229,228,\n    233,236,236, 97,128,  1, 59,233,242, 99,  2, 17, 63, 17, 68,236,\n    101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128,\n     30, 60,239,237,237,225,225,227,227,229,238,116,128,  1, 59,228,\n    239,116,130,  1, 63, 17,105, 17,114,225,227,227,229,238,116,128,\n      1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242,\n    239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110,\n    128,  5, 60,106,129,  1,200, 17,153,229,227,249,242,233,236,236,\n    233, 99,128,  4,  9,236,233,238,229,226,229,236,239,119,128, 30,\n     58,237,239,238,239,243,240,225,227,101,128,255, 44,115,  2, 17,\n    195, 17,212,236,225,243,104,129,  1, 65, 17,204,243,237,225,236,\n    108,128,246,249,237,225,236,108,128,247,108, 77,137,  0, 77, 17,\n    241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18,\n    100,194,243,241,245,225,242,101,128, 51,134,225, 99,  2, 18,  2,\n     18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128,\n    247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36,\n    194,228,239,116,  2, 18, 41, 18, 50,225,227,227,229,238,116,128,\n     30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229,\n    238,233,225,110,128,  5, 68,237,239,238,239,243,240,225,227,101,\n    128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229,\n    100,128,  1,156,117,128,  3,156, 78,141,  0, 78, 18,134, 18,138,\n     18,146, 18,212, 18,237, 18,248, 19,  3, 19, 21, 19, 33, 19, 45,\n     19, 58, 19, 66, 19, 84, 74,128,  1,202,225,227,245,244,101,128,\n      1, 67, 99,  4, 18,156, 18,163, 18,172, 18,199,225,242,239,110,\n    128,  1, 71,229,228,233,236,236, 97,128,  1, 69,233,242, 99,  2,\n     18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226,\n    229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238,\n    116,128,  1, 69,228,239,116,  2, 18,220, 18,229,225,227,227,229,\n    238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239,\n    235,236,229,230,116,128,  1,157,233,238,229,242,239,237,225,110,\n    128, 33,104,106,129,  1,203, 19,  9,229,227,249,242,233,236,236,\n    233, 99,128,  4, 10,236,233,238,229,226,229,236,239,119,128, 30,\n     72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225,\n    242,237,229,238,233,225,110,128,  5, 70,243,237,225,236,108,128,\n    247,110,244,233,236,228,101,129,  0,209, 19, 76,243,237,225,236,\n    108,128,247,241,117,128,  3,157, 79,141,  0, 79, 19,118, 19,132,\n     19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213,\n     21,223, 21,254, 22, 53, 69,129,  1, 82, 19,124,243,237,225,236,\n    108,128,246,250,225,227,245,244,101,129,  0,211, 19,142,243,237,\n    225,236,108,128,247,243, 98,  2, 19,156, 19,196,225,242,242,229,\n    100,  2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128,  4,\n    232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,\n     99,128,  4,234,242,229,246,101,128,  1, 78, 99,  4, 19,213, 19,\n    220, 19,235, 20, 68,225,242,239,110,128,  1,209,229,238,244,229,\n    242,229,228,244,233,236,228,101,128,  1,159,233,242, 99,  2, 19,\n    243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134,  0,\n    212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245,\n    244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216,\n    231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246,\n    101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228,\n    101,128, 30,214,249,242,233,236,236,233, 99,128,  4, 30,100,  3,\n     20, 86, 20,109, 20,142,226,108,  2, 20, 93, 20,101,225,227,245,\n    244,101,128,  1, 80,231,242,225,246,101,128,  2, 12,233,229,242,\n    229,243,233,115,130,  0,214, 20,123, 20,134,227,249,242,233,236,\n    236,233, 99,128,  4,230,243,237,225,236,108,128,247,246,239,244,\n    226,229,236,239,119,128, 30,204,103,  2, 20,158, 20,170,239,238,\n    229,235,243,237,225,236,108,128,246,251,242,225,246,101,129,  0,\n    210, 20,179,243,237,225,236,108,128,247,242,104,  4, 20,197, 20,\n    208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128,  5, 85,\n    109,128, 33, 38,111,  2, 20,218, 20,228,239,235,225,226,239,246,\n    101,128, 30,206,242,110,133,  1,160, 20,243, 20,251, 21,  6, 21,\n     14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229,\n    236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239,\n    239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128,\n     30,224,245,238,231,225,242,245,237,236,225,245,116,128,  1, 80,\n    105,129,  1,162, 21, 54,238,246,229,242,244,229,228,226,242,229,\n    246,101,128,  2, 14,109,  4, 21, 79, 21,107, 21,184, 21,202,225,\n    227,242,239,110,130,  1, 76, 21, 91, 21, 99,225,227,245,244,101,\n    128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33,\n     38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233,\n     99,128,  4, 96,231,242,229,229,107,128,  3,169,242,239,245,238,\n    228,227,249,242,233,236,236,233, 99,128,  4,122,116,  2, 21,162,\n     21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,\n    124,239,238,239,115,128,  3,143,233,227,242,239,110,129,  3,159,\n     21,194,244,239,238,239,115,128,  3,140,239,238,239,243,240,225,\n    227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111,\n      2, 21,229, 21,248,231,239,238,229,107,129,  1,234, 21,239,237,\n    225,227,242,239,110,128,  1,236,240,229,110,128,  1,134,115,  3,\n     22,  6, 22, 33, 22, 40,236,225,243,104,130,  0,216, 22, 17, 22,\n     25,225,227,245,244,101,128,  1,254,243,237,225,236,108,128,247,\n    248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245,\n    244,101,128,  1,254,116,  2, 22, 59, 22, 70,227,249,242,233,236,\n    236,233, 99,128,  4,126,233,236,228,101,131,  0,213, 22, 83, 22,\n     91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229,\n    243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136,\n      0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246,\n     23,  2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101,\n    128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101,\n      3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128,\n      4, 31,232,225,242,237,229,238,233,225,110,128,  5, 74,237,233,\n    228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99,\n    128,  4,166,104,  2, 22,217, 22,221,105,128,  3,166,239,239,107,\n    128,  1,164,105,129,  3,160, 22,233,247,242,225,242,237,229,238,\n    233,225,110,128,  5, 83,237,239,238,239,243,240,225,227,101,128,\n    255, 48,115,  2, 23,  8, 23, 25,105,129,  3,168, 23, 14,227,249,\n    242,233,236,236,233, 99,128,  4,112,237,225,236,108,128,247,112,\n     81,131,  0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101,\n    128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243,\n    237,225,236,108,128,247,113, 82,138,  0, 82, 23, 95, 23,119, 23,\n    166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97,\n      2, 23,101, 23,112,225,242,237,229,238,233,225,110,128,  5, 76,\n    227,245,244,101,128,  1, 84, 99,  4, 23,129, 23,136, 23,145, 23,\n    153,225,242,239,110,128,  1, 88,229,228,233,236,236, 97,128,  1,\n     86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227,\n    229,238,116,128,  1, 86,100,  2, 23,172, 23,182,226,236,231,242,\n    225,246,101,128,  2, 16,239,116,  2, 23,189, 23,198,225,227,227,\n    229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208,\n    237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238,\n    233,225,110,128,  5, 80,230,242,225,235,244,245,114,128, 33, 28,\n    232,111,128,  3,161,233,110,  2, 23,252, 24,  5,231,243,237,225,\n    236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101,\n    128,  2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237,\n    239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108,\n    129,247,114, 24, 53,233,238,246,229,242,244,229,100,129,  2,129,\n     24, 66,243,245,240,229,242,233,239,114,128,  2,182, 83,139,  0,\n     83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27,\n    105, 27,117, 27,135, 27,143, 70,  6, 24,117, 24,209, 24,241, 25,\n     77, 25,119, 25,221, 48,  9, 24,137, 24,145, 24,153, 24,161, 24,\n    169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37,\n     12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37,\n     16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37,\n     60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37,\n     52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37,\n     36, 49,  3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37,\n      0,177,176,176,176, 48,128, 37,  2,185,176,176,176, 48,128, 37,\n     97, 50,  9, 25,  5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25,\n     53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176,\n    176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176,\n    176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176,\n    176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176,\n    176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51,  4, 25,\n     87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183,\n    176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185,\n    176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25,\n    165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176,\n    176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176,\n    176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176,\n    176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176,\n    176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176,\n    176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53,  5, 25,\n    233, 25,241, 25,249, 26,  1, 26,  9,176,176,176,176, 48,128, 37,\n     88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37,\n     83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37,\n    106, 97,  2, 26, 23, 26, 44,227,245,244,101,129,  1, 90, 26, 32,\n    228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231,\n    242,229,229,107,128,  3,224, 99,  5, 26, 67, 26, 98, 26,107, 26,\n    147, 26,169,225,242,239,110,130,  1, 96, 26, 78, 26, 90,228,239,\n    244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128,\n    246,253,229,228,233,236,236, 97,128,  1, 94,232,247, 97,130,  1,\n    143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128,  4,216,\n    228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,\n    128,  4,218,233,242, 99,  2, 26,155, 26,160,236,101,128, 36,200,\n    245,237,230,236,229,120,128,  1, 92,239,237,237,225,225,227,227,\n    229,238,116,128,  2, 24,228,239,116,  2, 26,190, 26,199,225,227,\n    227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26,\n    209,228,239,244,225,227,227,229,238,116,128, 30,104,101,  2, 26,\n    227, 26,239,232,225,242,237,229,238,233,225,110,128,  5, 77,246,\n    229,238,242,239,237,225,110,128, 33,102,104,  5, 27,  6, 27, 34,\n     27, 48, 27, 59, 27, 72, 97,  2, 27, 12, 27, 23,225,242,237,229,\n    238,233,225,110,128,  5, 71,227,249,242,233,236,236,233, 99,128,\n      4, 40,227,232,225,227,249,242,233,236,236,233, 99,128,  4, 41,\n    229,233,227,239,240,244,233, 99,128,  3,226,232,225,227,249,242,\n    233,236,236,233, 99,128,  4,186,233,237,225,227,239,240,244,233,\n     99,128,  3,236,105,  2, 27, 90, 27, 96,231,237, 97,128,  3,163,\n    248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225,\n    227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233,\n    236,236,233, 99,128,  4, 44,243,237,225,236,108,128,247,115,244,\n    233,231,237,225,231,242,229,229,107,128,  3,218, 84,141,  0, 84,\n     27,186, 27,191, 27,197, 28,  7, 28, 32, 28, 96, 28,147, 28,177,\n     28,189, 28,201, 28,246, 29,  6, 29, 46,225,117,128,  3,164,226,\n    225,114,128,  1,102, 99,  4, 27,207, 27,214, 27,223, 27,250,225,\n    242,239,110,128,  1,100,229,228,233,236,236, 97,128,  1, 98,233,\n    242, 99,  2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236,\n    229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227,\n    227,229,238,116,128,  1, 98,228,239,116,  2, 28, 15, 28, 24,225,\n    227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108,\n    101,  4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236,\n    233, 99,128,  4, 34,228,229,243,227,229,238,228,229,242,227,249,\n    242,233,236,236,233, 99,128,  4,172,238,242,239,237,225,110,128,\n     33,105,244,243,229,227,249,242,233,236,236,233, 99,128,  4,180,\n    104,  3, 28,104, 28,110, 28,136,229,244, 97,128,  3,152,111,  2,\n     28,116, 28,121,239,107,128,  1,172,242,110,129,  0,222, 28,128,\n    243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110,\n    128, 33, 98,105,  2, 28,153, 28,164,236,228,229,243,237,225,236,\n    108,128,246,254,247,238,225,242,237,229,238,233,225,110,128,  5,\n     79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238,\n    239,243,240,225,227,101,128,255, 52,111,  2, 28,207, 28,218,225,\n    242,237,229,238,233,225,110,128,  5, 57,238,101,  3, 28,227, 28,\n    234, 28,240,230,233,246,101,128,  1,188,243,233,120,128,  1,132,\n    244,247,111,128,  1,167,242,229,244,242,239,230,236,229,248,232,\n    239,239,107,128,  1,174,115,  3, 29, 14, 29, 26, 29, 39,229,227,\n    249,242,233,236,236,233, 99,128,  4, 38,232,229,227,249,242,233,\n    236,236,233, 99,128,  4, 11,237,225,236,108,128,247,116,119,  2,\n     29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107,\n    239,242,239,237,225,110,128, 33, 97, 85,142,  0, 85, 29,105, 29,\n    123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31,\n     21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129,  0,\n    218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101,\n    128,  1,108, 99,  3, 29,139, 29,146, 29,188,225,242,239,110,128,\n      1,211,233,242, 99,  2, 29,154, 29,159,236,101,128, 36,202,245,\n    237,230,236,229,120,130,  0,219, 29,172, 29,180,226,229,236,239,\n    119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236,\n    236,233, 99,128,  4, 35,100,  3, 29,206, 29,229, 30, 59,226,108,\n      2, 29,213, 29,221,225,227,245,244,101,128,  1,112,231,242,225,\n    246,101,128,  2, 20,233,229,242,229,243,233,115,134,  0,220, 29,\n    251, 30,  3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101,\n    128,  1,215,226,229,236,239,119,128, 30,114, 99,  2, 30, 17, 30,\n     24,225,242,239,110,128,  1,217,249,242,233,236,236,233, 99,128,\n      4,240,231,242,225,246,101,128,  1,219,237,225,227,242,239,110,\n    128,  1,213,243,237,225,236,108,128,247,252,239,244,226,229,236,\n    239,119,128, 30,228,231,242,225,246,101,129,  0,217, 30, 79,243,\n    237,225,236,108,128,247,249,104,  2, 30, 93, 30,171,111,  2, 30,\n     99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133,\n      1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244,\n    101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231,\n    242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101,\n    128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242,\n    245,237,236,225,245,116,129,  1,112, 30,187,227,249,242,233,236,\n    236,233, 99,128,  4,242,233,238,246,229,242,244,229,228,226,242,\n    229,246,101,128,  2, 22,235,227,249,242,233,236,236,233, 99,128,\n      4,120,109,  2, 30,232, 31, 10,225,227,242,239,110,130,  1,106,\n     30,244, 30,255,227,249,242,233,236,236,233, 99,128,  4,238,228,\n    233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225,\n    227,101,128,255, 53,239,231,239,238,229,107,128,  1,114,240,243,\n    233,236,239,110,133,  3,165, 31, 49, 31, 53, 31, 90, 31,121, 31,\n    134, 49,128,  3,210, 97,  2, 31, 59, 31, 81,227,245,244,229,232,\n    239,239,235,243,249,237,226,239,236,231,242,229,229,107,128,  3,\n    211,230,242,233,227,225,110,128,  1,177,228,233,229,242,229,243,\n    233,115,129,  3,171, 31,103,232,239,239,235,243,249,237,226,239,\n    236,231,242,229,229,107,128,  3,212,232,239,239,235,243,249,237,\n    226,239,108,128,  3,210,244,239,238,239,115,128,  3,142,242,233,\n    238,103,128,  1,110,115,  3, 31,157, 31,172, 31,179,232,239,242,\n    244,227,249,242,233,236,236,233, 99,128,  4, 14,237,225,236,108,\n    128,247,117,244,242,225,233,231,232,116,  2, 31,191, 31,202,227,\n    249,242,233,236,236,233, 99,128,  4,174,243,244,242,239,235,229,\n    227,249,242,233,236,236,233, 99,128,  4,176,244,233,236,228,101,\n    130,  1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226,\n    229,236,239,119,128, 30,116, 86,136,  0, 86, 32, 11, 32, 20, 32,\n     31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236,\n    101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101,\n      2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128,  4, 18,\n    247,225,242,237,229,238,233,225,110,128,  5, 78,232,239,239,107,\n    128,  1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239,\n    225,242,237,229,238,233,225,110,128,  5, 72,243,237,225,236,108,\n    128,247,118,244,233,236,228,101,128, 30,124, 87,134,  0, 87, 32,\n    123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101,\n    128, 30,130,227,233,242, 99,  2, 32,140, 32,145,236,101,128, 36,\n    204,245,237,230,236,229,120,128,  1,116,100,  2, 32,160, 32,170,\n    233,229,242,229,243,233,115,128, 30,132,239,116,  2, 32,177, 32,\n    186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128,\n     30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240,\n    225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134,\n      0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233,\n    242,227,236,101,128, 36,205,100,  2, 32,253, 33,  7,233,229,242,\n    229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128,\n     30,138,229,232,225,242,237,229,238,233,225,110,128,  5, 61,105,\n    128,  3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243,\n    237,225,236,108,128,247,120, 89,139,  0, 89, 33, 81, 33,116, 33,\n    139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34,\n     68, 97,  2, 33, 87, 33,104,227,245,244,101,129,  0,221, 33, 96,\n    243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233,\n     99,128,  4, 98,227,233,242, 99,  2, 33,125, 33,130,236,101,128,\n     36,206,245,237,230,236,229,120,128,  1,118,100,  2, 33,145, 33,\n    165,233,229,242,229,243,233,115,129,  1,120, 33,157,243,237,225,\n    236,108,128,247,255,239,116,  2, 33,172, 33,181,225,227,227,229,\n    238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114,  2,\n     33,196, 33,208,233,227,249,242,233,236,236,233, 99,128,  4, 43,\n    245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,\n     99,128,  4,248,231,242,225,246,101,128, 30,242,232,239,239,107,\n    129,  1,179, 33,245,225,226,239,246,101,128, 30,246,105,  3, 34,\n      5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128,  5, 69,\n    227,249,242,233,236,236,233, 99,128,  4,  7,247,238,225,242,237,\n    229,238,233,225,110,128,  5, 82,237,239,238,239,243,240,225,227,\n    101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228,\n    101,128, 30,248,245,115,  2, 34, 75, 34,113,226,233,103,  2, 34,\n     83, 34, 94,227,249,242,233,236,236,233, 99,128,  4,106,233,239,\n    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,\n    108,236,233,244,244,236,101,  2, 34,124, 34,135,227,249,242,233,\n    236,236,233, 99,128,  4,102,233,239,244,233,230,233,229,228,227,\n    249,242,233,236,236,233, 99,128,  4,104, 90,136,  0, 90, 34,174,\n     34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97,  2,\n     34,180, 34,191,225,242,237,229,238,233,225,110,128,  5, 54,227,\n    245,244,101,128,  1,121, 99,  2, 34,204, 34,221,225,242,239,110,\n    129,  1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99,\n      2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120,\n    128, 30,144,228,239,116,130,  1,123, 34,253, 35,  6,225,227,227,\n    229,238,116,128,  1,123,226,229,236,239,119,128, 30,146,101,  3,\n     35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128,  4,\n     23,100,  2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227,\n    249,242,233,236,236,233, 99,128,  4,152,233,229,242,229,243,233,\n    243,227,249,242,233,236,236,233, 99,128,  4,222,244, 97,128,  3,\n    150,232,101,  4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229,\n    238,233,225,110,128,  5, 58,226,242,229,246,229,227,249,242,233,\n    236,236,233, 99,128,  4,193,227,249,242,233,236,236,233, 99,128,\n      4, 22,100,  2, 35,136, 35,155,229,243,227,229,238,228,229,242,\n    227,249,242,233,236,236,233, 99,128,  4,150,233,229,242,229,243,\n    233,243,227,249,242,233,236,236,233, 99,128,  4,220,236,233,238,\n    229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225,\n    227,101,128,255, 58,115,  2, 35,203, 35,210,237,225,236,108,128,\n    247,122,244,242,239,235,101,128,  1,181, 97,158,  0, 97, 36, 26,\n     38,154, 39,  4, 39, 68, 39,132, 39,196, 40,  4, 40, 68, 40,126,\n     40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229,\n     50,  0, 50,225, 51,  7, 52, 96, 52,168, 53,123, 53,132, 54,  5,\n     56, 13, 57,  3, 57, 50, 57,201, 57,215, 49,138, 39,  1, 36, 50,\n     36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26,\n     38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90,\n     36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128,\n     39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128,\n     39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128,\n     38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146,\n     36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128,\n     39,  9, 56,128, 39,  8, 57,128, 39,  7, 50,138, 38, 30, 36,178,\n     36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210,\n     36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128,\n     36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128,\n     36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242,\n     36,246, 36,250, 36,254, 37,  2, 37,  6, 37, 10, 37, 14, 37, 18,\n     37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128,\n     39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128,\n     39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50,\n     37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82,\n     37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128,\n     39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128,\n     39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114,\n     37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146,\n     37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128,\n     39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128,\n     39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178,\n     37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210,\n     37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128,\n     33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128,\n     39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242,\n     37,246, 37,250, 37,254, 38,  2, 38,  6, 38, 10, 38, 14, 38, 18,\n     38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128,\n     39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128,\n     39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50,\n     38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82,\n     38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128,\n     39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128,\n     39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114,\n     38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146,\n     38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128,\n     39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128,\n     39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39,  2, 38,178,\n     38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252,\n     39,  0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212,\n     38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39,  3,\n     51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112,\n     49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24,\n     53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28,\n     57,128, 39, 34, 51,138, 39,  4, 39, 28, 39, 32, 39, 36, 39, 40,\n     39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35,\n     49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39,\n     53,128, 38,  5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43,\n     57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104,\n     39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45,\n     49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49,\n     53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53,\n     57,128, 39, 54, 53,138, 39,  6, 39,156, 39,160, 39,164, 39,168,\n     39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55,\n     49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59,\n     53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63,\n     57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232,\n     39,236, 39,240, 39,244, 39,248, 39,252, 40,  0, 48,128, 39, 65,\n     49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69,\n     53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73,\n     57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40,\n     40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75,\n     49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79,\n     53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198,\n     57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102,\n     40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128,\n     39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128,\n     39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138,\n     39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174,\n     40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128,\n     39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128,\n     39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97,  7,\n     40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229,\n    238,231,225,236,105,128,  9,134,227,245,244,101,128,  0,225,228,\n    229,246, 97,128,  9,  6,231,117,  2, 40,237, 40,246,234,225,242,\n    225,244,105,128, 10,134,242,237,245,235,232,105,128, 10,  6,237,\n    225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242,\n    245,243,241,245,225,242,101,128, 51,  3,246,239,247,229,236,243,\n    233,231,110,  3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236,\n    105,128,  9,190,228,229,246, 97,128,  9, 62,231,245,234,225,242,\n    225,244,105,128, 10,190, 98,  4, 41, 80, 41,121, 41,130, 41,140,\n    226,242,229,246,233,225,244,233,239,110,  2, 41, 95, 41,110,237,\n    225,242,235,225,242,237,229,238,233,225,110,128,  5, 95,243,233,\n    231,238,228,229,246, 97,128,  9,112,229,238,231,225,236,105,128,\n      9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101,\n    134,  1,  3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225,\n    227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128,\n      4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225,\n    246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30,\n    179,244,233,236,228,101,128, 30,181, 99,  4, 41,227, 41,234, 42,\n     57, 42,127,225,242,239,110,128,  1,206,233,242, 99,  2, 41,242,\n     41,247,236,101,128, 36,208,245,237,230,236,229,120,133,  0,226,\n     42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128,\n     30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225,\n    246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30,\n    169,244,233,236,228,101,128, 30,171,245,244,101,133,  0,180, 42,\n     73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237,\n     98,128,  3, 23, 99,  2, 42, 90, 42, 95,237, 98,128,  3,  1,239,\n    237, 98,128,  3,  1,228,229,246, 97,128,  9, 84,236,239,247,237,\n    239,100,128,  2,207,244,239,238,229,227,237, 98,128,  3, 65,249,\n    242,233,236,236,233, 99,128,  4, 48,100,  5, 42,149, 42,159, 42,\n    173, 42,179, 42,213,226,236,231,242,225,246,101,128,  2,  1,228,\n    225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97,\n    128,  9,  5,233,229,242,229,243,233,115,130,  0,228, 42,193, 42,\n    204,227,249,242,233,236,236,233, 99,128,  4,211,237,225,227,242,\n    239,110,128,  1,223,239,116,  2, 42,220, 42,228,226,229,236,239,\n    119,128, 30,161,237,225,227,242,239,110,128,  1,225,101,131,  0,\n    230, 42,247, 42,255, 43,  8,225,227,245,244,101,128,  1,253,235,\n    239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128,  1,\n    227,230,233,105,  6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49,\n    111, 48,  2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185,\n    180, 49,128, 32,164,177, 48,  3, 43, 62, 45, 86, 45,221, 48,  9,\n     43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218,\n     45, 24, 49,  3, 43, 90, 43, 94, 43, 98, 55,128,  4, 16, 56,128,\n      4, 17, 57,128,  4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136,\n     43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128,  4, 19,\n     49,128,  4, 20, 50,128,  4, 21, 51,128,  4,  1, 52,128,  4, 22,\n     53,128,  4, 23, 54,128,  4, 24, 55,128,  4, 25, 56,128,  4, 26,\n     57,128,  4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202,\n     43,206, 43,210, 43,214, 43,218, 43,222, 48,128,  4, 28, 49,128,\n      4, 29, 50,128,  4, 30, 51,128,  4, 31, 52,128,  4, 32, 53,128,\n      4, 33, 54,128,  4, 34, 55,128,  4, 35, 56,128,  4, 36, 57,128,\n      4, 37, 52, 10, 43,248, 43,252, 44,  0, 44,  4, 44,  8, 44, 12,\n     44, 16, 44, 20, 44, 24, 44, 28, 48,128,  4, 38, 49,128,  4, 39,\n     50,128,  4, 40, 51,128,  4, 41, 52,128,  4, 42, 53,128,  4, 43,\n     54,128,  4, 44, 55,128,  4, 45, 56,128,  4, 46, 57,128,  4, 47,\n     53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78,\n     44, 82, 44, 86, 44, 90, 48,128,  4,144, 49,128,  4,  2, 50,128,\n      4,  3, 51,128,  4,  4, 52,128,  4,  5, 53,128,  4,  6, 54,128,\n      4,  7, 55,128,  4,  8, 56,128,  4,  9, 57,128,  4, 10, 54, 10,\n     44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144,\n     44,148, 44,152, 48,128,  4, 11, 49,128,  4, 12, 50,128,  4, 14,\n     51,128,246,196, 52,128,246,197, 53,128,  4, 48, 54,128,  4, 49,\n     55,128,  4, 50, 56,128,  4, 51, 57,128,  4, 52, 55, 10, 44,178,\n     44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210,\n     44,214, 48,128,  4, 53, 49,128,  4, 81, 50,128,  4, 54, 51,128,\n      4, 55, 52,128,  4, 56, 53,128,  4, 57, 54,128,  4, 58, 55,128,\n      4, 59, 56,128,  4, 60, 57,128,  4, 61, 56, 10, 44,240, 44,244,\n     44,248, 44,252, 45,  0, 45,  4, 45,  8, 45, 12, 45, 16, 45, 20,\n     48,128,  4, 62, 49,128,  4, 63, 50,128,  4, 64, 51,128,  4, 65,\n     52,128,  4, 66, 53,128,  4, 67, 54,128,  4, 68, 55,128,  4, 69,\n     56,128,  4, 70, 57,128,  4, 71, 57, 10, 45, 46, 45, 50, 45, 54,\n     45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128,\n      4, 72, 49,128,  4, 73, 50,128,  4, 74, 51,128,  4, 75, 52,128,\n      4, 76, 53,128,  4, 77, 54,128,  4, 78, 55,128,  4, 79, 56,128,\n      4,145, 57,128,  4, 82, 49,  4, 45, 96, 45,158, 45,163, 45,189,\n     48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142,\n     45,146, 45,150, 45,154, 48,128,  4, 83, 49,128,  4, 84, 50,128,\n      4, 85, 51,128,  4, 86, 52,128,  4, 87, 53,128,  4, 88, 54,128,\n      4, 89, 55,128,  4, 90, 56,128,  4, 91, 57,128,  4, 92,177, 48,\n    128,  4, 94, 52,  4, 45,173, 45,177, 45,181, 45,185, 53,128,  4,\n     15, 54,128,  4, 98, 55,128,  4,114, 56,128,  4,116, 57,  5, 45,\n    201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128,  4,\n     95, 52,128,  4, 99, 53,128,  4,115, 54,128,  4,117, 56,  2, 45,\n    227, 45,241, 51,  2, 45,233, 45,237, 49,128,246,199, 50,128,246,\n    200,180, 54,128,  4,217,178,185, 57,128, 32, 14,179, 48,  2, 46,\n      3, 46,  7, 48,128, 32, 15, 49,128, 32, 13,181, 55,  7, 46, 28,\n     46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51,  2, 46, 34,\n     46, 48, 56,  2, 46, 40, 46, 44, 49,128,  6,106, 56,128,  6, 12,\n     57,  8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90,\n     46, 94, 50,128,  6, 96, 51,128,  6, 97, 52,128,  6, 98, 53,128,\n      6, 99, 54,128,  6,100, 55,128,  6,101, 56,128,  6,102, 57,128,\n      6,103, 52,  7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102,\n     47,158, 48,  5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128,\n      6,104, 49,128,  6,105, 51,128,  6, 27, 55,128,  6, 31, 57,128,\n      6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188,\n     46,192, 46,196, 46,200, 46,204, 48,128,  6, 34, 49,128,  6, 35,\n     50,128,  6, 36, 51,128,  6, 37, 52,128,  6, 38, 53,128,  6, 39,\n     54,128,  6, 40, 55,128,  6, 41, 56,128,  6, 42, 57,128,  6, 43,\n     50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254,\n     47,  2, 47,  6, 47, 10, 48,128,  6, 44, 49,128,  6, 45, 50,128,\n      6, 46, 51,128,  6, 47, 52,128,  6, 48, 53,128,  6, 49, 54,128,\n      6, 50, 55,128,  6, 51, 56,128,  6, 52, 57,128,  6, 53, 51,  5,\n     47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128,  6, 54, 49,128,\n      6, 55, 50,128,  6, 56, 51,128,  6, 57, 52,128,  6, 58, 52,  9,\n     47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94,\n     47, 98, 48,128,  6, 64, 49,128,  6, 65, 50,128,  6, 66, 51,128,\n      6, 67, 52,128,  6, 68, 53,128,  6, 69, 54,128,  6, 70, 56,128,\n      6, 72, 57,128,  6, 73, 53,  9, 47,122, 47,126, 47,130, 47,134,\n     47,138, 47,142, 47,146, 47,150, 47,154, 48,128,  6, 74, 49,128,\n      6, 75, 50,128,  6, 76, 51,128,  6, 77, 52,128,  6, 78, 53,128,\n      6, 79, 54,128,  6, 80, 55,128,  6, 81, 56,128,  6, 82,183, 48,\n    128,  6, 71, 53,  3, 47,171, 47,203, 47,235, 48,  5, 47,183, 47,\n    187, 47,191, 47,195, 47,199, 53,128,  6,164, 54,128,  6,126, 55,\n    128,  6,134, 56,128,  6,152, 57,128,  6,175, 49,  5, 47,215, 47,\n    219, 47,223, 47,227, 47,231, 49,128,  6,121, 50,128,  6,136, 51,\n    128,  6,145, 52,128,  6,186, 57,128,  6,210,179, 52,128,  6,213,\n     54,  7, 48,  0, 48,  5, 48, 10, 48, 15, 48, 53, 48,115, 48,177,\n    179, 54,128, 32,170,180, 53,128,  5,190,181, 56,128,  5,195, 54,\n      6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128,  5,\n    208, 53,128,  5,209, 54,128,  5,210, 55,128,  5,211, 56,128,  5,\n    212, 57,128,  5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48,\n     91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128,  5,214, 49,\n    128,  5,215, 50,128,  5,216, 51,128,  5,217, 52,128,  5,218, 53,\n    128,  5,219, 54,128,  5,220, 55,128,  5,221, 56,128,  5,222, 57,\n    128,  5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48,\n    157, 48,161, 48,165, 48,169, 48,173, 48,128,  5,224, 49,128,  5,\n    225, 50,128,  5,226, 51,128,  5,227, 52,128,  5,228, 53,128,  5,\n    229, 54,128,  5,230, 55,128,  5,231, 56,128,  5,232, 57,128,  5,\n    233, 57,  3, 48,185, 48,189, 48,193, 48,128,  5,234, 52,128,251,\n     42, 53,128,251, 43, 55,  4, 48,207, 48,221, 48,241, 48,246, 48,\n      2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49,  3, 48,\n    229, 48,233, 48,237, 54,128,  5,240, 55,128,  5,241, 56,128,  5,\n    242,178, 51,128,251, 53, 57,  7, 49,  6, 49, 10, 49, 14, 49, 18,\n     49, 22, 49, 26, 49, 30, 51,128,  5,180, 52,128,  5,181, 53,128,\n      5,182, 54,128,  5,187, 55,128,  5,184, 56,128,  5,183, 57,128,\n      5,176, 56,  3, 49, 42, 49, 86, 49, 91, 48,  7, 49, 58, 49, 62,\n     49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128,  5,178, 49,128,\n      5,177, 50,128,  5,179, 51,128,  5,194, 52,128,  5,193, 54,128,\n      5,185, 55,128,  5,188,179, 57,128,  5,189, 52,  2, 49, 97, 49,\n    101, 49,128,  5,191, 50,128,  5,192,185,178, 57,128,  2,188, 54,\n      3, 49,119, 49,178, 49,185, 49,  4, 49,129, 49,145, 49,151, 49,\n    172, 50,  2, 49,135, 49,140,180, 56,128, 33,  5,184, 57,128, 33,\n     19,179,181, 50,128, 33, 22,181, 55,  3, 49,160, 49,164, 49,168,\n     51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128,\n     32, 12,179,177,182, 55,128,  6,109,180,185,179, 55,128,  2,189,\n    103,  2, 49,198, 49,205,242,225,246,101,128,  0,224,117,  2, 49,\n    211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235,\n    232,105,128, 10,  5,104,  2, 49,235, 49,245,233,242,225,231,225,\n    238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163,\n    105,  7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181,\n     98,  2, 50, 22, 50, 31,229,238,231,225,236,105,128,  9,144,239,\n    240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128,  9, 16,\n    229,227,249,242,233,236,236,233, 99,128,  4,213,231,117,  2, 50,\n     67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235,\n    232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235,\n    232,105,128, 10, 72,110,  5, 50,113, 50,122, 50,136, 50,152, 50,\n    167,225,242,225,226,233, 99,128,  6, 57,230,233,238,225,236,225,\n    242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225,\n    242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242,\n    225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229,\n    246,101,128,  2,  3,246,239,247,229,236,243,233,231,110,  3, 50,\n    197, 50,207, 50,214,226,229,238,231,225,236,105,128,  9,200,228,\n    229,246, 97,128,  9, 72,231,245,234,225,242,225,244,105,128, 10,\n    200,107,  2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48,\n    162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239,\n    242,229,225,110,128, 49, 79,108,  3, 51, 15, 52, 71, 52, 80,101,\n      2, 51, 21, 52, 66,102,136,  5,208, 51, 41, 51, 50, 51, 65, 51,\n     79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128,\n      6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251,\n     48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104,\n      2, 51, 85, 51,160,225,237,250, 97,  2, 51, 94, 51,127,225,226,\n    239,246,101,  2, 51,104, 51,113,225,242,225,226,233, 99,128,  6,\n     35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226,\n    229,236,239,119,  2, 51,137, 51,146,225,242,225,226,233, 99,128,\n      6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136,\n    229,226,242,229,119,128,  5,208,236,225,237,229,228,232,229,226,\n    242,229,119,128,251, 79,237, 97,  2, 51,189, 51,225,228,228,225,\n    225,226,239,246,101,  2, 51,202, 51,211,225,242,225,226,233, 99,\n    128,  6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254,\n    130,235,243,245,242, 97,  4, 51,239, 51,248, 52,  6, 52, 22,225,\n    242,225,226,233, 99,128,  6, 73,230,233,238,225,236,225,242,225,\n    226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225,\n    226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226,\n    233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119,\n    128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128,\n    251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76,\n    240,232, 97,129,  3,177, 52, 88,244,239,238,239,115,128,  3,172,\n    109,  4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128,\n      1,  1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242,\n    243,225,238,100,130,  0, 38, 52,139, 52,151,237,239,238,239,243,\n    240,225,227,101,128,255,  6,243,237,225,236,108,128,247, 38,243,\n    241,245,225,242,101,128, 51,194,110,  4, 52,178, 52,189, 53, 55,\n     53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103,  4, 52,\n    199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128,\n     49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90,\n    236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235,\n    229,116,  2, 52,247, 53, 11,236,229,230,116,129, 48,  8, 53,  0,\n    246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116,\n    129, 48,  9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64,\n    236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243,\n    244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128,  3,\n    135,117,  2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97,\n    128,  9, 82,243,246,225,242, 97,  3, 53, 95, 53,105, 53,112,226,\n    229,238,231,225,236,105,128,  9,130,228,229,246, 97,128,  9,  2,\n    231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229,\n    107,128,  1,  5,112,  3, 53,140, 53,164, 53,194, 97,  2, 53,146,\n     53,158,225,244,239,243,241,245,225,242,101,128, 51,  0,242,229,\n    110,128, 36,156,239,243,244,242,239,240,232,101,  2, 53,177, 53,\n    188,225,242,237,229,238,233,225,110,128,  5, 90,237,239,100,128,\n      2,188,112,  2, 53,200, 53,205,236,101,128,248,255,242,111,  2,\n     53,212, 53,220,225,227,232,229,115,128, 34, 80,120,  2, 53,226,\n     53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237,\n    225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245,\n    225,108,128, 34, 69,114,  4, 54, 15, 54, 42, 54, 46, 54, 91,225,\n    229, 97,  2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49,\n    142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105,  2,\n     54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128,\n     30,154,238,103,130,  0,229, 54, 75, 54, 83,225,227,245,244,101,\n    128,  1,251,226,229,236,239,119,128, 30,  1,242,239,119,  8, 54,\n    111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56,  4,226,\n    239,244,104,128, 33,148,100,  3, 54,126, 54,165, 54,212,225,243,\n    104,  4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33,\n    227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226,\n    245,112,128, 33,225,226,108,  5, 54,178, 54,185, 54,192, 54,199,\n     54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211,\n    236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245,\n    112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239,\n    236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247,\n    232,233,244,101,128, 33,233,104,  2, 54,253, 55, 48,229,225,100,\n      4, 55,  9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100,\n    128,  2,197,236,229,230,244,237,239,100,128,  2,194,242,233,231,\n    232,244,237,239,100,128,  2,195,245,240,237,239,100,128,  2,196,\n    239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144,\n     55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244,\n    242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116,\n    128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116,\n    132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244,\n    242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239,\n    246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128,\n     33,232,244,225, 98,  2, 55,170, 55,177,236,229,230,116,128, 33,\n    228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198,\n     55,226, 55,244, 55,252,100,  2, 55,204, 55,216,110,129, 33,149,\n     55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128,\n     33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247,\n    110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244,\n    101,128, 33,231,246,229,242,244,229,120,128,248,230,115,  5, 56,\n     25, 56,101, 56,146, 56,229, 56,239, 99,  2, 56, 31, 56, 83,233,\n    105,  2, 56, 38, 56, 61,227,233,242,227,245,109,129,  0, 94, 56,\n     49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236,\n    228,101,129,  0,126, 56, 71,237,239,238,239,243,240,225,227,101,\n    128,255, 94,242,233,240,116,129,  2, 81, 56, 92,244,245,242,238,\n    229,100,128,  2, 82,237,225,236,108,  2, 56,110, 56,121,232,233,\n    242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238,\n     97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128,\n    255,103,244,229,242,233,115,  2, 56,156, 56,225,107,131,  0, 42,\n     56,166, 56,194, 56,217, 97,  2, 56,172, 56,186,236,244,239,238,\n    229,225,242,225,226,233, 99,128,  6,109,242,225,226,233, 99,128,\n      6,109,109,  2, 56,200, 56,206,225,244,104,128, 34, 23,239,238,\n    239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254,\n     97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249,\n    237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108,\n    128, 34, 67,116,132,  0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233,\n    236,228,101,128,  0,227,237,239,238,239,243,240,225,227,101,128,\n    255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128,\n      2, 80,117,  6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157,\n     98,  2, 57, 70, 57, 79,229,238,231,225,236,105,128,  9,148,239,\n    240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128,  9, 20,\n    231,117,  2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148,\n    242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237,\n    225,242,235,226,229,238,231,225,236,105,128,  9,215,237,225,244,\n    242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247,\n    229,236,243,233,231,110,  3, 57,173, 57,183, 57,190,226,229,238,\n    231,225,236,105,128,  9,204,228,229,246, 97,128,  9, 76,231,245,\n    234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225,\n    228,229,246, 97,128,  9, 61,121,  2, 57,221, 57,233,226,225,242,\n    237,229,238,233,225,110,128,  5, 97,233,110,130,  5,226, 57,242,\n     58,  1,225,236,244,239,238,229,232,229,226,242,229,119,128,251,\n     32,232,229,226,242,229,119,128,  5,226, 98,144,  0, 98, 58, 46,\n     58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72,\n     62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97,  7,\n     58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229,\n    238,231,225,236,105,128,  9,172,227,235,243,236,225,243,104,129,\n      0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60,\n    228,229,246, 97,128,  9, 44,231,117,  2, 58,110, 58,119,234,225,\n    242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44,\n    104,  2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112,\n    244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97,\n    128, 48,208,114,129,  0,124, 58,169,237,239,238,239,243,240,225,\n    227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49,  5,\n    227,233,242,227,236,101,128, 36,209,228,239,116,  2, 58,209, 58,\n    218,225,227,227,229,238,116,128, 30,  3,226,229,236,239,119,128,\n     30,  5,101,  6, 58,240, 59,  5, 59, 28, 59,170, 59,181, 59,193,\n    225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244,\n    229,115,128, 38,108, 99,  2, 59, 11, 59, 18,225,245,243,101,128,\n     34, 53,249,242,233,236,236,233, 99,128,  4, 49,104,  5, 59, 40,\n     59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128,  6,\n     40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105,\n      2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233,\n     99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101,  2,\n     59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254,\n    146,229,237,105,  2, 59,121, 59,136,238,233,244,233,225,236,225,\n    242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225,\n    242,225,226,233, 99,128,252,  8,238,239,239,238,230,233,238,225,\n    236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225,\n    238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128,  5,\n     98,116,132,  5,209, 59,205, 59,225, 59,245, 59,254, 97,129,  3,\n    178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128,  3,\n    208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242,\n    229,119,128,251, 49,232,229,226,242,229,119,128,  5,209,242,225,\n    230,229,232,229,226,242,229,119,128,251, 76,104,  2, 60, 17, 60,\n     67, 97,  3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105,\n    128,  9,173,228,229,246, 97,128,  9, 45,231,117,  2, 60, 49, 60,\n     58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105,\n    128, 10, 45,239,239,107,128,  2, 83,105,  5, 60, 85, 60, 96, 60,\n    107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115,\n    235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225,\n    236,227,236,233,227,107,128,  2,152,238,228,233,231,245,242,237,\n    245,235,232,105,128, 10,  2,242,245,243,241,245,225,242,101,128,\n     51, 49,108,  3, 60,154, 62, 55, 62, 66, 97,  2, 60,160, 62, 50,\n    227,107,  6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227,\n    233,242,227,236,101,128, 37,207,100,  2, 60,190, 60,199,233,225,\n    237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233,\n    238,231,244,242,233,225,238,231,236,101,128, 37,188,108,  2, 60,\n    227, 61, 74,101,  2, 60,233, 61, 13,230,244,240,239,233,238,244,\n    233,238,103,  2, 60,248, 61,  2,240,239,233,238,244,229,114,128,\n     37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233,\n    227,245,236,225,242,226,242,225,227,235,229,116,  2, 61, 33, 61,\n     53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227,\n    225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246,\n    229,242,244,233,227,225,108,128,254, 60,239,247,229,114,  2, 61,\n     83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128,\n     37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128,\n     37,226,114,  2, 61,120, 61,131,229,227,244,225,238,231,236,101,\n    128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103,  2,\n     61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242,\n    233,225,238,231,236,101,128, 37,182,115,  3, 61,177, 61,207, 61,\n    215,109,  2, 61,183, 61,195,225,236,236,243,241,245,225,242,101,\n    128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241,\n    245,225,242,101,128, 37,160,244,225,114,128, 38,  5,245,240,112,\n      2, 61,229, 62, 11,229,114,  2, 61,236, 61,251,236,229,230,244,\n    244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244,\n    244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233,\n    238,103,  2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225,\n    238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128,\n     37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128,\n     30,  7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227,\n    101,128,255, 66,111,  3, 62, 92, 62,105, 62,116,226,225,233,237,\n    225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238,\n     97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240,\n    225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51,\n    195,114,  4, 62,155, 63,149, 63,222, 64,  5,225, 99,  2, 62,162,\n     63, 56,101,  3, 62,170, 62,175, 62,243,229,120,128,248,244,236,\n    229,230,116,133,  0,123, 62,192, 62,197, 62,219, 62,227, 62,232,\n    226,116,128,248,243,109,  2, 62,203, 62,208,233,100,128,248,242,\n    239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108,\n    128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108,\n    128,254, 55,242,233,231,232,116,133,  0,125, 63,  5, 63, 10, 63,\n     32, 63, 40, 63, 45,226,116,128,248,254,109,  2, 63, 16, 63, 21,\n    233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93,\n    243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242,\n    244,233,227,225,108,128,254, 56,235,229,116,  2, 63, 64, 63,106,\n    236,229,230,116,132,  0, 91, 63, 79, 63, 84, 63, 89, 63,101,226,\n    116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225,\n    227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132,\n      0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229,\n    120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61,\n    244,112,128,248,249,229,246,101,131,  2,216, 63,161, 63,172, 63,\n    178,226,229,236,239,247,227,237, 98,128,  3, 46,227,237, 98,128,\n      3,  6,233,238,246,229,242,244,229,100,  3, 63,193, 63,204, 63,\n    210,226,229,236,239,247,227,237, 98,128,  3, 47,227,237, 98,128,\n      3, 17,228,239,245,226,236,229,227,237, 98,128,  3, 97,233,228,\n    231,101,  2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128,\n      3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227,\n    237, 98,128,  3, 58,239,235,229,238,226,225,114,128,  0,166,115,\n      2, 64, 21, 64, 29,244,242,239,235,101,128,  1,128,245,240,229,\n    242,233,239,114,128,246,234,244,239,240,226,225,114,128,  1,131,\n    117,  3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97,\n    128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108,\n      2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238,\n    246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114,\n    128, 34, 25,243,229,249,101,128, 37,206, 99,143,  0, 99, 64,156,\n     65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43,\n     69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97,  9, 64,176,\n     64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51,\n    225,242,237,229,238,233,225,110,128,  5,110,226,229,238,231,225,\n    236,105,128,  9,154,227,245,244,101,128,  1,  7,228,229,246, 97,\n    128,  9, 26,231,117,  2, 64,218, 64,227,234,225,242,225,244,105,\n    128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245,\n    225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117,  4,\n     65,  8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128,\n      9,129,227,237, 98,128,  3, 16,228,229,246, 97,128,  9,  1,231,\n    245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107,\n    128, 33,234,114,  3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33,\n      5,239,110,130,  2,199, 65, 74, 65, 85,226,229,236,239,247,227,\n    237, 98,128,  3, 44,227,237, 98,128,  3, 12,242,233,225,231,229,\n    242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230,\n    111,128, 49, 24, 99,  4, 65,126, 65,133, 65,152, 65,174,225,242,\n    239,110,128,  1, 13,229,228,233,236,236, 97,129,  0,231, 65,144,\n    225,227,245,244,101,128, 30,  9,233,242, 99,  2, 65,160, 65,165,\n    236,101,128, 36,210,245,237,230,236,229,120,128,  1,  9,245,242,\n    108,128,  2, 85,100,  2, 65,186, 65,202,239,116,129,  1, 11, 65,\n    193,225,227,227,229,238,116,128,  1, 11,243,241,245,225,242,101,\n    128, 51,197,101,  2, 65,217, 65,233,228,233,236,236, 97,129,  0,\n    184, 65,227,227,237, 98,128,  3, 39,238,116,132,  0,162, 65,246,\n     66, 14, 66, 26, 66, 37,105,  2, 65,252, 66,  4,231,242,225,228,\n    101,128, 33,  3,238,230,229,242,233,239,114,128,246,223,237,239,\n    238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249,\n    236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224,\n    104,  5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97,  4, 66, 70,\n     66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128,  5,\n    121,226,229,238,231,225,236,105,128,  9,155,228,229,246, 97,128,\n      9, 27,231,117,  2, 66,105, 66,114,234,225,242,225,244,105,128,\n     10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237,\n    239,230,111,128, 49, 20,101,  6, 66,148, 66,168, 66,192, 67,  4,\n     67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242,\n    233,236,236,233, 99,128,  4,189, 99,  2, 66,174, 66,182,235,237,\n    225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128,  4, 71,\n    100,  2, 66,198, 66,242,229,243,227,229,238,228,229,114,  2, 66,\n    211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233,\n    236,236,233, 99,128,  4,191,227,249,242,233,236,236,233, 99,128,\n      4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233,\n     99,128,  4,245,232,225,242,237,229,238,233,225,110,128,  5,115,\n    235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236,\n    233, 99,128,  4,204,246,229,242,244,233,227,225,236,243,244,242,\n    239,235,229,227,249,242,233,236,236,233, 99,128,  4,185,105,129,\n      3,199, 67, 68,229,245,227,104,  4, 67, 81, 67,116, 67,131, 67,\n    140, 97,  2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242,\n    229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225,\n    110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110,\n    128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229,\n    238,235,239,242,229,225,110,128, 50,  9,111,  2, 67,160, 67,210,\n    227,104,  3, 67,169, 67,191, 67,201,225,110,  2, 67,176, 67,184,\n    231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14,  8,233,\n    238,231,244,232,225,105,128, 14,  9,239,229,244,232,225,105,128,\n     14, 12,239,107,128,  1,136,105,  2, 67,221, 68, 67,229,245, 99,\n      5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97,  2, 67,241, 68,\n      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118,\n    240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233,\n    242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242,\n    229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225,\n    110,128, 50,  8,245,240,225,242,229,238,235,239,242,229,225,110,\n    128, 50, 28,242, 99,  2, 68, 74, 68,169,236,101,132, 37,203, 68,\n     87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128,\n     34,151,239,116,128, 34,153,112,  2, 68,109, 68,115,236,245,115,\n    128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247,\n    233,244,104,  2, 68,136, 68,152,236,229,230,244,232,225,236,230,\n    226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236,\n    230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130,\n      2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128,  3,\n     45,227,237, 98,128,  3,  2,108,  3, 68,207, 68,213, 69, 11,229,\n    225,114,128, 35, 39,233,227,107,  4, 68,225, 68,236, 68,245, 68,\n    255,225,236,246,229,239,236,225,114,128,  1,194,228,229,238,244,\n    225,108,128,  1,192,236,225,244,229,242,225,108,128,  1,193,242,\n    229,244,242,239,230,236,229,120,128,  1,195,245, 98,129, 38, 99,\n     69, 18,243,245,233,116,  2, 69, 27, 69, 35,226,236,225,227,107,\n    128, 38, 99,247,232,233,244,101,128, 38,103,109,  3, 69, 51, 69,\n     65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51,\n    164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225,\n    242,229,228,243,241,245,225,242,101,128, 51,160,111,  8, 69,110,\n     69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242,\n    237,229,238,233,225,110,128,  5,129,236,239,110,131,  0, 58, 69,\n    133, 69,158, 69,177,237,239,110,  2, 69,141, 69,149,229,244,225,\n    242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115,  2,\n     69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254,\n     85,244,242,233,225,238,231,245,236,225,114,  2, 69,192, 69,202,\n    232,225,236,230,237,239,100,128,  2,209,237,239,100,128,  2,208,\n    109,  2, 69,214, 70,143,237, 97,134,  0, 44, 69,231, 70, 39, 70,\n     50, 70, 62, 70, 92, 70,115, 97,  3, 69,239, 70,  9, 70, 17,226,\n    239,246,101,  2, 69,248, 69,254,227,237, 98,128,  3, 19,242,233,\n    231,232,244,227,237, 98,128,  3, 21,227,227,229,238,116,128,246,\n    195,114,  2, 70, 23, 70, 30,225,226,233, 99,128,  6, 12,237,229,\n    238,233,225,110,128,  5, 93,233,238,230,229,242,233,239,114,128,\n    246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229,\n    246,229,242,243,229,100,  2, 70, 75, 70, 86,225,226,239,246,229,\n    227,237, 98,128,  3, 20,237,239,100,128,  2,189,115,  2, 70, 98,\n     70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114,\n    128,246,226,244,245,242,238,229,100,  2, 70,126, 70,137,225,226,\n    239,246,229,227,237, 98,128,  3, 18,237,239,100,128,  2,187,240,\n    225,243,115,128, 38, 60,110,  2, 70,156, 70,165,231,242,245,229,\n    238,116,128, 34, 69,116,  2, 70,171, 70,185,239,245,242,233,238,\n    244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35,  3, 70,\n    219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71,\n    112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128,  0,\n      6, 66,  2, 70,231, 70,236,197, 76,128,  0,  7, 83,128,  0,  8,\n     67,  2, 70,246, 70,251,193, 78,128,  0, 24, 82,128,  0, 13, 68,\n      3, 71,  7, 71, 33, 71, 38, 67,  4, 71, 17, 71, 21, 71, 25, 71,\n     29, 49,128,  0, 17, 50,128,  0, 18, 51,128,  0, 19, 52,128,  0,\n     20,197, 76,128,  0,127,204, 69,128,  0, 16, 69,  5, 71, 55, 71,\n     59, 71, 64, 71, 69, 71, 74, 77,128,  0, 25,206, 81,128,  0,  5,\n    207, 84,128,  0,  4,211, 67,128,  0, 27, 84,  2, 71, 80, 71, 84,\n     66,128,  0, 23, 88,128,  0,  3, 70,  2, 71, 94, 71, 98, 70,128,\n      0, 12, 83,128,  0, 28,199, 83,128,  0, 29,200, 84,128,  0,  9,\n    204, 70,128,  0, 10,206,193, 75,128,  0, 21,210, 83,128,  0, 30,\n     83,  5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128,  0, 15,\n     79,129,  0, 14, 71,150, 84,128,  0,  2,212, 88,128,  0,  1,213,\n     66,128,  0, 26,217, 78,128,  0, 22,213, 83,128,  0, 31,214, 84,\n    128,  0, 11,240,249,242,233,231,232,116,129,  0,169, 71,191,115,\n      2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128,\n    246,217,114,  2, 71,216, 72, 44,238,229,242,226,242,225,227,235,\n    229,116,  2, 71,231, 72,  9,236,229,230,116,130, 48, 12, 71,242,\n     71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229,\n    242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48,\n     13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255,\n     99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225,\n    244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245,\n    225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242,\n    101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229,\n    233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128,\n      2,151,245,114,  2, 72,121, 72,139,236,121,  2, 72,128, 72,134,\n    225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121,\n    128,  0,164,249,114,  4, 72,158, 72,166, 72,173, 72,181,194,242,\n    229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229,\n    246,101,128,246,212,230,236,229,120,128,246,213,100,146,  0,100,\n     72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59,\n     78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227,\n     79,247, 80, 19, 97, 11, 72,252, 73,  7, 73, 17, 73, 89, 73,152,\n     73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229,\n    238,233,225,110,128,  5,100,226,229,238,231,225,236,105,128,  9,\n    166,100,  5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225,\n    226,233, 99,128,  6, 54,229,246, 97,128,  9, 38,230,233,238,225,\n    236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225,\n    236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236,\n    225,242,225,226,233, 99,128,254,192,103,  3, 73, 97, 73,114, 73,\n    128,229,243,104,129,  5,188, 73,105,232,229,226,242,229,119,128,\n      5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33,\n    117,  2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242,\n    237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97,\n    128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108,  3,\n     73,182, 73,191, 73,229,225,242,225,226,233, 99,128,  6, 47,229,\n    116,130,  5,211, 73,200, 73,220,228,225,231,229,243,104,129,251,\n     51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242,\n    229,119,128,  5,211,230,233,238,225,236,225,242,225,226,233, 99,\n    128,254,170,237,237, 97,  3, 73,253, 74,  6, 74, 18,225,242,225,\n    226,233, 99,128,  6, 79,236,239,247,225,242,225,226,233, 99,128,\n      6, 79,244,225,238, 97,  2, 74, 27, 74, 41,236,244,239,238,229,\n    225,242,225,226,233, 99,128,  6, 76,242,225,226,233, 99,128,  6,\n     76,238,228, 97,128,  9,100,242,231, 97,  2, 74, 63, 74, 72,232,\n    229,226,242,229,119,128,  5,167,236,229,230,244,232,229,226,242,\n    229,119,128,  5,167,243,233,225,240,238,229,245,237,225,244,225,\n    227,249,242,233,236,236,233,227,227,237, 98,128,  4,133, 98,  3,\n     74,118, 75,115, 75,125,108,  9, 74,138, 74,146, 75,  3, 75, 11,\n     75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128,\n    246,211, 97,  2, 74,152, 74,209,238,231,236,229,226,242,225,227,\n    235,229,116,  2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74,\n    177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232,\n    116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254,\n     62,114,  2, 74,215, 74,236,227,232,233,238,246,229,242,244,229,\n    228,226,229,236,239,247,227,237, 98,128,  3, 43,242,239,119,  2,\n     74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116,\n    128, 33,210,228,225,238,228, 97,128,  9,101,231,242,225,246,101,\n    129,246,214, 75, 21,227,237, 98,128,  3, 15,233,238,244,229,231,\n    242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23,\n     75, 50,227,237, 98,128,  3, 51,239,246,229,242,236,233,238,229,\n    227,237, 98,128,  3, 63,240,242,233,237,229,237,239,100,128,  2,\n    186,246,229,242,244,233,227,225,108,  2, 75, 94, 75,100,226,225,\n    114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98,\n    128,  3, 14,239,240,239,237,239,230,111,128, 49,  9,243,241,245,\n    225,242,101,128, 51,200, 99,  4, 75,144, 75,151, 75,160, 75,187,\n    225,242,239,110,128,  1, 15,229,228,233,236,236, 97,128, 30, 17,\n    233,242, 99,  2, 75,168, 75,173,236,101,128, 36,211,245,237,230,\n    236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128,\n      1, 17,100,  4, 75,204, 76, 29, 76, 39, 76, 90, 97,  4, 75,214,\n     75,224, 75,231, 76,  0,226,229,238,231,225,236,105,128,  9,161,\n    228,229,246, 97,128,  9, 33,231,117,  2, 75,238, 75,247,234,225,\n    242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33,\n    108,  2, 76,  6, 76, 15,225,242,225,226,233, 99,128,  6,136,230,\n    233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225,\n    228,229,246, 97,128,  9, 92,232, 97,  3, 76, 48, 76, 58, 76, 65,\n    226,229,238,231,225,236,105,128,  9,162,228,229,246, 97,128,  9,\n     34,231,117,  2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10,\n    162,242,237,245,235,232,105,128, 10, 34,239,116,  2, 76, 97, 76,\n    106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128,\n     30, 13,101,  8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238,\n     77, 27, 77, 63, 99,  2, 76,138, 76,175,233,237,225,236,243,229,\n    240,225,242,225,244,239,114,  2, 76,156, 76,165,225,242,225,226,\n    233, 99,128,  6,107,240,229,242,243,233,225,110,128,  6,107,249,\n    242,233,236,236,233, 99,128,  4, 52,231,242,229,101,128,  0,176,\n    232,105,  2, 76,199, 76,208,232,229,226,242,229,119,128,  5,173,\n    242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99,\n    128,  3,239,235,225,244,225,235,225,238, 97,128, 48,199,108,  2,\n     76,244, 77, 11,229,244,101,  2, 76,252, 77,  3,236,229,230,116,\n    128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129,  3,180,\n     77, 18,244,245,242,238,229,100,128,  1,141,238,239,237,233,238,\n    225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229,\n    242,225,244,239,242,226,229,238,231,225,236,105,128,  9,248,250,\n    104,128,  2,164,104,  2, 77, 74, 77,124, 97,  3, 77, 82, 77, 92,\n     77, 99,226,229,238,231,225,236,105,128,  9,167,228,229,246, 97,\n    128,  9, 39,231,117,  2, 77,106, 77,115,234,225,242,225,244,105,\n    128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128,\n      2, 87,105,  6, 77,144, 77,193, 77,253, 78,  8, 78, 19, 78, 29,\n     97,  2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239,\n    115,129,  3,133, 77,166,227,237, 98,128,  3, 68,237,239,238,100,\n    129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38,\n     98,229,242,229,243,233,115,133,  0,168, 77,212, 77,220, 77,231,\n     77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239,\n    247,227,237, 98,128,  3, 36,227,237, 98,128,  3,  8,231,242,225,\n    246,101,128,246,216,244,239,238,239,115,128,  3,133,232,233,242,\n    225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97,\n    128, 48,194,244,244,239,237,225,242,107,128, 48,  3,246,105,  2,\n     78, 36, 78, 47,228,101,129,  0,247, 78, 43,115,128, 34, 35,243,\n    233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242,\n    233,236,236,233, 99,128,  4, 82,235,243,232,225,228,101,128, 37,\n    147,108,  2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128,\n     30, 15,243,241,245,225,242,101,128, 51,151,109,  2, 78,113, 78,\n    121,225,227,242,239,110,128,  1, 17,239,238,239,243,240,225,227,\n    101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78,\n    163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79,\n    154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228,\n    229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238,\n     97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236,\n    236,225,114,132,  0, 36, 78,222, 78,233, 78,245, 79,  0,233,238,\n    230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225,\n    227,101,128,255,  4,239,236,228,243,244,249,236,101,128,247, 36,\n    115,  2, 79,  6, 79, 13,237,225,236,108,128,254,105,245,240,229,\n    242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241,\n    245,225,242,101,128, 51, 38,116,  6, 79, 53, 79, 70, 79, 92, 79,\n    103, 79,135, 79,142,225,227,227,229,238,116,129,  2,217, 79, 64,\n    227,237, 98,128,  3,  7,226,229,236,239,247, 99,  2, 79, 81, 79,\n     86,237, 98,128,  3, 35,239,237, 98,128,  3, 35,235,225,244,225,\n    235,225,238, 97,128, 48,251,236,229,243,115,  2, 79,112, 79,116,\n    105,128,  1, 49,106,129,246,190, 79,122,243,244,242,239,235,229,\n    232,239,239,107,128,  2,132,237,225,244,104,128, 34,197,244,229,\n    228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239,\n    228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229,\n    119,128,251, 31,247,238,244,225,227,107,  2, 79,191, 79,202,226,\n    229,236,239,247,227,237, 98,128,  3, 30,237,239,100,128,  2,213,\n    240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114,\n    128,246,235,116,  2, 79,233, 79,239,225,233,108,128,  2, 86,239,\n    240,226,225,114,128,  1,140,117,  2, 79,253, 80,  8,232,233,242,\n    225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97,\n    128, 48,197,122,132,  1,243, 80, 31, 80, 40, 80, 59, 80, 96,225,\n    236,244,239,238,101,128,  2,163, 99,  2, 80, 46, 80, 53,225,242,\n    239,110,128,  1,198,245,242,108,128,  2,165,101,  2, 80, 65, 80,\n     85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,\n    233, 99,128,  4,225,227,249,242,233,236,236,233, 99,128,  4, 85,\n    232,229,227,249,242,233,236,236,233, 99,128,  4, 95,101,151,  0,\n    101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82,\n     60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85,\n    230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97,\n      2, 80,165, 80,172,227,245,244,101,128,  0,233,242,244,104,128,\n     38, 65, 98,  3, 80,186, 80,195, 80,205,229,238,231,225,236,105,\n    128,  9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246,\n    101,128,  1, 21, 99,  5, 80,224, 81, 41, 81, 55, 81, 87, 81,176,\n     97,  2, 80,230, 81, 35,238,228,242, 97,  3, 80,241, 80,248, 81,\n      3,228,229,246, 97,128,  9, 13,231,245,234,225,242,225,244,105,\n    128, 10,141,246,239,247,229,236,243,233,231,110,  2, 81, 17, 81,\n     24,228,229,246, 97,128,  9, 69,231,245,234,225,242,225,244,105,\n    128, 10,197,242,239,110,128,  1, 27,229,228,233,236,236,225,226,\n    242,229,246,101,128, 30, 29,104,  2, 81, 61, 81, 72,225,242,237,\n    229,238,233,225,110,128,  5,101,249,233,247,238,225,242,237,229,\n    238,233,225,110,128,  5,135,233,242, 99,  2, 81, 95, 81,100,236,\n    101,128, 36,212,245,237,230,236,229,120,134,  0,234, 81,121, 81,\n    129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30,\n    191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239,\n    119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235,\n    225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197,\n    249,242,233,236,236,233, 99,128,  4, 84,100,  4, 81,196, 81,206,\n     81,212, 81,222,226,236,231,242,225,246,101,128,  2,  5,229,246,\n     97,128,  9, 15,233,229,242,229,243,233,115,128,  0,235,239,116,\n    130,  1, 23, 81,231, 81,240,225,227,227,229,238,116,128,  1, 23,\n    226,229,236,239,119,128, 30,185,101,  2, 81,254, 82,  9,231,245,\n    242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245,\n    242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236,\n    233, 99,128,  4, 68,103,  2, 82, 43, 82, 50,242,225,246,101,128,\n      0,232,245,234,225,242,225,244,105,128, 10,143,104,  4, 82, 70,\n     82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128,  5,\n    103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231,\n    225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30,\n    187,105,  4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237,\n    239,230,111,128, 49, 31,231,232,116,142,  0, 56, 82,168, 82,177,\n     82,187, 82,217, 82,224, 83,  6, 83, 31, 83, 76, 83,110, 83,122,\n     83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128,  6,\n    104,226,229,238,231,225,236,105,128,  9,238,227,233,242,227,236,\n    101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238,\n    243,243,229,242,233,102,128, 39,145,228,229,246, 97,128,  9,110,\n    229,229,110,  2, 82,232, 82,241,227,233,242,227,236,101,128, 36,\n    113,112,  2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242,\n    233,239,100,128, 36,153,231,117,  2, 83, 13, 83, 22,234,225,242,\n    225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104,\n      2, 83, 37, 83, 63, 97,  2, 83, 43, 83, 54,227,235,225,242,225,\n    226,233, 99,128,  6,104,238,231,250,232,239,117,128, 48, 40,238,\n    239,244,229,226,229,225,237,229,100,128, 38,107,105,  2, 83, 82,\n     83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229,\n    110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239,\n    238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249,\n    236,101,128,247, 56,112,  2, 83,139, 83,146,225,242,229,110,128,\n     36,123,229,114,  2, 83,153, 83,159,233,239,100,128, 36,143,243,\n    233,225,110,128,  6,248,242,239,237,225,110,128, 33,119,243,245,\n    240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88,\n    238,246,229,242,244,229,228,226,242,229,246,101,128,  2,  7,239,\n    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,\n    101,107,  2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48,\n    168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111,\n      2, 84,  5, 84, 20,238,235,225,242,231,245,242,237,245,235,232,\n    105,128, 10,116,242,229,225,110,128, 49, 84,108,  3, 84, 35, 84,\n     46, 84,107,227,249,242,233,236,236,233, 99,128,  4, 59,101,  2,\n     84, 52, 84, 59,237,229,238,116,128, 34,  8,246,229,110,  3, 84,\n     69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112,  2,\n     84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100,\n    128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233,\n    115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34,\n    238,109,  5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242,\n    239,110,130,  1, 19, 84,153, 84,161,225,227,245,244,101,128, 30,\n     23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233,\n     99,128,  4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242,\n    244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101,\n    128,255, 69,112,  2, 84,217, 84,237,232,225,243,233,243,237,225,\n    242,235,225,242,237,229,238,233,225,110,128,  5, 91,244,249,243,\n    229,116,128, 34,  5,110,  6, 85,  3, 85, 14, 85, 25, 85, 69, 85,\n    101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249,\n    242,233,236,236,233, 99,128,  4, 61,100,  2, 85, 31, 85, 50,225,\n    243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128,\n    254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236,\n    233, 99,128,  4,163,103,130,  1, 75, 85, 77, 85, 88,226,239,240,\n    239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236,\n    233, 99,128,  4,165,232,239,239,235,227,249,242,233,236,236,233,\n     99,128,  4,200,243,240,225,227,101,128, 32,  2,111,  3, 85,132,\n     85,140, 85,149,231,239,238,229,107,128,  1, 25,235,239,242,229,\n    225,110,128, 49, 83,240,229,110,130,  2, 91, 85,159, 85,168,227,\n    236,239,243,229,100,128,  2,154,242,229,246,229,242,243,229,100,\n    130,  2, 92, 85,183, 85,192,227,236,239,243,229,100,128,  2, 94,\n    232,239,239,107,128,  2, 93,112,  2, 85,205, 85,212,225,242,229,\n    110,128, 36,160,243,233,236,239,110,129,  3,181, 85,222,244,239,\n    238,239,115,128,  3,173,241,117,  2, 85,237, 86, 25,225,108,130,\n      0, 61, 85,246, 86,  2,237,239,238,239,243,240,225,227,101,128,\n    255, 29,115,  2, 86,  8, 86, 15,237,225,236,108,128,254,102,245,\n    240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227,\n    101,128, 34, 97,114,  3, 86, 44, 86, 55, 86, 66,226,239,240,239,\n    237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128,\n      4, 64,229,246,229,242,243,229,100,129,  2, 88, 86, 78,227,249,\n    242,233,236,236,233, 99,128,  4, 77,115,  6, 86,103, 86,114, 86,\n    134, 86,215, 87,  4, 87, 14,227,249,242,233,236,236,233, 99,128,\n      4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236,\n    236,233, 99,128,  4,171,104,132,  2,131, 86,146, 86,153, 86,184,\n     86,199,227,245,242,108,128,  2,134,239,242,116,  2, 86,161, 86,\n    168,228,229,246, 97,128,  9, 14,246,239,247,229,236,243,233,231,\n    238,228,229,246, 97,128,  9, 70,242,229,246,229,242,243,229,228,\n    236,239,239,112,128,  1,170,243,241,245,225,244,242,229,246,229,\n    242,243,229,100,128,  2,133,237,225,236,108,  2, 86,224, 86,235,\n    232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235,\n    225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244,\n    104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240,\n    229,242,233,239,114,128,246,236,116,  5, 87, 36, 87, 62, 87, 66,\n     87, 83, 87,149, 97,130,  3,183, 87, 44, 87, 54,242,237,229,238,\n    233,225,110,128,  5,104,244,239,238,239,115,128,  3,174,104,128,\n      0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119,\n    128, 30, 27,238,225,232,244, 97,  3, 87, 95, 87,127, 87,136,230,\n    239,245,235,104,  2, 87,105, 87,114,232,229,226,242,229,119,128,\n      5,145,236,229,230,244,232,229,226,242,229,119,128,  5,145,232,\n    229,226,242,229,119,128,  5,145,236,229,230,244,232,229,226,242,\n    229,119,128,  5,145,245,242,238,229,100,128,  1,221,117,  2, 87,\n    163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32,\n    172,246,239,247,229,236,243,233,231,110,  3, 87,193, 87,203, 87,\n    210,226,229,238,231,225,236,105,128,  9,199,228,229,246, 97,128,\n      9, 71,231,245,234,225,242,225,244,105,128, 10,199,120,  2, 87,\n    227, 88, 44,227,236,225,109,132,  0, 33, 87,242, 87,253, 88, 24,\n     88, 36,225,242,237,229,238,233,225,110,128,  5, 92,100,  2, 88,\n      3, 88,  8,226,108,128, 32, 60,239,247,110,129,  0,161, 88, 16,\n    243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227,\n    101,128,255,  1,243,237,225,236,108,128,247, 33,233,243,244,229,\n    238,244,233,225,108,128, 34,  3,250,104,131,  2,146, 88, 67, 88,\n     86, 88, 97, 99,  2, 88, 73, 88, 80,225,242,239,110,128,  1,239,\n    245,242,108,128,  2,147,242,229,246,229,242,243,229,100,128,  1,\n    185,244,225,233,108,128,  1,186,102,140,  0,102, 88,132, 88,214,\n     88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156,\n     93, 33, 93, 41, 97,  4, 88,142, 88,149, 88,160, 88,171,228,229,\n    246, 97,128,  9, 94,231,245,242,237,245,235,232,105,128, 10, 94,\n    232,242,229,238,232,229,233,116,128, 33,  9,244,232, 97,  3, 88,\n    181, 88,190, 88,202,225,242,225,226,233, 99,128,  6, 78,236,239,\n    247,225,242,225,226,233, 99,128,  6, 78,244,225,238,225,242,225,\n    226,233, 99,128,  6, 75,226,239,240,239,237,239,230,111,128, 49,\n      8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227,\n    229,238,116,128, 30, 31,101,  3, 88,254, 89, 76, 89, 86,104,  4,\n     89,  8, 89, 31, 89, 45, 89, 61,225,114,  2, 89, 15, 89, 22,225,\n    226,233, 99,128,  6, 65,237,229,238,233,225,110,128,  5,134,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233,\n    244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228,\n    233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240,\n    244,233, 99,128,  3,229,237,225,236,101,128, 38, 64,102,130,251,\n      0, 89,101, 89,105,105,128,251,  3,108,128,251,  4,105,136,251,\n      1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90,\n    106,230,244,229,229,110,  2, 89,139, 89,148,227,233,242,227,236,\n    101,128, 36,110,112,  2, 89,154, 89,161,225,242,229,110,128, 36,\n    130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243,\n    104,128, 32, 18,236,236,229,100,  2, 89,189, 89,195,226,239,120,\n    128, 37,160,242,229,227,116,128, 37,172,238,225,108,  5, 89,216,\n     89,255, 90, 16, 90, 33, 90, 49,235,225,102,130,  5,218, 89,226,\n     89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226,\n    242,229,119,128,251, 58,232,229,226,242,229,119,128,  5,218,237,\n    229,109,129,  5,221, 90,  7,232,229,226,242,229,119,128,  5,221,\n    238,245,110,129,  5,223, 90, 24,232,229,226,242,229,119,128,  5,\n    223,240,101,129,  5,227, 90, 40,232,229,226,242,229,119,128,  5,\n    227,244,243,225,228,105,129,  5,229, 90, 59,232,229,226,242,229,\n    119,128,  5,229,242,243,244,244,239,238,229,227,232,233,238,229,\n    243,101,128,  2,201,243,232,229,249,101,128, 37,201,244,225,227,\n    249,242,233,236,236,233, 99,128,  4,115,246,101,142,  0, 53, 90,\n    139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91,  1, 91,\n     35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233,\n     99,128,  6,101,226,229,238,231,225,236,105,128,  9,235,227,233,\n    242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229,\n    243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97,\n    128,  9,107,229,233,231,232,244,232,115,128, 33, 93,231,117,  2,\n     90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245,\n    235,232,105,128, 10,107,232, 97,  2, 90,237, 90,248,227,235,225,\n    242,225,226,233, 99,128,  6,101,238,231,250,232,239,117,128, 48,\n     37,105,  2, 91,  7, 91, 25,228,229,239,231,242,225,240,232,233,\n    227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114,\n    128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239,\n    236,228,243,244,249,236,101,128,247, 53,112,  2, 91, 64, 91, 71,\n    225,242,229,110,128, 36,120,229,114,  2, 91, 78, 91, 84,233,239,\n    100,128, 36,140,243,233,225,110,128,  6,245,242,239,237,225,110,\n    128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232,\n    225,105,128, 14, 85,108,129,251,  2, 91,123,239,242,233,110,128,\n      1,146,109,  2, 91,136, 91,147,239,238,239,243,240,225,227,101,\n    128,255, 70,243,241,245,225,242,101,128, 51,153,111,  4, 91,166,\n     91,188, 91,200, 91,207,230, 97,  2, 91,173, 91,181,238,244,232,\n    225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225,\n    238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34,  0,245,\n    114,142,  0, 52, 91,240, 91,249, 92,  3, 92, 33, 92, 40, 92, 65,\n     92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220,\n    225,242,225,226,233, 99,128,  6,100,226,229,238,231,225,236,105,\n    128,  9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238,\n    246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,\n    141,228,229,246, 97,128,  9,106,231,117,  2, 92, 47, 92, 56,234,\n    225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10,\n    106,232, 97,  2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99,\n    128,  6,100,238,231,250,232,239,117,128, 48, 36,105,  2, 92, 98,\n     92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229,\n    110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239,\n    238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225,\n    244,239,242,226,229,238,231,225,236,105,128,  9,247,239,236,228,\n    243,244,249,236,101,128,247, 52,112,  2, 92,174, 92,181,225,242,\n    229,110,128, 36,119,229,114,  2, 92,188, 92,194,233,239,100,128,\n     36,139,243,233,225,110,128,  6,244,242,239,237,225,110,128, 33,\n    115,243,245,240,229,242,233,239,114,128, 32,116,116,  2, 92,226,\n     93,  8,229,229,110,  2, 92,234, 92,243,227,233,242,227,236,101,\n    128, 36,109,112,  2, 92,249, 93,  0,225,242,229,110,128, 36,129,\n    229,242,233,239,100,128, 36,149,104,  2, 93, 14, 93, 19,225,105,\n    128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128,  2,\n    203,240,225,242,229,110,128, 36,161,242, 97,  2, 93, 48, 93, 56,\n    227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144,  0,\n    103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96,\n    143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98,\n    158, 97,  9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93,\n    241, 93,252, 94, 30,226,229,238,231,225,236,105,128,  9,151,227,\n    245,244,101,128,  1,245,228,229,246, 97,128,  9, 23,102,  4, 93,\n    151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128,  6,175,\n    230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229,\n    228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117,  2,\n     93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245,\n    235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48,\n     76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130,\n      3,179, 94,  6, 94, 19,236,225,244,233,238,243,237,225,236,108,\n    128,  2, 99,243,245,240,229,242,233,239,114,128,  2,224,238,231,\n    233,225,227,239,240,244,233, 99,128,  3,235, 98,  2, 94, 49, 94,\n     59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128,\n      1, 31, 99,  4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110,\n    128,  1,231,229,228,233,236,236, 97,128,  1, 35,233,242, 99,  2,\n     94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128,\n      1, 29,239,237,237,225,225,227,227,229,238,116,128,  1, 35,228,\n    239,116,129,  1, 33, 94,135,225,227,227,229,238,116,128,  1, 33,\n    101,  6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249,\n    242,233,236,236,233, 99,128,  4, 51,232,233,242,225,231,225,238,\n     97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239,\n    237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128,\n     34, 81,114,  3, 94,218, 95, 11, 95, 21,229,243,104,  3, 94,228,\n     94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119,\n    128,  5,156,232,229,226,242,229,119,128,  5,243,237,245,241,228,\n    225,237,232,229,226,242,229,119,128,  5,157,237,225,238,228,226,\n    236,115,128,  0,223,243,232,225,249,233,109,  2, 95, 32, 95, 47,\n    225,227,227,229,238,244,232,229,226,242,229,119,128,  5,158,232,\n    229,226,242,229,119,128,  5,244,244,225,237,225,242,107,128, 48,\n     19,104,  5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97,  4, 95,\n     87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128,  9,\n    152,100,  2, 95,103, 95,114,225,242,237,229,238,233,225,110,128,\n      5,114,229,246, 97,128,  9, 24,231,117,  2, 95,127, 95,136,234,\n    225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10,\n     24,233,110,  4, 95,156, 95,165, 95,179, 95,195,225,242,225,226,\n    233, 99,128,  6, 58,230,233,238,225,236,225,242,225,226,233, 99,\n    128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99,\n    128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128,\n    254,208,101,  3, 95,218, 95,239, 96,  0,237,233,228,228,236,229,\n    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,149,243,\n    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,147,\n    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,\n    145,232, 97,  2, 96, 24, 96, 31,228,229,246, 97,128,  9, 90,231,\n    245,242,237,245,235,232,105,128, 10, 90,239,239,107,128,  2, 96,\n    250,243,241,245,225,242,101,128, 51,147,105,  3, 96, 66, 96, 77,\n     96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244,\n    225,235,225,238, 97,128, 48,174,109,  2, 96, 94, 96,105,225,242,\n    237,229,238,233,225,110,128,  5, 99,229,108,130,  5,210, 96,114,\n     96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226,\n    242,229,119,128,251, 50,232,229,226,242,229,119,128,  5,210,234,\n    229,227,249,242,233,236,236,233, 99,128,  4, 83,236,239,244,244,\n    225,108,  2, 96,167, 96,184,233,238,246,229,242,244,229,228,243,\n    244,242,239,235,101,128,  1,190,243,244,239,112,132,  2,148, 96,\n    199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128,\n      2,150,237,239,100,128,  2,192,242,229,246,229,242,243,229,100,\n    130,  2,149, 96,231, 96,237,237,239,100,128,  2,193,243,245,240,\n    229,242,233,239,114,128,  2,228,243,244,242,239,235,101,129,  2,\n    161, 97,  3,242,229,246,229,242,243,229,100,128,  2,162,109,  2,\n     97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243,\n    240,225,227,101,128,255, 71,111,  2, 97, 45, 97, 56,232,233,242,\n    225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97,\n    128, 48,180,240, 97,  2, 97, 74, 97, 80,242,229,110,128, 36,162,\n    243,241,245,225,242,101,128, 51,172,114,  2, 97, 95, 97,192, 97,\n      2, 97,101, 97,109,228,233,229,238,116,128, 34,  7,246,101,134,\n      0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229,\n    236,239,247,227,237, 98,128,  3, 22, 99,  2, 97,143, 97,148,237,\n     98,128,  3,  0,239,237, 98,128,  3,  0,228,229,246, 97,128,  9,\n     83,236,239,247,237,239,100,128,  2,206,237,239,238,239,243,240,\n    225,227,101,128,255, 64,244,239,238,229,227,237, 98,128,  3, 64,\n    229,225,244,229,114,132,  0, 62, 97,208, 97,227, 97,239, 98, 26,\n    229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115,\n    128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111,\n      2, 97,245, 98, 15,114,  2, 97,251, 98,  8,229,241,245,233,246,\n    225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246,\n    229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128,\n    254,101,115,  2, 98, 40, 98, 48,227,242,233,240,116,128,  2, 97,\n    244,242,239,235,101,128,  1,229,117,  4, 98, 66, 98, 77, 98,134,\n     98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108,  2,\n     98, 84, 98,109,236,229,237,239,116,  2, 98, 94, 98,101,236,229,\n    230,116,128,  0,171,242,233,231,232,116,128,  0,187,243,233,238,\n    231,108,  2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233,\n    231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48,\n    176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243,\n    241,245,225,242,101,128, 51,201,104,144,  0,104, 98,204,101, 90,\n    101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99,\n    105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232,\n     99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210,\n     99,239, 99,252,100, 54,100, 63, 97,  2, 98,238, 99,  1,226,235,\n    232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128,  4,\n    169,236,244,239,238,229,225,242,225,226,233, 99,128,  6,193,226,\n    229,238,231,225,236,105,128,  9,185,228,101,  2, 99, 32, 99, 50,\n    243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,\n      4,179,246, 97,128,  9, 57,231,117,  2, 99, 62, 99, 71,234,225,\n    242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57,\n    104,  4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99,\n    128,  6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254,\n    162,105,  2, 99,119, 99,134,238,233,244,233,225,236,225,242,225,\n    226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237,\n    229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244,\n    245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225,\n    238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104,\n    128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128,\n     10, 77,237,250, 97,  2, 99,218, 99,227,225,242,225,226,233, 99,\n    128,  6, 33,236,239,247,225,242,225,226,233, 99,128,  6, 33,238,\n    231,245,236,230,233,236,236,229,114,128, 49,100,114,  2,100,  2,\n    100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,\n      4, 74,240,239,239,110,  2,100, 27,100, 40,236,229,230,244,226,\n    225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242,\n    226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244,\n    225,102,  3,100, 73,100,165,101,  0,240,225,244,225,104,134,  5,\n    178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128,\n      5,178, 50,  2,100,104,100,108, 51,128,  5,178,102,128,  5,178,\n    232,229,226,242,229,119,128,  5,178,238,225,242,242,239,247,232,\n    229,226,242,229,119,128,  5,178,241,245,225,242,244,229,242,232,\n    229,226,242,229,119,128,  5,178,247,233,228,229,232,229,226,242,\n    229,119,128,  5,178,241,225,237,225,244,115,135,  5,179,100,188,\n    100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128,  5,\n    179,178, 56,128,  5,179,179, 52,128,  5,179,232,229,226,242,229,\n    119,128,  5,179,238,225,242,242,239,247,232,229,226,242,229,119,\n    128,  5,179,241,245,225,242,244,229,242,232,229,226,242,229,119,\n    128,  5,179,247,233,228,229,232,229,226,242,229,119,128,  5,179,\n    243,229,231,239,108,135,  5,177,101, 22,101, 27,101, 32,101, 37,\n    101, 46,101, 61,101, 77,177, 55,128,  5,177,178, 52,128,  5,177,\n    179, 48,128,  5,177,232,229,226,242,229,119,128,  5,177,238,225,\n    242,242,239,247,232,229,226,242,229,119,128,  5,177,241,245,225,\n    242,244,229,242,232,229,226,242,229,119,128,  5,177,247,233,228,\n    229,232,229,226,242,229,119,128,  5,177, 98,  3,101, 98,101,103,\n    101,113,225,114,128,  1, 39,239,240,239,237,239,230,111,128, 49,\n     15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99,  2,101,\n    131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99,  2,\n    101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128,\n      1, 37,100,  2,101,168,101,178,233,229,242,229,243,233,115,128,\n     30, 39,239,116,  2,101,185,101,194,225,227,227,229,238,116,128,\n     30, 35,226,229,236,239,119,128, 30, 37,101,136,  5,212,101,222,\n    101,255,102, 19,102,248,103,  8,103, 53,103, 62,103, 75,225,242,\n    116,129, 38,101,101,230,243,245,233,116,  2,101,239,101,247,226,\n    236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228,\n    225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119,\n    128,251, 52,104,  6,102, 33,102, 61,102, 69,102,119,102,165,102,\n    214, 97,  2,102, 39,102, 53,236,244,239,238,229,225,242,225,226,\n    233, 99,128,  6,193,242,225,226,233, 99,128,  6, 71,229,226,242,\n    229,119,128,  5,212,230,233,238,225,236, 97,  2,102, 80,102,111,\n    236,116,  2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99,\n    128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242,\n    225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246,\n    101,  2,102,134,102,148,230,233,238,225,236,225,242,225,226,233,\n     99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226,\n    233, 99,128,251,164,105,  2,102,171,102,205,238,233,244,233,225,\n    236, 97,  2,102,183,102,197,236,244,239,238,229,225,242,225,226,\n    233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231,\n    225,238, 97,128, 48,120,237,229,228,233,225,236, 97,  2,102,226,\n    102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169,\n    242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243,\n    241,245,225,242,101,128, 51,123,107,  2,103, 14,103, 38,225,244,\n    225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233,\n    228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225,\n    242,101,128, 51, 54,238,231,232,239,239,107,128,  2,103,242,245,\n    244,245,243,241,245,225,242,101,128, 51, 57,116,129,  5,215,103,\n     81,232,229,226,242,229,119,128,  5,215,232,239,239,107,129,  2,\n    102,103, 99,243,245,240,229,242,233,239,114,128,  2,177,105,  4,\n    103,120,103,205,103,216,103,241,229,245,104,  4,103,132,103,167,\n    103,182,103,191, 97,  2,103,138,103,153,227,233,242,227,236,229,\n    235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239,\n    242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242,\n    229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240,\n    225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242,\n    225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97,\n    129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255,\n    139,242,233,113,134,  5,180,104,  3,104,  8,104, 22,104, 31,104,\n     46,104, 62,177, 52,128,  5,180, 50,  2,104, 14,104, 18, 49,128,\n      5,180,100,128,  5,180,232,229,226,242,229,119,128,  5,180,238,\n    225,242,242,239,247,232,229,226,242,229,119,128,  5,180,241,245,\n    225,242,244,229,242,232,229,226,242,229,119,128,  5,180,247,233,\n    228,229,232,229,226,242,229,119,128,  5,180,236,233,238,229,226,\n    229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101,\n    128,255, 72,111,  9,104,119,104,130,104,154,104,179,105, 11,105,\n     24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128,\n      5,112,232,105,  2,104,137,104,145,240,244,232,225,105,128, 14,\n     43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225,\n    238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104,\n    128,255,142,236,225,109,135,  5,185,104,199,104,204,104,209,104,\n    214,104,223,104,238,104,254,177, 57,128,  5,185,178, 54,128,  5,\n    185,179, 50,128,  5,185,232,229,226,242,229,119,128,  5,185,238,\n    225,242,242,239,247,232,229,226,242,229,119,128,  5,185,241,245,\n    225,242,244,229,242,232,229,226,242,229,119,128,  5,185,247,233,\n    228,229,232,229,226,242,229,119,128,  5,185,238,239,235,232,245,\n    235,244,232,225,105,128, 14, 46,111,  2,105, 30,105,100,107,  4,\n    105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237,\n     98,128,  3,  9,227,237, 98,128,  3,  9,240,225,236,225,244,225,\n    236,233,250,229,228,226,229,236,239,247,227,237, 98,128,  3, 33,\n    242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237,\n     98,128,  3, 34,238,243,241,245,225,242,101,128, 51, 66,114,  2,\n    105,116,105,143,105,  2,105,122,105,131,227,239,240,244,233, 99,\n    128,  3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238,\n    227,237, 98,128,  3, 27,244,243,240,242,233,238,231,115,128, 38,\n    104,245,243,101,128, 35,  2,240,225,242,229,110,128, 36,163,243,\n    245,240,229,242,233,239,114,128,  2,176,244,245,242,238,229,100,\n    128,  2,101,117,  4,105,205,105,216,105,229,105,254,232,233,242,\n    225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225,\n    242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213,\n    105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231,\n    225,242,245,237,236,225,245,116,129,  2,221,106, 13,227,237, 98,\n    128,  3, 11,118,128,  1,149,249,240,232,229,110,132,  0, 45,106,\n     39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128,\n    246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115,  2,\n    106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233,\n    239,114,128,246,230,244,247,111,128, 32, 16,105,149,  0,105,106,\n    137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111,\n    213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113,\n    110,113,197,113,254,114, 26,114, 70,225, 99,  2,106,144,106,150,\n    245,244,101,128,  0,237,249,242,233,236,236,233, 99,128,  4, 79,\n     98,  3,106,168,106,177,106,187,229,238,231,225,236,105,128,  9,\n    135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128,\n      1, 45, 99,  3,106,202,106,209,106,231,225,242,239,110,128,  1,\n    208,233,242, 99,  2,106,217,106,222,236,101,128, 36,216,245,237,\n    230,236,229,120,128,  0,238,249,242,233,236,236,233, 99,128,  4,\n     86,100,  4,106,251,107,  5,110, 80,110,113,226,236,231,242,225,\n    246,101,128,  2,  9,101,  2,107, 11,110, 75,239,231,242,225,240,\n    104,  7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44,\n    229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233,\n    242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90,\n    107,106,107,205,108,  3,108, 69,108, 98,108,114,108,171,108,220,\n    108,232,109,  3,109, 70,109,208,109,237,225,236,236,233,225,238,\n    227,229,240,225,242,229,110,128, 50, 63, 99,  4,107,116,107,127,\n    107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229,\n    238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243,\n    101,128, 48,  6,111,  3,107,156,107,171,107,191,237,237, 97,129,\n     48,  1,107,164,236,229,230,116,128,255,100,238,231,242,225,244,\n    245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242,\n    242,229,227,244,227,233,242,227,236,101,128, 50,163,101,  3,107,\n    213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50,\n     47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128,\n     50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101,\n    128, 50,157,102,  2,108,  9,108, 24,229,243,244,233,246,225,236,\n    240,225,242,229,110,128, 50, 64,105,  2,108, 30,108, 59,238,225,\n    238,227,233,225,108,  2,108, 42,108, 51,227,233,242,227,236,101,\n    128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242,\n    229,110,128, 50, 43,104,  2,108, 75,108, 86,225,246,229,240,225,\n    242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128,\n     50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128,\n     48,  5,108,  3,108,122,108,148,108,160,225,226,239,114,  2,108,\n    131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229,\n    110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167,\n    239,247,227,233,242,227,236,101,128, 50,166,109,  2,108,177,108,\n    209,101,  2,108,183,108,198,228,233,227,233,238,229,227,233,242,\n    227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50,\n     46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229,\n    240,225,242,229,110,128, 50, 52,112,  2,108,238,108,246,229,242,\n    233,239,100,128, 48,  2,242,233,238,244,227,233,242,227,236,101,\n    128, 50,158,114,  2,109,  9,109, 57,101,  3,109, 17,109, 28,109,\n     43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243,\n    229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227,\n    229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242,\n    227,236,101,128, 50,168,115,  5,109, 82,109,111,109,125,109,150,\n    109,178,101,  2,109, 88,109,101,227,242,229,244,227,233,242,227,\n    236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239,\n    227,233,229,244,249,240,225,242,229,110,128, 50, 51,112,  2,109,\n    131,109,137,225,227,101,128, 48,  0,229,227,233,225,236,240,225,\n    242,229,110,128, 50, 53,116,  2,109,156,109,167,239,227,235,240,\n    225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128,\n     50, 59,117,  2,109,184,109,193,238,240,225,242,229,110,128, 50,\n     48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60,\n    119,  2,109,214,109,226,225,244,229,242,240,225,242,229,110,128,\n     50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242,\n    111,128, 48,  7,109,  2,109,250,110,  7,229,244,225,236,227,233,\n    242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101,\n    128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148,\n    243,245,238,227,233,242,227,236,101,128, 50,144,119,  2,110, 50,\n    110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239,\n    239,228,227,233,242,227,236,101,128, 50,141,246, 97,128,  9,  7,\n    233,229,242,229,243,233,115,130,  0,239,110, 94,110,102,225,227,\n    245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128,  4,\n    229,239,244,226,229,236,239,119,128, 30,203,101,  3,110,131,110,\n    147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99,\n    128,  4,215,227,249,242,233,236,236,233, 99,128,  4, 53,245,238,\n    103,  4,110,170,110,205,110,220,110,229, 97,  2,110,176,110,191,\n    227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240,\n    225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242,\n    227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229,\n    225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110,\n    128, 50,  7,103,  2,110,249,111,  0,242,225,246,101,128,  0,236,\n    117,  2,111,  6,111, 15,234,225,242,225,244,105,128, 10,135,242,\n    237,245,235,232,105,128, 10,  7,104,  2,111, 30,111, 40,233,242,\n    225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101,\n    128, 30,201,105,  8,111, 69,111, 79,111, 90,111, 97,111,122,111,\n    138,111,153,111,169,226,229,238,231,225,236,105,128,  9,136,227,\n    249,242,233,236,236,233, 99,128,  4, 56,228,229,246, 97,128,  9,\n      8,231,117,  2,111,104,111,113,234,225,242,225,244,105,128, 10,\n    136,242,237,245,235,232,105,128, 10,  8,237,225,244,242,225,231,\n    245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229,\n    228,226,242,229,246,101,128,  2, 11,243,232,239,242,244,227,249,\n    242,233,236,236,233, 99,128,  4, 57,246,239,247,229,236,243,233,\n    231,110,  3,111,185,111,195,111,202,226,229,238,231,225,236,105,\n    128,  9,192,228,229,246, 97,128,  9, 64,231,245,234,225,242,225,\n    244,105,128, 10,192,106,128,  1, 51,107,  2,111,223,111,247,225,\n    244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247,\n    233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108,\n      2,112,  5,112, 10,228,101,128,  2,220,245,249,232,229,226,242,\n    229,119,128,  5,172,109,  2,112, 27,112, 94, 97,  3,112, 35,112,\n     55,112, 80,227,242,239,110,129,  1, 43,112, 44,227,249,242,233,\n    236,236,233, 99,128,  4,227,231,229,239,242,225,240,240,242,239,\n    248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83,\n    244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238,\n    239,243,240,225,227,101,128,255, 73,110,  5,112,117,112,127,112,\n    136,112,148,112,232,227,242,229,237,229,238,116,128, 34,  6,230,\n    233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225,\n    110,128,  5,107,116,  2,112,154,112,222,101,  2,112,160,112,211,\n    231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98,  2,112,\n    179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229,\n    120,128,248,245,116,  2,112,202,112,207,239,112,128, 35, 32,112,\n    128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243,\n    241,245,225,242,101,128, 51,  5,118,  3,112,240,112,249,113,  2,\n    226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128,\n     37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111,  3,\n    113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128,  4,\n     81,231,239,238,229,107,128,  1, 47,244, 97,131,  3,185,113, 52,\n    113, 73,113, 81,228,233,229,242,229,243,233,115,129,  3,202,113,\n     65,244,239,238,239,115,128,  3,144,236,225,244,233,110,128,  2,\n    105,244,239,238,239,115,128,  3,175,240,225,242,229,110,128, 36,\n    164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115,  4,\n    113,120,113,165,113,179,113,187,237,225,236,108,  2,113,129,113,\n    140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225,\n    235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228,\n    244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105,\n    128,  9,250,244,242,239,235,101,128,  2,104,245,240,229,242,233,\n    239,114,128,246,237,116,  2,113,203,113,237,229,242,225,244,233,\n    239,110,  2,113,215,113,226,232,233,242,225,231,225,238, 97,128,\n     48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228,\n    101,129,  1, 41,113,246,226,229,236,239,119,128, 30, 45,117,  2,\n    114,  4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227,\n    249,242,233,236,236,233, 99,128,  4, 78,246,239,247,229,236,243,\n    233,231,110,  3,114, 42,114, 52,114, 59,226,229,238,231,225,236,\n    105,128,  9,191,228,229,246, 97,128,  9, 63,231,245,234,225,242,\n    225,244,105,128, 10,191,250,232,233,244,243, 97,  2,114, 81,114,\n     92,227,249,242,233,236,236,233, 99,128,  4,117,228,226,236,231,\n    242,225,246,229,227,249,242,233,236,236,233, 99,128,  4,119,106,\n    138,  0,106,114,135,114,198,114,209,115,  3,115, 19,115,132,115,\n    201,115,206,115,218,115,226, 97,  4,114,145,114,156,114,166,114,\n    173,225,242,237,229,238,233,225,110,128,  5,113,226,229,238,231,\n    225,236,105,128,  9,156,228,229,246, 97,128,  9, 28,231,117,  2,\n    114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245,\n    235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49,\n     16, 99,  3,114,217,114,224,114,246,225,242,239,110,128,  1,240,\n    233,242, 99,  2,114,232,114,237,236,101,128, 36,217,245,237,230,\n    236,229,120,128,  1, 53,242,239,243,243,229,228,244,225,233,108,\n    128,  2,157,228,239,244,236,229,243,243,243,244,242,239,235,101,\n    128,  2, 95,101,  3,115, 27,115, 38,115,103,227,249,242,233,236,\n    236,233, 99,128,  4, 88,229,109,  4,115, 49,115, 58,115, 72,115,\n     88,225,242,225,226,233, 99,128,  6, 44,230,233,238,225,236,225,\n    242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225,\n    242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242,\n    225,226,233, 99,128,254,160,104,  2,115,109,115,118,225,242,225,\n    226,233, 99,128,  6,152,230,233,238,225,236,225,242,225,226,233,\n     99,128,251,139,104,  2,115,138,115,188, 97,  3,115,146,115,156,\n    115,163,226,229,238,231,225,236,105,128,  9,157,228,229,246, 97,\n    128,  9, 29,231,117,  2,115,170,115,179,234,225,242,225,244,105,\n    128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242,\n    237,229,238,233,225,110,128,  5,123,233,115,128, 48,  4,237,239,\n    238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128,\n     36,165,243,245,240,229,242,233,239,114,128,  2,178,107,146,  0,\n    107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120,\n    150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122,\n    118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116,\n    245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98,\n      2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236,\n    236,233, 99,128,  4,161,229,238,231,225,236,105,128,  9,149, 99,\n      2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236,\n    233, 99,128,  4, 58,228,101,  2,116,108,116,126,243,227,229,238,\n    228,229,242,227,249,242,233,236,236,233, 99,128,  4,155,246, 97,\n    128,  9, 21,102,135,  5,219,116,149,116,158,116,178,116,192,116,\n    201,116,217,116,232,225,242,225,226,233, 99,128,  6, 67,228,225,\n    231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128,\n    251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218,\n    232,229,226,242,229,119,128,  5,219,233,238,233,244,233,225,236,\n    225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225,\n    242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242,\n    229,119,128,251, 77,231,117,  2,116,252,117,  5,234,225,242,225,\n    244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104,  2,\n    117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239,\n    235,227,249,242,233,236,236,233, 99,128,  4,196,235,225,244,225,\n    235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228,\n    244,104,128,255,118,112,  2,117, 75,117, 96,240, 97,129,  3,186,\n    117, 82,243,249,237,226,239,236,231,242,229,229,107,128,  3,240,\n    249,229,239,245,110,  3,117,108,117,122,117,156,237,233,229,245,\n    237,235,239,242,229,225,110,128, 49,113,112,  2,117,128,117,143,\n    232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233,\n    229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238,\n    231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242,\n    239,242,233,233,243,241,245,225,242,101,128, 51, 13,115,  5,117,\n    201,117,245,118,  4,118, 12,118, 40,232,233,228,225,225,245,244,\n    111,  2,117,214,117,223,225,242,225,226,233, 99,128,  6, 64,238,\n    239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226,\n    233, 99,128,  6, 64,237,225,236,236,235,225,244,225,235,225,238,\n     97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97,  2,118,\n     19,118, 28,225,242,225,226,233, 99,128,  6, 80,244,225,238,225,\n    242,225,226,233, 99,128,  6, 77,244,242,239,235,229,227,249,242,\n    233,236,236,233, 99,128,  4,159,244,225,232,233,242,225,240,242,\n    239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228,\n    244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242,\n    239,235,229,227,249,242,233,236,236,233, 99,128,  4,157,226,239,\n    240,239,237,239,230,111,128, 49, 14, 99,  4,118,131,118,153,118,\n    162,118,170, 97,  2,118,137,118,147,236,243,241,245,225,242,101,\n    128, 51,137,242,239,110,128,  1,233,229,228,233,236,236, 97,128,\n      1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227,\n    227,229,238,116,128,  1, 55,228,239,244,226,229,236,239,119,128,\n     30, 51,101,  4,118,204,118,231,119,  0,119, 12,104,  2,118,210,\n    118,221,225,242,237,229,238,233,225,110,128,  5,132,233,242,225,\n    231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129,\n     48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121,\n    238,225,242,237,229,238,233,225,110,128,  5,111,243,237,225,236,\n    236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229,\n    238,236,225,238,228,233, 99,128,  1, 56,104,  6,119, 56,119,185,\n    119,196,119,221,120, 52,120,140, 97,  5,119, 68,119, 78,119, 89,\n    119, 96,119,121,226,229,238,231,225,236,105,128,  9,150,227,249,\n    242,233,236,236,233, 99,128,  4, 69,228,229,246, 97,128,  9, 22,\n    231,117,  2,119,103,119,112,234,225,242,225,244,105,128, 10,150,\n    242,237,245,235,232,105,128, 10, 22,104,  4,119,131,119,140,119,\n    154,119,170,225,242,225,226,233, 99,128,  6, 46,230,233,238,225,\n    236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225,\n    236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236,\n    225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233,\n     99,128,  3,231,232, 97,  2,119,203,119,210,228,229,246, 97,128,\n      9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245,\n    235,104,  4,119,235,120, 14,120, 29,120, 38, 97,  2,119,241,120,\n      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120,\n    240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233,\n    242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242,\n    229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225,\n    110,128, 50, 10,111,  4,120, 62,120,111,120,121,120,126,235,104,\n      4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128,\n     14,  2,239,238,244,232,225,105,128, 14,  5,245,225,244,244,232,\n    225,105,128, 14,  3,247,225,233,244,232,225,105,128, 14,  4,237,\n    245,244,244,232,225,105,128, 14, 91,239,107,128,  1,153,242,225,\n    235,232,225,238,231,244,232,225,105,128, 14,  6,250,243,241,245,\n    225,242,101,128, 51,145,105,  4,120,160,120,171,120,196,120,245,\n    232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235,\n    225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244,\n    104,128,255,119,242,111,  3,120,205,120,220,120,236,231,245,242,\n    225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244,\n    239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225,\n    242,101,128, 51, 20,249,229,239,107,  5,121,  4,121, 39,121, 54,\n    121, 63,121, 77, 97,  2,121, 10,121, 25,227,233,242,227,236,229,\n    235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239,\n    242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242,\n    229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240,\n    225,242,229,238,235,239,242,229,225,110,128, 50,  0,243,233,239,\n    243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233,\n    236,236,233, 99,128,  4, 92,108,  2,121,109,121,120,233,238,229,\n    226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51,\n    152,109,  3,121,137,121,151,121,162,227,245,226,229,228,243,241,\n    245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128,\n    255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128,\n     51,162,111,  5,121,190,121,216,121,254,122, 10,122, 24,104,  2,\n    121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243,\n    241,245,225,242,101,128, 51,192,235, 97,  2,121,223,121,231,233,\n    244,232,225,105,128, 14,  1,244,225,235,225,238, 97,129, 48,179,\n    121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240,\n    239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242,\n    233,236,236,233, 99,128,  4,129,114,  2,122, 30,122, 50,229,225,\n    238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128,\n     50,127,239,238,233,243,227,237, 98,128,  3, 67,240, 97,  2,122,\n     67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128,\n     51,170,243,233,227,249,242,233,236,236,233, 99,128,  4,111,116,\n      2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242,\n    238,229,100,128,  2,158,117,  2,122,124,122,135,232,233,242,225,\n    231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129,\n     48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120,\n    246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242,\n    101,128, 51,190,108,146,  0,108,122,220,124,247,125, 20,125, 86,\n    125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246,\n    127,125,127,133,127,166,127,175,127,183,127,245, 97,  7,122,236,\n    122,246,122,253,123,  4,123, 29,123, 45,124,235,226,229,238,231,\n    225,236,105,128,  9,178,227,245,244,101,128,  1, 58,228,229,246,\n     97,128,  9, 50,231,117,  2,123, 11,123, 20,234,225,242,225,244,\n    105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232,\n    225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123,\n     67,124,  6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124,\n    150,124,173, 97,  2,123, 73,123,254,236,229,102,  4,123, 85,123,\n     99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99,\n    128,254,252,232,225,237,250, 97,  2,123,109,123,150,225,226,239,\n    246,101,  2,123,119,123,133,230,233,238,225,236,225,242,225,226,\n    233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225,\n    226,233, 99,128,254,247,226,229,236,239,119,  2,123,160,123,174,\n    230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243,\n    239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233,\n    243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251,\n    237,225,228,228,225,225,226,239,246,101,  2,123,223,123,237,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239,\n    236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225,\n    226,233, 99,128,  6, 68,226,228, 97,129,  3,187,124, 14,243,244,\n    242,239,235,101,128,  1,155,229,100,130,  5,220,124, 32,124, 52,\n    228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229,\n    119,128,251, 60,232,229,226,242,229,119,128,  5,220,230,233,238,\n    225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229,\n    229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,\n    252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225,\n    226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236,\n    225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101,  2,\n    124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254,\n    224,229,109,  2,124,200,124,219,232,225,232,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233,\n    242,227,236,101,128, 37,239, 98,  3,124,255,125,  4,125, 10,225,\n    114,128,  1,154,229,236,116,128,  2,108,239,240,239,237,239,230,\n    111,128, 49, 12, 99,  4,125, 30,125, 37,125, 46,125, 73,225,242,\n    239,110,128,  1, 62,229,228,233,236,236, 97,128,  1, 60,233,242,\n     99,  2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229,\n    248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227,\n    229,238,116,128,  1, 60,228,239,116,130,  1, 64,125, 96,125,105,\n    225,227,227,229,238,116,128,  1, 64,226,229,236,239,119,129, 30,\n     55,125,115,237,225,227,242,239,110,128, 30, 57,101,  3,125,132,\n    125,170,126, 15,230,116,  2,125,139,125,155,225,238,231,236,229,\n    225,226,239,246,229,227,237, 98,128,  3, 26,244,225,227,235,226,\n    229,236,239,247,227,237, 98,128,  3, 24,243,115,132,  0, 60,125,\n    183,125,205,125,217,126,  7,229,241,245,225,108,129, 34,100,125,\n    193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238,\n    239,243,240,225,227,101,128,255, 28,111,  2,125,223,125,252,114,\n      2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128,\n     34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229,\n    241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250,\n    104,128,  2,110,230,226,236,239,227,107,128, 37,140,232,239,239,\n    235,242,229,244,242,239,230,236,229,120,128,  2,109,105,  2,126,\n     51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233,\n    225,110,128,  5,108,106,129,  1,201,126, 75,229,227,249,242,233,\n    236,236,233, 99,128,  4, 89,108,132,246,192,126, 99,126,123,126,\n    134,126,143, 97,  2,126,105,126,112,228,229,246, 97,128,  9, 51,\n    231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229,\n    236,239,119,128, 30, 59,236,225,228,229,246, 97,128,  9, 52,246,\n    239,227,225,236,233, 99,  3,126,157,126,167,126,174,226,229,238,\n    231,225,236,105,128,  9,225,228,229,246, 97,128,  9, 97,246,239,\n    247,229,236,243,233,231,110,  2,126,188,126,198,226,229,238,231,\n    225,236,105,128,  9,227,228,229,246, 97,128,  9, 99,109,  3,126,\n    213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128,\n      2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245,\n    225,242,101,128, 51,208,111,  6,127,  4,127, 16,127, 58,127, 69,\n    127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44,\n    231,233,227,225,108,  3,127, 28,127, 34,127, 53,225,238,100,128,\n     34, 39,238,239,116,129,  0,172,127, 42,242,229,246,229,242,243,\n    229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232,\n    225,105,128, 14, 37,238,231,115,128,  1,127,247,236,233,238,101,\n      2,127, 85,127,108, 99,  2,127, 91,127,103,229,238,244,229,242,\n    236,233,238,101,128,254, 78,237, 98,128,  3, 50,228,225,243,232,\n    229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242,\n    229,110,128, 36,167,115,  3,127,141,127,148,127,156,236,225,243,\n    104,128,  1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242,\n    233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245,\n    244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99,  3,127,\n    197,127,207,127,214,226,229,238,231,225,236,105,128,  9,140,228,\n    229,246, 97,128,  9, 12,246,239,247,229,236,243,233,231,110,  2,\n    127,228,127,238,226,229,238,231,225,236,105,128,  9,226,228,229,\n    246, 97,128,  9, 98,248,243,241,245,225,242,101,128, 51,211,109,\n    144,  0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132,\n     40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135,\n    108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128,\n    215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238,\n    231,225,236,105,128,  9,174, 99,  2,128, 77,128,129,242,239,110,\n    132,  0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247,\n    227,237, 98,128,  3, 49,227,237, 98,128,  3,  4,236,239,247,237,\n    239,100,128,  2,205,237,239,238,239,243,240,225,227,101,128,255,\n    227,245,244,101,128, 30, 63,228,229,246, 97,128,  9, 46,231,117,\n      2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237,\n    245,235,232,105,128, 10, 46,104,  2,128,173,128,205,225,240,225,\n    235,104,  2,128,183,128,192,232,229,226,242,229,119,128,  5,164,\n    236,229,230,244,232,229,226,242,229,119,128,  5,164,233,242,225,\n    231,225,238, 97,128, 48,126,105,  5,128,227,129, 40,129,103,129,\n    133,130, 39,227,232,225,244,244,225,247, 97,  3,128,242,129, 17,\n    129, 24,236,239,119,  2,128,250,129,  5,236,229,230,244,244,232,\n    225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248,\n    148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230,\n    244,244,232,225,105,128,248,147,229,107,  3,129, 49,129, 80,129,\n     87,236,239,119,  2,129, 57,129, 68,236,229,230,244,244,232,225,\n    105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139,\n    244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244,\n    244,232,225,105,128,248,138,232,225,238,225,235,225,116,  2,129,\n    115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232,\n    225,105,128, 14, 49,116,  3,129,141,129,169,129,232,225,233,235,\n    232,117,  2,129,151,129,162,236,229,230,244,244,232,225,105,128,\n    248,137,244,232,225,105,128, 14, 71,232,111,  3,129,178,129,209,\n    129,216,236,239,119,  2,129,186,129,197,236,229,230,244,244,232,\n    225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248,\n    142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230,\n    244,244,232,225,105,128,248,141,242,105,  3,129,241,130, 16,130,\n     23,236,239,119,  2,129,249,130,  4,236,229,230,244,244,232,225,\n    105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145,\n    244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244,\n    244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105,\n    128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64,\n    232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38,\n     66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241,\n    225,230,232,229,226,242,229,119,128,  5,190,242,115,128, 38, 66,\n    115,  2,130,118,130,136,239,242,225,227,233,242,227,236,229,232,\n    229,226,242,229,119,128,  5,175,241,245,225,242,101,128, 51,131,\n     98,  2,130,150,130,160,239,240,239,237,239,230,111,128, 49,  7,\n    243,241,245,225,242,101,128, 51,212, 99,  2,130,175,130,183,233,\n    242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242,\n    101,128, 51,165,228,239,116,  2,130,204,130,213,225,227,227,229,\n    238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101,  7,130,\n    237,131,108,131,119,131,134,131,159,131,196,131,208,101,  2,130,\n    243,131, 95,109,  4,130,253,131,  6,131, 20,131, 36,225,242,225,\n    226,233, 99,128,  6, 69,230,233,238,225,236,225,242,225,226,233,\n     99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233,\n     99,128,254,227,237,101,  2,131, 43,131, 56,228,233,225,236,225,\n    242,225,226,233, 99,128,254,228,229,237,105,  2,131, 64,131, 79,\n    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243,\n    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244,\n    239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225,\n    231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245,\n    225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48,\n    225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109,\n    130,  5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62,\n    131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229,\n    119,128,  5,222,238,225,242,237,229,238,233,225,110,128,  5,116,\n    242,235,232, 97,  3,131,219,131,228,132,  5,232,229,226,242,229,\n    119,128,  5,165,235,229,230,245,236, 97,  2,131,239,131,248,232,\n    229,226,242,229,119,128,  5,166,236,229,230,244,232,229,226,242,\n    229,119,128,  5,166,236,229,230,244,232,229,226,242,229,119,128,\n      5,165,104,  2,132, 24,132, 30,239,239,107,128,  2,113,250,243,\n    241,245,225,242,101,128, 51,146,105,  6,132, 54,132, 91,132,228,\n    132,239,133,  8,133, 65,228,100,  2,132, 61,132, 86,236,229,228,\n    239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233,\n    228,244,104,128,255,101,239,116,128,  0,183,229,245,109,  5,132,\n    105,132,140,132,155,132,164,132,215, 97,  2,132,111,132,126,227,\n    233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225,\n    242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227,\n    236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225,\n    110,128, 49, 65,112,  2,132,170,132,202, 97,  2,132,176,132,190,\n    238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229,\n    238,235,239,242,229,225,110,128, 50,  4,233,229,245,240,235,239,\n    242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225,\n    110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235,\n    225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230,\n    247,233,228,244,104,128,255,144,238,117,  2,133, 15,133, 60,115,\n    132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247,\n    227,237, 98,128,  3, 32,227,233,242,227,236,101,128, 34,150,237,\n    239,100,128,  2,215,240,236,245,115,128, 34, 19,244,101,128, 32,\n     50,242,105,  2,133, 72,133, 86,226,225,225,242,245,243,241,245,\n    225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108,\n      2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229,\n    100,128,  2,112,243,241,245,225,242,101,128, 51,150,109,  3,133,\n    133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101,\n    128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241,\n    245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111,  5,\n    133,186,133,212,133,237,133,247,134,  0,104,  2,133,192,133,202,\n    233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242,\n    101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133,\n    225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241,\n    245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33,\n    246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228,\n    243,241,245,225,242,101,128, 51,168,240, 97,  2,134, 32,134, 38,\n    242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115,\n      2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240,\n    229,242,233,239,114,128,246,239,244,245,242,238,229,100,128,  2,\n    111,117,141,  0,181,134,111,134,115,134,125,134,149,134,159,134,\n    181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49,\n    128,  0,181,225,243,241,245,225,242,101,128, 51,130,227,104,  2,\n    134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229,\n    243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103,\n      2,134,165,134,172,242,229,229,107,128,  3,188,243,241,245,225,\n    242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128,\n    235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236,\n    230,247,233,228,244,104,128,255,145,108,  2,134,223,134,232,243,\n    241,245,225,242,101,128, 51,149,244,233,240,236,121,128,  0,215,\n    237,243,241,245,225,242,101,128, 51,155,238,225,104,  2,135,  2,\n    135, 11,232,229,226,242,229,119,128,  5,163,236,229,230,244,232,\n    229,226,242,229,119,128,  5,163,115,  2,135, 30,135, 79,233, 99,\n      3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106,\n    135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110,\n    128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243,\n    241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128,\n     51,182,247,243,241,245,225,242,101,128, 51,188,118,  2,135,114,\n    135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243,\n    241,245,225,242,101,128, 51,183,119,  2,135,142,135,155,237,229,\n    231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242,\n    101,128, 51,189,110,150,  0,110,135,212,136, 90,136,114,136,180,\n    136,205,137,  7,137, 17,137, 84,137,127,139,161,139,179,139,204,\n    139,235,140,  5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61,\n    143, 71,143, 81, 97,  8,135,230,135,250,136,  1,136,  8,136, 33,\n    136, 44,136, 69,136, 81, 98,  2,135,236,135,245,229,238,231,225,\n    236,105,128,  9,168,236, 97,128, 34,  7,227,245,244,101,128,  1,\n     68,228,229,246, 97,128,  9, 40,231,117,  2,136, 15,136, 24,234,\n    225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10,\n     40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225,\n    235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228,\n    244,104,128,255,133,240,239,243,244,242,239,240,232,101,128,  1,\n     73,243,241,245,225,242,101,128, 51,129, 98,  2,136, 96,136,106,\n    239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128,\n      0,160, 99,  4,136,124,136,131,136,140,136,167,225,242,239,110,\n    128,  1, 72,229,228,233,236,236, 97,128,  1, 70,233,242, 99,  2,\n    136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226,\n    229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238,\n    116,128,  1, 70,228,239,116,  2,136,188,136,197,225,227,227,229,\n    238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101,  3,136,\n    213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109,\n    235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236,\n    230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236,\n    243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51,\n    139,103,  2,137, 23,137, 73, 97,  3,137, 31,137, 41,137, 48,226,\n    229,238,231,225,236,105,128,  9,153,228,229,246, 97,128,  9, 25,\n    231,117,  2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153,\n    242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225,\n    105,128, 14,  7,104,  2,137, 90,137,100,233,242,225,231,225,238,\n     97,128, 48,147,239,239,107,  2,137,108,137,115,236,229,230,116,\n    128,  2,114,242,229,244,242,239,230,236,229,120,128,  2,115,105,\n      4,137,137,138, 50,138, 61,138,119,229,245,110,  7,137,155,137,\n    190,137,222,137,236,137,245,138, 22,138, 35, 97,  2,137,161,137,\n    176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111,\n    240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105,\n      2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49,\n     53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233,\n    229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229,\n    225,110,128, 49, 52,240, 97,  2,137,252,138, 10,238,243,233,239,\n    243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242,\n    229,225,110,128, 50,  1,243,233,239,243,235,239,242,229,225,110,\n    128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128,\n     49,102,232,233,242,225,231,225,238, 97,128, 48,107,107,  2,138,\n     67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232,\n    225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116,\n      2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153,\n    244,232,225,105,128, 14, 77,238,101,141,  0, 57,138,150,138,159,\n    138,169,138,199,138,206,138,231,139,  2,139, 36,139, 48,139, 59,\n    139, 92,139,100,139,111,225,242,225,226,233, 99,128,  6,105,226,\n    229,238,231,225,236,105,128,  9,239,227,233,242,227,236,101,129,\n     36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243,\n    229,242,233,102,128, 39,146,228,229,246, 97,128,  9,111,231,117,\n      2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237,\n    245,235,232,105,128, 10,111,232, 97,  2,138,238,138,249,227,235,\n    225,242,225,226,233, 99,128,  6,105,238,231,250,232,239,117,128,\n     48, 41,105,  2,139,  8,139, 26,228,229,239,231,242,225,240,232,\n    233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239,\n    114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25,\n    239,236,228,243,244,249,236,101,128,247, 57,112,  2,139, 65,139,\n     72,225,242,229,110,128, 36,124,229,114,  2,139, 79,139, 85,233,\n    239,100,128, 36,144,243,233,225,110,128,  6,249,242,239,237,225,\n    110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116,\n      2,139,117,139,155,229,229,110,  2,139,125,139,134,227,233,242,\n    227,236,101,128, 36,114,112,  2,139,140,139,147,225,242,229,110,\n    128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14,\n     89,106,129,  1,204,139,167,229,227,249,242,233,236,236,233, 99,\n    128,  4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192,\n    232,225,236,230,247,233,228,244,104,128,255,157,108,  2,139,210,\n    139,224,229,231,242,233,231,232,244,236,239,238,103,128,  1,158,\n    233,238,229,226,229,236,239,119,128, 30, 73,109,  2,139,241,139,\n    252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225,\n    242,101,128, 51,154,110,  2,140, 11,140, 61, 97,  3,140, 19,140,\n     29,140, 36,226,229,238,231,225,236,105,128,  9,163,228,229,246,\n     97,128,  9, 35,231,117,  2,140, 43,140, 52,234,225,242,225,244,\n    105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228,\n    229,246, 97,128,  9, 41,111,  6,140, 84,140, 95,140,120,140,161,\n    141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235,\n    225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230,\n    247,233,228,244,104,128,255,137,110,  3,140,128,140,144,140,153,\n    226,242,229,225,235,233,238,231,243,240,225,227,101,128,  0,160,\n    229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14,\n     25,239,110,  7,140,178,140,187,140,201,140,235,140,251,141, 36,\n    141, 95,225,242,225,226,233, 99,128,  6, 70,230,233,238,225,236,\n    225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97,  2,\n    140,212,140,221,225,242,225,226,233, 99,128,  6,186,230,233,238,\n    225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105,\n      2,141,  5,141, 20,238,233,244,233,225,236,225,242,225,226,233,\n     99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233,\n     99,128,252, 75,237,101,  2,141, 43,141, 56,228,233,225,236,225,\n    242,225,226,233, 99,128,254,232,229,237,105,  2,141, 64,141, 79,\n    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243,\n    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238,\n    239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252,\n    141,116,  7,141,129,141,140,141,169,141,204,141,216,141,236,142,\n      6,227,239,238,244,225,233,238,115,128, 34, 12,101,  2,141,146,\n    141,162,236,229,237,229,238,116,129, 34,  9,141,157,239,102,128,\n     34,  9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114,\n    129, 34,111,141,181,238,239,114,  2,141,189,141,197,229,241,245,\n    225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238,\n    244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141,\n    225,238,239,242,229,241,245,225,108,128, 34,112,112,  2,141,242,\n    141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229,\n    228,229,115,128, 34,128,243,117,  3,142, 15,142, 22,142, 31,226,\n    243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240,\n    229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225,\n    110,128,  5,118,240,225,242,229,110,128, 36,169,115,  2,142, 66,\n    142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233,\n    239,114,128, 32,127,244,233,236,228,101,128,  0,241,117,132,  3,\n    189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238,\n     97,128, 48,108,107,  2,142,122,142,146,225,244,225,235,225,238,\n     97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128,\n    255,135,244, 97,  3,142,155,142,165,142,172,226,229,238,231,225,\n    236,105,128,  9,188,228,229,246, 97,128,  9, 60,231,117,  2,142,\n    179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235,\n    232,105,128, 10, 60,109,  2,142,203,142,237,226,229,242,243,233,\n    231,110,130,  0, 35,142,217,142,229,237,239,238,239,243,240,225,\n    227,101,128,255,  3,243,237,225,236,108,128,254, 95,229,114,  2,\n    142,244,143, 20,225,236,243,233,231,110,  2,142,255,143,  7,231,\n    242,229,229,107,128,  3,116,236,239,247,229,242,231,242,229,229,\n    107,128,  3,117,111,128, 33, 22,110,130,  5,224,143, 32,143, 52,\n    228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229,\n    119,128,251, 64,232,229,226,242,229,119,128,  5,224,246,243,241,\n    245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51,\n    187,249, 97,  3,143, 90,143,100,143,107,226,229,238,231,225,236,\n    105,128,  9,158,228,229,246, 97,128,  9, 30,231,117,  2,143,114,\n    143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232,\n    105,128, 10, 30,111,147,  0,111,143,174,143,196,144, 18,144,188,\n    145,  4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174,\n    148,  8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97,  2,\n    143,180,143,187,227,245,244,101,128,  0,243,238,231,244,232,225,\n    105,128, 14, 45, 98,  4,143,206,143,248,144,  1,144, 11,225,242,\n    242,229,100,130,  2,117,143,218,143,229,227,249,242,233,236,236,\n    233, 99,128,  4,233,228,233,229,242,229,243,233,243,227,249,242,\n    233,236,236,233, 99,128,  4,235,229,238,231,225,236,105,128,  9,\n    147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128,\n      1, 79, 99,  3,144, 26,144, 99,144,178, 97,  2,144, 32,144, 93,\n    238,228,242, 97,  3,144, 43,144, 50,144, 61,228,229,246, 97,128,\n      9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247,\n    229,236,243,233,231,110,  2,144, 75,144, 82,228,229,246, 97,128,\n      9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110,\n    128,  1,210,233,242, 99,  2,144,107,144,112,236,101,128, 36,222,\n    245,237,230,236,229,120,133,  0,244,144,131,144,139,144,150,144,\n    158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229,\n    236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239,\n    239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128,\n     30,215,249,242,233,236,236,233, 99,128,  4, 62,100,  4,144,198,\n    144,221,144,227,144,250,226,108,  2,144,205,144,213,225,227,245,\n    244,101,128,  1, 81,231,242,225,246,101,128,  2, 13,229,246, 97,\n    128,  9, 19,233,229,242,229,243,233,115,129,  0,246,144,239,227,\n    249,242,233,236,236,233, 99,128,  4,231,239,244,226,229,236,239,\n    119,128, 30,205,101,129,  1, 83,145, 10,235,239,242,229,225,110,\n    128, 49, 90,103,  3,145, 27,145, 42,145, 49,239,238,229,107,129,\n      2,219,145, 36,227,237, 98,128,  3, 40,242,225,246,101,128,  0,\n    242,245,234,225,242,225,244,105,128, 10,147,104,  4,145, 69,145,\n     80,145, 90,145,168,225,242,237,229,238,233,225,110,128,  5,133,\n    233,242,225,231,225,238, 97,128, 48, 74,111,  2,145, 96,145,106,\n    239,235,225,226,239,246,101,128, 30,207,242,110,133,  1,161,145,\n    121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30,\n    219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246,\n    101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223,\n    244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236,\n    225,245,116,128,  1, 81,105,129,  1,163,145,188,238,246,229,242,\n    244,229,228,226,242,229,246,101,128,  2, 15,107,  2,145,209,145,\n    233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236,\n    230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49,\n     87,236,229,232,229,226,242,229,119,128,  5,171,109,  6,146, 10,\n    146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130,\n      1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242,\n    225,246,101,128, 30, 81,228,229,246, 97,128,  9, 80,229,231, 97,\n    133,  3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128,  3,\n    214,227,249,242,233,236,236,233, 99,128,  4, 97,236,225,244,233,\n    238,227,236,239,243,229,100,128,  2,119,242,239,245,238,228,227,\n    249,242,233,236,236,233, 99,128,  4,123,116,  2,146,112,146,127,\n    233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,125,239,\n    238,239,115,128,  3,206,231,245,234,225,242,225,244,105,128, 10,\n    208,233,227,242,239,110,129,  3,191,146,155,244,239,238,239,115,\n    128,  3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101,\n    145,  0, 49,146,213,146,222,146,232,147,  6,147, 31,147, 40,147,\n     49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147,\n    227,147,235,147,246,225,242,225,226,233, 99,128,  6, 97,226,229,\n    238,231,225,236,105,128,  9,231,227,233,242,227,236,101,129, 36,\n     96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229,\n    242,233,102,128, 39,138,100,  2,147, 12,147, 18,229,246, 97,128,\n      9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229,\n    233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246,\n    220,231,117,  2,147, 56,147, 65,234,225,242,225,244,105,128, 10,\n    231,242,237,245,235,232,105,128, 10,103,232, 97,  3,147, 83,147,\n     94,147, 99,227,235,225,242,225,226,233, 99,128,  6, 97,236,102,\n    128,  0,189,238,231,250,232,239,117,128, 48, 33,105,  2,147,114,\n    147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229,\n    110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239,\n    238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225,\n    244,239,242,226,229,238,231,225,236,105,128,  9,244,239,236,228,\n    243,244,249,236,101,128,247, 49,112,  2,147,190,147,197,225,242,\n    229,110,128, 36,116,229,114,  2,147,204,147,210,233,239,100,128,\n     36,136,243,233,225,110,128,  6,241,241,245,225,242,244,229,114,\n    128,  0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242,\n    233,239,114,128,  0,185,244,104,  2,147,253,148,  2,225,105,128,\n     14, 81,233,242,100,128, 33, 83,111,  3,148, 16,148, 50,148, 66,\n    103,  2,148, 22,148, 40,239,238,229,107,129,  1,235,148, 31,237,\n    225,227,242,239,110,128,  1,237,245,242,237,245,235,232,105,128,\n     10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128,\n     10, 75,240,229,110,128,  2, 84,112,  3,148, 80,148, 87,148, 98,\n    225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128,\n     37,230,244,233,239,110,128, 35, 37,114,  2,148,111,148,140,100,\n      2,148,117,148,128,230,229,237,233,238,233,238,101,128,  0,170,\n    237,225,243,227,245,236,233,238,101,128,  0,186,244,232,239,231,\n    239,238,225,108,128, 34, 31,115,  5,148,163,148,195,148,212,149,\n      1,149, 14,232,239,242,116,  2,148,172,148,179,228,229,246, 97,\n    128,  9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97,\n    128,  9, 74,236,225,243,104,129,  0,248,148,204,225,227,245,244,\n    101,128,  1,255,237,225,236,108,  2,148,221,148,232,232,233,242,\n    225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97,\n    129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255,\n    107,244,242,239,235,229,225,227,245,244,101,128,  1,255,245,240,\n    229,242,233,239,114,128,246,240,116,  2,149, 30,149, 41,227,249,\n    242,233,236,236,233, 99,128,  4,127,233,236,228,101,130,  0,245,\n    149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242,\n    229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111,\n    128, 49, 33,118,  2,149, 89,149,170,229,114,  2,149, 96,149,162,\n    236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99,  2,149,\n    115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237,\n     98,128,  3,  5,100,  2,149,138,149,146,225,243,232,229,100,128,\n    254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128,\n    254, 75,243,227,239,242,101,128,  0,175,239,247,229,236,243,233,\n    231,110,  3,149,185,149,195,149,202,226,229,238,231,225,236,105,\n    128,  9,203,228,229,246, 97,128,  9, 75,231,245,234,225,242,225,\n    244,105,128, 10,203,112,145,  0,112,149,251,152,123,152,134,152,\n    143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157,\n     92,157,100,158,  2,158, 60,158, 88,158, 98, 97, 14,150, 25,150,\n     57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150,\n    212,150,226,151,238,152, 21,152,111, 97,  2,150, 31,150, 43,237,\n    240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239,\n    243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105,\n    128,  9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128,  9,\n     42,103,  2,150, 87,150,105,101,  2,150, 93,150,100,228,239,247,\n    110,128, 33,223,245,112,128, 33,222,117,  2,150,111,150,120,234,\n    225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10,\n     42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238,\n    238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225,\n    238, 97,128, 48,209,108,  2,150,171,150,196,225,244,225,236,233,\n    250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237,\n     98,128,  4,132,239,227,232,235,225,227,249,242,233,236,236,233,\n     99,128,  4,192,238,243,233,239,243,235,239,242,229,225,110,128,\n     49,127,114,  3,150,234,150,255,151,227, 97,  2,150,240,150,248,\n    231,242,225,240,104,128,  0,182,236,236,229,108,128, 34, 37,229,\n    110,  2,151,  6,151,116,236,229,230,116,136,  0, 40,151, 29,151,\n     44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244,\n    239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248,\n    237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32,\n    141,237,239,238,239,243,240,225,227,101,128,255,  8,115,  2,151,\n     83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239,\n    114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225,\n    108,128,254, 53,242,233,231,232,116,136,  0, 41,151,140,151,155,\n    151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239,\n    238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248,\n    229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142,\n    237,239,238,239,243,240,225,227,101,128,255,  9,115,  2,151,194,\n    151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114,\n    128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108,\n    128,254, 54,244,233,225,236,228,233,230,102,128, 34,  2,115,  3,\n    151,246,152,  1,152, 13,229,241,232,229,226,242,229,119,128,  5,\n    192,232,244,225,232,229,226,242,229,119,128,  5,153,241,245,225,\n    242,101,128, 51,169,244,225,104,134,  5,183,152, 39,152, 53,152,\n     58,152, 67,152, 82,152, 98, 49,  2,152, 45,152, 49, 49,128,  5,\n    183,100,128,  5,183,178, 97,128,  5,183,232,229,226,242,229,119,\n    128,  5,183,238,225,242,242,239,247,232,229,226,242,229,119,128,\n      5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128,\n      5,183,247,233,228,229,232,229,226,242,229,119,128,  5,183,250,\n    229,242,232,229,226,242,229,119,128,  5,161,226,239,240,239,237,\n    239,230,111,128, 49,  6,227,233,242,227,236,101,128, 36,223,228,\n    239,244,225,227,227,229,238,116,128, 30, 87,101,137,  5,228,152,\n    177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154,\n     73,227,249,242,233,236,236,233, 99,128,  4, 63,228,225,231,229,\n    243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68,\n    229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225,\n    236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67,\n    104,  5,152,252,153, 19,153, 27,153, 41,153, 71,225,114,  2,153,\n      3,153, 10,225,226,233, 99,128,  6,126,237,229,238,233,225,110,\n    128,  5,122,229,226,242,229,119,128,  5,228,230,233,238,225,236,\n    225,242,225,226,233, 99,128,251, 87,105,  2,153, 47,153, 62,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225,\n    231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225,\n    226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48,\n    218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236,\n    236,233, 99,128,  4,167,114,  5,153,130,153,142,153,184,154, 49,\n    154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229,\n    238,116,131,  0, 37,153,155,153,164,153,176,225,242,225,226,233,\n     99,128,  6,106,237,239,238,239,243,240,225,227,101,128,255,  5,\n    243,237,225,236,108,128,254,106,105,  2,153,190,154, 31,239,100,\n    134,  0, 46,153,207,153,218,153,229,153,241,153,252,154,  8,225,\n    242,237,229,238,233,225,110,128,  5,137,227,229,238,244,229,242,\n    229,100,128,  0,183,232,225,236,230,247,233,228,244,104,128,255,\n     97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239,\n    243,240,225,227,101,128,255, 14,115,  2,154, 14,154, 21,237,225,\n    236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243,\n    240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128,  3,\n     66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232,\n    239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167,\n    230,243,241,245,225,242,101,128, 51,138,104,  3,154, 98,154,148,\n    155, 29, 97,  3,154,106,154,116,154,123,226,229,238,231,225,236,\n    105,128,  9,171,228,229,246, 97,128,  9, 43,231,117,  2,154,130,\n    154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232,\n    105,128, 10, 43,105,133,  3,198,154,162,154,166,154,252,155,  4,\n    155, 15, 49,128,  3,213,229,245,240,104,  4,154,179,154,214,154,\n    229,154,238, 97,  2,154,185,154,200,227,233,242,227,236,229,235,\n    239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242,\n    229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229,\n    225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225,\n    242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233,\n    110,128,  2,120,238,244,232,245,244,232,225,105,128, 14, 58,243,\n    249,237,226,239,236,231,242,229,229,107,128,  3,213,111,  3,155,\n     37,155, 42,155, 68,239,107,128,  1,165,240,104,  2,155, 49,155,\n     58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225,\n    105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128,\n     14, 32,105,133,  3,192,155, 96,156, 52,156, 63,156, 74,156, 88,\n    229,245,112,  6,155,112,155,147,155,179,155,207,155,221,156, 17,\n     97,  2,155,118,155,133,227,233,242,227,236,229,235,239,242,229,\n    225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110,\n    128, 50, 19,227,105,  2,155,154,155,166,229,245,227,235,239,242,\n    229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110,\n    128, 50,101,107,  2,155,185,155,199,233,249,229,239,235,235,239,\n    242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240,\n    225,242,229,238,235,239,242,229,225,110,128, 50,  5,243,233,239,\n    115,  2,155,230,156,  2,107,  2,155,236,155,250,233,249,229,239,\n    235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128,\n     49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49,\n    117,116,  2,156, 23,156, 38,232,233,229,245,244,232,235,239,242,\n    229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225,\n    110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235,\n    225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236,\n    231,242,229,229,107,128,  3,214,247,242,225,242,237,229,238,233,\n    225,110,128,  5,131,236,245,115,132,  0, 43,156,115,156,126,156,\n    135,156,168,226,229,236,239,247,227,237, 98,128,  3, 31,227,233,\n    242,227,236,101,128, 34,149,109,  2,156,141,156,148,233,238,245,\n    115,128,  0,177,111,  2,156,154,156,158,100,128,  2,214,238,239,\n    243,240,225,227,101,128,255, 11,115,  2,156,174,156,181,237,225,\n    236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109,\n      2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80,\n    243,241,245,225,242,101,128, 51,216,111,  5,156,229,156,240,157,\n     51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125,\n    233,238,244,233,238,231,233,238,228,229,120,  4,157,  4,157, 16,\n    157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31,\n    236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232,\n    244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101,\n    128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236,\n    225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107,\n    129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229,\n    110,128, 36,171,114,  3,157,108,157,134,157,159,101,  2,157,114,\n    157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244,\n    233,239,110,128, 33, 30,233,237,101,  2,157,142,157,148,237,239,\n    100,128,  2,185,242,229,246,229,242,243,229,100,128, 32, 53,111,\n      4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15,\n    234,229,227,244,233,246,101,128, 35,  5,236,239,238,231,229,228,\n    235,225,238, 97,128, 48,252,112,  2,157,205,157,242,101,  2,157,\n    211,157,218,236,236,239,114,128, 35, 24,242,243,117,  2,157,226,\n    157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128,\n     34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128,\n     34, 29,115,  2,158,  8,158, 51,105,130,  3,200,158, 16,158, 27,\n    227,249,242,233,236,236,233, 99,128,  4,113,236,233,240,238,229,\n    245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98,\n    128,  4,134,243,241,245,225,242,101,128, 51,176,117,  2,158, 66,\n    158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244,\n    225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128,\n     51,180,247,243,241,245,225,242,101,128, 51,186,113,136,  0,113,\n    158,128,159,177,159,188,159,197,159,204,159,216,159,254,160,  6,\n     97,  4,158,138,158,161,158,225,159,160,100,  2,158,144,158,150,\n    229,246, 97,128,  9, 88,237,225,232,229,226,242,229,119,128,  5,\n    168,102,  4,158,171,158,180,158,194,158,210,225,242,225,226,233,\n     99,128,  6, 66,230,233,238,225,236,225,242,225,226,233, 99,128,\n    254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,\n    254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,\n    216,237,225,244,115,136,  5,184,158,248,159, 12,159, 26,159, 31,\n    159, 36,159, 45,159, 60,159,147, 49,  3,159,  0,159,  4,159,  8,\n     48,128,  5,184, 97,128,  5,184, 99,128,  5,184, 50,  2,159, 18,\n    159, 22, 55,128,  5,184, 57,128,  5,184,179, 51,128,  5,184,228,\n    101,128,  5,184,232,229,226,242,229,119,128,  5,184,238,225,242,\n    242,239,247,232,229,226,242,229,119,128,  5,184,113,  2,159, 66,\n    159,132,225,244,225,110,  4,159, 79,159, 88,159,103,159,119,232,\n    229,226,242,229,119,128,  5,184,238,225,242,242,239,247,232,229,\n    226,242,229,119,128,  5,184,241,245,225,242,244,229,242,232,229,\n    226,242,229,119,128,  5,184,247,233,228,229,232,229,226,242,229,\n    119,128,  5,184,245,225,242,244,229,242,232,229,226,242,229,119,\n    128,  5,184,247,233,228,229,232,229,226,242,229,119,128,  5,184,\n    242,238,229,249,240,225,242,225,232,229,226,242,229,119,128,  5,\n    159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227,\n    236,101,128, 36,224,232,239,239,107,128,  2,160,237,239,238,239,\n    243,240,225,227,101,128,255, 81,239,102,130,  5,231,159,225,159,\n    245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242,\n    229,119,128,251, 71,232,229,226,242,229,119,128,  5,231,240,225,\n    242,229,110,128, 36,172,117,  4,160, 16,160, 28,160,117,160,204,\n    225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115,\n    135,  5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160,\n    104,177, 56,128,  5,187,178, 53,128,  5,187,179, 49,128,  5,187,\n    232,229,226,242,229,119,128,  5,187,238,225,242,242,239,247,232,\n    229,226,242,229,119,128,  5,187,241,245,225,242,244,229,242,232,\n    229,226,242,229,119,128,  5,187,247,233,228,229,232,229,226,242,\n    229,119,128,  5,187,229,243,244,233,239,110,133,  0, 63,160,136,\n    160,159,160,176,160,184,160,196,225,114,  2,160,143,160,150,225,\n    226,233, 99,128,  6, 31,237,229,238,233,225,110,128,  5, 94,228,\n    239,247,110,129,  0,191,160,168,243,237,225,236,108,128,247,191,\n    231,242,229,229,107,128,  3,126,237,239,238,239,243,240,225,227,\n    101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101,  4,\n    160,216,161, 31,161, 51,161, 80,228,226,108,133,  0, 34,160,232,\n    160,239,160,246,161,  2,161, 23,226,225,243,101,128, 32, 30,236,\n    229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128,\n    255,  2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229,\n    242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236,\n    229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100,\n    128, 32, 27,114,  2,161, 57,161, 67,229,246,229,242,243,229,100,\n    128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128,  1, 73,\n    243,233,238,231,108,  2,161, 90,161, 97,226,225,243,101,128, 32,\n     26,101,129,  0, 39,161,103,237,239,238,239,243,240,225,227,101,\n    128,255,  7,114,145,  0,114,161,153,162,157,162,168,162,215,163,\n     10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167,\n     35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161,\n    198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162,\n    151,225,242,237,229,238,233,225,110,128,  5,124,226,229,238,231,\n    225,236,105,128,  9,176,227,245,244,101,128,  1, 85,100,  4,161,\n    215,161,221,161,235,162,  5,229,246, 97,128,  9, 48,233,227,225,\n    108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243,\n    243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225,\n    242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101,\n    129,  5,191,162, 21,232,229,226,242,229,119,128,  5,191,231,117,\n      2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237,\n    245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128,\n     48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232,\n    225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242,\n    228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128,\n      9,241,109,  2,162,120,162,143,233,228,228,236,229,228,233,225,\n    231,239,238,225,236,226,229,238,231,225,236,105,128,  9,240,243,\n    232,239,242,110,128,  2,100,244,233,111,128, 34, 54,226,239,240,\n    239,237,239,230,111,128, 49, 22, 99,  4,162,178,162,185,162,194,\n    162,202,225,242,239,110,128,  1, 89,229,228,233,236,236, 97,128,\n      1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227,\n    227,229,238,116,128,  1, 87,100,  2,162,221,162,231,226,236,231,\n    242,225,246,101,128,  2, 17,239,116,  2,162,238,162,247,225,227,\n    227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163,\n      1,237,225,227,242,239,110,128, 30, 93,101,  6,163, 24,163, 69,\n    163,104,163,159,163,184,163,217,102,  2,163, 30,163, 43,229,242,\n    229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117,\n      2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243,\n    229,116,128, 34,135,231,233,243,244,229,114,  2,163, 80,163, 85,\n    229,100,128,  0,174,115,  2,163, 91,163, 97,225,238,115,128,248,\n    232,229,242,233,102,128,246,218,104,  3,163,112,163,135,163,149,\n    225,114,  2,163,119,163,126,225,226,233, 99,128,  6, 49,237,229,\n    238,233,225,110,128,  5,128,230,233,238,225,236,225,242,225,226,\n    233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235,\n    225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230,\n    247,233,228,244,104,128,255,154,243,104,130,  5,232,163,193,163,\n    208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72,\n    232,229,226,242,229,119,128,  5,232,118,  3,163,225,163,238,164,\n     14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97,\n      2,163,245,163,254,232,229,226,242,229,119,128,  5,151,237,245,\n    231,242,225,243,232,232,229,226,242,229,119,128,  5,151,236,239,\n    231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232,\n    239,239,107,129,  2,126,164, 40,242,229,246,229,242,243,229,100,\n    128,  2,127,104,  2,164, 57,164, 80, 97,  2,164, 63,164, 73,226,\n    229,238,231,225,236,105,128,  9,221,228,229,246, 97,128,  9, 93,\n    111,131,  3,193,164, 90,164,119,164,133,239,107,129,  2,125,164,\n     97,244,245,242,238,229,100,129,  2,123,164,108,243,245,240,229,\n    242,233,239,114,128,  2,181,243,249,237,226,239,236,231,242,229,\n    229,107,128,  3,241,244,233,227,232,239,239,235,237,239,100,128,\n      2,222,105,  6,164,160,165,204,165,250,166,  5,166, 30,166,166,\n    229,245,108,  9,164,182,164,217,164,232,164,246,165, 36,165, 50,\n    165,136,165,149,165,184, 97,  2,164,188,164,203,227,233,242,227,\n    236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238,\n    235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235,\n    239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242,\n    229,225,110,128, 49, 64,107,  2,164,252,165, 28,233,249,229,239,\n    107,  2,165,  6,165, 15,235,239,242,229,225,110,128, 49, 58,243,\n    233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225,\n    110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128,\n     49, 59,112,  3,165, 58,165, 90,165,105, 97,  2,165, 64,165, 78,\n    238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229,\n    238,235,239,242,229,225,110,128, 50,  3,232,233,229,245,240,232,\n    235,239,242,229,225,110,128, 49, 63,233,229,245,112,  2,165,114,\n    165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235,\n    239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229,\n    225,110,128, 49, 61,116,  2,165,155,165,170,232,233,229,245,244,\n    232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235,\n    239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233,\n    229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116,  2,\n    165,212,165,220,225,238,231,236,101,128, 34, 31,116,  2,165,226,\n    165,240,225,227,235,226,229,236,239,247,227,237, 98,128,  3, 25,\n    242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225,\n    238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234,\n    166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110,  2,\n    166, 36,166,152,103,131,  2,218,166, 46,166, 57,166, 63,226,229,\n    236,239,247,227,237, 98,128,  3, 37,227,237, 98,128,  3, 10,232,\n    225,236,102,  2,166, 72,166,118,236,229,230,116,131,  2,191,166,\n     85,166, 96,166,107,225,242,237,229,238,233,225,110,128,  5, 89,\n    226,229,236,239,247,227,237, 98,128,  3, 28,227,229,238,244,229,\n    242,229,100,128,  2,211,242,233,231,232,116,130,  2,190,166,130,\n    166,141,226,229,236,239,247,227,237, 98,128,  3, 57,227,229,238,\n    244,229,242,229,100,128,  2,210,246,229,242,244,229,228,226,242,\n    229,246,101,128,  2, 19,244,244,239,242,245,243,241,245,225,242,\n    101,128, 51, 81,108,  2,166,186,166,197,233,238,229,226,229,236,\n    239,119,128, 30, 95,239,238,231,236,229,103,129,  2,124,166,208,\n    244,245,242,238,229,100,128,  2,122,237,239,238,239,243,240,225,\n    227,101,128,255, 82,111,  3,166,237,166,248,167, 17,232,233,242,\n    225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97,\n    129, 48,237,167,  5,232,225,236,230,247,233,228,244,104,128,255,\n    155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110,\n    128, 36,173,114,  3,167, 43,167, 79,167,109, 97,  3,167, 51,167,\n     61,167, 68,226,229,238,231,225,236,105,128,  9,220,228,229,246,\n     97,128,  9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229,\n    104,  2,167, 86,167, 95,225,242,225,226,233, 99,128,  6,145,230,\n    233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227,\n    225,236,233, 99,  4,167,125,167,135,167,142,167,153,226,229,238,\n    231,225,236,105,128,  9,224,228,229,246, 97,128,  9, 96,231,245,\n    234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233,\n    231,110,  3,167,169,167,179,167,186,226,229,238,231,225,236,105,\n    128,  9,196,228,229,246, 97,128,  9, 68,231,245,234,225,242,225,\n    244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241,\n    116,  2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242,\n    238,229,100,129,  2,121,167,232,243,245,240,229,242,233,239,114,\n    128,  2,180,117,  4,167,253,168,  8,168, 33,168, 80,232,233,242,\n    225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97,\n    129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255,\n    153,112,  2,168, 39,168, 74,229,101,  2,168, 46,168, 60,237,225,\n    242,235,226,229,238,231,225,236,105,128,  9,242,243,233,231,238,\n    226,229,238,231,225,236,105,128,  9,243,233,225,104,128,246,221,\n    244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99,  4,168,\n    103,168,113,168,120,168,131,226,229,238,231,225,236,105,128,  9,\n    139,228,229,246, 97,128,  9, 11,231,245,234,225,242,225,244,105,\n    128, 10,139,246,239,247,229,236,243,233,231,110,  3,168,147,168,\n    157,168,164,226,229,238,231,225,236,105,128,  9,195,228,229,246,\n     97,128,  9, 67,231,245,234,225,242,225,244,105,128, 10,195,115,\n    147,  0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174,\n     60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181,\n    203,182,133,182,206,183,120,183,130, 97,  9,168,237,168,247,169,\n     12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238,\n    231,225,236,105,128,  9,184,227,245,244,101,129,  1, 91,169,  0,\n    228,239,244,225,227,227,229,238,116,128, 30,101,100,  5,169, 24,\n    169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128,  6,\n     53,229,246, 97,128,  9, 56,230,233,238,225,236,225,242,225,226,\n    233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226,\n    233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233,\n     99,128,254,188,231,117,  2,169, 91,169,100,234,225,242,225,244,\n    105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242,\n    225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97,\n    129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255,\n    123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229,\n    247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253,\n    250,237,229,235,104,130,  5,225,169,188,169,208,228,225,231,229,\n    243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65,\n    232,229,226,242,229,119,128,  5,225,242, 97,  5,169,230,170, 48,\n    170, 56,170,106,170,114, 97,  5,169,242,169,250,170,  2,170, 33,\n    170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128,\n     14, 65,233,237,225,233,109,  2,170, 12,170, 23,225,236,225,233,\n    244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14,\n     67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48,\n    229,244,232,225,105,128, 14, 64,105,  3,170, 64,170, 88,170, 99,\n    105,  2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248,\n    134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105,\n    128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128,\n     14, 66,117,  3,170,122,170,172,170,179,101,  3,170,130,170,154,\n    170,165,101,  2,170,136,170,147,236,229,230,244,244,232,225,105,\n    128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232,\n    225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105,\n    128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237,\n    239,230,111,128, 49, 25, 99,  5,170,210,170,231,170,240,171, 33,\n    171, 55,225,242,239,110,129,  1, 97,170,219,228,239,244,225,227,\n    227,229,238,116,128, 30,103,229,228,233,236,236, 97,128,  1, 95,\n    232,247, 97,131,  2, 89,170,252,171,  7,171, 26,227,249,242,233,\n    236,236,233, 99,128,  4,217,228,233,229,242,229,243,233,243,227,\n    249,242,233,236,236,233, 99,128,  4,219,232,239,239,107,128,  2,\n     90,233,242, 99,  2,171, 41,171, 46,236,101,128, 36,226,245,237,\n    230,236,229,120,128,  1, 93,239,237,237,225,225,227,227,229,238,\n    116,128,  2, 25,228,239,116,  2,171, 76,171, 85,225,227,227,229,\n    238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228,\n    239,244,225,227,227,229,238,116,128, 30,105,101,  9,171,127,171,\n    143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225,\n    231,245,236,236,226,229,236,239,247,227,237, 98,128,  3, 60, 99,\n      2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238,\n    229,227,232,233,238,229,243,101,128,  2,202,244,233,239,110,128,\n      0,167,229,110,  4,171,189,171,198,171,212,171,228,225,242,225,\n    226,233, 99,128,  6, 51,230,233,238,225,236,225,242,225,226,233,\n     99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233,\n     99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99,\n    128,254,180,231,239,108,135,  5,182,172,  7,172, 21,172, 26,172,\n     35,172, 50,172, 66,172, 77, 49,  2,172, 13,172, 17, 51,128,  5,\n    182,102,128,  5,182,178, 99,128,  5,182,232,229,226,242,229,119,\n    128,  5,182,238,225,242,242,239,247,232,229,226,242,229,119,128,\n      5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128,\n      5,182,244,225,232,229,226,242,229,119,128,  5,146,247,233,228,\n    229,232,229,226,242,229,119,128,  5,182,104,  2,172, 96,172,107,\n    225,242,237,229,238,233,225,110,128,  5,125,233,242,225,231,225,\n    238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187,\n    172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105,\n      2,172,149,172,192,227,239,236,239,110,131,  0, 59,172,163,172,\n    172,172,184,225,242,225,226,233, 99,128,  6, 27,237,239,238,239,\n    243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84,\n    246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48,\n    156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238,\n    116,  2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34,\n    239,243,241,245,225,242,101,128, 51, 35,246,229,110,142,  0, 55,\n    173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146,\n    173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226,\n    233, 99,128,  6,103,226,229,238,231,225,236,105,128,  9,237,227,\n    233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243,\n    229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246,\n     97,128,  9,109,229,233,231,232,244,232,115,128, 33, 94,231,117,\n      2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237,\n    245,235,232,105,128, 10,109,232, 97,  2,173,126,173,137,227,235,\n    225,242,225,226,233, 99,128,  6,103,238,231,250,232,239,117,128,\n     48, 39,105,  2,173,152,173,170,228,229,239,231,242,225,240,232,\n    233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239,\n    114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23,\n    239,236,228,243,244,249,236,101,128,247, 55,112,  2,173,209,173,\n    216,225,242,229,110,128, 36,122,229,114,  2,173,223,173,229,233,\n    239,100,128, 36,142,243,233,225,110,128,  6,247,242,239,237,225,\n    110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116,\n      2,174,  5,174, 43,229,229,110,  2,174, 13,174, 22,227,233,242,\n    227,236,101,128, 36,112,112,  2,174, 28,174, 35,225,242,229,110,\n    128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14,\n     87,230,244,232,249,240,232,229,110,128,  0,173,104,  7,174, 76,\n    175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97,  6,174, 90,\n    174,101,174,111,174,122,175,  9,175, 34,225,242,237,229,238,233,\n    225,110,128,  5,119,226,229,238,231,225,236,105,128,  9,182,227,\n    249,242,233,236,236,233, 99,128,  4, 72,100,  2,174,128,174,224,\n    228, 97,  4,174,139,174,148,174,179,174,193,225,242,225,226,233,\n     99,128,  6, 81,228,225,237,237, 97,  2,174,158,174,167,225,242,\n    225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99,\n    128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252,\n     96,235,225,243,242, 97,  2,174,203,174,212,225,242,225,226,233,\n     99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95,\n    101,132, 37,146,174,236,174,243,174,251,175,  4,228,225,242,107,\n    128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245,\n    109,128, 37,146,246, 97,128,  9, 54,231,117,  2,175, 16,175, 25,\n    234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128,\n     10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128,\n      5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225,\n    227,249,242,233,236,236,233, 99,128,  4, 73,101,  4,175, 85,175,\n    150,175,160,175,177,229,110,  4,175, 96,175,105,175,119,175,135,\n    225,242,225,226,233, 99,128,  6, 52,230,233,238,225,236,225,242,\n    225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242,\n    225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225,\n    226,233, 99,128,254,184,233,227,239,240,244,233, 99,128,  3,227,\n    241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32,\n    170,246, 97,134,  5,176,175,194,175,209,175,223,175,232,175,247,\n    176,  7, 49,  2,175,200,175,205,177, 53,128,  5,176, 53,128,  5,\n    176, 50,  2,175,215,175,219, 50,128,  5,176,101,128,  5,176,232,\n    229,226,242,229,119,128,  5,176,238,225,242,242,239,247,232,229,\n    226,242,229,119,128,  5,176,241,245,225,242,244,229,242,232,229,\n    226,242,229,119,128,  5,176,247,233,228,229,232,229,226,242,229,\n    119,128,  5,176,232,225,227,249,242,233,236,236,233, 99,128,  4,\n    187,105,  2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128,\n      3,237,110,131,  5,233,176, 60,176,143,176,152,100,  2,176, 66,\n    176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229,\n    226,242,229,119,128,251, 73,115,  2,176, 93,176,113,232,233,238,\n    228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251,\n     44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229,\n    119,128,251, 45,239,244,232,229,226,242,229,119,128,  5,193,232,\n    229,226,242,229,119,128,  5,233,115,  2,176,158,176,178,232,233,\n    238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128,\n    251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242,\n    229,119,128,251, 43,239,239,107,128,  2,130,105,  8,176,221,177,\n      9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97,\n    131,  3,195,176,233,176,237,176,245, 49,128,  3,194,230,233,238,\n    225,108,128,  3,194,236,245,238,225,244,229,243,249,237,226,239,\n    236,231,242,229,229,107,128,  3,242,232,233,242,225,231,225,238,\n     97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177,\n     33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113,\n      2,177, 53,177, 62,232,229,226,242,229,119,128,  5,189,236,229,\n    230,244,232,229,226,242,229,119,128,  5,189,237,233,236,225,114,\n    128, 34, 60,238,228,239,244,232,229,226,242,229,119,128,  5,194,\n    239,115,  6,177,111,177,146,177,178,177,206,177,220,177,252, 97,\n      2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225,\n    110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128,\n     50, 20,227,105,  2,177,153,177,165,229,245,227,235,239,242,229,\n    225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128,\n     50,102,107,  2,177,184,177,198,233,249,229,239,235,235,239,242,\n    229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233,\n    229,245,238,235,239,242,229,225,110,128, 49,123,112,  2,177,226,\n    177,239,225,242,229,238,235,239,242,229,225,110,128, 50,  6,233,\n    229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229,\n    245,244,235,239,242,229,225,110,128, 49,124,120,141,  0, 54,178,\n     41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178,\n    195,178,206,178,239,178,247,179,  2,225,242,225,226,233, 99,128,\n      6,102,226,229,238,231,225,236,105,128,  9,236,227,233,242,227,\n    236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225,\n    238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128,  9,\n    108,231,117,  2,178,104,178,113,234,225,242,225,244,105,128, 10,\n    236,242,237,245,235,232,105,128, 10,108,232, 97,  2,178,129,178,\n    140,227,235,225,242,225,226,233, 99,128,  6,102,238,231,250,232,\n    239,117,128, 48, 38,105,  2,178,155,178,173,228,229,239,231,242,\n    225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229,\n    242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101,\n    128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112,  2,\n    178,212,178,219,225,242,229,110,128, 36,121,229,114,  2,178,226,\n    178,232,233,239,100,128, 36,141,243,233,225,110,128,  6,246,242,\n    239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128,\n     32,118,116,  2,179,  8,179, 79,229,229,110,  2,179, 16,179, 58,\n     99,  2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242,\n    242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242,\n    226,229,238,231,225,236,105,128,  9,249,112,  2,179, 64,179, 71,\n    225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232,\n    225,105,128, 14, 86,108,  2,179, 91,179,111,225,243,104,129,  0,\n     47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239,\n    238,103,129,  1,127,179,119,228,239,244,225,227,227,229,238,116,\n    128, 30,155,109,  2,179,137,179,147,233,236,229,230,225,227,101,\n    128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111,  6,\n    179,172,179,222,179,233,180,  2,180, 47,180, 58,102,  2,179,178,\n    179,192,240,225,243,245,241,232,229,226,242,229,119,128,  5,195,\n    116,  2,179,198,179,207,232,249,240,232,229,110,128,  0,173,243,\n    233,231,238,227,249,242,233,236,236,233, 99,128,  4, 76,232,233,\n    242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238,\n     97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128,\n    255,127,236,233,228,245,115,  2,180, 12,180, 29,236,239,238,231,\n    239,246,229,242,236,225,249,227,237, 98,128,  3, 56,243,232,239,\n    242,244,239,246,229,242,236,225,249,227,237, 98,128,  3, 55,242,\n    245,243,233,244,232,225,105,128, 14, 41,115,  3,180, 66,180, 76,\n    180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225,\n    105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97,  3,\n    180,102,180,122,180,154,227,101,129,  0, 32,180,109,232,225,227,\n    235,225,242,225,226,233, 99,128,  0, 32,228,101,129, 38, 96,180,\n    129,243,245,233,116,  2,180,138,180,146,226,236,225,227,107,128,\n     38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174,\n    241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255,\n    181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239,\n    247,227,237, 98,128,  3, 59, 99,  2,180,205,180,209, 99,128, 51,\n    196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239,\n    243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239,\n    242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107,\n      2,181,  5,181,  9,103,128, 51,143,109,129, 51,158,181, 15,227,\n    225,240,233,244,225,108,128, 51,206,108,  2,181, 31,181, 35,110,\n    128, 51,209,239,103,128, 51,210,109,  4,181, 50,181, 54,181, 59,\n    181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243,\n    241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239,\n    238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236,\n    108,128, 37,166,245,240,240,229,114,  2,181,110,181,133,236,229,\n    230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233,\n    236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229,\n    242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244,\n    233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229,\n    247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37,\n    163,242,243,241,245,225,242,101,128, 51,219,115,  2,181,209,182,\n    123, 97,  4,181,219,181,229,181,236,181,247,226,229,238,231,225,\n    236,105,128,  9,183,228,229,246, 97,128,  9, 55,231,245,234,225,\n    242,225,244,105,128, 10,183,238,103,  8,182, 10,182, 24,182, 38,\n    182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235,\n    239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242,\n    229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225,\n    110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110,\n    128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49,\n    101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243,\n    233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229,\n    245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233,\n    239,114,128,246,242,116,  2,182,139,182,162,229,242,236,233,238,\n    103,129,  0,163,182,150,237,239,238,239,243,240,225,227,101,128,\n    255,225,242,239,235,101,  2,182,171,182,188,236,239,238,231,239,\n    246,229,242,236,225,249,227,237, 98,128,  3, 54,243,232,239,242,\n    244,239,246,229,242,236,225,249,227,237, 98,128,  3, 53,117,  7,\n    182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243,\n    229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225,\n    108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99,  2,\n    183,  4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225,\n    116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107,\n      2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183,\n     49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225,\n    242,225,226,233, 99,128,  6, 82,237,237,225,244,233,239,110,128,\n     34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183,\n     99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242,\n    229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128,\n     51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101,\n    128, 51,124,116,144,  0,116,183,183,184,192,184,213,185,100,185,\n    140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194,\n     57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183,\n    243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238,\n    231,225,236,105,128,  9,164,227,107,  2,183,222,183,229,228,239,\n    247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97,\n    128,  9, 36,231,117,  2,183,250,184,  3,234,225,242,225,244,105,\n    128, 10,164,242,237,245,235,232,105,128, 10, 36,104,  4,184, 22,\n    184, 31,184, 45,184, 75,225,242,225,226,233, 99,128,  6, 55,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,194,105,  2,184,\n     51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128,\n    254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225,\n    236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229,\n    242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235,\n    225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244,\n    104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128,\n      6, 64,117,128,  3,196,118,130,  5,234,184,158,184,183,228,225,\n    231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229,\n    226,242,229,119,128,251, 74,232,229,226,242,229,119,128,  5,234,\n     98,  2,184,198,184,203,225,114,128,  1,103,239,240,239,237,239,\n    230,111,128, 49, 10, 99,  6,184,227,184,234,184,241,184,250,185,\n     60,185, 87,225,242,239,110,128,  1,101,227,245,242,108,128,  2,\n    168,229,228,233,236,236, 97,128,  1, 99,232,229,104,  4,185,  6,\n    185, 15,185, 29,185, 45,225,242,225,226,233, 99,128,  6,134,230,\n    233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233,\n    244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228,\n    233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99,  2,\n    185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226,\n    229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238,\n    116,128,  1, 99,100,  2,185,106,185,116,233,229,242,229,243,233,\n    115,128, 30,151,239,116,  2,185,123,185,132,225,227,227,229,238,\n    116,128, 30,107,226,229,236,239,119,128, 30,109,101,  9,185,160,\n    185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158,\n    227,249,242,233,236,236,233, 99,128,  4, 66,228,229,243,227,229,\n    238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,173,104,\n      7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225,\n    242,225,226,233, 99,128,  6, 42,230,233,238,225,236,225,242,225,\n    226,233, 99,128,254,150,232,225,232,105,  2,185,239,185,254,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239,\n    236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105,  2,\n    186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99,\n    128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237,\n    105,  2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226,\n    233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226,\n    233, 99,128,252, 11,109,  2,186, 91,186,125,225,242,226,245,244,\n     97,  2,186,102,186,111,225,242,225,226,233, 99,128,  6, 41,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,148,101,  2,186,\n    131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152,\n    229,237,105,  2,186,152,186,167,238,233,244,233,225,236,225,242,\n    225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242,\n    225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236,\n    225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238,\n     97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128,\n    255,131,108,  2,186,232,186,251,229,240,232,239,238,101,129, 33,\n     33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97,  2,\n    187,  4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119,\n    128,  5,160,241,229,244,225,238,225,232,229,226,242,229,119,128,\n      5,169,110,  4,187, 44,187, 53,187, 72,187, 93,227,233,242,227,\n    236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227,\n    240,225,242,229,110,128, 50, 41,112,  2,187, 78,187, 85,225,242,\n    229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237,\n    225,110,128, 33,121,243,104,128,  2,167,116,131,  5,216,187,116,\n    187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232,\n    229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128,  5,\n    216,243,229,227,249,242,233,236,236,233, 99,128,  4,181,246,233,\n    114,  2,187,166,187,175,232,229,226,242,229,119,128,  5,155,236,\n    229,230,244,232,229,226,242,229,119,128,  5,155,104,  6,187,202,\n    188, 98,188,220,189, 96,190,  3,191, 60, 97,  5,187,214,187,224,\n    187,231,188,  0,188, 29,226,229,238,231,225,236,105,128,  9,165,\n    228,229,246, 97,128,  9, 37,231,117,  2,187,238,187,247,234,225,\n    242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37,\n    108,  2,188,  6,188, 15,225,242,225,226,233, 99,128,  6, 48,230,\n    233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232,\n    225,235,232,225,116,  3,188, 44,188, 75,188, 82,236,239,119,  2,\n    188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242,\n    233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128,\n     14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128,\n    248,150,101,  3,188,106,188,170,188,193,104,  4,188,116,188,125,\n    188,139,188,155,225,242,225,226,233, 99,128,  6, 43,230,233,238,\n    225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225,\n    236,225,242,225,226,233, 99,128,254,156,242,101,  2,188,177,188,\n    186,229,248,233,243,244,115,128, 34,  3,230,239,242,101,128, 34,\n     52,244, 97,130,  3,184,188,202,188,206, 49,128,  3,209,243,249,\n    237,226,239,236,231,242,229,229,107,128,  3,209,105,  2,188,226,\n    189, 56,229,245,244,104,  4,188,239,189, 18,189, 33,189, 42, 97,\n      2,188,245,189,  4,227,233,242,227,236,229,235,239,242,229,225,\n    110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128,\n     50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,\n    107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235,\n    239,242,229,225,110,128, 50, 11,242,244,229,229,110,  2,189, 66,\n    189, 75,227,233,242,227,236,101,128, 36,108,112,  2,189, 81,189,\n     88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148,\n    111,  6,189,110,189,127,189,132,189,146,189,151,189,204,238,225,\n    238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239,\n    107,128,  1,173,240,232,245,244,232,225,239,244,232,225,105,128,\n     14, 18,242,110,128,  0,254,244,104,  3,189,160,189,184,189,194,\n     97,  2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23,\n    238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128,\n     14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238,\n    100,  2,189,214,189,225,227,249,242,233,236,236,233, 99,128,  4,\n    130,243,243,229,240,225,242,225,244,239,114,  2,189,240,189,249,\n    225,242,225,226,233, 99,128,  6,108,240,229,242,243,233,225,110,\n    128,  6,108,242,229,101,144,  0, 51,190, 41,190, 50,190, 60,190,\n     90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190,\n    235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128,\n      6, 99,226,229,238,231,225,236,105,128,  9,233,227,233,242,227,\n    236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225,\n    238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128,  9,\n    105,229,233,231,232,244,232,115,128, 33, 92,231,117,  2,190,114,\n    190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232,\n    105,128, 10,105,232, 97,  2,190,139,190,150,227,235,225,242,225,\n    226,233, 99,128,  6, 99,238,231,250,232,239,117,128, 48, 35,105,\n      2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240,\n    225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32,\n    131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237,\n    229,242,225,244,239,242,226,229,238,231,225,236,105,128,  9,246,\n    239,236,228,243,244,249,236,101,128,247, 51,112,  2,190,241,190,\n    248,225,242,229,110,128, 36,118,229,114,  2,190,255,191,  5,233,\n    239,100,128, 36,138,243,233,225,110,128,  6,243,241,245,225,242,\n    244,229,242,115,129,  0,190,191, 25,229,237,228,225,243,104,128,\n    246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233,\n    239,114,128,  0,179,244,232,225,105,128, 14, 83,250,243,241,245,\n    225,242,101,128, 51,148,105,  7,191, 86,191, 97,191,212,192, 54,\n    192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48,\n     97,107,  2,191,103,191,127,225,244,225,235,225,238, 97,129, 48,\n    193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229,\n    245,116,  4,191,139,191,174,191,189,191,198, 97,  2,191,145,191,\n    160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112,\n    240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233,\n    242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242,\n    229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225,\n    110,128, 50,  2,236,228,101,133,  2,220,191,228,191,239,192,  0,\n    192, 12,192, 40,226,229,236,239,247,227,237, 98,128,  3, 48, 99,\n      2,191,245,191,250,237, 98,128,  3,  3,239,237, 98,128,  3,  3,\n    228,239,245,226,236,229,227,237, 98,128,  3, 96,111,  2,192, 18,\n    192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236,\n    225,249,227,237, 98,128,  3, 52,246,229,242,244,233,227,225,236,\n    227,237, 98,128,  3, 62,237,229,243,227,233,242,227,236,101,128,\n     34,151,112,  2,192, 72,192,102,229,232, 97,  2,192, 80,192, 89,\n    232,229,226,242,229,119,128,  5,150,236,229,230,244,232,229,226,\n    242,229,119,128,  5,150,240,233,231,245,242,237,245,235,232,105,\n    128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237,\n     98,128,  4,131,247,238,225,242,237,229,238,233,225,110,128,  5,\n    127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238,\n    239,243,240,225,227,101,128,255, 84,111,  7,192,185,192,196,192,\n    207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225,\n    110,128,  5,105,232,233,242,225,231,225,238, 97,128, 48,104,235,\n    225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230,\n    247,233,228,244,104,128,255,132,110,  3,192,240,193, 82,193, 87,\n    101,  4,192,250,193, 63,193, 70,193, 76,226,225,114,  4,193,  6,\n    193, 35,193, 45,193, 54,229,248,244,242, 97,  2,193, 16,193, 26,\n    232,233,231,232,237,239,100,128,  2,229,236,239,247,237,239,100,\n    128,  2,233,232,233,231,232,237,239,100,128,  2,230,236,239,247,\n    237,239,100,128,  2,232,237,233,228,237,239,100,128,  2,231,230,\n    233,246,101,128,  1,189,243,233,120,128,  1,133,244,247,111,128,\n      1,168,239,115,128,  3,132,243,241,245,225,242,101,128, 51, 39,\n    240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233,\n    243,229,243,232,229,236,236,226,242,225,227,235,229,116,  2,193,\n    131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237,\n    225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254,\n     57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225,\n    236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58,\n    244,225,239,244,232,225,105,128, 14, 21,240, 97,  2,193,209,193,\n    221,236,225,244,225,236,232,239,239,107,128,  1,171,242,229,110,\n    128, 36,175,114,  3,193,235,194, 10,194, 25,225,228,229,237,225,\n    242,107,129, 33, 34,193,247,115,  2,193,253,194,  3,225,238,115,\n    128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236,\n    229,248,232,239,239,107,128,  2,136,233,225,103,  4,194, 37,194,\n     42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242,\n    116,128, 37,186,245,112,128, 37,178,115,132,  2,166,194, 69,194,\n    108,194,214,194,227,225,228,105,130,  5,230,194, 79,194, 99,228,\n    225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119,\n    128,251, 70,232,229,226,242,229,119,128,  5,230,101,  2,194,114,\n    194,125,227,249,242,233,236,236,233, 99,128,  4, 70,242,101,134,\n      5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49,  2,\n    194,148,194,152, 50,128,  5,181,101,128,  5,181,178, 98,128,  5,\n    181,232,229,226,242,229,119,128,  5,181,238,225,242,242,239,247,\n    232,229,226,242,229,119,128,  5,181,241,245,225,242,244,229,242,\n    232,229,226,242,229,119,128,  5,181,247,233,228,229,232,229,226,\n    242,229,119,128,  5,181,232,229,227,249,242,233,236,236,233, 99,\n    128,  4, 91,245,240,229,242,233,239,114,128,246,243,116,  4,194,\n    247,195, 41,195,106,195,157, 97,  3,194,255,195,  9,195, 16,226,\n    229,238,231,225,236,105,128,  9,159,228,229,246, 97,128,  9, 31,\n    231,117,  2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159,\n    242,237,245,235,232,105,128, 10, 31,229,104,  4,195, 52,195, 61,\n    195, 75,195, 91,225,242,225,226,233, 99,128,  6,121,230,233,238,\n    225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233,\n    225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225,\n    236,225,242,225,226,233, 99,128,251,105,232, 97,  3,195,115,195,\n    125,195,132,226,229,238,231,225,236,105,128,  9,160,228,229,246,\n     97,128,  9, 32,231,117,  2,195,139,195,148,234,225,242,225,244,\n    105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238,\n    229,100,128,  2,135,117,  3,195,173,195,184,195,209,232,233,242,\n    225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97,\n    129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255,\n    130,243,237,225,236,108,  2,195,219,195,230,232,233,242,225,231,\n    225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48,\n    195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119,\n      2,196,  5,196,110,101,  2,196, 11,196, 59,236,246,101,  3,196,\n     21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112,  2,\n    196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100,\n    128, 36,147,242,239,237,225,110,128, 33,123,238,244,121,  3,196,\n     69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225,\n    238,231,250,232,239,117,128, 83, 68,112,  2,196, 95,196,102,225,\n    242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142,\n      0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39,\n    197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242,\n    225,226,233, 99,128,  6, 98,226,229,238,231,225,236,105,128,  9,\n    232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229,\n    242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100,\n      2,196,197,196,203,229,246, 97,128,  9,104,239,116,  2,196,210,\n    196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225,\n    228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108,\n    128,254, 48,231,117,  2,196,250,197,  3,234,225,242,225,244,105,\n    128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97,  2,197,\n     19,197, 30,227,235,225,242,225,226,233, 99,128,  6, 98,238,231,\n    250,232,239,117,128, 48, 34,105,  2,197, 45,197, 63,228,229,239,\n    231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238,\n    230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225,\n    227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229,\n    238,231,225,236,105,128,  9,245,239,236,228,243,244,249,236,101,\n    128,247, 50,112,  2,197,121,197,128,225,242,229,110,128, 36,117,\n    229,114,  2,197,135,197,141,233,239,100,128, 36,137,243,233,225,\n    110,128,  6,242,242,239,237,225,110,128, 33,113,115,  2,197,162,\n    197,170,244,242,239,235,101,128,  1,187,245,240,229,242,233,239,\n    114,128,  0,178,244,104,  2,197,187,197,192,225,105,128, 14, 82,\n    233,242,228,115,128, 33, 84,117,145,  0,117,197,237,197,245,198,\n     30,198, 87,198,225,199,  6,199,129,199,145,199,196,200, 10,200,\n     91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245,\n    244,101,128,  0,250, 98,  4,197,255,198,  4,198, 13,198, 23,225,\n    114,128,  2,137,229,238,231,225,236,105,128,  9,137,239,240,239,\n    237,239,230,111,128, 49, 40,242,229,246,101,128,  1,109, 99,  3,\n    198, 38,198, 45,198, 77,225,242,239,110,128,  1,212,233,242, 99,\n      2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120,\n    129,  0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233,\n    236,236,233, 99,128,  4, 67,100,  5,198, 99,198,110,198,133,198,\n    139,198,215,225,244,244,225,228,229,246, 97,128,  9, 81,226,108,\n      2,198,117,198,125,225,227,245,244,101,128,  1,113,231,242,225,\n    246,101,128,  2, 21,229,246, 97,128,  9,  9,233,229,242,229,243,\n    233,115,133,  0,252,198,159,198,167,198,175,198,198,198,206,225,\n    227,245,244,101,128,  1,216,226,229,236,239,119,128, 30,115, 99,\n      2,198,181,198,188,225,242,239,110,128,  1,218,249,242,233,236,\n    236,233, 99,128,  4,241,231,242,225,246,101,128,  1,220,237,225,\n    227,242,239,110,128,  1,214,239,244,226,229,236,239,119,128, 30,\n    229,103,  2,198,231,198,238,242,225,246,101,128,  0,249,117,  2,\n    198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245,\n    235,232,105,128, 10,  9,104,  3,199, 14,199, 24,199,102,233,242,\n    225,231,225,238, 97,128, 48, 70,111,  2,199, 30,199, 40,239,235,\n    225,226,239,246,101,128, 30,231,242,110,133,  1,176,199, 55,199,\n     63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228,\n    239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128,\n     30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233,\n    236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245,\n    116,129,  1,113,199,118,227,249,242,233,236,236,233, 99,128,  4,\n    243,233,238,246,229,242,244,229,228,226,242,229,246,101,128,  2,\n     23,107,  3,199,153,199,177,199,188,225,244,225,235,225,238, 97,\n    129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255,\n    115,227,249,242,233,236,236,233, 99,128,  4,121,239,242,229,225,\n    110,128, 49, 92,109,  2,199,202,199,255, 97,  2,199,208,199,241,\n    227,242,239,110,130,  1,107,199,219,199,230,227,249,242,233,236,\n    236,233, 99,128,  4,239,228,233,229,242,229,243,233,115,128, 30,\n    123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239,\n    238,239,243,240,225,227,101,128,255, 85,110,  2,200, 16,200, 71,\n    228,229,242,243,227,239,242,101,132,  0, 95,200, 35,200, 41,200,\n     53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225,\n    227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51,\n    247,225,246,121,128,254, 79,105,  2,200, 77,200, 82,239,110,128,\n     34, 42,246,229,242,243,225,108,128, 34,  0,239,231,239,238,229,\n    107,128,  1,115,112,  5,200,112,200,119,200,127,200,142,200,193,\n    225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240,\n    229,242,228,239,244,232,229,226,242,229,119,128,  5,196,243,233,\n    236,239,110,131,  3,197,200,156,200,177,200,185,228,233,229,242,\n    229,243,233,115,129,  3,203,200,169,244,239,238,239,115,128,  3,\n    176,236,225,244,233,110,128,  2,138,244,239,238,239,115,128,  3,\n    205,244,225,227,107,  2,200,202,200,213,226,229,236,239,247,227,\n    237, 98,128,  3, 29,237,239,100,128,  2,212,114,  2,200,225,200,\n    237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103,\n    128,  1,111,115,  3,200,251,201, 10,201, 55,232,239,242,244,227,\n    249,242,233,236,236,233, 99,128,  4, 94,237,225,236,108,  2,201,\n     19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225,\n    244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247,\n    233,228,244,104,128,255,105,244,242,225,233,231,232,116,  2,201,\n     67,201, 78,227,249,242,233,236,236,233, 99,128,  4,175,243,244,\n    242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,177,244,\n    233,236,228,101,130,  1,105,201,107,201,115,225,227,245,244,101,\n    128, 30,121,226,229,236,239,119,128, 30,117,117,  5,201,135,201,\n    145,201,152,201,177,201,193,226,229,238,231,225,236,105,128,  9,\n    138,228,229,246, 97,128,  9, 10,231,117,  2,201,159,201,168,234,\n    225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10,\n     10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10,\n     66,246,239,247,229,236,243,233,231,110,  3,201,209,201,219,201,\n    226,226,229,238,231,225,236,105,128,  9,194,228,229,246, 97,128,\n      9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247,\n    229,236,243,233,231,110,  3,201,253,202,  7,202, 14,226,229,238,\n    231,225,236,105,128,  9,193,228,229,246, 97,128,  9, 65,231,245,\n    234,225,242,225,244,105,128, 10,193,118,139,  0,118,202, 51,202,\n    199,202,208,202,219,203,148,203,155,203,253,204,  9,204,109,204,\n    117,204,138, 97,  4,202, 61,202, 68,202, 93,202,104,228,229,246,\n     97,128,  9, 53,231,117,  2,202, 75,202, 84,234,225,242,225,244,\n    105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244,\n    225,235,225,238, 97,128, 48,247,118,132,  5,213,202,116,202,143,\n    202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202,\n    134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104,\n      2,202,149,202,157,229,226,242,229,119,128,  5,213,239,236,225,\n    109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246,\n    225,246,232,229,226,242,229,119,128,  5,240,249,239,228,232,229,\n    226,242,229,119,128,  5,241,227,233,242,227,236,101,128, 36,229,\n    228,239,244,226,229,236,239,119,128, 30,127,101,  6,202,233,202,\n    244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233,\n     99,128,  4, 50,104,  4,202,254,203,  7,203, 21,203, 37,225,242,\n    225,226,233, 99,128,  6,164,230,233,238,225,236,225,242,225,226,\n    233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226,\n    233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233,\n     99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238,\n    245,115,128, 38, 64,242,244,233,227,225,108,  2,203, 80,203, 86,\n    226,225,114,128,  0,124,236,233,238,101,  4,203, 99,203,110,203,\n    121,203,130,225,226,239,246,229,227,237, 98,128,  3, 13,226,229,\n    236,239,247,227,237, 98,128,  3, 41,236,239,247,237,239,100,128,\n      2,204,237,239,100,128,  2,200,247,225,242,237,229,238,233,225,\n    110,128,  5,126,232,239,239,107,128,  2,139,105,  3,203,163,203,\n    174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225,\n    237, 97,  3,203,185,203,195,203,202,226,229,238,231,225,236,105,\n    128,  9,205,228,229,246, 97,128,  9, 77,231,245,234,225,242,225,\n    244,105,128, 10,205,243,225,242,231, 97,  3,203,225,203,235,203,\n    242,226,229,238,231,225,236,105,128,  9,131,228,229,246, 97,128,\n      9,  3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238,\n    239,243,240,225,227,101,128,255, 86,111,  3,204, 17,204, 28,204,\n     98,225,242,237,229,238,233,225,110,128,  5,120,233,227,229,100,\n      2,204, 37,204, 73,233,244,229,242,225,244,233,239,110,  2,204,\n     51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225,\n    244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238,\n     97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128,\n    255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242,\n    229,110,128, 36,177,116,  2,204,123,204,130,233,236,228,101,128,\n     30,125,245,242,238,229,100,128,  2,140,117,  2,204,144,204,155,\n    232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235,\n    225,238, 97,128, 48,244,119,143,  0,119,204,200,205,177,205,187,\n    205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168,\n    208,176,208,183,208,194,208,203, 97,  8,204,218,204,225,204,235,\n    204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30,\n    131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231,\n    225,238, 97,128, 48,143,107,  2,204,252,205, 20,225,244,225,235,\n    225,238, 97,129, 48,239,205,  8,232,225,236,230,247,233,228,244,\n    104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236,\n    108,  2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48,\n    142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243,\n    241,245,225,242,101,128, 51, 87,118,  2,205, 78,205, 86,229,228,\n    225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242,\n    229,246,229,242,244,233,227,225,108,128,254, 52,119,  3,205,116,\n    205,125,205,139,225,242,225,226,233, 99,128,  6, 72,230,233,238,\n    225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225,\n    225,226,239,246,101,  2,205,154,205,163,225,242,225,226,233, 99,\n    128,  6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254,\n    134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99,  2,\n    205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128,\n      1,117,100,  2,205,216,205,226,233,229,242,229,243,233,115,128,\n     30,133,239,116,  2,205,233,205,242,225,227,227,229,238,116,128,\n     30,135,226,229,236,239,119,128, 30,137,101,  4,206,  4,206, 15,\n    206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233,\n    229,242,243,244,242,225,243,115,128, 33, 24,107,  2,206, 33,206,\n     43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110,\n    128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225,\n    246,101,128, 30,129,232,233,244,101,  8,206, 90,206, 99,206,183,\n    207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116,\n    128, 37,230, 99,  2,206,105,206,125,233,242,227,236,101,129, 37,\n    203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238,\n    229,242,226,242,225,227,235,229,116,  2,206,142,206,162,236,229,\n    230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128,\n    254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244,\n    233,227,225,108,128,254, 68,100,  2,206,189,206,230,233,225,237,\n    239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233,\n    238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237,\n    239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238,\n    103,  2,206,246,207,  6,243,237,225,236,236,244,242,233,225,238,\n    231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37,\n    189,236,101,  2,207, 24,207, 66,230,244,240,239,233,238,244,233,\n    238,103,  2,207, 39,207, 55,243,237,225,236,236,244,242,233,225,\n    238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128,\n     37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229,\n    116,  2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231,\n    232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233,\n    238,103,  2,207,119,207,135,243,237,225,236,236,244,242,233,225,\n    238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128,\n     37,183,115,  3,207,154,207,184,207,192,109,  2,207,160,207,172,\n    225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238,\n    231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161,\n    244,225,114,128, 38,  6,116,  2,207,204,207,215,229,236,229,240,\n    232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232,\n    229,236,236,226,242,225,227,235,229,116,  2,207,239,207,246,236,\n    229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240,\n    240,239,233,238,244,233,238,103,  2,208, 13,208, 29,243,237,225,\n    236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233,\n    225,238,231,236,101,128, 37,179,105,  2,208, 46,208, 57,232,233,\n    242,225,231,225,238, 97,128, 48,144,107,  2,208, 63,208, 73,225,\n    244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49,\n     95,237,239,238,239,243,240,225,227,101,128,255, 87,111,  4,208,\n    103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128,\n     48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232,\n    225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208,\n    145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229,\n    238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178,\n    242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128,\n      2,183,244,245,242,238,229,100,128,  2,141,249,238,110,128,  1,\n    191,120,137,  0,120,208,231,208,242,208,253,209,  6,209, 33,209,\n     46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128,\n      3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242,\n    227,236,101,128, 36,231,100,  2,209, 12,209, 22,233,229,242,229,\n    243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30,\n    139,229,232,225,242,237,229,238,233,225,110,128,  5,109,105,128,\n      3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225,\n    242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128,  2,\n    227,121,143,  0,121,209,115,210, 74,210, 97,210,137,212,103,212,\n    111,212,128,212,192,212,204,213,201,213,241,213,253,214,  8,214,\n     29,215,  2, 97, 11,209,139,209,151,209,161,209,168,209,175,209,\n    185,209,210,209,221,210,  3,210, 16,210, 62,225,228,239,243,241,\n    245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128,  9,\n    175,227,245,244,101,128,  0,253,228,229,246, 97,128,  9, 47,229,\n    235,239,242,229,225,110,128, 49, 82,231,117,  2,209,192,209,201,\n    234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128,\n     10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107,  2,209,\n    227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232,\n    225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110,\n    128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78,\n    243,237,225,236,108,  2,210, 26,210, 37,232,233,242,225,231,225,\n    238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227,\n    210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227,\n    249,242,233,236,236,233, 99,128,  4, 99,227,233,242, 99,  2,210,\n     83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128,  1,\n    119,100,  2,210,103,210,113,233,229,242,229,243,233,115,128,  0,\n    255,239,116,  2,210,120,210,129,225,227,227,229,238,116,128, 30,\n    143,226,229,236,239,119,128, 30,245,101,  7,210,153,211,161,211,\n    170,211,188,211,220,212, 40,212, 91,104,  8,210,171,210,180,210,\n    214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233,\n     99,128,  6, 74,226,225,242,242,229,101,  2,210,191,210,200,225,\n    242,225,226,233, 99,128,  6,210,230,233,238,225,236,225,242,225,\n    226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233,\n     99,128,254,242,232,225,237,250,225,225,226,239,246,101,  4,210,\n    247,211,  0,211, 14,211, 30,225,242,225,226,233, 99,128,  6, 38,\n    230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238,\n    233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229,\n    228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233,\n    244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101,  2,\n    211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254,\n    244,229,237,105,  2,211, 89,211,104,238,233,244,233,225,236,225,\n    242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225,\n    242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225,\n    236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228,\n    239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128,  6,\n    209,235,239,242,229,225,110,128, 49, 86,110,129,  0,165,211,176,\n    237,239,238,239,243,240,225,227,101,128,255,229,111,  2,211,194,\n    211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233,\n    229,245,232,235,239,242,229,225,110,128, 49,134,114,  3,211,228,\n    212,  8,212, 20,225,232,226,229,238,249,239,237,111,  2,211,242,\n    211,251,232,229,226,242,229,119,128,  5,170,236,229,230,244,232,\n    229,226,242,229,119,128,  5,170,233,227,249,242,233,236,236,233,\n     99,128,  4, 75,245,228,233,229,242,229,243,233,243,227,249,242,\n    233,236,236,233, 99,128,  4,249,243,233,229,245,238,103,  3,212,\n     53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225,\n    238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233,\n    239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229,\n    226,242,229,119,128,  5,154,231,242,225,246,101,128, 30,243,232,\n    239,239,107,129,  1,180,212,120,225,226,239,246,101,128, 30,247,\n    105,  5,212,140,212,151,212,162,212,171,212,179,225,242,237,229,\n    238,233,225,110,128,  5,117,227,249,242,233,236,236,233, 99,128,\n      4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103,\n    128, 38, 47,247,238,225,242,237,229,238,233,225,110,128,  5,130,\n    237,239,238,239,243,240,225,227,101,128,255, 89,111,  7,212,220,\n    213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131,  5,217,\n    212,230,212,250,213,  3,228,225,231,229,243,104,129,251, 57,212,\n    241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119,\n    128,  5,217,249,239,100,  2,213, 11,213, 20,232,229,226,242,229,\n    119,128,  5,242,240,225,244,225,232,232,229,226,242,229,119,128,\n    251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239,\n    242,229,225,110,128, 49,137,107,  2,213, 61,213, 85,225,244,225,\n    235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228,\n    244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225,\n    236,108,  2,213,103,213,114,232,233,242,225,231,225,238, 97,128,\n     48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232,\n    225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229,\n    107,128,  3,243,121,  2,213,154,213,191, 97,  2,213,160,213,170,\n    229,235,239,242,229,225,110,128, 49,136,107,  2,213,176,213,184,\n    239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233,\n    238,231,244,232,225,105,128, 14, 13,112,  2,213,207,213,214,225,\n    242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238,\n    105,129,  3,122,213,230,231,242,229,229,235,227,237, 98,128,  3,\n     69,114,129,  1,166,213,247,233,238,103,128, 30,153,243,245,240,\n    229,242,233,239,114,128,  2,184,116,  2,214, 14,214, 21,233,236,\n    228,101,128, 30,249,245,242,238,229,100,128,  2,142,117,  5,214,\n     41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238,\n     97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107,  2,\n    214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80,\n    232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225,\n    110,128, 49, 96,115,  3,214,108,214,146,214,187,226,233,103,  2,\n    214,116,214,127,227,249,242,233,236,236,233, 99,128,  4,107,233,\n    239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,\n      4,109,236,233,244,244,236,101,  2,214,157,214,168,227,249,242,\n    233,236,236,233, 99,128,  4,103,233,239,244,233,230,233,229,228,\n    227,249,242,233,236,236,233, 99,128,  4,105,237,225,236,108,  2,\n    214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235,\n    225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230,\n    247,233,228,244,104,128,255,109,249,101,  2,214,239,214,248,235,\n    239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128,\n     49,138,249, 97,  2,215,  9,215, 19,226,229,238,231,225,236,105,\n    128,  9,223,228,229,246, 97,128,  9, 95,122,142,  0,122,215, 58,\n    216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88,\n    218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91,\n    215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27,\n    225,242,237,229,238,233,225,110,128,  5,102,227,245,244,101,128,\n      1,122,228,229,246, 97,128,  9, 91,231,245,242,237,245,235,232,\n    105,128, 10, 91,104,  4,215,126,215,135,215,149,215,179,225,242,\n    225,226,233, 99,128,  6, 56,230,233,238,225,236,225,242,225,226,\n    233, 99,128,254,198,105,  2,215,155,215,170,238,233,244,233,225,\n    236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97,\n    128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128,\n    254,200,233,110,  2,215,201,215,210,225,242,225,226,233, 99,128,\n      6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176,\n    235,225,244,225,235,225,238, 97,128, 48,182,241,229,102,  2,215,\n    243,216,  1,231,225,228,239,236,232,229,226,242,229,119,128,  5,\n    149,241,225,244,225,238,232,229,226,242,229,119,128,  5,148,242,\n    241,225,232,229,226,242,229,119,128,  5,152,249,233,110,130,  5,\n    214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48,\n    232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128,\n      5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99,  3,216,\n     85,216, 92,216,114,225,242,239,110,128,  1,126,233,242, 99,  2,\n    216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128,\n     30,145,245,242,108,128,  2,145,228,239,116,130,  1,124,216,130,\n    216,139,225,227,227,229,238,116,128,  1,124,226,229,236,239,119,\n    128, 30,147,101,  6,216,161,216,172,216,215,216,226,216,237,217,\n    177,227,249,242,233,236,236,233, 99,128,  4, 55,100,  2,216,178,\n    216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236,\n    233, 99,128,  4,153,233,229,242,229,243,233,243,227,249,242,233,\n    236,236,233, 99,128,  4,223,232,233,242,225,231,225,238, 97,128,\n     48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140,\n      0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85,\n    217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99,\n    128,  6, 96,226,229,238,231,225,236,105,128,  9,230,228,229,246,\n     97,128,  9,102,231,117,  2,217, 43,217, 52,234,225,242,225,244,\n    105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227,\n    235,225,242,225,226,233, 99,128,  6, 96,233,238,230,229,242,233,\n    239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255,\n     16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243,\n    233,225,110,128,  6,240,243,245,240,229,242,233,239,114,128, 32,\n    112,244,232,225,105,128, 14, 80,247,233,228,244,104,  3,217,148,\n    217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238,\n    234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32,\n     11,244, 97,128,  3,182,104,  2,217,188,217,199,226,239,240,239,\n    237,239,230,111,128, 49, 19,101,  4,217,209,217,220,217,236,217,\n    247,225,242,237,229,238,233,225,110,128,  5,106,226,242,229,246,\n    229,227,249,242,233,236,236,233, 99,128,  4,194,227,249,242,233,\n    236,236,233, 99,128,  4, 54,100,  2,217,253,218, 16,229,243,227,\n    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,151,\n    233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128,\n      4,221,105,  3,218, 42,218, 53,218, 64,232,233,242,225,231,225,\n    238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184,\n    238,239,242,232,229,226,242,229,119,128,  5,174,236,233,238,229,\n    226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227,\n    101,128,255, 90,111,  2,218,106,218,117,232,233,242,225,231,225,\n    238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190,\n    240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229,\n    248,232,239,239,107,128,  2,144,243,244,242,239,235,101,128,  1,\n    182,117,  2,218,167,218,178,232,233,242,225,231,225,238, 97,128,\n     48, 90,235,225,244,225,235,225,238, 97,128, 48,186\n  };\n\n\n  /*\n   *  This function searches the compressed table efficiently.\n   */\n  static unsigned long\n  ft_get_adobe_glyph_index( const char*  name,\n                            const char*  limit )\n  {\n    int                   c = 0;\n    int                   count, min, max;\n    const unsigned char*  p = ft_adobe_glyph_list;\n\n\n    if ( name == 0 || name >= limit )\n      goto NotFound;\n\n    c     = *name++;\n    count = p[1];\n    p    += 2;\n\n    min = 0;\n    max = count;\n\n    while ( min < max )\n    {\n      int                   mid = ( min + max ) >> 1;\n      const unsigned char*  q   = p + mid * 2;\n      int                   c2;\n\n\n      q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );\n\n      c2 = q[0] & 127;\n      if ( c2 == c )\n      {\n        p = q;\n        goto Found;\n      }\n      if ( c2 < c )\n        min = mid + 1;\n      else\n        max = mid;\n    }\n    goto NotFound;\n\n  Found:\n    for (;;)\n    {\n      /* assert (*p & 127) == c */\n\n      if ( name >= limit )\n      {\n        if ( (p[0] & 128) == 0 &&\n             (p[1] & 128) != 0 )\n          return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );\n\n        goto NotFound;\n      }\n      c = *name++;\n      if ( p[0] & 128 )\n      {\n        p++;\n        if ( c != (p[0] & 127) )\n          goto NotFound;\n\n        continue;\n      }\n\n      p++;\n      count = p[0] & 127;\n      if ( p[0] & 128 )\n        p += 2;\n\n      p++;\n\n      for ( ; count > 0; count--, p += 2 )\n      {\n        int                   offset = ( (int)p[0] << 8 ) | p[1];\n        const unsigned char*  q      = ft_adobe_glyph_list + offset;\n\n        if ( c == ( q[0] & 127 ) )\n        {\n          p = q;\n          goto NextIter;\n        }\n      }\n      goto NotFound;\n\n    NextIter:\n      ;\n    }\n\n  NotFound:\n    return 0;\n  }\n\n#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/psnames/rules.mk",
    "content": "#\n# FreeType 2 PSNames driver configuration rules\n#\n\n\n# Copyright 1996-2000, 2001, 2003, 2011 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# PSNames driver directory\n#\nPSNAMES_DIR := $(SRC_DIR)/psnames\n\n\n# compilation flags for the driver\n#\nPSNAMES_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSNAMES_DIR))\n\n\n# PSNames driver sources (i.e., C files)\n#\nPSNAMES_DRV_SRC := $(PSNAMES_DIR)/psmodule.c \\\n                   $(PSNAMES_DIR)/pspic.c\n\n\n# PSNames driver headers\n#\nPSNAMES_DRV_H := $(PSNAMES_DRV_SRC:%.c=%.h) \\\n                 $(PSNAMES_DIR)/psnamerr.h  \\\n                 $(PSNAMES_DIR)/pstables.h\n\n\n# PSNames driver object(s)\n#\n#   PSNAMES_DRV_OBJ_M is used during `multi' builds\n#   PSNAMES_DRV_OBJ_S is used during `single' builds\n#\nPSNAMES_DRV_OBJ_M := $(PSNAMES_DRV_SRC:$(PSNAMES_DIR)/%.c=$(OBJ_DIR)/%.$O)\nPSNAMES_DRV_OBJ_S := $(OBJ_DIR)/psnames.$O\n\n# PSNames driver source file for single build\n#\nPSNAMES_DRV_SRC_S := $(PSNAMES_DIR)/psmodule.c\n\n\n# PSNames driver - single object\n#\n$(PSNAMES_DRV_OBJ_S): $(PSNAMES_DRV_SRC_S) $(PSNAMES_DRV_SRC) \\\n                      $(FREETYPE_H) $(PSNAMES_DRV_H)\n\t$(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSNAMES_DRV_SRC_S))\n\n\n# PSNames driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(PSNAMES_DIR)/%.c $(FREETYPE_H) $(PSNAMES_DRV_H)\n\t$(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(PSNAMES_DRV_OBJ_S)\nDRV_OBJS_M += $(PSNAMES_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/raster/Jamfile",
    "content": "# FreeType 2 src/raster Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) raster ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = ftraster ftrend1 rastpic ;\n  }\n  else\n  {\n    _sources = raster ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/raster Jamfile\n"
  },
  {
    "path": "libs/freetype/src/raster/ftmisc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftmisc.h                                                               */\n/*                                                                         */\n/*    Miscellaneous macros for stand-alone rasterizer (specification       */\n/*    only).                                                               */\n/*                                                                         */\n/*  Copyright 2005, 2009, 2010 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /***************************************************/\n  /*                                                 */\n  /* This file is *not* portable!  You have to adapt */\n  /* its definitions to your platform.               */\n  /*                                                 */\n  /***************************************************/\n\n#ifndef __FTMISC_H__\n#define __FTMISC_H__\n\n\n  /* memset */\n#include FT_CONFIG_STANDARD_LIBRARY_H\n\n#define FT_BEGIN_HEADER\n#define FT_END_HEADER\n\n#define FT_LOCAL_DEF( x )   static x\n\n\n  /* from include/freetype2/fttypes.h */\n\n  typedef unsigned char  FT_Byte;\n  typedef signed int     FT_Int;\n  typedef unsigned int   FT_UInt;\n  typedef signed long    FT_Long;\n  typedef unsigned long  FT_ULong;\n  typedef signed long    FT_F26Dot6;\n  typedef int            FT_Error;\n\n#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \\\n          ( ( (FT_ULong)_x1 << 24 ) |     \\\n            ( (FT_ULong)_x2 << 16 ) |     \\\n            ( (FT_ULong)_x3 <<  8 ) |     \\\n              (FT_ULong)_x4         )\n\n\n  /* from include/freetype2/ftsystem.h */\n\n  typedef struct FT_MemoryRec_*  FT_Memory;\n\n  typedef void* (*FT_Alloc_Func)( FT_Memory  memory,\n                                  long       size );\n\n  typedef void (*FT_Free_Func)( FT_Memory  memory,\n                                void*      block );\n\n  typedef void* (*FT_Realloc_Func)( FT_Memory  memory,\n                                    long       cur_size,\n                                    long       new_size,\n                                    void*      block );\n\n  typedef struct FT_MemoryRec_\n  {\n    void*            user;\n\n    FT_Alloc_Func    alloc;\n    FT_Free_Func     free;\n    FT_Realloc_Func  realloc;\n\n  } FT_MemoryRec;\n\n\n  /* from src/ftcalc.c */\n\n#if ( defined _WIN32 || defined _WIN64 )\n\n  typedef __int64  FT_Int64;\n\n#else\n\n#include \"inttypes.h\"\n\n  typedef int64_t  FT_Int64;\n\n#endif\n\n\n  static FT_Long\n  FT_MulDiv( FT_Long  a,\n             FT_Long  b,\n             FT_Long  c )\n  {\n    FT_Int   s;\n    FT_Long  d;\n\n\n    s = 1;\n    if ( a < 0 ) { a = -a; s = -1; }\n    if ( b < 0 ) { b = -b; s = -s; }\n    if ( c < 0 ) { c = -c; s = -s; }\n\n    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c\n                         : 0x7FFFFFFFL );\n\n    return ( s > 0 ) ? d : -d;\n  }\n\n\n  static FT_Long\n  FT_MulDiv_No_Round( FT_Long  a,\n                      FT_Long  b,\n                      FT_Long  c )\n  {\n    FT_Int   s;\n    FT_Long  d;\n\n\n    s = 1;\n    if ( a < 0 ) { a = -a; s = -1; }\n    if ( b < 0 ) { b = -b; s = -s; }\n    if ( c < 0 ) { c = -c; s = -s; }\n\n    d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c\n                         : 0x7FFFFFFFL );\n\n    return ( s > 0 ) ? d : -d;\n  }\n\n#endif /* __FTMISC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/raster/ftraster.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftraster.c                                                             */\n/*                                                                         */\n/*    The FreeType glyph rasterizer (body).                                */\n/*                                                                         */\n/*  Copyright 1996-2003, 2005, 2007-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file can be compiled without the rest of the FreeType engine, by */\n  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */\n  /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir)           */\n  /* directory.  Typically, you should do something like                   */\n  /*                                                                       */\n  /* - copy `src/raster/ftraster.c' (this file) to your current directory  */\n  /*                                                                       */\n  /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h'         */\n  /*   to your current directory                                           */\n  /*                                                                       */\n  /* - compile `ftraster' with the _STANDALONE_ macro defined, as in       */\n  /*                                                                       */\n  /*     cc -c -D_STANDALONE_ ftraster.c                                   */\n  /*                                                                       */\n  /* The renderer can be initialized with a call to                        */\n  /* `ft_standard_raster.raster_new'; a bitmap can be generated            */\n  /* with a call to `ft_standard_raster.raster_render'.                    */\n  /*                                                                       */\n  /* See the comments and documentation in the file `ftimage.h' for more   */\n  /* details on how the raster works.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This is a rewrite of the FreeType 1.x scan-line converter             */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef _STANDALONE_\n\n#define FT_CONFIG_STANDARD_LIBRARY_H  <stdlib.h>\n\n#include <string.h>           /* for memset */\n\n#include \"ftmisc.h\"\n#include \"ftimage.h\"\n\n#else /* !_STANDALONE_ */\n\n#include <ft2build.h>\n#include \"ftraster.h\"\n#include FT_INTERNAL_CALC_H   /* for FT_MulDiv and FT_MulDiv_No_Round */\n\n#include \"rastpic.h\"\n\n#endif /* !_STANDALONE_ */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A simple technical note on how the raster works                       */\n  /* -----------------------------------------------                       */\n  /*                                                                       */\n  /*   Converting an outline into a bitmap is achieved in several steps:   */\n  /*                                                                       */\n  /*   1 - Decomposing the outline into successive `profiles'.  Each       */\n  /*       profile is simply an array of scanline intersections on a given */\n  /*       dimension.  A profile's main attributes are                     */\n  /*                                                                       */\n  /*       o its scanline position boundaries, i.e. `Ymin' and `Ymax'      */\n  /*                                                                       */\n  /*       o an array of intersection coordinates for each scanline        */\n  /*         between `Ymin' and `Ymax'                                     */\n  /*                                                                       */\n  /*       o a direction, indicating whether it was built going `up' or    */\n  /*         `down', as this is very important for filling rules           */\n  /*                                                                       */\n  /*       o its drop-out mode                                             */\n  /*                                                                       */\n  /*   2 - Sweeping the target map's scanlines in order to compute segment */\n  /*       `spans' which are then filled.  Additionally, this pass         */\n  /*       performs drop-out control.                                      */\n  /*                                                                       */\n  /*   The outline data is parsed during step 1 only.  The profiles are    */\n  /*   built from the bottom of the render pool, used as a stack.  The     */\n  /*   following graphics shows the profile list under construction:       */\n  /*                                                                       */\n  /*     __________________________________________________________ _ _    */\n  /*    |         |                 |         |                 |          */\n  /*    | profile | coordinates for | profile | coordinates for |-->       */\n  /*    |    1    |  profile 1      |    2    |  profile 2      |-->       */\n  /*    |_________|_________________|_________|_________________|__ _ _    */\n  /*                                                                       */\n  /*    ^                                                       ^          */\n  /*    |                                                       |          */\n  /* start of render pool                                      top         */\n  /*                                                                       */\n  /*   The top of the profile stack is kept in the `top' variable.         */\n  /*                                                                       */\n  /*   As you can see, a profile record is pushed on top of the render     */\n  /*   pool, which is then followed by its coordinates/intersections.  If  */\n  /*   a change of direction is detected in the outline, a new profile is  */\n  /*   generated until the end of the outline.                             */\n  /*                                                                       */\n  /*   Note that when all profiles have been generated, the function       */\n  /*   Finalize_Profile_Table() is used to record, for each profile, its   */\n  /*   bottom-most scanline as well as the scanline above its upmost       */\n  /*   boundary.  These positions are called `y-turns' because they (sort  */\n  /*   of) correspond to local extrema.  They are stored in a sorted list  */\n  /*   built from the top of the render pool as a downwards stack:         */\n  /*                                                                       */\n  /*      _ _ _______________________________________                      */\n  /*                            |                    |                     */\n  /*                         <--| sorted list of     |                     */\n  /*                         <--|  extrema scanlines |                     */\n  /*      _ _ __________________|____________________|                     */\n  /*                                                                       */\n  /*                            ^                    ^                     */\n  /*                            |                    |                     */\n  /*                         maxBuff           sizeBuff = end of pool      */\n  /*                                                                       */\n  /*   This list is later used during the sweep phase in order to          */\n  /*   optimize performance (see technical note on the sweep below).       */\n  /*                                                                       */\n  /*   Of course, the raster detects whether the two stacks collide and    */\n  /*   handles the situation properly.                                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  CONFIGURATION MACROS                                               **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /* define DEBUG_RASTER if you want to compile a debugging version */\n/* #define DEBUG_RASTER */\n\n  /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */\n  /* 5-levels anti-aliasing                                       */\n/* #define FT_RASTER_OPTION_ANTI_ALIASING */\n\n  /* The size of the two-lines intermediate bitmap used */\n  /* for anti-aliasing, in bytes.                       */\n#define RASTER_GRAY_LINES  2048\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  OTHER MACROS (do not change)                                       **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_raster\n\n\n#ifdef _STANDALONE_\n\n  /* Auxiliary macros for token concatenation. */\n#define FT_ERR_XCAT( x, y )  x ## y\n#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )\n\n  /* This macro is used to indicate that a function parameter is unused. */\n  /* Its purpose is simply to reduce compiler warnings.  Note also that  */\n  /* simply defining it as `(void)x' doesn't avoid warnings with certain */\n  /* ANSI compilers (e.g. LCC).                                          */\n#define FT_UNUSED( x )  (x) = (x)\n\n  /* Disable the tracing mechanism for simplicity -- developers can      */\n  /* activate it easily by redefining these macros.                      */\n#ifndef FT_ERROR\n#define FT_ERROR( x )  do { } while ( 0 )     /* nothing */\n#endif\n\n#ifndef FT_TRACE\n#define FT_TRACE( x )   do { } while ( 0 )    /* nothing */\n#define FT_TRACE1( x )  do { } while ( 0 )    /* nothing */\n#define FT_TRACE6( x )  do { } while ( 0 )    /* nothing */\n#endif\n\n#ifndef FT_THROW\n#define FT_THROW( e )  FT_ERR_CAT( Raster_Err_, e )\n#endif\n\n#define Raster_Err_None          0\n#define Raster_Err_Not_Ini      -1\n#define Raster_Err_Overflow     -2\n#define Raster_Err_Neg_Height   -3\n#define Raster_Err_Invalid      -4\n#define Raster_Err_Unsupported  -5\n\n#define ft_memset  memset\n\n#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \\\n                                raster_reset_, raster_set_mode_,    \\\n                                raster_render_, raster_done_ )      \\\n          const FT_Raster_Funcs class_ =                            \\\n          {                                                         \\\n            glyph_format_,                                          \\\n            raster_new_,                                            \\\n            raster_reset_,                                          \\\n            raster_set_mode_,                                       \\\n            raster_render_,                                         \\\n            raster_done_                                            \\\n         };\n\n#else /* !_STANDALONE_ */\n\n\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H       /* for FT_TRACE, FT_ERROR, and FT_THROW */\n\n#include \"rasterrs.h\"\n\n#define Raster_Err_None         FT_Err_Ok\n#define Raster_Err_Not_Ini      Raster_Err_Raster_Uninitialized\n#define Raster_Err_Overflow     Raster_Err_Raster_Overflow\n#define Raster_Err_Neg_Height   Raster_Err_Raster_Negative_Height\n#define Raster_Err_Invalid      Raster_Err_Invalid_Outline\n#define Raster_Err_Unsupported  Raster_Err_Cannot_Render_Glyph\n\n\n#endif /* !_STANDALONE_ */\n\n\n#ifndef FT_MEM_SET\n#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )\n#endif\n\n#ifndef FT_MEM_ZERO\n#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )\n#endif\n\n  /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is       */\n  /* typically a small value and the result of a*b is known to fit into */\n  /* 32 bits.                                                           */\n#define FMulDiv( a, b, c )  ( (a) * (b) / (c) )\n\n  /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */\n  /* for clipping computations.  It simply uses the FT_MulDiv() function   */\n  /* defined in `ftcalc.h'.                                                */\n#define SMulDiv           FT_MulDiv\n#define SMulDiv_No_Round  FT_MulDiv_No_Round\n\n  /* The rasterizer is a very general purpose component; please leave */\n  /* the following redefinitions there (you never know your target    */\n  /* environment).                                                    */\n\n#ifndef TRUE\n#define TRUE   1\n#endif\n\n#ifndef FALSE\n#define FALSE  0\n#endif\n\n#ifndef NULL\n#define NULL  (void*)0\n#endif\n\n#ifndef SUCCESS\n#define SUCCESS  0\n#endif\n\n#ifndef FAILURE\n#define FAILURE  1\n#endif\n\n\n#define MaxBezier  32   /* The maximum number of stacked Bezier curves. */\n                        /* Setting this constant to more than 32 is a   */\n                        /* pure waste of space.                         */\n\n#define Pixel_Bits  6   /* fractional bits of *input* coordinates */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  SIMPLE TYPE DECLARATIONS                                           **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  typedef int             Int;\n  typedef unsigned int    UInt;\n  typedef short           Short;\n  typedef unsigned short  UShort, *PUShort;\n  typedef long            Long, *PLong;\n  typedef unsigned long   ULong;\n\n  typedef unsigned char   Byte, *PByte;\n  typedef char            Bool;\n\n\n  typedef union  Alignment_\n  {\n    long    l;\n    void*   p;\n    void  (*f)(void);\n\n  } Alignment, *PAlignment;\n\n\n  typedef struct  TPoint_\n  {\n    Long  x;\n    Long  y;\n\n  } TPoint;\n\n\n  /* values for the `flags' bit field */\n#define Flow_Up           0x8\n#define Overshoot_Top     0x10\n#define Overshoot_Bottom  0x20\n\n\n  /* States of each line, arc, and profile */\n  typedef enum  TStates_\n  {\n    Unknown_State,\n    Ascending_State,\n    Descending_State,\n    Flat_State\n\n  } TStates;\n\n\n  typedef struct TProfile_  TProfile;\n  typedef TProfile*         PProfile;\n\n  struct  TProfile_\n  {\n    FT_F26Dot6  X;           /* current coordinate during sweep          */\n    PProfile    link;        /* link to next profile (various purposes)  */\n    PLong       offset;      /* start of profile's data in render pool   */\n    unsigned    flags;       /* Bit 0-2: drop-out mode                   */\n                             /* Bit 3: profile orientation (up/down)     */\n                             /* Bit 4: is top profile?                   */\n                             /* Bit 5: is bottom profile?                */\n    long        height;      /* profile's height in scanlines            */\n    long        start;       /* profile's starting scanline              */\n\n    unsigned    countL;      /* number of lines to step before this      */\n                             /* profile becomes drawable                 */\n\n    PProfile    next;        /* next profile in same contour, used       */\n                             /* during drop-out control                  */\n  };\n\n  typedef PProfile   TProfileList;\n  typedef PProfile*  PProfileList;\n\n\n  /* Simple record used to implement a stack of bands, required */\n  /* by the sub-banding mechanism                               */\n  typedef struct  black_TBand_\n  {\n    Short  y_min;   /* band's minimum */\n    Short  y_max;   /* band's maximum */\n\n  } black_TBand;\n\n\n#define AlignProfileSize \\\n  ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) )\n\n\n#undef RAS_ARG\n#undef RAS_ARGS\n#undef RAS_VAR\n#undef RAS_VARS\n\n#ifdef FT_STATIC_RASTER\n\n\n#define RAS_ARGS       /* void */\n#define RAS_ARG        /* void */\n\n#define RAS_VARS       /* void */\n#define RAS_VAR        /* void */\n\n#define FT_UNUSED_RASTER  do { } while ( 0 )\n\n\n#else /* !FT_STATIC_RASTER */\n\n\n#define RAS_ARGS       black_PWorker  worker,\n#define RAS_ARG        black_PWorker  worker\n\n#define RAS_VARS       worker,\n#define RAS_VAR        worker\n\n#define FT_UNUSED_RASTER  FT_UNUSED( worker )\n\n\n#endif /* !FT_STATIC_RASTER */\n\n\n  typedef struct black_TWorker_  black_TWorker, *black_PWorker;\n\n\n  /* prototypes used for sweep function dispatch */\n  typedef void\n  Function_Sweep_Init( RAS_ARGS Short*  min,\n                                Short*  max );\n\n  typedef void\n  Function_Sweep_Span( RAS_ARGS Short       y,\n                                FT_F26Dot6  x1,\n                                FT_F26Dot6  x2,\n                                PProfile    left,\n                                PProfile    right );\n\n  typedef void\n  Function_Sweep_Step( RAS_ARG );\n\n\n  /* NOTE: These operations are only valid on 2's complement processors */\n#undef FLOOR\n#undef CEILING\n#undef TRUNC\n#undef SCALED\n\n#define FLOOR( x )    ( (x) & -ras.precision )\n#define CEILING( x )  ( ( (x) + ras.precision - 1 ) & -ras.precision )\n#define TRUNC( x )    ( (Long)(x) >> ras.precision_bits )\n#define FRAC( x )     ( (x) & ( ras.precision - 1 ) )\n#define SCALED( x )   ( ( (ULong)(x) << ras.scale_shift ) - ras.precision_half )\n\n#define IS_BOTTOM_OVERSHOOT( x )  ( CEILING( x ) - x >= ras.precision_half )\n#define IS_TOP_OVERSHOOT( x )     ( x - FLOOR( x ) >= ras.precision_half )\n\n  /* The most used variables are positioned at the top of the structure. */\n  /* Thus, their offset can be coded with less opcodes, resulting in a   */\n  /* smaller executable.                                                 */\n\n  struct  black_TWorker_\n  {\n    Int         precision_bits;     /* precision related variables         */\n    Int         precision;\n    Int         precision_half;\n    Int         precision_shift;\n    Int         precision_step;\n    Int         precision_jitter;\n\n    Int         scale_shift;        /* == precision_shift   for bitmaps    */\n                                    /* == precision_shift+1 for pixmaps    */\n\n    PLong       buff;               /* The profiles buffer                 */\n    PLong       sizeBuff;           /* Render pool size                    */\n    PLong       maxBuff;            /* Profiles buffer size                */\n    PLong       top;                /* Current cursor in buffer            */\n\n    FT_Error    error;\n\n    Int         numTurns;           /* number of Y-turns in outline        */\n\n    TPoint*     arc;                /* current Bezier arc pointer          */\n\n    UShort      bWidth;             /* target bitmap width                 */\n    PByte       bTarget;            /* target bitmap buffer                */\n    PByte       gTarget;            /* target pixmap buffer                */\n\n    Long        lastX, lastY;\n    Long        minY, maxY;\n\n    UShort      num_Profs;          /* current number of profiles          */\n\n    Bool        fresh;              /* signals a fresh new profile which   */\n                                    /* `start' field must be completed     */\n    Bool        joint;              /* signals that the last arc ended     */\n                                    /* exactly on a scanline.  Allows      */\n                                    /* removal of doublets                 */\n    PProfile    cProfile;           /* current profile                     */\n    PProfile    fProfile;           /* head of linked list of profiles     */\n    PProfile    gProfile;           /* contour's first profile in case     */\n                                    /* of impact                           */\n\n    TStates     state;              /* rendering state                     */\n\n    FT_Bitmap   target;             /* description of target bit/pixmap    */\n    FT_Outline  outline;\n\n    Long        traceOfs;           /* current offset in target bitmap     */\n    Long        traceG;             /* current offset in target pixmap     */\n\n    Short       traceIncr;          /* sweep's increment in target bitmap  */\n\n    Short       gray_min_x;         /* current min x during gray rendering */\n    Short       gray_max_x;         /* current max x during gray rendering */\n\n    /* dispatch variables */\n\n    Function_Sweep_Init*  Proc_Sweep_Init;\n    Function_Sweep_Span*  Proc_Sweep_Span;\n    Function_Sweep_Span*  Proc_Sweep_Drop;\n    Function_Sweep_Step*  Proc_Sweep_Step;\n\n    Byte        dropOutControl;     /* current drop_out control method     */\n\n    Bool        second_pass;        /* indicates whether a horizontal pass */\n                                    /* should be performed to control      */\n                                    /* drop-out accurately when calling    */\n                                    /* Render_Glyph.  Note that there is   */\n                                    /* no horizontal pass during gray      */\n                                    /* rendering.                          */\n\n    TPoint      arcs[3 * MaxBezier + 1]; /* The Bezier stack               */\n\n    black_TBand  band_stack[16];    /* band stack used for sub-banding     */\n    Int          band_top;          /* band stack top                      */\n\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n    Byte*       grays;\n\n    Byte        gray_lines[RASTER_GRAY_LINES];\n                                /* Intermediate table used to render the   */\n                                /* graylevels pixmaps.                     */\n                                /* gray_lines is a buffer holding two      */\n                                /* monochrome scanlines                    */\n\n    Short       gray_width;     /* width in bytes of one monochrome        */\n                                /* intermediate scanline of gray_lines.    */\n                                /* Each gray pixel takes 2 bits long there */\n\n                       /* The gray_lines must hold 2 lines, thus with size */\n                       /* in bytes of at least `gray_width*2'.             */\n\n#endif /* FT_RASTER_ANTI_ALIASING */\n\n  };\n\n\n  typedef struct  black_TRaster_\n  {\n    char*          buffer;\n    long           buffer_size;\n    void*          memory;\n    black_PWorker  worker;\n    Byte           grays[5];\n    Short          gray_width;\n\n  } black_TRaster, *black_PRaster;\n\n#ifdef FT_STATIC_RASTER\n\n  static black_TWorker  cur_ras;\n#define ras  cur_ras\n\n#else /* !FT_STATIC_RASTER */\n\n#define ras  (*worker)\n\n#endif /* !FT_STATIC_RASTER */\n\n\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n  /* A lookup table used to quickly count set bits in four gray 2x2 */\n  /* cells.  The values of the table have been produced with the    */\n  /* following code:                                                */\n  /*                                                                */\n  /*   for ( i = 0; i < 256; i++ )                                  */\n  /*   {                                                            */\n  /*     l = 0;                                                     */\n  /*     j = i;                                                     */\n  /*                                                                */\n  /*     for ( c = 0; c < 4; c++ )                                  */\n  /*     {                                                          */\n  /*       l <<= 4;                                                 */\n  /*                                                                */\n  /*       if ( j & 0x80 ) l++;                                     */\n  /*       if ( j & 0x40 ) l++;                                     */\n  /*                                                                */\n  /*       j = ( j << 2 ) & 0xFF;                                   */\n  /*     }                                                          */\n  /*     printf( \"0x%04X\", l );                                     */\n  /*   }                                                            */\n  /*                                                                */\n\n  static const short  count_table[256] =\n  {\n    0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012,\n    0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022,\n    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,\n    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,\n    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,\n    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,\n    0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212,\n    0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222,\n    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,\n    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,\n    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,\n    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,\n    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,\n    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,\n    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,\n    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,\n    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,\n    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,\n    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,\n    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,\n    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,\n    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,\n    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,\n    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,\n    0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012,\n    0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022,\n    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,\n    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,\n    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,\n    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,\n    0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212,\n    0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222\n  };\n\n#endif /* FT_RASTER_OPTION_ANTI_ALIASING */\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  PROFILES COMPUTATION                                               **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Set_High_Precision                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set precision variables according to param flag.                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    High :: Set to True for high precision (typically for ppem < 24),  */\n  /*            false otherwise.                                           */\n  /*                                                                       */\n  static void\n  Set_High_Precision( RAS_ARGS Int  High )\n  {\n    /*\n     * `precision_step' is used in `Bezier_Up' to decide when to split a\n     * given y-monotonous Bezier arc that crosses a scanline before\n     * approximating it as a straight segment.  The default value of 32 (for\n     * low accuracy) corresponds to\n     *\n     *   32 / 64 == 0.5 pixels ,\n     *\n     * while for the high accuracy case we have\n     *\n     *   256/ (1 << 12) = 0.0625 pixels .\n     *\n     * `precision_jitter' is an epsilon threshold used in\n     * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier\n     * decomposition (after all, we are working with approximations only);\n     * it avoids switching on additional pixels which would cause artifacts\n     * otherwise.\n     *\n     * The value of `precision_jitter' has been determined heuristically.\n     *\n     */\n\n    if ( High )\n    {\n      ras.precision_bits   = 12;\n      ras.precision_step   = 256;\n      ras.precision_jitter = 30;\n    }\n    else\n    {\n      ras.precision_bits   = 6;\n      ras.precision_step   = 32;\n      ras.precision_jitter = 2;\n    }\n\n    FT_TRACE6(( \"Set_High_Precision(%s)\\n\", High ? \"true\" : \"false\" ));\n\n    ras.precision       = 1 << ras.precision_bits;\n    ras.precision_half  = ras.precision / 2;\n    ras.precision_shift = ras.precision_bits - Pixel_Bits;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    New_Profile                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Create a new profile in the render pool.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    aState    :: The state/orientation of the new profile.             */\n  /*                                                                       */\n  /*    overshoot :: Whether the profile's unrounded start position        */\n  /*                 differs by at least a half pixel.                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   SUCCESS on success.  FAILURE in case of overflow or of incoherent   */\n  /*   profile.                                                            */\n  /*                                                                       */\n  static Bool\n  New_Profile( RAS_ARGS TStates  aState,\n                        Bool     overshoot )\n  {\n    if ( !ras.fProfile )\n    {\n      ras.cProfile  = (PProfile)ras.top;\n      ras.fProfile  = ras.cProfile;\n      ras.top      += AlignProfileSize;\n    }\n\n    if ( ras.top >= ras.maxBuff )\n    {\n      ras.error = FT_THROW( Overflow );\n      return FAILURE;\n    }\n\n    ras.cProfile->flags  = 0;\n    ras.cProfile->start  = 0;\n    ras.cProfile->height = 0;\n    ras.cProfile->offset = ras.top;\n    ras.cProfile->link   = (PProfile)0;\n    ras.cProfile->next   = (PProfile)0;\n    ras.cProfile->flags  = ras.dropOutControl;\n\n    switch ( aState )\n    {\n    case Ascending_State:\n      ras.cProfile->flags |= Flow_Up;\n      if ( overshoot )\n        ras.cProfile->flags |= Overshoot_Bottom;\n\n      FT_TRACE6(( \"New ascending profile = %p\\n\", ras.cProfile ));\n      break;\n\n    case Descending_State:\n      if ( overshoot )\n        ras.cProfile->flags |= Overshoot_Top;\n      FT_TRACE6(( \"New descending profile = %p\\n\", ras.cProfile ));\n      break;\n\n    default:\n      FT_ERROR(( \"New_Profile: invalid profile direction\\n\" ));\n      ras.error = FT_THROW( Invalid );\n      return FAILURE;\n    }\n\n    if ( !ras.gProfile )\n      ras.gProfile = ras.cProfile;\n\n    ras.state = aState;\n    ras.fresh = TRUE;\n    ras.joint = FALSE;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    End_Profile                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalize the current profile.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    overshoot :: Whether the profile's unrounded end position differs  */\n  /*                 by at least a half pixel.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success.  FAILURE in case of overflow or incoherency.   */\n  /*                                                                       */\n  static Bool\n  End_Profile( RAS_ARGS Bool  overshoot )\n  {\n    Long      h;\n    PProfile  oldProfile;\n\n\n    h = (Long)( ras.top - ras.cProfile->offset );\n\n    if ( h < 0 )\n    {\n      FT_ERROR(( \"End_Profile: negative height encountered\\n\" ));\n      ras.error = FT_THROW( Neg_Height );\n      return FAILURE;\n    }\n\n    if ( h > 0 )\n    {\n      FT_TRACE6(( \"Ending profile %p, start = %ld, height = %ld\\n\",\n                  ras.cProfile, ras.cProfile->start, h ));\n\n      ras.cProfile->height = h;\n      if ( overshoot )\n      {\n        if ( ras.cProfile->flags & Flow_Up )\n          ras.cProfile->flags |= Overshoot_Top;\n        else\n          ras.cProfile->flags |= Overshoot_Bottom;\n      }\n\n      oldProfile   = ras.cProfile;\n      ras.cProfile = (PProfile)ras.top;\n\n      ras.top += AlignProfileSize;\n\n      ras.cProfile->height = 0;\n      ras.cProfile->offset = ras.top;\n\n      oldProfile->next = ras.cProfile;\n      ras.num_Profs++;\n    }\n\n    if ( ras.top >= ras.maxBuff )\n    {\n      FT_TRACE1(( \"overflow in End_Profile\\n\" ));\n      ras.error = FT_THROW( Overflow );\n      return FAILURE;\n    }\n\n    ras.joint = FALSE;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Insert_Y_Turn                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Insert a salient into the sorted list placed on top of the render  */\n  /*    pool.                                                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    New y scanline position.                                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success.  FAILURE in case of overflow.                  */\n  /*                                                                       */\n  static Bool\n  Insert_Y_Turn( RAS_ARGS Int  y )\n  {\n    PLong  y_turns;\n    Int    y2, n;\n\n\n    n       = ras.numTurns - 1;\n    y_turns = ras.sizeBuff - ras.numTurns;\n\n    /* look for first y value that is <= */\n    while ( n >= 0 && y < y_turns[n] )\n      n--;\n\n    /* if it is <, simply insert it, ignore if == */\n    if ( n >= 0 && y > y_turns[n] )\n      while ( n >= 0 )\n      {\n        y2 = (Int)y_turns[n];\n        y_turns[n] = y;\n        y = y2;\n        n--;\n      }\n\n    if ( n < 0 )\n    {\n      ras.maxBuff--;\n      if ( ras.maxBuff <= ras.top )\n      {\n        ras.error = FT_THROW( Overflow );\n        return FAILURE;\n      }\n      ras.numTurns++;\n      ras.sizeBuff[-ras.numTurns] = y;\n    }\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Finalize_Profile_Table                                             */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Adjust all links in the profiles list.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success.  FAILURE in case of overflow.                  */\n  /*                                                                       */\n  static Bool\n  Finalize_Profile_Table( RAS_ARG )\n  {\n    Int       bottom, top;\n    UShort    n;\n    PProfile  p;\n\n\n    n = ras.num_Profs;\n    p = ras.fProfile;\n\n    if ( n > 1 && p )\n    {\n      while ( n > 0 )\n      {\n        if ( n > 1 )\n          p->link = (PProfile)( p->offset + p->height );\n        else\n          p->link = NULL;\n\n        if ( p->flags & Flow_Up )\n        {\n          bottom = (Int)p->start;\n          top    = (Int)( p->start + p->height - 1 );\n        }\n        else\n        {\n          bottom     = (Int)( p->start - p->height + 1 );\n          top        = (Int)p->start;\n          p->start   = bottom;\n          p->offset += p->height - 1;\n        }\n\n        if ( Insert_Y_Turn( RAS_VARS bottom )  ||\n             Insert_Y_Turn( RAS_VARS top + 1 ) )\n          return FAILURE;\n\n        p = p->link;\n        n--;\n      }\n    }\n    else\n      ras.fProfile = NULL;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Split_Conic                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Subdivide one conic Bezier into two joint sub-arcs in the Bezier   */\n  /*    stack.                                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    None (subdivided Bezier is taken from the top of the stack).       */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This routine is the `beef' of this component.  It is  _the_ inner  */\n  /*    loop that should be optimized to hell to get the best performance. */\n  /*                                                                       */\n  static void\n  Split_Conic( TPoint*  base )\n  {\n    Long  a, b;\n\n\n    base[4].x = base[2].x;\n    b = base[1].x;\n    a = base[3].x = ( base[2].x + b ) / 2;\n    b = base[1].x = ( base[0].x + b ) / 2;\n    base[2].x = ( a + b ) / 2;\n\n    base[4].y = base[2].y;\n    b = base[1].y;\n    a = base[3].y = ( base[2].y + b ) / 2;\n    b = base[1].y = ( base[0].y + b ) / 2;\n    base[2].y = ( a + b ) / 2;\n\n    /* hand optimized.  gcc doesn't seem to be too good at common      */\n    /* expression substitution and instruction scheduling ;-)          */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Split_Cubic                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Subdivide a third-order Bezier arc into two joint sub-arcs in the  */\n  /*    Bezier stack.                                                      */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This routine is the `beef' of the component.  It is one of _the_   */\n  /*    inner loops that should be optimized like hell to get the best     */\n  /*    performance.                                                       */\n  /*                                                                       */\n  static void\n  Split_Cubic( TPoint*  base )\n  {\n    Long  a, b, c, d;\n\n\n    base[6].x = base[3].x;\n    c = base[1].x;\n    d = base[2].x;\n    base[1].x = a = ( base[0].x + c + 1 ) >> 1;\n    base[5].x = b = ( base[3].x + d + 1 ) >> 1;\n    c = ( c + d + 1 ) >> 1;\n    base[2].x = a = ( a + c + 1 ) >> 1;\n    base[4].x = b = ( b + c + 1 ) >> 1;\n    base[3].x = ( a + b + 1 ) >> 1;\n\n    base[6].y = base[3].y;\n    c = base[1].y;\n    d = base[2].y;\n    base[1].y = a = ( base[0].y + c + 1 ) >> 1;\n    base[5].y = b = ( base[3].y + d + 1 ) >> 1;\n    c = ( c + d + 1 ) >> 1;\n    base[2].y = a = ( a + c + 1 ) >> 1;\n    base[4].y = b = ( b + c + 1 ) >> 1;\n    base[3].y = ( a + b + 1 ) >> 1;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Line_Up                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the x-coordinates of an ascending line segment and store   */\n  /*    them in the render pool.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    x1   :: The x-coordinate of the segment's start point.             */\n  /*                                                                       */\n  /*    y1   :: The y-coordinate of the segment's start point.             */\n  /*                                                                       */\n  /*    x2   :: The x-coordinate of the segment's end point.               */\n  /*                                                                       */\n  /*    y2   :: The y-coordinate of the segment's end point.               */\n  /*                                                                       */\n  /*    miny :: A lower vertical clipping bound value.                     */\n  /*                                                                       */\n  /*    maxy :: An upper vertical clipping bound value.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on render pool overflow.               */\n  /*                                                                       */\n  static Bool\n  Line_Up( RAS_ARGS Long  x1,\n                    Long  y1,\n                    Long  x2,\n                    Long  y2,\n                    Long  miny,\n                    Long  maxy )\n  {\n    Long   Dx, Dy;\n    Int    e1, e2, f1, f2, size;     /* XXX: is `Short' sufficient? */\n    Long   Ix, Rx, Ax;\n\n    PLong  top;\n\n\n    Dx = x2 - x1;\n    Dy = y2 - y1;\n\n    if ( Dy <= 0 || y2 < miny || y1 > maxy )\n      return SUCCESS;\n\n    if ( y1 < miny )\n    {\n      /* Take care: miny-y1 can be a very large value; we use     */\n      /*            a slow MulDiv function to avoid clipping bugs */\n      x1 += SMulDiv( Dx, miny - y1, Dy );\n      e1  = (Int)TRUNC( miny );\n      f1  = 0;\n    }\n    else\n    {\n      e1 = (Int)TRUNC( y1 );\n      f1 = (Int)FRAC( y1 );\n    }\n\n    if ( y2 > maxy )\n    {\n      /* x2 += FMulDiv( Dx, maxy - y2, Dy );  UNNECESSARY */\n      e2  = (Int)TRUNC( maxy );\n      f2  = 0;\n    }\n    else\n    {\n      e2 = (Int)TRUNC( y2 );\n      f2 = (Int)FRAC( y2 );\n    }\n\n    if ( f1 > 0 )\n    {\n      if ( e1 == e2 )\n        return SUCCESS;\n      else\n      {\n        x1 += SMulDiv( Dx, ras.precision - f1, Dy );\n        e1 += 1;\n      }\n    }\n    else\n      if ( ras.joint )\n      {\n        ras.top--;\n        ras.joint = FALSE;\n      }\n\n    ras.joint = (char)( f2 == 0 );\n\n    if ( ras.fresh )\n    {\n      ras.cProfile->start = e1;\n      ras.fresh           = FALSE;\n    }\n\n    size = e2 - e1 + 1;\n    if ( ras.top + size >= ras.maxBuff )\n    {\n      ras.error = FT_THROW( Overflow );\n      return FAILURE;\n    }\n\n    if ( Dx > 0 )\n    {\n      Ix = SMulDiv_No_Round( ras.precision, Dx, Dy );\n      Rx = ( ras.precision * Dx ) % Dy;\n      Dx = 1;\n    }\n    else\n    {\n      Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy );\n      Rx = ( ras.precision * -Dx ) % Dy;\n      Dx = -1;\n    }\n\n    Ax  = -Dy;\n    top = ras.top;\n\n    while ( size > 0 )\n    {\n      *top++ = x1;\n\n      x1 += Ix;\n      Ax += Rx;\n      if ( Ax >= 0 )\n      {\n        Ax -= Dy;\n        x1 += Dx;\n      }\n      size--;\n    }\n\n    ras.top = top;\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Line_Down                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the x-coordinates of an descending line segment and store  */\n  /*    them in the render pool.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    x1   :: The x-coordinate of the segment's start point.             */\n  /*                                                                       */\n  /*    y1   :: The y-coordinate of the segment's start point.             */\n  /*                                                                       */\n  /*    x2   :: The x-coordinate of the segment's end point.               */\n  /*                                                                       */\n  /*    y2   :: The y-coordinate of the segment's end point.               */\n  /*                                                                       */\n  /*    miny :: A lower vertical clipping bound value.                     */\n  /*                                                                       */\n  /*    maxy :: An upper vertical clipping bound value.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on render pool overflow.               */\n  /*                                                                       */\n  static Bool\n  Line_Down( RAS_ARGS Long  x1,\n                      Long  y1,\n                      Long  x2,\n                      Long  y2,\n                      Long  miny,\n                      Long  maxy )\n  {\n    Bool  result, fresh;\n\n\n    fresh  = ras.fresh;\n\n    result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny );\n\n    if ( fresh && !ras.fresh )\n      ras.cProfile->start = -ras.cProfile->start;\n\n    return result;\n  }\n\n\n  /* A function type describing the functions used to split Bezier arcs */\n  typedef void  (*TSplitter)( TPoint*  base );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Bezier_Up                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the x-coordinates of an ascending Bezier arc and store     */\n  /*    them in the render pool.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */\n  /*                                                                       */\n  /*    splitter :: The function to split Bezier arcs.                     */\n  /*                                                                       */\n  /*    miny     :: A lower vertical clipping bound value.                 */\n  /*                                                                       */\n  /*    maxy     :: An upper vertical clipping bound value.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on render pool overflow.               */\n  /*                                                                       */\n  static Bool\n  Bezier_Up( RAS_ARGS Int        degree,\n                      TSplitter  splitter,\n                      Long       miny,\n                      Long       maxy )\n  {\n    Long   y1, y2, e, e2, e0;\n    Short  f1;\n\n    TPoint*  arc;\n    TPoint*  start_arc;\n\n    PLong top;\n\n\n    arc = ras.arc;\n    y1  = arc[degree].y;\n    y2  = arc[0].y;\n    top = ras.top;\n\n    if ( y2 < miny || y1 > maxy )\n      goto Fin;\n\n    e2 = FLOOR( y2 );\n\n    if ( e2 > maxy )\n      e2 = maxy;\n\n    e0 = miny;\n\n    if ( y1 < miny )\n      e = miny;\n    else\n    {\n      e  = CEILING( y1 );\n      f1 = (Short)( FRAC( y1 ) );\n      e0 = e;\n\n      if ( f1 == 0 )\n      {\n        if ( ras.joint )\n        {\n          top--;\n          ras.joint = FALSE;\n        }\n\n        *top++ = arc[degree].x;\n\n        e += ras.precision;\n      }\n    }\n\n    if ( ras.fresh )\n    {\n      ras.cProfile->start = TRUNC( e0 );\n      ras.fresh = FALSE;\n    }\n\n    if ( e2 < e )\n      goto Fin;\n\n    if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff )\n    {\n      ras.top   = top;\n      ras.error = FT_THROW( Overflow );\n      return FAILURE;\n    }\n\n    start_arc = arc;\n\n    while ( arc >= start_arc && e <= e2 )\n    {\n      ras.joint = FALSE;\n\n      y2 = arc[0].y;\n\n      if ( y2 > e )\n      {\n        y1 = arc[degree].y;\n        if ( y2 - y1 >= ras.precision_step )\n        {\n          splitter( arc );\n          arc += degree;\n        }\n        else\n        {\n          *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x,\n                                            e - y1, y2 - y1 );\n          arc -= degree;\n          e   += ras.precision;\n        }\n      }\n      else\n      {\n        if ( y2 == e )\n        {\n          ras.joint  = TRUE;\n          *top++     = arc[0].x;\n\n          e += ras.precision;\n        }\n        arc -= degree;\n      }\n    }\n\n  Fin:\n    ras.top  = top;\n    ras.arc -= degree;\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Bezier_Down                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Compute the x-coordinates of an descending Bezier arc and store    */\n  /*    them in the render pool.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */\n  /*                                                                       */\n  /*    splitter :: The function to split Bezier arcs.                     */\n  /*                                                                       */\n  /*    miny     :: A lower vertical clipping bound value.                 */\n  /*                                                                       */\n  /*    maxy     :: An upper vertical clipping bound value.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on render pool overflow.               */\n  /*                                                                       */\n  static Bool\n  Bezier_Down( RAS_ARGS Int        degree,\n                        TSplitter  splitter,\n                        Long       miny,\n                        Long       maxy )\n  {\n    TPoint*  arc = ras.arc;\n    Bool     result, fresh;\n\n\n    arc[0].y = -arc[0].y;\n    arc[1].y = -arc[1].y;\n    arc[2].y = -arc[2].y;\n    if ( degree > 2 )\n      arc[3].y = -arc[3].y;\n\n    fresh = ras.fresh;\n\n    result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny );\n\n    if ( fresh && !ras.fresh )\n      ras.cProfile->start = -ras.cProfile->start;\n\n    arc[0].y = -arc[0].y;\n    return result;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Line_To                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Inject a new line segment and adjust the Profiles list.            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*   x :: The x-coordinate of the segment's end point (its start point   */\n  /*        is stored in `lastX').                                         */\n  /*                                                                       */\n  /*   y :: The y-coordinate of the segment's end point (its start point   */\n  /*        is stored in `lastY').                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */\n  /*   profile.                                                            */\n  /*                                                                       */\n  static Bool\n  Line_To( RAS_ARGS Long  x,\n                    Long  y )\n  {\n    /* First, detect a change of direction */\n\n    switch ( ras.state )\n    {\n    case Unknown_State:\n      if ( y > ras.lastY )\n      {\n        if ( New_Profile( RAS_VARS Ascending_State,\n                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )\n          return FAILURE;\n      }\n      else\n      {\n        if ( y < ras.lastY )\n          if ( New_Profile( RAS_VARS Descending_State,\n                                     IS_TOP_OVERSHOOT( ras.lastY ) ) )\n            return FAILURE;\n      }\n      break;\n\n    case Ascending_State:\n      if ( y < ras.lastY )\n      {\n        if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) ||\n             New_Profile( RAS_VARS Descending_State,\n                                   IS_TOP_OVERSHOOT( ras.lastY ) ) )\n          return FAILURE;\n      }\n      break;\n\n    case Descending_State:\n      if ( y > ras.lastY )\n      {\n        if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ||\n             New_Profile( RAS_VARS Ascending_State,\n                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )\n          return FAILURE;\n      }\n      break;\n\n    default:\n      ;\n    }\n\n    /* Then compute the lines */\n\n    switch ( ras.state )\n    {\n    case Ascending_State:\n      if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,\n                             x, y, ras.minY, ras.maxY ) )\n        return FAILURE;\n      break;\n\n    case Descending_State:\n      if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,\n                               x, y, ras.minY, ras.maxY ) )\n        return FAILURE;\n      break;\n\n    default:\n      ;\n    }\n\n    ras.lastX = x;\n    ras.lastY = y;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Conic_To                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Inject a new conic arc and adjust the profile list.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*   cx :: The x-coordinate of the arc's new control point.              */\n  /*                                                                       */\n  /*   cy :: The y-coordinate of the arc's new control point.              */\n  /*                                                                       */\n  /*   x  :: The x-coordinate of the arc's end point (its start point is   */\n  /*         stored in `lastX').                                           */\n  /*                                                                       */\n  /*   y  :: The y-coordinate of the arc's end point (its start point is   */\n  /*         stored in `lastY').                                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */\n  /*   profile.                                                            */\n  /*                                                                       */\n  static Bool\n  Conic_To( RAS_ARGS Long  cx,\n                     Long  cy,\n                     Long  x,\n                     Long  y )\n  {\n    Long     y1, y2, y3, x3, ymin, ymax;\n    TStates  state_bez;\n\n\n    ras.arc      = ras.arcs;\n    ras.arc[2].x = ras.lastX;\n    ras.arc[2].y = ras.lastY;\n    ras.arc[1].x = cx;\n    ras.arc[1].y = cy;\n    ras.arc[0].x = x;\n    ras.arc[0].y = y;\n\n    do\n    {\n      y1 = ras.arc[2].y;\n      y2 = ras.arc[1].y;\n      y3 = ras.arc[0].y;\n      x3 = ras.arc[0].x;\n\n      /* first, categorize the Bezier arc */\n\n      if ( y1 <= y3 )\n      {\n        ymin = y1;\n        ymax = y3;\n      }\n      else\n      {\n        ymin = y3;\n        ymax = y1;\n      }\n\n      if ( y2 < ymin || y2 > ymax )\n      {\n        /* this arc has no given direction, split it! */\n        Split_Conic( ras.arc );\n        ras.arc += 2;\n      }\n      else if ( y1 == y3 )\n      {\n        /* this arc is flat, ignore it and pop it from the Bezier stack */\n        ras.arc -= 2;\n      }\n      else\n      {\n        /* the arc is y-monotonous, either ascending or descending */\n        /* detect a change of direction                            */\n        state_bez = y1 < y3 ? Ascending_State : Descending_State;\n        if ( ras.state != state_bez )\n        {\n          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )\n                                                 : IS_TOP_OVERSHOOT( y1 );\n\n\n          /* finalize current profile if any */\n          if ( ras.state != Unknown_State &&\n               End_Profile( RAS_VARS o )  )\n            goto Fail;\n\n          /* create a new profile */\n          if ( New_Profile( RAS_VARS state_bez, o ) )\n            goto Fail;\n        }\n\n        /* now call the appropriate routine */\n        if ( state_bez == Ascending_State )\n        {\n          if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )\n            goto Fail;\n        }\n        else\n          if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )\n            goto Fail;\n      }\n\n    } while ( ras.arc >= ras.arcs );\n\n    ras.lastX = x3;\n    ras.lastY = y3;\n\n    return SUCCESS;\n\n  Fail:\n    return FAILURE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Cubic_To                                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Inject a new cubic arc and adjust the profile list.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*   cx1 :: The x-coordinate of the arc's first new control point.       */\n  /*                                                                       */\n  /*   cy1 :: The y-coordinate of the arc's first new control point.       */\n  /*                                                                       */\n  /*   cx2 :: The x-coordinate of the arc's second new control point.      */\n  /*                                                                       */\n  /*   cy2 :: The y-coordinate of the arc's second new control point.      */\n  /*                                                                       */\n  /*   x   :: The x-coordinate of the arc's end point (its start point is  */\n  /*          stored in `lastX').                                          */\n  /*                                                                       */\n  /*   y   :: The y-coordinate of the arc's end point (its start point is  */\n  /*          stored in `lastY').                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */\n  /*   profile.                                                            */\n  /*                                                                       */\n  static Bool\n  Cubic_To( RAS_ARGS Long  cx1,\n                     Long  cy1,\n                     Long  cx2,\n                     Long  cy2,\n                     Long  x,\n                     Long  y )\n  {\n    Long     y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;\n    TStates  state_bez;\n\n\n    ras.arc      = ras.arcs;\n    ras.arc[3].x = ras.lastX;\n    ras.arc[3].y = ras.lastY;\n    ras.arc[2].x = cx1;\n    ras.arc[2].y = cy1;\n    ras.arc[1].x = cx2;\n    ras.arc[1].y = cy2;\n    ras.arc[0].x = x;\n    ras.arc[0].y = y;\n\n    do\n    {\n      y1 = ras.arc[3].y;\n      y2 = ras.arc[2].y;\n      y3 = ras.arc[1].y;\n      y4 = ras.arc[0].y;\n      x4 = ras.arc[0].x;\n\n      /* first, categorize the Bezier arc */\n\n      if ( y1 <= y4 )\n      {\n        ymin1 = y1;\n        ymax1 = y4;\n      }\n      else\n      {\n        ymin1 = y4;\n        ymax1 = y1;\n      }\n\n      if ( y2 <= y3 )\n      {\n        ymin2 = y2;\n        ymax2 = y3;\n      }\n      else\n      {\n        ymin2 = y3;\n        ymax2 = y2;\n      }\n\n      if ( ymin2 < ymin1 || ymax2 > ymax1 )\n      {\n        /* this arc has no given direction, split it! */\n        Split_Cubic( ras.arc );\n        ras.arc += 3;\n      }\n      else if ( y1 == y4 )\n      {\n        /* this arc is flat, ignore it and pop it from the Bezier stack */\n        ras.arc -= 3;\n      }\n      else\n      {\n        state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;\n\n        /* detect a change of direction */\n        if ( ras.state != state_bez )\n        {\n          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )\n                                                 : IS_TOP_OVERSHOOT( y1 );\n\n\n          /* finalize current profile if any */\n          if ( ras.state != Unknown_State &&\n               End_Profile( RAS_VARS o )  )\n            goto Fail;\n\n          if ( New_Profile( RAS_VARS state_bez, o ) )\n            goto Fail;\n        }\n\n        /* compute intersections */\n        if ( state_bez == Ascending_State )\n        {\n          if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )\n            goto Fail;\n        }\n        else\n          if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )\n            goto Fail;\n      }\n\n    } while ( ras.arc >= ras.arcs );\n\n    ras.lastX = x4;\n    ras.lastY = y4;\n\n    return SUCCESS;\n\n  Fail:\n    return FAILURE;\n  }\n\n\n#undef  SWAP_\n#define SWAP_( x, y )  do                \\\n                       {                 \\\n                         Long  swap = x; \\\n                                         \\\n                                         \\\n                         x = y;          \\\n                         y = swap;       \\\n                       } while ( 0 )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Decompose_Curve                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Scan the outline arrays in order to emit individual segments and   */\n  /*    Beziers by calling Line_To() and Bezier_To().  It handles all      */\n  /*    weird cases, like when the first point is off the curve, or when   */\n  /*    there are simply no `on' points in the contour!                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    first   :: The index of the first point in the contour.            */\n  /*                                                                       */\n  /*    last    :: The index of the last point in the contour.             */\n  /*                                                                       */\n  /*    flipped :: If set, flip the direction of the curve.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE on error.                              */\n  /*                                                                       */\n  static Bool\n  Decompose_Curve( RAS_ARGS UShort  first,\n                            UShort  last,\n                            int     flipped )\n  {\n    FT_Vector   v_last;\n    FT_Vector   v_control;\n    FT_Vector   v_start;\n\n    FT_Vector*  points;\n    FT_Vector*  point;\n    FT_Vector*  limit;\n    char*       tags;\n\n    unsigned    tag;       /* current point's state           */\n\n\n    points = ras.outline.points;\n    limit  = points + last;\n\n    v_start.x = SCALED( points[first].x );\n    v_start.y = SCALED( points[first].y );\n    v_last.x  = SCALED( points[last].x );\n    v_last.y  = SCALED( points[last].y );\n\n    if ( flipped )\n    {\n      SWAP_( v_start.x, v_start.y );\n      SWAP_( v_last.x, v_last.y );\n    }\n\n    v_control = v_start;\n\n    point = points + first;\n    tags  = ras.outline.tags + first;\n\n    /* set scan mode if necessary */\n    if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE )\n      ras.dropOutControl = (Byte)tags[0] >> 5;\n\n    tag = FT_CURVE_TAG( tags[0] );\n\n    /* A contour cannot start with a cubic control point! */\n    if ( tag == FT_CURVE_TAG_CUBIC )\n      goto Invalid_Outline;\n\n    /* check first point to determine origin */\n    if ( tag == FT_CURVE_TAG_CONIC )\n    {\n      /* first point is conic control.  Yes, this happens. */\n      if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON )\n      {\n        /* start at last point if it is on the curve */\n        v_start = v_last;\n        limit--;\n      }\n      else\n      {\n        /* if both first and last points are conic,         */\n        /* start at their middle and record its position    */\n        /* for closure                                      */\n        v_start.x = ( v_start.x + v_last.x ) / 2;\n        v_start.y = ( v_start.y + v_last.y ) / 2;\n\n        v_last = v_start;\n      }\n      point--;\n      tags--;\n    }\n\n    ras.lastX = v_start.x;\n    ras.lastY = v_start.y;\n\n    while ( point < limit )\n    {\n      point++;\n      tags++;\n\n      tag = FT_CURVE_TAG( tags[0] );\n\n      switch ( tag )\n      {\n      case FT_CURVE_TAG_ON:  /* emit a single line_to */\n        {\n          Long  x, y;\n\n\n          x = SCALED( point->x );\n          y = SCALED( point->y );\n          if ( flipped )\n            SWAP_( x, y );\n\n          if ( Line_To( RAS_VARS x, y ) )\n            goto Fail;\n          continue;\n        }\n\n      case FT_CURVE_TAG_CONIC:  /* consume conic arcs */\n        v_control.x = SCALED( point[0].x );\n        v_control.y = SCALED( point[0].y );\n\n        if ( flipped )\n          SWAP_( v_control.x, v_control.y );\n\n      Do_Conic:\n        if ( point < limit )\n        {\n          FT_Vector  v_middle;\n          Long       x, y;\n\n\n          point++;\n          tags++;\n          tag = FT_CURVE_TAG( tags[0] );\n\n          x = SCALED( point[0].x );\n          y = SCALED( point[0].y );\n\n          if ( flipped )\n            SWAP_( x, y );\n\n          if ( tag == FT_CURVE_TAG_ON )\n          {\n            if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) )\n              goto Fail;\n            continue;\n          }\n\n          if ( tag != FT_CURVE_TAG_CONIC )\n            goto Invalid_Outline;\n\n          v_middle.x = ( v_control.x + x ) / 2;\n          v_middle.y = ( v_control.y + y ) / 2;\n\n          if ( Conic_To( RAS_VARS v_control.x, v_control.y,\n                                  v_middle.x,  v_middle.y ) )\n            goto Fail;\n\n          v_control.x = x;\n          v_control.y = y;\n\n          goto Do_Conic;\n        }\n\n        if ( Conic_To( RAS_VARS v_control.x, v_control.y,\n                                v_start.x,   v_start.y ) )\n          goto Fail;\n\n        goto Close;\n\n      default:  /* FT_CURVE_TAG_CUBIC */\n        {\n          Long  x1, y1, x2, y2, x3, y3;\n\n\n          if ( point + 1 > limit                             ||\n               FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )\n            goto Invalid_Outline;\n\n          point += 2;\n          tags  += 2;\n\n          x1 = SCALED( point[-2].x );\n          y1 = SCALED( point[-2].y );\n          x2 = SCALED( point[-1].x );\n          y2 = SCALED( point[-1].y );\n\n          if ( flipped )\n          {\n            SWAP_( x1, y1 );\n            SWAP_( x2, y2 );\n          }\n\n          if ( point <= limit )\n          {\n            x3 = SCALED( point[0].x );\n            y3 = SCALED( point[0].y );\n\n            if ( flipped )\n              SWAP_( x3, y3 );\n\n            if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) )\n              goto Fail;\n            continue;\n          }\n\n          if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) )\n            goto Fail;\n          goto Close;\n        }\n      }\n    }\n\n    /* close the contour with a line segment */\n    if ( Line_To( RAS_VARS v_start.x, v_start.y ) )\n      goto Fail;\n\n  Close:\n    return SUCCESS;\n\n  Invalid_Outline:\n    ras.error = FT_THROW( Invalid );\n\n  Fail:\n    return FAILURE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Convert_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Convert a glyph into a series of segments and arcs and make a      */\n  /*    profiles list with them.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    flipped :: If set, flip the direction of curve.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS on success, FAILURE if any error was encountered during    */\n  /*    rendering.                                                         */\n  /*                                                                       */\n  static Bool\n  Convert_Glyph( RAS_ARGS int  flipped )\n  {\n    int       i;\n    unsigned  start;\n\n    PProfile  lastProfile;\n\n\n    ras.fProfile = NULL;\n    ras.joint    = FALSE;\n    ras.fresh    = FALSE;\n\n    ras.maxBuff  = ras.sizeBuff - AlignProfileSize;\n\n    ras.numTurns = 0;\n\n    ras.cProfile         = (PProfile)ras.top;\n    ras.cProfile->offset = ras.top;\n    ras.num_Profs        = 0;\n\n    start = 0;\n\n    for ( i = 0; i < ras.outline.n_contours; i++ )\n    {\n      Bool  o;\n\n\n      ras.state    = Unknown_State;\n      ras.gProfile = NULL;\n\n      if ( Decompose_Curve( RAS_VARS (unsigned short)start,\n                                     ras.outline.contours[i],\n                                     flipped ) )\n        return FAILURE;\n\n      start = ras.outline.contours[i] + 1;\n\n      /* we must now check whether the extreme arcs join or not */\n      if ( FRAC( ras.lastY ) == 0 &&\n           ras.lastY >= ras.minY  &&\n           ras.lastY <= ras.maxY  )\n        if ( ras.gProfile                        &&\n             ( ras.gProfile->flags & Flow_Up ) ==\n               ( ras.cProfile->flags & Flow_Up ) )\n          ras.top--;\n        /* Note that ras.gProfile can be nil if the contour was too small */\n        /* to be drawn.                                                   */\n\n      lastProfile = ras.cProfile;\n      if ( ras.cProfile->flags & Flow_Up )\n        o = IS_TOP_OVERSHOOT( ras.lastY );\n      else\n        o = IS_BOTTOM_OVERSHOOT( ras.lastY );\n      if ( End_Profile( RAS_VARS o ) )\n        return FAILURE;\n\n      /* close the `next profile in contour' linked list */\n      if ( ras.gProfile )\n        lastProfile->next = ras.gProfile;\n    }\n\n    if ( Finalize_Profile_Table( RAS_VAR ) )\n      return FAILURE;\n\n    return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE );\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /**                                                                     **/\n  /**  SCAN-LINE SWEEPS AND DRAWING                                       **/\n  /**                                                                     **/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Init_Linked                                                          */\n  /*                                                                       */\n  /*    Initializes an empty linked list.                                  */\n  /*                                                                       */\n  static void\n  Init_Linked( TProfileList*  l )\n  {\n    *l = NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  InsNew                                                               */\n  /*                                                                       */\n  /*    Inserts a new profile in a linked list.                            */\n  /*                                                                       */\n  static void\n  InsNew( PProfileList  list,\n          PProfile      profile )\n  {\n    PProfile  *old, current;\n    Long       x;\n\n\n    old     = list;\n    current = *old;\n    x       = profile->X;\n\n    while ( current )\n    {\n      if ( x < current->X )\n        break;\n      old     = &current->link;\n      current = *old;\n    }\n\n    profile->link = current;\n    *old          = profile;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  DelOld                                                               */\n  /*                                                                       */\n  /*    Removes an old profile from a linked list.                         */\n  /*                                                                       */\n  static void\n  DelOld( PProfileList  list,\n          PProfile      profile )\n  {\n    PProfile  *old, current;\n\n\n    old     = list;\n    current = *old;\n\n    while ( current )\n    {\n      if ( current == profile )\n      {\n        *old = current->link;\n        return;\n      }\n\n      old     = &current->link;\n      current = *old;\n    }\n\n    /* we should never get there, unless the profile was not part of */\n    /* the list.                                                     */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Sort                                                                 */\n  /*                                                                       */\n  /*    Sorts a trace list.  In 95%, the list is already sorted.  We need  */\n  /*    an algorithm which is fast in this case.  Bubble sort is enough    */\n  /*    and simple.                                                        */\n  /*                                                                       */\n  static void\n  Sort( PProfileList  list )\n  {\n    PProfile  *old, current, next;\n\n\n    /* First, set the new X coordinate of each profile */\n    current = *list;\n    while ( current )\n    {\n      current->X       = *current->offset;\n      current->offset += current->flags & Flow_Up ? 1 : -1;\n      current->height--;\n      current = current->link;\n    }\n\n    /* Then sort them */\n    old     = list;\n    current = *old;\n\n    if ( !current )\n      return;\n\n    next = current->link;\n\n    while ( next )\n    {\n      if ( current->X <= next->X )\n      {\n        old     = &current->link;\n        current = *old;\n\n        if ( !current )\n          return;\n      }\n      else\n      {\n        *old          = next;\n        current->link = next->link;\n        next->link    = current;\n\n        old     = list;\n        current = *old;\n      }\n\n      next = current->link;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Vertical Sweep Procedure Set                                         */\n  /*                                                                       */\n  /*  These four routines are used during the vertical black/white sweep   */\n  /*  phase by the generic Draw_Sweep() function.                          */\n  /*                                                                       */\n  /*************************************************************************/\n\n  static void\n  Vertical_Sweep_Init( RAS_ARGS Short*  min,\n                                Short*  max )\n  {\n    Long  pitch = ras.target.pitch;\n\n    FT_UNUSED( max );\n\n\n    ras.traceIncr = (Short)-pitch;\n    ras.traceOfs  = -*min * pitch;\n    if ( pitch > 0 )\n      ras.traceOfs += ( ras.target.rows - 1 ) * pitch;\n\n    ras.gray_min_x = 0;\n    ras.gray_max_x = 0;\n  }\n\n\n  static void\n  Vertical_Sweep_Span( RAS_ARGS Short       y,\n                                FT_F26Dot6  x1,\n                                FT_F26Dot6  x2,\n                                PProfile    left,\n                                PProfile    right )\n  {\n    Long   e1, e2;\n    int    c1, c2;\n    Byte   f1, f2;\n    Byte*  target;\n\n    FT_UNUSED( y );\n    FT_UNUSED( left );\n    FT_UNUSED( right );\n\n\n    /* Drop-out control */\n\n    e1 = TRUNC( CEILING( x1 ) );\n\n    if ( x2 - x1 - ras.precision <= ras.precision_jitter )\n      e2 = e1;\n    else\n      e2 = TRUNC( FLOOR( x2 ) );\n\n    if ( e2 >= 0 && e1 < ras.bWidth )\n    {\n      if ( e1 < 0 )\n        e1 = 0;\n      if ( e2 >= ras.bWidth )\n        e2 = ras.bWidth - 1;\n\n      c1 = (Short)( e1 >> 3 );\n      c2 = (Short)( e2 >> 3 );\n\n      f1 = (Byte)  ( 0xFF >> ( e1 & 7 ) );\n      f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) );\n\n      if ( ras.gray_min_x > c1 )\n        ras.gray_min_x = (short)c1;\n      if ( ras.gray_max_x < c2 )\n        ras.gray_max_x = (short)c2;\n\n      target = ras.bTarget + ras.traceOfs + c1;\n      c2 -= c1;\n\n      if ( c2 > 0 )\n      {\n        target[0] |= f1;\n\n        /* memset() is slower than the following code on many platforms. */\n        /* This is due to the fact that, in the vast majority of cases,  */\n        /* the span length in bytes is relatively small.                 */\n        c2--;\n        while ( c2 > 0 )\n        {\n          *(++target) = 0xFF;\n          c2--;\n        }\n        target[1] |= f2;\n      }\n      else\n        *target |= ( f1 & f2 );\n    }\n  }\n\n\n  static void\n  Vertical_Sweep_Drop( RAS_ARGS Short       y,\n                                FT_F26Dot6  x1,\n                                FT_F26Dot6  x2,\n                                PProfile    left,\n                                PProfile    right )\n  {\n    Long   e1, e2, pxl;\n    Short  c1, f1;\n\n\n    /* Drop-out control */\n\n    /*   e2            x2                    x1           e1   */\n    /*                                                         */\n    /*                 ^                     |                 */\n    /*                 |                     |                 */\n    /*   +-------------+---------------------+------------+    */\n    /*                 |                     |                 */\n    /*                 |                     v                 */\n    /*                                                         */\n    /* pixel         contour              contour       pixel  */\n    /* center                                           center */\n\n    /* drop-out mode    scan conversion rules (as defined in OpenType) */\n    /* --------------------------------------------------------------- */\n    /*  0                1, 2, 3                                       */\n    /*  1                1, 2, 4                                       */\n    /*  2                1, 2                                          */\n    /*  3                same as mode 2                                */\n    /*  4                1, 2, 5                                       */\n    /*  5                1, 2, 6                                       */\n    /*  6, 7             same as mode 2                                */\n\n    e1  = CEILING( x1 );\n    e2  = FLOOR  ( x2 );\n    pxl = e1;\n\n    if ( e1 > e2 )\n    {\n      Int  dropOutControl = left->flags & 7;\n\n\n      if ( e1 == e2 + ras.precision )\n      {\n        switch ( dropOutControl )\n        {\n        case 0: /* simple drop-outs including stubs */\n          pxl = e2;\n          break;\n\n        case 4: /* smart drop-outs including stubs */\n          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        case 1: /* simple drop-outs excluding stubs */\n        case 5: /* smart drop-outs excluding stubs  */\n\n          /* Drop-out Control Rules #4 and #6 */\n\n          /* The specification neither provides an exact definition */\n          /* of a `stub' nor gives exact rules to exclude them.     */\n          /*                                                        */\n          /* Here the constraints we use to recognize a stub.       */\n          /*                                                        */\n          /*  upper stub:                                           */\n          /*                                                        */\n          /*   - P_Left and P_Right are in the same contour         */\n          /*   - P_Right is the successor of P_Left in that contour */\n          /*   - y is the top of P_Left and P_Right                 */\n          /*                                                        */\n          /*  lower stub:                                           */\n          /*                                                        */\n          /*   - P_Left and P_Right are in the same contour         */\n          /*   - P_Left is the successor of P_Right in that contour */\n          /*   - y is the bottom of P_Left                          */\n          /*                                                        */\n          /* We draw a stub if the following constraints are met.   */\n          /*                                                        */\n          /*   - for an upper or lower stub, there is top or bottom */\n          /*     overshoot, respectively                            */\n          /*   - the covered interval is greater or equal to a half */\n          /*     pixel                                              */\n\n          /* upper stub test */\n          if ( left->next == right                &&\n               left->height <= 0                  &&\n               !( left->flags & Overshoot_Top   &&\n                  x2 - x1 >= ras.precision_half ) )\n            return;\n\n          /* lower stub test */\n          if ( right->next == left                 &&\n               left->start == y                    &&\n               !( left->flags & Overshoot_Bottom &&\n                  x2 - x1 >= ras.precision_half  ) )\n            return;\n\n          if ( dropOutControl == 1 )\n            pxl = e2;\n          else\n            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        default: /* modes 2, 3, 6, 7 */\n          return;  /* no drop-out control */\n        }\n\n        /* undocumented but confirmed: If the drop-out would result in a  */\n        /* pixel outside of the bounding box, use the pixel inside of the */\n        /* bounding box instead                                           */\n        if ( pxl < 0 )\n          pxl = e1;\n        else if ( TRUNC( pxl ) >= ras.bWidth )\n          pxl = e2;\n\n        /* check that the other pixel isn't set */\n        e1 = pxl == e1 ? e2 : e1;\n\n        e1 = TRUNC( e1 );\n\n        c1 = (Short)( e1 >> 3 );\n        f1 = (Short)( e1 &  7 );\n\n        if ( e1 >= 0 && e1 < ras.bWidth                      &&\n             ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) )\n          return;\n      }\n      else\n        return;\n    }\n\n    e1 = TRUNC( pxl );\n\n    if ( e1 >= 0 && e1 < ras.bWidth )\n    {\n      c1 = (Short)( e1 >> 3 );\n      f1 = (Short)( e1 & 7 );\n\n      if ( ras.gray_min_x > c1 )\n        ras.gray_min_x = c1;\n      if ( ras.gray_max_x < c1 )\n        ras.gray_max_x = c1;\n\n      ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 );\n    }\n  }\n\n\n  static void\n  Vertical_Sweep_Step( RAS_ARG )\n  {\n    ras.traceOfs += ras.traceIncr;\n  }\n\n\n  /***********************************************************************/\n  /*                                                                     */\n  /*  Horizontal Sweep Procedure Set                                     */\n  /*                                                                     */\n  /*  These four routines are used during the horizontal black/white     */\n  /*  sweep phase by the generic Draw_Sweep() function.                  */\n  /*                                                                     */\n  /***********************************************************************/\n\n  static void\n  Horizontal_Sweep_Init( RAS_ARGS Short*  min,\n                                  Short*  max )\n  {\n    /* nothing, really */\n    FT_UNUSED_RASTER;\n    FT_UNUSED( min );\n    FT_UNUSED( max );\n  }\n\n\n  static void\n  Horizontal_Sweep_Span( RAS_ARGS Short       y,\n                                  FT_F26Dot6  x1,\n                                  FT_F26Dot6  x2,\n                                  PProfile    left,\n                                  PProfile    right )\n  {\n    Long   e1, e2;\n    PByte  bits;\n    Byte   f1;\n\n    FT_UNUSED( left );\n    FT_UNUSED( right );\n\n\n    if ( x2 - x1 < ras.precision )\n    {\n      e1 = CEILING( x1 );\n      e2 = FLOOR  ( x2 );\n\n      if ( e1 == e2 )\n      {\n        bits = ras.bTarget + ( y >> 3 );\n        f1   = (Byte)( 0x80 >> ( y & 7 ) );\n\n        e1 = TRUNC( e1 );\n\n        if ( e1 >= 0 && e1 < ras.target.rows )\n        {\n          PByte  p;\n\n\n          p = bits - e1 * ras.target.pitch;\n          if ( ras.target.pitch > 0 )\n            p += ( ras.target.rows - 1 ) * ras.target.pitch;\n\n          p[0] |= f1;\n        }\n      }\n    }\n  }\n\n\n  static void\n  Horizontal_Sweep_Drop( RAS_ARGS Short       y,\n                                  FT_F26Dot6  x1,\n                                  FT_F26Dot6  x2,\n                                  PProfile    left,\n                                  PProfile    right )\n  {\n    Long   e1, e2, pxl;\n    PByte  bits;\n    Byte   f1;\n\n\n    /* During the horizontal sweep, we only take care of drop-outs */\n\n    /* e1     +       <-- pixel center */\n    /*        |                        */\n    /* x1  ---+-->    <-- contour      */\n    /*        |                        */\n    /*        |                        */\n    /* x2  <--+---    <-- contour      */\n    /*        |                        */\n    /*        |                        */\n    /* e2     +       <-- pixel center */\n\n    e1  = CEILING( x1 );\n    e2  = FLOOR  ( x2 );\n    pxl = e1;\n\n    if ( e1 > e2 )\n    {\n      Int  dropOutControl = left->flags & 7;\n\n\n      if ( e1 == e2 + ras.precision )\n      {\n        switch ( dropOutControl )\n        {\n        case 0: /* simple drop-outs including stubs */\n          pxl = e2;\n          break;\n\n        case 4: /* smart drop-outs including stubs */\n          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        case 1: /* simple drop-outs excluding stubs */\n        case 5: /* smart drop-outs excluding stubs  */\n          /* see Vertical_Sweep_Drop for details */\n\n          /* rightmost stub test */\n          if ( left->next == right                &&\n               left->height <= 0                  &&\n               !( left->flags & Overshoot_Top   &&\n                  x2 - x1 >= ras.precision_half ) )\n            return;\n\n          /* leftmost stub test */\n          if ( right->next == left                 &&\n               left->start == y                    &&\n               !( left->flags & Overshoot_Bottom &&\n                  x2 - x1 >= ras.precision_half  ) )\n            return;\n\n          if ( dropOutControl == 1 )\n            pxl = e2;\n          else\n            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        default: /* modes 2, 3, 6, 7 */\n          return;  /* no drop-out control */\n        }\n\n        /* undocumented but confirmed: If the drop-out would result in a  */\n        /* pixel outside of the bounding box, use the pixel inside of the */\n        /* bounding box instead                                           */\n        if ( pxl < 0 )\n          pxl = e1;\n        else if ( TRUNC( pxl ) >= ras.target.rows )\n          pxl = e2;\n\n        /* check that the other pixel isn't set */\n        e1 = pxl == e1 ? e2 : e1;\n\n        e1 = TRUNC( e1 );\n\n        bits = ras.bTarget + ( y >> 3 );\n        f1   = (Byte)( 0x80 >> ( y & 7 ) );\n\n        bits -= e1 * ras.target.pitch;\n        if ( ras.target.pitch > 0 )\n          bits += ( ras.target.rows - 1 ) * ras.target.pitch;\n\n        if ( e1 >= 0              &&\n             e1 < ras.target.rows &&\n             *bits & f1           )\n          return;\n      }\n      else\n        return;\n    }\n\n    bits = ras.bTarget + ( y >> 3 );\n    f1   = (Byte)( 0x80 >> ( y & 7 ) );\n\n    e1 = TRUNC( pxl );\n\n    if ( e1 >= 0 && e1 < ras.target.rows )\n    {\n      bits -= e1 * ras.target.pitch;\n      if ( ras.target.pitch > 0 )\n        bits += ( ras.target.rows - 1 ) * ras.target.pitch;\n\n      bits[0] |= f1;\n    }\n  }\n\n\n  static void\n  Horizontal_Sweep_Step( RAS_ARG )\n  {\n    /* Nothing, really */\n    FT_UNUSED_RASTER;\n  }\n\n\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Vertical Gray Sweep Procedure Set                                    */\n  /*                                                                       */\n  /*  These two routines are used during the vertical gray-levels sweep    */\n  /*  phase by the generic Draw_Sweep() function.                          */\n  /*                                                                       */\n  /*  NOTES                                                                */\n  /*                                                                       */\n  /*  - The target pixmap's width *must* be a multiple of 4.               */\n  /*                                                                       */\n  /*  - You have to use the function Vertical_Sweep_Span() for the gray    */\n  /*    span call.                                                         */\n  /*                                                                       */\n  /*************************************************************************/\n\n  static void\n  Vertical_Gray_Sweep_Init( RAS_ARGS Short*  min,\n                                     Short*  max )\n  {\n    Long  pitch, byte_len;\n\n\n    *min = *min & -2;\n    *max = ( *max + 3 ) & -2;\n\n    ras.traceOfs  = 0;\n    pitch         = ras.target.pitch;\n    byte_len      = -pitch;\n    ras.traceIncr = (Short)byte_len;\n    ras.traceG    = ( *min / 2 ) * byte_len;\n\n    if ( pitch > 0 )\n    {\n      ras.traceG += ( ras.target.rows - 1 ) * pitch;\n      byte_len    = -byte_len;\n    }\n\n    ras.gray_min_x =  (Short)byte_len;\n    ras.gray_max_x = -(Short)byte_len;\n  }\n\n\n  static void\n  Vertical_Gray_Sweep_Step( RAS_ARG )\n  {\n    Int     c1, c2;\n    PByte   pix, bit, bit2;\n    short*  count = (short*)count_table;\n    Byte*   grays;\n\n\n    ras.traceOfs += ras.gray_width;\n\n    if ( ras.traceOfs > ras.gray_width )\n    {\n      pix   = ras.gTarget + ras.traceG + ras.gray_min_x * 4;\n      grays = ras.grays;\n\n      if ( ras.gray_max_x >= 0 )\n      {\n        Long  last_pixel = ras.target.width - 1;\n        Int   last_cell  = last_pixel >> 2;\n        Int   last_bit   = last_pixel & 3;\n        Bool  over       = 0;\n\n\n        if ( ras.gray_max_x >= last_cell && last_bit != 3 )\n        {\n          ras.gray_max_x = last_cell - 1;\n          over = 1;\n        }\n\n        if ( ras.gray_min_x < 0 )\n          ras.gray_min_x = 0;\n\n        bit  = ras.bTarget + ras.gray_min_x;\n        bit2 = bit + ras.gray_width;\n\n        c1 = ras.gray_max_x - ras.gray_min_x;\n\n        while ( c1 >= 0 )\n        {\n          c2 = count[*bit] + count[*bit2];\n\n          if ( c2 )\n          {\n            pix[0] = grays[(c2 >> 12) & 0x000F];\n            pix[1] = grays[(c2 >> 8 ) & 0x000F];\n            pix[2] = grays[(c2 >> 4 ) & 0x000F];\n            pix[3] = grays[ c2        & 0x000F];\n\n            *bit  = 0;\n            *bit2 = 0;\n          }\n\n          bit++;\n          bit2++;\n          pix += 4;\n          c1--;\n        }\n\n        if ( over )\n        {\n          c2 = count[*bit] + count[*bit2];\n          if ( c2 )\n          {\n            switch ( last_bit )\n            {\n            case 2:\n              pix[2] = grays[(c2 >> 4 ) & 0x000F];\n            case 1:\n              pix[1] = grays[(c2 >> 8 ) & 0x000F];\n            default:\n              pix[0] = grays[(c2 >> 12) & 0x000F];\n            }\n\n            *bit  = 0;\n            *bit2 = 0;\n          }\n        }\n      }\n\n      ras.traceOfs = 0;\n      ras.traceG  += ras.traceIncr;\n\n      ras.gray_min_x =  32000;\n      ras.gray_max_x = -32000;\n    }\n  }\n\n\n  static void\n  Horizontal_Gray_Sweep_Span( RAS_ARGS Short       y,\n                                       FT_F26Dot6  x1,\n                                       FT_F26Dot6  x2,\n                                       PProfile    left,\n                                       PProfile    right )\n  {\n    /* nothing, really */\n    FT_UNUSED_RASTER;\n    FT_UNUSED( y );\n    FT_UNUSED( x1 );\n    FT_UNUSED( x2 );\n    FT_UNUSED( left );\n    FT_UNUSED( right );\n  }\n\n\n  static void\n  Horizontal_Gray_Sweep_Drop( RAS_ARGS Short       y,\n                                       FT_F26Dot6  x1,\n                                       FT_F26Dot6  x2,\n                                       PProfile    left,\n                                       PProfile    right )\n  {\n    Long   e1, e2;\n    PByte  pixel;\n    Byte   color;\n\n\n    /* During the horizontal sweep, we only take care of drop-outs */\n\n    e1 = CEILING( x1 );\n    e2 = FLOOR  ( x2 );\n\n    if ( e1 > e2 )\n    {\n      Int  dropOutControl = left->flags & 7;\n\n\n      if ( e1 == e2 + ras.precision )\n      {\n        switch ( dropOutControl )\n        {\n        case 0: /* simple drop-outs including stubs */\n          e1 = e2;\n          break;\n\n        case 4: /* smart drop-outs including stubs */\n          e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n          break;\n\n        case 1: /* simple drop-outs excluding stubs */\n        case 5: /* smart drop-outs excluding stubs  */\n          /* see Vertical_Sweep_Drop for details */\n\n          /* rightmost stub test */\n          if ( left->next == right && left->height <= 0 )\n            return;\n\n          /* leftmost stub test */\n          if ( right->next == left && left->start == y )\n            return;\n\n          if ( dropOutControl == 1 )\n            e1 = e2;\n          else\n            e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );\n\n          break;\n\n        default: /* modes 2, 3, 6, 7 */\n          return;  /* no drop-out control */\n        }\n      }\n      else\n        return;\n    }\n\n    if ( e1 >= 0 )\n    {\n      if ( x2 - x1 >= ras.precision_half )\n        color = ras.grays[2];\n      else\n        color = ras.grays[1];\n\n      e1 = TRUNC( e1 ) / 2;\n      if ( e1 < ras.target.rows )\n      {\n        pixel = ras.gTarget - e1 * ras.target.pitch + y / 2;\n        if ( ras.target.pitch > 0 )\n          pixel += ( ras.target.rows - 1 ) * ras.target.pitch;\n\n        if ( pixel[0] == ras.grays[0] )\n          pixel[0] = color;\n      }\n    }\n  }\n\n\n#endif /* FT_RASTER_OPTION_ANTI_ALIASING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Generic Sweep Drawing routine                                        */\n  /*                                                                       */\n  /*************************************************************************/\n\n  static Bool\n  Draw_Sweep( RAS_ARG )\n  {\n    Short         y, y_change, y_height;\n\n    PProfile      P, Q, P_Left, P_Right;\n\n    Short         min_Y, max_Y, top, bottom, dropouts;\n\n    Long          x1, x2, xs, e1, e2;\n\n    TProfileList  waiting;\n    TProfileList  draw_left, draw_right;\n\n\n    /* initialize empty linked lists */\n\n    Init_Linked( &waiting );\n\n    Init_Linked( &draw_left  );\n    Init_Linked( &draw_right );\n\n    /* first, compute min and max Y */\n\n    P     = ras.fProfile;\n    max_Y = (Short)TRUNC( ras.minY );\n    min_Y = (Short)TRUNC( ras.maxY );\n\n    while ( P )\n    {\n      Q = P->link;\n\n      bottom = (Short)P->start;\n      top    = (Short)( P->start + P->height - 1 );\n\n      if ( min_Y > bottom )\n        min_Y = bottom;\n      if ( max_Y < top )\n        max_Y = top;\n\n      P->X = 0;\n      InsNew( &waiting, P );\n\n      P = Q;\n    }\n\n    /* check the Y-turns */\n    if ( ras.numTurns == 0 )\n    {\n      ras.error = FT_THROW( Invalid );\n      return FAILURE;\n    }\n\n    /* now initialize the sweep */\n\n    ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );\n\n    /* then compute the distance of each profile from min_Y */\n\n    P = waiting;\n\n    while ( P )\n    {\n      P->countL = (UShort)( P->start - min_Y );\n      P = P->link;\n    }\n\n    /* let's go */\n\n    y        = min_Y;\n    y_height = 0;\n\n    if ( ras.numTurns > 0                     &&\n         ras.sizeBuff[-ras.numTurns] == min_Y )\n      ras.numTurns--;\n\n    while ( ras.numTurns > 0 )\n    {\n      /* check waiting list for new activations */\n\n      P = waiting;\n\n      while ( P )\n      {\n        Q = P->link;\n        P->countL -= y_height;\n        if ( P->countL == 0 )\n        {\n          DelOld( &waiting, P );\n\n          if ( P->flags & Flow_Up )\n            InsNew( &draw_left,  P );\n          else\n            InsNew( &draw_right, P );\n        }\n\n        P = Q;\n      }\n\n      /* sort the drawing lists */\n\n      Sort( &draw_left );\n      Sort( &draw_right );\n\n      y_change = (Short)ras.sizeBuff[-ras.numTurns--];\n      y_height = (Short)( y_change - y );\n\n      while ( y < y_change )\n      {\n        /* let's trace */\n\n        dropouts = 0;\n\n        P_Left  = draw_left;\n        P_Right = draw_right;\n\n        while ( P_Left )\n        {\n          x1 = P_Left ->X;\n          x2 = P_Right->X;\n\n          if ( x1 > x2 )\n          {\n            xs = x1;\n            x1 = x2;\n            x2 = xs;\n          }\n\n          e1 = FLOOR( x1 );\n          e2 = CEILING( x2 );\n\n          if ( x2 - x1 <= ras.precision &&\n               e1 != x1 && e2 != x2     )\n          {\n            if ( e1 > e2 || e2 == e1 + ras.precision )\n            {\n              Int  dropOutControl = P_Left->flags & 7;\n\n\n              if ( dropOutControl != 2 )\n              {\n                /* a drop-out was detected */\n\n                P_Left ->X = x1;\n                P_Right->X = x2;\n\n                /* mark profile for drop-out processing */\n                P_Left->countL = 1;\n                dropouts++;\n              }\n\n              goto Skip_To_Next;\n            }\n          }\n\n          ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );\n\n        Skip_To_Next:\n\n          P_Left  = P_Left->link;\n          P_Right = P_Right->link;\n        }\n\n        /* handle drop-outs _after_ the span drawing --       */\n        /* drop-out processing has been moved out of the loop */\n        /* for performance tuning                             */\n        if ( dropouts > 0 )\n          goto Scan_DropOuts;\n\n      Next_Line:\n\n        ras.Proc_Sweep_Step( RAS_VAR );\n\n        y++;\n\n        if ( y < y_change )\n        {\n          Sort( &draw_left  );\n          Sort( &draw_right );\n        }\n      }\n\n      /* now finalize the profiles that need it */\n\n      P = draw_left;\n      while ( P )\n      {\n        Q = P->link;\n        if ( P->height == 0 )\n          DelOld( &draw_left, P );\n        P = Q;\n      }\n\n      P = draw_right;\n      while ( P )\n      {\n        Q = P->link;\n        if ( P->height == 0 )\n          DelOld( &draw_right, P );\n        P = Q;\n      }\n    }\n\n    /* for gray-scaling, flush the bitmap scanline cache */\n    while ( y <= max_Y )\n    {\n      ras.Proc_Sweep_Step( RAS_VAR );\n      y++;\n    }\n\n    return SUCCESS;\n\n  Scan_DropOuts:\n\n    P_Left  = draw_left;\n    P_Right = draw_right;\n\n    while ( P_Left )\n    {\n      if ( P_Left->countL )\n      {\n        P_Left->countL = 0;\n#if 0\n        dropouts--;  /* -- this is useful when debugging only */\n#endif\n        ras.Proc_Sweep_Drop( RAS_VARS y,\n                                      P_Left->X,\n                                      P_Right->X,\n                                      P_Left,\n                                      P_Right );\n      }\n\n      P_Left  = P_Left->link;\n      P_Right = P_Right->link;\n    }\n\n    goto Next_Line;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Render_Single_Pass                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Perform one sweep with sub-banding.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    flipped :: If set, flip the direction of the outline.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Renderer error code.                                               */\n  /*                                                                       */\n  static int\n  Render_Single_Pass( RAS_ARGS Bool  flipped )\n  {\n    Short  i, j, k;\n\n\n    while ( ras.band_top >= 0 )\n    {\n      ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision;\n      ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision;\n\n      ras.top = ras.buff;\n\n      ras.error = Raster_Err_None;\n\n      if ( Convert_Glyph( RAS_VARS flipped ) )\n      {\n        if ( ras.error != Raster_Err_Overflow )\n          return FAILURE;\n\n        ras.error = Raster_Err_None;\n\n        /* sub-banding */\n\n#ifdef DEBUG_RASTER\n        ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );\n#endif\n\n        i = ras.band_stack[ras.band_top].y_min;\n        j = ras.band_stack[ras.band_top].y_max;\n\n        k = (Short)( ( i + j ) / 2 );\n\n        if ( ras.band_top >= 7 || k < i )\n        {\n          ras.band_top = 0;\n          ras.error    = FT_THROW( Invalid );\n\n          return ras.error;\n        }\n\n        ras.band_stack[ras.band_top + 1].y_min = k;\n        ras.band_stack[ras.band_top + 1].y_max = j;\n\n        ras.band_stack[ras.band_top].y_max = (Short)( k - 1 );\n\n        ras.band_top++;\n      }\n      else\n      {\n        if ( ras.fProfile )\n          if ( Draw_Sweep( RAS_VAR ) )\n             return ras.error;\n        ras.band_top--;\n      }\n    }\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Render_Glyph                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render a glyph in a bitmap.  Sub-banding if needed.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  Render_Glyph( RAS_ARG )\n  {\n    FT_Error  error;\n\n\n    Set_High_Precision( RAS_VARS ras.outline.flags &\n                                 FT_OUTLINE_HIGH_PRECISION );\n    ras.scale_shift = ras.precision_shift;\n\n    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )\n      ras.dropOutControl = 2;\n    else\n    {\n      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )\n        ras.dropOutControl = 4;\n      else\n        ras.dropOutControl = 0;\n\n      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )\n        ras.dropOutControl += 1;\n    }\n\n    ras.second_pass = (FT_Byte)( !( ras.outline.flags &\n                                    FT_OUTLINE_SINGLE_PASS ) );\n\n    /* Vertical Sweep */\n    ras.Proc_Sweep_Init = Vertical_Sweep_Init;\n    ras.Proc_Sweep_Span = Vertical_Sweep_Span;\n    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;\n    ras.Proc_Sweep_Step = Vertical_Sweep_Step;\n\n    ras.band_top            = 0;\n    ras.band_stack[0].y_min = 0;\n    ras.band_stack[0].y_max = (short)( ras.target.rows - 1 );\n\n    ras.bWidth  = (unsigned short)ras.target.width;\n    ras.bTarget = (Byte*)ras.target.buffer;\n\n    if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 )\n      return error;\n\n    /* Horizontal Sweep */\n    if ( ras.second_pass && ras.dropOutControl != 2 )\n    {\n      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;\n      ras.Proc_Sweep_Span = Horizontal_Sweep_Span;\n      ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop;\n      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;\n\n      ras.band_top            = 0;\n      ras.band_stack[0].y_min = 0;\n      ras.band_stack[0].y_max = (short)( ras.target.width - 1 );\n\n      if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 )\n        return error;\n    }\n\n    return Raster_Err_None;\n  }\n\n\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Render_Gray_Glyph                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Render a glyph with grayscaling.  Sub-banding if needed.           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  Render_Gray_Glyph( RAS_ARG )\n  {\n    Long      pixel_width;\n    FT_Error  error;\n\n\n    Set_High_Precision( RAS_VARS ras.outline.flags &\n                                 FT_OUTLINE_HIGH_PRECISION );\n    ras.scale_shift = ras.precision_shift + 1;\n\n    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )\n      ras.dropOutControl = 2;\n    else\n    {\n      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )\n        ras.dropOutControl = 4;\n      else\n        ras.dropOutControl = 0;\n\n      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )\n        ras.dropOutControl += 1;\n    }\n\n    ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS );\n\n    /* Vertical Sweep */\n\n    ras.band_top            = 0;\n    ras.band_stack[0].y_min = 0;\n    ras.band_stack[0].y_max = 2 * ras.target.rows - 1;\n\n    ras.bWidth  = ras.gray_width;\n    pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 );\n\n    if ( ras.bWidth > pixel_width )\n      ras.bWidth = pixel_width;\n\n    ras.bWidth  = ras.bWidth * 8;\n    ras.bTarget = (Byte*)ras.gray_lines;\n    ras.gTarget = (Byte*)ras.target.buffer;\n\n    ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init;\n    ras.Proc_Sweep_Span = Vertical_Sweep_Span;\n    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;\n    ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step;\n\n    error = Render_Single_Pass( RAS_VARS 0 );\n    if ( error )\n      return error;\n\n    /* Horizontal Sweep */\n    if ( ras.second_pass && ras.dropOutControl != 2 )\n    {\n      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;\n      ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span;\n      ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop;\n      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;\n\n      ras.band_top            = 0;\n      ras.band_stack[0].y_min = 0;\n      ras.band_stack[0].y_max = ras.target.width * 2 - 1;\n\n      error = Render_Single_Pass( RAS_VARS 1 );\n      if ( error )\n        return error;\n    }\n\n    return Raster_Err_None;\n  }\n\n#else /* !FT_RASTER_OPTION_ANTI_ALIASING */\n\n  FT_LOCAL_DEF( FT_Error )\n  Render_Gray_Glyph( RAS_ARG )\n  {\n    FT_UNUSED_RASTER;\n\n    return FT_THROW( Unsupported );\n  }\n\n#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */\n\n\n  static void\n  ft_black_init( black_PRaster  raster )\n  {\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n    FT_UInt  n;\n\n\n    /* set default 5-levels gray palette */\n    for ( n = 0; n < 5; n++ )\n      raster->grays[n] = n * 255 / 4;\n\n    raster->gray_width = RASTER_GRAY_LINES / 2;\n#else\n    FT_UNUSED( raster );\n#endif\n  }\n\n\n  /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/\n  /****                         a static object.                  *****/\n\n\n#ifdef _STANDALONE_\n\n\n  static int\n  ft_black_new( void*       memory,\n                FT_Raster  *araster )\n  {\n     static black_TRaster  the_raster;\n     FT_UNUSED( memory );\n\n\n     *araster = (FT_Raster)&the_raster;\n     FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );\n     ft_black_init( &the_raster );\n\n     return 0;\n  }\n\n\n  static void\n  ft_black_done( FT_Raster  raster )\n  {\n    /* nothing */\n    FT_UNUSED( raster );\n  }\n\n\n#else /* !_STANDALONE_ */\n\n\n  static int\n  ft_black_new( FT_Memory       memory,\n                black_PRaster  *araster )\n  {\n    FT_Error       error;\n    black_PRaster  raster = NULL;\n\n\n    *araster = 0;\n    if ( !FT_NEW( raster ) )\n    {\n      raster->memory = memory;\n      ft_black_init( raster );\n\n      *araster = raster;\n    }\n\n    return error;\n  }\n\n\n  static void\n  ft_black_done( black_PRaster  raster )\n  {\n    FT_Memory  memory = (FT_Memory)raster->memory;\n\n\n    FT_FREE( raster );\n  }\n\n\n#endif /* !_STANDALONE_ */\n\n\n  static void\n  ft_black_reset( black_PRaster  raster,\n                  char*          pool_base,\n                  long           pool_size )\n  {\n    if ( raster )\n    {\n      if ( pool_base && pool_size >= (long)sizeof ( black_TWorker ) + 2048 )\n      {\n        black_PWorker  worker = (black_PWorker)pool_base;\n\n\n        raster->buffer      = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 );\n        raster->buffer_size = pool_base + pool_size - (char*)raster->buffer;\n        raster->worker      = worker;\n      }\n      else\n      {\n        raster->buffer      = NULL;\n        raster->buffer_size = 0;\n        raster->worker      = NULL;\n      }\n    }\n  }\n\n\n  static void\n  ft_black_set_mode( black_PRaster  raster,\n                     unsigned long  mode,\n                     const char*    palette )\n  {\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n\n    if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) )\n    {\n      /* set 5-levels gray palette */\n      raster->grays[0] = palette[0];\n      raster->grays[1] = palette[1];\n      raster->grays[2] = palette[2];\n      raster->grays[3] = palette[3];\n      raster->grays[4] = palette[4];\n    }\n\n#else\n\n    FT_UNUSED( raster );\n    FT_UNUSED( mode );\n    FT_UNUSED( palette );\n\n#endif\n  }\n\n\n  static int\n  ft_black_render( black_PRaster            raster,\n                   const FT_Raster_Params*  params )\n  {\n    const FT_Outline*  outline    = (const FT_Outline*)params->source;\n    const FT_Bitmap*   target_map = params->target;\n    black_PWorker      worker;\n\n\n    if ( !raster || !raster->buffer || !raster->buffer_size )\n      return FT_THROW( Not_Ini );\n\n    if ( !outline )\n      return FT_THROW( Invalid );\n\n    /* return immediately if the outline is empty */\n    if ( outline->n_points == 0 || outline->n_contours <= 0 )\n      return Raster_Err_None;\n\n    if ( !outline->contours || !outline->points )\n      return FT_THROW( Invalid );\n\n    if ( outline->n_points !=\n           outline->contours[outline->n_contours - 1] + 1 )\n      return FT_THROW( Invalid );\n\n    worker = raster->worker;\n\n    /* this version of the raster does not support direct rendering, sorry */\n    if ( params->flags & FT_RASTER_FLAG_DIRECT )\n      return FT_THROW( Unsupported );\n\n    if ( !target_map )\n      return FT_THROW( Invalid );\n\n    /* nothing to do */\n    if ( !target_map->width || !target_map->rows )\n      return Raster_Err_None;\n\n    if ( !target_map->buffer )\n      return FT_THROW( Invalid );\n\n    ras.outline = *outline;\n    ras.target  = *target_map;\n\n    worker->buff       = (PLong) raster->buffer;\n    worker->sizeBuff   = worker->buff +\n                           raster->buffer_size / sizeof ( Long );\n#ifdef FT_RASTER_OPTION_ANTI_ALIASING\n    worker->grays      = raster->grays;\n    worker->gray_width = raster->gray_width;\n\n    FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 );\n#endif\n\n    return ( params->flags & FT_RASTER_FLAG_AA )\n           ? Render_Gray_Glyph( RAS_VAR )\n           : Render_Glyph( RAS_VAR );\n  }\n\n\n  FT_DEFINE_RASTER_FUNCS( ft_standard_raster,\n    FT_GLYPH_FORMAT_OUTLINE,\n    (FT_Raster_New_Func)     ft_black_new,\n    (FT_Raster_Reset_Func)   ft_black_reset,\n    (FT_Raster_Set_Mode_Func)ft_black_set_mode,\n    (FT_Raster_Render_Func)  ft_black_render,\n    (FT_Raster_Done_Func)    ft_black_done\n  )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/raster/ftraster.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftraster.h                                                             */\n/*                                                                         */\n/*    The FreeType glyph rasterizer (specification).                       */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used        */\n/*  modified and distributed under the terms of the FreeType project       */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTRASTER_H__\n#define __FTRASTER_H__\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n#include FT_IMAGE_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Uncomment the following line if you are using ftraster.c as a         */\n  /* standalone module, fully independent of FreeType.                     */\n  /*                                                                       */\n/* #define _STANDALONE_ */\n\n  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_standard_raster;\n\n\nFT_END_HEADER\n\n#endif /* __FTRASTER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/raster/ftrend1.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrend1.c                                                              */\n/*                                                                         */\n/*    The FreeType glyph rasterizer interface (body).                      */\n/*                                                                         */\n/*  Copyright 1996-2003, 2005, 2006, 2011, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_OUTLINE_H\n#include \"ftrend1.h\"\n#include \"ftraster.h\"\n#include \"rastpic.h\"\n\n#include \"rasterrs.h\"\n\n\n  /* initialize renderer -- init its raster */\n  static FT_Error\n  ft_raster1_init( FT_Renderer  render )\n  {\n    FT_Library  library = FT_MODULE_LIBRARY( render );\n\n\n    render->clazz->raster_class->raster_reset( render->raster,\n                                               library->raster_pool,\n                                               library->raster_pool_size );\n\n    return FT_Err_Ok;\n  }\n\n\n  /* set render-specific mode */\n  static FT_Error\n  ft_raster1_set_mode( FT_Renderer  render,\n                       FT_ULong     mode_tag,\n                       FT_Pointer   data )\n  {\n    /* we simply pass it to the raster */\n    return render->clazz->raster_class->raster_set_mode( render->raster,\n                                                         mode_tag,\n                                                         data );\n  }\n\n\n  /* transform a given glyph image */\n  static FT_Error\n  ft_raster1_transform( FT_Renderer       render,\n                        FT_GlyphSlot      slot,\n                        const FT_Matrix*  matrix,\n                        const FT_Vector*  delta )\n  {\n    FT_Error error = FT_Err_Ok;\n\n\n    if ( slot->format != render->glyph_format )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( matrix )\n      FT_Outline_Transform( &slot->outline, matrix );\n\n    if ( delta )\n      FT_Outline_Translate( &slot->outline, delta->x, delta->y );\n\n  Exit:\n    return error;\n  }\n\n\n  /* return the glyph's control box */\n  static void\n  ft_raster1_get_cbox( FT_Renderer   render,\n                       FT_GlyphSlot  slot,\n                       FT_BBox*      cbox )\n  {\n    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );\n\n    if ( slot->format == render->glyph_format )\n      FT_Outline_Get_CBox( &slot->outline, cbox );\n  }\n\n\n  /* convert a slot's glyph image into a bitmap */\n  static FT_Error\n  ft_raster1_render( FT_Renderer       render,\n                     FT_GlyphSlot      slot,\n                     FT_Render_Mode    mode,\n                     const FT_Vector*  origin )\n  {\n    FT_Error     error;\n    FT_Outline*  outline;\n    FT_BBox      cbox;\n    FT_UInt      width, height, pitch;\n    FT_Bitmap*   bitmap;\n    FT_Memory    memory;\n\n    FT_Raster_Params  params;\n\n\n    /* check glyph image format */\n    if ( slot->format != render->glyph_format )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* check rendering mode */\n#ifndef FT_CONFIG_OPTION_PIC\n    if ( mode != FT_RENDER_MODE_MONO )\n    {\n      /* raster1 is only capable of producing monochrome bitmaps */\n      if ( render->clazz == &ft_raster1_renderer_class )\n        return FT_THROW( Cannot_Render_Glyph );\n    }\n    else\n    {\n      /* raster5 is only capable of producing 5-gray-levels bitmaps */\n      if ( render->clazz == &ft_raster5_renderer_class )\n        return FT_THROW( Cannot_Render_Glyph );\n    }\n#else /* FT_CONFIG_OPTION_PIC */\n    /* When PIC is enabled, we cannot get to the class object      */\n    /* so instead we check the final character in the class name   */\n    /* (\"raster5\" or \"raster1\"). Yes this is a hack.               */\n    /* The \"correct\" thing to do is have different render function */\n    /* for each of the classes.                                    */\n    if ( mode != FT_RENDER_MODE_MONO )\n    {\n      /* raster1 is only capable of producing monochrome bitmaps */\n      if ( render->clazz->root.module_name[6] == '1' )\n        return FT_THROW( Cannot_Render_Glyph );\n    }\n    else\n    {\n      /* raster5 is only capable of producing 5-gray-levels bitmaps */\n      if ( render->clazz->root.module_name[6] == '5' )\n        return FT_THROW( Cannot_Render_Glyph );\n    }\n#endif /* FT_CONFIG_OPTION_PIC */\n\n    outline = &slot->outline;\n\n    /* translate the outline to the new origin if needed */\n    if ( origin )\n      FT_Outline_Translate( outline, origin->x, origin->y );\n\n    /* compute the control box, and grid fit it */\n    FT_Outline_Get_CBox( outline, &cbox );\n\n    /* undocumented but confirmed: bbox values get rounded */\n#if 1\n    cbox.xMin = FT_PIX_ROUND( cbox.xMin );\n    cbox.yMin = FT_PIX_ROUND( cbox.yMin );\n    cbox.xMax = FT_PIX_ROUND( cbox.xMax );\n    cbox.yMax = FT_PIX_ROUND( cbox.yMax );\n#else\n    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );\n    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );\n    cbox.xMax = FT_PIX_CEIL( cbox.xMax );\n    cbox.yMax = FT_PIX_CEIL( cbox.yMax );\n#endif\n\n    width  = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );\n    height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );\n\n    if ( width > FT_USHORT_MAX || height > FT_USHORT_MAX )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    bitmap = &slot->bitmap;\n    memory = render->root.memory;\n\n    /* release old bitmap buffer */\n    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )\n    {\n      FT_FREE( bitmap->buffer );\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n\n    /* allocate new one, depends on pixel format */\n    if ( !( mode & FT_RENDER_MODE_MONO ) )\n    {\n      /* we pad to 32 bits, only for backwards compatibility with FT 1.x */\n      pitch              = FT_PAD_CEIL( width, 4 );\n      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;\n      bitmap->num_grays  = 256;\n    }\n    else\n    {\n      pitch              = ( ( width + 15 ) >> 4 ) << 1;\n      bitmap->pixel_mode = FT_PIXEL_MODE_MONO;\n    }\n\n    bitmap->width = width;\n    bitmap->rows  = height;\n    bitmap->pitch = pitch;\n\n    if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )\n      goto Exit;\n\n    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;\n\n    /* translate outline to render it into the bitmap */\n    FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );\n\n    /* set up parameters */\n    params.target = bitmap;\n    params.source = outline;\n    params.flags  = 0;\n\n    if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY )\n      params.flags |= FT_RASTER_FLAG_AA;\n\n    /* render outline into the bitmap */\n    error = render->raster_render( render->raster, &params );\n\n    FT_Outline_Translate( outline, cbox.xMin, cbox.yMin );\n\n    if ( error )\n      goto Exit;\n\n    slot->format      = FT_GLYPH_FORMAT_BITMAP;\n    slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 );\n    slot->bitmap_top  = (FT_Int)( cbox.yMax >> 6 );\n\n  Exit:\n    return error;\n  }\n\n\n  FT_DEFINE_RENDERER( ft_raster1_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"raster1\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_raster1_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_raster1_render,\n    (FT_Renderer_TransformFunc)ft_raster1_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_STANDARD_RASTER_GET\n  )\n\n\n  /* This renderer is _NOT_ part of the default modules; you will need */\n  /* to register it by hand in your application.  It should only be    */\n  /* used for backwards-compatibility with FT 1.x anyway.              */\n  /*                                                                   */\n  FT_DEFINE_RENDERER( ft_raster5_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"raster5\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_raster1_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_raster1_render,\n    (FT_Renderer_TransformFunc)ft_raster1_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_STANDARD_RASTER_GET\n  )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/raster/ftrend1.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftrend1.h                                                              */\n/*                                                                         */\n/*    The FreeType glyph rasterizer interface (specification).             */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTREND1_H__\n#define __FTREND1_H__\n\n\n#include <ft2build.h>\n#include FT_RENDER_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_RENDERER( ft_raster1_renderer_class )\n\n  /* this renderer is _NOT_ part of the default modules, you'll need */\n  /* to register it by hand in your application.  It should only be  */\n  /* used for backwards-compatibility with FT 1.x anyway.            */\n  /*                                                                 */\n  FT_DECLARE_RENDERER( ft_raster5_renderer_class )\n\n\nFT_END_HEADER\n\n#endif /* __FTREND1_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/raster/module.mk",
    "content": "#\n# FreeType 2 renderer module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += RASTER_MODULE\n\ndefine RASTER_MODULE\n$(OPEN_DRIVER) FT_Renderer_Class, ft_raster1_renderer_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)raster    $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/raster/raster.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  raster.c                                                               */\n/*                                                                         */\n/*    FreeType monochrome rasterer module component (body only).           */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"rastpic.c\"\n#include \"ftraster.c\"\n#include \"ftrend1.c\"\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/raster/rasterrs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  rasterrs.h                                                             */\n/*                                                                         */\n/*    monochrome renderer error codes (specification only).                */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the monochrome renderer error enumeration */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __RASTERRS_H__\n#define __RASTERRS_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  Raster_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Raster\n\n#include FT_ERRORS_H\n\n#endif /* __RASTERRS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/raster/rastpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  rastpic.c                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for raster module.   */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"rastpic.h\"\n#include \"rasterrs.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from ftraster.c */\n  void\n  FT_Init_Class_ft_standard_raster( FT_Raster_Funcs*  funcs );\n\n\n  void\n  ft_raster1_renderer_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->raster )\n    {\n      RasterPIC*  container = (RasterPIC*)pic_container->raster;\n\n\n      if ( --container->ref_count )\n        return;\n      FT_FREE( container );\n      pic_container->raster = NULL;\n    }\n  }\n\n\n  FT_Error\n  ft_raster1_renderer_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    RasterPIC*         container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* since this function also serves raster5 renderer, */\n    /* it implements reference counting                  */\n    if ( pic_container->raster )\n    {\n      ((RasterPIC*)pic_container->raster)->ref_count++;\n      return error;\n    }\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->raster = container;\n\n    container->ref_count = 1;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    FT_Init_Class_ft_standard_raster( &container->ft_standard_raster );\n\n    return error;\n  }\n\n\n  /* re-route these init and free functions to the above functions */\n  FT_Error\n  ft_raster5_renderer_class_pic_init( FT_Library  library )\n  {\n    return ft_raster1_renderer_class_pic_init( library );\n  }\n\n\n  void\n  ft_raster5_renderer_class_pic_free( FT_Library  library )\n  {\n    ft_raster1_renderer_class_pic_free( library );\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/raster/rastpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  rastpic.h                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for raster module.   */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __RASTPIC_H__\n#define __RASTPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include FT_INTERNAL_PIC_H\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_STANDARD_RASTER_GET  ft_standard_raster\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  typedef struct  RasterPIC_\n  {\n    int              ref_count;\n    FT_Raster_Funcs  ft_standard_raster;\n\n  } RasterPIC;\n\n\n#define GET_PIC( lib )                                    \\\n          ( (RasterPIC*)( (lib)->pic_container.raster ) )\n#define FT_STANDARD_RASTER_GET  ( GET_PIC( library )->ft_standard_raster )\n\n\n  /* see rastpic.c for the implementation */\n  void\n  ft_raster1_renderer_class_pic_free( FT_Library  library );\n\n  void\n  ft_raster5_renderer_class_pic_free( FT_Library  library );\n\n  FT_Error\n  ft_raster1_renderer_class_pic_init( FT_Library  library );\n\n  FT_Error\n  ft_raster5_renderer_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __RASTPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/raster/rules.mk",
    "content": "#\n# FreeType 2 renderer module build rules\n#\n\n\n# Copyright 1996-2000, 2001, 2003, 2008, 2009, 2011 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# raster driver directory\n#\nRASTER_DIR := $(SRC_DIR)/raster\n\n# compilation flags for the driver\n#\nRASTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(RASTER_DIR))\n\n\n# raster driver sources (i.e., C files)\n#\nRASTER_DRV_SRC := $(RASTER_DIR)/ftraster.c \\\n                  $(RASTER_DIR)/ftrend1.c  \\\n                  $(RASTER_DIR)/rastpic.c\n\n\n# raster driver headers\n#\nRASTER_DRV_H := $(RASTER_DRV_SRC:%.c=%.h) \\\n                $(RASTER_DIR)/rasterrs.h\n\n\n# raster driver object(s)\n#\n#   RASTER_DRV_OBJ_M is used during `multi' builds.\n#   RASTER_DRV_OBJ_S is used during `single' builds.\n#\nRASTER_DRV_OBJ_M := $(RASTER_DRV_SRC:$(RASTER_DIR)/%.c=$(OBJ_DIR)/%.$O)\nRASTER_DRV_OBJ_S := $(OBJ_DIR)/raster.$O\n\n# raster driver source file for single build\n#\nRASTER_DRV_SRC_S := $(RASTER_DIR)/raster.c\n\n\n# raster driver - single object\n#\n$(RASTER_DRV_OBJ_S): $(RASTER_DRV_SRC_S) $(RASTER_DRV_SRC) \\\n                     $(FREETYPE_H) $(RASTER_DRV_H)\n\t$(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(RASTER_DRV_SRC_S))\n\n\n# raster driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(RASTER_DIR)/%.c $(FREETYPE_H) $(RASTER_DRV_H)\n\t$(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(RASTER_DRV_OBJ_S)\nDRV_OBJS_M += $(RASTER_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/sfnt/Jamfile",
    "content": "# FreeType 2 src/sfnt Jamfile\n#\n# Copyright 2001, 2002, 2004, 2005 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) sfnt ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = sfobjs sfdriver ttcmap ttmtx ttpost ttload ttsbit ttkern ttbdf sfntpic ;\n  }\n  else\n  {\n    _sources = sfnt ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/sfnt Jamfile\n"
  },
  {
    "path": "libs/freetype/src/sfnt/module.mk",
    "content": "#\n# FreeType 2 SFNT module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += SFNT_MODULE\n\ndefine SFNT_MODULE\n$(OPEN_DRIVER) FT_Module_Class, sfnt_module_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)sfnt      $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/sfnt/rules.mk",
    "content": "#\n# FreeType 2 SFNT driver configuration rules\n#\n\n\n# Copyright 1996-2000, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2011 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# SFNT driver directory\n#\nSFNT_DIR := $(SRC_DIR)/sfnt\n\n\n# compilation flags for the driver\n#\nSFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR))\n\n\n# SFNT driver sources (i.e., C files)\n#\nSFNT_DRV_SRC := $(SFNT_DIR)/ttload.c   \\\n                $(SFNT_DIR)/ttmtx.c    \\\n                $(SFNT_DIR)/ttcmap.c   \\\n                $(SFNT_DIR)/ttsbit.c   \\\n                $(SFNT_DIR)/ttpost.c   \\\n                $(SFNT_DIR)/ttkern.c   \\\n                $(SFNT_DIR)/ttbdf.c    \\\n                $(SFNT_DIR)/sfobjs.c   \\\n                $(SFNT_DIR)/sfdriver.c \\\n                $(SFNT_DIR)/sfntpic.c\n\n# SFNT driver headers\n#\n# Note that ttsbit0.c gets #included by ttsbit.c.\n#\nSFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h)  \\\n              $(SFNT_DIR)/sferrors.h \\\n              $(SFNT_DIR)/ttsbit0.c\n\n\n# SFNT driver object(s)\n#\n#   SFNT_DRV_OBJ_M is used during `multi' builds.\n#   SFNT_DRV_OBJ_S is used during `single' builds.\n#\nSFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O)\nSFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O\n\n# SFNT driver source file for single build\n#\nSFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c\n\n\n# SFNT driver - single object\n#\n$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \\\n                   $(FREETYPE_H) $(SFNT_DRV_H)\n\t$(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S))\n\n\n# SFNT driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H)\n\t$(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(SFNT_DRV_OBJ_S)\nDRV_OBJS_M += $(SFNT_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/sfnt/sfdriver.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfdriver.c                                                             */\n/*                                                                         */\n/*    High-level SFNT driver interface (body).                             */\n/*                                                                         */\n/*  Copyright 1996-2007, 2009-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_SFNT_H\n#include FT_INTERNAL_OBJECTS_H\n\n#include \"sfdriver.h\"\n#include \"ttload.h\"\n#include \"sfobjs.h\"\n#include \"sfntpic.h\"\n\n#include \"sferrors.h\"\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#include \"ttsbit.h\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n#include \"ttpost.h\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_BDF\n#include \"ttbdf.h\"\n#include FT_SERVICE_BDF_H\n#endif\n\n#include \"ttcmap.h\"\n#include \"ttkern.h\"\n#include \"ttmtx.h\"\n\n#include FT_SERVICE_GLYPH_DICT_H\n#include FT_SERVICE_POSTSCRIPT_NAME_H\n#include FT_SERVICE_SFNT_H\n#include FT_SERVICE_TT_CMAP_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_sfdriver\n\n\n  /*\n   *  SFNT TABLE SERVICE\n   *\n   */\n\n  static void*\n  get_sfnt_table( TT_Face      face,\n                  FT_Sfnt_Tag  tag )\n  {\n    void*  table;\n\n\n    switch ( tag )\n    {\n    case ft_sfnt_head:\n      table = &face->header;\n      break;\n\n    case ft_sfnt_hhea:\n      table = &face->horizontal;\n      break;\n\n    case ft_sfnt_vhea:\n      table = face->vertical_info ? &face->vertical : 0;\n      break;\n\n    case ft_sfnt_os2:\n      table = face->os2.version == 0xFFFFU ? 0 : &face->os2;\n      break;\n\n    case ft_sfnt_post:\n      table = &face->postscript;\n      break;\n\n    case ft_sfnt_maxp:\n      table = &face->max_profile;\n      break;\n\n    case ft_sfnt_pclt:\n      table = face->pclt.Version ? &face->pclt : 0;\n      break;\n\n    default:\n      table = 0;\n    }\n\n    return table;\n  }\n\n\n  static FT_Error\n  sfnt_table_info( TT_Face    face,\n                   FT_UInt    idx,\n                   FT_ULong  *tag,\n                   FT_ULong  *offset,\n                   FT_ULong  *length )\n  {\n    if ( !offset || !length )\n      return FT_THROW( Invalid_Argument );\n\n    if ( !tag )\n      *length = face->num_tables;\n    else\n    {\n      if ( idx >= face->num_tables )\n        return FT_THROW( Table_Missing );\n\n      *tag    = face->dir_tables[idx].Tag;\n      *offset = face->dir_tables[idx].Offset;\n      *length = face->dir_tables[idx].Length;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_SERVICE_SFNT_TABLEREC(\n    sfnt_service_sfnt_table,\n    (FT_SFNT_TableLoadFunc)tt_face_load_any,\n    (FT_SFNT_TableGetFunc) get_sfnt_table,\n    (FT_SFNT_TableInfoFunc)sfnt_table_info )\n\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n  /*\n   *  GLYPH DICT SERVICE\n   *\n   */\n\n  static FT_Error\n  sfnt_get_glyph_name( TT_Face     face,\n                       FT_UInt     glyph_index,\n                       FT_Pointer  buffer,\n                       FT_UInt     buffer_max )\n  {\n    FT_String*  gname;\n    FT_Error    error;\n\n\n    error = tt_face_get_ps_name( face, glyph_index, &gname );\n    if ( !error )\n      FT_STRCPYN( buffer, gname, buffer_max );\n\n    return error;\n  }\n\n\n  static FT_UInt\n  sfnt_get_name_index( TT_Face     face,\n                       FT_String*  glyph_name )\n  {\n    FT_Face  root = &face->root;\n\n    FT_UInt  i, max_gid = FT_UINT_MAX;\n\n\n    if ( root->num_glyphs < 0 )\n      return 0;\n    else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX )\n      max_gid = (FT_UInt)root->num_glyphs;\n    else\n      FT_TRACE0(( \"Ignore glyph names for invalid GID 0x%08x - 0x%08x\\n\",\n                  FT_UINT_MAX, root->num_glyphs ));\n\n    for ( i = 0; i < max_gid; i++ )\n    {\n      FT_String*  gname;\n      FT_Error    error = tt_face_get_ps_name( face, i, &gname );\n\n\n      if ( error )\n        continue;\n\n      if ( !ft_strcmp( glyph_name, gname ) )\n        return i;\n    }\n\n    return 0;\n  }\n\n\n  FT_DEFINE_SERVICE_GLYPHDICTREC(\n    sfnt_service_glyph_dict,\n    (FT_GlyphDict_GetNameFunc)  sfnt_get_glyph_name,\n    (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index )\n\n\n#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */\n\n\n  /*\n   *  POSTSCRIPT NAME SERVICE\n   *\n   */\n\n  static const char*\n  sfnt_get_ps_name( TT_Face  face )\n  {\n    FT_Int       n, found_win, found_apple;\n    const char*  result = NULL;\n\n\n    /* shouldn't happen, but just in case to avoid memory leaks */\n    if ( face->postscript_name )\n      return face->postscript_name;\n\n    /* scan the name table to see whether we have a Postscript name here, */\n    /* either in Macintosh or Windows platform encodings                  */\n    found_win   = -1;\n    found_apple = -1;\n\n    for ( n = 0; n < face->num_names; n++ )\n    {\n      TT_NameEntryRec*  name = face->name_table.names + n;\n\n\n      if ( name->nameID == 6 && name->stringLength > 0 )\n      {\n        if ( name->platformID == 3     &&\n             name->encodingID == 1     &&\n             name->languageID == 0x409 )\n          found_win = n;\n\n        if ( name->platformID == 1 &&\n             name->encodingID == 0 &&\n             name->languageID == 0 )\n          found_apple = n;\n      }\n    }\n\n    if ( found_win != -1 )\n    {\n      FT_Memory         memory = face->root.memory;\n      TT_NameEntryRec*  name   = face->name_table.names + found_win;\n      FT_UInt           len    = name->stringLength / 2;\n      FT_Error          error  = FT_Err_Ok;\n\n      FT_UNUSED( error );\n\n\n      if ( !FT_ALLOC( result, name->stringLength + 1 ) )\n      {\n        FT_Stream   stream = face->name_table.stream;\n        FT_String*  r      = (FT_String*)result;\n        FT_Byte*    p      = (FT_Byte*)name->string;\n\n\n        if ( FT_STREAM_SEEK( name->stringOffset ) ||\n             FT_FRAME_ENTER( name->stringLength ) )\n        {\n          FT_FREE( result );\n          name->stringLength = 0;\n          name->stringOffset = 0;\n          FT_FREE( name->string );\n\n          goto Exit;\n        }\n\n        p = (FT_Byte*)stream->cursor;\n\n        for ( ; len > 0; len--, p += 2 )\n        {\n          if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 )\n            *r++ = p[1];\n        }\n        *r = '\\0';\n\n        FT_FRAME_EXIT();\n      }\n      goto Exit;\n    }\n\n    if ( found_apple != -1 )\n    {\n      FT_Memory         memory = face->root.memory;\n      TT_NameEntryRec*  name   = face->name_table.names + found_apple;\n      FT_UInt           len    = name->stringLength;\n      FT_Error          error  = FT_Err_Ok;\n\n      FT_UNUSED( error );\n\n\n      if ( !FT_ALLOC( result, len + 1 ) )\n      {\n        FT_Stream  stream = face->name_table.stream;\n\n\n        if ( FT_STREAM_SEEK( name->stringOffset ) ||\n             FT_STREAM_READ( result, len )        )\n        {\n          name->stringOffset = 0;\n          name->stringLength = 0;\n          FT_FREE( name->string );\n          FT_FREE( result );\n          goto Exit;\n        }\n        ((char*)result)[len] = '\\0';\n      }\n    }\n\n  Exit:\n    face->postscript_name = result;\n    return result;\n  }\n\n\n  FT_DEFINE_SERVICE_PSFONTNAMEREC(\n    sfnt_service_ps_name,\n    (FT_PsName_GetFunc)sfnt_get_ps_name )\n\n\n  /*\n   *  TT CMAP INFO\n   */\n  FT_DEFINE_SERVICE_TTCMAPSREC(\n    tt_service_get_cmap_info,\n    (TT_CMap_Info_GetFunc)tt_get_cmap_info )\n\n\n#ifdef TT_CONFIG_OPTION_BDF\n\n  static FT_Error\n  sfnt_get_charset_id( TT_Face       face,\n                       const char*  *acharset_encoding,\n                       const char*  *acharset_registry )\n  {\n    BDF_PropertyRec  encoding, registry;\n    FT_Error         error;\n\n\n    /* XXX: I don't know whether this is correct, since\n     *      tt_face_find_bdf_prop only returns something correct if we have\n     *      previously selected a size that is listed in the BDF table.\n     *      Should we change the BDF table format to include single offsets\n     *      for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?\n     */\n    error = tt_face_find_bdf_prop( face, \"CHARSET_REGISTRY\", &registry );\n    if ( !error )\n    {\n      error = tt_face_find_bdf_prop( face, \"CHARSET_ENCODING\", &encoding );\n      if ( !error )\n      {\n        if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&\n             encoding.type == BDF_PROPERTY_TYPE_ATOM )\n        {\n          *acharset_encoding = encoding.u.atom;\n          *acharset_registry = registry.u.atom;\n        }\n        else\n          error = FT_THROW( Invalid_Argument );\n      }\n    }\n\n    return error;\n  }\n\n\n  FT_DEFINE_SERVICE_BDFRec(\n    sfnt_service_bdf,\n    (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id,\n    (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop )\n\n\n#endif /* TT_CONFIG_OPTION_BDF */\n\n\n  /*\n   *  SERVICE LIST\n   */\n\n#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF\n  FT_DEFINE_SERVICEDESCREC5(\n    sfnt_services,\n    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,\n    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,\n    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )\n#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n  FT_DEFINE_SERVICEDESCREC4(\n    sfnt_services,\n    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,\n    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )\n#elif defined TT_CONFIG_OPTION_BDF\n  FT_DEFINE_SERVICEDESCREC4(\n    sfnt_services,\n    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,\n    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )\n#else\n  FT_DEFINE_SERVICEDESCREC3(\n    sfnt_services,\n    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,\n    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,\n    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )\n#endif\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  sfnt_get_interface( FT_Module    module,\n                      const char*  module_interface )\n  {\n    /* SFNT_SERVICES_GET derefers `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    FT_Library  library;\n\n\n    if ( !module )\n      return NULL;\n    library = module->library;\n    if ( !library )\n      return NULL;\n#else\n    FT_UNUSED( module );\n#endif\n\n    return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface );\n  }\n\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_face_load_sfnt_header_stub( TT_Face      face,\n                                 FT_Stream    stream,\n                                 FT_Long      face_index,\n                                 SFNT_Header  header )\n  {\n    FT_UNUSED( face );\n    FT_UNUSED( stream );\n    FT_UNUSED( face_index );\n    FT_UNUSED( header );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_face_load_directory_stub( TT_Face      face,\n                               FT_Stream    stream,\n                               SFNT_Header  header )\n  {\n    FT_UNUSED( face );\n    FT_UNUSED( stream );\n    FT_UNUSED( header );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_face_load_hdmx_stub( TT_Face    face,\n                          FT_Stream  stream )\n  {\n    FT_UNUSED( face );\n    FT_UNUSED( stream );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  tt_face_free_hdmx_stub( TT_Face  face )\n  {\n    FT_UNUSED( face );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_face_set_sbit_strike_stub( TT_Face    face,\n                                FT_UInt    x_ppem,\n                                FT_UInt    y_ppem,\n                                FT_ULong*  astrike_index )\n  {\n    /*\n     * We simply forge a FT_Size_Request and call the real function\n     * that does all the work.\n     *\n     * This stub might be called by libXfont in the X.Org Xserver,\n     * compiled against version 2.1.8 or newer.\n     */\n\n    FT_Size_RequestRec  req;\n\n\n    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;\n    req.width          = (FT_F26Dot6)x_ppem;\n    req.height         = (FT_F26Dot6)y_ppem;\n    req.horiResolution = 0;\n    req.vertResolution = 0;\n\n    *astrike_index = 0x7FFFFFFFUL;\n\n    return tt_face_set_sbit_strike( face, &req, astrike_index );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_face_load_sbit_stub( TT_Face    face,\n                          FT_Stream  stream )\n  {\n    FT_UNUSED( face );\n    FT_UNUSED( stream );\n\n    /*\n     *  This function was originally implemented to load the sbit table.\n     *  However, it has been replaced by `tt_face_load_eblc', and this stub\n     *  is only there for some rogue clients which would want to call it\n     *  directly (which doesn't make much sense).\n     */\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  tt_face_free_sbit_stub( TT_Face  face )\n  {\n    /* nothing to do in this stub */\n    FT_UNUSED( face );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_face_load_charmap_stub( TT_Face    face,\n                             void*      cmap,\n                             FT_Stream  input )\n  {\n    FT_UNUSED( face );\n    FT_UNUSED( cmap );\n    FT_UNUSED( input );\n\n    return FT_THROW( Unimplemented_Feature );\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_face_free_charmap_stub( TT_Face  face,\n                             void*    cmap )\n  {\n    FT_UNUSED( face );\n    FT_UNUSED( cmap );\n\n    return FT_Err_Ok;\n  }\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#define PUT_EMBEDDED_BITMAPS( a )  a\n#else\n#define PUT_EMBEDDED_BITMAPS( a )  NULL\n#endif\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n#define PUT_PS_NAMES( a )  a\n#else\n#define PUT_PS_NAMES( a )  NULL\n#endif\n\n  FT_DEFINE_SFNT_INTERFACE(\n    sfnt_interface,\n    tt_face_goto_table,\n\n    sfnt_init_face,\n    sfnt_load_face,\n    sfnt_done_face,\n    sfnt_get_interface,\n\n    tt_face_load_any,\n\n    tt_face_load_sfnt_header_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n    tt_face_load_directory_stub,   /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    tt_face_load_head,\n    tt_face_load_hhea,\n    tt_face_load_cmap,\n    tt_face_load_maxp,\n    tt_face_load_os2,\n    tt_face_load_post,\n\n    tt_face_load_name,\n    tt_face_free_name,\n\n    tt_face_load_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n    tt_face_free_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    tt_face_load_kern,\n    tt_face_load_gasp,\n    tt_face_load_pclt,\n\n    /* see `ttload.h' */\n    PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ),\n\n    tt_face_set_sbit_strike_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n    tt_face_load_sbit_stub,       /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    tt_find_sbit_image,   /* FT_CONFIG_OPTION_OLD_INTERNALS */\n    tt_load_sbit_metrics, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ),\n\n    tt_face_free_sbit_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    /* see `ttpost.h' */\n    PUT_PS_NAMES( tt_face_get_ps_name   ),\n    PUT_PS_NAMES( tt_face_free_ps_names ),\n\n    tt_face_load_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n    tt_face_free_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    /* since version 2.1.8 */\n\n    tt_face_get_kerning,\n\n    /* since version 2.2 */\n\n    tt_face_load_font_dir,\n    tt_face_load_hmtx,\n\n    /* see `ttsbit.h' and `sfnt.h' */\n    PUT_EMBEDDED_BITMAPS( tt_face_load_eblc ),\n    PUT_EMBEDDED_BITMAPS( tt_face_free_eblc ),\n\n    PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike     ),\n    PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),\n\n    tt_face_get_metrics\n  )\n\n\n  FT_DEFINE_MODULE(\n    sfnt_module_class,\n\n    0,  /* not a font driver or renderer */\n    sizeof ( FT_ModuleRec ),\n\n    \"sfnt\",     /* driver name                            */\n    0x10000L,   /* driver version 1.0                     */\n    0x20000L,   /* driver requires FreeType 2.0 or higher */\n\n    (const void*)&SFNT_INTERFACE_GET,  /* module specific interface */\n\n    (FT_Module_Constructor)0,\n    (FT_Module_Destructor) 0,\n    (FT_Module_Requester)  sfnt_get_interface )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/sfdriver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfdriver.h                                                             */\n/*                                                                         */\n/*    High-level SFNT driver interface (specification).                    */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SFDRIVER_H__\n#define __SFDRIVER_H__\n\n\n#include <ft2build.h>\n#include FT_MODULE_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_MODULE( sfnt_module_class )\n\n\nFT_END_HEADER\n\n#endif /* __SFDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/sferrors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sferrors.h                                                             */\n/*                                                                         */\n/*    SFNT error codes (specification only).                               */\n/*                                                                         */\n/*  Copyright 2001, 2004, 2012, 2013 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the SFNT error enumeration constants.     */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __SFERRORS_H__\n#define __SFERRORS_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  SFNT_Err_\n#define FT_ERR_BASE    FT_Mod_Err_SFNT\n\n#include FT_ERRORS_H\n\n#endif /* __SFERRORS_H__ */\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/sfnt.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfnt.c                                                                 */\n/*                                                                         */\n/*    Single object library component.                                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"sfntpic.c\"\n#include \"ttload.c\"\n#include \"ttmtx.c\"\n#include \"ttcmap.c\"\n#include \"ttkern.c\"\n#include \"sfobjs.c\"\n#include \"sfdriver.c\"\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#include \"ttsbit.c\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n#include \"ttpost.c\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_BDF\n#include \"ttbdf.c\"\n#endif\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/sfntpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfntpic.c                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for sfnt module.     */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"sfntpic.h\"\n#include \"sferrors.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from sfdriver.c */\n  FT_Error\n  FT_Create_Class_sfnt_services( FT_Library           library,\n                                 FT_ServiceDescRec**  output_class );\n  void\n  FT_Destroy_Class_sfnt_services( FT_Library          library,\n                                  FT_ServiceDescRec*  clazz );\n  void\n  FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec*  clazz );\n  void\n  FT_Init_Class_sfnt_interface( FT_Library       library,\n                                SFNT_Interface*  clazz );\n  void\n  FT_Init_Class_sfnt_service_glyph_dict(\n    FT_Library                library,\n    FT_Service_GlyphDictRec*  clazz );\n  void\n  FT_Init_Class_sfnt_service_ps_name(\n    FT_Library                 library,\n    FT_Service_PsFontNameRec*  clazz );\n  void\n  FT_Init_Class_tt_service_get_cmap_info(\n    FT_Library              library,\n    FT_Service_TTCMapsRec*  clazz );\n  void\n  FT_Init_Class_sfnt_service_sfnt_table(\n    FT_Service_SFNT_TableRec*  clazz );\n\n\n  /* forward declaration of PIC init functions from ttcmap.c */\n  FT_Error\n  FT_Create_Class_tt_cmap_classes( FT_Library       library,\n                                   TT_CMap_Class**  output_class );\n  void\n  FT_Destroy_Class_tt_cmap_classes( FT_Library      library,\n                                    TT_CMap_Class*  clazz );\n\n\n  void\n  sfnt_module_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->sfnt )\n    {\n      sfntModulePIC*  container = (sfntModulePIC*)pic_container->sfnt;\n\n\n      if ( container->sfnt_services )\n        FT_Destroy_Class_sfnt_services( library,\n                                        container->sfnt_services );\n      container->sfnt_services = NULL;\n\n      if ( container->tt_cmap_classes )\n        FT_Destroy_Class_tt_cmap_classes( library,\n                                          container->tt_cmap_classes );\n      container->tt_cmap_classes = NULL;\n\n      FT_FREE( container );\n      pic_container->sfnt = NULL;\n    }\n  }\n\n\n  FT_Error\n  sfnt_module_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    sfntModulePIC*     container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->sfnt = container;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    error = FT_Create_Class_sfnt_services( library,\n                                           &container->sfnt_services );\n    if ( error )\n      goto Exit;\n\n    error = FT_Create_Class_tt_cmap_classes( library,\n                                             &container->tt_cmap_classes );\n    if ( error )\n      goto Exit;\n\n    FT_Init_Class_sfnt_service_glyph_dict(\n      library, &container->sfnt_service_glyph_dict );\n    FT_Init_Class_sfnt_service_ps_name(\n      library, &container->sfnt_service_ps_name );\n    FT_Init_Class_tt_service_get_cmap_info(\n      library, &container->tt_service_get_cmap_info );\n    FT_Init_Class_sfnt_service_sfnt_table(\n      &container->sfnt_service_sfnt_table );\n#ifdef TT_CONFIG_OPTION_BDF\n    FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf );\n#endif\n    FT_Init_Class_sfnt_interface( library, &container->sfnt_interface );\n\n  Exit:\n    if ( error )\n      sfnt_module_class_pic_free( library );\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/sfntpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfntpic.h                                                              */\n/*                                                                         */\n/*    The FreeType position independent code services for sfnt module.     */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SFNTPIC_H__\n#define __SFNTPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include FT_INTERNAL_PIC_H\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define SFNT_SERVICES_GET            sfnt_services\n#define SFNT_SERVICE_GLYPH_DICT_GET  sfnt_service_glyph_dict\n#define SFNT_SERVICE_PS_NAME_GET     sfnt_service_ps_name\n#define TT_SERVICE_CMAP_INFO_GET     tt_service_get_cmap_info\n#define SFNT_SERVICES_GET            sfnt_services\n#define TT_CMAP_CLASSES_GET          tt_cmap_classes\n#define SFNT_SERVICE_SFNT_TABLE_GET  sfnt_service_sfnt_table\n#define SFNT_SERVICE_BDF_GET         sfnt_service_bdf\n#define SFNT_INTERFACE_GET           sfnt_interface\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  /* some include files required for members of sfntModulePIC */\n#include FT_SERVICE_GLYPH_DICT_H\n#include FT_SERVICE_POSTSCRIPT_NAME_H\n#include FT_SERVICE_SFNT_H\n#include FT_SERVICE_TT_CMAP_H\n\n#ifdef TT_CONFIG_OPTION_BDF\n#include \"ttbdf.h\"\n#include FT_SERVICE_BDF_H\n#endif\n\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_SFNT_H\n#include \"ttcmap.h\"\n\n\n  typedef struct  sfntModulePIC_\n  {\n    FT_ServiceDescRec*        sfnt_services;\n    FT_Service_GlyphDictRec   sfnt_service_glyph_dict;\n    FT_Service_PsFontNameRec  sfnt_service_ps_name;\n    FT_Service_TTCMapsRec     tt_service_get_cmap_info;\n    TT_CMap_Class*            tt_cmap_classes;\n    FT_Service_SFNT_TableRec  sfnt_service_sfnt_table;\n#ifdef TT_CONFIG_OPTION_BDF\n    FT_Service_BDFRec         sfnt_service_bdf;\n#endif\n    SFNT_Interface            sfnt_interface;\n\n  } sfntModulePIC;\n\n\n#define GET_PIC( lib )                                      \\\n          ( (sfntModulePIC*)( (lib)->pic_container.sfnt ) )\n\n#define SFNT_SERVICES_GET                       \\\n          ( GET_PIC( library )->sfnt_services )\n#define SFNT_SERVICE_GLYPH_DICT_GET                       \\\n          ( GET_PIC( library )->sfnt_service_glyph_dict )\n#define SFNT_SERVICE_PS_NAME_GET                       \\\n          ( GET_PIC( library )->sfnt_service_ps_name )\n#define TT_SERVICE_CMAP_INFO_GET                           \\\n          ( GET_PIC( library )->tt_service_get_cmap_info )\n#define SFNT_SERVICES_GET                       \\\n          ( GET_PIC( library )->sfnt_services )\n#define TT_CMAP_CLASSES_GET                       \\\n          ( GET_PIC( library )->tt_cmap_classes )\n#define SFNT_SERVICE_SFNT_TABLE_GET                       \\\n          ( GET_PIC( library )->sfnt_service_sfnt_table )\n#define SFNT_SERVICE_BDF_GET                       \\\n          ( GET_PIC( library )->sfnt_service_bdf )\n#define SFNT_INTERFACE_GET                       \\\n          ( GET_PIC( library )->sfnt_interface )\n\n\n  /* see sfntpic.c for the implementation */\n  void\n  sfnt_module_class_pic_free( FT_Library  library );\n\n  FT_Error\n  sfnt_module_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n  /* */\n\nFT_END_HEADER\n\n#endif /* __SFNTPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/sfobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfobjs.c                                                               */\n/*                                                                         */\n/*    SFNT object management (base).                                       */\n/*                                                                         */\n/*  Copyright 1996-2008, 2010-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include \"sfobjs.h\"\n#include \"ttload.h\"\n#include \"ttcmap.h\"\n#include \"ttkern.h\"\n#include FT_INTERNAL_SFNT_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_TRUETYPE_IDS_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n#include FT_SFNT_NAMES_H\n#include \"sferrors.h\"\n\n#ifdef TT_CONFIG_OPTION_BDF\n#include \"ttbdf.h\"\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_sfobjs\n\n\n\n  /* convert a UTF-16 name entry to ASCII */\n  static FT_String*\n  tt_name_entry_ascii_from_utf16( TT_NameEntry  entry,\n                                  FT_Memory     memory )\n  {\n    FT_String*  string = NULL;\n    FT_UInt     len, code, n;\n    FT_Byte*    read   = (FT_Byte*)entry->string;\n    FT_Error    error;\n\n\n    len = (FT_UInt)entry->stringLength / 2;\n\n    if ( FT_NEW_ARRAY( string, len + 1 ) )\n      return NULL;\n\n    for ( n = 0; n < len; n++ )\n    {\n      code = FT_NEXT_USHORT( read );\n\n      if ( code == 0 )\n        break;\n\n      if ( code < 32 || code > 127 )\n        code = '?';\n\n      string[n] = (char)code;\n    }\n\n    string[n] = 0;\n\n    return string;\n  }\n\n\n  /* convert an Apple Roman or symbol name entry to ASCII */\n  static FT_String*\n  tt_name_entry_ascii_from_other( TT_NameEntry  entry,\n                                  FT_Memory     memory )\n  {\n    FT_String*  string = NULL;\n    FT_UInt     len, code, n;\n    FT_Byte*    read   = (FT_Byte*)entry->string;\n    FT_Error    error;\n\n\n    len = (FT_UInt)entry->stringLength;\n\n    if ( FT_NEW_ARRAY( string, len + 1 ) )\n      return NULL;\n\n    for ( n = 0; n < len; n++ )\n    {\n      code = *read++;\n\n      if ( code == 0 )\n        break;\n\n      if ( code < 32 || code > 127 )\n        code = '?';\n\n      string[n] = (char)code;\n    }\n\n    string[n] = 0;\n\n    return string;\n  }\n\n\n  typedef FT_String*  (*TT_NameEntry_ConvertFunc)( TT_NameEntry  entry,\n                                                   FT_Memory     memory );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_get_name                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Returns a given ENGLISH name record in ASCII.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the source face object.                      */\n  /*                                                                       */\n  /*    nameid :: The name id of the name record to return.                */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    name   :: The address of a string pointer.  NULL if no name is     */\n  /*              present.                                                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  tt_face_get_name( TT_Face      face,\n                    FT_UShort    nameid,\n                    FT_String**  name )\n  {\n    FT_Memory         memory = face->root.memory;\n    FT_Error          error  = FT_Err_Ok;\n    FT_String*        result = NULL;\n    FT_UShort         n;\n    TT_NameEntryRec*  rec;\n    FT_Int            found_apple         = -1;\n    FT_Int            found_apple_roman   = -1;\n    FT_Int            found_apple_english = -1;\n    FT_Int            found_win           = -1;\n    FT_Int            found_unicode       = -1;\n\n    FT_Bool           is_english = 0;\n\n    TT_NameEntry_ConvertFunc  convert;\n\n\n    FT_ASSERT( name );\n\n    rec = face->name_table.names;\n    for ( n = 0; n < face->num_names; n++, rec++ )\n    {\n      /* According to the OpenType 1.3 specification, only Microsoft or  */\n      /* Apple platform IDs might be used in the `name' table.  The      */\n      /* `Unicode' platform is reserved for the `cmap' table, and the    */\n      /* `ISO' one is deprecated.                                        */\n      /*                                                                 */\n      /* However, the Apple TrueType specification doesn't say the same  */\n      /* thing and goes to suggest that all Unicode `name' table entries */\n      /* should be coded in UTF-16 (in big-endian format I suppose).     */\n      /*                                                                 */\n      if ( rec->nameID == nameid && rec->stringLength > 0 )\n      {\n        switch ( rec->platformID )\n        {\n        case TT_PLATFORM_APPLE_UNICODE:\n        case TT_PLATFORM_ISO:\n          /* there is `languageID' to check there.  We should use this */\n          /* field only as a last solution when nothing else is        */\n          /* available.                                                */\n          /*                                                           */\n          found_unicode = n;\n          break;\n\n        case TT_PLATFORM_MACINTOSH:\n          /* This is a bit special because some fonts will use either    */\n          /* an English language id, or a Roman encoding id, to indicate */\n          /* the English version of its font name.                       */\n          /*                                                             */\n          if ( rec->languageID == TT_MAC_LANGID_ENGLISH )\n            found_apple_english = n;\n          else if ( rec->encodingID == TT_MAC_ID_ROMAN )\n            found_apple_roman = n;\n          break;\n\n        case TT_PLATFORM_MICROSOFT:\n          /* we only take a non-English name when there is nothing */\n          /* else available in the font                            */\n          /*                                                       */\n          if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 )\n          {\n            switch ( rec->encodingID )\n            {\n            case TT_MS_ID_SYMBOL_CS:\n            case TT_MS_ID_UNICODE_CS:\n            case TT_MS_ID_UCS_4:\n              is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 );\n              found_win  = n;\n              break;\n\n            default:\n              ;\n            }\n          }\n          break;\n\n        default:\n          ;\n        }\n      }\n    }\n\n    found_apple = found_apple_roman;\n    if ( found_apple_english >= 0 )\n      found_apple = found_apple_english;\n\n    /* some fonts contain invalid Unicode or Macintosh formatted entries; */\n    /* we will thus favor names encoded in Windows formats if available   */\n    /* (provided it is an English name)                                   */\n    /*                                                                    */\n    convert = NULL;\n    if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) )\n    {\n      rec = face->name_table.names + found_win;\n      switch ( rec->encodingID )\n      {\n        /* all Unicode strings are encoded using UTF-16BE */\n      case TT_MS_ID_UNICODE_CS:\n      case TT_MS_ID_SYMBOL_CS:\n        convert = tt_name_entry_ascii_from_utf16;\n        break;\n\n      case TT_MS_ID_UCS_4:\n        /* Apparently, if this value is found in a name table entry, it is */\n        /* documented as `full Unicode repertoire'.  Experience with the   */\n        /* MsGothic font shipped with Windows Vista shows that this really */\n        /* means UTF-16 encoded names (UCS-4 values are only used within   */\n        /* charmaps).                                                      */\n        convert = tt_name_entry_ascii_from_utf16;\n        break;\n\n      default:\n        ;\n      }\n    }\n    else if ( found_apple >= 0 )\n    {\n      rec     = face->name_table.names + found_apple;\n      convert = tt_name_entry_ascii_from_other;\n    }\n    else if ( found_unicode >= 0 )\n    {\n      rec     = face->name_table.names + found_unicode;\n      convert = tt_name_entry_ascii_from_utf16;\n    }\n\n    if ( rec && convert )\n    {\n      if ( rec->string == NULL )\n      {\n        FT_Stream  stream = face->name_table.stream;\n\n\n        if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||\n             FT_STREAM_SEEK( rec->stringOffset )              ||\n             FT_STREAM_READ( rec->string, rec->stringLength ) )\n        {\n          FT_FREE( rec->string );\n          rec->stringLength = 0;\n          result            = NULL;\n          goto Exit;\n        }\n      }\n\n      result = convert( rec, memory );\n    }\n\n  Exit:\n    *name = result;\n    return error;\n  }\n\n\n  static FT_Encoding\n  sfnt_find_encoding( int  platform_id,\n                      int  encoding_id )\n  {\n    typedef struct  TEncoding_\n    {\n      int          platform_id;\n      int          encoding_id;\n      FT_Encoding  encoding;\n\n    } TEncoding;\n\n    static\n    const TEncoding  tt_encodings[] =\n    {\n      { TT_PLATFORM_ISO,           -1,                  FT_ENCODING_UNICODE },\n\n      { TT_PLATFORM_APPLE_UNICODE, -1,                  FT_ENCODING_UNICODE },\n\n      { TT_PLATFORM_MACINTOSH,     TT_MAC_ID_ROMAN,     FT_ENCODING_APPLE_ROMAN },\n\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SYMBOL_CS,  FT_ENCODING_MS_SYMBOL },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UCS_4,      FT_ENCODING_UNICODE },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SJIS,       FT_ENCODING_SJIS },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_GB2312,     FT_ENCODING_GB2312 },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_BIG_5,      FT_ENCODING_BIG5 },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_WANSUNG,    FT_ENCODING_WANSUNG },\n      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_JOHAB,      FT_ENCODING_JOHAB }\n    };\n\n    const TEncoding  *cur, *limit;\n\n\n    cur   = tt_encodings;\n    limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );\n\n    for ( ; cur < limit; cur++ )\n    {\n      if ( cur->platform_id == platform_id )\n      {\n        if ( cur->encoding_id == encoding_id ||\n             cur->encoding_id == -1          )\n          return cur->encoding;\n      }\n    }\n\n    return FT_ENCODING_NONE;\n  }\n\n\n  /* Fill in face->ttc_header.  If the font is not a TTC, it is */\n  /* synthesized into a TTC with one offset table.              */\n  static FT_Error\n  sfnt_open_font( FT_Stream  stream,\n                  TT_Face    face )\n  {\n    FT_Memory  memory = stream->memory;\n    FT_Error   error;\n    FT_ULong   tag, offset;\n\n    static const FT_Frame_Field  ttc_header_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TTC_HeaderRec\n\n      FT_FRAME_START( 8 ),\n        FT_FRAME_LONG( version ),\n        FT_FRAME_LONG( count   ),  /* this is ULong in the specs */\n      FT_FRAME_END\n    };\n\n\n    face->ttc_header.tag     = 0;\n    face->ttc_header.version = 0;\n    face->ttc_header.count   = 0;\n\n    offset = FT_STREAM_POS();\n\n    if ( FT_READ_ULONG( tag ) )\n      return error;\n\n    if ( tag != 0x00010000UL &&\n         tag != TTAG_ttcf    &&\n         tag != TTAG_OTTO    &&\n         tag != TTAG_true    &&\n         tag != TTAG_typ1    &&\n         tag != 0x00020000UL )\n    {\n      FT_TRACE2(( \"  not a font using the SFNT container format\\n\" ));\n      return FT_THROW( Unknown_File_Format );\n    }\n\n    face->ttc_header.tag = TTAG_ttcf;\n\n    if ( tag == TTAG_ttcf )\n    {\n      FT_Int  n;\n\n\n      FT_TRACE3(( \"sfnt_open_font: file is a collection\\n\" ));\n\n      if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) )\n        return error;\n\n      if ( face->ttc_header.count == 0 )\n        return FT_THROW( Invalid_Table );\n\n      /* a rough size estimate: let's conservatively assume that there   */\n      /* is just a single table info in each subfont header (12 + 16*1 = */\n      /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */\n      /* size of the TTC header plus `28*count' bytes for all subfont    */\n      /* headers                                                         */\n      if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) )\n        return FT_THROW( Array_Too_Large );\n\n      /* now read the offsets of each font in the file */\n      if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) )\n        return error;\n\n      if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) )\n        return error;\n\n      for ( n = 0; n < face->ttc_header.count; n++ )\n        face->ttc_header.offsets[n] = FT_GET_ULONG();\n\n      FT_FRAME_EXIT();\n    }\n    else\n    {\n      FT_TRACE3(( \"sfnt_open_font: synthesize TTC\\n\" ));\n\n      face->ttc_header.version = 1 << 16;\n      face->ttc_header.count   = 1;\n\n      if ( FT_NEW( face->ttc_header.offsets ) )\n        return error;\n\n      face->ttc_header.offsets[0] = offset;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  sfnt_init_face( FT_Stream      stream,\n                  TT_Face        face,\n                  FT_Int         face_index,\n                  FT_Int         num_params,\n                  FT_Parameter*  params )\n  {\n    FT_Error        error;\n    FT_Library      library = face->root.driver->root.library;\n    SFNT_Service    sfnt;\n\n\n    /* for now, parameters are unused */\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n\n\n    sfnt = (SFNT_Service)face->sfnt;\n    if ( !sfnt )\n    {\n      sfnt = (SFNT_Service)FT_Get_Module_Interface( library, \"sfnt\" );\n      if ( !sfnt )\n      {\n        FT_ERROR(( \"sfnt_init_face: cannot access `sfnt' module\\n\" ));\n        return FT_THROW( Missing_Module );\n      }\n\n      face->sfnt       = sfnt;\n      face->goto_table = sfnt->goto_table;\n    }\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS );\n\n    FT_TRACE2(( \"SFNT driver\\n\" ));\n\n    error = sfnt_open_font( stream, face );\n    if ( error )\n      return error;\n\n    FT_TRACE2(( \"sfnt_init_face: %08p, %ld\\n\", face, face_index ));\n\n    if ( face_index < 0 )\n      face_index = 0;\n\n    if ( face_index >= face->ttc_header.count )\n      return FT_THROW( Invalid_Argument );\n\n    if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) )\n      return error;\n\n    /* check that we have a valid TrueType file */\n    error = sfnt->load_font_dir( face, stream );\n    if ( error )\n      return error;\n\n    face->root.num_faces  = face->ttc_header.count;\n    face->root.face_index = face_index;\n\n    return error;\n  }\n\n\n#define LOAD_( x )                                          \\\n  do {                                                      \\\n    FT_TRACE2(( \"`\" #x \"' \" ));                             \\\n    FT_TRACE3(( \"-->\\n\" ));                                 \\\n                                                            \\\n    error = sfnt->load_ ## x( face, stream );               \\\n                                                            \\\n    FT_TRACE2(( \"%s\\n\", ( !error )                          \\\n                        ? \"loaded\"                          \\\n                        : FT_ERR_EQ( error, Table_Missing ) \\\n                          ? \"missing\"                       \\\n                          : \"failed to load\" ));            \\\n    FT_TRACE3(( \"\\n\" ));                                    \\\n  } while ( 0 )\n\n#define LOADM_( x, vertical )                               \\\n  do {                                                      \\\n    FT_TRACE2(( \"`%s\" #x \"' \",                              \\\n                vertical ? \"vertical \" : \"\" ));             \\\n    FT_TRACE3(( \"-->\\n\" ));                                 \\\n                                                            \\\n    error = sfnt->load_ ## x( face, stream, vertical );     \\\n                                                            \\\n    FT_TRACE2(( \"%s\\n\", ( !error )                          \\\n                        ? \"loaded\"                          \\\n                        : FT_ERR_EQ( error, Table_Missing ) \\\n                          ? \"missing\"                       \\\n                          : \"failed to load\" ));            \\\n    FT_TRACE3(( \"\\n\" ));                                    \\\n  } while ( 0 )\n\n#define GET_NAME( id, field )                                   \\\n  do {                                                          \\\n    error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \\\n    if ( error )                                                \\\n      goto Exit;                                                \\\n  } while ( 0 )\n\n\n  FT_LOCAL_DEF( FT_Error )\n  sfnt_load_face( FT_Stream      stream,\n                  TT_Face        face,\n                  FT_Int         face_index,\n                  FT_Int         num_params,\n                  FT_Parameter*  params )\n  {\n    FT_Error      error;\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n    FT_Error      psnames_error;\n#endif\n    FT_Bool       has_outline;\n    FT_Bool       is_apple_sbit;\n    FT_Bool       ignore_preferred_family    = FALSE;\n    FT_Bool       ignore_preferred_subfamily = FALSE;\n\n    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;\n\n    FT_UNUSED( face_index );\n\n\n    /* Check parameters */\n\n    {\n      FT_Int  i;\n\n\n      for ( i = 0; i < num_params; i++ )\n      {\n        if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY )\n          ignore_preferred_family = TRUE;\n        else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY )\n          ignore_preferred_subfamily = TRUE;\n      }\n    }\n\n    /* Load tables */\n\n    /* We now support two SFNT-based bitmapped font formats.  They */\n    /* are recognized easily as they do not include a `glyf'       */\n    /* table.                                                      */\n    /*                                                             */\n    /* The first format comes from Apple, and uses a table named   */\n    /* `bhed' instead of `head' to store the font header (using    */\n    /* the same format).  It also doesn't include horizontal and   */\n    /* vertical metrics tables (i.e. `hhea' and `vhea' tables are  */\n    /* missing).                                                   */\n    /*                                                             */\n    /* The other format comes from Microsoft, and is used with     */\n    /* WinCE/PocketPC.  It looks like a standard TTF, except that  */\n    /* it doesn't contain outlines.                                */\n    /*                                                             */\n\n    FT_TRACE2(( \"sfnt_load_face: %08p\\n\\n\", face ));\n\n    /* do we have outlines in there? */\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 ||\n                           tt_face_lookup_table( face, TTAG_glyf )    != 0 ||\n                           tt_face_lookup_table( face, TTAG_CFF )     != 0 );\n#else\n    has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 ||\n                           tt_face_lookup_table( face, TTAG_CFF )  != 0 );\n#endif\n\n    is_apple_sbit = 0;\n\n    /* if this font doesn't contain outlines, we try to load */\n    /* a `bhed' table                                        */\n    if ( !has_outline && sfnt->load_bhed )\n    {\n      LOAD_( bhed );\n      is_apple_sbit = FT_BOOL( !error );\n    }\n\n    /* load the font header (`head' table) if this isn't an Apple */\n    /* sbit font file                                             */\n    if ( !is_apple_sbit )\n    {\n      LOAD_( head );\n      if ( error )\n        goto Exit;\n    }\n\n    if ( face->header.Units_Per_EM == 0 )\n    {\n      error = FT_THROW( Invalid_Table );\n\n      goto Exit;\n    }\n\n    /* the following tables are often not present in embedded TrueType */\n    /* fonts within PDF documents, so don't check for them.            */\n    LOAD_( maxp );\n    LOAD_( cmap );\n\n    /* the following tables are optional in PCL fonts -- */\n    /* don't check for errors                            */\n    LOAD_( name );\n    LOAD_( post );\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n    psnames_error = error;\n#endif\n\n    /* do not load the metrics headers and tables if this is an Apple */\n    /* sbit font file                                                 */\n    if ( !is_apple_sbit )\n    {\n      /* load the `hhea' and `hmtx' tables */\n      LOADM_( hhea, 0 );\n      if ( !error )\n      {\n        LOADM_( hmtx, 0 );\n        if ( FT_ERR_EQ( error, Table_Missing ) )\n        {\n          error = FT_THROW( Hmtx_Table_Missing );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n          /* If this is an incrementally loaded font and there are */\n          /* overriding metrics, tolerate a missing `hmtx' table.  */\n          if ( face->root.internal->incremental_interface          &&\n               face->root.internal->incremental_interface->funcs->\n                 get_glyph_metrics                                 )\n          {\n            face->horizontal.number_Of_HMetrics = 0;\n            error                               = FT_Err_Ok;\n          }\n#endif\n        }\n      }\n      else if ( FT_ERR_EQ( error, Table_Missing ) )\n      {\n        /* No `hhea' table necessary for SFNT Mac fonts. */\n        if ( face->format_tag == TTAG_true )\n        {\n          FT_TRACE2(( \"This is an SFNT Mac font.\\n\" ));\n\n          has_outline = 0;\n          error       = FT_Err_Ok;\n        }\n        else\n        {\n          error = FT_THROW( Horiz_Header_Missing );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n          /* If this is an incrementally loaded font and there are */\n          /* overriding metrics, tolerate a missing `hhea' table.  */\n          if ( face->root.internal->incremental_interface          &&\n               face->root.internal->incremental_interface->funcs->\n                 get_glyph_metrics                                 )\n          {\n            face->horizontal.number_Of_HMetrics = 0;\n            error                               = FT_Err_Ok;\n          }\n#endif\n\n        }\n      }\n\n      if ( error )\n        goto Exit;\n\n      /* try to load the `vhea' and `vmtx' tables */\n      LOADM_( hhea, 1 );\n      if ( !error )\n      {\n        LOADM_( hmtx, 1 );\n        if ( !error )\n          face->vertical_info = 1;\n      }\n\n      if ( error && FT_ERR_NEQ( error, Table_Missing ) )\n        goto Exit;\n\n      LOAD_( os2 );\n      if ( error )\n      {\n        /* we treat the table as missing if there are any errors */\n        face->os2.version = 0xFFFFU;\n      }\n    }\n\n    /* the optional tables */\n\n    /* embedded bitmap support */\n    if ( sfnt->load_eblc )\n    {\n      LOAD_( eblc );\n      if ( error )\n      {\n        /* a font which contains neither bitmaps nor outlines is */\n        /* still valid (although rather useless in most cases);  */\n        /* however, you can find such stripped fonts in PDFs     */\n        if ( FT_ERR_EQ( error, Table_Missing ) )\n          error = FT_Err_Ok;\n        else\n          goto Exit;\n      }\n    }\n\n    LOAD_( pclt );\n    if ( error )\n    {\n      if ( FT_ERR_NEQ( error, Table_Missing ) )\n        goto Exit;\n\n      face->pclt.Version = 0;\n    }\n\n    /* consider the kerning and gasp tables as optional */\n    LOAD_( gasp );\n    LOAD_( kern );\n\n    face->root.num_glyphs = face->max_profile.numGlyphs;\n\n    /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes  */\n    /* a WWS-only font face.  `WWS' stands for `weight', width', and */\n    /* `slope', a term used by Microsoft's Windows Presentation      */\n    /* Foundation (WPF).  This flag has been introduced in version   */\n    /* 1.5 of the OpenType specification (May 2008).                 */\n\n    face->root.family_name = NULL;\n    face->root.style_name  = NULL;\n    if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 )\n    {\n      if ( !ignore_preferred_family )\n        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );\n      if ( !face->root.family_name )\n        GET_NAME( FONT_FAMILY, &face->root.family_name );\n\n      if ( !ignore_preferred_subfamily )\n        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );\n      if ( !face->root.style_name )\n        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );\n    }\n    else\n    {\n      GET_NAME( WWS_FAMILY, &face->root.family_name );\n      if ( !face->root.family_name && !ignore_preferred_family )\n        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );\n      if ( !face->root.family_name )\n        GET_NAME( FONT_FAMILY, &face->root.family_name );\n\n      GET_NAME( WWS_SUBFAMILY, &face->root.style_name );\n      if ( !face->root.style_name && !ignore_preferred_subfamily )\n        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );\n      if ( !face->root.style_name )\n        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );\n    }\n\n    /* now set up root fields */\n    {\n      FT_Face  root  = &face->root;\n      FT_Long  flags = root->face_flags;\n\n\n      /*********************************************************************/\n      /*                                                                   */\n      /* Compute face flags.                                               */\n      /*                                                                   */\n      if ( has_outline == TRUE )\n        flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */\n\n      /* The sfnt driver only supports bitmap fonts natively, thus we */\n      /* don't set FT_FACE_FLAG_HINTER.                               */\n      flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */\n               FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */\n\n#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n      if ( !psnames_error                             &&\n           face->postscript.FormatType != 0x00030000L )\n        flags |= FT_FACE_FLAG_GLYPH_NAMES;\n#endif\n\n      /* fixed width font? */\n      if ( face->postscript.isFixedPitch )\n        flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      /* vertical information? */\n      if ( face->vertical_info )\n        flags |= FT_FACE_FLAG_VERTICAL;\n\n      /* kerning available ? */\n      if ( TT_FACE_HAS_KERNING( face ) )\n        flags |= FT_FACE_FLAG_KERNING;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n      /* Don't bother to load the tables unless somebody asks for them. */\n      /* No need to do work which will (probably) not be used.          */\n      if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&\n           tt_face_lookup_table( face, TTAG_fvar ) != 0 &&\n           tt_face_lookup_table( face, TTAG_gvar ) != 0 )\n        flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;\n#endif\n\n      root->face_flags = flags;\n\n      /*********************************************************************/\n      /*                                                                   */\n      /* Compute style flags.                                              */\n      /*                                                                   */\n\n      flags = 0;\n      if ( has_outline == TRUE && face->os2.version != 0xFFFFU )\n      {\n        /* We have an OS/2 table; use the `fsSelection' field.  Bit 9 */\n        /* indicates an oblique font face.  This flag has been        */\n        /* introduced in version 1.5 of the OpenType specification.   */\n\n        if ( face->os2.fsSelection & 512 )       /* bit 9 */\n          flags |= FT_STYLE_FLAG_ITALIC;\n        else if ( face->os2.fsSelection & 1 )    /* bit 0 */\n          flags |= FT_STYLE_FLAG_ITALIC;\n\n        if ( face->os2.fsSelection & 32 )        /* bit 5 */\n          flags |= FT_STYLE_FLAG_BOLD;\n      }\n      else\n      {\n        /* this is an old Mac font, use the header field */\n\n        if ( face->header.Mac_Style & 1 )\n          flags |= FT_STYLE_FLAG_BOLD;\n\n        if ( face->header.Mac_Style & 2 )\n          flags |= FT_STYLE_FLAG_ITALIC;\n      }\n\n      root->style_flags = flags;\n\n      /*********************************************************************/\n      /*                                                                   */\n      /* Polish the charmaps.                                              */\n      /*                                                                   */\n      /*   Try to set the charmap encoding according to the platform &     */\n      /*   encoding ID of each charmap.                                    */\n      /*                                                                   */\n\n      tt_face_build_cmaps( face );  /* ignore errors */\n\n\n      /* set the encoding fields */\n      {\n        FT_Int  m;\n\n\n        for ( m = 0; m < root->num_charmaps; m++ )\n        {\n          FT_CharMap  charmap = root->charmaps[m];\n\n\n          charmap->encoding = sfnt_find_encoding( charmap->platform_id,\n                                                  charmap->encoding_id );\n\n#if 0\n          if ( root->charmap     == NULL &&\n               charmap->encoding == FT_ENCODING_UNICODE )\n          {\n            /* set 'root->charmap' to the first Unicode encoding we find */\n            root->charmap = charmap;\n          }\n#endif\n        }\n      }\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n      /*\n       *  Now allocate the root array of FT_Bitmap_Size records and\n       *  populate them.  Unfortunately, it isn't possible to indicate bit\n       *  depths in the FT_Bitmap_Size record.  This is a design error.\n       */\n      {\n        FT_UInt  i, count;\n\n\n#ifndef FT_CONFIG_OPTION_OLD_INTERNALS\n        count = face->sbit_num_strikes;\n#else\n        count = (FT_UInt)face->num_sbit_strikes;\n#endif\n\n        if ( count > 0 )\n        {\n          FT_Memory        memory   = face->root.stream->memory;\n          FT_UShort        em_size  = face->header.Units_Per_EM;\n          FT_Short         avgwidth = face->os2.xAvgCharWidth;\n          FT_Size_Metrics  metrics;\n\n\n          if ( em_size == 0 || face->os2.version == 0xFFFFU )\n          {\n            avgwidth = 0;\n            em_size = 1;\n          }\n\n          if ( FT_NEW_ARRAY( root->available_sizes, count ) )\n            goto Exit;\n\n          for ( i = 0; i < count; i++ )\n          {\n            FT_Bitmap_Size*  bsize = root->available_sizes + i;\n\n\n            error = sfnt->load_strike_metrics( face, i, &metrics );\n            if ( error )\n              goto Exit;\n\n            bsize->height = (FT_Short)( metrics.height >> 6 );\n            bsize->width = (FT_Short)(\n                ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );\n\n            bsize->x_ppem = metrics.x_ppem << 6;\n            bsize->y_ppem = metrics.y_ppem << 6;\n\n            /* assume 72dpi */\n            bsize->size   = metrics.y_ppem << 6;\n          }\n\n          root->face_flags     |= FT_FACE_FLAG_FIXED_SIZES;\n          root->num_fixed_sizes = (FT_Int)count;\n        }\n      }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n      /* a font with no bitmaps and no outlines is scalable; */\n      /* it has only empty glyphs then                       */\n      if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )\n        root->face_flags |= FT_FACE_FLAG_SCALABLE;\n\n\n      /*********************************************************************/\n      /*                                                                   */\n      /*  Set up metrics.                                                  */\n      /*                                                                   */\n      if ( FT_IS_SCALABLE( root ) )\n      {\n        /* XXX What about if outline header is missing */\n        /*     (e.g. sfnt wrapped bitmap)?             */\n        root->bbox.xMin    = face->header.xMin;\n        root->bbox.yMin    = face->header.yMin;\n        root->bbox.xMax    = face->header.xMax;\n        root->bbox.yMax    = face->header.yMax;\n        root->units_per_EM = face->header.Units_Per_EM;\n\n\n        /* XXX: Computing the ascender/descender/height is very different */\n        /*      from what the specification tells you.  Apparently, we    */\n        /*      must be careful because                                   */\n        /*                                                                */\n        /*      - not all fonts have an OS/2 table; in this case, we take */\n        /*        the values in the horizontal header.  However, these    */\n        /*        values very often are not reliable.                     */\n        /*                                                                */\n        /*      - otherwise, the correct typographic values are in the    */\n        /*        sTypoAscender, sTypoDescender & sTypoLineGap fields.    */\n        /*                                                                */\n        /*        However, certain fonts have these fields set to 0.      */\n        /*        Rather, they have usWinAscent & usWinDescent correctly  */\n        /*        set (but with different values).                        */\n        /*                                                                */\n        /*      As an example, Arial Narrow is implemented through four   */\n        /*      files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */\n        /*                                                                */\n        /*      Strangely, all fonts have the same values in their        */\n        /*      sTypoXXX fields, except ARIALNB which sets them to 0.     */\n        /*                                                                */\n        /*      On the other hand, they all have different                */\n        /*      usWinAscent/Descent values -- as a conclusion, the OS/2   */\n        /*      table cannot be used to compute the text height reliably! */\n        /*                                                                */\n\n        /* The ascender and descender are taken from the `hhea' table. */\n        /* If zero, they are taken from the `OS/2' table.              */\n\n        root->ascender  = face->horizontal.Ascender;\n        root->descender = face->horizontal.Descender;\n\n        root->height = (FT_Short)( root->ascender - root->descender +\n                                   face->horizontal.Line_Gap );\n\n        if ( !( root->ascender || root->descender ) )\n        {\n          if ( face->os2.version != 0xFFFFU )\n          {\n            if ( face->os2.sTypoAscender || face->os2.sTypoDescender )\n            {\n              root->ascender  = face->os2.sTypoAscender;\n              root->descender = face->os2.sTypoDescender;\n\n              root->height = (FT_Short)( root->ascender - root->descender +\n                                         face->os2.sTypoLineGap );\n            }\n            else\n            {\n              root->ascender  =  (FT_Short)face->os2.usWinAscent;\n              root->descender = -(FT_Short)face->os2.usWinDescent;\n\n              root->height = (FT_UShort)( root->ascender - root->descender );\n            }\n          }\n        }\n\n        root->max_advance_width  = face->horizontal.advance_Width_Max;\n        root->max_advance_height = (FT_Short)( face->vertical_info\n                                     ? face->vertical.advance_Height_Max\n                                     : root->height );\n\n        /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */\n        /* Adjust underline position from top edge to centre of     */\n        /* stroke to convert TrueType meaning to FreeType meaning.  */\n        root->underline_position  = face->postscript.underlinePosition -\n                                    face->postscript.underlineThickness / 2;\n        root->underline_thickness = face->postscript.underlineThickness;\n      }\n\n    }\n\n  Exit:\n    FT_TRACE2(( \"sfnt_load_face: done\\n\" ));\n\n    return error;\n  }\n\n\n#undef LOAD_\n#undef LOADM_\n#undef GET_NAME\n\n\n  FT_LOCAL_DEF( void )\n  sfnt_done_face( TT_Face  face )\n  {\n    FT_Memory     memory;\n    SFNT_Service  sfnt;\n\n\n    if ( !face )\n      return;\n\n    memory = face->root.memory;\n    sfnt   = (SFNT_Service)face->sfnt;\n\n    if ( sfnt )\n    {\n      /* destroy the postscript names table if it is loaded */\n      if ( sfnt->free_psnames )\n        sfnt->free_psnames( face );\n\n      /* destroy the embedded bitmaps table if it is loaded */\n      if ( sfnt->free_eblc )\n        sfnt->free_eblc( face );\n    }\n\n#ifdef TT_CONFIG_OPTION_BDF\n    /* freeing the embedded BDF properties */\n    tt_face_free_bdf_props( face );\n#endif\n\n    /* freeing the kerning table */\n    tt_face_done_kern( face );\n\n    /* freeing the collection table */\n    FT_FREE( face->ttc_header.offsets );\n    face->ttc_header.count = 0;\n\n    /* freeing table directory */\n    FT_FREE( face->dir_tables );\n    face->num_tables = 0;\n\n    {\n      FT_Stream  stream = FT_FACE_STREAM( face );\n\n\n      /* simply release the 'cmap' table frame */\n      FT_FRAME_RELEASE( face->cmap_table );\n      face->cmap_size = 0;\n    }\n\n    /* freeing the horizontal metrics */\n#ifndef FT_CONFIG_OPTION_OLD_INTERNALS\n    {\n      FT_Stream  stream = FT_FACE_STREAM( face );\n\n\n      FT_FRAME_RELEASE( face->horz_metrics );\n      FT_FRAME_RELEASE( face->vert_metrics );\n      face->horz_metrics_size = 0;\n      face->vert_metrics_size = 0;\n    }\n#else\n    FT_FREE( face->horizontal.long_metrics );\n    FT_FREE( face->horizontal.short_metrics );\n#endif\n\n    /* freeing the vertical ones, if any */\n    if ( face->vertical_info )\n    {\n      FT_FREE( face->vertical.long_metrics  );\n      FT_FREE( face->vertical.short_metrics );\n      face->vertical_info = 0;\n    }\n\n    /* freeing the gasp table */\n    FT_FREE( face->gasp.gaspRanges );\n    face->gasp.numRanges = 0;\n\n    /* freeing the name table */\n    if ( sfnt )\n      sfnt->free_name( face );\n\n    /* freeing family and style name */\n    FT_FREE( face->root.family_name );\n    FT_FREE( face->root.style_name );\n\n    /* freeing sbit size table */\n    FT_FREE( face->root.available_sizes );\n    face->root.num_fixed_sizes = 0;\n\n    FT_FREE( face->postscript_name );\n\n    face->sfnt = 0;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/sfobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  sfobjs.h                                                               */\n/*                                                                         */\n/*    SFNT object management (specification).                              */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __SFOBJS_H__\n#define __SFOBJS_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_SFNT_H\n#include FT_INTERNAL_OBJECTS_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  sfnt_init_face( FT_Stream      stream,\n                  TT_Face        face,\n                  FT_Int         face_index,\n                  FT_Int         num_params,\n                  FT_Parameter*  params );\n\n  FT_LOCAL( FT_Error )\n  sfnt_load_face( FT_Stream      stream,\n                  TT_Face        face,\n                  FT_Int         face_index,\n                  FT_Int         num_params,\n                  FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  sfnt_done_face( TT_Face  face );\n\n\nFT_END_HEADER\n\n#endif /* __SFDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttbdf.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttbdf.c                                                                */\n/*                                                                         */\n/*    TrueType and OpenType embedded BDF properties (body).                */\n/*                                                                         */\n/*  Copyright 2005, 2006, 2010, 2013 by                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n#include \"ttbdf.h\"\n\n#include \"sferrors.h\"\n\n\n#ifdef TT_CONFIG_OPTION_BDF\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttbdf\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_free_bdf_props( TT_Face  face )\n  {\n    TT_BDF  bdf = &face->bdf;\n\n\n    if ( bdf->loaded )\n    {\n      FT_Stream  stream = FT_FACE(face)->stream;\n\n\n      if ( bdf->table != NULL )\n        FT_FRAME_RELEASE( bdf->table );\n\n      bdf->table_end    = NULL;\n      bdf->strings      = NULL;\n      bdf->strings_size = 0;\n    }\n  }\n\n\n  static FT_Error\n  tt_face_load_bdf_props( TT_Face    face,\n                          FT_Stream  stream )\n  {\n    TT_BDF    bdf = &face->bdf;\n    FT_ULong  length;\n    FT_Error  error;\n\n\n    FT_ZERO( bdf );\n\n    error = tt_face_goto_table( face, TTAG_BDF, stream, &length );\n    if ( error                                  ||\n         length < 8                             ||\n         FT_FRAME_EXTRACT( length, bdf->table ) )\n    {\n      error = FT_THROW( Invalid_Table );\n      goto Exit;\n    }\n\n    bdf->table_end = bdf->table + length;\n\n    {\n      FT_Byte*   p           = bdf->table;\n      FT_UInt    version     = FT_NEXT_USHORT( p );\n      FT_UInt    num_strikes = FT_NEXT_USHORT( p );\n      FT_ULong   strings     = FT_NEXT_ULONG ( p );\n      FT_UInt    count;\n      FT_Byte*   strike;\n\n\n      if ( version != 0x0001                 ||\n           strings < 8                       ||\n           ( strings - 8 ) / 4 < num_strikes ||\n           strings + 1 > length              )\n      {\n        goto BadTable;\n      }\n\n      bdf->num_strikes  = num_strikes;\n      bdf->strings      = bdf->table + strings;\n      bdf->strings_size = length - strings;\n\n      count  = bdf->num_strikes;\n      p      = bdf->table + 8;\n      strike = p + count * 4;\n\n\n      for ( ; count > 0; count-- )\n      {\n        FT_UInt  num_items = FT_PEEK_USHORT( p + 2 );\n\n        /*\n         *  We don't need to check the value sets themselves, since this\n         *  is done later.\n         */\n        strike += 10 * num_items;\n\n        p += 4;\n      }\n\n      if ( strike > bdf->strings )\n        goto BadTable;\n    }\n\n    bdf->loaded = 1;\n\n  Exit:\n    return error;\n\n  BadTable:\n    FT_FRAME_RELEASE( bdf->table );\n    FT_ZERO( bdf );\n    error = FT_THROW( Invalid_Table );\n    goto Exit;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_find_bdf_prop( TT_Face           face,\n                         const char*       property_name,\n                         BDF_PropertyRec  *aprop )\n  {\n    TT_BDF     bdf   = &face->bdf;\n    FT_Size    size  = FT_FACE(face)->size;\n    FT_Error   error = FT_Err_Ok;\n    FT_Byte*   p;\n    FT_UInt    count;\n    FT_Byte*   strike;\n    FT_Offset  property_len;\n\n\n    aprop->type = BDF_PROPERTY_TYPE_NONE;\n\n    if ( bdf->loaded == 0 )\n    {\n      error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );\n      if ( error )\n        goto Exit;\n    }\n\n    count  = bdf->num_strikes;\n    p      = bdf->table + 8;\n    strike = p + 4 * count;\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( size == NULL || property_name == NULL )\n      goto Exit;\n\n    property_len = ft_strlen( property_name );\n    if ( property_len == 0 )\n      goto Exit;\n\n    for ( ; count > 0; count-- )\n    {\n      FT_UInt  _ppem  = FT_NEXT_USHORT( p );\n      FT_UInt  _count = FT_NEXT_USHORT( p );\n\n      if ( _ppem == size->metrics.y_ppem )\n      {\n        count = _count;\n        goto FoundStrike;\n      }\n\n      strike += 10 * _count;\n    }\n    goto Exit;\n\n  FoundStrike:\n    p = strike;\n    for ( ; count > 0; count-- )\n    {\n      FT_UInt  type = FT_PEEK_USHORT( p + 4 );\n\n      if ( ( type & 0x10 ) != 0 )\n      {\n        FT_UInt32  name_offset = FT_PEEK_ULONG( p     );\n        FT_UInt32  value       = FT_PEEK_ULONG( p + 6 );\n\n        /* be a bit paranoid for invalid entries here */\n        if ( name_offset < bdf->strings_size                    &&\n             property_len < bdf->strings_size - name_offset     &&\n             ft_strncmp( property_name,\n                         (const char*)bdf->strings + name_offset,\n                         bdf->strings_size - name_offset ) == 0 )\n        {\n          switch ( type & 0x0F )\n          {\n          case 0x00:  /* string */\n          case 0x01:  /* atoms */\n            /* check that the content is really 0-terminated */\n            if ( value < bdf->strings_size &&\n                 ft_memchr( bdf->strings + value, 0, bdf->strings_size ) )\n            {\n              aprop->type   = BDF_PROPERTY_TYPE_ATOM;\n              aprop->u.atom = (const char*)bdf->strings + value;\n              error         = FT_Err_Ok;\n              goto Exit;\n            }\n            break;\n\n          case 0x02:\n            aprop->type      = BDF_PROPERTY_TYPE_INTEGER;\n            aprop->u.integer = (FT_Int32)value;\n            error            = FT_Err_Ok;\n            goto Exit;\n\n          case 0x03:\n            aprop->type       = BDF_PROPERTY_TYPE_CARDINAL;\n            aprop->u.cardinal = value;\n            error             = FT_Err_Ok;\n            goto Exit;\n\n          default:\n            ;\n          }\n        }\n      }\n      p += 10;\n    }\n\n  Exit:\n    return error;\n  }\n\n#endif /* TT_CONFIG_OPTION_BDF */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttbdf.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttbdf.h                                                                */\n/*                                                                         */\n/*    TrueType and OpenType embedded BDF properties (specification).       */\n/*                                                                         */\n/*  Copyright 2005 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTBDF_H__\n#define __TTBDF_H__\n\n\n#include <ft2build.h>\n#include \"ttload.h\"\n#include FT_BDF_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  tt_face_free_bdf_props( TT_Face  face );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_find_bdf_prop( TT_Face           face,\n                         const char*       property_name,\n                         BDF_PropertyRec  *aprop );\n\n\nFT_END_HEADER\n\n#endif /* __TTBDF_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttcmap.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttcmap.c                                                               */\n/*                                                                         */\n/*    TrueType character mapping table (cmap) support (body).              */\n/*                                                                         */\n/*  Copyright 2002-2010, 2012, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n\n#include \"sferrors.h\"           /* must come before FT_INTERNAL_VALIDATE_H */\n\n#include FT_INTERNAL_VALIDATE_H\n#include FT_INTERNAL_STREAM_H\n#include \"ttload.h\"\n#include \"ttcmap.h\"\n#include \"sfntpic.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttcmap\n\n\n#define TT_PEEK_SHORT   FT_PEEK_SHORT\n#define TT_PEEK_USHORT  FT_PEEK_USHORT\n#define TT_PEEK_UINT24  FT_PEEK_UOFF3\n#define TT_PEEK_LONG    FT_PEEK_LONG\n#define TT_PEEK_ULONG   FT_PEEK_ULONG\n\n#define TT_NEXT_SHORT   FT_NEXT_SHORT\n#define TT_NEXT_USHORT  FT_NEXT_USHORT\n#define TT_NEXT_UINT24  FT_NEXT_UOFF3\n#define TT_NEXT_LONG    FT_NEXT_LONG\n#define TT_NEXT_ULONG   FT_NEXT_ULONG\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap_init( TT_CMap   cmap,\n                FT_Byte*  table )\n  {\n    cmap->data = table;\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           FORMAT 0                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET         TYPE          DESCRIPTION                */\n  /*                                                                       */\n  /*   format      0              USHORT        must be 0                  */\n  /*   length      2              USHORT        table length in bytes      */\n  /*   language    4              USHORT        Mac language code          */\n  /*   glyph_ids   6              BYTE[256]     array of glyph indices     */\n  /*               262                                                     */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_0\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap0_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*  p      = table + 2;\n    FT_UInt   length = TT_NEXT_USHORT( p );\n\n\n    if ( table + length > valid->limit || length < 262 )\n      FT_INVALID_TOO_SHORT;\n\n    /* check glyph indices whenever necessary */\n    if ( valid->level >= FT_VALIDATE_TIGHT )\n    {\n      FT_UInt  n, idx;\n\n\n      p = table + 6;\n      for ( n = 0; n < 256; n++ )\n      {\n        idx = *p++;\n        if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )\n          FT_INVALID_GLYPH_ID;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap0_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_Byte*  table = cmap->data;\n\n\n    return char_code < 256 ? table[6 + char_code] : 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap0_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_Byte*   table    = cmap->data;\n    FT_UInt32  charcode = *pchar_code;\n    FT_UInt32  result   = 0;\n    FT_UInt    gindex   = 0;\n\n\n    table += 6;  /* go to glyph IDs */\n    while ( ++charcode < 256 )\n    {\n      gindex = table[charcode];\n      if ( gindex != 0 )\n      {\n        result = charcode;\n        break;\n      }\n    }\n\n    *pchar_code = result;\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap0_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 4;\n\n\n    cmap_info->format   = 0;\n    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap0_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap0_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap0_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    0,\n    (TT_CMap_ValidateFunc)tt_cmap0_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap0_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_0 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 2                             *****/\n  /*****                                                               *****/\n  /***** This is used for certain CJK encodings that encode text in a  *****/\n  /***** mixed 8/16 bits encoding along the following lines:           *****/\n  /*****                                                               *****/\n  /***** * Certain byte values correspond to an 8-bit character code   *****/\n  /*****   (typically in the range 0..127 for ASCII compatibility).    *****/\n  /*****                                                               *****/\n  /***** * Certain byte values signal the first byte of a 2-byte       *****/\n  /*****   character code (but these values are also valid as the      *****/\n  /*****   second byte of a 2-byte character).                         *****/\n  /*****                                                               *****/\n  /***** The following charmap lookup and iteration functions all      *****/\n  /***** assume that the value \"charcode\" correspond to following:     *****/\n  /*****                                                               *****/\n  /*****   - For one byte characters, \"charcode\" is simply the         *****/\n  /*****     character code.                                           *****/\n  /*****                                                               *****/\n  /*****   - For two byte characters, \"charcode\" is the 2-byte         *****/\n  /*****     character code in big endian format.  More exactly:       *****/\n  /*****                                                               *****/\n  /*****       (charcode >> 8)    is the first byte value              *****/\n  /*****       (charcode & 0xFF)  is the second byte value             *****/\n  /*****                                                               *****/\n  /***** Note that not all values of \"charcode\" are valid according    *****/\n  /***** to these rules, and the function moderately check the         *****/\n  /***** arguments.                                                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET         TYPE            DESCRIPTION              */\n  /*                                                                       */\n  /*   format      0              USHORT          must be 2                */\n  /*   length      2              USHORT          table length in bytes    */\n  /*   language    4              USHORT          Mac language code        */\n  /*   keys        6              USHORT[256]     sub-header keys          */\n  /*   subs        518            SUBHEAD[NSUBS]  sub-headers array        */\n  /*   glyph_ids   518+NSUB*8     USHORT[]        glyph ID array           */\n  /*                                                                       */\n  /* The `keys' table is used to map charcode high-bytes to sub-headers.   */\n  /* The value of `NSUBS' is the number of sub-headers defined in the      */\n  /* table and is computed by finding the maximum of the `keys' table.     */\n  /*                                                                       */\n  /* Note that for any n, `keys[n]' is a byte offset within the `subs'     */\n  /* table, i.e., it is the corresponding sub-header index multiplied      */\n  /* by 8.                                                                 */\n  /*                                                                       */\n  /* Each sub-header has the following format:                             */\n  /*                                                                       */\n  /*   NAME        OFFSET      TYPE            DESCRIPTION                 */\n  /*                                                                       */\n  /*   first       0           USHORT          first valid low-byte        */\n  /*   count       2           USHORT          number of valid low-bytes   */\n  /*   delta       4           SHORT           see below                   */\n  /*   offset      6           USHORT          see below                   */\n  /*                                                                       */\n  /* A sub-header defines, for each high-byte, the range of valid          */\n  /* low-bytes within the charmap.  Note that the range defined by `first' */\n  /* and `count' must be completely included in the interval [0..255]      */\n  /* according to the specification.                                       */\n  /*                                                                       */\n  /* If a character code is contained within a given sub-header, then      */\n  /* mapping it to a glyph index is done as follows:                       */\n  /*                                                                       */\n  /* * The value of `offset' is read.  This is a _byte_ distance from the  */\n  /*   location of the `offset' field itself into a slice of the           */\n  /*   `glyph_ids' table.  Let's call it `slice' (it is a USHORT[] too).   */\n  /*                                                                       */\n  /* * The value `slice[char.lo - first]' is read.  If it is 0, there is   */\n  /*   no glyph for the charcode.  Otherwise, the value of `delta' is      */\n  /*   added to it (modulo 65536) to form a new glyph index.               */\n  /*                                                                       */\n  /* It is up to the validation routine to check that all offsets fall     */\n  /* within the glyph IDs table (and not within the `subs' table itself or */\n  /* outside of the CMap).                                                 */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_2\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap2_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*  p      = table + 2;           /* skip format */\n    FT_UInt   length = TT_PEEK_USHORT( p );\n    FT_UInt   n, max_subs;\n    FT_Byte*  keys;                         /* keys table */\n    FT_Byte*  subs;                         /* sub-headers */\n    FT_Byte*  glyph_ids;                    /* glyph ID array */\n\n\n    if ( table + length > valid->limit || length < 6 + 512 )\n      FT_INVALID_TOO_SHORT;\n\n    keys = table + 6;\n\n    /* parse keys to compute sub-headers count */\n    p        = keys;\n    max_subs = 0;\n    for ( n = 0; n < 256; n++ )\n    {\n      FT_UInt  idx = TT_NEXT_USHORT( p );\n\n\n      /* value must be multiple of 8 */\n      if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 )\n        FT_INVALID_DATA;\n\n      idx >>= 3;\n\n      if ( idx > max_subs )\n        max_subs = idx;\n    }\n\n    FT_ASSERT( p == table + 518 );\n\n    subs      = p;\n    glyph_ids = subs + (max_subs + 1) * 8;\n    if ( glyph_ids > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    /* parse sub-headers */\n    for ( n = 0; n <= max_subs; n++ )\n    {\n      FT_UInt   first_code, code_count, offset;\n      FT_Int    delta;\n      FT_Byte*  ids;\n\n\n      first_code = TT_NEXT_USHORT( p );\n      code_count = TT_NEXT_USHORT( p );\n      delta      = TT_NEXT_SHORT( p );\n      offset     = TT_NEXT_USHORT( p );\n\n      /* many Dynalab fonts have empty sub-headers */\n      if ( code_count == 0 )\n        continue;\n\n      /* check range within 0..255 */\n      if ( valid->level >= FT_VALIDATE_PARANOID )\n      {\n        if ( first_code >= 256 || first_code + code_count > 256 )\n          FT_INVALID_DATA;\n      }\n\n      /* check offset */\n      if ( offset != 0 )\n      {\n        ids = p - 2 + offset;\n        if ( ids < glyph_ids || ids + code_count*2 > table + length )\n          FT_INVALID_OFFSET;\n\n        /* check glyph IDs */\n        if ( valid->level >= FT_VALIDATE_TIGHT )\n        {\n          FT_Byte*  limit = p + code_count * 2;\n          FT_UInt   idx;\n\n\n          for ( ; p < limit; )\n          {\n            idx = TT_NEXT_USHORT( p );\n            if ( idx != 0 )\n            {\n              idx = ( idx + delta ) & 0xFFFFU;\n              if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )\n                FT_INVALID_GLYPH_ID;\n            }\n          }\n        }\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* return sub header corresponding to a given character code */\n  /* NULL on invalid charcode                                  */\n  static FT_Byte*\n  tt_cmap2_get_subheader( FT_Byte*   table,\n                          FT_UInt32  char_code )\n  {\n    FT_Byte*  result = NULL;\n\n\n    if ( char_code < 0x10000UL )\n    {\n      FT_UInt   char_lo = (FT_UInt)( char_code & 0xFF );\n      FT_UInt   char_hi = (FT_UInt)( char_code >> 8 );\n      FT_Byte*  p       = table + 6;    /* keys table */\n      FT_Byte*  subs    = table + 518;  /* subheaders table */\n      FT_Byte*  sub;\n\n\n      if ( char_hi == 0 )\n      {\n        /* an 8-bit character code -- we use subHeader 0 in this case */\n        /* to test whether the character code is in the charmap       */\n        /*                                                            */\n        sub = subs;  /* jump to first sub-header */\n\n        /* check that the sub-header for this byte is 0, which */\n        /* indicates that it is really a valid one-byte value  */\n        /* Otherwise, return 0                                 */\n        /*                                                     */\n        p += char_lo * 2;\n        if ( TT_PEEK_USHORT( p ) != 0 )\n          goto Exit;\n      }\n      else\n      {\n        /* a 16-bit character code */\n\n        /* jump to key entry  */\n        p  += char_hi * 2;\n        /* jump to sub-header */\n        sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) );\n\n        /* check that the high byte isn't a valid one-byte value */\n        if ( sub == subs )\n          goto Exit;\n      }\n      result = sub;\n    }\n  Exit:\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap2_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_Byte*  table   = cmap->data;\n    FT_UInt   result  = 0;\n    FT_Byte*  subheader;\n\n\n    subheader = tt_cmap2_get_subheader( table, char_code );\n    if ( subheader )\n    {\n      FT_Byte*  p   = subheader;\n      FT_UInt   idx = (FT_UInt)(char_code & 0xFF);\n      FT_UInt   start, count;\n      FT_Int    delta;\n      FT_UInt   offset;\n\n\n      start  = TT_NEXT_USHORT( p );\n      count  = TT_NEXT_USHORT( p );\n      delta  = TT_NEXT_SHORT ( p );\n      offset = TT_PEEK_USHORT( p );\n\n      idx -= start;\n      if ( idx < count && offset != 0 )\n      {\n        p  += offset + 2 * idx;\n        idx = TT_PEEK_USHORT( p );\n\n        if ( idx != 0 )\n          result = (FT_UInt)( idx + delta ) & 0xFFFFU;\n      }\n    }\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap2_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pcharcode )\n  {\n    FT_Byte*   table    = cmap->data;\n    FT_UInt    gindex   = 0;\n    FT_UInt32  result   = 0;\n    FT_UInt32  charcode = *pcharcode + 1;\n    FT_Byte*   subheader;\n\n\n    while ( charcode < 0x10000UL )\n    {\n      subheader = tt_cmap2_get_subheader( table, charcode );\n      if ( subheader )\n      {\n        FT_Byte*  p       = subheader;\n        FT_UInt   start   = TT_NEXT_USHORT( p );\n        FT_UInt   count   = TT_NEXT_USHORT( p );\n        FT_Int    delta   = TT_NEXT_SHORT ( p );\n        FT_UInt   offset  = TT_PEEK_USHORT( p );\n        FT_UInt   char_lo = (FT_UInt)( charcode & 0xFF );\n        FT_UInt   pos, idx;\n\n\n        if ( offset == 0 )\n          goto Next_SubHeader;\n\n        if ( char_lo < start )\n        {\n          char_lo = start;\n          pos     = 0;\n        }\n        else\n          pos = (FT_UInt)( char_lo - start );\n\n        p       += offset + pos * 2;\n        charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo;\n\n        for ( ; pos < count; pos++, charcode++ )\n        {\n          idx = TT_NEXT_USHORT( p );\n\n          if ( idx != 0 )\n          {\n            gindex = ( idx + delta ) & 0xFFFFU;\n            if ( gindex != 0 )\n            {\n              result = charcode;\n              goto Exit;\n            }\n          }\n        }\n      }\n\n      /* jump to next sub-header, i.e. higher byte value */\n    Next_SubHeader:\n      charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;\n    }\n\n  Exit:\n    *pcharcode = result;\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap2_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 4;\n\n\n    cmap_info->format   = 2;\n    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap2_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap2_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap2_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    2,\n    (TT_CMap_ValidateFunc)tt_cmap2_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap2_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_2 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           FORMAT 4                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME          OFFSET         TYPE              DESCRIPTION          */\n  /*                                                                       */\n  /*   format        0              USHORT            must be 4            */\n  /*   length        2              USHORT            table length         */\n  /*                                                  in bytes             */\n  /*   language      4              USHORT            Mac language code    */\n  /*                                                                       */\n  /*   segCountX2    6              USHORT            2*NUM_SEGS           */\n  /*   searchRange   8              USHORT            2*(1 << LOG_SEGS)    */\n  /*   entrySelector 10             USHORT            LOG_SEGS             */\n  /*   rangeShift    12             USHORT            segCountX2 -         */\n  /*                                                    searchRange        */\n  /*                                                                       */\n  /*   endCount      14             USHORT[NUM_SEGS]  end charcode for     */\n  /*                                                  each segment; last   */\n  /*                                                  is 0xFFFF            */\n  /*                                                                       */\n  /*   pad           14+NUM_SEGS*2  USHORT            padding              */\n  /*                                                                       */\n  /*   startCount    16+NUM_SEGS*2  USHORT[NUM_SEGS]  first charcode for   */\n  /*                                                  each segment         */\n  /*                                                                       */\n  /*   idDelta       16+NUM_SEGS*4  SHORT[NUM_SEGS]   delta for each       */\n  /*                                                  segment              */\n  /*   idOffset      16+NUM_SEGS*6  SHORT[NUM_SEGS]   range offset for     */\n  /*                                                  each segment; can be */\n  /*                                                  zero                 */\n  /*                                                                       */\n  /*   glyphIds      16+NUM_SEGS*8  USHORT[]          array of glyph ID    */\n  /*                                                  ranges               */\n  /*                                                                       */\n  /* Character codes are modelled by a series of ordered (increasing)      */\n  /* intervals called segments.  Each segment has start and end codes,     */\n  /* provided by the `startCount' and `endCount' arrays.  Segments must    */\n  /* not overlap, and the last segment should always contain the value     */\n  /* 0xFFFF for `endCount'.                                                */\n  /*                                                                       */\n  /* The fields `searchRange', `entrySelector' and `rangeShift' are better */\n  /* ignored (they are traces of over-engineering in the TrueType          */\n  /* specification).                                                       */\n  /*                                                                       */\n  /* Each segment also has a signed `delta', as well as an optional offset */\n  /* within the `glyphIds' table.                                          */\n  /*                                                                       */\n  /* If a segment's idOffset is 0, the glyph index corresponding to any    */\n  /* charcode within the segment is obtained by adding the value of        */\n  /* `idDelta' directly to the charcode, modulo 65536.                     */\n  /*                                                                       */\n  /* Otherwise, a glyph index is taken from the glyph IDs sub-array for    */\n  /* the segment, and the value of `idDelta' is added to it.               */\n  /*                                                                       */\n  /*                                                                       */\n  /* Finally, note that a lot of fonts contain an invalid last segment,    */\n  /* where `start' and `end' are correctly set to 0xFFFF but both `delta'  */\n  /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with     */\n  /* OpenOffice.org).  We need special code to deal with them correctly.   */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_4\n\n  typedef struct  TT_CMap4Rec_\n  {\n    TT_CMapRec  cmap;\n    FT_UInt32   cur_charcode;   /* current charcode */\n    FT_UInt     cur_gindex;     /* current glyph index */\n\n    FT_UInt     num_ranges;\n    FT_UInt     cur_range;\n    FT_UInt     cur_start;\n    FT_UInt     cur_end;\n    FT_Int      cur_delta;\n    FT_Byte*    cur_values;\n\n  } TT_CMap4Rec, *TT_CMap4;\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap4_init( TT_CMap4  cmap,\n                 FT_Byte*  table )\n  {\n    FT_Byte*  p;\n\n\n    cmap->cmap.data    = table;\n\n    p                  = table + 6;\n    cmap->num_ranges   = FT_PEEK_USHORT( p ) >> 1;\n    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;\n    cmap->cur_gindex   = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Int\n  tt_cmap4_set_range( TT_CMap4  cmap,\n                      FT_UInt   range_index )\n  {\n    FT_Byte*  table = cmap->cmap.data;\n    FT_Byte*  p;\n    FT_UInt   num_ranges = cmap->num_ranges;\n\n\n    while ( range_index < num_ranges )\n    {\n      FT_UInt  offset;\n\n\n      p             = table + 14 + range_index * 2;\n      cmap->cur_end = FT_PEEK_USHORT( p );\n\n      p              += 2 + num_ranges * 2;\n      cmap->cur_start = FT_PEEK_USHORT( p );\n\n      p              += num_ranges * 2;\n      cmap->cur_delta = FT_PEEK_SHORT( p );\n\n      p     += num_ranges * 2;\n      offset = FT_PEEK_USHORT( p );\n\n      /* some fonts have an incorrect last segment; */\n      /* we have to catch it                        */\n      if ( range_index     >= num_ranges - 1 &&\n           cmap->cur_start == 0xFFFFU        &&\n           cmap->cur_end   == 0xFFFFU        )\n      {\n        TT_Face   face  = (TT_Face)cmap->cmap.cmap.charmap.face;\n        FT_Byte*  limit = face->cmap_table + face->cmap_size;\n\n\n        if ( offset && p + offset + 2 > limit )\n        {\n          cmap->cur_delta = 1;\n          offset          = 0;\n        }\n      }\n\n      if ( offset != 0xFFFFU )\n      {\n        cmap->cur_values = offset ? p + offset : NULL;\n        cmap->cur_range  = range_index;\n        return 0;\n      }\n\n      /* we skip empty segments */\n      range_index++;\n    }\n\n    return -1;\n  }\n\n\n  /* search the index of the charcode next to cmap->cur_charcode; */\n  /* caller should call tt_cmap4_set_range with proper range      */\n  /* before calling this function                                 */\n  /*                                                              */\n  static void\n  tt_cmap4_next( TT_CMap4  cmap )\n  {\n    FT_UInt  charcode;\n\n\n    if ( cmap->cur_charcode >= 0xFFFFUL )\n      goto Fail;\n\n    charcode = (FT_UInt)cmap->cur_charcode + 1;\n\n    if ( charcode < cmap->cur_start )\n      charcode = cmap->cur_start;\n\n    for ( ;; )\n    {\n      FT_Byte*  values = cmap->cur_values;\n      FT_UInt   end    = cmap->cur_end;\n      FT_Int    delta  = cmap->cur_delta;\n\n\n      if ( charcode <= end )\n      {\n        if ( values )\n        {\n          FT_Byte*  p = values + 2 * ( charcode - cmap->cur_start );\n\n\n          do\n          {\n            FT_UInt  gindex = FT_NEXT_USHORT( p );\n\n\n            if ( gindex != 0 )\n            {\n              gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU );\n              if ( gindex != 0 )\n              {\n                cmap->cur_charcode = charcode;\n                cmap->cur_gindex   = gindex;\n                return;\n              }\n            }\n          } while ( ++charcode <= end );\n        }\n        else\n        {\n          do\n          {\n            FT_UInt  gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU );\n\n\n            if ( gindex != 0 )\n            {\n              cmap->cur_charcode = charcode;\n              cmap->cur_gindex   = gindex;\n              return;\n            }\n          } while ( ++charcode <= end );\n        }\n      }\n\n      /* we need to find another range */\n      if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )\n        break;\n\n      if ( charcode < cmap->cur_start )\n        charcode = cmap->cur_start;\n    }\n\n  Fail:\n    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;\n    cmap->cur_gindex   = 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap4_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*  p      = table + 2;               /* skip format */\n    FT_UInt   length = TT_NEXT_USHORT( p );\n    FT_Byte   *ends, *starts, *offsets, *deltas, *glyph_ids;\n    FT_UInt   num_segs;\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( length < 16 )\n      FT_INVALID_TOO_SHORT;\n\n    /* in certain fonts, the `length' field is invalid and goes */\n    /* out of bound.  We try to correct this here...            */\n    if ( table + length > valid->limit )\n    {\n      if ( valid->level >= FT_VALIDATE_TIGHT )\n        FT_INVALID_TOO_SHORT;\n\n      length = (FT_UInt)( valid->limit - table );\n    }\n\n    p        = table + 6;\n    num_segs = TT_NEXT_USHORT( p );   /* read segCountX2 */\n\n    if ( valid->level >= FT_VALIDATE_PARANOID )\n    {\n      /* check that we have an even value here */\n      if ( num_segs & 1 )\n        FT_INVALID_DATA;\n    }\n\n    num_segs /= 2;\n\n    if ( length < 16 + num_segs * 2 * 4 )\n      FT_INVALID_TOO_SHORT;\n\n    /* check the search parameters - even though we never use them */\n    /*                                                             */\n    if ( valid->level >= FT_VALIDATE_PARANOID )\n    {\n      /* check the values of `searchRange', `entrySelector', `rangeShift' */\n      FT_UInt  search_range   = TT_NEXT_USHORT( p );\n      FT_UInt  entry_selector = TT_NEXT_USHORT( p );\n      FT_UInt  range_shift    = TT_NEXT_USHORT( p );\n\n\n      if ( ( search_range | range_shift ) & 1 )  /* must be even values */\n        FT_INVALID_DATA;\n\n      search_range /= 2;\n      range_shift  /= 2;\n\n      /* `search range' is the greatest power of 2 that is <= num_segs */\n\n      if ( search_range                > num_segs                 ||\n           search_range * 2            < num_segs                 ||\n           search_range + range_shift != num_segs                 ||\n           search_range               != ( 1U << entry_selector ) )\n        FT_INVALID_DATA;\n    }\n\n    ends      = table   + 14;\n    starts    = table   + 16 + num_segs * 2;\n    deltas    = starts  + num_segs * 2;\n    offsets   = deltas  + num_segs * 2;\n    glyph_ids = offsets + num_segs * 2;\n\n    /* check last segment; its end count value must be 0xFFFF */\n    if ( valid->level >= FT_VALIDATE_PARANOID )\n    {\n      p = ends + ( num_segs - 1 ) * 2;\n      if ( TT_PEEK_USHORT( p ) != 0xFFFFU )\n        FT_INVALID_DATA;\n    }\n\n    {\n      FT_UInt   start, end, offset, n;\n      FT_UInt   last_start = 0, last_end = 0;\n      FT_Int    delta;\n      FT_Byte*  p_start   = starts;\n      FT_Byte*  p_end     = ends;\n      FT_Byte*  p_delta   = deltas;\n      FT_Byte*  p_offset  = offsets;\n\n\n      for ( n = 0; n < num_segs; n++ )\n      {\n        p      = p_offset;\n        start  = TT_NEXT_USHORT( p_start );\n        end    = TT_NEXT_USHORT( p_end );\n        delta  = TT_NEXT_SHORT( p_delta );\n        offset = TT_NEXT_USHORT( p_offset );\n\n        if ( start > end )\n          FT_INVALID_DATA;\n\n        /* this test should be performed at default validation level; */\n        /* unfortunately, some popular Asian fonts have overlapping   */\n        /* ranges in their charmaps                                   */\n        /*                                                            */\n        if ( start <= last_end && n > 0 )\n        {\n          if ( valid->level >= FT_VALIDATE_TIGHT )\n            FT_INVALID_DATA;\n          else\n          {\n            /* allow overlapping segments, provided their start points */\n            /* and end points, respectively, are in ascending order    */\n            /*                                                         */\n            if ( last_start > start || last_end > end )\n              error |= TT_CMAP_FLAG_UNSORTED;\n            else\n              error |= TT_CMAP_FLAG_OVERLAPPING;\n          }\n        }\n\n        if ( offset && offset != 0xFFFFU )\n        {\n          p += offset;  /* start of glyph ID array */\n\n          /* check that we point within the glyph IDs table only */\n          if ( valid->level >= FT_VALIDATE_TIGHT )\n          {\n            if ( p < glyph_ids                                ||\n                 p + ( end - start + 1 ) * 2 > table + length )\n              FT_INVALID_DATA;\n          }\n          /* Some fonts handle the last segment incorrectly.  In */\n          /* theory, 0xFFFF might point to an ordinary glyph --  */\n          /* a cmap 4 is versatile and could be used for any     */\n          /* encoding, not only Unicode.  However, reality shows */\n          /* that far too many fonts are sloppy and incorrectly  */\n          /* set all fields but `start' and `end' for the last   */\n          /* segment if it contains only a single character.     */\n          /*                                                     */\n          /* We thus omit the test here, delaying it to the      */\n          /* routines which actually access the cmap.            */\n          else if ( n != num_segs - 1                       ||\n                    !( start == 0xFFFFU && end == 0xFFFFU ) )\n          {\n            if ( p < glyph_ids                              ||\n                 p + ( end - start + 1 ) * 2 > valid->limit )\n              FT_INVALID_DATA;\n          }\n\n          /* check glyph indices within the segment range */\n          if ( valid->level >= FT_VALIDATE_TIGHT )\n          {\n            FT_UInt  i, idx;\n\n\n            for ( i = start; i < end; i++ )\n            {\n              idx = FT_NEXT_USHORT( p );\n              if ( idx != 0 )\n              {\n                idx = (FT_UInt)( idx + delta ) & 0xFFFFU;\n\n                if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )\n                  FT_INVALID_GLYPH_ID;\n              }\n            }\n          }\n        }\n        else if ( offset == 0xFFFFU )\n        {\n          /* some fonts (erroneously?) use a range offset of 0xFFFF */\n          /* to mean missing glyph in cmap table                    */\n          /*                                                        */\n          if ( valid->level >= FT_VALIDATE_PARANOID    ||\n               n != num_segs - 1                       ||\n               !( start == 0xFFFFU && end == 0xFFFFU ) )\n            FT_INVALID_DATA;\n        }\n\n        last_start = start;\n        last_end   = end;\n      }\n    }\n\n    return error;\n  }\n\n\n  static FT_UInt\n  tt_cmap4_char_map_linear( TT_CMap     cmap,\n                            FT_UInt32*  pcharcode,\n                            FT_Bool     next )\n  {\n    FT_UInt    num_segs2, start, end, offset;\n    FT_Int     delta;\n    FT_UInt    i, num_segs;\n    FT_UInt32  charcode = *pcharcode;\n    FT_UInt    gindex   = 0;\n    FT_Byte*   p;\n\n\n    p = cmap->data + 6;\n    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );\n\n    num_segs = num_segs2 >> 1;\n\n    if ( !num_segs )\n      return 0;\n\n    if ( next )\n      charcode++;\n\n    /* linear search */\n    for ( ; charcode <= 0xFFFFU; charcode++ )\n    {\n      FT_Byte*  q;\n\n\n      p = cmap->data + 14;               /* ends table   */\n      q = cmap->data + 16 + num_segs2;   /* starts table */\n\n      for ( i = 0; i < num_segs; i++ )\n      {\n        end   = TT_NEXT_USHORT( p );\n        start = TT_NEXT_USHORT( q );\n\n        if ( charcode >= start && charcode <= end )\n        {\n          p       = q - 2 + num_segs2;\n          delta   = TT_PEEK_SHORT( p );\n          p      += num_segs2;\n          offset  = TT_PEEK_USHORT( p );\n\n          /* some fonts have an incorrect last segment; */\n          /* we have to catch it                        */\n          if ( i >= num_segs - 1                  &&\n               start == 0xFFFFU && end == 0xFFFFU )\n          {\n            TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;\n            FT_Byte*  limit = face->cmap_table + face->cmap_size;\n\n\n            if ( offset && p + offset + 2 > limit )\n            {\n              delta  = 1;\n              offset = 0;\n            }\n          }\n\n          if ( offset == 0xFFFFU )\n            continue;\n\n          if ( offset )\n          {\n            p += offset + ( charcode - start ) * 2;\n            gindex = TT_PEEK_USHORT( p );\n            if ( gindex != 0 )\n              gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;\n          }\n          else\n            gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;\n\n          break;\n        }\n      }\n\n      if ( !next || gindex )\n        break;\n    }\n\n    if ( next && gindex )\n      *pcharcode = charcode;\n\n    return gindex;\n  }\n\n\n  static FT_UInt\n  tt_cmap4_char_map_binary( TT_CMap     cmap,\n                            FT_UInt32*  pcharcode,\n                            FT_Bool     next )\n  {\n    FT_UInt   num_segs2, start, end, offset;\n    FT_Int    delta;\n    FT_UInt   max, min, mid, num_segs;\n    FT_UInt   charcode = (FT_UInt)*pcharcode;\n    FT_UInt   gindex   = 0;\n    FT_Byte*  p;\n\n\n    p = cmap->data + 6;\n    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );\n\n    if ( !num_segs2 )\n      return 0;\n\n    num_segs = num_segs2 >> 1;\n\n    /* make compiler happy */\n    mid = num_segs;\n    end = 0xFFFFU;\n\n    if ( next )\n      charcode++;\n\n    min = 0;\n    max = num_segs;\n\n    /* binary search */\n    while ( min < max )\n    {\n      mid    = ( min + max ) >> 1;\n      p      = cmap->data + 14 + mid * 2;\n      end    = TT_PEEK_USHORT( p );\n      p     += 2 + num_segs2;\n      start  = TT_PEEK_USHORT( p );\n\n      if ( charcode < start )\n        max = mid;\n      else if ( charcode > end )\n        min = mid + 1;\n      else\n      {\n        p     += num_segs2;\n        delta  = TT_PEEK_SHORT( p );\n        p     += num_segs2;\n        offset = TT_PEEK_USHORT( p );\n\n        /* some fonts have an incorrect last segment; */\n        /* we have to catch it                        */\n        if ( mid >= num_segs - 1                &&\n             start == 0xFFFFU && end == 0xFFFFU )\n        {\n          TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;\n          FT_Byte*  limit = face->cmap_table + face->cmap_size;\n\n\n          if ( offset && p + offset + 2 > limit )\n          {\n            delta  = 1;\n            offset = 0;\n          }\n        }\n\n        /* search the first segment containing `charcode' */\n        if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )\n        {\n          FT_UInt  i;\n\n\n          /* call the current segment `max' */\n          max = mid;\n\n          if ( offset == 0xFFFFU )\n            mid = max + 1;\n\n          /* search in segments before the current segment */\n          for ( i = max ; i > 0; i-- )\n          {\n            FT_UInt   prev_end;\n            FT_Byte*  old_p;\n\n\n            old_p    = p;\n            p        = cmap->data + 14 + ( i - 1 ) * 2;\n            prev_end = TT_PEEK_USHORT( p );\n\n            if ( charcode > prev_end )\n            {\n              p = old_p;\n              break;\n            }\n\n            end    = prev_end;\n            p     += 2 + num_segs2;\n            start  = TT_PEEK_USHORT( p );\n            p     += num_segs2;\n            delta  = TT_PEEK_SHORT( p );\n            p     += num_segs2;\n            offset = TT_PEEK_USHORT( p );\n\n            if ( offset != 0xFFFFU )\n              mid = i - 1;\n          }\n\n          /* no luck */\n          if ( mid == max + 1 )\n          {\n            if ( i != max )\n            {\n              p      = cmap->data + 14 + max * 2;\n              end    = TT_PEEK_USHORT( p );\n              p     += 2 + num_segs2;\n              start  = TT_PEEK_USHORT( p );\n              p     += num_segs2;\n              delta  = TT_PEEK_SHORT( p );\n              p     += num_segs2;\n              offset = TT_PEEK_USHORT( p );\n            }\n\n            mid = max;\n\n            /* search in segments after the current segment */\n            for ( i = max + 1; i < num_segs; i++ )\n            {\n              FT_UInt  next_end, next_start;\n\n\n              p          = cmap->data + 14 + i * 2;\n              next_end   = TT_PEEK_USHORT( p );\n              p         += 2 + num_segs2;\n              next_start = TT_PEEK_USHORT( p );\n\n              if ( charcode < next_start )\n                break;\n\n              end    = next_end;\n              start  = next_start;\n              p     += num_segs2;\n              delta  = TT_PEEK_SHORT( p );\n              p     += num_segs2;\n              offset = TT_PEEK_USHORT( p );\n\n              if ( offset != 0xFFFFU )\n                mid = i;\n            }\n            i--;\n\n            /* still no luck */\n            if ( mid == max )\n            {\n              mid = i;\n\n              break;\n            }\n          }\n\n          /* end, start, delta, and offset are for the i'th segment */\n          if ( mid != i )\n          {\n            p      = cmap->data + 14 + mid * 2;\n            end    = TT_PEEK_USHORT( p );\n            p     += 2 + num_segs2;\n            start  = TT_PEEK_USHORT( p );\n            p     += num_segs2;\n            delta  = TT_PEEK_SHORT( p );\n            p     += num_segs2;\n            offset = TT_PEEK_USHORT( p );\n          }\n        }\n        else\n        {\n          if ( offset == 0xFFFFU )\n            break;\n        }\n\n        if ( offset )\n        {\n          p += offset + ( charcode - start ) * 2;\n          gindex = TT_PEEK_USHORT( p );\n          if ( gindex != 0 )\n            gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;\n        }\n        else\n          gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;\n\n        break;\n      }\n    }\n\n    if ( next )\n    {\n      TT_CMap4  cmap4 = (TT_CMap4)cmap;\n\n\n      /* if `charcode' is not in any segment, then `mid' is */\n      /* the segment nearest to `charcode'                  */\n      /*                                                    */\n\n      if ( charcode > end )\n      {\n        mid++;\n        if ( mid == num_segs )\n          return 0;\n      }\n\n      if ( tt_cmap4_set_range( cmap4, mid ) )\n      {\n        if ( gindex )\n          *pcharcode = charcode;\n      }\n      else\n      {\n        cmap4->cur_charcode = charcode;\n\n        if ( gindex )\n          cmap4->cur_gindex = gindex;\n        else\n        {\n          cmap4->cur_charcode = charcode;\n          tt_cmap4_next( cmap4 );\n          gindex = cmap4->cur_gindex;\n        }\n\n        if ( gindex )\n          *pcharcode = cmap4->cur_charcode;\n      }\n    }\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap4_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    if ( char_code >= 0x10000UL )\n      return 0;\n\n    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )\n      return tt_cmap4_char_map_linear( cmap, &char_code, 0 );\n    else\n      return tt_cmap4_char_map_binary( cmap, &char_code, 0 );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap4_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_UInt  gindex;\n\n\n    if ( *pchar_code >= 0xFFFFU )\n      return 0;\n\n    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )\n      gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );\n    else\n    {\n      TT_CMap4  cmap4 = (TT_CMap4)cmap;\n\n\n      /* no need to search */\n      if ( *pchar_code == cmap4->cur_charcode )\n      {\n        tt_cmap4_next( cmap4 );\n        gindex = cmap4->cur_gindex;\n        if ( gindex )\n          *pchar_code = cmap4->cur_charcode;\n      }\n      else\n        gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );\n    }\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap4_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 4;\n\n\n    cmap_info->format   = 4;\n    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap4_class_rec,\n    sizeof ( TT_CMap4Rec ),\n    (FT_CMap_InitFunc)     tt_cmap4_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap4_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap4_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    4,\n    (TT_CMap_ValidateFunc)tt_cmap4_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap4_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_4 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 6                             *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET          TYPE             DESCRIPTION            */\n  /*                                                                       */\n  /*   format       0              USHORT           must be 4              */\n  /*   length       2              USHORT           table length in bytes  */\n  /*   language     4              USHORT           Mac language code      */\n  /*                                                                       */\n  /*   first        6              USHORT           first segment code     */\n  /*   count        8              USHORT           segment size in chars  */\n  /*   glyphIds     10             USHORT[count]    glyph IDs              */\n  /*                                                                       */\n  /* A very simplified segment mapping.                                    */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_6\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap6_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*  p;\n    FT_UInt   length, count;\n\n\n    if ( table + 10 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    p      = table + 2;\n    length = TT_NEXT_USHORT( p );\n\n    p      = table + 8;             /* skip language and start index */\n    count  = TT_NEXT_USHORT( p );\n\n    if ( table + length > valid->limit || length < 10 + count * 2 )\n      FT_INVALID_TOO_SHORT;\n\n    /* check glyph indices */\n    if ( valid->level >= FT_VALIDATE_TIGHT )\n    {\n      FT_UInt  gindex;\n\n\n      for ( ; count > 0; count-- )\n      {\n        gindex = TT_NEXT_USHORT( p );\n        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )\n          FT_INVALID_GLYPH_ID;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap6_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_Byte*  table  = cmap->data;\n    FT_UInt   result = 0;\n    FT_Byte*  p      = table + 6;\n    FT_UInt   start  = TT_NEXT_USHORT( p );\n    FT_UInt   count  = TT_NEXT_USHORT( p );\n    FT_UInt   idx    = (FT_UInt)( char_code - start );\n\n\n    if ( idx < count )\n    {\n      p += 2 * idx;\n      result = TT_PEEK_USHORT( p );\n    }\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap6_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_Byte*   table     = cmap->data;\n    FT_UInt32  result    = 0;\n    FT_UInt32  char_code = *pchar_code + 1;\n    FT_UInt    gindex    = 0;\n\n    FT_Byte*   p         = table + 6;\n    FT_UInt    start     = TT_NEXT_USHORT( p );\n    FT_UInt    count     = TT_NEXT_USHORT( p );\n    FT_UInt    idx;\n\n\n    if ( char_code >= 0x10000UL )\n      goto Exit;\n\n    if ( char_code < start )\n      char_code = start;\n\n    idx = (FT_UInt)( char_code - start );\n    p  += 2 * idx;\n\n    for ( ; idx < count; idx++ )\n    {\n      gindex = TT_NEXT_USHORT( p );\n      if ( gindex != 0 )\n      {\n        result = char_code;\n        break;\n      }\n      char_code++;\n    }\n\n  Exit:\n    *pchar_code = result;\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap6_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 4;\n\n\n    cmap_info->format   = 6;\n    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap6_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap6_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap6_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    6,\n    (TT_CMap_ValidateFunc)tt_cmap6_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap6_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_6 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 8                             *****/\n  /*****                                                               *****/\n  /***** It is hard to completely understand what the OpenType spec    *****/\n  /***** says about this format, but here is my conclusion.            *****/\n  /*****                                                               *****/\n  /***** The purpose of this format is to easily map UTF-16 text to    *****/\n  /***** glyph indices.  Basically, the `char_code' must be in one of  *****/\n  /***** the following formats:                                        *****/\n  /*****                                                               *****/\n  /*****   - A 16-bit value that isn't part of the Unicode Surrogates  *****/\n  /*****     Area (i.e. U+D800-U+DFFF).                                *****/\n  /*****                                                               *****/\n  /*****   - A 32-bit value, made of two surrogate values, i.e.. if    *****/\n  /*****     `char_code = (char_hi << 16) | char_lo', then both        *****/\n  /*****     `char_hi' and `char_lo' must be in the Surrogates Area.   *****/\n  /*****      Area.                                                    *****/\n  /*****                                                               *****/\n  /***** The `is32' table embedded in the charmap indicates whether a  *****/\n  /***** given 16-bit value is in the surrogates area or not.          *****/\n  /*****                                                               *****/\n  /***** So, for any given `char_code', we can assert the following:   *****/\n  /*****                                                               *****/\n  /*****   If `char_hi == 0' then we must have `is32[char_lo] == 0'.   *****/\n  /*****                                                               *****/\n  /*****   If `char_hi != 0' then we must have both                    *****/\n  /*****   `is32[char_hi] != 0' and `is32[char_lo] != 0'.              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET         TYPE        DESCRIPTION                  */\n  /*                                                                       */\n  /*   format      0              USHORT      must be 8                    */\n  /*   reserved    2              USHORT      reserved                     */\n  /*   length      4              ULONG       length in bytes              */\n  /*   language    8              ULONG       Mac language code            */\n  /*   is32        12             BYTE[8192]  32-bitness bitmap            */\n  /*   count       8204           ULONG       number of groups             */\n  /*                                                                       */\n  /* This header is followed by `count' groups of the following format:    */\n  /*                                                                       */\n  /*   start       0              ULONG       first charcode               */\n  /*   end         4              ULONG       last charcode                */\n  /*   startId     8              ULONG       start glyph ID for the group */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_8\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap8_validate( FT_Byte*      table,\n                     FT_Validator  valid )\n  {\n    FT_Byte*   p = table + 4;\n    FT_Byte*   is32;\n    FT_UInt32  length;\n    FT_UInt32  num_groups;\n\n\n    if ( table + 16 + 8192 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    length = TT_NEXT_ULONG( p );\n    if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 )\n      FT_INVALID_TOO_SHORT;\n\n    is32       = table + 12;\n    p          = is32  + 8192;          /* skip `is32' array */\n    num_groups = TT_NEXT_ULONG( p );\n\n    if ( p + num_groups * 12 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    /* check groups, they must be in increasing order */\n    {\n      FT_UInt32  n, start, end, start_id, count, last = 0;\n\n\n      for ( n = 0; n < num_groups; n++ )\n      {\n        FT_UInt   hi, lo;\n\n\n        start    = TT_NEXT_ULONG( p );\n        end      = TT_NEXT_ULONG( p );\n        start_id = TT_NEXT_ULONG( p );\n\n        if ( start > end )\n          FT_INVALID_DATA;\n\n        if ( n > 0 && start <= last )\n          FT_INVALID_DATA;\n\n        if ( valid->level >= FT_VALIDATE_TIGHT )\n        {\n          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )\n            FT_INVALID_GLYPH_ID;\n\n          count = (FT_UInt32)( end - start + 1 );\n\n          if ( start & ~0xFFFFU )\n          {\n            /* start_hi != 0; check that is32[i] is 1 for each i in */\n            /* the `hi' and `lo' of the range [start..end]          */\n            for ( ; count > 0; count--, start++ )\n            {\n              hi = (FT_UInt)( start >> 16 );\n              lo = (FT_UInt)( start & 0xFFFFU );\n\n              if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )\n                FT_INVALID_DATA;\n\n              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )\n                FT_INVALID_DATA;\n            }\n          }\n          else\n          {\n            /* start_hi == 0; check that is32[i] is 0 for each i in */\n            /* the range [start..end]                               */\n\n            /* end_hi cannot be != 0! */\n            if ( end & ~0xFFFFU )\n              FT_INVALID_DATA;\n\n            for ( ; count > 0; count--, start++ )\n            {\n              lo = (FT_UInt)( start & 0xFFFFU );\n\n              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )\n                FT_INVALID_DATA;\n            }\n          }\n        }\n\n        last = end;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap8_char_index( TT_CMap    cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_Byte*   table      = cmap->data;\n    FT_UInt    result     = 0;\n    FT_Byte*   p          = table + 8204;\n    FT_UInt32  num_groups = TT_NEXT_ULONG( p );\n    FT_UInt32  start, end, start_id;\n\n\n    for ( ; num_groups > 0; num_groups-- )\n    {\n      start    = TT_NEXT_ULONG( p );\n      end      = TT_NEXT_ULONG( p );\n      start_id = TT_NEXT_ULONG( p );\n\n      if ( char_code < start )\n        break;\n\n      if ( char_code <= end )\n      {\n        result = (FT_UInt)( start_id + char_code - start );\n        break;\n      }\n    }\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap8_char_next( TT_CMap     cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_UInt32  result     = 0;\n    FT_UInt32  char_code  = *pchar_code + 1;\n    FT_UInt    gindex     = 0;\n    FT_Byte*   table      = cmap->data;\n    FT_Byte*   p          = table + 8204;\n    FT_UInt32  num_groups = TT_NEXT_ULONG( p );\n    FT_UInt32  start, end, start_id;\n\n\n    p = table + 8208;\n\n    for ( ; num_groups > 0; num_groups-- )\n    {\n      start    = TT_NEXT_ULONG( p );\n      end      = TT_NEXT_ULONG( p );\n      start_id = TT_NEXT_ULONG( p );\n\n      if ( char_code < start )\n        char_code = start;\n\n      if ( char_code <= end )\n      {\n        gindex = (FT_UInt)( char_code - start + start_id );\n        if ( gindex != 0 )\n        {\n          result = char_code;\n          goto Exit;\n        }\n      }\n    }\n\n  Exit:\n    *pchar_code = result;\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap8_get_info( TT_CMap       cmap,\n                     TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 8;\n\n\n    cmap_info->format   = 8;\n    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap8_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap8_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap8_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    8,\n    (TT_CMap_ValidateFunc)tt_cmap8_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap8_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_8 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 10                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME      OFFSET  TYPE               DESCRIPTION                    */\n  /*                                                                       */\n  /*   format     0      USHORT             must be 10                     */\n  /*   reserved   2      USHORT             reserved                       */\n  /*   length     4      ULONG              length in bytes                */\n  /*   language   8      ULONG              Mac language code              */\n  /*                                                                       */\n  /*   start     12      ULONG              first char in range            */\n  /*   count     16      ULONG              number of chars in range       */\n  /*   glyphIds  20      USHORT[count]      glyph indices covered          */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_10\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap10_validate( FT_Byte*      table,\n                      FT_Validator  valid )\n  {\n    FT_Byte*  p = table + 4;\n    FT_ULong  length, count;\n\n\n    if ( table + 20 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    length = TT_NEXT_ULONG( p );\n    p      = table + 16;\n    count  = TT_NEXT_ULONG( p );\n\n    if ( length > (FT_ULong)( valid->limit - table ) ||\n         length < 20 + count * 2                     )\n      FT_INVALID_TOO_SHORT;\n\n    /* check glyph indices */\n    if ( valid->level >= FT_VALIDATE_TIGHT )\n    {\n      FT_UInt  gindex;\n\n\n      for ( ; count > 0; count-- )\n      {\n        gindex = TT_NEXT_USHORT( p );\n        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )\n          FT_INVALID_GLYPH_ID;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap10_char_index( TT_CMap    cmap,\n                        FT_UInt32  char_code )\n  {\n    FT_Byte*   table  = cmap->data;\n    FT_UInt    result = 0;\n    FT_Byte*   p      = table + 12;\n    FT_UInt32  start  = TT_NEXT_ULONG( p );\n    FT_UInt32  count  = TT_NEXT_ULONG( p );\n    FT_UInt32  idx    = (FT_ULong)( char_code - start );\n\n\n    if ( idx < count )\n    {\n      p     += 2 * idx;\n      result = TT_PEEK_USHORT( p );\n    }\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap10_char_next( TT_CMap     cmap,\n                       FT_UInt32  *pchar_code )\n  {\n    FT_Byte*   table     = cmap->data;\n    FT_UInt32  char_code = *pchar_code + 1;\n    FT_UInt    gindex    = 0;\n    FT_Byte*   p         = table + 12;\n    FT_UInt32  start     = TT_NEXT_ULONG( p );\n    FT_UInt32  count     = TT_NEXT_ULONG( p );\n    FT_UInt32  idx;\n\n\n    if ( char_code < start )\n      char_code = start;\n\n    idx = (FT_UInt32)( char_code - start );\n    p  += 2 * idx;\n\n    for ( ; idx < count; idx++ )\n    {\n      gindex = TT_NEXT_USHORT( p );\n      if ( gindex != 0 )\n        break;\n      char_code++;\n    }\n\n    *pchar_code = char_code;\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap10_get_info( TT_CMap       cmap,\n                      TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 8;\n\n\n    cmap_info->format   = 10;\n    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap10_class_rec,\n    sizeof ( TT_CMapRec ),\n\n    (FT_CMap_InitFunc)     tt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap10_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap10_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    10,\n    (TT_CMap_ValidateFunc)tt_cmap10_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap10_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_10 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 12                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */\n  /*                                                                       */\n  /*   format      0          USHORT     must be 12                        */\n  /*   reserved    2          USHORT     reserved                          */\n  /*   length      4          ULONG      length in bytes                   */\n  /*   language    8          ULONG      Mac language code                 */\n  /*   count       12         ULONG      number of groups                  */\n  /*               16                                                      */\n  /*                                                                       */\n  /* This header is followed by `count' groups of the following format:    */\n  /*                                                                       */\n  /*   start       0          ULONG      first charcode                    */\n  /*   end         4          ULONG      last charcode                     */\n  /*   startId     8          ULONG      start glyph ID for the group      */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_12\n\n  typedef struct  TT_CMap12Rec_\n  {\n    TT_CMapRec  cmap;\n    FT_Bool     valid;\n    FT_ULong    cur_charcode;\n    FT_UInt     cur_gindex;\n    FT_ULong    cur_group;\n    FT_ULong    num_groups;\n\n  } TT_CMap12Rec, *TT_CMap12;\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap12_init( TT_CMap12  cmap,\n                  FT_Byte*   table )\n  {\n    cmap->cmap.data  = table;\n\n    table           += 12;\n    cmap->num_groups = FT_PEEK_ULONG( table );\n\n    cmap->valid      = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap12_validate( FT_Byte*      table,\n                      FT_Validator  valid )\n  {\n    FT_Byte*   p;\n    FT_ULong   length;\n    FT_ULong   num_groups;\n\n\n    if ( table + 16 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    p      = table + 4;\n    length = TT_NEXT_ULONG( p );\n\n    p          = table + 12;\n    num_groups = TT_NEXT_ULONG( p );\n\n    if ( length > (FT_ULong)( valid->limit - table ) ||\n         length < 16 + 12 * num_groups               )\n      FT_INVALID_TOO_SHORT;\n\n    /* check groups, they must be in increasing order */\n    {\n      FT_ULong  n, start, end, start_id, last = 0;\n\n\n      for ( n = 0; n < num_groups; n++ )\n      {\n        start    = TT_NEXT_ULONG( p );\n        end      = TT_NEXT_ULONG( p );\n        start_id = TT_NEXT_ULONG( p );\n\n        if ( start > end )\n          FT_INVALID_DATA;\n\n        if ( n > 0 && start <= last )\n          FT_INVALID_DATA;\n\n        if ( valid->level >= FT_VALIDATE_TIGHT )\n        {\n          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )\n            FT_INVALID_GLYPH_ID;\n        }\n\n        last = end;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* search the index of the charcode next to cmap->cur_charcode */\n  /* cmap->cur_group should be set up properly by caller         */\n  /*                                                             */\n  static void\n  tt_cmap12_next( TT_CMap12  cmap )\n  {\n    FT_Byte*  p;\n    FT_ULong  start, end, start_id, char_code;\n    FT_ULong  n;\n    FT_UInt   gindex;\n\n\n    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )\n      goto Fail;\n\n    char_code = cmap->cur_charcode + 1;\n\n    n = cmap->cur_group;\n\n    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )\n    {\n      p        = cmap->cmap.data + 16 + 12 * n;\n      start    = TT_NEXT_ULONG( p );\n      end      = TT_NEXT_ULONG( p );\n      start_id = TT_PEEK_ULONG( p );\n\n      if ( char_code < start )\n        char_code = start;\n\n      for ( ; char_code <= end; char_code++ )\n      {\n        gindex = (FT_UInt)( start_id + char_code - start );\n\n        if ( gindex )\n        {\n          cmap->cur_charcode = char_code;;\n          cmap->cur_gindex   = gindex;\n          cmap->cur_group    = n;\n\n          return;\n        }\n      }\n    }\n\n  Fail:\n    cmap->valid = 0;\n  }\n\n\n  static FT_UInt\n  tt_cmap12_char_map_binary( TT_CMap     cmap,\n                             FT_UInt32*  pchar_code,\n                             FT_Bool     next )\n  {\n    FT_UInt    gindex     = 0;\n    FT_Byte*   p          = cmap->data + 12;\n    FT_UInt32  num_groups = TT_PEEK_ULONG( p );\n    FT_UInt32  char_code  = *pchar_code;\n    FT_UInt32  start, end, start_id;\n    FT_UInt32  max, min, mid;\n\n\n    if ( !num_groups )\n      return 0;\n\n    /* make compiler happy */\n    mid = num_groups;\n    end = 0xFFFFFFFFUL;\n\n    if ( next )\n      char_code++;\n\n    min = 0;\n    max = num_groups;\n\n    /* binary search */\n    while ( min < max )\n    {\n      mid = ( min + max ) >> 1;\n      p   = cmap->data + 16 + 12 * mid;\n\n      start = TT_NEXT_ULONG( p );\n      end   = TT_NEXT_ULONG( p );\n\n      if ( char_code < start )\n        max = mid;\n      else if ( char_code > end )\n        min = mid + 1;\n      else\n      {\n        start_id = TT_PEEK_ULONG( p );\n        gindex = (FT_UInt)( start_id + char_code - start );\n\n        break;\n      }\n    }\n\n    if ( next )\n    {\n      TT_CMap12  cmap12 = (TT_CMap12)cmap;\n\n\n      /* if `char_code' is not in any group, then `mid' is */\n      /* the group nearest to `char_code'                  */\n      /*                                                   */\n\n      if ( char_code > end )\n      {\n        mid++;\n        if ( mid == num_groups )\n          return 0;\n      }\n\n      cmap12->valid        = 1;\n      cmap12->cur_charcode = char_code;\n      cmap12->cur_group    = mid;\n\n      if ( !gindex )\n      {\n        tt_cmap12_next( cmap12 );\n\n        if ( cmap12->valid )\n          gindex = cmap12->cur_gindex;\n      }\n      else\n        cmap12->cur_gindex = gindex;\n\n      if ( gindex )\n        *pchar_code = cmap12->cur_charcode;\n    }\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap12_char_index( TT_CMap    cmap,\n                        FT_UInt32  char_code )\n  {\n    return tt_cmap12_char_map_binary( cmap, &char_code, 0 );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap12_char_next( TT_CMap     cmap,\n                       FT_UInt32  *pchar_code )\n  {\n    TT_CMap12  cmap12 = (TT_CMap12)cmap;\n    FT_ULong   gindex;\n\n\n    if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )\n      return 0;\n\n    /* no need to search */\n    if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )\n    {\n      tt_cmap12_next( cmap12 );\n      if ( cmap12->valid )\n      {\n        gindex = cmap12->cur_gindex;\n\n        /* XXX: check cur_charcode overflow is expected */\n        if ( gindex )\n          *pchar_code = (FT_UInt32)cmap12->cur_charcode;\n      }\n      else\n        gindex = 0;\n    }\n    else\n      gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );\n\n    /* XXX: check gindex overflow is expected */\n    return (FT_UInt32)gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap12_get_info( TT_CMap       cmap,\n                      TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 8;\n\n\n    cmap_info->format   = 12;\n    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap12_class_rec,\n    sizeof ( TT_CMap12Rec ),\n\n    (FT_CMap_InitFunc)     tt_cmap12_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap12_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap12_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    12,\n    (TT_CMap_ValidateFunc)tt_cmap12_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap12_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_12 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                          FORMAT 13                            *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */\n  /*                                                                       */\n  /*   format      0          USHORT     must be 13                        */\n  /*   reserved    2          USHORT     reserved                          */\n  /*   length      4          ULONG      length in bytes                   */\n  /*   language    8          ULONG      Mac language code                 */\n  /*   count       12         ULONG      number of groups                  */\n  /*               16                                                      */\n  /*                                                                       */\n  /* This header is followed by `count' groups of the following format:    */\n  /*                                                                       */\n  /*   start       0          ULONG      first charcode                    */\n  /*   end         4          ULONG      last charcode                     */\n  /*   glyphId     8          ULONG      glyph ID for the whole group      */\n  /*                                                                       */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_13\n\n  typedef struct  TT_CMap13Rec_\n  {\n    TT_CMapRec  cmap;\n    FT_Bool     valid;\n    FT_ULong    cur_charcode;\n    FT_UInt     cur_gindex;\n    FT_ULong    cur_group;\n    FT_ULong    num_groups;\n\n  } TT_CMap13Rec, *TT_CMap13;\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap13_init( TT_CMap13  cmap,\n                  FT_Byte*   table )\n  {\n    cmap->cmap.data  = table;\n\n    table           += 12;\n    cmap->num_groups = FT_PEEK_ULONG( table );\n\n    cmap->valid      = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap13_validate( FT_Byte*      table,\n                      FT_Validator  valid )\n  {\n    FT_Byte*  p;\n    FT_ULong  length;\n    FT_ULong  num_groups;\n\n\n    if ( table + 16 > valid->limit )\n      FT_INVALID_TOO_SHORT;\n\n    p      = table + 4;\n    length = TT_NEXT_ULONG( p );\n\n    p          = table + 12;\n    num_groups = TT_NEXT_ULONG( p );\n\n    if ( length > (FT_ULong)( valid->limit - table ) ||\n         length < 16 + 12 * num_groups               )\n      FT_INVALID_TOO_SHORT;\n\n    /* check groups, they must be in increasing order */\n    {\n      FT_ULong  n, start, end, glyph_id, last = 0;\n\n\n      for ( n = 0; n < num_groups; n++ )\n      {\n        start    = TT_NEXT_ULONG( p );\n        end      = TT_NEXT_ULONG( p );\n        glyph_id = TT_NEXT_ULONG( p );\n\n        if ( start > end )\n          FT_INVALID_DATA;\n\n        if ( n > 0 && start <= last )\n          FT_INVALID_DATA;\n\n        if ( valid->level >= FT_VALIDATE_TIGHT )\n        {\n          if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) )\n            FT_INVALID_GLYPH_ID;\n        }\n\n        last = end;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /* search the index of the charcode next to cmap->cur_charcode */\n  /* cmap->cur_group should be set up properly by caller         */\n  /*                                                             */\n  static void\n  tt_cmap13_next( TT_CMap13  cmap )\n  {\n    FT_Byte*  p;\n    FT_ULong  start, end, glyph_id, char_code;\n    FT_ULong  n;\n    FT_UInt   gindex;\n\n\n    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )\n      goto Fail;\n\n    char_code = cmap->cur_charcode + 1;\n\n    n = cmap->cur_group;\n\n    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )\n    {\n      p        = cmap->cmap.data + 16 + 12 * n;\n      start    = TT_NEXT_ULONG( p );\n      end      = TT_NEXT_ULONG( p );\n      glyph_id = TT_PEEK_ULONG( p );\n\n      if ( char_code < start )\n        char_code = start;\n\n      if ( char_code <= end )\n      {\n        gindex = (FT_UInt)glyph_id;\n\n        if ( gindex )\n        {\n          cmap->cur_charcode = char_code;;\n          cmap->cur_gindex   = gindex;\n          cmap->cur_group    = n;\n\n          return;\n        }\n      }\n    }\n\n  Fail:\n    cmap->valid = 0;\n  }\n\n\n  static FT_UInt\n  tt_cmap13_char_map_binary( TT_CMap     cmap,\n                             FT_UInt32*  pchar_code,\n                             FT_Bool     next )\n  {\n    FT_UInt    gindex     = 0;\n    FT_Byte*   p          = cmap->data + 12;\n    FT_UInt32  num_groups = TT_PEEK_ULONG( p );\n    FT_UInt32  char_code  = *pchar_code;\n    FT_UInt32  start, end;\n    FT_UInt32  max, min, mid;\n\n\n    if ( !num_groups )\n      return 0;\n\n    /* make compiler happy */\n    mid = num_groups;\n    end = 0xFFFFFFFFUL;\n\n    if ( next )\n      char_code++;\n\n    min = 0;\n    max = num_groups;\n\n    /* binary search */\n    while ( min < max )\n    {\n      mid = ( min + max ) >> 1;\n      p   = cmap->data + 16 + 12 * mid;\n\n      start = TT_NEXT_ULONG( p );\n      end   = TT_NEXT_ULONG( p );\n\n      if ( char_code < start )\n        max = mid;\n      else if ( char_code > end )\n        min = mid + 1;\n      else\n      {\n        gindex = (FT_UInt)TT_PEEK_ULONG( p );\n\n        break;\n      }\n    }\n\n    if ( next )\n    {\n      TT_CMap13  cmap13 = (TT_CMap13)cmap;\n\n\n      /* if `char_code' is not in any group, then `mid' is */\n      /* the group nearest to `char_code'                  */\n\n      if ( char_code > end )\n      {\n        mid++;\n        if ( mid == num_groups )\n          return 0;\n      }\n\n      cmap13->valid        = 1;\n      cmap13->cur_charcode = char_code;\n      cmap13->cur_group    = mid;\n\n      if ( !gindex )\n      {\n        tt_cmap13_next( cmap13 );\n\n        if ( cmap13->valid )\n          gindex = cmap13->cur_gindex;\n      }\n      else\n        cmap13->cur_gindex = gindex;\n\n      if ( gindex )\n        *pchar_code = cmap13->cur_charcode;\n    }\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap13_char_index( TT_CMap    cmap,\n                        FT_UInt32  char_code )\n  {\n    return tt_cmap13_char_map_binary( cmap, &char_code, 0 );\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap13_char_next( TT_CMap     cmap,\n                       FT_UInt32  *pchar_code )\n  {\n    TT_CMap13  cmap13 = (TT_CMap13)cmap;\n    FT_UInt    gindex;\n\n\n    if ( cmap13->cur_charcode >= 0xFFFFFFFFUL )\n      return 0;\n\n    /* no need to search */\n    if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )\n    {\n      tt_cmap13_next( cmap13 );\n      if ( cmap13->valid )\n      {\n        gindex = cmap13->cur_gindex;\n        if ( gindex )\n          *pchar_code = cmap13->cur_charcode;\n      }\n      else\n        gindex = 0;\n    }\n    else\n      gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 );\n\n    return gindex;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap13_get_info( TT_CMap       cmap,\n                      TT_CMapInfo  *cmap_info )\n  {\n    FT_Byte*  p = cmap->data + 8;\n\n\n    cmap_info->format   = 13;\n    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap13_class_rec,\n    sizeof ( TT_CMap13Rec ),\n\n    (FT_CMap_InitFunc)     tt_cmap13_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)tt_cmap13_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap13_char_next,\n\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n\n    13,\n    (TT_CMap_ValidateFunc)tt_cmap13_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap13_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_13 */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                           FORMAT 14                           *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TABLE OVERVIEW                                                        */\n  /* --------------                                                        */\n  /*                                                                       */\n  /*   NAME         OFFSET  TYPE    DESCRIPTION                            */\n  /*                                                                       */\n  /*   format         0     USHORT  must be 14                             */\n  /*   length         2     ULONG   table length in bytes                  */\n  /*   numSelector    6     ULONG   number of variation sel. records       */\n  /*                                                                       */\n  /* Followed by numSelector records, each of which looks like             */\n  /*                                                                       */\n  /*   varSelector    0     UINT24  Unicode codepoint of sel.              */\n  /*   defaultOff     3     ULONG   offset to a default UVS table          */\n  /*                                describing any variants to be found in */\n  /*                                the normal Unicode subtable.           */\n  /*   nonDefOff      7     ULONG   offset to a non-default UVS table      */\n  /*                                describing any variants not in the     */\n  /*                                standard cmap, with GIDs here          */\n  /* (either offset may be 0 NULL)                                         */\n  /*                                                                       */\n  /* Selectors are sorted by code point.                                   */\n  /*                                                                       */\n  /* A default Unicode Variation Selector (UVS) subtable is just a list of */\n  /* ranges of code points which are to be found in the standard cmap.  No */\n  /* glyph IDs (GIDs) here.                                                */\n  /*                                                                       */\n  /*   numRanges      0     ULONG   number of ranges following             */\n  /*                                                                       */\n  /* A range looks like                                                    */\n  /*                                                                       */\n  /*   uniStart       0     UINT24  code point of the first character in   */\n  /*                                this range                             */\n  /*   additionalCnt  3     UBYTE   count of additional characters in this */\n  /*                                range (zero means a range of a single  */\n  /*                                character)                             */\n  /*                                                                       */\n  /* Ranges are sorted by `uniStart'.                                      */\n  /*                                                                       */\n  /* A non-default Unicode Variation Selector (UVS) subtable is a list of  */\n  /* mappings from codepoint to GID.                                       */\n  /*                                                                       */\n  /*   numMappings    0     ULONG   number of mappings                     */\n  /*                                                                       */\n  /* A range looks like                                                    */\n  /*                                                                       */\n  /*   uniStart       0     UINT24  code point of the first character in   */\n  /*                                this range                             */\n  /*   GID            3     USHORT  and its GID                            */\n  /*                                                                       */\n  /* Ranges are sorted by `uniStart'.                                      */\n\n#ifdef TT_CONFIG_CMAP_FORMAT_14\n\n  typedef struct  TT_CMap14Rec_\n  {\n    TT_CMapRec  cmap;\n    FT_ULong    num_selectors;\n\n    /* This array is used to store the results of various\n     * cmap 14 query functions.  The data is overwritten\n     * on each call to these functions.\n     */\n    FT_UInt32   max_results;\n    FT_UInt32*  results;\n    FT_Memory   memory;\n\n  } TT_CMap14Rec, *TT_CMap14;\n\n\n  FT_CALLBACK_DEF( void )\n  tt_cmap14_done( TT_CMap14  cmap )\n  {\n    FT_Memory  memory = cmap->memory;\n\n\n    cmap->max_results = 0;\n    if ( memory != NULL && cmap->results != NULL )\n      FT_FREE( cmap->results );\n  }\n\n\n  static FT_Error\n  tt_cmap14_ensure( TT_CMap14  cmap,\n                    FT_UInt32  num_results,\n                    FT_Memory  memory )\n  {\n    FT_UInt32  old_max = cmap->max_results;\n    FT_Error   error   = FT_Err_Ok;\n\n\n    if ( num_results > cmap->max_results )\n    {\n       cmap->memory = memory;\n\n       if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) )\n         return error;\n\n       cmap->max_results = num_results;\n    }\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap14_init( TT_CMap14  cmap,\n                  FT_Byte*   table )\n  {\n    cmap->cmap.data = table;\n\n    table               += 6;\n    cmap->num_selectors  = FT_PEEK_ULONG( table );\n    cmap->max_results    = 0;\n    cmap->results        = NULL;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap14_validate( FT_Byte*      table,\n                      FT_Validator  valid )\n  {\n    FT_Byte*  p             = table + 2;\n    FT_ULong  length        = TT_NEXT_ULONG( p );\n    FT_ULong  num_selectors = TT_NEXT_ULONG( p );\n\n\n    if ( length > (FT_ULong)( valid->limit - table ) ||\n         length < 10 + 11 * num_selectors            )\n      FT_INVALID_TOO_SHORT;\n\n    /* check selectors, they must be in increasing order */\n    {\n      /* we start lastVarSel at 1 because a variant selector value of 0\n       * isn't valid.\n       */\n      FT_ULong  n, lastVarSel = 1;\n\n\n      for ( n = 0; n < num_selectors; n++ )\n      {\n        FT_ULong  varSel    = TT_NEXT_UINT24( p );\n        FT_ULong  defOff    = TT_NEXT_ULONG( p );\n        FT_ULong  nondefOff = TT_NEXT_ULONG( p );\n\n\n        if ( defOff >= length || nondefOff >= length )\n          FT_INVALID_TOO_SHORT;\n\n        if ( varSel < lastVarSel )\n          FT_INVALID_DATA;\n\n        lastVarSel = varSel + 1;\n\n        /* check the default table (these glyphs should be reached     */\n        /* through the normal Unicode cmap, no GIDs, just check order) */\n        if ( defOff != 0 )\n        {\n          FT_Byte*  defp      = table + defOff;\n          FT_ULong  numRanges = TT_NEXT_ULONG( defp );\n          FT_ULong  i;\n          FT_ULong  lastBase  = 0;\n\n\n          if ( defp + numRanges * 4 > valid->limit )\n            FT_INVALID_TOO_SHORT;\n\n          for ( i = 0; i < numRanges; ++i )\n          {\n            FT_ULong  base = TT_NEXT_UINT24( defp );\n            FT_ULong  cnt  = FT_NEXT_BYTE( defp );\n\n\n            if ( base + cnt >= 0x110000UL )              /* end of Unicode */\n              FT_INVALID_DATA;\n\n            if ( base < lastBase )\n              FT_INVALID_DATA;\n\n            lastBase = base + cnt + 1U;\n          }\n        }\n\n        /* and the non-default table (these glyphs are specified here) */\n        if ( nondefOff != 0 )\n        {\n          FT_Byte*  ndp         = table + nondefOff;\n          FT_ULong  numMappings = TT_NEXT_ULONG( ndp );\n          FT_ULong  i, lastUni  = 0;\n\n\n          if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) )\n            FT_INVALID_TOO_SHORT;\n\n          for ( i = 0; i < numMappings; ++i )\n          {\n            FT_ULong  uni = TT_NEXT_UINT24( ndp );\n            FT_ULong  gid = TT_NEXT_USHORT( ndp );\n\n\n            if ( uni >= 0x110000UL )                     /* end of Unicode */\n              FT_INVALID_DATA;\n\n            if ( uni < lastUni )\n              FT_INVALID_DATA;\n\n            lastUni = uni + 1U;\n\n            if ( valid->level >= FT_VALIDATE_TIGHT    &&\n                 gid >= TT_VALID_GLYPH_COUNT( valid ) )\n              FT_INVALID_GLYPH_ID;\n          }\n        }\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap14_char_index( TT_CMap    cmap,\n                        FT_UInt32  char_code )\n  {\n    FT_UNUSED( cmap );\n    FT_UNUSED( char_code );\n\n    /* This can't happen */\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 )\n  tt_cmap14_char_next( TT_CMap     cmap,\n                       FT_UInt32  *pchar_code )\n  {\n    FT_UNUSED( cmap );\n\n    /* This can't happen */\n    *pchar_code = 0;\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  tt_cmap14_get_info( TT_CMap       cmap,\n                      TT_CMapInfo  *cmap_info )\n  {\n    FT_UNUSED( cmap );\n\n    cmap_info->format   = 14;\n    /* subtable 14 does not define a language field */\n    cmap_info->language = 0xFFFFFFFFUL;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_UInt\n  tt_cmap14_char_map_def_binary( FT_Byte    *base,\n                                 FT_UInt32   char_code )\n  {\n    FT_UInt32  numRanges = TT_PEEK_ULONG( base );\n    FT_UInt32  max, min;\n\n\n    min = 0;\n    max = numRanges;\n\n    base += 4;\n\n    /* binary search */\n    while ( min < max )\n    {\n      FT_UInt32  mid   = ( min + max ) >> 1;\n      FT_Byte*   p     = base + 4 * mid;\n      FT_ULong   start = TT_NEXT_UINT24( p );\n      FT_UInt    cnt   = FT_NEXT_BYTE( p );\n\n\n      if ( char_code < start )\n        max = mid;\n      else if ( char_code > start+cnt )\n        min = mid + 1;\n      else\n        return TRUE;\n    }\n\n    return FALSE;\n  }\n\n\n  static FT_UInt\n  tt_cmap14_char_map_nondef_binary( FT_Byte    *base,\n                                    FT_UInt32   char_code )\n  {\n    FT_UInt32  numMappings = TT_PEEK_ULONG( base );\n    FT_UInt32  max, min;\n\n\n    min = 0;\n    max = numMappings;\n\n    base += 4;\n\n    /* binary search */\n    while ( min < max )\n    {\n      FT_UInt32  mid = ( min + max ) >> 1;\n      FT_Byte*   p   = base + 5 * mid;\n      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );\n\n\n      if ( char_code < uni )\n        max = mid;\n      else if ( char_code > uni )\n        min = mid + 1;\n      else\n        return TT_PEEK_USHORT( p );\n    }\n\n    return 0;\n  }\n\n\n  static FT_Byte*\n  tt_cmap14_find_variant( FT_Byte    *base,\n                          FT_UInt32   variantCode )\n  {\n    FT_UInt32  numVar = TT_PEEK_ULONG( base );\n    FT_UInt32  max, min;\n\n\n    min = 0;\n    max = numVar;\n\n    base += 4;\n\n    /* binary search */\n    while ( min < max )\n    {\n      FT_UInt32  mid    = ( min + max ) >> 1;\n      FT_Byte*   p      = base + 11 * mid;\n      FT_ULong   varSel = TT_NEXT_UINT24( p );\n\n\n      if ( variantCode < varSel )\n        max = mid;\n      else if ( variantCode > varSel )\n        min = mid + 1;\n      else\n        return p;\n    }\n\n    return NULL;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt )\n  tt_cmap14_char_var_index( TT_CMap    cmap,\n                            TT_CMap    ucmap,\n                            FT_UInt32  charcode,\n                            FT_UInt32  variantSelector )\n  {\n    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );\n    FT_ULong  defOff;\n    FT_ULong  nondefOff;\n\n\n    if ( !p )\n      return 0;\n\n    defOff    = TT_NEXT_ULONG( p );\n    nondefOff = TT_PEEK_ULONG( p );\n\n    if ( defOff != 0                                                    &&\n         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )\n    {\n      /* This is the default variant of this charcode.  GID not stored */\n      /* here; stored in the normal Unicode charmap instead.           */\n      return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );\n    }\n\n    if ( nondefOff != 0 )\n      return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,\n                                               charcode );\n\n    return 0;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Int )\n  tt_cmap14_char_var_isdefault( TT_CMap    cmap,\n                                FT_UInt32  charcode,\n                                FT_UInt32  variantSelector )\n  {\n    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );\n    FT_ULong  defOff;\n    FT_ULong  nondefOff;\n\n\n    if ( !p )\n      return -1;\n\n    defOff    = TT_NEXT_ULONG( p );\n    nondefOff = TT_NEXT_ULONG( p );\n\n    if ( defOff != 0                                                    &&\n         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )\n      return 1;\n\n    if ( nondefOff != 0                                            &&\n         tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,\n                                           charcode ) != 0         )\n      return 0;\n\n    return -1;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32* )\n  tt_cmap14_variants( TT_CMap    cmap,\n                      FT_Memory  memory )\n  {\n    TT_CMap14   cmap14 = (TT_CMap14)cmap;\n    FT_UInt32   count  = cmap14->num_selectors;\n    FT_Byte*    p      = cmap->data + 10;\n    FT_UInt32*  result;\n    FT_UInt32   i;\n\n\n    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )\n      return NULL;\n\n    result = cmap14->results;\n    for ( i = 0; i < count; ++i )\n    {\n      result[i] = (FT_UInt32)TT_NEXT_UINT24( p );\n      p        += 8;\n    }\n    result[i] = 0;\n\n    return result;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 * )\n  tt_cmap14_char_variants( TT_CMap    cmap,\n                           FT_Memory  memory,\n                           FT_UInt32  charCode )\n  {\n    TT_CMap14   cmap14 = (TT_CMap14)  cmap;\n    FT_UInt32   count  = cmap14->num_selectors;\n    FT_Byte*    p      = cmap->data + 10;\n    FT_UInt32*  q;\n\n\n    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )\n      return NULL;\n\n    for ( q = cmap14->results; count > 0; --count )\n    {\n      FT_UInt32  varSel    = TT_NEXT_UINT24( p );\n      FT_ULong   defOff    = TT_NEXT_ULONG( p );\n      FT_ULong   nondefOff = TT_NEXT_ULONG( p );\n\n\n      if ( ( defOff != 0                                               &&\n             tt_cmap14_char_map_def_binary( cmap->data + defOff,\n                                            charCode )                 ) ||\n           ( nondefOff != 0                                            &&\n             tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,\n                                               charCode ) != 0         ) )\n      {\n        q[0] = varSel;\n        q++;\n      }\n    }\n    q[0] = 0;\n\n    return cmap14->results;\n  }\n\n\n  static FT_UInt\n  tt_cmap14_def_char_count( FT_Byte  *p )\n  {\n    FT_UInt32  numRanges = (FT_UInt32)TT_NEXT_ULONG( p );\n    FT_UInt    tot       = 0;\n\n\n    p += 3;  /* point to the first `cnt' field */\n    for ( ; numRanges > 0; numRanges-- )\n    {\n      tot += 1 + p[0];\n      p   += 4;\n    }\n\n    return tot;\n  }\n\n\n  static FT_UInt32*\n  tt_cmap14_get_def_chars( TT_CMap    cmap,\n                           FT_Byte*   p,\n                           FT_Memory  memory )\n  {\n    TT_CMap14   cmap14 = (TT_CMap14) cmap;\n    FT_UInt32   numRanges;\n    FT_UInt     cnt;\n    FT_UInt32*  q;\n\n\n    cnt       = tt_cmap14_def_char_count( p );\n    numRanges = (FT_UInt32)TT_NEXT_ULONG( p );\n\n    if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )\n      return NULL;\n\n    for ( q = cmap14->results; numRanges > 0; --numRanges )\n    {\n      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );\n\n\n      cnt = FT_NEXT_BYTE( p ) + 1;\n      do\n      {\n        q[0]  = uni;\n        uni  += 1;\n        q    += 1;\n\n      } while ( --cnt != 0 );\n    }\n    q[0] = 0;\n\n    return cmap14->results;\n  }\n\n\n  static FT_UInt32*\n  tt_cmap14_get_nondef_chars( TT_CMap     cmap,\n                              FT_Byte    *p,\n                              FT_Memory   memory )\n  {\n    TT_CMap14   cmap14 = (TT_CMap14) cmap;\n    FT_UInt32   numMappings;\n    FT_UInt     i;\n    FT_UInt32  *ret;\n\n\n    numMappings = (FT_UInt32)TT_NEXT_ULONG( p );\n\n    if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) )\n      return NULL;\n\n    ret = cmap14->results;\n    for ( i = 0; i < numMappings; ++i )\n    {\n      ret[i] = (FT_UInt32)TT_NEXT_UINT24( p );\n      p += 2;\n    }\n    ret[i] = 0;\n\n    return ret;\n  }\n\n\n  FT_CALLBACK_DEF( FT_UInt32 * )\n  tt_cmap14_variant_chars( TT_CMap    cmap,\n                           FT_Memory  memory,\n                           FT_UInt32  variantSelector )\n  {\n    FT_Byte    *p  = tt_cmap14_find_variant( cmap->data + 6,\n                                             variantSelector );\n    FT_UInt32  *ret;\n    FT_Int      i;\n    FT_ULong    defOff;\n    FT_ULong    nondefOff;\n\n\n    if ( !p )\n      return NULL;\n\n    defOff    = TT_NEXT_ULONG( p );\n    nondefOff = TT_NEXT_ULONG( p );\n\n    if ( defOff == 0 && nondefOff == 0 )\n      return NULL;\n\n    if ( defOff == 0 )\n      return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,\n                                         memory );\n    else if ( nondefOff == 0 )\n      return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,\n                                      memory );\n    else\n    {\n      /* Both a default and a non-default glyph set?  That's probably not */\n      /* good font design, but the spec allows for it...                  */\n      TT_CMap14  cmap14 = (TT_CMap14) cmap;\n      FT_UInt32  numRanges;\n      FT_UInt32  numMappings;\n      FT_UInt32  duni;\n      FT_UInt32  dcnt;\n      FT_UInt32  nuni;\n      FT_Byte*   dp;\n      FT_UInt    di, ni, k;\n\n\n      p  = cmap->data + nondefOff;\n      dp = cmap->data + defOff;\n\n      numMappings = (FT_UInt32)TT_NEXT_ULONG( p );\n      dcnt        = tt_cmap14_def_char_count( dp );\n      numRanges   = (FT_UInt32)TT_NEXT_ULONG( dp );\n\n      if ( numMappings == 0 )\n        return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,\n                                        memory );\n      if ( dcnt == 0 )\n        return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,\n                                           memory );\n\n      if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) )\n        return NULL;\n\n      ret  = cmap14->results;\n      duni = (FT_UInt32)TT_NEXT_UINT24( dp );\n      dcnt = FT_NEXT_BYTE( dp );\n      di   = 1;\n      nuni = (FT_UInt32)TT_NEXT_UINT24( p );\n      p   += 2;\n      ni   = 1;\n      i    = 0;\n\n      for ( ;; )\n      {\n        if ( nuni > duni + dcnt )\n        {\n          for ( k = 0; k <= dcnt; ++k )\n            ret[i++] = duni + k;\n\n          ++di;\n\n          if ( di > numRanges )\n            break;\n\n          duni = (FT_UInt32)TT_NEXT_UINT24( dp );\n          dcnt = FT_NEXT_BYTE( dp );\n        }\n        else\n        {\n          if ( nuni < duni )\n            ret[i++] = nuni;\n          /* If it is within the default range then ignore it -- */\n          /* that should not have happened                       */\n          ++ni;\n          if ( ni > numMappings )\n            break;\n\n          nuni = (FT_UInt32)TT_NEXT_UINT24( p );\n          p += 2;\n        }\n      }\n\n      if ( ni <= numMappings )\n      {\n        /* If we get here then we have run out of all default ranges.   */\n        /* We have read one non-default mapping which we haven't stored */\n        /* and there may be others that need to be read.                */\n        ret[i++] = nuni;\n        while ( ni < numMappings )\n        {\n          ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p );\n          p += 2;\n          ++ni;\n        }\n      }\n      else if ( di <= numRanges )\n      {\n        /* If we get here then we have run out of all non-default     */\n        /* mappings.  We have read one default range which we haven't */\n        /* stored and there may be others that need to be read.       */\n        for ( k = 0; k <= dcnt; ++k )\n          ret[i++] = duni + k;\n\n        while ( di < numRanges )\n        {\n          duni = (FT_UInt32)TT_NEXT_UINT24( dp );\n          dcnt = FT_NEXT_BYTE( dp );\n\n          for ( k = 0; k <= dcnt; ++k )\n            ret[i++] = duni + k;\n          ++di;\n        }\n      }\n\n      ret[i] = 0;\n\n      return ret;\n    }\n  }\n\n\n  FT_DEFINE_TT_CMAP(\n    tt_cmap14_class_rec,\n    sizeof ( TT_CMap14Rec ),\n\n    (FT_CMap_InitFunc)     tt_cmap14_init,\n    (FT_CMap_DoneFunc)     tt_cmap14_done,\n    (FT_CMap_CharIndexFunc)tt_cmap14_char_index,\n    (FT_CMap_CharNextFunc) tt_cmap14_char_next,\n\n    /* Format 14 extension functions */\n    (FT_CMap_CharVarIndexFunc)    tt_cmap14_char_var_index,\n    (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,\n    (FT_CMap_VariantListFunc)     tt_cmap14_variants,\n    (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,\n    (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars,\n\n    14,\n    (TT_CMap_ValidateFunc)tt_cmap14_validate,\n    (TT_CMap_Info_GetFunc)tt_cmap14_get_info )\n\n#endif /* TT_CONFIG_CMAP_FORMAT_14 */\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n  static const TT_CMap_Class  tt_cmap_classes[] =\n  {\n#define TTCMAPCITEM( a )  &a,\n#include \"ttcmapc.h\"\n    NULL,\n  };\n\n#else /*FT_CONFIG_OPTION_PIC*/\n\n  void\n  FT_Destroy_Class_tt_cmap_classes( FT_Library      library,\n                                    TT_CMap_Class*  clazz )\n  {\n    FT_Memory  memory = library->memory;\n\n\n    if ( clazz )\n      FT_FREE( clazz );\n  }\n\n\n  FT_Error\n  FT_Create_Class_tt_cmap_classes( FT_Library       library,\n                                   TT_CMap_Class**  output_class )\n  {\n    TT_CMap_Class*     clazz  = NULL;\n    TT_CMap_ClassRec*  recs;\n    FT_Error           error;\n    FT_Memory          memory = library->memory;\n\n    int  i = 0;\n\n\n#define TTCMAPCITEM( a ) i++;\n#include \"ttcmapc.h\"\n\n    /* allocate enough space for both the pointers */\n    /* plus terminator and the class instances     */\n    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * ( i + 1 ) +\n                          sizeof ( TT_CMap_ClassRec ) * i ) )\n      return error;\n\n    /* the location of the class instances follows the array of pointers */\n    recs = (TT_CMap_ClassRec*)( (char*)clazz +\n                                sizeof ( *clazz ) * ( i + 1 ) );\n    i    = 0;\n\n#undef TTCMAPCITEM\n#define  TTCMAPCITEM( a )             \\\n    FT_Init_Class_ ## a( &recs[i] );  \\\n    clazz[i] = &recs[i];              \\\n    i++;\n#include \"ttcmapc.h\"\n\n    clazz[i] = NULL;\n\n    *output_class = clazz;\n    return FT_Err_Ok;\n  }\n\n#endif /*FT_CONFIG_OPTION_PIC*/\n\n\n  /* parse the `cmap' table and build the corresponding TT_CMap objects */\n  /* in the current face                                                */\n  /*                                                                    */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_build_cmaps( TT_Face  face )\n  {\n    FT_Byte*           table = face->cmap_table;\n    FT_Byte*           limit = table + face->cmap_size;\n    FT_UInt volatile   num_cmaps;\n    FT_Byte* volatile  p     = table;\n    FT_Library         library = FT_FACE_LIBRARY( face );\n\n    FT_UNUSED( library );\n\n\n    if ( !p || p + 4 > limit )\n      return FT_THROW( Invalid_Table );\n\n    /* only recognize format 0 */\n    if ( TT_NEXT_USHORT( p ) != 0 )\n    {\n      p -= 2;\n      FT_ERROR(( \"tt_face_build_cmaps:\"\n                 \" unsupported `cmap' table format = %d\\n\",\n                 TT_PEEK_USHORT( p ) ));\n      return FT_THROW( Invalid_Table );\n    }\n\n    num_cmaps = TT_NEXT_USHORT( p );\n\n#ifdef FT_MAX_CHARMAP_CACHEABLE\n    if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE )\n      FT_ERROR(( \"tt_face_build_cmaps: too many cmap subtables (%d)\\n\"\n                 \"                     subtable #%d and higher are loaded\"\n                 \"                     but cannot be searched\\n\",\n                 num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 ));\n#endif\n\n    for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )\n    {\n      FT_CharMapRec  charmap;\n      FT_UInt32      offset;\n\n\n      charmap.platform_id = TT_NEXT_USHORT( p );\n      charmap.encoding_id = TT_NEXT_USHORT( p );\n      charmap.face        = FT_FACE( face );\n      charmap.encoding    = FT_ENCODING_NONE;  /* will be filled later */\n      offset              = TT_NEXT_ULONG( p );\n\n      if ( offset && offset <= face->cmap_size - 2 )\n      {\n        FT_Byte* volatile              cmap   = table + offset;\n        volatile FT_UInt               format = TT_PEEK_USHORT( cmap );\n        const TT_CMap_Class* volatile  pclazz = TT_CMAP_CLASSES_GET;\n        TT_CMap_Class volatile         clazz;\n\n\n        for ( ; *pclazz; pclazz++ )\n        {\n          clazz = *pclazz;\n          if ( clazz->format == format )\n          {\n            volatile TT_ValidatorRec  valid;\n            volatile FT_Error         error = FT_Err_Ok;\n\n\n            ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit,\n                               FT_VALIDATE_DEFAULT );\n\n            valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs;\n\n            if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer) == 0 )\n            {\n              /* validate this cmap sub-table */\n              error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );\n            }\n\n            if ( valid.validator.error == 0 )\n            {\n              FT_CMap  ttcmap;\n\n\n              /* It might make sense to store the single variation         */\n              /* selector cmap somewhere special.  But it would have to be */\n              /* in the public FT_FaceRec, and we can't change that.       */\n\n              if ( !FT_CMap_New( (FT_CMap_Class)clazz,\n                                 cmap, &charmap, &ttcmap ) )\n              {\n                /* it is simpler to directly set `flags' than adding */\n                /* a parameter to FT_CMap_New                        */\n                ((TT_CMap)ttcmap)->flags = (FT_Int)error;\n              }\n            }\n            else\n            {\n              FT_TRACE0(( \"tt_face_build_cmaps:\"\n                          \" broken cmap sub-table ignored\\n\" ));\n            }\n            break;\n          }\n        }\n\n        if ( *pclazz == NULL )\n        {\n          FT_TRACE0(( \"tt_face_build_cmaps:\"\n                      \" unsupported cmap sub-table ignored\\n\" ));\n        }\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL( FT_Error )\n  tt_get_cmap_info( FT_CharMap    charmap,\n                    TT_CMapInfo  *cmap_info )\n  {\n    FT_CMap        cmap  = (FT_CMap)charmap;\n    TT_CMap_Class  clazz = (TT_CMap_Class)cmap->clazz;\n\n\n    return clazz->get_cmap_info( charmap, cmap_info );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttcmap.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttcmap.h                                                               */\n/*                                                                         */\n/*    TrueType character mapping table (cmap) support (specification).     */\n/*                                                                         */\n/*  Copyright 2002-2005, 2009, 2012 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTCMAP_H__\n#define __TTCMAP_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n#include FT_INTERNAL_VALIDATE_H\n#include FT_SERVICE_TT_CMAP_H\n\nFT_BEGIN_HEADER\n\n\n#define TT_CMAP_FLAG_UNSORTED     1\n#define TT_CMAP_FLAG_OVERLAPPING  2\n\n  typedef struct  TT_CMapRec_\n  {\n    FT_CMapRec  cmap;\n    FT_Byte*    data;           /* pointer to in-memory cmap table */\n    FT_Int      flags;          /* for format 4 only               */\n\n  } TT_CMapRec, *TT_CMap;\n\n  typedef const struct TT_CMap_ClassRec_*  TT_CMap_Class;\n\n\n  typedef FT_Error\n  (*TT_CMap_ValidateFunc)( FT_Byte*      data,\n                           FT_Validator  valid );\n\n  typedef struct  TT_CMap_ClassRec_\n  {\n    FT_CMap_ClassRec      clazz;\n    FT_UInt               format;\n    TT_CMap_ValidateFunc  validate;\n    TT_CMap_Info_GetFunc  get_cmap_info;\n\n  } TT_CMap_ClassRec;\n\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_DEFINE_TT_CMAP( class_,             \\\n                           size_,              \\\n                           init_,              \\\n                           done_,              \\\n                           char_index_,        \\\n                           char_next_,         \\\n                           char_var_index_,    \\\n                           char_var_default_,  \\\n                           variant_list_,      \\\n                           charvariant_list_,  \\\n                           variantchar_list_,  \\\n                           format_,            \\\n                           validate_,          \\\n                           get_cmap_info_ )    \\\n  FT_CALLBACK_TABLE_DEF                        \\\n  const TT_CMap_ClassRec  class_ =             \\\n  {                                            \\\n    { size_,                                   \\\n      init_,                                   \\\n      done_,                                   \\\n      char_index_,                             \\\n      char_next_,                              \\\n      char_var_index_,                         \\\n      char_var_default_,                       \\\n      variant_list_,                           \\\n      charvariant_list_,                       \\\n      variantchar_list_                        \\\n    },                                         \\\n                                               \\\n    format_,                                   \\\n    validate_,                                 \\\n    get_cmap_info_                             \\\n  };\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#define FT_DEFINE_TT_CMAP( class_,                      \\\n                           size_,                       \\\n                           init_,                       \\\n                           done_,                       \\\n                           char_index_,                 \\\n                           char_next_,                  \\\n                           char_var_index_,             \\\n                           char_var_default_,           \\\n                           variant_list_,               \\\n                           charvariant_list_,           \\\n                           variantchar_list_,           \\\n                           format_,                     \\\n                           validate_,                   \\\n                           get_cmap_info_ )             \\\n  void                                                  \\\n  FT_Init_Class_ ## class_( TT_CMap_ClassRec*  clazz )  \\\n  {                                                     \\\n    clazz->clazz.size             = size_;              \\\n    clazz->clazz.init             = init_;              \\\n    clazz->clazz.done             = done_;              \\\n    clazz->clazz.char_index       = char_index_;        \\\n    clazz->clazz.char_next        = char_next_;         \\\n    clazz->clazz.char_var_index   = char_var_index_;    \\\n    clazz->clazz.char_var_default = char_var_default_;  \\\n    clazz->clazz.variant_list     = variant_list_;      \\\n    clazz->clazz.charvariant_list = charvariant_list_;  \\\n    clazz->clazz.variantchar_list = variantchar_list_;  \\\n    clazz->format                 = format_;            \\\n    clazz->validate               = validate_;          \\\n    clazz->get_cmap_info          = get_cmap_info_;     \\\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n  typedef struct  TT_ValidatorRec_\n  {\n    FT_ValidatorRec  validator;\n    FT_UInt          num_glyphs;\n\n  } TT_ValidatorRec, *TT_Validator;\n\n\n#define TT_VALIDATOR( x )          ( (TT_Validator)( x ) )\n#define TT_VALID_GLYPH_COUNT( x )  TT_VALIDATOR( x )->num_glyphs\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_build_cmaps( TT_Face  face );\n\n  /* used in tt-cmaps service */\n  FT_LOCAL( FT_Error )\n  tt_get_cmap_info( FT_CharMap    charmap,\n                    TT_CMapInfo  *cmap_info );\n\n\nFT_END_HEADER\n\n#endif /* __TTCMAP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttcmapc.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttcmapc.h                                                              */\n/*                                                                         */\n/*    TT CMAP classes definitions (specification only).                    */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifdef TT_CONFIG_CMAP_FORMAT_0\n  TTCMAPCITEM( tt_cmap0_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_2\n  TTCMAPCITEM( tt_cmap2_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_4\n  TTCMAPCITEM( tt_cmap4_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_6\n  TTCMAPCITEM( tt_cmap6_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_8\n  TTCMAPCITEM( tt_cmap8_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_10\n  TTCMAPCITEM( tt_cmap10_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_12\n  TTCMAPCITEM( tt_cmap12_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_13\n  TTCMAPCITEM( tt_cmap13_class_rec )\n#endif\n\n#ifdef TT_CONFIG_CMAP_FORMAT_14\n  TTCMAPCITEM( tt_cmap14_class_rec )\n#endif\n\n\n  /* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttkern.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttkern.c                                                               */\n/*                                                                         */\n/*    Load the basic TrueType kerning table.  This doesn't handle          */\n/*    kerning data within the GPOS table at the moment.                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n#include \"ttkern.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttkern\n\n\n#undef  TT_KERN_INDEX\n#define TT_KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_kern( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error   error;\n    FT_ULong   table_size;\n    FT_Byte*   p;\n    FT_Byte*   p_limit;\n    FT_UInt    nn, num_tables;\n    FT_UInt32  avail = 0, ordered = 0;\n\n\n    /* the kern table is optional; exit silently if it is missing */\n    error = face->goto_table( face, TTAG_kern, stream, &table_size );\n    if ( error )\n      goto Exit;\n\n    if ( table_size < 4 )  /* the case of a malformed table */\n    {\n      FT_ERROR(( \"tt_face_load_kern:\"\n                 \" kerning table is too small - ignored\\n\" ));\n      error = FT_THROW( Table_Missing );\n      goto Exit;\n    }\n\n    if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) )\n    {\n      FT_ERROR(( \"tt_face_load_kern:\"\n                 \" could not extract kerning table\\n\" ));\n      goto Exit;\n    }\n\n    face->kern_table_size = table_size;\n\n    p       = face->kern_table;\n    p_limit = p + table_size;\n\n    p         += 2; /* skip version */\n    num_tables = FT_NEXT_USHORT( p );\n\n    if ( num_tables > 32 ) /* we only support up to 32 sub-tables */\n      num_tables = 32;\n\n    for ( nn = 0; nn < num_tables; nn++ )\n    {\n      FT_UInt    num_pairs, length, coverage;\n      FT_Byte*   p_next;\n      FT_UInt32  mask = (FT_UInt32)1UL << nn;\n\n\n      if ( p + 6 > p_limit )\n        break;\n\n      p_next = p;\n\n      p += 2; /* skip version */\n      length   = FT_NEXT_USHORT( p );\n      coverage = FT_NEXT_USHORT( p );\n\n      if ( length <= 6 )\n        break;\n\n      p_next += length;\n\n      if ( p_next > p_limit )  /* handle broken table */\n        p_next = p_limit;\n\n      /* only use horizontal kerning tables */\n      if ( ( coverage & ~8 ) != 0x0001 ||\n           p + 8 > p_limit             )\n        goto NextTable;\n\n      num_pairs = FT_NEXT_USHORT( p );\n      p        += 6;\n\n      if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */\n        num_pairs = (FT_UInt)( ( p_next - p ) / 6 );\n\n      avail |= mask;\n\n      /*\n       *  Now check whether the pairs in this table are ordered.\n       *  We then can use binary search.\n       */\n      if ( num_pairs > 0 )\n      {\n        FT_ULong  count;\n        FT_ULong  old_pair;\n\n\n        old_pair = FT_NEXT_ULONG( p );\n        p       += 2;\n\n        for ( count = num_pairs - 1; count > 0; count-- )\n        {\n          FT_UInt32  cur_pair;\n\n\n          cur_pair = FT_NEXT_ULONG( p );\n          if ( cur_pair <= old_pair )\n            break;\n\n          p += 2;\n          old_pair = cur_pair;\n        }\n\n        if ( count == 0 )\n          ordered |= mask;\n      }\n\n    NextTable:\n      p = p_next;\n    }\n\n    face->num_kern_tables = nn;\n    face->kern_avail_bits = avail;\n    face->kern_order_bits = ordered;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_done_kern( TT_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n\n\n    FT_FRAME_RELEASE( face->kern_table );\n    face->kern_table_size = 0;\n    face->num_kern_tables = 0;\n    face->kern_avail_bits = 0;\n    face->kern_order_bits = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Int )\n  tt_face_get_kerning( TT_Face  face,\n                       FT_UInt  left_glyph,\n                       FT_UInt  right_glyph )\n  {\n    FT_Int    result = 0;\n    FT_UInt   count, mask = 1;\n    FT_Byte*  p       = face->kern_table;\n    FT_Byte*  p_limit = p + face->kern_table_size;\n\n\n    p   += 4;\n    mask = 0x0001;\n\n    for ( count = face->num_kern_tables;\n          count > 0 && p + 6 <= p_limit;\n          count--, mask <<= 1 )\n    {\n      FT_Byte* base     = p;\n      FT_Byte* next     = base;\n      FT_UInt  version  = FT_NEXT_USHORT( p );\n      FT_UInt  length   = FT_NEXT_USHORT( p );\n      FT_UInt  coverage = FT_NEXT_USHORT( p );\n      FT_UInt  num_pairs;\n      FT_Int   value    = 0;\n\n      FT_UNUSED( version );\n\n\n      next = base + length;\n\n      if ( next > p_limit )  /* handle broken table */\n        next = p_limit;\n\n      if ( ( face->kern_avail_bits & mask ) == 0 )\n        goto NextTable;\n\n      if ( p + 8 > next )\n        goto NextTable;\n\n      num_pairs = FT_NEXT_USHORT( p );\n      p        += 6;\n\n      if ( ( next - p ) < 6 * (int)num_pairs )  /* handle broken count  */\n        num_pairs = (FT_UInt)( ( next - p ) / 6 );\n\n      switch ( coverage >> 8 )\n      {\n      case 0:\n        {\n          FT_ULong  key0 = TT_KERN_INDEX( left_glyph, right_glyph );\n\n\n          if ( face->kern_order_bits & mask )   /* binary search */\n          {\n            FT_UInt   min = 0;\n            FT_UInt   max = num_pairs;\n\n\n            while ( min < max )\n            {\n              FT_UInt   mid = ( min + max ) >> 1;\n              FT_Byte*  q   = p + 6 * mid;\n              FT_ULong  key;\n\n\n              key = FT_NEXT_ULONG( q );\n\n              if ( key == key0 )\n              {\n                value = FT_PEEK_SHORT( q );\n                goto Found;\n              }\n              if ( key < key0 )\n                min = mid + 1;\n              else\n                max = mid;\n            }\n          }\n          else /* linear search */\n          {\n            FT_UInt  count2;\n\n\n            for ( count2 = num_pairs; count2 > 0; count2-- )\n            {\n              FT_ULong  key = FT_NEXT_ULONG( p );\n\n\n              if ( key == key0 )\n              {\n                value = FT_PEEK_SHORT( p );\n                goto Found;\n              }\n              p += 2;\n            }\n          }\n        }\n        break;\n\n       /*\n        *  We don't support format 2 because we haven't seen a single font\n        *  using it in real life...\n        */\n\n      default:\n        ;\n      }\n\n      goto NextTable;\n\n    Found:\n      if ( coverage & 8 ) /* override or add */\n        result = value;\n      else\n        result += value;\n\n    NextTable:\n      p = next;\n    }\n\n    return result;\n  }\n\n#undef TT_KERN_INDEX\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttkern.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttkern.h                                                               */\n/*                                                                         */\n/*    Load the basic TrueType kerning table.  This doesn't handle          */\n/*    kerning data within the GPOS table at the moment.                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2005, 2007 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTKERN_H__\n#define __TTKERN_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error  )\n  tt_face_load_kern( TT_Face    face,\n                     FT_Stream  stream );\n\n  FT_LOCAL( void )\n  tt_face_done_kern( TT_Face  face );\n\n  FT_LOCAL( FT_Int )\n  tt_face_get_kerning( TT_Face     face,\n                       FT_UInt     left_glyph,\n                       FT_UInt     right_glyph );\n\n#define TT_FACE_HAS_KERNING( face )  ( (face)->kern_avail_bits != 0 )\n\n\nFT_END_HEADER\n\n#endif /* __TTKERN_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttload.c                                                               */\n/*                                                                         */\n/*    Load the basic TrueType tables, i.e., tables that can be either in   */\n/*    TTF or OTF fonts (body).                                             */\n/*                                                                         */\n/*  Copyright 1996-2010, 2012, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n#include \"ttload.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttload\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_lookup_table                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Looks for a TrueType table by name.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A face object handle.                                      */\n  /*                                                                       */\n  /*    tag  :: The searched tag.                                          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A pointer to the table directory entry.  0 if not found.           */\n  /*                                                                       */\n  FT_LOCAL_DEF( TT_Table  )\n  tt_face_lookup_table( TT_Face   face,\n                        FT_ULong  tag  )\n  {\n    TT_Table  entry;\n    TT_Table  limit;\n#ifdef FT_DEBUG_LEVEL_TRACE\n    FT_Bool   zero_length = FALSE;\n#endif\n\n\n    FT_TRACE4(( \"tt_face_lookup_table: %08p, `%c%c%c%c' -- \",\n                face,\n                (FT_Char)( tag >> 24 ),\n                (FT_Char)( tag >> 16 ),\n                (FT_Char)( tag >> 8  ),\n                (FT_Char)( tag       ) ));\n\n    entry = face->dir_tables;\n    limit = entry + face->num_tables;\n\n    for ( ; entry < limit; entry++ )\n    {\n      /* For compatibility with Windows, we consider    */\n      /* zero-length tables the same as missing tables. */\n      if ( entry->Tag == tag )\n      {\n        if ( entry->Length != 0 )\n        {\n          FT_TRACE4(( \"found table.\\n\" ));\n          return entry;\n        }\n#ifdef FT_DEBUG_LEVEL_TRACE\n        zero_length = TRUE;\n#endif\n      }\n    }\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n    if ( zero_length )\n      FT_TRACE4(( \"ignoring empty table\\n\" ));\n    else\n      FT_TRACE4(( \"could not find table\\n\" ));\n#endif\n\n    return NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_goto_table                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Looks for a TrueType table by name, then seek a stream to it.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A face object handle.                                    */\n  /*                                                                       */\n  /*    tag    :: The searched tag.                                        */\n  /*                                                                       */\n  /*    stream :: The stream to seek when the table is found.              */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    length :: The length of the table if found, undefined otherwise.   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_goto_table( TT_Face    face,\n                      FT_ULong   tag,\n                      FT_Stream  stream,\n                      FT_ULong*  length )\n  {\n    TT_Table  table;\n    FT_Error  error;\n\n\n    table = tt_face_lookup_table( face, tag );\n    if ( table )\n    {\n      if ( length )\n        *length = table->Length;\n\n      if ( FT_STREAM_SEEK( table->Offset ) )\n        goto Exit;\n    }\n    else\n      error = FT_THROW( Table_Missing );\n\n  Exit:\n    return error;\n  }\n\n\n  /* Here, we                                                         */\n  /*                                                                  */\n  /* - check that `num_tables' is valid (and adjust it if necessary)  */\n  /*                                                                  */\n  /* - look for a `head' table, check its size, and parse it to check */\n  /*   whether its `magic' field is correctly set                     */\n  /*                                                                  */\n  /* - errors (except errors returned by stream handling)             */\n  /*                                                                  */\n  /*     SFNT_Err_Unknown_File_Format:                                */\n  /*       no table is defined in directory, it is not sfnt-wrapped   */\n  /*       data                                                       */\n  /*     SFNT_Err_Table_Missing:                                      */\n  /*       table directory is valid, but essential tables             */\n  /*       (head/bhed/SING) are missing                               */\n  /*                                                                  */\n  static FT_Error\n  check_table_dir( SFNT_Header  sfnt,\n                   FT_Stream    stream )\n  {\n    FT_Error   error;\n    FT_UShort  nn, valid_entries = 0;\n    FT_UInt    has_head = 0, has_sing = 0, has_meta = 0;\n    FT_ULong   offset = sfnt->offset + 12;\n\n    static const FT_Frame_Field  table_dir_entry_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_TableRec\n\n      FT_FRAME_START( 16 ),\n        FT_FRAME_ULONG( Tag ),\n        FT_FRAME_ULONG( CheckSum ),\n        FT_FRAME_ULONG( Offset ),\n        FT_FRAME_ULONG( Length ),\n      FT_FRAME_END\n    };\n\n\n    if ( FT_STREAM_SEEK( offset ) )\n      goto Exit;\n\n    for ( nn = 0; nn < sfnt->num_tables; nn++ )\n    {\n      TT_TableRec  table;\n\n\n      if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) )\n      {\n        nn--;\n        FT_TRACE2(( \"check_table_dir:\"\n                    \" can read only %d table%s in font (instead of %d)\\n\",\n                    nn, nn == 1 ? \"\" : \"s\", sfnt->num_tables ));\n        sfnt->num_tables = nn;\n        break;\n      }\n\n      /* we ignore invalid tables */\n      if ( table.Offset + table.Length > stream->size )\n      {\n        FT_TRACE2(( \"check_table_dir: table entry %d invalid\\n\", nn ));\n        continue;\n      }\n      else\n        valid_entries++;\n\n      if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed )\n      {\n        FT_UInt32  magic;\n\n\n#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n        if ( table.Tag == TTAG_head )\n#endif\n          has_head = 1;\n\n        /*\n         * The table length should be 0x36, but certain font tools make it\n         * 0x38, so we will just check that it is greater.\n         *\n         * Note that according to the specification, the table must be\n         * padded to 32-bit lengths, but this doesn't apply to the value of\n         * its `Length' field!\n         *\n         */\n        if ( table.Length < 0x36 )\n        {\n          FT_TRACE2(( \"check_table_dir: `head' table too small\\n\" ));\n          error = FT_THROW( Table_Missing );\n          goto Exit;\n        }\n\n        if ( FT_STREAM_SEEK( table.Offset + 12 ) ||\n             FT_READ_ULONG( magic )              )\n          goto Exit;\n\n        if ( magic != 0x5F0F3CF5UL )\n        {\n          FT_TRACE2(( \"check_table_dir:\"\n                      \" no magic number found in `head' table\\n\"));\n          error = FT_THROW( Table_Missing );\n          goto Exit;\n        }\n\n        if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) )\n          goto Exit;\n      }\n      else if ( table.Tag == TTAG_SING )\n        has_sing = 1;\n      else if ( table.Tag == TTAG_META )\n        has_meta = 1;\n    }\n\n    sfnt->num_tables = valid_entries;\n\n    if ( sfnt->num_tables == 0 )\n    {\n      FT_TRACE2(( \"check_table_dir: no tables found\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* if `sing' and `meta' tables are present, there is no `head' table */\n    if ( has_head || ( has_sing && has_meta ) )\n    {\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n    else\n    {\n      FT_TRACE2(( \"check_table_dir:\" ));\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n      FT_TRACE2(( \" neither `head', `bhed', nor `sing' table found\\n\" ));\n#else\n      FT_TRACE2(( \" neither `head' nor `sing' table found\\n\" ));\n#endif\n      error = FT_THROW( Table_Missing );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_font_dir                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the header of a SFNT font file.                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face       :: A handle to the target face object.                  */\n  /*                                                                       */\n  /*    stream     :: The input stream.                                    */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    sfnt       :: The SFNT header.                                     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be at the beginning of the font directory.  */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_font_dir( TT_Face    face,\n                         FT_Stream  stream )\n  {\n    SFNT_HeaderRec  sfnt;\n    FT_Error        error;\n    FT_Memory       memory = stream->memory;\n    TT_TableRec*    entry;\n    FT_Int          nn;\n\n    static const FT_Frame_Field  offset_table_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  SFNT_HeaderRec\n\n      FT_FRAME_START( 8 ),\n        FT_FRAME_USHORT( num_tables ),\n        FT_FRAME_USHORT( search_range ),\n        FT_FRAME_USHORT( entry_selector ),\n        FT_FRAME_USHORT( range_shift ),\n      FT_FRAME_END\n    };\n\n\n    FT_TRACE2(( \"tt_face_load_font_dir: %08p\\n\", face ));\n\n    /* read the offset table */\n\n    sfnt.offset = FT_STREAM_POS();\n\n    if ( FT_READ_ULONG( sfnt.format_tag )                    ||\n         FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) )\n      goto Exit;\n\n    /* many fonts don't have these fields set correctly */\n#if 0\n    if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 )        ||\n         sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 )\n      return FT_THROW( Unknown_File_Format );\n#endif\n\n    /* load the table directory */\n\n    FT_TRACE2(( \"-- Number of tables: %10u\\n\",    sfnt.num_tables ));\n    FT_TRACE2(( \"-- Format version:   0x%08lx\\n\", sfnt.format_tag ));\n\n    if ( sfnt.format_tag != TTAG_OTTO )\n    {\n      /* check first */\n      error = check_table_dir( &sfnt, stream );\n      if ( error )\n      {\n        FT_TRACE2(( \"tt_face_load_font_dir:\"\n                    \" invalid table directory for TrueType\\n\" ));\n\n        goto Exit;\n      }\n    }\n\n    face->num_tables = sfnt.num_tables;\n    face->format_tag = sfnt.format_tag;\n\n    if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )\n      goto Exit;\n\n    if ( FT_STREAM_SEEK( sfnt.offset + 12 )       ||\n         FT_FRAME_ENTER( face->num_tables * 16L ) )\n      goto Exit;\n\n    entry = face->dir_tables;\n\n    FT_TRACE2(( \"\\n\"\n                \"  tag    offset    length   checksum\\n\"\n                \"  ----------------------------------\\n\" ));\n\n    for ( nn = 0; nn < sfnt.num_tables; nn++ )\n    {\n      entry->Tag      = FT_GET_TAG4();\n      entry->CheckSum = FT_GET_ULONG();\n      entry->Offset   = FT_GET_LONG();\n      entry->Length   = FT_GET_LONG();\n\n      /* ignore invalid tables */\n      if ( entry->Offset + entry->Length > stream->size )\n        continue;\n      else\n      {\n        FT_TRACE2(( \"  %c%c%c%c  %08lx  %08lx  %08lx\\n\",\n                    (FT_Char)( entry->Tag >> 24 ),\n                    (FT_Char)( entry->Tag >> 16 ),\n                    (FT_Char)( entry->Tag >> 8  ),\n                    (FT_Char)( entry->Tag       ),\n                    entry->Offset,\n                    entry->Length,\n                    entry->CheckSum ));\n        entry++;\n      }\n    }\n\n    FT_FRAME_EXIT();\n\n    FT_TRACE2(( \"table directory loaded\\n\\n\" ));\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_any                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads any font table into client memory.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: The face object to look for.                             */\n  /*                                                                       */\n  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */\n  /*              to access the whole font file, else set this parameter   */\n  /*              to a valid TrueType table tag that you can forge with    */\n  /*              the MAKE_TT_TAG macro.                                   */\n  /*                                                                       */\n  /*    offset :: The starting offset in the table (or the file if         */\n  /*              tag == 0).                                               */\n  /*                                                                       */\n  /*    length :: The address of the decision variable:                    */\n  /*                                                                       */\n  /*                If length == NULL:                                     */\n  /*                  Loads the whole table.  Returns an error if          */\n  /*                  `offset' == 0!                                       */\n  /*                                                                       */\n  /*                If *length == 0:                                       */\n  /*                  Exits immediately; returning the length of the given */\n  /*                  table or of the font file, depending on the value of */\n  /*                  `tag'.                                               */\n  /*                                                                       */\n  /*                If *length != 0:                                       */\n  /*                  Loads the next `length' bytes of table or font,      */\n  /*                  starting at offset `offset' (in table or font too).  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    buffer :: The address of target buffer.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_any( TT_Face    face,\n                    FT_ULong   tag,\n                    FT_Long    offset,\n                    FT_Byte*   buffer,\n                    FT_ULong*  length )\n  {\n    FT_Error   error;\n    FT_Stream  stream;\n    TT_Table   table;\n    FT_ULong   size;\n\n\n    if ( tag != 0 )\n    {\n      /* look for tag in font directory */\n      table = tt_face_lookup_table( face, tag );\n      if ( !table )\n      {\n        error = FT_THROW( Table_Missing );\n        goto Exit;\n      }\n\n      offset += table->Offset;\n      size    = table->Length;\n    }\n    else\n      /* tag == 0 -- the user wants to access the font file directly */\n      size = face->root.stream->size;\n\n    if ( length && *length == 0 )\n    {\n      *length = size;\n\n      return FT_Err_Ok;\n    }\n\n    if ( length )\n      size = *length;\n\n    stream = face->root.stream;\n    /* the `if' is syntactic sugar for picky compilers */\n    if ( FT_STREAM_READ_AT( offset, buffer, size ) )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_generic_header                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the TrueType table `head' or `bhed'.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  tt_face_load_generic_header( TT_Face    face,\n                               FT_Stream  stream,\n                               FT_ULong   tag )\n  {\n    FT_Error    error;\n    TT_Header*  header;\n\n    static const FT_Frame_Field  header_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_Header\n\n      FT_FRAME_START( 54 ),\n        FT_FRAME_ULONG ( Table_Version ),\n        FT_FRAME_ULONG ( Font_Revision ),\n        FT_FRAME_LONG  ( CheckSum_Adjust ),\n        FT_FRAME_LONG  ( Magic_Number ),\n        FT_FRAME_USHORT( Flags ),\n        FT_FRAME_USHORT( Units_Per_EM ),\n        FT_FRAME_LONG  ( Created[0] ),\n        FT_FRAME_LONG  ( Created[1] ),\n        FT_FRAME_LONG  ( Modified[0] ),\n        FT_FRAME_LONG  ( Modified[1] ),\n        FT_FRAME_SHORT ( xMin ),\n        FT_FRAME_SHORT ( yMin ),\n        FT_FRAME_SHORT ( xMax ),\n        FT_FRAME_SHORT ( yMax ),\n        FT_FRAME_USHORT( Mac_Style ),\n        FT_FRAME_USHORT( Lowest_Rec_PPEM ),\n        FT_FRAME_SHORT ( Font_Direction ),\n        FT_FRAME_SHORT ( Index_To_Loc_Format ),\n        FT_FRAME_SHORT ( Glyph_Data_Format ),\n      FT_FRAME_END\n    };\n\n\n    error = face->goto_table( face, tag, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    header = &face->header;\n\n    if ( FT_STREAM_READ_FIELDS( header_fields, header ) )\n      goto Exit;\n\n    FT_TRACE3(( \"Units per EM: %4u\\n\", header->Units_Per_EM ));\n    FT_TRACE3(( \"IndexToLoc:   %4d\\n\", header->Index_To_Loc_Format ));\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_head( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    return tt_face_load_generic_header( face, stream, TTAG_head );\n  }\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_bhed( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    return tt_face_load_generic_header( face, stream, TTAG_bhed );\n  }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_max_profile                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the maximum profile into a face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_maxp( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error        error;\n    TT_MaxProfile*  maxProfile = &face->max_profile;\n\n    static const FT_Frame_Field  maxp_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_MaxProfile\n\n      FT_FRAME_START( 6 ),\n        FT_FRAME_LONG  ( version ),\n        FT_FRAME_USHORT( numGlyphs ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  maxp_fields_extra[] =\n    {\n      FT_FRAME_START( 26 ),\n        FT_FRAME_USHORT( maxPoints ),\n        FT_FRAME_USHORT( maxContours ),\n        FT_FRAME_USHORT( maxCompositePoints ),\n        FT_FRAME_USHORT( maxCompositeContours ),\n        FT_FRAME_USHORT( maxZones ),\n        FT_FRAME_USHORT( maxTwilightPoints ),\n        FT_FRAME_USHORT( maxStorage ),\n        FT_FRAME_USHORT( maxFunctionDefs ),\n        FT_FRAME_USHORT( maxInstructionDefs ),\n        FT_FRAME_USHORT( maxStackElements ),\n        FT_FRAME_USHORT( maxSizeOfInstructions ),\n        FT_FRAME_USHORT( maxComponentElements ),\n        FT_FRAME_USHORT( maxComponentDepth ),\n      FT_FRAME_END\n    };\n\n\n    error = face->goto_table( face, TTAG_maxp, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) )\n      goto Exit;\n\n    maxProfile->maxPoints             = 0;\n    maxProfile->maxContours           = 0;\n    maxProfile->maxCompositePoints    = 0;\n    maxProfile->maxCompositeContours  = 0;\n    maxProfile->maxZones              = 0;\n    maxProfile->maxTwilightPoints     = 0;\n    maxProfile->maxStorage            = 0;\n    maxProfile->maxFunctionDefs       = 0;\n    maxProfile->maxInstructionDefs    = 0;\n    maxProfile->maxStackElements      = 0;\n    maxProfile->maxSizeOfInstructions = 0;\n    maxProfile->maxComponentElements  = 0;\n    maxProfile->maxComponentDepth     = 0;\n\n    if ( maxProfile->version >= 0x10000L )\n    {\n      if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) )\n        goto Exit;\n\n      /* XXX: an adjustment that is necessary to load certain */\n      /*      broken fonts like `Keystrokes MT' :-(           */\n      /*                                                      */\n      /*   We allocate 64 function entries by default when    */\n      /*   the maxFunctionDefs value is smaller.              */\n\n      if ( maxProfile->maxFunctionDefs < 64 )\n        maxProfile->maxFunctionDefs = 64;\n\n      /* we add 4 phantom points later */\n      if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) )\n      {\n        FT_TRACE0(( \"tt_face_load_maxp:\"\n                    \" too much twilight points in `maxp' table;\\n\"\n                    \"                  \"\n                    \" some glyphs might be rendered incorrectly\\n\" ));\n\n        maxProfile->maxTwilightPoints = 0xFFFFU - 4;\n      }\n\n      /* we arbitrarily limit recursion to avoid stack exhaustion */\n      if ( maxProfile->maxComponentDepth > 100 )\n      {\n        FT_TRACE0(( \"tt_face_load_maxp:\"\n                    \" abnormally large component depth (%d) set to 100\\n\",\n                    maxProfile->maxComponentDepth ));\n        maxProfile->maxComponentDepth = 100;\n      }\n    }\n\n    FT_TRACE3(( \"numGlyphs: %u\\n\", maxProfile->numGlyphs ));\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_name                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the name records.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_name( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error      error;\n    FT_Memory     memory = stream->memory;\n    FT_ULong      table_pos, table_len;\n    FT_ULong      storage_start, storage_limit;\n    FT_UInt       count;\n    TT_NameTable  table;\n\n    static const FT_Frame_Field  name_table_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_NameTableRec\n\n      FT_FRAME_START( 6 ),\n        FT_FRAME_USHORT( format ),\n        FT_FRAME_USHORT( numNameRecords ),\n        FT_FRAME_USHORT( storageOffset ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  name_record_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_NameEntryRec\n\n      /* no FT_FRAME_START */\n        FT_FRAME_USHORT( platformID ),\n        FT_FRAME_USHORT( encodingID ),\n        FT_FRAME_USHORT( languageID ),\n        FT_FRAME_USHORT( nameID ),\n        FT_FRAME_USHORT( stringLength ),\n        FT_FRAME_USHORT( stringOffset ),\n      FT_FRAME_END\n    };\n\n\n    table         = &face->name_table;\n    table->stream = stream;\n\n    error = face->goto_table( face, TTAG_name, stream, &table_len );\n    if ( error )\n      goto Exit;\n\n    table_pos = FT_STREAM_POS();\n\n\n    if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) )\n      goto Exit;\n\n    /* Some popular Asian fonts have an invalid `storageOffset' value   */\n    /* (it should be at least \"6 + 12*num_names\").  However, the string */\n    /* offsets, computed as \"storageOffset + entry->stringOffset\", are  */\n    /* valid pointers within the name table...                          */\n    /*                                                                  */\n    /* We thus can't check `storageOffset' right now.                   */\n    /*                                                                  */\n    storage_start = table_pos + 6 + 12*table->numNameRecords;\n    storage_limit = table_pos + table_len;\n\n    if ( storage_start > storage_limit )\n    {\n      FT_ERROR(( \"tt_face_load_name: invalid `name' table\\n\" ));\n      error = FT_THROW( Name_Table_Missing );\n      goto Exit;\n    }\n\n    /* Allocate the array of name records. */\n    count                 = table->numNameRecords;\n    table->numNameRecords = 0;\n\n    if ( FT_NEW_ARRAY( table->names, count ) ||\n         FT_FRAME_ENTER( count * 12 )        )\n      goto Exit;\n\n    /* Load the name records and determine how much storage is needed */\n    /* to hold the strings themselves.                                */\n    {\n      TT_NameEntryRec*  entry = table->names;\n\n\n      for ( ; count > 0; count-- )\n      {\n        if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) )\n          continue;\n\n        /* check that the name is not empty */\n        if ( entry->stringLength == 0 )\n          continue;\n\n        /* check that the name string is within the table */\n        entry->stringOffset += table_pos + table->storageOffset;\n        if ( entry->stringOffset                       < storage_start ||\n             entry->stringOffset + entry->stringLength > storage_limit )\n        {\n          /* invalid entry - ignore it */\n          entry->stringOffset = 0;\n          entry->stringLength = 0;\n          continue;\n        }\n\n        entry++;\n      }\n\n      table->numNameRecords = (FT_UInt)( entry - table->names );\n    }\n\n    FT_FRAME_EXIT();\n\n    /* everything went well, update face->num_names */\n    face->num_names = (FT_UShort) table->numNameRecords;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_free_names                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Frees the name records.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the target face object.                        */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_face_free_name( TT_Face  face )\n  {\n    FT_Memory     memory = face->root.driver->root.memory;\n    TT_NameTable  table  = &face->name_table;\n    TT_NameEntry  entry  = table->names;\n    FT_UInt       count  = table->numNameRecords;\n\n\n    if ( table->names )\n    {\n      for ( ; count > 0; count--, entry++ )\n      {\n        FT_FREE( entry->string );\n        entry->stringLength = 0;\n      }\n\n      /* free strings table */\n      FT_FREE( table->names );\n    }\n\n    table->numNameRecords = 0;\n    table->format         = 0;\n    table->storageOffset  = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_cmap                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the cmap directory in a face object.  The cmaps themselves   */\n  /*    are loaded on demand in the `ttcmap.c' module.                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_cmap( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error  error;\n\n\n    error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );\n    if ( error )\n      goto Exit;\n\n    if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) )\n      face->cmap_size = 0;\n\n  Exit:\n    return error;\n  }\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_os2                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the OS2 table.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_os2( TT_Face    face,\n                    FT_Stream  stream )\n  {\n    FT_Error  error;\n    TT_OS2*   os2;\n\n    static const FT_Frame_Field  os2_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_OS2\n\n      FT_FRAME_START( 78 ),\n        FT_FRAME_USHORT( version ),\n        FT_FRAME_SHORT ( xAvgCharWidth ),\n        FT_FRAME_USHORT( usWeightClass ),\n        FT_FRAME_USHORT( usWidthClass ),\n        FT_FRAME_SHORT ( fsType ),\n        FT_FRAME_SHORT ( ySubscriptXSize ),\n        FT_FRAME_SHORT ( ySubscriptYSize ),\n        FT_FRAME_SHORT ( ySubscriptXOffset ),\n        FT_FRAME_SHORT ( ySubscriptYOffset ),\n        FT_FRAME_SHORT ( ySuperscriptXSize ),\n        FT_FRAME_SHORT ( ySuperscriptYSize ),\n        FT_FRAME_SHORT ( ySuperscriptXOffset ),\n        FT_FRAME_SHORT ( ySuperscriptYOffset ),\n        FT_FRAME_SHORT ( yStrikeoutSize ),\n        FT_FRAME_SHORT ( yStrikeoutPosition ),\n        FT_FRAME_SHORT ( sFamilyClass ),\n        FT_FRAME_BYTE  ( panose[0] ),\n        FT_FRAME_BYTE  ( panose[1] ),\n        FT_FRAME_BYTE  ( panose[2] ),\n        FT_FRAME_BYTE  ( panose[3] ),\n        FT_FRAME_BYTE  ( panose[4] ),\n        FT_FRAME_BYTE  ( panose[5] ),\n        FT_FRAME_BYTE  ( panose[6] ),\n        FT_FRAME_BYTE  ( panose[7] ),\n        FT_FRAME_BYTE  ( panose[8] ),\n        FT_FRAME_BYTE  ( panose[9] ),\n        FT_FRAME_ULONG ( ulUnicodeRange1 ),\n        FT_FRAME_ULONG ( ulUnicodeRange2 ),\n        FT_FRAME_ULONG ( ulUnicodeRange3 ),\n        FT_FRAME_ULONG ( ulUnicodeRange4 ),\n        FT_FRAME_BYTE  ( achVendID[0] ),\n        FT_FRAME_BYTE  ( achVendID[1] ),\n        FT_FRAME_BYTE  ( achVendID[2] ),\n        FT_FRAME_BYTE  ( achVendID[3] ),\n\n        FT_FRAME_USHORT( fsSelection ),\n        FT_FRAME_USHORT( usFirstCharIndex ),\n        FT_FRAME_USHORT( usLastCharIndex ),\n        FT_FRAME_SHORT ( sTypoAscender ),\n        FT_FRAME_SHORT ( sTypoDescender ),\n        FT_FRAME_SHORT ( sTypoLineGap ),\n        FT_FRAME_USHORT( usWinAscent ),\n        FT_FRAME_USHORT( usWinDescent ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  os2_fields_extra[] =\n    {\n      FT_FRAME_START( 8 ),\n        FT_FRAME_ULONG( ulCodePageRange1 ),\n        FT_FRAME_ULONG( ulCodePageRange2 ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  os2_fields_extra2[] =\n    {\n      FT_FRAME_START( 10 ),\n        FT_FRAME_SHORT ( sxHeight ),\n        FT_FRAME_SHORT ( sCapHeight ),\n        FT_FRAME_USHORT( usDefaultChar ),\n        FT_FRAME_USHORT( usBreakChar ),\n        FT_FRAME_USHORT( usMaxContext ),\n      FT_FRAME_END\n    };\n\n\n    /* We now support old Mac fonts where the OS/2 table doesn't  */\n    /* exist.  Simply put, we set the `version' field to 0xFFFF   */\n    /* and test this value each time we need to access the table. */\n    error = face->goto_table( face, TTAG_OS2, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    os2 = &face->os2;\n\n    if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) )\n      goto Exit;\n\n    os2->ulCodePageRange1 = 0;\n    os2->ulCodePageRange2 = 0;\n    os2->sxHeight         = 0;\n    os2->sCapHeight       = 0;\n    os2->usDefaultChar    = 0;\n    os2->usBreakChar      = 0;\n    os2->usMaxContext     = 0;\n\n    if ( os2->version >= 0x0001 )\n    {\n      /* only version 1 tables */\n      if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) )\n        goto Exit;\n\n      if ( os2->version >= 0x0002 )\n      {\n        /* only version 2 tables */\n        if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) )\n          goto Exit;\n      }\n    }\n\n    FT_TRACE3(( \"sTypoAscender:  %4d\\n\",   os2->sTypoAscender ));\n    FT_TRACE3(( \"sTypoDescender: %4d\\n\",   os2->sTypoDescender ));\n    FT_TRACE3(( \"usWinAscent:    %4u\\n\",   os2->usWinAscent ));\n    FT_TRACE3(( \"usWinDescent:   %4u\\n\",   os2->usWinDescent ));\n    FT_TRACE3(( \"fsSelection:    0x%2x\\n\", os2->fsSelection ));\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_postscript                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the Postscript table.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_post( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error        error;\n    TT_Postscript*  post = &face->postscript;\n\n    static const FT_Frame_Field  post_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_Postscript\n\n      FT_FRAME_START( 32 ),\n        FT_FRAME_ULONG( FormatType ),\n        FT_FRAME_ULONG( italicAngle ),\n        FT_FRAME_SHORT( underlinePosition ),\n        FT_FRAME_SHORT( underlineThickness ),\n        FT_FRAME_ULONG( isFixedPitch ),\n        FT_FRAME_ULONG( minMemType42 ),\n        FT_FRAME_ULONG( maxMemType42 ),\n        FT_FRAME_ULONG( minMemType1 ),\n        FT_FRAME_ULONG( maxMemType1 ),\n      FT_FRAME_END\n    };\n\n\n    error = face->goto_table( face, TTAG_post, stream, 0 );\n    if ( error )\n      return error;\n\n    if ( FT_STREAM_READ_FIELDS( post_fields, post ) )\n      return error;\n\n    /* we don't load the glyph names, we do that in another */\n    /* module (ttpost).                                     */\n\n    FT_TRACE3(( \"FormatType:   0x%x\\n\", post->FormatType ));\n    FT_TRACE3(( \"isFixedPitch:   %s\\n\", post->isFixedPitch\n                                        ? \"  yes\" : \"   no\" ));\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_pclt                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the PCL 5 Table.                                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_pclt( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    static const FT_Frame_Field  pclt_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_PCLT\n\n      FT_FRAME_START( 54 ),\n        FT_FRAME_ULONG ( Version ),\n        FT_FRAME_ULONG ( FontNumber ),\n        FT_FRAME_USHORT( Pitch ),\n        FT_FRAME_USHORT( xHeight ),\n        FT_FRAME_USHORT( Style ),\n        FT_FRAME_USHORT( TypeFamily ),\n        FT_FRAME_USHORT( CapHeight ),\n        FT_FRAME_BYTES ( TypeFace, 16 ),\n        FT_FRAME_BYTES ( CharacterComplement, 8 ),\n        FT_FRAME_BYTES ( FileName, 6 ),\n        FT_FRAME_CHAR  ( StrokeWeight ),\n        FT_FRAME_CHAR  ( WidthType ),\n        FT_FRAME_BYTE  ( SerifStyle ),\n        FT_FRAME_BYTE  ( Reserved ),\n      FT_FRAME_END\n    };\n\n    FT_Error  error;\n    TT_PCLT*  pclt = &face->pclt;\n\n\n    /* optional table */\n    error = face->goto_table( face, TTAG_PCLT, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_gasp                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the `gasp' table into a face object.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_gasp( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n\n    FT_UInt        j,num_ranges;\n    TT_GaspRange   gaspranges = NULL;\n\n\n    /* the gasp table is optional */\n    error = face->goto_table( face, TTAG_gasp, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    if ( FT_FRAME_ENTER( 4L ) )\n      goto Exit;\n\n    face->gasp.version   = FT_GET_USHORT();\n    face->gasp.numRanges = FT_GET_USHORT();\n\n    FT_FRAME_EXIT();\n\n    /* only support versions 0 and 1 of the table */\n    if ( face->gasp.version >= 2 )\n    {\n      face->gasp.numRanges = 0;\n      error = FT_THROW( Invalid_Table );\n      goto Exit;\n    }\n\n    num_ranges = face->gasp.numRanges;\n    FT_TRACE3(( \"numRanges: %u\\n\", num_ranges ));\n\n    if ( FT_QNEW_ARRAY( face->gasp.gaspRanges, num_ranges ) ||\n         FT_FRAME_ENTER( num_ranges * 4L )                  )\n      goto Exit;\n\n    gaspranges = face->gasp.gaspRanges;\n\n    for ( j = 0; j < num_ranges; j++ )\n    {\n      gaspranges[j].maxPPEM  = FT_GET_USHORT();\n      gaspranges[j].gaspFlag = FT_GET_USHORT();\n\n      FT_TRACE3(( \"gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\\n\",\n                  j,\n                  gaspranges[j].maxPPEM,\n                  gaspranges[j].gaspFlag ));\n    }\n\n    FT_FRAME_EXIT();\n\n  Exit:\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttload.h                                                               */\n/*                                                                         */\n/*    Load the basic TrueType tables, i.e., tables that can be either in   */\n/*    TTF or OTF fonts (specification).                                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2005, 2006 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTLOAD_H__\n#define __TTLOAD_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( TT_Table  )\n  tt_face_lookup_table( TT_Face   face,\n                        FT_ULong  tag );\n\n  FT_LOCAL( FT_Error )\n  tt_face_goto_table( TT_Face    face,\n                      FT_ULong   tag,\n                      FT_Stream  stream,\n                      FT_ULong*  length );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_font_dir( TT_Face    face,\n                         FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_any( TT_Face    face,\n                    FT_ULong   tag,\n                    FT_Long    offset,\n                    FT_Byte*   buffer,\n                    FT_ULong*  length );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_head( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_cmap( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_maxp( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_name( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_os2( TT_Face    face,\n                    FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_post( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_pclt( TT_Face    face,\n                     FT_Stream  stream );\n\n  FT_LOCAL( void )\n  tt_face_free_name( TT_Face  face );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_gasp( TT_Face    face,\n                     FT_Stream  stream );\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_bhed( TT_Face    face,\n                     FT_Stream  stream );\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\nFT_END_HEADER\n\n#endif /* __TTLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttmtx.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttmtx.c                                                                */\n/*                                                                         */\n/*    Load the metrics tables common to TTF and OTF fonts (body).          */\n/*                                                                         */\n/*  Copyright 2006-2009, 2011-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n#include \"ttmtx.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttmtx\n\n\n  /*\n   *  Unfortunately, we can't enable our memory optimizations if\n   *  FT_CONFIG_OPTION_OLD_INTERNALS is defined.  This is because at least\n   *  one rogue client (libXfont in the X.Org XServer) is directly accessing\n   *  the metrics.\n   */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_hmtx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the `hmtx' or `vmtx' table into a face object.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load `vmtx'.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_hmtx( TT_Face    face,\n                     FT_Stream  stream,\n                     FT_Bool    vertical )\n  {\n    FT_Error   error;\n    FT_ULong   tag, table_size;\n    FT_ULong*  ptable_offset;\n    FT_ULong*  ptable_size;\n\n\n    if ( vertical )\n    {\n      tag           = TTAG_vmtx;\n      ptable_offset = &face->vert_metrics_offset;\n      ptable_size   = &face->vert_metrics_size;\n    }\n    else\n    {\n      tag           = TTAG_hmtx;\n      ptable_offset = &face->horz_metrics_offset;\n      ptable_size   = &face->horz_metrics_size;\n    }\n\n    error = face->goto_table( face, tag, stream, &table_size );\n    if ( error )\n      goto Fail;\n\n    *ptable_size   = table_size;\n    *ptable_offset = FT_STREAM_POS();\n\n  Fail:\n    return error;\n  }\n\n#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_hmtx( TT_Face    face,\n                     FT_Stream  stream,\n                     FT_Bool    vertical )\n  {\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n\n    FT_ULong   table_len;\n    FT_Long    num_shorts, num_longs, num_shorts_checked;\n\n    TT_LongMetrics*    longs;\n    TT_ShortMetrics**  shorts;\n    FT_Byte*           p;\n\n\n    if ( vertical )\n    {\n      void*   lm = &face->vertical.long_metrics;\n      void**  sm = &face->vertical.short_metrics;\n\n\n      error = face->goto_table( face, TTAG_vmtx, stream, &table_len );\n      if ( error )\n        goto Fail;\n\n      num_longs = face->vertical.number_Of_VMetrics;\n      if ( (FT_ULong)num_longs > table_len / 4 )\n        num_longs = (FT_Long)( table_len / 4 );\n\n      face->vertical.number_Of_VMetrics = 0;\n\n      longs  = (TT_LongMetrics*)lm;\n      shorts = (TT_ShortMetrics**)sm;\n    }\n    else\n    {\n      void*   lm = &face->horizontal.long_metrics;\n      void**  sm = &face->horizontal.short_metrics;\n\n\n      error = face->goto_table( face, TTAG_hmtx, stream, &table_len );\n      if ( error )\n        goto Fail;\n\n      num_longs = face->horizontal.number_Of_HMetrics;\n      if ( (FT_ULong)num_longs > table_len / 4 )\n        num_longs = (FT_Long)( table_len / 4 );\n\n      face->horizontal.number_Of_HMetrics = 0;\n\n      longs  = (TT_LongMetrics*)lm;\n      shorts = (TT_ShortMetrics**)sm;\n    }\n\n    /* never trust derived values */\n\n    num_shorts         = face->max_profile.numGlyphs - num_longs;\n    num_shorts_checked = ( table_len - num_longs * 4L ) / 2;\n\n    if ( num_shorts < 0 )\n    {\n      FT_TRACE0(( \"tt_face_load_hmtx:\"\n                  \" %cmtx has more metrics than glyphs.\\n\",\n                  vertical ? 'v' : 'h' ));\n\n      /* Adobe simply ignores this problem.  So we shall do the same. */\n#if 0\n      error = vertical ? FT_THROW( Invalid_Vert_Metrics )\n                       : FT_THROW( Invalid_Horiz_Metrics );\n      goto Exit;\n#else\n      num_shorts = 0;\n#endif\n    }\n\n    if ( FT_QNEW_ARRAY( *longs,  num_longs  ) ||\n         FT_QNEW_ARRAY( *shorts, num_shorts ) )\n      goto Fail;\n\n    if ( FT_FRAME_ENTER( table_len ) )\n      goto Fail;\n\n    p = stream->cursor;\n\n    {\n      TT_LongMetrics  cur   = *longs;\n      TT_LongMetrics  limit = cur + num_longs;\n\n\n      for ( ; cur < limit; cur++ )\n      {\n        cur->advance = FT_NEXT_USHORT( p );\n        cur->bearing = FT_NEXT_SHORT( p );\n      }\n    }\n\n    /* do we have an inconsistent number of metric values? */\n    {\n      TT_ShortMetrics*  cur   = *shorts;\n      TT_ShortMetrics*  limit = cur +\n                                FT_MIN( num_shorts, num_shorts_checked );\n\n\n      for ( ; cur < limit; cur++ )\n        *cur = FT_NEXT_SHORT( p );\n\n      /* We fill up the missing left side bearings with the     */\n      /* last valid value.  Since this will occur for buggy CJK */\n      /* fonts usually only, nothing serious will happen.       */\n      if ( num_shorts > num_shorts_checked && num_shorts_checked > 0 )\n      {\n        FT_Short  val = (*shorts)[num_shorts_checked - 1];\n\n\n        limit = *shorts + num_shorts;\n        for ( ; cur < limit; cur++ )\n          *cur = val;\n      }\n    }\n\n    FT_FRAME_EXIT();\n\n    if ( vertical )\n      face->vertical.number_Of_VMetrics = (FT_UShort)num_longs;\n    else\n      face->horizontal.number_Of_HMetrics = (FT_UShort)num_longs;\n\n  Fail:\n    return error;\n  }\n\n#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_hhea                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the `hhea' or 'vhea' table into a face object.                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face     :: A handle to the target face object.                    */\n  /*                                                                       */\n  /*    stream   :: The input stream.                                      */\n  /*                                                                       */\n  /*    vertical :: A boolean flag.  If set, load `vhea'.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_hhea( TT_Face    face,\n                     FT_Stream  stream,\n                     FT_Bool    vertical )\n  {\n    FT_Error        error;\n    TT_HoriHeader*  header;\n\n    static const FT_Frame_Field  metrics_header_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_HoriHeader\n\n      FT_FRAME_START( 36 ),\n        FT_FRAME_ULONG ( Version ),\n        FT_FRAME_SHORT ( Ascender ),\n        FT_FRAME_SHORT ( Descender ),\n        FT_FRAME_SHORT ( Line_Gap ),\n        FT_FRAME_USHORT( advance_Width_Max ),\n        FT_FRAME_SHORT ( min_Left_Side_Bearing ),\n        FT_FRAME_SHORT ( min_Right_Side_Bearing ),\n        FT_FRAME_SHORT ( xMax_Extent ),\n        FT_FRAME_SHORT ( caret_Slope_Rise ),\n        FT_FRAME_SHORT ( caret_Slope_Run ),\n        FT_FRAME_SHORT ( caret_Offset ),\n        FT_FRAME_SHORT ( Reserved[0] ),\n        FT_FRAME_SHORT ( Reserved[1] ),\n        FT_FRAME_SHORT ( Reserved[2] ),\n        FT_FRAME_SHORT ( Reserved[3] ),\n        FT_FRAME_SHORT ( metric_Data_Format ),\n        FT_FRAME_USHORT( number_Of_HMetrics ),\n      FT_FRAME_END\n    };\n\n\n    if ( vertical )\n    {\n      void  *v = &face->vertical;\n\n\n      error = face->goto_table( face, TTAG_vhea, stream, 0 );\n      if ( error )\n        goto Fail;\n\n      header = (TT_HoriHeader*)v;\n    }\n    else\n    {\n      error = face->goto_table( face, TTAG_hhea, stream, 0 );\n      if ( error )\n        goto Fail;\n\n      header = &face->horizontal;\n    }\n\n    if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) )\n      goto Fail;\n\n    FT_TRACE3(( \"Ascender:          %5d\\n\", header->Ascender ));\n    FT_TRACE3(( \"Descender:         %5d\\n\", header->Descender ));\n    FT_TRACE3(( \"number_Of_Metrics: %5u\\n\", header->number_Of_HMetrics ));\n\n    header->long_metrics  = NULL;\n    header->short_metrics = NULL;\n\n  Fail:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_get_metrics                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Returns the horizontal or vertical metrics in font units for a     */\n  /*    given glyph.  The metrics are the left side bearing (resp. top     */\n  /*    side bearing) and advance width (resp. advance height).            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    header  :: A pointer to either the horizontal or vertical metrics  */\n  /*               structure.                                              */\n  /*                                                                       */\n  /*    idx     :: The glyph index.                                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    bearing :: The bearing, either left side or top side.              */\n  /*                                                                       */\n  /*    advance :: The advance width resp. advance height.                 */\n  /*                                                                       */\n#ifndef FT_CONFIG_OPTION_OLD_INTERNALS\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_get_metrics( TT_Face     face,\n                       FT_Bool     vertical,\n                       FT_UInt     gindex,\n                       FT_Short   *abearing,\n                       FT_UShort  *aadvance )\n  {\n    FT_Error        error;\n    FT_Stream       stream = face->root.stream;\n    TT_HoriHeader*  header;\n    FT_ULong        table_pos, table_size, table_end;\n    FT_UShort       k;\n\n\n    if ( vertical )\n    {\n      void*  v = &face->vertical;\n\n\n      header     = (TT_HoriHeader*)v;\n      table_pos  = face->vert_metrics_offset;\n      table_size = face->vert_metrics_size;\n    }\n    else\n    {\n      header     = &face->horizontal;\n      table_pos  = face->horz_metrics_offset;\n      table_size = face->horz_metrics_size;\n    }\n\n    table_end = table_pos + table_size;\n\n    k = header->number_Of_HMetrics;\n\n    if ( k > 0 )\n    {\n      if ( gindex < (FT_UInt)k )\n      {\n        table_pos += 4 * gindex;\n        if ( table_pos + 4 > table_end )\n          goto NoData;\n\n        if ( FT_STREAM_SEEK( table_pos ) ||\n             FT_READ_USHORT( *aadvance ) ||\n             FT_READ_SHORT( *abearing )  )\n          goto NoData;\n      }\n      else\n      {\n        table_pos += 4 * ( k - 1 );\n        if ( table_pos + 4 > table_end )\n          goto NoData;\n\n        if ( FT_STREAM_SEEK( table_pos ) ||\n             FT_READ_USHORT( *aadvance ) )\n          goto NoData;\n\n        table_pos += 4 + 2 * ( gindex - k );\n        if ( table_pos + 2 > table_end )\n          *abearing = 0;\n        else\n        {\n          if ( !FT_STREAM_SEEK( table_pos ) )\n            (void)FT_READ_SHORT( *abearing );\n        }\n      }\n    }\n    else\n    {\n    NoData:\n      *abearing = 0;\n      *aadvance = 0;\n    }\n\n    return FT_Err_Ok;\n  }\n\n#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_get_metrics( TT_Face     face,\n                       FT_Bool     vertical,\n                       FT_UInt     gindex,\n                       FT_Short*   abearing,\n                       FT_UShort*  aadvance )\n  {\n    void*           v = &face->vertical;\n    void*           h = &face->horizontal;\n    TT_HoriHeader*  header = vertical ? (TT_HoriHeader*)v\n                                      : (TT_HoriHeader*)h;\n    TT_LongMetrics  longs_m;\n    FT_UShort       k = header->number_Of_HMetrics;\n\n\n    if ( k == 0                                         ||\n         !header->long_metrics                          ||\n         gindex >= (FT_UInt)face->max_profile.numGlyphs )\n    {\n      *abearing = *aadvance = 0;\n      return FT_Err_Ok;\n    }\n\n    if ( gindex < (FT_UInt)k )\n    {\n      longs_m   = (TT_LongMetrics)header->long_metrics + gindex;\n      *abearing = longs_m->bearing;\n      *aadvance = longs_m->advance;\n    }\n    else\n    {\n      *abearing = ((TT_ShortMetrics*)header->short_metrics)[gindex - k];\n      *aadvance = ((TT_LongMetrics)header->long_metrics)[k - 1].advance;\n    }\n\n    return FT_Err_Ok;\n  }\n\n#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttmtx.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttmtx.h                                                                */\n/*                                                                         */\n/*    Load the metrics tables common to TTF and OTF fonts (specification). */\n/*                                                                         */\n/*  Copyright 2006 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTMTX_H__\n#define __TTMTX_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_hhea( TT_Face    face,\n                     FT_Stream  stream,\n                     FT_Bool    vertical );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_hmtx( TT_Face    face,\n                     FT_Stream  stream,\n                     FT_Bool    vertical );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_get_metrics( TT_Face     face,\n                       FT_Bool     vertical,\n                       FT_UInt     gindex,\n                       FT_Short*   abearing,\n                       FT_UShort*  aadvance );\n\nFT_END_HEADER\n\n#endif /* __TTMTX_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttpost.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpost.c                                                               */\n/*                                                                         */\n/*    Postcript name table processing for TrueType and OpenType fonts      */\n/*    (body).                                                              */\n/*                                                                         */\n/*  Copyright 1996-2003, 2006-2010, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The post table is not completely loaded by the core engine.  This     */\n  /* file loads the missing PS glyph names and implements an API to access */\n  /* them.                                                                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n#include \"ttpost.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttpost\n\n\n  /* If this configuration macro is defined, we rely on the `PSNames' */\n  /* module to grab the glyph names.                                  */\n\n#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n\n#define MAC_NAME( x )  ( (FT_String*)psnames->macintosh_name( x ) )\n\n\n#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */\n\n\n   /* Otherwise, we ignore the `PSNames' module, and provide our own  */\n   /* table of Mac names.  Thus, it is possible to build a version of */\n   /* FreeType without the Type 1 driver & PSNames module.            */\n\n#define MAC_NAME( x )  ( (FT_String*)tt_post_default_names[x] )\n\n  /* the 258 default Mac PS glyph names */\n\n  static const FT_String* const  tt_post_default_names[258] =\n  {\n    /*   0 */\n    \".notdef\", \".null\", \"CR\", \"space\", \"exclam\",\n    \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\",\n    /*  10 */\n    \"quotesingle\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\",\n    \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\",\n    /*  20 */\n    \"one\", \"two\", \"three\", \"four\", \"five\",\n    \"six\", \"seven\", \"eight\", \"nine\", \"colon\",\n    /*  30 */\n    \"semicolon\", \"less\", \"equal\", \"greater\", \"question\",\n    \"at\", \"A\", \"B\", \"C\", \"D\",\n    /*  40 */\n    \"E\", \"F\", \"G\", \"H\", \"I\",\n    \"J\", \"K\", \"L\", \"M\", \"N\",\n    /*  50 */\n    \"O\", \"P\", \"Q\", \"R\", \"S\",\n    \"T\", \"U\", \"V\", \"W\", \"X\",\n    /*  60 */\n    \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\",\n    \"asciicircum\", \"underscore\", \"grave\", \"a\", \"b\",\n    /*  70 */\n    \"c\", \"d\", \"e\", \"f\", \"g\",\n    \"h\", \"i\", \"j\", \"k\", \"l\",\n    /*  80 */\n    \"m\", \"n\", \"o\", \"p\", \"q\",\n    \"r\", \"s\", \"t\", \"u\", \"v\",\n    /*  90 */\n    \"w\", \"x\", \"y\", \"z\", \"braceleft\",\n    \"bar\", \"braceright\", \"asciitilde\", \"Adieresis\", \"Aring\",\n    /* 100 */\n    \"Ccedilla\", \"Eacute\", \"Ntilde\", \"Odieresis\", \"Udieresis\",\n    \"aacute\", \"agrave\", \"acircumflex\", \"adieresis\", \"atilde\",\n    /* 110 */\n    \"aring\", \"ccedilla\", \"eacute\", \"egrave\", \"ecircumflex\",\n    \"edieresis\", \"iacute\", \"igrave\", \"icircumflex\", \"idieresis\",\n    /* 120 */\n    \"ntilde\", \"oacute\", \"ograve\", \"ocircumflex\", \"odieresis\",\n    \"otilde\", \"uacute\", \"ugrave\", \"ucircumflex\", \"udieresis\",\n    /* 130 */\n    \"dagger\", \"degree\", \"cent\", \"sterling\", \"section\",\n    \"bullet\", \"paragraph\", \"germandbls\", \"registered\", \"copyright\",\n    /* 140 */\n    \"trademark\", \"acute\", \"dieresis\", \"notequal\", \"AE\",\n    \"Oslash\", \"infinity\", \"plusminus\", \"lessequal\", \"greaterequal\",\n    /* 150 */\n    \"yen\", \"mu\", \"partialdiff\", \"summation\", \"product\",\n    \"pi\", \"integral\", \"ordfeminine\", \"ordmasculine\", \"Omega\",\n    /* 160 */\n    \"ae\", \"oslash\", \"questiondown\", \"exclamdown\", \"logicalnot\",\n    \"radical\", \"florin\", \"approxequal\", \"Delta\", \"guillemotleft\",\n    /* 170 */\n    \"guillemotright\", \"ellipsis\", \"nbspace\", \"Agrave\", \"Atilde\",\n    \"Otilde\", \"OE\", \"oe\", \"endash\", \"emdash\",\n    /* 180 */\n    \"quotedblleft\", \"quotedblright\", \"quoteleft\", \"quoteright\", \"divide\",\n    \"lozenge\", \"ydieresis\", \"Ydieresis\", \"fraction\", \"currency\",\n    /* 190 */\n    \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"daggerdbl\",\n    \"periodcentered\", \"quotesinglbase\", \"quotedblbase\", \"perthousand\", \"Acircumflex\",\n    /* 200 */\n    \"Ecircumflex\", \"Aacute\", \"Edieresis\", \"Egrave\", \"Iacute\",\n    \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Oacute\", \"Ocircumflex\",\n    /* 210 */\n    \"apple\", \"Ograve\", \"Uacute\", \"Ucircumflex\", \"Ugrave\",\n    \"dotlessi\", \"circumflex\", \"tilde\", \"macron\", \"breve\",\n    /* 220 */\n    \"dotaccent\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\",\n    \"caron\", \"Lslash\", \"lslash\", \"Scaron\", \"scaron\",\n    /* 230 */\n    \"Zcaron\", \"zcaron\", \"brokenbar\", \"Eth\", \"eth\",\n    \"Yacute\", \"yacute\", \"Thorn\", \"thorn\", \"minus\",\n    /* 240 */\n    \"multiply\", \"onesuperior\", \"twosuperior\", \"threesuperior\", \"onehalf\",\n    \"onequarter\", \"threequarters\", \"franc\", \"Gbreve\", \"gbreve\",\n    /* 250 */\n    \"Idot\", \"Scedilla\", \"scedilla\", \"Cacute\", \"cacute\",\n    \"Ccaron\", \"ccaron\", \"dmacron\",\n  };\n\n\n#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */\n\n\n  static FT_Error\n  load_format_20( TT_Face    face,\n                  FT_Stream  stream,\n                  FT_Long    post_limit )\n  {\n    FT_Memory   memory = stream->memory;\n    FT_Error    error;\n\n    FT_Int      num_glyphs;\n    FT_UShort   num_names;\n\n    FT_UShort*  glyph_indices = 0;\n    FT_Char**   name_strings  = 0;\n\n\n    if ( FT_READ_USHORT( num_glyphs ) )\n      goto Exit;\n\n    /* UNDOCUMENTED!  The number of glyphs in this table can be smaller */\n    /* than the value in the maxp table (cf. cyberbit.ttf).             */\n\n    /* There already exist fonts which have more than 32768 glyph names */\n    /* in this table, so the test for this threshold has been dropped.  */\n\n    if ( num_glyphs > face->max_profile.numGlyphs )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* load the indices */\n    {\n      FT_Int  n;\n\n\n      if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) ||\n           FT_FRAME_ENTER( num_glyphs * 2L )          )\n        goto Fail;\n\n      for ( n = 0; n < num_glyphs; n++ )\n        glyph_indices[n] = FT_GET_USHORT();\n\n      FT_FRAME_EXIT();\n    }\n\n    /* compute number of names stored in table */\n    {\n      FT_Int  n;\n\n\n      num_names = 0;\n\n      for ( n = 0; n < num_glyphs; n++ )\n      {\n        FT_Int  idx;\n\n\n        idx = glyph_indices[n];\n        if ( idx >= 258 )\n        {\n          idx -= 257;\n          if ( idx > num_names )\n            num_names = (FT_UShort)idx;\n        }\n      }\n    }\n\n    /* now load the name strings */\n    {\n      FT_UShort  n;\n\n\n      if ( FT_NEW_ARRAY( name_strings, num_names ) )\n        goto Fail;\n\n      for ( n = 0; n < num_names; n++ )\n      {\n        FT_UInt  len;\n\n\n        if ( FT_STREAM_POS() >= post_limit )\n          break;\n        else\n        {\n          FT_TRACE6(( \"load_format_20: %d byte left in post table\\n\",\n                      post_limit - FT_STREAM_POS() ));\n\n          if ( FT_READ_BYTE( len ) )\n            goto Fail1;\n        }\n\n        if ( (FT_Int)len > post_limit                   ||\n             FT_STREAM_POS() > post_limit - (FT_Int)len )\n        {\n          FT_ERROR(( \"load_format_20:\"\n                     \" exceeding string length (%d),\"\n                     \" truncating at end of post table (%d byte left)\\n\",\n                     len, post_limit - FT_STREAM_POS() ));\n          len = FT_MAX( 0, post_limit - FT_STREAM_POS() );\n        }\n\n        if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) ||\n             FT_STREAM_READ( name_strings[n], len   ) )\n          goto Fail1;\n\n        name_strings[n][len] = '\\0';\n      }\n\n      if ( n < num_names )\n      {\n        FT_ERROR(( \"load_format_20:\"\n                   \" all entries in post table are already parsed,\"\n                   \" using NULL names for gid %d - %d\\n\",\n                    n, num_names - 1 ));\n        for ( ; n < num_names; n++ )\n          if ( FT_NEW_ARRAY( name_strings[n], 1 ) )\n            goto Fail1;\n          else\n            name_strings[n][0] = '\\0';\n      }\n    }\n\n    /* all right, set table fields and exit successfully */\n    {\n      TT_Post_20  table = &face->postscript_names.names.format_20;\n\n\n      table->num_glyphs    = (FT_UShort)num_glyphs;\n      table->num_names     = (FT_UShort)num_names;\n      table->glyph_indices = glyph_indices;\n      table->glyph_names   = name_strings;\n    }\n    return FT_Err_Ok;\n\n  Fail1:\n    {\n      FT_UShort  n;\n\n\n      for ( n = 0; n < num_names; n++ )\n        FT_FREE( name_strings[n] );\n    }\n\n  Fail:\n    FT_FREE( name_strings );\n    FT_FREE( glyph_indices );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  load_format_25( TT_Face    face,\n                  FT_Stream  stream,\n                  FT_Long    post_limit )\n  {\n    FT_Memory  memory = stream->memory;\n    FT_Error   error;\n\n    FT_Int     num_glyphs;\n    FT_Char*   offset_table = 0;\n\n    FT_UNUSED( post_limit );\n\n\n    /* UNDOCUMENTED!  This value appears only in the Apple TT specs. */\n    if ( FT_READ_USHORT( num_glyphs ) )\n      goto Exit;\n\n    /* check the number of glyphs */\n    if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( FT_NEW_ARRAY( offset_table, num_glyphs )   ||\n         FT_STREAM_READ( offset_table, num_glyphs ) )\n      goto Fail;\n\n    /* now check the offset table */\n    {\n      FT_Int  n;\n\n\n      for ( n = 0; n < num_glyphs; n++ )\n      {\n        FT_Long  idx = (FT_Long)n + offset_table[n];\n\n\n        if ( idx < 0 || idx > num_glyphs )\n        {\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n      }\n    }\n\n    /* OK, set table fields and exit successfully */\n    {\n      TT_Post_25  table = &face->postscript_names.names.format_25;\n\n\n      table->num_glyphs = (FT_UShort)num_glyphs;\n      table->offsets    = offset_table;\n    }\n\n    return FT_Err_Ok;\n\n  Fail:\n    FT_FREE( offset_table );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  load_post_names( TT_Face  face )\n  {\n    FT_Stream  stream;\n    FT_Error   error;\n    FT_Fixed   format;\n    FT_ULong   post_len;\n    FT_Long    post_limit;\n\n\n    /* get a stream for the face's resource */\n    stream = face->root.stream;\n\n    /* seek to the beginning of the PS names table */\n    error = face->goto_table( face, TTAG_post, stream, &post_len );\n    if ( error )\n      goto Exit;\n\n    post_limit = FT_STREAM_POS() + post_len;\n\n    format = face->postscript.FormatType;\n\n    /* go to beginning of subtable */\n    if ( FT_STREAM_SKIP( 32 ) )\n      goto Exit;\n\n    /* now read postscript table */\n    if ( format == 0x00020000L )\n      error = load_format_20( face, stream, post_limit );\n    else if ( format == 0x00028000L )\n      error = load_format_25( face, stream, post_limit );\n    else\n      error = FT_THROW( Invalid_File_Format );\n\n    face->postscript_names.loaded = 1;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_free_ps_names( TT_Face  face )\n  {\n    FT_Memory      memory = face->root.memory;\n    TT_Post_Names  names  = &face->postscript_names;\n    FT_Fixed       format;\n\n\n    if ( names->loaded )\n    {\n      format = face->postscript.FormatType;\n\n      if ( format == 0x00020000L )\n      {\n        TT_Post_20  table = &names->names.format_20;\n        FT_UShort   n;\n\n\n        FT_FREE( table->glyph_indices );\n        table->num_glyphs = 0;\n\n        for ( n = 0; n < table->num_names; n++ )\n          FT_FREE( table->glyph_names[n] );\n\n        FT_FREE( table->glyph_names );\n        table->num_names = 0;\n      }\n      else if ( format == 0x00028000L )\n      {\n        TT_Post_25  table = &names->names.format_25;\n\n\n        FT_FREE( table->offsets );\n        table->num_glyphs = 0;\n      }\n    }\n    names->loaded = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_get_ps_name                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Get the PostScript glyph name of a glyph.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the parent face.                             */\n  /*                                                                       */\n  /*    idx    :: The glyph index.                                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    PSname :: The address of a string pointer.  Will be NULL in case   */\n  /*              of error, otherwise it is a pointer to the glyph name.   */\n  /*                                                                       */\n  /*              You must not modify the returned string!                 */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_get_ps_name( TT_Face      face,\n                       FT_UInt      idx,\n                       FT_String**  PSname )\n  {\n    FT_Error       error;\n    TT_Post_Names  names;\n    FT_Fixed       format;\n\n#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n    FT_Service_PsCMaps  psnames;\n#endif\n\n\n    if ( !face )\n      return FT_THROW( Invalid_Face_Handle );\n\n    if ( idx >= (FT_UInt)face->max_profile.numGlyphs )\n      return FT_THROW( Invalid_Glyph_Index );\n\n#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n    psnames = (FT_Service_PsCMaps)face->psnames;\n    if ( !psnames )\n      return FT_THROW( Unimplemented_Feature );\n#endif\n\n    names = &face->postscript_names;\n\n    /* `.notdef' by default */\n    *PSname = MAC_NAME( 0 );\n\n    format = face->postscript.FormatType;\n\n    if ( format == 0x00010000L )\n    {\n      if ( idx < 258 )                    /* paranoid checking */\n        *PSname = MAC_NAME( idx );\n    }\n    else if ( format == 0x00020000L )\n    {\n      TT_Post_20  table = &names->names.format_20;\n\n\n      if ( !names->loaded )\n      {\n        error = load_post_names( face );\n        if ( error )\n          goto End;\n      }\n\n      if ( idx < (FT_UInt)table->num_glyphs )\n      {\n        FT_UShort  name_index = table->glyph_indices[idx];\n\n\n        if ( name_index < 258 )\n          *PSname = MAC_NAME( name_index );\n        else\n          *PSname = (FT_String*)table->glyph_names[name_index - 258];\n      }\n    }\n    else if ( format == 0x00028000L )\n    {\n      TT_Post_25  table = &names->names.format_25;\n\n\n      if ( !names->loaded )\n      {\n        error = load_post_names( face );\n        if ( error )\n          goto End;\n      }\n\n      if ( idx < (FT_UInt)table->num_glyphs )    /* paranoid checking */\n      {\n        idx    += table->offsets[idx];\n        *PSname = MAC_NAME( idx );\n      }\n    }\n\n    /* nothing to do for format == 0x00030000L */\n\n  End:\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttpost.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpost.h                                                               */\n/*                                                                         */\n/*    Postcript name table processing for TrueType and OpenType fonts      */\n/*    (specification).                                                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTPOST_H__\n#define __TTPOST_H__\n\n\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_get_ps_name( TT_Face      face,\n                       FT_UInt      idx,\n                       FT_String**  PSname );\n\n  FT_LOCAL( void )\n  tt_face_free_ps_names( TT_Face  face );\n\n\nFT_END_HEADER\n\n#endif /* __TTPOST_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttsbit.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttsbit.c                                                               */\n/*                                                                         */\n/*    TrueType and OpenType embedded bitmap support (body).                */\n/*                                                                         */\n/*  Copyright 1996-2010, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n\n  /*\n   *  Alas, the memory-optimized sbit loader can't be used when implementing\n   *  the `old internals' hack\n   */\n#ifndef FT_CONFIG_OPTION_OLD_INTERNALS\n\n#include \"ttsbit0.c\"\n\n#else /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n#include \"ttsbit.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttsbit\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    blit_sbit                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Blits a bitmap from an input stream into a given target.  Supports */\n  /*    x and y offsets as well as byte padded lines.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    target      :: The target bitmap/pixmap.                           */\n  /*                                                                       */\n  /*    source      :: The input packed bitmap data.                       */\n  /*                                                                       */\n  /*    line_bits   :: The number of bits per line.                        */\n  /*                                                                       */\n  /*    byte_padded :: A flag which is true if lines are byte-padded.      */\n  /*                                                                       */\n  /*    x_offset    :: The horizontal offset.                              */\n  /*                                                                       */\n  /*    y_offset    :: The vertical offset.                                */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    IMPORTANT: The x and y offsets are relative to the top corner of   */\n  /*               the target bitmap (unlike the normal TrueType           */\n  /*               convention).  A positive y offset indicates a downwards */\n  /*               direction!                                              */\n  /*                                                                       */\n  static void\n  blit_sbit( FT_Bitmap*  target,\n             FT_Byte*    source,\n             FT_Int      line_bits,\n             FT_Bool     byte_padded,\n             FT_Int      x_offset,\n             FT_Int      y_offset,\n             FT_Int      source_height )\n  {\n    FT_Byte*   line_buff;\n    FT_Int     line_incr;\n    FT_Int     height;\n\n    FT_UShort  acc;\n    FT_UInt    loaded;\n\n\n    /* first of all, compute starting write position */\n    line_incr = target->pitch;\n    line_buff = target->buffer;\n\n    if ( line_incr < 0 )\n      line_buff -= line_incr * ( target->rows - 1 );\n\n    line_buff += ( x_offset >> 3 ) + y_offset * line_incr;\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* We use the extra-classic `accumulator' trick to extract the bits    */\n    /* from the source byte stream.                                        */\n    /*                                                                     */\n    /* Namely, the variable `acc' is a 16-bit accumulator containing the   */\n    /* last `loaded' bits from the input stream.  The bits are shifted to  */\n    /* the upmost position in `acc'.                                       */\n    /*                                                                     */\n    /***********************************************************************/\n\n    acc    = 0;  /* clear accumulator   */\n    loaded = 0;  /* no bits were loaded */\n\n    for ( height = source_height; height > 0; height-- )\n    {\n      FT_Byte*  cur   = line_buff;        /* current write cursor          */\n      FT_Int    count = line_bits;        /* # of bits to extract per line */\n      FT_Byte   shift = (FT_Byte)( x_offset & 7 ); /* current write shift  */\n      FT_Byte   space = (FT_Byte)( 8 - shift );\n\n\n      /* first of all, read individual source bytes */\n      if ( count >= 8 )\n      {\n        count -= 8;\n        {\n          do\n          {\n            FT_Byte  val;\n\n\n            /* ensure that there are at least 8 bits in the accumulator */\n            if ( loaded < 8 )\n            {\n              acc    |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded ));\n              loaded += 8;\n            }\n\n            /* now write one byte */\n            val = (FT_Byte)( acc >> 8 );\n            if ( shift )\n            {\n              cur[0] |= (FT_Byte)( val >> shift );\n              cur[1] |= (FT_Byte)( val << space );\n            }\n            else\n              cur[0] |= val;\n\n            cur++;\n            acc   <<= 8;  /* remove bits from accumulator */\n            loaded -= 8;\n            count  -= 8;\n\n          } while ( count >= 0 );\n        }\n\n        /* restore `count' to correct value */\n        count += 8;\n      }\n\n      /* now write remaining bits (count < 8) */\n      if ( count > 0 )\n      {\n        FT_Byte  val;\n\n\n        /* ensure that there are at least `count' bits in the accumulator */\n        if ( (FT_Int)loaded < count )\n        {\n          acc    |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded ));\n          loaded += 8;\n        }\n\n        /* now write remaining bits */\n        val     = (FT_Byte)( ( (FT_Byte)( acc >> 8 ) ) & ~( 0xFF >> count ) );\n        cur[0] |= (FT_Byte)( val >> shift );\n\n        if ( count > space )\n          cur[1] |= (FT_Byte)( val << space );\n\n        acc   <<= count;\n        loaded -= count;\n      }\n\n      /* now, skip to next line */\n      if ( byte_padded )\n      {\n        acc    = 0;\n        loaded = 0;   /* clear accumulator on byte-padded lines */\n      }\n\n      line_buff += line_incr;\n    }\n  }\n\n\n  static const FT_Frame_Field  sbit_metrics_fields[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_SBit_MetricsRec\n\n    FT_FRAME_START( 8 ),\n      FT_FRAME_BYTE( height ),\n      FT_FRAME_BYTE( width ),\n\n      FT_FRAME_CHAR( horiBearingX ),\n      FT_FRAME_CHAR( horiBearingY ),\n      FT_FRAME_BYTE( horiAdvance ),\n\n      FT_FRAME_CHAR( vertBearingX ),\n      FT_FRAME_CHAR( vertBearingY ),\n      FT_FRAME_BYTE( vertAdvance ),\n    FT_FRAME_END\n  };\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Load_SBit_Const_Metrics                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the metrics for `EBLC' index tables format 2 and 5.          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    range  :: The target range.                                        */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  Load_SBit_Const_Metrics( TT_SBit_Range  range,\n                           FT_Stream      stream )\n  {\n    FT_Error  error;\n\n\n    if ( FT_READ_ULONG( range->image_size ) )\n      return error;\n\n    return FT_STREAM_READ_FIELDS( sbit_metrics_fields, &range->metrics );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Load_SBit_Range_Codes                                              */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the range codes for `EBLC' index tables format 4 and 5.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    range        :: The target range.                                  */\n  /*                                                                       */\n  /*    stream       :: The input stream.                                  */\n  /*                                                                       */\n  /*    load_offsets :: A flag whether to load the glyph offset table.     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  Load_SBit_Range_Codes( TT_SBit_Range  range,\n                         FT_Stream      stream,\n                         FT_Bool        load_offsets )\n  {\n    FT_Error   error;\n    FT_ULong   count, n, size;\n    FT_Memory  memory = stream->memory;\n\n\n    if ( FT_READ_ULONG( count ) )\n      goto Exit;\n\n    range->num_glyphs = count;\n\n    /* Allocate glyph offsets table if needed */\n    if ( load_offsets )\n    {\n      if ( FT_NEW_ARRAY( range->glyph_offsets, count ) )\n        goto Exit;\n\n      size = count * 4L;\n    }\n    else\n      size = count * 2L;\n\n    /* Allocate glyph codes table and access frame */\n    if ( FT_NEW_ARRAY ( range->glyph_codes, count ) ||\n         FT_FRAME_ENTER( size )                     )\n      goto Exit;\n\n    for ( n = 0; n < count; n++ )\n    {\n      range->glyph_codes[n] = FT_GET_USHORT();\n\n      if ( load_offsets )\n        range->glyph_offsets[n] = (FT_ULong)range->image_offset +\n                                  FT_GET_USHORT();\n    }\n\n    FT_FRAME_EXIT();\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Load_SBit_Range                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads a given `EBLC' index/range table.                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    range  :: The target range.                                        */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  Load_SBit_Range( TT_SBit_Range  range,\n                   FT_Stream      stream )\n  {\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n\n\n    switch( range->index_format )\n    {\n    case 1:   /* variable metrics with 4-byte offsets */\n    case 3:   /* variable metrics with 2-byte offsets */\n      {\n        FT_ULong  num_glyphs, n;\n        FT_Int    size_elem;\n        FT_Bool   large = FT_BOOL( range->index_format == 1 );\n\n\n\n        if ( range->last_glyph < range->first_glyph )\n        {\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        num_glyphs        = range->last_glyph - range->first_glyph + 1L;\n        range->num_glyphs = num_glyphs;\n        num_glyphs++;                       /* XXX: BEWARE - see spec */\n\n        size_elem = large ? 4 : 2;\n\n        if ( FT_NEW_ARRAY( range->glyph_offsets, num_glyphs ) ||\n             FT_FRAME_ENTER( num_glyphs * size_elem )         )\n          goto Exit;\n\n        for ( n = 0; n < num_glyphs; n++ )\n          range->glyph_offsets[n] = (FT_ULong)( range->image_offset +\n                                                ( large ? FT_GET_ULONG()\n                                                        : FT_GET_USHORT() ) );\n        FT_FRAME_EXIT();\n      }\n      break;\n\n    case 2:   /* all glyphs have identical metrics */\n      error = Load_SBit_Const_Metrics( range, stream );\n      break;\n\n    case 4:\n      error = Load_SBit_Range_Codes( range, stream, 1 );\n      break;\n\n    case 5:\n      error = Load_SBit_Const_Metrics( range, stream );\n      if ( !error )\n        error = Load_SBit_Range_Codes( range, stream, 0 );\n      break;\n\n    default:\n      error = FT_THROW( Invalid_File_Format );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_eblc                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads the table of embedded bitmap sizes for this face.            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: The target face object.                                  */\n  /*                                                                       */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_eblc( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error   error  = FT_Err_Ok;\n    FT_Memory  memory = stream->memory;\n    FT_Fixed   version;\n    FT_ULong   num_strikes;\n    FT_ULong   table_base;\n\n    static const FT_Frame_Field  sbit_line_metrics_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_SBit_LineMetricsRec\n\n      /* no FT_FRAME_START */\n        FT_FRAME_CHAR( ascender ),\n        FT_FRAME_CHAR( descender ),\n        FT_FRAME_BYTE( max_width ),\n\n        FT_FRAME_CHAR( caret_slope_numerator ),\n        FT_FRAME_CHAR( caret_slope_denominator ),\n        FT_FRAME_CHAR( caret_offset ),\n\n        FT_FRAME_CHAR( min_origin_SB ),\n        FT_FRAME_CHAR( min_advance_SB ),\n        FT_FRAME_CHAR( max_before_BL ),\n        FT_FRAME_CHAR( min_after_BL ),\n        FT_FRAME_CHAR( pads[0] ),\n        FT_FRAME_CHAR( pads[1] ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  strike_start_fields[] =\n    {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_SBit_StrikeRec\n\n      /* no FT_FRAME_START */\n        FT_FRAME_ULONG( ranges_offset ),\n        FT_FRAME_SKIP_LONG,\n        FT_FRAME_ULONG( num_ranges ),\n        FT_FRAME_ULONG( color_ref ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  strike_end_fields[] =\n    {\n      /* no FT_FRAME_START */\n        FT_FRAME_USHORT( start_glyph ),\n        FT_FRAME_USHORT( end_glyph ),\n        FT_FRAME_BYTE  ( x_ppem ),\n        FT_FRAME_BYTE  ( y_ppem ),\n        FT_FRAME_BYTE  ( bit_depth ),\n        FT_FRAME_CHAR  ( flags ),\n      FT_FRAME_END\n    };\n\n\n    face->num_sbit_strikes = 0;\n\n    /* this table is optional */\n    error = face->goto_table( face, TTAG_EBLC, stream, 0 );\n    if ( error )\n      error = face->goto_table( face, TTAG_bloc, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    table_base = FT_STREAM_POS();\n    if ( FT_FRAME_ENTER( 8L ) )\n      goto Exit;\n\n    version     = FT_GET_LONG();\n    num_strikes = FT_GET_ULONG();\n\n    FT_FRAME_EXIT();\n\n    /* check version number and strike count */\n    if ( version     != 0x00020000L ||\n         num_strikes >= 0x10000L    )\n    {\n      FT_ERROR(( \"tt_face_load_sbit_strikes: invalid table version\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n\n      goto Exit;\n    }\n\n    /* allocate the strikes table */\n    if ( FT_NEW_ARRAY( face->sbit_strikes, num_strikes ) )\n      goto Exit;\n\n    face->num_sbit_strikes = num_strikes;\n\n    /* now read each strike table separately */\n    {\n      TT_SBit_Strike  strike = face->sbit_strikes;\n      FT_ULong        count  = num_strikes;\n\n\n      if ( FT_FRAME_ENTER( 48L * num_strikes ) )\n        goto Exit;\n\n      while ( count > 0 )\n      {\n        if ( FT_STREAM_READ_FIELDS( strike_start_fields, strike )             ||\n             FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->hori ) ||\n             FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->vert ) ||\n             FT_STREAM_READ_FIELDS( strike_end_fields, strike )               )\n          break;\n\n        count--;\n        strike++;\n      }\n\n      FT_FRAME_EXIT();\n    }\n\n    /* allocate the index ranges for each strike table */\n    {\n      TT_SBit_Strike  strike = face->sbit_strikes;\n      FT_ULong        count  = num_strikes;\n\n\n      while ( count > 0 )\n      {\n        TT_SBit_Range  range;\n        FT_ULong       count2 = strike->num_ranges;\n\n\n        /* read each range */\n        if ( FT_STREAM_SEEK( table_base + strike->ranges_offset ) ||\n             FT_FRAME_ENTER( strike->num_ranges * 8L )            )\n          goto Exit;\n\n        if ( FT_NEW_ARRAY( strike->sbit_ranges, strike->num_ranges ) )\n          goto Exit;\n\n        range = strike->sbit_ranges;\n        while ( count2 > 0 )\n        {\n          range->first_glyph  = FT_GET_USHORT();\n          range->last_glyph   = FT_GET_USHORT();\n          range->table_offset = table_base + strike->ranges_offset +\n                                  FT_GET_ULONG();\n          count2--;\n          range++;\n        }\n\n        FT_FRAME_EXIT();\n\n        /* Now, read each index table */\n        count2 = strike->num_ranges;\n        range  = strike->sbit_ranges;\n        while ( count2 > 0 )\n        {\n          /* Read the header */\n          if ( FT_STREAM_SEEK( range->table_offset ) ||\n               FT_FRAME_ENTER( 8L )                  )\n            goto Exit;\n\n          range->index_format = FT_GET_USHORT();\n          range->image_format = FT_GET_USHORT();\n          range->image_offset = FT_GET_ULONG();\n\n          FT_FRAME_EXIT();\n\n          error = Load_SBit_Range( range, stream );\n          if ( error )\n            goto Exit;\n\n          count2--;\n          range++;\n        }\n\n        count--;\n        strike++;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_free_eblc                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Releases the embedded bitmap tables.                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: The target face object.                                    */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_face_free_eblc( TT_Face  face )\n  {\n    FT_Memory       memory       = face->root.memory;\n    TT_SBit_Strike  strike       = face->sbit_strikes;\n    TT_SBit_Strike  strike_limit = strike + face->num_sbit_strikes;\n\n\n    if ( strike )\n    {\n      for ( ; strike < strike_limit; strike++ )\n      {\n        TT_SBit_Range  range       = strike->sbit_ranges;\n        TT_SBit_Range  range_limit = range + strike->num_ranges;\n\n\n        if ( range )\n        {\n          for ( ; range < range_limit; range++ )\n          {\n            /* release the glyph offsets and codes tables */\n            /* where appropriate                          */\n            FT_FREE( range->glyph_offsets );\n            FT_FREE( range->glyph_codes );\n          }\n        }\n        FT_FREE( strike->sbit_ranges );\n        strike->num_ranges = 0;\n      }\n      FT_FREE( face->sbit_strikes );\n    }\n    face->num_sbit_strikes = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_set_sbit_strike( TT_Face          face,\n                           FT_Size_Request  req,\n                           FT_ULong*        astrike_index )\n  {\n    return FT_Match_Size( (FT_Face)face, req, 0, astrike_index );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_strike_metrics( TT_Face           face,\n                               FT_ULong          strike_index,\n                               FT_Size_Metrics*  metrics )\n  {\n    TT_SBit_Strike  strike;\n\n\n    if ( strike_index >= face->num_sbit_strikes )\n      return FT_THROW( Invalid_Argument );\n\n    strike = face->sbit_strikes + strike_index;\n\n    metrics->x_ppem = strike->x_ppem;\n    metrics->y_ppem = strike->y_ppem;\n\n    metrics->ascender  = strike->hori.ascender << 6;\n    metrics->descender = strike->hori.descender << 6;\n\n    /* XXX: Is this correct? */\n    metrics->max_advance = ( strike->hori.min_origin_SB  +\n                             strike->hori.max_width      +\n                             strike->hori.min_advance_SB ) << 6;\n\n    metrics->height = metrics->ascender - metrics->descender;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    find_sbit_range                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Scans a given strike's ranges and return, for a given glyph        */\n  /*    index, the corresponding sbit range, and `EBDT' offset.            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph_index   :: The glyph index.                                  */\n  /*                                                                       */\n  /*    strike        :: The source/current sbit strike.                   */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    arange        :: The sbit range containing the glyph index.        */\n  /*                                                                       */\n  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means the glyph index was found.           */\n  /*                                                                       */\n  static FT_Error\n  find_sbit_range( FT_UInt          glyph_index,\n                   TT_SBit_Strike   strike,\n                   TT_SBit_Range   *arange,\n                   FT_ULong        *aglyph_offset )\n  {\n    TT_SBit_RangeRec  *range, *range_limit;\n\n\n    /* check whether the glyph index is within this strike's */\n    /* glyph range                                           */\n    if ( glyph_index < (FT_UInt)strike->start_glyph ||\n         glyph_index > (FT_UInt)strike->end_glyph   )\n      goto Fail;\n\n    /* scan all ranges in strike */\n    range       = strike->sbit_ranges;\n    range_limit = range + strike->num_ranges;\n    if ( !range )\n      goto Fail;\n\n    for ( ; range < range_limit; range++ )\n    {\n      if ( glyph_index >= (FT_UInt)range->first_glyph &&\n           glyph_index <= (FT_UInt)range->last_glyph  )\n      {\n        FT_UShort  delta = (FT_UShort)( glyph_index - range->first_glyph );\n\n\n        switch ( range->index_format )\n        {\n        case 1:\n        case 3:\n          *aglyph_offset = range->glyph_offsets[delta];\n          break;\n\n        case 2:\n          *aglyph_offset = range->image_offset +\n                           range->image_size * delta;\n          break;\n\n        case 4:\n        case 5:\n          {\n            FT_ULong  n;\n\n\n            for ( n = 0; n < range->num_glyphs; n++ )\n            {\n              if ( (FT_UInt)range->glyph_codes[n] == glyph_index )\n              {\n                if ( range->index_format == 4 )\n                  *aglyph_offset = range->glyph_offsets[n];\n                else\n                  *aglyph_offset = range->image_offset +\n                                   n * range->image_size;\n                goto Found;\n              }\n            }\n          }\n\n        /* fall-through */\n        default:\n          goto Fail;\n        }\n\n      Found:\n        /* return successfully! */\n        *arange  = range;\n        return FT_Err_Ok;\n      }\n    }\n\n  Fail:\n    *arange        = 0;\n    *aglyph_offset = 0;\n\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_find_sbit_image                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Checks whether an embedded bitmap (an `sbit') exists for a given   */\n  /*    glyph, at a given strike.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face          :: The target face object.                           */\n  /*                                                                       */\n  /*    glyph_index   :: The glyph index.                                  */\n  /*                                                                       */\n  /*    strike_index  :: The current strike index.                         */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    arange        :: The SBit range containing the glyph index.        */\n  /*                                                                       */\n  /*    astrike       :: The SBit strike containing the glyph index.       */\n  /*                                                                       */\n  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns                    */\n  /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */\n  /*    glyph.                                                             */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_find_sbit_image( TT_Face          face,\n                      FT_UInt          glyph_index,\n                      FT_ULong         strike_index,\n                      TT_SBit_Range   *arange,\n                      TT_SBit_Strike  *astrike,\n                      FT_ULong        *aglyph_offset )\n  {\n    FT_Error        error;\n    TT_SBit_Strike  strike;\n\n\n    if ( !face->sbit_strikes                        ||\n         ( face->num_sbit_strikes <= strike_index ) )\n      goto Fail;\n\n    strike = &face->sbit_strikes[strike_index];\n\n    error = find_sbit_range( glyph_index, strike,\n                             arange, aglyph_offset );\n    if ( error )\n      goto Fail;\n\n    *astrike = strike;\n\n    return FT_Err_Ok;\n\n  Fail:\n    /* no embedded bitmap for this glyph in face */\n    *arange        = 0;\n    *astrike       = 0;\n    *aglyph_offset = 0;\n\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_load_sbit_metrics                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Gets the big metrics for a given SBit.                             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream      :: The input stream.                                   */\n  /*                                                                       */\n  /*    range       :: The SBit range containing the glyph.                */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    big_metrics :: A big SBit metrics structure for the glyph.         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The stream cursor must be positioned at the glyph's offset within  */\n  /*    the `EBDT' table before the call.                                  */\n  /*                                                                       */\n  /*    If the image format uses variable metrics, the stream cursor is    */\n  /*    positioned just after the metrics header in the `EBDT' table on    */\n  /*    function exit.                                                     */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_load_sbit_metrics( FT_Stream        stream,\n                        TT_SBit_Range    range,\n                        TT_SBit_Metrics  metrics )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    switch ( range->image_format )\n    {\n    case 1:\n    case 2:\n    case 8:\n      /* variable small metrics */\n      {\n        TT_SBit_SmallMetricsRec  smetrics;\n\n        static const FT_Frame_Field  sbit_small_metrics_fields[] =\n        {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  TT_SBit_SmallMetricsRec\n\n          FT_FRAME_START( 5 ),\n            FT_FRAME_BYTE( height ),\n            FT_FRAME_BYTE( width ),\n            FT_FRAME_CHAR( bearingX ),\n            FT_FRAME_CHAR( bearingY ),\n            FT_FRAME_BYTE( advance ),\n          FT_FRAME_END\n        };\n\n\n        /* read small metrics */\n        if ( FT_STREAM_READ_FIELDS( sbit_small_metrics_fields, &smetrics ) )\n          goto Exit;\n\n        /* convert it to a big metrics */\n        metrics->height       = smetrics.height;\n        metrics->width        = smetrics.width;\n        metrics->horiBearingX = smetrics.bearingX;\n        metrics->horiBearingY = smetrics.bearingY;\n        metrics->horiAdvance  = smetrics.advance;\n\n        /* these metrics are made up at a higher level when */\n        /* needed.                                          */\n        metrics->vertBearingX = 0;\n        metrics->vertBearingY = 0;\n        metrics->vertAdvance  = 0;\n      }\n      break;\n\n    case 6:\n    case 7:\n    case 9:\n      /* variable big metrics */\n      if ( FT_STREAM_READ_FIELDS( sbit_metrics_fields, metrics ) )\n        goto Exit;\n      break;\n\n    case 5:\n    default:  /* constant metrics */\n      if ( range->index_format == 2 || range->index_format == 5 )\n        *metrics = range->metrics;\n      else\n        return FT_THROW( Invalid_File_Format );\n   }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    crop_bitmap                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Crops a bitmap to its tightest bounding box, and adjusts its       */\n  /*    metrics.                                                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    map     :: The bitmap.                                             */\n  /*                                                                       */\n  /*    metrics :: The corresponding metrics structure.                    */\n  /*                                                                       */\n  static void\n  crop_bitmap( FT_Bitmap*       map,\n               TT_SBit_Metrics  metrics )\n  {\n    /***********************************************************************/\n    /*                                                                     */\n    /* In this situation, some bounding boxes of embedded bitmaps are too  */\n    /* large.  We need to crop it to a reasonable size.                    */\n    /*                                                                     */\n    /*      ---------                                                      */\n    /*      |       |                -----                                 */\n    /*      |  ***  |                |***|                                 */\n    /*      |   *   |                | * |                                 */\n    /*      |   *   |    ------>     | * |                                 */\n    /*      |   *   |                | * |                                 */\n    /*      |   *   |                | * |                                 */\n    /*      |  ***  |                |***|                                 */\n    /*      ---------                -----                                 */\n    /*                                                                     */\n    /***********************************************************************/\n\n    FT_Int    rows, count;\n    FT_Long   line_len;\n    FT_Byte*  line;\n\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* first of all, check the top-most lines of the bitmap, and remove    */\n    /* them if they're empty.                                              */\n    /*                                                                     */\n    {\n      line     = (FT_Byte*)map->buffer;\n      rows     = map->rows;\n      line_len = map->pitch;\n\n\n      for ( count = 0; count < rows; count++ )\n      {\n        FT_Byte*  cur   = line;\n        FT_Byte*  limit = line + line_len;\n\n\n        for ( ; cur < limit; cur++ )\n          if ( cur[0] )\n            goto Found_Top;\n\n        /* the current line was empty - skip to next one */\n        line  = limit;\n      }\n\n    Found_Top:\n      /* check that we have at least one filled line */\n      if ( count >= rows )\n        goto Empty_Bitmap;\n\n      /* now, crop the empty upper lines */\n      if ( count > 0 )\n      {\n        line = (FT_Byte*)map->buffer;\n\n        FT_MEM_MOVE( line, line + count * line_len,\n                     ( rows - count ) * line_len );\n\n        metrics->height       = (FT_Byte)( metrics->height - count );\n        metrics->horiBearingY = (FT_Char)( metrics->horiBearingY - count );\n        metrics->vertBearingY = (FT_Char)( metrics->vertBearingY - count );\n\n        map->rows -= count;\n        rows      -= count;\n      }\n    }\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* second, crop the lower lines                                        */\n    /*                                                                     */\n    {\n      line = (FT_Byte*)map->buffer + ( rows - 1 ) * line_len;\n\n      for ( count = 0; count < rows; count++ )\n      {\n        FT_Byte*  cur   = line;\n        FT_Byte*  limit = line + line_len;\n\n\n        for ( ; cur < limit; cur++ )\n          if ( cur[0] )\n            goto Found_Bottom;\n\n        /* the current line was empty - skip to previous one */\n        line -= line_len;\n      }\n\n    Found_Bottom:\n      if ( count > 0 )\n      {\n        metrics->height  = (FT_Byte)( metrics->height - count );\n        rows            -= count;\n        map->rows       -= count;\n      }\n    }\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* third, get rid of the space on the left side of the glyph           */\n    /*                                                                     */\n    do\n    {\n      FT_Byte*  limit;\n\n\n      line  = (FT_Byte*)map->buffer;\n      limit = line + rows * line_len;\n\n      for ( ; line < limit; line += line_len )\n        if ( line[0] & 0x80 )\n          goto Found_Left;\n\n      /* shift the whole glyph one pixel to the left */\n      line  = (FT_Byte*)map->buffer;\n      limit = line + rows * line_len;\n\n      for ( ; line < limit; line += line_len )\n      {\n        FT_Int    n, width = map->width;\n        FT_Byte   old;\n        FT_Byte*  cur = line;\n\n\n        old = (FT_Byte)(cur[0] << 1);\n        for ( n = 8; n < width; n += 8 )\n        {\n          FT_Byte  val;\n\n\n          val    = cur[1];\n          cur[0] = (FT_Byte)( old | ( val >> 7 ) );\n          old    = (FT_Byte)( val << 1 );\n          cur++;\n        }\n        cur[0] = old;\n      }\n\n      map->width--;\n      metrics->horiBearingX++;\n      metrics->vertBearingX++;\n      metrics->width--;\n\n    } while ( map->width > 0 );\n\n  Found_Left:\n\n    /***********************************************************************/\n    /*                                                                     */\n    /* finally, crop the bitmap width to get rid of the space on the right */\n    /* side of the glyph.                                                  */\n    /*                                                                     */\n    do\n    {\n      FT_Int    right = map->width - 1;\n      FT_Byte*  limit;\n      FT_Byte   mask;\n\n\n      line  = (FT_Byte*)map->buffer + ( right >> 3 );\n      limit = line + rows * line_len;\n      mask  = (FT_Byte)( 0x80 >> ( right & 7 ) );\n\n      for ( ; line < limit; line += line_len )\n        if ( line[0] & mask )\n          goto Found_Right;\n\n      /* crop the whole glyph to the right */\n      map->width--;\n      metrics->width--;\n\n    } while ( map->width > 0 );\n\n  Found_Right:\n    /* all right, the bitmap was cropped */\n    return;\n\n  Empty_Bitmap:\n    map->width      = 0;\n    map->rows       = 0;\n    map->pitch      = 0;\n    map->pixel_mode = FT_PIXEL_MODE_MONO;\n  }\n\n\n  static FT_Error\n  Load_SBit_Single( FT_Bitmap*       map,\n                    FT_Int           x_offset,\n                    FT_Int           y_offset,\n                    FT_Int           pix_bits,\n                    FT_UShort        image_format,\n                    TT_SBit_Metrics  metrics,\n                    FT_Stream        stream )\n  {\n    FT_Error  error;\n\n\n    /* check that the source bitmap fits into the target pixmap */\n    if ( x_offset < 0 || x_offset + metrics->width  > map->width ||\n         y_offset < 0 || y_offset + metrics->height > map->rows  )\n    {\n      error = FT_THROW( Invalid_Argument );\n\n      goto Exit;\n    }\n\n    {\n      FT_Int   glyph_width  = metrics->width;\n      FT_Int   glyph_height = metrics->height;\n      FT_Int   glyph_size;\n      FT_Int   line_bits    = pix_bits * glyph_width;\n      FT_Bool  pad_bytes    = 0;\n\n\n      /* compute size of glyph image */\n      switch ( image_format )\n      {\n      case 1:  /* byte-padded formats */\n      case 6:\n        {\n          FT_Int  line_length;\n\n\n          switch ( pix_bits )\n          {\n          case 1:\n            line_length = ( glyph_width + 7 ) >> 3;\n            break;\n          case 2:\n            line_length = ( glyph_width + 3 ) >> 2;\n            break;\n          case 4:\n            line_length = ( glyph_width + 1 ) >> 1;\n            break;\n          default:\n            line_length =   glyph_width;\n          }\n\n          glyph_size = glyph_height * line_length;\n          pad_bytes  = 1;\n        }\n        break;\n\n      case 2:\n      case 5:\n      case 7:\n        line_bits  =   glyph_width  * pix_bits;\n        glyph_size = ( glyph_height * line_bits + 7 ) >> 3;\n        break;\n\n      default:  /* invalid format */\n        return FT_THROW( Invalid_File_Format );\n      }\n\n      /* Now read data and draw glyph into target pixmap       */\n      if ( FT_FRAME_ENTER( glyph_size ) )\n        goto Exit;\n\n      /* don't forget to multiply `x_offset' by `map->pix_bits' as */\n      /* the sbit blitter doesn't make a difference between pixmap */\n      /* depths.                                                   */\n      blit_sbit( map, (FT_Byte*)stream->cursor, line_bits, pad_bytes,\n                 x_offset * pix_bits, y_offset, metrics->height );\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  Load_SBit_Image( TT_SBit_Strike   strike,\n                   TT_SBit_Range    range,\n                   FT_ULong         ebdt_pos,\n                   FT_ULong         glyph_offset,\n                   FT_GlyphSlot     slot,\n                   FT_Int           x_offset,\n                   FT_Int           y_offset,\n                   FT_Stream        stream,\n                   TT_SBit_Metrics  metrics,\n                   FT_Int           depth )\n  {\n    FT_Memory   memory = stream->memory;\n    FT_Bitmap*  map    = &slot->bitmap;\n    FT_Error    error;\n\n\n    /* place stream at beginning of glyph data and read metrics */\n    if ( FT_STREAM_SEEK( ebdt_pos + glyph_offset ) )\n      goto Exit;\n\n    error = tt_load_sbit_metrics( stream, range, metrics );\n    if ( error )\n      goto Exit;\n\n    /* This function is recursive.  At the top-level call, we  */\n    /* compute the dimensions of the higher-level glyph to     */\n    /* allocate the final pixmap buffer.                       */\n    if ( depth == 0 )\n    {\n      FT_Long  size;\n\n\n      map->width = metrics->width;\n      map->rows  = metrics->height;\n\n      switch ( strike->bit_depth )\n      {\n      case 1:\n        map->pixel_mode = FT_PIXEL_MODE_MONO;\n        map->pitch      = ( map->width + 7 ) >> 3;\n        break;\n\n      case 2:\n        map->pixel_mode = FT_PIXEL_MODE_GRAY2;\n        map->pitch      = ( map->width + 3 ) >> 2;\n        break;\n\n      case 4:\n        map->pixel_mode = FT_PIXEL_MODE_GRAY4;\n        map->pitch      = ( map->width + 1 ) >> 1;\n        break;\n\n      case 8:\n        map->pixel_mode = FT_PIXEL_MODE_GRAY;\n        map->pitch      = map->width;\n        break;\n\n      default:\n        return FT_THROW( Invalid_File_Format );\n      }\n\n      size = map->rows * map->pitch;\n\n      /* check that there is no empty image */\n      if ( size == 0 )\n        goto Exit;     /* exit successfully! */\n\n      error = ft_glyphslot_alloc_bitmap( slot, size );\n      if (error)\n        goto Exit;\n    }\n\n    switch ( range->image_format )\n    {\n    case 1:  /* single sbit image - load it */\n    case 2:\n    case 5:\n    case 6:\n    case 7:\n      return Load_SBit_Single( map, x_offset, y_offset, strike->bit_depth,\n                               range->image_format, metrics, stream );\n\n    case 8:  /* compound format */\n      if ( FT_STREAM_SKIP( 1L ) )\n      {\n        error = FT_THROW( Invalid_Stream_Skip );\n        goto Exit;\n      }\n      /* fallthrough */\n\n    case 9:\n      break;\n\n    default: /* invalid image format */\n      return FT_THROW( Invalid_File_Format );\n    }\n\n    /* All right, we have a compound format.  First of all, read */\n    /* the array of elements.                                    */\n    {\n      TT_SBit_Component  components = NULL;\n      TT_SBit_Component  comp;\n      FT_UShort          num_components, count;\n\n\n      if ( FT_READ_USHORT( num_components )           ||\n           FT_NEW_ARRAY( components, num_components ) )\n        goto Exit;\n\n      count = num_components;\n\n      if ( FT_FRAME_ENTER( 4L * num_components ) )\n        goto Fail_Memory;\n\n      for ( comp = components; count > 0; count--, comp++ )\n      {\n        comp->glyph_code = FT_GET_USHORT();\n        comp->x_offset   = FT_GET_CHAR();\n        comp->y_offset   = FT_GET_CHAR();\n      }\n\n      FT_FRAME_EXIT();\n\n      /* Now recursively load each element glyph */\n      count = num_components;\n      comp  = components;\n      for ( ; count > 0; count--, comp++ )\n      {\n        TT_SBit_Range       elem_range;\n        TT_SBit_MetricsRec  elem_metrics;\n        FT_ULong            elem_offset;\n\n\n        /* find the range for this element */\n        error = find_sbit_range( comp->glyph_code,\n                                 strike,\n                                 &elem_range,\n                                 &elem_offset );\n        if ( error )\n          goto Fail_Memory;\n\n        /* now load the element, recursively */\n        error = Load_SBit_Image( strike,\n                                 elem_range,\n                                 ebdt_pos,\n                                 elem_offset,\n                                 slot,\n                                 x_offset + comp->x_offset,\n                                 y_offset + comp->y_offset,\n                                 stream,\n                                 &elem_metrics,\n                                 depth + 1 );\n        if ( error )\n          goto Fail_Memory;\n      }\n\n    Fail_Memory:\n      FT_FREE( components );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_sbit_image                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads a given glyph sbit image from the font resource.  This also  */\n  /*    returns its metrics.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face         :: The target face object.                            */\n  /*                                                                       */\n  /*    strike_index :: The current strike index.                          */\n  /*                                                                       */\n  /*    glyph_index  :: The current glyph index.                           */\n  /*                                                                       */\n  /*    load_flags   :: The glyph load flags (the code checks for the flag */\n  /*                    FT_LOAD_CROP_BITMAP).                              */\n  /*                                                                       */\n  /*    stream       :: The input stream.                                  */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    map          :: The target pixmap.                                 */\n  /*                                                                       */\n  /*    metrics      :: A big sbit metrics structure for the glyph image.  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.  Returns an error if no     */\n  /*    glyph sbit exists for the index.                                   */\n  /*                                                                       */\n  /*  <Note>                                                               */\n  /*    The `map.buffer' field is always freed before the glyph is loaded. */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_sbit_image( TT_Face              face,\n                           FT_ULong             strike_index,\n                           FT_UInt              glyph_index,\n                           FT_UInt              load_flags,\n                           FT_Stream            stream,\n                           FT_Bitmap           *map,\n                           TT_SBit_MetricsRec  *metrics )\n  {\n    FT_Error        error;\n    FT_ULong        ebdt_pos, glyph_offset;\n\n    TT_SBit_Strike  strike;\n    TT_SBit_Range   range;\n\n\n    /* Check whether there is a glyph sbit for the current index */\n    error = tt_find_sbit_image( face, glyph_index, strike_index,\n                                &range, &strike, &glyph_offset );\n    if ( error )\n      goto Exit;\n\n    /* now, find the location of the `EBDT' table in */\n    /* the font file                                 */\n    error = face->goto_table( face, TTAG_EBDT, stream, 0 );\n    if ( error )\n      error = face->goto_table( face, TTAG_bdat, stream, 0 );\n    if ( error )\n      goto Exit;\n\n    ebdt_pos = FT_STREAM_POS();\n\n    error = Load_SBit_Image( strike, range, ebdt_pos, glyph_offset,\n                             face->root.glyph, 0, 0, stream, metrics, 0 );\n    if ( error )\n      goto Exit;\n\n    /* setup vertical metrics if needed */\n    if ( strike->flags & 1 )\n    {\n      /* in case of a horizontal strike only */\n      FT_Int  advance;\n\n\n      advance = strike->hori.ascender - strike->hori.descender;\n\n      /* some heuristic values */\n\n      metrics->vertBearingX = (FT_Char)(-metrics->width / 2 );\n      metrics->vertBearingY = (FT_Char)( ( advance - metrics->height ) / 2 );\n      metrics->vertAdvance  = (FT_Char)( advance * 12 / 10 );\n    }\n\n    /* Crop the bitmap now, unless specified otherwise */\n    if ( load_flags & FT_LOAD_CROP_BITMAP )\n      crop_bitmap( map, metrics );\n\n  Exit:\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttsbit.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttsbit.h                                                               */\n/*                                                                         */\n/*    TrueType and OpenType embedded bitmap support (specification).       */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by       */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTSBIT_H__\n#define __TTSBIT_H__\n\n\n#include <ft2build.h>\n#include \"ttload.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_eblc( TT_Face    face,\n                     FT_Stream  stream );\n\n  FT_LOCAL( void )\n  tt_face_free_eblc( TT_Face  face );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_set_sbit_strike( TT_Face          face,\n                           FT_Size_Request  req,\n                           FT_ULong*        astrike_index );\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_strike_metrics( TT_Face           face,\n                               FT_ULong          strike_index,\n                               FT_Size_Metrics*  metrics );\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n  FT_LOCAL( FT_Error )\n  tt_find_sbit_image( TT_Face          face,\n                      FT_UInt          glyph_index,\n                      FT_ULong         strike_index,\n                      TT_SBit_Range   *arange,\n                      TT_SBit_Strike  *astrike,\n                      FT_ULong        *aglyph_offset );\n\n  FT_LOCAL( FT_Error )\n  tt_load_sbit_metrics( FT_Stream        stream,\n                        TT_SBit_Range    range,\n                        TT_SBit_Metrics  metrics );\n\n#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_sbit_image( TT_Face              face,\n                           FT_ULong             strike_index,\n                           FT_UInt              glyph_index,\n                           FT_UInt              load_flags,\n                           FT_Stream            stream,\n                           FT_Bitmap           *map,\n                           TT_SBit_MetricsRec  *metrics );\n\n\nFT_END_HEADER\n\n#endif /* __TTSBIT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/sfnt/ttsbit0.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttsbit0.c                                                              */\n/*                                                                         */\n/*    TrueType and OpenType embedded bitmap support (body).                */\n/*    This is a heap-optimized version.                                    */\n/*                                                                         */\n/*  Copyright 2005-2009, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n/* This file is included by ttsbit.c */\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n#include \"ttsbit.h\"\n\n#include \"sferrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttsbit\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_eblc( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Fixed  version;\n    FT_ULong  num_strikes, table_size;\n    FT_Byte*  p;\n    FT_Byte*  p_limit;\n    FT_UInt   count;\n\n\n    face->sbit_num_strikes = 0;\n\n    /* this table is optional */\n    error = face->goto_table( face, TTAG_EBLC, stream, &table_size );\n    if ( error )\n      error = face->goto_table( face, TTAG_bloc, stream, &table_size );\n    if ( error )\n      goto Exit;\n\n    if ( table_size < 8 )\n    {\n      FT_ERROR(( \"tt_face_load_sbit_strikes: table too short\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) )\n      goto Exit;\n\n    face->sbit_table_size = table_size;\n\n    p       = face->sbit_table;\n    p_limit = p + table_size;\n\n    version     = FT_NEXT_ULONG( p );\n    num_strikes = FT_NEXT_ULONG( p );\n\n    if ( version != 0x00020000UL || num_strikes >= 0x10000UL )\n    {\n      FT_ERROR(( \"tt_face_load_sbit_strikes: invalid table version\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    /*\n     *  Count the number of strikes available in the table.  We are a bit\n     *  paranoid there and don't trust the data.\n     */\n    count = (FT_UInt)num_strikes;\n    if ( 8 + 48UL * count > table_size )\n      count = (FT_UInt)( ( p_limit - p ) / 48 );\n\n    face->sbit_num_strikes = count;\n\n    FT_TRACE3(( \"sbit_num_strikes: %u\\n\", count ));\n  Exit:\n    return error;\n\n  Fail:\n    FT_FRAME_RELEASE( face->sbit_table );\n    face->sbit_table_size = 0;\n    goto Exit;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_free_eblc( TT_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n\n\n    FT_FRAME_RELEASE( face->sbit_table );\n    face->sbit_table_size  = 0;\n    face->sbit_num_strikes = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_set_sbit_strike( TT_Face          face,\n                           FT_Size_Request  req,\n                           FT_ULong*        astrike_index )\n  {\n    return FT_Match_Size( (FT_Face)face, req, 0, astrike_index );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_strike_metrics( TT_Face           face,\n                               FT_ULong          strike_index,\n                               FT_Size_Metrics*  metrics )\n  {\n    FT_Byte*  strike;\n\n\n    if ( strike_index >= (FT_ULong)face->sbit_num_strikes )\n      return FT_THROW( Invalid_Argument );\n\n    strike = face->sbit_table + 8 + strike_index * 48;\n\n    metrics->x_ppem = (FT_UShort)strike[44];\n    metrics->y_ppem = (FT_UShort)strike[45];\n\n    metrics->ascender  = (FT_Char)strike[16] << 6;  /* hori.ascender  */\n    metrics->descender = (FT_Char)strike[17] << 6;  /* hori.descender */\n    metrics->height    = metrics->ascender - metrics->descender;\n\n    /* XXX: Is this correct? */\n    metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB  */\n                                      strike[18] + /* max_width      */\n                             (FT_Char)strike[23]   /* min_advance_SB */\n                                                 ) << 6;\n\n    return FT_Err_Ok;\n  }\n\n\n  typedef struct  TT_SBitDecoderRec_\n  {\n    TT_Face          face;\n    FT_Stream        stream;\n    FT_Bitmap*       bitmap;\n    TT_SBit_Metrics  metrics;\n    FT_Bool          metrics_loaded;\n    FT_Bool          bitmap_allocated;\n    FT_Byte          bit_depth;\n\n    FT_ULong         ebdt_start;\n    FT_ULong         ebdt_size;\n\n    FT_ULong         strike_index_array;\n    FT_ULong         strike_index_count;\n    FT_Byte*         eblc_base;\n    FT_Byte*         eblc_limit;\n\n  } TT_SBitDecoderRec, *TT_SBitDecoder;\n\n\n  static FT_Error\n  tt_sbit_decoder_init( TT_SBitDecoder       decoder,\n                        TT_Face              face,\n                        FT_ULong             strike_index,\n                        TT_SBit_MetricsRec*  metrics )\n  {\n    FT_Error   error;\n    FT_Stream  stream = face->root.stream;\n    FT_ULong   ebdt_size;\n\n\n    error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size );\n    if ( error )\n      error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size );\n    if ( error )\n      goto Exit;\n\n    decoder->face    = face;\n    decoder->stream  = stream;\n    decoder->bitmap  = &face->root.glyph->bitmap;\n    decoder->metrics = metrics;\n\n    decoder->metrics_loaded   = 0;\n    decoder->bitmap_allocated = 0;\n\n    decoder->ebdt_start = FT_STREAM_POS();\n    decoder->ebdt_size  = ebdt_size;\n\n    decoder->eblc_base  = face->sbit_table;\n    decoder->eblc_limit = face->sbit_table + face->sbit_table_size;\n\n    /* now find the strike corresponding to the index */\n    {\n      FT_Byte*  p;\n\n\n      if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size )\n      {\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      p = decoder->eblc_base + 8 + 48 * strike_index;\n\n      decoder->strike_index_array = FT_NEXT_ULONG( p );\n      p                          += 4;\n      decoder->strike_index_count = FT_NEXT_ULONG( p );\n      p                          += 34;\n      decoder->bit_depth          = *p;\n\n      if ( decoder->strike_index_array > face->sbit_table_size             ||\n           decoder->strike_index_array + 8 * decoder->strike_index_count >\n             face->sbit_table_size                                         )\n        error = FT_THROW( Invalid_File_Format );\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  tt_sbit_decoder_done( TT_SBitDecoder  decoder )\n  {\n    FT_UNUSED( decoder );\n  }\n\n\n  static FT_Error\n  tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder  decoder )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_UInt     width, height;\n    FT_Bitmap*  map = decoder->bitmap;\n    FT_Long     size;\n\n\n    if ( !decoder->metrics_loaded )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    width  = decoder->metrics->width;\n    height = decoder->metrics->height;\n\n    map->width = (int)width;\n    map->rows  = (int)height;\n\n    switch ( decoder->bit_depth )\n    {\n    case 1:\n      map->pixel_mode = FT_PIXEL_MODE_MONO;\n      map->pitch      = ( map->width + 7 ) >> 3;\n      break;\n\n    case 2:\n      map->pixel_mode = FT_PIXEL_MODE_GRAY2;\n      map->pitch      = ( map->width + 3 ) >> 2;\n      break;\n\n    case 4:\n      map->pixel_mode = FT_PIXEL_MODE_GRAY4;\n      map->pitch      = ( map->width + 1 ) >> 1;\n      break;\n\n    case 8:\n      map->pixel_mode = FT_PIXEL_MODE_GRAY;\n      map->pitch      = map->width;\n      break;\n\n    default:\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    size = map->rows * map->pitch;\n\n    /* check that there is no empty image */\n    if ( size == 0 )\n      goto Exit;     /* exit successfully! */\n\n    error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );\n    if ( error )\n      goto Exit;\n\n    decoder->bitmap_allocated = 1;\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  tt_sbit_decoder_load_metrics( TT_SBitDecoder  decoder,\n                                FT_Byte*       *pp,\n                                FT_Byte*        limit,\n                                FT_Bool         big )\n  {\n    FT_Byte*         p       = *pp;\n    TT_SBit_Metrics  metrics = decoder->metrics;\n\n\n    if ( p + 5 > limit )\n      goto Fail;\n\n    metrics->height       = p[0];\n    metrics->width        = p[1];\n    metrics->horiBearingX = (FT_Char)p[2];\n    metrics->horiBearingY = (FT_Char)p[3];\n    metrics->horiAdvance  = p[4];\n\n    p += 5;\n    if ( big )\n    {\n      if ( p + 3 > limit )\n        goto Fail;\n\n      metrics->vertBearingX = (FT_Char)p[0];\n      metrics->vertBearingY = (FT_Char)p[1];\n      metrics->vertAdvance  = p[2];\n\n      p += 3;\n    }\n\n    decoder->metrics_loaded = 1;\n    *pp = p;\n    return FT_Err_Ok;\n\n  Fail:\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  /* forward declaration */\n  static FT_Error\n  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,\n                              FT_UInt         glyph_index,\n                              FT_Int          x_pos,\n                              FT_Int          y_pos );\n\n  typedef FT_Error  (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder  decoder,\n                                                FT_Byte*        p,\n                                                FT_Byte*        plimit,\n                                                FT_Int          x_pos,\n                                                FT_Int          y_pos );\n\n\n  static FT_Error\n  tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder  decoder,\n                                     FT_Byte*        p,\n                                     FT_Byte*        limit,\n                                     FT_Int          x_pos,\n                                     FT_Int          y_pos )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Byte*    line;\n    FT_Int      bit_height, bit_width, pitch, width, height, line_bits, h;\n    FT_Bitmap*  bitmap;\n\n\n    if ( !decoder->bitmap_allocated )\n    {\n      error = tt_sbit_decoder_alloc_bitmap( decoder );\n      if ( error )\n        goto Exit;\n    }\n\n    /* check that we can write the glyph into the bitmap */\n    bitmap     = decoder->bitmap;\n    bit_width  = bitmap->width;\n    bit_height = bitmap->rows;\n    pitch      = bitmap->pitch;\n    line       = bitmap->buffer;\n\n    width  = decoder->metrics->width;\n    height = decoder->metrics->height;\n\n    line_bits = width * decoder->bit_depth;\n\n    if ( x_pos < 0 || x_pos + width > bit_width   ||\n         y_pos < 0 || y_pos + height > bit_height )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( p + ( ( line_bits + 7 ) >> 3 ) * height > limit )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* now do the blit */\n    line  += y_pos * pitch + ( x_pos >> 3 );\n    x_pos &= 7;\n\n    if ( x_pos == 0 )  /* the easy one */\n    {\n      for ( h = height; h > 0; h--, line += pitch )\n      {\n        FT_Byte*  write = line;\n        FT_Int    w;\n\n\n        for ( w = line_bits; w >= 8; w -= 8 )\n        {\n          write[0] = (FT_Byte)( write[0] | *p++ );\n          write   += 1;\n        }\n\n        if ( w > 0 )\n          write[0] = (FT_Byte)( write[0] | ( *p++ & ( 0xFF00U >> w ) ) );\n      }\n    }\n    else  /* x_pos > 0 */\n    {\n      for ( h = height; h > 0; h--, line += pitch )\n      {\n        FT_Byte*  write = line;\n        FT_Int    w;\n        FT_UInt   wval = 0;\n\n\n        for ( w = line_bits; w >= 8; w -= 8 )\n        {\n          wval      = (FT_UInt)( wval | *p++ );\n          write[0]  = (FT_Byte)( write[0] | ( wval >> x_pos ) );\n          write    += 1;\n          wval    <<= 8;\n        }\n\n        if ( w > 0 )\n          wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) );\n\n        /* all bits read and there are `x_pos + w' bits to be written */\n\n        write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) );\n\n        if ( x_pos + w > 8 )\n        {\n          write++;\n          wval   <<= 8;\n          write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) );\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*\n   * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap\n   * (with pointer `write').  In the example below, the width is 3 pixel,\n   * and `x_pos' is 1 pixel.\n   *\n   *       p                               p+1\n   *     |                               |                               |\n   *     | 7   6   5   4   3   2   1   0 | 7   6   5   4   3   2   1   0 |...\n   *     |                               |                               |\n   *       +-------+   +-------+   +-------+ ...\n   *           .           .           .\n   *           .           .           .\n   *           v           .           .\n   *       +-------+       .           .\n   * |                               | .\n   * | 7   6   5   4   3   2   1   0 | .\n   * |                               | .\n   *   write               .           .\n   *                       .           .\n   *                       v           .\n   *                   +-------+       .\n   *             |                               |\n   *             | 7   6   5   4   3   2   1   0 |\n   *             |                               |\n   *               write+1             .\n   *                                   .\n   *                                   v\n   *                               +-------+\n   *                         |                               |\n   *                         | 7   6   5   4   3   2   1   0 |\n   *                         |                               |\n   *                           write+2\n   *\n   */\n\n  static FT_Error\n  tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder  decoder,\n                                    FT_Byte*        p,\n                                    FT_Byte*        limit,\n                                    FT_Int          x_pos,\n                                    FT_Int          y_pos )\n  {\n    FT_Error    error = FT_Err_Ok;\n    FT_Byte*    line;\n    FT_Int      bit_height, bit_width, pitch, width, height, line_bits, h, nbits;\n    FT_Bitmap*  bitmap;\n    FT_UShort   rval;\n\n\n    if ( !decoder->bitmap_allocated )\n    {\n      error = tt_sbit_decoder_alloc_bitmap( decoder );\n      if ( error )\n        goto Exit;\n    }\n\n    /* check that we can write the glyph into the bitmap */\n    bitmap     = decoder->bitmap;\n    bit_width  = bitmap->width;\n    bit_height = bitmap->rows;\n    pitch      = bitmap->pitch;\n    line       = bitmap->buffer;\n\n    width  = decoder->metrics->width;\n    height = decoder->metrics->height;\n\n    line_bits = width * decoder->bit_depth;\n\n    if ( x_pos < 0 || x_pos + width  > bit_width  ||\n         y_pos < 0 || y_pos + height > bit_height )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( p + ( ( line_bits * height + 7 ) >> 3 ) > limit )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* now do the blit */\n\n    /* adjust `line' to point to the first byte of the bitmap */\n    line  += y_pos * pitch + ( x_pos >> 3 );\n    x_pos &= 7;\n\n    /* the higher byte of `rval' is used as a buffer */\n    rval  = 0;\n    nbits = 0;\n\n    for ( h = height; h > 0; h--, line += pitch )\n    {\n      FT_Byte*  write = line;\n      FT_Int    w     = line_bits;\n\n\n      /* handle initial byte (in target bitmap) specially if necessary */\n      if ( x_pos )\n      {\n        w = ( line_bits < 8 - x_pos ) ? line_bits : 8 - x_pos;\n\n        if ( h == height )\n        {\n          rval  = *p++;\n          nbits = x_pos;\n        }\n        else if ( nbits < w )\n        {\n          if ( p < limit )\n            rval |= *p++;\n          nbits += 8 - w;\n        }\n        else\n        {\n          rval  >>= 8;\n          nbits  -= w;\n        }\n\n        *write++ |= ( ( rval >> nbits ) & 0xFF ) &\n                    ( ~( 0xFF << w ) << ( 8 - w - x_pos ) );\n        rval    <<= 8;\n\n        w = line_bits - w;\n      }\n\n      /* handle medial bytes */\n      for ( ; w >= 8; w -= 8 )\n      {\n        rval     |= *p++;\n        *write++ |= ( rval >> nbits ) & 0xFF;\n\n        rval <<= 8;\n      }\n\n      /* handle final byte if necessary */\n      if ( w > 0 )\n      {\n        if ( nbits < w )\n        {\n          if ( p < limit )\n            rval |= *p++;\n          *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );\n          nbits  += 8 - w;\n\n          rval <<= 8;\n        }\n        else\n        {\n          *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );\n          nbits  -= w;\n        }\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  tt_sbit_decoder_load_compound( TT_SBitDecoder  decoder,\n                                 FT_Byte*        p,\n                                 FT_Byte*        limit,\n                                 FT_Int          x_pos,\n                                 FT_Int          y_pos )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_UInt   num_components, nn;\n\n    FT_Char  horiBearingX = decoder->metrics->horiBearingX;\n    FT_Char  horiBearingY = decoder->metrics->horiBearingY;\n    FT_Byte  horiAdvance  = decoder->metrics->horiAdvance;\n    FT_Char  vertBearingX = decoder->metrics->vertBearingX;\n    FT_Char  vertBearingY = decoder->metrics->vertBearingY;\n    FT_Byte  vertAdvance  = decoder->metrics->vertAdvance;\n\n\n    if ( p + 2 > limit )\n      goto Fail;\n\n    num_components = FT_NEXT_USHORT( p );\n    if ( p + 4 * num_components > limit )\n      goto Fail;\n\n    if ( !decoder->bitmap_allocated )\n    {\n      error = tt_sbit_decoder_alloc_bitmap( decoder );\n      if ( error )\n        goto Exit;\n    }\n\n    for ( nn = 0; nn < num_components; nn++ )\n    {\n      FT_UInt  gindex = FT_NEXT_USHORT( p );\n      FT_Byte  dx     = FT_NEXT_BYTE( p );\n      FT_Byte  dy     = FT_NEXT_BYTE( p );\n\n\n      /* NB: a recursive call */\n      error = tt_sbit_decoder_load_image( decoder, gindex,\n                                          x_pos + dx, y_pos + dy );\n      if ( error )\n        break;\n    }\n\n    decoder->metrics->horiBearingX = horiBearingX;\n    decoder->metrics->horiBearingY = horiBearingY;\n    decoder->metrics->horiAdvance  = horiAdvance;\n    decoder->metrics->vertBearingX = vertBearingX;\n    decoder->metrics->vertBearingY = vertBearingY;\n    decoder->metrics->vertAdvance  = vertAdvance;\n    decoder->metrics->width        = (FT_UInt)decoder->bitmap->width;\n    decoder->metrics->height       = (FT_UInt)decoder->bitmap->rows;\n\n  Exit:\n    return error;\n\n  Fail:\n    error = FT_THROW( Invalid_File_Format );\n    goto Exit;\n  }\n\n\n  static FT_Error\n  tt_sbit_decoder_load_bitmap( TT_SBitDecoder  decoder,\n                               FT_UInt         glyph_format,\n                               FT_ULong        glyph_start,\n                               FT_ULong        glyph_size,\n                               FT_Int          x_pos,\n                               FT_Int          y_pos )\n  {\n    FT_Error   error;\n    FT_Stream  stream = decoder->stream;\n    FT_Byte*   p;\n    FT_Byte*   p_limit;\n    FT_Byte*   data;\n\n\n    /* seek into the EBDT table now */\n    if ( glyph_start + glyph_size > decoder->ebdt_size )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) ||\n         FT_FRAME_EXTRACT( glyph_size, data )                )\n      goto Exit;\n\n    p       = data;\n    p_limit = p + glyph_size;\n\n    /* read the data, depending on the glyph format */\n    switch ( glyph_format )\n    {\n    case 1:\n    case 2:\n    case 8:\n      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 );\n      break;\n\n    case 6:\n    case 7:\n    case 9:\n      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 );\n      break;\n\n    default:\n      error = FT_Err_Ok;\n    }\n\n    if ( error )\n      goto Fail;\n\n    {\n      TT_SBitDecoder_LoadFunc  loader;\n\n\n      switch ( glyph_format )\n      {\n      case 1:\n      case 6:\n        loader = tt_sbit_decoder_load_byte_aligned;\n        break;\n\n      case 2:\n      case 5:\n      case 7:\n        loader = tt_sbit_decoder_load_bit_aligned;\n        break;\n\n      case 8:\n        if ( p + 1 > p_limit )\n          goto Fail;\n\n        p += 1;  /* skip padding */\n        /* fall-through */\n\n      case 9:\n        loader = tt_sbit_decoder_load_compound;\n        break;\n\n      default:\n        goto Fail;\n      }\n\n      error = loader( decoder, p, p_limit, x_pos, y_pos );\n    }\n\n  Fail:\n    FT_FRAME_RELEASE( data );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,\n                              FT_UInt         glyph_index,\n                              FT_Int          x_pos,\n                              FT_Int          y_pos )\n  {\n    /*\n     *  First, we find the correct strike range that applies to this\n     *  glyph index.\n     */\n\n    FT_Byte*  p          = decoder->eblc_base + decoder->strike_index_array;\n    FT_Byte*  p_limit    = decoder->eblc_limit;\n    FT_ULong  num_ranges = decoder->strike_index_count;\n    FT_UInt   start, end, index_format, image_format;\n    FT_ULong  image_start = 0, image_end = 0, image_offset;\n\n\n    for ( ; num_ranges > 0; num_ranges-- )\n    {\n      start = FT_NEXT_USHORT( p );\n      end   = FT_NEXT_USHORT( p );\n\n      if ( glyph_index >= start && glyph_index <= end )\n        goto FoundRange;\n\n      p += 4;  /* ignore index offset */\n    }\n    goto NoBitmap;\n\n  FoundRange:\n    image_offset = FT_NEXT_ULONG( p );\n\n    /* overflow check */\n    p = decoder->eblc_base + decoder->strike_index_array;\n    if ( image_offset > (FT_ULong)( p_limit - p ) )\n      goto Failure;\n\n    p += image_offset;\n    if ( p + 8 > p_limit )\n      goto NoBitmap;\n\n    /* now find the glyph's location and extend within the ebdt table */\n    index_format = FT_NEXT_USHORT( p );\n    image_format = FT_NEXT_USHORT( p );\n    image_offset = FT_NEXT_ULONG ( p );\n\n    switch ( index_format )\n    {\n    case 1: /* 4-byte offsets relative to `image_offset' */\n      {\n        p += 4 * ( glyph_index - start );\n        if ( p + 8 > p_limit )\n          goto NoBitmap;\n\n        image_start = FT_NEXT_ULONG( p );\n        image_end   = FT_NEXT_ULONG( p );\n\n        if ( image_start == image_end )  /* missing glyph */\n          goto NoBitmap;\n      }\n      break;\n\n    case 2: /* big metrics, constant image size */\n      {\n        FT_ULong  image_size;\n\n\n        if ( p + 12 > p_limit )\n          goto NoBitmap;\n\n        image_size = FT_NEXT_ULONG( p );\n\n        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )\n          goto NoBitmap;\n\n        image_start = image_size * ( glyph_index - start );\n        image_end   = image_start + image_size;\n      }\n      break;\n\n    case 3: /* 2-byte offsets relative to 'image_offset' */\n      {\n        p += 2 * ( glyph_index - start );\n        if ( p + 4 > p_limit )\n          goto NoBitmap;\n\n        image_start = FT_NEXT_USHORT( p );\n        image_end   = FT_NEXT_USHORT( p );\n\n        if ( image_start == image_end )  /* missing glyph */\n          goto NoBitmap;\n      }\n      break;\n\n    case 4: /* sparse glyph array with (glyph,offset) pairs */\n      {\n        FT_ULong  mm, num_glyphs;\n\n\n        if ( p + 4 > p_limit )\n          goto NoBitmap;\n\n        num_glyphs = FT_NEXT_ULONG( p );\n\n        /* overflow check for p + ( num_glyphs + 1 ) * 4 */\n        if ( num_glyphs > (FT_ULong)( ( ( p_limit - p ) >> 2 ) - 1 ) )\n          goto NoBitmap;\n\n        for ( mm = 0; mm < num_glyphs; mm++ )\n        {\n          FT_UInt  gindex = FT_NEXT_USHORT( p );\n\n\n          if ( gindex == glyph_index )\n          {\n            image_start = FT_NEXT_USHORT( p );\n            p          += 2;\n            image_end   = FT_PEEK_USHORT( p );\n            break;\n          }\n          p += 2;\n        }\n\n        if ( mm >= num_glyphs )\n          goto NoBitmap;\n      }\n      break;\n\n    case 5: /* constant metrics with sparse glyph codes */\n      {\n        FT_ULong  image_size, mm, num_glyphs;\n\n\n        if ( p + 16 > p_limit )\n          goto NoBitmap;\n\n        image_size = FT_NEXT_ULONG( p );\n\n        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )\n          goto NoBitmap;\n\n        num_glyphs = FT_NEXT_ULONG( p );\n\n        /* overflow check for p + 2 * num_glyphs */\n        if ( num_glyphs > (FT_ULong)( ( p_limit - p ) >> 1 ) )\n          goto NoBitmap;\n\n        for ( mm = 0; mm < num_glyphs; mm++ )\n        {\n          FT_UInt  gindex = FT_NEXT_USHORT( p );\n\n\n          if ( gindex == glyph_index )\n            break;\n        }\n\n        if ( mm >= num_glyphs )\n          goto NoBitmap;\n\n        image_start = image_size * mm;\n        image_end   = image_start + image_size;\n      }\n      break;\n\n    default:\n      goto NoBitmap;\n    }\n\n    if ( image_start > image_end )\n      goto NoBitmap;\n\n    image_end  -= image_start;\n    image_start = image_offset + image_start;\n\n    return tt_sbit_decoder_load_bitmap( decoder,\n                                        image_format,\n                                        image_start,\n                                        image_end,\n                                        x_pos,\n                                        y_pos );\n\n  Failure:\n    return FT_THROW( Invalid_Table );\n\n  NoBitmap:\n    return FT_THROW( Invalid_Argument );\n  }\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_sbit_image( TT_Face              face,\n                           FT_ULong             strike_index,\n                           FT_UInt              glyph_index,\n                           FT_UInt              load_flags,\n                           FT_Stream            stream,\n                           FT_Bitmap           *map,\n                           TT_SBit_MetricsRec  *metrics )\n  {\n    TT_SBitDecoderRec  decoder[1];\n    FT_Error           error;\n\n    FT_UNUSED( load_flags );\n    FT_UNUSED( stream );\n    FT_UNUSED( map );\n\n\n    error = tt_sbit_decoder_init( decoder, face, strike_index, metrics );\n    if ( !error )\n    {\n      error = tt_sbit_decoder_load_image( decoder, glyph_index, 0, 0 );\n      tt_sbit_decoder_done( decoder );\n    }\n\n    return error;\n  }\n\n/* EOF */\n"
  },
  {
    "path": "libs/freetype/src/smooth/Jamfile",
    "content": "# FreeType 2 src/smooth Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) smooth ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = ftgrays ftsmooth ftspic ;\n  }\n  else\n  {\n    _sources = smooth ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/smooth Jamfile\n"
  },
  {
    "path": "libs/freetype/src/smooth/ftgrays.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgrays.c                                                              */\n/*                                                                         */\n/*    A new `perfect' anti-aliasing renderer (body).                       */\n/*                                                                         */\n/*  Copyright 2000-2003, 2005-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file can be compiled without the rest of the FreeType engine, by */\n  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */\n  /* put the files `ftgrays.h' and `ftimage.h' into the current            */\n  /* compilation directory.  Typically, you could do something like        */\n  /*                                                                       */\n  /* - copy `src/smooth/ftgrays.c' (this file) to your current directory   */\n  /*                                                                       */\n  /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */\n  /*   same directory                                                      */\n  /*                                                                       */\n  /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in        */\n  /*                                                                       */\n  /*     cc -c -D_STANDALONE_ ftgrays.c                                    */\n  /*                                                                       */\n  /* The renderer can be initialized with a call to                        */\n  /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated  */\n  /* with a call to `ft_gray_raster.raster_render'.                        */\n  /*                                                                       */\n  /* See the comments and documentation in the file `ftimage.h' for more   */\n  /* details on how the raster works.                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This is a new anti-aliasing scan-converter for FreeType 2.  The       */\n  /* algorithm used here is _very_ different from the one in the standard  */\n  /* `ftraster' module.  Actually, `ftgrays' computes the _exact_          */\n  /* coverage of the outline on each pixel cell.                           */\n  /*                                                                       */\n  /* It is based on ideas that I initially found in Raph Levien's          */\n  /* excellent LibArt graphics library (see http://www.levien.com/libart   */\n  /* for more information, though the web pages do not tell anything       */\n  /* about the renderer; you'll have to dive into the source code to       */\n  /* understand how it works).                                             */\n  /*                                                                       */\n  /* Note, however, that this is a _very_ different implementation         */\n  /* compared to Raph's.  Coverage information is stored in a very         */\n  /* different way, and I don't use sorted vector paths.  Also, it doesn't */\n  /* use floating point values.                                            */\n  /*                                                                       */\n  /* This renderer has the following advantages:                           */\n  /*                                                                       */\n  /* - It doesn't need an intermediate bitmap.  Instead, one can supply a  */\n  /*   callback function that will be called by the renderer to draw gray  */\n  /*   spans on any target surface.  You can thus do direct composition on */\n  /*   any kind of bitmap, provided that you give the renderer the right   */\n  /*   callback.                                                           */\n  /*                                                                       */\n  /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on   */\n  /*   each pixel cell.                                                    */\n  /*                                                                       */\n  /* - It performs a single pass on the outline (the `standard' FT2        */\n  /*   renderer makes two passes).                                         */\n  /*                                                                       */\n  /* - It can easily be modified to render to _any_ number of gray levels  */\n  /*   cheaply.                                                            */\n  /*                                                                       */\n  /* - For small (< 20) pixel sizes, it is faster than the standard        */\n  /*   renderer.                                                           */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_smooth\n\n\n#ifdef _STANDALONE_\n\n\n  /* Auxiliary macros for token concatenation. */\n#define FT_ERR_XCAT( x, y )  x ## y\n#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )\n\n\n  /* define this to dump debugging information */\n/* #define FT_DEBUG_LEVEL_TRACE */\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n#include <stdio.h>\n#include <stdarg.h>\n#endif\n\n#include <stddef.h>\n#include <string.h>\n#include <setjmp.h>\n#include <limits.h>\n#define FT_UINT_MAX  UINT_MAX\n#define FT_INT_MAX   INT_MAX\n\n#define ft_memset   memset\n\n#define ft_setjmp   setjmp\n#define ft_longjmp  longjmp\n#define ft_jmp_buf  jmp_buf\n\ntypedef ptrdiff_t  FT_PtrDist;\n\n\n#define ErrRaster_Invalid_Mode      -2\n#define ErrRaster_Invalid_Outline   -1\n#define ErrRaster_Invalid_Argument  -3\n#define ErrRaster_Memory_Overflow   -4\n\n#define FT_BEGIN_HEADER\n#define FT_END_HEADER\n\n#include \"ftimage.h\"\n#include \"ftgrays.h\"\n\n\n  /* This macro is used to indicate that a function parameter is unused. */\n  /* Its purpose is simply to reduce compiler warnings.  Note also that  */\n  /* simply defining it as `(void)x' doesn't avoid warnings with certain */\n  /* ANSI compilers (e.g. LCC).                                          */\n#define FT_UNUSED( x )  (x) = (x)\n\n\n  /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n  void\n  FT_Message( const char*  fmt,\n              ... )\n  {\n    va_list  ap;\n\n\n    va_start( ap, fmt );\n    vfprintf( stderr, fmt, ap );\n    va_end( ap );\n  }\n\n\n  /* empty function useful for setting a breakpoint to catch errors */\n  int\n  FT_Throw( int          error,\n            int          line,\n            const char*  file )\n  {\n    FT_UNUSED( error );\n    FT_UNUSED( line );\n    FT_UNUSED( file );\n\n    return 0;\n  }\n\n\n  /* we don't handle tracing levels in stand-alone mode; */\n#ifndef FT_TRACE5\n#define FT_TRACE5( varformat )  FT_Message varformat\n#endif\n#ifndef FT_TRACE7\n#define FT_TRACE7( varformat )  FT_Message varformat\n#endif\n#ifndef FT_ERROR\n#define FT_ERROR( varformat )   FT_Message varformat\n#endif\n\n#define FT_THROW( e )                               \\\n          ( FT_Throw( FT_ERR_CAT( ErrRaster, e ),   \\\n                      __LINE__,                     \\\n                      __FILE__ )                  | \\\n            FT_ERR_CAT( ErrRaster, e )            )\n\n#else /* !FT_DEBUG_LEVEL_TRACE */\n\n#define FT_TRACE5( x )  do { } while ( 0 )     /* nothing */\n#define FT_TRACE7( x )  do { } while ( 0 )     /* nothing */\n#define FT_ERROR( x )   do { } while ( 0 )     /* nothing */\n#define FT_THROW( e )   FT_ERR_CAT( ErrRaster_, e )\n\n\n#endif /* !FT_DEBUG_LEVEL_TRACE */\n\n\n#define FT_DEFINE_OUTLINE_FUNCS( class_,               \\\n                                 move_to_, line_to_,   \\\n                                 conic_to_, cubic_to_, \\\n                                 shift_, delta_ )      \\\n          static const FT_Outline_Funcs class_ =       \\\n          {                                            \\\n            move_to_,                                  \\\n            line_to_,                                  \\\n            conic_to_,                                 \\\n            cubic_to_,                                 \\\n            shift_,                                    \\\n            delta_                                     \\\n         };\n\n#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_,            \\\n                                raster_new_, raster_reset_,       \\\n                                raster_set_mode_, raster_render_, \\\n                                raster_done_ )                    \\\n          const FT_Raster_Funcs class_ =                          \\\n          {                                                       \\\n            glyph_format_,                                        \\\n            raster_new_,                                          \\\n            raster_reset_,                                        \\\n            raster_set_mode_,                                     \\\n            raster_render_,                                       \\\n            raster_done_                                          \\\n         };\n\n\n#else /* !_STANDALONE_ */\n\n\n#include <ft2build.h>\n#include \"ftgrays.h\"\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_OUTLINE_H\n\n#include \"ftsmerrs.h\"\n\n#include \"ftspic.h\"\n\n#define Smooth_Err_Invalid_Mode     Smooth_Err_Cannot_Render_Glyph\n#define Smooth_Err_Memory_Overflow  Smooth_Err_Out_Of_Memory\n#define ErrRaster_Memory_Overflow   Smooth_Err_Out_Of_Memory\n\n\n#endif /* !_STANDALONE_ */\n\n\n#ifndef FT_MEM_SET\n#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )\n#endif\n\n#ifndef FT_MEM_ZERO\n#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )\n#endif\n\n  /* as usual, for the speed hungry :-) */\n\n#undef RAS_ARG\n#undef RAS_ARG_\n#undef RAS_VAR\n#undef RAS_VAR_\n\n#ifndef FT_STATIC_RASTER\n\n#define RAS_ARG   gray_PWorker  worker\n#define RAS_ARG_  gray_PWorker  worker,\n\n#define RAS_VAR   worker\n#define RAS_VAR_  worker,\n\n#else /* FT_STATIC_RASTER */\n\n#define RAS_ARG   /* empty */\n#define RAS_ARG_  /* empty */\n#define RAS_VAR   /* empty */\n#define RAS_VAR_  /* empty */\n\n#endif /* FT_STATIC_RASTER */\n\n\n  /* must be at least 6 bits! */\n#define PIXEL_BITS  8\n\n#undef FLOOR\n#undef CEILING\n#undef TRUNC\n#undef SCALED\n\n#define ONE_PIXEL       ( 1L << PIXEL_BITS )\n#define PIXEL_MASK      ( -1L << PIXEL_BITS )\n#define TRUNC( x )      ( (TCoord)( (x) >> PIXEL_BITS ) )\n#define SUBPIXELS( x )  ( (TPos)(x) << PIXEL_BITS )\n#define FLOOR( x )      ( (x) & -ONE_PIXEL )\n#define CEILING( x )    ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )\n#define ROUND( x )      ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL )\n\n#if PIXEL_BITS >= 6\n#define UPSCALE( x )    ( (x) << ( PIXEL_BITS - 6 ) )\n#define DOWNSCALE( x )  ( (x) >> ( PIXEL_BITS - 6 ) )\n#else\n#define UPSCALE( x )    ( (x) >> ( 6 - PIXEL_BITS ) )\n#define DOWNSCALE( x )  ( (x) << ( 6 - PIXEL_BITS ) )\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*   TYPE DEFINITIONS                                                    */\n  /*                                                                       */\n\n  /* don't change the following types to FT_Int or FT_Pos, since we might */\n  /* need to define them to \"float\" or \"double\" when experimenting with   */\n  /* new algorithms                                                       */\n\n  typedef long  TCoord;   /* integer scanline/pixel coordinate */\n  typedef long  TPos;     /* sub-pixel coordinate              */\n\n  /* determine the type used to store cell areas.  This normally takes at */\n  /* least PIXEL_BITS*2 + 1 bits.  On 16-bit systems, we need to use      */\n  /* `long' instead of `int', otherwise bad things happen                 */\n\n#if PIXEL_BITS <= 7\n\n  typedef int  TArea;\n\n#else /* PIXEL_BITS >= 8 */\n\n  /* approximately determine the size of integers using an ANSI-C header */\n#if FT_UINT_MAX == 0xFFFFU\n  typedef long  TArea;\n#else\n  typedef int   TArea;\n#endif\n\n#endif /* PIXEL_BITS >= 8 */\n\n\n  /* maximum number of gray spans in a call to the span callback */\n#define FT_MAX_GRAY_SPANS  32\n\n\n  typedef struct TCell_*  PCell;\n\n  typedef struct  TCell_\n  {\n    TPos    x;     /* same with gray_TWorker.ex    */\n    TCoord  cover; /* same with gray_TWorker.cover */\n    TArea   area;\n    PCell   next;\n\n  } TCell;\n\n\n  typedef struct  gray_TWorker_\n  {\n    TCoord  ex, ey;\n    TPos    min_ex, max_ex;\n    TPos    min_ey, max_ey;\n    TPos    count_ex, count_ey;\n\n    TArea   area;\n    TCoord  cover;\n    int     invalid;\n\n    PCell       cells;\n    FT_PtrDist  max_cells;\n    FT_PtrDist  num_cells;\n\n    TCoord  cx, cy;\n    TPos    x,  y;\n\n    TPos    last_ey;\n\n    FT_Vector   bez_stack[32 * 3 + 1];\n    int         lev_stack[32];\n\n    FT_Outline  outline;\n    FT_Bitmap   target;\n    FT_BBox     clip_box;\n\n    FT_Span     gray_spans[FT_MAX_GRAY_SPANS];\n    int         num_gray_spans;\n\n    FT_Raster_Span_Func  render_span;\n    void*                render_span_data;\n    int                  span_y;\n\n    int  band_size;\n    int  band_shoot;\n\n    ft_jmp_buf  jump_buffer;\n\n    void*       buffer;\n    long        buffer_size;\n\n    PCell*     ycells;\n    TPos       ycount;\n\n  } gray_TWorker, *gray_PWorker;\n\n\n#ifndef FT_STATIC_RASTER\n#define ras  (*worker)\n#else\n  static gray_TWorker  ras;\n#endif\n\n\n  typedef struct gray_TRaster_\n  {\n    void*         buffer;\n    long          buffer_size;\n    int           band_size;\n    void*         memory;\n    gray_PWorker  worker;\n\n  } gray_TRaster, *gray_PRaster;\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Initialize the cells table.                                           */\n  /*                                                                       */\n  static void\n  gray_init_cells( RAS_ARG_ void*  buffer,\n                   long            byte_size )\n  {\n    ras.buffer      = buffer;\n    ras.buffer_size = byte_size;\n\n    ras.ycells      = (PCell*) buffer;\n    ras.cells       = NULL;\n    ras.max_cells   = 0;\n    ras.num_cells   = 0;\n    ras.area        = 0;\n    ras.cover       = 0;\n    ras.invalid     = 1;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compute the outline bounding box.                                     */\n  /*                                                                       */\n  static void\n  gray_compute_cbox( RAS_ARG )\n  {\n    FT_Outline*  outline = &ras.outline;\n    FT_Vector*   vec     = outline->points;\n    FT_Vector*   limit   = vec + outline->n_points;\n\n\n    if ( outline->n_points <= 0 )\n    {\n      ras.min_ex = ras.max_ex = 0;\n      ras.min_ey = ras.max_ey = 0;\n      return;\n    }\n\n    ras.min_ex = ras.max_ex = vec->x;\n    ras.min_ey = ras.max_ey = vec->y;\n\n    vec++;\n\n    for ( ; vec < limit; vec++ )\n    {\n      TPos  x = vec->x;\n      TPos  y = vec->y;\n\n\n      if ( x < ras.min_ex ) ras.min_ex = x;\n      if ( x > ras.max_ex ) ras.max_ex = x;\n      if ( y < ras.min_ey ) ras.min_ey = y;\n      if ( y > ras.max_ey ) ras.max_ey = y;\n    }\n\n    /* truncate the bounding box to integer pixels */\n    ras.min_ex = ras.min_ex >> 6;\n    ras.min_ey = ras.min_ey >> 6;\n    ras.max_ex = ( ras.max_ex + 63 ) >> 6;\n    ras.max_ey = ( ras.max_ey + 63 ) >> 6;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Record the current cell in the table.                                 */\n  /*                                                                       */\n  static PCell\n  gray_find_cell( RAS_ARG )\n  {\n    PCell  *pcell, cell;\n    TPos    x = ras.ex;\n\n\n    if ( x > ras.count_ex )\n      x = ras.count_ex;\n\n    pcell = &ras.ycells[ras.ey];\n    for (;;)\n    {\n      cell = *pcell;\n      if ( cell == NULL || cell->x > x )\n        break;\n\n      if ( cell->x == x )\n        goto Exit;\n\n      pcell = &cell->next;\n    }\n\n    if ( ras.num_cells >= ras.max_cells )\n      ft_longjmp( ras.jump_buffer, 1 );\n\n    cell        = ras.cells + ras.num_cells++;\n    cell->x     = x;\n    cell->area  = 0;\n    cell->cover = 0;\n\n    cell->next  = *pcell;\n    *pcell      = cell;\n\n  Exit:\n    return cell;\n  }\n\n\n  static void\n  gray_record_cell( RAS_ARG )\n  {\n    if ( !ras.invalid && ( ras.area | ras.cover ) )\n    {\n      PCell  cell = gray_find_cell( RAS_VAR );\n\n\n      cell->area  += ras.area;\n      cell->cover += ras.cover;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Set the current cell to a new position.                               */\n  /*                                                                       */\n  static void\n  gray_set_cell( RAS_ARG_ TCoord  ex,\n                          TCoord  ey )\n  {\n    /* Move the cell pointer to a new position.  We set the `invalid'      */\n    /* flag to indicate that the cell isn't part of those we're interested */\n    /* in during the render phase.  This means that:                       */\n    /*                                                                     */\n    /* . the new vertical position must be within min_ey..max_ey-1.        */\n    /* . the new horizontal position must be strictly less than max_ex     */\n    /*                                                                     */\n    /* Note that if a cell is to the left of the clipping region, it is    */\n    /* actually set to the (min_ex-1) horizontal position.                 */\n\n    /* All cells that are on the left of the clipping region go to the */\n    /* min_ex - 1 horizontal position.                                 */\n    ey -= ras.min_ey;\n\n    if ( ex > ras.max_ex )\n      ex = ras.max_ex;\n\n    ex -= ras.min_ex;\n    if ( ex < 0 )\n      ex = -1;\n\n    /* are we moving to a different cell ? */\n    if ( ex != ras.ex || ey != ras.ey )\n    {\n      /* record the current one if it is valid */\n      if ( !ras.invalid )\n        gray_record_cell( RAS_VAR );\n\n      ras.area  = 0;\n      ras.cover = 0;\n    }\n\n    ras.ex      = ex;\n    ras.ey      = ey;\n    ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey ||\n                              ex >= ras.count_ex           );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Start a new contour at a given cell.                                  */\n  /*                                                                       */\n  static void\n  gray_start_cell( RAS_ARG_ TCoord  ex,\n                            TCoord  ey )\n  {\n    if ( ex > ras.max_ex )\n      ex = (TCoord)( ras.max_ex );\n\n    if ( ex < ras.min_ex )\n      ex = (TCoord)( ras.min_ex - 1 );\n\n    ras.area    = 0;\n    ras.cover   = 0;\n    ras.ex      = ex - ras.min_ex;\n    ras.ey      = ey - ras.min_ey;\n    ras.last_ey = SUBPIXELS( ey );\n    ras.invalid = 0;\n\n    gray_set_cell( RAS_VAR_ ex, ey );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Render a scanline as one or more cells.                               */\n  /*                                                                       */\n  static void\n  gray_render_scanline( RAS_ARG_ TCoord  ey,\n                                 TPos    x1,\n                                 TCoord  y1,\n                                 TPos    x2,\n                                 TCoord  y2 )\n  {\n    TCoord  ex1, ex2, fx1, fx2, delta, mod, lift, rem;\n    long    p, first, dx;\n    int     incr;\n\n\n    dx = x2 - x1;\n\n    ex1 = TRUNC( x1 );\n    ex2 = TRUNC( x2 );\n    fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) );\n    fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) );\n\n    /* trivial case.  Happens often */\n    if ( y1 == y2 )\n    {\n      gray_set_cell( RAS_VAR_ ex2, ey );\n      return;\n    }\n\n    /* everything is located in a single cell.  That is easy! */\n    /*                                                        */\n    if ( ex1 == ex2 )\n    {\n      delta      = y2 - y1;\n      ras.area  += (TArea)(( fx1 + fx2 ) * delta);\n      ras.cover += delta;\n      return;\n    }\n\n    /* ok, we'll have to render a run of adjacent cells on the same */\n    /* scanline...                                                  */\n    /*                                                              */\n    p     = ( ONE_PIXEL - fx1 ) * ( y2 - y1 );\n    first = ONE_PIXEL;\n    incr  = 1;\n\n    if ( dx < 0 )\n    {\n      p     = fx1 * ( y2 - y1 );\n      first = 0;\n      incr  = -1;\n      dx    = -dx;\n    }\n\n    delta = (TCoord)( p / dx );\n    mod   = (TCoord)( p % dx );\n    if ( mod < 0 )\n    {\n      delta--;\n      mod += (TCoord)dx;\n    }\n\n    ras.area  += (TArea)(( fx1 + first ) * delta);\n    ras.cover += delta;\n\n    ex1 += incr;\n    gray_set_cell( RAS_VAR_ ex1, ey );\n    y1  += delta;\n\n    if ( ex1 != ex2 )\n    {\n      p    = ONE_PIXEL * ( y2 - y1 + delta );\n      lift = (TCoord)( p / dx );\n      rem  = (TCoord)( p % dx );\n      if ( rem < 0 )\n      {\n        lift--;\n        rem += (TCoord)dx;\n      }\n\n      mod -= (int)dx;\n\n      while ( ex1 != ex2 )\n      {\n        delta = lift;\n        mod  += rem;\n        if ( mod >= 0 )\n        {\n          mod -= (TCoord)dx;\n          delta++;\n        }\n\n        ras.area  += (TArea)(ONE_PIXEL * delta);\n        ras.cover += delta;\n        y1        += delta;\n        ex1       += incr;\n        gray_set_cell( RAS_VAR_ ex1, ey );\n      }\n    }\n\n    delta      = y2 - y1;\n    ras.area  += (TArea)(( fx2 + ONE_PIXEL - first ) * delta);\n    ras.cover += delta;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Render a given line as a series of scanlines.                         */\n  /*                                                                       */\n  static void\n  gray_render_line( RAS_ARG_ TPos  to_x,\n                             TPos  to_y )\n  {\n    TCoord  ey1, ey2, fy1, fy2, mod;\n    TPos    dx, dy, x, x2;\n    long    p, first;\n    int     delta, rem, lift, incr;\n\n\n    ey1 = TRUNC( ras.last_ey );\n    ey2 = TRUNC( to_y );     /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */\n    fy1 = (TCoord)( ras.y - ras.last_ey );\n    fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );\n\n    dx = to_x - ras.x;\n    dy = to_y - ras.y;\n\n    /* XXX: we should do something about the trivial case where dx == 0, */\n    /*      as it happens very often!                                    */\n\n    /* perform vertical clipping */\n    {\n      TCoord  min, max;\n\n\n      min = ey1;\n      max = ey2;\n      if ( ey1 > ey2 )\n      {\n        min = ey2;\n        max = ey1;\n      }\n      if ( min >= ras.max_ey || max < ras.min_ey )\n        goto End;\n    }\n\n    /* everything is on a single scanline */\n    if ( ey1 == ey2 )\n    {\n      gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 );\n      goto End;\n    }\n\n    /* vertical line - avoid calling gray_render_scanline */\n    incr = 1;\n\n    if ( dx == 0 )\n    {\n      TCoord  ex     = TRUNC( ras.x );\n      TCoord  two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 );\n      TArea   area;\n\n\n      first = ONE_PIXEL;\n      if ( dy < 0 )\n      {\n        first = 0;\n        incr  = -1;\n      }\n\n      delta      = (int)( first - fy1 );\n      ras.area  += (TArea)two_fx * delta;\n      ras.cover += delta;\n      ey1       += incr;\n\n      gray_set_cell( RAS_VAR_ ex, ey1 );\n\n      delta = (int)( first + first - ONE_PIXEL );\n      area  = (TArea)two_fx * delta;\n      while ( ey1 != ey2 )\n      {\n        ras.area  += area;\n        ras.cover += delta;\n        ey1       += incr;\n\n        gray_set_cell( RAS_VAR_ ex, ey1 );\n      }\n\n      delta      = (int)( fy2 - ONE_PIXEL + first );\n      ras.area  += (TArea)two_fx * delta;\n      ras.cover += delta;\n\n      goto End;\n    }\n\n    /* ok, we have to render several scanlines */\n    p     = ( ONE_PIXEL - fy1 ) * dx;\n    first = ONE_PIXEL;\n    incr  = 1;\n\n    if ( dy < 0 )\n    {\n      p     = fy1 * dx;\n      first = 0;\n      incr  = -1;\n      dy    = -dy;\n    }\n\n    delta = (int)( p / dy );\n    mod   = (int)( p % dy );\n    if ( mod < 0 )\n    {\n      delta--;\n      mod += (TCoord)dy;\n    }\n\n    x = ras.x + delta;\n    gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );\n\n    ey1 += incr;\n    gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );\n\n    if ( ey1 != ey2 )\n    {\n      p     = ONE_PIXEL * dx;\n      lift  = (int)( p / dy );\n      rem   = (int)( p % dy );\n      if ( rem < 0 )\n      {\n        lift--;\n        rem += (int)dy;\n      }\n      mod -= (int)dy;\n\n      while ( ey1 != ey2 )\n      {\n        delta = lift;\n        mod  += rem;\n        if ( mod >= 0 )\n        {\n          mod -= (int)dy;\n          delta++;\n        }\n\n        x2 = x + delta;\n        gray_render_scanline( RAS_VAR_ ey1, x,\n                                       (TCoord)( ONE_PIXEL - first ), x2,\n                                       (TCoord)first );\n        x = x2;\n\n        ey1 += incr;\n        gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );\n      }\n    }\n\n    gray_render_scanline( RAS_VAR_ ey1, x,\n                                   (TCoord)( ONE_PIXEL - first ), to_x,\n                                   fy2 );\n\n  End:\n    ras.x       = to_x;\n    ras.y       = to_y;\n    ras.last_ey = SUBPIXELS( ey2 );\n  }\n\n\n  static void\n  gray_split_conic( FT_Vector*  base )\n  {\n    TPos  a, b;\n\n\n    base[4].x = base[2].x;\n    b = base[1].x;\n    a = base[3].x = ( base[2].x + b ) / 2;\n    b = base[1].x = ( base[0].x + b ) / 2;\n    base[2].x = ( a + b ) / 2;\n\n    base[4].y = base[2].y;\n    b = base[1].y;\n    a = base[3].y = ( base[2].y + b ) / 2;\n    b = base[1].y = ( base[0].y + b ) / 2;\n    base[2].y = ( a + b ) / 2;\n  }\n\n\n  static void\n  gray_render_conic( RAS_ARG_ const FT_Vector*  control,\n                              const FT_Vector*  to )\n  {\n    TPos        dx, dy;\n    TPos        min, max, y;\n    int         top, level;\n    int*        levels;\n    FT_Vector*  arc;\n\n\n    levels = ras.lev_stack;\n\n    arc      = ras.bez_stack;\n    arc[0].x = UPSCALE( to->x );\n    arc[0].y = UPSCALE( to->y );\n    arc[1].x = UPSCALE( control->x );\n    arc[1].y = UPSCALE( control->y );\n    arc[2].x = ras.x;\n    arc[2].y = ras.y;\n    top      = 0;\n\n    dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x );\n    dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y );\n    if ( dx < dy )\n      dx = dy;\n\n    if ( dx < ONE_PIXEL / 4 )\n      goto Draw;\n\n    /* short-cut the arc that crosses the current band */\n    min = max = arc[0].y;\n\n    y = arc[1].y;\n    if ( y < min ) min = y;\n    if ( y > max ) max = y;\n\n    y = arc[2].y;\n    if ( y < min ) min = y;\n    if ( y > max ) max = y;\n\n    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )\n      goto Draw;\n\n    level = 0;\n    do\n    {\n      dx >>= 2;\n      level++;\n    } while ( dx > ONE_PIXEL / 4 );\n\n    levels[0] = level;\n\n    do\n    {\n      level = levels[top];\n      if ( level > 0 )\n      {\n        gray_split_conic( arc );\n        arc += 2;\n        top++;\n        levels[top] = levels[top - 1] = level - 1;\n        continue;\n      }\n\n    Draw:\n      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );\n      top--;\n      arc -= 2;\n\n    } while ( top >= 0 );\n  }\n\n\n  static void\n  gray_split_cubic( FT_Vector*  base )\n  {\n    TPos  a, b, c, d;\n\n\n    base[6].x = base[3].x;\n    c = base[1].x;\n    d = base[2].x;\n    base[1].x = a = ( base[0].x + c ) / 2;\n    base[5].x = b = ( base[3].x + d ) / 2;\n    c = ( c + d ) / 2;\n    base[2].x = a = ( a + c ) / 2;\n    base[4].x = b = ( b + c ) / 2;\n    base[3].x = ( a + b ) / 2;\n\n    base[6].y = base[3].y;\n    c = base[1].y;\n    d = base[2].y;\n    base[1].y = a = ( base[0].y + c ) / 2;\n    base[5].y = b = ( base[3].y + d ) / 2;\n    c = ( c + d ) / 2;\n    base[2].y = a = ( a + c ) / 2;\n    base[4].y = b = ( b + c ) / 2;\n    base[3].y = ( a + b ) / 2;\n  }\n\n\n  static void\n  gray_render_cubic( RAS_ARG_ const FT_Vector*  control1,\n                              const FT_Vector*  control2,\n                              const FT_Vector*  to )\n  {\n    FT_Vector*  arc;\n    TPos        min, max, y;\n\n\n    arc      = ras.bez_stack;\n    arc[0].x = UPSCALE( to->x );\n    arc[0].y = UPSCALE( to->y );\n    arc[1].x = UPSCALE( control2->x );\n    arc[1].y = UPSCALE( control2->y );\n    arc[2].x = UPSCALE( control1->x );\n    arc[2].y = UPSCALE( control1->y );\n    arc[3].x = ras.x;\n    arc[3].y = ras.y;\n\n    /* Short-cut the arc that crosses the current band. */\n    min = max = arc[0].y;\n\n    y = arc[1].y;\n    if ( y < min )\n      min = y;\n    if ( y > max )\n      max = y;\n\n    y = arc[2].y;\n    if ( y < min )\n      min = y;\n    if ( y > max )\n      max = y;\n\n    y = arc[3].y;\n    if ( y < min )\n      min = y;\n    if ( y > max )\n      max = y;\n\n    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )\n      goto Draw;\n\n    for (;;)\n    {\n      /* Decide whether to split or draw. See `Rapid Termination          */\n      /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */\n      /* F. Hain, at                                                      */\n      /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */\n\n      {\n        TPos  dx, dy, dx_, dy_;\n        TPos  dx1, dy1, dx2, dy2;\n        TPos  L, s, s_limit;\n\n\n        /* dx and dy are x and y components of the P0-P3 chord vector. */\n        dx = arc[3].x - arc[0].x;\n        dy = arc[3].y - arc[0].y;\n\n        /* L is an (under)estimate of the Euclidean distance P0-P3.       */\n        /*                                                                */\n        /* If dx >= dy, then r = sqrt(dx^2 + dy^2) can be overestimated   */\n        /* with least maximum error by                                    */\n        /*                                                                */\n        /*   r_upperbound = dx + (sqrt(2) - 1) * dy  ,                    */\n        /*                                                                */\n        /* where sqrt(2) - 1 can be (over)estimated by 107/256, giving an */\n        /* error of no more than 8.4%.                                    */\n        /*                                                                */\n        /* Similarly, some elementary calculus shows that r can be        */\n        /* underestimated with least maximum error by                     */\n        /*                                                                */\n        /*   r_lowerbound = sqrt(2 + sqrt(2)) / 2 * dx                    */\n        /*                  + sqrt(2 - sqrt(2)) / 2 * dy  .               */\n        /*                                                                */\n        /* 236/256 and 97/256 are (under)estimates of the two algebraic   */\n        /* numbers, giving an error of no more than 8.1%.                 */\n\n        dx_ = FT_ABS( dx );\n        dy_ = FT_ABS( dy );\n\n        /* This is the same as                     */\n        /*                                         */\n        /*   L = ( 236 * FT_MAX( dx_, dy_ )        */\n        /*       + 97 * FT_MIN( dx_, dy_ ) ) >> 8; */\n        L = ( dx_ > dy_ ? 236 * dx_ +  97 * dy_\n                        :  97 * dx_ + 236 * dy_ ) >> 8;\n\n        /* Avoid possible arithmetic overflow below by splitting. */\n        if ( L > 32767 )\n          goto Split;\n\n        /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */\n        s_limit = L * (TPos)( ONE_PIXEL / 6 );\n\n        /* s is L * the perpendicular distance from P1 to the line P0-P3. */\n        dx1 = arc[1].x - arc[0].x;\n        dy1 = arc[1].y - arc[0].y;\n        s = FT_ABS( dy * dx1 - dx * dy1 );\n\n        if ( s > s_limit )\n          goto Split;\n\n        /* s is L * the perpendicular distance from P2 to the line P0-P3. */\n        dx2 = arc[2].x - arc[0].x;\n        dy2 = arc[2].y - arc[0].y;\n        s = FT_ABS( dy * dx2 - dx * dy2 );\n\n        if ( s > s_limit )\n          goto Split;\n\n        /* Split super curvy segments where the off points are so far\n           from the chord that the angles P0-P1-P3 or P0-P2-P3 become\n           acute as detected by appropriate dot products. */\n        if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 ||\n             dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 )\n          goto Split;\n\n        /* No reason to split. */\n        goto Draw;\n      }\n\n    Split:\n      gray_split_cubic( arc );\n      arc += 3;\n      continue;\n\n    Draw:\n      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );\n\n      if ( arc == ras.bez_stack )\n        return;\n\n      arc -= 3;\n    }\n  }\n\n\n  static int\n  gray_move_to( const FT_Vector*  to,\n                gray_PWorker      worker )\n  {\n    TPos  x, y;\n\n\n    /* record current cell, if any */\n    gray_record_cell( RAS_VAR );\n\n    /* start to a new position */\n    x = UPSCALE( to->x );\n    y = UPSCALE( to->y );\n\n    gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );\n\n    worker->x = x;\n    worker->y = y;\n    return 0;\n  }\n\n\n  static int\n  gray_line_to( const FT_Vector*  to,\n                gray_PWorker      worker )\n  {\n    gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) );\n    return 0;\n  }\n\n\n  static int\n  gray_conic_to( const FT_Vector*  control,\n                 const FT_Vector*  to,\n                 gray_PWorker      worker )\n  {\n    gray_render_conic( RAS_VAR_ control, to );\n    return 0;\n  }\n\n\n  static int\n  gray_cubic_to( const FT_Vector*  control1,\n                 const FT_Vector*  control2,\n                 const FT_Vector*  to,\n                 gray_PWorker      worker )\n  {\n    gray_render_cubic( RAS_VAR_ control1, control2, to );\n    return 0;\n  }\n\n\n  static void\n  gray_render_span( int             y,\n                    int             count,\n                    const FT_Span*  spans,\n                    gray_PWorker    worker )\n  {\n    unsigned char*  p;\n    FT_Bitmap*      map = &worker->target;\n\n\n    /* first of all, compute the scanline offset */\n    p = (unsigned char*)map->buffer - y * map->pitch;\n    if ( map->pitch >= 0 )\n      p += (unsigned)( ( map->rows - 1 ) * map->pitch );\n\n    for ( ; count > 0; count--, spans++ )\n    {\n      unsigned char  coverage = spans->coverage;\n\n\n      if ( coverage )\n      {\n        /* For small-spans it is faster to do it by ourselves than\n         * calling `memset'.  This is mainly due to the cost of the\n         * function call.\n         */\n        if ( spans->len >= 8 )\n          FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len );\n        else\n        {\n          unsigned char*  q = p + spans->x;\n\n\n          switch ( spans->len )\n          {\n          case 7: *q++ = (unsigned char)coverage;\n          case 6: *q++ = (unsigned char)coverage;\n          case 5: *q++ = (unsigned char)coverage;\n          case 4: *q++ = (unsigned char)coverage;\n          case 3: *q++ = (unsigned char)coverage;\n          case 2: *q++ = (unsigned char)coverage;\n          case 1: *q   = (unsigned char)coverage;\n          default:\n            ;\n          }\n        }\n      }\n    }\n  }\n\n\n  static void\n  gray_hline( RAS_ARG_ TCoord  x,\n                       TCoord  y,\n                       TPos    area,\n                       TCoord  acount )\n  {\n    FT_Span*  span;\n    int       count;\n    int       coverage;\n\n\n    /* compute the coverage line's coverage, depending on the    */\n    /* outline fill rule                                         */\n    /*                                                           */\n    /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */\n    /*                                                           */\n    coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) );\n                                                    /* use range 0..256 */\n    if ( coverage < 0 )\n      coverage = -coverage;\n\n    if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL )\n    {\n      coverage &= 511;\n\n      if ( coverage > 256 )\n        coverage = 512 - coverage;\n      else if ( coverage == 256 )\n        coverage = 255;\n    }\n    else\n    {\n      /* normal non-zero winding rule */\n      if ( coverage >= 256 )\n        coverage = 255;\n    }\n\n    y += (TCoord)ras.min_ey;\n    x += (TCoord)ras.min_ex;\n\n    /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */\n    if ( x >= 32767 )\n      x = 32767;\n\n    /* FT_Span.y is an integer, so limit our coordinates appropriately */\n    if ( y >= FT_INT_MAX )\n      y = FT_INT_MAX;\n\n    if ( coverage )\n    {\n      /* see whether we can add this span to the current list */\n      count = ras.num_gray_spans;\n      span  = ras.gray_spans + count - 1;\n      if ( count > 0                          &&\n           ras.span_y == y                    &&\n           (int)span->x + span->len == (int)x &&\n           span->coverage == coverage         )\n      {\n        span->len = (unsigned short)( span->len + acount );\n        return;\n      }\n\n      if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS )\n      {\n        if ( ras.render_span && count > 0 )\n          ras.render_span( ras.span_y, count, ras.gray_spans,\n                           ras.render_span_data );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n        if ( count > 0 )\n        {\n          int  n;\n\n\n          FT_TRACE7(( \"y = %3d \", ras.span_y ));\n          span = ras.gray_spans;\n          for ( n = 0; n < count; n++, span++ )\n            FT_TRACE7(( \"[%d..%d]:%02x \",\n                        span->x, span->x + span->len - 1, span->coverage ));\n          FT_TRACE7(( \"\\n\" ));\n        }\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n        ras.num_gray_spans = 0;\n        ras.span_y         = (int)y;\n\n        count = 0;\n        span  = ras.gray_spans;\n      }\n      else\n        span++;\n\n      /* add a gray span to the current list */\n      span->x        = (short)x;\n      span->len      = (unsigned short)acount;\n      span->coverage = (unsigned char)coverage;\n\n      ras.num_gray_spans++;\n    }\n  }\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n  /* to be called while in the debugger --                                */\n  /* this function causes a compiler warning since it is unused otherwise */\n  static void\n  gray_dump_cells( RAS_ARG )\n  {\n    int  yindex;\n\n\n    for ( yindex = 0; yindex < ras.ycount; yindex++ )\n    {\n      PCell  cell;\n\n\n      printf( \"%3d:\", yindex );\n\n      for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next )\n        printf( \" (%3ld, c:%4ld, a:%6d)\", cell->x, cell->cover, cell->area );\n      printf( \"\\n\" );\n    }\n  }\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n  static void\n  gray_sweep( RAS_ARG_ const FT_Bitmap*  target )\n  {\n    int  yindex;\n\n    FT_UNUSED( target );\n\n\n    if ( ras.num_cells == 0 )\n      return;\n\n    ras.num_gray_spans = 0;\n\n    FT_TRACE7(( \"gray_sweep: start\\n\" ));\n\n    for ( yindex = 0; yindex < ras.ycount; yindex++ )\n    {\n      PCell   cell  = ras.ycells[yindex];\n      TCoord  cover = 0;\n      TCoord  x     = 0;\n\n\n      for ( ; cell != NULL; cell = cell->next )\n      {\n        TPos  area;\n\n\n        if ( cell->x > x && cover != 0 )\n          gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),\n                      cell->x - x );\n\n        cover += cell->cover;\n        area   = cover * ( ONE_PIXEL * 2 ) - cell->area;\n\n        if ( area != 0 && cell->x >= 0 )\n          gray_hline( RAS_VAR_ cell->x, yindex, area, 1 );\n\n        x = cell->x + 1;\n      }\n\n      if ( cover != 0 )\n        gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),\n                    ras.count_ex - x );\n    }\n\n    if ( ras.render_span && ras.num_gray_spans > 0 )\n      ras.render_span( ras.span_y, ras.num_gray_spans,\n                       ras.gray_spans, ras.render_span_data );\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n    if ( ras.num_gray_spans > 0 )\n    {\n      FT_Span*  span;\n      int       n;\n\n\n      FT_TRACE7(( \"y = %3d \", ras.span_y ));\n      span = ras.gray_spans;\n      for ( n = 0; n < ras.num_gray_spans; n++, span++ )\n        FT_TRACE7(( \"[%d..%d]:%02x \",\n                    span->x, span->x + span->len - 1, span->coverage ));\n      FT_TRACE7(( \"\\n\" ));\n    }\n\n    FT_TRACE7(( \"gray_sweep: end\\n\" ));\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n  }\n\n\n#ifdef _STANDALONE_\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  The following function should only compile in stand-alone mode,      */\n  /*  i.e., when building this component without the rest of FreeType.     */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    FT_Outline_Decompose                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Walk over an outline's structure to decompose it into individual   */\n  /*    segments and Bézier arcs.  This function is also able to emit      */\n  /*    `move to' and `close to' operations to indicate the start and end  */\n  /*    of new contours in the outline.                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    outline        :: A pointer to the source target.                  */\n  /*                                                                       */\n  /*    func_interface :: A table of `emitters', i.e., function pointers   */\n  /*                      called during decomposition to indicate path     */\n  /*                      operations.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    user           :: A typeless pointer which is passed to each       */\n  /*                      emitter during the decomposition.  It can be     */\n  /*                      used to store the state during the               */\n  /*                      decomposition.                                   */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Error code.  0 means success.                                      */\n  /*                                                                       */\n  static int\n  FT_Outline_Decompose( const FT_Outline*        outline,\n                        const FT_Outline_Funcs*  func_interface,\n                        void*                    user )\n  {\n#undef SCALED\n#define SCALED( x )  ( ( (x) << shift ) - delta )\n\n    FT_Vector   v_last;\n    FT_Vector   v_control;\n    FT_Vector   v_start;\n\n    FT_Vector*  point;\n    FT_Vector*  limit;\n    char*       tags;\n\n    int         error;\n\n    int   n;         /* index of contour in outline     */\n    int   first;     /* index of first point in contour */\n    char  tag;       /* current point's state           */\n\n    int   shift;\n    TPos  delta;\n\n\n    if ( !outline || !func_interface )\n      return FT_THROW( Invalid_Argument );\n\n    shift = func_interface->shift;\n    delta = func_interface->delta;\n    first = 0;\n\n    for ( n = 0; n < outline->n_contours; n++ )\n    {\n      int  last;  /* index of last point in contour */\n\n\n      FT_TRACE5(( \"FT_Outline_Decompose: Outline %d\\n\", n ));\n\n      last  = outline->contours[n];\n      if ( last < 0 )\n        goto Invalid_Outline;\n      limit = outline->points + last;\n\n      v_start   = outline->points[first];\n      v_start.x = SCALED( v_start.x );\n      v_start.y = SCALED( v_start.y );\n\n      v_last   = outline->points[last];\n      v_last.x = SCALED( v_last.x );\n      v_last.y = SCALED( v_last.y );\n\n      v_control = v_start;\n\n      point = outline->points + first;\n      tags  = outline->tags   + first;\n      tag   = FT_CURVE_TAG( tags[0] );\n\n      /* A contour cannot start with a cubic control point! */\n      if ( tag == FT_CURVE_TAG_CUBIC )\n        goto Invalid_Outline;\n\n      /* check first point to determine origin */\n      if ( tag == FT_CURVE_TAG_CONIC )\n      {\n        /* first point is conic control.  Yes, this happens. */\n        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )\n        {\n          /* start at last point if it is on the curve */\n          v_start = v_last;\n          limit--;\n        }\n        else\n        {\n          /* if both first and last points are conic,         */\n          /* start at their middle and record its position    */\n          /* for closure                                      */\n          v_start.x = ( v_start.x + v_last.x ) / 2;\n          v_start.y = ( v_start.y + v_last.y ) / 2;\n\n          v_last = v_start;\n        }\n        point--;\n        tags--;\n      }\n\n      FT_TRACE5(( \"  move to (%.2f, %.2f)\\n\",\n                  v_start.x / 64.0, v_start.y / 64.0 ));\n      error = func_interface->move_to( &v_start, user );\n      if ( error )\n        goto Exit;\n\n      while ( point < limit )\n      {\n        point++;\n        tags++;\n\n        tag = FT_CURVE_TAG( tags[0] );\n        switch ( tag )\n        {\n        case FT_CURVE_TAG_ON:  /* emit a single line_to */\n          {\n            FT_Vector  vec;\n\n\n            vec.x = SCALED( point->x );\n            vec.y = SCALED( point->y );\n\n            FT_TRACE5(( \"  line to (%.2f, %.2f)\\n\",\n                        vec.x / 64.0, vec.y / 64.0 ));\n            error = func_interface->line_to( &vec, user );\n            if ( error )\n              goto Exit;\n            continue;\n          }\n\n        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */\n          v_control.x = SCALED( point->x );\n          v_control.y = SCALED( point->y );\n\n        Do_Conic:\n          if ( point < limit )\n          {\n            FT_Vector  vec;\n            FT_Vector  v_middle;\n\n\n            point++;\n            tags++;\n            tag = FT_CURVE_TAG( tags[0] );\n\n            vec.x = SCALED( point->x );\n            vec.y = SCALED( point->y );\n\n            if ( tag == FT_CURVE_TAG_ON )\n            {\n              FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                          \" with control (%.2f, %.2f)\\n\",\n                          vec.x / 64.0, vec.y / 64.0,\n                          v_control.x / 64.0, v_control.y / 64.0 ));\n              error = func_interface->conic_to( &v_control, &vec, user );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            if ( tag != FT_CURVE_TAG_CONIC )\n              goto Invalid_Outline;\n\n            v_middle.x = ( v_control.x + vec.x ) / 2;\n            v_middle.y = ( v_control.y + vec.y ) / 2;\n\n            FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                        \" with control (%.2f, %.2f)\\n\",\n                        v_middle.x / 64.0, v_middle.y / 64.0,\n                        v_control.x / 64.0, v_control.y / 64.0 ));\n            error = func_interface->conic_to( &v_control, &v_middle, user );\n            if ( error )\n              goto Exit;\n\n            v_control = vec;\n            goto Do_Conic;\n          }\n\n          FT_TRACE5(( \"  conic to (%.2f, %.2f)\"\n                      \" with control (%.2f, %.2f)\\n\",\n                      v_start.x / 64.0, v_start.y / 64.0,\n                      v_control.x / 64.0, v_control.y / 64.0 ));\n          error = func_interface->conic_to( &v_control, &v_start, user );\n          goto Close;\n\n        default:  /* FT_CURVE_TAG_CUBIC */\n          {\n            FT_Vector  vec1, vec2;\n\n\n            if ( point + 1 > limit                             ||\n                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )\n              goto Invalid_Outline;\n\n            point += 2;\n            tags  += 2;\n\n            vec1.x = SCALED( point[-2].x );\n            vec1.y = SCALED( point[-2].y );\n\n            vec2.x = SCALED( point[-1].x );\n            vec2.y = SCALED( point[-1].y );\n\n            if ( point <= limit )\n            {\n              FT_Vector  vec;\n\n\n              vec.x = SCALED( point->x );\n              vec.y = SCALED( point->y );\n\n              FT_TRACE5(( \"  cubic to (%.2f, %.2f)\"\n                          \" with controls (%.2f, %.2f) and (%.2f, %.2f)\\n\",\n                          vec.x / 64.0, vec.y / 64.0,\n                          vec1.x / 64.0, vec1.y / 64.0,\n                          vec2.x / 64.0, vec2.y / 64.0 ));\n              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );\n              if ( error )\n                goto Exit;\n              continue;\n            }\n\n            FT_TRACE5(( \"  cubic to (%.2f, %.2f)\"\n                        \" with controls (%.2f, %.2f) and (%.2f, %.2f)\\n\",\n                        v_start.x / 64.0, v_start.y / 64.0,\n                        vec1.x / 64.0, vec1.y / 64.0,\n                        vec2.x / 64.0, vec2.y / 64.0 ));\n            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );\n            goto Close;\n          }\n        }\n      }\n\n      /* close the contour with a line segment */\n      FT_TRACE5(( \"  line to (%.2f, %.2f)\\n\",\n                  v_start.x / 64.0, v_start.y / 64.0 ));\n      error = func_interface->line_to( &v_start, user );\n\n   Close:\n      if ( error )\n        goto Exit;\n\n      first = last + 1;\n    }\n\n    FT_TRACE5(( \"FT_Outline_Decompose: Done\\n\", n ));\n    return 0;\n\n  Exit:\n    FT_TRACE5(( \"FT_Outline_Decompose: Error %d\\n\", error ));\n    return error;\n\n  Invalid_Outline:\n    return FT_THROW( Invalid_Outline );\n  }\n\n#endif /* _STANDALONE_ */\n\n\n  typedef struct  gray_TBand_\n  {\n    TPos  min, max;\n\n  } gray_TBand;\n\n    FT_DEFINE_OUTLINE_FUNCS(func_interface,\n      (FT_Outline_MoveTo_Func) gray_move_to,\n      (FT_Outline_LineTo_Func) gray_line_to,\n      (FT_Outline_ConicTo_Func)gray_conic_to,\n      (FT_Outline_CubicTo_Func)gray_cubic_to,\n      0,\n      0\n    )\n\n  static int\n  gray_convert_glyph_inner( RAS_ARG )\n  {\n\n    volatile int  error = 0;\n\n#ifdef FT_CONFIG_OPTION_PIC\n      FT_Outline_Funcs func_interface;\n      Init_Class_func_interface(&func_interface);\n#endif\n\n    if ( ft_setjmp( ras.jump_buffer ) == 0 )\n    {\n      error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );\n      gray_record_cell( RAS_VAR );\n    }\n    else\n      error = FT_THROW( Memory_Overflow );\n\n    return error;\n  }\n\n\n  static int\n  gray_convert_glyph( RAS_ARG )\n  {\n    gray_TBand            bands[40];\n    gray_TBand* volatile  band;\n    int volatile          n, num_bands;\n    TPos volatile         min, max, max_y;\n    FT_BBox*              clip;\n\n\n    /* Set up state in the raster object */\n    gray_compute_cbox( RAS_VAR );\n\n    /* clip to target bitmap, exit if nothing to do */\n    clip = &ras.clip_box;\n\n    if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax ||\n         ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax )\n      return 0;\n\n    if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin;\n    if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin;\n\n    if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax;\n    if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax;\n\n    ras.count_ex = ras.max_ex - ras.min_ex;\n    ras.count_ey = ras.max_ey - ras.min_ey;\n\n    /* set up vertical bands */\n    num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size );\n    if ( num_bands == 0 )\n      num_bands = 1;\n    if ( num_bands >= 39 )\n      num_bands = 39;\n\n    ras.band_shoot = 0;\n\n    min   = ras.min_ey;\n    max_y = ras.max_ey;\n\n    for ( n = 0; n < num_bands; n++, min = max )\n    {\n      max = min + ras.band_size;\n      if ( n == num_bands - 1 || max > max_y )\n        max = max_y;\n\n      bands[0].min = min;\n      bands[0].max = max;\n      band         = bands;\n\n      while ( band >= bands )\n      {\n        TPos  bottom, top, middle;\n        int   error;\n\n        {\n          PCell  cells_max;\n          int    yindex;\n          long   cell_start, cell_end, cell_mod;\n\n\n          ras.ycells = (PCell*)ras.buffer;\n          ras.ycount = band->max - band->min;\n\n          cell_start = sizeof ( PCell ) * ras.ycount;\n          cell_mod   = cell_start % sizeof ( TCell );\n          if ( cell_mod > 0 )\n            cell_start += sizeof ( TCell ) - cell_mod;\n\n          cell_end  = ras.buffer_size;\n          cell_end -= cell_end % sizeof ( TCell );\n\n          cells_max = (PCell)( (char*)ras.buffer + cell_end );\n          ras.cells = (PCell)( (char*)ras.buffer + cell_start );\n          if ( ras.cells >= cells_max )\n            goto ReduceBands;\n\n          ras.max_cells = cells_max - ras.cells;\n          if ( ras.max_cells < 2 )\n            goto ReduceBands;\n\n          for ( yindex = 0; yindex < ras.ycount; yindex++ )\n            ras.ycells[yindex] = NULL;\n        }\n\n        ras.num_cells = 0;\n        ras.invalid   = 1;\n        ras.min_ey    = band->min;\n        ras.max_ey    = band->max;\n        ras.count_ey  = band->max - band->min;\n\n        error = gray_convert_glyph_inner( RAS_VAR );\n\n        if ( !error )\n        {\n          gray_sweep( RAS_VAR_ &ras.target );\n          band--;\n          continue;\n        }\n        else if ( error != ErrRaster_Memory_Overflow )\n          return 1;\n\n      ReduceBands:\n        /* render pool overflow; we will reduce the render band by half */\n        bottom = band->min;\n        top    = band->max;\n        middle = bottom + ( ( top - bottom ) >> 1 );\n\n        /* This is too complex for a single scanline; there must */\n        /* be some problems.                                     */\n        if ( middle == bottom )\n        {\n#ifdef FT_DEBUG_LEVEL_TRACE\n          FT_TRACE7(( \"gray_convert_glyph: rotten glyph\\n\" ));\n#endif\n          return 1;\n        }\n\n        if ( bottom-top >= ras.band_size )\n          ras.band_shoot++;\n\n        band[1].min = bottom;\n        band[1].max = middle;\n        band[0].min = middle;\n        band[0].max = top;\n        band++;\n      }\n    }\n\n    if ( ras.band_shoot > 8 && ras.band_size > 16 )\n      ras.band_size = ras.band_size / 2;\n\n    return 0;\n  }\n\n\n  static int\n  gray_raster_render( gray_PRaster             raster,\n                      const FT_Raster_Params*  params )\n  {\n    const FT_Outline*  outline    = (const FT_Outline*)params->source;\n    const FT_Bitmap*   target_map = params->target;\n    gray_PWorker       worker;\n\n\n    if ( !raster || !raster->buffer || !raster->buffer_size )\n      return FT_THROW( Invalid_Argument );\n\n    if ( !outline )\n      return FT_THROW( Invalid_Outline );\n\n    /* return immediately if the outline is empty */\n    if ( outline->n_points == 0 || outline->n_contours <= 0 )\n      return 0;\n\n    if ( !outline->contours || !outline->points )\n      return FT_THROW( Invalid_Outline );\n\n    if ( outline->n_points !=\n           outline->contours[outline->n_contours - 1] + 1 )\n      return FT_THROW( Invalid_Outline );\n\n    worker = raster->worker;\n\n    /* if direct mode is not set, we must have a target bitmap */\n    if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )\n    {\n      if ( !target_map )\n        return FT_THROW( Invalid_Argument );\n\n      /* nothing to do */\n      if ( !target_map->width || !target_map->rows )\n        return 0;\n\n      if ( !target_map->buffer )\n        return FT_THROW( Invalid_Argument );\n    }\n\n    /* this version does not support monochrome rendering */\n    if ( !( params->flags & FT_RASTER_FLAG_AA ) )\n      return FT_THROW( Invalid_Mode );\n\n    /* compute clipping box */\n    if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )\n    {\n      /* compute clip box from target pixmap */\n      ras.clip_box.xMin = 0;\n      ras.clip_box.yMin = 0;\n      ras.clip_box.xMax = target_map->width;\n      ras.clip_box.yMax = target_map->rows;\n    }\n    else if ( params->flags & FT_RASTER_FLAG_CLIP )\n      ras.clip_box = params->clip_box;\n    else\n    {\n      ras.clip_box.xMin = -32768L;\n      ras.clip_box.yMin = -32768L;\n      ras.clip_box.xMax =  32767L;\n      ras.clip_box.yMax =  32767L;\n    }\n\n    gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size );\n\n    ras.outline        = *outline;\n    ras.num_cells      = 0;\n    ras.invalid        = 1;\n    ras.band_size      = raster->band_size;\n    ras.num_gray_spans = 0;\n\n    if ( params->flags & FT_RASTER_FLAG_DIRECT )\n    {\n      ras.render_span      = (FT_Raster_Span_Func)params->gray_spans;\n      ras.render_span_data = params->user;\n    }\n    else\n    {\n      ras.target           = *target_map;\n      ras.render_span      = (FT_Raster_Span_Func)gray_render_span;\n      ras.render_span_data = &ras;\n    }\n\n    return gray_convert_glyph( RAS_VAR );\n  }\n\n\n  /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/\n  /****                         a static object.                   *****/\n\n#ifdef _STANDALONE_\n\n  static int\n  gray_raster_new( void*       memory,\n                   FT_Raster*  araster )\n  {\n    static gray_TRaster  the_raster;\n\n    FT_UNUSED( memory );\n\n\n    *araster = (FT_Raster)&the_raster;\n    FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );\n\n    return 0;\n  }\n\n\n  static void\n  gray_raster_done( FT_Raster  raster )\n  {\n    /* nothing */\n    FT_UNUSED( raster );\n  }\n\n#else /* !_STANDALONE_ */\n\n  static int\n  gray_raster_new( FT_Memory   memory,\n                   FT_Raster*  araster )\n  {\n    FT_Error      error;\n    gray_PRaster  raster = NULL;\n\n\n    *araster = 0;\n    if ( !FT_ALLOC( raster, sizeof ( gray_TRaster ) ) )\n    {\n      raster->memory = memory;\n      *araster       = (FT_Raster)raster;\n    }\n\n    return error;\n  }\n\n\n  static void\n  gray_raster_done( FT_Raster  raster )\n  {\n    FT_Memory  memory = (FT_Memory)((gray_PRaster)raster)->memory;\n\n\n    FT_FREE( raster );\n  }\n\n#endif /* !_STANDALONE_ */\n\n\n  static void\n  gray_raster_reset( FT_Raster  raster,\n                     char*      pool_base,\n                     long       pool_size )\n  {\n    gray_PRaster  rast = (gray_PRaster)raster;\n\n\n    if ( raster )\n    {\n      if ( pool_base && pool_size >= (long)sizeof ( gray_TWorker ) + 2048 )\n      {\n        gray_PWorker  worker = (gray_PWorker)pool_base;\n\n\n        rast->worker      = worker;\n        rast->buffer      = pool_base +\n                              ( ( sizeof ( gray_TWorker ) +\n                                  sizeof ( TCell ) - 1 )  &\n                                ~( sizeof ( TCell ) - 1 ) );\n        rast->buffer_size = (long)( ( pool_base + pool_size ) -\n                                    (char*)rast->buffer ) &\n                                      ~( sizeof ( TCell ) - 1 );\n        rast->band_size   = (int)( rast->buffer_size /\n                                     ( sizeof ( TCell ) * 8 ) );\n      }\n      else\n      {\n        rast->buffer      = NULL;\n        rast->buffer_size = 0;\n        rast->worker      = NULL;\n      }\n    }\n  }\n\n\n  FT_DEFINE_RASTER_FUNCS(ft_grays_raster,\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Raster_New_Func)     gray_raster_new,\n    (FT_Raster_Reset_Func)   gray_raster_reset,\n    (FT_Raster_Set_Mode_Func)0,\n    (FT_Raster_Render_Func)  gray_raster_render,\n    (FT_Raster_Done_Func)    gray_raster_done\n  )\n\n\n/* END */\n\n\n/* Local Variables: */\n/* coding: utf-8    */\n/* End:             */\n"
  },
  {
    "path": "libs/freetype/src/smooth/ftgrays.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftgrays.h                                                              */\n/*                                                                         */\n/*    FreeType smooth renderer declaration                                 */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTGRAYS_H__\n#define __FTGRAYS_H__\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n\n#ifdef _STANDALONE_\n#include \"ftimage.h\"\n#else\n#include <ft2build.h>\n#include FT_CONFIG_CONFIG_H /* for FT_CONFIG_OPTION_PIC */\n#include FT_IMAGE_H\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* To make ftgrays.h independent from configuration files we check       */\n  /* whether FT_EXPORT_VAR has been defined already.                       */\n  /*                                                                       */\n  /* On some systems and compilers (Win32 mostly), an extra keyword is     */\n  /* necessary to compile the library as a DLL.                            */\n  /*                                                                       */\n#ifndef FT_EXPORT_VAR\n#define FT_EXPORT_VAR( x )  extern  x\n#endif\n\n  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_grays_raster;\n\n\n#ifdef __cplusplus\n  }\n#endif\n\n#endif /* __FTGRAYS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/smooth/ftsmerrs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsmerrs.h                                                             */\n/*                                                                         */\n/*    smooth renderer error codes (specification only).                    */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the smooth renderer error enumeration     */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __FTSMERRS_H__\n#define __FTSMERRS_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  Smooth_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Smooth\n\n#include FT_ERRORS_H\n\n#endif /* __FTSMERRS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/smooth/ftsmooth.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsmooth.c                                                             */\n/*                                                                         */\n/*    Anti-aliasing renderer interface (body).                             */\n/*                                                                         */\n/*  Copyright 2000-2006, 2009-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_OUTLINE_H\n#include \"ftsmooth.h\"\n#include \"ftgrays.h\"\n#include \"ftspic.h\"\n\n#include \"ftsmerrs.h\"\n\n\n  /* initialize renderer -- init its raster */\n  static FT_Error\n  ft_smooth_init( FT_Renderer  render )\n  {\n    FT_Library  library = FT_MODULE_LIBRARY( render );\n\n\n    render->clazz->raster_class->raster_reset( render->raster,\n                                               library->raster_pool,\n                                               library->raster_pool_size );\n\n    return 0;\n  }\n\n\n  /* sets render-specific mode */\n  static FT_Error\n  ft_smooth_set_mode( FT_Renderer  render,\n                      FT_ULong     mode_tag,\n                      FT_Pointer   data )\n  {\n    /* we simply pass it to the raster */\n    return render->clazz->raster_class->raster_set_mode( render->raster,\n                                                         mode_tag,\n                                                         data );\n  }\n\n  /* transform a given glyph image */\n  static FT_Error\n  ft_smooth_transform( FT_Renderer       render,\n                       FT_GlyphSlot      slot,\n                       const FT_Matrix*  matrix,\n                       const FT_Vector*  delta )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( slot->format != render->glyph_format )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( matrix )\n      FT_Outline_Transform( &slot->outline, matrix );\n\n    if ( delta )\n      FT_Outline_Translate( &slot->outline, delta->x, delta->y );\n\n  Exit:\n    return error;\n  }\n\n\n  /* return the glyph's control box */\n  static void\n  ft_smooth_get_cbox( FT_Renderer   render,\n                      FT_GlyphSlot  slot,\n                      FT_BBox*      cbox )\n  {\n    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );\n\n    if ( slot->format == render->glyph_format )\n      FT_Outline_Get_CBox( &slot->outline, cbox );\n  }\n\n\n  /* convert a slot's glyph image into a bitmap */\n  static FT_Error\n  ft_smooth_render_generic( FT_Renderer       render,\n                            FT_GlyphSlot      slot,\n                            FT_Render_Mode    mode,\n                            const FT_Vector*  origin,\n                            FT_Render_Mode    required_mode )\n  {\n    FT_Error     error;\n    FT_Outline*  outline = NULL;\n    FT_BBox      cbox;\n    FT_Pos       width, height, pitch;\n#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n    FT_Pos       height_org, width_org;\n#endif\n    FT_Bitmap*   bitmap;\n    FT_Memory    memory;\n    FT_Int       hmul = mode == FT_RENDER_MODE_LCD;\n    FT_Int       vmul = mode == FT_RENDER_MODE_LCD_V;\n    FT_Pos       x_shift, y_shift, x_left, y_top;\n\n    FT_Raster_Params  params;\n\n    FT_Bool  have_translated_origin = FALSE;\n    FT_Bool  have_outline_shifted   = FALSE;\n    FT_Bool  have_buffer            = FALSE;\n\n\n    /* check glyph image format */\n    if ( slot->format != render->glyph_format )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* check mode */\n    if ( mode != required_mode )\n    {\n      error = FT_THROW( Cannot_Render_Glyph );\n      goto Exit;\n    }\n\n    outline = &slot->outline;\n\n    /* translate the outline to the new origin if needed */\n    if ( origin )\n    {\n      FT_Outline_Translate( outline, origin->x, origin->y );\n      have_translated_origin = TRUE;\n    }\n\n    /* compute the control box, and grid fit it */\n    FT_Outline_Get_CBox( outline, &cbox );\n\n    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );\n    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );\n    cbox.xMax = FT_PIX_CEIL( cbox.xMax );\n    cbox.yMax = FT_PIX_CEIL( cbox.yMax );\n\n    if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin )\n    {\n      FT_ERROR(( \"ft_smooth_render_generic: glyph too large:\"\n                 \" xMin = %d, xMax = %d\\n\",\n                 cbox.xMin >> 6, cbox.xMax >> 6 ));\n      error = FT_THROW( Raster_Overflow );\n      goto Exit;\n    }\n    else\n      width = ( cbox.xMax - cbox.xMin ) >> 6;\n\n    if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin )\n    {\n      FT_ERROR(( \"ft_smooth_render_generic: glyph too large:\"\n                 \" yMin = %d, yMax = %d\\n\",\n                 cbox.yMin >> 6, cbox.yMax >> 6 ));\n      error = FT_THROW( Raster_Overflow );\n      goto Exit;\n    }\n    else\n      height = ( cbox.yMax - cbox.yMin ) >> 6;\n\n    bitmap = &slot->bitmap;\n    memory = render->root.memory;\n\n#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n    width_org  = width;\n    height_org = height;\n#endif\n\n    /* release old bitmap buffer */\n    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )\n    {\n      FT_FREE( bitmap->buffer );\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n\n    /* allocate new one */\n    pitch = width;\n    if ( hmul )\n    {\n      width = width * 3;\n      pitch = FT_PAD_CEIL( width, 4 );\n    }\n\n    if ( vmul )\n      height *= 3;\n\n    x_shift = (FT_Int) cbox.xMin;\n    y_shift = (FT_Int) cbox.yMin;\n    x_left  = (FT_Int)( cbox.xMin >> 6 );\n    y_top   = (FT_Int)( cbox.yMax >> 6 );\n\n#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n\n    if ( slot->library->lcd_filter_func )\n    {\n      FT_Int  extra = slot->library->lcd_extra;\n\n\n      if ( hmul )\n      {\n        x_shift -= 64 * ( extra >> 1 );\n        width   += 3 * extra;\n        pitch    = FT_PAD_CEIL( width, 4 );\n        x_left  -= extra >> 1;\n      }\n\n      if ( vmul )\n      {\n        y_shift -= 64 * ( extra >> 1 );\n        height  += 3 * extra;\n        y_top   += extra >> 1;\n      }\n    }\n\n#endif\n\n#if FT_UINT_MAX > 0xFFFFU\n\n    /* Required check is (pitch * height < FT_ULONG_MAX),        */\n    /* but we care realistic cases only.  Always pitch <= width. */\n    if ( width > 0x7FFF || height > 0x7FFF )\n    {\n      FT_ERROR(( \"ft_smooth_render_generic: glyph too large: %u x %u\\n\",\n                 width, height ));\n      error = FT_THROW( Raster_Overflow );\n      goto Exit;\n    }\n\n#endif\n\n    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;\n    bitmap->num_grays  = 256;\n    bitmap->width      = width;\n    bitmap->rows       = height;\n    bitmap->pitch      = pitch;\n\n    /* translate outline to render it into the bitmap */\n    FT_Outline_Translate( outline, -x_shift, -y_shift );\n    have_outline_shifted = TRUE;\n\n    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) )\n      goto Exit;\n    else\n      have_buffer = TRUE;\n\n    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;\n\n    /* set up parameters */\n    params.target = bitmap;\n    params.source = outline;\n    params.flags  = FT_RASTER_FLAG_AA;\n\n#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING\n\n    /* implode outline if needed */\n    {\n      FT_Vector*  points     = outline->points;\n      FT_Vector*  points_end = points + outline->n_points;\n      FT_Vector*  vec;\n\n\n      if ( hmul )\n        for ( vec = points; vec < points_end; vec++ )\n          vec->x *= 3;\n\n      if ( vmul )\n        for ( vec = points; vec < points_end; vec++ )\n          vec->y *= 3;\n    }\n\n    /* render outline into the bitmap */\n    error = render->raster_render( render->raster, &params );\n\n    /* deflate outline if needed */\n    {\n      FT_Vector*  points     = outline->points;\n      FT_Vector*  points_end = points + outline->n_points;\n      FT_Vector*  vec;\n\n\n      if ( hmul )\n        for ( vec = points; vec < points_end; vec++ )\n          vec->x /= 3;\n\n      if ( vmul )\n        for ( vec = points; vec < points_end; vec++ )\n          vec->y /= 3;\n    }\n\n    if ( error )\n      goto Exit;\n\n    if ( slot->library->lcd_filter_func )\n      slot->library->lcd_filter_func( bitmap, mode, slot->library );\n\n#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n    /* render outline into bitmap */\n    error = render->raster_render( render->raster, &params );\n    if ( error )\n      goto Exit;\n\n    /* expand it horizontally */\n    if ( hmul )\n    {\n      FT_Byte*  line = bitmap->buffer;\n      FT_UInt   hh;\n\n\n      for ( hh = height_org; hh > 0; hh--, line += pitch )\n      {\n        FT_UInt   xx;\n        FT_Byte*  end = line + width;\n\n\n        for ( xx = width_org; xx > 0; xx-- )\n        {\n          FT_UInt  pixel = line[xx-1];\n\n\n          end[-3] = (FT_Byte)pixel;\n          end[-2] = (FT_Byte)pixel;\n          end[-1] = (FT_Byte)pixel;\n          end    -= 3;\n        }\n      }\n    }\n\n    /* expand it vertically */\n    if ( vmul )\n    {\n      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;\n      FT_Byte*  write = bitmap->buffer;\n      FT_UInt   hh;\n\n\n      for ( hh = height_org; hh > 0; hh-- )\n      {\n        ft_memcpy( write, read, pitch );\n        write += pitch;\n\n        ft_memcpy( write, read, pitch );\n        write += pitch;\n\n        ft_memcpy( write, read, pitch );\n        write += pitch;\n        read  += pitch;\n      }\n    }\n\n#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n    /*\n     * XXX: on 16bit system, we return an error for huge bitmap\n     * to prevent an overflow.\n     */\n    if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX )\n    {\n      error = FT_THROW( Invalid_Pixel_Size );\n      goto Exit;\n    }\n\n    slot->format      = FT_GLYPH_FORMAT_BITMAP;\n    slot->bitmap_left = (FT_Int)x_left;\n    slot->bitmap_top  = (FT_Int)y_top;\n\n    /* everything is fine; don't deallocate buffer */\n    have_buffer = FALSE;\n\n    error = FT_Err_Ok;\n\n  Exit:\n    if ( have_outline_shifted )\n      FT_Outline_Translate( outline, x_shift, y_shift );\n    if ( have_translated_origin )\n      FT_Outline_Translate( outline, -origin->x, -origin->y );\n    if ( have_buffer )\n    {\n      FT_FREE( bitmap->buffer );\n      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;\n    }\n\n    return error;\n  }\n\n\n  /* convert a slot's glyph image into a bitmap */\n  static FT_Error\n  ft_smooth_render( FT_Renderer       render,\n                    FT_GlyphSlot      slot,\n                    FT_Render_Mode    mode,\n                    const FT_Vector*  origin )\n  {\n    if ( mode == FT_RENDER_MODE_LIGHT )\n      mode = FT_RENDER_MODE_NORMAL;\n\n    return ft_smooth_render_generic( render, slot, mode, origin,\n                                     FT_RENDER_MODE_NORMAL );\n  }\n\n\n  /* convert a slot's glyph image into a horizontal LCD bitmap */\n  static FT_Error\n  ft_smooth_render_lcd( FT_Renderer       render,\n                        FT_GlyphSlot      slot,\n                        FT_Render_Mode    mode,\n                        const FT_Vector*  origin )\n  {\n    FT_Error  error;\n\n    error = ft_smooth_render_generic( render, slot, mode, origin,\n                                      FT_RENDER_MODE_LCD );\n    if ( !error )\n      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;\n\n    return error;\n  }\n\n\n  /* convert a slot's glyph image into a vertical LCD bitmap */\n  static FT_Error\n  ft_smooth_render_lcd_v( FT_Renderer       render,\n                          FT_GlyphSlot      slot,\n                          FT_Render_Mode    mode,\n                          const FT_Vector*  origin )\n  {\n    FT_Error  error;\n\n    error = ft_smooth_render_generic( render, slot, mode, origin,\n                                      FT_RENDER_MODE_LCD_V );\n    if ( !error )\n      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;\n\n    return error;\n  }\n\n\n  FT_DEFINE_RENDERER( ft_smooth_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"smooth\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_smooth_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_smooth_render,\n    (FT_Renderer_TransformFunc)ft_smooth_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET\n  )\n\n\n  FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"smooth-lcd\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_smooth_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd,\n    (FT_Renderer_TransformFunc)ft_smooth_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET\n  )\n\n  FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class,\n\n      FT_MODULE_RENDERER,\n      sizeof ( FT_RendererRec ),\n\n      \"smooth-lcdv\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* module specific interface */\n\n      (FT_Module_Constructor)ft_smooth_init,\n      (FT_Module_Destructor) 0,\n      (FT_Module_Requester)  0\n    ,\n\n    FT_GLYPH_FORMAT_OUTLINE,\n\n    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd_v,\n    (FT_Renderer_TransformFunc)ft_smooth_transform,\n    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,\n    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,\n\n    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET\n  )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/smooth/ftsmooth.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftsmooth.h                                                             */\n/*                                                                         */\n/*    Anti-aliasing renderer interface (specification).                    */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSMOOTH_H__\n#define __FTSMOOTH_H__\n\n\n#include <ft2build.h>\n#include FT_RENDER_H\n\n\nFT_BEGIN_HEADER\n\n\n#ifndef FT_CONFIG_OPTION_NO_STD_RASTER\n  FT_DECLARE_RENDERER( ft_std_renderer_class )\n#endif\n\n#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER\n  FT_DECLARE_RENDERER( ft_smooth_renderer_class )\n\n  FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class )\n\n  FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class )\n#endif\n\n\n\nFT_END_HEADER\n\n#endif /* __FTSMOOTH_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/smooth/ftspic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftspic.c                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for smooth module.   */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"ftspic.h\"\n#include \"ftsmerrs.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from ftgrays.c */\n  void\n  FT_Init_Class_ft_grays_raster( FT_Raster_Funcs*  funcs );\n\n\n  void\n  ft_smooth_renderer_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->smooth )\n    {\n      SmoothPIC*  container = (SmoothPIC*)pic_container->smooth;\n\n\n      if ( --container->ref_count )\n        return;\n\n      FT_FREE( container );\n      pic_container->smooth = NULL;\n    }\n  }\n\n\n  FT_Error\n  ft_smooth_renderer_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    SmoothPIC*         container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* since this function also serve smooth_lcd and smooth_lcdv renderers,\n       it implements reference counting */\n    if ( pic_container->smooth )\n    {\n      ((SmoothPIC*)pic_container->smooth)->ref_count++;\n      return error;\n    }\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->smooth = container;\n\n    container->ref_count = 1;\n\n    /* initialize pointer table -                       */\n    /* this is how the module usually expects this data */\n    FT_Init_Class_ft_grays_raster( &container->ft_grays_raster );\n\n    return error;\n  }\n\n\n  /* re-route these init and free functions to the above functions */\n  FT_Error\n  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library )\n  {\n    return ft_smooth_renderer_class_pic_init( library );\n  }\n\n\n  void\n  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library )\n  {\n    ft_smooth_renderer_class_pic_free( library );\n  }\n\n\n  FT_Error\n  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library )\n  {\n    return ft_smooth_renderer_class_pic_init( library );\n  }\n\n\n  void\n  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library )\n  {\n    ft_smooth_renderer_class_pic_free( library );\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/smooth/ftspic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftspic.h                                                               */\n/*                                                                         */\n/*    The FreeType position independent code services for smooth module.   */\n/*                                                                         */\n/*  Copyright 2009 by                                                      */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __FTSPIC_H__\n#define __FTSPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#include FT_INTERNAL_PIC_H\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define FT_GRAYS_RASTER_GET  ft_grays_raster\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n  typedef struct  SmoothPIC_\n  {\n    int              ref_count;\n    FT_Raster_Funcs  ft_grays_raster;\n\n  } SmoothPIC;\n\n\n#define GET_PIC( lib ) \\\n          ( (SmoothPIC*)( (lib)->pic_container.smooth ) )\n#define FT_GRAYS_RASTER_GET  ( GET_PIC( library )->ft_grays_raster )\n\n\n  /* see ftspic.c for the implementation */\n  void\n  ft_smooth_renderer_class_pic_free( FT_Library  library );\n\n  void\n  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library );\n\n  void\n  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library );\n\n  FT_Error\n  ft_smooth_renderer_class_pic_init( FT_Library  library );\n\n  FT_Error\n  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library );\n\n  FT_Error\n  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __FTSPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/smooth/module.mk",
    "content": "#\n# FreeType 2 smooth renderer module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += SMOOTH_RENDERER\n\ndefine SMOOTH_RENDERER\n$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)smooth    $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE)\n$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcd_renderer_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)smooth    $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for LCDs$(ECHO_DRIVER_DONE)\n$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcdv_renderer_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)smooth    $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/smooth/rules.mk",
    "content": "#\n# FreeType 2 smooth renderer module build rules\n#\n\n\n# Copyright 1996-2000, 2001, 2003, 2011 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# smooth driver directory\n#\nSMOOTH_DIR := $(SRC_DIR)/smooth\n\n# compilation flags for the driver\n#\nSMOOTH_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SMOOTH_DIR))\n\n\n# smooth driver sources (i.e., C files)\n#\nSMOOTH_DRV_SRC := $(SMOOTH_DIR)/ftgrays.c  \\\n                  $(SMOOTH_DIR)/ftsmooth.c \\\n                  $(SMOOTH_DIR)/ftspic.c\n\n\n# smooth driver headers\n#\nSMOOTH_DRV_H := $(SMOOTH_DRV_SRC:%c=%h)  \\\n                $(SMOOTH_DIR)/ftsmerrs.h\n\n\n# smooth driver object(s)\n#\n#   SMOOTH_DRV_OBJ_M is used during `multi' builds.\n#   SMOOTH_DRV_OBJ_S is used during `single' builds.\n#\nSMOOTH_DRV_OBJ_M := $(SMOOTH_DRV_SRC:$(SMOOTH_DIR)/%.c=$(OBJ_DIR)/%.$O)\nSMOOTH_DRV_OBJ_S := $(OBJ_DIR)/smooth.$O\n\n# smooth driver source file for single build\n#\nSMOOTH_DRV_SRC_S := $(SMOOTH_DIR)/smooth.c\n\n\n# smooth driver - single object\n#\n$(SMOOTH_DRV_OBJ_S): $(SMOOTH_DRV_SRC_S) $(SMOOTH_DRV_SRC) \\\n                     $(FREETYPE_H) $(SMOOTH_DRV_H)\n\t$(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SMOOTH_DRV_SRC_S))\n\n\n# smooth driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(SMOOTH_DIR)/%.c $(FREETYPE_H) $(SMOOTH_DRV_H)\n\t$(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(SMOOTH_DRV_OBJ_S)\nDRV_OBJS_M += $(SMOOTH_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/smooth/smooth.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  smooth.c                                                               */\n/*                                                                         */\n/*    FreeType anti-aliasing rasterer module component (body only).        */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"ftspic.c\"\n#include \"ftgrays.c\"\n#include \"ftsmooth.c\"\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/tools/Jamfile",
    "content": "# Jamfile for src/tools\n#\nSubDir FT2_TOP src tools ;\n\nMain  apinames : apinames.c ;\n"
  },
  {
    "path": "libs/freetype/src/tools/apinames.c",
    "content": "/*\n * This little program is used to parse the FreeType headers and\n * find the declaration of all public APIs.  This is easy, because\n * they all look like the following:\n *\n *   FT_EXPORT( return_type )\n *   function_name( function arguments );\n *\n * You must pass the list of header files as arguments.  Wildcards are\n * accepted if you are using GCC for compilation (and probably by\n * other compilers too).\n *\n * Author: David Turner, 2005, 2006, 2008-2012\n *\n * This code is explicitly placed into the public domain.\n *\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n\n#define  PROGRAM_NAME     \"apinames\"\n#define  PROGRAM_VERSION  \"0.1\"\n\n#define  LINEBUFF_SIZE  1024\n\ntypedef enum  OutputFormat_\n{\n  OUTPUT_LIST = 0,      /* output the list of names, one per line             */\n  OUTPUT_WINDOWS_DEF,   /* output a Windows .DEF file for Visual C++ or Mingw */\n  OUTPUT_BORLAND_DEF,   /* output a Windows .DEF file for Borland C++         */\n  OUTPUT_WATCOM_LBC     /* output a Watcom Linker Command File                */\n\n} OutputFormat;\n\n\nstatic void\npanic( const char*  message )\n{\n  fprintf( stderr, \"PANIC: %s\\n\", message );\n  exit(2);\n}\n\n\ntypedef struct  NameRec_\n{\n  char*         name;\n  unsigned int  hash;\n\n} NameRec, *Name;\n\nstatic Name  the_names;\nstatic int   num_names;\nstatic int   max_names;\n\nstatic void\nnames_add( const char*  name,\n           const char*  end )\n{\n  unsigned int  h;\n  int           nn, len;\n  Name          nm;\n\n  if ( end <= name )\n    return;\n\n  /* compute hash value */\n  len = (int)(end - name);\n  h   = 0;\n  for ( nn = 0; nn < len; nn++ )\n    h = h*33 + name[nn];\n\n  /* check for an pre-existing name */\n  for ( nn = 0; nn < num_names; nn++ )\n  {\n    nm = the_names + nn;\n\n    if ( (int)nm->hash                 == h &&\n         memcmp( name, nm->name, len ) == 0 &&\n         nm->name[len]                 == 0 )\n      return;\n  }\n\n  /* add new name */\n  if ( num_names >= max_names )\n  {\n    max_names += (max_names >> 1) + 4;\n    the_names  = (NameRec*)realloc( the_names,\n                                    sizeof ( the_names[0] ) * max_names );\n    if ( the_names == NULL )\n      panic( \"not enough memory\" );\n  }\n  nm = &the_names[num_names++];\n\n  nm->hash = h;\n  nm->name = (char*)malloc( len+1 );\n  if ( nm->name == NULL )\n    panic( \"not enough memory\" );\n\n  memcpy( nm->name, name, len );\n  nm->name[len] = 0;\n}\n\n\nstatic int\nname_compare( const void*  name1,\n              const void*  name2 )\n{\n  Name  n1 = (Name)name1;\n  Name  n2 = (Name)name2;\n\n  return strcmp( n1->name, n2->name );\n}\n\nstatic void\nnames_sort( void )\n{\n  qsort( the_names, (size_t)num_names,\n         sizeof ( the_names[0] ), name_compare );\n}\n\n\nstatic void\nnames_dump( FILE*         out,\n            OutputFormat  format,\n            const char*   dll_name )\n{\n  int  nn;\n\n\n  switch ( format )\n  {\n    case OUTPUT_WINDOWS_DEF:\n      if ( dll_name )\n        fprintf( out, \"LIBRARY %s\\n\", dll_name );\n\n      fprintf( out, \"DESCRIPTION  FreeType 2 DLL\\n\" );\n      fprintf( out, \"EXPORTS\\n\" );\n      for ( nn = 0; nn < num_names; nn++ )\n        fprintf( out, \"  %s\\n\", the_names[nn].name );\n      break;\n\n    case OUTPUT_BORLAND_DEF:\n      if ( dll_name )\n        fprintf( out, \"LIBRARY %s\\n\", dll_name );\n\n      fprintf( out, \"DESCRIPTION  FreeType 2 DLL\\n\" );\n      fprintf( out, \"EXPORTS\\n\" );\n      for ( nn = 0; nn < num_names; nn++ )\n        fprintf( out, \"  _%s\\n\", the_names[nn].name );\n      break;\n\n    case OUTPUT_WATCOM_LBC:\n      {\n        /* we must omit the .dll suffix from the library name */\n        char         temp[512];\n        const char*  dot;\n\n\n        if ( dll_name == NULL )\n        {\n          fprintf( stderr,\n                   \"you must provide a DLL name with the -d option!\\n\" );\n          exit( 4 );\n        }\n\n        dot = strchr( dll_name, '.' );\n        if ( dot != NULL )\n        {\n          int  len = dot - dll_name;\n\n\n          if ( len > (int)( sizeof ( temp ) - 1 ) )\n            len = sizeof ( temp ) - 1;\n\n          memcpy( temp, dll_name, len );\n          temp[len] = 0;\n\n          dll_name = (const char*)temp;\n        }\n\n        for ( nn = 0; nn < num_names; nn++ )\n          fprintf( out, \"++_%s.%s.%s\\n\", the_names[nn].name, dll_name,\n                        the_names[nn].name );\n      }\n      break;\n\n    default:  /* LIST */\n      for ( nn = 0; nn < num_names; nn++ )\n        fprintf( out, \"%s\\n\", the_names[nn].name );\n  }\n}\n\n\n\n\n/* states of the line parser */\n\ntypedef enum  State_\n{\n  STATE_START = 0,  /* waiting for FT_EXPORT keyword and return type */\n  STATE_TYPE        /* type was read, waiting for function name      */\n\n} State;\n\nstatic int\nread_header_file( FILE*  file, int  verbose )\n{\n  static char  buff[LINEBUFF_SIZE + 1];\n  State        state = STATE_START;\n\n  while ( !feof( file ) )\n  {\n    char*  p;\n\n    if ( !fgets( buff, LINEBUFF_SIZE, file ) )\n      break;\n\n    p = buff;\n\n    while ( *p && (*p == ' ' || *p == '\\\\') )  /* skip leading whitespace */\n      p++;\n\n    if ( *p == '\\n' || *p == '\\r' )  /* skip empty lines */\n      continue;\n\n    switch ( state )\n    {\n      case STATE_START:\n        {\n          if ( memcmp( p, \"FT_EXPORT(\", 10 ) != 0 )\n            break;\n\n          p += 10;\n          for (;;)\n          {\n            if ( *p == 0 || *p == '\\n' || *p == '\\r' )\n              goto NextLine;\n\n            if ( *p == ')' )\n            {\n              p++;\n              break;\n            }\n\n            p++;\n          }\n\n          state = STATE_TYPE;\n\n         /* sometimes, the name is just after the FT_EXPORT(...), so\n          * skip whitespace, and fall-through if we find an alphanumeric\n          * character\n          */\n          while ( *p == ' ' || *p == '\\t' )\n            p++;\n\n          if ( !isalpha(*p) )\n            break;\n        }\n        /* fall-through */\n\n      case STATE_TYPE:\n        {\n          char*   name = p;\n\n          while ( isalnum(*p) || *p == '_' )\n            p++;\n\n          if ( p > name )\n          {\n            if ( verbose )\n              fprintf( stderr, \">>> %.*s\\n\", (int)(p - name), name );\n\n            names_add( name, p );\n          }\n\n          state = STATE_START;\n        }\n        break;\n\n      default:\n        ;\n    }\n\n  NextLine:\n    ;\n  }\n\n  return 0;\n}\n\n\nstatic void\nusage( void )\n{\n  static const char* const  format =\n   \"%s %s: extract FreeType API names from header files\\n\\n\"\n   \"this program is used to extract the list of public FreeType API\\n\"\n   \"functions. It receives the list of header files as argument and\\n\"\n   \"generates a sorted list of unique identifiers\\n\\n\"\n\n   \"usage: %s header1 [options] [header2 ...]\\n\\n\"\n\n   \"options:   -      : parse the content of stdin, ignore arguments\\n\"\n   \"           -v     : verbose mode, output sent to standard error\\n\"\n   \"           -oFILE : write output to FILE instead of standard output\\n\"\n   \"           -dNAME : indicate DLL file name, 'freetype.dll' by default\\n\"\n   \"           -w     : output .DEF file for Visual C++ and Mingw\\n\"\n   \"           -wB    : output .DEF file for Borland C++\\n\"\n   \"           -wW    : output Watcom Linker Response File\\n\"\n   \"\\n\";\n\n  fprintf( stderr,\n           format,\n           PROGRAM_NAME,\n           PROGRAM_VERSION,\n           PROGRAM_NAME\n           );\n  exit(1);\n}\n\n\nint  main( int argc, const char* const*  argv )\n{\n  int           from_stdin = 0;\n  int           verbose = 0;\n  OutputFormat  format = OUTPUT_LIST;  /* the default */\n  FILE*         out    = stdout;\n  const char*   library_name = NULL;\n\n  if ( argc < 2 )\n    usage();\n\n  /* '-' used as a single argument means read source file from stdin */\n  while ( argc > 1 && argv[1][0] == '-' )\n  {\n    const char*  arg = argv[1];\n\n    switch ( arg[1] )\n    {\n      case 'v':\n        verbose = 1;\n        break;\n\n      case 'o':\n        if ( arg[2] == 0 )\n        {\n          if ( argc < 2 )\n            usage();\n\n          arg = argv[2];\n          argv++;\n          argc--;\n        }\n        else\n          arg += 2;\n\n        out = fopen( arg, \"wt\" );\n        if ( out == NULL )\n        {\n          fprintf( stderr, \"could not open '%s' for writing\\n\", argv[2] );\n          exit(3);\n        }\n        break;\n\n      case 'd':\n        if ( arg[2] == 0 )\n        {\n          if ( argc < 2 )\n            usage();\n\n          arg = argv[2];\n          argv++;\n          argc--;\n        }\n        else\n          arg += 2;\n\n        library_name = arg;\n        break;\n\n      case 'w':\n        format = OUTPUT_WINDOWS_DEF;\n        switch ( arg[2] )\n        {\n          case 'B':\n            format = OUTPUT_BORLAND_DEF;\n            break;\n\n          case 'W':\n            format = OUTPUT_WATCOM_LBC;\n            break;\n\n          case 0:\n            break;\n\n          default:\n            usage();\n        }\n        break;\n\n      case 0:\n        from_stdin = 1;\n        break;\n\n      default:\n        usage();\n    }\n\n    argc--;\n    argv++;\n  }\n\n  if ( from_stdin )\n  {\n    read_header_file( stdin, verbose );\n  }\n  else\n  {\n    for ( --argc, argv++; argc > 0; argc--, argv++ )\n    {\n      FILE*  file = fopen( argv[0], \"rb\" );\n\n      if ( file == NULL )\n        fprintf( stderr, \"unable to open '%s'\\n\", argv[0] );\n      else\n      {\n        if ( verbose )\n          fprintf( stderr, \"opening '%s'\\n\", argv[0] );\n\n        read_header_file( file, verbose );\n        fclose( file );\n      }\n    }\n  }\n\n  if ( num_names == 0 )\n    panic( \"could not find exported functions !!\\n\" );\n\n  names_sort();\n  names_dump( out, format, library_name );\n\n  if ( out != stdout )\n    fclose( out );\n\n  return 0;\n}\n"
  },
  {
    "path": "libs/freetype/src/tools/chktrcmp.py",
    "content": "#!/usr/bin/env python\n#\n# Check trace components in FreeType 2 source.\n# Author: suzuki toshiya, 2009\n#\n# This code is explicitly into the public domain.\n\n\nimport sys\nimport os\nimport re\n\nSRC_FILE_LIST   = []\nUSED_COMPONENT  = {}\nKNOWN_COMPONENT = {}\n\nSRC_FILE_DIRS   = [ \"src\" ]\nTRACE_DEF_FILES = [ \"include/freetype/internal/fttrace.h\" ]\n\n\n# --------------------------------------------------------------\n# Parse command line options\n#\n\nfor i in range( 1, len( sys.argv ) ):\n  if sys.argv[i].startswith( \"--help\" ):\n    print \"Usage: %s [option]\" % sys.argv[0]\n    print \"Search used-but-defined and defined-but-not-used trace_XXX macros\"\n    print \"\"\n    print \"  --help:\"\n    print \"        Show this help\"\n    print \"\"\n    print \"  --src-dirs=dir1:dir2:...\"\n    print \"        Specify the directories of C source files to be checked\"\n    print \"        Default is %s\" % \":\".join( SRC_FILE_DIRS )\n    print \"\"\n    print \"  --def-files=file1:file2:...\"\n    print \"        Specify the header files including FT_TRACE_DEF()\"\n    print \"        Default is %s\" % \":\".join( TRACE_DEF_FILES )\n    print \"\"\n    exit(0)\n  if sys.argv[i].startswith( \"--src-dirs=\" ):\n    SRC_FILE_DIRS = sys.argv[i].replace( \"--src-dirs=\", \"\", 1 ).split( \":\" )\n  elif sys.argv[i].startswith( \"--def-files=\" ):\n    TRACE_DEF_FILES = sys.argv[i].replace( \"--def-files=\", \"\", 1 ).split( \":\" )\n\n\n# --------------------------------------------------------------\n# Scan C source and header files using trace macros.\n#\n\nc_pathname_pat = re.compile( '^.*\\.[ch]$', re.IGNORECASE )\ntrace_use_pat  = re.compile( '^[ \\t]*#define[ \\t]+FT_COMPONENT[ \\t]+trace_' )\n\nfor d in SRC_FILE_DIRS:\n  for ( p, dlst, flst ) in os.walk( d ):\n    for f in flst:\n      if c_pathname_pat.match( f ) != None:\n        src_pathname = os.path.join( p, f )\n\n        line_num = 0\n        for src_line in open( src_pathname, 'r' ):\n          line_num = line_num + 1\n          src_line = src_line.strip()\n          if trace_use_pat.match( src_line ) != None:\n            component_name = trace_use_pat.sub( '', src_line )\n            if component_name in USED_COMPONENT:\n              USED_COMPONENT[component_name].append( \"%s:%d\" % ( src_pathname, line_num ) )\n            else:\n              USED_COMPONENT[component_name] = [ \"%s:%d\" % ( src_pathname, line_num ) ]\n\n\n# --------------------------------------------------------------\n# Scan header file(s) defining trace macros.\n#\n\ntrace_def_pat_opn = re.compile( '^.*FT_TRACE_DEF[ \\t]*\\([ \\t]*' )\ntrace_def_pat_cls = re.compile( '[ \\t\\)].*$' )\n\nfor f in TRACE_DEF_FILES:\n  line_num = 0\n  for hdr_line in open( f, 'r' ):\n    line_num = line_num + 1\n    hdr_line = hdr_line.strip()\n    if trace_def_pat_opn.match( hdr_line ) != None:\n      component_name = trace_def_pat_opn.sub( '', hdr_line )\n      component_name = trace_def_pat_cls.sub( '', component_name )\n      if component_name in KNOWN_COMPONENT:\n        print \"trace component %s is defined twice, see %s and fttrace.h:%d\" % \\\n          ( component_name, KNOWN_COMPONENT[component_name], line_num )\n      else:\n        KNOWN_COMPONENT[component_name] = \"%s:%d\" % \\\n          ( os.path.basename( f ), line_num )\n\n\n# --------------------------------------------------------------\n# Compare the used and defined trace macros.\n#\n\nprint \"# Trace component used in the implementations but not defined in fttrace.h.\"\ncmpnt = USED_COMPONENT.keys()\ncmpnt.sort()\nfor c in cmpnt:\n  if c not in KNOWN_COMPONENT:\n    print \"Trace component %s (used in %s) is not defined.\" % ( c, \", \".join( USED_COMPONENT[c] ) )\n\nprint \"# Trace component is defined but not used in the implementations.\"\ncmpnt = KNOWN_COMPONENT.keys()\ncmpnt.sort()\nfor c in cmpnt:\n  if c not in USED_COMPONENT:\n    if c != \"any\":\n      print \"Trace component %s (defined in %s) is not used.\" % ( c, KNOWN_COMPONENT[c] )\n\n"
  },
  {
    "path": "libs/freetype/src/tools/cordic.py",
    "content": "# compute arctangent table for CORDIC computations in fttrigon.c\nimport sys, math\n\n#units  = 64*65536.0   # don't change !!\nunits  = 180 * 2**16\nscale  = units/math.pi\nshrink = 1.0\ncomma  = \"\"\n\nprint \"\"\nprint \"table of arctan( 1/2^n ) for PI = \" + repr(units/65536.0) + \" units\"\n\nfor n in range(1,32):\n\n    x = 0.5**n                      # tangent value\n\n    angle  = math.atan(x)           # arctangent\n    angle2 = round(angle*scale)     # arctangent in FT_Angle units\n\n    if angle2 <= 0:\n        break\n\n    sys.stdout.write( comma + repr( int(angle2) ) )\n    comma = \", \"\n\n    shrink /= math.sqrt( 1 + x*x )\n\nprint\nprint \"shrink factor    = \" + repr( shrink )\nprint \"shrink factor 2  = \" + repr( int( shrink * (2**32) ) )\nprint \"expansion factor = \" + repr( 1/shrink )\nprint \"\"\n\n"
  },
  {
    "path": "libs/freetype/src/tools/docmaker/content.py",
    "content": "#  Content (c) 2002, 2004, 2006-2009, 2012\n#    David Turner <david@freetype.org>\n#\n#  This file contains routines used to parse the content of documentation\n#  comment blocks and build more structured objects out of them.\n#\n\nfrom sources import *\nfrom utils import *\nimport string, re\n\n\n# this regular expression is used to detect code sequences. these\n# are simply code fragments embedded in '{' and '}' like in:\n#\n#  {\n#    x = y + z;\n#    if ( zookoo == 2 )\n#    {\n#      foobar();\n#    }\n#  }\n#\n# note that indentation of the starting and ending accolades must be\n# exactly the same. the code sequence can contain accolades at greater\n# indentation\n#\nre_code_start = re.compile( r\"(\\s*){\\s*$\" )\nre_code_end   = re.compile( r\"(\\s*)}\\s*$\" )\n\n\n# this regular expression is used to isolate identifiers from\n# other text\n#\nre_identifier = re.compile( r'((?:\\w|-)*)' )\n\n\n# we collect macros ending in `_H'; while outputting the object data, we use\n# this info together with the object's file location to emit the appropriate\n# header file macro and name before the object itself\n#\nre_header_macro = re.compile( r'^#define\\s{1,}(\\w{1,}_H)\\s{1,}<(.*)>' )\n\n\n#############################################################################\n#\n# The DocCode class is used to store source code lines.\n#\n#   'self.lines' contains a set of source code lines that will be dumped as\n#   HTML in a <PRE> tag.\n#\n#   The object is filled line by line by the parser; it strips the leading\n#   \"margin\" space from each input line before storing it in 'self.lines'.\n#\nclass  DocCode:\n\n    def  __init__( self, margin, lines ):\n        self.lines = []\n        self.words = None\n\n        # remove margin spaces\n        for l in lines:\n            if string.strip( l[:margin] ) == \"\":\n                l = l[margin:]\n            self.lines.append( l )\n\n    def  dump( self, prefix = \"\", width = 60 ):\n        lines = self.dump_lines( 0, width )\n        for l in lines:\n            print prefix + l\n\n    def  dump_lines( self, margin = 0, width = 60 ):\n        result = []\n        for l in self.lines:\n            result.append( \" \" * margin + l )\n        return result\n\n\n\n#############################################################################\n#\n# The DocPara class is used to store \"normal\" text paragraph.\n#\n#   'self.words' contains the list of words that make up the paragraph\n#\nclass  DocPara:\n\n    def  __init__( self, lines ):\n        self.lines = None\n        self.words = []\n        for l in lines:\n            l = string.strip( l )\n            self.words.extend( string.split( l ) )\n\n    def  dump( self, prefix = \"\", width = 60 ):\n        lines = self.dump_lines( 0, width )\n        for l in lines:\n            print prefix + l\n\n    def  dump_lines( self, margin = 0, width = 60 ):\n        cur    = \"\"  # current line\n        col    = 0   # current width\n        result = []\n\n        for word in self.words:\n            ln = len( word )\n            if col > 0:\n                ln = ln + 1\n\n            if col + ln > width:\n                result.append( \" \" * margin + cur )\n                cur = word\n                col = len( word )\n            else:\n                if col > 0:\n                    cur = cur + \" \"\n                cur = cur + word\n                col = col + ln\n\n        if col > 0:\n            result.append( \" \" * margin + cur )\n\n        return result\n\n\n\n#############################################################################\n#\n#  The DocField class is used to store a list containing either DocPara or\n#  DocCode objects. Each DocField also has an optional \"name\" which is used\n#  when the object corresponds to a field or value definition\n#\nclass  DocField:\n\n    def  __init__( self, name, lines ):\n        self.name  = name  # can be None for normal paragraphs/sources\n        self.items = []    # list of items\n\n        mode_none  = 0     # start parsing mode\n        mode_code  = 1     # parsing code sequences\n        mode_para  = 3     # parsing normal paragraph\n\n        margin     = -1    # current code sequence indentation\n        cur_lines  = []\n\n        # now analyze the markup lines to see if they contain paragraphs,\n        # code sequences or fields definitions\n        #\n        start = 0\n        mode  = mode_none\n\n        for l in lines:\n            # are we parsing a code sequence ?\n            if mode == mode_code:\n                m = re_code_end.match( l )\n                if m and len( m.group( 1 ) ) <= margin:\n                    # that's it, we finished the code sequence\n                    code = DocCode( 0, cur_lines )\n                    self.items.append( code )\n                    margin    = -1\n                    cur_lines = []\n                    mode      = mode_none\n                else:\n                    # nope, continue the code sequence\n                    cur_lines.append( l[margin:] )\n            else:\n                # start of code sequence ?\n                m = re_code_start.match( l )\n                if m:\n                    # save current lines\n                    if cur_lines:\n                        para = DocPara( cur_lines )\n                        self.items.append( para )\n                        cur_lines = []\n\n                    # switch to code extraction mode\n                    margin = len( m.group( 1 ) )\n                    mode   = mode_code\n                else:\n                    if not string.split( l ) and cur_lines:\n                        # if the line is empty, we end the current paragraph,\n                        # if any\n                        para = DocPara( cur_lines )\n                        self.items.append( para )\n                        cur_lines = []\n                    else:\n                        # otherwise, simply add the line to the current\n                        # paragraph\n                        cur_lines.append( l )\n\n        if mode == mode_code:\n            # unexpected end of code sequence\n            code = DocCode( margin, cur_lines )\n            self.items.append( code )\n        elif cur_lines:\n            para = DocPara( cur_lines )\n            self.items.append( para )\n\n    def  dump( self, prefix = \"\" ):\n        if self.field:\n            print prefix + self.field + \" ::\"\n            prefix = prefix + \"----\"\n\n        first = 1\n        for p in self.items:\n            if not first:\n                print \"\"\n            p.dump( prefix )\n            first = 0\n\n    def  dump_lines( self, margin = 0, width = 60 ):\n        result = []\n        nl     = None\n\n        for p in self.items:\n            if nl:\n                result.append( \"\" )\n\n            result.extend( p.dump_lines( margin, width ) )\n            nl = 1\n\n        return result\n\n\n\n# this regular expression is used to detect field definitions\n#\nre_field = re.compile( r\"\\s*(\\w*|\\w(\\w|\\.)*\\w)\\s*::\" )\n\n\n\nclass  DocMarkup:\n\n    def  __init__( self, tag, lines ):\n        self.tag    = string.lower( tag )\n        self.fields = []\n\n        cur_lines = []\n        field     = None\n        mode      = 0\n\n        for l in lines:\n            m = re_field.match( l )\n            if m:\n                # we detected the start of a new field definition\n\n                # first, save the current one\n                if cur_lines:\n                    f = DocField( field, cur_lines )\n                    self.fields.append( f )\n                    cur_lines = []\n                    field     = None\n\n                field     = m.group( 1 )   # record field name\n                ln        = len( m.group( 0 ) )\n                l         = \" \" * ln + l[ln:]\n                cur_lines = [l]\n            else:\n                cur_lines.append( l )\n\n        if field or cur_lines:\n            f = DocField( field, cur_lines )\n            self.fields.append( f )\n\n    def  get_name( self ):\n        try:\n            return self.fields[0].items[0].words[0]\n        except:\n            return None\n\n    def  get_start( self ):\n        try:\n            result = \"\"\n            for word in self.fields[0].items[0].words:\n                result = result + \" \" + word\n            return result[1:]\n        except:\n            return \"ERROR\"\n\n    def  dump( self, margin ):\n        print \" \" * margin + \"<\" + self.tag + \">\"\n        for f in self.fields:\n            f.dump( \"  \" )\n        print \" \" * margin + \"</\" + self.tag + \">\"\n\n\n\nclass  DocChapter:\n\n    def  __init__( self, block ):\n        self.block    = block\n        self.sections = []\n        if block:\n            self.name  = block.name\n            self.title = block.get_markup_words( \"title\" )\n            self.order = block.get_markup_words( \"sections\" )\n        else:\n            self.name  = \"Other\"\n            self.title = string.split( \"Miscellaneous\" )\n            self.order = []\n\n\n\nclass  DocSection:\n\n    def  __init__( self, name = \"Other\" ):\n        self.name        = name\n        self.blocks      = {}\n        self.block_names = []  # ordered block names in section\n        self.defs        = []\n        self.abstract    = \"\"\n        self.description = \"\"\n        self.order       = []\n        self.title       = \"ERROR\"\n        self.chapter     = None\n\n    def  add_def( self, block ):\n        self.defs.append( block )\n\n    def  add_block( self, block ):\n        self.block_names.append( block.name )\n        self.blocks[block.name] = block\n\n    def  process( self ):\n        # look up one block that contains a valid section description\n        for block in self.defs:\n            title = block.get_markup_text( \"title\" )\n            if title:\n                self.title       = title\n                self.abstract    = block.get_markup_words( \"abstract\" )\n                self.description = block.get_markup_items( \"description\" )\n                self.order       = block.get_markup_words( \"order\" )\n                return\n\n    def  reorder( self ):\n        self.block_names = sort_order_list( self.block_names, self.order )\n\n\n\nclass  ContentProcessor:\n\n    def  __init__( self ):\n        \"\"\"initialize a block content processor\"\"\"\n        self.reset()\n\n        self.sections = {}    # dictionary of documentation sections\n        self.section  = None  # current documentation section\n\n        self.chapters = []    # list of chapters\n\n        self.headers  = {}    # dictionary of header macros\n\n    def  set_section( self, section_name ):\n        \"\"\"set current section during parsing\"\"\"\n        if not self.sections.has_key( section_name ):\n            section = DocSection( section_name )\n            self.sections[section_name] = section\n            self.section                = section\n        else:\n            self.section = self.sections[section_name]\n\n    def  add_chapter( self, block ):\n        chapter = DocChapter( block )\n        self.chapters.append( chapter )\n\n\n    def  reset( self ):\n        \"\"\"reset the content processor for a new block\"\"\"\n        self.markups      = []\n        self.markup       = None\n        self.markup_lines = []\n\n    def  add_markup( self ):\n        \"\"\"add a new markup section\"\"\"\n        if self.markup and self.markup_lines:\n\n            # get rid of last line of markup if it's empty\n            marks = self.markup_lines\n            if len( marks ) > 0 and not string.strip( marks[-1] ):\n                self.markup_lines = marks[:-1]\n\n            m = DocMarkup( self.markup, self.markup_lines )\n\n            self.markups.append( m )\n\n            self.markup       = None\n            self.markup_lines = []\n\n    def  process_content( self, content ):\n        \"\"\"process a block content and return a list of DocMarkup objects\n           corresponding to it\"\"\"\n        markup       = None\n        markup_lines = []\n        first        = 1\n\n        for line in content:\n            found = None\n            for t in re_markup_tags:\n                m = t.match( line )\n                if m:\n                    found  = string.lower( m.group( 1 ) )\n                    prefix = len( m.group( 0 ) )\n                    line   = \" \" * prefix + line[prefix:]   # remove markup from line\n                    break\n\n            # is it the start of a new markup section ?\n            if found:\n                first = 0\n                self.add_markup()  # add current markup content\n                self.markup = found\n                if len( string.strip( line ) ) > 0:\n                    self.markup_lines.append( line )\n            elif first == 0:\n                self.markup_lines.append( line )\n\n        self.add_markup()\n\n        return self.markups\n\n    def  parse_sources( self, source_processor ):\n        blocks = source_processor.blocks\n        count  = len( blocks )\n\n        for n in range( count ):\n            source = blocks[n]\n            if source.content:\n                # this is a documentation comment, we need to catch\n                # all following normal blocks in the \"follow\" list\n                #\n                follow = []\n                m = n + 1\n                while m < count and not blocks[m].content:\n                    follow.append( blocks[m] )\n                    m = m + 1\n\n                doc_block = DocBlock( source, follow, self )\n\n    def  finish( self ):\n        # process all sections to extract their abstract, description\n        # and ordered list of items\n        #\n        for sec in self.sections.values():\n            sec.process()\n\n        # process chapters to check that all sections are correctly\n        # listed there\n        for chap in self.chapters:\n            for sec in chap.order:\n                if self.sections.has_key( sec ):\n                    section = self.sections[sec]\n                    section.chapter = chap\n                    section.reorder()\n                    chap.sections.append( section )\n                else:\n                    sys.stderr.write( \"WARNING: chapter '\" +          \\\n                        chap.name + \"' in \" + chap.block.location() + \\\n                        \" lists unknown section '\" + sec + \"'\\n\" )\n\n        # check that all sections are in a chapter\n        #\n        others = []\n        for sec in self.sections.values():\n            if not sec.chapter:\n                others.append( sec )\n\n        # create a new special chapter for all remaining sections\n        # when necessary\n        #\n        if others:\n            chap = DocChapter( None )\n            chap.sections = others\n            self.chapters.append( chap )\n\n\n\nclass  DocBlock:\n\n    def  __init__( self, source, follow, processor ):\n        processor.reset()\n\n        self.source  = source\n        self.code    = []\n        self.type    = \"ERRTYPE\"\n        self.name    = \"ERRNAME\"\n        self.section = processor.section\n        self.markups = processor.process_content( source.content )\n\n        # compute block type from first markup tag\n        try:\n            self.type = self.markups[0].tag\n        except:\n            pass\n\n        # compute block name from first markup paragraph\n        try:\n            markup = self.markups[0]\n            para   = markup.fields[0].items[0]\n            name   = para.words[0]\n            m = re_identifier.match( name )\n            if m:\n                name = m.group( 1 )\n            self.name = name\n        except:\n            pass\n\n        if self.type == \"section\":\n            # detect new section starts\n            processor.set_section( self.name )\n            processor.section.add_def( self )\n        elif self.type == \"chapter\":\n            # detect new chapter\n            processor.add_chapter( self )\n        else:\n            processor.section.add_block( self )\n\n        # now, compute the source lines relevant to this documentation\n        # block. We keep normal comments in for obvious reasons (??)\n        source = []\n        for b in follow:\n            if b.format:\n                break\n            for l in b.lines:\n                # collect header macro definitions\n                m = re_header_macro.match( l )\n                if m:\n                    processor.headers[m.group( 2 )] = m.group( 1 );\n\n                # we use \"/* */\" as a separator\n                if re_source_sep.match( l ):\n                    break\n                source.append( l )\n\n        # now strip the leading and trailing empty lines from the sources\n        start = 0\n        end   = len( source ) - 1\n\n        while start < end and not string.strip( source[start] ):\n            start = start + 1\n\n        while start < end and not string.strip( source[end] ):\n            end = end - 1\n\n        if start == end and not string.strip( source[start] ):\n            self.code = []\n        else:\n            self.code = source[start:end + 1]\n\n    def  location( self ):\n        return self.source.location()\n\n    def  get_markup( self, tag_name ):\n        \"\"\"return the DocMarkup corresponding to a given tag in a block\"\"\"\n        for m in self.markups:\n            if m.tag == string.lower( tag_name ):\n                return m\n        return None\n\n    def  get_markup_name( self, tag_name ):\n        \"\"\"return the name of a given primary markup in a block\"\"\"\n        try:\n            m = self.get_markup( tag_name )\n            return m.get_name()\n        except:\n            return None\n\n    def  get_markup_words( self, tag_name ):\n        try:\n            m = self.get_markup( tag_name )\n            return m.fields[0].items[0].words\n        except:\n            return []\n\n    def  get_markup_text( self, tag_name ):\n        result = self.get_markup_words( tag_name )\n        return string.join( result )\n\n    def  get_markup_items( self, tag_name ):\n        try:\n            m = self.get_markup( tag_name )\n            return m.fields[0].items\n        except:\n            return None\n\n# eof\n"
  },
  {
    "path": "libs/freetype/src/tools/docmaker/docbeauty.py",
    "content": "#!/usr/bin/env python\n#\n#  DocBeauty (c) 2003, 2004, 2008 David Turner <david@freetype.org>\n#\n# This program is used to beautify the documentation comments used\n# in the FreeType 2 public headers.\n#\n\nfrom sources import *\nfrom content import *\nfrom utils   import *\n\nimport utils\n\nimport sys, os, time, string, getopt\n\n\ncontent_processor = ContentProcessor()\n\n\ndef  beautify_block( block ):\n    if block.content:\n        content_processor.reset()\n\n        markups = content_processor.process_content( block.content )\n        text    = []\n        first   = 1\n\n        for markup in markups:\n            text.extend( markup.beautify( first ) )\n            first = 0\n\n        # now beautify the documentation \"borders\" themselves\n        lines = [\" /*************************************************************************\"]\n        for l in text:\n            lines.append( \"  *\" + l )\n        lines.append( \"  */\" )\n\n        block.lines = lines\n\n\ndef  usage():\n    print \"\\nDocBeauty 0.1 Usage information\\n\"\n    print \"  docbeauty [options] file1 [file2 ...]\\n\"\n    print \"using the following options:\\n\"\n    print \"  -h : print this page\"\n    print \"  -b : backup original files with the 'orig' extension\"\n    print \"\"\n    print \"  --backup : same as -b\"\n\n\ndef  main( argv ):\n    \"\"\"main program loop\"\"\"\n\n    global output_dir\n\n    try:\n        opts, args = getopt.getopt( sys.argv[1:], \\\n                                    \"hb\",         \\\n                                    [\"help\", \"backup\"] )\n    except getopt.GetoptError:\n        usage()\n        sys.exit( 2 )\n\n    if args == []:\n        usage()\n        sys.exit( 1 )\n\n    # process options\n    #\n    output_dir = None\n    do_backup  = None\n\n    for opt in opts:\n        if opt[0] in ( \"-h\", \"--help\" ):\n            usage()\n            sys.exit( 0 )\n\n        if opt[0] in ( \"-b\", \"--backup\" ):\n            do_backup = 1\n\n    # create context and processor\n    source_processor = SourceProcessor()\n\n    # retrieve the list of files to process\n    file_list = make_file_list( args )\n    for filename in file_list:\n        source_processor.parse_file( filename )\n\n        for block in source_processor.blocks:\n            beautify_block( block )\n\n        new_name = filename + \".new\"\n        ok       = None\n\n        try:\n            file = open( new_name, \"wt\" )\n            for block in source_processor.blocks:\n                for line in block.lines:\n                    file.write( line )\n                    file.write( \"\\n\" )\n            file.close()\n        except:\n            ok = 0\n\n\n# if called from the command line\n#\nif __name__ == '__main__':\n    main( sys.argv )\n\n\n# eof\n"
  },
  {
    "path": "libs/freetype/src/tools/docmaker/docmaker.py",
    "content": "#!/usr/bin/env python\n#\n#  DocMaker (c) 2002, 2004, 2008 David Turner <david@freetype.org>\n#\n# This program is a re-write of the original DocMaker took used\n# to generate the API Reference of the FreeType font engine\n# by converting in-source comments into structured HTML.\n#\n# This new version is capable of outputting XML data, as well\n# as accepts more liberal formatting options.\n#\n# It also uses regular expression matching and substitution\n# to speed things significantly.\n#\n\nfrom sources   import *\nfrom content   import *\nfrom utils     import *\nfrom formatter import *\nfrom tohtml    import *\n\nimport utils\n\nimport sys, os, time, string, glob, getopt\n\n\ndef  usage():\n    print \"\\nDocMaker Usage information\\n\"\n    print \"  docmaker [options] file1 [file2 ...]\\n\"\n    print \"using the following options:\\n\"\n    print \"  -h : print this page\"\n    print \"  -t : set project title, as in '-t \\\"My Project\\\"'\"\n    print \"  -o : set output directory, as in '-o mydir'\"\n    print \"  -p : set documentation prefix, as in '-p ft2'\"\n    print \"\"\n    print \"  --title  : same as -t, as in '--title=\\\"My Project\\\"'\"\n    print \"  --output : same as -o, as in '--output=mydir'\"\n    print \"  --prefix : same as -p, as in '--prefix=ft2'\"\n\n\ndef  main( argv ):\n    \"\"\"main program loop\"\"\"\n\n    global output_dir\n\n    try:\n        opts, args = getopt.getopt( sys.argv[1:], \\\n                                    \"ht:o:p:\",    \\\n                                    [\"help\", \"title=\", \"output=\", \"prefix=\"] )\n    except getopt.GetoptError:\n        usage()\n        sys.exit( 2 )\n\n    if args == []:\n        usage()\n        sys.exit( 1 )\n\n    # process options\n    #\n    project_title  = \"Project\"\n    project_prefix = None\n    output_dir     = None\n\n    for opt in opts:\n        if opt[0] in ( \"-h\", \"--help\" ):\n            usage()\n            sys.exit( 0 )\n\n        if opt[0] in ( \"-t\", \"--title\" ):\n            project_title = opt[1]\n\n        if opt[0] in ( \"-o\", \"--output\" ):\n            utils.output_dir = opt[1]\n\n        if opt[0] in ( \"-p\", \"--prefix\" ):\n            project_prefix = opt[1]\n\n    check_output()\n\n    # create context and processor\n    source_processor  = SourceProcessor()\n    content_processor = ContentProcessor()\n\n    # retrieve the list of files to process\n    file_list = make_file_list( args )\n    for filename in file_list:\n        source_processor.parse_file( filename )\n        content_processor.parse_sources( source_processor )\n\n    # process sections\n    content_processor.finish()\n\n    formatter = HtmlFormatter( content_processor, project_title, project_prefix )\n\n    formatter.toc_dump()\n    formatter.index_dump()\n    formatter.section_dump_all()\n\n\n# if called from the command line\n#\nif __name__ == '__main__':\n    main( sys.argv )\n\n\n# eof\n"
  },
  {
    "path": "libs/freetype/src/tools/docmaker/formatter.py",
    "content": "#  Formatter (c) 2002, 2004, 2007, 2008 David Turner <david@freetype.org>\n#\n\nfrom sources import *\nfrom content import *\nfrom utils   import *\n\n# This is the base Formatter class.  Its purpose is to convert\n# a content processor's data into specific documents (i.e., table of\n# contents, global index, and individual API reference indices).\n#\n# You need to sub-class it to output anything sensible.  For example,\n# the file tohtml.py contains the definition of the HtmlFormatter sub-class\n# used to output -- you guessed it -- HTML.\n#\n\nclass  Formatter:\n\n    def  __init__( self, processor ):\n        self.processor   = processor\n        self.identifiers = {}\n        self.chapters    = processor.chapters\n        self.sections    = processor.sections.values()\n        self.block_index = []\n\n        # store all blocks in a dictionary\n        self.blocks = []\n        for section in self.sections:\n            for block in section.blocks.values():\n                self.add_identifier( block.name, block )\n\n                # add enumeration values to the index, since this is useful\n                for markup in block.markups:\n                    if markup.tag == 'values':\n                        for field in markup.fields:\n                            self.add_identifier( field.name, block )\n\n        self.block_index = self.identifiers.keys()\n        self.block_index.sort( index_sort )\n\n    def  add_identifier( self, name, block ):\n        if self.identifiers.has_key( name ):\n            # duplicate name!\n            sys.stderr.write(                                           \\\n               \"WARNING: duplicate definition for '\" + name + \"' in \" + \\\n               block.location() + \", previous definition in \" +         \\\n               self.identifiers[name].location() + \"\\n\" )\n        else:\n            self.identifiers[name] = block\n\n    #\n    #  Formatting the table of contents\n    #\n    def  toc_enter( self ):\n        pass\n\n    def  toc_chapter_enter( self, chapter ):\n        pass\n\n    def  toc_section_enter( self, section ):\n        pass\n\n    def  toc_section_exit( self, section ):\n        pass\n\n    def  toc_chapter_exit( self, chapter ):\n        pass\n\n    def  toc_index( self, index_filename ):\n        pass\n\n    def  toc_exit( self ):\n        pass\n\n    def  toc_dump( self, toc_filename = None, index_filename = None ):\n        output = None\n        if toc_filename:\n            output = open_output( toc_filename )\n\n        self.toc_enter()\n\n        for chap in self.processor.chapters:\n\n            self.toc_chapter_enter( chap )\n\n            for section in chap.sections:\n                self.toc_section_enter( section )\n                self.toc_section_exit( section )\n\n            self.toc_chapter_exit( chap )\n\n        self.toc_index( index_filename )\n\n        self.toc_exit()\n\n        if output:\n            close_output( output )\n\n    #\n    #  Formatting the index\n    #\n    def  index_enter( self ):\n        pass\n\n    def  index_name_enter( self, name ):\n        pass\n\n    def  index_name_exit( self, name ):\n        pass\n\n    def  index_exit( self ):\n        pass\n\n    def  index_dump( self, index_filename = None ):\n        output = None\n        if index_filename:\n            output = open_output( index_filename )\n\n        self.index_enter()\n\n        for name in self.block_index:\n            self.index_name_enter( name )\n            self.index_name_exit( name )\n\n        self.index_exit()\n\n        if output:\n            close_output( output )\n\n    #\n    #  Formatting a section\n    #\n    def  section_enter( self, section ):\n        pass\n\n    def  block_enter( self, block ):\n        pass\n\n    def  markup_enter( self, markup, block = None ):\n        pass\n\n    def  field_enter( self, field, markup = None, block = None ):\n        pass\n\n    def  field_exit( self, field, markup = None, block = None ):\n        pass\n\n    def  markup_exit( self, markup, block = None ):\n        pass\n\n    def  block_exit( self, block ):\n        pass\n\n    def  section_exit( self, section ):\n        pass\n\n    def  section_dump( self, section, section_filename = None ):\n        output = None\n        if section_filename:\n            output = open_output( section_filename )\n\n        self.section_enter( section )\n\n        for name in section.block_names:\n            block = self.identifiers[name]\n            self.block_enter( block )\n\n            for markup in block.markups[1:]:   # always ignore first markup!\n                self.markup_enter( markup, block )\n\n                for field in markup.fields:\n                    self.field_enter( field, markup, block )\n                    self.field_exit( field, markup, block )\n\n                self.markup_exit( markup, block )\n\n            self.block_exit( block )\n\n        self.section_exit( section )\n\n        if output:\n            close_output( output )\n\n    def  section_dump_all( self ):\n        for section in self.sections:\n            self.section_dump( section )\n\n# eof\n"
  },
  {
    "path": "libs/freetype/src/tools/docmaker/sources.py",
    "content": "#  Sources (c) 2002-2004, 2006-2009, 2012\n#    David Turner <david@freetype.org>\n#\n#\n# this file contains definitions of classes needed to decompose\n# C sources files into a series of multi-line \"blocks\". There are\n# two kinds of blocks:\n#\n#   - normal blocks, which contain source code or ordinary comments\n#\n#   - documentation blocks, which have restricted formatting, and\n#     whose text always start with a documentation markup tag like\n#     \"<Function>\", \"<Type>\", etc..\n#\n# the routines used to process the content of documentation blocks\n# are not contained here, but in \"content.py\"\n#\n# the classes and methods found here only deal with text parsing\n# and basic documentation block extraction\n#\n\nimport fileinput, re, sys, os, string\n\n\n\n################################################################\n##\n##  BLOCK FORMAT PATTERN\n##\n##   A simple class containing compiled regular expressions used\n##   to detect potential documentation format block comments within\n##   C source code\n##\n##   note that the 'column' pattern must contain a group that will\n##   be used to \"unbox\" the content of documentation comment blocks\n##\nclass  SourceBlockFormat:\n\n    def  __init__( self, id, start, column, end ):\n        \"\"\"create a block pattern, used to recognize special documentation blocks\"\"\"\n        self.id     = id\n        self.start  = re.compile( start, re.VERBOSE )\n        self.column = re.compile( column, re.VERBOSE )\n        self.end    = re.compile( end, re.VERBOSE )\n\n\n\n#\n# format 1 documentation comment blocks look like the following:\n#\n#    /************************************/\n#    /*                                  */\n#    /*                                  */\n#    /*                                  */\n#    /************************************/\n#\n# we define a few regular expressions here to detect them\n#\n\nstart = r'''\n  \\s*      # any number of whitespace\n  /\\*{2,}/ # followed by '/' and at least two asterisks then '/'\n  \\s*$     # probably followed by whitespace\n'''\n\ncolumn = r'''\n  \\s*      # any number of whitespace\n  /\\*{1}   # followed by '/' and precisely one asterisk\n  ([^*].*) # followed by anything (group 1)\n  \\*{1}/   # followed by one asterisk and a '/'\n  \\s*$     # probably followed by whitespace\n'''\n\nre_source_block_format1 = SourceBlockFormat( 1, start, column, start )\n\n\n#\n# format 2 documentation comment blocks look like the following:\n#\n#    /************************************ (at least 2 asterisks)\n#     *\n#     *\n#     *\n#     *\n#     **/       (1 or more asterisks at the end)\n#\n# we define a few regular expressions here to detect them\n#\nstart = r'''\n  \\s*     # any number of whitespace\n  /\\*{2,} # followed by '/' and at least two asterisks\n  \\s*$    # probably followed by whitespace\n'''\n\ncolumn = r'''\n  \\s*        # any number of whitespace\n  \\*{1}(?!/) # followed by precisely one asterisk not followed by `/'\n  (.*)       # then anything (group1)\n'''\n\nend = r'''\n  \\s*  # any number of whitespace\n  \\*+/ # followed by at least one asterisk, then '/'\n'''\n\nre_source_block_format2 = SourceBlockFormat( 2, start, column, end )\n\n\n#\n# the list of supported documentation block formats, we could add new ones\n# relatively easily\n#\nre_source_block_formats = [re_source_block_format1, re_source_block_format2]\n\n\n#\n# the following regular expressions corresponds to markup tags\n# within the documentation comment blocks. they're equivalent\n# despite their different syntax\n#\n# notice how each markup tag _must_ begin a new line\n#\nre_markup_tag1 = re.compile( r'''\\s*<((?:\\w|-)*)>''' )  # <xxxx> format\nre_markup_tag2 = re.compile( r'''\\s*@((?:\\w|-)*):''' )  # @xxxx: format\n\n#\n# the list of supported markup tags, we could add new ones relatively\n# easily\n#\nre_markup_tags = [re_markup_tag1, re_markup_tag2]\n\n#\n# used to detect a cross-reference, after markup tags have been stripped\n#\nre_crossref = re.compile( r'@((?:\\w|-)*)(.*)' )\n\n#\n# used to detect italic and bold styles in paragraph text\n#\nre_italic = re.compile( r\"_(\\w(\\w|')*)_(.*)\" )     #  _italic_\nre_bold   = re.compile( r\"\\*(\\w(\\w|')*)\\*(.*)\" )   #  *bold*\n\n#\n# used to detect the end of commented source lines\n#\nre_source_sep = re.compile( r'\\s*/\\*\\s*\\*/' )\n\n#\n# used to perform cross-reference within source output\n#\nre_source_crossref = re.compile( r'(\\W*)(\\w*)' )\n\n#\n# a list of reserved source keywords\n#\nre_source_keywords = re.compile( '''\\\\b ( typedef   |\n                                          struct    |\n                                          enum      |\n                                          union     |\n                                          const     |\n                                          char      |\n                                          int       |\n                                          short     |\n                                          long      |\n                                          void      |\n                                          signed    |\n                                          unsigned  |\n                                          \\#include |\n                                          \\#define  |\n                                          \\#undef   |\n                                          \\#if      |\n                                          \\#ifdef   |\n                                          \\#ifndef  |\n                                          \\#else    |\n                                          \\#endif   ) \\\\b''', re.VERBOSE )\n\n\n################################################################\n##\n##  SOURCE BLOCK CLASS\n##\n##   A SourceProcessor is in charge of reading a C source file\n##   and decomposing it into a series of different \"SourceBlocks\".\n##   each one of these blocks can be made of the following data:\n##\n##   - A documentation comment block that starts with \"/**\" and\n##     whose exact format will be discussed later\n##\n##   - normal sources lines, including comments\n##\n##   the important fields in a text block are the following ones:\n##\n##     self.lines   : a list of text lines for the corresponding block\n##\n##     self.content : for documentation comment blocks only, this is the\n##                    block content that has been \"unboxed\" from its\n##                    decoration. This is None for all other blocks\n##                    (i.e. sources or ordinary comments with no starting\n##                     markup tag)\n##\nclass  SourceBlock:\n\n    def  __init__( self, processor, filename, lineno, lines ):\n        self.processor = processor\n        self.filename  = filename\n        self.lineno    = lineno\n        self.lines     = lines[:]\n        self.format    = processor.format\n        self.content   = []\n\n        if self.format == None:\n            return\n\n        words = []\n\n        # extract comment lines\n        lines = []\n\n        for line0 in self.lines:\n            m = self.format.column.match( line0 )\n            if m:\n                lines.append( m.group( 1 ) )\n\n        # now, look for a markup tag\n        for l in lines:\n            l = string.strip( l )\n            if len( l ) > 0:\n                for tag in re_markup_tags:\n                    if tag.match( l ):\n                        self.content = lines\n                        return\n\n    def  location( self ):\n        return \"(\" + self.filename + \":\" + repr( self.lineno ) + \")\"\n\n    # debugging only - not used in normal operations\n    def  dump( self ):\n        if self.content:\n            print \"{{{content start---\"\n            for l in self.content:\n                print l\n            print \"---content end}}}\"\n            return\n\n        fmt = \"\"\n        if self.format:\n            fmt = repr( self.format.id ) + \" \"\n\n        for line in self.lines:\n            print line\n\n\n\n################################################################\n##\n##  SOURCE PROCESSOR CLASS\n##\n##   The SourceProcessor is in charge of reading a C source file\n##   and decomposing it into a series of different \"SourceBlock\"\n##   objects.\n##\n##   each one of these blocks can be made of the following data:\n##\n##   - A documentation comment block that starts with \"/**\" and\n##     whose exact format will be discussed later\n##\n##   - normal sources lines, include comments\n##\n##\nclass  SourceProcessor:\n\n    def  __init__( self ):\n        \"\"\"initialize a source processor\"\"\"\n        self.blocks   = []\n        self.filename = None\n        self.format   = None\n        self.lines    = []\n\n    def  reset( self ):\n        \"\"\"reset a block processor, clean all its blocks\"\"\"\n        self.blocks = []\n        self.format = None\n\n    def  parse_file( self, filename ):\n        \"\"\"parse a C source file, and add its blocks to the processor's list\"\"\"\n        self.reset()\n\n        self.filename = filename\n\n        fileinput.close()\n        self.format = None\n        self.lineno = 0\n        self.lines  = []\n\n        for line in fileinput.input( filename ):\n            # strip trailing newlines, important on Windows machines!\n            if line[-1] == '\\012':\n                line = line[0:-1]\n\n            if self.format == None:\n                self.process_normal_line( line )\n            else:\n                if self.format.end.match( line ):\n                    # that's a normal block end, add it to 'lines' and\n                    # create a new block\n                    self.lines.append( line )\n                    self.add_block_lines()\n                elif self.format.column.match( line ):\n                    # that's a normal column line, add it to 'lines'\n                    self.lines.append( line )\n                else:\n                    # humm.. this is an unexpected block end,\n                    # create a new block, but don't process the line\n                    self.add_block_lines()\n\n                    # we need to process the line again\n                    self.process_normal_line( line )\n\n        # record the last lines\n        self.add_block_lines()\n\n    def  process_normal_line( self, line ):\n        \"\"\"process a normal line and check whether it is the start of a new block\"\"\"\n        for f in re_source_block_formats:\n            if f.start.match( line ):\n                self.add_block_lines()\n                self.format = f\n                self.lineno = fileinput.filelineno()\n\n        self.lines.append( line )\n\n    def  add_block_lines( self ):\n        \"\"\"add the current accumulated lines and create a new block\"\"\"\n        if self.lines != []:\n            block = SourceBlock( self, self.filename, self.lineno, self.lines )\n\n            self.blocks.append( block )\n            self.format = None\n            self.lines  = []\n\n    # debugging only, not used in normal operations\n    def  dump( self ):\n        \"\"\"print all blocks in a processor\"\"\"\n        for b in self.blocks:\n            b.dump()\n\n# eof\n"
  },
  {
    "path": "libs/freetype/src/tools/docmaker/tohtml.py",
    "content": "#  ToHTML (c) 2002, 2003, 2005, 2006, 2007, 2008\n#    David Turner <david@freetype.org>\n\nfrom sources import *\nfrom content import *\nfrom formatter import *\n\nimport time\n\n\n# The following defines the HTML header used by all generated pages.\nhtml_header_1 = \"\"\"\\\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n\"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n<title>\\\n\"\"\"\n\nhtml_header_2 = \"\"\"\\\n API Reference</title>\n<style type=\"text/css\">\n  body { font-family: Verdana, Geneva, Arial, Helvetica, serif;\n         color: #000000;\n         background: #FFFFFF; }\n\n  p { text-align: justify; }\n  h1 { text-align: center; }\n  li { text-align: justify; }\n  td { padding: 0 0.5em 0 0.5em; }\n  td.left { padding: 0 0.5em 0 0.5em;\n            text-align: left; }\n\n  a:link { color: #0000EF; }\n  a:visited { color: #51188E; }\n  a:hover { color: #FF0000; }\n\n  span.keyword { font-family: monospace;\n                 text-align: left;\n                 white-space: pre;\n                 color: darkblue; }\n\n  pre.colored { color: blue; }\n\n  ul.empty { list-style-type: none; }\n</style>\n</head>\n<body>\n\"\"\"\n\nhtml_header_3 = \"\"\"\n<table align=center><tr><td><font size=-1>[<a href=\"\\\n\"\"\"\n\nhtml_header_3i = \"\"\"\n<table align=center><tr><td width=\"100%\"></td>\n<td><font size=-1>[<a href=\"\\\n\"\"\"\n\nhtml_header_4 = \"\"\"\\\n\">Index</a>]</font></td>\n<td width=\"100%\"></td>\n<td><font size=-1>[<a href=\"\\\n\"\"\"\n\nhtml_header_5 = \"\"\"\\\n\">TOC</a>]</font></td></tr></table>\n<center><h1>\\\n\"\"\"\n\nhtml_header_5t = \"\"\"\\\n\">Index</a>]</font></td>\n<td width=\"100%\"></td></tr></table>\n<center><h1>\\\n\"\"\"\n\nhtml_header_6 = \"\"\"\\\n API Reference</h1></center>\n\"\"\"\n\n\n# The HTML footer used by all generated pages.\nhtml_footer = \"\"\"\\\n</body>\n</html>\\\n\"\"\"\n\n# The header and footer used for each section.\nsection_title_header = \"<center><h1>\"\nsection_title_footer = \"</h1></center>\"\n\n# The header and footer used for code segments.\ncode_header = '<pre class=\"colored\">'\ncode_footer = '</pre>'\n\n# Paragraph header and footer.\npara_header = \"<p>\"\npara_footer = \"</p>\"\n\n# Block header and footer.\nblock_header        = '<table align=center width=\"75%\"><tr><td>'\nblock_footer_start  = \"\"\"\\\n</td></tr></table>\n<hr width=\"75%\">\n<table align=center width=\"75%\"><tr><td><font size=-2>[<a href=\"\\\n\"\"\"\nblock_footer_middle = \"\"\"\\\n\">Index</a>]</font></td>\n<td width=\"100%\"></td>\n<td><font size=-2>[<a href=\"\\\n\"\"\"\nblock_footer_end    = \"\"\"\\\n\">TOC</a>]</font></td></tr></table>\n\"\"\"\n\n# Description header/footer.\ndescription_header = '<table align=center width=\"87%\"><tr><td>'\ndescription_footer = \"</td></tr></table><br>\"\n\n# Marker header/inter/footer combination.\nmarker_header = '<table align=center width=\"87%\" cellpadding=5><tr bgcolor=\"#EEEEFF\"><td><em><b>'\nmarker_inter  = \"</b></em></td></tr><tr><td>\"\nmarker_footer = \"</td></tr></table>\"\n\n# Header location header/footer.\nheader_location_header = '<table align=center width=\"87%\"><tr><td>'\nheader_location_footer = \"</td></tr></table><br>\"\n\n# Source code extracts header/footer.\nsource_header = '<table align=center width=\"87%\"><tr bgcolor=\"#D6E8FF\"><td><pre>\\n'\nsource_footer = \"\\n</pre></table><br>\"\n\n# Chapter header/inter/footer.\nchapter_header = '<br><table align=center width=\"75%\"><tr><td><h2>'\nchapter_inter  = '</h2><ul class=\"empty\"><li>'\nchapter_footer = '</li></ul></td></tr></table>'\n\n# Index footer.\nindex_footer_start = \"\"\"\\\n<hr>\n<table><tr><td width=\"100%\"></td>\n<td><font size=-2>[<a href=\"\\\n\"\"\"\nindex_footer_end = \"\"\"\\\n\">TOC</a>]</font></td></tr></table>\n\"\"\"\n\n# TOC footer.\ntoc_footer_start = \"\"\"\\\n<hr>\n<table><tr><td><font size=-2>[<a href=\"\\\n\"\"\"\ntoc_footer_end = \"\"\"\\\n\">Index</a>]</font></td>\n<td width=\"100%\"></td>\n</tr></table>\n\"\"\"\n\n\n# source language keyword coloration/styling\nkeyword_prefix = '<span class=\"keyword\">'\nkeyword_suffix = '</span>'\n\nsection_synopsis_header = '<h2>Synopsis</h2>'\nsection_synopsis_footer = ''\n\n\n# Translate a single line of source to HTML.  This will convert\n# a \"<\" into \"&lt.\", \">\" into \"&gt.\", etc.\ndef  html_quote( line ):\n    result = string.replace( line, \"&\", \"&amp;\" )\n    result = string.replace( result, \"<\", \"&lt;\" )\n    result = string.replace( result, \">\", \"&gt;\" )\n    return result\n\n\n# same as 'html_quote', but ignores left and right brackets\ndef  html_quote0( line ):\n    return string.replace( line, \"&\", \"&amp;\" )\n\n\ndef  dump_html_code( lines, prefix = \"\" ):\n    # clean the last empty lines\n    l = len( self.lines )\n    while l > 0 and string.strip( self.lines[l - 1] ) == \"\":\n        l = l - 1\n\n    # The code footer should be directly appended to the last code\n    # line to avoid an additional blank line.\n    print prefix + code_header,\n    for line in self.lines[0 : l + 1]:\n        print '\\n' + prefix + html_quote( line ),\n    print prefix + code_footer,\n\n\n\nclass  HtmlFormatter( Formatter ):\n\n    def  __init__( self, processor, project_title, file_prefix ):\n        Formatter.__init__( self, processor )\n\n        global html_header_1, html_header_2, html_header_3\n        global html_header_4, html_header_5, html_footer\n\n        if file_prefix:\n            file_prefix = file_prefix + \"-\"\n        else:\n            file_prefix = \"\"\n\n        self.headers           = processor.headers\n        self.project_title     = project_title\n        self.file_prefix       = file_prefix\n        self.html_header       = html_header_1 + project_title +              \\\n                                 html_header_2 +                              \\\n                                 html_header_3 + file_prefix + \"index.html\" + \\\n                                 html_header_4 + file_prefix + \"toc.html\" +   \\\n                                 html_header_5 + project_title +              \\\n                                 html_header_6\n\n        self.html_index_header = html_header_1 + project_title +             \\\n                                 html_header_2 +                             \\\n                                 html_header_3i + file_prefix + \"toc.html\" + \\\n                                 html_header_5 + project_title +             \\\n                                 html_header_6\n\n        self.html_toc_header   = html_header_1 + project_title +              \\\n                                 html_header_2 +                              \\\n                                 html_header_3 + file_prefix + \"index.html\" + \\\n                                 html_header_5t + project_title +             \\\n                                 html_header_6\n\n        self.html_footer       = \"<center><font size=\"\"-2\"\">generated on \" +     \\\n                                 time.asctime( time.localtime( time.time() ) ) + \\\n                                 \"</font></center>\" + html_footer\n\n        self.columns = 3\n\n    def  make_section_url( self, section ):\n        return self.file_prefix + section.name + \".html\"\n\n    def  make_block_url( self, block ):\n        return self.make_section_url( block.section ) + \"#\" + block.name\n\n    def  make_html_words( self, words ):\n        \"\"\" convert a series of simple words into some HTML text \"\"\"\n        line = \"\"\n        if words:\n            line = html_quote( words[0] )\n            for w in words[1:]:\n                line = line + \" \" + html_quote( w )\n\n        return line\n\n    def  make_html_word( self, word ):\n        \"\"\"analyze a simple word to detect cross-references and styling\"\"\"\n        # look for cross-references\n        m = re_crossref.match( word )\n        if m:\n            try:\n                name = m.group( 1 )\n                rest = m.group( 2 )\n                block = self.identifiers[name]\n                url   = self.make_block_url( block )\n                return '<a href=\"' + url + '\">' + name + '</a>' + rest\n            except:\n                # we detected a cross-reference to an unknown item\n                sys.stderr.write( \\\n                   \"WARNING: undefined cross reference '\" + name + \"'.\\n\" )\n                return '?' + name + '?' + rest\n\n        # look for italics and bolds\n        m = re_italic.match( word )\n        if m:\n            name = m.group( 1 )\n            rest = m.group( 3 )\n            return '<i>' + name + '</i>' + rest\n\n        m = re_bold.match( word )\n        if m:\n            name = m.group( 1 )\n            rest = m.group( 3 )\n            return '<b>' + name + '</b>' + rest\n\n        return html_quote( word )\n\n    def  make_html_para( self, words ):\n        \"\"\" convert words of a paragraph into tagged HTML text, handle xrefs \"\"\"\n        line = \"\"\n        if words:\n            line = self.make_html_word( words[0] )\n            for word in words[1:]:\n                line = line + \" \" + self.make_html_word( word )\n            # convert `...' quotations into real left and right single quotes\n            line = re.sub( r\"(^|\\W)`(.*?)'(\\W|$)\",  \\\n                           r'\\1&lsquo;\\2&rsquo;\\3', \\\n                           line )\n            # convert tilde into non-breakable space\n            line = string.replace( line, \"~\", \"&nbsp;\" )\n\n        return para_header + line + para_footer\n\n    def  make_html_code( self, lines ):\n        \"\"\" convert a code sequence to HTML \"\"\"\n        line = code_header + '\\n'\n        for l in lines:\n            line = line + html_quote( l ) + '\\n'\n\n        return line + code_footer\n\n    def  make_html_items( self, items ):\n        \"\"\" convert a field's content into some valid HTML \"\"\"\n        lines = []\n        for item in items:\n            if item.lines:\n                lines.append( self.make_html_code( item.lines ) )\n            else:\n                lines.append( self.make_html_para( item.words ) )\n\n        return string.join( lines, '\\n' )\n\n    def  print_html_items( self, items ):\n        print self.make_html_items( items )\n\n    def  print_html_field( self, field ):\n        if field.name:\n            print \"<table><tr valign=top><td><b>\" + field.name + \"</b></td><td>\"\n\n        print self.make_html_items( field.items )\n\n        if field.name:\n            print \"</td></tr></table>\"\n\n    def  html_source_quote( self, line, block_name = None ):\n        result = \"\"\n        while line:\n            m = re_source_crossref.match( line )\n            if m:\n                name   = m.group( 2 )\n                prefix = html_quote( m.group( 1 ) )\n                length = len( m.group( 0 ) )\n\n                if name == block_name:\n                    # this is the current block name, if any\n                    result = result + prefix + '<b>' + name + '</b>'\n                elif re_source_keywords.match( name ):\n                    # this is a C keyword\n                    result = result + prefix + keyword_prefix + name + keyword_suffix\n                elif self.identifiers.has_key( name ):\n                    # this is a known identifier\n                    block = self.identifiers[name]\n                    result = result + prefix + '<a href=\"' + \\\n                             self.make_block_url( block ) + '\">' + name + '</a>'\n                else:\n                    result = result + html_quote( line[:length] )\n\n                line = line[length:]\n            else:\n                result = result + html_quote( line )\n                line   = []\n\n        return result\n\n    def  print_html_field_list( self, fields ):\n        print \"<p></p>\"\n        print \"<table cellpadding=3 border=0>\"\n        for field in fields:\n            if len( field.name ) > 22:\n              print \"<tr valign=top><td colspan=0><b>\" + field.name + \"</b></td></tr>\"\n              print \"<tr valign=top><td></td><td>\"\n            else:\n              print \"<tr valign=top><td><b>\" + field.name + \"</b></td><td>\"\n\n            self.print_html_items( field.items )\n            print \"</td></tr>\"\n        print \"</table>\"\n\n    def  print_html_markup( self, markup ):\n        table_fields = []\n        for field in markup.fields:\n            if field.name:\n                # we begin a new series of field or value definitions, we\n                # will record them in the 'table_fields' list before outputting\n                # all of them as a single table\n                #\n                table_fields.append( field )\n            else:\n                if table_fields:\n                    self.print_html_field_list( table_fields )\n                    table_fields = []\n\n                self.print_html_items( field.items )\n\n        if table_fields:\n            self.print_html_field_list( table_fields )\n\n    #\n    #  Formatting the index\n    #\n    def  index_enter( self ):\n        print self.html_index_header\n        self.index_items = {}\n\n    def  index_name_enter( self, name ):\n        block = self.identifiers[name]\n        url   = self.make_block_url( block )\n        self.index_items[name] = url\n\n    def  index_exit( self ):\n        # block_index already contains the sorted list of index names\n        count = len( self.block_index )\n        rows  = ( count + self.columns - 1 ) / self.columns\n\n        print \"<table align=center border=0 cellpadding=0 cellspacing=0>\"\n        for r in range( rows ):\n            line = \"<tr>\"\n            for c in range( self.columns ):\n                i = r + c * rows\n                if i < count:\n                    bname = self.block_index[r + c * rows]\n                    url   = self.index_items[bname]\n                    line = line + '<td><a href=\"' + url + '\">' + bname + '</a></td>'\n                else:\n                    line = line + '<td></td>'\n            line = line + \"</tr>\"\n            print line\n\n        print \"</table>\"\n\n        print index_footer_start +            \\\n              self.file_prefix + \"toc.html\" + \\\n              index_footer_end\n\n        print self.html_footer\n\n        self.index_items = {}\n\n    def  index_dump( self, index_filename = None ):\n        if index_filename == None:\n            index_filename = self.file_prefix + \"index.html\"\n\n        Formatter.index_dump( self, index_filename )\n\n    #\n    #  Formatting the table of content\n    #\n    def  toc_enter( self ):\n        print self.html_toc_header\n        print \"<center><h1>Table of Contents</h1></center>\"\n\n    def  toc_chapter_enter( self, chapter ):\n        print  chapter_header + string.join( chapter.title ) + chapter_inter\n        print \"<table cellpadding=5>\"\n\n    def  toc_section_enter( self, section ):\n        print '<tr valign=top><td class=\"left\">'\n        print '<a href=\"' + self.make_section_url( section ) + '\">' + \\\n               section.title + '</a></td><td>'\n\n        print self.make_html_para( section.abstract )\n\n    def  toc_section_exit( self, section ):\n        print \"</td></tr>\"\n\n    def  toc_chapter_exit( self, chapter ):\n        print \"</table>\"\n        print chapter_footer\n\n    def  toc_index( self, index_filename ):\n        print chapter_header +                                      \\\n              '<a href=\"' + index_filename + '\">Global Index</a>' + \\\n              chapter_inter + chapter_footer\n\n    def  toc_exit( self ):\n        print toc_footer_start +                \\\n              self.file_prefix + \"index.html\" + \\\n              toc_footer_end\n\n        print self.html_footer\n\n    def  toc_dump( self, toc_filename = None, index_filename = None ):\n        if toc_filename == None:\n            toc_filename = self.file_prefix + \"toc.html\"\n\n        if index_filename == None:\n            index_filename = self.file_prefix + \"index.html\"\n\n        Formatter.toc_dump( self, toc_filename, index_filename )\n\n    #\n    #  Formatting sections\n    #\n    def  section_enter( self, section ):\n        print self.html_header\n\n        print section_title_header\n        print section.title\n        print section_title_footer\n\n        maxwidth = 0\n        for b in section.blocks.values():\n            if len( b.name ) > maxwidth:\n                maxwidth = len( b.name )\n\n        width = 70  # XXX magic number\n        if maxwidth <> 0:\n            # print section synopsis\n            print section_synopsis_header\n            print \"<table align=center cellspacing=5 cellpadding=0 border=0>\"\n\n            columns = width / maxwidth\n            if columns < 1:\n                columns = 1\n\n            count = len( section.block_names )\n            rows  = ( count + columns - 1 ) / columns\n\n            for r in range( rows ):\n                line = \"<tr>\"\n                for c in range( columns ):\n                    i = r + c * rows\n                    line = line + '<td></td><td>'\n                    if i < count:\n                        name = section.block_names[i]\n                        line = line + '<a href=\"#' + name + '\">' + name + '</a>'\n\n                    line = line + '</td>'\n                line = line + \"</tr>\"\n                print line\n\n            print \"</table><br><br>\"\n            print section_synopsis_footer\n\n        print description_header\n        print self.make_html_items( section.description )\n        print description_footer\n\n    def  block_enter( self, block ):\n        print block_header\n\n        # place html anchor if needed\n        if block.name:\n            print '<h4><a name=\"' + block.name + '\">' + block.name + '</a></h4>'\n\n        # dump the block C source lines now\n        if block.code:\n            header = ''\n            for f in self.headers.keys():\n                if block.source.filename.find( f ) >= 0:\n                    header = self.headers[f] + ' (' + f + ')'\n                    break;\n\n#           if not header:\n#               sys.stderr.write( \\\n#                 'WARNING: No header macro for ' + block.source.filename + '.\\n' )\n\n            if header:\n                print header_location_header\n                print 'Defined in ' + header + '.'\n                print header_location_footer\n\n            print source_header\n            for l in block.code:\n                print self.html_source_quote( l, block.name )\n            print source_footer\n\n    def  markup_enter( self, markup, block ):\n        if markup.tag == \"description\":\n            print description_header\n        else:\n            print marker_header + markup.tag + marker_inter\n\n        self.print_html_markup( markup )\n\n    def  markup_exit( self, markup, block ):\n        if markup.tag == \"description\":\n            print description_footer\n        else:\n            print marker_footer\n\n    def  block_exit( self, block ):\n        print block_footer_start + self.file_prefix + \"index.html\" + \\\n              block_footer_middle + self.file_prefix + \"toc.html\" +  \\\n              block_footer_end\n\n    def  section_exit( self, section ):\n        print html_footer\n\n    def  section_dump_all( self ):\n        for section in self.sections:\n            self.section_dump( section, self.file_prefix + section.name + '.html' )\n\n# eof\n"
  },
  {
    "path": "libs/freetype/src/tools/docmaker/utils.py",
    "content": "#  Utils (c) 2002, 2004, 2007, 2008  David Turner <david@freetype.org>\n#\n\nimport string, sys, os, glob\n\n# current output directory\n#\noutput_dir = None\n\n\n# This function is used to sort the index.  It is a simple lexicographical\n# sort, except that it places capital letters before lowercase ones.\n#\ndef  index_sort( s1, s2 ):\n    if not s1:\n        return -1\n\n    if not s2:\n        return 1\n\n    l1 = len( s1 )\n    l2 = len( s2 )\n    m1 = string.lower( s1 )\n    m2 = string.lower( s2 )\n\n    for i in range( l1 ):\n        if i >= l2 or m1[i] > m2[i]:\n            return 1\n\n        if m1[i] < m2[i]:\n            return -1\n\n        if s1[i] < s2[i]:\n            return -1\n\n        if s1[i] > s2[i]:\n            return 1\n\n    if l2 > l1:\n        return -1\n\n    return 0\n\n\n# Sort input_list, placing the elements of order_list in front.\n#\ndef  sort_order_list( input_list, order_list ):\n    new_list = order_list[:]\n    for id in input_list:\n        if not id in order_list:\n            new_list.append( id )\n    return new_list\n\n\n# Open the standard output to a given project documentation file.  Use\n# \"output_dir\" to determine the filename location if necessary and save the\n# old stdout in a tuple that is returned by this function.\n#\ndef  open_output( filename ):\n    global output_dir\n\n    if output_dir and output_dir != \"\":\n        filename = output_dir + os.sep + filename\n\n    old_stdout = sys.stdout\n    new_file   = open( filename, \"w\" )\n    sys.stdout = new_file\n\n    return ( new_file, old_stdout )\n\n\n# Close the output that was returned by \"close_output\".\n#\ndef  close_output( output ):\n    output[0].close()\n    sys.stdout = output[1]\n\n\n# Check output directory.\n#\ndef  check_output():\n    global output_dir\n    if output_dir:\n        if output_dir != \"\":\n            if not os.path.isdir( output_dir ):\n                sys.stderr.write( \"argument\" + \" '\" + output_dir + \"' \" + \\\n                                  \"is not a valid directory\" )\n                sys.exit( 2 )\n        else:\n            output_dir = None\n\n\ndef  file_exists( pathname ):\n    \"\"\"checks that a given file exists\"\"\"\n    result = 1\n    try:\n        file = open( pathname, \"r\" )\n        file.close()\n    except:\n        result = None\n        sys.stderr.write( pathname + \" couldn't be accessed\\n\" )\n\n    return result\n\n\ndef  make_file_list( args = None ):\n    \"\"\"builds a list of input files from command-line arguments\"\"\"\n    file_list = []\n    # sys.stderr.write( repr( sys.argv[1 :] ) + '\\n' )\n\n    if not args:\n        args = sys.argv[1 :]\n\n    for pathname in args:\n        if string.find( pathname, '*' ) >= 0:\n            newpath = glob.glob( pathname )\n            newpath.sort()  # sort files -- this is important because\n                            # of the order of files\n        else:\n            newpath = [pathname]\n\n        file_list.extend( newpath )\n\n    if len( file_list ) == 0:\n        file_list = None\n    else:\n        # now filter the file list to remove non-existing ones\n        file_list = filter( file_exists, file_list )\n\n    return file_list\n\n# eof\n"
  },
  {
    "path": "libs/freetype/src/tools/ftrandom/Makefile",
    "content": "# TOP_DIR and OBJ_DIR should be set by the user to the right directories,\n# if necessary.\n\nTOP_DIR ?= ../../..\nOBJ_DIR ?= $(TOP_DIR)/objs\n\n\n# The setup below is for gcc on a Unix-like platform.\n\nSRC_DIR = $(TOP_DIR)/src/tools/ftrandom\n\nCC = gcc\nWFLAGS = -Wmissing-prototypes \\\n         -Wunused \\\n         -Wimplicit \\\n         -Wreturn-type \\\n         -Wparentheses \\\n         -pedantic \\\n         -Wformat \\\n         -Wchar-subscripts \\\n         -Wsequence-point\nCFLAGS = $(WFLAGS) \\\n         -g \\\n         -I $(TOP_DIR)/include\nLIBS = -lm \\\n       -L $(OBJ_DIR) \\\n       -lfreetype \\\n       -lz\n\nall: $(OBJ_DIR)/ftrandom\n\n$(OBJ_DIR)/ftrandom: $(SRC_DIR)/ftrandom.c $(OBJ_DIR)/libfreetype.a\n\t$(CC) -o $(OBJ_DIR)/ftrandom $(CFLAGS) $(SRC_DIR)/ftrandom.c $(LIBS)\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/tools/ftrandom/README",
    "content": "ftrandom\n--------\n\nThis program expects a set of directories containing good fonts, and a set\nof extensions of fonts to be tested.  It will randomly pick a font, copy it,\nintroduce and error and then test it.\n\nThe FreeType tests are quite basic:\n\n  For each erroneous font it\n    forks off a new tester;\n    initializes the library;\n    opens each font in the file;\n    loads each glyph;\n      (optionally reviewing the contours of the glyph)\n      (optionally rasterizing)\n    closes the face.\n\nIf the tester exits with a signal, or takes longer than 20 seconds then\nftrandom saves the erroneous font and continues.  If the tester exits\nnormally or with an error, then the superstructure removes the test font and\ncontinues.\n\nArguments are:\n\n  --all                    Test every font in the directory(ies) no matter\n                           what its extension (some CID-keyed fonts have no\n                           extension).\n  --check-outlines         Call FT_Outline_Decompose on each glyph.\n  --dir <dir>              Append <dir> to the list of directories to search\n                           for good fonts.\n  --error-count <cnt>      Introduce <cnt> single-byte errors into the\n                           erroneous fonts.\n  --error-fraction <frac>  Multiply the file size of the font by <frac> and\n                           introduce that many errors into the erroneous\n                           font file.\n  --ext <ext>              Add <ext> to the set of font types tested.  Known\n                           extensions are `ttf', `otf', `ttc', `cid', `pfb',\n                           `pfa', `bdf', `pcf', `pfr', `fon', `otb', and\n                           `cff'.\n  --help                   Print out this list of options.\n  --nohints                Specify FT_LOAD_NO_HINTING when loading glyphs.\n  --rasterize              Call FT_Render_Glyph as well as loading it.\n  --result <dir>           This is the directory in which test files are\n                           placed.\n  --test <file>            Run a single test on a pre-generated testcase.\n                           Done in the current process so it can be debugged\n                           more easily.\n"
  },
  {
    "path": "libs/freetype/src/tools/ftrandom/ftrandom.c",
    "content": "/* Copyright (C) 2005, 2007, 2008 by George Williams */\n/*\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n\n * The name of the author may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* modified by Werner Lemberg <wl@gnu.org>       */\n/* This file is now part of the FreeType library */\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <strings.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <sys/wait.h>\n#include <unistd.h>\n#include <dirent.h>\n#include <math.h>\n#include <signal.h>\n#include <time.h>\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_OUTLINE_H\n\n#define true     1\n#define false    0\n#define forever  for (;;)\n\n\n  static int    check_outlines = false;\n  static int    nohints        = false;\n  static int    rasterize      = false;\n  static char*  results_dir    = \"results\";\n\n#define GOOD_FONTS_DIR  \"/home/wl/freetype-testfonts\"\n\n  static char*  default_dir_list[] =\n  {\n    GOOD_FONTS_DIR,\n    NULL\n  };\n\n  static char*  default_ext_list[] =\n  {\n    \"ttf\",\n    \"otf\",\n    \"ttc\",\n    \"cid\",\n    \"pfb\",\n    \"pfa\",\n    \"bdf\",\n    \"pcf\",\n    \"pfr\",\n    \"fon\",\n    \"otb\",\n    \"cff\",\n    NULL\n  };\n\n  static int  error_count    = 1;\n  static int  error_fraction = 0;\n\n  static FT_F26Dot6  font_size = 12 * 64;\n\n  static struct fontlist\n  {\n    char*         name;\n    int           len;\n    unsigned int  isbinary: 1;\n    unsigned int  isascii: 1;\n    unsigned int  ishex: 1;\n\n  } *fontlist;\n\n  static int  fcnt;\n\n\n  static int\n  FT_MoveTo( const FT_Vector  *to,\n             void             *user )\n  {\n    return 0;\n  }\n\n\n  static int\n  FT_LineTo( const FT_Vector  *to,\n             void             *user )\n  {\n    return 0;\n  }\n\n\n  static int\n  FT_ConicTo( const FT_Vector  *_cp,\n              const FT_Vector  *to,\n              void             *user )\n  {\n    return 0;\n  }\n\n\n  static int\n  FT_CubicTo( const FT_Vector  *cp1,\n              const FT_Vector  *cp2,\n              const FT_Vector  *to,\n              void             *user )\n  {\n    return 0;\n  }\n\n\n  static FT_Outline_Funcs outlinefuncs =\n  {\n    FT_MoveTo,\n    FT_LineTo,\n    FT_ConicTo,\n    FT_CubicTo,\n    0, 0          /* No shift, no delta */\n  };\n\n\n  static void\n  TestFace( FT_Face  face )\n  {\n    int  gid;\n    int  load_flags = FT_LOAD_DEFAULT;\n\n\n    if ( check_outlines         &&\n         FT_IS_SCALABLE( face ) )\n      load_flags = FT_LOAD_NO_BITMAP;\n\n    if ( nohints )\n      load_flags |= FT_LOAD_NO_HINTING;\n\n    FT_Set_Char_Size( face, 0, font_size, 72, 72 );\n\n    for ( gid = 0; gid < face->num_glyphs; ++gid )\n    {\n      if ( check_outlines         &&\n           FT_IS_SCALABLE( face ) )\n      {\n        if ( !FT_Load_Glyph( face, gid, load_flags ) )\n          FT_Outline_Decompose( &face->glyph->outline, &outlinefuncs, NULL );\n      }\n      else\n        FT_Load_Glyph( face, gid, load_flags );\n\n      if ( rasterize )\n        FT_Render_Glyph( face->glyph, ft_render_mode_normal );\n    }\n\n    FT_Done_Face( face );\n  }\n\n\n  static void\n  ExecuteTest( char*  testfont )\n  {\n    FT_Library  context;\n    FT_Face     face;\n    int         i, num;\n\n\n    if ( FT_Init_FreeType( &context ) )\n    {\n      fprintf( stderr, \"Can't initialize FreeType.\\n\" );\n      exit( 1 );\n    }\n\n    if ( FT_New_Face( context, testfont, 0, &face ) )\n    {\n      /* The font is erroneous, so if this fails that's ok. */\n      exit( 0 );\n    }\n\n    if ( face->num_faces == 1 )\n      TestFace( face );\n    else\n    {\n      num = face->num_faces;\n      FT_Done_Face( face );\n\n      for ( i = 0; i < num; ++i )\n      {\n        if ( !FT_New_Face( context, testfont, i, &face ) )\n          TestFace( face );\n      }\n    }\n\n    exit( 0 );\n  }\n\n\n  static int\n  extmatch( char*   filename,\n            char**  extensions )\n  {\n    int    i;\n    char*  pt;\n\n\n    if ( extensions == NULL )\n      return true;\n\n    pt = strrchr( filename, '.' );\n    if ( pt == NULL )\n      return false;\n    if ( pt < strrchr( filename, '/' ) )\n      return false;\n\n    for ( i = 0; extensions[i] != NULL; ++i )\n      if ( strcasecmp( pt + 1, extensions[i] ) == 0 ||\n           strcasecmp( pt,     extensions[i] ) == 0 )\n        return true;\n\n    return false;\n  }\n\n\n  static void\n  figurefiletype( struct fontlist*  item )\n  {\n    FILE*  foo;\n\n\n    item->isbinary = item->isascii = item->ishex = false;\n\n    foo = fopen( item->name, \"rb\" );\n    if ( foo != NULL )\n    {\n      /* Try to guess the file type from the first few characters... */\n      int  ch1 = getc( foo );\n      int  ch2 = getc( foo );\n      int  ch3 = getc( foo );\n      int  ch4 = getc( foo );\n\n\n      fclose( foo );\n\n      if ( ( ch1 == 0   && ch2 == 1   && ch3 == 0   && ch4 == 0   ) ||\n           ( ch1 == 'O' && ch2 == 'T' && ch3 == 'T' && ch4 == 'O' ) ||\n           ( ch1 == 't' && ch2 == 'r' && ch3 == 'u' && ch4 == 'e' ) ||\n           ( ch1 == 't' && ch2 == 't' && ch3 == 'c' && ch4 == 'f' ) )\n      {\n        /* ttf, otf, ttc files */\n        item->isbinary = true;\n      }\n      else if ( ch1 == 0x80 && ch2 == '\\01' )\n      {\n        /* PFB header */\n        item->isbinary = true;\n      }\n      else if ( ch1 == '%' && ch2 == '!' )\n      {\n        /* Random PostScript */\n        if ( strstr( item->name, \".pfa\" ) != NULL ||\n             strstr( item->name, \".PFA\" ) != NULL )\n          item->ishex = true;\n        else\n          item->isascii = true;\n      }\n      else if ( ch1 == 1 && ch2 == 0 && ch3 == 4 )\n      {\n        /* Bare CFF */\n        item->isbinary = true;\n      }\n      else if ( ch1 == 'S' && ch2 == 'T' && ch3 == 'A' && ch4 == 'R' )\n      {\n        /* BDF */\n        item->ishex = true;\n      }\n      else if ( ch1 == 'P' && ch2 == 'F' && ch3 == 'R' && ch4 == '0' )\n      {\n        /* PFR */\n        item->isbinary = true;\n      }\n      else if ( ( ch1 == '\\1' && ch2 == 'f' && ch3 == 'c' && ch4 == 'p' ) ||\n                ( ch1 == 'M'  && ch2 == 'Z' )                             )\n      {\n        /* Windows FON */\n        item->isbinary = true;\n      }\n      else\n      {\n        fprintf( stderr,\n                 \"Can't recognize file type of `%s', assuming binary\\n\",\n                 item->name );\n        item->isbinary = true;\n      }\n    }\n    else\n    {\n      fprintf( stderr, \"Can't open `%s' for typing the file.\\n\",\n               item->name );\n      item->isbinary = true;\n    }\n  }\n\n\n  static void\n  FindFonts( char**  fontdirs,\n             char**  extensions )\n  {\n    DIR*            examples;\n    struct dirent*  ent;\n\n    int             i, max;\n    char            buffer[1025];\n    struct stat     statb;\n\n\n    max  = 0;\n    fcnt = 0;\n\n    for ( i = 0; fontdirs[i] != NULL; ++i )\n    {\n      examples = opendir( fontdirs[i] );\n      if ( examples == NULL )\n      {\n        fprintf( stderr,\n                 \"Can't open example font directory `%s'\\n\",\n                 fontdirs[i] );\n        exit( 1 );\n      }\n\n      while ( ( ent = readdir( examples ) ) != NULL )\n      {\n        snprintf( buffer, sizeof ( buffer ),\n                  \"%s/%s\", fontdirs[i], ent->d_name );\n        if ( stat( buffer, &statb ) == -1 || S_ISDIR( statb.st_mode ) )\n          continue;\n        if ( extensions == NULL || extmatch( buffer, extensions ) )\n        {\n          if ( fcnt >= max )\n          {\n            max += 100;\n            fontlist = realloc( fontlist, max * sizeof ( struct fontlist ) );\n            if ( fontlist == NULL )\n            {\n              fprintf( stderr, \"Can't allocate memory\\n\" );\n              exit( 1 );\n            }\n          }\n\n          fontlist[fcnt].name = strdup( buffer );\n          fontlist[fcnt].len  = statb.st_size;\n\n          figurefiletype( &fontlist[fcnt] );\n          ++fcnt;\n        }\n      }\n\n      closedir( examples );\n    }\n\n    if ( fcnt == 0 )\n    {\n      fprintf( stderr, \"Can't find matching font files.\\n\" );\n      exit( 1 );\n    }\n\n    fontlist[fcnt].name = NULL;\n  }\n\n\n  static int\n  getErrorCnt( struct fontlist*  item )\n  {\n    if ( error_count == 0 && error_fraction == 0 )\n      return 0;\n\n    return error_count + ceil( error_fraction * item->len );\n  }\n\n\n  static int\n  getRandom( int  low,\n             int  high )\n  {\n    if ( low - high < 0x10000L )\n      return low + ( ( random() >> 8 ) % ( high + 1 - low ) );\n\n    return low + ( random() % ( high + 1 - low ) );\n  }\n\n\n  static int\n  copyfont( struct fontlist*  item,\n            char*             newfont )\n  {\n    static char  buffer[8096];\n    FILE         *good, *new;\n    int          len;\n    int          i, err_cnt;\n\n\n    good = fopen( item->name, \"r\" );\n    if ( good == NULL )\n    {\n      fprintf( stderr, \"Can't open `%s'\\n\", item->name );\n      return false;\n    }\n\n    new = fopen( newfont, \"w+\" );\n    if ( new == NULL )\n    {\n      fprintf( stderr, \"Can't create temporary output file `%s'\\n\",\n               newfont );\n      exit( 1 );\n    }\n\n    while ( ( len = fread( buffer, 1, sizeof ( buffer ), good ) ) > 0 )\n      fwrite( buffer, 1, len, new );\n\n    fclose( good );\n\n    err_cnt = getErrorCnt( item );\n    for ( i = 0; i < err_cnt; ++i )\n    {\n      fseek( new, getRandom( 0, item->len - 1 ), SEEK_SET );\n\n      if ( item->isbinary )\n        putc( getRandom( 0, 0xff ), new );\n      else if ( item->isascii )\n        putc( getRandom( 0x20, 0x7e ), new );\n      else\n      {\n        int  hex = getRandom( 0, 15 );\n\n\n        if ( hex < 10 )\n          hex += '0';\n        else\n          hex += 'A' - 10;\n\n        putc( hex, new );\n      }\n    }\n\n    if ( ferror( new ) )\n    {\n      fclose( new );\n      unlink( newfont );\n      return false;\n    }\n\n    fclose( new );\n\n    return true;\n  }\n\n\n  static int  child_pid;\n\n  static void\n  abort_test( int  sig )\n  {\n    /* If a time-out happens, then kill the child */\n    kill( child_pid, SIGFPE );\n    write( 2, \"Timeout... \", 11 );\n  }\n\n\n  static void\n  do_test( void )\n  {\n    int         i        = getRandom( 0, fcnt - 1 );\n    static int  test_num = 0;\n    char        buffer[1024];\n\n\n    sprintf( buffer, \"%s/test%d\", results_dir, test_num++ );\n\n    if ( copyfont ( &fontlist[i], buffer ) )\n    {\n      signal( SIGALRM, abort_test );\n      /* Anything that takes more than 20 seconds */\n      /* to parse and/or rasterize is an error.   */\n      alarm( 20 );\n      if ( ( child_pid = fork() ) == 0 )\n        ExecuteTest( buffer );\n      else if ( child_pid != -1 )\n      {\n        int  status;\n\n\n        waitpid( child_pid, &status, 0 );\n        alarm( 0 );\n        if ( WIFSIGNALED ( status ) )\n          printf( \"Error found in file `%s'\\n\", buffer );\n        else\n          unlink( buffer );\n      }\n      else\n      {\n        fprintf( stderr, \"Can't fork test case.\\n\" );\n        exit( 1 );\n      }\n      alarm( 0 );\n    }\n  }\n\n\n  static void\n  usage( FILE*  out,\n         char*  name )\n  {\n    fprintf( out, \"%s [options] -- Generate random erroneous fonts\\n\"\n                  \"  and attempt to parse them with FreeType.\\n\\n\", name );\n\n    fprintf( out, \"  --all                    All non-directory files are assumed to be fonts.\\n\" );\n    fprintf( out, \"  --check-outlines         Make sure we can parse the outlines of each glyph.\\n\" );\n    fprintf( out, \"  --dir <path>             Append <path> to list of font search directories.\\n\" );\n    fprintf( out, \"  --error-count <cnt>      Introduce <cnt> single byte errors into each font.\\n\" );\n    fprintf( out, \"  --error-fraction <frac>  Introduce <frac>*filesize single byte errors\\n\"\n                  \"                           into each font.\\n\" );\n    fprintf( out, \"  --ext <ext>              Add <ext> to list of extensions indicating fonts.\\n\" );\n    fprintf( out, \"  --help                   Print this.\\n\" );\n    fprintf( out, \"  --nohints                Turn off hinting.\\n\" );\n    fprintf( out, \"  --rasterize              Attempt to rasterize each glyph.\\n\" );\n    fprintf( out, \"  --results <dir>          Directory in which to place the test fonts.\\n\" );\n    fprintf( out, \"  --size <float>           Use the given font size for the tests.\\n\" );\n    fprintf( out, \"  --test <file>            Run a single test on an already existing file.\\n\" );\n  }\n\n\n  int\n  main( int     argc,\n        char**  argv )\n  {\n    char    **dirs, **exts;\n    char    *pt, *end;\n    int     dcnt = 0, ecnt = 0, rset = false, allexts = false;\n    int     i;\n    time_t  now;\n    char*   testfile = NULL;\n\n\n    dirs = calloc( argc + 1, sizeof ( char ** ) );\n    exts = calloc( argc + 1, sizeof ( char ** ) );\n\n    for ( i = 1; i < argc; ++i )\n    {\n      pt = argv[i];\n      if ( pt[0] == '-' && pt[1] == '-' )\n        ++pt;\n\n      if ( strcmp( pt, \"-all\" ) == 0 )\n        allexts = true;\n      else if ( strcmp( pt, \"-check-outlines\" ) == 0 )\n        check_outlines = true;\n      else if ( strcmp( pt, \"-dir\" ) == 0 )\n        dirs[dcnt++] = argv[++i];\n      else if ( strcmp( pt, \"-error-count\" ) == 0 )\n      {\n        if ( !rset )\n          error_fraction = 0;\n        rset = true;\n        error_count = strtol( argv[++i], &end, 10 );\n        if ( *end != '\\0' )\n        {\n          fprintf( stderr, \"Bad value for error-count: %s\\n\", argv[i] );\n          exit( 1 );\n        }\n      }\n      else if ( strcmp( pt, \"-error-fraction\" ) == 0 )\n      {\n        if ( !rset )\n          error_count = 0;\n        rset = true;\n        error_fraction = strtod( argv[++i], &end );\n        if ( *end != '\\0' )\n        {\n          fprintf( stderr, \"Bad value for error-fraction: %s\\n\", argv[i] );\n          exit( 1 );\n        }\n      }\n      else if ( strcmp( pt, \"-ext\" ) == 0 )\n        exts[ecnt++] = argv[++i];\n      else if ( strcmp( pt, \"-help\" ) == 0 )\n      {\n        usage( stdout, argv[0] );\n        exit( 0 );\n      }\n      else if ( strcmp( pt, \"-nohints\" ) == 0 )\n        nohints = true;\n      else if ( strcmp( pt, \"-rasterize\" ) == 0 )\n        rasterize = true;\n      else if ( strcmp( pt, \"-results\" ) == 0 )\n        results_dir = argv[++i];\n      else if ( strcmp( pt, \"-size\" ) == 0 )\n      {\n        font_size = (FT_F26Dot6)( strtod( argv[++i], &end ) * 64 );\n        if ( *end != '\\0' || font_size < 64 )\n        {\n          fprintf( stderr, \"Bad value for size: %s\\n\", argv[i] );\n          exit( 1 );\n        }\n      }\n      else if ( strcmp( pt, \"-test\" ) == 0 )\n        testfile = argv[++i];\n      else\n      {\n        usage( stderr, argv[0] );\n        exit( 1 );\n      }\n    }\n\n    if ( allexts )\n      exts = NULL;\n    else if ( ecnt == 0 )\n      exts = default_ext_list;\n\n    if ( dcnt == 0 )\n      dirs = default_dir_list;\n\n    if ( testfile != NULL )\n      ExecuteTest( testfile );         /* This should never return */\n\n    time( &now );\n    srandom( now );\n\n    FindFonts( dirs, exts );\n    mkdir( results_dir, 0755 );\n\n    forever\n      do_test();\n\n    return 0;\n  }\n\n\n/* EOF */\n"
  },
  {
    "path": "libs/freetype/src/tools/glnames.py",
    "content": "#!/usr/bin/env python\n#\n\n#\n# FreeType 2 glyph name builder\n#\n\n\n# Copyright 1996-2000, 2003, 2005, 2007, 2008, 2011 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n\"\"\"\\\n\nusage: %s <output-file>\n\n  This python script generates the glyph names tables defined in the\n  `psnames' module.\n\n  Its single argument is the name of the header file to be created.\n\"\"\"\n\n\nimport sys, string, struct, re, os.path\n\n\n# This table lists the glyphs according to the Macintosh specification.\n# It is used by the TrueType Postscript names table.\n#\n# See\n#\n#   http://fonts.apple.com/TTRefMan/RM06/Chap6post.html\n#\n# for the official list.\n#\nmac_standard_names = \\\n[\n  # 0\n  \".notdef\", \".null\", \"nonmarkingreturn\", \"space\", \"exclam\",\n  \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\",\n\n  # 10\n  \"quotesingle\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\",\n  \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\",\n\n  # 20\n  \"one\", \"two\", \"three\", \"four\", \"five\",\n  \"six\", \"seven\", \"eight\", \"nine\", \"colon\",\n\n  # 30\n  \"semicolon\", \"less\", \"equal\", \"greater\", \"question\",\n  \"at\", \"A\", \"B\", \"C\", \"D\",\n\n  # 40\n  \"E\", \"F\", \"G\", \"H\", \"I\",\n  \"J\", \"K\", \"L\", \"M\", \"N\",\n\n  # 50\n  \"O\", \"P\", \"Q\", \"R\", \"S\",\n  \"T\", \"U\", \"V\", \"W\", \"X\",\n\n  # 60\n  \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\",\n  \"asciicircum\", \"underscore\", \"grave\", \"a\", \"b\",\n\n  # 70\n  \"c\", \"d\", \"e\", \"f\", \"g\",\n  \"h\", \"i\", \"j\", \"k\", \"l\",\n\n  # 80\n  \"m\", \"n\", \"o\", \"p\", \"q\",\n  \"r\", \"s\", \"t\", \"u\", \"v\",\n\n  # 90\n  \"w\", \"x\", \"y\", \"z\", \"braceleft\",\n  \"bar\", \"braceright\", \"asciitilde\", \"Adieresis\", \"Aring\",\n\n  # 100\n  \"Ccedilla\", \"Eacute\", \"Ntilde\", \"Odieresis\", \"Udieresis\",\n  \"aacute\", \"agrave\", \"acircumflex\", \"adieresis\", \"atilde\",\n\n  # 110\n  \"aring\", \"ccedilla\", \"eacute\", \"egrave\", \"ecircumflex\",\n  \"edieresis\", \"iacute\", \"igrave\", \"icircumflex\", \"idieresis\",\n\n  # 120\n  \"ntilde\", \"oacute\", \"ograve\", \"ocircumflex\", \"odieresis\",\n  \"otilde\", \"uacute\", \"ugrave\", \"ucircumflex\", \"udieresis\",\n\n  # 130\n  \"dagger\", \"degree\", \"cent\", \"sterling\", \"section\",\n  \"bullet\", \"paragraph\", \"germandbls\", \"registered\", \"copyright\",\n\n  # 140\n  \"trademark\", \"acute\", \"dieresis\", \"notequal\", \"AE\",\n  \"Oslash\", \"infinity\", \"plusminus\", \"lessequal\", \"greaterequal\",\n\n  # 150\n  \"yen\", \"mu\", \"partialdiff\", \"summation\", \"product\",\n  \"pi\", \"integral\", \"ordfeminine\", \"ordmasculine\", \"Omega\",\n\n  # 160\n  \"ae\", \"oslash\", \"questiondown\", \"exclamdown\", \"logicalnot\",\n  \"radical\", \"florin\", \"approxequal\", \"Delta\", \"guillemotleft\",\n\n  # 170\n  \"guillemotright\", \"ellipsis\", \"nonbreakingspace\", \"Agrave\", \"Atilde\",\n  \"Otilde\", \"OE\", \"oe\", \"endash\", \"emdash\",\n\n  # 180\n  \"quotedblleft\", \"quotedblright\", \"quoteleft\", \"quoteright\", \"divide\",\n  \"lozenge\", \"ydieresis\", \"Ydieresis\", \"fraction\", \"currency\",\n\n  # 190\n  \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"daggerdbl\",\n  \"periodcentered\", \"quotesinglbase\", \"quotedblbase\", \"perthousand\",\n    \"Acircumflex\",\n\n  # 200\n  \"Ecircumflex\", \"Aacute\", \"Edieresis\", \"Egrave\", \"Iacute\",\n  \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Oacute\", \"Ocircumflex\",\n\n  # 210\n  \"apple\", \"Ograve\", \"Uacute\", \"Ucircumflex\", \"Ugrave\",\n  \"dotlessi\", \"circumflex\", \"tilde\", \"macron\", \"breve\",\n\n  # 220\n  \"dotaccent\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\",\n  \"caron\", \"Lslash\", \"lslash\", \"Scaron\", \"scaron\",\n\n  # 230\n  \"Zcaron\", \"zcaron\", \"brokenbar\", \"Eth\", \"eth\",\n  \"Yacute\", \"yacute\", \"Thorn\", \"thorn\", \"minus\",\n\n  # 240\n  \"multiply\", \"onesuperior\", \"twosuperior\", \"threesuperior\", \"onehalf\",\n  \"onequarter\", \"threequarters\", \"franc\", \"Gbreve\", \"gbreve\",\n\n  # 250\n  \"Idotaccent\", \"Scedilla\", \"scedilla\", \"Cacute\", \"cacute\",\n  \"Ccaron\", \"ccaron\", \"dcroat\"\n]\n\n\n# The list of standard `SID' glyph names.  For the official list,\n# see Annex A of document at\n#\n#   http://partners.adobe.com/public/developer/en/font/5176.CFF.pdf  .\n#\nsid_standard_names = \\\n[\n  # 0\n  \".notdef\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\",\n  \"dollar\", \"percent\", \"ampersand\", \"quoteright\", \"parenleft\",\n\n  # 10\n  \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\",\n  \"period\", \"slash\", \"zero\", \"one\", \"two\",\n\n  # 20\n  \"three\", \"four\", \"five\", \"six\", \"seven\",\n  \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\",\n\n  # 30\n  \"equal\", \"greater\", \"question\", \"at\", \"A\",\n  \"B\", \"C\", \"D\", \"E\", \"F\",\n\n  # 40\n  \"G\", \"H\", \"I\", \"J\", \"K\",\n  \"L\", \"M\", \"N\", \"O\", \"P\",\n\n  # 50\n  \"Q\", \"R\", \"S\", \"T\", \"U\",\n  \"V\", \"W\", \"X\", \"Y\", \"Z\",\n\n  # 60\n  \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\",\n  \"quoteleft\", \"a\", \"b\", \"c\", \"d\",\n\n  # 70\n  \"e\", \"f\", \"g\", \"h\", \"i\",\n  \"j\", \"k\", \"l\", \"m\", \"n\",\n\n  # 80\n  \"o\", \"p\", \"q\", \"r\", \"s\",\n  \"t\", \"u\", \"v\", \"w\", \"x\",\n\n  # 90\n  \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\",\n  \"asciitilde\", \"exclamdown\", \"cent\", \"sterling\", \"fraction\",\n\n  # 100\n  \"yen\", \"florin\", \"section\", \"currency\", \"quotesingle\",\n  \"quotedblleft\", \"guillemotleft\", \"guilsinglleft\", \"guilsinglright\", \"fi\",\n\n  # 110\n  \"fl\", \"endash\", \"dagger\", \"daggerdbl\", \"periodcentered\",\n  \"paragraph\", \"bullet\", \"quotesinglbase\", \"quotedblbase\", \"quotedblright\",\n\n  # 120\n  \"guillemotright\", \"ellipsis\", \"perthousand\", \"questiondown\", \"grave\",\n  \"acute\", \"circumflex\", \"tilde\", \"macron\", \"breve\",\n\n  # 130\n  \"dotaccent\", \"dieresis\", \"ring\", \"cedilla\", \"hungarumlaut\",\n  \"ogonek\", \"caron\", \"emdash\", \"AE\", \"ordfeminine\",\n\n  # 140\n  \"Lslash\", \"Oslash\", \"OE\", \"ordmasculine\", \"ae\",\n  \"dotlessi\", \"lslash\", \"oslash\", \"oe\", \"germandbls\",\n\n  # 150\n  \"onesuperior\", \"logicalnot\", \"mu\", \"trademark\", \"Eth\",\n  \"onehalf\", \"plusminus\", \"Thorn\", \"onequarter\", \"divide\",\n\n  # 160\n  \"brokenbar\", \"degree\", \"thorn\", \"threequarters\", \"twosuperior\",\n  \"registered\", \"minus\", \"eth\", \"multiply\", \"threesuperior\",\n\n  # 170\n  \"copyright\", \"Aacute\", \"Acircumflex\", \"Adieresis\", \"Agrave\",\n  \"Aring\", \"Atilde\", \"Ccedilla\", \"Eacute\", \"Ecircumflex\",\n\n  # 180\n  \"Edieresis\", \"Egrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\",\n  \"Igrave\", \"Ntilde\", \"Oacute\", \"Ocircumflex\", \"Odieresis\",\n\n  # 190\n  \"Ograve\", \"Otilde\", \"Scaron\", \"Uacute\", \"Ucircumflex\",\n  \"Udieresis\", \"Ugrave\", \"Yacute\", \"Ydieresis\", \"Zcaron\",\n\n  # 200\n  \"aacute\", \"acircumflex\", \"adieresis\", \"agrave\", \"aring\",\n  \"atilde\", \"ccedilla\", \"eacute\", \"ecircumflex\", \"edieresis\",\n\n  # 210\n  \"egrave\", \"iacute\", \"icircumflex\", \"idieresis\", \"igrave\",\n  \"ntilde\", \"oacute\", \"ocircumflex\", \"odieresis\", \"ograve\",\n\n  # 220\n  \"otilde\", \"scaron\", \"uacute\", \"ucircumflex\", \"udieresis\",\n  \"ugrave\", \"yacute\", \"ydieresis\", \"zcaron\", \"exclamsmall\",\n\n  # 230\n  \"Hungarumlautsmall\", \"dollaroldstyle\", \"dollarsuperior\", \"ampersandsmall\",\n    \"Acutesmall\",\n  \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\",\n    \"onedotenleader\", \"zerooldstyle\",\n\n  # 240\n  \"oneoldstyle\", \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\",\n    \"fiveoldstyle\",\n  \"sixoldstyle\", \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\",\n    \"commasuperior\",\n\n  # 250\n  \"threequartersemdash\", \"periodsuperior\", \"questionsmall\", \"asuperior\",\n    \"bsuperior\",\n  \"centsuperior\", \"dsuperior\", \"esuperior\", \"isuperior\", \"lsuperior\",\n\n  # 260\n  \"msuperior\", \"nsuperior\", \"osuperior\", \"rsuperior\", \"ssuperior\",\n  \"tsuperior\", \"ff\", \"ffi\", \"ffl\", \"parenleftinferior\",\n\n  # 270\n  \"parenrightinferior\", \"Circumflexsmall\", \"hyphensuperior\", \"Gravesmall\",\n    \"Asmall\",\n  \"Bsmall\", \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\",\n\n  # 280\n  \"Gsmall\", \"Hsmall\", \"Ismall\", \"Jsmall\", \"Ksmall\",\n  \"Lsmall\", \"Msmall\", \"Nsmall\", \"Osmall\", \"Psmall\",\n\n  # 290\n  \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\",\n  \"Vsmall\", \"Wsmall\", \"Xsmall\", \"Ysmall\", \"Zsmall\",\n\n  # 300\n  \"colonmonetary\", \"onefitted\", \"rupiah\", \"Tildesmall\", \"exclamdownsmall\",\n  \"centoldstyle\", \"Lslashsmall\", \"Scaronsmall\", \"Zcaronsmall\",\n    \"Dieresissmall\",\n\n  # 310\n  \"Brevesmall\", \"Caronsmall\", \"Dotaccentsmall\", \"Macronsmall\", \"figuredash\",\n  \"hypheninferior\", \"Ogoneksmall\", \"Ringsmall\", \"Cedillasmall\",\n    \"questiondownsmall\",\n\n  # 320\n  \"oneeighth\", \"threeeighths\", \"fiveeighths\", \"seveneighths\", \"onethird\",\n  \"twothirds\", \"zerosuperior\", \"foursuperior\", \"fivesuperior\",\n    \"sixsuperior\",\n\n  # 330\n  \"sevensuperior\", \"eightsuperior\", \"ninesuperior\", \"zeroinferior\",\n    \"oneinferior\",\n  \"twoinferior\", \"threeinferior\", \"fourinferior\", \"fiveinferior\",\n    \"sixinferior\",\n\n  # 340\n  \"seveninferior\", \"eightinferior\", \"nineinferior\", \"centinferior\",\n    \"dollarinferior\",\n  \"periodinferior\", \"commainferior\", \"Agravesmall\", \"Aacutesmall\",\n    \"Acircumflexsmall\",\n\n  # 350\n  \"Atildesmall\", \"Adieresissmall\", \"Aringsmall\", \"AEsmall\", \"Ccedillasmall\",\n  \"Egravesmall\", \"Eacutesmall\", \"Ecircumflexsmall\", \"Edieresissmall\",\n    \"Igravesmall\",\n\n  # 360\n  \"Iacutesmall\", \"Icircumflexsmall\", \"Idieresissmall\", \"Ethsmall\",\n    \"Ntildesmall\",\n  \"Ogravesmall\", \"Oacutesmall\", \"Ocircumflexsmall\", \"Otildesmall\",\n    \"Odieresissmall\",\n\n  # 370\n  \"OEsmall\", \"Oslashsmall\", \"Ugravesmall\", \"Uacutesmall\",\n    \"Ucircumflexsmall\",\n  \"Udieresissmall\", \"Yacutesmall\", \"Thornsmall\", \"Ydieresissmall\",\n    \"001.000\",\n\n  # 380\n  \"001.001\", \"001.002\", \"001.003\", \"Black\", \"Bold\",\n  \"Book\", \"Light\", \"Medium\", \"Regular\", \"Roman\",\n\n  # 390\n  \"Semibold\"\n]\n\n\n# This table maps character codes of the Adobe Standard Type 1\n# encoding to glyph indices in the sid_standard_names table.\n#\nt1_standard_encoding = \\\n[\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   1,   2,   3,   4,   5,   6,   7,   8,\n    9,  10,  11,  12,  13,  14,  15,  16,  17,  18,\n\n   19,  20,  21,  22,  23,  24,  25,  26,  27,  28,\n   29,  30,  31,  32,  33,  34,  35,  36,  37,  38,\n   39,  40,  41,  42,  43,  44,  45,  46,  47,  48,\n   49,  50,  51,  52,  53,  54,  55,  56,  57,  58,\n   59,  60,  61,  62,  63,  64,  65,  66,  67,  68,\n\n   69,  70,  71,  72,  73,  74,  75,  76,  77,  78,\n   79,  80,  81,  82,  83,  84,  85,  86,  87,  88,\n   89,  90,  91,  92,  93,  94,  95,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,  96,  97,  98,  99, 100, 101, 102, 103, 104,\n  105, 106, 107, 108, 109, 110,   0, 111, 112, 113,\n  114,   0, 115, 116, 117, 118, 119, 120, 121, 122,\n    0, 123,   0, 124, 125, 126, 127, 128, 129, 130,\n\n  131,   0, 132, 133,   0, 134, 135, 136, 137,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0, 138,   0, 139,   0,   0,\n    0,   0, 140, 141, 142, 143,   0,   0,   0,   0,\n    0, 144,   0,   0,   0, 145,   0,   0, 146, 147,\n\n  148, 149,   0,   0,   0,   0\n]\n\n\n# This table maps character codes of the Adobe Expert Type 1\n# encoding to glyph indices in the sid_standard_names table.\n#\nt1_expert_encoding = \\\n[\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   1, 229, 230,   0, 231, 232, 233, 234,\n  235, 236, 237, 238,  13,  14,  15,  99, 239, 240,\n\n  241, 242, 243, 244, 245, 246, 247, 248,  27,  28,\n  249, 250, 251, 252,   0, 253, 254, 255, 256, 257,\n    0,   0,   0, 258,   0,   0, 259, 260, 261, 262,\n    0,   0, 263, 264, 265,   0, 266, 109, 110, 267,\n  268, 269,   0, 270, 271, 272, 273, 274, 275, 276,\n\n  277, 278, 279, 280, 281, 282, 283, 284, 285, 286,\n  287, 288, 289, 290, 291, 292, 293, 294, 295, 296,\n  297, 298, 299, 300, 301, 302, 303,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0, 304, 305, 306,   0,   0, 307, 308, 309, 310,\n  311,   0, 312,   0,   0, 313,   0,   0, 314, 315,\n    0,   0, 316, 317, 318,   0,   0,   0, 158, 155,\n  163, 319, 320, 321, 322, 323, 324, 325,   0,   0,\n\n  326, 150, 164, 169, 327, 328, 329, 330, 331, 332,\n  333, 334, 335, 336, 337, 338, 339, 340, 341, 342,\n  343, 344, 345, 346, 347, 348, 349, 350, 351, 352,\n  353, 354, 355, 356, 357, 358, 359, 360, 361, 362,\n  363, 364, 365, 366, 367, 368, 369, 370, 371, 372,\n\n  373, 374, 375, 376, 377, 378\n]\n\n\n# This data has been taken literally from the files `glyphlist.txt'\n# and `zapfdingbats.txt' version 2.0, Sept 2002.  It is available from\n#\n#   http://sourceforge.net/adobe/aglfn/\n#\nadobe_glyph_list = \"\"\"\\\nA;0041\nAE;00C6\nAEacute;01FC\nAEmacron;01E2\nAEsmall;F7E6\nAacute;00C1\nAacutesmall;F7E1\nAbreve;0102\nAbreveacute;1EAE\nAbrevecyrillic;04D0\nAbrevedotbelow;1EB6\nAbrevegrave;1EB0\nAbrevehookabove;1EB2\nAbrevetilde;1EB4\nAcaron;01CD\nAcircle;24B6\nAcircumflex;00C2\nAcircumflexacute;1EA4\nAcircumflexdotbelow;1EAC\nAcircumflexgrave;1EA6\nAcircumflexhookabove;1EA8\nAcircumflexsmall;F7E2\nAcircumflextilde;1EAA\nAcute;F6C9\nAcutesmall;F7B4\nAcyrillic;0410\nAdblgrave;0200\nAdieresis;00C4\nAdieresiscyrillic;04D2\nAdieresismacron;01DE\nAdieresissmall;F7E4\nAdotbelow;1EA0\nAdotmacron;01E0\nAgrave;00C0\nAgravesmall;F7E0\nAhookabove;1EA2\nAiecyrillic;04D4\nAinvertedbreve;0202\nAlpha;0391\nAlphatonos;0386\nAmacron;0100\nAmonospace;FF21\nAogonek;0104\nAring;00C5\nAringacute;01FA\nAringbelow;1E00\nAringsmall;F7E5\nAsmall;F761\nAtilde;00C3\nAtildesmall;F7E3\nAybarmenian;0531\nB;0042\nBcircle;24B7\nBdotaccent;1E02\nBdotbelow;1E04\nBecyrillic;0411\nBenarmenian;0532\nBeta;0392\nBhook;0181\nBlinebelow;1E06\nBmonospace;FF22\nBrevesmall;F6F4\nBsmall;F762\nBtopbar;0182\nC;0043\nCaarmenian;053E\nCacute;0106\nCaron;F6CA\nCaronsmall;F6F5\nCcaron;010C\nCcedilla;00C7\nCcedillaacute;1E08\nCcedillasmall;F7E7\nCcircle;24B8\nCcircumflex;0108\nCdot;010A\nCdotaccent;010A\nCedillasmall;F7B8\nChaarmenian;0549\nCheabkhasiancyrillic;04BC\nChecyrillic;0427\nChedescenderabkhasiancyrillic;04BE\nChedescendercyrillic;04B6\nChedieresiscyrillic;04F4\nCheharmenian;0543\nChekhakassiancyrillic;04CB\nCheverticalstrokecyrillic;04B8\nChi;03A7\nChook;0187\nCircumflexsmall;F6F6\nCmonospace;FF23\nCoarmenian;0551\nCsmall;F763\nD;0044\nDZ;01F1\nDZcaron;01C4\nDaarmenian;0534\nDafrican;0189\nDcaron;010E\nDcedilla;1E10\nDcircle;24B9\nDcircumflexbelow;1E12\nDcroat;0110\nDdotaccent;1E0A\nDdotbelow;1E0C\nDecyrillic;0414\nDeicoptic;03EE\nDelta;2206\nDeltagreek;0394\nDhook;018A\nDieresis;F6CB\nDieresisAcute;F6CC\nDieresisGrave;F6CD\nDieresissmall;F7A8\nDigammagreek;03DC\nDjecyrillic;0402\nDlinebelow;1E0E\nDmonospace;FF24\nDotaccentsmall;F6F7\nDslash;0110\nDsmall;F764\nDtopbar;018B\nDz;01F2\nDzcaron;01C5\nDzeabkhasiancyrillic;04E0\nDzecyrillic;0405\nDzhecyrillic;040F\nE;0045\nEacute;00C9\nEacutesmall;F7E9\nEbreve;0114\nEcaron;011A\nEcedillabreve;1E1C\nEcharmenian;0535\nEcircle;24BA\nEcircumflex;00CA\nEcircumflexacute;1EBE\nEcircumflexbelow;1E18\nEcircumflexdotbelow;1EC6\nEcircumflexgrave;1EC0\nEcircumflexhookabove;1EC2\nEcircumflexsmall;F7EA\nEcircumflextilde;1EC4\nEcyrillic;0404\nEdblgrave;0204\nEdieresis;00CB\nEdieresissmall;F7EB\nEdot;0116\nEdotaccent;0116\nEdotbelow;1EB8\nEfcyrillic;0424\nEgrave;00C8\nEgravesmall;F7E8\nEharmenian;0537\nEhookabove;1EBA\nEightroman;2167\nEinvertedbreve;0206\nEiotifiedcyrillic;0464\nElcyrillic;041B\nElevenroman;216A\nEmacron;0112\nEmacronacute;1E16\nEmacrongrave;1E14\nEmcyrillic;041C\nEmonospace;FF25\nEncyrillic;041D\nEndescendercyrillic;04A2\nEng;014A\nEnghecyrillic;04A4\nEnhookcyrillic;04C7\nEogonek;0118\nEopen;0190\nEpsilon;0395\nEpsilontonos;0388\nErcyrillic;0420\nEreversed;018E\nEreversedcyrillic;042D\nEscyrillic;0421\nEsdescendercyrillic;04AA\nEsh;01A9\nEsmall;F765\nEta;0397\nEtarmenian;0538\nEtatonos;0389\nEth;00D0\nEthsmall;F7F0\nEtilde;1EBC\nEtildebelow;1E1A\nEuro;20AC\nEzh;01B7\nEzhcaron;01EE\nEzhreversed;01B8\nF;0046\nFcircle;24BB\nFdotaccent;1E1E\nFeharmenian;0556\nFeicoptic;03E4\nFhook;0191\nFitacyrillic;0472\nFiveroman;2164\nFmonospace;FF26\nFourroman;2163\nFsmall;F766\nG;0047\nGBsquare;3387\nGacute;01F4\nGamma;0393\nGammaafrican;0194\nGangiacoptic;03EA\nGbreve;011E\nGcaron;01E6\nGcedilla;0122\nGcircle;24BC\nGcircumflex;011C\nGcommaaccent;0122\nGdot;0120\nGdotaccent;0120\nGecyrillic;0413\nGhadarmenian;0542\nGhemiddlehookcyrillic;0494\nGhestrokecyrillic;0492\nGheupturncyrillic;0490\nGhook;0193\nGimarmenian;0533\nGjecyrillic;0403\nGmacron;1E20\nGmonospace;FF27\nGrave;F6CE\nGravesmall;F760\nGsmall;F767\nGsmallhook;029B\nGstroke;01E4\nH;0048\nH18533;25CF\nH18543;25AA\nH18551;25AB\nH22073;25A1\nHPsquare;33CB\nHaabkhasiancyrillic;04A8\nHadescendercyrillic;04B2\nHardsigncyrillic;042A\nHbar;0126\nHbrevebelow;1E2A\nHcedilla;1E28\nHcircle;24BD\nHcircumflex;0124\nHdieresis;1E26\nHdotaccent;1E22\nHdotbelow;1E24\nHmonospace;FF28\nHoarmenian;0540\nHoricoptic;03E8\nHsmall;F768\nHungarumlaut;F6CF\nHungarumlautsmall;F6F8\nHzsquare;3390\nI;0049\nIAcyrillic;042F\nIJ;0132\nIUcyrillic;042E\nIacute;00CD\nIacutesmall;F7ED\nIbreve;012C\nIcaron;01CF\nIcircle;24BE\nIcircumflex;00CE\nIcircumflexsmall;F7EE\nIcyrillic;0406\nIdblgrave;0208\nIdieresis;00CF\nIdieresisacute;1E2E\nIdieresiscyrillic;04E4\nIdieresissmall;F7EF\nIdot;0130\nIdotaccent;0130\nIdotbelow;1ECA\nIebrevecyrillic;04D6\nIecyrillic;0415\nIfraktur;2111\nIgrave;00CC\nIgravesmall;F7EC\nIhookabove;1EC8\nIicyrillic;0418\nIinvertedbreve;020A\nIishortcyrillic;0419\nImacron;012A\nImacroncyrillic;04E2\nImonospace;FF29\nIniarmenian;053B\nIocyrillic;0401\nIogonek;012E\nIota;0399\nIotaafrican;0196\nIotadieresis;03AA\nIotatonos;038A\nIsmall;F769\nIstroke;0197\nItilde;0128\nItildebelow;1E2C\nIzhitsacyrillic;0474\nIzhitsadblgravecyrillic;0476\nJ;004A\nJaarmenian;0541\nJcircle;24BF\nJcircumflex;0134\nJecyrillic;0408\nJheharmenian;054B\nJmonospace;FF2A\nJsmall;F76A\nK;004B\nKBsquare;3385\nKKsquare;33CD\nKabashkircyrillic;04A0\nKacute;1E30\nKacyrillic;041A\nKadescendercyrillic;049A\nKahookcyrillic;04C3\nKappa;039A\nKastrokecyrillic;049E\nKaverticalstrokecyrillic;049C\nKcaron;01E8\nKcedilla;0136\nKcircle;24C0\nKcommaaccent;0136\nKdotbelow;1E32\nKeharmenian;0554\nKenarmenian;053F\nKhacyrillic;0425\nKheicoptic;03E6\nKhook;0198\nKjecyrillic;040C\nKlinebelow;1E34\nKmonospace;FF2B\nKoppacyrillic;0480\nKoppagreek;03DE\nKsicyrillic;046E\nKsmall;F76B\nL;004C\nLJ;01C7\nLL;F6BF\nLacute;0139\nLambda;039B\nLcaron;013D\nLcedilla;013B\nLcircle;24C1\nLcircumflexbelow;1E3C\nLcommaaccent;013B\nLdot;013F\nLdotaccent;013F\nLdotbelow;1E36\nLdotbelowmacron;1E38\nLiwnarmenian;053C\nLj;01C8\nLjecyrillic;0409\nLlinebelow;1E3A\nLmonospace;FF2C\nLslash;0141\nLslashsmall;F6F9\nLsmall;F76C\nM;004D\nMBsquare;3386\nMacron;F6D0\nMacronsmall;F7AF\nMacute;1E3E\nMcircle;24C2\nMdotaccent;1E40\nMdotbelow;1E42\nMenarmenian;0544\nMmonospace;FF2D\nMsmall;F76D\nMturned;019C\nMu;039C\nN;004E\nNJ;01CA\nNacute;0143\nNcaron;0147\nNcedilla;0145\nNcircle;24C3\nNcircumflexbelow;1E4A\nNcommaaccent;0145\nNdotaccent;1E44\nNdotbelow;1E46\nNhookleft;019D\nNineroman;2168\nNj;01CB\nNjecyrillic;040A\nNlinebelow;1E48\nNmonospace;FF2E\nNowarmenian;0546\nNsmall;F76E\nNtilde;00D1\nNtildesmall;F7F1\nNu;039D\nO;004F\nOE;0152\nOEsmall;F6FA\nOacute;00D3\nOacutesmall;F7F3\nObarredcyrillic;04E8\nObarreddieresiscyrillic;04EA\nObreve;014E\nOcaron;01D1\nOcenteredtilde;019F\nOcircle;24C4\nOcircumflex;00D4\nOcircumflexacute;1ED0\nOcircumflexdotbelow;1ED8\nOcircumflexgrave;1ED2\nOcircumflexhookabove;1ED4\nOcircumflexsmall;F7F4\nOcircumflextilde;1ED6\nOcyrillic;041E\nOdblacute;0150\nOdblgrave;020C\nOdieresis;00D6\nOdieresiscyrillic;04E6\nOdieresissmall;F7F6\nOdotbelow;1ECC\nOgoneksmall;F6FB\nOgrave;00D2\nOgravesmall;F7F2\nOharmenian;0555\nOhm;2126\nOhookabove;1ECE\nOhorn;01A0\nOhornacute;1EDA\nOhorndotbelow;1EE2\nOhorngrave;1EDC\nOhornhookabove;1EDE\nOhorntilde;1EE0\nOhungarumlaut;0150\nOi;01A2\nOinvertedbreve;020E\nOmacron;014C\nOmacronacute;1E52\nOmacrongrave;1E50\nOmega;2126\nOmegacyrillic;0460\nOmegagreek;03A9\nOmegaroundcyrillic;047A\nOmegatitlocyrillic;047C\nOmegatonos;038F\nOmicron;039F\nOmicrontonos;038C\nOmonospace;FF2F\nOneroman;2160\nOogonek;01EA\nOogonekmacron;01EC\nOopen;0186\nOslash;00D8\nOslashacute;01FE\nOslashsmall;F7F8\nOsmall;F76F\nOstrokeacute;01FE\nOtcyrillic;047E\nOtilde;00D5\nOtildeacute;1E4C\nOtildedieresis;1E4E\nOtildesmall;F7F5\nP;0050\nPacute;1E54\nPcircle;24C5\nPdotaccent;1E56\nPecyrillic;041F\nPeharmenian;054A\nPemiddlehookcyrillic;04A6\nPhi;03A6\nPhook;01A4\nPi;03A0\nPiwrarmenian;0553\nPmonospace;FF30\nPsi;03A8\nPsicyrillic;0470\nPsmall;F770\nQ;0051\nQcircle;24C6\nQmonospace;FF31\nQsmall;F771\nR;0052\nRaarmenian;054C\nRacute;0154\nRcaron;0158\nRcedilla;0156\nRcircle;24C7\nRcommaaccent;0156\nRdblgrave;0210\nRdotaccent;1E58\nRdotbelow;1E5A\nRdotbelowmacron;1E5C\nReharmenian;0550\nRfraktur;211C\nRho;03A1\nRingsmall;F6FC\nRinvertedbreve;0212\nRlinebelow;1E5E\nRmonospace;FF32\nRsmall;F772\nRsmallinverted;0281\nRsmallinvertedsuperior;02B6\nS;0053\nSF010000;250C\nSF020000;2514\nSF030000;2510\nSF040000;2518\nSF050000;253C\nSF060000;252C\nSF070000;2534\nSF080000;251C\nSF090000;2524\nSF100000;2500\nSF110000;2502\nSF190000;2561\nSF200000;2562\nSF210000;2556\nSF220000;2555\nSF230000;2563\nSF240000;2551\nSF250000;2557\nSF260000;255D\nSF270000;255C\nSF280000;255B\nSF360000;255E\nSF370000;255F\nSF380000;255A\nSF390000;2554\nSF400000;2569\nSF410000;2566\nSF420000;2560\nSF430000;2550\nSF440000;256C\nSF450000;2567\nSF460000;2568\nSF470000;2564\nSF480000;2565\nSF490000;2559\nSF500000;2558\nSF510000;2552\nSF520000;2553\nSF530000;256B\nSF540000;256A\nSacute;015A\nSacutedotaccent;1E64\nSampigreek;03E0\nScaron;0160\nScarondotaccent;1E66\nScaronsmall;F6FD\nScedilla;015E\nSchwa;018F\nSchwacyrillic;04D8\nSchwadieresiscyrillic;04DA\nScircle;24C8\nScircumflex;015C\nScommaaccent;0218\nSdotaccent;1E60\nSdotbelow;1E62\nSdotbelowdotaccent;1E68\nSeharmenian;054D\nSevenroman;2166\nShaarmenian;0547\nShacyrillic;0428\nShchacyrillic;0429\nSheicoptic;03E2\nShhacyrillic;04BA\nShimacoptic;03EC\nSigma;03A3\nSixroman;2165\nSmonospace;FF33\nSoftsigncyrillic;042C\nSsmall;F773\nStigmagreek;03DA\nT;0054\nTau;03A4\nTbar;0166\nTcaron;0164\nTcedilla;0162\nTcircle;24C9\nTcircumflexbelow;1E70\nTcommaaccent;0162\nTdotaccent;1E6A\nTdotbelow;1E6C\nTecyrillic;0422\nTedescendercyrillic;04AC\nTenroman;2169\nTetsecyrillic;04B4\nTheta;0398\nThook;01AC\nThorn;00DE\nThornsmall;F7FE\nThreeroman;2162\nTildesmall;F6FE\nTiwnarmenian;054F\nTlinebelow;1E6E\nTmonospace;FF34\nToarmenian;0539\nTonefive;01BC\nTonesix;0184\nTonetwo;01A7\nTretroflexhook;01AE\nTsecyrillic;0426\nTshecyrillic;040B\nTsmall;F774\nTwelveroman;216B\nTworoman;2161\nU;0055\nUacute;00DA\nUacutesmall;F7FA\nUbreve;016C\nUcaron;01D3\nUcircle;24CA\nUcircumflex;00DB\nUcircumflexbelow;1E76\nUcircumflexsmall;F7FB\nUcyrillic;0423\nUdblacute;0170\nUdblgrave;0214\nUdieresis;00DC\nUdieresisacute;01D7\nUdieresisbelow;1E72\nUdieresiscaron;01D9\nUdieresiscyrillic;04F0\nUdieresisgrave;01DB\nUdieresismacron;01D5\nUdieresissmall;F7FC\nUdotbelow;1EE4\nUgrave;00D9\nUgravesmall;F7F9\nUhookabove;1EE6\nUhorn;01AF\nUhornacute;1EE8\nUhorndotbelow;1EF0\nUhorngrave;1EEA\nUhornhookabove;1EEC\nUhorntilde;1EEE\nUhungarumlaut;0170\nUhungarumlautcyrillic;04F2\nUinvertedbreve;0216\nUkcyrillic;0478\nUmacron;016A\nUmacroncyrillic;04EE\nUmacrondieresis;1E7A\nUmonospace;FF35\nUogonek;0172\nUpsilon;03A5\nUpsilon1;03D2\nUpsilonacutehooksymbolgreek;03D3\nUpsilonafrican;01B1\nUpsilondieresis;03AB\nUpsilondieresishooksymbolgreek;03D4\nUpsilonhooksymbol;03D2\nUpsilontonos;038E\nUring;016E\nUshortcyrillic;040E\nUsmall;F775\nUstraightcyrillic;04AE\nUstraightstrokecyrillic;04B0\nUtilde;0168\nUtildeacute;1E78\nUtildebelow;1E74\nV;0056\nVcircle;24CB\nVdotbelow;1E7E\nVecyrillic;0412\nVewarmenian;054E\nVhook;01B2\nVmonospace;FF36\nVoarmenian;0548\nVsmall;F776\nVtilde;1E7C\nW;0057\nWacute;1E82\nWcircle;24CC\nWcircumflex;0174\nWdieresis;1E84\nWdotaccent;1E86\nWdotbelow;1E88\nWgrave;1E80\nWmonospace;FF37\nWsmall;F777\nX;0058\nXcircle;24CD\nXdieresis;1E8C\nXdotaccent;1E8A\nXeharmenian;053D\nXi;039E\nXmonospace;FF38\nXsmall;F778\nY;0059\nYacute;00DD\nYacutesmall;F7FD\nYatcyrillic;0462\nYcircle;24CE\nYcircumflex;0176\nYdieresis;0178\nYdieresissmall;F7FF\nYdotaccent;1E8E\nYdotbelow;1EF4\nYericyrillic;042B\nYerudieresiscyrillic;04F8\nYgrave;1EF2\nYhook;01B3\nYhookabove;1EF6\nYiarmenian;0545\nYicyrillic;0407\nYiwnarmenian;0552\nYmonospace;FF39\nYsmall;F779\nYtilde;1EF8\nYusbigcyrillic;046A\nYusbigiotifiedcyrillic;046C\nYuslittlecyrillic;0466\nYuslittleiotifiedcyrillic;0468\nZ;005A\nZaarmenian;0536\nZacute;0179\nZcaron;017D\nZcaronsmall;F6FF\nZcircle;24CF\nZcircumflex;1E90\nZdot;017B\nZdotaccent;017B\nZdotbelow;1E92\nZecyrillic;0417\nZedescendercyrillic;0498\nZedieresiscyrillic;04DE\nZeta;0396\nZhearmenian;053A\nZhebrevecyrillic;04C1\nZhecyrillic;0416\nZhedescendercyrillic;0496\nZhedieresiscyrillic;04DC\nZlinebelow;1E94\nZmonospace;FF3A\nZsmall;F77A\nZstroke;01B5\na;0061\naabengali;0986\naacute;00E1\naadeva;0906\naagujarati;0A86\naagurmukhi;0A06\naamatragurmukhi;0A3E\naarusquare;3303\naavowelsignbengali;09BE\naavowelsigndeva;093E\naavowelsigngujarati;0ABE\nabbreviationmarkarmenian;055F\nabbreviationsigndeva;0970\nabengali;0985\nabopomofo;311A\nabreve;0103\nabreveacute;1EAF\nabrevecyrillic;04D1\nabrevedotbelow;1EB7\nabrevegrave;1EB1\nabrevehookabove;1EB3\nabrevetilde;1EB5\nacaron;01CE\nacircle;24D0\nacircumflex;00E2\nacircumflexacute;1EA5\nacircumflexdotbelow;1EAD\nacircumflexgrave;1EA7\nacircumflexhookabove;1EA9\nacircumflextilde;1EAB\nacute;00B4\nacutebelowcmb;0317\nacutecmb;0301\nacutecomb;0301\nacutedeva;0954\nacutelowmod;02CF\nacutetonecmb;0341\nacyrillic;0430\nadblgrave;0201\naddakgurmukhi;0A71\nadeva;0905\nadieresis;00E4\nadieresiscyrillic;04D3\nadieresismacron;01DF\nadotbelow;1EA1\nadotmacron;01E1\nae;00E6\naeacute;01FD\naekorean;3150\naemacron;01E3\nafii00208;2015\nafii08941;20A4\nafii10017;0410\nafii10018;0411\nafii10019;0412\nafii10020;0413\nafii10021;0414\nafii10022;0415\nafii10023;0401\nafii10024;0416\nafii10025;0417\nafii10026;0418\nafii10027;0419\nafii10028;041A\nafii10029;041B\nafii10030;041C\nafii10031;041D\nafii10032;041E\nafii10033;041F\nafii10034;0420\nafii10035;0421\nafii10036;0422\nafii10037;0423\nafii10038;0424\nafii10039;0425\nafii10040;0426\nafii10041;0427\nafii10042;0428\nafii10043;0429\nafii10044;042A\nafii10045;042B\nafii10046;042C\nafii10047;042D\nafii10048;042E\nafii10049;042F\nafii10050;0490\nafii10051;0402\nafii10052;0403\nafii10053;0404\nafii10054;0405\nafii10055;0406\nafii10056;0407\nafii10057;0408\nafii10058;0409\nafii10059;040A\nafii10060;040B\nafii10061;040C\nafii10062;040E\nafii10063;F6C4\nafii10064;F6C5\nafii10065;0430\nafii10066;0431\nafii10067;0432\nafii10068;0433\nafii10069;0434\nafii10070;0435\nafii10071;0451\nafii10072;0436\nafii10073;0437\nafii10074;0438\nafii10075;0439\nafii10076;043A\nafii10077;043B\nafii10078;043C\nafii10079;043D\nafii10080;043E\nafii10081;043F\nafii10082;0440\nafii10083;0441\nafii10084;0442\nafii10085;0443\nafii10086;0444\nafii10087;0445\nafii10088;0446\nafii10089;0447\nafii10090;0448\nafii10091;0449\nafii10092;044A\nafii10093;044B\nafii10094;044C\nafii10095;044D\nafii10096;044E\nafii10097;044F\nafii10098;0491\nafii10099;0452\nafii10100;0453\nafii10101;0454\nafii10102;0455\nafii10103;0456\nafii10104;0457\nafii10105;0458\nafii10106;0459\nafii10107;045A\nafii10108;045B\nafii10109;045C\nafii10110;045E\nafii10145;040F\nafii10146;0462\nafii10147;0472\nafii10148;0474\nafii10192;F6C6\nafii10193;045F\nafii10194;0463\nafii10195;0473\nafii10196;0475\nafii10831;F6C7\nafii10832;F6C8\nafii10846;04D9\nafii299;200E\nafii300;200F\nafii301;200D\nafii57381;066A\nafii57388;060C\nafii57392;0660\nafii57393;0661\nafii57394;0662\nafii57395;0663\nafii57396;0664\nafii57397;0665\nafii57398;0666\nafii57399;0667\nafii57400;0668\nafii57401;0669\nafii57403;061B\nafii57407;061F\nafii57409;0621\nafii57410;0622\nafii57411;0623\nafii57412;0624\nafii57413;0625\nafii57414;0626\nafii57415;0627\nafii57416;0628\nafii57417;0629\nafii57418;062A\nafii57419;062B\nafii57420;062C\nafii57421;062D\nafii57422;062E\nafii57423;062F\nafii57424;0630\nafii57425;0631\nafii57426;0632\nafii57427;0633\nafii57428;0634\nafii57429;0635\nafii57430;0636\nafii57431;0637\nafii57432;0638\nafii57433;0639\nafii57434;063A\nafii57440;0640\nafii57441;0641\nafii57442;0642\nafii57443;0643\nafii57444;0644\nafii57445;0645\nafii57446;0646\nafii57448;0648\nafii57449;0649\nafii57450;064A\nafii57451;064B\nafii57452;064C\nafii57453;064D\nafii57454;064E\nafii57455;064F\nafii57456;0650\nafii57457;0651\nafii57458;0652\nafii57470;0647\nafii57505;06A4\nafii57506;067E\nafii57507;0686\nafii57508;0698\nafii57509;06AF\nafii57511;0679\nafii57512;0688\nafii57513;0691\nafii57514;06BA\nafii57519;06D2\nafii57534;06D5\nafii57636;20AA\nafii57645;05BE\nafii57658;05C3\nafii57664;05D0\nafii57665;05D1\nafii57666;05D2\nafii57667;05D3\nafii57668;05D4\nafii57669;05D5\nafii57670;05D6\nafii57671;05D7\nafii57672;05D8\nafii57673;05D9\nafii57674;05DA\nafii57675;05DB\nafii57676;05DC\nafii57677;05DD\nafii57678;05DE\nafii57679;05DF\nafii57680;05E0\nafii57681;05E1\nafii57682;05E2\nafii57683;05E3\nafii57684;05E4\nafii57685;05E5\nafii57686;05E6\nafii57687;05E7\nafii57688;05E8\nafii57689;05E9\nafii57690;05EA\nafii57694;FB2A\nafii57695;FB2B\nafii57700;FB4B\nafii57705;FB1F\nafii57716;05F0\nafii57717;05F1\nafii57718;05F2\nafii57723;FB35\nafii57793;05B4\nafii57794;05B5\nafii57795;05B6\nafii57796;05BB\nafii57797;05B8\nafii57798;05B7\nafii57799;05B0\nafii57800;05B2\nafii57801;05B1\nafii57802;05B3\nafii57803;05C2\nafii57804;05C1\nafii57806;05B9\nafii57807;05BC\nafii57839;05BD\nafii57841;05BF\nafii57842;05C0\nafii57929;02BC\nafii61248;2105\nafii61289;2113\nafii61352;2116\nafii61573;202C\nafii61574;202D\nafii61575;202E\nafii61664;200C\nafii63167;066D\nafii64937;02BD\nagrave;00E0\nagujarati;0A85\nagurmukhi;0A05\nahiragana;3042\nahookabove;1EA3\naibengali;0990\naibopomofo;311E\naideva;0910\naiecyrillic;04D5\naigujarati;0A90\naigurmukhi;0A10\naimatragurmukhi;0A48\nainarabic;0639\nainfinalarabic;FECA\naininitialarabic;FECB\nainmedialarabic;FECC\nainvertedbreve;0203\naivowelsignbengali;09C8\naivowelsigndeva;0948\naivowelsigngujarati;0AC8\nakatakana;30A2\nakatakanahalfwidth;FF71\nakorean;314F\nalef;05D0\nalefarabic;0627\nalefdageshhebrew;FB30\naleffinalarabic;FE8E\nalefhamzaabovearabic;0623\nalefhamzaabovefinalarabic;FE84\nalefhamzabelowarabic;0625\nalefhamzabelowfinalarabic;FE88\nalefhebrew;05D0\naleflamedhebrew;FB4F\nalefmaddaabovearabic;0622\nalefmaddaabovefinalarabic;FE82\nalefmaksuraarabic;0649\nalefmaksurafinalarabic;FEF0\nalefmaksurainitialarabic;FEF3\nalefmaksuramedialarabic;FEF4\nalefpatahhebrew;FB2E\nalefqamatshebrew;FB2F\naleph;2135\nallequal;224C\nalpha;03B1\nalphatonos;03AC\namacron;0101\namonospace;FF41\nampersand;0026\nampersandmonospace;FF06\nampersandsmall;F726\namsquare;33C2\nanbopomofo;3122\nangbopomofo;3124\nangkhankhuthai;0E5A\nangle;2220\nanglebracketleft;3008\nanglebracketleftvertical;FE3F\nanglebracketright;3009\nanglebracketrightvertical;FE40\nangleleft;2329\nangleright;232A\nangstrom;212B\nanoteleia;0387\nanudattadeva;0952\nanusvarabengali;0982\nanusvaradeva;0902\nanusvaragujarati;0A82\naogonek;0105\napaatosquare;3300\naparen;249C\napostrophearmenian;055A\napostrophemod;02BC\napple;F8FF\napproaches;2250\napproxequal;2248\napproxequalorimage;2252\napproximatelyequal;2245\naraeaekorean;318E\naraeakorean;318D\narc;2312\narighthalfring;1E9A\naring;00E5\naringacute;01FB\naringbelow;1E01\narrowboth;2194\narrowdashdown;21E3\narrowdashleft;21E0\narrowdashright;21E2\narrowdashup;21E1\narrowdblboth;21D4\narrowdbldown;21D3\narrowdblleft;21D0\narrowdblright;21D2\narrowdblup;21D1\narrowdown;2193\narrowdownleft;2199\narrowdownright;2198\narrowdownwhite;21E9\narrowheaddownmod;02C5\narrowheadleftmod;02C2\narrowheadrightmod;02C3\narrowheadupmod;02C4\narrowhorizex;F8E7\narrowleft;2190\narrowleftdbl;21D0\narrowleftdblstroke;21CD\narrowleftoverright;21C6\narrowleftwhite;21E6\narrowright;2192\narrowrightdblstroke;21CF\narrowrightheavy;279E\narrowrightoverleft;21C4\narrowrightwhite;21E8\narrowtableft;21E4\narrowtabright;21E5\narrowup;2191\narrowupdn;2195\narrowupdnbse;21A8\narrowupdownbase;21A8\narrowupleft;2196\narrowupleftofdown;21C5\narrowupright;2197\narrowupwhite;21E7\narrowvertex;F8E6\nasciicircum;005E\nasciicircummonospace;FF3E\nasciitilde;007E\nasciitildemonospace;FF5E\nascript;0251\nascriptturned;0252\nasmallhiragana;3041\nasmallkatakana;30A1\nasmallkatakanahalfwidth;FF67\nasterisk;002A\nasteriskaltonearabic;066D\nasteriskarabic;066D\nasteriskmath;2217\nasteriskmonospace;FF0A\nasterisksmall;FE61\nasterism;2042\nasuperior;F6E9\nasymptoticallyequal;2243\nat;0040\natilde;00E3\natmonospace;FF20\natsmall;FE6B\naturned;0250\naubengali;0994\naubopomofo;3120\naudeva;0914\naugujarati;0A94\naugurmukhi;0A14\naulengthmarkbengali;09D7\naumatragurmukhi;0A4C\nauvowelsignbengali;09CC\nauvowelsigndeva;094C\nauvowelsigngujarati;0ACC\navagrahadeva;093D\naybarmenian;0561\nayin;05E2\nayinaltonehebrew;FB20\nayinhebrew;05E2\nb;0062\nbabengali;09AC\nbackslash;005C\nbackslashmonospace;FF3C\nbadeva;092C\nbagujarati;0AAC\nbagurmukhi;0A2C\nbahiragana;3070\nbahtthai;0E3F\nbakatakana;30D0\nbar;007C\nbarmonospace;FF5C\nbbopomofo;3105\nbcircle;24D1\nbdotaccent;1E03\nbdotbelow;1E05\nbeamedsixteenthnotes;266C\nbecause;2235\nbecyrillic;0431\nbeharabic;0628\nbehfinalarabic;FE90\nbehinitialarabic;FE91\nbehiragana;3079\nbehmedialarabic;FE92\nbehmeeminitialarabic;FC9F\nbehmeemisolatedarabic;FC08\nbehnoonfinalarabic;FC6D\nbekatakana;30D9\nbenarmenian;0562\nbet;05D1\nbeta;03B2\nbetasymbolgreek;03D0\nbetdagesh;FB31\nbetdageshhebrew;FB31\nbethebrew;05D1\nbetrafehebrew;FB4C\nbhabengali;09AD\nbhadeva;092D\nbhagujarati;0AAD\nbhagurmukhi;0A2D\nbhook;0253\nbihiragana;3073\nbikatakana;30D3\nbilabialclick;0298\nbindigurmukhi;0A02\nbirusquare;3331\nblackcircle;25CF\nblackdiamond;25C6\nblackdownpointingtriangle;25BC\nblackleftpointingpointer;25C4\nblackleftpointingtriangle;25C0\nblacklenticularbracketleft;3010\nblacklenticularbracketleftvertical;FE3B\nblacklenticularbracketright;3011\nblacklenticularbracketrightvertical;FE3C\nblacklowerlefttriangle;25E3\nblacklowerrighttriangle;25E2\nblackrectangle;25AC\nblackrightpointingpointer;25BA\nblackrightpointingtriangle;25B6\nblacksmallsquare;25AA\nblacksmilingface;263B\nblacksquare;25A0\nblackstar;2605\nblackupperlefttriangle;25E4\nblackupperrighttriangle;25E5\nblackuppointingsmalltriangle;25B4\nblackuppointingtriangle;25B2\nblank;2423\nblinebelow;1E07\nblock;2588\nbmonospace;FF42\nbobaimaithai;0E1A\nbohiragana;307C\nbokatakana;30DC\nbparen;249D\nbqsquare;33C3\nbraceex;F8F4\nbraceleft;007B\nbraceleftbt;F8F3\nbraceleftmid;F8F2\nbraceleftmonospace;FF5B\nbraceleftsmall;FE5B\nbracelefttp;F8F1\nbraceleftvertical;FE37\nbraceright;007D\nbracerightbt;F8FE\nbracerightmid;F8FD\nbracerightmonospace;FF5D\nbracerightsmall;FE5C\nbracerighttp;F8FC\nbracerightvertical;FE38\nbracketleft;005B\nbracketleftbt;F8F0\nbracketleftex;F8EF\nbracketleftmonospace;FF3B\nbracketlefttp;F8EE\nbracketright;005D\nbracketrightbt;F8FB\nbracketrightex;F8FA\nbracketrightmonospace;FF3D\nbracketrighttp;F8F9\nbreve;02D8\nbrevebelowcmb;032E\nbrevecmb;0306\nbreveinvertedbelowcmb;032F\nbreveinvertedcmb;0311\nbreveinverteddoublecmb;0361\nbridgebelowcmb;032A\nbridgeinvertedbelowcmb;033A\nbrokenbar;00A6\nbstroke;0180\nbsuperior;F6EA\nbtopbar;0183\nbuhiragana;3076\nbukatakana;30D6\nbullet;2022\nbulletinverse;25D8\nbulletoperator;2219\nbullseye;25CE\nc;0063\ncaarmenian;056E\ncabengali;099A\ncacute;0107\ncadeva;091A\ncagujarati;0A9A\ncagurmukhi;0A1A\ncalsquare;3388\ncandrabindubengali;0981\ncandrabinducmb;0310\ncandrabindudeva;0901\ncandrabindugujarati;0A81\ncapslock;21EA\ncareof;2105\ncaron;02C7\ncaronbelowcmb;032C\ncaroncmb;030C\ncarriagereturn;21B5\ncbopomofo;3118\nccaron;010D\nccedilla;00E7\nccedillaacute;1E09\nccircle;24D2\nccircumflex;0109\nccurl;0255\ncdot;010B\ncdotaccent;010B\ncdsquare;33C5\ncedilla;00B8\ncedillacmb;0327\ncent;00A2\ncentigrade;2103\ncentinferior;F6DF\ncentmonospace;FFE0\ncentoldstyle;F7A2\ncentsuperior;F6E0\nchaarmenian;0579\nchabengali;099B\nchadeva;091B\nchagujarati;0A9B\nchagurmukhi;0A1B\nchbopomofo;3114\ncheabkhasiancyrillic;04BD\ncheckmark;2713\nchecyrillic;0447\nchedescenderabkhasiancyrillic;04BF\nchedescendercyrillic;04B7\nchedieresiscyrillic;04F5\ncheharmenian;0573\nchekhakassiancyrillic;04CC\ncheverticalstrokecyrillic;04B9\nchi;03C7\nchieuchacirclekorean;3277\nchieuchaparenkorean;3217\nchieuchcirclekorean;3269\nchieuchkorean;314A\nchieuchparenkorean;3209\nchochangthai;0E0A\nchochanthai;0E08\nchochingthai;0E09\nchochoethai;0E0C\nchook;0188\ncieucacirclekorean;3276\ncieucaparenkorean;3216\ncieuccirclekorean;3268\ncieuckorean;3148\ncieucparenkorean;3208\ncieucuparenkorean;321C\ncircle;25CB\ncirclemultiply;2297\ncircleot;2299\ncircleplus;2295\ncirclepostalmark;3036\ncirclewithlefthalfblack;25D0\ncirclewithrighthalfblack;25D1\ncircumflex;02C6\ncircumflexbelowcmb;032D\ncircumflexcmb;0302\nclear;2327\nclickalveolar;01C2\nclickdental;01C0\nclicklateral;01C1\nclickretroflex;01C3\nclub;2663\nclubsuitblack;2663\nclubsuitwhite;2667\ncmcubedsquare;33A4\ncmonospace;FF43\ncmsquaredsquare;33A0\ncoarmenian;0581\ncolon;003A\ncolonmonetary;20A1\ncolonmonospace;FF1A\ncolonsign;20A1\ncolonsmall;FE55\ncolontriangularhalfmod;02D1\ncolontriangularmod;02D0\ncomma;002C\ncommaabovecmb;0313\ncommaaboverightcmb;0315\ncommaaccent;F6C3\ncommaarabic;060C\ncommaarmenian;055D\ncommainferior;F6E1\ncommamonospace;FF0C\ncommareversedabovecmb;0314\ncommareversedmod;02BD\ncommasmall;FE50\ncommasuperior;F6E2\ncommaturnedabovecmb;0312\ncommaturnedmod;02BB\ncompass;263C\ncongruent;2245\ncontourintegral;222E\ncontrol;2303\ncontrolACK;0006\ncontrolBEL;0007\ncontrolBS;0008\ncontrolCAN;0018\ncontrolCR;000D\ncontrolDC1;0011\ncontrolDC2;0012\ncontrolDC3;0013\ncontrolDC4;0014\ncontrolDEL;007F\ncontrolDLE;0010\ncontrolEM;0019\ncontrolENQ;0005\ncontrolEOT;0004\ncontrolESC;001B\ncontrolETB;0017\ncontrolETX;0003\ncontrolFF;000C\ncontrolFS;001C\ncontrolGS;001D\ncontrolHT;0009\ncontrolLF;000A\ncontrolNAK;0015\ncontrolRS;001E\ncontrolSI;000F\ncontrolSO;000E\ncontrolSOT;0002\ncontrolSTX;0001\ncontrolSUB;001A\ncontrolSYN;0016\ncontrolUS;001F\ncontrolVT;000B\ncopyright;00A9\ncopyrightsans;F8E9\ncopyrightserif;F6D9\ncornerbracketleft;300C\ncornerbracketlefthalfwidth;FF62\ncornerbracketleftvertical;FE41\ncornerbracketright;300D\ncornerbracketrighthalfwidth;FF63\ncornerbracketrightvertical;FE42\ncorporationsquare;337F\ncosquare;33C7\ncoverkgsquare;33C6\ncparen;249E\ncruzeiro;20A2\ncstretched;0297\ncurlyand;22CF\ncurlyor;22CE\ncurrency;00A4\ncyrBreve;F6D1\ncyrFlex;F6D2\ncyrbreve;F6D4\ncyrflex;F6D5\nd;0064\ndaarmenian;0564\ndabengali;09A6\ndadarabic;0636\ndadeva;0926\ndadfinalarabic;FEBE\ndadinitialarabic;FEBF\ndadmedialarabic;FEC0\ndagesh;05BC\ndageshhebrew;05BC\ndagger;2020\ndaggerdbl;2021\ndagujarati;0AA6\ndagurmukhi;0A26\ndahiragana;3060\ndakatakana;30C0\ndalarabic;062F\ndalet;05D3\ndaletdagesh;FB33\ndaletdageshhebrew;FB33\ndalethatafpatah;05D3 05B2\ndalethatafpatahhebrew;05D3 05B2\ndalethatafsegol;05D3 05B1\ndalethatafsegolhebrew;05D3 05B1\ndalethebrew;05D3\ndalethiriq;05D3 05B4\ndalethiriqhebrew;05D3 05B4\ndaletholam;05D3 05B9\ndaletholamhebrew;05D3 05B9\ndaletpatah;05D3 05B7\ndaletpatahhebrew;05D3 05B7\ndaletqamats;05D3 05B8\ndaletqamatshebrew;05D3 05B8\ndaletqubuts;05D3 05BB\ndaletqubutshebrew;05D3 05BB\ndaletsegol;05D3 05B6\ndaletsegolhebrew;05D3 05B6\ndaletsheva;05D3 05B0\ndaletshevahebrew;05D3 05B0\ndalettsere;05D3 05B5\ndalettserehebrew;05D3 05B5\ndalfinalarabic;FEAA\ndammaarabic;064F\ndammalowarabic;064F\ndammatanaltonearabic;064C\ndammatanarabic;064C\ndanda;0964\ndargahebrew;05A7\ndargalefthebrew;05A7\ndasiapneumatacyrilliccmb;0485\ndblGrave;F6D3\ndblanglebracketleft;300A\ndblanglebracketleftvertical;FE3D\ndblanglebracketright;300B\ndblanglebracketrightvertical;FE3E\ndblarchinvertedbelowcmb;032B\ndblarrowleft;21D4\ndblarrowright;21D2\ndbldanda;0965\ndblgrave;F6D6\ndblgravecmb;030F\ndblintegral;222C\ndbllowline;2017\ndbllowlinecmb;0333\ndbloverlinecmb;033F\ndblprimemod;02BA\ndblverticalbar;2016\ndblverticallineabovecmb;030E\ndbopomofo;3109\ndbsquare;33C8\ndcaron;010F\ndcedilla;1E11\ndcircle;24D3\ndcircumflexbelow;1E13\ndcroat;0111\nddabengali;09A1\nddadeva;0921\nddagujarati;0AA1\nddagurmukhi;0A21\nddalarabic;0688\nddalfinalarabic;FB89\ndddhadeva;095C\nddhabengali;09A2\nddhadeva;0922\nddhagujarati;0AA2\nddhagurmukhi;0A22\nddotaccent;1E0B\nddotbelow;1E0D\ndecimalseparatorarabic;066B\ndecimalseparatorpersian;066B\ndecyrillic;0434\ndegree;00B0\ndehihebrew;05AD\ndehiragana;3067\ndeicoptic;03EF\ndekatakana;30C7\ndeleteleft;232B\ndeleteright;2326\ndelta;03B4\ndeltaturned;018D\ndenominatorminusonenumeratorbengali;09F8\ndezh;02A4\ndhabengali;09A7\ndhadeva;0927\ndhagujarati;0AA7\ndhagurmukhi;0A27\ndhook;0257\ndialytikatonos;0385\ndialytikatonoscmb;0344\ndiamond;2666\ndiamondsuitwhite;2662\ndieresis;00A8\ndieresisacute;F6D7\ndieresisbelowcmb;0324\ndieresiscmb;0308\ndieresisgrave;F6D8\ndieresistonos;0385\ndihiragana;3062\ndikatakana;30C2\ndittomark;3003\ndivide;00F7\ndivides;2223\ndivisionslash;2215\ndjecyrillic;0452\ndkshade;2593\ndlinebelow;1E0F\ndlsquare;3397\ndmacron;0111\ndmonospace;FF44\ndnblock;2584\ndochadathai;0E0E\ndodekthai;0E14\ndohiragana;3069\ndokatakana;30C9\ndollar;0024\ndollarinferior;F6E3\ndollarmonospace;FF04\ndollaroldstyle;F724\ndollarsmall;FE69\ndollarsuperior;F6E4\ndong;20AB\ndorusquare;3326\ndotaccent;02D9\ndotaccentcmb;0307\ndotbelowcmb;0323\ndotbelowcomb;0323\ndotkatakana;30FB\ndotlessi;0131\ndotlessj;F6BE\ndotlessjstrokehook;0284\ndotmath;22C5\ndottedcircle;25CC\ndoubleyodpatah;FB1F\ndoubleyodpatahhebrew;FB1F\ndowntackbelowcmb;031E\ndowntackmod;02D5\ndparen;249F\ndsuperior;F6EB\ndtail;0256\ndtopbar;018C\nduhiragana;3065\ndukatakana;30C5\ndz;01F3\ndzaltone;02A3\ndzcaron;01C6\ndzcurl;02A5\ndzeabkhasiancyrillic;04E1\ndzecyrillic;0455\ndzhecyrillic;045F\ne;0065\neacute;00E9\nearth;2641\nebengali;098F\nebopomofo;311C\nebreve;0115\necandradeva;090D\necandragujarati;0A8D\necandravowelsigndeva;0945\necandravowelsigngujarati;0AC5\necaron;011B\necedillabreve;1E1D\necharmenian;0565\nechyiwnarmenian;0587\necircle;24D4\necircumflex;00EA\necircumflexacute;1EBF\necircumflexbelow;1E19\necircumflexdotbelow;1EC7\necircumflexgrave;1EC1\necircumflexhookabove;1EC3\necircumflextilde;1EC5\necyrillic;0454\nedblgrave;0205\nedeva;090F\nedieresis;00EB\nedot;0117\nedotaccent;0117\nedotbelow;1EB9\neegurmukhi;0A0F\neematragurmukhi;0A47\nefcyrillic;0444\negrave;00E8\negujarati;0A8F\neharmenian;0567\nehbopomofo;311D\nehiragana;3048\nehookabove;1EBB\neibopomofo;311F\neight;0038\neightarabic;0668\neightbengali;09EE\neightcircle;2467\neightcircleinversesansserif;2791\neightdeva;096E\neighteencircle;2471\neighteenparen;2485\neighteenperiod;2499\neightgujarati;0AEE\neightgurmukhi;0A6E\neighthackarabic;0668\neighthangzhou;3028\neighthnotebeamed;266B\neightideographicparen;3227\neightinferior;2088\neightmonospace;FF18\neightoldstyle;F738\neightparen;247B\neightperiod;248F\neightpersian;06F8\neightroman;2177\neightsuperior;2078\neightthai;0E58\neinvertedbreve;0207\neiotifiedcyrillic;0465\nekatakana;30A8\nekatakanahalfwidth;FF74\nekonkargurmukhi;0A74\nekorean;3154\nelcyrillic;043B\nelement;2208\nelevencircle;246A\nelevenparen;247E\nelevenperiod;2492\nelevenroman;217A\nellipsis;2026\nellipsisvertical;22EE\nemacron;0113\nemacronacute;1E17\nemacrongrave;1E15\nemcyrillic;043C\nemdash;2014\nemdashvertical;FE31\nemonospace;FF45\nemphasismarkarmenian;055B\nemptyset;2205\nenbopomofo;3123\nencyrillic;043D\nendash;2013\nendashvertical;FE32\nendescendercyrillic;04A3\neng;014B\nengbopomofo;3125\nenghecyrillic;04A5\nenhookcyrillic;04C8\nenspace;2002\neogonek;0119\neokorean;3153\neopen;025B\neopenclosed;029A\neopenreversed;025C\neopenreversedclosed;025E\neopenreversedhook;025D\neparen;24A0\nepsilon;03B5\nepsilontonos;03AD\nequal;003D\nequalmonospace;FF1D\nequalsmall;FE66\nequalsuperior;207C\nequivalence;2261\nerbopomofo;3126\nercyrillic;0440\nereversed;0258\nereversedcyrillic;044D\nescyrillic;0441\nesdescendercyrillic;04AB\nesh;0283\neshcurl;0286\neshortdeva;090E\neshortvowelsigndeva;0946\neshreversedloop;01AA\neshsquatreversed;0285\nesmallhiragana;3047\nesmallkatakana;30A7\nesmallkatakanahalfwidth;FF6A\nestimated;212E\nesuperior;F6EC\neta;03B7\netarmenian;0568\netatonos;03AE\neth;00F0\netilde;1EBD\netildebelow;1E1B\netnahtafoukhhebrew;0591\netnahtafoukhlefthebrew;0591\netnahtahebrew;0591\netnahtalefthebrew;0591\neturned;01DD\neukorean;3161\neuro;20AC\nevowelsignbengali;09C7\nevowelsigndeva;0947\nevowelsigngujarati;0AC7\nexclam;0021\nexclamarmenian;055C\nexclamdbl;203C\nexclamdown;00A1\nexclamdownsmall;F7A1\nexclammonospace;FF01\nexclamsmall;F721\nexistential;2203\nezh;0292\nezhcaron;01EF\nezhcurl;0293\nezhreversed;01B9\nezhtail;01BA\nf;0066\nfadeva;095E\nfagurmukhi;0A5E\nfahrenheit;2109\nfathaarabic;064E\nfathalowarabic;064E\nfathatanarabic;064B\nfbopomofo;3108\nfcircle;24D5\nfdotaccent;1E1F\nfeharabic;0641\nfeharmenian;0586\nfehfinalarabic;FED2\nfehinitialarabic;FED3\nfehmedialarabic;FED4\nfeicoptic;03E5\nfemale;2640\nff;FB00\nffi;FB03\nffl;FB04\nfi;FB01\nfifteencircle;246E\nfifteenparen;2482\nfifteenperiod;2496\nfiguredash;2012\nfilledbox;25A0\nfilledrect;25AC\nfinalkaf;05DA\nfinalkafdagesh;FB3A\nfinalkafdageshhebrew;FB3A\nfinalkafhebrew;05DA\nfinalkafqamats;05DA 05B8\nfinalkafqamatshebrew;05DA 05B8\nfinalkafsheva;05DA 05B0\nfinalkafshevahebrew;05DA 05B0\nfinalmem;05DD\nfinalmemhebrew;05DD\nfinalnun;05DF\nfinalnunhebrew;05DF\nfinalpe;05E3\nfinalpehebrew;05E3\nfinaltsadi;05E5\nfinaltsadihebrew;05E5\nfirsttonechinese;02C9\nfisheye;25C9\nfitacyrillic;0473\nfive;0035\nfivearabic;0665\nfivebengali;09EB\nfivecircle;2464\nfivecircleinversesansserif;278E\nfivedeva;096B\nfiveeighths;215D\nfivegujarati;0AEB\nfivegurmukhi;0A6B\nfivehackarabic;0665\nfivehangzhou;3025\nfiveideographicparen;3224\nfiveinferior;2085\nfivemonospace;FF15\nfiveoldstyle;F735\nfiveparen;2478\nfiveperiod;248C\nfivepersian;06F5\nfiveroman;2174\nfivesuperior;2075\nfivethai;0E55\nfl;FB02\nflorin;0192\nfmonospace;FF46\nfmsquare;3399\nfofanthai;0E1F\nfofathai;0E1D\nfongmanthai;0E4F\nforall;2200\nfour;0034\nfourarabic;0664\nfourbengali;09EA\nfourcircle;2463\nfourcircleinversesansserif;278D\nfourdeva;096A\nfourgujarati;0AEA\nfourgurmukhi;0A6A\nfourhackarabic;0664\nfourhangzhou;3024\nfourideographicparen;3223\nfourinferior;2084\nfourmonospace;FF14\nfournumeratorbengali;09F7\nfouroldstyle;F734\nfourparen;2477\nfourperiod;248B\nfourpersian;06F4\nfourroman;2173\nfoursuperior;2074\nfourteencircle;246D\nfourteenparen;2481\nfourteenperiod;2495\nfourthai;0E54\nfourthtonechinese;02CB\nfparen;24A1\nfraction;2044\nfranc;20A3\ng;0067\ngabengali;0997\ngacute;01F5\ngadeva;0917\ngafarabic;06AF\ngaffinalarabic;FB93\ngafinitialarabic;FB94\ngafmedialarabic;FB95\ngagujarati;0A97\ngagurmukhi;0A17\ngahiragana;304C\ngakatakana;30AC\ngamma;03B3\ngammalatinsmall;0263\ngammasuperior;02E0\ngangiacoptic;03EB\ngbopomofo;310D\ngbreve;011F\ngcaron;01E7\ngcedilla;0123\ngcircle;24D6\ngcircumflex;011D\ngcommaaccent;0123\ngdot;0121\ngdotaccent;0121\ngecyrillic;0433\ngehiragana;3052\ngekatakana;30B2\ngeometricallyequal;2251\ngereshaccenthebrew;059C\ngereshhebrew;05F3\ngereshmuqdamhebrew;059D\ngermandbls;00DF\ngershayimaccenthebrew;059E\ngershayimhebrew;05F4\ngetamark;3013\nghabengali;0998\nghadarmenian;0572\nghadeva;0918\nghagujarati;0A98\nghagurmukhi;0A18\nghainarabic;063A\nghainfinalarabic;FECE\nghaininitialarabic;FECF\nghainmedialarabic;FED0\nghemiddlehookcyrillic;0495\nghestrokecyrillic;0493\ngheupturncyrillic;0491\nghhadeva;095A\nghhagurmukhi;0A5A\nghook;0260\nghzsquare;3393\ngihiragana;304E\ngikatakana;30AE\ngimarmenian;0563\ngimel;05D2\ngimeldagesh;FB32\ngimeldageshhebrew;FB32\ngimelhebrew;05D2\ngjecyrillic;0453\nglottalinvertedstroke;01BE\nglottalstop;0294\nglottalstopinverted;0296\nglottalstopmod;02C0\nglottalstopreversed;0295\nglottalstopreversedmod;02C1\nglottalstopreversedsuperior;02E4\nglottalstopstroke;02A1\nglottalstopstrokereversed;02A2\ngmacron;1E21\ngmonospace;FF47\ngohiragana;3054\ngokatakana;30B4\ngparen;24A2\ngpasquare;33AC\ngradient;2207\ngrave;0060\ngravebelowcmb;0316\ngravecmb;0300\ngravecomb;0300\ngravedeva;0953\ngravelowmod;02CE\ngravemonospace;FF40\ngravetonecmb;0340\ngreater;003E\ngreaterequal;2265\ngreaterequalorless;22DB\ngreatermonospace;FF1E\ngreaterorequivalent;2273\ngreaterorless;2277\ngreateroverequal;2267\ngreatersmall;FE65\ngscript;0261\ngstroke;01E5\nguhiragana;3050\nguillemotleft;00AB\nguillemotright;00BB\nguilsinglleft;2039\nguilsinglright;203A\ngukatakana;30B0\nguramusquare;3318\ngysquare;33C9\nh;0068\nhaabkhasiancyrillic;04A9\nhaaltonearabic;06C1\nhabengali;09B9\nhadescendercyrillic;04B3\nhadeva;0939\nhagujarati;0AB9\nhagurmukhi;0A39\nhaharabic;062D\nhahfinalarabic;FEA2\nhahinitialarabic;FEA3\nhahiragana;306F\nhahmedialarabic;FEA4\nhaitusquare;332A\nhakatakana;30CF\nhakatakanahalfwidth;FF8A\nhalantgurmukhi;0A4D\nhamzaarabic;0621\nhamzadammaarabic;0621 064F\nhamzadammatanarabic;0621 064C\nhamzafathaarabic;0621 064E\nhamzafathatanarabic;0621 064B\nhamzalowarabic;0621\nhamzalowkasraarabic;0621 0650\nhamzalowkasratanarabic;0621 064D\nhamzasukunarabic;0621 0652\nhangulfiller;3164\nhardsigncyrillic;044A\nharpoonleftbarbup;21BC\nharpoonrightbarbup;21C0\nhasquare;33CA\nhatafpatah;05B2\nhatafpatah16;05B2\nhatafpatah23;05B2\nhatafpatah2f;05B2\nhatafpatahhebrew;05B2\nhatafpatahnarrowhebrew;05B2\nhatafpatahquarterhebrew;05B2\nhatafpatahwidehebrew;05B2\nhatafqamats;05B3\nhatafqamats1b;05B3\nhatafqamats28;05B3\nhatafqamats34;05B3\nhatafqamatshebrew;05B3\nhatafqamatsnarrowhebrew;05B3\nhatafqamatsquarterhebrew;05B3\nhatafqamatswidehebrew;05B3\nhatafsegol;05B1\nhatafsegol17;05B1\nhatafsegol24;05B1\nhatafsegol30;05B1\nhatafsegolhebrew;05B1\nhatafsegolnarrowhebrew;05B1\nhatafsegolquarterhebrew;05B1\nhatafsegolwidehebrew;05B1\nhbar;0127\nhbopomofo;310F\nhbrevebelow;1E2B\nhcedilla;1E29\nhcircle;24D7\nhcircumflex;0125\nhdieresis;1E27\nhdotaccent;1E23\nhdotbelow;1E25\nhe;05D4\nheart;2665\nheartsuitblack;2665\nheartsuitwhite;2661\nhedagesh;FB34\nhedageshhebrew;FB34\nhehaltonearabic;06C1\nheharabic;0647\nhehebrew;05D4\nhehfinalaltonearabic;FBA7\nhehfinalalttwoarabic;FEEA\nhehfinalarabic;FEEA\nhehhamzaabovefinalarabic;FBA5\nhehhamzaaboveisolatedarabic;FBA4\nhehinitialaltonearabic;FBA8\nhehinitialarabic;FEEB\nhehiragana;3078\nhehmedialaltonearabic;FBA9\nhehmedialarabic;FEEC\nheiseierasquare;337B\nhekatakana;30D8\nhekatakanahalfwidth;FF8D\nhekutaarusquare;3336\nhenghook;0267\nherutusquare;3339\nhet;05D7\nhethebrew;05D7\nhhook;0266\nhhooksuperior;02B1\nhieuhacirclekorean;327B\nhieuhaparenkorean;321B\nhieuhcirclekorean;326D\nhieuhkorean;314E\nhieuhparenkorean;320D\nhihiragana;3072\nhikatakana;30D2\nhikatakanahalfwidth;FF8B\nhiriq;05B4\nhiriq14;05B4\nhiriq21;05B4\nhiriq2d;05B4\nhiriqhebrew;05B4\nhiriqnarrowhebrew;05B4\nhiriqquarterhebrew;05B4\nhiriqwidehebrew;05B4\nhlinebelow;1E96\nhmonospace;FF48\nhoarmenian;0570\nhohipthai;0E2B\nhohiragana;307B\nhokatakana;30DB\nhokatakanahalfwidth;FF8E\nholam;05B9\nholam19;05B9\nholam26;05B9\nholam32;05B9\nholamhebrew;05B9\nholamnarrowhebrew;05B9\nholamquarterhebrew;05B9\nholamwidehebrew;05B9\nhonokhukthai;0E2E\nhookabovecomb;0309\nhookcmb;0309\nhookpalatalizedbelowcmb;0321\nhookretroflexbelowcmb;0322\nhoonsquare;3342\nhoricoptic;03E9\nhorizontalbar;2015\nhorncmb;031B\nhotsprings;2668\nhouse;2302\nhparen;24A3\nhsuperior;02B0\nhturned;0265\nhuhiragana;3075\nhuiitosquare;3333\nhukatakana;30D5\nhukatakanahalfwidth;FF8C\nhungarumlaut;02DD\nhungarumlautcmb;030B\nhv;0195\nhyphen;002D\nhypheninferior;F6E5\nhyphenmonospace;FF0D\nhyphensmall;FE63\nhyphensuperior;F6E6\nhyphentwo;2010\ni;0069\niacute;00ED\niacyrillic;044F\nibengali;0987\nibopomofo;3127\nibreve;012D\nicaron;01D0\nicircle;24D8\nicircumflex;00EE\nicyrillic;0456\nidblgrave;0209\nideographearthcircle;328F\nideographfirecircle;328B\nideographicallianceparen;323F\nideographiccallparen;323A\nideographiccentrecircle;32A5\nideographicclose;3006\nideographiccomma;3001\nideographiccommaleft;FF64\nideographiccongratulationparen;3237\nideographiccorrectcircle;32A3\nideographicearthparen;322F\nideographicenterpriseparen;323D\nideographicexcellentcircle;329D\nideographicfestivalparen;3240\nideographicfinancialcircle;3296\nideographicfinancialparen;3236\nideographicfireparen;322B\nideographichaveparen;3232\nideographichighcircle;32A4\nideographiciterationmark;3005\nideographiclaborcircle;3298\nideographiclaborparen;3238\nideographicleftcircle;32A7\nideographiclowcircle;32A6\nideographicmedicinecircle;32A9\nideographicmetalparen;322E\nideographicmoonparen;322A\nideographicnameparen;3234\nideographicperiod;3002\nideographicprintcircle;329E\nideographicreachparen;3243\nideographicrepresentparen;3239\nideographicresourceparen;323E\nideographicrightcircle;32A8\nideographicsecretcircle;3299\nideographicselfparen;3242\nideographicsocietyparen;3233\nideographicspace;3000\nideographicspecialparen;3235\nideographicstockparen;3231\nideographicstudyparen;323B\nideographicsunparen;3230\nideographicsuperviseparen;323C\nideographicwaterparen;322C\nideographicwoodparen;322D\nideographiczero;3007\nideographmetalcircle;328E\nideographmooncircle;328A\nideographnamecircle;3294\nideographsuncircle;3290\nideographwatercircle;328C\nideographwoodcircle;328D\nideva;0907\nidieresis;00EF\nidieresisacute;1E2F\nidieresiscyrillic;04E5\nidotbelow;1ECB\niebrevecyrillic;04D7\niecyrillic;0435\nieungacirclekorean;3275\nieungaparenkorean;3215\nieungcirclekorean;3267\nieungkorean;3147\nieungparenkorean;3207\nigrave;00EC\nigujarati;0A87\nigurmukhi;0A07\nihiragana;3044\nihookabove;1EC9\niibengali;0988\niicyrillic;0438\niideva;0908\niigujarati;0A88\niigurmukhi;0A08\niimatragurmukhi;0A40\niinvertedbreve;020B\niishortcyrillic;0439\niivowelsignbengali;09C0\niivowelsigndeva;0940\niivowelsigngujarati;0AC0\nij;0133\nikatakana;30A4\nikatakanahalfwidth;FF72\nikorean;3163\nilde;02DC\niluyhebrew;05AC\nimacron;012B\nimacroncyrillic;04E3\nimageorapproximatelyequal;2253\nimatragurmukhi;0A3F\nimonospace;FF49\nincrement;2206\ninfinity;221E\niniarmenian;056B\nintegral;222B\nintegralbottom;2321\nintegralbt;2321\nintegralex;F8F5\nintegraltop;2320\nintegraltp;2320\nintersection;2229\nintisquare;3305\ninvbullet;25D8\ninvcircle;25D9\ninvsmileface;263B\niocyrillic;0451\niogonek;012F\niota;03B9\niotadieresis;03CA\niotadieresistonos;0390\niotalatin;0269\niotatonos;03AF\niparen;24A4\nirigurmukhi;0A72\nismallhiragana;3043\nismallkatakana;30A3\nismallkatakanahalfwidth;FF68\nissharbengali;09FA\nistroke;0268\nisuperior;F6ED\niterationhiragana;309D\niterationkatakana;30FD\nitilde;0129\nitildebelow;1E2D\niubopomofo;3129\niucyrillic;044E\nivowelsignbengali;09BF\nivowelsigndeva;093F\nivowelsigngujarati;0ABF\nizhitsacyrillic;0475\nizhitsadblgravecyrillic;0477\nj;006A\njaarmenian;0571\njabengali;099C\njadeva;091C\njagujarati;0A9C\njagurmukhi;0A1C\njbopomofo;3110\njcaron;01F0\njcircle;24D9\njcircumflex;0135\njcrossedtail;029D\njdotlessstroke;025F\njecyrillic;0458\njeemarabic;062C\njeemfinalarabic;FE9E\njeeminitialarabic;FE9F\njeemmedialarabic;FEA0\njeharabic;0698\njehfinalarabic;FB8B\njhabengali;099D\njhadeva;091D\njhagujarati;0A9D\njhagurmukhi;0A1D\njheharmenian;057B\njis;3004\njmonospace;FF4A\njparen;24A5\njsuperior;02B2\nk;006B\nkabashkircyrillic;04A1\nkabengali;0995\nkacute;1E31\nkacyrillic;043A\nkadescendercyrillic;049B\nkadeva;0915\nkaf;05DB\nkafarabic;0643\nkafdagesh;FB3B\nkafdageshhebrew;FB3B\nkaffinalarabic;FEDA\nkafhebrew;05DB\nkafinitialarabic;FEDB\nkafmedialarabic;FEDC\nkafrafehebrew;FB4D\nkagujarati;0A95\nkagurmukhi;0A15\nkahiragana;304B\nkahookcyrillic;04C4\nkakatakana;30AB\nkakatakanahalfwidth;FF76\nkappa;03BA\nkappasymbolgreek;03F0\nkapyeounmieumkorean;3171\nkapyeounphieuphkorean;3184\nkapyeounpieupkorean;3178\nkapyeounssangpieupkorean;3179\nkaroriisquare;330D\nkashidaautoarabic;0640\nkashidaautonosidebearingarabic;0640\nkasmallkatakana;30F5\nkasquare;3384\nkasraarabic;0650\nkasratanarabic;064D\nkastrokecyrillic;049F\nkatahiraprolongmarkhalfwidth;FF70\nkaverticalstrokecyrillic;049D\nkbopomofo;310E\nkcalsquare;3389\nkcaron;01E9\nkcedilla;0137\nkcircle;24DA\nkcommaaccent;0137\nkdotbelow;1E33\nkeharmenian;0584\nkehiragana;3051\nkekatakana;30B1\nkekatakanahalfwidth;FF79\nkenarmenian;056F\nkesmallkatakana;30F6\nkgreenlandic;0138\nkhabengali;0996\nkhacyrillic;0445\nkhadeva;0916\nkhagujarati;0A96\nkhagurmukhi;0A16\nkhaharabic;062E\nkhahfinalarabic;FEA6\nkhahinitialarabic;FEA7\nkhahmedialarabic;FEA8\nkheicoptic;03E7\nkhhadeva;0959\nkhhagurmukhi;0A59\nkhieukhacirclekorean;3278\nkhieukhaparenkorean;3218\nkhieukhcirclekorean;326A\nkhieukhkorean;314B\nkhieukhparenkorean;320A\nkhokhaithai;0E02\nkhokhonthai;0E05\nkhokhuatthai;0E03\nkhokhwaithai;0E04\nkhomutthai;0E5B\nkhook;0199\nkhorakhangthai;0E06\nkhzsquare;3391\nkihiragana;304D\nkikatakana;30AD\nkikatakanahalfwidth;FF77\nkiroguramusquare;3315\nkiromeetorusquare;3316\nkirosquare;3314\nkiyeokacirclekorean;326E\nkiyeokaparenkorean;320E\nkiyeokcirclekorean;3260\nkiyeokkorean;3131\nkiyeokparenkorean;3200\nkiyeoksioskorean;3133\nkjecyrillic;045C\nklinebelow;1E35\nklsquare;3398\nkmcubedsquare;33A6\nkmonospace;FF4B\nkmsquaredsquare;33A2\nkohiragana;3053\nkohmsquare;33C0\nkokaithai;0E01\nkokatakana;30B3\nkokatakanahalfwidth;FF7A\nkooposquare;331E\nkoppacyrillic;0481\nkoreanstandardsymbol;327F\nkoroniscmb;0343\nkparen;24A6\nkpasquare;33AA\nksicyrillic;046F\nktsquare;33CF\nkturned;029E\nkuhiragana;304F\nkukatakana;30AF\nkukatakanahalfwidth;FF78\nkvsquare;33B8\nkwsquare;33BE\nl;006C\nlabengali;09B2\nlacute;013A\nladeva;0932\nlagujarati;0AB2\nlagurmukhi;0A32\nlakkhangyaothai;0E45\nlamaleffinalarabic;FEFC\nlamalefhamzaabovefinalarabic;FEF8\nlamalefhamzaaboveisolatedarabic;FEF7\nlamalefhamzabelowfinalarabic;FEFA\nlamalefhamzabelowisolatedarabic;FEF9\nlamalefisolatedarabic;FEFB\nlamalefmaddaabovefinalarabic;FEF6\nlamalefmaddaaboveisolatedarabic;FEF5\nlamarabic;0644\nlambda;03BB\nlambdastroke;019B\nlamed;05DC\nlameddagesh;FB3C\nlameddageshhebrew;FB3C\nlamedhebrew;05DC\nlamedholam;05DC 05B9\nlamedholamdagesh;05DC 05B9 05BC\nlamedholamdageshhebrew;05DC 05B9 05BC\nlamedholamhebrew;05DC 05B9\nlamfinalarabic;FEDE\nlamhahinitialarabic;FCCA\nlaminitialarabic;FEDF\nlamjeeminitialarabic;FCC9\nlamkhahinitialarabic;FCCB\nlamlamhehisolatedarabic;FDF2\nlammedialarabic;FEE0\nlammeemhahinitialarabic;FD88\nlammeeminitialarabic;FCCC\nlammeemjeeminitialarabic;FEDF FEE4 FEA0\nlammeemkhahinitialarabic;FEDF FEE4 FEA8\nlargecircle;25EF\nlbar;019A\nlbelt;026C\nlbopomofo;310C\nlcaron;013E\nlcedilla;013C\nlcircle;24DB\nlcircumflexbelow;1E3D\nlcommaaccent;013C\nldot;0140\nldotaccent;0140\nldotbelow;1E37\nldotbelowmacron;1E39\nleftangleabovecmb;031A\nlefttackbelowcmb;0318\nless;003C\nlessequal;2264\nlessequalorgreater;22DA\nlessmonospace;FF1C\nlessorequivalent;2272\nlessorgreater;2276\nlessoverequal;2266\nlesssmall;FE64\nlezh;026E\nlfblock;258C\nlhookretroflex;026D\nlira;20A4\nliwnarmenian;056C\nlj;01C9\nljecyrillic;0459\nll;F6C0\nlladeva;0933\nllagujarati;0AB3\nllinebelow;1E3B\nllladeva;0934\nllvocalicbengali;09E1\nllvocalicdeva;0961\nllvocalicvowelsignbengali;09E3\nllvocalicvowelsigndeva;0963\nlmiddletilde;026B\nlmonospace;FF4C\nlmsquare;33D0\nlochulathai;0E2C\nlogicaland;2227\nlogicalnot;00AC\nlogicalnotreversed;2310\nlogicalor;2228\nlolingthai;0E25\nlongs;017F\nlowlinecenterline;FE4E\nlowlinecmb;0332\nlowlinedashed;FE4D\nlozenge;25CA\nlparen;24A7\nlslash;0142\nlsquare;2113\nlsuperior;F6EE\nltshade;2591\nluthai;0E26\nlvocalicbengali;098C\nlvocalicdeva;090C\nlvocalicvowelsignbengali;09E2\nlvocalicvowelsigndeva;0962\nlxsquare;33D3\nm;006D\nmabengali;09AE\nmacron;00AF\nmacronbelowcmb;0331\nmacroncmb;0304\nmacronlowmod;02CD\nmacronmonospace;FFE3\nmacute;1E3F\nmadeva;092E\nmagujarati;0AAE\nmagurmukhi;0A2E\nmahapakhhebrew;05A4\nmahapakhlefthebrew;05A4\nmahiragana;307E\nmaichattawalowleftthai;F895\nmaichattawalowrightthai;F894\nmaichattawathai;0E4B\nmaichattawaupperleftthai;F893\nmaieklowleftthai;F88C\nmaieklowrightthai;F88B\nmaiekthai;0E48\nmaiekupperleftthai;F88A\nmaihanakatleftthai;F884\nmaihanakatthai;0E31\nmaitaikhuleftthai;F889\nmaitaikhuthai;0E47\nmaitholowleftthai;F88F\nmaitholowrightthai;F88E\nmaithothai;0E49\nmaithoupperleftthai;F88D\nmaitrilowleftthai;F892\nmaitrilowrightthai;F891\nmaitrithai;0E4A\nmaitriupperleftthai;F890\nmaiyamokthai;0E46\nmakatakana;30DE\nmakatakanahalfwidth;FF8F\nmale;2642\nmansyonsquare;3347\nmaqafhebrew;05BE\nmars;2642\nmasoracirclehebrew;05AF\nmasquare;3383\nmbopomofo;3107\nmbsquare;33D4\nmcircle;24DC\nmcubedsquare;33A5\nmdotaccent;1E41\nmdotbelow;1E43\nmeemarabic;0645\nmeemfinalarabic;FEE2\nmeeminitialarabic;FEE3\nmeemmedialarabic;FEE4\nmeemmeeminitialarabic;FCD1\nmeemmeemisolatedarabic;FC48\nmeetorusquare;334D\nmehiragana;3081\nmeizierasquare;337E\nmekatakana;30E1\nmekatakanahalfwidth;FF92\nmem;05DE\nmemdagesh;FB3E\nmemdageshhebrew;FB3E\nmemhebrew;05DE\nmenarmenian;0574\nmerkhahebrew;05A5\nmerkhakefulahebrew;05A6\nmerkhakefulalefthebrew;05A6\nmerkhalefthebrew;05A5\nmhook;0271\nmhzsquare;3392\nmiddledotkatakanahalfwidth;FF65\nmiddot;00B7\nmieumacirclekorean;3272\nmieumaparenkorean;3212\nmieumcirclekorean;3264\nmieumkorean;3141\nmieumpansioskorean;3170\nmieumparenkorean;3204\nmieumpieupkorean;316E\nmieumsioskorean;316F\nmihiragana;307F\nmikatakana;30DF\nmikatakanahalfwidth;FF90\nminus;2212\nminusbelowcmb;0320\nminuscircle;2296\nminusmod;02D7\nminusplus;2213\nminute;2032\nmiribaarusquare;334A\nmirisquare;3349\nmlonglegturned;0270\nmlsquare;3396\nmmcubedsquare;33A3\nmmonospace;FF4D\nmmsquaredsquare;339F\nmohiragana;3082\nmohmsquare;33C1\nmokatakana;30E2\nmokatakanahalfwidth;FF93\nmolsquare;33D6\nmomathai;0E21\nmoverssquare;33A7\nmoverssquaredsquare;33A8\nmparen;24A8\nmpasquare;33AB\nmssquare;33B3\nmsuperior;F6EF\nmturned;026F\nmu;00B5\nmu1;00B5\nmuasquare;3382\nmuchgreater;226B\nmuchless;226A\nmufsquare;338C\nmugreek;03BC\nmugsquare;338D\nmuhiragana;3080\nmukatakana;30E0\nmukatakanahalfwidth;FF91\nmulsquare;3395\nmultiply;00D7\nmumsquare;339B\nmunahhebrew;05A3\nmunahlefthebrew;05A3\nmusicalnote;266A\nmusicalnotedbl;266B\nmusicflatsign;266D\nmusicsharpsign;266F\nmussquare;33B2\nmuvsquare;33B6\nmuwsquare;33BC\nmvmegasquare;33B9\nmvsquare;33B7\nmwmegasquare;33BF\nmwsquare;33BD\nn;006E\nnabengali;09A8\nnabla;2207\nnacute;0144\nnadeva;0928\nnagujarati;0AA8\nnagurmukhi;0A28\nnahiragana;306A\nnakatakana;30CA\nnakatakanahalfwidth;FF85\nnapostrophe;0149\nnasquare;3381\nnbopomofo;310B\nnbspace;00A0\nncaron;0148\nncedilla;0146\nncircle;24DD\nncircumflexbelow;1E4B\nncommaaccent;0146\nndotaccent;1E45\nndotbelow;1E47\nnehiragana;306D\nnekatakana;30CD\nnekatakanahalfwidth;FF88\nnewsheqelsign;20AA\nnfsquare;338B\nngabengali;0999\nngadeva;0919\nngagujarati;0A99\nngagurmukhi;0A19\nngonguthai;0E07\nnhiragana;3093\nnhookleft;0272\nnhookretroflex;0273\nnieunacirclekorean;326F\nnieunaparenkorean;320F\nnieuncieuckorean;3135\nnieuncirclekorean;3261\nnieunhieuhkorean;3136\nnieunkorean;3134\nnieunpansioskorean;3168\nnieunparenkorean;3201\nnieunsioskorean;3167\nnieuntikeutkorean;3166\nnihiragana;306B\nnikatakana;30CB\nnikatakanahalfwidth;FF86\nnikhahitleftthai;F899\nnikhahitthai;0E4D\nnine;0039\nninearabic;0669\nninebengali;09EF\nninecircle;2468\nninecircleinversesansserif;2792\nninedeva;096F\nninegujarati;0AEF\nninegurmukhi;0A6F\nninehackarabic;0669\nninehangzhou;3029\nnineideographicparen;3228\nnineinferior;2089\nninemonospace;FF19\nnineoldstyle;F739\nnineparen;247C\nnineperiod;2490\nninepersian;06F9\nnineroman;2178\nninesuperior;2079\nnineteencircle;2472\nnineteenparen;2486\nnineteenperiod;249A\nninethai;0E59\nnj;01CC\nnjecyrillic;045A\nnkatakana;30F3\nnkatakanahalfwidth;FF9D\nnlegrightlong;019E\nnlinebelow;1E49\nnmonospace;FF4E\nnmsquare;339A\nnnabengali;09A3\nnnadeva;0923\nnnagujarati;0AA3\nnnagurmukhi;0A23\nnnnadeva;0929\nnohiragana;306E\nnokatakana;30CE\nnokatakanahalfwidth;FF89\nnonbreakingspace;00A0\nnonenthai;0E13\nnonuthai;0E19\nnoonarabic;0646\nnoonfinalarabic;FEE6\nnoonghunnaarabic;06BA\nnoonghunnafinalarabic;FB9F\nnoonhehinitialarabic;FEE7 FEEC\nnooninitialarabic;FEE7\nnoonjeeminitialarabic;FCD2\nnoonjeemisolatedarabic;FC4B\nnoonmedialarabic;FEE8\nnoonmeeminitialarabic;FCD5\nnoonmeemisolatedarabic;FC4E\nnoonnoonfinalarabic;FC8D\nnotcontains;220C\nnotelement;2209\nnotelementof;2209\nnotequal;2260\nnotgreater;226F\nnotgreaternorequal;2271\nnotgreaternorless;2279\nnotidentical;2262\nnotless;226E\nnotlessnorequal;2270\nnotparallel;2226\nnotprecedes;2280\nnotsubset;2284\nnotsucceeds;2281\nnotsuperset;2285\nnowarmenian;0576\nnparen;24A9\nnssquare;33B1\nnsuperior;207F\nntilde;00F1\nnu;03BD\nnuhiragana;306C\nnukatakana;30CC\nnukatakanahalfwidth;FF87\nnuktabengali;09BC\nnuktadeva;093C\nnuktagujarati;0ABC\nnuktagurmukhi;0A3C\nnumbersign;0023\nnumbersignmonospace;FF03\nnumbersignsmall;FE5F\nnumeralsigngreek;0374\nnumeralsignlowergreek;0375\nnumero;2116\nnun;05E0\nnundagesh;FB40\nnundageshhebrew;FB40\nnunhebrew;05E0\nnvsquare;33B5\nnwsquare;33BB\nnyabengali;099E\nnyadeva;091E\nnyagujarati;0A9E\nnyagurmukhi;0A1E\no;006F\noacute;00F3\noangthai;0E2D\nobarred;0275\nobarredcyrillic;04E9\nobarreddieresiscyrillic;04EB\nobengali;0993\nobopomofo;311B\nobreve;014F\nocandradeva;0911\nocandragujarati;0A91\nocandravowelsigndeva;0949\nocandravowelsigngujarati;0AC9\nocaron;01D2\nocircle;24DE\nocircumflex;00F4\nocircumflexacute;1ED1\nocircumflexdotbelow;1ED9\nocircumflexgrave;1ED3\nocircumflexhookabove;1ED5\nocircumflextilde;1ED7\nocyrillic;043E\nodblacute;0151\nodblgrave;020D\nodeva;0913\nodieresis;00F6\nodieresiscyrillic;04E7\nodotbelow;1ECD\noe;0153\noekorean;315A\nogonek;02DB\nogonekcmb;0328\nograve;00F2\nogujarati;0A93\noharmenian;0585\nohiragana;304A\nohookabove;1ECF\nohorn;01A1\nohornacute;1EDB\nohorndotbelow;1EE3\nohorngrave;1EDD\nohornhookabove;1EDF\nohorntilde;1EE1\nohungarumlaut;0151\noi;01A3\noinvertedbreve;020F\nokatakana;30AA\nokatakanahalfwidth;FF75\nokorean;3157\nolehebrew;05AB\nomacron;014D\nomacronacute;1E53\nomacrongrave;1E51\nomdeva;0950\nomega;03C9\nomega1;03D6\nomegacyrillic;0461\nomegalatinclosed;0277\nomegaroundcyrillic;047B\nomegatitlocyrillic;047D\nomegatonos;03CE\nomgujarati;0AD0\nomicron;03BF\nomicrontonos;03CC\nomonospace;FF4F\none;0031\nonearabic;0661\nonebengali;09E7\nonecircle;2460\nonecircleinversesansserif;278A\nonedeva;0967\nonedotenleader;2024\noneeighth;215B\nonefitted;F6DC\nonegujarati;0AE7\nonegurmukhi;0A67\nonehackarabic;0661\nonehalf;00BD\nonehangzhou;3021\noneideographicparen;3220\noneinferior;2081\nonemonospace;FF11\nonenumeratorbengali;09F4\noneoldstyle;F731\noneparen;2474\noneperiod;2488\nonepersian;06F1\nonequarter;00BC\noneroman;2170\nonesuperior;00B9\nonethai;0E51\nonethird;2153\noogonek;01EB\noogonekmacron;01ED\noogurmukhi;0A13\noomatragurmukhi;0A4B\noopen;0254\noparen;24AA\nopenbullet;25E6\noption;2325\nordfeminine;00AA\nordmasculine;00BA\northogonal;221F\noshortdeva;0912\noshortvowelsigndeva;094A\noslash;00F8\noslashacute;01FF\nosmallhiragana;3049\nosmallkatakana;30A9\nosmallkatakanahalfwidth;FF6B\nostrokeacute;01FF\nosuperior;F6F0\notcyrillic;047F\notilde;00F5\notildeacute;1E4D\notildedieresis;1E4F\noubopomofo;3121\noverline;203E\noverlinecenterline;FE4A\noverlinecmb;0305\noverlinedashed;FE49\noverlinedblwavy;FE4C\noverlinewavy;FE4B\noverscore;00AF\novowelsignbengali;09CB\novowelsigndeva;094B\novowelsigngujarati;0ACB\np;0070\npaampssquare;3380\npaasentosquare;332B\npabengali;09AA\npacute;1E55\npadeva;092A\npagedown;21DF\npageup;21DE\npagujarati;0AAA\npagurmukhi;0A2A\npahiragana;3071\npaiyannoithai;0E2F\npakatakana;30D1\npalatalizationcyrilliccmb;0484\npalochkacyrillic;04C0\npansioskorean;317F\nparagraph;00B6\nparallel;2225\nparenleft;0028\nparenleftaltonearabic;FD3E\nparenleftbt;F8ED\nparenleftex;F8EC\nparenleftinferior;208D\nparenleftmonospace;FF08\nparenleftsmall;FE59\nparenleftsuperior;207D\nparenlefttp;F8EB\nparenleftvertical;FE35\nparenright;0029\nparenrightaltonearabic;FD3F\nparenrightbt;F8F8\nparenrightex;F8F7\nparenrightinferior;208E\nparenrightmonospace;FF09\nparenrightsmall;FE5A\nparenrightsuperior;207E\nparenrighttp;F8F6\nparenrightvertical;FE36\npartialdiff;2202\npaseqhebrew;05C0\npashtahebrew;0599\npasquare;33A9\npatah;05B7\npatah11;05B7\npatah1d;05B7\npatah2a;05B7\npatahhebrew;05B7\npatahnarrowhebrew;05B7\npatahquarterhebrew;05B7\npatahwidehebrew;05B7\npazerhebrew;05A1\npbopomofo;3106\npcircle;24DF\npdotaccent;1E57\npe;05E4\npecyrillic;043F\npedagesh;FB44\npedageshhebrew;FB44\npeezisquare;333B\npefinaldageshhebrew;FB43\npeharabic;067E\npeharmenian;057A\npehebrew;05E4\npehfinalarabic;FB57\npehinitialarabic;FB58\npehiragana;307A\npehmedialarabic;FB59\npekatakana;30DA\npemiddlehookcyrillic;04A7\nperafehebrew;FB4E\npercent;0025\npercentarabic;066A\npercentmonospace;FF05\npercentsmall;FE6A\nperiod;002E\nperiodarmenian;0589\nperiodcentered;00B7\nperiodhalfwidth;FF61\nperiodinferior;F6E7\nperiodmonospace;FF0E\nperiodsmall;FE52\nperiodsuperior;F6E8\nperispomenigreekcmb;0342\nperpendicular;22A5\nperthousand;2030\npeseta;20A7\npfsquare;338A\nphabengali;09AB\nphadeva;092B\nphagujarati;0AAB\nphagurmukhi;0A2B\nphi;03C6\nphi1;03D5\nphieuphacirclekorean;327A\nphieuphaparenkorean;321A\nphieuphcirclekorean;326C\nphieuphkorean;314D\nphieuphparenkorean;320C\nphilatin;0278\nphinthuthai;0E3A\nphisymbolgreek;03D5\nphook;01A5\nphophanthai;0E1E\nphophungthai;0E1C\nphosamphaothai;0E20\npi;03C0\npieupacirclekorean;3273\npieupaparenkorean;3213\npieupcieuckorean;3176\npieupcirclekorean;3265\npieupkiyeokkorean;3172\npieupkorean;3142\npieupparenkorean;3205\npieupsioskiyeokkorean;3174\npieupsioskorean;3144\npieupsiostikeutkorean;3175\npieupthieuthkorean;3177\npieuptikeutkorean;3173\npihiragana;3074\npikatakana;30D4\npisymbolgreek;03D6\npiwrarmenian;0583\nplus;002B\nplusbelowcmb;031F\npluscircle;2295\nplusminus;00B1\nplusmod;02D6\nplusmonospace;FF0B\nplussmall;FE62\nplussuperior;207A\npmonospace;FF50\npmsquare;33D8\npohiragana;307D\npointingindexdownwhite;261F\npointingindexleftwhite;261C\npointingindexrightwhite;261E\npointingindexupwhite;261D\npokatakana;30DD\npoplathai;0E1B\npostalmark;3012\npostalmarkface;3020\npparen;24AB\nprecedes;227A\nprescription;211E\nprimemod;02B9\nprimereversed;2035\nproduct;220F\nprojective;2305\nprolongedkana;30FC\npropellor;2318\npropersubset;2282\npropersuperset;2283\nproportion;2237\nproportional;221D\npsi;03C8\npsicyrillic;0471\npsilipneumatacyrilliccmb;0486\npssquare;33B0\npuhiragana;3077\npukatakana;30D7\npvsquare;33B4\npwsquare;33BA\nq;0071\nqadeva;0958\nqadmahebrew;05A8\nqafarabic;0642\nqaffinalarabic;FED6\nqafinitialarabic;FED7\nqafmedialarabic;FED8\nqamats;05B8\nqamats10;05B8\nqamats1a;05B8\nqamats1c;05B8\nqamats27;05B8\nqamats29;05B8\nqamats33;05B8\nqamatsde;05B8\nqamatshebrew;05B8\nqamatsnarrowhebrew;05B8\nqamatsqatanhebrew;05B8\nqamatsqatannarrowhebrew;05B8\nqamatsqatanquarterhebrew;05B8\nqamatsqatanwidehebrew;05B8\nqamatsquarterhebrew;05B8\nqamatswidehebrew;05B8\nqarneyparahebrew;059F\nqbopomofo;3111\nqcircle;24E0\nqhook;02A0\nqmonospace;FF51\nqof;05E7\nqofdagesh;FB47\nqofdageshhebrew;FB47\nqofhatafpatah;05E7 05B2\nqofhatafpatahhebrew;05E7 05B2\nqofhatafsegol;05E7 05B1\nqofhatafsegolhebrew;05E7 05B1\nqofhebrew;05E7\nqofhiriq;05E7 05B4\nqofhiriqhebrew;05E7 05B4\nqofholam;05E7 05B9\nqofholamhebrew;05E7 05B9\nqofpatah;05E7 05B7\nqofpatahhebrew;05E7 05B7\nqofqamats;05E7 05B8\nqofqamatshebrew;05E7 05B8\nqofqubuts;05E7 05BB\nqofqubutshebrew;05E7 05BB\nqofsegol;05E7 05B6\nqofsegolhebrew;05E7 05B6\nqofsheva;05E7 05B0\nqofshevahebrew;05E7 05B0\nqoftsere;05E7 05B5\nqoftserehebrew;05E7 05B5\nqparen;24AC\nquarternote;2669\nqubuts;05BB\nqubuts18;05BB\nqubuts25;05BB\nqubuts31;05BB\nqubutshebrew;05BB\nqubutsnarrowhebrew;05BB\nqubutsquarterhebrew;05BB\nqubutswidehebrew;05BB\nquestion;003F\nquestionarabic;061F\nquestionarmenian;055E\nquestiondown;00BF\nquestiondownsmall;F7BF\nquestiongreek;037E\nquestionmonospace;FF1F\nquestionsmall;F73F\nquotedbl;0022\nquotedblbase;201E\nquotedblleft;201C\nquotedblmonospace;FF02\nquotedblprime;301E\nquotedblprimereversed;301D\nquotedblright;201D\nquoteleft;2018\nquoteleftreversed;201B\nquotereversed;201B\nquoteright;2019\nquoterightn;0149\nquotesinglbase;201A\nquotesingle;0027\nquotesinglemonospace;FF07\nr;0072\nraarmenian;057C\nrabengali;09B0\nracute;0155\nradeva;0930\nradical;221A\nradicalex;F8E5\nradoverssquare;33AE\nradoverssquaredsquare;33AF\nradsquare;33AD\nrafe;05BF\nrafehebrew;05BF\nragujarati;0AB0\nragurmukhi;0A30\nrahiragana;3089\nrakatakana;30E9\nrakatakanahalfwidth;FF97\nralowerdiagonalbengali;09F1\nramiddlediagonalbengali;09F0\nramshorn;0264\nratio;2236\nrbopomofo;3116\nrcaron;0159\nrcedilla;0157\nrcircle;24E1\nrcommaaccent;0157\nrdblgrave;0211\nrdotaccent;1E59\nrdotbelow;1E5B\nrdotbelowmacron;1E5D\nreferencemark;203B\nreflexsubset;2286\nreflexsuperset;2287\nregistered;00AE\nregistersans;F8E8\nregisterserif;F6DA\nreharabic;0631\nreharmenian;0580\nrehfinalarabic;FEAE\nrehiragana;308C\nrehyehaleflamarabic;0631 FEF3 FE8E 0644\nrekatakana;30EC\nrekatakanahalfwidth;FF9A\nresh;05E8\nreshdageshhebrew;FB48\nreshhatafpatah;05E8 05B2\nreshhatafpatahhebrew;05E8 05B2\nreshhatafsegol;05E8 05B1\nreshhatafsegolhebrew;05E8 05B1\nreshhebrew;05E8\nreshhiriq;05E8 05B4\nreshhiriqhebrew;05E8 05B4\nreshholam;05E8 05B9\nreshholamhebrew;05E8 05B9\nreshpatah;05E8 05B7\nreshpatahhebrew;05E8 05B7\nreshqamats;05E8 05B8\nreshqamatshebrew;05E8 05B8\nreshqubuts;05E8 05BB\nreshqubutshebrew;05E8 05BB\nreshsegol;05E8 05B6\nreshsegolhebrew;05E8 05B6\nreshsheva;05E8 05B0\nreshshevahebrew;05E8 05B0\nreshtsere;05E8 05B5\nreshtserehebrew;05E8 05B5\nreversedtilde;223D\nreviahebrew;0597\nreviamugrashhebrew;0597\nrevlogicalnot;2310\nrfishhook;027E\nrfishhookreversed;027F\nrhabengali;09DD\nrhadeva;095D\nrho;03C1\nrhook;027D\nrhookturned;027B\nrhookturnedsuperior;02B5\nrhosymbolgreek;03F1\nrhotichookmod;02DE\nrieulacirclekorean;3271\nrieulaparenkorean;3211\nrieulcirclekorean;3263\nrieulhieuhkorean;3140\nrieulkiyeokkorean;313A\nrieulkiyeoksioskorean;3169\nrieulkorean;3139\nrieulmieumkorean;313B\nrieulpansioskorean;316C\nrieulparenkorean;3203\nrieulphieuphkorean;313F\nrieulpieupkorean;313C\nrieulpieupsioskorean;316B\nrieulsioskorean;313D\nrieulthieuthkorean;313E\nrieultikeutkorean;316A\nrieulyeorinhieuhkorean;316D\nrightangle;221F\nrighttackbelowcmb;0319\nrighttriangle;22BF\nrihiragana;308A\nrikatakana;30EA\nrikatakanahalfwidth;FF98\nring;02DA\nringbelowcmb;0325\nringcmb;030A\nringhalfleft;02BF\nringhalfleftarmenian;0559\nringhalfleftbelowcmb;031C\nringhalfleftcentered;02D3\nringhalfright;02BE\nringhalfrightbelowcmb;0339\nringhalfrightcentered;02D2\nrinvertedbreve;0213\nrittorusquare;3351\nrlinebelow;1E5F\nrlongleg;027C\nrlonglegturned;027A\nrmonospace;FF52\nrohiragana;308D\nrokatakana;30ED\nrokatakanahalfwidth;FF9B\nroruathai;0E23\nrparen;24AD\nrrabengali;09DC\nrradeva;0931\nrragurmukhi;0A5C\nrreharabic;0691\nrrehfinalarabic;FB8D\nrrvocalicbengali;09E0\nrrvocalicdeva;0960\nrrvocalicgujarati;0AE0\nrrvocalicvowelsignbengali;09C4\nrrvocalicvowelsigndeva;0944\nrrvocalicvowelsigngujarati;0AC4\nrsuperior;F6F1\nrtblock;2590\nrturned;0279\nrturnedsuperior;02B4\nruhiragana;308B\nrukatakana;30EB\nrukatakanahalfwidth;FF99\nrupeemarkbengali;09F2\nrupeesignbengali;09F3\nrupiah;F6DD\nruthai;0E24\nrvocalicbengali;098B\nrvocalicdeva;090B\nrvocalicgujarati;0A8B\nrvocalicvowelsignbengali;09C3\nrvocalicvowelsigndeva;0943\nrvocalicvowelsigngujarati;0AC3\ns;0073\nsabengali;09B8\nsacute;015B\nsacutedotaccent;1E65\nsadarabic;0635\nsadeva;0938\nsadfinalarabic;FEBA\nsadinitialarabic;FEBB\nsadmedialarabic;FEBC\nsagujarati;0AB8\nsagurmukhi;0A38\nsahiragana;3055\nsakatakana;30B5\nsakatakanahalfwidth;FF7B\nsallallahoualayhewasallamarabic;FDFA\nsamekh;05E1\nsamekhdagesh;FB41\nsamekhdageshhebrew;FB41\nsamekhhebrew;05E1\nsaraaathai;0E32\nsaraaethai;0E41\nsaraaimaimalaithai;0E44\nsaraaimaimuanthai;0E43\nsaraamthai;0E33\nsaraathai;0E30\nsaraethai;0E40\nsaraiileftthai;F886\nsaraiithai;0E35\nsaraileftthai;F885\nsaraithai;0E34\nsaraothai;0E42\nsaraueeleftthai;F888\nsaraueethai;0E37\nsaraueleftthai;F887\nsarauethai;0E36\nsarauthai;0E38\nsarauuthai;0E39\nsbopomofo;3119\nscaron;0161\nscarondotaccent;1E67\nscedilla;015F\nschwa;0259\nschwacyrillic;04D9\nschwadieresiscyrillic;04DB\nschwahook;025A\nscircle;24E2\nscircumflex;015D\nscommaaccent;0219\nsdotaccent;1E61\nsdotbelow;1E63\nsdotbelowdotaccent;1E69\nseagullbelowcmb;033C\nsecond;2033\nsecondtonechinese;02CA\nsection;00A7\nseenarabic;0633\nseenfinalarabic;FEB2\nseeninitialarabic;FEB3\nseenmedialarabic;FEB4\nsegol;05B6\nsegol13;05B6\nsegol1f;05B6\nsegol2c;05B6\nsegolhebrew;05B6\nsegolnarrowhebrew;05B6\nsegolquarterhebrew;05B6\nsegoltahebrew;0592\nsegolwidehebrew;05B6\nseharmenian;057D\nsehiragana;305B\nsekatakana;30BB\nsekatakanahalfwidth;FF7E\nsemicolon;003B\nsemicolonarabic;061B\nsemicolonmonospace;FF1B\nsemicolonsmall;FE54\nsemivoicedmarkkana;309C\nsemivoicedmarkkanahalfwidth;FF9F\nsentisquare;3322\nsentosquare;3323\nseven;0037\nsevenarabic;0667\nsevenbengali;09ED\nsevencircle;2466\nsevencircleinversesansserif;2790\nsevendeva;096D\nseveneighths;215E\nsevengujarati;0AED\nsevengurmukhi;0A6D\nsevenhackarabic;0667\nsevenhangzhou;3027\nsevenideographicparen;3226\nseveninferior;2087\nsevenmonospace;FF17\nsevenoldstyle;F737\nsevenparen;247A\nsevenperiod;248E\nsevenpersian;06F7\nsevenroman;2176\nsevensuperior;2077\nseventeencircle;2470\nseventeenparen;2484\nseventeenperiod;2498\nseventhai;0E57\nsfthyphen;00AD\nshaarmenian;0577\nshabengali;09B6\nshacyrillic;0448\nshaddaarabic;0651\nshaddadammaarabic;FC61\nshaddadammatanarabic;FC5E\nshaddafathaarabic;FC60\nshaddafathatanarabic;0651 064B\nshaddakasraarabic;FC62\nshaddakasratanarabic;FC5F\nshade;2592\nshadedark;2593\nshadelight;2591\nshademedium;2592\nshadeva;0936\nshagujarati;0AB6\nshagurmukhi;0A36\nshalshelethebrew;0593\nshbopomofo;3115\nshchacyrillic;0449\nsheenarabic;0634\nsheenfinalarabic;FEB6\nsheeninitialarabic;FEB7\nsheenmedialarabic;FEB8\nsheicoptic;03E3\nsheqel;20AA\nsheqelhebrew;20AA\nsheva;05B0\nsheva115;05B0\nsheva15;05B0\nsheva22;05B0\nsheva2e;05B0\nshevahebrew;05B0\nshevanarrowhebrew;05B0\nshevaquarterhebrew;05B0\nshevawidehebrew;05B0\nshhacyrillic;04BB\nshimacoptic;03ED\nshin;05E9\nshindagesh;FB49\nshindageshhebrew;FB49\nshindageshshindot;FB2C\nshindageshshindothebrew;FB2C\nshindageshsindot;FB2D\nshindageshsindothebrew;FB2D\nshindothebrew;05C1\nshinhebrew;05E9\nshinshindot;FB2A\nshinshindothebrew;FB2A\nshinsindot;FB2B\nshinsindothebrew;FB2B\nshook;0282\nsigma;03C3\nsigma1;03C2\nsigmafinal;03C2\nsigmalunatesymbolgreek;03F2\nsihiragana;3057\nsikatakana;30B7\nsikatakanahalfwidth;FF7C\nsiluqhebrew;05BD\nsiluqlefthebrew;05BD\nsimilar;223C\nsindothebrew;05C2\nsiosacirclekorean;3274\nsiosaparenkorean;3214\nsioscieuckorean;317E\nsioscirclekorean;3266\nsioskiyeokkorean;317A\nsioskorean;3145\nsiosnieunkorean;317B\nsiosparenkorean;3206\nsiospieupkorean;317D\nsiostikeutkorean;317C\nsix;0036\nsixarabic;0666\nsixbengali;09EC\nsixcircle;2465\nsixcircleinversesansserif;278F\nsixdeva;096C\nsixgujarati;0AEC\nsixgurmukhi;0A6C\nsixhackarabic;0666\nsixhangzhou;3026\nsixideographicparen;3225\nsixinferior;2086\nsixmonospace;FF16\nsixoldstyle;F736\nsixparen;2479\nsixperiod;248D\nsixpersian;06F6\nsixroman;2175\nsixsuperior;2076\nsixteencircle;246F\nsixteencurrencydenominatorbengali;09F9\nsixteenparen;2483\nsixteenperiod;2497\nsixthai;0E56\nslash;002F\nslashmonospace;FF0F\nslong;017F\nslongdotaccent;1E9B\nsmileface;263A\nsmonospace;FF53\nsofpasuqhebrew;05C3\nsofthyphen;00AD\nsoftsigncyrillic;044C\nsohiragana;305D\nsokatakana;30BD\nsokatakanahalfwidth;FF7F\nsoliduslongoverlaycmb;0338\nsolidusshortoverlaycmb;0337\nsorusithai;0E29\nsosalathai;0E28\nsosothai;0E0B\nsosuathai;0E2A\nspace;0020\nspacehackarabic;0020\nspade;2660\nspadesuitblack;2660\nspadesuitwhite;2664\nsparen;24AE\nsquarebelowcmb;033B\nsquarecc;33C4\nsquarecm;339D\nsquarediagonalcrosshatchfill;25A9\nsquarehorizontalfill;25A4\nsquarekg;338F\nsquarekm;339E\nsquarekmcapital;33CE\nsquareln;33D1\nsquarelog;33D2\nsquaremg;338E\nsquaremil;33D5\nsquaremm;339C\nsquaremsquared;33A1\nsquareorthogonalcrosshatchfill;25A6\nsquareupperlefttolowerrightfill;25A7\nsquareupperrighttolowerleftfill;25A8\nsquareverticalfill;25A5\nsquarewhitewithsmallblack;25A3\nsrsquare;33DB\nssabengali;09B7\nssadeva;0937\nssagujarati;0AB7\nssangcieuckorean;3149\nssanghieuhkorean;3185\nssangieungkorean;3180\nssangkiyeokkorean;3132\nssangnieunkorean;3165\nssangpieupkorean;3143\nssangsioskorean;3146\nssangtikeutkorean;3138\nssuperior;F6F2\nsterling;00A3\nsterlingmonospace;FFE1\nstrokelongoverlaycmb;0336\nstrokeshortoverlaycmb;0335\nsubset;2282\nsubsetnotequal;228A\nsubsetorequal;2286\nsucceeds;227B\nsuchthat;220B\nsuhiragana;3059\nsukatakana;30B9\nsukatakanahalfwidth;FF7D\nsukunarabic;0652\nsummation;2211\nsun;263C\nsuperset;2283\nsupersetnotequal;228B\nsupersetorequal;2287\nsvsquare;33DC\nsyouwaerasquare;337C\nt;0074\ntabengali;09A4\ntackdown;22A4\ntackleft;22A3\ntadeva;0924\ntagujarati;0AA4\ntagurmukhi;0A24\ntaharabic;0637\ntahfinalarabic;FEC2\ntahinitialarabic;FEC3\ntahiragana;305F\ntahmedialarabic;FEC4\ntaisyouerasquare;337D\ntakatakana;30BF\ntakatakanahalfwidth;FF80\ntatweelarabic;0640\ntau;03C4\ntav;05EA\ntavdages;FB4A\ntavdagesh;FB4A\ntavdageshhebrew;FB4A\ntavhebrew;05EA\ntbar;0167\ntbopomofo;310A\ntcaron;0165\ntccurl;02A8\ntcedilla;0163\ntcheharabic;0686\ntchehfinalarabic;FB7B\ntchehinitialarabic;FB7C\ntchehmedialarabic;FB7D\ntchehmeeminitialarabic;FB7C FEE4\ntcircle;24E3\ntcircumflexbelow;1E71\ntcommaaccent;0163\ntdieresis;1E97\ntdotaccent;1E6B\ntdotbelow;1E6D\ntecyrillic;0442\ntedescendercyrillic;04AD\nteharabic;062A\ntehfinalarabic;FE96\ntehhahinitialarabic;FCA2\ntehhahisolatedarabic;FC0C\ntehinitialarabic;FE97\ntehiragana;3066\ntehjeeminitialarabic;FCA1\ntehjeemisolatedarabic;FC0B\ntehmarbutaarabic;0629\ntehmarbutafinalarabic;FE94\ntehmedialarabic;FE98\ntehmeeminitialarabic;FCA4\ntehmeemisolatedarabic;FC0E\ntehnoonfinalarabic;FC73\ntekatakana;30C6\ntekatakanahalfwidth;FF83\ntelephone;2121\ntelephoneblack;260E\ntelishagedolahebrew;05A0\ntelishaqetanahebrew;05A9\ntencircle;2469\ntenideographicparen;3229\ntenparen;247D\ntenperiod;2491\ntenroman;2179\ntesh;02A7\ntet;05D8\ntetdagesh;FB38\ntetdageshhebrew;FB38\ntethebrew;05D8\ntetsecyrillic;04B5\ntevirhebrew;059B\ntevirlefthebrew;059B\nthabengali;09A5\nthadeva;0925\nthagujarati;0AA5\nthagurmukhi;0A25\nthalarabic;0630\nthalfinalarabic;FEAC\nthanthakhatlowleftthai;F898\nthanthakhatlowrightthai;F897\nthanthakhatthai;0E4C\nthanthakhatupperleftthai;F896\ntheharabic;062B\nthehfinalarabic;FE9A\nthehinitialarabic;FE9B\nthehmedialarabic;FE9C\nthereexists;2203\ntherefore;2234\ntheta;03B8\ntheta1;03D1\nthetasymbolgreek;03D1\nthieuthacirclekorean;3279\nthieuthaparenkorean;3219\nthieuthcirclekorean;326B\nthieuthkorean;314C\nthieuthparenkorean;320B\nthirteencircle;246C\nthirteenparen;2480\nthirteenperiod;2494\nthonangmonthothai;0E11\nthook;01AD\nthophuthaothai;0E12\nthorn;00FE\nthothahanthai;0E17\nthothanthai;0E10\nthothongthai;0E18\nthothungthai;0E16\nthousandcyrillic;0482\nthousandsseparatorarabic;066C\nthousandsseparatorpersian;066C\nthree;0033\nthreearabic;0663\nthreebengali;09E9\nthreecircle;2462\nthreecircleinversesansserif;278C\nthreedeva;0969\nthreeeighths;215C\nthreegujarati;0AE9\nthreegurmukhi;0A69\nthreehackarabic;0663\nthreehangzhou;3023\nthreeideographicparen;3222\nthreeinferior;2083\nthreemonospace;FF13\nthreenumeratorbengali;09F6\nthreeoldstyle;F733\nthreeparen;2476\nthreeperiod;248A\nthreepersian;06F3\nthreequarters;00BE\nthreequartersemdash;F6DE\nthreeroman;2172\nthreesuperior;00B3\nthreethai;0E53\nthzsquare;3394\ntihiragana;3061\ntikatakana;30C1\ntikatakanahalfwidth;FF81\ntikeutacirclekorean;3270\ntikeutaparenkorean;3210\ntikeutcirclekorean;3262\ntikeutkorean;3137\ntikeutparenkorean;3202\ntilde;02DC\ntildebelowcmb;0330\ntildecmb;0303\ntildecomb;0303\ntildedoublecmb;0360\ntildeoperator;223C\ntildeoverlaycmb;0334\ntildeverticalcmb;033E\ntimescircle;2297\ntipehahebrew;0596\ntipehalefthebrew;0596\ntippigurmukhi;0A70\ntitlocyrilliccmb;0483\ntiwnarmenian;057F\ntlinebelow;1E6F\ntmonospace;FF54\ntoarmenian;0569\ntohiragana;3068\ntokatakana;30C8\ntokatakanahalfwidth;FF84\ntonebarextrahighmod;02E5\ntonebarextralowmod;02E9\ntonebarhighmod;02E6\ntonebarlowmod;02E8\ntonebarmidmod;02E7\ntonefive;01BD\ntonesix;0185\ntonetwo;01A8\ntonos;0384\ntonsquare;3327\ntopatakthai;0E0F\ntortoiseshellbracketleft;3014\ntortoiseshellbracketleftsmall;FE5D\ntortoiseshellbracketleftvertical;FE39\ntortoiseshellbracketright;3015\ntortoiseshellbracketrightsmall;FE5E\ntortoiseshellbracketrightvertical;FE3A\ntotaothai;0E15\ntpalatalhook;01AB\ntparen;24AF\ntrademark;2122\ntrademarksans;F8EA\ntrademarkserif;F6DB\ntretroflexhook;0288\ntriagdn;25BC\ntriaglf;25C4\ntriagrt;25BA\ntriagup;25B2\nts;02A6\ntsadi;05E6\ntsadidagesh;FB46\ntsadidageshhebrew;FB46\ntsadihebrew;05E6\ntsecyrillic;0446\ntsere;05B5\ntsere12;05B5\ntsere1e;05B5\ntsere2b;05B5\ntserehebrew;05B5\ntserenarrowhebrew;05B5\ntserequarterhebrew;05B5\ntserewidehebrew;05B5\ntshecyrillic;045B\ntsuperior;F6F3\nttabengali;099F\nttadeva;091F\nttagujarati;0A9F\nttagurmukhi;0A1F\ntteharabic;0679\nttehfinalarabic;FB67\nttehinitialarabic;FB68\nttehmedialarabic;FB69\ntthabengali;09A0\ntthadeva;0920\ntthagujarati;0AA0\ntthagurmukhi;0A20\ntturned;0287\ntuhiragana;3064\ntukatakana;30C4\ntukatakanahalfwidth;FF82\ntusmallhiragana;3063\ntusmallkatakana;30C3\ntusmallkatakanahalfwidth;FF6F\ntwelvecircle;246B\ntwelveparen;247F\ntwelveperiod;2493\ntwelveroman;217B\ntwentycircle;2473\ntwentyhangzhou;5344\ntwentyparen;2487\ntwentyperiod;249B\ntwo;0032\ntwoarabic;0662\ntwobengali;09E8\ntwocircle;2461\ntwocircleinversesansserif;278B\ntwodeva;0968\ntwodotenleader;2025\ntwodotleader;2025\ntwodotleadervertical;FE30\ntwogujarati;0AE8\ntwogurmukhi;0A68\ntwohackarabic;0662\ntwohangzhou;3022\ntwoideographicparen;3221\ntwoinferior;2082\ntwomonospace;FF12\ntwonumeratorbengali;09F5\ntwooldstyle;F732\ntwoparen;2475\ntwoperiod;2489\ntwopersian;06F2\ntworoman;2171\ntwostroke;01BB\ntwosuperior;00B2\ntwothai;0E52\ntwothirds;2154\nu;0075\nuacute;00FA\nubar;0289\nubengali;0989\nubopomofo;3128\nubreve;016D\nucaron;01D4\nucircle;24E4\nucircumflex;00FB\nucircumflexbelow;1E77\nucyrillic;0443\nudattadeva;0951\nudblacute;0171\nudblgrave;0215\nudeva;0909\nudieresis;00FC\nudieresisacute;01D8\nudieresisbelow;1E73\nudieresiscaron;01DA\nudieresiscyrillic;04F1\nudieresisgrave;01DC\nudieresismacron;01D6\nudotbelow;1EE5\nugrave;00F9\nugujarati;0A89\nugurmukhi;0A09\nuhiragana;3046\nuhookabove;1EE7\nuhorn;01B0\nuhornacute;1EE9\nuhorndotbelow;1EF1\nuhorngrave;1EEB\nuhornhookabove;1EED\nuhorntilde;1EEF\nuhungarumlaut;0171\nuhungarumlautcyrillic;04F3\nuinvertedbreve;0217\nukatakana;30A6\nukatakanahalfwidth;FF73\nukcyrillic;0479\nukorean;315C\numacron;016B\numacroncyrillic;04EF\numacrondieresis;1E7B\numatragurmukhi;0A41\numonospace;FF55\nunderscore;005F\nunderscoredbl;2017\nunderscoremonospace;FF3F\nunderscorevertical;FE33\nunderscorewavy;FE4F\nunion;222A\nuniversal;2200\nuogonek;0173\nuparen;24B0\nupblock;2580\nupperdothebrew;05C4\nupsilon;03C5\nupsilondieresis;03CB\nupsilondieresistonos;03B0\nupsilonlatin;028A\nupsilontonos;03CD\nuptackbelowcmb;031D\nuptackmod;02D4\nuragurmukhi;0A73\nuring;016F\nushortcyrillic;045E\nusmallhiragana;3045\nusmallkatakana;30A5\nusmallkatakanahalfwidth;FF69\nustraightcyrillic;04AF\nustraightstrokecyrillic;04B1\nutilde;0169\nutildeacute;1E79\nutildebelow;1E75\nuubengali;098A\nuudeva;090A\nuugujarati;0A8A\nuugurmukhi;0A0A\nuumatragurmukhi;0A42\nuuvowelsignbengali;09C2\nuuvowelsigndeva;0942\nuuvowelsigngujarati;0AC2\nuvowelsignbengali;09C1\nuvowelsigndeva;0941\nuvowelsigngujarati;0AC1\nv;0076\nvadeva;0935\nvagujarati;0AB5\nvagurmukhi;0A35\nvakatakana;30F7\nvav;05D5\nvavdagesh;FB35\nvavdagesh65;FB35\nvavdageshhebrew;FB35\nvavhebrew;05D5\nvavholam;FB4B\nvavholamhebrew;FB4B\nvavvavhebrew;05F0\nvavyodhebrew;05F1\nvcircle;24E5\nvdotbelow;1E7F\nvecyrillic;0432\nveharabic;06A4\nvehfinalarabic;FB6B\nvehinitialarabic;FB6C\nvehmedialarabic;FB6D\nvekatakana;30F9\nvenus;2640\nverticalbar;007C\nverticallineabovecmb;030D\nverticallinebelowcmb;0329\nverticallinelowmod;02CC\nverticallinemod;02C8\nvewarmenian;057E\nvhook;028B\nvikatakana;30F8\nviramabengali;09CD\nviramadeva;094D\nviramagujarati;0ACD\nvisargabengali;0983\nvisargadeva;0903\nvisargagujarati;0A83\nvmonospace;FF56\nvoarmenian;0578\nvoicediterationhiragana;309E\nvoicediterationkatakana;30FE\nvoicedmarkkana;309B\nvoicedmarkkanahalfwidth;FF9E\nvokatakana;30FA\nvparen;24B1\nvtilde;1E7D\nvturned;028C\nvuhiragana;3094\nvukatakana;30F4\nw;0077\nwacute;1E83\nwaekorean;3159\nwahiragana;308F\nwakatakana;30EF\nwakatakanahalfwidth;FF9C\nwakorean;3158\nwasmallhiragana;308E\nwasmallkatakana;30EE\nwattosquare;3357\nwavedash;301C\nwavyunderscorevertical;FE34\nwawarabic;0648\nwawfinalarabic;FEEE\nwawhamzaabovearabic;0624\nwawhamzaabovefinalarabic;FE86\nwbsquare;33DD\nwcircle;24E6\nwcircumflex;0175\nwdieresis;1E85\nwdotaccent;1E87\nwdotbelow;1E89\nwehiragana;3091\nweierstrass;2118\nwekatakana;30F1\nwekorean;315E\nweokorean;315D\nwgrave;1E81\nwhitebullet;25E6\nwhitecircle;25CB\nwhitecircleinverse;25D9\nwhitecornerbracketleft;300E\nwhitecornerbracketleftvertical;FE43\nwhitecornerbracketright;300F\nwhitecornerbracketrightvertical;FE44\nwhitediamond;25C7\nwhitediamondcontainingblacksmalldiamond;25C8\nwhitedownpointingsmalltriangle;25BF\nwhitedownpointingtriangle;25BD\nwhiteleftpointingsmalltriangle;25C3\nwhiteleftpointingtriangle;25C1\nwhitelenticularbracketleft;3016\nwhitelenticularbracketright;3017\nwhiterightpointingsmalltriangle;25B9\nwhiterightpointingtriangle;25B7\nwhitesmallsquare;25AB\nwhitesmilingface;263A\nwhitesquare;25A1\nwhitestar;2606\nwhitetelephone;260F\nwhitetortoiseshellbracketleft;3018\nwhitetortoiseshellbracketright;3019\nwhiteuppointingsmalltriangle;25B5\nwhiteuppointingtriangle;25B3\nwihiragana;3090\nwikatakana;30F0\nwikorean;315F\nwmonospace;FF57\nwohiragana;3092\nwokatakana;30F2\nwokatakanahalfwidth;FF66\nwon;20A9\nwonmonospace;FFE6\nwowaenthai;0E27\nwparen;24B2\nwring;1E98\nwsuperior;02B7\nwturned;028D\nwynn;01BF\nx;0078\nxabovecmb;033D\nxbopomofo;3112\nxcircle;24E7\nxdieresis;1E8D\nxdotaccent;1E8B\nxeharmenian;056D\nxi;03BE\nxmonospace;FF58\nxparen;24B3\nxsuperior;02E3\ny;0079\nyaadosquare;334E\nyabengali;09AF\nyacute;00FD\nyadeva;092F\nyaekorean;3152\nyagujarati;0AAF\nyagurmukhi;0A2F\nyahiragana;3084\nyakatakana;30E4\nyakatakanahalfwidth;FF94\nyakorean;3151\nyamakkanthai;0E4E\nyasmallhiragana;3083\nyasmallkatakana;30E3\nyasmallkatakanahalfwidth;FF6C\nyatcyrillic;0463\nycircle;24E8\nycircumflex;0177\nydieresis;00FF\nydotaccent;1E8F\nydotbelow;1EF5\nyeharabic;064A\nyehbarreearabic;06D2\nyehbarreefinalarabic;FBAF\nyehfinalarabic;FEF2\nyehhamzaabovearabic;0626\nyehhamzaabovefinalarabic;FE8A\nyehhamzaaboveinitialarabic;FE8B\nyehhamzaabovemedialarabic;FE8C\nyehinitialarabic;FEF3\nyehmedialarabic;FEF4\nyehmeeminitialarabic;FCDD\nyehmeemisolatedarabic;FC58\nyehnoonfinalarabic;FC94\nyehthreedotsbelowarabic;06D1\nyekorean;3156\nyen;00A5\nyenmonospace;FFE5\nyeokorean;3155\nyeorinhieuhkorean;3186\nyerahbenyomohebrew;05AA\nyerahbenyomolefthebrew;05AA\nyericyrillic;044B\nyerudieresiscyrillic;04F9\nyesieungkorean;3181\nyesieungpansioskorean;3183\nyesieungsioskorean;3182\nyetivhebrew;059A\nygrave;1EF3\nyhook;01B4\nyhookabove;1EF7\nyiarmenian;0575\nyicyrillic;0457\nyikorean;3162\nyinyang;262F\nyiwnarmenian;0582\nymonospace;FF59\nyod;05D9\nyoddagesh;FB39\nyoddageshhebrew;FB39\nyodhebrew;05D9\nyodyodhebrew;05F2\nyodyodpatahhebrew;FB1F\nyohiragana;3088\nyoikorean;3189\nyokatakana;30E8\nyokatakanahalfwidth;FF96\nyokorean;315B\nyosmallhiragana;3087\nyosmallkatakana;30E7\nyosmallkatakanahalfwidth;FF6E\nyotgreek;03F3\nyoyaekorean;3188\nyoyakorean;3187\nyoyakthai;0E22\nyoyingthai;0E0D\nyparen;24B4\nypogegrammeni;037A\nypogegrammenigreekcmb;0345\nyr;01A6\nyring;1E99\nysuperior;02B8\nytilde;1EF9\nyturned;028E\nyuhiragana;3086\nyuikorean;318C\nyukatakana;30E6\nyukatakanahalfwidth;FF95\nyukorean;3160\nyusbigcyrillic;046B\nyusbigiotifiedcyrillic;046D\nyuslittlecyrillic;0467\nyuslittleiotifiedcyrillic;0469\nyusmallhiragana;3085\nyusmallkatakana;30E5\nyusmallkatakanahalfwidth;FF6D\nyuyekorean;318B\nyuyeokorean;318A\nyyabengali;09DF\nyyadeva;095F\nz;007A\nzaarmenian;0566\nzacute;017A\nzadeva;095B\nzagurmukhi;0A5B\nzaharabic;0638\nzahfinalarabic;FEC6\nzahinitialarabic;FEC7\nzahiragana;3056\nzahmedialarabic;FEC8\nzainarabic;0632\nzainfinalarabic;FEB0\nzakatakana;30B6\nzaqefgadolhebrew;0595\nzaqefqatanhebrew;0594\nzarqahebrew;0598\nzayin;05D6\nzayindagesh;FB36\nzayindageshhebrew;FB36\nzayinhebrew;05D6\nzbopomofo;3117\nzcaron;017E\nzcircle;24E9\nzcircumflex;1E91\nzcurl;0291\nzdot;017C\nzdotaccent;017C\nzdotbelow;1E93\nzecyrillic;0437\nzedescendercyrillic;0499\nzedieresiscyrillic;04DF\nzehiragana;305C\nzekatakana;30BC\nzero;0030\nzeroarabic;0660\nzerobengali;09E6\nzerodeva;0966\nzerogujarati;0AE6\nzerogurmukhi;0A66\nzerohackarabic;0660\nzeroinferior;2080\nzeromonospace;FF10\nzerooldstyle;F730\nzeropersian;06F0\nzerosuperior;2070\nzerothai;0E50\nzerowidthjoiner;FEFF\nzerowidthnonjoiner;200C\nzerowidthspace;200B\nzeta;03B6\nzhbopomofo;3113\nzhearmenian;056A\nzhebrevecyrillic;04C2\nzhecyrillic;0436\nzhedescendercyrillic;0497\nzhedieresiscyrillic;04DD\nzihiragana;3058\nzikatakana;30B8\nzinorhebrew;05AE\nzlinebelow;1E95\nzmonospace;FF5A\nzohiragana;305E\nzokatakana;30BE\nzparen;24B5\nzretroflexhook;0290\nzstroke;01B6\nzuhiragana;305A\nzukatakana;30BA\na100;275E\na101;2761\na102;2762\na103;2763\na104;2764\na105;2710\na106;2765\na107;2766\na108;2767\na109;2660\na10;2721\na110;2665\na111;2666\na112;2663\na117;2709\na118;2708\na119;2707\na11;261B\na120;2460\na121;2461\na122;2462\na123;2463\na124;2464\na125;2465\na126;2466\na127;2467\na128;2468\na129;2469\na12;261E\na130;2776\na131;2777\na132;2778\na133;2779\na134;277A\na135;277B\na136;277C\na137;277D\na138;277E\na139;277F\na13;270C\na140;2780\na141;2781\na142;2782\na143;2783\na144;2784\na145;2785\na146;2786\na147;2787\na148;2788\na149;2789\na14;270D\na150;278A\na151;278B\na152;278C\na153;278D\na154;278E\na155;278F\na156;2790\na157;2791\na158;2792\na159;2793\na15;270E\na160;2794\na161;2192\na162;27A3\na163;2194\na164;2195\na165;2799\na166;279B\na167;279C\na168;279D\na169;279E\na16;270F\na170;279F\na171;27A0\na172;27A1\na173;27A2\na174;27A4\na175;27A5\na176;27A6\na177;27A7\na178;27A8\na179;27A9\na17;2711\na180;27AB\na181;27AD\na182;27AF\na183;27B2\na184;27B3\na185;27B5\na186;27B8\na187;27BA\na188;27BB\na189;27BC\na18;2712\na190;27BD\na191;27BE\na192;279A\na193;27AA\na194;27B6\na195;27B9\na196;2798\na197;27B4\na198;27B7\na199;27AC\na19;2713\na1;2701\na200;27AE\na201;27B1\na202;2703\na203;2750\na204;2752\na205;276E\na206;2770\na20;2714\na21;2715\na22;2716\na23;2717\na24;2718\na25;2719\na26;271A\na27;271B\na28;271C\na29;2722\na2;2702\na30;2723\na31;2724\na32;2725\na33;2726\na34;2727\na35;2605\na36;2729\na37;272A\na38;272B\na39;272C\na3;2704\na40;272D\na41;272E\na42;272F\na43;2730\na44;2731\na45;2732\na46;2733\na47;2734\na48;2735\na49;2736\na4;260E\na50;2737\na51;2738\na52;2739\na53;273A\na54;273B\na55;273C\na56;273D\na57;273E\na58;273F\na59;2740\na5;2706\na60;2741\na61;2742\na62;2743\na63;2744\na64;2745\na65;2746\na66;2747\na67;2748\na68;2749\na69;274A\na6;271D\na70;274B\na71;25CF\na72;274D\na73;25A0\na74;274F\na75;2751\na76;25B2\na77;25BC\na78;25C6\na79;2756\na7;271E\na81;25D7\na82;2758\na83;2759\na84;275A\na85;276F\na86;2771\na87;2772\na88;2773\na89;2768\na8;271F\na90;2769\na91;276C\na92;276D\na93;276A\na94;276B\na95;2774\na96;2775\na97;275B\na98;275C\na99;275D\na9;2720\n\"\"\"\n\n\n# string table management\n#\nclass StringTable:\n  def __init__( self, name_list, master_table_name ):\n    self.names        = name_list\n    self.master_table = master_table_name\n    self.indices      = {}\n    index             = 0\n\n    for name in name_list:\n      self.indices[name] = index\n      index += len( name ) + 1\n\n    self.total = index\n\n  def dump( self, file ):\n    write = file.write\n    write( \"  static const char  \" + self.master_table +\n           \"[\" + repr( self.total ) + \"] =\\n\" )\n    write( \"  {\\n\" )\n\n    line = \"\"\n    for name in self.names:\n      line += \"    '\"\n      line += string.join( ( re.findall( \".\", name ) ), \"','\" )\n      line += \"', 0,\\n\"\n\n    write( line + \"  };\\n\\n\\n\" )\n\n  def dump_sublist( self, file, table_name, macro_name, sublist ):\n    write = file.write\n    write( \"#define \" + macro_name + \"  \" + repr( len( sublist ) ) + \"\\n\\n\" )\n\n    write( \"  /* Values are offsets into the `\" +\n           self.master_table + \"' table */\\n\\n\" )\n    write( \"  static const short  \" + table_name +\n           \"[\" + macro_name + \"] =\\n\" )\n    write( \"  {\\n\" )\n\n    line  = \"    \"\n    comma = \"\"\n    col   = 0\n\n    for name in sublist:\n      line += comma\n      line += \"%4d\" % self.indices[name]\n      col  += 1\n      comma = \",\"\n      if col == 14:\n        col   = 0\n        comma = \",\\n    \"\n\n    write( line + \"\\n  };\\n\\n\\n\" )\n\n\n# We now store the Adobe Glyph List in compressed form.  The list is put\n# into a data structure called `trie' (because it has a tree-like\n# appearance).  Consider, for example, that you want to store the\n# following name mapping:\n#\n#   A        => 1\n#   Aacute   => 6\n#   Abalon   => 2\n#   Abstract => 4\n#\n# It is possible to store the entries as follows.\n#\n#   A => 1\n#   |\n#   +-acute => 6\n#   |\n#   +-b\n#     |\n#     +-alon => 2\n#     |\n#     +-stract => 4\n#\n# We see that each node in the trie has:\n#\n# - one or more `letters'\n# - an optional value\n# - zero or more child nodes\n#\n# The first step is to call\n#\n#   root = StringNode( \"\", 0 )\n#   for word in map.values():\n#     root.add( word, map[word] )\n#\n# which creates a large trie where each node has only one children.\n#\n# Executing\n#\n#   root = root.optimize()\n#\n# optimizes the trie by merging the letters of successive nodes whenever\n# possible.\n#\n# Each node of the trie is stored as follows.\n#\n# - First the node's letter, according to the following scheme.  We\n#   use the fact that in the AGL no name contains character codes > 127.\n#\n#     name         bitsize     description\n#     ----------------------------------------------------------------\n#     notlast            1     Set to 1 if this is not the last letter\n#                              in the word.\n#     ascii              7     The letter's ASCII value.\n#\n# - The letter is followed by a children count and the value of the\n#   current key (if any).  Again we can do some optimization because all\n#   AGL entries are from the BMP; this means that 16 bits are sufficient\n#   to store its Unicode values.  Additionally, no node has more than\n#   127 children.\n#\n#     name         bitsize     description\n#     -----------------------------------------\n#     hasvalue           1     Set to 1 if a 16-bit Unicode value follows.\n#     num_children       7     Number of children.  Can be 0 only if\n#                              `hasvalue' is set to 1.\n#     value             16     Optional Unicode value.\n#\n# - A node is finished by a list of 16bit absolute offsets to the\n#   children, which must be sorted in increasing order of their first\n#   letter.\n#\n# For simplicity, all 16bit quantities are stored in big-endian order.\n#\n# The root node has first letter = 0, and no value.\n#\nclass StringNode:\n  def __init__( self, letter, value ):\n    self.letter   = letter\n    self.value    = value\n    self.children = {}\n\n  def __cmp__( self, other ):\n    return ord( self.letter[0] ) - ord( other.letter[0] )\n\n  def add( self, word, value ):\n    if len( word ) == 0:\n      self.value = value\n      return\n\n    letter = word[0]\n    word   = word[1:]\n\n    if self.children.has_key( letter ):\n      child = self.children[letter]\n    else:\n      child = StringNode( letter, 0 )\n      self.children[letter] = child\n\n    child.add( word, value )\n\n  def optimize( self ):\n    # optimize all children first\n    children      = self.children.values()\n    self.children = {}\n\n    for child in children:\n      self.children[child.letter[0]] = child.optimize()\n\n    # don't optimize if there's a value,\n    # if we don't have any child or if we\n    # have more than one child\n    if ( self.value != 0 ) or ( not children ) or len( children ) > 1:\n      return self\n\n    child = children[0]\n\n    self.letter  += child.letter\n    self.value    = child.value\n    self.children = child.children\n\n    return self\n\n  def dump_debug( self, write, margin ):\n    # this is used during debugging\n    line = margin + \"+-\"\n    if len( self.letter ) == 0:\n      line += \"<NOLETTER>\"\n    else:\n      line += self.letter\n\n    if self.value:\n      line += \" => \" + repr( self.value )\n\n    write( line + \"\\n\" )\n\n    if self.children:\n      margin += \"| \"\n      for child in self.children.values():\n        child.dump_debug( write, margin )\n\n  def locate( self, index ):\n    self.index = index\n    if len( self.letter ) > 0:\n      index += len( self.letter ) + 1\n    else:\n      index += 2\n\n    if self.value != 0:\n      index += 2\n\n    children = self.children.values()\n    children.sort()\n\n    index += 2 * len( children )\n    for child in children:\n      index = child.locate( index )\n\n    return index\n\n  def store( self, storage ):\n    # write the letters\n    l = len( self.letter )\n    if l == 0:\n      storage += struct.pack( \"B\", 0 )\n    else:\n      for n in range( l ):\n        val = ord( self.letter[n] )\n        if n < l - 1:\n          val += 128\n        storage += struct.pack( \"B\", val )\n\n    # write the count\n    children = self.children.values()\n    children.sort()\n\n    count = len( children )\n\n    if self.value != 0:\n      storage += struct.pack( \"!BH\", count + 128, self.value )\n    else:\n      storage += struct.pack( \"B\", count )\n\n    for child in children:\n      storage += struct.pack( \"!H\", child.index )\n\n    for child in children:\n      storage = child.store( storage )\n\n    return storage\n\n\ndef adobe_glyph_values():\n  \"\"\"return the list of glyph names and their unicode values\"\"\"\n\n  lines  = string.split( adobe_glyph_list, '\\n' )\n  glyphs = []\n  values = []\n\n  for line in lines:\n    if line:\n      fields = string.split( line, ';' )\n#     print fields[1] + ' - ' + fields[0]\n      subfields = string.split( fields[1], ' ' )\n      if len( subfields ) == 1:\n        glyphs.append( fields[0] )\n        values.append( fields[1] )\n\n  return glyphs, values\n\n\ndef filter_glyph_names( alist, filter ):\n  \"\"\"filter `alist' by taking _out_ all glyph names that are in `filter'\"\"\"\n\n  count  = 0\n  extras = []\n\n  for name in alist:\n    try:\n      filtered_index = filter.index( name )\n    except:\n      extras.append( name )\n\n  return extras\n\n\ndef dump_encoding( file, encoding_name, encoding_list ):\n  \"\"\"dump a given encoding\"\"\"\n\n  write = file.write\n  write( \"  /* the following are indices into the SID name table */\\n\" )\n  write( \"  static const unsigned short  \" + encoding_name +\n         \"[\" + repr( len( encoding_list ) ) + \"] =\\n\" )\n  write( \"  {\\n\" )\n\n  line  = \"    \"\n  comma = \"\"\n  col   = 0\n  for value in encoding_list:\n    line += comma\n    line += \"%3d\" % value\n    comma = \",\"\n    col  += 1\n    if col == 16:\n      col = 0\n      comma = \",\\n    \"\n\n  write( line + \"\\n  };\\n\\n\\n\" )\n\n\ndef dump_array( the_array, write, array_name ):\n  \"\"\"dumps a given encoding\"\"\"\n\n  write( \"  static const unsigned char  \" + array_name +\n         \"[\" + repr( len( the_array ) ) + \"L] =\\n\" )\n  write( \"  {\\n\" )\n\n  line  = \"\"\n  comma = \"    \"\n  col   = 0\n\n  for value in the_array:\n    line += comma\n    line += \"%3d\" % ord( value )\n    comma = \",\"\n    col  += 1\n\n    if col == 16:\n      col   = 0\n      comma = \",\\n    \"\n\n    if len( line ) > 1024:\n      write( line )\n      line = \"\"\n\n  write( line + \"\\n  };\\n\\n\\n\" )\n\n\ndef main():\n  \"\"\"main program body\"\"\"\n\n  if len( sys.argv ) != 2:\n    print __doc__ % sys.argv[0]\n    sys.exit( 1 )\n\n  file  = open( sys.argv[1], \"w\\n\" )\n  write = file.write\n\n  count_sid = len( sid_standard_names )\n\n  # `mac_extras' contains the list of glyph names in the Macintosh standard\n  # encoding which are not in the SID Standard Names.\n  #\n  mac_extras = filter_glyph_names( mac_standard_names, sid_standard_names )\n\n  # `base_list' contains the names of our final glyph names table.\n  # It consists of the `mac_extras' glyph names, followed by the SID\n  # standard names.\n  #\n  mac_extras_count = len( mac_extras )\n  base_list        = mac_extras + sid_standard_names\n\n  write( \"/***************************************************************************/\\n\" )\n  write( \"/*                                                                         */\\n\" )\n\n  write( \"/*  %-71s*/\\n\" % os.path.basename( sys.argv[1] ) )\n\n  write( \"/*                                                                         */\\n\" )\n  write( \"/*    PostScript glyph names.                                              */\\n\" )\n  write( \"/*                                                                         */\\n\" )\n  write( \"/*  Copyright 2005, 2008, 2011 by                                          */\\n\" )\n  write( \"/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\\n\" )\n  write( \"/*                                                                         */\\n\" )\n  write( \"/*  This file is part of the FreeType project, and may only be used,       */\\n\" )\n  write( \"/*  modified, and distributed under the terms of the FreeType project      */\\n\" )\n  write( \"/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\\n\" )\n  write( \"/*  this file you indicate that you have read the license and              */\\n\" )\n  write( \"/*  understand and accept it fully.                                        */\\n\" )\n  write( \"/*                                                                         */\\n\" )\n  write( \"/***************************************************************************/\\n\" )\n  write( \"\\n\" )\n  write( \"\\n\" )\n  write( \"  /* This file has been generated automatically -- do not edit! */\\n\" )\n  write( \"\\n\" )\n  write( \"\\n\" )\n\n  # dump final glyph list (mac extras + sid standard names)\n  #\n  st = StringTable( base_list, \"ft_standard_glyph_names\" )\n\n  st.dump( file )\n  st.dump_sublist( file, \"ft_mac_names\",\n                   \"FT_NUM_MAC_NAMES\", mac_standard_names )\n  st.dump_sublist( file, \"ft_sid_names\",\n                   \"FT_NUM_SID_NAMES\", sid_standard_names )\n\n  dump_encoding( file, \"t1_standard_encoding\", t1_standard_encoding )\n  dump_encoding( file, \"t1_expert_encoding\", t1_expert_encoding )\n\n  # dump the AGL in its compressed form\n  #\n  agl_glyphs, agl_values = adobe_glyph_values()\n  dict = StringNode( \"\", 0 )\n\n  for g in range( len( agl_glyphs ) ):\n    dict.add( agl_glyphs[g], eval( \"0x\" + agl_values[g] ) )\n\n  dict       = dict.optimize()\n  dict_len   = dict.locate( 0 )\n  dict_array = dict.store( \"\" )\n\n  write( \"\"\"\\\n  /*\n   *  This table is a compressed version of the Adobe Glyph List (AGL),\n   *  optimized for efficient searching.  It has been generated by the\n   *  `glnames.py' python script located in the `src/tools' directory.\n   *\n   *  The lookup function to get the Unicode value for a given string\n   *  is defined below the table.\n   */\n\n#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n\"\"\" )\n\n  dump_array( dict_array, write, \"ft_adobe_glyph_list\" )\n\n  # write the lookup routine now\n  #\n  write( \"\"\"\\\n  /*\n   *  This function searches the compressed table efficiently.\n   */\n  static unsigned long\n  ft_get_adobe_glyph_index( const char*  name,\n                            const char*  limit )\n  {\n    int                   c = 0;\n    int                   count, min, max;\n    const unsigned char*  p = ft_adobe_glyph_list;\n\n\n    if ( name == 0 || name >= limit )\n      goto NotFound;\n\n    c     = *name++;\n    count = p[1];\n    p    += 2;\n\n    min = 0;\n    max = count;\n\n    while ( min < max )\n    {\n      int                   mid = ( min + max ) >> 1;\n      const unsigned char*  q   = p + mid * 2;\n      int                   c2;\n\n\n      q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );\n\n      c2 = q[0] & 127;\n      if ( c2 == c )\n      {\n        p = q;\n        goto Found;\n      }\n      if ( c2 < c )\n        min = mid + 1;\n      else\n        max = mid;\n    }\n    goto NotFound;\n\n  Found:\n    for (;;)\n    {\n      /* assert (*p & 127) == c */\n\n      if ( name >= limit )\n      {\n        if ( (p[0] & 128) == 0 &&\n             (p[1] & 128) != 0 )\n          return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );\n\n        goto NotFound;\n      }\n      c = *name++;\n      if ( p[0] & 128 )\n      {\n        p++;\n        if ( c != (p[0] & 127) )\n          goto NotFound;\n\n        continue;\n      }\n\n      p++;\n      count = p[0] & 127;\n      if ( p[0] & 128 )\n        p += 2;\n\n      p++;\n\n      for ( ; count > 0; count--, p += 2 )\n      {\n        int                   offset = ( (int)p[0] << 8 ) | p[1];\n        const unsigned char*  q      = ft_adobe_glyph_list + offset;\n\n        if ( c == ( q[0] & 127 ) )\n        {\n          p = q;\n          goto NextIter;\n        }\n      }\n      goto NotFound;\n\n    NextIter:\n      ;\n    }\n\n  NotFound:\n    return 0;\n  }\n\n#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */\n\n\"\"\" )\n\n  if 0:  # generate unit test, or don't\n    #\n    # now write the unit test to check that everything works OK\n    #\n    write( \"#ifdef TEST\\n\\n\" )\n\n    write( \"static const char* const  the_names[] = {\\n\" )\n    for name in agl_glyphs:\n      write( '  \"' + name + '\",\\n' )\n    write( \"  0\\n};\\n\" )\n\n    write( \"static const unsigned long  the_values[] = {\\n\" )\n    for val in agl_values:\n      write( '  0x' + val + ',\\n' )\n    write( \"  0\\n};\\n\" )\n\n    write( \"\"\"\n#include <stdlib.h>\n#include <stdio.h>\n\n  int\n  main( void )\n  {\n    int                   result = 0;\n    const char* const*    names  = the_names;\n    const unsigned long*  values = the_values;\n\n\n    for ( ; *names; names++, values++ )\n    {\n      const char*    name      = *names;\n      unsigned long  reference = *values;\n      unsigned long  value;\n\n\n      value = ft_get_adobe_glyph_index( name, name + strlen( name ) );\n      if ( value != reference )\n      {\n        result = 1;\n        fprintf( stderr, \"name '%s' => %04x instead of %04x\\\\n\",\n                         name, value, reference );\n      }\n    }\n\n    return result;\n  }\n\"\"\" )\n\n    write( \"#endif /* TEST */\\n\" )\n\n  write(\"\\n/* END */\\n\")\n\n\n# Now run the main routine\n#\nmain()\n\n\n# END\n"
  },
  {
    "path": "libs/freetype/src/tools/test_afm.c",
    "content": "/*\n * gcc -DFT2_BUILD_LIBRARY -I../../include -o test_afm test_afm.c \\\n *     -L../../objs/.libs -lfreetype -lz -static\n */\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n  void dump_fontinfo( AFM_FontInfo  fi )\n  {\n    FT_Int  i;\n\n\n    printf( \"This AFM is for %sCID font.\\n\\n\",\n            ( fi->IsCIDFont ) ? \"\" : \"non-\" );\n\n    printf( \"FontBBox: %.2f %.2f %.2f %.2f\\n\", fi->FontBBox.xMin / 65536.,\n                                               fi->FontBBox.yMin / 65536.,\n                                               fi->FontBBox.xMax / 65536.,\n                                               fi->FontBBox.yMax / 65536. );\n    printf( \"Ascender: %.2f\\n\", fi->Ascender / 65536. );\n    printf( \"Descender: %.2f\\n\\n\", fi->Descender / 65536. );\n\n    if ( fi->NumTrackKern )\n      printf( \"There are %d sets of track kernings:\\n\",\n              fi->NumTrackKern );\n    else\n      printf( \"There is no track kerning.\\n\" );\n\n    for ( i = 0; i < fi->NumTrackKern; i++ )\n    {\n      AFM_TrackKern  tk = fi->TrackKerns + i;\n\n\n      printf( \"\\t%2d: %5.2f %5.2f %5.2f %5.2f\\n\", tk->degree,\n                                                  tk->min_ptsize / 65536.,\n                                                  tk->min_kern / 65536.,\n                                                  tk->max_ptsize / 65536.,\n                                                  tk->max_kern / 65536. );\n    }\n\n    printf( \"\\n\" );\n\n    if ( fi->NumKernPair )\n      printf( \"There are %d kerning pairs:\\n\",\n              fi->NumKernPair );\n    else\n      printf( \"There is no kerning pair.\\n\" );\n\n    for ( i = 0; i < fi->NumKernPair; i++ )\n    {\n      AFM_KernPair  kp = fi->KernPairs + i;\n\n\n      printf( \"\\t%3d + %3d => (%4d, %4d)\\n\", kp->index1,\n                                             kp->index2,\n                                             kp->x,\n                                             kp->y );\n    }\n\n  }\n\n  int\n  dummy_get_index( const char*  name,\n                   FT_Offset    len,\n                   void*        user_data )\n  {\n    if ( len )\n      return name[0];\n    else\n      return 0;\n  }\n\n  FT_Error\n  parse_afm( FT_Library    library,\n             FT_Stream     stream,\n             AFM_FontInfo  fi )\n  {\n    PSAux_Service  psaux;\n    AFM_ParserRec  parser;\n    FT_Error       error = FT_Err_Ok;\n\n\n    psaux = (PSAux_Service)FT_Get_Module_Interface( library, \"psaux\" );\n    if ( !psaux || !psaux->afm_parser_funcs )\n      return -1;\n\n    error = FT_Stream_EnterFrame( stream, stream->size );\n    if ( error )\n      return error;\n\n    error = psaux->afm_parser_funcs->init( &parser,\n                                           library->memory,\n                                           stream->cursor,\n                                           stream->limit );\n    if ( error )\n      return error;\n\n    parser.FontInfo = fi;\n    parser.get_index = dummy_get_index;\n\n    error = psaux->afm_parser_funcs->parse( &parser );\n\n    psaux->afm_parser_funcs->done( &parser );\n\n    return error;\n  }\n\n\n  int main( int    argc,\n            char** argv )\n  {\n    FT_Library       library;\n    FT_StreamRec     stream;\n    FT_Error         error = FT_Err_Ok;\n    AFM_FontInfoRec  fi;\n\n\n    if ( argc < 2 )\n      return FT_ERR( Invalid_Argument );\n\n    error = FT_Init_FreeType( &library );\n    if ( error )\n      return error;\n\n    FT_ZERO( &stream );\n    error = FT_Stream_Open( &stream, argv[1] );\n    if ( error )\n      goto Exit;\n    stream.memory = library->memory;\n\n    FT_ZERO( &fi );\n    error = parse_afm( library, &stream, &fi );\n\n    if ( !error )\n    {\n      FT_Memory  memory = library->memory;\n\n\n      dump_fontinfo( &fi );\n\n      if ( fi.KernPairs )\n        FT_FREE( fi.KernPairs );\n      if ( fi.TrackKerns )\n        FT_FREE( fi.TrackKerns );\n    }\n    else\n      printf( \"parse error\\n\" );\n\n    FT_Stream_Close( &stream );\n\n  Exit:\n    FT_Done_FreeType( library );\n\n    return error;\n  }\n"
  },
  {
    "path": "libs/freetype/src/tools/test_bbox.c",
    "content": "#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_BBOX_H\n\n\n#include <time.h>    /* for clock() */\n\n/* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include <sys/param.h> */\n/* to get the HZ macro which is the equivalent.                         */\n#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4)\n#include <sys/param.h>\n#define CLOCKS_PER_SEC HZ\n#endif\n\n  static long\n  get_time( void )\n  {\n    return clock() * 10000L / CLOCKS_PER_SEC;\n  }\n\n\n\n\n  /* test bbox computations */\n\n#define  XSCALE    65536\n#define  XX(x)     ((FT_Pos)(x*XSCALE))\n#define  XVEC(x,y)  { XX(x), XX(y) }\n#define  XVAL(x)   ((x)/(1.0*XSCALE))\n\n  /* dummy outline #1 */\n  static FT_Vector  dummy_vec_1[4] =\n  {\n#if 1\n    XVEC( 408.9111, 535.3164 ),\n    XVEC( 455.8887, 634.396  ),\n    XVEC( -37.8765, 786.2207 ),\n    XVEC( 164.6074, 535.3164 )\n#else\n    { (FT_Int32)0x0198E93DL , (FT_Int32)0x021750FFL },  /* 408.9111, 535.3164 */\n    { (FT_Int32)0x01C7E312L , (FT_Int32)0x027A6560L },  /* 455.8887, 634.3960 */\n    { (FT_Int32)0xFFDA1F9EL , (FT_Int32)0x0312387FL },  /* -37.8765, 786.2207 */\n    { (FT_Int32)0x00A49B7EL , (FT_Int32)0x021750FFL }   /* 164.6074, 535.3164 */\n#endif\n   };\n\n  static char  dummy_tag_1[4] =\n  {\n    FT_CURVE_TAG_ON,\n    FT_CURVE_TAG_CUBIC,\n    FT_CURVE_TAG_CUBIC,\n    FT_CURVE_TAG_ON\n  };\n\n  static short  dummy_contour_1[1] =\n  {\n    3\n  };\n\n  static FT_Outline  dummy_outline_1 =\n  {\n    1,\n    4,\n    dummy_vec_1,\n    dummy_tag_1,\n    dummy_contour_1,\n    0\n  };\n\n\n  /* dummy outline #2 */\n  static FT_Vector  dummy_vec_2[4] =\n  {\n    XVEC( 100.0, 100.0 ),\n    XVEC( 100.0, 200.0 ),\n    XVEC( 200.0, 200.0 ),\n    XVEC( 200.0, 133.0 )\n  };\n\n  static FT_Outline  dummy_outline_2 =\n  {\n    1,\n    4,\n    dummy_vec_2,\n    dummy_tag_1,\n    dummy_contour_1,\n    0\n  };\n\n\n  /* dummy outline #3 with bbox of [0 100 128 128] precisely */\n  static FT_Vector  dummy_vec_3[4] =\n  {\n    XVEC( 100.0, 127.0 ),\n    XVEC( 200.0, 127.0 ),\n    XVEC(   0.0, 136.0 ),\n    XVEC(   0.0, 100.0 )\n  };\n\n  static FT_Outline  dummy_outline_3 =\n  {\n    1,\n    4,\n    dummy_vec_3,\n    dummy_tag_1,\n    dummy_contour_1,\n    0\n  };\n\n\n  static void\n  dump_outline( FT_Outline*  outline )\n  {\n    FT_BBox  bbox;\n\n    /* compute and display cbox */\n    FT_Outline_Get_CBox( outline, &bbox );\n    printf( \"cbox = [%.2f %.2f %.2f %.2f]\\n\",\n             XVAL( bbox.xMin ),\n             XVAL( bbox.yMin ),\n             XVAL( bbox.xMax ),\n             XVAL( bbox.yMax ) );\n\n    /* compute and display bbox */\n    FT_Outline_Get_BBox( outline, &bbox );\n    printf( \"bbox = [%.2f %.2f %.2f %.2f]\\n\",\n             XVAL( bbox.xMin ),\n             XVAL( bbox.yMin ),\n             XVAL( bbox.xMax ),\n             XVAL( bbox.yMax ) );\n  }\n\n\n\n  static void\n  profile_outline( FT_Outline*   outline,\n                   long          repeat )\n  {\n    FT_BBox  bbox;\n    long     count;\n    long     time0;\n\n    time0 = get_time();\n    for ( count = repeat; count > 0; count-- )\n      FT_Outline_Get_CBox( outline, &bbox );\n\n    time0 = get_time() - time0;\n    printf( \"time = %6.3f cbox = [%8.4f %8.4f %8.4f %8.4f]\\n\",\n             ((double)time0/10000.0),\n             XVAL( bbox.xMin ),\n             XVAL( bbox.yMin ),\n             XVAL( bbox.xMax ),\n             XVAL( bbox.yMax ) );\n    printf( \"cbox_hex = [%08X %08X %08X %08X]\\n\",\n             bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax );\n\n\n    time0 = get_time();\n    for ( count = repeat; count > 0; count-- )\n      FT_Outline_Get_BBox( outline, &bbox );\n\n    time0 = get_time() - time0;\n    printf( \"time = %6.3f bbox = [%8.4f %8.4f %8.4f %8.4f]\\n\",\n             ((double)time0/10000.0),\n             XVAL( bbox.xMin ),\n             XVAL( bbox.yMin ),\n             XVAL( bbox.xMax ),\n             XVAL( bbox.yMax ) );\n    printf( \"bbox_hex = [%08X %08X %08X %08X]\\n\",\n             bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax );\n  }\n\n#define REPEAT  1000000L\n\n  int  main( int  argc, char**  argv )\n  {\n    printf( \"outline #1\\n\" );\n    profile_outline( &dummy_outline_1, REPEAT );\n\n    printf( \"outline #2\\n\" );\n    profile_outline( &dummy_outline_2, REPEAT );\n\n    printf( \"outline #3\\n\" );\n    profile_outline( &dummy_outline_3, REPEAT );\n\n    return 0;\n  }\n\n"
  },
  {
    "path": "libs/freetype/src/tools/test_trig.c",
    "content": "#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_TRIGONOMETRY_H\n\n#include <math.h>\n#include <stdio.h>\n\n#define  PI   3.14159265358979323846\n#define  SPI  (PI/FT_ANGLE_PI)\n\n/* the precision in 16.16 fixed-point checks. Expect between 2 and 5 */\n/* noise LSB bits during operations, due to rounding errors..        */\n#define  THRESHOLD  64\n\n  static  error = 0;\n\n  static void\n  test_cos( void )\n  {\n    FT_Fixed  f1, f2;\n    double    d1, d2;\n    int       i;\n\n    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )\n    {\n      f1 = FT_Cos(i);\n      d1 = f1/65536.0;\n      d2 = cos( i*SPI );\n      f2 = (FT_Fixed)(d2*65536.0);\n\n      if ( abs( f2-f1 ) > THRESHOLD )\n      {\n        error = 1;\n        printf( \"FT_Cos[%3d] = %.7f  cos[%3d] = %.7f\\n\",\n                (i >> 16), f1/65536.0, (i >> 16), d2 );\n      }\n    }\n  }\n\n\n\n  static void\n  test_sin( void )\n  {\n    FT_Fixed  f1, f2;\n    double    d1, d2;\n    int       i;\n\n    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )\n    {\n      f1 = FT_Sin(i);\n      d1 = f1/65536.0;\n      d2 = sin( i*SPI );\n      f2 = (FT_Fixed)(d2*65536.0);\n\n      if ( abs( f2-f1 ) > THRESHOLD )\n      {\n        error = 1;\n        printf( \"FT_Sin[%3d] = %.7f  sin[%3d] = %.7f\\n\",\n                (i >> 16), f1/65536.0, (i >> 16), d2 );\n      }\n    }\n  }\n\n\n  static void\n  test_tan( void )\n  {\n    FT_Fixed  f1, f2;\n    double    d1, d2;\n    int       i;\n\n    for ( i = 0; i < FT_ANGLE_PI2-0x2000000; i += 0x10000 )\n    {\n      f1 = FT_Tan(i);\n      d1 = f1/65536.0;\n      d2 = tan( i*SPI );\n      f2 = (FT_Fixed)(d2*65536.0);\n\n      if ( abs( f2-f1 ) > THRESHOLD )\n      {\n        error = 1;\n        printf( \"FT_Tan[%3d] = %.7f  tan[%3d] = %.7f\\n\",\n                (i >> 16), f1/65536.0, (i >> 16), d2 );\n      }\n    }\n  }\n\n\n  static void\n  test_atan2( void )\n  {\n    FT_Fixed  c2, s2;\n    double    l, a, c1, s1;\n    int       i, j;\n\n    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )\n    {\n      l  = 5.0;\n      a  = i*SPI;\n\n      c1 = l * cos(a);\n      s1 = l * sin(a);\n\n      c2 = (FT_Fixed)(c1*65536.0);\n      s2 = (FT_Fixed)(s1*65536.0);\n\n      j  = FT_Atan2( c2, s2 );\n      if ( j < 0 )\n        j += FT_ANGLE_2PI;\n\n      if ( abs( i - j ) > 1 )\n      {\n        printf( \"FT_Atan2( %.7f, %.7f ) = %.5f, atan = %.5f\\n\",\n                c2/65536.0, s2/65536.0, j/65536.0, i/65536.0 );\n      }\n    }\n  }\n\n  static void\n  test_unit( void )\n  {\n    FT_Vector  v;\n    double     a, c1, s1;\n    FT_Fixed   c2, s2;\n    int        i;\n\n    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )\n    {\n      FT_Vector_Unit( &v, i );\n      a  = ( i*SPI );\n      c1 = cos(a);\n      s1 = sin(a);\n      c2 = (FT_Fixed)(c1*65536.0);\n      s2 = (FT_Fixed)(s1*65536.0);\n\n      if ( abs( v.x-c2 ) > THRESHOLD ||\n           abs( v.y-s2 ) > THRESHOLD )\n      {\n        error = 1;\n        printf( \"FT_Vector_Unit[%3d] = ( %.7f, %.7f )  vec = ( %.7f, %.7f )\\n\",\n                (i >> 16),\n                v.x/65536.0, v.y/65536.0,\n                c1, s1 );\n      }\n    }\n  }\n\n\n  static void\n  test_length( void )\n  {\n    FT_Vector  v;\n    FT_Fixed   l, l2;\n    int        i;\n\n    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )\n    {\n      l   = (FT_Fixed)(500.0*65536.0);\n      v.x = (FT_Fixed)( l * cos( i*SPI ) );\n      v.y = (FT_Fixed)( l * sin( i*SPI ) );\n      l2  = FT_Vector_Length( &v );\n\n      if ( abs( l2-l ) > THRESHOLD )\n      {\n        error = 1;\n        printf( \"FT_Length( %.7f, %.7f ) = %.5f, length = %.5f\\n\",\n                v.x/65536.0, v.y/65536.0, l2/65536.0, l/65536.0 );\n      }\n    }\n  }\n\n\n  static void\n  test_rotate( void )\n  {\n    FT_Fixed  c2, s2, c4, s4;\n    FT_Vector v;\n    double    l, ra, a, c1, s1, cra, sra, c3, s3;\n    int       i, j, rotate;\n\n    for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000 )\n    {\n      ra  = rotate*SPI;\n      cra = cos( ra );\n      sra = sin( ra );\n\n      for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )\n      {\n        l  = 500.0;\n        a  = i*SPI;\n\n        c1 = l * cos(a);\n        s1 = l * sin(a);\n\n        v.x = c2 = (FT_Fixed)(c1*65536.0);\n        v.y = s2 = (FT_Fixed)(s1*65536.0);\n\n        FT_Vector_Rotate( &v, rotate );\n\n        c3 = c1 * cra - s1 * sra;\n        s3 = c1 * sra + s1 * cra;\n\n        c4 = (FT_Fixed)(c3*65536.0);\n        s4 = (FT_Fixed)(s3*65536.0);\n\n        if ( abs( c4 - v.x ) > THRESHOLD ||\n             abs( s4 - v.y ) > THRESHOLD )\n        {\n          error = 1;\n          printf( \"FT_Rotate( (%.7f,%.7f), %.5f ) = ( %.7f, %.7f ), rot = ( %.7f, %.7f )\\n\",\n                  c1, s1, ra,\n                  c2/65536.0, s2/65536.0,\n                  c4/65536.0, s4/65536.0 );\n        }\n      }\n    }\n  }\n\n\n  int main( void )\n  {\n    test_cos();\n    test_sin();\n    test_tan();\n    test_atan2();\n    test_unit();\n    test_length();\n    test_rotate();\n\n    if (!error)\n      printf( \"trigonometry test ok !\\n\" );\n\n    return !error;\n  }\n"
  },
  {
    "path": "libs/freetype/src/truetype/Jamfile",
    "content": "# FreeType 2 src/truetype Jamfile\n#\n# Copyright 2001, 2004 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) truetype ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = ttdriver ttobjs ttpload ttgload ttinterp ttgxvar ttpic ;\n  }\n  else\n  {\n    _sources = truetype ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/truetype Jamfile\n"
  },
  {
    "path": "libs/freetype/src/truetype/module.mk",
    "content": "#\n# FreeType 2 TrueType module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += TRUETYPE_DRIVER\n\ndefine TRUETYPE_DRIVER\n$(OPEN_DRIVER) FT_Driver_ClassRec, tt_driver_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)truetype  $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/truetype/rules.mk",
    "content": "#\n# FreeType 2 TrueType driver configuration rules\n#\n\n\n# Copyright 1996-2001, 2003-2004, 2011-2012 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# TrueType driver directory\n#\nTT_DIR := $(SRC_DIR)/truetype\n\n\n# compilation flags for the driver\n#\nTT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(TT_DIR))\n\n\n# TrueType driver sources (i.e., C files)\n#\nTT_DRV_SRC := $(TT_DIR)/ttdriver.c \\\n              $(TT_DIR)/ttgload.c  \\\n              $(TT_DIR)/ttgxvar.c  \\\n              $(TT_DIR)/ttinterp.c \\\n              $(TT_DIR)/ttobjs.c   \\\n              $(TT_DIR)/ttpic.c    \\\n              $(TT_DIR)/ttpload.c  \\\n              $(TT_DIR)/ttsubpix.c\n\n# TrueType driver headers\n#\nTT_DRV_H := $(TT_DRV_SRC:%.c=%.h) \\\n            $(TT_DIR)/tterrors.h\n\n\n# TrueType driver object(s)\n#\n#   TT_DRV_OBJ_M is used during `multi' builds\n#   TT_DRV_OBJ_S is used during `single' builds\n#\nTT_DRV_OBJ_M := $(TT_DRV_SRC:$(TT_DIR)/%.c=$(OBJ_DIR)/%.$O)\nTT_DRV_OBJ_S := $(OBJ_DIR)/truetype.$O\n\n# TrueType driver source file for single build\n#\nTT_DRV_SRC_S := $(TT_DIR)/truetype.c\n\n\n# TrueType driver - single object\n#\n$(TT_DRV_OBJ_S): $(TT_DRV_SRC_S) $(TT_DRV_SRC) $(FREETYPE_H) $(TT_DRV_H)\n\t$(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(TT_DRV_SRC_S))\n\n\n# driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(TT_DIR)/%.c $(FREETYPE_H) $(TT_DRV_H)\n\t$(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(TT_DRV_OBJ_S)\nDRV_OBJS_M += $(TT_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/truetype/truetype.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  truetype.c                                                             */\n/*                                                                         */\n/*    FreeType TrueType driver component (body only).                      */\n/*                                                                         */\n/*  Copyright 1996-2001, 2004, 2006, 2012 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"ttpic.c\"\n#include \"ttdriver.c\"   /* driver interface    */\n#include \"ttpload.c\"    /* tables loader       */\n#include \"ttgload.c\"    /* glyph loader        */\n#include \"ttobjs.c\"     /* object manager      */\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n#include \"ttinterp.c\"\n#include \"ttsubpix.c\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.c\"    /* gx distortable font */\n#endif\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttdriver.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttdriver.c                                                             */\n/*                                                                         */\n/*    TrueType font driver implementation (body).                          */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_SFNT_H\n#include FT_SERVICE_XFREE86_NAME_H\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include FT_MULTIPLE_MASTERS_H\n#include FT_SERVICE_MULTIPLE_MASTERS_H\n#endif\n\n#include FT_SERVICE_TRUETYPE_ENGINE_H\n#include FT_SERVICE_TRUETYPE_GLYF_H\n\n#include \"ttdriver.h\"\n#include \"ttgload.h\"\n#include \"ttpload.h\"\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.h\"\n#endif\n\n#include \"tterrors.h\"\n\n#include \"ttpic.h\"\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttdriver\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                          F A C E S                              ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#undef  PAIR_TAG\n#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \\\n                                     (FT_ULong)right        )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_get_kerning                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to return the kerning vector between two      */\n  /*    glyphs of the same face.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the source face object.                 */\n  /*                                                                       */\n  /*    left_glyph  :: The index of the left glyph in the kern pair.       */\n  /*                                                                       */\n  /*    right_glyph :: The index of the right glyph in the kern pair.      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    kerning     :: The kerning vector.  This is in font units for      */\n  /*                   scalable formats, and in pixels for fixed-sizes     */\n  /*                   formats.                                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only horizontal layouts (left-to-right & right-to-left) are        */\n  /*    supported by this function.  Other layouts, or more sophisticated  */\n  /*    kernings, are out of scope of this method (the basic driver        */\n  /*    interface is meant to be simple).                                  */\n  /*                                                                       */\n  /*    They can be implemented by format-specific interfaces.             */\n  /*                                                                       */\n  static FT_Error\n  tt_get_kerning( FT_Face     ttface,          /* TT_Face */\n                  FT_UInt     left_glyph,\n                  FT_UInt     right_glyph,\n                  FT_Vector*  kerning )\n  {\n    TT_Face       face = (TT_Face)ttface;\n    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;\n\n\n    kerning->x = 0;\n    kerning->y = 0;\n\n    if ( sfnt )\n      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );\n\n    return 0;\n  }\n\n\n#undef PAIR_TAG\n\n\n  static FT_Error\n  tt_get_advances( FT_Face    ttface,\n                   FT_UInt    start,\n                   FT_UInt    count,\n                   FT_Int32   flags,\n                   FT_Fixed  *advances )\n  {\n    FT_UInt  nn;\n    TT_Face  face  = (TT_Face) ttface;\n\n\n    /* XXX: TODO: check for sbits */\n\n    if ( flags & FT_LOAD_VERTICAL_LAYOUT )\n    {\n      for ( nn = 0; nn < count; nn++ )\n      {\n        FT_Short   tsb;\n        FT_UShort  ah;\n\n\n        TT_Get_VMetrics( face, start + nn, &tsb, &ah );\n        advances[nn] = ah;\n      }\n    }\n    else\n    {\n      for ( nn = 0; nn < count; nn++ )\n      {\n        FT_Short   lsb;\n        FT_UShort  aw;\n\n\n        TT_Get_HMetrics( face, start + nn, &lsb, &aw );\n        advances[nn] = aw;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                           S I Z E S                             ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  static FT_Error\n  tt_size_select( FT_Size   size,\n                  FT_ULong  strike_index )\n  {\n    TT_Face   ttface = (TT_Face)size->face;\n    TT_Size   ttsize = (TT_Size)size;\n    FT_Error  error  = FT_Err_Ok;\n\n\n    ttsize->strike_index = strike_index;\n\n    if ( FT_IS_SCALABLE( size->face ) )\n    {\n      /* use the scaled metrics, even when tt_size_reset fails */\n      FT_Select_Metrics( size->face, strike_index );\n\n      tt_size_reset( ttsize );\n    }\n    else\n    {\n      SFNT_Service      sfnt    = (SFNT_Service) ttface->sfnt;\n      FT_Size_Metrics*  metrics = &size->metrics;\n\n\n      error = sfnt->load_strike_metrics( ttface, strike_index, metrics );\n      if ( error )\n        ttsize->strike_index = 0xFFFFFFFFUL;\n    }\n\n    return error;\n  }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\n  static FT_Error\n  tt_size_request( FT_Size          size,\n                   FT_Size_Request  req )\n  {\n    TT_Size   ttsize = (TT_Size)size;\n    FT_Error  error  = FT_Err_Ok;\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n    if ( FT_HAS_FIXED_SIZES( size->face ) )\n    {\n      TT_Face       ttface = (TT_Face)size->face;\n      SFNT_Service  sfnt   = (SFNT_Service) ttface->sfnt;\n      FT_ULong      strike_index;\n\n\n      error = sfnt->set_sbit_strike( ttface, req, &strike_index );\n\n      if ( error )\n        ttsize->strike_index = 0xFFFFFFFFUL;\n      else\n        return tt_size_select( size, strike_index );\n    }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n    FT_Request_Metrics( size->face, req );\n\n    if ( FT_IS_SCALABLE( size->face ) )\n    {\n      error = tt_size_reset( ttsize );\n      ttsize->root.metrics = ttsize->metrics;\n    }\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_glyph_load                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to load a glyph within a given glyph slot.    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    slot        :: A handle to the target slot object where the glyph  */\n  /*                   will be loaded.                                     */\n  /*                                                                       */\n  /*    size        :: A handle to the source face size at which the glyph */\n  /*                   must be scaled, loaded, etc.                        */\n  /*                                                                       */\n  /*    glyph_index :: The index of the glyph in the font file.            */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   FT_LOAD_XXX constants can be used to control the    */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  tt_glyph_load( FT_GlyphSlot  ttslot,      /* TT_GlyphSlot */\n                 FT_Size       ttsize,      /* TT_Size      */\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags )\n  {\n    TT_GlyphSlot  slot = (TT_GlyphSlot)ttslot;\n    TT_Size       size = (TT_Size)ttsize;\n    FT_Face       face = ttslot->face;\n    FT_Error      error;\n\n\n    if ( !slot )\n      return FT_THROW( Invalid_Slot_Handle );\n\n    if ( !size )\n      return FT_THROW( Invalid_Size_Handle );\n\n    if ( !face )\n      return FT_THROW( Invalid_Argument );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( glyph_index >= (FT_UInt)face->num_glyphs &&\n         !face->internal->incremental_interface   )\n#else\n    if ( glyph_index >= (FT_UInt)face->num_glyphs )\n#endif\n      return FT_THROW( Invalid_Argument );\n\n    if ( load_flags & FT_LOAD_NO_HINTING )\n    {\n      /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT   */\n      /* are necessary to disable hinting for tricky fonts */\n\n      if ( FT_IS_TRICKY( face ) )\n        load_flags &= ~FT_LOAD_NO_HINTING;\n\n      if ( load_flags & FT_LOAD_NO_AUTOHINT )\n        load_flags |= FT_LOAD_NO_HINTING;\n    }\n\n    if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )\n    {\n      load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;\n\n      if ( !FT_IS_TRICKY( face ) )\n        load_flags |= FT_LOAD_NO_HINTING;\n    }\n\n    /* now load the glyph outline if necessary */\n    error = TT_Load_Glyph( size, slot, glyph_index, load_flags );\n\n    /* force drop-out mode to 2 - irrelevant now */\n    /* slot->outline.dropout_mode = 2; */\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /****                D R I V E R  I N T E R F A C E                   ****/\n  /****                                                                 ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n  FT_DEFINE_SERVICE_MULTIMASTERSREC(\n    tt_service_gx_multi_masters,\n    (FT_Get_MM_Func)        NULL,\n    (FT_Set_MM_Design_Func) NULL,\n    (FT_Set_MM_Blend_Func)  TT_Set_MM_Blend,\n    (FT_Get_MM_Var_Func)    TT_Get_MM_Var,\n    (FT_Set_Var_Design_Func)TT_Set_Var_Design )\n#endif\n\n  static const FT_Service_TrueTypeEngineRec  tt_service_truetype_engine =\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED\n#else\n    FT_TRUETYPE_ENGINE_TYPE_PATENTED\n#endif\n\n#else /* !TT_USE_BYTECODE_INTERPRETER */\n\n    FT_TRUETYPE_ENGINE_TYPE_NONE\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n  };\n\n  FT_DEFINE_SERVICE_TTGLYFREC(\n    tt_service_truetype_glyf,\n    (TT_Glyf_GetLocationFunc)tt_face_get_location )\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n  FT_DEFINE_SERVICEDESCREC4(\n    tt_services,\n    FT_SERVICE_ID_XF86_NAME,       FT_XF86_FORMAT_TRUETYPE,\n    FT_SERVICE_ID_MULTI_MASTERS,   &TT_SERVICE_GX_MULTI_MASTERS_GET,\n    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,\n    FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET )\n#else\n  FT_DEFINE_SERVICEDESCREC3(\n    tt_services,\n    FT_SERVICE_ID_XF86_NAME,       FT_XF86_FORMAT_TRUETYPE,\n    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,\n    FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET )\n#endif\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  tt_get_interface( FT_Module    driver,    /* TT_Driver */\n                    const char*  tt_interface )\n  {\n    FT_Library           library;\n    FT_Module_Interface  result;\n    FT_Module            sfntd;\n    SFNT_Service         sfnt;\n\n\n    /* TT_SERVICES_GET derefers `library' in PIC mode */\n#ifdef FT_CONFIG_OPTION_PIC\n    if ( !driver )\n      return NULL;\n    library = driver->library;\n    if ( !library )\n      return NULL;\n#endif\n\n    result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface );\n    if ( result != NULL )\n      return result;\n\n#ifndef FT_CONFIG_OPTION_PIC\n    if ( !driver )\n      return NULL;\n    library = driver->library;\n    if ( !library )\n      return NULL;\n#endif\n\n    /* only return the default interface from the SFNT module */\n    sfntd = FT_Get_Module( library, \"sfnt\" );\n    if ( sfntd )\n    {\n      sfnt = (SFNT_Service)( sfntd->clazz->module_interface );\n      if ( sfnt )\n        return sfnt->get_interface( driver, tt_interface );\n    }\n\n    return 0;\n  }\n\n\n  /* The FT_DriverInterface structure is defined in ftdriver.h. */\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n#define TT_HINTER_FLAG  FT_MODULE_DRIVER_HAS_HINTER\n#else\n#define TT_HINTER_FLAG  0\n#endif\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n#define TT_SIZE_SELECT  tt_size_select\n#else\n#define TT_SIZE_SELECT  0\n#endif\n\n  FT_DEFINE_DRIVER( tt_driver_class,\n\n      FT_MODULE_FONT_DRIVER     |\n      FT_MODULE_DRIVER_SCALABLE |\n      TT_HINTER_FLAG,\n\n      sizeof ( TT_DriverRec ),\n\n      \"truetype\",      /* driver name                           */\n      0x10000L,        /* driver version == 1.0                 */\n      0x20000L,        /* driver requires FreeType 2.0 or above */\n\n      (void*)0,        /* driver specific interface */\n\n      tt_driver_init,\n      tt_driver_done,\n      tt_get_interface,\n\n    sizeof ( TT_FaceRec ),\n    sizeof ( TT_SizeRec ),\n    sizeof ( FT_GlyphSlotRec ),\n\n    tt_face_init,\n    tt_face_done,\n    tt_size_init,\n    tt_size_done,\n    tt_slot_init,\n    0,                       /* FT_Slot_DoneFunc */\n\n    ft_stub_set_char_sizes,  /* FT_CONFIG_OPTION_OLD_INTERNALS */\n    ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */\n\n    tt_glyph_load,\n\n    tt_get_kerning,\n    0,                       /* FT_Face_AttachFunc */\n    tt_get_advances,\n\n    tt_size_request,\n    TT_SIZE_SELECT\n  )\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttdriver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttdriver.h                                                             */\n/*                                                                         */\n/*    High-level TrueType driver interface (specification).                */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTDRIVER_H__\n#define __TTDRIVER_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_DECLARE_DRIVER( tt_driver_class )\n\n\nFT_END_HEADER\n\n#endif /* __TTDRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/tterrors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  tterrors.h                                                             */\n/*                                                                         */\n/*    TrueType error codes (specification only).                           */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the TrueType error enumeration            */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __TTERRORS_H__\n#define __TTERRORS_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  TT_Err_\n#define FT_ERR_BASE    FT_Mod_Err_TrueType\n\n#include FT_ERRORS_H\n\n#endif /* __TTERRORS_H__ */\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttgload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttgload.c                                                              */\n/*                                                                         */\n/*    TrueType Glyph Loader (body).                                        */\n/*                                                                         */\n/*  Copyright 1996-2013                                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_SFNT_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_OUTLINE_H\n\n#include \"ttgload.h\"\n#include \"ttpload.h\"\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.h\"\n#endif\n\n#include \"tterrors.h\"\n#include \"ttsubpix.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttgload\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Composite glyph flags.                                                */\n  /*                                                                       */\n#define ARGS_ARE_WORDS             0x0001\n#define ARGS_ARE_XY_VALUES         0x0002\n#define ROUND_XY_TO_GRID           0x0004\n#define WE_HAVE_A_SCALE            0x0008\n/* reserved                        0x0010 */\n#define MORE_COMPONENTS            0x0020\n#define WE_HAVE_AN_XY_SCALE        0x0040\n#define WE_HAVE_A_2X2              0x0080\n#define WE_HAVE_INSTR              0x0100\n#define USE_MY_METRICS             0x0200\n#define OVERLAP_COMPOUND           0x0400\n#define SCALED_COMPONENT_OFFSET    0x0800\n#define UNSCALED_COMPONENT_OFFSET  0x1000\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Return the horizontal metrics in font units for a given glyph.        */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  TT_Get_HMetrics( TT_Face     face,\n                   FT_UInt     idx,\n                   FT_Short*   lsb,\n                   FT_UShort*  aw )\n  {\n    ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw );\n\n    FT_TRACE5(( \"  advance width (font units): %d\\n\", *aw ));\n    FT_TRACE5(( \"  left side bearing (font units): %d\\n\", *lsb ));\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Return the vertical metrics in font units for a given glyph.          */\n  /* Greg Hitchcock from Microsoft told us that if there were no `vmtx'    */\n  /* table, typoAscender/Descender from the `OS/2' table would be used     */\n  /* instead, and if there were no `OS/2' table, use ascender/descender    */\n  /* from the `hhea' table.  But that is not what Microsoft's rasterizer   */\n  /* apparently does: It uses the ppem value as the advance height, and    */\n  /* sets the top side bearing to be zero.                                 */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  TT_Get_VMetrics( TT_Face     face,\n                   FT_UInt     idx,\n                   FT_Short*   tsb,\n                   FT_UShort*  ah )\n  {\n    if ( face->vertical_info )\n      ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah );\n\n#if 1             /* Empirically determined, at variance with what MS said */\n\n    else\n    {\n      *tsb = 0;\n      *ah  = face->root.units_per_EM;\n    }\n\n#else      /* This is what MS said to do.  It isn't what they do, however. */\n\n    else if ( face->os2.version != 0xFFFFU )\n    {\n      *tsb = face->os2.sTypoAscender;\n      *ah  = face->os2.sTypoAscender - face->os2.sTypoDescender;\n    }\n    else\n    {\n      *tsb = face->horizontal.Ascender;\n      *ah  = face->horizontal.Ascender - face->horizontal.Descender;\n    }\n\n#endif\n\n    FT_TRACE5(( \"  advance height (font units): %d\\n\", *ah ));\n    FT_TRACE5(( \"  top side bearing (font units): %d\\n\", *tsb ));\n  }\n\n\n  static void\n  tt_get_metrics( TT_Loader  loader,\n                  FT_UInt    glyph_index )\n  {\n    TT_Face  face = (TT_Face)loader->face;\n\n    FT_Short   left_bearing = 0, top_bearing = 0;\n    FT_UShort  advance_width = 0, advance_height = 0;\n\n\n    TT_Get_HMetrics( face, glyph_index,\n                     &left_bearing,\n                     &advance_width );\n    TT_Get_VMetrics( face, glyph_index,\n                     &top_bearing,\n                     &advance_height );\n\n    loader->left_bearing = left_bearing;\n    loader->advance      = advance_width;\n    loader->top_bearing  = top_bearing;\n    loader->vadvance     = advance_height;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( loader->exec )\n      loader->exec->sph_tweak_flags = 0;\n\n    /* this may not be the right place for this, but it works */\n    if ( loader->exec && loader->exec->ignore_x_mode )\n      sph_set_tweaks( loader, glyph_index );\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    if ( !loader->linear_def )\n    {\n      loader->linear_def = 1;\n      loader->linear     = advance_width;\n    }\n  }\n\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n  static void\n  tt_get_metrics_incr_overrides( TT_Loader  loader,\n                                 FT_UInt    glyph_index )\n  {\n    TT_Face  face = (TT_Face)loader->face;\n\n    FT_Short   left_bearing = 0, top_bearing = 0;\n    FT_UShort  advance_width = 0, advance_height = 0;\n\n\n    /* If this is an incrementally loaded font check whether there are */\n    /* overriding metrics for this glyph.                              */\n    if ( face->root.internal->incremental_interface                           &&\n         face->root.internal->incremental_interface->funcs->get_glyph_metrics )\n    {\n      FT_Incremental_MetricsRec  metrics;\n      FT_Error                   error;\n\n\n      metrics.bearing_x = loader->left_bearing;\n      metrics.bearing_y = 0;\n      metrics.advance   = loader->advance;\n      metrics.advance_v = 0;\n\n      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(\n                face->root.internal->incremental_interface->object,\n                glyph_index, FALSE, &metrics );\n      if ( error )\n        goto Exit;\n\n      left_bearing  = (FT_Short)metrics.bearing_x;\n      advance_width = (FT_UShort)metrics.advance;\n\n#if 0\n\n      /* GWW: Do I do the same for vertical metrics? */\n      metrics.bearing_x = 0;\n      metrics.bearing_y = loader->top_bearing;\n      metrics.advance   = loader->vadvance;\n\n      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(\n                face->root.internal->incremental_interface->object,\n                glyph_index, TRUE, &metrics );\n      if ( error )\n        goto Exit;\n\n      top_bearing    = (FT_Short)metrics.bearing_y;\n      advance_height = (FT_UShort)metrics.advance;\n\n#endif /* 0 */\n\n      loader->left_bearing = left_bearing;\n      loader->advance      = advance_width;\n      loader->top_bearing  = top_bearing;\n      loader->vadvance     = advance_height;\n\n      if ( !loader->linear_def )\n      {\n        loader->linear_def = 1;\n        loader->linear     = advance_width;\n      }\n    }\n\n  Exit:\n    return;\n  }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Translates an array of coordinates.                                   */\n  /*                                                                       */\n  static void\n  translate_array( FT_UInt     n,\n                   FT_Vector*  coords,\n                   FT_Pos      delta_x,\n                   FT_Pos      delta_y )\n  {\n    FT_UInt  k;\n\n\n    if ( delta_x )\n      for ( k = 0; k < n; k++ )\n        coords[k].x += delta_x;\n\n    if ( delta_y )\n      for ( k = 0; k < n; k++ )\n        coords[k].y += delta_y;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following functions are used by default with TrueType fonts.      */\n  /* However, they can be replaced by alternatives if we need to support   */\n  /* TrueType-compressed formats (like MicroType) in the future.           */\n  /*                                                                       */\n  /*************************************************************************/\n\n  FT_CALLBACK_DEF( FT_Error )\n  TT_Access_Glyph_Frame( TT_Loader  loader,\n                         FT_UInt    glyph_index,\n                         FT_ULong   offset,\n                         FT_UInt    byte_count )\n  {\n    FT_Error   error;\n    FT_Stream  stream = loader->stream;\n\n    /* for non-debug mode */\n    FT_UNUSED( glyph_index );\n\n\n    FT_TRACE4(( \"Glyph %ld\\n\", glyph_index ));\n\n    /* the following line sets the `error' variable through macros! */\n    if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) )\n      return error;\n\n    loader->cursor = stream->cursor;\n    loader->limit  = stream->limit;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  TT_Forget_Glyph_Frame( TT_Loader  loader )\n  {\n    FT_Stream  stream = loader->stream;\n\n\n    FT_FRAME_EXIT();\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  TT_Load_Glyph_Header( TT_Loader  loader )\n  {\n    FT_Byte*  p     = loader->cursor;\n    FT_Byte*  limit = loader->limit;\n\n\n    if ( p + 10 > limit )\n      return FT_THROW( Invalid_Outline );\n\n    loader->n_contours = FT_NEXT_SHORT( p );\n\n    loader->bbox.xMin = FT_NEXT_SHORT( p );\n    loader->bbox.yMin = FT_NEXT_SHORT( p );\n    loader->bbox.xMax = FT_NEXT_SHORT( p );\n    loader->bbox.yMax = FT_NEXT_SHORT( p );\n\n    FT_TRACE5(( \"  # of contours: %d\\n\", loader->n_contours ));\n    FT_TRACE5(( \"  xMin: %4d  xMax: %4d\\n\", loader->bbox.xMin,\n                                            loader->bbox.xMax ));\n    FT_TRACE5(( \"  yMin: %4d  yMax: %4d\\n\", loader->bbox.yMin,\n                                            loader->bbox.yMax ));\n    loader->cursor = p;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  TT_Load_Simple_Glyph( TT_Loader  load )\n  {\n    FT_Error        error;\n    FT_Byte*        p          = load->cursor;\n    FT_Byte*        limit      = load->limit;\n    FT_GlyphLoader  gloader    = load->gloader;\n    FT_Int          n_contours = load->n_contours;\n    FT_Outline*     outline;\n    TT_Face         face       = (TT_Face)load->face;\n    FT_UShort       n_ins;\n    FT_Int          n_points;\n\n    FT_Byte         *flag, *flag_limit;\n    FT_Byte         c, count;\n    FT_Vector       *vec, *vec_limit;\n    FT_Pos          x;\n    FT_Short        *cont, *cont_limit, prev_cont;\n    FT_Int          xy_size = 0;\n\n\n    /* check that we can add the contours to the glyph */\n    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours );\n    if ( error )\n      goto Fail;\n\n    /* reading the contours' endpoints & number of points */\n    cont       = gloader->current.outline.contours;\n    cont_limit = cont + n_contours;\n\n    /* check space for contours array + instructions count */\n    if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit )\n      goto Invalid_Outline;\n\n    prev_cont = FT_NEXT_SHORT( p );\n\n    if ( n_contours > 0 )\n      cont[0] = prev_cont;\n\n    if ( prev_cont < 0 )\n      goto Invalid_Outline;\n\n    for ( cont++; cont < cont_limit; cont++ )\n    {\n      cont[0] = FT_NEXT_SHORT( p );\n      if ( cont[0] <= prev_cont )\n      {\n        /* unordered contours: this is invalid */\n        goto Invalid_Outline;\n      }\n      prev_cont = cont[0];\n    }\n\n    n_points = 0;\n    if ( n_contours > 0 )\n    {\n      n_points = cont[-1] + 1;\n      if ( n_points < 0 )\n        goto Invalid_Outline;\n    }\n\n    /* note that we will add four phantom points later */\n    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 );\n    if ( error )\n      goto Fail;\n\n    /* reading the bytecode instructions */\n    load->glyph->control_len  = 0;\n    load->glyph->control_data = 0;\n\n    if ( p + 2 > limit )\n      goto Invalid_Outline;\n\n    n_ins = FT_NEXT_USHORT( p );\n\n    FT_TRACE5(( \"  Instructions size: %u\\n\", n_ins ));\n\n    if ( n_ins > face->max_profile.maxSizeOfInstructions )\n    {\n      FT_TRACE0(( \"TT_Load_Simple_Glyph: too many instructions (%d)\\n\",\n                  n_ins ));\n      error = FT_THROW( Too_Many_Hints );\n      goto Fail;\n    }\n\n    if ( ( limit - p ) < n_ins )\n    {\n      FT_TRACE0(( \"TT_Load_Simple_Glyph: instruction count mismatch\\n\" ));\n      error = FT_THROW( Too_Many_Hints );\n      goto Fail;\n    }\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    if ( IS_HINTED( load->load_flags ) )\n    {\n      load->glyph->control_len  = n_ins;\n      load->glyph->control_data = load->exec->glyphIns;\n\n      FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );\n    }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n    p += n_ins;\n\n    outline = &gloader->current.outline;\n\n    /* reading the point tags */\n    flag       = (FT_Byte*)outline->tags;\n    flag_limit = flag + n_points;\n\n    FT_ASSERT( flag != NULL );\n\n    while ( flag < flag_limit )\n    {\n      if ( p + 1 > limit )\n        goto Invalid_Outline;\n\n      *flag++ = c = FT_NEXT_BYTE( p );\n      if ( c & 8 )\n      {\n        if ( p + 1 > limit )\n          goto Invalid_Outline;\n\n        count = FT_NEXT_BYTE( p );\n        if ( flag + (FT_Int)count > flag_limit )\n          goto Invalid_Outline;\n\n        for ( ; count > 0; count-- )\n          *flag++ = c;\n      }\n    }\n\n    /* reading the X coordinates */\n\n    vec       = outline->points;\n    vec_limit = vec + n_points;\n    flag      = (FT_Byte*)outline->tags;\n    x         = 0;\n\n    if ( p + xy_size > limit )\n      goto Invalid_Outline;\n\n    for ( ; vec < vec_limit; vec++, flag++ )\n    {\n      FT_Pos   y = 0;\n      FT_Byte  f = *flag;\n\n\n      if ( f & 2 )\n      {\n        if ( p + 1 > limit )\n          goto Invalid_Outline;\n\n        y = (FT_Pos)FT_NEXT_BYTE( p );\n        if ( ( f & 16 ) == 0 )\n          y = -y;\n      }\n      else if ( ( f & 16 ) == 0 )\n      {\n        if ( p + 2 > limit )\n          goto Invalid_Outline;\n\n        y = (FT_Pos)FT_NEXT_SHORT( p );\n      }\n\n      x     += y;\n      vec->x = x;\n      /* the cast is for stupid compilers */\n      *flag  = (FT_Byte)( f & ~( 2 | 16 ) );\n    }\n\n    /* reading the Y coordinates */\n\n    vec       = gloader->current.outline.points;\n    vec_limit = vec + n_points;\n    flag      = (FT_Byte*)outline->tags;\n    x         = 0;\n\n    for ( ; vec < vec_limit; vec++, flag++ )\n    {\n      FT_Pos   y = 0;\n      FT_Byte  f = *flag;\n\n\n      if ( f & 4 )\n      {\n        if ( p + 1 > limit )\n          goto Invalid_Outline;\n\n        y = (FT_Pos)FT_NEXT_BYTE( p );\n        if ( ( f & 32 ) == 0 )\n          y = -y;\n      }\n      else if ( ( f & 32 ) == 0 )\n      {\n        if ( p + 2 > limit )\n          goto Invalid_Outline;\n\n        y = (FT_Pos)FT_NEXT_SHORT( p );\n      }\n\n      x     += y;\n      vec->y = x;\n      /* the cast is for stupid compilers */\n      *flag  = (FT_Byte)( f & FT_CURVE_TAG_ON );\n    }\n\n    outline->n_points   = (FT_UShort)n_points;\n    outline->n_contours = (FT_Short) n_contours;\n\n    load->cursor = p;\n\n  Fail:\n    return error;\n\n  Invalid_Outline:\n    error = FT_THROW( Invalid_Outline );\n    goto Fail;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  TT_Load_Composite_Glyph( TT_Loader  loader )\n  {\n    FT_Error        error;\n    FT_Byte*        p       = loader->cursor;\n    FT_Byte*        limit   = loader->limit;\n    FT_GlyphLoader  gloader = loader->gloader;\n    FT_SubGlyph     subglyph;\n    FT_UInt         num_subglyphs;\n\n\n    num_subglyphs = 0;\n\n    do\n    {\n      FT_Fixed  xx, xy, yy, yx;\n      FT_UInt   count;\n\n\n      /* check that we can load a new subglyph */\n      error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 );\n      if ( error )\n        goto Fail;\n\n      /* check space */\n      if ( p + 4 > limit )\n        goto Invalid_Composite;\n\n      subglyph = gloader->current.subglyphs + num_subglyphs;\n\n      subglyph->arg1 = subglyph->arg2 = 0;\n\n      subglyph->flags = FT_NEXT_USHORT( p );\n      subglyph->index = FT_NEXT_USHORT( p );\n\n      /* check space */\n      count = 2;\n      if ( subglyph->flags & ARGS_ARE_WORDS )\n        count += 2;\n      if ( subglyph->flags & WE_HAVE_A_SCALE )\n        count += 2;\n      else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )\n        count += 4;\n      else if ( subglyph->flags & WE_HAVE_A_2X2 )\n        count += 8;\n\n      if ( p + count > limit )\n        goto Invalid_Composite;\n\n      /* read arguments */\n      if ( subglyph->flags & ARGS_ARE_WORDS )\n      {\n        subglyph->arg1 = FT_NEXT_SHORT( p );\n        subglyph->arg2 = FT_NEXT_SHORT( p );\n      }\n      else\n      {\n        subglyph->arg1 = FT_NEXT_CHAR( p );\n        subglyph->arg2 = FT_NEXT_CHAR( p );\n      }\n\n      /* read transform */\n      xx = yy = 0x10000L;\n      xy = yx = 0;\n\n      if ( subglyph->flags & WE_HAVE_A_SCALE )\n      {\n        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        yy = xx;\n      }\n      else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )\n      {\n        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n      }\n      else if ( subglyph->flags & WE_HAVE_A_2X2 )\n      {\n        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;\n      }\n\n      subglyph->transform.xx = xx;\n      subglyph->transform.xy = xy;\n      subglyph->transform.yx = yx;\n      subglyph->transform.yy = yy;\n\n      num_subglyphs++;\n\n    } while ( subglyph->flags & MORE_COMPONENTS );\n\n    gloader->current.num_subglyphs = num_subglyphs;\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    {\n      FT_Stream  stream = loader->stream;\n\n\n      /* we must undo the FT_FRAME_ENTER in order to point */\n      /* to the composite instructions, if we find some.   */\n      /* We will process them later.                       */\n      /*                                                   */\n      loader->ins_pos = (FT_ULong)( FT_STREAM_POS() +\n                                    p - limit );\n    }\n\n#endif\n\n    loader->cursor = p;\n\n  Fail:\n    return error;\n\n  Invalid_Composite:\n    error = FT_THROW( Invalid_Composite );\n    goto Fail;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  TT_Init_Glyph_Loading( TT_Face  face )\n  {\n    face->access_glyph_frame   = TT_Access_Glyph_Frame;\n    face->read_glyph_header    = TT_Load_Glyph_Header;\n    face->read_simple_glyph    = TT_Load_Simple_Glyph;\n    face->read_composite_glyph = TT_Load_Composite_Glyph;\n    face->forget_glyph_frame   = TT_Forget_Glyph_Frame;\n  }\n\n\n  static void\n  tt_prepare_zone( TT_GlyphZone  zone,\n                   FT_GlyphLoad  load,\n                   FT_UInt       start_point,\n                   FT_UInt       start_contour )\n  {\n    zone->n_points    = (FT_UShort)( load->outline.n_points - start_point );\n    zone->n_contours  = (FT_Short) ( load->outline.n_contours -\n                                       start_contour );\n    zone->org         = load->extra_points + start_point;\n    zone->cur         = load->outline.points + start_point;\n    zone->orus        = load->extra_points2 + start_point;\n    zone->tags        = (FT_Byte*)load->outline.tags + start_point;\n    zone->contours    = (FT_UShort*)load->outline.contours + start_contour;\n    zone->first_point = (FT_UShort)start_point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Hint_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Hint the glyph using the zone prepared by the caller.  Note that   */\n  /*    the zone is supposed to include four phantom points.               */\n  /*                                                                       */\n  static FT_Error\n  TT_Hint_Glyph( TT_Loader  loader,\n                 FT_Bool    is_composite )\n  {\n    TT_GlyphZone  zone = &loader->zone;\n    FT_Pos        origin;\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    FT_UInt       n_ins;\n#else\n    FT_UNUSED( is_composite );\n#endif\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    if ( loader->glyph->control_len > 0xFFFFL )\n    {\n      FT_TRACE1(( \"TT_Hint_Glyph: too long instructions \" ));\n      FT_TRACE1(( \"(0x%lx byte) is truncated\\n\",\n                 loader->glyph->control_len ));\n    }\n    n_ins = (FT_UInt)( loader->glyph->control_len );\n#endif\n\n    origin = zone->cur[zone->n_points - 4].x;\n    origin = FT_PIX_ROUND( origin ) - origin;\n    if ( origin )\n      translate_array( zone->n_points, zone->cur, origin, 0 );\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    /* save original point position in org */\n    if ( n_ins > 0 )\n      FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );\n\n    /* Reset graphics state. */\n    loader->exec->GS = ((TT_Size)loader->size)->GS;\n\n    /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */\n    /*      completely refer to the (already) hinted subglyphs.     */\n    if ( is_composite )\n    {\n      loader->exec->metrics.x_scale = 1 << 16;\n      loader->exec->metrics.y_scale = 1 << 16;\n\n      FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points );\n    }\n    else\n    {\n      loader->exec->metrics.x_scale =\n        ((TT_Size)loader->size)->metrics.x_scale;\n      loader->exec->metrics.y_scale =\n        ((TT_Size)loader->size)->metrics.y_scale;\n    }\n#endif\n\n    /* round pp2 and pp4 */\n    zone->cur[zone->n_points - 3].x =\n      FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );\n    zone->cur[zone->n_points - 1].y =\n      FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    if ( n_ins > 0 )\n    {\n      FT_Bool   debug;\n      FT_Error  error;\n\n      FT_GlyphLoader  gloader         = loader->gloader;\n      FT_Outline      current_outline = gloader->current.outline;\n\n\n      error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph,\n                                loader->exec->glyphIns, n_ins );\n      if ( error )\n        return error;\n\n      loader->exec->is_composite = is_composite;\n      loader->exec->pts          = *zone;\n\n      debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) &&\n                       ((TT_Size)loader->size)->debug             );\n\n      error = TT_Run_Context( loader->exec, debug );\n      if ( error && loader->exec->pedantic_hinting )\n        return error;\n\n      /* store drop-out mode in bits 5-7; set bit 2 also as a marker */\n      current_outline.tags[0] |=\n        ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE;\n    }\n\n#endif\n\n    /* save glyph phantom points */\n    if ( !loader->preserve_pps )\n    {\n      loader->pp1 = zone->cur[zone->n_points - 4];\n      loader->pp2 = zone->cur[zone->n_points - 3];\n      loader->pp3 = zone->cur[zone->n_points - 2];\n      loader->pp4 = zone->cur[zone->n_points - 1];\n    }\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )\n      FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 );\n\n    else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )\n      FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );\n#endif\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Process_Simple_Glyph                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Once a simple glyph has been loaded, it needs to be processed.     */\n  /*    Usually, this means scaling and hinting through bytecode           */\n  /*    interpretation.                                                    */\n  /*                                                                       */\n  static FT_Error\n  TT_Process_Simple_Glyph( TT_Loader  loader )\n  {\n    FT_GlyphLoader  gloader = loader->gloader;\n    FT_Error        error   = FT_Err_Ok;\n    FT_Outline*     outline;\n    FT_Int          n_points;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    TT_Face     face           = (TT_Face)loader->face;\n    FT_String*  family         = face->root.family_name;\n    FT_Int      ppem           = loader->size->metrics.x_ppem;\n    FT_String*  style          = face->root.style_name;\n    FT_Int      x_scale_factor = 1000;\n#endif\n\n\n    outline  = &gloader->current.outline;\n    n_points = outline->n_points;\n\n    /* set phantom points */\n\n    outline->points[n_points    ] = loader->pp1;\n    outline->points[n_points + 1] = loader->pp2;\n    outline->points[n_points + 2] = loader->pp3;\n    outline->points[n_points + 3] = loader->pp4;\n\n    outline->tags[n_points    ] = 0;\n    outline->tags[n_points + 1] = 0;\n    outline->tags[n_points + 2] = 0;\n    outline->tags[n_points + 3] = 0;\n\n    n_points += 4;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n    if ( ((TT_Face)loader->face)->doblend )\n    {\n      /* Deltas apply to the unscaled data. */\n      FT_Vector*  deltas;\n      FT_Memory   memory = loader->face->memory;\n      FT_Int      i;\n\n\n      error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),\n                                        loader->glyph_index,\n                                        &deltas,\n                                        n_points );\n      if ( error )\n        return error;\n\n      for ( i = 0; i < n_points; ++i )\n      {\n        outline->points[i].x += deltas[i].x;\n        outline->points[i].y += deltas[i].y;\n      }\n\n      FT_FREE( deltas );\n    }\n\n#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */\n\n    if ( IS_HINTED( loader->load_flags ) )\n    {\n      tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );\n\n      FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,\n                     loader->zone.n_points + 4 );\n    }\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* scale, but only if enabled and only if TT hinting is being used */\n    if ( IS_HINTED( loader->load_flags ) )\n      x_scale_factor = sph_test_tweak_x_scaling( face,\n                                                 family,\n                                                 ppem,\n                                                 style,\n                                                 loader->glyph_index );\n    /* scale the glyph */\n    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||\n         x_scale_factor != 1000                         )\n    {\n      FT_Vector*  vec     = outline->points;\n      FT_Vector*  limit   = outline->points + n_points;\n      FT_Fixed    x_scale = FT_MulDiv(\n                              ((TT_Size)loader->size)->metrics.x_scale,\n                              x_scale_factor, 1000 );\n      FT_Fixed    y_scale = ((TT_Size)loader->size)->metrics.y_scale;\n\n\n      /* compensate for any scaling by de/emboldening; */\n      /* the amount was determined via experimentation */\n      if ( x_scale_factor != 1000 && ppem > 11 )\n         FT_Outline_EmboldenXY( outline,\n                                FT_MulFix( 1280 * ppem,\n                                           1000 - x_scale_factor ),\n                                0 );\n#else\n    /* scale the glyph */\n    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n    {\n      FT_Vector*  vec     = outline->points;\n      FT_Vector*  limit   = outline->points + n_points;\n      FT_Fixed    x_scale = ((TT_Size)loader->size)->metrics.x_scale;\n      FT_Fixed    y_scale = ((TT_Size)loader->size)->metrics.y_scale;\n#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n      for ( ; vec < limit; vec++ )\n      {\n        vec->x = FT_MulFix( vec->x, x_scale );\n        vec->y = FT_MulFix( vec->y, y_scale );\n      }\n\n      loader->pp1 = outline->points[n_points - 4];\n      loader->pp2 = outline->points[n_points - 3];\n      loader->pp3 = outline->points[n_points - 2];\n      loader->pp4 = outline->points[n_points - 1];\n    }\n\n    if ( IS_HINTED( loader->load_flags ) )\n    {\n      loader->zone.n_points += 4;\n\n      error = TT_Hint_Glyph( loader, 0 );\n    }\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Process_Composite_Component                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Once a composite component has been loaded, it needs to be         */\n  /*    processed.  Usually, this means transforming and translating.      */\n  /*                                                                       */\n  static FT_Error\n  TT_Process_Composite_Component( TT_Loader    loader,\n                                  FT_SubGlyph  subglyph,\n                                  FT_UInt      start_point,\n                                  FT_UInt      num_base_points )\n  {\n    FT_GlyphLoader  gloader    = loader->gloader;\n    FT_Vector*      base_vec   = gloader->base.outline.points;\n    FT_UInt         num_points = gloader->base.outline.n_points;\n    FT_Bool         have_scale;\n    FT_Pos          x, y;\n\n\n    have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE     |\n                                              WE_HAVE_AN_XY_SCALE |\n                                              WE_HAVE_A_2X2       ) );\n\n    /* perform the transform required for this subglyph */\n    if ( have_scale )\n    {\n      FT_UInt  i;\n\n\n      for ( i = num_base_points; i < num_points; i++ )\n        FT_Vector_Transform( base_vec + i, &subglyph->transform );\n    }\n\n    /* get offset */\n    if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) )\n    {\n      FT_UInt     k = subglyph->arg1;\n      FT_UInt     l = subglyph->arg2;\n      FT_Vector*  p1;\n      FT_Vector*  p2;\n\n\n      /* match l-th point of the newly loaded component to the k-th point */\n      /* of the previously loaded components.                             */\n\n      /* change to the point numbers used by our outline */\n      k += start_point;\n      l += num_base_points;\n      if ( k >= num_base_points ||\n           l >= num_points      )\n        return FT_THROW( Invalid_Composite );\n\n      p1 = gloader->base.outline.points + k;\n      p2 = gloader->base.outline.points + l;\n\n      x = p1->x - p2->x;\n      y = p1->y - p2->y;\n    }\n    else\n    {\n      x = subglyph->arg1;\n      y = subglyph->arg2;\n\n      if ( !x && !y )\n        return FT_Err_Ok;\n\n  /* Use a default value dependent on                                     */\n  /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED.  This is useful for old TT */\n  /* fonts which don't set the xxx_COMPONENT_OFFSET bit.                  */\n\n      if ( have_scale &&\n#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED\n           !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) )\n#else\n            ( subglyph->flags & SCALED_COMPONENT_OFFSET ) )\n#endif\n      {\n\n#if 0\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This algorithm is what Apple documents.  But it doesn't work.         */\n  /*                                                                       */\n        int  a = subglyph->transform.xx > 0 ?  subglyph->transform.xx\n                                            : -subglyph->transform.xx;\n        int  b = subglyph->transform.yx > 0 ?  subglyph->transform.yx\n                                            : -subglyph->transform.yx;\n        int  c = subglyph->transform.xy > 0 ?  subglyph->transform.xy\n                                            : -subglyph->transform.xy;\n        int  d = subglyph->transform.yy > 0 ? subglyph->transform.yy\n                                            : -subglyph->transform.yy;\n        int  m = a > b ? a : b;\n        int  n = c > d ? c : d;\n\n\n        if ( a - b <= 33 && a - b >= -33 )\n          m *= 2;\n        if ( c - d <= 33 && c - d >= -33 )\n          n *= 2;\n        x = FT_MulFix( x, m );\n        y = FT_MulFix( y, n );\n\n#else /* 0 */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This algorithm is a guess and works much better than the above.       */\n  /*                                                                       */\n        FT_Fixed  mac_xscale = FT_Hypot( subglyph->transform.xx,\n                                         subglyph->transform.xy );\n        FT_Fixed  mac_yscale = FT_Hypot( subglyph->transform.yy,\n                                         subglyph->transform.yx );\n\n\n        x = FT_MulFix( x, mac_xscale );\n        y = FT_MulFix( y, mac_yscale );\n\n#endif /* 0 */\n\n      }\n\n      if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )\n      {\n        FT_Fixed  x_scale = ((TT_Size)loader->size)->metrics.x_scale;\n        FT_Fixed  y_scale = ((TT_Size)loader->size)->metrics.y_scale;\n\n\n        x = FT_MulFix( x, x_scale );\n        y = FT_MulFix( y, y_scale );\n\n        if ( subglyph->flags & ROUND_XY_TO_GRID )\n        {\n          x = FT_PIX_ROUND( x );\n          y = FT_PIX_ROUND( y );\n        }\n      }\n    }\n\n    if ( x || y )\n      translate_array( num_points - num_base_points,\n                       base_vec + num_base_points,\n                       x, y );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Process_Composite_Glyph                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    This is slightly different from TT_Process_Simple_Glyph, in that   */\n  /*    its sole purpose is to hint the glyph.  Thus this function is      */\n  /*    only available when bytecode interpreter is enabled.               */\n  /*                                                                       */\n  static FT_Error\n  TT_Process_Composite_Glyph( TT_Loader  loader,\n                              FT_UInt    start_point,\n                              FT_UInt    start_contour )\n  {\n    FT_Error     error;\n    FT_Outline*  outline;\n    FT_UInt      i;\n\n\n    outline = &loader->gloader->base.outline;\n\n    /* make room for phantom points */\n    error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader,\n                                         outline->n_points + 4,\n                                         0 );\n    if ( error )\n      return error;\n\n    outline->points[outline->n_points    ] = loader->pp1;\n    outline->points[outline->n_points + 1] = loader->pp2;\n    outline->points[outline->n_points + 2] = loader->pp3;\n    outline->points[outline->n_points + 3] = loader->pp4;\n\n    outline->tags[outline->n_points    ] = 0;\n    outline->tags[outline->n_points + 1] = 0;\n    outline->tags[outline->n_points + 2] = 0;\n    outline->tags[outline->n_points + 3] = 0;\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    {\n      FT_Stream  stream = loader->stream;\n      FT_UShort  n_ins, max_ins;\n      FT_ULong   tmp;\n\n\n      /* TT_Load_Composite_Glyph only gives us the offset of instructions */\n      /* so we read them here                                             */\n      if ( FT_STREAM_SEEK( loader->ins_pos ) ||\n           FT_READ_USHORT( n_ins )           )\n        return error;\n\n      FT_TRACE5(( \"  Instructions size = %d\\n\", n_ins ));\n\n      /* check it */\n      max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions;\n      if ( n_ins > max_ins )\n      {\n        /* acroread ignores this field, so we only do a rough safety check */\n        if ( (FT_Int)n_ins > loader->byte_len )\n        {\n          FT_TRACE1(( \"TT_Process_Composite_Glyph: \"\n                      \"too many instructions (%d) for glyph with length %d\\n\",\n                      n_ins, loader->byte_len ));\n          return FT_THROW( Too_Many_Hints );\n        }\n\n        tmp = loader->exec->glyphSize;\n        error = Update_Max( loader->exec->memory,\n                            &tmp,\n                            sizeof ( FT_Byte ),\n                            (void*)&loader->exec->glyphIns,\n                            n_ins );\n        loader->exec->glyphSize = (FT_UShort)tmp;\n        if ( error )\n          return error;\n      }\n      else if ( n_ins == 0 )\n        return FT_Err_Ok;\n\n      if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) )\n        return error;\n\n      loader->glyph->control_data = loader->exec->glyphIns;\n      loader->glyph->control_len  = n_ins;\n    }\n\n#endif\n\n    tt_prepare_zone( &loader->zone, &loader->gloader->base,\n                     start_point, start_contour );\n\n    /* Some points are likely touched during execution of  */\n    /* instructions on components.  So let's untouch them. */\n    for ( i = start_point; i < loader->zone.n_points; i++ )\n      loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;\n\n    loader->zone.n_points += 4;\n\n    return TT_Hint_Glyph( loader, 1 );\n  }\n\n\n  /* Calculate the four phantom points.                     */\n  /* The first two stand for horizontal origin and advance. */\n  /* The last two stand for vertical origin and advance.    */\n#define TT_LOADER_SET_PP( loader )                                          \\\n          do {                                                              \\\n            (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \\\n            (loader)->pp1.y = 0;                                            \\\n            (loader)->pp2.x = (loader)->pp1.x + (loader)->advance;          \\\n            (loader)->pp2.y = 0;                                            \\\n            (loader)->pp3.x = 0;                                            \\\n            (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax;  \\\n            (loader)->pp4.x = 0;                                            \\\n            (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance;         \\\n          } while ( 0 )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    load_truetype_glyph                                                */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Loads a given truetype glyph.  Handles composites and uses a       */\n  /*    TT_Loader object.                                                  */\n  /*                                                                       */\n  static FT_Error\n  load_truetype_glyph( TT_Loader  loader,\n                       FT_UInt    glyph_index,\n                       FT_UInt    recurse_count,\n                       FT_Bool    header_only )\n  {\n    FT_Error        error        = FT_Err_Ok;\n    FT_Fixed        x_scale, y_scale;\n    FT_ULong        offset;\n    TT_Face         face         = (TT_Face)loader->face;\n    FT_GlyphLoader  gloader      = loader->gloader;\n    FT_Bool         opened_frame = 0;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    FT_Vector*      deltas       = NULL;\n#endif\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_StreamRec    inc_stream;\n    FT_Data         glyph_data;\n    FT_Bool         glyph_data_loaded = 0;\n#endif\n\n\n    /* some fonts have an incorrect value of `maxComponentDepth', */\n    /* thus we allow depth 1 to catch the majority of them        */\n    if ( recurse_count > 1                                   &&\n         recurse_count > face->max_profile.maxComponentDepth )\n    {\n      error = FT_THROW( Invalid_Composite );\n      goto Exit;\n    }\n\n    /* check glyph index */\n    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )\n    {\n      error = FT_THROW( Invalid_Glyph_Index );\n      goto Exit;\n    }\n\n    loader->glyph_index = glyph_index;\n\n    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n    {\n      x_scale = ((TT_Size)loader->size)->metrics.x_scale;\n      y_scale = ((TT_Size)loader->size)->metrics.y_scale;\n    }\n    else\n    {\n      x_scale = 0x10000L;\n      y_scale = 0x10000L;\n    }\n\n    tt_get_metrics( loader, glyph_index );\n\n    /* Set `offset' to the start of the glyph relative to the start of */\n    /* the `glyf' table, and `byte_len' to the length of the glyph in  */\n    /* bytes.                                                          */\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* If we are loading glyph data via the incremental interface, set */\n    /* the loader stream to a memory stream reading the data returned  */\n    /* by the interface.                                               */\n    if ( face->root.internal->incremental_interface )\n    {\n      error = face->root.internal->incremental_interface->funcs->get_glyph_data(\n                face->root.internal->incremental_interface->object,\n                glyph_index, &glyph_data );\n      if ( error )\n        goto Exit;\n\n      glyph_data_loaded = 1;\n      offset            = 0;\n      loader->byte_len  = glyph_data.length;\n\n      FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) );\n      FT_Stream_OpenMemory( &inc_stream,\n                            glyph_data.pointer, glyph_data.length );\n\n      loader->stream = &inc_stream;\n    }\n    else\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n      offset = tt_face_get_location( face, glyph_index,\n                                     (FT_UInt*)&loader->byte_len );\n\n    if ( loader->byte_len > 0 )\n    {\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n      /* for the incremental interface, `glyf_offset' is always zero */\n      if ( !loader->glyf_offset                        &&\n           !face->root.internal->incremental_interface )\n#else\n      if ( !loader->glyf_offset )\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n      {\n        FT_TRACE2(( \"no `glyf' table but non-zero `loca' entry\\n\" ));\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n\n      error = face->access_glyph_frame( loader, glyph_index,\n                                        loader->glyf_offset + offset,\n                                        loader->byte_len );\n      if ( error )\n        goto Exit;\n\n      opened_frame = 1;\n\n      /* read glyph header first */\n      error = face->read_glyph_header( loader );\n      if ( error || header_only )\n        goto Exit;\n    }\n\n    if ( loader->byte_len == 0 || loader->n_contours == 0 )\n    {\n      loader->bbox.xMin = 0;\n      loader->bbox.xMax = 0;\n      loader->bbox.yMin = 0;\n      loader->bbox.yMax = 0;\n\n      if ( header_only )\n        goto Exit;\n\n      /* must initialize points before (possibly) overriding */\n      /* glyph metrics from the incremental interface        */\n      TT_LOADER_SET_PP( loader );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n      tt_get_metrics_incr_overrides( loader, glyph_index );\n#endif\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n      if ( ((TT_Face)(loader->face))->doblend )\n      {\n        /* this must be done before scaling */\n        FT_Memory  memory = loader->face->memory;\n\n\n        error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),\n                                          glyph_index, &deltas, 4 );\n        if ( error )\n          goto Exit;\n\n        loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y;\n        loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y;\n        loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y;\n        loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y;\n\n        FT_FREE( deltas );\n      }\n\n#endif\n\n      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n      {\n        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );\n        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );\n        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );\n        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );\n      }\n\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    /* must initialize points before (possibly) overriding */\n    /* glyph metrics from the incremental interface        */\n    TT_LOADER_SET_PP( loader );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    tt_get_metrics_incr_overrides( loader, glyph_index );\n#endif\n\n    /***********************************************************************/\n    /***********************************************************************/\n    /***********************************************************************/\n\n    /* if it is a simple glyph, load it */\n\n    if ( loader->n_contours > 0 )\n    {\n      error = face->read_simple_glyph( loader );\n      if ( error )\n        goto Exit;\n\n      /* all data have been read */\n      face->forget_glyph_frame( loader );\n      opened_frame = 0;\n\n      error = TT_Process_Simple_Glyph( loader );\n      if ( error )\n        goto Exit;\n\n      FT_GlyphLoader_Add( gloader );\n    }\n\n    /***********************************************************************/\n    /***********************************************************************/\n    /***********************************************************************/\n\n    /* otherwise, load a composite! */\n    else if ( loader->n_contours == -1 )\n    {\n      FT_UInt   start_point;\n      FT_UInt   start_contour;\n      FT_ULong  ins_pos;  /* position of composite instructions, if any */\n\n\n      start_point   = gloader->base.outline.n_points;\n      start_contour = gloader->base.outline.n_contours;\n\n      /* for each subglyph, read composite header */\n      error = face->read_composite_glyph( loader );\n      if ( error )\n        goto Exit;\n\n      /* store the offset of instructions */\n      ins_pos = loader->ins_pos;\n\n      /* all data we need are read */\n      face->forget_glyph_frame( loader );\n      opened_frame = 0;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n      if ( face->doblend )\n      {\n        FT_Int       i, limit;\n        FT_SubGlyph  subglyph;\n        FT_Memory    memory = face->root.memory;\n\n\n        /* this provides additional offsets */\n        /* for each component's translation */\n\n        if ( ( error = TT_Vary_Get_Glyph_Deltas(\n                         face,\n                         glyph_index,\n                         &deltas,\n                         gloader->current.num_subglyphs + 4 )) != 0 )\n          goto Exit;\n\n        subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;\n        limit    = gloader->current.num_subglyphs;\n\n        for ( i = 0; i < limit; ++i, ++subglyph )\n        {\n          if ( subglyph->flags & ARGS_ARE_XY_VALUES )\n          {\n            /* XXX: overflow check for subglyph->{arg1,arg2}.   */\n            /* deltas[i].{x,y} must be within signed 16-bit,    */\n            /* but the restriction of summed delta is not clear */\n            subglyph->arg1 += (FT_Int16)deltas[i].x;\n            subglyph->arg2 += (FT_Int16)deltas[i].y;\n          }\n        }\n\n        loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y;\n        loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y;\n        loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y;\n        loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y;\n\n        FT_FREE( deltas );\n      }\n\n#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */\n\n      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n      {\n        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );\n        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );\n        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );\n        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );\n      }\n\n      /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */\n      /* `as is' in the glyph slot (the client application will be     */\n      /* responsible for interpreting these data)...                   */\n      if ( loader->load_flags & FT_LOAD_NO_RECURSE )\n      {\n        FT_GlyphLoader_Add( gloader );\n        loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE;\n\n        goto Exit;\n      }\n\n      /*********************************************************************/\n      /*********************************************************************/\n      /*********************************************************************/\n\n      {\n        FT_UInt      n, num_base_points;\n        FT_SubGlyph  subglyph       = 0;\n\n        FT_UInt      num_points     = start_point;\n        FT_UInt      num_subglyphs  = gloader->current.num_subglyphs;\n        FT_UInt      num_base_subgs = gloader->base.num_subglyphs;\n\n        FT_Stream    old_stream     = loader->stream;\n        FT_Int       old_byte_len   = loader->byte_len;\n\n\n        FT_GlyphLoader_Add( gloader );\n\n        /* read each subglyph independently */\n        for ( n = 0; n < num_subglyphs; n++ )\n        {\n          FT_Vector  pp[4];\n\n\n          /* Each time we call load_truetype_glyph in this loop, the   */\n          /* value of `gloader.base.subglyphs' can change due to table */\n          /* reallocations.  We thus need to recompute the subglyph    */\n          /* pointer on each iteration.                                */\n          subglyph = gloader->base.subglyphs + num_base_subgs + n;\n\n          pp[0] = loader->pp1;\n          pp[1] = loader->pp2;\n          pp[2] = loader->pp3;\n          pp[3] = loader->pp4;\n\n          num_base_points = gloader->base.outline.n_points;\n\n          error = load_truetype_glyph( loader, subglyph->index,\n                                       recurse_count + 1, FALSE );\n          if ( error )\n            goto Exit;\n\n          /* restore subglyph pointer */\n          subglyph = gloader->base.subglyphs + num_base_subgs + n;\n\n          if ( !( subglyph->flags & USE_MY_METRICS ) )\n          {\n            loader->pp1 = pp[0];\n            loader->pp2 = pp[1];\n            loader->pp3 = pp[2];\n            loader->pp4 = pp[3];\n          }\n\n          num_points = gloader->base.outline.n_points;\n\n          if ( num_points == num_base_points )\n            continue;\n\n          /* gloader->base.outline consists of three parts:               */\n          /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */\n          /*                                                              */\n          /* (1): exists from the beginning                               */\n          /* (2): components that have been loaded so far                 */\n          /* (3): the newly loaded component                              */\n          TT_Process_Composite_Component( loader, subglyph, start_point,\n                                          num_base_points );\n        }\n\n        loader->stream   = old_stream;\n        loader->byte_len = old_byte_len;\n\n        /* process the glyph */\n        loader->ins_pos = ins_pos;\n        if ( IS_HINTED( loader->load_flags ) &&\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n             subglyph->flags & WE_HAVE_INSTR &&\n\n#endif\n\n             num_points > start_point )\n          TT_Process_Composite_Glyph( loader, start_point, start_contour );\n\n      }\n    }\n    else\n    {\n      /* invalid composite count (negative but not -1) */\n      error = FT_THROW( Invalid_Outline );\n      goto Exit;\n    }\n\n    /***********************************************************************/\n    /***********************************************************************/\n    /***********************************************************************/\n\n  Exit:\n\n    if ( opened_frame )\n      face->forget_glyph_frame( loader );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    if ( glyph_data_loaded )\n      face->root.internal->incremental_interface->funcs->free_glyph_data(\n        face->root.internal->incremental_interface->object,\n        &glyph_data );\n\n#endif\n\n    return error;\n  }\n\n\n  static FT_Error\n  compute_glyph_metrics( TT_Loader  loader,\n                         FT_UInt    glyph_index )\n  {\n    FT_BBox       bbox;\n    TT_Face       face = (TT_Face)loader->face;\n    FT_Fixed      y_scale;\n    TT_GlyphSlot  glyph = loader->glyph;\n    TT_Size       size = (TT_Size)loader->size;\n\n\n    y_scale = 0x10000L;\n    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )\n      y_scale = size->root.metrics.y_scale;\n\n    if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )\n      FT_Outline_Get_CBox( &glyph->outline, &bbox );\n    else\n      bbox = loader->bbox;\n\n    /* get the device-independent horizontal advance; it is scaled later */\n    /* by the base layer.                                                */\n    glyph->linearHoriAdvance = loader->linear;\n\n    glyph->metrics.horiBearingX = bbox.xMin;\n    glyph->metrics.horiBearingY = bbox.yMax;\n    glyph->metrics.horiAdvance  = loader->pp2.x - loader->pp1.x;\n\n    /* adjust advance width to the value contained in the hdmx table */\n    if ( !face->postscript.isFixedPitch  &&\n         IS_HINTED( loader->load_flags ) )\n    {\n      FT_Byte*  widthp;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      FT_Bool  ignore_x_mode;\n\n\n      ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) !=\n                               FT_RENDER_MODE_MONO );\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      widthp = tt_face_get_device_metrics( face,\n                                           size->root.metrics.x_ppem,\n                                           glyph_index );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( widthp                                                   &&\n           ( ( ignore_x_mode && loader->exec->compatible_widths ) ||\n              !ignore_x_mode                                      ||\n              SPH_OPTION_BITMAP_WIDTHS                            ) )\n#else\n      if ( widthp )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n        glyph->metrics.horiAdvance = *widthp << 6;\n    }\n\n    /* set glyph dimensions */\n    glyph->metrics.width  = bbox.xMax - bbox.xMin;\n    glyph->metrics.height = bbox.yMax - bbox.yMin;\n\n    /* Now take care of vertical metrics.  In the case where there is */\n    /* no vertical information within the font (relatively common),   */\n    /* create some metrics manually                                   */\n    {\n      FT_Pos  top;      /* scaled vertical top side bearing  */\n      FT_Pos  advance;  /* scaled vertical advance height    */\n\n\n      /* Get the unscaled top bearing and advance height. */\n      if ( face->vertical_info                   &&\n           face->vertical.number_Of_VMetrics > 0 )\n      {\n        top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,\n                                   y_scale );\n\n        if ( loader->pp3.y <= loader->pp4.y )\n          advance = 0;\n        else\n          advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,\n                                          y_scale );\n      }\n      else\n      {\n        FT_Pos  height;\n\n\n        /* XXX Compute top side bearing and advance height in  */\n        /*     Get_VMetrics instead of here.                   */\n\n        /* NOTE: The OS/2 values are the only `portable' ones, */\n        /*       which is why we use them, if there is an OS/2 */\n        /*       table in the font.  Otherwise, we use the     */\n        /*       values defined in the horizontal header.      */\n\n        height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,\n                                      y_scale );\n        if ( face->os2.version != 0xFFFFU )\n          advance = (FT_Pos)( face->os2.sTypoAscender -\n                              face->os2.sTypoDescender );\n        else\n          advance = (FT_Pos)( face->horizontal.Ascender -\n                              face->horizontal.Descender );\n\n        top = ( advance - height ) / 2;\n      }\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n      {\n        FT_Incremental_InterfaceRec*  incr;\n        FT_Incremental_MetricsRec     metrics;\n        FT_Error                      error;\n\n\n        incr = face->root.internal->incremental_interface;\n\n        /* If this is an incrementally loaded font see if there are */\n        /* overriding metrics for this glyph.                       */\n        if ( incr && incr->funcs->get_glyph_metrics )\n        {\n          metrics.bearing_x = 0;\n          metrics.bearing_y = top;\n          metrics.advance   = advance;\n\n          error = incr->funcs->get_glyph_metrics( incr->object,\n                                                  glyph_index,\n                                                  TRUE,\n                                                  &metrics );\n          if ( error )\n            return error;\n\n          top     = metrics.bearing_y;\n          advance = metrics.advance;\n        }\n      }\n\n      /* GWW: Do vertical metrics get loaded incrementally too? */\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n      glyph->linearVertAdvance = advance;\n\n      /* scale the metrics */\n      if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )\n      {\n        top     = FT_MulFix( top,     y_scale );\n        advance = FT_MulFix( advance, y_scale );\n      }\n\n      /* XXX: for now, we have no better algorithm for the lsb, but it */\n      /*      should work fine.                                        */\n      /*                                                               */\n      glyph->metrics.vertBearingX = glyph->metrics.horiBearingX -\n                                      glyph->metrics.horiAdvance / 2;\n      glyph->metrics.vertBearingY = top;\n      glyph->metrics.vertAdvance  = advance;\n    }\n\n    return 0;\n  }\n\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n  static FT_Error\n  load_sbit_image( TT_Size       size,\n                   TT_GlyphSlot  glyph,\n                   FT_UInt       glyph_index,\n                   FT_Int32      load_flags )\n  {\n    TT_Face             face;\n    SFNT_Service        sfnt;\n    FT_Stream           stream;\n    FT_Error            error;\n    TT_SBit_MetricsRec  metrics;\n\n\n    face   = (TT_Face)glyph->face;\n    sfnt   = (SFNT_Service)face->sfnt;\n    stream = face->root.stream;\n\n    error = sfnt->load_sbit_image( face,\n                                   size->strike_index,\n                                   glyph_index,\n                                   (FT_Int)load_flags,\n                                   stream,\n                                   &glyph->bitmap,\n                                   &metrics );\n    if ( !error )\n    {\n      glyph->outline.n_points   = 0;\n      glyph->outline.n_contours = 0;\n\n      glyph->metrics.width  = (FT_Pos)metrics.width  << 6;\n      glyph->metrics.height = (FT_Pos)metrics.height << 6;\n\n      glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;\n      glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;\n      glyph->metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;\n\n      glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;\n      glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;\n      glyph->metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;\n\n      glyph->format = FT_GLYPH_FORMAT_BITMAP;\n\n      if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n      {\n        glyph->bitmap_left = metrics.vertBearingX;\n        glyph->bitmap_top  = metrics.vertBearingY;\n      }\n      else\n      {\n        glyph->bitmap_left = metrics.horiBearingX;\n        glyph->bitmap_top  = metrics.horiBearingY;\n      }\n    }\n\n    return error;\n  }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n\n  static FT_Error\n  tt_loader_init( TT_Loader     loader,\n                  TT_Size       size,\n                  TT_GlyphSlot  glyph,\n                  FT_Int32      load_flags,\n                  FT_Bool       glyf_table_only )\n  {\n    TT_Face    face;\n    FT_Stream  stream;\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    FT_Bool    pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );\n#endif\n\n\n    face   = (TT_Face)glyph->face;\n    stream = face->root.stream;\n\n    FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) );\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    /* load execution context */\n    if ( IS_HINTED( load_flags ) && !glyf_table_only )\n    {\n      TT_ExecContext  exec;\n      FT_Bool         grayscale;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      FT_Bool         subpixel_hinting;\n      FT_Bool         grayscale_hinting;\n#if 0\n      FT_Bool         compatible_widths;\n      FT_Bool         symmetrical_smoothing;\n      FT_Bool         bgr;\n      FT_Bool         subpixel_positioned;\n#endif\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n      if ( !size->cvt_ready )\n      {\n        FT_Error  error = tt_size_ready_bytecode( size, pedantic );\n\n\n        if ( error )\n          return error;\n      }\n\n      /* query new execution context */\n      exec = size->debug ? size->context\n                         : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;\n      if ( !exec )\n        return FT_THROW( Could_Not_Find_Context );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n      subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags )\n                                    != FT_RENDER_MODE_MONO )          &&\n                                  SPH_OPTION_SET_SUBPIXEL             );\n\n      if ( subpixel_hinting )\n        grayscale = grayscale_hinting = FALSE;\n      else if ( SPH_OPTION_SET_GRAYSCALE )\n      {\n        grayscale = grayscale_hinting = TRUE;\n        subpixel_hinting = FALSE;\n      }\n      else\n        grayscale = grayscale_hinting = FALSE;\n\n      if ( FT_IS_TRICKY( glyph->face ) )\n        subpixel_hinting = grayscale_hinting = FALSE;\n\n      exec->ignore_x_mode      = subpixel_hinting || grayscale_hinting;\n      exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;\n      if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )\n        exec->rasterizer_version = 35;\n\n#if 1\n      exec->compatible_widths     = SPH_OPTION_SET_COMPATIBLE_WIDTHS;\n      exec->symmetrical_smoothing = FALSE;\n      exec->bgr                   = FALSE;\n      exec->subpixel_positioned   = TRUE;\n#else /* 0 */\n      exec->compatible_widths =\n        FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=\n                 TT_LOAD_COMPATIBLE_WIDTHS );\n      exec->symmetrical_smoothing =\n        FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=\n                 TT_LOAD_SYMMETRICAL_SMOOTHING );\n      exec->bgr =\n        FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=\n                 TT_LOAD_BGR );\n      exec->subpixel_positioned =\n        FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=\n                 TT_LOAD_SUBPIXEL_POSITIONED );\n#endif /* 0 */\n\n#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      grayscale =\n        FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != FT_RENDER_MODE_MONO );\n\n#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      TT_Load_Context( exec, face, size );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n      /* a change from mono to subpixel rendering (and vice versa) */\n      /* requires a re-execution of the CVT program                */\n      if ( subpixel_hinting != exec->subpixel_hinting )\n      {\n        FT_UInt  i;\n\n\n        FT_TRACE4(( \"tt_loader_init: subpixel hinting change,\"\n                    \" re-executing `prep' table\\n\" ));\n\n        exec->subpixel_hinting = subpixel_hinting;\n\n        for ( i = 0; i < size->cvt_size; i++ )\n          size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );\n        tt_size_run_prep( size, pedantic );\n      }\n\n      /* a change from mono to grayscale rendering (and vice versa) */\n      /* requires a re-execution of the CVT program                 */\n      if ( grayscale != exec->grayscale_hinting )\n      {\n        FT_UInt  i;\n\n\n        FT_TRACE4(( \"tt_loader_init: grayscale hinting change,\"\n                    \" re-executing `prep' table\\n\" ));\n\n        exec->grayscale_hinting = grayscale_hinting;\n\n        for ( i = 0; i < size->cvt_size; i++ )\n          size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );\n        tt_size_run_prep( size, pedantic );\n      }\n\n#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      /* a change from mono to grayscale rendering (and vice versa) */\n      /* requires a re-execution of the CVT program                 */\n      if ( grayscale != exec->grayscale )\n      {\n        FT_UInt  i;\n\n\n        FT_TRACE4(( \"tt_loader_init: grayscale change,\"\n                    \" re-executing `prep' table\\n\" ));\n\n        exec->grayscale = grayscale;\n\n        for ( i = 0; i < size->cvt_size; i++ )\n          size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );\n        tt_size_run_prep( size, pedantic );\n      }\n\n#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      /* see whether the cvt program has disabled hinting */\n      if ( exec->GS.instruct_control & 1 )\n        load_flags |= FT_LOAD_NO_HINTING;\n\n      /* load default graphics state -- if needed */\n      if ( exec->GS.instruct_control & 2 )\n        exec->GS = tt_default_graphics_state;\n\n      exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );\n      loader->exec = exec;\n      loader->instructions = exec->glyphIns;\n    }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n    /* seek to the beginning of the glyph table -- for Type 42 fonts     */\n    /* the table might be accessed from a Postscript stream or something */\n    /* else...                                                           */\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    if ( face->root.internal->incremental_interface )\n      loader->glyf_offset = 0;\n    else\n\n#endif\n\n    {\n      FT_Error  error = face->goto_table( face, TTAG_glyf, stream, 0 );\n\n\n      if ( FT_ERR_EQ( error, Table_Missing ) )\n        loader->glyf_offset = 0;\n      else if ( error )\n      {\n        FT_ERROR(( \"tt_loader_init: could not access glyph table\\n\" ));\n        return error;\n      }\n      else\n        loader->glyf_offset = FT_STREAM_POS();\n    }\n\n    /* get face's glyph loader */\n    if ( !glyf_table_only )\n    {\n      FT_GlyphLoader  gloader = glyph->internal->loader;\n\n\n      FT_GlyphLoader_Rewind( gloader );\n      loader->gloader = gloader;\n    }\n\n    loader->load_flags = load_flags;\n\n    loader->face   = (FT_Face)face;\n    loader->size   = (FT_Size)size;\n    loader->glyph  = (FT_GlyphSlot)glyph;\n    loader->stream = stream;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Load_Glyph                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A function used to load a single glyph within a given glyph slot,  */\n  /*    for a given size.                                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    glyph       :: A handle to a target slot object where the glyph    */\n  /*                   will be loaded.                                     */\n  /*                                                                       */\n  /*    size        :: A handle to the source face size at which the glyph */\n  /*                   must be scaled/loaded.                              */\n  /*                                                                       */\n  /*    glyph_index :: The index of the glyph in the font file.            */\n  /*                                                                       */\n  /*    load_flags  :: A flag indicating what to load for this glyph.  The */\n  /*                   FT_LOAD_XXX constants can be used to control the    */\n  /*                   glyph loading process (e.g., whether the outline    */\n  /*                   should be scaled, whether to load bitmaps or not,   */\n  /*                   whether to hint the outline, etc).                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Load_Glyph( TT_Size       size,\n                 TT_GlyphSlot  glyph,\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags )\n  {\n    FT_Error      error;\n    TT_LoaderRec  loader;\n\n\n    error = FT_Err_Ok;\n\n#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n    /* try to load embedded bitmap if any              */\n    /*                                                 */\n    /* XXX: The convention should be emphasized in     */\n    /*      the documents because it can be confusing. */\n    if ( size->strike_index != 0xFFFFFFFFUL      &&\n         ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )\n    {\n      error = load_sbit_image( size, glyph, glyph_index, load_flags );\n      if ( !error )\n      {\n        if ( FT_IS_SCALABLE( glyph->face ) )\n        {\n          /* for the bbox we need the header only */\n          (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );\n          (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );\n          glyph->linearHoriAdvance = loader.linear;\n          glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax -\n                                       loader.vadvance;\n        }\n\n        return FT_Err_Ok;\n      }\n    }\n\n#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */\n\n    /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */\n    if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )\n      return FT_THROW( Invalid_Size_Handle );\n\n    if ( load_flags & FT_LOAD_SBITS_ONLY )\n      return FT_THROW( Invalid_Argument );\n\n    error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );\n    if ( error )\n      return error;\n\n    glyph->format        = FT_GLYPH_FORMAT_OUTLINE;\n    glyph->num_subglyphs = 0;\n    glyph->outline.flags = 0;\n\n    /* main loading loop */\n    error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );\n    if ( !error )\n    {\n      if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE )\n      {\n        glyph->num_subglyphs = loader.gloader->base.num_subglyphs;\n        glyph->subglyphs     = loader.gloader->base.subglyphs;\n      }\n      else\n      {\n        glyph->outline        = loader.gloader->base.outline;\n        glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;\n\n        /* Translate array so that (0,0) is the glyph's origin.  Note  */\n        /* that this behaviour is independent on the value of bit 1 of */\n        /* the `flags' field in the `head' table -- at least major     */\n        /* applications like Acroread indicate that.                   */\n        if ( loader.pp1.x )\n          FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 );\n      }\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n      if ( IS_HINTED( load_flags ) )\n      {\n        if ( loader.exec->GS.scan_control )\n        {\n          /* convert scan conversion mode to FT_OUTLINE_XXX flags */\n          switch ( loader.exec->GS.scan_type )\n          {\n          case 0: /* simple drop-outs including stubs */\n            glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS;\n            break;\n          case 1: /* simple drop-outs excluding stubs */\n            /* nothing; it's the default rendering mode */\n            break;\n          case 4: /* smart drop-outs including stubs */\n            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS |\n                                    FT_OUTLINE_INCLUDE_STUBS;\n            break;\n          case 5: /* smart drop-outs excluding stubs  */\n            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS;\n            break;\n\n          default: /* no drop-out control */\n            glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;\n            break;\n          }\n        }\n        else\n          glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;\n      }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n      compute_glyph_metrics( &loader, glyph_index );\n    }\n\n    /* Set the `high precision' bit flag.                           */\n    /* This is _critical_ to get correct output for monochrome      */\n    /* TrueType glyphs at all sizes using the bytecode interpreter. */\n    /*                                                              */\n    if ( !( load_flags & FT_LOAD_NO_SCALE ) &&\n         size->root.metrics.y_ppem < 24     )\n      glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttgload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttgload.h                                                              */\n/*                                                                         */\n/*    TrueType Glyph Loader (specification).                               */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008, 2011 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTGLOAD_H__\n#define __TTGLOAD_H__\n\n\n#include <ft2build.h>\n#include \"ttobjs.h\"\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n#include \"ttinterp.h\"\n#endif\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( void )\n  TT_Init_Glyph_Loading( TT_Face  face );\n\n  FT_LOCAL( void )\n  TT_Get_HMetrics( TT_Face     face,\n                   FT_UInt     idx,\n                   FT_Short*   lsb,\n                   FT_UShort*  aw );\n\n  FT_LOCAL( void )\n  TT_Get_VMetrics( TT_Face     face,\n                   FT_UInt     idx,\n                   FT_Short*   tsb,\n                   FT_UShort*  ah );\n\n  FT_LOCAL( FT_Error )\n  TT_Load_Glyph( TT_Size       size,\n                 TT_GlyphSlot  glyph,\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags );\n\n\nFT_END_HEADER\n\n#endif /* __TTGLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttgxvar.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttgxvar.c                                                              */\n/*                                                                         */\n/*    TrueType GX Font Variation loader                                    */\n/*                                                                         */\n/*  Copyright 2004-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.     */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at      */\n  /*                                                                       */\n  /*   http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html  */\n  /*                                                                       */\n  /* The documentation for `fvar' is inconsistent.  At one point it says   */\n  /* that `countSizePairs' should be 3, at another point 2.  It should     */\n  /* be 2.                                                                 */\n  /*                                                                       */\n  /* The documentation for `gvar' is not intelligible; `cvar' refers you   */\n  /* to `gvar' and is thus also incomprehensible.                          */\n  /*                                                                       */\n  /* The documentation for `avar' appears correct, but Apple has no fonts  */\n  /* with an `avar' table, so it is hard to test.                          */\n  /*                                                                       */\n  /* Many thanks to John Jenkins (at Apple) in figuring this out.          */\n  /*                                                                       */\n  /*                                                                       */\n  /* Apple's `kern' table has some references to tuple indices, but as     */\n  /* there is no indication where these indices are defined, nor how to    */\n  /* interpolate the kerning values (different tuples have different       */\n  /* classes) this issue is ignored.                                       */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_CONFIG_CONFIG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_SFNT_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_MULTIPLE_MASTERS_H\n\n#include \"ttpload.h\"\n#include \"ttgxvar.h\"\n\n#include \"tterrors.h\"\n\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n\n#define FT_Stream_FTell( stream )  \\\n          ( (stream)->cursor - (stream)->base )\n#define FT_Stream_SeekSet( stream, off ) \\\n              ( (stream)->cursor = (stream)->base+(off) )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttgxvar\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                       Internal Routines                       *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'.  It        */\n  /* indicates that there is a delta for every point without needing to    */\n  /* enumerate all of them.                                                */\n  /*                                                                       */\n#define ALL_POINTS  (FT_UShort*)( ~0 )\n\n\n#define GX_PT_POINTS_ARE_WORDS      0x80\n#define GX_PT_POINT_RUN_COUNT_MASK  0x7F\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_readpackedpoints                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Read a set of points to which the following deltas will apply.     */\n  /*    Points are packed with a run length encoding.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream    :: The data stream.                                      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    point_cnt :: The number of points read.  A zero value means that   */\n  /*                 all points in the glyph will be affected, without     */\n  /*                 enumerating them individually.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    An array of FT_UShort containing the affected points or the        */\n  /*    special value ALL_POINTS.                                          */\n  /*                                                                       */\n  static FT_UShort*\n  ft_var_readpackedpoints( FT_Stream  stream,\n                           FT_UInt   *point_cnt )\n  {\n    FT_UShort *points = NULL;\n    FT_Int     n;\n    FT_Int     runcnt;\n    FT_Int     i;\n    FT_Int     j;\n    FT_Int     first;\n    FT_Memory  memory = stream->memory;\n    FT_Error   error  = FT_Err_Ok;\n\n    FT_UNUSED( error );\n\n\n    *point_cnt = n = FT_GET_BYTE();\n    if ( n == 0 )\n      return ALL_POINTS;\n\n    if ( n & GX_PT_POINTS_ARE_WORDS )\n      n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 );\n\n    if ( FT_NEW_ARRAY( points, n ) )\n      return NULL;\n\n    i = 0;\n    while ( i < n )\n    {\n      runcnt = FT_GET_BYTE();\n      if ( runcnt & GX_PT_POINTS_ARE_WORDS )\n      {\n        runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK;\n        first  = points[i++] = FT_GET_USHORT();\n\n        if ( runcnt < 1 || i + runcnt >= n )\n          goto Exit;\n\n        /* first point not included in runcount */\n        for ( j = 0; j < runcnt; ++j )\n          points[i++] = (FT_UShort)( first += FT_GET_USHORT() );\n      }\n      else\n      {\n        first = points[i++] = FT_GET_BYTE();\n\n        if ( runcnt < 1 || i + runcnt >= n )\n          goto Exit;\n\n        for ( j = 0; j < runcnt; ++j )\n          points[i++] = (FT_UShort)( first += FT_GET_BYTE() );\n      }\n    }\n\n  Exit:\n    return points;\n  }\n\n\n  enum\n  {\n    GX_DT_DELTAS_ARE_ZERO      = 0x80,\n    GX_DT_DELTAS_ARE_WORDS     = 0x40,\n    GX_DT_DELTA_RUN_COUNT_MASK = 0x3F\n  };\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_readpackeddeltas                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Read a set of deltas.  These are packed slightly differently than  */\n  /*    points.  In particular there is no overall count.                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream    :: The data stream.                                      */\n  /*                                                                       */\n  /*    delta_cnt :: The number of to be read.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    An array of FT_Short containing the deltas for the affected        */\n  /*    points.  (This only gets the deltas for one dimension.  It will    */\n  /*    generally be called twice, once for x, once for y.  When used in   */\n  /*    cvt table, it will only be called once.)                           */\n  /*                                                                       */\n  static FT_Short*\n  ft_var_readpackeddeltas( FT_Stream  stream,\n                           FT_Offset  delta_cnt )\n  {\n    FT_Short  *deltas = NULL;\n    FT_UInt    runcnt;\n    FT_Offset  i;\n    FT_UInt    j;\n    FT_Memory  memory = stream->memory;\n    FT_Error   error  = FT_Err_Ok;\n\n    FT_UNUSED( error );\n\n\n    if ( FT_NEW_ARRAY( deltas, delta_cnt ) )\n      return NULL;\n\n    i = 0;\n    while ( i < delta_cnt )\n    {\n      runcnt = FT_GET_BYTE();\n      if ( runcnt & GX_DT_DELTAS_ARE_ZERO )\n      {\n        /* runcnt zeroes get added */\n        for ( j = 0;\n              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;\n              ++j )\n          deltas[i++] = 0;\n      }\n      else if ( runcnt & GX_DT_DELTAS_ARE_WORDS )\n      {\n        /* runcnt shorts from the stack */\n        for ( j = 0;\n              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;\n              ++j )\n          deltas[i++] = FT_GET_SHORT();\n      }\n      else\n      {\n        /* runcnt signed bytes from the stack */\n        for ( j = 0;\n              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;\n              ++j )\n          deltas[i++] = FT_GET_CHAR();\n      }\n\n      if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) )\n      {\n        /* Bad format */\n        FT_FREE( deltas );\n        return NULL;\n      }\n    }\n\n    return deltas;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_load_avar                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parse the `avar' table if present.  It need not be, so we return   */\n  /*    nothing.                                                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face :: The font face.                                             */\n  /*                                                                       */\n  static void\n  ft_var_load_avar( TT_Face  face )\n  {\n    FT_Stream       stream = FT_FACE_STREAM(face);\n    FT_Memory       memory = stream->memory;\n    GX_Blend        blend  = face->blend;\n    GX_AVarSegment  segment;\n    FT_Error        error = FT_Err_Ok;\n    FT_ULong        version;\n    FT_Long         axisCount;\n    FT_Int          i, j;\n    FT_ULong        table_len;\n\n    FT_UNUSED( error );\n\n\n    blend->avar_checked = TRUE;\n    if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 )\n      return;\n\n    if ( FT_FRAME_ENTER( table_len ) )\n      return;\n\n    version   = FT_GET_LONG();\n    axisCount = FT_GET_LONG();\n\n    if ( version != 0x00010000L                       ||\n         axisCount != (FT_Long)blend->mmvar->num_axis )\n      goto Exit;\n\n    if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) )\n      goto Exit;\n\n    segment = &blend->avar_segment[0];\n    for ( i = 0; i < axisCount; ++i, ++segment )\n    {\n      segment->pairCount = FT_GET_USHORT();\n      if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )\n      {\n        /* Failure.  Free everything we have done so far.  We must do */\n        /* it right now since loading the `avar' table is optional.   */\n\n        for ( j = i - 1; j >= 0; --j )\n          FT_FREE( blend->avar_segment[j].correspondence );\n\n        FT_FREE( blend->avar_segment );\n        blend->avar_segment = NULL;\n        goto Exit;\n      }\n\n      for ( j = 0; j < segment->pairCount; ++j )\n      {\n        segment->correspondence[j].fromCoord =\n          FT_GET_SHORT() << 2;    /* convert to Fixed */\n        segment->correspondence[j].toCoord =\n          FT_GET_SHORT()<<2;    /* convert to Fixed */\n      }\n    }\n\n  Exit:\n    FT_FRAME_EXIT();\n  }\n\n\n  typedef struct  GX_GVar_Head_\n  {\n    FT_Long    version;\n    FT_UShort  axisCount;\n    FT_UShort  globalCoordCount;\n    FT_ULong   offsetToCoord;\n    FT_UShort  glyphCount;\n    FT_UShort  flags;\n    FT_ULong   offsetToData;\n\n  } GX_GVar_Head;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_load_gvar                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Parses the `gvar' table if present.  If `fvar' is there, `gvar'    */\n  /*    had better be there too.                                           */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face :: The font face.                                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  ft_var_load_gvar( TT_Face  face )\n  {\n    FT_Stream     stream = FT_FACE_STREAM(face);\n    FT_Memory     memory = stream->memory;\n    GX_Blend      blend  = face->blend;\n    FT_Error      error;\n    FT_UInt       i, j;\n    FT_ULong      table_len;\n    FT_ULong      gvar_start;\n    FT_ULong      offsetToData;\n    GX_GVar_Head  gvar_head;\n\n    static const FT_Frame_Field  gvar_fields[] =\n    {\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  GX_GVar_Head\n\n      FT_FRAME_START( 20 ),\n        FT_FRAME_LONG  ( version ),\n        FT_FRAME_USHORT( axisCount ),\n        FT_FRAME_USHORT( globalCoordCount ),\n        FT_FRAME_ULONG ( offsetToCoord ),\n        FT_FRAME_USHORT( glyphCount ),\n        FT_FRAME_USHORT( flags ),\n        FT_FRAME_ULONG ( offsetToData ),\n      FT_FRAME_END\n    };\n\n    if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 )\n      goto Exit;\n\n    gvar_start = FT_STREAM_POS( );\n    if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) )\n      goto Exit;\n\n    blend->tuplecount  = gvar_head.globalCoordCount;\n    blend->gv_glyphcnt = gvar_head.glyphCount;\n    offsetToData       = gvar_start + gvar_head.offsetToData;\n\n    if ( gvar_head.version   != (FT_Long)0x00010000L              ||\n         gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis )\n    {\n      error = FT_THROW( Invalid_Table );\n      goto Exit;\n    }\n\n    if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )\n      goto Exit;\n\n    if ( gvar_head.flags & 1 )\n    {\n      /* long offsets (one more offset than glyphs, to mark size of last) */\n      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) )\n        goto Exit;\n\n      for ( i = 0; i <= blend->gv_glyphcnt; ++i )\n        blend->glyphoffsets[i] = offsetToData + FT_GET_LONG();\n\n      FT_FRAME_EXIT();\n    }\n    else\n    {\n      /* short offsets (one more offset than glyphs, to mark size of last) */\n      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) )\n        goto Exit;\n\n      for ( i = 0; i <= blend->gv_glyphcnt; ++i )\n        blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2;\n                                              /* XXX: Undocumented: `*2'! */\n\n      FT_FRAME_EXIT();\n    }\n\n    if ( blend->tuplecount != 0 )\n    {\n      if ( FT_NEW_ARRAY( blend->tuplecoords,\n                         gvar_head.axisCount * blend->tuplecount ) )\n        goto Exit;\n\n      if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord )       ||\n           FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L )                   )\n        goto Exit;\n\n      for ( i = 0; i < blend->tuplecount; ++i )\n        for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j )\n          blend->tuplecoords[i * gvar_head.axisCount + j] =\n            FT_GET_SHORT() << 2;                /* convert to FT_Fixed */\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    ft_var_apply_tuple                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Figure out whether a given tuple (design) applies to the current   */\n  /*    blend, and if so, what is the scaling factor.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    blend           :: The current blend of the font.                  */\n  /*                                                                       */\n  /*    tupleIndex      :: A flag saying whether this is an intermediate   */\n  /*                       tuple or not.                                   */\n  /*                                                                       */\n  /*    tuple_coords    :: The coordinates of the tuple in normalized axis */\n  /*                       units.                                          */\n  /*                                                                       */\n  /*    im_start_coords :: The initial coordinates where this tuple starts */\n  /*                       to apply (for intermediate coordinates).        */\n  /*                                                                       */\n  /*    im_end_coords   :: The final coordinates after which this tuple no */\n  /*                       longer applies (for intermediate coordinates).  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    An FT_Fixed value containing the scaling factor.                   */\n  /*                                                                       */\n  static FT_Fixed\n  ft_var_apply_tuple( GX_Blend   blend,\n                      FT_UShort  tupleIndex,\n                      FT_Fixed*  tuple_coords,\n                      FT_Fixed*  im_start_coords,\n                      FT_Fixed*  im_end_coords )\n  {\n    FT_UInt   i;\n    FT_Fixed  apply = 0x10000L;\n\n\n    for ( i = 0; i < blend->num_axis; ++i )\n    {\n      if ( tuple_coords[i] == 0 )\n        /* It's not clear why (for intermediate tuples) we don't need     */\n        /* to check against start/end -- the documentation says we don't. */\n        /* Similarly, it's unclear why we don't need to scale along the   */\n        /* axis.                                                          */\n        continue;\n\n      else if ( blend->normalizedcoords[i] == 0                           ||\n                ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) ||\n                ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) )\n      {\n        apply = 0;\n        break;\n      }\n\n      else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )\n        /* not an intermediate tuple */\n        apply = FT_MulFix( apply,\n                           blend->normalizedcoords[i] > 0\n                             ? blend->normalizedcoords[i]\n                             : -blend->normalizedcoords[i] );\n\n      else if ( blend->normalizedcoords[i] <= im_start_coords[i] ||\n                blend->normalizedcoords[i] >= im_end_coords[i]   )\n      {\n        apply = 0;\n        break;\n      }\n\n      else if ( blend->normalizedcoords[i] < tuple_coords[i] )\n        apply = FT_MulDiv( apply,\n                           blend->normalizedcoords[i] - im_start_coords[i],\n                           tuple_coords[i] - im_start_coords[i] );\n\n      else\n        apply = FT_MulDiv( apply,\n                           im_end_coords[i] - blend->normalizedcoords[i],\n                           im_end_coords[i] - tuple_coords[i] );\n    }\n\n    return apply;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****               MULTIPLE MASTERS SERVICE FUNCTIONS              *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  typedef struct  GX_FVar_Head_\n  {\n    FT_Long    version;\n    FT_UShort  offsetToData;\n    FT_UShort  countSizePairs;\n    FT_UShort  axisCount;\n    FT_UShort  axisSize;\n    FT_UShort  instanceCount;\n    FT_UShort  instanceSize;\n\n  } GX_FVar_Head;\n\n\n  typedef struct  fvar_axis_\n  {\n    FT_ULong   axisTag;\n    FT_ULong   minValue;\n    FT_ULong   defaultValue;\n    FT_ULong   maxValue;\n    FT_UShort  flags;\n    FT_UShort  nameID;\n\n  } GX_FVar_Axis;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Get_MM_Var                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Check that the font's `fvar' table is valid, parse it, and return  */\n  /*    those data.                                                        */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: The font face.                                           */\n  /*              TT_Get_MM_Var initializes the blend structure.           */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    master :: The `fvar' data (must be freed by caller).               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Get_MM_Var( TT_Face      face,\n                 FT_MM_Var*  *master )\n  {\n    FT_Stream            stream = face->root.stream;\n    FT_Memory            memory = face->root.memory;\n    FT_ULong             table_len;\n    FT_Error             error  = FT_Err_Ok;\n    FT_ULong             fvar_start;\n    FT_Int               i, j;\n    FT_MM_Var*           mmvar = NULL;\n    FT_Fixed*            next_coords;\n    FT_String*           next_name;\n    FT_Var_Axis*         a;\n    FT_Var_Named_Style*  ns;\n    GX_FVar_Head         fvar_head;\n\n    static const FT_Frame_Field  fvar_fields[] =\n    {\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  GX_FVar_Head\n\n      FT_FRAME_START( 16 ),\n        FT_FRAME_LONG  ( version ),\n        FT_FRAME_USHORT( offsetToData ),\n        FT_FRAME_USHORT( countSizePairs ),\n        FT_FRAME_USHORT( axisCount ),\n        FT_FRAME_USHORT( axisSize ),\n        FT_FRAME_USHORT( instanceCount ),\n        FT_FRAME_USHORT( instanceSize ),\n      FT_FRAME_END\n    };\n\n    static const FT_Frame_Field  fvaraxis_fields[] =\n    {\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  GX_FVar_Axis\n\n      FT_FRAME_START( 20 ),\n        FT_FRAME_ULONG ( axisTag ),\n        FT_FRAME_ULONG ( minValue ),\n        FT_FRAME_ULONG ( defaultValue ),\n        FT_FRAME_ULONG ( maxValue ),\n        FT_FRAME_USHORT( flags ),\n        FT_FRAME_USHORT( nameID ),\n      FT_FRAME_END\n    };\n\n\n    if ( face->blend == NULL )\n    {\n      /* both `fvar' and `gvar' must be present */\n      if ( (error = face->goto_table( face, TTAG_gvar,\n                                      stream, &table_len )) != 0 )\n        goto Exit;\n\n      if ( (error = face->goto_table( face, TTAG_fvar,\n                                      stream, &table_len )) != 0 )\n        goto Exit;\n\n      fvar_start = FT_STREAM_POS( );\n\n      if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) )\n        goto Exit;\n\n      if ( fvar_head.version != (FT_Long)0x00010000L                      ||\n           fvar_head.countSizePairs != 2                                  ||\n           fvar_head.axisSize != 20                                       ||\n           /* axisCount limit implied by 16-bit instanceSize */\n           fvar_head.axisCount > 0x3FFE                                   ||\n           fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount          ||\n           /* instanceCount limit implied by limited range of name IDs */\n           fvar_head.instanceCount > 0x7EFF                               ||\n           fvar_head.offsetToData + fvar_head.axisCount * 20U +\n             fvar_head.instanceCount * fvar_head.instanceSize > table_len )\n      {\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n\n      if ( FT_NEW( face->blend ) )\n        goto Exit;\n\n      /* cannot overflow 32-bit arithmetic because of limits above */\n      face->blend->mmvar_len =\n        sizeof ( FT_MM_Var ) +\n        fvar_head.axisCount * sizeof ( FT_Var_Axis ) +\n        fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) +\n        fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) +\n        5 * fvar_head.axisCount;\n\n      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )\n        goto Exit;\n      face->blend->mmvar = mmvar;\n\n      mmvar->num_axis =\n        fvar_head.axisCount;\n      mmvar->num_designs =\n        ~0;                    /* meaningless in this context; each glyph */\n                               /* may have a different number of designs  */\n                               /* (or tuples, as called by Apple)         */\n      mmvar->num_namedstyles =\n        fvar_head.instanceCount;\n      mmvar->axis =\n        (FT_Var_Axis*)&(mmvar[1]);\n      mmvar->namedstyle =\n        (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]);\n\n      next_coords =\n        (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]);\n      for ( i = 0; i < fvar_head.instanceCount; ++i )\n      {\n        mmvar->namedstyle[i].coords  = next_coords;\n        next_coords                 += fvar_head.axisCount;\n      }\n\n      next_name = (FT_String*)next_coords;\n      for ( i = 0; i < fvar_head.axisCount; ++i )\n      {\n        mmvar->axis[i].name  = next_name;\n        next_name           += 5;\n      }\n\n      if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) )\n        goto Exit;\n\n      a = mmvar->axis;\n      for ( i = 0; i < fvar_head.axisCount; ++i )\n      {\n        GX_FVar_Axis  axis_rec;\n\n\n        if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) )\n          goto Exit;\n        a->tag     = axis_rec.axisTag;\n        a->minimum = axis_rec.minValue;     /* A Fixed */\n        a->def     = axis_rec.defaultValue; /* A Fixed */\n        a->maximum = axis_rec.maxValue;     /* A Fixed */\n        a->strid   = axis_rec.nameID;\n\n        a->name[0] = (FT_String)(   a->tag >> 24 );\n        a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF );\n        a->name[2] = (FT_String)( ( a->tag >>  8 ) & 0xFF );\n        a->name[3] = (FT_String)( ( a->tag       ) & 0xFF );\n        a->name[4] = 0;\n\n        ++a;\n      }\n\n      ns = mmvar->namedstyle;\n      for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns )\n      {\n        if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) )\n          goto Exit;\n\n        ns->strid       =    FT_GET_USHORT();\n        (void) /* flags = */ FT_GET_USHORT();\n\n        for ( j = 0; j < fvar_head.axisCount; ++j )\n          ns->coords[j] = FT_GET_ULONG();     /* A Fixed */\n\n        FT_FRAME_EXIT();\n      }\n    }\n\n    if ( master != NULL )\n    {\n      FT_UInt  n;\n\n\n      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )\n        goto Exit;\n      FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );\n\n      mmvar->axis =\n        (FT_Var_Axis*)&(mmvar[1]);\n      mmvar->namedstyle =\n        (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]);\n      next_coords =\n        (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]);\n\n      for ( n = 0; n < mmvar->num_namedstyles; ++n )\n      {\n        mmvar->namedstyle[n].coords  = next_coords;\n        next_coords                 += mmvar->num_axis;\n      }\n\n      a = mmvar->axis;\n      next_name = (FT_String*)next_coords;\n      for ( n = 0; n < mmvar->num_axis; ++n )\n      {\n        a->name = next_name;\n\n        /* standard PostScript names for some standard apple tags */\n        if ( a->tag == TTAG_wght )\n          a->name = (char *)\"Weight\";\n        else if ( a->tag == TTAG_wdth )\n          a->name = (char *)\"Width\";\n        else if ( a->tag == TTAG_opsz )\n          a->name = (char *)\"OpticalSize\";\n        else if ( a->tag == TTAG_slnt )\n          a->name = (char *)\"Slant\";\n\n        next_name += 5;\n        ++a;\n      }\n\n      *master = mmvar;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Set_MM_Blend                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set the blend (normalized) coordinates for this instance of the    */\n  /*    font.  Check that the `gvar' table is reasonable and does some     */\n  /*    initial preparation.                                               */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The font.                                            */\n  /*                  Initialize the blend structure with `gvar' data.     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: Must be the axis count of the font.                  */\n  /*                                                                       */\n  /*    coords     :: An array of num_coords, each between [-1,1].         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Set_MM_Blend( TT_Face    face,\n                   FT_UInt    num_coords,\n                   FT_Fixed*  coords )\n  {\n    FT_Error    error = FT_Err_Ok;\n    GX_Blend    blend;\n    FT_MM_Var*  mmvar;\n    FT_UInt     i;\n    FT_Memory   memory = face->root.memory;\n\n    enum\n    {\n      mcvt_retain,\n      mcvt_modify,\n      mcvt_load\n\n    } manageCvt;\n\n\n    face->doblend = FALSE;\n\n    if ( face->blend == NULL )\n    {\n      if ( (error = TT_Get_MM_Var( face, NULL)) != 0 )\n        goto Exit;\n    }\n\n    blend = face->blend;\n    mmvar = blend->mmvar;\n\n    if ( num_coords != mmvar->num_axis )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    for ( i = 0; i < num_coords; ++i )\n      if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Exit;\n      }\n\n    if ( blend->glyphoffsets == NULL )\n      if ( (error = ft_var_load_gvar( face )) != 0 )\n        goto Exit;\n\n    if ( blend->normalizedcoords == NULL )\n    {\n      if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) )\n        goto Exit;\n\n      manageCvt = mcvt_modify;\n\n      /* If we have not set the blend coordinates before this, then the  */\n      /* cvt table will still be what we read from the `cvt ' table and  */\n      /* we don't need to reload it.  We may need to change it though... */\n    }\n    else\n    {\n      manageCvt = mcvt_retain;\n      for ( i = 0; i < num_coords; ++i )\n      {\n        if ( blend->normalizedcoords[i] != coords[i] )\n        {\n          manageCvt = mcvt_load;\n          break;\n        }\n      }\n\n      /* If we don't change the blend coords then we don't need to do  */\n      /* anything to the cvt table.  It will be correct.  Otherwise we */\n      /* no longer have the original cvt (it was modified when we set  */\n      /* the blend last time), so we must reload and then modify it.   */\n    }\n\n    blend->num_axis = num_coords;\n    FT_MEM_COPY( blend->normalizedcoords,\n                 coords,\n                 num_coords * sizeof ( FT_Fixed ) );\n\n    face->doblend = TRUE;\n\n    if ( face->cvt != NULL )\n    {\n      switch ( manageCvt )\n      {\n      case mcvt_load:\n        /* The cvt table has been loaded already; every time we change the */\n        /* blend we may need to reload and remodify the cvt table.         */\n        FT_FREE( face->cvt );\n        face->cvt = NULL;\n\n        tt_face_load_cvt( face, face->root.stream );\n        break;\n\n      case mcvt_modify:\n        /* The original cvt table is in memory.  All we need to do is */\n        /* apply the `cvar' table (if any).                           */\n        tt_face_vary_cvt( face, face->root.stream );\n        break;\n\n      case mcvt_retain:\n        /* The cvt table is correct for this set of coordinates. */\n        break;\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Set_Var_Design                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Set the coordinates for the instance, measured in the user         */\n  /*    coordinate system.  Parse the `avar' table (if present) to convert */\n  /*    from user to normalized coordinates.                               */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The font face.                                       */\n  /*                  Initialize the blend struct with `gvar' data.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    num_coords :: This must be the axis count of the font.             */\n  /*                                                                       */\n  /*    coords     :: A coordinate array with `num_coords' elements.       */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Set_Var_Design( TT_Face    face,\n                     FT_UInt    num_coords,\n                     FT_Fixed*  coords )\n  {\n    FT_Error        error      = FT_Err_Ok;\n    FT_Fixed*       normalized = NULL;\n    GX_Blend        blend;\n    FT_MM_Var*      mmvar;\n    FT_UInt         i, j;\n    FT_Var_Axis*    a;\n    GX_AVarSegment  av;\n    FT_Memory       memory = face->root.memory;\n\n\n    if ( face->blend == NULL )\n    {\n      if ( (error = TT_Get_MM_Var( face, NULL )) != 0 )\n        goto Exit;\n    }\n\n    blend = face->blend;\n    mmvar = blend->mmvar;\n\n    if ( num_coords != mmvar->num_axis )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* Axis normalization is a two stage process.  First we normalize */\n    /* based on the [min,def,max] values for the axis to be [-1,0,1]. */\n    /* Then, if there's an `avar' table, we renormalize this range.   */\n\n    if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )\n      goto Exit;\n\n    a = mmvar->axis;\n    for ( i = 0; i < mmvar->num_axis; ++i, ++a )\n    {\n      if ( coords[i] > a->maximum || coords[i] < a->minimum )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Exit;\n      }\n\n      if ( coords[i] < a->def )\n        normalized[i] = -FT_DivFix( coords[i] - a->def, a->minimum - a->def );\n      else if ( a->maximum == a->def )\n        normalized[i] = 0;\n      else\n        normalized[i] = FT_DivFix( coords[i] - a->def, a->maximum - a->def );\n    }\n\n    if ( !blend->avar_checked )\n      ft_var_load_avar( face );\n\n    if ( blend->avar_segment != NULL )\n    {\n      av = blend->avar_segment;\n      for ( i = 0; i < mmvar->num_axis; ++i, ++av )\n      {\n        for ( j = 1; j < (FT_UInt)av->pairCount; ++j )\n          if ( normalized[i] < av->correspondence[j].fromCoord )\n          {\n            normalized[i] =\n              FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,\n                         av->correspondence[j].toCoord -\n                           av->correspondence[j - 1].toCoord,\n                         av->correspondence[j].fromCoord -\n                           av->correspondence[j - 1].fromCoord ) +\n              av->correspondence[j - 1].toCoord;\n            break;\n          }\n      }\n    }\n\n    error = TT_Set_MM_Blend( face, num_coords, normalized );\n\n  Exit:\n    FT_FREE( normalized );\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                     GX VAR PARSING ROUTINES                   *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_vary_cvt                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Modify the loaded cvt table according to the `cvar' table and the  */\n  /*    font's blend.                                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /*    Most errors are ignored.  It is perfectly valid not to have a      */\n  /*    `cvar' table even if there is a `gvar' and `fvar' table.           */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_vary_cvt( TT_Face    face,\n                    FT_Stream  stream )\n  {\n    FT_Error    error;\n    FT_Memory   memory = stream->memory;\n    FT_ULong    table_start;\n    FT_ULong    table_len;\n    FT_UInt     tupleCount;\n    FT_ULong    offsetToData;\n    FT_ULong    here;\n    FT_UInt     i, j;\n    FT_Fixed*   tuple_coords    = NULL;\n    FT_Fixed*   im_start_coords = NULL;\n    FT_Fixed*   im_end_coords   = NULL;\n    GX_Blend    blend           = face->blend;\n    FT_UInt     point_count;\n    FT_UShort*  localpoints;\n    FT_Short*   deltas;\n\n\n    FT_TRACE2(( \"CVAR \" ));\n\n    if ( blend == NULL )\n    {\n      FT_TRACE2(( \"tt_face_vary_cvt: no blend specified\\n\" ));\n\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    if ( face->cvt == NULL )\n    {\n      FT_TRACE2(( \"tt_face_vary_cvt: no `cvt ' table\\n\" ));\n\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    error = face->goto_table( face, TTAG_cvar, stream, &table_len );\n    if ( error )\n    {\n      FT_TRACE2(( \"is missing\\n\" ));\n\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    if ( FT_FRAME_ENTER( table_len ) )\n    {\n      error = FT_Err_Ok;\n      goto Exit;\n    }\n\n    table_start = FT_Stream_FTell( stream );\n    if ( FT_GET_LONG() != 0x00010000L )\n    {\n      FT_TRACE2(( \"bad table version\\n\" ));\n\n      error = FT_Err_Ok;\n      goto FExit;\n    }\n\n    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||\n         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||\n         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )\n      goto FExit;\n\n    tupleCount   = FT_GET_USHORT();\n    offsetToData = table_start + FT_GET_USHORT();\n\n    /* The documentation implies there are flags packed into the        */\n    /* tuplecount, but John Jenkins says that shared points don't apply */\n    /* to `cvar', and no other flags are defined.                       */\n\n    for ( i = 0; i < ( tupleCount & 0xFFF ); ++i )\n    {\n      FT_UInt   tupleDataSize;\n      FT_UInt   tupleIndex;\n      FT_Fixed  apply;\n\n\n      tupleDataSize = FT_GET_USHORT();\n      tupleIndex    = FT_GET_USHORT();\n\n      /* There is no provision here for a global tuple coordinate section, */\n      /* so John says.  There are no tuple indices, just embedded tuples.  */\n\n      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )\n      {\n        for ( j = 0; j < blend->num_axis; ++j )\n          tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from        */\n                                                 /* short frac to fixed */\n      }\n      else\n      {\n        /* skip this tuple; it makes no sense */\n\n        if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )\n          for ( j = 0; j < 2 * blend->num_axis; ++j )\n            (void)FT_GET_SHORT();\n\n        offsetToData += tupleDataSize;\n        continue;\n      }\n\n      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )\n      {\n        for ( j = 0; j < blend->num_axis; ++j )\n          im_start_coords[j] = FT_GET_SHORT() << 2;\n        for ( j = 0; j < blend->num_axis; ++j )\n          im_end_coords[j] = FT_GET_SHORT() << 2;\n      }\n\n      apply = ft_var_apply_tuple( blend,\n                                  (FT_UShort)tupleIndex,\n                                  tuple_coords,\n                                  im_start_coords,\n                                  im_end_coords );\n      if ( /* tuple isn't active for our blend */\n           apply == 0                                    ||\n           /* global points not allowed,           */\n           /* if they aren't local, makes no sense */\n           !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) )\n      {\n        offsetToData += tupleDataSize;\n        continue;\n      }\n\n      here = FT_Stream_FTell( stream );\n\n      FT_Stream_SeekSet( stream, offsetToData );\n\n      localpoints = ft_var_readpackedpoints( stream, &point_count );\n      deltas      = ft_var_readpackeddeltas( stream,\n                                             point_count == 0 ? face->cvt_size\n                                                              : point_count );\n      if ( localpoints == NULL || deltas == NULL )\n        /* failure, ignore it */;\n\n      else if ( localpoints == ALL_POINTS )\n      {\n        /* this means that there are deltas for every entry in cvt */\n        for ( j = 0; j < face->cvt_size; ++j )\n          face->cvt[j] = (FT_Short)( face->cvt[j] +\n                                     FT_MulFix( deltas[j], apply ) );\n      }\n\n      else\n      {\n        for ( j = 0; j < point_count; ++j )\n        {\n          int  pindex = localpoints[j];\n\n          face->cvt[pindex] = (FT_Short)( face->cvt[pindex] +\n                                          FT_MulFix( deltas[j], apply ) );\n        }\n      }\n\n      if ( localpoints != ALL_POINTS )\n        FT_FREE( localpoints );\n      FT_FREE( deltas );\n\n      offsetToData += tupleDataSize;\n\n      FT_Stream_SeekSet( stream, here );\n    }\n\n  FExit:\n    FT_FRAME_EXIT();\n\n  Exit:\n    FT_FREE( tuple_coords );\n    FT_FREE( im_start_coords );\n    FT_FREE( im_end_coords );\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Vary_Get_Glyph_Deltas                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the appropriate deltas for the current glyph.                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the target face object.                 */\n  /*                                                                       */\n  /*    glyph_index :: The index of the glyph being modified.              */\n  /*                                                                       */\n  /*    n_points    :: The number of the points in the glyph, including    */\n  /*                   phantom points.                                     */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    deltas      :: The array of points to change.                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Vary_Get_Glyph_Deltas( TT_Face      face,\n                            FT_UInt      glyph_index,\n                            FT_Vector*  *deltas,\n                            FT_UInt      n_points )\n  {\n    FT_Stream   stream = face->root.stream;\n    FT_Memory   memory = stream->memory;\n    GX_Blend    blend  = face->blend;\n    FT_Vector*  delta_xy = NULL;\n\n    FT_Error    error;\n    FT_ULong    glyph_start;\n    FT_UInt     tupleCount;\n    FT_ULong    offsetToData;\n    FT_ULong    here;\n    FT_UInt     i, j;\n    FT_Fixed*   tuple_coords    = NULL;\n    FT_Fixed*   im_start_coords = NULL;\n    FT_Fixed*   im_end_coords   = NULL;\n    FT_UInt     point_count, spoint_count = 0;\n    FT_UShort*  sharedpoints = NULL;\n    FT_UShort*  localpoints  = NULL;\n    FT_UShort*  points;\n    FT_Short    *deltas_x, *deltas_y;\n\n\n    if ( !face->doblend || blend == NULL )\n      return FT_THROW( Invalid_Argument );\n\n    /* to be freed by the caller */\n    if ( FT_NEW_ARRAY( delta_xy, n_points ) )\n      goto Exit;\n    *deltas = delta_xy;\n\n    if ( glyph_index >= blend->gv_glyphcnt      ||\n         blend->glyphoffsets[glyph_index] ==\n           blend->glyphoffsets[glyph_index + 1] )\n      return FT_Err_Ok;               /* no variation data for this glyph */\n\n    if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] )   ||\n         FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] -\n                           blend->glyphoffsets[glyph_index] ) )\n      goto Fail1;\n\n    glyph_start = FT_Stream_FTell( stream );\n\n    /* each set of glyph variation data is formatted similarly to `cvar' */\n    /* (except we get shared points and global tuples)                   */\n\n    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||\n         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||\n         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )\n      goto Fail2;\n\n    tupleCount   = FT_GET_USHORT();\n    offsetToData = glyph_start + FT_GET_USHORT();\n\n    if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )\n    {\n      here = FT_Stream_FTell( stream );\n\n      FT_Stream_SeekSet( stream, offsetToData );\n\n      sharedpoints = ft_var_readpackedpoints( stream, &spoint_count );\n      offsetToData = FT_Stream_FTell( stream );\n\n      FT_Stream_SeekSet( stream, here );\n    }\n\n    for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i )\n    {\n      FT_UInt   tupleDataSize;\n      FT_UInt   tupleIndex;\n      FT_Fixed  apply;\n\n\n      tupleDataSize = FT_GET_USHORT();\n      tupleIndex    = FT_GET_USHORT();\n\n      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )\n      {\n        for ( j = 0; j < blend->num_axis; ++j )\n          tuple_coords[j] = FT_GET_SHORT() << 2;  /* convert from        */\n                                                  /* short frac to fixed */\n      }\n      else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )\n      {\n        error = FT_THROW( Invalid_Table );\n        goto Fail3;\n      }\n      else\n      {\n        FT_MEM_COPY(\n          tuple_coords,\n          &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis],\n          blend->num_axis * sizeof ( FT_Fixed ) );\n      }\n\n      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )\n      {\n        for ( j = 0; j < blend->num_axis; ++j )\n          im_start_coords[j] = FT_GET_SHORT() << 2;\n        for ( j = 0; j < blend->num_axis; ++j )\n          im_end_coords[j] = FT_GET_SHORT() << 2;\n      }\n\n      apply = ft_var_apply_tuple( blend,\n                                  (FT_UShort)tupleIndex,\n                                  tuple_coords,\n                                  im_start_coords,\n                                  im_end_coords );\n\n      if ( apply == 0 )              /* tuple isn't active for our blend */\n      {\n        offsetToData += tupleDataSize;\n        continue;\n      }\n\n      here = FT_Stream_FTell( stream );\n\n      if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )\n      {\n        FT_Stream_SeekSet( stream, offsetToData );\n\n        localpoints = ft_var_readpackedpoints( stream, &point_count );\n        points      = localpoints;\n      }\n      else\n      {\n        points      = sharedpoints;\n        point_count = spoint_count;\n      }\n\n      deltas_x = ft_var_readpackeddeltas( stream,\n                                          point_count == 0 ? n_points\n                                                           : point_count );\n      deltas_y = ft_var_readpackeddeltas( stream,\n                                          point_count == 0 ? n_points\n                                                           : point_count );\n\n      if ( points == NULL || deltas_y == NULL || deltas_x == NULL )\n        ; /* failure, ignore it */\n\n      else if ( points == ALL_POINTS )\n      {\n        /* this means that there are deltas for every point in the glyph */\n        for ( j = 0; j < n_points; ++j )\n        {\n          delta_xy[j].x += FT_MulFix( deltas_x[j], apply );\n          delta_xy[j].y += FT_MulFix( deltas_y[j], apply );\n        }\n      }\n\n      else\n      {\n        for ( j = 0; j < point_count; ++j )\n        {\n          if ( localpoints[j] >= n_points )\n            continue;\n\n          delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply );\n          delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply );\n        }\n      }\n\n      if ( localpoints != ALL_POINTS )\n        FT_FREE( localpoints );\n      FT_FREE( deltas_x );\n      FT_FREE( deltas_y );\n\n      offsetToData += tupleDataSize;\n\n      FT_Stream_SeekSet( stream, here );\n    }\n\n  Fail3:\n    FT_FREE( tuple_coords );\n    FT_FREE( im_start_coords );\n    FT_FREE( im_end_coords );\n\n  Fail2:\n    FT_FRAME_EXIT();\n\n  Fail1:\n    if ( error )\n    {\n      FT_FREE( delta_xy );\n      *deltas = NULL;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_done_blend                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Frees the blend internal data structure.                           */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_done_blend( FT_Memory  memory,\n                 GX_Blend   blend )\n  {\n    if ( blend != NULL )\n    {\n      FT_UInt  i;\n\n\n      FT_FREE( blend->normalizedcoords );\n      FT_FREE( blend->mmvar );\n\n      if ( blend->avar_segment != NULL )\n      {\n        for ( i = 0; i < blend->num_axis; ++i )\n          FT_FREE( blend->avar_segment[i].correspondence );\n        FT_FREE( blend->avar_segment );\n      }\n\n      FT_FREE( blend->tuplecoords );\n      FT_FREE( blend->glyphoffsets );\n      FT_FREE( blend );\n    }\n  }\n\n#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttgxvar.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttgxvar.h                                                              */\n/*                                                                         */\n/*    TrueType GX Font Variation loader (specification)                    */\n/*                                                                         */\n/*  Copyright 2004 by                                                      */\n/*  David Turner, Robert Wilhelm, Werner Lemberg and George Williams.      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTGXVAR_H__\n#define __TTGXVAR_H__\n\n\n#include <ft2build.h>\n#include \"ttobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    GX_AVarCorrespondenceRec                                           */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A data structure representing `shortFracCorrespondence' in `avar'  */\n  /*    table according to the specifications from Apple.                  */\n  /*                                                                       */\n  typedef struct  GX_AVarCorrespondenceRec_\n  {\n    FT_Fixed  fromCoord;\n    FT_Fixed  toCoord;\n\n  } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    GX_AVarRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Data from the segment field of `avar' table.                       */\n  /*    There is one of these for each axis.                               */\n  /*                                                                       */\n  typedef struct  GX_AVarSegmentRec_\n  {\n    FT_UShort              pairCount;\n    GX_AVarCorrespondence  correspondence; /* array with pairCount entries */\n\n  } GX_AVarSegmentRec, *GX_AVarSegment;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    GX_BlendRec                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Data for interpolating a font from a distortable font specified    */\n  /*    by the GX *var tables ([fgca]var).                                 */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    num_axis         :: The number of axes along which interpolation   */\n  /*                         may happen                                    */\n  /*                                                                       */\n  /*    normalizedcoords :: A normalized value (between [-1,1]) indicating */\n  /*                        the contribution along each axis to the final  */\n  /*                        interpolated font.                             */\n  /*                                                                       */\n  typedef struct  GX_BlendRec_\n  {\n    FT_UInt         num_axis;\n    FT_Fixed*       normalizedcoords;\n\n    FT_MM_Var*      mmvar;\n    FT_Offset       mmvar_len;\n\n    FT_Bool         avar_checked;\n    GX_AVarSegment  avar_segment;\n\n    FT_UInt         tuplecount;      /* shared tuples in `gvar'           */\n    FT_Fixed*       tuplecoords;     /* tuplecoords[tuplecount][num_axis] */\n\n    FT_UInt         gv_glyphcnt;\n    FT_ULong*       glyphoffsets;\n\n  } GX_BlendRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <enum>                                                                */\n  /*    GX_TupleCountFlags                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Flags used within the `TupleCount' field of the `gvar' table.      */\n  /*                                                                       */\n  typedef enum  GX_TupleCountFlags_\n  {\n    GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,\n    GX_TC_RESERVED_TUPLE_FLAGS       = 0x7000,\n    GX_TC_TUPLE_COUNT_MASK           = 0x0FFF\n\n  } GX_TupleCountFlags;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <enum>                                                                */\n  /*    GX_TupleIndexFlags                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Flags used within the `TupleIndex' field of the `gvar' and `cvar'  */\n  /*    tables.                                                            */\n  /*                                                                       */\n  typedef enum  GX_TupleIndexFlags_\n  {\n    GX_TI_EMBEDDED_TUPLE_COORD  = 0x8000,\n    GX_TI_INTERMEDIATE_TUPLE    = 0x4000,\n    GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,\n    GX_TI_RESERVED_TUPLE_FLAG   = 0x1000,\n    GX_TI_TUPLE_INDEX_MASK      = 0x0FFF\n\n  } GX_TupleIndexFlags;\n\n\n#define TTAG_wght  FT_MAKE_TAG( 'w', 'g', 'h', 't' )\n#define TTAG_wdth  FT_MAKE_TAG( 'w', 'd', 't', 'h' )\n#define TTAG_opsz  FT_MAKE_TAG( 'o', 'p', 's', 'z' )\n#define TTAG_slnt  FT_MAKE_TAG( 's', 'l', 'n', 't' )\n\n\n  FT_LOCAL( FT_Error )\n  TT_Set_MM_Blend( TT_Face    face,\n                   FT_UInt    num_coords,\n                   FT_Fixed*  coords );\n\n  FT_LOCAL( FT_Error )\n  TT_Set_Var_Design( TT_Face    face,\n                     FT_UInt    num_coords,\n                     FT_Fixed*  coords );\n\n  FT_LOCAL( FT_Error )\n  TT_Get_MM_Var( TT_Face      face,\n                 FT_MM_Var*  *master );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_vary_cvt( TT_Face    face,\n                    FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  TT_Vary_Get_Glyph_Deltas( TT_Face      face,\n                            FT_UInt      glyph_index,\n                            FT_Vector*  *deltas,\n                            FT_UInt      n_points );\n\n\n  FT_LOCAL( void )\n  tt_done_blend( FT_Memory  memory,\n                 GX_Blend   blend );\n\n\nFT_END_HEADER\n\n\n#endif /* __TTGXVAR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttinterp.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttinterp.c                                                             */\n/*                                                                         */\n/*    TrueType bytecode interpreter (body).                                */\n/*                                                                         */\n/*  Copyright 1996-2013                                                    */\n/*  by David Turner, Robert Wilhelm, and Werner Lemberg.                   */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */\n/* issues; many thanks!                                                */\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_CALC_H\n#include FT_TRIGONOMETRY_H\n#include FT_SYSTEM_H\n\n#include \"ttinterp.h\"\n#include \"tterrors.h\"\n#include \"ttsubpix.h\"\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttinterp\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* In order to detect infinite loops in the code, we set up a counter    */\n  /* within the run loop.  A single stroke of interpretation is now        */\n  /* limited to a maximum number of opcodes defined below.                 */\n  /*                                                                       */\n#define MAX_RUNNABLE_OPCODES  1000000L\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* There are two kinds of implementations:                               */\n  /*                                                                       */\n  /* a. static implementation                                              */\n  /*                                                                       */\n  /*    The current execution context is a static variable, which fields   */\n  /*    are accessed directly by the interpreter during execution.  The    */\n  /*    context is named `cur'.                                            */\n  /*                                                                       */\n  /*    This version is non-reentrant, of course.                          */\n  /*                                                                       */\n  /* b. indirect implementation                                            */\n  /*                                                                       */\n  /*    The current execution context is passed to _each_ function as its  */\n  /*    first argument, and each field is thus accessed indirectly.        */\n  /*                                                                       */\n  /*    This version is fully re-entrant.                                  */\n  /*                                                                       */\n  /* The idea is that an indirect implementation may be slower to execute  */\n  /* on low-end processors that are used in some systems (like 386s or     */\n  /* even 486s).                                                           */\n  /*                                                                       */\n  /* As a consequence, the indirect implementation is now the default, as  */\n  /* its performance costs can be considered negligible in our context.    */\n  /* Note, however, that we kept the same source with macros because:      */\n  /*                                                                       */\n  /* - The code is kept very close in design to the Pascal code used for   */\n  /*   development.                                                        */\n  /*                                                                       */\n  /* - It's much more readable that way!                                   */\n  /*                                                                       */\n  /* - It's still open to experimentation and tuning.                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER     /* indirect implementation */\n\n#define CUR  (*exc)                             /* see ttobjs.h */\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This macro is used whenever `exec' is unused in a function, to avoid  */\n  /* stupid warnings from pedantic compilers.                              */\n  /*                                                                       */\n#define FT_UNUSED_EXEC  FT_UNUSED( exc )\n\n#else                                           /* static implementation */\n\n#define CUR  cur\n\n#define FT_UNUSED_EXEC  int  __dummy = __dummy\n\n  static\n  TT_ExecContextRec  cur;   /* static exec. context variable */\n\n  /* apparently, we have a _lot_ of direct indexing when accessing  */\n  /* the static `cur', which makes the code bigger (due to all the  */\n  /* four bytes addresses).                                         */\n\n#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The instruction argument stack.                                       */\n  /*                                                                       */\n#define INS_ARG  EXEC_OP_ FT_Long*  args    /* see ttobjs.h for EXEC_OP_ */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This macro is used whenever `args' is unused in a function, to avoid  */\n  /* stupid warnings from pedantic compilers.                              */\n  /*                                                                       */\n#define FT_UNUSED_ARG  FT_UNUSED_EXEC; FT_UNUSED( args )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to        */\n  /* increase readability of the code.                                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define SKIP_Code() \\\n          SkipCode( EXEC_ARG )\n\n#define GET_ShortIns() \\\n          GetShortIns( EXEC_ARG )\n\n#define NORMalize( x, y, v ) \\\n          Normalize( EXEC_ARG_ x, y, v )\n\n#define SET_SuperRound( scale, flags ) \\\n          SetSuperRound( EXEC_ARG_ scale, flags )\n\n#define ROUND_None( d, c ) \\\n          Round_None( EXEC_ARG_ d, c )\n\n#define INS_Goto_CodeRange( range, ip ) \\\n          Ins_Goto_CodeRange( EXEC_ARG_ range, ip )\n\n#define CUR_Func_move( z, p, d ) \\\n          CUR.func_move( EXEC_ARG_ z, p, d )\n\n#define CUR_Func_move_orig( z, p, d ) \\\n          CUR.func_move_orig( EXEC_ARG_ z, p, d )\n\n#define CUR_Func_round( d, c ) \\\n          CUR.func_round( EXEC_ARG_ d, c )\n\n#define CUR_Func_read_cvt( index ) \\\n          CUR.func_read_cvt( EXEC_ARG_ index )\n\n#define CUR_Func_write_cvt( index, val ) \\\n          CUR.func_write_cvt( EXEC_ARG_ index, val )\n\n#define CUR_Func_move_cvt( index, val ) \\\n          CUR.func_move_cvt( EXEC_ARG_ index, val )\n\n#define CURRENT_Ratio() \\\n          Current_Ratio( EXEC_ARG )\n\n#define CURRENT_Ppem() \\\n          Current_Ppem( EXEC_ARG )\n\n#define CUR_Ppem() \\\n          Cur_PPEM( EXEC_ARG )\n\n#define INS_SxVTL( a, b, c, d ) \\\n          Ins_SxVTL( EXEC_ARG_ a, b, c, d )\n\n#define COMPUTE_Funcs() \\\n          Compute_Funcs( EXEC_ARG )\n\n#define COMPUTE_Round( a ) \\\n          Compute_Round( EXEC_ARG_ a )\n\n#define COMPUTE_Point_Displacement( a, b, c, d ) \\\n          Compute_Point_Displacement( EXEC_ARG_ a, b, c, d )\n\n#define MOVE_Zp2_Point( a, b, c, t ) \\\n          Move_Zp2_Point( EXEC_ARG_ a, b, c, t )\n\n\n#define CUR_Func_project( v1, v2 )  \\\n          CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )\n\n#define CUR_Func_dualproj( v1, v2 )  \\\n          CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )\n\n#define CUR_fast_project( v ) \\\n          CUR.func_project( EXEC_ARG_ (v)->x, (v)->y )\n\n#define CUR_fast_dualproj( v ) \\\n          CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y )\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Instruction dispatch function, as used by the interpreter.            */\n  /*                                                                       */\n  typedef void  (*TInstruction_Function)( INS_ARG );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Two simple bounds-checking macros.                                    */\n  /*                                                                       */\n#define BOUNDS( x, n )   ( (FT_UInt)(x)  >= (FT_UInt)(n)  )\n#define BOUNDSL( x, n )  ( (FT_ULong)(x) >= (FT_ULong)(n) )\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This macro computes (a*2^14)/b and complements TT_MulFix14.           */\n  /*                                                                       */\n#define TT_DivFix14( a, b ) \\\n          FT_DivFix( a, (b) << 2 )\n\n\n#undef  SUCCESS\n#define SUCCESS  0\n\n#undef  FAILURE\n#define FAILURE  1\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n#define GUESS_VECTOR( V )                                         \\\n  if ( CUR.face->unpatented_hinting )                             \\\n  {                                                               \\\n    CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \\\n    CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \\\n  }\n#else\n#define GUESS_VECTOR( V )\n#endif\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                        CODERANGE FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Goto_CodeRange                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Switches to a new code range (updates the code related elements in */\n  /*    `exec', and `IP').                                                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    range :: The new execution code range.                             */\n  /*                                                                       */\n  /*    IP    :: The new IP in the new code range.                         */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec  :: The target execution context.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Goto_CodeRange( TT_ExecContext  exec,\n                     FT_Int          range,\n                     FT_Long         IP )\n  {\n    TT_CodeRange*  coderange;\n\n\n    FT_ASSERT( range >= 1 && range <= 3 );\n\n    coderange = &exec->codeRangeTable[range - 1];\n\n    FT_ASSERT( coderange->base != NULL );\n\n    /* NOTE: Because the last instruction of a program may be a CALL */\n    /*       which will return to the first byte *after* the code    */\n    /*       range, we test for IP <= Size instead of IP < Size.     */\n    /*                                                               */\n    FT_ASSERT( (FT_ULong)IP <= coderange->size );\n\n    exec->code     = coderange->base;\n    exec->codeSize = coderange->size;\n    exec->IP       = IP;\n    exec->curRange = range;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Set_CodeRange                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Sets a code range.                                                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    range  :: The code range index.                                    */\n  /*                                                                       */\n  /*    base   :: The new code base.                                       */\n  /*                                                                       */\n  /*    length :: The range size in bytes.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec   :: The target execution context.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Set_CodeRange( TT_ExecContext  exec,\n                    FT_Int          range,\n                    void*           base,\n                    FT_Long         length )\n  {\n    FT_ASSERT( range >= 1 && range <= 3 );\n\n    exec->codeRangeTable[range - 1].base = (FT_Byte*)base;\n    exec->codeRangeTable[range - 1].size = length;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Clear_CodeRange                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Clears a code range.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    range :: The code range index.                                     */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec  :: The target execution context.                             */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Does not set the Error variable.                                   */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Clear_CodeRange( TT_ExecContext  exec,\n                      FT_Int          range )\n  {\n    FT_ASSERT( range >= 1 && range <= 3 );\n\n    exec->codeRangeTable[range - 1].base = NULL;\n    exec->codeRangeTable[range - 1].size = 0;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                   EXECUTION CONTEXT ROUTINES                          */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Done_Context                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Destroys a given context.                                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    exec   :: A handle to the target execution context.                */\n  /*                                                                       */\n  /*    memory :: A handle to the parent memory object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Done_Context( TT_ExecContext  exec )\n  {\n    FT_Memory  memory = exec->memory;\n\n\n    /* points zone */\n    exec->maxPoints   = 0;\n    exec->maxContours = 0;\n\n    /* free stack */\n    FT_FREE( exec->stack );\n    exec->stackSize = 0;\n\n    /* free call stack */\n    FT_FREE( exec->callStack );\n    exec->callSize = 0;\n    exec->callTop  = 0;\n\n    /* free glyph code range */\n    FT_FREE( exec->glyphIns );\n    exec->glyphSize = 0;\n\n    exec->size = NULL;\n    exec->face = NULL;\n\n    FT_FREE( exec );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Init_Context                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a context object.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory :: A handle to the parent memory object.                    */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec   :: A handle to the target execution context.                */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  static FT_Error\n  Init_Context( TT_ExecContext  exec,\n                FT_Memory       memory )\n  {\n    FT_Error  error;\n\n\n    FT_TRACE1(( \"Init_Context: new object at 0x%08p\\n\", exec ));\n\n    exec->memory   = memory;\n    exec->callSize = 32;\n\n    if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) )\n      goto Fail_Memory;\n\n    /* all values in the context are set to 0 already, but this is */\n    /* here as a remainder                                         */\n    exec->maxPoints   = 0;\n    exec->maxContours = 0;\n\n    exec->stackSize = 0;\n    exec->glyphSize = 0;\n\n    exec->stack     = NULL;\n    exec->glyphIns  = NULL;\n\n    exec->face = NULL;\n    exec->size = NULL;\n\n    return FT_Err_Ok;\n\n  Fail_Memory:\n    FT_ERROR(( \"Init_Context: not enough memory for %p\\n\", exec ));\n    TT_Done_Context( exec );\n\n    return error;\n }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Update_Max                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Checks the size of a buffer and reallocates it if necessary.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory     :: A handle to the parent memory object.                */\n  /*                                                                       */\n  /*    multiplier :: The size in bytes of each element in the buffer.     */\n  /*                                                                       */\n  /*    new_max    :: The new capacity (size) of the buffer.               */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    size       :: The address of the buffer's current size expressed   */\n  /*                  in elements.                                         */\n  /*                                                                       */\n  /*    buff       :: The address of the buffer base pointer.              */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  Update_Max( FT_Memory  memory,\n              FT_ULong*  size,\n              FT_Long    multiplier,\n              void*      _pbuff,\n              FT_ULong   new_max )\n  {\n    FT_Error  error;\n    void**    pbuff = (void**)_pbuff;\n\n\n    if ( *size < new_max )\n    {\n      if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) )\n        return error;\n      *size = new_max;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Load_Context                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Prepare an execution context for glyph hinting.                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /*    size :: A handle to the source size object.                        */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    exec :: A handle to the target execution context.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Load_Context( TT_ExecContext  exec,\n                   TT_Face         face,\n                   TT_Size         size )\n  {\n    FT_Int          i;\n    FT_ULong        tmp;\n    TT_MaxProfile*  maxp;\n    FT_Error        error;\n\n\n    exec->face = face;\n    maxp       = &face->max_profile;\n    exec->size = size;\n\n    if ( size )\n    {\n      exec->numFDefs   = size->num_function_defs;\n      exec->maxFDefs   = size->max_function_defs;\n      exec->numIDefs   = size->num_instruction_defs;\n      exec->maxIDefs   = size->max_instruction_defs;\n      exec->FDefs      = size->function_defs;\n      exec->IDefs      = size->instruction_defs;\n      exec->tt_metrics = size->ttmetrics;\n      exec->metrics    = size->metrics;\n\n      exec->maxFunc    = size->max_func;\n      exec->maxIns     = size->max_ins;\n\n      for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )\n        exec->codeRangeTable[i] = size->codeRangeTable[i];\n\n      /* set graphics state */\n      exec->GS = size->GS;\n\n      exec->cvtSize = size->cvt_size;\n      exec->cvt     = size->cvt;\n\n      exec->storeSize = size->storage_size;\n      exec->storage   = size->storage;\n\n      exec->twilight  = size->twilight;\n\n      /* In case of multi-threading it can happen that the old size object */\n      /* no longer exists, thus we must clear all glyph zone references.   */\n      ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) );\n      exec->zp1 = exec->zp0;\n      exec->zp2 = exec->zp0;\n    }\n\n    /* XXX: We reserve a little more elements on the stack to deal safely */\n    /*      with broken fonts like arialbs, courbs, timesbs, etc.         */\n    tmp = exec->stackSize;\n    error = Update_Max( exec->memory,\n                        &tmp,\n                        sizeof ( FT_F26Dot6 ),\n                        (void*)&exec->stack,\n                        maxp->maxStackElements + 32 );\n    exec->stackSize = (FT_UInt)tmp;\n    if ( error )\n      return error;\n\n    tmp = exec->glyphSize;\n    error = Update_Max( exec->memory,\n                        &tmp,\n                        sizeof ( FT_Byte ),\n                        (void*)&exec->glyphIns,\n                        maxp->maxSizeOfInstructions );\n    exec->glyphSize = (FT_UShort)tmp;\n    if ( error )\n      return error;\n\n    exec->pts.n_points   = 0;\n    exec->pts.n_contours = 0;\n\n    exec->zp1 = exec->pts;\n    exec->zp2 = exec->pts;\n    exec->zp0 = exec->pts;\n\n    exec->instruction_trap = FALSE;\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Save_Context                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Saves the code ranges in a `size' object.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    exec :: A handle to the source execution context.                  */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    size :: A handle to the target size object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Save_Context( TT_ExecContext  exec,\n                   TT_Size         size )\n  {\n    FT_Int  i;\n\n\n    /* XXX: Will probably disappear soon with all the code range */\n    /*      management, which is now rather obsolete.            */\n    /*                                                           */\n    size->num_function_defs    = exec->numFDefs;\n    size->num_instruction_defs = exec->numIDefs;\n\n    size->max_func = exec->maxFunc;\n    size->max_ins  = exec->maxIns;\n\n    for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )\n      size->codeRangeTable[i] = exec->codeRangeTable[i];\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_Run_Context                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Executes one or more instructions in the execution context.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    debug :: A Boolean flag.  If set, the function sets some internal  */\n  /*             variables and returns immediately, otherwise TT_RunIns()  */\n  /*             is called.                                                */\n  /*                                                                       */\n  /*             This is commented out currently.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    exec  :: A handle to the target execution context.                 */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    TrueType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  TT_Run_Context( TT_ExecContext  exec,\n                  FT_Bool         debug )\n  {\n    FT_Error  error;\n\n\n    if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) )\n           != FT_Err_Ok )\n      return error;\n\n    exec->zp0 = exec->pts;\n    exec->zp1 = exec->pts;\n    exec->zp2 = exec->pts;\n\n    exec->GS.gep0 = 1;\n    exec->GS.gep1 = 1;\n    exec->GS.gep2 = 1;\n\n    exec->GS.projVector.x = 0x4000;\n    exec->GS.projVector.y = 0x0000;\n\n    exec->GS.freeVector = exec->GS.projVector;\n    exec->GS.dualVector = exec->GS.projVector;\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    exec->GS.both_x_axis = TRUE;\n#endif\n\n    exec->GS.round_state = 1;\n    exec->GS.loop        = 1;\n\n    /* some glyphs leave something on the stack. so we clean it */\n    /* before a new execution.                                  */\n    exec->top     = 0;\n    exec->callTop = 0;\n\n#if 1\n    FT_UNUSED( debug );\n\n    return exec->face->interpreter( exec );\n#else\n    if ( !debug )\n      return TT_RunIns( exec );\n    else\n      return FT_Err_Ok;\n#endif\n  }\n\n\n  /* The default value for `scan_control' is documented as FALSE in the */\n  /* TrueType specification.  This is confusing since it implies a      */\n  /* Boolean value.  However, this is not the case, thus both the       */\n  /* default values of our `scan_type' and `scan_control' fields (which */\n  /* the documentation's `scan_control' variable is split into) are     */\n  /* zero.                                                              */\n\n  const TT_GraphicsState  tt_default_graphics_state =\n  {\n    0, 0, 0,\n    { 0x4000, 0 },\n    { 0x4000, 0 },\n    { 0x4000, 0 },\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    TRUE,\n#endif\n\n    1, 64, 1,\n    TRUE, 68, 0, 0, 9, 3,\n    0, FALSE, 0, 1, 1, 1\n  };\n\n\n  /* documentation is in ttinterp.h */\n\n  FT_EXPORT_DEF( TT_ExecContext )\n  TT_New_Context( TT_Driver  driver )\n  {\n    TT_ExecContext  exec;\n    FT_Memory       memory;\n\n\n    memory = driver->root.root.memory;\n    exec   = driver->context;\n\n    if ( !driver->context )\n    {\n      FT_Error  error;\n\n\n      /* allocate object */\n      if ( FT_NEW( exec ) )\n        goto Fail;\n\n      /* initialize it; in case of error this deallocates `exec' too */\n      error = Init_Context( exec, memory );\n      if ( error )\n        goto Fail;\n\n      /* store it into the driver */\n      driver->context = exec;\n    }\n\n    return driver->context;\n\n  Fail:\n    return NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Before an opcode is executed, the interpreter verifies that there are */\n  /* enough arguments on the stack, with the help of the `Pop_Push_Count'  */\n  /* table.                                                                */\n  /*                                                                       */\n  /* For each opcode, the first column gives the number of arguments that  */\n  /* are popped from the stack; the second one gives the number of those   */\n  /* that are pushed in result.                                            */\n  /*                                                                       */\n  /* Opcodes which have a varying number of parameters in the data stream  */\n  /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */\n  /* the `opcode_length' table, and the value in `Pop_Push_Count' is set   */\n  /* to zero.                                                              */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#undef  PACK\n#define PACK( x, y )  ( ( x << 4 ) | y )\n\n\n  static\n  const FT_Byte  Pop_Push_Count[256] =\n  {\n    /* opcodes are gathered in groups of 16 */\n    /* please keep the spaces as they are   */\n\n    /*  SVTCA  y  */  PACK( 0, 0 ),\n    /*  SVTCA  x  */  PACK( 0, 0 ),\n    /*  SPvTCA y  */  PACK( 0, 0 ),\n    /*  SPvTCA x  */  PACK( 0, 0 ),\n    /*  SFvTCA y  */  PACK( 0, 0 ),\n    /*  SFvTCA x  */  PACK( 0, 0 ),\n    /*  SPvTL //  */  PACK( 2, 0 ),\n    /*  SPvTL +   */  PACK( 2, 0 ),\n    /*  SFvTL //  */  PACK( 2, 0 ),\n    /*  SFvTL +   */  PACK( 2, 0 ),\n    /*  SPvFS     */  PACK( 2, 0 ),\n    /*  SFvFS     */  PACK( 2, 0 ),\n    /*  GPV       */  PACK( 0, 2 ),\n    /*  GFV       */  PACK( 0, 2 ),\n    /*  SFvTPv    */  PACK( 0, 0 ),\n    /*  ISECT     */  PACK( 5, 0 ),\n\n    /*  SRP0      */  PACK( 1, 0 ),\n    /*  SRP1      */  PACK( 1, 0 ),\n    /*  SRP2      */  PACK( 1, 0 ),\n    /*  SZP0      */  PACK( 1, 0 ),\n    /*  SZP1      */  PACK( 1, 0 ),\n    /*  SZP2      */  PACK( 1, 0 ),\n    /*  SZPS      */  PACK( 1, 0 ),\n    /*  SLOOP     */  PACK( 1, 0 ),\n    /*  RTG       */  PACK( 0, 0 ),\n    /*  RTHG      */  PACK( 0, 0 ),\n    /*  SMD       */  PACK( 1, 0 ),\n    /*  ELSE      */  PACK( 0, 0 ),\n    /*  JMPR      */  PACK( 1, 0 ),\n    /*  SCvTCi    */  PACK( 1, 0 ),\n    /*  SSwCi     */  PACK( 1, 0 ),\n    /*  SSW       */  PACK( 1, 0 ),\n\n    /*  DUP       */  PACK( 1, 2 ),\n    /*  POP       */  PACK( 1, 0 ),\n    /*  CLEAR     */  PACK( 0, 0 ),\n    /*  SWAP      */  PACK( 2, 2 ),\n    /*  DEPTH     */  PACK( 0, 1 ),\n    /*  CINDEX    */  PACK( 1, 1 ),\n    /*  MINDEX    */  PACK( 1, 0 ),\n    /*  AlignPTS  */  PACK( 2, 0 ),\n    /*  INS_$28   */  PACK( 0, 0 ),\n    /*  UTP       */  PACK( 1, 0 ),\n    /*  LOOPCALL  */  PACK( 2, 0 ),\n    /*  CALL      */  PACK( 1, 0 ),\n    /*  FDEF      */  PACK( 1, 0 ),\n    /*  ENDF      */  PACK( 0, 0 ),\n    /*  MDAP[0]   */  PACK( 1, 0 ),\n    /*  MDAP[1]   */  PACK( 1, 0 ),\n\n    /*  IUP[0]    */  PACK( 0, 0 ),\n    /*  IUP[1]    */  PACK( 0, 0 ),\n    /*  SHP[0]    */  PACK( 0, 0 ),\n    /*  SHP[1]    */  PACK( 0, 0 ),\n    /*  SHC[0]    */  PACK( 1, 0 ),\n    /*  SHC[1]    */  PACK( 1, 0 ),\n    /*  SHZ[0]    */  PACK( 1, 0 ),\n    /*  SHZ[1]    */  PACK( 1, 0 ),\n    /*  SHPIX     */  PACK( 1, 0 ),\n    /*  IP        */  PACK( 0, 0 ),\n    /*  MSIRP[0]  */  PACK( 2, 0 ),\n    /*  MSIRP[1]  */  PACK( 2, 0 ),\n    /*  AlignRP   */  PACK( 0, 0 ),\n    /*  RTDG      */  PACK( 0, 0 ),\n    /*  MIAP[0]   */  PACK( 2, 0 ),\n    /*  MIAP[1]   */  PACK( 2, 0 ),\n\n    /*  NPushB    */  PACK( 0, 0 ),\n    /*  NPushW    */  PACK( 0, 0 ),\n    /*  WS        */  PACK( 2, 0 ),\n    /*  RS        */  PACK( 1, 1 ),\n    /*  WCvtP     */  PACK( 2, 0 ),\n    /*  RCvt      */  PACK( 1, 1 ),\n    /*  GC[0]     */  PACK( 1, 1 ),\n    /*  GC[1]     */  PACK( 1, 1 ),\n    /*  SCFS      */  PACK( 2, 0 ),\n    /*  MD[0]     */  PACK( 2, 1 ),\n    /*  MD[1]     */  PACK( 2, 1 ),\n    /*  MPPEM     */  PACK( 0, 1 ),\n    /*  MPS       */  PACK( 0, 1 ),\n    /*  FlipON    */  PACK( 0, 0 ),\n    /*  FlipOFF   */  PACK( 0, 0 ),\n    /*  DEBUG     */  PACK( 1, 0 ),\n\n    /*  LT        */  PACK( 2, 1 ),\n    /*  LTEQ      */  PACK( 2, 1 ),\n    /*  GT        */  PACK( 2, 1 ),\n    /*  GTEQ      */  PACK( 2, 1 ),\n    /*  EQ        */  PACK( 2, 1 ),\n    /*  NEQ       */  PACK( 2, 1 ),\n    /*  ODD       */  PACK( 1, 1 ),\n    /*  EVEN      */  PACK( 1, 1 ),\n    /*  IF        */  PACK( 1, 0 ),\n    /*  EIF       */  PACK( 0, 0 ),\n    /*  AND       */  PACK( 2, 1 ),\n    /*  OR        */  PACK( 2, 1 ),\n    /*  NOT       */  PACK( 1, 1 ),\n    /*  DeltaP1   */  PACK( 1, 0 ),\n    /*  SDB       */  PACK( 1, 0 ),\n    /*  SDS       */  PACK( 1, 0 ),\n\n    /*  ADD       */  PACK( 2, 1 ),\n    /*  SUB       */  PACK( 2, 1 ),\n    /*  DIV       */  PACK( 2, 1 ),\n    /*  MUL       */  PACK( 2, 1 ),\n    /*  ABS       */  PACK( 1, 1 ),\n    /*  NEG       */  PACK( 1, 1 ),\n    /*  FLOOR     */  PACK( 1, 1 ),\n    /*  CEILING   */  PACK( 1, 1 ),\n    /*  ROUND[0]  */  PACK( 1, 1 ),\n    /*  ROUND[1]  */  PACK( 1, 1 ),\n    /*  ROUND[2]  */  PACK( 1, 1 ),\n    /*  ROUND[3]  */  PACK( 1, 1 ),\n    /*  NROUND[0] */  PACK( 1, 1 ),\n    /*  NROUND[1] */  PACK( 1, 1 ),\n    /*  NROUND[2] */  PACK( 1, 1 ),\n    /*  NROUND[3] */  PACK( 1, 1 ),\n\n    /*  WCvtF     */  PACK( 2, 0 ),\n    /*  DeltaP2   */  PACK( 1, 0 ),\n    /*  DeltaP3   */  PACK( 1, 0 ),\n    /*  DeltaCn[0] */ PACK( 1, 0 ),\n    /*  DeltaCn[1] */ PACK( 1, 0 ),\n    /*  DeltaCn[2] */ PACK( 1, 0 ),\n    /*  SROUND    */  PACK( 1, 0 ),\n    /*  S45Round  */  PACK( 1, 0 ),\n    /*  JROT      */  PACK( 2, 0 ),\n    /*  JROF      */  PACK( 2, 0 ),\n    /*  ROFF      */  PACK( 0, 0 ),\n    /*  INS_$7B   */  PACK( 0, 0 ),\n    /*  RUTG      */  PACK( 0, 0 ),\n    /*  RDTG      */  PACK( 0, 0 ),\n    /*  SANGW     */  PACK( 1, 0 ),\n    /*  AA        */  PACK( 1, 0 ),\n\n    /*  FlipPT    */  PACK( 0, 0 ),\n    /*  FlipRgON  */  PACK( 2, 0 ),\n    /*  FlipRgOFF */  PACK( 2, 0 ),\n    /*  INS_$83   */  PACK( 0, 0 ),\n    /*  INS_$84   */  PACK( 0, 0 ),\n    /*  ScanCTRL  */  PACK( 1, 0 ),\n    /*  SDPVTL[0] */  PACK( 2, 0 ),\n    /*  SDPVTL[1] */  PACK( 2, 0 ),\n    /*  GetINFO   */  PACK( 1, 1 ),\n    /*  IDEF      */  PACK( 1, 0 ),\n    /*  ROLL      */  PACK( 3, 3 ),\n    /*  MAX       */  PACK( 2, 1 ),\n    /*  MIN       */  PACK( 2, 1 ),\n    /*  ScanTYPE  */  PACK( 1, 0 ),\n    /*  InstCTRL  */  PACK( 2, 0 ),\n    /*  INS_$8F   */  PACK( 0, 0 ),\n\n    /*  INS_$90  */   PACK( 0, 0 ),\n    /*  INS_$91  */   PACK( 0, 0 ),\n    /*  INS_$92  */   PACK( 0, 0 ),\n    /*  INS_$93  */   PACK( 0, 0 ),\n    /*  INS_$94  */   PACK( 0, 0 ),\n    /*  INS_$95  */   PACK( 0, 0 ),\n    /*  INS_$96  */   PACK( 0, 0 ),\n    /*  INS_$97  */   PACK( 0, 0 ),\n    /*  INS_$98  */   PACK( 0, 0 ),\n    /*  INS_$99  */   PACK( 0, 0 ),\n    /*  INS_$9A  */   PACK( 0, 0 ),\n    /*  INS_$9B  */   PACK( 0, 0 ),\n    /*  INS_$9C  */   PACK( 0, 0 ),\n    /*  INS_$9D  */   PACK( 0, 0 ),\n    /*  INS_$9E  */   PACK( 0, 0 ),\n    /*  INS_$9F  */   PACK( 0, 0 ),\n\n    /*  INS_$A0  */   PACK( 0, 0 ),\n    /*  INS_$A1  */   PACK( 0, 0 ),\n    /*  INS_$A2  */   PACK( 0, 0 ),\n    /*  INS_$A3  */   PACK( 0, 0 ),\n    /*  INS_$A4  */   PACK( 0, 0 ),\n    /*  INS_$A5  */   PACK( 0, 0 ),\n    /*  INS_$A6  */   PACK( 0, 0 ),\n    /*  INS_$A7  */   PACK( 0, 0 ),\n    /*  INS_$A8  */   PACK( 0, 0 ),\n    /*  INS_$A9  */   PACK( 0, 0 ),\n    /*  INS_$AA  */   PACK( 0, 0 ),\n    /*  INS_$AB  */   PACK( 0, 0 ),\n    /*  INS_$AC  */   PACK( 0, 0 ),\n    /*  INS_$AD  */   PACK( 0, 0 ),\n    /*  INS_$AE  */   PACK( 0, 0 ),\n    /*  INS_$AF  */   PACK( 0, 0 ),\n\n    /*  PushB[0]  */  PACK( 0, 1 ),\n    /*  PushB[1]  */  PACK( 0, 2 ),\n    /*  PushB[2]  */  PACK( 0, 3 ),\n    /*  PushB[3]  */  PACK( 0, 4 ),\n    /*  PushB[4]  */  PACK( 0, 5 ),\n    /*  PushB[5]  */  PACK( 0, 6 ),\n    /*  PushB[6]  */  PACK( 0, 7 ),\n    /*  PushB[7]  */  PACK( 0, 8 ),\n    /*  PushW[0]  */  PACK( 0, 1 ),\n    /*  PushW[1]  */  PACK( 0, 2 ),\n    /*  PushW[2]  */  PACK( 0, 3 ),\n    /*  PushW[3]  */  PACK( 0, 4 ),\n    /*  PushW[4]  */  PACK( 0, 5 ),\n    /*  PushW[5]  */  PACK( 0, 6 ),\n    /*  PushW[6]  */  PACK( 0, 7 ),\n    /*  PushW[7]  */  PACK( 0, 8 ),\n\n    /*  MDRP[00]  */  PACK( 1, 0 ),\n    /*  MDRP[01]  */  PACK( 1, 0 ),\n    /*  MDRP[02]  */  PACK( 1, 0 ),\n    /*  MDRP[03]  */  PACK( 1, 0 ),\n    /*  MDRP[04]  */  PACK( 1, 0 ),\n    /*  MDRP[05]  */  PACK( 1, 0 ),\n    /*  MDRP[06]  */  PACK( 1, 0 ),\n    /*  MDRP[07]  */  PACK( 1, 0 ),\n    /*  MDRP[08]  */  PACK( 1, 0 ),\n    /*  MDRP[09]  */  PACK( 1, 0 ),\n    /*  MDRP[10]  */  PACK( 1, 0 ),\n    /*  MDRP[11]  */  PACK( 1, 0 ),\n    /*  MDRP[12]  */  PACK( 1, 0 ),\n    /*  MDRP[13]  */  PACK( 1, 0 ),\n    /*  MDRP[14]  */  PACK( 1, 0 ),\n    /*  MDRP[15]  */  PACK( 1, 0 ),\n\n    /*  MDRP[16]  */  PACK( 1, 0 ),\n    /*  MDRP[17]  */  PACK( 1, 0 ),\n    /*  MDRP[18]  */  PACK( 1, 0 ),\n    /*  MDRP[19]  */  PACK( 1, 0 ),\n    /*  MDRP[20]  */  PACK( 1, 0 ),\n    /*  MDRP[21]  */  PACK( 1, 0 ),\n    /*  MDRP[22]  */  PACK( 1, 0 ),\n    /*  MDRP[23]  */  PACK( 1, 0 ),\n    /*  MDRP[24]  */  PACK( 1, 0 ),\n    /*  MDRP[25]  */  PACK( 1, 0 ),\n    /*  MDRP[26]  */  PACK( 1, 0 ),\n    /*  MDRP[27]  */  PACK( 1, 0 ),\n    /*  MDRP[28]  */  PACK( 1, 0 ),\n    /*  MDRP[29]  */  PACK( 1, 0 ),\n    /*  MDRP[30]  */  PACK( 1, 0 ),\n    /*  MDRP[31]  */  PACK( 1, 0 ),\n\n    /*  MIRP[00]  */  PACK( 2, 0 ),\n    /*  MIRP[01]  */  PACK( 2, 0 ),\n    /*  MIRP[02]  */  PACK( 2, 0 ),\n    /*  MIRP[03]  */  PACK( 2, 0 ),\n    /*  MIRP[04]  */  PACK( 2, 0 ),\n    /*  MIRP[05]  */  PACK( 2, 0 ),\n    /*  MIRP[06]  */  PACK( 2, 0 ),\n    /*  MIRP[07]  */  PACK( 2, 0 ),\n    /*  MIRP[08]  */  PACK( 2, 0 ),\n    /*  MIRP[09]  */  PACK( 2, 0 ),\n    /*  MIRP[10]  */  PACK( 2, 0 ),\n    /*  MIRP[11]  */  PACK( 2, 0 ),\n    /*  MIRP[12]  */  PACK( 2, 0 ),\n    /*  MIRP[13]  */  PACK( 2, 0 ),\n    /*  MIRP[14]  */  PACK( 2, 0 ),\n    /*  MIRP[15]  */  PACK( 2, 0 ),\n\n    /*  MIRP[16]  */  PACK( 2, 0 ),\n    /*  MIRP[17]  */  PACK( 2, 0 ),\n    /*  MIRP[18]  */  PACK( 2, 0 ),\n    /*  MIRP[19]  */  PACK( 2, 0 ),\n    /*  MIRP[20]  */  PACK( 2, 0 ),\n    /*  MIRP[21]  */  PACK( 2, 0 ),\n    /*  MIRP[22]  */  PACK( 2, 0 ),\n    /*  MIRP[23]  */  PACK( 2, 0 ),\n    /*  MIRP[24]  */  PACK( 2, 0 ),\n    /*  MIRP[25]  */  PACK( 2, 0 ),\n    /*  MIRP[26]  */  PACK( 2, 0 ),\n    /*  MIRP[27]  */  PACK( 2, 0 ),\n    /*  MIRP[28]  */  PACK( 2, 0 ),\n    /*  MIRP[29]  */  PACK( 2, 0 ),\n    /*  MIRP[30]  */  PACK( 2, 0 ),\n    /*  MIRP[31]  */  PACK( 2, 0 )\n  };\n\n\n#ifdef FT_DEBUG_LEVEL_TRACE\n\n  static\n  const char*  const opcode_name[256] =\n  {\n    \"SVTCA y\",\n    \"SVTCA x\",\n    \"SPvTCA y\",\n    \"SPvTCA x\",\n    \"SFvTCA y\",\n    \"SFvTCA x\",\n    \"SPvTL ||\",\n    \"SPvTL +\",\n    \"SFvTL ||\",\n    \"SFvTL +\",\n    \"SPvFS\",\n    \"SFvFS\",\n    \"GPV\",\n    \"GFV\",\n    \"SFvTPv\",\n    \"ISECT\",\n\n    \"SRP0\",\n    \"SRP1\",\n    \"SRP2\",\n    \"SZP0\",\n    \"SZP1\",\n    \"SZP2\",\n    \"SZPS\",\n    \"SLOOP\",\n    \"RTG\",\n    \"RTHG\",\n    \"SMD\",\n    \"ELSE\",\n    \"JMPR\",\n    \"SCvTCi\",\n    \"SSwCi\",\n    \"SSW\",\n\n    \"DUP\",\n    \"POP\",\n    \"CLEAR\",\n    \"SWAP\",\n    \"DEPTH\",\n    \"CINDEX\",\n    \"MINDEX\",\n    \"AlignPTS\",\n    \"INS_$28\",\n    \"UTP\",\n    \"LOOPCALL\",\n    \"CALL\",\n    \"FDEF\",\n    \"ENDF\",\n    \"MDAP[0]\",\n    \"MDAP[1]\",\n\n    \"IUP[0]\",\n    \"IUP[1]\",\n    \"SHP[0]\",\n    \"SHP[1]\",\n    \"SHC[0]\",\n    \"SHC[1]\",\n    \"SHZ[0]\",\n    \"SHZ[1]\",\n    \"SHPIX\",\n    \"IP\",\n    \"MSIRP[0]\",\n    \"MSIRP[1]\",\n    \"AlignRP\",\n    \"RTDG\",\n    \"MIAP[0]\",\n    \"MIAP[1]\",\n\n    \"NPushB\",\n    \"NPushW\",\n    \"WS\",\n    \"RS\",\n    \"WCvtP\",\n    \"RCvt\",\n    \"GC[0]\",\n    \"GC[1]\",\n    \"SCFS\",\n    \"MD[0]\",\n    \"MD[1]\",\n    \"MPPEM\",\n    \"MPS\",\n    \"FlipON\",\n    \"FlipOFF\",\n    \"DEBUG\",\n\n    \"LT\",\n    \"LTEQ\",\n    \"GT\",\n    \"GTEQ\",\n    \"EQ\",\n    \"NEQ\",\n    \"ODD\",\n    \"EVEN\",\n    \"IF\",\n    \"EIF\",\n    \"AND\",\n    \"OR\",\n    \"NOT\",\n    \"DeltaP1\",\n    \"SDB\",\n    \"SDS\",\n\n    \"ADD\",\n    \"SUB\",\n    \"DIV\",\n    \"MUL\",\n    \"ABS\",\n    \"NEG\",\n    \"FLOOR\",\n    \"CEILING\",\n    \"ROUND[0]\",\n    \"ROUND[1]\",\n    \"ROUND[2]\",\n    \"ROUND[3]\",\n    \"NROUND[0]\",\n    \"NROUND[1]\",\n    \"NROUND[2]\",\n    \"NROUND[3]\",\n\n    \"WCvtF\",\n    \"DeltaP2\",\n    \"DeltaP3\",\n    \"DeltaCn[0]\",\n    \"DeltaCn[1]\",\n    \"DeltaCn[2]\",\n    \"SROUND\",\n    \"S45Round\",\n    \"JROT\",\n    \"JROF\",\n    \"ROFF\",\n    \"INS_$7B\",\n    \"RUTG\",\n    \"RDTG\",\n    \"SANGW\",\n    \"AA\",\n\n    \"FlipPT\",\n    \"FlipRgON\",\n    \"FlipRgOFF\",\n    \"INS_$83\",\n    \"INS_$84\",\n    \"ScanCTRL\",\n    \"SDVPTL[0]\",\n    \"SDVPTL[1]\",\n    \"GetINFO\",\n    \"IDEF\",\n    \"ROLL\",\n    \"MAX\",\n    \"MIN\",\n    \"ScanTYPE\",\n    \"InstCTRL\",\n    \"INS_$8F\",\n\n    \"INS_$90\",\n    \"INS_$91\",\n    \"INS_$92\",\n    \"INS_$93\",\n    \"INS_$94\",\n    \"INS_$95\",\n    \"INS_$96\",\n    \"INS_$97\",\n    \"INS_$98\",\n    \"INS_$99\",\n    \"INS_$9A\",\n    \"INS_$9B\",\n    \"INS_$9C\",\n    \"INS_$9D\",\n    \"INS_$9E\",\n    \"INS_$9F\",\n\n    \"INS_$A0\",\n    \"INS_$A1\",\n    \"INS_$A2\",\n    \"INS_$A3\",\n    \"INS_$A4\",\n    \"INS_$A5\",\n    \"INS_$A6\",\n    \"INS_$A7\",\n    \"INS_$A8\",\n    \"INS_$A9\",\n    \"INS_$AA\",\n    \"INS_$AB\",\n    \"INS_$AC\",\n    \"INS_$AD\",\n    \"INS_$AE\",\n    \"INS_$AF\",\n\n    \"PushB[0]\",\n    \"PushB[1]\",\n    \"PushB[2]\",\n    \"PushB[3]\",\n    \"PushB[4]\",\n    \"PushB[5]\",\n    \"PushB[6]\",\n    \"PushB[7]\",\n    \"PushW[0]\",\n    \"PushW[1]\",\n    \"PushW[2]\",\n    \"PushW[3]\",\n    \"PushW[4]\",\n    \"PushW[5]\",\n    \"PushW[6]\",\n    \"PushW[7]\",\n\n    \"MDRP[00]\",\n    \"MDRP[01]\",\n    \"MDRP[02]\",\n    \"MDRP[03]\",\n    \"MDRP[04]\",\n    \"MDRP[05]\",\n    \"MDRP[06]\",\n    \"MDRP[07]\",\n    \"MDRP[08]\",\n    \"MDRP[09]\",\n    \"MDRP[10]\",\n    \"MDRP[11]\",\n    \"MDRP[12]\",\n    \"MDRP[13]\",\n    \"MDRP[14]\",\n    \"MDRP[15]\",\n\n    \"MDRP[16]\",\n    \"MDRP[17]\",\n    \"MDRP[18]\",\n    \"MDRP[19]\",\n    \"MDRP[20]\",\n    \"MDRP[21]\",\n    \"MDRP[22]\",\n    \"MDRP[23]\",\n    \"MDRP[24]\",\n    \"MDRP[25]\",\n    \"MDRP[26]\",\n    \"MDRP[27]\",\n    \"MDRP[28]\",\n    \"MDRP[29]\",\n    \"MDRP[30]\",\n    \"MDRP[31]\",\n\n    \"MIRP[00]\",\n    \"MIRP[01]\",\n    \"MIRP[02]\",\n    \"MIRP[03]\",\n    \"MIRP[04]\",\n    \"MIRP[05]\",\n    \"MIRP[06]\",\n    \"MIRP[07]\",\n    \"MIRP[08]\",\n    \"MIRP[09]\",\n    \"MIRP[10]\",\n    \"MIRP[11]\",\n    \"MIRP[12]\",\n    \"MIRP[13]\",\n    \"MIRP[14]\",\n    \"MIRP[15]\",\n\n    \"MIRP[16]\",\n    \"MIRP[17]\",\n    \"MIRP[18]\",\n    \"MIRP[19]\",\n    \"MIRP[20]\",\n    \"MIRP[21]\",\n    \"MIRP[22]\",\n    \"MIRP[23]\",\n    \"MIRP[24]\",\n    \"MIRP[25]\",\n    \"MIRP[26]\",\n    \"MIRP[27]\",\n    \"MIRP[28]\",\n    \"MIRP[29]\",\n    \"MIRP[30]\",\n    \"MIRP[31]\"\n  };\n\n#endif /* FT_DEBUG_LEVEL_TRACE */\n\n\n  static\n  const FT_Char  opcode_length[256] =\n  {\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n\n   -1,-2, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    2, 3, 4, 5,  6, 7, 8, 9,  3, 5, 7, 9, 11,13,15,17,\n\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,\n    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1\n  };\n\n#undef PACK\n\n#if 1\n\n  static FT_Int32\n  TT_MulFix14( FT_Int32  a,\n               FT_Int    b )\n  {\n    FT_Int32   sign;\n    FT_UInt32  ah, al, mid, lo, hi;\n\n\n    sign = a ^ b;\n\n    if ( a < 0 )\n      a = -a;\n    if ( b < 0 )\n      b = -b;\n\n    ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );\n    al = (FT_UInt32)( a & 0xFFFFU );\n\n    lo    = al * b;\n    mid   = ah * b;\n    hi    = mid >> 16;\n    mid   = ( mid << 16 ) + ( 1 << 13 ); /* rounding */\n    lo   += mid;\n    if ( lo < mid )\n      hi += 1;\n\n    mid = ( lo >> 14 ) | ( hi << 18 );\n\n    return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;\n  }\n\n#else\n\n  /* compute (a*b)/2^14 with maximum accuracy and rounding */\n  static FT_Int32\n  TT_MulFix14( FT_Int32  a,\n               FT_Int    b )\n  {\n    FT_Int32   m, s, hi;\n    FT_UInt32  l, lo;\n\n\n    /* compute ax*bx as 64-bit value */\n    l  = (FT_UInt32)( ( a & 0xFFFFU ) * b );\n    m  = ( a >> 16 ) * b;\n\n    lo = l + ( (FT_UInt32)m << 16 );\n    hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );\n\n    /* divide the result by 2^14 with rounding */\n    s   = hi >> 31;\n    l   = lo + (FT_UInt32)s;\n    hi += s + ( l < lo );\n    lo  = l;\n\n    l   = lo + 0x2000U;\n    hi += l < lo;\n\n    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );\n  }\n#endif\n\n\n  /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */\n  static FT_Int32\n  TT_DotFix14( FT_Int32  ax,\n               FT_Int32  ay,\n               FT_Int    bx,\n               FT_Int    by )\n  {\n    FT_Int32   m, s, hi1, hi2, hi;\n    FT_UInt32  l, lo1, lo2, lo;\n\n\n    /* compute ax*bx as 64-bit value */\n    l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );\n    m = ( ax >> 16 ) * bx;\n\n    lo1 = l + ( (FT_UInt32)m << 16 );\n    hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );\n\n    /* compute ay*by as 64-bit value */\n    l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );\n    m = ( ay >> 16 ) * by;\n\n    lo2 = l + ( (FT_UInt32)m << 16 );\n    hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );\n\n    /* add them */\n    lo = lo1 + lo2;\n    hi = hi1 + hi2 + ( lo < lo1 );\n\n    /* divide the result by 2^14 with rounding */\n    s   = hi >> 31;\n    l   = lo + (FT_UInt32)s;\n    hi += s + ( l < lo );\n    lo  = l;\n\n    l   = lo + 0x2000U;\n    hi += ( l < lo );\n\n    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Current_Ratio                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Returns the current aspect ratio scaling factor depending on the   */\n  /*    projection vector's state and device resolutions.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The aspect ratio in 16.16 format, always <= 1.0 .                  */\n  /*                                                                       */\n  static FT_Long\n  Current_Ratio( EXEC_OP )\n  {\n    if ( !CUR.tt_metrics.ratio )\n    {\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n      if ( CUR.face->unpatented_hinting )\n      {\n        if ( CUR.GS.both_x_axis )\n          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;\n        else\n          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;\n      }\n      else\n#endif\n      {\n        if ( CUR.GS.projVector.y == 0 )\n          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;\n\n        else if ( CUR.GS.projVector.x == 0 )\n          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;\n\n        else\n        {\n          FT_F26Dot6  x, y;\n\n\n          x = TT_MulFix14( CUR.tt_metrics.x_ratio,\n                           CUR.GS.projVector.x );\n          y = TT_MulFix14( CUR.tt_metrics.y_ratio,\n                           CUR.GS.projVector.y );\n          CUR.tt_metrics.ratio = FT_Hypot( x, y );\n        }\n      }\n    }\n    return CUR.tt_metrics.ratio;\n  }\n\n\n  static FT_Long\n  Current_Ppem( EXEC_OP )\n  {\n    return FT_MulFix( CUR.tt_metrics.ppem, CURRENT_Ratio() );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Functions related to the control value table (CVT).                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  FT_CALLBACK_DEF( FT_F26Dot6 )\n  Read_CVT( EXEC_OP_ FT_ULong  idx )\n  {\n    return CUR.cvt[idx];\n  }\n\n\n  FT_CALLBACK_DEF( FT_F26Dot6 )\n  Read_CVT_Stretched( EXEC_OP_ FT_ULong  idx )\n  {\n    return FT_MulFix( CUR.cvt[idx], CURRENT_Ratio() );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  Write_CVT( EXEC_OP_ FT_ULong    idx,\n                      FT_F26Dot6  value )\n  {\n    CUR.cvt[idx] = value;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  Write_CVT_Stretched( EXEC_OP_ FT_ULong    idx,\n                                FT_F26Dot6  value )\n  {\n    CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  Move_CVT( EXEC_OP_ FT_ULong    idx,\n                     FT_F26Dot6  value )\n  {\n    CUR.cvt[idx] += value;\n  }\n\n\n  FT_CALLBACK_DEF( void )\n  Move_CVT_Stretched( EXEC_OP_ FT_ULong    idx,\n                               FT_F26Dot6  value )\n  {\n    CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    GetShortIns                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Returns a short integer taken from the instruction stream at       */\n  /*    address IP.                                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Short read at code[IP].                                            */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This one could become a macro.                                     */\n  /*                                                                       */\n  static FT_Short\n  GetShortIns( EXEC_OP )\n  {\n    /* Reading a byte stream so there is no endianess (DaveP) */\n    CUR.IP += 2;\n    return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +\n                         CUR.code[CUR.IP - 1]      );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Ins_Goto_CodeRange                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Goes to a certain code range in the instruction stream.            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    aRange :: The index of the code range.                             */\n  /*                                                                       */\n  /*    aIP    :: The new IP address in the code range.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    SUCCESS or FAILURE.                                                */\n  /*                                                                       */\n  static FT_Bool\n  Ins_Goto_CodeRange( EXEC_OP_ FT_Int    aRange,\n                               FT_ULong  aIP )\n  {\n    TT_CodeRange*  range;\n\n\n    if ( aRange < 1 || aRange > 3 )\n    {\n      CUR.error = FT_THROW( Bad_Argument );\n      return FAILURE;\n    }\n\n    range = &CUR.codeRangeTable[aRange - 1];\n\n    if ( range->base == NULL )     /* invalid coderange */\n    {\n      CUR.error = FT_THROW( Invalid_CodeRange );\n      return FAILURE;\n    }\n\n    /* NOTE: Because the last instruction of a program may be a CALL */\n    /*       which will return to the first byte *after* the code    */\n    /*       range, we test for aIP <= Size, instead of aIP < Size.  */\n\n    if ( aIP > range->size )\n    {\n      CUR.error = FT_THROW( Code_Overflow );\n      return FAILURE;\n    }\n\n    CUR.code     = range->base;\n    CUR.codeSize = range->size;\n    CUR.IP       = aIP;\n    CUR.curRange = aRange;\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Direct_Move                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Moves a point by a given distance along the freedom vector.  The   */\n  /*    point will be `touched'.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    point    :: The index of the point to move.                        */\n  /*                                                                       */\n  /*    distance :: The distance to apply.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    zone     :: The affected glyph zone.                               */\n  /*                                                                       */\n  static void\n  Direct_Move( EXEC_OP_ TT_GlyphZone  zone,\n                        FT_UShort     point,\n                        FT_F26Dot6    distance )\n  {\n    FT_F26Dot6  v;\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_ASSERT( !CUR.face->unpatented_hinting );\n#endif\n\n    v = CUR.GS.freeVector.x;\n\n    if ( v != 0 )\n    {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( !CUR.ignore_x_mode                                ||\n           ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n      zone->cur[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );\n\n      zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;\n    }\n\n    v = CUR.GS.freeVector.y;\n\n    if ( v != 0 )\n    {\n      zone->cur[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );\n\n      zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Direct_Move_Orig                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Moves the *original* position of a point by a given distance along */\n  /*    the freedom vector.  Obviously, the point will not be `touched'.   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    point    :: The index of the point to move.                        */\n  /*                                                                       */\n  /*    distance :: The distance to apply.                                 */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    zone     :: The affected glyph zone.                               */\n  /*                                                                       */\n  static void\n  Direct_Move_Orig( EXEC_OP_ TT_GlyphZone  zone,\n                             FT_UShort     point,\n                             FT_F26Dot6    distance )\n  {\n    FT_F26Dot6  v;\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_ASSERT( !CUR.face->unpatented_hinting );\n#endif\n\n    v = CUR.GS.freeVector.x;\n\n    if ( v != 0 )\n      zone->org[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );\n\n    v = CUR.GS.freeVector.y;\n\n    if ( v != 0 )\n      zone->org[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Special versions of Direct_Move()                                     */\n  /*                                                                       */\n  /*   The following versions are used whenever both vectors are both      */\n  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static void\n  Direct_Move_X( EXEC_OP_ TT_GlyphZone  zone,\n                          FT_UShort     point,\n                          FT_F26Dot6    distance )\n  {\n    FT_UNUSED_EXEC;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( !CUR.ignore_x_mode                                 ||\n         ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVEX ) )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n    zone->cur[point].x += distance;\n    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;\n  }\n\n\n  static void\n  Direct_Move_Y( EXEC_OP_ TT_GlyphZone  zone,\n                          FT_UShort     point,\n                          FT_F26Dot6    distance )\n  {\n    FT_UNUSED_EXEC;\n\n    zone->cur[point].y += distance;\n    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_Y;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Special versions of Direct_Move_Orig()                                */\n  /*                                                                       */\n  /*   The following versions are used whenever both vectors are both      */\n  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static void\n  Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone  zone,\n                               FT_UShort     point,\n                               FT_F26Dot6    distance )\n  {\n    FT_UNUSED_EXEC;\n\n    zone->org[point].x += distance;\n  }\n\n\n  static void\n  Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone  zone,\n                               FT_UShort     point,\n                               FT_F26Dot6    distance )\n  {\n    FT_UNUSED_EXEC;\n\n    zone->org[point].y += distance;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_None                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Does not round, but adds engine compensation.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance (not) to round.                       */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The compensated distance.                                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The TrueType specification says very few about the relationship    */\n  /*    between rounding and engine compensation.  However, it seems from  */\n  /*    the description of super round that we should add the compensation */\n  /*    before rounding.                                                   */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_None( EXEC_OP_ FT_F26Dot6  distance,\n                       FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation;\n      if ( distance && val < 0 )\n        val = 0;\n    }\n    else\n    {\n      val = distance - compensation;\n      if ( val > 0 )\n        val = 0;\n    }\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_To_Grid                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value to grid after adding engine compensation.             */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_To_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                          FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation + 32;\n      if ( distance && val > 0 )\n        val &= ~63;\n      else\n        val = 0;\n    }\n    else\n    {\n      val = -FT_PIX_ROUND( compensation - distance );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return  val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_To_Half_Grid                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value to half grid after adding engine compensation.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                               FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = FT_PIX_FLOOR( distance + compensation ) + 32;\n      if ( distance && val < 0 )\n        val = 0;\n    }\n    else\n    {\n      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_Down_To_Grid                                                 */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value down to grid after adding engine compensation.        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                               FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation;\n      if ( distance && val > 0 )\n        val &= ~63;\n      else\n        val = 0;\n    }\n    else\n    {\n      val = -( ( compensation - distance ) & -64 );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_Up_To_Grid                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value up to grid after adding engine compensation.          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                             FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation + 63;\n      if ( distance && val > 0 )\n        val &= ~63;\n      else\n        val = 0;\n    }\n    else\n    {\n      val = -FT_PIX_CEIL( compensation - distance );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_To_Double_Grid                                               */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Rounds value to double grid after adding engine compensation.      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6  distance,\n                                 FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6 val;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( distance >= 0 )\n    {\n      val = distance + compensation + 16;\n      if ( distance && val > 0 )\n        val &= ~31;\n      else\n        val = 0;\n    }\n    else\n    {\n      val = -FT_PAD_ROUND( compensation - distance, 32 );\n      if ( val > 0 )\n        val = 0;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_Super                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Super-rounds value to grid after adding engine compensation.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The TrueType specification says very few about the relationship    */\n  /*    between rounding and engine compensation.  However, it seems from  */\n  /*    the description of super round that we should add the compensation */\n  /*    before rounding.                                                   */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_Super( EXEC_OP_ FT_F26Dot6  distance,\n                        FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n\n    if ( distance >= 0 )\n    {\n      val = ( distance - CUR.phase + CUR.threshold + compensation ) &\n              -CUR.period;\n      if ( distance && val < 0 )\n        val = 0;\n      val += CUR.phase;\n    }\n    else\n    {\n      val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &\n               -CUR.period );\n      if ( val > 0 )\n        val = 0;\n      val -= CUR.phase;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Round_Super_45                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Super-rounds value to grid after adding engine compensation.       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    distance     :: The distance to round.                             */\n  /*                                                                       */\n  /*    compensation :: The engine compensation.                           */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Rounded distance.                                                  */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    There is a separate function for Round_Super_45() as we may need   */\n  /*    greater precision.                                                 */\n  /*                                                                       */\n  static FT_F26Dot6\n  Round_Super_45( EXEC_OP_ FT_F26Dot6  distance,\n                           FT_F26Dot6  compensation )\n  {\n    FT_F26Dot6  val;\n\n\n    if ( distance >= 0 )\n    {\n      val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /\n                CUR.period ) * CUR.period;\n      if ( distance && val < 0 )\n        val = 0;\n      val += CUR.phase;\n    }\n    else\n    {\n      val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /\n                   CUR.period ) * CUR.period );\n      if ( val > 0 )\n        val = 0;\n      val -= CUR.phase;\n    }\n\n    return val;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Compute_Round                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Sets the rounding mode.                                            */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    round_mode :: The rounding mode to be used.                        */\n  /*                                                                       */\n  static void\n  Compute_Round( EXEC_OP_ FT_Byte  round_mode )\n  {\n    switch ( round_mode )\n    {\n    case TT_Round_Off:\n      CUR.func_round = (TT_Round_Func)Round_None;\n      break;\n\n    case TT_Round_To_Grid:\n      CUR.func_round = (TT_Round_Func)Round_To_Grid;\n      break;\n\n    case TT_Round_Up_To_Grid:\n      CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;\n      break;\n\n    case TT_Round_Down_To_Grid:\n      CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;\n      break;\n\n    case TT_Round_To_Half_Grid:\n      CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;\n      break;\n\n    case TT_Round_To_Double_Grid:\n      CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;\n      break;\n\n    case TT_Round_Super:\n      CUR.func_round = (TT_Round_Func)Round_Super;\n      break;\n\n    case TT_Round_Super_45:\n      CUR.func_round = (TT_Round_Func)Round_Super_45;\n      break;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    SetSuperRound                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Sets Super Round parameters.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    GridPeriod :: The grid period.                                     */\n  /*                                                                       */\n  /*    selector   :: The SROUND opcode.                                   */\n  /*                                                                       */\n  static void\n  SetSuperRound( EXEC_OP_ FT_F26Dot6  GridPeriod,\n                          FT_Long     selector )\n  {\n    switch ( (FT_Int)( selector & 0xC0 ) )\n    {\n      case 0:\n        CUR.period = GridPeriod / 2;\n        break;\n\n      case 0x40:\n        CUR.period = GridPeriod;\n        break;\n\n      case 0x80:\n        CUR.period = GridPeriod * 2;\n        break;\n\n      /* This opcode is reserved, but... */\n\n      case 0xC0:\n        CUR.period = GridPeriod;\n        break;\n    }\n\n    switch ( (FT_Int)( selector & 0x30 ) )\n    {\n    case 0:\n      CUR.phase = 0;\n      break;\n\n    case 0x10:\n      CUR.phase = CUR.period / 4;\n      break;\n\n    case 0x20:\n      CUR.phase = CUR.period / 2;\n      break;\n\n    case 0x30:\n      CUR.phase = CUR.period * 3 / 4;\n      break;\n    }\n\n    if ( ( selector & 0x0F ) == 0 )\n      CUR.threshold = CUR.period - 1;\n    else\n      CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8;\n\n    CUR.period    /= 256;\n    CUR.phase     /= 256;\n    CUR.threshold /= 256;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Project                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection of vector given by (v2-v1) along the       */\n  /*    current projection vector.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    v1 :: First input vector.                                          */\n  /*    v2 :: Second input vector.                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The distance in F26dot6 format.                                    */\n  /*                                                                       */\n  static FT_F26Dot6\n  Project( EXEC_OP_ FT_Pos  dx,\n                    FT_Pos  dy )\n  {\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_ASSERT( !CUR.face->unpatented_hinting );\n#endif\n\n    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,\n                        CUR.GS.projVector.x,\n                        CUR.GS.projVector.y );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Dual_Project                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection of the vector given by (v2-v1) along the   */\n  /*    current dual vector.                                               */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    v1 :: First input vector.                                          */\n  /*    v2 :: Second input vector.                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The distance in F26dot6 format.                                    */\n  /*                                                                       */\n  static FT_F26Dot6\n  Dual_Project( EXEC_OP_ FT_Pos  dx,\n                         FT_Pos  dy )\n  {\n    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,\n                        CUR.GS.dualVector.x,\n                        CUR.GS.dualVector.y );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Project_x                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection of the vector given by (v2-v1) along the   */\n  /*    horizontal axis.                                                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    v1 :: First input vector.                                          */\n  /*    v2 :: Second input vector.                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The distance in F26dot6 format.                                    */\n  /*                                                                       */\n  static FT_F26Dot6\n  Project_x( EXEC_OP_ FT_Pos  dx,\n                      FT_Pos  dy )\n  {\n    FT_UNUSED_EXEC;\n    FT_UNUSED( dy );\n\n    return dx;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Project_y                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection of the vector given by (v2-v1) along the   */\n  /*    vertical axis.                                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    v1 :: First input vector.                                          */\n  /*    v2 :: Second input vector.                                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    The distance in F26dot6 format.                                    */\n  /*                                                                       */\n  static FT_F26Dot6\n  Project_y( EXEC_OP_ FT_Pos  dx,\n                      FT_Pos  dy )\n  {\n    FT_UNUSED_EXEC;\n    FT_UNUSED( dx );\n\n    return dy;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Compute_Funcs                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Computes the projection and movement function pointers according   */\n  /*    to the current graphics state.                                     */\n  /*                                                                       */\n  static void\n  Compute_Funcs( EXEC_OP )\n  {\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    if ( CUR.face->unpatented_hinting )\n    {\n      /* If both vectors point rightwards along the x axis, set             */\n      /* `both-x-axis' true, otherwise set it false.  The x values only     */\n      /* need be tested because the vector has been normalised to a unit    */\n      /* vector of length 0x4000 = unity.                                   */\n      CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 &&\n                                      CUR.GS.freeVector.x == 0x4000 );\n\n      /* Throw away projection and freedom vector information */\n      /* because the patents don't allow them to be stored.   */\n      /* The relevant US Patents are 5155805 and 5325479.     */\n      CUR.GS.projVector.x = 0;\n      CUR.GS.projVector.y = 0;\n      CUR.GS.freeVector.x = 0;\n      CUR.GS.freeVector.y = 0;\n\n      if ( CUR.GS.both_x_axis )\n      {\n        CUR.func_project   = Project_x;\n        CUR.func_move      = Direct_Move_X;\n        CUR.func_move_orig = Direct_Move_Orig_X;\n      }\n      else\n      {\n        CUR.func_project   = Project_y;\n        CUR.func_move      = Direct_Move_Y;\n        CUR.func_move_orig = Direct_Move_Orig_Y;\n      }\n\n      if ( CUR.GS.dualVector.x == 0x4000 )\n        CUR.func_dualproj = Project_x;\n      else if ( CUR.GS.dualVector.y == 0x4000 )\n        CUR.func_dualproj = Project_y;\n      else\n        CUR.func_dualproj = Dual_Project;\n\n      /* Force recalculation of cached aspect ratio */\n      CUR.tt_metrics.ratio = 0;\n\n      return;\n    }\n#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */\n\n    if ( CUR.GS.freeVector.x == 0x4000 )\n      CUR.F_dot_P = CUR.GS.projVector.x;\n    else if ( CUR.GS.freeVector.y == 0x4000 )\n      CUR.F_dot_P = CUR.GS.projVector.y;\n    else\n      CUR.F_dot_P = ( (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x +\n                      (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y ) >>\n                    14;\n\n    if ( CUR.GS.projVector.x == 0x4000 )\n      CUR.func_project = (TT_Project_Func)Project_x;\n    else if ( CUR.GS.projVector.y == 0x4000 )\n      CUR.func_project = (TT_Project_Func)Project_y;\n    else\n      CUR.func_project = (TT_Project_Func)Project;\n\n    if ( CUR.GS.dualVector.x == 0x4000 )\n      CUR.func_dualproj = (TT_Project_Func)Project_x;\n    else if ( CUR.GS.dualVector.y == 0x4000 )\n      CUR.func_dualproj = (TT_Project_Func)Project_y;\n    else\n      CUR.func_dualproj = (TT_Project_Func)Dual_Project;\n\n    CUR.func_move      = (TT_Move_Func)Direct_Move;\n    CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;\n\n    if ( CUR.F_dot_P == 0x4000L )\n    {\n      if ( CUR.GS.freeVector.x == 0x4000 )\n      {\n        CUR.func_move      = (TT_Move_Func)Direct_Move_X;\n        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;\n      }\n      else if ( CUR.GS.freeVector.y == 0x4000 )\n      {\n        CUR.func_move      = (TT_Move_Func)Direct_Move_Y;\n        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;\n      }\n    }\n\n    /* at small sizes, F_dot_P can become too small, resulting   */\n    /* in overflows and `spikes' in a number of glyphs like `w'. */\n\n    if ( FT_ABS( CUR.F_dot_P ) < 0x400L )\n      CUR.F_dot_P = 0x4000L;\n\n    /* Disable cached aspect ratio */\n    CUR.tt_metrics.ratio = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Normalize                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Norms a vector.                                                    */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    Vx :: The horizontal input vector coordinate.                      */\n  /*    Vy :: The vertical input vector coordinate.                        */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    R  :: The normed unit vector.                                      */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    Returns FAILURE if a vector parameter is zero.                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    In case Vx and Vy are both zero, Normalize() returns SUCCESS, and  */\n  /*    R is undefined.                                                    */\n  /*                                                                       */\n  static FT_Bool\n  Normalize( EXEC_OP_ FT_F26Dot6      Vx,\n                      FT_F26Dot6      Vy,\n                      FT_UnitVector*  R )\n  {\n    FT_F26Dot6  W;\n\n    FT_UNUSED_EXEC;\n\n\n    if ( FT_ABS( Vx ) < 0x4000L && FT_ABS( Vy ) < 0x4000L )\n    {\n      if ( Vx == 0 && Vy == 0 )\n      {\n        /* XXX: UNDOCUMENTED! It seems that it is possible to try   */\n        /*      to normalize the vector (0,0).  Return immediately. */\n        return SUCCESS;\n      }\n\n      Vx *= 0x4000;\n      Vy *= 0x4000;\n    }\n\n    W = FT_Hypot( Vx, Vy );\n\n    R->x = (FT_F2Dot14)TT_DivFix14( Vx, W );\n    R->y = (FT_F2Dot14)TT_DivFix14( Vy, W );\n\n    return SUCCESS;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Here we start with the implementation of the various opcodes.         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static FT_Bool\n  Ins_SxVTL( EXEC_OP_ FT_UShort       aIdx1,\n                      FT_UShort       aIdx2,\n                      FT_Int          aOpc,\n                      FT_UnitVector*  Vec )\n  {\n    FT_Long     A, B, C;\n    FT_Vector*  p1;\n    FT_Vector*  p2;\n\n\n    if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||\n         BOUNDS( aIdx2, CUR.zp1.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return FAILURE;\n    }\n\n    p1 = CUR.zp1.cur + aIdx2;\n    p2 = CUR.zp2.cur + aIdx1;\n\n    A = p1->x - p2->x;\n    B = p1->y - p2->y;\n\n    /* If p1 == p2, SPVTL and SFVTL behave the same as */\n    /* SPVTCA[X] and SFVTCA[X], respectively.          */\n    /*                                                 */\n    /* Confirmed by Greg Hitchcock.                    */\n\n    if ( A == 0 && B == 0 )\n    {\n      A    = 0x4000;\n      aOpc = 0;\n    }\n\n    if ( ( aOpc & 1 ) != 0 )\n    {\n      C =  B;   /* counter clockwise rotation */\n      B =  A;\n      A = -C;\n    }\n\n    NORMalize( A, B, Vec );\n\n    return SUCCESS;\n  }\n\n\n  /* When not using the big switch statements, the interpreter uses a */\n  /* call table defined later below in this source.  Each opcode must */\n  /* thus have a corresponding function, even trivial ones.           */\n  /*                                                                  */\n  /* They are all defined there.                                      */\n\n#define DO_SVTCA                            \\\n  {                                         \\\n    FT_Short  A, B;                         \\\n                                            \\\n                                            \\\n    A = (FT_Short)( CUR.opcode & 1 ) << 14; \\\n    B = A ^ (FT_Short)0x4000;               \\\n                                            \\\n    CUR.GS.freeVector.x = A;                \\\n    CUR.GS.projVector.x = A;                \\\n    CUR.GS.dualVector.x = A;                \\\n                                            \\\n    CUR.GS.freeVector.y = B;                \\\n    CUR.GS.projVector.y = B;                \\\n    CUR.GS.dualVector.y = B;                \\\n                                            \\\n    COMPUTE_Funcs();                        \\\n  }\n\n\n#define DO_SPVTCA                           \\\n  {                                         \\\n    FT_Short  A, B;                         \\\n                                            \\\n                                            \\\n    A = (FT_Short)( CUR.opcode & 1 ) << 14; \\\n    B = A ^ (FT_Short)0x4000;               \\\n                                            \\\n    CUR.GS.projVector.x = A;                \\\n    CUR.GS.dualVector.x = A;                \\\n                                            \\\n    CUR.GS.projVector.y = B;                \\\n    CUR.GS.dualVector.y = B;                \\\n                                            \\\n    GUESS_VECTOR( freeVector );             \\\n                                            \\\n    COMPUTE_Funcs();                        \\\n  }\n\n\n#define DO_SFVTCA                           \\\n  {                                         \\\n    FT_Short  A, B;                         \\\n                                            \\\n                                            \\\n    A = (FT_Short)( CUR.opcode & 1 ) << 14; \\\n    B = A ^ (FT_Short)0x4000;               \\\n                                            \\\n    CUR.GS.freeVector.x = A;                \\\n    CUR.GS.freeVector.y = B;                \\\n                                            \\\n    GUESS_VECTOR( projVector );             \\\n                                            \\\n    COMPUTE_Funcs();                        \\\n  }\n\n\n#define DO_SPVTL                                      \\\n    if ( INS_SxVTL( (FT_UShort)args[1],               \\\n                    (FT_UShort)args[0],               \\\n                    CUR.opcode,                       \\\n                    &CUR.GS.projVector ) == SUCCESS ) \\\n    {                                                 \\\n      CUR.GS.dualVector = CUR.GS.projVector;          \\\n      GUESS_VECTOR( freeVector );                     \\\n      COMPUTE_Funcs();                                \\\n    }\n\n\n#define DO_SFVTL                                      \\\n    if ( INS_SxVTL( (FT_UShort)args[1],               \\\n                    (FT_UShort)args[0],               \\\n                    CUR.opcode,                       \\\n                    &CUR.GS.freeVector ) == SUCCESS ) \\\n    {                                                 \\\n      GUESS_VECTOR( projVector );                     \\\n      COMPUTE_Funcs();                                \\\n    }\n\n\n#define DO_SFVTPV                          \\\n    GUESS_VECTOR( projVector );            \\\n    CUR.GS.freeVector = CUR.GS.projVector; \\\n    COMPUTE_Funcs();\n\n\n#define DO_SPVFS                                \\\n  {                                             \\\n    FT_Short  S;                                \\\n    FT_Long   X, Y;                             \\\n                                                \\\n                                                \\\n    /* Only use low 16bits, then sign extend */ \\\n    S = (FT_Short)args[1];                      \\\n    Y = (FT_Long)S;                             \\\n    S = (FT_Short)args[0];                      \\\n    X = (FT_Long)S;                             \\\n                                                \\\n    NORMalize( X, Y, &CUR.GS.projVector );      \\\n                                                \\\n    CUR.GS.dualVector = CUR.GS.projVector;      \\\n    GUESS_VECTOR( freeVector );                 \\\n    COMPUTE_Funcs();                            \\\n  }\n\n\n#define DO_SFVFS                                \\\n  {                                             \\\n    FT_Short  S;                                \\\n    FT_Long   X, Y;                             \\\n                                                \\\n                                                \\\n    /* Only use low 16bits, then sign extend */ \\\n    S = (FT_Short)args[1];                      \\\n    Y = (FT_Long)S;                             \\\n    S = (FT_Short)args[0];                      \\\n    X = S;                                      \\\n                                                \\\n    NORMalize( X, Y, &CUR.GS.freeVector );      \\\n    GUESS_VECTOR( projVector );                 \\\n    COMPUTE_Funcs();                            \\\n  }\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n#define DO_GPV                                   \\\n    if ( CUR.face->unpatented_hinting )          \\\n    {                                            \\\n      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \\\n      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \\\n    }                                            \\\n    else                                         \\\n    {                                            \\\n      args[0] = CUR.GS.projVector.x;             \\\n      args[1] = CUR.GS.projVector.y;             \\\n    }\n#else\n#define DO_GPV                                   \\\n    args[0] = CUR.GS.projVector.x;               \\\n    args[1] = CUR.GS.projVector.y;\n#endif\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n#define DO_GFV                                   \\\n    if ( CUR.face->unpatented_hinting )          \\\n    {                                            \\\n      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \\\n      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \\\n    }                                            \\\n    else                                         \\\n    {                                            \\\n      args[0] = CUR.GS.freeVector.x;             \\\n      args[1] = CUR.GS.freeVector.y;             \\\n    }\n#else\n#define DO_GFV                                   \\\n    args[0] = CUR.GS.freeVector.x;               \\\n    args[1] = CUR.GS.freeVector.y;\n#endif\n\n\n#define DO_SRP0                      \\\n    CUR.GS.rp0 = (FT_UShort)args[0];\n\n\n#define DO_SRP1                      \\\n    CUR.GS.rp1 = (FT_UShort)args[0];\n\n\n#define DO_SRP2                      \\\n    CUR.GS.rp2 = (FT_UShort)args[0];\n\n\n#define DO_RTHG                                         \\\n    CUR.GS.round_state = TT_Round_To_Half_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;\n\n\n#define DO_RTG                                     \\\n    CUR.GS.round_state = TT_Round_To_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_To_Grid;\n\n\n#define DO_RTDG                                           \\\n    CUR.GS.round_state = TT_Round_To_Double_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;\n\n\n#define DO_RUTG                                       \\\n    CUR.GS.round_state = TT_Round_Up_To_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;\n\n\n#define DO_RDTG                                         \\\n    CUR.GS.round_state = TT_Round_Down_To_Grid;         \\\n    CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;\n\n\n#define DO_ROFF                                 \\\n    CUR.GS.round_state = TT_Round_Off;          \\\n    CUR.func_round = (TT_Round_Func)Round_None;\n\n\n#define DO_SROUND                                \\\n    SET_SuperRound( 0x4000, args[0] );           \\\n    CUR.GS.round_state = TT_Round_Super;         \\\n    CUR.func_round = (TT_Round_Func)Round_Super;\n\n\n#define DO_S45ROUND                                 \\\n    SET_SuperRound( 0x2D41, args[0] );              \\\n    CUR.GS.round_state = TT_Round_Super_45;         \\\n    CUR.func_round = (TT_Round_Func)Round_Super_45;\n\n\n#define DO_SLOOP                            \\\n    if ( args[0] < 0 )                      \\\n      CUR.error = FT_THROW( Bad_Argument ); \\\n    else                                    \\\n      CUR.GS.loop = args[0];\n\n\n#define DO_SMD                         \\\n    CUR.GS.minimum_distance = args[0];\n\n\n#define DO_SCVTCI                                     \\\n    CUR.GS.control_value_cutin = (FT_F26Dot6)args[0];\n\n\n#define DO_SSWCI                                     \\\n    CUR.GS.single_width_cutin = (FT_F26Dot6)args[0];\n\n\n#define DO_SSW                                                     \\\n    CUR.GS.single_width_value = FT_MulFix( args[0],                \\\n                                           CUR.tt_metrics.scale );\n\n\n#define DO_FLIPON            \\\n    CUR.GS.auto_flip = TRUE;\n\n\n#define DO_FLIPOFF            \\\n    CUR.GS.auto_flip = FALSE;\n\n\n#define DO_SDB                             \\\n    CUR.GS.delta_base = (FT_Short)args[0];\n\n\n#define DO_SDS                              \\\n    CUR.GS.delta_shift = (FT_Short)args[0];\n\n\n#define DO_MD  /* nothing */\n\n\n#define DO_MPPEM              \\\n    args[0] = CURRENT_Ppem();\n\n\n  /* Note: The pointSize should be irrelevant in a given font program; */\n  /*       we thus decide to return only the ppem.                     */\n#if 0\n\n#define DO_MPS                       \\\n    args[0] = CUR.metrics.pointSize;\n\n#else\n\n#define DO_MPS                \\\n    args[0] = CURRENT_Ppem();\n\n#endif /* 0 */\n\n\n#define DO_DUP         \\\n    args[1] = args[0];\n\n\n#define DO_CLEAR     \\\n    CUR.new_top = 0;\n\n\n#define DO_SWAP        \\\n  {                    \\\n    FT_Long  L;        \\\n                       \\\n                       \\\n    L       = args[0]; \\\n    args[0] = args[1]; \\\n    args[1] = L;       \\\n  }\n\n\n#define DO_DEPTH       \\\n    args[0] = CUR.top;\n\n\n#define DO_CINDEX                                  \\\n  {                                                \\\n    FT_Long  L;                                    \\\n                                                   \\\n                                                   \\\n    L = args[0];                                   \\\n                                                   \\\n    if ( L <= 0 || L > CUR.args )                  \\\n    {                                              \\\n      if ( CUR.pedantic_hinting )                  \\\n        CUR.error = FT_THROW( Invalid_Reference ); \\\n      args[0] = 0;                                 \\\n    }                                              \\\n    else                                           \\\n      args[0] = CUR.stack[CUR.args - L];           \\\n  }\n\n\n#define DO_JROT                                                   \\\n    if ( args[1] != 0 )                                           \\\n    {                                                             \\\n      if ( args[0] == 0 && CUR.args == 0 )                        \\\n        CUR.error = FT_THROW( Bad_Argument );                     \\\n      CUR.IP += args[0];                                          \\\n      if ( CUR.IP < 0                                          || \\\n           ( CUR.callTop > 0                                 &&   \\\n             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \\\n        CUR.error = FT_THROW( Bad_Argument );                     \\\n      CUR.step_ins = FALSE;                                       \\\n    }\n\n\n#define DO_JMPR                                                 \\\n    if ( args[0] == 0 && CUR.args == 0 )                        \\\n      CUR.error = FT_THROW( Bad_Argument );                     \\\n    CUR.IP += args[0];                                          \\\n    if ( CUR.IP < 0                                          || \\\n         ( CUR.callTop > 0                                 &&   \\\n           CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \\\n      CUR.error = FT_THROW( Bad_Argument );                     \\\n    CUR.step_ins = FALSE;\n\n\n#define DO_JROF                                                   \\\n    if ( args[1] == 0 )                                           \\\n    {                                                             \\\n      if ( args[0] == 0 && CUR.args == 0 )                        \\\n        CUR.error = FT_THROW( Bad_Argument );                     \\\n      CUR.IP += args[0];                                          \\\n      if ( CUR.IP < 0                                          || \\\n           ( CUR.callTop > 0                                 &&   \\\n             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \\\n        CUR.error = FT_THROW( Bad_Argument );                     \\\n      CUR.step_ins = FALSE;                                       \\\n    }\n\n\n#define DO_LT                        \\\n    args[0] = ( args[0] < args[1] );\n\n\n#define DO_LTEQ                       \\\n    args[0] = ( args[0] <= args[1] );\n\n\n#define DO_GT                        \\\n    args[0] = ( args[0] > args[1] );\n\n\n#define DO_GTEQ                       \\\n    args[0] = ( args[0] >= args[1] );\n\n\n#define DO_EQ                         \\\n    args[0] = ( args[0] == args[1] );\n\n\n#define DO_NEQ                        \\\n    args[0] = ( args[0] != args[1] );\n\n\n#define DO_ODD                                                  \\\n    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );\n\n\n#define DO_EVEN                                                \\\n    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );\n\n\n#define DO_AND                        \\\n    args[0] = ( args[0] && args[1] );\n\n\n#define DO_OR                         \\\n    args[0] = ( args[0] || args[1] );\n\n\n#define DO_NOT          \\\n    args[0] = !args[0];\n\n\n#define DO_ADD          \\\n    args[0] += args[1];\n\n\n#define DO_SUB          \\\n    args[0] -= args[1];\n\n\n#define DO_DIV                                               \\\n    if ( args[1] == 0 )                                      \\\n      CUR.error = FT_THROW( Divide_By_Zero );                \\\n    else                                                     \\\n      args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] );\n\n\n#define DO_MUL                                    \\\n    args[0] = FT_MulDiv( args[0], args[1], 64L );\n\n\n#define DO_ABS                   \\\n    args[0] = FT_ABS( args[0] );\n\n\n#define DO_NEG          \\\n    args[0] = -args[0];\n\n\n#define DO_FLOOR    \\\n    args[0] = FT_PIX_FLOOR( args[0] );\n\n\n#define DO_CEILING                    \\\n    args[0] = FT_PIX_CEIL( args[0] );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n#define DO_RS                                             \\\n   {                                                      \\\n     FT_ULong  I = (FT_ULong)args[0];                     \\\n                                                          \\\n                                                          \\\n     if ( BOUNDSL( I, CUR.storeSize ) )                   \\\n     {                                                    \\\n       if ( CUR.pedantic_hinting )                        \\\n         ARRAY_BOUND_ERROR;                               \\\n       else                                               \\\n         args[0] = 0;                                     \\\n     }                                                    \\\n     else                                                 \\\n     {                                                    \\\n       /* subpixel hinting - avoid Typeman Dstroke and */ \\\n       /* IStroke and Vacuform rounds                  */ \\\n                                                          \\\n       if ( CUR.ignore_x_mode                          && \\\n            ( ( I == 24                            &&     \\\n                ( CUR.face->sph_found_func_flags &        \\\n                  ( SPH_FDEF_SPACING_1 |                  \\\n                    SPH_FDEF_SPACING_2 )         ) ) ||   \\\n              ( I == 22                      &&           \\\n                ( CUR.sph_in_func_flags    &              \\\n                  SPH_FDEF_TYPEMAN_STROKES ) )       ||   \\\n              ( I == 8                             &&     \\\n                ( CUR.face->sph_found_func_flags &        \\\n                  SPH_FDEF_VACUFORM_ROUND_1      ) &&     \\\n                  CUR.iup_called                   ) ) )  \\\n         args[0] = 0;                                     \\\n       else                                               \\\n         args[0] = CUR.storage[I];                        \\\n     }                                                    \\\n   }\n\n#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n#define DO_RS                           \\\n   {                                    \\\n     FT_ULong  I = (FT_ULong)args[0];   \\\n                                        \\\n                                        \\\n     if ( BOUNDSL( I, CUR.storeSize ) ) \\\n     {                                  \\\n       if ( CUR.pedantic_hinting )      \\\n       {                                \\\n         ARRAY_BOUND_ERROR;             \\\n       }                                \\\n       else                             \\\n         args[0] = 0;                   \\\n     }                                  \\\n     else                               \\\n       args[0] = CUR.storage[I];        \\\n   }\n\n#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n#define DO_WS                           \\\n   {                                    \\\n     FT_ULong  I = (FT_ULong)args[0];   \\\n                                        \\\n                                        \\\n     if ( BOUNDSL( I, CUR.storeSize ) ) \\\n     {                                  \\\n       if ( CUR.pedantic_hinting )      \\\n       {                                \\\n         ARRAY_BOUND_ERROR;             \\\n       }                                \\\n     }                                  \\\n     else                               \\\n       CUR.storage[I] = args[1];        \\\n   }\n\n\n#define DO_RCVT                          \\\n   {                                     \\\n     FT_ULong  I = (FT_ULong)args[0];    \\\n                                         \\\n                                         \\\n     if ( BOUNDSL( I, CUR.cvtSize ) )    \\\n     {                                   \\\n       if ( CUR.pedantic_hinting )       \\\n       {                                 \\\n         ARRAY_BOUND_ERROR;              \\\n       }                                 \\\n       else                              \\\n         args[0] = 0;                    \\\n     }                                   \\\n     else                                \\\n       args[0] = CUR_Func_read_cvt( I ); \\\n   }\n\n\n#define DO_WCVTP                         \\\n   {                                     \\\n     FT_ULong  I = (FT_ULong)args[0];    \\\n                                         \\\n                                         \\\n     if ( BOUNDSL( I, CUR.cvtSize ) )    \\\n     {                                   \\\n       if ( CUR.pedantic_hinting )       \\\n       {                                 \\\n         ARRAY_BOUND_ERROR;              \\\n       }                                 \\\n     }                                   \\\n     else                                \\\n       CUR_Func_write_cvt( I, args[1] ); \\\n   }\n\n\n#define DO_WCVTF                                                \\\n   {                                                            \\\n     FT_ULong  I = (FT_ULong)args[0];                           \\\n                                                                \\\n                                                                \\\n     if ( BOUNDSL( I, CUR.cvtSize ) )                           \\\n     {                                                          \\\n       if ( CUR.pedantic_hinting )                              \\\n       {                                                        \\\n         ARRAY_BOUND_ERROR;                                     \\\n       }                                                        \\\n     }                                                          \\\n     else                                                       \\\n       CUR.cvt[I] = FT_MulFix( args[1], CUR.tt_metrics.scale ); \\\n   }\n\n\n#define DO_DEBUG                          \\\n    CUR.error = FT_THROW( Debug_OpCode );\n\n\n#define DO_ROUND                                                   \\\n    args[0] = CUR_Func_round(                                      \\\n                args[0],                                           \\\n                CUR.tt_metrics.compensations[CUR.opcode - 0x68] );\n\n\n#define DO_NROUND                                                            \\\n    args[0] = ROUND_None( args[0],                                           \\\n                          CUR.tt_metrics.compensations[CUR.opcode - 0x6C] );\n\n\n#define DO_MAX               \\\n    if ( args[1] > args[0] ) \\\n      args[0] = args[1];\n\n\n#define DO_MIN               \\\n    if ( args[1] < args[0] ) \\\n      args[0] = args[1];\n\n\n#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH\n\n\n#undef  ARRAY_BOUND_ERROR\n#define ARRAY_BOUND_ERROR                        \\\n    {                                            \\\n      CUR.error = FT_THROW( Invalid_Reference ); \\\n      return;                                    \\\n    }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SVTCA[a]:     Set (F and P) Vectors to Coordinate Axis                */\n  /* Opcode range: 0x00-0x01                                               */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_SVTCA( INS_ARG )\n  {\n    DO_SVTCA\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SPVTCA[a]:    Set PVector to Coordinate Axis                          */\n  /* Opcode range: 0x02-0x03                                               */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_SPVTCA( INS_ARG )\n  {\n    DO_SPVTCA\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SFVTCA[a]:    Set FVector to Coordinate Axis                          */\n  /* Opcode range: 0x04-0x05                                               */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_SFVTCA( INS_ARG )\n  {\n    DO_SFVTCA\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SPVTL[a]:     Set PVector To Line                                     */\n  /* Opcode range: 0x06-0x07                                               */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_SPVTL( INS_ARG )\n  {\n    DO_SPVTL\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SFVTL[a]:     Set FVector To Line                                     */\n  /* Opcode range: 0x08-0x09                                               */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_SFVTL( INS_ARG )\n  {\n    DO_SFVTL\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SFVTPV[]:     Set FVector To PVector                                  */\n  /* Opcode range: 0x0E                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_SFVTPV( INS_ARG )\n  {\n    DO_SFVTPV\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SPVFS[]:      Set PVector From Stack                                  */\n  /* Opcode range: 0x0A                                                    */\n  /* Stack:        f2.14 f2.14 -->                                         */\n  /*                                                                       */\n  static void\n  Ins_SPVFS( INS_ARG )\n  {\n    DO_SPVFS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SFVFS[]:      Set FVector From Stack                                  */\n  /* Opcode range: 0x0B                                                    */\n  /* Stack:        f2.14 f2.14 -->                                         */\n  /*                                                                       */\n  static void\n  Ins_SFVFS( INS_ARG )\n  {\n    DO_SFVFS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GPV[]:        Get Projection Vector                                   */\n  /* Opcode range: 0x0C                                                    */\n  /* Stack:        ef2.14 --> ef2.14                                       */\n  /*                                                                       */\n  static void\n  Ins_GPV( INS_ARG )\n  {\n    DO_GPV\n  }\n\n\n  /*************************************************************************/\n  /* GFV[]:        Get Freedom Vector                                      */\n  /* Opcode range: 0x0D                                                    */\n  /* Stack:        ef2.14 --> ef2.14                                       */\n  /*                                                                       */\n  static void\n  Ins_GFV( INS_ARG )\n  {\n    DO_GFV\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SRP0[]:       Set Reference Point 0                                   */\n  /* Opcode range: 0x10                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SRP0( INS_ARG )\n  {\n    DO_SRP0\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SRP1[]:       Set Reference Point 1                                   */\n  /* Opcode range: 0x11                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SRP1( INS_ARG )\n  {\n    DO_SRP1\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SRP2[]:       Set Reference Point 2                                   */\n  /* Opcode range: 0x12                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SRP2( INS_ARG )\n  {\n    DO_SRP2\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RTHG[]:       Round To Half Grid                                      */\n  /* Opcode range: 0x19                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RTHG( INS_ARG )\n  {\n    DO_RTHG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RTG[]:        Round To Grid                                           */\n  /* Opcode range: 0x18                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RTG( INS_ARG )\n  {\n    DO_RTG\n  }\n\n\n  /*************************************************************************/\n  /* RTDG[]:       Round To Double Grid                                    */\n  /* Opcode range: 0x3D                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RTDG( INS_ARG )\n  {\n    DO_RTDG\n  }\n\n\n  /*************************************************************************/\n  /* RUTG[]:       Round Up To Grid                                        */\n  /* Opcode range: 0x7C                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RUTG( INS_ARG )\n  {\n    DO_RUTG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RDTG[]:       Round Down To Grid                                      */\n  /* Opcode range: 0x7D                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_RDTG( INS_ARG )\n  {\n    DO_RDTG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ROFF[]:       Round OFF                                               */\n  /* Opcode range: 0x7A                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_ROFF( INS_ARG )\n  {\n    DO_ROFF\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SROUND[]:     Super ROUND                                             */\n  /* Opcode range: 0x76                                                    */\n  /* Stack:        Eint8 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_SROUND( INS_ARG )\n  {\n    DO_SROUND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* S45ROUND[]:   Super ROUND 45 degrees                                  */\n  /* Opcode range: 0x77                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_S45ROUND( INS_ARG )\n  {\n    DO_S45ROUND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SLOOP[]:      Set LOOP variable                                       */\n  /* Opcode range: 0x17                                                    */\n  /* Stack:        int32? -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SLOOP( INS_ARG )\n  {\n    DO_SLOOP\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SMD[]:        Set Minimum Distance                                    */\n  /* Opcode range: 0x1A                                                    */\n  /* Stack:        f26.6 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_SMD( INS_ARG )\n  {\n    DO_SMD\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SCVTCI[]:     Set Control Value Table Cut In                          */\n  /* Opcode range: 0x1D                                                    */\n  /* Stack:        f26.6 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_SCVTCI( INS_ARG )\n  {\n    DO_SCVTCI\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SSWCI[]:      Set Single Width Cut In                                 */\n  /* Opcode range: 0x1E                                                    */\n  /* Stack:        f26.6 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_SSWCI( INS_ARG )\n  {\n    DO_SSWCI\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SSW[]:        Set Single Width                                        */\n  /* Opcode range: 0x1F                                                    */\n  /* Stack:        int32? -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SSW( INS_ARG )\n  {\n    DO_SSW\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPON[]:     Set auto-FLIP to ON                                     */\n  /* Opcode range: 0x4D                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_FLIPON( INS_ARG )\n  {\n    DO_FLIPON\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPOFF[]:    Set auto-FLIP to OFF                                    */\n  /* Opcode range: 0x4E                                                    */\n  /* Stack: -->                                                            */\n  /*                                                                       */\n  static void\n  Ins_FLIPOFF( INS_ARG )\n  {\n    DO_FLIPOFF\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SANGW[]:      Set ANGle Weight                                        */\n  /* Opcode range: 0x7E                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SANGW( INS_ARG )\n  {\n    /* instruction not supported anymore */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SDB[]:        Set Delta Base                                          */\n  /* Opcode range: 0x5E                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SDB( INS_ARG )\n  {\n    DO_SDB\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SDS[]:        Set Delta Shift                                         */\n  /* Opcode range: 0x5F                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SDS( INS_ARG )\n  {\n    DO_SDS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MPPEM[]:      Measure Pixel Per EM                                    */\n  /* Opcode range: 0x4B                                                    */\n  /* Stack:        --> Euint16                                             */\n  /*                                                                       */\n  static void\n  Ins_MPPEM( INS_ARG )\n  {\n    DO_MPPEM\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MPS[]:        Measure Point Size                                      */\n  /* Opcode range: 0x4C                                                    */\n  /* Stack:        --> Euint16                                             */\n  /*                                                                       */\n  static void\n  Ins_MPS( INS_ARG )\n  {\n    DO_MPS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DUP[]:        DUPlicate the top stack's element                       */\n  /* Opcode range: 0x20                                                    */\n  /* Stack:        StkElt --> StkElt StkElt                                */\n  /*                                                                       */\n  static void\n  Ins_DUP( INS_ARG )\n  {\n    DO_DUP\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* POP[]:        POP the stack's top element                             */\n  /* Opcode range: 0x21                                                    */\n  /* Stack:        StkElt -->                                              */\n  /*                                                                       */\n  static void\n  Ins_POP( INS_ARG )\n  {\n    /* nothing to do */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CLEAR[]:      CLEAR the entire stack                                  */\n  /* Opcode range: 0x22                                                    */\n  /* Stack:        StkElt... -->                                           */\n  /*                                                                       */\n  static void\n  Ins_CLEAR( INS_ARG )\n  {\n    DO_CLEAR\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SWAP[]:       SWAP the stack's top two elements                       */\n  /* Opcode range: 0x23                                                    */\n  /* Stack:        2 * StkElt --> 2 * StkElt                               */\n  /*                                                                       */\n  static void\n  Ins_SWAP( INS_ARG )\n  {\n    DO_SWAP\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DEPTH[]:      return the stack DEPTH                                  */\n  /* Opcode range: 0x24                                                    */\n  /* Stack:        --> uint32                                              */\n  /*                                                                       */\n  static void\n  Ins_DEPTH( INS_ARG )\n  {\n    DO_DEPTH\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CINDEX[]:     Copy INDEXed element                                    */\n  /* Opcode range: 0x25                                                    */\n  /* Stack:        int32 --> StkElt                                        */\n  /*                                                                       */\n  static void\n  Ins_CINDEX( INS_ARG )\n  {\n    DO_CINDEX\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* EIF[]:        End IF                                                  */\n  /* Opcode range: 0x59                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_EIF( INS_ARG )\n  {\n    /* nothing to do */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* JROT[]:       Jump Relative On True                                   */\n  /* Opcode range: 0x78                                                    */\n  /* Stack:        StkElt int32 -->                                        */\n  /*                                                                       */\n  static void\n  Ins_JROT( INS_ARG )\n  {\n    DO_JROT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* JMPR[]:       JuMP Relative                                           */\n  /* Opcode range: 0x1C                                                    */\n  /* Stack:        int32 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_JMPR( INS_ARG )\n  {\n    DO_JMPR\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* JROF[]:       Jump Relative On False                                  */\n  /* Opcode range: 0x79                                                    */\n  /* Stack:        StkElt int32 -->                                        */\n  /*                                                                       */\n  static void\n  Ins_JROF( INS_ARG )\n  {\n    DO_JROF\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LT[]:         Less Than                                               */\n  /* Opcode range: 0x50                                                    */\n  /* Stack:        int32? int32? --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_LT( INS_ARG )\n  {\n    DO_LT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LTEQ[]:       Less Than or EQual                                      */\n  /* Opcode range: 0x51                                                    */\n  /* Stack:        int32? int32? --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_LTEQ( INS_ARG )\n  {\n    DO_LTEQ\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GT[]:         Greater Than                                            */\n  /* Opcode range: 0x52                                                    */\n  /* Stack:        int32? int32? --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_GT( INS_ARG )\n  {\n    DO_GT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GTEQ[]:       Greater Than or EQual                                   */\n  /* Opcode range: 0x53                                                    */\n  /* Stack:        int32? int32? --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_GTEQ( INS_ARG )\n  {\n    DO_GTEQ\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* EQ[]:         EQual                                                   */\n  /* Opcode range: 0x54                                                    */\n  /* Stack:        StkElt StkElt --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_EQ( INS_ARG )\n  {\n    DO_EQ\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NEQ[]:        Not EQual                                               */\n  /* Opcode range: 0x55                                                    */\n  /* Stack:        StkElt StkElt --> bool                                  */\n  /*                                                                       */\n  static void\n  Ins_NEQ( INS_ARG )\n  {\n    DO_NEQ\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ODD[]:        Is ODD                                                  */\n  /* Opcode range: 0x56                                                    */\n  /* Stack:        f26.6 --> bool                                          */\n  /*                                                                       */\n  static void\n  Ins_ODD( INS_ARG )\n  {\n    DO_ODD\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* EVEN[]:       Is EVEN                                                 */\n  /* Opcode range: 0x57                                                    */\n  /* Stack:        f26.6 --> bool                                          */\n  /*                                                                       */\n  static void\n  Ins_EVEN( INS_ARG )\n  {\n    DO_EVEN\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* AND[]:        logical AND                                             */\n  /* Opcode range: 0x5A                                                    */\n  /* Stack:        uint32 uint32 --> uint32                                */\n  /*                                                                       */\n  static void\n  Ins_AND( INS_ARG )\n  {\n    DO_AND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* OR[]:         logical OR                                              */\n  /* Opcode range: 0x5B                                                    */\n  /* Stack:        uint32 uint32 --> uint32                                */\n  /*                                                                       */\n  static void\n  Ins_OR( INS_ARG )\n  {\n    DO_OR\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NOT[]:        logical NOT                                             */\n  /* Opcode range: 0x5C                                                    */\n  /* Stack:        StkElt --> uint32                                       */\n  /*                                                                       */\n  static void\n  Ins_NOT( INS_ARG )\n  {\n    DO_NOT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ADD[]:        ADD                                                     */\n  /* Opcode range: 0x60                                                    */\n  /* Stack:        f26.6 f26.6 --> f26.6                                   */\n  /*                                                                       */\n  static void\n  Ins_ADD( INS_ARG )\n  {\n    DO_ADD\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SUB[]:        SUBtract                                                */\n  /* Opcode range: 0x61                                                    */\n  /* Stack:        f26.6 f26.6 --> f26.6                                   */\n  /*                                                                       */\n  static void\n  Ins_SUB( INS_ARG )\n  {\n    DO_SUB\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DIV[]:        DIVide                                                  */\n  /* Opcode range: 0x62                                                    */\n  /* Stack:        f26.6 f26.6 --> f26.6                                   */\n  /*                                                                       */\n  static void\n  Ins_DIV( INS_ARG )\n  {\n    DO_DIV\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MUL[]:        MULtiply                                                */\n  /* Opcode range: 0x63                                                    */\n  /* Stack:        f26.6 f26.6 --> f26.6                                   */\n  /*                                                                       */\n  static void\n  Ins_MUL( INS_ARG )\n  {\n    DO_MUL\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ABS[]:        ABSolute value                                          */\n  /* Opcode range: 0x64                                                    */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_ABS( INS_ARG )\n  {\n    DO_ABS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NEG[]:        NEGate                                                  */\n  /* Opcode range: 0x65                                                    */\n  /* Stack: f26.6 --> f26.6                                                */\n  /*                                                                       */\n  static void\n  Ins_NEG( INS_ARG )\n  {\n    DO_NEG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLOOR[]:      FLOOR                                                   */\n  /* Opcode range: 0x66                                                    */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_FLOOR( INS_ARG )\n  {\n    DO_FLOOR\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CEILING[]:    CEILING                                                 */\n  /* Opcode range: 0x67                                                    */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_CEILING( INS_ARG )\n  {\n    DO_CEILING\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RS[]:         Read Store                                              */\n  /* Opcode range: 0x43                                                    */\n  /* Stack:        uint32 --> uint32                                       */\n  /*                                                                       */\n  static void\n  Ins_RS( INS_ARG )\n  {\n    DO_RS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* WS[]:         Write Store                                             */\n  /* Opcode range: 0x42                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_WS( INS_ARG )\n  {\n    DO_WS\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* WCVTP[]:      Write CVT in Pixel units                                */\n  /* Opcode range: 0x44                                                    */\n  /* Stack:        f26.6 uint32 -->                                        */\n  /*                                                                       */\n  static void\n  Ins_WCVTP( INS_ARG )\n  {\n    DO_WCVTP\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* WCVTF[]:      Write CVT in Funits                                     */\n  /* Opcode range: 0x70                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_WCVTF( INS_ARG )\n  {\n    DO_WCVTF\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RCVT[]:       Read CVT                                                */\n  /* Opcode range: 0x45                                                    */\n  /* Stack:        uint32 --> f26.6                                        */\n  /*                                                                       */\n  static void\n  Ins_RCVT( INS_ARG )\n  {\n    DO_RCVT\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* AA[]:         Adjust Angle                                            */\n  /* Opcode range: 0x7F                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_AA( INS_ARG )\n  {\n    /* intentionally no longer supported */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DEBUG[]:      DEBUG.  Unsupported.                                    */\n  /* Opcode range: 0x4F                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  /* Note: The original instruction pops a value from the stack.           */\n  /*                                                                       */\n  static void\n  Ins_DEBUG( INS_ARG )\n  {\n    DO_DEBUG\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ROUND[ab]:    ROUND value                                             */\n  /* Opcode range: 0x68-0x6B                                               */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_ROUND( INS_ARG )\n  {\n    DO_ROUND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NROUND[ab]:   No ROUNDing of value                                    */\n  /* Opcode range: 0x6C-0x6F                                               */\n  /* Stack:        f26.6 --> f26.6                                         */\n  /*                                                                       */\n  static void\n  Ins_NROUND( INS_ARG )\n  {\n    DO_NROUND\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MAX[]:        MAXimum                                                 */\n  /* Opcode range: 0x68                                                    */\n  /* Stack:        int32? int32? --> int32                                 */\n  /*                                                                       */\n  static void\n  Ins_MAX( INS_ARG )\n  {\n    DO_MAX\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MIN[]:        MINimum                                                 */\n  /* Opcode range: 0x69                                                    */\n  /* Stack:        int32? int32? --> int32                                 */\n  /*                                                                       */\n  static void\n  Ins_MIN( INS_ARG )\n  {\n    DO_MIN\n  }\n\n\n#endif  /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The following functions are called as is within the switch statement. */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MINDEX[]:     Move INDEXed element                                    */\n  /* Opcode range: 0x26                                                    */\n  /* Stack:        int32? --> StkElt                                       */\n  /*                                                                       */\n  static void\n  Ins_MINDEX( INS_ARG )\n  {\n    FT_Long  L, K;\n\n\n    L = args[0];\n\n    if ( L <= 0 || L > CUR.args )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n    }\n    else\n    {\n      K = CUR.stack[CUR.args - L];\n\n      FT_ARRAY_MOVE( &CUR.stack[CUR.args - L    ],\n                     &CUR.stack[CUR.args - L + 1],\n                     ( L - 1 ) );\n\n      CUR.stack[CUR.args - 1] = K;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ROLL[]:       ROLL top three elements                                 */\n  /* Opcode range: 0x8A                                                    */\n  /* Stack:        3 * StkElt --> 3 * StkElt                               */\n  /*                                                                       */\n  static void\n  Ins_ROLL( INS_ARG )\n  {\n    FT_Long  A, B, C;\n\n    FT_UNUSED_EXEC;\n\n\n    A = args[2];\n    B = args[1];\n    C = args[0];\n\n    args[2] = C;\n    args[1] = A;\n    args[0] = B;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MANAGING THE FLOW OF CONTROL                                          */\n  /*                                                                       */\n  /*   Instructions appear in the specification's order.                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static FT_Bool\n  SkipCode( EXEC_OP )\n  {\n    CUR.IP += CUR.length;\n\n    if ( CUR.IP < CUR.codeSize )\n    {\n      CUR.opcode = CUR.code[CUR.IP];\n\n      CUR.length = opcode_length[CUR.opcode];\n      if ( CUR.length < 0 )\n      {\n        if ( CUR.IP + 1 >= CUR.codeSize )\n          goto Fail_Overflow;\n        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];\n      }\n\n      if ( CUR.IP + CUR.length <= CUR.codeSize )\n        return SUCCESS;\n    }\n\n  Fail_Overflow:\n    CUR.error = FT_THROW( Code_Overflow );\n    return FAILURE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* IF[]:         IF test                                                 */\n  /* Opcode range: 0x58                                                    */\n  /* Stack:        StkElt -->                                              */\n  /*                                                                       */\n  static void\n  Ins_IF( INS_ARG )\n  {\n    FT_Int   nIfs;\n    FT_Bool  Out;\n\n\n    if ( args[0] != 0 )\n      return;\n\n    nIfs = 1;\n    Out = 0;\n\n    do\n    {\n      if ( SKIP_Code() == FAILURE )\n        return;\n\n      switch ( CUR.opcode )\n      {\n      case 0x58:      /* IF */\n        nIfs++;\n        break;\n\n      case 0x1B:      /* ELSE */\n        Out = FT_BOOL( nIfs == 1 );\n        break;\n\n      case 0x59:      /* EIF */\n        nIfs--;\n        Out = FT_BOOL( nIfs == 0 );\n        break;\n      }\n    } while ( Out == 0 );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ELSE[]:       ELSE                                                    */\n  /* Opcode range: 0x1B                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_ELSE( INS_ARG )\n  {\n    FT_Int  nIfs;\n\n    FT_UNUSED_ARG;\n\n\n    nIfs = 1;\n\n    do\n    {\n      if ( SKIP_Code() == FAILURE )\n        return;\n\n      switch ( CUR.opcode )\n      {\n      case 0x58:    /* IF */\n        nIfs++;\n        break;\n\n      case 0x59:    /* EIF */\n        nIfs--;\n        break;\n      }\n    } while ( nIfs != 0 );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS                         */\n  /*                                                                       */\n  /*   Instructions appear in the specification's order.                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FDEF[]:       Function DEFinition                                     */\n  /* Opcode range: 0x2C                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_FDEF( INS_ARG )\n  {\n    FT_ULong       n;\n    TT_DefRecord*  rec;\n    TT_DefRecord*  limit;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* arguments to opcodes are skipped by `SKIP_Code' */\n    FT_Byte    opcode_pattern[7][12] = {\n                 /* #0 inline delta function 1 */\n                 {\n                   0x4B, /* PPEM    */\n                   0x53, /* GTEQ    */\n                   0x23, /* SWAP    */\n                   0x4B, /* PPEM    */\n                   0x51, /* LTEQ    */\n                   0x5A, /* AND     */\n                   0x58, /* IF      */\n                   0x38, /*   SHPIX */\n                   0x1B, /* ELSE    */\n                   0x21, /*   POP   */\n                   0x21, /*   POP   */\n                   0x59  /* EIF     */\n                 },\n                 /* #1 inline delta function 2 */\n                 {\n                   0x4B, /* PPEM    */\n                   0x54, /* EQ      */\n                   0x58, /* IF      */\n                   0x38, /*   SHPIX */\n                   0x1B, /* ELSE    */\n                   0x21, /*   POP   */\n                   0x21, /*   POP   */\n                   0x59  /* EIF     */\n                 },\n                 /* #2 diagonal stroke function */\n                 {\n                   0x20, /* DUP     */\n                   0x20, /* DUP     */\n                   0xB0, /* PUSHB_1 */\n                         /*   1     */\n                   0x60, /* ADD     */\n                   0x46, /* GC_cur  */\n                   0xB0, /* PUSHB_1 */\n                         /*   64    */\n                   0x23, /* SWAP    */\n                   0x42  /* WS      */\n                 },\n                 /* #3 VacuFormRound function */\n                 {\n                   0x45, /* RCVT    */\n                   0x23, /* SWAP    */\n                   0x46, /* GC_cur  */\n                   0x60, /* ADD     */\n                   0x20, /* DUP     */\n                   0xB0  /* PUSHB_1 */\n                         /*   38    */\n                 },\n                 /* #4 TTFautohint bytecode (old) */\n                 {\n                   0x20, /* DUP     */\n                   0x64, /* ABS     */\n                   0xB0, /* PUSHB_1 */\n                         /*   32    */\n                   0x60, /* ADD     */\n                   0x66, /* FLOOR   */\n                   0x23, /* SWAP    */\n                   0xB0  /* PUSHB_1 */\n                 },\n                 /* #5 spacing function 1 */\n                 {\n                   0x01, /* SVTCA_x */\n                   0xB0, /* PUSHB_1 */\n                         /*   24    */\n                   0x43, /* RS      */\n                   0x58  /* IF      */\n                 },\n                 /* #6 spacing function 2 */\n                 {\n                   0x01, /* SVTCA_x */\n                   0x18, /* RTG     */\n                   0xB0, /* PUSHB_1 */\n                         /*   24    */\n                   0x43, /* RS      */\n                   0x58  /* IF      */\n                 },\n               };\n    FT_UShort  opcode_patterns   = 7;\n    FT_UShort  opcode_pointer[7] = {  0, 0, 0, 0, 0, 0, 0 };\n    FT_UShort  opcode_size[7]    = { 12, 8, 8, 6, 7, 4, 5 };\n    FT_UShort  i;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n    /* some font programs are broken enough to redefine functions! */\n    /* We will then parse the current table.                       */\n\n    rec   = CUR.FDefs;\n    limit = rec + CUR.numFDefs;\n    n     = args[0];\n\n    for ( ; rec < limit; rec++ )\n    {\n      if ( rec->opc == n )\n        break;\n    }\n\n    if ( rec == limit )\n    {\n      /* check that there is enough room for new functions */\n      if ( CUR.numFDefs >= CUR.maxFDefs )\n      {\n        CUR.error = FT_THROW( Too_Many_Function_Defs );\n        return;\n      }\n      CUR.numFDefs++;\n    }\n\n    /* Although FDEF takes unsigned 32-bit integer,  */\n    /* func # must be within unsigned 16-bit integer */\n    if ( n > 0xFFFFU )\n    {\n      CUR.error = FT_THROW( Too_Many_Function_Defs );\n      return;\n    }\n\n    rec->range          = CUR.curRange;\n    rec->opc            = (FT_UInt16)n;\n    rec->start          = CUR.IP + 1;\n    rec->active         = TRUE;\n    rec->inline_delta   = FALSE;\n    rec->sph_fdef_flags = 0x0000;\n\n    if ( n > CUR.maxFunc )\n      CUR.maxFunc = (FT_UInt16)n;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* We don't know for sure these are typeman functions, */\n    /* however they are only active when RS 22 is called   */\n    if ( n >= 64 && n <= 66 )\n      rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES;\n#endif\n\n    /* Now skip the whole function definition. */\n    /* We don't allow nested IDEFS & FDEFs.    */\n\n    while ( SKIP_Code() == SUCCESS )\n    {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n      for ( i = 0; i < opcode_patterns; i++ )\n      {\n        if ( opcode_pointer[i] < opcode_size[i]                 &&\n             CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )\n        {\n          opcode_pointer[i] += 1;\n\n          if ( opcode_pointer[i] == opcode_size[i] )\n          {\n            FT_TRACE7(( \"sph: Function %d, opcode ptrn: %d, %s %s\\n\",\n                        i, n,\n                        CUR.face->root.family_name,\n                        CUR.face->root.style_name ));\n\n            switch ( i )\n            {\n            case 0:\n              rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_1;\n              CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1;\n              break;\n\n            case 1:\n              rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_2;\n              CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2;\n              break;\n\n            case 2:\n              switch ( n )\n              {\n              /* needs to be implemented still */\n              case 58:\n                rec->sph_fdef_flags            |= SPH_FDEF_DIAGONAL_STROKE;\n                CUR.face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE;\n              }\n              break;\n\n            case 3:\n              switch ( n )\n              {\n              case 0:\n                rec->sph_fdef_flags            |= SPH_FDEF_VACUFORM_ROUND_1;\n                CUR.face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1;\n              }\n              break;\n\n            case 4:\n              /* probably not necessary to detect anymore */\n              rec->sph_fdef_flags            |= SPH_FDEF_TTFAUTOHINT_1;\n              CUR.face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1;\n              break;\n\n            case 5:\n              switch ( n )\n              {\n              case 0:\n              case 1:\n              case 2:\n              case 4:\n              case 7:\n              case 8:\n                rec->sph_fdef_flags            |= SPH_FDEF_SPACING_1;\n                CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_1;\n              }\n              break;\n\n            case 6:\n              switch ( n )\n              {\n              case 0:\n              case 1:\n              case 2:\n              case 4:\n              case 7:\n              case 8:\n                rec->sph_fdef_flags            |= SPH_FDEF_SPACING_2;\n                CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_2;\n              }\n              break;\n            }\n            opcode_pointer[i] = 0;\n          }\n        }\n\n        else\n          opcode_pointer[i] = 0;\n      }\n\n      /* Set sph_compatibility_mode only when deltas are detected */\n      CUR.face->sph_compatibility_mode =\n        ( ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) |\n          ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      switch ( CUR.opcode )\n      {\n      case 0x89:    /* IDEF */\n      case 0x2C:    /* FDEF */\n        CUR.error = FT_THROW( Nested_DEFS );\n        return;\n\n      case 0x2D:   /* ENDF */\n        rec->end = CUR.IP;\n        return;\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ENDF[]:       END Function definition                                 */\n  /* Opcode range: 0x2D                                                    */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_ENDF( INS_ARG )\n  {\n    TT_CallRec*  pRec;\n\n    FT_UNUSED_ARG;\n\n\n    if ( CUR.callTop <= 0 )     /* We encountered an ENDF without a call */\n    {\n      CUR.error = FT_THROW( ENDF_In_Exec_Stream );\n      return;\n    }\n\n    CUR.callTop--;\n\n    pRec = &CUR.callStack[CUR.callTop];\n\n    pRec->Cur_Count--;\n\n    CUR.step_ins = FALSE;\n\n    if ( pRec->Cur_Count > 0 )\n    {\n      CUR.callTop++;\n      CUR.IP = pRec->Cur_Restart;\n    }\n    else\n      /* Loop through the current function */\n      INS_Goto_CodeRange( pRec->Caller_Range,\n                          pRec->Caller_IP );\n\n    /* Exit the current call frame.                      */\n\n    /* NOTE: If the last instruction of a program is a   */\n    /*       CALL or LOOPCALL, the return address is     */\n    /*       always out of the code range.  This is a    */\n    /*       valid address, and it is why we do not test */\n    /*       the result of Ins_Goto_CodeRange() here!    */\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CALL[]:       CALL function                                           */\n  /* Opcode range: 0x2B                                                    */\n  /* Stack:        uint32? -->                                             */\n  /*                                                                       */\n  static void\n  Ins_CALL( INS_ARG )\n  {\n    FT_ULong       F;\n    TT_CallRec*    pCrec;\n    TT_DefRecord*  def;\n\n\n    /* first of all, check the index */\n\n    F = args[0];\n    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )\n      goto Fail;\n\n    /* Except for some old Apple fonts, all functions in a TrueType */\n    /* font are defined in increasing order, starting from 0.  This */\n    /* means that we normally have                                  */\n    /*                                                              */\n    /*    CUR.maxFunc+1 == CUR.numFDefs                             */\n    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */\n    /*                                                              */\n    /* If this isn't true, we need to look up the function table.   */\n\n    def = CUR.FDefs + F;\n    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )\n    {\n      /* look up the FDefs table */\n      TT_DefRecord*  limit;\n\n\n      def   = CUR.FDefs;\n      limit = def + CUR.numFDefs;\n\n      while ( def < limit && def->opc != F )\n        def++;\n\n      if ( def == limit )\n        goto Fail;\n    }\n\n    /* check that the function is active */\n    if ( !def->active )\n      goto Fail;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    CUR.sph_in_func_flags &= def->sph_fdef_flags;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* check the call stack */\n    if ( CUR.callTop >= CUR.callSize )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    pCrec = CUR.callStack + CUR.callTop;\n\n    pCrec->Caller_Range = CUR.curRange;\n    pCrec->Caller_IP    = CUR.IP + 1;\n    pCrec->Cur_Count    = 1;\n    pCrec->Cur_Restart  = def->start;\n    pCrec->Cur_End      = def->end;\n\n    CUR.callTop++;\n\n    INS_Goto_CodeRange( def->range,\n                        def->start );\n\n    CUR.step_ins = FALSE;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    CUR.sph_in_func_flags &= !def->sph_fdef_flags;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    return;\n\n  Fail:\n    CUR.error = FT_THROW( Invalid_Reference );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LOOPCALL[]:   LOOP and CALL function                                  */\n  /* Opcode range: 0x2A                                                    */\n  /* Stack:        uint32? Eint16? -->                                     */\n  /*                                                                       */\n  static void\n  Ins_LOOPCALL( INS_ARG )\n  {\n    FT_ULong       F;\n    TT_CallRec*    pCrec;\n    TT_DefRecord*  def;\n\n\n    /* first of all, check the index */\n    F = args[1];\n    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )\n      goto Fail;\n\n    /* Except for some old Apple fonts, all functions in a TrueType */\n    /* font are defined in increasing order, starting from 0.  This */\n    /* means that we normally have                                  */\n    /*                                                              */\n    /*    CUR.maxFunc+1 == CUR.numFDefs                             */\n    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */\n    /*                                                              */\n    /* If this isn't true, we need to look up the function table.   */\n\n    def = CUR.FDefs + F;\n    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )\n    {\n      /* look up the FDefs table */\n      TT_DefRecord*  limit;\n\n\n      def   = CUR.FDefs;\n      limit = def + CUR.numFDefs;\n\n      while ( def < limit && def->opc != F )\n        def++;\n\n      if ( def == limit )\n        goto Fail;\n    }\n\n    /* check that the function is active */\n    if ( !def->active )\n      goto Fail;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    CUR.sph_in_func_flags &= def->sph_fdef_flags;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* check stack */\n    if ( CUR.callTop >= CUR.callSize )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    if ( args[0] > 0 )\n    {\n      pCrec = CUR.callStack + CUR.callTop;\n\n      pCrec->Caller_Range = CUR.curRange;\n      pCrec->Caller_IP    = CUR.IP + 1;\n      pCrec->Cur_Count    = (FT_Int)args[0];\n      pCrec->Cur_Restart  = def->start;\n      pCrec->Cur_End      = def->end;\n\n      CUR.callTop++;\n\n      INS_Goto_CodeRange( def->range, def->start );\n\n      CUR.step_ins = FALSE;\n    }\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    CUR.sph_in_func_flags &= !def->sph_fdef_flags;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    return;\n\n  Fail:\n    CUR.error = FT_THROW( Invalid_Reference );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* IDEF[]:       Instruction DEFinition                                  */\n  /* Opcode range: 0x89                                                    */\n  /* Stack:        Eint8 -->                                               */\n  /*                                                                       */\n  static void\n  Ins_IDEF( INS_ARG )\n  {\n    TT_DefRecord*  def;\n    TT_DefRecord*  limit;\n\n\n    /*  First of all, look for the same function in our table */\n\n    def   = CUR.IDefs;\n    limit = def + CUR.numIDefs;\n\n    for ( ; def < limit; def++ )\n      if ( def->opc == (FT_ULong)args[0] )\n        break;\n\n    if ( def == limit )\n    {\n      /* check that there is enough room for a new instruction */\n      if ( CUR.numIDefs >= CUR.maxIDefs )\n      {\n        CUR.error = FT_THROW( Too_Many_Instruction_Defs );\n        return;\n      }\n      CUR.numIDefs++;\n    }\n\n    /* opcode must be unsigned 8-bit integer */\n    if ( 0 > args[0] || args[0] > 0x00FF )\n    {\n      CUR.error = FT_THROW( Too_Many_Instruction_Defs );\n      return;\n    }\n\n    def->opc    = (FT_Byte)args[0];\n    def->start  = CUR.IP + 1;\n    def->range  = CUR.curRange;\n    def->active = TRUE;\n\n    if ( (FT_ULong)args[0] > CUR.maxIns )\n      CUR.maxIns = (FT_Byte)args[0];\n\n    /* Now skip the whole function definition. */\n    /* We don't allow nested IDEFs & FDEFs.    */\n\n    while ( SKIP_Code() == SUCCESS )\n    {\n      switch ( CUR.opcode )\n      {\n      case 0x89:   /* IDEF */\n      case 0x2C:   /* FDEF */\n        CUR.error = FT_THROW( Nested_DEFS );\n        return;\n      case 0x2D:   /* ENDF */\n        return;\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* PUSHING DATA ONTO THE INTERPRETER STACK                               */\n  /*                                                                       */\n  /*   Instructions appear in the specification's order.                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NPUSHB[]:     PUSH N Bytes                                            */\n  /* Opcode range: 0x40                                                    */\n  /* Stack:        --> uint32...                                           */\n  /*                                                                       */\n  static void\n  Ins_NPUSHB( INS_ARG )\n  {\n    FT_UShort  L, K;\n\n\n    L = (FT_UShort)CUR.code[CUR.IP + 1];\n\n    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    for ( K = 1; K <= L; K++ )\n      args[K - 1] = CUR.code[CUR.IP + K + 1];\n\n    CUR.new_top += L;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* NPUSHW[]:     PUSH N Words                                            */\n  /* Opcode range: 0x41                                                    */\n  /* Stack:        --> int32...                                            */\n  /*                                                                       */\n  static void\n  Ins_NPUSHW( INS_ARG )\n  {\n    FT_UShort  L, K;\n\n\n    L = (FT_UShort)CUR.code[CUR.IP + 1];\n\n    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    CUR.IP += 2;\n\n    for ( K = 0; K < L; K++ )\n      args[K] = GET_ShortIns();\n\n    CUR.step_ins = FALSE;\n    CUR.new_top += L;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* PUSHB[abc]:   PUSH Bytes                                              */\n  /* Opcode range: 0xB0-0xB7                                               */\n  /* Stack:        --> uint32...                                           */\n  /*                                                                       */\n  static void\n  Ins_PUSHB( INS_ARG )\n  {\n    FT_UShort  L, K;\n\n\n    L = (FT_UShort)( CUR.opcode - 0xB0 + 1 );\n\n    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    for ( K = 1; K <= L; K++ )\n      args[K - 1] = CUR.code[CUR.IP + K];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* PUSHW[abc]:   PUSH Words                                              */\n  /* Opcode range: 0xB8-0xBF                                               */\n  /* Stack:        --> int32...                                            */\n  /*                                                                       */\n  static void\n  Ins_PUSHW( INS_ARG )\n  {\n    FT_UShort  L, K;\n\n\n    L = (FT_UShort)( CUR.opcode - 0xB8 + 1 );\n\n    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )\n    {\n      CUR.error = FT_THROW( Stack_Overflow );\n      return;\n    }\n\n    CUR.IP++;\n\n    for ( K = 0; K < L; K++ )\n      args[K] = GET_ShortIns();\n\n    CUR.step_ins = FALSE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MANAGING THE GRAPHICS STATE                                           */\n  /*                                                                       */\n  /*  Instructions appear in the specs' order.                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GC[a]:        Get Coordinate projected onto                           */\n  /* Opcode range: 0x46-0x47                                               */\n  /* Stack:        uint32 --> f26.6                                        */\n  /*                                                                       */\n  /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken     */\n  /*      along the dual projection vector!                                */\n  /*                                                                       */\n  static void\n  Ins_GC( INS_ARG )\n  {\n    FT_ULong    L;\n    FT_F26Dot6  R;\n\n\n    L = (FT_ULong)args[0];\n\n    if ( BOUNDSL( L, CUR.zp2.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      R = 0;\n    }\n    else\n    {\n      if ( CUR.opcode & 1 )\n        R = CUR_fast_dualproj( &CUR.zp2.org[L] );\n      else\n        R = CUR_fast_project( &CUR.zp2.cur[L] );\n    }\n\n    args[0] = R;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SCFS[]:       Set Coordinate From Stack                               */\n  /* Opcode range: 0x48                                                    */\n  /* Stack:        f26.6 uint32 -->                                        */\n  /*                                                                       */\n  /* Formula:                                                              */\n  /*                                                                       */\n  /*   OA := OA + ( value - OA.p )/( f.p ) * f                             */\n  /*                                                                       */\n  static void\n  Ins_SCFS( INS_ARG )\n  {\n    FT_Long    K;\n    FT_UShort  L;\n\n\n    L = (FT_UShort)args[0];\n\n    if ( BOUNDS( L, CUR.zp2.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    K = CUR_fast_project( &CUR.zp2.cur[L] );\n\n    CUR_Func_move( &CUR.zp2, L, args[1] - K );\n\n    /* UNDOCUMENTED!  The MS rasterizer does that with */\n    /* twilight points (confirmed by Greg Hitchcock)   */\n    if ( CUR.GS.gep2 == 0 )\n      CUR.zp2.org[L] = CUR.zp2.cur[L];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MD[a]:        Measure Distance                                        */\n  /* Opcode range: 0x49-0x4A                                               */\n  /* Stack:        uint32 uint32 --> f26.6                                 */\n  /*                                                                       */\n  /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along  */\n  /*                    the dual projection vector.                        */\n  /*                                                                       */\n  /* XXX: UNDOCUMENTED: Flag attributes are inverted!                      */\n  /*                      0 => measure distance in original outline        */\n  /*                      1 => measure distance in grid-fitted outline     */\n  /*                                                                       */\n  /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1!                   */\n  /*                                                                       */\n  static void\n  Ins_MD( INS_ARG )\n  {\n    FT_UShort   K, L;\n    FT_F26Dot6  D;\n\n\n    K = (FT_UShort)args[1];\n    L = (FT_UShort)args[0];\n\n    if ( BOUNDS( L, CUR.zp0.n_points ) ||\n         BOUNDS( K, CUR.zp1.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      D = 0;\n    }\n    else\n    {\n      if ( CUR.opcode & 1 )\n        D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );\n      else\n      {\n        /* XXX: UNDOCUMENTED: twilight zone special case */\n\n        if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )\n        {\n          FT_Vector*  vec1 = CUR.zp0.org + L;\n          FT_Vector*  vec2 = CUR.zp1.org + K;\n\n\n          D = CUR_Func_dualproj( vec1, vec2 );\n        }\n        else\n        {\n          FT_Vector*  vec1 = CUR.zp0.orus + L;\n          FT_Vector*  vec2 = CUR.zp1.orus + K;\n\n\n          if ( CUR.metrics.x_scale == CUR.metrics.y_scale )\n          {\n            /* this should be faster */\n            D = CUR_Func_dualproj( vec1, vec2 );\n            D = FT_MulFix( D, CUR.metrics.x_scale );\n          }\n          else\n          {\n            FT_Vector  vec;\n\n\n            vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );\n            vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );\n\n            D = CUR_fast_dualproj( &vec );\n          }\n        }\n      }\n    }\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */\n    if ( CUR.ignore_x_mode && FT_ABS( D ) == 64 )\n      D += 1;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    args[0] = D;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SDPVTL[a]:    Set Dual PVector to Line                                */\n  /* Opcode range: 0x86-0x87                                               */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_SDPVTL( INS_ARG )\n  {\n    FT_Long    A, B, C;\n    FT_UShort  p1, p2;            /* was FT_Int in pas type ERROR */\n    FT_Int     aOpc = CUR.opcode;\n\n\n    p1 = (FT_UShort)args[1];\n    p2 = (FT_UShort)args[0];\n\n    if ( BOUNDS( p2, CUR.zp1.n_points ) ||\n         BOUNDS( p1, CUR.zp2.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    {\n      FT_Vector* v1 = CUR.zp1.org + p2;\n      FT_Vector* v2 = CUR.zp2.org + p1;\n\n\n      A = v1->x - v2->x;\n      B = v1->y - v2->y;\n\n      /* If v1 == v2, SDPVTL behaves the same as */\n      /* SVTCA[X], respectively.                 */\n      /*                                         */\n      /* Confirmed by Greg Hitchcock.            */\n\n      if ( A == 0 && B == 0 )\n      {\n        A    = 0x4000;\n        aOpc = 0;\n      }\n    }\n\n    if ( ( aOpc & 1 ) != 0 )\n    {\n      C =  B;   /* counter clockwise rotation */\n      B =  A;\n      A = -C;\n    }\n\n    NORMalize( A, B, &CUR.GS.dualVector );\n\n    {\n      FT_Vector*  v1 = CUR.zp1.cur + p2;\n      FT_Vector*  v2 = CUR.zp2.cur + p1;\n\n\n      A = v1->x - v2->x;\n      B = v1->y - v2->y;\n    }\n\n    if ( ( aOpc & 1 ) != 0 )\n    {\n      C =  B;   /* counter clockwise rotation */\n      B =  A;\n      A = -C;\n    }\n\n    NORMalize( A, B, &CUR.GS.projVector );\n\n    GUESS_VECTOR( freeVector );\n\n    COMPUTE_Funcs();\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SZP0[]:       Set Zone Pointer 0                                      */\n  /* Opcode range: 0x13                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SZP0( INS_ARG )\n  {\n    switch ( (FT_Int)args[0] )\n    {\n    case 0:\n      CUR.zp0 = CUR.twilight;\n      break;\n\n    case 1:\n      CUR.zp0 = CUR.pts;\n      break;\n\n    default:\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    CUR.GS.gep0 = (FT_UShort)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SZP1[]:       Set Zone Pointer 1                                      */\n  /* Opcode range: 0x14                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SZP1( INS_ARG )\n  {\n    switch ( (FT_Int)args[0] )\n    {\n    case 0:\n      CUR.zp1 = CUR.twilight;\n      break;\n\n    case 1:\n      CUR.zp1 = CUR.pts;\n      break;\n\n    default:\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    CUR.GS.gep1 = (FT_UShort)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SZP2[]:       Set Zone Pointer 2                                      */\n  /* Opcode range: 0x15                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SZP2( INS_ARG )\n  {\n    switch ( (FT_Int)args[0] )\n    {\n    case 0:\n      CUR.zp2 = CUR.twilight;\n      break;\n\n    case 1:\n      CUR.zp2 = CUR.pts;\n      break;\n\n    default:\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    CUR.GS.gep2 = (FT_UShort)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SZPS[]:       Set Zone PointerS                                       */\n  /* Opcode range: 0x16                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SZPS( INS_ARG )\n  {\n    switch ( (FT_Int)args[0] )\n    {\n    case 0:\n      CUR.zp0 = CUR.twilight;\n      break;\n\n    case 1:\n      CUR.zp0 = CUR.pts;\n      break;\n\n    default:\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    CUR.zp1 = CUR.zp0;\n    CUR.zp2 = CUR.zp0;\n\n    CUR.GS.gep0 = (FT_UShort)args[0];\n    CUR.GS.gep1 = (FT_UShort)args[0];\n    CUR.GS.gep2 = (FT_UShort)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* INSTCTRL[]:   INSTruction ConTRoL                                     */\n  /* Opcode range: 0x8e                                                    */\n  /* Stack:        int32 int32 -->                                         */\n  /*                                                                       */\n  static void\n  Ins_INSTCTRL( INS_ARG )\n  {\n    FT_Long  K, L;\n\n\n    K = args[1];\n    L = args[0];\n\n    if ( K < 1 || K > 2 )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    if ( L != 0 )\n        L = K;\n\n    CUR.GS.instruct_control = FT_BOOL(\n      ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SCANCTRL[]:   SCAN ConTRoL                                            */\n  /* Opcode range: 0x85                                                    */\n  /* Stack:        uint32? -->                                             */\n  /*                                                                       */\n  static void\n  Ins_SCANCTRL( INS_ARG )\n  {\n    FT_Int  A;\n\n\n    /* Get Threshold */\n    A = (FT_Int)( args[0] & 0xFF );\n\n    if ( A == 0xFF )\n    {\n      CUR.GS.scan_control = TRUE;\n      return;\n    }\n    else if ( A == 0 )\n    {\n      CUR.GS.scan_control = FALSE;\n      return;\n    }\n\n    if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A )\n      CUR.GS.scan_control = TRUE;\n\n    if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated )\n      CUR.GS.scan_control = TRUE;\n\n    if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched )\n      CUR.GS.scan_control = TRUE;\n\n    if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A )\n      CUR.GS.scan_control = FALSE;\n\n    if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated )\n      CUR.GS.scan_control = FALSE;\n\n    if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched )\n      CUR.GS.scan_control = FALSE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SCANTYPE[]:   SCAN TYPE                                               */\n  /* Opcode range: 0x8D                                                    */\n  /* Stack:        uint32? -->                                             */\n  /*                                                                       */\n  static void\n  Ins_SCANTYPE( INS_ARG )\n  {\n    if ( args[0] >= 0 )\n      CUR.GS.scan_type = (FT_Int)args[0];\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MANAGING OUTLINES                                                     */\n  /*                                                                       */\n  /*   Instructions appear in the specification's order.                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPPT[]:     FLIP PoinT                                              */\n  /* Opcode range: 0x80                                                    */\n  /* Stack:        uint32... -->                                           */\n  /*                                                                       */\n  static void\n  Ins_FLIPPT( INS_ARG )\n  {\n    FT_UShort  point;\n\n    FT_UNUSED_ARG;\n\n\n    if ( CUR.top < CUR.GS.loop )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Too_Few_Arguments );\n      goto Fail;\n    }\n\n    while ( CUR.GS.loop > 0 )\n    {\n      CUR.args--;\n\n      point = (FT_UShort)CUR.stack[CUR.args];\n\n      if ( BOUNDS( point, CUR.pts.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n        CUR.pts.tags[point] ^= FT_CURVE_TAG_ON;\n\n      CUR.GS.loop--;\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPRGON[]:   FLIP RanGe ON                                           */\n  /* Opcode range: 0x81                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_FLIPRGON( INS_ARG )\n  {\n    FT_UShort  I, K, L;\n\n\n    K = (FT_UShort)args[1];\n    L = (FT_UShort)args[0];\n\n    if ( BOUNDS( K, CUR.pts.n_points ) ||\n         BOUNDS( L, CUR.pts.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    for ( I = L; I <= K; I++ )\n      CUR.pts.tags[I] |= FT_CURVE_TAG_ON;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FLIPRGOFF:    FLIP RanGe OFF                                          */\n  /* Opcode range: 0x82                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_FLIPRGOFF( INS_ARG )\n  {\n    FT_UShort  I, K, L;\n\n\n    K = (FT_UShort)args[1];\n    L = (FT_UShort)args[0];\n\n    if ( BOUNDS( K, CUR.pts.n_points ) ||\n         BOUNDS( L, CUR.pts.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    for ( I = L; I <= K; I++ )\n      CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON;\n  }\n\n\n  static FT_Bool\n  Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6*   x,\n                                       FT_F26Dot6*   y,\n                                       TT_GlyphZone  zone,\n                                       FT_UShort*    refp )\n  {\n    TT_GlyphZoneRec  zp;\n    FT_UShort        p;\n    FT_F26Dot6       d;\n\n\n    if ( CUR.opcode & 1 )\n    {\n      zp = CUR.zp0;\n      p  = CUR.GS.rp1;\n    }\n    else\n    {\n      zp = CUR.zp1;\n      p  = CUR.GS.rp2;\n    }\n\n    if ( BOUNDS( p, zp.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      *refp = 0;\n      return FAILURE;\n    }\n\n    *zone = zp;\n    *refp = p;\n\n    d = CUR_Func_project( zp.cur + p, zp.org + p );\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    if ( CUR.face->unpatented_hinting )\n    {\n      if ( CUR.GS.both_x_axis )\n      {\n        *x = d;\n        *y = 0;\n      }\n      else\n      {\n        *x = 0;\n        *y = d;\n      }\n    }\n    else\n#endif\n    {\n      *x = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.x, CUR.F_dot_P );\n      *y = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.y, CUR.F_dot_P );\n    }\n\n    return SUCCESS;\n  }\n\n\n  static void\n  Move_Zp2_Point( EXEC_OP_ FT_UShort   point,\n                           FT_F26Dot6  dx,\n                           FT_F26Dot6  dy,\n                           FT_Bool     touch )\n  {\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    if ( CUR.face->unpatented_hinting )\n    {\n      if ( CUR.GS.both_x_axis )\n      {\n        CUR.zp2.cur[point].x += dx;\n        if ( touch )\n          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;\n      }\n      else\n      {\n        CUR.zp2.cur[point].y += dy;\n        if ( touch )\n          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;\n      }\n      return;\n    }\n#endif\n\n    if ( CUR.GS.freeVector.x != 0 )\n    {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( !CUR.ignore_x_mode                                      ||\n          ( CUR.ignore_x_mode                                    &&\n            ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_MOVE_ZP2 ) ) )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n        CUR.zp2.cur[point].x += dx;\n      if ( touch )\n        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;\n    }\n\n    if ( CUR.GS.freeVector.y != 0 )\n    {\n      CUR.zp2.cur[point].y += dy;\n      if ( touch )\n        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SHP[a]:       SHift Point by the last point                           */\n  /* Opcode range: 0x32-0x33                                               */\n  /* Stack:        uint32... -->                                           */\n  /*                                                                       */\n  static void\n  Ins_SHP( INS_ARG )\n  {\n    TT_GlyphZoneRec  zp;\n    FT_UShort        refp;\n\n    FT_F26Dot6       dx,\n                     dy;\n    FT_UShort        point;\n\n    FT_UNUSED_ARG;\n\n\n    if ( CUR.top < CUR.GS.loop )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )\n      return;\n\n    while ( CUR.GS.loop > 0 )\n    {\n      CUR.args--;\n      point = (FT_UShort)CUR.stack[CUR.args];\n\n      if ( BOUNDS( point, CUR.zp2.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n        MOVE_Zp2_Point( point, dx, dy, TRUE );\n\n      CUR.GS.loop--;\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SHC[a]:       SHift Contour                                           */\n  /* Opcode range: 0x34-35                                                 */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual)     */\n  /*               contour in the twilight zone, namely contour number     */\n  /*               zero which includes all points of it.                   */\n  /*                                                                       */\n  static void\n  Ins_SHC( INS_ARG )\n  {\n    TT_GlyphZoneRec  zp;\n    FT_UShort        refp;\n    FT_F26Dot6       dx, dy;\n\n    FT_Short         contour, bounds;\n    FT_UShort        start, limit, i;\n\n\n    contour = (FT_UShort)args[0];\n    bounds  = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours;\n\n    if ( BOUNDS( contour, bounds ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )\n      return;\n\n    if ( contour == 0 )\n      start = 0;\n    else\n      start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 -\n                           CUR.zp2.first_point );\n\n    /* we use the number of points if in the twilight zone */\n    if ( CUR.GS.gep2 == 0 )\n      limit = CUR.zp2.n_points;\n    else\n      limit = (FT_UShort)( CUR.zp2.contours[contour] -\n                           CUR.zp2.first_point + 1 );\n\n    for ( i = start; i < limit; i++ )\n    {\n      if ( zp.cur != CUR.zp2.cur || refp != i )\n        MOVE_Zp2_Point( i, dx, dy, TRUE );\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SHZ[a]:       SHift Zone                                              */\n  /* Opcode range: 0x36-37                                                 */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_SHZ( INS_ARG )\n  {\n    TT_GlyphZoneRec  zp;\n    FT_UShort        refp;\n    FT_F26Dot6       dx,\n                     dy;\n\n    FT_UShort        limit, i;\n\n\n    if ( BOUNDS( args[0], 2 ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )\n      return;\n\n    /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points.     */\n    /*      Twilight zone has no real contours, so use `n_points'. */\n    /*      Normal zone's `n_points' includes phantoms, so must    */\n    /*      use end of last contour.                               */\n    if ( CUR.GS.gep2 == 0 )\n      limit = (FT_UShort)CUR.zp2.n_points;\n    else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 )\n      limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 );\n    else\n      limit = 0;\n\n    /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */\n    for ( i = 0; i < limit; i++ )\n    {\n      if ( zp.cur != CUR.zp2.cur || refp != i )\n        MOVE_Zp2_Point( i, dx, dy, FALSE );\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* SHPIX[]:      SHift points by a PIXel amount                          */\n  /* Opcode range: 0x38                                                    */\n  /* Stack:        f26.6 uint32... -->                                     */\n  /*                                                                       */\n  static void\n  Ins_SHPIX( INS_ARG )\n  {\n    FT_F26Dot6  dx, dy;\n    FT_UShort   point;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    FT_Int      B1, B2;\n#endif\n\n\n    if ( CUR.top < CUR.GS.loop + 1 )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    if ( CUR.face->unpatented_hinting )\n    {\n      if ( CUR.GS.both_x_axis )\n      {\n        dx = (FT_UInt32)args[0];\n        dy = 0;\n      }\n      else\n      {\n        dx = 0;\n        dy = (FT_UInt32)args[0];\n      }\n    }\n    else\n#endif\n    {\n      dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x );\n      dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y );\n    }\n\n    while ( CUR.GS.loop > 0 )\n    {\n      CUR.args--;\n\n      point = (FT_UShort)CUR.stack[CUR.args];\n\n      if ( BOUNDS( point, CUR.zp2.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      {\n        /*  If not using ignore_x_mode rendering, allow ZP2 move.          */\n        /*  If inline deltas aren't allowed, skip ZP2 move.                */\n        /*  If using ignore_x_mode rendering, allow ZP2 point move if:     */\n        /*   - freedom vector is y and sph_compatibility_mode is off       */\n        /*   - the glyph is composite and the move is in the Y direction   */\n        /*   - the glyph is specifically set to allow SHPIX moves          */\n        /*   - the move is on a previously Y-touched point                 */\n\n        if ( CUR.ignore_x_mode )\n        {\n          /* save point for later comparison */\n          if ( CUR.GS.freeVector.y != 0 )\n            B1 = CUR.zp2.cur[point].y;\n          else\n            B1 = CUR.zp2.cur[point].x;\n\n          if ( CUR.GS.freeVector.y != 0                               &&\n               ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_INLINE_DELTAS ) )\n            goto Skip;\n\n          if ( !CUR.face->sph_compatibility_mode &&\n               CUR.GS.freeVector.y != 0          )\n            MOVE_Zp2_Point( point, dx, dy, TRUE );\n\n          else if ( CUR.face->sph_compatibility_mode )\n          {\n            if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )\n            {\n              dx = FT_PIX_ROUND( B1 + dx ) - B1;\n              dy = FT_PIX_ROUND( B1 + dy ) - B1;\n            }\n\n            if ( !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) &&\n                  ( ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) ||\n                    ( CUR.zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )   ||\n                    ( CUR.sph_tweak_flags & SPH_TWEAK_DO_SHPIX )     )   )\n              MOVE_Zp2_Point( point, dx, dy, TRUE );\n          }\n\n          /* save new point */\n          if ( CUR.GS.freeVector.y != 0 )\n            B2 = CUR.zp2.cur[point].y;\n          else\n            B2 = CUR.zp2.cur[point].x;\n\n          /* reverse any disallowed moves */\n          if ( ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&\n                 CUR.GS.freeVector.y != 0                                  &&\n                 ( B1 & 63 ) != 0                                          &&\n                 ( B2 & 63 ) != 0                                          &&\n                 B1 != B2                                                  ) ||\n               ( CUR.face->sph_compatibility_mode                          &&\n                 CUR.GS.freeVector.y != 0                                  &&\n                 ( B1 & 63 ) == 0                                          &&\n                 ( B2 & 63 ) != 0                                          &&\n                 B1 != B2                                                  ) )\n            MOVE_Zp2_Point( point, -dx, -dy, TRUE );\n      }\n        else\n          MOVE_Zp2_Point( point, dx, dy, TRUE );\n      }\n  Skip:\n#else\n        MOVE_Zp2_Point( point, dx, dy, TRUE );\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n      CUR.GS.loop--;\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MSIRP[a]:     Move Stack Indirect Relative Position                   */\n  /* Opcode range: 0x3A-0x3B                                               */\n  /* Stack:        f26.6 uint32 -->                                        */\n  /*                                                                       */\n  static void\n  Ins_MSIRP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_F26Dot6  distance;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    FT_F26Dot6  control_value_cutin;\n\n\n    control_value_cutin = CUR.GS.control_value_cutin;\n\n    if ( CUR.ignore_x_mode                                 &&\n         CUR.GS.freeVector.x != 0                          &&\n         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )\n      control_value_cutin = 0;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    point = (FT_UShort)args[0];\n\n    if ( BOUNDS( point,      CUR.zp1.n_points ) ||\n         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    /* UNDOCUMENTED!  The MS rasterizer does that with */\n    /* twilight points (confirmed by Greg Hitchcock)   */\n    if ( CUR.GS.gep1 == 0 )\n    {\n      CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];\n      CUR_Func_move_orig( &CUR.zp1, point, args[1] );\n      CUR.zp1.cur[point] = CUR.zp1.org[point];\n    }\n\n    distance = CUR_Func_project( CUR.zp1.cur + point,\n                                 CUR.zp0.cur + CUR.GS.rp0 );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /* subpixel hinting - make MSIRP respect CVT cut-in; */\n    if ( CUR.ignore_x_mode                                   &&\n         CUR.GS.freeVector.x != 0                            &&\n         FT_ABS( distance - args[1] ) >= control_value_cutin )\n      distance = args[1];\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    CUR_Func_move( &CUR.zp1, point, args[1] - distance );\n\n    CUR.GS.rp1 = CUR.GS.rp0;\n    CUR.GS.rp2 = point;\n\n    if ( ( CUR.opcode & 1 ) != 0 )\n      CUR.GS.rp0 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MDAP[a]:      Move Direct Absolute Point                              */\n  /* Opcode range: 0x2E-0x2F                                               */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_MDAP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_F26Dot6  cur_dist;\n    FT_F26Dot6  distance;\n\n\n    point = (FT_UShort)args[0];\n\n    if ( BOUNDS( point, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    if ( ( CUR.opcode & 1 ) != 0 )\n    {\n      cur_dist = CUR_fast_project( &CUR.zp0.cur[point] );\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( CUR.ignore_x_mode        &&\n           CUR.GS.freeVector.x != 0 )\n        distance = ROUND_None(\n                     cur_dist,\n                     CUR.tt_metrics.compensations[0] ) - cur_dist;\n      else\n#endif\n        distance = CUR_Func_round(\n                     cur_dist,\n                     CUR.tt_metrics.compensations[0] ) - cur_dist;\n    }\n    else\n      distance = 0;\n\n    CUR_Func_move( &CUR.zp0, point, distance );\n\n    CUR.GS.rp0 = point;\n    CUR.GS.rp1 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MIAP[a]:      Move Indirect Absolute Point                            */\n  /* Opcode range: 0x3E-0x3F                                               */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_MIAP( INS_ARG )\n  {\n    FT_ULong    cvtEntry;\n    FT_UShort   point;\n    FT_F26Dot6  distance;\n    FT_F26Dot6  org_dist;\n    FT_F26Dot6  control_value_cutin;\n\n\n    control_value_cutin = CUR.GS.control_value_cutin;\n    cvtEntry            = (FT_ULong)args[1];\n    point               = (FT_UShort)args[0];\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( CUR.ignore_x_mode                                 &&\n         CUR.GS.freeVector.x != 0                          &&\n         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )\n      control_value_cutin = 0;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    if ( BOUNDS( point,     CUR.zp0.n_points ) ||\n         BOUNDSL( cvtEntry, CUR.cvtSize )      )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    /* UNDOCUMENTED!                                                      */\n    /*                                                                    */\n    /* The behaviour of an MIAP instruction is quite different when used  */\n    /* in the twilight zone.                                              */\n    /*                                                                    */\n    /* First, no control value cut-in test is performed as it would fail  */\n    /* anyway.  Second, the original point, i.e. (org_x,org_y) of         */\n    /* zp0.point, is set to the absolute, unrounded distance found in the */\n    /* CVT.                                                               */\n    /*                                                                    */\n    /* This is used in the CVT programs of the Microsoft fonts Arial,     */\n    /* Times, etc., in order to re-adjust some key font heights.  It      */\n    /* allows the use of the IP instruction in the twilight zone, which   */\n    /* otherwise would be invalid according to the specification.         */\n    /*                                                                    */\n    /* We implement it with a special sequence for the twilight zone.     */\n    /* This is a bad hack, but it seems to work.                          */\n    /*                                                                    */\n    /* Confirmed by Greg Hitchcock.                                       */\n\n    distance = CUR_Func_read_cvt( cvtEntry );\n\n    if ( CUR.GS.gep0 == 0 )   /* If in twilight zone */\n    {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */\n      /* Determined via experimentation and may be incorrect...         */\n      if ( !CUR.ignore_x_mode || !CUR.face->sph_compatibility_mode )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n        CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance,\n                                            CUR.GS.freeVector.x );\n      CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance,\n                                          CUR.GS.freeVector.y ),\n      CUR.zp0.cur[point]   = CUR.zp0.org[point];\n    }\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( CUR.ignore_x_mode                             &&\n         ( CUR.sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) &&\n         distance > 0                                  &&\n         CUR.GS.freeVector.y != 0                      )\n      distance = 0;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    org_dist = CUR_fast_project( &CUR.zp0.cur[point] );\n\n    if ( ( CUR.opcode & 1 ) != 0 )   /* rounding and control cut-in flag */\n    {\n      if ( FT_ABS( distance - org_dist ) > control_value_cutin )\n        distance = org_dist;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( CUR.ignore_x_mode        &&\n           CUR.GS.freeVector.x != 0 )\n        distance = ROUND_None( distance,\n                               CUR.tt_metrics.compensations[0] );\n      else\n#endif\n        distance = CUR_Func_round( distance,\n                                   CUR.tt_metrics.compensations[0] );\n    }\n\n    CUR_Func_move( &CUR.zp0, point, distance - org_dist );\n\n  Fail:\n    CUR.GS.rp0 = point;\n    CUR.GS.rp1 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MDRP[abcde]:  Move Direct Relative Point                              */\n  /* Opcode range: 0xC0-0xDF                                               */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_MDRP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_F26Dot6  org_dist, distance, minimum_distance;\n\n\n    minimum_distance = CUR.GS.minimum_distance;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( CUR.ignore_x_mode                                 &&\n         CUR.GS.freeVector.x != 0                          &&\n         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )\n      minimum_distance = 0;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n    point = (FT_UShort)args[0];\n\n    if ( BOUNDS( point,      CUR.zp1.n_points ) ||\n         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    /* XXX: Is there some undocumented feature while in the */\n    /*      twilight zone?                                  */\n\n    /* XXX: UNDOCUMENTED: twilight zone special case */\n\n    if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )\n    {\n      FT_Vector*  vec1 = &CUR.zp1.org[point];\n      FT_Vector*  vec2 = &CUR.zp0.org[CUR.GS.rp0];\n\n\n      org_dist = CUR_Func_dualproj( vec1, vec2 );\n    }\n    else\n    {\n      FT_Vector*  vec1 = &CUR.zp1.orus[point];\n      FT_Vector*  vec2 = &CUR.zp0.orus[CUR.GS.rp0];\n\n\n      if ( CUR.metrics.x_scale == CUR.metrics.y_scale )\n      {\n        /* this should be faster */\n        org_dist = CUR_Func_dualproj( vec1, vec2 );\n        org_dist = FT_MulFix( org_dist, CUR.metrics.x_scale );\n      }\n      else\n      {\n        FT_Vector  vec;\n\n\n        vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );\n        vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );\n\n        org_dist = CUR_fast_dualproj( &vec );\n      }\n    }\n\n    /* single width cut-in test */\n\n    if ( FT_ABS( org_dist - CUR.GS.single_width_value ) <\n         CUR.GS.single_width_cutin )\n    {\n      if ( org_dist >= 0 )\n        org_dist = CUR.GS.single_width_value;\n      else\n        org_dist = -CUR.GS.single_width_value;\n    }\n\n    /* round flag */\n\n    if ( ( CUR.opcode & 4 ) != 0 )\n    {\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( CUR.ignore_x_mode && CUR.GS.freeVector.x != 0 )\n        distance = ROUND_None(\n                     org_dist,\n                     CUR.tt_metrics.compensations[CUR.opcode & 3] );\n      else\n#endif\n      distance = CUR_Func_round(\n                   org_dist,\n                   CUR.tt_metrics.compensations[CUR.opcode & 3] );\n    }\n    else\n      distance = ROUND_None(\n                   org_dist,\n                   CUR.tt_metrics.compensations[CUR.opcode & 3] );\n\n    /* minimum distance flag */\n\n    if ( ( CUR.opcode & 8 ) != 0 )\n    {\n      if ( org_dist >= 0 )\n      {\n        if ( distance < minimum_distance )\n          distance = minimum_distance;\n      }\n      else\n      {\n        if ( distance > -minimum_distance )\n          distance = -minimum_distance;\n      }\n    }\n\n    /* now move the point */\n\n    org_dist = CUR_Func_project( CUR.zp1.cur + point,\n                                 CUR.zp0.cur + CUR.GS.rp0 );\n\n    CUR_Func_move( &CUR.zp1, point, distance - org_dist );\n\n  Fail:\n    CUR.GS.rp1 = CUR.GS.rp0;\n    CUR.GS.rp2 = point;\n\n    if ( ( CUR.opcode & 16 ) != 0 )\n      CUR.GS.rp0 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MIRP[abcde]:  Move Indirect Relative Point                            */\n  /* Opcode range: 0xE0-0xFF                                               */\n  /* Stack:        int32? uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_MIRP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_ULong    cvtEntry;\n\n    FT_F26Dot6  cvt_dist,\n                distance,\n                cur_dist,\n                org_dist,\n                control_value_cutin,\n                minimum_distance;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    FT_Int      B1;\n    FT_Int      B2;\n    FT_Bool     reverse_move = FALSE;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n    minimum_distance    = CUR.GS.minimum_distance;\n    control_value_cutin = CUR.GS.control_value_cutin;\n    point               = (FT_UShort)args[0];\n    cvtEntry            = (FT_ULong)( args[1] + 1 );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( CUR.ignore_x_mode                                 &&\n         CUR.GS.freeVector.x != 0                          &&\n         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )\n      control_value_cutin = minimum_distance = 0;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */\n\n    if ( BOUNDS( point,      CUR.zp1.n_points ) ||\n         BOUNDSL( cvtEntry,  CUR.cvtSize + 1 )  ||\n         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    if ( !cvtEntry )\n      cvt_dist = 0;\n    else\n      cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n      if ( CUR.ignore_x_mode                                 &&\n           ( CUR.sph_tweak_flags & SPH_TWEAK_MIRP_CVT_ZERO ) )\n        cvt_dist = 0;\n#endif\n\n    /* single width test */\n\n    if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) <\n         CUR.GS.single_width_cutin )\n    {\n      if ( cvt_dist >= 0 )\n        cvt_dist =  CUR.GS.single_width_value;\n      else\n        cvt_dist = -CUR.GS.single_width_value;\n    }\n\n    /* UNDOCUMENTED!  The MS rasterizer does that with */\n    /* twilight points (confirmed by Greg Hitchcock)   */\n    if ( CUR.GS.gep1 == 0 )\n    {\n      CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +\n                             TT_MulFix14( (FT_UInt32)cvt_dist,\n                                          CUR.GS.freeVector.x );\n      CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +\n                             TT_MulFix14( (FT_UInt32)cvt_dist,\n                                          CUR.GS.freeVector.y );\n      CUR.zp1.cur[point]   = CUR.zp1.org[point];\n    }\n\n    org_dist = CUR_Func_dualproj( &CUR.zp1.org[point],\n                                  &CUR.zp0.org[CUR.GS.rp0] );\n    cur_dist = CUR_Func_project ( &CUR.zp1.cur[point],\n                                  &CUR.zp0.cur[CUR.GS.rp0] );\n\n    /* auto-flip test */\n\n    if ( CUR.GS.auto_flip )\n    {\n      if ( ( org_dist ^ cvt_dist ) < 0 )\n        cvt_dist = -cvt_dist;\n    }\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( CUR.ignore_x_mode                                        &&\n         CUR.GS.freeVector.y != 0                                 &&\n         ( CUR.sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) )\n    {\n      if ( cur_dist < -64 )\n        cvt_dist -= 16;\n      else if ( cur_dist > 64 && cur_dist < 84 )\n        cvt_dist += 32;\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n    /* control value cut-in and round */\n\n    if ( ( CUR.opcode & 4 ) != 0 )\n    {\n      /* XXX: UNDOCUMENTED!  Only perform cut-in test when both points */\n      /*      refer to the same zone.                                  */\n\n      if ( CUR.GS.gep0 == CUR.GS.gep1 )\n      {\n        /* XXX: According to Greg Hitchcock, the following wording is */\n        /*      the right one:                                        */\n        /*                                                            */\n        /*        When the absolute difference between the value in   */\n        /*        the table [CVT] and the measurement directly from   */\n        /*        the outline is _greater_ than the cut_in value, the */\n        /*        outline measurement is used.                        */\n        /*                                                            */\n        /*      This is from `instgly.doc'.  The description in       */\n        /*      `ttinst2.doc', version 1.66, is thus incorrect since  */\n        /*      it implies `>=' instead of `>'.                       */\n\n        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )\n          cvt_dist = org_dist;\n      }\n\n      distance = CUR_Func_round(\n                   cvt_dist,\n                   CUR.tt_metrics.compensations[CUR.opcode & 3] );\n    }\n    else\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    {\n      /* do cvt cut-in always in MIRP for sph */\n      if ( CUR.ignore_x_mode && CUR.GS.gep0 == CUR.GS.gep1 )\n      {\n        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )\n          cvt_dist = org_dist;\n      }\n      distance = ROUND_None(\n                   cvt_dist,\n                   CUR.tt_metrics.compensations[CUR.opcode & 3] );\n    }\n#else\n      distance = ROUND_None(\n                   cvt_dist,\n                   CUR.tt_metrics.compensations[CUR.opcode & 3] );\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* minimum distance test */\n\n    if ( ( CUR.opcode & 8 ) != 0 )\n    {\n      if ( org_dist >= 0 )\n      {\n        if ( distance < minimum_distance )\n          distance = minimum_distance;\n      }\n      else\n      {\n        if ( distance > -minimum_distance )\n          distance = -minimum_distance;\n      }\n    }\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    B1 = CUR.zp1.cur[point].y;\n\n    /* Round moves if necessary */\n    if ( CUR.ignore_x_mode                                          &&\n         CUR.GS.freeVector.y != 0                                   &&\n         ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) )\n      distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist;\n\n    if ( CUR.ignore_x_mode                                      &&\n         CUR.GS.freeVector.y != 0                               &&\n         ( CUR.opcode & 16 ) == 0                               &&\n         ( CUR.opcode & 8 ) == 0                                &&\n         ( CUR.sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )\n      distance += 64;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    CUR_Func_move( &CUR.zp1, point, distance - cur_dist );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    B2 = CUR.zp1.cur[point].y;\n\n    /* Reverse move if necessary */\n    if ( CUR.ignore_x_mode )\n    {\n      if ( CUR.face->sph_compatibility_mode                          &&\n           CUR.GS.freeVector.y != 0                                  &&\n           ( B1 & 63 ) == 0                                          &&\n           ( B2 & 63 ) != 0                                          )\n        reverse_move = TRUE;\n\n      if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&\n           CUR.GS.freeVector.y != 0                                  &&\n           ( B2 & 63 ) != 0                                          &&\n           ( B1 & 63 ) != 0                                          )\n        reverse_move = TRUE;\n\n      if ( ( CUR.sph_tweak_flags                      &\n             SPH_TWEAK_DELTAP_SKIP_EXAGGERATED_VALUES ) &&\n           !reverse_move                                &&\n           FT_ABS( B1 - B2 ) >= 64                      )\n        reverse_move = TRUE;\n    }\n\n    if ( reverse_move )\n      CUR_Func_move( &CUR.zp1, point, -( distance - cur_dist ) );\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n  Fail:\n    CUR.GS.rp1 = CUR.GS.rp0;\n\n    if ( ( CUR.opcode & 16 ) != 0 )\n      CUR.GS.rp0 = point;\n\n    CUR.GS.rp2 = point;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ALIGNRP[]:    ALIGN Relative Point                                    */\n  /* Opcode range: 0x3C                                                    */\n  /* Stack:        uint32 uint32... -->                                    */\n  /*                                                                       */\n  static void\n  Ins_ALIGNRP( INS_ARG )\n  {\n    FT_UShort   point;\n    FT_F26Dot6  distance;\n\n    FT_UNUSED_ARG;\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( CUR.ignore_x_mode                                        &&\n         CUR.iup_called                                           &&\n         ( CUR.sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) )\n    {\n      CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    if ( CUR.top < CUR.GS.loop ||\n         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    while ( CUR.GS.loop > 0 )\n    {\n      CUR.args--;\n\n      point = (FT_UShort)CUR.stack[CUR.args];\n\n      if ( BOUNDS( point, CUR.zp1.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n      {\n        distance = CUR_Func_project( CUR.zp1.cur + point,\n                                     CUR.zp0.cur + CUR.GS.rp0 );\n\n        CUR_Func_move( &CUR.zp1, point, -distance );\n      }\n\n      CUR.GS.loop--;\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ISECT[]:      moves point to InterSECTion                             */\n  /* Opcode range: 0x0F                                                    */\n  /* Stack:        5 * uint32 -->                                          */\n  /*                                                                       */\n  static void\n  Ins_ISECT( INS_ARG )\n  {\n    FT_UShort   point,\n                a0, a1,\n                b0, b1;\n\n    FT_F26Dot6  discriminant, dotproduct;\n\n    FT_F26Dot6  dx,  dy,\n                dax, day,\n                dbx, dby;\n\n    FT_F26Dot6  val;\n\n    FT_Vector   R;\n\n\n    point = (FT_UShort)args[0];\n\n    a0 = (FT_UShort)args[1];\n    a1 = (FT_UShort)args[2];\n    b0 = (FT_UShort)args[3];\n    b1 = (FT_UShort)args[4];\n\n    if ( BOUNDS( b0, CUR.zp0.n_points )  ||\n         BOUNDS( b1, CUR.zp0.n_points )  ||\n         BOUNDS( a0, CUR.zp1.n_points )  ||\n         BOUNDS( a1, CUR.zp1.n_points )  ||\n         BOUNDS( point, CUR.zp2.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    /* Cramer's rule */\n\n    dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;\n    dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;\n\n    dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;\n    day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;\n\n    dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;\n    dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;\n\n    CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;\n\n    discriminant = FT_MulDiv( dax, -dby, 0x40 ) +\n                   FT_MulDiv( day, dbx, 0x40 );\n    dotproduct   = FT_MulDiv( dax, dbx, 0x40 ) +\n                   FT_MulDiv( day, dby, 0x40 );\n\n    /* The discriminant above is actually a cross product of vectors     */\n    /* da and db. Together with the dot product, they can be used as     */\n    /* surrogates for sine and cosine of the angle between the vectors.  */\n    /* Indeed,                                                           */\n    /*       dotproduct   = |da||db|cos(angle)                           */\n    /*       discriminant = |da||db|sin(angle)     .                     */\n    /* We use these equations to reject grazing intersections by         */\n    /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */\n    if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) )\n    {\n      val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );\n\n      R.x = FT_MulDiv( val, dax, discriminant );\n      R.y = FT_MulDiv( val, day, discriminant );\n\n      CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;\n      CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;\n    }\n    else\n    {\n      /* else, take the middle of the middles of A and B */\n\n      CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +\n                               CUR.zp1.cur[a1].x +\n                               CUR.zp0.cur[b0].x +\n                               CUR.zp0.cur[b1].x ) / 4;\n      CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +\n                               CUR.zp1.cur[a1].y +\n                               CUR.zp0.cur[b0].y +\n                               CUR.zp0.cur[b1].y ) / 4;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ALIGNPTS[]:   ALIGN PoinTS                                            */\n  /* Opcode range: 0x27                                                    */\n  /* Stack:        uint32 uint32 -->                                       */\n  /*                                                                       */\n  static void\n  Ins_ALIGNPTS( INS_ARG )\n  {\n    FT_UShort   p1, p2;\n    FT_F26Dot6  distance;\n\n\n    p1 = (FT_UShort)args[0];\n    p2 = (FT_UShort)args[1];\n\n    if ( BOUNDS( p1, CUR.zp1.n_points ) ||\n         BOUNDS( p2, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    distance = CUR_Func_project( CUR.zp0.cur + p2,\n                                 CUR.zp1.cur + p1 ) / 2;\n\n    CUR_Func_move( &CUR.zp1, p1, distance );\n    CUR_Func_move( &CUR.zp0, p2, -distance );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* IP[]:         Interpolate Point                                       */\n  /* Opcode range: 0x39                                                    */\n  /* Stack:        uint32... -->                                           */\n  /*                                                                       */\n\n  /* SOMETIMES, DUMBER CODE IS BETTER CODE */\n\n  static void\n  Ins_IP( INS_ARG )\n  {\n    FT_F26Dot6  old_range, cur_range;\n    FT_Vector*  orus_base;\n    FT_Vector*  cur_base;\n    FT_Int      twilight;\n\n    FT_UNUSED_ARG;\n\n\n    if ( CUR.top < CUR.GS.loop )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    /*\n     * We need to deal in a special way with the twilight zone.\n     * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0),\n     * for every n.\n     */\n    twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;\n\n    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      goto Fail;\n    }\n\n    if ( twilight )\n      orus_base = &CUR.zp0.org[CUR.GS.rp1];\n    else\n      orus_base = &CUR.zp0.orus[CUR.GS.rp1];\n\n    cur_base = &CUR.zp0.cur[CUR.GS.rp1];\n\n    /* XXX: There are some glyphs in some braindead but popular */\n    /*      fonts out there (e.g. [aeu]grave in monotype.ttf)   */\n    /*      calling IP[] with bad values of rp[12].             */\n    /*      Do something sane when this odd thing happens.      */\n    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||\n         BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )\n    {\n      old_range = 0;\n      cur_range = 0;\n    }\n    else\n    {\n      if ( twilight )\n        old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2],\n                                       orus_base );\n      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )\n        old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2],\n                                       orus_base );\n      else\n      {\n        FT_Vector  vec;\n\n\n        vec.x = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x,\n                           CUR.metrics.x_scale );\n        vec.y = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y,\n                           CUR.metrics.y_scale );\n\n        old_range = CUR_fast_dualproj( &vec );\n      }\n\n      cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base );\n    }\n\n    for ( ; CUR.GS.loop > 0; --CUR.GS.loop )\n    {\n      FT_UInt     point = (FT_UInt)CUR.stack[--CUR.args];\n      FT_F26Dot6  org_dist, cur_dist, new_dist;\n\n\n      /* check point bounds */\n      if ( BOUNDS( point, CUR.zp2.n_points ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n        continue;\n      }\n\n      if ( twilight )\n        org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base );\n      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )\n        org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base );\n      else\n      {\n        FT_Vector  vec;\n\n\n        vec.x = FT_MulFix( CUR.zp2.orus[point].x - orus_base->x,\n                           CUR.metrics.x_scale );\n        vec.y = FT_MulFix( CUR.zp2.orus[point].y - orus_base->y,\n                           CUR.metrics.y_scale );\n\n        org_dist = CUR_fast_dualproj( &vec );\n      }\n\n      cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base );\n\n      if ( org_dist )\n      {\n        if ( old_range )\n          new_dist = FT_MulDiv( org_dist, cur_range, old_range );\n        else\n        {\n          /* This is the same as what MS does for the invalid case:  */\n          /*                                                         */\n          /*   delta = (Original_Pt - Original_RP1) -                */\n          /*           (Current_Pt - Current_RP1)                    */\n          /*                                                         */\n          /* In FreeType speak:                                      */\n          /*                                                         */\n          /*   new_dist = cur_dist -                                 */\n          /*              org_dist - cur_dist;                       */\n\n          new_dist = -org_dist;\n        }\n      }\n      else\n        new_dist = 0;\n\n      CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist );\n    }\n\n  Fail:\n    CUR.GS.loop = 1;\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* UTP[a]:       UnTouch Point                                           */\n  /* Opcode range: 0x29                                                    */\n  /* Stack:        uint32 -->                                              */\n  /*                                                                       */\n  static void\n  Ins_UTP( INS_ARG )\n  {\n    FT_UShort  point;\n    FT_Byte    mask;\n\n\n    point = (FT_UShort)args[0];\n\n    if ( BOUNDS( point, CUR.zp0.n_points ) )\n    {\n      if ( CUR.pedantic_hinting )\n        CUR.error = FT_THROW( Invalid_Reference );\n      return;\n    }\n\n    mask = 0xFF;\n\n    if ( CUR.GS.freeVector.x != 0 )\n      mask &= ~FT_CURVE_TAG_TOUCH_X;\n\n    if ( CUR.GS.freeVector.y != 0 )\n      mask &= ~FT_CURVE_TAG_TOUCH_Y;\n\n    CUR.zp0.tags[point] &= mask;\n  }\n\n\n  /* Local variables for Ins_IUP: */\n  typedef struct  IUP_WorkerRec_\n  {\n    FT_Vector*  orgs;   /* original and current coordinate */\n    FT_Vector*  curs;   /* arrays                          */\n    FT_Vector*  orus;\n    FT_UInt     max_points;\n\n  } IUP_WorkerRec, *IUP_Worker;\n\n\n  static void\n  _iup_worker_shift( IUP_Worker  worker,\n                     FT_UInt     p1,\n                     FT_UInt     p2,\n                     FT_UInt     p )\n  {\n    FT_UInt     i;\n    FT_F26Dot6  dx;\n\n\n    dx = worker->curs[p].x - worker->orgs[p].x;\n    if ( dx != 0 )\n    {\n      for ( i = p1; i < p; i++ )\n        worker->curs[i].x += dx;\n\n      for ( i = p + 1; i <= p2; i++ )\n        worker->curs[i].x += dx;\n    }\n  }\n\n\n  static void\n  _iup_worker_interpolate( IUP_Worker  worker,\n                           FT_UInt     p1,\n                           FT_UInt     p2,\n                           FT_UInt     ref1,\n                           FT_UInt     ref2 )\n  {\n    FT_UInt     i;\n    FT_F26Dot6  orus1, orus2, org1, org2, delta1, delta2;\n\n\n    if ( p1 > p2 )\n      return;\n\n    if ( BOUNDS( ref1, worker->max_points ) ||\n         BOUNDS( ref2, worker->max_points ) )\n      return;\n\n    orus1 = worker->orus[ref1].x;\n    orus2 = worker->orus[ref2].x;\n\n    if ( orus1 > orus2 )\n    {\n      FT_F26Dot6  tmp_o;\n      FT_UInt     tmp_r;\n\n\n      tmp_o = orus1;\n      orus1 = orus2;\n      orus2 = tmp_o;\n\n      tmp_r = ref1;\n      ref1  = ref2;\n      ref2  = tmp_r;\n    }\n\n    org1   = worker->orgs[ref1].x;\n    org2   = worker->orgs[ref2].x;\n    delta1 = worker->curs[ref1].x - org1;\n    delta2 = worker->curs[ref2].x - org2;\n\n    if ( orus1 == orus2 )\n    {\n      /* simple shift of untouched points */\n      for ( i = p1; i <= p2; i++ )\n      {\n        FT_F26Dot6  x = worker->orgs[i].x;\n\n\n        if ( x <= org1 )\n          x += delta1;\n        else\n          x += delta2;\n\n        worker->curs[i].x = x;\n      }\n    }\n    else\n    {\n      FT_Fixed  scale       = 0;\n      FT_Bool   scale_valid = 0;\n\n\n      /* interpolation */\n      for ( i = p1; i <= p2; i++ )\n      {\n        FT_F26Dot6  x = worker->orgs[i].x;\n\n\n        if ( x <= org1 )\n          x += delta1;\n\n        else if ( x >= org2 )\n          x += delta2;\n\n        else\n        {\n          if ( !scale_valid )\n          {\n            scale_valid = 1;\n            scale       = FT_DivFix( org2 + delta2 - ( org1 + delta1 ),\n                                     orus2 - orus1 );\n          }\n\n          x = ( org1 + delta1 ) +\n              FT_MulFix( worker->orus[i].x - orus1, scale );\n        }\n        worker->curs[i].x = x;\n      }\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* IUP[a]:       Interpolate Untouched Points                            */\n  /* Opcode range: 0x30-0x31                                               */\n  /* Stack:        -->                                                     */\n  /*                                                                       */\n  static void\n  Ins_IUP( INS_ARG )\n  {\n    IUP_WorkerRec  V;\n    FT_Byte        mask;\n\n    FT_UInt   first_point;   /* first point of contour        */\n    FT_UInt   end_point;     /* end point (last+1) of contour */\n\n    FT_UInt   first_touched; /* first touched point in contour   */\n    FT_UInt   cur_touched;   /* current touched point in contour */\n\n    FT_UInt   point;         /* current point   */\n    FT_Short  contour;       /* current contour */\n\n    FT_UNUSED_ARG;\n\n\n    /* ignore empty outlines */\n    if ( CUR.pts.n_contours == 0 )\n      return;\n\n    if ( CUR.opcode & 1 )\n    {\n      mask   = FT_CURVE_TAG_TOUCH_X;\n      V.orgs = CUR.pts.org;\n      V.curs = CUR.pts.cur;\n      V.orus = CUR.pts.orus;\n    }\n    else\n    {\n      mask   = FT_CURVE_TAG_TOUCH_Y;\n      V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 );\n      V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 );\n      V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 );\n    }\n    V.max_points = CUR.pts.n_points;\n\n    contour = 0;\n    point   = 0;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( CUR.ignore_x_mode )\n    {\n      CUR.iup_called = 1;\n      if ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_IUP )\n        return;\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    do\n    {\n      end_point   = CUR.pts.contours[contour] - CUR.pts.first_point;\n      first_point = point;\n\n      if ( BOUNDS ( end_point, CUR.pts.n_points ) )\n        end_point = CUR.pts.n_points - 1;\n\n      while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 )\n        point++;\n\n      if ( point <= end_point )\n      {\n        first_touched = point;\n        cur_touched   = point;\n\n        point++;\n\n        while ( point <= end_point )\n        {\n          if ( ( CUR.pts.tags[point] & mask ) != 0 )\n          {\n            _iup_worker_interpolate( &V,\n                                     cur_touched + 1,\n                                     point - 1,\n                                     cur_touched,\n                                     point );\n            cur_touched = point;\n          }\n\n          point++;\n        }\n\n        if ( cur_touched == first_touched )\n          _iup_worker_shift( &V, first_point, end_point, cur_touched );\n        else\n        {\n          _iup_worker_interpolate( &V,\n                                   (FT_UShort)( cur_touched + 1 ),\n                                   end_point,\n                                   cur_touched,\n                                   first_touched );\n\n          if ( first_touched > 0 )\n            _iup_worker_interpolate( &V,\n                                     first_point,\n                                     first_touched - 1,\n                                     cur_touched,\n                                     first_touched );\n        }\n      }\n      contour++;\n    } while ( contour < CUR.pts.n_contours );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DELTAPn[]:    DELTA exceptions P1, P2, P3                             */\n  /* Opcode range: 0x5D,0x71,0x72                                          */\n  /* Stack:        uint32 (2 * uint32)... -->                              */\n  /*                                                                       */\n  static void\n  Ins_DELTAP( INS_ARG )\n  {\n    FT_ULong   k, nump;\n    FT_UShort  A;\n    FT_ULong   C;\n    FT_Long    B;\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    FT_UShort  B1, B2;\n#endif\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    /* Delta hinting is covered by US Patent 5159668. */\n    if ( CUR.face->unpatented_hinting )\n    {\n      FT_Long  n = args[0] * 2;\n\n\n      if ( CUR.args < n )\n      {\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Too_Few_Arguments );\n        n = CUR.args;\n      }\n\n      CUR.args -= n;\n      CUR.new_top = CUR.args;\n      return;\n    }\n#endif\n\n    nump = (FT_ULong)args[0];   /* some points theoretically may occur more\n                                   than once, thus UShort isn't enough */\n\n    for ( k = 1; k <= nump; k++ )\n    {\n      if ( CUR.args < 2 )\n      {\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Too_Few_Arguments );\n        CUR.args = 0;\n        goto Fail;\n      }\n\n      CUR.args -= 2;\n\n      A = (FT_UShort)CUR.stack[CUR.args + 1];\n      B = CUR.stack[CUR.args];\n\n      /* XXX: Because some popular fonts contain some invalid DeltaP */\n      /*      instructions, we simply ignore them when the stacked   */\n      /*      point reference is off limit, rather than returning an */\n      /*      error.  As a delta instruction doesn't change a glyph  */\n      /*      in great ways, this shouldn't be a problem.            */\n\n      if ( !BOUNDS( A, CUR.zp0.n_points ) )\n      {\n        C = ( (FT_ULong)B & 0xF0 ) >> 4;\n\n        switch ( CUR.opcode )\n        {\n        case 0x5D:\n          break;\n\n        case 0x71:\n          C += 16;\n          break;\n\n        case 0x72:\n          C += 32;\n          break;\n        }\n\n        C += CUR.GS.delta_base;\n\n        if ( CURRENT_Ppem() == (FT_Long)C )\n        {\n          B = ( (FT_ULong)B & 0xF ) - 8;\n          if ( B >= 0 )\n            B++;\n          B = B * 64 / ( 1L << CUR.GS.delta_shift );\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n          /*\n           *  Allow delta move if\n           *\n           *  - not using ignore_x_mode rendering\n           *  - glyph is specifically set to allow it\n           *  - glyph is composite and freedom vector is not subpixel vector\n           */\n          if ( !CUR.ignore_x_mode                                   ||\n               ( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||\n               ( CUR.is_composite && CUR.GS.freeVector.y != 0 )     )\n            CUR_Func_move( &CUR.zp0, A, B );\n\n          /* Otherwise apply subpixel hinting and compatibility mode rules */\n          else if ( CUR.ignore_x_mode )\n          {\n            if ( CUR.GS.freeVector.y != 0 )\n              B1 = CUR.zp0.cur[A].y;\n            else\n              B1 = CUR.zp0.cur[A].x;\n#if 0\n            /* Standard Subpixel Hinting: Allow y move.       */\n            /* This messes up dejavu and may not be needed... */\n            if ( !CUR.face->sph_compatibility_mode &&\n                 CUR.GS.freeVector.y != 0           )\n              CUR_Func_move( &CUR.zp0, A, B );\n            else\n#endif\n            /* Compatibility Mode: Allow x or y move if point touched in */\n            /* Y direction.                                              */\n            if ( CUR.face->sph_compatibility_mode                      &&\n                 !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) )\n            {\n              /* save the y value of the point now; compare after move */\n              B1 = CUR.zp0.cur[A].y;\n\n              if ( ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) )\n                B = FT_PIX_ROUND( B1 + B ) - B1;\n\n              /* Allow delta move if using sph_compatibility_mode,   */\n              /* IUP has not been called, and point is touched on Y. */\n              if ( !CUR.iup_called                            &&\n                   ( CUR.zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )\n                CUR_Func_move( &CUR.zp0, A, B );\n            }\n\n            B2 = CUR.zp0.cur[A].y;\n\n            /* Reverse this move if it results in a disallowed move */\n            if ( CUR.GS.freeVector.y != 0                    &&\n                 ( ( CUR.face->sph_compatibility_mode    &&\n                     ( B1 & 63 ) == 0                    &&\n                     ( B2 & 63 ) != 0                    ) ||\n                   ( ( CUR.sph_tweak_flags             &\n                       SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&\n                     ( B1 & 63 ) != 0                    &&\n                     ( B2 & 63 ) != 0                    ) ) )\n              CUR_Func_move( &CUR.zp0, A, -B );\n          }\n#else\n          CUR_Func_move( &CUR.zp0, A, B );\n#endif /* *TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n        }\n      }\n      else\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Invalid_Reference );\n    }\n\n  Fail:\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* DELTACn[]:    DELTA exceptions C1, C2, C3                             */\n  /* Opcode range: 0x73,0x74,0x75                                          */\n  /* Stack:        uint32 (2 * uint32)... -->                              */\n  /*                                                                       */\n  static void\n  Ins_DELTAC( INS_ARG )\n  {\n    FT_ULong  nump, k;\n    FT_ULong  A, C;\n    FT_Long   B;\n\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    /* Delta hinting is covered by US Patent 5159668. */\n    if ( CUR.face->unpatented_hinting )\n    {\n      FT_Long  n = args[0] * 2;\n\n\n      if ( CUR.args < n )\n      {\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Too_Few_Arguments );\n        n = CUR.args;\n      }\n\n      CUR.args -= n;\n      CUR.new_top = CUR.args;\n      return;\n    }\n#endif\n\n    nump = (FT_ULong)args[0];\n\n    for ( k = 1; k <= nump; k++ )\n    {\n      if ( CUR.args < 2 )\n      {\n        if ( CUR.pedantic_hinting )\n          CUR.error = FT_THROW( Too_Few_Arguments );\n        CUR.args = 0;\n        goto Fail;\n      }\n\n      CUR.args -= 2;\n\n      A = (FT_ULong)CUR.stack[CUR.args + 1];\n      B = CUR.stack[CUR.args];\n\n      if ( BOUNDSL( A, CUR.cvtSize ) )\n      {\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Invalid_Reference );\n          return;\n        }\n      }\n      else\n      {\n        C = ( (FT_ULong)B & 0xF0 ) >> 4;\n\n        switch ( CUR.opcode )\n        {\n        case 0x73:\n          break;\n\n        case 0x74:\n          C += 16;\n          break;\n\n        case 0x75:\n          C += 32;\n          break;\n        }\n\n        C += CUR.GS.delta_base;\n\n        if ( CURRENT_Ppem() == (FT_Long)C )\n        {\n          B = ( (FT_ULong)B & 0xF ) - 8;\n          if ( B >= 0 )\n            B++;\n          B = B * 64 / ( 1L << CUR.GS.delta_shift );\n\n          CUR_Func_move_cvt( A, B );\n        }\n      }\n    }\n\n  Fail:\n    CUR.new_top = CUR.args;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* MISC. INSTRUCTIONS                                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* GETINFO[]:    GET INFOrmation                                         */\n  /* Opcode range: 0x88                                                    */\n  /* Stack:        uint32 --> uint32                                       */\n  /*                                                                       */\n  static void\n  Ins_GETINFO( INS_ARG )\n  {\n    FT_Long  K;\n\n\n    K = 0;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    /********************************/\n    /* RASTERIZER VERSION           */\n    /* Selector Bit:  0             */\n    /* Return Bit(s): 0-7           */\n    /*                              */\n    if ( ( args[0] & 1 ) != 0 && CUR.ignore_x_mode )\n    {\n      K = CUR.rasterizer_version;\n      FT_TRACE7(( \"Setting rasterizer version %d\\n\",\n                  CUR.rasterizer_version ));\n    }\n    else\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n      if ( ( args[0] & 1 ) != 0 )\n        K = 35;\n\n    /********************************/\n    /* GLYPH ROTATED                */\n    /* Selector Bit:  1             */\n    /* Return Bit(s): 8             */\n    /*                              */\n    if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated )\n      K |= 0x80;\n\n    /********************************/\n    /* GLYPH STRETCHED              */\n    /* Selector Bit:  2             */\n    /* Return Bit(s): 9             */\n    /*                              */\n    if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched )\n      K |= 1 << 8;\n\n    /********************************/\n    /* HINTING FOR GRAYSCALE        */\n    /* Selector Bit:  5             */\n    /* Return Bit(s): 12            */\n    /*                              */\n    if ( ( args[0] & 32 ) != 0 && CUR.grayscale )\n      K |= 1 << 12;\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    if ( CUR.ignore_x_mode && CUR.rasterizer_version >= 35 )\n    {\n      /********************************/\n      /* HINTING FOR GRAYSCALE        */\n      /* Selector Bit:  5             */\n      /* Return Bit(s): 12            */\n      /*                              */\n      if ( ( args[0] & 32 ) != 0 && CUR.grayscale_hinting )\n        K |= 1 << 12;\n\n      /********************************/\n      /* HINTING FOR SUBPIXEL         */\n      /* Selector Bit:  6             */\n      /* Return Bit(s): 13            */\n      /*                              */\n      if ( ( args[0] & 64 ) != 0        &&\n           CUR.subpixel_hinting         &&\n           CUR.rasterizer_version >= 37 )\n      {\n        K |= 1 << 13;\n\n        /* the stuff below is irrelevant if subpixel_hinting is not set */\n\n        /********************************/\n        /* COMPATIBLE WIDTHS ENABLED    */\n        /* Selector Bit:  7             */\n        /* Return Bit(s): 14            */\n        /*                              */\n        /* Functionality still needs to be added */\n        if ( ( args[0] & 128 ) != 0 && CUR.compatible_widths )\n          K |= 1 << 14;\n\n        /********************************/\n        /* SYMMETRICAL SMOOTHING        */\n        /* Selector Bit:  8             */\n        /* Return Bit(s): 15            */\n        /*                              */\n        /* Functionality still needs to be added */\n        if ( ( args[0] & 256 ) != 0 && CUR.symmetrical_smoothing )\n          K |= 1 << 15;\n\n        /********************************/\n        /* HINTING FOR BGR?             */\n        /* Selector Bit:  9             */\n        /* Return Bit(s): 16            */\n        /*                              */\n        /* Functionality still needs to be added */\n        if ( ( args[0] & 512 ) != 0 && CUR.bgr )\n          K |= 1 << 16;\n\n        if ( CUR.rasterizer_version >= 38 )\n        {\n          /********************************/\n          /* SUBPIXEL POSITIONED?         */\n          /* Selector Bit:  10            */\n          /* Return Bit(s): 17            */\n          /*                              */\n          /* Functionality still needs to be added */\n          if ( ( args[0] & 1024 ) != 0 && CUR.subpixel_positioned )\n            K |= 1 << 17;\n        }\n      }\n    }\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n    args[0] = K;\n  }\n\n\n  static void\n  Ins_UNKNOWN( INS_ARG )\n  {\n    TT_DefRecord*  def   = CUR.IDefs;\n    TT_DefRecord*  limit = def + CUR.numIDefs;\n\n    FT_UNUSED_ARG;\n\n\n    for ( ; def < limit; def++ )\n    {\n      if ( (FT_Byte)def->opc == CUR.opcode && def->active )\n      {\n        TT_CallRec*  call;\n\n\n        if ( CUR.callTop >= CUR.callSize )\n        {\n          CUR.error = FT_THROW( Stack_Overflow );\n          return;\n        }\n\n        call = CUR.callStack + CUR.callTop++;\n\n        call->Caller_Range = CUR.curRange;\n        call->Caller_IP    = CUR.IP + 1;\n        call->Cur_Count    = 1;\n        call->Cur_Restart  = def->start;\n        call->Cur_End      = def->end;\n\n        INS_Goto_CodeRange( def->range, def->start );\n\n        CUR.step_ins = FALSE;\n        return;\n      }\n    }\n\n    CUR.error = FT_THROW( Invalid_Opcode );\n  }\n\n\n#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH\n\n\n  static\n  TInstruction_Function  Instruct_Dispatch[256] =\n  {\n    /* Opcodes are gathered in groups of 16. */\n    /* Please keep the spaces as they are.   */\n\n    /*  SVTCA  y  */  Ins_SVTCA,\n    /*  SVTCA  x  */  Ins_SVTCA,\n    /*  SPvTCA y  */  Ins_SPVTCA,\n    /*  SPvTCA x  */  Ins_SPVTCA,\n    /*  SFvTCA y  */  Ins_SFVTCA,\n    /*  SFvTCA x  */  Ins_SFVTCA,\n    /*  SPvTL //  */  Ins_SPVTL,\n    /*  SPvTL +   */  Ins_SPVTL,\n    /*  SFvTL //  */  Ins_SFVTL,\n    /*  SFvTL +   */  Ins_SFVTL,\n    /*  SPvFS     */  Ins_SPVFS,\n    /*  SFvFS     */  Ins_SFVFS,\n    /*  GPV       */  Ins_GPV,\n    /*  GFV       */  Ins_GFV,\n    /*  SFvTPv    */  Ins_SFVTPV,\n    /*  ISECT     */  Ins_ISECT,\n\n    /*  SRP0      */  Ins_SRP0,\n    /*  SRP1      */  Ins_SRP1,\n    /*  SRP2      */  Ins_SRP2,\n    /*  SZP0      */  Ins_SZP0,\n    /*  SZP1      */  Ins_SZP1,\n    /*  SZP2      */  Ins_SZP2,\n    /*  SZPS      */  Ins_SZPS,\n    /*  SLOOP     */  Ins_SLOOP,\n    /*  RTG       */  Ins_RTG,\n    /*  RTHG      */  Ins_RTHG,\n    /*  SMD       */  Ins_SMD,\n    /*  ELSE      */  Ins_ELSE,\n    /*  JMPR      */  Ins_JMPR,\n    /*  SCvTCi    */  Ins_SCVTCI,\n    /*  SSwCi     */  Ins_SSWCI,\n    /*  SSW       */  Ins_SSW,\n\n    /*  DUP       */  Ins_DUP,\n    /*  POP       */  Ins_POP,\n    /*  CLEAR     */  Ins_CLEAR,\n    /*  SWAP      */  Ins_SWAP,\n    /*  DEPTH     */  Ins_DEPTH,\n    /*  CINDEX    */  Ins_CINDEX,\n    /*  MINDEX    */  Ins_MINDEX,\n    /*  AlignPTS  */  Ins_ALIGNPTS,\n    /*  INS_0x28  */  Ins_UNKNOWN,\n    /*  UTP       */  Ins_UTP,\n    /*  LOOPCALL  */  Ins_LOOPCALL,\n    /*  CALL      */  Ins_CALL,\n    /*  FDEF      */  Ins_FDEF,\n    /*  ENDF      */  Ins_ENDF,\n    /*  MDAP[0]   */  Ins_MDAP,\n    /*  MDAP[1]   */  Ins_MDAP,\n\n    /*  IUP[0]    */  Ins_IUP,\n    /*  IUP[1]    */  Ins_IUP,\n    /*  SHP[0]    */  Ins_SHP,\n    /*  SHP[1]    */  Ins_SHP,\n    /*  SHC[0]    */  Ins_SHC,\n    /*  SHC[1]    */  Ins_SHC,\n    /*  SHZ[0]    */  Ins_SHZ,\n    /*  SHZ[1]    */  Ins_SHZ,\n    /*  SHPIX     */  Ins_SHPIX,\n    /*  IP        */  Ins_IP,\n    /*  MSIRP[0]  */  Ins_MSIRP,\n    /*  MSIRP[1]  */  Ins_MSIRP,\n    /*  AlignRP   */  Ins_ALIGNRP,\n    /*  RTDG      */  Ins_RTDG,\n    /*  MIAP[0]   */  Ins_MIAP,\n    /*  MIAP[1]   */  Ins_MIAP,\n\n    /*  NPushB    */  Ins_NPUSHB,\n    /*  NPushW    */  Ins_NPUSHW,\n    /*  WS        */  Ins_WS,\n    /*  RS        */  Ins_RS,\n    /*  WCvtP     */  Ins_WCVTP,\n    /*  RCvt      */  Ins_RCVT,\n    /*  GC[0]     */  Ins_GC,\n    /*  GC[1]     */  Ins_GC,\n    /*  SCFS      */  Ins_SCFS,\n    /*  MD[0]     */  Ins_MD,\n    /*  MD[1]     */  Ins_MD,\n    /*  MPPEM     */  Ins_MPPEM,\n    /*  MPS       */  Ins_MPS,\n    /*  FlipON    */  Ins_FLIPON,\n    /*  FlipOFF   */  Ins_FLIPOFF,\n    /*  DEBUG     */  Ins_DEBUG,\n\n    /*  LT        */  Ins_LT,\n    /*  LTEQ      */  Ins_LTEQ,\n    /*  GT        */  Ins_GT,\n    /*  GTEQ      */  Ins_GTEQ,\n    /*  EQ        */  Ins_EQ,\n    /*  NEQ       */  Ins_NEQ,\n    /*  ODD       */  Ins_ODD,\n    /*  EVEN      */  Ins_EVEN,\n    /*  IF        */  Ins_IF,\n    /*  EIF       */  Ins_EIF,\n    /*  AND       */  Ins_AND,\n    /*  OR        */  Ins_OR,\n    /*  NOT       */  Ins_NOT,\n    /*  DeltaP1   */  Ins_DELTAP,\n    /*  SDB       */  Ins_SDB,\n    /*  SDS       */  Ins_SDS,\n\n    /*  ADD       */  Ins_ADD,\n    /*  SUB       */  Ins_SUB,\n    /*  DIV       */  Ins_DIV,\n    /*  MUL       */  Ins_MUL,\n    /*  ABS       */  Ins_ABS,\n    /*  NEG       */  Ins_NEG,\n    /*  FLOOR     */  Ins_FLOOR,\n    /*  CEILING   */  Ins_CEILING,\n    /*  ROUND[0]  */  Ins_ROUND,\n    /*  ROUND[1]  */  Ins_ROUND,\n    /*  ROUND[2]  */  Ins_ROUND,\n    /*  ROUND[3]  */  Ins_ROUND,\n    /*  NROUND[0] */  Ins_NROUND,\n    /*  NROUND[1] */  Ins_NROUND,\n    /*  NROUND[2] */  Ins_NROUND,\n    /*  NROUND[3] */  Ins_NROUND,\n\n    /*  WCvtF     */  Ins_WCVTF,\n    /*  DeltaP2   */  Ins_DELTAP,\n    /*  DeltaP3   */  Ins_DELTAP,\n    /*  DeltaCn[0] */ Ins_DELTAC,\n    /*  DeltaCn[1] */ Ins_DELTAC,\n    /*  DeltaCn[2] */ Ins_DELTAC,\n    /*  SROUND    */  Ins_SROUND,\n    /*  S45Round  */  Ins_S45ROUND,\n    /*  JROT      */  Ins_JROT,\n    /*  JROF      */  Ins_JROF,\n    /*  ROFF      */  Ins_ROFF,\n    /*  INS_0x7B  */  Ins_UNKNOWN,\n    /*  RUTG      */  Ins_RUTG,\n    /*  RDTG      */  Ins_RDTG,\n    /*  SANGW     */  Ins_SANGW,\n    /*  AA        */  Ins_AA,\n\n    /*  FlipPT    */  Ins_FLIPPT,\n    /*  FlipRgON  */  Ins_FLIPRGON,\n    /*  FlipRgOFF */  Ins_FLIPRGOFF,\n    /*  INS_0x83  */  Ins_UNKNOWN,\n    /*  INS_0x84  */  Ins_UNKNOWN,\n    /*  ScanCTRL  */  Ins_SCANCTRL,\n    /*  SDPVTL[0] */  Ins_SDPVTL,\n    /*  SDPVTL[1] */  Ins_SDPVTL,\n    /*  GetINFO   */  Ins_GETINFO,\n    /*  IDEF      */  Ins_IDEF,\n    /*  ROLL      */  Ins_ROLL,\n    /*  MAX       */  Ins_MAX,\n    /*  MIN       */  Ins_MIN,\n    /*  ScanTYPE  */  Ins_SCANTYPE,\n    /*  InstCTRL  */  Ins_INSTCTRL,\n    /*  INS_0x8F  */  Ins_UNKNOWN,\n\n    /*  INS_0x90  */   Ins_UNKNOWN,\n    /*  INS_0x91  */   Ins_UNKNOWN,\n    /*  INS_0x92  */   Ins_UNKNOWN,\n    /*  INS_0x93  */   Ins_UNKNOWN,\n    /*  INS_0x94  */   Ins_UNKNOWN,\n    /*  INS_0x95  */   Ins_UNKNOWN,\n    /*  INS_0x96  */   Ins_UNKNOWN,\n    /*  INS_0x97  */   Ins_UNKNOWN,\n    /*  INS_0x98  */   Ins_UNKNOWN,\n    /*  INS_0x99  */   Ins_UNKNOWN,\n    /*  INS_0x9A  */   Ins_UNKNOWN,\n    /*  INS_0x9B  */   Ins_UNKNOWN,\n    /*  INS_0x9C  */   Ins_UNKNOWN,\n    /*  INS_0x9D  */   Ins_UNKNOWN,\n    /*  INS_0x9E  */   Ins_UNKNOWN,\n    /*  INS_0x9F  */   Ins_UNKNOWN,\n\n    /*  INS_0xA0  */   Ins_UNKNOWN,\n    /*  INS_0xA1  */   Ins_UNKNOWN,\n    /*  INS_0xA2  */   Ins_UNKNOWN,\n    /*  INS_0xA3  */   Ins_UNKNOWN,\n    /*  INS_0xA4  */   Ins_UNKNOWN,\n    /*  INS_0xA5  */   Ins_UNKNOWN,\n    /*  INS_0xA6  */   Ins_UNKNOWN,\n    /*  INS_0xA7  */   Ins_UNKNOWN,\n    /*  INS_0xA8  */   Ins_UNKNOWN,\n    /*  INS_0xA9  */   Ins_UNKNOWN,\n    /*  INS_0xAA  */   Ins_UNKNOWN,\n    /*  INS_0xAB  */   Ins_UNKNOWN,\n    /*  INS_0xAC  */   Ins_UNKNOWN,\n    /*  INS_0xAD  */   Ins_UNKNOWN,\n    /*  INS_0xAE  */   Ins_UNKNOWN,\n    /*  INS_0xAF  */   Ins_UNKNOWN,\n\n    /*  PushB[0]  */  Ins_PUSHB,\n    /*  PushB[1]  */  Ins_PUSHB,\n    /*  PushB[2]  */  Ins_PUSHB,\n    /*  PushB[3]  */  Ins_PUSHB,\n    /*  PushB[4]  */  Ins_PUSHB,\n    /*  PushB[5]  */  Ins_PUSHB,\n    /*  PushB[6]  */  Ins_PUSHB,\n    /*  PushB[7]  */  Ins_PUSHB,\n    /*  PushW[0]  */  Ins_PUSHW,\n    /*  PushW[1]  */  Ins_PUSHW,\n    /*  PushW[2]  */  Ins_PUSHW,\n    /*  PushW[3]  */  Ins_PUSHW,\n    /*  PushW[4]  */  Ins_PUSHW,\n    /*  PushW[5]  */  Ins_PUSHW,\n    /*  PushW[6]  */  Ins_PUSHW,\n    /*  PushW[7]  */  Ins_PUSHW,\n\n    /*  MDRP[00]  */  Ins_MDRP,\n    /*  MDRP[01]  */  Ins_MDRP,\n    /*  MDRP[02]  */  Ins_MDRP,\n    /*  MDRP[03]  */  Ins_MDRP,\n    /*  MDRP[04]  */  Ins_MDRP,\n    /*  MDRP[05]  */  Ins_MDRP,\n    /*  MDRP[06]  */  Ins_MDRP,\n    /*  MDRP[07]  */  Ins_MDRP,\n    /*  MDRP[08]  */  Ins_MDRP,\n    /*  MDRP[09]  */  Ins_MDRP,\n    /*  MDRP[10]  */  Ins_MDRP,\n    /*  MDRP[11]  */  Ins_MDRP,\n    /*  MDRP[12]  */  Ins_MDRP,\n    /*  MDRP[13]  */  Ins_MDRP,\n    /*  MDRP[14]  */  Ins_MDRP,\n    /*  MDRP[15]  */  Ins_MDRP,\n\n    /*  MDRP[16]  */  Ins_MDRP,\n    /*  MDRP[17]  */  Ins_MDRP,\n    /*  MDRP[18]  */  Ins_MDRP,\n    /*  MDRP[19]  */  Ins_MDRP,\n    /*  MDRP[20]  */  Ins_MDRP,\n    /*  MDRP[21]  */  Ins_MDRP,\n    /*  MDRP[22]  */  Ins_MDRP,\n    /*  MDRP[23]  */  Ins_MDRP,\n    /*  MDRP[24]  */  Ins_MDRP,\n    /*  MDRP[25]  */  Ins_MDRP,\n    /*  MDRP[26]  */  Ins_MDRP,\n    /*  MDRP[27]  */  Ins_MDRP,\n    /*  MDRP[28]  */  Ins_MDRP,\n    /*  MDRP[29]  */  Ins_MDRP,\n    /*  MDRP[30]  */  Ins_MDRP,\n    /*  MDRP[31]  */  Ins_MDRP,\n\n    /*  MIRP[00]  */  Ins_MIRP,\n    /*  MIRP[01]  */  Ins_MIRP,\n    /*  MIRP[02]  */  Ins_MIRP,\n    /*  MIRP[03]  */  Ins_MIRP,\n    /*  MIRP[04]  */  Ins_MIRP,\n    /*  MIRP[05]  */  Ins_MIRP,\n    /*  MIRP[06]  */  Ins_MIRP,\n    /*  MIRP[07]  */  Ins_MIRP,\n    /*  MIRP[08]  */  Ins_MIRP,\n    /*  MIRP[09]  */  Ins_MIRP,\n    /*  MIRP[10]  */  Ins_MIRP,\n    /*  MIRP[11]  */  Ins_MIRP,\n    /*  MIRP[12]  */  Ins_MIRP,\n    /*  MIRP[13]  */  Ins_MIRP,\n    /*  MIRP[14]  */  Ins_MIRP,\n    /*  MIRP[15]  */  Ins_MIRP,\n\n    /*  MIRP[16]  */  Ins_MIRP,\n    /*  MIRP[17]  */  Ins_MIRP,\n    /*  MIRP[18]  */  Ins_MIRP,\n    /*  MIRP[19]  */  Ins_MIRP,\n    /*  MIRP[20]  */  Ins_MIRP,\n    /*  MIRP[21]  */  Ins_MIRP,\n    /*  MIRP[22]  */  Ins_MIRP,\n    /*  MIRP[23]  */  Ins_MIRP,\n    /*  MIRP[24]  */  Ins_MIRP,\n    /*  MIRP[25]  */  Ins_MIRP,\n    /*  MIRP[26]  */  Ins_MIRP,\n    /*  MIRP[27]  */  Ins_MIRP,\n    /*  MIRP[28]  */  Ins_MIRP,\n    /*  MIRP[29]  */  Ins_MIRP,\n    /*  MIRP[30]  */  Ins_MIRP,\n    /*  MIRP[31]  */  Ins_MIRP\n  };\n\n\n#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* RUN                                                                   */\n  /*                                                                       */\n  /*  This function executes a run of opcodes.  It will exit in the        */\n  /*  following cases:                                                     */\n  /*                                                                       */\n  /*  - Errors (in which case it returns FALSE).                           */\n  /*                                                                       */\n  /*  - Reaching the end of the main code range (returns TRUE).            */\n  /*    Reaching the end of a code range within a function call is an      */\n  /*    error.                                                             */\n  /*                                                                       */\n  /*  - After executing one single opcode, if the flag `Instruction_Trap'  */\n  /*    is set to TRUE (returns TRUE).                                     */\n  /*                                                                       */\n  /*  On exit with TRUE, test IP < CodeSize to know whether it comes from  */\n  /*  an instruction trap or a normal termination.                         */\n  /*                                                                       */\n  /*                                                                       */\n  /*  Note: The documented DEBUG opcode pops a value from the stack.  This */\n  /*        behaviour is unsupported; here a DEBUG opcode is always an     */\n  /*        error.                                                         */\n  /*                                                                       */\n  /*                                                                       */\n  /* THIS IS THE INTERPRETER'S MAIN LOOP.                                  */\n  /*                                                                       */\n  /*  Instructions appear in the specification's order.                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /* documentation is in ttinterp.h */\n\n  FT_EXPORT_DEF( FT_Error )\n  TT_RunIns( TT_ExecContext  exc )\n  {\n    FT_Long  ins_counter = 0;  /* executed instructions counter */\n\n\n#ifdef TT_CONFIG_OPTION_STATIC_RASTER\n    cur = *exc;\n#endif\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    CUR.iup_called = FALSE;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n    /* set CVT functions */\n    CUR.tt_metrics.ratio = 0;\n    if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )\n    {\n      /* non-square pixels, use the stretched routines */\n      CUR.func_read_cvt  = Read_CVT_Stretched;\n      CUR.func_write_cvt = Write_CVT_Stretched;\n      CUR.func_move_cvt  = Move_CVT_Stretched;\n    }\n    else\n    {\n      /* square pixels, use normal routines */\n      CUR.func_read_cvt  = Read_CVT;\n      CUR.func_write_cvt = Write_CVT;\n      CUR.func_move_cvt  = Move_CVT;\n    }\n\n    COMPUTE_Funcs();\n    COMPUTE_Round( (FT_Byte)exc->GS.round_state );\n\n    do\n    {\n      CUR.opcode = CUR.code[CUR.IP];\n\n      FT_TRACE7(( \"  \" ));\n      FT_TRACE7(( opcode_name[CUR.opcode] ));\n      FT_TRACE7(( \"\\n\" ));\n\n      if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 )\n      {\n        if ( CUR.IP + 1 >= CUR.codeSize )\n          goto LErrorCodeOverflow_;\n\n        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];\n      }\n\n      if ( CUR.IP + CUR.length > CUR.codeSize )\n        goto LErrorCodeOverflow_;\n\n      /* First, let's check for empty stack and overflow */\n      CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );\n\n      /* `args' is the top of the stack once arguments have been popped. */\n      /* One can also interpret it as the index of the last argument.    */\n      if ( CUR.args < 0 )\n      {\n        FT_UShort  i;\n\n\n        if ( CUR.pedantic_hinting )\n        {\n          CUR.error = FT_THROW( Too_Few_Arguments );\n          goto LErrorLabel_;\n        }\n\n        /* push zeroes onto the stack */\n        for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )\n          CUR.stack[i] = 0;\n        CUR.args = 0;\n      }\n\n      CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );\n\n      /* `new_top' is the new top of the stack, after the instruction's */\n      /* execution.  `top' will be set to `new_top' after the `switch'  */\n      /* statement.                                                     */\n      if ( CUR.new_top > CUR.stackSize )\n      {\n        CUR.error = FT_THROW( Stack_Overflow );\n        goto LErrorLabel_;\n      }\n\n      CUR.step_ins = TRUE;\n      CUR.error    = FT_Err_Ok;\n\n#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH\n\n      {\n        FT_Long*  args   = CUR.stack + CUR.args;\n        FT_Byte   opcode = CUR.opcode;\n\n\n#undef  ARRAY_BOUND_ERROR\n#define ARRAY_BOUND_ERROR  goto Set_Invalid_Ref\n\n\n        switch ( opcode )\n        {\n        case 0x00:  /* SVTCA y  */\n        case 0x01:  /* SVTCA x  */\n        case 0x02:  /* SPvTCA y */\n        case 0x03:  /* SPvTCA x */\n        case 0x04:  /* SFvTCA y */\n        case 0x05:  /* SFvTCA x */\n          {\n            FT_Short  AA, BB;\n\n\n            AA = (FT_Short)( ( opcode & 1 ) << 14 );\n            BB = (FT_Short)( AA ^ 0x4000 );\n\n            if ( opcode < 4 )\n            {\n              CUR.GS.projVector.x = AA;\n              CUR.GS.projVector.y = BB;\n\n              CUR.GS.dualVector.x = AA;\n              CUR.GS.dualVector.y = BB;\n            }\n            else\n            {\n              GUESS_VECTOR( projVector );\n            }\n\n            if ( ( opcode & 2 ) == 0 )\n            {\n              CUR.GS.freeVector.x = AA;\n              CUR.GS.freeVector.y = BB;\n            }\n            else\n            {\n              GUESS_VECTOR( freeVector );\n            }\n\n            COMPUTE_Funcs();\n          }\n          break;\n\n        case 0x06:  /* SPvTL // */\n        case 0x07:  /* SPvTL +  */\n          DO_SPVTL\n          break;\n\n        case 0x08:  /* SFvTL // */\n        case 0x09:  /* SFvTL +  */\n          DO_SFVTL\n          break;\n\n        case 0x0A:  /* SPvFS */\n          DO_SPVFS\n          break;\n\n        case 0x0B:  /* SFvFS */\n          DO_SFVFS\n          break;\n\n        case 0x0C:  /* GPV */\n          DO_GPV\n          break;\n\n        case 0x0D:  /* GFV */\n          DO_GFV\n          break;\n\n        case 0x0E:  /* SFvTPv */\n          DO_SFVTPV\n          break;\n\n        case 0x0F:  /* ISECT  */\n          Ins_ISECT( EXEC_ARG_ args );\n          break;\n\n        case 0x10:  /* SRP0 */\n          DO_SRP0\n          break;\n\n        case 0x11:  /* SRP1 */\n          DO_SRP1\n          break;\n\n        case 0x12:  /* SRP2 */\n          DO_SRP2\n          break;\n\n        case 0x13:  /* SZP0 */\n          Ins_SZP0( EXEC_ARG_ args );\n          break;\n\n        case 0x14:  /* SZP1 */\n          Ins_SZP1( EXEC_ARG_ args );\n          break;\n\n        case 0x15:  /* SZP2 */\n          Ins_SZP2( EXEC_ARG_ args );\n          break;\n\n        case 0x16:  /* SZPS */\n          Ins_SZPS( EXEC_ARG_ args );\n          break;\n\n        case 0x17:  /* SLOOP */\n          DO_SLOOP\n          break;\n\n        case 0x18:  /* RTG */\n          DO_RTG\n          break;\n\n        case 0x19:  /* RTHG */\n          DO_RTHG\n          break;\n\n        case 0x1A:  /* SMD */\n          DO_SMD\n          break;\n\n        case 0x1B:  /* ELSE */\n          Ins_ELSE( EXEC_ARG_ args );\n          break;\n\n        case 0x1C:  /* JMPR */\n          DO_JMPR\n          break;\n\n        case 0x1D:  /* SCVTCI */\n          DO_SCVTCI\n          break;\n\n        case 0x1E:  /* SSWCI */\n          DO_SSWCI\n          break;\n\n        case 0x1F:  /* SSW */\n          DO_SSW\n          break;\n\n        case 0x20:  /* DUP */\n          DO_DUP\n          break;\n\n        case 0x21:  /* POP */\n          /* nothing :-) */\n          break;\n\n        case 0x22:  /* CLEAR */\n          DO_CLEAR\n          break;\n\n        case 0x23:  /* SWAP */\n          DO_SWAP\n          break;\n\n        case 0x24:  /* DEPTH */\n          DO_DEPTH\n          break;\n\n        case 0x25:  /* CINDEX */\n          DO_CINDEX\n          break;\n\n        case 0x26:  /* MINDEX */\n          Ins_MINDEX( EXEC_ARG_ args );\n          break;\n\n        case 0x27:  /* ALIGNPTS */\n          Ins_ALIGNPTS( EXEC_ARG_ args );\n          break;\n\n        case 0x28:  /* ???? */\n          Ins_UNKNOWN( EXEC_ARG_ args );\n          break;\n\n        case 0x29:  /* UTP */\n          Ins_UTP( EXEC_ARG_ args );\n          break;\n\n        case 0x2A:  /* LOOPCALL */\n          Ins_LOOPCALL( EXEC_ARG_ args );\n          break;\n\n        case 0x2B:  /* CALL */\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n          if ( !CUR.ignore_x_mode                                         ||\n               !CUR.iup_called                                            ||\n               ( CUR.iup_called                                         &&\n                 !( CUR.sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n            Ins_CALL( EXEC_ARG_ args );\n          break;\n\n        case 0x2C:  /* FDEF */\n          Ins_FDEF( EXEC_ARG_ args );\n          break;\n\n        case 0x2D:  /* ENDF */\n          Ins_ENDF( EXEC_ARG_ args );\n          break;\n\n        case 0x2E:  /* MDAP */\n        case 0x2F:  /* MDAP */\n          Ins_MDAP( EXEC_ARG_ args );\n          break;\n\n        case 0x30:  /* IUP */\n        case 0x31:  /* IUP */\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n          if ( CUR.ignore_x_mode )\n            CUR.iup_called = TRUE;\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n            Ins_IUP( EXEC_ARG_ args );\n          break;\n\n        case 0x32:  /* SHP */\n        case 0x33:  /* SHP */\n          Ins_SHP( EXEC_ARG_ args );\n          break;\n\n        case 0x34:  /* SHC */\n        case 0x35:  /* SHC */\n          Ins_SHC( EXEC_ARG_ args );\n          break;\n\n        case 0x36:  /* SHZ */\n        case 0x37:  /* SHZ */\n          Ins_SHZ( EXEC_ARG_ args );\n          break;\n\n        case 0x38:  /* SHPIX */\n          Ins_SHPIX( EXEC_ARG_ args );\n          break;\n\n        case 0x39:  /* IP    */\n          Ins_IP( EXEC_ARG_ args );\n          break;\n\n        case 0x3A:  /* MSIRP */\n        case 0x3B:  /* MSIRP */\n          Ins_MSIRP( EXEC_ARG_ args );\n          break;\n\n        case 0x3C:  /* AlignRP */\n          Ins_ALIGNRP( EXEC_ARG_ args );\n          break;\n\n        case 0x3D:  /* RTDG */\n          DO_RTDG\n          break;\n\n        case 0x3E:  /* MIAP */\n        case 0x3F:  /* MIAP */\n          Ins_MIAP( EXEC_ARG_ args );\n          break;\n\n        case 0x40:  /* NPUSHB */\n          Ins_NPUSHB( EXEC_ARG_ args );\n          break;\n\n        case 0x41:  /* NPUSHW */\n          Ins_NPUSHW( EXEC_ARG_ args );\n          break;\n\n        case 0x42:  /* WS */\n          DO_WS\n          break;\n\n      Set_Invalid_Ref:\n            CUR.error = FT_THROW( Invalid_Reference );\n          break;\n\n        case 0x43:  /* RS */\n          DO_RS\n          break;\n\n        case 0x44:  /* WCVTP */\n          DO_WCVTP\n          break;\n\n        case 0x45:  /* RCVT */\n          DO_RCVT\n          break;\n\n        case 0x46:  /* GC */\n        case 0x47:  /* GC */\n          Ins_GC( EXEC_ARG_ args );\n          break;\n\n        case 0x48:  /* SCFS */\n          Ins_SCFS( EXEC_ARG_ args );\n          break;\n\n        case 0x49:  /* MD */\n        case 0x4A:  /* MD */\n          Ins_MD( EXEC_ARG_ args );\n          break;\n\n        case 0x4B:  /* MPPEM */\n          DO_MPPEM\n          break;\n\n        case 0x4C:  /* MPS */\n          DO_MPS\n          break;\n\n        case 0x4D:  /* FLIPON */\n          DO_FLIPON\n          break;\n\n        case 0x4E:  /* FLIPOFF */\n          DO_FLIPOFF\n          break;\n\n        case 0x4F:  /* DEBUG */\n          DO_DEBUG\n          break;\n\n        case 0x50:  /* LT */\n          DO_LT\n          break;\n\n        case 0x51:  /* LTEQ */\n          DO_LTEQ\n          break;\n\n        case 0x52:  /* GT */\n          DO_GT\n          break;\n\n        case 0x53:  /* GTEQ */\n          DO_GTEQ\n          break;\n\n        case 0x54:  /* EQ */\n          DO_EQ\n          break;\n\n        case 0x55:  /* NEQ */\n          DO_NEQ\n          break;\n\n        case 0x56:  /* ODD */\n          DO_ODD\n          break;\n\n        case 0x57:  /* EVEN */\n          DO_EVEN\n          break;\n\n        case 0x58:  /* IF */\n          Ins_IF( EXEC_ARG_ args );\n          break;\n\n        case 0x59:  /* EIF */\n          /* do nothing */\n          break;\n\n        case 0x5A:  /* AND */\n          DO_AND\n          break;\n\n        case 0x5B:  /* OR */\n          DO_OR\n          break;\n\n        case 0x5C:  /* NOT */\n          DO_NOT\n          break;\n\n        case 0x5D:  /* DELTAP1 */\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n          if ( !CUR.ignore_x_mode                                           ||\n               !CUR.iup_called                                              ||\n               ( CUR.iup_called                                           &&\n                 !( CUR.sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) ) )\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n            Ins_DELTAP( EXEC_ARG_ args );\n          break;\n\n        case 0x5E:  /* SDB */\n          DO_SDB\n          break;\n\n        case 0x5F:  /* SDS */\n          DO_SDS\n          break;\n\n        case 0x60:  /* ADD */\n          DO_ADD\n          break;\n\n        case 0x61:  /* SUB */\n          DO_SUB\n          break;\n\n        case 0x62:  /* DIV */\n          DO_DIV\n          break;\n\n        case 0x63:  /* MUL */\n          DO_MUL\n          break;\n\n        case 0x64:  /* ABS */\n          DO_ABS\n          break;\n\n        case 0x65:  /* NEG */\n          DO_NEG\n          break;\n\n        case 0x66:  /* FLOOR */\n          DO_FLOOR\n          break;\n\n        case 0x67:  /* CEILING */\n          DO_CEILING\n          break;\n\n        case 0x68:  /* ROUND */\n        case 0x69:  /* ROUND */\n        case 0x6A:  /* ROUND */\n        case 0x6B:  /* ROUND */\n          DO_ROUND\n          break;\n\n        case 0x6C:  /* NROUND */\n        case 0x6D:  /* NROUND */\n        case 0x6E:  /* NRRUND */\n        case 0x6F:  /* NROUND */\n          DO_NROUND\n          break;\n\n        case 0x70:  /* WCVTF */\n          DO_WCVTF\n          break;\n\n        case 0x71:  /* DELTAP2 */\n        case 0x72:  /* DELTAP3 */\n          Ins_DELTAP( EXEC_ARG_ args );\n          break;\n\n        case 0x73:  /* DELTAC0 */\n        case 0x74:  /* DELTAC1 */\n        case 0x75:  /* DELTAC2 */\n          Ins_DELTAC( EXEC_ARG_ args );\n          break;\n\n        case 0x76:  /* SROUND */\n          DO_SROUND\n          break;\n\n        case 0x77:  /* S45Round */\n          DO_S45ROUND\n          break;\n\n        case 0x78:  /* JROT */\n          DO_JROT\n          break;\n\n        case 0x79:  /* JROF */\n          DO_JROF\n          break;\n\n        case 0x7A:  /* ROFF */\n          DO_ROFF\n          break;\n\n        case 0x7B:  /* ???? */\n          Ins_UNKNOWN( EXEC_ARG_ args );\n          break;\n\n        case 0x7C:  /* RUTG */\n          DO_RUTG\n          break;\n\n        case 0x7D:  /* RDTG */\n          DO_RDTG\n          break;\n\n        case 0x7E:  /* SANGW */\n        case 0x7F:  /* AA    */\n          /* nothing - obsolete */\n          break;\n\n        case 0x80:  /* FLIPPT */\n          Ins_FLIPPT( EXEC_ARG_ args );\n          break;\n\n        case 0x81:  /* FLIPRGON */\n          Ins_FLIPRGON( EXEC_ARG_ args );\n          break;\n\n        case 0x82:  /* FLIPRGOFF */\n          Ins_FLIPRGOFF( EXEC_ARG_ args );\n          break;\n\n        case 0x83:  /* UNKNOWN */\n        case 0x84:  /* UNKNOWN */\n          Ins_UNKNOWN( EXEC_ARG_ args );\n          break;\n\n        case 0x85:  /* SCANCTRL */\n          Ins_SCANCTRL( EXEC_ARG_ args );\n          break;\n\n        case 0x86:  /* SDPVTL */\n        case 0x87:  /* SDPVTL */\n          Ins_SDPVTL( EXEC_ARG_ args );\n          break;\n\n        case 0x88:  /* GETINFO */\n          Ins_GETINFO( EXEC_ARG_ args );\n          break;\n\n        case 0x89:  /* IDEF */\n          Ins_IDEF( EXEC_ARG_ args );\n          break;\n\n        case 0x8A:  /* ROLL */\n          Ins_ROLL( EXEC_ARG_ args );\n          break;\n\n        case 0x8B:  /* MAX */\n          DO_MAX\n          break;\n\n        case 0x8C:  /* MIN */\n          DO_MIN\n          break;\n\n        case 0x8D:  /* SCANTYPE */\n          Ins_SCANTYPE( EXEC_ARG_ args );\n          break;\n\n        case 0x8E:  /* INSTCTRL */\n          Ins_INSTCTRL( EXEC_ARG_ args );\n          break;\n\n        case 0x8F:\n          Ins_UNKNOWN( EXEC_ARG_ args );\n          break;\n\n        default:\n          if ( opcode >= 0xE0 )\n            Ins_MIRP( EXEC_ARG_ args );\n          else if ( opcode >= 0xC0 )\n            Ins_MDRP( EXEC_ARG_ args );\n          else if ( opcode >= 0xB8 )\n            Ins_PUSHW( EXEC_ARG_ args );\n          else if ( opcode >= 0xB0 )\n            Ins_PUSHB( EXEC_ARG_ args );\n          else\n            Ins_UNKNOWN( EXEC_ARG_ args );\n        }\n\n      }\n\n#else\n\n      Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] );\n\n#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */\n\n      if ( CUR.error )\n      {\n        switch ( CUR.error )\n        {\n          /* looking for redefined instructions */\n        case FT_ERR( Invalid_Opcode ):\n          {\n            TT_DefRecord*  def   = CUR.IDefs;\n            TT_DefRecord*  limit = def + CUR.numIDefs;\n\n\n            for ( ; def < limit; def++ )\n            {\n              if ( def->active && CUR.opcode == (FT_Byte)def->opc )\n              {\n                TT_CallRec*  callrec;\n\n\n                if ( CUR.callTop >= CUR.callSize )\n                {\n                  CUR.error = FT_THROW( Invalid_Reference );\n                  goto LErrorLabel_;\n                }\n\n                callrec = &CUR.callStack[CUR.callTop];\n\n                callrec->Caller_Range = CUR.curRange;\n                callrec->Caller_IP    = CUR.IP + 1;\n                callrec->Cur_Count    = 1;\n                callrec->Cur_Restart  = def->start;\n                callrec->Cur_End      = def->end;\n\n                if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )\n                  goto LErrorLabel_;\n\n                goto LSuiteLabel_;\n              }\n            }\n          }\n\n          CUR.error = FT_THROW( Invalid_Opcode );\n          goto LErrorLabel_;\n\n#if 0\n          break;   /* Unreachable code warning suppression.             */\n                   /* Leave to remind in case a later change the editor */\n                   /* to consider break;                                */\n#endif\n\n        default:\n          goto LErrorLabel_;\n\n#if 0\n        break;\n#endif\n        }\n      }\n\n      CUR.top = CUR.new_top;\n\n      if ( CUR.step_ins )\n        CUR.IP += CUR.length;\n\n      /* increment instruction counter and check if we didn't */\n      /* run this program for too long (e.g. infinite loops). */\n      if ( ++ins_counter > MAX_RUNNABLE_OPCODES )\n        return FT_THROW( Execution_Too_Long );\n\n    LSuiteLabel_:\n      if ( CUR.IP >= CUR.codeSize )\n      {\n        if ( CUR.callTop > 0 )\n        {\n          CUR.error = FT_THROW( Code_Overflow );\n          goto LErrorLabel_;\n        }\n        else\n          goto LNo_Error_;\n      }\n    } while ( !CUR.instruction_trap );\n\n  LNo_Error_:\n\n#ifdef TT_CONFIG_OPTION_STATIC_RASTER\n    *exc = cur;\n#endif\n\n    return FT_Err_Ok;\n\n  LErrorCodeOverflow_:\n    CUR.error = FT_THROW( Code_Overflow );\n\n  LErrorLabel_:\n\n#ifdef TT_CONFIG_OPTION_STATIC_RASTER\n    *exc = cur;\n#endif\n\n    /* If any errors have occurred, function tables may be broken. */\n    /* Force a re-execution of `prep' and `fpgm' tables if no      */\n    /* bytecode debugger is run.                                   */\n    if ( CUR.error && !CUR.instruction_trap )\n    {\n      FT_TRACE1(( \"  The interpreter returned error 0x%x\\n\", CUR.error ));\n      exc->size->cvt_ready      = FALSE;\n    }\n\n    return CUR.error;\n  }\n\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttinterp.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttinterp.h                                                             */\n/*                                                                         */\n/*    TrueType bytecode interpreter (specification).                       */\n/*                                                                         */\n/*  Copyright 1996-2007, 2010, 2012-2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTINTERP_H__\n#define __TTINTERP_H__\n\n#include <ft2build.h>\n#include \"ttobjs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */\n\n#define EXEC_OP_   TT_ExecContext  exc,\n#define EXEC_OP    TT_ExecContext  exc\n#define EXEC_ARG_  exc,\n#define EXEC_ARG   exc\n\n#else                                       /* static implementation */\n\n#define EXEC_OP_   /* void */\n#define EXEC_OP    /* void */\n#define EXEC_ARG_  /* void */\n#define EXEC_ARG   /* void */\n\n#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Rounding mode constants.                                              */\n  /*                                                                       */\n#define TT_Round_Off             5\n#define TT_Round_To_Half_Grid    0\n#define TT_Round_To_Grid         1\n#define TT_Round_To_Double_Grid  2\n#define TT_Round_Up_To_Grid      4\n#define TT_Round_Down_To_Grid    3\n#define TT_Round_Super           6\n#define TT_Round_Super_45        7\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Function types used by the interpreter, depending on various modes    */\n  /* (e.g. the rounding mode, whether to render a vertical or horizontal   */\n  /* line etc).                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /* Rounding function */\n  typedef FT_F26Dot6\n  (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6  distance,\n                             FT_F26Dot6  compensation );\n\n  /* Point displacement along the freedom vector routine */\n  typedef void\n  (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone  zone,\n                            FT_UShort     point,\n                            FT_F26Dot6    distance );\n\n  /* Distance projection along one of the projection vectors */\n  typedef FT_F26Dot6\n  (*TT_Project_Func)( EXEC_OP_ FT_Pos   dx,\n                               FT_Pos   dy );\n\n  /* reading a cvt value.  Take care of non-square pixels if necessary */\n  typedef FT_F26Dot6\n  (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong  idx );\n\n  /* setting or moving a cvt value.  Take care of non-square pixels  */\n  /* if necessary                                                    */\n  typedef void\n  (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong    idx,\n                               FT_F26Dot6  value );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This structure defines a call record, used to manage function calls.  */\n  /*                                                                       */\n  typedef struct  TT_CallRec_\n  {\n    FT_Int   Caller_Range;\n    FT_Long  Caller_IP;\n    FT_Long  Cur_Count;\n    FT_Long  Cur_Restart;\n    FT_Long  Cur_End;\n\n  } TT_CallRec, *TT_CallStack;\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* These structures define rules used to tweak subpixel hinting for      */\n  /* various fonts.  \"\", 0, \"\", NULL value indicates to match any value.   */\n  /*                                                                       */\n\n#define SPH_MAX_NAME_SIZE      32\n#define SPH_MAX_CLASS_MEMBERS  100\n\n  typedef struct  SPH_TweakRule_\n  {\n    const char      family[SPH_MAX_NAME_SIZE];\n    const FT_UInt   ppem;\n    const char      style[SPH_MAX_NAME_SIZE];\n    const FT_ULong  glyph;\n\n  } SPH_TweakRule;\n\n\n  typedef struct  SPH_ScaleRule_\n  {\n    const char      family[SPH_MAX_NAME_SIZE];\n    const FT_UInt   ppem;\n    const char      style[SPH_MAX_NAME_SIZE];\n    const FT_ULong  glyph;\n    const FT_ULong  scale;\n\n  } SPH_ScaleRule;\n\n\n  typedef struct  SPH_Font_Class_\n  {\n    const char  name[SPH_MAX_NAME_SIZE];\n    const char  member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE];\n\n  } SPH_Font_Class;\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The main structure for the interpreter which collects all necessary   */\n  /* variables and states.                                                 */\n  /*                                                                       */\n  typedef struct  TT_ExecContextRec_\n  {\n    TT_Face            face;\n    TT_Size            size;\n    FT_Memory          memory;\n\n    /* instructions state */\n\n    FT_Error           error;      /* last execution error */\n\n    FT_Long            top;        /* top of exec. stack   */\n\n    FT_UInt            stackSize;  /* size of exec. stack  */\n    FT_Long*           stack;      /* current exec. stack  */\n\n    FT_Long            args;\n    FT_UInt            new_top;    /* new top after exec.  */\n\n    TT_GlyphZoneRec    zp0,        /* zone records */\n                       zp1,\n                       zp2,\n                       pts,\n                       twilight;\n\n    FT_Size_Metrics    metrics;\n    TT_Size_Metrics    tt_metrics; /* size metrics */\n\n    TT_GraphicsState   GS;         /* current graphics state */\n\n    FT_Int             curRange;  /* current code range number   */\n    FT_Byte*           code;      /* current code range          */\n    FT_Long            IP;        /* current instruction pointer */\n    FT_Long            codeSize;  /* size of current range       */\n\n    FT_Byte            opcode;    /* current opcode              */\n    FT_Int             length;    /* length of current opcode    */\n\n    FT_Bool            step_ins;  /* true if the interpreter must */\n                                  /* increment IP after ins. exec */\n    FT_ULong           cvtSize;\n    FT_Long*           cvt;\n\n    FT_UInt            glyphSize; /* glyph instructions buffer size */\n    FT_Byte*           glyphIns;  /* glyph instructions buffer */\n\n    FT_UInt            numFDefs;  /* number of function defs         */\n    FT_UInt            maxFDefs;  /* maximum number of function defs */\n    TT_DefArray        FDefs;     /* table of FDefs entries          */\n\n    FT_UInt            numIDefs;  /* number of instruction defs */\n    FT_UInt            maxIDefs;  /* maximum number of ins defs */\n    TT_DefArray        IDefs;     /* table of IDefs entries     */\n\n    FT_UInt            maxFunc;   /* maximum function index     */\n    FT_UInt            maxIns;    /* maximum instruction index  */\n\n    FT_Int             callTop,    /* top of call stack during execution */\n                       callSize;   /* size of call stack */\n    TT_CallStack       callStack;  /* call stack */\n\n    FT_UShort          maxPoints;    /* capacity of this context's `pts' */\n    FT_Short           maxContours;  /* record, expressed in points and  */\n                                     /* contours.                        */\n\n    TT_CodeRangeTable  codeRangeTable;  /* table of valid code ranges */\n                                        /* useful for the debugger   */\n\n    FT_UShort          storeSize;  /* size of current storage */\n    FT_Long*           storage;    /* storage area            */\n\n    FT_F26Dot6         period;     /* values used for the */\n    FT_F26Dot6         phase;      /* `SuperRounding'     */\n    FT_F26Dot6         threshold;\n\n#if 0\n    /* this seems to be unused */\n    FT_Int             cur_ppem;   /* ppem along the current proj vector */\n#endif\n\n    FT_Bool            instruction_trap; /* If `True', the interpreter will */\n                                         /* exit after each instruction     */\n\n    TT_GraphicsState   default_GS;       /* graphics state resulting from   */\n                                         /* the prep program                */\n    FT_Bool            is_composite;     /* true if the glyph is composite  */\n    FT_Bool            pedantic_hinting; /* true if pedantic interpretation */\n\n    /* latest interpreter additions */\n\n    FT_Long            F_dot_P;    /* dot product of freedom and projection */\n                                   /* vectors                               */\n    TT_Round_Func      func_round; /* current rounding function             */\n\n    TT_Project_Func    func_project,   /* current projection function */\n                       func_dualproj,  /* current dual proj. function */\n                       func_freeProj;  /* current freedom proj. func  */\n\n    TT_Move_Func       func_move;      /* current point move function */\n    TT_Move_Func       func_move_orig; /* move original position function */\n\n    TT_Get_CVT_Func    func_read_cvt;  /* read a cvt entry              */\n    TT_Set_CVT_Func    func_write_cvt; /* write a cvt entry (in pixels) */\n    TT_Set_CVT_Func    func_move_cvt;  /* incr a cvt entry (in pixels)  */\n\n    FT_Bool            grayscale;      /* are we hinting for grayscale? */\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n    TT_Round_Func      func_round_sphn;   /* subpixel rounding function */\n\n    FT_Bool            grayscale_hinting; /* Using grayscale hinting?      */\n    FT_Bool            subpixel_hinting;  /* Using subpixel hinting?       */\n    FT_Bool            native_hinting;    /* Using native hinting?         */\n    FT_Bool            ignore_x_mode;     /* Standard rendering mode for   */\n                                          /* subpixel hinting.  On if gray */\n                                          /* or subpixel hinting is on )   */\n\n    /* The following 4 aren't fully implemented but here for MS rasterizer */\n    /* compatibility.                                                      */\n    FT_Bool            compatible_widths;     /* compatible widths?        */\n    FT_Bool            symmetrical_smoothing; /* symmetrical_smoothing?    */\n    FT_Bool            bgr;                   /* bgr instead of rgb?       */\n    FT_Bool            subpixel_positioned;   /* subpixel positioned       */\n                                              /* (DirectWrite ClearType)?  */\n\n    FT_Int             rasterizer_version;    /* MS rasterizer version     */\n\n    FT_Bool            iup_called;            /* IUP called for glyph?     */\n\n    FT_ULong           sph_tweak_flags;       /* flags to control          */\n                                              /* hint tweaks               */\n\n    FT_ULong           sph_in_func_flags;     /* flags to indicate if in   */\n                                              /* special functions         */\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n  } TT_ExecContextRec;\n\n\n  extern const TT_GraphicsState  tt_default_graphics_state;\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n  FT_LOCAL( FT_Error )\n  TT_Goto_CodeRange( TT_ExecContext  exec,\n                     FT_Int          range,\n                     FT_Long         IP );\n\n  FT_LOCAL( FT_Error )\n  TT_Set_CodeRange( TT_ExecContext  exec,\n                    FT_Int          range,\n                    void*           base,\n                    FT_Long         length );\n\n  FT_LOCAL( FT_Error )\n  TT_Clear_CodeRange( TT_ExecContext  exec,\n                      FT_Int          range );\n\n\n  FT_LOCAL( FT_Error )\n  Update_Max( FT_Memory  memory,\n              FT_ULong*  size,\n              FT_Long    multiplier,\n              void*      _pbuff,\n              FT_ULong   new_max );\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_New_Context                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Queries the face context for a given font.  Note that there is     */\n  /*    now a _single_ execution context in the TrueType driver which is   */\n  /*    shared among faces.                                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A handle to the source face object.                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    A handle to the execution context.  Initialized for `face'.        */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the glyph loader and debugger should call this function.      */\n  /*                                                                       */\n  FT_EXPORT( TT_ExecContext )\n  TT_New_Context( TT_Driver  driver );\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n  FT_LOCAL( FT_Error )\n  TT_Done_Context( TT_ExecContext  exec );\n\n  FT_LOCAL( FT_Error )\n  TT_Load_Context( TT_ExecContext  exec,\n                   TT_Face         face,\n                   TT_Size         size );\n\n  FT_LOCAL( FT_Error )\n  TT_Save_Context( TT_ExecContext  exec,\n                   TT_Size         ins );\n\n  FT_LOCAL( FT_Error )\n  TT_Run_Context( TT_ExecContext  exec,\n                  FT_Bool         debug );\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    TT_RunIns                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Executes one or more instruction in the execution context.  This   */\n  /*    is the main function of the TrueType opcode interpreter.           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    exec :: A handle to the target execution context.                  */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only the object manager and debugger should call this function.    */\n  /*                                                                       */\n  /*    This function is publicly exported because it is directly          */\n  /*    invoked by the TrueType debugger.                                  */\n  /*                                                                       */\n  FT_EXPORT( FT_Error )\n  TT_RunIns( TT_ExecContext  exec );\n\n\nFT_END_HEADER\n\n#endif /* __TTINTERP_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttobjs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttobjs.c                                                               */\n/*                                                                         */\n/*    Objects manager (body).                                              */\n/*                                                                         */\n/*  Copyright 1996-2013                                                    */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_INTERNAL_SFNT_H\n\n#include \"ttgload.h\"\n#include \"ttpload.h\"\n\n#include \"tterrors.h\"\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n#include \"ttinterp.h\"\n#endif\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n#include FT_TRUETYPE_UNPATENTED_H\n#endif\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.h\"\n#endif\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttobjs\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                       GLYPH ZONE FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_glyphzone_done                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Deallocate a glyph zone.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    zone :: A pointer to the target glyph zone.                        */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_glyphzone_done( TT_GlyphZone  zone )\n  {\n    FT_Memory  memory = zone->memory;\n\n\n    if ( memory )\n    {\n      FT_FREE( zone->contours );\n      FT_FREE( zone->tags );\n      FT_FREE( zone->cur );\n      FT_FREE( zone->org );\n      FT_FREE( zone->orus );\n\n      zone->max_points   = zone->n_points   = 0;\n      zone->max_contours = zone->n_contours = 0;\n      zone->memory       = NULL;\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_glyphzone_new                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Allocate a new glyph zone.                                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    memory      :: A handle to the current memory object.              */\n  /*                                                                       */\n  /*    maxPoints   :: The capacity of glyph zone in points.               */\n  /*                                                                       */\n  /*    maxContours :: The capacity of glyph zone in contours.             */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    zone        :: A pointer to the target glyph zone record.          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_glyphzone_new( FT_Memory     memory,\n                    FT_UShort     maxPoints,\n                    FT_Short      maxContours,\n                    TT_GlyphZone  zone )\n  {\n    FT_Error  error;\n\n\n    FT_MEM_ZERO( zone, sizeof ( *zone ) );\n    zone->memory = memory;\n\n    if ( FT_NEW_ARRAY( zone->org,      maxPoints   ) ||\n         FT_NEW_ARRAY( zone->cur,      maxPoints   ) ||\n         FT_NEW_ARRAY( zone->orus,     maxPoints   ) ||\n         FT_NEW_ARRAY( zone->tags,     maxPoints   ) ||\n         FT_NEW_ARRAY( zone->contours, maxContours ) )\n    {\n      tt_glyphzone_done( zone );\n    }\n    else\n    {\n      zone->max_points   = maxPoints;\n      zone->max_contours = maxContours;\n    }\n\n    return error;\n  }\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n  /* Compare the face with a list of well-known `tricky' fonts. */\n  /* This list shall be expanded as we find more of them.       */\n\n  static FT_Bool\n  tt_check_trickyness_family( FT_String*  name )\n  {\n\n#define TRICK_NAMES_MAX_CHARACTERS  16\n#define TRICK_NAMES_COUNT            8\n\n    static const char trick_names[TRICK_NAMES_COUNT]\n                                 [TRICK_NAMES_MAX_CHARACTERS + 1] =\n    {\n      \"DFKaiSho-SB\",     /* dfkaisb.ttf */\n      \"DFKaiShu\",\n      \"DFKai-SB\",        /* kaiu.ttf */\n      \"HuaTianKaiTi?\",   /* htkt2.ttf */\n      \"HuaTianSongTi?\",  /* htst3.ttf */\n      \"MingLiU\",         /* mingliu.ttf & mingliu.ttc */\n      \"PMingLiU\",        /* mingliu.ttc */\n      \"MingLi43\",        /* mingli.ttf */\n    };\n\n    int  nn;\n\n\n    for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ )\n      if ( ft_strstr( name, trick_names[nn] ) )\n        return TRUE;\n\n    return FALSE;\n  }\n\n\n  /* XXX: This function should be in the `sfnt' module. */\n\n  /* Some PDF generators clear the checksums in the TrueType header table. */\n  /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF     */\n  /* Printer clears the entries for subsetted subtables.  We thus have to  */\n  /* recalculate the checksums  where necessary.                           */\n\n  static FT_UInt32\n  tt_synth_sfnt_checksum( FT_Stream  stream,\n                          FT_ULong   length )\n  {\n    FT_Error   error;\n    FT_UInt32  checksum = 0;\n    int        i;\n\n\n    if ( FT_FRAME_ENTER( length ) )\n      return 0;\n\n    for ( ; length > 3; length -= 4 )\n      checksum += (FT_UInt32)FT_GET_ULONG();\n\n    for ( i = 3; length > 0; length --, i-- )\n      checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) );\n\n    FT_FRAME_EXIT();\n\n    return checksum;\n  }\n\n\n  /* XXX: This function should be in the `sfnt' module. */\n\n  static FT_ULong\n  tt_get_sfnt_checksum( TT_Face    face,\n                        FT_UShort  i )\n  {\n#if 0 /* if we believe the written value, use following part. */\n    if ( face->dir_tables[i].CheckSum )\n      return face->dir_tables[i].CheckSum;\n#endif\n\n    if ( !face->goto_table )\n      return 0;\n\n    if ( face->goto_table( face,\n                           face->dir_tables[i].Tag,\n                           face->root.stream,\n                           NULL ) )\n      return 0;\n\n    return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream,\n                                             face->dir_tables[i].Length );\n  }\n\n\n  typedef struct tt_sfnt_id_rec_\n  {\n    FT_ULong  CheckSum;\n    FT_ULong  Length;\n\n  } tt_sfnt_id_rec;\n\n\n  static FT_Bool\n  tt_check_trickyness_sfnt_ids( TT_Face  face )\n  {\n#define TRICK_SFNT_IDS_PER_FACE   3\n#define TRICK_SFNT_IDS_NUM_FACES  17\n\n    static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]\n                                       [TRICK_SFNT_IDS_PER_FACE] = {\n\n#define TRICK_SFNT_ID_cvt   0\n#define TRICK_SFNT_ID_fpgm  1\n#define TRICK_SFNT_ID_prep  2\n\n      { /* MingLiU 1995 */\n        { 0x05bcf058, 0x000002e4 }, /* cvt  */\n        { 0x28233bf1, 0x000087c4 }, /* fpgm */\n        { 0xa344a1ea, 0x000001e1 }  /* prep */\n      },\n      { /* MingLiU 1996- */\n        { 0x05bcf058, 0x000002e4 }, /* cvt  */\n        { 0x28233bf1, 0x000087c4 }, /* fpgm */\n        { 0xa344a1eb, 0x000001e1 }  /* prep */\n      },\n      { /* DFKaiShu */\n        { 0x11e5ead4, 0x00000350 }, /* cvt  */\n        { 0x5a30ca3b, 0x00009063 }, /* fpgm */\n        { 0x13a42602, 0x0000007e }  /* prep */\n      },\n      { /* HuaTianKaiTi */\n        { 0xfffbfffc, 0x00000008 }, /* cvt  */\n        { 0x9c9e48b8, 0x0000bea2 }, /* fpgm */\n        { 0x70020112, 0x00000008 }  /* prep */\n      },\n      { /* HuaTianSongTi */\n        { 0xfffbfffc, 0x00000008 }, /* cvt  */\n        { 0x0a5a0483, 0x00017c39 }, /* fpgm */\n        { 0x70020112, 0x00000008 }  /* prep */\n      },\n      { /* NEC fadpop7.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x40c92555, 0x000000e5 }, /* fpgm */\n        { 0xa39b58e3, 0x0000117c }  /* prep */\n      },\n      { /* NEC fadrei5.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x33c41652, 0x000000e5 }, /* fpgm */\n        { 0x26d6c52a, 0x00000f6a }  /* prep */\n      },\n      { /* NEC fangot7.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x6db1651d, 0x0000019d }, /* fpgm */\n        { 0x6c6e4b03, 0x00002492 }  /* prep */\n      },\n      { /* NEC fangyo5.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x40c92555, 0x000000e5 }, /* fpgm */\n        { 0xde51fad0, 0x0000117c }  /* prep */\n      },\n      { /* NEC fankyo5.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x85e47664, 0x000000e5 }, /* fpgm */\n        { 0xa6c62831, 0x00001caa }  /* prep */\n      },\n      { /* NEC fanrgo5.ttf */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x2d891cfd, 0x0000019d }, /* fpgm */\n        { 0xa0604633, 0x00001de8 }  /* prep */\n      },\n      { /* NEC fangot5.ttc */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x40aa774c, 0x000001cb }, /* fpgm */\n        { 0x9b5caa96, 0x00001f9a }  /* prep */\n      },\n      { /* NEC fanmin3.ttc */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x0d3de9cb, 0x00000141 }, /* fpgm */\n        { 0xd4127766, 0x00002280 }  /* prep */\n      },\n      { /* NEC FA-Gothic, 1996 */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x4a692698, 0x000001f0 }, /* fpgm */\n        { 0x340d4346, 0x00001fca }  /* prep */\n      },\n      { /* NEC FA-Minchou, 1996 */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0xcd34c604, 0x00000166 }, /* fpgm */\n        { 0x6cf31046, 0x000022b0 }  /* prep */\n      },\n      { /* NEC FA-RoundGothicB, 1996 */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0x5da75315, 0x0000019d }, /* fpgm */\n        { 0x40745a5f, 0x000022e0 }  /* prep */\n      },\n      { /* NEC FA-RoundGothicM, 1996 */\n        { 0x00000000, 0x00000000 }, /* cvt  */\n        { 0xf055fc48, 0x000001c2 }, /* fpgm */\n        { 0x3900ded3, 0x00001e18 }  /* prep */\n      }\n    };\n\n    FT_ULong   checksum;\n    int        num_matched_ids[TRICK_SFNT_IDS_NUM_FACES];\n    FT_Bool    has_cvt, has_fpgm, has_prep;\n    FT_UShort  i;\n    int        j, k;\n\n\n    FT_MEM_SET( num_matched_ids, 0,\n                sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );\n    has_cvt  = FALSE;\n    has_fpgm = FALSE;\n    has_prep = FALSE;\n\n    for ( i = 0; i < face->num_tables; i++ )\n    {\n      checksum = 0;\n\n      switch( face->dir_tables[i].Tag )\n      {\n      case TTAG_cvt:\n        k = TRICK_SFNT_ID_cvt;\n        has_cvt  = TRUE;\n        break;\n\n      case TTAG_fpgm:\n        k = TRICK_SFNT_ID_fpgm;\n        has_fpgm = TRUE;\n        break;\n\n      case TTAG_prep:\n        k = TRICK_SFNT_ID_prep;\n        has_prep = TRUE;\n        break;\n\n      default:\n        continue;\n      }\n\n      for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )\n        if ( face->dir_tables[i].Length == sfnt_id[j][k].Length )\n        {\n          if ( !checksum )\n            checksum = tt_get_sfnt_checksum( face, i );\n\n          if ( sfnt_id[j][k].CheckSum == checksum )\n            num_matched_ids[j]++;\n\n          if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )\n            return TRUE;\n        }\n    }\n\n    for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )\n    {\n      if ( !has_cvt  && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length )\n        num_matched_ids[j] ++;\n      if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length )\n        num_matched_ids[j] ++;\n      if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length )\n        num_matched_ids[j] ++;\n      if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )\n        return TRUE;\n    }\n\n    return FALSE;\n  }\n\n\n  static FT_Bool\n  tt_check_trickyness( FT_Face  face )\n  {\n    if ( !face )\n      return FALSE;\n\n    /* For first, check the face name for quick check. */\n    if ( face->family_name                               &&\n         tt_check_trickyness_family( face->family_name ) )\n      return TRUE;\n\n    /* Type42 fonts may lack `name' tables, we thus try to identify */\n    /* tricky fonts by checking the checksums of Type42-persistent  */\n    /* sfnt tables (`cvt', `fpgm', and `prep').                     */\n    if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) )\n      return TRUE;\n\n    return FALSE;\n  }\n\n\n  /* Check whether `.notdef' is the only glyph in the `loca' table. */\n  static FT_Bool\n  tt_check_single_notdef( FT_Face  ttface )\n  {\n    FT_Bool   result = FALSE;\n\n    TT_Face   face = (TT_Face)ttface;\n    FT_UInt   asize;\n    FT_ULong  i;\n    FT_ULong  glyph_index = 0;\n    FT_UInt   count       = 0;\n\n\n    for( i = 0; i < face->num_locations; i++ )\n    {\n      tt_face_get_location( face, i, &asize );\n      if ( asize > 0 )\n      {\n        count += 1;\n        if ( count > 1 )\n          break;\n        glyph_index = i;\n      }\n    }\n\n    /* Only have a single outline. */\n    if ( count == 1 )\n    {\n      if ( glyph_index == 0 )\n        result = TRUE;\n      else\n      {\n        /* FIXME: Need to test glyphname == .notdef ? */\n        FT_Error error;\n        char buf[8];\n\n\n        error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 );\n        if ( !error                                            &&\n             buf[0] == '.' && !ft_strncmp( buf, \".notdef\", 8 ) )\n          result = TRUE;\n      }\n    }\n\n    return result;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_init                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a given TrueType face object.                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     :: The source font stream.                              */\n  /*                                                                       */\n  /*    face_index :: The index of the font face in the resource.          */\n  /*                                                                       */\n  /*    num_params :: Number of additional generic parameters.  Ignored.   */\n  /*                                                                       */\n  /*    params     :: Additional generic parameters.  Ignored.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The newly built face object.                         */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_init( FT_Stream      stream,\n                FT_Face        ttface,      /* TT_Face */\n                FT_Int         face_index,\n                FT_Int         num_params,\n                FT_Parameter*  params )\n  {\n    FT_Error      error;\n    FT_Library    library;\n    SFNT_Service  sfnt;\n    TT_Face       face = (TT_Face)ttface;\n\n\n    FT_TRACE2(( \"TTF driver\\n\" ));\n\n    library = ttface->driver->root.library;\n\n    sfnt = (SFNT_Service)FT_Get_Module_Interface( library, \"sfnt\" );\n    if ( !sfnt )\n    {\n      FT_ERROR(( \"tt_face_init: cannot access `sfnt' module\\n\" ));\n      error = FT_THROW( Missing_Module );\n      goto Exit;\n    }\n\n    /* create input stream from resource */\n    if ( FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    /* check that we have a valid TrueType file */\n    error = sfnt->init_face( stream, face, face_index, num_params, params );\n    if ( error )\n      goto Exit;\n\n    /* We must also be able to accept Mac/GX fonts, as well as OT ones. */\n    /* The 0x00020000 tag is completely undocumented; some fonts from   */\n    /* Arphic made for Chinese Windows 3.1 have this.                   */\n    if ( face->format_tag != 0x00010000L &&    /* MS fonts  */\n         face->format_tag != 0x00020000L &&    /* CJK fonts for Win 3.1 */\n         face->format_tag != TTAG_true   )     /* Mac fonts */\n    {\n      FT_TRACE2(( \"  not a TTF font\\n\" ));\n      goto Bad_Format;\n    }\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    ttface->face_flags |= FT_FACE_FLAG_HINTER;\n#endif\n\n    /* If we are performing a simple font format check, exit immediately. */\n    if ( face_index < 0 )\n      return FT_Err_Ok;\n\n    /* Load font directory */\n    error = sfnt->load_face( stream, face, face_index, num_params, params );\n    if ( error )\n      goto Exit;\n\n    if ( tt_check_trickyness( ttface ) )\n      ttface->face_flags |= FT_FACE_FLAG_TRICKY;\n\n    error = tt_face_load_hdmx( face, stream );\n    if ( error )\n      goto Exit;\n\n    if ( FT_IS_SCALABLE( ttface ) )\n    {\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n      if ( !ttface->internal->incremental_interface )\n        error = tt_face_load_loca( face, stream );\n      if ( !error )\n        error = tt_face_load_cvt( face, stream );\n      if ( !error )\n        error = tt_face_load_fpgm( face, stream );\n      if ( !error )\n        error = tt_face_load_prep( face, stream );\n\n      /* Check the scalable flag based on `loca'. */\n      if ( !ttface->internal->incremental_interface &&\n           ttface->num_fixed_sizes                  &&\n           face->glyph_locations                    &&\n           tt_check_single_notdef( ttface )         )\n      {\n        FT_TRACE5(( \"tt_face_init:\"\n                    \" Only the `.notdef' glyph has an outline.\\n\"\n                    \"             \"\n                    \" Resetting scalable flag to FALSE.\\n\" ));\n\n        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;\n      }\n\n#else\n\n      if ( !error )\n        error = tt_face_load_loca( face, stream );\n      if ( !error )\n        error = tt_face_load_cvt( face, stream );\n      if ( !error )\n        error = tt_face_load_fpgm( face, stream );\n      if ( !error )\n        error = tt_face_load_prep( face, stream );\n\n      /* Check the scalable flag based on `loca'. */\n      if ( ttface->num_fixed_sizes          &&\n           face->glyph_locations            &&\n           tt_check_single_notdef( ttface ) )\n      {\n        FT_TRACE5(( \"tt_face_init:\"\n                    \" Only the `.notdef' glyph has an outline.\\n\"\n                    \"             \"\n                    \" Resetting scalable flag to FALSE.\\n\" ));\n\n        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;\n      }\n\n#endif\n\n    }\n\n#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING    ) && \\\n    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )\n\n    {\n      FT_Bool  unpatented_hinting;\n      int      i;\n\n\n      /* Determine whether unpatented hinting is to be used for this face. */\n      unpatented_hinting = FT_BOOL\n        ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL );\n\n      for ( i = 0; i < num_params && !face->unpatented_hinting; i++ )\n        if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING )\n          unpatented_hinting = TRUE;\n\n      if ( !unpatented_hinting )\n        ttface->internal->ignore_unpatented_hinter = TRUE;\n    }\n\n#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING &&\n          !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */\n\n    /* initialize standard glyph loading routines */\n    TT_Init_Glyph_Loading( face );\n\n  Exit:\n    return error;\n\n  Bad_Format:\n    error = FT_THROW( Unknown_File_Format );\n    goto Exit;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_done                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalize a given face object.                                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A pointer to the face object to destroy.                   */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_face_done( FT_Face  ttface )           /* TT_Face */\n  {\n    TT_Face       face = (TT_Face)ttface;\n    FT_Memory     memory;\n    FT_Stream     stream;\n    SFNT_Service  sfnt;\n\n\n    if ( !face )\n      return;\n\n    memory = ttface->memory;\n    stream = ttface->stream;\n    sfnt   = (SFNT_Service)face->sfnt;\n\n    /* for `extended TrueType formats' (i.e. compressed versions) */\n    if ( face->extra.finalizer )\n      face->extra.finalizer( face->extra.data );\n\n    if ( sfnt )\n      sfnt->done_face( face );\n\n    /* freeing the locations table */\n    tt_face_done_loca( face );\n\n    tt_face_free_hdmx( face );\n\n    /* freeing the CVT */\n    FT_FREE( face->cvt );\n    face->cvt_size = 0;\n\n    /* freeing the programs */\n    FT_FRAME_RELEASE( face->font_program );\n    FT_FRAME_RELEASE( face->cvt_program );\n    face->font_program_size = 0;\n    face->cvt_program_size  = 0;\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    tt_done_blend( memory, face->blend );\n    face->blend = NULL;\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                           SIZE  FUNCTIONS                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_run_fpgm                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Run the font program.                                              */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size     :: A handle to the size object.                           */\n  /*                                                                       */\n  /*    pedantic :: Set if bytecode execution should be pedantic.          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_run_fpgm( TT_Size  size,\n                    FT_Bool  pedantic )\n  {\n    TT_Face         face = (TT_Face)size->root.face;\n    TT_ExecContext  exec;\n    FT_Error        error;\n\n\n    /* debugging instances have their own context */\n    if ( size->debug )\n      exec = size->context;\n    else\n      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;\n\n    if ( !exec )\n      return FT_THROW( Could_Not_Find_Context );\n\n    TT_Load_Context( exec, face, size );\n\n    exec->callTop = 0;\n    exec->top     = 0;\n\n    exec->period    = 64;\n    exec->phase     = 0;\n    exec->threshold = 0;\n\n    exec->instruction_trap = FALSE;\n    exec->F_dot_P          = 0x4000L;\n\n    exec->pedantic_hinting = pedantic;\n\n    {\n      FT_Size_Metrics*  metrics    = &exec->metrics;\n      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;\n\n\n      metrics->x_ppem   = 0;\n      metrics->y_ppem   = 0;\n      metrics->x_scale  = 0;\n      metrics->y_scale  = 0;\n\n      tt_metrics->ppem  = 0;\n      tt_metrics->scale = 0;\n      tt_metrics->ratio = 0x10000L;\n    }\n\n    /* allow font program execution */\n    TT_Set_CodeRange( exec,\n                      tt_coderange_font,\n                      face->font_program,\n                      face->font_program_size );\n\n    /* disable CVT and glyph programs coderange */\n    TT_Clear_CodeRange( exec, tt_coderange_cvt );\n    TT_Clear_CodeRange( exec, tt_coderange_glyph );\n\n    if ( face->font_program_size > 0 )\n    {\n      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );\n\n      if ( !error )\n      {\n        FT_TRACE4(( \"Executing `fpgm' table.\\n\" ));\n\n        error = face->interpreter( exec );\n      }\n    }\n    else\n      error = FT_Err_Ok;\n\n    if ( !error )\n      TT_Save_Context( exec, size );\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_run_prep                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Run the control value program.                                     */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size     :: A handle to the size object.                           */\n  /*                                                                       */\n  /*    pedantic :: Set if bytecode execution should be pedantic.          */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_run_prep( TT_Size  size,\n                    FT_Bool  pedantic )\n  {\n    TT_Face         face = (TT_Face)size->root.face;\n    TT_ExecContext  exec;\n    FT_Error        error;\n\n\n    /* debugging instances have their own context */\n    if ( size->debug )\n      exec = size->context;\n    else\n      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;\n\n    if ( !exec )\n      return FT_THROW( Could_Not_Find_Context );\n\n    TT_Load_Context( exec, face, size );\n\n    exec->callTop = 0;\n    exec->top     = 0;\n\n    exec->instruction_trap = FALSE;\n\n    exec->pedantic_hinting = pedantic;\n\n    TT_Set_CodeRange( exec,\n                      tt_coderange_cvt,\n                      face->cvt_program,\n                      face->cvt_program_size );\n\n    TT_Clear_CodeRange( exec, tt_coderange_glyph );\n\n    if ( face->cvt_program_size > 0 )\n    {\n      error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );\n\n      if ( !error && !size->debug )\n      {\n        FT_TRACE4(( \"Executing `prep' table.\\n\" ));\n\n        error = face->interpreter( exec );\n      }\n    }\n    else\n      error = FT_Err_Ok;\n\n    /* UNDOCUMENTED!  The MS rasterizer doesn't allow the following */\n    /* graphics state variables to be modified by the CVT program.  */\n\n    exec->GS.dualVector.x = 0x4000;\n    exec->GS.dualVector.y = 0;\n    exec->GS.projVector.x = 0x4000;\n    exec->GS.projVector.y = 0x0;\n    exec->GS.freeVector.x = 0x4000;\n    exec->GS.freeVector.y = 0x0;\n\n    exec->GS.rp0 = 0;\n    exec->GS.rp1 = 0;\n    exec->GS.rp2 = 0;\n\n    exec->GS.gep0 = 1;\n    exec->GS.gep1 = 1;\n    exec->GS.gep2 = 1;\n\n    exec->GS.loop = 1;\n\n    /* save as default graphics state */\n    size->GS = exec->GS;\n\n    TT_Save_Context( exec, size );\n\n    return error;\n  }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  static void\n  tt_size_done_bytecode( FT_Size  ftsize )\n  {\n    TT_Size    size   = (TT_Size)ftsize;\n    TT_Face    face   = (TT_Face)ftsize->face;\n    FT_Memory  memory = face->root.memory;\n\n\n    if ( size->debug )\n    {\n      /* the debug context must be deleted by the debugger itself */\n      size->context = NULL;\n      size->debug   = FALSE;\n    }\n\n    FT_FREE( size->cvt );\n    size->cvt_size = 0;\n\n    /* free storage area */\n    FT_FREE( size->storage );\n    size->storage_size = 0;\n\n    /* twilight zone */\n    tt_glyphzone_done( &size->twilight );\n\n    FT_FREE( size->function_defs );\n    FT_FREE( size->instruction_defs );\n\n    size->num_function_defs    = 0;\n    size->max_function_defs    = 0;\n    size->num_instruction_defs = 0;\n    size->max_instruction_defs = 0;\n\n    size->max_func = 0;\n    size->max_ins  = 0;\n\n    size->bytecode_ready = 0;\n    size->cvt_ready      = 0;\n  }\n\n\n  /* Initialize bytecode-related fields in the size object.       */\n  /* We do this only if bytecode interpretation is really needed. */\n  static FT_Error\n  tt_size_init_bytecode( FT_Size  ftsize,\n                         FT_Bool  pedantic )\n  {\n    FT_Error   error;\n    TT_Size    size = (TT_Size)ftsize;\n    TT_Face    face = (TT_Face)ftsize->face;\n    FT_Memory  memory = face->root.memory;\n    FT_Int     i;\n\n    FT_UShort       n_twilight;\n    TT_MaxProfile*  maxp = &face->max_profile;\n\n\n    size->bytecode_ready = 1;\n    size->cvt_ready      = 0;\n\n    size->max_function_defs    = maxp->maxFunctionDefs;\n    size->max_instruction_defs = maxp->maxInstructionDefs;\n\n    size->num_function_defs    = 0;\n    size->num_instruction_defs = 0;\n\n    size->max_func = 0;\n    size->max_ins  = 0;\n\n    size->cvt_size     = face->cvt_size;\n    size->storage_size = maxp->maxStorage;\n\n    /* Set default metrics */\n    {\n      TT_Size_Metrics*  metrics = &size->ttmetrics;\n\n\n      metrics->rotated   = FALSE;\n      metrics->stretched = FALSE;\n\n      /* set default compensation (all 0) */\n      for ( i = 0; i < 4; i++ )\n        metrics->compensations[i] = 0;\n    }\n\n    /* allocate function defs, instruction defs, cvt, and storage area */\n    if ( FT_NEW_ARRAY( size->function_defs,    size->max_function_defs    ) ||\n         FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||\n         FT_NEW_ARRAY( size->cvt,              size->cvt_size             ) ||\n         FT_NEW_ARRAY( size->storage,          size->storage_size         ) )\n      goto Exit;\n\n    /* reserve twilight zone */\n    n_twilight = maxp->maxTwilightPoints;\n\n    /* there are 4 phantom points (do we need this?) */\n    n_twilight += 4;\n\n    error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );\n    if ( error )\n      goto Exit;\n\n    size->twilight.n_points = n_twilight;\n\n    size->GS = tt_default_graphics_state;\n\n    /* set `face->interpreter' according to the debug hook present */\n    {\n      FT_Library  library = face->root.driver->root.library;\n\n\n      face->interpreter = (TT_Interpreter)\n                            library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];\n      if ( !face->interpreter )\n        face->interpreter = (TT_Interpreter)TT_RunIns;\n    }\n\n    /* Fine, now run the font program! */\n    error = tt_size_run_fpgm( size, pedantic );\n\n  Exit:\n    if ( error )\n      tt_size_done_bytecode( ftsize );\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_ready_bytecode( TT_Size  size,\n                          FT_Bool  pedantic )\n  {\n    FT_Error  error = FT_Err_Ok;\n\n\n    if ( !size->bytecode_ready )\n    {\n      error = tt_size_init_bytecode( (FT_Size)size, pedantic );\n      if ( error )\n        goto Exit;\n    }\n\n    /* rescale CVT when needed */\n    if ( !size->cvt_ready )\n    {\n      FT_UInt  i;\n      TT_Face  face = (TT_Face)size->root.face;\n\n\n      /* Scale the cvt values to the new ppem.          */\n      /* We use by default the y ppem to scale the CVT. */\n      for ( i = 0; i < size->cvt_size; i++ )\n        size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );\n\n      /* all twilight points are originally zero */\n      for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ )\n      {\n        size->twilight.org[i].x = 0;\n        size->twilight.org[i].y = 0;\n        size->twilight.cur[i].x = 0;\n        size->twilight.cur[i].y = 0;\n      }\n\n      /* clear storage area */\n      for ( i = 0; i < (FT_UInt)size->storage_size; i++ )\n        size->storage[i] = 0;\n\n      size->GS = tt_default_graphics_state;\n\n      error = tt_size_run_prep( size, pedantic );\n      if ( !error )\n        size->cvt_ready = 1;\n    }\n\n  Exit:\n    return error;\n  }\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_init                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a new TrueType size object.                             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    size :: A handle to the size object.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_init( FT_Size  ttsize )           /* TT_Size */\n  {\n    TT_Size   size  = (TT_Size)ttsize;\n    FT_Error  error = FT_Err_Ok;\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    size->bytecode_ready = 0;\n    size->cvt_ready      = 0;\n#endif\n\n    size->ttmetrics.valid = FALSE;\n    size->strike_index    = 0xFFFFFFFFUL;\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_done                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType size object finalizer.                                */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to the target size object.                        */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_size_done( FT_Size  ttsize )           /* TT_Size */\n  {\n    TT_Size  size = (TT_Size)ttsize;\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    if ( size->bytecode_ready )\n      tt_size_done_bytecode( ttsize );\n#endif\n\n    size->ttmetrics.valid = FALSE;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_size_reset                                                      */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Reset a TrueType size when resolutions and character dimensions    */\n  /*    have been changed.                                                 */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    size :: A handle to the target size object.                        */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_size_reset( TT_Size  size )\n  {\n    TT_Face           face;\n    FT_Error          error = FT_Err_Ok;\n    FT_Size_Metrics*  metrics;\n\n\n    size->ttmetrics.valid = FALSE;\n\n    face = (TT_Face)size->root.face;\n\n    metrics = &size->metrics;\n\n    /* copy the result from base layer */\n    *metrics = size->root.metrics;\n\n    if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 )\n      return FT_THROW( Invalid_PPem );\n\n    /* This bit flag, if set, indicates that the ppems must be       */\n    /* rounded to integers.  Nearly all TrueType fonts have this bit */\n    /* set, as hinting won't work really well otherwise.             */\n    /*                                                               */\n    if ( face->header.Flags & 8 )\n    {\n      metrics->x_scale = FT_DivFix( metrics->x_ppem << 6,\n                                    face->root.units_per_EM );\n      metrics->y_scale = FT_DivFix( metrics->y_ppem << 6,\n                                    face->root.units_per_EM );\n\n      metrics->ascender =\n        FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) );\n      metrics->descender =\n        FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) );\n      metrics->height =\n        FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) );\n      metrics->max_advance =\n        FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width,\n                                 metrics->x_scale ) );\n    }\n\n    /* compute new transformation */\n    if ( metrics->x_ppem >= metrics->y_ppem )\n    {\n      size->ttmetrics.scale   = metrics->x_scale;\n      size->ttmetrics.ppem    = metrics->x_ppem;\n      size->ttmetrics.x_ratio = 0x10000L;\n      size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem,\n                                           metrics->x_ppem );\n    }\n    else\n    {\n      size->ttmetrics.scale   = metrics->y_scale;\n      size->ttmetrics.ppem    = metrics->y_ppem;\n      size->ttmetrics.x_ratio = FT_DivFix( metrics->x_ppem,\n                                           metrics->y_ppem );\n      size->ttmetrics.y_ratio = 0x10000L;\n    }\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    size->cvt_ready = 0;\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n    if ( !error )\n      size->ttmetrics.valid = TRUE;\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_driver_init                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a given TrueType driver object.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target driver object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_driver_init( FT_Module  ttdriver )     /* TT_Driver */\n  {\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    TT_Driver  driver = (TT_Driver)ttdriver;\n\n\n    if ( !TT_New_Context( driver ) )\n      return FT_THROW( Could_Not_Find_Context );\n\n#else\n\n    FT_UNUSED( ttdriver );\n\n#endif\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_driver_done                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalize a given TrueType driver.                                  */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target TrueType driver.                  */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  tt_driver_done( FT_Module  ttdriver )     /* TT_Driver */\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n    TT_Driver  driver = (TT_Driver)ttdriver;\n\n\n    /* destroy the execution context */\n    if ( driver->context )\n    {\n      TT_Done_Context( driver->context );\n      driver->context = NULL;\n    }\n#else\n    FT_UNUSED( ttdriver );\n#endif\n\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_slot_init                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initialize a new slot object.                                      */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    slot :: A handle to the slot object.                               */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_slot_init( FT_GlyphSlot  slot )\n  {\n    return FT_GlyphLoader_CreateExtra( slot->internal->loader );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttobjs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttobjs.h                                                               */\n/*                                                                         */\n/*    Objects manager (specification).                                     */\n/*                                                                         */\n/*  Copyright 1996-2009, 2011-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTOBJS_H__\n#define __TTOBJS_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_Driver                                                          */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a TrueType driver object.                              */\n  /*                                                                       */\n  typedef struct TT_DriverRec_*  TT_Driver;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_Instance                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a TrueType size object.                                */\n  /*                                                                       */\n  typedef struct TT_SizeRec_*  TT_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    TT_GlyphSlot                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a TrueType glyph slot object.                          */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    This is a direct typedef of FT_GlyphSlot, as there is nothing      */\n  /*    specific about the TrueType glyph slot.                            */\n  /*                                                                       */\n  typedef FT_GlyphSlot  TT_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    TT_GraphicsState                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The TrueType graphics state used during bytecode interpretation.   */\n  /*                                                                       */\n  typedef struct  TT_GraphicsState_\n  {\n    FT_UShort      rp0;\n    FT_UShort      rp1;\n    FT_UShort      rp2;\n\n    FT_UnitVector  dualVector;\n    FT_UnitVector  projVector;\n    FT_UnitVector  freeVector;\n\n#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING\n    FT_Bool        both_x_axis;\n#endif\n\n    FT_Long        loop;\n    FT_F26Dot6     minimum_distance;\n    FT_Int         round_state;\n\n    FT_Bool        auto_flip;\n    FT_F26Dot6     control_value_cutin;\n    FT_F26Dot6     single_width_cutin;\n    FT_F26Dot6     single_width_value;\n    FT_Short       delta_base;\n    FT_Short       delta_shift;\n\n    FT_Byte        instruct_control;\n    /* According to Greg Hitchcock from Microsoft, the `scan_control'     */\n    /* variable as documented in the TrueType specification is a 32-bit   */\n    /* integer; the high-word part holds the SCANTYPE value, the low-word */\n    /* part the SCANCTRL value.  We separate it into two fields.          */\n    FT_Bool        scan_control;\n    FT_Int         scan_type;\n\n    FT_UShort      gep0;\n    FT_UShort      gep1;\n    FT_UShort      gep2;\n\n  } TT_GraphicsState;\n\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  FT_LOCAL( void )\n  tt_glyphzone_done( TT_GlyphZone  zone );\n\n  FT_LOCAL( FT_Error )\n  tt_glyphzone_new( FT_Memory     memory,\n                    FT_UShort     maxPoints,\n                    FT_Short      maxContours,\n                    TT_GlyphZone  zone );\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  EXECUTION SUBTABLES                                                  */\n  /*                                                                       */\n  /*  These sub-tables relate to instruction execution.                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#define TT_MAX_CODE_RANGES  3\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* There can only be 3 active code ranges at once:                       */\n  /*   - the Font Program                                                  */\n  /*   - the CVT Program                                                   */\n  /*   - a glyph's instructions set                                        */\n  /*                                                                       */\n  typedef enum  TT_CodeRange_Tag_\n  {\n    tt_coderange_none = 0,\n    tt_coderange_font,\n    tt_coderange_cvt,\n    tt_coderange_glyph\n\n  } TT_CodeRange_Tag;\n\n\n  typedef struct  TT_CodeRange_\n  {\n    FT_Byte*  base;\n    FT_ULong  size;\n\n  } TT_CodeRange;\n\n  typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Defines a function/instruction definition record.                     */\n  /*                                                                       */\n  typedef struct  TT_DefRecord_\n  {\n    FT_Int    range;          /* in which code range is it located?     */\n    FT_Long   start;          /* where does it start?                   */\n    FT_Long   end;            /* where does it end?                     */\n    FT_UInt   opc;            /* function #, or instruction code        */\n    FT_Bool   active;         /* is it active?                          */\n    FT_Bool   inline_delta;   /* is function that defines inline delta? */\n    FT_ULong  sph_fdef_flags; /* flags to identify special functions    */\n\n  } TT_DefRecord, *TT_DefArray;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Subglyph transformation record.                                       */\n  /*                                                                       */\n  typedef struct  TT_Transform_\n  {\n    FT_Fixed    xx, xy;     /* transformation matrix coefficients */\n    FT_Fixed    yx, yy;\n    FT_F26Dot6  ox, oy;     /* offsets                            */\n\n  } TT_Transform;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* A note regarding non-squared pixels:                                  */\n  /*                                                                       */\n  /* (This text will probably go into some docs at some time; for now, it  */\n  /* is kept here to explain some definitions in the TT_Size_Metrics       */\n  /* record).                                                              */\n  /*                                                                       */\n  /* The CVT is a one-dimensional array containing values that control     */\n  /* certain important characteristics in a font, like the height of all   */\n  /* capitals, all lowercase letter, default spacing or stem width/height. */\n  /*                                                                       */\n  /* These values are found in FUnits in the font file, and must be scaled */\n  /* to pixel coordinates before being used by the CVT and glyph programs. */\n  /* Unfortunately, when using distinct x and y resolutions (or distinct x */\n  /* and y pointsizes), there are two possible scalings.                   */\n  /*                                                                       */\n  /* A first try was to implement a `lazy' scheme where all values were    */\n  /* scaled when first used.  However, while some values are always used   */\n  /* in the same direction, some others are used under many different      */\n  /* circumstances and orientations.                                       */\n  /*                                                                       */\n  /* I have found a simpler way to do the same, and it even seems to work  */\n  /* in most of the cases:                                                 */\n  /*                                                                       */\n  /* - All CVT values are scaled to the maximum ppem size.                 */\n  /*                                                                       */\n  /* - When performing a read or write in the CVT, a ratio factor is used  */\n  /*   to perform adequate scaling.  Example:                              */\n  /*                                                                       */\n  /*     x_ppem = 14                                                       */\n  /*     y_ppem = 10                                                       */\n  /*                                                                       */\n  /*   We choose ppem = x_ppem = 14 as the CVT scaling size.  All cvt      */\n  /*   entries are scaled to it.                                           */\n  /*                                                                       */\n  /*     x_ratio = 1.0                                                     */\n  /*     y_ratio = y_ppem/ppem (< 1.0)                                     */\n  /*                                                                       */\n  /*   We compute the current ratio like:                                  */\n  /*                                                                       */\n  /*   - If projVector is horizontal,                                      */\n  /*       ratio = x_ratio = 1.0                                           */\n  /*                                                                       */\n  /*   - if projVector is vertical,                                        */\n  /*       ratio = y_ratio                                                 */\n  /*                                                                       */\n  /*   - else,                                                             */\n  /*       ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */\n  /*                                                                       */\n  /*   Reading a cvt value returns                                         */\n  /*     ratio * cvt[index]                                                */\n  /*                                                                       */\n  /*   Writing a cvt value in pixels:                                      */\n  /*     cvt[index] / ratio                                                */\n  /*                                                                       */\n  /*   The current ppem is simply                                          */\n  /*     ratio * ppem                                                      */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Metrics used by the TrueType size and context objects.                */\n  /*                                                                       */\n  typedef struct  TT_Size_Metrics_\n  {\n    /* for non-square pixels */\n    FT_Long     x_ratio;\n    FT_Long     y_ratio;\n\n    FT_UShort   ppem;               /* maximum ppem size              */\n    FT_Long     ratio;              /* current ratio                  */\n    FT_Fixed    scale;\n\n    FT_F26Dot6  compensations[4];   /* device-specific compensations  */\n\n    FT_Bool     valid;\n\n    FT_Bool     rotated;            /* `is the glyph rotated?'-flag   */\n    FT_Bool     stretched;          /* `is the glyph stretched?'-flag */\n\n  } TT_Size_Metrics;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TrueType size class.                                                  */\n  /*                                                                       */\n  typedef struct  TT_SizeRec_\n  {\n    FT_SizeRec         root;\n\n    /* we have our own copy of metrics so that we can modify */\n    /* it without affecting auto-hinting (when used)         */\n    FT_Size_Metrics    metrics;\n\n    TT_Size_Metrics    ttmetrics;\n\n    FT_ULong           strike_index;      /* 0xFFFFFFFF to indicate invalid */\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    FT_UInt            num_function_defs; /* number of function definitions */\n    FT_UInt            max_function_defs;\n    TT_DefArray        function_defs;     /* table of function definitions  */\n\n    FT_UInt            num_instruction_defs;  /* number of ins. definitions */\n    FT_UInt            max_instruction_defs;\n    TT_DefArray        instruction_defs;      /* table of ins. definitions  */\n\n    FT_UInt            max_func;\n    FT_UInt            max_ins;\n\n    TT_CodeRangeTable  codeRangeTable;\n\n    TT_GraphicsState   GS;\n\n    FT_ULong           cvt_size;      /* the scaled control value table */\n    FT_Long*           cvt;\n\n    FT_UShort          storage_size; /* The storage area is now part of */\n    FT_Long*           storage;      /* the instance                    */\n\n    TT_GlyphZoneRec    twilight;     /* The instance's twilight zone    */\n\n    /* debugging variables */\n\n    /* When using the debugger, we must keep the */\n    /* execution context tied to the instance    */\n    /* object rather than asking it on demand.   */\n\n    FT_Bool            debug;\n    TT_ExecContext     context;\n\n    FT_Bool            bytecode_ready;\n    FT_Bool            cvt_ready;\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n  } TT_SizeRec;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TrueType driver class.                                                */\n  /*                                                                       */\n  typedef struct  TT_DriverRec_\n  {\n    FT_DriverRec     root;\n    TT_ExecContext   context;  /* execution context        */\n    TT_GlyphZoneRec  zone;     /* glyph loader points zone */\n\n    void*            extension_component;\n\n  } TT_DriverRec;\n\n\n  /* Note: All of the functions below (except tt_size_reset()) are used    */\n  /* as function pointers in a FT_Driver_ClassRec.  Therefore their        */\n  /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face,  */\n  /* TT_Size, etc., so that the compiler can confirm that the types and    */\n  /* number of parameters are correct.  In all cases the FT_xxx types are  */\n  /* cast to their TT_xxx counterparts inside the functions since FreeType */\n  /* will always use the TT driver to create them.                         */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Face functions                                                        */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_face_init( FT_Stream      stream,\n                FT_Face        ttface,      /* TT_Face */\n                FT_Int         face_index,\n                FT_Int         num_params,\n                FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  tt_face_done( FT_Face  ttface );          /* TT_Face */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Size functions                                                        */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_size_init( FT_Size  ttsize );          /* TT_Size */\n\n  FT_LOCAL( void )\n  tt_size_done( FT_Size  ttsize );          /* TT_Size */\n\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n  FT_LOCAL( FT_Error )\n  tt_size_run_fpgm( TT_Size  size,\n                    FT_Bool  pedantic );\n\n  FT_LOCAL( FT_Error )\n  tt_size_run_prep( TT_Size  size,\n                    FT_Bool  pedantic );\n\n  FT_LOCAL( FT_Error )\n  tt_size_ready_bytecode( TT_Size  size,\n                          FT_Bool  pedantic );\n\n#endif /* TT_USE_BYTECODE_INTERPRETER */\n\n  FT_LOCAL( FT_Error )\n  tt_size_reset( TT_Size  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Driver functions                                                      */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_driver_init( FT_Module  ttdriver );    /* TT_Driver */\n\n  FT_LOCAL( void )\n  tt_driver_done( FT_Module  ttdriver );    /* TT_Driver */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Slot functions                                                        */\n  /*                                                                       */\n  FT_LOCAL( FT_Error )\n  tt_slot_init( FT_GlyphSlot  slot );\n\n\n  /* auxiliary */\n#define IS_HINTED( flags )  ( ( flags & FT_LOAD_NO_HINTING ) == 0 )\n\n\nFT_END_HEADER\n\n#endif /* __TTOBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttpic.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpic.c                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for truetype module. */\n/*                                                                         */\n/*  Copyright 2009, 2010, 2012, 2013 by                                    */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_INTERNAL_OBJECTS_H\n#include \"ttpic.h\"\n#include \"tterrors.h\"\n\n\n#ifdef FT_CONFIG_OPTION_PIC\n\n  /* forward declaration of PIC init functions from ttdriver.c */\n  FT_Error\n  FT_Create_Class_tt_services( FT_Library           library,\n                               FT_ServiceDescRec**  output_class );\n  void\n  FT_Destroy_Class_tt_services( FT_Library          library,\n                                FT_ServiceDescRec*  clazz );\n  void\n  FT_Init_Class_tt_service_gx_multi_masters(\n    FT_Service_MultiMastersRec*  sv_mm );\n  void\n  FT_Init_Class_tt_service_truetype_glyf(\n    FT_Service_TTGlyfRec*  sv_ttglyf );\n\n\n  void\n  tt_driver_class_pic_free( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Memory          memory        = library->memory;\n\n\n    if ( pic_container->truetype )\n    {\n      TTModulePIC*  container = (TTModulePIC*)pic_container->truetype;\n\n\n      if ( container->tt_services )\n        FT_Destroy_Class_tt_services( library, container->tt_services );\n      container->tt_services = NULL;\n      FT_FREE( container );\n      pic_container->truetype = NULL;\n    }\n  }\n\n\n  FT_Error\n  tt_driver_class_pic_init( FT_Library  library )\n  {\n    FT_PIC_Container*  pic_container = &library->pic_container;\n    FT_Error           error         = FT_Err_Ok;\n    TTModulePIC*       container     = NULL;\n    FT_Memory          memory        = library->memory;\n\n\n    /* allocate pointer, clear and set global container pointer */\n    if ( FT_ALLOC( container, sizeof ( *container ) ) )\n      return error;\n    FT_MEM_SET( container, 0, sizeof ( *container ) );\n    pic_container->truetype = container;\n\n    /* initialize pointer table - this is how the module usually */\n    /* expects this data                                         */\n    error = FT_Create_Class_tt_services( library,\n                                         &container->tt_services );\n    if ( error )\n      goto Exit;\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    FT_Init_Class_tt_service_gx_multi_masters(\n      &container->tt_service_gx_multi_masters );\n#endif\n    FT_Init_Class_tt_service_truetype_glyf(\n      &container->tt_service_truetype_glyf );\n\n  Exit:\n    if ( error )\n      tt_driver_class_pic_free( library );\n    return error;\n  }\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttpic.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpic.h                                                                */\n/*                                                                         */\n/*    The FreeType position independent code services for truetype module. */\n/*                                                                         */\n/*  Copyright 2009, 2012 by                                                */\n/*  Oran Agra and Mickey Gabel.                                            */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTPIC_H__\n#define __TTPIC_H__\n\n\nFT_BEGIN_HEADER\n\n#ifndef FT_CONFIG_OPTION_PIC\n\n#define TT_SERVICES_GET                  tt_services\n#define TT_SERVICE_GX_MULTI_MASTERS_GET  tt_service_gx_multi_masters\n#define TT_SERVICE_TRUETYPE_GLYF_GET     tt_service_truetype_glyf\n\n#else /* FT_CONFIG_OPTION_PIC */\n\n#include FT_MULTIPLE_MASTERS_H\n#include FT_SERVICE_MULTIPLE_MASTERS_H\n#include FT_SERVICE_TRUETYPE_GLYF_H\n\n\n  typedef struct  TTModulePIC_\n  {\n    FT_ServiceDescRec*         tt_services;\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    FT_Service_MultiMastersRec tt_service_gx_multi_masters;\n#endif\n    FT_Service_TTGlyfRec       tt_service_truetype_glyf;\n\n  } TTModulePIC;\n\n\n#define GET_PIC( lib )                                      \\\n          ( (TTModulePIC*)((lib)->pic_container.truetype) )\n#define TT_SERVICES_GET                       \\\n          ( GET_PIC( library )->tt_services )\n#define TT_SERVICE_GX_MULTI_MASTERS_GET                       \\\n          ( GET_PIC( library )->tt_service_gx_multi_masters )\n#define TT_SERVICE_TRUETYPE_GLYF_GET                       \\\n          ( GET_PIC( library )->tt_service_truetype_glyf )\n\n\n  /* see ttpic.c for the implementation */\n  void\n  tt_driver_class_pic_free( FT_Library  library );\n\n  FT_Error\n  tt_driver_class_pic_init( FT_Library  library );\n\n#endif /* FT_CONFIG_OPTION_PIC */\n\n /* */\n\nFT_END_HEADER\n\n#endif /* __TTPIC_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttpload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpload.c                                                              */\n/*                                                                         */\n/*    TrueType-specific tables loader (body).                              */\n/*                                                                         */\n/*  Copyright 1996-2002, 2004-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_TAGS_H\n\n#include \"ttpload.h\"\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n#include \"ttgxvar.h\"\n#endif\n\n#include \"tterrors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_ttpload\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_loca                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the locations table.                                          */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: The input stream.                                        */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_loca( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error  error;\n    FT_ULong  table_len;\n    FT_Int    shift;\n\n\n    /* we need the size of the `glyf' table for malformed `loca' tables */\n    error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len );\n\n    /* it is possible that a font doesn't have a glyf table at all */\n    /* or its size is zero                                         */\n    if ( FT_ERR_EQ( error, Table_Missing ) )\n      face->glyf_len = 0;\n    else if ( error )\n      goto Exit;\n\n    FT_TRACE2(( \"Locations \" ));\n    error = face->goto_table( face, TTAG_loca, stream, &table_len );\n    if ( error )\n    {\n      error = FT_THROW( Locations_Missing );\n      goto Exit;\n    }\n\n    if ( face->header.Index_To_Loc_Format != 0 )\n    {\n      shift = 2;\n\n      if ( table_len >= 0x40000L )\n      {\n        FT_TRACE2(( \"table too large\\n\" ));\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n      face->num_locations = table_len >> shift;\n    }\n    else\n    {\n      shift = 1;\n\n      if ( table_len >= 0x20000L )\n      {\n        FT_TRACE2(( \"table too large\\n\" ));\n        error = FT_THROW( Invalid_Table );\n        goto Exit;\n      }\n      face->num_locations = table_len >> shift;\n    }\n\n    if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )\n    {\n      FT_TRACE2(( \"glyph count mismatch!  loca: %d, maxp: %d\\n\",\n                  face->num_locations - 1, face->root.num_glyphs ));\n\n      /* we only handle the case where `maxp' gives a larger value */\n      if ( face->num_locations <= (FT_ULong)face->root.num_glyphs )\n      {\n        FT_Long   new_loca_len =\n                    ( (FT_Long)( face->root.num_glyphs ) + 1 ) << shift;\n\n        TT_Table  entry = face->dir_tables;\n        TT_Table  limit = entry + face->num_tables;\n\n        FT_Long   pos  = FT_Stream_Pos( stream );\n        FT_Long   dist = 0x7FFFFFFFL;\n\n\n        /* compute the distance to next table in font file */\n        for ( ; entry < limit; entry++ )\n        {\n          FT_Long  diff = entry->Offset - pos;\n\n\n          if ( diff > 0 && diff < dist )\n            dist = diff;\n        }\n\n        if ( entry == limit )\n        {\n          /* `loca' is the last table */\n          dist = stream->size - pos;\n        }\n\n        if ( new_loca_len <= dist )\n        {\n          face->num_locations = face->root.num_glyphs + 1;\n          table_len           = new_loca_len;\n\n          FT_TRACE2(( \"adjusting num_locations to %d\\n\",\n                      face->num_locations ));\n        }\n      }\n    }\n\n    /*\n     * Extract the frame.  We don't need to decompress it since\n     * we are able to parse it directly.\n     */\n    if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) )\n      goto Exit;\n\n    FT_TRACE2(( \"loaded\\n\" ));\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_ULong )\n  tt_face_get_location( TT_Face   face,\n                        FT_UInt   gindex,\n                        FT_UInt  *asize )\n  {\n    FT_ULong  pos1, pos2;\n    FT_Byte*  p;\n    FT_Byte*  p_limit;\n\n\n    pos1 = pos2 = 0;\n\n    if ( gindex < face->num_locations )\n    {\n      if ( face->header.Index_To_Loc_Format != 0 )\n      {\n        p       = face->glyph_locations + gindex * 4;\n        p_limit = face->glyph_locations + face->num_locations * 4;\n\n        pos1 = FT_NEXT_ULONG( p );\n        pos2 = pos1;\n\n        if ( p + 4 <= p_limit )\n          pos2 = FT_NEXT_ULONG( p );\n      }\n      else\n      {\n        p       = face->glyph_locations + gindex * 2;\n        p_limit = face->glyph_locations + face->num_locations * 2;\n\n        pos1 = FT_NEXT_USHORT( p );\n        pos2 = pos1;\n\n        if ( p + 2 <= p_limit )\n          pos2 = FT_NEXT_USHORT( p );\n\n        pos1 <<= 1;\n        pos2 <<= 1;\n      }\n    }\n\n    /* Check broken location data */\n    if ( pos1 > face->glyf_len )\n    {\n      FT_TRACE1(( \"tt_face_get_location:\"\n                  \" too large offset=0x%08lx found for gid=0x%04lx,\"\n                  \" exceeding the end of glyf table (0x%08lx)\\n\",\n                  pos1, gindex, face->glyf_len ));\n      *asize = 0;\n      return 0;\n    }\n\n    if ( pos2 > face->glyf_len )\n    {\n      FT_TRACE1(( \"tt_face_get_location:\"\n                  \" too large offset=0x%08lx found for gid=0x%04lx,\"\n                  \" truncate at the end of glyf table (0x%08lx)\\n\",\n                  pos2, gindex + 1, face->glyf_len ));\n      pos2 = face->glyf_len;\n    }\n\n    /* The `loca' table must be ordered; it refers to the length of */\n    /* an entry as the difference between the current and the next  */\n    /* position.  However, there do exist (malformed) fonts which   */\n    /* don't obey this rule, so we are only able to provide an      */\n    /* upper bound for the size.                                    */\n    /*                                                              */\n    /* We get (intentionally) a wrong, non-zero result in case the  */\n    /* `glyf' table is missing.                                     */\n    if ( pos2 >= pos1 )\n      *asize = (FT_UInt)( pos2 - pos1 );\n    else\n      *asize = (FT_UInt)( face->glyf_len - pos1 );\n\n    return pos1;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_done_loca( TT_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n\n\n    FT_FRAME_RELEASE( face->glyph_locations );\n    face->num_locations = 0;\n  }\n\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_cvt                                                   */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the control value table into a face object.                   */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_cvt( TT_Face    face,\n                    FT_Stream  stream )\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n    FT_ULong   table_len;\n\n\n    FT_TRACE2(( \"CVT \" ));\n\n    error = face->goto_table( face, TTAG_cvt, stream, &table_len );\n    if ( error )\n    {\n      FT_TRACE2(( \"is missing\\n\" ));\n\n      face->cvt_size = 0;\n      face->cvt      = NULL;\n      error          = FT_Err_Ok;\n\n      goto Exit;\n    }\n\n    face->cvt_size = table_len / 2;\n\n    if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) )\n      goto Exit;\n\n    if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )\n      goto Exit;\n\n    {\n      FT_Short*  cur   = face->cvt;\n      FT_Short*  limit = cur + face->cvt_size;\n\n\n      for ( ; cur < limit; cur++ )\n        *cur = FT_GET_SHORT();\n    }\n\n    FT_FRAME_EXIT();\n    FT_TRACE2(( \"loaded\\n\" ));\n\n#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT\n    if ( face->doblend )\n      error = tt_face_vary_cvt( face, stream );\n#endif\n\n  Exit:\n    return error;\n\n#else /* !TT_USE_BYTECODE_INTERPRETER */\n\n    FT_UNUSED( face   );\n    FT_UNUSED( stream );\n\n    return FT_Err_Ok;\n\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_fpgm                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the font program.                                             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_fpgm( TT_Face    face,\n                     FT_Stream  stream )\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    FT_Error  error;\n    FT_ULong  table_len;\n\n\n    FT_TRACE2(( \"Font program \" ));\n\n    /* The font program is optional */\n    error = face->goto_table( face, TTAG_fpgm, stream, &table_len );\n    if ( error )\n    {\n      face->font_program      = NULL;\n      face->font_program_size = 0;\n      error                   = FT_Err_Ok;\n\n      FT_TRACE2(( \"is missing\\n\" ));\n    }\n    else\n    {\n      face->font_program_size = table_len;\n      if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )\n        goto Exit;\n\n      FT_TRACE2(( \"loaded, %12d bytes\\n\", face->font_program_size ));\n    }\n\n  Exit:\n    return error;\n\n#else /* !TT_USE_BYTECODE_INTERPRETER */\n\n    FT_UNUSED( face   );\n    FT_UNUSED( stream );\n\n    return FT_Err_Ok;\n\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_prep                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the cvt program.                                              */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_prep( TT_Face    face,\n                     FT_Stream  stream )\n  {\n#ifdef TT_USE_BYTECODE_INTERPRETER\n\n    FT_Error  error;\n    FT_ULong  table_len;\n\n\n    FT_TRACE2(( \"Prep program \" ));\n\n    error = face->goto_table( face, TTAG_prep, stream, &table_len );\n    if ( error )\n    {\n      face->cvt_program      = NULL;\n      face->cvt_program_size = 0;\n      error                  = FT_Err_Ok;\n\n      FT_TRACE2(( \"is missing\\n\" ));\n    }\n    else\n    {\n      face->cvt_program_size = table_len;\n      if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )\n        goto Exit;\n\n      FT_TRACE2(( \"loaded, %12d bytes\\n\", face->cvt_program_size ));\n    }\n\n  Exit:\n    return error;\n\n#else /* !TT_USE_BYTECODE_INTERPRETER */\n\n    FT_UNUSED( face   );\n    FT_UNUSED( stream );\n\n    return FT_Err_Ok;\n\n#endif\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    tt_face_load_hdmx                                                  */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Load the `hdmx' table into the face object.                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face   :: A handle to the target face object.                      */\n  /*                                                                       */\n  /*    stream :: A handle to the input stream.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n\n  FT_LOCAL_DEF( FT_Error )\n  tt_face_load_hdmx( TT_Face    face,\n                     FT_Stream  stream )\n  {\n    FT_Error   error;\n    FT_Memory  memory = stream->memory;\n    FT_UInt    version, nn, num_records;\n    FT_ULong   table_size, record_size;\n    FT_Byte*   p;\n    FT_Byte*   limit;\n\n\n    /* this table is optional */\n    error = face->goto_table( face, TTAG_hdmx, stream, &table_size );\n    if ( error || table_size < 8 )\n      return FT_Err_Ok;\n\n    if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) )\n      goto Exit;\n\n    p     = face->hdmx_table;\n    limit = p + table_size;\n\n    version     = FT_NEXT_USHORT( p );\n    num_records = FT_NEXT_USHORT( p );\n    record_size = FT_NEXT_ULONG( p );\n\n    /* The maximum number of bytes in an hdmx device record is the */\n    /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is   */\n    /* the reason why `record_size' is a long (which we read as    */\n    /* unsigned long for convenience).  In practice, two bytes     */\n    /* sufficient to hold the size value.                          */\n    /*                                                             */\n    /* There are at least two fonts, HANNOM-A and HANNOM-B version */\n    /* 2.0 (2005), which get this wrong: The upper two bytes of    */\n    /* the size value are set to 0xFF instead of 0x00.  We catch   */\n    /* and fix this.                                               */\n\n    if ( record_size >= 0xFFFF0000UL )\n      record_size &= 0xFFFFU;\n\n    /* The limit for `num_records' is a heuristic value. */\n\n    if ( version != 0 || num_records > 255 || record_size > 0x10001L )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) )\n      goto Fail;\n\n    for ( nn = 0; nn < num_records; nn++ )\n    {\n      if ( p + record_size > limit )\n        break;\n\n      face->hdmx_record_sizes[nn] = p[0];\n      p                          += record_size;\n    }\n\n    face->hdmx_record_count = nn;\n    face->hdmx_table_size   = table_size;\n    face->hdmx_record_size  = record_size;\n\n  Exit:\n    return error;\n\n  Fail:\n    FT_FRAME_RELEASE( face->hdmx_table );\n    face->hdmx_table_size = 0;\n    goto Exit;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  tt_face_free_hdmx( TT_Face  face )\n  {\n    FT_Stream  stream = face->root.stream;\n    FT_Memory  memory = stream->memory;\n\n\n    FT_FREE( face->hdmx_record_sizes );\n    FT_FRAME_RELEASE( face->hdmx_table );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Return the advance width table for a given pixel size if it is found  */\n  /* in the font's `hdmx' table (if any).                                  */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Byte* )\n  tt_face_get_device_metrics( TT_Face  face,\n                              FT_UInt  ppem,\n                              FT_UInt  gindex )\n  {\n    FT_UInt   nn;\n    FT_Byte*  result      = NULL;\n    FT_ULong  record_size = face->hdmx_record_size;\n    FT_Byte*  record      = face->hdmx_table + 8;\n\n\n    for ( nn = 0; nn < face->hdmx_record_count; nn++ )\n      if ( face->hdmx_record_sizes[nn] == ppem )\n      {\n        gindex += 2;\n        if ( gindex < record_size )\n          result = record + nn * record_size + gindex;\n        break;\n      }\n\n    return result;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttpload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttpload.h                                                              */\n/*                                                                         */\n/*    TrueType-specific tables loader (specification).                     */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2005, 2006 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTPLOAD_H__\n#define __TTPLOAD_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_TRUETYPE_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_loca( TT_Face    face,\n                     FT_Stream  stream );\n\n  FT_LOCAL( FT_ULong )\n  tt_face_get_location( TT_Face   face,\n                        FT_UInt   gindex,\n                        FT_UInt  *asize );\n\n  FT_LOCAL( void )\n  tt_face_done_loca( TT_Face  face );\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_cvt( TT_Face    face,\n                    FT_Stream  stream );\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_fpgm( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_prep( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( FT_Error )\n  tt_face_load_hdmx( TT_Face    face,\n                     FT_Stream  stream );\n\n\n  FT_LOCAL( void )\n  tt_face_free_hdmx( TT_Face  face );\n\n\n  FT_LOCAL( FT_Byte* )\n  tt_face_get_device_metrics( TT_Face    face,\n                              FT_UInt    ppem,\n                              FT_UInt    gindex );\n\nFT_END_HEADER\n\n#endif /* __TTPLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttsubpix.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttsubpix.c                                                             */\n/*                                                                         */\n/*    TrueType Subpixel Hinting.                                           */\n/*                                                                         */\n/*  Copyright 2010-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_SFNT_H\n#include FT_TRUETYPE_TAGS_H\n#include FT_OUTLINE_H\n\n#include \"ttsubpix.h\"\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* These rules affect how the TT Interpreter does hinting, with the      */\n  /* goal of doing subpixel hinting by (in general) ignoring x moves.      */\n  /* Some of these rules are fixes that go above and beyond the            */\n  /* stated techniques in the MS whitepaper on Cleartype, due to           */\n  /* artifacts in many glyphs.  So, these rules make some glyphs render    */\n  /* better than they do in the MS rasterizer.                             */\n  /*                                                                       */\n  /* \"\" string or 0 int/char indicates to apply to all glyphs.             */\n  /* \"-\" used as dummy placeholders, but any non-matching string works.    */\n  /*                                                                       */\n  /* Some of this could arguably be implemented in fontconfig, however:    */\n  /*                                                                       */\n  /*  - Fontconfig can't set things on a glyph-by-glyph basis.             */\n  /*  - The tweaks that happen here are very low-level, from an average    */\n  /*    user's point of view and are best implemented in the hinter.       */\n  /*                                                                       */\n  /* The goal is to make the subpixel hinting techniques as generalized    */\n  /* as possible across all fonts to prevent the need for extra rules such */\n  /* as these.                                                             */\n  /*                                                                       */\n  /* The rule structure is designed so that entirely new rules can easily  */\n  /* be added when a new compatibility feature is discovered.              */\n  /*                                                                       */\n  /* The rule structures could also use some enhancement to handle ranges. */\n  /*                                                                       */\n  /*     ****************** WORK IN PROGRESS *******************           */\n  /*                                                                       */\n\n  /* These are `classes' of fonts that can be grouped together and used in */\n  /* rules below.  A blank entry \"\" is required at the end of these!       */\n#define FAMILY_CLASS_RULES_SIZE  7\n\n  static const SPH_Font_Class FAMILY_CLASS_Rules\n                              [FAMILY_CLASS_RULES_SIZE] =\n  {\n    { \"MS Legacy Fonts\",\n      { \"Aharoni\",\n        \"Andale Mono\",\n        \"Andalus\",\n        \"Angsana New\",\n        \"AngsanaUPC\",\n        \"Arabic Transparent\",\n        \"Arial Black\",\n        \"Arial Narrow\",\n        \"Arial Unicode MS\",\n        \"Arial\",\n        \"Batang\",\n        \"Browallia New\",\n        \"BrowalliaUPC\",\n        \"Comic Sans MS\",\n        \"Cordia New\",\n        \"CordiaUPC\",\n        \"Courier New\",\n        \"DFKai-SB\",\n        \"David Transparent\",\n        \"David\",\n        \"DilleniaUPC\",\n        \"Estrangelo Edessa\",\n        \"EucrosiaUPC\",\n        \"FangSong_GB2312\",\n        \"Fixed Miriam Transparent\",\n        \"FrankRuehl\",\n        \"Franklin Gothic Medium\",\n        \"FreesiaUPC\",\n        \"Garamond\",\n        \"Gautami\",\n        \"Georgia\",\n        \"Gulim\",\n        \"Impact\",\n        \"IrisUPC\",\n        \"JasmineUPC\",\n        \"KaiTi_GB2312\",\n        \"KodchiangUPC\",\n        \"Latha\",\n        \"Levenim MT\",\n        \"LilyUPC\",\n        \"Lucida Console\",\n        \"Lucida Sans Unicode\",\n        \"MS Gothic\",\n        \"MS Mincho\",\n        \"MV Boli\",\n        \"Mangal\",\n        \"Marlett\",\n        \"Microsoft Sans Serif\",\n        \"Mingliu\",\n        \"Miriam Fixed\",\n        \"Miriam Transparent\",\n        \"Miriam\",\n        \"Narkisim\",\n        \"Palatino Linotype\",\n        \"Raavi\",\n        \"Rod Transparent\",\n        \"Rod\",\n        \"Shruti\",\n        \"SimHei\",\n        \"Simplified Arabic Fixed\",\n        \"Simplified Arabic\",\n        \"Simsun\",\n        \"Sylfaen\",\n        \"Symbol\",\n        \"Tahoma\",\n        \"Times New Roman\",\n        \"Traditional Arabic\",\n        \"Trebuchet MS\",\n        \"Tunga\",\n        \"Verdana\",\n        \"Webdings\",\n        \"Wingdings\",\n        \"\",\n      },\n    },\n    { \"Core MS Legacy Fonts\",\n      { \"Arial Black\",\n        \"Arial Narrow\",\n        \"Arial Unicode MS\",\n        \"Arial\",\n        \"Comic Sans MS\",\n        \"Courier New\",\n        \"Garamond\",\n        \"Georgia\",\n        \"Impact\",\n        \"Lucida Console\",\n        \"Lucida Sans Unicode\",\n        \"Microsoft Sans Serif\",\n        \"Palatino Linotype\",\n        \"Tahoma\",\n        \"Times New Roman\",\n        \"Trebuchet MS\",\n        \"Verdana\",\n        \"\",\n      },\n    },\n    { \"Apple Legacy Fonts\",\n      { \"Geneva\",\n        \"Times\",\n        \"Monaco\",\n        \"Century\",\n        \"Chalkboard\",\n        \"Lobster\",\n        \"Century Gothic\",\n        \"Optima\",\n        \"Lucida Grande\",\n        \"Gill Sans\",\n        \"Baskerville\",\n        \"Helvetica\",\n        \"Helvetica Neue\",\n        \"\",\n      },\n    },\n    { \"Legacy Sans Fonts\",\n      { \"Andale Mono\",\n        \"Arial Unicode MS\",\n        \"Arial\",\n        \"Century Gothic\",\n        \"Comic Sans MS\",\n        \"Franklin Gothic Medium\",\n        \"Geneva\",\n        \"Lucida Console\",\n        \"Lucida Grande\",\n        \"Lucida Sans Unicode\",\n        \"Lucida Sans Typewriter\",\n        \"Microsoft Sans Serif\",\n        \"Monaco\",\n        \"Tahoma\",\n        \"Trebuchet MS\",\n        \"Verdana\",\n        \"\",\n      },\n    },\n\n    { \"Misc Legacy Fonts\",\n      { \"Dark Courier\", \"\", }, },\n    { \"Verdana Clones\",\n      { \"DejaVu Sans\",\n        \"Bitstream Vera Sans\", \"\", }, },\n    { \"Verdana and Clones\",\n      { \"DejaVu Sans\",\n        \"Bitstream Vera Sans\",\n        \"Verdana\", \"\", }, },\n  };\n\n\n  /* Define this to force natural (i.e. not bitmap-compatible) widths.     */\n  /* The default leans strongly towards natural widths except for a few    */\n  /* legacy fonts where a selective combination produces nicer results.    */\n/* #define FORCE_NATURAL_WIDTHS   */\n\n\n  /* Define `classes' of styles that can be grouped together and used in   */\n  /* rules below.  A blank entry \"\" is required at the end of these!       */\n#define STYLE_CLASS_RULES_SIZE  5\n\n  const SPH_Font_Class STYLE_CLASS_Rules\n                       [STYLE_CLASS_RULES_SIZE] =\n  {\n    { \"Regular Class\",\n      { \"Regular\",\n        \"Book\",\n        \"Medium\",\n        \"Roman\",\n        \"Normal\",\n        \"\",\n      },\n    },\n    { \"Regular/Italic Class\",\n      { \"Regular\",\n        \"Book\",\n        \"Medium\",\n        \"Italic\",\n        \"Oblique\",\n        \"Roman\",\n        \"Normal\",\n        \"\",\n      },\n    },\n    { \"Bold/BoldItalic Class\",\n      { \"Bold\",\n        \"Bold Italic\",\n        \"Black\",\n        \"\",\n      },\n    },\n    { \"Bold/Italic/BoldItalic Class\",\n      { \"Bold\",\n        \"Bold Italic\",\n        \"Black\",\n        \"Italic\",\n        \"Oblique\",\n        \"\",\n      },\n    },\n    { \"Regular/Bold Class\",\n      { \"Regular\",\n        \"Book\",\n        \"Medium\",\n        \"Normal\",\n        \"Roman\",\n        \"Bold\",\n        \"Black\",\n        \"\",\n      },\n    },\n  };\n\n\n  /* Force special legacy fixes for fonts.                                 */\n#define COMPATIBILITY_MODE_RULES_SIZE  1\n\n  const SPH_TweakRule  COMPATIBILITY_MODE_Rules\n                       [COMPATIBILITY_MODE_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting.         */\n#define PIXEL_HINTING_RULES_SIZE  1\n\n  const SPH_TweakRule  PIXEL_HINTING_Rules\n                       [PIXEL_HINTING_RULES_SIZE] =\n  {\n    /* these characters are almost always safe */\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* According to Greg Hitchcock and the MS whitepaper, this should work   */\n  /* on all legacy MS fonts, but creates artifacts with some.  Only using  */\n  /* where absolutely necessary.                                           */\n#define SKIP_INLINE_DELTAS_RULES_SIZE  1\n\n  const SPH_TweakRule  SKIP_INLINE_DELTAS_Rules\n                       [SKIP_INLINE_DELTAS_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Subpixel hinting ignores SHPIX rules on X.  Force SHPIX for these.    */\n#define DO_SHPIX_RULES_SIZE  1\n\n  const SPH_TweakRule  DO_SHPIX_Rules\n                       [DO_SHPIX_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Skip Y moves that start with a point that is not on a Y pixel         */\n  /* boundary and don't move that point to a Y pixel boundary.             */\n#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE  9\n\n  const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules\n                       [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] =\n  {\n    /* fix vwxyz thinness*/\n    { \"Consolas\", 0, \"Regular\", 0 },\n    /* fix tiny gap at top of m */\n    { \"Arial\", 0, \"Regular\", 'm' },\n    /* Fix thin middle stems */\n    { \"Core MS Legacy Fonts\", 0, \"Regular/Bold Class\", 'N' },\n    { \"Lucida Grande\", 0, \"\", 'N' },\n    { \"Lucida Grande\", 0, \"Bold\", 'y' },\n    /* Cyrillic small letter I */\n    { \"Legacy Sans Fonts\", 0, \"\", 0x438 },\n    { \"Verdana Clones\", 0, \"\",'N' },\n    /* Fix misshapen x */\n    { \"Verdana\", 0, \"Bold\", 'x' },\n    /* Fix misshapen s */\n    { \"Tahoma\", 0, \"\", 's' },\n  };\n\n\n#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  7\n\n  const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions\n                       [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =\n  {\n    { \"Tahoma\", 0, \"\", 'N' },\n    { \"Comic Sans MS\", 0, \"\", 'N' },\n    { \"Verdana\", 0, \"Regular/Bold Class\", 'N' },\n    { \"Verdana\", 11, \"Bold\", 'x' },\n    /* Cyrillic small letter I */\n    { \"Arial\", 0, \"\", 0x438 },\n    { \"Arial\", 11, \"Bold\", 'N' },\n    { \"Trebuchet MS\", 0, \"Bold\", 0 },\n  };\n\n\n  /* Skip Y moves that move a point off a Y pixel boundary.                */\n#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE  1\n\n  const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules\n                       [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1\n\n  const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions\n                       [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Round moves that don't move a point to a Y pixel boundary.            */\n#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE  2\n\n  const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules\n                       [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] =\n  {\n    /* Droid font instructions don't snap Y to pixels */\n    { \"Droid Sans\", 0, \"Regular/Italic Class\", 0 },\n    { \"Droid Sans Mono\", 0, \"\", 0 },\n  };\n\n\n#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1\n\n  const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions\n                       [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Allow a Direct_Move_X along X freedom vector if matched.              */\n#define ALLOW_X_DMOVEX_RULES_SIZE  1\n\n  const SPH_TweakRule  ALLOW_X_DMOVEX_Rules\n                       [ALLOW_X_DMOVEX_RULES_SIZE] =\n  {\n    { \"-\", 0, \"Regular\", 0 },\n  };\n\n\n  /* Allow a Direct_Move along X freedom vector if matched.                */\n#define ALLOW_X_DMOVE_RULES_SIZE  1\n\n  const SPH_TweakRule  ALLOW_X_DMOVE_Rules\n                       [ALLOW_X_DMOVE_RULES_SIZE] =\n  {\n    /* Fixes vanishing diagonal in 4 */\n    { \"Verdana\", 0, \"Regular\", '4' },\n  };\n\n\n  /* Allow a ZP2 move along freedom vector if matched;                     */\n  /* This is called from SHP, SHPIX, SHC, SHZ.                             */\n#define ALLOW_X_MOVE_ZP2_RULES_SIZE  1\n\n  const SPH_TweakRule  ALLOW_X_MOVE_ZP2_Rules\n                       [ALLOW_X_MOVE_ZP2_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Return MS rasterizer version 35 if matched.                           */\n#define RASTERIZER_35_RULES_SIZE  8\n\n  const SPH_TweakRule  RASTERIZER_35_Rules\n                       [RASTERIZER_35_RULES_SIZE] =\n  {\n    /* This seems to be the only way to make these look good */\n    { \"Times New Roman\", 0, \"Regular\", 'i' },\n    { \"Times New Roman\", 0, \"Regular\", 'j' },\n    { \"Times New Roman\", 0, \"Regular\", 'm' },\n    { \"Times New Roman\", 0, \"Regular\", 'r' },\n    { \"Times New Roman\", 0, \"Regular\", 'a' },\n    { \"Times New Roman\", 0, \"Regular\", 'n' },\n    { \"Times New Roman\", 0, \"Regular\", 'p' },\n    { \"Times\", 0, \"\", 0 },\n  };\n\n\n  /* Don't round to the subpixel grid.  Round to pixel grid.               */\n#define NORMAL_ROUND_RULES_SIZE  1\n\n  const SPH_TweakRule  NORMAL_ROUND_Rules\n                       [NORMAL_ROUND_RULES_SIZE] =\n  {\n    /* Fix serif thickness */\n    { \"Courier New\", 0, \"\", 0 },\n  };\n\n\n  /* Skip IUP instructions if matched.                                     */\n#define SKIP_IUP_RULES_SIZE  1\n\n  const SPH_TweakRule  SKIP_IUP_Rules\n                       [SKIP_IUP_RULES_SIZE] =\n  {\n    { \"Arial\", 13, \"Regular\", 'a' },\n  };\n\n\n  /* Skip MIAP Twilight hack if matched.                                   */\n#define MIAP_HACK_RULES_SIZE  1\n\n  const SPH_TweakRule  MIAP_HACK_Rules\n                       [MIAP_HACK_RULES_SIZE] =\n  {\n    { \"Geneva\", 12, \"\", 0 },\n  };\n\n\n  /* Skip DELTAP instructions if matched.                                  */\n#define ALWAYS_SKIP_DELTAP_RULES_SIZE  15\n\n  const SPH_TweakRule  ALWAYS_SKIP_DELTAP_Rules\n                       [ALWAYS_SKIP_DELTAP_RULES_SIZE] =\n  {\n    { \"Georgia\", 0, \"Regular\", 'k' },\n    /* fix various problems with e in different versions */\n    { \"Trebuchet MS\", 14, \"Regular\", 'e' },\n    { \"Trebuchet MS\", 13, \"Regular\", 'e' },\n    { \"Trebuchet MS\", 15, \"Regular\", 'e' },\n    { \"Arial\", 11, \"Regular\", 's' },\n    { \"Verdana\", 10, \"Regular\", 0 },\n    { \"Verdana\", 9, \"Regular\", 0 },\n    /* Cyrillic small letter short I */\n    { \"Legacy Sans Fonts\", 0, \"\", 0x438 },\n    { \"Legacy Sans Fonts\", 0, \"\", 0x439 },\n    { \"Arial\", 10, \"Regular\", '6' },\n    { \"Arial\", 0, \"Bold/BoldItalic Class\", 'a' },\n    /* Make horizontal stems consistent with the rest */\n    { \"Arial\", 24, \"Bold\", 's' },\n    { \"Arial\", 25, \"Bold\", 's' },\n    { \"Arial\", 24, \"Bold\", 'a' },\n    { \"Arial\", 25, \"Bold\", 'a' },\n  };\n\n\n  /* Always do DELTAP instructions if matched.                             */\n#define ALWAYS_DO_DELTAP_RULES_SIZE  2\n\n  const SPH_TweakRule  ALWAYS_DO_DELTAP_Rules\n                       [ALWAYS_DO_DELTAP_RULES_SIZE] =\n  {\n    { \"Verdana Clones\", 17, \"Regular Class\", 'K' },\n    { \"Verdana Clones\", 17, \"Regular Class\", 'k' },\n  };\n\n\n  /* Do an extra RTG instruction in DELTAP if matched.                     */\n#define DELTAP_RTG_RULES_SIZE  1\n\n  static const SPH_TweakRule  DELTAP_RTG_Rules\n                              [DELTAP_RTG_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Force CVT distance to zero in MIRP.                                   */\n#define MIRP_CVT_ZERO_RULES_SIZE  1\n\n  static const SPH_TweakRule  MIRP_CVT_ZERO_Rules\n                              [MIRP_CVT_ZERO_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Skip moves that meet or exceed 1 pixel.                               */\n#define DELTAP_SKIP_EXAGGERATED_VALUES_RULES_SIZE  1\n\n  static const SPH_TweakRule  DELTAP_SKIP_EXAGGERATED_VALUES_Rules\n                              [DELTAP_SKIP_EXAGGERATED_VALUES_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Don't allow ALIGNRP after IUP.                                        */\n#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE  4\n\n  static const SPH_TweakRule  NO_ALIGNRP_AFTER_IUP_Rules\n                              [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] =\n  {\n    /* Prevent creation of dents in outline */\n    { \"Courier New\", 0, \"Bold\", 'C' },\n    { \"Courier New\", 0, \"Bold\", 'D' },\n    { \"Courier New\", 0, \"Bold\", 'Q' },\n    { \"Courier New\", 0, \"Bold\", '0' },\n  };\n\n\n  /* Don't allow DELTAP after IUP.                                         */\n#define NO_DELTAP_AFTER_IUP_RULES_SIZE  1\n\n  static const SPH_TweakRule  NO_DELTAP_AFTER_IUP_Rules\n                              [NO_DELTAP_AFTER_IUP_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* Don't allow CALL after IUP.                                           */\n#define NO_CALL_AFTER_IUP_RULES_SIZE  4\n\n  static const SPH_TweakRule  NO_CALL_AFTER_IUP_Rules\n                              [NO_CALL_AFTER_IUP_RULES_SIZE] =\n  {\n    /* Prevent creation of dents in outline */\n    { \"Courier New\", 0, \"Bold\", 'O' },\n    { \"Courier New\", 0, \"Bold\", 'Q' },\n    { \"Courier New\", 0, \"Bold\", 'k' },\n    { \"Courier New\", 0, \"Bold Italic\", 'M' },\n  };\n\n\n  /* De-embolden these glyphs slightly.                                    */\n#define DEEMBOLDEN_RULES_SIZE  9\n\n  static const SPH_TweakRule  DEEMBOLDEN_Rules\n                              [DEEMBOLDEN_RULES_SIZE] =\n  {\n    { \"Courier New\", 0, \"Bold\", 'A' },\n    { \"Courier New\", 0, \"Bold\", 'W' },\n    { \"Courier New\", 0, \"Bold\", 'w' },\n    { \"Courier New\", 0, \"Bold\", 'M' },\n    { \"Courier New\", 0, \"Bold\", 'X' },\n    { \"Courier New\", 0, \"Bold\", 'K' },\n    { \"Courier New\", 0, \"Bold\", 'x' },\n    { \"Courier New\", 0, \"Bold\", 'z' },\n    { \"Courier New\", 0, \"Bold\", 'v' },\n  };\n\n\n  /* Embolden these glyphs slightly.                                       */\n#define EMBOLDEN_RULES_SIZE  5\n\n  static const SPH_TweakRule  EMBOLDEN_Rules\n                              [EMBOLDEN_RULES_SIZE] =\n  {\n    { \"Courier New\", 12, \"Italic\", 'z' },\n    { \"Courier New\", 11, \"Italic\", 'z' },\n    { \"Courier New\", 10, \"Italic\", 'z' },\n    { \"Courier New\", 0, \"Regular\", 0 },\n    { \"Courier New\", 0, \"Italic\", 0 },\n  };\n\n\n  /* Do an extra RDTG instruction in DELTAP if matched.                    */\n#define DELTAP_RDTG_RULES_SIZE  1\n\n  static const SPH_TweakRule  DELTAP_RDTG_Rules\n                              [DELTAP_RDTG_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n  /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7       */\n  /* similar to Windows XP.                                                */\n#define TIMES_NEW_ROMAN_HACK_RULES_SIZE  12\n\n  static const SPH_TweakRule  TIMES_NEW_ROMAN_HACK_Rules\n                              [TIMES_NEW_ROMAN_HACK_RULES_SIZE] =\n  {\n    { \"Times New Roman\", 16, \"Italic\", '2' },\n    { \"Times New Roman\", 16, \"Italic\", '5' },\n    { \"Times New Roman\", 16, \"Italic\", '7' },\n    { \"Times New Roman\", 16, \"Regular\", '2' },\n    { \"Times New Roman\", 16, \"Regular\", '5' },\n    { \"Times New Roman\", 16, \"Regular\", '7' },\n    { \"Times New Roman\", 17, \"Italic\", '2' },\n    { \"Times New Roman\", 17, \"Italic\", '5' },\n    { \"Times New Roman\", 17, \"Italic\", '7' },\n    { \"Times New Roman\", 17, \"Regular\", '2' },\n    { \"Times New Roman\", 17, \"Regular\", '5' },\n    { \"Times New Roman\", 17, \"Regular\", '7' },\n  };\n\n\n  /* This fudges distance on 2 to get rid of the vanishing stem issue.     */\n  /* A real solution to this is certainly welcome.                         */\n#define COURIER_NEW_2_HACK_RULES_SIZE  15\n\n  static const SPH_TweakRule  COURIER_NEW_2_HACK_Rules\n                              [COURIER_NEW_2_HACK_RULES_SIZE] =\n  {\n    { \"Courier New\", 10, \"Regular\", '2' },\n    { \"Courier New\", 11, \"Regular\", '2' },\n    { \"Courier New\", 12, \"Regular\", '2' },\n    { \"Courier New\", 13, \"Regular\", '2' },\n    { \"Courier New\", 14, \"Regular\", '2' },\n    { \"Courier New\", 15, \"Regular\", '2' },\n    { \"Courier New\", 16, \"Regular\", '2' },\n    { \"Courier New\", 17, \"Regular\", '2' },\n    { \"Courier New\", 18, \"Regular\", '2' },\n    { \"Courier New\", 19, \"Regular\", '2' },\n    { \"Courier New\", 20, \"Regular\", '2' },\n    { \"Courier New\", 21, \"Regular\", '2' },\n    { \"Courier New\", 22, \"Regular\", '2' },\n    { \"Courier New\", 23, \"Regular\", '2' },\n    { \"Courier New\", 24, \"Regular\", '2' },\n  };\n\n\n#ifndef FORCE_NATURAL_WIDTHS\n\n  /* Use compatible widths with these glyphs.  Compatible widths is always */\n  /* on when doing B/W TrueType instructing, but is used selectively here, */\n  /* typically on glyphs with 3 or more vertical stems.                    */\n#define COMPATIBLE_WIDTHS_RULES_SIZE  38\n\n  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules\n                              [COMPATIBLE_WIDTHS_RULES_SIZE] =\n  {\n    { \"Arial Unicode MS\", 12, \"Regular Class\", 'm' },\n    { \"Arial Unicode MS\", 14, \"Regular Class\", 'm' },\n    /* Cyrillic small letter sha */\n    { \"Arial\", 10, \"Regular Class\", 0x448 },\n    { \"Arial\", 11, \"Regular Class\", 'm' },\n    { \"Arial\", 12, \"Regular Class\", 'm' },\n    /* Cyrillic small letter sha */\n    { \"Arial\", 12, \"Regular Class\", 0x448 },\n    { \"Arial\", 13, \"Regular Class\", 0x448 },\n    { \"Arial\", 14, \"Regular Class\", 'm' },\n    /* Cyrillic small letter sha */\n    { \"Arial\", 14, \"Regular Class\", 0x448 },\n    { \"Arial\", 15, \"Regular Class\", 0x448 },\n    { \"Arial\", 17, \"Regular Class\", 'm' },\n    { \"DejaVu Sans\", 15, \"Regular Class\", 0 },\n    { \"Microsoft Sans Serif\", 11, \"Regular Class\", 0 },\n    { \"Microsoft Sans Serif\", 12, \"Regular Class\", 0 },\n    { \"Segoe UI\", 11, \"Regular Class\", 0 },\n    { \"Monaco\", 0, \"Regular Class\", 0 },\n    { \"Segoe UI\", 12, \"Regular Class\", 'm' },\n    { \"Segoe UI\", 14, \"Regular Class\", 'm' },\n    { \"Tahoma\", 11, \"Regular Class\", 0 },\n    { \"Times New Roman\", 16, \"Regular Class\", 'c' },\n    { \"Times New Roman\", 16, \"Regular Class\", 'm' },\n    { \"Times New Roman\", 16, \"Regular Class\", 'o' },\n    { \"Times New Roman\", 16, \"Regular Class\", 'w' },\n    { \"Trebuchet MS\", 11, \"Regular Class\", 0 },\n    { \"Trebuchet MS\", 12, \"Regular Class\", 0 },\n    { \"Trebuchet MS\", 14, \"Regular Class\", 0 },\n    { \"Trebuchet MS\", 15, \"Regular Class\", 0 },\n    { \"Ubuntu\", 12, \"Regular Class\", 'm' },\n    /* Cyrillic small letter sha */\n    { \"Verdana\", 10, \"Regular Class\", 0x448 },\n    { \"Verdana\", 11, \"Regular Class\", 0x448 },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'i' },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'j' },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'l' },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'm' },\n    { \"Verdana and Clones\", 13, \"Regular Class\", 'i' },\n    { \"Verdana and Clones\", 13, \"Regular Class\", 'j' },\n    { \"Verdana and Clones\", 13, \"Regular Class\", 'l' },\n    { \"Verdana and Clones\", 14, \"Regular Class\", 'm' },\n  };\n\n\n  /* Scaling slightly in the x-direction prior to hinting results in       */\n  /* more visually pleasing glyphs in certain cases.                       */\n  /* This sometimes needs to be coordinated with compatible width rules.   */\n  /* A value of 1000 corresponds to a scaled value of 1.0.                 */\n\n#define X_SCALING_RULES_SIZE  50\n\n  static const SPH_ScaleRule  X_SCALING_Rules[X_SCALING_RULES_SIZE] =\n  {\n    { \"DejaVu Sans\", 12, \"Regular Class\", 'm', 950 },\n    { \"Verdana and Clones\", 12, \"Regular Class\", 'a', 1100 },\n    { \"Verdana and Clones\", 13, \"Regular Class\", 'a', 1050 },\n    { \"Arial\", 11, \"Regular Class\", 'm', 975 },\n    { \"Arial\", 12, \"Regular Class\", 'm', 1050 },\n    /* Cyrillic small letter el */\n    { \"Arial\", 13, \"Regular Class\", 0x43B, 950 },\n    { \"Arial\", 13, \"Regular Class\", 'o', 950 },\n    { \"Arial\", 13, \"Regular Class\", 'e', 950 },\n    { \"Arial\", 14, \"Regular Class\", 'm', 950 },\n    /* Cyrillic small letter el */\n    { \"Arial\", 15, \"Regular Class\", 0x43B, 925 },\n    { \"Bitstream Vera Sans\", 10, \"Regular/Italic Class\", 0, 1100 },\n    { \"Bitstream Vera Sans\", 12, \"Regular/Italic Class\", 0, 1050 },\n    { \"Bitstream Vera Sans\", 16, \"Regular Class\", 0, 1050 },\n    { \"Bitstream Vera Sans\", 9, \"Regular/Italic Class\", 0, 1050 },\n    { \"DejaVu Sans\", 12, \"Regular Class\", 'l', 975 },\n    { \"DejaVu Sans\", 12, \"Regular Class\", 'i', 975 },\n    { \"DejaVu Sans\", 12, \"Regular Class\", 'j', 975 },\n    { \"DejaVu Sans\", 13, \"Regular Class\", 'l', 950 },\n    { \"DejaVu Sans\", 13, \"Regular Class\", 'i', 950 },\n    { \"DejaVu Sans\", 13, \"Regular Class\", 'j', 950 },\n    { \"DejaVu Sans\", 10, \"Regular/Italic Class\", 0, 1100 },\n    { \"DejaVu Sans\", 12, \"Regular/Italic Class\", 0, 1050 },\n    { \"Georgia\", 10, \"\", 0, 1050 },\n    { \"Georgia\", 11, \"\", 0, 1100 },\n    { \"Georgia\", 12, \"\", 0, 1025 },\n    { \"Georgia\", 13, \"\", 0, 1050 },\n    { \"Georgia\", 16, \"\", 0, 1050 },\n    { \"Georgia\", 17, \"\", 0, 1030 },\n    { \"Liberation Sans\", 12, \"Regular Class\", 'm', 1100 },\n    { \"Lucida Grande\", 11, \"Regular Class\", 'm', 1100 },\n    { \"Microsoft Sans Serif\", 11, \"Regular Class\", 'm', 950 },\n    { \"Microsoft Sans Serif\", 12, \"Regular Class\", 'm', 1050 },\n    { \"Segoe UI\", 12, \"Regular Class\", 'H', 1050 },\n    { \"Segoe UI\", 12, \"Regular Class\", 'm', 1050 },\n    { \"Segoe UI\", 14, \"Regular Class\", 'm', 1050 },\n    { \"Tahoma\", 11, \"Regular Class\", 'i', 975 },\n    { \"Tahoma\", 11, \"Regular Class\", 'l', 975 },\n    { \"Tahoma\", 11, \"Regular Class\", 'j', 900 },\n    { \"Tahoma\", 11, \"Regular Class\", 'm', 918 },\n    { \"Verdana\", 10, \"Regular/Italic Class\", 0, 1100 },\n    { \"Verdana\", 12, \"Regular Class\", 'm', 975 },\n    { \"Verdana\", 12, \"Regular/Italic Class\", 0, 1050 },\n    { \"Verdana\", 13, \"Regular/Italic Class\", 'i', 950 },\n    { \"Verdana\", 13, \"Regular/Italic Class\", 'j', 950 },\n    { \"Verdana\", 13, \"Regular/Italic Class\", 'l', 950 },\n    { \"Verdana\", 16, \"Regular Class\", 0, 1050 },\n    { \"Verdana\", 9, \"Regular/Italic Class\", 0, 1050 },\n    { \"Times New Roman\", 16, \"Regular Class\", 'm', 918 },\n    { \"Trebuchet MS\", 11, \"Regular Class\", 'm', 800 },\n    { \"Trebuchet MS\", 12, \"Regular Class\", 'm', 800 },\n  };\n\n#else\n\n#define COMPATIBLE_WIDTHS_RULES_SIZE  1\n\n  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules\n                              [COMPATIBLE_WIDTHS_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0 },\n  };\n\n\n#define X_SCALING_RULES_SIZE  1\n\n  static const SPH_ScaleRule  X_SCALING_Rules\n                              [X_SCALING_RULES_SIZE] =\n  {\n    { \"-\", 0, \"\", 0, 1000 },\n  };\n\n#endif /* FORCE_NATURAL_WIDTHS */\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  is_member_of_family_class( const FT_String*  detected_font_name,\n                             const FT_String*  rule_font_name )\n  {\n    FT_UInt  i, j;\n\n\n    /* Does font name match rule family? */\n    if ( strcmp( detected_font_name, rule_font_name ) == 0 )\n      return TRUE;\n\n    /* Is font name a wildcard \"\"? */\n    if ( strcmp( rule_font_name, \"\" ) == 0 )\n      return TRUE;\n\n    /* Is font name contained in a class list? */\n    for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )\n    {\n      if ( strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )\n      {\n        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )\n        {\n          if ( strcmp( FAMILY_CLASS_Rules[i].member[j], \"\" ) == 0 )\n            continue;\n          if ( strcmp( FAMILY_CLASS_Rules[i].member[j],\n                       detected_font_name ) == 0 )\n            return TRUE;\n        }\n      }\n    }\n\n    return FALSE;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  is_member_of_style_class( const FT_String*  detected_font_style,\n                            const FT_String*  rule_font_style )\n  {\n    FT_UInt  i, j;\n\n\n    /* Does font style match rule style? */\n    if ( strcmp( detected_font_style, rule_font_style ) == 0 )\n      return TRUE;\n\n    /* Is font style a wildcard \"\"? */\n    if ( strcmp( rule_font_style, \"\" ) == 0 )\n      return TRUE;\n\n    /* Is font style contained in a class list? */\n    for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )\n    {\n      if ( strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )\n      {\n        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )\n        {\n          if ( strcmp( STYLE_CLASS_Rules[i].member[j], \"\" ) == 0 )\n            continue;\n          if ( strcmp( STYLE_CLASS_Rules[i].member[j],\n                       detected_font_style ) == 0 )\n            return TRUE;\n        }\n      }\n    }\n\n    return FALSE;\n  }\n\n\n  FT_LOCAL_DEF( FT_Bool )\n  sph_test_tweak( TT_Face               face,\n                  const FT_String*      family,\n                  FT_UInt               ppem,\n                  const FT_String*      style,\n                  FT_UInt               glyph_index,\n                  const SPH_TweakRule*  rule,\n                  FT_UInt               num_rules )\n  {\n    FT_UInt  i;\n\n\n    /* rule checks may be able to be optimized further */\n    for ( i = 0; i < num_rules; i++ )\n    {\n      if ( family                                                   &&\n           ( is_member_of_family_class ( family, rule[i].family ) ) )\n        if ( rule[i].ppem == 0    ||\n             rule[i].ppem == ppem )\n          if ( style                                             &&\n               is_member_of_style_class ( style, rule[i].style ) )\n            if ( rule[i].glyph == 0                                ||\n                 FT_Get_Char_Index( (FT_Face)face,\n                                    rule[i].glyph ) == glyph_index )\n        return TRUE;\n    }\n\n    return FALSE;\n  }\n\n\n  static FT_UInt\n  scale_test_tweak( TT_Face               face,\n                    const FT_String*      family,\n                    FT_UInt               ppem,\n                    const FT_String*      style,\n                    FT_UInt               glyph_index,\n                    const SPH_ScaleRule*  rule,\n                    FT_UInt               num_rules )\n  {\n    FT_UInt  i;\n\n\n    /* rule checks may be able to be optimized further */\n    for ( i = 0; i < num_rules; i++ )\n    {\n      if ( family                                                   &&\n           ( is_member_of_family_class ( family, rule[i].family ) ) )\n        if ( rule[i].ppem == 0    ||\n             rule[i].ppem == ppem )\n          if ( style                                            &&\n               is_member_of_style_class( style, rule[i].style ) )\n            if ( rule[i].glyph == 0                                ||\n                 FT_Get_Char_Index( (FT_Face)face,\n                                    rule[i].glyph ) == glyph_index )\n        return rule[i].scale;\n    }\n\n    return 1000;\n  }\n\n\n  FT_LOCAL_DEF( FT_UInt )\n  sph_test_tweak_x_scaling( TT_Face           face,\n                            const FT_String*  family,\n                            FT_UInt           ppem,\n                            const FT_String*  style,\n                            FT_UInt           glyph_index )\n  {\n    return scale_test_tweak( face, family, ppem, style, glyph_index,\n                             X_SCALING_Rules, X_SCALING_RULES_SIZE );\n  }\n\n\n#define TWEAK_RULES( x )                                       \\\n  if ( sph_test_tweak( face, family, ppem, style, glyph_index, \\\n                       x##_Rules, x##_RULES_SIZE ) )           \\\n    loader->exec->sph_tweak_flags |= SPH_TWEAK_##x;\n\n#define TWEAK_RULES_EXCEPTIONS( x )                                        \\\n  if ( sph_test_tweak( face, family, ppem, style, glyph_index,             \\\n                       x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \\\n    loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x;\n\n\n  FT_LOCAL_DEF( void )\n  sph_set_tweaks( TT_Loader  loader,\n                  FT_UInt    glyph_index )\n  {\n    TT_Face     face   = (TT_Face)loader->face;\n    FT_String*  family = face->root.family_name;\n    int         ppem   = loader->size->metrics.x_ppem;\n    FT_String*  style  = face->root.style_name;\n\n\n    /* don't apply rules if style isn't set */\n    if ( !face->root.style_name )\n      return;\n\n#ifdef SPH_DEBUG_MORE_VERBOSE\n    printf( \"%s,%d,%s,%c=%d \",\n            family, ppem, style, glyph_index, glyph_index );\n#endif\n\n    TWEAK_RULES( PIXEL_HINTING );\n\n    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING )\n    {\n      loader->exec->ignore_x_mode = FALSE;\n      return;\n    }\n\n    TWEAK_RULES( ALLOW_X_DMOVE );\n    TWEAK_RULES( ALLOW_X_DMOVEX );\n    TWEAK_RULES( ALLOW_X_MOVE_ZP2 );\n    TWEAK_RULES( ALWAYS_DO_DELTAP );\n    TWEAK_RULES( ALWAYS_SKIP_DELTAP );\n    TWEAK_RULES( DEEMBOLDEN );\n    TWEAK_RULES( DELTAP_SKIP_EXAGGERATED_VALUES );\n    TWEAK_RULES( DO_SHPIX );\n    TWEAK_RULES( EMBOLDEN );\n    TWEAK_RULES( MIAP_HACK );\n    TWEAK_RULES( NORMAL_ROUND );\n    TWEAK_RULES( NO_ALIGNRP_AFTER_IUP );\n    TWEAK_RULES( NO_CALL_AFTER_IUP );\n    TWEAK_RULES( NO_DELTAP_AFTER_IUP );\n    TWEAK_RULES( RASTERIZER_35 );\n    TWEAK_RULES( SKIP_INLINE_DELTAS );\n    TWEAK_RULES( SKIP_IUP );\n    TWEAK_RULES( MIRP_CVT_ZERO );\n\n    TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES );\n    TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES );\n\n    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES );\n    TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES );\n\n    TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES );\n    TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES );\n\n    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )\n    {\n      if ( loader->exec->rasterizer_version != 35 )\n      {\n        loader->exec->rasterizer_version = 35;\n        loader->exec->size->cvt_ready    = FALSE;\n\n        tt_size_ready_bytecode(\n          loader->exec->size,\n          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );\n      }\n      else\n        loader->exec->rasterizer_version = 35;\n    }\n    else\n    {\n      if ( loader->exec->rasterizer_version  !=\n           SPH_OPTION_SET_RASTERIZER_VERSION )\n      {\n        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;\n        loader->exec->size->cvt_ready    = FALSE;\n\n        tt_size_ready_bytecode(\n          loader->exec->size,\n          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );\n      }\n      else\n        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;\n    }\n\n    if ( IS_HINTED( loader->load_flags ) )\n    {\n      TWEAK_RULES( TIMES_NEW_ROMAN_HACK );\n      TWEAK_RULES( COURIER_NEW_2_HACK );\n    }\n\n    if ( sph_test_tweak( face, family, ppem, style, glyph_index,\n           COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) )\n      loader->exec->face->sph_compatibility_mode = TRUE;\n\n\n    if ( IS_HINTED( loader->load_flags ) )\n    {\n      if ( sph_test_tweak( face, family, ppem, style, glyph_index,\n             COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) )\n        loader->exec->compatible_widths |= TRUE;\n    }\n  }\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/truetype/ttsubpix.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ttsubpix.h                                                             */\n/*                                                                         */\n/*    TrueType Subpixel Hinting.                                           */\n/*                                                                         */\n/*  Copyright 2010-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __TTSUBPIX_H__\n#define __TTSUBPIX_H__\n\n#include <ft2build.h>\n#include \"ttobjs.h\"\n#include \"ttinterp.h\"\n\n\nFT_BEGIN_HEADER\n\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ID flags to identify special functions at FDEF and runtime.           */\n  /*                                                                       */\n  /*                                                                       */\n#define SPH_FDEF_INLINE_DELTA_1    0x0000001\n#define SPH_FDEF_INLINE_DELTA_2    0x0000002\n#define SPH_FDEF_DIAGONAL_STROKE   0x0000004\n#define SPH_FDEF_VACUFORM_ROUND_1  0x0000008\n#define SPH_FDEF_TTFAUTOHINT_1     0x0000010\n#define SPH_FDEF_SPACING_1         0x0000020\n#define SPH_FDEF_SPACING_2         0x0000040\n#define SPH_FDEF_TYPEMAN_STROKES   0x0000080\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Tweak flags that are set for each glyph by the below rules.           */\n  /*                                                                       */\n  /*                                                                       */\n#define SPH_TWEAK_ALLOW_X_DMOVE                   0x0000001\n#define SPH_TWEAK_ALLOW_X_DMOVEX                  0x0000002\n#define SPH_TWEAK_ALLOW_X_MOVE_ZP2                0x0000004\n#define SPH_TWEAK_ALWAYS_DO_DELTAP                0x0000008\n#define SPH_TWEAK_ALWAYS_SKIP_DELTAP              0x0000010\n#define SPH_TWEAK_COURIER_NEW_2_HACK              0x0000020\n#define SPH_TWEAK_DEEMBOLDEN                      0x0000040\n#define SPH_TWEAK_DELTAP_SKIP_EXAGGERATED_VALUES  0x0000080\n#define SPH_TWEAK_DO_SHPIX                        0x0000100\n#define SPH_TWEAK_EMBOLDEN                        0x0000200\n#define SPH_TWEAK_MIAP_HACK                       0x0000400\n#define SPH_TWEAK_NORMAL_ROUND                    0x0000800\n#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP            0x0001000\n#define SPH_TWEAK_NO_CALL_AFTER_IUP               0x0002000\n#define SPH_TWEAK_NO_DELTAP_AFTER_IUP             0x0004000\n#define SPH_TWEAK_PIXEL_HINTING                   0x0008000\n#define SPH_TWEAK_RASTERIZER_35                   0x0010000\n#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES          0x0020000\n#define SPH_TWEAK_SKIP_INLINE_DELTAS              0x0040000\n#define SPH_TWEAK_SKIP_IUP                        0x0080000\n#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES           0x0100000\n#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES           0x0200000\n#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK            0x0400000\n#define SPH_TWEAK_MIRP_CVT_ZERO                   0x0800000\n\n\n  FT_LOCAL( FT_Bool )\n  sph_test_tweak( TT_Face               face,\n                  const FT_String*      family,\n                  FT_UInt               ppem,\n                  const FT_String*      style,\n                  FT_UInt               glyph_index,\n                  const SPH_TweakRule*  rule,\n                  FT_UInt               num_rules );\n\n  FT_LOCAL( FT_UInt )\n  sph_test_tweak_x_scaling( TT_Face           face,\n                            const FT_String*  family,\n                            FT_UInt           ppem,\n                            const FT_String*  style,\n                            FT_UInt           glyph_index );\n\n  FT_LOCAL( void )\n  sph_set_tweaks( TT_Loader  loader,\n                  FT_UInt    glyph_index );\n\n\n  /* These macros are defined absent a method for setting them */\n#define SPH_OPTION_BITMAP_WIDTHS           FALSE\n#define SPH_OPTION_SET_SUBPIXEL            TRUE\n#define SPH_OPTION_SET_GRAYSCALE           FALSE\n#define SPH_OPTION_SET_COMPATIBLE_WIDTHS   FALSE\n#define SPH_OPTION_SET_RASTERIZER_VERSION  38\n\n#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */\n\n\nFT_END_HEADER\n\n#endif /* __TTSUBPIX_H__ */\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/Jamfile",
    "content": "# FreeType 2 src/type1 Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) type1 ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = t1afm t1driver t1objs t1load t1gload t1parse ;\n  }\n  else\n  {\n    _sources = type1 ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/type1 Jamfile\n"
  },
  {
    "path": "libs/freetype/src/type1/module.mk",
    "content": "#\n# FreeType 2 Type1 module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += TYPE1_DRIVER\n\ndefine TYPE1_DRIVER\n$(OPEN_DRIVER) FT_Driver_ClassRec, t1_driver_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)type1     $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/type1/rules.mk",
    "content": "#\n# FreeType 2 Type1 driver configuration rules\n#\n\n\n# Copyright 1996-2000, 2001, 2003 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# Type1 driver directory\n#\nT1_DIR := $(SRC_DIR)/type1\n\n\n# compilation flags for the driver\n#\nT1_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T1_DIR))\n\n\n# Type1 driver sources (i.e., C files)\n#\nT1_DRV_SRC := $(T1_DIR)/t1parse.c  \\\n              $(T1_DIR)/t1load.c   \\\n              $(T1_DIR)/t1driver.c \\\n              $(T1_DIR)/t1afm.c    \\\n              $(T1_DIR)/t1gload.c  \\\n              $(T1_DIR)/t1objs.c\n\n# Type1 driver headers\n#\nT1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \\\n            $(T1_DIR)/t1tokens.h  \\\n            $(T1_DIR)/t1errors.h\n\n\n# Type1 driver object(s)\n#\n#   T1_DRV_OBJ_M is used during `multi' builds\n#   T1_DRV_OBJ_S is used during `single' builds\n#\nT1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O)\nT1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O\n\n# Type1 driver source file for single build\n#\nT1_DRV_SRC_S := $(T1_DIR)/type1.c\n\n\n# Type1 driver - single object\n#\n$(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H)\n\t$(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S))\n\n\n# Type1 driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H)\n\t$(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(T1_DRV_OBJ_S)\nDRV_OBJS_M += $(T1_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/type1/t1afm.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1afm.c                                                                */\n/*                                                                         */\n/*    AFM support for Type 1 fonts (body).                                 */\n/*                                                                         */\n/*  Copyright 1996-2011, 2013 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include \"t1afm.h\"\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n#include \"t1errors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1afm\n\n\n  FT_LOCAL_DEF( void )\n  T1_Done_Metrics( FT_Memory     memory,\n                   AFM_FontInfo  fi )\n  {\n    FT_FREE( fi->KernPairs );\n    fi->NumKernPair = 0;\n\n    FT_FREE( fi->TrackKerns );\n    fi->NumTrackKern = 0;\n\n    FT_FREE( fi );\n  }\n\n\n  /* read a glyph name and return the equivalent glyph index */\n  static FT_Int\n  t1_get_index( const char*  name,\n                FT_Offset    len,\n                void*        user_data )\n  {\n    T1_Font  type1 = (T1_Font)user_data;\n    FT_Int   n;\n\n\n    /* PS string/name length must be < 16-bit */\n    if ( len > 0xFFFFU )\n      return 0;\n\n    for ( n = 0; n < type1->num_glyphs; n++ )\n    {\n      char*  gname = (char*)type1->glyph_names[n];\n\n\n      if ( gname && gname[0] == name[0]        &&\n           ft_strlen( gname ) == len           &&\n           ft_strncmp( gname, name, len ) == 0 )\n        return n;\n    }\n\n    return 0;\n  }\n\n\n#undef  KERN_INDEX\n#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )\n\n\n  /* compare two kerning pairs */\n  FT_CALLBACK_DEF( int )\n  compare_kern_pairs( const void*  a,\n                      const void*  b )\n  {\n    AFM_KernPair  pair1 = (AFM_KernPair)a;\n    AFM_KernPair  pair2 = (AFM_KernPair)b;\n\n    FT_ULong  index1 = KERN_INDEX( pair1->index1, pair1->index2 );\n    FT_ULong  index2 = KERN_INDEX( pair2->index1, pair2->index2 );\n\n\n    if ( index1 > index2 )\n      return 1;\n    else if ( index1 < index2 )\n      return -1;\n    else\n      return 0;\n  }\n\n\n  /* parse a PFM file -- for now, only read the kerning pairs */\n  static FT_Error\n  T1_Read_PFM( FT_Face       t1_face,\n               FT_Stream     stream,\n               AFM_FontInfo  fi )\n  {\n    FT_Error      error  = FT_Err_Ok;\n    FT_Memory     memory = stream->memory;\n    FT_Byte*      start;\n    FT_Byte*      limit;\n    FT_Byte*      p;\n    AFM_KernPair  kp;\n    FT_Int        width_table_length;\n    FT_CharMap    oldcharmap;\n    FT_CharMap    charmap;\n    FT_Int        n;\n\n\n    start = (FT_Byte*)stream->cursor;\n    limit = (FT_Byte*)stream->limit;\n    p     = start;\n\n    /* Figure out how long the width table is.          */\n    /* This info is a little-endian short at offset 99. */\n    p = start + 99;\n    if ( p + 2 > limit )\n    {\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n    width_table_length = FT_PEEK_USHORT_LE( p );\n\n    p += 18 + width_table_length;\n    if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 )\n      /* extension table is probably optional */\n      goto Exit;\n\n    /* Kerning offset is 14 bytes from start of extensions table. */\n    p += 14;\n    p = start + FT_PEEK_ULONG_LE( p );\n\n    if ( p == start )\n      /* zero offset means no table */\n      goto Exit;\n\n    if ( p + 2 > limit )\n    {\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    fi->NumKernPair = FT_PEEK_USHORT_LE( p );\n    p += 2;\n    if ( p + 4 * fi->NumKernPair > limit )\n    {\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* Actually, kerning pairs are simply optional! */\n    if ( fi->NumKernPair == 0 )\n      goto Exit;\n\n    /* allocate the pairs */\n    if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )\n      goto Exit;\n\n    /* now, read each kern pair */\n    kp             = fi->KernPairs;\n    limit          = p + 4 * fi->NumKernPair;\n\n    /* PFM kerning data are stored by encoding rather than glyph index, */\n    /* so find the PostScript charmap of this font and install it       */\n    /* temporarily.  If we find no PostScript charmap, then just use    */\n    /* the default and hope it is the right one.                        */\n    oldcharmap = t1_face->charmap;\n    charmap    = NULL;\n\n    for ( n = 0; n < t1_face->num_charmaps; n++ )\n    {\n      charmap = t1_face->charmaps[n];\n      /* check against PostScript pseudo platform */\n      if ( charmap->platform_id == 7 )\n      {\n        error = FT_Set_Charmap( t1_face, charmap );\n        if ( error )\n          goto Exit;\n        break;\n      }\n    }\n\n    /* Kerning info is stored as:             */\n    /*                                        */\n    /*   encoding of first glyph (1 byte)     */\n    /*   encoding of second glyph (1 byte)    */\n    /*   offset (little-endian short)         */\n    for ( ; p < limit ; p += 4 )\n    {\n      kp->index1 = FT_Get_Char_Index( t1_face, p[0] );\n      kp->index2 = FT_Get_Char_Index( t1_face, p[1] );\n\n      kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2);\n      kp->y = 0;\n\n      kp++;\n    }\n\n    if ( oldcharmap != NULL )\n      error = FT_Set_Charmap( t1_face, oldcharmap );\n    if ( error )\n      goto Exit;\n\n    /* now, sort the kern pairs according to their glyph indices */\n    ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ),\n              compare_kern_pairs );\n\n  Exit:\n    if ( error )\n    {\n      FT_FREE( fi->KernPairs );\n      fi->NumKernPair = 0;\n    }\n\n    return error;\n  }\n\n\n  /* parse a metrics file -- either AFM or PFM depending on what */\n  /* it turns out to be                                          */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Read_Metrics( FT_Face    t1_face,\n                   FT_Stream  stream )\n  {\n    PSAux_Service  psaux;\n    FT_Memory      memory  = stream->memory;\n    AFM_ParserRec  parser;\n    AFM_FontInfo   fi      = NULL;\n    FT_Error       error   = FT_ERR( Unknown_File_Format );\n    T1_Font        t1_font = &( (T1_Face)t1_face )->type1;\n\n\n    if ( FT_NEW( fi )                   ||\n         FT_FRAME_ENTER( stream->size ) )\n      goto Exit;\n\n    fi->FontBBox  = t1_font->font_bbox;\n    fi->Ascender  = t1_font->font_bbox.yMax;\n    fi->Descender = t1_font->font_bbox.yMin;\n\n    psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux;\n    if ( psaux->afm_parser_funcs )\n    {\n      error = psaux->afm_parser_funcs->init( &parser,\n                                             stream->memory,\n                                             stream->cursor,\n                                             stream->limit );\n\n      if ( !error )\n      {\n        parser.FontInfo  = fi;\n        parser.get_index = t1_get_index;\n        parser.user_data = t1_font;\n\n        error = psaux->afm_parser_funcs->parse( &parser );\n        psaux->afm_parser_funcs->done( &parser );\n      }\n    }\n\n    if ( FT_ERR_EQ( error, Unknown_File_Format ) )\n    {\n      FT_Byte*  start = stream->cursor;\n\n\n      /* MS Windows allows versions up to 0x3FF without complaining */\n      if ( stream->size > 6                              &&\n           start[1] < 4                                  &&\n           FT_PEEK_ULONG_LE( start + 2 ) == stream->size )\n        error = T1_Read_PFM( t1_face, stream, fi );\n    }\n\n    if ( !error )\n    {\n      t1_font->font_bbox = fi->FontBBox;\n\n      t1_face->bbox.xMin =   fi->FontBBox.xMin            >> 16;\n      t1_face->bbox.yMin =   fi->FontBBox.yMin            >> 16;\n      /* no `U' suffix here to 0xFFFF! */\n      t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16;\n      t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16;\n\n      /* no `U' suffix here to 0x8000! */\n      t1_face->ascender  = (FT_Short)( ( fi->Ascender  + 0x8000 ) >> 16 );\n      t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 );\n\n      if ( fi->NumKernPair )\n      {\n        t1_face->face_flags |= FT_FACE_FLAG_KERNING;\n        ( (T1_Face)t1_face )->afm_data = fi;\n        fi = NULL;\n      }\n    }\n\n    FT_FRAME_EXIT();\n\n  Exit:\n    if ( fi != NULL )\n      T1_Done_Metrics( memory, fi );\n\n    return error;\n  }\n\n\n  /* find the kerning for a given glyph pair */\n  FT_LOCAL_DEF( void )\n  T1_Get_Kerning( AFM_FontInfo  fi,\n                  FT_UInt       glyph1,\n                  FT_UInt       glyph2,\n                  FT_Vector*    kerning )\n  {\n    AFM_KernPair  min, mid, max;\n    FT_ULong      idx = KERN_INDEX( glyph1, glyph2 );\n\n\n    /* simple binary search */\n    min = fi->KernPairs;\n    max = min + fi->NumKernPair - 1;\n\n    while ( min <= max )\n    {\n      FT_ULong  midi;\n\n\n      mid  = min + ( max - min ) / 2;\n      midi = KERN_INDEX( mid->index1, mid->index2 );\n\n      if ( midi == idx )\n      {\n        kerning->x = mid->x;\n        kerning->y = mid->y;\n\n        return;\n      }\n\n      if ( midi < idx )\n        min = mid + 1;\n      else\n        max = mid - 1;\n    }\n\n    kerning->x = 0;\n    kerning->y = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_Track_Kerning( FT_Face    face,\n                        FT_Fixed   ptsize,\n                        FT_Int     degree,\n                        FT_Fixed*  kerning )\n  {\n    AFM_FontInfo  fi = (AFM_FontInfo)( (T1_Face)face )->afm_data;\n    FT_Int        i;\n\n\n    if ( !fi )\n      return FT_THROW( Invalid_Argument );\n\n    for ( i = 0; i < fi->NumTrackKern; i++ )\n    {\n      AFM_TrackKern  tk = fi->TrackKerns + i;\n\n\n      if ( tk->degree != degree )\n        continue;\n\n      if ( ptsize < tk->min_ptsize )\n        *kerning = tk->min_kern;\n      else if ( ptsize > tk->max_ptsize )\n        *kerning = tk->max_kern;\n      else\n      {\n        *kerning = FT_MulDiv( ptsize - tk->min_ptsize,\n                              tk->max_kern - tk->min_kern,\n                              tk->max_ptsize - tk->min_ptsize ) +\n                   tk->min_kern;\n      }\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1afm.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1afm.h                                                                */\n/*                                                                         */\n/*    AFM support for Type 1 fonts (specification).                        */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2006 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1AFM_H__\n#define __T1AFM_H__\n\n#include <ft2build.h>\n#include \"t1objs.h\"\n#include FT_INTERNAL_TYPE1_TYPES_H\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  T1_Read_Metrics( FT_Face    face,\n                   FT_Stream  stream );\n\n  FT_LOCAL( void )\n  T1_Done_Metrics( FT_Memory     memory,\n                   AFM_FontInfo  fi );\n\n  FT_LOCAL( void )\n  T1_Get_Kerning( AFM_FontInfo  fi,\n                  FT_UInt       glyph1,\n                  FT_UInt       glyph2,\n                  FT_Vector*    kerning );\n\n  FT_LOCAL( FT_Error )\n  T1_Get_Track_Kerning( FT_Face    face,\n                        FT_Fixed   ptsize,\n                        FT_Int     degree,\n                        FT_Fixed*  kerning );\n\nFT_END_HEADER\n\n#endif /* __T1AFM_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1driver.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1driver.c                                                             */\n/*                                                                         */\n/*    Type 1 driver interface (body).                                      */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006, 2007, 2009, 2011, 2013 by                   */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include \"t1driver.h\"\n#include \"t1gload.h\"\n#include \"t1load.h\"\n\n#include \"t1errors.h\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"t1afm.h\"\n#endif\n\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n\n#include FT_SERVICE_MULTIPLE_MASTERS_H\n#include FT_SERVICE_GLYPH_DICT_H\n#include FT_SERVICE_XFREE86_NAME_H\n#include FT_SERVICE_POSTSCRIPT_NAME_H\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n#include FT_SERVICE_POSTSCRIPT_INFO_H\n#include FT_SERVICE_KERNING_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1driver\n\n /*\n  *  GLYPH DICT SERVICE\n  *\n  */\n\n  static FT_Error\n  t1_get_glyph_name( T1_Face     face,\n                     FT_UInt     glyph_index,\n                     FT_Pointer  buffer,\n                     FT_UInt     buffer_max )\n  {\n    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_UInt\n  t1_get_name_index( T1_Face     face,\n                     FT_String*  glyph_name )\n  {\n    FT_Int      i;\n    FT_String*  gname;\n\n\n    for ( i = 0; i < face->type1.num_glyphs; i++ )\n    {\n      gname = face->type1.glyph_names[i];\n\n      if ( !ft_strcmp( glyph_name, gname ) )\n        return (FT_UInt)i;\n    }\n\n    return 0;\n  }\n\n\n  static const FT_Service_GlyphDictRec  t1_service_glyph_dict =\n  {\n    (FT_GlyphDict_GetNameFunc)  t1_get_glyph_name,\n    (FT_GlyphDict_NameIndexFunc)t1_get_name_index\n  };\n\n\n  /*\n   *  POSTSCRIPT NAME SERVICE\n   *\n   */\n\n  static const char*\n  t1_get_ps_name( T1_Face  face )\n  {\n    return (const char*) face->type1.font_name;\n  }\n\n\n  static const FT_Service_PsFontNameRec  t1_service_ps_name =\n  {\n    (FT_PsName_GetFunc)t1_get_ps_name\n  };\n\n\n  /*\n   *  MULTIPLE MASTERS SERVICE\n   *\n   */\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n  static const FT_Service_MultiMastersRec  t1_service_multi_masters =\n  {\n    (FT_Get_MM_Func)        T1_Get_Multi_Master,\n    (FT_Set_MM_Design_Func) T1_Set_MM_Design,\n    (FT_Set_MM_Blend_Func)  T1_Set_MM_Blend,\n    (FT_Get_MM_Var_Func)    T1_Get_MM_Var,\n    (FT_Set_Var_Design_Func)T1_Set_Var_Design\n  };\n#endif\n\n\n  /*\n   *  POSTSCRIPT INFO SERVICE\n   *\n   */\n\n  static FT_Error\n  t1_ps_get_font_info( FT_Face          face,\n                       PS_FontInfoRec*  afont_info )\n  {\n    *afont_info = ((T1_Face)face)->type1.font_info;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  t1_ps_get_font_extra( FT_Face           face,\n                        PS_FontExtraRec*  afont_extra )\n  {\n    *afont_extra = ((T1_Face)face)->type1.font_extra;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Int\n  t1_ps_has_glyph_names( FT_Face  face )\n  {\n    FT_UNUSED( face );\n\n    return 1;\n  }\n\n\n  static FT_Error\n  t1_ps_get_font_private( FT_Face         face,\n                          PS_PrivateRec*  afont_private )\n  {\n    *afont_private = ((T1_Face)face)->type1.private_dict;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Long\n  t1_ps_get_font_value( FT_Face       face,\n                        PS_Dict_Keys  key,\n                        FT_UInt       idx,\n                        void         *value,\n                        FT_Long       value_len )\n  {\n    FT_Long  retval = -1;\n    T1_Face  t1face = (T1_Face)face;\n    T1_Font  type1  = &t1face->type1;\n\n\n    switch ( key )\n    {\n    case PS_DICT_FONT_TYPE:\n      retval = sizeof ( type1->font_type );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->font_type;\n      break;\n\n    case PS_DICT_FONT_MATRIX:\n      if ( idx < sizeof ( type1->font_matrix ) /\n                   sizeof ( type1->font_matrix.xx ) )\n      {\n        FT_Fixed  val = 0;\n\n\n        retval = sizeof ( val );\n        if ( value && value_len >= retval )\n        {\n          switch ( idx )\n          {\n          case 0:\n            val = type1->font_matrix.xx;\n            break;\n          case 1:\n            val = type1->font_matrix.xy;\n            break;\n          case 2:\n            val = type1->font_matrix.yx;\n            break;\n          case 3:\n            val = type1->font_matrix.yy;\n            break;\n          }\n          *((FT_Fixed *)value) = val;\n        }\n      }\n      break;\n\n    case PS_DICT_FONT_BBOX:\n      if ( idx < sizeof ( type1->font_bbox ) /\n                   sizeof ( type1->font_bbox.xMin ) )\n      {\n        FT_Fixed val = 0;\n\n\n        retval = sizeof ( val );\n        if ( value && value_len >= retval )\n        {\n          switch ( idx )\n          {\n          case 0:\n            val = type1->font_bbox.xMin;\n            break;\n          case 1:\n            val = type1->font_bbox.yMin;\n            break;\n          case 2:\n            val = type1->font_bbox.xMax;\n            break;\n          case 3:\n            val = type1->font_bbox.yMax;\n            break;\n          }\n          *((FT_Fixed *)value) = val;\n        }\n      }\n      break;\n\n    case PS_DICT_PAINT_TYPE:\n      retval = sizeof ( type1->paint_type );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->paint_type;\n      break;\n\n    case PS_DICT_FONT_NAME:\n      retval = ft_strlen( type1->font_name ) + 1;\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_name ), retval );\n      break;\n\n    case PS_DICT_UNIQUE_ID:\n      retval = sizeof ( type1->private_dict.unique_id );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->private_dict.unique_id;\n      break;\n\n    case PS_DICT_NUM_CHAR_STRINGS:\n      retval = sizeof ( type1->num_glyphs );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->num_glyphs;\n      break;\n\n    case PS_DICT_CHAR_STRING_KEY:\n      if ( idx < (FT_UInt)type1->num_glyphs )\n      {\n        retval = ft_strlen( type1->glyph_names[idx] ) + 1;\n        if ( value && value_len >= retval )\n        {\n          ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval );\n          ((FT_Char *)value)[retval - 1] = (FT_Char)'\\0';\n        }\n      }\n      break;\n\n    case PS_DICT_CHAR_STRING:\n      if ( idx < (FT_UInt)type1->num_glyphs )\n      {\n        retval = type1->charstrings_len[idx] + 1;\n        if ( value && value_len >= retval )\n        {\n          ft_memcpy( value, (void *)( type1->charstrings[idx] ),\n                     retval - 1 );\n          ((FT_Char *)value)[retval - 1] = (FT_Char)'\\0';\n        }\n      }\n      break;\n\n    case PS_DICT_ENCODING_TYPE:\n      retval = sizeof ( type1->encoding_type );\n      if ( value && value_len >= retval )\n        *((T1_EncodingType *)value) = type1->encoding_type;\n      break;\n\n    case PS_DICT_ENCODING_ENTRY:\n      if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY &&\n           idx < (FT_UInt)type1->encoding.num_chars       )\n      {\n        retval = ft_strlen( type1->encoding.char_name[idx] ) + 1;\n        if ( value && value_len >= retval )\n        {\n          ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ),\n                     retval - 1 );\n          ((FT_Char *)value)[retval - 1] = (FT_Char)'\\0';\n        }\n      }\n      break;\n\n    case PS_DICT_NUM_SUBRS:\n      retval = sizeof ( type1->num_subrs );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->num_subrs;\n      break;\n\n    case PS_DICT_SUBR:\n      if ( idx < (FT_UInt)type1->num_subrs )\n      {\n        retval = type1->subrs_len[idx] + 1;\n        if ( value && value_len >= retval )\n        {\n          ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );\n          ((FT_Char *)value)[retval - 1] = (FT_Char)'\\0';\n        }\n      }\n      break;\n\n    case PS_DICT_STD_HW:\n      retval = sizeof ( type1->private_dict.standard_width[0] );\n      if ( value && value_len >= retval )\n        *((FT_UShort *)value) = type1->private_dict.standard_width[0];\n      break;\n\n    case PS_DICT_STD_VW:\n      retval = sizeof ( type1->private_dict.standard_height[0] );\n      if ( value && value_len >= retval )\n        *((FT_UShort *)value) = type1->private_dict.standard_height[0];\n      break;\n\n    case PS_DICT_NUM_BLUE_VALUES:\n      retval = sizeof ( type1->private_dict.num_blue_values );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_blue_values;\n      break;\n\n    case PS_DICT_BLUE_VALUE:\n      if ( idx < type1->private_dict.num_blue_values )\n      {\n        retval = sizeof ( type1->private_dict.blue_values[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.blue_values[idx];\n      }\n      break;\n\n    case PS_DICT_BLUE_SCALE:\n      retval = sizeof ( type1->private_dict.blue_scale );\n      if ( value && value_len >= retval )\n        *((FT_Fixed *)value) = type1->private_dict.blue_scale;\n      break;\n\n    case PS_DICT_BLUE_FUZZ:\n      retval = sizeof ( type1->private_dict.blue_fuzz );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->private_dict.blue_fuzz;\n      break;\n\n    case PS_DICT_BLUE_SHIFT:\n      retval = sizeof ( type1->private_dict.blue_shift );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->private_dict.blue_shift;\n      break;\n\n    case PS_DICT_NUM_OTHER_BLUES:\n      retval = sizeof ( type1->private_dict.num_other_blues );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_other_blues;\n      break;\n\n    case PS_DICT_OTHER_BLUE:\n      if ( idx < type1->private_dict.num_other_blues )\n      {\n        retval = sizeof ( type1->private_dict.other_blues[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.other_blues[idx];\n      }\n      break;\n\n    case PS_DICT_NUM_FAMILY_BLUES:\n      retval = sizeof ( type1->private_dict.num_family_blues );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_family_blues;\n      break;\n\n    case PS_DICT_FAMILY_BLUE:\n      if ( idx < type1->private_dict.num_family_blues )\n      {\n        retval = sizeof ( type1->private_dict.family_blues[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.family_blues[idx];\n      }\n      break;\n\n    case PS_DICT_NUM_FAMILY_OTHER_BLUES:\n      retval = sizeof ( type1->private_dict.num_family_other_blues );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_family_other_blues;\n      break;\n\n    case PS_DICT_FAMILY_OTHER_BLUE:\n      if ( idx < type1->private_dict.num_family_other_blues )\n      {\n        retval = sizeof ( type1->private_dict.family_other_blues[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.family_other_blues[idx];\n      }\n      break;\n\n    case PS_DICT_NUM_STEM_SNAP_H:\n      retval = sizeof ( type1->private_dict.num_snap_widths );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_snap_widths;\n      break;\n\n    case PS_DICT_STEM_SNAP_H:\n      if ( idx < type1->private_dict.num_snap_widths )\n      {\n        retval = sizeof ( type1->private_dict.snap_widths[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.snap_widths[idx];\n      }\n      break;\n\n    case PS_DICT_NUM_STEM_SNAP_V:\n      retval = sizeof ( type1->private_dict.num_snap_heights );\n      if ( value && value_len >= retval )\n        *((FT_Byte *)value) = type1->private_dict.num_snap_heights;\n      break;\n\n    case PS_DICT_STEM_SNAP_V:\n      if ( idx < type1->private_dict.num_snap_heights )\n      {\n        retval = sizeof ( type1->private_dict.snap_heights[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.snap_heights[idx];\n      }\n      break;\n\n    case PS_DICT_RND_STEM_UP:\n      retval = sizeof ( type1->private_dict.round_stem_up );\n      if ( value && value_len >= retval )\n        *((FT_Bool *)value) = type1->private_dict.round_stem_up;\n      break;\n\n    case PS_DICT_FORCE_BOLD:\n      retval = sizeof ( type1->private_dict.force_bold );\n      if ( value && value_len >= retval )\n        *((FT_Bool *)value) = type1->private_dict.force_bold;\n      break;\n\n    case PS_DICT_MIN_FEATURE:\n      if ( idx < sizeof ( type1->private_dict.min_feature ) /\n                   sizeof ( type1->private_dict.min_feature[0] ) )\n      {\n        retval = sizeof ( type1->private_dict.min_feature[idx] );\n        if ( value && value_len >= retval )\n          *((FT_Short *)value) = type1->private_dict.min_feature[idx];\n      }\n      break;\n\n    case PS_DICT_LEN_IV:\n      retval = sizeof ( type1->private_dict.lenIV );\n      if ( value && value_len >= retval )\n        *((FT_Int *)value) = type1->private_dict.lenIV;\n      break;\n\n    case PS_DICT_PASSWORD:\n      retval = sizeof ( type1->private_dict.password );\n      if ( value && value_len >= retval )\n        *((FT_Long *)value) = type1->private_dict.password;\n      break;\n\n    case PS_DICT_LANGUAGE_GROUP:\n      retval = sizeof ( type1->private_dict.language_group );\n      if ( value && value_len >= retval )\n        *((FT_Long *)value) = type1->private_dict.language_group;\n      break;\n\n    case PS_DICT_IS_FIXED_PITCH:\n      retval = sizeof ( type1->font_info.is_fixed_pitch );\n      if ( value && value_len >= retval )\n        *((FT_Bool *)value) = type1->font_info.is_fixed_pitch;\n      break;\n\n    case PS_DICT_UNDERLINE_POSITION:\n      retval = sizeof ( type1->font_info.underline_position );\n      if ( value && value_len >= retval )\n        *((FT_Short *)value) = type1->font_info.underline_position;\n      break;\n\n    case PS_DICT_UNDERLINE_THICKNESS:\n      retval = sizeof ( type1->font_info.underline_thickness );\n      if ( value && value_len >= retval )\n        *((FT_UShort *)value) = type1->font_info.underline_thickness;\n      break;\n\n    case PS_DICT_FS_TYPE:\n      retval = sizeof ( type1->font_extra.fs_type );\n      if ( value && value_len >= retval )\n        *((FT_UShort *)value) = type1->font_extra.fs_type;\n      break;\n\n    case PS_DICT_VERSION:\n      retval = ft_strlen( type1->font_info.version ) + 1;\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.version ), retval );\n      break;\n\n    case PS_DICT_NOTICE:\n      retval = ft_strlen( type1->font_info.notice ) + 1;\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.notice ), retval );\n      break;\n\n    case PS_DICT_FULL_NAME:\n      retval = ft_strlen( type1->font_info.full_name ) + 1;\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.full_name ), retval );\n      break;\n\n    case PS_DICT_FAMILY_NAME:\n      retval = ft_strlen( type1->font_info.family_name ) + 1;\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.family_name ), retval );\n      break;\n\n    case PS_DICT_WEIGHT:\n      retval = ft_strlen( type1->font_info.weight ) + 1;\n      if ( value && value_len >= retval )\n        ft_memcpy( value, (void *)( type1->font_info.weight ), retval );\n      break;\n\n    case PS_DICT_ITALIC_ANGLE:\n      retval = sizeof ( type1->font_info.italic_angle );\n      if ( value && value_len >= retval )\n        *((FT_Long *)value) = type1->font_info.italic_angle;\n      break;\n\n    default:\n      break;\n    }\n\n    return retval;\n  }\n\n\n  static const FT_Service_PsInfoRec  t1_service_ps_info =\n  {\n    (PS_GetFontInfoFunc)   t1_ps_get_font_info,\n    (PS_GetFontExtraFunc)  t1_ps_get_font_extra,\n    (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,\n    (PS_GetFontPrivateFunc)t1_ps_get_font_private,\n    (PS_GetFontValueFunc)  t1_ps_get_font_value,\n  };\n\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n  static const FT_Service_KerningRec  t1_service_kerning =\n  {\n    T1_Get_Track_Kerning,\n  };\n#endif\n\n\n  /*\n   *  SERVICE LIST\n   *\n   */\n\n  static const FT_ServiceDescRec  t1_services[] =\n  {\n    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },\n    { FT_SERVICE_ID_GLYPH_DICT,           &t1_service_glyph_dict },\n    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_TYPE_1 },\n    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t1_service_ps_info },\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n    { FT_SERVICE_ID_KERNING,              &t1_service_kerning },\n#endif\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n    { FT_SERVICE_ID_MULTI_MASTERS,        &t1_service_multi_masters },\n#endif\n    { NULL, NULL }\n  };\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  Get_Interface( FT_Module         module,\n                 const FT_String*  t1_interface )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( t1_services, t1_interface );\n  }\n\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    Get_Kerning                                                        */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A driver method used to return the kerning vector between two      */\n  /*    glyphs of the same face.                                           */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face        :: A handle to the source face object.                 */\n  /*                                                                       */\n  /*    left_glyph  :: The index of the left glyph in the kern pair.       */\n  /*                                                                       */\n  /*    right_glyph :: The index of the right glyph in the kern pair.      */\n  /*                                                                       */\n  /* <Output>                                                              */\n  /*    kerning     :: The kerning vector.  This is in font units for      */\n  /*                   scalable formats, and in pixels for fixed-sizes     */\n  /*                   formats.                                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    Only horizontal layouts (left-to-right & right-to-left) are        */\n  /*    supported by this function.  Other layouts, or more sophisticated  */\n  /*    kernings are out of scope of this method (the basic driver         */\n  /*    interface is meant to be simple).                                  */\n  /*                                                                       */\n  /*    They can be implemented by format-specific interfaces.             */\n  /*                                                                       */\n  static FT_Error\n  Get_Kerning( FT_Face     t1face,        /* T1_Face */\n               FT_UInt     left_glyph,\n               FT_UInt     right_glyph,\n               FT_Vector*  kerning )\n  {\n    T1_Face  face = (T1_Face)t1face;\n\n\n    kerning->x = 0;\n    kerning->y = 0;\n\n    if ( face->afm_data )\n      T1_Get_Kerning( (AFM_FontInfo)face->afm_data,\n                      left_glyph,\n                      right_glyph,\n                      kerning );\n\n    return FT_Err_Ok;\n  }\n\n\n#endif /* T1_CONFIG_OPTION_NO_AFM */\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Driver_ClassRec  t1_driver_class =\n  {\n    {\n      FT_MODULE_FONT_DRIVER       |\n      FT_MODULE_DRIVER_SCALABLE   |\n      FT_MODULE_DRIVER_HAS_HINTER,\n\n      sizeof ( FT_DriverRec ),\n\n      \"type1\",\n      0x10000L,\n      0x20000L,\n\n      0,   /* format interface */\n\n      T1_Driver_Init,\n      T1_Driver_Done,\n      Get_Interface,\n    },\n\n    sizeof ( T1_FaceRec ),\n    sizeof ( T1_SizeRec ),\n    sizeof ( T1_GlyphSlotRec ),\n\n    T1_Face_Init,\n    T1_Face_Done,\n    T1_Size_Init,\n    T1_Size_Done,\n    T1_GlyphSlot_Init,\n    T1_GlyphSlot_Done,\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    ft_stub_set_char_sizes,\n    ft_stub_set_pixel_sizes,\n#endif\n    T1_Load_Glyph,\n\n#ifdef T1_CONFIG_OPTION_NO_AFM\n    0,                     /* FT_Face_GetKerningFunc */\n    0,                     /* FT_Face_AttachFunc     */\n#else\n    Get_Kerning,\n    T1_Read_Metrics,\n#endif\n    T1_Get_Advances,\n    T1_Size_Request,\n    0                      /* FT_Size_SelectFunc     */\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1driver.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1driver.h                                                             */\n/*                                                                         */\n/*    High-level Type 1 driver interface (specification).                  */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002 by                                           */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1DRIVER_H__\n#define __T1DRIVER_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_EXPORT_VAR( const FT_Driver_ClassRec )  t1_driver_class;\n\n\nFT_END_HEADER\n\n#endif /* __T1DRIVER_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1errors.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1errors.h                                                             */\n/*                                                                         */\n/*    Type 1 error codes (specification only).                             */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the Type 1 error enumeration constants.   */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __T1ERRORS_H__\n#define __T1ERRORS_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  T1_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Type1\n\n#include FT_ERRORS_H\n\n#endif /* __T1ERRORS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1gload.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1gload.c                                                              */\n/*                                                                         */\n/*    Type 1 Glyph Loader (body).                                          */\n/*                                                                         */\n/*  Copyright 1996-2006, 2008-2010, 2013 by                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include \"t1gload.h\"\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_OUTLINE_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n#include \"t1errors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1gload\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /**********                                                      *********/\n  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/\n  /**********                                                      *********/\n  /**********    The following code is in charge of computing      *********/\n  /**********    the maximum advance width of the font.  It        *********/\n  /**********    quickly processes each glyph charstring to        *********/\n  /**********    extract the value from either a `sbw' or `seac'   *********/\n  /**********    operator.                                         *********/\n  /**********                                                      *********/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Parse_Glyph_And_Get_Char_String( T1_Decoder  decoder,\n                                      FT_UInt     glyph_index,\n                                      FT_Data*    char_string )\n  {\n    T1_Face   face  = (T1_Face)decoder->builder.face;\n    T1_Font   type1 = &face->type1;\n    FT_Error  error = FT_Err_Ok;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_Incremental_InterfaceRec *inc =\n                      face->root.internal->incremental_interface;\n#endif\n\n\n    decoder->font_matrix = type1->font_matrix;\n    decoder->font_offset = type1->font_offset;\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* For incremental fonts get the character data using the */\n    /* callback function.                                     */\n    if ( inc )\n      error = inc->funcs->get_glyph_data( inc->object,\n                                          glyph_index, char_string );\n    else\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    /* For ordinary fonts get the character data stored in the face record. */\n    {\n      char_string->pointer = type1->charstrings[glyph_index];\n      char_string->length  = (FT_Int)type1->charstrings_len[glyph_index];\n    }\n\n    if ( !error )\n      error = decoder->funcs.parse_charstrings(\n                decoder, (FT_Byte*)char_string->pointer,\n                char_string->length );\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    /* Incremental fonts can optionally override the metrics. */\n    if ( !error && inc && inc->funcs->get_glyph_metrics )\n    {\n      FT_Incremental_MetricsRec  metrics;\n\n\n      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );\n      metrics.bearing_y = 0;\n      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );\n      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );\n\n      error = inc->funcs->get_glyph_metrics( inc->object,\n                                             glyph_index, FALSE, &metrics );\n\n      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );\n      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );\n      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );\n    }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    return error;\n  }\n\n\n  FT_CALLBACK_DEF( FT_Error )\n  T1_Parse_Glyph( T1_Decoder  decoder,\n                  FT_UInt     glyph_index )\n  {\n    FT_Data   glyph_data;\n    FT_Error  error = T1_Parse_Glyph_And_Get_Char_String(\n                        decoder, glyph_index, &glyph_data );\n\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n\n    if ( !error )\n    {\n      T1_Face  face = (T1_Face)decoder->builder.face;\n\n\n      if ( face->root.internal->incremental_interface )\n        face->root.internal->incremental_interface->funcs->free_glyph_data(\n          face->root.internal->incremental_interface->object,\n          &glyph_data );\n    }\n\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Compute_Max_Advance( T1_Face  face,\n                          FT_Pos*  max_advance )\n  {\n    FT_Error       error;\n    T1_DecoderRec  decoder;\n    FT_Int         glyph_index;\n    T1_Font        type1 = &face->type1;\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );\n\n    *max_advance = 0;\n\n    /* initialize load decoder */\n    error = psaux->t1_decoder_funcs->init( &decoder,\n                                           (FT_Face)face,\n                                           0, /* size       */\n                                           0, /* glyph slot */\n                                           (FT_Byte**)type1->glyph_names,\n                                           face->blend,\n                                           0,\n                                           FT_RENDER_MODE_NORMAL,\n                                           T1_Parse_Glyph );\n    if ( error )\n      return error;\n\n    decoder.builder.metrics_only = 1;\n    decoder.builder.load_points  = 0;\n\n    decoder.num_subrs     = type1->num_subrs;\n    decoder.subrs         = type1->subrs;\n    decoder.subrs_len     = type1->subrs_len;\n\n    decoder.buildchar     = face->buildchar;\n    decoder.len_buildchar = face->len_buildchar;\n\n    *max_advance = 0;\n\n    /* for each glyph, parse the glyph charstring and extract */\n    /* the advance width                                      */\n    for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ )\n    {\n      /* now get load the unscaled outline */\n      error = T1_Parse_Glyph( &decoder, glyph_index );\n      if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance )\n        *max_advance = decoder.builder.advance.x;\n\n      /* ignore the error if one occurred - skip to next glyph */\n    }\n\n    psaux->t1_decoder_funcs->done( &decoder );\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_Advances( FT_Face    t1face,        /* T1_Face */\n                   FT_UInt    first,\n                   FT_UInt    count,\n                   FT_Int32   load_flags,\n                   FT_Fixed*  advances )\n  {\n    T1_Face        face  = (T1_Face)t1face;\n    T1_DecoderRec  decoder;\n    T1_Font        type1 = &face->type1;\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n    FT_UInt        nn;\n    FT_Error       error;\n\n\n    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n    {\n      for ( nn = 0; nn < count; nn++ )\n        advances[nn] = 0;\n\n      return FT_Err_Ok;\n    }\n\n    error = psaux->t1_decoder_funcs->init( &decoder,\n                                           (FT_Face)face,\n                                           0, /* size       */\n                                           0, /* glyph slot */\n                                           (FT_Byte**)type1->glyph_names,\n                                           face->blend,\n                                           0,\n                                           FT_RENDER_MODE_NORMAL,\n                                           T1_Parse_Glyph );\n    if ( error )\n      return error;\n\n    decoder.builder.metrics_only = 1;\n    decoder.builder.load_points  = 0;\n\n    decoder.num_subrs = type1->num_subrs;\n    decoder.subrs     = type1->subrs;\n    decoder.subrs_len = type1->subrs_len;\n\n    decoder.buildchar     = face->buildchar;\n    decoder.len_buildchar = face->len_buildchar;\n\n    for ( nn = 0; nn < count; nn++ )\n    {\n      error = T1_Parse_Glyph( &decoder, first + nn );\n      if ( !error )\n        advances[nn] = FIXED_TO_INT( decoder.builder.advance.x );\n      else\n        advances[nn] = 0;\n    }\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Load_Glyph( FT_GlyphSlot  t1glyph,          /* T1_GlyphSlot */\n                 FT_Size       t1size,           /* T1_Size      */\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags )\n  {\n    T1_GlyphSlot            glyph = (T1_GlyphSlot)t1glyph;\n    FT_Error                error;\n    T1_DecoderRec           decoder;\n    T1_Face                 face = (T1_Face)t1glyph->face;\n    FT_Bool                 hinting;\n    T1_Font                 type1         = &face->type1;\n    PSAux_Service           psaux         = (PSAux_Service)face->psaux;\n    const T1_Decoder_Funcs  decoder_funcs = psaux->t1_decoder_funcs;\n\n    FT_Matrix               font_matrix;\n    FT_Vector               font_offset;\n    FT_Data                 glyph_data;\n    FT_Bool                 must_finish_decoder = FALSE;\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    FT_Bool                 glyph_data_loaded = 0;\n#endif\n\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( glyph_index >= (FT_UInt)face->root.num_glyphs &&\n         !face->root.internal->incremental_interface   )\n#else\n    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )\n#endif /* FT_CONFIG_OPTION_INCREMENTAL */\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );\n\n    if ( load_flags & FT_LOAD_NO_RECURSE )\n      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;\n\n    if ( t1size )\n    {\n      glyph->x_scale = t1size->metrics.x_scale;\n      glyph->y_scale = t1size->metrics.y_scale;\n    }\n    else\n    {\n      glyph->x_scale = 0x10000L;\n      glyph->y_scale = 0x10000L;\n    }\n\n    t1glyph->outline.n_points   = 0;\n    t1glyph->outline.n_contours = 0;\n\n    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&\n                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );\n\n    t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;\n\n    error = decoder_funcs->init( &decoder,\n                                 t1glyph->face,\n                                 t1size,\n                                 t1glyph,\n                                 (FT_Byte**)type1->glyph_names,\n                                 face->blend,\n                                 FT_BOOL( hinting ),\n                                 FT_LOAD_TARGET_MODE( load_flags ),\n                                 T1_Parse_Glyph );\n    if ( error )\n      goto Exit;\n\n    must_finish_decoder = TRUE;\n\n    decoder.builder.no_recurse = FT_BOOL(\n                                   ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );\n\n    decoder.num_subrs     = type1->num_subrs;\n    decoder.subrs         = type1->subrs;\n    decoder.subrs_len     = type1->subrs_len;\n\n    decoder.buildchar     = face->buildchar;\n    decoder.len_buildchar = face->len_buildchar;\n\n    /* now load the unscaled outline */\n    error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index,\n                                                &glyph_data );\n    if ( error )\n      goto Exit;\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    glyph_data_loaded = 1;\n#endif\n\n    font_matrix = decoder.font_matrix;\n    font_offset = decoder.font_offset;\n\n    /* save new glyph tables */\n    decoder_funcs->done( &decoder );\n\n    must_finish_decoder = FALSE;\n\n    /* now, set the metrics -- this is rather simple, as   */\n    /* the left side bearing is the xMin, and the top side */\n    /* bearing the yMax                                    */\n    if ( !error )\n    {\n      t1glyph->outline.flags &= FT_OUTLINE_OWNER;\n      t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;\n\n      /* for composite glyphs, return only left side bearing and */\n      /* advance width                                           */\n      if ( load_flags & FT_LOAD_NO_RECURSE )\n      {\n        FT_Slot_Internal  internal = t1glyph->internal;\n\n\n        t1glyph->metrics.horiBearingX =\n          FIXED_TO_INT( decoder.builder.left_bearing.x );\n        t1glyph->metrics.horiAdvance  =\n          FIXED_TO_INT( decoder.builder.advance.x );\n\n        internal->glyph_matrix      = font_matrix;\n        internal->glyph_delta       = font_offset;\n        internal->glyph_transformed = 1;\n      }\n      else\n      {\n        FT_BBox            cbox;\n        FT_Glyph_Metrics*  metrics = &t1glyph->metrics;\n        FT_Vector          advance;\n\n\n        /* copy the _unscaled_ advance width */\n        metrics->horiAdvance =\n          FIXED_TO_INT( decoder.builder.advance.x );\n        t1glyph->linearHoriAdvance =\n          FIXED_TO_INT( decoder.builder.advance.x );\n        t1glyph->internal->glyph_transformed = 0;\n\n        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n        {\n          /* make up vertical ones */\n          metrics->vertAdvance = ( face->type1.font_bbox.yMax -\n                                   face->type1.font_bbox.yMin ) >> 16;\n          t1glyph->linearVertAdvance = metrics->vertAdvance;\n        }\n        else\n        {\n          metrics->vertAdvance =\n            FIXED_TO_INT( decoder.builder.advance.y );\n          t1glyph->linearVertAdvance =\n            FIXED_TO_INT( decoder.builder.advance.y );\n        }\n\n        t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;\n\n        if ( t1size && t1size->metrics.y_ppem < 24 )\n          t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;\n\n#if 1\n        /* apply the font matrix, if any */\n        if ( font_matrix.xx != 0x10000L || font_matrix.yy != font_matrix.xx ||\n             font_matrix.xy != 0        || font_matrix.yx != 0              )\n          FT_Outline_Transform( &t1glyph->outline, &font_matrix );\n\n        if ( font_offset.x || font_offset.y )\n          FT_Outline_Translate( &t1glyph->outline,\n                                font_offset.x,\n                                font_offset.y );\n\n        advance.x = metrics->horiAdvance;\n        advance.y = 0;\n        FT_Vector_Transform( &advance, &font_matrix );\n        metrics->horiAdvance = advance.x + font_offset.x;\n        advance.x = 0;\n        advance.y = metrics->vertAdvance;\n        FT_Vector_Transform( &advance, &font_matrix );\n        metrics->vertAdvance = advance.y + font_offset.y;\n#endif\n\n        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )\n        {\n          /* scale the outline and the metrics */\n          FT_Int       n;\n          FT_Outline*  cur = decoder.builder.base;\n          FT_Vector*   vec = cur->points;\n          FT_Fixed     x_scale = glyph->x_scale;\n          FT_Fixed     y_scale = glyph->y_scale;\n\n\n          /* First of all, scale the points, if we are not hinting */\n          if ( !hinting || ! decoder.builder.hints_funcs )\n            for ( n = cur->n_points; n > 0; n--, vec++ )\n            {\n              vec->x = FT_MulFix( vec->x, x_scale );\n              vec->y = FT_MulFix( vec->y, y_scale );\n            }\n\n          /* Then scale the metrics */\n          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );\n          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );\n        }\n\n        /* compute the other metrics */\n        FT_Outline_Get_CBox( &t1glyph->outline, &cbox );\n\n        metrics->width  = cbox.xMax - cbox.xMin;\n        metrics->height = cbox.yMax - cbox.yMin;\n\n        metrics->horiBearingX = cbox.xMin;\n        metrics->horiBearingY = cbox.yMax;\n\n        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )\n        {\n          /* make up vertical ones */\n          ft_synthesize_vertical_metrics( metrics,\n                                          metrics->vertAdvance );\n        }\n      }\n\n      /* Set control data to the glyph charstrings.  Note that this is */\n      /* _not_ zero-terminated.                                        */\n      t1glyph->control_data = (FT_Byte*)glyph_data.pointer;\n      t1glyph->control_len  = glyph_data.length;\n    }\n\n\n  Exit:\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n    if ( glyph_data_loaded && face->root.internal->incremental_interface )\n    {\n      face->root.internal->incremental_interface->funcs->free_glyph_data(\n        face->root.internal->incremental_interface->object,\n        &glyph_data );\n\n      /* Set the control data to null - it is no longer available if   */\n      /* loaded incrementally.                                         */\n      t1glyph->control_data = 0;\n      t1glyph->control_len  = 0;\n    }\n#endif\n\n    if ( must_finish_decoder )\n      decoder_funcs->done( &decoder );\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1gload.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1gload.h                                                              */\n/*                                                                         */\n/*    Type 1 Glyph Loader (specification).                                 */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2008, 2011 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1GLOAD_H__\n#define __T1GLOAD_H__\n\n\n#include <ft2build.h>\n#include \"t1objs.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  FT_LOCAL( FT_Error )\n  T1_Compute_Max_Advance( T1_Face  face,\n                          FT_Pos*  max_advance );\n\n  FT_LOCAL( FT_Error )\n  T1_Get_Advances( FT_Face    face,\n                   FT_UInt    first,\n                   FT_UInt    count,\n                   FT_Int32   load_flags,\n                   FT_Fixed*  advances );\n\n  FT_LOCAL( FT_Error )\n  T1_Load_Glyph( FT_GlyphSlot  glyph,\n                 FT_Size       size,\n                 FT_UInt       glyph_index,\n                 FT_Int32      load_flags );\n\n\nFT_END_HEADER\n\n#endif /* __T1GLOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1load.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1load.c                                                               */\n/*                                                                         */\n/*    Type 1 font loader (body).                                           */\n/*                                                                         */\n/*  Copyright 1996-2013 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This is the new and improved Type 1 data loader for FreeType 2.  The  */\n  /* old loader has several problems: it is slow, complex, difficult to    */\n  /* maintain, and contains incredible hacks to make it accept some        */\n  /* ill-formed Type 1 fonts without hiccup-ing.  Moreover, about 5% of    */\n  /* the Type 1 fonts on my machine still aren't loaded correctly by it.   */\n  /*                                                                       */\n  /* This version is much simpler, much faster and also easier to read and */\n  /* maintain by a great order of magnitude.  The idea behind it is to     */\n  /* _not_ try to read the Type 1 token stream with a state machine (i.e.  */\n  /* a Postscript-like interpreter) but rather to perform simple pattern   */\n  /* matching.                                                             */\n  /*                                                                       */\n  /* Indeed, nearly all data definitions follow a simple pattern like      */\n  /*                                                                       */\n  /*  ... /Field <data> ...                                                */\n  /*                                                                       */\n  /* where <data> can be a number, a boolean, a string, or an array of     */\n  /* numbers.  There are a few exceptions, namely the encoding, font name, */\n  /* charstrings, and subrs; they are handled with a special pattern       */\n  /* matching routine.                                                     */\n  /*                                                                       */\n  /* All other common cases are handled very simply.  The matching rules   */\n  /* are defined in the file `t1tokens.h' through the use of several       */\n  /* macros calls PARSE_XXX.  This file is included twice here; the first  */\n  /* time to generate parsing callback functions, the second time to       */\n  /* generate a table of keywords (with pointers to the associated         */\n  /* callback functions).                                                  */\n  /*                                                                       */\n  /* The function `parse_dict' simply scans *linearly* a given dictionary  */\n  /* (either the top-level or private one) and calls the appropriate       */\n  /* callback when it encounters an immediate keyword.                     */\n  /*                                                                       */\n  /* This is by far the fastest way one can find to parse and read all     */\n  /* data.                                                                 */\n  /*                                                                       */\n  /* This led to tremendous code size reduction.  Note that later, the     */\n  /* glyph loader will also be _greatly_ simplified, and the automatic     */\n  /* hinter will replace the clumsy `t1hinter'.                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_CONFIG_CONFIG_H\n#include FT_MULTIPLE_MASTERS_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n#include FT_INTERNAL_CALC_H\n\n#include \"t1load.h\"\n#include \"t1errors.h\"\n\n\n#ifdef FT_CONFIG_OPTION_INCREMENTAL\n#define IS_INCREMENTAL  ( face->root.internal->incremental_interface != 0 )\n#else\n#define IS_INCREMENTAL  0\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1load\n\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                    MULTIPLE MASTERS SUPPORT                   *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_Error\n  t1_allocate_blend( T1_Face  face,\n                     FT_UInt  num_designs,\n                     FT_UInt  num_axis )\n  {\n    PS_Blend   blend;\n    FT_Memory  memory = face->root.memory;\n    FT_Error   error  = FT_Err_Ok;\n\n\n    blend = face->blend;\n    if ( !blend )\n    {\n      if ( FT_NEW( blend ) )\n        goto Exit;\n\n      blend->num_default_design_vector = 0;\n\n      face->blend = blend;\n    }\n\n    /* allocate design data if needed */\n    if ( num_designs > 0 )\n    {\n      if ( blend->num_designs == 0 )\n      {\n        FT_UInt  nn;\n\n\n        /* allocate the blend `private' and `font_info' dictionaries */\n        if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs     ) ||\n             FT_NEW_ARRAY( blend->privates  [1], num_designs     ) ||\n             FT_NEW_ARRAY( blend->bboxes    [1], num_designs     ) ||\n             FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) )\n          goto Exit;\n\n        blend->default_weight_vector = blend->weight_vector + num_designs;\n\n        blend->font_infos[0] = &face->type1.font_info;\n        blend->privates  [0] = &face->type1.private_dict;\n        blend->bboxes    [0] = &face->type1.font_bbox;\n\n        for ( nn = 2; nn <= num_designs; nn++ )\n        {\n          blend->font_infos[nn] = blend->font_infos[nn - 1] + 1;\n          blend->privates  [nn] = blend->privates  [nn - 1] + 1;\n          blend->bboxes    [nn] = blend->bboxes    [nn - 1] + 1;\n        }\n\n        blend->num_designs = num_designs;\n      }\n      else if ( blend->num_designs != num_designs )\n        goto Fail;\n    }\n\n    /* allocate axis data if needed */\n    if ( num_axis > 0 )\n    {\n      if ( blend->num_axis != 0 && blend->num_axis != num_axis )\n        goto Fail;\n\n      blend->num_axis = num_axis;\n    }\n\n    /* allocate the blend design pos table if needed */\n    num_designs = blend->num_designs;\n    num_axis    = blend->num_axis;\n    if ( num_designs && num_axis && blend->design_pos[0] == 0 )\n    {\n      FT_UInt  n;\n\n\n      if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) )\n        goto Exit;\n\n      for ( n = 1; n < num_designs; n++ )\n        blend->design_pos[n] = blend->design_pos[0] + num_axis * n;\n    }\n\n  Exit:\n    return error;\n\n  Fail:\n    error = FT_THROW( Invalid_File_Format );\n    goto Exit;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_Multi_Master( T1_Face           face,\n                       FT_Multi_Master*  master )\n  {\n    PS_Blend  blend = face->blend;\n    FT_UInt   n;\n    FT_Error  error;\n\n\n    error = FT_THROW( Invalid_Argument );\n\n    if ( blend )\n    {\n      master->num_axis    = blend->num_axis;\n      master->num_designs = blend->num_designs;\n\n      for ( n = 0; n < blend->num_axis; n++ )\n      {\n        FT_MM_Axis*   axis = master->axis + n;\n        PS_DesignMap  map = blend->design_map + n;\n\n\n        axis->name    = blend->axis_names[n];\n        axis->minimum = map->design_points[0];\n        axis->maximum = map->design_points[map->num_points - 1];\n      }\n\n      error = FT_Err_Ok;\n    }\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Given a normalized (blend) coordinate, figure out the design          */\n  /* coordinate appropriate for that value.                                */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Fixed )\n  mm_axis_unmap( PS_DesignMap  axismap,\n                 FT_Fixed      ncv )\n  {\n    int  j;\n\n\n    if ( ncv <= axismap->blend_points[0] )\n      return INT_TO_FIXED( axismap->design_points[0] );\n\n    for ( j = 1; j < axismap->num_points; ++j )\n    {\n      if ( ncv <= axismap->blend_points[j] )\n        return INT_TO_FIXED( axismap->design_points[j - 1] ) +\n               ( axismap->design_points[j] - axismap->design_points[j - 1] ) *\n               FT_DivFix( ncv - axismap->blend_points[j - 1],\n                          axismap->blend_points[j] -\n                            axismap->blend_points[j - 1] );\n    }\n\n    return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] );\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Given a vector of weights, one for each design, figure out the        */\n  /* normalized axis coordinates which gave rise to those weights.         */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  mm_weights_unmap( FT_Fixed*  weights,\n                    FT_Fixed*  axiscoords,\n                    FT_UInt    axis_count )\n  {\n    FT_ASSERT( axis_count <= T1_MAX_MM_AXIS );\n\n    if ( axis_count == 1 )\n      axiscoords[0] = weights[1];\n\n    else if ( axis_count == 2 )\n    {\n      axiscoords[0] = weights[3] + weights[1];\n      axiscoords[1] = weights[3] + weights[2];\n    }\n\n    else if ( axis_count == 3 )\n    {\n      axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1];\n      axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2];\n      axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4];\n    }\n\n    else\n    {\n      axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] +\n                        weights[7] + weights[5] + weights[3] + weights[1];\n      axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] +\n                        weights[7] + weights[6] + weights[3] + weights[2];\n      axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] +\n                        weights[7] + weights[6] + weights[5] + weights[4];\n      axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] +\n                        weights[11] + weights[10] + weights[9] + weights[8];\n    }\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Just a wrapper around T1_Get_Multi_Master to support the different    */\n  /*  arguments needed by the GX var distortable fonts.                    */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_MM_Var( T1_Face      face,\n                 FT_MM_Var*  *master )\n  {\n    FT_Memory        memory = face->root.memory;\n    FT_MM_Var       *mmvar = NULL;\n    FT_Multi_Master  mmaster;\n    FT_Error         error;\n    FT_UInt          i;\n    FT_Fixed         axiscoords[T1_MAX_MM_AXIS];\n    PS_Blend         blend = face->blend;\n\n\n    error = T1_Get_Multi_Master( face, &mmaster );\n    if ( error )\n      goto Exit;\n    if ( FT_ALLOC( mmvar,\n                   sizeof ( FT_MM_Var ) +\n                     mmaster.num_axis * sizeof ( FT_Var_Axis ) ) )\n      goto Exit;\n\n    mmvar->num_axis        = mmaster.num_axis;\n    mmvar->num_designs     = mmaster.num_designs;\n    mmvar->num_namedstyles = ~0;                         /* Does not apply */\n    mmvar->axis            = (FT_Var_Axis*)&mmvar[1];\n                                      /* Point to axes after MM_Var struct */\n    mmvar->namedstyle      = NULL;\n\n    for ( i = 0 ; i < mmaster.num_axis; ++i )\n    {\n      mmvar->axis[i].name    = mmaster.axis[i].name;\n      mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum);\n      mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum);\n      mmvar->axis[i].def     = ( mmvar->axis[i].minimum +\n                                   mmvar->axis[i].maximum ) / 2;\n                            /* Does not apply.  But this value is in range */\n      mmvar->axis[i].strid   = ~0;                       /* Does not apply */\n      mmvar->axis[i].tag     = ~0;                       /* Does not apply */\n\n      if ( ft_strcmp( mmvar->axis[i].name, \"Weight\" ) == 0 )\n        mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' );\n      else if ( ft_strcmp( mmvar->axis[i].name, \"Width\" ) == 0 )\n        mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' );\n      else if ( ft_strcmp( mmvar->axis[i].name, \"OpticalSize\" ) == 0 )\n        mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' );\n    }\n\n    if ( blend->num_designs == ( 1U << blend->num_axis ) )\n    {\n      mm_weights_unmap( blend->default_weight_vector,\n                        axiscoords,\n                        blend->num_axis );\n\n      for ( i = 0; i < mmaster.num_axis; ++i )\n        mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i],\n                                            axiscoords[i] );\n    }\n\n    *master = mmvar;\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Set_MM_Blend( T1_Face    face,\n                   FT_UInt    num_coords,\n                   FT_Fixed*  coords )\n  {\n    PS_Blend  blend = face->blend;\n    FT_Error  error;\n    FT_UInt   n, m;\n\n\n    error = FT_ERR( Invalid_Argument );\n\n    if ( blend && blend->num_axis == num_coords )\n    {\n      /* recompute the weight vector from the blend coordinates */\n      error = FT_Err_Ok;\n\n      for ( n = 0; n < blend->num_designs; n++ )\n      {\n        FT_Fixed  result = 0x10000L;  /* 1.0 fixed */\n\n\n        for ( m = 0; m < blend->num_axis; m++ )\n        {\n          FT_Fixed  factor;\n\n\n          /* get current blend axis position */\n          factor = coords[m];\n          if ( factor < 0 )\n            factor = 0;\n          if ( factor > 0x10000L )\n            factor = 0x10000L;\n\n          if ( ( n & ( 1 << m ) ) == 0 )\n            factor = 0x10000L - factor;\n\n          result = FT_MulFix( result, factor );\n        }\n        blend->weight_vector[n] = result;\n      }\n\n      error = FT_Err_Ok;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Set_MM_Design( T1_Face   face,\n                    FT_UInt   num_coords,\n                    FT_Long*  coords )\n  {\n    PS_Blend  blend = face->blend;\n    FT_Error  error;\n    FT_UInt   n, p;\n\n\n    error = FT_ERR( Invalid_Argument );\n    if ( blend && blend->num_axis == num_coords )\n    {\n      /* compute the blend coordinates through the blend design map */\n      FT_Fixed  final_blends[T1_MAX_MM_DESIGNS];\n\n\n      for ( n = 0; n < blend->num_axis; n++ )\n      {\n        FT_Long       design  = coords[n];\n        FT_Fixed      the_blend;\n        PS_DesignMap  map     = blend->design_map + n;\n        FT_Long*      designs = map->design_points;\n        FT_Fixed*     blends  = map->blend_points;\n        FT_Int        before  = -1, after = -1;\n\n\n        for ( p = 0; p < (FT_UInt)map->num_points; p++ )\n        {\n          FT_Long  p_design = designs[p];\n\n\n          /* exact match? */\n          if ( design == p_design )\n          {\n            the_blend = blends[p];\n            goto Found;\n          }\n\n          if ( design < p_design )\n          {\n            after = p;\n            break;\n          }\n\n          before = p;\n        }\n\n        /* now interpolate if necessary */\n        if ( before < 0 )\n          the_blend = blends[0];\n\n        else if ( after < 0 )\n          the_blend = blends[map->num_points - 1];\n\n        else\n          the_blend = FT_MulDiv( design         - designs[before],\n                                 blends [after] - blends [before],\n                                 designs[after] - designs[before] );\n\n      Found:\n        final_blends[n] = the_blend;\n      }\n\n      error = T1_Set_MM_Blend( face, num_coords, final_blends );\n    }\n\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Just a wrapper around T1_Set_MM_Design to support the different       */\n  /* arguments needed by the GX var distortable fonts.                     */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Set_Var_Design( T1_Face    face,\n                     FT_UInt    num_coords,\n                     FT_Fixed*  coords )\n  {\n     FT_Long   lcoords[4];          /* maximum axis count is 4 */\n     FT_UInt   i;\n     FT_Error  error;\n\n\n     error = FT_ERR( Invalid_Argument );\n     if ( num_coords <= 4 && num_coords > 0 )\n     {\n       for ( i = 0; i < num_coords; ++i )\n         lcoords[i] = FIXED_TO_INT( coords[i] );\n       error = T1_Set_MM_Design( face, num_coords, lcoords );\n     }\n\n     return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T1_Done_Blend( T1_Face  face )\n  {\n    FT_Memory  memory = face->root.memory;\n    PS_Blend   blend  = face->blend;\n\n\n    if ( blend )\n    {\n      FT_UInt  num_designs = blend->num_designs;\n      FT_UInt  num_axis    = blend->num_axis;\n      FT_UInt  n;\n\n\n      /* release design pos table */\n      FT_FREE( blend->design_pos[0] );\n      for ( n = 1; n < num_designs; n++ )\n        blend->design_pos[n] = NULL;\n\n      /* release blend `private' and `font info' dictionaries */\n      FT_FREE( blend->privates[1] );\n      FT_FREE( blend->font_infos[1] );\n      FT_FREE( blend->bboxes[1] );\n\n      for ( n = 0; n < num_designs; n++ )\n      {\n        blend->privates  [n] = NULL;\n        blend->font_infos[n] = NULL;\n        blend->bboxes    [n] = NULL;\n      }\n\n      /* release weight vectors */\n      FT_FREE( blend->weight_vector );\n      blend->default_weight_vector = NULL;\n\n      /* release axis names */\n      for ( n = 0; n < num_axis; n++ )\n        FT_FREE( blend->axis_names[n] );\n\n      /* release design map */\n      for ( n = 0; n < num_axis; n++ )\n      {\n        PS_DesignMap  dmap = blend->design_map + n;\n\n\n        FT_FREE( dmap->design_points );\n        dmap->num_points = 0;\n      }\n\n      FT_FREE( face->blend );\n    }\n  }\n\n\n  static void\n  parse_blend_axis_types( T1_Face    face,\n                          T1_Loader  loader )\n  {\n    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];\n    FT_Int       n, num_axis;\n    FT_Error     error = FT_Err_Ok;\n    PS_Blend     blend;\n    FT_Memory    memory;\n\n\n    /* take an array of objects */\n    T1_ToTokenArray( &loader->parser, axis_tokens,\n                     T1_MAX_MM_AXIS, &num_axis );\n    if ( num_axis < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )\n    {\n      FT_ERROR(( \"parse_blend_axis_types: incorrect number of axes: %d\\n\",\n                 num_axis ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* allocate blend if necessary */\n    error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );\n    if ( error )\n      goto Exit;\n\n    blend  = face->blend;\n    memory = face->root.memory;\n\n    /* each token is an immediate containing the name of the axis */\n    for ( n = 0; n < num_axis; n++ )\n    {\n      T1_Token    token = axis_tokens + n;\n      FT_Byte*    name;\n      FT_PtrDist  len;\n\n\n      /* skip first slash, if any */\n      if ( token->start[0] == '/' )\n        token->start++;\n\n      len = token->limit - token->start;\n      if ( len == 0 )\n      {\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      if ( FT_ALLOC( blend->axis_names[n], (FT_Long)( len + 1 ) ) )\n        goto Exit;\n\n      name = (FT_Byte*)blend->axis_names[n];\n      FT_MEM_COPY( name, token->start, len );\n      name[len] = '\\0';\n    }\n\n  Exit:\n    loader->parser.root.error = error;\n  }\n\n\n  static void\n  parse_blend_design_positions( T1_Face    face,\n                                T1_Loader  loader )\n  {\n    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];\n    FT_Int       num_designs;\n    FT_Int       num_axis;\n    T1_Parser    parser = &loader->parser;\n\n    FT_Error     error = FT_Err_Ok;\n    PS_Blend     blend;\n\n\n    /* get the array of design tokens -- compute number of designs */\n    T1_ToTokenArray( parser, design_tokens,\n                     T1_MAX_MM_DESIGNS, &num_designs );\n    if ( num_designs < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )\n    {\n      FT_ERROR(( \"parse_blend_design_positions:\"\n                 \" incorrect number of designs: %d\\n\",\n                 num_designs ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    {\n      FT_Byte*  old_cursor = parser->root.cursor;\n      FT_Byte*  old_limit  = parser->root.limit;\n      FT_Int    n;\n\n\n      blend    = face->blend;\n      num_axis = 0;  /* make compiler happy */\n\n      for ( n = 0; n < num_designs; n++ )\n      {\n        T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];\n        T1_Token     token;\n        FT_Int       axis, n_axis;\n\n\n        /* read axis/coordinates tokens */\n        token = design_tokens + n;\n        parser->root.cursor = token->start;\n        parser->root.limit  = token->limit;\n        T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis );\n\n        if ( n == 0 )\n        {\n          if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS )\n          {\n            FT_ERROR(( \"parse_blend_design_positions:\"\n                       \" invalid number of axes: %d\\n\",\n                       n_axis ));\n            error = FT_THROW( Invalid_File_Format );\n            goto Exit;\n          }\n\n          num_axis = n_axis;\n          error = t1_allocate_blend( face, num_designs, num_axis );\n          if ( error )\n            goto Exit;\n          blend = face->blend;\n        }\n        else if ( n_axis != num_axis )\n        {\n          FT_ERROR(( \"parse_blend_design_positions: incorrect table\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        /* now read each axis token into the design position */\n        for ( axis = 0; axis < n_axis; axis++ )\n        {\n          T1_Token  token2 = axis_tokens + axis;\n\n\n          parser->root.cursor = token2->start;\n          parser->root.limit  = token2->limit;\n          blend->design_pos[n][axis] = T1_ToFixed( parser, 0 );\n        }\n      }\n\n      loader->parser.root.cursor = old_cursor;\n      loader->parser.root.limit  = old_limit;\n    }\n\n  Exit:\n    loader->parser.root.error = error;\n  }\n\n\n  static void\n  parse_blend_design_map( T1_Face    face,\n                          T1_Loader  loader )\n  {\n    FT_Error     error  = FT_Err_Ok;\n    T1_Parser    parser = &loader->parser;\n    PS_Blend     blend;\n    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];\n    FT_Int       n, num_axis;\n    FT_Byte*     old_cursor;\n    FT_Byte*     old_limit;\n    FT_Memory    memory = face->root.memory;\n\n\n    T1_ToTokenArray( parser, axis_tokens,\n                     T1_MAX_MM_AXIS, &num_axis );\n    if ( num_axis < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )\n    {\n      FT_ERROR(( \"parse_blend_design_map: incorrect number of axes: %d\\n\",\n                 num_axis ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    old_cursor = parser->root.cursor;\n    old_limit  = parser->root.limit;\n\n    error = t1_allocate_blend( face, 0, num_axis );\n    if ( error )\n      goto Exit;\n    blend = face->blend;\n\n    /* now read each axis design map */\n    for ( n = 0; n < num_axis; n++ )\n    {\n      PS_DesignMap  map = blend->design_map + n;\n      T1_Token      axis_token;\n      T1_TokenRec   point_tokens[T1_MAX_MM_MAP_POINTS];\n      FT_Int        p, num_points;\n\n\n      axis_token = axis_tokens + n;\n\n      parser->root.cursor = axis_token->start;\n      parser->root.limit  = axis_token->limit;\n      T1_ToTokenArray( parser, point_tokens,\n                       T1_MAX_MM_MAP_POINTS, &num_points );\n\n      if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS )\n      {\n        FT_ERROR(( \"parse_blend_design_map: incorrect table\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      /* allocate design map data */\n      if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) )\n        goto Exit;\n      map->blend_points = map->design_points + num_points;\n      map->num_points   = (FT_Byte)num_points;\n\n      for ( p = 0; p < num_points; p++ )\n      {\n        T1_Token  point_token;\n\n\n        point_token = point_tokens + p;\n\n        /* don't include delimiting brackets */\n        parser->root.cursor = point_token->start + 1;\n        parser->root.limit  = point_token->limit - 1;\n\n        map->design_points[p] = T1_ToInt( parser );\n        map->blend_points [p] = T1_ToFixed( parser, 0 );\n      }\n    }\n\n    parser->root.cursor = old_cursor;\n    parser->root.limit  = old_limit;\n\n  Exit:\n    parser->root.error = error;\n  }\n\n\n  static void\n  parse_weight_vector( T1_Face    face,\n                       T1_Loader  loader )\n  {\n    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];\n    FT_Int       num_designs;\n    FT_Error     error  = FT_Err_Ok;\n    T1_Parser    parser = &loader->parser;\n    PS_Blend     blend  = face->blend;\n    T1_Token     token;\n    FT_Int       n;\n    FT_Byte*     old_cursor;\n    FT_Byte*     old_limit;\n\n\n    T1_ToTokenArray( parser, design_tokens,\n                     T1_MAX_MM_DESIGNS, &num_designs );\n    if ( num_designs < 0 )\n    {\n      error = FT_ERR( Ignore );\n      goto Exit;\n    }\n    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )\n    {\n      FT_ERROR(( \"parse_weight_vector:\"\n                 \" incorrect number of designs: %d\\n\",\n                 num_designs ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    if ( !blend || !blend->num_designs )\n    {\n      error = t1_allocate_blend( face, num_designs, 0 );\n      if ( error )\n        goto Exit;\n      blend = face->blend;\n    }\n    else if ( blend->num_designs != (FT_UInt)num_designs )\n    {\n      FT_ERROR(( \"parse_weight_vector:\"\n                 \" /BlendDesignPosition and /WeightVector have\\n\"\n                 \"                    \"\n                 \" different number of elements\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    old_cursor = parser->root.cursor;\n    old_limit  = parser->root.limit;\n\n    for ( n = 0; n < num_designs; n++ )\n    {\n      token = design_tokens + n;\n      parser->root.cursor = token->start;\n      parser->root.limit  = token->limit;\n\n      blend->default_weight_vector[n] =\n      blend->weight_vector[n]         = T1_ToFixed( parser, 0 );\n    }\n\n    parser->root.cursor = old_cursor;\n    parser->root.limit  = old_limit;\n\n  Exit:\n    parser->root.error = error;\n  }\n\n\n  /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def           */\n  /* we're only interested in the number of array elements */\n  static void\n  parse_buildchar( T1_Face    face,\n                   T1_Loader  loader )\n  {\n    face->len_buildchar = T1_ToFixedArray( &loader->parser, 0, NULL, 0 );\n\n    return;\n  }\n\n\n#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */\n\n\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                      TYPE 1 SYMBOL PARSING                    *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  static FT_Error\n  t1_load_keyword( T1_Face         face,\n                   T1_Loader       loader,\n                   const T1_Field  field )\n  {\n    FT_Error  error;\n    void*     dummy_object;\n    void**    objects;\n    FT_UInt   max_objects;\n    PS_Blend  blend = face->blend;\n\n\n    if ( blend && blend->num_designs == 0 )\n      blend = NULL;\n\n    /* if the keyword has a dedicated callback, call it */\n    if ( field->type == T1_FIELD_TYPE_CALLBACK )\n    {\n      field->reader( (FT_Face)face, loader );\n      error = loader->parser.root.error;\n      goto Exit;\n    }\n\n    /* now, the keyword is either a simple field, or a table of fields; */\n    /* we are now going to take care of it                              */\n    switch ( field->location )\n    {\n    case T1_FIELD_LOCATION_FONT_INFO:\n      dummy_object = &face->type1.font_info;\n      objects      = &dummy_object;\n      max_objects  = 0;\n\n      if ( blend )\n      {\n        objects     = (void**)blend->font_infos;\n        max_objects = blend->num_designs;\n      }\n      break;\n\n    case T1_FIELD_LOCATION_FONT_EXTRA:\n      dummy_object = &face->type1.font_extra;\n      objects      = &dummy_object;\n      max_objects  = 0;\n      break;\n\n    case T1_FIELD_LOCATION_PRIVATE:\n      dummy_object = &face->type1.private_dict;\n      objects      = &dummy_object;\n      max_objects  = 0;\n\n      if ( blend )\n      {\n        objects     = (void**)blend->privates;\n        max_objects = blend->num_designs;\n      }\n      break;\n\n    case T1_FIELD_LOCATION_BBOX:\n      dummy_object = &face->type1.font_bbox;\n      objects      = &dummy_object;\n      max_objects  = 0;\n\n      if ( blend )\n      {\n        objects     = (void**)blend->bboxes;\n        max_objects = blend->num_designs;\n      }\n      break;\n\n    case T1_FIELD_LOCATION_LOADER:\n      dummy_object = loader;\n      objects      = &dummy_object;\n      max_objects  = 0;\n      break;\n\n    case T1_FIELD_LOCATION_FACE:\n      dummy_object = face;\n      objects      = &dummy_object;\n      max_objects  = 0;\n      break;\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n    case T1_FIELD_LOCATION_BLEND:\n      dummy_object = face->blend;\n      objects      = &dummy_object;\n      max_objects  = 0;\n      break;\n#endif\n\n    default:\n      dummy_object = &face->type1;\n      objects      = &dummy_object;\n      max_objects  = 0;\n    }\n\n    if ( *objects )\n    {\n      if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||\n           field->type == T1_FIELD_TYPE_FIXED_ARRAY   )\n        error = T1_Load_Field_Table( &loader->parser, field,\n                                     objects, max_objects, 0 );\n      else\n        error = T1_Load_Field( &loader->parser, field,\n                               objects, max_objects, 0 );\n    }\n    else\n    {\n      FT_TRACE1(( \"t1_load_keyword: ignoring keyword `%s'\"\n                  \" which is not valid at this point\\n\"\n                  \"                 (probably due to missing keywords)\\n\",\n                 field->ident ));\n      error = FT_Err_Ok;\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  static void\n  parse_private( T1_Face    face,\n                 T1_Loader  loader )\n  {\n    FT_UNUSED( face );\n\n    loader->keywords_encountered |= T1_PRIVATE;\n  }\n\n\n  static int\n  read_binary_data( T1_Parser  parser,\n                    FT_Long*   size,\n                    FT_Byte**  base,\n                    FT_Bool    incremental )\n  {\n    FT_Byte*  cur;\n    FT_Byte*  limit = parser->root.limit;\n\n\n    /* the binary data has one of the following formats */\n    /*                                                  */\n    /*   `size' [white*] RD white ....... ND            */\n    /*   `size' [white*] -| white ....... |-            */\n    /*                                                  */\n\n    T1_Skip_Spaces( parser );\n\n    cur = parser->root.cursor;\n\n    if ( cur < limit && ft_isdigit( *cur ) )\n    {\n      FT_Long  s = T1_ToInt( parser );\n\n\n      T1_Skip_PS_Token( parser );   /* `RD' or `-|' or something else */\n\n      /* there is only one whitespace char after the */\n      /* `RD' or `-|' token                          */\n      *base = parser->root.cursor + 1;\n\n      if ( s >= 0 && s < limit - *base )\n      {\n        parser->root.cursor += s + 1;\n        *size = s;\n        return !parser->root.error;\n      }\n    }\n\n    if( !incremental )\n    {\n      FT_ERROR(( \"read_binary_data: invalid size field\\n\" ));\n      parser->root.error = FT_THROW( Invalid_File_Format );\n    }\n\n    return 0;\n  }\n\n\n  /* We now define the routines to handle the `/Encoding', `/Subrs', */\n  /* and `/CharStrings' dictionaries.                                */\n\n  static void\n  t1_parse_font_matrix( T1_Face    face,\n                        T1_Loader  loader )\n  {\n    T1_Parser   parser = &loader->parser;\n    FT_Matrix*  matrix = &face->type1.font_matrix;\n    FT_Vector*  offset = &face->type1.font_offset;\n    FT_Face     root   = (FT_Face)&face->root;\n    FT_Fixed    temp[6];\n    FT_Fixed    temp_scale;\n    FT_Int      result;\n\n\n    result = T1_ToFixedArray( parser, 6, temp, 3 );\n\n    if ( result < 0 )\n    {\n      parser->root.error = FT_THROW( Invalid_File_Format );\n      return;\n    }\n\n    temp_scale = FT_ABS( temp[3] );\n\n    if ( temp_scale == 0 )\n    {\n      FT_ERROR(( \"t1_parse_font_matrix: invalid font matrix\\n\" ));\n      parser->root.error = FT_THROW( Invalid_File_Format );\n      return;\n    }\n\n    /* Set Units per EM based on FontMatrix values.  We set the value to */\n    /* 1000 / temp_scale, because temp_scale was already multiplied by   */\n    /* 1000 (in t1_tofixed, from psobjs.c).                              */\n\n    root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );\n\n    /* we need to scale the values by 1.0/temp_scale */\n    if ( temp_scale != 0x10000L )\n    {\n      temp[0] = FT_DivFix( temp[0], temp_scale );\n      temp[1] = FT_DivFix( temp[1], temp_scale );\n      temp[2] = FT_DivFix( temp[2], temp_scale );\n      temp[4] = FT_DivFix( temp[4], temp_scale );\n      temp[5] = FT_DivFix( temp[5], temp_scale );\n      temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;\n    }\n\n    matrix->xx = temp[0];\n    matrix->yx = temp[1];\n    matrix->xy = temp[2];\n    matrix->yy = temp[3];\n\n    /* note that the offsets must be expressed in integer font units */\n    offset->x = temp[4] >> 16;\n    offset->y = temp[5] >> 16;\n  }\n\n\n  static void\n  parse_encoding( T1_Face    face,\n                  T1_Loader  loader )\n  {\n    T1_Parser  parser = &loader->parser;\n    FT_Byte*   cur;\n    FT_Byte*   limit  = parser->root.limit;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    T1_Skip_Spaces( parser );\n    cur = parser->root.cursor;\n    if ( cur >= limit )\n    {\n      FT_ERROR(( \"parse_encoding: out of bounds\\n\" ));\n      parser->root.error = FT_THROW( Invalid_File_Format );\n      return;\n    }\n\n    /* if we have a number or `[', the encoding is an array, */\n    /* and we must load it now                               */\n    if ( ft_isdigit( *cur ) || *cur == '[' )\n    {\n      T1_Encoding  encode          = &face->type1.encoding;\n      FT_Int       count, n;\n      PS_Table     char_table      = &loader->encoding_table;\n      FT_Memory    memory          = parser->root.memory;\n      FT_Error     error;\n      FT_Bool      only_immediates = 0;\n\n\n      /* read the number of entries in the encoding; should be 256 */\n      if ( *cur == '[' )\n      {\n        count           = 256;\n        only_immediates = 1;\n        parser->root.cursor++;\n      }\n      else\n        count = (FT_Int)T1_ToInt( parser );\n\n      T1_Skip_Spaces( parser );\n      if ( parser->root.cursor >= limit )\n        return;\n\n      /* we use a T1_Table to store our charnames */\n      loader->num_chars = encode->num_chars = count;\n      if ( FT_NEW_ARRAY( encode->char_index, count )     ||\n           FT_NEW_ARRAY( encode->char_name,  count )     ||\n           FT_SET_ERROR( psaux->ps_table_funcs->init(\n                           char_table, count, memory ) ) )\n      {\n        parser->root.error = error;\n        return;\n      }\n\n      /* We need to `zero' out encoding_table.elements */\n      for ( n = 0; n < count; n++ )\n      {\n        char*  notdef = (char *)\".notdef\";\n\n\n        T1_Add_Table( char_table, n, notdef, 8 );\n      }\n\n      /* Now we need to read records of the form                */\n      /*                                                        */\n      /*   ... charcode /charname ...                           */\n      /*                                                        */\n      /* for each entry in our table.                           */\n      /*                                                        */\n      /* We simply look for a number followed by an immediate   */\n      /* name.  Note that this ignores correctly the sequence   */\n      /* that is often seen in type1 fonts:                     */\n      /*                                                        */\n      /*   0 1 255 { 1 index exch /.notdef put } for dup        */\n      /*                                                        */\n      /* used to clean the encoding array before anything else. */\n      /*                                                        */\n      /* Alternatively, if the array is directly given as       */\n      /*                                                        */\n      /*   /Encoding [ ... ]                                    */\n      /*                                                        */\n      /* we only read immediates.                               */\n\n      n = 0;\n      T1_Skip_Spaces( parser );\n\n      while ( parser->root.cursor < limit )\n      {\n        cur = parser->root.cursor;\n\n        /* we stop when we encounter a `def' or `]' */\n        if ( *cur == 'd' && cur + 3 < limit )\n        {\n          if ( cur[1] == 'e'         &&\n               cur[2] == 'f'         &&\n               IS_PS_DELIM( cur[3] ) )\n          {\n            FT_TRACE6(( \"encoding end\\n\" ));\n            cur += 3;\n            break;\n          }\n        }\n        if ( *cur == ']' )\n        {\n          FT_TRACE6(( \"encoding end\\n\" ));\n          cur++;\n          break;\n        }\n\n        /* check whether we've found an entry */\n        if ( ft_isdigit( *cur ) || only_immediates )\n        {\n          FT_Int  charcode;\n\n\n          if ( only_immediates )\n            charcode = n;\n          else\n          {\n            charcode = (FT_Int)T1_ToInt( parser );\n            T1_Skip_Spaces( parser );\n          }\n\n          cur = parser->root.cursor;\n\n          if ( cur + 2 < limit && *cur == '/' && n < count )\n          {\n            FT_PtrDist  len;\n\n\n            cur++;\n\n            parser->root.cursor = cur;\n            T1_Skip_PS_Token( parser );\n            if ( parser->root.cursor >= limit )\n              return;\n            if ( parser->root.error )\n              return;\n\n            len = parser->root.cursor - cur;\n\n            parser->root.error = T1_Add_Table( char_table, charcode,\n                                               cur, len + 1 );\n            if ( parser->root.error )\n              return;\n            char_table->elements[charcode][len] = '\\0';\n\n            n++;\n          }\n          else if ( only_immediates )\n          {\n            /* Since the current position is not updated for           */\n            /* immediates-only mode we would get an infinite loop if   */\n            /* we don't do anything here.                              */\n            /*                                                         */\n            /* This encoding array is not valid according to the type1 */\n            /* specification (it might be an encoding for a CID type1  */\n            /* font, however), so we conclude that this font is NOT a  */\n            /* type1 font.                                             */\n            parser->root.error = FT_THROW( Unknown_File_Format );\n            return;\n          }\n        }\n        else\n        {\n          T1_Skip_PS_Token( parser );\n          if ( parser->root.error )\n            return;\n        }\n\n        T1_Skip_Spaces( parser );\n      }\n\n      face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY;\n      parser->root.cursor       = cur;\n    }\n\n    /* Otherwise, we should have either `StandardEncoding', */\n    /* `ExpertEncoding', or `ISOLatin1Encoding'             */\n    else\n    {\n      if ( cur + 17 < limit                                            &&\n           ft_strncmp( (const char*)cur, \"StandardEncoding\", 16 ) == 0 )\n        face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;\n\n      else if ( cur + 15 < limit                                          &&\n                ft_strncmp( (const char*)cur, \"ExpertEncoding\", 14 ) == 0 )\n        face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;\n\n      else if ( cur + 18 < limit                                             &&\n                ft_strncmp( (const char*)cur, \"ISOLatin1Encoding\", 17 ) == 0 )\n        face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;\n\n      else\n        parser->root.error = FT_ERR( Ignore );\n    }\n  }\n\n\n  static void\n  parse_subrs( T1_Face    face,\n               T1_Loader  loader )\n  {\n    T1_Parser  parser = &loader->parser;\n    PS_Table   table  = &loader->subrs;\n    FT_Memory  memory = parser->root.memory;\n    FT_Error   error;\n    FT_Int     num_subrs;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    T1_Skip_Spaces( parser );\n\n    /* test for empty array */\n    if ( parser->root.cursor < parser->root.limit &&\n         *parser->root.cursor == '['              )\n    {\n      T1_Skip_PS_Token( parser );\n      T1_Skip_Spaces  ( parser );\n      if ( parser->root.cursor >= parser->root.limit ||\n           *parser->root.cursor != ']'               )\n        parser->root.error = FT_THROW( Invalid_File_Format );\n      return;\n    }\n\n    num_subrs = (FT_Int)T1_ToInt( parser );\n\n    /* position the parser right before the `dup' of the first subr */\n    T1_Skip_PS_Token( parser );         /* `array' */\n    if ( parser->root.error )\n      return;\n    T1_Skip_Spaces( parser );\n\n    /* initialize subrs array -- with synthetic fonts it is possible */\n    /* we get here twice                                             */\n    if ( !loader->num_subrs )\n    {\n      error = psaux->ps_table_funcs->init( table, num_subrs, memory );\n      if ( error )\n        goto Fail;\n    }\n\n    /* the format is simple:   */\n    /*                         */\n    /*   `index' + binary data */\n    /*                         */\n    for (;;)\n    {\n      FT_Long   idx, size;\n      FT_Byte*  base;\n\n\n      /* If we are out of data, or if the next token isn't `dup', */\n      /* we are done.                                             */\n      if ( parser->root.cursor + 4 >= parser->root.limit          ||\n          ft_strncmp( (char*)parser->root.cursor, \"dup\", 3 ) != 0 )\n        break;\n\n      T1_Skip_PS_Token( parser );       /* `dup' */\n\n      idx = T1_ToInt( parser );\n\n      if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )\n        return;\n\n      /* The binary string is followed by one token, e.g. `NP' */\n      /* (bound to `noaccess put') or by two separate tokens:  */\n      /* `noaccess' & `put'.  We position the parser right     */\n      /* before the next `dup', if any.                        */\n      T1_Skip_PS_Token( parser );   /* `NP' or `|' or `noaccess' */\n      if ( parser->root.error )\n        return;\n      T1_Skip_Spaces  ( parser );\n\n      if ( parser->root.cursor + 4 < parser->root.limit            &&\n           ft_strncmp( (char*)parser->root.cursor, \"put\", 3 ) == 0 )\n      {\n        T1_Skip_PS_Token( parser ); /* skip `put' */\n        T1_Skip_Spaces  ( parser );\n      }\n\n      /* with synthetic fonts it is possible we get here twice */\n      if ( loader->num_subrs )\n        continue;\n\n      /* some fonts use a value of -1 for lenIV to indicate that */\n      /* the charstrings are unencoded                           */\n      /*                                                         */\n      /* thanks to Tom Kacvinsky for pointing this out           */\n      /*                                                         */\n      if ( face->type1.private_dict.lenIV >= 0 )\n      {\n        FT_Byte*  temp;\n\n\n        /* some fonts define empty subr records -- this is not totally */\n        /* compliant to the specification (which says they should at   */\n        /* least contain a `return'), but we support them anyway       */\n        if ( size < face->type1.private_dict.lenIV )\n        {\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n\n        /* t1_decrypt() shouldn't write to base -- make temporary copy */\n        if ( FT_ALLOC( temp, size ) )\n          goto Fail;\n        FT_MEM_COPY( temp, base, size );\n        psaux->t1_decrypt( temp, size, 4330 );\n        size -= face->type1.private_dict.lenIV;\n        error = T1_Add_Table( table, (FT_Int)idx,\n                              temp + face->type1.private_dict.lenIV, size );\n        FT_FREE( temp );\n      }\n      else\n        error = T1_Add_Table( table, (FT_Int)idx, base, size );\n      if ( error )\n        goto Fail;\n    }\n\n    if ( !loader->num_subrs )\n      loader->num_subrs = num_subrs;\n\n    return;\n\n  Fail:\n    parser->root.error = error;\n  }\n\n\n#define TABLE_EXTEND  5\n\n\n  static void\n  parse_charstrings( T1_Face    face,\n                     T1_Loader  loader )\n  {\n    T1_Parser      parser       = &loader->parser;\n    PS_Table       code_table   = &loader->charstrings;\n    PS_Table       name_table   = &loader->glyph_names;\n    PS_Table       swap_table   = &loader->swap_table;\n    FT_Memory      memory       = parser->root.memory;\n    FT_Error       error;\n\n    PSAux_Service  psaux        = (PSAux_Service)face->psaux;\n\n    FT_Byte*       cur;\n    FT_Byte*       limit        = parser->root.limit;\n    FT_Int         n, num_glyphs;\n    FT_UInt        notdef_index = 0;\n    FT_Byte        notdef_found = 0;\n\n\n    num_glyphs = (FT_Int)T1_ToInt( parser );\n    if ( num_glyphs < 0 )\n    {\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    /* some fonts like Optima-Oblique not only define the /CharStrings */\n    /* array but access it also                                        */\n    if ( num_glyphs == 0 || parser->root.error )\n      return;\n\n    /* initialize tables, leaving space for addition of .notdef, */\n    /* if necessary, and a few other glyphs to handle buggy      */\n    /* fonts which have more glyphs than specified.              */\n\n    /* for some non-standard fonts like `Optima' which provides  */\n    /* different outlines depending on the resolution it is      */\n    /* possible to get here twice                                */\n    if ( !loader->num_glyphs )\n    {\n      error = psaux->ps_table_funcs->init(\n                code_table, num_glyphs + 1 + TABLE_EXTEND, memory );\n      if ( error )\n        goto Fail;\n\n      error = psaux->ps_table_funcs->init(\n                name_table, num_glyphs + 1 + TABLE_EXTEND, memory );\n      if ( error )\n        goto Fail;\n\n      /* Initialize table for swapping index notdef_index and */\n      /* index 0 names and codes (if necessary).              */\n\n      error = psaux->ps_table_funcs->init( swap_table, 4, memory );\n      if ( error )\n        goto Fail;\n    }\n\n    n = 0;\n\n    for (;;)\n    {\n      FT_Long   size;\n      FT_Byte*  base;\n\n\n      /* the format is simple:        */\n      /*   `/glyphname' + binary data */\n\n      T1_Skip_Spaces( parser );\n\n      cur = parser->root.cursor;\n      if ( cur >= limit )\n        break;\n\n      /* we stop when we find a `def' or `end' keyword */\n      if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) )\n      {\n        if ( cur[0] == 'd' &&\n             cur[1] == 'e' &&\n             cur[2] == 'f' )\n        {\n          /* There are fonts which have this: */\n          /*                                  */\n          /*   /CharStrings 118 dict def      */\n          /*   Private begin                  */\n          /*   CharStrings begin              */\n          /*   ...                            */\n          /*                                  */\n          /* To catch this we ignore `def' if */\n          /* no charstring has actually been  */\n          /* seen.                            */\n          if ( n )\n            break;\n        }\n\n        if ( cur[0] == 'e' &&\n             cur[1] == 'n' &&\n             cur[2] == 'd' )\n          break;\n      }\n\n      T1_Skip_PS_Token( parser );\n      if ( parser->root.error )\n        return;\n\n      if ( *cur == '/' )\n      {\n        FT_PtrDist  len;\n\n\n        if ( cur + 1 >= limit )\n        {\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n\n        cur++;                              /* skip `/' */\n        len = parser->root.cursor - cur;\n\n        if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )\n          return;\n\n        /* for some non-standard fonts like `Optima' which provides */\n        /* different outlines depending on the resolution it is     */\n        /* possible to get here twice                               */\n        if ( loader->num_glyphs )\n          continue;\n\n        error = T1_Add_Table( name_table, n, cur, len + 1 );\n        if ( error )\n          goto Fail;\n\n        /* add a trailing zero to the name table */\n        name_table->elements[n][len] = '\\0';\n\n        /* record index of /.notdef */\n        if ( *cur == '.'                                              &&\n             ft_strcmp( \".notdef\",\n                        (const char*)(name_table->elements[n]) ) == 0 )\n        {\n          notdef_index = n;\n          notdef_found = 1;\n        }\n\n        if ( face->type1.private_dict.lenIV >= 0 &&\n             n < num_glyphs + TABLE_EXTEND       )\n        {\n          FT_Byte*  temp;\n\n\n          if ( size <= face->type1.private_dict.lenIV )\n          {\n            error = FT_THROW( Invalid_File_Format );\n            goto Fail;\n          }\n\n          /* t1_decrypt() shouldn't write to base -- make temporary copy */\n          if ( FT_ALLOC( temp, size ) )\n            goto Fail;\n          FT_MEM_COPY( temp, base, size );\n          psaux->t1_decrypt( temp, size, 4330 );\n          size -= face->type1.private_dict.lenIV;\n          error = T1_Add_Table( code_table, n,\n                                temp + face->type1.private_dict.lenIV, size );\n          FT_FREE( temp );\n        }\n        else\n          error = T1_Add_Table( code_table, n, base, size );\n        if ( error )\n          goto Fail;\n\n        n++;\n      }\n    }\n\n    loader->num_glyphs = n;\n\n    /* if /.notdef is found but does not occupy index 0, do our magic. */\n    if ( notdef_found                                                 &&\n         ft_strcmp( \".notdef\", (const char*)name_table->elements[0] ) )\n    {\n      /* Swap glyph in index 0 with /.notdef glyph.  First, add index 0  */\n      /* name and code entries to swap_table.  Then place notdef_index   */\n      /* name and code entries into swap_table.  Then swap name and code */\n      /* entries at indices notdef_index and 0 using values stored in    */\n      /* swap_table.                                                     */\n\n      /* Index 0 name */\n      error = T1_Add_Table( swap_table, 0,\n                            name_table->elements[0],\n                            name_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      /* Index 0 code */\n      error = T1_Add_Table( swap_table, 1,\n                            code_table->elements[0],\n                            code_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      /* Index notdef_index name */\n      error = T1_Add_Table( swap_table, 2,\n                            name_table->elements[notdef_index],\n                            name_table->lengths [notdef_index] );\n      if ( error )\n        goto Fail;\n\n      /* Index notdef_index code */\n      error = T1_Add_Table( swap_table, 3,\n                            code_table->elements[notdef_index],\n                            code_table->lengths [notdef_index] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, notdef_index,\n                            swap_table->elements[0],\n                            swap_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, notdef_index,\n                            swap_table->elements[1],\n                            swap_table->lengths [1] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, 0,\n                            swap_table->elements[2],\n                            swap_table->lengths [2] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, 0,\n                            swap_table->elements[3],\n                            swap_table->lengths [3] );\n      if ( error )\n        goto Fail;\n\n    }\n    else if ( !notdef_found )\n    {\n      /* notdef_index is already 0, or /.notdef is undefined in   */\n      /* charstrings dictionary.  Worry about /.notdef undefined. */\n      /* We take index 0 and add it to the end of the table(s)    */\n      /* and add our own /.notdef glyph to index 0.               */\n\n      /* 0 333 hsbw endchar */\n      FT_Byte  notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E };\n      char*    notdef_name    = (char *)\".notdef\";\n\n\n      error = T1_Add_Table( swap_table, 0,\n                            name_table->elements[0],\n                            name_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( swap_table, 1,\n                            code_table->elements[0],\n                            code_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, 0, notdef_name, 8 );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, 0, notdef_glyph, 5 );\n\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, n,\n                            swap_table->elements[0],\n                            swap_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, n,\n                            swap_table->elements[1],\n                            swap_table->lengths [1] );\n      if ( error )\n        goto Fail;\n\n      /* we added a glyph. */\n      loader->num_glyphs += 1;\n    }\n\n    return;\n\n  Fail:\n    parser->root.error = error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define the token field static variables.  This is a set of            */\n  /* T1_FieldRec variables.                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static\n  const T1_FieldRec  t1_keywords[] =\n  {\n\n#include \"t1tokens.h\"\n\n    /* now add the special functions... */\n    T1_FIELD_CALLBACK( \"FontMatrix\",           t1_parse_font_matrix,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"Encoding\",             parse_encoding,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"Subrs\",                parse_subrs,\n                       T1_FIELD_DICT_PRIVATE )\n    T1_FIELD_CALLBACK( \"CharStrings\",          parse_charstrings,\n                       T1_FIELD_DICT_PRIVATE )\n    T1_FIELD_CALLBACK( \"Private\",              parse_private,\n                       T1_FIELD_DICT_FONTDICT )\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n    T1_FIELD_CALLBACK( \"BlendDesignPositions\", parse_blend_design_positions,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"BlendDesignMap\",       parse_blend_design_map,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"BlendAxisTypes\",       parse_blend_axis_types,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"WeightVector\",         parse_weight_vector,\n                       T1_FIELD_DICT_FONTDICT )\n    T1_FIELD_CALLBACK( \"BuildCharArray\",       parse_buildchar,\n                       T1_FIELD_DICT_PRIVATE )\n#endif\n\n    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }\n  };\n\n\n#define T1_FIELD_COUNT                                           \\\n          ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) )\n\n\n  static FT_Error\n  parse_dict( T1_Face    face,\n              T1_Loader  loader,\n              FT_Byte*   base,\n              FT_Long    size )\n  {\n    T1_Parser  parser = &loader->parser;\n    FT_Byte   *limit, *start_binary = NULL;\n    FT_Bool    have_integer = 0;\n\n\n    parser->root.cursor = base;\n    parser->root.limit  = base + size;\n    parser->root.error  = FT_Err_Ok;\n\n    limit = parser->root.limit;\n\n    T1_Skip_Spaces( parser );\n\n    while ( parser->root.cursor < limit )\n    {\n      FT_Byte*  cur;\n\n\n      cur = parser->root.cursor;\n\n      /* look for `eexec' */\n      if ( IS_PS_TOKEN( cur, limit, \"eexec\" ) )\n        break;\n\n      /* look for `closefile' which ends the eexec section */\n      else if ( IS_PS_TOKEN( cur, limit, \"closefile\" ) )\n        break;\n\n      /* in a synthetic font the base font starts after a           */\n      /* `FontDictionary' token that is placed after a Private dict */\n      else if ( IS_PS_TOKEN( cur, limit, \"FontDirectory\" ) )\n      {\n        if ( loader->keywords_encountered & T1_PRIVATE )\n          loader->keywords_encountered |=\n            T1_FONTDIR_AFTER_PRIVATE;\n        parser->root.cursor += 13;\n      }\n\n      /* check whether we have an integer */\n      else if ( ft_isdigit( *cur ) )\n      {\n        start_binary = cur;\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          goto Exit;\n        have_integer = 1;\n      }\n\n      /* in valid Type 1 fonts we don't see `RD' or `-|' directly */\n      /* since those tokens are handled by parse_subrs and        */\n      /* parse_charstrings                                        */\n      else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&\n                have_integer )\n      {\n        FT_Long   s;\n        FT_Byte*  b;\n\n\n        parser->root.cursor = start_binary;\n        if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )\n          return FT_THROW( Invalid_File_Format );\n        have_integer = 0;\n      }\n\n      else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&\n                have_integer )\n      {\n        FT_Long   s;\n        FT_Byte*  b;\n\n\n        parser->root.cursor = start_binary;\n        if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )\n          return FT_THROW( Invalid_File_Format );\n        have_integer = 0;\n      }\n\n      /* look for immediates */\n      else if ( *cur == '/' && cur + 2 < limit )\n      {\n        FT_PtrDist  len;\n\n\n        cur++;\n\n        parser->root.cursor = cur;\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          goto Exit;\n\n        len = parser->root.cursor - cur;\n\n        if ( len > 0 && len < 22 && parser->root.cursor < limit )\n        {\n          /* now compare the immediate name to the keyword table */\n          T1_Field  keyword = (T1_Field)t1_keywords;\n\n\n          for (;;)\n          {\n            FT_Byte*  name;\n\n\n            name = (FT_Byte*)keyword->ident;\n            if ( !name )\n              break;\n\n            if ( cur[0] == name[0]                                  &&\n                 len == (FT_PtrDist)ft_strlen( (const char *)name ) &&\n                 ft_memcmp( cur, name, len ) == 0                   )\n            {\n              /* We found it -- run the parsing callback!     */\n              /* We record every instance of every field      */\n              /* (until we reach the base font of a           */\n              /* synthetic font) to deal adequately with      */\n              /* multiple master fonts; this is also          */\n              /* necessary because later PostScript           */\n              /* definitions override earlier ones.           */\n\n              /* Once we encounter `FontDirectory' after      */\n              /* `/Private', we know that this is a synthetic */\n              /* font; except for `/CharStrings' we are not   */\n              /* interested in anything that follows this     */\n              /* `FontDirectory'.                             */\n\n              /* MM fonts have more than one /Private token at */\n              /* the top level; let's hope that all the junk   */\n              /* that follows the first /Private token is not  */\n              /* interesting to us.                            */\n\n              /* According to Adobe Tech Note #5175 (CID-Keyed */\n              /* Font Installation for ATM Software) a `begin' */\n              /* must be followed by exactly one `end', and    */\n              /* `begin' -- `end' pairs must be accurately     */\n              /* paired.  We could use this to distinguish     */\n              /* between the global Private and the Private    */\n              /* dict that is a member of the Blend dict.      */\n\n              const FT_UInt dict =\n                ( loader->keywords_encountered & T1_PRIVATE )\n                    ? T1_FIELD_DICT_PRIVATE\n                    : T1_FIELD_DICT_FONTDICT;\n\n              if ( !( dict & keyword->dict ) )\n              {\n                FT_TRACE1(( \"parse_dict: found `%s' but ignoring it\"\n                            \" since it is in the wrong dictionary\\n\",\n                            keyword->ident ));\n                break;\n              }\n\n              if ( !( loader->keywords_encountered &\n                      T1_FONTDIR_AFTER_PRIVATE     )                  ||\n                   ft_strcmp( (const char*)name, \"CharStrings\" ) == 0 )\n              {\n                parser->root.error = t1_load_keyword( face,\n                                                      loader,\n                                                      keyword );\n                if ( parser->root.error != FT_Err_Ok )\n                {\n                  if ( FT_ERR_EQ( parser->root.error, Ignore ) )\n                    parser->root.error = FT_Err_Ok;\n                  else\n                    return parser->root.error;\n                }\n              }\n              break;\n            }\n\n            keyword++;\n          }\n        }\n\n        have_integer = 0;\n      }\n      else\n      {\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          goto Exit;\n        have_integer = 0;\n      }\n\n      T1_Skip_Spaces( parser );\n    }\n\n  Exit:\n    return parser->root.error;\n  }\n\n\n  static void\n  t1_init_loader( T1_Loader  loader,\n                  T1_Face    face )\n  {\n    FT_UNUSED( face );\n\n    FT_MEM_ZERO( loader, sizeof ( *loader ) );\n    loader->num_glyphs = 0;\n    loader->num_chars  = 0;\n\n    /* initialize the tables -- simply set their `init' field to 0 */\n    loader->encoding_table.init  = 0;\n    loader->charstrings.init     = 0;\n    loader->glyph_names.init     = 0;\n    loader->subrs.init           = 0;\n    loader->swap_table.init      = 0;\n    loader->fontdata             = 0;\n    loader->keywords_encountered = 0;\n  }\n\n\n  static void\n  t1_done_loader( T1_Loader  loader )\n  {\n    T1_Parser  parser = &loader->parser;\n\n\n    /* finalize tables */\n    T1_Release_Table( &loader->encoding_table );\n    T1_Release_Table( &loader->charstrings );\n    T1_Release_Table( &loader->glyph_names );\n    T1_Release_Table( &loader->swap_table );\n    T1_Release_Table( &loader->subrs );\n\n    /* finalize parser */\n    T1_Finalize_Parser( parser );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Open_Face( T1_Face  face )\n  {\n    T1_LoaderRec   loader;\n    T1_Parser      parser;\n    T1_Font        type1 = &face->type1;\n    PS_Private     priv  = &type1->private_dict;\n    FT_Error       error;\n\n    PSAux_Service  psaux = (PSAux_Service)face->psaux;\n\n\n    t1_init_loader( &loader, face );\n\n    /* default values */\n    face->ndv_idx          = -1;\n    face->cdv_idx          = -1;\n    face->len_buildchar    = 0;\n\n    priv->blue_shift       = 7;\n    priv->blue_fuzz        = 1;\n    priv->lenIV            = 4;\n    priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );\n    priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );\n\n    parser = &loader.parser;\n    error  = T1_New_Parser( parser,\n                            face->root.stream,\n                            face->root.memory,\n                            psaux );\n    if ( error )\n      goto Exit;\n\n    error = parse_dict( face, &loader,\n                        parser->base_dict, parser->base_len );\n    if ( error )\n      goto Exit;\n\n    error = T1_Get_Private_Dict( parser, psaux );\n    if ( error )\n      goto Exit;\n\n    error = parse_dict( face, &loader,\n                        parser->private_dict, parser->private_len );\n    if ( error )\n      goto Exit;\n\n    /* ensure even-ness of `num_blue_values' */\n    priv->num_blue_values &= ~1;\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n    if ( face->blend                                                     &&\n         face->blend->num_default_design_vector != 0                     &&\n         face->blend->num_default_design_vector != face->blend->num_axis )\n    {\n      /* we don't use it currently so just warn, reset, and ignore */\n      FT_ERROR(( \"T1_Open_Face(): /DesignVector contains %u entries \"\n                 \"while there are %u axes.\\n\",\n                 face->blend->num_default_design_vector,\n                 face->blend->num_axis ));\n\n      face->blend->num_default_design_vector = 0;\n    }\n\n    /* the following can happen for MM instances; we then treat the */\n    /* font as a normal PS font                                     */\n    if ( face->blend                                             &&\n         ( !face->blend->num_designs || !face->blend->num_axis ) )\n      T1_Done_Blend( face );\n\n    /* another safety check */\n    if ( face->blend )\n    {\n      FT_UInt  i;\n\n\n      for ( i = 0; i < face->blend->num_axis; i++ )\n        if ( !face->blend->design_map[i].num_points )\n        {\n          T1_Done_Blend( face );\n          break;\n        }\n    }\n\n    if ( face->blend )\n    {\n      if ( face->len_buildchar > 0 )\n      {\n        FT_Memory  memory = face->root.memory;\n\n\n        if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) )\n        {\n          FT_ERROR(( \"T1_Open_Face: cannot allocate BuildCharArray\\n\" ));\n          face->len_buildchar = 0;\n          goto Exit;\n        }\n      }\n    }\n    else\n      face->len_buildchar = 0;\n\n#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */\n\n    /* now, propagate the subrs, charstrings, and glyphnames tables */\n    /* to the Type1 data                                            */\n    type1->num_glyphs = loader.num_glyphs;\n\n    if ( loader.subrs.init )\n    {\n      loader.subrs.init  = 0;\n      type1->num_subrs   = loader.num_subrs;\n      type1->subrs_block = loader.subrs.block;\n      type1->subrs       = loader.subrs.elements;\n      type1->subrs_len   = loader.subrs.lengths;\n    }\n\n    if ( !IS_INCREMENTAL )\n      if ( !loader.charstrings.init )\n      {\n        FT_ERROR(( \"T1_Open_Face: no `/CharStrings' array in face\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n      }\n\n    loader.charstrings.init  = 0;\n    type1->charstrings_block = loader.charstrings.block;\n    type1->charstrings       = loader.charstrings.elements;\n    type1->charstrings_len   = loader.charstrings.lengths;\n\n    /* we copy the glyph names `block' and `elements' fields; */\n    /* the `lengths' field must be released later             */\n    type1->glyph_names_block    = loader.glyph_names.block;\n    type1->glyph_names          = (FT_String**)loader.glyph_names.elements;\n    loader.glyph_names.block    = 0;\n    loader.glyph_names.elements = 0;\n\n    /* we must now build type1.encoding when we have a custom array */\n    if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )\n    {\n      FT_Int    charcode, idx, min_char, max_char;\n      FT_Byte*  char_name;\n      FT_Byte*  glyph_name;\n\n\n      /* OK, we do the following: for each element in the encoding  */\n      /* table, look up the index of the glyph having the same name */\n      /* the index is then stored in type1.encoding.char_index, and */\n      /* the name to type1.encoding.char_name                       */\n\n      min_char = 0;\n      max_char = 0;\n\n      charcode = 0;\n      for ( ; charcode < loader.encoding_table.max_elems; charcode++ )\n      {\n        type1->encoding.char_index[charcode] = 0;\n        type1->encoding.char_name [charcode] = (char *)\".notdef\";\n\n        char_name = loader.encoding_table.elements[charcode];\n        if ( char_name )\n          for ( idx = 0; idx < type1->num_glyphs; idx++ )\n          {\n            glyph_name = (FT_Byte*)type1->glyph_names[idx];\n            if ( ft_strcmp( (const char*)char_name,\n                            (const char*)glyph_name ) == 0 )\n            {\n              type1->encoding.char_index[charcode] = (FT_UShort)idx;\n              type1->encoding.char_name [charcode] = (char*)glyph_name;\n\n              /* Change min/max encoded char only if glyph name is */\n              /* not /.notdef                                      */\n              if ( ft_strcmp( (const char*)\".notdef\",\n                              (const char*)glyph_name ) != 0 )\n              {\n                if ( charcode < min_char )\n                  min_char = charcode;\n                if ( charcode >= max_char )\n                  max_char = charcode + 1;\n              }\n              break;\n            }\n          }\n      }\n\n      type1->encoding.code_first = min_char;\n      type1->encoding.code_last  = max_char;\n      type1->encoding.num_chars  = loader.num_chars;\n    }\n\n  Exit:\n    t1_done_loader( &loader );\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1load.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1load.h                                                               */\n/*                                                                         */\n/*    Type 1 font loader (specification).                                  */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2004, 2006, 2007 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1LOAD_H__\n#define __T1LOAD_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n#include FT_MULTIPLE_MASTERS_H\n\n#include \"t1parse.h\"\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct  T1_Loader_\n  {\n    T1_ParserRec  parser;          /* parser used to read the stream */\n\n    FT_Int        num_chars;       /* number of characters in encoding */\n    PS_TableRec   encoding_table;  /* PS_Table used to store the       */\n                                   /* encoding character names         */\n\n    FT_Int        num_glyphs;\n    PS_TableRec   glyph_names;\n    PS_TableRec   charstrings;\n    PS_TableRec   swap_table;      /* For moving .notdef glyph to index 0. */\n\n    FT_Int        num_subrs;\n    PS_TableRec   subrs;\n    FT_Bool       fontdata;\n\n    FT_UInt       keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */\n\n  } T1_LoaderRec, *T1_Loader;\n\n\n  /* treatment of some keywords differs depending on whether */\n  /* they precede or follow certain other keywords           */\n\n#define T1_PRIVATE                ( 1 << 0 )\n#define T1_FONTDIR_AFTER_PRIVATE  ( 1 << 1 )\n\n\n  FT_LOCAL( FT_Error )\n  T1_Open_Face( T1_Face  face );\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n  FT_LOCAL( FT_Error )\n  T1_Get_Multi_Master( T1_Face           face,\n                       FT_Multi_Master*  master );\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_MM_Var( T1_Face      face,\n                 FT_MM_Var*  *master );\n\n  FT_LOCAL( FT_Error )\n  T1_Set_MM_Blend( T1_Face    face,\n                   FT_UInt    num_coords,\n                   FT_Fixed*  coords );\n\n  FT_LOCAL( FT_Error )\n  T1_Set_MM_Design( T1_Face   face,\n                    FT_UInt   num_coords,\n                    FT_Long*  coords );\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Set_Var_Design( T1_Face    face,\n                     FT_UInt    num_coords,\n                     FT_Fixed*  coords );\n\n  FT_LOCAL( void )\n  T1_Done_Blend( T1_Face  face );\n\n#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */\n\n\nFT_END_HEADER\n\n#endif /* __T1LOAD_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1objs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1objs.c                                                               */\n/*                                                                         */\n/*    Type 1 objects manager (body).                                       */\n/*                                                                         */\n/*  Copyright 1996-2009, 2011, 2013 by                                     */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_CALC_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_TRUETYPE_IDS_H\n\n#include \"t1gload.h\"\n#include \"t1load.h\"\n\n#include \"t1errors.h\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"t1afm.h\"\n#endif\n\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1objs\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SIZE FUNCTIONS                             */\n  /*                                                                       */\n  /*  note that we store the global hints in the size's \"internal\" root    */\n  /*  field                                                                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  static PSH_Globals_Funcs\n  T1_Size_Get_Globals_Funcs( T1_Size  size )\n  {\n    T1_Face           face     = (T1_Face)size->root.face;\n    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;\n    FT_Module         module;\n\n\n    module = FT_Get_Module( size->root.face->driver->root.library,\n                            \"pshinter\" );\n    return ( module && pshinter && pshinter->get_globals_funcs )\n           ? pshinter->get_globals_funcs( module )\n           : 0 ;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T1_Size_Done( FT_Size  t1size )          /* T1_Size */\n  {\n    T1_Size  size = (T1_Size)t1size;\n\n\n    if ( size->root.internal )\n    {\n      PSH_Globals_Funcs  funcs;\n\n\n      funcs = T1_Size_Get_Globals_Funcs( size );\n      if ( funcs )\n        funcs->destroy( (PSH_Globals)size->root.internal );\n\n      size->root.internal = 0;\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Size_Init( FT_Size  t1size )      /* T1_Size */\n  {\n    T1_Size            size  = (T1_Size)t1size;\n    FT_Error           error = FT_Err_Ok;\n    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );\n\n\n    if ( funcs )\n    {\n      PSH_Globals  globals;\n      T1_Face      face = (T1_Face)size->root.face;\n\n\n      error = funcs->create( size->root.face->memory,\n                             &face->type1.private_dict, &globals );\n      if ( !error )\n        size->root.internal = (FT_Size_Internal)(void*)globals;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Size_Request( FT_Size          t1size,     /* T1_Size */\n                   FT_Size_Request  req )\n  {\n    T1_Size            size  = (T1_Size)t1size;\n    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );\n\n\n    FT_Request_Metrics( size->root.face, req );\n\n    if ( funcs )\n      funcs->set_scale( (PSH_Globals)size->root.internal,\n                        size->root.metrics.x_scale,\n                        size->root.metrics.y_scale,\n                        0, 0 );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            SLOT  FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n  FT_LOCAL_DEF( void )\n  T1_GlyphSlot_Done( FT_GlyphSlot  slot )\n  {\n    slot->internal->glyph_hints = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_GlyphSlot_Init( FT_GlyphSlot  slot )\n  {\n    T1_Face           face;\n    PSHinter_Service  pshinter;\n\n\n    face     = (T1_Face)slot->face;\n    pshinter = (PSHinter_Service)face->pshinter;\n\n    if ( pshinter )\n    {\n      FT_Module  module;\n\n\n      module = FT_Get_Module( slot->face->driver->root.library,\n                              \"pshinter\" );\n      if ( module )\n      {\n        T1_Hints_Funcs  funcs;\n\n\n        funcs = pshinter->get_t1_funcs( module );\n        slot->internal->glyph_hints = (void*)funcs;\n      }\n    }\n\n    return 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                            FACE  FUNCTIONS                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    T1_Face_Done                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The face object destructor.                                        */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    face :: A typeless pointer to the face object to destroy.          */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  T1_Face_Done( FT_Face  t1face )         /* T1_Face */\n  {\n    T1_Face    face = (T1_Face)t1face;\n    FT_Memory  memory;\n    T1_Font    type1;\n\n\n    if ( !face )\n      return;\n\n    memory = face->root.memory;\n    type1  = &face->type1;\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n    /* release multiple masters information */\n    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );\n\n    if ( face->buildchar )\n    {\n      FT_FREE( face->buildchar );\n\n      face->buildchar     = NULL;\n      face->len_buildchar = 0;\n    }\n\n    T1_Done_Blend( face );\n    face->blend = 0;\n#endif\n\n    /* release font info strings */\n    {\n      PS_FontInfo  info = &type1->font_info;\n\n\n      FT_FREE( info->version );\n      FT_FREE( info->notice );\n      FT_FREE( info->full_name );\n      FT_FREE( info->family_name );\n      FT_FREE( info->weight );\n    }\n\n    /* release top dictionary */\n    FT_FREE( type1->charstrings_len );\n    FT_FREE( type1->charstrings );\n    FT_FREE( type1->glyph_names );\n\n    FT_FREE( type1->subrs );\n    FT_FREE( type1->subrs_len );\n\n    FT_FREE( type1->subrs_block );\n    FT_FREE( type1->charstrings_block );\n    FT_FREE( type1->glyph_names_block );\n\n    FT_FREE( type1->encoding.char_index );\n    FT_FREE( type1->encoding.char_name );\n    FT_FREE( type1->font_name );\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n    /* release afm data if present */\n    if ( face->afm_data )\n      T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );\n#endif\n\n    /* release unicode map, if any */\n#if 0\n    FT_FREE( face->unicode_map_rec.maps );\n    face->unicode_map_rec.num_maps = 0;\n    face->unicode_map              = NULL;\n#endif\n\n    face->root.family_name = NULL;\n    face->root.style_name  = NULL;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    T1_Face_Init                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    The face object constructor.                                       */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    stream     ::  input stream where to load font data.               */\n  /*                                                                       */\n  /*    face_index :: The index of the font face in the resource.          */\n  /*                                                                       */\n  /*    num_params :: Number of additional generic parameters.  Ignored.   */\n  /*                                                                       */\n  /*    params     :: Additional generic parameters.  Ignored.             */\n  /*                                                                       */\n  /* <InOut>                                                               */\n  /*    face       :: The face record to build.                            */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Face_Init( FT_Stream      stream,\n                FT_Face        t1face,          /* T1_Face */\n                FT_Int         face_index,\n                FT_Int         num_params,\n                FT_Parameter*  params )\n  {\n    T1_Face             face = (T1_Face)t1face;\n    FT_Error            error;\n    FT_Service_PsCMaps  psnames;\n    PSAux_Service       psaux;\n    T1_Font             type1 = &face->type1;\n    PS_FontInfo         info = &type1->font_info;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n    FT_UNUSED( stream );\n\n\n    face->root.num_faces = 1;\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );\n    face->psnames = psnames;\n\n    face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),\n                                           \"psaux\" );\n    psaux = (PSAux_Service)face->psaux;\n    if ( !psaux )\n    {\n      FT_ERROR(( \"T1_Face_Init: cannot access `psaux' module\\n\" ));\n      error = FT_THROW( Missing_Module );\n      goto Exit;\n    }\n\n    face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),\n                                              \"pshinter\" );\n\n    FT_TRACE2(( \"Type 1 driver\\n\" ));\n\n    /* open the tokenizer; this will also check the font format */\n    error = T1_Open_Face( face );\n    if ( error )\n      goto Exit;\n\n    /* if we just wanted to check the format, leave successfully now */\n    if ( face_index < 0 )\n      goto Exit;\n\n    /* check the face index */\n    if ( face_index > 0 )\n    {\n      FT_ERROR(( \"T1_Face_Init: invalid face index\\n\" ));\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* now load the font program into the face object */\n\n    /* initialize the face object fields */\n\n    /* set up root face fields */\n    {\n      FT_Face  root = (FT_Face)&face->root;\n\n\n      root->num_glyphs = type1->num_glyphs;\n      root->face_index = 0;\n\n      root->face_flags = FT_FACE_FLAG_SCALABLE    |\n                         FT_FACE_FLAG_HORIZONTAL  |\n                         FT_FACE_FLAG_GLYPH_NAMES |\n                         FT_FACE_FLAG_HINTER;\n\n      if ( info->is_fixed_pitch )\n        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      if ( face->blend )\n        root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;\n\n      /* XXX: TODO -- add kerning with .afm support */\n\n\n      /* The following code to extract the family and the style is very   */\n      /* simplistic and might get some things wrong.  For a full-featured */\n      /* algorithm you might have a look at the whitepaper given at       */\n      /*                                                                  */\n      /*   http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */\n\n      /* get style name -- be careful, some broken fonts only */\n      /* have a `/FontName' dictionary entry!                 */\n      root->family_name = info->family_name;\n      root->style_name  = NULL;\n\n      if ( root->family_name )\n      {\n        char*  full   = info->full_name;\n        char*  family = root->family_name;\n\n\n        if ( full )\n        {\n          FT_Bool  the_same = TRUE;\n\n\n          while ( *full )\n          {\n            if ( *full == *family )\n            {\n              family++;\n              full++;\n            }\n            else\n            {\n              if ( *full == ' ' || *full == '-' )\n                full++;\n              else if ( *family == ' ' || *family == '-' )\n                family++;\n              else\n              {\n                the_same = FALSE;\n\n                if ( !*family )\n                  root->style_name = full;\n                break;\n              }\n            }\n          }\n\n          if ( the_same )\n            root->style_name = (char *)\"Regular\";\n        }\n      }\n      else\n      {\n        /* do we have a `/FontName'? */\n        if ( type1->font_name )\n          root->family_name = type1->font_name;\n      }\n\n      if ( !root->style_name )\n      {\n        if ( info->weight )\n          root->style_name = info->weight;\n        else\n          /* assume `Regular' style because we don't know better */\n          root->style_name = (char *)\"Regular\";\n      }\n\n      /* compute style flags */\n      root->style_flags = 0;\n      if ( info->italic_angle )\n        root->style_flags |= FT_STYLE_FLAG_ITALIC;\n      if ( info->weight )\n      {\n        if ( !ft_strcmp( info->weight, \"Bold\"  ) ||\n             !ft_strcmp( info->weight, \"Black\" ) )\n          root->style_flags |= FT_STYLE_FLAG_BOLD;\n      }\n\n      /* no embedded bitmap support */\n      root->num_fixed_sizes = 0;\n      root->available_sizes = 0;\n\n      root->bbox.xMin =   type1->font_bbox.xMin            >> 16;\n      root->bbox.yMin =   type1->font_bbox.yMin            >> 16;\n      /* no `U' suffix here to 0xFFFF! */\n      root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16;\n      root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16;\n\n      /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */\n      if ( !root->units_per_EM )\n        root->units_per_EM = 1000;\n\n      root->ascender  = (FT_Short)( root->bbox.yMax );\n      root->descender = (FT_Short)( root->bbox.yMin );\n\n      root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 );\n      if ( root->height < root->ascender - root->descender )\n        root->height = (FT_Short)( root->ascender - root->descender );\n\n      /* now compute the maximum advance width */\n      root->max_advance_width =\n        (FT_Short)( root->bbox.xMax );\n      {\n        FT_Pos  max_advance;\n\n\n        error = T1_Compute_Max_Advance( face, &max_advance );\n\n        /* in case of error, keep the standard width */\n        if ( !error )\n          root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance );\n        else\n          error = FT_Err_Ok;   /* clear error */\n      }\n\n      root->max_advance_height = root->height;\n\n      root->underline_position  = (FT_Short)info->underline_position;\n      root->underline_thickness = (FT_Short)info->underline_thickness;\n    }\n\n    {\n      FT_Face  root = &face->root;\n\n\n      if ( psnames )\n      {\n        FT_CharMapRec    charmap;\n        T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;\n        FT_CMap_Class    clazz;\n\n\n        charmap.face = root;\n\n        /* first of all, try to synthesize a Unicode charmap */\n        charmap.platform_id = TT_PLATFORM_MICROSOFT;\n        charmap.encoding_id = TT_MS_ID_UNICODE_CS;\n        charmap.encoding    = FT_ENCODING_UNICODE;\n\n        error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );\n        if ( error                                      &&\n             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )\n          goto Exit;\n        error = FT_Err_Ok;\n\n        /* now, generate an Adobe Standard encoding when appropriate */\n        charmap.platform_id = TT_PLATFORM_ADOBE;\n        clazz               = NULL;\n\n        switch ( type1->encoding_type )\n        {\n        case T1_ENCODING_TYPE_STANDARD:\n          charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;\n          charmap.encoding_id = TT_ADOBE_ID_STANDARD;\n          clazz               = cmap_classes->standard;\n          break;\n\n        case T1_ENCODING_TYPE_EXPERT:\n          charmap.encoding    = FT_ENCODING_ADOBE_EXPERT;\n          charmap.encoding_id = TT_ADOBE_ID_EXPERT;\n          clazz               = cmap_classes->expert;\n          break;\n\n        case T1_ENCODING_TYPE_ARRAY:\n          charmap.encoding    = FT_ENCODING_ADOBE_CUSTOM;\n          charmap.encoding_id = TT_ADOBE_ID_CUSTOM;\n          clazz               = cmap_classes->custom;\n          break;\n\n        case T1_ENCODING_TYPE_ISOLATIN1:\n          charmap.encoding    = FT_ENCODING_ADOBE_LATIN_1;\n          charmap.encoding_id = TT_ADOBE_ID_LATIN_1;\n          clazz               = cmap_classes->unicode;\n          break;\n\n        default:\n          ;\n        }\n\n        if ( clazz )\n          error = FT_CMap_New( clazz, NULL, &charmap, NULL );\n\n#if 0\n        /* Select default charmap */\n        if (root->num_charmaps)\n          root->charmap = root->charmaps[0];\n#endif\n      }\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    T1_Driver_Init                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given Type 1 driver object.                          */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target driver object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  T1_Driver_Init( FT_Module  driver )\n  {\n    FT_UNUSED( driver );\n\n    return FT_Err_Ok;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    T1_Driver_Done                                                     */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Finalizes a given Type 1 driver.                                   */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target Type 1 driver.                    */\n  /*                                                                       */\n  FT_LOCAL_DEF( void )\n  T1_Driver_Done( FT_Module  driver )\n  {\n    FT_UNUSED( driver );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1objs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1objs.h                                                               */\n/*                                                                         */\n/*    Type 1 objects manager (specification).                              */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2006, 2011 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1OBJS_H__\n#define __T1OBJS_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_OBJECTS_H\n#include FT_CONFIG_CONFIG_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n\n\nFT_BEGIN_HEADER\n\n\n  /* The following structures must be defined by the hinter */\n  typedef struct T1_Size_Hints_   T1_Size_Hints;\n  typedef struct T1_Glyph_Hints_  T1_Glyph_Hints;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_Size                                                            */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 size object.                                  */\n  /*                                                                       */\n  typedef struct T1_SizeRec_*  T1_Size;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_GlyphSlot                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 glyph slot object.                            */\n  /*                                                                       */\n  typedef struct T1_GlyphSlotRec_*  T1_GlyphSlot;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_CharMap                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A handle to a Type 1 character mapping object.                     */\n  /*                                                                       */\n  /* <Note>                                                                */\n  /*    The Type 1 format doesn't use a charmap but an encoding table.     */\n  /*    The driver is responsible for making up charmap objects            */\n  /*    corresponding to these tables.                                     */\n  /*                                                                       */\n  typedef struct T1_CharMapRec_*   T1_CharMap;\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                  HERE BEGINS THE TYPE1 SPECIFIC STUFF                 */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_SizeRec                                                         */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Type 1 size record.                                                */\n  /*                                                                       */\n  typedef struct  T1_SizeRec_\n  {\n    FT_SizeRec  root;\n\n  } T1_SizeRec;\n\n\n  FT_LOCAL( void )\n  T1_Size_Done( FT_Size  size );\n\n  FT_LOCAL( FT_Error )\n  T1_Size_Request( FT_Size          size,\n                   FT_Size_Request  req );\n\n  FT_LOCAL( FT_Error )\n  T1_Size_Init( FT_Size  size );\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Type>                                                                */\n  /*    T1_GlyphSlotRec                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Type 1 glyph slot record.                                          */\n  /*                                                                       */\n  typedef struct  T1_GlyphSlotRec_\n  {\n    FT_GlyphSlotRec  root;\n\n    FT_Bool          hint;\n    FT_Bool          scaled;\n\n    FT_Int           max_points;\n    FT_Int           max_contours;\n\n    FT_Fixed         x_scale;\n    FT_Fixed         y_scale;\n\n  } T1_GlyphSlotRec;\n\n\n  FT_LOCAL( FT_Error )\n  T1_Face_Init( FT_Stream      stream,\n                FT_Face        face,\n                FT_Int         face_index,\n                FT_Int         num_params,\n                FT_Parameter*  params );\n\n  FT_LOCAL( void )\n  T1_Face_Done( FT_Face  face );\n\n  FT_LOCAL( FT_Error )\n  T1_GlyphSlot_Init( FT_GlyphSlot  slot );\n\n  FT_LOCAL( void )\n  T1_GlyphSlot_Done( FT_GlyphSlot  slot );\n\n  FT_LOCAL( FT_Error )\n  T1_Driver_Init( FT_Module  driver );\n\n  FT_LOCAL( void )\n  T1_Driver_Done( FT_Module  driver );\n\n\nFT_END_HEADER\n\n#endif /* __T1OBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1parse.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1parse.c                                                              */\n/*                                                                         */\n/*    Type 1 parser (body).                                                */\n/*                                                                         */\n/*  Copyright 1996-2005, 2008, 2009, 2012, 2013 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The Type 1 parser is in charge of the following:                      */\n  /*                                                                       */\n  /*  - provide an implementation of a growing sequence of objects called  */\n  /*    a `T1_Table' (used to build various tables needed by the loader).  */\n  /*                                                                       */\n  /*  - opening .pfb and .pfa files to extract their top-level and private */\n  /*    dictionaries.                                                      */\n  /*                                                                       */\n  /*  - read numbers, arrays & strings from any dictionary.                */\n  /*                                                                       */\n  /* See `t1load.c' to see how data is loaded from the font file.          */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n#include \"t1parse.h\"\n\n#include \"t1errors.h\"\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t1parse\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*****                                                               *****/\n  /*****                   INPUT STREAM PARSER                         *****/\n  /*****                                                               *****/\n  /*************************************************************************/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /* see Adobe Technical Note 5040.Download_Fonts.pdf */\n\n  static FT_Error\n  read_pfb_tag( FT_Stream   stream,\n                FT_UShort  *atag,\n                FT_ULong   *asize )\n  {\n    FT_Error   error;\n    FT_UShort  tag;\n    FT_ULong   size;\n\n\n    *atag  = 0;\n    *asize = 0;\n\n    if ( !FT_READ_USHORT( tag ) )\n    {\n      if ( tag == 0x8001U || tag == 0x8002U )\n      {\n        if ( !FT_READ_ULONG_LE( size ) )\n          *asize = size;\n      }\n\n      *atag = tag;\n    }\n\n    return error;\n  }\n\n\n  static FT_Error\n  check_type1_format( FT_Stream    stream,\n                      const char*  header_string,\n                      size_t       header_length )\n  {\n    FT_Error   error;\n    FT_UShort  tag;\n    FT_ULong   dummy;\n\n\n    if ( FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    error = read_pfb_tag( stream, &tag, &dummy );\n    if ( error )\n      goto Exit;\n\n    /* We assume that the first segment in a PFB is always encoded as   */\n    /* text.  This might be wrong (and the specification doesn't insist */\n    /* on that), but we have never seen a counterexample.               */\n    if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    if ( !FT_FRAME_ENTER( header_length ) )\n    {\n      error = FT_Err_Ok;\n\n      if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 )\n        error = FT_THROW( Unknown_File_Format );\n\n      FT_FRAME_EXIT();\n    }\n\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_New_Parser( T1_Parser      parser,\n                 FT_Stream      stream,\n                 FT_Memory      memory,\n                 PSAux_Service  psaux )\n  {\n    FT_Error   error;\n    FT_UShort  tag;\n    FT_ULong   size;\n\n\n    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );\n\n    parser->stream       = stream;\n    parser->base_len     = 0;\n    parser->base_dict    = 0;\n    parser->private_len  = 0;\n    parser->private_dict = 0;\n    parser->in_pfb       = 0;\n    parser->in_memory    = 0;\n    parser->single_block = 0;\n\n    /* check the header format */\n    error = check_type1_format( stream, \"%!PS-AdobeFont\", 14 );\n    if ( error )\n    {\n      if ( FT_ERR_NEQ( error, Unknown_File_Format ) )\n        goto Exit;\n\n      error = check_type1_format( stream, \"%!FontType\", 10 );\n      if ( error )\n      {\n        FT_TRACE2(( \"  not a Type 1 font\\n\" ));\n        goto Exit;\n      }\n    }\n\n    /******************************************************************/\n    /*                                                                */\n    /* Here a short summary of what is going on:                      */\n    /*                                                                */\n    /*   When creating a new Type 1 parser, we try to locate and load */\n    /*   the base dictionary if this is possible (i.e., for PFB       */\n    /*   files).  Otherwise, we load the whole font into memory.      */\n    /*                                                                */\n    /*   When `loading' the base dictionary, we only setup pointers   */\n    /*   in the case of a memory-based stream.  Otherwise, we         */\n    /*   allocate and load the base dictionary in it.                 */\n    /*                                                                */\n    /*   parser->in_pfb is set if we are in a binary (`.pfb') font.   */\n    /*   parser->in_memory is set if we have a memory stream.         */\n    /*                                                                */\n\n    /* try to compute the size of the base dictionary;     */\n    /* look for a Postscript binary file tag, i.e., 0x8001 */\n    if ( FT_STREAM_SEEK( 0L ) )\n      goto Exit;\n\n    error = read_pfb_tag( stream, &tag, &size );\n    if ( error )\n      goto Exit;\n\n    if ( tag != 0x8001U )\n    {\n      /* assume that this is a PFA file for now; an error will */\n      /* be produced later when more things are checked        */\n      if ( FT_STREAM_SEEK( 0L ) )\n        goto Exit;\n      size = stream->size;\n    }\n    else\n      parser->in_pfb = 1;\n\n    /* now, try to load `size' bytes of the `base' dictionary we */\n    /* found previously                                          */\n\n    /* if it is a memory-based resource, set up pointers */\n    if ( !stream->read )\n    {\n      parser->base_dict = (FT_Byte*)stream->base + stream->pos;\n      parser->base_len  = size;\n      parser->in_memory = 1;\n\n      /* check that the `size' field is valid */\n      if ( FT_STREAM_SKIP( size ) )\n        goto Exit;\n    }\n    else\n    {\n      /* read segment in memory -- this is clumsy, but so does the format */\n      if ( FT_ALLOC( parser->base_dict, size )       ||\n           FT_STREAM_READ( parser->base_dict, size ) )\n        goto Exit;\n      parser->base_len = size;\n    }\n\n    parser->root.base   = parser->base_dict;\n    parser->root.cursor = parser->base_dict;\n    parser->root.limit  = parser->root.cursor + parser->base_len;\n\n  Exit:\n    if ( error && !parser->in_memory )\n      FT_FREE( parser->base_dict );\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T1_Finalize_Parser( T1_Parser  parser )\n  {\n    FT_Memory  memory = parser->root.memory;\n\n\n    /* always free the private dictionary */\n    FT_FREE( parser->private_dict );\n\n    /* free the base dictionary only when we have a disk stream */\n    if ( !parser->in_memory )\n      FT_FREE( parser->base_dict );\n\n    parser->root.funcs.done( &parser->root );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T1_Get_Private_Dict( T1_Parser      parser,\n                       PSAux_Service  psaux )\n  {\n    FT_Stream  stream = parser->stream;\n    FT_Memory  memory = parser->root.memory;\n    FT_Error   error  = FT_Err_Ok;\n    FT_ULong   size;\n\n\n    if ( parser->in_pfb )\n    {\n      /* in the case of the PFB format, the private dictionary can be  */\n      /* made of several segments.  We thus first read the number of   */\n      /* segments to compute the total size of the private dictionary  */\n      /* then re-read them into memory.                                */\n      FT_Long    start_pos = FT_STREAM_POS();\n      FT_UShort  tag;\n\n\n      parser->private_len = 0;\n      for (;;)\n      {\n        error = read_pfb_tag( stream, &tag, &size );\n        if ( error )\n          goto Fail;\n\n        if ( tag != 0x8002U )\n          break;\n\n        parser->private_len += size;\n\n        if ( FT_STREAM_SKIP( size ) )\n          goto Fail;\n      }\n\n      /* Check that we have a private dictionary there */\n      /* and allocate private dictionary buffer        */\n      if ( parser->private_len == 0 )\n      {\n        FT_ERROR(( \"T1_Get_Private_Dict:\"\n                   \" invalid private dictionary section\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Fail;\n      }\n\n      if ( FT_STREAM_SEEK( start_pos )                           ||\n           FT_ALLOC( parser->private_dict, parser->private_len ) )\n        goto Fail;\n\n      parser->private_len = 0;\n      for (;;)\n      {\n        error = read_pfb_tag( stream, &tag, &size );\n        if ( error || tag != 0x8002U )\n        {\n          error = FT_Err_Ok;\n          break;\n        }\n\n        if ( FT_STREAM_READ( parser->private_dict + parser->private_len,\n                             size ) )\n          goto Fail;\n\n        parser->private_len += size;\n      }\n    }\n    else\n    {\n      /* We have already `loaded' the whole PFA font file into memory; */\n      /* if this is a memory resource, allocate a new block to hold    */\n      /* the private dict.  Otherwise, simply overwrite into the base  */\n      /* dictionary block in the heap.                                 */\n\n      /* first of all, look at the `eexec' keyword */\n      FT_Byte*  cur   = parser->base_dict;\n      FT_Byte*  limit = cur + parser->base_len;\n      FT_Byte   c;\n\n\n    Again:\n      for (;;)\n      {\n        c = cur[0];\n        if ( c == 'e' && cur + 9 < limit )  /* 9 = 5 letters for `eexec' + */\n                                            /* whitespace + 4 chars        */\n        {\n          if ( cur[1] == 'e' &&\n               cur[2] == 'x' &&\n               cur[3] == 'e' &&\n               cur[4] == 'c' )\n            break;\n        }\n        cur++;\n        if ( cur >= limit )\n        {\n          FT_ERROR(( \"T1_Get_Private_Dict:\"\n                     \" could not find `eexec' keyword\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n      }\n\n      /* check whether `eexec' was real -- it could be in a comment */\n      /* or string (as e.g. in u003043t.gsf from ghostscript)       */\n\n      parser->root.cursor = parser->base_dict;\n      /* set limit to `eexec' + whitespace + 4 characters */\n      parser->root.limit  = cur + 10;\n\n      cur   = parser->root.cursor;\n      limit = parser->root.limit;\n\n      while ( cur < limit )\n      {\n        if ( *cur == 'e' && ft_strncmp( (char*)cur, \"eexec\", 5 ) == 0 )\n          goto Found;\n\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          break;\n        T1_Skip_Spaces  ( parser );\n        cur = parser->root.cursor;\n      }\n\n      /* we haven't found the correct `eexec'; go back and continue */\n      /* searching                                                  */\n\n      cur   = limit;\n      limit = parser->base_dict + parser->base_len;\n      goto Again;\n\n      /* now determine where to write the _encrypted_ binary private  */\n      /* dictionary.  We overwrite the base dictionary for disk-based */\n      /* resources and allocate a new block otherwise                 */\n\n    Found:\n      parser->root.limit = parser->base_dict + parser->base_len;\n\n      T1_Skip_PS_Token( parser );\n      cur   = parser->root.cursor;\n      limit = parser->root.limit;\n\n      /* according to the Type1 spec, the first cipher byte must not be  */\n      /* an ASCII whitespace character code (blank, tab, carriage return */\n      /* or line feed).  We have seen Type 1 fonts with two line feed    */\n      /* characters...  So skip now all whitespace character codes.      */\n      while ( cur < limit       &&\n              ( *cur == ' '  ||\n                *cur == '\\t' ||\n                *cur == '\\r' ||\n                *cur == '\\n' ) )\n        ++cur;\n      if ( cur >= limit )\n      {\n        FT_ERROR(( \"T1_Get_Private_Dict:\"\n                   \" `eexec' not properly terminated\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      size = parser->base_len - ( cur - parser->base_dict );\n\n      if ( parser->in_memory )\n      {\n        /* note that we allocate one more byte to put a terminating `0' */\n        if ( FT_ALLOC( parser->private_dict, size + 1 ) )\n          goto Fail;\n        parser->private_len = size;\n      }\n      else\n      {\n        parser->single_block = 1;\n        parser->private_dict = parser->base_dict;\n        parser->private_len  = size;\n        parser->base_dict    = 0;\n        parser->base_len     = 0;\n      }\n\n      /* now determine whether the private dictionary is encoded in binary */\n      /* or hexadecimal ASCII format -- decode it accordingly              */\n\n      /* we need to access the next 4 bytes (after the final whitespace */\n      /* following the `eexec' keyword); if they all are hexadecimal    */\n      /* digits, then we have a case of ASCII storage                   */\n\n      if ( cur + 3 < limit                                &&\n           ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) &&\n           ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) )\n      {\n        /* ASCII hexadecimal encoding */\n        FT_Long  len;\n\n\n        parser->root.cursor = cur;\n        (void)psaux->ps_parser_funcs->to_bytes( &parser->root,\n                                                parser->private_dict,\n                                                parser->private_len,\n                                                &len,\n                                                0 );\n        parser->private_len = len;\n\n        /* put a safeguard */\n        parser->private_dict[len] = '\\0';\n      }\n      else\n        /* binary encoding -- copy the private dict */\n        FT_MEM_MOVE( parser->private_dict, cur, size );\n    }\n\n    /* we now decrypt the encoded binary private dictionary */\n    psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U );\n\n    if ( parser->private_len < 4 )\n    {\n      FT_ERROR(( \"T1_Get_Private_Dict:\"\n                 \" invalid private dictionary section\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    /* replace the four random bytes at the beginning with whitespace */\n    parser->private_dict[0] = ' ';\n    parser->private_dict[1] = ' ';\n    parser->private_dict[2] = ' ';\n    parser->private_dict[3] = ' ';\n\n    parser->root.base   = parser->private_dict;\n    parser->root.cursor = parser->private_dict;\n    parser->root.limit  = parser->root.cursor + parser->private_len;\n\n  Fail:\n  Exit:\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1parse.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1parse.h                                                              */\n/*                                                                         */\n/*    Type 1 parser (specification).                                       */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2008 by                               */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T1PARSE_H__\n#define __T1PARSE_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_TYPE1_TYPES_H\n#include FT_INTERNAL_STREAM_H\n\n\nFT_BEGIN_HEADER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Struct>                                                              */\n  /*    T1_ParserRec                                                       */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    A PS_ParserRec is an object used to parse a Type 1 fonts very      */\n  /*    quickly.                                                           */\n  /*                                                                       */\n  /* <Fields>                                                              */\n  /*    root         :: The root parser.                                   */\n  /*                                                                       */\n  /*    stream       :: The current input stream.                          */\n  /*                                                                       */\n  /*    base_dict    :: A pointer to the top-level dictionary.             */\n  /*                                                                       */\n  /*    base_len     :: The length in bytes of the top dictionary.         */\n  /*                                                                       */\n  /*    private_dict :: A pointer to the private dictionary.               */\n  /*                                                                       */\n  /*    private_len  :: The length in bytes of the private dictionary.     */\n  /*                                                                       */\n  /*    in_pfb       :: A boolean.  Indicates that we are handling a PFB   */\n  /*                    file.                                              */\n  /*                                                                       */\n  /*    in_memory    :: A boolean.  Indicates a memory-based stream.       */\n  /*                                                                       */\n  /*    single_block :: A boolean.  Indicates that the private dictionary  */\n  /*                    is stored in lieu of the base dictionary.          */\n  /*                                                                       */\n  typedef struct  T1_ParserRec_\n  {\n    PS_ParserRec  root;\n    FT_Stream     stream;\n\n    FT_Byte*      base_dict;\n    FT_ULong      base_len;\n\n    FT_Byte*      private_dict;\n    FT_ULong      private_len;\n\n    FT_Bool       in_pfb;\n    FT_Bool       in_memory;\n    FT_Bool       single_block;\n\n  } T1_ParserRec, *T1_Parser;\n\n\n#define T1_Add_Table( p, i, o, l )  (p)->funcs.add( (p), i, o, l )\n#define T1_Done_Table( p )          \\\n          do                        \\\n          {                         \\\n            if ( (p)->funcs.done )  \\\n              (p)->funcs.done( p ); \\\n          } while ( 0 )\n#define T1_Release_Table( p )          \\\n          do                           \\\n          {                            \\\n            if ( (p)->funcs.release )  \\\n              (p)->funcs.release( p ); \\\n          } while ( 0 )\n\n\n#define T1_Skip_Spaces( p )    (p)->root.funcs.skip_spaces( &(p)->root )\n#define T1_Skip_PS_Token( p )  (p)->root.funcs.skip_PS_token( &(p)->root )\n\n#define T1_ToInt( p )       (p)->root.funcs.to_int( &(p)->root )\n#define T1_ToFixed( p, t )  (p)->root.funcs.to_fixed( &(p)->root, t )\n\n#define T1_ToCoordArray( p, m, c )                           \\\n          (p)->root.funcs.to_coord_array( &(p)->root, m, c )\n#define T1_ToFixedArray( p, m, f, t )                           \\\n          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )\n#define T1_ToToken( p, t )                          \\\n          (p)->root.funcs.to_token( &(p)->root, t )\n#define T1_ToTokenArray( p, t, m, c )                           \\\n          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )\n\n#define T1_Load_Field( p, f, o, m, pf )                         \\\n          (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )\n\n#define T1_Load_Field_Table( p, f, o, m, pf )                         \\\n          (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )\n\n\n  FT_LOCAL( FT_Error )\n  T1_New_Parser( T1_Parser      parser,\n                 FT_Stream      stream,\n                 FT_Memory      memory,\n                 PSAux_Service  psaux );\n\n  FT_LOCAL( FT_Error )\n  T1_Get_Private_Dict( T1_Parser      parser,\n                       PSAux_Service  psaux );\n\n  FT_LOCAL( void )\n  T1_Finalize_Parser( T1_Parser  parser );\n\n\nFT_END_HEADER\n\n#endif /* __T1PARSE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/t1tokens.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t1tokens.h                                                             */\n/*                                                                         */\n/*    Type 1 tokenizer (specification).                                    */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by             */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_FontInfoRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_INFO\n\n  T1_FIELD_STRING( \"version\",            version,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_STRING( \"Notice\",             notice,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_STRING( \"FullName\",           full_name,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_STRING( \"FamilyName\",         family_name,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_STRING( \"Weight\",             weight,\n                   T1_FIELD_DICT_FONTDICT )\n\n  /* we use pointers to detect modifications made by synthetic fonts */\n  T1_FIELD_NUM   ( \"ItalicAngle\",        italic_angle,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_BOOL  ( \"isFixedPitch\",       is_fixed_pitch,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_NUM   ( \"UnderlinePosition\",  underline_position,\n                   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_NUM   ( \"UnderlineThickness\", underline_thickness,\n                   T1_FIELD_DICT_FONTDICT )\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_FontExtraRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA\n\n  T1_FIELD_NUM   ( \"FSType\", fs_type,\n                   T1_FIELD_DICT_FONTDICT )\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_PrivateRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_PRIVATE\n\n  T1_FIELD_NUM       ( \"UniqueID\",         unique_id,\n                       T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"lenIV\",            lenIV,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"LanguageGroup\",    language_group,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"password\",         password,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_FIXED_1000( \"BlueScale\",        blue_scale,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"BlueShift\",        blue_shift,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM       ( \"BlueFuzz\",         blue_fuzz,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_NUM_TABLE ( \"BlueValues\",       blue_values,        14,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE ( \"OtherBlues\",       other_blues,        10,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE ( \"FamilyBlues\",      family_blues,       14,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE ( \"FamilyOtherBlues\", family_other_blues, 10,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_NUM_TABLE2( \"StdHW\",            standard_width,      1,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE2( \"StdVW\",            standard_height,     1,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE2( \"MinFeature\",       min_feature,         2,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_NUM_TABLE ( \"StemSnapH\",        snap_widths,        12,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM_TABLE ( \"StemSnapV\",        snap_heights,       12,\n                       T1_FIELD_DICT_PRIVATE )\n\n  T1_FIELD_FIXED     ( \"ExpansionFactor\",  expansion_factor,\n                       T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_BOOL      ( \"ForceBold\",        force_bold,\n                       T1_FIELD_DICT_PRIVATE )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  T1_FontRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_DICT\n\n  T1_FIELD_KEY  ( \"FontName\",    font_name,    T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_NUM  ( \"PaintType\",   paint_type,   T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_NUM  ( \"FontType\",    font_type,    T1_FIELD_DICT_FONTDICT )\n  T1_FIELD_FIXED( \"StrokeWidth\", stroke_width, T1_FIELD_DICT_FONTDICT )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  FT_BBox\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_BBOX\n\n  T1_FIELD_BBOX( \"FontBBox\", xMin, T1_FIELD_DICT_FONTDICT )\n\n\n#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  T1_FaceRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FACE\n\n  T1_FIELD_NUM( \"NDV\", ndv_idx, T1_FIELD_DICT_PRIVATE )\n  T1_FIELD_NUM( \"CDV\", cdv_idx, T1_FIELD_DICT_PRIVATE )\n\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_BlendRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_BLEND\n\n  T1_FIELD_NUM_TABLE( \"DesignVector\", default_design_vector,\n                      T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT )\n\n\n#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type1/type1.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  type1.c                                                                */\n/*                                                                         */\n/*    FreeType Type 1 driver component (body only).                        */\n/*                                                                         */\n/*  Copyright 1996-2001 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"t1parse.c\"\n#include \"t1load.c\"\n#include \"t1objs.c\"\n#include \"t1driver.c\"\n#include \"t1gload.c\"\n\n#ifndef T1_CONFIG_OPTION_NO_AFM\n#include \"t1afm.c\"\n#endif\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type42/Jamfile",
    "content": "# FreeType 2 src/type42 Jamfile\n#\n# Copyright 2002 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) type42 ;\n\n{\n  local  _sources ;\n\n  if $(FT2_MULTI)\n  {\n    _sources = t42objs t42parse t42drivr ;\n  }\n  else\n  {\n    _sources = type42 ;\n  }\n\n  Library  $(FT2_LIB) : $(_sources).c ;\n}\n\n# end of src/type42 Jamfile\n"
  },
  {
    "path": "libs/freetype/src/type42/module.mk",
    "content": "#\n# FreeType 2 Type42 module definition\n#\n\n\n# Copyright 2002, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += TYPE42_DRIVER\n\ndefine TYPE42_DRIVER\n$(OPEN_DRIVER) FT_Driver_ClassRec, t42_driver_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)type42    $(ECHO_DRIVER_DESC)Type 42 font files with no known extension$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/type42/rules.mk",
    "content": "#\n# FreeType 2 Type42 driver configuration rules\n#\n\n\n# Copyright 2002, 2003, 2008 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# Type42 driver directory\n#\nT42_DIR := $(SRC_DIR)/type42\n\n\n# compilation flags for the driver\n#\nT42_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T42_DIR))\n\n\n# Type42 driver source\n#\nT42_DRV_SRC := $(T42_DIR)/t42objs.c  \\\n               $(T42_DIR)/t42parse.c \\\n               $(T42_DIR)/t42drivr.c\n\n# Type42 driver headers\n#\nT42_DRV_H := $(T42_DRV_SRC:%.c=%.h) \\\n             $(T42_DIR)/t42error.h  \\\n             $(T42_DIR)/t42types.h\n\n\n# Type42 driver object(s)\n#\n#   T42_DRV_OBJ_M is used during `multi' builds\n#   T42_DRV_OBJ_S is used during `single' builds\n#\nT42_DRV_OBJ_M := $(T42_DRV_SRC:$(T42_DIR)/%.c=$(OBJ_DIR)/%.$O)\nT42_DRV_OBJ_S := $(OBJ_DIR)/type42.$O\n\n# Type42 driver source file for single build\n#\nT42_DRV_SRC_S := $(T42_DIR)/type42.c\n\n\n# Type42 driver - single object\n#\n$(T42_DRV_OBJ_S): $(T42_DRV_SRC_S) $(T42_DRV_SRC) $(FREETYPE_H) $(T42_DRV_H)\n\t$(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T42_DRV_SRC_S))\n\n\n# Type42 driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(T42_DIR)/%.c $(FREETYPE_H) $(T42_DRV_H)\n\t$(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(T42_DRV_OBJ_S)\nDRV_OBJS_M += $(T42_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/type42/t42drivr.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t42drivr.c                                                             */\n/*                                                                         */\n/*    High-level Type 42 driver interface (body).                          */\n/*                                                                         */\n/*  Copyright 2002-2004, 2006, 2007, 2009, 2011, 2013 by                   */\n/*  Roberto Alameda.                                                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This driver implements Type42 fonts as described in the               */\n  /* Technical Note #5012 from Adobe, with these limitations:              */\n  /*                                                                       */\n  /* 1) CID Fonts are not currently supported.                             */\n  /* 2) Incremental fonts making use of the GlyphDirectory keyword         */\n  /*    will be loaded, but the rendering will be using the TrueType       */\n  /*    tables.                                                            */\n  /* 3) As for Type1 fonts, CDevProc is not supported.                     */\n  /* 4) The Metrics dictionary is not supported.                           */\n  /* 5) AFM metrics are not supported.                                     */\n  /*                                                                       */\n  /* In other words, this driver supports Type42 fonts derived from        */\n  /* TrueType fonts in a non-CID manner, as done by usual conversion       */\n  /* programs.                                                             */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#include \"t42drivr.h\"\n#include \"t42objs.h\"\n#include \"t42error.h\"\n#include FT_INTERNAL_DEBUG_H\n\n#include FT_SERVICE_XFREE86_NAME_H\n#include FT_SERVICE_GLYPH_DICT_H\n#include FT_SERVICE_POSTSCRIPT_NAME_H\n#include FT_SERVICE_POSTSCRIPT_INFO_H\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t42\n\n\n  /*\n   *\n   *  GLYPH DICT SERVICE\n   *\n   */\n\n  static FT_Error\n  t42_get_glyph_name( T42_Face    face,\n                      FT_UInt     glyph_index,\n                      FT_Pointer  buffer,\n                      FT_UInt     buffer_max )\n  {\n    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_UInt\n  t42_get_name_index( T42_Face    face,\n                      FT_String*  glyph_name )\n  {\n    FT_Int      i;\n    FT_String*  gname;\n\n\n    for ( i = 0; i < face->type1.num_glyphs; i++ )\n    {\n      gname = face->type1.glyph_names[i];\n\n      if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) )\n        return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] );\n    }\n\n    return 0;\n  }\n\n\n  static const FT_Service_GlyphDictRec  t42_service_glyph_dict =\n  {\n    (FT_GlyphDict_GetNameFunc)  t42_get_glyph_name,\n    (FT_GlyphDict_NameIndexFunc)t42_get_name_index\n  };\n\n\n  /*\n   *\n   *  POSTSCRIPT NAME SERVICE\n   *\n   */\n\n  static const char*\n  t42_get_ps_font_name( T42_Face  face )\n  {\n    return (const char*)face->type1.font_name;\n  }\n\n\n  static const FT_Service_PsFontNameRec  t42_service_ps_font_name =\n  {\n    (FT_PsName_GetFunc)t42_get_ps_font_name\n  };\n\n\n  /*\n   *\n   *  POSTSCRIPT INFO SERVICE\n   *\n   */\n\n  static FT_Error\n  t42_ps_get_font_info( FT_Face          face,\n                        PS_FontInfoRec*  afont_info )\n  {\n    *afont_info = ((T42_Face)face)->type1.font_info;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  t42_ps_get_font_extra( FT_Face           face,\n                         PS_FontExtraRec*  afont_extra )\n  {\n    *afont_extra = ((T42_Face)face)->type1.font_extra;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Int\n  t42_ps_has_glyph_names( FT_Face  face )\n  {\n    FT_UNUSED( face );\n\n    return 1;\n  }\n\n\n  static FT_Error\n  t42_ps_get_font_private( FT_Face         face,\n                           PS_PrivateRec*  afont_private )\n  {\n    *afont_private = ((T42_Face)face)->type1.private_dict;\n\n    return FT_Err_Ok;\n  }\n\n\n  static const FT_Service_PsInfoRec  t42_service_ps_info =\n  {\n    (PS_GetFontInfoFunc)   t42_ps_get_font_info,\n    (PS_GetFontExtraFunc)  t42_ps_get_font_extra,\n    (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names,\n    (PS_GetFontPrivateFunc)t42_ps_get_font_private,\n    (PS_GetFontValueFunc)  NULL             /* not implemented */\n  };\n\n\n  /*\n   *\n   *  SERVICE LIST\n   *\n   */\n\n  static const FT_ServiceDescRec  t42_services[] =\n  {\n    { FT_SERVICE_ID_GLYPH_DICT,           &t42_service_glyph_dict },\n    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t42_service_ps_font_name },\n    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t42_service_ps_info },\n    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_TYPE_42 },\n    { NULL, NULL }\n  };\n\n\n  FT_CALLBACK_DEF( FT_Module_Interface )\n  T42_Get_Interface( FT_Module         module,\n                     const FT_String*  t42_interface )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( t42_services, t42_interface );\n  }\n\n\n  const FT_Driver_ClassRec  t42_driver_class =\n  {\n    {\n      FT_MODULE_FONT_DRIVER       |\n      FT_MODULE_DRIVER_SCALABLE   |\n#ifdef TT_USE_BYTECODE_INTERPRETER\n      FT_MODULE_DRIVER_HAS_HINTER,\n#else\n      0,\n#endif\n\n      sizeof ( T42_DriverRec ),\n\n      \"type42\",\n      0x10000L,\n      0x20000L,\n\n      0,    /* format interface */\n\n      T42_Driver_Init,\n      T42_Driver_Done,\n      T42_Get_Interface,\n    },\n\n    sizeof ( T42_FaceRec ),\n    sizeof ( T42_SizeRec ),\n    sizeof ( T42_GlyphSlotRec ),\n\n    T42_Face_Init,\n    T42_Face_Done,\n    T42_Size_Init,\n    T42_Size_Done,\n    T42_GlyphSlot_Init,\n    T42_GlyphSlot_Done,\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    ft_stub_set_char_sizes,\n    ft_stub_set_pixel_sizes,\n#endif\n    T42_GlyphSlot_Load,\n\n    0,                 /* FT_Face_GetKerningFunc  */\n    0,                 /* FT_Face_AttachFunc      */\n\n    0,                 /* FT_Face_GetAdvancesFunc */\n    T42_Size_Request,\n    T42_Size_Select\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type42/t42drivr.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t42drivr.h                                                             */\n/*                                                                         */\n/*    High-level Type 42 driver interface (specification).                 */\n/*                                                                         */\n/*  Copyright 2002 by Roberto Alameda.                                     */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T42DRIVR_H__\n#define __T42DRIVR_H__\n\n\n#include <ft2build.h>\n#include FT_INTERNAL_DRIVER_H\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n\n  FT_EXPORT_VAR( const FT_Driver_ClassRec )  t42_driver_class;\n\n\nFT_END_HEADER\n\n\n#endif /* __T42DRIVR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type42/t42error.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t42error.h                                                             */\n/*                                                                         */\n/*    Type 42 error codes (specification only).                            */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2012 by                                          */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the Type 42 error enumeration constants.  */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __T42ERROR_H__\n#define __T42ERROR_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  T42_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Type42\n\n#include FT_ERRORS_H\n\n#endif /* __T42ERROR_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type42/t42objs.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t42objs.c                                                              */\n/*                                                                         */\n/*    Type 42 objects manager (body).                                      */\n/*                                                                         */\n/*  Copyright 2002-2009, 2011, 2013                                        */\n/*  by Roberto Alameda.                                                    */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"t42objs.h\"\n#include \"t42parse.h\"\n#include \"t42error.h\"\n#include FT_INTERNAL_DEBUG_H\n#include FT_LIST_H\n#include FT_TRUETYPE_IDS_H\n\n\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t42\n\n\n  static FT_Error\n  T42_Open_Face( T42_Face  face )\n  {\n    T42_LoaderRec  loader;\n    T42_Parser     parser;\n    T1_Font        type1 = &face->type1;\n    FT_Memory      memory = face->root.memory;\n    FT_Error       error;\n\n    PSAux_Service  psaux  = (PSAux_Service)face->psaux;\n\n\n    t42_loader_init( &loader, face );\n\n    parser = &loader.parser;\n\n    if ( FT_ALLOC( face->ttf_data, 12 ) )\n      goto Exit;\n\n    error = t42_parser_init( parser,\n                             face->root.stream,\n                             memory,\n                             psaux);\n    if ( error )\n      goto Exit;\n\n    error = t42_parse_dict( face, &loader,\n                            parser->base_dict, parser->base_len );\n    if ( error )\n      goto Exit;\n\n    if ( type1->font_type != 42 )\n    {\n      FT_ERROR(( \"T42_Open_Face: cannot handle FontType %d\\n\",\n                 type1->font_type ));\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* now, propagate the charstrings and glyphnames tables */\n    /* to the Type1 data                                    */\n    type1->num_glyphs = loader.num_glyphs;\n\n    if ( !loader.charstrings.init )\n    {\n      FT_ERROR(( \"T42_Open_Face: no charstrings array in face\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n    }\n\n    loader.charstrings.init  = 0;\n    type1->charstrings_block = loader.charstrings.block;\n    type1->charstrings       = loader.charstrings.elements;\n    type1->charstrings_len   = loader.charstrings.lengths;\n\n    /* we copy the glyph names `block' and `elements' fields; */\n    /* the `lengths' field must be released later             */\n    type1->glyph_names_block    = loader.glyph_names.block;\n    type1->glyph_names          = (FT_String**)loader.glyph_names.elements;\n    loader.glyph_names.block    = 0;\n    loader.glyph_names.elements = 0;\n\n    /* we must now build type1.encoding when we have a custom array */\n    if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )\n    {\n      FT_Int    charcode, idx, min_char, max_char;\n      FT_Byte*  char_name;\n      FT_Byte*  glyph_name;\n\n\n      /* OK, we do the following: for each element in the encoding   */\n      /* table, look up the index of the glyph having the same name  */\n      /* as defined in the CharStrings array.                        */\n      /* The index is then stored in type1.encoding.char_index, and  */\n      /* the name in type1.encoding.char_name                        */\n\n      min_char = 0;\n      max_char = 0;\n\n      charcode = 0;\n      for ( ; charcode < loader.encoding_table.max_elems; charcode++ )\n      {\n        type1->encoding.char_index[charcode] = 0;\n        type1->encoding.char_name [charcode] = (char *)\".notdef\";\n\n        char_name = loader.encoding_table.elements[charcode];\n        if ( char_name )\n          for ( idx = 0; idx < type1->num_glyphs; idx++ )\n          {\n            glyph_name = (FT_Byte*)type1->glyph_names[idx];\n            if ( ft_strcmp( (const char*)char_name,\n                            (const char*)glyph_name ) == 0 )\n            {\n              type1->encoding.char_index[charcode] = (FT_UShort)idx;\n              type1->encoding.char_name [charcode] = (char*)glyph_name;\n\n              /* Change min/max encoded char only if glyph name is */\n              /* not /.notdef                                      */\n              if ( ft_strcmp( (const char*)\".notdef\",\n                              (const char*)glyph_name ) != 0 )\n              {\n                if ( charcode < min_char )\n                  min_char = charcode;\n                if ( charcode >= max_char )\n                  max_char = charcode + 1;\n              }\n              break;\n            }\n          }\n      }\n\n      type1->encoding.code_first = min_char;\n      type1->encoding.code_last  = max_char;\n      type1->encoding.num_chars  = loader.num_chars;\n    }\n\n  Exit:\n    t42_loader_done( &loader );\n    return error;\n  }\n\n\n  /***************** Driver Functions *************/\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T42_Face_Init( FT_Stream      stream,\n                 FT_Face        t42face,       /* T42_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params )\n  {\n    T42_Face            face  = (T42_Face)t42face;\n    FT_Error            error;\n    FT_Service_PsCMaps  psnames;\n    PSAux_Service       psaux;\n    FT_Face             root  = (FT_Face)&face->root;\n    T1_Font             type1 = &face->type1;\n    PS_FontInfo         info  = &type1->font_info;\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n    FT_UNUSED( face_index );\n    FT_UNUSED( stream );\n\n\n    face->ttf_face       = NULL;\n    face->root.num_faces = 1;\n\n    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );\n    face->psnames = psnames;\n\n    face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),\n                                           \"psaux\" );\n    psaux = (PSAux_Service)face->psaux;\n    if ( !psaux )\n    {\n      FT_ERROR(( \"T42_Face_Init: cannot access `psaux' module\\n\" ));\n      error = FT_THROW( Missing_Module );\n      goto Exit;\n    }\n\n    FT_TRACE2(( \"Type 42 driver\\n\" ));\n\n    /* open the tokenizer, this will also check the font format */\n    error = T42_Open_Face( face );\n    if ( error )\n      goto Exit;\n\n    /* if we just wanted to check the format, leave successfully now */\n    if ( face_index < 0 )\n      goto Exit;\n\n    /* check the face index */\n    if ( face_index > 0 )\n    {\n      FT_ERROR(( \"T42_Face_Init: invalid face index\\n\" ));\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    /* Now load the font program into the face object */\n\n    /* Init the face object fields */\n    /* Now set up root face fields */\n\n    root->num_glyphs   = type1->num_glyphs;\n    root->num_charmaps = 0;\n    root->face_index   = 0;\n\n    root->face_flags = FT_FACE_FLAG_SCALABLE    |\n                       FT_FACE_FLAG_HORIZONTAL  |\n                       FT_FACE_FLAG_GLYPH_NAMES;\n\n    if ( info->is_fixed_pitch )\n      root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n    /* We only set this flag if we have the patented bytecode interpreter. */\n    /* There are no known `tricky' Type42 fonts that could be loaded with  */\n    /* the unpatented interpreter.                                         */\n#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER\n    root->face_flags |= FT_FACE_FLAG_HINTER;\n#endif\n\n    /* XXX: TODO -- add kerning with .afm support */\n\n    /* get style name -- be careful, some broken fonts only */\n    /* have a `/FontName' dictionary entry!                 */\n    root->family_name = info->family_name;\n    /* assume \"Regular\" style if we don't know better */\n    root->style_name = (char *)\"Regular\";\n    if ( root->family_name )\n    {\n      char*  full   = info->full_name;\n      char*  family = root->family_name;\n\n\n      if ( full )\n      {\n        while ( *full )\n        {\n          if ( *full == *family )\n          {\n            family++;\n            full++;\n          }\n          else\n          {\n            if ( *full == ' ' || *full == '-' )\n              full++;\n            else if ( *family == ' ' || *family == '-' )\n              family++;\n            else\n            {\n              if ( !*family )\n                root->style_name = full;\n              break;\n            }\n          }\n        }\n      }\n    }\n    else\n    {\n      /* do we have a `/FontName'? */\n      if ( type1->font_name )\n        root->family_name = type1->font_name;\n    }\n\n    /* no embedded bitmap support */\n    root->num_fixed_sizes = 0;\n    root->available_sizes = 0;\n\n    /* Load the TTF font embedded in the T42 font */\n    {\n      FT_Open_Args  args;\n\n\n      args.flags       = FT_OPEN_MEMORY;\n      args.memory_base = face->ttf_data;\n      args.memory_size = face->ttf_size;\n\n      if ( num_params )\n      {\n        args.flags     |= FT_OPEN_PARAMS;\n        args.num_params = num_params;\n        args.params     = params;\n      }\n\n      error = FT_Open_Face( FT_FACE_LIBRARY( face ),\n                            &args, 0, &face->ttf_face );\n    }\n\n    if ( error )\n      goto Exit;\n\n    FT_Done_Size( face->ttf_face->size );\n\n    /* Ignore info in FontInfo dictionary and use the info from the  */\n    /* loaded TTF font.  The PostScript interpreter also ignores it. */\n    root->bbox         = face->ttf_face->bbox;\n    root->units_per_EM = face->ttf_face->units_per_EM;\n\n    root->ascender  = face->ttf_face->ascender;\n    root->descender = face->ttf_face->descender;\n    root->height    = face->ttf_face->height;\n\n    root->max_advance_width  = face->ttf_face->max_advance_width;\n    root->max_advance_height = face->ttf_face->max_advance_height;\n\n    root->underline_position  = (FT_Short)info->underline_position;\n    root->underline_thickness = (FT_Short)info->underline_thickness;\n\n    /* compute style flags */\n    root->style_flags = 0;\n    if ( info->italic_angle )\n      root->style_flags |= FT_STYLE_FLAG_ITALIC;\n\n    if ( face->ttf_face->style_flags & FT_STYLE_FLAG_BOLD )\n      root->style_flags |= FT_STYLE_FLAG_BOLD;\n\n    if ( face->ttf_face->face_flags & FT_FACE_FLAG_VERTICAL )\n      root->face_flags |= FT_FACE_FLAG_VERTICAL;\n\n    {\n      if ( psnames )\n      {\n        FT_CharMapRec    charmap;\n        T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;\n        FT_CMap_Class    clazz;\n\n\n        charmap.face = root;\n\n        /* first of all, try to synthesize a Unicode charmap */\n        charmap.platform_id = TT_PLATFORM_MICROSOFT;\n        charmap.encoding_id = TT_MS_ID_UNICODE_CS;\n        charmap.encoding    = FT_ENCODING_UNICODE;\n\n        error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );\n        if ( error                                      &&\n             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )\n          goto Exit;\n        error = FT_Err_Ok;\n\n        /* now, generate an Adobe Standard encoding when appropriate */\n        charmap.platform_id = TT_PLATFORM_ADOBE;\n        clazz               = NULL;\n\n        switch ( type1->encoding_type )\n        {\n        case T1_ENCODING_TYPE_STANDARD:\n          charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;\n          charmap.encoding_id = TT_ADOBE_ID_STANDARD;\n          clazz               = cmap_classes->standard;\n          break;\n\n        case T1_ENCODING_TYPE_EXPERT:\n          charmap.encoding    = FT_ENCODING_ADOBE_EXPERT;\n          charmap.encoding_id = TT_ADOBE_ID_EXPERT;\n          clazz               = cmap_classes->expert;\n          break;\n\n        case T1_ENCODING_TYPE_ARRAY:\n          charmap.encoding    = FT_ENCODING_ADOBE_CUSTOM;\n          charmap.encoding_id = TT_ADOBE_ID_CUSTOM;\n          clazz               = cmap_classes->custom;\n          break;\n\n        case T1_ENCODING_TYPE_ISOLATIN1:\n          charmap.encoding    = FT_ENCODING_ADOBE_LATIN_1;\n          charmap.encoding_id = TT_ADOBE_ID_LATIN_1;\n          clazz               = cmap_classes->unicode;\n          break;\n\n        default:\n          ;\n        }\n\n        if ( clazz )\n          error = FT_CMap_New( clazz, NULL, &charmap, NULL );\n\n#if 0\n        /* Select default charmap */\n        if ( root->num_charmaps )\n          root->charmap = root->charmaps[0];\n#endif\n      }\n    }\n  Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T42_Face_Done( FT_Face  t42face )\n  {\n    T42_Face     face = (T42_Face)t42face;\n    T1_Font      type1;\n    PS_FontInfo  info;\n    FT_Memory    memory;\n\n\n    if ( !face )\n      return;\n\n    type1  = &face->type1;\n    info   = &type1->font_info;\n    memory = face->root.memory;\n\n    /* delete internal ttf face prior to freeing face->ttf_data */\n    if ( face->ttf_face )\n      FT_Done_Face( face->ttf_face );\n\n    /* release font info strings */\n    FT_FREE( info->version );\n    FT_FREE( info->notice );\n    FT_FREE( info->full_name );\n    FT_FREE( info->family_name );\n    FT_FREE( info->weight );\n\n    /* release top dictionary */\n    FT_FREE( type1->charstrings_len );\n    FT_FREE( type1->charstrings );\n    FT_FREE( type1->glyph_names );\n\n    FT_FREE( type1->charstrings_block );\n    FT_FREE( type1->glyph_names_block );\n\n    FT_FREE( type1->encoding.char_index );\n    FT_FREE( type1->encoding.char_name );\n    FT_FREE( type1->font_name );\n\n    FT_FREE( face->ttf_data );\n\n#if 0\n    /* release afm data if present */\n    if ( face->afm_data )\n      T1_Done_AFM( memory, (T1_AFM*)face->afm_data );\n#endif\n\n    /* release unicode map, if any */\n    FT_FREE( face->unicode_map.maps );\n    face->unicode_map.num_maps = 0;\n\n    face->root.family_name = 0;\n    face->root.style_name  = 0;\n  }\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* <Function>                                                            */\n  /*    T42_Driver_Init                                                    */\n  /*                                                                       */\n  /* <Description>                                                         */\n  /*    Initializes a given Type 42 driver object.                         */\n  /*                                                                       */\n  /* <Input>                                                               */\n  /*    driver :: A handle to the target driver object.                    */\n  /*                                                                       */\n  /* <Return>                                                              */\n  /*    FreeType error code.  0 means success.                             */\n  /*                                                                       */\n  FT_LOCAL_DEF( FT_Error )\n  T42_Driver_Init( FT_Module  module )        /* T42_Driver */\n  {\n    T42_Driver  driver = (T42_Driver)module;\n    FT_Module   ttmodule;\n\n\n    ttmodule = FT_Get_Module( module->library, \"truetype\" );\n    if ( !ttmodule )\n    {\n      FT_ERROR(( \"T42_Driver_Init: cannot access `truetype' module\\n\" ));\n      return FT_THROW( Missing_Module );\n    }\n\n    driver->ttclazz = (FT_Driver_Class)ttmodule->clazz;\n\n    return FT_Err_Ok;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T42_Driver_Done( FT_Module  module )\n  {\n    FT_UNUSED( module );\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T42_Size_Init( FT_Size  size )         /* T42_Size */\n  {\n    T42_Size  t42size = (T42_Size)size;\n    FT_Face   face    = size->face;\n    T42_Face  t42face = (T42_Face)face;\n    FT_Size   ttsize;\n    FT_Error  error   = FT_Err_Ok;\n\n\n    error = FT_New_Size( t42face->ttf_face, &ttsize );\n    t42size->ttsize = ttsize;\n\n    FT_Activate_Size( ttsize );\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T42_Size_Request( FT_Size          t42size,      /* T42_Size */\n                    FT_Size_Request  req )\n  {\n    T42_Size  size = (T42_Size)t42size;\n    T42_Face  face = (T42_Face)t42size->face;\n    FT_Error  error;\n\n\n    FT_Activate_Size( size->ttsize );\n\n    error = FT_Request_Size( face->ttf_face, req );\n    if ( !error )\n      t42size->metrics = face->ttf_face->size->metrics;\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T42_Size_Select( FT_Size   t42size,         /* T42_Size */\n                   FT_ULong  strike_index )\n  {\n    T42_Size  size = (T42_Size)t42size;\n    T42_Face  face = (T42_Face)t42size->face;\n    FT_Error  error;\n\n\n    FT_Activate_Size( size->ttsize );\n\n    error = FT_Select_Size( face->ttf_face, (FT_Int)strike_index );\n    if ( !error )\n      t42size->metrics = face->ttf_face->size->metrics;\n\n    return error;\n\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T42_Size_Done( FT_Size  t42size )             /* T42_Size */\n  {\n    T42_Size     size    = (T42_Size)t42size;\n    FT_Face      face    = t42size->face;\n    T42_Face     t42face = (T42_Face)face;\n    FT_ListNode  node;\n\n\n    node = FT_List_Find( &t42face->ttf_face->sizes_list, size->ttsize );\n    if ( node )\n    {\n      FT_Done_Size( size->ttsize );\n      size->ttsize = NULL;\n    }\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T42_GlyphSlot_Init( FT_GlyphSlot  t42slot )        /* T42_GlyphSlot */\n  {\n    T42_GlyphSlot  slot    = (T42_GlyphSlot)t42slot;\n    FT_Face        face    = t42slot->face;\n    T42_Face       t42face = (T42_Face)face;\n    FT_GlyphSlot   ttslot;\n    FT_Error       error   = FT_Err_Ok;\n\n\n    if ( face->glyph == NULL )\n    {\n      /* First glyph slot for this face */\n      slot->ttslot = t42face->ttf_face->glyph;\n    }\n    else\n    {\n      error = FT_New_GlyphSlot( t42face->ttf_face, &ttslot );\n      slot->ttslot = ttslot;\n    }\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  T42_GlyphSlot_Done( FT_GlyphSlot  t42slot )       /* T42_GlyphSlot */\n  {\n    T42_GlyphSlot  slot = (T42_GlyphSlot)t42slot;\n\n\n    FT_Done_GlyphSlot( slot->ttslot );\n  }\n\n\n  static void\n  t42_glyphslot_clear( FT_GlyphSlot  slot )\n  {\n    /* free bitmap if needed */\n    ft_glyphslot_free_bitmap( slot );\n\n    /* clear all public fields in the glyph slot */\n    FT_ZERO( &slot->metrics );\n    FT_ZERO( &slot->outline );\n    FT_ZERO( &slot->bitmap );\n\n    slot->bitmap_left   = 0;\n    slot->bitmap_top    = 0;\n    slot->num_subglyphs = 0;\n    slot->subglyphs     = 0;\n    slot->control_data  = 0;\n    slot->control_len   = 0;\n    slot->other         = 0;\n    slot->format        = FT_GLYPH_FORMAT_NONE;\n\n    slot->linearHoriAdvance = 0;\n    slot->linearVertAdvance = 0;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  T42_GlyphSlot_Load( FT_GlyphSlot  glyph,\n                      FT_Size       size,\n                      FT_UInt       glyph_index,\n                      FT_Int32      load_flags )\n  {\n    FT_Error         error;\n    T42_GlyphSlot    t42slot = (T42_GlyphSlot)glyph;\n    T42_Size         t42size = (T42_Size)size;\n    FT_Driver_Class  ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz;\n\n\n    t42_glyphslot_clear( t42slot->ttslot );\n    error = ttclazz->load_glyph( t42slot->ttslot,\n                                 t42size->ttsize,\n                                 glyph_index,\n                                 load_flags | FT_LOAD_NO_BITMAP );\n\n    if ( !error )\n    {\n      glyph->metrics = t42slot->ttslot->metrics;\n\n      glyph->linearHoriAdvance = t42slot->ttslot->linearHoriAdvance;\n      glyph->linearVertAdvance = t42slot->ttslot->linearVertAdvance;\n\n      glyph->format  = t42slot->ttslot->format;\n      glyph->outline = t42slot->ttslot->outline;\n\n      glyph->bitmap      = t42slot->ttslot->bitmap;\n      glyph->bitmap_left = t42slot->ttslot->bitmap_left;\n      glyph->bitmap_top  = t42slot->ttslot->bitmap_top;\n\n      glyph->num_subglyphs = t42slot->ttslot->num_subglyphs;\n      glyph->subglyphs     = t42slot->ttslot->subglyphs;\n\n      glyph->control_data  = t42slot->ttslot->control_data;\n      glyph->control_len   = t42slot->ttslot->control_len;\n    }\n\n    return error;\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type42/t42objs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t42objs.h                                                              */\n/*                                                                         */\n/*    Type 42 objects manager (specification).                             */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006, 2007, 2011 by Roberto Alameda.             */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T42OBJS_H__\n#define __T42OBJS_H__\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_TYPE1_TABLES_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n#include \"t42types.h\"\n#include FT_INTERNAL_OBJECTS_H\n#include FT_INTERNAL_DRIVER_H\n#include FT_SERVICE_POSTSCRIPT_CMAPS_H\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n\n\nFT_BEGIN_HEADER\n\n\n  /* Type42 size */\n  typedef struct  T42_SizeRec_\n  {\n    FT_SizeRec  root;\n    FT_Size     ttsize;\n\n  } T42_SizeRec, *T42_Size;\n\n\n  /* Type42 slot */\n  typedef struct  T42_GlyphSlotRec_\n  {\n    FT_GlyphSlotRec  root;\n    FT_GlyphSlot     ttslot;\n\n  } T42_GlyphSlotRec, *T42_GlyphSlot;\n\n\n  /* Type 42 driver */\n  typedef struct  T42_DriverRec_\n  {\n    FT_DriverRec     root;\n    FT_Driver_Class  ttclazz;\n    void*            extension_component;\n\n  } T42_DriverRec, *T42_Driver;\n\n\n  /* */\n\n\n  FT_LOCAL( FT_Error )\n  T42_Face_Init( FT_Stream      stream,\n                 FT_Face        face,\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params );\n\n\n  FT_LOCAL( void )\n  T42_Face_Done( FT_Face  face );\n\n\n  FT_LOCAL( FT_Error )\n  T42_Size_Init( FT_Size  size );\n\n\n  FT_LOCAL( FT_Error )\n  T42_Size_Request( FT_Size          size,\n                    FT_Size_Request  req );\n\n\n  FT_LOCAL( FT_Error )\n  T42_Size_Select( FT_Size   size,\n                   FT_ULong  strike_index );\n\n\n  FT_LOCAL( void )\n  T42_Size_Done( FT_Size  size );\n\n\n  FT_LOCAL( FT_Error )\n  T42_GlyphSlot_Init( FT_GlyphSlot  slot );\n\n\n  FT_LOCAL( FT_Error )\n  T42_GlyphSlot_Load( FT_GlyphSlot  glyph,\n                      FT_Size       size,\n                      FT_UInt       glyph_index,\n                      FT_Int32      load_flags );\n\n  FT_LOCAL( void )\n  T42_GlyphSlot_Done( FT_GlyphSlot  slot );\n\n\n  FT_LOCAL( FT_Error )\n  T42_Driver_Init( FT_Module  module );\n\n  FT_LOCAL( void )\n  T42_Driver_Done( FT_Module  module );\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __T42OBJS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type42/t42parse.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t42parse.c                                                             */\n/*                                                                         */\n/*    Type 42 font parser (body).                                          */\n/*                                                                         */\n/*  Copyright 2002-2013 by                                                 */\n/*  Roberto Alameda.                                                       */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include \"t42parse.h\"\n#include \"t42error.h\"\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_t42\n\n\n  static void\n  t42_parse_font_matrix( T42_Face    face,\n                         T42_Loader  loader );\n  static void\n  t42_parse_encoding( T42_Face    face,\n                      T42_Loader  loader );\n\n  static void\n  t42_parse_charstrings( T42_Face    face,\n                         T42_Loader  loader );\n\n  static void\n  t42_parse_sfnts( T42_Face    face,\n                   T42_Loader  loader );\n\n\n  /* as Type42 fonts have no Private dict,         */\n  /* we set the last argument of T1_FIELD_XXX to 0 */\n  static const\n  T1_FieldRec  t42_keywords[] =\n  {\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  T1_FontInfo\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_INFO\n\n    T1_FIELD_STRING( \"version\",            version,             0 )\n    T1_FIELD_STRING( \"Notice\",             notice,              0 )\n    T1_FIELD_STRING( \"FullName\",           full_name,           0 )\n    T1_FIELD_STRING( \"FamilyName\",         family_name,         0 )\n    T1_FIELD_STRING( \"Weight\",             weight,              0 )\n    T1_FIELD_NUM   ( \"ItalicAngle\",        italic_angle,        0 )\n    T1_FIELD_BOOL  ( \"isFixedPitch\",       is_fixed_pitch,      0 )\n    T1_FIELD_NUM   ( \"UnderlinePosition\",  underline_position,  0 )\n    T1_FIELD_NUM   ( \"UnderlineThickness\", underline_thickness, 0 )\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  PS_FontExtraRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA\n\n    T1_FIELD_NUM   ( \"FSType\",             fs_type,             0 )\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  T1_FontRec\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_FONT_DICT\n\n    T1_FIELD_KEY  ( \"FontName\",    font_name,    0 )\n    T1_FIELD_NUM  ( \"PaintType\",   paint_type,   0 )\n    T1_FIELD_NUM  ( \"FontType\",    font_type,    0 )\n    T1_FIELD_FIXED( \"StrokeWidth\", stroke_width, 0 )\n\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  FT_BBox\n#undef  T1CODE\n#define T1CODE        T1_FIELD_LOCATION_BBOX\n\n    T1_FIELD_BBOX(\"FontBBox\", xMin, 0 )\n\n    T1_FIELD_CALLBACK( \"FontMatrix\",  t42_parse_font_matrix, 0 )\n    T1_FIELD_CALLBACK( \"Encoding\",    t42_parse_encoding,    0 )\n    T1_FIELD_CALLBACK( \"CharStrings\", t42_parse_charstrings, 0 )\n    T1_FIELD_CALLBACK( \"sfnts\",       t42_parse_sfnts,       0 )\n\n    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }\n  };\n\n\n#define T1_Add_Table( p, i, o, l )  (p)->funcs.add( (p), i, o, l )\n#define T1_Done_Table( p )          \\\n          do                        \\\n          {                         \\\n            if ( (p)->funcs.done )  \\\n              (p)->funcs.done( p ); \\\n          } while ( 0 )\n#define T1_Release_Table( p )          \\\n          do                           \\\n          {                            \\\n            if ( (p)->funcs.release )  \\\n              (p)->funcs.release( p ); \\\n          } while ( 0 )\n\n#define T1_Skip_Spaces( p )    (p)->root.funcs.skip_spaces( &(p)->root )\n#define T1_Skip_PS_Token( p )  (p)->root.funcs.skip_PS_token( &(p)->root )\n\n#define T1_ToInt( p )                          \\\n          (p)->root.funcs.to_int( &(p)->root )\n#define T1_ToBytes( p, b, m, n, d )                          \\\n          (p)->root.funcs.to_bytes( &(p)->root, b, m, n, d )\n\n#define T1_ToFixedArray( p, m, f, t )                           \\\n          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )\n#define T1_ToToken( p, t )                          \\\n          (p)->root.funcs.to_token( &(p)->root, t )\n\n#define T1_Load_Field( p, f, o, m, pf )                         \\\n          (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )\n#define T1_Load_Field_Table( p, f, o, m, pf )                         \\\n          (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )\n\n\n  /********************* Parsing Functions ******************/\n\n  FT_LOCAL_DEF( FT_Error )\n  t42_parser_init( T42_Parser     parser,\n                   FT_Stream      stream,\n                   FT_Memory      memory,\n                   PSAux_Service  psaux )\n  {\n    FT_Error  error = FT_Err_Ok;\n    FT_Long   size;\n\n\n    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );\n\n    parser->stream    = stream;\n    parser->base_len  = 0;\n    parser->base_dict = 0;\n    parser->in_memory = 0;\n\n    /*******************************************************************/\n    /*                                                                 */\n    /* Here a short summary of what is going on:                       */\n    /*                                                                 */\n    /*   When creating a new Type 42 parser, we try to locate and load */\n    /*   the base dictionary, loading the whole font into memory.      */\n    /*                                                                 */\n    /*   When `loading' the base dictionary, we only set up pointers   */\n    /*   in the case of a memory-based stream.  Otherwise, we allocate */\n    /*   and load the base dictionary in it.                           */\n    /*                                                                 */\n    /*   parser->in_memory is set if we have a memory stream.          */\n    /*                                                                 */\n\n    if ( FT_STREAM_SEEK( 0L ) ||\n         FT_FRAME_ENTER( 17 ) )\n      goto Exit;\n\n    if ( ft_memcmp( stream->cursor, \"%!PS-TrueTypeFont\", 17 ) != 0 )\n    {\n      FT_TRACE2(( \"  not a Type42 font\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n    }\n\n    FT_FRAME_EXIT();\n\n    if ( error || FT_STREAM_SEEK( 0 ) )\n      goto Exit;\n\n    size = stream->size;\n\n    /* now, try to load `size' bytes of the `base' dictionary we */\n    /* found previously                                          */\n\n    /* if it is a memory-based resource, set up pointers */\n    if ( !stream->read )\n    {\n      parser->base_dict = (FT_Byte*)stream->base + stream->pos;\n      parser->base_len  = size;\n      parser->in_memory = 1;\n\n      /* check that the `size' field is valid */\n      if ( FT_STREAM_SKIP( size ) )\n        goto Exit;\n    }\n    else\n    {\n      /* read segment in memory */\n      if ( FT_ALLOC( parser->base_dict, size )       ||\n           FT_STREAM_READ( parser->base_dict, size ) )\n        goto Exit;\n\n      parser->base_len = size;\n    }\n\n    parser->root.base   = parser->base_dict;\n    parser->root.cursor = parser->base_dict;\n    parser->root.limit  = parser->root.cursor + parser->base_len;\n\n  Exit:\n    if ( error && !parser->in_memory )\n      FT_FREE( parser->base_dict );\n\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  t42_parser_done( T42_Parser  parser )\n  {\n    FT_Memory  memory = parser->root.memory;\n\n\n    /* free the base dictionary only when we have a disk stream */\n    if ( !parser->in_memory )\n      FT_FREE( parser->base_dict );\n\n    parser->root.funcs.done( &parser->root );\n  }\n\n\n  static int\n  t42_is_space( FT_Byte  c )\n  {\n    return ( c == ' '  || c == '\\t'              ||\n             c == '\\r' || c == '\\n' || c == '\\f' ||\n             c == '\\0'                           );\n  }\n\n\n  static void\n  t42_parse_font_matrix( T42_Face    face,\n                         T42_Loader  loader )\n  {\n    T42_Parser  parser = &loader->parser;\n    FT_Matrix*  matrix = &face->type1.font_matrix;\n    FT_Vector*  offset = &face->type1.font_offset;\n    FT_Face     root   = (FT_Face)&face->root;\n    FT_Fixed    temp[6];\n    FT_Fixed    temp_scale;\n\n\n    (void)T1_ToFixedArray( parser, 6, temp, 3 );\n\n    temp_scale = FT_ABS( temp[3] );\n\n    /* Set Units per EM based on FontMatrix values.  We set the value to */\n    /* 1000 / temp_scale, because temp_scale was already multiplied by   */\n    /* 1000 (in t1_tofixed, from psobjs.c).                              */\n\n    root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );\n\n    /* we need to scale the values by 1.0/temp_scale */\n    if ( temp_scale != 0x10000L )\n    {\n      temp[0] = FT_DivFix( temp[0], temp_scale );\n      temp[1] = FT_DivFix( temp[1], temp_scale );\n      temp[2] = FT_DivFix( temp[2], temp_scale );\n      temp[4] = FT_DivFix( temp[4], temp_scale );\n      temp[5] = FT_DivFix( temp[5], temp_scale );\n      temp[3] = 0x10000L;\n    }\n\n    matrix->xx = temp[0];\n    matrix->yx = temp[1];\n    matrix->xy = temp[2];\n    matrix->yy = temp[3];\n\n    /* note that the offsets must be expressed in integer font units */\n    offset->x = temp[4] >> 16;\n    offset->y = temp[5] >> 16;\n  }\n\n\n  static void\n  t42_parse_encoding( T42_Face    face,\n                      T42_Loader  loader )\n  {\n    T42_Parser  parser = &loader->parser;\n    FT_Byte*    cur;\n    FT_Byte*    limit  = parser->root.limit;\n\n    PSAux_Service  psaux  = (PSAux_Service)face->psaux;\n\n\n    T1_Skip_Spaces( parser );\n    cur = parser->root.cursor;\n    if ( cur >= limit )\n    {\n      FT_ERROR(( \"t42_parse_encoding: out of bounds\\n\" ));\n      parser->root.error = FT_THROW( Invalid_File_Format );\n      return;\n    }\n\n    /* if we have a number or `[', the encoding is an array, */\n    /* and we must load it now                               */\n    if ( ft_isdigit( *cur ) || *cur == '[' )\n    {\n      T1_Encoding  encode          = &face->type1.encoding;\n      FT_UInt      count, n;\n      PS_Table     char_table      = &loader->encoding_table;\n      FT_Memory    memory          = parser->root.memory;\n      FT_Error     error;\n      FT_Bool      only_immediates = 0;\n\n\n      /* read the number of entries in the encoding; should be 256 */\n      if ( *cur == '[' )\n      {\n        count           = 256;\n        only_immediates = 1;\n        parser->root.cursor++;\n      }\n      else\n        count = (FT_UInt)T1_ToInt( parser );\n\n      T1_Skip_Spaces( parser );\n      if ( parser->root.cursor >= limit )\n        return;\n\n      /* we use a T1_Table to store our charnames */\n      loader->num_chars = encode->num_chars = count;\n      if ( FT_NEW_ARRAY( encode->char_index, count )     ||\n           FT_NEW_ARRAY( encode->char_name,  count )     ||\n           FT_SET_ERROR( psaux->ps_table_funcs->init(\n                           char_table, count, memory ) ) )\n      {\n        parser->root.error = error;\n        return;\n      }\n\n      /* We need to `zero' out encoding_table.elements */\n      for ( n = 0; n < count; n++ )\n      {\n        char*  notdef = (char *)\".notdef\";\n\n\n        T1_Add_Table( char_table, n, notdef, 8 );\n      }\n\n      /* Now we need to read records of the form                */\n      /*                                                        */\n      /*   ... charcode /charname ...                           */\n      /*                                                        */\n      /* for each entry in our table.                           */\n      /*                                                        */\n      /* We simply look for a number followed by an immediate   */\n      /* name.  Note that this ignores correctly the sequence   */\n      /* that is often seen in type42 fonts:                    */\n      /*                                                        */\n      /*   0 1 255 { 1 index exch /.notdef put } for dup        */\n      /*                                                        */\n      /* used to clean the encoding array before anything else. */\n      /*                                                        */\n      /* Alternatively, if the array is directly given as       */\n      /*                                                        */\n      /*   /Encoding [ ... ]                                    */\n      /*                                                        */\n      /* we only read immediates.                               */\n\n      n = 0;\n      T1_Skip_Spaces( parser );\n\n      while ( parser->root.cursor < limit )\n      {\n        cur = parser->root.cursor;\n\n        /* we stop when we encounter `def' or `]' */\n        if ( *cur == 'd' && cur + 3 < limit )\n        {\n          if ( cur[1] == 'e'          &&\n               cur[2] == 'f'          &&\n               t42_is_space( cur[3] ) )\n          {\n            FT_TRACE6(( \"encoding end\\n\" ));\n            cur += 3;\n            break;\n          }\n        }\n        if ( *cur == ']' )\n        {\n          FT_TRACE6(( \"encoding end\\n\" ));\n          cur++;\n          break;\n        }\n\n        /* check whether we have found an entry */\n        if ( ft_isdigit( *cur ) || only_immediates )\n        {\n          FT_Int  charcode;\n\n\n          if ( only_immediates )\n            charcode = n;\n          else\n          {\n            charcode = (FT_Int)T1_ToInt( parser );\n            T1_Skip_Spaces( parser );\n          }\n\n          cur = parser->root.cursor;\n\n          if ( *cur == '/' && cur + 2 < limit && n < count )\n          {\n            FT_PtrDist  len;\n\n\n            cur++;\n\n            parser->root.cursor = cur;\n            T1_Skip_PS_Token( parser );\n            if ( parser->root.error )\n              return;\n\n            len = parser->root.cursor - cur;\n\n            parser->root.error = T1_Add_Table( char_table, charcode,\n                                               cur, len + 1 );\n            if ( parser->root.error )\n              return;\n            char_table->elements[charcode][len] = '\\0';\n\n            n++;\n          }\n        }\n        else\n        {\n          T1_Skip_PS_Token( parser );\n          if ( parser->root.error )\n            return;\n        }\n\n        T1_Skip_Spaces( parser );\n      }\n\n      face->type1.encoding_type  = T1_ENCODING_TYPE_ARRAY;\n      parser->root.cursor        = cur;\n    }\n\n    /* Otherwise, we should have either `StandardEncoding', */\n    /* `ExpertEncoding', or `ISOLatin1Encoding'             */\n    else\n    {\n      if ( cur + 17 < limit                                            &&\n           ft_strncmp( (const char*)cur, \"StandardEncoding\", 16 ) == 0 )\n        face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;\n\n      else if ( cur + 15 < limit                                          &&\n                ft_strncmp( (const char*)cur, \"ExpertEncoding\", 14 ) == 0 )\n        face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;\n\n      else if ( cur + 18 < limit                                             &&\n                ft_strncmp( (const char*)cur, \"ISOLatin1Encoding\", 17 ) == 0 )\n        face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;\n\n      else\n      {\n        FT_ERROR(( \"t42_parse_encoding: invalid token\\n\" ));\n        parser->root.error = FT_THROW( Invalid_File_Format );\n      }\n    }\n  }\n\n\n  typedef enum  T42_Load_Status_\n  {\n    BEFORE_START,\n    BEFORE_TABLE_DIR,\n    OTHER_TABLES\n\n  } T42_Load_Status;\n\n\n  static void\n  t42_parse_sfnts( T42_Face    face,\n                   T42_Loader  loader )\n  {\n    T42_Parser  parser = &loader->parser;\n    FT_Memory   memory = parser->root.memory;\n    FT_Byte*    cur;\n    FT_Byte*    limit  = parser->root.limit;\n    FT_Error    error;\n    FT_Int      num_tables = 0;\n    FT_ULong    count, ttf_size = 0;\n\n    FT_Long     n, string_size, old_string_size, real_size;\n    FT_Byte*    string_buf = NULL;\n    FT_Bool     allocated  = 0;\n\n    T42_Load_Status  status;\n\n\n    /* The format is                                */\n    /*                                              */\n    /*   /sfnts [ <hexstring> <hexstring> ... ] def */\n    /*                                              */\n    /* or                                           */\n    /*                                              */\n    /*   /sfnts [                                   */\n    /*      <num_bin_bytes> RD <binary data>        */\n    /*      <num_bin_bytes> RD <binary data>        */\n    /*      ...                                     */\n    /*   ] def                                      */\n    /*                                              */\n    /* with exactly one space after the `RD' token. */\n\n    T1_Skip_Spaces( parser );\n\n    if ( parser->root.cursor >= limit || *parser->root.cursor++ != '[' )\n    {\n      FT_ERROR(( \"t42_parse_sfnts: can't find begin of sfnts vector\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    T1_Skip_Spaces( parser );\n    status          = BEFORE_START;\n    string_size     = 0;\n    old_string_size = 0;\n    count           = 0;\n\n    while ( parser->root.cursor < limit )\n    {\n      cur = parser->root.cursor;\n\n      if ( *cur == ']' )\n      {\n        parser->root.cursor++;\n        goto Exit;\n      }\n\n      else if ( *cur == '<' )\n      {\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          goto Exit;\n\n        /* don't include delimiters */\n        string_size = (FT_Long)( ( parser->root.cursor - cur - 2 + 1 ) / 2 );\n        if ( FT_REALLOC( string_buf, old_string_size, string_size ) )\n          goto Fail;\n\n        allocated = 1;\n\n        parser->root.cursor = cur;\n        (void)T1_ToBytes( parser, string_buf, string_size, &real_size, 1 );\n        old_string_size = string_size;\n        string_size = real_size;\n      }\n\n      else if ( ft_isdigit( *cur ) )\n      {\n        if ( allocated )\n        {\n          FT_ERROR(( \"t42_parse_sfnts: \"\n                     \"can't handle mixed binary and hex strings\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n\n        string_size = T1_ToInt( parser );\n        if ( string_size < 0 )\n        {\n          FT_ERROR(( \"t42_parse_sfnts: invalid string size\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n\n        T1_Skip_PS_Token( parser );             /* `RD' */\n        if ( parser->root.error )\n          return;\n\n        string_buf = parser->root.cursor + 1;   /* one space after `RD' */\n\n        if ( limit - parser->root.cursor < string_size )\n        {\n          FT_ERROR(( \"t42_parse_sfnts: too many binary data\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n        else\n          parser->root.cursor += string_size + 1;\n      }\n\n      if ( !string_buf )\n      {\n        FT_ERROR(( \"t42_parse_sfnts: invalid data in sfnts array\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Fail;\n      }\n\n      /* A string can have a trailing zero (odd) byte for padding. */\n      /* Ignore it.                                                */\n      if ( ( string_size & 1 ) && string_buf[string_size - 1] == 0 )\n        string_size--;\n\n      if ( !string_size )\n      {\n        FT_ERROR(( \"t42_parse_sfnts: invalid string\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Fail;\n      }\n\n      for ( n = 0; n < string_size; n++ )\n      {\n        switch ( status )\n        {\n        case BEFORE_START:\n          /* load offset table, 12 bytes */\n          if ( count < 12 )\n          {\n            face->ttf_data[count++] = string_buf[n];\n            continue;\n          }\n          else\n          {\n            num_tables = 16 * face->ttf_data[4] + face->ttf_data[5];\n            status     = BEFORE_TABLE_DIR;\n            ttf_size   = 12 + 16 * num_tables;\n\n            if ( FT_REALLOC( face->ttf_data, 12, ttf_size ) )\n              goto Fail;\n          }\n          /* fall through */\n\n        case BEFORE_TABLE_DIR:\n          /* the offset table is read; read the table directory */\n          if ( count < ttf_size )\n          {\n            face->ttf_data[count++] = string_buf[n];\n            continue;\n          }\n          else\n          {\n            int       i;\n            FT_ULong  len;\n\n\n            for ( i = 0; i < num_tables; i++ )\n            {\n              FT_Byte*  p = face->ttf_data + 12 + 16 * i + 12;\n\n\n              len = FT_PEEK_ULONG( p );\n\n              /* Pad to a 4-byte boundary length */\n              ttf_size += ( len + 3 ) & ~3;\n            }\n\n            status         = OTHER_TABLES;\n            face->ttf_size = ttf_size;\n\n            /* there are no more than 256 tables, so no size check here */\n            if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables,\n                             ttf_size + 1 ) )\n              goto Fail;\n          }\n          /* fall through */\n\n        case OTHER_TABLES:\n          /* all other tables are just copied */\n          if ( count >= ttf_size )\n          {\n            FT_ERROR(( \"t42_parse_sfnts: too many binary data\\n\" ));\n            error = FT_THROW( Invalid_File_Format );\n            goto Fail;\n          }\n          face->ttf_data[count++] = string_buf[n];\n        }\n      }\n\n      T1_Skip_Spaces( parser );\n    }\n\n    /* if control reaches this point, the format was not valid */\n    error = FT_THROW( Invalid_File_Format );\n\n  Fail:\n    parser->root.error = error;\n\n  Exit:\n    if ( allocated )\n      FT_FREE( string_buf );\n  }\n\n\n  static void\n  t42_parse_charstrings( T42_Face    face,\n                         T42_Loader  loader )\n  {\n    T42_Parser     parser       = &loader->parser;\n    PS_Table       code_table   = &loader->charstrings;\n    PS_Table       name_table   = &loader->glyph_names;\n    PS_Table       swap_table   = &loader->swap_table;\n    FT_Memory      memory       = parser->root.memory;\n    FT_Error       error;\n\n    PSAux_Service  psaux        = (PSAux_Service)face->psaux;\n\n    FT_Byte*       cur;\n    FT_Byte*       limit        = parser->root.limit;\n    FT_UInt        n;\n    FT_UInt        notdef_index = 0;\n    FT_Byte        notdef_found = 0;\n\n\n    T1_Skip_Spaces( parser );\n\n    if ( parser->root.cursor >= limit )\n    {\n      FT_ERROR(( \"t42_parse_charstrings: out of bounds\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    if ( ft_isdigit( *parser->root.cursor ) )\n    {\n      loader->num_glyphs = (FT_UInt)T1_ToInt( parser );\n      if ( parser->root.error )\n        return;\n    }\n    else if ( *parser->root.cursor == '<' )\n    {\n      /* We have `<< ... >>'.  Count the number of `/' in the dictionary */\n      /* to get its size.                                                */\n      FT_UInt  count = 0;\n\n\n      T1_Skip_PS_Token( parser );\n      if ( parser->root.error )\n        return;\n      T1_Skip_Spaces( parser );\n      cur = parser->root.cursor;\n\n      while ( parser->root.cursor < limit )\n      {\n        if ( *parser->root.cursor == '/' )\n          count++;\n        else if ( *parser->root.cursor == '>' )\n        {\n          loader->num_glyphs  = count;\n          parser->root.cursor = cur;        /* rewind */\n          break;\n        }\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          return;\n        T1_Skip_Spaces( parser );\n      }\n    }\n    else\n    {\n      FT_ERROR(( \"t42_parse_charstrings: invalid token\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    if ( parser->root.cursor >= limit )\n    {\n      FT_ERROR(( \"t42_parse_charstrings: out of bounds\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    /* initialize tables */\n\n    error = psaux->ps_table_funcs->init( code_table,\n                                         loader->num_glyphs,\n                                         memory );\n    if ( error )\n      goto Fail;\n\n    error = psaux->ps_table_funcs->init( name_table,\n                                         loader->num_glyphs,\n                                         memory );\n    if ( error )\n      goto Fail;\n\n    /* Initialize table for swapping index notdef_index and */\n    /* index 0 names and codes (if necessary).              */\n\n    error = psaux->ps_table_funcs->init( swap_table, 4, memory );\n    if ( error )\n      goto Fail;\n\n    n = 0;\n\n    for (;;)\n    {\n      /* The format is simple:                   */\n      /*   `/glyphname' + index [+ def]          */\n\n      T1_Skip_Spaces( parser );\n\n      cur = parser->root.cursor;\n      if ( cur >= limit )\n        break;\n\n      /* We stop when we find an `end' keyword or '>' */\n      if ( *cur   == 'e'          &&\n           cur + 3 < limit        &&\n           cur[1] == 'n'          &&\n           cur[2] == 'd'          &&\n           t42_is_space( cur[3] ) )\n        break;\n      if ( *cur == '>' )\n        break;\n\n      T1_Skip_PS_Token( parser );\n      if ( parser->root.error )\n        return;\n\n      if ( *cur == '/' )\n      {\n        FT_PtrDist  len;\n\n\n        if ( cur + 1 >= limit )\n        {\n          FT_ERROR(( \"t42_parse_charstrings: out of bounds\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n\n        cur++;                              /* skip `/' */\n        len = parser->root.cursor - cur;\n\n        error = T1_Add_Table( name_table, n, cur, len + 1 );\n        if ( error )\n          goto Fail;\n\n        /* add a trailing zero to the name table */\n        name_table->elements[n][len] = '\\0';\n\n        /* record index of /.notdef */\n        if ( *cur == '.'                                              &&\n             ft_strcmp( \".notdef\",\n                        (const char*)(name_table->elements[n]) ) == 0 )\n        {\n          notdef_index = n;\n          notdef_found = 1;\n        }\n\n        T1_Skip_Spaces( parser );\n\n        cur = parser->root.cursor;\n\n        (void)T1_ToInt( parser );\n        if ( parser->root.cursor >= limit )\n        {\n          FT_ERROR(( \"t42_parse_charstrings: out of bounds\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Fail;\n        }\n\n        len = parser->root.cursor - cur;\n\n        error = T1_Add_Table( code_table, n, cur, len + 1 );\n        if ( error )\n          goto Fail;\n\n        code_table->elements[n][len] = '\\0';\n\n        n++;\n        if ( n >= loader->num_glyphs )\n          break;\n      }\n    }\n\n    loader->num_glyphs = n;\n\n    if ( !notdef_found )\n    {\n      FT_ERROR(( \"t42_parse_charstrings: no /.notdef glyph\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Fail;\n    }\n\n    /* if /.notdef does not occupy index 0, do our magic. */\n    if ( ft_strcmp( (const char*)\".notdef\",\n                    (const char*)name_table->elements[0] ) )\n    {\n      /* Swap glyph in index 0 with /.notdef glyph.  First, add index 0  */\n      /* name and code entries to swap_table.  Then place notdef_index   */\n      /* name and code entries into swap_table.  Then swap name and code */\n      /* entries at indices notdef_index and 0 using values stored in    */\n      /* swap_table.                                                     */\n\n      /* Index 0 name */\n      error = T1_Add_Table( swap_table, 0,\n                            name_table->elements[0],\n                            name_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      /* Index 0 code */\n      error = T1_Add_Table( swap_table, 1,\n                            code_table->elements[0],\n                            code_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      /* Index notdef_index name */\n      error = T1_Add_Table( swap_table, 2,\n                            name_table->elements[notdef_index],\n                            name_table->lengths [notdef_index] );\n      if ( error )\n        goto Fail;\n\n      /* Index notdef_index code */\n      error = T1_Add_Table( swap_table, 3,\n                            code_table->elements[notdef_index],\n                            code_table->lengths [notdef_index] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, notdef_index,\n                            swap_table->elements[0],\n                            swap_table->lengths [0] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, notdef_index,\n                            swap_table->elements[1],\n                            swap_table->lengths [1] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( name_table, 0,\n                            swap_table->elements[2],\n                            swap_table->lengths [2] );\n      if ( error )\n        goto Fail;\n\n      error = T1_Add_Table( code_table, 0,\n                            swap_table->elements[3],\n                            swap_table->lengths [3] );\n      if ( error )\n        goto Fail;\n\n    }\n\n    return;\n\n  Fail:\n    parser->root.error = error;\n  }\n\n\n  static FT_Error\n  t42_load_keyword( T42_Face    face,\n                    T42_Loader  loader,\n                    T1_Field    field )\n  {\n    FT_Error  error;\n    void*     dummy_object;\n    void**    objects;\n    FT_UInt   max_objects = 0;\n\n\n    /* if the keyword has a dedicated callback, call it */\n    if ( field->type == T1_FIELD_TYPE_CALLBACK )\n    {\n      field->reader( (FT_Face)face, loader );\n      error = loader->parser.root.error;\n      goto Exit;\n    }\n\n    /* now the keyword is either a simple field or a table of fields; */\n    /* we are now going to take care of it                            */\n\n    switch ( field->location )\n    {\n    case T1_FIELD_LOCATION_FONT_INFO:\n      dummy_object = &face->type1.font_info;\n      break;\n\n    case T1_FIELD_LOCATION_FONT_EXTRA:\n      dummy_object = &face->type1.font_extra;\n      break;\n\n    case T1_FIELD_LOCATION_BBOX:\n      dummy_object = &face->type1.font_bbox;\n      break;\n\n    default:\n      dummy_object = &face->type1;\n    }\n\n    objects = &dummy_object;\n\n    if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||\n         field->type == T1_FIELD_TYPE_FIXED_ARRAY   )\n      error = T1_Load_Field_Table( &loader->parser, field,\n                                   objects, max_objects, 0 );\n    else\n      error = T1_Load_Field( &loader->parser, field,\n                             objects, max_objects, 0 );\n\n   Exit:\n    return error;\n  }\n\n\n  FT_LOCAL_DEF( FT_Error )\n  t42_parse_dict( T42_Face    face,\n                  T42_Loader  loader,\n                  FT_Byte*    base,\n                  FT_Long     size )\n  {\n    T42_Parser  parser     = &loader->parser;\n    FT_Byte*    limit;\n    FT_Int      n_keywords = (FT_Int)( sizeof ( t42_keywords ) /\n                                         sizeof ( t42_keywords[0] ) );\n\n\n    parser->root.cursor = base;\n    parser->root.limit  = base + size;\n    parser->root.error  = FT_Err_Ok;\n\n    limit = parser->root.limit;\n\n    T1_Skip_Spaces( parser );\n\n    while ( parser->root.cursor < limit )\n    {\n      FT_Byte*  cur;\n\n\n      cur = parser->root.cursor;\n\n      /* look for `FontDirectory' which causes problems for some fonts */\n      if ( *cur == 'F' && cur + 25 < limit                    &&\n           ft_strncmp( (char*)cur, \"FontDirectory\", 13 ) == 0 )\n      {\n        FT_Byte*  cur2;\n\n\n        /* skip the `FontDirectory' keyword */\n        T1_Skip_PS_Token( parser );\n        T1_Skip_Spaces  ( parser );\n        cur = cur2 = parser->root.cursor;\n\n        /* look up the `known' keyword */\n        while ( cur < limit )\n        {\n          if ( *cur == 'k' && cur + 5 < limit             &&\n                ft_strncmp( (char*)cur, \"known\", 5 ) == 0 )\n            break;\n\n          T1_Skip_PS_Token( parser );\n          if ( parser->root.error )\n            goto Exit;\n          T1_Skip_Spaces  ( parser );\n          cur = parser->root.cursor;\n        }\n\n        if ( cur < limit )\n        {\n          T1_TokenRec  token;\n\n\n          /* skip the `known' keyword and the token following it */\n          T1_Skip_PS_Token( parser );\n          T1_ToToken( parser, &token );\n\n          /* if the last token was an array, skip it! */\n          if ( token.type == T1_TOKEN_TYPE_ARRAY )\n            cur2 = parser->root.cursor;\n        }\n        parser->root.cursor = cur2;\n      }\n\n      /* look for immediates */\n      else if ( *cur == '/' && cur + 2 < limit )\n      {\n        FT_PtrDist  len;\n\n\n        cur++;\n\n        parser->root.cursor = cur;\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          goto Exit;\n\n        len = parser->root.cursor - cur;\n\n        if ( len > 0 && len < 22 && parser->root.cursor < limit )\n        {\n          int  i;\n\n\n          /* now compare the immediate name to the keyword table */\n\n          /* loop through all known keywords */\n          for ( i = 0; i < n_keywords; i++ )\n          {\n            T1_Field  keyword = (T1_Field)&t42_keywords[i];\n            FT_Byte   *name   = (FT_Byte*)keyword->ident;\n\n\n            if ( !name )\n              continue;\n\n            if ( cur[0] == name[0]                                  &&\n                 len == (FT_PtrDist)ft_strlen( (const char *)name ) &&\n                 ft_memcmp( cur, name, len ) == 0                   )\n            {\n              /* we found it -- run the parsing callback! */\n              parser->root.error = t42_load_keyword( face,\n                                                     loader,\n                                                     keyword );\n              if ( parser->root.error )\n                return parser->root.error;\n              break;\n            }\n          }\n        }\n      }\n      else\n      {\n        T1_Skip_PS_Token( parser );\n        if ( parser->root.error )\n          goto Exit;\n      }\n\n      T1_Skip_Spaces( parser );\n    }\n\n  Exit:\n    return parser->root.error;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  t42_loader_init( T42_Loader  loader,\n                   T42_Face    face )\n  {\n    FT_UNUSED( face );\n\n    FT_MEM_ZERO( loader, sizeof ( *loader ) );\n    loader->num_glyphs = 0;\n    loader->num_chars  = 0;\n\n    /* initialize the tables -- simply set their `init' field to 0 */\n    loader->encoding_table.init = 0;\n    loader->charstrings.init    = 0;\n    loader->glyph_names.init    = 0;\n  }\n\n\n  FT_LOCAL_DEF( void )\n  t42_loader_done( T42_Loader  loader )\n  {\n    T42_Parser  parser = &loader->parser;\n\n\n    /* finalize tables */\n    T1_Release_Table( &loader->encoding_table );\n    T1_Release_Table( &loader->charstrings );\n    T1_Release_Table( &loader->glyph_names );\n    T1_Release_Table( &loader->swap_table );\n\n    /* finalize parser */\n    t42_parser_done( parser );\n  }\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type42/t42parse.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t42parse.h                                                             */\n/*                                                                         */\n/*    Type 42 font parser (specification).                                 */\n/*                                                                         */\n/*  Copyright 2002, 2003 by Roberto Alameda.                               */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T42PARSE_H__\n#define __T42PARSE_H__\n\n\n#include \"t42objs.h\"\n#include FT_INTERNAL_POSTSCRIPT_AUX_H\n\n\nFT_BEGIN_HEADER\n\n  typedef struct  T42_ParserRec_\n  {\n    PS_ParserRec  root;\n    FT_Stream     stream;\n\n    FT_Byte*      base_dict;\n    FT_Long       base_len;\n\n    FT_Bool       in_memory;\n\n  } T42_ParserRec, *T42_Parser;\n\n\n  typedef struct  T42_Loader_\n  {\n    T42_ParserRec  parser;          /* parser used to read the stream */\n\n    FT_UInt        num_chars;       /* number of characters in encoding */\n    PS_TableRec    encoding_table;  /* PS_Table used to store the       */\n                                    /* encoding character names         */\n\n    FT_UInt        num_glyphs;\n    PS_TableRec    glyph_names;\n    PS_TableRec    charstrings;\n    PS_TableRec    swap_table;      /* For moving .notdef glyph to index 0. */\n\n  } T42_LoaderRec, *T42_Loader;\n\n\n  FT_LOCAL( FT_Error )\n  t42_parser_init( T42_Parser     parser,\n                   FT_Stream      stream,\n                   FT_Memory      memory,\n                   PSAux_Service  psaux );\n\n  FT_LOCAL( void )\n  t42_parser_done( T42_Parser  parser );\n\n\n  FT_LOCAL( FT_Error )\n  t42_parse_dict( T42_Face    face,\n                  T42_Loader  loader,\n                  FT_Byte*    base,\n                  FT_Long     size );\n\n\n  FT_LOCAL( void )\n  t42_loader_init( T42_Loader  loader,\n                   T42_Face    face );\n\n  FT_LOCAL( void )\n  t42_loader_done( T42_Loader  loader );\n\n\n /* */\n\nFT_END_HEADER\n\n\n#endif /* __T42PARSE_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type42/t42types.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  t42types.h                                                             */\n/*                                                                         */\n/*    Type 42 font data types (specification only).                        */\n/*                                                                         */\n/*  Copyright 2002, 2003, 2006, 2008 by Roberto Alameda.                   */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __T42TYPES_H__\n#define __T42TYPES_H__\n\n\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_TYPE1_TABLES_H\n#include FT_INTERNAL_TYPE1_TYPES_H\n#include FT_INTERNAL_POSTSCRIPT_HINTS_H\n\n\nFT_BEGIN_HEADER\n\n\n  typedef struct  T42_FaceRec_\n  {\n    FT_FaceRec      root;\n    T1_FontRec      type1;\n    const void*     psnames;\n    const void*     psaux;\n#if 0\n    const void*     afm_data;\n#endif\n    FT_Byte*        ttf_data;\n    FT_ULong        ttf_size;\n    FT_Face         ttf_face;\n    FT_CharMapRec   charmaprecs[2];\n    FT_CharMap      charmaps[2];\n    PS_UnicodesRec  unicode_map;\n\n  } T42_FaceRec, *T42_Face;\n\n\nFT_END_HEADER\n\n#endif /* __T42TYPES_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/type42/type42.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  type42.c                                                               */\n/*                                                                         */\n/*    FreeType Type 42 driver component.                                   */\n/*                                                                         */\n/*  Copyright 2002 by                                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n#define FT_MAKE_OPTION_SINGLE_OBJECT\n\n#include <ft2build.h>\n#include \"t42objs.c\"\n#include \"t42parse.c\"\n#include \"t42drivr.c\"\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/winfonts/Jamfile",
    "content": "# FreeType 2 src/winfonts Jamfile\n#\n# Copyright 2001 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\nSubDir  FT2_TOP $(FT2_SRC_DIR) winfonts ;\n\nLibrary  $(FT2_LIB) : winfnt.c ;\n\n# end of src/winfonts Jamfile\n"
  },
  {
    "path": "libs/freetype/src/winfonts/fnterrs.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  fnterrs.h                                                              */\n/*                                                                         */\n/*    Win FNT/FON error codes (specification only).                        */\n/*                                                                         */\n/*  Copyright 2001, 2012 by                                                */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This file is used to define the Windows FNT/FON error enumeration     */\n  /* constants.                                                            */\n  /*                                                                       */\n  /*************************************************************************/\n\n#ifndef __FNTERRS_H__\n#define __FNTERRS_H__\n\n#include FT_MODULE_ERRORS_H\n\n#undef __FTERRORS_H__\n\n#undef  FT_ERR_PREFIX\n#define FT_ERR_PREFIX  FNT_Err_\n#define FT_ERR_BASE    FT_Mod_Err_Winfonts\n\n#include FT_ERRORS_H\n\n#endif /* __FNTERRS_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/winfonts/module.mk",
    "content": "#\n# FreeType 2 Windows FNT/FON module definition\n#\n\n\n# Copyright 1996-2000, 2006 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\nFTMODULE_H_COMMANDS += WINDOWS_DRIVER\n\ndefine WINDOWS_DRIVER\n$(OPEN_DRIVER) FT_Driver_ClassRec, winfnt_driver_class $(CLOSE_DRIVER)\n$(ECHO_DRIVER)winfnt    $(ECHO_DRIVER_DESC)Windows bitmap fonts with extension *.fnt or *.fon$(ECHO_DRIVER_DONE)\nendef\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/winfonts/rules.mk",
    "content": "#\n# FreeType 2 Windows FNT/FON driver configuration rules\n#\n\n\n# Copyright 1996-2000, 2001, 2003 by\n# David Turner, Robert Wilhelm, and Werner Lemberg.\n#\n# This file is part of the FreeType project, and may only be used, modified,\n# and distributed under the terms of the FreeType project license,\n# LICENSE.TXT.  By continuing to use, modify, or distribute this file you\n# indicate that you have read the license and understand and accept it\n# fully.\n\n\n# Windows driver directory\n#\nFNT_DIR := $(SRC_DIR)/winfonts\n\n\nFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(FNT_DIR))\n\n\n# Windows driver sources (i.e., C files)\n#\nFNT_DRV_SRC := $(FNT_DIR)/winfnt.c\n\n# Windows driver headers\n#\nFNT_DRV_H := $(FNT_DRV_SRC:%.c=%.h) \\\n             $(FNT_DIR)/fnterrs.h\n\n\n# Windows driver object(s)\n#\n#   FNT_DRV_OBJ_M is used during `multi' builds\n#   FNT_DRV_OBJ_S is used during `single' builds\n#\nFNT_DRV_OBJ_M := $(FNT_DRV_SRC:$(FNT_DIR)/%.c=$(OBJ_DIR)/%.$O)\nFNT_DRV_OBJ_S := $(OBJ_DIR)/winfnt.$O\n\n# Windows driver source file for single build\n#\nFNT_DRV_SRC_S := $(FNT_DIR)/winfnt.c\n\n\n# Windows driver - single object\n#\n$(FNT_DRV_OBJ_S): $(FNT_DRV_SRC_S) $(FNT_DRV_SRC) $(FREETYPE_H) $(FNT_DRV_H)\n\t$(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(FNT_DRV_SRC_S))\n\n\n# Windows driver - multiple objects\n#\n$(OBJ_DIR)/%.$O: $(FNT_DIR)/%.c $(FREETYPE_H) $(FNT_DRV_H)\n\t$(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)\n\n\n# update main driver object lists\n#\nDRV_OBJS_S += $(FNT_DRV_OBJ_S)\nDRV_OBJS_M += $(FNT_DRV_OBJ_M)\n\n\n# EOF\n"
  },
  {
    "path": "libs/freetype/src/winfonts/winfnt.c",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  winfnt.c                                                               */\n/*                                                                         */\n/*    FreeType font driver for Windows FNT/FON files                       */\n/*                                                                         */\n/*  Copyright 1996-2004, 2006-2013 by                                      */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*  Copyright 2003 Huw D M Davies for Codeweavers                          */\n/*  Copyright 2007 Dmitry Timoshkov for Codeweavers                        */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#include <ft2build.h>\n#include FT_WINFONTS_H\n#include FT_INTERNAL_DEBUG_H\n#include FT_INTERNAL_STREAM_H\n#include FT_INTERNAL_OBJECTS_H\n#include FT_TRUETYPE_IDS_H\n\n#include \"winfnt.h\"\n#include \"fnterrs.h\"\n#include FT_SERVICE_WINFNT_H\n#include FT_SERVICE_XFREE86_NAME_H\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */\n  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */\n  /* messages during execution.                                            */\n  /*                                                                       */\n#undef  FT_COMPONENT\n#define FT_COMPONENT  trace_winfnt\n\n\n  static const FT_Frame_Field  winmz_header_fields[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  WinMZ_HeaderRec\n\n    FT_FRAME_START( 64 ),\n      FT_FRAME_USHORT_LE ( magic ),\n      FT_FRAME_SKIP_BYTES( 29 * 2 ),\n      FT_FRAME_ULONG_LE  ( lfanew ),\n    FT_FRAME_END\n  };\n\n  static const FT_Frame_Field  winne_header_fields[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  WinNE_HeaderRec\n\n    FT_FRAME_START( 40 ),\n      FT_FRAME_USHORT_LE ( magic ),\n      FT_FRAME_SKIP_BYTES( 34 ),\n      FT_FRAME_USHORT_LE ( resource_tab_offset ),\n      FT_FRAME_USHORT_LE ( rname_tab_offset ),\n    FT_FRAME_END\n  };\n\n  static const FT_Frame_Field  winpe32_header_fields[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  WinPE32_HeaderRec\n\n    FT_FRAME_START( 248 ),\n      FT_FRAME_ULONG_LE  ( magic ),   /* PE00 */\n      FT_FRAME_USHORT_LE ( machine ), /* 0x014c - i386 */\n      FT_FRAME_USHORT_LE ( number_of_sections ),\n      FT_FRAME_SKIP_BYTES( 12 ),\n      FT_FRAME_USHORT_LE ( size_of_optional_header ),\n      FT_FRAME_SKIP_BYTES( 2 ),\n      FT_FRAME_USHORT_LE ( magic32 ), /* 0x10b */\n      FT_FRAME_SKIP_BYTES( 110 ),\n      FT_FRAME_ULONG_LE  ( rsrc_virtual_address ),\n      FT_FRAME_ULONG_LE  ( rsrc_size ),\n      FT_FRAME_SKIP_BYTES( 104 ),\n    FT_FRAME_END\n  };\n\n  static const FT_Frame_Field  winpe32_section_fields[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  WinPE32_SectionRec\n\n    FT_FRAME_START( 40 ),\n      FT_FRAME_BYTES     ( name, 8 ),\n      FT_FRAME_SKIP_BYTES( 4 ),\n      FT_FRAME_ULONG_LE  ( virtual_address ),\n      FT_FRAME_ULONG_LE  ( size_of_raw_data ),\n      FT_FRAME_ULONG_LE  ( pointer_to_raw_data ),\n      FT_FRAME_SKIP_BYTES( 16 ),\n    FT_FRAME_END\n  };\n\n  static const FT_Frame_Field  winpe_rsrc_dir_fields[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  WinPE_RsrcDirRec\n\n    FT_FRAME_START( 16 ),\n      FT_FRAME_ULONG_LE ( characteristics ),\n      FT_FRAME_ULONG_LE ( time_date_stamp ),\n      FT_FRAME_USHORT_LE( major_version ),\n      FT_FRAME_USHORT_LE( minor_version ),\n      FT_FRAME_USHORT_LE( number_of_named_entries ),\n      FT_FRAME_USHORT_LE( number_of_id_entries ),\n    FT_FRAME_END\n  };\n\n  static const FT_Frame_Field  winpe_rsrc_dir_entry_fields[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  WinPE_RsrcDirEntryRec\n\n    FT_FRAME_START( 8 ),\n      FT_FRAME_ULONG_LE( name ),\n      FT_FRAME_ULONG_LE( offset ),\n    FT_FRAME_END\n  };\n\n  static const FT_Frame_Field  winpe_rsrc_data_entry_fields[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  WinPE_RsrcDataEntryRec\n\n    FT_FRAME_START( 16 ),\n      FT_FRAME_ULONG_LE( offset_to_data ),\n      FT_FRAME_ULONG_LE( size ),\n      FT_FRAME_ULONG_LE( code_page ),\n      FT_FRAME_ULONG_LE( reserved ),\n    FT_FRAME_END\n  };\n\n  static const FT_Frame_Field  winfnt_header_fields[] =\n  {\n#undef  FT_STRUCTURE\n#define FT_STRUCTURE  FT_WinFNT_HeaderRec\n\n    FT_FRAME_START( 148 ),\n      FT_FRAME_USHORT_LE( version ),\n      FT_FRAME_ULONG_LE ( file_size ),\n      FT_FRAME_BYTES    ( copyright, 60 ),\n      FT_FRAME_USHORT_LE( file_type ),\n      FT_FRAME_USHORT_LE( nominal_point_size ),\n      FT_FRAME_USHORT_LE( vertical_resolution ),\n      FT_FRAME_USHORT_LE( horizontal_resolution ),\n      FT_FRAME_USHORT_LE( ascent ),\n      FT_FRAME_USHORT_LE( internal_leading ),\n      FT_FRAME_USHORT_LE( external_leading ),\n      FT_FRAME_BYTE     ( italic ),\n      FT_FRAME_BYTE     ( underline ),\n      FT_FRAME_BYTE     ( strike_out ),\n      FT_FRAME_USHORT_LE( weight ),\n      FT_FRAME_BYTE     ( charset ),\n      FT_FRAME_USHORT_LE( pixel_width ),\n      FT_FRAME_USHORT_LE( pixel_height ),\n      FT_FRAME_BYTE     ( pitch_and_family ),\n      FT_FRAME_USHORT_LE( avg_width ),\n      FT_FRAME_USHORT_LE( max_width ),\n      FT_FRAME_BYTE     ( first_char ),\n      FT_FRAME_BYTE     ( last_char ),\n      FT_FRAME_BYTE     ( default_char ),\n      FT_FRAME_BYTE     ( break_char ),\n      FT_FRAME_USHORT_LE( bytes_per_row ),\n      FT_FRAME_ULONG_LE ( device_offset ),\n      FT_FRAME_ULONG_LE ( face_name_offset ),\n      FT_FRAME_ULONG_LE ( bits_pointer ),\n      FT_FRAME_ULONG_LE ( bits_offset ),\n      FT_FRAME_BYTE     ( reserved ),\n      FT_FRAME_ULONG_LE ( flags ),\n      FT_FRAME_USHORT_LE( A_space ),\n      FT_FRAME_USHORT_LE( B_space ),\n      FT_FRAME_USHORT_LE( C_space ),\n      FT_FRAME_ULONG_LE ( color_table_offset ),\n      FT_FRAME_BYTES    ( reserved1, 16 ),\n    FT_FRAME_END\n  };\n\n\n  static void\n  fnt_font_done( FNT_Face face )\n  {\n    FT_Memory  memory = FT_FACE( face )->memory;\n    FT_Stream  stream = FT_FACE( face )->stream;\n    FNT_Font   font   = face->font;\n\n\n    if ( !font )\n      return;\n\n    if ( font->fnt_frame )\n      FT_FRAME_RELEASE( font->fnt_frame );\n    FT_FREE( font->family_name );\n\n    FT_FREE( font );\n    face->font = 0;\n  }\n\n\n  static FT_Error\n  fnt_font_load( FNT_Font   font,\n                 FT_Stream  stream )\n  {\n    FT_Error          error;\n    FT_WinFNT_Header  header = &font->header;\n    FT_Bool           new_format;\n    FT_UInt           size;\n\n\n    /* first of all, read the FNT header */\n    if ( FT_STREAM_SEEK( font->offset )                        ||\n         FT_STREAM_READ_FIELDS( winfnt_header_fields, header ) )\n      goto Exit;\n\n    /* check header */\n    if ( header->version != 0x200 &&\n         header->version != 0x300 )\n    {\n      FT_TRACE2(( \"  not a Windows FNT file\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    new_format = FT_BOOL( font->header.version == 0x300 );\n    size       = new_format ? 148 : 118;\n\n    if ( header->file_size < size )\n    {\n      FT_TRACE2(( \"  not a Windows FNT file\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* Version 2 doesn't have these fields */\n    if ( header->version == 0x200 )\n    {\n      header->flags   = 0;\n      header->A_space = 0;\n      header->B_space = 0;\n      header->C_space = 0;\n\n      header->color_table_offset = 0;\n    }\n\n    if ( header->file_type & 1 )\n    {\n      FT_TRACE2(( \"[can't handle vector FNT fonts]\\n\" ));\n      error = FT_THROW( Unknown_File_Format );\n      goto Exit;\n    }\n\n    /* this is a FNT file/table; extract its frame */\n    if ( FT_STREAM_SEEK( font->offset )                         ||\n         FT_FRAME_EXTRACT( header->file_size, font->fnt_frame ) )\n      goto Exit;\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  fnt_face_get_dll_font( FNT_Face  face,\n                         FT_Int    face_index )\n  {\n    FT_Error         error;\n    FT_Stream        stream = FT_FACE( face )->stream;\n    FT_Memory        memory = FT_FACE( face )->memory;\n    WinMZ_HeaderRec  mz_header;\n\n\n    face->font = 0;\n\n    /* does it begin with an MZ header? */\n    if ( FT_STREAM_SEEK( 0 )                                      ||\n         FT_STREAM_READ_FIELDS( winmz_header_fields, &mz_header ) )\n      goto Exit;\n\n    error = FT_ERR( Unknown_File_Format );\n    if ( mz_header.magic == WINFNT_MZ_MAGIC )\n    {\n      /* yes, now look for an NE header in the file */\n      WinNE_HeaderRec  ne_header;\n\n\n      FT_TRACE2(( \"MZ signature found\\n\" ));\n\n      if ( FT_STREAM_SEEK( mz_header.lfanew )                       ||\n           FT_STREAM_READ_FIELDS( winne_header_fields, &ne_header ) )\n        goto Exit;\n\n      error = FT_ERR( Unknown_File_Format );\n      if ( ne_header.magic == WINFNT_NE_MAGIC )\n      {\n        /* good, now look into the resource table for each FNT resource */\n        FT_ULong   res_offset  = mz_header.lfanew +\n                                   ne_header.resource_tab_offset;\n        FT_UShort  size_shift;\n        FT_UShort  font_count  = 0;\n        FT_ULong   font_offset = 0;\n\n\n        FT_TRACE2(( \"NE signature found\\n\" ));\n\n        if ( FT_STREAM_SEEK( res_offset )                    ||\n             FT_FRAME_ENTER( ne_header.rname_tab_offset -\n                             ne_header.resource_tab_offset ) )\n          goto Exit;\n\n        size_shift = FT_GET_USHORT_LE();\n\n        for (;;)\n        {\n          FT_UShort  type_id, count;\n\n\n          type_id = FT_GET_USHORT_LE();\n          if ( !type_id )\n            break;\n\n          count = FT_GET_USHORT_LE();\n\n          if ( type_id == 0x8008U )\n          {\n            font_count  = count;\n            font_offset = (FT_ULong)( FT_STREAM_POS() + 4 +\n                                      ( stream->cursor - stream->limit ) );\n            break;\n          }\n\n          stream->cursor += 4 + count * 12;\n        }\n\n        FT_FRAME_EXIT();\n\n        if ( !font_count || !font_offset )\n        {\n          FT_TRACE2(( \"this file doesn't contain any FNT resources\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        /* loading `winfnt_header_fields' needs at least 118 bytes;    */\n        /* use this as a rough measure to check the expected font size */\n        if ( font_count * 118UL > stream->size )\n        {\n          FT_TRACE2(( \"invalid number of faces\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        face->root.num_faces = font_count;\n\n        if ( face_index >= font_count )\n        {\n          error = FT_THROW( Invalid_Argument );\n          goto Exit;\n        }\n        else if ( face_index < 0 )\n          goto Exit;\n\n        if ( FT_NEW( face->font ) )\n          goto Exit;\n\n        if ( FT_STREAM_SEEK( font_offset + face_index * 12 ) ||\n             FT_FRAME_ENTER( 12 )                            )\n          goto Fail;\n\n        face->font->offset   = (FT_ULong)FT_GET_USHORT_LE() << size_shift;\n        face->font->fnt_size = (FT_ULong)FT_GET_USHORT_LE() << size_shift;\n\n        stream->cursor += 8;\n\n        FT_FRAME_EXIT();\n\n        error = fnt_font_load( face->font, stream );\n      }\n      else if ( ne_header.magic == WINFNT_PE_MAGIC )\n      {\n        WinPE32_HeaderRec       pe32_header;\n        WinPE32_SectionRec      pe32_section;\n        WinPE_RsrcDirRec        root_dir, name_dir, lang_dir;\n        WinPE_RsrcDirEntryRec   dir_entry1, dir_entry2, dir_entry3;\n        WinPE_RsrcDataEntryRec  data_entry;\n\n        FT_Long    root_dir_offset, name_dir_offset, lang_dir_offset;\n        FT_UShort  i, j, k;\n\n\n        FT_TRACE2(( \"PE signature found\\n\" ));\n\n        if ( FT_STREAM_SEEK( mz_header.lfanew )                           ||\n             FT_STREAM_READ_FIELDS( winpe32_header_fields, &pe32_header ) )\n          goto Exit;\n\n        FT_TRACE2(( \"magic %04lx, machine %02x, number_of_sections %u, \"\n                    \"size_of_optional_header %02x\\n\"\n                    \"magic32 %02x, rsrc_virtual_address %04lx, \"\n                    \"rsrc_size %04lx\\n\",\n                    pe32_header.magic, pe32_header.machine,\n                    pe32_header.number_of_sections,\n                    pe32_header.size_of_optional_header,\n                    pe32_header.magic32, pe32_header.rsrc_virtual_address,\n                    pe32_header.rsrc_size ));\n\n        if ( pe32_header.magic != WINFNT_PE_MAGIC /* check full signature */ ||\n             pe32_header.machine != 0x014c /* i386 */                        ||\n             pe32_header.size_of_optional_header != 0xe0 /* FIXME */         ||\n             pe32_header.magic32 != 0x10b                                    )\n        {\n          FT_TRACE2(( \"this file has an invalid PE header\\n\" ));\n          error = FT_THROW( Invalid_File_Format );\n          goto Exit;\n        }\n\n        face->root.num_faces = 0;\n\n        for ( i = 0; i < pe32_header.number_of_sections; i++ )\n        {\n          if ( FT_STREAM_READ_FIELDS( winpe32_section_fields,\n                                      &pe32_section ) )\n            goto Exit;\n\n          FT_TRACE2(( \"name %.8s, va %04lx, size %04lx, offset %04lx\\n\",\n                      pe32_section.name, pe32_section.virtual_address,\n                      pe32_section.size_of_raw_data,\n                      pe32_section.pointer_to_raw_data ));\n\n          if ( pe32_header.rsrc_virtual_address ==\n                 pe32_section.virtual_address )\n            goto Found_rsrc_section;\n        }\n\n        FT_TRACE2(( \"this file doesn't contain any resources\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n\n      Found_rsrc_section:\n        FT_TRACE2(( \"found resources section %.8s\\n\", pe32_section.name ));\n\n        if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data )        ||\n             FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &root_dir ) )\n          goto Exit;\n\n        root_dir_offset = pe32_section.pointer_to_raw_data;\n\n        for ( i = 0; i < root_dir.number_of_named_entries +\n                           root_dir.number_of_id_entries; i++ )\n        {\n          if ( FT_STREAM_SEEK( root_dir_offset + 16 + i * 8 )      ||\n               FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields,\n                                      &dir_entry1 )                )\n            goto Exit;\n\n          if ( !(dir_entry1.offset & 0x80000000UL ) /* DataIsDirectory */ )\n          {\n            error = FT_THROW( Invalid_File_Format );\n            goto Exit;\n          }\n\n          dir_entry1.offset &= ~0x80000000UL;\n\n          name_dir_offset = pe32_section.pointer_to_raw_data +\n                            dir_entry1.offset;\n\n          if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data +\n                               dir_entry1.offset )                       ||\n               FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &name_dir ) )\n            goto Exit;\n\n          for ( j = 0; j < name_dir.number_of_named_entries +\n                             name_dir.number_of_id_entries; j++ )\n          {\n            if ( FT_STREAM_SEEK( name_dir_offset + 16 + j * 8 )      ||\n                 FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields,\n                                        &dir_entry2 )                )\n              goto Exit;\n\n            if ( !(dir_entry2.offset & 0x80000000UL ) /* DataIsDirectory */ )\n            {\n              error = FT_THROW( Invalid_File_Format );\n              goto Exit;\n            }\n\n            dir_entry2.offset &= ~0x80000000UL;\n\n            lang_dir_offset = pe32_section.pointer_to_raw_data +\n                                dir_entry2.offset;\n\n            if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data +\n                                   dir_entry2.offset )                     ||\n                 FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &lang_dir ) )\n              goto Exit;\n\n            for ( k = 0; k < lang_dir.number_of_named_entries +\n                               lang_dir.number_of_id_entries; k++ )\n            {\n              if ( FT_STREAM_SEEK( lang_dir_offset + 16 + k * 8 )      ||\n                   FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields,\n                                          &dir_entry3 )                )\n                goto Exit;\n\n              if ( dir_entry2.offset & 0x80000000UL /* DataIsDirectory */ )\n              {\n                error = FT_THROW( Invalid_File_Format );\n                goto Exit;\n              }\n\n              if ( dir_entry1.name == 8 /* RT_FONT */ )\n              {\n                if ( FT_STREAM_SEEK( root_dir_offset + dir_entry3.offset ) ||\n                     FT_STREAM_READ_FIELDS( winpe_rsrc_data_entry_fields,\n                                            &data_entry )                  )\n                  goto Exit;\n\n                FT_TRACE2(( \"found font #%lu, offset %04lx, \"\n                            \"size %04lx, cp %lu\\n\",\n                            dir_entry2.name,\n                            pe32_section.pointer_to_raw_data +\n                              data_entry.offset_to_data -\n                              pe32_section.virtual_address,\n                            data_entry.size, data_entry.code_page ));\n\n                if ( face_index == face->root.num_faces )\n                {\n                  if ( FT_NEW( face->font ) )\n                    goto Exit;\n\n                  face->font->offset   = pe32_section.pointer_to_raw_data +\n                                           data_entry.offset_to_data -\n                                           pe32_section.virtual_address;\n                  face->font->fnt_size = data_entry.size;\n\n                  error = fnt_font_load( face->font, stream );\n                  if ( error )\n                  {\n                    FT_TRACE2(( \"font #%lu load error %d\\n\",\n                                dir_entry2.name, error ));\n                    goto Fail;\n                  }\n                  else\n                    FT_TRACE2(( \"font #%lu successfully loaded\\n\",\n                                dir_entry2.name ));\n                }\n\n                face->root.num_faces++;\n              }\n            }\n          }\n        }\n      }\n\n      if ( !face->root.num_faces )\n      {\n        FT_TRACE2(( \"this file doesn't contain any RT_FONT resources\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      if ( face_index >= face->root.num_faces )\n      {\n        error = FT_THROW( Invalid_Argument );\n        goto Exit;\n      }\n    }\n\n  Fail:\n    if ( error )\n      fnt_font_done( face );\n\n  Exit:\n    return error;\n  }\n\n\n  typedef struct  FNT_CMapRec_\n  {\n    FT_CMapRec  cmap;\n    FT_UInt32   first;\n    FT_UInt32   count;\n\n  } FNT_CMapRec, *FNT_CMap;\n\n\n  static FT_Error\n  fnt_cmap_init( FNT_CMap  cmap )\n  {\n    FNT_Face  face = (FNT_Face)FT_CMAP_FACE( cmap );\n    FNT_Font  font = face->font;\n\n\n    cmap->first = (FT_UInt32)  font->header.first_char;\n    cmap->count = (FT_UInt32)( font->header.last_char - cmap->first + 1 );\n\n    return 0;\n  }\n\n\n  static FT_UInt\n  fnt_cmap_char_index( FNT_CMap   cmap,\n                       FT_UInt32  char_code )\n  {\n    FT_UInt  gindex = 0;\n\n\n    char_code -= cmap->first;\n    if ( char_code < cmap->count )\n      /* we artificially increase the glyph index; */\n      /* FNT_Load_Glyph reverts to the right one   */\n      gindex = (FT_UInt)( char_code + 1 );\n    return gindex;\n  }\n\n\n  static FT_UInt32\n  fnt_cmap_char_next( FNT_CMap    cmap,\n                      FT_UInt32  *pchar_code )\n  {\n    FT_UInt    gindex = 0;\n    FT_UInt32  result = 0;\n    FT_UInt32  char_code = *pchar_code + 1;\n\n\n    if ( char_code <= cmap->first )\n    {\n      result = cmap->first;\n      gindex = 1;\n    }\n    else\n    {\n      char_code -= cmap->first;\n      if ( char_code < cmap->count )\n      {\n        result = cmap->first + char_code;\n        gindex = (FT_UInt)( char_code + 1 );\n      }\n    }\n\n    *pchar_code = result;\n    return gindex;\n  }\n\n\n  static const FT_CMap_ClassRec  fnt_cmap_class_rec =\n  {\n    sizeof ( FNT_CMapRec ),\n\n    (FT_CMap_InitFunc)     fnt_cmap_init,\n    (FT_CMap_DoneFunc)     NULL,\n    (FT_CMap_CharIndexFunc)fnt_cmap_char_index,\n    (FT_CMap_CharNextFunc) fnt_cmap_char_next,\n\n    NULL, NULL, NULL, NULL, NULL\n  };\n\n  static FT_CMap_Class const  fnt_cmap_class = &fnt_cmap_class_rec;\n\n\n  static void\n  FNT_Face_Done( FT_Face  fntface )       /* FNT_Face */\n  {\n    FNT_Face   face = (FNT_Face)fntface;\n    FT_Memory  memory;\n\n\n    if ( !face )\n      return;\n\n    memory = FT_FACE_MEMORY( face );\n\n    fnt_font_done( face );\n\n    FT_FREE( fntface->available_sizes );\n    fntface->num_fixed_sizes = 0;\n  }\n\n\n  static FT_Error\n  FNT_Face_Init( FT_Stream      stream,\n                 FT_Face        fntface,        /* FNT_Face */\n                 FT_Int         face_index,\n                 FT_Int         num_params,\n                 FT_Parameter*  params )\n  {\n    FNT_Face   face   = (FNT_Face)fntface;\n    FT_Error   error;\n    FT_Memory  memory = FT_FACE_MEMORY( face );\n\n    FT_UNUSED( num_params );\n    FT_UNUSED( params );\n\n\n    FT_TRACE2(( \"Windows FNT driver\\n\" ));\n\n    /* try to load font from a DLL */\n    error = fnt_face_get_dll_font( face, face_index );\n    if ( !error && face_index < 0 )\n      goto Exit;\n\n    if ( FT_ERR_EQ( error, Unknown_File_Format ) )\n    {\n      /* this didn't work; try to load a single FNT font */\n      FNT_Font  font;\n\n      if ( FT_NEW( face->font ) )\n        goto Exit;\n\n      fntface->num_faces = 1;\n\n      font           = face->font;\n      font->offset   = 0;\n      font->fnt_size = stream->size;\n\n      error = fnt_font_load( font, stream );\n\n      if ( !error )\n      {\n        if ( face_index > 0 )\n          error = FT_THROW( Invalid_Argument );\n        else if ( face_index < 0 )\n          goto Exit;\n      }\n    }\n\n    if ( error )\n      goto Fail;\n\n    /* we now need to fill the root FT_Face fields */\n    /* with relevant information                   */\n    {\n      FT_Face     root = FT_FACE( face );\n      FNT_Font    font = face->font;\n      FT_PtrDist  family_size;\n\n\n      root->face_index = face_index;\n\n      root->face_flags = FT_FACE_FLAG_FIXED_SIZES |\n                         FT_FACE_FLAG_HORIZONTAL;\n\n      if ( font->header.avg_width == font->header.max_width )\n        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;\n\n      if ( font->header.italic )\n        root->style_flags |= FT_STYLE_FLAG_ITALIC;\n\n      if ( font->header.weight >= 800 )\n        root->style_flags |= FT_STYLE_FLAG_BOLD;\n\n      /* set up the `fixed_sizes' array */\n      if ( FT_NEW_ARRAY( root->available_sizes, 1 ) )\n        goto Fail;\n\n      root->num_fixed_sizes = 1;\n\n      {\n        FT_Bitmap_Size*  bsize = root->available_sizes;\n        FT_UShort        x_res, y_res;\n\n\n        bsize->width  = font->header.avg_width;\n        bsize->height = (FT_Short)(\n          font->header.pixel_height + font->header.external_leading );\n        bsize->size   = font->header.nominal_point_size << 6;\n\n        x_res = font->header.horizontal_resolution;\n        if ( !x_res )\n          x_res = 72;\n\n        y_res = font->header.vertical_resolution;\n        if ( !y_res )\n          y_res = 72;\n\n        bsize->y_ppem = FT_MulDiv( bsize->size, y_res, 72 );\n        bsize->y_ppem = FT_PIX_ROUND( bsize->y_ppem );\n\n        /*\n         * this reads:\n         *\n         * the nominal height is larger than the bbox's height\n         *\n         * => nominal_point_size contains incorrect value;\n         *    use pixel_height as the nominal height\n         */\n        if ( bsize->y_ppem > ( font->header.pixel_height << 6 ) )\n        {\n          FT_TRACE2(( \"use pixel_height as the nominal height\\n\" ));\n\n          bsize->y_ppem = font->header.pixel_height << 6;\n          bsize->size   = FT_MulDiv( bsize->y_ppem, 72, y_res );\n        }\n\n        bsize->x_ppem = FT_MulDiv( bsize->size, x_res, 72 );\n        bsize->x_ppem = FT_PIX_ROUND( bsize->x_ppem );\n      }\n\n      {\n        FT_CharMapRec  charmap;\n\n\n        charmap.encoding    = FT_ENCODING_NONE;\n        /* initial platform/encoding should indicate unset status? */\n        charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;\n        charmap.encoding_id = TT_APPLE_ID_DEFAULT;\n        charmap.face        = root;\n\n        if ( font->header.charset == FT_WinFNT_ID_MAC )\n        {\n          charmap.encoding    = FT_ENCODING_APPLE_ROMAN;\n          charmap.platform_id = TT_PLATFORM_MACINTOSH;\n/*        charmap.encoding_id = TT_MAC_ID_ROMAN; */\n        }\n\n        error = FT_CMap_New( fnt_cmap_class,\n                             NULL,\n                             &charmap,\n                             NULL );\n        if ( error )\n          goto Fail;\n\n        /* Select default charmap */\n        if ( root->num_charmaps )\n          root->charmap = root->charmaps[0];\n      }\n\n      /* set up remaining flags */\n\n      if ( font->header.last_char < font->header.first_char )\n      {\n        FT_TRACE2(( \"invalid number of glyphs\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Fail;\n      }\n\n      /* reserve one slot for the .notdef glyph at index 0 */\n      root->num_glyphs = font->header.last_char -\n                         font->header.first_char + 1 + 1;\n\n      if ( font->header.face_name_offset >= font->header.file_size )\n      {\n        FT_TRACE2(( \"invalid family name offset\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Fail;\n      }\n      family_size = font->header.file_size - font->header.face_name_offset;\n      /* Some broken fonts don't delimit the face name with a final */\n      /* NULL byte -- the frame is erroneously one byte too small.  */\n      /* We thus allocate one more byte, setting it explicitly to   */\n      /* zero.                                                      */\n      if ( FT_ALLOC( font->family_name, family_size + 1 ) )\n        goto Fail;\n\n      FT_MEM_COPY( font->family_name,\n                   font->fnt_frame + font->header.face_name_offset,\n                   family_size );\n\n      font->family_name[family_size] = '\\0';\n\n      if ( FT_REALLOC( font->family_name,\n                       family_size,\n                       ft_strlen( font->family_name ) + 1 ) )\n        goto Fail;\n\n      root->family_name = font->family_name;\n      root->style_name  = (char *)\"Regular\";\n\n      if ( root->style_flags & FT_STYLE_FLAG_BOLD )\n      {\n        if ( root->style_flags & FT_STYLE_FLAG_ITALIC )\n          root->style_name = (char *)\"Bold Italic\";\n        else\n          root->style_name = (char *)\"Bold\";\n      }\n      else if ( root->style_flags & FT_STYLE_FLAG_ITALIC )\n        root->style_name = (char *)\"Italic\";\n    }\n    goto Exit;\n\n  Fail:\n    FNT_Face_Done( fntface );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  FNT_Size_Select( FT_Size   size,\n                   FT_ULong  strike_index )\n  {\n    FNT_Face          face   = (FNT_Face)size->face;\n    FT_WinFNT_Header  header = &face->font->header;\n\n    FT_UNUSED( strike_index );\n\n\n    FT_Select_Metrics( size->face, 0 );\n\n    size->metrics.ascender    = header->ascent * 64;\n    size->metrics.descender   = -( header->pixel_height -\n                                   header->ascent ) * 64;\n    size->metrics.max_advance = header->max_width * 64;\n\n    return FT_Err_Ok;\n  }\n\n\n  static FT_Error\n  FNT_Size_Request( FT_Size          size,\n                    FT_Size_Request  req )\n  {\n    FNT_Face          face    = (FNT_Face)size->face;\n    FT_WinFNT_Header  header  = &face->font->header;\n    FT_Bitmap_Size*   bsize   = size->face->available_sizes;\n    FT_Error          error   = FT_ERR( Invalid_Pixel_Size );\n    FT_Long           height;\n\n\n    height = FT_REQUEST_HEIGHT( req );\n    height = ( height + 32 ) >> 6;\n\n    switch ( req->type )\n    {\n    case FT_SIZE_REQUEST_TYPE_NOMINAL:\n      if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) )\n        error = FT_Err_Ok;\n      break;\n\n    case FT_SIZE_REQUEST_TYPE_REAL_DIM:\n      if ( height == header->pixel_height )\n        error = FT_Err_Ok;\n      break;\n\n    default:\n      error = FT_THROW( Unimplemented_Feature );\n      break;\n    }\n\n    if ( error )\n      return error;\n    else\n      return FNT_Size_Select( size, 0 );\n  }\n\n\n  static FT_Error\n  FNT_Load_Glyph( FT_GlyphSlot  slot,\n                  FT_Size       size,\n                  FT_UInt       glyph_index,\n                  FT_Int32      load_flags )\n  {\n    FNT_Face    face   = (FNT_Face)FT_SIZE_FACE( size );\n    FNT_Font    font;\n    FT_Error    error  = FT_Err_Ok;\n    FT_Byte*    p;\n    FT_Int      len;\n    FT_Bitmap*  bitmap = &slot->bitmap;\n    FT_ULong    offset;\n    FT_Bool     new_format;\n\n    FT_UNUSED( load_flags );\n\n\n    if ( !face )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    font = face->font;\n\n    if ( !font ||\n         glyph_index >= (FT_UInt)( FT_FACE( face )->num_glyphs ) )\n    {\n      error = FT_THROW( Invalid_Argument );\n      goto Exit;\n    }\n\n    if ( glyph_index > 0 )\n      glyph_index--;                           /* revert to real index */\n    else\n      glyph_index = font->header.default_char; /* the .notdef glyph */\n\n    new_format = FT_BOOL( font->header.version == 0x300 );\n    len        = new_format ? 6 : 4;\n\n    /* jump to glyph entry */\n    p = font->fnt_frame + ( new_format ? 148 : 118 ) + len * glyph_index;\n\n    bitmap->width = FT_NEXT_SHORT_LE( p );\n\n    if ( new_format )\n      offset = FT_NEXT_ULONG_LE( p );\n    else\n      offset = FT_NEXT_USHORT_LE( p );\n\n    if ( offset >= font->header.file_size )\n    {\n      FT_TRACE2(( \"invalid FNT offset\\n\" ));\n      error = FT_THROW( Invalid_File_Format );\n      goto Exit;\n    }\n\n    /* jump to glyph data */\n    p = font->fnt_frame + /* font->header.bits_offset */ + offset;\n\n    /* allocate and build bitmap */\n    {\n      FT_Memory  memory = FT_FACE_MEMORY( slot->face );\n      FT_Int     pitch  = ( bitmap->width + 7 ) >> 3;\n      FT_Byte*   column;\n      FT_Byte*   write;\n\n\n      bitmap->pitch      = pitch;\n      bitmap->rows       = font->header.pixel_height;\n      bitmap->pixel_mode = FT_PIXEL_MODE_MONO;\n\n      if ( offset + pitch * bitmap->rows >= font->header.file_size )\n      {\n        FT_TRACE2(( \"invalid bitmap width\\n\" ));\n        error = FT_THROW( Invalid_File_Format );\n        goto Exit;\n      }\n\n      /* note: since glyphs are stored in columns and not in rows we */\n      /*       can't use ft_glyphslot_set_bitmap                     */\n      if ( FT_ALLOC_MULT( bitmap->buffer, pitch, bitmap->rows ) )\n        goto Exit;\n\n      column = (FT_Byte*)bitmap->buffer;\n\n      for ( ; pitch > 0; pitch--, column++ )\n      {\n        FT_Byte*  limit = p + bitmap->rows;\n\n\n        for ( write = column; p < limit; p++, write += bitmap->pitch )\n          *write = *p;\n      }\n    }\n\n    slot->internal->flags = FT_GLYPH_OWN_BITMAP;\n    slot->bitmap_left     = 0;\n    slot->bitmap_top      = font->header.ascent;\n    slot->format          = FT_GLYPH_FORMAT_BITMAP;\n\n    /* now set up metrics */\n    slot->metrics.width        = bitmap->width << 6;\n    slot->metrics.height       = bitmap->rows << 6;\n    slot->metrics.horiAdvance  = bitmap->width << 6;\n    slot->metrics.horiBearingX = 0;\n    slot->metrics.horiBearingY = slot->bitmap_top << 6;\n\n    ft_synthesize_vertical_metrics( &slot->metrics,\n                                    bitmap->rows << 6 );\n\n  Exit:\n    return error;\n  }\n\n\n  static FT_Error\n  winfnt_get_header( FT_Face               face,\n                     FT_WinFNT_HeaderRec  *aheader )\n  {\n    FNT_Font  font = ((FNT_Face)face)->font;\n\n\n    *aheader = font->header;\n\n    return 0;\n  }\n\n\n  static const FT_Service_WinFntRec  winfnt_service_rec =\n  {\n    winfnt_get_header\n  };\n\n /*\n  *  SERVICE LIST\n  *\n  */\n\n  static const FT_ServiceDescRec  winfnt_services[] =\n  {\n    { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_WINFNT },\n    { FT_SERVICE_ID_WINFNT,    &winfnt_service_rec },\n    { NULL, NULL }\n  };\n\n\n  static FT_Module_Interface\n  winfnt_get_service( FT_Module         module,\n                      const FT_String*  service_id )\n  {\n    FT_UNUSED( module );\n\n    return ft_service_list_lookup( winfnt_services, service_id );\n  }\n\n\n\n\n  FT_CALLBACK_TABLE_DEF\n  const FT_Driver_ClassRec  winfnt_driver_class =\n  {\n    {\n      FT_MODULE_FONT_DRIVER        |\n      FT_MODULE_DRIVER_NO_OUTLINES,\n      sizeof ( FT_DriverRec ),\n\n      \"winfonts\",\n      0x10000L,\n      0x20000L,\n\n      0,\n\n      0,                  /* FT_Module_Constructor */\n      0,                  /* FT_Module_Destructor  */\n      winfnt_get_service\n    },\n\n    sizeof ( FNT_FaceRec ),\n    sizeof ( FT_SizeRec ),\n    sizeof ( FT_GlyphSlotRec ),\n\n    FNT_Face_Init,\n    FNT_Face_Done,\n    0,                    /* FT_Size_InitFunc */\n    0,                    /* FT_Size_DoneFunc */\n    0,                    /* FT_Slot_InitFunc */\n    0,                    /* FT_Slot_DoneFunc */\n\n#ifdef FT_CONFIG_OPTION_OLD_INTERNALS\n    ft_stub_set_char_sizes,\n    ft_stub_set_pixel_sizes,\n#endif\n    FNT_Load_Glyph,\n\n    0,                    /* FT_Face_GetKerningFunc  */\n    0,                    /* FT_Face_AttachFunc      */\n    0,                    /* FT_Face_GetAdvancesFunc */\n\n    FNT_Size_Request,\n    FNT_Size_Select\n  };\n\n\n/* END */\n"
  },
  {
    "path": "libs/freetype/src/winfonts/winfnt.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  winfnt.h                                                               */\n/*                                                                         */\n/*    FreeType font driver for Windows FNT/FON files                       */\n/*                                                                         */\n/*  Copyright 1996-2001, 2002, 2003, 2004, 2007 by                         */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*  Copyright 2007 Dmitry Timoshkov for Codeweavers                        */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef __WINFNT_H__\n#define __WINFNT_H__\n\n\n#include <ft2build.h>\n#include FT_WINFONTS_H\n#include FT_INTERNAL_DRIVER_H\n\n\nFT_BEGIN_HEADER\n\n#ifdef FT_CONFIG_OPTION_PIC\n#error \"this module does not support PIC yet\"\n#endif\n\n  typedef struct  WinMZ_HeaderRec_\n  {\n    FT_UShort  magic;\n    /* skipped content */\n    FT_UShort  lfanew;\n\n  } WinMZ_HeaderRec;\n\n\n  typedef struct  WinNE_HeaderRec_\n  {\n    FT_UShort  magic;\n    /* skipped content */\n    FT_UShort  resource_tab_offset;\n    FT_UShort  rname_tab_offset;\n\n  } WinNE_HeaderRec;\n\n\n  typedef struct  WinPE32_HeaderRec_\n  {\n    FT_ULong   magic;\n    FT_UShort  machine;\n    FT_UShort  number_of_sections;\n    /* skipped content */\n    FT_UShort  size_of_optional_header;\n    /* skipped content */\n    FT_UShort  magic32;\n    /* skipped content */\n    FT_ULong   rsrc_virtual_address;\n    FT_ULong   rsrc_size;\n    /* skipped content */\n\n  } WinPE32_HeaderRec;\n\n\n  typedef struct  WinPE32_SectionRec_\n  {\n    FT_Byte   name[8];\n    /* skipped content */\n    FT_ULong  virtual_address;\n    FT_ULong  size_of_raw_data;\n    FT_ULong  pointer_to_raw_data;\n    /* skipped content */\n\n  } WinPE32_SectionRec;\n\n\n  typedef struct  WinPE_RsrcDirRec_\n  {\n    FT_ULong   characteristics;\n    FT_ULong   time_date_stamp;\n    FT_UShort  major_version;\n    FT_UShort  minor_version;\n    FT_UShort  number_of_named_entries;\n    FT_UShort  number_of_id_entries;\n\n  } WinPE_RsrcDirRec;\n\n\n  typedef struct  WinPE_RsrcDirEntryRec_\n  {\n    FT_ULong  name;\n    FT_ULong  offset;\n\n  } WinPE_RsrcDirEntryRec;\n\n\n  typedef struct  WinPE_RsrcDataEntryRec_\n  {\n    FT_ULong  offset_to_data;\n    FT_ULong  size;\n    FT_ULong  code_page;\n    FT_ULong  reserved;\n\n  } WinPE_RsrcDataEntryRec;\n\n\n  typedef struct  WinNameInfoRec_\n  {\n    FT_UShort  offset;\n    FT_UShort  length;\n    FT_UShort  flags;\n    FT_UShort  id;\n    FT_UShort  handle;\n    FT_UShort  usage;\n\n  } WinNameInfoRec;\n\n\n  typedef struct  WinResourceInfoRec_\n  {\n    FT_UShort  type_id;\n    FT_UShort  count;\n\n  } WinResourceInfoRec;\n\n\n#define WINFNT_MZ_MAGIC  0x5A4D\n#define WINFNT_NE_MAGIC  0x454E\n#define WINFNT_PE_MAGIC  0x4550\n\n\n  typedef struct  FNT_FontRec_\n  {\n    FT_ULong             offset;\n\n    FT_WinFNT_HeaderRec  header;\n\n    FT_Byte*             fnt_frame;\n    FT_ULong             fnt_size;\n    FT_String*           family_name;\n\n  } FNT_FontRec, *FNT_Font;\n\n\n  typedef struct  FNT_FaceRec_\n  {\n    FT_FaceRec     root;\n    FNT_Font       font;\n\n    FT_CharMap     charmap_handle;\n    FT_CharMapRec  charmap;  /* a single charmap per face */\n\n  } FNT_FaceRec, *FNT_Face;\n\n\n  FT_EXPORT_VAR( const FT_Driver_ClassRec )  winfnt_driver_class;\n\n\nFT_END_HEADER\n\n\n#endif /* __WINFNT_H__ */\n\n\n/* END */\n"
  },
  {
    "path": "local.properties",
    "content": "## This file must *NOT* be checked into Version Control Systems,\n# as it contains information specific to your local configuration.\n#\n# Location of the SDK. This is only used by Gradle.\n# For customization when using a Version Control System, please read the\n# header note.\n#Fri May 23 23:35:56 UTC 2025\nsdk.dir=C\\:\\\\Users\\\\user\\\\AppData\\\\Local\\\\Android\\\\Sdk\nndk.dir=C\\:\\\\Android\\\\NDK\n"
  },
  {
    "path": "open_codeblocks.bat",
    "content": "codeblocks app/src/main/is-Engine-windows.cbp"
  },
  {
    "path": "open_codeblocks_sdl.bat",
    "content": "codeblocks app/src/main/is-Engine-windows-SDL2.cbp"
  },
  {
    "path": "open_qt_creator.bat",
    "content": "qtcreator app/src/main/qt/is-Engine.pro"
  },
  {
    "path": "open_vscode.bat",
    "content": "code -n ./app/src/main"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]